ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggYTQ4MDZmMC4uOWIwZDAyNiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTY4LDYgKzY4LDcgQEAKIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KIEtlbm5ldGggVyBDaGVuIDxrZW5uZXRoLncuY2hlbkBpbnRlbC5jb20+CiBLb3VzaGlrIDxyYWdoYXZlbmRyYS5rb3VzaGlrQG5ldGVyaW9uLmNvbT4KK0t1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KIExlb25pZCBJIEFuYW5pZXYgPGxlb25pZC5pLmFuYW5pZXZAaW50ZWwuY29tPgogTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiBNYXJrIEJyb3duIDxicm9vbmllQHNpcmVuYS5vcmcudWs+CkBAIC0xMTEsMyArMTEyLDQgQEAKIFV3ZSBLbGVpbmUtS8O2bmlnIDxVd2UuS2xlaW5lLUtvZW5pZ0BkaWdpLmNvbT4KIFZhbGRpcyBLbGV0bmlla3MgPFZhbGRpcy5LbGV0bmlla3NAdnQuZWR1PgogVGFrYXNoaSBZT1NISUkgPHRha2FzaGkueW9zaGlpLnpqQHJlbmVzYXMuY29tPgorWXVzdWtlIEdvZGEgPGdvZGEueXVzdWtlQHJlbmVzYXMuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWFjcGktcG1wcm9maWxlIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWFjcGktcG1wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGM3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtYWNwaS1wbXByb2ZpbGUKQEAgLTAsMCArMSwyMiBAQAorV2hhdDogCQkvc3lzL2Zpcm13YXJlL2FjcGkvcG1fcHJvZmlsZQorRGF0ZToJCTAzLU5vdi0yMDExCitLZXJuZWxWZXJzaW9uOgl2My4yCitDb250YWN0OglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246IAlUaGUgQUNQSSBwbV9wcm9maWxlIHN5c2ZzIGludGVyZmFjZSBleHBvcnRzIHRoZSBwbGF0Zm9ybQorCQlwb3dlciBtYW5hZ2VtZW50IChhbmQgcGVyZm9ybWFuY2UpIHJlcXVpcmVtZW50IGV4cGVjdGF0aW9ucworCQlhcyBwcm92aWRlZCBieSBCSU9TLiBUaGUgaW50ZWdlciB2YWx1ZSBpcyBkaXJlY3RseSBwYXNzZWQgYXMKKwkJcmV0cmlldmVkIGZyb20gdGhlIEZBRFQgQUNQSSB0YWJsZS4KK1ZhbHVlczogICAgICAgICBGb3IgcG9zc2libGUgdmFsdWVzIHNlZSBBQ1BJIHNwZWNpZmljYXRpb246CisJCTUuMi45IEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKEZBRFQpCisJCUZpZWxkOiBQcmVmZXJyZWRfUE1fUHJvZmlsZQorCisJCUN1cnJlbnRseSB0aGVzZSB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgc3BlYzoKKwkJMCBVbnNwZWNpZmllZAorCQkxIERlc2t0b3AKKwkJMiBNb2JpbGUKKwkJMyBXb3Jrc3RhdGlvbgorCQk0IEVudGVycHJpc2UgU2VydmVyCisJCTUgU09ITyBTZXJ2ZXIKKwkJNiBBcHBsaWFuY2UgUEMKKwkJNyBQZXJmb3JtYW5jZSBTZXJ2ZXIKKwkJPjcgUmVzZXJ2ZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1pZGVhcGFkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9kZWJ1Z2ZzLWlkZWFwYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3OWMwYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1pZGVhcGFkCkBAIC0wLDAgKzEsMTkgQEAKK1doYXQ6CQkvc3lzL2tlcm5lbC9kZWJ1Zy9pZGVhcGFkL2NmZworRGF0ZToJCVNlcCAyMDExCitLZXJuZWxWZXJzaW9uOgkzLjIKK0NvbnRhY3Q6CUlrZSBQYW5oYyA8aWtlLnBhbkBjYW5vbmljYWwuY29tPgorRGVzY3JpcHRpb246CisKK2NmZyBzaG93cyB0aGUgcmV0dXJuIHZhbHVlIG9mIF9DRkcgbWV0aG9kIGluIFZQQzIwMDQgZGV2aWNlLiBJdCB0ZWxscyBtYWNoaW5lCitjYXBhYmlsaXR5IGFuZCB3aGF0IGdyYXBoaWMgY29tcG9uZW50IHdpdGhpbiB0aGUgbWFjaGluZS4KKworCitXaGF0OgkJL3N5cy9rZXJuZWwvZGVidWcvaWRlYXBhZC9zdGF0dXMKK0RhdGU6CQlTZXAgMjAxMQorS2VybmVsVmVyc2lvbjoJMy4yCitDb250YWN0OglJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCitzdGF0dXMgc2hvd3MgaW5mb3Mgd2UgY2FuIHJlYWQgYW5kIHRlbGxzIGl0cyBtZWFuaW5nIGFuZCB2YWx1ZS4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jawppbmRleCBjMWViNDFjLi4yYjVkNTYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKQEAgLTIwNiwzICsyMDYsMTYgQEAKIAkJd2hlbiBhIGRpc2NhcmRlZCBhcmVhIGlzIHJlYWQgdGhlIGRpc2NhcmRfemVyb2VzX2RhdGEKIAkJcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvIG9uZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgMCBhbmQKIAkJdGhlIHJlc3VsdCBvZiByZWFkaW5nIGEgZGlzY2FyZGVkIGFyZWEgaXMgdW5kZWZpbmVkLgorV2hhdDoJCS9zeXMvYmxvY2svPGRpc2s+L2FsaWFzCitEYXRlOgkJQXVnIDIwMTEKK0NvbnRhY3Q6CU5hbyBOaXNoaWppbWEgPG5hby5uaXNoaWppbWEueHRAaGl0YWNoaS5jb20+CitEZXNjcmlwdGlvbjoKKwkJQSByYXcgZGV2aWNlIG5hbWUgb2YgYSBkaXNrIGRvZXMgbm90IGFsd2F5cyBwb2ludCBhIHNhbWUgZGlzaworCQllYWNoIGJvb3QtdXAgdGltZS4gVGhlcmVmb3JlLCB1c2VycyBoYXZlIHRvIHVzZSBwZXJzaXN0ZW50CisJCWRldmljZSBuYW1lcywgd2hpY2ggdWRldiBjcmVhdGVzIHdoZW4gdGhlIGtlcm5lbCBmaW5kcyBhIGRpc2ssCisJCWluc3RlYWQgb2YgcmF3IGRldmljZSBuYW1lLiBIb3dldmVyLCBrZXJuZWwgZG9lc24ndCBzaG93IHRob3NlCisJCXBlcnNpc3RlbnQgbmFtZXMgb24gaXRzIG1lc3NhZ2VzIChlLmcuIGRtZXNnKS4KKwkJVGhpcyBmaWxlIGNhbiBzdG9yZSBhbiBhbGlhcyBvZiB0aGUgZGlzayBhbmQgaXQgd291bGQgYmUKKwkJYXBwZWFyZWQgaW4ga2VybmVsIG1lc3NhZ2VzIGlmIGl0IGlzIHNldC4gQSBkaXNrIGNhbiBoYXZlIGFuCisJCWFsaWFzIHdoaWNoIGxlbmd0aCBpcyB1cCB0byAyNTVieXRlcy4gVXNlcnMgY2FuIHVzZSBhbHBoYWJldHMsCisJCW51bWJlcnMsICItIiBhbmQgIl8iIGluIGFsaWFzIG5hbWUuIFRoaXMgZmlsZSBpcyB3cml0ZW9uY2UuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1wY2ktZGV2aWNlcy1jY2lzcyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCmluZGV4IGY1YmIwYTMuLjUzZDk5ZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCkBAIC03MSwzICs3MSwxMCBAQAogCQlhIGR1bXAgZGV2aWNlLCBhcyBrZHVtcCByZXF1aXJlcyByZXNldHRpbmcgdGhlIGRldmljZSBpbiBvcmRlcgogCQl0byB3b3JrIHJlbGlhYmx5LgogCitXaGVyZToJCS9zeXMvYnVzL3BjaS9kZXZpY2VzLzxkZXY+L2NjaXNzWC90cmFuc3BvcnRfbW9kZQorRGF0ZToJCUp1bHkgMjAxMQorS2VybmVsIFZlcnNpb246CTMuMAorQ29udGFjdDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCitEZXNjcmlwdGlvbjoJVmFsdWUgb2YgInNpbXBsZSIgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIGJlZW4gcGxhY2VkCisJCWluICJzaW1wbGUgbW9kZSIuIFZhbHVlIG9mICJwZXJmb3JtYW50IiBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkJY29udHJvbGxlciBoYXMgYmVlbiBwbGFjZWQgaW4gInBlcmZvcm1hbnQgbW9kZSIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLXdhY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDRkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbQpAQCAtMCwwICsxLDcyIEBACitXaGF0OgkJL3N5cy9jbGFzcy9oaWRyYXcvaGlkcmF3Ki9kZXZpY2Uvc3BlZWQKK0RhdGU6CQlBcHJpbCAyMDEwCitLZXJuZWwgVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1ibHVldG9vdGhAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvY2xhc3MvaGlkcmF3L2hpZHJhdyovZGV2aWNlL3NwZWVkIGZpbGUgY29udHJvbHMKKwkJcmVwb3J0aW5nIHNwZWVkIG9mIFdhY29tIGJsdWV0b290aCB0YWJsZXQuIFJlYWRpbmcgZnJvbQorCQl0aGlzIGZpbGUgcmV0dXJucyAxIGlmIHRhYmxldCByZXBvcnRzIGluIGhpZ2ggc3BlZWQgbW9kZQorCQlvciAwIG90aGVyd2lzZS4gV3JpdGluZyB0byB0aGlzIGZpbGUgb25lIG9mIHRoZXNlIHZhbHVlcworCQlzd2l0Y2hlcyByZXBvcnRpbmcgc3BlZWQuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL2xlZAorRGF0ZToJCUF1Z3VzdCAyMDExCitDb250YWN0OglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlBdHRyaWJ1dGUgZ3JvdXAgZm9yIGNvbnRyb2wgb2YgdGhlIHN0YXR1cyBMRURzIGFuZCB0aGUgT0xFRHMuCisJCVRoaXMgYXR0cmlidXRlIGdyb3VwIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBJbnR1b3MgNCBNLCBMLAorCQlhbmQgWEwgKHdpdGggTEVEcyBhbmQgT0xFRHMpIGFuZCBDaW50aXEgMjFVWDIgKExFRHMgb25seSkuCisJCVRoZXJlZm9yZSBpdHMgcHJlc2VuY2UgaW1wbGljaXRseSBzaWduaWZpZXMgdGhlIHByZXNlbmNlIG9mCisJCXNhaWQgTEVEcyBhbmQgT0xFRHMgb24gdGhlIHRhYmxldCBkZXZpY2UuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1czBfbHVtaW5hbmNlCitEYXRlOgkJQXVndXN0IDIwMTEKK0NvbnRhY3Q6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIHNldHMgdGhlIHN0YXR1cyBMRUQgbHVtaW5hbmNlICgxLi4xMjcpCisJCXdoZW4gdGhlIHN0eWx1cyBkb2VzIG5vdCB0b3VjaCB0aGUgdGFibGV0IHN1cmZhY2UsIGFuZCBubworCQlidXR0b24gaXMgcHJlc3NlZCBvbiB0aGUgc3R5bHVzLiBUaGlzIGx1bWluYW5jZSBsZXZlbCBpcworCQlub3JtYWxseSBsb3dlciB0aGFuIHRoZSBsZXZlbCB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1czFfbHVtaW5hbmNlCitEYXRlOgkJQXVndXN0IDIwMTEKK0NvbnRhY3Q6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIHNldHMgdGhlIHN0YXR1cyBMRUQgbHVtaW5hbmNlICgxLi4xMjcpCisJCXdoZW4gdGhlIHN0eWx1cyB0b3VjaGVzIHRoZSB0YWJsZXQgc3VyZmFjZSwgb3IgYW55IGJ1dHRvbiBpcworCQlwcmVzc2VkIG9uIHRoZSBzdHlsdXMuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL3N0YXR1c19sZWQwX3NlbGVjdAorRGF0ZToJCUF1Z3VzdCAyMDExCitDb250YWN0OglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlXcml0aW5nIHRvIHRoaXMgZmlsZSBzZXRzIHdoaWNoIG9uZSBvZiB0aGUgZm91ciAoZm9yIEludHVvcyA0KQorCQlvciBvZiB0aGUgcmlnaHQgZm91ciAoZm9yIENpbnRpcSAyMVVYMikgc3RhdHVzIExFRHMgaXMgYWN0aXZlICgwLi4zKS4KKwkJVGhlIG90aGVyIHRocmVlIExFRHMgb24gdGhlIHNhbWUgc2lkZSBhcmUgYWx3YXlzIGluYWN0aXZlLgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNmZz4uPGludGY+L3dhY29tX2xlZC9zdGF0dXNfbGVkMV9zZWxlY3QKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB3aGljaCBvbmUgb2YgdGhlIGxlZnQgZm91ciAoZm9yIENpbnRpcSAyMVVYMikKKwkJc3RhdHVzIExFRHMgaXMgYWN0aXZlICgwLi4zKS4gVGhlIG90aGVyIHRocmVlIExFRHMgb24gdGhlIGxlZnQgYXJlIGFsd2F5cworCQlpbmFjdGl2ZS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+OjxjZmc+LjxpbnRmPi93YWNvbV9sZWQvYnV0dG9uc19sdW1pbmFuY2UKK0RhdGU6CQlBdWd1c3QgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB0aGUgb3ZlcmFsbCBsdW1pbmFuY2UgbGV2ZWwgKDAuLjE1KQorCQlvZiBhbGwgZWlnaHQgYnV0dG9uIE9MRUQgZGlzcGxheXMuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y2ZnPi48aW50Zj4vd2Fjb21fbGVkL2J1dHRvbjxuPl9yYXdpbWcKK0RhdGU6CQlBdWd1c3QgMjAxMQorQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV2hlbiB3cml0aW5nIGEgMTAyNCBieXRlIHJhdyBpbWFnZSBpbiBXYWNvbSBJbnR1b3MgNAorCQlpbnRlcmxlYXZpbmcgZm9ybWF0IHRvIHRoZSBmaWxlLCB0aGUgaW1hZ2Ugc2hvd3MgdXAgb24gQnV0dG9uIE4KKwkJb2YgdGhlIGRldmljZS4gVGhlIGltYWdlIGlzIGEgNjR4MzIgcGl4ZWwgNC1iaXQgZ3JheSBpbWFnZS4gVGhlCisJCTEwMjQgYnl0ZSBiaW5hcnkgaXMgc3BsaXQgdXAgaW50byAxNnggNjQgYnl0ZSBjaHVua3MuIEVhY2ggNjQKKwkJYnl0ZSBjaHVuayBlbmNvZGVzIHRoZSBpbWFnZSBkYXRhIGZvciB0d28gY29uc2VjdXRpdmUgbGluZXMgb24KKwkJdGhlIGRpc3BsYXkuIFRoZSBsb3cgbmliYmxlIG9mIGVhY2ggYnl0ZSBjb250YWlucyB0aGUgZmlyc3QKKwkJbGluZSwgYW5kIHRoZSBoaWdoIG5pYmJsZSBjb250YWlucyB0aGUgc2Vjb25kIGxpbmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wbGF0Zm9ybS1pZGVhcGFkLWxhcHRvcAppbmRleCBmZjUzMTgzLi44MTRiMDEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcGxhdGZvcm0taWRlYXBhZC1sYXB0b3AKQEAgLTUsMTkgKzUsNCBAQAogRGVzY3JpcHRpb246CiAJCUNvbnRyb2wgdGhlIHBvd2VyIG9mIGNhbWVyYSBtb2R1bGUuIDEgbWVhbnMgb24sIDAgbWVhbnMgb2ZmLgogCi1XaGF0OgkJL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2lkZWFwYWQvY2ZnCi1EYXRlOgkJSnVuIDIwMTEKLUtlcm5lbFZlcnNpb246CTMuMQotQ29udGFjdDoJIklrZSBQYW5oYyA8aWtlLnBhbkBjYW5vbmljYWwuY29tPiIKLURlc2NyaXB0aW9uOgotCQlJZGVhcGFkIGNhcGFiaWxpdHkgYml0cy4KLQkJQml0IDgtMTA6IDEgLSBJbnRlbCBncmFwaGljIG9ubHkKLQkJICAgICAgICAgIDIgLSBBVEkgZ3JhcGhpYyBvbmx5Ci0JCSAgICAgICAgICAzIC0gTnZpZGlhIGdyYXBoaWMgb25seQotCQkgICAgICAgICAgNCAtIEludGVsIGFuZCBBVEkgZ3JhcGhpYwotCQkgICAgICAgICAgNSAtIEludGVsIGFuZCBOdmlkaWEgZ3JhcGhpYwotCQlCaXQgMTY6IEJsdWV0b290aCBleGlzdCAoMSBmb3IgZXhpc3QpCi0JCUJpdCAxNzogM0cgZXhpc3QgKDEgZm9yIGV4aXN0KQotCQlCaXQgMTg6IFdpZmkgZXhpc3QgKDEgZm9yIGV4aXN0KQotCQlCaXQgMTk6IENhbWVyYSBleGlzdCAoMSBmb3IgZXhpc3QpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtd2Fjb20gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXdhY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE3OTc2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtd2Fjb20KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1XaGF0OgkJL3N5cy9jbGFzcy9oaWRyYXcvaGlkcmF3Ki9kZXZpY2Uvc3BlZWQKLURhdGU6CQlBcHJpbCAyMDEwCi1LZXJuZWwgVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1ibHVldG9vdGhAdmdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJVGhlIC9zeXMvY2xhc3MvaGlkcmF3L2hpZHJhdyovZGV2aWNlL3NwZWVkIGZpbGUgY29udHJvbHMKLQkJcmVwb3J0aW5nIHNwZWVkIG9mIHdhY29tIGJsdWV0b290aCB0YWJsZXQuIFJlYWRpbmcgZnJvbQotCQl0aGlzIGZpbGUgcmV0dXJucyAxIGlmIHRhYmxldCByZXBvcnRzIGluIGhpZ2ggc3BlZWQgbW9kZQotCQlvciAwIG90aGVyd2lzZS4gV3JpdGluZyB0byB0aGlzIGZpbGUgb25lIG9mIHRoZXNlIHZhbHVlcwotCQlzd2l0Y2hlcyByZXBvcnRpbmcgc3BlZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBjOTQwMjM5Li4yYjkwZDMyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTE2Niw4ICsxNjYsOCBAQAogZWxzZQogCWRvX3RoYXQoKTsKIAotVGhpcyBkb2VzIG5vdCBhcHBseSBpZiBvbmUgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IGlzIGEgc2luZ2xlCi1zdGF0ZW1lbnQuIFVzZSBicmFjZXMgaW4gYm90aCBicmFuY2hlcy4KK1RoaXMgZG9lcyBub3QgYXBwbHkgaWYgb25seSBvbmUgYnJhbmNoIG9mIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IGlzIGEgc2luZ2xlCitzdGF0ZW1lbnQ7IGluIHRoZSBsYXR0ZXIgY2FzZSB1c2UgYnJhY2VzIGluIGJvdGggYnJhbmNoZXM6CiAKIGlmIChjb25kaXRpb24pIHsKIAlkb190aGlzKCk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAppbmRleCBmZTIzMjY5Li42NmJkOTdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTUwLDYgKzUwLDEzIEBACiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIGlnbm9yZSBmbGFncyB0aGF0IGFmZmVjdCB0aGUgbG9jYXRpb24gb2YKIHRoZSByZXR1cm5lZCBtZW1vcnksIGxpa2UgR0ZQX0RNQSkuCiAKK3ZvaWQgKgorZG1hX3phbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQorCitXcmFwcyBkbWFfYWxsb2NfY29oZXJlbnQoKSBhbmQgYWxzbyB6ZXJvZXMgdGhlIHJldHVybmVkIG1lbW9yeSBpZiB0aGUKK2FsbG9jYXRpb24gYXR0ZW1wdCBzdWNjZWVkZWQuCisKIHZvaWQKIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAogCQkJICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsCmluZGV4IGMyNzkxNTguLjE5NmI4YjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kcm0udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIFRoZSBMaW51eCBEUk0gbGF5ZXIgY29udGFpbnMgY29kZSBpbnRlbmRlZCB0byBzdXBwb3J0IHRoZSBuZWVkcwogICAgICAgb2YgY29tcGxleCBncmFwaGljcyBkZXZpY2VzLCB1c3VhbGx5IGNvbnRhaW5pbmcgcHJvZ3JhbW1hYmxlCiAgICAgICBwaXBlbGluZXMgd2VsbCBzdWl0ZWQgdG8gM0QgZ3JhcGhpY3MgYWNjZWxlcmF0aW9uLiAgR3JhcGhpY3MKLSAgICAgIGRyaXZlcnMgaW4gdGhlIGtlcm5lbCBjYW4gbWFrZSB1c2Ugb2YgRFJNIGZ1bmN0aW9ucyB0byBtYWtlCisgICAgICBkcml2ZXJzIGluIHRoZSBrZXJuZWwgbWF5IG1ha2UgdXNlIG9mIERSTSBmdW5jdGlvbnMgdG8gbWFrZQogICAgICAgdGFza3MgbGlrZSBtZW1vcnkgbWFuYWdlbWVudCwgaW50ZXJydXB0IGhhbmRsaW5nIGFuZCBETUEgZWFzaWVyLAogICAgICAgYW5kIHByb3ZpZGUgYSB1bmlmb3JtIGludGVyZmFjZSB0byBhcHBsaWNhdGlvbnMuCiAgICAgPC9wYXJhPgpAQCAtNTcsMTAgKzU3LDEwIEBACiAgICAgICBleGlzdGluZyBkcml2ZXJzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KLSAgICAgIEZpcnN0LCB3ZSdsbCBnbyBvdmVyIHNvbWUgdHlwaWNhbCBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgIEZpcnN0LCB3ZSBnbyBvdmVyIHNvbWUgdHlwaWNhbCBkcml2ZXIgaW5pdGlhbGl6YXRpb24KICAgICAgIHJlcXVpcmVtZW50cywgbGlrZSBzZXR0aW5nIHVwIGNvbW1hbmQgYnVmZmVycywgY3JlYXRpbmcgYW4KICAgICAgIGluaXRpYWwgb3V0cHV0IGNvbmZpZ3VyYXRpb24sIGFuZCBpbml0aWFsaXppbmcgY29yZSBzZXJ2aWNlcy4KLSAgICAgIFN1YnNlcXVlbnQgc2VjdGlvbnMgd2lsbCBjb3ZlciBjb3JlIGludGVybmFscyBpbiBtb3JlIGRldGFpbCwKKyAgICAgIFN1YnNlcXVlbnQgc2VjdGlvbnMgY292ZXIgY29yZSBpbnRlcm5hbHMgaW4gbW9yZSBkZXRhaWwsCiAgICAgICBwcm92aWRpbmcgaW1wbGVtZW50YXRpb24gbm90ZXMgYW5kIGV4YW1wbGVzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KQEAgLTc0LDcgKzc0LDcgQEAKICAgICA8L3BhcmE+CiAgICAgPHBhcmE+CiAgICAgICBUaGUgY29yZSBvZiBldmVyeSBEUk0gZHJpdmVyIGlzIHN0cnVjdCBkcm1fZHJpdmVyLiAgRHJpdmVycwotICAgICAgd2lsbCB0eXBpY2FsbHkgc3RhdGljYWxseSBpbml0aWFsaXplIGEgZHJtX2RyaXZlciBzdHJ1Y3R1cmUsCisgICAgICB0eXBpY2FsbHkgc3RhdGljYWxseSBpbml0aWFsaXplIGEgZHJtX2RyaXZlciBzdHJ1Y3R1cmUsCiAgICAgICB0aGVuIHBhc3MgaXQgdG8gZHJtX2luaXQoKSBhdCBsb2FkIHRpbWUuCiAgICAgPC9wYXJhPgogCkBAIC04OCw4ICs4OCw4IEBACiAgICAgPC9wYXJhPgogICAgIDxwcm9ncmFtbGlzdGluZz4KICAgICAgIHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7Ci0JLyogZG9uJ3QgdXNlIG10cnIncyBoZXJlLCB0aGUgWHNlcnZlciBvciB1c2VyIHNwYWNlIGFwcCBzaG91bGQKLQkgKiBkZWFsIHdpdGggdGhlbSBmb3IgaW50ZWwgaGFyZHdhcmUuCisJLyogRG9uJ3QgdXNlIE1UUlJzIGhlcmU7IHRoZSBYc2VydmVyIG9yIHVzZXJzcGFjZSBhcHAgc2hvdWxkCisJICogZGVhbCB3aXRoIHRoZW0gZm9yIEludGVsIGhhcmR3YXJlLgogCSAqLwogCS5kcml2ZXJfZmVhdHVyZXMgPQogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9SRVFVSVJFX0FHUCB8CkBAIC0xNTQsOCArMTU0LDggQEAKICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgIDxwYXJhPgogICAgICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRha2VuIGZyb20gdGhlIGk5MTUgRFJNIGRyaXZlciwgdGhlIGRyaXZlcgotICAgICAgc2V0cyBzZXZlcmFsIGZsYWdzIGluZGljYXRpbmcgd2hhdCBjb3JlIGZlYXR1cmVzIGl0IHN1cHBvcnRzLgotICAgICAgV2UnbGwgZ28gb3ZlciB0aGUgaW5kaXZpZHVhbCBjYWxsYmFja3MgaW4gbGF0ZXIgc2VjdGlvbnMuICBTaW5jZQorICAgICAgc2V0cyBzZXZlcmFsIGZsYWdzIGluZGljYXRpbmcgd2hhdCBjb3JlIGZlYXR1cmVzIGl0IHN1cHBvcnRzOworICAgICAgd2UgZ28gb3ZlciB0aGUgaW5kaXZpZHVhbCBjYWxsYmFja3MgaW4gbGF0ZXIgc2VjdGlvbnMuICBTaW5jZQogICAgICAgZmxhZ3MgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgeW91ciBkcml2ZXIgc3VwcG9ydHMgdG8gdGhlIERSTQogICAgICAgY29yZSwgeW91IG5lZWQgdG8gc2V0IG1vc3Qgb2YgdGhlbSBwcmlvciB0byBjYWxsaW5nIGRybV9pbml0KCkuICBTb21lLAogICAgICAgbGlrZSBEUklWRVJfTU9ERVNFVCBjYW4gYmUgc2V0IGxhdGVyIGJhc2VkIG9uIHVzZXIgc3VwcGxpZWQgcGFyYW1ldGVycywKQEAgLTIwMyw4ICsyMDMsOCBAQAogCTx0ZXJtPkRSSVZFUl9IQVZFX0lSUTwvdGVybT48dGVybT5EUklWRVJfSVJRX1NIQVJFRDwvdGVybT4KIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT4KLQkgICAgRFJJVkVSX0hBVkVfSVJRIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcml2ZXIgaGFzIGEgSVJRCi0JICAgIGhhbmRsZXIsIERSSVZFUl9JUlFfU0hBUkVEIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXZpY2UgJmFtcDsKKwkgICAgRFJJVkVSX0hBVkVfSVJRIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkcml2ZXIgaGFzIGFuIElSUQorCSAgICBoYW5kbGVyLiAgRFJJVkVSX0lSUV9TSEFSRUQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRldmljZSAmYW1wOwogCSAgICBoYW5kbGVyIHN1cHBvcnQgc2hhcmVkIElSUXMgKG5vdGUgdGhhdCB0aGlzIGlzIHJlcXVpcmVkIG9mCiAJICAgIFBDSSBkcml2ZXJzKS4KIAkgIDwvcGFyYT4KQEAgLTIxNCw4ICsyMTQsOCBAQAogCTx0ZXJtPkRSSVZFUl9ETUFfUVVFVUU8L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+Ci0JICAgIElmIHRoZSBkcml2ZXIgcXVldWVzIERNQSByZXF1ZXN0cyBhbmQgY29tcGxldGVzIHRoZW0KLQkgICAgYXN5bmNocm9ub3VzbHksIHRoaXMgZmxhZyBzaG91bGQgYmUgc2V0LiAgRGVwcmVjYXRlZC4KKwkgICAgU2hvdWxkIGJlIHNldCBpZiB0aGUgZHJpdmVyIHF1ZXVlcyBETUEgcmVxdWVzdHMgYW5kIGNvbXBsZXRlcyB0aGVtCisJICAgIGFzeW5jaHJvbm91c2x5LiAgRGVwcmVjYXRlZC4KIAkgIDwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgICA8cGFyYT4KICAgICAgIEluIHRoaXMgc3BlY2lmaWMgY2FzZSwgdGhlIGRyaXZlciByZXF1aXJlcyBBR1AgYW5kIHN1cHBvcnRzCi0gICAgICBJUlFzLiAgRE1BLCBhcyB3ZSdsbCBzZWUsIGlzIGhhbmRsZWQgYnkgZGV2aWNlIHNwZWNpZmljIGlvY3RscworICAgICAgSVJRcy4gIERNQSwgYXMgZGlzY3Vzc2VkIGxhdGVyLCBpcyBoYW5kbGVkIGJ5IGRldmljZS1zcGVjaWZpYyBpb2N0bHMKICAgICAgIGluIHRoaXMgY2FzZS4gIEl0IGFsc28gc3VwcG9ydHMgdGhlIGtlcm5lbCBtb2RlIHNldHRpbmcgQVBJcywgdGhvdWdoCiAgICAgICB1bmxpa2UgaW4gdGhlIGFjdHVhbCBpOTE1IGRyaXZlciBzb3VyY2UsIHRoaXMgZXhhbXBsZSB1bmNvbmRpdGlvbmFsbHkKICAgICAgIGV4cG9ydHMgS01TIGNhcGFiaWxpdHkuCkBAIC0yNjksMzYgKzI2OSwzNCBAQAogICAgICAgaW5pdGlhbCBvdXRwdXQgY29uZmlndXJhdGlvbi4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBOb3RlIHRoYXQgdGhlIHRhc2tzIHBlcmZvcm1lZCBhdCBkcml2ZXIgbG9hZCB0aW1lIG11c3Qgbm90Ci0gICAgICBjb25mbGljdCB3aXRoIERSTSBjbGllbnQgcmVxdWlyZW1lbnRzLiAgRm9yIGluc3RhbmNlLCBpZiB1c2VyCisgICAgICBJZiBjb21wYXRpYmlsaXR5IGlzIGEgY29uY2VybiAoZS5nLiB3aXRoIGRyaXZlcnMgY29udmVydGVkIG92ZXIKKyAgICAgIHRvIHRoZSBuZXcgaW50ZXJmYWNlcyBmcm9tIHRoZSBvbGQgb25lcyksIGNhcmUgbXVzdCBiZSB0YWtlbiB0bworICAgICAgcHJldmVudCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRyb2wgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aAorICAgICAgY3VycmVudGx5IGFjdGl2ZSB1c2Vyc3BhY2UgZHJpdmVycy4gIEZvciBpbnN0YW5jZSwgaWYgdXNlcgogICAgICAgbGV2ZWwgbW9kZSBzZXR0aW5nIGRyaXZlcnMgYXJlIGluIHVzZSwgaXQgd291bGQgYmUgcHJvYmxlbWF0aWMKICAgICAgIHRvIHBlcmZvcm0gb3V0cHV0IGRpc2NvdmVyeSAmYW1wOyBjb25maWd1cmF0aW9uIGF0IGxvYWQgdGltZS4KLSAgICAgIExpa2V3aXNlLCBpZiBwcmUtbWVtb3J5IG1hbmFnZW1lbnQgYXdhcmUgdXNlciBsZXZlbCBkcml2ZXJzIGFyZQorICAgICAgTGlrZXdpc2UsIGlmIHVzZXItbGV2ZWwgZHJpdmVycyB1bmF3YXJlIG9mIG1lbW9yeSBtYW5hZ2VtZW50IGFyZQogICAgICAgaW4gdXNlLCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgY29tbWFuZCBidWZmZXIgc2V0dXAgbWF5IG5lZWQgdG8KLSAgICAgIGJlIG9taXR0ZWQuICBUaGVzZSByZXF1aXJlbWVudHMgYXJlIGRyaXZlciBzcGVjaWZpYywgYW5kIGNhcmUKKyAgICAgIGJlIG9taXR0ZWQuICBUaGVzZSByZXF1aXJlbWVudHMgYXJlIGRyaXZlci1zcGVjaWZpYywgYW5kIGNhcmUKICAgICAgIG5lZWRzIHRvIGJlIHRha2VuIHRvIGtlZXAgYm90aCBvbGQgYW5kIG5ldyBhcHBsaWNhdGlvbnMgYW5kCiAgICAgICBsaWJyYXJpZXMgd29ya2luZy4gIFRoZSBpOTE1IGRyaXZlciBzdXBwb3J0cyB0aGUgIm1vZGVzZXQiCiAgICAgICBtb2R1bGUgcGFyYW1ldGVyIHRvIGNvbnRyb2wgd2hldGhlciBhZHZhbmNlZCBmZWF0dXJlcyBhcmUKLSAgICAgIGVuYWJsZWQgYXQgbG9hZCB0aW1lIG9yIGluIGxlZ2FjeSBmYXNoaW9uLiAgSWYgY29tcGF0aWJpbGl0eSBpcwotICAgICAgYSBjb25jZXJuIChlLmcuIHdpdGggZHJpdmVycyBjb252ZXJ0ZWQgb3ZlciB0byB0aGUgbmV3IGludGVyZmFjZXMKLSAgICAgIGZyb20gdGhlIG9sZCBvbmVzKSwgY2FyZSBtdXN0IGJlIHRha2VuIHRvIHByZXZlbnQgaW5jb21wYXRpYmxlCi0gICAgICBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRyb2wgd2l0aCB0aGUgY3VycmVudGx5IGFjdGl2ZQotICAgICAgdXNlcnNwYWNlIGRyaXZlcnMuCisgICAgICBlbmFibGVkIGF0IGxvYWQgdGltZSBvciBpbiBsZWdhY3kgZmFzaGlvbi4KICAgICA8L3BhcmE+CiAKICAgICA8c2VjdDI+CiAgICAgICA8dGl0bGU+RHJpdmVyIHByaXZhdGUgJmFtcDsgcGVyZm9ybWFuY2UgY291bnRlcnM8L3RpdGxlPgogICAgICAgPHBhcmE+CiAJVGhlIGRyaXZlciBwcml2YXRlIGhhbmdzIG9mZiB0aGUgbWFpbiBkcm1fZGV2aWNlIHN0cnVjdHVyZSBhbmQKLQljYW4gYmUgdXNlZCBmb3IgdHJhY2tpbmcgdmFyaW91cyBkZXZpY2Ugc3BlY2lmaWMgYml0cyBvZgorCWNhbiBiZSB1c2VkIGZvciB0cmFja2luZyB2YXJpb3VzIGRldmljZS1zcGVjaWZpYyBiaXRzIG9mCiAJaW5mb3JtYXRpb24sIGxpa2UgcmVnaXN0ZXIgb2Zmc2V0cywgY29tbWFuZCBidWZmZXIgc3RhdHVzLAogCXJlZ2lzdGVyIHN0YXRlIGZvciBzdXNwZW5kL3Jlc3VtZSwgZXRjLiAgQXQgbG9hZCB0aW1lLCBhCi0JZHJpdmVyIGNhbiBzaW1wbHkgYWxsb2NhdGUgb25lIGFuZCBzZXQgZHJtX2RldmljZS5kZXZfcHJpdgotCWFwcHJvcHJpYXRlbHk7IGF0IHVubG9hZCB0aGUgZHJpdmVyIGNhbiBmcmVlIGl0IGFuZCBzZXQKLQlkcm1fZGV2aWNlLmRldl9wcml2IHRvIE5VTEwuCisJZHJpdmVyIG1heSBzaW1wbHkgYWxsb2NhdGUgb25lIGFuZCBzZXQgZHJtX2RldmljZS5kZXZfcHJpdgorCWFwcHJvcHJpYXRlbHk7IGl0IHNob3VsZCBiZSBmcmVlZCBhbmQgZHJtX2RldmljZS5kZXZfcHJpdiBzZXQKKwl0byBOVUxMIHdoZW4gdGhlIGRyaXZlciBpcyB1bmxvYWRlZC4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCVRoZSBEUk0gc3VwcG9ydHMgc2V2ZXJhbCBjb3VudGVycyB3aGljaCBjYW4gYmUgdXNlZCBmb3Igcm91Z2gKKwlUaGUgRFJNIHN1cHBvcnRzIHNldmVyYWwgY291bnRlcnMgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIHJvdWdoCiAJcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXphdGlvbi4gIE5vdGUgdGhhdCB0aGUgRFJNIHN0YXQgY291bnRlcgogCXN5c3RlbSBpcyBub3Qgb2Z0ZW4gdXNlZCBieSBhcHBsaWNhdGlvbnMsIGFuZCBzdXBwb3J0aW5nCiAJYWRkaXRpb25hbCBjb3VudGVycyBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLgpAQCAtMzA3LDE1ICszMDUsMTUgQEAKIAlUaGVzZSBpbnRlcmZhY2VzIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuICBJZiBwZXJmb3JtYW5jZQogCW1vbml0b3JpbmcgaXMgZGVzaXJlZCwgdGhlIGRldmVsb3BlciBzaG91bGQgaW52ZXN0aWdhdGUgYW5kCiAJcG90ZW50aWFsbHkgZW5oYW5jZSB0aGUga2VybmVsIHBlcmYgYW5kIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gZXhwb3J0Ci0JR1BVIHJlbGF0ZWQgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gdG8gcGVyZm9ybWFuY2UgbW9uaXRvcmluZwotCXRvb2xzIGFuZCBhcHBsaWNhdGlvbnMuCisJR1BVIHJlbGF0ZWQgcGVyZm9ybWFuY2UgaW5mb3JtYXRpb24gZm9yIGNvbnN1bXB0aW9uIGJ5IHBlcmZvcm1hbmNlCisJbW9uaXRvcmluZyB0b29scyBhbmQgYXBwbGljYXRpb25zLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdDI+CiAKICAgICA8c2VjdDI+CiAgICAgICA8dGl0bGU+Q29uZmlndXJpbmcgdGhlIGRldmljZTwvdGl0bGU+CiAgICAgICA8cGFyYT4KLQlPYnZpb3VzbHksIGRldmljZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGV2aWNlIHNwZWNpZmljLgorCU9idmlvdXNseSwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gaXMgZGV2aWNlLXNwZWNpZmljLgogCUhvd2V2ZXIsIHRoZXJlIGFyZSBzZXZlcmFsIGNvbW1vbiBvcGVyYXRpb25zOiBmaW5kaW5nIGEKIAlkZXZpY2UncyBQQ0kgcmVzb3VyY2VzLCBtYXBwaW5nIHRoZW0sIGFuZCBwb3RlbnRpYWxseSBzZXR0aW5nCiAJdXAgYW4gSVJRIGhhbmRsZXIuCkBAIC0zMjMsMTAgKzMyMSwxMCBAQAogICAgICAgPHBhcmE+CiAJRmluZGluZyAmYW1wOyBtYXBwaW5nIHJlc291cmNlcyBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkLiAgVGhlCiAJRFJNIHdyYXBwZXIgZnVuY3Rpb25zLCBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KCkgYW5kCi0JZHJtX2dldF9yZXNvdXJjZV9sZW4oKSBjYW4gYmUgdXNlZCB0byBmaW5kIEJBUnMgb24gdGhlIGdpdmVuCisJZHJtX2dldF9yZXNvdXJjZV9sZW4oKSwgbWF5IGJlIHVzZWQgdG8gZmluZCBCQVJzIG9uIHRoZSBnaXZlbgogCWRybV9kZXZpY2Ugc3RydWN0LiAgT25jZSB0aG9zZSB2YWx1ZXMgaGF2ZSBiZWVuIHJldHJpZXZlZCwgdGhlCiAJZHJpdmVyIGxvYWQgZnVuY3Rpb24gY2FuIGNhbGwgZHJtX2FkZG1hcCgpIHRvIGNyZWF0ZSBhIG5ldwotCW1hcHBpbmcgZm9yIHRoZSBCQVIgaW4gcXVlc3Rpb24uICBOb3RlIHlvdSdsbCBwcm9iYWJseSB3YW50IGEKKwltYXBwaW5nIGZvciB0aGUgQkFSIGluIHF1ZXN0aW9uLiAgTm90ZSB0aGF0IHlvdSBwcm9iYWJseSB3YW50IGEKIAlkcm1fbG9jYWxfbWFwX3QgaW4geW91ciBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gdHJhY2sgYW55CiAJbWFwcGluZ3MgeW91IGNyZWF0ZS4KIDwhLS0gIUZkcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYyBkcm1fZ2V0X3Jlc291cmNlXyogLS0+CkBAIC0zMzUsMjAgKzMzMywyMCBAQAogICAgICAgPHBhcmE+CiAJaWYgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIGlzbid0IGEgY29uY2VybgogCShEUk0gZHJpdmVycyBjYW4gcnVuIHVuZGVyIHZhcmlvdXMgQlNEIHZhcmlhbnRzIGFuZCBPcGVuU29sYXJpcyksCi0JbmF0aXZlIExpbnV4IGNhbGxzIGNhbiBiZSB1c2VkIGZvciB0aGUgYWJvdmUsIGUuZy4gcGNpX3Jlc291cmNlXyoKKwluYXRpdmUgTGludXggY2FsbHMgbWF5IGJlIHVzZWQgZm9yIHRoZSBhYm92ZSwgZS5nLiBwY2lfcmVzb3VyY2VfKgogCWFuZCBpb21hcCovaW91bm1hcC4gIFNlZSB0aGUgTGludXggZGV2aWNlIGRyaXZlciBib29rIGZvciBtb3JlCiAJaW5mby4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCU9uY2UgeW91IGhhdmUgYSByZWdpc3RlciBtYXAsIHlvdSBjYW4gdXNlIHRoZSBEUk1fUkVBRG4oKSBhbmQKKwlPbmNlIHlvdSBoYXZlIGEgcmVnaXN0ZXIgbWFwLCB5b3UgbWF5IHVzZSB0aGUgRFJNX1JFQURuKCkgYW5kCiAJRFJNX1dSSVRFbigpIG1hY3JvcyB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycyBvbiB5b3VyIGRldmljZSwgb3IKLQl1c2UgZHJpdmVyIHNwZWNpZmljIHZlcnNpb25zIHRvIG9mZnNldCBpbnRvIHlvdXIgTU1JTyBzcGFjZQotCXJlbGF0aXZlIHRvIGEgZHJpdmVyIHNwZWNpZmljIGJhc2UgcG9pbnRlciAoc2VlIEk5MTVfUkVBRCBmb3IKLQlleGFtcGxlKS4KKwl1c2UgZHJpdmVyLXNwZWNpZmljIHZlcnNpb25zIHRvIG9mZnNldCBpbnRvIHlvdXIgTU1JTyBzcGFjZQorCXJlbGF0aXZlIHRvIGEgZHJpdmVyLXNwZWNpZmljIGJhc2UgcG9pbnRlciAoc2VlIEk5MTVfUkVBRCBmb3IKKwlhbiBleGFtcGxlKS4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgogCUlmIHlvdXIgZGV2aWNlIHN1cHBvcnRzIGludGVycnVwdCBnZW5lcmF0aW9uLCB5b3UgbWF5IHdhbnQgdG8KLQlzZXR1cCBhbiBpbnRlcnJ1cHQgaGFuZGxlciBhdCBkcml2ZXIgbG9hZCB0aW1lIGFzIHdlbGwuICBUaGlzCisJc2V0IHVwIGFuIGludGVycnVwdCBoYW5kbGVyIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuICBUaGlzCiAJaXMgZG9uZSB1c2luZyB0aGUgZHJtX2lycV9pbnN0YWxsKCkgZnVuY3Rpb24uICBJZiB5b3VyIGRldmljZQogCXN1cHBvcnRzIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdHMsIGl0IHNob3VsZCBjYWxsCiAJZHJtX3ZibGFua19pbml0KCkgdG8gaW5pdGlhbGl6ZSB0aGUgY29yZSB2YmxhbmsgaGFuZGxpbmcgY29kZSBiZWZvcmUKQEAgLTM1Nyw3ICszNTUsNyBAQAogICAgICAgPC9wYXJhPgogPCEtLSFGZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMgZHJtX2lycV9pbnN0YWxsLS0+CiAgICAgICA8cGFyYT4KLQlPbmNlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAoaXQnbGwgdXNlIHlvdXIKKwlPbmNlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAoaXQgdXNlcyB5b3VyCiAJZHJtX2RyaXZlci5pcnFfaGFuZGxlciBhcyB0aGUgYWN0dWFsIGludGVycnVwdCBoYW5kbGluZwogCWZ1bmN0aW9uKSwgeW91IGNhbiBzYWZlbHkgZW5hYmxlIGludGVycnVwdHMgb24geW91ciBkZXZpY2UsCiAJYXNzdW1pbmcgYW55IG90aGVyIHN0YXRlIHlvdXIgaW50ZXJydXB0IGhhbmRsZXIgdXNlcyBpcyBhbHNvCkBAIC0zNzEsMTAgKzM2OSwxMCBAQAogCXVzaW5nIHRoZSBwY2lfbWFwX3JvbSgpIGNhbGwsIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdAogCXRha2VzIGNhcmUgb2YgbWFwcGluZyB0aGUgYWN0dWFsIFJPTSwgd2hldGhlciBpdCBoYXMgYmVlbgogCXNoYWRvd2VkIGludG8gbWVtb3J5ICh0eXBpY2FsbHkgYXQgYWRkcmVzcyAweGMwMDAwKSBvciBleGlzdHMKLQlvbiB0aGUgUENJIGRldmljZSBpbiB0aGUgUk9NIEJBUi4gIE5vdGUgdGhhdCBvbmNlIHlvdSd2ZQotCW1hcHBlZCB0aGUgUk9NIGFuZCBleHRyYWN0ZWQgYW55IG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgYmUKLQlzdXJlIHRvIHVubWFwIGl0OyBvbiBtYW55IGRldmljZXMgdGhlIFJPTSBhZGRyZXNzIGRlY29kZXIgaXMKLQlzaGFyZWQgd2l0aCBvdGhlciBCQVJzLCBzbyBsZWF2aW5nIGl0IG1hcHBlZCBjYW4gY2F1c2UKKwlvbiB0aGUgUENJIGRldmljZSBpbiB0aGUgUk9NIEJBUi4gIE5vdGUgdGhhdCBhZnRlciB0aGUgUk9NCisJaGFzIGJlZW4gbWFwcGVkIGFuZCBhbnkgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGhhcyBiZWVuIGV4dHJhY3RlZCwKKwlpdCBzaG91bGQgYmUgdW5tYXBwZWQ7IG9uIG1hbnkgZGV2aWNlcywgdGhlIFJPTSBhZGRyZXNzIGRlY29kZXIgaXMKKwlzaGFyZWQgd2l0aCBvdGhlciBCQVJzLCBzbyBsZWF2aW5nIGl0IG1hcHBlZCBjb3VsZCBjYXVzZQogCXVuZGVzaXJlZCBiZWhhdmlvciBsaWtlIGhhbmdzIG9yIG1lbW9yeSBjb3JydXB0aW9uLgogPCEtLSFGZHJpdmVycy9wY2kvcm9tLmMgcGNpX21hcF9yb20tLT4KICAgICAgIDwvcGFyYT4KQEAgLTM4OSw5ICszODcsOSBAQAogCXNob3VsZCBzdXBwb3J0IGEgbWVtb3J5IG1hbmFnZXIuCiAgICAgICA8L3BhcmE+CiAgICAgICA8cGFyYT4KLQlJZiB5b3VyIGRyaXZlciBzdXBwb3J0cyBtZW1vcnkgbWFuYWdlbWVudCAoaXQgc2hvdWxkISksIHlvdSdsbAorCUlmIHlvdXIgZHJpdmVyIHN1cHBvcnRzIG1lbW9yeSBtYW5hZ2VtZW50IChpdCBzaG91bGQhKSwgeW91CiAJbmVlZCB0byBzZXQgdGhhdCB1cCBhdCBsb2FkIHRpbWUgYXMgd2VsbC4gIEhvdyB5b3UgaW5pdGlhbGl6ZQotCWl0IGRlcGVuZHMgb24gd2hpY2ggbWVtb3J5IG1hbmFnZXIgeW91J3JlIHVzaW5nLCBUVE0gb3IgR0VNLgorCWl0IGRlcGVuZHMgb24gd2hpY2ggbWVtb3J5IG1hbmFnZXIgeW91J3JlIHVzaW5nOiBUVE0gb3IgR0VNLgogICAgICAgPC9wYXJhPgogICAgICAgPHNlY3QzPgogCTx0aXRsZT5UVE0gaW5pdGlhbGl6YXRpb248L3RpdGxlPgpAQCAtNDAxLDcgKzM5OSw3IEBACiAJICBhbmQgZGV2aWNlcyB3aXRoIGRlZGljYXRlZCB2aWRlbyBSQU0gKFZSQU0pLCBpLmUuIG1vc3QgZGlzY3JldGUKIAkgIGdyYXBoaWNzIGRldmljZXMuICBJZiB5b3VyIGRldmljZSBoYXMgZGVkaWNhdGVkIFJBTSwgc3VwcG9ydGluZwogCSAgVFRNIGlzIGRlc2lyYWJsZS4gIFRUTSBhbHNvIGludGVncmF0ZXMgdGlnaHRseSB3aXRoIHlvdXIKLQkgIGRyaXZlciBzcGVjaWZpYyBidWZmZXIgZXhlY3V0aW9uIGZ1bmN0aW9uLiAgU2VlIHRoZSByYWRlb24KKwkgIGRyaXZlci1zcGVjaWZpYyBidWZmZXIgZXhlY3V0aW9uIGZ1bmN0aW9uLiAgU2VlIHRoZSByYWRlb24KIAkgIGRyaXZlciBmb3IgZXhhbXBsZXMuCiAJPC9wYXJhPgogCTxwYXJhPgpAQCAtNDI5LDIxICs0MjcsMjEgQEAKIAkgIGNyZWF0ZWQgYnkgdGhlIG1lbW9yeSBtYW5hZ2VyIGF0IHJ1bnRpbWUuICBZb3VyIGdsb2JhbCBUVE0gc2hvdWxkCiAJICBoYXZlIGEgdHlwZSBvZiBUVE1fR0xPQkFMX1RUTV9NRU0uICBUaGUgc2l6ZSBmaWVsZCBmb3IgdGhlIGdsb2JhbAogCSAgb2JqZWN0IHNob3VsZCBiZSBzaXplb2Yoc3RydWN0IHR0bV9tZW1fZ2xvYmFsKSwgYW5kIHRoZSBpbml0IGFuZAotCSAgcmVsZWFzZSBob29rcyBzaG91bGQgcG9pbnQgYXQgeW91ciBkcml2ZXIgc3BlY2lmaWMgaW5pdCBhbmQKLQkgIHJlbGVhc2Ugcm91dGluZXMsIHdoaWNoIHdpbGwgcHJvYmFibHkgZXZlbnR1YWxseSBjYWxsCi0JICB0dG1fbWVtX2dsb2JhbF9pbml0IGFuZCB0dG1fbWVtX2dsb2JhbF9yZWxlYXNlIHJlc3BlY3RpdmVseS4KKwkgIHJlbGVhc2UgaG9va3Mgc2hvdWxkIHBvaW50IGF0IHlvdXIgZHJpdmVyLXNwZWNpZmljIGluaXQgYW5kCisJICByZWxlYXNlIHJvdXRpbmVzLCB3aGljaCBwcm9iYWJseSBldmVudHVhbGx5IGNhbGwKKwkgIHR0bV9tZW1fZ2xvYmFsX2luaXQgYW5kIHR0bV9tZW1fZ2xvYmFsX3JlbGVhc2UsIHJlc3BlY3RpdmVseS4KIAk8L3BhcmE+CiAJPHBhcmE+CiAJICBPbmNlIHlvdXIgZ2xvYmFsIFRUTSBhY2NvdW50aW5nIHN0cnVjdHVyZSBpcyBzZXQgdXAgYW5kIGluaXRpYWxpemVkCi0JICAoZG9uZSBieSBjYWxsaW5nIHR0bV9nbG9iYWxfaXRlbV9yZWYgb24gdGhlIGdsb2JhbCBvYmplY3QgeW91Ci0JICBqdXN0IGNyZWF0ZWQpLCB5b3UnbGwgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgb2JqZWN0IFRUTSB0bworCSAgYnkgY2FsbGluZyB0dG1fZ2xvYmFsX2l0ZW1fcmVmKCkgb24gaXQsCisJICB5b3UgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgb2JqZWN0IFRUTSB0bwogCSAgcHJvdmlkZSBhIHBvb2wgZm9yIGJ1ZmZlciBvYmplY3QgYWxsb2NhdGlvbiBieSBjbGllbnRzIGFuZCB0aGUKIAkgIGtlcm5lbCBpdHNlbGYuICBUaGUgdHlwZSBvZiB0aGlzIG9iamVjdCBzaG91bGQgYmUgVFRNX0dMT0JBTF9UVE1fQk8sCiAJICBhbmQgaXRzIHNpemUgc2hvdWxkIGJlIHNpemVvZihzdHJ1Y3QgdHRtX2JvX2dsb2JhbCkuICBBZ2FpbiwKLQkgIGRyaXZlciBzcGVjaWZpYyBpbml0IGFuZCByZWxlYXNlIGZ1bmN0aW9ucyBjYW4gYmUgcHJvdmlkZWQsCi0JICBsaWtlbHkgZXZlbnR1YWxseSBjYWxsaW5nIHR0bV9ib19nbG9iYWxfaW5pdCBhbmQKLQkgIHR0bV9ib19nbG9iYWxfcmVsZWFzZSwgcmVzcGVjdGl2ZWx5LiAgQWxzbyBsaWtlIHRoZSBwcmV2aW91cwotCSAgb2JqZWN0LCB0dG1fZ2xvYmFsX2l0ZW1fcmVmIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgcmVmZXJlbmNlCisJICBkcml2ZXItc3BlY2lmaWMgaW5pdCBhbmQgcmVsZWFzZSBmdW5jdGlvbnMgbWF5IGJlIHByb3ZpZGVkLAorCSAgbGlrZWx5IGV2ZW50dWFsbHkgY2FsbGluZyB0dG1fYm9fZ2xvYmFsX2luaXQoKSBhbmQKKwkgIHR0bV9ib19nbG9iYWxfcmVsZWFzZSgpLCByZXNwZWN0aXZlbHkuICBBbHNvLCBsaWtlIHRoZSBwcmV2aW91cworCSAgb2JqZWN0LCB0dG1fZ2xvYmFsX2l0ZW1fcmVmKCkgaXMgdXNlZCB0byBjcmVhdGUgYW4gaW5pdGlhbCByZWZlcmVuY2UKIAkgIGNvdW50IGZvciB0aGUgVFRNLCB3aGljaCB3aWxsIGNhbGwgeW91ciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KIAk8L3BhcmE+CiAgICAgICA8L3NlY3QzPgpAQCAtNDUzLDI3ICs0NTEsMjYgQEAKIAkgIEdFTSBpcyBhbiBhbHRlcm5hdGl2ZSB0byBUVE0sIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgVU1BCiAJICBkZXZpY2VzLiAgSXQgaGFzIHNpbXBsZXIgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiByZXF1aXJlbWVudHMKIAkgIHRoYW4gVFRNLCBidXQgaGFzIG5vIFZSQU0gbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAgQ29yZSBHRU0KLQkgIGluaXRpYWxpemF0aW9uIGlzIGNvbXByaXNlZCBvZiBhIGJhc2ljIGRybV9tbV9pbml0IGNhbGwgdG8gY3JlYXRlCisJICBpcyBpbml0aWFsaXplZCBieSBjYWxsaW5nIGRybV9tbV9pbml0KCkgdG8gY3JlYXRlCiAJICBhIEdUVCBEUk0gTU0gb2JqZWN0LCB3aGljaCBwcm92aWRlcyBhbiBhZGRyZXNzIHNwYWNlIHBvb2wgZm9yCi0JICBvYmplY3QgYWxsb2NhdGlvbi4gIEluIGEgS01TIGNvbmZpZ3VyYXRpb24sIHRoZSBkcml2ZXIgd2lsbAotCSAgbmVlZCB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGNvbW1hbmQgcmluZyBidWZmZXIgZm9sbG93aW5nCi0JICBiYXNpYyBHRU0gaW5pdGlhbGl6YXRpb24uICBNb3N0IFVNQSBkZXZpY2VzIGhhdmUgYSBzby1jYWxsZWQKKwkgIG9iamVjdCBhbGxvY2F0aW9uLiAgSW4gYSBLTVMgY29uZmlndXJhdGlvbiwgdGhlIGRyaXZlcgorCSAgbmVlZHMgdG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb21tYW5kIHJpbmcgYnVmZmVyIGZvbGxvd2luZworCSAgY29yZSBHRU0gaW5pdGlhbGl6YXRpb24uICBBIFVNQSBkZXZpY2UgdXN1YWxseSBoYXMgd2hhdCBpcyBjYWxsZWQgYQogCSAgInN0b2xlbiIgbWVtb3J5IHJlZ2lvbiwgd2hpY2ggcHJvdmlkZXMgc3BhY2UgZm9yIHRoZSBpbml0aWFsCiAJICBmcmFtZWJ1ZmZlciBhbmQgbGFyZ2UsIGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbnMgcmVxdWlyZWQgYnkgdGhlCi0JICBkZXZpY2UuICBUaGlzIHNwYWNlIGlzIG5vdCB0eXBpY2FsbHkgbWFuYWdlZCBieSBHRU0sIGFuZCBtdXN0CisJICBkZXZpY2UuICBUaGlzIHNwYWNlIGlzIG5vdCB0eXBpY2FsbHkgbWFuYWdlZCBieSBHRU0sIGFuZCBpdCBtdXN0CiAJICBiZSBpbml0aWFsaXplZCBzZXBhcmF0ZWx5IGludG8gaXRzIG93biBEUk0gTU0gb2JqZWN0LgogCTwvcGFyYT4KIAk8cGFyYT4KLQkgIEluaXRpYWxpemF0aW9uIHdpbGwgYmUgZHJpdmVyIHNwZWNpZmljLCBhbmQgd2lsbCBkZXBlbmQgb24KLQkgIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGRldmljZS4gIEluIHRoZSBjYXNlIG9mIEludGVsCisJICBJbml0aWFsaXphdGlvbiBpcyBkcml2ZXItc3BlY2lmaWMuIEluIHRoZSBjYXNlIG9mIEludGVsCiAJICBpbnRlZ3JhdGVkIGdyYXBoaWNzIGNoaXBzIGxpa2UgOTY1R00sIEdFTSBpbml0aWFsaXphdGlvbiBjYW4KIAkgIGJlIGRvbmUgYnkgY2FsbGluZyB0aGUgaW50ZXJuYWwgR0VNIGluaXQgZnVuY3Rpb24sCiAJICBpOTE1X2dlbV9kb19pbml0KCkuICBTaW5jZSB0aGUgOTY1R00gaXMgYSBVTUEgZGV2aWNlCi0JICAoaS5lLiBpdCBkb2Vzbid0IGhhdmUgZGVkaWNhdGVkIFZSQU0pLCBHRU0gd2lsbCBtYW5hZ2UKKwkgIChpLmUuIGl0IGRvZXNuJ3QgaGF2ZSBkZWRpY2F0ZWQgVlJBTSksIEdFTSBtYW5hZ2VzCiAJICBtYWtpbmcgcmVndWxhciBSQU0gYXZhaWxhYmxlIGZvciBHUFUgb3BlcmF0aW9ucy4gIE1lbW9yeSBzZXQKIAkgIGFzaWRlIGJ5IHRoZSBCSU9TIChjYWxsZWQgInN0b2xlbiIgbWVtb3J5IGJ5IHRoZSBpOTE1Ci0JICBkcml2ZXIpIHdpbGwgYmUgbWFuYWdlZCBieSB0aGUgRFJNIG1lbXJhbmdlIGFsbG9jYXRvcjsgdGhlCi0JICByZXN0IG9mIHRoZSBhcGVydHVyZSB3aWxsIGJlIG1hbmFnZWQgYnkgR0VNLgorCSAgZHJpdmVyKSBpcyBtYW5hZ2VkIGJ5IHRoZSBEUk0gbWVtcmFuZ2UgYWxsb2NhdG9yOyB0aGUKKwkgIHJlc3Qgb2YgdGhlIGFwZXJ0dXJlIGlzIG1hbmFnZWQgYnkgR0VNLgogCSAgPHByb2dyYW1saXN0aW5nPgogCSAgICAvKiBCYXNpYyBtZW1yYW5nZSBhbGxvY2F0b3IgZm9yIHN0b2xlbiBzcGFjZSAoYWthIHZyYW0pICovCiAJICAgIGRybV9tZW1yYW5nZV9pbml0KCZhbXA7ZGV2X3ByaXYtPnZyYW0sIDAsIHByZWFsbG9jX3NpemUpOwpAQCAtNDgzLDcgKzQ4MCw3IEBACiA8IS0tIUVkcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1yYW5nZS5jLS0+CiAJPC9wYXJhPgogCTxwYXJhPgotCSAgT25jZSB0aGUgbWVtb3J5IG1hbmFnZXIgaGFzIGJlZW4gc2V0IHVwLCB3ZSBjYW4gYWxsb2NhdGUgdGhlCisJICBPbmNlIHRoZSBtZW1vcnkgbWFuYWdlciBoYXMgYmVlbiBzZXQgdXAsIHdlIG1heSBhbGxvY2F0ZSB0aGUKIAkgIGNvbW1hbmQgYnVmZmVyLiAgSW4gdGhlIGk5MTUgY2FzZSwgdGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBhCiAJICBHRU0gZnVuY3Rpb24sIGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcigpLgogCTwvcGFyYT4KQEAgLTQ5MywxNiArNDkwLDI1IEBACiAgICAgPHNlY3QyPgogICAgICAgPHRpdGxlPk91dHB1dCBjb25maWd1cmF0aW9uPC90aXRsZT4KICAgICAgIDxwYXJhPgotCVRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiB0YXNrIGlzIG91dHB1dCBjb25maWd1cmF0aW9uLiAgVGhpcyBpbnZvbHZlcwotCWZpbmRpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgQ1JUQ3MsIGVuY29kZXJzIGFuZCBjb25uZWN0b3JzCi0JZm9yIHlvdXIgZGV2aWNlLCBjcmVhdGluZyBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kCi0JcmVnaXN0ZXJpbmcgYSBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlci4KKwlUaGUgZmluYWwgaW5pdGlhbGl6YXRpb24gdGFzayBpcyBvdXRwdXQgY29uZmlndXJhdGlvbi4gIFRoaXMgaW52b2x2ZXM6CisJPGl0ZW1pemVkbGlzdD4KKwkgIDxsaXN0aXRlbT4KKwkgICAgRmluZGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBDUlRDcywgZW5jb2RlcnMsIGFuZCBjb25uZWN0b3JzCisJICAgIGZvciB0aGUgZGV2aWNlLgorCSAgPC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT4KKwkgICAgQ3JlYXRpbmcgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uLgorCSAgPC9saXN0aXRlbT4KKwkgIDxsaXN0aXRlbT4KKwkgICAgUmVnaXN0ZXJpbmcgYSBmcmFtZWJ1ZmZlciBjb25zb2xlIGRyaXZlci4KKwkgIDwvbGlzdGl0ZW0+CisJPC9pdGVtaXplZGxpc3Q+CiAgICAgICA8L3BhcmE+CiAgICAgICA8c2VjdDM+CiAJPHRpdGxlPk91dHB1dCBkaXNjb3ZlcnkgYW5kIGluaXRpYWxpemF0aW9uPC90aXRsZT4KIAk8cGFyYT4KLQkgIFNldmVyYWwgY29yZSBmdW5jdGlvbnMgZXhpc3QgdG8gY3JlYXRlIENSVENzLCBlbmNvZGVycyBhbmQKLQkgIGNvbm5lY3RvcnMsIG5hbWVseSBkcm1fY3J0Y19pbml0KCksIGRybV9jb25uZWN0b3JfaW5pdCgpIGFuZAorCSAgU2V2ZXJhbCBjb3JlIGZ1bmN0aW9ucyBleGlzdCB0byBjcmVhdGUgQ1JUQ3MsIGVuY29kZXJzLCBhbmQKKwkgIGNvbm5lY3RvcnMsIG5hbWVseTogZHJtX2NydGNfaW5pdCgpLCBkcm1fY29ubmVjdG9yX2luaXQoKSwgYW5kCiAJICBkcm1fZW5jb2Rlcl9pbml0KCksIGFsb25nIHdpdGggc2V2ZXJhbCAiaGVscGVyIiBmdW5jdGlvbnMgdG8KIAkgIHBlcmZvcm0gY29tbW9uIHRhc2tzLgogCTwvcGFyYT4KQEAgLTU1NSwxMCArNTYxLDEwIEBACiAJPC9wcm9ncmFtbGlzdGluZz4KIAk8cGFyYT4KIAkgIEluIHRoZSBleGFtcGxlIGFib3ZlIChhZ2FpbiwgdGFrZW4gZnJvbSB0aGUgaTkxNSBkcml2ZXIpLCBhCi0JICBDUlQgY29ubmVjdG9yIGFuZCBlbmNvZGVyIGNvbWJpbmF0aW9uIGlzIGNyZWF0ZWQuICBBIGRldmljZQotCSAgc3BlY2lmaWMgaTJjIGJ1cyBpcyBhbHNvIGNyZWF0ZWQsIGZvciBmZXRjaGluZyBFRElEIGRhdGEgYW5kCisJICBDUlQgY29ubmVjdG9yIGFuZCBlbmNvZGVyIGNvbWJpbmF0aW9uIGlzIGNyZWF0ZWQuICBBIGRldmljZS1zcGVjaWZpYworCSAgaTJjIGJ1cyBpcyBhbHNvIGNyZWF0ZWQgZm9yIGZldGNoaW5nIEVESUQgZGF0YSBhbmQKIAkgIHBlcmZvcm1pbmcgbW9uaXRvciBkZXRlY3Rpb24uICBPbmNlIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlLAotCSAgdGhlIG5ldyBjb25uZWN0b3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHN5c2ZzLCB0byBtYWtlIGl0cworCSAgdGhlIG5ldyBjb25uZWN0b3IgaXMgcmVnaXN0ZXJlZCB3aXRoIHN5c2ZzIHRvIG1ha2UgaXRzCiAJICBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMuCiAJPC9wYXJhPgogCTxzZWN0ND4KQEAgLTU2NywxMiArNTczLDEyIEBACiAJICAgIFNpbmNlIG1hbnkgUEMtY2xhc3MgZ3JhcGhpY3MgZGV2aWNlcyBoYXZlIHNpbWlsYXIgZGlzcGxheSBvdXRwdXQKIAkgICAgZGVzaWducywgdGhlIERSTSBwcm92aWRlcyBhIHNldCBvZiBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UKIAkgICAgb3V0cHV0IG1hbmFnZW1lbnQgZWFzaWVyLiAgVGhlIGNvcmUgaGVscGVyIHJvdXRpbmVzIGhhbmRsZQotCSAgICBlbmNvZGVyIHJlLXJvdXRpbmcgYW5kIGRpc2FibGluZyBvZiB1bnVzZWQgZnVuY3Rpb25zIGZvbGxvd2luZwotCSAgICBtb2RlIHNldC4gIFVzaW5nIHRoZSBoZWxwZXJzIGlzIG9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQgZm9yCisJICAgIGVuY29kZXIgcmUtcm91dGluZyBhbmQgdGhlIGRpc2FibGluZyBvZiB1bnVzZWQgZnVuY3Rpb25zIGZvbGxvd2luZworCSAgICBtb2RlIHNldHRpbmcuICBVc2luZyB0aGUgaGVscGVycyBpcyBvcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkIGZvcgogCSAgICBkZXZpY2VzIHdpdGggUEMtc3R5bGUgYXJjaGl0ZWN0dXJlcyAoaS5lLiBhIHNldCBvZiBkaXNwbGF5IHBsYW5lcwogCSAgICBmb3IgZmVlZGluZyBwaXhlbHMgdG8gZW5jb2RlcnMgd2hpY2ggYXJlIGluIHR1cm4gcm91dGVkIHRvCiAJICAgIGNvbm5lY3RvcnMpLiAgRGV2aWNlcyB3aXRoIG1vcmUgY29tcGxleCByZXF1aXJlbWVudHMgbmVlZGluZwotCSAgICBmaW5lciBncmFpbmVkIG1hbmFnZW1lbnQgY2FuIG9wdCB0byB1c2UgdGhlIGNvcmUgY2FsbGJhY2tzCisJICAgIGZpbmVyIGdyYWluZWQgbWFuYWdlbWVudCBtYXkgb3B0IHRvIHVzZSB0aGUgY29yZSBjYWxsYmFja3MKIAkgICAgZGlyZWN0bHkuCiAJICA8L3BhcmE+CiAJICA8cGFyYT4KQEAgLTU4MCwxNyArNTg2LDI1IEBACiAJICA8L3BhcmE+CiAJPC9zZWN0ND4KIAk8cGFyYT4KLQkgIEZvciBlYWNoIGVuY29kZXIsIENSVEMgYW5kIGNvbm5lY3Rvciwgc2V2ZXJhbCBmdW5jdGlvbnMgbXVzdAotCSAgYmUgcHJvdmlkZWQsIGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0IHR5cGUuICBFbmNvZGVyIG9iamVjdHMKLQkgIG5lZWQgdG8gcHJvdmlkZSBhIERQTVMgKGJhc2ljYWxseSBvbi9vZmYpIGZ1bmN0aW9uLCBtb2RlIGZpeHVwCi0JICAoZm9yIGNvbnZlcnRpbmcgcmVxdWVzdGVkIG1vZGVzIGludG8gbmF0aXZlIGhhcmR3YXJlIHRpbWluZ3MpLAotCSAgYW5kIHByZXBhcmUsIHNldCBhbmQgY29tbWl0IGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHRoZSBjb3JlIERSTQotCSAgaGVscGVyIGZ1bmN0aW9ucy4gIENvbm5lY3RvciBoZWxwZXJzIG5lZWQgdG8gcHJvdmlkZSBtb2RlIGZldGNoIGFuZAotCSAgdmFsaWRpdHkgZnVuY3Rpb25zIGFzIHdlbGwgYXMgYW4gZW5jb2RlciBtYXRjaGluZyBmdW5jdGlvbiBmb3IKLQkgIHJldHVybmluZyBhbiBpZGVhbCBlbmNvZGVyIGZvciBhIGdpdmVuIGNvbm5lY3Rvci4gIFRoZSBjb3JlCi0JICBjb25uZWN0b3IgZnVuY3Rpb25zIGluY2x1ZGUgYSBEUE1TIGNhbGxiYWNrLCAoZGVwcmVjYXRlZCkKLQkgIHNhdmUvcmVzdG9yZSByb3V0aW5lcywgZGV0ZWN0aW9uLCBtb2RlIHByb2JpbmcsIHByb3BlcnR5IGhhbmRsaW5nLAotCSAgYW5kIGNsZWFudXAgZnVuY3Rpb25zLgorCSAgRWFjaCBlbmNvZGVyIG9iamVjdCBuZWVkcyB0byBwcm92aWRlOgorCSAgPGl0ZW1pemVkbGlzdD4KKwkgICAgPGxpc3RpdGVtPgorCSAgICAgIEEgRFBNUyAoYmFzaWNhbGx5IG9uL29mZikgZnVuY3Rpb24uCisJICAgIDwvbGlzdGl0ZW0+CisJICAgIDxsaXN0aXRlbT4KKwkgICAgICBBIG1vZGUtZml4dXAgZnVuY3Rpb24gKGZvciBjb252ZXJ0aW5nIHJlcXVlc3RlZCBtb2RlcyBpbnRvCisJICAgICAgbmF0aXZlIGhhcmR3YXJlIHRpbWluZ3MpLgorCSAgICA8L2xpc3RpdGVtPgorCSAgICA8bGlzdGl0ZW0+CisJICAgICAgRnVuY3Rpb25zIChwcmVwYXJlLCBzZXQsIGFuZCBjb21taXQpIGZvciB1c2UgYnkgdGhlIGNvcmUgRFJNCisJICAgICAgaGVscGVyIGZ1bmN0aW9ucy4KKwkgICAgPC9saXN0aXRlbT4KKwkgIDwvaXRlbWl6ZWRsaXN0PgorCSAgQ29ubmVjdG9yIGhlbHBlcnMgbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyAobW9kZS1mZXRjaCwgdmFsaWRpdHksCisJICBhbmQgZW5jb2Rlci1tYXRjaGluZykgZm9yIHJldHVybmluZyBhbiBpZGVhbCBlbmNvZGVyIGZvciBhIGdpdmVuCisJICBjb25uZWN0b3IuICBUaGUgY29yZSBjb25uZWN0b3IgZnVuY3Rpb25zIGluY2x1ZGUgYSBEUE1TIGNhbGxiYWNrLAorCSAgc2F2ZS9yZXN0b3JlIHJvdXRpbmVzIChkZXByZWNhdGVkKSwgZGV0ZWN0aW9uLCBtb2RlIHByb2JpbmcsCisJICBwcm9wZXJ0eSBoYW5kbGluZywgYW5kIGNsZWFudXAgZnVuY3Rpb25zLgogCTwvcGFyYT4KIDwhLS0hRWRyaXZlcnMvY2hhci9kcm0vZHJtX2NydGMuaC0tPgogPCEtLSFFZHJpdmVycy9jaGFyL2RybS9kcm1fY3J0Yy5jLS0+CkBAIC02MDUsMjMgKzYxOSwzNCBAQAogICAgIDx0aXRsZT5WQmxhbmsgZXZlbnQgaGFuZGxpbmc8L3RpdGxlPgogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIGV4cG9zZXMgdHdvIHZlcnRpY2FsIGJsYW5rIHJlbGF0ZWQgaW9jdGxzOgotICAgICAgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LIGFuZCBEUk1fSU9DVExfTU9ERVNFVF9DVEwuCisgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgIDx0ZXJtPkRSTV9JT0NUTF9XQUlUX1ZCTEFOSzwvdGVybT4KKyAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgVGhpcyB0YWtlcyBhIHN0cnVjdCBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlIGFzIGl0cyBhcmd1bWVudCwKKyAgICAgICAgICAgICAgYW5kIGl0IGlzIHVzZWQgdG8gYmxvY2sgb3IgcmVxdWVzdCBhIHNpZ25hbCB3aGVuIGEgc3BlY2lmaWVkCisgICAgICAgICAgICAgIHZibGFuayBldmVudCBvY2N1cnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgPHRlcm0+RFJNX0lPQ1RMX01PREVTRVRfQ1RMPC90ZXJtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYXBwbGljYXRpb24gbGV2ZWwgZHJpdmVycyBiZWZvcmUgYW5kCisgICAgICAgICAgICAgIGFmdGVyIG1vZGUgc2V0dGluZywgc2luY2Ugb24gbWFueSBkZXZpY2VzIHRoZSB2ZXJ0aWNhbCBibGFuaworICAgICAgICAgICAgICBjb3VudGVyIGlzIHJlc2V0IGF0IHRoYXQgdGltZS4gIEludGVybmFsbHksIHRoZSBEUk0gc25hcHNob3RzCisgICAgICAgICAgICAgIHRoZSBsYXN0IHZibGFuayBjb3VudCB3aGVuIHRoZSBpb2N0bCBpcyBjYWxsZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgX0RSTV9QUkVfTU9ERVNFVCBjb21tYW5kLCBzbyB0aGF0IHRoZSBjb3VudGVyIHdvbid0IGdvIGJhY2t3YXJkcworICAgICAgICAgICAgICAod2hpY2ggaXMgZGVhbHQgd2l0aCB3aGVuIF9EUk1fUE9TVF9NT0RFU0VUIGlzIHVzZWQpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPC92YXJpYWJsZWxpc3Q+CiA8IS0tIUVkcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYy0tPgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KLSAgICAgIERSTV9JT0NUTF9XQUlUX1ZCTEFOSyB0YWtlcyBhIHN0cnVjdCBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlCi0gICAgICBhcyBpdHMgYXJndW1lbnQsIGFuZCBpcyB1c2VkIHRvIGJsb2NrIG9yIHJlcXVlc3QgYSBzaWduYWwgd2hlbiBhCi0gICAgICBzcGVjaWZpZWQgdmJsYW5rIGV2ZW50IG9jY3Vycy4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBEUk1fSU9DVExfTU9ERVNFVF9DVEwgc2hvdWxkIGJlIGNhbGxlZCBieSBhcHBsaWNhdGlvbiBsZXZlbAotICAgICAgZHJpdmVycyBiZWZvcmUgYW5kIGFmdGVyIG1vZGUgc2V0dGluZywgc2luY2Ugb24gbWFueSBkZXZpY2VzIHRoZQotICAgICAgdmVydGljYWwgYmxhbmsgY291bnRlciB3aWxsIGJlIHJlc2V0IGF0IHRoYXQgdGltZS4gIEludGVybmFsbHksCi0gICAgICB0aGUgRFJNIHNuYXBzaG90cyB0aGUgbGFzdCB2YmxhbmsgY291bnQgd2hlbiB0aGUgaW9jdGwgaXMgY2FsbGVkCi0gICAgICB3aXRoIHRoZSBfRFJNX1BSRV9NT0RFU0VUIGNvbW1hbmQgc28gdGhhdCB0aGUgY291bnRlciB3b24ndCBnbwotICAgICAgYmFja3dhcmRzICh3aGljaCBpcyBkZWFsdCB3aXRoIHdoZW4gX0RSTV9QT1NUX01PREVTRVQgaXMgdXNlZCkuCi0gICAgPC9wYXJhPgotICAgIDxwYXJhPgogICAgICAgVG8gc3VwcG9ydCB0aGUgZnVuY3Rpb25zIGFib3ZlLCB0aGUgRFJNIGNvcmUgcHJvdmlkZXMgc2V2ZXJhbAogICAgICAgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdHJhY2tpbmcgdmVydGljYWwgYmxhbmsgY291bnRlcnMsIGFuZAogICAgICAgcmVxdWlyZXMgZHJpdmVycyB0byBwcm92aWRlIHNldmVyYWwgY2FsbGJhY2tzOgpAQCAtNjMyLDI0ICs2NTcsMjQgQEAKICAgICAgIHJlZ2lzdGVyLiAgVGhlIGVuYWJsZSBhbmQgZGlzYWJsZSB2YmxhbmsgY2FsbGJhY2tzIHNob3VsZCBlbmFibGUKICAgICAgIGFuZCBkaXNhYmxlIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdHMsIHJlc3BlY3RpdmVseS4gIEluIHRoZQogICAgICAgYWJzZW5jZSBvZiBEUk0gY2xpZW50cyB3YWl0aW5nIG9uIHZibGFuayBldmVudHMsIHRoZSBjb3JlIERSTQotICAgICAgY29kZSB3aWxsIHVzZSB0aGUgZGlzYWJsZV92YmxhbmsoKSBmdW5jdGlvbiB0byBkaXNhYmxlCi0gICAgICBpbnRlcnJ1cHRzLCB3aGljaCBzYXZlcyBwb3dlci4gIFRoZXknbGwgYmUgcmUtZW5hYmxlZCBhZ2FpbiB3aGVuCisgICAgICBjb2RlIHVzZXMgdGhlIGRpc2FibGVfdmJsYW5rKCkgZnVuY3Rpb24gdG8gZGlzYWJsZQorICAgICAgaW50ZXJydXB0cywgd2hpY2ggc2F2ZXMgcG93ZXIuICBUaGV5IGFyZSByZS1lbmFibGVkIGFnYWluIHdoZW4KICAgICAgIGEgY2xpZW50IGNhbGxzIHRoZSB2Ymxhbmsgd2FpdCBpb2N0bCBhYm92ZS4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBEZXZpY2VzIHRoYXQgZG9uJ3QgcHJvdmlkZSBhIGNvdW50IHJlZ2lzdGVyIGNhbiBzaW1wbHkgdXNlIGFuCisgICAgICBBIGRldmljZSB0aGF0IGRvZXNuJ3QgcHJvdmlkZSBhIGNvdW50IHJlZ2lzdGVyIG1heSBzaW1wbHkgdXNlIGFuCiAgICAgICBpbnRlcm5hbCBhdG9taWMgY291bnRlciBpbmNyZW1lbnRlZCBvbiBldmVyeSB2ZXJ0aWNhbCBibGFuawotICAgICAgaW50ZXJydXB0LCBhbmQgY2FuIG1ha2UgdGhlaXIgZW5hYmxlIGFuZCBkaXNhYmxlIHZibGFuawotICAgICAgZnVuY3Rpb25zIGludG8gbm8tb3BzLgorICAgICAgaW50ZXJydXB0IChhbmQgdGhlbiB0cmVhdCB0aGUgZW5hYmxlX3ZibGFuaygpIGFuZCBkaXNhYmxlX3ZibGFuaygpCisgICAgICBjYWxsYmFja3MgYXMgbm8tb3BzKS4KICAgICA8L3BhcmE+CiAgIDwvc2VjdDE+CiAKICAgPHNlY3QxPgogICAgIDx0aXRsZT5NZW1vcnkgbWFuYWdlbWVudDwvdGl0bGU+CiAgICAgPHBhcmE+Ci0gICAgICBUaGUgbWVtb3J5IG1hbmFnZXIgbGllcyBhdCB0aGUgaGVhcnQgb2YgbWFueSBEUk0gb3BlcmF0aW9ucywgYW5kCi0gICAgICBpcyBhbHNvIHJlcXVpcmVkIHRvIHN1cHBvcnQgYWR2YW5jZWQgY2xpZW50IGZlYXR1cmVzIGxpa2UgT3BlbkdMCi0gICAgICBwYnVmZmVycy4gIFRoZSBEUk0gY3VycmVudGx5IGNvbnRhaW5zIHR3byBtZW1vcnkgbWFuYWdlcnMsIFRUTQorICAgICAgVGhlIG1lbW9yeSBtYW5hZ2VyIGxpZXMgYXQgdGhlIGhlYXJ0IG9mIG1hbnkgRFJNIG9wZXJhdGlvbnM7IGl0CisgICAgICBpcyByZXF1aXJlZCB0byBzdXBwb3J0IGFkdmFuY2VkIGNsaWVudCBmZWF0dXJlcyBsaWtlIE9wZW5HTAorICAgICAgcGJ1ZmZlcnMuICBUaGUgRFJNIGN1cnJlbnRseSBjb250YWlucyB0d28gbWVtb3J5IG1hbmFnZXJzOiBUVE0KICAgICAgIGFuZCBHRU0uCiAgICAgPC9wYXJhPgogCkBAIC02NzksNDEgKzcwNCw0NiBAQAogICAgICAgPHBhcmE+CiAJR0VNLWVuYWJsZWQgZHJpdmVycyBtdXN0IHByb3ZpZGUgZ2VtX2luaXRfb2JqZWN0KCkgYW5kCiAJZ2VtX2ZyZWVfb2JqZWN0KCkgY2FsbGJhY2tzIHRvIHN1cHBvcnQgdGhlIGNvcmUgbWVtb3J5Ci0JYWxsb2NhdGlvbiByb3V0aW5lcy4gIFRoZXkgc2hvdWxkIGFsc28gcHJvdmlkZSBzZXZlcmFsIGRyaXZlcgotCXNwZWNpZmljIGlvY3RscyB0byBzdXBwb3J0IGNvbW1hbmQgZXhlY3V0aW9uLCBwaW5uaW5nLCBidWZmZXIKKwlhbGxvY2F0aW9uIHJvdXRpbmVzLiAgVGhleSBzaG91bGQgYWxzbyBwcm92aWRlIHNldmVyYWwgZHJpdmVyLXNwZWNpZmljCisJaW9jdGxzIHRvIHN1cHBvcnQgY29tbWFuZCBleGVjdXRpb24sIHBpbm5pbmcsIGJ1ZmZlcgogCXJlYWQgJmFtcDsgd3JpdGUsIG1hcHBpbmcsIGFuZCBkb21haW4gb3duZXJzaGlwIHRyYW5zZmVycy4KICAgICAgIDwvcGFyYT4KICAgICAgIDxwYXJhPgotCU9uIGEgZnVuZGFtZW50YWwgbGV2ZWwsIEdFTSBpbnZvbHZlcyBzZXZlcmFsIG9wZXJhdGlvbnM6IG1lbW9yeQotCWFsbG9jYXRpb24gYW5kIGZyZWVpbmcsIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYXBlcnR1cmUgbWFuYWdlbWVudAotCWF0IGNvbW1hbmQgZXhlY3V0aW9uIHRpbWUuICBCdWZmZXIgb2JqZWN0IGFsbG9jYXRpb24gaXMgcmVsYXRpdmVseQorCU9uIGEgZnVuZGFtZW50YWwgbGV2ZWwsIEdFTSBpbnZvbHZlcyBzZXZlcmFsIG9wZXJhdGlvbnM6CisJPGl0ZW1pemVkbGlzdD4KKwkgIDxsaXN0aXRlbT5NZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZzwvbGlzdGl0ZW0+CisJICA8bGlzdGl0ZW0+Q29tbWFuZCBleGVjdXRpb248L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPkFwZXJ0dXJlIG1hbmFnZW1lbnQgYXQgY29tbWFuZCBleGVjdXRpb24gdGltZTwvbGlzdGl0ZW0+CisJPC9pdGVtaXplZGxpc3Q+CisJQnVmZmVyIG9iamVjdCBhbGxvY2F0aW9uIGlzIHJlbGF0aXZlbHkKIAlzdHJhaWdodGZvcndhcmQgYW5kIGxhcmdlbHkgcHJvdmlkZWQgYnkgTGludXgncyBzaG1lbSBsYXllciwgd2hpY2gKIAlwcm92aWRlcyBtZW1vcnkgdG8gYmFjayBlYWNoIG9iamVjdC4gIFdoZW4gbWFwcGVkIGludG8gdGhlIEdUVAogCW9yIHVzZWQgaW4gYSBjb21tYW5kIGJ1ZmZlciwgdGhlIGJhY2tpbmcgcGFnZXMgZm9yIGFuIG9iamVjdCBhcmUKIAlmbHVzaGVkIHRvIG1lbW9yeSBhbmQgbWFya2VkIHdyaXRlIGNvbWJpbmVkIHNvIGFzIHRvIGJlIGNvaGVyZW50Ci0Jd2l0aCB0aGUgR1BVLiAgTGlrZXdpc2UsIHdoZW4gdGhlIEdQVSBmaW5pc2hlcyByZW5kZXJpbmcgdG8gYW4gb2JqZWN0LAotCWlmIHRoZSBDUFUgYWNjZXNzZXMgaXQsIGl0IG11c3QgYmUgbWFkZSBjb2hlcmVudCB3aXRoIHRoZSBDUFUncyB2aWV3CisJd2l0aCB0aGUgR1BVLiAgTGlrZXdpc2UsIGlmIHRoZSBDUFUgYWNjZXNzZXMgYW4gb2JqZWN0IGFmdGVyIHRoZSBHUFUKKwloYXMgZmluaXNoZWQgcmVuZGVyaW5nIHRvIHRoZSBvYmplY3QsIHRoZW4gdGhlIG9iamVjdCBtdXN0IGJlIG1hZGUKKwljb2hlcmVudCB3aXRoIHRoZSBDUFUncyB2aWV3CiAJb2YgbWVtb3J5LCB1c3VhbGx5IGludm9sdmluZyBHUFUgY2FjaGUgZmx1c2hpbmcgb2YgdmFyaW91cyBraW5kcy4KLQlUaGlzIGNvcmUgQ1BVJmx0Oy0mZ3Q7R1BVIGNvaGVyZW5jeSBtYW5hZ2VtZW50IGlzIHByb3ZpZGVkIGJ5IHRoZSBHRU0KLQlzZXQgZG9tYWluIGZ1bmN0aW9uLCB3aGljaCBldmFsdWF0ZXMgYW4gb2JqZWN0J3MgY3VycmVudCBkb21haW4gYW5kCisJVGhpcyBjb3JlIENQVSZsdDstJmd0O0dQVSBjb2hlcmVuY3kgbWFuYWdlbWVudCBpcyBwcm92aWRlZCBieSBhCisJZGV2aWNlLXNwZWNpZmljIGlvY3RsLCB3aGljaCBldmFsdWF0ZXMgYW4gb2JqZWN0J3MgY3VycmVudCBkb21haW4gYW5kCiAJcGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBmbHVzaGluZyBvciBzeW5jaHJvbml6YXRpb24gdG8gcHV0IHRoZSBvYmplY3QKIAlpbnRvIHRoZSBkZXNpcmVkIGNvaGVyZW5jeSBkb21haW4gKG5vdGUgdGhhdCB0aGUgb2JqZWN0IG1heSBiZSBidXN5LAotCWkuZS4gYW4gYWN0aXZlIHJlbmRlciB0YXJnZXQ7IGluIHRoYXQgY2FzZSB0aGUgc2V0IGRvbWFpbiBmdW5jdGlvbgotCXdpbGwgYmxvY2sgdGhlIGNsaWVudCBhbmQgd2FpdCBmb3IgcmVuZGVyaW5nIHRvIGNvbXBsZXRlIGJlZm9yZQorCWkuZS4gYW4gYWN0aXZlIHJlbmRlciB0YXJnZXQ7IGluIHRoYXQgY2FzZSwgc2V0dGluZyB0aGUgZG9tYWluCisJYmxvY2tzIHRoZSBjbGllbnQgYW5kIHdhaXRzIGZvciByZW5kZXJpbmcgdG8gY29tcGxldGUgYmVmb3JlCiAJcGVyZm9ybWluZyBhbnkgbmVjZXNzYXJ5IGZsdXNoaW5nIG9wZXJhdGlvbnMpLgogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+CiAJUGVyaGFwcyB0aGUgbW9zdCBpbXBvcnRhbnQgR0VNIGZ1bmN0aW9uIGlzIHByb3ZpZGluZyBhIGNvbW1hbmQKIAlleGVjdXRpb24gaW50ZXJmYWNlIHRvIGNsaWVudHMuICBDbGllbnQgcHJvZ3JhbXMgY29uc3RydWN0IGNvbW1hbmQKLQlidWZmZXJzIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkgb2JqZWN0cwotCWFuZCBzdWJtaXQgdGhlbSB0byBHRU0uICBBdCB0aGF0IHBvaW50LCBHRU0gd2lsbCB0YWtlIGNhcmUgdG8gYmluZAorCWJ1ZmZlcnMgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeSBvYmplY3RzLAorCWFuZCB0aGVuIHN1Ym1pdCB0aGVtIHRvIEdFTS4gIEF0IHRoYXQgcG9pbnQsIEdFTSB0YWtlcyBjYXJlIHRvIGJpbmQKIAlhbGwgdGhlIG9iamVjdHMgaW50byB0aGUgR1RULCBleGVjdXRlIHRoZSBidWZmZXIsIGFuZCBwcm92aWRlCiAJbmVjZXNzYXJ5IHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGNsaWVudHMgYWNjZXNzaW5nIHRoZSBzYW1lIGJ1ZmZlcnMuCiAJVGhpcyBvZnRlbiBpbnZvbHZlcyBldmljdGluZyBzb21lIG9iamVjdHMgZnJvbSB0aGUgR1RUIGFuZCByZS1iaW5kaW5nCiAJb3RoZXJzIChhIGZhaXJseSBleHBlbnNpdmUgb3BlcmF0aW9uKSwgYW5kIHByb3ZpZGluZyByZWxvY2F0aW9uCiAJc3VwcG9ydCB3aGljaCBoaWRlcyBmaXhlZCBHVFQgb2Zmc2V0cyBmcm9tIGNsaWVudHMuICBDbGllbnRzIG11c3QKIAl0YWtlIGNhcmUgbm90IHRvIHN1Ym1pdCBjb21tYW5kIGJ1ZmZlcnMgdGhhdCByZWZlcmVuY2UgbW9yZSBvYmplY3RzCi0JdGhhbiBjYW4gZml0IGluIHRoZSBHVFQgb3IgR0VNIHdpbGwgcmVqZWN0IHRoZW0gYW5kIG5vIHJlbmRlcmluZworCXRoYW4gY2FuIGZpdCBpbiB0aGUgR1RUOyBvdGhlcndpc2UsIEdFTSB3aWxsIHJlamVjdCB0aGVtIGFuZCBubyByZW5kZXJpbmcKIAl3aWxsIG9jY3VyLiAgU2ltaWxhcmx5LCBpZiBzZXZlcmFsIG9iamVjdHMgaW4gdGhlIGJ1ZmZlciByZXF1aXJlCiAJZmVuY2UgcmVnaXN0ZXJzIHRvIGJlIGFsbG9jYXRlZCBmb3IgY29ycmVjdCByZW5kZXJpbmcgKGUuZy4gMkQgYmxpdHMKIAlvbiBwcmUtOTY1IGNoaXBzKSwgY2FyZSBtdXN0IGJlIHRha2VuIG5vdCB0byByZXF1aXJlIG1vcmUgZmVuY2UKQEAgLTcyOSw3ICs3NTksNyBAQAogICAgIDx0aXRsZT5PdXRwdXQgbWFuYWdlbWVudDwvdGl0bGU+CiAgICAgPHBhcmE+CiAgICAgICBBdCB0aGUgY29yZSBvZiB0aGUgRFJNIG91dHB1dCBtYW5hZ2VtZW50IGNvZGUgaXMgYSBzZXQgb2YKLSAgICAgIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIENSVENzLCBlbmNvZGVycyBhbmQgY29ubmVjdG9ycy4KKyAgICAgIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIENSVENzLCBlbmNvZGVycywgYW5kIGNvbm5lY3RvcnMuCiAgICAgPC9wYXJhPgogICAgIDxwYXJhPgogICAgICAgQSBDUlRDIGlzIGFuIGFic3RyYWN0aW9uIHJlcHJlc2VudGluZyBhIHBhcnQgb2YgdGhlIGNoaXAgdGhhdApAQCAtNzY1LDIxICs3OTUsMTkgQEAKICAgPHNlY3QxPgogICAgIDx0aXRsZT5GcmFtZWJ1ZmZlciBtYW5hZ2VtZW50PC90aXRsZT4KICAgICA8cGFyYT4KLSAgICAgIEluIG9yZGVyIHRvIHNldCBhIG1vZGUgb24gYSBnaXZlbiBDUlRDLCBlbmNvZGVyIGFuZCBjb25uZWN0b3IKLSAgICAgIGNvbmZpZ3VyYXRpb24sIGNsaWVudHMgbmVlZCB0byBwcm92aWRlIGEgZnJhbWVidWZmZXIgb2JqZWN0IHdoaWNoCi0gICAgICB3aWxsIHByb3ZpZGUgYSBzb3VyY2Ugb2YgcGl4ZWxzIGZvciB0aGUgQ1JUQyB0byBkZWxpdmVyIHRvIHRoZSBlbmNvZGVyKHMpCi0gICAgICBhbmQgdWx0aW1hdGVseSB0aGUgY29ubmVjdG9yKHMpIGluIHRoZSBjb25maWd1cmF0aW9uLiAgQSBmcmFtZWJ1ZmZlcgotICAgICAgaXMgZnVuZGFtZW50YWxseSBhIGRyaXZlciBzcGVjaWZpYyBtZW1vcnkgb2JqZWN0LCBtYWRlIGludG8gYW4gb3BhcXVlCi0gICAgICBoYW5kbGUgYnkgdGhlIERSTSBhZGRmYiBmdW5jdGlvbi4gIE9uY2UgYW4gZmIgaGFzIGJlZW4gY3JlYXRlZCB0aGlzCi0gICAgICB3YXkgaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgS01TIG1vZGUgc2V0dGluZyByb3V0aW5lcyBmb3IgdXNlIGluCi0gICAgICBhIGNvbmZpZ3VyYXRpb24uCisgICAgICBDbGllbnRzIG5lZWQgdG8gcHJvdmlkZSBhIGZyYW1lYnVmZmVyIG9iamVjdCB3aGljaCBwcm92aWRlcyBhIHNvdXJjZQorICAgICAgb2YgcGl4ZWxzIGZvciBhIENSVEMgdG8gZGVsaXZlciB0byB0aGUgZW5jb2RlcihzKSBhbmQgdWx0aW1hdGVseSB0aGUKKyAgICAgIGNvbm5lY3RvcihzKS4gQSBmcmFtZWJ1ZmZlciBpcyBmdW5kYW1lbnRhbGx5IGEgZHJpdmVyLXNwZWNpZmljIG1lbW9yeQorICAgICAgb2JqZWN0LCBtYWRlIGludG8gYW4gb3BhcXVlIGhhbmRsZSBieSB0aGUgRFJNJ3MgYWRkZmIoKSBmdW5jdGlvbi4KKyAgICAgIE9uY2UgYSBmcmFtZWJ1ZmZlciBoYXMgYmVlbiBjcmVhdGVkIHRoaXMgd2F5LCBpdCBtYXkgYmUgcGFzc2VkIHRvIHRoZQorICAgICAgS01TIG1vZGUgc2V0dGluZyByb3V0aW5lcyBmb3IgdXNlIGluIGEgY29tcGxldGVkIGNvbmZpZ3VyYXRpb24uCiAgICAgPC9wYXJhPgogICA8L3NlY3QxPgogCiAgIDxzZWN0MT4KICAgICA8dGl0bGU+Q29tbWFuZCBzdWJtaXNzaW9uICZhbXA7IGZlbmNpbmc8L3RpdGxlPgogICAgIDxwYXJhPgotICAgICAgVGhpcyBzaG91bGQgY292ZXIgYSBmZXcgZGV2aWNlIHNwZWNpZmljIGNvbW1hbmQgc3VibWlzc2lvbgorICAgICAgVGhpcyBzaG91bGQgY292ZXIgYSBmZXcgZGV2aWNlLXNwZWNpZmljIGNvbW1hbmQgc3VibWlzc2lvbgogICAgICAgaW1wbGVtZW50YXRpb25zLgogICAgIDwvcGFyYT4KICAgPC9zZWN0MT4KQEAgLTc4OSw3ICs4MTcsNyBAQAogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIHByb3ZpZGVzIHNvbWUgc3VzcGVuZC9yZXN1bWUgY29kZSwgYnV0IGRyaXZlcnMKICAgICAgIHdhbnRpbmcgZnVsbCBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0IHNob3VsZCBwcm92aWRlIHNhdmUoKSBhbmQKLSAgICAgIHJlc3RvcmUoKSBmdW5jdGlvbnMuICBUaGVzZSB3aWxsIGJlIGNhbGxlZCBhdCBzdXNwZW5kLAorICAgICAgcmVzdG9yZSgpIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBjYWxsZWQgYXQgc3VzcGVuZCwKICAgICAgIGhpYmVybmF0ZSwgb3IgcmVzdW1lIHRpbWUsIGFuZCBzaG91bGQgcGVyZm9ybSBhbnkgc3RhdGUgc2F2ZSBvcgogICAgICAgcmVzdG9yZSByZXF1aXJlZCBieSB5b3VyIGRldmljZSBhY3Jvc3Mgc3VzcGVuZCBvciBoaWJlcm5hdGUKICAgICAgIHN0YXRlcy4KQEAgLTgxMiw4ICs4NDAsOCBAQAogICAgIDxwYXJhPgogICAgICAgVGhlIERSTSBjb3JlIGV4cG9ydHMgc2V2ZXJhbCBpbnRlcmZhY2VzIHRvIGFwcGxpY2F0aW9ucywKICAgICAgIGdlbmVyYWxseSBpbnRlbmRlZCB0byBiZSB1c2VkIHRocm91Z2ggY29ycmVzcG9uZGluZyBsaWJkcm0KLSAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSW4gYWRkaXRpb24sIGRyaXZlcnMgZXhwb3J0IGRldmljZSBzcGVjaWZpYwotICAgICAgaW50ZXJmYWNlcyBmb3IgdXNlIGJ5IHVzZXJzcGFjZSBkcml2ZXJzICZhbXA7IGRldmljZSBhd2FyZQorICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJbiBhZGRpdGlvbiwgZHJpdmVycyBleHBvcnQgZGV2aWNlLXNwZWNpZmljCisgICAgICBpbnRlcmZhY2VzIGZvciB1c2UgYnkgdXNlcnNwYWNlIGRyaXZlcnMgJmFtcDsgZGV2aWNlLWF3YXJlCiAgICAgICBhcHBsaWNhdGlvbnMgdGhyb3VnaCBpb2N0bHMgYW5kIHN5c2ZzIGZpbGVzLgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KQEAgLTgyMiw4ICs4NTAsOCBAQAogICAgICAgbWFuYWdlbWVudCwgbWVtb3J5IG1hbmFnZW1lbnQsIGFuZCBvdXRwdXQgbWFuYWdlbWVudC4KICAgICA8L3BhcmE+CiAgICAgPHBhcmE+Ci0gICAgICBDb3ZlciBnZW5lcmljIGlvY3RscyBhbmQgc3lzZnMgbGF5b3V0IGhlcmUuICBPbmx5IG5lZWQgaGlnaAotICAgICAgbGV2ZWwgaW5mbywgc2luY2UgbWFuIHBhZ2VzIHdpbGwgY292ZXIgdGhlIHJlc3QuCisgICAgICBDb3ZlciBnZW5lcmljIGlvY3RscyBhbmQgc3lzZnMgbGF5b3V0IGhlcmUuICBXZSBvbmx5IG5lZWQgaGlnaC1sZXZlbAorICAgICAgaW5mbywgc2luY2UgbWFuIHBhZ2VzIHNob3VsZCBjb3ZlciB0aGUgcmVzdC4KICAgICA8L3BhcmE+CiAgIDwvY2hhcHRlcj4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbAppbmRleCAyMDdlMWE1Li4zYmM4YTYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbApAQCAtMzUyLDYgKzM1Miw3IEBACiAJU1lTX0NNTUIsCiAJU1lTX0RBQiwKIAlTWVNfRFZCVDIsCisJU1lTX1RVUkJPLAogfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAJCTwvc2VjdGlvbj4KQEAgLTgwOSw2ICs4MTAsOCBAQAogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CiAJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CiAJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRPTkUiPjxjb25zdGFudD5EVFZfVE9ORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQk8L2l0ZW1pemVkbGlzdD4KIAkJPHBhcmE+RnV0dXJlIGltcGxlbWVudGF0aW9ucyBtaWdodCBhZGQgdGhvc2UgdHdvIG1pc3NpbmcgcGFyYW1ldGVyczo8L3BhcmE+CiAJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CkBAIC04MTgsMjUgKzgyMSwxOCBAQAogCTwvc2VjdGlvbj4KIAk8c2VjdGlvbiBpZD0iZHZiczItcGFyYW1zIj4KIAkJPHRpdGxlPkRWQi1TMiBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgotCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItUzI6PC9wYXJhPgorCQk8cGFyYT5JbiBhZGRpdGlvbiB0byBhbGwgcGFyYW1ldGVycyB2YWxpZCBmb3IgRFZCLVMsIERWQi1TMiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6PC9wYXJhPgogCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1WT0xUQUdFIj48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KLQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVE9ORSI+PGNvbnN0YW50PkRUVl9UT05FPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1QSUxPVCI+PGNvbnN0YW50PkRUVl9QSUxPVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ST0xMT0ZGIj48Y29uc3RhbnQ+RFRWX1JPTExPRkY8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KIAkJPC9pdGVtaXplZGxpc3Q+Ci0JCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0idHVyYm8tcGFyYW1zIj4KKwkJPHRpdGxlPlR1cmJvIGNvZGUgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+SW4gYWRkaXRpb24gdG8gYWxsIHBhcmFtZXRlcnMgdmFsaWQgZm9yIERWQi1TLCB0dXJibyBjb2RlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3BhcmE+CiAJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+Ci0JCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURJU0VRQy1NQVNURVIiPjxjb25zdGFudD5EVFZfRElTRVFDX01BU1RFUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgotCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtU0xBVkUtUkVQTFkiPjxjb25zdGFudD5EVFZfRElTRVFDX1NMQVZFX1JFUExZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgogCQk8L2l0ZW1pemVkbGlzdD4KIAk8L3NlY3Rpb24+CiAJPHNlY3Rpb24gaWQ9ImlzZGJzLXBhcmFtcyI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCmluZGV4IGM3NWRjN2MuLjE3MDA2NGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCkBAIC0yMDUsNyArMjA1LDcgQEAKIGFkZGl0aW9uYWwgaW5jbHVkZSBmaWxlIDxlbXBoYXNpcwogcm9sZT0idHQiPmxpbnV4L2R2Yi92ZXJzaW9uLmg8L2VtcGhhc2lzPiBleGlzdHMsIHdoaWNoIGRlZmluZXMgdGhlCiBjb25zdGFudCA8ZW1waGFzaXMgcm9sZT0idHQiPkRWQl9BUElfVkVSU0lPTjwvZW1waGFzaXM+LiBUaGlzIGRvY3VtZW50Ci1kZXNjcmliZXMgPGVtcGhhc2lzIHJvbGU9InR0Ij5EVkJfQVBJX1ZFUlNJT04mI3gwMEEwOzM8L2VtcGhhc2lzPi4KK2Rlc2NyaWJlcyA8ZW1waGFzaXMgcm9sZT0idHQiPkRWQl9BUElfVkVSU0lPTiA1LjQ8L2VtcGhhc2lzPi4KIDwvcGFyYT4KIAogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCmluZGV4IGNlMTAwNGEuLmI2ODY5OGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbXBhdC54bWwKQEAgLTIzNzAsNiArMjM3MCwxNCBAQAogICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgPC9vcmRlcmVkbGlzdD4KICAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24+CisgICAgICA8dGl0bGU+VjRMMiBpbiBMaW51eCAzLjI8L3RpdGxlPgorICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+CisJICA8cGFyYT5WNEwyX0NUUkxfRkxBR19WT0xBVElMRSB3YXMgYWRkZWQgdG8gc2lnbmFsIHZvbGF0aWxlIGNvbnRyb2xzIHRvIHVzZXJzcGFjZS48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L29yZGVyZWRsaXN0PgorICAgIDwvc2VjdGlvbj4KIAogICAgIDxzZWN0aW9uIGlkPSJvdGhlciI+CiAgICAgICA8dGl0bGU+UmVsYXRpb24gb2YgVjRMMiB0byBvdGhlciBMaW51eCBtdWx0aW1lZGlhIEFQSXM8L3RpdGxlPgpAQCAtMjQ3OCw2ICsyNDg2LDkgQEAKICAgICAgICAgPGxpc3RpdGVtPgogCSAgPHBhcmE+Rmxhc2ggQVBJLiA8eHJlZiBsaW5rZW5kPSJmbGFzaC1jb250cm9scyIgLz48L3BhcmE+CiAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKwkgIDxwYXJhPiZWSURJT0MtQ1JFQVRFLUJVRlM7IGFuZCAmVklESU9DLVBSRVBBUkUtQlVGOyBpb2N0bHMuPC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgPC9pdGVtaXplZGxpc3Q+CiAgICAgPC9zZWN0aW9uPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbnRyb2xzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCmluZGV4IDIzZmRmNzkuLjNiYzVlZTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCkBAIC0yMzIsOCArMjMyLDkgQEAKIAkgICAgPGVudHJ5PkVuYWJsZXMgYSBwb3dlciBsaW5lIGZyZXF1ZW5jeSBmaWx0ZXIgdG8gYXZvaWQKIGZsaWNrZXIuIFBvc3NpYmxlIHZhbHVlcyBmb3IgPGNvbnN0YW50PmVudW0gdjRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeTwvY29uc3RhbnQ+IGFyZToKIDxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRDwvY29uc3RhbnQ+ICgwKSwKLTxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaPC9jb25zdGFudD4gKDEpIGFuZAotPGNvbnN0YW50PlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFo8L2NvbnN0YW50PiAoMikuPC9lbnRyeT4KKzxjb25zdGFudD5WNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaPC9jb25zdGFudD4gKDEpLAorPGNvbnN0YW50PlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFo8L2NvbnN0YW50PiAoMikgYW5kCis8Y29uc3RhbnQ+VjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTzwvY29uc3RhbnQ+ICgzKS48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ0lEX0hVRV9BVVRPPC9jb25zdGFudD48L2VudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXN1YmRldi54bWwKaW5kZXggMDVjOGZlZi4uMDkxNmE3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1zdWJkZXYueG1sCkBAIC0yNjYsNyArMjY2LDcgQEAKIAogICAgICAgPHBhcmE+V2hlbiBzYXRpc2ZpZWQgd2l0aCB0aGUgdHJ5IHJlc3VsdHMsIGFwcGxpY2F0aW9ucyBjYW4gc2V0IHRoZSBhY3RpdmUKICAgICAgIGZvcm1hdHMgYnkgc2V0dGluZyB0aGUgPHN0cnVjdGZpZWxkPndoaWNoPC9zdHJ1Y3RmaWVsZD4gYXJndW1lbnQgdG8KLSAgICAgIDxjb25zdGFudD5WNEwyX1NVQkRFVl9GT1JNQVRfVFJZPC9jb25zdGFudD4uIEFjdGl2ZSBmb3JtYXRzIGFyZSBjaGFuZ2VkCisgICAgICA8Y29uc3RhbnQ+VjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTwvY29uc3RhbnQ+LiBBY3RpdmUgZm9ybWF0cyBhcmUgY2hhbmdlZAogICAgICAgZXhhY3RseSBhcyB0cnkgZm9ybWF0cyBieSBkcml2ZXJzLiBUbyBhdm9pZCBtb2RpZnlpbmcgdGhlIGhhcmR3YXJlIHN0YXRlCiAgICAgICBkdXJpbmcgZm9ybWF0IG5lZ290aWF0aW9uLCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5lZ290aWF0ZSB0cnkgZm9ybWF0cyBmaXJzdAogICAgICAgYW5kIHRoZW4gbW9kaWZ5IHRoZSBhY3RpdmUgc2V0dGluZ3MgdXNpbmcgdGhlIHRyeSBmb3JtYXRzIHJldHVybmVkIGR1cmluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9pby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbAppbmRleCBjNTdkMWVjLi4zZjQ3ZGYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbApAQCAtOTI3LDYgKzkyNywzMyBAQAogQXBwbGljYXRpb25zIHNldCBvciBjbGVhciB0aGlzIGZsYWcgYmVmb3JlIGNhbGxpbmcgdGhlCiA8Y29uc3RhbnQ+VklESU9DX1FCVUY8L2NvbnN0YW50PiBpb2N0bC48L2VudHJ5PgogCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfUFJFUEFSRUQ8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDA0MDA8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGJ1ZmZlciBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgSS9PIGFuZCBjYW4gYmUgcXVldWVkIGJ5IHRoZQorYXBwbGljYXRpb24uIERyaXZlcnMgc2V0IG9yIGNsZWFyIHRoaXMgZmxhZyB3aGVuIHRoZQorPGxpbmsgbGlua2VuZD0idmlkaW9jLXF1ZXJ5YnVmIj5WSURJT0NfUVVFUllCVUY8L2xpbms+LCA8bGluaworCSAgbGlua2VuZD0idmlkaW9jLXFidWYiPlZJRElPQ19QUkVQQVJFX0JVRjwvbGluaz4sIDxsaW5rCisJICBsaW5rZW5kPSJ2aWRpb2MtcWJ1ZiI+VklESU9DX1FCVUY8L2xpbms+IG9yIDxsaW5rCisJICBsaW5rZW5kPSJ2aWRpb2MtcWJ1ZiI+VklESU9DX0RRQlVGPC9saW5rPiBpb2N0bCBpcyBjYWxsZWQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0lOVkFMSURBVEU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDA0MDA8L2VudHJ5PgorCSAgICA8ZW50cnk+Q2FjaGVzIGRvIG5vdCBoYXZlIHRvIGJlIGludmFsaWRhdGVkIGZvciB0aGlzIGJ1ZmZlci4KK1R5cGljYWxseSBhcHBsaWNhdGlvbnMgc2hhbGwgdXNlIHRoaXMgZmxhZyBpZiB0aGUgZGF0YSBjYXB0dXJlZCBpbiB0aGUgYnVmZmVyCitpcyBub3QgZ29pbmcgdG8gYmUgdG91Y2hlZCBieSB0aGUgQ1BVLCBpbnN0ZWFkIHRoZSBidWZmZXIgd2lsbCwgcHJvYmFibHksIGJlCitwYXNzZWQgb24gdG8gYSBETUEtY2FwYWJsZSBoYXJkd2FyZSB1bml0IGZvciBmdXJ0aGVyIHByb2Nlc3Npbmcgb3Igb3V0cHV0LgorPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0NMRUFOPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwODAwPC9lbnRyeT4KKwkgICAgPGVudHJ5PkNhY2hlcyBkbyBub3QgaGF2ZSB0byBiZSBjbGVhbmVkIGZvciB0aGlzIGJ1ZmZlci4KK1R5cGljYWxseSBhcHBsaWNhdGlvbnMgc2hhbGwgdXNlIHRoaXMgZmxhZyBmb3Igb3V0cHV0IGJ1ZmZlcnMgaWYgdGhlIGRhdGEKK2luIHRoaXMgYnVmZmVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIGJ5IHRoZSBDUFUgYnV0IGJ5IHNvbWUgRE1BLWNhcGFibGUgdW5pdCwKK2luIHdoaWNoIGNhc2UgY2FjaGVzIGhhdmUgbm90IGJlZW4gdXNlZC48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbAppbmRleCAwZDA1ZTg3Li4yYWIzNjVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdjRsMi54bWwKQEAgLTEyOCw2ICsxMjgsMTMgQEAKIGFwcGxpY2F0aW9ucy4gLS0+CiAKICAgICAgIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjMuMjwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMTEtMDgtMjY8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPmh2PC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkFkZGVkIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFLjwvcmV2cmVtYXJrPgorICAgICAgPC9yZXZpc2lvbj4KKworICAgICAgPHJldmlzaW9uPgogCTxyZXZudW1iZXI+My4xPC9yZXZudW1iZXI+CiAJPGRhdGU+MjAxMS0wNi0yNzwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+bWNjLCBwbywgaHY8L2F1dGhvcmluaXRpYWxzPgpAQCAtNDEwLDcgKzQxNyw3IEBACiA8L3BhcnRpbmZvPgogCiA8dGl0bGU+VmlkZW8gZm9yIExpbnV4IFR3byBBUEkgU3BlY2lmaWNhdGlvbjwvdGl0bGU+Ci0gPHN1YnRpdGxlPlJldmlzaW9uIDMuMTwvc3VidGl0bGU+CisgPHN1YnRpdGxlPlJldmlzaW9uIDMuMjwvc3VidGl0bGU+CiAKICAgPGNoYXB0ZXIgaWQ9ImNvbW1vbiI+CiAgICAgJnN1Yi1jb21tb247CkBAIC00NjIsNiArNDY5LDcgQEAKICAgICAmc3ViLWNsb3NlOwogICAgICZzdWItaW9jdGw7CiAgICAgPCEtLSBBbGwgaW9jdGxzIGdvIGhlcmUuIC0tPgorICAgICZzdWItY3JlYXRlLWJ1ZnM7CiAgICAgJnN1Yi1jcm9wY2FwOwogICAgICZzdWItZGJnLWctY2hpcC1pZGVudDsKICAgICAmc3ViLWRiZy1nLXJlZ2lzdGVyOwpAQCAtNTA0LDYgKzUxMiw3IEBACiAgICAgJnN1Yi1xdWVyeWN0cmw7CiAgICAgJnN1Yi1xdWVyeS1kdi1wcmVzZXQ7CiAgICAgJnN1Yi1xdWVyeXN0ZDsKKyAgICAmc3ViLXByZXBhcmUtYnVmOwogICAgICZzdWItcmVxYnVmczsKICAgICAmc3ViLXMtaHctZnJlcS1zZWVrOwogICAgICZzdWItc3RyZWFtb247CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1jcmVhdGUtYnVmcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1jcmVhdGUtYnVmcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhZThhNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyZWF0ZS1idWZzLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPHJlZmVudHJ5IGlkPSJ2aWRpb2MtY3JlYXRlLWJ1ZnMiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfQ1JFQVRFX0JVRlM8L3JlZmVudHJ5dGl0bGU+CisgICAgJm1hbnZvbDsKKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPlZJRElPQ19DUkVBVEVfQlVGUzwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5DcmVhdGUgYnVmZmVycyBmb3IgTWVtb3J5IE1hcHBlZCBvciBVc2VyIFBvaW50ZXIgSS9PPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3Byb3RvdHlwZT4KKwk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+CisJPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJPHBhcmFtZGVmPnN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5WSURJT0NfQ1JFQVRFX0JVRlM8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+PC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPlRoaXMgaW9jdGwgaXMgdXNlZCB0byBjcmVhdGUgYnVmZmVycyBmb3IgPGxpbmsgbGlua2VuZD0ibW1hcCI+bWVtb3J5CittYXBwZWQ8L2xpbms+IG9yIDxsaW5rIGxpbmtlbmQ9InVzZXJwIj51c2VyIHBvaW50ZXI8L2xpbms+CitJL08uIEl0IGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIG9yIGluIGFkZGl0aW9uIHRvIHRoZQorPGNvbnN0YW50PlZJRElPQ19SRVFCVUZTPC9jb25zdGFudD4gaW9jdGwsIHdoZW4gYSB0aWdodGVyIGNvbnRyb2wgb3ZlciBidWZmZXJzCitpcyByZXF1aXJlZC4gVGhpcyBpb2N0bCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIGNyZWF0ZSBidWZmZXJzIG9mCitkaWZmZXJlbnQgc2l6ZXMuPC9wYXJhPgorCisgICAgPHBhcmE+VG8gYWxsb2NhdGUgZGV2aWNlIGJ1ZmZlcnMgYXBwbGljYXRpb25zIGluaXRpYWxpemUgcmVsZXZhbnQgZmllbGRzIG9mCit0aGUgPHN0cnVjdG5hbWU+djRsMl9jcmVhdGVfYnVmZmVyczwvc3RydWN0bmFtZT4gc3RydWN0dXJlLiBUaGV5IHNldCB0aGUKKzxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaW4gdGhlCis8c3RydWN0bmFtZT52NGwyX2Zvcm1hdDwvc3RydWN0bmFtZT4gc3RydWN0dXJlLCBlbWJlZGRlZCBpbiB0aGlzCitzdHJ1Y3R1cmUsIHRvIHRoZSByZXNwZWN0aXZlIHN0cmVhbSBvciBidWZmZXIgdHlwZS4KKzxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+IG11c3QgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgYnVmZmVycy4KKzxzdHJ1Y3RmaWVsZD5tZW1vcnk8L3N0cnVjdGZpZWxkPiBzcGVjaWZpZXMgdGhlIHJlcXVpcmVkIEkvTyBtZXRob2QuIFRoZQorPHN0cnVjdGZpZWxkPmZvcm1hdDwvc3RydWN0ZmllbGQ+IGZpZWxkIHNoYWxsIHR5cGljYWxseSBiZSBmaWxsZWQgaW4gdXNpbmcKK2VpdGhlciB0aGUgPGNvbnN0YW50PlZJRElPQ19UUllfRk1UPC9jb25zdGFudD4gb3IKKzxjb25zdGFudD5WSURJT0NfR19GTVQ8L2NvbnN0YW50PiBpb2N0bCgpLiBBZGRpdGlvbmFsbHksIGFwcGxpY2F0aW9ucyBjYW4gYWRqdXN0Cis8c3RydWN0ZmllbGQ+c2l6ZWltYWdlPC9zdHJ1Y3RmaWVsZD4gZmllbGRzIHRvIGZpdCB0aGVpciBzcGVjaWZpYyBuZWVkcy4gVGhlCis8c3RydWN0ZmllbGQ+cmVzZXJ2ZWQ8L3N0cnVjdGZpZWxkPiBhcnJheSBtdXN0IGJlIHplcm9lZC48L3BhcmE+CisKKyAgICA8cGFyYT5XaGVuIHRoZSBpb2N0bCBpcyBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgdGhlIGRyaXZlcgord2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHVwIHRvIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIHN0b3JlIHRoZQorYWN0dWFsIG51bWJlciBhbGxvY2F0ZWQgYW5kIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUKKzxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+IGFuZCB0aGUgPHN0cnVjdGZpZWxkPmluZGV4PC9zdHJ1Y3RmaWVsZD4gZmllbGRzCityZXNwZWN0aXZlbHkuIE9uIHJldHVybiA8c3RydWN0ZmllbGQ+Y291bnQ8L3N0cnVjdGZpZWxkPiBjYW4gYmUgc21hbGxlciB0aGFuCit0aGUgbnVtYmVyIHJlcXVlc3RlZC4gVGhlIGRyaXZlciBtYXkgYWxzbyBpbmNyZWFzZSBidWZmZXIgc2l6ZXMgaWYgcmVxdWlyZWQsCitob3dldmVyLCBpdCB3aWxsIG5vdCB1cGRhdGUgPHN0cnVjdGZpZWxkPnNpemVpbWFnZTwvc3RydWN0ZmllbGQ+IGZpZWxkIHZhbHVlcy4KK1RoZSB1c2VyIGhhcyB0byB1c2UgPGNvbnN0YW50PlZJRElPQ19RVUVSWUJVRjwvY29uc3RhbnQ+IHRvIHJldHJpZXZlIHRoYXQKK2luZm9ybWF0aW9uLjwvcGFyYT4KKworICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0idjRsMi1jcmVhdGUtYnVmZmVycyI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfY3JlYXRlX2J1ZmZlcnM8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5pbmRleDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBzdGFydGluZyBidWZmZXIgaW5kZXgsIHJldHVybmVkIGJ5IHRoZSBkcml2ZXIuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jb3VudDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBudW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgb3IgZ3JhbnRlZC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+JnY0bDItbWVtb3J5OzwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWVtb3J5PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+QXBwbGljYXRpb25zIHNldCB0aGlzIGZpZWxkIHRvCis8Y29uc3RhbnQ+VjRMMl9NRU1PUllfTU1BUDwvY29uc3RhbnQ+IG9yCis8Y29uc3RhbnQ+VjRMMl9NRU1PUllfVVNFUlBUUjwvY29uc3RhbnQ+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT4mdjRsMi1mb3JtYXQ7PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mb3JtYXQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5GaWxsZWQgaW4gYnkgdGhlIGFwcGxpY2F0aW9uLCBwcmVzZXJ2ZWQgYnkgdGhlIGRyaXZlci48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOF08L2VudHJ5PgorCSAgICA8ZW50cnk+QSBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBleHRlbnNpb25zLjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RU5PTUVNPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPk5vIG1lbW9yeSB0byBhbGxvY2F0ZSBidWZmZXJzIGZvciA8bGluayBsaW5rZW5kPSJtbWFwIj5tZW1vcnkKK21hcHBlZDwvbGluaz4gSS9PLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlRoZSBidWZmZXIgdHlwZSAoPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBmaWVsZCkgb3IgdGhlCityZXF1ZXN0ZWQgSS9PIG1ldGhvZCAoPHN0cnVjdGZpZWxkPm1lbW9yeTwvc3RydWN0ZmllbGQ+KSBpcyBub3QKK3N1cHBvcnRlZC48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRxZXZlbnQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKaW5kZXggNzc2OTY0Mi4uZTg3MTRhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKQEAgLTg4LDYgKzg4LDEyIEBACiAJICA8L3Jvdz4KIAkgIDxyb3c+CiAJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+JnY0bDItZXZlbnQtZnJhbWUtc3luYzs8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mcmFtZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PkV2ZW50IGRhdGEgZm9yIGV2ZW50IFY0TDJfRVZFTlRfRlJBTUVfU1lOQy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KIAkgICAgPGVudHJ5Pl9fdTg8L2VudHJ5PgogICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5kYXRhPC9zdHJ1Y3RmaWVsZD5bNjRdPC9lbnRyeT4KIAkgICAgPGVudHJ5PkV2ZW50IGRhdGEuIERlZmluZWQgYnkgdGhlIGV2ZW50IHR5cGUuIFRoZSB1bmlvbgpAQCAtMTM1LDYgKzE0MSwxMjkgQEAKICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CiAKKyAgICA8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9InY0bDItZXZlbnQtdnN5bmMiPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X3ZzeW5jPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSZjcy1zdHI7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3U4PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5maWVsZDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSB1cGNvbWluZyBmaWVsZC4gU2VlICZ2NGwyLWZpZWxkOy48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9InY0bDItZXZlbnQtY3RybCI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfY3RybDwvc3RydWN0bmFtZT48L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSI0Ij4KKwkmY3Mtc3RyOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmNoYW5nZXM8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+QSBiaXRtYXNrIHRoYXQgdGVsbHMgd2hhdCBoYXMgY2hhbmdlZC4gU2VlIDx4cmVmIGxpbmtlbmQ9ImNoYW5nZXMtZmxhZ3MiIC8+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgdHlwZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLWN0cmwtdHlwZTsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PnVuaW9uIChhbm9ueW1vdXMpPC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmFsdWU8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgMzItYml0IHZhbHVlIG9mIHRoZSBjb250cm9sIGZvciAzMi1iaXQgY29udHJvbCB0eXBlcy4KKwkJVGhpcyBpcyAwIGZvciBzdHJpbmcgY29udHJvbHMgc2luY2UgdGhlIHZhbHVlIG9mIGEgc3RyaW5nCisJCWNhbm5vdCBiZSBwYXNzZWQgdXNpbmcgJlZJRElPQy1EUUVWRU5UOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5Pl9fczY0PC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD52YWx1ZTY0PC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIDY0LWJpdCB2YWx1ZSBvZiB0aGUgY29udHJvbCBmb3IgNjQtYml0IGNvbnRyb2wgdHlwZXMuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mbGFnczwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgY29udHJvbCBmbGFncy4gU2VlIDx4cmVmIGxpbmtlbmQ9ImNvbnRyb2wtZmxhZ3MiIC8+LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWluaW11bTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5tYXhpbXVtPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnN0ZXA8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIHN0ZXAgdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZGVmYXVsdF92YWx1ZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgZGVmYXVsdCB2YWx1ZSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LWZyYW1lLXN5bmMiPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X2ZyYW1lX3N5bmM8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5mcmFtZV9zZXF1ZW5jZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PgorCSAgICAgIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZyYW1lIGJlaW5nIHJlY2VpdmVkLgorCSAgICA8L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImNoYW5nZXMtZmxhZ3MiPgorICAgICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3MtZGVmOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjB4MDAwMTwvZW50cnk+CisJICAgIDxlbnRyeT5UaGlzIGNvbnRyb2wgZXZlbnQgd2FzIHRyaWdnZXJlZCBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbAorCQljaGFuZ2VkLiBTcGVjaWFsIGNhc2U6IGlmIGEgYnV0dG9uIGNvbnRyb2wgaXMgcHJlc3NlZCwgdGhlbiB0aGlzCisJCWV2ZW50IGlzIHNlbnQgYXMgd2VsbCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm90IGV4cGxpY2l0IHZhbHVlCisJCWFzc29jaWF0ZWQgd2l0aCBhIGJ1dHRvbiBjb250cm9sLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDAyPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIGNvbnRyb2wgZmxhZ3MKKwkJY2hhbmdlZC48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CiAgIDwvcmVmc2VjdDE+CiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcHJlcGFyZS1idWYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcHJlcGFyZS1idWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGU2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1wcmVwYXJlLWJ1Zi54bWwKQEAgLTAsMCArMSw4OCBAQAorPHJlZmVudHJ5IGlkPSJ2aWRpb2MtcHJlcGFyZS1idWYiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfUFJFUEFSRV9CVUY8L3JlZmVudHJ5dGl0bGU+CisgICAgJm1hbnZvbDsKKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPlZJRElPQ19QUkVQQVJFX0JVRjwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5QcmVwYXJlIGEgYnVmZmVyIGZvciBJL088L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisgICAgPGZ1bmNzeW5vcHNpcz4KKyAgICAgIDxmdW5jcHJvdG90eXBlPgorCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+c3RydWN0IHY0bDJfYnVmZmVyICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5WSURJT0NfUFJFUEFSRV9CVUY8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+PC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPkFwcGxpY2F0aW9ucyBjYW4gb3B0aW9uYWxseSBjYWxsIHRoZQorPGNvbnN0YW50PlZJRElPQ19QUkVQQVJFX0JVRjwvY29uc3RhbnQ+IGlvY3RsIHRvIHBhc3Mgb3duZXJzaGlwIG9mIHRoZSBidWZmZXIKK3RvIHRoZSBkcml2ZXIgYmVmb3JlIGFjdHVhbGx5IGVucXVldWluZyBpdCwgdXNpbmcgdGhlCis8Y29uc3RhbnQ+VklESU9DX1FCVUY8L2NvbnN0YW50PiBpb2N0bCwgYW5kIHRvIHByZXBhcmUgaXQgZm9yIGZ1dHVyZSBJL08uCitTdWNoIHByZXBhcmF0aW9ucyBtYXkgaW5jbHVkZSBjYWNoZSBpbnZhbGlkYXRpb24gb3IgY2xlYW5pbmcuIFBlcmZvcm1pbmcgdGhlbQoraW4gYWR2YW5jZSBzYXZlcyB0aW1lIGR1cmluZyB0aGUgYWN0dWFsIEkvTy4gSW4gY2FzZSBzdWNoIGNhY2hlIG9wZXJhdGlvbnMgYXJlCitub3QgcmVxdWlyZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIG9uZSBvZgorPGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfSU5WQUxJREFURTwvY29uc3RhbnQ+IGFuZAorPGNvbnN0YW50PlY0TDJfQlVGX0ZMQUdfTk9fQ0FDSEVfQ0xFQU48L2NvbnN0YW50PiBmbGFncyB0byBza2lwIHRoZSByZXNwZWN0aXZlCitzdGVwLjwvcGFyYT4KKworICAgIDxwYXJhPlRoZSA8c3RydWN0bmFtZT52NGwyX2J1ZmZlcjwvc3RydWN0bmFtZT4gc3RydWN0dXJlIGlzCitzcGVjaWZpZWQgaW4gPHhyZWYgbGlua2VuZD0iYnVmZmVyIiAvPi48L3BhcmE+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgICZyZXR1cm4tdmFsdWU7CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPkZpbGUgSS9PIGlzIGluIHByb2dyZXNzLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlRoZSBidWZmZXIgPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBpcyBub3QKK3N1cHBvcnRlZCwgb3IgdGhlIDxzdHJ1Y3RmaWVsZD5pbmRleDwvc3RydWN0ZmllbGQ+IGlzIG91dCBvZiBib3VuZHMsCitvciBubyBidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgeWV0LCBvciB0aGUKKzxzdHJ1Y3RmaWVsZD51c2VycHRyPC9zdHJ1Y3RmaWVsZD4gb3IKKzxzdHJ1Y3RmaWVsZD5sZW5ndGg8L3N0cnVjdGZpZWxkPiBhcmUgaW52YWxpZC48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCmluZGV4IDY3N2VhNjQuLjBhYzAwNTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnhtbApAQCAtNDA2LDYgKzQwNiwxNSBAQAogd3JpdGluZyBhIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byBjYXJyeSBvdXQgYSBnaXZlbiBhY3Rpb24KICgmZWc7IG1vdG9yIGNvbnRyb2wpIGJ1dCBubyBtZWFuaW5nZnVsIHZhbHVlIGNhbiBiZSByZXR1cm5lZC48L2VudHJ5PgogCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDgwPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBpcyB2b2xhdGlsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wKK2NoYW5nZXMgY29udGludW91c2x5LiBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSB0aGUgY3VycmVudCBnYWluIHZhbHVlIGlmIHRoZSBkZXZpY2UKK2lzIGluIGF1dG8tZ2FpbiBtb2RlLiBJbiBzdWNoIGEgY2FzZSB0aGUgaGFyZHdhcmUgY2FsY3VsYXRlcyB0aGUgZ2FpbiB2YWx1ZSBiYXNlZCBvbgordGhlIGxpZ2h0aW5nIGNvbmRpdGlvbnMgd2hpY2ggY2FuIGNoYW5nZSBvdmVyIHRpbWUuIE5vdGUgdGhhdCBzZXR0aW5nIGEgbmV3IHZhbHVlIGZvcgorYSB2b2xhdGlsZSBjb250cm9sIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBuZXcgdmFsdWUgd2lsbCBqdXN0IGJlIGlnbm9yZWQuPC9lbnRyeT4KKwkgIDwvcm93PgogCTwvdGJvZHk+CiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwKaW5kZXggNjljMGQ4YS4uNWM3MGI2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sCkBAIC0xMzksNiArMTM5LDIyIEBACiAJICAgIDwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9GUkFNRV9TWU5DPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+NDwvZW50cnk+CisJICAgIDxlbnRyeT4KKwkgICAgICA8cGFyYT5UcmlnZ2VyZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgcmVjZXB0aW9uIG9mIGEKKwkgICAgICBmcmFtZSBoYXMgYmVndW4uIFRoaXMgZXZlbnQgaGFzIGEKKwkgICAgICAmdjRsMi1ldmVudC1mcmFtZS1zeW5jOyBhc3NvY2lhdGVkIHdpdGggaXQuPC9wYXJhPgorCisJICAgICAgPHBhcmE+SWYgdGhlIGhhcmR3YXJlIG5lZWRzIHRvIGJlIHN0b3BwZWQgaW4gdGhlIGNhc2Ugb2YgYQorCSAgICAgIGJ1ZmZlciB1bmRlcnJ1biBpdCBtaWdodCBub3QgYmUgYWJsZSB0byBnZW5lcmF0ZSB0aGlzIGV2ZW50LgorCSAgICAgIEluIHN1Y2ggY2FzZXMgdGhlIDxzdHJ1Y3RmaWVsZD5mcmFtZV9zZXF1ZW5jZTwvc3RydWN0ZmllbGQ+CisJICAgICAgZmllbGQgaW4gJnY0bDItZXZlbnQtZnJhbWUtc3luYzsgd2lsbCBub3QgYmUgaW5jcmVtZW50ZWQuIFRoaXMKKwkgICAgICBjYXVzZXMgdHdvIGNvbnNlY3V0aXZlIGZyYW1lIHNlcXVlbmNlIG51bWJlcnMgdG8gaGF2ZSBuIHRpbWVzCisJICAgICAgZnJhbWUgaW50ZXJ2YWwgaW4gYmV0d2VlbiB0aGVtLjwvcGFyYT4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQ8L2NvbnN0YW50PjwvZW50cnk+CiAJICAgIDxlbnRyeT4weDA4MDAwMDAwPC9lbnRyeT4KIAkgICAgPGVudHJ5PkJhc2UgZXZlbnQgbnVtYmVyIGZvciBkcml2ZXItcHJpdmF0ZSBldmVudHMuPC9lbnRyeT4KQEAgLTE4MywxMTMgKzE5OSw2IEBACiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgogCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXZzeW5jIj4KLSAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9ldmVudF92c3luYzwvc3RydWN0bmFtZT48L3RpdGxlPgotICAgICAgPHRncm91cCBjb2xzPSIzIj4KLQkmY3Mtc3RyOwotCTx0Ym9keSB2YWxpZ249InRvcCI+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191ODwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmllbGQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGUgdXBjb21pbmcgZmllbGQuIFNlZSAmdjRsMi1maWVsZDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCTwvdGJvZHk+Ci0gICAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LWN0cmwiPgotICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X2N0cmw8L3N0cnVjdG5hbWU+PC90aXRsZT4KLSAgICAgIDx0Z3JvdXAgY29scz0iNCI+Ci0JJmNzLXN0cjsKLQk8dGJvZHkgdmFsaWduPSJ0b3AiPgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KLQkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jaGFuZ2VzPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PkEgYml0bWFzayB0aGF0IHRlbGxzIHdoYXQgaGFzIGNoYW5nZWQuIFNlZSA8eHJlZiBsaW5rZW5kPSJjaGFuZ2VzLWZsYWdzIiAvPi48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIHR5cGUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1jdHJsLXR5cGU7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT51bmlvbiAoYW5vbnltb3VzKTwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnZhbHVlPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIDMyLWJpdCB2YWx1ZSBvZiB0aGUgY29udHJvbCBmb3IgMzItYml0IGNvbnRyb2wgdHlwZXMuCi0JCVRoaXMgaXMgMCBmb3Igc3RyaW5nIGNvbnRyb2xzIHNpbmNlIHRoZSB2YWx1ZSBvZiBhIHN0cmluZwotCQljYW5ub3QgYmUgcGFzc2VkIHVzaW5nICZWSURJT0MtRFFFVkVOVDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICAgIDxlbnRyeT5fX3M2NDwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmFsdWU2NDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoZSA2NC1iaXQgdmFsdWUgb2YgdGhlIGNvbnRyb2wgZm9yIDY0LWJpdCBjb250cm9sIHR5cGVzLjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmxhZ3M8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIGNvbnRyb2wgZmxhZ3MuIFNlZSA8eHJlZiBsaW5rZW5kPSJjb250cm9sLWZsYWdzIiAvPi48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPm1pbmltdW08L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWF4aW11bTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KLQkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5zdGVwPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+PC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoZSBzdGVwIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmRlZmF1bHRfdmFsdWU8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIGRlZmF1bHQgdmFsdWUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLQotICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0iY2hhbmdlcy1mbGFncyI+Ci0gICAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+Ci0gICAgICA8dGdyb3VwIGNvbHM9IjMiPgotCSZjcy1kZWY7Ci0JPHRib2R5IHZhbGlnbj0idG9wIj4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFPC9jb25zdGFudD48L2VudHJ5PgotCSAgICA8ZW50cnk+MHgwMDAxPC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sCi0JCWNoYW5nZWQuIFNwZWNpYWwgY2FzZTogaWYgYSBidXR0b24gY29udHJvbCBpcyBwcmVzc2VkLCB0aGVuIHRoaXMKLQkJZXZlbnQgaXMgc2VudCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGVyZSBpcyBub3QgZXhwbGljaXQgdmFsdWUKLQkJYXNzb2NpYXRlZCB3aXRoIGEgYnV0dG9uIGNvbnRyb2wuPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1M8L2NvbnN0YW50PjwvZW50cnk+Ci0JICAgIDxlbnRyeT4weDAwMDI8L2VudHJ5PgotCSAgICA8ZW50cnk+VGhpcyBjb250cm9sIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBmbGFncwotCQljaGFuZ2VkLjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KICAgPC9yZWZzZWN0MT4KICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbAppbmRleCAxNzkxMGUyLi4wYzY3NGJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwKQEAgLTU3Miw3ICs1NzIsNyBAQAogCQkJPC9wYXJhPgogCQkJPHBhcmE+CiAJCQkJVGhlIHNpbXBsZXN0IHdheSB0byBhY3RpdmF0ZSB0aGUgRkxBU0ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlIHN1cHBvcnQgCi0JCQkJaXMgdG8gc2V0IHRoZSBvcHRpb24gTkFORF9VU0VfRkxBU0hfQkJUIGluIHRoZSBvcHRpb24gZmllbGQgb2YKKwkJCQlpcyB0byBzZXQgdGhlIG9wdGlvbiBOQU5EX0JCVF9VU0VfRkxBU0ggaW4gdGhlIGJidF9vcHRpb24gZmllbGQgb2YKIAkJCQl0aGUgbmFuZCBjaGlwIHN0cnVjdHVyZSBiZWZvcmUgY2FsbGluZyBuYW5kX3NjYW4oKS4gRm9yIEFHLUFORAogCQkJCWNoaXBzIGlzIHRoaXMgZG9uZSBieSBkZWZhdWx0LgogCQkJCVRoaXMgYWN0aXZhdGVzIHRoZSBkZWZhdWx0IEZMQVNIIGJhc2VkIGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbmFsaXR5IApAQCAtNzczLDIwICs3NzMsNiBAQAogCQkJCWRvbmUgYWNjb3JkaW5nIHRvIHRoZSBkZWZhdWx0IGJ1aWx0aW4gc2NoZW1lLgogCQkJPC9wYXJhPgogCQk8L3NlY3QyPgotCQk8c2VjdDIgaWQ9IlVzZXJfc3BhY2VfcGxhY2VtZW50X3NlbGVjdGlvbiI+Ci0JCQk8dGl0bGU+VXNlciBzcGFjZSBwbGFjZW1lbnQgc2VsZWN0aW9uPC90aXRsZT4KLQkJPHBhcmE+Ci0JCQlBbGwgbm9uIGVjYyBmdW5jdGlvbnMgbGlrZSBtdGQtPnJlYWQgYW5kIG10ZC0+d3JpdGUgdXNlIGFuIGludGVybmFsIAotCQkJc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGFuIGlvY3RsLiBUaGlzIHN0cnVjdHVyZSBpcyBwcmVzZXQgCi0JCQl0byB0aGUgYXV0b3BsYWNlbWVudCBkZWZhdWx0LgotCSAgICAgCQk8cHJvZ3JhbWxpc3Rpbmc+Ci0JaW9jdGwgKGZkLCBNRU1TRVRPT0JTRUwsIG9vYnNlbCk7Ci0JICAgICAJCTwvcHJvZ3JhbWxpc3Rpbmc+Ci0JCQlvb2JzZWwgaXMgYSBwb2ludGVyIHRvIGEgdXNlciBzdXBwbGllZCBzdHJ1Y3R1cmUgb2YgdHlwZQotCQkJbmFuZF9vb2Jjb25maWcuIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBtdXN0IG1hdGNoIHRoZSAKLQkJCWNyaXRlcmlhIG9mIHRoZSBmaWxlc3lzdGVtLCB3aGljaCB3aWxsIGJlIHVzZWQuIFNlZSBhbiBleGFtcGxlIGluIHV0aWxzL25hbmR3cml0ZS5jLgotCQk8L3BhcmE+Ci0JCTwvc2VjdDI+CiAJPC9zZWN0MT4JCiAJPHNlY3QxIGlkPSJTcGFyZV9hcmVhX2F1dG9wbGFjZW1lbnRfZGVmYXVsdCI+CiAJCTx0aXRsZT5TcGFyZSBhcmVhIGF1dG9wbGFjZW1lbnQgZGVmYXVsdCBzY2hlbWVzPC90aXRsZT4KQEAgLTExNTgsOSArMTE0NCw2IEBACiAJCVRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiBuYW5kLmguIFRoZXkgYXJlIG9yZWQgdG9nZXRoZXIgdG8gZGVzY3JpYmUKIAkJdGhlIGZ1bmN0aW9uYWxpdHkuCiAgICAgIAkJPHByb2dyYW1saXN0aW5nPgotLyogVXNlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlLiBUaGlzIG9wdGlvbiBpcyBwYXJzZWQgYnkgdGhlCi0gKiBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbiAobmFuZF9kZWZhdWx0X2JidCkuICovCi0jZGVmaW5lIE5BTkRfVVNFX0ZMQVNIX0JCVAkweDAwMDEwMDAwCiAvKiBUaGUgaHcgZWNjIGdlbmVyYXRvciBwcm92aWRlcyBhIHN5bmRyb21lIGluc3RlYWQgYSBlY2MgdmFsdWUgb24gcmVhZCAKICAqIFRoaXMgY2FuIG9ubHkgd29yayBpZiB3ZSBoYXZlIHRoZSBlY2MgYnl0ZXMgZGlyZWN0bHkgYmVoaW5kIHRoZSAKICAqIGRhdGEgYnl0ZXMuIEFwcGxpZXMgZm9yIERPQyBhbmQgQUctQU5EIFJlbmVzYXMgSFcgUmVlZCBTb2xvbW9uIGdlbmVyYXRvcnMgKi8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCmluZGV4IDU5OGMyMmYuLjVkZTIzYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbApAQCAtNDI4OCw3ICs0Mjg4LDcgQEAKIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwogICBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19NUFU0MDEsIHBvcnQsIGluZm9fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgaXJxLCBpcnFfZmxhZ3MsICZybWlkaSk7CisgICAgICAgICAgICAgICAgICAgICAgaXJxLCAmcm1pZGkpOwogXV0+CiAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KICAgICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CkBAIC00MzQzLDYgKzQzNDMsMTMgQEAKIAlieSBpdHNlbGYgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbSBpbiB0aGUgaXJxIGhhbmRsZXIuCiAJPC9wYXJhPgogCisJPHBhcmE+CisJSWYgdGhlIE1QVS00MDEgaW50ZXJmYWNlIHNoYXJlcyBpdHMgaW50ZXJydXB0IHdpdGggdGhlIG90aGVyIGxvZ2ljYWwKKwlkZXZpY2VzIG9uIHRoZSBjYXJkLCBzZXQgPGNvbnN0YW50Pk1QVTQwMV9JTkZPX0lSUV9IT09LPC9jb25zdGFudD4KKwkoc2VlIDxsaW5rIGxpbmtlbmQ9Im1pZGktaW50ZXJmYWNlLWludGVycnVwdC1oYW5kbGVyIj48Y2l0ZXRpdGxlPgorCWJlbG93PC9jaXRldGl0bGU+PC9saW5rPikuCisJPC9wYXJhPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgVXN1YWxseSwgdGhlIHBvcnQgYWRkcmVzcyBjb3JyZXNwb25kcyB0byB0aGUgY29tbWFuZCBwb3J0IGFuZAogICAgICAgICBwb3J0ICsgMSBjb3JyZXNwb25kcyB0byB0aGUgZGF0YSBwb3J0LiBJZiBub3QsIHlvdSBtYXkgY2hhbmdlCkBAIC00Mzc1LDE0ICs0MzgyLDEyIEBACiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgNnRoIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgaXJxIG51bWJlciBmb3IgVUFSVC4gSWYgdGhlIGlycQotICAgICAgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIHBhc3MgMCB0byB0aGUgN3RoIGFyZ3VtZW50Ci0gICAgICAoPHBhcmFtZXRlcj5pcnFfZmxhZ3M8L3BhcmFtZXRlcj4pLiBPdGhlcndpc2UsIHBhc3MgdGhlIGZsYWdzCi0gICAgICBmb3IgaXJxIGFsbG9jYXRpb24gCi0gICAgICAoPGNvbnN0YW50PlNBX1hYWDwvY29uc3RhbnQ+IGJpdHMpIHRvIGl0LCBhbmQgdGhlIGlycSB3aWxsIGJlCi0gICAgICByZXNlcnZlZCBieSB0aGUgbXB1NDAxLXVhcnQgbGF5ZXIuIElmIHRoZSBjYXJkIGRvZXNuJ3QgZ2VuZXJhdGUKLSAgICAgIFVBUlQgaW50ZXJydXB0cywgcGFzcyAtMSBhcyB0aGUgaXJxIG51bWJlci4gVGhlbiBhIHRpbWVyCi0gICAgICBpbnRlcnJ1cHQgd2lsbCBiZSBpbnZva2VkIGZvciBwb2xsaW5nLiAKKwlUaGUgNnRoIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgSVNBIGlycSBudW1iZXIgdGhhdCB3aWxsIGJlCisJYWxsb2NhdGVkLiAgSWYgbm8gaW50ZXJydXB0IGlzIHRvIGJlIGFsbG9jYXRlZCAoYmVjYXVzZSB5b3VyCisJY29kZSBpcyBhbHJlYWR5IGFsbG9jYXRpbmcgYSBzaGFyZWQgaW50ZXJydXB0LCBvciBiZWNhdXNlIHRoZQorCWRldmljZSBkb2VzIG5vdCB1c2UgaW50ZXJydXB0cyksIHBhc3MgLTEgaW5zdGVhZC4KKwlGb3IgYSBNUFUtNDAxIGRldmljZSB3aXRob3V0IGFuIGludGVycnVwdCwgYSBwb2xsaW5nIHRpbWVyCisJd2lsbCBiZSB1c2VkIGluc3RlYWQuCiAgICAgICA8L3BhcmE+CiAgICAgPC9zZWN0aW9uPgogCkBAIC00MzkwLDEyICs0Mzk1LDEzIEBACiAgICAgICA8dGl0bGU+SW50ZXJydXB0IEhhbmRsZXI8L3RpdGxlPgogICAgICAgPHBhcmE+CiAgICAgICAgIFdoZW4gdGhlIGludGVycnVwdCBpcyBhbGxvY2F0ZWQgaW4KLSAgICAgIDxmdW5jdGlvbj5zbmRfbXB1NDAxX3VhcnRfbmV3KCk8L2Z1bmN0aW9uPiwgdGhlIHByaXZhdGUKLSAgICAgIGludGVycnVwdCBoYW5kbGVyIGlzIHVzZWQsIGhlbmNlIHlvdSBkb24ndCBoYXZlIGFueXRoaW5nIGVsc2UgdG8gZG8KLSAgICAgIHRoYW4gY3JlYXRpbmcgdGhlIG1wdTQwMSBzdHVmZi4gT3RoZXJ3aXNlLCB5b3UgaGF2ZSB0byBjYWxsCi0gICAgICA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X2ludGVycnVwdCgpPC9mdW5jdGlvbj4gZXhwbGljaXRseSB3aGVuCi0gICAgICBhIFVBUlQgaW50ZXJydXB0IGlzIGludm9rZWQgYW5kIGNoZWNrZWQgaW4geW91ciBvd24gaW50ZXJydXB0Ci0gICAgICBoYW5kbGVyLiAgCisgICAgICA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X25ldygpPC9mdW5jdGlvbj4sIGFuIGV4Y2x1c2l2ZSBJU0EKKyAgICAgIGludGVycnVwdCBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgdXNlZCwgaGVuY2UgeW91IGRvbid0IGhhdmUKKyAgICAgIGFueXRoaW5nIGVsc2UgdG8gZG8gdGhhbiBjcmVhdGluZyB0aGUgbXB1NDAxIHN0dWZmLiAgT3RoZXJ3aXNlLCB5b3UKKyAgICAgIGhhdmUgdG8gc2V0IDxjb25zdGFudD5NUFU0MDFfSU5GT19JUlFfSE9PSzwvY29uc3RhbnQ+LCBhbmQgY2FsbAorICAgICAgPGZ1bmN0aW9uPnNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoKTwvZnVuY3Rpb24+IGV4cGxpY2l0bHkgZnJvbSB5b3VyCisgICAgICBvd24gaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBpdCBoYXMgZGV0ZXJtaW5lZCB0aGF0IGEgVUFSVCBpbnRlcnJ1cHQKKyAgICAgIGhhcyBvY2N1cnJlZC4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N3aXRjaGluZy1zY2hlZC50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL3N3aXRjaGluZy1zY2hlZC50eHQKaW5kZXggNzFjZmJkYy4uM2IyNjEyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9zd2l0Y2hpbmctc2NoZWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYmxvY2svc3dpdGNoaW5nLXNjaGVkLnR4dApAQCAtMSw2ICsxLDYgQEAKIFRvIGNob29zZSBJTyBzY2hlZHVsZXJzIGF0IGJvb3QgdGltZSwgdXNlIHRoZSBhcmd1bWVudCAnZWxldmF0b3I9ZGVhZGxpbmUnLgotJ25vb3AnLCAnYXMnIGFuZCAnY2ZxJyAodGhlIGRlZmF1bHQpIGFyZSBhbHNvIGF2YWlsYWJsZS4gSU8gc2NoZWR1bGVycyBhcmUKLWFzc2lnbmVkIGdsb2JhbGx5IGF0IGJvb3QgdGltZSBvbmx5IHByZXNlbnRseS4KKydub29wJyBhbmQgJ2NmcScgKHRoZSBkZWZhdWx0KSBhcmUgYWxzbyBhdmFpbGFibGUuIElPIHNjaGVkdWxlcnMgYXJlIGFzc2lnbmVkCitnbG9iYWxseSBhdCBib290IHRpbWUgb25seSBwcmVzZW50bHkuCiAKIEVhY2ggaW8gcXVldWUgaGFzIGEgc2V0IG9mIGlvIHNjaGVkdWxlciB0dW5hYmxlcyBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZXNlCiB0dW5hYmxlcyBjb250cm9sIGhvdyB0aGUgaW8gc2NoZWR1bGVyIHdvcmtzLiBZb3UgY2FuIGZpbmQgdGhlc2UgZW50cmllcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi9jY2lzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dAppbmRleCBjMDBjNmE1Li43MTQ2NGUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L2NjaXNzLnR4dApAQCAtNzgsNiArNzgsMTYgQEAKIC9kZXYvY2Npc3MvYzFkMXAyCQlDb250cm9sbGVyIDEsIGRpc2sgMSwgcGFydGl0aW9uIDIKIC9kZXYvY2Npc3MvYzFkMXAzCQlDb250cm9sbGVyIDEsIGRpc2sgMSwgcGFydGl0aW9uIDMKIAorQ0NJU1Mgc2ltcGxlIG1vZGUgc3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgImNjaXNzX3NpbXBsZV9tb2RlPTEiIGJvb3QgcGFyYW1ldGVyIG1heSBiZSB1c2VkIHRvIHByZXZlbnQgdGhlIGRyaXZlcgorZnJvbSBwdXR0aW5nIHRoZSBjb250cm9sbGVyIGludG8gInBlcmZvcm1hbnQiIG1vZGUuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKK3dpdGggc2ltcGxlIG1vZGUsIGVhY2ggY29tbWFuZCBjb21wbGV0aW9uIHJlcXVpcmVzIGFuIGludGVycnVwdCwgd2hpbGUgd2l0aAorInBlcmZvcm1hbnQgbW9kZSIgKHRoZSBkZWZhdWx0LCBhbmQgb3JkaW5hcmlseSBiZXR0ZXIgcGVyZm9ybWluZykgaXQgaXMKK3Bvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY29tbWFuZCBjb21wbGV0aW9ucyBpbmRpY2F0ZWQgYnkgYSBzaW5nbGUKK2ludGVycnVwdC4KKwogU0NTSSB0YXBlIGRyaXZlIGFuZCBtZWRpdW0gY2hhbmdlciBzdXBwb3J0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CmluZGV4IGNkNjdlOTAuLjljNDUyZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKQEAgLTQ1NCw4ICs0NTQsOCBAQAogbW92ZSBpdCBpbnRvIGEgbmV3IGNncm91cCAocG9zc2libHkgdGhlIHJvb3QgY2dyb3VwKSBieSB3cml0aW5nIHRvIHRoZQogbmV3IGNncm91cCdzIHRhc2tzIGZpbGUuCiAKLU5vdGU6IElmIHRoZSBucyBjZ3JvdXAgaXMgYWN0aXZlLCBtb3ZpbmcgYSBwcm9jZXNzIHRvIGFub3RoZXIgY2dyb3VwIGNhbgotZmFpbC4KK05vdGU6IER1ZSB0byBzb21lIHJlc3RyaWN0aW9ucyBlbmZvcmNlZCBieSBzb21lIGNncm91cCBzdWJzeXN0ZW1zLCBtb3ZpbmcKK2EgcHJvY2VzcyB0byBhbm90aGVyIGNncm91cCBjYW4gZmFpbC4KIAogMi4zIE1vdW50aW5nIGhpZXJhcmNoaWVzIGJ5IG5hbWUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2ZyZWV6ZXItc3Vic3lzdGVtLnR4dAppbmRleCBjMjFkNzc3Li43ZTYyZGUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvZnJlZXplci1zdWJzeXN0ZW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9mcmVlemVyLXN1YnN5c3RlbS50eHQKQEAgLTMzLDkgKzMzLDkgQEAKIAogCUZyb20gYSBzZWNvbmQsIHVucmVsYXRlZCBiYXNoIHNoZWxsOgogCSQga2lsbCAtU0lHU1RPUCAxNjY5MAotCSQga2lsbCAtU0lHQ09OVCAxNjk5MAorCSQga2lsbCAtU0lHQ09OVCAxNjY5MAogCi0JPGF0IHRoaXMgcG9pbnQgMTY5OTAgZXhpdHMgYW5kIGNhdXNlcyAxNjY0NCB0byBleGl0IHRvbz4KKwk8YXQgdGhpcyBwb2ludCAxNjY5MCBleGl0cyBhbmQgY2F1c2VzIDE2NjQ0IHRvIGV4aXQgdG9vPgogCiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBiYXNoIGNhbiBvYnNlcnZlIGJvdGggc2lnbmFscyBhbmQgY2hvb3NlIGhvdyBpdAogcmVzcG9uZHMgdG8gdGhlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKaW5kZXggMDZlYjZkOS4uY2MwZWJjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbW9yeS50eHQKQEAgLTQxOCw3ICs0MTgsNiBAQAogCiAjIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBzdGF0cyBhcmUgZGVwZW5kZW50IG9uIENPTkZJR19ERUJVR19WTS4KIAotaW5hY3RpdmVfcmF0aW8JCS0gVk0gaW50ZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3BhZ2VfYWxsb2MuYykKIHJlY2VudF9yb3RhdGVkX2Fub24JLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCiByZWNlbnRfcm90YXRlZF9maWxlCS0gVk0gaW50ZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3Ztc2Nhbi5jKQogcmVjZW50X3NjYW5uZWRfYW5vbgktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1sb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKaW5kZXggOTk0ZGQ3NS4uYzE1NWFjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWxvZy50eHQKQEAgLTQ4LDcgKzQ4LDcgQEAKIGNvbW11bmljYXRpb24uCiAKIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHVzZXJzcGFjZSBsb2cgaW1wbGVtZW50YXRpb25zIHRoYXQgbGV2ZXJhZ2UgdGhpcwotZnJhbWV3b3JrIC0gImNsdXN0ZXJlZF9kaXNrIiBhbmQgImNsdXN0ZXJlZF9jb3JlIi4gIFRoZXNlIGltcGxlbWVudGF0aW9ucworZnJhbWV3b3JrIC0gImNsdXN0ZXJlZC1kaXNrIiBhbmQgImNsdXN0ZXJlZC1jb3JlIi4gIFRoZXNlIGltcGxlbWVudGF0aW9ucwogcHJvdmlkZSBhIGNsdXN0ZXItY29oZXJlbnQgbG9nIGZvciBzaGFyZWQtc3RvcmFnZS4gIERldmljZS1tYXBwZXIgbWlycm9yaW5nCiBjYW4gYmUgdXNlZCBpbiBhIHNoYXJlZC1zdG9yYWdlIGVudmlyb25tZW50IHdoZW4gdGhlIGNsdXN0ZXIgbG9nIGltcGxlbWVudGF0aW9ucwogYXJlIGVtcGxveWVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3BlcnNpc3RlbnQtZGF0YS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvcGVyc2lzdGVudC1kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTVkZjliCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3BlcnNpc3RlbnQtZGF0YS50eHQKQEAgLTAsMCArMSw4NCBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhlIG1vcmUtc29waGlzdGljYXRlZCBkZXZpY2UtbWFwcGVyIHRhcmdldHMgcmVxdWlyZSBjb21wbGV4IG1ldGFkYXRhCit0aGF0IGlzIG1hbmFnZWQgaW4ga2VybmVsLiAgSW4gbGF0ZSAyMDEwIHdlIHdlcmUgc2VlaW5nIHRoYXQgdmFyaW91cworZGlmZmVyZW50IHRhcmdldHMgd2VyZSByb2xsaW5nIHRoZWlyIG93biBkYXRhIHN0cnV0dXJlcywgZm9yIGV4YW1wbGU6CisKKy0gTWlrdWxhcyBQYXRvY2thJ3MgbXVsdGlzbmFwIGltcGxlbWVudGF0aW9uCistIEhlaW56IE1hdWVsc2hhZ2VuJ3MgdGhpbiBwcm92aXNpb25pbmcgdGFyZ2V0CistIEFub3RoZXIgYnRyZWUtYmFzZWQgY2FjaGluZyB0YXJnZXQgcG9zdGVkIHRvIGRtLWRldmVsCistIEFub3RoZXIgbXVsdGktc25hcHNob3QgdGFyZ2V0IGJhc2VkIG9uIGEgZGVzaWduIG9mIERhbmllbCBQaGlsbGlwcworCitNYWludGFpbmluZyB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgdGFrZXMgYSBsb3Qgb2Ygd29yaywgc28gaWYgcG9zc2libGUKK3dlJ2QgbGlrZSB0byByZWR1Y2UgdGhlIG51bWJlci4KKworVGhlIHBlcnNpc3RlbnQtZGF0YSBsaWJyYXJ5IGlzIGFuIGF0dGVtcHQgdG8gcHJvdmlkZSBhIHJlLXVzYWJsZQorZnJhbWV3b3JrIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gc3RvcmUgbWV0YWRhdGEgaW4gZGV2aWNlLW1hcHBlcgordGFyZ2V0cy4gIEl0J3MgY3VycmVudGx5IHVzZWQgYnkgdGhlIHRoaW4tcHJvdmlzaW9uaW5nIHRhcmdldCBhbmQgYW4KK3VwY29taW5nIGhpZXJhcmNoaWNhbCBzdG9yYWdlIHRhcmdldC4KKworT3ZlcnZpZXcKKz09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gdGhlIGhlYWRlciBmaWxlcyB3aGljaCBjYW4gYWxsIGJlIGZvdW5kCit1bmRlciBkcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS4KKworVGhlIGJsb2NrIG1hbmFnZXIKKy0tLS0tLS0tLS0tLS0tLS0tCisKK2RtLWJsb2NrLW1hbmFnZXIuW2hjXQorCitUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBvbiBkaXNrIGluIGZpeGVkIHNpemVkLWJsb2Nrcy4gIFRoZXJlCitpcyBhIHJlYWQvd3JpdGUgbG9ja2luZyBpbnRlcmZhY2UgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2Vzc2VzLCBhbmQKK2tlZXAgZGF0YSB0aGF0IGlzIGJlaW5nIHVzZWQgaW4gdGhlIGNhY2hlLgorCitDbGllbnRzIG9mIHBlcnNpc3RlbnQtZGF0YSBhcmUgdW5saWtlbHkgdG8gdXNlIHRoaXMgZGlyZWN0bHkuCisKK1RoZSB0cmFuc2FjdGlvbiBtYW5hZ2VyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLltoY10KKworVGhpcyByZXN0cmljdHMgYWNjZXNzIHRvIGJsb2NrcyBhbmQgZW5mb3JjZXMgY29weS1vbi13cml0ZSBzZW1hbnRpY3MuCitUaGUgb25seSB3YXkgeW91IGNhbiBnZXQgaG9sZCBvZiBhIHdyaXRhYmxlIGJsb2NrIHRocm91Z2ggdGhlCit0cmFuc2FjdGlvbiBtYW5hZ2VyIGlzIGJ5IHNoYWRvd2luZyBhbiBleGlzdGluZyBibG9jayAoaWUuIGRvaW5nCitjb3B5LW9uLXdyaXRlKSBvciBhbGxvY2F0aW5nIGEgZnJlc2ggb25lLiAgU2hhZG93aW5nIGlzIGVsaWRlZCB3aXRoaW4KK3RoZSBzYW1lIHRyYW5zYWN0aW9uIHNvIHBlcmZvcm1hbmNlIGlzIHJlYXNvbmFibGUuICBUaGUgY29tbWl0IG1ldGhvZAorZW5zdXJlcyB0aGF0IGFsbCBkYXRhIGlzIGZsdXNoZWQgYmVmb3JlIGl0IHdyaXRlcyB0aGUgc3VwZXJibG9jay4KK09uIHBvd2VyIGZhaWx1cmUgeW91ciBtZXRhZGF0YSB3aWxsIGJlIGFzIGl0IHdhcyB3aGVuIGxhc3QgY29tbWl0dGVkLgorCitUaGUgU3BhY2UgTWFwcworLS0tLS0tLS0tLS0tLS0KKworZG0tc3BhY2UtbWFwLmgKK2RtLXNwYWNlLW1hcC1tZXRhZGF0YS5baGNdCitkbS1zcGFjZS1tYXAtZGlzay5baGNdCisKK09uLWRpc2sgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQga2VlcCB0cmFjayBvZiByZWZlcmVuY2UgY291bnRzIG9mIGJsb2Nrcy4KK0Fsc28gYWN0cyBhcyB0aGUgYWxsb2NhdG9yIG9mIG5ldyBibG9ja3MuICBDdXJyZW50bHkgdHdvCitpbXBsZW1lbnRhdGlvbnM6IGEgc2ltcGxlciBvbmUgZm9yIG1hbmFnaW5nIGJsb2NrcyBvbiBhIGRpZmZlcmVudAorZGV2aWNlIChlZy4gdGhpbmx5LXByb3Zpc2lvbmVkIGRhdGEgYmxvY2tzKTsgYW5kIG9uZSBmb3IgbWFuYWdpbmcKK3RoZSBtZXRhZGF0YSBzcGFjZS4gIFRoZSBsYXR0ZXIgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIG5lZWQgdG8gc3RvcmUKK2l0cyBvd24gZGF0YSB3aXRoaW4gdGhlIHNwYWNlIGl0J3MgbWFuYWdpbmcuCisKK1RoZSBkYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworZG0tYnRyZWUuW2hjXQorZG0tYnRyZWUtcmVtb3ZlLmMKK2RtLWJ0cmVlLXNwaW5lLmMKK2RtLWJ0cmVlLWludGVybmFsLmgKKworQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgb25lIGRhdGEgc3RydWN0dXJlLCBhIGhpZXJhcmNoaWNhbCBidHJlZS4KK1RoZXJlIGFyZSBwbGFucyB0byBhZGQgbW9yZS4gIEZvciBleGFtcGxlLCBzb21ldGhpbmcgd2l0aCBhbgorYXJyYXktbGlrZSBpbnRlcmZhY2Ugd291bGQgc2VlIGEgbG90IG9mIHVzZS4KKworVGhlIGJ0cmVlIGlzICdoaWVyYXJjaGljYWwnIGluIHRoYXQgeW91IGNhbiBkZWZpbmUgaXQgdG8gYmUgY29tcG9zZWQKK29mIG5lc3RlZCBidHJlZXMsIGFuZCB0YWtlIG11bHRpcGxlIGtleXMuICBGb3IgZXhhbXBsZSwgdGhlCit0aGluLXByb3Zpc2lvbmluZyB0YXJnZXQgdXNlcyBhIGJ0cmVlIHdpdGggdHdvIGxldmVscyBvZiBuZXN0aW5nLgorVGhlIGZpcnN0IG1hcHMgYSBkZXZpY2UgaWQgdG8gYSBtYXBwaW5nIHRyZWUsIGFuZCB0aGF0IGluIHR1cm4gbWFwcyBhCit2aXJ0dWFsIGJsb2NrIHRvIGEgcGh5c2ljYWwgYmxvY2suCisKK1ZhbHVlcyBzdG9yZWQgaW4gdGhlIGJ0cmVlcyBjYW4gaGF2ZSBhcmJpdHJhcnkgc2l6ZS4gIEtleXMgYXJlIGFsd2F5cworNjRiaXRzLCBhbHRob3VnaCBuZXN0aW5nIGFsbG93cyB5b3UgdG8gdXNlIG11bHRpcGxlIGtleXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvdGhpbi1wcm92aXNpb25pbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3RoaW4tcHJvdmlzaW9uaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFkOWQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL3RoaW4tcHJvdmlzaW9uaW5nLnR4dApAQCAtMCwwICsxLDI4NSBAQAorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhpcyBkb2N1bWVudCBkZXNjaWJlcyBhIGNvbGxlY3Rpb24gb2YgZGV2aWNlLW1hcHBlciB0YXJnZXRzIHRoYXQKK2JldHdlZW4gdGhlbSBpbXBsZW1lbnQgdGhpbi1wcm92aXNpb25pbmcgYW5kIHNuYXBzaG90cy4KKworVGhlIG1haW4gaGlnaGxpZ2h0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24sIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cworaW1wbGVtZW50YXRpb24gb2Ygc25hcHNob3RzLCBpcyB0aGF0IGl0IGFsbG93cyBtYW55IHZpcnR1YWwgZGV2aWNlcyB0bworYmUgc3RvcmVkIG9uIHRoZSBzYW1lIGRhdGEgdm9sdW1lLiAgVGhpcyBzaW1wbGlmaWVzIGFkbWluaXN0cmF0aW9uIGFuZAorYWxsb3dzIHRoZSBzaGFyaW5nIG9mIGRhdGEgYmV0d2VlbiB2b2x1bWVzLCB0aHVzIHJlZHVjaW5nIGRpc2sgdXNhZ2UuCisKK0Fub3RoZXIgc2lnbmlmaWNhbnQgZmVhdHVyZSBpcyBzdXBwb3J0IGZvciBhbiBhcmJpdHJhcnkgZGVwdGggb2YKK3JlY3Vyc2l2ZSBzbmFwc2hvdHMgKHNuYXBzaG90cyBvZiBzbmFwc2hvdHMgb2Ygc25hcHNob3RzIC4uLikuICBUaGUKK3ByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHNuYXBzaG90cyBkaWQgdGhpcyBieSBjaGFpbmluZyB0b2dldGhlcgorbG9va3VwIHRhYmxlcywgYW5kIHNvIHBlcmZvcm1hbmNlIHdhcyBPKGRlcHRoKS4gIFRoaXMgbmV3CitpbXBsZW1lbnRhdGlvbiB1c2VzIGEgc2luZ2xlIGRhdGEgc3RydWN0dXJlIHRvIGF2b2lkIHRoaXMgZGVncmFkYXRpb24KK3dpdGggZGVwdGguICBGcmFnbWVudGF0aW9uIG1heSBzdGlsbCBiZSBhbiBpc3N1ZSwgaG93ZXZlciwgaW4gc29tZQorc2NlbmFyaW9zLgorCitNZXRhZGF0YSBpcyBzdG9yZWQgb24gYSBzZXBhcmF0ZSBkZXZpY2UgZnJvbSBkYXRhLCBnaXZpbmcgdGhlCithZG1pbmlzdHJhdG9yIHNvbWUgZnJlZWRvbSwgZm9yIGV4YW1wbGUgdG86CisKKy0gSW1wcm92ZSBtZXRhZGF0YSByZXNpbGllbmNlIGJ5IHN0b3JpbmcgbWV0YWRhdGEgb24gYSBtaXJyb3JlZCB2b2x1bWUKKyAgYnV0IGRhdGEgb24gYSBub24tbWlycm9yZWQgb25lLgorCistIEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc3RvcmluZyB0aGUgbWV0YWRhdGEgb24gU1NELgorCitTdGF0dXMKKz09PT09PQorCitUaGVzZSB0YXJnZXRzIGFyZSB2ZXJ5IG11Y2ggc3RpbGwgaW4gdGhlIEVYUEVSSU1FTlRBTCBzdGF0ZS4gIFBsZWFzZQorZG8gbm90IHlldCByZWx5IG9uIHRoZW0gaW4gcHJvZHVjdGlvbi4gIEJ1dCBkbyBleHBlcmltZW50IGFuZCBvZmZlciB1cworZmVlZGJhY2suICBEaWZmZXJlbnQgdXNlIGNhc2VzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UKK2NoYXJhY3RlcmlzdGljcywgZm9yIGV4YW1wbGUgZHVlIHRvIGZyYWdtZW50YXRpb24gb2YgdGhlIGRhdGEgdm9sdW1lLgorCitJZiB5b3UgZmluZCB0aGlzIHNvZnR3YXJlIGlzIG5vdCBwZXJmb3JtaW5nIGFzIGV4cGVjdGVkIHBsZWFzZSBtYWlsCitkbS1kZXZlbEByZWRoYXQuY29tIHdpdGggZGV0YWlscyBhbmQgd2UnbGwgdHJ5IG91ciBiZXN0IHRvIGltcHJvdmUKK3RoaW5ncyBmb3IgeW91LgorCitVc2Vyc3BhY2UgdG9vbHMgZm9yIGNoZWNraW5nIGFuZCByZXBhaXJpbmcgdGhlIG1ldGFkYXRhIGFyZSB1bmRlcgorZGV2ZWxvcG1lbnQuCisKK0Nvb2tib29rCis9PT09PT09PQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgcXVpY2sgcmVjaXBlcyBmb3IgdXNpbmcgdGhpbiBwcm92aXNpb25pbmcuCitUaGV5IHVzZSB0aGUgZG1zZXR1cCBwcm9ncmFtIHRvIGNvbnRyb2wgdGhlIGRldmljZS1tYXBwZXIgZHJpdmVyCitkaXJlY3RseS4gIEVuZCB1c2VycyB3aWxsIGJlIGFkdmlzZWQgdG8gdXNlIGEgaGlnaGVyLWxldmVsIHZvbHVtZQorbWFuYWdlciBzdWNoIGFzIExWTTIgb25jZSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLgorCitQb29sIGRldmljZQorLS0tLS0tLS0tLS0KKworVGhlIHBvb2wgZGV2aWNlIHRpZXMgdG9nZXRoZXIgdGhlIG1ldGFkYXRhIHZvbHVtZSBhbmQgdGhlIGRhdGEgdm9sdW1lLgorSXQgbWFwcyBJL08gbGluZWFybHkgdG8gdGhlIGRhdGEgdm9sdW1lIGFuZCB1cGRhdGVzIHRoZSBtZXRhZGF0YSB2aWEKK3R3byBtZWNoYW5pc21zOgorCistIEZ1bmN0aW9uIGNhbGxzIGZyb20gdGhlIHRoaW4gdGFyZ2V0cworCistIERldmljZS1tYXBwZXIgJ21lc3NhZ2VzJyBmcm9tIHVzZXJzcGFjZSB3aGljaCBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBuZXcKKyAgdmlydHVhbCBkZXZpY2VzIGFtb25nc3Qgb3RoZXIgdGhpbmdzLgorCitTZXR0aW5nIHVwIGEgZnJlc2ggcG9vbCBkZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXR0aW5nIHVwIGEgcG9vbCBkZXZpY2UgcmVxdWlyZXMgYSB2YWxpZCBtZXRhZGF0YSBkZXZpY2UsIGFuZCBhCitkYXRhIGRldmljZS4gIElmIHlvdSBkbyBub3QgaGF2ZSBhbiBleGlzdGluZyBtZXRhZGF0YSBkZXZpY2UgeW91IGNhbgorbWFrZSBvbmUgYnkgemVyb2luZyB0aGUgZmlyc3QgNGsgdG8gaW5kaWNhdGUgZW1wdHkgbWV0YWRhdGEuCisKKyAgICBkZCBpZj0vZGV2L3plcm8gb2Y9JG1ldGFkYXRhX2RldiBicz00MDk2IGNvdW50PTEKKworVGhlIGFtb3VudCBvZiBtZXRhZGF0YSB5b3UgbmVlZCB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIGhvdyBtYW55IGJsb2NrcworYXJlIHNoYXJlZCBiZXR3ZWVuIHRoaW4gZGV2aWNlcyAoaS5lLiB0aHJvdWdoIHNuYXBzaG90cykuICBJZiB5b3UgaGF2ZQorbGVzcyBzaGFyaW5nIHRoYW4gYXZlcmFnZSB5b3UnbGwgbmVlZCBhIGxhcmdlci10aGFuLWF2ZXJhZ2UgbWV0YWRhdGEgZGV2aWNlLgorCitBcyBhIGd1aWRlLCB3ZSBzdWdnZXN0IHlvdSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB0byB1c2UgaW4gdGhlCittZXRhZGF0YSBkZXZpY2UgYXMgNDggKiAkZGF0YV9kZXZfc2l6ZSAvICRkYXRhX2Jsb2NrX3NpemUgYnV0IHJvdW5kIGl0IHVwCit0byAyTUIgaWYgdGhlIGFuc3dlciBpcyBzbWFsbGVyLiAgVGhlIGxhcmdlc3Qgc2l6ZSBzdXBwb3J0ZWQgaXMgMTZHQi4KKworSWYgeW91J3JlIGNyZWF0aW5nIGxhcmdlIG51bWJlcnMgb2Ygc25hcHNob3RzIHdoaWNoIGFyZSByZWNvcmRpbmcgbGFyZ2UKK2Ftb3VudHMgb2YgY2hhbmdlLCB5b3UgbWF5IG5lZWQgZmluZCB5b3UgbmVlZCB0byBpbmNyZWFzZSB0aGlzLgorCitSZWxvYWRpbmcgYSBwb29sIHRhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBtYXkgcmVsb2FkIGEgcG9vbCdzIHRhYmxlLCBpbmRlZWQgdGhpcyBpcyBob3cgdGhlIHBvb2wgaXMgcmVzaXplZAoraWYgaXQgcnVucyBvdXQgb2Ygc3BhY2UuICAoTi5CLiBXaGlsZSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IG1ldGFkYXRhCitkZXZpY2Ugd2hlbiByZWxvYWRpbmcgaXMgbm90IGZvcmJpZGRlbiBhdCB0aGUgbW9tZW50LCB0aGluZ3Mgd2lsbCBnbword3JvbmcgaWYgaXQgZG9lcyBub3Qgcm91dGUgSS9PIHRvIGV4YWN0bHkgdGhlIHNhbWUgb24tZGlzayBsb2NhdGlvbiBhcworcHJldmlvdXNseS4pCisKK1VzaW5nIGFuIGV4aXN0aW5nIHBvb2wgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZG1zZXR1cCBjcmVhdGUgcG9vbCBcCisJLS10YWJsZSAiMCAyMDk3MTUyMCB0aGluLXBvb2wgJG1ldGFkYXRhX2RldiAkZGF0YV9kZXYgXAorCQkgJGRhdGFfYmxvY2tfc2l6ZSAkbG93X3dhdGVyX21hcmsiCisKKyRkYXRhX2Jsb2NrX3NpemUgZ2l2ZXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgZGlzayBzcGFjZSB0aGF0IGNhbiBiZQorYWxsb2NhdGVkIGF0IGEgdGltZSBleHByZXNzZWQgaW4gdW5pdHMgb2YgNTEyLWJ5dGUgc2VjdG9ycy4gIFBlb3BsZQorcHJpbWFyaWx5IGludGVyZXN0ZWQgaW4gdGhpbiBwcm92aXNpb25pbmcgbWF5IHdhbnQgdG8gdXNlIGEgdmFsdWUgc3VjaAorYXMgMTAyNCAoNTEyS0IpLiAgUGVvcGxlIGRvaW5nIGxvdHMgb2Ygc25hcHNob3R0aW5nIG1heSB3YW50IGEgc21hbGxlciB2YWx1ZQorc3VjaCBhcyAxMjggKDY0S0IpLiAgSWYgeW91IGFyZSBub3QgemVyb2luZyBuZXdseS1hbGxvY2F0ZWQgZGF0YSwKK2EgbGFyZ2VyICRkYXRhX2Jsb2NrX3NpemUgaW4gdGhlIHJlZ2lvbiBvZiAyNTYwMDAgKDEyOE1CKSBpcyBzdWdnZXN0ZWQuCiskZGF0YV9ibG9ja19zaXplIG11c3QgYmUgdGhlIHNhbWUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKK21ldGFkYXRhIGRldmljZS4KKworJGxvd193YXRlcl9tYXJrIGlzIGV4cHJlc3NlZCBpbiBibG9ja3Mgb2Ygc2l6ZSAkZGF0YV9ibG9ja19zaXplLiAgSWYKK2ZyZWUgc3BhY2Ugb24gdGhlIGRhdGEgZGV2aWNlIGRyb3BzIGJlbG93IHRoaXMgbGV2ZWwgdGhlbiBhIGRtIGV2ZW50Cit3aWxsIGJlIHRyaWdnZXJlZCB3aGljaCBhIHVzZXJzcGFjZSBkYWVtb24gc2hvdWxkIGNhdGNoIGFsbG93aW5nIGl0IHRvCitleHRlbmQgdGhlIHBvb2wgZGV2aWNlLiAgT25seSBvbmUgc3VjaCBldmVudCB3aWxsIGJlIHNlbnQuCitSZXN1bWluZyBhIGRldmljZSB3aXRoIGEgbmV3IHRhYmxlIGl0c2VsZiB0cmlnZ2VycyBhbiBldmVudCBzbyB0aGUKK3VzZXJzcGFjZSBkYWVtb24gY2FuIHVzZSB0aGlzIHRvIGRldGVjdCBhIHNpdHVhdGlvbiB3aGVyZSBhIG5ldyB0YWJsZQorYWxyZWFkeSBleGNlZWRzIHRoZSB0aHJlc2hvbGQuCisKK1RoaW4gcHJvdmlzaW9uaW5nCistLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDcmVhdGluZyBhIG5ldyB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRvIGNyZWF0ZSBhIG5ldyB0aGlubHktIHByb3Zpc2lvbmVkIHZvbHVtZSB5b3UgbXVzdCBzZW5kIGEgbWVzc2FnZSB0byBhbgorICBhY3RpdmUgcG9vbCBkZXZpY2UsIC9kZXYvbWFwcGVyL3Bvb2wgaW4gdGhpcyBleGFtcGxlLgorCisgICAgZG1zZXR1cCBtZXNzYWdlIC9kZXYvbWFwcGVyL3Bvb2wgMCAiY3JlYXRlX3RoaW4gMCIKKworICBIZXJlICcwJyBpcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICBJdCdzIHVwCisgIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgYW5kIG1hbmFnZSB0aGVzZSBpZGVudGlmaWVycy4gIElmIHRoZQorICBpZGVudGlmaWVyIGlzIGFscmVhZHkgaW4gdXNlLCB0aGUgbWVzc2FnZSB3aWxsIGZhaWwgd2l0aCAtRUVYSVNULgorCitpaSkgVXNpbmcgYSB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lLgorCisgIFRoaW5seS1wcm92aXNpb25lZCB2b2x1bWVzIGFyZSBhY3RpdmF0ZWQgdXNpbmcgdGhlICd0aGluJyB0YXJnZXQ6CisKKyAgICBkbXNldHVwIGNyZWF0ZSB0aGluIC0tdGFibGUgIjAgMjA5NzE1MiB0aGluIC9kZXYvbWFwcGVyL3Bvb2wgMCIKKworICBUaGUgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB0aGlucCBkZXZpY2UuCisKK0ludGVybmFsIHNuYXBzaG90cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK2kpIENyZWF0aW5nIGFuIGludGVybmFsIHNuYXBzaG90LgorCisgIFNuYXBzaG90cyBhcmUgY3JlYXRlZCB3aXRoIGFub3RoZXIgbWVzc2FnZSB0byB0aGUgcG9vbC4KKworICBOLkIuICBJZiB0aGUgb3JpZ2luIGRldmljZSB0aGF0IHlvdSB3aXNoIHRvIHNuYXBzaG90IGlzIGFjdGl2ZSwgeW91CisgIG11c3Qgc3VzcGVuZCBpdCBiZWZvcmUgY3JlYXRpbmcgdGhlIHNuYXBzaG90IHRvIGF2b2lkIGNvcnJ1cHRpb24uCisgIFRoaXMgaXMgTk9UIGVuZm9yY2VkIGF0IHRoZSBtb21lbnQsIHNvIHBsZWFzZSBiZSBjYXJlZnVsIQorCisgICAgZG1zZXR1cCBzdXNwZW5kIC9kZXYvbWFwcGVyL3RoaW4KKyAgICBkbXNldHVwIG1lc3NhZ2UgL2Rldi9tYXBwZXIvcG9vbCAwICJjcmVhdGVfc25hcCAxIDAiCisgICAgZG1zZXR1cCByZXN1bWUgL2Rldi9tYXBwZXIvdGhpbgorCisgIEhlcmUgJzEnIGlzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgdm9sdW1lLCBhIDI0LWJpdCBudW1iZXIuICAnMCcgaXMgdGhlCisgIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW4gZGV2aWNlLgorCitpaSkgVXNpbmcgYW4gaW50ZXJuYWwgc25hcHNob3QuCisKKyAgT25jZSBjcmVhdGVkLCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55IGNvbm5lY3Rpb24KKyAgYmV0d2VlbiB0aGUgb3JpZ2luIGFuZCB0aGUgc25hcHNob3QuICBJbmRlZWQgdGhlIHNuYXBzaG90IGlzIG5vCisgIGRpZmZlcmVudCBmcm9tIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgZGV2aWNlIGFuZCBjYW4gYmUKKyAgc25hcHNob3R0ZWQgaXRzZWxmIHZpYSB0aGUgc2FtZSBtZXRob2QuICBJdCdzIHBlcmZlY3RseSBsZWdhbCB0bworICBoYXZlIG9ubHkgb25lIG9mIHRoZW0gYWN0aXZlLCBhbmQgdGhlcmUncyBubyBvcmRlcmluZyByZXF1aXJlbWVudCBvbgorICBhY3RpdmF0aW5nIG9yIHJlbW92aW5nIHRoZW0gYm90aC4gIChUaGlzIGRpZmZlcnMgZnJvbSBjb252ZW50aW9uYWwKKyAgZGV2aWNlLW1hcHBlciBzbmFwc2hvdHMuKQorCisgIEFjdGl2YXRlIGl0IGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlciB0aGlubHktcHJvdmlzaW9uZWQgdm9sdW1lOgorCisgICAgZG1zZXR1cCBjcmVhdGUgc25hcCAtLXRhYmxlICIwIDIwOTcxNTIgdGhpbiAvZGV2L21hcHBlci9wb29sIDEiCisKK0RlYWN0aXZhdGlvbgorLS0tLS0tLS0tLS0tCisKK0FsbCBkZXZpY2VzIHVzaW5nIGEgcG9vbCBtdXN0IGJlIGRlYWN0aXZhdGVkIGJlZm9yZSB0aGUgcG9vbCBpdHNlbGYKK2NhbiBiZS4KKworICAgIGRtc2V0dXAgcmVtb3ZlIHRoaW4KKyAgICBkbXNldHVwIHJlbW92ZSBzbmFwCisgICAgZG1zZXR1cCByZW1vdmUgcG9vbAorCitSZWZlcmVuY2UKKz09PT09PT09PQorCisndGhpbi1wb29sJyB0YXJnZXQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitpKSBDb25zdHJ1Y3RvcgorCisgICAgdGhpbi1wb29sIDxtZXRhZGF0YSBkZXY+IDxkYXRhIGRldj4gPGRhdGEgYmxvY2sgc2l6ZSAoc2VjdG9ycyk+IFwKKwkgICAgICA8bG93IHdhdGVyIG1hcmsgKGJsb2Nrcyk+IFs8bnVtYmVyIG9mIGZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisKKyAgICBPcHRpb25hbCBmZWF0dXJlIGFyZ3VtZW50czoKKyAgICAtICdza2lwX2Jsb2NrX3plcm9pbmcnOiBza2lwcyB0aGUgemVyb2luZyBvZiBuZXdseS1wcm92aXNpb25lZCBibG9ja3MuCisKKyAgICBEYXRhIGJsb2NrIHNpemUgbXVzdCBiZSBiZXR3ZWVuIDY0S0IgKDEyOCBzZWN0b3JzKSBhbmQgMUdCCisgICAgKDIwOTcxNTIgc2VjdG9ycykgaW5jbHVzaXZlLgorCisKK2lpKSBTdGF0dXMKKworICAgIDx0cmFuc2FjdGlvbiBpZD4gPHVzZWQgbWV0YWRhdGEgYmxvY2tzPi88dG90YWwgbWV0YWRhdGEgYmxvY2tzPgorICAgIDx1c2VkIGRhdGEgYmxvY2tzPi88dG90YWwgZGF0YSBibG9ja3M+IDxoZWxkIG1ldGFkYXRhIHJvb3Q+CisKKworICAgIHRyYW5zYWN0aW9uIGlkOgorCUEgNjQtYml0IG51bWJlciB1c2VkIGJ5IHVzZXJzcGFjZSB0byBoZWxwIHN5bmNocm9uaXNlIHdpdGggbWV0YWRhdGEKKwlmcm9tIHZvbHVtZSBtYW5hZ2Vycy4KKworICAgIHVzZWQgZGF0YSBibG9ja3MgLyB0b3RhbCBkYXRhIGJsb2NrcworCUlmIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZHJvcHMgYmVsb3cgdGhlIHBvb2wncyBsb3cgd2F0ZXIgbWFyayBhCisJZG0gZXZlbnQgd2lsbCBiZSBzZW50IHRvIHVzZXJzcGFjZS4gIFRoaXMgZXZlbnQgaXMgZWRnZS10cmlnZ2VyZWQgYW5kCisJaXQgd2lsbCBvY2N1ciBvbmx5IG9uY2UgYWZ0ZXIgZWFjaCByZXN1bWUgc28gdm9sdW1lIG1hbmFnZXIgd3JpdGVycworCXNob3VsZCByZWdpc3RlciBmb3IgdGhlIGV2ZW50IGFuZCB0aGVuIGNoZWNrIHRoZSB0YXJnZXQncyBzdGF0dXMuCisKKyAgICBoZWxkIG1ldGFkYXRhIHJvb3Q6CisJVGhlIGxvY2F0aW9uLCBpbiBzZWN0b3JzLCBvZiB0aGUgbWV0YWRhdGEgcm9vdCB0aGF0IGhhcyBiZWVuCisJJ2hlbGQnIGZvciB1c2Vyc3BhY2UgcmVhZCBhY2Nlc3MuICAnLScgaW5kaWNhdGVzIHRoZXJlIGlzIG5vCisJaGVsZCByb290LiAgVGhpcyBmZWF0dXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgc28gJy0nIGlzCisJYWx3YXlzIHJldHVybmVkLgorCitpaWkpIE1lc3NhZ2VzCisKKyAgICBjcmVhdGVfdGhpbiA8ZGV2IGlkPgorCisJQ3JlYXRlIGEgbmV3IHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2UuCisJPGRldiBpZD4gaXMgYW4gYXJiaXRyYXJ5IHVuaXF1ZSAyNC1iaXQgaWRlbnRpZmllciBjaG9zZW4gYnkKKwl0aGUgY2FsbGVyLgorCisgICAgY3JlYXRlX3NuYXAgPGRldiBpZD4gPG9yaWdpbiBpZD4KKworCUNyZWF0ZSBhIG5ldyBzbmFwc2hvdCBvZiBhbm90aGVyIHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2UuCisJPGRldiBpZD4gaXMgYW4gYXJiaXRyYXJ5IHVuaXF1ZSAyNC1iaXQgaWRlbnRpZmllciBjaG9zZW4gYnkKKwl0aGUgY2FsbGVyLgorCTxvcmlnaW4gaWQ+IGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0aGlubHktcHJvdmlzaW9uZWQgZGV2aWNlCisJb2Ygd2hpY2ggdGhlIG5ldyBkZXZpY2Ugd2lsbCBiZSBhIHNuYXBzaG90LgorCisgICAgZGVsZXRlIDxkZXYgaWQ+CisKKwlEZWxldGVzIGEgdGhpbiBkZXZpY2UuICBJcnJldmVyc2libGUuCisKKyAgICB0cmltIDxkZXYgaWQ+IDxuZXcgc2l6ZSBpbiBzZWN0b3JzPgorCisJRGVsZXRlIG1hcHBpbmdzIGZyb20gdGhlIGVuZCBvZiBhIHRoaW4gZGV2aWNlLiAgSXJyZXZlcnNpYmxlLgorCVlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSdyZSByZWR1Y2luZyB0aGUgc2l6ZSBvZgorCXlvdXIgdGhpbmx5LXByb3Zpc2lvbmVkIGRldmljZS4gIEluIG1hbnkgY2FzZXMsIGR1ZSB0byB0aGUKKwlzaGFyaW5nIG9mIGJsb2NrcyBiZXR3ZWVuIGRldmljZXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworCWRldGVybWluZSBpbiBhZHZhbmNlIGhvdyBtdWNoIHNwYWNlICd0cmltJyB3aWxsIHJlbGVhc2UuICAoSW4KKwlmdXR1cmUgYSB1c2Vyc3BhY2UgdG9vbCBtaWdodCBiZSBhYmxlIHRvIHBlcmZvcm0gdGhpcworCWNhbGN1bGF0aW9uLikKKworICAgIHNldF90cmFuc2FjdGlvbl9pZCA8Y3VycmVudCBpZD4gPG5ldyBpZD4KKworCVVzZXJsYW5kIHZvbHVtZSBtYW5hZ2Vycywgc3VjaCBhcyBMVk0sIG5lZWQgYSB3YXkgdG8KKwlzeW5jaHJvbmlzZSB0aGVpciBleHRlcm5hbCBtZXRhZGF0YSB3aXRoIHRoZSBpbnRlcm5hbCBtZXRhZGF0YSBvZiB0aGUKKwlwb29sIHRhcmdldC4gIFRoZSB0aGluLXBvb2wgdGFyZ2V0IG9mZmVycyB0byBzdG9yZSBhbgorCWFyYml0cmFyeSA2NC1iaXQgdHJhbnNhY3Rpb24gaWQgYW5kIHJldHVybiBpdCBvbiB0aGUgdGFyZ2V0J3MKKwlzdGF0dXMgbGluZS4gIFRvIGF2b2lkIHJhY2VzIHlvdSBtdXN0IHByb3ZpZGUgd2hhdCB5b3UgdGhpbmsKKwl0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZCBpcyB3aGVuIHlvdSBjaGFuZ2UgaXQgd2l0aCB0aGlzCisJY29tcGFyZS1hbmQtc3dhcCBtZXNzYWdlLgorCisndGhpbicgdGFyZ2V0CistLS0tLS0tLS0tLS0tCisKK2kpIENvbnN0cnVjdG9yCisKKyAgICB0aGluIDxwb29sIGRldj4gPGRldiBpZD4KKworICAgIHBvb2wgZGV2OgorCXRoZSB0aGluLXBvb2wgZGV2aWNlLCBlLmcuIC9kZXYvbWFwcGVyL215X3Bvb2wgb3IgMjUzOjAKKworICAgIGRldiBpZDoKKwl0aGUgaW50ZXJuYWwgZGV2aWNlIGlkZW50aWZpZXIgb2YgdGhlIGRldmljZSB0byBiZQorCWFjdGl2YXRlZC4KKworVGhlIHBvb2wgZG9lc24ndCBzdG9yZSBhbnkgc2l6ZSBhZ2FpbnN0IHRoZSB0aGluIGRldmljZXMuICBJZiB5b3UKK2xvYWQgYSB0aGluIHRhcmdldCB0aGF0IGlzIHNtYWxsZXIgdGhhbiB5b3UndmUgYmVlbiB1c2luZyBwcmV2aW91c2x5LAordGhlbiB5b3UnbGwgaGF2ZSBubyBhY2Nlc3MgdG8gYmxvY2tzIG1hcHBlZCBiZXlvbmQgdGhlIGVuZC4gIElmIHlvdQorbG9hZCBhIHRhcmdldCB0aGF0IGlzIGJpZ2dlciB0aGFuIGJlZm9yZSwgdGhlbiBleHRyYSBibG9ja3Mgd2lsbCBiZQorcHJvdmlzaW9uZWQgYXMgYW5kIHdoZW4gbmVlZGVkLgorCitJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIHNpemUgb2YgeW91ciB0aGluIGRldmljZSBhbmQgcG90ZW50aWFsbHkKK3JlZ2FpbiBzb21lIHNwYWNlIHRoZW4gc2VuZCB0aGUgJ3RyaW0nIG1lc3NhZ2UgdG8gdGhlIHBvb2wuCisKK2lpKSBTdGF0dXMKKworICAgICA8bnIgbWFwcGVkIHNlY3RvcnM+IDxoaWdoZXN0IG1hcHBlZCBzZWN0b3I+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2NhbHhlZGEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jYWx4ZWRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU1Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jYWx4ZWRhLnR4dApAQCAtMCwwICsxLDggQEAKK0NhbHhlZGEgSGlnaGJhbmsgUGxhdGZvcm1zIERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCb2FyZHMgd2l0aCBDYWx4ZWRhIENvcnRleC1BOSBiYXNlZCBIaWdoYmFuayBTT0Mgc2hhbGwgaGF2ZSB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzLgorCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiY2FseGVkYSxoaWdoYmFuayI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZzbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZzbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4NDhhZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vZnNsLnR4dApAQCAtMCwwICsxLDI2IEBACitGcmVlc2NhbGUgaS5NWCBQbGF0Zm9ybXMgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2kuTVg1MSBCYWJiYWdlIEJvYXJkCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWJhYmJhZ2UiLCAiZnNsLGlteDUxIjsKKworaS5NWDUzIEF1dG9tb3RpdmUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZAorUmVxdWlyZWQgcm9vdCBub2RlIHByb3BlcnRpZXM6CisgICAgLSBjb21wYXRpYmxlID0gImZzbCxpbXg1My1hcmQiLCAiZnNsLGlteDUzIjsKKworaS5NWDUzIEV2YWx1YXRpb24gS2l0CitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWV2ayIsICJmc2wsaW14NTMiOworCitpLk1YNTMgUXVpY2sgU3RhcnQgQm9hcmQKK1JlcXVpcmVkIHJvb3Qgbm9kZSBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtcXNiIiwgImZzbCxpbXg1MyI7CisKK2kuTVg1MyBTbWFydCBNb2JpbGUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZAorUmVxdWlyZWQgcm9vdCBub2RlIHByb3BlcnRpZXM6CisgICAgLSBjb21wYXRpYmxlID0gImZzbCxpbXg1My1zbWQiLCAiZnNsLGlteDUzIjsKKworaS5NWDYgUXVhZCBTQUJSRSBBdXRvbW90aXZlIEJvYXJkCitSZXF1aXJlZCByb290IG5vZGUgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXNhYnJlYXV0byIsICJmc2wsaW14NnEiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9naWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9naWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTE2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2dpYy50eHQKQEAgLTAsMCArMSw1NSBAQAorKiBBUk0gR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlcgorCitBUk0gU01QIGNvcmVzIGFyZSBvZnRlbiBhc3NvY2lhdGVkIHdpdGggYSBHSUMsIHByb3ZpZGluZyBwZXIgcHJvY2Vzc29yCitpbnRlcnJ1cHRzIChQUEkpLCBzaGFyZWQgcHJvY2Vzc29yIGludGVycnVwdHMgKFNQSSkgYW5kIHNvZnR3YXJlCitnZW5lcmF0ZWQgaW50ZXJydXB0cyAoU0dJKS4KKworUHJpbWFyeSBHSUMgaXMgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIENQVSBhbmQgdHlwaWNhbGx5IGhhcyBQUElzIGFuZCBTR0lzLgorU2Vjb25kYXJ5IEdJQ3MgYXJlIGNhc2NhZGVkIGludG8gdGhlIHVwd2FyZCBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgZG8gbm90CitoYXZlIFBQSXMgb3IgU0dJcy4KKworTWFpbiBub2RlIHJlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2Y6CisJImFybSxjb3J0ZXgtYTktZ2ljIgorCSJhcm0sYXJtMTFtcC1naWMiCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorICBpbnRlcnJ1cHQgc291cmNlLiAgVGhlIHR5cGUgc2hhbGwgYmUgYSA8dTMyPiBhbmQgdGhlIHZhbHVlIHNoYWxsIGJlIDMuCisKKyAgVGhlIDFzdCBjZWxsIGlzIHRoZSBpbnRlcnJ1cHQgdHlwZTsgMCBmb3IgU1BJIGludGVycnVwdHMsIDEgZm9yIFBQSQorICBpbnRlcnJ1cHRzLgorCisgIFRoZSAybmQgY2VsbCBjb250YWlucyB0aGUgaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIGludGVycnVwdCB0eXBlLgorICBTUEkgaW50ZXJydXB0cyBhcmUgaW4gdGhlIHJhbmdlIFswLTk4N10uICBQUEkgaW50ZXJydXB0cyBhcmUgaW4gdGhlCisgIHJhbmdlIFswLTE1XS4KKworICBUaGUgM3JkIGNlbGwgaXMgdGhlIGZsYWdzLCBlbmNvZGVkIGFzIGZvbGxvd3M6CisJYml0c1szOjBdIHRyaWdnZXIgdHlwZSBhbmQgbGV2ZWwgZmxhZ3MuCisJCTEgPSBsb3ctdG8taGlnaCBlZGdlIHRyaWdnZXJlZAorCQkyID0gaGlnaC10by1sb3cgZWRnZSB0cmlnZ2VyZWQKKwkJNCA9IGFjdGl2ZSBoaWdoIGxldmVsLXNlbnNpdGl2ZQorCQk4ID0gYWN0aXZlIGxvdyBsZXZlbC1zZW5zaXRpdmUKKwliaXRzWzE1OjhdIFBQSSBpbnRlcnJ1cHQgY3B1IG1hc2suICBFYWNoIGJpdCBjb3JyZXNwb25kcyB0byBlYWNoIG9mCisJdGhlIDggcG9zc2libGUgY3B1cyBhdHRhY2hlZCB0byB0aGUgR0lDLiAgQSBiaXQgc2V0IHRvICcxJyBpbmRpY2F0ZWQKKwl0aGUgaW50ZXJydXB0IGlzIHdpcmVkIHRvIHRoYXQgQ1BVLiAgT25seSB2YWxpZCBmb3IgUFBJIGludGVycnVwdHMuCisKKy0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyhzKSBhbmQgc2l6ZSBvZiB0aGUgR0lDIHJlZ2lzdGVycy4gVGhlCisgIGZpcnN0IHJlZ2lvbiBpcyB0aGUgR0lDIGRpc3RyaWJ1dG9yIHJlZ2lzdGVyIGJhc2UgYW5kIHNpemUuIFRoZSAybmQgcmVnaW9uIGlzCisgIHRoZSBHSUMgY3B1IGludGVyZmFjZSByZWdpc3RlciBiYXNlIGFuZCBzaXplLgorCitPcHRpb25hbAorLSBpbnRlcnJ1cHRzCTogSW50ZXJydXB0IHNvdXJjZSBvZiB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLiBPbmx5CisgIHByZXNlbnQgb24gc2Vjb25kYXJ5IEdJQ3MuCisKK0V4YW1wbGU6CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckBmZmYxMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCXJlZyA9IDwweGZmZjExMDAwIDB4MTAwMD4sCisJCSAgICAgIDwweGZmZjEwMTAwIDB4MTAwPjsKKwl9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvZHNwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9kc3AudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvZHNwLnR4dApAQCAtMCwwICsxLDE0IEBACisqIFRJIC0gRFNQIChEaWdpdGFsIFNpZ25hbCBQcm9jZXNzb3IpCisKK1RJIERTUCBpbmNsdWRlZCBpbiBPTUFQIFNvQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJ0aSxvbWFwMy1jNjQiIGZvciBPTUFQMyAmIDQKKy0gdGksaHdtb2RzOiAiZHNwIgorCitFeGFtcGxlczoKKworZHNwIHsKKyAgICBjb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisgICAgdGksaHdtb2RzID0gImRzcCI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL2l2YS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvaXZhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDYyOTUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL2l2YS50eHQKQEAgLTAsMCArMSwxOSBAQAorKiBUSSAtIElWQSAoSW1hZ2luZyBhbmQgVmlkZW8gQWNjZWxlcmF0b3IpIHN1YnN5c3RlbQorCitUaGUgSVZBIGNvbnRhaW4gdmFyaW91cyBhdWRpbywgdmlkZW8gb3IgaW1hZ2luZyBIVyBhY2NlbGVyYXRvcgorZGVwZW5kaW5nIG9mIHRoZSB2ZXJzaW9uLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlOgorICAtICJ0aSxpdmFoZCIgZm9yIE9NQVA0CisgIC0gInRpLGl2YTIuMiIgZm9yIE9NQVAzCisgIC0gInRpLGl2YTIuMSIgZm9yIE9NQVAyNDMwCisgIC0gInRpLGl2YTEiIGZvciBPTUFQMjQyMAorLSB0aSxod21vZHM6ICJpdmEiCisKK0V4YW1wbGVzOgorCitpdmEgeworICAgIGNvbXBhdGlibGUgPSAidGksaXZhaGQiLCAidGksaXZhIjsKKyAgICB0aSxod21vZHMgPSAiaXZhIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbDMtbm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9sMy1ub2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODhhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbDMtbm9jLnR4dApAQCAtMCwwICsxLDE5IEBACisqIFRJIC0gTDMgTmV0d29yayBPbiBDaGlwIChOb0MpCisKK1RoaXMgdmVyc2lvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2VuZXJpYyBOb0MgSVAKK3Byb3ZpZGVkIGJ5IEFydGVyaXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLG9tYXAzLWwzLXNteCIgZm9yIE9NQVAzIGZhbWlseQorICAgICAgICAgICAgICAgU2hvdWxkIGJlICJ0aSxvbWFwNC1sMy1ub2MiIGZvciBPTUFQNCBmYW1pbHkKKy0gdGksaHdtb2RzOiAibDNfbWFpbl8xIiwgLi4uIE9uZSBod21vZCBmb3IgZWFjaCBub2MgZG9tYWluLgorCitFeGFtcGxlczoKKworb2NwIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LWwzLW5vYyIsICJzaW1wbGUtYnVzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlyYW5nZXM7CisJdGksaHdtb2RzID0gImwzX21haW5fMSIsICJsM19tYWluXzIiLCAibDNfbWFpbl8zIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbXB1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9tcHUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNWE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvbXB1LnR4dApAQCAtMCwwICsxLDI3IEBACisqIFRJIC0gTVBVIChNYWluIFByb2Nlc3NvciBVbml0KSBzdWJzeXN0ZW0KKworVGhlIE1QVSBzdWJzeXN0ZW0gY29udGFpbiBvbmUgb3Igc2V2ZXJhbCBBUk0gY29yZXMKK2RlcGVuZGluZyBvZiB0aGUgdmVyc2lvbi4KK1RoZSBNUFUgY29udGFpbiBDUFVzLCBHSUMsIEwyIGNhY2hlIGFuZCBhIGxvY2FsIFBSQ00uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLG9tYXAzLW1wdSIgZm9yIE9NQVAzCisgICAgICAgICAgICAgICBTaG91bGQgYmUgInRpLG9tYXA0LW1wdSIgZm9yIE9NQVA0CistIHRpLGh3bW9kczogIm1wdSIKKworRXhhbXBsZXM6CisKKy0gRm9yIGFuIE9NQVA0IFNNUCBzeXN0ZW06CisKK21wdSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1tcHUiOworICAgIHRpLGh3bW9kcyA9ICJtcHUiOworfTsKKworCistIEZvciBhbiBPTUFQMyBtb25vY29yZSBzeXN0ZW06CisKK21wdSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1tcHUiOworICAgIHRpLGh3bW9kcyA9ICJtcHUiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9vbWFwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9vbWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRhYjQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL29tYXAudHh0CkBAIC0wLDAgKzEsNDMgQEAKKyogVGV4YXMgSW5zdHJ1bWVudHMgT01BUAorCitPTUFQIGlzIGN1cnJlbnRseSB1c2luZyBhIHN0YXRpYyBmaWxlIHBlciBTb0MgZmFtaWx5IHRvIGRlc2NyaWJlIHRoZQorSVBzIHByZXNlbnQgaW4gdGhlIFNvQy4KK09uIHRvcCBvZiB0aGF0IGFuIG9tYXBfZGV2aWNlIGlzIGNyZWF0ZWQgdG8gZXh0ZW5kIHRoZSBwbGF0Zm9ybV9kZXZpY2UKK2NhcGFiaWxpdGllcyBhbmQgdG8gYWxsb3cgYmluZGluZyB3aXRoIG9uZSBvciBzZXZlcmFsIGh3bW9kcy4KK1RoZSBod21vZHMgd2lsbCBjb250YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlIGRldmljZToKK2FkcmVzc2UgcmFuZ2UsIGlycSBsaW5lcywgZG1hIGxpbmVzLCBpbnRlcmNvbm5lY3QsIFBSQ00gcmVnaXN0ZXIsCitjbG9jayBkb21haW4sIGlucHV0IGNsb2Nrcy4KK0ZvciB0aGUgbW9tZW50IGp1c3QgcG9pbnQgdG8gdGhlIGV4aXN0aW5nIGh3bW9kLCB0aGUgbmV4dCBzdGVwIHdpbGwgYmUKK3RvIG1vdmUgZGF0YSBmcm9tIGh3bW9kIHRvIGRldmljZS10cmVlIHJlcHJlc2VudGF0aW9uLgorCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IEV2ZXJ5IGRldmljZXMgcHJlc2VudCBpbiBPTUFQIFNvQyBzaG91bGQgYmUgaW4gdGhlCisgIGZvcm06ICJ0aSxYWFgiCistIHRpLGh3bW9kczogbGlzdCBvZiBod21vZCBuYW1lcyAoYXNjaWkgc3RyaW5ncyksIHRoYXQgY29tZXMgZnJvbSB0aGUgT01BUAorICBIVyBkb2N1bWVudGF0aW9uLCBhdHRhY2hlZCB0byBhIGRldmljZS4gTXVzdCBjb250YWluIGF0IGxlYXN0CisgIG9uZSBod21vZC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdGksbm9faWRsZV9vbl9zdXNwZW5kOiBXaGVuIHByZXNlbnQsIGl0IHByZXZlbnRzIHRoZSBQTSB0byBpZGxlIHRoZSBtb2R1bGUKKyAgZHVyaW5nIHN1c3BlbmQuCisKKworRXhhbXBsZToKKworc3BpbmxvY2tAMSB7CisgICAgY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1zcGlubG9jayI7CisgICAgdGksaHdtb2RzID0gInNwaW5sb2NrIjsKK307CisKKworQm9hcmRzOgorCistIE9NQVAzIEJlYWdsZUJvYXJkIDogTG93IGNvc3QgY29tbXVuaXR5IGJvYXJkCisgIGNvbXBhdGlibGUgPSAidGksb21hcDMtYmVhZ2xlIiwgInRpLG9tYXAzIgorCistIE9NQVA0IFNEUCA6IFNvZnR3YXJlIERldmVsb3BlbWVudCBCb2FyZAorICBjb21wYXRpYmxlID0gInRpLG9tYXA0LXNkcCIsICJ0aSxvbWFwNDQzMCIKKworLSBPTUFQNCBQYW5kYUJvYXJkIDogTG93IGNvc3QgY29tbXVuaXR5IGJvYXJkCisgIGNvbXBhdGlibGUgPSAidGksb21hcDQtcGFuZGEiLCAidGksb21hcDQ0MzAiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3BpY294Y2VsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3BpY294Y2VsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1YzBlZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcGljb3hjZWxsLnR4dApAQCAtMCwwICsxLDI0IEBACitQaWNvY2hpcCBwaWNvWGNlbGwgZGV2aWNlIHRyZWUgYmluZGluZ3MuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHJvb3Qgbm9kZSBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZToKKwktICJwaWNvY2hpcCxwYzczMDItcGMzeDMiIDogUEM3MzAyIGRldmVsb3BtZW50IGJvYXJkIHdpdGggUEMzWDMgZGV2aWNlLgorCS0gInBpY29jaGlwLHBjNzMwMi1wYzN4MiIgOiBQQzczMDIgZGV2ZWxvcG1lbnQgYm9hcmQgd2l0aCBQQzNYMiBkZXZpY2UuCisJLSAicGljb2NoaXAscGMzeDMiIDogcGljb1hjZWxsIFBDM1gzIGRldmljZSBiYXNlZCBib2FyZC4KKwktICJwaWNvY2hpcCxwYzN4MiIgOiBwaWNvWGNlbGwgUEMzWDIgZGV2aWNlIGJhc2VkIGJvYXJkLgorCitUaW1lcnMgcmVxdWlyZWQgcHJvcGVydGllczoKKyAgICAtIGNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiCisgICAgLSBpbnRlcnJ1cHRzIDogVGhlIHNpbmdsZSBJUlEgbGluZSBmb3IgdGhlIHRpbWVyLgorICAgIC0gY2xvY2stZnJlcSA6IFRoZSBmcmVxdWVuY3kgaW4gSFogb2YgdGhlIHRpbWVyLgorICAgIC0gcmVnIDogVGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSB0aW1lci4KKworTm90ZTogdHdvIHRpbWVycyBhcmUgcmVxdWlyZWQgLSBvbmUgZm9yIHRoZSBzY2hlZHVsZXIgY2xvY2sgYW5kIG9uZSBmb3IgdGhlCitldmVudCB0aWNrL05PSFouCisKK1ZJQyByZXF1aXJlZCBwcm9wZXJ0aWVzOgorICAgIC0gY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIi4KKyAgICAtIGludGVycnVwdC1jb250cm9sbGVyLgorICAgIC0gcmVnIDogVGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBkZXZpY2UuCisgICAgLSAjaW50ZXJydXB0LWNlbGxzIDogTXVzdCBiZSAxLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wcmltZWNlbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wcmltZWNlbGwudHh0CmluZGV4IDFkNWQ3YTguLjk1MWNhNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcHJpbWVjZWxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3ByaW1lY2VsbC50eHQKQEAgLTYsNyArNiw5IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBhIHNwZWNpZmljIHZhbHVlIGZvciBwZXJpcGhlcmFsIGFuZCAiYXJtLHByaW1lY2VsbCIKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBhIHNwZWNpZmljIG5hbWUgZm9yIHRoZSBwZXJpcGhlcmFsIGFuZAorICAgICAgICAgICAgICAgImFybSxwcmltZWNlbGwiLiAgVGhlIHNwZWNpZmljIG5hbWUgd2lsbCBtYXRjaCB0aGUgQVJNCisgICAgICAgICAgICAgICBlbmdpbmVlcmluZyBuYW1lIGZvciB0aGUgbG9naWMgYmxvY2sgaW4gdGhlIGZvcm06ICJhcm0scGw/Pz8iCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvY2FseGVkYS1zYXRhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvY2FseGVkYS1zYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNhYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9jYWx4ZWRhLXNhdGEudHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogQ2FseGVkYSBTQVRBIENvbnRyb2xsZXIKKworU0FUQSBub2RlcyBhcmUgZGVmaW5lZCB0byBkZXNjcmliZSBvbi1jaGlwIFNlcmlhbCBBVEEgY29udHJvbGxlcnMuCitFYWNoIFNBVEEgY29udHJvbGxlciBzaG91bGQgaGF2ZSBpdHMgb3duIG5vZGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICAgIDogY29tcGF0aWJsZSBsaXN0LCBjb250YWlucyAiY2FseGVkYSxoYi1haGNpIgorLSBpbnRlcnJ1cHRzICAgICAgICA6IDxpbnRlcnJ1cHQgbWFwcGluZyBmb3IgU0FUQSBJUlE+CistIHJlZyAgICAgICAgICAgICAgIDogPHJlZ2lzdGVycyBtYXBwaW5nPgorCitFeGFtcGxlOgorICAgICAgICBzYXRhQGZmZTA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJjYWx4ZWRhLGhiLWFoY2kiOworICAgICAgICAgICAgICAgIHJlZyA9IDwweGZmZTA4MDAwIDB4MTAwMD47CisgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxMTU+OworICAgICAgICB9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY3J5cHRvL3BpY29jaGlwLXNwYWNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jcnlwdG8vcGljb2NoaXAtc3BhY2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjA5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY3J5cHRvL3BpY29jaGlwLXNwYWNjLnR4dApAQCAtMCwwICsxLDIzIEBACitQaWNvY2hpcCBwaWNvWGNlbGwgU1BBY2MgKFNlY3VyaXR5IFByb3RvY29sIEFjY2VsZXJhdG9yKSBiaW5kaW5ncworCitQaWNvY2hpcCBwaWNvWGNlbGwgZGV2aWNlcyBjb250YWluIGNyeXB0byBvZmZsb2FkIGVuZ2luZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IKK0lQU0VDIGFuZCBmZW10b2NlbGwgbGF5ZXIgMiBjaXBoZXJpbmcuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgIC0gY29tcGF0aWJsZSA6ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyIgZm9yIHRoZSBJUFNFQyBvZmZsb2FkIGVuZ2luZQorICAgICJwaWNvY2hpcCxzcGFjYy1sMiIgZm9yIHRoZSBmZW10b2NlbGwgbGF5ZXIgMiBjaXBoZXJpbmcgZW5naW5lLgorICAtIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoaXMgZGV2aWNlCisgIC0gaW50ZXJydXB0LXBhcmVudCA6IFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0IGNvbnRyb2xzIHRoZSBTUEFjYworICAgIGludGVycnVwdC4KKyAgLSBpbnRlcnJ1cHRzIDogVGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlIFNQQWNjLgorICAtIHJlZi1jbG9jayA6IFRoZSBpbnB1dCBjbG9jayB0aGF0IGRyaXZlcyB0aGUgU1BBY2MuCisKK0V4YW1wbGUgU1BBY2Mgbm9kZToKKworc3BhY2NAMTAwMDAgeworCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtaXBzZWMiOworCXJlZyA9IDwweDEwMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwlpbnRlcnJ1cHRzID0gPDI0PjsKKwlyZWYtY2xvY2sgPSA8Jmlwc2VjX2Nsaz4sICJyZWYiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3BsMDYxLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcGwwNjEtZ3Bpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjNDE2YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3BsMDYxLWdwaW8udHh0CkBAIC0wLDAgKzEsMTAgQEAKK0FSTSBQTDA2MSBHUElPIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCIKKy0gI2dwaW8tY2VsbHMgOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQgdGhlCisgIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbCBwYXJhbWV0ZXJzOgorICAtIGJpdCAwIHNwZWNpZmllcyBwb2xhcml0eSAoMCBmb3Igbm9ybWFsLCAxIGZvciBpbnZlcnRlZCkKKy0gZ3Bpby1jb250cm9sbGVyIDogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG1hcHBpbmcgZm9yIEdQSU8gSVJRLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2ZzbC1pbXgtaTJjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvZnNsLWlteC1pMmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzY2Y0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2ZzbC1pbXgtaTJjLnR4dApAQCAtMCwwICsxLDI1IEBACisqIEZyZWVzY2FsZSBJbnRlciBJQyAoSTJDKSBhbmQgSGlnaCBTcGVlZCBJbnRlciBJQyAoSFMtSTJDKSBmb3IgaS5NWAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPGNoaXA+LWkyYyIKKy0gcmVnIDogU2hvdWxkIGNvbnRhaW4gSTJDL0hTLUkyQyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gSTJDL0hTLUkyQyBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2stZnJlcXVlbmN5IDogQ29uc3RhaW5zIGRlc2lyZWQgSTJDL0hTLUkyQyBidXMgY2xvY2sgZnJlcXVlbmN5IGluIEh6LgorICBUaGUgYWJzZW5jZSBvZiB0aGUgcHJvcG9lcnR5IGluZGljYXRlcyB0aGUgZGVmYXVsdCBmcmVxdWVuY3kgMTAwIGtIei4KKworRXhhbXBsZXM6CisKK2kyY0A4M2ZjNDAwMCB7IC8qIEkyQzIgb24gaS5NWDUxICovCisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJcmVnID0gPDB4ODNmYzQwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDYzPjsKK307CisKK2kyY0A3MDAzODAwMCB7IC8qIEhTLUkyQyBvbiBpLk1YNTEgKi8KKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwlyZWcgPSA8MHg3MDAzODAwMCAweDQwMDA+OworCWludGVycnVwdHMgPSA8NjQ+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvc2Ftc3VuZy1pMmMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9zYW1zdW5nLWkyYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4MzJjNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvc2Ftc3VuZy1pMmMudHh0CkBAIC0wLDAgKzEsMzkgQEAKKyogU2Ftc3VuZydzIEkyQyBjb250cm9sbGVyCisKK1RoZSBTYW1zdW5nJ3MgSTJDIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBpbnRlcmZhY2Ugd2l0aCBJMkMgZGV2aWNlcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAgLSBjb21wYXRpYmxlOiB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcuCisgICAgICAoYSkgInNhbXN1bmcsIHMzYzI0MTAtaTJjIiwgZm9yIGkyYyBjb21wYXRpYmxlIHdpdGggczNjMjQxMCBpMmMuCisgICAgICAoYikgInNhbXN1bmcsIHMzYzI0NDAtaTJjIiwgZm9yIGkyYyBjb21wYXRpYmxlIHdpdGggczNjMjQ0MCBpMmMuCisgIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisgICAgcmVnaW9uLgorICAtIGludGVycnVwdHM6IGludGVycnVwdCBudW1iZXIgdG8gdGhlIGNwdS4KKyAgLSBzYW1zdW5nLGkyYy1zZGEtZGVsYXk6IERlbGF5IChpbiBucykgYXBwbGllZCB0byBkYXRhIGxpbmUgKFNEQSkgZWRnZXMuCisgIC0gZ3Bpb3M6IFRoZSBvcmRlciBvZiB0aGUgZ3Bpb3Mgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6IDxTREEsIFNDTD4uCisgICAgVGhlIGdwaW8gc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIGdwaW8gY29udHJvbGxlci4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAgLSBzYW1zdW5nLGkyYy1zbGF2ZS1hZGRyOiBTbGF2ZSBhZGRyZXNzIGluIG11bHRpLW1hc3RlciBlbnZpcm9tZW50LiBJZiBub3QKKyAgICBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgLSBzYW1zdW5nLGkyYy1tYXgtYnVzLWZyZXE6IERlc2lyZWQgZnJlcXVlbmN5IGluIEh6IG9mIHRoZSBidXMuIElmIG5vdAorICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaW4gSHogaXMgMTAwMDAwLgorCitFeGFtcGxlOgorCisJaTJjQDEzODcwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0NDAtaTJjIjsKKwkJcmVnID0gPDB4MTM4NzAwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDM0NT47CisJCXNhbXN1bmcsaTJjLXNkYS1kZWxheSA9IDwxMDA+OworCQlzYW1zdW5nLGkyYy1tYXgtYnVzLWZyZXEgPSA8MTAwMDAwPjsKKwkJZ3Bpb3MgPSA8JmdwZDEgMiAwIC8qIFNEQSAqLworCQkJICZncGQxIDMgMCAvKiBTQ0wgKi8+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJd204OTk0QDFhIHsKKwkJCWNvbXBhdGlibGUgPSAid2xmLHdtODk5NCI7CisJCQlyZWcgPSA8MHgxYT47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbnZpZGlhLXNkaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbnZpZGlhLXNkaGNpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUxMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9udmlkaWEtc2RoY2kudHh0CkBAIC0wLDAgKzEsMjcgQEAKKyogTlZJRElBIFRlZ3JhIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlcgorCitUaGlzIGNvbnRyb2xsZXIgb24gVGVncmEgZmFtaWx5IFNvQ3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBNTUMsIFNELAorYW5kIFNESU8gdHlwZXMgb2YgbWVtb3J5IGNhcmRzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJudmlkaWEsPGNoaXA+LXNkaGNpIgorLSByZWcgOiBTaG91bGQgY29udGFpbiBTRC9NTUMgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFNEL01NQyBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2QtZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciBjYXJkIGRldGVjdGlvbgorLSB3cC1ncGlvcyA6IFNwZWNpZnkgR1BJT3MgZm9yIHdyaXRlIHByb3RlY3Rpb24KKy0gcG93ZXItZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciBwb3dlciBjb250cm9sCistIHN1cHBvcnQtOGJpdCA6IEJvb2xlYW4sIGluZGljYXRlcyBpZiA4LWJpdCBtb2RlIHNob3VsZCBiZSB1c2VkLgorCitFeGFtcGxlOgorCitzZGhjaUBjODAwMDIwMCB7CisJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJcmVnID0gPDB4YzgwMDAyMDAgMHgyMDA+OworCWludGVycnVwdHMgPSA8NDc+OworCWNkLWdwaW9zID0gPCZncGlvIDY5IDA+OyAvKiBncGlvIFBJNSAqLworCXdwLWdwaW9zID0gPCZncGlvIDU3IDA+OyAvKiBncGlvIFBIMSAqLworCXBvd2VyLWdwaW9zID0gPCZncGlvIDE1NSAwPjsgLyogZ3BpbyBQVDMgKi8KKwlzdXBwb3J0LThiaXQ7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL210ZC9hdG1lbC1kYXRhZmxhc2gudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL210ZC9hdG1lbC1kYXRhZmxhc2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjZkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbXRkL2F0bWVsLWRhdGFmbGFzaC50eHQKQEAgLTAsMCArMSwxNCBAQAorKiBBdG1lbCBEYXRhIEZsYXNoCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiYXRtZWwsPG1vZGVsPiIsICJhdG1lbCw8c2VyaWVzPiIsICJhdG1lbCxkYXRhZmxhc2giLgorCitFeGFtcGxlOgorCitmbGFzaEAxIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDI1MDAwMDAwPjsKKwlyZWcgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bpbm11eC9waW5tdXhfbnZpZGlhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5tdXgvcGlubXV4X252aWRpYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODJkYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5tdXgvcGlubXV4X252aWRpYS50eHQKQEAgLTAsMCArMSw1IEBACitOVklESUEgVGVncmEgMiBwaW5tdXggY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogIm52aWRpYSx0ZWdyYTIwLXBpbm11eCIKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2JvYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9ib2FyZC50eHQKaW5kZXggMzllOTQxNS4uMzgwOTE0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL2JvYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvYm9hcmQudHh0CkBAIC0xLDMgKzEsOCBAQAorRnJlZXNjYWxlIFJlZmVyZW5jZSBCb2FyZCBCaW5kaW5ncworCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBkZXZpY2UgdHJlZSBiaW5kaW5ncyBmb3IgdmFyaW91cyBkZXZpY2VzIHRoYXQKK2V4aXN0IG9uIHNvbWUgRnJlZXNjYWxlIHJlZmVyZW5jZSBib2FyZHMuCisKICogQm9hcmQgQ29udHJvbCBhbmQgU3RhdHVzIChCQ1NSKQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgpAQCAtMTIsMjUgKzE3LDI2IEBACiAJCXJlZyA9IDxmODAwMDAwMCA4MDAwPjsKIAl9OwogCi0qIEZyZWVzY2FsZSBvbiBib2FyZCBGUEdBCisqIEZyZWVzY2FsZSBvbi1ib2FyZCBGUEdBCiAKIFRoaXMgaXMgdGhlIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXJzIGZvciBvbiBib2FyZCBGUEdBLgogCiBSZXF1aXJlZCBwcm9wZXJpdGllczoKLS0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZnNsLGZwZ2EtcGl4aXMiLgotLSByZWcgOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgRlBQR0EgcmVnaXN0ZXIKLSAgc2V0LgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgYSBib2FyZC1zcGVjaWZpYyBzdHJpbmcgZm9sbG93ZWQgYnkgYSBzdHJpbmcKKyAgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBGUEdBLiAgRXhhbXBsZToKKwkiZnNsLDxib2FyZD4tZnBnYSIsICJmc2wsZnBnYS1waXhpcyIKKy0gcmVnOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgRlBHQSByZWdpc3RlciBzZXQuCiAtIGludGVycnVwdC1wYXJlbnQ6IHNob3VsZCBzcGVjaWZ5IHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlci4KLS0gaW50ZXJydXB0cyA6IHNob3VsZCBzcGVjaWZ5IGV2ZW50ICh3YWtldXApIElSUS4KKy0gaW50ZXJydXB0czogc2hvdWxkIHNwZWNpZnkgZXZlbnQgKHdha2V1cCkgSVJRLgogCi1FeGFtcGxlIChNUEM4NjEwSFBDRCk6CitFeGFtcGxlIChQMTAyMkRTKToKIAotCWJvYXJkLWNvbnRyb2xAZTgwMDAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxmcGdhLXBpeGlzIjsKLQkJcmVnID0gPDB4ZTgwMDAwMDAgMzI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDw4IDg+OwotCX07CisJIGJvYXJkLWNvbnRyb2xAMywwIHsKKwkJIGNvbXBhdGlibGUgPSAiZnNsLHAxMDIyZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKKwkJIHJlZyA9IDwzIDAgMHgzMD47CisJCSBpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJIGludGVycnVwdHMgPSA8OCA4IDAgMD47CisJIH07CiAKICogRnJlZXNjYWxlIEJDU1IgR1BJTyBiYW5rcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvZGNzci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvZGNzci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NGViNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9kY3NyLnR4dApAQCAtMCwwICsxLDM5NSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGVidWcgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIChEQ1NSKSBCaW5kaW5nCitDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisKK05PVEU6IFRoZSBiaW5kaW5ncyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudCBhcmUgcHJlbGltaW5hcnkgYW5kIHN1YmplY3QKK3RvIGNoYW5nZS4gIFNvbWUgb2YgdGhlIGNvbXBhdGlibGUgc3RyaW5ncyB0aGF0IGNvbnRhaW4gb25seSBnZW5lcmljIG5hbWVzCittYXkgdHVybiBvdXQgdG8gYmUgaW5hcHByb3ByaWF0ZSwgb3IgbmVlZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gZGVzY3JpYmUKK3RoZSBpbnRlZ3JhdGlvbiBvZiB0aGUgYmxvY2sgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY2hpcC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEZWJ1ZyBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgTWVtb3J5IE1hcAorCitEZXNjcmlwdGlvbgorCitUaGlzIG5vZGUgZGVmaW5lcyB0aGUgYmFzZSBhZGRyZXNzIGFuZCByYW5nZSBmb3IgdGhlCitkZWZpbmVkIERDU1IgTWVtb3J5IE1hcC4gQ2hpbGQgbm9kZXMgd2lsbCBkZXNjcmliZSB0aGUgaW5kaXZpZHVhbAorZGVidWcgYmxvY2tzIGRlZmluZWQgd2l0aGluIHRoaXMgbWVtb3J5IHNwYWNlLgorCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSAiZnNsLGRjc3IiIGFuZCAic2ltcGxlLWJ1cyIuCisJVGhlIERDU1Igc3BhY2UgZXhpc3RzIGluIHRoZSBtZW1vcnktbWFwcGVkIGJ1cy4KKworCS0gI2FkZHJlc3MtY2VsbHMKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY2VsbHMKKwlvciByZXByZXNlbnRpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIGluIGNoaWxkIG5vZGVzLgorCisJLSAjc2l6ZS1jZWxscworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIERlZmluZXMgdGhlIG51bWJlciBvZiBjZWxscworCW9yIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgaW4KKwljaGlsZCBub2Rlcy4KKworCS0gcmFuZ2VzCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlyYW5nZSBvZiB0aGUgRENTUiBzcGFjZS4KKworRVhBTVBMRQorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHgwMDAwMDAwMCAweDAxMDA4MDAwPjsKKwl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0V2ZW50IFByb2Nlc3NpbmcgVW5pdAorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvIHRoZSBFUFUKKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLWVwdSIKKworCS0gaW50ZXJydXB0cworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wX2VuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogIFNwZWNpZmllcyB0aGUgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIEVQVS4KKwlUaGUgdmFsdWUgb2YgdGhlIGludGVycnVwdHMgcHJvcGVydHkgY29uc2lzdHMgb2YgdGhyZWUKKwlpbnRlcnJ1cHQgc3BlY2lmaWVycy4gVGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVyIGlzIGRlZmluZWQKKwlieSB0aGUgYmluZGluZyBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBub2RlJ3MgaW50ZXJydXB0IHBhcmVudC4KKworCVRoZSBFUFUgY291bnRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IHRoZSBwZXJmb3JtYW5jZQorCW1vbml0b3IgaW50ZXJydXB0IHNpZ25hbCBiYXNlZCBvbiBlaXRoZXIgY291bnRlciBvdmVyZmxvdyBvciB2YWx1ZQorCW1hdGNoLiBXaGljaCBjb3VudGVyIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgaXMgY2FwdHVyZWQgaW4gYW4gRVBVCisJQ291bnRlciBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChFUENQVUlTUikuCisKKwlUaGUgRVBVIHVuaXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBhc3NlcnQgZWl0aGVyIG9yIGJvdGggb2YKKwl0d28gaW50ZXJydXB0IHNpZ25hbHMgYmFzZWQgb24gZGVidWcgZXZlbnQgc291cmNlcyB3aXRoaW4gdGhlIFNvQy4KKwlUaGUgaW50ZXJydXB0IHNpZ25hbHMgYXJlIGVwdV94dF9pbnQwIGFuZCBlcHVfeHRfaW50MS4KKwlXaGljaCBldmVudCBzb3VyY2UgYXNzZXJ0ZWQgdGhlIGludGVycnVwdCBpcyBjYXB0dXJlZCBpbiBhbiBFUFUKKwlJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChFUElTUjAsRVBJU1IxKS4KKworCUludGVycnVwdCBudW1iZXJzIGFyZSBsaXNlZCBpbiBvcmRlciAocGVyZm1vbiwgZXZlbnQwLCBldmVudDEpLgorCisJLSBpbnRlcnJ1cHQtcGFyZW50CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHBoYW5kbGU+CisJRGVmaW5pdGlvbjogQSBzaW5nbGUgPHBoYW5kbGU+IHZhbHVlIHRoYXQgcG9pbnRzCisJdG8gdGhlIGludGVycnVwdCBwYXJlbnQgdG8gd2hpY2ggdGhlIGNoaWxkIGRvbWFpbgorCWlzIGJlaW5nIG1hcHBlZC4gVmFsdWUgbXVzdCBiZSAiJm1waWMiCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCWRjc3ItZXB1QDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCSAgICAgIDg0IDIgMCAwCisJCQkgICAgICA4NSAyIDAgMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJfTsKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05leHVzIFBvcnQgQ29udHJvbGxlcgorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvIHRoZSBOUEMKKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLW5wYyIKKworCS0gcmVnCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIERDU1Igc3BhY2UgcmVnaXN0ZXJzIG9mIHRoZSBkZXZpY2UKKwljb25maWd1cmF0aW9uIGJsb2NrLgorCVRoZSBOZXh1cyBQb3J0IGNvbnRyb2xsZXIgb2NjdXBpZXMgdHdvIHJlZ2lvbnMgaW4gdGhlIERDU1Igc3BhY2UKKwl3aXRoIGRpc3RpbmN0IGZ1bmN0aW9uYWxpdHkuCisKKwlUaGUgZmlyc3QgcmVnaXN0ZXIgcmFuZ2UgZGVzY3JpYmVzIHRoZSBOZXh1cyBQb3J0IENvbnRyb2xsZXIKKwljb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzLgorCisJVGhlIHNlY29uZCByZWdpc3RlciByYW5nZSBkZXNjcmliZXMgdGhlIE5leHVzIFBvcnQgQ29udHJvbGxlcgorCWludGVybmFsIHRyYWNlIGJ1ZmZlci4gVGhlIE5QQyB0cmFjZSBidWZmZXIgaXMgYSBzbWFsbCBtZW1vcnkgYnVmZmVyCisJd2hpY2ggc3RhZ2VzIHRoZSBuZXh1cyB0cmFjZSBkYXRhIGZvciB0cmFuc21pc3Npb24gdmlhIHRoZSBBdXJvcmEgcG9ydAorCW9yIHRvIGEgRERSIGJhc2VkIHRyYWNlIGJ1ZmZlci4gSW4gc29tZSBjb25maWd1cmF0aW9ucyB0aGUgTlBDIHRyYWNlCisJYnVmZmVyIGNhbiBiZSB0aGUgb25seSB0cmFjZSBidWZmZXIgdXNlZC4KKworCitFWEFNUExFCisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTmV4dXMgQ29uY2VudHJhdG9yCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8gdGhlIE5YQworCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSAiZnNsLGRjc3ItbnhjIgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1ueGNAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCX07Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29yZU5ldCBEZWJ1ZyBDb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBDb3JlTmV0IERlYnVnIGNvbnRyb2xsZXIuCisKK1BST1BFUlRJRVMKKworCS0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlICJmc2wsZGNzci1jb3JlbmV0IgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisJVGhlIENvcmVOZXQgRGVidWcgY29udHJvbGxlciBvY2N1cGllcyB0d28gcmVnaW9ucyBpbiB0aGUgRENTUiBzcGFjZQorCXdpdGggZGlzdGluY3QgZnVuY3Rpb25hbGl0eS4KKworCVRoZSBmaXJzdCByZWdpc3RlciByYW5nZSBkZXNjcmliZXMgdGhlIENvcmVOZXQgRGVidWcgQ29udHJvbGxlcgorCWZ1bmN0aW9uYWx0eSB0byBwZXJmb3JtIHRyYW5zYWN0aW9uIGFuZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgbWF0Y2hlcy4KKworCVRoZSBzZWNvbmQgcmVnaXN0ZXIgcmFuZ2UgZGVzY3JpYmVzIHRoZSBDb3JlTmV0IERlYnVnIENvbnRyb2xsZXIKKwlmdW5jdGlvbmFsdHkgdG8gdHJpZ2dlciBldmVudCBub3RpZmljYXRpb25zIGFuZCBkZWJ1ZyB0cmFjZXMuCisKK0VYQU1QTEUKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEYXRhIFBhdGggRGVidWcgY29udHJvbGxlcgorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvCit0aGUgRFBBQSBEZWJ1ZyBDb250cm9sbGVyLiBUaGlzIGNvbnRyb2xsZXIgY29udHJvbHMgZGVidWcgY29uZmlndXJhdGlvbgorZm9yIHRoZSBRTUFOIGFuZCBGTUFOIGJsb2Nrcy4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3ItZHBhYSIgaW4gYWRkaXRpb24gdG8gdGhlCisJZ2VuZXJpYyBjb21wYXRpYmxlIHN0cmluZyAiZnNsLGRjc3ItZHBhYSIuCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCQlkY3NyLWRwYWFAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitPQ2VhTiBEZWJ1ZyBjb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBPQ04gRGVidWcgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3Itb2NuIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1vY24iLgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitERFIgQ29udHJvbGxlciBEZWJ1ZyBjb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBPQ04gRGVidWcgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxkY3NyLWRkciIKKworCS0gZGV2LWhhbmRsZQorCVVzYWdlOiByZXF1aXJlZAorCURlZmluaXRpb246IEEgcGhhbmRsZSB0byBhc3NvY2lhdGUgdGhpcyBkZWJ1ZyBub2RlIHdpdGggaXRzCisJY29tcG9uZW50IGNvbnRyb2xsZXIuCisKKwktIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcworCW9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBEQ1NSIHNwYWNlIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlCisJY29uZmlndXJhdGlvbiBibG9jay4KKworRVhBTVBMRQorCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHIxPjsKKwkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOZXh1cyBBdXJvcmEgTGluayBDb250cm9sbGVyCisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBOQUwgQ29udHJvbGxlci4KKworUFJPUEVSVElFUworCisJLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgYm90aCBhbiBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSBTb0MKKwlvciBEZWJ1ZyBJUCBvZiB0aGUgZm9ybSAiZnNsLDxzb2M+LWRjc3ItbmFsIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1uYWwiLgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCX07CisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1J1biBDb250cm9sIGFuZCBQb3dlciBNYW5hZ2VtZW50CisKK1RoaXMgbm9kZSByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgRENTUiBzcGFjZSBhbGxvY2F0ZWQgdG8KK3RoZSBSQ1BNIERlYnVnIENvbnRyb2xsZXIuIFRoaXMgZnVuY3Rpb25saXR5IGlzIGxpbWl0ZWQgdG8gdGhlCitjb250cm9sIHRoZSBkZWJ1ZyBvcGVyYXRpb25zIG9mIHRoZSBTb0MgYW5kIGNvcmVzLgorCitQUk9QRVJUSUVTCisKKwktIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZSBib3RoIGFuIGlkZW50aWZpZXIgc3BlY2lmaWMgdG8gdGhlIFNvQworCW9yIERlYnVnIElQIG9mIHRoZSBmb3JtICJmc2wsPHNvYz4tZGNzci1yY3BtIiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1yY3BtIi4KKworCS0gcmVnCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIERDU1Igc3BhY2UgcmVnaXN0ZXJzIG9mIHRoZSBkZXZpY2UKKwljb25maWd1cmF0aW9uIGJsb2NrLgorCitFWEFNUExFCisJCWRjc3ItcmNwbUAyMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29yZSBTZXJ2aWNlIEJyaWRnZSBQcm94eQorCitUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIERDU1Igc3BhY2UgYWxsb2NhdGVkIHRvCit0aGUgQ29yZSBTZXJ2aWNlIEJyaWRnZSBQcm94aWVzLgorVGhlcmUgaXMgb25lIENvcmUgU2VydmljZSBCcmlkZ2UgUHJveHkgZGV2aWNlIGZvciBlYWNoIENQVSBpbiB0aGUgc3lzdGVtLgorVGhpcyBmdW5jdGlvbmxpdHkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkZWJ1ZyBvcGVyYXRpb25zIG9mIHRoZSBDUFUuCisKK1BST1BFUlRJRVMKKworCS0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlIGJvdGggYW4gaWRlbnRpZmllciBzcGVjaWZpYyB0byB0aGUgY3B1CisJb2YgdGhlIGZvcm0gImZzbCxkY3NyLTxjcHU+LXNiLXByb3h5IiBpbiBhZGRpdGlvbiB0byB0aGUKKwlnZW5lcmljIGNvbXBhdGlibGUgc3RyaW5nICJmc2wsZGNzci1jcHUtc2ItcHJveHkiLgorCisJLSBjcHUtaGFuZGxlCisJVXNhZ2U6IHJlcXVpcmVkCisJRGVmaW5pdGlvbjogQSBwaGFuZGxlIHRvIGFzc29jaWF0ZSB0aGlzIGRlYnVnIG5vZGUgd2l0aCBpdHMgY3B1LgorCisJLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwlvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgRENTUiBzcGFjZSByZWdpc3RlcnMgb2YgdGhlIGRldmljZQorCWNvbmZpZ3VyYXRpb24gYmxvY2suCisKK0VYQU1QTEUKKwkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLAorCQkJCSAgICAgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwKKwkJCQkgICAgICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCQl9OworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21zaS1waWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21zaS1waWMudHh0CmluZGV4IDcwNTU4YzMuLjVkNTg2ZTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tc2ktcGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbXNpLXBpYy50eHQKQEAgLTI1LDYgKzI1LDE2IEBACiAgIGFyZSByb3V0ZWQgdG8gSVBJQywgYW5kIGZvciA4NXh4Lzg2eHggY3B1IHRoZSBpbnRlcnJ1cHRzIGFyZSByb3V0ZWQKICAgdG8gTVBJQy4KIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gbXNpLWFkZHJlc3MtNjQ6IDY0LWJpdCBQQ0kgYWRkcmVzcyBvZiB0aGUgTVNJSVIgcmVnaXN0ZXIuIFRoZSBNU0lJUiByZWdpc3RlcgorICBpcyB1c2VkIGZvciBNU0kgbWVzc2FnaW5nLiAgVGhlIGFkZHJlc3Mgb2YgTVNJSVIgaW4gUENJIGFkZHJlc3Mgc3BhY2UgaXMKKyAgdGhlIE1TSSBtZXNzYWdlIGFkZHJlc3MuCisKKyAgVGhpcyBwcm9wZXJ0eSBtYXkgYmUgdXNlZCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGh5cGVydmlzb3IKKyAgaGFzIGNyZWF0ZWQgYW4gYWx0ZXJuYXRlIG1hcHBpbmcgZm9yIHRoZSBNU0lSIGJsb2NrLiAgU2VlIGJlbG93IGZvciBhbgorICBleHBsYW5hdGlvbi4KKworCiBFeGFtcGxlOgogCW1zaUA0MTYwMCB7CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtbXNpIiwgImZzbCxtcGljLW1zaSI7CkBAIC00MSwzICs1MSwzNSBAQAogCQkJMHhlNyAwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJfTsKKworVGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yIGFuZCBtc2ktYWRkcmVzcy02NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm9ybWFsbHksIFBDSSBkZXZpY2VzIGhhdmUgYWNjZXNzIHRvIGFsbCBvZiBDQ1NSIHZpYSBhbiBBVE1VIG1hcHBpbmcuICBUaGUKK0ZyZWVzY2FsZSBNU0kgZHJpdmVyIGNhbGN1bGF0ZXMgdGhlIGFkZHJlc3Mgb2YgTVNJSVIgKGluIHRoZSBNU0kgcmVnaXN0ZXIKK2Jsb2NrKSBhbmQgc2V0cyB0aGF0IGFkZHJlc3MgYXMgdGhlIE1TSSBtZXNzYWdlIGFkZHJlc3MuCisKK0luIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIHRoZSBoeXBlcnZpc29yIG1heSBuZWVkIHRvIGNyZWF0ZSBhbiBJT01NVQorbWFwcGluZyBmb3IgTVNJSVIuICBUaGUgRnJlZXNjYWxlIGVQQVBSIGh5cGVydmlzb3IgaGFzIHRoaXMgcmVxdWlyZW1lbnQKK2JlY2F1c2Ugb2YgaGFyZHdhcmUgbGltaXRhdGlvbnMgb2YgdGhlIFBlcmlwaGVyYWwgQWNjZXNzIE1hbmFnZW1lbnQgVW5pdAorKFBBTVUpLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIG9ubHkgSU9NTVUgdGhhdCB0aGUgaHlwZXJ2aXNvciBzdXBwb3J0cy4KK1RoZSBBVE1VIGlzIHByb2dyYW1tZWQgd2l0aCB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcywgYW5kIHRoZSBQQU1VCitpbnRlcmNlcHRzIHRyYW5zYWN0aW9ucyBhbmQgcmVyb3V0ZXMgdGhlbSB0byB0aGUgdHJ1ZSBwaHlzaWNhbCBhZGRyZXNzLgorCitJbiB0aGUgUEFNVSwgZWFjaCBQQ0kgY29udHJvbGxlciBpcyBnaXZlbiBvbmx5IG9uZSBwcmltYXJ5IHdpbmRvdy4gIFRoZQorUEFNVSByZXN0cmljdHMgRE1BIG9wZXJhdGlvbnMgc28gdGhhdCB0aGV5IGNhbiBvbmx5IG9jY3VyIHdpdGhpbiBhIHdpbmRvdy4KK0JlY2F1c2UgUENJIGRldmljZXMgbXVzdCBiZSBhYmxlIHRvIERNQSB0byBtZW1vcnksIHRoZSBwcmltYXJ5IHdpbmRvdyBtdXN0CitiZSB1c2VkIHRvIGNvdmVyIGFsbCBvZiB0aGUgZ3Vlc3QncyBtZW1vcnkgc3BhY2UuCisKK1BBTVUgcHJpbWFyeSB3aW5kb3dzIGNhbiBiZSBkaXZpZGVkIGludG8gMjU2IHN1YndpbmRvd3MsIGFuZCBlYWNoCitzdWJ3aW5kb3cgY2FuIGhhdmUgaXRzIG93biBhZGRyZXNzIG1hcHBpbmcgKCJndWVzdCBwaHlzaWNhbCIgdG8gInRydWUKK3BoeXNpY2FsIikuICBIb3dldmVyLCBlYWNoIHN1YndpbmRvdyBoYXMgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQsIHdoaWNoCittZWFucyB0aGV5IGNhbm5vdCBiZSBsb2NhdGVkIGF0IGp1c3QgYW55IGFkZHJlc3MuICBCZWNhdXNlIG9mIHRoZXNlCityZXN0cmljdGlvbnMsIGl0IGlzIHVzdWFsbHkgaW1wb3NzaWJsZSB0byBjcmVhdGUgYSA0S0Igc3Vid2luZG93IHRoYXQKK2NvdmVycyBNU0lJUiB3aGVyZSBpdCdzIG5vcm1hbGx5IGxvY2F0ZWQuCisKK1RoZXJlZm9yZSwgdGhlIGh5cGVydmlzb3IgaGFzIHRvIGNyZWF0ZSBhIHN1YndpbmRvdyBpbnNpZGUgdGhlIHNhbWUKK3ByaW1hcnkgd2luZG93IHVzZWQgZm9yIG1lbW9yeSwgYnV0IG1hcHBlZCB0byB0aGUgTVNJUiBibG9jayAod2hlcmUgTVNJSVIKK2xpdmVzKS4gIFRoZSBmaXJzdCBzdWJ3aW5kb3cgYWZ0ZXIgdGhlIGVuZCBvZiBndWVzdCBtZW1vcnkgaXMgdXNlZCBmb3IKK3RoaXMuICBUaGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIG1zaS1hZGRyZXNzLTY0IHByb3BlcnR5IGlzIHRoZSBQQ0kKK2FkZHJlc3Mgb2YgTVNJSVIuICBUaGUgaHlwZXJ2aXNvciBjb25maWd1cmVzIHRoZSBQQU1VIHRvIG1hcCB0aGF0IGFkZHJlc3MgdG8KK3RoZSB0cnVlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgTVNJSVIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc29jL2NvZGVjcy9mc2wtc2d0bDUwMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NvYy9jb2RlY3MvZnNsLXNndGw1MDAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzNjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NvYy9jb2RlY3MvZnNsLXNndGw1MDAwLnR4dApAQCAtMCwwICsxLDExIEBACisqIEZyZWVzY2FsZSBTR1RMNTAwMCBTdGVyZW8gQ29kZWMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJmc2wsc2d0bDUwMDAiLgorCitFeGFtcGxlOgorCitjb2RlYzogc2d0bDUwMDBAMGEgeworCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwlyZWcgPSA8MHgwYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUxMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTEwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFhMzJiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUxMC50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NTEwIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NTEwIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg1MTBAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODUxMCI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1MjMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODUyMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3NDYxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1MjMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1dNODUyMyBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBJMkMgb25seS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODUyMyIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NTIzQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg1MjMiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTgwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg1ODAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTgyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NTgwLnR4dApAQCAtMCwwICsxLDE2IEBACitXTTg1ODAgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgSTJDIG9ubHkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg1ODAiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODU4MEAxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NTgwIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcxMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzExLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ5OTk4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcxMS50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NzExIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzExIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3MTFAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODcxMSI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MjgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODcyOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MjgudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODcyOCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODcyOCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzI4QDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3MjgiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzMxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3MzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjcwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzMxLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3MzEgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCBJMkMgYW5kIFNQSSAoY29uZmlndXJlZCB3aXRoIHBpbiBzdHJhcHBpbmcKK29uIHRoZSBib2FyZCkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg3MzEiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDLCB0aGUgY2hpcCBzZWxlY3QKKyAgICAgICAgICBudW1iZXIgZm9yIFNQSS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODczMUAxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzMxIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODczNy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmMyY2VhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODczNy50eHQKQEAgLTAsMCArMSwxOCBAQAorV004NzM3IGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzM3IgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3MzdAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODczNyI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NDEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc0MS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiZGE1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NDEudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODc0MSBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODc0MSIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzQxQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3NDEiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjIzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUwLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3NTAgYW5kIFdNODk4NyBhdWRpbyBDT0RFQ3MKKworVGhlc2UgZGV2aWNlcyBzdXBwb3J0IGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204NzUwIiBvciAid2xmLHdtODk4NyIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204NzUwQDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg3NTAiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg3NTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTI3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzUzLnR4dApAQCAtMCwwICsxLDE4IEBACitXTTg3NTMgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgYm90aCBJMkMgYW5kIFNQSSAoY29uZmlndXJlZCB3aXRoIHBpbiBzdHJhcHBpbmcKK29uIHRoZSBib2FyZCkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogIndsZix3bTg3NTMiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBmb3IgSTJDLCB0aGUgY2hpcCBzZWxlY3QKKyAgICAgICAgICBudW1iZXIgZm9yIFNQSS4KKworRXhhbXBsZToKKworY29kZWM6IHdtODczN0AxYSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzUzIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204NzcwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZlMDBjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3MC50eHQKQEAgLTAsMCArMSwxNiBAQAorV004NzcwIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIFNQSS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODc3MCIKKworICAtIHJlZyA6IHRoZSBjaGlwIHNlbGVjdCBudW1iZXIuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3NzBAMSB7CisJY29tcGF0aWJsZSA9ICJ3bGYsd204NzcwIjsKKwlyZWcgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3Ni50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvd204Nzc2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjljYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODc3Ni50eHQKQEAgLTAsMCArMSwxOCBAQAorV004Nzc2IGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIGJvdGggSTJDIGFuZCBTUEkgKGNvbmZpZ3VyZWQgd2l0aCBwaW4gc3RyYXBwaW5nCitvbiB0aGUgYm9hcmQpLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJ3bGYsd204Nzc2IgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CisgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCisKK0V4YW1wbGU6CisKK2NvZGVjOiB3bTg3NzZAMWEgeworCWNvbXBhdGlibGUgPSAid2xmLHdtODc3NiI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg4MDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODgwNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzYTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg4MDQudHh0CkBAIC0wLDAgKzEsMTggQEAKK1dNODgwNCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBib3RoIEkyQyBhbmQgU1BJIChjb25maWd1cmVkIHdpdGggcGluIHN0cmFwcGluZworb24gdGhlIGJvYXJkKS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAid2xmLHdtODgwNCIKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGZvciBJMkMsIHRoZSBjaGlwIHNlbGVjdAorICAgICAgICAgIG51bWJlciBmb3IgU1BJLgorCitFeGFtcGxlOgorCitjb2RlYzogd204ODA0QDFhIHsKKwljb21wYXRpYmxlID0gIndsZix3bTg4MDQiOworCXJlZyA9IDwweDFhPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9wbDAyMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9wbDAyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2ZWMzZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpX3BsMDIyLnR4dApAQCAtMCwwICsxLDEyIEBACitBUk0gUEwwMjIgU1BJIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJhcm0scGwwMjIiLCAiYXJtLHByaW1lY2VsbCIKKy0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gU1BJIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGNzLWdwaW9zIDogc2hvdWxkIHNwZWNpZnkgR1BJT3MgdXNlZCBmb3IgY2hpcHNlbGVjdHMuCisgIFRoZSBncGlvcyB3aWxsIGJlIHJlZmVycmVkIHRvIGFzIHJlZyA9IDxpbmRleD4gaW4gdGhlIFNQSSBjaGlsZCBub2Rlcy4KKyAgSWYgdW5zcGVjaWZpZWQsIGEgc2luZ2xlIFNQSSBkZXZpY2Ugd2l0aG91dCBhIGNoaXAgc2VsZWN0IGNhbiBiZSB1c2VkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9tc21fc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90dHkvc2VyaWFsL21zbV9zZXJpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjM4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9tc21fc2VyaWFsLnR4dApAQCAtMCwwICsxLDI3IEBACisqIFF1YWxjb21tIE1TTSBVQVJUCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOgorCS0gInFjb20sbXNtLXVhcnQiLCBhbmQgb25lIG9mICJxY29tLG1zbS1oc3VhcnQiIG9yCisJICAicWNvbSxtc20tbHN1YXJ0Ii4KKy0gcmVnIDogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQorCWZvciB0aGUgaHN1YXJ0IG9wZXJhdGluZyBpbiBjb21wYXRpYmxlIG1vZGUsIHRoZXJlIHNob3VsZCBiZSBhCisJc2Vjb25kIHBhaXIgZGVzY3JpYmluZyB0aGUgZ3NiaSByZWdpc3RlcnMuCistIGludGVycnVwdHMgOiBzaG91bGQgY29udGFpbiB0aGUgdWFydCBpbnRlcnJ1cHQuCisKK1RoZXJlIGFyZSB0d28gZGlmZmVyZW50IFVBUlQgYmxvY2tzIHVzZWQgaW4gTVNNIGRldmljZXMsCisicWNvbSxtc20taHN1YXJ0IiBhbmQgInFjb20sbXNtLWxzdWFydCIuICBUaGUgbXNtLXNlcmlhbCBkcml2ZXIgaXMKK2FibGUgdG8gaGFuZGxlIGJvdGggb2YgdGhlc2UsIGFuZCBtYXRjaGVzIGFnYWluc3QgdGhlICJxY29tLG1zbS11YXJ0IgorYXMgdGhlIGNvbXBhdGliaWxpdHkuCisKK1RoZSByZWdpc3RlcnMgZm9yIHRoZSAicWNvbSxtc20taHN1YXJ0IiBkZXZpY2UgbmVlZCB0byBzcGVjaWZ5IGJvdGgKK3JlZ2lzdGVyIGJsb2NrcywgZXZlbiBmb3IgdGhlIGNvbW1vbiBkcml2ZXIuCisKK0V4YW1wbGU6CisKKwl1YXJ0QDE5YzQwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taHN1YXJ0IiwgInFjb20sbXNtLXVhcnQiOworCQlyZWcgPSA8MHgxOWM0MDAwMCAweDEwMDA+LAorCQkgICAgICA8MHgxOWMwMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE5NT47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZlbmRvci1wcmVmaXhlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NTI3OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CkBAIC0wLDAgKzEsNDAgQEAKK0RldmljZSB0cmVlIGJpbmRpbmcgdmVuZG9yIHByZWZpeCByZWdpc3RyeS4gIEtlZXAgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisKK1RoaXMgaXNuJ3QgYW4gZXhoYXVzdGl2ZSBsaXN0LCBidXQgeW91IHNob3VsZCBhZGQgbmV3IHByZWZpeGVzIHRvIGl0IGJlZm9yZQordXNpbmcgdGhlbSB0byBhdm9pZCBuYW1lLXNwYWNlIGNvbGxpc2lvbnMuCisKK2FkaQlBbmFsb2cgRGV2aWNlcywgSW5jLgorYW1jYwlBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uIChBUE0sIGZvcm1hbGx5IEFNQ0MpCithcG0JQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbiAoQVBNKQorYXJtCUFSTSBMdGQuCithdG1lbAlBdG1lbCBDb3Jwb3JhdGlvbgorY2hycAlDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtCitkYWxsYXMJTWF4aW0gSW50ZWdyYXRlZCBQcm9kdWN0cyAoZm9ybWVybHkgRGFsbGFzIFNlbWljb25kdWN0b3IpCitkZW54CURlbnggU29mdHdhcmUgRW5naW5lZXJpbmcKK2Vwc29uCVNlaWtvIEVwc29uIENvcnAuCitlc3QJRVNUZWVtIFdpcmVsZXNzIE1vZGVtcworZnNsCUZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCitHRUZhbnVjCUdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCitnZWYJR0UgRmFudWMgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KK2hwCUhld2xldHQgUGFja2FyZAoraWJtCUludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgKElCTSkKK2lkdAlJbnRlZ3JhdGVkIERldmljZSBUZWNobm9sb2dpZXMsIEluYy4KK2ludGVyY29udHJvbAlJbnRlciBDb250cm9sIEdyb3VwCitsaW51eAlMaW51eC1zcGVjaWZpYyBiaW5kaW5nCittYXJ2ZWxsCU1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCittYXhpbQlNYXhpbSBJbnRlZ3JhdGVkIFByb2R1Y3RzCittb3NhaXh0ZWNoCU1vc2FpeCBUZWNobm9sb2dpZXMsIEluYy4KK25hdGlvbmFsCU5hdGlvbmFsIFNlbWljb25kdWN0b3IKK25pbnRlbmRvCU5pbnRlbmRvCitudmlkaWEJTlZJRElBCitueHAJTlhQIFNlbWljb25kdWN0b3JzCitwb3dlcnZyCUltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworcWNvbQlRdWFsY29tbSwgSW5jLgorcmFtdHJvbglSYW10cm9uIEludGVybmF0aW9uYWwKK3NhbXN1bmcJU2Ftc3VuZyBTZW1pY29uZHVjdG9yCitzY2hpbmRsZXIJU2NoaW5kbGVyCitzaW10ZWsKK3NpcmYJU2lSRiBUZWNobm9sb2d5LCBJbmMuCitzdGVyaWNzc29uCVNULUVyaWNzc29uCit0aQlUZXhhcyBJbnN0cnVtZW50cworeGxueAlYaWxpbngKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92aXJ0aW8vbW1pby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlydGlvL21taW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjljMWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmlydGlvL21taW8udHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogdmlydGlvIG1lbW9yeSBtYXBwZWQgZGV2aWNlCisKK1NlZSBodHRwOi8vb3psYWJzLm9yZy9+cnVzdHkvdmlydGlvLXNwZWMvIGZvciBtb3JlIGRldGFpbHMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZToJInZpcnRpbyxtbWlvIiBjb21wYXRpYmlsaXR5IHN0cmluZworLSByZWc6CQljb250cm9sIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgYW5kIHNpemUgaW5jbHVkaW5nIGNvbmZpZ3VyYXRpb24gc3BhY2UKKy0gaW50ZXJydXB0czoJaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCisKK0V4YW1wbGU6CisKKwl2aXJ0aW9fYmxvY2tAMzAwMCB7CisJCWNvbXBhdGlibGUgPSAidmlydGlvLG1taW8iOworCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDw0MT47CisJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZSBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKaW5kZXggYzQ2NmY1OC4uZTY3YmU3YSAxMDA3NTUKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCkBAIC0yNyw3ICsyNyw4IEBACiAJCSJvcjUxMjExIiwgIm9yNTExMzJfcWFtIiwgIm9yNTExMzJfdnNiIiwgImJsdWViaXJkIiwKIAkJIm9wZXJhMSIsICJjeDIzMXh4IiwgImN4MTgiLCAiY3gyMzg4NSIsICJwdnJ1c2IyIiwgIm1wYzcxOCIsCiAJCSJhZjkwMTUiLCAibmdlbmUiLCAiYXo2MDI3IiwgImxtZTI1MTBfbGciLCAibG1lMjUxMGNfczczOTUiLAotCQkibG1lMjUxMGNfczczOTVfb2xkIiwgImRyeGsiLCAiZHJ4a190ZXJyYXRlY19oNSIpOworCQkibG1lMjUxMGNfczczOTVfb2xkIiwgImRyeGsiLCAiZHJ4a190ZXJyYXRlY19oNSIsICJ0ZGExMDA3MSIsCisJCSJpdDkxMzUiICk7CiAKICMgQ2hlY2sgYXJncwogc3ludGF4KCkgaWYgKHNjYWxhcihAQVJHVikgIT0gMSk7CkBAIC01NzUsMTkgKzU3NiwxMCBAQAogfQogCiBzdWIgYXo2MDI3ewotICAgIG15ICRmaWxlID0gIkFaNjAyN19MaW51eF9Ecml2ZXIudGFyLmd6IjsKLSAgICBteSAkdXJsID0gImh0dHA6Ly9saW51eC50ZXJyYXRlYy5kZS9maWxlcy8kZmlsZSI7CiAgICAgbXkgJGZpcm13YXJlID0gImR2Yi11c2ItYXo2MDI3LTAzLmZ3IjsKKyAgICBteSAkdXJsID0gImh0dHA6Ly9saW51eC50ZXJyYXRlYy5kZS9maWxlcy9URVJSQVRFQ19TNy8kZmlybXdhcmUiOwogCi0gICAgd2dldGZpbGUoJGZpbGUsICR1cmwpOwotCi0gICAgI3VudGFyCi0gICAgaWYoIHN5c3RlbSgidGFyIHh6dmYgJGZpbGUgJGZpcm13YXJlIikpewotICAgICAgICBkaWUgImZhaWxlZCB0byB1bnRhciBmaXJtd2FyZSI7Ci0gICAgfQotICAgIGlmKCBzeXN0ZW0oInJtICRmaWxlIikpewotICAgICAgICBkaWUgKCJ1bmFibGUgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IGZpbGVzIik7Ci0gICAgfQorICAgIHdnZXRmaWxlKCRmaXJtd2FyZSwgJHVybCk7CiAKICAgICAkZmlybXdhcmU7CiB9CkBAIC02NjUsNiArNjU3LDQxIEBACiAgICAgIiRmd2ZpbGUiCiB9CiAKK3N1YiBpdDkxMzUgeworICAgIG15ICR1cmwgPSAiaHR0cDovL2t3b3JsZC5zZXJ2ZXIyNjEuY29tL2t3b3JsZC9DRC9JVEVfVGlWbWUvVjEuMDAvIjsKKyAgICBteSAkemlwZmlsZSA9ICJEcml2ZXJfVjEwLjMyMy4xLjA0MTIuMTAwNDEyLnppcCI7CisgICAgbXkgJGhhc2ggPSAiNzliNTk3ZGM2NDg2OThlZDY4MjA4NDVjMGM5ZDBkMzciOworICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyKERJUiA9PiAiL3RtcCIsIENMRUFOVVAgPT4gMCk7CisgICAgbXkgJGRydmZpbGUgPSAiRHJpdmVyX1YxMC4zMjMuMS4wNDEyLjEwMDQxMi9EYXRhL3g4Ni9JVDkxMzVCREEuc3lzIjsKKyAgICBteSAkZndmaWxlID0gImR2Yi11c2ItaXQ5MTM3LTAxLmZ3IjsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCR6aXBmaWxlLCAkdXJsIC4gJHppcGZpbGUpOworICAgIHZlcmlmeSgkemlwZmlsZSwgJGhhc2gpOworICAgIHVuemlwKCR6aXBmaWxlLCAkdG1wZGlyKTsKKyAgICBleHRyYWN0KCIkdG1wZGlyLyRkcnZmaWxlIiwgNjk2MzIsIDU3MzEsICIkZndmaWxlIik7CisKKyAgICAiJGZ3ZmlsZSIKK30KKworc3ViIHRkYTEwMDcxIHsKKyAgICBteSAkc291cmNlZmlsZSA9ICJQQ1RWXzQ2MGVfcmVmZXJlbmNlLnppcCI7CisgICAgbXkgJHVybCA9ICJmdHA6Ly9mdHAucGN0dnN5c3RlbXMuY29tL1RWL2RyaXZlci9QQ1RWJTIwNzBlJTIwODBlJTIwMTAwZSUyMDMyMGUlMjAzMzBlJTIwODAwZS8iOworICAgIG15ICRoYXNoID0gIjQ0MDNkZTkwM2JmMjU5MzQ2NGM4ZDc0YmJjMjAwYTU3IjsKKyAgICBteSAkZndmaWxlID0gImR2Yi1mZS10ZGExMDA3MS5mdyI7CisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIoRElSID0+ICIvdG1wIiwgQ0xFQU5VUCA9PiAxKTsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCRzb3VyY2VmaWxlLCAkdXJsIC4gJHNvdXJjZWZpbGUpOworICAgIHZlcmlmeSgkc291cmNlZmlsZSwgJGhhc2gpOworICAgIHVuemlwKCRzb3VyY2VmaWxlLCAkdG1wZGlyKTsKKyAgICBleHRyYWN0KCIkdG1wZGlyL1BDVFZcIDcwZVwgODBlXCAxMDBlXCAzMjBlXCAzMzBlXCA4MDBlLzMyXCBiaXQvZW1PRU0uc3lzIiwgMHg2N2QzOCwgNDA1MDQsICRmd2ZpbGUpOworCisgICAgIiRmd2ZpbGUiOworfQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBVdGlsaXRpZXMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvaXQ5MTM3LnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2l0OTEzNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NzI2ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2l0OTEzNy50eHQKQEAgLTAsMCArMSw5IEBACitUbyBleHRyYWN0IGZpcm13YXJlIGZvciBLd29ybGQgVUI0OTktMlQgKGlkIDFiODA6ZTQwOSkgeW91IG5lZWQgdG8gY29weSB0aGUKK2ZvbGxvd2luZyBmaWxlKHMpIHRvIHRoaXMgZGlyZWN0b3J5LgorCitJVDkxMzVCREEuc3lzIERhdGVkIE1vbiAyMiBNYXIgMjAxMCAwMjoyMDowOCBHTVQKKworZXh0cmFjdCB1c2luZyBkZAorZGQgaWY9SVQ5MTM1QkRBLnN5cyBpYnM9MSBza2lwPTY5NjMyIGNvdW50PTU3MzEgb2Y9ZHZiLXVzYi1pdDkxMzctMDEuZncKKworY29weSB0byBkZWZhdWx0IGZpcm13YXJlIGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggODJhNWQyNS4uYmE0YmU4YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0yMSw2ICsyMSwxMSBAQAogICAvc3lzL2Jsb2NrLzxkZXZpY2U+L21ha2UtaXQtZmFpbCBvcgogICAvc3lzL2Jsb2NrLzxkZXZpY2U+LzxwYXJ0aXRpb24+L21ha2UtaXQtZmFpbC4gKGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkpCiAKK28gZmFpbF9tbWNfcmVxdWVzdAorCisgIGluamVjdHMgTU1DIGRhdGEgZXJyb3JzIG9uIGRldmljZXMgcGVybWl0dGVkIGJ5IHNldHRpbmcKKyAgZGVidWdmcyBlbnRyaWVzIHVuZGVyIC9zeXMva2VybmVsL2RlYnVnL21tYzAvZmFpbF9tbWNfcmVxdWVzdAorCiBDb25maWd1cmUgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGllcyBiZWhhdmlvcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTE1LDcgKzEyMCw4IEBACiAKIAlmYWlsc2xhYj0KIAlmYWlsX3BhZ2VfYWxsb2M9Ci0JZmFpbF9tYWtlX3JlcXVlc3Q9PGludGVydmFsPiw8cHJvYmFiaWxpdHk+LDxzcGFjZT4sPHRpbWVzPgorCWZhaWxfbWFrZV9yZXF1ZXN0PQorCW1tY19jb3JlLmZhaWxfcmVxdWVzdD08aW50ZXJ2YWw+LDxwcm9iYWJpbGl0eT4sPHNwYWNlPiw8dGltZXM+CiAKIEhvdyB0byBhZGQgbmV3IGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXR5CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYi91ZGxmYi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dAppbmRleCA3ZmRkZTJhLi41N2QyZjI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZiL3VkbGZiLnR4dApAQCAtODcsMjMgKzg3LDM4IEBACiBvcHRpb25zLCBob3dldmVyLgogCiBGcm9tIHRoZSBjb21tYW5kIGxpbmUsIHBhc3Mgb3B0aW9ucyB0byBtb2Rwcm9iZQotbW9kcHJvYmUgdWRsZmIgZGVmaW89MSBjb25zb2xlPTEKK21vZHByb2JlIHVkbGZiIGZiX2RlZmlvPTAgY29uc29sZT0xIHNoYWRvdz0xCiAKLU9yIGZvciBwZXJtYW5lbnQgb3B0aW9uLCBjcmVhdGUgZmlsZSBsaWtlIC9ldGMvbW9kcHJvYmUuZC9vcHRpb25zIHdpdGggdGV4dAotb3B0aW9ucyB1ZGxmYiBkZWZpbz0xIGNvbnNvbGU9MQorT3IgbW9kaWZ5IG9wdGlvbnMgb24gdGhlIGZseSBhdCAvc3lzL21vZHVsZS91ZGxmYi9wYXJhbWV0ZXJzIGRpcmVjdG9yeSB2aWEKK3N1ZG8gbmFubyBmYl9kZWZpbworY2hhbmdlIHRoZSBwYXJhbWV0ZXIgaW4gcGxhY2UsIGFuZCBzYXZlIHRoZSBmaWxlLgogCi1BY2NlcHRlZCBvcHRpb25zOgorVW5wbHVnL3JlcGx1ZyBVU0IgZGV2aWNlIHRvIGFwcGx5IHdpdGggbmV3IHNldHRpbmdzCisKK09yIGZvciBwZXJtYW5lbnQgb3B0aW9uLCBjcmVhdGUgZmlsZSBsaWtlIC9ldGMvbW9kcHJvYmUuZC91ZGxmYi5jb25mIHdpdGggdGV4dAorb3B0aW9ucyB1ZGxmYiBmYl9kZWZpbz0wIGNvbnNvbGU9MSBzaGFkb3c9MQorCitBY2NlcHRlZCBib29sZWFuIG9wdGlvbnM6CiAKIGZiX2RlZmlvCU1ha2UgdXNlIG9mIHRoZSBmYl9kZWZpbyAoQ09ORklHX0ZCX0RFRkVSUkVEX0lPKSBrZXJuZWwKIAkJbW9kdWxlIHRvIHRyYWNrIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGZyYW1lYnVmZmVyIGJ5IHBhZ2UgZmF1bHRzLgotICAgICAgICAJU3RhbmRhcmQgZmJkZXYgYXBwbGljYXRpb25zIHRoYXQgdXNlIG1tYXAgYnV0IHRoYXQgZG8gbm90Ci0JCXJlcG9ydCBkYW1hZ2UsIG1heSBiZSBhYmxlIHRvIHdvcmsgd2l0aCB0aGlzIGVuYWJsZWQuCi0JCURpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBvZiBvdmVyaGVhZCBhbmQgb3RoZXIgaXNzdWVzLgorCQlTdGFuZGFyZCBmYmRldiBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbW1hcCBidXQgdGhhdCBkbyBub3QKKwkJcmVwb3J0IGRhbWFnZSwgc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRoIHRoaXMgZW5hYmxlZC4KKwkJRGlzYWJsZSB3aGVuIHJ1bm5pbmcgd2l0aCBYIHNlcnZlciB0aGF0IHN1cHBvcnRzIHJlcG9ydGluZworCQljaGFuZ2VkIHJlZ2lvbnMgdmlhIGlvY3RsLCBhcyB0aGlzIG1ldGhvZCBpcyBzaW1wbGVyLAorCQltb3JlIHN0YWJsZSwgYW5kIGhpZ2hlciBwZXJmb3JtYW5jZS4KKwkJZGVmYXVsdDogZmJfZGVmaW89MQogCi1jb25zb2xlCQlBbGxvdyBmYmNvbiB0byBhdHRhY2ggdG8gdWRsZmIgcHJvdmlkZWQgZnJhbWVidWZmZXJzLiBUaGlzCi0JCWlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBmYmNvbiB3aWxsIGFnZ3Jlc3NpdmVseSBjb25zdW1lCi0JCXRoZSBmaXJzdCBmcmFtZWJ1ZmZlciBpdCBmaW5kcywgd2hpY2ggaXNuJ3QgdXN1YWxseSB3aGF0IHRoZQotCQl1c2VyIHdhbnRzIGluIHRoZSBjYXNlIG9mIFVTQiBkaXNwbGF5cy4KK2NvbnNvbGUJQWxsb3cgZmJjb24gdG8gYXR0YWNoIHRvIHVkbGZiIHByb3ZpZGVkIGZyYW1lYnVmZmVycy4KKwkJQ2FuIGJlIGRpc2FibGVkIGlmIGZiY29uIGFuZCBvdGhlciBjbGllbnRzCisJCShlLmcuIFggd2l0aCAtLXNoYXJlZC12dCkgYXJlIGluIGNvbmZsaWN0LgorCQlkZWZhdWx0OiBjb25zb2xlPTEKKworc2hhZG93CQlBbGxvY2F0ZSBhIDJuZCBmcmFtZWJ1ZmZlciB0byBzaGFkb3cgd2hhdCdzIGN1cnJlbnRseSBhY3Jvc3MKKwkJdGhlIFVTQiBidXMgaW4gZGV2aWNlIG1lbW9yeS4gSWYgYW55IHBpeGVscyBhcmUgdW5jaGFuZ2VkLAorCQlkbyBub3QgdHJhbnNtaXQuIFNwZW5kcyBob3N0IG1lbW9yeSB0byBzYXZlIFVTQiB0cmFuc2ZlcnMuCisJCUVuYWJsZWQgYnkgZGVmYXVsdC4gT25seSBkaXNhYmxlIG9uIHZlcnkgbG93IG1lbW9yeSBzeXN0ZW1zLgorCQlkZWZhdWx0OiBzaGFkb3c9MQogCiBTeXNmcyBBdHRyaWJ1dGVzCiA9PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZDVhYzM2Mi4uMzNmNzMyNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMTMzLDQxICsxMzMsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJc3lzX3N5c2N0bAotV2hlbjoJU2VwdGVtYmVyIDIwMTAKLU9wdGlvbjogQ09ORklHX1NZU0NUTF9TWVNDQUxMCi1XaHk6CVRoZSBzYW1lIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiBhIG1vcmUgY29udmVuaWVudCBmcm9tCi0JL3Byb2Mvc3lzLCBhbmQgbm9uZSBvZiB0aGUgc3lzY3RsIHZhcmlhYmxlcyBhcHBlYXIgdG8gYmUKLQlpbXBvcnRhbnQgcGVyZm9ybWFuY2Ugd2lzZS4KLQotCUJpbmFyeSBzeXNjdGxzIGFyZSBhIGxvbmcgc3RhbmRpbmcgc291cmNlIG9mIHN1YnRsZSBrZXJuZWwKLQlidWdzIGFuZCBzZWN1cml0eSBpc3N1ZXMuCi0KLQlXaGVuIEkgbG9va2VkIHNldmVyYWwgbW9udGhzIGFnbyBhbGwgSSBjb3VsZCBmaW5kIGFmdGVyCi0Jc2VhcmNoaW5nIHNldmVyYWwgZGlzdHJpYnV0aW9ucyB3ZXJlIDUgdXNlciBzcGFjZSBwcm9ncmFtcyBhbmQKLQlnbGliYyAod2hpY2ggZmFsbHMgYmFjayB0byAvcHJvYy9zeXMpIHVzaW5nIHRoaXMgc3lzY2FsbC4KLQotCVRoZSBtYW4gcGFnZSBmb3Igc3lzY3RsKDIpIGRvY3VtZW50cyBpdCBhcyB1bnVzYWJsZSBmb3IgdXNlcgotCXNwYWNlIHByb2dyYW1zLgotCi0Jc3lzY3RsKDIpIGlzIG5vdCBnZW5lcmFsbHkgQUJJIGNvbXBhdGlibGUgdG8gYSAzMmJpdCB1c2VyCi0Jc3BhY2UgYXBwbGljYXRpb24gb24gYSA2NGJpdCBhbmQgYSAzMmJpdCBrZXJuZWwuCi0KLQlGb3IgdGhlIGxhc3Qgc2V2ZXJhbCBtb250aHMgdGhlIHBvbGljeSBoYXMgYmVlbiBubyBuZXcgYmluYXJ5Ci0Jc3lzY3RscyBhbmQgbm8gb25lIGhhcyBwdXQgZm9yd2FyZCBhbiBhcmd1bWVudCB0byB1c2UgdGhlbS4KLQotCUJpbmFyeSBzeXNjdGxzIGlzc3VlcyBzZWVtIHRvIGtlZXAgaGFwcGVuaW5nIGFwcGVhcmluZyBzbwotCXByb3Blcmx5IGRlcHJlY2F0aW5nIHRoZW0gKHdpdGggYSB3YXJuaW5nIHRvIHVzZXIgc3BhY2UpIGFuZCBhCi0JMiB5ZWFyIGdyYWNlIHdhcm5pbmcgcGVyaW9kIHdpbGwgbWVhbiBldmVudHVhbGx5IHdlIGNhbiBraWxsCi0JdGhlbSBhbmQgZW5kIHRoZSBwYWluLgotCi0JSW4gdGhlIG1lYW4gdGltZSBpbmRpdmlkdWFsIGJpbmFyeSBzeXNjdGxzIGNhbiBiZSBkZWFsdCB3aXRoCi0JaW4gYSBwaWVjZXdpc2UgZmFzaGlvbi4KLQotV2hvOglFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJL3Byb2MvPHBpZD4vb29tX2FkagogV2hlbjoJQXVndXN0IDIwMTIKIFdoeToJL3Byb2MvPHBpZD4vb29tX2FkaiBhbGxvd3MgdXNlcnNwYWNlIHRvIGluZmx1ZW5jZSB0aGUgb29tIGtpbGxlcidzCkBAIC0yOTgsOCArMjYzLDcgQEAKIAogV2hhdDoJQ29kZSB0aGF0IGlzIG5vdyB1bmRlciBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTCiAJKGluIG5ldC9jb3JlL25ldC1zeXNmcy5jKQotV2hlbjoJQWZ0ZXIgdGhlIG9ubHkgdXNlciAoaGFsKSBoYXMgc2VlbiBhIHJlbGVhc2Ugd2l0aCB0aGUgcGF0Y2hlcwotCWZvciBlbm91Z2ggdGltZSwgcHJvYmFibHkgc29tZSB0aW1lIGluIDIwMTAuCitXaGVuOgkzLjUKIFdoeToJT3ZlciAxSyAudGV4dC8uZGF0YSBzaXplIHJlZHVjdGlvbiwgZGF0YSBpcyBhdmFpbGFibGUgaW4gb3RoZXIKIAl3YXlzIChpb2N0bHMpCiBXaG86CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CkBAIC00OTUsMjkgKzQ1OSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJU3VwcG9ydCBmb3IgVVZDSU9DX0NUUkxfQUREIGluIHRoZSB1dmN2aWRlbyBkcml2ZXIKLVdoZW46CTMuMgotV2h5OglUaGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHRoZSBkcml2ZXIgYnkgdGhpcyBpb2N0bCBpcyBub3cgcXVlcmllZAotCWR5bmFtaWNhbGx5IGZyb20gdGhlIGRldmljZS4KLVdobzoJTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoYXQ6CVN1cHBvcnQgZm9yIFVWQ0lPQ19DVFJMX01BUF9PTEQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMy4yCi1XaHk6CVVzZWQgb25seSBieSBhcHBsaWNhdGlvbnMgY29tcGlsZWQgYWdhaW5zdCBvbGRlciBkcml2ZXIgdmVyc2lvbnMuCi0JU3VwZXJzZWRlZCBieSBVVkNJT0NfQ1RSTF9NQVAgd2hpY2ggc3VwcG9ydHMgVjRMMiBtZW51IGNvbnRyb2xzLgotV2hvOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJU3VwcG9ydCBmb3IgVVZDSU9DX0NUUkxfR0VUIGFuZCBVVkNJT0NfQ1RSTF9TRVQgaW4gdGhlIHV2Y3ZpZGVvIGRyaXZlcgotV2hlbjoJMy4yCi1XaHk6CVN1cGVyc2VkZWQgYnkgdGhlIFVWQ0lPQ19DVFJMX1FVRVJZIGlvY3RsLgotV2hvOglMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJU3VwcG9ydCBmb3IgZHJpdmVyIHNwZWNpZmljIGlvY3RscyBpbiB0aGUgcHdjIGRyaXZlciAoZXZlcnl0aGluZwogCWRlZmluZWQgaW4gbWVkaWEvcHdjLWlvY3RsLmgpCiBXaGVuOgkzLjMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwppbmRleCA2NTMzODA3Li5kODE5YmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCkBAIC0yOSw2ICsyOSw3IEBACiBkX2NvbXBhcmU6CXllcwkJbm8JCW5vCQltYXliZQogZF9kZWxldGU6CW5vCQl5ZXMJCW5vCQlubwogZF9yZWxlYXNlOglubwkJbm8JCXllcwkJbm8KK2RfcHJ1bmU6ICAgICAgICBubyAgICAgICAgICAgICAgeWVzICAgICAgICAgICAgIG5vICAgICAgICAgICAgICBubwogZF9pcHV0OgkJbm8JCW5vCQl5ZXMJCW5vCiBkX2RuYW1lOglubwkJbm8JCW5vCQlubwogZF9hdXRvbW91bnQ6CW5vCQlubwkJeWVzCQlubwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0My50eHQKaW5kZXggMjJmM2EwZS4uYjEwMGFkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDMudHh0CkBAIC03MywxNCArNzMsNiBAQAogCQkJYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGJhcnJpZXJzLCBmb3IKIAkJCWNvbnNpc3RlbmN5IHdpdGggb3RoZXIgZXh0MyBtb3VudCBvcHRpb25zLgogCi1vcmxvdgkJKCopCVRoaXMgZW5hYmxlcyB0aGUgbmV3IE9ybG92IGJsb2NrIGFsbG9jYXRvci4gSXQgaXMKLQkJCWVuYWJsZWQgYnkgZGVmYXVsdC4KLQotb2xkYWxsb2MJCVRoaXMgZGlzYWJsZXMgdGhlIE9ybG92IGJsb2NrIGFsbG9jYXRvciBhbmQgZW5hYmxlcwotCQkJdGhlIG9sZCBibG9jayBhbGxvY2F0b3IuICBPcmxvdiBzaG91bGQgaGF2ZSBiZXR0ZXIKLQkJCXBlcmZvcm1hbmNlIC0gd2UnZCBsaWtlIHRvIGdldCBzb21lIGZlZWRiYWNrIGlmIGl0J3MKLQkJCXRoZSBjb250cmFyeSBmb3IgeW91LgotCiB1c2VyX3hhdHRyCQlFbmFibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4gIEFkZGl0aW9uYWxseSwgeW91CiAJCQluZWVkIHRvIGhhdmUgZXh0ZW5kZWQgYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUKIAkJCWtlcm5lbCBjb25maWd1cmF0aW9uIChDT05GSUdfRVhUM19GU19YQVRUUikuICBTZWUgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dAppbmRleCAyMzJhNTc1Li40OTE3Y2YyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKQEAgLTE2MCw3ICsxNjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgCWxlYWQgdG8gYW55IG51bWJlciBvZiBwcm9ibGVtcy4KIAogZGF0YT1qb3VybmFsCQlBbGwgZGF0YSBhcmUgY29tbWl0dGVkIGludG8gdGhlIGpvdXJuYWwgcHJpb3IgdG8gYmVpbmcKLQkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbS4KKwkJCXdyaXR0ZW4gaW50byB0aGUgbWFpbiBmaWxlIHN5c3RlbS4gIEVuYWJsaW5nCisJCQl0aGlzIG1vZGUgd2lsbCBkaXNhYmxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBhbmQKKwkJCU9fRElSRUNUIHN1cHBvcnQuCiAKIGRhdGE9b3JkZXJlZAkoKikJQWxsIGRhdGEgYXJlIGZvcmNlZCBkaXJlY3RseSBvdXQgdG8gdGhlIG1haW4gZmlsZQogCQkJc3lzdGVtIHByaW9yIHRvIGl0cyBtZXRhZGF0YSBiZWluZyBjb21taXR0ZWQgdG8gdGhlCkBAIC0yMDEsMzAgKzIwMywxOSBAQAogCQkJdGFibGUgcmVhZGFoZWFkIGFsZ29yaXRobSB3aWxsIHByZS1yZWFkIGludG8KIAkJCXRoZSBidWZmZXIgY2FjaGUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMiBibG9ja3MuCiAKLW9ybG92CQkoKikJVGhpcyBlbmFibGVzIHRoZSBuZXcgT3Jsb3YgYmxvY2sgYWxsb2NhdG9yLiBJdCBpcwotCQkJZW5hYmxlZCBieSBkZWZhdWx0LgotCi1vbGRhbGxvYwkJVGhpcyBkaXNhYmxlcyB0aGUgT3Jsb3YgYmxvY2sgYWxsb2NhdG9yIGFuZCBlbmFibGVzCi0JCQl0aGUgb2xkIGJsb2NrIGFsbG9jYXRvci4gIE9ybG92IHNob3VsZCBoYXZlIGJldHRlcgotCQkJcGVyZm9ybWFuY2UgLSB3ZSdkIGxpa2UgdG8gZ2V0IHNvbWUgZmVlZGJhY2sgaWYgaXQncwotCQkJdGhlIGNvbnRyYXJ5IGZvciB5b3UuCi0KLXVzZXJfeGF0dHIJCUVuYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLiAgQWRkaXRpb25hbGx5LCB5b3UKLQkJCW5lZWQgdG8gaGF2ZSBleHRlbmRlZCBhdHRyaWJ1dGUgc3VwcG9ydCBlbmFibGVkIGluIHRoZQotCQkJa2VybmVsIGNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQ0X0ZTX1hBVFRSKS4gIFNlZSB0aGUKLQkJCWF0dHIoNSkgbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIHRvCi0JCQlsZWFybiBtb3JlIGFib3V0IGV4dGVuZGVkIGF0dHJpYnV0ZXMuCi0KLW5vdXNlcl94YXR0cgkJRGlzYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLgotCi1hY2wJCQlFbmFibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIHN1cHBvcnQuCi0JCQlBZGRpdGlvbmFsbHksIHlvdSBuZWVkIHRvIGhhdmUgQUNMIHN1cHBvcnQgZW5hYmxlZCBpbgotCQkJdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIChDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wpLgotCQkJU2VlIHRoZSBhY2woNSkgbWFudWFsIHBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvCi0JCQlmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK25vdXNlcl94YXR0cgkJRGlzYWJsZXMgRXh0ZW5kZWQgVXNlciBBdHRyaWJ1dGVzLiBJZiB5b3UgaGF2ZSBleHRlbmRlZAorCQkJYXR0cmlidXRlIHN1cHBvcnQgZW5hYmxlZCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24KKwkJCShDT05GSUdfRVhUNF9GU19YQVRUUiksIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdXBwb3J0CisJCQlpcyBlbmFibGVkIGJ5IGRlZmF1bHQgb24gbW91bnQuIFNlZSB0aGUgYXR0cig1KSBtYW51YWwKKwkJCXBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIGZvciBtb3JlIGluZm9ybWF0aW9uCisJCQlhYm91dCBleHRlbmRlZCBhdHRyaWJ1dGVzLgogCiBub2FjbAkJCVRoaXMgb3B0aW9uIGRpc2FibGVzIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3QKLQkJCXN1cHBvcnQuCisJCQlzdXBwb3J0LiBJZiBBQ0wgc3VwcG9ydCBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwKKwkJCWNvbmZpZ3VyYXRpb24gKENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCksIEFDTCBpcworCQkJZW5hYmxlZCBieSBkZWZhdWx0IG9uIG1vdW50LiBTZWUgdGhlIGFjbCg1KSBtYW51YWwKKwkJCXBhZ2UgYW5kIGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvIGZvciBtb3JlIGluZm9ybWF0aW9uCisJCQlhYm91dCBhY2wuCiAKIGJzZGRmCQkoKikJTWFrZSAnZGYnIGFjdCBsaWtlIEJTRC4KIG1pbml4ZGYJCQlNYWtlICdkZicgYWN0IGxpa2UgTWluaXguCkBAIC00MTksOCArNDEwLDggQEAKIEluIHRoZSBldmVudCBvZiBhIGNyYXNoLCB0aGUgam91cm5hbCBjYW4gYmUgcmVwbGF5ZWQsIGJyaW5naW5nIGJvdGggZGF0YSBhbmQKIG1ldGFkYXRhIGludG8gYSBjb25zaXN0ZW50IHN0YXRlLiAgVGhpcyBtb2RlIGlzIHRoZSBzbG93ZXN0IGV4Y2VwdCB3aGVuIGRhdGEKIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhbmQgd3JpdHRlbiB0byBkaXNrIGF0IHRoZSBzYW1lIHRpbWUgd2hlcmUgaXQKLW91dHBlcmZvcm1zIGFsbCBvdGhlcnMgbW9kZXMuICBDdXJyZW50bHkgZXh0NCBkb2VzIG5vdCBoYXZlIGRlbGF5ZWQKLWFsbG9jYXRpb24gc3VwcG9ydCBpZiB0aGlzIGRhdGEgam91cm5hbGxpbmcgbW9kZSBpcyBzZWxlY3RlZC4KK291dHBlcmZvcm1zIGFsbCBvdGhlcnMgbW9kZXMuICBFbmFibGluZyB0aGlzIG1vZGUgd2lsbCBkaXNhYmxlIGRlbGF5ZWQKK2FsbG9jYXRpb24gYW5kIE9fRElSRUNUIHN1cHBvcnQuCiAKIC9wcm9jIGVudHJpZXMKID09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dAppbmRleCBiZDBmYTc3MC4uZDA5NmRmNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9oZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaGZzLnR4dApAQCAtMSwzICsxLDQgQEAKK05vdGU6IFRoaXMgZmlsZXN5c3RlbSBkb2Vzbid0IGhhdmUgYSBtYWludGFpbmVyLgogCiBNYWNpbnRvc2ggSEZTIEZpbGVzeXN0ZW0gZm9yIExpbnV4CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03Niw4ICs3Nyw2IEBACiBDcmVkaXRzCiA9PT09PT09CiAKLVRoZSBIRlMgZHJpdmVycyB3YXMgd3JpdHRlbiBieSBQYXVsIEguIEhhcmdyb3ZlYSAoaGFyZ3JvdmVAc2NjbS5TdGFuZm9yZC5FRFUpCi1hbmQgaXMgbm93IG1haW50YWluZWQgYnkgUm9tYW4gWmlwcGVsIChyb21hbkBhcmRpc3RlY2guY29tKSBhdCBBcmRpcwotVGVjaG5vbG9naWVzLgotUm9tYW4gcmV3cm90ZSBsYXJnZSBwYXJ0cyBvZiB0aGUgY29kZSBhbmQgYnJvdWdodCBpbiBidHJlZSByb3V0aW5lcyBkZXJpdmVkCi1mcm9tIEJyYWQgQm95ZXIncyBoZnNwbHVzIGRyaXZlciAoYWxzbyBtYWludGFpbmVkIGJ5IFJvbWFuIG5vdykuCitUaGUgSEZTIGRyaXZlcnMgd2FzIHdyaXR0ZW4gYnkgUGF1bCBILiBIYXJncm92ZWEgKGhhcmdyb3ZlQHNjY20uU3RhbmZvcmQuRURVKS4KK1JvbWFuIFppcHBlbCAocm9tYW5AYXJkaXN0ZWNoLmNvbSkgcmV3cm90ZSBsYXJnZSBwYXJ0cyBvZiB0aGUgY29kZSBhbmQgYnJvdWdodAoraW4gYnRyZWUgcm91dGluZXMgZGVyaXZlZCBmcm9tIEJyYWQgQm95ZXIncyBoZnNwbHVzIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0CmluZGV4IDU5YTkxOWYuLmNmZDAyNzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pbm90aWZ5LnR4dApAQCAtMTk0LDcgKzE5NCw4IEBACiBFYWNoIHdhdGNoIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm90aWZ5X3dhdGNoIHN0cnVjdHVyZS4gIFdhdGNoZXMgYXJlIGNoYWluZWQKIG9mZiBvZiBlYWNoIGFzc29jaWF0ZWQgaW5vdGlmeV9oYW5kbGUgYW5kIGVhY2ggYXNzb2NpYXRlZCBpbm9kZS4KIAotU2VlIGZzL2lub3RpZnkuYyBhbmQgZnMvaW5vdGlmeV91c2VyLmMgZm9yIHRoZSBsb2NraW5nIGFuZCBsaWZldGltZSBydWxlcy4KK1NlZSBmcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X2Zzbm90aWZ5LmMgYW5kIGZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnlfdXNlci5jCitmb3IgdGhlIGxvY2tpbmcgYW5kIGxpZmV0aW1lIHJ1bGVzLgogCiAKICh2aSkgUmF0aW9uYWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZiBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCmluZGV4IDc2ZmZlZjkuLjNmNDRkYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmCkBAIC0xNCw2ICsxNCwxMCBAQAogICAgIFByZWZpeDogJ3c4MzYyN2RoZycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSVNBIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gU3VwZXIgSS9PIHJlZ2lzdGVycwogICAgIERhdGFzaGVldDogbm90IGF2YWlsYWJsZQorICAqIFdpbmJvbmQgVzgzNjI3VUhHCisgICAgUHJlZml4OiAndzgzNjI3dWhnJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJU0EgYWRkcmVzcyByZXRyaWV2ZWQgZnJvbSBTdXBlciBJL08gcmVnaXN0ZXJzCisgICAgRGF0YXNoZWV0OiBhdmFpbGFibGUgZnJvbSB3d3cubnV2b3Rvbi5jb20KICAgKiBXaW5ib25kIFc4MzY2N0hHCiAgICAgUHJlZml4OiAndzgzNjY3aGcnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IElTQSBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIFN1cGVyIEkvTyByZWdpc3RlcnMKQEAgLTQyLDE0ICs0NiwxMyBAQAogLS0tLS0tLS0tLS0KIAogVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2MjdFSEYsIFc4MzYyN0VIRywKLVc4MzYyN0RIRywgVzgzNjI3REhHLVAsIFc4MzY2N0hHLCBXODM2NjdIRy1CLCBXODM2NjdIRy1JIChOQ1Q2Nzc1RiksCi1hbmQgTkNUNjc3NkYgc3VwZXIgSS9PIGNoaXBzLiBXZSB3aWxsIHJlZmVyIHRvIHRoZW0gY29sbGVjdGl2ZWx5IGFzCi1XaW5ib25kIGNoaXBzLgorVzgzNjI3REhHLCBXODM2MjdESEctUCwgVzgzNjI3VUhHLCBXODM2NjdIRywgVzgzNjY3SEctQiwgVzgzNjY3SEctSQorKE5DVDY3NzVGKSwgYW5kIE5DVDY3NzZGIHN1cGVyIEkvTyBjaGlwcy4gV2Ugd2lsbCByZWZlciB0byB0aGVtIGNvbGxlY3RpdmVseQorYXMgV2luYm9uZCBjaGlwcy4KIAotVGhlIGNoaXBzIGltcGxlbWVudCB0aHJlZSB0ZW1wZXJhdHVyZSBzZW5zb3JzICh1cCB0byBmb3VyIGZvciA2NjdIRy1CLCBhbmQgbmluZQotZm9yIE5DVDY3NzVGIGFuZCBOQ1Q2Nzc2RiksIGZpdmUgZmFuIHJvdGF0aW9uIHNwZWVkIHNlbnNvcnMsIHRlbiBhbmFsb2cgdm9sdGFnZQotc2Vuc29ycyAob25seSBuaW5lIGZvciB0aGUgNjI3REhHKSwgb25lIFZJRCAoNiBwaW5zIGZvciB0aGUgNjI3RUhGL0VIRywgOCBwaW5zCi1mb3IgdGhlIDYyN0RIRyBhbmQgNjY3SEcpLCBhbGFybXMgd2l0aCBiZWVwIHdhcm5pbmdzIChjb250cm9sIHVuaW1wbGVtZW50ZWQpLAorVGhlIGNoaXBzIGltcGxlbWVudCAyIHRvIDQgdGVtcGVyYXR1cmUgc2Vuc29ycyAoOSBmb3IgTkNUNjc3NUYgYW5kIE5DVDY3NzZGKSwKKzIgdG8gNSBmYW4gcm90YXRpb24gc3BlZWQgc2Vuc29ycywgOCB0byAxMCBhbmFsb2cgdm9sdGFnZSBzZW5zb3JzLCBvbmUgVklECisoZXhjZXB0IGZvciA2MjdVSEcpLCBhbGFybXMgd2l0aCBiZWVwIHdhcm5pbmdzIChjb250cm9sIHVuaW1wbGVtZW50ZWQpLAogYW5kIHNvbWUgYXV0b21hdGljIGZhbiByZWd1bGF0aW9uIHN0cmF0ZWdpZXMgKHBsdXMgbWFudWFsIGZhbiBjb250cm9sIG1vZGUpLgogCiBUaGUgdGVtcGVyYXR1cmUgc2Vuc29yIHNvdXJjZXMgb24gVzgyNjc3SEctQiwgTkNUNjc3NUYsIGFuZCBOQ1Q2Nzc2RiBhcmUKQEAgLTg2LDE3ICs4OSwxNiBAQAogCiB0ZW1wMSAtPiBwd20xCiB0ZW1wMiAtPiBwd20yCi10ZW1wMyAtPiBwd20zCit0ZW1wMyAtPiBwd20zIChub3Qgb24gNjI3VUhHKQogcHJvZyAgLT4gcHdtNCAobm90IG9uIDY2N0hHIGFuZCA2NjdIRy1COyB0aGUgcHJvZ3JhbW1hYmxlIHNldHRpbmcgaXMgbm90CiAJICAgICAgIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyKQogCiAvc3lzIGZpbGVzCiAtLS0tLS0tLS0tCiAKLW5hbWUgLSB0aGlzIGlzIGEgc3RhbmRhcmQgaHdtb24gZGV2aWNlIGVudHJ5LiBGb3IgdGhlIFc4MzYyN0VIRiBhbmQgVzgzNjI3RUhHLAotICAgICAgIGl0IGlzIHNldCB0byAidzgzNjI3ZWhmIiwgZm9yIHRoZSBXODM2MjdESEcgaXQgaXMgc2V0IHRvICJ3ODM2MjdkaGciLAotICAgICAgIGZvciB0aGUgVzgzNjY3SEcgYW5kIFc4MzY2N0hHLUIgaXQgaXMgc2V0IHRvICJ3ODM2NjdoZyIsIGZvciBOQ1Q2Nzc1RiBpdAotICAgICAgIGlzIHNldCB0byAibmN0Njc3NSIsIGFuZCBmb3IgTkNUNjc3NkYgaXQgaXMgc2V0IHRvICJuY3Q2Nzc2Ii4KK25hbWUgLSB0aGlzIGlzIGEgc3RhbmRhcmQgaHdtb24gZGV2aWNlIGVudHJ5LCBpdCBjb250YWlucyB0aGUgbmFtZSBvZgorICAgICAgIHRoZSBkZXZpY2UgKHNlZSB0aGUgcHJlZml4IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzIGF0CisgICAgICAgdGhlIHRvcCBvZiB0aGlzIGZpbGUpCiAKIHB3bVsxLTRdIC0gdGhpcyBmaWxlIHN0b3JlcyBQV00gZHV0eSBjeWNsZSBvciBEQyB2YWx1ZSAoZmFuIHNwZWVkKSBpbiByYW5nZToKIAkgICAwIChzdG9wKSB0byAyNTUgKGZ1bGwpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3c3BpbmxvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9od3NwaW5sb2NrLnR4dAppbmRleCA3ZGNkMWE0Li5hOTAzZWU1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3c3BpbmxvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHdzcGlubG9jay50eHQKQEAgLTM5LDIzICszOSwyMCBAQAogICAgICBpbiBjYXNlIGFuIHVudXNlZCBod3NwaW5sb2NrIGlzbid0IGF2YWlsYWJsZS4gVXNlcnMgb2YgdGhpcwogICAgICBBUEkgd2lsbCB1c3VhbGx5IHdhbnQgdG8gY29tbXVuaWNhdGUgdGhlIGxvY2sncyBpZCB0byB0aGUgcmVtb3RlIGNvcmUKICAgICAgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgc3luY2hyb25pemF0aW9uLgotICAgICBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2xlZXApIGJ1dAotICAgICBub3QgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApLgogCiAgIHN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja19yZXF1ZXN0X3NwZWNpZmljKHVuc2lnbmVkIGludCBpZCk7CiAgICAtIGFzc2lnbiBhIHNwZWNpZmljIGh3c3BpbmxvY2sgaWQgYW5kIHJldHVybiBpdHMgYWRkcmVzcywgb3IgTlVMTAogICAgICBpZiB0aGF0IGh3c3BpbmxvY2sgaXMgYWxyZWFkeSBpbiB1c2UuIFVzdWFsbHkgYm9hcmQgY29kZSB3aWxsCiAgICAgIGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byByZXNlcnZlIHNwZWNpZmljIGh3c3BpbmxvY2sKICAgICAgaWRzIGZvciBwcmVkZWZpbmVkIHB1cnBvc2VzLgotICAgICBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgc2xlZXApIGJ1dAotICAgICBub3QgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApLgogCiAgIGludCBod3NwaW5fbG9ja19mcmVlKHN0cnVjdCBod3NwaW5sb2NrICpod2xvY2spOwogICAgLSBmcmVlIGEgcHJldmlvdXNseS1hc3NpZ25lZCBod3NwaW5sb2NrOyByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4KICAgICAgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlIChlLmcuIC1FSU5WQUwgaWYgdGhlIGh3c3BpbmxvY2sKICAgICAgaXMgYWxyZWFkeSBmcmVlKS4KLSAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIGFuIGF0b21pYyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHNsZWVwKSBidXQKLSAgICAgbm90IGZyb20gd2l0aGluIGludGVycnVwdCBjb250ZXh0LgorICAgICBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKS4KIAogICBpbnQgaHdzcGluX2xvY2tfdGltZW91dChzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrLCB1bnNpZ25lZCBpbnQgdGltZW91dCk7CiAgICAtIGxvY2sgYSBwcmV2aW91c2x5LWFzc2lnbmVkIGh3c3BpbmxvY2sgd2l0aCBhIHRpbWVvdXQgbGltaXQgKHNwZWNpZmllZCBpbgpAQCAtMjMwLDQ1ICsyMjcsNjIgQEAKIAogNC4gQVBJIGZvciBpbXBsZW1lbnRvcnMKIAotICBpbnQgaHdzcGluX2xvY2tfcmVnaXN0ZXIoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jayk7CisgIGludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmssIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHMsIGludCBiYXNlX2lkLCBpbnQgbnVtX2xvY2tzKTsKICAgIC0gdG8gYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24sIGluCi0gICAgIG9yZGVyIHRvIHJlZ2lzdGVyIGEgbmV3IGh3c3BpbmxvY2sgaW5zdGFuY2UuIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMKLSAgICAgY29udGV4dCAodGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBzbGVlcCkgYnV0IG5vdCBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQKLSAgICAgY29udGV4dC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgb3JkZXIgdG8gcmVnaXN0ZXIgYSBuZXcgaHdzcGlubG9jayBkZXZpY2UgKHdoaWNoIGlzIHVzdWFsbHkgYSBiYW5rIG9mCisgICAgIG51bWVyb3VzIGxvY2tzKS4gU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uCisgICAgIG1pZ2h0IHNsZWVwKS4KKyAgICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KIAotICBzdHJ1Y3QgaHdzcGlubG9jayAqaHdzcGluX2xvY2tfdW5yZWdpc3Rlcih1bnNpZ25lZCBpbnQgaWQpOworICBpbnQgaHdzcGluX2xvY2tfdW5yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmspOwogICAgLSB0byBiZSBjYWxsZWQgZnJvbSB0aGUgdW5kZXJseWluZyB2ZW5kb3Itc3BlY2lmaWMgaW1wbGVtZW50YXRpb24sIGluIG9yZGVyCi0gICAgIHRvIHVucmVnaXN0ZXIgYW4gZXhpc3RpbmcgKGFuZCB1bnVzZWQpIGh3c3BpbmxvY2sgaW5zdGFuY2UuCi0gICAgIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICAgICB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgIHRvIHVucmVnaXN0ZXIgYW4gaHdzcGlubG9jayBkZXZpY2UgKHdoaWNoIGlzIHVzdWFsbHkgYSBiYW5rIG9mIG51bWVyb3VzCisgICAgIGxvY2tzKS4KKyAgICAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0ICh0aGlzIGZ1bmN0aW9uIG1pZ2h0IHNsZWVwKS4KICAgICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBod3NwaW5sb2NrIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZXJyb3IgKGUuZy4KICAgICAgaWYgdGhlIGh3c3BpbmxvY2sgaXMgc2lsbCBpbiB1c2UpLgogCi01LiBzdHJ1Y3QgaHdzcGlubG9jaworNS4gSW1wb3J0YW50IHN0cnVjdHMKIAotVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBhbiBod3NwaW5sb2NrIGluc3RhbmNlLiBJdCBpcyByZWdpc3RlcmVkIGJ5IHRoZQotdW5kZXJseWluZyBod3NwaW5sb2NrIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBod3NwaW5fbG9ja19yZWdpc3RlcigpIEFQSS4KK3N0cnVjdCBod3NwaW5sb2NrX2RldmljZSBpcyBhIGRldmljZSB3aGljaCB1c3VhbGx5IGNvbnRhaW5zIGEgYmFuaworb2YgaGFyZHdhcmUgbG9ja3MuIEl0IGlzIHJlZ2lzdGVyZWQgYnkgdGhlIHVuZGVybHlpbmcgaHdzcGlubG9jaworaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKCkgQVBJLgogCiAvKioKLSAqIHN0cnVjdCBod3NwaW5sb2NrIC0gdmVuZG9yLXNwZWNpZmljIGh3c3BpbmxvY2sgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBAZGV2OiB1bmRlcmx5aW5nIGRldmljZSwgd2lsbCBiZSB1c2VkIHdpdGggcnVudGltZSBQTSBhcGkKLSAqIEBvcHM6IHZlbmRvci1zcGVjaWZpYyBod3NwaW5sb2NrIGhhbmRsZXJzCi0gKiBAaWQ6IGEgZ2xvYmFsLCB1bmlxdWUsIHN5c3RlbS13aWRlLCBpbmRleCBvZiB0aGUgbG9jay4KLSAqIEBsb2NrOiBpbml0aWFsaXplZCBhbmQgdXNlZCBieSBod3NwaW5sb2NrIGNvcmUKLSAqIEBvd25lcjogdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBtb2R1bGUsIHVzZWQgdG8gbWFpbnRhaW4gbW9kdWxlIHJlZiBjb3VudAorICogc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIC0gYSBkZXZpY2Ugd2hpY2ggdXN1YWxseSBzcGFucyBudW1lcm91cyBod3NwaW5sb2NrcworICogQGRldjogdW5kZXJseWluZyBkZXZpY2UsIHdpbGwgYmUgdXNlZCB0byBpbnZva2UgcnVudGltZSBQTSBhcGkKKyAqIEBvcHM6IHBsYXRmb3JtLXNwZWNpZmljIGh3c3BpbmxvY2sgaGFuZGxlcnMKKyAqIEBiYXNlX2lkOiBpZCBpbmRleCBvZiB0aGUgZmlyc3QgbG9jayBpbiB0aGlzIGRldmljZQorICogQG51bV9sb2NrczogbnVtYmVyIG9mIGxvY2tzIGluIHRoaXMgZGV2aWNlCisgKiBAbG9jazogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mICdzdHJ1Y3QgaHdzcGlubG9jaycKICAqLwotc3RydWN0IGh3c3BpbmxvY2sgeworc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHM7Ci0JaW50IGlkOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlpbnQgYmFzZV9pZDsKKwlpbnQgbnVtX2xvY2tzOworCXN0cnVjdCBod3NwaW5sb2NrIGxvY2tbMF07CiB9OwogCi1UaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSB0byBhc3NpZ24gdGhlIGRldiwgb3BzLCBpZCBhbmQKLW93bmVyIG1lbWJlcnMuIFRoZSBsb2NrIG1lbWJlciwgT1RPSCwgaXMgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYnkgdGhlIGh3c3BpbmxvY2sKLWNvcmUuCitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgY29udGFpbnMgYW4gYXJyYXkgb2YgaHdzcGlubG9jayBzdHJ1Y3RzLCBlYWNoCitvZiB3aGljaCByZXByZXNlbnRzIGEgc2luZ2xlIGhhcmR3YXJlIGxvY2s6CisKKy8qKgorICogc3RydWN0IGh3c3BpbmxvY2sgLSB0aGlzIHN0cnVjdCByZXByZXNlbnRzIGEgc2luZ2xlIGh3c3BpbmxvY2sgaW5zdGFuY2UKKyAqIEBiYW5rOiB0aGUgaHdzcGlubG9ja19kZXZpY2Ugc3RydWN0dXJlIHdoaWNoIG93bnMgdGhpcyBsb2NrCisgKiBAbG9jazogaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYnkgaHdzcGlubG9jayBjb3JlCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhLCBvd25lZCBieSB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybS1zcGVjaWZpYyBod3NwaW5sb2NrIGRydgorICovCitzdHJ1Y3QgaHdzcGlubG9jayB7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rOworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkICpwcml2OworfTsKKworV2hlbiByZWdpc3RlcmluZyBhIGJhbmsgb2YgbG9ja3MsIHRoZSBod3NwaW5sb2NrIGRyaXZlciBvbmx5IG5lZWRzIHRvCitzZXQgdGhlIHByaXYgbWVtYmVycyBvZiB0aGUgbG9ja3MuIFRoZSByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZSBzZXQgYW5kCitpbml0aWFsaXplZCBieSB0aGUgaHdzcGlubG9jayBjb3JlIGl0c2VsZi4KIAogNi4gSW1wbGVtZW50YXRpb24gY2FsbGJhY2tzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3NtYnVzLXByb3RvY29sIGIvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKaW5kZXggN2MxOWQxYS4uNDlmNWI2OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvc21idXMtcHJvdG9jb2wKQEAgLTg4LDYgKzg4LDEwIEBACiAKIFMgQWRkciBXciBbQV0gQ29tbSBbQV0gUyBBZGRyIFJkIFtBXSBbRGF0YUxvd10gQSBbRGF0YUhpZ2hdIE5BIFAKIAorTm90ZSB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkIGlzCithdmFpbGFibGUgZm9yIHJlYWRzIHdoZXJlIHRoZSB0d28gZGF0YSBieXRlcyBhcmUgdGhlIG90aGVyIHdheQorYXJvdW5kIChub3QgU01CdXMgY29tcGxpYW50LCBidXQgdmVyeSBwb3B1bGFyLikKKwogCiBTTUJ1cyBXcml0ZSBCeXRlOiAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgpCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDgsNiArMTEyLDEwIEBACiAKIFMgQWRkciBXciBbQV0gQ29tbSBbQV0gRGF0YUxvdyBbQV0gRGF0YUhpZ2ggW0FdIFAKIAorTm90ZSB0aGUgY29udmVuaWVuY2UgZnVuY3Rpb24gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZCBpcworYXZhaWxhYmxlIGZvciB3cml0ZXMgd2hlcmUgdGhlIHR3byBkYXRhIGJ5dGVzIGFyZSB0aGUgb3RoZXIgd2F5Cithcm91bmQgKG5vdCBTTUJ1cyBjb21wbGlhbnQsIGJ1dCB2ZXJ5IHBvcHVsYXIuKQorCiAKIFNNQnVzIFByb2Nlc3MgQ2FsbDogIGkyY19zbWJ1c19wcm9jZXNzX2NhbGwoKQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2VsYW50ZWNoLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CmluZGV4IGRiNzk4YWYuLjU2MDJlYjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvZWxhbnRlY2gudHh0CkBAIC0xNiwxNSArMTYsMjggQEAKIAogIDEuIEludHJvZHVjdGlvbgogIDIuIEV4dHJhIGtub2JzCi0gMy4gSGFyZHdhcmUgdmVyc2lvbiAxCi0gICAgMy4xIFJlZ2lzdGVycwotICAgIDMuMiBOYXRpdmUgcmVsYXRpdmUgbW9kZSA0IGJ5dGUgcGFja2V0IGZvcm1hdAotICAgIDMuMyBOYXRpdmUgYWJzb2x1dGUgbW9kZSA0IGJ5dGUgcGFja2V0IGZvcm1hdAotIDQuIEhhcmR3YXJlIHZlcnNpb24gMgorIDMuIERpZmZlcmVudGlhdGluZyBoYXJkd2FyZSB2ZXJzaW9ucworIDQuIEhhcmR3YXJlIHZlcnNpb24gMQogICAgIDQuMSBSZWdpc3RlcnMKLSAgICA0LjIgTmF0aXZlIGFic29sdXRlIG1vZGUgNiBieXRlIHBhY2tldCBmb3JtYXQKLSAgICAgICAgNC4yLjEgT25lIGZpbmdlciB0b3VjaAotICAgICAgICA0LjIuMiBUd28gZmluZ2VyIHRvdWNoCisgICAgNC4yIE5hdGl2ZSByZWxhdGl2ZSBtb2RlIDQgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgNC4zIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDQgYnl0ZSBwYWNrZXQgZm9ybWF0CisgNS4gSGFyZHdhcmUgdmVyc2lvbiAyCisgICAgNS4xIFJlZ2lzdGVycworICAgIDUuMiBOYXRpdmUgYWJzb2x1dGUgbW9kZSA2IGJ5dGUgcGFja2V0IGZvcm1hdAorICAgICAgICA1LjIuMSBQYXJpdHkgY2hlY2tpbmcgYW5kIHBhY2tldCByZS1zeW5jaHJvbml6YXRpb24KKyAgICAgICAgNS4yLjIgT25lL1RocmVlIGZpbmdlciB0b3VjaAorICAgICAgICA1LjIuMyBUd28gZmluZ2VyIHRvdWNoCisgNi4gSGFyZHdhcmUgdmVyc2lvbiAzCisgICAgNi4xIFJlZ2lzdGVycworICAgIDYuMiBOYXRpdmUgYWJzb2x1dGUgbW9kZSA2IGJ5dGUgcGFja2V0IGZvcm1hdAorICAgICAgICA2LjIuMSBPbmUvVGhyZWUgZmluZ2VyIHRvdWNoCisgICAgICAgIDYuMi4yIFR3byBmaW5nZXIgdG91Y2gKKyA3LiBIYXJkd2FyZSB2ZXJzaW9uIDQKKyAgICA3LjEgUmVnaXN0ZXJzCisgICAgNy4yIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDYgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgICAgIDcuMi4xIFN0YXR1cyBwYWNrZXQKKyAgICAgICAgNy4yLjIgSGVhZCBwYWNrZXQKKyAgICAgICAgNy4yLjMgTW90aW9uIHBhY2tldAogCiAKIApAQCAtMzc1LDcgKzM4OCw3IEBACiAKIEluIGNhc2UgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQsIGFsbCB0aGUgcGFja2V0cyBhcmUgc2hpZnRlZCBieSBvbmUgKGFuZCBwYWNrZXRbMF0gaXMgZGlzY2FyZGVkKS4KIAotNS4yLjEgT25lL1RocmVlIGZpbmdlciB0b3VjaAorNS4yLjIgT25lL1RocmVlIGZpbmdlciB0b3VjaAogICAgICAgfn5+fn5+fn5+fn5+fn5+fgogCiBieXRlIDA6CkBAIC0zODQsMTkgKzM5NywxOSBAQAogCSBuMSAgbjAgIHczICB3MiAgIC4gICAuICAgUiAgIEwKIAogICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAotICAgICAgICAgbjEuLm4wID0gbnVtYmVycyBvZiBmaW5nZXJzIG9uIHRvdWNocGFkCisgICAgICAgICBuMS4ubjAgPSBudW1iZXIgb2YgZmluZ2VycyBvbiB0b3VjaHBhZAogCiBieXRlIDE6CiAKICAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCi0JIHA3ICBwNiAgcDUgIHA0ICAuICB4MTAgeDkgIHg4CisJIHA3ICBwNiAgcDUgIHA0IHgxMSB4MTAgeDkgIHg4CiAKIGJ5dGUgMjoKIAogICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKIAkgeDcgIHg2ICB4NSAgeDQgIHgzICB4MiAgeDEgIHgwCiAKLSAgICAgICAgIHgxMC4ueDAgPSBhYnNvbHV0ZSB4IHZhbHVlIChob3Jpem9udGFsKQorICAgICAgICAgeDExLi54MCA9IGFic29sdXRlIHggdmFsdWUgKGhvcml6b250YWwpCiAKIGJ5dGUgMzoKIApAQCAtNDIwLDcgKzQzMyw3IEBACiBieXRlIDQ6CiAKICAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCi0gICAgICAgIHAzICBwMSAgcDIgIHAwICAgLiAgIC4gIHk5ICB5OAorICAgICAgICBwMyAgcDEgIHAyICBwMCAgeTExIHkxMCB5OSAgeTgKIAogCSBwNy4ucDAgPSBwcmVzc3VyZSAobm90IEVGMTEzKQogCkBAIC00MjksMTAgKzQ0MiwxMCBAQAogICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKICAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCiAKLSAgICAgICAgIHk5Li55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorICAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQogCiAKLTQuMi4yIFR3byBmaW5nZXIgdG91Y2gKKzUuMi4zIFR3byBmaW5nZXIgdG91Y2gKICAgICAgIH5+fn5+fn5+fn5+fn5+fn4KIAogTm90ZSB0aGF0IHRoZSB0d28gcGFpcnMgb2YgY29vcmRpbmF0ZXMgYXJlIG5vdCBleGFjdGx5IHRoZSBjb29yZGluYXRlcyBvZiB0aGUKQEAgLTQ0Niw3ICs0NTksNyBAQAogICAgICAgICBuMSAgbjAgIGF5OCBheDggIC4gICAuICAgUiAgIEwKIAogICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAotICAgICAgICAgbjEuLm4wID0gbnVtYmVycyBvZiBmaW5nZXJzIG9uIHRvdWNocGFkCisgICAgICAgICBuMS4ubjAgPSBudW1iZXIgb2YgZmluZ2VycyBvbiB0b3VjaHBhZAogCiBieXRlIDE6CiAKQEAgLTQ4MCwzICs0OTMsMjUzIEBACiAgICAgICAgIGJ5NyBieTggYnk1IGJ5NCBieTMgYnkyIGJ5MSBieTAKIAogICAgICAgICAgYnk4Li5ieTAgPSB1cHBlci1yaWdodCBmaW5nZXIgYWJzb2x1dGUgeSB2YWx1ZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCis2LiBIYXJkd2FyZSB2ZXJzaW9uIDMKKyAgID09PT09PT09PT09PT09PT09PQorCis2LjEgUmVnaXN0ZXJzCisgICAgfn5+fn5+fn5+CisqIHJlZ18xMAorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMCAgIEEKKworICAgICAgICAgQTogMSA9IGVuYWJsZSBhYnNvbHV0ZSB0cmFja2luZworCis2LjIgTmF0aXZlIGFic29sdXRlIG1vZGUgNiBieXRlIHBhY2tldCBmb3JtYXQKKyAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorMSBhbmQgMyBmaW5nZXIgdG91Y2ggc2hhcmVzIHRoZSBzYW1lIDYtYnl0ZSBwYWNrZXQgZm9ybWF0LCBleGNlcHQgdGhhdAorMyBmaW5nZXIgdG91Y2ggb25seSByZXBvcnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIGFsbCB0aHJlZSBmaW5nZXJzLgorCitGaXJtd2FyZSB3b3VsZCBzZW5kIDEyIGJ5dGVzIG9mIGRhdGEgZm9yIDIgZmluZ2VyIHRvdWNoLgorCitOb3RlIG9uIGRlYm91bmNlOgorSW4gY2FzZSB0aGUgYm94IGhhcyB1bnN0YWJsZSBwb3dlciBzdXBwbHkgb3Igb3RoZXIgZWxlY3RyaWNpdHkgaXNzdWVzLCBvcgord2hlbiBudW1iZXIgb2YgZmluZ2VyIGNoYW5nZXMsIEYvVyB3b3VsZCBzZW5kICJkZWJvdW5jZSBwYWNrZXQiIHRvIGluZm9ybQorZHJpdmVyIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIGRlYm91bmNlIHN0YXR1cy4KK1RoZSBkZWJvdWNlIHBhY2tldCBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisgICAgYnl0ZSAwOiAweGM0CisgICAgYnl0ZSAxOiAweGZmCisgICAgYnl0ZSAyOiAweGZmCisgICAgYnl0ZSAzOiAweDAyCisgICAgYnl0ZSA0OiAweGZmCisgICAgYnl0ZSA1OiAweGZmCitXaGVuIHdlIGVuY291bnRlciB0aGlzIGtpbmQgb2YgcGFja2V0LCB3ZSBqdXN0IGlnbm9yZSBpdC4KKworNi4yLjEgT25lL1RocmVlIGZpbmdlciB0b3VjaAorICAgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitieXRlIDA6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIG4xICBuMCAgdzMgIHcyICAgMCAgIDEgICBSICAgTAorCisgICAgICAgIEwsIFIgPSAxIHdoZW4gTGVmdCwgUmlnaHQgbW91c2UgYnV0dG9uIHByZXNzZWQKKyAgICAgICAgbjEuLm4wID0gbnVtYmVyIG9mIGZpbmdlcnMgb24gdG91Y2hwYWQKKworYnl0ZSAxOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICBwNyAgcDYgIHA1ICBwNCB4MTEgeDEwICB4OSAgeDgKKworYnl0ZSAyOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB4NyAgeDYgIHg1ICB4NCAgeDMgIHgyICB4MSAgeDAKKworICAgICAgICB4MTEuLngwID0gYWJzb2x1dGUgeCB2YWx1ZSAoaG9yaXpvbnRhbCkKKworYnl0ZSAzOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgMCAgIDAgIHcxICB3MCAgIDAgICAwICAgMSAgIDAKKworICAgICAgICAgdzMuLncwID0gd2lkdGggb2YgdGhlIGZpbmdlciB0b3VjaAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHAzICBwMSAgcDIgIHAwICB5MTEgeTEwIHk5ICB5OAorCisgICAgICAgIHA3Li5wMCA9IHByZXNzdXJlCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorCis2LjIuMiBUd28gZmluZ2VyIHRvdWNoCisgICAgICB+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBwYWNrZXQgZm9ybWF0IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIHR3byBmaW5nZXIgdG91Y2gsIGV4Y2VwdCB0aGUgaGFyZHdhcmUKK3NlbmRzIHR3byA2IGJ5dGUgcGFja2V0cy4gVGhlIGZpcnN0IHBhY2tldCBjb250YWlucyBkYXRhIGZvciB0aGUgZmlyc3QgZmluZ2VyLAordGhlIHNlY29uZCBwYWNrZXQgaGFzIGRhdGEgZm9yIHRoZSBzZWNvbmQgZmluZ2VyLiBTbyBmb3IgdHdvIGZpbmdlciB0b3VjaCBhCit0b3RhbCBvZiAxMiBieXRlcyBhcmUgc2VudC4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworNy4gSGFyZHdhcmUgdmVyc2lvbiA0CisgICA9PT09PT09PT09PT09PT09PT0KKworNy4xIFJlZ2lzdGVycworICAgIH5+fn5+fn5+fgorKiByZWdfMDcKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgIDAgICAwICAgMCAgIDAgICAwICAgMCAgIDAgICBBCisKKyAgICAgICAgIEE6IDEgPSBlbmFibGUgYWJzb2x1dGUgdHJhY2tpbmcKKworNy4yIE5hdGl2ZSBhYnNvbHV0ZSBtb2RlIDYgYnl0ZSBwYWNrZXQgZm9ybWF0CisgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3Y0IGhhcmR3YXJlIGlzIGEgdHJ1ZSBtdWx0aXRvdWNoIHRvdWNocGFkLCBjYXBhYmxlIG9mIHRyYWNraW5nIHVwIHRvIDUgZmluZ2Vycy4KK1VuZm9ydHVuYXRlbHksIGR1ZSB0byBQUy8yJ3MgbGltaXRlZCBiYW5kd2lkdGgsIGl0cyBwYWNrZXQgZm9ybWF0IGlzIHJhdGhlcgorY29tcGxleC4KKworV2hlbmV2ZXIgdGhlIG51bWJlcnMgb3IgaWRlbnRpdGllcyBvZiB0aGUgZmluZ2VycyBjaGFuZ2VzLCB0aGUgaGFyZHdhcmUgc2VuZHMgYQorc3RhdHVzIHBhY2tldCB0byBpbmRpY2F0ZSBob3cgbWFueSBhbmQgd2hpY2ggZmluZ2VycyBpcyBvbiB0b3VjaHBhZCwgZm9sbG93ZWQgYnkKK2hlYWQgcGFja2V0cyBvciBtb3Rpb24gcGFja2V0cy4gQSBoZWFkIHBhY2tldCBjb250YWlucyBkYXRhIG9mIGZpbmdlciBpZCwgZmluZ2VyCitwb3NpdGlvbiAoYWJzb2x1dGUgeCwgeSB2YWx1ZXMpLCB3aWR0aCwgYW5kIHByZXNzdXJlLiBBIG1vdGlvbiBwYWNrZXQgY29udGFpbnMKK3R3byBmaW5nZXJzJyBwb3NpdGlvbiBkZWx0YS4KKworRm9yIGV4YW1wbGUsIHdoZW4gc3RhdHVzIHBhY2tldCB0ZWxscyB0aGVyZSBhcmUgMiBmaW5nZXJzIG9uIHRvdWNocGFkLCB0aGVuIHdlCitjYW4gZXhwZWN0IHR3byBmb2xsb3dpbmcgaGVhZCBwYWNrZXRzLiBJZiB0aGUgZmluZ2VyIHN0YXR1cyBkb2Vzbid0IGNoYW5nZSwKK3RoZSBmb2xsb3dpbmcgcGFja2V0cyB3b3VsZCBiZSBtb3Rpb24gcGFja2V0cywgb25seSBzZW5kaW5nIGRlbHRhIG9mIGZpbmdlcgorcG9zaXRpb24sIHVudGlsIHdlIHJlY2VpdmUgYSBzdGF0dXMgcGFja2V0LgorCitPbmUgZXhjZXB0aW9uIGlzIG9uZSBmaW5nZXIgdG91Y2guIHdoZW4gYSBzdGF0dXMgcGFja2V0IHRlbGxzIHVzIHRoZXJlIGlzIG9ubHkKK29uZSBmaW5nZXIsIHRoZSBoYXJkd2FyZSB3b3VsZCBqdXN0IHNlbmQgaGVhZCBwYWNrZXRzIGFmdGVyd2FyZHMuCisKKzcuMi4xIFN0YXR1cyBwYWNrZXQKKyAgICAgIH5+fn5+fn5+fn5+fn4KKworYnl0ZSAwOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgLiAgIC4gICAuICAgLiAgIDAgICAxICAgUiAgIEwKKworICAgICAgICAgTCwgUiA9IDEgd2hlbiBMZWZ0LCBSaWdodCBtb3VzZSBidXR0b24gcHJlc3NlZAorCitieXRlIDE6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgICAuICAgLiAgIC4gZnQ0IGZ0MyBmdDIgZnQxIGZ0MAorCisgICAgICAgICBmdDQgZnQzIGZ0MiBmdDEgZnQwIGZ0biA9IDEgd2hlbiBmaW5nZXIgbiBpcyBvbiB0b3VjaHBhZAorCitieXRlIDI6IG5vdCB1c2VkCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgIC4gICAuICAgLiAgIDEgICAwICAgMCAgIDAgICAwCisKKyAgICAgICAgIGNvbnN0YW50IGJpdHMKKworYnl0ZSA0OgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICAgcCAgIC4gICAuICAgLiAgIC4gICAuICAgLiAgIC4KKworICAgICAgICAgcCA9IDEgZm9yIHBhbG0KKworYnl0ZSA1OiBub3QgdXNlZAorCis3LjIuMiBIZWFkIHBhY2tldAorICAgICAgfn5+fn5+fn5+fn4KKworYnl0ZSAwOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB3MyAgdzIgIHcxICB3MCAgIDAgICAxICAgUiAgIEwKKworICAgICAgICBMLCBSID0gMSB3aGVuIExlZnQsIFJpZ2h0IG1vdXNlIGJ1dHRvbiBwcmVzc2VkCisgICAgICAgIHczLi53MCA9IGZpbmdlciB3aWR0aCAoc3BhbnMgaG93IG1hbnkgdHJhY2UgbGluZXMpCisKK2J5dGUgMToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgcDcgIHA2ICBwNSAgcDQgeDExIHgxMCAgeDkgIHg4CisKK2J5dGUgMjoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeDcgIHg2ICB4NSAgeDQgIHgzICB4MiAgeDEgIHgwCisKKyAgICAgICAgeDExLi54MCA9IGFic29sdXRlIHggdmFsdWUgKGhvcml6b250YWwpCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIDEgICAwICAgMCAgIDAgICAxCisKKyAgICAgICBpZDIuLmlkMCA9IGZpbmdlciBpZAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHAzICBwMSAgcDIgIHAwICB5MTEgeTEwIHk5ICB5OAorCisgICAgICAgIHA3Li5wMCA9IHByZXNzdXJlCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTExLi55MCA9IGFic29sdXRlIHkgdmFsdWUgKHZlcnRpY2FsKQorCis3LjIuMyBNb3Rpb24gcGFja2V0CisgICAgICB+fn5+fn5+fn5+fn5+CisKK2J5dGUgMDoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIHcgICAwICAgMSAgIFIgICBMCisKKyAgICAgICBMLCBSID0gMSB3aGVuIExlZnQsIFJpZ2h0IG1vdXNlIGJ1dHRvbiBwcmVzc2VkCisgICAgICAgaWQyLi5pZDAgPSBmaW5nZXIgaWQKKyAgICAgICB3ID0gMSB3aGVuIGRlbHRhIG92ZXJmbG93cyAoPiAxMjcgb3IgPCAtMTI4KSwgaW4gdGhpcyBjYXNlCisgICAgICAgZmlybXdhcmUgc2VuZHMgdXMgKGRlbHRhIHggLyA1KSBhbmQgKGRlbHRhIHkgIC8gNSkKKworYnl0ZSAxOgorCisgICBiaXQgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgICB4NyAgeDYgIHg1ICB4NCAgeDMgIHgyICB4MSAgeDAKKworICAgICAgICB4Ny4ueDAgPSBkZWx0YSB4ICh0d28ncyBjb21wbGVtZW50KQorCitieXRlIDI6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHk3ICB5NiAgeTUgIHk0ICB5MyAgeTIgIHkxICB5MAorCisgICAgICAgIHk3Li55MCA9IGRlbHRhIHkgKHR3bydzIGNvbXBsZW1lbnQpCisKK2J5dGUgMzoKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICBpZDIgaWQxIGlkMCAgIDEgICAwICAgMCAgIDEgICAwCisKKyAgICAgICBpZDIuLmlkMCA9IGZpbmdlciBpZAorCitieXRlIDQ6CisKKyAgIGJpdCAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisgICAgICAgIHg3ICB4NiAgeDUgIHg0ICB4MyAgeDIgIHgxICB4MAorCisgICAgICAgIHg3Li54MCA9IGRlbHRhIHggKHR3bydzIGNvbXBsZW1lbnQpCisKK2J5dGUgNToKKworICAgYml0ICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAgeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCisKKyAgICAgICAgeTcuLnkwID0gZGVsdGEgeSAodHdvJ3MgY29tcGxlbWVudCkKKworICAgICAgICBieXRlIDAgfiAyIGZvciBvbmUgZmluZ2VyCisgICAgICAgIGJ5dGUgMyB+IDUgZm9yIGFub3RoZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKaW5kZXggNzE1MzZlNy4uNTQzMTAxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9tdWx0aS10b3VjaC1wcm90b2NvbC50eHQKQEAgLTY1LDYgKzY1LDIwIEBACiBlbmQuICBVcG9uIHJlY2VpdmluZyBhbiBNVCBldmVudCwgb25lIHNpbXBseSB1cGRhdGVzIHRoZSBhcHByb3ByaWF0ZQogYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IHNsb3QuCiAKK1NvbWUgZGV2aWNlcyBpZGVudGlmeSBhbmQvb3IgdHJhY2sgbW9yZSBjb250YWN0cyB0aGFuIHRoZXkgY2FuIHJlcG9ydCB0byB0aGUKK2RyaXZlci4gIEEgZHJpdmVyIGZvciBzdWNoIGEgZGV2aWNlIHNob3VsZCBhc3NvY2lhdGUgb25lIHR5cGUgQiBzbG90IHdpdGggZWFjaAorY29udGFjdCB0aGF0IGlzIHJlcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gIFdoZW5ldmVyIHRoZSBpZGVudGl0eSBvZiB0aGUKK2NvbnRhY3QgYXNzb2NpYXRlZCB3aXRoIGEgc2xvdCBjaGFuZ2VzLCB0aGUgZHJpdmVyIHNob3VsZCBpbnZhbGlkYXRlIHRoYXQKK3Nsb3QgYnkgY2hhbmdpbmcgaXRzIEFCU19NVF9UUkFDS0lOR19JRC4gIElmIHRoZSBoYXJkd2FyZSBzaWduYWxzIHRoYXQgaXQgaXMKK3RyYWNraW5nIG1vcmUgY29udGFjdHMgdGhhbiBpdCBpcyBjdXJyZW50bHkgcmVwb3J0aW5nLCB0aGUgZHJpdmVyIHNob3VsZCB1c2UKK2EgQlROX1RPT0xfKlRBUCBldmVudCB0byBpbmZvcm0gdXNlcnNwYWNlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY29udGFjdHMKK2JlaW5nIHRyYWNrZWQgYnkgdGhlIGhhcmR3YXJlIGF0IHRoYXQgbW9tZW50LiAgVGhlIGRyaXZlciBzaG91bGQgZG8gdGhpcyBieQorZXhwbGljaXRseSBzZW5kaW5nIHRoZSBjb3JyZXNwb25kaW5nIEJUTl9UT09MXypUQVAgZXZlbnQgYW5kIHNldHRpbmcKK3VzZV9jb3VudCB0byBmYWxzZSB3aGVuIGNhbGxpbmcgaW5wdXRfbXRfcmVwb3J0X3BvaW50ZXJfZW11bGF0aW9uKCkuCitUaGUgZHJpdmVyIHNob3VsZCBvbmx5IGFkdmVydGlzZSBhcyBtYW55IHNsb3RzIGFzIHRoZSBoYXJkd2FyZSBjYW4gcmVwb3J0LgorVXNlcnNwYWNlIGNhbiBkZXRlY3QgdGhhdCBhIGRyaXZlciBjYW4gcmVwb3J0IG1vcmUgdG90YWwgY29udGFjdHMgdGhhbiBzbG90cworYnkgbm90aW5nIHRoYXQgdGhlIGxhcmdlc3Qgc3VwcG9ydGVkIEJUTl9UT09MXypUQVAgZXZlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlCit0b3RhbCBudW1iZXIgb2YgdHlwZSBCIHNsb3RzIHJlcG9ydGVkIGluIHRoZSBhYnNpbmZvIGZvciB0aGUgQUJTX01UX1NMT1QgYXhpcy4KIAogUHJvdG9jb2wgRXhhbXBsZSBBCiAtLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggYThiYTExOS4uYTBjNWM1ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTMwNyw2ICszMDcsMTkgQEAKIAkJCWJlaGF2aW91ciB0byBiZSBzcGVjaWZpZWQuICBCaXQgMCBlbmFibGVzIHdhcm5pbmdzLAogCQkJYml0IDEgZW5hYmxlcyBmaXh1cHMsIGFuZCBiaXQgMiBzZW5kcyBhIHNlZ2ZhdWx0LgogCisJYWxpZ25fdmFfYWRkcj0JW1g4Ni02NF0KKwkJCUFsaWduIHZpcnR1YWwgYWRkcmVzc2VzIGJ5IGNsZWFyaW5nIHNsaWNlIFsxNDoxMl0gd2hlbgorCQkJYWxsb2NhdGluZyBhIFZNQSBhdCBwcm9jZXNzIGNyZWF0aW9uIHRpbWUuIFRoaXMgb3B0aW9uCisJCQlnaXZlcyB5b3UgdXAgdG8gMyUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gQU1EIEYxNWgKKwkJCW1hY2hpbmVzICh3aGVyZSBpdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQpIGZvciBhCisJCQlDUFUtaW50ZW5zaXZlIHN0eWxlIGJlbmNobWFyaywgYW5kIGl0IGNhbiB2YXJ5IGhpZ2hseSBpbgorCQkJYSBtaWNyb2JlbmNobWFyayBkZXBlbmRpbmcgb24gd29ya2xvYWQgYW5kIGNvbXBpbGVyLgorCisJCQkxOiBvbmx5IGZvciAzMi1iaXQgcHJvY2Vzc2VzCisJCQkyOiBvbmx5IGZvciA2NC1iaXQgcHJvY2Vzc2VzCisJCQlvbjogZW5hYmxlIGZvciBib3RoIDMyLSBhbmQgNjQtYml0IHByb2Nlc3NlcworCQkJb2ZmOiBkaXNhYmxlIGZvciBib3RoIDMyLSBhbmQgNjQtYml0IHByb2Nlc3NlcworCiAJYW1kX2lvbW11PQlbSFcsWDg2LTg0XQogCQkJUGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSBBTUQgSU9NTVUgZHJpdmVyIGluIHRoZSBzeXN0ZW0uCiAJCQlQb3NzaWJsZSB2YWx1ZXMgYXJlOgpAQCAtNzI4LDEwICs3NDEsMTAgQEAKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrL2NmcS1pb3NjaGVkLnR4dCBhbmQKIAkJCURvY3VtZW50YXRpb24vYmxvY2svZGVhZGxpbmUtaW9zY2hlZC50eHQgZm9yIGRldGFpbHMuCiAKLQllbGZjb3JlaGRyPQlbSUEtNjQsUFBDLFNILFg4Nl0KKwllbGZjb3JlaGRyPVtzaXplW0tNR11AXW9mZnNldFtLTUddIFtJQTY0LFBQQyxTSCxYODYsUzM5MF0KIAkJCVNwZWNpZmllcyBwaHlzaWNhbCBhZGRyZXNzIG9mIHN0YXJ0IG9mIGtlcm5lbCBjb3JlCi0JCQlpbWFnZSBlbGYgaGVhZGVyLiBHZW5lcmFsbHkga2V4ZWMgbG9hZGVyIHdpbGwKLQkJCXBhc3MgdGhpcyBvcHRpb24gdG8gY2FwdHVyZSBrZXJuZWwuCisJCQlpbWFnZSBlbGYgaGVhZGVyIGFuZCBvcHRpb25hbGx5IHRoZSBzaXplLiBHZW5lcmFsbHkKKwkJCWtleGVjIGxvYWRlciB3aWxsIHBhc3MgdGhpcyBvcHRpb24gdG8gY2FwdHVyZSBrZXJuZWwuCiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQgZm9yIGRldGFpbHMuCiAKIAllbmFibGVfbXRycl9jbGVhbnVwIFtYODZdCkBAIC05NjAsNiArOTczLDkgQEAKIAlpZ25vcmVfbG9nbGV2ZWwJW0tOTF0KIAkJCUlnbm9yZSBsb2dsZXZlbCBzZXR0aW5nIC0gdGhpcyB3aWxsIHByaW50IC9hbGwvCiAJCQlrZXJuZWwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLgorCQkJV2UgYWxzbyBhZGQgaXQgYXMgcHJpbnRrIG1vZHVsZSBwYXJhbWV0ZXIsIHNvIHVzZXJzCisJCQljb3VsZCBjaGFuZ2UgaXQgZHluYW1pY2FsbHksIHVzdWFsbHkgYnkKKwkJCS9zeXMvbW9kdWxlL3ByaW50ay9wYXJhbWV0ZXJzL2lnbm9yZV9sb2dsZXZlbC4KIAogCWloYXNoX2VudHJpZXM9CVtLTkxdCiAJCQlTZXQgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBmb3IgaW5vZGUgY2FjaGUuCkBAIC0xMTg4LDYgKzEyMDQsMTAgQEAKIAkJCVtLVk0sSW50ZWxdIERpc2FibGUgRmxleFByaW9yaXR5IGZlYXR1cmUgKFRQUiBzaGFkb3cpLgogCQkJRGVmYXVsdCBpcyAxIChlbmFibGVkKQogCisJa3ZtLWludGVsLm5lc3RlZD0KKwkJCVtLVk0sSW50ZWxdIEVuYWJsZSBWTVggbmVzdGluZyAoblZNWCkuCisJCQlEZWZhdWx0IGlzIDAgKGRpc2FibGVkKQorCiAJa3ZtLWludGVsLnVucmVzdHJpY3RlZF9ndWVzdD0KIAkJCVtLVk0sSW50ZWxdIERpc2FibGUgdW5yZXN0cmljdGVkIGd1ZXN0IGZlYXR1cmUKIAkJCSh2aXJ0dWFsaXplZCByZWFsIGFuZCB1bnBhZ2VkIG1vZGUpIG9uIGNhcGFibGUKQEAgLTE2NDksNiArMTY2OSwxMSBAQAogCQkJZGVidWdnaW5nIGRyaXZlciBzdXNwZW5kL3Jlc3VtZSBob29rcykuICBUaGlzIG1heQogCQkJbm90IHdvcmsgcmVsaWFibHkgd2l0aCBhbGwgY29uc29sZXMsIGJ1dCBpcyBrbm93bgogCQkJdG8gd29yayB3aXRoIHNlcmlhbCBhbmQgVkdBIGNvbnNvbGVzLgorCQkJVG8gZmFjaWxpdGF0ZSBtb3JlIGZsZXhpYmxlIGRlYnVnZ2luZywgd2UgYWxzbyBhZGQKKwkJCWNvbnNvbGVfc3VzcGVuZCwgYSBwcmludGsgbW9kdWxlIHBhcmFtZXRlciB0byBjb250cm9sCisJCQlpdC4gVXNlcnMgY291bGQgdXNlIGNvbnNvbGVfc3VzcGVuZCAodXN1YWxseQorCQkJL3N5cy9tb2R1bGUvcHJpbnRrL3BhcmFtZXRlcnMvY29uc29sZV9zdXNwZW5kKSB0bworCQkJdHVybiBvbi9vZmYgaXQgZHluYW1pY2FsbHkuCiAKIAlub2FsaWVuY2FjaGUJW01NLCBOVU1BLCBTTEFCXSBEaXNhYmxlcyB0aGUgYWxsb2NhdGlvbiBvZiBhbGllbgogCQkJY2FjaGVzIGluIHRoZSBzbGFiIGFsbG9jYXRvci4gIFNhdmVzIHBlci1ub2RlIG1lbW9yeSwKQEAgLTE3ODQsNiArMTgwOSwxMSBAQAogCiAJbm9yZXNpZHVhbAlbUFBDXSBEb24ndCB1c2UgcmVzaWR1YWwgZGF0YSBvbiBQUmVQIG1hY2hpbmVzLgogCisJbm9yZHJhbmQJW1g4Nl0gRGlzYWJsZSB0aGUgZGlyZWN0IHVzZSBvZiB0aGUgUkRSQU5ECisJCQlpbnN0cnVjdGlvbiBldmVuIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUKKwkJCXByb2Nlc3Nvci4gIFJEUkFORCBpcyBzdGlsbCBhdmFpbGFibGUgdG8gdXNlcgorCQkJc3BhY2UgYXBwbGljYXRpb25zLgorCiAJbm9yZXN1bWUJW1NXU1VTUF0gRGlzYWJsZXMgcmVzdW1lIGFuZCByZXN0b3JlcyBvcmlnaW5hbCBzd2FwCiAJCQlzcGFjZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CmluZGV4IDNmZjBkYWQuLjlkNjY2ODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKQEAgLTQxMSw5ICs0MTEsOSBAQAogCiAweDEwMDQJMHgwMwlGTitGNAkJU2xlZXAgYnV0dG9uIChBQ1BJIHNsZWVwIGJ1dHRvbgogCQkJCXNlbWFudGljcywgaS5lLiBzbGVlcC10by1SQU0pLgotCQkJCUl0IGlzIGFsd2F5cyBnZW5lcmF0ZSBzb21lIGtpbmQKKwkJCQlJdCBhbHdheXMgZ2VuZXJhdGVzIHNvbWUga2luZAogCQkJCW9mIGV2ZW50LCBlaXRoZXIgdGhlIGhvdCBrZXkKLQkJCQlldmVudCBvciBhIEFDUEkgc2xlZXAgYnV0dG9uCisJCQkJZXZlbnQgb3IgYW4gQUNQSSBzbGVlcCBidXR0b24KIAkJCQlldmVudC4gVGhlIGZpcm13YXJlIG1heQogCQkJCXJlZnVzZSB0byBnZW5lcmF0ZSBmdXJ0aGVyIEZOK0Y0CiAJCQkJa2V5IHByZXNzZXMgdW50aWwgYSBTMyBvciBTNCBBQ1BJCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1jbGFzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1jbGFzcy50eHQKaW5kZXggNDk5NjU4Ni4uNzk2OTljMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtY2xhc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLWNsYXNzLnR4dApAQCAtNjEsOCArNjEsOCBAQAogU29tZSBMRURzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGJsaW5rIHdpdGhvdXQgYW55IENQVSBpbnRlcmFjdGlvbi4gVG8KIHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBhIExFRCBkcml2ZXIgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRoZQogYmxpbmtfc2V0KCkgZnVuY3Rpb24gKHNlZSA8bGludXgvbGVkcy5oPikuIFRvIHNldCBhbiBMRUQgdG8gYmxpbmtpbmcsCi1ob3dldmVyLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHVzZSB0aGUgQVBJIGZ1bmN0aW9uIGxlZF9ibGlua19zZXQoKSwKLWFzIGl0IHdpbGwgY2hlY2sgYW5kIGltcGxlbWVudCBzb2Z0d2FyZSBmYWxsYmFjayBpZiBuZWNlc3NhcnkuCitob3dldmVyLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBBUEkgZnVuY3Rpb24gbGVkX2JsaW5rX3NldCgpLCBhcyBpdAord2lsbCBjaGVjayBhbmQgaW1wbGVtZW50IHNvZnR3YXJlIGZhbGxiYWNrIGlmIG5lY2Vzc2FyeS4KIAogVG8gdHVybiBvZmYgYmxpbmtpbmcgYWdhaW4sIHVzZSB0aGUgQVBJIGZ1bmN0aW9uIGxlZF9icmlnaHRuZXNzX3NldCgpCiBhcyB0aGF0IHdpbGwgbm90IGp1c3Qgc2V0IHRoZSBMRUQgYnJpZ2h0bmVzcyBidXQgYWxzbyBzdG9wIGFueSBzb2Z0d2FyZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZzLXN5c2N0bC50eHQKaW5kZXggNGNjZGJjYS4uZjJhMjQ4OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2cy1zeXNjdGwudHh0CkBAIC0xNSw2ICsxNSwyMyBAQAogICAgICAgICBlbmFibGVkIGFuZCB0aGUgdmFyaWFibGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gMiwgb3RoZXJ3aXNlCiAgICAgICAgIHRoZSBzdHJhdGVneSBpcyBkaXNhYmxlZCBhbmQgdGhlIHZhcmlhYmxlIGlzICBzZXQgIHRvIDEuCiAKK2Nvbm50cmFjayAtIEJPT0xFQU4KKwkwIC0gZGlzYWJsZWQgKGRlZmF1bHQpCisJbm90IDAgLSBlbmFibGVkCisKKwlJZiBzZXQsIG1haW50YWluIGNvbm5lY3Rpb24gdHJhY2tpbmcgZW50cmllcyBmb3IKKwljb25uZWN0aW9ucyBoYW5kbGVkIGJ5IElQVlMuCisKKwlUaGlzIHNob3VsZCBiZSBlbmFibGVkIGlmIGNvbm5lY3Rpb25zIGhhbmRsZWQgYnkgSVBWUyBhcmUgdG8gYmUKKwlhbHNvIGhhbmRsZWQgYnkgc3RhdGVmdWwgZmlyZXdhbGwgcnVsZXMuIFRoYXQgaXMsIGlwdGFibGVzIHJ1bGVzCisJdGhhdCBtYWtlIHVzZSBvZiBjb25uZWN0aW9uIHRyYWNraW5nLiAgSXQgaXMgYSBwZXJmb3JtYW5jZQorCW9wdGltaXNhdGlvbiB0byBkaXNhYmxlIHRoaXMgc2V0dGluZyBvdGhlcndpc2UuCisKKwlDb25uZWN0aW9ucyBoYW5kbGVkIGJ5IHRoZSBJUFZTIEZUUCBhcHBsaWNhdGlvbiBtb2R1bGUKKwl3aWxsIGhhdmUgY29ubmVjdGlvbiB0cmFja2luZyBlbnRyaWVzIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCisJT25seSBhdmFpbGFibGUgd2hlbiBJUFZTIGlzIGNvbXBpbGVkIHdpdGggQ09ORklHX0lQX1ZTX05GQ1QgZW5hYmxlZC4KKwogY2FjaGVfYnlwYXNzIC0gQk9PTEVBTgogICAgICAgICAwIC0gZGlzYWJsZWQgKGRlZmF1bHQpCiAgICAgICAgIG5vdCAwIC0gZW5hYmxlZApAQCAtMzksNyArNTYsNyBAQAogCTExICAgICAgICAgLSBJUFZTIHBhY2tldCBoYW5kbGluZyAoaXBfdnNfaW4vaXBfdnNfb3V0KQogCTEyIG9yIG1vcmUgLSBwYWNrZXQgdHJhdmVyc2FsCiAKLQlPbmx5IGF2YWlsYWJsZSB3aGVuIElQVlMgaXMgY29tcGlsZWQgd2l0aCB0aGUgQ09ORklHX0lQVlNfREVCVUcKKwlPbmx5IGF2YWlsYWJsZSB3aGVuIElQVlMgaXMgY29tcGlsZWQgd2l0aCBDT05GSUdfSVBfVlNfREVCVUcgZW5hYmxlZC4KIAogCUhpZ2hlciBkZWJ1Z2dpbmcgbGV2ZWxzIGluY2x1ZGUgdGhlIG1lc3NhZ2VzIGZvciBsb3dlciBkZWJ1Z2dpbmcKIAlsZXZlbHMsIHNvIHNldHRpbmcgZGVidWcgbGV2ZWwgMiwgaW5jbHVkZXMgbGV2ZWwgMCwgMSBhbmQgMgpAQCAtMTIzLDEzICsxNDAsMTEgQEAKIHNlY3VyZV90Y3AgLSBJTlRFR0VSCiAgICAgICAgIDAgIC0gZGlzYWJsZWQgKGRlZmF1bHQpCiAKLSAgICAgICAgVGhlIHNlY3VyZV90Y3AgZGVmZW5zZSBpcyB0byB1c2UgYSBtb3JlIGNvbXBsaWNhdGVkIHN0YXRlCi0gICAgICAgIHRyYW5zaXRpb24gdGFibGUgYW5kIHNvbWUgcG9zc2libGUgc2hvcnQgdGltZW91dHMgb2YgZWFjaAotICAgICAgICBzdGF0ZS4gSW4gdGhlIFZTL05BVCwgaXQgZGVsYXlzIHRoZSBlbnRlcmluZyB0aGUgRVNUQUJMSVNIRUQKLSAgICAgICAgdW50aWwgdGhlIHJlYWwgc2VydmVyIHN0YXJ0cyB0byBzZW5kIGRhdGEgYW5kIEFDSyBwYWNrZXQKLSAgICAgICAgKGFmdGVyIDMtd2F5IGhhbmRzaGFrZSkuCisJVGhlIHNlY3VyZV90Y3AgZGVmZW5zZSBpcyB0byB1c2UgYSBtb3JlIGNvbXBsaWNhdGVkIFRDUCBzdGF0ZQorCXRyYW5zaXRpb24gdGFibGUuIEZvciBWUy9OQVQsIGl0IGFsc28gZGVsYXlzIGVudGVyaW5nIHRoZQorCVRDUCBFU1RBQkxJU0hFRCBzdGF0ZSB1bnRpbCB0aGUgdGhyZWUgd2F5IGhhbmRzaGFrZSBpcyBjb21wbGV0ZWQuCiAKLSAgICAgICAgVGhlIHZhbHVlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBkcm9wX2VudHJ5IG9yCisgICAgICAgIFRoZSB2YWx1ZSBkZWZpbml0aW9uIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgZHJvcF9lbnRyeSBhbmQKICAgICAgICAgZHJvcF9wYWNrZXQuCiAKIHN5bmNfdGhyZXNob2xkIC0gSU5URUdFUgpAQCAtMTQxLDMgKzE1NiwzNiBAQAogICAgICAgICBzeW5jaHJvbml6ZWQsIGV2ZXJ5IHRpbWUgdGhlIG51bWJlciBvZiBpdHMgaW5jb21pbmcgcGFja2V0cwogICAgICAgICBtb2R1bHVzIDUwIGVxdWFscyB0aGUgdGhyZXNob2xkLiBUaGUgcmFuZ2Ugb2YgdGhlIHRocmVzaG9sZCBpcwogICAgICAgICBmcm9tIDAgdG8gNDkuCisKK3NuYXRfcmVyb3V0ZSAtIEJPT0xFQU4KKwkwIC0gZGlzYWJsZWQKKwlub3QgMCAtIGVuYWJsZWQgKGRlZmF1bHQpCisKKwlJZiBlbmFibGVkLCByZWNhbGN1bGF0ZSB0aGUgcm91dGUgb2YgU05BVGVkIHBhY2tldHMgZnJvbQorCXJlYWxzZXJ2ZXJzIHNvIHRoYXQgdGhleSBhcmUgcm91dGVkIGFzIGlmIHRoZXkgb3JpZ2luYXRlIGZyb20gdGhlCisJZGlyZWN0b3IuIE90aGVyd2lzZSB0aGV5IGFyZSByb3V0ZWQgYXMgaWYgdGhleSBhcmUgZm9yd2FyZGVkIGJ5IHRoZQorCWRpcmVjdG9yLgorCisJSWYgcG9saWN5IHJvdXRpbmcgaXMgaW4gZWZmZWN0IHRoZW4gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcm91dGUKKwlvZiBhIHBhY2tldCBvcmlnaW5hdGluZyBmcm9tIGEgZGlyZWN0b3IgaXMgcm91dGVkIGRpZmZlcmVudGx5IHRvIGEKKwlwYWNrZXQgYmVpbmcgZm9yd2FyZGVkIGJ5IHRoZSBkaXJlY3Rvci4KKworCUlmIHBvbGljeSByb3V0aW5nIGlzIG5vdCBpbiBlZmZlY3QgdGhlbiB0aGUgcmVjYWxjdWxhdGVkIHJvdXRlIHdpbGwKKwlhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIHJvdXRlIHNvIGl0IGlzIGFuIG9wdGltaXNhdGlvbgorCXRvIGRpc2FibGUgc25hdF9yZXJvdXRlIGFuZCBhdm9pZCB0aGUgcmVjYWxjdWxhdGlvbi4KKworc3luY192ZXJzaW9uIC0gSU5URUdFUgorCWRlZmF1bHQgMQorCisJVGhlIHZlcnNpb24gb2YgdGhlIHN5bmNocm9uaXNhdGlvbiBwcm90b2NvbCB1c2VkIHdoZW4gc2VuZGluZworCXN5bmNocm9uaXNhdGlvbiBtZXNzYWdlcy4KKworCTAgc2VsZWN0cyB0aGUgb3JpZ2luYWwgc3luY2hyb25pc2F0aW9uIHByb3RvY29sICh2ZXJzaW9uIDApLiBUaGlzCisJc2hvdWxkIGJlIHVzZWQgd2hlbiBzZW5kaW5nIHN5bmNocm9uaXNhdGlvbiBtZXNzYWdlcyB0byBhIGxlZ2FjeQorCXN5c3RlbSB0aGF0IG9ubHkgdW5kZXJzdGFuZHMgdGhlIG9yaWdpbmFsIHN5bmNocm9uaXNhdGlvbiBwcm90b2NvbC4KKworCTEgc2VsZWN0cyB0aGUgY3VycmVudCBzeW5jaHJvbmlzYXRpb24gcHJvdG9jb2wgKHZlcnNpb24gMSkuIFRoaXMKKwlzaG91bGQgYmUgdXNlZCB3aGVyZSBwb3NzaWJsZS4KKworCUtlcm5lbHMgd2l0aCB0aGlzIHN5bmNfdmVyc2lvbiBlbnRyeSBhcmUgYWJsZSB0byByZWNlaXZlIG1lc3NhZ2VzCisJb2YgYm90aCB2ZXJzaW9uIDEgYW5kIHZlcnNpb24gMiBvZiB0aGUgc3luY2hyb25pc2F0aW9uIHByb3RvY29sLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CmluZGV4IDZmZTkwMDEuLjEzMDMyYzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKQEAgLTI2Myw2ICsyNjMsOCBAQAogIDEyOiAnSScgaWYgdGhlIGtlcm5lbCBpcyB3b3JraW5nIGFyb3VuZCBhIHNldmVyZSBidWcgaW4gdGhlIHBsYXRmb3JtCiAgICAgIGZpcm13YXJlIChCSU9TIG9yIHNpbWlsYXIpLgogCisgMTM6ICdPJyBpZiBhbiBleHRlcm5hbGx5LWJ1aWx0ICgib3V0LW9mLXRyZWUiKSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLgorCiBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoZSAnVGFpbnRlZDogJyBzdHJpbmcgaXMgdG8gdGVsbCBrZXJuZWwKIGRlYnVnZ2VycyBpZiB0aGlzIGlzIGEgY2xlYW4ga2VybmVsIG9yIGlmIGFueXRoaW5nIHVudXN1YWwgaGFzCiBvY2N1cnJlZC4gIFRhaW50aW5nIGlzIHBlcm1hbmVudDogZXZlbiBpZiBhbiBvZmZlbmRpbmcgbW9kdWxlIGlzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ZyZWV6aW5nLW9mLXRhc2tzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CmluZGV4IDM4YjU3MjQuLjMxNmMyYmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0yMiwxMiArMjIsMTIgQEAKIGVpdGhlciB3YWtlcyB0aGVtIHVwLCBpZiB0aGV5IGFyZSBrZXJuZWwgdGhyZWFkcywgb3Igc2VuZHMgZmFrZSBzaWduYWxzIHRvIHRoZW0sCiBpZiB0aGV5IGFyZSB1c2VyIHNwYWNlIHByb2Nlc3Nlcy4gIEEgdGFzayB0aGF0IGhhcyBUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0CiB0byBpdCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBjYWxsZWQgcmVmcmlnZXJhdG9yKCkgKGRlZmluZWQgaW4KLWtlcm5lbC9wb3dlci9wcm9jZXNzLmMpLCB3aGljaCBzZXRzIHRoZSB0YXNrJ3MgUEZfRlJPWkVOIGZsYWcsIGNoYW5nZXMgaXRzIHN0YXRlCitrZXJuZWwvZnJlZXplci5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLCBjaGFuZ2VzIGl0cyBzdGF0ZQogdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzIGNsZWFyZWQgZm9yIGl0LgogVGhlbiwgd2Ugc2F5IHRoYXQgdGhlIHRhc2sgaXMgJ2Zyb3plbicgYW5kIHRoZXJlZm9yZSB0aGUgc2V0IG9mIGZ1bmN0aW9ucwogaGFuZGxpbmcgdGhpcyBtZWNoYW5pc20gaXMgcmVmZXJyZWQgdG8gYXMgJ3RoZSBmcmVlemVyJyAodGhlc2UgZnVuY3Rpb25zIGFyZQotZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jIGFuZCBpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCkuICBVc2VyIHNwYWNlCi1wcm9jZXNzZXMgYXJlIGdlbmVyYWxseSBmcm96ZW4gYmVmb3JlIGtlcm5lbCB0aHJlYWRzLgorZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jLCBrZXJuZWwvZnJlZXplci5jICYgaW5jbHVkZS9saW51eC9mcmVlemVyLmgpLgorVXNlciBzcGFjZSBwcm9jZXNzZXMgYXJlIGdlbmVyYWxseSBmcm96ZW4gYmVmb3JlIGtlcm5lbCB0aHJlYWRzLgogCiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2FsbCByZWZyaWdlcmF0b3IoKSBkaXJlY3RseS4gIEluc3RlYWQsIGl0IGlzCiByZWNvbW1lbmRlZCB0byB1c2UgdGhlIHRyeV90b19mcmVlemUoKSBmdW5jdGlvbiAoZGVmaW5lZCBpbgpAQCAtOTUsNyArOTUsNyBAQAogYWRkaXRpb25hbCBtZW1vcnkgYW5kIHdlIHByZXZlbnQgdGhlbSBmcm9tIGRvaW5nIHRoYXQgYnkgZnJlZXppbmcgdGhlbSBlYXJsaWVyLgogW09mIGNvdXJzZSwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIG5vdCBhbGxvY2F0ZSBzdWJzdGFudGlhbAogYW1vdW50cyBvZiBtZW1vcnkgZnJvbSB0aGVpciAuc3VzcGVuZCgpIGNhbGxiYWNrcyBiZWZvcmUgaGliZXJuYXRpb24sIGJ1dCB0aGlzCi1pcyBlIHNlcGFyYXRlIGlzc3VlLl0KK2lzIGEgc2VwYXJhdGUgaXNzdWUuXQogCiAzLiBUaGUgdGhpcmQgcmVhc29uIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMKIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgc3VzcGVuZGluZyBhbmQgcmVzdW1pbmcgb2YgZGV2aWNlcy4gIEEgdXNlciBzcGFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvbWFjaGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAppbmRleCBiNDI0MTliLi5jZTYzYWYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9tYWNoaW5lLnR4dApAQCAtMTYsNyArMTYsNyBAQAogZWFjaCByZWd1bGF0b3IuCiAKIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIGNvbnN1bWVyICovCisJY29uc3QgY2hhciAqZGV2X25hbWU7CS8qIGNvbnN1bWVyIGRldl9uYW1lKCkgKi8KIAljb25zdCBjaGFyICpzdXBwbHk7CS8qIGNvbnN1bWVyIHN1cHBseSAtIGUuZy4gInZjYyIgKi8KIH07CiAKQEAgLTI0LDEzICsyNCwxMyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcmVndWxhdG9yMV9jb25zdW1lcnNbXSA9IHsKIHsKLQkuZGV2CT0gJnBsYXRmb3JtX2NvbnN1bWVyQl9kZXZpY2UuZGV2LAotCS5zdXBwbHkJPSAiVmNjIiwKKwkuZGV2X25hbWUJPSAiZGV2X25hbWUoY29uc3VtZXIgQikiLAorCS5zdXBwbHkJCT0gIlZjYyIsCiB9LH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByZWd1bGF0b3IyX2NvbnN1bWVyc1tdID0gewogewotCS5kZXYJPSAmcGxhdGZvcm1fY29uc3VtZXJBX2RldmljZS5kZXYsCisJLmRldgk9ICJkZXZfbmFtZShjb25zdW1lciBBIiksCiAJLnN1cHBseQk9ICJWY2MiLAogfSx9OwogCkBAIC00Myw2ICs0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByZWd1bGF0b3IxX2RhdGEgPSB7CiAJLmNvbnN0cmFpbnRzID0geworCQkubmFtZSA9ICJSZWd1bGF0b3ItMSIsCiAJCS5taW5fdVYgPSAzMzAwMDAwLAogCQkubWF4X3VWID0gMzMwMDAwMCwKIAkJLnZhbGlkX21vZGVzX21hc2sgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwsCkBAIC01MSwxMyArNTIsMTkgQEAKIAkuY29uc3VtZXJfc3VwcGxpZXMgPSByZWd1bGF0b3IxX2NvbnN1bWVycywKIH07CiAKK1RoZSBuYW1lIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gc29tZXRoaW5nIHRoYXQgaXMgdXNlZnVsbHkgZGVzY3JpcHRpdmUKK2ZvciB0aGUgYm9hcmQgZm9yIGNvbmZpZ3VyYXRpb24gb2Ygc3VwcGxpZXMgZm9yIG90aGVyIHJlZ3VsYXRvcnMgYW5kCitmb3IgdXNlIGluIGxvZ2dpbmcgYW5kIG90aGVyIGRpYWdub3N0aWMgb3V0cHV0LiAgTm9ybWFsbHkgdGhlIG5hbWUKK3VzZWQgZm9yIHRoZSBzdXBwbHkgcmFpbCBpbiB0aGUgc2NoZW1hdGljIGlzIGEgZ29vZCBjaG9pY2UuICBJZiBubworbmFtZSBpcyBwcm92aWRlZCB0aGVuIHRoZSBzdWJzeXN0ZW0gd2lsbCBjaG9vc2Ugb25lLgorCiBSZWd1bGF0b3ItMSBzdXBwbGllcyBwb3dlciB0byBSZWd1bGF0b3ItMi4gVGhpcyByZWxhdGlvbnNoaXAgbXVzdCBiZSByZWdpc3RlcmVkCiB3aXRoIHRoZSBjb3JlIHNvIHRoYXQgUmVndWxhdG9yLTEgaXMgYWxzbyBlbmFibGVkIHdoZW4gQ29uc3VtZXIgQSBlbmFibGVzIGl0cwogc3VwcGx5IChSZWd1bGF0b3ItMikuIFRoZSBzdXBwbHkgcmVndWxhdG9yIGlzIHNldCBieSB0aGUgc3VwcGx5X3JlZ3VsYXRvcgotZmllbGQgYmVsb3c6LQorZmllbGQgYmVsb3cgYW5kIGNvOi0KIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJlZ3VsYXRvcjJfZGF0YSA9IHsKLQkuc3VwcGx5X3JlZ3VsYXRvciA9ICJyZWd1bGF0b3JfbmFtZSIsCisJLnN1cHBseV9yZWd1bGF0b3IgPSAiUmVndWxhdG9yLTEiLAogCS5jb25zdHJhaW50cyA9IHsKIAkJLm1pbl91ViA9IDE4MDAwMDAsCiAJCS5tYXhfdVYgPSAyMDAwMDAwLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKaW5kZXggMGU4NTYwOC4uNTMzNjE0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CkBAIC03ODksNiArNzg5LDE2IEBACiBTaW1pbGFybHksIGlmIHRoZSBwb3dlci51c2VfYXV0b3N1c3BlbmQgZmllbGQgaXNuJ3Qgc2V0IHRoZW4gdGhlIGF1dG9zdXNwZW5kCiBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSB0aGUgbm9uLWF1dG9zdXNwZW5kIGNvdW50ZXJwYXJ0cy4KIAorVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIGEgZHJpdmVyIG9yIHN1YnN5c3RlbSBtYXkgd2FudCB0byBwcmV2ZW50IGEgZGV2aWNlCitmcm9tIGF1dG9zdXNwZW5kaW5nIGltbWVkaWF0ZWx5LCBldmVuIHRob3VnaCB0aGUgdXNhZ2UgY291bnRlciBpcyB6ZXJvIGFuZCB0aGUKK2F1dG9zdXNwZW5kIGRlbGF5IHRpbWUgaGFzIGV4cGlyZWQuICBJZiB0aGUgLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjaworcmV0dXJucyAtRUFHQUlOIG9yIC1FQlVTWSwgYW5kIGlmIHRoZSBuZXh0IGF1dG9zdXNwZW5kIGRlbGF5IGV4cGlyYXRpb24gdGltZSBpcworaW4gdGhlIGZ1dHVyZSAoYXMgaXQgbm9ybWFsbHkgd291bGQgYmUgaWYgdGhlIGNhbGxiYWNrIGludm9rZWQKK3BtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koKSksIHRoZSBQTSBjb3JlIHdpbGwgYXV0b21hdGljYWxseSByZXNjaGVkdWxlIHRoZQorYXV0b3N1c3BlbmQuICBUaGUgLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjayBjYW4ndCBkbyB0aGlzIHJlc2NoZWR1bGluZworaXRzZWxmIGJlY2F1c2Ugbm8gc3VzcGVuZCByZXF1ZXN0cyBvZiBhbnkga2luZCBhcmUgYWNjZXB0ZWQgd2hpbGUgdGhlIGRldmljZSBpcworc3VzcGVuZGluZyAoaS5lLiwgd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJ1bm5pbmcpLgorCiBUaGUgaW1wbGVtZW50YXRpb24gaXMgd2VsbCBzdWl0ZWQgZm9yIGFzeW5jaHJvbm91cyB1c2UgaW4gaW50ZXJydXB0IGNvbnRleHRzLgogSG93ZXZlciBzdWNoIHVzZSBpbmV2aXRhYmx5IGludm9sdmVzIHJhY2VzLCBiZWNhdXNlIHRoZSBQTSBjb3JlIGNhbid0CiBzeW5jaHJvbml6ZSAtPnJ1bnRpbWVfc3VzcGVuZCgpIGNhbGxiYWNrcyB3aXRoIHRoZSBhcnJpdmFsIG9mIEkvTyByZXF1ZXN0cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmFwaWRpby9yYXBpZGlvLnR4dCBiL0RvY3VtZW50YXRpb24vcmFwaWRpby9yYXBpZGlvLnR4dAppbmRleCBiZTcwZWUxLi5jNzU2OTRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vcmFwaWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yYXBpZGlvL3JhcGlkaW8udHh0CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogQWZ0ZXIgdGhlIGhvc3QgaGFzIGNvbXBsZXRlZCBlbnVtZXJhdGlvbiBvZiB0aGUgZW50aXJlIG5ldHdvcmsgaXQgcmVsZWFzZXMKIGRldmljZXMgYnkgY2xlYXJpbmcgZGV2aWNlIElEIGxvY2tzIChjYWxscyByaW9fY2xlYXJfbG9ja3MoKSkuIEZvciBlYWNoIGVuZHBvaW50Ci1pbiB0aGUgc3lzdGVtLCBpdCBzZXRzIHRoZSBNYXN0ZXIgRW5hYmxlIGJpdCBpbiB0aGUgUG9ydCBHZW5lcmFsIENvbnRyb2wgQ1NSCitpbiB0aGUgc3lzdGVtLCBpdCBzZXRzIHRoZSBEaXNjb3ZlcmVkIGJpdCBpbiB0aGUgUG9ydCBHZW5lcmFsIENvbnRyb2wgQ1NSCiB0byBpbmRpY2F0ZSB0aGF0IGVudW1lcmF0aW9uIGlzIGNvbXBsZXRlZCBhbmQgYWdlbnRzIGFyZSBhbGxvd2VkIHRvIGV4ZWN1dGUKIHBhc3NpdmUgZGlzY292ZXJ5IG9mIHRoZSBuZXR3b3JrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vdHNpNzIxLnR4dCBiL0RvY3VtZW50YXRpb24vcmFwaWRpby90c2k3MjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWYzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vdHNpNzIxLnR4dApAQCAtMCwwICsxLDQ5IEBACitSYXBpZElPIHN1YnN5c3RlbSBtcG9ydCBkcml2ZXIgZm9yIElEVCBUc2k3MjEgUENJIEV4cHJlc3MtdG8tU1JJTyBicmlkZ2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuIE92ZXJ2aWV3CisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgYWxsIGN1cnJlbnRseSBkZWZpbmVkIFJhcGlkSU8gbXBvcnQgY2FsbGJhY2sgZnVuY3Rpb25zLgorSXQgc3VwcG9ydHMgbWFpbnRlbmFuY2UgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucywgaW5ib3VuZCBhbmQgb3V0Ym91bmQgUmFwaWRJTworZG9vcmJlbGxzLCBpbmJvdW5kIG1haW50ZW5hbmNlIHBvcnQtd3JpdGVzIGFuZCBSYXBpZElPIG1lc3NhZ2luZy4KKworVG8gZ2VuZXJhdGUgU1JJTyBtYWludGVuYW5jZSB0cmFuc2FjdGlvbnMgdGhpcyBkcml2ZXIgdXNlcyBvbmUgb2YgVHNpNzIxIERNQQorY2hhbm5lbHMuIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGFjY2VzcyB0byBsYXJnZXIgcmFuZ2Ugb2YgaG9wIGNvdW50cyBhbmQKK2Rlc3RpbmF0aW9uIElEcyB3aXRob3V0IG5lZWQgZm9yIGNoYW5nZXMgaW4gb3V0Ym91bmQgd2luZG93IHRyYW5zbGF0aW9uLgorCitSYXBpZElPIG1lc3NhZ2luZyBzdXBwb3J0IHVzZXMgZGVkaWNhdGVkIG1lc3NhZ2luZyBjaGFubmVscyBmb3IgZWFjaCBtYWlsYm94LgorRm9yIGluYm91bmQgbWVzc2FnZXMgdGhpcyBkcml2ZXIgdXNlcyBkZXN0aW5hdGlvbiBJRCBtYXRjaGluZyB0byBmb3J3YXJkIG1lc3NhZ2VzCitpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgcXVldWUuIE1lc3NhZ2luZyBjYWxsYmFja3MgYXJlIGltcGxlbWVudGVkIHRvIGJlCitmdWxseSBjb21wYXRpYmxlIHdpdGggUklPTkVUIGRyaXZlciAoRXRoZXJuZXQgb3ZlciBSYXBpZElPIG1lc3NhZ2luZyBzZXJ2aWNlcykuCisKK0lJLiBLbm93biBwcm9ibGVtcworCisgIE5vbmUuCisKK0lJSS4gVG8gZG8KKworIEFkZCBETUEgZGF0YSB0cmFuc2ZlcnMgKG5vbi1tZXNzYWdpbmcpLgorIEFkZCBpbmJvdW5kIHJlZ2lvbiAoU1JJTy10by1QQ0llKSBtYXBwaW5nLgorCitJVi4gVmVyc2lvbiBIaXN0b3J5CisKKyAgMS4wLjAgLSBJbml0aWFsIGRyaXZlciByZWxlYXNlLgorCitWLiAgTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBDb3B5cmlnaHQoYykgMjAxMSBJbnRlZ3JhdGVkIERldmljZSBUZWNobm9sb2d5LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYCmluZGV4IGMyZTE4ZTEuLmI0OGRlZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvMDAtSU5ERVgKQEAgLTI4LDYgKzI4LDggQEAKIAktIExpY2VuY2Ugb2YgdGhlIEZsYXNocG9pbnQgZHJpdmVyCiBMSUNFTlNFLnFsYTJ4eHgKIAktIExpY2Vuc2UgZm9yIFFMb2dpYyBMaW51eCBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXIgZmlybXdhcmUuCitMSUNFTlNFLnFsYTR4eHgKKwktIExpY2Vuc2UgZm9yIFFMb2dpYyBMaW51eCBpU0NTSSBIQkEgRHJpdmVyLgogTXlsZXgudHh0CiAJLSBpbmZvIG9uIGRyaXZlciBmb3IgTXlsZXggYWRhcHRlcnMKIE5pbmphU0NTSS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKaW5kZXggMWI2ZTI3ZC4uNjRhZGI5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKQEAgLTEsMyArMSwxOCBAQAorUmVsZWFzZSBEYXRlICAgIDogV2VkLiBPY3QgNSwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCisJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKKwkJCUFkYW0gUmFkZm9yZAorQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDYuMTItcmMxCitPbGQgVmVyc2lvbiAgICAgOiAwMC4wMC4wNS40MC1yYzEKKyAgICAxLiBDb250aW51ZSBib290aW5nIGltbWVkaWF0ZWx5IGlmIEZXIGluIEZBVUxUIGF0IGRyaXZlciBsb2FkIHRpbWUuCisgICAgMi4gSW5jcmVhc2UgZGVmYXVsdCBjbWRzIHBlciBsdW4gdG8gMjU2LgorICAgIDMuIEZpeCBtaXNtYXRjaCBpbiBtZWdhc2FzX3Jlc2V0X2Z1c2lvbigpIG11dGV4IGxvY2stdW5sb2NrLgorICAgIDQuIFJlbW92ZSBzb21lIHVuLW5lY2Vzc2FyeSBjb2RlLgorICAgIDUuIENsZWFyIHN0YXRlIGNoYW5nZSBpbnRlcnJ1cHRzIGZvciBGdXNpb24vSW52YWRlci4KKyAgICA2LiBDbGVhciBGVVNJT05fSU5fUkVTRVQgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMuCisgICAgNy4gQWRkIHN1cHBvcnQgZm9yIE1lZ2FSQUlEIDkzNjAvOTM4MCAxMkdCL3MgY29udHJvbGxlcnMuCisgICAgOC4gQWRkIG11bHRpcGxlIE1TSS1YIHZlY3Rvci9tdWx0aXBsZSByZXBseSBxdWV1ZSBzdXBwb3J0LgorICAgIDkuIEFkZCBkcml2ZXIgd29ya2Fyb3VuZCBmb3IgUEVSQzUvMTA2OCBrZHVtcCBrZXJuZWwgcGFuaWMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBSZWxlYXNlIERhdGUgICAgOiBUdWUuIEp1bCAyNiwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCiAJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKIAkJCUFkYW0gUmFkZm9yZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0xJQ0VOU0UucWxhNHh4eCBiL0RvY3VtZW50YXRpb24vc2NzaS9MSUNFTlNFLnFsYTR4eHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0OTgwZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9MSUNFTlNFLnFsYTR4eHgKQEAgLTAsMCArMSwzMTAgQEAKK0NvcHlyaWdodCAoYykgMjAwMy0yMDExIFFMb2dpYyBDb3Jwb3JhdGlvbgorUUxvZ2ljIExpbnV4IGlTQ1NJIEhCQSBEcml2ZXIKKworVGhpcyBwcm9ncmFtIGluY2x1ZGVzIGEgZGV2aWNlIGRyaXZlciBmb3IgTGludXggMy54LgorWW91IG1heSBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgZGV2aWNlIGRyaXZlciBjb2RlIHVuZGVyIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGEgY29weSBvZiB3aGljaCBpcyBhdHRhY2hlZCBoZXJldG8gYXMKK0V4aGliaXQgQSkgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKHZlcnNpb24gMikuCisKK1JFR0FSRExFU1MgT0YgV0hBVCBMSUNFTlNJTkcgTUVDSEFOSVNNIElTIFVTRUQgT1IgQVBQTElDQUJMRSwKK1RISVMgUFJPR1JBTSBJUyBQUk9WSURFRCBCWSBRTE9HSUMgQ09SUE9SQVRJT04gIkFTIElTJycgQU5EIEFOWQorRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUgorQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitVU0VSIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTIFRIQVQgVVNFIE9GIFRISVMgUFJPR1JBTSBXSUxMIE5PVAorQ1JFQVRFIE9SIEdJVkUgR1JPVU5EUyBGT1IgQSBMSUNFTlNFIEJZIElNUExJQ0FUSU9OLCBFU1RPUFBFTCwgT1IKK09USEVSV0lTRSBJTiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyAoUEFURU5ULCBDT1BZUklHSFQsCitUUkFERSBTRUNSRVQsIE1BU0sgV09SSywgT1IgT1RIRVIgUFJPUFJJRVRBUlkgUklHSFQpIEVNQk9ESUVEIElOCitBTlkgT1RIRVIgUUxPR0lDIEhBUkRXQVJFIE9SIFNPRlRXQVJFIEVJVEhFUiBTT0xFTFkgT1IgSU4KK0NPTUJJTkFUSU9OIFdJVEggVEhJUyBQUk9HUkFNLgorCisKK0VYSElCSVQgQQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9ibngyZmMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2JueDJmYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MjM1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9ibngyZmMudHh0CkBAIC0wLDAgKzEsNzUgQEAKK09wZXJhdGluZyBGQ29FIHVzaW5nIGJueDJmYworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitCcm9hZGNvbSBGQ29FIG9mZmxvYWQgdGhyb3VnaCBibngyZmMgaXMgZnVsbCBzdGF0ZWZ1bCBoYXJkd2FyZSBvZmZsb2FkIHRoYXQKK2Nvb3BlcmF0ZXMgd2l0aCBhbGwgaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGUgTGludXggZWNvc3lzdGVtIGZvciBGQy9GQ29FIGFuZAorU0NTSSBjb250cm9sbGVycy4gIEFzIHN1Y2gsIEZDb0UgZnVuY3Rpb25hbGl0eSwgb25jZSBlbmFibGVkIGlzIGxhcmdlbHkKK3RyYW5zcGFyZW50LiBEZXZpY2VzIGRpc2NvdmVyZWQgb24gdGhlIFNBTiB3aWxsIGJlIHJlZ2lzdGVyZWQgYW5kIHVucmVnaXN0ZXJlZAorYXV0b21hdGljYWxseSB3aXRoIHRoZSB1cHBlciBzdG9yYWdlIGxheWVycy4KKworRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBCcm9hZGNvbSdzIEZDb0Ugb2ZmbG9hZCBpcyBmdWxseSBvZmZsb2FkZWQsIGl0IGRvZXMKK2RlcGVuZCBvbiB0aGUgc3RhdGUgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB0byBvcGVyYXRlLiBBcyBzdWNoLCB0aGUgbmV0d29yaworaW50ZXJmYWNlIChlLmcuIGV0aDApIGFzc29jaWF0ZWQgd2l0aCB0aGUgRkNvRSBvZmZsb2FkIGluaXRpYXRvciBtdXN0IGJlICd1cCcuCitJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBuZXR3b3JrIGludGVyZmFjZXMgYmUgY29uZmlndXJlZCB0byBiZSBicm91Z2h0IHVwCithdXRvbWF0aWNhbGx5IGF0IGJvb3QgdGltZS4KKworRnVydGhlcm1vcmUsIHRoZSBCcm9hZGNvbSBGQ29FIG9mZmxvYWQgc29sdXRpb24gY3JlYXRlcyBWTEFOIGludGVyZmFjZXMgdG8KK3N1cHBvcnQgdGhlIFZMQU5zIHRoYXQgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgZm9yIEZDb0Ugb3BlcmF0aW9uIChlLmcuCitldGgwLjEwMDEtZmNvZSkuICBEbyBub3QgZGVsZXRlIG9yIGRpc2FibGUgdGhlc2UgaW50ZXJmYWNlcyBvciBGQ29FIG9wZXJhdGlvbgord2lsbCBiZSBkaXNydXB0ZWQuCisKK0RyaXZlciBVc2FnZSBNb2RlbDoKKz09PT09PT09PT09PT09PT09PT0KKworMS4gRW5zdXJlIHRoYXQgZmNvZS11dGlscyBwYWNrYWdlIGlzIGluc3RhbGxlZC4KKworMi4gQ29uZmlndXJlIHRoZSBpbnRlcmZhY2VzIG9uIHdoaWNoIGJueDJmYyBkcml2ZXIgaGFzIHRvIG9wZXJhdGUgb24uCitIZXJlIGFyZSB0aGUgc3RlcHMgdG8gY29uZmlndXJlOgorCWEuIGNkIC9ldGMvZmNvZQorCWIuIGNvcHkgY2ZnLWV0aHggdG8gY2ZnLWV0aDUgaWYgRkNvRSBoYXMgdG8gYmUgZW5hYmxlZCBvbiBldGg1LgorCWMuIFJlcGVhdCB0aGlzIGZvciBhbGwgdGhlIGludGVyZmFjZXMgd2hlcmUgRkNvRSBoYXMgdG8gYmUgZW5hYmxlZC4KKwlkLiBFZGl0IGFsbCB0aGUgY2ZnLWV0aCBmaWxlcyB0byBzZXQgIm5vIiBmb3IgRENCX1JFUVVJUkVEKiogZmllbGQsIGFuZAorCSAgICJ5ZXMiIGZvciBBVVRPX1ZMQU4uCisJZS4gT3RoZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSBsZWZ0IGFzIGRlZmF1bHQKKworMy4gRW5zdXJlIHRoYXQgImJueDJmYyIgaXMgaW4gU1VQUE9SVEVEX0RSSVZFUlMgbGlzdCBpbiAvZXRjL2Zjb2UvY29uZmlnLgorCis0LiBTdGFydCBmY29lIHNlcnZpY2UuIChzZXJ2aWNlIGZjb2Ugc3RhcnQpLiBJZiBCcm9hZGNvbSBkZXZpY2VzIGFyZSBwcmVzZW50IGluCit0aGUgc3lzdGVtLCBibngyZmMgZHJpdmVyIHdvdWxkIGF1dG9tYXRpY2FsbHkgY2xhaW0gdGhlIGludGVyZmFjZXMsIHN0YXJ0cyB2bGFuCitkaXNjb3ZlcnkgYW5kIGxvZyBpbnRvIHRoZSB0YXJnZXRzLgorCis1LiAiU3ltYm9saWMgTmFtZSIgaW4gJ2Zjb2VhZG0gLWknIG91dHB1dCB3b3VsZCBkaXNwbGF5IGlmIGJueDJmYyBoYXMgY2xhaW1lZAordGhlIGludGVyZmFjZS4KK0VnOgorW3Jvb3RAYmgyIH5dIyBmY29lYWRtIC1pCisgICAgRGVzY3JpcHRpb246ICAgICAgTmV0WHRyZW1lIElJIEJDTTU3NzEyIDEwIEdpZ2FiaXQgRXRoZXJuZXQKKyAgICBSZXZpc2lvbjogICAgICAgICAwMQorICAgIE1hbnVmYWN0dXJlcjogICAgIEJyb2FkY29tIENvcnBvcmF0aW9uCisgICAgU2VyaWFsIE51bWJlcjogICAgMDAxMDE4NkZENTU4CisgICAgRHJpdmVyOiAgICAgICAgICAgYm54MnggMS43MC4wMC0wCisgICAgTnVtYmVyIG9mIFBvcnRzOiAgMgorCisgICAgICAgIFN5bWJvbGljIE5hbWU6ICAgICBibngyZmMgdjEuMC41IG92ZXIgZXRoNS40CisgICAgICAgIE9TIERldmljZSBOYW1lOiAgICBob3N0MTEKKyAgICAgICAgTm9kZSBOYW1lOiAgICAgICAgIDB4MTAwMDAwMTAxODZGRDU1OQorICAgICAgICBQb3J0IE5hbWU6ICAgICAgICAgMHgyMDAwMDAxMDE4NkZENTU5CisgICAgICAgIEZhYnJpY05hbWU6ICAgICAgICAweDIwMDEwMDBERUNCM0I2ODEKKyAgICAgICAgU3BlZWQ6ICAgICAgICAgICAgIDEwIEdiaXQKKyAgICAgICAgU3VwcG9ydGVkIFNwZWVkOiAgIDEwIEdiaXQKKyAgICAgICAgTWF4RnJhbWVTaXplOiAgICAgIDIwNDgKKyAgICAgICAgRkMtSUQgKFBvcnQgSUQpOiAgIDB4MEYwMzc3CisgICAgICAgIFN0YXRlOiAgICAgICAgICAgICBPbmxpbmUKKworNi4gVmVyaWZ5IHRoZSB2bGFuIGRpc2NvdmVyeSBpcyBwZXJmb3JtZWQgYnkgcnVubmluZyBpZmNvbmZpZyBhbmQgbm90aWNlCis8SU5URVJGQUNFPi48VkxBTj4tZmNvZSBpbnRlcmZhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCisKK1JlZmVyIHRvIGZjb2VhZG0gbWFucGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmY29lYWRtIG9wZXJhdGlvbnMgdG8KK2NyZWF0ZS9kZXN0cm95IGludGVyZmFjZXMgb3IgdG8gZGlzcGxheSBsdW4vdGFyZ2V0IGluZm9ybWF0aW9uLgorCitOT1RFOgorPT09PQorKiogQnJvYWRjb20gRkNvRSBjYXBhYmxlIGRldmljZXMgaW1wbGVtZW50IGEgRENCWC9MTERQIGNsaWVudCBvbi1jaGlwLiBPbmx5IG9uZQorTExEUCBjbGllbnQgaXMgYWxsb3dlZCBwZXIgaW50ZXJmYWNlLiBGb3IgcHJvcGVyIG9wZXJhdGlvbiBhbGwgaG9zdCBzb2Z0d2FyZQorYmFzZWQgRENCWC9MTERQIGNsaWVudHMgKGUuZy4gbGxkcGFkKSBtdXN0IGJlIGRpc2FibGVkLiBUbyBkaXNhYmxlIGxsZHBhZCBvbiBhCitnaXZlbiBpbnRlcmZhY2UsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKK2xsZHB0b29sIHNldC1sbGRwIC1pIDxpbnRlcmZhY2VfbmFtZT4gYWRtaW5TdGF0dXM9ZGlzYWJsZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2NvbXB1dG9uZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9jb21wdXRvbmUudHh0CmluZGV4IDYwYTZmNjUuLjM5ZGRjZGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VyaWFsL2NvbXB1dG9uZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvY29tcHV0b25lLnR4dApAQCAtMjAsOCArMjAsNiBAQAogRGF0ZTogMTEvMDEvMjAwMQogSGlzdG9yaWNhbCBBdXRob3I6IEFuZHJldyBNYW5pc29uIDxhbWFuaXNvbkBhbWVyaWNhLm5ldD4KIFByaW1hcnkgQXV0aG9yOiBEb3VnIE1jTmFzaAotU3VwcG9ydDogc3VwcG9ydEBjb21wdXRvbmUuY29tCi1GaXhlcyBhbmQgVXBkYXRlczogTWlrZSBXYXJmaWVsZCA8bWh3QHdpdHRzZW5kLmNvbT4KIAogVGhpcyBmaWxlIGFzc3VtZXMgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBDb21wdXRvbmUgZHJpdmVycyB3aGljaCBhcmUKIGludGVncmF0ZWQgaW50byB0aGUga2VybmVsIHNvdXJjZXMuICBGb3IgdXBkYXRpbmcgdGhlIGRyaXZlcnMgb3IgaW5zdGFsbGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAppbmRleCA4OTc1NzAxLi45MzY2OTllIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dApAQCAtODg2LDYgKzg4NiwxMiBAQAogCQlkaXNhYmxlKQogICAgIHBvd2VyX3NhdmVfY29udHJvbGxlciAtIFJlc2V0IEhELWF1ZGlvIGNvbnRyb2xsZXIgaW4gcG93ZXItc2F2aW5nIG1vZGUKIAkJKGRlZmF1bHQgPSBvbikKKyAgICBhbGlnbl9idWZmZXJfc2l6ZSAtIEZvcmNlIHJvdW5kaW5nIG9mIGJ1ZmZlci9wZXJpb2Qgc2l6ZXMgdG8gbXVsdGlwbGVzCisgICAgCQkgICAgICBvZiAxMjggYnl0ZXMuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgaW4gdGVybXMgb2YgbWVtb3J5CisJCSAgICAgIGFjY2VzcyBidXQgaXNuJ3QgcmVxdWlyZWQgYnkgdGhlIEhEQSBzcGVjIGFuZCBwcmV2ZW50cworCQkgICAgICB1c2VycyBmcm9tIHNwZWNpZnlpbmcgZXhhY3QgcGVyaW9kL2J1ZmZlciBzaXplcy4KKwkJICAgICAgKGRlZmF1bHQgPSBvbikKKyAgICBzbm9vcAktIEVuYWJsZS9kaXNhYmxlIHNub29waW5nIChkZWZhdWx0ID0gb24pCiAKICAgICBUaGlzIG1vZHVsZSBzdXBwb3J0cyBtdWx0aXBsZSBjYXJkcyBhbmQgYXV0b3Byb2JlLgogICAgIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLUNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Db250cm9scy50eHQKaW5kZXggMTQ4MjAzNS4uZTk2MjFlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLUNvbnRyb2xzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tQ29udHJvbHMudHh0CkBAIC05OCwzICs5OCwxOSBAQAogCiAqIEF1dG8tTXV0ZSBNb2RlCiAgIFNlZSBSZWF0ZWsgY29kZWNzLgorCisKK0FuYWxvZyBjb2RlY3MKKy0tLS0tLS0tLS0tLS0tCisKKyogQ2hhbm5lbCBNb2RlCisgIFRoaXMgaXMgYW4gZW51bSBjb250cm9sIHRvIGNoYW5nZSB0aGUgc3Vycm91bmQtY2hhbm5lbCBzZXR1cCwKKyAgYXBwZWFycyBvbmx5IHdoZW4gdGhlIHN1cnJvdW5kIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuCisgIEl0IGdpdmVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgdXNlZCwgIjJjaCIsICI0Y2giIGFuZCAiNmNoIi4KKyAgQWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLCB0aGlzIGFsc28gY29udHJvbHMgdGhlCisgIGphY2stcmV0YXNraW5nIG9mIG11bHRpLUkvTyBqYWNrcy4KKworKiBJbmRlcGVuZGVudCBIUAorICBXaGVuIHRoaXMgZW51bSBjb250cm9sIGlzIGVuYWJsZWQsIHRoZSBoZWFkcGhvbmUgb3V0cHV0IGlzIHJvdXRlZAorICBmcm9tIGFuIGluZGl2aWR1YWwgc3RyZWFtICh0aGUgdGhpcmQgUENNIHN1Y2ggYXMgaHc6MCwyKSBpbnN0ZWFkIG9mCisgIHRoZSBwcmltYXJ5IHN0cmVhbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKaW5kZXggZDcwYzkzYi4uZWRhZDk5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQKQEAgLTI5LDkgKzI5LDYgQEAKIAogQUxDMjYwCiA9PT09PT0KLSAgaHAJCUhQIG1hY2hpbmVzCi0gIGhwLTMwMTMJSFAgbWFjaGluZXMgKDMwMTMtdmFyaWFudCkKLSAgaHAtZGM3NjAwCUhQIERDNzYwMAogICBmdWppdHN1CUZ1aml0c3UgUzcwMjAKICAgYWNlcgkJQWNlciBUcmF2ZWxNYXRlCiAgIHdpbGwJCVdpbGwgbGFwdG9wcyAoUEIgVjc5MDApCkBAIC00NiwxNSArNDMsMTAgQEAKIEFMQzI2MgogPT09PT09CiAgIGZ1aml0c3UJRnVqaXRzdSBMYXB0b3AKLSAgaHAtYnBjCUhQIHh3NDQwMC82NDAwLzg0MDAvOTQwMCBsYXB0b3BzCi0gIGhwLWJwYy1kNzAwMAlIUCBCUEMgRDcwMDAKLSAgaHAtdGMtdDU3MzUJSFAgVGhpbiBDbGllbnQgVDU3MzUKLSAgaHAtcnA1NzAwCUhQIFJQNTcwMAogICBiZW5xCQlCZW5xIEVEOAogICBiZW5xLXQzMQlCZW5xIFQzMQogICBoaXBwbwkJSGlwcG8gKEFUSSkgd2l0aCBqYWNrIGRldGVjdGlvbiwgU29ueSBVWC05MHMKICAgaGlwcG9fMQlIaXBwbyAoQmVucSkgd2l0aCBqYWNrIGRldGVjdGlvbgotICBzb255LWFzc2FtZAlTb255IEFTU0FNRAogICB0b3NoaWJhLXMwNglUb3NoaWJhIFMwNgogICB0b3NoaWJhLXJ4MQlUb3NoaWJhIFJYMQogICB0eWFuCQlUeWFuIFRodW5kZXIgbjY2NTBXIChTMjkxNS1FKQpAQCAtNjYsNDMgKzU4LDE1IEBACiAKIEFMQzI2Ny8yNjgKID09PT09PT09PT0KLSAgcXVhbnRhLWlsMQlRdWFudGEgSUwxIG1pbmktbm90ZWJvb2sKLSAgM3N0YWNrCTMtc3RhY2sgbW9kZWwKLSAgdG9zaGliYQlUb3NoaWJhIEEyMDUKLSAgYWNlcgkJQWNlciBsYXB0b3BzCi0gIGFjZXItZG1pYwlBY2VyIGxhcHRvcHMgd2l0aCBkaWdpdGFsLW1pYwotICBhY2VyLWFzcGlyZQlBY2VyIEFzcGlyZSBPbmUKLSAgZGVsbAkJRGVsbCBPRU0gbGFwdG9wcyAoVm9zdHJvIDEyMDApCi0gIHplcHRvCQlaZXB0byBsYXB0b3BzCi0gIHRlc3QJCWZvciB0ZXN0aW5nL2RlYnVnZ2luZyBwdXJwb3NlLCBhbG1vc3QgYWxsIGNvbnRyb2xzIGNhbgotCQlhZGp1c3RlZC4gIEFwcGVhcmluZyBvbmx5IHdoZW4gY29tcGlsZWQgd2l0aAotCQkkQ09ORklHX1NORF9ERUJVRz15Ci0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIEFMQzI2OQogPT09PT09Ci0gIGJhc2ljCQlCYXNpYyBwcmVzZXQKLSAgcXVhbnRhCVF1YW50YSBGTDEKICAgbGFwdG9wLWFtaWMJTGFwdG9wcyB3aXRoIGFuYWxvZy1taWMgaW5wdXQKICAgbGFwdG9wLWRtaWMJTGFwdG9wcyB3aXRoIGRpZ2l0YWwtbWljIGlucHV0Ci0gIGZ1aml0c3UJRlNDIEFtaWxvCi0gIGxpZmVib29rCUZ1aml0c3UgTGlmZWJvb2sgUzY0MjAKLSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiBBTEM2NjIvNjYzLzI3MgogPT09PT09PT09PT09PT0KLSAgM3N0YWNrLWRpZwkzLXN0YWNrICgyLWNoYW5uZWwpIHdpdGggU1BESUYKLSAgM3N0YWNrLTZjaAkgMy1zdGFjayAoNi1jaGFubmVsKQotICAzc3RhY2stNmNoLWRpZyAzLXN0YWNrICg2LWNoYW5uZWwpIHdpdGggU1BESUYKLSAgNXN0YWNrLWRpZwkgNS1zdGFjayB3aXRoIFNQRElGCi0gIGxlbm92by0xMDFlCSBMZW5vdm8gbGFwdG9wCi0gIGVlZXBjLXA3MDEJQVNVUyBFZWVwYyBQNzAxCi0gIGVlZXBjLWVwMjAJQVNVUyBFZWVwYyBFUDIwCi0gIGVjcwkJRUNTL0ZveGNvbm4gbW9ibwotICBtNTF2YQkJQVNVUyBNNTFWQQotICBnNzF2CQlBU1VTIEc3MVYKLSAgaDEzCQlBU1VTIEgxMwotICBnNTB2CQlBU1VTIEc1MFYKICAgYXN1cy1tb2RlMQlBU1VTCiAgIGFzdXMtbW9kZTIJQVNVUwogICBhc3VzLW1vZGUzCUFTVVMKQEAgLTExMSwxNSArNzUsMTAgQEAKICAgYXN1cy1tb2RlNglBU1VTCiAgIGFzdXMtbW9kZTcJQVNVUwogICBhc3VzLW1vZGU4CUFTVVMKLSAgZGVsbAkJRGVsbCB3aXRoIEFMQzI3MgotICBkZWxsLXptMQlEZWxsIFpNMSB3aXRoIEFMQzI3MgotICBzYW1zdW5nLW5jMTAJU2Ftc3VuZyBOQzEwIG1pbmkgbm90ZWJvb2sKLSAgYXV0bwkJYXV0by1jb25maWcgcmVhZGluZyBCSU9TIChkZWZhdWx0KQogCiBBTEM2ODAKID09PT09PQotICBiYXNlCQlCYXNlIG1vZGVsIChBU1VTIE5YOTApCi0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIEFMQzg4Mi84ODMvODg1Lzg4OC84ODkKID09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE3NSwyOCArMTM0LDExIEBACiAKIEFMQzg2MS82NjAKID09PT09PT09PT0KLSAgM3N0YWNrCTMtamFjawotICAzc3RhY2stZGlnCTMtamFjayB3aXRoIFNQRElGIEkvTwotICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIEkvTwotICAzc3RhY2stNjYwCTMtamFjayAoZm9yIEFMQzY2MCkKLSAgdW5pd2lsbC1tMzEJVW5pd2lsbCBNMzEgbGFwdG9wCi0gIHRvc2hpYmEJVG9zaGliYSBsYXB0b3Agc3VwcG9ydAotICBhc3VzCQlBc3VzIGxhcHRvcCBzdXBwb3J0Ci0gIGFzdXMtbGFwdG9wCUFTVVMgRjIvRjMgbGFwdG9wcwotICBhdXRvCQlhdXRvLWNvbmZpZyByZWFkaW5nIEJJT1MgKGRlZmF1bHQpCisgIE4vQQogCiBBTEM4NjFWRC82NjBWRAogPT09PT09PT09PT09PT0KLSAgM3N0YWNrCTMtamFjawotICAzc3RhY2stZGlnCTMtamFjayB3aXRoIFNQRElGIE9VVAotICA2c3RhY2stZGlnCTYtamFjayB3aXRoIFNQRElGIE9VVAotICAzc3RhY2stNjYwCTMtamFjayAoZm9yIEFMQzY2MFZEKQotICAzc3RhY2stNjYwLWRpZ291dCAzLWphY2sgd2l0aCBTUERJRiBPVVQgKGZvciBBTEM2NjBWRCkKLSAgbGVub3ZvCUxlbm92byAzMDAwIEMyMDAKLSAgZGFsbGFzCURhbGxhcyBsYXB0b3BzCi0gIGhwCQlIUCBUWDEwMDAKLSAgYXN1cy12MXMJQVNVUyBWMVNuCi0gIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKKyAgTi9BCiAKIENNSTk4ODAKID09PT09PT0KQEAgLTI4OSw3ICsyMzEsNiBAQAogICBocC1kdjY3MzYJSFAgZHY2NzM2CiAgIGhwLWY3MDAJSFAgQ29tcGFxIFByZXNhcmlvIEY3MDAKICAgaWRlYXBhZAlMZW5vdm8gSWRlYVBhZCBsYXB0b3AKLSAgbGVub3ZvLXgyMDAJTGVub3ZvIFgyMDAgbGFwdG9wCiAgIHRvc2hpYmEJVG9zaGliYSBTYXRlbGxpdGUgTTMwMAogCiBDb25leGFudCA1MDY2CkBAIC00MDgsNiArMzQ5LDcgQEAKICAgcmVmCQlSZWZlcmVuY2UgYm9hcmQKICAgbWljLXJlZglSZWZlcmVuY2UgYm9hcmQgd2l0aCBwb3dlciBtYW5hZ2VtZW50IGZvciBwb3J0cwogICBkZWxsLXMxNAlEZWxsIGxhcHRvcAorICBkZWxsLXZvc3Ryby0zNTAwCURlbGwgVm9zdHJvIDM1MDAgbGFwdG9wCiAgIGhwCQlIUCBsYXB0b3BzIHdpdGggKGludmVydGVkKSBtdXRlLUxFRAogICBocC1kdjctNDAwMAlIUCBkdi03IDQwMDAKICAgYXV0bwkJQklPUyBzZXR1cCAoZGVmYXVsdCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0CmluZGV4IGM4MmJlYjAuLjAzZTI3NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLnR4dApAQCAtNDQ3LDcgKzQ0NywxMCBAQAogdGhyZWUgbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBjb2RlYyB2ZW5kb3ItaWQgKDB4MTIzNDU2NzggaW4gdGhlCiBleGFtcGxlKSwgdGhlIGNvZGVjIHN1YnN5c3RlbS1pZCAoMHhhYmNkMTIzNCkgYW5kIHRoZSBhZGRyZXNzICgyKSBvZgogdGhlIGNvZGVjLiAgVGhlIHJlc3QgcGF0Y2ggZW50cmllcyBhcmUgYXBwbGllZCB0byB0aGlzIHNwZWNpZmllZCBjb2RlYwotdW50aWwgYW5vdGhlciBjb2RlYyBlbnRyeSBpcyBnaXZlbi4KK3VudGlsIGFub3RoZXIgY29kZWMgZW50cnkgaXMgZ2l2ZW4uICBQYXNzaW5nIDAgb3IgYSBuZWdhdGl2ZSBudW1iZXIgdG8KK3RoZSBmaXJzdCBvciB0aGUgc2Vjb25kIHZhbHVlIHdpbGwgbWFrZSB0aGUgY2hlY2sgb2YgdGhlIGNvcnJlc3BvbmRpbmcKK2ZpZWxkIGJlIHNraXBwZWQuICBJdCdsbCBiZSB1c2VmdWwgZm9yIHJlYWxseSBicm9rZW4gZGV2aWNlcyB0aGF0IGRvbid0Citpbml0aWFsaXplIFNTSUQgcHJvcGVybHkuCiAKIFRoZSBgW21vZGVsXWAgbGluZSBhbGxvd3MgdG8gY2hhbmdlIHRoZSBtb2RlbCBuYW1lIG9mIHRoZSBlYWNoIGNvZGVjLgogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdpbGwgYmUgY2hhbmdlZCB0byBtb2RlbD1hdXRvLgpAQCAtNDkxLDcgKzQ5NCw3IEBACiBUaGUgaGQtYXVkaW8gZHJpdmVyIHJlYWRzIHRoZSBmaWxlIHZpYSByZXF1ZXN0X2Zpcm13YXJlKCkuICBUaHVzLAogYSBwYXRjaCBmaWxlIGhhcyB0byBiZSBsb2NhdGVkIG9uIHRoZSBhcHByb3ByaWF0ZSBmaXJtd2FyZSBwYXRoLAogdHlwaWNhbGx5LCAvbGliL2Zpcm13YXJlLiAgRm9yIGV4YW1wbGUsIHdoZW4geW91IHBhc3MgdGhlIG9wdGlvbgotYHBhdGNoPWhkYS1pbml0LmZ3YCwgdGhlIGZpbGUgL2xpYi9maXJtd2FyZS9oZGEtaW5pdC1mdyBtdXN0IGJlCitgcGF0Y2g9aGRhLWluaXQuZndgLCB0aGUgZmlsZSAvbGliL2Zpcm13YXJlL2hkYS1pbml0LmZ3IG11c3QgYmUKIHByZXNlbnQuCiAKIFRoZSBwYXRjaCBtb2R1bGUgb3B0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggY2FyZCBpbnN0YW5jZSwgYW5kIHlvdQpAQCAtNTI0LDYgKzUyNyw1NCBAQAogY2hlY2sgdGhlIGN1cnJlbnQgdmFsdWUuICBJZiBpdCdzIG5vbi16ZXJvLCB0aGUgZmVhdHVyZSBpcyB0dXJuZWQgb24uCiAKIAorVHJhY2Vwb2ludHMKK35+fn5+fn5+fn5+CitUaGUgaGQtYXVkaW8gZHJpdmVyIGdpdmVzIGEgZmV3IGJhc2ljIHRyYWNlcG9pbnRzLgorYGhkYTpoZGFfc2VuZF9jbWRgIHRyYWNlcyBlYWNoIENPUkIgd3JpdGUgd2hpbGUgYGhkYTpoZGFfZ2V0X3Jlc3BvbnNlYAordHJhY2VzIHRoZSByZXNwb25zZSBmcm9tIFJJUkIgKG9ubHkgd2hlbiByZWFkIGZyb20gdGhlIGNvZGVjIGRyaXZlcikuCitgaGRhOmhkYV9idXNfcmVzZXRgIHRyYWNlcyB0aGUgYnVzLXJlc2V0IGR1ZSB0byBmYXRhbCBlcnJvciwgZXRjLAorYGhkYTpoZGFfdW5zb2xfZXZlbnRgIHRyYWNlcyB0aGUgdW5zb2xpY2l0ZWQgZXZlbnRzLCBhbmQKK2BoZGE6aGRhX3Bvd2VyX2Rvd25gIGFuZCBgaGRhOmhkYV9wb3dlcl91cGAgdHJhY2UgdGhlIHBvd2VyIGRvd24vdXAKK3ZpYSBwb3dlci1zYXZpbmcgYmVoYXZpb3IuCisKK0VuYWJsaW5nIGFsbCB0cmFjZXBvaW50cyBjYW4gYmUgZG9uZSBsaWtlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBlY2hvIDEgPiAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9oZGEvZW5hYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RoZW4gYWZ0ZXIgc29tZSBjb21tYW5kcywgeW91IGNhbiB0cmFjZXMgZnJvbQorL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZSBmaWxlLiAgRm9yIGV4YW1wbGUsIHdoZW4geW91IHdhbnQgdG8KK3RyYWNlIHdoYXQgY29kZWMgY29tbWFuZCBpcyBzZW50LCBlbmFibGUgdGhlIHRyYWNlcG9pbnQgbGlrZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlCisgICMgdHJhY2VyOiBub3AKKyAgIworICAjICAgICAgIFRBU0stUElEICAgIENQVSMgICAgVElNRVNUQU1QICBGVU5DVElPTgorICAjICAgICAgICAgIHwgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgICB8CisgICAgICAgICA8Li4uPi03ODA3ICBbMDAyXSAxMDUxNDcuNzc0ODg5OiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lM2EwMTkKKyAgICAgICAgIDwuLi4+LTc4MDcgIFswMDJdIDEwNTE0Ny43NzQ4OTM6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzOTAxOQorICAgICAgICAgPC4uLj4tNzgwNyAgWzAwMl0gMTA1MTQ3Ljk5OTU0MjogaGRhX3NlbmRfY21kOiBbMDowXSB2YWw9ZTNhMDFhCisgICAgICAgICA8Li4uPi03ODA3ICBbMDAyXSAxMDUxNDcuOTk5NTQzOiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lMzkwMWEKKyAgICAgICAgIDwuLi4+LTI2NzY0IFswMDFdIDM0OTIyMi44MzcxNDM6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzYTAxOQorICAgICAgICAgPC4uLj4tMjY3NjQgWzAwMV0gMzQ5MjIyLjgzNzE0ODogaGRhX3NlbmRfY21kOiBbMDowXSB2YWw9ZTM5MDE5CisgICAgICAgICA8Li4uPi0yNjc2NCBbMDAxXSAzNDkyMjMuMDU4NTM5OiBoZGFfc2VuZF9jbWQ6IFswOjBdIHZhbD1lM2EwMWEKKyAgICAgICAgIDwuLi4+LTI2NzY0IFswMDFdIDM0OTIyMy4wNTg1NDE6IGhkYV9zZW5kX2NtZDogWzA6MF0gdmFsPWUzOTAxYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIZXJlIGBbMDowXWAgaW5kaWNhdGVzIHRoZSBjYXJkIG51bWJlciBhbmQgdGhlIGNvZGVjIGFkZHJlc3MsIGFuZAorYHZhbGAgc2hvd3MgdGhlIHZhbHVlIHNlbnQgdG8gdGhlIGNvZGVjLCByZXNwZWN0aXZlbHkuICBUaGUgdmFsdWUgaXMKK2EgcGFja2VkIHZhbHVlLCBhbmQgeW91IGNhbiBkZWNvZGUgaXQgdmlhIGhkYS1kZWNvZGUtdmVyYiBwcm9ncmFtCitpbmNsdWRlZCBpbiBoZGEtZW11IHBhY2thZ2UgYmVsb3cuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIGUzYTAxOSBpcwordG8gc2V0IHRoZSBsZWZ0IG91dHB1dC1hbXAgdmFsdWUgdG8gMjUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgJSBoZGEtZGVjb2RlLXZlcmIgMHhlM2EwMTkKKyAgcmF3IHZhbHVlID0gMHgwMGUzYTAxOQorICBjaWQgPSAwLCBuaWQgPSAweDBlLCB2ZXJiID0gMHgzYTAsIHBhcm0gPSAweDE5CisgIHJhdyB2YWx1ZTogdmVyYiA9IDB4M2EwLCBwYXJtID0gMHgxOQorICB2ZXJibmFtZSA9IHNldF9hbXBfZ2Fpbl9tdXRlCisgIGFtcCByYXcgdmFsID0gMHhhMDE5CisgIG91dHB1dCwgbGVmdCwgaWR4PTAsIG11dGU9MCwgdmFsPTI1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCiBEZXZlbG9wbWVudCBUcmVlCiB+fn5+fn5+fn5+fn5+fn5+CiBUaGUgbGF0ZXN0IGRldmVsb3BtZW50IGNvZGVzIGZvciBIRC1hdWRpbyBhcmUgZm91bmQgb24gc291bmQgZ2l0IHRyZWU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dAppbmRleCA3MDRlNDc0Li4xZjI0NjM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKQEAgLTI0LDYgKzI0LDcgQEAKIC0gYm9vdGxvYWRlcl90eXBlCSAgICAgWyBYODYgb25seSBdCiAtIGJvb3Rsb2FkZXJfdmVyc2lvbgkgICAgIFsgWDg2IG9ubHkgXQogLSBjYWxsaG9tZQkJICAgICBbIFMzOTAgb25seSBdCistIGNhcF9sYXN0X2NhcAogLSBjb3JlX3BhdHRlcm4KIC0gY29yZV9waXBlX2xpbWl0CiAtIGNvcmVfdXNlc19waWQKQEAgLTE1NSw2ICsxNTYsMTMgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorY2FwX2xhc3RfY2FwCisKK0hpZ2hlc3QgdmFsaWQgY2FwYWJpbGl0eSBvZiB0aGUgcnVubmluZyBrZXJuZWwuICBFeHBvcnRzCitDQVBfTEFTVF9DQVAgZnJvbSB0aGUga2VybmVsLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiBjb3JlX3BhdHRlcm46CiAKIGNvcmVfcGF0dGVybiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjb3JlIGR1bXBmaWxlIHBhdHRlcm4gbmFtZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvcG9zdHByb2Nlc3MvdHJhY2Utdm1zY2FuLXBvc3Rwcm9jZXNzLnBsIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKaW5kZXggMTJjZWNjOC4uNGEzN2M0NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3N0cHJvY2Vzcy90cmFjZS12bXNjYW4tcG9zdHByb2Nlc3MucGwKQEAgLTM3OSwxMCArMzc5LDEwIEBACiAKIAkJCSMgVG8gY2xvc2VyIG1hdGNoIHZtc3RhdCBzY2FubmluZyBzdGF0aXN0aWNzLCBvbmx5IGNvdW50IGlzb2xhdGVfYm90aAogCQkJIyBhbmQgaXNvbGF0ZV9pbmFjdGl2ZSBhcyBzY2FubmluZy4gaXNvbGF0ZV9hY3RpdmUgaXMgcm90YXRpb24KLQkJCSMgaXNvbGF0ZV9pbmFjdGl2ZSA9PSAwCi0JCQkjIGlzb2xhdGVfYWN0aXZlICAgPT0gMQotCQkJIyBpc29sYXRlX2JvdGggICAgID09IDIKLQkJCWlmICgkaXNvbGF0ZV9tb2RlICE9IDEpIHsKKwkJCSMgaXNvbGF0ZV9pbmFjdGl2ZSA9PSAxCisJCQkjIGlzb2xhdGVfYWN0aXZlICAgPT0gMgorCQkJIyBpc29sYXRlX2JvdGggICAgID09IDMKKwkJCWlmICgkaXNvbGF0ZV9tb2RlICE9IDIpIHsKIAkJCQkkcGVycHJvY2Vzc3BpZHskcHJvY2Vzc19waWR9LT57SElHSF9OUl9TQ0FOTkVEfSArPSAkbnJfc2Nhbm5lZDsKIAkJCX0KIAkJCSRwZXJwcm9jZXNzcGlkeyRwcm9jZXNzX3BpZH0tPntISUdIX05SX0NPTlRJR19ESVJUWX0gKz0gJG5yX2NvbnRpZ19kaXJ0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvQ0FSRExJU1QgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnRtNjAwMApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9DQVJETElTVApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50bTYwMDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZ3NwY2EudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKaW5kZXggNWJmYTlhNy4uYjE1ZTI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9nc3BjYS50eHQKQEAgLTgsNiArOCw3IEBACiAtLS0tCiBzcGNhNTAxCQkwMDAwOjAwMDAJTXlzdEZyb21PcmkgVW5rbm93biBDYW1lcmEKIHNwY2E1MDgJCTAxMzA6MDEzMAlDbG9uZSBEaWdpdGFsIFdlYmNhbSAxMTA0MworemMzeHgJCTAzZjA6MWIwNwlIUCBQcmVtaXVtIFN0YXJ0ZXIgQ2FtCiBtNTYwMgkJMDQwMjo1NjAyCUFMaSBWaWRlbyBDYW1lcmEgQ29udHJvbGxlcgogc3BjYTUwMQkJMDQwYTowMDAyCUtvZGFrIERWQy0zMjUKIHNwY2E1MDAJCTA0MGE6MDMwMAlLb2RhayBFWjIwMApAQCAtMTkwLDYgKzE5MSw3IEBACiBvdjUxOQkJMDVhOTowNTMwCU9tbmlWaXNpb24KIG92NTE5CQkwNWE5OjI4MDAJT21uaVZpc2lvbiBTdXBlckNBTQogb3Y1MTkJCTA1YTk6NDUxOQlXZWJjYW0gQ2xhc3NpYworb3Y1MzRfOQkJMDVhOTo4MDY1CU9tbmlWaXNpb24gdGVzdCBraXQgb3Y1Mzgrb3Y5NzEyCiBvdjUxOQkJMDVhOTo4NTE5CU9tbmlWaXNpb24KIG92NTE5CQkwNWE5OmE1MTEJRC1MaW5rIFVTQiBEaWdpdGFsIFZpZGVvIENhbWVyYQogb3Y1MTkJCTA1YTk6YTUxOAlELUxpbmsgRFNCLUMzMTAgV2ViY2FtCkBAIC0xOTksNiArMjAxLDggQEAKIGdsODYwCQkwNWUzOmYxOTEJR2VuZXN5cyBMb2dpYyBQQyBDYW1lcmEKIHNwY2E1NjEJCTA2MGI6YTAwMQlNYXhlbGwgQ29tcGFjdCBQYyBQTTMKIHpjM3h4CQkwNjk4OjIwMDMJQ1RYIE03MzBWIGJ1aWx0IGluCit0b3BybwkJMDZhMjowMDAzCVRQNjgwMCBQQyBDYW1lcmEsIENtb1ggQ1gwMzQyIHdlYmNhbQordG9wcm8JCTA2YTI6NjgxMAlDcmVhdGl2ZSBRbWF4CiBudzgweAkJMDZhNTowMDAwCVR5cGhvb24gV2ViY2FtIDEwMCBVU0IKIG53ODB4CQkwNmE1OmQwMDEJRGl2aW8gYmFzZWQgd2ViY2Ftcwogbnc4MHgJCTA2YTU6ZDgwMAlEaXZpbyBDaGljb255IFR3aW5rbGVDYW0sIFRydXN0IFNwYWNlQ2FtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L29tYXAzaXNwLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CmluZGV4IDY5YmUyYzcuLjVkZDE0MzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb21hcDNpc3AudHh0CkBAIC03MCwxMCArNzAsMTEgQEAKIFRoZSBPTUFQIDMgSVNQIGRyaXZlciBkb2VzIHN1cHBvcnQgdGhlIFY0TDIgZXZlbnQgaW50ZXJmYWNlIG9uIENDREMgYW5kCiBzdGF0aXN0aWNzIChBRVdCLCBBRiBhbmQgaGlzdG9ncmFtKSBzdWJkZXZzLgogCi1UaGUgQ0NEQyBzdWJkZXYgcHJvZHVjZXMgVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUyB0eXBlIGV2ZW50IG9uIEhTX1ZTCi1pbnRlcnJ1cHQgd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgZnJhbWUgc3RhcnQuIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgZXhhY3RseQotd2hlbiB0aGUgcmVjZXB0aW9uIG9mIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmcmFtZSBzdGFydHMgaW4gdGhlIENDREMgbW9kdWxlLgotVGhlIGV2ZW50IGNhbiBiZSBzdWJzY3JpYmVkIG9uIHRoZSBDQ0RDIHN1YmRldi4KK1RoZSBDQ0RDIHN1YmRldiBwcm9kdWNlcyBWNEwyX0VWRU5UX0ZSQU1FX1NZTkMgdHlwZSBldmVudCBvbiBIU19WUworaW50ZXJydXB0IHdoaWNoIGlzIHVzZWQgdG8gc2lnbmFsIGZyYW1lIHN0YXJ0LiBFYXJsaWVyIHZlcnNpb24gb2YgdGhpcworZHJpdmVyIHVzZWQgVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUyBmb3IgdGhpcyBwdXJwb3NlLiBUaGUgZXZlbnQgaXMKK3RyaWdnZXJlZCBleGFjdGx5IHdoZW4gdGhlIHJlY2VwdGlvbiBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZnJhbWUgc3RhcnRzCitpbiB0aGUgQ0NEQyBtb2R1bGUuIFRoZSBldmVudCBjYW4gYmUgc3Vic2NyaWJlZCBvbiB0aGUgQ0NEQyBzdWJkZXYuCiAKIChXaGVuIHVzaW5nIHBhcmFsbGVsIGludGVyZmFjZSBvbmUgbXVzdCBwYXkgYWNjb3VudCB0byBjb3JyZWN0IGNvbmZpZ3VyYXRpb24KIG9mIHRoZSBWUyBzaWduYWwgcG9sYXJpdHkuIFRoaXMgaXMgYXV0b21hdGljYWxseSBjb3JyZWN0IHdoZW4gdXNpbmcgdGhlIHNlcmlhbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQKaW5kZXggOTM0NmZjOC4uMjZhYTA1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0CkBAIC0yODUsMTEgKzI4NSwxMSBAQAogTm90ZSB0aGF0IHlvdSB1c2UgdGhlICduZXcgdmFsdWUnIHVuaW9uIGFzIHdlbGwgaW4gZ192b2xhdGlsZV9jdHJsLiBJbiBnZW5lcmFsCiBjb250cm9scyB0aGF0IG5lZWQgdG8gaW1wbGVtZW50IGdfdm9sYXRpbGVfY3RybCBhcmUgcmVhZC1vbmx5IGNvbnRyb2xzLgogCi1UbyBtYXJrIGEgY29udHJvbCBhcyB2b2xhdGlsZSB5b3UgaGF2ZSB0byBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWc6CitUbyBtYXJrIGEgY29udHJvbCBhcyB2b2xhdGlsZSB5b3UgaGF2ZSB0byBzZXQgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU6CiAKIAljdHJsID0gdjRsMl9jdHJsX25ld19zdGQoJnNkLT5jdHJsX2hhbmRsZXIsIC4uLik7CiAJaWYgKGN0cmwpCi0JCWN0cmwtPmlzX3ZvbGF0aWxlID0gMTsKKwkJY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CiAKIEZvciB0cnkvc19jdHJsIHRoZSBuZXcgdmFsdWVzIChpLmUuIGFzIHBhc3NlZCBieSB0aGUgdXNlcikgYXJlIGZpbGxlZCBpbiBhbmQKIHlvdSBjYW4gbW9kaWZ5IHRoZW0gaW4gdHJ5X2N0cmwgb3Igc2V0IHRoZW0gaW4gc19jdHJsLiBUaGUgJ2N1cicgdW5pb24KQEAgLTM2Nyw4ICszNjcsNyBAQAogVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHByaXYgcG9pbnRlciB3aGljaCBjYW4gYmUgc2V0IHRvIGRyaXZlci1zcGVjaWZpYwogcHJpdmF0ZSBkYXRhLgogCi1UaGUgdjRsMl9jdHJsX2NvbmZpZyBzdHJ1Y3QgYWxzbyBoYXMgZmllbGRzIHRvIHNldCB0aGUgaXNfcHJpdmF0ZSBhbmQgaXNfdm9sYXRpbGUKLWZsYWdzLgorVGhlIHY0bDJfY3RybF9jb25maWcgc3RydWN0IGFsc28gaGFzIGEgZmllbGQgdG8gc2V0IHRoZSBpc19wcml2YXRlIGZsYWcuCiAKIElmIHRoZSBuYW1lIGZpZWxkIGlzIG5vdCBzZXQsIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIGFzc3VtZSB0aGlzIGlzIGEgc3RhbmRhcmQKIGNvbnRyb2wgYW5kIHdpbGwgZmlsbCBpbiB0aGUgbmFtZSwgdHlwZSBhbmQgZmxhZ3MgZmllbGRzIGFjY29yZGluZ2x5LgpAQCAtNDk2LDE4ICs0OTUsMjAgQEAKIAogQSBjb21tb24gdHlwZSBvZiBjb250cm9sIGNsdXN0ZXIgaXMgb25lIHRoYXQgaGFuZGxlcyAnYXV0by1mb28vZm9vJy10eXBlCiBjb250cm9scy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgYXV0b2dhaW4vZ2FpbiwgYXV0b2V4cG9zdXJlL2V4cG9zdXJlLAotYXV0b3doaXRlYmFsYW5jZS9yZWQgYmFsYW5jZS9ibHVlIGJhbGFuY2UuIEluIGFsbCBjYXNlcyB5b3UgaGF2ZSBvbmUgY29udHJvbHMKK2F1dG93aGl0ZWJhbGFuY2UvcmVkIGJhbGFuY2UvYmx1ZSBiYWxhbmNlLiBJbiBhbGwgY2FzZXMgeW91IGhhdmUgb25lIGNvbnRyb2wKIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFub3RoZXIgY29udHJvbCBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGhhcmR3YXJlLAogb3Igd2hldGhlciBpdCBpcyB1bmRlciBtYW51YWwgY29udHJvbCBmcm9tIHRoZSB1c2VyLgogCiBJZiB0aGUgY2x1c3RlciBpcyBpbiBhdXRvbWF0aWMgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZQotbWFya2VkIGluYWN0aXZlLiBXaGVuIHRoZSB2b2xhdGlsZSBjb250cm9scyBhcmUgcmVhZCB0aGUgZ192b2xhdGlsZV9jdHJsCi1vcGVyYXRpb24gc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdGhhdCB0aGUgaGFyZHdhcmUncyBhdXRvbWF0aWMgbW9kZSBzZXQgdXAKLWF1dG9tYXRpY2FsbHkuCittYXJrZWQgaW5hY3RpdmUgYW5kIHZvbGF0aWxlLiBXaGVuIHRoZSB2b2xhdGlsZSBjb250cm9scyBhcmUgcmVhZCB0aGUKK2dfdm9sYXRpbGVfY3RybCBvcGVyYXRpb24gc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdGhhdCB0aGUgaGFyZHdhcmUncyBhdXRvbWF0aWMKK21vZGUgc2V0IHVwIGF1dG9tYXRpY2FsbHkuCiAKIElmIHRoZSBjbHVzdGVyIGlzIHB1dCBpbiBtYW51YWwgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZWNvbWUKLWFjdGl2ZSBhZ2FpbiBhbmQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgc2hvdWxkIGJlIGlnbm9yZWQgKHNvIGdfdm9sYXRpbGVfY3RybCBpcwotbm8gbG9uZ2VyIGNhbGxlZCB3aGlsZSBpbiBtYW51YWwgbW9kZSkuCithY3RpdmUgYWdhaW4gYW5kIHRoZSB2b2xhdGlsZSBmbGFnIGlzIGNsZWFyZWQgKHNvIGdfdm9sYXRpbGVfY3RybCBpcyBubyBsb25nZXIKK2NhbGxlZCB3aGlsZSBpbiBtYW51YWwgbW9kZSkuIEluIGFkZGl0aW9uIGp1c3QgYmVmb3JlIHN3aXRjaGluZyB0byBtYW51YWwgbW9kZQordGhlIGN1cnJlbnQgdmFsdWVzIGFzIGRldGVybWluZWQgYnkgdGhlIGF1dG8gbW9kZSBhcmUgY29waWVkIGFzIHRoZSBuZXcgbWFudWFsCit2YWx1ZXMuCiAKIEZpbmFsbHkgdGhlIFY0TDJfQ1RSTF9GTEFHX1VQREFURSBzaG91bGQgYmUgc2V0IGZvciB0aGUgYXV0byBjb250cm9sIHNpbmNlCiBjaGFuZ2luZyB0aGF0IGNvbnRyb2wgYWZmZWN0cyB0aGUgY29udHJvbCBmbGFncyBvZiB0aGUgbWFudWFsIGNvbnRyb2xzLgpAQCAtNTIwLDcgKzUyMSwxMSBAQAogCiBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsIHRvIHY0bDJfY3RybF9jbHVzdGVyLiBUaGUgdGhpcmQgYXJndW1lbnQKIHRlbGxzIHRoZSBmcmFtZXdvcmsgd2hpY2ggdmFsdWUgc3dpdGNoZXMgdGhlIGNsdXN0ZXIgaW50byBtYW51YWwgbW9kZS4gVGhlCi1sYXN0IGFyZ3VtZW50IHdpbGwgb3B0aW9uYWxseSBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgZm9yIHRoZSBub24tYXV0byBjb250cm9scy4KK2xhc3QgYXJndW1lbnQgd2lsbCBvcHRpb25hbGx5IHNldCBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSBmb3IgdGhlIG5vbi1hdXRvIGNvbnRyb2xzLgorSWYgaXQgaXMgZmFsc2UsIHRoZW4gdGhlIG1hbnVhbCBjb250cm9scyBhcmUgbmV2ZXIgdm9sYXRpbGUuIFlvdSB3b3VsZCB0eXBpY2FsbHkKK3VzZSB0aGF0IGlmIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBnaXZlIHlvdSB0aGUgb3B0aW9uIHRvIHJlYWQgYmFjayB0byB2YWx1ZXMgYXMKK2RldGVybWluZWQgYnkgdGhlIGF1dG8gbW9kZSAoZS5nLiBpZiBhdXRvZ2FpbiBpcyBvbiwgdGhlIGhhcmR3YXJlIGRvZXNuJ3QgYWxsb3cKK3lvdSB0byBvYnRhaW4gdGhlIGN1cnJlbnQgZ2FpbiB2YWx1ZSkuCiAKIFRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjbHVzdGVyIGlzIGFzc3VtZWQgdG8gYmUgdGhlICdhdXRvJyBjb250cm9sLgogCkBAIC02ODEsMTYgKzY4Niw2IEBACiBjb3VudCBpZiBub3RoaW5nIHdhcyBkb25lIHlldC4gSWYgaXQgaXMgbGVzcyB0aGFuIGNvdW50IHRoZW4gb25seSB0aGUgY29udHJvbHMKIHVwIHRvIGVycm9yX2lkeC0xIHdlcmUgc3VjY2Vzc2Z1bGx5IGFwcGxpZWQuCiAKLTMpIFdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgYnV0dG9uIGNvbnRyb2wgdGhlIGZyYW1ld29yayB3aWxsIHJldHVybiAtRUFDQ0VTCi1pbnN0ZWFkIG9mIC1FSU5WQUwgYXMgc3RhdGVkIGluIHRoZSBzcGVjLiBJdCBzZWVtcyB0byBtYWtlIG1vcmUgc2Vuc2Ugc2luY2UKLWJ1dHRvbiBjb250cm9scyBhcmUgd3JpdGUtb25seSBjb250cm9scy4KLQotNCkgQXR0ZW1wdGluZyB0byB3cml0ZSB0byBhIHJlYWQtb25seSBjb250cm9sIHdpbGwgcmV0dXJuIC1FQUNDRVMgaW5zdGVhZCBvZgotLUVJTlZBTCBhcyB0aGUgc3BlYyBzYXlzLgotCi01KSBUaGUgc3BlYyBkb2VzIG5vdCBtZW50aW9uIHdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHlvdSB0cnkgdG8gc2V0L2dldCBhCi1jb250cm9sIGNsYXNzIGNvbnRyb2xzLiBUaGUgZnJhbWV3b3JrIHdpbGwgcmV0dXJuIC1FQUNDRVMuCi0KIAogUHJvcG9zYWxzIGZvciBFeHRlbnNpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTcwMyw5ICs2OTgsMyBAQAogMikgSXQgaXMgcG9zc2libGUgdG8gbWFyayBpbiB0aGUgY29udHJvbHMgYXJyYXkgd2hpY2ggY29udHJvbHMgaGF2ZSBiZWVuCiBzdWNjZXNzZnVsbHkgd3JpdHRlbiBhbmQgd2hpY2ggZmFpbGVkIGJ5IGZvciBleGFtcGxlIGFkZGluZyBhIGJpdCB0byB0aGUKIGNvbnRyb2wgSUQuIE5vdCBzdXJlIGlmIGl0IGlzIHdvcnRoIHRoZSBlZmZvcnQsIHRob3VnaC4KLQotMykgVHJ5aW5nIHRvIHNldCB2b2xhdGlsZSBpbmFjdGl2ZSBjb250cm9scyBzaG91bGQgcmVzdWx0IGluIC1FQUNDRVNTLgotCi00KSBBZGQgYSBuZXcgZmxhZyB0byBtYXJrIHZvbGF0aWxlIGNvbnRyb2xzLiBBbnkgYXBwbGljYXRpb24gdGhhdCB3YW50cwotdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9scyBjYW4gdGhlbiBza2lwIHZvbGF0aWxlIGluYWN0aXZlIGNvbnRyb2xzLgotQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlY3Qgc3VjaCBjb250cm9scy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAppbmRleCBiMGU0YjljLi43OTQ1YjBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CkBAIC0xNzUsMTAgKzE3NSwzMCBAQAogUmV0dXJuczogdmNwdSBmZCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgogCiBUaGlzIEFQSSBhZGRzIGEgdmNwdSB0byBhIHZpcnR1YWwgbWFjaGluZS4gIFRoZSB2Y3B1IGlkIGlzIGEgc21hbGwgaW50ZWdlcgotaW4gdGhlIHJhbmdlIFswLCBtYXhfdmNwdXMpLiAgWW91IGNhbiB1c2UgS1ZNX0NBUF9OUl9WQ1BVUyBvZiB0aGUKLUtWTV9DSEVDS19FWFRFTlNJT04gaW9jdGwoKSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciBtYXhfdmNwdXMgYXQgcnVuLXRpbWUuCitpbiB0aGUgcmFuZ2UgWzAsIG1heF92Y3B1cykuCisKK1RoZSByZWNvbW1lbmRlZCBtYXhfdmNwdXMgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgS1ZNX0NBUF9OUl9WQ1BVUyBvZgordGhlIEtWTV9DSEVDS19FWFRFTlNJT04gaW9jdGwoKSBhdCBydW4tdGltZS4KK1RoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIGZvciBtYXhfdmNwdXMgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUKK0tWTV9DQVBfTUFYX1ZDUFVTIG9mIHRoZSBLVk1fQ0hFQ0tfRVhURU5TSU9OIGlvY3RsKCkgYXQgcnVuLXRpbWUuCisKIElmIHRoZSBLVk1fQ0FQX05SX1ZDUFVTIGRvZXMgbm90IGV4aXN0LCB5b3Ugc2hvdWxkIGFzc3VtZSB0aGF0IG1heF92Y3B1cyBpcyA0CiBjcHVzIG1heC4KK0lmIHRoZSBLVk1fQ0FQX01BWF9WQ1BVUyBkb2VzIG5vdCBleGlzdCwgeW91IHNob3VsZCBhc3N1bWUgdGhhdCBtYXhfdmNwdXMgaXMKK3NhbWUgYXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gS1ZNX0NBUF9OUl9WQ1BVUy4KKworT24gcG93ZXJwYyB1c2luZyBib29rM3NfaHYgbW9kZSwgdGhlIHZjcHVzIGFyZSBtYXBwZWQgb250byB2aXJ0dWFsCit0aHJlYWRzIGluIG9uZSBvciBtb3JlIHZpcnR1YWwgQ1BVIGNvcmVzLiAgKFRoaXMgaXMgYmVjYXVzZSB0aGUKK2hhcmR3YXJlIHJlcXVpcmVzIGFsbCB0aGUgaGFyZHdhcmUgdGhyZWFkcyBpbiBhIENQVSBjb3JlIHRvIGJlIGluIHRoZQorc2FtZSBwYXJ0aXRpb24uKSAgVGhlIEtWTV9DQVBfUFBDX1NNVCBjYXBhYmlsaXR5IGluZGljYXRlcyB0aGUgbnVtYmVyCitvZiB2Y3B1cyBwZXIgdmlydHVhbCBjb3JlICh2Y29yZSkuICBUaGUgdmNvcmUgaWQgaXMgb2J0YWluZWQgYnkKK2RpdmlkaW5nIHRoZSB2Y3B1IGlkIGJ5IHRoZSBudW1iZXIgb2YgdmNwdXMgcGVyIHZjb3JlLiAgVGhlIHZjcHVzIGluIGEKK2dpdmVuIHZjb3JlIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBzYW1lIHBoeXNpY2FsIGNvcmUgYXMgZWFjaCBvdGhlcgorKHRob3VnaCB0aGF0IG1pZ2h0IGJlIGEgZGlmZmVyZW50IHBoeXNpY2FsIGNvcmUgZnJvbSB0aW1lIHRvIHRpbWUpLgorVXNlcnNwYWNlIGNhbiBjb250cm9sIHRoZSB0aHJlYWRpbmcgKFNNVCkgbW9kZSBvZiB0aGUgZ3Vlc3QgYnkgaXRzCithbGxvY2F0aW9uIG9mIHZjcHUgaWRzLiAgRm9yIGV4YW1wbGUsIGlmIHVzZXJzcGFjZSB3YW50cworc2luZ2xlLXRocmVhZGVkIGd1ZXN0IHZjcHVzLCBpdCBzaG91bGQgbWFrZSBhbGwgdmNwdSBpZHMgYmUgYSBtdWx0aXBsZQorb2YgdGhlIG51bWJlciBvZiB2Y3B1cyBwZXIgdmNvcmUuCiAKIE9uIHBvd2VycGMgdXNpbmcgYm9vazNzX2h2IG1vZGUsIHRoZSB2Y3B1cyBhcmUgbWFwcGVkIG9udG8gdmlydHVhbAogdGhyZWFkcyBpbiBvbmUgb3IgbW9yZSB2aXJ0dWFsIENQVSBjb3Jlcy4gIChUaGlzIGlzIGJlY2F1c2UgdGhlCkBAIC0xNjMzLDMgKzE2NTMsNTAgQEAKIAkJY2hhciBwYWRkaW5nWzI1Nl07CiAJfTsKIH07CisKKzYuIENhcGFiaWxpdGllcyB0aGF0IGNhbiBiZSBlbmFibGVkCisKK1RoZXJlIGFyZSBjZXJ0YWluIGNhcGFiaWxpdGllcyB0aGF0IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHZpcnR1YWwgQ1BVIHdoZW4KK2VuYWJsZWQuIFRvIGVuYWJsZSB0aGVtLCBwbGVhc2Ugc2VlIHNlY3Rpb24gNC4zNy4gQmVsb3cgeW91IGNhbiBmaW5kIGEgbGlzdCBvZgorY2FwYWJpbGl0aWVzIGFuZCB3aGF0IHRoZWlyIGVmZmVjdCBvbiB0aGUgdkNQVSBpcyB3aGVuIGVuYWJsaW5nIHRoZW0uCisKK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgZGVzY3JpcHRpb246CisKKyAgQXJjaGl0ZWN0dXJlczogd2hpY2ggaW5zdHJ1Y3Rpb24gc2V0IGFyY2hpdGVjdHVyZXMgcHJvdmlkZSB0aGlzIGlvY3RsLgorICAgICAgeDg2IGluY2x1ZGVzIGJvdGggaTM4NiBhbmQgeDg2XzY0LgorCisgIFBhcmFtZXRlcnM6IHdoYXQgcGFyYW1ldGVycyBhcmUgYWNjZXB0ZWQgYnkgdGhlIGNhcGFiaWxpdHkuCisKKyAgUmV0dXJuczogdGhlIHJldHVybiB2YWx1ZS4gIEdlbmVyYWwgZXJyb3IgbnVtYmVycyAoRUJBREYsIEVOT01FTSwgRUlOVkFMKQorICAgICAgYXJlIG5vdCBkZXRhaWxlZCwgYnV0IGVycm9ycyB3aXRoIHNwZWNpZmljIG1lYW5pbmdzIGFyZS4KKworNi4xIEtWTV9DQVBfUFBDX09TSQorCitBcmNoaXRlY3R1cmVzOiBwcGMKK1BhcmFtZXRlcnM6IG5vbmUKK1JldHVybnM6IDAgb24gc3VjY2VzczsgLTEgb24gZXJyb3IKKworVGhpcyBjYXBhYmlsaXR5IGVuYWJsZXMgaW50ZXJjZXB0aW9uIG9mIE9TSSBoeXBlcmNhbGxzIHRoYXQgb3RoZXJ3aXNlIHdvdWxkCitiZSB0cmVhdGVkIGFzIG5vcm1hbCBzeXN0ZW0gY2FsbHMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgZ3Vlc3QuIE9TSSBoeXBlcmNhbGxzCit3ZXJlIGludmVudGVkIGJ5IE1hYy1vbi1MaW51eCB0byBoYXZlIGEgc3RhbmRhcmRpemVkIGNvbW11bmljYXRpb24gbWVjaGFuaXNtCitiZXR3ZWVuIHRoZSBndWVzdCBhbmQgdGhlIGhvc3QuCisKK1doZW4gdGhpcyBjYXBhYmlsaXR5IGlzIGVuYWJsZWQsIEtWTV9FWElUX09TSSBjYW4gb2NjdXIuCisKKzYuMiBLVk1fQ0FQX1BQQ19QQVBSCisKK0FyY2hpdGVjdHVyZXM6IHBwYworUGFyYW1ldGVyczogbm9uZQorUmV0dXJuczogMCBvbiBzdWNjZXNzOyAtMSBvbiBlcnJvcgorCitUaGlzIGNhcGFiaWxpdHkgZW5hYmxlcyBpbnRlcmNlcHRpb24gb2YgUEFQUiBoeXBlcmNhbGxzLiBQQVBSIGh5cGVyY2FsbHMgYXJlCitkb25lIHVzaW5nIHRoZSBoeXBlcmNhbGwgaW5zdHJ1Y3Rpb24gInNjIDEiLgorCitJdCBhbHNvIHNldHMgdGhlIGd1ZXN0IHByaXZpbGVnZSBsZXZlbCB0byAic3VwZXJ2aXNvciIgbW9kZS4gVXN1YWxseSB0aGUgZ3Vlc3QKK3J1bnMgaW4gImh5cGVydmlzb3IiIHByaXZpbGVnZSBtb2RlIHdpdGggYSBmZXcgbWlzc2luZyBmZWF0dXJlcy4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCBpdCBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgb2YgU0RSMS4gSW4gdGhpcyBtb2RlLCB0aGUKK0hUQUIgYWRkcmVzcyBwYXJ0IG9mIFNEUjEgY29udGFpbnMgYW4gSFZBIGluc3RlYWQgb2YgYSBHUEEsIGFzIFBBUFIga2VlcHMgdGhlCitIVEFCIGludmlzaWJsZSB0byB0aGUgZ3Vlc3QuCisKK1doZW4gdGhpcyBjYXBhYmlsaXR5IGlzIGVuYWJsZWQsIEtWTV9FWElUX1BBUFJfSENBTEwgY2FuIG9jY3VyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQKaW5kZXggNWQwZmM4Yi4uNzdkZmVjZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwvdW1sL1VzZXJNb2RlTGludXgtSE9XVE8udHh0CkBAIC0xMzQsMTMgKzEzNCwxMyBAQAogCiAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIAotICAxCDEuCC4gIEkISW4IbnQIdHIIcm8Ib2QIZHUIdWMIY3QIdGkIaW8Ib24IbgorICAxLiAgSW50cm9kdWN0aW9uCiAKICAgV2VsY29tZSB0byBVc2VyIE1vZGUgTGludXguICBJdCdzIGdvaW5nIHRvIGJlIGZ1bi4KIAogCiAKLSAgMQgxLgguMQgxLgguICBICEhvCG93CHcgaQhpcwhzIFUIVXMIc2UIZXIIciBNCE1vCG9kCGRlCGUgTAhMaQhpbghudQh1eAh4IEQIRGkIaWYIZmYIZmUIZXIIcmUIZW4IbnQIdD8IPworICAxLjEuICBIb3cgaXMgVXNlciBNb2RlIExpbnV4IERpZmZlcmVudD8KIAogICBOb3JtYWxseSwgdGhlIExpbnV4IEtlcm5lbCB0YWxrcyBzdHJhaWdodCB0byB5b3VyIGhhcmR3YXJlICh2aWRlbwogICBjYXJkLCBrZXlib2FyZCwgaGFyZCBkcml2ZXMsIGV0YyksIGFuZCBhbnkgcHJvZ3JhbXMgd2hpY2ggcnVuIGFzayB0aGUKQEAgLTE4MSw3ICsxODEsNyBAQAogCiAKIAotICAxCDEuCC4yCDIuCC4gIFcIV2gIaHkIeSBXCFdvCG91CHVsCGxkCGQgSQhJIFcIV2EIYW4IbnQIdCBVCFVzCHNlCGVyCHIgTQhNbwhvZAhkZQhlIEwITGkIaW4IbnUIdXgIeD8IPworICAxLjIuICBXaHkgV291bGQgSSBXYW50IFVzZXIgTW9kZSBMaW51eD8KIAogCiAgIDEuIElmIFVzZXIgTW9kZSBMaW51eCBjcmFzaGVzLCB5b3VyIGhvc3Qga2VybmVsIGlzIHN0aWxsIGZpbmUuCkBAIC0yMDYsMTIgKzIwNiwxMiBAQAogCiAKIAotICAyCDIuCC4gIEMIQ28Ib20IbXAIcGkIaWwIbGkIaW4IbmcIZyB0CHRoCGhlCGUgawhrZQhlcghybghuZQhlbAhsIGEIYW4IbmQIZCBtCG1vCG9kCGR1CHVsCGxlCGVzCHMKKyAgMi4gIENvbXBpbGluZyB0aGUga2VybmVsIGFuZCBtb2R1bGVzCiAKIAogCiAKLSAgMggyLgguMQgxLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgdAh0aAhoZQhlIGsIa2UIZXIIcm4IbmUIZWwIbAorICAyLjEuICBDb21waWxpbmcgdGhlIGtlcm5lbAogCiAKICAgQ29tcGlsaW5nIHRoZSB1c2VyIG1vZGUga2VybmVsIGlzIGp1c3QgbGlrZSBjb21waWxpbmcgYW55IG90aGVyCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdGhhdCBoYXZlIGdvbmUgaW50byBzdWJzZXF1ZW50IHJlbGVhc2VzLgogCiAKLSAgMggyLgguMggyLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgYQhhbghuZAhkIGkIaW4IbnMIc3QIdGEIYWwIbGwIbGkIaW4IbmcIZyBrCGtlCGVyCHJuCG5lCGVsCGwgbQhtbwhvZAhkdQh1bAhsZQhlcwhzCisgIDIuMi4gIENvbXBpbGluZyBhbmQgaW5zdGFsbGluZyBrZXJuZWwgbW9kdWxlcwogCiAgIFVNTCBtb2R1bGVzIGFyZSBidWlsdCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG5hdGl2ZSBrZXJuZWwgKHdpdGggdGhlCiAgIGV4Y2VwdGlvbiBvZiB0aGUgJ0FSQ0g9dW0nIHRoYXQgeW91IGFsd2F5cyBuZWVkIGZvciBVTUwpOgpAQCAtMzg2LDE5ICszODYsMTkgQEAKIAogCiAKLSAgMggyLgguMwgzLgguICBDCENvCG9tCG1wCHBpCGlsCGxpCGluCG5nCGcgYQhhbghuZAhkIGkIaW4IbnMIc3QIdGEIYWwIbGwIbGkIaW4IbmcIZyB1CHVtCG1sCGxfCF91CHV0CHRpCGlsCGxpCGl0CHRpCGllCGVzCHMKKyAgMi4zLiAgQ29tcGlsaW5nIGFuZCBpbnN0YWxsaW5nIHVtbF91dGlsaXRpZXMKIAogICBNYW55IGZlYXR1cmVzIG9mIHRoZSBVTUwga2VybmVsIHJlcXVpcmUgYSB1c2VyLXNwYWNlIGhlbHBlciBwcm9ncmFtLAogICBzbyBhIHVtbF91dGlsaXRpZXMgcGFja2FnZSBpcyBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGtlcm5lbAogICBwYXRjaCB3aGljaCBwcm92aWRlcyB0aGVzZSBoZWxwZXJzLiBJbmNsdWRlZCB3aXRoaW4gdGhpcyBpczoKIAotICArCG8gIHBvcnQtaGVscGVyIC0gVXNlZCBieSBjb25zb2xlcyB3aGljaCBjb25uZWN0IHRvIHh0ZXJtcyBvciBwb3J0cworICBvICBwb3J0LWhlbHBlciAtIFVzZWQgYnkgY29uc29sZXMgd2hpY2ggY29ubmVjdCB0byB4dGVybXMgb3IgcG9ydHMKIAotICArCG8gIHR1bmN0bCAtIENvbmZpZ3VyYXRpb24gdG9vbCB0byBjcmVhdGUgYW5kIGRlbGV0ZSB0YXAgZGV2aWNlcworICBvICB0dW5jdGwgLSBDb25maWd1cmF0aW9uIHRvb2wgdG8gY3JlYXRlIGFuZCBkZWxldGUgdGFwIGRldmljZXMKIAotICArCG8gIHVtbF9uZXQgLSBTZXR1aWQgYmluYXJ5IGZvciBhdXRvbWF0aWMgdGFwIGRldmljZSBjb25maWd1cmF0aW9uCisgIG8gIHVtbF9uZXQgLSBTZXR1aWQgYmluYXJ5IGZvciBhdXRvbWF0aWMgdGFwIGRldmljZSBjb25maWd1cmF0aW9uCiAKLSAgKwhvICB1bWxfc3dpdGNoIC0gVXNlci1zcGFjZSB2aXJ0dWFsIHN3aXRjaCByZXF1aXJlZCBmb3IgZGFlbW9uCisgIG8gIHVtbF9zd2l0Y2ggLSBVc2VyLXNwYWNlIHZpcnR1YWwgc3dpdGNoIHJlcXVpcmVkIGZvciBkYWVtb24KICAgICAgdHJhbnNwb3J0CiAKICAgICAgVGhlIHVtbF91dGlsaXRpZXMgdHJlZSBpcyBjb21waWxlZCB3aXRoOgpAQCAtNDIzLDExICs0MjMsMTEgQEAKIAogCiAKLSAgMwgzLgguICBSCFJ1CHVuCG5uCG5pCGluCG5nCGcgVQhVTQhNTAhMIGEIYW4IbmQIZCBsCGxvCG9nCGdnCGdpCGluCG5nCGcgaQhpbghuCisgIDMuICBSdW5uaW5nIFVNTCBhbmQgbG9nZ2luZyBpbgogCiAKIAotICAzCDMuCC4xCDEuCC4gIFIIUnUIdW4Ibm4IbmkIaW4IbmcIZyBVCFVNCE1MCEwKKyAgMy4xLiAgUnVubmluZyBVTUwKIAogICBJdCBydW5zIG9uIDIuMi4xNSBvciBsYXRlciwgYW5kIGFsbCAyLjQga2VybmVscy4KIApAQCAtNDU0LDcgKzQ1NCw3IEBACiAKIAogCi0gIDMIMy4ILjIIMi4ILiAgTAhMbwhvZwhnZwhnaQhpbghuZwhnIGkIaW4IbgorICAzLjIuICBMb2dnaW5nIGluCiAKIAogCkBAIC00NjgsNyArNDY4LDcgQEAKIAogICBUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgd2F5cyB0byBsb2cgaW46CiAKLSAgKwhvICBPbiBhIHZpcnR1YWwgY29uc29sZQorICBvICBPbiBhIHZpcnR1YWwgY29uc29sZQogCiAKIApAQCAtNDgwLDcgKzQ4MCw3IEBACiAKIAogCi0gICsIbyAgT3ZlciB0aGUgc2VyaWFsIGxpbmUKKyAgbyAgT3ZlciB0aGUgc2VyaWFsIGxpbmUKIAogCiAgICAgIEluIHRoZSBib290IG91dHB1dCwgZmluZCBhIGxpbmUgdGhhdCBsb29rcyBsaWtlOgpAQCAtNTAzLDcgKzUwMyw3IEBACiAKIAogCi0gICsIbyAgT3ZlciB0aGUgbmV0CisgIG8gIE92ZXIgdGhlIG5ldAogCiAKICAgICAgSWYgdGhlIG5ldHdvcmsgaXMgcnVubmluZywgdGhlbiB5b3UgY2FuIHRlbG5ldCB0byB0aGUgdmlydHVhbApAQCAtNTE0LDEzICs1MTQsMTMgQEAKICAgZG93biBhbmQgdGhlIHByb2Nlc3Mgd2lsbCBleGl0LgogCiAKLSAgMwgzLgguMwgzLgguICBFCEV4CHhhCGFtCG1wCHBsCGxlCGVzCHMKKyAgMy4zLiAgRXhhbXBsZXMKIAogICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIFVNTCBpbiBhY3Rpb246CiAKLSAgKwhvICBBIGxvZ2luIHNlc3Npb24gPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0L2xvZ2luLmh0bWw+CisgIG8gIEEgbG9naW4gc2Vzc2lvbiA8aHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQvbG9naW4uaHRtbD4KIAotICArCG8gIEEgdmlydHVhbCBuZXR3b3JrIDxodHRwOi8vdXNlci1tb2RlLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC9uZXQuaHRtbD4KKyAgbyAgQSB2aXJ0dWFsIG5ldHdvcmsgPGh0dHA6Ly91c2VyLW1vZGUtbGludXguc291cmNlZm9yZ2UubmV0L25ldC5odG1sPgogCiAKIApAQCAtNTI4LDEyICs1MjgsMTIgQEAKIAogCiAKLSAgNAg0LgguICBVCFVNCE1MCEwgbwhvbghuIDIIMkcIRy8ILzIIMkcIRyBoCGhvCG9zCHN0CHRzCHMKKyAgNC4gIFVNTCBvbiAyRy8yRyBob3N0cwogCiAKIAogCi0gIDQINC4ILjEIMS4ILiAgSQhJbghudAh0cghybwhvZAhkdQh1YwhjdAh0aQhpbwhvbghuCisgIDQuMS4gIEludHJvZHVjdGlvbgogCiAKICAgTW9zdCBMaW51eCBtYWNoaW5lcyBhcmUgY29uZmlndXJlZCBzbyB0aGF0IHRoZSBrZXJuZWwgb2NjdXBpZXMgdGhlCkBAIC01NDYsNyArNTQ2LDcgQEAKIAogCiAKLSAgNAg0LgguMggyLgguICBUCFRoCGhlCGUgcAhwcghybwhvYghibAhsZQhlbQhtCisgIDQuMi4gIFRoZSBwcm9ibGVtCiAKIAogICBUaGUgcHJlYnVpbHQgVU1MIGJpbmFyaWVzIG9uIHRoaXMgc2l0ZSB3aWxsIG5vdCBydW4gb24gMkcvMkcgaG9zdHMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCiAKIAotICA0CDQuCC4zCDMuCC4gIFQIVGgIaGUIZSBzCHNvCG9sCGx1CHV0CHRpCGlvCG9uCG4KKyAgNC4zLiAgVGhlIHNvbHV0aW9uCiAKIAogICBUaGUgZml4IGZvciB0aGlzIGlzIHRvIHJlYnVpbGQgVU1MIGZyb20gc291cmNlIGFmdGVyIGVuYWJsaW5nCkBAIC01NzYsNyArNTc2LDcgQEAKIAogCiAKLSAgNQg1LgguICBTCFNlCGV0CHR0CHRpCGluCG5nCGcgdQh1cAhwIHMIc2UIZXIIcmkIaWEIYWwIbCBsCGxpCGluCG5lCGVzCHMgYQhhbghuZAhkIGMIY28Ib24IbnMIc28Ib2wIbGUIZXMIcworICA1LiAgU2V0dGluZyB1cCBzZXJpYWwgbGluZXMgYW5kIGNvbnNvbGVzCiAKIAogICBJdCBpcyBwb3NzaWJsZSB0byBhdHRhY2ggVU1MIHNlcmlhbCBsaW5lcyBhbmQgY29uc29sZXMgdG8gbWFueSB0eXBlcwpAQCAtNTg2LDEyICs1ODYsMTIgQEAKICAgWW91IGNhbiBhdHRhY2ggdGhlbSB0byBob3N0IHB0eXMsIHR0eXMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCBwb3J0cy4KICAgVGhpcyBhbGxvd3MgeW91IHRvIGRvIHRoaW5ncyBsaWtlCiAKLSAgKwhvICBoYXZlIGEgVU1MIGNvbnNvbGUgYXBwZWFyIG9uIGFuIHVudXNlZCBob3N0IGNvbnNvbGUsCisgIG8gIGhhdmUgYSBVTUwgY29uc29sZSBhcHBlYXIgb24gYW4gdW51c2VkIGhvc3QgY29uc29sZSwKIAotICArCG8gIGhvb2sgdHdvIHZpcnR1YWwgbWFjaGluZXMgdG9nZXRoZXIgYnkgaGF2aW5nIG9uZSBhdHRhY2ggdG8gYSBwdHkKKyAgbyAgaG9vayB0d28gdmlydHVhbCBtYWNoaW5lcyB0b2dldGhlciBieSBoYXZpbmcgb25lIGF0dGFjaCB0byBhIHB0eQogICAgICBhbmQgaGF2aW5nIHRoZSBvdGhlciBhdHRhY2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHR5CiAKLSAgKwhvICBtYWtlIGEgdmlydHVhbCBtYWNoaW5lIGFjY2Vzc2libGUgZnJvbSB0aGUgbmV0IGJ5IGF0dGFjaGluZyBhCisgIG8gIG1ha2UgYSB2aXJ0dWFsIG1hY2hpbmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBuZXQgYnkgYXR0YWNoaW5nIGEKICAgICAgY29uc29sZSB0byBhIHBvcnQgb24gdGhlIGhvc3QuCiAKIApAQCAtNTk5LDcgKzU5OSw3IEBACiAKIAogCi0gIDUINS4ILjEIMS4ILiAgUwhTcAhwZQhlYwhjaQhpZghmeQh5aQhpbghuZwhnIHQIdGgIaGUIZSBkCGRlCGV2CHZpCGljCGNlCGUKKyAgNS4xLiAgU3BlY2lmeWluZyB0aGUgZGV2aWNlCiAKICAgRGV2aWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggImNvbiIgb3IgInNzbCIgKGNvbnNvbGUgb3Igc2VyaWFsIGxpbmUsCiAgIHJlc3BlY3RpdmVseSksIG9wdGlvbmFsbHkgd2l0aCBhIGRldmljZSBudW1iZXIgaWYgeW91IGFyZSB0YWxraW5nCkBAIC02MjYsMTMgKzYyNiwxMyBAQAogCiAKIAotICA1CDUuCC4yCDIuCC4gIFMIU3AIcGUIZWMIY2kIaWYIZnkIeWkIaW4IbmcIZyB0CHRoCGhlCGUgYwhjaAhoYQhhbghubghuZQhlbAhsCisgIDUuMi4gIFNwZWNpZnlpbmcgdGhlIGNoYW5uZWwKIAogICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGNoYW5uZWxzIHRvIGF0dGFjaCBhIFVNTAogICBkZXZpY2UgdG8sIGVhY2ggd2l0aCBhIGRpZmZlcmVudCB3YXkgb2Ygc3BlY2lmeWluZyBleGFjdGx5IHdoYXQgdG8KICAgYXR0YWNoIHRvLgogCi0gICsIbyAgcHNldWRvLXRlcm1pbmFscyAtIGRldmljZT1wdHkgcHRzIHRlcm1pbmFscyAtIGRldmljZT1wdHMKKyAgbyAgcHNldWRvLXRlcm1pbmFscyAtIGRldmljZT1wdHkgcHRzIHRlcm1pbmFscyAtIGRldmljZT1wdHMKIAogCiAgICAgIFRoaXMgd2lsbCBjYXVzZSBVTUwgdG8gYWxsb2NhdGUgYSBmcmVlIGhvc3QgcHNldWRvLXRlcm1pbmFsIGZvciB0aGUKQEAgLTY0MCwyMCArNjQwLDIwIEBACiAgICAgIGxvZy4gIFlvdSBhY2Nlc3MgaXQgYnkgYXR0YWNoaW5nIGEgdGVybWluYWwgcHJvZ3JhbSB0byB0aGUKICAgICAgY29ycmVzcG9uZGluZyB0dHk6CiAKLSAgKwhvICBzY3JlZW4gL2Rldi9wdHMvbgorICBvICBzY3JlZW4gL2Rldi9wdHMvbgogCi0gICsIbyAgc2NyZWVuIC9kZXYvdHR5eHgKKyAgbyAgc2NyZWVuIC9kZXYvdHR5eHgKIAotICArCG8gIG1pbmljb20gLW8gLXAgL2Rldi90dHl4eCAtIG1pbmljb20gc2VlbXMgbm90IGFibGUgdG8gaGFuZGxlIHB0cworICBvICBtaW5pY29tIC1vIC1wIC9kZXYvdHR5eHggLSBtaW5pY29tIHNlZW1zIG5vdCBhYmxlIHRvIGhhbmRsZSBwdHMKICAgICAgZGV2aWNlcwogCi0gICsIbyAga2VybWl0IC0gc3RhcnQgaXQgdXAsICdvcGVuJyB0aGUgZGV2aWNlLCB0aGVuICdjb25uZWN0JworICBvICBrZXJtaXQgLSBzdGFydCBpdCB1cCwgJ29wZW4nIHRoZSBkZXZpY2UsIHRoZW4gJ2Nvbm5lY3QnCiAKIAogCiAKIAotICArCG8gIHRlcm1pbmFscyAtIGRldmljZT10dHk6dHR5IGRldmljZSBmaWxlCisgIG8gIHRlcm1pbmFscyAtIGRldmljZT10dHk6dHR5IGRldmljZSBmaWxlCiAKIAogICAgICBUaGlzIHdpbGwgbWFrZSBVTUwgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIHNwZWNpZmllZCB0dHkgKGkuZQpAQCAtNjcyLDcgKzY3Miw3IEBACiAKIAogCi0gICsIbyAgeHRlcm1zIC0gZGV2aWNlPXh0ZXJtCisgIG8gIHh0ZXJtcyAtIGRldmljZT14dGVybQogCiAKICAgICAgVU1MIHdpbGwgcnVuIGFuIHh0ZXJtIGFuZCB0aGUgZGV2aWNlIHdpbGwgYmUgYXR0YWNoZWQgdG8gaXQuCkBAIC02ODEsNyArNjgxLDcgQEAKIAogCiAKLSAgKwhvICBQb3J0IC0gZGV2aWNlPXBvcnQ6cG9ydCBudW1iZXIKKyAgbyAgUG9ydCAtIGRldmljZT1wb3J0OnBvcnQgbnVtYmVyCiAKIAogICAgICBUaGlzIHdpbGwgYXR0YWNoIHRoZSBVTUwgZGV2aWNlcyB0byB0aGUgc3BlY2lmaWVkIGhvc3QgcG9ydC4KQEAgLTcyNSw3ICs3MjUsNyBAQAogCiAKIAotICArCG8gIGFscmVhZHktZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9ycyAtIGRldmljZT1maWxlIGRlc2NyaXB0b3IKKyAgbyAgYWxyZWFkeS1leGlzdGluZyBmaWxlIGRlc2NyaXB0b3JzIC0gZGV2aWNlPWZpbGUgZGVzY3JpcHRvcgogCiAKICAgICAgSWYgeW91IHNldCB1cCBhIGZpbGUgZGVzY3JpcHRvciBvbiB0aGUgVU1MIGNvbW1hbmQgbGluZSwgeW91IGNhbgpAQCAtNzQzLDcgKzc0Myw3IEBACiAKIAogCi0gICsIbyAgTm90aGluZyAtIGRldmljZT1udWxsCisgIG8gIE5vdGhpbmcgLSBkZXZpY2U9bnVsbAogCiAKICAgICAgVGhpcyBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBvcGVuZWQsIGluIGNvbnRyYXN0IHRvICdub25lJywgYnV0CkBAIC03NTQsNyArNzU0LDcgQEAKIAogCiAKLSAgKwhvICBOb25lIC0gZGV2aWNlPW5vbmUKKyAgbyAgTm9uZSAtIGRldmljZT1ub25lCiAKIAogICAgICBUaGlzIGNhdXNlcyB0aGUgZGV2aWNlIHRvIGRpc2FwcGVhci4KQEAgLTc3MCw3ICs3NzAsNyBAQAogCiAKIAotICB3aWxsIGNhdXNlIHNlcmlhbCBsaW5lIDMgdG8gYWNjZXB0IGlucHV0IG9uIHRoZSBob3N0J3MgL2Rldi90dHkzIGFuZAorICB3aWxsIGNhdXNlIHNlcmlhbCBsaW5lIDMgdG8gYWNjZXB0IGlucHV0IG9uIHRoZSBob3N0J3MgL2Rldi90dHkyIGFuZAogICBkaXNwbGF5IG91dHB1dCBvbiBhbiB4dGVybS4gIFRoYXQncyBhIHNpbGx5IGV4YW1wbGUgLSB0aGUgbW9zdCBjb21tb24KICAgdXNlIG9mIHRoaXMgc3ludGF4IGlzIHRvIHJlYXR0YWNoIHRoZSBtYWluIGNvbnNvbGUgdG8gc3RkaW4gYW5kIHN0ZG91dAogICBhcyBzaG93biBhYm92ZS4KQEAgLTc4NSw3ICs3ODUsNyBAQAogCiAKIAotICA1CDUuCC4zCDMuCC4gIEUIRXgIeGEIYW0IbXAIcGwIbGUIZXMIcworICA1LjMuICBFeGFtcGxlcwogCiAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBpbnRlcmVzdGluZyB0aGluZ3MgeW91IGNhbiBkbyB3aXRoIHRoaXMKICAgY2FwYWJpbGl0eS4KQEAgLTgzOCw3ICs4MzgsNyBAQAogICBwcm9tcHQgb2YgdGhlIG90aGVyIHZpcnR1YWwgbWFjaGluZS4KIAogCi0gIDYINi4ILiAgUwhTZQhldAh0dAh0aQhpbghuZwhnIHUIdXAIcCB0CHRoCGhlCGUgbghuZQhldAh0dwh3bwhvcghyawhrCisgIDYuICBTZXR0aW5nIHVwIHRoZSBuZXR3b3JrCiAKIAogCkBAIC04NTgsMTkgKzg1OCwxOSBAQAogICBUaGVyZSBhcmUgY3VycmVudGx5IGZpdmUgdHJhbnNwb3J0IHR5cGVzIGF2YWlsYWJsZSBmb3IgYSBVTUwgdmlydHVhbAogICBtYWNoaW5lIHRvIGV4Y2hhbmdlIHBhY2tldHMgd2l0aCBvdGhlciBob3N0czoKIAotICArCG8gIGV0aGVydGFwCisgIG8gIGV0aGVydGFwCiAKLSAgKwhvICBUVU4vVEFQCisgIG8gIFRVTi9UQVAKIAotICArCG8gIE11bHRpY2FzdAorICBvICBNdWx0aWNhc3QKIAotICArCG8gIGEgc3dpdGNoIGRhZW1vbgorICBvICBhIHN3aXRjaCBkYWVtb24KIAotICArCG8gIHNsaXAKKyAgbyAgc2xpcAogCi0gICsIbyAgc2xpcnAKKyAgbyAgc2xpcnAKIAotICArCG8gIHBjYXAKKyAgbyAgcGNhcAogCiAgICAgIFRoZSBUVU4vVEFQLCBldGhlcnRhcCwgc2xpcCwgYW5kIHNsaXJwIHRyYW5zcG9ydHMgYWxsb3cgYSBVTUwKICAgICAgaW5zdGFuY2UgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZSBob3N0LiAgVGhleSBtYXkgYmUgZGlyZWN0ZWQKQEAgLTg5MywyOCArODkzLDI4IEBACiAgIFdpdGggc28gbWFueSBob3N0IHRyYW5zcG9ydHMsIHdoaWNoIG9uZSBzaG91bGQgeW91IHVzZT8gIEhlcmUncyB3aGVuCiAgIHlvdSBzaG91bGQgdXNlIGVhY2ggb25lOgogCi0gICsIbyAgZXRoZXJ0YXAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKKyAgbyAgZXRoZXJ0YXAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKICAgICAgcnVubmluZyAyLjIKIAotICArCG8gIFRVTi9UQVAgLSBpZiB5b3Ugd2FudCBhY2Nlc3MgdG8gdGhlIGhvc3QgbmV0d29ya2luZyBhbmQgaXQgaXMKKyAgbyAgVFVOL1RBUCAtIGlmIHlvdSB3YW50IGFjY2VzcyB0byB0aGUgaG9zdCBuZXR3b3JraW5nIGFuZCBpdCBpcwogICAgICBydW5uaW5nIDIuNC4gIEFsc28sIHRoZSBUVU4vVEFQIHRyYW5zcG9ydCBpcyBhYmxlIHRvIHVzZSBhCiAgICAgIHByZWNvbmZpZ3VyZWQgZGV2aWNlLCBhbGxvd2luZyBpdCB0byBhdm9pZCB1c2luZyB0aGUgc2V0dWlkIHVtbF9uZXQKICAgICAgaGVscGVyLCB3aGljaCBpcyBhIHNlY3VyaXR5IGFkdmFudGFnZS4KIAotICArCG8gIE11bHRpY2FzdCAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91IGRvbid0IHdhbnQKKyAgbyAgTXVsdGljYXN0IC0gaWYgeW91IHdhbnQgYSBwdXJlbHkgdmlydHVhbCBuZXR3b3JrIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICB0byBzZXQgdXAgYW55dGhpbmcgYnV0IHRoZSBVTUwKIAotICArCG8gIGEgc3dpdGNoIGRhZW1vbiAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91CisgIG8gIGEgc3dpdGNoIGRhZW1vbiAtIGlmIHlvdSB3YW50IGEgcHVyZWx5IHZpcnR1YWwgbmV0d29yayBhbmQgeW91CiAgICAgIGRvbid0IG1pbmQgcnVubmluZyB0aGUgZGFlbW9uIGluIG9yZGVyIHRvIGdldCBzb21ld2hhdCBiZXR0ZXIKICAgICAgcGVyZm9ybWFuY2UKIAotICArCG8gIHNsaXAgLSB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB0byBydW4gdGhlIHNsaXAgYmFja2VuZCB1bmxlc3MKKyAgbyAgc2xpcCAtIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgcmVhc29uIHRvIHJ1biB0aGUgc2xpcCBiYWNrZW5kIHVubGVzcwogICAgICBldGhlcnRhcCBhbmQgVFVOL1RBUCBhcmUganVzdCBub3QgYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbgogCi0gICsIbyAgc2xpcnAgLSBpZiB5b3UgZG9uJ3QgaGF2ZSByb290IGFjY2VzcyBvbiB0aGUgaG9zdCB0byBzZXR1cAorICBvICBzbGlycCAtIGlmIHlvdSBkb24ndCBoYXZlIHJvb3QgYWNjZXNzIG9uIHRoZSBob3N0IHRvIHNldHVwCiAgICAgIG5ldHdvcmtpbmcsIG9yIGlmIHlvdSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIElQIHRvIHlvdXIgVU1MCiAKLSAgKwhvICBwY2FwIC0gbm90IG11Y2ggdXNlIGZvciBhY3R1YWwgbmV0d29yayBjb25uZWN0aXZpdHksIGJ1dCBncmVhdCBmb3IKKyAgbyAgcGNhcCAtIG5vdCBtdWNoIHVzZSBmb3IgYWN0dWFsIG5ldHdvcmsgY29ubmVjdGl2aXR5LCBidXQgZ3JlYXQgZm9yCiAgICAgIG1vbml0b3JpbmcgdHJhZmZpYyBvbiB0aGUgaG9zdAogCiAgICAgIEV0aGVydGFwIGlzIGF2YWlsYWJsZSBvbiAyLjQgYW5kIHdvcmtzIGZpbmUuICBUVU4vVEFQIGlzIHByZWZlcnJlZApAQCAtOTI2LDcgKzkyNiw3IEBACiAgICAgIGV4cGxvaXQgdGhlIGhlbHBlcidzIHJvb3QgcHJpdmlsZWdlcy4KIAogCi0gIDYINi4ILjEIMS4ILiAgRwhHZQhlbghuZQhlcghyYQhhbAhsIHMIc2UIZXQIdHUIdXAIcAorICA2LjEuICBHZW5lcmFsIHNldHVwCiAKICAgRmlyc3QsIHlvdSBtdXN0IGhhdmUgdGhlIHZpcnR1YWwgbmV0d29yayBlbmFibGVkIGluIHlvdXIgVU1MLiAgSWYgYXJlCiAgIHJ1bm5pbmcgYSBwcmVidWlsdCBrZXJuZWwgZnJvbSB0aGlzIHNpdGUsIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeQpAQCAtOTk1LDcgKzk5NSw3IEBACiAKIAogCi0gIDYINi4ILjIIMi4ILiAgVQhVcwhzZQhlcghycwhzcAhwYQhhYwhjZQhlIGQIZGEIYWUIZW0IbW8Ib24IbnMIcworICA2LjIuICBVc2Vyc3BhY2UgZGFlbW9ucwogCiAgIFlvdSB3aWxsIGxpa2VseSBuZWVkIHRoZSBzZXR1aWQgaGVscGVyLCBvciB0aGUgc3dpdGNoIGRhZW1vbiwgb3IgYm90aC4KICAgVGhleSBhcmUgYm90aCBpbnN0YWxsZWQgd2l0aCB0aGUgUlBNIGFuZCBkZWIsIHNvIGlmIHlvdSd2ZSBpbnN0YWxsZWQKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAKIAogCi0gIDYINi4ILjMIMy4ILiAgUwhTcAhwZQhlYwhjaQhpZghmeQh5aQhpbghuZwhnIGUIZXQIdGgIaGUIZXIIcm4IbmUIZXQIdCBhCGFkCGRkCGRyCHJlCGVzCHNzCHNlCGVzCHMKKyAgNi4zLiAgU3BlY2lmeWluZyBldGhlcm5ldCBhZGRyZXNzZXMKIAogICBCZWxvdywgeW91IHdpbGwgc2VlIHRoYXQgdGhlIFRVTi9UQVAsIGV0aGVydGFwLCBhbmQgZGFlbW9uIGludGVyZmFjZXMKICAgYWxsb3cgeW91IHRvIHNwZWNpZnkgaGFyZHdhcmUgYWRkcmVzc2VzIGZvciB0aGUgdmlydHVhbCBldGhlcm5ldApAQCAtMTAyMywxMSArMTAyMywxMSBAQAogICBzdWZmaWNpZW50IHRvIGd1YXJhbnRlZSBhIHVuaXF1ZSBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgZGV2aWNlLiAgQQogICBjb3VwbGUgb2YgZXhjZXB0aW9ucyBhcmU6CiAKLSAgKwhvICBBbm90aGVyIHNldCBvZiB2aXJ0dWFsIGV0aGVybmV0IGRldmljZXMgYXJlIG9uIHRoZSBzYW1lIG5ldHdvcmsgYW5kCisgIG8gIEFub3RoZXIgc2V0IG9mIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlcyBhcmUgb24gdGhlIHNhbWUgbmV0d29yayBhbmQKICAgICAgdGhleSBhcmUgYXNzaWduZWQgaGFyZHdhcmUgYWRkcmVzc2VzIHVzaW5nIGEgZGlmZmVyZW50IHNjaGVtZSB3aGljaAogICAgICBtYXkgY29uZmxpY3Qgd2l0aCB0aGUgVU1MIElQIGFkZHJlc3MtYmFzZWQgc2NoZW1lCiAKLSAgKwhvICBZb3UgYXJlbid0IGdvaW5nIHRvIHVzZSB0aGUgZGV2aWNlIGZvciBJUCBuZXR3b3JraW5nLCBzbyB5b3UgZG9uJ3QKKyAgbyAgWW91IGFyZW4ndCBnb2luZyB0byB1c2UgdGhlIGRldmljZSBmb3IgSVAgbmV0d29ya2luZywgc28geW91IGRvbid0CiAgICAgIGFzc2lnbiB0aGUgZGV2aWNlIGFuIElQIGFkZHJlc3MKIAogICAgICBJZiB5b3UgbGV0IHRoZSBkcml2ZXIgcHJvdmlkZSB0aGUgaGFyZHdhcmUgYWRkcmVzcywgeW91IHNob3VsZCBtYWtlCkBAIC0xMDQ5LDcgKzEwNDksNyBAQAogCiAKIAotICA2CDYuCC40CDQuCC4gIFUIVU0ITUwITCBpCGluCG50CHRlCGVyCHJmCGZhCGFjCGNlCGUgcwhzZQhldAh0dQh1cAhwCisgIDYuNC4gIFVNTCBpbnRlcmZhY2Ugc2V0dXAKIAogICBPbmNlIHRoZSBuZXR3b3JrIGRldmljZXMgaGF2ZSBiZWVuIGRlc2NyaWJlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB5b3UKICAgc2hvdWxkIGJvb3QgVU1MIGFuZCBsb2cgaW4uCkBAIC0xMTMxLDcgKzExMzEsNyBAQAogCiAKIAotICA2CDYuCC41CDUuCC4gIE0ITXUIdWwIbHQIdGkIaWMIY2EIYXMIc3QIdAorICA2LjUuICBNdWx0aWNhc3QKIAogICBUaGUgc2ltcGxlc3Qgd2F5IHRvIHNldCB1cCBhIHZpcnR1YWwgbmV0d29yayBiZXR3ZWVuIG11bHRpcGxlIFVNTHMgaXMKICAgdG8gdXNlIHRoZSBtY2FzdCB0cmFuc3BvcnQuICBUaGlzIHdhcyB3cml0dGVuIGJ5IEhhcmFsZCBXZWx0ZSBhbmQgaXMKQEAgLTExOTQsNyArMTE5NCw3IEBACiAKIAogCi0gIDYINi4ILjYINi4ILiAgVAhUVQhVTghOLwgvVAhUQQhBUAhQIHcId2kIaXQIdGgIaCB0CHRoCGhlCGUgdQh1bQhtbAhsXwhfbghuZQhldAh0IGgIaGUIZWwIbHAIcGUIZXIIcgorICA2LjYuICBUVU4vVEFQIHdpdGggdGhlIHVtbF9uZXQgaGVscGVyCiAKICAgVFVOL1RBUCBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBvbiAyLjQgdG8gZXhjaGFuZ2UgcGFja2V0cyB3aXRoIHRoZQogICBob3N0LiAgVGhlIFRVTi9UQVAgYmFja2VuZCBoYXMgYmVlbiBpbiBVTUwgc2luY2UgMi40LjktM3VtLgpAQCAtMTI0NywxMCArMTI0NywxMCBAQAogICBUaGVyZSBhcmUgYSBjb3VwbGUgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggcnVubmluZyB0aGUgVFVOL1RBUAogICB0cmFuc3BvcnQgb24gYSAyLjQgaG9zdCBrZXJuZWwKIAotICArCG8gIFRVTi9UQVAgc2VlbXMgbm90IHRvIHdvcmsgb24gMi40LjMgYW5kIGVhcmxpZXIuICBVcGdyYWRlIHRoZSBob3N0CisgIG8gIFRVTi9UQVAgc2VlbXMgbm90IHRvIHdvcmsgb24gMi40LjMgYW5kIGVhcmxpZXIuICBVcGdyYWRlIHRoZSBob3N0CiAgICAgIGtlcm5lbCBvciB1c2UgdGhlIGV0aGVydGFwIHRyYW5zcG9ydC4KIAotICArCG8gIFdpdGggYW4gdXBncmFkZWQga2VybmVsLCBUVU4vVEFQIG1heSBmYWlsIHdpdGgKKyAgbyAgV2l0aCBhbiB1cGdyYWRlZCBrZXJuZWwsIFRVTi9UQVAgbWF5IGZhaWwgd2l0aAogCiAKICAgICAgICBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCiAKIAotICA2CDYuCC43CDcuCC4gIFQIVFUIVU4ITi8IL1QIVEEIQVAIUCB3CHdpCGl0CHRoCGggYQhhIHAIcHIIcmUIZWMIY28Ib24IbmYIZmkIaWcIZ3UIdXIIcmUIZWQIZCB0CHRhCGFwCHAgZAhkZQhldgh2aQhpYwhjZQhlCisgIDYuNy4gIFRVTi9UQVAgd2l0aCBhIHByZWNvbmZpZ3VyZWQgdGFwIGRldmljZQogCiAgIElmIHlvdSBwcmVmZXIgbm90IHRvIGhhdmUgVU1MIHVzZSB1bWxfbmV0ICh3aGljaCBpcyBzb21ld2hhdAogICBpbnNlY3VyZSksIHdpdGggVU1MIDIuNC4xNy0xMSwgeW91IGNhbiBzZXQgdXAgYSBUVU4vVEFQIGRldmljZQpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKICAgdGhlcmUgaXMgbm8gbmVlZCBmb3Igcm9vdCBhc3Npc3RhbmNlLiAgU2V0dGluZyB1cCB0aGUgZGV2aWNlIGlzIGRvbmUKICAgYXMgZm9sbG93czoKIAotICArCG8gIENyZWF0ZSB0aGUgZGV2aWNlIHdpdGggdHVuY3RsIChhdmFpbGFibGUgZnJvbSB0aGUgVU1MIHV0aWxpdGllcworICBvICBDcmVhdGUgdGhlIGRldmljZSB3aXRoIHR1bmN0bCAoYXZhaWxhYmxlIGZyb20gdGhlIFVNTCB1dGlsaXRpZXMKICAgICAgdGFyYmFsbCkKIAogCkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogICB3aGVyZSB1aWQgaXMgdGhlIHVzZXIgaWQgb3IgdXNlcm5hbWUgdGhhdCBVTUwgd2lsbCBiZSBydW4gYXMuICBUaGlzCiAgIHdpbGwgdGVsbCB5b3Ugd2hhdCBkZXZpY2Ugd2FzIGNyZWF0ZWQuCiAKLSAgKwhvICBDb25maWd1cmUgdGhlIGRldmljZSBJUCAoY2hhbmdlIElQIGFkZHJlc3NlcyBhbmQgZGV2aWNlIG5hbWUgdG8KKyAgbyAgQ29uZmlndXJlIHRoZSBkZXZpY2UgSVAgKGNoYW5nZSBJUCBhZGRyZXNzZXMgYW5kIGRldmljZSBuYW1lIHRvCiAgICAgIHN1aXQpCiAKIApAQCAtMTMwMyw3ICsxMzAzLDcgQEAKIAogCiAKLSAgKwhvICBTZXQgdXAgcm91dGluZyBhbmQgYXJwaW5nIGlmIGRlc2lyZWQgLSB0aGlzIGlzIG15IHJlY2lwZSwgdGhlcmUgYXJlCisgIG8gIFNldCB1cCByb3V0aW5nIGFuZCBhcnBpbmcgaWYgZGVzaXJlZCAtIHRoaXMgaXMgbXkgcmVjaXBlLCB0aGVyZSBhcmUKICAgICAgb3RoZXIgd2F5cyBvZiBkb2luZyB0aGUgc2FtZSB0aGluZwogCiAKQEAgLTEzMzgsNyArMTMzOCw3IEBACiAgIHV0aWxpdHkgd2hpY2ggcmVhZHMgdGhlIGluZm9ybWF0aW9uIGZyb20gYSBjb25maWcgZmlsZSBhbmQgc2V0cyB1cAogICBkZXZpY2VzIGF0IGJvb3QgdGltZS4KIAotICArCG8gIFJhdGhlciB0aGFuIHVzaW5nIHVwIHR3byBJUHMgYW5kIEFSUGluZyBmb3Igb25lIG9mIHRoZW0sIHlvdSBjYW4KKyAgbyAgUmF0aGVyIHRoYW4gdXNpbmcgdXAgdHdvIElQcyBhbmQgQVJQaW5nIGZvciBvbmUgb2YgdGhlbSwgeW91IGNhbgogICAgICBhbHNvIHByb3ZpZGUgZGlyZWN0IGFjY2VzcyB0byB5b3VyIExBTiBieSB0aGUgVU1MIGJ5IHVzaW5nIGEKICAgICAgYnJpZGdlLgogCkBAIC0xNDE3LDcgKzE0MTcsNyBAQAogICBOb3RlIHRoYXQgJ2JyMCcgc2hvdWxkIGJlIHNldHVwIHVzaW5nIGlmY29uZmlnIHdpdGggdGhlIGV4aXN0aW5nIElQCiAgIGFkZHJlc3Mgb2YgZXRoMCwgYXMgZXRoMCBubyBsb25nZXIgaGFzIGl0cyBvd24gSVAuCiAKLSAgKwhvCisgIG8KIAogCiAgICAgIEFsc28sIHRoZSAvZGV2L25ldC90dW4gZGV2aWNlIG11c3QgYmUgd3JpdGFibGUgYnkgdGhlIHVzZXIgcnVubmluZwpAQCAtMTQzOCwxMSArMTQzOCwxMSBAQAogICBkZXZpY2VzIGFuZCBjaGdycCAvZGV2L25ldC90dW4gdG8gdGhhdCBncm91cCB3aXRoIG1vZGUgNjY0IG9yIDY2MC4KIAogCi0gICsIbyAgT25jZSB0aGUgZGV2aWNlIGlzIHNldCB1cCwgcnVuIFVNTCB3aXRoICdldGgwPXR1bnRhcCxkZXZpY2UgbmFtZScKKyAgbyAgT25jZSB0aGUgZGV2aWNlIGlzIHNldCB1cCwgcnVuIFVNTCB3aXRoICdldGgwPXR1bnRhcCxkZXZpY2UgbmFtZScKICAgICAgKGkuZS4gJ2V0aDA9dHVudGFwLHRhcDAnKSBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBkbyBpdCB3aXRoIHRoZQogICAgICBtY29uc29sZSBjb25maWcgY29tbWFuZCkuCiAKLSAgKwhvICBCcmluZyB0aGUgZXRoIGRldmljZSB1cCBpbiBVTUwgYW5kIHlvdSdyZSBpbiBidXNpbmVzcy4KKyAgbyAgQnJpbmcgdGhlIGV0aCBkZXZpY2UgdXAgaW4gVU1MIGFuZCB5b3UncmUgaW4gYnVzaW5lc3MuCiAKICAgICAgSWYgeW91IGRvbid0IHdhbnQgdGhhdCB0YXAgZGV2aWNlIGFueSBtb3JlLCB5b3UgY2FuIG1ha2UgaXQgbm9uLQogICAgICBwZXJzaXN0ZW50IHdpdGgKQEAgLTE0NjUsNyArMTQ2NSw3IEBACiAKIAogCi0gIDYINi4ILjgIOC4ILiAgRQhFdAh0aAhoZQhlcghydAh0YQhhcAhwCisgIDYuOC4gIEV0aGVydGFwCiAKICAgRXRoZXJ0YXAgaXMgdGhlIGdlbmVyYWwgbWVjaGFuaXNtIG9uIDIuMiBmb3IgdXNlcnNwYWNlIHByb2Nlc3NlcyB0bwogICBleGNoYW5nZSBwYWNrZXRzIHdpdGggdGhlIGtlcm5lbC4KQEAgLTE1NjEsOSArMTU2MSw5IEBACiAKIAogCi0gIDYINi4ILjkIOS4ILiAgVAhUaAhoZQhlIHMIc3cId2kIaXQIdGMIY2gIaCBkCGRhCGFlCGVtCG1vCG9uCG4KKyAgNi45LiAgVGhlIHN3aXRjaCBkYWVtb24KIAotICBOCE5vCG90CHRlCGU6IFRoaXMgaXMgdGhlIGRhZW1vbiBmb3JtZXJseSBrbm93biBhcyB1bWxfcm91dGVyLCBidXQgd2hpY2ggd2FzCisgIE5vdGU6IFRoaXMgaXMgdGhlIGRhZW1vbiBmb3JtZXJseSBrbm93biBhcyB1bWxfcm91dGVyLCBidXQgd2hpY2ggd2FzCiAgIHJlbmFtZWQgc28gdGhlIG5ldHdvcmsgd2VlbmllcyBvZiB0aGUgd29ybGQgd291bGQgc3RvcCBncm93bGluZyBhdCBtZS4KIAogCkBAIC0xNjQ5LDcgKzE2NDksNyBAQAogCiAKIAotICA2CDYuCC4xCDEwCDAuCC4gIFMIU2wIbGkIaXAIcAorICA2LjEwLiAgU2xpcAogCiAgIFNsaXAgaXMgYW5vdGhlciwgbGVzcyBnZW5lcmFsLCBtZWNoYW5pc20gZm9yIGEgcHJvY2VzcyB0byBjb21tdW5pY2F0ZQogICB3aXRoIHRoZSBob3N0IG5ldHdvcmtpbmcuICBJbiBjb250cmFzdCB0byB0aGUgZXRoZXJ0YXAgaW50ZXJmYWNlLApAQCAtMTY4MSw3ICsxNjgxLDcgQEAKIAogCiAKLSAgNgg2LgguMQgxMQgxLgguICBTCFNsCGxpCGlyCHJwCHAKKyAgNi4xMS4gIFNsaXJwCiAKICAgc2xpcnAgdXNlcyBhbiBleHRlcm5hbCBwcm9ncmFtLCB1c3VhbGx5IC91c3IvYmluL3NsaXJwLCB0byBwcm92aWRlIElQCiAgIG9ubHkgbmV0d29ya2luZyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgaG9zdC4gVGhpcyBpcyBzaW1pbGFyIHRvIElQCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogCiAKIAotICA2CDYuCC4xCDEyCDIuCC4gIHAIcGMIY2EIYXAIcAorICA2LjEyLiAgcGNhcAogCiAgIFRoZSBwY2FwIHRyYW5zcG9ydCBpcyBhdHRhY2hlZCB0byBhIFVNTCBldGhlcm5ldCBkZXZpY2Ugb24gdGhlIGNvbW1hbmQKICAgbGluZSBvciB3aXRoIHVtbF9tY29uc29sZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgpAQCAtMTc3Nyw3ICsxNzc3LDcgQEAKIAogCiAKLSAgNgg2LgguMQgxMwgzLgguICBTCFNlCGV0CHR0CHRpCGluCG5nCGcgdQh1cAhwIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQgeQh5bwhvdQh1cghycwhzZQhlbAhsZghmCisgIDYuMTMuICBTZXR0aW5nIHVwIHRoZSBob3N0IHlvdXJzZWxmCiAKICAgSWYgeW91IGRvbid0IHNwZWNpZnkgYW4gYWRkcmVzcyBmb3IgdGhlIGhvc3Qgc2lkZSBvZiB0aGUgZXRoZXJ0YXAgb3IKICAgc2xpcCBkZXZpY2UsIFVNTCB3b24ndCBkbyBhbnkgc2V0dXAgb24gdGhlIGhvc3QuICBTbyB0aGlzIGlzIHdoYXQgaXMKQEAgLTE3ODUsNyArMTc4NSw3IEBACiAgIDE5Mi4xNjguMC4yNTEgYW5kIGEgVU1MLXNpZGUgSVAgb2YgMTkyLjE2OC4wLjI1MCAtIGFkanVzdCB0byBzdWl0IHlvdXIKICAgb3duIG5ldHdvcmspOgogCi0gICsIbyAgVGhlIGRldmljZSBuZWVkcyB0byBiZSBjb25maWd1cmVkIHdpdGggaXRzIElQIGFkZHJlc3MuICBUYXAgZGV2aWNlcworICBvICBUaGUgZGV2aWNlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBpdHMgSVAgYWRkcmVzcy4gIFRhcCBkZXZpY2VzCiAgICAgIGFyZSBhbHNvIGNvbmZpZ3VyZWQgd2l0aCBhbiBtdHUgb2YgMTQ4NC4gIFNsaXAgZGV2aWNlcyBhcmUKICAgICAgY29uZmlndXJlZCB3aXRoIGEgcG9pbnQtdG8tcG9pbnQgYWRkcmVzcyBwb2ludGluZyBhdCB0aGUgVU1MIGlwCiAgICAgIGFkZHJlc3MuCkBAIC0xODA1LDcgKzE4MDUsNyBAQAogCiAKIAotICArCG8gIElmIGEgdGFwIGRldmljZSBpcyBiZWluZyBzZXQgdXAsIGEgcm91dGUgaXMgc2V0IHRvIHRoZSBVTUwgSVAuCisgIG8gIElmIGEgdGFwIGRldmljZSBpcyBiZWluZyBzZXQgdXAsIGEgcm91dGUgaXMgc2V0IHRvIHRoZSBVTUwgSVAuCiAKIAogICAgICAgIFVNTCMgcm91dGUgYWRkIC1ob3N0IDE5Mi4xNjguMC4yNTAgZ3cgMTkyLjE2OC4wLjI1MQpAQCAtMTgxNCw3ICsxODE0LDcgQEAKIAogCiAKLSAgKwhvICBUbyBhbGxvdyBvdGhlciBob3N0cyBvbiB5b3VyIG5ldHdvcmsgdG8gc2VlIHRoZSB2aXJ0dWFsIG1hY2hpbmUsCisgIG8gIFRvIGFsbG93IG90aGVyIGhvc3RzIG9uIHlvdXIgbmV0d29yayB0byBzZWUgdGhlIHZpcnR1YWwgbWFjaGluZSwKICAgICAgcHJveHkgYXJwIGlzIHNldCB1cCBmb3IgaXQuCiAKIApAQCAtMTgyNCw3ICsxODI0LDcgQEAKIAogCiAKLSAgKwhvICBGaW5hbGx5LCB0aGUgaG9zdCBpcyBzZXQgdXAgdG8gcm91dGUgcGFja2V0cy4KKyAgbyAgRmluYWxseSwgdGhlIGhvc3QgaXMgc2V0IHVwIHRvIHJvdXRlIHBhY2tldHMuCiAKIAogICAgICAgIGhvc3QjICBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZApAQCAtMTgzOCwxMiArMTgzOCwxMiBAQAogCiAKIAotICA3CDcuCC4gIFMIU2gIaGEIYXIIcmkIaW4IbmcIZyBGCEZpCGlsCGxlCGVzCHN5CHlzCHN0CHRlCGVtCG1zCHMgYghiZQhldAh0dwh3ZQhlZQhlbghuIFYIVmkIaXIIcnQIdHUIdWEIYWwIbCBNCE1hCGFjCGNoCGhpCGluCG5lCGVzCHMKKyAgNy4gIFNoYXJpbmcgRmlsZXN5c3RlbXMgYmV0d2VlbiBWaXJ0dWFsIE1hY2hpbmVzCiAKIAogCiAKLSAgNwg3LgguMQgxLgguICBBCEEgdwh3YQhhcghybghuaQhpbghuZwhnCisgIDcuMS4gIEEgd2FybmluZwogCiAgIERvbid0IGF0dGVtcHQgdG8gc2hhcmUgZmlsZXN5c3RlbXMgc2ltcGx5IGJ5IGJvb3RpbmcgdHdvIFVNTHMgZnJvbSB0aGUKICAgc2FtZSBmaWxlLiAgVGhhdCdzIHRoZSBzYW1lIHRoaW5nIGFzIGJvb3RpbmcgdHdvIHBoeXNpY2FsIG1hY2hpbmVzCkBAIC0xODUxLDcgKzE4NTEsNyBAQAogCiAKIAotICA3CDcuCC4yCDIuCC4gIFUIVXMIc2kIaW4IbmcIZyBsCGxhCGF5CHllCGVyCHJlCGVkCGQgYghibAhsbwhvYwhjawhrIGQIZGUIZXYIdmkIaWMIY2UIZXMIcworICA3LjIuICBVc2luZyBsYXllcmVkIGJsb2NrIGRldmljZXMKIAogICBUaGUgd2F5IHRvIHNoYXJlIGEgZmlsZXN5c3RlbSBiZXR3ZWVuIHR3byB2aXJ0dWFsIG1hY2hpbmVzIGlzIHRvIHVzZQogICB0aGUgY29weS1vbi13cml0ZSAoQ09XKSBsYXllcmluZyBjYXBhYmlsaXR5IG9mIHRoZSB1YmQgYmxvY2sgZHJpdmVyLgpAQCAtMTg5Niw3ICsxODk2LDcgQEAKIAogCiAKLSAgNwg3LgguMwgzLgguICBOCE5vCG90CHRlCGUhCCEKKyAgNy4zLiAgTm90ZSEKIAogICBXaGVuIGNoZWNraW5nIHRoZSBzaXplIG9mIHRoZSBDT1cgZmlsZSBpbiBvcmRlciB0byBzZWUgdGhlIGdvYnMgb2YKICAgc3BhY2UgdGhhdCB5b3UncmUgc2F2aW5nLCBtYWtlIHN1cmUgeW91IHVzZSAnbHMgLWxzJyB0byBzZWUgdGhlIGFjdHVhbApAQCAtMTkyNiw3ICsxOTI2LDcgQEAKIAogCiAKLSAgNwg3LgguNAg0LgguICBBCEFuCG5vCG90CHRoCGhlCGVyCHIgdwh3YQhhcghybghuaQhpbghuZwhnCisgIDcuNC4gIEFub3RoZXIgd2FybmluZwogCiAgIE9uY2UgYSBmaWxlc3lzdGVtIGlzIGJlaW5nIHVzZWQgYXMgYSByZWFkb25seSBiYWNraW5nIGZpbGUgZm9yIGEgQ09XCiAgIGZpbGUsIGRvIG5vdCBib290IGRpcmVjdGx5IGZyb20gaXQgb3IgbW9kaWZ5IGl0IGluIGFueSB3YXkuICBEb2luZyBzbwpAQCAtMTk1Miw3ICsxOTUyLDcgQEAKIAogCiAKLSAgNwg3LgguNQg1LgguICB1CHVtCG1sCGxfCF9tCG1vCG9vCG8gOgg6IE0ITWUIZXIIcmcIZ2kIaW4IbmcIZyBhCGEgQwhDTwhPVwhXIGYIZmkIaWwIbGUIZSB3CHdpCGl0CHRoCGggaQhpdAh0cwhzIGIIYmEIYWMIY2sIa2kIaW4IbmcIZyBmCGZpCGlsCGxlCGUKKyAgNy41LiAgdW1sX21vbyA6IE1lcmdpbmcgYSBDT1cgZmlsZSB3aXRoIGl0cyBiYWNraW5nIGZpbGUKIAogICBEZXBlbmRpbmcgb24gaG93IHlvdSB1c2UgVU1MIGFuZCBDT1cgZGV2aWNlcywgaXQgbWF5IGJlIGFkdmlzYWJsZSB0bwogICBtZXJnZSB0aGUgY2hhbmdlcyBpbiB0aGUgQ09XIGZpbGUgaW50byB0aGUgYmFja2luZyBmaWxlIGV2ZXJ5IG9uY2UgaW4KQEAgLTIwMDEsNyArMjAwMSw3IEBACiAKIAogCi0gIDgIOC4ILiAgQwhDcghyZQhlYQhhdAh0aQhpbghuZwhnIGYIZmkIaWwIbGUIZXMIc3kIeXMIc3QIdGUIZW0IbXMIcworICA4LiAgQ3JlYXRpbmcgZmlsZXN5c3RlbXMKIAogCiAgIFlvdSBtYXkgd2FudCB0byBjcmVhdGUgYW5kIG1vdW50IG5ldyBVTUwgZmlsZXN5c3RlbXMsIGVpdGhlciBiZWNhdXNlCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogICBzaG91bGQgYmUgZWFzeSB0byB0cmFuc2xhdGUgdG8gdGhlIGZpbGVzeXN0ZW0gb2YgeW91ciBjaG9pY2UuCiAKIAotICA4CDguCC4xCDEuCC4gIEMIQ3IIcmUIZWEIYXQIdGUIZSB0CHRoCGhlCGUgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtIGYIZmkIaWwIbGUIZQorICA4LjEuICBDcmVhdGUgdGhlIGZpbGVzeXN0ZW0gZmlsZQogCiAgIGRkIGlzIHlvdXIgZnJpZW5kLiAgQWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRlbGwgZGQgdG8gY3JlYXRlIGFuIGVtcHR5CiAgIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUuICBJIHVzdWFsbHkgbWFrZSBpdCBzcGFyc2UgdG8gc2F2ZSB0aW1lCkBAIC0yMDMyLDcgKzIwMzIsNyBAQAogCiAKIAotICA4CDguCC4yCDIuCC4gIEEIQXMIc3MIc2kIaWcIZ24IbiB0CHRoCGhlCGUgZghmaQhpbAhsZQhlIHQIdG8IbyBhCGEgVQhVTQhNTAhMIGQIZGUIZXYIdmkIaWMIY2UIZQorICA4LjIuICBBc3NpZ24gdGhlIGZpbGUgdG8gYSBVTUwgZGV2aWNlCiAKICAgQWRkIGFuIGFyZ3VtZW50IGxpa2UgdGhlIGZvbGxvd2luZyB0byB0aGUgVU1MIGNvbW1hbmQgbGluZToKIApAQCAtMjA0NSw3ICsyMDQ1LDcgQEAKIAogCiAKLSAgOAg4LgguMwgzLgguICBDCENyCHJlCGVhCGF0CHRpCGluCG5nCGcgYQhhbghuZAhkIG0IbW8Ib3UIdW4IbnQIdGkIaW4IbmcIZyB0CHRoCGhlCGUgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtCisgIDguMy4gIENyZWF0aW5nIGFuZCBtb3VudGluZyB0aGUgZmlsZXN5c3RlbQogCiAgIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlc3lzdGVtIGlzIGF2YWlsYWJsZSwgZWl0aGVyIGJ5IGJlaW5nIGJ1aWx0IGludG8KICAgdGhlIGtlcm5lbCwgb3IgYXZhaWxhYmxlIGFzIGEgbW9kdWxlLCB0aGVuIGJvb3QgdXAgVU1MIGFuZCBsb2cgaW4uICBJZgpAQCAtMjA5Niw3ICsyMDk2LDcgQEAKIAogCiAKLSAgOQg5LgguICBICEhvCG9zCHN0CHQgZghmaQhpbAhsZQhlIGEIYWMIY2MIY2UIZXMIc3MIcworICA5LiAgSG9zdCBmaWxlIGFjY2VzcwogCiAKICAgSWYgeW91IHdhbnQgdG8gYWNjZXNzIGZpbGVzIG9uIHRoZSBob3N0IG1hY2hpbmUgZnJvbSBpbnNpZGUgVU1MLCB5b3UKQEAgLTIxMTIsNyArMjExMiw3IEBACiAgIGZpbGVzIGNvbnRhaW5lZCBpbiBpdCBqdXN0IGFzIHlvdSB3b3VsZCBvbiB0aGUgaG9zdC4KIAogCi0gIDkIOS4ILjEIMS4ILiAgVQhVcwhzaQhpbghuZwhnIGgIaG8Ib3MIc3QIdGYIZnMIcworICA5LjEuICBVc2luZyBob3N0ZnMKIAogICBUbyBiZWdpbiB3aXRoLCBtYWtlIHN1cmUgdGhhdCBob3N0ZnMgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgdmlydHVhbAogICBtYWNoaW5lIHdpdGgKQEAgLTIxNTEsNyArMjE1MSw3IEBACiAKIAogCi0gIDkIOS4ILjIIMi4ILiAgaAhobwhvcwhzdAh0ZghmcwhzIGEIYXMIcyB0CHRoCGhlCGUgcghybwhvbwhvdAh0IGYIZmkIaWwIbGUIZXMIc3kIeXMIc3QIdGUIZW0IbQorICA5LjIuICBob3N0ZnMgYXMgdGhlIHJvb3QgZmlsZXN5c3RlbQogCiAgIEl0J3MgcG9zc2libGUgdG8gYm9vdCBmcm9tIGEgZGlyZWN0b3J5IGhpZXJhcmNoeSBvbiB0aGUgaG9zdCB1c2luZwogICBob3N0ZnMgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHN0YW5kYXJkIGZpbGVzeXN0ZW0gaW4gYSBmaWxlLgpAQCAtMjE5NCwyMCArMjE5NCwyMCBAQAogICBVTUwgc2hvdWxkIHRoZW4gYm9vdCBhcyBpdCBkb2VzIG5vcm1hbGx5LgogCiAKLSAgOQg5LgguMwgzLgguICBCCEJ1CHVpCGlsCGxkCGRpCGluCG5nCGcgaAhobwhvcwhzdAh0ZghmcwhzCisgIDkuMy4gIEJ1aWxkaW5nIGhvc3RmcwogCiAgIElmIHlvdSBuZWVkIHRvIGJ1aWxkIGhvc3RmcyBiZWNhdXNlIGl0J3Mgbm90IGluIHlvdXIga2VybmVsLCB5b3UgaGF2ZQogICB0d28gY2hvaWNlczoKIAogCiAKLSAgKwhvICBDb21waWxpbmcgaG9zdGZzIGludG8gdGhlIGtlcm5lbDoKKyAgbyAgQ29tcGlsaW5nIGhvc3RmcyBpbnRvIHRoZSBrZXJuZWw6CiAKIAogICAgICBSZWNvbmZpZ3VyZSB0aGUga2VybmVsIGFuZCBzZXQgdGhlICdIb3N0IGZpbGVzeXN0ZW0nIG9wdGlvbiB1bmRlcgogCiAKLSAgKwhvICBDb21waWxpbmcgaG9zdGZzIGFzIGEgbW9kdWxlOgorICBvICBDb21waWxpbmcgaG9zdGZzIGFzIGEgbW9kdWxlOgogCiAKICAgICAgUmVjb25maWd1cmUgdGhlIGtlcm5lbCBhbmQgc2V0IHRoZSAnSG9zdCBmaWxlc3lzdGVtJyBvcHRpb24gdW5kZXIKQEAgLTIyMjgsNyArMjIyOCw3IEBACiAKIAogCi0gIDEIMTAIMC4ILiAgVAhUaAhoZQhlIE0ITWEIYW4IbmEIYWcIZ2UIZW0IbWUIZW4IbnQIdCBDCENvCG9uCG5zCHNvCG9sCGxlCGUKKyAgMTAuICBUaGUgTWFuYWdlbWVudCBDb25zb2xlCiAKIAogCkBAIC0yMjQwLDE1ICsyMjQwLDE1IEBACiAKICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggdGhlIG1jb25zb2xlIGludGVyZmFjZToKIAotICArCG8gIGdldCB0aGUga2VybmVsIHZlcnNpb24KKyAgbyAgZ2V0IHRoZSBrZXJuZWwgdmVyc2lvbgogCi0gICsIbyAgYWRkIGFuZCByZW1vdmUgZGV2aWNlcworICBvICBhZGQgYW5kIHJlbW92ZSBkZXZpY2VzCiAKLSAgKwhvICBoYWx0IG9yIHJlYm9vdCB0aGUgbWFjaGluZQorICBvICBoYWx0IG9yIHJlYm9vdCB0aGUgbWFjaGluZQogCi0gICsIbyAgU2VuZCBTeXNScSBjb21tYW5kcworICBvICBTZW5kIFN5c1JxIGNvbW1hbmRzCiAKLSAgKwhvICBQYXVzZSBhbmQgcmVzdW1lIHRoZSBVTUwKKyAgbyAgUGF1c2UgYW5kIHJlc3VtZSB0aGUgVU1MCiAKIAogICBZb3UgbmVlZCB0aGUgbWNvbnNvbGUgY2xpZW50ICh1bWxfbWNvbnNvbGUpIHdoaWNoIGlzIHByZXNlbnQgaW4gQ1ZTCkBAIC0yMzAwLDI4ICsyMzAwLDI4IEBACiAKICAgWW91J2xsIGdldCBhIHByb21wdCwgYXQgd2hpY2ggeW91IGNhbiBydW4gb25lIG9mIHRoZXNlIGNvbW1hbmRzOgogCi0gICsIbyAgdmVyc2lvbgorICBvICB2ZXJzaW9uCiAKLSAgKwhvICBoYWx0CisgIG8gIGhhbHQKIAotICArCG8gIHJlYm9vdAorICBvICByZWJvb3QKIAotICArCG8gIGNvbmZpZworICBvICBjb25maWcKIAotICArCG8gIHJlbW92ZQorICBvICByZW1vdmUKIAotICArCG8gIHN5c3JxCisgIG8gIHN5c3JxCiAKLSAgKwhvICBoZWxwCisgIG8gIGhlbHAKIAotICArCG8gIGNhZAorICBvICBjYWQKIAotICArCG8gIHN0b3AKKyAgbyAgc3RvcAogCi0gICsIbyAgZ28KKyAgbyAgZ28KIAogCi0gIDEIMTAIMC4ILjEIMS4ILiAgdgh2ZQhlcghycwhzaQhpbwhvbghuCisgIDEwLjEuICB2ZXJzaW9uCiAKICAgVGhpcyB0YWtlcyBubyBhcmd1bWVudHMuICBJdCBwcmludHMgdGhlIFVNTCB2ZXJzaW9uLgogCkBAIC0yMzQyLDcgKzIzNDIsNyBAQAogCiAKIAotICAxCDEwCDAuCC4yCDIuCC4gIGgIaGEIYWwIbHQIdCBhCGFuCG5kCGQgcghyZQhlYghibwhvbwhvdAh0CisgIDEwLjIuICBoYWx0IGFuZCByZWJvb3QKIAogICBUaGVzZSB0YWtlIG5vIGFyZ3VtZW50cy4gIFRoZXkgc2h1dCB0aGUgbWFjaGluZSBkb3duIGltbWVkaWF0ZWx5LCB3aXRoCiAgIG5vIHN5bmNpbmcgb2YgZGlza3MgYW5kIG5vIGNsZWFuIHNodXRkb3duIG9mIHVzZXJzcGFjZS4gIFNvLCB0aGV5IGFyZQpAQCAtMjM1Nyw3ICsyMzU3LDcgQEAKIAogCiAKLSAgMQgxMAgwLgguMwgzLgguICBjCGNvCG9uCG5mCGZpCGlnCGcKKyAgMTAuMy4gIGNvbmZpZwogCiAgICJjb25maWciIGFkZHMgYSBuZXcgZGV2aWNlIHRvIHRoZSB2aXJ0dWFsIG1hY2hpbmUuICBDdXJyZW50bHkgdGhlIHViZAogICBhbmQgbmV0d29yayBkcml2ZXJzIHN1cHBvcnQgdGhpcy4gIEl0IHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhlCkBAIC0yMzc4LDcgKzIzNzgsNyBAQAogCiAKIAotICAxCDEwCDAuCC40CDQuCC4gIHIIcmUIZW0IbW8Ib3YIdmUIZQorICAxMC40LiAgcmVtb3ZlCiAKICAgInJlbW92ZSIgZGVsZXRlcyBhIGRldmljZSBmcm9tIHRoZSBzeXN0ZW0uICBJdHMgYXJndW1lbnQgaXMganVzdCB0aGUKICAgbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIHJlbW92ZWQuIFRoZSBkZXZpY2UgbXVzdCBiZSBpZGxlIGluIHdoYXRldmVyCkBAIC0yMzk3LDcgKzIzOTcsNyBAQAogCiAKIAotICAxCDEwCDAuCC41CDUuCC4gIHMIc3kIeXMIc3IIcnEIcQorICAxMC41LiAgc3lzcnEKIAogICBUaGlzIHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgYSBzaW5nbGUgbGV0dGVyLiAgSXQgY2FsbHMgdGhlCiAgIGdlbmVyaWMga2VybmVsJ3MgU3lzUnEgZHJpdmVyLCB3aGljaCBkb2VzIHdoYXRldmVyIGlzIGNhbGxlZCBmb3IgYnkKQEAgLTI0MDcsMTQgKzI0MDcsMTQgQEAKIAogCiAKLSAgMQgxMAgwLgguNgg2LgguICBoCGhlCGVsCGxwCHAKKyAgMTAuNi4gIGhlbHAKIAogICAiaGVscCIgcmV0dXJucyBhIHN0cmluZyBsaXN0aW5nIHRoZSB2YWxpZCBjb21tYW5kcyBhbmQgd2hhdCBlYWNoIG9uZQogICBkb2VzLgogCiAKIAotICAxCDEwCDAuCC43CDcuCC4gIGMIY2EIYWQIZAorICAxMC43LiAgY2FkCiAKICAgVGhpcyBpbnZva2VzIHRoZSBDdGwtQWx0LURlbCBhY3Rpb24gb24gaW5pdC4gIFdoYXQgZXhhY3RseSB0aGlzIGVuZHMKICAgdXAgZG9pbmcgaXMgdXAgdG8gL2V0Yy9pbml0dGFiLiAgTm9ybWFsbHksIGl0IHJlYm9vdHMgdGhlIG1hY2hpbmUuCkBAIC0yNDMyLDcgKzI0MzIsNyBAQAogCiAKIAotICAxCDEwCDAuCC44CDguCC4gIHMIc3QIdG8Ib3AIcAorICAxMC44LiAgc3RvcAogCiAgIFRoaXMgcHV0cyB0aGUgVU1MIGluIGEgbG9vcCByZWFkaW5nIG1jb25zb2xlIHJlcXVlc3RzIHVudGlsIGEgJ2dvJwogICBtY29uc29sZSBjb21tYW5kIGlzIHJlY2VpdmVkLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBtYWtpbmcgYmFja3VwcwpAQCAtMjQ0OCw3ICsyNDQ4LDcgQEAKIAogCiAKLSAgMQgxMAgwLgguOQg5LgguICBnCGdvCG8KKyAgMTAuOS4gIGdvCiAKICAgVGhpcyByZXN1bWVzIGEgVU1MIGFmdGVyIGJlaW5nIHBhdXNlZCBieSBhICdzdG9wJyBjb21tYW5kLiBOb3RlIHRoYXQKICAgd2hlbiB0aGUgVU1MIGhhcyByZXN1bWVkLCBUQ1AgY29ubmVjdGlvbnMgbWF5IGhhdmUgdGltZWQgb3V0IGFuZCBpZgpAQCAtMjQ2MiwxMCArMjQ2MiwxMCBAQAogCiAKIAotICAxCDExCDEuCC4gIEsIS2UIZXIIcm4IbmUIZWwIbCBkCGRlCGViCGJ1CHVnCGdnCGdpCGluCG5nCGcKKyAgMTEuICBLZXJuZWwgZGVidWdnaW5nCiAKIAotICBOCE5vCG90CHRlCGU6CDogVGhlIGludGVyZmFjZSB0aGF0IG1ha2VzIGRlYnVnZ2luZywgYXMgZGVzY3JpYmVkIGhlcmUsIHBvc3NpYmxlCisgIE5vdGU6IFRoZSBpbnRlcmZhY2UgdGhhdCBtYWtlcyBkZWJ1Z2dpbmcsIGFzIGRlc2NyaWJlZCBoZXJlLCBwb3NzaWJsZQogICBpcyBwcmVzZW50IGluIDIuNC4wLXRlc3Q2IGtlcm5lbHMgYW5kIGxhdGVyLgogCiAKQEAgLTI0ODUsNyArMjQ4NSw3IEBACiAKIAogCi0gIDEIMTEIMS4ILjEIMS4ILiAgUwhTdAh0YQhhcghydAh0aQhpbghuZwhnIHQIdGgIaGUIZSBrCGtlCGVyCHJuCG5lCGVsCGwgdQh1bghuZAhkZQhlcghyIGcIZ2QIZGIIYgorICAxMS4xLiAgU3RhcnRpbmcgdGhlIGtlcm5lbCB1bmRlciBnZGIKIAogICBZb3UgY2FuIGhhdmUgdGhlIGtlcm5lbCBydW5uaW5nIHVuZGVyIHRoZSBjb250cm9sIG9mIGdkYiBmcm9tIHRoZQogICBiZWdpbm5pbmcgYnkgcHV0dGluZyAnZGVidWcnIG9uIHRoZSBjb21tYW5kIGxpbmUuICBZb3Ugd2lsbCBnZXQgYW4KQEAgLTI0OTgsNyArMjQ5OCw3IEBACiAgIFRoZXJlIGlzIGEgdHJhbnNjcmlwdCBvZiBhIGRlYnVnZ2luZyBzZXNzaW9uICBoZXJlIDxkZWJ1Zy0KICAgc2Vzc2lvbi5odG1sPiAsIHdpdGggYnJlYWtwb2ludHMgYmVpbmcgc2V0IGluIHRoZSBzY2hlZHVsZXIgYW5kIGluIGFuCiAgIGludGVycnVwdCBoYW5kbGVyLgotICAxCDExCDEuCC4yCDIuCC4gIEUIRXgIeGEIYW0IbWkIaW4IbmkIaW4IbmcIZyBzCHNsCGxlCGVlCGVwCHBpCGluCG5nCGcgcAhwcghybwhvYwhjZQhlcwhzcwhzZQhlcwhzCisgIDExLjIuICBFeGFtaW5pbmcgc2xlZXBpbmcgcHJvY2Vzc2VzCiAKICAgTm90IGV2ZXJ5IGJ1ZyBpcyBldmlkZW50IGluIHRoZSBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLiAgU29tZXRpbWVzLAogICBwcm9jZXNzZXMgaGFuZyBpbiB0aGUga2VybmVsIHdoZW4gdGhleSBzaG91bGRuJ3QgYmVjYXVzZSB0aGV5J3ZlCkBAIC0yNTE2LDcgKzI1MTYsNyBAQAogCiAgIE5vdyB3aGF0IHlvdSBkbyBpcyB0aGlzOgogCi0gICsIbyAgZGV0YWNoIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkCisgIG8gIGRldGFjaCBmcm9tIHRoZSBjdXJyZW50IHRocmVhZAogCiAKICAgICAgICAoVU1MIGdkYikgIGRldApAQCAtMjUyNSw3ICsyNTI1LDcgQEAKIAogCiAKLSAgKwhvICBhdHRhY2ggdG8gdGhlIHRocmVhZCB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyAgbyAgYXR0YWNoIHRvIHRoZSB0aHJlYWQgeW91IGFyZSBpbnRlcmVzdGVkIGluCiAKIAogICAgICAgIChVTUwgZ2RiKSAgYXR0IDxob3N0IHBpZD4KQEAgLTI1MzQsNyArMjUzNCw3IEBACiAKIAogCi0gICsIbyAgbG9vayBhdCBpdHMgc3RhY2sgYW5kIGFueXRoaW5nIGVsc2Ugb2YgaW50ZXJlc3QKKyAgbyAgbG9vayBhdCBpdHMgc3RhY2sgYW5kIGFueXRoaW5nIGVsc2Ugb2YgaW50ZXJlc3QKIAogCiAgICAgICAgKFVNTCBnZGIpICBidApAQCAtMjU0NSw3ICsyNTQ1LDcgQEAKICAgTm90ZSB0aGF0IHlvdSBjYW4ndCBkbyBhbnl0aGluZyBhdCB0aGlzIHBvaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhCiAgIHByb2Nlc3MgZXhlY3V0ZSwgZS5nLiBjYWxsaW5nIGEgZnVuY3Rpb24KIAotICArCG8gIHdoZW4geW91J3JlIGRvbmUgbG9va2luZyBhdCB0aGF0IHByb2Nlc3MsIHJlYXR0YWNoIHRvIHRoZSBjdXJyZW50CisgIG8gIHdoZW4geW91J3JlIGRvbmUgbG9va2luZyBhdCB0aGF0IHByb2Nlc3MsIHJlYXR0YWNoIHRvIHRoZSBjdXJyZW50CiAgICAgIHRocmVhZCBhbmQgY29udGludWUgaXQKIAogCkBAIC0yNTY5LDEyICsyNTY5LDEyIEBACiAKIAogCi0gIDEIMTEIMS4ILjMIMy4ILiAgUghSdQh1bghubghuaQhpbghuZwhnIGQIZGQIZGQIZCBvCG9uCG4gVQhVTQhNTAhMCisgIDExLjMuICBSdW5uaW5nIGRkZCBvbiBVTUwKIAogICBkZGQgd29ya3Mgb24gVU1MLCBidXQgcmVxdWlyZXMgYSBzcGVjaWFsIGtsdWRnZS4gIFRoZSBwcm9jZXNzIGdvZXMKICAgbGlrZSB0aGlzOgogCi0gICsIbyAgU3RhcnQgZGRkCisgIG8gIFN0YXJ0IGRkZAogCiAKICAgICAgICBob3N0JSBkZGQgbGludXgKQEAgLTI1ODMsMTQgKzI1ODMsMTQgQEAKIAogCiAKLSAgKwhvICBXaXRoIHBzLCBnZXQgdGhlIHBpZCBvZiB0aGUgZ2RiIHRoYXQgZGRkIHN0YXJ0ZWQuICBZb3UgY2FuIGFzayB0aGUKKyAgbyAgV2l0aCBwcywgZ2V0IHRoZSBwaWQgb2YgdGhlIGdkYiB0aGF0IGRkZCBzdGFydGVkLiAgWW91IGNhbiBhc2sgdGhlCiAgICAgIGdkYiB0byB0ZWxsIHlvdSwgYnV0IGZvciBzb21lIHJlYXNvbiB0aGF0IGNvbmZ1c2VzIHRoaW5ncyBhbmQKICAgICAgY2F1c2VzIGEgaGFuZy4KIAotICArCG8gIHJ1biBVTUwgd2l0aCAnZGVidWc9cGFyZW50IGdkYi1waWQ9PHBpZD4nIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUKKyAgbyAgcnVuIFVNTCB3aXRoICdkZWJ1Zz1wYXJlbnQgZ2RiLXBpZD08cGlkPicgYWRkZWQgdG8gdGhlIGNvbW1hbmQgbGluZQogICAgICAtIGl0IHdpbGwganVzdCBzaXQgdGhlcmUgYWZ0ZXIgeW91IGhpdCByZXR1cm4KIAotICArCG8gIHR5cGUgJ2F0dCAxJyB0byB0aGUgZGRkIGdkYiBhbmQgeW91IHdpbGwgc2VlIHNvbWV0aGluZyBsaWtlCisgIG8gIHR5cGUgJ2F0dCAxJyB0byB0aGUgZGRkIGdkYiBhbmQgeW91IHdpbGwgc2VlIHNvbWV0aGluZyBsaWtlCiAKIAogICAgICAgIDB4YTAxM2RjNTEgaW4gX19raWxsICgpCkBAIC0yNjAyLDEyICsyNjAyLDEyIEBACiAKIAogCi0gICsIbyAgQXQgdGhpcyBwb2ludCwgdHlwZSAnYycsIFVNTCB3aWxsIGJvb3QgdXAsIGFuZCB5b3UgY2FuIHVzZSBkZGQganVzdAorICBvICBBdCB0aGlzIHBvaW50LCB0eXBlICdjJywgVU1MIHdpbGwgYm9vdCB1cCwgYW5kIHlvdSBjYW4gdXNlIGRkZCBqdXN0CiAgICAgIGFzIHlvdSBkbyBvbiBhbnkgb3RoZXIgcHJvY2Vzcy4KIAogCiAKLSAgMQgxMQgxLgguNAg0LgguICBECERlCGViCGJ1CHVnCGdnCGdpCGluCG5nCGcgbQhtbwhvZAhkdQh1bAhsZQhlcwhzCisgIDExLjQuICBEZWJ1Z2dpbmcgbW9kdWxlcwogCiAgIGdkYiBoYXMgc3VwcG9ydCBmb3IgZGVidWdnaW5nIGNvZGUgd2hpY2ggaXMgZHluYW1pY2FsbHkgbG9hZGVkIGludG8KICAgdGhlIHByb2Nlc3MuICBUaGlzIHN1cHBvcnQgaXMgd2hhdCBpcyBuZWVkZWQgdG8gZGVidWcga2VybmVsIG1vZHVsZXMKQEAgLTI4MjMsNyArMjgyMyw3IEBACiAKIAogCi0gIDEIMTEIMS4ILjUINS4ILiAgQQhBdAh0dAh0YQhhYwhjaAhoaQhpbghuZwhnIGcIZ2QIZGIIYiB0CHRvCG8gdAh0aAhoZQhlIGsIa2UIZXIIcm4IbmUIZWwIbAorICAxMS41LiAgQXR0YWNoaW5nIGdkYiB0byB0aGUga2VybmVsCiAKICAgSWYgeW91IGRvbid0IGhhdmUgdGhlIGtlcm5lbCBydW5uaW5nIHVuZGVyIGdkYiwgeW91IGNhbiBhdHRhY2ggZ2RiIHRvCiAgIGl0IGxhdGVyIGJ5IHNlbmRpbmcgdGhlIHRyYWNpbmcgdGhyZWFkIGEgU0lHVVNSMS4gIFRoZSBmaXJzdCBsaW5lIG9mCkBAIC0yODU3LDcgKzI4NTcsNyBAQAogCiAKIAotICAxCDExCDEuCC42CDYuCC4gIFUIVXMIc2kIaW4IbmcIZyBhCGFsCGx0CHRlCGVyCHJuCG5hCGF0CHRlCGUgZAhkZQhlYghidQh1ZwhnZwhnZQhlcghycwhzCisgIDExLjYuICBVc2luZyBhbHRlcm5hdGUgZGVidWdnZXJzCiAKICAgVU1MIGhhcyBzdXBwb3J0IGZvciBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeSBydW5uaW5nIGRlYnVnZ2VyIHJhdGhlcgogICB0aGFuIHN0YXJ0aW5nIGdkYiBpdHNlbGYuICBUaGlzIGlzIHByZXNlbnQgaW4gQ1ZTIGFzIG9mIDE3IEFwciAyMDAxLgpAQCAtMjg4Niw3ICsyODg2LDcgQEAKICAgQW4gZXhhbXBsZSBvZiBhbiBhbHRlcm5hdGUgZGVidWdnZXIgaXMgc3RyYWNlLiAgWW91IGNhbiBzdHJhY2UgdGhlCiAgIGFjdHVhbCBrZXJuZWwgYXMgZm9sbG93czoKIAotICArCG8gIFJ1biB0aGUgZm9sbG93aW5nIGluIGEgc2hlbGwKKyAgbyAgUnVuIHRoZSBmb2xsb3dpbmcgaW4gYSBzaGVsbAogCiAKICAgICAgICBob3N0JQpAQCAtMjg5NCwxMCArMjg5NCwxMCBAQAogCiAKIAotICArCG8gIFJ1biBVTUwgd2l0aCAnZGVidWcnIGFuZCAnZ2RiLXBpZD08cGlkPicgd2l0aCB0aGUgcGlkIHByaW50ZWQgb3V0CisgIG8gIFJ1biBVTUwgd2l0aCAnZGVidWcnIGFuZCAnZ2RiLXBpZD08cGlkPicgd2l0aCB0aGUgcGlkIHByaW50ZWQgb3V0CiAgICAgIGJ5IHRoZSBwcmV2aW91cyBjb21tYW5kCiAKLSAgKwhvICBIaXQgcmV0dXJuIGluIHRoZSBzaGVsbCwgYW5kIFVNTCB3aWxsIHN0YXJ0IHJ1bm5pbmcsIGFuZCBzdHJhY2UKKyAgbyAgSGl0IHJldHVybiBpbiB0aGUgc2hlbGwsIGFuZCBVTUwgd2lsbCBzdGFydCBydW5uaW5nLCBhbmQgc3RyYWNlCiAgICAgIG91dHB1dCB3aWxsIHN0YXJ0IGFjY3VtdWxhdGluZyBpbiB0aGUgb3V0cHV0IGZpbGUuCiAKICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gcnVubmluZwpAQCAtMjkxNyw5ICsyOTE3LDkgQEAKIAogCiAKLSAgMQgxMggyLgguICBLCEtlCGVyCHJuCG5lCGVsCGwgZAhkZQhlYghidQh1ZwhnZwhnaQhpbghuZwhnIGUIZXgIeGEIYW0IbXAIcGwIbGUIZXMIcworICAxMi4gIEtlcm5lbCBkZWJ1Z2dpbmcgZXhhbXBsZXMKIAotICAxCDEyCDIuCC4xCDEuCC4gIFQIVGgIaGUIZSBjCGNhCGFzCHNlCGUgbwhvZghmIHQIdGgIaGUIZSBoCGh1CHVuCG5nCGcgZghmcwhzYwhjawhrCisgIDEyLjEuICBUaGUgY2FzZSBvZiB0aGUgaHVuZyBmc2NrCiAKICAgV2hlbiBib290aW5nIHVwIHRoZSBrZXJuZWwsIGZzY2sgZmFpbGVkLCBhbmQgZHJvcHBlZCBtZSBpbnRvIGEgc2hlbGwKICAgdG8gZml4IHRoaW5ncyB1cC4gIEkgcmFuIGZzY2sgLXksIHdoaWNoIGh1bmc6CkBAIC0zMTU0LDkgKzMxNTQsOSBAQAogCiAgIFRoZSBpbnRlcmVzdGluZyB0aGluZ3MgaGVyZSBhcmUgOgogCi0gICsIbyAgVGhlcmUgYXJlIHR3byBzZWdmYXVsdHMgb24gdGhpcyBzdGFjayAoZnJhbWVzIDkgYW5kIDE0KQorICBvICBUaGVyZSBhcmUgdHdvIHNlZ2ZhdWx0cyBvbiB0aGlzIHN0YWNrIChmcmFtZXMgOSBhbmQgMTQpCiAKLSAgKwhvICBUaGUgZmlyc3QgZmF1bHRpbmcgYWRkcmVzcyAoZnJhbWUgMTEpIGlzIDB4NTAwMDA4MDAKKyAgbyAgVGhlIGZpcnN0IGZhdWx0aW5nIGFkZHJlc3MgKGZyYW1lIDExKSBpcyAweDUwMDAwODAwCiAKICAgKGdkYikgcCAodm9pZCAqKTEzNDIxNzkzMjgKICAgJDE2ID0gKHZvaWQgKikgMHg1MDAwMDgwMApAQCAtMzM5OSw3ICszMzk5LDcgQEAKICAgb24gd2lsbCBiZSBzb21ld2hhdCBjbGVhcmVyLgogCiAKLSAgMQgxMggyLgguMggyLgguICBFCEVwCHBpCGlzCHNvCG9kCGRlCGUgMggyOgg6IFQIVGgIaGUIZSBjCGNhCGFzCHNlCGUgbwhvZghmIHQIdGgIaGUIZSBoCGh1CHVuCG5nCGcgZghmcwhzYwhjawhrCisgIDEyLjIuICBFcGlzb2RlIDI6IFRoZSBjYXNlIG9mIHRoZSBodW5nIGZzY2sKIAogICBBZnRlciBzZXR0aW5nIGEgdHJhcCBpbiB0aGUgU0VHViBoYW5kbGVyIGZvciBhY2Nlc3NlcyB0byB0aGUgc2lnbmFsCiAgIHRocmVhZCdzIHN0YWNrLCBJIHJlcmFuIHRoZSBrZXJuZWwuCkBAIC0zNzg4LDEyICszNzg4LDEyIEBACiAKIAogCi0gIDEIMTMIMy4ILiAgVwhXaAhoYQhhdAh0IHQIdG8IbyBkCGRvCG8gdwh3aAhoZQhlbghuIFUIVU0ITUwITCBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrCisgIDEzLiAgV2hhdCB0byBkbyB3aGVuIFVNTCBkb2Vzbid0IHdvcmsKIAogCiAKIAotICAxCDEzCDMuCC4xCDEuCC4gIFMIU3QIdHIIcmEIYW4IbmcIZ2UIZSBjCGNvCG9tCG1wCHBpCGlsCGxhCGF0CHRpCGlvCG9uCG4gZQhlcghycghybwhvcghycwhzIHcId2gIaGUIZW4IbiB5CHlvCG91CHUgYghidQh1aQhpbAhsZAhkIGYIZnIIcm8Ib20IbSBzCHNvCG91CHVyCHJjCGNlCGUKKyAgMTMuMS4gIFN0cmFuZ2UgY29tcGlsYXRpb24gZXJyb3JzIHdoZW4geW91IGJ1aWxkIGZyb20gc291cmNlCiAKICAgQXMgb2YgdGVzdDExLCBpdCBpcyBuZWNlc3NhcnkgdG8gaGF2ZSAiQVJDSD11bSIgaW4gdGhlIGVudmlyb25tZW50IG9yCiAgIG9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZSBmb3IgYWxsIHN0ZXBzIGluIGJ1aWxkaW5nIFVNTCwgaW5jbHVkaW5nCkBAIC0zODI0LDggKzM4MjQsOCBAQAogCiAKIAotICAxCDEzCDMuCC4zCDMuCC4gIEEIQSB2CHZhCGFyCHJpCGllCGV0CHR5CHkgbwhvZghmIHAIcGEIYW4IbmkIaWMIY3MIcyBhCGFuCG5kCGQgaAhoYQhhbghuZwhncwhzIHcId2kIaXQIdGgIaCAvCC90CHRtCG1wCHAgbwhvbghuIGEIYSByCHJlCGVpCGlzCHNlCGVyCHJmCGZzCHMgIGYIZmkIaWwIbGUIZXMIc3kIeXMIcy0ILQotICB0CHRlCGVtCG0KKyAgMTMuMy4gIEEgdmFyaWV0eSBvZiBwYW5pY3MgYW5kIGhhbmdzIHdpdGggL3RtcCBvbiBhIHJlaXNlcmZzICBmaWxlc3lzLQorICB0ZW0KIAogICBJIHNhdyB0aGlzIG9uIHJlaXNlcmZzIDMuNS4yMSBhbmQgaXQgc2VlbXMgdG8gYmUgZml4ZWQgaW4gMy41LjI3LgogICBQYW5pY3MgcHJlY2VkZWQgYnkKQEAgLTM4NDIsOCArMzg0Miw4IEBACiAKIAogCi0gIDEIMTMIMy4ILjQINC4ILiAgVAhUaAhoZQhlIGMIY28Ib20IbXAIcGkIaWwIbGUIZSBmCGZhCGFpCGlsCGxzCHMgdwh3aQhpdAh0aAhoIGUIZXIIcnIIcm8Ib3IIcnMIcyBhCGFiCGJvCG91CHV0CHQgYwhjbwhvbghuZghmbAhsaQhpYwhjdAh0aQhpbghuZwhnIHQIdHkIeXAIcGUIZXMIcyBmCGZvCG9yCHIKLSAgJwgnbwhvcAhwZQhlbghuJwgnLAgsICcIJ2QIZHUIdXAIcCcIJywILCBhCGFuCG5kCGQgJwgndwh3YQhhaQhpdAh0cAhwaQhpZAhkJwgnCisgIDEzLjQuICBUaGUgY29tcGlsZSBmYWlscyB3aXRoIGVycm9ycyBhYm91dCBjb25mbGljdGluZyB0eXBlcyBmb3IKKyAgJ29wZW4nLCAnZHVwJywgYW5kICd3YWl0cGlkJwogCiAgIFRoaXMgaGFwcGVucyB3aGVuIHlvdSBidWlsZCBpbiAvdXNyL3NyYy9saW51eC4gIFRoZSBVTUwgYnVpbGQgbWFrZXMKICAgdGhlIGluY2x1ZGUvYXNtIGxpbmsgcG9pbnQgdG8gaW5jbHVkZS9hc20tdW0uICAvdXNyL2luY2x1ZGUvYXNtIHBvaW50cwpAQCAtMzg1NCwxNCArMzg1NCwxNCBAQAogCiAKIAotICAxCDEzCDMuCC41CDUuCC4gIFUIVU0ITUwITCBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrIHcId2gIaGUIZW4IbiAvCC90CHRtCG1wCHAgaQhpcwhzIGEIYW4IbiBOCE5GCEZTCFMgZghmaQhpbAhsZQhlcwhzeQh5cwhzdAh0ZQhlbQhtCisgIDEzLjUuICBVTUwgZG9lc24ndCB3b3JrIHdoZW4gL3RtcCBpcyBhbiBORlMgZmlsZXN5c3RlbQogCiAgIFRoaXMgc2VlbXMgdG8gYmUgYSBzaW1pbGFyIHNpdHVhdGlvbiB3aXRoIHRoZSBSZWlzZXJGUyBwcm9ibGVtIGFib3ZlLgogICBTb21lIHZlcnNpb25zIG9mIE5GUyBzZWVtcyBub3QgdG8gaGFuZGxlIG1tYXAgY29ycmVjdGx5LCB3aGljaCBVTUwKICAgZGVwZW5kcyBvbi4gIFRoZSB3b3JrYXJvdW5kIGlzIGhhdmUgL3RtcCBiZSBhIG5vbi1ORlMgZGlyZWN0b3J5LgogCiAKLSAgMQgxMwgzLgguNgg2LgguICBVCFVNCE1MCEwgaAhoYQhhbghuZwhncwhzIG8Ib24IbiBiCGJvCG9vCG90CHQgdwh3aAhoZQhlbghuIGMIY28Ib20IbXAIcGkIaWwIbGUIZWQIZCB3CHdpCGl0CHRoCGggZwhncAhwcghybwhvZghmIHMIc3UIdXAIcHAIcG8Ib3IIcnQIdAorICAxMy42LiAgVU1MIGhhbmdzIG9uIGJvb3Qgd2hlbiBjb21waWxlZCB3aXRoIGdwcm9mIHN1cHBvcnQKIAogICBJZiB5b3UgYnVpbGQgVU1MIHdpdGggZ3Byb2Ygc3VwcG9ydCBhbmQsIGVhcmx5IGluIHRoZSBib290LCBpdCBkb2VzCiAgIHRoaXMKQEAgLTM4NzgsNyArMzg3OCw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjcINy4ILiAgcwhzeQh5cwhzbAhsbwhvZwhnZAhkIGQIZGkIaWUIZXMIcyB3CHdpCGl0CHRoCGggYQhhIFMIU0kISUcIR1QIVEUIRVIIUk0ITSBvCG9uCG4gcwhzdAh0YQhhcghydAh0dQh1cAhwCisgIDEzLjcuICBzeXNsb2dkIGRpZXMgd2l0aCBhIFNJR1RFUk0gb24gc3RhcnR1cAogCiAgIFRoZSBleGFjdCBib290IGVycm9yIGRlcGVuZHMgb24gdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IHlvdSdyZSBib290aW5nLAogICBidXQgRGViaWFuIHByb2R1Y2VzIHRoaXM6CkBAIC0zODk3LDE3ICszODk3LDE3IEBACiAKIAogCi0gIDEIMTMIMy4ILjgIOC4ILiAgVAhUVQhVTghOLwgvVAhUQQhBUAhQIG4IbmUIZXQIdHcId28Ib3IIcmsIa2kIaW4IbmcIZyBkCGRvCG9lCGVzCHNuCG4nCCd0CHQgdwh3bwhvcghyawhrIG8Ib24IbiBhCGEgMggyLgguNAg0IGgIaG8Ib3MIc3QIdAorICAxMy44LiAgVFVOL1RBUCBuZXR3b3JraW5nIGRvZXNuJ3Qgd29yayBvbiBhIDIuNCBob3N0CiAKICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHByb2JsZW1zIHdoaWNoIHdlcmUKICAgPGh0dHA6Ly93d3cuZ2VvY3Jhd2xlci5jb20vbGlzdHMvMy9Tb3VyY2VGb3JnZS81OTcvMC8+IG5hbWU9InBvaW50ZWQKICAgb3V0Ij4gIGJ5IFRpbSBSb2JpbnNvbiA8dGltcm8gYXQgdHJrciBkb3QgbmV0PgogCi0gICsIbyAgSXQgZG9lc24ndCB3b3JrIG9uIGhvc3RzIHJ1bm5pbmcgMi40LjcgKG9yIHRoZXJlYWJvdXRzKSBvciBlYXJsaWVyLgorICBvICBJdCBkb2Vzbid0IHdvcmsgb24gaG9zdHMgcnVubmluZyAyLjQuNyAob3IgdGhlcmVhYm91dHMpIG9yIGVhcmxpZXIuCiAgICAgIFRoZSBmaXggaXMgdG8gdXBncmFkZSB0byBzb21ldGhpbmcgbW9yZSByZWNlbnQgYW5kIHRoZW4gcmVhZCB0aGUKICAgICAgbmV4dCBpdGVtLgogCi0gICsIbyAgSWYgeW91IHNlZQorICBvICBJZiB5b3Ugc2VlCiAKIAogICAgICAgIEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUKQEAgLTM5MjEsOCArMzkyMSw4IEBACiAKIAogCi0gIDEIMTMIMy4ILjkIOS4ILiAgWQhZbwhvdQh1IGMIY2EIYW4IbiBuCG5lCGV0CHR3CHdvCG9yCHJrCGsgdAh0bwhvIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQgYghidQh1dAh0IG4Ibm8Ib3QIdCB0CHRvCG8gbwhvdAh0aAhoZQhlcghyIG0IbWEIYWMIY2gIaGkIaW4IbmUIZXMIcyBvCG9uCG4gdAh0aAhoZQhlCi0gIG4IbmUIZXQIdAorICAxMy45LiAgWW91IGNhbiBuZXR3b3JrIHRvIHRoZSBob3N0IGJ1dCBub3QgdG8gb3RoZXIgbWFjaGluZXMgb24gdGhlCisgIG5ldAogCiAgIElmIHlvdSBjYW4gY29ubmVjdCB0byB0aGUgaG9zdCwgYW5kIHRoZSBob3N0IGNhbiBjb25uZWN0IHRvIFVNTCwgYnV0CiAgIHlvdSBjYW5ub3QgY29ubmVjdCB0byBhbnkgb3RoZXIgbWFjaGluZXMsIHRoZW4geW91IG1heSBuZWVkIHRvIGVuYWJsZQpAQCAtMzk3Miw3ICszOTcyLDcgQEAKIAogCiAKLSAgMQgxMwgzLgguMQgxMAgwLgguICBJCEkgaAhoYQhhdgh2ZQhlIG4Ibm8IbyByCHJvCG9vCG90CHQgYQhhbghuZAhkIEkISSB3CHdhCGFuCG50CHQgdAh0bwhvIHMIc2MIY3IIcmUIZWEIYW0IbQorICAxMy4xMC4gIEkgaGF2ZSBubyByb290IGFuZCBJIHdhbnQgdG8gc2NyZWFtCiAKICAgVGhhbmtzIHRvIEJpcmdpdCBXYWhsaWNoIGZvciB0ZWxsaW5nIG1lIGFib3V0IHRoaXMgc3RyYW5nZSBvbmUuICBJdAogICB0dXJucyBvdXQgdGhhdCB0aGVyZSdzIGEgbGltaXQgb2Ygc2l4IGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiB0aGUKQEAgLTM5ODcsNyArMzk4Nyw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjEIMTEIMS4ILiAgVQhVTQhNTAhMIGIIYnUIdWkIaWwIbGQIZCBjCGNvCG9uCG5mCGZsCGxpCGljCGN0CHQgYghiZQhldAh0dwh3ZQhlZQhlbghuIHAIcHQIdHIIcmEIYWMIY2UIZS4ILmgIaCBhCGFuCG5kCGQgdQh1YwhjbwhvbghudAh0ZQhleAh4dAh0LgguaAhoCisgIDEzLjExLiAgVU1MIGJ1aWxkIGNvbmZsaWN0IGJldHdlZW4gcHRyYWNlLmggYW5kIHVjb250ZXh0LmgKIAogICBPbiBzb21lIG9sZGVyIHN5c3RlbXMsIC91c3IvaW5jbHVkZS9hc20vcHRyYWNlLmggYW5kCiAgIC91c3IvaW5jbHVkZS9zeXMvdWNvbnRleHQuaCBkZWZpbmUgdGhlIHNhbWUgbmFtZXMuICBTbywgd2hlbiB0aGV5J3JlCkBAIC00MDA3LDcgKzQwMDcsNyBAQAogCiAKIAotICAxCDEzCDMuCC4xCDEyCDIuCC4gIFQIVGgIaGUIZSBVCFVNCE1MCEwgQghCbwhvZwhnbwhvTQhNaQhpcAhwcwhzIGkIaXMIcyBlCGV4CHhhCGFjCGN0CHRsCGx5CHkgaAhoYQhhbAhsZghmIHQIdGgIaGUIZSBoCGhvCG9zCHN0CHQnCCdzCHMgQghCbwhvZwhnbwhvTQhNaQhpcAhwcwhzCisgIDEzLjEyLiAgVGhlIFVNTCBCb2dvTWlwcyBpcyBleGFjdGx5IGhhbGYgdGhlIGhvc3QncyBCb2dvTWlwcwogCiAgIE9uIGkzODYga2VybmVscywgdGhlcmUgYXJlIHR3byB3YXlzIG9mIHJ1bm5pbmcgdGhlIGxvb3AgdGhhdCBpcyB1c2VkCiAgIHRvIGNhbGN1bGF0ZSB0aGUgQm9nb01pcHMgcmF0aW5nLCB1c2luZyB0aGUgVFNDIGlmIGl0J3MgdGhlcmUgb3IgdXNpbmcKQEAgLTQwMTksNyArNDAxOSw3IEBACiAKIAogCi0gIDEIMTMIMy4ILjEIMTMIMy4ILiAgVwhXaAhoZQhlbghuIHkIeW8Ib3UIdSByCHJ1CHVuCG4gVQhVTQhNTAhMLAgsIGkIaXQIdCBpCGltCG1tCG1lCGVkCGRpCGlhCGF0CHRlCGVsCGx5CHkgcwhzZQhlZwhnZghmYQhhdQh1bAhsdAh0cwhzCisgIDEzLjEzLiAgV2hlbiB5b3UgcnVuIFVNTCwgaXQgaW1tZWRpYXRlbHkgc2VnZmF1bHRzCiAKICAgSWYgdGhlIGhvc3QgaXMgY29uZmlndXJlZCB3aXRoIHRoZSAyRy8yRyBhZGRyZXNzIHNwYWNlIHNwbGl0LCB0aGF0J3MKICAgd2h5LiAgU2VlIGBgVU1MIG9uIDJHLzJHIGhvc3RzJycgIGZvciB0aGUgZGV0YWlscyBvbiBnZXR0aW5nIFVNTCB0bwpAQCAtNDAyNyw3ICs0MDI3LDcgQEAKIAogCiAKLSAgMQgxMwgzLgguMQgxNAg0LgguICB4CHh0CHRlCGVyCHJtCG1zCHMgYQhhcAhwcAhwZQhlYQhhcghyLAgsIHQIdGgIaGUIZW4IbiBpCGltCG1tCG1lCGVkCGRpCGlhCGF0CHRlCGVsCGx5CHkgZAhkaQhpcwhzYQhhcAhwcAhwZQhlYQhhcghyCisgIDEzLjE0LiAgeHRlcm1zIGFwcGVhciwgdGhlbiBpbW1lZGlhdGVseSBkaXNhcHBlYXIKIAogICBJZiB5b3UncmUgcnVubmluZyBhbiB1cCB0byBkYXRlIGtlcm5lbCB3aXRoIGFuIG9sZCByZWxlYXNlIG9mCiAgIHVtbF91dGlsaXRpZXMsIHRoZSBwb3J0LWhlbHBlciBwcm9ncmFtIHdpbGwgbm90IHdvcmsgcHJvcGVybHksIHNvCkBAIC00MDM5LDcgKzQwMzksNyBAQAogCiAKIAotICAxCDEzCDMuCC4xCDE1CDUuCC4gIEEIQW4IbnkIeSBvCG90CHRoCGhlCGVyCHIgcAhwYQhhbghuaQhpYwhjLAgsIGgIaGEIYW4IbmcIZywILCBvCG9yCHIgcwhzdAh0cghyYQhhbghuZwhnZQhlIGIIYmUIZWgIaGEIYXYIdmkIaW8Ib3IIcgorICAxMy4xNS4gIEFueSBvdGhlciBwYW5pYywgaGFuZywgb3Igc3RyYW5nZSBiZWhhdmlvcgogCiAgIElmIHlvdSdyZSBzZWVpbmcgdHJ1bHkgc3RyYW5nZSBiZWhhdmlvciwgc3VjaCBhcyBoYW5ncyBvciBwYW5pY3MgdGhhdAogICBoYXBwZW4gaW4gcmFuZG9tIHBsYWNlcywgb3IgeW91IHRyeSBydW5uaW5nIHRoZSBkZWJ1Z2dlciB0byBzZWUgd2hhdCdzCkBAIC00MDU5LDcgKzQwNTksNyBAQAogCiAgIElmIHlvdSB3YW50IHRvIGJlIHN1cGVyLWhlbHBmdWwsIHJlYWQgYGBEaWFnbm9zaW5nIFByb2JsZW1zJycgYW5kCiAgIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGNvbnRhaW5lZCB0aGVyZWluLgotICAxCDE0CDQuCC4gIEQIRGkIaWEIYWcIZ24Ibm8Ib3MIc2kIaW4IbmcIZyBQCFByCHJvCG9iCGJsCGxlCGVtCG1zCHMKKyAgMTQuICBEaWFnbm9zaW5nIFByb2JsZW1zCiAKIAogICBJZiB5b3UgZ2V0IFVNTCB0byBjcmFzaCwgaGFuZywgb3Igb3RoZXJ3aXNlIG1pc2JlaGF2ZSwgeW91IHNob3VsZApAQCAtNDA3OCw3ICs0MDc4LDcgQEAKICAgYGBLZXJuZWwgZGVidWdnaW5nJycgIFVNTCBmaXJzdC4KIAogCi0gIDEIMTQINC4ILjEIMS4ILiAgQwhDYQhhcwhzZQhlIDEIMSA6CDogTghObwhvcghybQhtYQhhbAhsIGsIa2UIZXIIcm4IbmUIZWwIbCBwCHBhCGFuCG5pCGljCGNzCHMKKyAgMTQuMS4gIENhc2UgMSA6IE5vcm1hbCBrZXJuZWwgcGFuaWNzCiAKICAgVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgZm9yIGEgbm9ybWFsIHRocmVhZCB0byBwYW5pYy4gIFRvIGRlYnVnIHRoaXMsCiAgIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGl0IHVuZGVyIHRoZSBkZWJ1Z2dlciAoYWRkICdkZWJ1ZycgdG8gdGhlIGNvbW1hbmQKQEAgLTQxMjgsNyArNDEyOCw3IEBACiAgIHRvIGdldCB0aGF0IGluZm9ybWF0aW9uIGZyb20gdGhlIGZhdWx0aW5nIGlwLgogCiAKLSAgMQgxNAg0LgguMggyLgguICBDCENhCGFzCHNlCGUgMggyIDoIOiBUCFRyCHJhCGFjCGNpCGluCG5nCGcgdAh0aAhocghyZQhlYQhhZAhkIHAIcGEIYW4IbmkIaWMIY3MIcworICAxNC4yLiAgQ2FzZSAyIDogVHJhY2luZyB0aHJlYWQgcGFuaWNzCiAKICAgVGhlIGxlc3MgY29tbW9uIGFuZCBtb3JlIHBhaW5mdWwgY2FzZSBpcyB3aGVuIHRoZSB0cmFjaW5nIHRocmVhZAogICBwYW5pY3MuICBJbiB0aGlzIGNhc2UsIHRoZSBrZXJuZWwgZGVidWdnZXIgd2lsbCBiZSB1c2VsZXNzIGJlY2F1c2UgaXQKQEAgLTQxNjEsNyArNDE2MSw3IEBACiAgIGJhY2t0cmFjZSBpbiBhbmQgd2FpdCBmb3Igb3VyIGNyYWNrIGRlYnVnZ2luZyB0ZWFtIHRvIGZpeCB0aGUgcHJvYmxlbS4KIAogCi0gIDEIMTQINC4ILjMIMy4ILiAgQwhDYQhhcwhzZQhlIDMIMyA6CDogVAhUcghyYQhhYwhjaQhpbghuZwhnIHQIdGgIaHIIcmUIZWEIYWQIZCBwCHBhCGFuCG5pCGljCGNzCHMgYwhjYQhhdQh1cwhzZQhlZAhkIGIIYnkIeSBvCG90CHRoCGhlCGVyCHIgdAh0aAhocghyZQhlYQhhZAhkcwhzCisgIDE0LjMuICBDYXNlIDMgOiBUcmFjaW5nIHRocmVhZCBwYW5pY3MgY2F1c2VkIGJ5IG90aGVyIHRocmVhZHMKIAogICBIb3dldmVyLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIG1pc2JlaGF2aW9yIG9mIGFub3RoZXIgdGhyZWFkCiAgIGNhdXNlZCB0aGUgcHJvYmxlbS4gIFRoZSBtb3N0IGNvbW1vbiBwYW5pYyBvZiB0aGlzIHR5cGUgaXM6CkBAIC00MjI3LDcgKzQyMjcsNyBAQAogCiAKIAotICAxCDE0CDQuCC40CDQuCC4gIEMIQ2EIYXMIc2UIZSA0CDQgOgg6IEgISGEIYW4IbmcIZ3MIcworICAxNC40LiAgQ2FzZSA0IDogSGFuZ3MKIAogICBIYW5ncyBzZWVtIHRvIGJlIGZhaXJseSByYXJlLCBidXQgdGhleSBzb21ldGltZXMgaGFwcGVuLiAgV2hlbiBhIGhhbmcKICAgaGFwcGVucywgd2UgbmVlZCBhIGJhY2t0cmFjZSBmcm9tIHRoZSBvZmZlbmRpbmcgcHJvY2Vzcy4gIFJ1biB0aGUKQEAgLTQyNTcsNyArNDI1Nyw3IEBACiAKIAogCi0gIDEIMTUINS4ILiAgVAhUaAhoYQhhbghuawhrcwhzCisgIDE1LiAgVGhhbmtzCiAKIAogICBBIG51bWJlciBvZiBwZW9wbGUgaGF2ZSBoZWxwZWQgdGhpcyBwcm9qZWN0IGluIHZhcmlvdXMgd2F5cywgYW5kIHRoaXMKQEAgLTQyNzQsMjAgKzQyNzQsMjAgQEAKICAgYm9va2tlZXBpbmcgbGFwc2VzIGFuZCBJIGZvcmdldCBhYm91dCBjb250cmlidXRpb25zLgogCiAKLSAgMQgxNQg1LgguMQgxLgguICBDCENvCG9kCGRlCGUgYQhhbghuZAhkIEQIRG8Ib2MIY3UIdW0IbWUIZW4IbnQIdGEIYXQIdGkIaW8Ib24IbgorICAxNS4xLiAgQ29kZSBhbmQgRG9jdW1lbnRhdGlvbgogCiAgIFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5IGF0IGxpbnV4Y2FyZS5jb20uYXU+ICAtCiAKLSAgKwhvICB3cm90ZSB0aGUgIEhPV1RPIDxodHRwOi8vdXNlci1tb2RlLQorICBvICB3cm90ZSB0aGUgIEhPV1RPIDxodHRwOi8vdXNlci1tb2RlLQogICAgICBsaW51eC5zb3VyY2Vmb3JnZS5uZXQvVXNlck1vZGVMaW51eC1IT1dUTy5odG1sPgogCi0gICsIbyAgcHJvZGRlZCBtZSBpbnRvIG1ha2luZyB0aGlzIHByb2plY3Qgb2ZmaWNpYWwgYW5kIHB1dHRpbmcgaXQgb24KKyAgbyAgcHJvZGRlZCBtZSBpbnRvIG1ha2luZyB0aGlzIHByb2plY3Qgb2ZmaWNpYWwgYW5kIHB1dHRpbmcgaXQgb24KICAgICAgU291cmNlRm9yZ2UKIAotICArCG8gIGNhbWUgdXAgd2l0aCB0aGUgd2F5IGNvb2wgVU1MIGxvZ28gPGh0dHA6Ly91c2VyLW1vZGUtCisgIG8gIGNhbWUgdXAgd2l0aCB0aGUgd2F5IGNvb2wgVU1MIGxvZ28gPGh0dHA6Ly91c2VyLW1vZGUtCiAgICAgIGxpbnV4LnNvdXJjZWZvcmdlLm5ldC91bWwtc21hbGwucG5nPgogCi0gICsIbyAgcmVkaWQgdGhlIGNvbmZpZyBwcm9jZXNzCisgIG8gIHJlZGlkIHRoZSBjb25maWcgcHJvY2VzcwogCiAKICAgUGV0ZXIgTW91bGRlciA8cmVpdGVyIGF0IG5ldHNwYWNlLm5ldC5hdT4gIC0gRml4ZWQgbXkgY29uZmlnIGFuZCBidWlsZApAQCAtNDI5NiwxOCArNDI5NiwxOCBAQAogCiAgIEJpbGwgU3RlYXJucyA8d3N0ZWFybnMgYXQgcG9ib3guY29tPiAgLQogCi0gICsIbyAgSE9XVE8gdXBkYXRlcworICBvICBIT1dUTyB1cGRhdGVzCiAKLSAgKwhvICBsb3RzIG9mIGJ1ZyByZXBvcnRzCisgIG8gIGxvdHMgb2YgYnVnIHJlcG9ydHMKIAotICArCG8gIGxvdHMgb2YgdGVzdGluZworICBvICBsb3RzIG9mIHRlc3RpbmcKIAotICArCG8gIGRlZGljYXRlZCBhIGJveCAodW1sLmlzdHMuZGFydG1vdXRoLmVkdSkgdG8gc3VwcG9ydCBVTUwgZGV2ZWxvcG1lbnQKKyAgbyAgZGVkaWNhdGVkIGEgYm94ICh1bWwuaXN0cy5kYXJ0bW91dGguZWR1KSB0byBzdXBwb3J0IFVNTCBkZXZlbG9wbWVudAogCi0gICsIbyAgd3JvdGUgdGhlIG1rcm9vdGZzIHNjcmlwdCwgd2hpY2ggYWxsb3dzIGJvb3RhYmxlIGZpbGVzeXN0ZW1zIG9mCisgIG8gIHdyb3RlIHRoZSBta3Jvb3RmcyBzY3JpcHQsIHdoaWNoIGFsbG93cyBib290YWJsZSBmaWxlc3lzdGVtcyBvZgogICAgICBSUE0tYmFzZWQgZGlzdHJpYnV0aW9ucyB0byBiZSBjcmFua2VkIG91dAogCi0gICsIbyAgY3JhbmtlZCBvdXQgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXN5c3RlbXMgd2l0aCBzYWlkIHNjcmlwdAorICBvICBjcmFua2VkIG91dCBhIGxhcmdlIG51bWJlciBvZiBmaWxlc3lzdGVtcyB3aXRoIHNhaWQgc2NyaXB0CiAKIAogICBKaW0gTGV1IDxqbGV1IGF0IG1pbmRzcHJpbmcuY29tPiAgLSBXcm90ZSB0aGUgdmlydHVhbCBldGhlcm5ldCBkcml2ZXIKQEAgLTQzNzUsMTc2ICs0Mzc1LDE3NiBAQAogCiAgIERhdmlkIENvdWxzb24gPGh0dHA6Ly9kYXZpZGNvdWxzb24ubmV0PiAgLQogCi0gICsIbyAgU2V0IHVwIHRoZSB1c2VybW9kZWxpbnV4Lm9yZyA8aHR0cDovL3VzZXJtb2RlbGludXgub3JnPiAgc2l0ZSwKKyAgbyAgU2V0IHVwIHRoZSB1c2VybW9kZWxpbnV4Lm9yZyA8aHR0cDovL3VzZXJtb2RlbGludXgub3JnPiAgc2l0ZSwKICAgICAgd2hpY2ggaXMgYSBncmVhdCB3YXkgb2Yga2VlcGluZyB0aGUgVU1MIHVzZXIgY29tbXVuaXR5IG9uIHRvcCBvZgogICAgICBVTUwgZ29pbmdzLW9uLgogCi0gICsIbyAgU2l0ZSBkb2N1bWVudGF0aW9uIGFuZCB1cGRhdGVzCisgIG8gIFNpdGUgZG9jdW1lbnRhdGlvbiBhbmQgdXBkYXRlcwogCi0gICsIbyAgTmlmdHkgbGl0dGxlIFVNTCBtYW5hZ2VtZW50IGRhZW1vbiAgVU1MZAorICBvICBOaWZ0eSBsaXR0bGUgVU1MIG1hbmFnZW1lbnQgZGFlbW9uICBVTUxkCiAgICAgIDxodHRwOi8vdW1sLm9wZW5jb25zdWx0YW5jeS5jb20vdW1sZC8+CiAKLSAgKwhvICBMb3RzIG9mIHRlc3RpbmcgYW5kIGJ1ZyByZXBvcnRzCisgIG8gIExvdHMgb2YgdGVzdGluZyBhbmQgYnVnIHJlcG9ydHMKIAogCiAKIAotICAxCDE1CDUuCC4yCDIuCC4gIEYIRmwIbHUIdXMIc2gIaGkIaW4IbmcIZyBvCG91CHV0CHQgYghidQh1ZwhncwhzCisgIDE1LjIuICBGbHVzaGluZyBvdXQgYnVncwogCiAKIAotICArCG8gIFl1cmkgUHVkZ29yb2Rza3kKKyAgbyAgWXVyaSBQdWRnb3JvZHNreQogCi0gICsIbyAgR2VyYWxkIEJyaXR0b24KKyAgbyAgR2VyYWxkIEJyaXR0b24KIAotICArCG8gIElhbiBXZWhybWFuCisgIG8gIElhbiBXZWhybWFuCiAKLSAgKwhvICBHb3JkIExhbWIKKyAgbyAgR29yZCBMYW1iCiAKLSAgKwhvICBFdWdlbmUgS29vbnR6CisgIG8gIEV1Z2VuZSBLb29udHoKIAotICArCG8gIEpvaG4gSC4gSGFydG1hbgorICBvICBKb2huIEguIEhhcnRtYW4KIAotICArCG8gIEFuZGVycyBLYXJsc3NvbgorICBvICBBbmRlcnMgS2FybHNzb24KIAotICArCG8gIERhbmllbCBQaGlsbGlwcworICBvICBEYW5pZWwgUGhpbGxpcHMKIAotICArCG8gIEpvaG4gRnJlbWxpbgorICBvICBKb2huIEZyZW1saW4KIAotICArCG8gIFJhaW5lciBCdXJnc3RhbGxlcgorICBvICBSYWluZXIgQnVyZ3N0YWxsZXIKIAotICArCG8gIEphbWVzIFN0ZXZlbnNvbgorICBvICBKYW1lcyBTdGV2ZW5zb24KIAotICArCG8gIE1hdHQgQ2xheQorICBvICBNYXR0IENsYXkKIAotICArCG8gIENsaWZmIEplZmZlcmllcworICBvICBDbGlmZiBKZWZmZXJpZXMKIAotICArCG8gIEdlb2ZmIEhvZmYKKyAgbyAgR2VvZmYgSG9mZgogCi0gICsIbyAgTGVubmVydCBCdXl0ZW5oZWsKKyAgbyAgTGVubmVydCBCdXl0ZW5oZWsKIAotICArCG8gIEFsIFZpcm8KKyAgbyAgQWwgVmlybwogCi0gICsIbyAgRnJhbmsgS2xpbmdlbmhvZWZlcgorICBvICBGcmFuayBLbGluZ2VuaG9lZmVyCiAKLSAgKwhvICBMaXZpbyBCYWxkaW5pIFNvYXJlcworICBvICBMaXZpbyBCYWxkaW5pIFNvYXJlcwogCi0gICsIbyAgSm9uIEJ1cmdlc3MKKyAgbyAgSm9uIEJ1cmdlc3MKIAotICArCG8gIFBldHJ1IFBhbGVyCisgIG8gIFBldHJ1IFBhbGVyCiAKLSAgKwhvICBQYXVsCisgIG8gIFBhdWwKIAotICArCG8gIENocmlzIFJlYWhhcmQKKyAgbyAgQ2hyaXMgUmVhaGFyZAogCi0gICsIbyAgU3ZlcmtlciBOaWxzc29uCisgIG8gIFN2ZXJrZXIgTmlsc3NvbgogCi0gICsIbyAgR29uZyBTdQorICBvICBHb25nIFN1CiAKLSAgKwhvICBqb2hhbiB2ZXJyZXB0CisgIG8gIGpvaGFuIHZlcnJlcHQKIAotICArCG8gIEJqb3JuIEVyaWtzc29uCisgIG8gIEJqb3JuIEVyaWtzc29uCiAKLSAgKwhvICBMb3JlbnpvIEFsbGVncnVjY2kKKyAgbyAgTG9yZW56byBBbGxlZ3J1Y2NpCiAKLSAgKwhvICBNdWxpIEJlbi1ZZWh1ZGEKKyAgbyAgTXVsaSBCZW4tWWVodWRhCiAKLSAgKwhvICBEYXZpZCBNYW5zZmllbGQKKyAgbyAgRGF2aWQgTWFuc2ZpZWxkCiAKLSAgKwhvICBIb3dhcmQgR29mZgorICBvICBIb3dhcmQgR29mZgogCi0gICsIbyAgTWlrZSBBbmRlcnNvbgorICBvICBNaWtlIEFuZGVyc29uCiAKLSAgKwhvICBKb2huIEJ5cm5lCisgIG8gIEpvaG4gQnlybmUKIAotICArCG8gIFNhcGFuIEouIEJhdGlhCisgIG8gIFNhcGFuIEouIEJhdGlhCiAKLSAgKwhvICBJcmlzIEh1YW5nCisgIG8gIElyaXMgSHVhbmcKIAotICArCG8gIEphbiBIdWRlYworICBvICBKYW4gSHVkZWMKIAotICArCG8gIFZvbHVzcGEKKyAgbyAgVm9sdXNwYQogCiAKIAogCi0gIDEIMTUINS4ILjMIMy4ILiAgQghCdQh1ZwhnbAhsZQhldAh0cwhzIGEIYW4IbmQIZCBjCGNsCGxlCGVhCGFuCG4tCC11CHVwCHBzCHMKKyAgMTUuMy4gIEJ1Z2xldHMgYW5kIGNsZWFuLXVwcwogCiAKIAotICArCG8gIERhdmUgWmFyenlja2kKKyAgbyAgRGF2ZSBaYXJ6eWNraQogCi0gICsIbyAgQWRhbSBMYXp1cgorICBvICBBZGFtIExhenVyCiAKLSAgKwhvICBCb3JpYSBGZWlnaW4KKyAgbyAgQm9yaWEgRmVpZ2luCiAKLSAgKwhvICBCcmlhbiBKLiBNdXJyZWxsCisgIG8gIEJyaWFuIEouIE11cnJlbGwKIAotICArCG8gIEpTCisgIG8gIEpTCiAKLSAgKwhvICBSb21hbiBaaXBwZWwKKyAgbyAgUm9tYW4gWmlwcGVsCiAKLSAgKwhvICBXaWwgQ29vbGV5CisgIG8gIFdpbCBDb29sZXkKIAotICArCG8gIEF5ZWxldCBTaGVtZXNoCisgIG8gIEF5ZWxldCBTaGVtZXNoCiAKLSAgKwhvICBXaWxsIER5c29uCisgIG8gIFdpbGwgRHlzb24KIAotICArCG8gIFN2ZXJrZXIgTmlsc3NvbgorICBvICBTdmVya2VyIE5pbHNzb24KIAotICArCG8gIGR2b3JhaworICBvICBkdm9yYWsKIAotICArCG8gIHYubmFnYSBzcmluaXZhcworICBvICB2Lm5hZ2Egc3Jpbml2YXMKIAotICArCG8gIFNobG9taSBGaXNoCisgIG8gIFNobG9taSBGaXNoCiAKLSAgKwhvICBSb2dlciBCaW5ucworICBvICBSb2dlciBCaW5ucwogCi0gICsIbyAgam9oYW4gdmVycmVwdAorICBvICBqb2hhbiB2ZXJyZXB0CiAKLSAgKwhvICBNckNodW9pCisgIG8gIE1yQ2h1b2kKIAotICArCG8gIFBldGVyIENsZXZlCisgIG8gIFBldGVyIENsZXZlCiAKLSAgKwhvICBWaW5jZW50IEd1ZmZlbnMKKyAgbyAgVmluY2VudCBHdWZmZW5zCiAKLSAgKwhvICBOYXRoYW4gU2NvdHQKKyAgbyAgTmF0aGFuIFNjb3R0CiAKLSAgKwhvICBQYXRyaWNrIENhdWxmaWVsZAorICBvICBQYXRyaWNrIENhdWxmaWVsZAogCi0gICsIbyAgamJlYXJjZQorICBvICBqYmVhcmNlCiAKLSAgKwhvICBDYXRhbGluIE1hcmluYXMKKyAgbyAgQ2F0YWxpbiBNYXJpbmFzCiAKLSAgKwhvICBTaGFuZSBTcGVuY2VyCisgIG8gIFNoYW5lIFNwZW5jZXIKIAotICArCG8gIFpvdSBNaW4KKyAgbyAgWm91IE1pbgogCiAKLSAgKwhvICBSeWFuIEJvZGVyCisgIG8gIFJ5YW4gQm9kZXIKIAotICArCG8gIExvcmVuem8gQ29saXR0aQorICBvICBMb3JlbnpvIENvbGl0dGkKIAotICArCG8gIEd3ZW5kYWwgR3JpZ25vdQorICBvICBHd2VuZGFsIEdyaWdub3UKIAotICArCG8gIEFuZHJlJyBCcmVpbGVyCisgIG8gIEFuZHJlJyBCcmVpbGVyCiAKLSAgKwhvICBUc3V0b211IFlhc3VkYQorICBvICBUc3V0b211IFlhc3VkYQogCiAKIAotICAxCDE1CDUuCC40CDQuCC4gIEMIQ2EIYXMIc2UIZSBTCFN0CHR1CHVkCGRpCGllCGVzCHMKKyAgMTUuNC4gIENhc2UgU3R1ZGllcwogCiAKLSAgKwhvICBKb24gV3JpZ2h0CisgIG8gIEpvbiBXcmlnaHQKIAotICArCG8gIFdpbGxpYW0gTWNFd2FuCisgIG8gIFdpbGxpYW0gTWNFd2FuCiAKLSAgKwhvICBNaWNoYWVsIFJpY2hhcmRzb24KKyAgbyAgTWljaGFlbCBSaWNoYXJkc29uCiAKIAogCi0gIDEIMTUINS4ILjUINS4ILiAgTwhPdAh0aAhoZQhlcghyIGMIY28Ib24IbnQIdHIIcmkIaWIIYnUIdXQIdGkIaW8Ib24IbnMIcworICAxNS41LiAgT3RoZXIgY29udHJpYnV0aW9ucwogCiAKICAgQmlsbCBDYXJyIDxCaWxsLkNhcnIgYXQgY29tcGFxLmNvbT4gIG1hZGUgdGhlIFJlZCBIYXQgbWtyb290ZnMgc2NyaXB0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL2NvbnZlcnRfZHJpdmVyc190b19rZXJuZWxfYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvY29udmVydF9kcml2ZXJzX3RvX2tlcm5lbF9hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWU5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL2NvbnZlcnRfZHJpdmVyc190b19rZXJuZWxfYXBpLnR4dApAQCAtMCwwICsxLDE5NSBAQAorQ29udmVydGluZyBvbGQgd2F0Y2hkb2cgZHJpdmVycyB0byB0aGUgd2F0Y2hkb2cgZnJhbWV3b3JrCitieSBXb2xmcmFtIFNhbmcgPHcuc2FuZ0BwZW5ndXRyb25peC5kZT4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCZWZvcmUgdGhlIHdhdGNoZG9nIGZyYW1ld29yayBjYW1lIGludG8gdGhlIGtlcm5lbCwgZXZlcnkgZHJpdmVyIGhhZCB0bworaW1wbGVtZW50IHRoZSBBUEkgb24gaXRzIG93bi4gTm93LCBhcyB0aGUgZnJhbWV3b3JrIGZhY3RvcmVkIG91dCB0aGUgY29tbW9uCitjb21wb25lbnRzLCB0aG9zZSBkcml2ZXJzIGNhbiBiZSBsaWdodGVuZWQgbWFraW5nIGl0IGEgdXNlciBvZiB0aGUgZnJhbWV3b3JrLgorVGhpcyBkb2N1bWVudCBzaGFsbCBndWlkZSB5b3UgZm9yIHRoaXMgdGFzay4gVGhlIG5lY2Vzc2FyeSBzdGVwcyBhcmUgZGVzY3JpYmVkCithcyB3ZWxsIGFzIHRoaW5ncyB0byBsb29rIG91dCBmb3IuCisKKworUmVtb3ZlIHRoZSBmaWxlX29wZXJhdGlvbnMgc3RydWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT2xkIGRyaXZlcnMgZGVmaW5lIHRoZWlyIG93biBmaWxlX29wZXJhdGlvbnMgZm9yIGFjdGlvbnMgbGlrZSBvcGVuKCksIHdyaXRlKCksCitldGMuLi4gVGhlc2UgYXJlIG5vdyBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYW5kIGp1c3QgY2FsbCB0aGUgZHJpdmVyIHdoZW4KK25lZWRlZC4gU28sIGluIGdlbmVyYWwsIHRoZSAnZmlsZV9vcGVyYXRpb25zJyBzdHJ1Y3QgYW5kIGFzc29ydGVkIGZ1bmN0aW9ucyBjYW4KK2dvLiBPbmx5IHZlcnkgZmV3IGRyaXZlci1zcGVjaWZpYyBkZXRhaWxzIGhhdmUgdG8gYmUgbW92ZWQgdG8gb3RoZXIgZnVuY3Rpb25zLgorSGVyZSBpcyBhIG92ZXJ2aWV3IG9mIHRoZSBmdW5jdGlvbnMgYW5kIHByb2JhYmx5IG5lZWRlZCBhY3Rpb25zOgorCistIG9wZW46IEV2ZXJ5dGhpbmcgZGVhbGluZyB3aXRoIHJlc291cmNlIG1hbmFnZW1lbnQgKGZpbGUtb3BlbiBjaGVja3MsIG1hZ2ljCisgIGNsb3NlIHByZXBhcmF0aW9ucykgY2FuIHNpbXBseSBnby4gRGV2aWNlIHNwZWNpZmljIHN0dWZmIG5lZWRzIHRvIGdvIHRvIHRoZQorICBkcml2ZXIgc3BlY2lmaWMgc3RhcnQtZnVuY3Rpb24uIE5vdGUgdGhhdCBmb3Igc29tZSBkcml2ZXJzLCB0aGUgc3RhcnQtZnVuY3Rpb24KKyAgYWxzbyBzZXJ2ZXMgYXMgdGhlIHBpbmctZnVuY3Rpb24uIElmIHRoYXQgaXMgdGhlIGNhc2UgYW5kIHlvdSBuZWVkIHN0YXJ0L3N0b3AKKyAgdG8gYmUgYmFsYW5jZWQgKGNsb2NrcyEpLCB5b3UgYXJlIGJldHRlciBvZmYgcmVmYWN0b3JpbmcgYSBzZXBhcmF0ZSBzdGFydC1mdW5jdGlvbi4KKworLSBjbG9zZTogU2FtZSBoaW50cyBhcyBmb3Igb3BlbiBhcHBseS4KKworLSB3cml0ZTogQ2FuIHNpbXBseSBnbywgYWxsIGRlZmluZWQgYmVoYXZpb3VyIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIGZyYW1ld29yaywKKyAgaS5lLiBwaW5nIG9uIHdyaXRlIGFuZCBtYWdpYyBjaGFyICgnVicpIGhhbmRsaW5nLgorCistIGlvY3RsOiBXaGlsZSB0aGUgZHJpdmVyIGlzIGFsbG93ZWQgdG8gaGF2ZSBleHRlbnNpb25zIHRvIHRoZSBJT0NUTCBpbnRlcmZhY2UsCisgIHRoZSBtb3N0IGNvbW1vbiBvbmVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmssIHN1cHBvcnRlZCBieSBzb21lIGFzc2lzdGFuY2UKKyAgZnJvbSB0aGUgZHJpdmVyOgorCisJV0RJT0NfR0VUU1VQUE9SVDoKKwkJUmV0dXJucyB0aGUgbWFuZGF0b3J5IHdhdGNoZG9nX2luZm8gc3RydWN0IGZyb20gdGhlIGRyaXZlcgorCisJV0RJT0NfR0VUU1RBVFVTOgorCQlOZWVkcyB0aGUgc3RhdHVzLWNhbGxiYWNrIGRlZmluZWQsIG90aGVyd2lzZSByZXR1cm5zIDAKKworCVdESU9DX0dFVEJPT1RTVEFUVVM6CisJCU5lZWRzIHRoZSBib290c3RhdHVzIG1lbWJlciBwcm9wZXJseSBzZXQuIE1ha2Ugc3VyZSBpdCBpcyAwIGlmIHlvdQorCQlkb24ndCBoYXZlIGZ1cnRoZXIgc3VwcG9ydCEKKworCVdESU9DX1NFVE9QVElPTlM6CisJCU5vIHByZXBhcmF0aW9ucyBuZWVkZWQKKworCVdESU9DX0tFRVBBTElWRToKKwkJSWYgd2FudGVkLCBvcHRpb25zIGluIHdhdGNoZG9nX2luZm8gbmVlZCB0byBoYXZlIFdESU9GX0tFRVBBTElWRVBJTkcKKwkJc2V0CisKKwlXRElPQ19TRVRUSU1FT1VUOgorCQlPcHRpb25zIGluIHdhdGNoZG9nX2luZm8gbmVlZCB0byBoYXZlIFdESU9GX1NFVFRJTUVPVVQgc2V0CisJCWFuZCBhIHNldF90aW1lb3V0LWNhbGxiYWNrIGhhcyB0byBiZSBkZWZpbmVkLiBUaGUgY29yZSB3aWxsIGFsc28KKwkJZG8gbGltaXQtY2hlY2tpbmcsIGlmIG1pbl90aW1lb3V0IGFuZCBtYXhfdGltZW91dCBpbiB0aGUgd2F0Y2hkb2cKKwkJZGV2aWNlIGFyZSBzZXQuIEFsbCBpcyBvcHRpb25hbC4KKworCVdESU9DX0dFVFRJTUVPVVQ6CisJCU5vIHByZXBhcmF0aW9ucyBuZWVkZWQKKworICBPdGhlciBJT0NUTHMgY2FuIGJlIHNlcnZlZCB1c2luZyB0aGUgaW9jdGwtY2FsbGJhY2suIE5vdGUgdGhhdCB0aGlzIGlzIG1haW5seQorICBpbnRlbmRlZCBmb3IgcG9ydGluZyBvbGQgZHJpdmVyczsgbmV3IGRyaXZlcnMgc2hvdWxkIG5vdCBpbnZlbnQgcHJpdmF0ZSBJT0NUTHMuCisgIFByaXZhdGUgSU9DVExzIGFyZSBwcm9jZXNzZWQgZmlyc3QuIFdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgd2l0aAorICAtRU5PSU9DVExDTUQsIHRoZSBJT0NUTHMgb2YgdGhlIGZyYW1ld29yayB3aWxsIGJlIHRyaWVkLCB0b28uIEFueSBvdGhlciBlcnJvcgorICBpcyBkaXJlY3RseSBnaXZlbiB0byB0aGUgdXNlci4KKworRXhhbXBsZSBjb252ZXJzaW9uOgorCistc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMHdkdF9mb3BzID0geworLSAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKy0gICAgICAgLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAorLSAgICAgICAud3JpdGUgICAgICAgICAgPSBzM2MyNDEwd2R0X3dyaXRlLAorLSAgICAgICAudW5sb2NrZWRfaW9jdGwgPSBzM2MyNDEwd2R0X2lvY3RsLAorLSAgICAgICAub3BlbiAgICAgICAgICAgPSBzM2MyNDEwd2R0X29wZW4sCistICAgICAgIC5yZWxlYXNlICAgICAgICA9IHMzYzI0MTB3ZHRfcmVsZWFzZSwKKy19OworCitDaGVjayB0aGUgZnVuY3Rpb25zIGZvciBkZXZpY2Utc3BlY2lmaWMgc3R1ZmYgYW5kIGtlZXAgaXQgZm9yIGxhdGVyCityZWZhY3RvcmluZy4gVGhlIHJlc3QgY2FuIGdvLgorCisKK1JlbW92ZSB0aGUgbWlzY2RldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIHRoZSBmaWxlX29wZXJhdGlvbnMgYXJlIGdvbmUgbm93LCB5b3UgY2FuIGFsc28gcmVtb3ZlIHRoZSAnc3RydWN0CittaXNjZGV2aWNlJy4gVGhlIGZyYW1ld29yayB3aWxsIGNyZWF0ZSBpdCBvbiB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIoKSBjYWxsZWQgYnkKK3dhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgpLgorCistc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHMzYzI0MTB3ZHRfbWlzY2RldiA9IHsKKy0gICAgICAgLm1pbm9yICAgICAgICAgID0gV0FUQ0hET0dfTUlOT1IsCistICAgICAgIC5uYW1lICAgICAgICAgICA9ICJ3YXRjaGRvZyIsCistICAgICAgIC5mb3BzICAgICAgICAgICA9ICZzM2MyNDEwd2R0X2ZvcHMsCistfTsKKworCitSZW1vdmUgb2Jzb2xldGUgaW5jbHVkZXMgYW5kIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWNhdXNlIG9mIHRoZSBzaW1wbGlmaWNhdGlvbnMsIGEgZmV3IGRlZmluZXMgYXJlIHByb2JhYmx5IHVudXNlZCBub3cuIFJlbW92ZQordGhlbS4gSW5jbHVkZXMgY2FuIGJlIHJlbW92ZWQsIHRvby4gRm9yIGV4YW1wbGU6CisKKy0gI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CistICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+IChpZiBNT0RVTEVfQUxJQVNfTUlTQ0RFViBpcyBub3QgdXNlZCkKKy0gI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4gKGlmIG5vIGN1c3RvbSBJT0NUTHMgYXJlIHVzZWQpCisKKworQWRkIHRoZSB3YXRjaGRvZyBvcGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIHBvc3NpYmxlIGNhbGxiYWNrcyBhcmUgZGVmaW5lZCBpbiAnc3RydWN0IHdhdGNoZG9nX29wcycuIFlvdSBjYW4gZmluZCBpdAorZXhwbGFpbmVkIGluICd3YXRjaGRvZy1rZXJuZWwtYXBpLnR4dCcgaW4gdGhpcyBkaXJlY3RvcnkuIHN0YXJ0KCksIHN0b3AoKSBhbmQKK293bmVyIG11c3QgYmUgc2V0LCB0aGUgcmVzdCBhcmUgb3B0aW9uYWwuIFlvdSB3aWxsIGVhc2lseSBmaW5kIGNvcnJlc3BvbmRpbmcKK2Z1bmN0aW9ucyBpbiB0aGUgb2xkIGRyaXZlci4gTm90ZSB0aGF0IHlvdSB3aWxsIG5vdyBnZXQgYSBwb2ludGVyIHRvIHRoZQord2F0Y2hkb2dfZGV2aWNlIGFzIGEgcGFyYW1ldGVyIHRvIHRoZXNlIGZ1bmN0aW9ucywgc28geW91IHByb2JhYmx5IGhhdmUgdG8KK2NoYW5nZSB0aGUgZnVuY3Rpb24gaGVhZGVyLiBPdGhlciBjaGFuZ2VzIGFyZSBtb3N0IGxpa2VseSBub3QgbmVlZGVkLCBiZWNhdXNlCitoZXJlIHNpbXBseSBoYXBwZW5zIHRoZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzLiBJZiB5b3UgaGF2ZSBkZXZpY2Utc3BlY2lmaWMKK2NvZGUgbGVmdCBmcm9tIHRoZSBhYm92ZSBzdGVwcywgaXQgc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50byB0aGVzZSBjYWxsYmFja3MuCisKK0hlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZToKKworK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHMzYzI0MTB3ZHRfb3BzID0geworKyAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKysgICAgICAgLnN0YXJ0ID0gczNjMjQxMHdkdF9zdGFydCwKKysgICAgICAgLnN0b3AgPSBzM2MyNDEwd2R0X3N0b3AsCisrICAgICAgIC5waW5nID0gczNjMjQxMHdkdF9rZWVwYWxpdmUsCisrICAgICAgIC5zZXRfdGltZW91dCA9IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCwKKyt9OworCitBIHR5cGljYWwgZnVuY3Rpb24taGVhZGVyIGNoYW5nZSBsb29rcyBsaWtlOgorCistc3RhdGljIHZvaWQgczNjMjQxMHdkdF9rZWVwYWxpdmUodm9pZCkKKytzdGF0aWMgaW50IHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKKyB7CisuLi4KKysKKysgICAgICAgcmV0dXJuIDA7CisgfQorCisuLi4KKworLSAgICAgICBzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOworKyAgICAgICBzM2MyNDEwd2R0X2tlZXBhbGl2ZSgmczNjMjQxMF93ZGQpOworCisKK0FkZCB0aGUgd2F0Y2hkb2cgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgd2UgbmVlZCB0byBjcmVhdGUgYSAnc3RydWN0IHdhdGNoZG9nX2RldmljZScgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlCituZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBmcmFtZXdvcmsuIFRoZSBzdHJ1Y3QgaXMgYWxzbyBleHBsYWluZWQgaW4gZGV0YWlsCitpbiAnd2F0Y2hkb2cta2VybmVsLWFwaS50eHQnIGluIHRoaXMgZGlyZWN0b3J5LiBXZSBwYXNzIGl0IHRoZSBtYW5kYXRvcnkKK3dhdGNoZG9nX2luZm8gc3RydWN0IGFuZCB0aGUgbmV3bHkgY3JlYXRlZCB3YXRjaGRvZ19vcHMuIE9mdGVuLCBvbGQgZHJpdmVycworaGF2ZSB0aGVpciBvd24gcmVjb3JkLWtlZXBpbmcgZm9yIHRoaW5ncyBsaWtlIGJvb3RzdGF0dXMgYW5kIHRpbWVvdXQgdXNpbmcKK3N0YXRpYyB2YXJpYWJsZXMuIFRob3NlIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIHVzZSB0aGUgbWVtYmVycyBpbgord2F0Y2hkb2dfZGV2aWNlLiBOb3RlIHRoYXQgdGhlIHRpbWVvdXQgdmFsdWVzIGFyZSB1bnNpZ25lZCBpbnQuIFNvbWUgZHJpdmVycwordXNlIHNpZ25lZCBpbnQsIHNvIHRoaXMgaGFzIHRvIGJlIGNvbnZlcnRlZCwgdG9vLgorCitIZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUgZm9yIGEgd2F0Y2hkb2cgZGV2aWNlOgorCisrc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgczNjMjQxMF93ZGQgPSB7CisrICAgICAgIC5pbmZvID0gJnMzYzI0MTBfd2R0X2lkZW50LAorKyAgICAgICAub3BzID0gJnMzYzI0MTB3ZHRfb3BzLAorK307CisKKworUmVnaXN0ZXIgdGhlIHdhdGNoZG9nIGRldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXBsYWNlIG1pc2NfcmVnaXN0ZXIoJm1pc2NkZXYpIHdpdGggd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZ3YXRjaGRvZ19kZXYpLgorTWFrZSBzdXJlIHRoZSByZXR1cm4gdmFsdWUgZ2V0cyBjaGVja2VkIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgcHJlc2VudCwKK3N0aWxsIGZpdHMuIEFsc28gY29udmVydCB0aGUgdW5yZWdpc3RlciBjYXNlLgorCistICAgICAgIHJldCA9IG1pc2NfcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisrICAgICAgIHJldCA9IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmczNjMjQxMF93ZGQpOworCisuLi4KKworLSAgICAgICBtaXNjX2RlcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisrICAgICAgIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCZzM2MyNDEwX3dkZCk7CisKKworVXBkYXRlIHRoZSBLY29uZmlnLWVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGVudHJ5IGZvciB0aGUgZHJpdmVyIG5vdyBuZWVkcyB0byBzZWxlY3QgV0FUQ0hET0dfQ09SRToKKworKyAgICAgICBzZWxlY3QgV0FUQ0hET0dfQ09SRQorCisKK0NyZWF0ZSBhIHBhdGNoIGFuZCBzZW5kIGl0IHRvIHVwc3RyZWFtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNYWtlIHN1cmUgeW91IHVuZGVyc3Rvb2QgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBhbmQgc2VuZCB5b3VyIHBhdGNoIHRvCitsaW51eC13YXRjaGRvZ0B2Z2VyLmtlcm5lbC5vcmcuIFdlIGFyZSBsb29raW5nIGZvcndhcmQgdG8gaXQgOikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvZW50cnlfNjQudHh0CmluZGV4IDc4NjlmMTQuLmJjNzIyNmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L2VudHJ5XzY0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9lbnRyeV82NC50eHQKQEAgLTI3LDkgKzI3LDYgQEAKICAgIG1hZ2ljYWxseS1nZW5lcmF0ZWQgZnVuY3Rpb25zIHRoYXQgbWFrZSB0aGVpciB3YXkgdG8gZG9fSVJRIHdpdGgKICAgIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGFzIGEgcGFyYW1ldGVyLgogCi0gLSBlbXVsYXRlX3ZzeXNjYWxsOiBpbnQgMHhjYywgYSBzcGVjaWFsIG5vbi1BQkkgZW50cnkgdXNlZCBieQotICAgdnN5c2NhbGwgZW11bGF0aW9uLgotCiAgLSBBUElDIGludGVycnVwdHM6IFZhcmlvdXMgc3BlY2lhbC1wdXJwb3NlIGludGVycnVwdHMgZm9yIHRoaW5ncwogICAgbGlrZSBUTEIgc2hvb3Rkb3duLgogCmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKaW5kZXggMjExNDExMy4uYjhiNzA4YSAxMDA2NDQKLS0tIGEvS2J1aWxkCisrKyBiL0tidWlsZApAQCAtODgsMTEgKzg4LDEzIEBACiAjIDMpIENoZWNrIGZvciBtaXNzaW5nIHN5c3RlbSBjYWxscwogIwogCi1xdWlldF9jbWRfc3lzY2FsbHMgPSBDQUxMICAgICQ8Ci0gICAgICBjbWRfc3lzY2FsbHMgPSAkKENPTkZJR19TSEVMTCkgJDwgJChDQykgJChjX2ZsYWdzKQorYWx3YXlzICs9IG1pc3Npbmctc3lzY2FsbHMKK3RhcmdldHMgKz0gbWlzc2luZy1zeXNjYWxscwogCi1QSE9OWSArPSBtaXNzaW5nLXN5c2NhbGxzCi1taXNzaW5nLXN5c2NhbGxzOiBzY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2ggRk9SQ0UKK3F1aWV0X2NtZF9zeXNjYWxscyA9IENBTEwgICAgJDwKKyAgICAgIGNtZF9zeXNjYWxscyA9ICQoQ09ORklHX1NIRUxMKSAkPCAkKENDKSAkKGNfZmxhZ3MpICQobWlzc2luZ19zeXNjYWxsc19mbGFncykKKworbWlzc2luZy1zeXNjYWxsczogc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoICQob2Zmc2V0cy1maWxlKSBGT1JDRQogCSQoY2FsbCBjbWQsc3lzY2FsbHMpCiAKICMgS2VlcCB0aGVzZSB0d28gZmlsZXMgZHVyaW5nIG1ha2UgY2xlYW4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMjdhZjljOS4uMDcxYTk5NiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMxNiw2ICszMTYsMTAgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwogCitBRERSRVNTIFNQQUNFIExBWU9VVCBSQU5ET01JWkFUSU9OIChBU0xSKQorTToJSmlyaSBLb3NpbmEgPGprb3NpbmFAc3VzZS5jej4KK1M6CU1haW50YWluZWQKKwogQURNMTAyNSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgogTToJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCkBAIC01MjksNiArNTMzLDcgQEAKIEY6CWRyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC8KIAogQU5BTE9HIERFVklDRVMgSU5DIEFTT0MgQ09ERUMgRFJJVkVSUworTToJTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CiBMOglkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZwogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93aWtpLmFuYWxvZy5jb20vCkBAIC02ODcsNiArNjkyLDEyIEBACiBGOglkcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfYmNoLmMKIEY6CWRyaXZlcnMvbXRkL25hbmQvbmFuZF9iY21fdW1pLmgKIAorQVJNL0NBTFhFREEgSElHSEJBTksgQVJDSElURUNUVVJFCitNOglSb2IgSGVycmluZyA8cm9iLmhlcnJpbmdAY2FseGVkYS5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vbWFjaC1oaWdoYmFuay8KKwogQVJNL0NBVklVTSBORVRXT1JLUyBDTlMzWFhYIE1BQ0hJTkUgU1VQUE9SVAogTToJQW50b24gVm9yb250c292IDxhdm9yb250c292QG12aXN0YS5jb20+CiBTOglNYWludGFpbmVkCkBAIC03ODYsNiArNzk3LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS9tYWNoLW14NS8KIAorQVJNL0ZSRUVTQ0FMRSBJTVg2CitNOglTaGF3biBHdW8gPHNoYXduLmd1b0BsaW5hcm8ub3JnPgorTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1M6CU1haW50YWluZWQKK1Q6CWdpdCBnaXQ6Ly9naXQubGluYXJvLm9yZy9wZW9wbGUvc2hhd25ndW8vbGludXgtMi42LmdpdAorRjoJYXJjaC9hcm0vbWFjaC1pbXgvKmlteDYqCisKIEFSTS9HTE9NQVRJT04gR0VTQkM5MzEyU1ggTUFDSElORSBTVVBQT1JUCiBNOglMZW5uZXJ0IEJ1eXRlbmhlayA8a2VybmVsQHdhbnRzdG9mbHkub3JnPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTEwMTQsNiArMTAzMiw3IEBACiBGOglhcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb21kLmgKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL21lbWMuaAogRjoJYXJjaC9hcm0vbWFjaC1ycGMvCitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2V0aGVyaC5jCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvZXRoZXIxKgogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvc2VlcS9ldGhlcjMqCiBGOglkcml2ZXJzL3Njc2kvYXJtLwpAQCAtMTA4NCw2ICsxMTAzLDI1IEBACiBGOglhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0LypmaW1jKgogRjoJZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy8KIAorQVJNL1NBTVNVTkcgUzVQIFNFUklFUyBNdWx0aSBGb3JtYXQgQ29kZWMgKE1GQykgU1VQUE9SVAorTToJS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KK006CUthbWlsIERlYnNraSA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CitNOiAgICAgSmVvbmd0YWUgUGFyayA8anRwLnBhcmtAc2Ftc3VuZy5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW1mYy5jCitGOglkcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvCisKK0FSTS9TQU1TVU5HIFM1UCBTRVJJRVMgVFYgU1VCU1lTVEVNIFNVUFBPUlQKK006CUt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CitNOglUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vcGxhdC1zNXAvZGV2LXR2LmMKK0Y6CWRyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2LworCiBBUk0vU0hNT0JJTEUgQVJNIEFSQ0hJVEVDVFVSRQogTToJUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KIE06CU1hZ251cyBEYW1tIDxtYWdudXMuZGFtbUBnbWFpbC5jb20+CkBAIC0xNjgwLDYgKzE3MTgsNyBAQAogRjoJaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCiBGOglpbmNsdWRlL2xpbnV4L2Nhbi9iY20uaAogRjoJaW5jbHVkZS9saW51eC9jYW4vcmF3LmgKK0Y6CWluY2x1ZGUvbGludXgvY2FuL2d3LmgKIAogQ0FOIE5FVFdPUksgRFJJVkVSUwogTToJV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CkBAIC0yMzA0LDYgKzIzNDMsMTMgQEAKIEY6CWRyaXZlcnMvZ3B1L2RybS9pOTE1CiBGOglpbmNsdWRlL2RybS9pOTE1KgogCitEUk0gRFJJVkVSUyBGT1IgRVhZTk9TCitNOglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CitMOglkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvZ3B1L2RybS9leHlub3MKK0Y6CWluY2x1ZGUvZHJtL2V4eW5vcyoKKwogRFNDQzQgRFJJVkVSCiBNOglGcmFuY29pcyBSb21pZXUgPHJvbWlldUBmci56b3JlaWwuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtMjM1MCw3ICsyMzk2LDcgQEAKIEY6CW5ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidCouYwogCiBFQ1JZUFQgRklMRSBTWVNURU0KLU06CVR5bGVyIEhpY2tzIDx0eWhpY2tzQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CVR5bGVyIEhpY2tzIDx0eWhpY2tzQGNhbm9uaWNhbC5jb20+CiBNOglEdXN0aW4gS2lya2xhbmQgPGtpcmtsYW5kQGNhbm9uaWNhbC5jb20+CiBMOgllY3J5cHRmc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHBzOi8vbGF1bmNocGFkLm5ldC9lY3J5cHRmcwpAQCAtMjQzMSw4ICsyNDc3LDYgQEAKIFc6CWJsdWVzbW9rZS5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCi1GOglkcml2ZXJzL2VkYWMvZWRhY19tY2UuYwotRjoJaW5jbHVkZS9saW51eC9lZGFjX21jZS5oCiAKIEVEQUMtSTgyOTc1WAogTToJUmFuZ2FuYXRoYW4gRGVzaWthbiA8cmF2aUBqZXR6dGVjaG5vbG9naWVzLmNvbT4KQEAgLTI0NTYsNiArMjUwMCwxMyBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL3I4MjYwMF9lZGFjLmMKIAorRURBQy1TQlJJREdFCitNOglNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KK0w6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCitXOglibHVlc21va2Uuc291cmNlZm9yZ2UubmV0CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2VkYWMvc2JfZWRhYy5jCisKIEVESVJPTCBVQS0xMDEvVUEtMTAwMCBEUklWRVIKIE06CUNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTI5NzcsNiArMzAyOCwxMyBAQAogRjoJZHJpdmVycy9jaGFyL2h3X3JhbmRvbS8KIEY6CWluY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKIAorSEFSRFdBUkUgU1BJTkxPQ0sgQ09SRQorTToJT2hhZCBCZW4tQ29oZW4gPG9oYWRAd2l6ZXJ5LmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdzcGlubG9jay50eHQKK0Y6CWRyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrXyoKK0Y6CWluY2x1ZGUvbGludXgvaHdzcGlubG9jay5oCisKIEhBUk1PTlkgU09VTkQgRFJJVkVSCiBNOglLeWxlIE1jTWFydGluIDxreWxlQG1jbWFydGluLmNhPgogTDoJbGludXgtcGFyaXNjQHZnZXIua2VybmVsLm9yZwpAQCAtMzE2OSw4ICszMjI3LDcgQEAKIE06CVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KIE06CUZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPgogTDoJbGludXgtaWE2NEB2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly93d3cuaWE2NC1saW51eC5vcmcvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9hZWdsL2xpbnV4LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9pYTY0LwogCkBAIC0zMjA4LDYgKzMyNjUsMTMgQEAKIEY6CWRyaXZlcnMvaWRlLwogRjoJaW5jbHVkZS9saW51eC9pZGUuaAogCitJREVBUEFEIExBUFRPUCBFWFRSQVMgRFJJVkVSCitNOglJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4KK0w6CXBsYXRmb3JtLWRyaXZlci14ODZAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vbGF1bmNocGFkLm5ldC9pZGVhcGFkLWxhcHRvcAorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYworCiBJREUvQVRBUEkgRFJJVkVSUwogTToJQm9yaXNsYXYgUGV0a292IDxwZXRrb3ZiYkBnbWFpbC5jb20+CiBMOglsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCkBAIC0zOTk0LDYgKzQwNTgsNyBAQAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9taXNjLWRldmljZXMvbGlzM2x2MDJkCiBGOglkcml2ZXJzL21pc2MvbGlzM2x2MDJkLworRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYwogCiBMTEMgKDgwMi4yKQogTToJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4KQEAgLTQ0MjEsMTEgKzQ0ODYsOSBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vCiAKIE5FVEZJTFRFUi9JUFRBQkxFUy9JUENIQUlOUwotUDoJUnVzdHkgUnVzc2VsbAotUDoJTWFyYyBCb3VjaGVyCi1QOglKYW1lcyBNb3JyaXMKIFA6CUhhcmFsZCBXZWx0ZQogUDoJSm96c2VmIEthZGxlY3NpaworTToJUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CiBNOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIEw6CW5ldGZpbHRlci1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CW5ldGZpbHRlckB2Z2VyLmtlcm5lbC5vcmcKQEAgLTQ2MTgsNyArNDY4MSw3IEBACiBXOglodHRwOi8vd3d3Lm11cnUuY29tL2xpbnV4L29tYXAvCiBXOglodHRwOi8vbGludXgub21hcC5jb20vCiBROglodHRwOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1vbWFwL2xpc3QvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RtbGluZC9saW51eC1vbWFwLTIuNi5naXQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG1saW5kL2xpbnV4LW9tYXAuZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS8qb21hcCovCiAKQEAgLTQ2NjYsNiArNDcyOSwxMyBAQAogRjoJZHJpdmVycy92aWRlby9vbWFwMi8KIEY6CURvY3VtZW50YXRpb24vYXJtL09NQVAvRFNTCiAKK09NQVAgSEFSRFdBUkUgU1BJTkxPQ0sgU1VQUE9SVAorTToJT2hhZCBCZW4tQ29oZW4gPG9oYWRAd2l6ZXJ5LmNvbT4KK0w6CWxpbnV4LW9tYXBAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2h3c3BpbmxvY2svb21hcF9od3NwaW5sb2NrLmMKK0Y6CWFyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jCisKIE9NQVAgTU1DIFNVUFBPUlQKIE06CUphcmtrbyBMYXZpbmVuIDxqYXJra28ubGF2aW5lbkBub2tpYS5jb20+CiBMOglsaW51eC1vbWFwQHZnZXIua2VybmVsLm9yZwpAQCAtNDc2MCwxMCArNDgzMCwxMiBAQAogCiBPUEVOIEZJUk1XQVJFIEFORCBGTEFUVEVORUQgREVWSUNFIFRSRUUKIE06CUdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK006CVJvYiBIZXJyaW5nIDxyb2IuaGVycmluZ0BjYWx4ZWRhLmNvbT4KIEw6CWRldmljZXRyZWUtZGlzY3Vzc0BsaXN0cy5vemxhYnMub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9mZHQuc2VjcmV0bGFiLmNhCiBUOglnaXQgZ2l0Oi8vZ2l0LnNlY3JldGxhYi5jYS9naXQvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlCiBGOglkcml2ZXJzL29mCiBGOglpbmNsdWRlL2xpbnV4L29mKi5oCiBLOglvZl9nZXRfcHJvcGVydHkKQEAgLTQ5NDYsNyArNTAxOCw3IEBACiBGOglpbmNsdWRlL2xpbnV4L2kyYy1wY2EtcGxhdGZvcm0uaAogCiBQQ0kgRVJST1IgUkVDT1ZFUlkKLU06CUxpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPgorTTogICAgIExpbmFzIFZlcHN0YXMgPGxpbmFzdmVwc3Rhc0BnbWFpbC5jb20+CiBMOglsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vUENJL3BjaS1lcnJvci1yZWNvdmVyeS50eHQKQEAgLTUzMjYsNiArNTM5OCwxMiBAQAogRjoJaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKIEY6CWluY2x1ZGUvbGludXgvcW54dHlwZXMuaAogCitRVUFMQ09NTSBIRVhBR09OIEFSQ0hJVEVDVFVSRQorTToJUmljaGFyZCBLdW8gPHJrdW9AY29kZWF1cm9yYS5vcmc+CitMOglsaW51eC1oZXhhZ29uQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglhcmNoL2hleGFnb24vCisKIFJBRE9TIEJMT0NLIERFVklDRSAoUkJEKQogRjoJaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCiBNOglZZWh1ZGEgU2FkZWggPHllaHVkYUBocS5uZXdkcmVhbS5uZXQ+CkBAIC01NDAxLDcgKzU0NzksNyBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKIAogUkRTIC0gUkVMSUFCTEUgREFUQUdSQU0gU09DS0VUUwotTToJQW5keSBHcm92ZXIgPGFuZHkuZ3JvdmVyQG9yYWNsZS5jb20+CitNOglWZW5rYXQgVmVua2F0c3VicmEgPHZlbmthdC54LnZlbmthdHN1YnJhQG9yYWNsZS5jb20+CiBMOglyZHMtZGV2ZWxAb3NzLm9yYWNsZS5jb20gKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUzoJU3VwcG9ydGVkCiBGOgluZXQvcmRzLwpAQCAtNTk2Nyw2ICs2MDQ1LDEyIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzk0MjAuKgogCitTTVNDIFVGWDYwMDAgYW5kIFVGWDcwMDAgVVNCIHRvIFZHQSBEUklWRVIKK006CVN0ZXZlIEdsZW5kaW5uaW5nIDxzdGV2ZS5nbGVuZGlubmluZ0BzbXNjLmNvbT4KK0w6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3ZpZGVvL3Ntc2N1ZnguYworCiBTTi1JQTY0IChJdGFuaXVtKSBTVUItUExBVEZPUk0KIE06CUplcyBTb3JlbnNlbiA8amVzQHNnaS5jb20+CiBMOglsaW51eC1hbHRpeEBzZ2kuY29tCkBAIC02MDM2LDcgKzYxMjAsNyBAQAogTToJVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy8KLVQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGl3YWkvc291bmQtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXdhaS9zb3VuZC5naXQKIFQ6CWdpdCBnaXQ6Ly9naXQuYWxzYS1wcm9qZWN0Lm9yZy9hbHNhLWtlcm5lbC5naXQKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vc291bmQvCkBAIC02MDQ2LDcgKzYxMzAsNyBAQAogU09VTkQgLSBTT0MgTEFZRVIgLyBEWU5BTUlDIEFVRElPIFBPV0VSIE1BTkFHRU1FTlQgKEFTb0MpCiBNOglMaWFtIEdpcmR3b29kIDxscmdAdGkuY29tPgogTToJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Ci1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Jyb29uaWUvc291bmQtMi42LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9icm9vbmllL3NvdW5kLmdpdAogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9hbHNhLXByb2plY3Qub3JnL21haW4vaW5kZXgucGhwL0FTb0MKIFM6CVN1cHBvcnRlZApAQCAtNjYyNSw3ICs2NzA5LDYgQEAKIAogVURGIEZJTEVTWVNURU0KIE06CUphbiBLYXJhIDxqYWNrQHN1c2UuY3o+Ci1XOglodHRwOi8vbGludXgtdWRmLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91ZGYudHh0CiBGOglmcy91ZGYvCkBAIC03MjU3LDYgKzczNDAsNyBAQAogVzoJaHR0cDovL29wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbS9jb250ZW50L2xpbnV4LWRyaXZlcnMtd29sZnNvbi1kZXZpY2VzCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vaHdtb24vd204Mz8/CitGOglhcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMCoKIEY6CWRyaXZlcnMvbGVkcy9sZWRzLXdtODMqLmMKIEY6CWRyaXZlcnMvaW5wdXQvbWlzYy93bTgzMXgtb24uYwogRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTgzMXgtdHMuYwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCAwN2JjOTI1Li5kYWI4NjEwIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw4ICsxLDggQEAKIFZFUlNJT04gPSAzCi1QQVRDSExFVkVMID0gMQorUEFUQ0hMRVZFTCA9IDIKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0KLU5BTUUgPSAiRGl2ZW1hc3RlciBFZGl0aW9uIgorRVhUUkFWRVJTSU9OID0gLXJjMgorTkFNRSA9IFNhYmVyLXRvb3RoZWQgU3F1aXJyZWwKIAogIyAqRE9DVU1FTlRBVElPTioKICMgVG8gc2VlIGEgbGlzdCBvZiB0eXBpY2FsIHRhcmdldHMgZXhlY3V0ZSAibWFrZSBoZWxwIgpAQCAtOTgzLDcgKzk4Myw2IEBACiAKIHByZXBhcmUwOiBhcmNocHJlcGFyZSBGT1JDRQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4KLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMKIAogIyBBbGwgdGhlIHByZXBhcmluZy4uCiBwcmVwYXJlOiBwcmVwYXJlMApAQCAtMTE5OCw3ICsxMTk3LDcgQEAKIAlAZmluZCAkKHNyY3RyZWUpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCiAJCVwoIC1uYW1lICcqLm9yaWcnIC1vIC1uYW1lICcqLnJlaicgLW8gLW5hbWUgJyp+JyBcCiAJCS1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyMqIycgLW8gLW5hbWUgJy4qLm9yaWcnIFwKLQkJLW8gLW5hbWUgJy4qLnJlaicgLW8gLXNpemUgMCBcCisJCS1vIC1uYW1lICcuKi5yZWonIFwKIAkJLW8gLW5hbWUgJyolJyAtbyAtbmFtZSAnLiouY21kJyAtbyAtbmFtZSAnY29yZScgXCkgXAogCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCiAKQEAgLTEyOTYsNyArMTI5NSw2IEBACiAJQGVjaG8gICcJCTI6IHdhcm5pbmdzIHdoaWNoIG9jY3VyIHF1aXRlIG9mdGVuIGJ1dCBtYXkgc3RpbGwgYmUgcmVsZXZhbnQnCiAJQGVjaG8gICcJCTM6IG1vcmUgb2JzY3VyZSB3YXJuaW5ncywgY2FuIG1vc3QgbGlrZWx5IGJlIGlnbm9yZWQnCiAJQGVjaG8gICcJCU11bHRpcGxlIGxldmVscyBjYW4gYmUgY29tYmluZWQgd2l0aCBXPTEyIG9yIFc9MTIzJwotCUBlY2hvICAnICBtYWtlIFJFQ09SRE1DT1VOVF9XQVJOPTEgW3RhcmdldHNdIFdhcm4gYWJvdXQgaWdub3JlZCBtY291bnQgc2VjdGlvbnMnCiAJQGVjaG8gICcnCiAJQGVjaG8gICdFeGVjdXRlICJtYWtlIiBvciAibWFrZSBhbGwiIHRvIGJ1aWxkIGFsbCB0YXJnZXRzIG1hcmtlZCB3aXRoIFsqXSAnCiAJQGVjaG8gICdGb3IgZnVydGhlciBpbmZvIHNlZSB0aGUgLi9SRUFETUUgZmlsZScKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCA4YmI5MzYyLi4zZDc0ODAxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC00NDUsMTEgKzQ0NSw2IEBACiAJICBJcyB0aGlzIGEgbWFjaGluZSBiYXNlZCBvbiB0aGUgRVY2NyBjb3JlPyAgSWYgaW4gZG91YnQsIHNlbGVjdCBOIGhlcmUKIAkgIGFuZCB0aGUgbWFjaGluZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gRVY2LgogCi1jb25maWcgQUxQSEFfRVY3Ci0JYm9vbAotCWRlcGVuZHMgb24gQUxQSEFfTUFSVkVMCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBBTFBIQV9NQ1BDSUEKIAlib29sCiAJZGVwZW5kcyBvbiBBTFBIQV9SQVdISURFCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCA0YWM0OGEwLi4yMjA3ZmM2IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTQ1NywxMCArNDU3LDEyIEBACiAjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkJNDk5CiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkJNTAwCiAjZGVmaW5lIF9fTlJfc2V0bnMJCQk1MDEKKyNkZWZpbmUgX19OUl9hY2NlcHQ0CQkJNTAyCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCQk1MDMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9TWVNDQUxMUwkJCTUwMgorI2RlZmluZSBOUl9TWVNDQUxMUwkJCTUwNAogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMKaW5kZXggYTg3MjA3OC4uMDAwOTZkZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9pcm9uZ2F0ZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfaXJvbmdhdGUuYwpAQCAtMzAzLDYgKzMwMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAKICNkZWZpbmUgR0VUX1BBR0VfRElSX09GRihhZGRyKSAoYWRkciA+PiAyMikKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS1zeXNmcy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKaW5kZXggYjg5OWU5NS4uNTM2NDljNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLXN5c2ZzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IDAyMmMyNzQ4Li40MzYxMDgwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW9tbXUuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zZXR1cC5jCmluZGV4IGNjMGZkODYuLjMyZGU1NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBwYW5pY19ub3RpZmllcl9saXN0Owogc3RhdGljIGludCBhbHBoYV9wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c3RibHMuUwppbmRleCA2YWNlYTFmLi5lNTM0ZTFjIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXN0YmxzLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzdGJscy5TCkBAIC01MjAsNiArNTIwLDggQEAKIAkucXVhZCBzeXNfY2xvY2tfYWRqdGltZQogCS5xdWFkIHN5c19zeW5jZnMJCQkvKiA1MDAgKi8KIAkucXVhZCBzeXNfc2V0bnMKKwkucXVhZCBzeXNfYWNjZXB0NAorCS5xdWFkIHN5c19zZW5kbW1zZwogCiAJLnNpemUgc3lzX2NhbGxfdGFibGUsIC4gLSBzeXNfY2FsbF90YWJsZQogCS50eXBlIHN5c19jYWxsX3RhYmxlLCBAb2JqZWN0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCA4MDkwY2FkLi40NDc4OWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTI5LDYgKzI5LDcgQEAKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IEhBVkVfU1BBUlNFX0lSUQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IENQVV9QTSBpZiAoU1VTUEVORCB8fCBDUFVfSURMRSkKIAloZWxwCiAJICBUaGUgQVJNIHNlcmllcyBpcyBhIGxpbmUgb2YgbG93LXBvd2VyLWNvbnN1bXB0aW9uIFJJU0MgY2hpcCBkZXNpZ25zCiAJICBsaWNlbnNlZCBieSBBUk0gTHRkIGFuZCB0YXJnZXRlZCBhdCBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kCkBAIC0yMTEsNiArMjEyLDE5IEBACiAJICB0aGlzIGZlYXR1cmUgKGVnLCBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBzaW5nbGUgbWFjaGluZSkgYW5kCiAJICB5b3UgbmVlZCB0byBzaHJpbmsgdGhlIGtlcm5lbCB0byB0aGUgbWluaW1hbCBzaXplLgogCitjb25maWcgTkVFRF9NQUNIX01FTU9SWV9ICisJYm9vbAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHdoZW4gbWFjaC9tZW1vcnkuaCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNwZWNpYWwKKwkgIGRlZmluaXRpb25zIGZvciB0aGlzIHBsYXRmb3JtLiAgVGhlIG5lZWQgZm9yIG1hY2gvbWVtb3J5Lmggc2hvdWxkCisJICBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCisKK2NvbmZpZyBQSFlTX09GRlNFVAorCWhleCAiUGh5c2ljYWwgYWRkcmVzcyBvZiBtYWluIG1lbW9yeSIKKwlkZXBlbmRzIG9uICFBUk1fUEFUQ0hfUEhZU19WSVJUICYmICFORUVEX01BQ0hfTUVNT1JZX0gKKwloZWxwCisJICBQbGVhc2UgcHJvdmlkZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAgbG9jYXRpb24gb2YgbWFpbiBtZW1vcnkgaW4geW91ciBzeXN0ZW0uCiAKIGNvbmZpZyBHRU5FUklDX0JVRwogCWRlZl9ib29sIHkKQEAgLTI0Nyw2ICsyNjEsNyBAQAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IFBMQVRfVkVSU0FUSUxFCiAJc2VsZWN0IFBMQVRfVkVSU0FUSUxFX0ZQR0FfSVJRCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEFSTSdzIEludGVncmF0b3IgcGxhdGZvcm0uCiAKQEAgLTI2Miw2ICsyNzcsNyBAQAogCXNlbGVjdCBQTEFUX1ZFUlNBVElMRV9DTENECiAJc2VsZWN0IEFSTV9USU1FUl9TUDgwNAogCXNlbGVjdCBHUElPX1BMMDYxIGlmIEdQSU9MSUIKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEFSTSBMdGQgUmVhbFZpZXcgYm9hcmRzLgogCkBAIC0zMTgsMTAgKzMzNCwyNSBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIEJyb2FkY29tJ3MgQkNNUmluZyBwbGF0Zm9ybS4KIAorY29uZmlnIEFSQ0hfSElHSEJBTksKKwlib29sICJDYWx4ZWRhIEhpZ2hiYW5rLWJhc2VkIgorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBBUk1fQU1CQQorCXNlbGVjdCBBUk1fR0lDCisJc2VsZWN0IEFSTV9USU1FUl9TUDgwNAorCXNlbGVjdCBDTEtERVZfTE9PS1VQCisJc2VsZWN0IENQVV9WNworCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEhBVkVfQVJNX1NDVQorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgQ2FseGVkYSBIaWdoYmFuayBTb0MgYmFzZWQgYm9hcmRzLgorCiBjb25maWcgQVJDSF9DTFBTNzExWAogCWJvb2wgIkNpcnJ1cyBMb2dpYyBDTFBTNzExeC9FUDcyMXgtYmFzZWQiCiAJc2VsZWN0IENQVV9BUk03MjBUCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIENpcnJ1cyBMb2dpYyA3MTF4LzcyMXggYmFzZWQgYm9hcmRzLgogCkBAIC0zNjEsNiArMzkyLDcgQEAKIAlzZWxlY3QgSVNBCiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBUaGlzIGlzIGFuIGV2YWx1YXRpb24gYm9hcmQgZm9yIHRoZSBTdHJvbmdBUk0gcHJvY2Vzc29yIGF2YWlsYWJsZQogCSAgZnJvbSBEaWdpdGFsLiBJdCBoYXMgbGltaXRlZCBoYXJkd2FyZSBvbi1ib2FyZCwgaW5jbHVkaW5nIGFuCkBAIC0zNzYsNiArNDA4LDcgQEAKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwKIAlzZWxlY3QgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDaXJydXMgRVA5M3h4IHNlcmllcyBvZiBDUFVzLgogCkBAIC0zODUsNiArNDE4LDcgQEAKIAlzZWxlY3QgRk9PVEJSSURHRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIERDMjEyODUgY29tcGFuaW9uIGNoaXAKIAkgICgiRm9vdEJyaWRnZSIpLCBzdWNoIGFzIHRoZSBTaW10ZWMgQ0FUUyBhbmQgdGhlIFJlYmVsIE5ldFdpbmRlci4KQEAgLTM5Nyw2ICs0MzEsNyBAQAogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJc2VsZWN0IEhBVkVfU0NIRURfQ0xPQ0sKKwlzZWxlY3QgTVVMVElfSVJRX0hBTkRMRVIKIAloZWxwCiAJICBTdXBwb3J0IGZvciBGcmVlc2NhbGUgTVhDL2lNWC1iYXNlZCBmYW1pbHkgb2YgcHJvY2Vzc29ycwogCkBAIC00MzQsNiArNDY5LDcgQEAKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJc2VsZWN0IFZNU1BMSVRfMUcKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgU3VwcG9ydCBmb3IgSW50ZWwncyBJT1AxM1hYIChYU2NhbGUpIGZhbWlseSBvZiBwcm9jZXNzb3JzLgogCkBAIC00NjQsNiArNTAwLDcgQEAKIAlzZWxlY3QgQ1BVX1hTQzMKICAJc2VsZWN0IFBDSQogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIElYUDIzeHggKFhTY2FsZSkgZmFtaWx5IG9mIHByb2Nlc3NvcnMuCiAKQEAgLTQ3Myw2ICs1MTAsNyBAQAogCXNlbGVjdCBDUFVfWFNDQUxFCiAJc2VsZWN0IFBDSQogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVAorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIElYUDI0MDAvMjgwMCAoWFNjYWxlKSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KIApAQCAtNTU3LDYgKzU5NSw3IEBACiAJc2VsZWN0IFRJQ0tfT05FU0hPVAogCXNlbGVjdCBQTEFUX1BYQQogCXNlbGVjdCBTUEFSU0VfSVJRCisJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTWFydmVsbCdzIFBYQTE2OC9QWEE5MTAoTU1QKSBhbmQgTU1QMiBwcm9jZXNzb3IgbGluZS4KIApAQCAtNTY1LDYgKzYwNCw3IEBACiAJc2VsZWN0IENQVV9BUk05MjJUCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE1pY3JlbC9LZW5kaW4gS1M4Njk1ICJDZW50YXVyIiAoQVJNOTIyVCkgYmFzZWQKIAkgIFN5c3RlbS1vbi1DaGlwIGRldmljZXMuCkBAIC01ODUsMTQgKzYyNSw2IEBACiAJICA8aHR0cDovL3d3dy5udXZvdG9uLmNvbS9ocS9lbnUvUHJvZHVjdEFuZFNhbGVzL1Byb2R1Y3RMaW5lcy8KIAkJQ29uc3VtZXJFbGVjdHJvbmljc0lDL0FSTU1pY3JvY29udHJvbGxlci9BUk1NaWNyb2NvbnRyb2xsZXI+CiAKLWNvbmZpZyBBUkNIX05VQzkzWAotCWJvb2wgIk51dm90b24gTlVDOTNYIENQVSIKLQlzZWxlY3QgQ1BVX0FSTTkyNlQKLQlzZWxlY3QgQ0xLREVWX0xPT0tVUAotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIE51dm90b24gKFdpbmJvbmQgbG9naWMgZGVwdC4pIE5VQzkzWCBNQ1UsVGhlIE5VQzkzWCBpcyBhCi0JICBsb3ctcG93ZXIgYW5kIGhpZ2ggcGVyZm9ybWFuY2UgTVBFRy00L0pQRUcgbXVsdGltZWRpYSBjb250cm9sbGVyIGNoaXAuCi0KIGNvbmZpZyBBUkNIX1RFR1JBCiAJYm9vbCAiTlZJRElBIFRlZ3JhIgogCXNlbGVjdCBDTEtERVZfTE9PS1VQCkBAIC02MDYsNiArNjM4LDI0IEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgTlZJRElBIFRlZ3JhIGJhc2VkIHN5c3RlbXMgKFRlZ3JhIEFQWCwKIAkgIFRlZ3JhIDZ4eCBhbmQgVGVncmEgMiBzZXJpZXMpLgogCitjb25maWcgQVJDSF9QSUNPWENFTEwKKwlib29sICJQaWNvY2hpcCBwaWNvWGNlbGwiCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKKwlzZWxlY3QgQVJNX1ZJQworCXNlbGVjdCBDUFVfVjZLCisJc2VsZWN0IERXX0FQQl9USU1FUgorCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCisJc2VsZWN0IEhBVkVfVENNCisJc2VsZWN0IE5PX0lPUE9SVAorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgUGljb2NoaXAgcGljb1hjZWxsCisJICBmYW1pbHkgb2YgRmVtdG9jZWxsIGRldmljZXMuICBUaGUgcGljb3hjZWxsIHN1cHBvcnQgcmVxdWlyZXMgZGV2aWNlIHRyZWUKKwkgIGZvciBhbGwgYm9hcmRzLgorCiBjb25maWcgQVJDSF9QTlg0MDA4CiAJYm9vbCAiUGhpbGlwcyBOZXhwZXJpYSBQTlg0MDA4IE1vYmlsZSIKIAlzZWxlY3QgQ1BVX0FSTTkyNlQKQEAgLTY1Nyw2ICs3MDcsNyBAQAogCXNlbGVjdCBTUEFSU0VfSVJRCiAJc2VsZWN0IE1VTFRJX0lSUV9IQU5ETEVSCiAJc2VsZWN0IFBNX0dFTkVSSUNfRE9NQUlOUyBpZiBQTQorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBSZW5lc2FzJ3MgU0gtTW9iaWxlIGFuZCBSLU1vYmlsZSBBUk0gcGxhdGZvcm1zLgogCkBAIC02NzIsNiArNzIzLDcgQEAKIAlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCiAJc2VsZWN0IEhBVkVfSURFCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIE9uIHRoZSBBY29ybiBSaXNjLVBDLCBMaW51eCBjYW4gc3VwcG9ydCB0aGUgaW50ZXJuYWwgSURFIGRpc2sgYW5kCiAJICBDRC1ST00gaW50ZXJmYWNlLCBzZXJpYWwgYW5kIHBhcmFsbGVsIHBvcnQsIGFuZCB0aGUgZmxvcHB5IGRyaXZlLgpAQCAtNjkxLDYgKzc0Myw3IEBACiAJc2VsZWN0IFRJQ0tfT05FU0hPVAogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBIQVZFX0lERQorCXNlbGVjdCBORUVEX01BQ0hfTUVNT1JZX0gKIAloZWxwCiAJICBTdXBwb3J0IGZvciBTdHJvbmdBUk0gMTF4MCBiYXNlZCBib2FyZHMuCiAKQEAgLTcxNyw2ICs3NzAsNyBAQAogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgQVJNX1ZJQwogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBIQVZFX1RDTQogCXNlbGVjdCBDTEtERVZfTE9PS1VQCiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVApAQCAtNzI1LDkgKzc3OSw2IEBACiAJc2VsZWN0IFNBTVNVTkdfQ0xLU1JDCiAJc2VsZWN0IFNBTVNVTkdfSVJRX1ZJQ19USU1FUgogCXNlbGVjdCBTM0NfR1BJT19UUkFDSwotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQRE9XTgotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDMjRYWAotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDNjRYWAogCXNlbGVjdCBTM0NfREVWX05BTkQKIAlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKIAlzZWxlY3QgU0FNU1VOR19HUElPTElCXzRCSVQKQEAgLTc4MiwxMSArODMzLDEyIEBACiAJc2VsZWN0IEhBVkVfUzNDMjQxMF9JMkMgaWYgSTJDCiAJc2VsZWN0IEhBVkVfUzNDX1JUQyBpZiBSVENfQ0xBU1MKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX1dBVENIRE9HIGlmIFdBVENIRE9HCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFNhbXN1bmcgUzVQVjIxMC9TNVBDMTEwIHNlcmllcyBiYXNlZCBzeXN0ZW1zCiAKLWNvbmZpZyBBUkNIX0VYWU5PUzQKLQlib29sICJTYW1zdW5nIEVYWU5PUzQiCitjb25maWcgQVJDSF9FWFlOT1MKKwlib29sICJTQU1TVU5HIEVYWU5PUyIKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCXNlbGVjdCBBUkNIX0hBU19IT0xFU19NRU1PUllNT0RFTApAQCAtNzk4LDggKzg1MCw5IEBACiAJc2VsZWN0IEhBVkVfUzNDX1JUQyBpZiBSVENfQ0xBU1MKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX0kyQyBpZiBJMkMKIAlzZWxlY3QgSEFWRV9TM0MyNDEwX1dBVENIRE9HIGlmIFdBVENIRE9HCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKLQkgIFNhbXN1bmcgRVhZTk9TNCBzZXJpZXMgYmFzZWQgc3lzdGVtcworCSAgU3VwcG9ydCBmb3IgU0FNU1VORydzIEVYWU5PUyBTb0NzIChFWFlOT1M0LzUpCiAKIGNvbmZpZyBBUkNIX1NIQVJLCiAJYm9vbCAiU2hhcmsiCkBAIC04MDksNiArODYyLDcgQEAKIAlzZWxlY3QgWk9ORV9ETUEKIAlzZWxlY3QgUENJCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCisJc2VsZWN0IE5FRURfTUFDSF9NRU1PUllfSAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBTdHJvbmdBUk0gYmFzZWQgRGlnaXRhbCBETkFSRCBtYWNoaW5lLCBhbHNvIGtub3duCiAJICBhcyAiU2hhcmsiICg8aHR0cDovL3d3dy5zaGFyay1saW51eC5kZS9zaGFyay5odG1sPikuCkBAIC04MzEsMTEgKzg4NSwxNCBAQAogCXNlbGVjdCBIQVZFX1NDSEVEX0NMT0NLCiAJc2VsZWN0IEhBVkVfVENNCiAJc2VsZWN0IEFSTV9BTUJBCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKIAlzZWxlY3QgQVJNX1ZJQwogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IENMS0RFVl9MT09LVVAKIAlzZWxlY3QgSEFWRV9NQUNIX0NMS0RFVgogCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU1QtRXJpY3Nzb24gVTMwMCBzZXJpZXMgbW9iaWxlIHBsYXRmb3Jtcy4KIApAQCAtOTc5LDggKzEwMzYsNiBAQAogc291cmNlICJhcmNoL2FybS9tYWNoLW5vbWFkaWsvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hcm0vcGxhdC1ub21hZGlrL0tjb25maWciCiAKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1udWM5M3gvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWciCkBAIC0xMDI0LDcgKzEwNzksNyBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnIgogCi1zb3VyY2UgImFyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnIgorc291cmNlICJhcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZyIKIApAQCAtMTM3NCw3ICsxNDI5LDcgQEAKIAlkZXBlbmRzIG9uIFJFQUxWSUVXX0VCX0FSTTExTVAgfHwgUkVBTFZJRVdfRUJfQTlNUCB8fCBcCiAJCSBNQUNIX1JFQUxWSUVXX1BCMTFNUCB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBBUkNIX09NQVA0IHx8IFwKIAkJIEFSQ0hfRVhZTk9TNCB8fCBBUkNIX1RFR1JBIHx8IEFSQ0hfVTg1MDAgfHwgQVJDSF9WRVhQUkVTU19DQTlYNCB8fCBcCi0JCSBBUkNIX01TTV9TQ09SUElPTk1QIHx8IEFSQ0hfU0hNT0JJTEUKKwkJIEFSQ0hfTVNNX1NDT1JQSU9OTVAgfHwgQVJDSF9TSE1PQklMRSB8fCBBUkNIX0hJR0hCQU5LIHx8IFNPQ19JTVg2UQogCWRlcGVuZHMgb24gTU1VCiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTCiAJc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiAhQVJDSF9NU01fU0NPUlBJT05NUApAQCAtMTgzNCw2ICsxODg5LDM4IEBACiAKIGVuZGNob2ljZQogCitjb25maWcgQVJNX0FQUEVOREVEX0RUQgorCWJvb2wgIlVzZSBhcHBlbmRlZCBkZXZpY2UgdHJlZSBibG9iIHRvIHpJbWFnZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE9GICYmICFaQk9PVF9ST00gJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiwgdGhlIGJvb3QgY29kZSB3aWxsIGxvb2sgZm9yIGEgZGV2aWNlIHRyZWUgYmluYXJ5CisJICAoRFRCKSBhcHBlbmRlZCB0byB6SW1hZ2UKKwkgIChlLmcuIGNhdCB6SW1hZ2UgPGZpbGVuYW1lPi5kdGIgPiB6SW1hZ2Vfd19kdGIpLgorCisJICBUaGlzIGlzIG1lYW50IGFzIGEgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBjb252ZW5pZW5jZSBmb3IgdGhvc2UKKwkgIHN5c3RlbXMgd2l0aCBhIGJvb3Rsb2FkZXIgdGhhdCBjYW4ndCBiZSB1cGdyYWRlZCB0byBhY2NvbW1vZGF0ZQorCSAgdGhlIGRvY3VtZW50ZWQgYm9vdCBwcm90b2NvbCB1c2luZyBhIGRldmljZSB0cmVlLgorCisJICBCZXdhcmUgdGhhdCB0aGVyZSBpcyB2ZXJ5IGxpdHRsZSBpbiB0ZXJtcyBvZiBwcm90ZWN0aW9uIGFnYWluc3QKKwkgIHRoaXMgb3B0aW9uIGJlaW5nIGNvbmZ1c2VkIGJ5IGxlZnRvdmVyIGdhcmJhZ2UgaW4gbWVtb3J5IHRoYXQgbWlnaHQKKwkgIGxvb2sgbGlrZSBhIERUQiBoZWFkZXIgYWZ0ZXIgYSByZWJvb3QgaWYgbm8gYWN0dWFsIERUQiBpcyBhcHBlbmRlZAorCSAgdG8gekltYWdlLiAgRG8gbm90IGxlYXZlIHRoaXMgb3B0aW9uIGFjdGl2ZSBpbiBhIHByb2R1Y3Rpb24ga2VybmVsCisJICBpZiB5b3UgZG9uJ3QgaW50ZW5kIHRvIGFsd2F5cyBhcHBlbmQgYSBEVEIuICBQcm9wZXIgcGFzc2luZyBvZiB0aGUKKwkgIGxvY2F0aW9uIGludG8gcjIgb2YgYSBib290bG9hZGVyIHByb3ZpZGVkIERUQiBpcyBhbHdheXMgcHJlZmVyYWJsZQorCSAgdG8gdGhpcyBvcHRpb24uCisKK2NvbmZpZyBBUk1fQVRBR19EVEJfQ09NUEFUCisJYm9vbCAiU3VwcGxlbWVudCB0aGUgYXBwZW5kZWQgRFRCIHdpdGggdHJhZGl0aW9uYWwgQVRBRyBpbmZvcm1hdGlvbiIKKwlkZXBlbmRzIG9uIEFSTV9BUFBFTkRFRF9EVEIKKwloZWxwCisJICBTb21lIG9sZCBib290bG9hZGVycyBjYW4ndCBiZSB1cGRhdGVkIHRvIGEgRFRCIGNhcGFibGUgb25lLCB5ZXQKKwkgIHRoZXkgcHJvdmlkZSBBVEFHcyB3aXRoIG1lbW9yeSBjb25maWd1cmF0aW9uLCB0aGUgcmFtZGlzayBhZGRyZXNzLAorCSAgdGhlIGtlcm5lbCBjbWRsaW5lIHN0cmluZywgZXRjLiAgU3VjaCBpbmZvcm1hdGlvbiBpcyBkeW5hbWljYWxseQorCSAgcHJvdmlkZWQgYnkgdGhlIGJvb3Rsb2FkZXIgYW5kIGNhbid0IGFsd2F5cyBiZSBzdG9yZWQgaW4gYSBzdGF0aWMKKwkgIERUQi4gIFRvIGFsbG93IGEgZGV2aWNlIHRyZWUgZW5hYmxlZCBrZXJuZWwgdG8gYmUgdXNlZCB3aXRoIHN1Y2gKKwkgIGJvb3Rsb2FkZXJzLCB0aGlzIG9wdGlvbiBhbGxvd3MgekltYWdlIHRvIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uCisJICBmcm9tIHRoZSBBVEFHIGxpc3QgYW5kIHN0b3JlIGl0IGF0IHJ1biB0aW1lIGludG8gdGhlIGFwcGVuZGVkIERUQi4KKwogY29uZmlnIENNRExJTkUKIAlzdHJpbmcgIkRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nIgogCWRlZmF1bHQgIiIKQEAgLTE5ODAsNiArMjA2Nyw3IEBACiAJYm9vbAogCWRlcGVuZHMgb24gQ1BVX0ZSRVEgJiYgQVJDSF9QWEEgJiYgUFhBMjV4CiAJZGVmYXVsdCB5CisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCiAJc2VsZWN0IENQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRQogCiBjb25maWcgQ1BVX0ZSRVFfUzNDCkBAIC0yMTIzLDcgKzIyMTEsNyBAQAogc291cmNlICJrZXJuZWwvcG93ZXIvS2NvbmZpZyIKIAogY29uZmlnIEFSQ0hfU1VTUEVORF9QT1NTSUJMRQotCWRlcGVuZHMgb24gIUFSQ0hfUzVQNjRYMCAmJiAhQVJDSF9TNVBDMTAwCisJZGVwZW5kcyBvbiAhQVJDSF9TNVBDMTAwCiAJZGVwZW5kcyBvbiBDUFVfQVJNOTIwVCB8fCBDUFVfQVJNOTI2VCB8fCBDUFVfU0ExMTAwIHx8IFwKIAkJQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX1Y3IHx8IENQVV9YU0MzIHx8IENQVV9YU0NBTEUKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwppbmRleCBkZjNlYjNjLi5jNTIxM2U3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKQEAgLTEyOCw2ICsxMjgsMTI1IEBACiAJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0CiAJCSAgdGhlaXIgb3V0cHV0IHRvIHRoZSBzZWNvbmQgc2VyaWFsIHBvcnQgb24gdGhlc2UgZGV2aWNlcy4KIAorCWNvbmZpZyBERUJVR19ISUdIQkFOS19VQVJUCisJCWJvb2wgIktlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIG1lc3NhZ2VzIHZpYSBIaWdoYmFuayBVQVJUIgorCQlkZXBlbmRzIG9uIEFSQ0hfSElHSEJBTksKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byB0aGUgVUFSVCBvbiBIaWdoYmFuayBiYXNlZCBkZXZpY2VzLgorCisJY29uZmlnIERFQlVHX0lNWDFfVUFSVAorCQlib29sICJpLk1YMSBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgxCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YMS4KKworCWNvbmZpZyBERUJVR19JTVgyM19VQVJUCisJCWJvb2wgImkuTVgyMyBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgyMworCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDIzLgorCisJY29uZmlnIERFQlVHX0lNWDI1X1VBUlQKKwkJYm9vbCAiaS5NWDI1IERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDI1CisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YMjUuCisKKwljb25maWcgREVCVUdfSU1YMjFfSU1YMjdfVUFSVAorCQlib29sICJpLk1YMjEgYW5kIGkuTVgyNyBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVgyMSB8fCBTT0NfSU1YMjcKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQga2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgc3VwcG9ydAorCQkgIG9uIGkuTVgyMSBvciBpLk1YMjcuCisKKwljb25maWcgREVCVUdfSU1YMjhfVUFSVAorCQlib29sICJpLk1YMjggRGVidWcgVUFSVCIKKwkJZGVwZW5kcyBvbiBTT0NfSU1YMjgKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQga2VybmVsIGxvdy1sZXZlbCBkZWJ1Z2dpbmcgc3VwcG9ydAorCQkgIG9uIGkuTVgyOC4KKworCWNvbmZpZyBERUJVR19JTVgzMV9JTVgzNV9VQVJUCisJCWJvb2wgImkuTVgzMSBhbmQgaS5NWDM1IERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDMxIHx8IFNPQ19JTVgzNQorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDMxIG9yIGkuTVgzNS4KKworCWNvbmZpZyBERUJVR19JTVg1MV9VQVJUCisJCWJvb2wgImkuTVg1MSBEZWJ1ZyBVQVJUIgorCQlkZXBlbmRzIG9uIFNPQ19JTVg1MQorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBrZXJuZWwgbG93LWxldmVsIGRlYnVnZ2luZyBzdXBwb3J0CisJCSAgb24gaS5NWDUxLgorCisJY29uZmlnIERFQlVHX0lNWDUwX0lNWDUzX1VBUlQKKwkJYm9vbCAiaS5NWDUwIGFuZCBpLk1YNTMgRGVidWcgVUFSVCIKKwkJZGVwZW5kcyBvbiBTT0NfSU1YNTAgfHwgU09DX0lNWDUzCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YNTAgb3IgaS5NWDUzLgorCisJY29uZmlnIERFQlVHX0lNWDZRX1VBUlQKKwkJYm9vbCAiaS5NWDZRIERlYnVnIFVBUlQiCisJCWRlcGVuZHMgb24gU09DX0lNWDZRCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb3ctbGV2ZWwgZGVidWdnaW5nIHN1cHBvcnQKKwkJICBvbiBpLk1YNlEuCisKKwljb25maWcgREVCVUdfUzNDX1VBUlQwCisJCWRlcGVuZHMgb24gUExBVF9TQU1TVU5HCisJCWJvb2wgIlVzZSBTM0MgVUFSVCAwIGZvciBsb3ctbGV2ZWwgZGVidWciCisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBkZWJ1ZyBwcmludCByb3V0aW5lcyB0byBkaXJlY3QKKwkJICB0aGVpciBvdXRwdXQgdG8gVUFSVCAwLiBUaGUgcG9ydCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAorCQkgIGJ5IHRoZSBib290LWxvYWRlciBiZWZvcmUgdXNlLgorCisJCSAgVGhlIHVuY29tcHJlc3NvciBjb2RlIHBvcnQgY29uZmlndXJhdGlvbiBpcyBub3cgaGFuZGxlZAorCQkgIGJ5IENPTkZJR19TM0NfTE9XTEVWRUxfVUFSVF9QT1JULgorCisJY29uZmlnIERFQlVHX1MzQ19VQVJUMQorCQlkZXBlbmRzIG9uIFBMQVRfU0FNU1VORworCQlib29sICJVc2UgUzNDIFVBUlQgMSBmb3IgbG93LWxldmVsIGRlYnVnIgorCQloZWxwCisJCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgcHJpbnQgcm91dGluZXMgdG8gZGlyZWN0CisJCSAgdGhlaXIgb3V0cHV0IHRvIFVBUlQgMS4gVGhlIHBvcnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKKwkJICBieSB0aGUgYm9vdC1sb2FkZXIgYmVmb3JlIHVzZS4KKworCQkgIFRoZSB1bmNvbXByZXNzb3IgY29kZSBwb3J0IGNvbmZpZ3VyYXRpb24gaXMgbm93IGhhbmRsZWQKKwkJICBieSBDT05GSUdfUzNDX0xPV0xFVkVMX1VBUlRfUE9SVC4KKworCWNvbmZpZyBERUJVR19TM0NfVUFSVDIKKwkJZGVwZW5kcyBvbiBQTEFUX1NBTVNVTkcKKwkJYm9vbCAiVXNlIFMzQyBVQVJUIDIgZm9yIGxvdy1sZXZlbCBkZWJ1ZyIKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byBVQVJUIDIuIFRoZSBwb3J0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCisJCSAgYnkgdGhlIGJvb3QtbG9hZGVyIGJlZm9yZSB1c2UuCisKKwkJICBUaGUgdW5jb21wcmVzc29yIGNvZGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdyBoYW5kbGVkCisJCSAgYnkgQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQuCisKKwljb25maWcgREVCVUdfUkVBTFZJRVdfU1REX1BPUlQKKwkJYm9vbCAiUmVhbFZpZXcgRGVmYXVsdCBVQVJUIgorCQlkZXBlbmRzIG9uIEFSQ0hfUkVBTFZJRVcKKwkJaGVscAorCQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGRlYnVnIHByaW50IHJvdXRpbmVzIHRvIGRpcmVjdAorCQkgIHRoZWlyIG91dHB1dCB0byB0aGUgc2VyaWFsIHBvcnQgb24gUmVhbFZpZXcgRUIsIFBCMTFNUCwgUEJBOAorCQkgIGFuZCBQQlggcGxhdGZvcm1zLgorCisJY29uZmlnIERFQlVHX1JFQUxWSUVXX1BCMTE3Nl9QT1JUCisJCWJvb2wgIlJlYWxWaWV3IFBCMTE3NiBVQVJUIgorCQlkZXBlbmRzIG9uIE1BQ0hfUkVBTFZJRVdfUEIxMTc2CisJCWhlbHAKKwkJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBkZWJ1ZyBwcmludCByb3V0aW5lcyB0byBkaXJlY3QKKwkJICB0aGVpciBvdXRwdXQgdG8gdGhlIHN0YW5kYXJkIHNlcmlhbCBwb3J0IG9uIHRoZSBSZWFsVmlldworCQkgIFBCMTE3NiBwbGF0Zm9ybS4KKwogZW5kY2hvaWNlCiAKIGNvbmZpZyBFQVJMWV9QUklOVEsKQEAgLTE0NiwxNiArMjY1LDEwIEBACiAJICBidWZmZXIgZHJpdmVyIHRoYXQgd2lsbCBhbGxvdyB5b3UgdG8gY29sbGVjdCB0cmFjZXMgb2YgdGhlCiAJICBrZXJuZWwgY29kZS4KIAotY29uZmlnIERFQlVHX1MzQ19VQVJUCi0JZGVwZW5kcyBvbiBQTEFUX1NBTVNVTkcKLQlpbnQgIlMzQyBVQVJUIHRvIHVzZSBmb3IgbG93LWxldmVsIGRlYnVnIgotCWRlZmF1bHQgIjAiCitjb25maWcgQVJNX0tQUk9CRVNfVEVTVAorCXRyaXN0YXRlICJLcHJvYmVzIHRlc3QgbW9kdWxlIgorCWRlcGVuZHMgb24gS1BST0JFUyAmJiBNT0RVTEVTCiAJaGVscAotCSAgQ2hvaWNlIGZvciBVQVJUIGZvciBrZXJuZWwgbG93LWxldmVsIHVzaW5nIFMzQyBVQVJUUywKLQkgIHNob3VsZCBiZSBiZXR3ZWVuIHplcm8gYW5kIHR3by4gVGhlIHBvcnQgbXVzdCBoYXZlIGJlZW4KLQkgIGluaXRpYWxpc2VkIGJ5IHRoZSBib290LWxvYWRlciBiZWZvcmUgdXNlLgotCi0JICBUaGUgdW5jb21wcmVzc29yIGNvZGUgcG9ydCBjb25maWd1cmF0aW9uIGlzIG5vdyBoYW5kbGVkCi0JICBieSBDT05GSUdfUzNDX0xPV0xFVkVMX1VBUlRfUE9SVC4KKwkgIFBlcmZvcm0gdGVzdHMgb2Yga3Byb2JlcyBBUEkgYW5kIGluc3RydWN0aW9uIHNldCBzaW11bGF0aW9uLgogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDU2NjVjMmEuLmRmY2YzYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNDQsNiArMTQ0LDcgQEAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9FUDkzWFgpCQk6PSBlcDkzeHgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9HRU1JTkkpCQk6PSBnZW1pbmkKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9INzIwWCkJCTo9IGg3MjB4CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfSElHSEJBTkspCQk6PSBoaWdoYmFuawogbWFjaGluZS0kKENPTkZJR19BUkNIX0lOVEVHUkFUT1IpCTo9IGludGVncmF0b3IKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JT1AxM1hYKQkJOj0gaW9wMTN4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX0lPUDMyWCkJCTo9IGlvcDMyeApAQCAtMTU3LDEwICsxNTgsOCBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX01NUCkJCTo9IG1tcAogbWFjaGluZS0kKENPTkZJR19BUkNIX01TTSkJCTo9IG1zbQogbWFjaGluZS0kKENPTkZJR19BUkNIX01WNzhYWDApCQk6PSBtdjc4eHgwCi1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgxKQkJOj0gaW14Ci1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyKQkJOj0gaW14Ci1tYWNoaW5lLSQoQ09ORklHX0FSQ0hfTVgyNSkJCTo9IGlteAotbWFjaGluZS0kKENPTkZJR19BUkNIX01YMykJCTo9IGlteAorbWFjaGluZS0kKENPTkZJR19BUkNIX0lNWF9WNF9WNSkJOj0gaW14CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU1YX1Y2X1Y3KQk6PSBpbXgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWDUpCQk6PSBteDUKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9NWFMpCQk6PSBteHMKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9ORVRYKQkJOj0gbmV0eApAQCAtMTcwLDYgKzE2OSw3IEBACiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfT01BUDMpCQk6PSBvbWFwMgogbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVA0KQkJOj0gb21hcDIKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PUklPTjVYKQkJOj0gb3Jpb241eAorbWFjaGluZS0kKENPTkZJR19BUkNIX1BJQ09YQ0VMTCkJOj0gcGljb3hjZWxsCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUE5YNDAwOCkJCTo9IHBueDQwMDgKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9QUklNQTIpCQk6PSBwcmltYTIKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9QWEEpCQk6PSBweGEKQEAgLTE4MCw3ICsxODAsNyBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX1M1UDY0WDApCQk6PSBzNXA2NHgwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfUzVQQzEwMCkJCTo9IHM1cGMxMDAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TNVBWMjEwKQkJOj0gczVwdjIxMAotbWFjaGluZS0kKENPTkZJR19BUkNIX0VYWU5PUzQpCQk6PSBleHlub3M0CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfRVhZTk9TNCkJCTo9IGV4eW5vcwogbWFjaGluZS0kKENPTkZJR19BUkNIX1NBMTEwMCkJCTo9IHNhMTEwMAogbWFjaGluZS0kKENPTkZJR19BUkNIX1NIQVJLKQkJOj0gc2hhcmsKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9TSE1PQklMRSkgCTo9IHNobW9iaWxlCkBAIC0xOTIsNyArMTkyLDYgQEAKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9WRVhQUkVTUykJCTo9IHZleHByZXNzCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVlQ4NTAwKQkJOj0gdnQ4NTAwCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfVzkwWDkwMCkJCTo9IHc5MHg5MDAKLW1hY2hpbmUtJChDT05GSUdfQVJDSF9OVUM5M1gpCQk6PSBudWM5M3gKIG1hY2hpbmUtJChDT05GSUdfRk9PVEJSSURHRSkJCTo9IGZvb3RicmlkZ2UKIG1hY2hpbmUtJChDT05GSUdfTUFDSF9TUEVBUjMwMCkJCTo9IHNwZWFyM3h4CiBtYWNoaW5lLSQoQ09ORklHX01BQ0hfU1BFQVIzMTApCQk6PSBzcGVhcjN4eApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkLy5naXRpZ25vcmUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQppbmRleCBjNjAyODk2Li5lMDkzNmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQpAQCAtNSwzICs1LDEyIEBACiBwaWdneS5sem1hCiB2bWxpbnV4CiB2bWxpbnV4LmxkcworCisjIGJvcnJvd2VkIGxpYmZkdCBmaWxlcworZmR0LmMKK2ZkdC5oCitmZHRfcm8uYworZmR0X3J3LmMKK2ZkdF93aXAuYworbGliZmR0LmgKK2xpYmZkdF9pbnRlcm5hbC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggYTZiMzBiMy4uMjFmNTZmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMjYsNiArMjYsMTAgQEAKIE9CSlMJKz0gbWlzYy5vIGRlY29tcHJlc3MubwogRk9OVEMJPSAkKHNyY3RyZWUpL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mb250X2Fjb3JuXzh4OC5jCiAKKyMgc3RyaW5nIGxpYnJhcnkgY29kZSAoLU9zIGlzIGVuZm9yY2VkIHRvIGtlZXAgaXQgbXVjaCBzbWFsbGVyKQorT0JKUwkJKz0gc3RyaW5nLm8KK0NGTEFHU19zdHJpbmcubwk6PSAtT3MKKwogIwogIyBBcmNoaXRlY3R1cmUgZGVwZW5kZW5jaWVzCiAjCkBAIC04OSwyMSArOTMsNDEgQEAKIHN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpPKSAgPSBsem8KIHN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpNQSkgPSBsem1hCiAKKyMgQm9ycm93ZWQgbGliZmR0IGZpbGVzIGZvciB0aGUgQVRBRyBjb21wYXRpYmlsaXR5IG1vZGUKKworbGliZmR0CQk6PSBmZHRfcncuYyBmZHRfcm8uYyBmZHRfd2lwLmMgZmR0LmMKK2xpYmZkdF9oZHJzCTo9IGZkdC5oIGxpYmZkdC5oIGxpYmZkdF9pbnRlcm5hbC5oCisKK2xpYmZkdF9vYmpzCTo9ICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQobGliZmR0KSkpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHQpICQobGliZmR0X2hkcnMpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvc2NyaXB0cy9kdGMvbGliZmR0LyUKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHRfb2JqcykgYXRhZ3NfdG9fZmR0Lm8pOiBcCisJJChhZGRwcmVmaXggJChvYmopLywkKGxpYmZkdF9oZHJzKSkKKworaWZlcSAoJChDT05GSUdfQVJNX0FUQUdfRFRCX0NPTVBBVCkseSkKK09CSlMJKz0gJChsaWJmZHRfb2JqcykgYXRhZ3NfdG9fZmR0Lm8KK2VuZGlmCisKIHRhcmdldHMgICAgICAgOj0gdm1saW51eCB2bWxpbnV4LmxkcyBcCiAJCSBwaWdneS4kKHN1ZmZpeF95KSBwaWdneS4kKHN1ZmZpeF95KS5vIFwKLQkJIGZvbnQubyBmb250LmMgaGVhZC5vIG1pc2MubyAkKE9CSlMpCisJCSBsaWIxZnVuY3MubyBsaWIxZnVuY3MuUyBmb250Lm8gZm9udC5jIGhlYWQubyBtaXNjLm8gJChPQkpTKQogCiAjIE1ha2Ugc3VyZSBmaWxlcyBhcmUgcmVtb3ZlZCBkdXJpbmcgY2xlYW4KLWV4dHJhLXkgICAgICAgKz0gcGlnZ3kuZ3ppcCBwaWdneS5sem8gcGlnZ3kubHptYSBsaWIxZnVuY3MuUworZXh0cmEteSAgICAgICArPSBwaWdneS5nemlwIHBpZ2d5Lmx6byBwaWdneS5sem1hIGxpYjFmdW5jcy5TICQobGliZmR0KSAkKGxpYmZkdF9oZHJzKQogCiBpZmVxICgkKENPTkZJR19GVU5DVElPTl9UUkFDRVIpLHkpCiBPUklHX0NGTEFHUyA6PSAkKEtCVUlMRF9DRkxBR1MpCiBLQlVJTERfQ0ZMQUdTID0gJChzdWJzdCAtcGcsICwgJChPUklHX0NGTEFHUykpCiBlbmRpZgogCi1jY2ZsYWdzLXkgOj0gLWZwaWMgLWZuby1idWlsdGluCitjY2ZsYWdzLXkgOj0gLWZwaWMgLWZuby1idWlsdGluIC1JJChvYmopCiBhc2ZsYWdzLXkgOj0gLVdhLC1tYXJjaD1hbGwKIAorIyBTdXBwbHkga2VybmVsIEJTUyBzaXplIHRvIHRoZSBkZWNvbXByZXNzb3IgdmlhIGEgbGlua2VyIHN5bWJvbC4KK0tCU1NfU1ogPSAkKHNoZWxsIHNpemUgJChvYmopLy4uLy4uLy4uLy4uL3ZtbGludXggfCBhd2sgJ0VORHtwcmludCAkJDN9JykKK0xERkxBR1Nfdm1saW51eCA9IC0tZGVmc3ltIF9rZXJuZWxfYnNzX3NpemU9JChLQlNTX1NaKQogIyBTdXBwbHkgWlJFTEFERFIgdG8gdGhlIGRlY29tcHJlc3NvciB2aWEgYSBsaW5rZXIgc3ltYm9sLgogaWZuZXEgKCQoQ09ORklHX0FVVE9fWlJFTEFERFIpLHkpCiBMREZMQUdTX3ZtbGludXggKz0gLS1kZWZzeW0genJlbGFkZHI9JChaUkVMQUREUikKQEAgLTEyMyw3ICsxNDcsNyBAQAogIyBGb3IgX19hZWFiaV91aWRpdm1vZAogbGliMWZ1bmNzID0gJChvYmopL2xpYjFmdW5jcy5vCiAKLSQob2JqKS9saWIxZnVuY3MuUzogJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvbGliL2xpYjFmdW5jcy5TIEZPUkNFCiskKG9iaikvbGliMWZ1bmNzLlM6ICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2xpYi9saWIxZnVuY3MuUwogCSQoY2FsbCBjbWQsc2hpcHBlZCkKIAogIyBXZSBuZWVkIHRvIHByZXZlbnQgYW55IEdPVE9GRiByZWxvY3MgYmVpbmcgdXNlZCB3aXRoIHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9hdGFnc190b19mZHQuYyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9hdGFnc190b19mZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2UxMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2F0YWdzX3RvX2ZkdC5jCkBAIC0wLDAgKzEsOTcgQEAKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKworc3RhdGljIGludCBub2RlX29mZnNldCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCkKK3sKKwlpbnQgb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGZkdCwgbm9kZV9wYXRoKTsKKwlpZiAob2Zmc2V0ID09IC1GRFRfRVJSX05PVEZPVU5EKQorCQlvZmZzZXQgPSBmZHRfYWRkX3N1Ym5vZGUoZmR0LCAwLCBub2RlX3BhdGgpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0cHJvcCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwgY29uc3QgY2hhciAqcHJvcGVydHksCisJCSAgIHVpbnQzMl90ICp2YWxfYXJyYXksIGludCBzaXplKQoreworCWludCBvZmZzZXQgPSBub2RlX29mZnNldChmZHQsIG5vZGVfcGF0aCk7CisJaWYgKG9mZnNldCA8IDApCisJCXJldHVybiBvZmZzZXQ7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGZkdCwgb2Zmc2V0LCBwcm9wZXJ0eSwgdmFsX2FycmF5LCBzaXplKTsKK30KKworc3RhdGljIGludCBzZXRwcm9wX3N0cmluZyh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwKKwkJCSAgY29uc3QgY2hhciAqcHJvcGVydHksIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgb2Zmc2V0ID0gbm9kZV9vZmZzZXQoZmR0LCBub2RlX3BhdGgpOworCWlmIChvZmZzZXQgPCAwKQorCQlyZXR1cm4gb2Zmc2V0OworCXJldHVybiBmZHRfc2V0cHJvcF9zdHJpbmcoZmR0LCBvZmZzZXQsIHByb3BlcnR5LCBzdHJpbmcpOworfQorCitzdGF0aWMgaW50IHNldHByb3BfY2VsbCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGVfcGF0aCwKKwkJCWNvbnN0IGNoYXIgKnByb3BlcnR5LCB1aW50MzJfdCB2YWwpCit7CisJaW50IG9mZnNldCA9IG5vZGVfb2Zmc2V0KGZkdCwgbm9kZV9wYXRoKTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gZmR0X3NldHByb3BfY2VsbChmZHQsIG9mZnNldCwgcHJvcGVydHksIHZhbCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuZCBmb2xkIHByb3ZpZGVkIEFUQUdzIGludG8gdGhlIHByb3ZpZGVkIEZEVC4KKyAqCisgKiBSRXR1cm4gdmFsdWVzOgorICogICAgPSAwIC0+IHByZXRlbmQgc3VjY2VzcworICogICAgPSAxIC0+IGJhZCBBVEFHIChtYXkgcmV0cnkgd2l0aCBhbm90aGVyIHBvc3NpYmxlIEFUQUcgcG9pbnRlcikKKyAqICAgIDwgMCAtPiBlcnJvciBmcm9tIGxpYmZkdAorICovCitpbnQgYXRhZ3NfdG9fZmR0KHZvaWQgKmF0YWdfbGlzdCwgdm9pZCAqZmR0LCBpbnQgdG90YWxfc3BhY2UpCit7CisJc3RydWN0IHRhZyAqYXRhZyA9IGF0YWdfbGlzdDsKKwl1aW50MzJfdCBtZW1fcmVnX3Byb3BlcnR5WzIgKiBOUl9CQU5LU107CisJaW50IG1lbWNvdW50ID0gMDsKKwlpbnQgcmV0OworCisJLyogbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhbiBhbGlnbmVkIHBvaW50ZXIgKi8KKwlpZiAoKHUzMilhdGFnX2xpc3QgJiAweDMpCisJCXJldHVybiAxOworCisJLyogaWYgd2UgZ2V0IGEgRFRCIGhlcmUgd2UncmUgZG9uZSBhbHJlYWR5ICovCisJaWYgKCoodTMyICopYXRhZ19saXN0ID09IGZkdDMyX3RvX2NwdShGRFRfTUFHSUMpKQorCSAgICAgICByZXR1cm4gMDsKKworCS8qIHZhbGlkYXRlIHRoZSBBVEFHICovCisJaWYgKGF0YWctPmhkci50YWcgIT0gQVRBR19DT1JFIHx8CisJICAgIChhdGFnLT5oZHIuc2l6ZSAhPSB0YWdfc2l6ZSh0YWdfY29yZSkgJiYKKwkgICAgIGF0YWctPmhkci5zaXplICE9IDIpKQorCQlyZXR1cm4gMTsKKworCS8qIGxldCdzIGdpdmUgaXQgYWxsIHRoZSByb29tIGl0IGNvdWxkIG5lZWQgKi8KKwlyZXQgPSBmZHRfb3Blbl9pbnRvKGZkdCwgZmR0LCB0b3RhbF9zcGFjZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3JfZWFjaF90YWcoYXRhZywgYXRhZ19saXN0KSB7CisJCWlmIChhdGFnLT5oZHIudGFnID09IEFUQUdfQ01ETElORSkgeworCQkJc2V0cHJvcF9zdHJpbmcoZmR0LCAiL2Nob3NlbiIsICJib290YXJncyIsCisJCQkJCWF0YWctPnUuY21kbGluZS5jbWRsaW5lKTsKKwkJfSBlbHNlIGlmIChhdGFnLT5oZHIudGFnID09IEFUQUdfTUVNKSB7CisJCQlpZiAobWVtY291bnQgPj0gc2l6ZW9mKG1lbV9yZWdfcHJvcGVydHkpLzQpCisJCQkJY29udGludWU7CisJCQltZW1fcmVnX3Byb3BlcnR5W21lbWNvdW50KytdID0gY3B1X3RvX2ZkdDMyKGF0YWctPnUubWVtLnN0YXJ0KTsKKwkJCW1lbV9yZWdfcHJvcGVydHlbbWVtY291bnQrK10gPSBjcHVfdG9fZmR0MzIoYXRhZy0+dS5tZW0uc2l6ZSk7CisJCX0gZWxzZSBpZiAoYXRhZy0+aGRyLnRhZyA9PSBBVEFHX0lOSVRSRDIpIHsKKwkJCXVpbnQzMl90IGluaXRyZF9zdGFydCwgaW5pdHJkX3NpemU7CisJCQlpbml0cmRfc3RhcnQgPSBhdGFnLT51LmluaXRyZC5zdGFydDsKKwkJCWluaXRyZF9zaXplID0gYXRhZy0+dS5pbml0cmQuc2l6ZTsKKwkJCXNldHByb3BfY2VsbChmZHQsICIvY2hvc2VuIiwgImxpbnV4LGluaXRyZC1zdGFydCIsCisJCQkJCWluaXRyZF9zdGFydCk7CisJCQlzZXRwcm9wX2NlbGwoZmR0LCAiL2Nob3NlbiIsICJsaW51eCxpbml0cmQtZW5kIiwKKwkJCQkJaW5pdHJkX3N0YXJ0ICsgaW5pdHJkX3NpemUpOworCQl9CisJfQorCisJaWYgKG1lbWNvdW50KQorCQlzZXRwcm9wKGZkdCwgIi9tZW1vcnkiLCAicmVnIiwgbWVtX3JlZ19wcm9wZXJ0eSwgNCptZW1jb3VudCk7CisKKwlyZXR1cm4gZmR0X3BhY2soZmR0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGU5NWE1OTguLmMyZWZmYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtMjE2LDYgKzIxNiwxMDQgQEAKIAkJbW92CXIxMCwgcjYKICNlbmRpZgogCisJCW1vdglyNSwgIzAJCQlAIGluaXQgZHRiIHNpemUgdG8gMAorI2lmZGVmIENPTkZJR19BUk1fQVBQRU5ERURfRFRCCisvKgorICogICByMCAgPSBkZWx0YQorICogICByMiAgPSBCU1Mgc3RhcnQKKyAqICAgcjMgID0gQlNTIGVuZAorICogICByNCAgPSBmaW5hbCBrZXJuZWwgYWRkcmVzcworICogICByNSAgPSBhcHBlbmRlZCBkdGIgc2l6ZSAoc3RpbGwgdW5rbm93bikKKyAqICAgcjYgID0gX2VkYXRhCisgKiAgIHI3ICA9IGFyY2hpdGVjdHVyZSBJRAorICogICByOCAgPSBhdGFncy9kZXZpY2UgdHJlZSBwb2ludGVyCisgKiAgIHI5ICA9IHNpemUgb2YgZGVjb21wcmVzc2VkIGltYWdlCisgKiAgIHIxMCA9IGVuZCBvZiB0aGlzIGltYWdlLCBpbmNsdWRpbmcgIGJzcy9zdGFjay9tYWxsb2Mgc3BhY2UgaWYgbm9uIFhJUAorICogICByMTEgPSBHT1Qgc3RhcnQKKyAqICAgcjEyID0gR09UIGVuZAorICogICBzcCAgPSBzdGFjayBwb2ludGVyCisgKgorICogaWYgdGhlcmUgYXJlIGRldmljZSB0cmVlcyAoZHRiKSBhcHBlbmRlZCB0byB6SW1hZ2UsIGFkdmFuY2UgcjEwIHNvIHRoYXQgdGhlCisgKiBkdGIgZGF0YSB3aWxsIGdldCByZWxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUga2VybmVsIGlmIG5lY2Vzc2FyeS4KKyAqLworCisJCWxkcglsciwgW3I2LCAjMF0KKyNpZm5kZWYgX19BUk1FQl9fCisJCWxkcglyMSwgPTB4ZWRmZTBkZDAJCUAgc2lnIGlzIDB4ZDAwZGZlZWQgYmlnIGVuZGlhbgorI2Vsc2UKKwkJbGRyCXIxLCA9MHhkMDBkZmVlZAorI2VuZGlmCisJCWNtcAlsciwgcjEKKwkJYm5lCWR0Yl9jaGVja19kb25lCQlAIG5vdCBmb3VuZAorCisjaWZkZWYgQ09ORklHX0FSTV9BVEFHX0RUQl9DT01QQVQKKwkJLyoKKwkJICogT0suLi4gTGV0J3MgZG8gc29tZSBmdW5reSBidXNpbmVzcyBoZXJlLgorCQkgKiBJZiB3ZSBkbyBoYXZlIGEgRFRCIGFwcGVuZGVkIHRvIHpJbWFnZSwgYW5kIHdlIGRvIGhhdmUKKwkJICogYW4gQVRBRyBsaXN0IGFyb3VuZCwgd2Ugd2FudCB0aGUgbGF0ZXIgdG8gYmUgdHJhbnNsYXRlZAorCQkgKiBhbmQgZm9sZGVkIGludG8gdGhlIGZvcm1lciBoZXJlLiAgVG8gYmUgb24gdGhlIHNhZmUgc2lkZSwKKwkJICogbGV0J3MgdGVtcG9yYXJpbHkgbW92ZSAgdGhlIHN0YWNrIGF3YXkgaW50byB0aGUgbWFsbG9jCisJCSAqIGFyZWEuICBObyBHT1QgZml4dXAgaGFzIG9jY3VycmVkIHlldCwgYnV0IG5vbmUgb2YgdGhlCisJCSAqIGNvZGUgd2UncmUgYWJvdXQgdG8gY2FsbCB1c2VzIGFueSBnbG9iYWwgdmFyaWFibGUuCisJCSovCisJCWFkZAlzcCwgc3AsICMweDEwMDAwCisJCXN0bWZkCXNwISwge3IwLXIzLCBpcCwgbHJ9CisJCW1vdglyMCwgcjgKKwkJbW92CXIxLCByNgorCQlzdWIJcjIsIHNwLCByNgorCQlibAlhdGFnc190b19mZHQKKworCQkvKgorCQkgKiBJZiByZXR1cm5lZCB2YWx1ZSBpcyAxLCB0aGVyZSBpcyBubyBBVEFHIGF0IHRoZSBsb2NhdGlvbgorCQkgKiBwb2ludGVkIGJ5IHI4LiAgVHJ5IHRoZSB0eXBpY2FsIDB4MTAwIG9mZnNldCBmcm9tIHN0YXJ0CisJCSAqIG9mIFJBTSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisJCSAqLworCQljbXAJcjAsICMxCisJCXN1YglyMCwgcjQsICNURVhUX09GRlNFVAorCQlhZGQJcjAsIHIwLCAjMHgxMDAKKwkJbW92CXIxLCByNgorCQlzdWIJcjIsIHNwLCByNgorCQlibG5lCWF0YWdzX3RvX2ZkdAorCisJCWxkbWZkCXNwISwge3IwLXIzLCBpcCwgbHJ9CisJCXN1YglzcCwgc3AsICMweDEwMDAwCisjZW5kaWYKKworCQltb3YJcjgsIHI2CQkJQCB1c2UgdGhlIGFwcGVuZGVkIGRldmljZSB0cmVlCisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlIERUQiBkb2Vzbid0IGVuZCB1cCBpbiB0aGUgZmluYWwKKwkJICoga2VybmVsJ3MgLmJzcyBhcmVhLiBUbyBkbyBzbywgd2UgYWRqdXN0IHRoZSBkZWNvbXByZXNzZWQKKwkJICoga2VybmVsIHNpemUgdG8gY29tcGVuc2F0ZSBpZiB0aGF0IC5ic3Mgc2l6ZSBpcyBsYXJnZXIKKwkJICogdGhhbiB0aGUgcmVsb2NhdGVkIGNvZGUuCisJCSAqLworCQlsZHIJcjUsID1fa2VybmVsX2Jzc19zaXplCisJCWFkcglyMSwgd29udF9vdmVyd3JpdGUKKwkJc3ViCXIxLCByNiwgcjEKKwkJc3VicwlyMSwgcjUsIHIxCisJCWFkZGhpCXI5LCByOSwgcjEKKworCQkvKiBHZXQgdGhlIGR0YidzIHNpemUgKi8KKwkJbGRyCXI1LCBbcjYsICM0XQorI2lmbmRlZiBfX0FSTUVCX18KKwkJLyogY29udmVydCByNSAoZHRiIHNpemUpIHRvIGxpdHRsZSBlbmRpYW4gKi8KKwkJZW9yCXIxLCByNSwgcjUsIHJvciAjMTYKKwkJYmljCXIxLCByMSwgIzB4MDBmZjAwMDAKKwkJbW92CXI1LCByNSwgcm9yICM4CisJCWVvcglyNSwgcjUsIHIxLCBsc3IgIzgKKyNlbmRpZgorCisJCS8qIHByZXNlcnZlIDY0LWJpdCBhbGlnbm1lbnQgKi8KKwkJYWRkCXI1LCByNSwgIzcKKwkJYmljCXI1LCByNSwgIzcKKworCQkvKiByZWxvY2F0ZSBzb21lIHBvaW50ZXJzIHBhc3QgdGhlIGFwcGVuZGVkIGR0YiAqLworCQlhZGQJcjYsIHI2LCByNQorCQlhZGQJcjEwLCByMTAsIHI1CisJCWFkZAlzcCwgc3AsIHI1CitkdGJfY2hlY2tfZG9uZToKKyNlbmRpZgorCiAvKgogICogQ2hlY2sgdG8gc2VlIGlmIHdlIHdpbGwgb3ZlcndyaXRlIG91cnNlbHZlcy4KICAqICAgcjQgID0gZmluYWwga2VybmVsIGFkZHJlc3MKQEAgLTIyMywxNSArMzIxLDE0IEBACiAgKiAgIHIxMCA9IGVuZCBvZiB0aGlzIGltYWdlLCBpbmNsdWRpbmcgIGJzcy9zdGFjay9tYWxsb2Mgc3BhY2UgaWYgbm9uIFhJUAogICogV2UgYmFzaWNhbGx5IHdhbnQ6CiAgKiAgIHI0IC0gMTZrIHBhZ2UgZGlyZWN0b3J5ID49IHIxMCAtPiBPSwotICogICByNCArIGltYWdlIGxlbmd0aCA8PSBjdXJyZW50IHBvc2l0aW9uIChwYykgLT4gT0sKKyAqICAgcjQgKyBpbWFnZSBsZW5ndGggPD0gYWRkcmVzcyBvZiB3b250X292ZXJ3cml0ZSAtPiBPSwogICovCiAJCWFkZAlyMTAsIHIxMCwgIzE2Mzg0CiAJCWNtcAlyNCwgcjEwCiAJCWJocwl3b250X292ZXJ3cml0ZQogCQlhZGQJcjEwLCByNCwgcjkKLSAgIEFSTSgJCWNtcAlyMTAsIHBjCQkpCi0gVEhVTUIoCQltb3YJbHIsIHBjCQkpCi0gVEhVTUIoCQljbXAJcjEwLCBscgkJKQorCQlhZHIJcjksIHdvbnRfb3ZlcndyaXRlCisJCWNtcAlyMTAsIHI5CiAJCWJscwl3b250X292ZXJ3cml0ZQogCiAvKgpAQCAtMjg1LDE0ICszODIsMTYgQEAKICAqICAgcjIgID0gQlNTIHN0YXJ0CiAgKiAgIHIzICA9IEJTUyBlbmQKICAqICAgcjQgID0ga2VybmVsIGV4ZWN1dGlvbiBhZGRyZXNzCisgKiAgIHI1ICA9IGFwcGVuZGVkIGR0YiBzaXplICgwIGlmIG5vdCBwcmVzZW50KQogICogICByNyAgPSBhcmNoaXRlY3R1cmUgSUQKICAqICAgcjggID0gYXRhZ3MgcG9pbnRlcgogICogICByMTEgPSBHT1Qgc3RhcnQKICAqICAgcjEyID0gR09UIGVuZAogICogICBzcCAgPSBzdGFjayBwb2ludGVyCiAgKi8KLQkJdGVxCXIwLCAjMAorCQlvcnJzCXIxLCByMCwgcjUKIAkJYmVxCW5vdF9yZWxvY2F0ZWQKKwogCQlhZGQJcjExLCByMTEsIHIwCiAJCWFkZAlyMTIsIHIxMiwgcjAKIApAQCAtMzA3LDEyICs0MDYsMjEgQEAKIAogCQkvKgogCQkgKiBSZWxvY2F0ZSBhbGwgZW50cmllcyBpbiB0aGUgR09UIHRhYmxlLgorCQkgKiBCdW1wIGJzcyBlbnRyaWVzIHRvIF9lZGF0YSArIGR0YiBzaXplCiAJCSAqLwogMToJCWxkcglyMSwgW3IxMSwgIzBdCQlAIHJlbG9jYXRlIGVudHJpZXMgaW4gdGhlIEdPVAotCQlhZGQJcjEsIHIxLCByMAkJQCB0YWJsZS4gIFRoaXMgZml4ZXMgdXAgdGhlCi0JCXN0cglyMSwgW3IxMV0sICM0CQlAIEMgcmVmZXJlbmNlcy4KKwkJYWRkCXIxLCByMSwgcjAJCUAgVGhpcyBmaXhlcyB1cCBDIHJlZmVyZW5jZXMKKwkJY21wCXIxLCByMgkJCUAgaWYgZW50cnkgPj0gYnNzX3N0YXJ0ICYmCisJCWNtcGhzCXIzLCByMQkJCUAgICAgICAgYnNzX2VuZCA+IGVudHJ5CisJCWFkZGhpCXIxLCByMSwgcjUJCUAgICAgZW50cnkgKz0gZHRiIHNpemUKKwkJc3RyCXIxLCBbcjExXSwgIzQJCUAgbmV4dCBlbnRyeQogCQljbXAJcjExLCByMTIKIAkJYmxvCTFiCisKKwkJLyogYnVtcCBvdXIgYnNzIHBvaW50ZXJzIHRvbyAqLworCQlhZGQJcjIsIHIyLCByNQorCQlhZGQJcjMsIHIzLCByNQorCiAjZWxzZQogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbGliZmR0X2Vudi5oIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xpYmZkdF9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjRlNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2xpYmZkdF9lbnYuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9BUk1fTElCRkRUX0VOVl9ICisjZGVmaW5lIF9BUk1fTElCRkRUX0VOVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBmZHQxNl90b19jcHUoeCkJCWJlMTZfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b19mZHQxNih4KQkJY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgZmR0MzJfdG9fY3B1KHgpCQliZTMyX3RvX2NwdSh4KQorI2RlZmluZSBjcHVfdG9fZmR0MzIoeCkJCWNwdV90b19iZTMyKHgpCisjZGVmaW5lIGZkdDY0X3RvX2NwdSh4KQkJYmU2NF90b19jcHUoeCkKKyNkZWZpbmUgY3B1X3RvX2ZkdDY0KHgpCQljcHVfdG9fYmU2NCh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IDgzMmQzNzIuLjhlMmE4ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMTgsMTQgKzE4LDkgQEAKIAogdW5zaWduZWQgaW50IF9fbWFjaGluZV9hcmNoX3R5cGU7CiAKLSNkZWZpbmUgX0xJTlVYX1NUUklOR19IXwotCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4JLyogZm9yIGlubGluZSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBzaXplX3QgKi8KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIE5VTEwgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+Ci0KIAogc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKnB0cik7CiBleHRlcm4gdm9pZCBlcnJvcihjaGFyICp4KTsKQEAgLTEwMSw0MSArOTYsNiBAQAogCWZsdXNoKCk7CiB9CiAKLQotdm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKLXsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopX19kZXN0LCAqcyA9ICh1bnNpZ25lZCBjaGFyICopX19zcmM7Ci0KLQlmb3IgKGkgPSBfX24gPj4gMzsgaSA+IDA7IGktLSkgewotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JfQotCi0JaWYgKF9fbiAmIDEgPDwgMikgewotCQkqZCsrID0gKnMrKzsKLQkJKmQrKyA9ICpzKys7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQl9Ci0KLQlpZiAoX19uICYgMSA8PCAxKSB7Ci0JCSpkKysgPSAqcysrOwotCQkqZCsrID0gKnMrKzsKLQl9Ci0KLQlpZiAoX19uICYgMSkKLQkJKmQrKyA9ICpzKys7Ci0KLQlyZXR1cm4gX19kZXN0OwotfQotCiAvKgogICogZ3ppcCBkZWNsYXJhdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZTUzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBhcmNoL2FybS9ib290L2NvbXByZXNzZWQvc3RyaW5nLmMKKyAqCisgKiBTbWFsbCBzdWJzZXQgb2Ygc2ltcGxlIHN0cmluZyByb3V0aW5lcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKwordm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbikKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgY2hhciAqZCA9ICh1bnNpZ25lZCBjaGFyICopX19kZXN0LCAqcyA9ICh1bnNpZ25lZCBjaGFyICopX19zcmM7CisKKwlmb3IgKGkgPSBfX24gPj4gMzsgaSA+IDA7IGktLSkgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJfQorCisJaWYgKF9fbiAmIDEgPDwgMikgeworCQkqZCsrID0gKnMrKzsKKwkJKmQrKyA9ICpzKys7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSA8PCAxKSB7CisJCSpkKysgPSAqcysrOworCQkqZCsrID0gKnMrKzsKKwl9CisKKwlpZiAoX19uICYgMSkKKwkJKmQrKyA9ICpzKys7CisKKwlyZXR1cm4gX19kZXN0OworfQorCit2b2lkICptZW1tb3ZlKHZvaWQgKl9fZGVzdCwgX19jb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgKmQgPSBfX2Rlc3Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IF9fc3JjOworCisJaWYgKF9fZGVzdCA9PSBfX3NyYykKKwkJcmV0dXJuIF9fZGVzdDsKKworCWlmIChfX2Rlc3QgPCBfX3NyYykKKwkJcmV0dXJuIG1lbWNweShfX2Rlc3QsIF9fc3JjLCBjb3VudCk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJZFtjb3VudF0gPSBzW2NvdW50XTsKKwlyZXR1cm4gX19kZXN0OworfQorCitzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqc2MgPSBzOworCisJd2hpbGUgKCpzYyAhPSAnXDAnKQorCQlzYysrOworCXJldHVybiBzYyAtIHM7Cit9CisKK2ludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxID0gY3MsICpzdTIgPSBjdCwgKmVuZCA9IHN1MSArIGNvdW50OworCWludCByZXMgPSAwOworCisJd2hpbGUgKHN1MSA8IGVuZCkgeworCQlyZXMgPSAqc3UxKysgLSAqc3UyKys7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJlczsKK30KKworaW50IHN0cmNtcChjb25zdCBjaGFyICpjcywgY29uc3QgY2hhciAqY3QpCit7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IHJlcyA9IDA7CisKKwlkbyB7CisJCWMxID0gKmNzKys7CisJCWMyID0gKmN0Kys7CisJCXJlcyA9IGMxIC0gYzI7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwl9IHdoaWxlIChjMSk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHM7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPT0gKnArKykKKwkJCXJldHVybiAodm9pZCAqKShwIC0gMSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2NoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgIT0gKGNoYXIpYykKKwkJaWYgKCpzKysgPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCXJldHVybiAoY2hhciAqKXM7Cit9CisKKyN1bmRlZiBtZW1zZXQKKwordm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJY2hhciAqeHMgPSBzOworCXdoaWxlIChjb3VudC0tKQorCQkqeHMrKyA9IGM7CisJcmV0dXJuIHM7Cit9CisKK3ZvaWQgX19tZW16ZXJvKHZvaWQgKnMsIHNpemVfdCBjb3VudCkKK3sKKwltZW1zZXQocywgMCwgY291bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLmluCmluZGV4IDRlNzI4ODMuLjQ5MTlmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5pbgorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuaW4KQEAgLTUxLDYgKzUxLDEwIEBACiAgIF9nb3Rfc3RhcnQgPSAuOwogICAuZ290CQkJOiB7ICooLmdvdCkgfQogICBfZ290X2VuZCA9IC47CisKKyAgLyogZW5zdXJlIHRoZSB6SW1hZ2UgZmlsZSBzaXplIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDY0IGJpdHMgKi8KKyAgLyogKHdpdGhvdXQgYSBkdW1teSBieXRlLCBsZCBqdXN0IGlnbm9yZXMgdGhlIGVtcHR5IHNlY3Rpb24pICovCisgIC5wYWQJCQk6IHsgQllURSgwKTsgLiA9IEFMSUdOKDgpOyB9CiAgIF9lZGF0YSA9IC47CiAKICAgLiA9IEJTU19TVEFSVDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzIwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWcyMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWYwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWcyMC5kdHNpCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogYXQ5MXNhbTlnMjAuZHRzaSAtIERldmljZSBUcmVlIEluY2x1ZGUgZmlsZSBmb3IgQVQ5MVNBTTlHMjAgZmFtaWx5IFNvQworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPiwKKyAqICAgICAgICAgICAgICAgIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisKKy8geworCW1vZGVsID0gIkF0bWVsIEFUOTFTQU05RzIwIGZhbWlseSBTb0MiOworCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTlnMjAiOworCWludGVycnVwdC1wYXJlbnQgPSA8JmFpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZkYmd1OworCQlzZXJpYWwxID0gJnVzYXJ0MDsKKwkJc2VyaWFsMiA9ICZ1c2FydDE7CisJCXNlcmlhbDMgPSAmdXNhcnQyOworCQlzZXJpYWw0ID0gJnVzYXJ0MzsKKwkJc2VyaWFsNSA9ICZ1c2FydDQ7CisJCXNlcmlhbDYgPSAmdXNhcnQ1OworCX07CisJY3B1cyB7CisJCWNwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGFybTkyNmVqcyI7CisJCX07CisJfTsKKworCW1lbW9yeUAyMDAwMDAwMCB7CisJCXJlZyA9IDwweDIwMDAwMDAwIDB4MDgwMDAwMDA+OworCX07CisKKwlhaGIgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlhcGIgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXM7CisKKwkJCWFpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAZmZmZmYwMDAgeworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLWFpYyI7CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJaW50ZXJydXB0LXBhcmVudDsKKwkJCQlyZWcgPSA8MHhmZmZmZjAwMCAweDIwMD47CisJCQl9OworCisJCQlkYmd1OiBzZXJpYWxAZmZmZmYyMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZmZmMjAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDE+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDA6IHNlcmlhbEBmZmZiMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjAwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8Nj47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDE6IHNlcmlhbEBmZmZiNDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjQwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8Nz47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDI6IHNlcmlhbEBmZmZiODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmYjgwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8OD47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2FydDM6IHNlcmlhbEBmZmZkMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC11c2FydCI7CisJCQkJcmVnID0gPDB4ZmZmZDAwMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8MjM+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQ0OiBzZXJpYWxAZmZmZDQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZmQ0MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCQlhdG1lbCx1c2UtZG1hLXJ4OworCQkJCWF0bWVsLHVzZS1kbWEtdHg7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVzYXJ0NTogc2VyaWFsQGZmZmQ4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXVzYXJ0IjsKKwkJCQlyZWcgPSA8MHhmZmZkODAwMCAweDIwMD47CisJCQkJaW50ZXJydXB0cyA9IDwyNT47CisJCQkJYXRtZWwsdXNlLWRtYS1yeDsKKwkJCQlhdG1lbCx1c2UtZG1hLXR4OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTlnNDUuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2YTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBhdDkxc2FtOWc0NS5kdHNpIC0gRGV2aWNlIFRyZWUgSW5jbHVkZSBmaWxlIGZvciBBVDkxU0FNOUc0NSBmYW1pbHkgU29DCisgKiAgICAgICAgICAgICAgICAgICAgYXBwbGllcyB0byBBVDkxU0FNOUc0NSwgQVQ5MVNBTTlNMTAsCisgKiAgICAgICAgICAgICAgICAgICAgQVQ5MVNBTTlHNDYsIEFUOTFTQU05TTExIFNvQworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJbW9kZWwgPSAiQXRtZWwgQVQ5MVNBTTlHNDUgZmFtaWx5IFNvQyI7CisJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOWc0NSI7CisJaW50ZXJydXB0LXBhcmVudCA9IDwmYWljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJmRiZ3U7CisJCXNlcmlhbDEgPSAmdXNhcnQwOworCQlzZXJpYWwyID0gJnVzYXJ0MTsKKwkJc2VyaWFsMyA9ICZ1c2FydDI7CisJCXNlcmlhbDQgPSAmdXNhcnQzOworCX07CisJY3B1cyB7CisJCWNwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGFybTkyNmVqcyI7CisJCX07CisJfTsKKworCW1lbW9yeUA3MDAwMDAwMCB7CisJCXJlZyA9IDwweDcwMDAwMDAwIDB4MTAwMDAwMDA+OworCX07CisKKwlhaGIgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlhcGIgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXM7CisKKwkJCWFpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAZmZmZmYwMDAgeworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxcm05MjAwLWFpYyI7CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJaW50ZXJydXB0LXBhcmVudDsKKwkJCQlyZWcgPSA8MHhmZmZmZjAwMCAweDIwMD47CisJCQl9OworCisJCQlkbWE6IGRtYS1jb250cm9sbGVyQGZmZmZlYzAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05ZzQ1LWRtYSI7CisJCQkJcmVnID0gPDB4ZmZmZmVjMDAgMHgyMDA+OworCQkJCWludGVycnVwdHMgPSA8MjE+OworCQkJfTsKKworCQkJZGJndTogc2VyaWFsQGZmZmZlZTAwIHsKKwkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXVzYXJ0IjsKKwkJCQlyZWcgPSA8MHhmZmZmZWUwMCAweDIwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQwOiBzZXJpYWxAZmZmOGMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjhjMDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQxOiBzZXJpYWxAZmZmOTAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjkwMDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQyOiBzZXJpYWxAZmZmOTQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjk0MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDk+OworCQkJCWF0bWVsLHVzZS1kbWEtcng7CisJCQkJYXRtZWwsdXNlLWRtYS10eDsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNhcnQzOiBzZXJpYWxAZmZmOTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTkyNjAtdXNhcnQiOworCQkJCXJlZyA9IDwweGZmZjk4MDAwIDB4MjAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJCQlhdG1lbCx1c2UtZG1hLXJ4OworCQkJCWF0bWVsLHVzZS1kbWEtdHg7CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOW0xMGc0NWVrLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05bTEwZzQ1ZWsuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjM0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOW0xMGc0NWVrLmR0cwpAQCAtMCwwICsxLDM1IEBACisvKgorICogYXQ5MXNhbTltMTBnNDVlay5kdHMgLSBEZXZpY2UgVHJlZSBmaWxlIGZvciBBVDkxU0FNOU0xMEc0NS1FSyBib2FyZAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwsCisgKiAgICAgICAgICAgICAgICAyMDExIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisvZHRzLXYxLzsKKy9pbmNsdWRlLyAiYXQ5MXNhbTlnNDUuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiQXRtZWwgQVQ5MVNBTTlNMTBHNDUtRUsiOworCWNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTltMTBnNDVlayIsICJhdG1lbCxhdDkxc2FtOWc0NSIsICJhdG1lbCxhdDkxc2FtOSI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJtZW09NjRNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIG10ZHBhcnRzPWF0bWVsX25hbmQ6NE0oYm9vdHN0cmFwL3Vib290L2tlcm5lbClybyw2ME0ocm9vdGZzKSwtKGRhdGEpIHJvb3Q9L2Rldi9tdGRibG9jazEgcncgcm9vdGZzdHlwZT1qZmZzMiI7CisJfTsKKworCW1lbW9yeUA3MDAwMDAwMCB7CisJCXJlZyA9IDwweDcwMDAwMDAwIDB4NDAwMDAwMD47CisJfTsKKworCWFoYiB7CisJCWFwYiB7CisJCQlkYmd1OiBzZXJpYWxAZmZmZmVlMDAgeworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVzYXJ0MTogc2VyaWFsQGZmZjkwMDAwIHsKKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaGlnaGJhbmsuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaGlnaGJhbmsuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjFhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9oaWdoYmFuay5kdHMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvZHRzLXYxLzsKKworLyogRmlyc3QgNEtCIGhhcyBwZW4gZm9yIHNlY29uZGFyeSBjb3Jlcy4gKi8KKy9tZW1yZXNlcnZlLyAweDAwMDAwMDAwIDB4MDAwMTAwMDsKKworLyB7CisJbW9kZWwgPSAiQ2FseGVkYSBIaWdoYmFuayI7CisJY29tcGF0aWJsZSA9ICJjYWx4ZWRhLGhpZ2hiYW5rIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQljcHVAMSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCWNwdUAyIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOSI7CisJCQlyZWcgPSA8Mj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJY3B1QDMgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJbmFtZSA9ICJtZW1vcnkiOworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweGZmOTAwMDAwPjsKKwl9OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlBTUEwIjsKKwl9OworCisJc29jIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKwkJcmFuZ2VzOworCisJCXRpbWVyQGZmZjEwNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHNtcC10d2QiOworCQkJcmVnID0gPDB4ZmZmMTA2MDAgMHgyMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDQ+OworCQl9OworCisJCXdhdGNoZG9nQGZmZjEwNjIwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS13ZHQiOworCQkJcmVnID0gPDB4ZmZmMTA2MjAgMHgyMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTQgMHhmMDQ+OworCQl9OworCisJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQGZmZjExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCWludGVycnVwdC1wYXJlbnQ7CisJCQlyZWcgPSA8MHhmZmYxMTAwMCAweDEwMDA+LAorCQkJICAgICAgPDB4ZmZmMTAxMDAgMHgxMDA+OworCQl9OworCisJCUwyOiBsMi1jYWNoZSB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSI7CisJCQlyZWcgPSA8MHhmZmYxMjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDcwIDQ+OworCQkJY2FjaGUtdW5pZmllZDsKKwkJCWNhY2hlLWxldmVsID0gPDI+OworCQl9OworCisJCXBtdSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktcG11IjsKKwkJCWludGVycnVwdHMgPSA8MCA3NiA0ICAwIDc1IDQgIDAgNzQgNCAgMCA3MyA0PjsKKwkJfTsKKworCQlzYXRhQGZmZTA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1haGNpIjsKKwkJCXJlZyA9IDwweGZmZTA4MDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDgzIDQ+OworCQl9OworCisJCXNkaGNpQGZmZTBlMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1zZGhjaSI7CisJCQlyZWcgPSA8MHhmZmUwZTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDkwIDQ+OworCQl9OworCisJCWlwY0BmZmYyMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMyMCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweGZmZjIwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgNyA0PjsKKwkJfTsKKworCQlncGlvZTogZ3Bpb0BmZmYzMDAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNCA0PjsKKwkJfTsKKworCQlncGlvZjogZ3Bpb0BmZmYzMTAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNSA0PjsKKwkJfTsKKworCQlncGlvZzogZ3Bpb0BmZmYzMjAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNiA0PjsKKwkJfTsKKworCQlncGlvaDogZ3Bpb0BmZmYzMzAwMCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJcmVnID0gPDB4ZmZmMzMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNyA0PjsKKwkJfTsKKworCQl0aW1lciB7CisJCQljb21wYXRpYmxlID0gImFybSxzcDgwNCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweGZmZjM0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMTggND47CisJCX07CisKKwkJcnRjQGZmZjM1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDMxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4ZmZmMzUwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxOSA0PjsKKwkJfTsKKworCQlzZXJpYWxAZmZmMzYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMTEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHhmZmYzNjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDIwIDQ+OworCQl9OworCisJCXNtaWNAZmZmM2EwMDAgeworCQkJY29tcGF0aWJsZSA9ICJpcG1pLXNtaWMiOworCQkJZGV2aWNlX3R5cGUgPSAiaXBtaSI7CisJCQlyZWcgPSA8MHhmZmYzYTAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDI0IDQ+OworCQkJcmVnLXNpemUgPSA8ND47CisJCQlyZWctc3BhY2luZyA9IDw0PjsKKwkJfTsKKworCQlzcmVnc0BmZmYzYzAwMCB7CisJCQljb21wYXRpYmxlID0gImNhbHhlZGEsaGItc3JlZ3MiOworCQkJcmVnID0gPDB4ZmZmM2MwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkbWFAZmZmM2QwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwzMzAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHhmZmYzZDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDkyIDQ+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS1iYWJiYWdlLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc2NmFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTEtYmFiYmFnZS5kdHMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg1MS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDUxIEJhYmJhZ2UgQm9hcmQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWJhYmJhZ2UiLCAiZnNsLGlteDUxIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5bXhjMCwxMTUyMDAgcm9vdD0vZGV2L21tY2JsazBwMyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeSB7CisJCXJlZyA9IDwweDkwMDAwMDAwIDB4MjAwMDAwMDA+OworCX07CisKKwlzb2MgeworCQlhaXBzQDcwMDAwMDAwIHsgLyogYWlwcy0xICovCisJCQlzcGJhQDcwMDAwMDAwIHsKKwkJCQllc2RoY0A3MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQlmc2wsY2QtaW50ZXJuYWw7CisJCQkJCWZzbCx3cC1pbnRlcm5hbDsKKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisKKwkJCQllc2RoY0A3MDAwODAwMCB7IC8qIEVTREhDMiAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzAgNiAwPjsgLyogR1BJTzFfNiAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzAgNSAwPjsgLyogR1BJTzFfNSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKworCQkJCXVhcnQyOiB1YXJ0QDcwMDBjMDAwIHsgLyogVUFSVDMgKi8KKwkJCQkJZnNsLHVhcnQtaGFzLXJ0c2N0czsKKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisKKwkJCQllY3NwaUA3MDAxMDAwMCB7IC8qIEVDU1BJMSAqLworCQkJCQlmc2wsc3BpLW51bS1jaGlwc2VsZWN0cyA9IDwyPjsKKwkJCQkJY3MtZ3Bpb3MgPSA8JmdwaW8zIDI0IDA+LCAvKiBHUElPNF8yNCAqLworCQkJCQkJICAgPCZncGlvMyAyNSAwPjsgLyogR1BJTzRfMjUgKi8KKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJCXBtaWM6IG1jMTM4OTJAMCB7CisJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsbWMxMzg5MiI7CisJCQkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw2MDAwMDAwPjsKKwkJCQkJCXJlZyA9IDwwPjsKKwkJCQkJCW1jMTN4eHgtaXJxLWdwaW9zID0gPCZncGlvMCA4IDA+OyAvKiBHUElPMV84ICovCisJCQkJCQlmc2wsbWMxM3h4eC11c2VzLXJlZ3VsYXRvcjsKKwkJCQkJfTsKKworCQkJCQlmbGFzaDogYXQ0NWRiMzIxZEAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MjUwMDAwMDA+OworCQkJCQkJcmVnID0gPDE+OworCisJCQkJCQlwYXJ0aXRpb25AMCB7CisJCQkJCQkJbGFiZWwgPSAiVS1Cb290IjsKKwkJCQkJCQlyZWcgPSA8MHgwIDB4NDAwMDA+OworCQkJCQkJCXJlYWQtb25seTsKKwkJCQkJCX07CisKKwkJCQkJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkJCQkJbGFiZWwgPSAiS2VybmVsIjsKKwkJCQkJCQlyZWcgPSA8MHg0MDAwMCAweDNjMDAwMD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CisJCQl9OworCisJCQl3ZG9nQDczZjk4MDAwIHsgLyogV0RPRzEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQlpb211eGNANzNmYTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWlvbXV4Yy1iYWJiYWdlIjsKKwkJCQlyZWcgPSA8MHg3M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANzNmYmMwMDAgeworCQkJCWZzbCx1YXJ0LWhhcy1ydHNjdHM7CisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANzNmYzAwMDAgeworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A4MDAwMDAwMCB7CS8qIGFpcHMtMiAqLworCQkJc2RtYUA4M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTEuYmluIjsKKwkJCX07CisKKwkJCWkyY0A4M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQljb2RlYzogc2d0bDUwMDBAMGEgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZ3RsNTAwMCI7CisJCQkJCXJlZyA9IDwweDBhPjsKKwkJCQl9OworCQkJfTsKKworCQkJZmVjQDgzZmVjMDAwIHsKKwkJCQlwaHktbW9kZSA9ICJtaWkiOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQlwb3dlciB7CisJCQlsYWJlbCA9ICJQb3dlciBCdXR0b24iOworCQkJZ3Bpb3MgPSA8JmdwaW8xIDIxIDA+OworCQkJbGludXgsY29kZSA9IDwxMTY+OyAvKiBLRVlfUE9XRVIgKi8KKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2FiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1MS5kdHNpCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisKKy8geworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnVhcnQwOworCQlzZXJpYWwxID0gJnVhcnQxOworCQlzZXJpYWwyID0gJnVhcnQyOworCX07CisKKwl0emljOiB0ei1pbnRlcnJ1cHQtY29udHJvbGxlckBlMDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXR6aWMiLCAiZnNsLHR6aWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ZTAwMDAwMDAgMHg0MDAwPjsKKwl9OworCisJY2xvY2tzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNraWwgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWNraWwiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDMyNzY4PjsKKwkJfTsKKworCQlja2loMSB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpaDEiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIyNTc5MjAwPjsKKwkJfTsKKworCQlja2loMiB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpaDIiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCW9zYyB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtb3NjIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisJCX07CisJfTsKKworCXNvYyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmdHppYz47CisJCXJhbmdlczsKKworCQlhaXBzQDcwMDAwMDAwIHsgLyogQUlQUzEgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLGFpcHMtYnVzIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDcwMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQlzcGJhQDcwMDAwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcGJhLWJ1cyIsICJzaW1wbGUtYnVzIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwPjsKKwkJCQlyYW5nZXM7CisKKwkJCQllc2RoY0A3MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDcwMDA0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MT47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVzZGhjQDcwMDA4MDAwIHsgLyogRVNESEMyICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWVzZGhjIjsKKwkJCQkJcmVnID0gPDB4NzAwMDgwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwyPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJdWFydDI6IHVhcnRANzAwMGMwMDAgeyAvKiBVQVJUMyAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQkJcmVnID0gPDB4NzAwMGMwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwzMz47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVjc3BpQDcwMDEwMDAwIHsgLyogRUNTUEkxICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHg3MDAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM2PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANzAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg3MDAyMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2RoY0A3MDAyNDAwMCB7IC8qIEVTREhDNCAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDcwMDI0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8ND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKwkJCX07CisKKwkJCWdwaW8wOiBncGlvQDczZjg0MDAwIHsgLyogR1BJTzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg3M2Y4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTAgNTE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9ANzNmODgwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDczZjg4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1MiA1Mz47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMjogZ3Bpb0A3M2Y4YzAwMCB7IC8qIEdQSU8zICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NzNmOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU0IDU1PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8zOiBncGlvQDczZjkwMDAwIHsgLyogR1BJTzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg3M2Y5MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTYgNTc+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJd2RvZ0A3M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDczZjk4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1OD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXdkb2dANzNmOWMwMDAgeyAvKiBXRE9HMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHg3M2Y5YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTk+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA3M2ZiYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NzNmYmMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANzNmYzAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDczZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzMj47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A4MDAwMDAwMCB7CS8qIEFJUFMyICovCisJCQljb21wYXRpYmxlID0gImZzbCxhaXBzLWJ1cyIsICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHg4MDAwMDAwMCAweDEwMDAwMDAwPjsKKwkJCXJhbmdlczsKKworCQkJZWNzcGlAODNmYWMwMDAgeyAvKiBFQ1NQSTIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJcmVnID0gPDB4ODNmYWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM3PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJc2RtYUA4M2ZiMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtc2RtYSIsICJmc2wsaW14MzUtc2RtYSI7CisJCQkJcmVnID0gPDB4ODNmYjAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDY+OworCQkJfTsKKworCQkJY3NwaUA4M2ZjMDAwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtY3NwaSIsICJmc2wsaW14MzUtY3NwaSI7CisJCQkJcmVnID0gPDB4ODNmYzAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM4PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJaTJjQDgzZmM0MDAwIHsgLyogSTJDMiAqLworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWkyYyIsICJmc2wsaW14MS1pMmMiOworCQkJCXJlZyA9IDwweDgzZmM0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw2Mz47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0A4M2ZjODAwMCB7IC8qIEkyQzEgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1MS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg4M2ZjODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjI+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlmZWNAODNmZWMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWZlYyIsICJmc2wsaW14MjctZmVjIjsKKwkJCQlyZWcgPSA8MHg4M2ZlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8ODc+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtYXJkLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLWFyZC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiN2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLWFyZC5kdHMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg1My5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDUzIEF1dG9tb3RpdmUgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtYXJkIiwgImZzbCxpbXg1MyI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tbWNibGswcDMgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwMDAwPjsKKwl9OworCisJc29jIHsKKwkJYWlwc0A1MDAwMDAwMCB7IC8qIEFJUFMxICovCisJCQlzcGJhQDUwMDAwMDAwIHsKKwkJCQllc2RoY0A1MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzAgMSAwPjsgLyogR1BJTzFfMSAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzAgOSAwPjsgLyogR1BJTzFfOSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKwkJCX07CisKKwkJCXdkb2dANTNmOTgwMDAgeyAvKiBXRE9HMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCWlvbXV4Y0A1M2ZhODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaW9tdXhjLWFyZCI7CisJCQkJcmVnID0gPDB4NTNmYTgwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCXVhcnQwOiB1YXJ0QDUzZmJjMDAwIHsgLyogVUFSVDEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCisJCWFpcHNANjAwMDAwMDAgewkvKiBBSVBTMiAqLworCQkJc2RtYUA2M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTMuYmluIjsKKwkJCX07CisJCX07CisJfTsKKworCWVpbS1jczFAZjQwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLGVpbS1idXMiLCAic2ltcGxlLWJ1cyI7CisJCXJlZyA9IDwweGY0MDAwMDAwIDB4M2ZmMDAwMD47CisJCXJhbmdlczsKKworCQlsYW45MjIwQGY0MDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic21zYyxsYW45MjIwIiwgInNtc2MsbGFuOTExNSI7CisJCQlyZWcgPSA8MHhmNDAwMDAwMCAweDIwMDAwMDA+OworCQkJcGh5LW1vZGUgPSAibWlpIjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8xPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJc21zYyxpcnEtcHVzaC1wdWxsOworCQl9OworCX07CisKKwlncGlvLWtleXMgeworCQljb21wYXRpYmxlID0gImdwaW8ta2V5cyI7CisKKwkJaG9tZSB7CisJCQlsYWJlbCA9ICJIb21lIjsKKwkJCWdwaW9zID0gPCZncGlvNCAxMCAwPjsgLyogR1BJTzVfMTAgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTAyPjsgLyogS0VZX0hPTUUgKi8KKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJfTsKKworCQliYWNrIHsKKwkJCWxhYmVsID0gIkJhY2siOworCQkJZ3Bpb3MgPSA8JmdwaW80IDExIDA+OyAvKiBHUElPNV8xMSAqLworCQkJbGludXgsY29kZSA9IDwxNTg+OyAvKiBLRVlfQkFDSyAqLworCQkJZ3Bpby1rZXksd2FrZXVwOworCQl9OworCisJCXByb2dyYW0geworCQkJbGFiZWwgPSAiUHJvZ3JhbSI7CisJCQlncGlvcyA9IDwmZ3BpbzQgMTIgMD47IC8qIEdQSU81XzEyICovCisJCQlsaW51eCxjb2RlID0gPDM2Mj47IC8qIEtFWV9QUk9HUkFNICovCisJCQlncGlvLWtleSx3YWtldXA7CisJCX07CisKKwkJdm9sdW1lLXVwIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBVcCI7CisJCQlncGlvcyA9IDwmZ3BpbzQgMTMgMD47IC8qIEdQSU81XzEzICovCisJCQlsaW51eCxjb2RlID0gPDExNT47IC8qIEtFWV9WT0xVTUVVUCAqLworCQl9OworCisJCXZvbHVtZS1kb3duIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBEb3duIjsKKwkJCWdwaW9zID0gPCZncGlvMyAwIDA+OyAvKiBHUElPNF8wICovCisJCQlsaW51eCxjb2RlID0gPDExND47IC8qIEtFWV9WT0xVTUVET1dOICovCisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1ldmsuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtZXZrLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNhODgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtZXZrLmR0cwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gImlteDUzLmR0c2kiCisKKy8geworCW1vZGVsID0gIkZyZWVzY2FsZSBpLk1YNTMgRXZhbHVhdGlvbiBLaXQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWV2ayIsICJmc2wsaW14NTMiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlteGMwLDExNTIwMCByb290PS9kZXYvbW1jYmxrMHAzIHJvb3R3YWl0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPDB4NzAwMDAwMDAgMHg4MDAwMDAwMD47CisJfTsKKworCXNvYyB7CisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJc3BiYUA1MDAwMDAwMCB7CisJCQkJZXNkaGNANTAwMDQwMDAgeyAvKiBFU0RIQzEgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDEzIDA+OyAvKiBHUElPM18xMyAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzIgMTQgMD47IC8qIEdQSU8zXzE0ICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZWNzcGlANTAwMTAwMDAgeyAvKiBFQ1NQSTEgKi8KKwkJCQkJZnNsLHNwaS1udW0tY2hpcHNlbGVjdHMgPSA8Mj47CisJCQkJCWNzLWdwaW9zID0gPCZncGlvMSAzMCAwPiwgLyogR1BJTzJfMzAgKi8KKwkJCQkJCSAgIDwmZ3BpbzIgMTkgMD47IC8qIEdQSU8zXzE5ICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCQlmbGFzaDogYXQ0NWRiMzIxZEAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gImF0bWVsLGF0NDVkYjMyMWQiLCAiYXRtZWwsYXQ0NSIsICJhdG1lbCxkYXRhZmxhc2giOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MjUwMDAwMDA+OworCQkJCQkJcmVnID0gPDE+OworCisJCQkJCQlwYXJ0aXRpb25AMCB7CisJCQkJCQkJbGFiZWwgPSAiVS1Cb290IjsKKwkJCQkJCQlyZWcgPSA8MHgwIDB4NDAwMDA+OworCQkJCQkJCXJlYWQtb25seTsKKwkJCQkJCX07CisKKwkJCQkJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkJCQkJbGFiZWwgPSAiS2VybmVsIjsKKwkJCQkJCQlyZWcgPSA8MHg0MDAwMCAweDNjMDAwMD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CisKKwkJCQllc2RoY0A1MDAyMDAwMCB7IC8qIEVTREhDMyAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzIgMTEgMD47IC8qIEdQSU8zXzExICovCisJCQkJCXdwLWdwaW9zID0gPCZncGlvMiAxMiAwPjsgLyogR1BJTzNfMTIgKi8KKwkJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJCX07CisJCQl9OworCisJCQl3ZG9nQDUzZjk4MDAwIHsgLyogV0RPRzEgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQlpb211eGNANTNmYTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlvbXV4Yy1ldmsiOworCQkJCXJlZyA9IDwweDUzZmE4MDAwIDB4NDAwMD47CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA1M2ZiYzAwMCB7IC8qIFVBUlQxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKwkJfTsKKworCQlhaXBzQDYwMDAwMDAwIHsJLyogQUlQUzIgKi8KKwkJCXNkbWFANjNmYjAwMDAgeworCQkJCWZzbCxzZG1hLXJhbS1zY3JpcHQtbmFtZSA9ICJpbXgvc2RtYS9zZG1hLWlteDUzLmJpbiI7CisJCQl9OworCisJCQlpMmNANjNmYzQwMDAgeyAvKiBJMkMyICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJcG1pYzogbWMxMzg5MkAwOCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1jMTM4OTIiLCAiZnNsLG1jMTN4eHgiOworCQkJCQlyZWcgPSA8MHgwOD47CisJCQkJfTsKKworCQkJCWNvZGVjOiBzZ3RsNTAwMEAwYSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwkJCQkJcmVnID0gPDB4MGE+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWxlZHMgeworCQljb21wYXRpYmxlID0gImdwaW8tbGVkcyI7CisKKwkJZ3JlZW4geworCQkJbGFiZWwgPSAiSGVhcnRiZWF0IjsKKwkJCWdwaW9zID0gPCZncGlvNiA3IDA+OyAvKiBHUElPN183ICovCisJCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiaGVhcnRiZWF0IjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLXFzYi5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNmRlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg1My1xc2IuZHRzCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisvZHRzLXYxLzsKKy9pbmNsdWRlLyAiaW14NTMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiRnJlZXNjYWxlIGkuTVg1MyBRdWljayBTdGFydCBCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtcXNiIiwgImZzbCxpbXg1MyI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tbWNibGswcDMgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHg3MDAwMDAwMCAweDQwMDAwMDAwPjsKKwl9OworCisJc29jIHsKKwkJYWlwc0A1MDAwMDAwMCB7IC8qIEFJUFMxICovCisJCQlzcGJhQDUwMDAwMDAwIHsKKwkJCQllc2RoY0A1MDAwNDAwMCB7IC8qIEVTREhDMSAqLworCQkJCQljZC1ncGlvcyA9IDwmZ3BpbzIgMTMgMD47IC8qIEdQSU8zXzEzICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDExIDA+OyAvKiBHUElPM18xMSAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzIgMTIgMD47IC8qIEdQSU8zXzEyICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJaW9tdXhjQDUzZmE4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtcXNiIjsKKwkJCQlyZWcgPSA8MHg1M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANTNmYmMwMDAgeyAvKiBVQVJUMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisKKwkJYWlwc0A2MDAwMDAwMCB7CS8qIEFJUFMyICovCisJCQlzZG1hQDYzZmIwMDAwIHsKKwkJCQlmc2wsc2RtYS1yYW0tc2NyaXB0LW5hbWUgPSAiaW14L3NkbWEvc2RtYS1pbXg1My5iaW4iOworCQkJfTsKKworCQkJaTJjQDYzZmM0MDAwIHsgLyogSTJDMiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCWNvZGVjOiBzZ3RsNTAwMEAwYSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIjsKKwkJCQkJcmVnID0gPDB4MGE+OworCQkJCX07CisJCQl9OworCisJCQlpMmNANjNmYzgwMDAgeyAvKiBJMkMxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCisJCQkJYWNjZWxlcm9tZXRlcjogbW1hODQ1MEAxYyB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1tYTg0NTAiOworCQkJCQlyZWcgPSA8MHgxYz47CisJCQkJfTsKKworCQkJCXBtaWM6IGRpYWxvZ0A0OCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZGlhbG9nLGRhOTA1MyIsICJkaWFsb2csZGE5MDUyIjsKKwkJCQkJcmVnID0gPDB4NDg+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQlwb3dlciB7CisJCQlsYWJlbCA9ICJQb3dlciBCdXR0b24iOworCQkJZ3Bpb3MgPSA8JmdwaW8wIDggMD47IC8qIEdQSU8xXzggKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE2PjsgLyogS0VZX1BPV0VSICovCisJCQlncGlvLWtleSx3YWtldXA7CisJCX07CisKKwkJdm9sdW1lLXVwIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBVcCI7CisJCQlncGlvcyA9IDwmZ3BpbzEgMTQgMD47IC8qIEdQSU8yXzE0ICovCisJCQlsaW51eCxjb2RlID0gPDExNT47IC8qIEtFWV9WT0xVTUVVUCAqLworCQl9OworCisJCXZvbHVtZS1kb3duIHsKKwkJCWxhYmVsID0gIlZvbHVtZSBEb3duIjsKKwkJCWdwaW9zID0gPCZncGlvMSAxNSAwPjsgLyogR1BJTzJfMTUgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE0PjsgLyogS0VZX1ZPTFVNRURPV04gKi8KKwkJfTsKKwl9OworCisJbGVkcyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIjsKKworCQl1c2VyIHsKKwkJCWxhYmVsID0gIkhlYXJ0YmVhdCI7CisJCQlncGlvcyA9IDwmZ3BpbzYgNyAwPjsgLyogR1BJTzdfNyAqLworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImhlYXJ0YmVhdCI7CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg1My1zbWQuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtc21kLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMwNjJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMtc21kLmR0cwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gImlteDUzLmR0c2kiCisKKy8geworCW1vZGVsID0gIkZyZWVzY2FsZSBpLk1YNTMgU21hcnQgTW9iaWxlIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiOworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXNtZCIsICJmc2wsaW14NTMiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiY29uc29sZT10dHlteGMwLDExNTIwMCByb290PS9kZXYvbW1jYmxrMHAzIHJvb3R3YWl0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPDB4NzAwMDAwMDAgMHg0MDAwMDAwMD47CisJfTsKKworCXNvYyB7CisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJc3BiYUA1MDAwMDAwMCB7CisJCQkJZXNkaGNANTAwMDQwMDAgeyAvKiBFU0RIQzEgKi8KKwkJCQkJY2QtZ3Bpb3MgPSA8JmdwaW8yIDEzIDA+OyAvKiBHUElPM18xMyAqLworCQkJCQl3cC1ncGlvcyA9IDwmZ3BpbzMgMTEgMD47IC8qIEdQSU80XzExICovCisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMDgwMDAgeyAvKiBFU0RIQzIgKi8KKwkJCQkJZnNsLGNhcmQtd2lyZWQ7CisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCisJCQkJdWFydDI6IHVhcnRANTAwMGMwMDAgeyAvKiBVQVJUMyAqLworCQkJCQlmc2wsdWFydC1oYXMtcnRzY3RzOworCQkJCQlzdGF0dXMgPSAib2theSI7CisJCQkJfTsKKworCQkJCWVjc3BpQDUwMDEwMDAwIHsgLyogRUNTUEkxICovCisJCQkJCWZzbCxzcGktbnVtLWNoaXBzZWxlY3RzID0gPDI+OworCQkJCQljcy1ncGlvcyA9IDwmZ3BpbzEgMzAgMD4sIC8qIEdQSU8yXzMwICovCisJCQkJCQkgICA8JmdwaW8yIDE5IDA+OyAvKiBHUElPM18xOSAqLworCQkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQkJemlnYmVlOiBtYzEzMjNAMCB7CisJCQkJCQljb21wYXRpYmxlID0gImZzbCxtYzEzMjMiOworCQkJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8ODAwMDAwMD47CisJCQkJCQlyZWcgPSA8MD47CisJCQkJCX07CisKKwkJCQkJZmxhc2g6IG0yNXAzMkAxIHsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQljb21wYXRpYmxlID0gInN0LG0yNXAzMiIsICJzdCxtMjVwIjsKKwkJCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDIwMDAwMDAwPjsKKwkJCQkJCXJlZyA9IDwxPjsKKworCQkJCQkJcGFydGl0aW9uQDAgeworCQkJCQkJCWxhYmVsID0gIlUtQm9vdCI7CisJCQkJCQkJcmVnID0gPDB4MCAweDQwMDAwPjsKKwkJCQkJCQlyZWFkLW9ubHk7CisJCQkJCQl9OworCisJCQkJCQlwYXJ0aXRpb25ANDAwMDAgeworCQkJCQkJCWxhYmVsID0gIktlcm5lbCI7CisJCQkJCQkJcmVnID0gPDB4NDAwMDAgMHgzYzAwMDA+OworCQkJCQkJfTsKKwkJCQkJfTsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJZnNsLGNhcmQtd2lyZWQ7CisJCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCQl9OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJc3RhdHVzID0gIm9rYXkiOworCQkJfTsKKworCQkJaW9tdXhjQDUzZmE4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtc21kIjsKKwkJCQlyZWcgPSA8MHg1M2ZhODAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRANTNmYmMwMDAgeyAvKiBVQVJUMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVhcnQxOiB1YXJ0QDUzZmMwMDAwIHsgLyogVUFSVDIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCisJCWFpcHNANjAwMDAwMDAgewkvKiBBSVBTMiAqLworCQkJc2RtYUA2M2ZiMDAwMCB7CisJCQkJZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lID0gImlteC9zZG1hL3NkbWEtaW14NTMuYmluIjsKKwkJCX07CisKKwkJCWkyY0A2M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisKKwkJCQljb2RlYzogc2d0bDUwMDBAMGEgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZ3RsNTAwMCI7CisJCQkJCXJlZyA9IDwweDBhPjsKKwkJCQl9OworCisJCQkJbWFnbmV0b21ldGVyOiBtYWczMTEwQDBlIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsbWFnMzExMCI7CisJCQkJCXJlZyA9IDwweDBlPjsKKwkJCQl9OworCisJCQkJdG91Y2hrZXk6IG1wcjEyMUA1YSB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wcjEyMSI7CisJCQkJCXJlZyA9IDwweDVhPjsKKwkJCQl9OworCQkJfTsKKworCQkJaTJjQDYzZmM4MDAwIHsgLyogSTJDMSAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKworCQkJCWFjY2VsZXJvbWV0ZXI6IG1tYTg0NTBAMWMgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxtbWE4NDUwIjsKKwkJCQkJcmVnID0gPDB4MWM+OworCQkJCX07CisKKwkJCQljYW1lcmE6IG92NTY0MkAzYyB7CisJCQkJCWNvbXBhdGlibGUgPSAib3Z0aSxvdjU2NDIiOworCQkJCQlyZWcgPSA8MHgzYz47CisJCQkJfTsKKworCQkJCXBtaWM6IGRpYWxvZ0A0OCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZGlhbG9nLGRhOTA1MyIsICJkaWFsb2csZGE5MDUyIjsKKwkJCQkJcmVnID0gPDB4NDg+OworCQkJCX07CisJCQl9OworCisJCQlmZWNANjNmZWMwMDAgeworCQkJCXBoeS1tb2RlID0gInJtaWkiOworCQkJCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzYgNiAwPjsgLyogR1BJTzdfNiAqLworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisJCX07CisJfTsKKworCWdwaW8ta2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKworCQl2b2x1bWUtdXAgeworCQkJbGFiZWwgPSAiVm9sdW1lIFVwIjsKKwkJCWdwaW9zID0gPCZncGlvMSAxNCAwPjsgLyogR1BJTzJfMTQgKi8KKwkJCWxpbnV4LGNvZGUgPSA8MTE1PjsgLyogS0VZX1ZPTFVNRVVQICovCisJCX07CisKKwkJdm9sdW1lLWRvd24geworCQkJbGFiZWwgPSAiVm9sdW1lIERvd24iOworCQkJZ3Bpb3MgPSA8JmdwaW8xIDE1IDA+OyAvKiBHUElPMl8xNSAqLworCQkJbGludXgsY29kZSA9IDwxMTQ+OyAvKiBLRVlfVk9MVU1FRE9XTiAqLworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NTMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5Y2Q4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDUzLmR0c2kKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJCXNlcmlhbDEgPSAmdWFydDE7CisJCXNlcmlhbDIgPSAmdWFydDI7CisJCXNlcmlhbDMgPSAmdWFydDM7CisJCXNlcmlhbDQgPSAmdWFydDQ7CisJfTsKKworCXR6aWM6IHR6LWludGVycnVwdC1jb250cm9sbGVyQDBmZmZjMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdHppYyIsICJmc2wsdHppYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHgwZmZmYzAwMCAweDQwMDA+OworCX07CisKKwljbG9ja3MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY2tpbCB7CisJCQljb21wYXRpYmxlID0gImZzbCxpbXgtY2tpbCIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MzI3Njg+OworCQl9OworCisJCWNraWgxIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2loMSIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjI1NzkyMDA+OworCQl9OworCisJCWNraWgyIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2loMiIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJb3NjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1vc2MiLCAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJfTsKKwl9OworCisJc29jIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ0emljPjsKKwkJcmFuZ2VzOworCisJCWFpcHNANTAwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4NTAwMDAwMDAgMHgxMDAwMDAwMD47CisJCQlyYW5nZXM7CisKKwkJCXNwYmFANTAwMDAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNwYmEtYnVzIiwgInNpbXBsZS1idXMiOworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweDUwMDAwMDAwIDB4NDAwMDA+OworCQkJCXJhbmdlczsKKworCQkJCWVzZGhjQDUwMDA0MDAwIHsgLyogRVNESEMxICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWVzZGhjIjsKKwkJCQkJcmVnID0gPDB4NTAwMDQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwxPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMDgwMDAgeyAvKiBFU0RIQzIgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg1MDAwODAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDI+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQl1YXJ0MjogdWFydEA1MDAwYzAwMCB7IC8qIFVBUlQzICovCisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCQlyZWcgPSA8MHg1MDAwYzAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDMzPjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZWNzcGlANTAwMTAwMDAgeyAvKiBFQ1NQSTEgKi8KKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHg1MDAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM2PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZXNkaGNANTAwMjAwMDAgeyAvKiBFU0RIQzMgKi8KKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZXNkaGMiOworCQkJCQlyZWcgPSA8MHg1MDAyMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDM+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2RoY0A1MDAyNDAwMCB7IC8qIEVTREhDNCAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lc2RoYyI7CisJCQkJCXJlZyA9IDwweDUwMDI0MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8ND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKwkJCX07CisKKwkJCWdwaW8wOiBncGlvQDUzZjg0MDAwIHsgLyogR1BJTzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2Y4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTAgNTE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9ANTNmODgwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDUzZjg4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1MiA1Mz47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMjogZ3Bpb0A1M2Y4YzAwMCB7IC8qIEdQSU8zICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NTNmOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU0IDU1PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8zOiBncGlvQDUzZjkwMDAwIHsgLyogR1BJTzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2Y5MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTYgNTc+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJd2RvZ0A1M2Y5ODAwMCB7IC8qIFdET0cxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDUzZjk4MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw1OD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXdkb2dANTNmOWMwMDAgeyAvKiBXRE9HMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHg1M2Y5YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NTk+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MDogdWFydEA1M2ZiYzAwMCB7IC8qIFVBUlQxICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NTNmYmMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMxPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDE6IHVhcnRANTNmYzAwMDAgeyAvKiBVQVJUMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDUzZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzMj47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWdwaW80OiBncGlvQDUzZmRjMDAwIHsgLyogR1BJTzUgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHg1M2ZkYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MTAzIDEwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvNTogZ3Bpb0A1M2ZlMDAwMCB7IC8qIEdQSU82ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4NTNmZTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwNSAxMDY+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzY6IGdwaW9ANTNmZTQwMDAgeyAvKiBHUElPNyAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDUzZmU0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMDcgMTA4PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWkyY0A1M2ZlYzAwMCB7IC8qIEkyQzMgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg1M2ZlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0MzogdWFydEA1M2ZmMDAwMCB7IC8qIFVBUlQ0ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NTNmZjAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEzPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKwkJfTsKKworCQlhaXBzQDYwMDAwMDAwIHsJLyogQUlQUzIgKi8KKwkJCWNvbXBhdGlibGUgPSAiZnNsLGFpcHMtYnVzIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDYwMDAwMDAwIDB4MTAwMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQl1YXJ0NDogdWFydEA2M2Y5MDAwMCB7IC8qIFVBUlQ1ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4NjNmOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg2PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJZWNzcGlANjNmYWMwMDAgeyAvKiBFQ1NQSTIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCXJlZyA9IDwweDYzZmFjMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzNz47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXNkbWFANjNmYjAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXNkbWEiLCAiZnNsLGlteDM1LXNkbWEiOworCQkJCXJlZyA9IDwweDYzZmIwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw2PjsKKwkJCX07CisKKwkJCWNzcGlANjNmYzAwMDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWNzcGkiLCAiZnNsLGlteDM1LWNzcGkiOworCQkJCXJlZyA9IDwweDYzZmMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwzOD47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0A2M2ZjNDAwMCB7IC8qIEkyQzIgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHg2M2ZjNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8NjM+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlpMmNANjNmYzgwMDAgeyAvKiBJMkMxICovCisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJCQkJcmVnID0gPDB4NjNmYzgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDYyPjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJZmVjQDYzZmVjMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg1My1mZWMiLCAiZnNsLGlteDI1LWZlYyI7CisJCQkJcmVnID0gPDB4NjNmZWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg3PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxLXNhYnJlYXV0by5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS1zYWJyZWF1dG8uZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Mjk3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cS1zYWJyZWF1dG8uZHRzCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJpbXg2cS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJGcmVlc2NhbGUgaS5NWDYgUXVhZCBTQUJSRSBBdXRvbW90aXZlIEJvYXJkIjsKKwljb21wYXRpYmxlID0gImZzbCxpbXg2cS1zYWJyZWF1dG8iLCAiZnNsLGlteDZxIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5bXhjMCwxMTUyMDAgcm9vdD0vZGV2L21tY2JsazNwMyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeSB7CisJCXJlZyA9IDwweDEwMDAwMDAwIDB4ODAwMDAwMDA+OworCX07CisKKwlzb2MgeworCQlhaXBzLWJ1c0AwMjEwMDAwMCB7IC8qIEFJUFMyICovCisJCQllbmV0QDAyMTg4MDAwIHsKKwkJCQlwaHktbW9kZSA9ICJyZ21paSI7CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAgMDQgOUYgMDEgMUIgNjFdOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVzZGhjQDAyMTk4MDAwIHsgLyogdVNESEMzICovCisJCQkJY2QtZ3Bpb3MgPSA8JmdwaW81IDExIDA+OyAvKiBHUElPNl8xMSAqLworCQkJCXdwLWdwaW9zID0gPCZncGlvNSAxNCAwPjsgLyogR1BJTzZfMTQgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCisJCQl1c2RoY0AwMjE5YzAwMCB7IC8qIHVTREhDNCAqLworCQkJCWZzbCxjYXJkLXdpcmVkOworCQkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCX07CisKKwkJCXVhcnQzOiB1YXJ0QDAyMWYwMDAwIHsgLyogVUFSVDQgKi8KKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07CisKKwlsZWRzIHsKKwkJY29tcGF0aWJsZSA9ICJncGlvLWxlZHMiOworCisJCWRlYnVnLWxlZCB7CisJCQlsYWJlbCA9ICJIZWFydGJlYXQiOworCQkJZ3Bpb3MgPSA8JmdwaW8yIDI1IDA+OyAvKiBHUElPM18yNSAqLworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImhlYXJ0YmVhdCI7CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg2cS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRhNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnEuZHRzaQpAQCAtMCwwICsxLDU3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwkJc2VyaWFsMSA9ICZ1YXJ0MTsKKwkJc2VyaWFsMiA9ICZ1YXJ0MjsKKwkJc2VyaWFsMyA9ICZ1YXJ0MzsKKwkJc2VyaWFsNCA9ICZ1YXJ0NDsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCWNwdUAxIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJY3B1QDIgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5IjsKKwkJCXJlZyA9IDwyPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQljcHVAMyB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAwMGEwMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQlyZWcgPSA8MHgwMGEwMTAwMCAweDEwMDA+LAorCQkgICAgICA8MHgwMGEwMDEwMCAweDEwMD47CisJfTsKKworCWNsb2NrcyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlja2lsIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGlteC1ja2lsIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMjc2OD47CisJCX07CisKKwkJY2tpaDEgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LWNraWgxIiwgImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlvc2MgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14LW9zYyIsICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OworCQl9OworCX07CisKKwlzb2MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCQlyYW5nZXM7CisKKwkJdGltZXJAMDBhMDA2MDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sc21wLXR3ZCI7CisJCQlyZWcgPSA8MHgwMGEwMDYwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmND47CisJCX07CisKKwkJTDI6IGwyLWNhY2hlQDAwYTAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMzEwLWNhY2hlIjsKKwkJCXJlZyA9IDwweDAwYTAyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgOTIgMHgwND47CisJCQljYWNoZS11bmlmaWVkOworCQkJY2FjaGUtbGV2ZWwgPSA8Mj47CisJCX07CisKKwkJYWlwcy1idXNAMDIwMDAwMDAgeyAvKiBBSVBTMSAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQlzcGJhLWJ1c0AwMjAwMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3BiYS1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDB4MDIwMDAwMDAgMHg0MDAwMD47CisJCQkJcmFuZ2VzOworCisJCQkJc3BkaWZAMDIwMDQwMDAgeworCQkJCQlyZWcgPSA8MHgwMjAwNDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgNTIgMHgwND47CisJCQkJfTsKKworCQkJCWVjc3BpQDAyMDA4MDAwIHsgLyogZUNTUEkxICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZWNzcGkiLCAiZnNsLGlteDUxLWVjc3BpIjsKKwkJCQkJcmVnID0gPDB4MDIwMDgwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDMxIDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllY3NwaUAwMjAwYzAwMCB7IC8qIGVDU1BJMiAqLworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWVjc3BpIiwgImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJCXJlZyA9IDwweDAyMDBjMDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCAzMiAweDA0PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJZWNzcGlAMDIwMTAwMDAgeyAvKiBlQ1NQSTMgKi8KKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1lY3NwaSIsICJmc2wsaW14NTEtZWNzcGkiOworCQkJCQlyZWcgPSA8MHgwMjAxMDAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgMzMgMHgwND47CisJCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQkJfTsKKworCQkJCWVjc3BpQDAyMDE0MDAwIHsgLyogZUNTUEk0ICovCisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZWNzcGkiLCAiZnNsLGlteDUxLWVjc3BpIjsKKwkJCQkJcmVnID0gPDB4MDIwMTQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDM0IDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllY3NwaUAwMjAxODAwMCB7IC8qIGVDU1BJNSAqLworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWVjc3BpIiwgImZzbCxpbXg1MS1lY3NwaSI7CisJCQkJCXJlZyA9IDwweDAyMDE4MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCAzNSAweDA0PjsKKwkJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCQl9OworCisJCQkJdWFydDA6IHVhcnRAMDIwMjAwMDAgeyAvKiBVQVJUMSAqLworCQkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQkJcmVnID0gPDB4MDIwMjAwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDI2IDB4MDQ+OworCQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCX07CisKKwkJCQllc2FpQDAyMDI0MDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwMjQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDUxIDB4MDQ+OworCQkJCX07CisKKwkJCQlzc2lAMDIwMjgwMDAgeyAvKiBTU0kxICovCisJCQkJCXJlZyA9IDwweDAyMDI4MDAwIDB4NDAwMD47CisJCQkJCWludGVycnVwdHMgPSA8MCA0NiAweDA0PjsKKwkJCQl9OworCisJCQkJc3NpQDAyMDJjMDAwIHsgLyogU1NJMiAqLworCQkJCQlyZWcgPSA8MHgwMjAyYzAwMCAweDQwMDA+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgNDcgMHgwND47CisJCQkJfTsKKworCQkJCXNzaUAwMjAzMDAwMCB7IC8qIFNTSTMgKi8KKwkJCQkJcmVnID0gPDB4MDIwMzAwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDQ4IDB4MDQ+OworCQkJCX07CisKKwkJCQlhc3JjQDAyMDM0MDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwMzQwMDAgMHg0MDAwPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwwIDUwIDB4MDQ+OworCQkJCX07CisKKwkJCQlzcGJhQDAyMDNjMDAwIHsKKwkJCQkJcmVnID0gPDB4MDIwM2MwMDAgMHg0MDAwPjsKKwkJCQl9OworCQkJfTsKKworCQkJdnB1QDAyMDQwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjA0MDAwMCAweDNjMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMyAweDA0IDAgMTIgMHgwND47CisJCQl9OworCisJCQlhaXBzdHpAMDIwN2MwMDAgeyAvKiBBSVBTVFoxICovCisJCQkJcmVnID0gPDB4MDIwN2MwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCXB3bUAwMjA4MDAwMCB7IC8qIFBXTTEgKi8KKwkJCQlyZWcgPSA8MHgwMjA4MDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MyAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4NDAwMCB7IC8qIFBXTTIgKi8KKwkJCQlyZWcgPSA8MHgwMjA4NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NCAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4ODAwMCB7IC8qIFBXTTMgKi8KKwkJCQlyZWcgPSA8MHgwMjA4ODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NSAweDA0PjsKKwkJCX07CisKKwkJCXB3bUAwMjA4YzAwMCB7IC8qIFBXTTQgKi8KKwkJCQlyZWcgPSA8MHgwMjA4YzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4NiAweDA0PjsKKwkJCX07CisKKwkJCWZsZXhjYW5AMDIwOTAwMDAgeyAvKiBDQU4xICovCisJCQkJcmVnID0gPDB4MDIwOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTEwIDB4MDQ+OworCQkJfTsKKworCQkJZmxleGNhbkAwMjA5NDAwMCB7IC8qIENBTjIgKi8KKwkJCQlyZWcgPSA8MHgwMjA5NDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxMTEgMHgwND47CisJCQl9OworCisJCQlncHRAMDIwOTgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwdCI7CisJCQkJcmVnID0gPDB4MDIwOTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTUgMHgwND47CisJCQl9OworCisJCQlncGlvMDogZ3Bpb0AwMjA5YzAwMCB7IC8qIEdQSU8xICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwOWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNjYgMHgwNCAwIDY3IDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzE6IGdwaW9AMDIwYTAwMDAgeyAvKiBHUElPMiAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDAyMGEwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDY4IDB4MDQgMCA2OSAweDA0PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW8yOiBncGlvQDAyMGE0MDAwIHsgLyogR1BJTzMgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHgwMjBhNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA3MCAweDA0IDAgNzEgMHgwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvMzogZ3Bpb0AwMjBhODAwMCB7IC8qIEdQSU80ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwYTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNzIgMHgwNCAwIDczIDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJZ3BpbzQ6IGdwaW9AMDIwYWMwMDAgeyAvKiBHUElPNSAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwaW8iLCAiZnNsLGlteDMxLWdwaW8iOworCQkJCXJlZyA9IDwweDAyMGFjMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDc0IDB4MDQgMCA3NSAweDA0PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCX07CisKKwkJCWdwaW81OiBncGlvQDAyMGIwMDAwIHsgLyogR1BJTzYgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1ncGlvIiwgImZzbCxpbXgzMS1ncGlvIjsKKwkJCQlyZWcgPSA8MHgwMjBiMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA3NiAweDA0IDAgNzcgMHgwND47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQl9OworCisJCQlncGlvNjogZ3Bpb0AwMjBiNDAwMCB7IC8qIEdQSU83ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtZ3BpbyIsICJmc2wsaW14MzEtZ3BpbyI7CisJCQkJcmVnID0gPDB4MDIwYjQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNzggMHgwNCAwIDc5IDB4MDQ+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJfTsKKworCQkJa3BwQDAyMGI4MDAwIHsKKwkJCQlyZWcgPSA8MHgwMjBiODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MiAweDA0PjsKKwkJCX07CisKKwkJCXdkb2dAMDIwYmMwMDAgeyAvKiBXRE9HMSAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXdkdCIsICJmc2wsaW14MjEtd2R0IjsKKwkJCQlyZWcgPSA8MHgwMjBiYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA4MCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJd2RvZ0AwMjBjMDAwMCB7IC8qIFdET0cyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCQkJCXJlZyA9IDwweDAyMGMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDgxIDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQljY21AMDIwYzQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWNjbSI7CisJCQkJcmVnID0gPDB4MDIwYzQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgODcgMHgwNCAwIDg4IDB4MDQ+OworCQkJfTsKKworCQkJYW5hdG9wQDAyMGM4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1hbmF0b3AiOworCQkJCXJlZyA9IDwweDAyMGM4MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ5IDB4MDQgMCA1NCAweDA0IDAgMTI3IDB4MDQ+OworCQkJfTsKKworCQkJdXNicGh5QDAyMGM5MDAwIHsgLyogVVNCUEhZMSAqLworCQkJCXJlZyA9IDwweDAyMGM5MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ0IDB4MDQ+OworCQkJfTsKKworCQkJdXNicGh5QDAyMGNhMDAwIHsgLyogVVNCUEhZMiAqLworCQkJCXJlZyA9IDwweDAyMGNhMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDQ1IDB4MDQ+OworCQkJfTsKKworCQkJc252c0AwMjBjYzAwMCB7CisJCQkJcmVnID0gPDB4MDIwY2MwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTkgMHgwNCAwIDIwIDB4MDQ+OworCQkJfTsKKworCQkJZXBpdEAwMjBkMDAwMCB7IC8qIEVQSVQxICovCisJCQkJcmVnID0gPDB4MDIwZDAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTYgMHgwND47CisJCQl9OworCisJCQllcGl0QDAyMGQ0MDAwIHsgLyogRVBJVDIgKi8KKwkJCQlyZWcgPSA8MHgwMjBkNDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA1NyAweDA0PjsKKwkJCX07CisKKwkJCXNyY0AwMjBkODAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtc3JjIjsKKwkJCQlyZWcgPSA8MHgwMjBkODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCA5MSAweDA0IDAgOTYgMHgwND47CisJCQl9OworCisJCQlncGNAMDIwZGMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwYyI7CisJCQkJcmVnID0gPDB4MDIwZGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgODkgMHgwNCAwIDkwIDB4MDQ+OworCQkJfTsKKworCQkJaW9tdXhjQDAyMGUwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjBlMDAwMCAweDQwMDA+OworCQkJfTsKKworCQkJZGNpY0AwMjBlNDAwMCB7IC8qIERDSUMxICovCisJCQkJcmVnID0gPDB4MDIwZTQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTI0IDB4MDQ+OworCQkJfTsKKworCQkJZGNpY0AwMjBlODAwMCB7IC8qIERDSUMyICovCisJCQkJcmVnID0gPDB4MDIwZTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTI1IDB4MDQ+OworCQkJfTsKKworCQkJc2RtYUAwMjBlYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtc2RtYSIsICJmc2wsaW14MzUtc2RtYSI7CisJCQkJcmVnID0gPDB4MDIwZWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMiAweDA0PjsKKwkJCX07CisJCX07CisKKwkJYWlwcy1idXNAMDIxMDAwMDAgeyAvKiBBSVBTMiAqLworCQkJY29tcGF0aWJsZSA9ICJmc2wsYWlwcy1idXMiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MDIxMDAwMDAgMHgxMDAwMDA+OworCQkJcmFuZ2VzOworCisJCQljYWFtQDAyMTAwMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjEwMDAwMCAweDQwMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTA1IDB4MDQgMCAxMDYgMHgwND47CisJCQl9OworCisJCQlhaXBzdHpAMDIxN2MwMDAgeyAvKiBBSVBTVFoyICovCisJCQkJcmVnID0gPDB4MDIxN2MwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCWVuZXRAMDIxODgwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWZlYyI7CisJCQkJcmVnID0gPDB4MDIxODgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTE4IDB4MDQgMCAxMTkgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCW1sYkAwMjE4YzAwMCB7CisJCQkJcmVnID0gPDB4MDIxOGMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgNTMgMHgwNCAwIDExNyAweDA0IDAgMTI2IDB4MDQ+OworCQkJfTsKKworCQkJdXNkaGNAMDIxOTAwMDAgeyAvKiB1U0RIQzEgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2RoYyI7CisJCQkJcmVnID0gPDB4MDIxOTAwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjIgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVzZGhjQDAyMTk0MDAwIHsgLyogdVNESEMyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNkaGMiOworCQkJCXJlZyA9IDwweDAyMTk0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDIzIDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1c2RoY0AwMjE5ODAwMCB7IC8qIHVTREhDMyAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzZGhjIjsKKwkJCQlyZWcgPSA8MHgwMjE5ODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAyNCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdXNkaGNAMDIxOWMwMDAgeyAvKiB1U0RIQzQgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11c2RoYyI7CisJCQkJcmVnID0gPDB4MDIxOWMwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjUgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCWkyY0AwMjFhMDAwMCB7IC8qIEkyQzEgKi8KKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS1pMmMiLCAiZnNsLGlteDEtaTJjIjsKKwkJCQlyZWcgPSA8MHgwMjFhMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAzNiAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJaTJjQDAyMWE0MDAwIHsgLyogSTJDMiAqLworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWkyYyIsICJmc2wsaW14MS1pMmMiOworCQkJCXJlZyA9IDwweDAyMWE0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDM3IDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQlpMmNAMDIxYTgwMDAgeyAvKiBJMkMzICovCisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtaTJjIiwgImZzbCxpbXgxLWkyYyI7CisJCQkJcmVnID0gPDB4MDIxYTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMzggMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXJvbWNwQDAyMWFjMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFhYzAwMCAweDQwMDA+OworCQkJfTsKKworCQkJbW1kY0AwMjFiMDAwMCB7IC8qIE1NREMwICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtbW1kYyI7CisJCQkJcmVnID0gPDB4MDIxYjAwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCW1tZGNAMDIxYjQwMDAgeyAvKiBNTURDMSAqLworCQkJCXJlZyA9IDwweDAyMWI0MDAwIDB4NDAwMD47CisJCQl9OworCisJCQl3ZWltQDAyMWI4MDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFiODAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxNCAweDA0PjsKKwkJCX07CisKKwkJCW9jb3RwQDAyMWJjMDAwIHsKKwkJCQlyZWcgPSA8MHgwMjFiYzAwMCAweDQwMDA+OworCQkJfTsKKworCQkJb2NvdHBAMDIxYzAwMDAgeworCQkJCXJlZyA9IDwweDAyMWMwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDIxIDB4MDQ+OworCQkJfTsKKworCQkJdHphc2NAMDIxZDAwMDAgeyAvKiBUWkFTQzEgKi8KKwkJCQlyZWcgPSA8MHgwMjFkMDAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAxMDggMHgwND47CisJCQl9OworCisJCQl0emFzY0AwMjFkNDAwMCB7IC8qIFRaQVNDMiAqLworCQkJCXJlZyA9IDwweDAyMWQ0MDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDEwOSAweDA0PjsKKwkJCX07CisKKwkJCWF1ZG11eEAwMjFkODAwMCB7CisJCQkJcmVnID0gPDB4MDIxZDgwMDAgMHg0MDAwPjsKKwkJCX07CisKKwkJCW1pcGlAMDIxZGMwMDAgeyAvKiBNSVBJLUNTSSAqLworCQkJCXJlZyA9IDwweDAyMWRjMDAwIDB4NDAwMD47CisJCQl9OworCisJCQltaXBpQDAyMWUwMDAwIHsgLyogTUlQSS1EU0kgKi8KKwkJCQlyZWcgPSA8MHgwMjFlMDAwMCAweDQwMDA+OworCQkJfTsKKworCQkJdmRvYUAwMjFlNDAwMCB7CisJCQkJcmVnID0gPDB4MDIxZTQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMTggMHgwND47CisJCQl9OworCisJCQl1YXJ0MTogdWFydEAwMjFlODAwMCB7IC8qIFVBUlQyICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4MDIxZTgwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMjcgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisKKwkJCXVhcnQyOiB1YXJ0QDAyMWVjMDAwIHsgLyogVUFSVDMgKi8KKwkJCQljb21wYXRpYmxlID0gImZzbCxpbXg2cS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwkJCQlyZWcgPSA8MHgwMjFlYzAwMCAweDQwMDA+OworCQkJCWludGVycnVwdHMgPSA8MCAyOCAweDA0PjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJfTsKKworCQkJdWFydDM6IHVhcnRAMDIxZjAwMDAgeyAvKiBVQVJUNCAqLworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVhcnQiLCAiZnNsLGlteDIxLXVhcnQiOworCQkJCXJlZyA9IDwweDAyMWYwMDAwIDB4NDAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwwIDI5IDB4MDQ+OworCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQl9OworCisJCQl1YXJ0NDogdWFydEAwMjFmNDAwMCB7IC8qIFVBUlQ1ICovCisJCQkJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJCQkJcmVnID0gPDB4MDIxZjQwMDAgMHg0MDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDAgMzAgMHgwND47CisJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjYwLXN1cmYuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODY2MC1zdXJmLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRlZDBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODY2MC1zdXJmLmR0cwpAQCAtMCwwICsxLDI0IEBACisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBNU004NjYwIFNVUkYiOworCWNvbXBhdGlibGUgPSAicWNvbSxtc204NjYwLXN1cmYiLCAicWNvbSxtc204NjYwIjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKworCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDAyMDgwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS04NjYwLXFnaWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPCAweDAyMDgwMDAwIDB4MTAwMCA+LAorCQkgICAgICA8IDB4MDIwODEwMDAgMHgxMDAwID47CisJfTsKKworCXNlcmlhbEAxOWM0MDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWhzdWFydCIsICJxY29tLG1zbS11YXJ0IjsKKwkJcmVnID0gPDB4MTljNDAwMDAgMHgxMDAwPiwKKwkJICAgICAgPDB4MTljMDAwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOTU+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtYmVhZ2xlLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLWJlYWdsZS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NmJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLWJlYWdsZS5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJvbWFwMy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJUSSBPTUFQMyBCZWFnbGVCb2FyZCI7CisJY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1iZWFnbGUiLCAidGksb21hcDMiOworCisJLyoKKwkgKiBTaW5jZSB0aGUgaW5pdGlhbCBkZXZpY2UgdHJlZSBib2FyZCBmaWxlIGRvZXMgbm90IGNyZWF0ZSBhbnkKKwkgKiBkZXZpY2VzIChNTUMsIG5ldHdvcmsuLi4pLCB0aGUgb25seSB3YXkgdG8gYm9vdCBpcyB0byBwcm92aWRlIGEKKwkgKiByYW1kaXNrLgorCSAqLworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gInJvb3Q9L2Rldi9yYW0wIHJ3IGNvbnNvbGU9dHR5TzIsMTE1MjAwbjggaW5pdHJkPTB4ODE2MDAwMDAsMjBNIHJhbWRpc2tfc2l6ZT0yMDQ4MCBub19jb25zb2xlX3N1c3BlbmQgZGVidWcgZWFybHlwcmludGsiOworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDIwMDAwMDAwPjsgLyogNTEyIE1CICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjAyYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaQpAQCAtMCwwICsxLDYzIEBACisvKgorICogRGV2aWNlIFRyZWUgU291cmNlIGZvciBPTUFQMyBTb0MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXAzNDMwIiwgInRpLG9tYXAzIjsKKworCWNwdXMgeworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTgiOworCQl9OworCX07CisKKwkvKgorCSAqIFRoZSBzb2Mgbm9kZSByZXByZXNlbnRzIHRoZSBzb2MgdG9wIGxldmVsIHZpZXcuIEl0IGlzIHVzZXMgZm9yIElQcworCSAqIHRoYXQgYXJlIG5vdCBtZW1vcnkgbWFwcGVkIGluIHRoZSBNUFUgdmlldyBvciBmb3IgdGhlIE1QVSBpdHNlbGYuCisJICovCisJc29jIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwLWluZnJhIjsKKwkJbXB1IHsKKwkJCWNvbXBhdGlibGUgPSAidGksb21hcDMtbXB1IjsKKwkJCXRpLGh3bW9kcyA9ICJtcHUiOworCQl9OworCisJCWl2YSB7CisJCQljb21wYXRpYmxlID0gInRpLGl2YTIuMiI7CisJCQl0aSxod21vZHMgPSAiaXZhIjsKKworCQkJZHNwIHsKKwkJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisJCQl9OworCQl9OworCX07CisKKwkvKgorCSAqIFhYWDogVXNlIGEgZmxhdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgT01BUDMgaW50ZXJjb25uZWN0LgorCSAqIFRoZSByZWFsIE9NQVAgaW50ZXJjb25uZWN0IG5ldHdvcmsgaXMgcXVpdGUgY29tcGxleC4KKwkgKiBTaW5jZSB0aGF0IHdpbGwgbm90IGJyaW5nIHJlYWwgYWR2YW50YWdlIHRvIHJlcHJlc2VudCB0aGF0IGluIERUIGZvcgorCSAqIHRoZSBtb21lbnQsIGp1c3QgdXNlIGEgZmFrZSBPQ1AgYnVzIGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgYnVzCisJICogaGllcmFyY2h5LgorCSAqLworCW9jcCB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzOworCQl0aSxod21vZHMgPSAibDNfbWFpbiI7CisKKwkJaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMSB7CisJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWludGMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtcGFuZGEuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtcGFuZGEuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDI2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1wYW5kYS5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJvbWFwNC5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJUSSBPTUFQNCBQYW5kYUJvYXJkIjsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LXBhbmRhIiwgInRpLG9tYXA0NDMwIiwgInRpLG9tYXA0IjsKKworCS8qCisJICogU2luY2UgdGhlIGluaXRpYWwgZGV2aWNlIHRyZWUgYm9hcmQgZmlsZSBkb2VzIG5vdCBjcmVhdGUgYW55CisJICogZGV2aWNlcyAoTU1DLCBuZXR3b3JrLi4uKSwgdGhlIG9ubHkgd2F5IHRvIGJvb3QgaXMgdG8gcHJvdmlkZSBhCisJICogcmFtZGlzay4KKwkgKi8KKwljaG9zZW4geworCQlib290YXJncyA9ICJyb290PS9kZXYvcmFtMCBydyBjb25zb2xlPXR0eU8yLDExNTIwMG44IGluaXRyZD0weDgxNjAwMDAwLDIwTSByYW1kaXNrX3NpemU9MjA0ODAgbm9fY29uc29sZV9zdXNwZW5kIGRlYnVnIjsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4ODAwMDAwMDAgMHg0MDAwMDAwMD47IC8qIDEgR0IgKi8KKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXNkcC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1zZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmUyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1zZHAuZHRzCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworL2R0cy12MS87CisKKy9pbmNsdWRlLyAib21hcDQuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiVEkgT01BUDQgU0RQIGJvYXJkIjsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0LXNkcCIsICJ0aSxvbWFwNDQzMCIsICJ0aSxvbWFwNCI7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBpbml0aWFsIGRldmljZSB0cmVlIGJvYXJkIGZpbGUgZG9lcyBub3QgY3JlYXRlIGFueQorCSAqIGRldmljZXMgKE1NQywgbmV0d29yay4uLiksIHRoZSBvbmx5IHdheSB0byBib290IGlzIHRvIHByb3ZpZGUgYQorCSAqIHJhbWRpc2suCisJICovCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAicm9vdD0vZGV2L3JhbTAgcncgY29uc29sZT10dHlPMiwxMTUyMDBuOCBpbml0cmQ9MHg4MTYwMDAwMCwyME0gcmFtZGlza19zaXplPTIwNDgwIG5vX2NvbnNvbGVfc3VzcGVuZCBkZWJ1ZyI7CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDgwMDAwMDAwIDB4NDAwMDAwMDA+OyAvKiAxIEdCICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwNC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzYxYzgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBDYXJ2ZW91dCBmb3IgbXVsdGltZWRpYSB1c2VjYXNlcworICogSXQgc2hvdWxkIGJlIHRoZSBsYXN0IDQ4TUIgb2YgdGhlIGZpcnN0IDUxMk1CIG1lbW9yeSBwYXJ0CisgKiBJbiB0aGVvcnksIGl0IHNob3VsZCBub3QgZXZlbiBleGlzdC4gVGhhdCB6b25lIHNob3VsZCBiZSByZXNlcnZlZAorICogZHluYW1pY2FsbHkgZHVyaW5nIHRoZSAucmVzZXJ2ZSBjYWxsYmFjay4KKyAqLworL21lbXJlc2VydmUvIDB4OWQwMDAwMDAgMHgwMzAwMDAwMDsKKworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwljb21wYXRpYmxlID0gInRpLG9tYXA0NDMwIiwgInRpLG9tYXA0IjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCisJYWxpYXNlcyB7CisJfTsKKworCWNwdXMgeworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQl9OworCQljcHVAMSB7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTkiOworCQl9OworCX07CisKKwkvKgorCSAqIFRoZSBzb2Mgbm9kZSByZXByZXNlbnRzIHRoZSBzb2MgdG9wIGxldmVsIHZpZXcuIEl0IGlzIHVzZXMgZm9yIElQcworCSAqIHRoYXQgYXJlIG5vdCBtZW1vcnkgbWFwcGVkIGluIHRoZSBNUFUgdmlldyBvciBmb3IgdGhlIE1QVSBpdHNlbGYuCisJICovCisJc29jIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwLWluZnJhIjsKKwkJbXB1IHsKKwkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtbXB1IjsKKwkJCXRpLGh3bW9kcyA9ICJtcHUiOworCQl9OworCisJCWRzcCB7CisJCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWM2NCI7CisJCQl0aSxod21vZHMgPSAiZHNwIjsKKwkJfTsKKworCQlpdmEgeworCQkJY29tcGF0aWJsZSA9ICJ0aSxpdmFoZCI7CisJCQl0aSxod21vZHMgPSAiaXZhIjsKKwkJfTsKKwl9OworCisJLyoKKwkgKiBYWFg6IFVzZSBhIGZsYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIE9NQVA0IGludGVyY29ubmVjdC4KKwkgKiBUaGUgcmVhbCBPTUFQIGludGVyY29ubmVjdCBuZXR3b3JrIGlzIHF1aXRlIGNvbXBsZXguCisJICoKKwkgKiBNUFUgLSstLSBNUFVfUFJJVkFURSAtIEdJQywgTDIKKwkgKiAgICAgIHwKKwkgKiAgICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisJICogICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorCSAqICAgICAgKyAgICAgICAgICAgICstIEVNSUYgLSBERFIgIHwKKwkgKiAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisJICogICAgICB8ICAgICAgICAgICAgKyAgICAgKy0tLS0tLS0tKworCSAqICAgICAgfCAgICAgICAgICAgIHwgICAgIHwKKwkgKiAgICAgIHwgICAgICAgICAgICArLSBMNF9BQkUgLSBBRVNTLCBNQ0JTUCwgVElNRVJzLi4uCisJICogICAgICB8ICAgICAgICAgICAgfAorCSAqICAgICAgKy0gTDNfTUFJTiAtLSstIEw0X0NPUkUgLSBJUHMuLi4KKwkgKiAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gTDRfUEVSIC0gSVBzLi4uCisJICogICAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICstIEw0X0NGRyAtKy0gTDRfV0tVUCAtIElQcy4uLgorCSAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgKy0gSVBzLi4uCisJICogICAgICAgICAgICAgICAgICAgKy0gSVBVIC0tLS0rCisJICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gRFNQIC0tLS0rCisJICogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICAgKy0gRFNTIC0tLS0rCisJICoKKwkgKiBTaW5jZSB0aGF0IHdpbGwgbm90IGJyaW5nIHJlYWwgYWR2YW50YWdlIHRvIHJlcHJlc2VudCB0aGF0IGluIERUIGZvcgorCSAqIHRoZSBtb21lbnQsIGp1c3QgdXNlIGEgZmFrZSBPQ1AgYnVzIGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgYnVzCisJICogaGllcmFyY2h5LgorCSAqLworCW9jcCB7CisJCWNvbXBhdGlibGUgPSAidGksb21hcDQtbDMtbm9jIiwgInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKwkJdGksaHdtb2RzID0gImwzX21haW5fMSIsICJsM19tYWluXzIiLCAibDNfbWFpbl8zIjsKKworCQlnaWM6IGludGVycnVwdC1jb250cm9sbGVyQDQ4MjQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4NDgyNDEwMDAgMHgxMDAwPiwKKwkJCSAgICAgIDwweDQ4MjQwMTAwIDB4MDEwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDIuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3BpY294Y2VsbC1wYzN4Mi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYThjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDIuZHRzaQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgUGljb2NoaXAsIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisvIHsKKwltb2RlbCA9ICJQaWNvY2hpcCBwaWNvWGNlbGwgUEMzWDIiOworCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQljb21wYXRpYmxlID0gImFybSwxMTc2anotcyI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwMDAwPjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLXNpemUgPSA8MzI3Njg+OworCQl9OworCX07CisKKwljbG9ja3MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQlwY2xrOiBjbG9ja0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiLCAicGNsayI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQl9OworCX07CisKKwlwYXhpIHsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXMgPSA8MCAweDgwMDAwMDAwIDB4NDAwMDAwPjsKKworCQllbWFjOiBnZW1AMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJjYWRlbmNlLGdlbSI7CisJCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQl9OworCisJCWRtYWMxOiBkbWFjQDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1kbWFjIjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwyNT47CisJCX07CisKKwkJZG1hYzI6IGRtYWNANTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWRtYWMiOworCQkJcmVnID0gPDB4NTAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDI2PjsKKwkJfTsKKworCQl2aWMwOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2MDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDE5Mi12aWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8MHg2MDAwMCAweDEwMDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQl2aWMxOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2NDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDE5Mi12aWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlyZWcgPSA8MHg2NDAwMCAweDEwMDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlmdXNlOiBwaWNveGNlbGwtZnVzZUA4MDAwMCB7CisJCQljb21wYXRpYmxlID0gInBpY294Y2VsbCxmdXNlLXBjM3gyIjsKKwkJCXJlZyA9IDwweDgwMDAwIDB4MTAwMDA+OworCQl9OworCisJCXNzaTogcGljb3hjZWxsLXNwaUA5MDAwMCB7CisJCQljb21wYXRpYmxlID0gInBpY294Y2VsbCxzcGkiOworCQkJcmVnID0gPDB4OTAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworCQl9OworCisJCWlwc2VjOiBzcGFjY0AxMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyI7CisJCQlyZWcgPSA8MHgxMDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjQ+OworCQkJcmVmLWNsb2NrID0gPCZwY2xrPiwgInJlZiI7CisJCX07CisKKwkJc3J0cDogc3BhY2NAMTQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2Mtc3J0cCI7CisJCQlyZWcgPSA8MHgxNDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjM+OworCQl9OworCisJCWwyX2VuZ2luZTogc3BhY2NAMTgwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtbDIiOworCQkJcmVnID0gPDB4MTgwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCXJlZi1jbG9jayA9IDwmcGNsaz4sICJyZWYiOworCQl9OworCisJCWFwYiB7CisJCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwwIDB4MjAwMDAwIDB4ODAwMDA+OworCisJCQlydGMwOiBydGNAMDAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItcnRjIjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MDAwMDAgMHhmPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJfTsKKworCQkJdGltZXIwOiB0aW1lckAxMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi10aW1lciI7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDw0PjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MTAwMDAgMHgxND47CisJCQl9OworCisJCQl0aW1lcjE6IHRpbWVyQDEwMDE0IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgxMDAxNCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMjogdGltZXJAMTAwMjggeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8Nj47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDEwMDI4IDB4MTQ+OworCQkJfTsKKworCQkJdGltZXIzOiB0aW1lckAxMDAzYyB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi10aW1lciI7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDw3PjsKKwkJCQljbG9jay1mcmVxID0gPDIwMDAwMDAwMD47CisJCQkJcmVnID0gPDB4MTAwM2MgMHgxND47CisJCQl9OworCisJCQlncGlvOiBncGlvQDIwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLWdwaW8iOworCQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCisJCQkJYmFua2E6IGdwaW8tY29udHJvbGxlckAwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDw4PjsKKworCQkJCQlyZWdvZmZzZXQtZGF0ID0gPDB4NTA+OworCQkJCQlyZWdvZmZzZXQtc2V0ID0gPDB4MDA+OworCQkJCQlyZWdvZmZzZXQtZGlyb3V0ID0gPDB4MDQ+OworCQkJCX07CisKKwkJCQliYW5rYjogZ3Bpby1jb250cm9sbGVyQDEgeworCQkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLWdwaW8tYmFuayI7CisJCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJCWdwaW8tZ2VuZXJpYyxuci1ncGlvID0gPDg+OworCisJCQkJCXJlZ29mZnNldC1kYXQgPSA8MHg1ND47CisJCQkJCXJlZ29mZnNldC1zZXQgPSA8MHgwYz47CisJCQkJCXJlZ29mZnNldC1kaXJvdXQgPSA8MHgxMD47CisJCQkJfTsKKwkJCX07CisKKwkJCXVhcnQwOiB1YXJ0QDMwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXVhcnQiOworCQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMT47CisJCQkJaW50ZXJydXB0cyA9IDwxMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDM2ODY0MDA+OworCQkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCQlyZWctaW8td2lkdGggPSA8ND47CisJCQl9OworCisJCQl1YXJ0MTogdWFydEA0MDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi11YXJ0IjsKKwkJCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzE+OworCQkJCWludGVycnVwdHMgPSA8OT47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDM2ODY0MDA+OworCQkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCQlyZWctaW8td2lkdGggPSA8ND47CisJCQl9OworCisJCQl3ZG9nOiB3YXRjaGRvZ0A1MDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi13ZGciOworCQkJCXJlZyA9IDwweDUwMDAwIDB4MTAwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8MTE+OworCQkJCWJ1cy1jbG9jayA9IDwmcGNsaz4sICJidXMiOworCQkJfTsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlczsKKworCQllYmlANTAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MCAwIDB4NDAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMSAwIDB4NDgwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMiAwIDB4NTAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMyAwIDB4NTgwMDAwMDAgMHgwODAwMDAwMD47CisJCX07CisKKwkJYXhpMnBpY29AYzAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxheGkycGljby1wYzN4MiI7CisJCQlyZWcgPSA8MHhjMDAwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjE+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjM3gzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGMzeDMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE5NjJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjM3gzLmR0c2kKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIFBpY29jaGlwLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorLyB7CisJbW9kZWwgPSAiUGljb2NoaXAgcGljb1hjZWxsIFBDM1gzIjsKKwljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sMTE3Nmp6LXMiOworCQkJY3B1LWNsb2NrID0gPCZhcm1fY2xrPiwgImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MzI3Njg+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1zaXplID0gPDMyNzY4PjsKKwkJfTsKKwl9OworCisJY2xvY2tzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXM7CisKKwkJY2xrZ2F0ZTogY2xrZ2F0ZUA4MDBhMDA0OCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcmVnID0gPDB4ODAwYTAwNDggND47CisJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWNsay1nYXRlIjsKKworCQkJdHpwcm90X2NsazogY2xvY2tAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8MD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlzcGlfY2xrOiBjbG9ja0AxIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDwxPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCWRtYWMwX2NsazogY2xvY2tAMiB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8Mj47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlkbWFjMV9jbGs6IGNsb2NrQDMgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDM+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKworCQkJZWJpX2NsazogY2xvY2tANCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4My1nYXRlZC1jbGsiOworCQkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIjsKKwkJCQlwaWNvY2hpcCxjbGstZGlzYWJsZS1iaXQgPSA8ND47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQkJcmVmLWNsb2NrID0gPCZyZWZfY2xrPiwgInJlZiI7CisJCQl9OworCisJCQlpcHNlY19jbGs6IGNsb2NrQDUgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDU+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKworCQkJbDJfY2xrOiBjbG9ja0A2IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw2PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCXRybmdfY2xrOiBjbG9ja0A3IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw3PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCWZ1c2VfY2xrOiBjbG9ja0A4IHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLWdhdGVkLWNsayI7CisJCQkJY2xvY2stb3V0cHV0cyA9ICJidXMiOworCQkJCXBpY29jaGlwLGNsay1kaXNhYmxlLWJpdCA9IDw4PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCX07CisKKwkJCW90cF9jbGs6IGNsb2NrQDkgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDMtZ2F0ZWQtY2xrIjsKKwkJCQljbG9jay1vdXRwdXRzID0gImJ1cyI7CisJCQkJcGljb2NoaXAsY2xrLWRpc2FibGUtYml0ID0gPDk+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZi1jbG9jayA9IDwmcmVmX2Nsaz4sICJyZWYiOworCQkJfTsKKwkJfTsKKworCQlhcm1fY2xrOiBjbG9ja0AxMSB7CisJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gzLXBsbCI7CisJCQlyZWcgPSA8MHg4MDBhMDA1MCAweDg+OworCQkJcGljb2NoaXAsbWluLWZyZXEgPSA8MTQwMDAwMDAwPjsKKwkJCXBpY29jaGlwLG1heC1mcmVxID0gPDcwMDAwMDAwMD47CisJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJCWNsb2NrLW91dHB1dHMgPSAiY3B1IjsKKwkJfTsKKworCQlwY2xrOiBjbG9ja0AxMiB7CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLW91dHB1dHMgPSAiYnVzIiwgInBjbGsiOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47CisJCQlyZWYtY2xvY2sgPSA8JnJlZl9jbGs+LCAicmVmIjsKKwkJfTsKKwl9OworCisJcGF4aSB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzID0gPDAgMHg4MDAwMDAwMCAweDQwMDAwMD47CisKKwkJZW1hYzogZ2VtQDMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiY2FkZW5jZSxnZW0iOworCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MzE+OworCQl9OworCisJCWRtYWMxOiBkbWFjQDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1kbWFjIjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDI1PjsKKwkJfTsKKworCQlkbWFjMjogZG1hY0A1MDAwMCB7CisJCQljb21wYXRpYmxlID0gInNucHMsZHctZG1hYyI7CisJCQlyZWcgPSA8MHg1MDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJaW50ZXJydXB0cyA9IDwyNj47CisJCX07CisKKwkJdmljMDogaW50ZXJydXB0LWNvbnRyb2xsZXJANjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJcmVnID0gPDB4NjAwMDAgMHgxMDAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJdmljMTogaW50ZXJydXB0LWNvbnRyb2xsZXJANjQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJcmVnID0gPDB4NjQwMDAgMHgxMDAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJZnVzZTogcGljb3hjZWxsLWZ1c2VAODAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNveGNlbGwsZnVzZS1wYzN4MyI7CisJCQlyZWcgPSA8MHg4MDAwMCAweDEwMDAwPjsKKwkJfTsKKworCQlzc2k6IHBpY294Y2VsbC1zcGlAOTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNveGNlbGwsc3BpIjsKKwkJCXJlZyA9IDwweDkwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJfTsKKworCQlpcHNlYzogc3BhY2NAMTAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtaXBzZWMiOworCQkJcmVnID0gPDB4MTAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCXJlZi1jbG9jayA9IDwmaXBzZWNfY2xrPiwgInJlZiI7CisJCX07CisKKwkJc3J0cDogc3BhY2NAMTQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2Mtc3J0cCI7CisJCQlyZWcgPSA8MHgxNDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCWludGVycnVwdHMgPSA8MjM+OworCQl9OworCisJCWwyX2VuZ2luZTogc3BhY2NAMTgwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsc3BhY2MtbDIiOworCQkJcmVnID0gPDB4MTgwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCXJlZi1jbG9jayA9IDwmbDJfY2xrPiwgInJlZiI7CisJCX07CisKKwkJYXBiIHsKKwkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmFuZ2VzID0gPDAgMHgyMDAwMDAgMHg4MDAwMD47CisKKwkJCXJ0YzA6IHJ0Y0AwMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi1ydGMiOworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgwMDAwMCAweGY+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8OD47CisJCQl9OworCisJCQl0aW1lcjA6IHRpbWVyQDEwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHgxMDAwMCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMTogdGltZXJAMTAwMTQgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8NT47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDEwMDE0IDB4MTQ+OworCQkJfTsKKworCQkJZ3BpbzogZ3Bpb0AyMDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvIjsKKwkJCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKworCQkJCWJhbmthOiBncGlvLWNvbnRyb2xsZXJAMCB7CisJCQkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1hcGItZ3Bpby1iYW5rIjsKKwkJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQkJZ3Bpby1nZW5lcmljLG5yLWdwaW8gPSA8OD47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDUwPjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDAwPjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDA0PjsKKwkJCQl9OworCisJCQkJYmFua2I6IGdwaW8tY29udHJvbGxlckAxIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDwxNj47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDU0PjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDBjPjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDEwPjsKKwkJCQl9OworCisJCQkJYmFua2Q6IGdwaW8tY29udHJvbGxlckAyIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3LWFwYi1ncGlvLWJhbmsiOworCQkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCQlncGlvLWdlbmVyaWMsbnItZ3BpbyA9IDwzMD47CisKKwkJCQkJcmVnb2Zmc2V0LWRhdCA9IDwweDVjPjsKKwkJCQkJcmVnb2Zmc2V0LXNldCA9IDwweDI0PjsKKwkJCQkJcmVnb2Zmc2V0LWRpcm91dCA9IDwweDI4PjsKKwkJCQl9OworCQkJfTsKKworCQkJdWFydDA6IHVhcnRAMzAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAic25wcyxkdy1hcGItdWFydCI7CisJCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MzY4NjQwMD47CisJCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCX07CisKKwkJCXVhcnQxOiB1YXJ0QDQwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXVhcnQiOworCQkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMT47CisJCQkJaW50ZXJydXB0cyA9IDw5PjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MzY4NjQwMD47CisJCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCX07CisKKwkJCXdkb2c6IHdhdGNoZG9nQDUwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInNucHMsZHctYXBiLXdkZyI7CisJCQkJcmVnID0gPDB4NTAwMDAgMHgxMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMT47CisJCQkJYnVzLWNsb2NrID0gPCZwY2xrPiwgImJ1cyI7CisJCQl9OworCisJCQl0aW1lcjI6IHRpbWVyQDYwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gInBpY29jaGlwLHBjM3gyLXRpbWVyIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDY+OworCQkJCWNsb2NrLWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCQlyZWcgPSA8MHg2MDAwMCAweDE0PjsKKwkJCX07CisKKwkJCXRpbWVyMzogdGltZXJANjAwMTQgeworCQkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJCWludGVycnVwdHMgPSA8Nz47CisJCQkJY2xvY2stZnJlcSA9IDwyMDAwMDAwMDA+OworCQkJCXJlZyA9IDwweDYwMDE0IDB4MTQ+OworCQkJfTsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlczsKKworCQllYmlANTAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlyYW5nZXMgPSA8MCAwIDB4NDAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMSAwIDB4NDgwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMiAwIDB4NTAwMDAwMDAgMHgwODAwMDAwMAorCQkJCSAgMyAwIDB4NTgwMDAwMDAgMHgwODAwMDAwMD47CisJCX07CisKKwkJYXhpMnBpY29AYzAwMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxheGkycGljby1wYzN4MyI7CisJCQlyZWcgPSA8MHhjMDAwMDAwMCAweDEwMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYzA+OworCQkJaW50ZXJydXB0cyA9IDwxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMT47CisJCX07CisKKwkJb3RwQGZmZmY4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicGljb2NoaXAsb3RwLXBjM3gzIjsKKwkJCXJlZyA9IDwweGZmZmY4MDAwIDB4ODAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gyLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3BpY294Y2VsbC1wYzczMDItcGMzeDIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTc0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gyLmR0cwpAQCAtMCwwICsxLDg2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMSBQaWNvY2hpcCwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvaW5jbHVkZS8gInBpY294Y2VsbC1wYzN4Mi5kdHNpIgorLyB7CisJbW9kZWwgPSAiUGljb2NoaXAgUEM3MzAyIChQQzNYMikiOworCWNvbXBhdGlibGUgPSAicGljb2NoaXAscGM3MzAyLXBjM3gyIiwgInBpY29jaGlwLHBjM3gyIjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAgMHgwODAwMDAwMD47CisJfTsKKworCWNob3NlbiB7CisJCWxpbnV4LHN0ZG91dC1wYXRoID0gJnVhcnQwOworCX07CisKKwljbG9ja3MgeworCQlyZWZfY2xrOiBjbG9ja0AxIHsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stb3V0cHV0cyA9ICJyZWYiOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJcndpZC1heGkgeworCQllYmlANTAwMDAwMDAgeworCQkJbmFuZDogZ3Bpby1uYW5kQDIsMCB7CisJCQkJY29tcGF0aWJsZSA9ICJncGlvLWNvbnRyb2wtbmFuZCI7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJcmVnID0gPDIgMHgwMDAwIDB4MTAwMD47CisJCQkJYnVzLWNsb2NrID0gPCZwY2xrPiwgImJ1cyI7CisJCQkJZ3Bpby1jb250cm9sLW5hbmQsaW8tc3luYy1yZWcgPQorCQkJCQk8MHgwMDAwMDAwMCAweDgwMjIwMDAwPjsKKworCQkJCWdwaW9zID0gPCZiYW5rYSAxIDAJLyogcmR5ICovCisJCQkJCSAmYmFua2EgMiAwIAkvKiBuY2UgKi8KKwkJCQkJICZiYW5rYSAzIDAgCS8qIGFsZSAqLworCQkJCQkgJmJhbmthIDQgMCAJLyogY2xlICovCisJCQkJCSAwCQkvKiBud3AgKi8+OworCisJCQkJYm9vdEAxMDAwMDAgeworCQkJCQlsYWJlbCA9ICJCb290IjsKKwkJCQkJcmVnID0gPDB4MTAwMDAwIDB4ODAwMDA+OworCQkJCX07CisKKwkJCQlyZWR1bmRhbnQtYm9vdEAyMDAwMDAgeworCQkJCQlsYWJlbCA9ICJSZWR1bmRhbnQgQm9vdCI7CisJCQkJCXJlZyA9IDwweDIwMDAwMCAweDgwMDAwPjsKKwkJCQl9OworCisJCQkJYm9vdC1lbnZAMzAwMDAwIHsKKwkJCQkJbGFiZWwgPSAiQm9vdCBFdmlyb25tZW50IjsKKwkJCQkJcmVnID0gPDB4MzAwMDAwIDB4MjAwMDA+OworCQkJCX07CisKKwkJCQlyZWR1bmRhbnQtYm9vdC1lbnZAMzIwMDAwIHsKKwkJCQkJbGFiZWwgPSAiUmVkdW5kYW50IEJvb3QgRW52aXJvbm1lbnQiOworCQkJCQlyZWcgPSA8MHgzMDAwMDAgMHgyMDAwMD47CisJCQkJfTsKKworCQkJCWtlcm5lbEAzODAwMDAgeworCQkJCQlsYWJlbCA9ICJLZXJuZWwiOworCQkJCQlyZWcgPSA8MHgzODAwMDAgMHg4MDAwMDA+OworCQkJCX07CisKKwkJCQlmc0BiODAwMDAgeworCQkJCQlsYWJlbCA9ICJGaWxlIFN5c3RlbSI7CisJCQkJCXJlZyA9IDwweGI4MDAwMCAweGY0ODAwMDA+OworCQkJCX07CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjNzMwMi1wYzN4My5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9waWNveGNlbGwtcGM3MzAyLXBjM3gzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTMxN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcGljb3hjZWxsLXBjNzMwMi1wYzN4My5kdHMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgUGljb2NoaXAsIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJwaWNveGNlbGwtcGMzeDMuZHRzaSIKKy8geworCW1vZGVsID0gIlBpY29jaGlwIFBDNzMwMiAoUEMzWDMpIjsKKwljb21wYXRpYmxlID0gInBpY29jaGlwLHBjNzMwMi1wYzN4MyIsICJwaWNvY2hpcCxwYzN4MyI7CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwIDB4MDgwMDAwMDA+OworCX07CisKKwljaG9zZW4geworCQlsaW51eCxzdGRvdXQtcGF0aCA9ICZ1YXJ0MDsKKwl9OworCisJY2xvY2tzIHsKKwkJcmVmX2NsazogY2xvY2tAMTAgeworCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCQljbG9jay1vdXRwdXRzID0gInJlZiI7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MjAwMDAwMDA+OworCQl9OworCisJCWNsa2dhdGU6IGNsa2dhdGVAODAwYTAwNDggeworCQkJY2xvY2tANCB7CisJCQkJcGljb2NoaXAsY2xrLW5vLWRpc2FibGU7CisJCQl9OworCQl9OworCX07CisKKwlyd2lkLWF4aSB7CisJCWViaUA1MDAwMDAwMCB7CisJCQluYW5kOiBncGlvLW5hbmRAMiwwIHsKKwkJCQljb21wYXRpYmxlID0gImdwaW8tY29udHJvbC1uYW5kIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MiAweDAwMDAgMHgxMDAwPjsKKwkJCQlidXMtY2xvY2sgPSA8JmViaV9jbGs+LCAiYnVzIjsKKwkJCQlncGlvLWNvbnRyb2wtbmFuZCxpby1zeW5jLXJlZyA9CisJCQkJCTwweDAwMDAwMDAwIDB4ODAyMjAwMDA+OworCisJCQkJZ3Bpb3MgPSA8JmJhbmthIDEgMAkvKiByZHkgKi8KKwkJCQkJICZiYW5rYSAyIDAgCS8qIG5jZSAqLworCQkJCQkgJmJhbmthIDMgMCAJLyogYWxlICovCisJCQkJCSAmYmFua2EgNCAwIAkvKiBjbGUgKi8KKwkJCQkJIDAJCS8qIG53cCAqLz47CisKKwkJCQlib290QDEwMDAwMCB7CisJCQkJCWxhYmVsID0gIkJvb3QiOworCQkJCQlyZWcgPSA8MHgxMDAwMDAgMHg4MDAwMD47CisJCQkJfTsKKworCQkJCXJlZHVuZGFudC1ib290QDIwMDAwMCB7CisJCQkJCWxhYmVsID0gIlJlZHVuZGFudCBCb290IjsKKwkJCQkJcmVnID0gPDB4MjAwMDAwIDB4ODAwMDA+OworCQkJCX07CisKKwkJCQlib290LWVudkAzMDAwMDAgeworCQkJCQlsYWJlbCA9ICJCb290IEV2aXJvbm1lbnQiOworCQkJCQlyZWcgPSA8MHgzMDAwMDAgMHgyMDAwMD47CisJCQkJfTsKKworCQkJCXJlZHVuZGFudC1ib290LWVudkAzMjAwMDAgeworCQkJCQlsYWJlbCA9ICJSZWR1bmRhbnQgQm9vdCBFbnZpcm9ubWVudCI7CisJCQkJCXJlZyA9IDwweDMwMDAwMCAweDIwMDAwPjsKKwkJCQl9OworCisJCQkJa2VybmVsQDM4MDAwMCB7CisJCQkJCWxhYmVsID0gIktlcm5lbCI7CisJCQkJCXJlZyA9IDwweDM4MDAwMCAweDgwMDAwMD47CisJCQkJfTsKKworCQkJCWZzQGI4MDAwMCB7CisJCQkJCWxhYmVsID0gIkZpbGUgU3lzdGVtIjsKKwkJCQkJcmVnID0gPDB4YjgwMDAwIDB4ZjQ4MDAwMD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTItY2IuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvcHJpbWEyLWNiLmR0cwppbmRleCA2ZmVjYzg4Li4zNGFlM2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9wcmltYTItY2IuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ByaW1hMi1jYi5kdHMKQEAgLTM5LDkgKzM5LDEyIEBACiAJCXJhbmdlcyA9IDwweDQwMDAwMDAwIDB4NDAwMDAwMDAgMHg4MDAwMDAwMD47CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckA4MDA0MDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSI7CisJCQljb21wYXRpYmxlID0gImFybSxwbDMxMC1jYWNoZSIsICJzaXJmLHByaW1hMi1wbDMxMC1jYWNoZSI7CiAJCQlyZWcgPSA8MHg4MDA0MDAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw1OT47CisJCQlhcm0sdGFnLWxhdGVuY3kgPSA8MSAxIDE+OworCQkJYXJtLGRhdGEtbGF0ZW5jeSA9IDwxIDEgMT47CisJCQlhcm0sZmlsdGVyLXJhbmdlcyA9IDwwIDB4NDAwMDAwMDA+OwogCQl9OwogCiAJCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDgwMDIwMDAwIHsKQEAgLTY3LDYgKzcwLDExIEBACiAJCQkJY29tcGF0aWJsZSA9ICJzaXJmLHByaW1hMi1yc3RjIjsKIAkJCQlyZWcgPSA8MHg4ODAxMDAwMCAweDEwMDA+OwogCQkJfTsKKworCQkJcnNjLWNvbnRyb2xsZXJAODgwMjAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnNjIjsKKwkJCQlyZWcgPSA8MHg4ODAyMDAwMCAweDEwMDA+OworCQkJfTsKIAkJfTsKIAogCQltZW0taW9iZyB7CkBAIC0yNzQsNyArMjgyLDcgQEAKIAkJCWdwaW86IGdwaW8tY29udHJvbGxlckBiMDEyMDAwMCB7CiAJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQljb21wYXRpYmxlID0gInNpcmYscHJpbWEyLWdwaW8iOworCQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItZ3Bpby1waW5tdXgiOwogCQkJCXJlZyA9IDwweGIwMTIwMDAwIDB4MTAwMDA+OwogCQkJCWdwaW8tY29udHJvbGxlcjsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTM1OCw3ICszNjYsNyBAQAogCQl9OwogCiAJCXJ0Yy1pb2JnIHsKLQkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnRjaW9iZyIsICJzaW1wbGUtYnVzIjsKKwkJCWNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcnRjaW9iZyIsICJzaXJmLXByaW1hMi1ydGNpb2JnLWJ1cyI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJcmVnID0gPDB4ODAwMzAwMDAgMHgxMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1oYXJtb255LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCmluZGV4IGU1ODE4NjYuLjBlMjI1YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCkBAIC02Niw1ICs2Niw2IEBACiAJCWNkLWdwaW9zID0gPCZncGlvIDU4IDA+OyAvKiBncGlvIFBIMiAqLwogCQl3cC1ncGlvcyA9IDwmZ3BpbyA1OSAwPjsgLyogZ3BpbyBQSDMgKi8KIAkJcG93ZXItZ3Bpb3MgPSA8JmdwaW8gNzAgMD47IC8qIGdwaW8gUEk2ICovCisJCXN1cHBvcnQtOGJpdDsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXNlYWJvYXJkLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXNlYWJvYXJkLmR0cwppbmRleCA2NGNlZGNhLi5hNzIyOTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzCkBAIC0yNSw0ICsyNSw4IEBACiAJCXdwLWdwaW9zID0gPCZncGlvIDU3IDA+OyAvKiBncGlvIFBIMSAqLwogCQlwb3dlci1ncGlvcyA9IDwmZ3BpbyA3MCAwPjsgLyogZ3BpbyBQSTYgKi8KIAl9OworCisJc2RoY2lAYzgwMDA2MDAgeworCQlzdXBwb3J0LThiaXQ7CisJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS12ZW50YW5hLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXZlbnRhbmEuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWFiZDZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtdmVudGFuYS5kdHMKQEAgLTAsMCArMSwzMSBAQAorL2R0cy12MS87CisKKy9tZW1yZXNlcnZlLyAweDFjMDAwMDAwIDB4MDQwMDAwMDA7CisvaW5jbHVkZS8gInRlZ3JhMjAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiTlZJRElBIFRlZ3JhMiBWZW50YW5hIGV2YWx1YXRpb24gYm9hcmQiOworCWNvbXBhdGlibGUgPSAibnZpZGlhLHZlbnRhbmEiLCAibnZpZGlhLHRlZ3JhMjAiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAidm1hbGxvYz0xOTJNIHZpZGVvPXRlZ3JhZmIgY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvcmFtIHJkaW5pdD0vc2Jpbi9pbml0IjsKKwl9OworCisJbWVtb3J5IHsKKwkJcmVnID0gPCAweDAwMDAwMDAwIDB4NDAwMDAwMDAgPjsKKwl9OworCisJc2VyaWFsQDcwMDA2MzAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPCAyMTYwMDAwMDAgPjsKKwl9OworCisJc2RoY2lAYzgwMDA0MDAgeworCQljZC1ncGlvcyA9IDwmZ3BpbyA2OSAwPjsgLyogZ3BpbyBQSTUgKi8KKwkJd3AtZ3Bpb3MgPSA8JmdwaW8gNTcgMD47IC8qIGdwaW8gUEgxICovCisJCXBvd2VyLWdwaW9zID0gPCZncGlvIDcwIDA+OyAvKiBncGlvIFBJNiAqLworCX07CisKKwlzZGhjaUBjODAwMDYwMCB7CisJCXN1cHBvcnQtOGJpdDsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaQppbmRleCA1NzI3NTk1Li42NWQ3ZTZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpCkBAIC03Nyw2ICs3NywxNCBAQAogCQlncGlvLWNvbnRyb2xsZXI7CiAJfTsKIAorCXBpbm11eDogcGlubXV4QDcwMDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1waW5tdXgiOworCQlyZWcgPSA8IDB4NzAwMDAwMTQgMHgxMCAgICAvKiBUcmktc3RhdGUgcmVnaXN0ZXJzICovCisJCQkweDcwMDAwMDgwIDB4MjAgICAgLyogTXV4IHJlZ2lzdGVycyAqLworCQkJMHg3MDAwMDBhMCAweDE0ICAgIC8qIFB1bGwtdXAvZG93biByZWdpc3RlcnMgKi8KKwkJCTB4NzAwMDA4NjggMHhhOCA+OyAvKiBQYWQgY29udHJvbCByZWdpc3RlcnMgKi8KKwl9OworCiAJc2VyaWFsQDcwMDA2MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC11YXJ0IjsKIAkJcmVnID0gPDB4NzAwMDYwMDAgMHg0MD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy91c2JfYTlnMjAuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdXNiX2E5ZzIwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjZlMmMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdXNiX2E5ZzIwLmR0cwpAQCAtMCwwICsxLDMwIEBACisvKgorICogdXNiX2E5ZzIwLmR0cyAtIERldmljZSBUcmVlIGZpbGUgZm9yIENhbG9hIFVTQiBBOUcyMCBib2FyZAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KKyAqLworL2R0cy12MS87CisvaW5jbHVkZS8gImF0OTFzYW05ZzIwLmR0c2kiCisKKy8geworCW1vZGVsID0gIkNhbGFvIFVTQiBBOUcyMCI7CisJY29tcGF0aWJsZSA9ICJjYWxhbyx1c2ItYTlnMjAiLCAiYXRtZWwsYXQ5MXNhbTlnMjAiLCAiYXRtZWwsYXQ5MXNhbTkiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAibWVtPTY0TSBjb25zb2xlPXR0eVMwLDExNTIwMCBtdGRwYXJ0cz1hdG1lbF9uYW5kOjEyOGsoYXQ5MWJvb3RzdHJhcCksMjU2ayhiYXJlYm94KXJvLDEyOGsoYmFyZWJveGVudiksMTI4ayhiYXJlYm94ZW52MiksNE0oa2VybmVsKSwxMjBNKHJvb3RmcyksLShkYXRhKSByb290PS9kZXYvbXRkYmxvY2s1IHJ3IHJvb3Rmc3R5cGU9dWJpZnMiOworCX07CisKKwltZW1vcnlAMjAwMDAwMDAgeworCQlyZWcgPSA8MHgyMDAwMDAwMCAweDQwMDAwMDA+OworCX07CisKKwlhaGIgeworCQlhcGIgeworCQkJZGJndTogc2VyaWFsQGZmZmZmMjAwIHsKKwkJCQlzdGF0dXMgPSAib2theSI7CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL0tjb25maWcgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwppbmRleCA0YjcxNzY2Li43NGRmOWNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vS2NvbmZpZworKysgYi9hcmNoL2FybS9jb21tb24vS2NvbmZpZwpAQCAtMSw0ICsxLDUgQEAKIGNvbmZpZyBBUk1fR0lDCisJc2VsZWN0IElSUV9ET01BSU4KIAlib29sCiAKIGNvbmZpZyBBUk1fVklDCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggYmRiYjNmNy4uMGU2YWU0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMjQsMTAgKzI0LDIwIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KQEAgLTcxLDggKzgxLDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2ljX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IGdpY19jaGlwX2RhdGEgKmdpY19kYXRhID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JcmV0dXJuIGQtPmlycSAtIGdpY19kYXRhLT5pcnFfb2Zmc2V0OworCXJldHVybiBkLT5od2lycTsKIH0KIAogLyoKQEAgLTgwLDcgKzg5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZ2ljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQl1MzIgbWFzayA9IDEgPDwgKGQtPmlycSAlIDMyKTsKKwl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CiAKIAlyYXdfc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKIAl3cml0ZWxfcmVsYXhlZChtYXNrLCBnaWNfZGlzdF9iYXNlKGQpICsgR0lDX0RJU1RfRU5BQkxFX0NMRUFSICsgKGdpY19pcnEoZCkgLyAzMikgKiA0KTsKQEAgLTkxLDcgKzEwMCw3IEBACiAKIHN0YXRpYyB2b2lkIGdpY191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQl1MzIgbWFzayA9IDEgPDwgKGQtPmlycSAlIDMyKTsKKwl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CiAKIAlyYXdfc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKIAlpZiAoZ2ljX2FyY2hfZXh0bi5pcnFfdW5tYXNrKQpAQCAtMTcyLDcgKzE4MSw3IEBACiAJCQkgICAgYm9vbCBmb3JjZSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGdpY19kaXN0X2Jhc2UoZCkgKyBHSUNfRElTVF9UQVJHRVQgKyAoZ2ljX2lycShkKSAmIH4zKTsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAoZC0+aXJxICUgNCkgKiA4OworCXVuc2lnbmVkIGludCBzaGlmdCA9IChnaWNfaXJxKGQpICUgNCkgKiA4OwogCXVuc2lnbmVkIGludCBjcHUgPSBjcHVtYXNrX2FueV9hbmQobWFza192YWwsIGNwdV9vbmxpbmVfbWFzayk7CiAJdTMyIHZhbCwgbWFzaywgYml0OwogCkBAIC0yMjMsNyArMjMyLDcgQEAKIAlpZiAoZ2ljX2lycSA9PSAxMDIzKQogCQlnb3RvIG91dDsKIAotCWNhc2NhZGVfaXJxID0gZ2ljX2lycSArIGNoaXBfZGF0YS0+aXJxX29mZnNldDsKKwljYXNjYWRlX2lycSA9IGlycV9kb21haW5fdG9faXJxKCZjaGlwX2RhdGEtPmRvbWFpbiwgZ2ljX2lycSk7CiAJaWYgKHVubGlrZWx5KGdpY19pcnEgPCAzMiB8fCBnaWNfaXJxID4gMTAyMCB8fCBjYXNjYWRlX2lycSA+PSBOUl9JUlFTKSkKIAkJZG9fYmFkX0lSUShjYXNjYWRlX2lycSwgZGVzYyk7CiAJZWxzZQpAQCAtMjU1LDExICsyNjQsMTIgQEAKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIGdpY19oYW5kbGVfY2FzY2FkZV9pcnEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2Rpc3RfaW5pdChzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljLAotCXVuc2lnbmVkIGludCBpcnFfc3RhcnQpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2Rpc3RfaW5pdChzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljKQogewotCXVuc2lnbmVkIGludCBnaWNfaXJxcywgaXJxX2xpbWl0LCBpOworCXVuc2lnbmVkIGludCBpLCBpcnE7CiAJdTMyIGNwdW1hc2s7CisJdW5zaWduZWQgaW50IGdpY19pcnFzID0gZ2ljLT5naWNfaXJxczsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluID0gJmdpYy0+ZG9tYWluOwogCXZvaWQgX19pb21lbSAqYmFzZSA9IGdpYy0+ZGlzdF9iYXNlOwogCXUzMiBjcHUgPSAwOwogCkBAIC0yNzQsMTUgKzI4NCw2IEBACiAJd3JpdGVsX3JlbGF4ZWQoMCwgYmFzZSArIEdJQ19ESVNUX0NUUkwpOwogCiAJLyoKLQkgKiBGaW5kIG91dCBob3cgbWFueSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQuCi0JICogVGhlIEdJQyBvbmx5IHN1cHBvcnRzIHVwIHRvIDEwMjAgaW50ZXJydXB0IHNvdXJjZXMuCi0JICovCi0JZ2ljX2lycXMgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBHSUNfRElTVF9DVFIpICYgMHgxZjsKLQlnaWNfaXJxcyA9IChnaWNfaXJxcyArIDEpICogMzI7Ci0JaWYgKGdpY19pcnFzID4gMTAyMCkKLQkJZ2ljX2lycXMgPSAxMDIwOwotCi0JLyoKIAkgKiBTZXQgYWxsIGdsb2JhbCBpbnRlcnJ1cHRzIHRvIGJlIGxldmVsIHRyaWdnZXJlZCwgYWN0aXZlIGxvdy4KIAkgKi8KIAlmb3IgKGkgPSAzMjsgaSA8IGdpY19pcnFzOyBpICs9IDE2KQpAQCAtMzA4LDE5ICszMDksMjAgQEAKIAkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmZmZmZiwgYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUiArIGkgKiA0IC8gMzIpOwogCiAJLyoKLQkgKiBMaW1pdCBudW1iZXIgb2YgaW50ZXJydXB0cyByZWdpc3RlcmVkIHRvIHRoZSBwbGF0Zm9ybSBtYXhpbXVtCi0JICovCi0JaXJxX2xpbWl0ID0gZ2ljLT5pcnFfb2Zmc2V0ICsgZ2ljX2lycXM7Ci0JaWYgKFdBUk5fT04oaXJxX2xpbWl0ID4gTlJfSVJRUykpCi0JCWlycV9saW1pdCA9IE5SX0lSUVM7Ci0KLQkvKgogCSAqIFNldHVwIHRoZSBMaW51eCBJUlEgc3Vic3lzdGVtLgogCSAqLwotCWZvciAoaSA9IGlycV9zdGFydDsgaSA8IGlycV9saW1pdDsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmZ2ljX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGksIGdpYyk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOworCWlycV9kb21haW5fZm9yX2VhY2hfaXJxKGRvbWFpbiwgaSwgaXJxKSB7CisJCWlmIChpIDwgMzIpIHsKKwkJCWlycV9zZXRfcGVyY3B1X2RldmlkKGlycSk7CisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmZ2ljX2NoaXAsCisJCQkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX05PQVVUT0VOKTsKKwkJfSBlbHNlIHsKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZnaWNfY2hpcCwKKwkJCQkJCSBoYW5kbGVfZmFzdGVvaV9pcnEpOworCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKKwkJfQorCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGdpYyk7CiAJfQogCiAJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIEdJQ19ESVNUX0NUUkwpOwpAQCAtMzQ5LDIzICszNTEsMjcwIEBACiAJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIEdJQ19DUFVfQ1RSTCk7CiB9CiAKLXZvaWQgX19pbml0IGdpY19pbml0KHVuc2lnbmVkIGludCBnaWNfbnIsIHVuc2lnbmVkIGludCBpcnFfc3RhcnQsCisjaWZkZWYgQ09ORklHX0NQVV9QTQorLyoKKyAqIFNhdmVzIHRoZSBHSUMgZGlzdHJpYnV0b3IgcmVnaXN0ZXJzIGR1cmluZyBzdXNwZW5kIG9yIGlkbGUuICBNdXN0IGJlIGNhbGxlZAorICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGJ1dCBiZWZvcmUgcG93ZXJpbmcgZG93biB0aGUgR0lDLiAgQWZ0ZXIgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiwgbm8gaW50ZXJydXB0cyB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgR0lDLCBhbmQgYW5vdGhlcgorICogcGxhdGZvcm0tc3BlY2lmaWMgd2FrZXVwIHNvdXJjZSBtdXN0IGJlIGVuYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGdpY19kaXN0X3NhdmUodW5zaWduZWQgaW50IGdpY19ucikKK3sKKwl1bnNpZ25lZCBpbnQgZ2ljX2lycXM7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CisJaW50IGk7CisKKwlpZiAoZ2ljX25yID49IE1BWF9HSUNfTlIpCisJCUJVRygpOworCisJZ2ljX2lycXMgPSBnaWNfZGF0YVtnaWNfbnJdLmdpY19pcnFzOworCWRpc3RfYmFzZSA9IGdpY19kYXRhW2dpY19ucl0uZGlzdF9iYXNlOworCisJaWYgKCFkaXN0X2Jhc2UpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoZ2ljX2lycXMsIDE2KTsgaSsrKQorCQlnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3NwaV9jb25mW2ldID0KKwkJCXJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfQ09ORklHICsgaSAqIDQpOworCisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChnaWNfaXJxcywgNCk7IGkrKykKKwkJZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfdGFyZ2V0W2ldID0KKwkJCXJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfVEFSR0VUICsgaSAqIDQpOworCisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChnaWNfaXJxcywgMzIpOyBpKyspCisJCWdpY19kYXRhW2dpY19ucl0uc2F2ZWRfc3BpX2VuYWJsZVtpXSA9CisJCQlyZWFkbF9yZWxheGVkKGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBpICogNCk7Cit9CisKKy8qCisgKiBSZXN0b3JlcyB0aGUgR0lDIGRpc3RyaWJ1dG9yIHJlZ2lzdGVycyBkdXJpbmcgcmVzdW1lIG9yIHdoZW4gY29taW5nIG91dCBvZgorICogaWRsZS4gIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLiAgSWYgYSBsZXZlbCBpbnRlcnJ1cHQKKyAqIHRoYXQgb2NjdXJlZCB3aGlsZSB0aGUgR0lDIHdhcyBzdXNwZW5kZWQgaXMgc3RpbGwgcHJlc2VudCwgaXQgd2lsbCBiZQorICogaGFuZGxlZCBub3JtYWxseSwgYnV0IGFueSBlZGdlIGludGVycnVwdHMgdGhhdCBvY2N1cmVkIHdpbGwgbm90IGJlIHNlZW4gYnkKKyAqIHRoZSBHSUMgYW5kIG5lZWQgdG8gYmUgaGFuZGxlZCBieSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgd2FrZXVwIHNvdXJjZS4KKyAqLworc3RhdGljIHZvaWQgZ2ljX2Rpc3RfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZ2ljX25yKQoreworCXVuc2lnbmVkIGludCBnaWNfaXJxczsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKKworCWlmIChnaWNfbnIgPj0gTUFYX0dJQ19OUikKKwkJQlVHKCk7CisKKwlnaWNfaXJxcyA9IGdpY19kYXRhW2dpY19ucl0uZ2ljX2lycXM7CisJZGlzdF9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5kaXN0X2Jhc2U7CisKKwlpZiAoIWRpc3RfYmFzZSkKKwkJcmV0dXJuOworCisJd3JpdGVsX3JlbGF4ZWQoMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfQ1RSTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCAxNik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfY29uZltpXSwKKwkJCWRpc3RfYmFzZSArIEdJQ19ESVNUX0NPTkZJRyArIGkgKiA0KTsKKworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoZ2ljX2lycXMsIDQpOyBpKyspCisJCXdyaXRlbF9yZWxheGVkKDB4YTBhMGEwYTAsCisJCQlkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCA0KTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZChnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3NwaV90YXJnZXRbaV0sCisJCQlkaXN0X2Jhc2UgKyBHSUNfRElTVF9UQVJHRVQgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKGdpY19pcnFzLCAzMik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9zcGlfZW5hYmxlW2ldLAorCQkJZGlzdF9iYXNlICsgR0lDX0RJU1RfRU5BQkxFX1NFVCArIGkgKiA0KTsKKworCXdyaXRlbF9yZWxheGVkKDEsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBnaWNfY3B1X3NhdmUodW5zaWduZWQgaW50IGdpY19ucikKK3sKKwlpbnQgaTsKKwl1MzIgKnB0cjsKKwl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmNwdV9iYXNlOworCisJaWYgKGdpY19uciA+PSBNQVhfR0lDX05SKQorCQlCVUcoKTsKKworCWRpc3RfYmFzZSA9IGdpY19kYXRhW2dpY19ucl0uZGlzdF9iYXNlOworCWNwdV9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5jcHVfYmFzZTsKKworCWlmICghZGlzdF9iYXNlIHx8ICFjcHVfYmFzZSkKKwkJcmV0dXJuOworCisJcHRyID0gX190aGlzX2NwdV9wdHIoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9wcGlfZW5hYmxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCAzMik7IGkrKykKKwkJcHRyW2ldID0gcmVhZGxfcmVsYXhlZChkaXN0X2Jhc2UgKyBHSUNfRElTVF9FTkFCTEVfU0VUICsgaSAqIDQpOworCisJcHRyID0gX190aGlzX2NwdV9wdHIoZ2ljX2RhdGFbZ2ljX25yXS5zYXZlZF9wcGlfY29uZik7CisJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUCgzMiwgMTYpOyBpKyspCisJCXB0cltpXSA9IHJlYWRsX3JlbGF4ZWQoZGlzdF9iYXNlICsgR0lDX0RJU1RfQ09ORklHICsgaSAqIDQpOworCit9CisKK3N0YXRpYyB2b2lkIGdpY19jcHVfcmVzdG9yZSh1bnNpZ25lZCBpbnQgZ2ljX25yKQoreworCWludCBpOworCXUzMiAqcHRyOworCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisKKwlpZiAoZ2ljX25yID49IE1BWF9HSUNfTlIpCisJCUJVRygpOworCisJZGlzdF9iYXNlID0gZ2ljX2RhdGFbZ2ljX25yXS5kaXN0X2Jhc2U7CisJY3B1X2Jhc2UgPSBnaWNfZGF0YVtnaWNfbnJdLmNwdV9iYXNlOworCisJaWYgKCFkaXN0X2Jhc2UgfHwgIWNwdV9iYXNlKQorCQlyZXR1cm47CisKKwlwdHIgPSBfX3RoaXNfY3B1X3B0cihnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3BwaV9lbmFibGUpOworCWZvciAoaSA9IDA7IGkgPCBESVZfUk9VTkRfVVAoMzIsIDMyKTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZChwdHJbaV0sIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQgKyBpICogNCk7CisKKwlwdHIgPSBfX3RoaXNfY3B1X3B0cihnaWNfZGF0YVtnaWNfbnJdLnNhdmVkX3BwaV9jb25mKTsKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCAxNik7IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQocHRyW2ldLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9DT05GSUcgKyBpICogNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKDMyLCA0KTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZCgweGEwYTBhMGEwLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCk7CisKKwl3cml0ZWxfcmVsYXhlZCgweGYwLCBjcHVfYmFzZSArIEdJQ19DUFVfUFJJTUFTSyk7CisJd3JpdGVsX3JlbGF4ZWQoMSwgY3B1X2Jhc2UgKyBHSUNfQ1BVX0NUUkwpOworfQorCitzdGF0aWMgaW50IGdpY19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgY21kLAl2b2lkICp2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9HSUNfTlI7IGkrKykgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENQVV9QTV9FTlRFUjoKKwkJCWdpY19jcHVfc2F2ZShpKTsKKwkJCWJyZWFrOworCQljYXNlIENQVV9QTV9FTlRFUl9GQUlMRUQ6CisJCWNhc2UgQ1BVX1BNX0VYSVQ6CisJCQlnaWNfY3B1X3Jlc3RvcmUoaSk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FTlRFUjoKKwkJCWdpY19kaXN0X3NhdmUoaSk7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FTlRFUl9GQUlMRUQ6CisJCWNhc2UgQ1BVX0NMVVNURVJfUE1fRVhJVDoKKwkJCWdpY19kaXN0X3Jlc3RvcmUoaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ2ljX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gZ2ljX25vdGlmaWVyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGdpY19wbV9pbml0KHN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWMpCit7CisJZ2ljLT5zYXZlZF9wcGlfZW5hYmxlID0gX19hbGxvY19wZXJjcHUoRElWX1JPVU5EX1VQKDMyLCAzMikgKiA0LAorCQlzaXplb2YodTMyKSk7CisJQlVHX09OKCFnaWMtPnNhdmVkX3BwaV9lbmFibGUpOworCisJZ2ljLT5zYXZlZF9wcGlfY29uZiA9IF9fYWxsb2NfcGVyY3B1KERJVl9ST1VORF9VUCgzMiwgMTYpICogNCwKKwkJc2l6ZW9mKHUzMikpOworCUJVR19PTighZ2ljLT5zYXZlZF9wcGlfY29uZik7CisKKwljcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoJmdpY19ub3RpZmllcl9ibG9jayk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGdpY19wbV9pbml0KHN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWMpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBnaWNfaXJxX2RvbWFpbl9kdF90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICAgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCWlmIChkLT5vZl9ub2RlICE9IGNvbnRyb2xsZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbnRzaXplIDwgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgdGhlIGludGVycnVwdCBudW1iZXIgYW5kIGFkZCAxNiB0byBza2lwIG92ZXIgU0dJcyAqLworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzFdICsgMTY7CisKKwkvKiBGb3IgU1BJcywgd2UgbmVlZCB0byBhZGQgMTYgbW9yZSB0byBnZXQgdGhlIEdJQyBpcnEgSUQgbnVtYmVyICovCisJaWYgKCFpbnRzcGVjWzBdKQorCQkqb3V0X2h3aXJxICs9IDE2OworCisJKm91dF90eXBlID0gaW50c3BlY1syXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19pcnFfZG9tYWluX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfT0YKKwkuZHRfdHJhbnNsYXRlID0gZ2ljX2lycV9kb21haW5fZHRfdHJhbnNsYXRlLAorI2VuZGlmCit9OworCit2b2lkIF9faW5pdCBnaWNfaW5pdCh1bnNpZ25lZCBpbnQgZ2ljX25yLCBpbnQgaXJxX3N0YXJ0LAogCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlLCB2b2lkIF9faW9tZW0gKmNwdV9iYXNlKQogewogCXN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWM7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwlpbnQgZ2ljX2lycXM7CiAKIAlCVUdfT04oZ2ljX25yID49IE1BWF9HSUNfTlIpOwogCiAJZ2ljID0gJmdpY19kYXRhW2dpY19ucl07CisJZG9tYWluID0gJmdpYy0+ZG9tYWluOwogCWdpYy0+ZGlzdF9iYXNlID0gZGlzdF9iYXNlOwogCWdpYy0+Y3B1X2Jhc2UgPSBjcHVfYmFzZTsKLQlnaWMtPmlycV9vZmZzZXQgPSAoaXJxX3N0YXJ0IC0gMSkgJiB+MzE7CiAKLQlpZiAoZ2ljX25yID09IDApCisJLyoKKwkgKiBGb3IgcHJpbWFyeSBHSUNzLCBza2lwIG92ZXIgU0dJcy4KKwkgKiBGb3Igc2Vjb25kYXJ5IEdJQ3MsIHNraXAgb3ZlciBQUElzLCB0b28uCisJICovCisJaWYgKGdpY19uciA9PSAwKSB7CiAJCWdpY19jcHVfYmFzZV9hZGRyID0gY3B1X2Jhc2U7CisJCWRvbWFpbi0+aHdpcnFfYmFzZSA9IDE2OworCQlpZiAoaXJxX3N0YXJ0ID4gMCkKKwkJCWlycV9zdGFydCA9IChpcnFfc3RhcnQgJiB+MzEpICsgMTY7CisJfSBlbHNlCisJCWRvbWFpbi0+aHdpcnFfYmFzZSA9IDMyOwogCi0JZ2ljX2Rpc3RfaW5pdChnaWMsIGlycV9zdGFydCk7CisJLyoKKwkgKiBGaW5kIG91dCBob3cgbWFueSBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQuCisJICogVGhlIEdJQyBvbmx5IHN1cHBvcnRzIHVwIHRvIDEwMjAgaW50ZXJydXB0IHNvdXJjZXMuCisJICovCisJZ2ljX2lycXMgPSByZWFkbF9yZWxheGVkKGRpc3RfYmFzZSArIEdJQ19ESVNUX0NUUikgJiAweDFmOworCWdpY19pcnFzID0gKGdpY19pcnFzICsgMSkgKiAzMjsKKwlpZiAoZ2ljX2lycXMgPiAxMDIwKQorCQlnaWNfaXJxcyA9IDEwMjA7CisJZ2ljLT5naWNfaXJxcyA9IGdpY19pcnFzOworCisJZG9tYWluLT5ucl9pcnEgPSBnaWNfaXJxcyAtIGRvbWFpbi0+aHdpcnFfYmFzZTsKKwlkb21haW4tPmlycV9iYXNlID0gaXJxX2FsbG9jX2Rlc2NzKGlycV9zdGFydCwgMTYsIGRvbWFpbi0+bnJfaXJxLAorCQkJCQkgICBudW1hX25vZGVfaWQoKSk7CisJaWYgKElTX0VSUl9WQUxVRShkb21haW4tPmlycV9iYXNlKSkgeworCQlXQVJOKDEsICJDYW5ub3QgYWxsb2NhdGUgaXJxX2Rlc2NzIEAgSVJRJWQsIGFzc3VtaW5nIHByZS1hbGxvY2F0ZWRcbiIsCisJCSAgICAgaXJxX3N0YXJ0KTsKKwkJZG9tYWluLT5pcnFfYmFzZSA9IGlycV9zdGFydDsKKwl9CisJZG9tYWluLT5wcml2ID0gZ2ljOworCWRvbWFpbi0+b3BzID0gJmdpY19pcnFfZG9tYWluX29wczsKKwlpcnFfZG9tYWluX2FkZChkb21haW4pOworCisJZ2ljX2NoaXAuZmxhZ3MgfD0gZ2ljX2FyY2hfZXh0bi5mbGFnczsKKwlnaWNfZGlzdF9pbml0KGdpYyk7CiAJZ2ljX2NwdV9pbml0KGdpYyk7CisJZ2ljX3BtX2luaXQoZ2ljKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgZ2ljX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBnaWNfbnIpCkBAIC0zNzUsMTYgKzYyNCw2IEBACiAJZ2ljX2NwdV9pbml0KCZnaWNfZGF0YVtnaWNfbnJdKTsKIH0KIAotdm9pZCBfX2NwdWluaXQgZ2ljX2VuYWJsZV9wcGkodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycSwgSVJRX05PUFJPQkUpOwotCWdpY191bm1hc2tfaXJxKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBnaWNfcmFpc2Vfc29mdGlycShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgdW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTQwNSwzICs2NDQsMzUgQEAKIAl3cml0ZWxfcmVsYXhlZChtYXAgPDwgMTYgfCBpcnEsIGdpY19kYXRhWzBdLmRpc3RfYmFzZSArIEdJQ19ESVNUX1NPRlRJTlQpOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBpbnQgZ2ljX2NudCBfX2luaXRkYXRhID0gMDsKKworaW50IF9faW5pdCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQoreworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluID0gJmdpY19kYXRhW2dpY19jbnRdLmRvbWFpbjsKKworCWlmIChXQVJOX09OKCFub2RlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkaXN0X2Jhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlXQVJOKCFkaXN0X2Jhc2UsICJ1bmFibGUgdG8gbWFwIGdpYyBkaXN0IHJlZ2lzdGVyc1xuIik7CisKKwljcHVfYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDEpOworCVdBUk4oIWNwdV9iYXNlLCAidW5hYmxlIHRvIG1hcCBnaWMgY3B1IHJlZ2lzdGVyc1xuIik7CisKKwlkb21haW4tPm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKKworCWdpY19pbml0KGdpY19jbnQsIC0xLCBkaXN0X2Jhc2UsIGNwdV9iYXNlKTsKKworCWlmIChwYXJlbnQpIHsKKwkJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJCWdpY19jYXNjYWRlX2lycShnaWNfY250LCBpcnEpOworCX0KKwlnaWNfY250Kys7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwppbmRleCBhNzkzNGJhLi5iNTM5ZWM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pdDgxNTIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYyBiL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYwppbmRleCAwNTY5ZGU2Li42MTY5MWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCkBAIC03MTgsNiArNzE4LDEwIEBACiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmUoc2FjaGlwLT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nsa3B1dDsKKwogCXNwaW5fbG9ja19pbml0KCZzYWNoaXAtPmxvY2spOwogCiAJc2FjaGlwLT5kZXYgPSBtZTsKQEAgLTczMyw3ICs3MzcsNyBAQAogCXNhY2hpcC0+YmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgUEFHRV9TSVpFICogMik7CiAJaWYgKCFzYWNoaXAtPmJhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfY2xrcHV0OworCQlnb3RvIGVycl9jbGtfdW5wcmVwOwogCX0KIAogCS8qCkBAIC04MDksNiArODEzLDggQEAKIAogIGVycl91bm1hcDoKIAlpb3VubWFwKHNhY2hpcC0+YmFzZSk7CisgZXJyX2Nsa191bnByZXA6CisJY2xrX3VucHJlcGFyZShzYWNoaXAtPmNsayk7CiAgZXJyX2Nsa3B1dDoKIAljbGtfcHV0KHNhY2hpcC0+Y2xrKTsKICBlcnJfZnJlZToKQEAgLTgzNSw2ICs4NDEsNyBAQAogCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKIAogCWNsa19kaXNhYmxlKHNhY2hpcC0+Y2xrKTsKKwljbGtfdW5wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAogCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKIAkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoc2FjaGlwLT5pcnEsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3Njb29wLmMgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwppbmRleCBhMDdiMGU3Li4wYzYxNmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2Nvb3AuYworKysgYi9hcmNoL2FybS9jb21tb24vc2Nvb3AuYwpAQCAtMTIsMTEgKzEyLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zY29vcC5oPgogCiAvKiBQQ01DSUEgdG8gU2Nvb3AgbGlua2FnZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3RpbWVyLXNwLmMgYi9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYwppbmRleCA0MWRmNDc4Li4yMzkzYjViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYworKysgYi9hcmNoL2FybS9jb21tb24vdGltZXItc3AuYwpAQCAtNDEsOSArNDEsMTcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKKwllcnIgPSBjbGtfcHJlcGFyZShjbGspOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIHByZXBhcmU6ICVkXG4iLCBuYW1lLCBlcnIpOworCQljbGtfcHV0KGNsayk7CisJCXJldHVybiBlcnI7CisJfQorCiAJZXJyID0gY2xrX2VuYWJsZShjbGspOwogCWlmIChlcnIpIHsKIAkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIGVuYWJsZTogJWRcbiIsIG5hbWUsIGVycik7CisJCWNsa191bnByZXBhcmUoY2xrKTsKIAkJY2xrX3B1dChjbGspOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTUyLDYgKzYwLDcgQEAKIAlpZiAocmF0ZSA8IDApIHsKIAkJcHJfZXJyKCJzcDgwNDogJXMgY2xvY2sgZmFpbGVkIHRvIGdldCByYXRlOiAlbGRcbiIsIG5hbWUsIHJhdGUpOwogCQljbGtfZGlzYWJsZShjbGspOworCQljbGtfdW5wcmVwYXJlKGNsayk7CiAJCWNsa19wdXQoY2xrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTlnNDVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxc2FtOWc0NV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4NzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTlnNDVfZGVmY29uZmlnCkBAIC0wLDAgKzEsMjE0IEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MT15CitDT05GSUdfQVJDSF9BVDkxU0FNOUc0NT15CitDT05GSUdfTUFDSF9BVDkxU0FNOU0xMEc0NUVLPXkKK0NPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1M9eQorQ09ORklHX0FUOTFfU0xPV19DTE9DSz15CitDT05GSUdfQUVBQkk9eQorIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0xFRFM9eQorQ09ORklHX0xFRFNfQ1BVPXkKK0NPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZPXkKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT0xMjhNIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGluaXRyZD0weDcxMTAwMDAwLDI1MTY1ODI0IHJvb3Q9L2Rldi9yYW0wIHJ3IgorQ09ORklHX0FVVE9fWlJFTEFERFI9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CitDT05GSUdfSVBWNj15CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUXzZSRD15CitDT05GSUdfQ0ZHODAyMTE9eQorQ09ORklHX0xJQjgwMjExPXkKK0NPTkZJR19NQUM4MDIxMT15CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX0RFVlRNUEZTPXkKK0NPTkZJR19ERVZUTVBGU19NT1VOVD15CisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9EQVRBRkxBU0g9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9BVE1FTD15CitDT05GSUdfTVREX1VCST15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9NAorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX01JU0NfREVWSUNFUz15CitDT05GSUdfQVRNRUxfUFdNPXkKK0NPTkZJR19BVE1FTF9UQ0xJQj15CitDT05GSUdfU0NTST15CitDT05GSUdfQkxLX0RFVl9TRD15CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTUlJPXkKK0NPTkZJR19EQVZJQ09NX1BIWT15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NQUNCPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CitDT05GSUdfTElCRVJUQVNfVEhJTkZJUk09bQorQ09ORklHX0xJQkVSVEFTX1RISU5GSVJNX1VTQj1tCitDT05GSUdfQVQ3NkM1MFhfVVNCPW0KK0NPTkZJR19VU0JfWkQxMjAxPW0KK0NPTkZJR19SVEw4MTg3PW0KK0NPTkZJR19BVEhfQ09NTU9OPW0KK0NPTkZJR19BVEg5Sz1tCitDT05GSUdfQ0FSTDkxNzA9bQorQ09ORklHX0I0Mz1tCitDT05GSUdfQjQzX1BIWV9OPXkKK0NPTkZJR19MSUJFUlRBUz1tCitDT05GSUdfTElCRVJUQVNfVVNCPW0KK0NPTkZJR19MSUJFUlRBU19TRElPPW0KK0NPTkZJR19MSUJFUlRBU19TUEk9bQorQ09ORklHX1JUMlgwMD1tCitDT05GSUdfUlQyNTAwVVNCPW0KK0NPTkZJR19SVDczVVNCPW0KK0NPTkZJR19SVDI4MDBVU0I9bQorQ09ORklHX1JUMjgwMFVTQl9SVDUzWFg9eQorQ09ORklHX1JUMjgwMFVTQl9VTktOT1dOPXkKK0NPTkZJR19SVEw4MTkyQ1U9bQorQ09ORklHX1dMMTI1MT1tCitDT05GSUdfV0wxMjUxX1NESU89bQorQ09ORklHX1dMMTJYWF9NRU5VPW0KK0NPTkZJR19XTDEyWFg9bQorQ09ORklHX1dMMTJYWF9TRElPPW0KK0NPTkZJR19aRDEyMTFSVz1tCitDT05GSUdfTVdJRklFWD1tCitDT05GSUdfTVdJRklFWF9TRElPPW0KK0NPTkZJR19JTlBVVF9QT0xMREVWPW0KKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD00ODAKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT0yNzIKK0NPTkZJR19JTlBVVF9KT1lERVY9eQorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9RVDEwNzA9bQorQ09ORklHX0tFWUJPQVJEX1FUMjE2MD1tCitDT05GSUdfS0VZQk9BUkRfR1BJTz15CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorQ09ORklHX1RPVUNIU0NSRUVOX0FUTUVMX01YVD1tCitDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfVFNBRENDPXkKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTQKK0NPTkZJR19TRVJJQUxfQVRNRUw9eQorQ09ORklHX1NFUklBTF9BVE1FTF9DT05TT0xFPXkKK0NPTkZJR19IV19SQU5ET009eQorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0dQSU89eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0FUTUVMPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRkJfQVRNRUw9eQorQ09ORklHX0ZCX1VETD1tCitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKKyMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9BVE1FTF9MQ0RDPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPXkKK0NPTkZJR19TTkRfUENNX09TUz15CisjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFJJVkVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQVRNRUxfQUM5N0M9eQorIyBDT05GSUdfU05EX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1VTQl9BVURJTz1tCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15CitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfQUNNPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfVVNCX0dBREdFVD15CitDT05GSUdfVVNCX0FUTUVMX1VTQkE9bQorQ09ORklHX1VTQl9aRVJPPW0KK0NPTkZJR19VU0JfQVVESU89bQorQ09ORklHX1VTQl9FVEg9bQorQ09ORklHX1VTQl9FVEhfRUVNPXkKK0NPTkZJR19VU0JfTUFTU19TVE9SQUdFPW0KK0NPTkZJR19VU0JfR19TRVJJQUw9bQorQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KK0NPTkZJR19VU0JfR19NVUxUST1tCitDT05GSUdfVVNCX0dfTVVMVElfQ0RDPXkKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRSBpcyBub3Qgc2V0CitDT05GSUdfU0RJT19VQVJUPW0KK0NPTkZJR19NTUNfQVRNRUxNQ0k9eQorQ09ORklHX01NQ19BVE1FTE1DSV9ETUE9eQorQ09ORklHX0xFRFNfQVRNRUxfUFdNPXkKK0NPTkZJR19MRURTX0dQSU89eQorQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj15CitDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD15CitDT05GSUdfTEVEU19UUklHR0VSX0dQSU89eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19BVF9IRE1BQz15CitDT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19GQU5PVElGWT15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9TVU1NQVJZPXkKK0NPTkZJR19DUkFNRlM9bQorQ09ORklHX1NRVUFTSEZTPW0KK0NPTkZJR19TUVVBU0hGU19FTUJFRERFRD15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorQ09ORklHX0NSWVBUT19FQ0I9eQorIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zNF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2V4eW5vczRfZGVmY29uZmlnCmluZGV4IGRhNTNmZjMuLmJmZmU2OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zNF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9leHlub3M0X2RlZmNvbmZpZwpAQCAtNCwxOCArNCwxOCBAQAogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfRVhZTk9TND15CitDT05GSUdfQVJDSF9FWFlOT1M9eQogQ09ORklHX1MzQ19MT1dMRVZFTF9VQVJUX1BPUlQ9MQogQ09ORklHX01BQ0hfU01ES0MyMTA9eQotQ09ORklHX01BQ0hfU01ES1YzMTA9eQogQ09ORklHX01BQ0hfQVJNTEVYNDIxMD15CiBDT05GSUdfTUFDSF9VTklWRVJTQUxfQzIxMD15CiBDT05GSUdfTUFDSF9OVVJJPXkKK0NPTkZJR19NQUNIX09SSUdFTj15CitDT05GSUdfTUFDSF9TTURLNDQxMj15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTIKLUNPTkZJR19IT1RQTFVHX0NQVT15CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfQUVBQkk9eQogQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9yYW0wIHJ3IHJhbWRpc2s9ODE5MiBpbml0cmQ9MHg0MTAwMDAwMCw4TSBjb25zb2xlPXR0eVNBQzEsMTE1MjAwIGluaXQ9L2xpbnV4cmMgbWVtPTI1Nk0iCkBAIC02MCwxMyArNjAsOSBAQAogQ09ORklHX0RFQlVHX1JUX01VVEVYRVM9eQogQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKIENPTkZJR19ERUJVR19NVVRFWEVTPXkKLUNPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CiBDT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfREVCVUdfVVNFUj15Ci1DT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19ERUJVR19TM0NfVUFSVD0xCiBDT05GSUdfQ1JDX0NDSVRUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE0MTkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pbXhfdjRfdjVfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTcwIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0VYUEVSVD15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPXkKK0NPTkZJR19LUFJPQkVTPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTVhDPXkKK0NPTkZJR19BUkNIX0lNWF9WNF9WNT15CitDT05GSUdfQVJDSF9NWDFBRFM9eQorQ09ORklHX01BQ0hfU0NCOTMyOD15CitDT05GSUdfTUFDSF9NWDIxQURTPXkKK0NPTkZJR19NQUNIX01YMjVfM0RTPXkKK0NPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyNT15CitDT05GSUdfTUFDSF9NWDI3QURTPXkKK0NPTkZJR19NQUNIX1BDTTAzOD15CitDT05GSUdfTUFDSF9DUFVJTVgyNz15CitDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMjdfVVNFU0RIQzI9eQorQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI3X1VTRVVBUlQ0PXkKK0NPTkZJR19NQUNIX01YMjdfM0RTPXkKK0NPTkZJR19NQUNIX0lNWDI3X1ZJU1NUUklNX00xMD15CitDT05GSUdfTUFDSF9JTVgyN0xJVEU9eQorQ09ORklHX01BQ0hfUENBMTAwPXkKK0NPTkZJR19NQUNIX01YVF9URDYwPXkKK0NPTkZJR19NQUNIX0lNWDI3SVBDQU09eQorQ09ORklHX01YQ19JUlFfUFJJT1I9eQorQ09ORklHX01YQ19QV009eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0FFQUJJPXkKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0ZQRV9OV0ZQRT15CitDT05GSUdfRlBFX05XRlBFX1hQPXkKK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfR0VPTUVUUlk9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfVUJJPXkKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorQ09ORklHX0VFUFJPTV9BVDI0PXkKK0NPTkZJR19FRVBST01fQVQyNT15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19TTUM5MVg9eQorQ09ORklHX0RNOTAwMD15CitDT05GSUdfU01DOTExWD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CitDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0Nj1tCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTA9bQorQ09ORklHX1NFUklBTF9JTVg9eQorQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19JTVg9eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0lNWD15CitDT05GSUdfVzE9eQorQ09ORklHX1cxX01BU1RFUl9NWEM9eQorQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfSU1YMl9XRFQ9eQorQ09ORklHX01GRF9NQzEzWFhYPXkKK0NPTkZJR19SRUdVTEFUT1I9eQorQ09ORklHX1JFR1VMQVRPUl9NQzEzNzgzPXkKK0NPTkZJR19SRUdVTEFUT1JfTUMxMzg5Mj15CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0lNWD15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfUFdNPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19GT05UUz15CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0xPR089eQorQ09ORklHX1NPVU5EPXkKK0NPTkZJR19TTkQ9eQorIyBDT05GSUdfU05EX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU09DPXkKK0NPTkZJR19TTkRfSU1YX1NPQz15CitDT05GSUdfU05EX1NPQ19NWDI3VklTX0FJQzMyWDQ9eQorQ09ORklHX1NORF9TT0NfUEhZQ09SRV9BQzk3PXkKK0NPTkZJR19TTkRfU09DX0VVS1JFQV9UTFYzMjA9eQorQ09ORklHX1VTQl9ISUQ9bQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorQ09ORklHX1VTQl9FSENJX01YQz15CitDT05GSUdfVVNCX1VMUEk9eQorQ09ORklHX01NQz15CitDT05GSUdfTU1DX01YQz15CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfTUMxMzc4Mz15CitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfR1BJTz15CitDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzPXkKK0NPTkZJR19SVENfRFJWX0lNWERJPXkKK0NPTkZJR19SVENfTVhDPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19JTVhfU0RNQT15CitDT05GSUdfSU1YX0RNQT15CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfVUJJRlNfRlM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX0lTTzg4NTlfMTU9bQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgxX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MzZkMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL214MV9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19JS0NPTkZJRz15Ci1DT05GSUdfSUtDT05GSUdfUFJPQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15Ci1DT05GSUdfTU9EVkVSU0lPTlM9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfTVhDPXkKLUNPTkZJR19BUkNIX01YMT15Ci1DT05GSUdfQVJDSF9NWDFBRFM9eQotQ09ORklHX01BQ0hfU0NCOTMyOD15Ci1DT05GSUdfTUFDSF9BUEY5MzI4PXkKLUNPTkZJR19NWENfSVJRX1BSSU9SPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfSElHSF9SRVNfVElNRVJTPXkKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19BRUFCST15Ci1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tdGRibG9jazIgcncgaXA9b2ZmIgotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLUNPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi1DT05GSUdfRldfTE9BREVSPW0KLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX1BIWUxJQj15Ci1DT05GSUdfU01TQ19QSFk9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRE05MDAwPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WVCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX0lNWD15Ci1DT05GSUdfU0VSSUFMX0lNWF9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0lNWD15Ci1DT05GSUdfVzE9eQotQ09ORklHX1cxX01BU1RFUl9NWEM9eQotQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19GQj15Ci1DT05GSUdfVVNCX0dBREdFVD15Ci1DT05GSUdfVVNCX0dBREdFVF9JTVg9eQotQ09ORklHX1VTQl9FVEg9bQotQ09ORklHX01NQz15Ci1DT05GSUdfTU1DX01YQz15Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKLUNPTkZJR19JTk9USUZZPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ORlNfVjQ9eQotQ09ORklHX1JPT1RfTkZTPXkKLSMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAotIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDIxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXgyMV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWY4OGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9teDIxX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15Ci1DT05GSUdfU0xBQj15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX01YQz15Ci1DT05GSUdfQVJDSF9NWDI9eQotQ09ORklHX01BQ0hfTVgyMUFEUz15Ci1DT05GSUdfTVhDX1BXTT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfQUVBQkk9eQotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfTkVUPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfREVCVUc9eQotQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTMKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci1DT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQotQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLUNPTkZJR19NVERfQ0ZJPXkKLUNPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKLUNPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0FNRFNURD15Ci1DT05GSUdfTVREX1BIWVNNQVA9eQotQ09ORklHX01URF9OQU5EPXkKLUNPTkZJR19NVERfTkFORF9NWEM9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MQotQ09ORklHX1NFUklBTF9JTVg9eQotQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX0kyQz15Ci1DT05GSUdfSTJDX0NIQVJERVY9eQotQ09ORklHX0kyQ19JTVg9eQotQ09ORklHX1NQST15Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci1DT05GSUdfRkI9eQotQ09ORklHX0ZCX0lNWD15Ci0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHg4PXkKLUNPTkZJR19MT0dPPXkKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19NWEM9eQotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotQ09ORklHX1JPT1RfTkZTPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgyN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL214MjdfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ0YzY1Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL214MjdfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfRVhQRVJUPXkKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQotQ09ORklHX1BST0ZJTElORz15Ci1DT05GSUdfT1BST0ZJTEU9eQotQ09ORklHX0tQUk9CRVM9eQotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9NWEM9eQotQ09ORklHX0FSQ0hfTVgyPXkKLUNPTkZJR19NQUNIX01YMjc9eQotQ09ORklHX01BQ0hfTVgyN0FEUz15Ci1DT05GSUdfTUFDSF9QQ00wMzg9eQotQ09ORklHX01BQ0hfQ1BVSU1YMjc9eQotQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI3X1VTRVNESEMyPXkKLUNPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgyN19VU0VVQVJUND15Ci1DT05GSUdfTUFDSF9NWDI3XzNEUz15Ci1DT05GSUdfTUFDSF9JTVgyN19WSVNTVFJJTV9NMTA9eQotQ09ORklHX01BQ0hfSU1YMjdMSVRFPXkKLUNPTkZJR19NQUNIX1BDQTEwMD15Ci1DT05GSUdfTUFDSF9NWFRfVEQ2MD15Ci1DT05GSUdfTVhDX0lSUV9QUklPUj15Ci1DT05GSUdfTVhDX1BXTT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVD15Ci1DT05GSUdfQUVBQkk9eQotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfRlBFX05XRlBFPXkKLUNPTkZJR19GUEVfTldGUEVfWFA9eQotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX01VTFRJQ0FTVD15Ci1DT05GSUdfSVBfUE5QPXkKLUNPTkZJR19JUF9QTlBfREhDUD15Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKLUNPTkZJR19NVEQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz15Ci1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15Ci1DT05GSUdfTVREX0NGSV9HRU9NRVRSWT15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0kyIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLUNPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX05BTkQ9eQotQ09ORklHX01URF9OQU5EX01YQz15Ci1DT05GSUdfTVREX1VCST15Ci1DT05GSUdfRUVQUk9NX0FUMjQ9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRkVDPXkKLSMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKLUNPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2PW0KLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfODI1MD1tCi1DT05GSUdfU0VSSUFMX0lNWD15Ci1DT05GSUdfU0VSSUFMX0lNWF9DT05TT0xFPXkKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfSTJDX0lNWD15Ci1DT05GSUdfU1BJPXkKLUNPTkZJR19TUElfSU1YPXkKLUNPTkZJR19XMT15Ci1DT05GSUdfVzFfTUFTVEVSX01YQz15Ci1DT05GSUdfVzFfU0xBVkVfVEhFUk09eQotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9JTVg9eQotQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQotQ09ORklHX0ZPTlRTPXkKLUNPTkZJR19GT05UXzh4OD15Ci0jIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCPW0KLSMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAotQ09ORklHX1VTQl9VTFBJPXkKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19NWEM9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0RSVl9QQ0Y4NTYzPXkKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfVUJJRlNfRlM9eQotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KLUNPTkZJR19OTFNfSVNPODg1OV8xPXkKLUNPTkZJR19OTFNfSVNPODg1OV8xNT1tCi1DT05GSUdfREVCVUdfRlM9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDNfZGVmY29uZmlnCmluZGV4IDdjNGIzMGIuLmNiMDcxN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgzX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL214M19kZWZjb25maWcKQEAgLTMsNyArMyw2IEBACiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19FWFBFUlQ9eQogQ09ORklHX1NMQUI9eQogQ09ORklHX01PRFVMRVM9eQpAQCAtMTMsMjAgKzEyLDIxIEBACiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9NWEM9eQogQ09ORklHX01BQ0hfTVgzMUFEU19XTTExMzNfRVYxPXkKK0NPTkZJR19NQUNIX01YMzFMSUxMWT15CitDT05GSUdfTUFDSF9NWDMxTElURT15CiBDT05GSUdfTUFDSF9QQ00wMzc9eQogQ09ORklHX01BQ0hfUENNMDM3X0VFVD15Ci1DT05GSUdfTUFDSF9NWDMxTElURT15CiBDT05GSUdfTUFDSF9NWDMxXzNEUz15CiBDT05GSUdfTUFDSF9NWDMxTU9CT0FSRD15Ci1DT05GSUdfTUFDSF9NWDMxTElMTFk9eQogQ09ORklHX01BQ0hfUU9ORz15Ci1DT05GSUdfTUFDSF9QQ00wNDM9eQogQ09ORklHX01BQ0hfQVJNQURJTExPNVgwPXkKLUNPTkZJR19NQUNIX01YMzVfM0RTPXkKIENPTkZJR19NQUNIX0taTV9BUk0xMV8wMT15CitDT05GSUdfTUFDSF9QQ00wNDM9eQorQ09ORklHX01BQ0hfTVgzNV8zRFM9eQogQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDM1PXkKIENPTkZJR19NWENfSVJRX1BSSU9SPXkKIENPTkZJR19NWENfUFdNPXkKK0NPTkZJR19BUk1fRVJSQVRBXzQxMTkyMD15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zNSw3ICszNSw2IEBACiBDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKIENPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9tdGRibG9jazIgcncgaXA9b2ZmIgogQ09ORklHX1ZGUD15Ci1DT05GSUdfUE09eQogQ09ORklHX1BNX0RFQlVHPXkKIENPTkZJR19ORVQ9eQogQ09ORklHX1BBQ0tFVD15CkBAIC01Miw3ICs1MSw2IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogQ09ORklHX0ZXX0xPQURFUj1tCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpAQCAtNjIsMjQgKzYwLDI3IEBACiBDT05GSUdfTVREX05BTkRfTVhDPXkKIENPTkZJR19NVERfVUJJPXkKICMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfRUVQUk9NX0FUMjQ9eQogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX1NNU0NfUEhZPXkKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX1NNU0M5MTFYPXkKIENPTkZJR19ETkVUPXkKLUNPTkZJR19GRUM9eQogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0FUS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9JTVg9eQorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF84MjUwPW0KIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKIENPTkZJR19TRVJJQUxfSU1YPXkKIENPTkZJR19TRVJJQUxfSU1YX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKQEAgLTg5LDEyICs5MCwxNSBAQAogQ09ORklHX1cxX01BU1RFUl9NWEM9eQogQ09ORklHX1cxX1NMQVZFX1RIRVJNPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfSU1YMl9XRFQ9eQogQ09ORklHX01GRF9XTTgzNTBfSTJDPXkKIENPTkZJR19SRUdVTEFUT1I9eQogQ09ORklHX1JFR1VMQVRPUl9XTTgzNTA9eQogQ09ORklHX01FRElBX1NVUFBPUlQ9eQogQ09ORklHX1ZJREVPX0RFVj15Ci0jIENPTkZJR19WSURFT19BTExPV19WNEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfVFVORVJfQ1VTVE9NSVNFIGlzIG5vdCBzZXQKIENPTkZJR19TT0NfQ0FNRVJBPXkKIENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDE9eQogQ09ORklHX1NPQ19DQU1FUkFfTVQ5TTExMT15CkBAIC0xMDUsOSArMTA5LDI2IEBACiBDT05GSUdfVklERU9fTVgzPXkKICMgQ09ORklHX1JBRElPX0FEQVBURVJTIGlzIG5vdCBzZXQKIENPTkZJR19GQj15Ci0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD15CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TUEkgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1NORF9JTVhfU09DPXkKK0NPTkZJR19TTkRfTVhDX1NPQ19XTTExMzNfRVYxPXkKK0NPTkZJR19TTkRfU09DX1BIWUNPUkVfQUM5Nz15CitDT05GSUdfU05EX1NPQ19FVUtSRUFfVExWMzIwPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfTVhDPXkKK0NPTkZJR19VU0JfR0FER0VUPW0KK0NPTkZJR19VU0JfRlNMX1VTQjI9bQorQ09ORklHX1VTQl9HX1NFUklBTD1tCitDT05GSUdfVVNCX1VMUEk9eQogQ09ORklHX01NQz15CiBDT05GSUdfTU1DX01YQz15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfTVhDPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX1RNUEZTPXkKQEAgLTExOSw2ICsxNDAsNSBAQAogQ09ORklHX1JPT1RfTkZTPXkKICMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXg1MV9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzU4MDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9teDUxX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLSMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE4Ci1DT05GSUdfUkVMQVk9eQotQ09ORklHX0VYUEVSVD15Ci0jIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQotIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfTVhDPXkKLUNPTkZJR19BUkNIX01YNTE9eQotQ09ORklHX01BQ0hfTVg1MV9CQUJCQUdFPXkKLUNPTkZJR19NQUNIX01YNTFfM0RTPXkKLUNPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVg1MT15Ci1DT05GSUdfTk9fSFo9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQotQ09ORklHX0FFQUJJPXkKLSMgQ09ORklHX09BQklfQ09NUEFUIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9MzI3NjgKLUNPTkZJR19DTURMSU5FPSJub2luaXRyZCBjb25zb2xlPXR0eW14YzAsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTAxOi9zaGFyZWQvbmZzIGlwPWRoY3AiCi1DT05GSUdfVkZQPXkKLUNPTkZJR19ORU9OPXkKLUNPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfUE09eQotQ09ORklHX1BNX0RFQlVHPXkKLUNPTkZJR19QTV9URVNUX1NVU1BFTkQ9eQotQ09ORklHX05FVD15Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19VTklYPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT02NTUzNgotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJPXkKLSMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfU0NTSV9NVUxUSV9MVU49eQotQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKLUNPTkZJR19TQ1NJX0xPR0dJTkc9eQotQ09ORklHX1NDU0lfU0NBTl9BU1lOQz15Ci0jIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKLUNPTkZJR19BVEE9bQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX01BUlZFTExfUEhZPXkKLUNPTkZJR19EQVZJQ09NX1BIWT15Ci1DT05GSUdfUVNFTUlfUEhZPXkKLUNPTkZJR19MWFRfUEhZPXkKLUNPTkZJR19DSUNBREFfUEhZPXkKLUNPTkZJR19WSVRFU1NFX1BIWT15Ci1DT05GSUdfU01TQ19QSFk9eQotQ09ORklHX0JST0FEQ09NX1BIWT15Ci1DT05GSUdfSUNQTFVTX1BIWT15Ci1DT05GSUdfUkVBTFRFS19QSFk9eQotQ09ORklHX05BVElPTkFMX1BIWT15Ci1DT05GSUdfU1RFMTBYUD15Ci1DT05GSUdfTFNJX0VUMTAxMUNfUEhZPXkKLUNPTkZJR19NRElPX0JJVEJBTkc9eQotQ09ORklHX01ESU9fR1BJTz15Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9bQotQ09ORklHX0ZFQz15Ci0jIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRkZfTUVNTEVTUz1tCi0jIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfRVZERVY9eQotQ09ORklHX0tFWUJPQVJEX0dQSU89eQotQ09ORklHX0lOUFVUX0VWQlVHPW0KLUNPTkZJR19NT1VTRV9QUzI9bQotQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSD15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD1tCi1DT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKLSMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9JTVg9eQotQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15Ci0jIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfUkFORE9NPXkKLUNPTkZJR19JMkM9eQotIyBDT05GSUdfSTJDX0NPTVBBVCBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0NIQVJERVY9bQotIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKLUNPTkZJR19JMkNfQUxHT0JJVD1tCi1DT05GSUdfSTJDX0FMR09QQ0Y9bQotQ09ORklHX0kyQ19BTEdPUENBPW0KLUNPTkZJR19HUElPX1NZU0ZTPXkKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19VU0I9eQotQ09ORklHX1VTQl9FSENJX0hDRD15Ci1DT05GSUdfVVNCX0VIQ0lfTVhDPXkKLUNPTkZJR19VU0JfU1RPUkFHRT15Ci1DT05GSUdfTU1DPXkKLUNPTkZJR19NTUNfQkxPQ0s9bQotQ09ORklHX01NQ19TREhDST1tCi1DT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0xFRFNfQ0xBU1M9eQotQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMPXkKLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQyX0ZTX1hBVFRSPXkKLUNPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUMl9GU19TRUNVUklUWT15Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQotQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQotQ09ORklHX0VYVDRfRlM9eQotQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKLUNPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19RVU9UQT15Ci1DT05GSUdfUVVPVEFfTkVUTElOS19JTlRFUkZBQ0U9eQotIyBDT05GSUdfUFJJTlRfUVVPVEFfV0FSTklORyBpcyBub3Qgc2V0Ci1DT05GSUdfQVVUT0ZTX0ZTPXkKLUNPTkZJR19BVVRPRlM0X0ZTPXkKLUNPTkZJR19GVVNFX0ZTPXkKLUNPTkZJR19JU085NjYwX0ZTPW0KLUNPTkZJR19KT0xJRVQ9eQotQ09ORklHX1pJU09GUz15Ci1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19NU0RPU19GUz1tCi1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPW0KLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci1DT05GSUdfTkZTX1YzX0FDTD15Ci1DT05GSUdfTkZTX1Y0PXkKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9ImNwNDM3IgotQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQotQ09ORklHX05MU19BU0NJST15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMT15Ci1DT05GSUdfTkxTX0lTTzg4NTlfMTU9bQotQ09ORklHX05MU19VVEY4PXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfREVCVUdfRlM9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9VTldJTkQgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0xMPXkKLUNPTkZJR19FQVJMWV9QUklOVEs9eQotQ09ORklHX1NFQ1VSSVRZRlM9eQotQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKLUNPTkZJR19DUllQVE9fTFpPPXkKLSMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX0NDSVRUPW0KLUNPTkZJR19DUkNfVDEwRElGPXkKLUNPTkZJR19DUkM3PW0KLUNPTkZJR19MSUJDUkMzMkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDVfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDhkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL214NV9kZWZjb25maWcKQEAgLTAsMCArMSwxODQgQEAKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0tFUk5FTF9MWk89eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKK0NPTkZJR19SRUxBWT15CitDT05GSUdfRVhQRVJUPXkKKyMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9NWEM9eQorQ09ORklHX0FSQ0hfTVg1PXkKK0NPTkZJR19NQUNIX01YNTFfQkFCQkFHRT15CitDT05GSUdfTUFDSF9NWDUxXzNEUz15CitDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YNTE9eQorQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDUxU0Q9eQorQ09ORklHX01BQ0hfTVg1MV9FRklLQU1YPXkKK0NPTkZJR19NQUNIX01YNTFfRUZJS0FTQj15CitDT05GSUdfTUFDSF9NWDUzX0VWSz15CitDT05GSUdfTUFDSF9NWDUzX1NNRD15CitDT05GSUdfTUFDSF9NWDUzX0xPQ089eQorQ09ORklHX01BQ0hfTVg1M19BUkQ9eQorQ09ORklHX01YQ19QV009eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX1ZNU1BMSVRfMkc9eQorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKK0NPTkZJR19BRUFCST15CisjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTMyNzY4CitDT05GSUdfQ01ETElORT0ibm9pbml0cmQgY29uc29sZT10dHlteGMwLDExNTIwMCIKK0NPTkZJR19WRlA9eQorQ09ORklHX05FT049eQorQ09ORklHX0JJTkZNVF9NSVNDPW0KK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfUE1fVEVTVF9TVVNQRU5EPXkKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorQ09ORklHX0NPTk5FQ1RPUj15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT02NTUzNgorIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKKyMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAorQ09ORklHX0FUQT15CitDT05GSUdfUEFUQV9JTVg9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX01JST1tCitDT05GSUdfTUFSVkVMTF9QSFk9eQorQ09ORklHX0RBVklDT01fUEhZPXkKK0NPTkZJR19RU0VNSV9QSFk9eQorQ09ORklHX0xYVF9QSFk9eQorQ09ORklHX0NJQ0FEQV9QSFk9eQorQ09ORklHX1ZJVEVTU0VfUEhZPXkKK0NPTkZJR19TTVNDX1BIWT15CitDT05GSUdfQlJPQURDT01fUEhZPXkKK0NPTkZJR19JQ1BMVVNfUEhZPXkKK0NPTkZJR19SRUFMVEVLX1BIWT15CitDT05GSUdfTkFUSU9OQUxfUEhZPXkKK0NPTkZJR19TVEUxMFhQPXkKK0NPTkZJR19MU0lfRVQxMDExQ19QSFk9eQorQ09ORklHX01JQ1JFTF9QSFk9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0lOUFVUX0VWQlVHPW0KK0NPTkZJR19LRVlCT0FSRF9HUElPPXkKK0NPTkZJR19NT1VTRV9QUzI9bQorQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSD15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfTU1BODQ1MD15CitDT05GSUdfU0VSSU9fU0VSUE9SVD1tCitDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9JTVg9eQorQ09ORklHX1NFUklBTF9JTVhfQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19JMkM9eQorIyBDT05GSUdfSTJDX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0NIQVJERVY9eQorIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfQUxHT0JJVD1tCitDT05GSUdfSTJDX0FMR09QQ0Y9bQorQ09ORklHX0kyQ19BTEdPUENBPW0KK0NPTkZJR19JMkNfSU1YPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9JTVg9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19JTVgyX1dEVD15CitDT05GSUdfTUZEX01DMTNYWFg9eQorQ09ORklHX1JFR1VMQVRPUj15CitDT05GSUdfUkVHVUxBVE9SX01DMTM4OTI9eQorQ09ORklHX1VTQj15CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKK0NPTkZJR19VU0JfRUhDSV9NWEM9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19CTE9DSz1tCitDT05GSUdfTU1DX1NESENJPXkKK0NPTkZJR19NTUNfU0RIQ0lfUExURk09eQorQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVg9eQorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTD15CitDT05GSUdfUlRDX01YQz15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQ0X0ZTPXkKK0NPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUNF9GU19TRUNVUklUWT15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFPXkKKyMgQ09ORklHX1BSSU5UX1FVT1RBX1dBUk5JTkcgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorQ09ORklHX0ZVU0VfRlM9eQorQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iY3A0MzciCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CitDT05GSUdfTkxTX0FTQ0lJPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xNT1tCitDT05GSUdfTkxTX1VURjg9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fVU5XSU5EIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWUZTPXkKK0NPTkZJR19DUllQVE9fREVGTEFURT1tCitDT05GSUdfQ1JZUFRPX0xaTz1tCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfQ1JDNz1tCitDT05GSUdfTElCQ1JDMzJDPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXhzX2RlZmNvbmZpZwppbmRleCBkYjJjYjdkLi42ZWU3ODFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL214c19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9teHNfZGVmY29uZmlnCkBAIC0yNiw2ICsyNiw3IEBACiBDT05GSUdfTUFDSF9NWDI4RVZLPXkKIENPTkZJR19NQUNIX1NUTVAzNzhYX0RFVkI9eQogQ09ORklHX01BQ0hfVFgyOD15CitDT05GSUdfTUFDSF9NMjhFVks9eQogIyBDT05GSUdfQVJNX1RIVU1CIGlzIG5vdCBzZXQKIENPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdGVncmFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKaW5kZXggODg0NWYxYy4uMTk1NzI5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy90ZWdyYV9kZWZjb25maWcKQEAgLTI1LDYgKzI1LDcgQEAKIENPTkZJR19NQUNIX1BBWjAwPXkKIENPTkZJR19NQUNIX1RSSU1TTElDRT15CiBDT05GSUdfTUFDSF9XQVJJTz15CitDT05GSUdfTUFDSF9WRU5UQU5BPXkKIENPTkZJR19URUdSQV9ERUJVR19VQVJURD15CiBDT05GSUdfQVJNX0VSUkFUQV83NDIyMzA9eQogQ09ORklHX05PX0haPXkKQEAgLTM4LDcgKzM5LDYgQEAKIENPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKIENPTkZJR19aQk9PVF9ST01fQlNTPTB4MAogQ09ORklHX1ZGUD15Ci1DT05GSUdfUE09eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTY1LDYgKzY1LDcgQEAKIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CiAjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19NSVNDX0RFVklDRVM9eQogQ09ORklHX0FENTI1WF9EUE9UPXkKQEAgLTcyLDM0ICs3Myw2MSBAQAogQ09ORklHX0lDUzkzMlM0MDE9eQogQ09ORklHX0FQRFM5ODAyQUxTPXkKIENPTkZJR19JU0wyOTAwMz15CitDT05GSUdfU0NTST15CitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19EVU1NWT15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19SODE2OT15CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1BFR0FTVVM9eQorQ09ORklHX1VTQl9VU0JORVQ9eQorQ09ORklHX1VTQl9ORVRfU01TQzc1WFg9eQorQ09ORklHX1VTQl9ORVRfU01TQzk1WFg9eQogIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9PRl9QTEFURk9STT15CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAogQ09ORklHX0kyQz15CiAjIENPTkZJR19JMkNfQ09NUEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19IRUxQRVJfQVVUTyBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX1RFR1JBPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9URUdSQT15CiBDT05GSUdfU0VOU09SU19MTTkwPXkKIENPTkZJR19NRkRfVFBTNjU4Nlg9eQogQ09ORklHX1JFR1VMQVRPUj15CiBDT05GSUdfUkVHVUxBVE9SX1RQUzY1ODZYPXkKLSMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQiBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQz15CitDT05GSUdfU05EX1NPQ19URUdSQT15CitDT05GSUdfU05EX1NPQ19URUdSQV9XTTg5MDM9eQorQ09ORklHX1NORF9TT0NfVEVHUkFfVFJJTVNMSUNFPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9FSENJX0hDRD15CitDT05GSUdfVVNCX0VIQ0lfVEVHUkE9eQorQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19NTUM9eQogQ09ORklHX01NQ19TREhDST15CiBDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKIENPTkZJR19NTUNfU0RIQ0lfVEVHUkE9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9URUdSQT15CiBDT05GSUdfU1RBR0lORz15Ci0jIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAogQ09ORklHX0lJTz15CiBDT05GSUdfU0VOU09SU19JU0wyOTAxOD15CiBDT05GSUdfU0VOU09SU19BSzg5NzU9eQpAQCAtMTIzLDE4ICsxNTEsMTUgQEAKIENPTkZJR19QUklOVEtfVElNRT15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX1NDSEVEU1RBVFM9eQogQ09ORklHX1RJTUVSX1NUQVRTPXkKIENPTkZJR19ERUJVR19TTEFCPXkKICMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX01VVEVYRVM9eQotQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQPXkKIENPTkZJR19ERUJVR19JTkZPPXkKIENPTkZJR19ERUJVR19WTT15CiBDT05GSUdfREVCVUdfU0c9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX0VDQj15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZXZpY2UuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCmluZGV4IDY2MTVmMDMuLjdhYTM2ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RldmljZS5oCkBAIC0xNSw3ICsxNSwxMiBAQAogI2VuZGlmCiB9OwogCitzdHJ1Y3Qgb21hcF9kZXZpY2U7CisKIHN0cnVjdCBwZGV2X2FyY2hkYXRhIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQCisJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKyNlbmRpZgogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCAyOGI3ZWU4Li5jYjNiN2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTIwNSw2ICsyMDUsMTMgQEAKIGludCBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwKIAkJdm9pZCAqLCBkbWFfYWRkcl90LCBzaXplX3QpOwogCisvKgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGR1cmluZyBib290IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBjb25zaXN0ZW50CisgKiBETUEgcmVnaW9uIGFib3ZlIGl0J3MgZGVmYXVsdCB2YWx1ZSBvZiAyTUIuIEl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUKKyAqIG1lbW9yeSBhbGxvY2F0b3IgaXMgaW5pdGlhbGlzZWQsIGkuZS4gYmVmb3JlIGFueSBjb3JlX2luaXRjYWxsLgorICovCitleHRlcm4gdm9pZCBfX2luaXQgaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKIAogI2lmZGVmIENPTkZJR19ETUFCT1VOQ0UKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUwppbmRleCAyZjFlMjA5Li44OGQ2MTgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKQEAgLTI1LDEzICsyNSw2IEBACiAJbW92bmUJcjEsIHNwCiAJYWRybmUJbHIsIEJTWU0oMWIpCiAJYm5lCWRvX0lQSQotCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCXRlc3RfZm9yX2x0aXJxIHIwLCByMiwgcjYsIGxyCi0JbW92bmUJcjAsIHNwCi0JYWRybmUJbHIsIEJTWU0oMWIpCi0JYm5lCWRvX2xvY2FsX3RpbWVyCi0jZW5kaWYKICNlbmRpZgogOTk5NzoKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ3Bpby5oCmluZGV4IDE2NmE3YTMuLjExYWQwYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9ncGlvLmgKQEAgLTQsNCArNCwyMyBAQAogLyogbm90IGFsbCBBUk0gcGxhdGZvcm1zIG5lY2Vzc2FyaWx5IHN1cHBvcnQgdGhpcyBBUEkgLi4uICovCiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKKyNpZm5kZWYgX19BUk1fR1BJT0xJQl9DT01QTEVYCisvKiBOb3RlOiB0aGlzIG1heSByZWx5IHVwb24gdGhlIHZhbHVlIG9mIEFSQ0hfTlJfR1BJT1Mgc2V0IGluIG1hY2gvZ3Bpby5oICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisvKiBUaGUgdHJpdmlhbCBncGlvbGliIGRpc3BhdGNoZXJzICovCisjZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlICBfX2dwaW9fZ2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fc2V0X3ZhbHVlICBfX2dwaW9fc2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fY2Fuc2xlZXAgICBfX2dwaW9fY2Fuc2xlZXAKKyNlbmRpZgorCisvKgorICogUHJvdmlkZSBhIGRlZmF1bHQgZ3Bpb190b19pcnEoKSB3aGljaCBzaG91bGQgc2F0aXNmeSBldmVyeSBjYXNlLgorICogSG93ZXZlciwgc29tZSBwbGF0Zm9ybXMgd2FudCB0byBkbyB0aGlzIGRpZmZlcmVudGx5LCBzbyBhbGxvdyB0aGVtCisgKiB0byBvdmVycmlkZSBpdC4KKyAqLworI2lmbmRlZiBncGlvX3RvX2lycQorI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BUkNIX0FSTV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCA4OWFkMTgwLi5kZGYwN2E5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC05LDkgKzksNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKLQl1bnNpZ25lZCBpbnQgbG9jYWxfdGltZXJfaXJxczsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBpbnQgaXBpX2lycXNbTlJfSVBJXTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oCmluZGV4IDQzNGVkY2MuLjFkYjExNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmgKQEAgLTEwMiw3ICsxMDIsMTQgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIGV4dGVybiB2b2lkIF9faW5pdCBsMngwX2luaXQodm9pZCBfX2lvbWVtICpiYXNlLCBfX3UzMiBhdXhfdmFsLCBfX3UzMiBhdXhfbWFzayk7CisjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfTDJYMCkgJiYgZGVmaW5lZChDT05GSUdfT0YpCiBleHRlcm4gaW50IGwyeDBfb2ZfaW5pdChfX3UzMiBhdXhfdmFsLCBfX3UzMiBhdXhfbWFzayk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbDJ4MF9vZl9pbml0KF9fdTMyIGF1eF92YWwsIF9fdTMyIGF1eF9tYXNrKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCiAKIHN0cnVjdCBsMngwX3JlZ3MgewogCXVuc2lnbmVkIGxvbmcgcGh5X2Jhc2U7CkBAIC0xMjEsNiArMTI4LDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBsMngwX3JlZ3MgbDJ4MF9zYXZlZF9yZWdzOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCmluZGV4IGMxMTViODIuLjc0ZWJjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCkBAIC0yMiwxNSArMjIsMTEgQEAKICAqIGludGVycnVwdCBjb250cm9sbGVyIHNwZWMuICBUbyB3aXQ6CiAgKgogICogSW50ZXJydXB0cyAwLTE1IGFyZSBJUEkKLSAqIDE2LTI4IGFyZSByZXNlcnZlZAotICogMjktMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgorICogMTYtMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgogICogMzItMTAyMCBhcmUgZ2xvYmFsCiAgKiAxMDIxLTEwMjIgYXJlIHJlc2VydmVkCiAgKiAxMDIzIGlzICJzcHVyaW91cyIgKG5vIGludGVycnVwdCkKICAqCi0gKiBGb3Igbm93LCB3ZSBpZ25vcmUgYWxsIGxvY2FsIGludGVycnVwdHMgc28gb25seSByZXR1cm4gYW4gaW50ZXJydXB0IGlmIGl0J3MKLSAqIGJldHdlZW4gMzAgYW5kIDEwMjAuICBUaGUgdGVzdF9mb3JfaXBpIHJvdXRpbmUgYmVsb3cgd2lsbCBwaWNrIHVwIG9uIElQSXMuCi0gKgogICogQSBzaW1wbGUgcmVhZCBmcm9tIHRoZSBjb250cm9sbGVyIHdpbGwgdGVsbCB1cyB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0CiAgKiBwcmlvcml0eSBlbmFibGVkIGludGVycnVwdC4gIFdlIHRoZW4ganVzdCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgaW4gdGhlCiAgKiB2YWxpZCByYW5nZSBmb3IgYW4gSVJRICgzMC0xMDIwIGluY2x1c2l2ZSkuCkBAIC00Myw3ICszOSw3IEBACiAKIAlsZHIJXHRtcCwgPTEwMjEKIAliaWMgICAgIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLQljbXAgICAgIFxpcnFuciwgIzI5CisJY21wICAgICBcaXJxbnIsICMxNQogCWNtcGNjCVxpcnFuciwgXGlycW5yCiAJY21wbmUJXGlycW5yLCBcdG1wCiAJY21wY3MJXGlycW5yLCBcaXJxbnIKQEAgLTYyLDE0ICs1OCwzIEBACiAJc3RyY2MJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQogCWNtcGNzCVxpcnFuciwgXGlycW5yCiAJLmVuZG0KLQotLyogQXMgYWJvdmUsIHRoaXMgYXNzdW1lcyB0aGF0IGlycXN0YXQgYW5kIGJhc2UgYXJlIHByZXNlcnZlZC4uICovCi0KLQkubWFjcm8gdGVzdF9mb3JfbHRpcnEsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQliaWMJXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotCW1vdiAJXHRtcCwgIzAKLQljbXAJXGlycW5yLCAjMjkKLQltb3ZlcQlcdG1wLCAjMQotCXN0cmVxCVxpcnFzdGF0LCBbXGJhc2UsICNHSUNfQ1BVX0VPSV0KLQljbXAJXHRtcCwgIzAKLQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvZ2ljLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaAppbmRleCA0MzVkM2Y4Li4zZTkxZjIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaApAQCAtMzMsMTkgKzMzLDMyIEBACiAjZGVmaW5lIEdJQ19ESVNUX1NPRlRJTlQJCTB4ZjAwCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CitzdHJ1Y3QgZGV2aWNlX25vZGU7CisKIGV4dGVybiB2b2lkIF9faW9tZW0gKmdpY19jcHVfYmFzZV9hZGRyOwogZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBnaWNfYXJjaF9leHRuOwogCi12b2lkIGdpY19pbml0KHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB2b2lkIF9faW9tZW0gKiwgdm9pZCBfX2lvbWVtICopOwordm9pZCBnaWNfaW5pdCh1bnNpZ25lZCBpbnQsIGludCwgdm9pZCBfX2lvbWVtICosIHZvaWQgX19pb21lbSAqKTsKK2ludCBnaWNfb2ZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KTsKIHZvaWQgZ2ljX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCk7CiB2b2lkIGdpY19jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgZ2ljX25yLCB1bnNpZ25lZCBpbnQgaXJxKTsKIHZvaWQgZ2ljX3JhaXNlX3NvZnRpcnEoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBnaWNfZW5hYmxlX3BwaSh1bnNpZ25lZCBpbnQpOwogCiBzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSB7Ci0JdW5zaWduZWQgaW50IGlycV9vZmZzZXQ7CiAJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CiAJdm9pZCBfX2lvbWVtICpjcHVfYmFzZTsKKyNpZmRlZiBDT05GSUdfQ1BVX1BNCisJdTMyIHNhdmVkX3NwaV9lbmFibGVbRElWX1JPVU5EX1VQKDEwMjAsIDMyKV07CisJdTMyIHNhdmVkX3NwaV9jb25mW0RJVl9ST1VORF9VUCgxMDIwLCAxNildOworCXUzMiBzYXZlZF9zcGlfdGFyZ2V0W0RJVl9ST1VORF9VUCgxMDIwLCA0KV07CisJdTMyIF9fcGVyY3B1ICpzYXZlZF9wcGlfZW5hYmxlOworCXUzMiBfX3BlcmNwdSAqc2F2ZWRfcHBpX2NvbmY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTgorCXN0cnVjdCBpcnFfZG9tYWluIGRvbWFpbjsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBnaWNfaXJxczsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wM3h4LWdwaW8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2lvcDN4eC1ncGlvLmgKaW5kZXggYjY5ZDk3Mi4uOWVkYTdkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaW9wM3h4LWdwaW8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pb3AzeHgtZ3Bpby5oCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAorI2RlZmluZSBfX0FSTV9HUElPTElCX0NPTVBMRVgKKwogI2RlZmluZSBJT1AzWFhfTl9HUElPUwk4CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCmluZGV4IGIzZmVhMzguLjQzY2FiNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCkBAIC05LDcgKzksNyBAQAogCiAjaWZuZGVmIF9fQVNNX0hBUkRXQVJFX0lUODE1Ml9ICiAjZGVmaW5lIF9fQVNNX0hBUkRXQVJFX0lUODE1Ml9ICi1leHRlcm4gdW5zaWduZWQgbG9uZyBpdDgxNTJfYmFzZV9hZGRyZXNzOworZXh0ZXJuIHZvaWQgX19pb21lbSAqaXQ4MTUyX2Jhc2VfYWRkcmVzczsKIAogI2RlZmluZSBJVDgxNTJfSU9fQkFTRQkJCShpdDgxNTJfYmFzZV9hZGRyZXNzICsgMHgwM2UwMDAwMCkKICNkZWZpbmUgSVQ4MTUyX0NGR1JFR19CQVNFCQkoaXQ4MTUyX2Jhc2VfYWRkcmVzcyArIDB4MDNmMDAwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9wbDA4MC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvcGwwODAuaAppbmRleCBlNGEwNGU0Li4zM2M3OGQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9wbDA4MC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3BsMDgwLmgKQEAgLTIxLDYgKzIxLDkgQEAKICAqIE9uZU5BTkQgZmVhdHVyZXMuCiAqLwogCisjaWZuZGVmIEFTTV9QTDA4MF9ICisjZGVmaW5lIEFTTV9QTDA4MF9ICisKICNkZWZpbmUgUEwwODBfSU5UX1NUQVRVUwkJCSgweDAwKQogI2RlZmluZSBQTDA4MF9UQ19TVEFUVVMJCQkJKDB4MDQpCiAjZGVmaW5lIFBMMDgwX1RDX0NMRUFSCQkJCSgweDA4KQpAQCAtMTM4LDMgKzE0MSw0IEBACiAJdTMyCWNvbnRyb2wxOwogfTsKIAorI2VuZGlmIC8qIEFTTV9QTDA4MF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKaW5kZXggZjM4OWIyNy4uYzE5MGJjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtNTAsNiArNTAsNyBAQAogI2RlZmluZSBBUk1fREVCVUdfQVJDSF9WNl8xCTIKICNkZWZpbmUgQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQJMwogI2RlZmluZSBBUk1fREVCVUdfQVJDSF9WN19NTQk0CisjZGVmaW5lIEFSTV9ERUJVR19BUkNIX1Y3XzEJNQogCiAvKiBCcmVha3BvaW50ICovCiAjZGVmaW5lIEFSTV9CUkVBS1BPSU5UX0VYRUNVVEUJMApAQCAtNTcsNiArNTgsNyBAQAogLyogV2F0Y2hwb2ludHMgKi8KICNkZWZpbmUgQVJNX0JSRUFLUE9JTlRfTE9BRAkxCiAjZGVmaW5lIEFSTV9CUkVBS1BPSU5UX1NUT1JFCTIKKyNkZWZpbmUgQVJNX0ZTUl9BQ0NFU1NfTUFTSwkoMSA8PCAxMSkKIAogLyogUHJpdmlsZWdlIExldmVscyAqLwogI2RlZmluZSBBUk1fQlJFQUtQT0lOVF9QUklWCTEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2xvY2FsdGltZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2xvY2FsdGltZXIuaAppbmRleCA2ZmQ5NTVkLi5jNmExODQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9sb2NhbHRpbWVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbG9jYWx0aW1lci5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9MT0NBTFRJTUVSX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2U7CiAKQEAgLTE5LDMxICsyMCwyMCBAQAogICovCiB2b2lkIHBlcmNwdV90aW1lcl9zZXR1cCh2b2lkKTsKIAotLyoKLSAqIENhbGxlZCBmcm9tIGFzc2VtYmx5LCB0aGlzIGlzIHRoZSBsb2NhbCB0aW1lciBJUlEgaGFuZGxlcgotICovCi1hc21saW5rYWdlIHZvaWQgZG9fbG9jYWxfdGltZXIoc3RydWN0IHB0X3JlZ3MgKik7Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSBDIGNvZGUKLSAqLwotdm9pZCBoYW5kbGVfbG9jYWxfdGltZXIoc3RydWN0IHB0X3JlZ3MgKik7Ci0KICNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCiAKICNpZmRlZiBDT05GSUdfSEFWRV9BUk1fVFdECiAKICNpbmNsdWRlICJzbXBfdHdkLmgiCiAKLSNkZWZpbmUgbG9jYWxfdGltZXJfYWNrKCkJdHdkX3RpbWVyX2FjaygpCisjZGVmaW5lIGxvY2FsX3RpbWVyX3N0b3AoYykJdHdkX3RpbWVyX3N0b3AoKGMpKQogCiAjZWxzZQogCiAvKgotICogUGxhdGZvcm0gcHJvdmlkZXMgdGhpcyB0byBhY2tub3dsZWRnZSBhIGxvY2FsIHRpbWVyIElSUS4KLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9jYWwgdGltZXIgSVJRIGlzIHRvIGJlIHByb2Nlc3NlZC4KKyAqIFN0b3AgdGhlIGxvY2FsIHRpbWVyCiAgKi8KLWludCBsb2NhbF90aW1lcl9hY2sodm9pZCk7Cit2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKIAogI2VuZGlmCiAKQEAgLTU4LDYgKzQ4LDEwIEBACiB7CiAJcmV0dXJuIC1FTlhJTzsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworfQogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAppbmRleCBjNTY5OTk4Li43ZDE5NDI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaApAQCAtMTcsNyArMTcsNyBAQAogc3RydWN0IG1hY2hpbmVfZGVzYyB7CiAJdW5zaWduZWQgaW50CQlucjsJCS8qIGFyY2hpdGVjdHVyZSBudW1iZXIJKi8KIAljb25zdCBjaGFyCQkqbmFtZTsJCS8qIGFyY2hpdGVjdHVyZSBuYW1lCSovCi0JdW5zaWduZWQgbG9uZwkJYm9vdF9wYXJhbXM7CS8qIHRhZ2dlZCBsaXN0CQkqLworCXVuc2lnbmVkIGxvbmcJCWF0YWdfb2Zmc2V0OwkvKiB0YWdnZWQgbGlzdCAocmVsYXRpdmUpICovCiAJY29uc3QgY2hhcgkJKipkdF9jb21wYXQ7CS8qIGFycmF5IG9mIGRldmljZSB0cmVlCiAJCQkJCQkgKiAnY29tcGF0aWJsZScgc3RyaW5ncwkqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tYXAuaAppbmRleCBkMmZlZGI1Li5iMzZmMzY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgTVRfTUVNT1JZX05PTkNBQ0hFRAkxMQogI2RlZmluZSBNVF9NRU1PUllfRFRDTQkJMTIKICNkZWZpbmUgTVRfTUVNT1JZX0lUQ00JCTEzCisjZGVmaW5lIE1UX01FTU9SWV9TTwkJMTQKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiB2b2lkIGlvdGFibGVfaW5pdChzdHJ1Y3QgbWFwX2Rlc2MgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggNDQxZmM0Zi4uYTg5OTdkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKQEAgLTE2LDkgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAorI2lmZGVmIENPTkZJR19ORUVEX01BQ0hfTUVNT1JZX0gKKyNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgorI2VuZGlmCisKIC8qCiAgKiBBbGxvdyBmb3IgY29uc3RhbnRzIGRlZmluZWQgaGVyZSB0byBiZSB1c2VkIGZyb20gYXNzZW1ibHkgY29kZQogICogYnkgcHJlcGVuZGluZyB0aGUgVUwgc3VmZml4IG9ubHkgd2l0aCBhY3R1YWwgQyBjb2RlIGNvbXBpbGF0aW9uLgpAQCAtNzcsMTYgKzgwLDcgQEAKICAqLwogI2RlZmluZSBJT1JFTUFQX01BWF9PUkRFUgkyNAogCi0vKgotICogU2l6ZSBvZiBETUEtY29uc2lzdGVudCBtZW1vcnkgcmVnaW9uLiAgTXVzdCBiZSBtdWx0aXBsZSBvZiAyTSwKLSAqIGJldHdlZW4gMk1CIGFuZCAxNE1CIGluY2x1c2l2ZS4KLSAqLwotI2lmbmRlZiBDT05TSVNURU5UX0RNQV9TSVpFCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgCVNaXzJNCi0jZW5kaWYKLQogI2RlZmluZSBDT05TSVNURU5UX0VORAkJKDB4ZmZlMDAwMDBVTCkKLSNkZWZpbmUgQ09OU0lTVEVOVF9CQVNFCQkoQ09OU0lTVEVOVF9FTkQgLSBDT05TSVNURU5UX0RNQV9TSVpFKQogCiAjZWxzZSAvKiBDT05GSUdfTU1VICovCiAKQEAgLTE5Myw3ICsxODcsMTEgQEAKICNlbmRpZgogCiAjaWZuZGVmIFBIWVNfT0ZGU0VUCisjaWZkZWYgUExBVF9QSFlTX09GRlNFVAogI2RlZmluZSBQSFlTX09GRlNFVAlQTEFUX1BIWVNfT0ZGU0VUCisjZWxzZQorI2RlZmluZSBQSFlTX09GRlNFVAlVTChDT05GSUdfUEhZU19PRkZTRVQpCisjZW5kaWYKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDhhZGUxODQuLjk0NTFkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTEwMSw2ICsxMDEsOSBAQAogI2RlZmluZSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHByb3QpIFwKIAlfX3BncHJvdF9tb2RpZnkocHJvdCwgTF9QVEVfTVRfTUFTSywgTF9QVEVfTVRfQlVGRkVSQUJMRSkKIAorI2RlZmluZSBwZ3Byb3Rfc3Ryb25nbHlvcmRlcmVkKHByb3QpIFwKKwlfX3BncHJvdF9tb2RpZnkocHJvdCwgTF9QVEVfTVRfTUFTSywgTF9QVEVfTVRfVU5DQUNIRUQpCisKICNpZmRlZiBDT05GSUdfQVJNX0RNQV9NRU1fQlVGRkVSQUJMRQogI2RlZmluZSBwZ3Byb3RfZG1hY29oZXJlbnQocHJvdCkgXAogCV9fcGdwcm90X21vZGlmeShwcm90LCBMX1BURV9NVF9NQVNLLCBMX1BURV9NVF9CVUZGRVJBQkxFIHwgTF9QVEVfWE4pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCmluZGV4IGI3ZTgyYzQuLjcxZDk5YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCkBAIC0xMyw3ICsxMywxMiBAQAogI2RlZmluZSBfX0FSTV9QTVVfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAKKy8qCisgKiBUeXBlcyBvZiBQTVVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGFuZCByZXF1aXJlIG11dHVhbAorICogZXhjbHVzaW9uIGJldHdlZW4gcHJvZmlsaW5nIHRvb2xzLgorICovCiBlbnVtIGFybV9wbXVfdHlwZSB7CiAJQVJNX1BNVV9ERVZJQ0VfQ1BVCT0gMCwKIAlBUk1fTlVNX1BNVV9ERVZJQ0VTLApAQCAtMzcsMjEgKzQyLDE3IEBACiAgKiByZXNlcnZlX3BtdSgpIC0gcmVzZXJ2ZSB0aGUgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMKICAqCiAgKiBSZXNlcnZlIHRoZSBoYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVycyBpbiB0aGUgc3lzdGVtIGZvciBleGNsdXNpdmUgdXNlLgotICogVGhlIHBsYXRmb3JtX2RldmljZSBmb3IgdGhlIHN5c3RlbSBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKLSAqIGVuY29kZWQgZXJyb3Igb24gZmFpbHVyZS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FQlVTWSBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IGhlbGQuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKK2V4dGVybiBpbnQKIHJlc2VydmVfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpOwogCiAvKioKICAqIHJlbGVhc2VfcG11KCkgLSBSZWxpbnF1aXNoIGNvbnRyb2wgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzCiAgKgogICogUmVsZWFzZSB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgYW5kIGFsbG93IHNvbWVvbmUgZWxzZSB0byB1c2UgdGhlbS4KLSAqIENhbGxlcnMgbXVzdCBoYXZlIGRpc2FibGVkIHRoZSBjb3VudGVycyBhbmQgcmVsZWFzZWQgSVJRcyBiZWZvcmUgY2FsbGluZwotICogdGhpcy4gVGhlIHBsYXRmb3JtX2RldmljZSByZXR1cm5lZCBmcm9tIHJlc2VydmVfcG11KCkgbXVzdCBiZSBwYXNzZWQgYXMKLSAqIGEgY29va2llLgogICovCi1leHRlcm4gaW50CitleHRlcm4gdm9pZAogcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSk7CiAKIC8qKgpAQCAtNjgsMjQgKzY5LDc4IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKK3N0YXRpYyBpbmxpbmUgaW50CiByZXNlcnZlX3BtdShlbnVtIGFybV9wbXVfdHlwZSB0eXBlKQogewotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSkKLXsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLWluaXRfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19CitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbGVhc2VfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCXsgfQogCiAjZW5kaWYgLyogQ09ORklHX0NQVV9IQVNfUE1VICovCiAKKyNpZmRlZiBDT05GSUdfSFdfUEVSRl9FVkVOVFMKKworLyogVGhlIGV2ZW50cyBmb3IgYSBnaXZlbiBQTVUgcmVnaXN0ZXIgc2V0LiAqLworc3RydWN0IHBtdV9od19ldmVudHMgeworCS8qCisJICogVGhlIGV2ZW50cyB0aGF0IGFyZSBhY3RpdmUgb24gdGhlIFBNVSBmb3IgdGhlIGdpdmVuIGluZGV4LgorCSAqLworCXN0cnVjdCBwZXJmX2V2ZW50CSoqZXZlbnRzOworCisJLyoKKwkgKiBBIDEgYml0IGZvciBhbiBpbmRleCBpbmRpY2F0ZXMgdGhhdCB0aGUgY291bnRlciBpcyBiZWluZyB1c2VkIGZvcgorCSAqIGFuIGV2ZW50LiBBIDAgbWVhbnMgdGhhdCB0aGUgY291bnRlciBjYW4gYmUgdXNlZC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAqdXNlZF9tYXNrOworCisJLyoKKwkgKiBIYXJkd2FyZSBsb2NrIHRvIHNlcmlhbGl6ZSBhY2Nlc3NlcyB0byBQTVUgcmVnaXN0ZXJzLiBOZWVkZWQgZm9yIHRoZQorCSAqIHJlYWQvbW9kaWZ5L3dyaXRlIHNlcXVlbmNlcy4KKwkgKi8KKwlyYXdfc3BpbmxvY2tfdAkJcG11X2xvY2s7Cit9OworCitzdHJ1Y3QgYXJtX3BtdSB7CisJc3RydWN0IHBtdQlwbXU7CisJZW51bSBhcm1fcGVyZl9wbXVfaWRzIGlkOworCWVudW0gYXJtX3BtdV90eXBlIHR5cGU7CisJY3B1bWFza190CWFjdGl2ZV9pcnFzOworCWNvbnN0IGNoYXIJKm5hbWU7CisJaXJxcmV0dXJuX3QJKCpoYW5kbGVfaXJxKShpbnQgaXJxX251bSwgdm9pZCAqZGV2KTsKKwl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2dCwgaW50IGlkeCk7CisJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KTsKKwlpbnQJCSgqZ2V0X2V2ZW50X2lkeCkoc3RydWN0IHBtdV9od19ldmVudHMgKmh3X2V2ZW50cywKKwkJCQkJIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpOworCWludAkJKCpzZXRfZXZlbnRfZmlsdGVyKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LAorCQkJCQkgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cik7CisJdTMyCQkoKnJlYWRfY291bnRlcikoaW50IGlkeCk7CisJdm9pZAkJKCp3cml0ZV9jb3VudGVyKShpbnQgaWR4LCB1MzIgdmFsKTsKKwl2b2lkCQkoKnN0YXJ0KSh2b2lkKTsKKwl2b2lkCQkoKnN0b3ApKHZvaWQpOworCXZvaWQJCSgqcmVzZXQpKHZvaWQgKik7CisJaW50CQkoKm1hcF9ldmVudCkoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwlpbnQJCW51bV9ldmVudHM7CisJYXRvbWljX3QJYWN0aXZlX2V2ZW50czsKKwlzdHJ1Y3QgbXV0ZXgJcmVzZXJ2ZV9tdXRleDsKKwl1NjQJCW1heF9wZXJpb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGxhdF9kZXZpY2U7CisJc3RydWN0IHBtdV9od19ldmVudHMJKigqZ2V0X2h3X2V2ZW50cykodm9pZCk7Cit9OworCisjZGVmaW5lIHRvX2FybV9wbXUocCkgKGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgYXJtX3BtdSwgcG11KSkKKworaW50IF9faW5pdCBhcm1wbXVfcmVnaXN0ZXIoc3RydWN0IGFybV9wbXUgKmFybXBtdSwgY2hhciAqbmFtZSwgaW50IHR5cGUpOworCit1NjQgYXJtcG11X2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAorCQkJaW50IGlkeCwgaW50IG92ZXJmbG93KTsKKworaW50IGFybXBtdV9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAorCQkJICAgIGludCBpZHgpOworCisjZW5kaWYgLyogQ09ORklHX0hXX1BFUkZfRVZFTlRTICovCisKICNlbmRpZiAvKiBfX0FSTV9QTVVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAppbmRleCA2MzNkMWNiLi45ZTkyY2IyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oCkBAIC04MSw2ICs4MSwxMCBAQAogZXh0ZXJuIHZvaWQgY3B1X2RvX3N3aXRjaF9tbSh1bnNpZ25lZCBsb25nIHBnZF9waHlzLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CiBleHRlcm4gdm9pZCBjcHVfcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCisvKiBUaGVzZSB0aHJlZSBhcmUgcHJpdmF0ZSB0byBhcmNoL2FybS9rZXJuZWwvc3VzcGVuZC5jICovCitleHRlcm4gdm9pZCBjcHVfZG9fc3VzcGVuZCh2b2lkICopOworZXh0ZXJuIHZvaWQgY3B1X2RvX3Jlc3VtZSh2b2lkICopOwogI2Vsc2UKICNkZWZpbmUgY3B1X3Byb2NfaW5pdAkJCXByb2Nlc3Nvci5fcHJvY19pbml0CiAjZGVmaW5lIGNwdV9wcm9jX2ZpbgkJCXByb2Nlc3Nvci5fcHJvY19maW4KQEAgLTg5LDYgKzkzLDEwIEBACiAjZGVmaW5lIGNwdV9kY2FjaGVfY2xlYW5fYXJlYQkJcHJvY2Vzc29yLmRjYWNoZV9jbGVhbl9hcmVhCiAjZGVmaW5lIGNwdV9zZXRfcHRlX2V4dAkJCXByb2Nlc3Nvci5zZXRfcHRlX2V4dAogI2RlZmluZSBjcHVfZG9fc3dpdGNoX21tCQlwcm9jZXNzb3Iuc3dpdGNoX21tCisKKy8qIFRoZXNlIHRocmVlIGFyZSBwcml2YXRlIHRvIGFyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMgKi8KKyNkZWZpbmUgY3B1X2RvX3N1c3BlbmQJCQlwcm9jZXNzb3IuZG9fc3VzcGVuZAorI2RlZmluZSBjcHVfZG9fcmVzdW1lCQkJcHJvY2Vzc29yLmRvX3Jlc3VtZQogI2VuZGlmCiAKIGV4dGVybiB2b2lkIGNwdV9yZXN1bWUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IDBhMTdiNjIuLjFlNTcxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC05OSw5ICs5OSw0IEBACiBleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogCi0vKgotICogc2hvdyBsb2NhbCBpbnRlcnJ1cHQgaW5mbwotICovCi1leHRlcm4gdm9pZCBzaG93X2xvY2FsX2lycXMoc3RydWN0IHNlcV9maWxlICosIGludCk7Ci0KICNlbmRpZiAvKiBpZm5kZWYgX19BU01fQVJNX1NNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmgKaW5kZXggZmVkOTk4MS4uZWY5ZmZiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF90d2QuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfdHdkLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogZXh0ZXJuIHZvaWQgX19pb21lbSAqdHdkX2Jhc2U7CiAKLWludCB0d2RfdGltZXJfYWNrKHZvaWQpOwogdm9pZCB0d2RfdGltZXJfc2V0dXAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKK3ZvaWQgdHdkX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdXNwZW5kLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKaW5kZXggYjBlNGUxYS4uMWMwYTU1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3VzcGVuZC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3N1c3BlbmQuaApAQCAtMSwyMiArMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9TVVNQRU5EX0gKICNkZWZpbmUgX19BU01fQVJNX1NVU1BFTkRfSAogCi0jaW5jbHVkZSA8YXNtL21lbW9yeS5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotCiBleHRlcm4gdm9pZCBjcHVfcmVzdW1lKHZvaWQpOwotCi0vKgotICogSGlkZSB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyB0byBfX2NwdV9zdXNwZW5kIC0gdGhlc2UgYXJlIGFuIGltcGxlbWVudGF0aW9uCi0gKiBkZXRhaWwgd2hpY2ggcGxhdGZvcm0gY29kZSBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0LgotICovCi1zdGF0aWMgaW5saW5lIGludCBjcHVfc3VzcGVuZCh1bnNpZ25lZCBsb25nIGFyZywgaW50ICgqZm4pKHVuc2lnbmVkIGxvbmcpKQotewotCWV4dGVybiBpbnQgX19jcHVfc3VzcGVuZChpbnQsIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJIGludCAoKikodW5zaWduZWQgbG9uZykpOwotCWludCByZXQgPSBfX2NwdV9zdXNwZW5kKDAsIFBIWVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQsIGFyZywgZm4pOwotCWZsdXNoX3RsYl9hbGwoKTsKLQlyZXR1cm4gcmV0OwotfQorZXh0ZXJuIGludCBjcHVfc3VzcGVuZCh1bnNpZ25lZCBsb25nLCBpbnQgKCopKHVuc2lnbmVkIGxvbmcpKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNjgwMzZlZS4uMTZlZWQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjksNyArMjksNyBAQAogb2JqLSQoQ09ORklHX0FSVEhVUikJCSs9IGFydGh1ci5vCiBvYmotJChDT05GSUdfSVNBX0RNQSkJCSs9IGRtYS1pc2Eubwogb2JqLSQoQ09ORklHX1BDSSkJCSs9IGJpb3MzMi5vIGlzYS5vCi1vYmotJChDT05GSUdfQVJNX0NQVV9TVVNQRU5EKQkrPSBzbGVlcC5vCitvYmotJChDT05GSUdfQVJNX0NQVV9TVVNQRU5EKQkrPSBzbGVlcC5vIHN1c3BlbmQubwogb2JqLSQoQ09ORklHX0hBVkVfU0NIRURfQ0xPQ0spCSs9IHNjaGVkX2Nsb2NrLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBfdGxiLm8KIG9iai0kKENPTkZJR19IQVZFX0FSTV9TQ1UpCSs9IHNtcF9zY3UubwpAQCAtNDMsNiArNDMsMTMgQEAKIGVsc2UKIG9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy1hcm0ubwogZW5kaWYKK29iai0kKENPTkZJR19BUk1fS1BST0JFU19URVNUKQkrPSB0ZXN0LWtwcm9iZXMubwordGVzdC1rcHJvYmVzLW9ianMJCTo9IGtwcm9iZXMtdGVzdC5vCitpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAordGVzdC1rcHJvYmVzLW9ianMJCSs9IGtwcm9iZXMtdGVzdC10aHVtYi5vCitlbHNlCit0ZXN0LWtwcm9iZXMtb2JqcwkJKz0ga3Byb2Jlcy10ZXN0LWFybS5vCitlbmRpZgogb2JqLSQoQ09ORklHX0FUQUdTX1BST0MpCSs9IGF0YWdzLm8KIG9iai0kKENPTkZJR19PQUJJX0NPTVBBVCkJKz0gc3lzX29hYmktY29tcGF0Lm8KIG9iai0kKENPTkZJR19BUk1fVEhVTUJFRSkJKz0gdGh1bWJlZS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXJta3N5bXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCmluZGV4IDhlM2M2ZjEuLjViMGJjZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jCkBAIC03LDcgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKaW5kZXggYzBkOTIwMy4uYjUzMGU5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwpAQCAtNSw3ICs1LDcgQEAKICAqCiAgKiAgQml0cyB0YWtlbiBmcm9tIHZhcmlvdXMgcGxhY2VzLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RlYnVnLlMgYi9hcmNoL2FybS9rZXJuZWwvZGVidWcuUwppbmRleCAwZjg1MmQwLi4yMDRlMjE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGVidWcuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZGVidWcuUwpAQCAtMjIsNyArMjIsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0lDRURDQykKIAkJQEAgZGVidWcgdXNpbmcgQVJNIEVtYmVkZGVkSUNFIERDQyBjaGFubmVsCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQkuZW5kbQogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1Y2KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVjZLKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVjcpCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKIAkJLm1hY3JvCWFkZHJ1YXJ0X2N1cnJlbnQsIHJ4LCB0bXAxLCB0bXAyCi0JCWFkZHJ1YXJ0CVx0bXAxLCBcdG1wMgorCQlhZGRydWFydAlcdG1wMSwgXHRtcDIsIFxyeAogCQltcmMJCXAxNSwgMCwgXHJ4LCBjMSwgYzAKIAkJdHN0CQlccngsICMxCiAJCW1vdmVxCQlccngsIFx0bXAxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwppbmRleCAxYTMzZTlkLi5iZWU3ZjlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKQEAgLTksNyArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VsZi5jIGIvYXJjaC9hcm0va2VybmVsL2VsZi5jCmluZGV4IDliMDVjNmEuLmRkYmE0MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbGYuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZWxmLmMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9ldG0uYyBiL2FyY2gvYXJtL2tlcm5lbC9ldG0uYwppbmRleCAxYmVjOGI1Li4zNmQyMGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZXRtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2V0bS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jb3Jlc2lnaHQuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKaW5kZXggMjM5NzAzZC4uNTY2YzU0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCkBAIC05OSw3ICs5OSw3IEBACiAJc3ViCXI0LCByMywgcjQJCQlAIChQSFlTX09GRlNFVCAtIFBBR0VfT0ZGU0VUKQogCWFkZAlyOCwgcjgsIHI0CQkJQCBQSFlTX09GRlNFVAogI2Vsc2UKLQlsZHIJcjgsID1QTEFUX1BIWVNfT0ZGU0VUCisJbGRyCXI4LCA9UEhZU19PRkZTRVQJCUAgYWx3YXlzIGNvbnN0YW50IGluIHRoaXMgY2FzZQogI2VuZGlmCiAKIAkvKgpAQCAtMjM4LDcgKzIzOCw3IEBACiAJICogVGhpcyBhbGxvd3MgZGVidWcgbWVzc2FnZXMgdG8gYmUgb3V0cHV0CiAJICogdmlhIGEgc2VyaWFsIGNvbnNvbGUgYmVmb3JlIHBhZ2luZ19pbml0LgogCSAqLwotCWFkZHJ1YXJ0IHI3LCByMworCWFkZHJ1YXJ0IHI3LCByMywgcjAKIAogCW1vdglyMywgcjMsIGxzciAjU0VDVElPTl9TSElGVAogCW1vdglyMywgcjMsIGxzbCAjUE1EX09SREVSCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCBhOTI3Y2ExLi44MTRhNTJhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCkBAIC00NSw3ICs0NSw2IEBACiAKIC8qIE51bWJlciBvZiBCUlAvV1JQIHJlZ2lzdGVycyBvbiB0aGlzIENQVS4gKi8KIHN0YXRpYyBpbnQgY29yZV9udW1fYnJwczsKLXN0YXRpYyBpbnQgY29yZV9udW1fcmVzZXJ2ZWRfYnJwczsKIHN0YXRpYyBpbnQgY29yZV9udW1fd3JwczsKIAogLyogRGVidWcgYXJjaGl0ZWN0dXJlIHZlcnNpb24uICovCkBAIC0xMzcsMTAgKzEzNiwxMSBAQAogCXUzMiBkaWRyOwogCiAJLyogRG8gd2UgaW1wbGVtZW50IHRoZSBleHRlbmRlZCBDUFVJRCBpbnRlcmZhY2U/ICovCi0JaWYgKFdBUk5fT05DRSgoKChyZWFkX2NwdWlkX2lkKCkgPj4gMTYpICYgMHhmKSAhPSAweGYpLAotCSAgICAiQ1BVSUQgZmVhdHVyZSByZWdpc3RlcnMgbm90IHN1cHBvcnRlZC4gIgotCSAgICAiQXNzdW1pbmcgdjYgZGVidWcgaXMgcHJlc2VudC5cbiIpKQorCWlmICgoKHJlYWRfY3B1aWRfaWQoKSA+PiAxNikgJiAweGYpICE9IDB4ZikgeworCQlwcl93YXJuaW5nKCJDUFVJRCBmZWF0dXJlIHJlZ2lzdGVycyBub3Qgc3VwcG9ydGVkLiAiCisJCQkgICAiQXNzdW1pbmcgdjYgZGVidWcgaXMgcHJlc2VudC5cbiIpOwogCQlyZXR1cm4gQVJNX0RFQlVHX0FSQ0hfVjY7CisJfQogCiAJQVJNX0RCR19SRUFEKGMwLCAwLCBkaWRyKTsKIAlyZXR1cm4gKGRpZHIgPj4gMTYpICYgMHhmOwpAQCAtMTU0LDEwICsxNTQsMjEgQEAKIHN0YXRpYyBpbnQgZGVidWdfYXJjaF9zdXBwb3J0ZWQodm9pZCkKIHsKIAl1OCBhcmNoID0gZ2V0X2RlYnVnX2FyY2goKTsKLQlyZXR1cm4gYXJjaCA+PSBBUk1fREVCVUdfQVJDSF9WNiAmJiBhcmNoIDw9IEFSTV9ERUJVR19BUkNIX1Y3X0VDUDE0OworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgbWVtb3J5LW1hcHBlZCBpbnRlcmZhY2UuICovCisJcmV0dXJuIChhcmNoID49IEFSTV9ERUJVR19BUkNIX1Y2ICYmIGFyY2ggPD0gQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQpIHx8CisJCWFyY2ggPj0gQVJNX0RFQlVHX0FSQ0hfVjdfMTsKIH0KIAotLyogRGV0ZXJtaW5lIG51bWJlciBvZiBCUlAgcmVnaXN0ZXIgYXZhaWxhYmxlLiAqLworLyogRGV0ZXJtaW5lIG51bWJlciBvZiBXUlAgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X251bV93cnBfcmVzb3VyY2VzKHZvaWQpCit7CisJdTMyIGRpZHI7CisJQVJNX0RCR19SRUFEKGMwLCAwLCBkaWRyKTsKKwlyZXR1cm4gKChkaWRyID4+IDI4KSAmIDB4ZikgKyAxOworfQorCisvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIEJSUCByZWdpc3RlcnMgYXZhaWxhYmxlLiAqLwogc3RhdGljIGludCBnZXRfbnVtX2JycF9yZXNvdXJjZXModm9pZCkKIHsKIAl1MzIgZGlkcjsKQEAgLTE3Niw5ICsxODcsMTAgQEAKIHN0YXRpYyBpbnQgZ2V0X251bV93cnBzKHZvaWQpCiB7CiAJLyoKLQkgKiBGSVhNRTogV2hlbiBhIHdhdGNocG9pbnQgZmlyZXMsIHRoZSBvbmx5IHdheSB0byB3b3JrIG91dCB3aGljaAotCSAqIHdhdGNocG9pbnQgaXQgd2FzIGlzIGJ5IGRpc2Fzc2VtYmxpbmcgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uCi0JICogYW5kIHdvcmtpbmcgb3V0IHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYWNjZXNzLgorCSAqIE9uIGRlYnVnIGFyY2hpdGVjdHVyZXMgcHJpb3IgdG8gNy4xLCB3aGVuIGEgd2F0Y2hwb2ludCBmaXJlcywgdGhlCisJICogb25seSB3YXkgdG8gd29yayBvdXQgd2hpY2ggd2F0Y2hwb2ludCBpdCB3YXMgaXMgYnkgZGlzYXNzZW1ibGluZworCSAqIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiBhbmQgd29ya2luZyBvdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQorCSAqIGFjY2Vzcy4KIAkgKgogCSAqIEZ1cnRoZXJtb3JlLCB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSB3YXRjaHBvaW50IHdhcyBwcmVjaXNlCiAJICogc2luY2UgaW1wcmVjaXNlIHdhdGNocG9pbnRzIHByZXZlbnQgdXMgZnJvbSBjYWxjdWxhdGluZyByZWdpc3RlcgpAQCAtMTkyLDM2ICsyMDQsMTcgQEAKIAkgKiBbdGhlIEFSTSBBUk0gc3RhdGVzIHRoYXQgdGhlIERGQVIgaXMgVU5LTk9XTiwgYnV0IGV4cGVyaWVuY2Ugc2hvd3MKIAkgKiB0aGF0IGl0IGlzIHNldCBvbiBzb21lIGltcGxlbWVudGF0aW9uc10uCiAJICovCisJaWYgKGdldF9kZWJ1Z19hcmNoKCkgPCBBUk1fREVCVUdfQVJDSF9WN18xKQorCQlyZXR1cm4gMTsKIAotI2lmIDAKLQlpbnQgd3JwczsKLQl1MzIgZGlkcjsKLQlBUk1fREJHX1JFQUQoYzAsIDAsIGRpZHIpOwotCXdycHMgPSAoKGRpZHIgPj4gMjgpICYgMHhmKSArIDE7Ci0jZW5kaWYKLQlpbnQgd3JwcyA9IDE7Ci0KLQlpZiAoY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpICYmIHdycHMgPj0gZ2V0X251bV9icnBfcmVzb3VyY2VzKCkpCi0JCXdycHMgPSBnZXRfbnVtX2JycF9yZXNvdXJjZXMoKSAtIDE7Ci0KLQlyZXR1cm4gd3JwczsKLX0KLQotLyogV2UgcmVzZXJ2ZSBvbmUgYnJlYWtwb2ludCBmb3IgZWFjaCB3YXRjaHBvaW50LiAqLwotc3RhdGljIGludCBnZXRfbnVtX3Jlc2VydmVkX2JycHModm9pZCkKLXsKLQlpZiAoY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpKQotCQlyZXR1cm4gZ2V0X251bV93cnBzKCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGdldF9udW1fd3JwX3Jlc291cmNlcygpOwogfQogCiAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIHVzYWJsZSBCUlBzIGF2YWlsYWJsZS4gKi8KIHN0YXRpYyBpbnQgZ2V0X251bV9icnBzKHZvaWQpCiB7CiAJaW50IGJycHMgPSBnZXRfbnVtX2JycF9yZXNvdXJjZXMoKTsKLQlpZiAoY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpKQotCQlicnBzIC09IGdldF9udW1fcmVzZXJ2ZWRfYnJwcygpOwotCXJldHVybiBicnBzOworCXJldHVybiBjb3JlX2hhc19taXNtYXRjaF9icnBzKCkgPyBicnBzIC0gMSA6IGJycHM7CiB9CiAKIC8qCkBAIC0yMzksNyArMjMyLDcgQEAKIAogCS8qIEVuc3VyZSB0aGF0IGhhbHRpbmcgbW9kZSBpcyBkaXNhYmxlZC4gKi8KIAlpZiAoV0FSTl9PTkNFKGRzY3IgJiBBUk1fRFNDUl9IREJHRU4sCi0JCQkiaGFsdGluZyBkZWJ1ZyBtb2RlIGVuYWJsZWQuIFVuYWJsZSB0byBhY2Nlc3MgaGFyZHdhcmUgcmVzb3VyY2VzLlxuIikpIHsKKwkJImhhbHRpbmcgZGVidWcgbW9kZSBlbmFibGVkLiBVbmFibGUgdG8gYWNjZXNzIGhhcmR3YXJlIHJlc291cmNlcy5cbiIpKSB7CiAJCXJldCA9IC1FUEVSTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjU1LDYgKzI0OCw3IEBACiAJCUFSTV9EQkdfV1JJVEUoYzEsIDAsIChkc2NyIHwgQVJNX0RTQ1JfTURCR0VOKSk7CiAJCWJyZWFrOwogCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQ6CisJY2FzZSBBUk1fREVCVUdfQVJDSF9WN18xOgogCQlBUk1fREJHX1dSSVRFKGMyLCAyLCAoZHNjciB8IEFSTV9EU0NSX01EQkdFTikpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzQ2LDI0ICszNDAsMTAgQEAKIAkJdmFsX2Jhc2UgPSBBUk1fQkFTRV9CVlI7CiAJCXNsb3RzID0gKHN0cnVjdCBwZXJmX2V2ZW50ICoqKV9fZ2V0X2NwdV92YXIoYnBfb25fcmVnKTsKIAkJbWF4X3Nsb3RzID0gY29yZV9udW1fYnJwczsKLQkJaWYgKGluZm8tPnN0ZXBfY3RybC5lbmFibGVkKSB7Ci0JCQkvKiBPdmVycmlkZSB0aGUgYnJlYWtwb2ludCBkYXRhIHdpdGggdGhlIHN0ZXAgZGF0YS4gKi8KLQkJCWFkZHIgPSBpbmZvLT50cmlnZ2VyICYgfjB4MzsKLQkJCWN0cmwgPSBlbmNvZGVfY3RybF9yZWcoaW5mby0+c3RlcF9jdHJsKTsKLQkJfQogCX0gZWxzZSB7CiAJCS8qIFdhdGNocG9pbnQgKi8KLQkJaWYgKGluZm8tPnN0ZXBfY3RybC5lbmFibGVkKSB7Ci0JCQkvKiBJbnN0YWxsIGludG8gdGhlIHJlc2VydmVkIGJyZWFrcG9pbnQgcmVnaW9uLiAqLwotCQkJY3RybF9iYXNlID0gQVJNX0JBU0VfQkNSICsgY29yZV9udW1fYnJwczsKLQkJCXZhbF9iYXNlID0gQVJNX0JBU0VfQlZSICsgY29yZV9udW1fYnJwczsKLQkJCS8qIE92ZXJyaWRlIHRoZSB3YXRjaHBvaW50IGRhdGEgd2l0aCB0aGUgc3RlcCBkYXRhLiAqLwotCQkJYWRkciA9IGluZm8tPnRyaWdnZXIgJiB+MHgzOwotCQkJY3RybCA9IGVuY29kZV9jdHJsX3JlZyhpbmZvLT5zdGVwX2N0cmwpOwotCQl9IGVsc2UgewotCQkJY3RybF9iYXNlID0gQVJNX0JBU0VfV0NSOwotCQkJdmFsX2Jhc2UgPSBBUk1fQkFTRV9XVlI7Ci0JCX0KKwkJY3RybF9iYXNlID0gQVJNX0JBU0VfV0NSOworCQl2YWxfYmFzZSA9IEFSTV9CQVNFX1dWUjsKIAkJc2xvdHMgPSAoc3RydWN0IHBlcmZfZXZlbnQgKiopX19nZXRfY3B1X3Zhcih3cF9vbl9yZWcpOwogCQltYXhfc2xvdHMgPSBjb3JlX251bV93cnBzOwogCX0KQEAgLTM4Miw2ICszNjIsMTcgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyogT3ZlcnJpZGUgdGhlIGJyZWFrcG9pbnQgZGF0YSB3aXRoIHRoZSBzdGVwIGRhdGEuICovCisJaWYgKGluZm8tPnN0ZXBfY3RybC5lbmFibGVkKSB7CisJCWFkZHIgPSBpbmZvLT50cmlnZ2VyICYgfjB4MzsKKwkJY3RybCA9IGVuY29kZV9jdHJsX3JlZyhpbmZvLT5zdGVwX2N0cmwpOworCQlpZiAoaW5mby0+Y3RybC50eXBlICE9IEFSTV9CUkVBS1BPSU5UX0VYRUNVVEUpIHsKKwkJCWkgPSAwOworCQkJY3RybF9iYXNlID0gQVJNX0JBU0VfQkNSICsgY29yZV9udW1fYnJwczsKKwkJCXZhbF9iYXNlID0gQVJNX0JBU0VfQlZSICsgY29yZV9udW1fYnJwczsKKwkJfQorCX0KKwogCS8qIFNldHVwIHRoZSBhZGRyZXNzIHJlZ2lzdGVyLiAqLwogCXdyaXRlX3diX3JlZyh2YWxfYmFzZSArIGksIGFkZHIpOwogCkBAIC00MDUsMTAgKzM5Niw3IEBACiAJCW1heF9zbG90cyA9IGNvcmVfbnVtX2JycHM7CiAJfSBlbHNlIHsKIAkJLyogV2F0Y2hwb2ludCAqLwotCQlpZiAoaW5mby0+c3RlcF9jdHJsLmVuYWJsZWQpCi0JCQliYXNlID0gQVJNX0JBU0VfQkNSICsgY29yZV9udW1fYnJwczsKLQkJZWxzZQotCQkJYmFzZSA9IEFSTV9CQVNFX1dDUjsKKwkJYmFzZSA9IEFSTV9CQVNFX1dDUjsKIAkJc2xvdHMgPSAoc3RydWN0IHBlcmZfZXZlbnQgKiopX19nZXRfY3B1X3Zhcih3cF9vbl9yZWcpOwogCQltYXhfc2xvdHMgPSBjb3JlX251bV93cnBzOwogCX0KQEAgLTQyNiw2ICs0MTQsMTMgQEAKIAlpZiAoV0FSTl9PTkNFKGkgPT0gbWF4X3Nsb3RzLCAiQ2FuJ3QgZmluZCBhbnkgYnJlYWtwb2ludCBzbG90XG4iKSkKIAkJcmV0dXJuOwogCisJLyogRW5zdXJlIHRoYXQgd2UgZGlzYWJsZSB0aGUgbWlzbWF0Y2ggYnJlYWtwb2ludC4gKi8KKwlpZiAoaW5mby0+Y3RybC50eXBlICE9IEFSTV9CUkVBS1BPSU5UX0VYRUNVVEUgJiYKKwkgICAgaW5mby0+c3RlcF9jdHJsLmVuYWJsZWQpIHsKKwkJaSA9IDA7CisJCWJhc2UgPSBBUk1fQkFTRV9CQ1IgKyBjb3JlX251bV9icnBzOworCX0KKwogCS8qIFJlc2V0IHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLwogCXdyaXRlX3diX3JlZyhiYXNlICsgaSwgMCk7CiB9CkBAIC02MzIsMTAgKzYyNyw5IEBACiAJICogd2UgY2FuIHVzZSB0aGUgbWlzbWF0Y2ggZmVhdHVyZSBhcyBhIHBvb3ItbWFuJ3MgaGFyZHdhcmUKIAkgKiBzaW5nbGUtc3RlcCwgYnV0IHRoaXMgb25seSB3b3JrcyBmb3IgcGVyLXRhc2sgYnJlYWtwb2ludHMuCiAJICovCi0JaWYgKFdBUk5fT05DRSghYnAtPm92ZXJmbG93X2hhbmRsZXIgJiYKLQkJKGFyY2hfY2hlY2tfYnBfaW5fa2VybmVsc3BhY2UoYnApIHx8ICFjb3JlX2hhc19taXNtYXRjaF9icnBzKCkKLQkJIHx8ICFicC0+aHcuYnBfdGFyZ2V0KSwKLQkJCSJvdmVyZmxvdyBoYW5kbGVyIHJlcXVpcmVkIGJ1dCBub25lIGZvdW5kXG4iKSkgeworCWlmICghYnAtPm92ZXJmbG93X2hhbmRsZXIgJiYgKGFyY2hfY2hlY2tfYnBfaW5fa2VybmVsc3BhY2UoYnApIHx8CisJICAgICFjb3JlX2hhc19taXNtYXRjaF9icnBzKCkgfHwgIWJwLT5ody5icF90YXJnZXQpKSB7CisJCXByX3dhcm5pbmcoIm92ZXJmbG93IGhhbmRsZXIgcmVxdWlyZWQgYnV0IG5vbmUgZm91bmRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KIG91dDoKQEAgLTY2NiwzNCArNjYwLDYyIEBACiAJYXJjaF9pbnN0YWxsX2h3X2JyZWFrcG9pbnQoYnApOwogfQogCi1zdGF0aWMgdm9pZCB3YXRjaHBvaW50X2hhbmRsZXIodW5zaWduZWQgbG9uZyB1bmtub3duLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHdhdGNocG9pbnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGk7CisJaW50IGksIGFjY2VzczsKKwl1MzIgdmFsLCBjdHJsX3JlZywgYWxpZ25tZW50X21hc2s7CiAJc3RydWN0IHBlcmZfZXZlbnQgKndwLCAqKnNsb3RzOwogCXN0cnVjdCBhcmNoX2h3X2JyZWFrcG9pbnQgKmluZm87CisJc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludF9jdHJsIGN0cmw7CiAKIAlzbG90cyA9IChzdHJ1Y3QgcGVyZl9ldmVudCAqKilfX2dldF9jcHVfdmFyKHdwX29uX3JlZyk7CiAKLQkvKiBXaXRob3V0IGEgZGlzYXNzZW1ibGVyLCB3ZSBjYW4gb25seSBoYW5kbGUgMSB3YXRjaHBvaW50LiAqLwotCUJVR19PTihjb3JlX251bV93cnBzID4gMSk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgY29yZV9udW1fd3JwczsgKytpKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAogCQl3cCA9IHNsb3RzW2ldOwogCi0JCWlmICh3cCA9PSBOVUxMKSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCWNvbnRpbnVlOworCQlpZiAod3AgPT0gTlVMTCkKKwkJCWdvdG8gdW5sb2NrOworCisJCWluZm8gPSBjb3VudGVyX2FyY2hfYnAod3ApOworCQkvKgorCQkgKiBUaGUgREZBUiBpcyBhbiB1bmtub3duIHZhbHVlIG9uIGRlYnVnIGFyY2hpdGVjdHVyZXMgcHJpb3IKKwkJICogdG8gNy4xLiBTaW5jZSB3ZSBvbmx5IGFsbG93IGEgc2luZ2xlIHdhdGNocG9pbnQgb24gdGhlc2UKKwkJICogb2xkZXIgQ1BVcywgd2UgY2FuIHNldCB0aGUgdHJpZ2dlciB0byB0aGUgbG93ZXN0IHBvc3NpYmxlCisJCSAqIGZhdWx0aW5nIGFkZHJlc3MuCisJCSAqLworCQlpZiAoZGVidWdfYXJjaCA8IEFSTV9ERUJVR19BUkNIX1Y3XzEpIHsKKwkJCUJVR19PTihpID4gMCk7CisJCQlpbmZvLT50cmlnZ2VyID0gd3AtPmF0dHIuYnBfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbmZvLT5jdHJsLmxlbiA9PSBBUk1fQlJFQUtQT0lOVF9MRU5fOCkKKwkJCQlhbGlnbm1lbnRfbWFzayA9IDB4NzsKKwkJCWVsc2UKKwkJCQlhbGlnbm1lbnRfbWFzayA9IDB4MzsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHdhdGNocG9pbnQgdmFsdWUgbWF0Y2hlcy4gKi8KKwkJCXZhbCA9IHJlYWRfd2JfcmVnKEFSTV9CQVNFX1dWUiArIGkpOworCQkJaWYgKHZhbCAhPSAoYWRkciAmIH5hbGlnbm1lbnRfbWFzaykpCisJCQkJZ290byB1bmxvY2s7CisKKwkJCS8qIFBvc3NpYmxlIG1hdGNoLCBjaGVjayB0aGUgYnl0ZSBhZGRyZXNzIHNlbGVjdC4gKi8KKwkJCWN0cmxfcmVnID0gcmVhZF93Yl9yZWcoQVJNX0JBU0VfV0NSICsgaSk7CisJCQlkZWNvZGVfY3RybF9yZWcoY3RybF9yZWcsICZjdHJsKTsKKwkJCWlmICghKCgxIDw8IChhZGRyICYgYWxpZ25tZW50X21hc2spKSAmIGN0cmwubGVuKSkKKwkJCQlnb3RvIHVubG9jazsKKworCQkJLyogQ2hlY2sgdGhhdCB0aGUgYWNjZXNzIHR5cGUgbWF0Y2hlcy4gKi8KKwkJCWFjY2VzcyA9IChmc3IgJiBBUk1fRlNSX0FDQ0VTU19NQVNLKSA/IEhXX0JSRUFLUE9JTlRfVyA6CisJCQkJIEhXX0JSRUFLUE9JTlRfUjsKKwkJCWlmICghKGFjY2VzcyAmIGh3X2JyZWFrcG9pbnRfdHlwZSh3cCkpKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQkvKiBXZSBoYXZlIGEgd2lubmVyLiAqLworCQkJaW5mby0+dHJpZ2dlciA9IGFkZHI7CiAJCX0KIAotCQkvKgotCQkgKiBUaGUgREZBUiBpcyBhbiB1bmtub3duIHZhbHVlLiBTaW5jZSB3ZSBvbmx5IGFsbG93IGEKLQkJICogc2luZ2xlIHdhdGNocG9pbnQsIHdlIGNhbiBzZXQgdGhlIHRyaWdnZXIgdG8gdGhlIGxvd2VzdAotCQkgKiBwb3NzaWJsZSBmYXVsdGluZyBhZGRyZXNzLgotCQkgKi8KLQkJaW5mbyA9IGNvdW50ZXJfYXJjaF9icCh3cCk7Ci0JCWluZm8tPnRyaWdnZXIgPSB3cC0+YXR0ci5icF9hZGRyOwogCQlwcl9kZWJ1Zygid2F0Y2hwb2ludCBmaXJlZDogYWRkcmVzcyA9IDB4JXhcbiIsIGluZm8tPnRyaWdnZXIpOwogCQlwZXJmX2JwX2V2ZW50KHdwLCByZWdzKTsKIApAQCAtNzA1LDYgKzcyNyw3IEBACiAJCWlmICghd3AtPm92ZXJmbG93X2hhbmRsZXIpCiAJCQllbmFibGVfc2luZ2xlX3N0ZXAod3AsIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykpOwogCit1bmxvY2s6CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIH0KQEAgLTcxNyw3ICs3NDAsNyBAQAogCiAJc2xvdHMgPSAoc3RydWN0IHBlcmZfZXZlbnQgKiopX19nZXRfY3B1X3Zhcih3cF9vbl9yZWcpOwogCi0JZm9yIChpID0gMDsgaSA8IGNvcmVfbnVtX3Jlc2VydmVkX2JycHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBjb3JlX251bV93cnBzOyArK2kpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwogCiAJCXdwID0gc2xvdHNbaV07CkBAIC04MjAsNyArODQzLDcgQEAKIAljYXNlIEFSTV9FTlRSWV9BU1lOQ19XQVRDSFBPSU5UOgogCQlXQVJOKDEsICJBc3luY2hyb25vdXMgd2F0Y2hwb2ludCBleGNlcHRpb24gdGFrZW4uIERlYnVnZ2luZyByZXN1bHRzIG1heSBiZSB1bnJlbGlhYmxlXG4iKTsKIAljYXNlIEFSTV9FTlRSWV9TWU5DX1dBVENIUE9JTlQ6Ci0JCXdhdGNocG9pbnRfaGFuZGxlcihhZGRyLCByZWdzKTsKKwkJd2F0Y2hwb2ludF9oYW5kbGVyKGFkZHIsIGZzciwgcmVncyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IDE7IC8qIFVuaGFuZGxlZCBmYXVsdC4gKi8KQEAgLTgzNCwxMSArODU3LDMxIEBACiAvKgogICogT25lLXRpbWUgaW5pdGlhbGlzYXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIHJlc2V0X2N0cmxfcmVncyh2b2lkICppbmZvKQorc3RhdGljIGNwdW1hc2tfdCBkZWJ1Z19lcnJfbWFzazsKKworc3RhdGljIGludCBkZWJ1Z19yZWdfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQogewotCWludCBpLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXByX3dhcm5pbmcoIkRlYnVnIHJlZ2lzdGVyIGFjY2VzcyAoMHgleCkgY2F1c2VkIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiBvbiBDUFUgJWRcbiIsCisJCSAgIGluc3RyLCBjcHUpOworCisJLyogU2V0IHRoZSBlcnJvciBmbGFnIGZvciB0aGlzIENQVSBhbmQgc2tpcCB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24uICovCisJY3B1bWFza19zZXRfY3B1KGNwdSwgJmRlYnVnX2Vycl9tYXNrKTsKKwlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICs9IDQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdW5kZWZfaG9vayBkZWJ1Z19yZWdfaG9vayA9IHsKKwkuaW5zdHJfbWFzawk9IDB4MGZlODBmMTAsCisJLmluc3RyX3ZhbAk9IDB4MGUwMDBlMTAsCisJLmZuCQk9IGRlYnVnX3JlZ190cmFwLAorfTsKKworc3RhdGljIHZvaWQgcmVzZXRfY3RybF9yZWdzKHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgaSwgcmF3X251bV9icnBzLCBlcnIgPSAwLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdTMyIGRiZ19wb3dlcjsKLQljcHVtYXNrX3QgKmNwdW1hc2sgPSBpbmZvOwogCiAJLyoKIAkgKiB2NyBkZWJ1ZyBjb250YWlucyBzYXZlIGFuZCByZXN0b3JlIHJlZ2lzdGVycyBzbyB0aGF0IGRlYnVnIHN0YXRlCkBAIC04NDgsMzggKzg5MSw1NyBAQAogCSAqIEFjY2VzcyBSZWdpc3RlciB0byBhdm9pZCB0YWtpbmcgdW5kZWZpbmVkIGluc3RydWN0aW9uIGV4Y2VwdGlvbnMKIAkgKiBsYXRlciBvbi4KIAkgKi8KLQlpZiAoZGVidWdfYXJjaCA+PSBBUk1fREVCVUdfQVJDSF9WN19FQ1AxNCkgeworCXN3aXRjaCAoZGVidWdfYXJjaCkgeworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjY6CisJY2FzZSBBUk1fREVCVUdfQVJDSF9WNl8xOgorCQkvKiBBUk12NiBjb3JlcyBqdXN0IG5lZWQgdG8gcmVzZXQgdGhlIHJlZ2lzdGVycy4gKi8KKwkJZ290byByZXNldF9yZWdzOworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjdfRUNQMTQ6CiAJCS8qCiAJCSAqIEVuc3VyZSBzdGlja3kgcG93ZXItZG93biBpcyBjbGVhciAoaS5lLiBkZWJ1ZyBsb2dpYyBpcwogCQkgKiBwb3dlcmVkIHVwKS4KIAkJICovCiAJCWFzbSB2b2xhdGlsZSgibXJjIHAxNCwgMCwgJTAsIGMxLCBjNSwgNCIgOiAiPXIiIChkYmdfcG93ZXIpKTsKLQkJaWYgKChkYmdfcG93ZXIgJiAweDEpID09IDApIHsKLQkJCXByX3dhcm5pbmcoIkNQVSAlZCBkZWJ1ZyBpcyBwb3dlcmVkIGRvd24hXG4iLCBjcHUpOwotCQkJY3B1bWFza19vcihjcHVtYXNrLCBjcHVtYXNrLCBjcHVtYXNrX29mKGNwdSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KKwkJaWYgKChkYmdfcG93ZXIgJiAweDEpID09IDApCisJCQllcnIgPSAtRVBFUk07CisJCWJyZWFrOworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjdfMToKIAkJLyoKLQkJICogVW5jb25kaXRpb25hbGx5IGNsZWFyIHRoZSBsb2NrIGJ5IHdyaXRpbmcgYSB2YWx1ZQotCQkgKiBvdGhlciB0aGFuIDB4QzVBQ0NFNTUgdG8gdGhlIGFjY2VzcyByZWdpc3Rlci4KKwkJICogRW5zdXJlIHRoZSBPUyBkb3VibGUgbG9jayBpcyBjbGVhci4KIAkJICovCi0JCWFzbSB2b2xhdGlsZSgibWNyIHAxNCwgMCwgJTAsIGMxLCBjMCwgNCIgOiA6ICJyIiAoMCkpOwotCQlpc2IoKTsKLQotCQkvKgotCQkgKiBDbGVhciBhbnkgY29uZmlndXJlZCB2ZWN0b3ItY2F0Y2ggZXZlbnRzIGJlZm9yZQotCQkgKiBlbmFibGluZyBtb25pdG9yIG1vZGUuCi0JCSAqLwotCQlhc20gdm9sYXRpbGUoIm1jciBwMTQsIDAsICUwLCBjMCwgYzcsIDAiIDogOiAiciIgKDApKTsKLQkJaXNiKCk7CisJCWFzbSB2b2xhdGlsZSgibXJjIHAxNCwgMCwgJTAsIGMxLCBjMywgNCIgOiAiPXIiIChkYmdfcG93ZXIpKTsKKwkJaWYgKChkYmdfcG93ZXIgJiAweDEpID09IDEpCisJCQllcnIgPSAtRVBFUk07CisJCWJyZWFrOwogCX0KIAorCWlmIChlcnIpIHsKKwkJcHJfd2FybmluZygiQ1BVICVkIGRlYnVnIGlzIHBvd2VyZWQgZG93biFcbiIsIGNwdSk7CisJCWNwdW1hc2tfb3IoJmRlYnVnX2Vycl9tYXNrLCAmZGVidWdfZXJyX21hc2ssIGNwdW1hc2tfb2YoY3B1KSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFVuY29uZGl0aW9uYWxseSBjbGVhciB0aGUgbG9jayBieSB3cml0aW5nIGEgdmFsdWUKKwkgKiBvdGhlciB0aGFuIDB4QzVBQ0NFNTUgdG8gdGhlIGFjY2VzcyByZWdpc3Rlci4KKwkgKi8KKwlhc20gdm9sYXRpbGUoIm1jciBwMTQsIDAsICUwLCBjMSwgYzAsIDQiIDogOiAiciIgKDApKTsKKwlpc2IoKTsKKworCS8qCisJICogQ2xlYXIgYW55IGNvbmZpZ3VyZWQgdmVjdG9yLWNhdGNoIGV2ZW50cyBiZWZvcmUKKwkgKiBlbmFibGluZyBtb25pdG9yIG1vZGUuCisJICovCisJYXNtIHZvbGF0aWxlKCJtY3IgcDE0LCAwLCAlMCwgYzAsIGM3LCAwIiA6IDogInIiICgwKSk7CisJaXNiKCk7CisKK3Jlc2V0X3JlZ3M6CiAJaWYgKGVuYWJsZV9tb25pdG9yX21vZGUoKSkKIAkJcmV0dXJuOwogCiAJLyogV2UgbXVzdCBhbHNvIHJlc2V0IGFueSByZXNlcnZlZCByZWdpc3RlcnMuICovCi0JZm9yIChpID0gMDsgaSA8IGNvcmVfbnVtX2JycHMgKyBjb3JlX251bV9yZXNlcnZlZF9icnBzOyArK2kpIHsKKwlyYXdfbnVtX2JycHMgPSBnZXRfbnVtX2JycF9yZXNvdXJjZXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmF3X251bV9icnBzOyArK2kpIHsKIAkJd3JpdGVfd2JfcmVnKEFSTV9CQVNFX0JDUiArIGksIDBVTCk7CiAJCXdyaXRlX3diX3JlZyhBUk1fQkFTRV9CVlIgKyBpLCAwVUwpOwogCX0KQEAgLTg5NSw2ICs5NTcsNyBAQAogewogCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSkKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKChpbnQpY3B1LCByZXNldF9jdHJsX3JlZ3MsIE5VTEwsIDEpOworCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIApAQCAtOTA1LDcgKzk2OCw2IEBACiBzdGF0aWMgaW50IF9faW5pdCBhcmNoX2h3X2JyZWFrcG9pbnRfaW5pdCh2b2lkKQogewogCXUzMiBkc2NyOwotCWNwdW1hc2tfdCBjcHVtYXNrID0geyBDUFVfQklUU19OT05FIH07CiAKIAlkZWJ1Z19hcmNoID0gZ2V0X2RlYnVnX2FyY2goKTsKIApAQCAtOTE2LDI4ICs5NzgsMzEgQEAKIAogCS8qIERldGVybWluZSBob3cgbWFueSBCUlBzL1dSUHMgYXJlIGF2YWlsYWJsZS4gKi8KIAljb3JlX251bV9icnBzID0gZ2V0X251bV9icnBzKCk7Ci0JY29yZV9udW1fcmVzZXJ2ZWRfYnJwcyA9IGdldF9udW1fcmVzZXJ2ZWRfYnJwcygpOwogCWNvcmVfbnVtX3dycHMgPSBnZXRfbnVtX3dycHMoKTsKIAotCXByX2luZm8oImZvdW5kICVkIGJyZWFrcG9pbnQgYW5kICVkIHdhdGNocG9pbnQgcmVnaXN0ZXJzLlxuIiwKLQkJY29yZV9udW1fYnJwcyArIGNvcmVfbnVtX3Jlc2VydmVkX2JycHMsIGNvcmVfbnVtX3dycHMpOwotCi0JaWYgKGNvcmVfbnVtX3Jlc2VydmVkX2JycHMpCi0JCXByX2luZm8oIiVkIGJyZWFrcG9pbnQocykgcmVzZXJ2ZWQgZm9yIHdhdGNocG9pbnQgIgotCQkJCSJzaW5nbGUtc3RlcC5cbiIsIGNvcmVfbnVtX3Jlc2VydmVkX2JycHMpOworCS8qCisJICogV2UgbmVlZCB0byB0cmVhZCBjYXJlZnVsbHkgaGVyZSBiZWNhdXNlIERCR1NXRU5BQkxFIG1heSBiZQorCSAqIGRyaXZlbiBsb3cgb24gdGhpcyBjb3JlIGFuZCB0aGVyZSBpc24ndCBhbiBhcmNoaXRlY3RlZCB3YXkgdG8KKwkgKiBkZXRlcm1pbmUgdGhhdC4KKwkgKi8KKwlyZWdpc3Rlcl91bmRlZl9ob29rKCZkZWJ1Z19yZWdfaG9vayk7CiAKIAkvKgogCSAqIFJlc2V0IHRoZSBicmVha3BvaW50IHJlc291cmNlcy4gV2UgYXNzdW1lIHRoYXQgYSBoYWx0aW5nCiAJICogZGVidWdnZXIgd2lsbCBsZWF2ZSB0aGUgd29ybGQgaW4gYSBuaWNlIHN0YXRlIGZvciB1cy4KIAkgKi8KLQlvbl9lYWNoX2NwdShyZXNldF9jdHJsX3JlZ3MsICZjcHVtYXNrLCAxKTsKLQlpZiAoIWNwdW1hc2tfZW1wdHkoJmNwdW1hc2spKSB7CisJb25fZWFjaF9jcHUocmVzZXRfY3RybF9yZWdzLCBOVUxMLCAxKTsKKwl1bnJlZ2lzdGVyX3VuZGVmX2hvb2soJmRlYnVnX3JlZ19ob29rKTsKKwlpZiAoIWNwdW1hc2tfZW1wdHkoJmRlYnVnX2Vycl9tYXNrKSkgewogCQljb3JlX251bV9icnBzID0gMDsKLQkJY29yZV9udW1fcmVzZXJ2ZWRfYnJwcyA9IDA7CiAJCWNvcmVfbnVtX3dycHMgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKKwlwcl9pbmZvKCJmb3VuZCAlZCAiICIlcyIgImJyZWFrcG9pbnQgYW5kICVkIHdhdGNocG9pbnQgcmVnaXN0ZXJzLlxuIiwKKwkJY29yZV9udW1fYnJwcywgY29yZV9oYXNfbWlzbWF0Y2hfYnJwcygpID8gIigrMSByZXNlcnZlZCkgIiA6CisJCSIiLCBjb3JlX251bV93cnBzKTsKKwogCUFSTV9EQkdfUkVBRChjMSwgMCwgZHNjcik7CiAJaWYgKGRzY3IgJiBBUk1fRFNDUl9IREJHRU4pIHsKIAkJbWF4X3dhdGNocG9pbnRfbGVuID0gNDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pby5jIGIvYXJjaC9hcm0va2VybmVsL2lvLmMKaW5kZXggZjQ0NzAzMC4uZGNkNWI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lvLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2lvLmMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKaW5kZXggNTM5MTliMi4uM2VmZDgyYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtMjIsNyArMjIsNiBAQAogICogIE5hdHVyYWxseSBpdCdzIG5vdCBhIDE6MSByZWxhdGlvbiwgYnV0IHRoZXJlIGFyZSBzaW1pbGFyaXRpZXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNTksOSArNTgsNiBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlzaG93X2lwaV9saXN0KHAsIHByZWMpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotCXNob3dfbG9jYWxfaXJxcyhwLCBwcmVjKTsKLSNlbmRpZgogCXNlcV9wcmludGYocCwgIiUqczogJTEwbHVcbiIsIHByZWMsICJFcnIiLCBpcnFfZXJyX2NvdW50KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLWFybS5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtYXJtLmMKaW5kZXggNzkyMDNlZS4uOWZlODkxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtYXJtLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtYXJtLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImtwcm9iZXMuaCIKIApAQCAtOTcxLDYgKzk3Miw5IEBACiAKIAlERUNPREVfRU5ECiB9OworI2lmZGVmIENPTkZJR19BUk1fS1BST0JFU19URVNUX01PRFVMRQorRVhQT1JUX1NZTUJPTF9HUEwoa3Byb2JlX2RlY29kZV9hcm1fdGFibGUpOworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBhcm1fc2luZ2xlc3RlcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtYXJtLmMgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODJkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LWFybS5jCkBAIC0wLDAgKzEsMTMyMyBAQAorLyoKKyAqIGFyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtYXJtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSm9uIE1lZGh1cnN0IDx0aXh5QHl4aXQuY28udWs+LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAia3Byb2Jlcy10ZXN0LmgiCisKKworI2RlZmluZSBURVNUX0lTQSAiMzIiCisKKyNkZWZpbmUgVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1IoY29kZTEsIHJlZywgdmFsLCBjb2RlMikJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcsIHZhbCkJCQkJCVwKKwlURVNUX0FSR19SRUcoMTQsIDk5ZikJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJIjUwOglub3AJCQlcblx0IgkJCVwKKwkiMToJImNvZGUxICNyZWcgY29kZTIiCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIudGh1bWIJCQkJXG5cdCIJCQlcCisJIjM6CWFkcglsciwgMmYJCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIuYXJtCQkJCVxuXHQiCQkJXAorCSIyOglub3AJCQlcblx0IgkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0FSTV9UT19USFVNQl9JTlRFUldPUktfUChjb2RlMSwgcmVnLCB2YWwsIGNvZGUyKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZyBjb2RlMikJCQlcCisJVEVTVF9BUkdfUFRSKHJlZywgdmFsKQkJCQkJXAorCVRFU1RfQVJHX1JFRygxNCwgOTlmKQkJCQkJXAorCVRFU1RfQVJHX01FTSgxNSwgM2YrMSkJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJIjUwOglub3AJCQlcblx0IgkJCVwKKwkiMToJImNvZGUxICNyZWcgY29kZTIiCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIudGh1bWIJCQkJXG5cdCIJCQlcCisJIjM6CWFkcglsciwgMmYJCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIuYXJtCQkJCVxuXHQiCQkJXAorCSIyOglub3AJCQlcblx0IgkJCVwKKwlURVNUQ0FTRV9FTkQKKworCit2b2lkIGtwcm9iZV9hcm1fdGVzdF9jYXNlcyh2b2lkKQoreworCWtwcm9iZV90ZXN0X2ZsYWdzID0gMDsKKworCVRFU1RfR1JPVVAoIkRhdGEtcHJvY2Vzc2luZyAocmVnaXN0ZXIpLCAocmVnaXN0ZXItc2hpZnRlZCByZWdpc3RlciksIChpbW1lZGlhdGUpIikKKworI2RlZmluZSBfREFUQV9QUk9DRVNTSU5HX0ROTShvcCxzLHZhbCkJCQkJCQlcCisJVEVTVF9SUiggIG9wICJlcSIgcyAiCXIwLCAgciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIiKQkJXAorCVRFU1RfUlIoICBvcCAibmUiIHMgIglyMSwgIHIiLDEsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc2wgIzMiKQlcCisJVEVTVF9SUiggIG9wICJjcyIgcyAiCXIyLCAgciIsMywgVkFMMSwiLCByIiwyLCB2YWwsICIsIGxzciAjNCIpCVwKKwlURVNUX1JSKCAgb3AgImNjIiBzICIJcjMsICByIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgYXNyICM1IikJXAorCVRFU1RfUlIoICBvcCAibWkiIHMgIglyNCwgIHIiLDUsIFZBTDEsIiwgciIsMiwgTih2YWwpLCIsIGFzciAjNiIpCVwKKwlURVNUX1JSKCAgb3AgInBsIiBzICIJcjUsICByIiw1LCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgcm9yICM3IikJXAorCVRFU1RfUlIoICBvcCAidnMiIHMgIglyNiwgIHIiLDcsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBycngiKQkJXAorCVRFU1RfUiggICBvcCAidmMiIHMgIglyNiwgIHIiLDcsIFZBTDEsIiwgcGMsIGxzbCAjMyIpCQkJXAorCVRFU1RfUiggICBvcCAidmMiIHMgIglyNiwgIHIiLDcsIFZBTDEsIiwgc3AsIGxzciAjNCIpCQkJXAorCVRFU1RfUiggICBvcCAidmMiIHMgIglyNiwgIHBjLCByIiw3LCBWQUwxLCIsIGFzciAjNSIpCQkJXAorCVRFU1RfUiggICBvcCAidmMiIHMgIglyNiwgIHNwLCByIiw3LCBWQUwxLCIsIHJvciAjNiIpCQkJXAorCVRFU1RfUlJSKCBvcCAiaGkiIHMgIglyOCwgIHIiLDksIFZBTDEsIiwgciIsMTQsdmFsLCAiLCBsc2wgciIsMCwgMywiIilcCisJVEVTVF9SUlIoIG9wICJscyIgcyAiCXI5LCAgciIsOSwgVkFMMSwiLCByIiwxNCx2YWwsICIsIGxzciByIiw3LCA0LCIiKVwKKwlURVNUX1JSUiggb3AgImdlIiBzICIJcjEwLCByIiwxMSxWQUwxLCIsIHIiLDE0LHZhbCwgIiwgYXNyIHIiLDcsIDUsIiIpXAorCVRFU1RfUlJSKCBvcCAibHQiIHMgIglyMTEsIHIiLDExLFZBTDEsIiwgciIsMTQsTih2YWwpLCIsIGFzciByIiw3LCA2LCIiKVwKKwlURVNUX1JSKCAgb3AgImd0IiBzICIJcjEyLCByMTMiICAgICAgICIsIHIiLDE0LHZhbCwgIiwgcm9yIHIiLDE0LDcsIiIpXAorCVRFU1RfUlIoICBvcCAibGUiIHMgIglyMTQsIHIiLDAsIHZhbCwgIiwgcjEzIiAgICAgICAiLCBsc2wgciIsMTQsOCwiIilcCisJVEVTVF9SUiggIG9wIHMgIglyMTIsIHBjIiAgICAgICAgIiwgciIsMTQsdmFsLCAiLCByb3IgciIsMTQsNywiIilcCisJVEVTVF9SUiggIG9wIHMgIglyMTQsIHIiLDAsIHZhbCwgIiwgcGMiICAgICAgICAiLCBsc2wgciIsMTQsOCwiIilcCisJVEVTVF9SKCAgIG9wICJlcSIgcyAiCXIwLCAgciIsMTEsVkFMMSwiLCAjMHhmNSIpCQkJXAorCVRFU1RfUiggICBvcCAibmUiIHMgIglyMTEsIHIiLDAsIFZBTDEsIiwgIzB4ZjUwMDAwMDAiKQkJXAorCVRFU1RfUiggICBvcCBzICIJcjcsICByIiw4LCBWQUwyLCIsICMweDAwMGFmMDAwIikJCVwKKwlURVNUKCAgICAgb3AgcyAiCXI0LCAgcGMiICAgICAgICAiLCAjMHgwMDAwNWEwMCIpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HX0ROTShvcCx2YWwpCQlcCisJX0RBVEFfUFJPQ0VTU0lOR19ETk0ob3AsIiIsdmFsKQkJXAorCV9EQVRBX1BST0NFU1NJTkdfRE5NKG9wLCJzIix2YWwpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HX05NKG9wLHZhbCkJCQkJCQlcCisJVEVTVF9SUiggIG9wICJuZQlyIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiIpCQkJXAorCVRFU1RfUlIoICBvcCAiZXEJciIsMSwgVkFMMSwiLCByIiwyLCB2YWwsICIsIGxzbCAjMyIpCQlcCisJVEVTVF9SUiggIG9wICJjYwlyIiwzLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgbHNyICM0IikJCVwKKwlURVNUX1JSKCAgb3AgImNzCXIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBhc3IgIzUiKQkJXAorCVRFU1RfUlIoICBvcCAicGwJciIsNSwgVkFMMSwiLCByIiwyLCBOKHZhbCksIiwgYXNyICM2IikJCVwKKwlURVNUX1JSKCAgb3AgIm1pCXIiLDUsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCByb3IgIzciKQkJXAorCVRFU1RfUlIoICBvcCAidmMJciIsNywgVkFMMSwiLCByIiwyLCB2YWwsICIsIHJyeCIpCQlcCisJVEVTVF9SICggIG9wICJ2cwlyIiw3LCBWQUwxLCIsIHBjLCBsc2wgIzMiKQkJCVwKKwlURVNUX1IgKCAgb3AgInZzCXIiLDcsIFZBTDEsIiwgc3AsIGxzciAjNCIpCQkJXAorCVRFU1RfUiggICBvcCAidnMJcGMsIHIiLDcsIFZBTDEsIiwgYXNyICM1IikJCQlcCisJVEVTVF9SKCAgIG9wICJ2cwlzcCwgciIsNywgVkFMMSwiLCByb3IgIzYiKQkJCVwKKwlURVNUX1JSUiggb3AgImxzCXIiLDksIFZBTDEsIiwgciIsMTQsdmFsLCAiLCBsc2wgciIsMCwgMywiIikJXAorCVRFU1RfUlJSKCBvcCAiaGkJciIsOSwgVkFMMSwiLCByIiwxNCx2YWwsICIsIGxzciByIiw3LCA0LCIiKQlcCisJVEVTVF9SUlIoIG9wICJsdAlyIiwxMSxWQUwxLCIsIHIiLDE0LHZhbCwgIiwgYXNyIHIiLDcsIDUsIiIpCVwKKwlURVNUX1JSUiggb3AgImdlCXIiLDExLFZBTDEsIiwgciIsMTQsTih2YWwpLCIsIGFzciByIiw3LCA2LCIiKQlcCisJVEVTVF9SUiggIG9wICJsZQlyMTMiICAgICAgICIsIHIiLDE0LHZhbCwgIiwgcm9yIHIiLDE0LDcsIiIpCVwKKwlURVNUX1JSKCAgb3AgImd0CXIiLDAsIHZhbCwgIiwgcjEzIiAgICAgICAiLCBsc2wgciIsMTQsOCwiIikJXAorCVRFU1RfUlIoICBvcCAiCXBjIiAgICAgICAgIiwgciIsMTQsdmFsLCAiLCByb3IgciIsMTQsNywiIikJCVwKKwlURVNUX1JSKCAgb3AgIglyIiwwLCB2YWwsICIsIHBjIiAgICAgICAgIiwgbHNsIHIiLDE0LDgsIiIpCQlcCisJVEVTVF9SKCAgIG9wICJlcQlyIiwxMSxWQUwxLCIsICMweGY1IikJCQkJXAorCVRFU1RfUiggICBvcCAibmUJciIsMCwgVkFMMSwiLCAjMHhmNTAwMDAwMCIpCQkJXAorCVRFU1RfUiggICBvcCAiCXIiLDgsIFZBTDIsIiwgIzB4MDAwYWYwMDAiKQorCisjZGVmaW5lIF9EQVRBX1BST0NFU1NJTkdfRE0ob3Ascyx2YWwpCQkJCQlcCisJVEVTVF9SKCAgIG9wICJlcSIgcyAiCXIwLCAgciIsMSwgdmFsLCAiIikJCQlcCisJVEVTVF9SKCAgIG9wICJuZSIgcyAiCXIxLCAgciIsMSwgdmFsLCAiLCBsc2wgIzMiKQkJXAorCVRFU1RfUiggICBvcCAiY3MiIHMgIglyMiwgIHIiLDMsIHZhbCwgIiwgbHNyICM0IikJCVwKKwlURVNUX1IoICAgb3AgImNjIiBzICIJcjMsICByIiwzLCB2YWwsICIsIGFzciAjNSIpCQlcCisJVEVTVF9SKCAgIG9wICJtaSIgcyAiCXI0LCAgciIsNSwgTih2YWwpLCIsIGFzciAjNiIpCQlcCisJVEVTVF9SKCAgIG9wICJwbCIgcyAiCXI1LCAgciIsNSwgdmFsLCAiLCByb3IgIzciKQkJXAorCVRFU1RfUiggICBvcCAidnMiIHMgIglyNiwgIHIiLDEwLHZhbCwgIiwgcnJ4IikJCVwKKwlURVNUKCAgICAgb3AgInZzIiBzICIJcjcsICBwYywgbHNsICMzIikJCQlcCisJVEVTVCggICAgIG9wICJ2cyIgcyAiCXI3LCAgc3AsIGxzciAjNCIpCQkJXAorCVRFU1RfUlIoICBvcCAidmMiIHMgIglyOCwgIHIiLDcsIHZhbCwgIiwgbHNsIHIiLDAsIDMsIiIpCVwKKwlURVNUX1JSKCAgb3AgImhpIiBzICIJcjksICByIiw5LCB2YWwsICIsIGxzciByIiw3LCA0LCIiKQlcCisJVEVTVF9SUiggIG9wICJscyIgcyAiCXIxMCwgciIsOSwgdmFsLCAiLCBhc3IgciIsNywgNSwiIikJXAorCVRFU1RfUlIoICBvcCAiZ2UiIHMgIglyMTEsIHIiLDExLE4odmFsKSwiLCBhc3IgciIsNywgNiwiIikJXAorCVRFU1RfUlIoICBvcCAibHQiIHMgIglyMTIsIHIiLDExLHZhbCwgIiwgcm9yIHIiLDE0LDcsIiIpCVwKKwlURVNUX1IoICAgb3AgImd0IiBzICIJcjE0LCByMTMiICAgICAgICIsIGxzbCByIiwxNCw4LCIiKQlcCisJVEVTVF9SKCAgIG9wICJsZSIgcyAiCXIxNCwgcGMiICAgICAgICAiLCBsc2wgciIsMTQsOCwiIikJXAorCVRFU1QoICAgICBvcCAiZXEiIHMgIglyMCwgICMweGY1IikJCQkJXAorCVRFU1QoICAgICBvcCAibmUiIHMgIglyMTEsICMweGY1MDAwMDAwIikJCQlcCisJVEVTVCggICAgIG9wIHMgIglyNywgICMweDAwMGFmMDAwIikJCQlcCisJVEVTVCggICAgIG9wIHMgIglyNCwgICMweDAwMDA1YTAwIikKKworI2RlZmluZSBEQVRBX1BST0NFU1NJTkdfRE0ob3AsdmFsKQkJXAorCV9EQVRBX1BST0NFU1NJTkdfRE0ob3AsIiIsdmFsKQkJXAorCV9EQVRBX1BST0NFU1NJTkdfRE0ob3AsInMiLHZhbCkKKworCURBVEFfUFJPQ0VTU0lOR19ETk0oImFuZCIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJlb3IiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgic3ViIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oInJzYiIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJhZGQiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgiYWRjIixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oInNiYyIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkdfRE5NKCJyc2MiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX05NKCJ0c3QiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HX05NKCJ0ZXEiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HX05NKCJjbXAiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX05NKCJjbW4iLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HX0ROTSgib3JyIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lOR19ETSgibW92IixWQUwyKQorCURBVEFfUFJPQ0VTU0lOR19ETk0oImJpYyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkdfRE0oIm12biIsVkFMMikKKworCVRFU1QoIm1vdglpcCwgc3AiKSAvKiBUaGlzIGhhcyBzcGVjaWFsIGNhc2UgZW11bGF0aW9uIGNvZGUgKi8KKworCVRFU1RfU1VQUE9SVEVEKCJtb3YJcGMsICMweDEwMDAiKTsKKwlURVNUX1NVUFBPUlRFRCgibW92CXNwLCAjMHgxMDAwIik7CisJVEVTVF9TVVBQT1JURUQoImNtcAlwYywgIzB4MTAwMCIpOworCVRFU1RfU1VQUE9SVEVEKCJjbXAJc3AsICMweDEwMDAiKTsKKworCS8qIERhdGEtcHJvY2Vzc2luZyB3aXRoIFBDIGFzIHNoaWZ0Ki8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNWMwZjFlCUAgY21wCXIxMiwgcjE0LCBhc2wgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFhMGNmMWUJQCBtb3YJcjEyLCByMTQsIGFzbCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDhjYWYxZQlAIGFkZAlyMTAsIHIxMiwgcjE0LCBhc2wgcGMiKQorCisJLyogRGF0YS1wcm9jZXNzaW5nIHdpdGggUEMgYXMgc2hpZnQqLworCVRFU1RfVU5TVVBQT1JURUQoIm1vdnMJcGMsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtb3ZzCXBjLCByMSwgbHNsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtb3ZzCXBjLCAjMHgxMDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiYWRkcwlwYywgbHIsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCJhZGRzCXBjLCBsciwgcjEsIGxzbCByMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiYWRkcwlwYywgbHIsICM0IikKKworCS8qIERhdGEtcHJvY2Vzc2luZyB3aXRoIFNQIGFzIHRhcmdldCAqLworCVRFU1QoImFkZAlzcCwgc3AsICMxNiIpCisJVEVTVCgic3ViCXNwLCBzcCwgIzgiKQorCVRFU1QoImJpYwlzcCwgc3AsICMweDIwIikKKwlURVNUKCJvcnIJc3AsIHNwLCAjMHgyMCIpCisJVEVTVF9QUiggImFkZAlzcCwgciIsMTAsMCwiLCByIiwxMSw0LCIiKQorCVRFU1RfUFJSKCJhZGQJc3AsIHIiLDEwLDAsIiwgciIsMTEsNCwiLCBhc2wgciIsMTIsMSwiIikKKwlURVNUX1AoICAibW92CXNwLCByIiwxMCwwLCIiKQorCVRFU1RfUFIoICJtb3YJc3AsIHIiLDEwLDAsIiwgYXNsIHIiLDEyLDAsIiIpCisKKwkvKiBEYXRhLXByb2Nlc3Npbmcgd2l0aCBQQyBhcyB0YXJnZXQgKi8KKwlURVNUX0JGKCAgICJhZGQJcGMsIHBjLCAjMmYtMWItOCIpCisJVEVTVF9CRl9SICgiYWRkCXBjLCBwYywgciIsMTQsMmYtMWYtOCwiIikKKwlURVNUX0JGX1IgKCJhZGQJcGMsIHIiLDE0LDJmLTFmLTgsIiwgcGMiKQorCVRFU1RfQkZfUiAoIm1vdglwYywgciIsMCwyZiwiIikKKwlURVNUX0JGX1JSKCJtb3YJcGMsIHIiLDAsMmYsIiwgYXNsIHIiLDEsMCwiIikKKwlURVNUX0JCKCAgICJzdWIJcGMsIHBjLCAjMWItMmIrOCIpCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX0JCKCAgICJzdWIJcGMsIHBjLCAjMWItMmIrOC0yIikgLyogVU5QUkVESUNUQUJMRSBiZWZvcmUgQVJNdjYgKi8KKyNlbmRpZgorCVRFU1RfQkJfUiggInN1YglwYywgcGMsIHIiLDE0LCAxZi0yZis4LCIiKQorCVRFU1RfQkJfUiggInJzYglwYywgciIsMTQsMWYtMmYrOCwiLCBwYyIpCisJVEVTVF9SUiggICAiYWRkCXBjLCBwYywgciIsMTAsLTIsIiwgYXNsIHIiLDExLDEsIiIpCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlURVNUX0FSTV9UT19USFVNQl9JTlRFUldPUktfUigiYWRkCXBjLCBwYywgciIsMCwzZi0xZi04KzEsIiIpCisJVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1IoInN1YglwYywgciIsMCwzZis4KzEsIiwgIzgiKQorI2VuZGlmCisJVEVTVF9HUk9VUCgiTWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMiKQorCisJVEVTVCgibXJzCXIwLCBjcHNyIikKKwlURVNUKCJtcnNwbAlyNywgY3BzciIpCisJVEVTVCgibXJzCXIxNCwgY3BzciIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTBmZjAwMAlAIG1ycyByMTUsIGNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1ycwlyMCwgc3BzciIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXJzCWxyLCBzcHNyIikKKworCVRFU1RfVU5TVVBQT1JURUQoIm1zcgljcHNyLCByMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCWNwc3JfZiwgbHIiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1zcglzcHNyLCByMCIpCisKKwlURVNUX0JGX1IoImJ4CXIiLDAsMmYsIiIpCisJVEVTVF9CQl9SKCJieAlyIiw3LDJmLCIiKQorCVRFU1RfQkZfUigiYnhlcQlyIiwxNCwyZiwiIikKKworCVRFU1RfUigiY2x6CXIwLCByIiwwLCAweDAsIiIpCisJVEVTVF9SKCJjbHplcQlyNywgciIsMTQsMHgxLCIiKQorCVRFU1RfUigiY2x6CWxyLCByIiw3LCAweGZmZmZmZmZmLCIiKQorCVRFU1QoICAiY2x6CXI0LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgwMTZmZmYxMAlAIGNseiBwYywgcjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4MDE2ZjBmMWYJQCBjbHogcjAsIHBjIikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9VTlNVUFBPUlRFRCgiYnhqCXIwIikKKyNlbmRpZgorCisJVEVTVF9CRl9SKCJibHgJciIsMCwyZiwiIikKKwlURVNUX0JCX1IoImJseAlyIiw3LDJmLCIiKQorCVRFU1RfQkZfUigiYmx4ZXEJciIsMTQsMmYsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgwMTIwMDAzZglAIGJseCBwYyIpCisKKwlURVNUX1JSKCAgICJxYWRkCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAicWFkZHZzCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisJVEVTVF9SKCAgICAicWFkZAlsciwgciIsOSwgVkFMMiwiLCByMTMiKQorCVRFU1RfUlIoICAgInFzdWIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICJxc3VidnMJbHIsIHIiLDksIFZBTDIsIiwgciIsOCwgVkFMMSwiIikKKwlURVNUX1IoICAgICJxc3ViCWxyLCByIiw5LCBWQUwyLCIsIHIxMyIpCisJVEVTVF9SUiggICAicWRhZGQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICJxZGFkZHZzCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisJVEVTVF9SKCAgICAicWRhZGQJbHIsIHIiLDksIFZBTDIsIiwgcjEzIikKKwlURVNUX1JSKCAgICJxZHN1YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgInFkc3VidnMJbHIsIHIiLDksIFZBTDIsIiwgciIsOCwgVkFMMSwiIikKKwlURVNUX1IoICAgICJxZHN1YglsciwgciIsOSwgVkFMMiwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwMWYwNTAJQCBxYWRkIHBjLCByMCwgcjEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyMWYwNTAJQCBxc3ViIHBjLCByMCwgcjEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MWYwNTAJQCBxZGFkZCBwYywgcjAsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNjFmMDUwCUAgcWRzdWIgcGMsIHIwLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTZmMjA1MAlAIHFkc3ViIHIyLCByMCwgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2MTIwNWYJQCBxZHN1YiByMiwgcGMsIHIxIikKKworCVRFU1RfVU5TVVBQT1JURUQoImJrcHQJMHhmZmZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCJia3B0CTB4MDAwMCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNjAwMDcwIEAgc21jICMwIikKKworCVRFU1RfR1JPVVAoIkhhbGZ3b3JkIG11bHRpcGx5IGFuZCBtdWx0aXBseS1hY2N1bXVsYXRlIikKKworCVRFU1RfUlJSKCAgICAic21sYWJiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgICJzbWxhYmJnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAic21sYWJiCWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMGYzMjgxIEAgc21sYWJiIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1JSUiggICAgInNtbGF0YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAic21sYXRiZ2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAgInNtbGF0YglsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTBmMzJhMSBAIHNtbGF0YiBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9SUlIoICAgICJzbWxhYnQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAgInNtbGFidGdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgICJzbWxhYnQJbHIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwZjMyYzEgQCBzbWxhYnQgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfUlJSKCAgICAic21sYXR0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgICJzbWxhdHRnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAic21sYXR0CWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMGYzMmUxIEAgc21sYXR0IHBjLCByMSwgcjIsIHIzIikKKworCVRFU1RfUlJSKCAgICAic21sYXdiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgICJzbWxhd2JnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICAic21sYXdiCWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMmYzMjgxIEAgc21sYXdiIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1JSUiggICAgInNtbGF3dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAic21sYXd0Z2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAgInNtbGF3dAlsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTJmMzJjMSBAIHNtbGF3dCBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTIwMzJjZiBAIHNtbGF3dCByMCwgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTIwM2ZjMSBAIHNtbGF3dCByMCwgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTIwZjJjMSBAIHNtbGF3dCByMCwgcjEsIHIyLCBwYyIpCisKKwlURVNUX1JSKCAgICAic211bHdiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWx3YmdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInNtdWx3YglsciwgciIsMSwgVkFMMiwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEyZjAyYTEgQCBzbXVsd2IgcGMsIHIxLCByMiIpCisJVEVTVF9SUiggICAgInNtdWx3dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsd3RnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzbXVsd3QJbHIsIHIiLDEsIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMmYwMmUxIEAgc211bHd0IHBjLCByMSwgcjIiKQorCisJVEVTVF9SUlJSKCAgInNtbGFsYmIJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICAic21sYWxiYmxlCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlIoICAgInNtbGFsYmIJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNGYxMzgyIEAgc21sYWxiYiBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTQxZjM4MiBAIHNtbGFsYmIgcjEsIHBjLCByMiwgcjMiKQorCVRFU1RfUlJSUiggICJzbWxhbHRiCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAgInNtbGFsdGJsZQlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSKCAgICJzbWxhbHRiCXIiLDE0LFZBTDMsIiwgciIsNywgVkFMNCwiLCByIiw1LCBWQUwxLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTRmMTNhMiBAIHNtbGFsdGIgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MWYzYTIgQCBzbWxhbHRiIHIxLCBwYywgcjIsIHIzIikKKwlURVNUX1JSUlIoICAic21sYWxidAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJzbWxhbGJ0bGUJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAic21sYWxidAlyIiwxNCxWQUwzLCIsIHIiLDcsIFZBTDQsIiwgciIsNSwgVkFMMSwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0ZjEzYzIgQCBzbWxhbGJ0IHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNDFmM2MyIEAgc21sYWxidCByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUlJSKCAgInNtbGFsdHQJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICAic21sYWx0dGxlCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlIoICAgInNtbGFsdHQJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNGYxM2UyIEAgc21sYWxiYiBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTQwZjNlMiBAIHNtbGFsYmIgcjAsIHBjLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE0MDEzZWYgQCBzbWxhbGJiIHIwLCByMSwgcGMsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNDAxZmUyIEAgc21sYWxiYiByMCwgcjEsIHIyLCBwYyIpCisKKwlURVNUX1JSKCAgICAic211bGJiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWxiYmdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInNtdWxiYglsciwgciIsMSwgVkFMMiwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2ZjAyODEgQCBzbXVsYmIgcGMsIHIxLCByMiIpCisJVEVTVF9SUiggICAgInNtdWx0YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsdGJnZQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzbXVsdGIJbHIsIHIiLDEsIFZBTDIsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNmYwMmExIEAgc211bHRiIHBjLCByMSwgcjIiKQorCVRFU1RfUlIoICAgICJzbXVsYnQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bGJ0Z2UJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKwlURVNUX1IoICAgICAic211bGJ0CWxyLCByIiwxLCBWQUwyLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTZmMDJjMSBAIHNtdWx0YiBwYywgcjEsIHIyIikKKwlURVNUX1JSKCAgICAic211bHR0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWx0dGdlCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInNtdWx0dAlsciwgciIsMSwgVkFMMiwiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTE2ZjAyZTEgQCBzbXVsdHQgcGMsIHIxLCByMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTYwMDJlZiBAIHNtdWx0dCByMCwgcGMsIHIyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxNjAwZmUxIEAgc211bHR0IHIwLCByMSwgcGMiKQorCisJVEVTVF9HUk9VUCgiTXVsdGlwbHkgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUiKQorCisJVEVTVF9SUiggICAgIm11bAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJtdWxscwlyNywgciIsOCwgVkFMMiwiLCByIiw5LCBWQUwyLCIiKQorCVRFU1RfUiggICAgICJtdWwJbHIsIHIiLDQsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwMGYwMjkxIEAgbXVsIHBjLCByMSwgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTAwMDAyOWYgQCBtdWwgcjAsIHBjLCByMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDAwMGY5MSBAIG11bCByMCwgcjEsIHBjIikKKwlURVNUX1JSKCAgICAibXVscwlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJtdWxsc3MJcjcsIHIiLDgsIFZBTDIsIiwgciIsOSwgVkFMMiwiIikKKwlURVNUX1IoICAgICAibXVscwlsciwgciIsNCwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTAxZjAyOTEgQCBtdWxzIHBjLCByMSwgcjIiKQorCisJVEVTVF9SUlIoICAgICJtbGEJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAgIm1sYWhpCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgICJtbGEJbHIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTAyZjMyOTEgQCBtbGEgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfUlJSKCAgICAibWxhcwlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICAibWxhaGlzCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgICJtbGFzCWxyLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwM2YzMjkxIEAgbWxhcyBwYywgcjEsIHIyLCByMyIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfUlIoICAidW1hYWwJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICJ1bWFhbGxzCXI3LCByOCwgciIsOSwgVkFMMiwiLCByIiwxMCwgVkFMMSwiIikKKwlURVNUX1IoICAgInVtYWFsCWxyLCByMTIsIHIiLDExLFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwNDFmMzkyIEAgdW1hYWwgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA0ZjAzOTIgQCB1bWFhbCByMCwgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDUwMDA5MCBAIHVuZGVmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwNWZmZjlmIEAgdW5kZWYiKQorCisJVEVTVF9SUlIoICAibWxzCQlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgIm1sc2hpCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUiggICAibWxzCQlsciwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDZmMzI5MSBAIG1scyBwYywgcjEsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDYwMzI5ZiBAIG1scyByMCwgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDYwM2Y5MSBAIG1scyByMCwgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDYwZjI5MSBAIG1scyByMCwgcjEsIHIyLCBwYyIpCisjZW5kaWYKKworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA3MDAwOTAgQCB1bmRlZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDdmZmY5ZiBAIHVuZGVmIikKKworCVRFU1RfUlIoICAidW11bGwJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICJ1bXVsbGxzCXI3LCByOCwgciIsOSwgVkFMMiwiLCByIiwxMCwgVkFMMSwiIikKKwlURVNUX1IoICAgInVtdWxsCWxyLCByMTIsIHIiLDExLFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwODFmMzkyIEAgdW11bGwgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA4ZjEzOTIgQCB1bXVsbCByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUiggICJ1bXVsbHMJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICJ1bXVsbGxzcwlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisJVEVTVF9SKCAgICJ1bXVsbHMJbHIsIHIxMiwgciIsMTEsVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA5MWYzOTIgQCB1bXVsbHMgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTA5ZjEzOTIgQCB1bXVsbHMgcjEsIHBjLCByMiwgcjMiKQorCisJVEVTVF9SUlJSKCAgInVtbGFsCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAgInVtbGFsbGUJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAidW1sYWwJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwYWYxMzkyIEAgdW1sYWwgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBhMWYzOTIgQCB1bWxhbCByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUlJSKCAgInVtbGFscwlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJ1bWxhbGxlcwlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSKCAgICJ1bWxhbHMJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwYmYxMzkyIEAgdW1sYWxzIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwYjFmMzkyIEAgdW1sYWxzIHIxLCBwYywgcjIsIHIzIikKKworCVRFU1RfUlIoICAic211bGwJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICJzbXVsbGxzCXI3LCByOCwgciIsOSwgVkFMMiwiLCByIiwxMCwgVkFMMSwiIikKKwlURVNUX1IoICAgInNtdWxsCWxyLCByMTIsIHIiLDExLFZBTDMsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwYzFmMzkyIEAgc211bGwgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBjZjEzOTIgQCBzbXVsbCByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUiggICJzbXVsbHMJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICJzbXVsbGxzcwlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisJVEVTVF9SKCAgICJzbXVsbHMJbHIsIHIxMiwgciIsMTEsVkFMMywiLCByMTMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBkMWYzOTIgQCBzbXVsbHMgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBkZjEzOTIgQCBzbXVsbHMgcjEsIHBjLCByMiwgcjMiKQorCisJVEVTVF9SUlJSKCAgInNtbGFsCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAgInNtbGFsbGUJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUiggICAic21sYWwJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZWYxMzkyIEAgc21sYWwgcGMsIHIxLCByMiwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBlMWYzOTIgQCBzbWxhbCByMSwgcGMsIHIyLCByMyIpCisJVEVTVF9SUlJSKCAgInNtbGFscwlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggICJzbWxhbGxlcwlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSKCAgICJzbWxhbHMJciIsMTQsVkFMMywiLCByIiw3LCBWQUw0LCIsIHIiLDUsIFZBTDEsIiwgcjEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZmYxMzkyIEAgc21sYWxzIHBjLCByMSwgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZjBmMzkyIEAgc21sYWxzIHIwLCBwYywgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZjAxMzlmIEAgc21sYWxzIHIwLCByMSwgcGMsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwZjAxZjkyIEAgc21sYWxzIHIwLCByMSwgcjIsIHBjIikKKworCVRFU1RfR1JPVVAoIlN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIikKKworCS8qCisJICogVXNlIGhhcmQgY29kZWQgY29uc3RhbnRzIGZvciBTV1AgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIHdhcm5pbmdzCisJICogYWJvdXQgZGVwcmVjYXRlZCBpbnN0cnVjdGlvbnMuCisJICovCisJVEVTVF9SUCggIi53b3JkIDB4ZTEwOGUwOTcgQCBzd3AJbHIsIHIiLDcsVkFMMiwiLCBbciIsOCwwLCJdIikKKwlURVNUX1IoICAiLndvcmQgMHg2MTBkMDA5MSBAIHN3cHZzCXIwLCByIiwxLFZBTDEsIiwgW3NwXSIpCisJVEVTVF9SUCggIi53b3JkIDB4ZTEwY2QwOWUgQCBzd3AJc3AsIHIiLDE0LFZBTDIsIiwgW3IiLDEyLDEzKjQsIl0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTEwMmYwOTEgQCBzd3AgcGMsIHIxLCBbcjJdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxMDIwMDlmIEAgc3dwIHIwLCBwYywgW3IyXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTBmMDA5MSBAIHN3cCByMCwgcjEsIFtwY10iKQorCVRFU1RfUlAoICIud29yZCAweGUxNDhlMDk3IEAgc3dwYglsciwgciIsNyxWQUwyLCIsIFtyIiw4LDAsIl0iKQorCVRFU1RfUiggICIud29yZCAweDYxNGQwMDkxIEAgc3dwdnNiCXIwLCByIiwxLFZBTDEsIiwgW3NwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMTQyZjA5MSBAIHN3cGIgcGMsIHIxLCBbcjJdIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTExMDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTEyMDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTEzMDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTE1MDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTE2MDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkCTB4ZTE3MDAwOTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9VTlNVUFBPUlRFRCgibGRyZXgJcjIsIFtzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmV4ZAlyMCwgcjIsIHIzLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJleGQJcjIsIHIzLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJleGIJcjAsIHIyLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJleGIJcjIsIFtzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cmV4aAlyMCwgcjIsIFtzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmV4aAlyMiwgW3NwXSIpCisjZW5kaWYKKwlURVNUX0dST1VQKCJFeHRyYSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyIpCisKKwlURVNUX1JQUiggICJzdHJoCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDQ4LCIsIC1yIiwyLCAyNCwiXSIpCisJVEVTVF9SUFIoICAic3RyZXFoCXIiLDE0LFZBTDIsIiwgW3IiLDEzLDAsICIsIHIiLDEyLCA0OCwiXSIpCisJVEVTVF9SUFIoICAic3RyaAlyIiwxLCBWQUwxLCIsIFtyIiwyLCAyNCwiLCByIiwzLCAgNDgsIl0hIikKKwlURVNUX1JQUiggICJzdHJuZWgJciIsMTIsVkFMMiwiLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCisJVEVTVF9SUFIoICAic3RyaAlyIiwyLCBWQUwxLCIsIFtyIiwzLCAyNCwiXSwgciIsNCwgNDgsIiIpCisJVEVTVF9SUFIoICAic3RyaAlyIiwxMCxWQUwyLCIsIFtyIiw5LCA0OCwiXSwgLXIiLDExLDI0LCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFhZmMwYmEJQCBzdHJoIHIxMiwgW3BjLCByMTBdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDg5ZjBiYglAIHN0cmggcGMsIFtyOV0sIHIxMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDg5YTBiZglAIHN0cmggcjEwLCBbcjldLCBwYyIpCisKKwlURVNUX1BSKCAgICJsZHJoCXIwLCBbciIsMCwgIDQ4LCIsIC1yIiwyLCAyNCwiXSIpCisJVEVTVF9QUiggICAibGRyY3NoCXIxNCwgW3IiLDEzLDAsICIsIHIiLDEyLCA0OCwiXSIpCisJVEVTVF9QUiggICAibGRyaAlyMSwgW3IiLDIsICAyNCwiLCByIiwzLCAgNDgsIl0hIikKKwlURVNUX1BSKCAgICJsZHJjY2gJcjEyLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCisJVEVTVF9QUiggICAibGRyaAlyMiwgW3IiLDMsICAyNCwiXSwgciIsNCwgNDgsIiIpCisJVEVTVF9QUiggICAibGRyaAlyMTAsIFtyIiw5LCA0OCwiXSwgLXIiLDExLDI0LCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFiZmMwYmEJQCBsZHJoIHIxMiwgW3BjLCByMTBdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDk5ZjBiYglAIGxkcmggcGMsIFtyOV0sIHIxMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDk5YTBiZglAIGxkcmggcjEwLCBbcjldLCBwYyIpCisKKwlURVNUX1JQKCAgICJzdHJoCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICMtMl0iKQorCVRFU1RfUlAoICAgInN0cm1paAlyIiwxNCxWQUwyLCIsIFtyIiwxMywwLCAiLCAjMl0iKQorCVRFU1RfUlAoICAgInN0cmgJciIsMSwgVkFMMSwiLCBbciIsMiwgMjQsIiwgIzRdISIpCisJVEVTVF9SUCggICAic3RycGxoCXIiLDEyLFZBTDIsIiwgW3IiLDExLDI0LCIsICMtNF0hIikKKwlURVNUX1JQKCAgICJzdHJoCXIiLDIsIFZBTDEsIiwgW3IiLDMsIDI0LCJdLCAjNDgiKQorCVRFU1RfUlAoICAgInN0cmgJciIsMTAsVkFMMiwiLCBbciIsOSwgNjQsIl0sICMtNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFlZmMzYjAJQCBzdHJoIHIxMiwgW3BjLCAjNDhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGM5ZjNiMAlAIHN0cmggcGMsIFtyOV0sICM0OCIpCisKKwlURVNUX1AoCSAgICJsZHJoCXIwLCBbciIsMCwgIDI0LCIsICMtMl0iKQorCVRFU1RfUCgJICAgImxkcnZzaAlyMTQsIFtyIiwxMywwLCAiLCAjMl0iKQorCVRFU1RfUCgJICAgImxkcmgJcjEsIFtyIiwyLCAgMjQsIiwgIzRdISIpCisJVEVTVF9QKAkgICAibGRydmNoCXIxMiwgW3IiLDExLDI0LCIsICMtNF0hIikKKwlURVNUX1AoCSAgICJsZHJoCXIyLCBbciIsMywgIDI0LCJdLCAjNDgiKQorCVRFU1RfUCgJICAgImxkcmgJcjEwLCBbciIsOSwgNjQsIl0sICMtNDgiKQorCVRFU1QoICAgICAgImxkcmgJcjAsIFtwYywgIzBdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxZmZjM2IwCUAgbGRyaCByMTIsIFtwYywgIzQ4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTBkOWYzYjAJQCBsZHJoIHBjLCBbcjldLCAjNDgiKQorCisJVEVTVF9QUiggICAibGRyc2IJcjAsIFtyIiwwLCAgNDgsIiwgLXIiLDIsIDI0LCJdIikKKwlURVNUX1BSKCAgICJsZHJoaXNiCXIxNCwgW3IiLDEzLDAsIiwgciIsMTIsICA0OCwiXSIpCisJVEVTVF9QUiggICAibGRyc2IJcjEsIFtyIiwyLCAgMjQsIiwgciIsMywgIDQ4LCJdISIpCisJVEVTVF9QUiggICAibGRybHNzYglyMTIsIFtyIiwxMSw0OCwiLCAtciIsMTAsMjQsIl0hIikKKwlURVNUX1BSKCAgICJsZHJzYglyMiwgW3IiLDMsICAyNCwiXSwgciIsNCwgNDgsIiIpCisJVEVTVF9QUiggICAibGRyc2IJcjEwLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYmZjMGRhCUAgbGRyc2IgcjEyLCBbcGMsIHIxMF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwOTlmMGRiCUAgbGRyc2IgcGMsIFtyOV0sIHIxMSIpCisKKwlURVNUX1AoCSAgICJsZHJzYglyMCwgW3IiLDAsICAyNCwiLCAjLTFdIikKKwlURVNUX1AoCSAgICJsZHJnZXNiCXIxNCwgW3IiLDEzLDAsICIsICMxXSIpCisJVEVTVF9QKAkgICAibGRyc2IJcjEsIFtyIiwyLCAgMjQsIiwgIzRdISIpCisJVEVTVF9QKAkgICAibGRybHRzYglyMTIsIFtyIiwxMSwyNCwiLCAjLTRdISIpCisJVEVTVF9QKAkgICAibGRyc2IJcjIsIFtyIiwzLCAgMjQsIl0sICM0OCIpCisJVEVTVF9QKAkgICAibGRyc2IJcjEwLCBbciIsOSwgNjQsIl0sICMtNDgiKQorCVRFU1QoICAgICAgImxkcnNiCXIwLCBbcGMsICMwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWZmYzNkMAlAIGxkcnNiIHIxMiwgW3BjLCAjNDhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGQ5ZjNkMAlAIGxkcnNiIHBjLCBbcjldLCAjNDgiKQorCisJVEVTVF9QUiggICAibGRyc2gJcjAsIFtyIiwwLCAgNDgsIiwgLXIiLDIsIDI0LCJdIikKKwlURVNUX1BSKCAgICJsZHJndHNoCXIxNCwgW3IiLDEzLDAsICIsIHIiLDEyLCA0OCwiXSIpCisJVEVTVF9QUiggICAibGRyc2gJcjEsIFtyIiwyLCAgMjQsIiwgciIsMywgIDQ4LCJdISIpCisJVEVTVF9QUiggICAibGRybGVzaAlyMTIsIFtyIiwxMSw0OCwiLCAtciIsMTAsMjQsIl0hIikKKwlURVNUX1BSKCAgICJsZHJzaAlyMiwgW3IiLDMsICAyNCwiXSwgciIsNCwgNDgsIiIpCisJVEVTVF9QUiggICAibGRyc2gJcjEwLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUxYmZjMGZhCUAgbGRyc2ggcjEyLCBbcGMsIHIxMF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGUwOTlmMGZiCUAgbGRyc2ggcGMsIFtyOV0sIHIxMSIpCisKKwlURVNUX1AoCSAgICJsZHJzaAlyMCwgW3IiLDAsICAyNCwiLCAjLTFdIikKKwlURVNUX1AoCSAgICJsZHJlcXNoCXIxNCwgW3IiLDEzLDAgLCIsICMxXSIpCisJVEVTVF9QKAkgICAibGRyc2gJcjEsIFtyIiwyLCAgMjQsIiwgIzRdISIpCisJVEVTVF9QKAkgICAibGRybmVzaAlyMTIsIFtyIiwxMSwyNCwiLCAjLTRdISIpCisJVEVTVF9QKAkgICAibGRyc2gJcjIsIFtyIiwzLCAgMjQsIl0sICM0OCIpCisJVEVTVF9QKAkgICAibGRyc2gJcjEwLCBbciIsOSwgNjQsIl0sICMtNDgiKQorCVRFU1QoICAgICAgImxkcnNoCXIwLCBbcGMsICMwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWZmYzNmMAlAIGxkcnNoIHIxMiwgW3BjLCAjNDhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGQ5ZjNmMAlAIGxkcnNoIHBjLCBbcjldLCAjNDgiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJodAlyMSwgW3IyXSwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmh0CXIxLCBbcjJdLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyaHQJcjEsIFtyMl0sICM0OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyaHQJcjEsIFtyMl0sICM0OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyc2J0CXIxLCBbcjJdLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyc2J0CXIxLCBbcjJdLCAjNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcnNodAlyMSwgW3IyXSwgcjMiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcnNodAlyMSwgW3IyXSwgIzQ4IikKKyNlbmRpZgorCisJVEVTVF9SUFIoICAic3RyZAlyIiwwLCBWQUwxLCIsIFtyIiwxLCA0OCwiLCAtciIsMiwyNCwiXSIpCisJVEVTVF9SUFIoICAic3RyY2NkCXIiLDgsIFZBTDIsIiwgW3IiLDEzLDAsICIsIHIiLDEyLDQ4LCJdIikKKwlURVNUX1JQUiggICJzdHJkCXIiLDQsIFZBTDEsIiwgW3IiLDIsIDI0LCIsIHIiLDMsIDQ4LCJdISIpCisJVEVTVF9SUFIoICAic3RyY3NkCXIiLDEyLFZBTDIsIiwgW3IiLDExLDQ4LCIsIC1yIiwxMCwyNCwiXSEiKQorCVRFU1RfUlBSKCAgInN0cmQJciIsMiwgVkFMMSwiLCBbciIsMywgMjQsIl0sIHIiLDQsNDgsIiIpCisJVEVTVF9SUFIoICAic3RyZAlyIiwxMCxWQUwyLCIsIFtyIiw5LCA0OCwiXSwgLXIiLDcsMjQsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWFmYzBmYQlAIHN0cmQgcjEyLCBbcGMsIHIxMF0hIikKKworCVRFU1RfUFIoICAgImxkcmQJcjAsIFtyIiwwLCA0OCwiLCAtciIsMiwyNCwiXSIpCisJVEVTVF9QUiggICAibGRybWlkCXI4LCBbciIsMTMsMCwgIiwgciIsMTIsNDgsIl0iKQorCVRFU1RfUFIoICAgImxkcmQJcjQsIFtyIiwyLCAyNCwiLCByIiwzLCA0OCwiXSEiKQorCVRFU1RfUFIoICAgImxkcnBsZAlyNiwgW3IiLDExLDQ4LCIsIC1yIiwxMCwyNCwiXSEiKQorCVRFU1RfUFIoICAgImxkcmQJcjIsIFtyIiw1LCAyNCwiXSwgciIsNCw0OCwiIikKKwlURVNUX1BSKCAgICJsZHJkCXIxMCwgW3IiLDksNDgsIl0sIC1yIiw3LDI0LCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFhZmMwZGEJQCBsZHJkIHIxMiwgW3BjLCByMTBdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDg5ZjBkYglAIGxkcmQgcGMsIFtyOV0sIHIxMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDg5ZTBkYglAIGxkcmQgbHIsIFtyOV0sIHIxMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMDg5YzBkZglAIGxkcmQgcjEyLCBbcjldLCBwYyIpCisKKwlURVNUX1JQKCAgICJzdHJkCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICMtOF0iKQorCVRFU1RfUlAoICAgInN0cnZzZAlyIiw4LCBWQUwyLCIsIFtyIiwxMywwLCAiLCAjOF0iKQorCVRFU1RfUlAoICAgInN0cmQJciIsNCwgVkFMMSwiLCBbciIsMiwgMjQsIiwgIzE2XSEiKQorCVRFU1RfUlAoICAgInN0cnZjZAlyIiwxMixWQUwyLCIsIFtyIiwxMSwyNCwiLCAjLTE2XSEiKQorCVRFU1RfUlAoICAgInN0cmQJciIsMiwgVkFMMSwiLCBbciIsNCwgMjQsIl0sICM0OCIpCisJVEVTVF9SUCggICAic3RyZAlyIiwxMCxWQUwyLCIsIFtyIiw5LCA2NCwiXSwgIy00OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMWVmYzNmMAlAIHN0cmQgcjEyLCBbcGMsICM0OF0hIikKKworCVRFU1RfUCgJICAgImxkcmQJcjAsIFtyIiwwLCAyNCwiLCAjLThdIikKKwlURVNUX1AoCSAgICJsZHJoaWQJcjgsIFtyIiwxMywwLCAiLCAjOF0iKQorCVRFU1RfUCgJICAgImxkcmQJcjQsIFtyIiwyLCAyNCwiLCAjMTZdISIpCisJVEVTVF9QKAkgICAibGRybHNkCXI2LCBbciIsMTEsMjQsIiwgIy0xNl0hIikKKwlURVNUX1AoCSAgICJsZHJkCXIyLCBbciIsNSwgMjQsIl0sICM0OCIpCisJVEVTVF9QKAkgICAibGRyZAlyMTAsIFtyIiw5LDYsIl0sICMtNDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTFlZmMzZDAJQCBsZHJkIHIxMiwgW3BjLCAjNDhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGM5ZjNkMAlAIGxkcmQgcGMsIFtyOV0sICM0OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlMGM5ZTNkMAlAIGxkcmQgbHIsIFtyOV0sICM0OCIpCisKKwlURVNUX0dST1VQKCJNaXNjZWxsYW5lb3VzIikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA3CisJVEVTVCgibW92dwlyMCwgIzAiKQorCVRFU1QoIm1vdncJcjAsICMweGZmZmYiKQorCVRFU1QoIm1vdncJbHIsICMweGZmZmYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTMwMGYwMDAJQCBtb3Z3IHBjLCAjMCIpCisJVEVTVF9SKCJtb3Z0CXIiLDAsIFZBTDEsIiwgIzAiKQorCVRFU1RfUigibW92dAlyIiwwLCBWQUwyLCIsICMweGZmZmYiKQorCVRFU1RfUigibW92dAlyIiwxNCxWQUwxLCIsICMweGZmZmYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTM0MGYwMDAJQCBtb3Z0IHBjLCAjMCIpCisjZW5kaWYKKworCVRFU1RfVU5TVVBQT1JURUQoIm1zcgljcHNyLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJY3Bzcl9mLCAweGYwMDAwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJc3BzciwgMHgxMyIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCVRFU1RfU1VQUE9SVEVEKCJ5aWVsZCIpCisJVEVTVCgic2V2IikKKwlURVNUKCJub3AiKQorCVRFU1QoIndmaSIpCisJVEVTVF9TVVBQT1JURUQoIndmZSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZGJnICMwIikKKyNlbmRpZgorCisJVEVTVF9HUk9VUCgiTG9hZC9zdG9yZSB3b3JkIGFuZCB1bnNpZ25lZCBieXRlIikKKworI2RlZmluZSBMT0FEX1NUT1JFKGJ5dGUpCQkJCQkJCVwKKwlURVNUX1JQKCAic3RyImJ5dGUiCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICMtMl0iKQkJXAorCVRFU1RfUlAoICJzdHIiYnl0ZSIJciIsMTQsVkFMMiwiLCBbciIsMTMsMCwgIiwgIzJdIikJCVwKKwlURVNUX1JQKCAic3RyImJ5dGUiCXIiLDEsIFZBTDEsIiwgW3IiLDIsIDI0LCIsICM0XSEiKQkJXAorCVRFU1RfUlAoICJzdHIiYnl0ZSIJciIsMTIsVkFMMiwiLCBbciIsMTEsMjQsIiwgIy00XSEiKQkJXAorCVRFU1RfUlAoICJzdHIiYnl0ZSIJciIsMiwgVkFMMSwiLCBbciIsMywgMjQsIl0sICM0OCIpCQlcCisJVEVTVF9SUCggInN0ciJieXRlIglyIiwxMCxWQUwyLCIsIFtyIiw5LCA2NCwiXSwgIy00OCIpCQlcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwwLCBWQUwxLCIsIFtyIiwxLCA0OCwiLCAtciIsMiwgMjQsIl0iKQlcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwxNCxWQUwyLCIsIFtyIiwxMywwLCAiLCByIiwxMiwgNDgsIl0iKQlcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwxLCBWQUwxLCIsIFtyIiwyLCAyNCwiLCByIiwzLCAgNDgsIl0hIikJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMTIsVkFMMiwiLCBbciIsMTEsNDgsIiwgLXIiLDEwLDI0LCJdISIpCVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDIsIFZBTDEsIiwgW3IiLDMsIDI0LCJdLCByIiw0LCA0OCwiIikJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMTAsVkFMMiwiLCBbciIsOSwgNDgsIl0sIC1yIiwxMSwyNCwiIikJXAorCVRFU1RfUlBSKCJzdHIiYnl0ZSIJciIsMCwgVkFMMSwiLCBbciIsMSwgMjQsIiwgciIsMiwgIDMyLCIsIGFzbCAjMV0iKVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDE0LFZBTDIsIiwgW3IiLDEzLDAsICIsIHIiLDEyLCAzMiwiLCBsc3IgIzJdIilcCisJVEVTVF9SUFIoInN0ciJieXRlIglyIiwxLCBWQUwxLCIsIFtyIiwyLCAyNCwiLCByIiwzLCAgMzIsIiwgYXNyICMzXSEiKVwKKwlURVNUX1JQUigic3RyImJ5dGUiCXIiLDEyLFZBTDIsIiwgW3IiLDExLDI0LCIsIHIiLDEwLCA0LCIsIHJvciAjMzFdISIpXAorCVRFU1RfUCggICJsZHIiYnl0ZSIJcjAsIFtyIiwwLCAgMjQsIiwgIy0yXSIpCQkJXAorCVRFU1RfUCggICJsZHIiYnl0ZSIJcjE0LCBbciIsMTMsMCwgIiwgIzJdIikJCQkJXAorCVRFU1RfUCggICJsZHIiYnl0ZSIJcjEsIFtyIiwyLCAgMjQsIiwgIzRdISIpCQkJXAorCVRFU1RfUCggICJsZHIiYnl0ZSIJcjEyLCBbciIsMTEsMjQsIiwgIy00XSEiKQkJCVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIyLCBbciIsMywgIDI0LCJdLCAjNDgiKQkJCVwKKwlURVNUX1AoICAibGRyImJ5dGUiCXIxMCwgW3IiLDksIDY0LCJdLCAjLTQ4IikJCQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMCwgW3IiLDAsICA0OCwiLCAtciIsMiwgMjQsIl0iKQkJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjE0LCBbciIsMTMsMCwgIiwgciIsMTIsIDQ4LCJdIikJCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIxLCBbciIsMiwgIDI0LCIsIHIiLDMsIDQ4LCJdISIpCQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMTIsIFtyIiwxMSw0OCwiLCAtciIsMTAsMjQsIl0hIikJCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIyLCBbciIsMywgIDI0LCJdLCByIiw0LCA0OCwiIikJCQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMTAsIFtyIiw5LCA0OCwiXSwgLXIiLDExLDI0LCIiKQkJXAorCVRFU1RfUFIoICJsZHIiYnl0ZSIJcjAsIFtyIiwwLCAgMjQsIiwgciIsMiwgIDMyLCIsIGFzbCAjMV0iKQlcCisJVEVTVF9QUiggImxkciJieXRlIglyMTQsIFtyIiwxMywwLCAiLCByIiwxMiwgMzIsIiwgbHNyICMyXSIpCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIxLCBbciIsMiwgIDI0LCIsIHIiLDMsICAzMiwiLCBhc3IgIzNdISIpCVwKKwlURVNUX1BSKCAibGRyImJ5dGUiCXIxMiwgW3IiLDExLDI0LCIsIHIiLDEwLCA0LCIsIHJvciAjMzFdISIpCVwKKwlURVNUKCAgICAibGRyImJ5dGUiCXIwLCBbcGMsICMwXSIpCQkJCQlcCisJVEVTVF9SKCAgImxkciJieXRlIglyMTIsIFtwYywgciIsMTQsMCwiXSIpCisKKwlMT0FEX1NUT1JFKCIiKQorCVRFU1RfUCggICAic3RyCXBjLCBbciIsMCwwLCIsICMxNSo0XSIpCisJVEVTVF9SKCAgICJzdHIJcGMsIFtzcCwgciIsMiwxNSo0LCJdIikKKwlURVNUX0JGKCAgImxkcglwYywgW3NwLCAjMTUqNF0iKQorCVRFU1RfQkZfUigibGRyCXBjLCBbc3AsIHIiLDIsMTUqNCwiXSIpCisKKwlURVNUX1AoICAgInN0cglzcCwgW3IiLDAsMCwiLCAjMTMqNF0iKQorCVRFU1RfUiggICAic3RyCXNwLCBbc3AsIHIiLDIsMTMqNCwiXSIpCisJVEVTVF9CRiggICJsZHIJc3AsIFtzcCwgIzEzKjRdIikKKwlURVNUX0JGX1IoImxkcglzcCwgW3NwLCByIiwyLDEzKjQsIl0iKQorCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlURVNUX0FSTV9UT19USFVNQl9JTlRFUldPUktfUCgibGRyCXBjLCBbciIsMCwwLCIsICMxNSo0XSIpCisjZW5kaWYKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU1YWY2MDA4CUAgc3RyIHI2LCBbcGMsICM4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTdhZjYwMDgJQCBzdHIgcjYsIFtwYywgcjhdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNWJmNjAwOAlAIGxkciByNiwgW3BjLCAjOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3YmY2MDA4CUAgbGRyIHI2LCBbcGMsIHI4XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc4ODYwMGYJQCBzdHIgcjYsIFtyOCwgcGNdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3OTg2MDBmCUAgbGRyIHI2LCBbcjgsIHBjXSIpCisKKwlMT0FEX1NUT1JFKCJiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU1ZjdmMDA4CUAgbGRyYiBwYywgW3I3LCAjOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ZjdmMDA4CUAgbGRyYiBwYywgW3I3LCByOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU1ZWY2MDA4CUAgc3RyYiByNiwgW3BjLCAjOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ZWY2MDA4CUAgc3RyYiByNiwgW3BjLCByM10hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU1ZmY2MDA4CUAgbGRyYiByNiwgW3BjLCAjOF0hIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3ZmY2MDA4CUAgbGRyYiByNiwgW3BjLCByM10hIikKKworCVRFU1RfVU5TVVBQT1JURUQoImxkcnQJcjAsIFtyMV0sICM0IikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJ0CXIxLCBbcjJdLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RydAlyMiwgW3IzXSwgIzQiKQorCVRFU1RfVU5TVVBQT1JURUQoInN0cnQJcjMsIFtyNF0sIHI1IikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJidAlyNCwgW3I1XSwgIzQiKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmJ0CXI1LCBbcjZdLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyYnQJcjYsIFtyN10sICM0IikKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHJidAlyNywgW3I4XSwgcjkiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX0dST1VQKCJQYXJhbGxlbCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24sIHNpZ25lZCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MDAwMDEwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MGZmZmZmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKworCVRFU1RfUlIoICAgICJzYWRkMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzYWRkMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxY2ZmMWEJQCBzYWRkMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAic2FzeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNhc3gJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxY2ZmM2EJQCBzYXN4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNzYXgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzc2F4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MWNmZjVhCUAgc3NheAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJzc3ViMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzc3ViMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxY2ZmN2EJQCBzc3ViMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAic2FkZDgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzYWRkOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjFjZmY5YQlAIHNhZGQ4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjEwMDBiMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjFmZmZiZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjEwMDBkMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjFmZmZkZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9SUiggICAgInNzdWI4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3N1YjgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYxY2ZmZmEJQCBzc3ViOAlwYywgcjEyLCByMTAiKQorCisJVEVTVF9SUiggICAgInFhZGQxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInFhZGQxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJjZmYxYQlAIHFhZGQxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJxYXN4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAicWFzeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJjZmYzYQlAIHFhc3gJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAicXNheAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInFzYXgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYyY2ZmNWEJQCBxc2F4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInFzdWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInFzdWIxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJjZmY3YQlAIHFzdWIxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJxYWRkOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInFhZGQ4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MmNmZjlhCUAgcWFkZDgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MjAwMGIwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MmZmZmJmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MjAwMGQwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2MmZmZmRmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1JSKCAgICAicXN1YjgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJxc3ViOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjJjZmZmYQlAIHFzdWI4CXBjLCByMTIsIHIxMCIpCisKKwlURVNUX1JSKCAgICAic2hhZGQxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNoYWRkMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzY2ZmMWEJQCBzaGFkZDE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNoYXN4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic2hhc3gJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzY2ZmM2EJQCBzaGFzeAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJzaHNheAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNoc2F4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2M2NmZjVhCUAgc2hzYXgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAic2hzdWIxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNoc3ViMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzY2ZmN2EJQCBzaHN1YjE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInNoYWRkOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNoYWRkOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjNjZmY5YQlAIHNoYWRkOAlwYywgcjEyLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzMDAwYjAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzZmZmYmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzMDAwZDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzZmZmZGYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfUlIoICAgICJzaHN1YjgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzaHN1YjgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTYzY2ZmZmEJQCBzaHN1YjgJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfR1JPVVAoIlBhcmFsbGVsIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiwgdW5zaWduZWQiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjQwMDAxMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjRmZmZmZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUX1JSKCAgICAidWFkZDE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWFkZDE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWNmZjFhCUAgdWFkZDE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVhc3gJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1YXN4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWNmZjNhCUAgdWFzeAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1c2F4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXNheAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjVjZmY1YQlAIHVzYXgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidXN1YjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXN1YjE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWNmZjdhCUAgdXN1YjE2CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVhZGQ4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWFkZDgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1Y2ZmOWEJQCB1YWRkOAlwYywgcjEyLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1MDAwYjAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1ZmZmYmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1MDAwZDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY1ZmZmZGYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfUlIoICAgICJ1c3ViOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVzdWI4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NWNmZmZhCUAgdXN1YjgJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfUlIoICAgICJ1cWFkZDE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXFhZGQxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZjZmYxYQlAIHVxYWRkMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidXFhc3gJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1cWFzeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZjZmYzYQlAIHVxYXN4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVxc2F4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXFzYXgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY2Y2ZmNWEJQCB1cXNheAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1cXN1YjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXFzdWIxNglyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZjZmY3YQlAIHVxc3ViMTYJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidXFhZGQ4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXFhZGQ4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NmNmZjlhCUAgdXFhZGQ4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjYwMDBiMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZmZmZiZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjYwMDBkMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZmZmZkZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9SUiggICAgInVxc3ViOAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVxc3ViOAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjZjZmZmYQlAIHVxc3ViOAlwYywgcjEyLCByMTAiKQorCisJVEVTVF9SUiggICAgInVoYWRkMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1aGFkZDE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NmZjFhCUAgdWhhZGQxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1aGFzeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInVoYXN4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NmZjNhCUAgdWhhc3gJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICAidWhzYXgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1aHNheAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdjZmY1YQlAIHVoc2F4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9SUiggICAgInVoc3ViMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1aHN1YjE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NmZjdhCUAgdWhzdWIxNglwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgICJ1aGFkZDgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1aGFkZDgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY3Y2ZmOWEJQCB1aGFkZDgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NzAwMGIwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2ZmZmJmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2NzAwMGQwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2ZmZmRmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1JSKCAgICAidWhzdWI4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidWhzdWI4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2N2NmZmZhCUAgdWhzdWI4CXBjLCByMTIsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjdmZWZmYQlAIHVoc3ViOAlyMTQsIHBjLCByMTAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY3Y2VmZmYJQCB1aHN1YjgJcjE0LCByMTIsIHBjIikKKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNyAqLworCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX0dST1VQKCJQYWNraW5nLCB1bnBhY2tpbmcsIHNhdHVyYXRpb24sIGFuZCByZXZlcnNhbCIpCisKKwlURVNUX1JSKCAgICAicGtoYnQJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJwa2hidAlyMTQsciIsMTIsIEhIMSwiLCByIiwxMCxISDIsIiwgbHNsICMyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OGNmMTFhCUAgcGtoYnQJcGMsIHIxMiwgcjEwLCBsc2wgIzIiKQorCVRFU1RfUlIoICAgICJwa2h0YglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInBraHRiCXIxNCxyIiwxMiwgSEgxLCIsIHIiLDEwLEhIMiwiLCBhc3IgIzIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY4Y2YxNWEJQCBwa2h0YglwYywgcjEyLCByMTAsIGFzciAjMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhmZTE1YQlAIHBraHRiCXIxNCwgcGMsIHIxMCwgYXNyICMyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OGNlMTVmCUAgcGtodGIJcjE0LCByMTIsIHBjLCBhc3IgIzIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY5MDAwMTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY5ZmZmZGYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCisJVEVTVF9SKCAgICAgInNzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJzc2F0CXIxNCwgIzI0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoICAgICAic3NhdAlyMCwgIzI0LCByIiwwLCAgIFZBTDEsIiwgbHNsICM4IikKKwlURVNUX1IoICAgICAic3NhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiwgYXNyICM4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2YjdmMDFjCUAgc3NhdAlwYywgIzI0LCByMTIiKQorCisJVEVTVF9SKCAgICAgInVzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJ1c2F0CXIxNCwgIzI0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoICAgICAidXNhdAlyMCwgIzI0LCByIiwwLCAgIFZBTDEsIiwgbHNsICM4IikKKwlURVNUX1IoICAgICAidXNhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiwgYXNyICM4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZjdmMDFjCUAgdXNhdAlwYywgIzI0LCByMTIiKQorCisJVEVTVF9SUiggICAgInN4dGFiMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzeHRhYjE2CXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJzeHRiMTYJcjgsIHIiLDcsICBISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhjZjQ3YQlAIHN4dGFiMTYJcGMscjEyLCByMTAsIHJvciAjOCIpCisKKwlURVNUX1JSKCAgICAic2VsCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzZWwJcjE0LCByIiwxMixWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTY4Y2ZmYmEJQCBzZWwJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OGZlZmJhCUAgc2VsCXIxNCwgcGMsIHIxMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNjhjZWZiZglAIHNlbAlyMTQsIHIxMiwgcGMiKQorCisJVEVTVF9SKCAgICAgInNzYXQxNglyMCwgIzEyLCByIiwwLCAgIEhIMSwiIikKKwlURVNUX1IoICAgICAic3NhdDE2CXIxNCwgIzEyLCByIiwxMiwgSEgyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZhYmZmM2MJQCBzc2F0MTYJcGMsICMxMiwgcjEyIikKKworCVRFU1RfUlIoICAgICJzeHRhYglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInN4dGFiCXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJzeHRiCXI4LCByIiw3LCAgSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZhY2Y0N2EJQCBzeHRhYglwYyxyMTIsIHIxMCwgcm9yICM4IikKKworCVRFU1RfUiggICAgICJyZXYJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAicmV2CXIxNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmJmZmYzYwlAIHJldglwYywgcjEyIikKKworCVRFU1RfUlIoICAgICJzeHRhaAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInN4dGFoCXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJzeHRoCXI4LCByIiw3LCAgSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZiY2Y0N2EJQCBzeHRhaAlwYyxyMTIsIHIxMCwgcm9yICM4IikKKworCVRFU1RfUiggICAgICJyZXYxNglyMCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJyZXYxNglyMTQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZiZmZmYmMJQCByZXYxNglwYywgcjEyIikKKworCVRFU1RfUlIoICAgICJ1eHRhYjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXh0YWIxNglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAidXh0YjE2CXI4LCByIiw3LCAgSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZjY2Y0N2EJQCB1eHRhYjE2CXBjLHIxMiwgcjEwLCByb3IgIzgiKQorCisJVEVTVF9SKCAgICAgInVzYXQxNglyMCwgIzEyLCByIiwwLCAgIEhIMSwiIikKKwlURVNUX1IoICAgICAidXNhdDE2CXIxNCwgIzEyLCByIiwxMiwgSEgyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZlY2ZmM2MJQCB1c2F0MTYJcGMsICMxMiwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZWNlZjNmCUAgdXNhdDE2CXIxNCwgIzEyLCBwYyIpCisKKwlURVNUX1JSKCAgICAidXh0YWIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1eHRhYglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAidXh0YglyOCwgciIsNywgIEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZWNmNDdhCUAgdXh0YWIJcGMscjEyLCByMTAsIHJvciAjOCIpCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCVRFU1RfUiggICAgICJyYml0CXIwLCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInJiaXQJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZmZmZjNjCUAgcmJpdAlwYywgcjEyIikKKyNlbmRpZgorCisJVEVTVF9SUiggICAgInV4dGFoCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAidXh0YWgJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInV4dGgJcjgsIHIiLDcsICBISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmZmZjA3NwlAIHV4dGgJcGMsIHI3IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZmY4MDdmCUAgdXh0aAlyOCwgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZmY2Y0N2EJQCB1eHRhaAlwYywgcjEyLCByMTAsIHJvciAjOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNmZjZTQ3ZglAIHV4dGFoCXIxNCwgcjEyLCBwYywgcm9yICM4IikKKworCVRFU1RfUiggICAgICJyZXZzaAlyMCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUiggICAgICJyZXZzaAlyMTQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZmZmZmM2MJQCByZXZzaAlwYywgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2ZmZlZjNmCUAgcmV2c2gJcjE0LCBwYyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OTAwMDcwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU2OWZmZjdmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZkMDAwNzAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTZkZmZmN2YiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworI2VuZGlmIC8qIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICovCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfR1JPVVAoIlNpZ25lZCBtdWx0aXBsaWVzIikKKworCVRFU1RfUlJSKCAgICJzbWxhZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sYWQJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmOGExYwlAIHNtbGFkCXBjLCByMTIsIHIxMCwgcjgiKQorCVRFU1RfUlJSKCAgICJzbWxhZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbGFkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGY4YTNjCUAgc21sYWR4CXBjLCByMTIsIHIxMCwgcjgiKQorCisJVEVTVF9SUiggICAic211YWQJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgInNtdWFkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGZmYTFjCUAgc211YWQJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICJzbXVhZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgInNtdWFkeAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzBmZmEzYwlAIHNtdWFkeAlwYywgcjEyLCByMTAiKQorCisJVEVTVF9SUlIoICAgInNtbHNkCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbWxzZAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGY4YTVjCUAgc21sc2QJcGMsIHIxMiwgcjEwLCByOCIpCisJVEVTVF9SUlIoICAgInNtbHNkeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sc2R4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTcwZjhhN2MJQCBzbWxzZHgJcGMsIHIxMiwgcjEwLCByOCIpCisKKwlURVNUX1JSKCAgICJzbXVzZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAic211c2QJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTcwZmZhNWMJQCBzbXVzZAlwYywgcjEyLCByMTAiKQorCVRFU1RfUlIoICAgInNtdXNkeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAic211c2R4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3MGZmYTdjCUAgc211c2R4CXBjLCByMTIsIHIxMCIpCisKKwlURVNUX1JSUlIoICJzbWxhbGQJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCAiLCByIiwwLCBISDEsIiwgciIsMSwgSEgyKQorCVRFU1RfUlJSUiggInNtbGFsZAlyIiwxMSxWQUwyLCIsIHIiLDEwLFZBTDEsICIsIHIiLDksIEhIMiwiLCByIiw4LCBISDEpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzRhZjgxOQlAIHNtbGFsZAlwYywgcjEwLCByOSwgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc0ZmI4MTkJQCBzbWxhbGQJcjExLCBwYywgcjksIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NGFiODFmCUAgc21sYWxkCXIxMSwgcjEwLCBwYywgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc0YWJmMTkJQCBzbWxhbGQJcjExLCByMTAsIHI5LCBwYyIpCisKKwlURVNUX1JSUlIoICJzbWxhbGR4CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxhbGR4CXIiLDExLFZBTDIsIiwgciIsMTAsVkFMMSwgIiwgciIsOSwgSEgyLCIsIHIiLDgsIEhIMSkKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NGFmODM5CUAgc21sYWxkeAlwYywgcjEwLCByOSwgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc0ZmI4MzkJQCBzbWxhbGR4CXIxMSwgcGMsIHI5LCByOCIpCisKKwlURVNUX1JSUiggICJzbW1sYQlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgInNtbWxhCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVmOGExYwlAIHNtbWxhCXBjLCByMTIsIHIxMCwgcjgiKQorCVRFU1RfUlJSKCAgInNtbWxhcglyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgInNtbWxhcglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZjhhM2MJQCBzbW1sYXIJcGMsIHIxMiwgcjEwLCByOCIpCisKKwlURVNUX1JSKCAgICJzbW11bAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiIikKKwlURVNUX1JSKCAgICJzbW11bAlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWZmYTFjCUAgc21tdWwJcGMsIHIxMiwgcjEwIikKKwlURVNUX1JSKCAgICJzbW11bHIJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiIpCisJVEVTVF9SUiggICAic21tdWxyCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZmZhM2MJQCBzbW11bHIJcGMsIHIxMiwgcjEwIikKKworCVRFU1RfUlJSKCAgInNtbWxzCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAic21tbHMJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWY4YWRjCUAgc21tbHMJcGMsIHIxMiwgcjEwLCByOCIpCisJVEVTVF9SUlIoICAic21tbHNyCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAic21tbHNyCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVmOGFmYwlAIHNtbWxzcglwYywgcjEyLCByMTAsIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWU4YWZmCUAgc21tbHNyCXIxNCwgcGMsIHIxMCwgcjgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc1ZThmZmMJQCBzbW1sc3IJcjE0LCByMTIsIHBjLCByOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzVlZmFmYwlAIHNtbWxzcglyMTQsIHIxMiwgcjEwLCBwYyIpCisKKwlURVNUX1JSKCAgICJ1c2FkOAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiIikKKwlURVNUX1JSKCAgICJ1c2FkOAlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWZmYTFjCUAgdXNhZDgJcGMsIHIxMiwgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWVmYTFmCUAgdXNhZDgJcjE0LCBwYywgcjEwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3NWVmZjFjCUAgdXNhZDgJcjE0LCByMTIsIHBjIikKKworCVRFU1RfUlJSKCAgInVzYWRhOAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIiKQorCVRFU1RfUlJSKCAgInVzYWRhOAlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwzLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTc4ZjhhMWMJQCB1c2FkYTgJcGMsIHIxMiwgcjEwLCByOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlNzhlOGExZglAIHVzYWRhOAlyMTQsIHBjLCByMTAsIHI4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3OGU4ZjFjCUAgdXNhZGE4CXIxNCwgcjEyLCBwYywgcjgiKQorI2VuZGlmIC8qIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICovCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCVRFU1RfR1JPVVAoIkJpdCBGaWVsZCIpCisKKwlURVNUX1IoICAgICAic2JmeAlyMCwgciIsMCAgLCBWQUwxLCIsICMwLCAjMzEiKQorCVRFU1RfUiggICAgICJzYmZ4ZXEJcjE0LCByIiwxMiwgVkFMMiwiLCAjOCwgIzE2IikKKwlURVNUX1IoICAgICAic2JmeAlyNCwgciIsMTAsICBWQUwxLCIsICMxNiwgIzE1IikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGU3YWZmNDVjCUAgc2JmeAlwYywgcjEyLCAjOCwgIzE2IikKKworCVRFU1RfUiggICAgICJ1YmZ4CXIwLCByIiwwICAsIFZBTDEsIiwgIzAsICMzMSIpCisJVEVTVF9SKCAgICAgInViZnhjcwlyMTQsIHIiLDEyLCBWQUwyLCIsICM4LCAjMTYiKQorCVRFU1RfUiggICAgICJ1YmZ4CXI0LCByIiwxMCwgIFZBTDEsIiwgIzE2LCAjMTUiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTdlZmY0NWMJQCB1YmZ4CXBjLCByMTIsICM4LCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZTdlZmM0NWYJQCB1YmZ4CXIxMiwgcGMsICM4LCAjMTYiKQorCisJVEVTVF9SKCAgICAgImJmYwlyIiwwLCBWQUwxLCIsICM0LCAjMjAiKQorCVRFU1RfUiggICAgICJiZmN2cwlyIiwxNCxWQUwyLCIsICM0LCAjMjAiKQorCVRFU1RfUiggICAgICJiZmMJciIsNywgVkFMMSwiLCAjMCwgIzMxIikKKwlURVNUX1IoICAgICAiYmZjCXIiLDgsIFZBTDIsIiwgIzAsICMzMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2RlZjAxZglAIGJmYwlwYywgIzAsICMzMSIpOworCisJVEVTVF9SUiggICAgImJmaQlyIiwwLCBWQUwxLCIsIHIiLDAgICwgVkFMMiwiLCAjMCwgIzMxIikKKwlURVNUX1JSKCAgICAiYmZpcGwJciIsMTIsVkFMMSwiLCByIiwxNCAsIFZBTDIsIiwgIzQsICMyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhlN2Q3ZjIxZQlAIGJmaQlwYywgcjE0LCAjNCwgIzIwIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4MDdmMDAwZjAiKSAgLyogUGVybWFuZW50bHkgVU5ERUZJTkVEICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgwN2ZmZmZmZiIpICAvKiBQZXJtYW5lbnRseSBVTkRFRklORUQgKi8KKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAqLworCisJVEVTVF9HUk9VUCgiQnJhbmNoLCBicmFuY2ggd2l0aCBsaW5rLCBhbmQgYmxvY2sgZGF0YSB0cmFuc2ZlciIpCisKKwlURVNUX1AoICAgInN0bWRhCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9QKCAgICJzdG1lcWRhCXIiLDQsIDE2KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfUCggICAic3RtbmVkYQlyIiw4LCAxNio0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJzdG1kYQlyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfUCggICAic3RtZGEJciIsMTMsMCwgICAiISwge3BjfSIpCisKKwlURVNUX1AoICAgImxkbWRhCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9CRl9QKCJsZG1jc2RhCXIiLDQsIDE1KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfQkZfUCgibGRtY2NkYQlyIiw3LCAxNSo0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJsZG1kYQlyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtZGEJciIsMTQsMTUqNCwiISwge3BjfSIpCisKKwlURVNUX1AoICAgInN0bWlhCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9QKCAgICJzdG1taWlhCXIiLDQsIDE2KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfUCggICAic3RtcGxpYQlyIiw4LCAxNio0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJzdG1pYQlyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfUCggICAic3RtaWEJciIsMTQsMCwgICAiISwge3BjfSIpCisKKwlURVNUX1AoICAgImxkbWlhCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9CRl9QKCJsZG12c2lhCXIiLDQsIDAsICAgIiwge3IwLXIxNX0iKQorCVRFU1RfQkZfUCgibGRtdmNpYQlyIiw3LCA4KjQsICIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJsZG1pYQlyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtaWEJciIsMTQsMTUqNCwiISwge3BjfSIpCisKKwlURVNUX1AoICAgInN0bWRiCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9QKCAgICJzdG1oaWRiCXIiLDQsIDE2KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfUCggICAic3RtbHNkYglyIiw4LCAxNio0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfUCggICAic3RtZGIJciIsMTMsNCwgICAiISwge3BjfSIpCisKKwlURVNUX1AoICAgImxkbWRiCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9CRl9QKCJsZG1nZWRiCXIiLDQsIDE2KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfQkZfUCgibGRtbHRkYglyIiw3LCAxNio0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJsZG1kYglyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtZGIJciIsMTQsMTYqNCwiISwge3BjfSIpCisKKwlURVNUX1AoICAgInN0bWliCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9QKCAgICJzdG1ndGliCXIiLDQsIDE2KjQsIiwge3IwLXIxNX0iKQorCVRFU1RfUCggICAic3RtbGVpYglyIiw4LCAxNio0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJzdG1pYglyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfUCggICAic3RtaWIJciIsMTMsLTQsICAiISwge3BjfSIpCisKKwlURVNUX1AoICAgImxkbWliCXIiLDAsIDE2KjQsIiwge3IwfSIpCisJVEVTVF9CRl9QKCJsZG1lcWliCXIiLDQsIC00LCIsIHtyMC1yMTV9IikKKwlURVNUX0JGX1AoImxkbW5laWIJciIsNywgNyo0LCIhLCB7cjgtcjE1fSIpCisJVEVTVF9QKCAgICJsZG1pYglyIiwxMiwxNio0LCIhLCB7cjEscjMscjUscjcscjgtcjExLHIxNH0iKQorCVRFU1RfQkZfUCgibGRtaWIJciIsMTQsMTQqNCwiISwge3BjfSIpCisKKwlURVNUX1AoICAgInN0bWRiCXIiLDEzLDE2KjQsIiEsIHtyMy1yMTIsbHJ9IikKKwlURVNUX1AoCSAgInN0bWVxZGIJciIsMTMsMTYqNCwiISwge3IzLXIxMn0iKQorCVRFU1RfUCggICAic3RtbmVkYglyIiwyLCAxNio0LCIsIHtyMy1yMTIsbHJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDEzLDE2KjQsIiEsIHtyMi1yMTIsbHJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDAsIDE2KjQsIiwge3IwLXIxMn0iKQorCVRFU1RfUCggICAic3RtZGIJciIsMCwgMTYqNCwiLCB7cjAtcjEyLGxyfSIpCisKKwlURVNUX0JGX1AoImxkbWlhCXIiLDEzLDUqNCwgIiEsIHtyMy1yMTIscGN9IikKKwlURVNUX1AoCSAgImxkbWNjaWEJciIsMTMsNSo0LCAiISwge3IzLXIxMn0iKQorCVRFU1RfQkZfUCgibGRtY3NpYQlyIiwyLCA1KjQsICIhLCB7cjMtcjEyLHBjfSIpCisJVEVTVF9CRl9QKCJsZG1pYQlyIiwxMyw0KjQsICIhLCB7cjItcjEyLHBjfSIpCisJVEVTVF9QKCAgICJsZG1pYQlyIiwwLCAxNio0LCIsIHtyMC1yMTJ9IikKKwlURVNUX1AoICAgImxkbWlhCXIiLDAsIDE2KjQsIiwge3IwLXIxMixscn0iKQorCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKwlURVNUX0FSTV9UT19USFVNQl9JTlRFUldPUktfUCgibGRtcGxpYQlyIiwwLDE1KjQsIiwge3BjfSIpCisJVEVTVF9BUk1fVE9fVEhVTUJfSU5URVJXT1JLX1AoImxkbW1paWEJciIsMTMsMCwiLCB7cjAtcjE1fSIpCisjZW5kaWYKKwlURVNUX0JGKCJiCTJmIikKKwlURVNUX0JGKCJibAkyZiIpCisJVEVTVF9CQigiYgkyYiIpCisJVEVTVF9CQigiYmwJMmIiKQorCisJVEVTVF9CRigiYmVxCTJmIikKKwlURVNUX0JGKCJibGVxCTJmIikKKwlURVNUX0JCKCJibmUJMmIiKQorCVRFU1RfQkIoImJsbmUJMmIiKQorCisJVEVTVF9CRigiYmd0CTJmIikKKwlURVNUX0JGKCJibGd0CTJmIikKKwlURVNUX0JCKCJibHQJMmIiKQorCVRFU1RfQkIoImJsbHQJMmIiKQorCisJVEVTVF9HUk9VUCgiU3VwZXJ2aXNvciBDYWxsLCBhbmQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIikKKworCS8qCisJICogV2UgY2FuJ3QgcmVhbGx5IHRlc3QgdGhlc2UgYnkgZXhlY3V0aW5nIHRoZW0sIHNvIGFsbAorCSAqIHdlIGNhbiBkbyBpcyBjaGVjayB0aGF0IHByb2JlcyBhcmUsIG9yIGFyZSBub3QgYWxsb3dlZC4KKwkgKiBBdCB0aGUgbW9tZW50IG5vbmUgYXJlIGFsbG93ZWQuLi4KKwkgKi8KKyNkZWZpbmUgVEVTVF9DT1BST0NFU1NPUihjb2RlKSBURVNUX1VOU1VQUE9SVEVEKGNvZGUpCisKKyNkZWZpbmUgQ09QUk9DRVNTT1JfSU5TVFJVQ1RJT05TX1NUX0xEKHR3byxjYykJCQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTMsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28iCTAsIGNyMCwgW3IxMywgIy00XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28iCTAsIGNyMCwgW3IxMywgIzRdISIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28iCTAsIGNyMCwgW3IxMywgIy00XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvIgkwLCBjcjAsIFtyMTNdLCAjNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28iCTAsIGNyMCwgW3IxM10sICMtNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28iCTAsIGNyMCwgW3IxM10sIHsxfSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28ibAkwLCBjcjAsIFtyMTMsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoInN0YyJ0d28ibAkwLCBjcjAsIFtyMTMsICMtNF0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvImwJMCwgY3IwLCBbcjEzLCAjNF0hIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byJsCTAsIGNyMCwgW3IxMywgIy00XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvImwJMCwgY3IwLCBbcjEzXSwgIzQiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJzdGMidHdvImwJMCwgY3IwLCBbcjEzXSwgIy00IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigic3RjInR3byJsCTAsIGNyMCwgW3IxM10sIHsxfSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxMywgIzRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byIJMCwgY3IwLCBbcjEzLCAjLTRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byIJMCwgY3IwLCBbcjEzLCAjNF0hIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byIJMCwgY3IwLCBbcjEzLCAjLTRdISIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28iCTAsIGNyMCwgW3IxM10sICM0IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byIJMCwgY3IwLCBbcjEzXSwgIy00IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byIJMCwgY3IwLCBbcjEzXSwgezF9IikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byJsCTAsIGNyMCwgW3IxMywgIzRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUigibGRjInR3byJsCTAsIGNyMCwgW3IxMywgIy00XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28ibAkwLCBjcjAsIFtyMTMsICM0XSEiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvImwJMCwgY3IwLCBbcjEzLCAjLTRdISIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28ibAkwLCBjcjAsIFtyMTNdLCAjNCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoImxkYyJ0d28ibAkwLCBjcjAsIFtyMTNdLCAjLTQiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCJsZGMidHdvImwJMCwgY3IwLCBbcjEzXSwgezF9IikJCQlcCisJCQkJCQkJCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJzdGMidHdvIgkwLCBjcjAsIFtyMTUsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJzdGMidHdvIgkwLCBjcjAsIFtyMTUsICMtNF0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkYWYwMDAxCUAgc3RjInR3byIJMCwgY3IwLCBbcjE1LCAjNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImQyZjAwMDEJQCBzdGMidHdvIgkwLCBjcjAsIFtyMTUsICMtNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImNhZjAwMDEJQCBzdGMidHdvIgkwLCBjcjAsIFtyMTVdLCAjNCIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjMmYwMDAxCUAgc3RjInR3byIJMCwgY3IwLCBbcjE1XSwgIy00IikJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJzdGMidHdvIgkwLCBjcjAsIFtyMTVdLCB7MX0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAic3RjInR3byJsCTAsIGNyMCwgW3IxNSwgIzRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggInN0YyJ0d28ibAkwLCBjcjAsIFtyMTUsICMtNF0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkZWYwMDAxCUAgc3RjInR3byJsCTAsIGNyMCwgW3IxNSwgIzRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkNmYwMDAxCUAgc3RjInR3byJsCTAsIGNyMCwgW3IxNSwgIy00XSEiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiY2VmMDAwMQlAIHN0YyJ0d28ibAkwLCBjcjAsIFtyMTVdLCAjNCIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjNmYwMDAxCUAgc3RjInR3byJsCTAsIGNyMCwgW3IxNV0sICMtNCIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAic3RjInR3byJsCTAsIGNyMCwgW3IxNV0sIHsxfSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJsZGMidHdvIgkwLCBjcjAsIFtyMTUsICM0XSIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJsZGMidHdvIgkwLCBjcjAsIFtyMTUsICMtNF0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkYmYwMDAxCUAgbGRjInR3byIJMCwgY3IwLCBbcjE1LCAjNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImQzZjAwMDEJQCBsZGMidHdvIgkwLCBjcjAsIFtyMTUsICMtNF0hIikJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImNiZjAwMDEJQCBsZGMidHdvIgkwLCBjcjAsIFtyMTVdLCAjNCIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjM2YwMDAxCUAgbGRjInR3byIJMCwgY3IwLCBbcjE1XSwgIy00IikJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJsZGMidHdvIgkwLCBjcjAsIFtyMTVdLCB7MX0iKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibGRjInR3byJsCTAsIGNyMCwgW3IxNSwgIzRdIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggImxkYyJ0d28ibAkwLCBjcjAsIFtyMTUsICMtNF0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkZmYwMDAxCUAgbGRjInR3byJsCTAsIGNyMCwgW3IxNSwgIzRdISIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJkN2YwMDAxCUAgbGRjInR3byJsCTAsIGNyMCwgW3IxNSwgIy00XSEiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiY2ZmMDAwMQlAIGxkYyJ0d28ibAkwLCBjcjAsIFtyMTVdLCAjNCIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjN2YwMDAxCUAgbGRjInR3byJsCTAsIGNyMCwgW3IxNV0sICMtNCIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibGRjInR3byJsCTAsIGNyMCwgW3IxNV0sIHsxfSIpCisKKyNkZWZpbmUgQ09QUk9DRVNTT1JfSU5TVFJVQ1RJT05TX01DX01SKHR3byxjYykJCQkJCVwKKwkJCQkJCQkJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggIm1jcnIidHdvIgkwLCAxNSwgcjAsIHIxNCwgY3IwIikJCQlcCisJVEVTVF9DT1BST0NFU1NPUiggIm1jcnIidHdvIgkxNSwgMCwgcjE0LCByMCwgY3IxNSIpCQkJXAorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ImNjImM0ZjAwZjAJQCBtY3JyInR3byIJMCwgMTUsIHIwLCByMTUsIGNyMCIpCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjNDBmZjBmCUAgbWNyciJ0d28iCTE1LCAwLCByMTUsIHIwLCBjcjE1IikJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtcnJjInR3byIJMCwgMTUsIHIwLCByMTQsIGNyMCIpCQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtcnJjInR3byIJMTUsIDAsIHIxNCwgcjAsIGNyMTUiKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweCJjYyJjNWYwMGYwCUAgbXJyYyJ0d28iCTAsIDE1LCByMCwgcjE1LCBjcjAiKQlcCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHgiY2MiYzUwZmYwZglAIG1ycmMidHdvIgkxNSwgMCwgcjE1LCByMCwgY3IxNSIpCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAiY2RwInR3byIJMTUsIDE1LCBjcjE1LCBjcjE1LCBjcjE1LCA3IikJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAiY2RwInR3byIJMCwgMCwgY3IwLCBjcjAsIGNyMCwgMCIpCQlcCisJVEVTVF9DT1BST0NFU1NPUiggIm1jciJ0d28iCTE1LCA3LCByMTUsIGNyMTUsIGNyMTUsIDciKQkJXAorCVRFU1RfQ09QUk9DRVNTT1IoICJtY3IidHdvIgkwLCAwLCByMCwgY3IwLCBjcjAsIDAiKQkJCVwKKwlURVNUX0NPUFJPQ0VTU09SKCAibXJjInR3byIJMTUsIDcsIHIxNSwgY3IxNSwgY3IxNSwgNyIpCQlcCisJVEVTVF9DT1BST0NFU1NPUiggIm1yYyJ0d28iCTAsIDAsIHIwLCBjcjAsIGNyMCwgMCIpCisKKwlDT1BST0NFU1NPUl9JTlNUUlVDVElPTlNfU1RfTEQoIiIsImUiKQorCUNPUFJPQ0VTU09SX0lOU1RSVUNUSU9OU19NQ19NUigiIiwiZSIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3ZjCTAiKQorCVRFU1RfVU5TVVBQT1JURUQoInN2YwkweGZmZmZmZiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJzdmMJMCIpCisKKwlURVNUX0dST1VQKCJVbmNvbmRpdGlvbmFsIGluc3RydWN0aW9uIikKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CisJVEVTVF9VTlNVUFBPUlRFRCgic3JzZGEJc3AsIDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNyc2RiCXNwLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzcnNpYQlzcCwgMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3JzaWIJc3AsIDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNyc2RhCXNwISwgMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3JzZGIJc3AhLCAweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJzcnNpYQlzcCEsIDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNyc2liCXNwISwgMHgxMyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVkYQlzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlZGIJc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWlhCXNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVpYglzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlZGEJc3AhIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVkYglzcCEiKQorCVRFU1RfVU5TVVBQT1JURUQoInJmZWlhCXNwISIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlaWIJc3AhIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY4MWQwYTAwCUAgcmZlZGEJcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZjkxZDBhMDAJQCByZmVkYglwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLndvcmQgMHhmODlkMGEwMAlAIHJmZWlhCXBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIud29yZCAweGY5OWQwYTAwCUAgcmZlaWIJcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZjgzZDBhMDAJQCByZmVkYQlwYyEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZjkzZDBhMDAJQCByZmVkYglwYyEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZjhiZDBhMDAJQCByZmVpYQlwYyEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi53b3JkIDB4ZjliZDBhMDAJQCByZmVpYglwYyEiKQorI2VuZGlmIC8qIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICovCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCVRFU1RfWCgJImJseAlfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfZXZlbiIsCisJCSIudGh1bWIJCQkJXG5cdCIKKwkJIi5zcGFjZSA0CQkJXG5cdCIKKwkJIi50eXBlIF9fZHVtbXlfdGh1bWJfc3Vicm91dGluZV9ldmVuLCAlJWZ1bmN0aW9uIFxuXHQiCisJCSJfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfZXZlbjoJXG5cdCIKKwkJIm1vdglyMCwgcGMJCQlcblx0IgorCQkiYngJbHIJCQlcblx0IgorCQkiLmFybQkJCQlcblx0IgorCSkKKwlURVNUKAkiYmx4CV9fZHVtbXlfdGh1bWJfc3Vicm91dGluZV9ldmVuIikKKworCVRFU1RfWCgJImJseAlfX2R1bW15X3RodW1iX3N1YnJvdXRpbmVfb2RkIiwKKwkJIi50aHVtYgkJCQlcblx0IgorCQkiLnNwYWNlIDIJCQlcblx0IgorCQkiLnR5cGUgX19kdW1teV90aHVtYl9zdWJyb3V0aW5lX29kZCwgJSVmdW5jdGlvbglcblx0IgorCQkiX19kdW1teV90aHVtYl9zdWJyb3V0aW5lX29kZDoJXG5cdCIKKwkJIm1vdglyMCwgcGMJCQlcblx0IgorCQkiYngJbHIJCQlcblx0IgorCQkiLmFybQkJCQlcblx0IgorCSkKKwlURVNUKAkiYmx4CV9fZHVtbXlfdGh1bWJfc3Vicm91dGluZV9vZGQiKQorI2VuZGlmIC8qIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICovCisKKwlDT1BST0NFU1NPUl9JTlNUUlVDVElPTlNfU1RfTEQoIjIiLCJmIikKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNgorCUNPUFJPQ0VTU09SX0lOU1RSVUNUSU9OU19NQ19NUigiMiIsImYiKQorI2VuZGlmCisKKwlURVNUX0dST1VQKCJNaXNjZWxsYW5lb3VzIGluc3RydWN0aW9ucywgbWVtb3J5IGhpbnRzLCBhbmQgQWR2YW5jZWQgU0lNRCBpbnN0cnVjdGlvbnMiKQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKKwlURVNUX1VOU1VQUE9SVEVEKCJjcHMJMHgxMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzaWUJaSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzaWQJaSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzaWUJaSwweDEzIikKKwlURVNUX1VOU1VQUE9SVEVEKCJjcHNpZAlpLDB4MTMiKQorCVRFU1RfVU5TVVBQT1JURUQoInNldGVuZAlsZSIpCisJVEVTVF9VTlNVUFBPUlRFRCgic2V0ZW5kCWJlIikKKyNlbmRpZgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1AoInBsaQlbciIsMCwwYiwiLCAjMTZdIikKKwlURVNUKCAgInBsaQlbcGMsICMwXSIpCisJVEVTVF9SUigicGxpCVtyIiwxMiwwYiwiLCByIiwwLCAxNiwiXSIpCisJVEVTVF9SUigicGxpCVtyIiwwLCAwYiwiLCAtciIsMTIsMTYsIiwgbHNsICM0XSIpCisjZW5kaWYKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisJVEVTVF9QKCJwbGQJW3IiLDAsMzIsIiwgIy0xNl0iKQorCVRFU1QoICAicGxkCVtwYywgIzBdIikKKwlURVNUX1BSKCJwbGQJW3IiLDcsIDI0LCAiLCByIiwwLCAxNiwiXSIpCisJVEVTVF9QUigicGxkCVtyIiw4LCAyNCwgIiwgLXIiLDEyLDE2LCIsIGxzbCAjNF0iKQorI2VuZGlmCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCVRFU1RfU1VQUE9SVEVEKCAgIi53b3JkIDB4ZjU5MGYwMDAJQCBwbGR3IFtyMCwgIzBdIikKKwlURVNUX1NVUFBPUlRFRCggICIud29yZCAweGY3OTdmMDAwCUAgcGxkdwlbcjcsIHIwXSIpCisJVEVTVF9TVVBQT1JURUQoICAiLndvcmQgMHhmNzk4ZjE4YwlAIHBsZHcJW3I4LCByMTIsIGxzbCAjM10iKTsKKyNlbmRpZgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDcKKwlURVNUX1VOU1VQUE9SVEVEKCJjbHJleCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZHNiIikKKwlURVNUX1VOU1VQUE9SVEVEKCJkbWIiKQorCVRFU1RfVU5TVVBQT1JURUQoImlzYiIpCisjZW5kaWYKKworCXZlcmJvc2UoIlxuIik7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtdGh1bWIuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtdGh1bWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTcyNmMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC10aHVtYi5jCkBAIC0wLDAgKzEsMTE4NyBAQAorLyoKKyAqIGFyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QtdGh1bWIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKb24gTWVkaHVyc3QgPHRpeHlAeXhpdC5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJrcHJvYmVzLXRlc3QuaCIKKworCisjZGVmaW5lIFRFU1RfSVNBICIxNiIKKworI2RlZmluZSBET05UX1RFU1RfSU5fSVRCTE9DSyh0ZXN0cykJCQlcCisJa3Byb2JlX3Rlc3RfZmxhZ3MgfD0gVEVTVF9GTEFHX05PX0lUQkxPQ0s7CVwKKwl0ZXN0cwkJCQkJCVwKKwlrcHJvYmVfdGVzdF9mbGFncyAmPSB+VEVTVF9GTEFHX05PX0lUQkxPQ0s7CisKKyNkZWZpbmUgQ09ORElUSU9OX0lOU1RSVUNUSU9OUyhjY19wb3MsIHRlc3RzKQkJXAorCWtwcm9iZV90ZXN0X2NjX3Bvc2l0aW9uID0gY2NfcG9zOwkJXAorCURPTlRfVEVTVF9JTl9JVEJMT0NLKHRlc3RzKQkJCVwKKwlrcHJvYmVfdGVzdF9jY19wb3NpdGlvbiA9IDA7CisKKyNkZWZpbmUgVEVTVF9JVEJMT0NLKGNvZGUpCQkJCVwKKwlrcHJvYmVfdGVzdF9mbGFncyB8PSBURVNUX0ZMQUdfRlVMTF9JVEJMT0NLOwlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJXAorCSI1MDoJbm9wCQkJXG5cdCIJCVwKKwkiMToJImNvZGUiCQkJXG5cdCIJCVwKKwkiCW1vdiByMSwgIzB4MTEJCVxuXHQiCQlcCisJIgltb3YgcjIsICMweDIyCQlcblx0IgkJXAorCSIJbW92IHIzLCAjMHgzMwkJXG5cdCIJCVwKKwkiMjoJbm9wCQkJXG5cdCIJCVwKKwlURVNUQ0FTRV9FTkQJCQkJCVwKKwlrcHJvYmVfdGVzdF9mbGFncyAmPSB+VEVTVF9GTEFHX0ZVTExfSVRCTE9DSzsKKworI2RlZmluZSBURVNUX1RIVU1CX1RPX0FSTV9JTlRFUldPUktfUChjb2RlMSwgcmVnLCB2YWwsIGNvZGUyKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZyBjb2RlMikJCQlcCisJVEVTVF9BUkdfUFRSKHJlZywgdmFsKQkJCQkJXAorCVRFU1RfQVJHX1JFRygxNCwgOTlmKzEpCQkJCQlcCisJVEVTVF9BUkdfTUVNKDE1LCAzZikJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJIglub3AJCQlcblx0IiAvKiBUbyBhbGlnbiAxZiAqLwlcCisJIjUwOglub3AJCQlcblx0IgkJCVwKKwkiMToJImNvZGUxICNyZWcgY29kZTIiCVxuXHQiCQkJXAorCSIJYngJbHIJCVxuXHQiCQkJXAorCSIuYXJtCQkJCVxuXHQiCQkJXAorCSIzOglhZHIJbHIsIDJmKzEJXG5cdCIJCQlcCisJIglieAlscgkJXG5cdCIJCQlcCisJIi50aHVtYgkJCQlcblx0IgkJCVwKKwkiMjoJbm9wCQkJXG5cdCIJCQlcCisJVEVTVENBU0VfRU5ECisKKwordm9pZCBrcHJvYmVfdGh1bWIxNl90ZXN0X2Nhc2VzKHZvaWQpCit7CisJa3Byb2JlX3Rlc3RfZmxhZ3MgPSBURVNUX0ZMQUdfTkFSUk9XX0lOU1RSOworCisJVEVTVF9HUk9VUCgiU2hpZnQgKGltbWVkaWF0ZSksIGFkZCwgc3VidHJhY3QsIG1vdmUsIGFuZCBjb21wYXJlIikKKworCVRFU1RfUiggICAgImxzbHMJcjcsIHIiLDAsVkFMMSwiLCAjNSIpCisJVEVTVF9SKCAgICAibHNscwlyMCwgciIsNyxWQUwyLCIsICMxMSIpCisJVEVTVF9SKCAgICAibHNycwlyNywgciIsMCxWQUwxLCIsICM1IikKKwlURVNUX1IoICAgICJsc3JzCXIwLCByIiw3LFZBTDIsIiwgIzExIikKKwlURVNUX1IoICAgICJhc3JzCXI3LCByIiwwLFZBTDEsIiwgIzUiKQorCVRFU1RfUiggICAgImFzcnMJcjAsIHIiLDcsVkFMMiwiLCAjMTEiKQorCVRFU1RfUlIoICAgImFkZHMJcjIsIHIiLDAsVkFMMSwiLCByIiw3LFZBTDIsIiIpCisJVEVTVF9SUiggICAiYWRkcwlyNSwgciIsNyxWQUwyLCIsIHIiLDAsVkFMMiwiIikKKwlURVNUX1JSKCAgICJzdWJzCXIyLCByIiwwLFZBTDEsIiwgciIsNyxWQUwyLCIiKQorCVRFU1RfUlIoICAgInN1YnMJcjUsIHIiLDcsVkFMMiwiLCByIiwwLFZBTDIsIiIpCisJVEVTVF9SKCAgICAiYWRkcwlyNywgciIsMCxWQUwxLCIsICM1IikKKwlURVNUX1IoICAgICJhZGRzCXIwLCByIiw3LFZBTDIsIiwgIzIiKQorCVRFU1RfUiggICAgInN1YnMJcjcsIHIiLDAsVkFMMSwiLCAjNSIpCisJVEVTVF9SKCAgICAic3VicwlyMCwgciIsNyxWQUwyLCIsICMyIikKKwlURVNUKCAgICAgICJtb3ZzLm4JcjAsICMweDVmIikKKwlURVNUKCAgICAgICJtb3ZzLm4JcjcsICMweGEwIikKKwlURVNUX1IoICAgICJjbXAubglyIiwwLDB4NWUsICIsICMweDVmIikKKwlURVNUX1IoICAgICJjbXAubglyIiw1LDB4MTVmLCIsICMweDVmIikKKwlURVNUX1IoICAgICJjbXAubglyIiw3LDB4YTAsICIsICMweGEwIikKKwlURVNUX1IoICAgICJhZGRzLm4JciIsMCxWQUwxLCIsICMweDVmIikKKwlURVNUX1IoICAgICJhZGRzLm4JciIsNyxWQUwyLCIsICMweGEwIikKKwlURVNUX1IoICAgICJzdWJzLm4JciIsMCxWQUwxLCIsICMweDVmIikKKwlURVNUX1IoICAgICJzdWJzLm4JciIsNyxWQUwyLCIsICMweGEwIikKKworCVRFU1RfR1JPVVAoIjE2LWJpdCBUaHVtYiBkYXRhLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIikKKworI2RlZmluZSBEQVRBX1BST0NFU1NJTkcxNihvcCx2YWwpCQkJXAorCVRFU1RfUlIoICAgb3AiCXIiLDAsVkFMMSwiLCByIiw3LHZhbCwiIikJXAorCVRFU1RfUlIoICAgb3AiCXIiLDcsVkFMMiwiLCByIiwwLHZhbCwiIikKKworCURBVEFfUFJPQ0VTU0lORzE2KCJhbmRzIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzE2KCJlb3JzIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzE2KCJsc2xzIiwxMSkKKwlEQVRBX1BST0NFU1NJTkcxNigibHNycyIsMTEpCisJREFUQV9QUk9DRVNTSU5HMTYoImFzcnMiLDExKQorCURBVEFfUFJPQ0VTU0lORzE2KCJhZGNzIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzE2KCJzYmNzIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzE2KCJyb3JzIiwxMSkKKwlEQVRBX1BST0NFU1NJTkcxNigidHN0IiwweGYwMGYwMGZmKQorCVRFU1RfUigicnNicwlyIiwwLFZBTDEsIiwgIzAiKQorCVRFU1RfUigicnNicwlyIiw3LFZBTDIsIiwgIzAiKQorCURBVEFfUFJPQ0VTU0lORzE2KCJjbXAiLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMTYoImNtbiIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkcxNigib3JycyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkcxNigibXVscyIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkcxNigiYmljcyIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkcxNigibXZucyIsVkFMMikKKworCVRFU1RfR1JPVVAoIlNwZWNpYWwgZGF0YSBpbnN0cnVjdGlvbnMgYW5kIGJyYW5jaCBhbmQgZXhjaGFuZ2UiKQorCisJVEVTVF9SUiggICJhZGQJciIsMCwgVkFMMSwiLCByIiw3LFZBTDIsIiIpCisJVEVTVF9SUiggICJhZGQJciIsMywgVkFMMiwiLCByIiw4LFZBTDMsIiIpCisJVEVTVF9SUiggICJhZGQJciIsOCwgVkFMMywiLCByIiwwLFZBTDEsIiIpCisJVEVTVF9SKCAgICJhZGQJc3AiICAgICAgICAiLCByIiw4LC04LCAgIiIpCisJVEVTVF9SKCAgICJhZGQJciIsMTQsVkFMMSwiLCBwYyIpCisJVEVTVF9CRl9SKCJhZGQJcGMiICAgICAgICAiLCByIiwwLDJmLTFmLTgsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4NDRmZglAIGFkZCBwYywgcGMiKQorCisJVEVTVF9SUiggICJjbXAJciIsMyxWQUwxLCIsIHIiLDgsVkFMMiwiIikKKwlURVNUX1JSKCAgImNtcAlyIiw4LFZBTDIsIiwgciIsMCxWQUwxLCIiKQorCVRFU1RfUiggICAiY21wCXNwIiAgICAgICAiLCByIiw4LC04LCAgIiIpCisKKwlURVNUX1IoICAgIm1vdglyMCwgciIsNyxWQUwyLCIiKQorCVRFU1RfUiggICAibW92CXIzLCByIiw4LFZBTDMsIiIpCisJVEVTVF9SKCAgICJtb3YJcjgsIHIiLDAsVkFMMSwiIikKKwlURVNUX1AoICAgIm1vdglzcCwgciIsOCwtOCwgICIiKQorCVRFU1QoICAgICAibW92CWxyLCBwYyIpCisJVEVTVF9CRl9SKCJtb3YJcGMsIHIiLDAsMmYsICAiIikKKworCVRFU1RfQkZfUigiYngJciIsMCwgMmYrMSwiIikKKwlURVNUX0JGX1IoImJ4CXIiLDE0LDJmKzEsIiIpCisJVEVTVENBU0VfU1RBUlQoImJ4CXBjIikKKwkJVEVTVF9BUkdfUkVHKDE0LCA5OWYrMSkKKwkJVEVTVF9BUkdfRU5EKCIiKQorCQkiCW5vcAkJCVxuXHQiIC8qIFRvIGFsaWduIHRoZSBieCBwYyovCisJCSI1MDoJbm9wCQkJXG5cdCIKKwkJIjE6CWJ4CXBjCQlcblx0IgorCQkiCWJ4CWxyCQlcblx0IgorCQkiLmFybQkJCQlcblx0IgorCQkiCWFkcglsciwgMmYrMQlcblx0IgorCQkiCWJ4CWxyCQlcblx0IgorCQkiLnRodW1iCQkJCVxuXHQiCisJCSIyOglub3AJCQlcblx0IgorCVRFU1RDQVNFX0VORAorCisJVEVTVF9CRl9SKCJibHgJciIsMCwgMmYrMSwiIikKKwlURVNUX0JCX1IoImJseAlyIiwxNCwyZisxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweDQ3ZjgJQCBibHggcGMiKQorCisJVEVTVF9HUk9VUCgiTG9hZCBmcm9tIExpdGVyYWwgUG9vbCIpCisKKwlURVNUX1goICJsZHIJcjAsIDNmIiwKKwkJIi5hbGlnbgkJCQkJXG5cdCIKKwkJIjM6CS53b3JkCSJfX3N0cmluZ2lmeShWQUwxKSkKKwlURVNUX1goICJsZHIJcjcsIDNmIiwKKwkJIi5zcGFjZSAxMjgJCQkJXG5cdCIKKwkJIi5hbGlnbgkJCQkJXG5cdCIKKwkJIjM6CS53b3JkCSJfX3N0cmluZ2lmeShWQUwyKSkKKworCVRFU1RfR1JPVVAoIjE2LWJpdCBUaHVtYiBMb2FkL3N0b3JlIGluc3RydWN0aW9ucyIpCisKKwlURVNUX1JQUigic3RyCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsIHIiLDIsICA0OCwiXSIpCisJVEVTVF9SUFIoInN0cglyIiw3LCBWQUwyLCIsIFtyIiw2LCAyNCwiLCByIiw1LCAgNDgsIl0iKQorCVRFU1RfUlBSKCJzdHJoCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsIHIiLDIsICA0OCwiXSIpCisJVEVTVF9SUFIoInN0cmgJciIsNywgVkFMMiwiLCBbciIsNiwgMjQsIiwgciIsNSwgIDQ4LCJdIikKKwlURVNUX1JQUigic3RyYglyIiwwLCBWQUwxLCIsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUlBSKCJzdHJiCXIiLDcsIFZBTDIsIiwgW3IiLDYsIDI0LCIsIHIiLDUsICA0OCwiXSIpCisJVEVTVF9QUiggImxkcnNiCXIwLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyc2IJcjcsIFtyIiw2LCAyNCwiLCByIiw1LCAgNTAsIl0iKQorCVRFU1RfUFIoICJsZHIJcjAsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUFIoICJsZHIJcjcsIFtyIiw2LCAyNCwiLCByIiw1LCAgNDgsIl0iKQorCVRFU1RfUFIoICJsZHJoCXIwLCBbciIsMSwgMjQsIiwgciIsMiwgIDQ4LCJdIikKKwlURVNUX1BSKCAibGRyaAlyNywgW3IiLDYsIDI0LCIsIHIiLDUsICA1MCwiXSIpCisJVEVTVF9QUiggImxkcmIJcjAsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUFIoICJsZHJiCXI3LCBbciIsNiwgMjQsIiwgciIsNSwgIDUwLCJdIikKKwlURVNUX1BSKCAibGRyc2gJcjAsIFtyIiwxLCAyNCwiLCByIiwyLCAgNDgsIl0iKQorCVRFU1RfUFIoICJsZHJzaAlyNywgW3IiLDYsIDI0LCIsIHIiLDUsICA1MCwiXSIpCisKKwlURVNUX1JQKCJzdHIJciIsMCwgVkFMMSwiLCBbciIsMSwgMjQsIiwgIzEyMF0iKQorCVRFU1RfUlAoInN0cglyIiw3LCBWQUwyLCIsIFtyIiw2LCAyNCwiLCAjMTIwXSIpCisJVEVTVF9QKCAibGRyCXIwLCBbciIsMSwgMjQsIiwgIzEyMF0iKQorCVRFU1RfUCggImxkcglyNywgW3IiLDYsIDI0LCIsICMxMjBdIikKKwlURVNUX1JQKCJzdHJiCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICMzMF0iKQorCVRFU1RfUlAoInN0cmIJciIsNywgVkFMMiwiLCBbciIsNiwgMjQsIiwgIzMwXSIpCisJVEVTVF9QKCAibGRyYglyMCwgW3IiLDEsIDI0LCIsICMzMF0iKQorCVRFU1RfUCggImxkcmIJcjcsIFtyIiw2LCAyNCwiLCAjMzBdIikKKwlURVNUX1JQKCJzdHJoCXIiLDAsIFZBTDEsIiwgW3IiLDEsIDI0LCIsICM2MF0iKQorCVRFU1RfUlAoInN0cmgJciIsNywgVkFMMiwiLCBbciIsNiwgMjQsIiwgIzYwXSIpCisJVEVTVF9QKCAibGRyaAlyMCwgW3IiLDEsIDI0LCIsICM2MF0iKQorCVRFU1RfUCggImxkcmgJcjcsIFtyIiw2LCAyNCwiLCAjNjBdIikKKworCVRFU1RfUiggInN0cglyIiwwLCBWQUwxLCIsIFtzcCwgIzBdIikKKwlURVNUX1IoICJzdHIJciIsNywgVkFMMiwiLCBbc3AsICMxNjBdIikKKwlURVNUKCAgICJsZHIJcjAsIFtzcCwgIzBdIikKKwlURVNUKCAgICJsZHIJcjcsIFtzcCwgIzE2MF0iKQorCisJVEVTVF9SUCgic3RyCXIiLDAsIFZBTDEsIiwgW3IiLDAsIDI0LCJdIikKKwlURVNUX1AoICJsZHIJcjAsIFtyIiwwLCAyNCwiXSIpCisKKwlURVNUX0dST1VQKCJHZW5lcmF0ZSBQQy0vU1AtcmVsYXRpdmUgYWRkcmVzcyIpCisKKwlURVNUKCJhZGQJcjAsIHBjLCAjNCIpCisJVEVTVCgiYWRkCXI3LCBwYywgIzEwMjAiKQorCVRFU1QoImFkZAlyMCwgc3AsICM0IikKKwlURVNUKCJhZGQJcjcsIHNwLCAjMTAyMCIpCisKKwlURVNUX0dST1VQKCJNaXNjZWxsYW5lb3VzIDE2LWJpdCBpbnN0cnVjdGlvbnMiKQorCisJVEVTVF9VTlNVUFBPUlRFRCggImNwc2llCWkiKQorCVRFU1RfVU5TVVBQT1JURUQoICJjcHNpZAlpIikKKwlURVNUX1VOU1VQUE9SVEVEKCAic2V0ZW5kCWxlIikKKwlURVNUX1VOU1VQUE9SVEVEKCAic2V0ZW5kCWJlIikKKworCVRFU1QoImFkZAlzcCwgIyJfX3N0cmluZ2lmeShURVNUX01FTU9SWV9TSVpFKSkgLyogQXNzdW1lcyBURVNUX01FTU9SWV9TSVpFIDwgMHg0MDAgKi8KKwlURVNUKCJzdWIJc3AsICMweDdmKjQiKQorCitET05UX1RFU1RfSU5fSVRCTE9DSygKKwlURVNUX0JGX1IoICAiY2JueglyIiwwLDAsICIsIDJmIikKKwlURVNUX0JGX1IoICAiY2J6CXIiLDIsLTEsIiwgMmYiKQorCVRFU1RfQkZfUlgoICJjYm56CXIiLDQsMSwgIiwgMmYiLDB4MjApCisJVEVTVF9CRl9SWCggImNieglyIiw3LDAsICIsIDJmIiwweDQwKQorKQorCVRFU1RfUigic3h0aAlyMCwgciIsNywgSEgxLCIiKQorCVRFU1RfUigic3h0aAlyNywgciIsMCwgSEgyLCIiKQorCVRFU1RfUigic3h0YglyMCwgciIsNywgSEgxLCIiKQorCVRFU1RfUigic3h0YglyNywgciIsMCwgSEgyLCIiKQorCVRFU1RfUigidXh0aAlyMCwgciIsNywgSEgxLCIiKQorCVRFU1RfUigidXh0aAlyNywgciIsMCwgSEgyLCIiKQorCVRFU1RfUigidXh0YglyMCwgciIsNywgSEgxLCIiKQorCVRFU1RfUigidXh0YglyNywgciIsMCwgSEgyLCIiKQorCVRFU1RfUigicmV2CXIwLCByIiw3LCBWQUwxLCIiKQorCVRFU1RfUigicmV2CXI3LCByIiwwLCBWQUwyLCIiKQorCVRFU1RfUigicmV2MTYJcjAsIHIiLDcsIFZBTDEsIiIpCisJVEVTVF9SKCJyZXYxNglyNywgciIsMCwgVkFMMiwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhiYTgwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhiYWJmIikKKwlURVNUX1IoInJldnNoCXIwLCByIiw3LCBWQUwxLCIiKQorCVRFU1RfUigicmV2c2gJcjcsIHIiLDAsIFZBTDIsIiIpCisKKyNkZWZpbmUgVEVTVF9QT1BQQyhjb2RlLCBvZmZzZXQpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJXAorCVRFU1RfQVJHX1BUUigxMywgb2Zmc2V0KQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJXAorCVRFU1RfQlJBTkNIX0YoY29kZSwwKQkJXAorCVRFU1RDQVNFX0VORAorCisJVEVTVCgicHVzaAl7cjB9IikKKwlURVNUKCJwdXNoCXtyN30iKQorCVRFU1QoInB1c2gJe3IxNH0iKQorCVRFU1QoInB1c2gJe3IwLXI3LHIxNH0iKQorCVRFU1QoInB1c2gJe3IwLHIyLHI0LHI2LHIxNH0iKQorCVRFU1QoInB1c2gJe3IxLHIzLHI1LHI3fSIpCisJVEVTVCgicG9wCXtyMH0iKQorCVRFU1QoInBvcAl7cjd9IikKKwlURVNUKCJwb3AJe3IwLHIyLHI0LHI2fSIpCisJVEVTVF9QT1BQQygicG9wCXtwY30iLDE1KjQpCisJVEVTVF9QT1BQQygicG9wCXtyMC1yNyxwY30iLDcqNCkKKwlURVNUX1BPUFBDKCJwb3AJe3IxLHIzLHI1LHI3LHBjfSIsMTEqNCkKKwlURVNUX1RIVU1CX1RPX0FSTV9JTlRFUldPUktfUCgicG9wCXtwY30JQCAiLDEzLDE1KjQsIiIpCisJVEVTVF9USFVNQl9UT19BUk1fSU5URVJXT1JLX1AoInBvcAl7cjAtcjcscGN9CUAgIiwxMyw3KjQsIiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJia3B0Lm4JMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiYmtwdC5uCTI1NSIpCisKKwlURVNUX1NVUFBPUlRFRCgieWllbGQiKQorCVRFU1QoInNldiIpCisJVEVTVCgibm9wIikKKwlURVNUKCJ3ZmkiKQorCVRFU1RfU1VQUE9SVEVEKCJ3ZmUiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGJmNTAiKSAvKiBVbmFzc2lnbmVkIGhpbnRzICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4YmZmMCIpIC8qIFVuYXNzaWduZWQgaGludHMgKi8KKworI2RlZmluZSBURVNUX0lUKGNvZGUsIGNvZGUyKQkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCSI1MDoJbm9wCQkJXG5cdCIJXAorCSIxOgkiY29kZSIJCQlcblx0IglcCisJIgkiY29kZTIiCQkJXG5cdCIJXAorCSIyOglub3AJCQlcblx0IglcCisJVEVTVENBU0VfRU5ECisKK0RPTlRfVEVTVF9JTl9JVEJMT0NLKAorCVRFU1RfSVQoIml0CWVxIiwibW92ZXEgcjAsIzAiKQorCVRFU1RfSVQoIml0CXZjIiwibW92dmMgcjAsIzAiKQorCVRFU1RfSVQoIml0CWxlIiwibW92bGUgcjAsIzAiKQorCVRFU1RfSVQoIml0ZQllcSIsIm1vdmVxIHIwLCMwXG5cdCAgbW92bmUgcjEsIzEiKQorCVRFU1RfSVQoIml0ZXQJdmMiLCJtb3Z2YyByMCwjMFxuXHQgIG1vdnZzIHIxLCMxXG5cdCAgbW92dmMgcjIsIzIiKQorCVRFU1RfSVQoIml0ZXRlCWxlIiwibW92bGUgcjAsIzBcblx0ICBtb3ZndCByMSwjMVxuXHQgIG1vdmxlIHIyLCMyXG5cdCAgbW92Z3QgcjMsIzMiKQorCVRFU1RfSVQoIml0dHR0CWxlIiwibW92bGUgcjAsIzBcblx0ICBtb3ZsZSByMSwjMVxuXHQgIG1vdmxlIHIyLCMyXG5cdCAgbW92bGUgcjMsIzMiKQorCVRFU1RfSVQoIml0ZWVlCWxlIiwibW92bGUgcjAsIzBcblx0ICBtb3ZndCByMSwjMVxuXHQgIG1vdmd0IHIyLCMyXG5cdCAgbW92Z3QgcjMsIzMiKQorKQorCisJVEVTVF9HUk9VUCgiTG9hZCBhbmQgc3RvcmUgbXVsdGlwbGUiKQorCisJVEVTVF9QKCJsZG1pYQlyIiw0LCAxNio0LCIhLCB7cjAscjd9IikKKwlURVNUX1AoImxkbWlhCXIiLDcsIDE2KjQsIiEsIHtyMC1yNn0iKQorCVRFU1RfUCgic3RtaWEJciIsNCwgMTYqNCwiISwge3IwLHI3fSIpCisJVEVTVF9QKCJzdG1pYQlyIiwwLCAxNio0LCIhLCB7cjAtcjd9IikKKworCVRFU1RfR1JPVVAoIkNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgU3VwZXJ2aXNvciBDYWxsIGluc3RydWN0aW9ucyIpCisKK0NPTkRJVElPTl9JTlNUUlVDVElPTlMoOCwKKwlURVNUX0JGKCJiZXEJMmYiKQorCVRFU1RfQkIoImJuZQkyYiIpCisJVEVTVF9CRigiYmd0CTJmIikKKwlURVNUX0JCKCJibHQJMmIiKQorKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGRlMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGRlZmYiKQorCVRFU1RfVU5TVVBQT1JURUQoInN2YwkjMHgwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3ZjCSMweGZmIikKKworCVRFU1RfR1JPVVAoIlVuY29uZGl0aW9uYWwgYnJhbmNoIikKKworCVRFU1RfQkYoICAiYgkyZiIpCisJVEVTVF9CQiggICJiCTJiIikKKwlURVNUX0JGX1goImIJMmYiLCAweDQwMCkKKwlURVNUX0JCX1goImIJMmIiLCAweDQwMCkKKworCVRFU1RfR1JPVVAoIlRlc3RpbmcgaW5zdHJ1Y3Rpb25zIGluIElUIGJsb2NrcyIpCisKKwlURVNUX0lUQkxPQ0soInN1YnMubiByMCwgcjAiKQorCisJdmVyYm9zZSgiXG4iKTsKK30KKworCit2b2lkIGtwcm9iZV90aHVtYjMyX3Rlc3RfY2FzZXModm9pZCkKK3sKKwlrcHJvYmVfdGVzdF9mbGFncyA9IDA7CisKKwlURVNUX0dST1VQKCJMb2FkL3N0b3JlIG11bHRpcGxlIikKKworCVRFU1RfVU5TVVBQT1JURUQoInJmZWRiCXNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVpYQlzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgicmZlZGIJc3AhIikKKwlURVNUX1VOU1VQUE9SVEVEKCJyZmVpYQlzcCEiKQorCisJVEVTVF9QKCAgICJzdG1pYQlyIiwwLCAxNio0LCIsIHtyMCxyOH0iKQorCVRFU1RfUCggICAic3RtaWEJciIsNCwgMTYqNCwiLCB7cjAtcjEyLHIxNH0iKQorCVRFU1RfUCggICAic3RtaWEJciIsNywgMTYqNCwiISwge3I4LXIxMixyMTR9IikKKwlURVNUX1AoICAgInN0bWlhCXIiLDEyLDE2KjQsIiEsIHtyMSxyMyxyNSxyNyxyOC1yMTEscjE0fSIpCisKKwlURVNUX1AoICAgImxkbWlhCXIiLDAsIDE2KjQsIiwge3IwLHI4fSIpCisJVEVTVF9QKCAgICJsZG1pYQlyIiw0LCAwLCAgICIsIHtyMC1yMTIscjE0fSIpCisJVEVTVF9CRl9QKCJsZG1pYQlyIiw1LCA4KjQsICIhLCB7cjYtcjEyLHIxNX0iKQorCVRFU1RfUCggICAibGRtaWEJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWlhCXIiLDE0LDE0KjQsIiEsIHtyNCxwY30iKQorCisJVEVTVF9QKCAgICJzdG1kYglyIiwwLCAxNio0LCIsIHtyMCxyOH0iKQorCVRFU1RfUCggICAic3RtZGIJciIsNCwgMTYqNCwiLCB7cjAtcjEyLHIxNH0iKQorCVRFU1RfUCggICAic3RtZGIJciIsNSwgMTYqNCwiISwge3I4LXIxMixyMTR9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDEyLDE2KjQsIiEsIHtyMSxyMyxyNSxyNyxyOC1yMTEscjE0fSIpCisKKwlURVNUX1AoICAgImxkbWRiCXIiLDAsIDE2KjQsIiwge3IwLHI4fSIpCisJVEVTVF9QKCAgICJsZG1kYglyIiw0LCAxNio0LCIsIHtyMC1yMTIscjE0fSIpCisJVEVTVF9CRl9QKCJsZG1kYglyIiw1LCAxNio0LCIhLCB7cjYtcjEyLHIxNX0iKQorCVRFU1RfUCggICAibGRtZGIJciIsMTIsMTYqNCwiISwge3IxLHIzLHI1LHI3LHI4LXIxMSxyMTR9IikKKwlURVNUX0JGX1AoImxkbWRiCXIiLDE0LDE2KjQsIiEsIHtyNCxwY30iKQorCisJVEVTVF9QKCAgICJzdG1kYglyIiwxMywxNio0LCIhLCB7cjMtcjEyLGxyfSIpCisJVEVTVF9QKAkgICJzdG1kYglyIiwxMywxNio0LCIhLCB7cjMtcjEyfSIpCisJVEVTVF9QKCAgICJzdG1kYglyIiwyLCAxNio0LCIsIHtyMy1yMTIsbHJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDEzLDE2KjQsIiEsIHtyMi1yMTIsbHJ9IikKKwlURVNUX1AoICAgInN0bWRiCXIiLDAsIDE2KjQsIiwge3IwLXIxMn0iKQorCVRFU1RfUCggICAic3RtZGIJciIsMCwgMTYqNCwiLCB7cjAtcjEyLGxyfSIpCisKKwlURVNUX0JGX1AoImxkbWlhCXIiLDEzLDUqNCwgIiEsIHtyMy1yMTIscGN9IikKKwlURVNUX1AoCSAgImxkbWlhCXIiLDEzLDUqNCwgIiEsIHtyMy1yMTJ9IikKKwlURVNUX0JGX1AoImxkbWlhCXIiLDIsIDUqNCwgIiEsIHtyMy1yMTIscGN9IikKKwlURVNUX0JGX1AoImxkbWlhCXIiLDEzLDQqNCwgIiEsIHtyMi1yMTIscGN9IikKKwlURVNUX1AoICAgImxkbWlhCXIiLDAsIDE2KjQsIiwge3IwLXIxMn0iKQorCVRFU1RfUCggICAibGRtaWEJciIsMCwgMTYqNCwiLCB7cjAtcjEyLGxyfSIpCisKKwlURVNUX1RIVU1CX1RPX0FSTV9JTlRFUldPUktfUCgibGRtaWEJciIsMCwxNCo0LCIsIHtyMTIscGN9IikKKwlURVNUX1RIVU1CX1RPX0FSTV9JTlRFUldPUktfUCgibGRtaWEJciIsMTMsMio0LCIsIHtyMC1yMTIscGN9IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4OGYsMHgwMTAxCUAgc3RtaWEJcGMsIHtyMCxyOH0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5MmYsMHg1ZjAwCUAgc3RtZGIJcGMhLCB7cjgtcjEyLHIxNH0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4YmQsMHhjMDAwCUAgbGRtaWEJcjEzISwge3IxNCxwY30iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5M2UsMHhjMDAwCUAgbGRtZGIJcjE0ISwge3IxNCxwY30iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4YTcsMHgzZjAwCUAgc3RtaWEJcjchLCB7cjgtcjEyLHNwfSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZThhNywweDlmMDAJQCBzdG1pYQlyNyEsIHtyOC1yMTIscGN9IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOTNlLDB4MjAxMAlAIGxkbWRiCXIxNCEsIHtyNCxzcH0iKQorCisJVEVTVF9HUk9VUCgiTG9hZC9zdG9yZSBkb3VibGUgb3IgZXhjbHVzaXZlLCB0YWJsZSBicmFuY2giKQorCisJVEVTVF9QKCAgImxkcmQJcjAsIHIxLCBbciIsMSwgMjQsIiwgIy0xNl0iKQorCVRFU1QoICAgICJsZHJkCXIxMiwgcjE0LCBbc3AsICMxNl0iKQorCVRFU1RfUCggICJsZHJkCXIxLCByMCwgW3IiLDcsIDI0LCIsICMtMTZdISIpCisJVEVTVCggICAgImxkcmQJcjE0LCByMTIsIFtzcCwgIzE2XSEiKQorCVRFU1RfUCggICJsZHJkCXIxLCByMCwgW3IiLDcsIDI0LCJdLCAjMTYiKQorCVRFU1QoICAgICJsZHJkCXI3LCByOCwgW3NwXSwgIy0xNiIpCisKKwlURVNUX1goICJsZHJkCXIxMiwgcjE0LCAzZiIsCisJCSIuYWxpZ24gMwkJCQlcblx0IgorCQkiMzoJLndvcmQJIl9fc3RyaW5naWZ5KFZBTDEpIglcblx0IgorCQkiCS53b3JkCSJfX3N0cmluZ2lmeShWQUwyKSkKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5ZmYsMHhlYzA0CUAgbGRyZAlyMTQsIHIxMiwgW3BjLCAjMTZdISIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZThmZiwweGVjMDQJQCBsZHJkCXIxNCwgcjEyLCBbcGNdLCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5ZDQsMHhkODAwCUAgbGRyZAlzcCwgcjgsIFtyNF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5ZDQsMHhmODAwCUAgbGRyZAlwYywgcjgsIFtyNF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5ZDQsMHg3ZDAwCUAgbGRyZAlyNywgc3AsIFtyNF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU5ZDQsMHg3ZjAwCUAgbGRyZAlyNywgcGMsIFtyNF0iKQorCisJVEVTVF9SUlAoInN0cmQJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIFtyIiwxLCAyNCwiLCAjLTE2XSIpCisJVEVTVF9SUiggInN0cmQJciIsMTIsVkFMMiwiLCByIiwxNCxWQUwxLCIsIFtzcCwgIzE2XSIpCisJVEVTVF9SUlAoInN0cmQJciIsMSwgVkFMMSwiLCByIiwwLCBWQUwyLCIsIFtyIiw3LCAyNCwiLCAjLTE2XSEiKQorCVRFU1RfUlIoICJzdHJkCXIiLDE0LFZBTDIsIiwgciIsMTIsVkFMMSwiLCBbc3AsICMxNl0hIikKKwlURVNUX1JSUCgic3RyZAlyIiwxLCBWQUwxLCIsIHIiLDAsIFZBTDIsIiwgW3IiLDcsIDI0LCJdLCAjMTYiKQorCVRFU1RfUlIoICJzdHJkCXIiLDcsIFZBTDIsIiwgciIsOCwgVkFMMSwiLCBbc3BdLCAjLTE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOWVmLDB4ZWMwNAlAIHN0cmQJcjE0LCByMTIsIFtwYywgIzE2XSEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4ZWYsMHhlYzA0CUAgc3RyZAlyMTQsIHIxMiwgW3BjXSwgIzE2IikKKworCVRFU1RfUlgoInRiYglbcGMsIHIiLDAsICg5Zi0oMWYrNCkpLCJdIiwKKwkJIjk6CQkJXG5cdCIKKwkJIi5ieXRlCSgyZi0xYi00KT4+MQlcblx0IgorCQkiLmJ5dGUJKDNmLTFiLTQpPj4xCVxuXHQiCisJCSIzOgltdm4JcjAsIHIwCVxuXHQiCisJCSIyOglub3AJCVxuXHQiKQorCisJVEVTVF9SWCgidGJiCVtwYywgciIsNCwgKDlmLSgxZis0KSsxKSwiXSIsCisJCSI5OgkJCVxuXHQiCisJCSIuYnl0ZQkoMmYtMWItNCk+PjEJXG5cdCIKKwkJIi5ieXRlCSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfUlJYKCJ0YmIJW3IiLDEsOWYsIiwgciIsMiwwLCJdIiwKKwkJIjk6CQkJXG5cdCIKKwkJIi5ieXRlCSgyZi0xYi00KT4+MQlcblx0IgorCQkiLmJ5dGUJKDNmLTFiLTQpPj4xCVxuXHQiCisJCSIzOgltdm4JcjAsIHIwCVxuXHQiCisJCSIyOglub3AJCVxuXHQiKQorCisJVEVTVF9SWCgidGJoCVtwYywgciIsNywgKDlmLSgxZis0KSk+PjEsIl0iLAorCQkiOToJCQlcblx0IgorCQkiLnNob3J0CSgyZi0xYi00KT4+MQlcblx0IgorCQkiLnNob3J0CSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfUlgoInRiaAlbcGMsIHIiLDEyLCAoKDlmLSgxZis0KSk+PjEpKzEsIl0iLAorCQkiOToJCQlcblx0IgorCQkiLnNob3J0CSgyZi0xYi00KT4+MQlcblx0IgorCQkiLnNob3J0CSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfUlJYKCJ0YmgJW3IiLDEsOWYsICIsIHIiLDE0LDEsIl0iLAorCQkiOToJCQlcblx0IgorCQkiLnNob3J0CSgyZi0xYi00KT4+MQlcblx0IgorCQkiLnNob3J0CSgzZi0xYi00KT4+MQlcblx0IgorCQkiMzoJbXZuCXIwLCByMAlcblx0IgorCQkiMjoJbm9wCQlcblx0IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGU4ZDEsMHhmMDFmCUAgdGJoIFtyMSwgcGNdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlOGQxLDB4ZjAxZAlAIHRiaCBbcjEsIHNwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZThkZCwweGYwMTIJQCB0YmggW3NwLCByMl0iKQorCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyZXhiCXIwLCByMSwgW3IyXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyZXhoCXIwLCByMSwgW3IyXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgic3RyZXhkCXIwLCByMSwgW3IyXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibGRyZXhiCXIwLCBbcjFdIikKKwlURVNUX1VOU1VQUE9SVEVEKCJsZHJleGgJcjAsIFtyMV0iKQorCVRFU1RfVU5TVVBQT1JURUQoImxkcmV4ZAlyMCwgW3IxXSIpCisKKwlURVNUX0dST1VQKCJEYXRhLXByb2Nlc3NpbmcgKHNoaWZ0ZWQgcmVnaXN0ZXIpIGFuZCAobW9kaWZpZWQgaW1tZWRpYXRlKSIpCisKKyNkZWZpbmUgX0RBVEFfUFJPQ0VTU0lORzMyX0ROTShvcCxzLHZhbCkJCQkJCVwKKwlURVNUX1JSKG9wIHMiLncJcjAsICByIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiIpCQkJXAorCVRFU1RfUlIob3AgcyIJcjEsICByIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgbHNsICMzIikJCVwKKwlURVNUX1JSKG9wIHMiCXIyLCAgciIsMywgVkFMMSwiLCByIiwyLCB2YWwsICIsIGxzciAjNCIpCQlcCisJVEVTVF9SUihvcCBzIglyMywgIHIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBhc3IgIzUiKQkJXAorCVRFU1RfUlIob3AgcyIJcjQsICByIiw1LCBWQUwxLCIsIHIiLDIsIE4odmFsKSwiLCBhc3IgIzYiKQkJXAorCVRFU1RfUlIob3AgcyIJcjUsICByIiw1LCBWQUwxLCIsIHIiLDIsIHZhbCwgIiwgcm9yICM3IikJCVwKKwlURVNUX1JSKG9wIHMiCXI4LCAgciIsOSwgVkFMMSwiLCByIiwxMCx2YWwsICIsIHJyeCIpCQkJXAorCVRFU1RfUiggb3AgcyIJcjAsICByIiwxMSxWQUwxLCIsICMweDAwMDEwMDAxIikJCQlcCisJVEVTVF9SKCBvcCBzIglyMTEsIHIiLDAsIFZBTDEsIiwgIzB4ZjUwMDAwMDAiKQkJCVwKKwlURVNUX1IoIG9wIHMiCXI3LCAgciIsOCwgVkFMMiwiLCAjMHgwMDBhZjAwMCIpCisKKyNkZWZpbmUgREFUQV9QUk9DRVNTSU5HMzJfRE5NKG9wLHZhbCkJCVwKKwlfREFUQV9QUk9DRVNTSU5HMzJfRE5NKG9wLCIiLHZhbCkJXAorCV9EQVRBX1BST0NFU1NJTkczMl9ETk0ob3AsInMiLHZhbCkKKworI2RlZmluZSBEQVRBX1BST0NFU1NJTkczMl9OTShvcCx2YWwpCQkJCQlcCisJVEVTVF9SUihvcCIudwlyIiwxLCBWQUwxLCIsIHIiLDIsIHZhbCwgIiIpCQkJXAorCVRFU1RfUlIob3AiCXIiLDEsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc2wgIzMiKQkJXAorCVRFU1RfUlIob3AiCXIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBsc3IgIzQiKQkJXAorCVRFU1RfUlIob3AiCXIiLDMsIFZBTDEsIiwgciIsMiwgdmFsLCAiLCBhc3IgIzUiKQkJXAorCVRFU1RfUlIob3AiCXIiLDUsIFZBTDEsIiwgciIsMiwgTih2YWwpLCIsIGFzciAjNiIpCQlcCisJVEVTVF9SUihvcCIJciIsNSwgVkFMMSwiLCByIiwyLCB2YWwsICIsIHJvciAjNyIpCQlcCisJVEVTVF9SUihvcCIJciIsOSwgVkFMMSwiLCByIiwxMCx2YWwsICIsIHJyeCIpCQlcCisJVEVTVF9SKCBvcCIJciIsMTEsVkFMMSwiLCAjMHgwMDAxMDAwMSIpCQkJXAorCVRFU1RfUiggb3AiCXIiLDAsIFZBTDEsIiwgIzB4ZjUwMDAwMDAiKQkJCVwKKwlURVNUX1IoIG9wIglyIiw4LCBWQUwyLCIsICMweDAwMGFmMDAwIikKKworI2RlZmluZSBfREFUQV9QUk9DRVNTSU5HMzJfRE0ob3Ascyx2YWwpCQkJCVwKKwlURVNUX1IoIG9wIHMiLncJcjAsICByIiwxNCwgdmFsLCAiIikJCQlcCisJVEVTVF9SKCBvcCBzIglyMSwgIHIiLDEyLCB2YWwsICIsIGxzbCAjMyIpCQlcCisJVEVTVF9SKCBvcCBzIglyMiwgIHIiLDExLCB2YWwsICIsIGxzciAjNCIpCQlcCisJVEVTVF9SKCBvcCBzIglyMywgIHIiLDEwLCB2YWwsICIsIGFzciAjNSIpCQlcCisJVEVTVF9SKCBvcCBzIglyNCwgIHIiLDksIE4odmFsKSwiLCBhc3IgIzYiKQkJXAorCVRFU1RfUiggb3AgcyIJcjUsICByIiw4LCB2YWwsICIsIHJvciAjNyIpCQlcCisJVEVTVF9SKCBvcCBzIglyOCwgIHIiLDcsdmFsLCAiLCBycngiKQkJCVwKKwlURVNUKCAgIG9wIHMiCXIwLCAgIzB4MDAwMTAwMDEiKQkJCVwKKwlURVNUKCAgIG9wIHMiCXIxMSwgIzB4ZjUwMDAwMDAiKQkJCVwKKwlURVNUKCAgIG9wIHMiCXI3LCAgIzB4MDAwYWYwMDAiKQkJCVwKKwlURVNUKCAgIG9wIHMiCXI0LCAgIzB4MDAwMDVhMDAiKQorCisjZGVmaW5lIERBVEFfUFJPQ0VTU0lORzMyX0RNKG9wLHZhbCkJCVwKKwlfREFUQV9QUk9DRVNTSU5HMzJfRE0ob3AsIiIsdmFsKQlcCisJX0RBVEFfUFJPQ0VTU0lORzMyX0RNKG9wLCJzIix2YWwpCisKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oImFuZCIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9OTSgidHN0IiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgiYmljIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgib3JyIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzMyX0RNKCJtb3YiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJvcm4iLDB4ZjAwZjAwZmYpCisJREFUQV9QUk9DRVNTSU5HMzJfRE0oIm12biIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oImVvciIsMHhmMDBmMDBmZikKKwlEQVRBX1BST0NFU1NJTkczMl9OTSgidGVxIiwweGYwMGYwMGZmKQorCURBVEFfUFJPQ0VTU0lORzMyX0ROTSgiYWRkIixWQUwyKQorCURBVEFfUFJPQ0VTU0lORzMyX05NKCJjbW4iLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJhZGMiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJzYmMiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfRE5NKCJzdWIiLFZBTDIpCisJREFUQV9QUk9DRVNTSU5HMzJfTk0oImNtcCIsVkFMMikKKwlEQVRBX1BST0NFU1NJTkczMl9ETk0oInJzYiIsVkFMMikKKworCVRFU1RfUlIoInBraGJ0CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCJwa2hidAlyMTQsciIsMTIsIEhIMSwiLCByIiwxMCxISDIsIiwgbHNsICMyIikKKwlURVNUX1JSKCJwa2h0YglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUigicGtodGIJcjE0LHIiLDEyLCBISDEsIiwgciIsMTAsSEgyLCIsIGFzciAjMiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTE3LDB4MGYwZAlAIHRzdC53IHI3LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWExNywweDBmMGYJQCB0c3QudyByNywgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhMWQsMHgwZjA3CUAgdHN0Lncgc3AsIHI3IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTFmLDB4MGYwNwlAIHRzdC53IHBjLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAxZCwweDFmMDgJQCB0c3Qgc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMDFmLDB4MWYwOAlAIHRzdCBwYywgIzB4MDAwODAwMDgiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE5NywweDBmMGQJQCB0ZXEudyByNywgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhOTcsMHgwZjBmCUAgdGVxLncgcjcsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTlkLDB4MGYwNwlAIHRlcS53IHNwLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE5ZiwweDBmMDcJQCB0ZXEudyBwYywgcjciKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwOWQsMHgxZjA4CUAgdHN0IHNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjA5ZiwweDFmMDgJQCB0c3QgcGMsICMweDAwMDgwMDA4IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViMTcsMHgwZjBkCUAgY21uLncgcjcsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjE3LDB4MGYwZglAIGNtbi53IHI3LCBwYyIpCisJVEVTVF9QKCJjbW4udwlzcCwgciIsNywwLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViMWYsMHgwZjA3CUAgY21uLncgcGMsIHI3IikKKwlURVNUKCAgImNtbglzcCwgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYxMWYsMHgxZjA4CUAgY21uIHBjLCAjMHgwMDA4MDAwOCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYmI3LDB4MGYwZAlAIGNtcC53IHI3LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJiNywweDBmMGYJQCBjbXAudyByNywgcGMiKQorCVRFU1RfUCgiY21wLncJc3AsIHIiLDcsMCwiIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYmJmLDB4MGYwNwlAIGNtcC53IHBjLCByNyIpCisJVEVTVCggICJjbXAJc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMWJmLDB4MWYwOAlAIGNtcCBwYywgIzB4MDAwODAwMDgiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE1ZiwweDA3MGQJQCBtb3ZzLncgcjcsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYTVmLDB4MDcwZglAIG1vdnMudyByNywgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhNWYsMHgwZDA3CUAgbW92cy53IHNwLCByNyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWE0ZiwweDBmMDcJQCBtb3YudyAgcGMsIHI3IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMDRmLDB4MWQwOAlAIG1vdiBzcCwgIzB4MDAwODAwMDgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwNGYsMHgxZjA4CUAgbW92IHBjLCAjMHgwMDA4MDAwOCIpCisKKwlURVNUX1IoImFkZC53CXIwLCBzcCwgciIsMSwgNCwiIikKKwlURVNUX1IoImFkZHMJcjAsIHNwLCByIiwxLCA0LCIsIGFzbCAjMyIpCisJVEVTVF9SKCJhZGQJcjAsIHNwLCByIiwxLCA0LCIsIGFzbCAjNCIpCisJVEVTVF9SKCJhZGQJcjAsIHNwLCByIiwxLCAxNiwiLCByb3IgIzEiKQorCVRFU1RfUigiYWRkLncJc3AsIHNwLCByIiwxLCA0LCIiKQorCVRFU1RfUigiYWRkCXNwLCBzcCwgciIsMSwgNCwiLCBhc2wgIzMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViMGQsMHgxZDAxCUAgYWRkIHNwLCBzcCwgcjEsIGFzbCAjNCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIwZCwweDBkNzEJQCBhZGQgc3AsIHNwLCByMSwgcm9yICMxIikKKwlURVNUKCAgImFkZC53CXIwLCBzcCwgIzI0IikKKwlURVNUKCAgImFkZC53CXNwLCBzcCwgIzI0IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MGYwMQlAIGFkZCBwYywgc3AsIHIxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MDAwZglAIGFkZCByMCwgc3AsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MDAwZAlAIGFkZCByMCwgc3AsIHNwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MGQwZglAIGFkZCBzcCwgc3AsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBkLDB4MGQwZAlAIGFkZCBzcCwgc3AsIHNwIikKKworCVRFU1RfUigic3ViLncJcjAsIHNwLCByIiwxLCA0LCIiKQorCVRFU1RfUigic3VicwlyMCwgc3AsIHIiLDEsIDQsIiwgYXNsICMzIikKKwlURVNUX1IoInN1YglyMCwgc3AsIHIiLDEsIDQsIiwgYXNsICM0IikKKwlURVNUX1IoInN1YglyMCwgc3AsIHIiLDEsIDE2LCIsIHJvciAjMSIpCisJVEVTVF9SKCJzdWIudwlzcCwgc3AsIHIiLDEsIDQsIiIpCisJVEVTVF9SKCJzdWIJc3AsIHNwLCByIiwxLCA0LCIsIGFzbCAjMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWJhZCwweDFkMDEJQCBzdWIgc3AsIHNwLCByMSwgYXNsICM0IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYmFkLDB4MGQ3MQlAIHN1YiBzcCwgc3AsIHIxLCByb3IgIzEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViYWQsMHgwZjAxCUAgc3ViIHBjLCBzcCwgcjEiKQorCVRFU1QoICAic3ViLncJcjAsIHNwLCAjMjQiKQorCVRFU1QoICAic3ViLncJc3AsIHNwLCAjMjQiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwMiwweDAxMGYJQCBhbmQgcjEsIHIyLCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwZiwweDAxMDMJQCBhbmQgcjEsIHBjLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwMiwweDBmMDMJQCBhbmQgcGMsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwMiwweDAxMGQJQCBhbmQgcjEsIHIyLCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwZCwweDAxMDMJQCBhbmQgcjEsIHNwLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWEwMiwweDBkMDMJQCBhbmQgc3AsIHIyLCByMyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAwZCwweDExMDgJQCBhbmQgcjEsIHNwLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAwZiwweDExMDgJQCBhbmQgcjEsIHBjLCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAwMiwweDFkMDgJQCBhbmQgc3AsIHI4LCAjMHgwMDA4MDAwOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjAwMiwweDFmMDgJQCBhbmQgcGMsIHI4LCAjMHgwMDA4MDAwOCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjAyLDB4MDEwZglAIGFkZCByMSwgcjIsIHBjIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjBmLDB4MDEwMwlAIGFkZCByMSwgcGMsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjAyLDB4MGYwMwlAIGFkZCBwYywgcjIsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjAyLDB4MDEwZAlAIGFkZCByMSwgcjIsIHNwIikKKwlURVNUX1NVUFBPUlRFRCggICIuc2hvcnQgMHhlYjBkLDB4MDEwMwlAIGFkZCByMSwgc3AsIHIzIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYjAyLDB4MGQwMwlAIGFkZCBzcCwgcjIsIHIzIikKKwlURVNUX1NVUFBPUlRFRCggICIuc2hvcnQgMHhmMTBkLDB4MTEwOAlAIGFkZCByMSwgc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTBkLDB4MWYwOAlAIGFkZCBwYywgc3AsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTBmLDB4MTEwOAlAIGFkZCByMSwgcGMsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTAyLDB4MWQwOAlAIGFkZCBzcCwgcjgsICMweDAwMDgwMDA4IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTAyLDB4MWYwOAlAIGFkZCBwYywgcjgsICMweDAwMDgwMDA4IikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGVhYTAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYWYwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWIyMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGViODAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYmUwLDB4MDAwMCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMGEwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjBjMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYwZjAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMTIwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjE4MCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYxZTAsMHgwMDAwIikKKworCVRFU1RfR1JPVVAoIkNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhlYzAwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZWZmMCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZjMDAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmZmYwLDB4MDAwMCIpCisKKwlURVNUX0dST1VQKCJEYXRhLXByb2Nlc3NpbmcgKHBsYWluIGJpbmFyeSBpbW1lZGlhdGUpIikKKworCVRFU1RfUigiYWRkdwlyMCwgIHIiLDEsIFZBTDEsIiwgIzB4MTIzIikKKwlURVNUKCAgImFkZHcJcjE0LCBzcCwgIzB4ZjVhIikKKwlURVNUKCAgImFkZHcJc3AsIHNwLCAjMHgyMCIpCisJVEVTVCggICJhZGR3CXI3LCAgcGMsICMweDg4OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjIwZiwweDFmMjAJQCBhZGR3IHBjLCBwYywgIzB4MTIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMjBkLDB4MWYyMAlAIGFkZHcgcGMsIHNwLCAjMHgxMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyMGYsMHgxZDIwCUAgYWRkdyBzcCwgcGMsICMweDEyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjIwMCwweDFkMjAJQCBhZGR3IHNwLCByMCwgIzB4MTIwIikKKworCVRFU1RfUigic3VidwlyMCwgIHIiLDEsIFZBTDEsIiwgIzB4MTIzIikKKwlURVNUKCAgInN1YncJcjE0LCBzcCwgIzB4ZjVhIikKKwlURVNUKCAgInN1YncJc3AsIHNwLCAjMHgyMCIpCisJVEVTVCggICJzdWJ3CXI3LCAgcGMsICMweDg4OCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjJhZiwweDFmMjAJQCBzdWJ3IHBjLCBwYywgIzB4MTIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMmFkLDB4MWYyMAlAIHN1YncgcGMsIHNwLCAjMHgxMjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYyYWYsMHgxZDIwCUAgc3VidyBzcCwgcGMsICMweDEyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjJhMCwweDFkMjAJQCBzdWJ3IHNwLCByMCwgIzB4MTIwIikKKworCVRFU1QoIm1vdncJcjAsICMwIikKKwlURVNUKCJtb3Z3CXIwLCAjMHhmZmZmIikKKwlURVNUKCJtb3Z3CWxyLCAjMHhmZmZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMjQwLDB4MGQwMAlAIG1vdncgc3AsICMwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMjQwLDB4MGYwMAlAIG1vdncgcGMsICMwIikKKworCVRFU1RfUigibW92dAlyIiwwLCBWQUwxLCIsICMwIikKKwlURVNUX1IoIm1vdnQJciIsMCwgVkFMMiwiLCAjMHhmZmZmIikKKwlURVNUX1IoIm1vdnQJciIsMTQsVkFMMSwiLCAjMHhmZmZmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMmMwLDB4MGQwMAlAIG1vdnQgc3AsICMwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMmMwLDB4MGYwMAlAIG1vdnQgcGMsICMwIikKKworCVRFU1RfUiggICAgICJzc2F0CXIwLCAjMjQsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoICAgICAic3NhdAlyMTQsICMyNCwgciIsMTIsIFZBTDIsIiIpCisJVEVTVF9SKCAgICAgInNzYXQJcjAsICMyNCwgciIsMCwgICBWQUwxLCIsIGxzbCAjOCIpCisJVEVTVF9SKCAgICAgInNzYXQJcjE0LCAjMjQsIHIiLDEyLCBWQUwyLCIsIGFzciAjOCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMwYywweDBkMTcJQCBzc2F0CXNwLCAjMjQsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMwYywweDBmMTcJQCBzc2F0CXBjLCAjMjQsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMwZCwweDBjMTcJQCBzc2F0CXIxMiwgIzI0LCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMwZiwweDBjMTcJQCBzc2F0CXIxMiwgIzI0LCBwYyIpCisKKwlURVNUX1IoICAgICAidXNhdAlyMCwgIzI0LCByIiwwLCAgIFZBTDEsIiIpCisJVEVTVF9SKCAgICAgInVzYXQJcjE0LCAjMjQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfUiggICAgICJ1c2F0CXIwLCAjMjQsIHIiLDAsICAgVkFMMSwiLCBsc2wgIzgiKQorCVRFU1RfUiggICAgICJ1c2F0CXIxNCwgIzI0LCByIiwxMiwgVkFMMiwiLCBhc3IgIzgiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzOGMsMHgwZDE3CUAgdXNhdAlzcCwgIzI0LCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzOGMsMHgwZjE3CUAgdXNhdAlwYywgIzI0LCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzOGQsMHgwYzE3CUAgdXNhdAlyMTIsICMyNCwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzOGYsMHgwYzE3CUAgdXNhdAlyMTIsICMyNCwgcGMiKQorCisJVEVTVF9SKCAgICAgInNzYXQxNglyMCwgIzEyLCByIiwwLCAgIEhIMSwiIikKKwlURVNUX1IoICAgICAic3NhdDE2CXIxNCwgIzEyLCByIiwxMiwgSEgyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMmMsMHgwZDBiCUAgc3NhdDE2CXNwLCAjMTIsIHIxMiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjMyYywweDBmMGIJQCBzc2F0MTYJcGMsICMxMiwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzJkLDB4MGMwYglAIHNzYXQxNglyMTIsICMxMiwgc3AiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzMmYsMHgwYzBiCUAgc3NhdDE2CXIxMiwgIzEyLCBwYyIpCisKKwlURVNUX1IoICAgICAidXNhdDE2CXIwLCAjMTIsIHIiLDAsICAgSEgxLCIiKQorCVRFU1RfUiggICAgICJ1c2F0MTYJcjE0LCAjMTIsIHIiLDEyLCBISDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNhYywweDBkMGIJQCB1c2F0MTYJc3AsICMxMiwgcjEyIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmM2FjLDB4MGYwYglAIHVzYXQxNglwYywgIzEyLCByMTIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzYWQsMHgwYzBiCUAgdXNhdDE2CXIxMiwgIzEyLCBzcCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNhZiwweDBjMGIJQCB1c2F0MTYJcjEyLCAjMTIsIHBjIikKKworCVRFU1RfUiggICAgICJzYmZ4CXIwLCByIiwwICAsIFZBTDEsIiwgIzAsICMzMSIpCisJVEVTVF9SKCAgICAgInNiZngJcjE0LCByIiwxMiwgVkFMMiwiLCAjOCwgIzE2IikKKwlURVNUX1IoICAgICAic2JmeAlyNCwgciIsMTAsICBWQUwxLCIsICMxNiwgIzE1IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzRjLDB4MmQwZglAIHNiZngJc3AsIHIxMiwgIzgsICMxNiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM0YywweDJmMGYJQCBzYmZ4CXBjLCByMTIsICM4LCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNGQsMHgyYzBmCUAgc2JmeAlyMTIsIHNwLCAjOCwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzRmLDB4MmMwZglAIHNiZngJcjEyLCBwYywgIzgsICMxNiIpCisKKwlURVNUX1IoICAgICAidWJmeAlyMCwgciIsMCAgLCBWQUwxLCIsICMwLCAjMzEiKQorCVRFU1RfUiggICAgICJ1YmZ4CXIxNCwgciIsMTIsIFZBTDIsIiwgIzgsICMxNiIpCisJVEVTVF9SKCAgICAgInViZngJcjQsIHIiLDEwLCAgVkFMMSwiLCAjMTYsICMxNSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNjYywweDJkMGYJQCB1YmZ4CXNwLCByMTIsICM4LCAjMTYiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzY2MsMHgyZjBmCUAgdWJmeAlwYywgcjEyLCAjOCwgIzE2IikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmM2NkLDB4MmMwZglAIHViZngJcjEyLCBzcCwgIzgsICMxNiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNjZiwweDJjMGYJQCB1YmZ4CXIxMiwgcGMsICM4LCAjMTYiKQorCisJVEVTVF9SKCAgICAgImJmYwlyIiwwLCBWQUwxLCIsICM0LCAjMjAiKQorCVRFU1RfUiggICAgICJiZmMJciIsMTQsVkFMMiwiLCAjNCwgIzIwIikKKwlURVNUX1IoICAgICAiYmZjCXIiLDcsIFZBTDEsIiwgIzAsICMzMSIpCisJVEVTVF9SKCAgICAgImJmYwlyIiw4LCBWQUwyLCIsICMwLCAjMzEiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzNmYsMHgwZDFlCUAgYmZjCXNwLCAjMCwgIzMxIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmMzZmLDB4MGYxZQlAIGJmYwlwYywgIzAsICMzMSIpCisKKwlURVNUX1JSKCAgICAiYmZpCXIiLDAsIFZBTDEsIiwgciIsMCAgLCBWQUwyLCIsICMwLCAjMzEiKQorCVRFU1RfUlIoICAgICJiZmkJciIsMTIsVkFMMSwiLCByIiwxNCAsIFZBTDIsIiwgIzQsICMyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM2ZSwweDFkMTcJQCBiZmkJc3AsIHIxNCwgIzQsICMyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM2ZSwweDFmMTcJQCBiZmkJcGMsIHIxNCwgIzQsICMyMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjM2ZCwweDFlMTcJQCBiZmkJcjE0LCBzcCwgIzQsICMyMCIpCisKKwlURVNUX0dST1VQKCJCcmFuY2hlcyBhbmQgbWlzY2VsbGFuZW91cyBjb250cm9sIikKKworQ09ORElUSU9OX0lOU1RSVUNUSU9OUygyMiwKKwlURVNUX0JGKCJiZXEudwkyZiIpCisJVEVTVF9CQigiYm5lLncJMmIiKQorCVRFU1RfQkYoImJndC53CTJmIikKKwlURVNUX0JCKCJibHQudwkyYiIpCisJVEVTVF9CRl9YKCJicGwudwkyZiIsMHgxMDAwKQorKQorCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCWNwc3IsIHIwIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtc3IJY3Bzcl9mLCByMSIpCisJVEVTVF9VTlNVUFBPUlRFRCgibXNyCXNwc3IsIHIyIikKKworCVRFU1RfVU5TVVBQT1JURUQoImNwc2llLncJaSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiY3BzaWQudwlpIikKKwlURVNUX1VOU1VQUE9SVEVEKCJjcHMJMHgxMyIpCisKKwlURVNUX1NVUFBPUlRFRCgieWllbGQudyIpCisJVEVTVCgic2V2LnciKQorCVRFU1QoIm5vcC53IikKKwlURVNUKCJ3ZmkudyIpCisJVEVTVF9TVVBQT1JURUQoIndmZS53IikKKwlURVNUX1VOU1VQUE9SVEVEKCJkYmcudwkjMCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJjbHJleCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiZHNiIikKKwlURVNUX1VOU1VQUE9SVEVEKCJkbWIiKQorCVRFU1RfVU5TVVBQT1JURUQoImlzYiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCJieGoJcjAiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgic3VicwlwYywgbHIsICM0IikKKworCVRFU1QoIm1ycwlyMCwgY3BzciIpCisJVEVTVCgibXJzCXIxNCwgY3BzciIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjNlZiwweDhkMDAJQCBtcnMJc3AsIHNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGYzZWYsMHg4ZjAwCUAgbXJzCXBjLCBzcHNyIikKKwlURVNUX1VOU1VQUE9SVEVEKCJtcnMJcjAsIHNwc3IiKQorCVRFU1RfVU5TVVBQT1JURUQoIm1ycwlsciwgc3BzciIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmN2YwLDB4ODAwMCBAIHNtYyAjMCIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmN2YwLDB4YTAwMCBAIHVuZGVmZWluZWQiKQorCisJVEVTVF9CRiggICJiLncJMmYiKQorCVRFU1RfQkIoICAiYi53CTJiIikKKwlURVNUX0JGX1goImIudwkyZiIsIDB4MTAwMCkKKworCVRFU1RfQkYoICAiYmwudwkyZiIpCisJVEVTVF9CQiggICJibC53CTJiIikKKwlURVNUX0JCX1goImJsLncJMmIiLCAweDEwMDApCisKKwlURVNUX1goCSJibHgJX19kdW1teV9hcm1fc3Vicm91dGluZSIsCisJCSIuYXJtCQkJCVxuXHQiCisJCSIuYWxpZ24JCQkJXG5cdCIKKwkJIi50eXBlIF9fZHVtbXlfYXJtX3N1YnJvdXRpbmUsICUlZnVuY3Rpb24gXG5cdCIKKwkJIl9fZHVtbXlfYXJtX3N1YnJvdXRpbmU6CVxuXHQiCisJCSJtb3YJcjAsIHBjCQkJXG5cdCIKKwkJImJ4CWxyCQkJXG5cdCIKKwkJIi50aHVtYgkJCQlcblx0IgorCSkKKwlURVNUKAkiYmx4CV9fZHVtbXlfYXJtX3N1YnJvdXRpbmUiKQorCisJVEVTVF9HUk9VUCgiU3RvcmUgc2luZ2xlIGRhdGEgaXRlbSIpCisKKyNkZWZpbmUgU0lOR0xFX1NUT1JFKHNpemUpCQkJCQkJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDAsIFZBTDEsIiwgW3IiLDExLC0xMDI0LCIsICMxMDI0XSIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwxNCxWQUwyLCIsIFtyIiwxLCAtMTAyNCwiLCAjMTA4MF0iKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMCwgVkFMMSwiLCBbciIsMTEsMjU2LCAgIiwgIy0xMjBdIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEsIDI1NiwgICIsICMtMTI4XSIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwwLCBWQUwxLCIsIFtyIiwxMSwyNCwgICJdLCAjMTIwIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEsIDI0LCAgIl0sICMxMjgiKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMCwgVkFMMSwiLCBbciIsMTEsMjQsICAiXSwgIy0xMjAiKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMTQsVkFMMiwiLCBbciIsMSwgMjQsICAiXSwgIy0xMjgiKQkJXAorCVRFU1RfUlAoICJzdHIic2l6ZSIJciIsMCwgVkFMMSwiLCBbciIsMTEsMjQsICAgIiwgIzEyMF0hIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEsIDI0LCAgICIsICMxMjhdISIpCQlcCisJVEVTVF9SUCggInN0ciJzaXplIglyIiwwLCBWQUwxLCIsIFtyIiwxMSwyNTYsICAiLCAjLTEyMF0hIikJCVwKKwlURVNUX1JQKCAic3RyInNpemUiCXIiLDE0LFZBTDIsIiwgW3IiLDEsIDI1NiwgICIsICMtMTI4XSEiKQkJXAorCVRFU1RfUlBSKCJzdHIic2l6ZSIudwlyIiwwLCBWQUwxLCIsIFtyIiwxLCAwLCIsIHIiLDIsIDQsIl0iKQkJXAorCVRFU1RfUlBSKCJzdHIic2l6ZSIJciIsMTQsVkFMMiwiLCBbciIsMTAsMCwiLCByIiwxMSw0LCIsIGxzbCAjMV0iKQlcCisJVEVTVF9SKCAgInN0ciJzaXplIi53CXIiLDcsIFZBTDEsIiwgW3NwLCAjMjRdIikJCQlcCisJVEVTVF9SUCggInN0ciJzaXplIi53CXIiLDAsIFZBTDIsIiwgW3IiLDAsMCwgIl0iKQkJCVwKKwlURVNUX1VOU1VQUE9SVEVEKCJzdHIic2l6ZSJ0CXIwLCBbcjEsICM0XSIpCisKKwlTSU5HTEVfU1RPUkUoImIiKQorCVNJTkdMRV9TVE9SRSgiaCIpCisJU0lOR0xFX1NUT1JFKCIiKQorCisJVEVTVCgic3RyCXNwLCBbc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOGNmLDB4ZTAwMAlAIHN0cglyMTQsIFtwY10iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4Y2UsMHhmMDAwCUAgc3RyCXBjLCBbcjE0XSIpCisKKwlURVNUX0dST1VQKCJBZHZhbmNlZCBTSU1EIGVsZW1lbnQgb3Igc3RydWN0dXJlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY5MDAsMHgwMDAwIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOTJmLDB4ZmZmZiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjk4MCwweDAwMDAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY5ZWYsMHhmZmZmIikKKworCVRFU1RfR1JPVVAoIkxvYWQgc2luZ2xlIGRhdGEgaXRlbSBhbmQgbWVtb3J5IGhpbnRzIikKKworI2RlZmluZSBTSU5HTEVfTE9BRChzaXplKQkJCQkJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwtMTAyNCwgIiwgIzEwMjRdIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjE0LCBbciIsMSwgLTEwMjQsIiwgIzEwODBdIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwyNTYsICAgIiwgIy0xMjBdIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjE0LCBbciIsMSwgMjU2LCAgIiwgIy0xMjhdIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwyNCwgICAiXSwgIzEyMCIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsIDI0LCAgIl0sICMxMjgiKQkJXAorCVRFU1RfUCggImxkciJzaXplIglyMCwgW3IiLDExLDI0LCAgICJdLCAjLTEyMCIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsMjQsICAgIl0sICMtMTI4IikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwyNCwgICAgIiwgIzEyMF0hIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjE0LCBbciIsMSwgMjQsICAgIiwgIzEyOF0hIikJCVwKKwlURVNUX1AoICJsZHIic2l6ZSIJcjAsIFtyIiwxMSwyNTYsICAgIiwgIy0xMjBdISIpCQlcCisJVEVTVF9QKCAibGRyInNpemUiCXIxNCwgW3IiLDEsIDI1NiwgICIsICMtMTI4XSEiKQkJXAorCVRFU1RfUFIoImxkciJzaXplIi53CXIwLCBbciIsMSwgMCwiLCByIiwyLCA0LCJdIikJCVwKKwlURVNUX1BSKCJsZHIic2l6ZSIJcjE0LCBbciIsMTAsMCwiLCByIiwxMSw0LCIsIGxzbCAjMV0iKQlcCisJVEVTVF9YKCAibGRyInNpemUiLncJcjAsIDNmIiwJCQkJXAorCQkiLmFsaWduIDMJCQkJXG5cdCIJCVwKKwkJIjM6CS53b3JkCSJfX3N0cmluZ2lmeShWQUwxKSkJCQlcCisJVEVTVF9YKCAibGRyInNpemUiLncJcjE0LCAzZiIsCQkJCVwKKwkJIi5hbGlnbiAzCQkJCVxuXHQiCQlcCisJCSIzOgkud29yZAkiX19zdHJpbmdpZnkoVkFMMikpCQkJXAorCVRFU1QoICAgImxkciJzaXplIi53CXI3LCAzYiIpCQkJCVwKKwlURVNUKCAgICJsZHIic2l6ZSIudwlyNywgW3NwLCAjMjRdIikJCQkJXAorCVRFU1RfUCggImxkciJzaXplIi53CXIwLCBbciIsMCwwLCAiXSIpCQkJXAorCVRFU1RfVU5TVVBQT1JURUQoImxkciJzaXplInQJcjAsIFtyMSwgIzRdIikKKworCVNJTkdMRV9MT0FEKCJiIikKKwlTSU5HTEVfTE9BRCgic2IiKQorCVNJTkdMRV9MT0FEKCJoIikKKwlTSU5HTEVfTE9BRCgic2giKQorCVNJTkdMRV9MT0FEKCIiKQorCisJVEVTVF9CRl9QKCJsZHIJcGMsIFtyIiwxNCwgMTUqNCwiXSIpCisJVEVTVF9QKCAgICJsZHIJc3AsIFtyIiwxNCwgMTMqNCwiXSIpCisJVEVTVF9CRl9SKCJsZHIJcGMsIFtzcCwgciIsMTQsIDE1KjQsIl0iKQorCVRFU1RfUiggICAibGRyCXNwLCBbc3AsIHIiLDE0LCAxMyo0LCJdIikKKwlURVNUX1RIVU1CX1RPX0FSTV9JTlRFUldPUktfUCgibGRyCXBjLCBbciIsMCwwLCIsICMxNSo0XSIpCisJVEVTVF9TVVBQT1JURUQoImxkcglzcCwgOTlmIikKKwlURVNUX1NVUFBPUlRFRCgibGRyCXBjLCA5OWYiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjg1NCwweDcwMGQJQCBsZHIJcjcsIFtyNCwgc3BdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODU0LDB4NzAwZglAIGxkcglyNywgW3I0LCBwY10iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4MTQsMHg3MDBkCUAgbGRyYglyNywgW3I0LCBzcF0iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4MTQsMHg3MDBmCUAgbGRyYglyNywgW3I0LCBwY10iKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4OWYsMHhkMDA0CUAgbGRyYglzcCwgOTlmIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODE0LDB4ZDAwOAlAIGxkcmIJc3AsIFtyNCwgcjhdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODk0LDB4ZDAwMAlAIGxkcmIJc3AsIFtyNF0iKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjg2MCwweDAwMDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY5ZmYsMHhmZmZmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOTUwLDB4MDAwMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4Zjk1ZiwweGZmZmYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGY4MDAsMHgwODAwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmOTdmLDB4ZmFmZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUKCAgICJwbGkJW3BjLCAjNF0iKQorCVRFU1QoICAgInBsaQlbcGMsICMtNF0iKQorCVRFU1QoICAgInBsZAlbcGMsICM0XSIpCisJVEVTVCggICAicGxkCVtwYywgIy00XSIpCisKKwlURVNUX1AoICJwbGQJW3IiLDAsLTEwMjQsIiwgIzEwMjRdIikKKwlURVNUKCAgICIuc2hvcnQgMHhmOGIwLDB4ZjQwMAlAIHBsZHcJW3IwLCAjMTAyNF0iKQorCVRFU1RfUCggInBsaQlbciIsNCwgMGIsIiwgIzEwMjRdIikKKwlURVNUX1AoICJwbGQJW3IiLDcsIDEyMCwiLCAjLTEyMF0iKQorCVRFU1QoICAgIi5zaG9ydCAweGY4MzcsMHhmYzc4CUAgcGxkdwlbcjcsICMtMTIwXSIpCisJVEVTVF9QKCAicGxpCVtyIiwxMSwxMjAsIiwgIy0xMjBdIikKKwlURVNUKCAgICJwbGQJW3NwLCAjMF0iKQorCisJVEVTVF9QUigicGxkCVtyIiw3LCAyNCwgIiwgciIsMCwgMTYsIl0iKQorCVRFU1RfUFIoInBsZAlbciIsOCwgMjQsICIsIHIiLDEyLDE2LCIsIGxzbCAjM10iKQorCVRFU1RfU1VQUE9SVEVEKCIuc2hvcnQgMHhmODM3LDB4ZjAwMAlAIHBsZHcJW3I3LCByMF0iKQorCVRFU1RfU1VQUE9SVEVEKCIuc2hvcnQgMHhmODM4LDB4ZjAzYwlAIHBsZHcJW3I4LCByMTIsIGxzbCAjM10iKTsKKwlURVNUX1JSKCJwbGkJW3IiLDEyLDBiLCIsIHIiLDAsIDE2LCJdIikKKwlURVNUX1JSKCJwbGkJW3IiLDAsIDBiLCIsIHIiLDEyLDE2LCIsIGxzbCAjM10iKQorCVRFU1RfUiggInBsZAlbc3AsIHIiLDEsIDE2LCJdIikKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmODE3LDB4ZjAwZCAgQHBsZAlbcjcsIHNwXSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZjgxNywweGYwMGYgIEBwbGQJW3I3LCBwY10iKQorCisJVEVTVF9HUk9VUCgiRGF0YS1wcm9jZXNzaW5nIChyZWdpc3RlcikiKQorCisjZGVmaW5lIFNISUZUUzMyKG9wKQkJCQkJXAorCVRFU1RfUlIob3AiCXIwLCAgciIsMSwgVkFMMSwiLCByIiwyLCAzLCAiIikJXAorCVRFU1RfUlIob3AiCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMSwxMCwiIikKKworCVNISUZUUzMyKCJsc2wiKQorCVNISUZUUzMyKCJsc2xzIikKKwlTSElGVFMzMigibHNyIikKKwlTSElGVFMzMigibHNycyIpCisJU0hJRlRTMzIoImFzciIpCisJU0hJRlRTMzIoImFzcnMiKQorCVNISUZUUzMyKCJyb3IiKQorCVNISUZUUzMyKCJyb3JzIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMDEsMHhmZjAyCUAgbHNsCXBjLCByMSwgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMDEsMHhmZDAyCUAgbHNsCXNwLCByMSwgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMGYsMHhmMDAyCUAgbHNsCXIwLCBwYywgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMGQsMHhmMDAyCUAgbHNsCXIwLCBzcCwgcjIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMDEsMHhmMDBmCUAgbHNsCXIwLCByMSwgcGMiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMDEsMHhmMDBkCUAgbHNsCXIwLCByMSwgc3AiKQorCisJVEVTVF9SUiggICAgInN4dGFoCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3h0YWgJcjE0LHIiLDEyLCBISDIsIiwgciIsMTAsSEgxLCIsIHJvciAjOCIpCisJVEVTVF9SKCAgICAgInN4dGgJcjgsIHIiLDcsICBISDEsIiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTBmLDB4ZmY4NwlAIHN4dGgJcGMsIHI3Iik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmEwZiwweGZkODcJQCBzeHRoCXNwLCByNyIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhMGYsMHhmODhmCUAgc3h0aAlyOCwgcGMiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTBmLDB4Zjg4ZAlAIHN4dGgJcjgsIHNwIik7CisKKwlURVNUX1JSKCAgICAidXh0YWgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1eHRhaAlyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAidXh0aAlyOCwgciIsNywgIEhIMSwiIikKKworCVRFU1RfUlIoICAgICJzeHRhYjE2CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic3h0YWIxNglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAic3h0YjE2CXI4LCByIiw3LCAgSEgxLCIiKQorCisJVEVTVF9SUiggICAgInV4dGFiMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJ1eHRhYjE2CXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJ1eHRiMTYJcjgsIHIiLDcsICBISDEsIiIpCisKKwlURVNUX1JSKCAgICAic3h0YWIJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzeHRhYglyMTQsciIsMTIsIEhIMiwiLCByIiwxMCxISDEsIiwgcm9yICM4IikKKwlURVNUX1IoICAgICAic3h0YglyOCwgciIsNywgIEhIMSwiIikKKworCVRFU1RfUlIoICAgICJ1eHRhYglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInV4dGFiCXIxNCxyIiwxMiwgSEgyLCIsIHIiLDEwLEhIMSwiLCByb3IgIzgiKQorCVRFU1RfUiggICAgICJ1eHRiCXI4LCByIiw3LCAgSEgxLCIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmE2MCwweDAwZjAiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhN2YsMHhmZmZmIikKKworI2RlZmluZSBQQVJBTExFTF9BRERfU1VCKG9wKQkJCQkJXAorCVRFU1RfUlIoICBvcCJhZGQxNglyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCVwKKwlURVNUX1JSKCAgb3AiYWRkMTYJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQlcCisJVEVTVF9SUiggIG9wImFzeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCVwKKwlURVNUX1JSKCAgb3AiYXN4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikJXAorCVRFU1RfUlIoICBvcCJzYXgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQlcCisJVEVTVF9SUiggIG9wInNheAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiIpCVwKKwlURVNUX1JSKCAgb3Aic3ViMTYJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQlcCisJVEVTVF9SUiggIG9wInN1YjE2CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikJXAorCVRFU1RfUlIoICBvcCJhZGQ4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikJXAorCVRFU1RfUlIoICBvcCJhZGQ4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikJXAorCVRFU1RfUlIoICBvcCJzdWI4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikJXAorCVRFU1RfUlIoICBvcCJzdWI4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKworCVRFU1RfR1JPVVAoIlBhcmFsbGVsIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiwgc2lnbmVkIikKKworCVBBUkFMTEVMX0FERF9TVUIoInMiKQorCVBBUkFMTEVMX0FERF9TVUIoInEiKQorCVBBUkFMTEVMX0FERF9TVUIoInNoIikKKworCVRFU1RfR1JPVVAoIlBhcmFsbGVsIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiwgdW5zaWduZWQiKQorCisJUEFSQUxMRUxfQUREX1NVQigidSIpCisJUEFSQUxMRUxfQUREX1NVQigidXEiKQorCVBBUkFMTEVMX0FERF9TVUIoInVoIikKKworCVRFU1RfR1JPVVAoIk1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucyIpCisKKwlURVNUX1JSKCJxYWRkCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUigicWFkZAlsciwgciIsOSwgVkFMMiwiLCByIiw4LCBWQUwxLCIiKQorCVRFU1RfUlIoInFzdWIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCJxc3ViCWxyLCByIiw5LCBWQUwyLCIsIHIiLDgsIFZBTDEsIiIpCisJVEVTVF9SUigicWRhZGQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCJxZGFkZAlsciwgciIsOSwgVkFMMiwiLCByIiw4LCBWQUwxLCIiKQorCVRFU1RfUlIoInFkc3ViCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUigicWRzdWIJbHIsIHIiLDksIFZBTDIsIiwgciIsOCwgVkFMMSwiIikKKworCVRFU1RfUigicmV2LncJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoInJldglyMTQsIHIiLDEyLCBWQUwyLCIiKQorCVRFU1RfUigicmV2MTYudwlyMCwgciIsMCwgICBWQUwxLCIiKQorCVRFU1RfUigicmV2MTYJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoInJiaXQJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoInJiaXQJcjE0LCByIiwxMiwgVkFMMiwiIikKKwlURVNUX1IoInJldnNoLncJcjAsIHIiLDAsICAgVkFMMSwiIikKKwlURVNUX1IoInJldnNoCXIxNCwgciIsMTIsIFZBTDIsIiIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTljLDB4ZmY4YwlAIHJldglwYywgcjEyIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmE5YywweGZkOGMJQCByZXYJc3AsIHIxMiIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhOWYsMHhmZThmCUAgcmV2CXIxNCwgcGMiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYTlkLDB4ZmU4ZAlAIHJldglyMTQsIHNwIik7CisKKwlURVNUX1JSKCJzZWwJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiIpCisJVEVTVF9SUigic2VsCXIxNCwgciIsMTIsVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKworCVRFU1RfUigiY2x6CXIwLCByIiwwLCAweDAsIiIpCisJVEVTVF9SKCJjbHoJcjcsIHIiLDE0LDB4MSwiIikKKwlURVNUX1IoImNseglsciwgciIsNywgMHhmZmZmZmZmZiwiIikKKworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhODAsMHhmMDMwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYWZmLDB4ZmY3ZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmFiMCwweGYwMDAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZhZmYsMHhmZjdmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKworCVRFU1RfR1JPVVAoIk11bHRpcGx5LCBtdWx0aXBseSBhY2N1bXVsYXRlLCBhbmQgYWJzb2x1dGUgZGlmZmVyZW5jZSBvcGVyYXRpb25zIikKKworCVRFU1RfUlIoICAgICJtdWwJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAibXVsCXI3LCByIiw4LCBWQUwyLCIsIHIiLDksIFZBTDIsIiIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwOCwweGZmMDkJQCBtdWwJcGMsIHI4LCByOSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwOCwweGZkMDkJQCBtdWwJc3AsIHI4LCByOSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwZiwweGY3MDkJQCBtdWwJcjcsIHBjLCByOSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwZCwweGY3MDkJQCBtdWwJcjcsIHNwLCByOSIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwOCwweGY3MGYJQCBtdWwJcjcsIHI4LCBwYyIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwOCwweGY3MGQJQCBtdWwJcjcsIHI4LCBzcCIpCisKKwlURVNUX1JSUiggICAibWxhCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgIm1sYQlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhhZjA5CUAgbWxhCXBjLCByOCwgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhhZDA5CUAgbWxhCXNwLCByOCwgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMGYsMHhhNzA5CUAgbWxhCXI3LCBwYywgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMGQsMHhhNzA5CUAgbWxhCXI3LCBzcCwgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhhNzBmCUAgbWxhCXI3LCByOCwgcGMsIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhhNzBkCUAgbWxhCXI3LCByOCwgc3AsIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMDgsMHhkNzA5CUAgbWxhCXI3LCByOCwgcjksIHNwIik7CisKKwlURVNUX1JSUiggICAibWxzCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgIm1scwlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCisJVEVTVF9SUlIoICAgInNtbGFiYglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhYmIJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21sYXRiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgInNtbGF0YglyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhYnQJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiLCByIiwzLCAgVkFMMywiIikKKwlURVNUX1JSUiggICAic21sYWJ0CXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiwgciIsMTAsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbGF0dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhdHQJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bGJiCXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWxiYglyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCVRFU1RfUlIoICAgICJzbXVsdGIJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHRiCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SUiggICAgInNtdWxidAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsYnQJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKwlURVNUX1JSKCAgICAic211bHR0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWx0dAlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIiKQorCisJVEVTVF9SUlIoICAgInNtbGFkCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhZAlyMTQsIHIiLDEyLEhIMiwiLCByIiwxMCxISDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21sYWR4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhZHgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtdWFkCXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic211YWQJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCVRFU1RfUlIoICAgICJzbXVhZHgJcjAsIHIiLDAsICBISDEsIiwgciIsMSwgSEgyLCIiKQorCVRFU1RfUlIoICAgICJzbXVhZHgJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIiKQorCisJVEVTVF9SUlIoICAgInNtbGF3YglyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIsIHIiLDMsICBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJzbWxhd2IJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiLCByIiwxMCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21sYXd0CXIwLCByIiwxLCBWQUwxLCIsIHIiLDIsIFZBTDIsIiwgciIsMywgIFZBTDMsIiIpCisJVEVTVF9SUlIoICAgInNtbGF3dAlyNywgciIsOCwgVkFMMywiLCByIiw5LCBWQUwxLCIsIHIiLDEwLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsd2IJcjAsIHIiLDEsIFZBTDEsIiwgciIsMiwgVkFMMiwiIikKKwlURVNUX1JSKCAgICAic211bHdiCXI3LCByIiw4LCBWQUwzLCIsIHIiLDksIFZBTDEsIiIpCisJVEVTVF9SUiggICAgInNtdWx3dAlyMCwgciIsMSwgVkFMMSwiLCByIiwyLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVsd3QJcjcsIHIiLDgsIFZBTDMsIiwgciIsOSwgVkFMMSwiIikKKworCVRFU1RfUlJSKCAgICJzbWxzZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sc2QJcjE0LCByIiwxMixISDIsIiwgciIsMTAsSEgxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9SUlIoICAgInNtbHNkeAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21sc2R4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbXVzZAlyMCwgciIsMCwgIEhIMSwiLCByIiwxLCBISDIsIiIpCisJVEVTVF9SUiggICAgInNtdXNkCXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKwlURVNUX1JSKCAgICAic211c2R4CXIwLCByIiwwLCAgSEgxLCIsIHIiLDEsIEhIMiwiIikKKwlURVNUX1JSKCAgICAic211c2R4CXIxNCwgciIsMTIsSEgyLCIsIHIiLDEwLEhIMSwiIikKKworCVRFU1RfUlJSKCAgICJzbW1sYQlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwxLCIiKQorCVRFU1RfUlJSKCAgICJzbW1sYQlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCVRFU1RfUlJSKCAgICJzbW1sYXIJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21tbGFyCXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIsIHIiLDgsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInNtbXVsCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbW11bAlyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiIikKKwlURVNUX1JSKCAgICAic21tdWxyCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIiKQorCVRFU1RfUlIoICAgICJzbW11bHIJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiIpCisKKwlURVNUX1JSUiggICAic21tbHMJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMSwiIikKKwlURVNUX1JSUiggICAic21tbHMJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMiwiIikKKwlURVNUX1JSUiggICAic21tbHNyCXIwLCByIiwwLCAgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDEsIiIpCisJVEVTVF9SUlIoICAgInNtbWxzcglyMTQsIHIiLDEyLFZBTDIsIiwgciIsMTAsVkFMMSwiLCByIiw4LCBWQUwyLCIiKQorCisJVEVTVF9SUlIoICAgInVzYWRhOAlyMCwgciIsMCwgIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIiKQorCVRFU1RfUlJSKCAgICJ1c2FkYTgJcjE0LCByIiwxMixWQUwyLCIsIHIiLDEwLFZBTDEsIiwgciIsOCwgVkFMMywiIikKKwlURVNUX1JSKCAgICAidXNhZDgJcjAsIHIiLDAsICBWQUwxLCIsIHIiLDEsIFZBTDIsIiIpCisJVEVTVF9SUiggICAgInVzYWQ4CXIxNCwgciIsMTIsVkFMMiwiLCByIiwxMCxWQUwxLCIiKQorCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmIwMCwweGYwMTAiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiMGYsMHhmZjFmIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjcwLDB4ZjAxMCIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI3ZiwweGZmMWYiKSAvKiBVbmFsbG9jYXRlZCBzcGFjZSAqLworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiNzAsMHgwMDEwIikgLyogVW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjdmLDB4ZmYxZiIpIC8qIFVuYWxsb2NhdGVkIHNwYWNlICovCisKKwlURVNUX0dST1VQKCJMb25nIG11bHRpcGx5LCBsb25nIG11bHRpcGx5IGFjY3VtdWxhdGUsIGFuZCBkaXZpZGUiKQorCisJVEVTVF9SUiggICAic211bGwJcjAsIHIxLCByIiwyLCBWQUwxLCIsIHIiLDMsIFZBTDIsIiIpCisJVEVTVF9SUiggICAic211bGwJcjcsIHI4LCByIiw5LCBWQUwyLCIsIHIiLDEwLCBWQUwxLCIiKQorCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiODksMHhmODBhCUAgc211bGwJcGMsIHI4LCByOSwgcjEwIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI4OSwweGQ4MGEJQCBzbXVsbAlzcCwgcjgsIHI5LCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjg5LDB4N2YwYQlAIHNtdWxsCXI3LCBwYywgcjksIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiODksMHg3ZDBhCUAgc211bGwJcjcsIHNwLCByOSwgcjEwIik7CisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmI4ZiwweDc4MGEJQCBzbXVsbAlyNywgcjgsIHBjLCByMTAiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjhkLDB4NzgwYQlAIHNtdWxsCXI3LCByOCwgc3AsIHIxMCIpOworCVRFU1RfVU5TVVBQT1JURUQoIi5zaG9ydCAweGZiODksMHg3ODBmCUAgc211bGwJcjcsIHI4LCByOSwgcGMiKTsKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYjg5LDB4NzgwZAlAIHNtdWxsCXI3LCByOCwgcjksIHNwIik7CisKKwlURVNUX1JSKCAgICJ1bXVsbAlyMCwgcjEsIHIiLDIsIFZBTDEsIiwgciIsMywgVkFMMiwiIikKKwlURVNUX1JSKCAgICJ1bXVsbAlyNywgcjgsIHIiLDksIFZBTDIsIiwgciIsMTAsIFZBTDEsIiIpCisKKwlURVNUX1JSUlIoICJzbWxhbAlyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggInNtbGFsCXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisKKwlURVNUX1JSUlIoICJzbWxhbGJiCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAic21sYWxiYglyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSUiggInNtbGFsYnQJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICJzbWxhbGJ0CXIiLDgsIFZBTDQsIiwgciIsOSwgVkFMMSwiLCByIiwxMCxWQUwyLCIsIHIiLDExLFZBTDMpCisJVEVTVF9SUlJSKCAic21sYWx0YglyIiwwLCBWQUwxLCIsIHIiLDEsIFZBTDIsIiwgciIsMiwgVkFMMywiLCByIiwzLCBWQUw0KQorCVRFU1RfUlJSUiggInNtbGFsdGIJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKwlURVNUX1JSUlIoICJzbWxhbHR0CXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAic21sYWx0dAlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCisJVEVTVF9SUlJSKCAic21sYWxkCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxhbGQJciIsMTEsVkFMMiwiLCByIiwxMCxWQUwxLCAiLCByIiw5LCBISDIsIiwgciIsOCwgSEgxKQorCVRFU1RfUlJSUiggInNtbGFsZHgJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCAiLCByIiwwLCBISDEsIiwgciIsMSwgSEgyKQorCVRFU1RfUlJSUiggInNtbGFsZHgJciIsMTEsVkFMMiwiLCByIiwxMCxWQUwxLCAiLCByIiw5LCBISDIsIiwgciIsOCwgSEgxKQorCisJVEVTVF9SUlJSKCAic21sc2xkCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwgIiwgciIsMCwgSEgxLCIsIHIiLDEsIEhIMikKKwlURVNUX1JSUlIoICJzbWxzbGQJciIsMTEsVkFMMiwiLCByIiwxMCxWQUwxLCAiLCByIiw5LCBISDIsIiwgciIsOCwgSEgxKQorCVRFU1RfUlJSUiggInNtbHNsZHgJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCAiLCByIiwwLCBISDEsIiwgciIsMSwgSEgyKQorCVRFU1RfUlJSUiggInNtbHNsZHgJciIsMTEsVkFMMiwiLCByIiwxMCxWQUwxLCAiLCByIiw5LCBISDIsIiwgciIsOCwgSEgxKQorCisJVEVTVF9SUlJSKCAidW1sYWwJciIsMCwgVkFMMSwiLCByIiwxLCBWQUwyLCIsIHIiLDIsIFZBTDMsIiwgciIsMywgVkFMNCkKKwlURVNUX1JSUlIoICJ1bWxhbAlyIiw4LCBWQUw0LCIsIHIiLDksIFZBTDEsIiwgciIsMTAsVkFMMiwiLCByIiwxMSxWQUwzKQorCVRFU1RfUlJSUiggInVtYWFsCXIiLDAsIFZBTDEsIiwgciIsMSwgVkFMMiwiLCByIiwyLCBWQUwzLCIsIHIiLDMsIFZBTDQpCisJVEVTVF9SUlJSKCAidW1hYWwJciIsOCwgVkFMNCwiLCByIiw5LCBWQUwxLCIsIHIiLDEwLFZBTDIsIiwgciIsMTEsVkFMMykKKworCVRFU1RfR1JPVVAoIkNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyIpCisKKwlURVNUX1VOU1VQUE9SVEVEKCIuc2hvcnQgMHhmYzAwLDB4MDAwMCIpCisJVEVTVF9VTlNVUFBPUlRFRCgiLnNob3J0IDB4ZmZmZiwweGZmZmYiKQorCisJVEVTVF9HUk9VUCgiVGVzdGluZyBpbnN0cnVjdGlvbnMgaW4gSVQgYmxvY2tzIikKKworCVRFU1RfSVRCTE9DSygic3ViLncJcjAsIHIwIikKKworCXZlcmJvc2UoIlxuIik7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdjZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGVzdC5jCkBAIC0wLDAgKzEsMTc0OCBAQAorLyoKKyAqIGFyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKb24gTWVkaHVyc3QgPHRpeHlAeXhpdC5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRlc3QgY29kZSBmb3IgQVJNIGtwcm9iZXMuCisgKgorICogVGhlIHRvcCBsZXZlbCBmdW5jdGlvbiBydW5fYWxsX3Rlc3RzKCkgZXhlY3V0ZXMgdGVzdHMgZm9yIGFsbCBvZiB0aGUKKyAqIHN1cHBvcnRlZCBpbnN0cnVjdGlvbiBzZXRzOiBBUk0sIDE2LWJpdCBUaHVtYiwgYW5kIDMyLWJpdCBUaHVtYi4gVGhlc2UgdGVzdHMKKyAqIGZhbGwgaW50byB0d28gY2F0ZWdvcmllczsgcnVuX2FwaV90ZXN0cygpIGNoZWNrcyBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZQorICoga3Byb2JlcyBBUEksIGFuZCBydW5fdGVzdF9jYXNlcygpIGlzIGEgY29tcHJlaGVuc2l2ZSB0ZXN0IGZvciBrcHJvYmVzCisgKiBpbnN0cnVjdGlvbiBkZWNvZGluZyBhbmQgc2ltdWxhdGlvbi4KKyAqCisgKiBydW5fdGVzdF9jYXNlcygpIGZpcnN0IGNoZWNrcyB0aGUga3Byb2JlcyBkZWNvZGluZyB0YWJsZSBmb3Igc2VsZiBjb25zaXN0ZW5jeQorICogKHVzaW5nIHRhYmxlX3Rlc3QoKSkgdGhlbiBleGVjdXRlcyBhIHNlcmllcyBvZiB0ZXN0IGNhc2VzIGZvciBlYWNoIG9mIHRoZSBDUFUKKyAqIGluc3RydWN0aW9uIGZvcm1zLiBjb3ZlcmFnZV9zdGFydCgpIGFuZCBjb3ZlcmFnZV9lbmQoKSBhcmUgdXNlZCB0byB2ZXJpZnkKKyAqIHRoYXQgdGhlc2UgdGVzdCBjYXNlcyBjb3ZlciBhbGwgb2YgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnN0cnVjdGlvbnMKKyAqIGRlc2NyaWJlZCBieSB0aGUga3Byb2JlcyBkZWNvZGluZyB0YWJsZXMuCisgKgorICogVGhlIGluZGl2aWR1YWwgdGVzdCBjYXNlcyBhcmUgaW4ga3Byb2Jlcy10ZXN0LWFybS5jIGFuZCBrcHJvYmVzLXRlc3QtdGh1bWIuYworICogd2hpY2ggdXNlIHRoZSBtYWNyb3MgZGVmaW5lZCBpbiBrcHJvYmVzLXRlc3QuaC4gVGhlIHJlc3Qgb2YgdGhpcworICogZG9jdW1lbnRhdGlvbiB3aWxsIGRlc2NyaWJlIHRoZSBvcGVyYXRpb24gb2YgdGhlIGZyYW1ld29yayB1c2VkIGJ5IHRoZXNlCisgKiB0ZXN0IGNhc2VzLgorICovCisKKy8qCisgKiBURVNUSU5HIE1FVEhPRE9MT0dZCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIG1ldGhvZG9sb2d5IHVzZWQgdG8gdGVzdCBhbiBBUk0gaW5zdHJ1Y3Rpb24gJ3Rlc3RfaW5zbicgaXMgdG8gdXNlCisgKiBpbmxpbmUgYXNzZW1ibGVyIGxpa2U6CisgKgorICogdGVzdF9iZWZvcmU6IG5vcAorICogdGVzdF9jYXNlOgl0ZXN0X2luc24KKyAqIHRlc3RfYWZ0ZXI6CW5vcAorICoKKyAqIFdoZW4gdGhlIHRlc3QgY2FzZSBpcyBydW4gYSBrcHJvYmUgaXMgcGxhY2VkIG9mIGVhY2ggbm9wLiBUaGUKKyAqIHBvc3QtaGFuZGxlciBvZiB0aGUgdGVzdF9iZWZvcmUgcHJvYmUgaXMgdXNlZCB0byBtb2RpZnkgdGhlIHNhdmVkIENQVQorICogcmVnaXN0ZXIgY29udGV4dCB0byB0aGF0IHdoaWNoIHdlIHJlcXVpcmUgZm9yIHRoZSB0ZXN0IGNhc2UuIFRoZQorICogcHJlLWhhbmRsZXIgb2YgdGhlIG9mIHRoZSB0ZXN0X2FmdGVyIHByb2JlIHNhdmVzIGEgY29weSBvZiB0aGUgQ1BVCisgKiByZWdpc3RlciBjb250ZXh0LiBJbiB0aGlzIHdheSB3ZSBjYW4gZXhlY3V0ZSB0ZXN0X2luc24gd2l0aCBhIHNwZWNpZmljCisgKiByZWdpc3RlciBjb250ZXh0IGFuZCBzZWUgdGhlIHJlc3VsdHMgYWZ0ZXJ3YXJkcy4KKyAqCisgKiBUbyBhY3R1YWxseSB0ZXN0IHRoZSBrcHJvYmVzIGluc3RydWN0aW9uIGVtdWxhdGlvbiB3ZSBwZXJmb3JtIHRoZSBhYm92ZQorICogc3RlcCBhIHNlY29uZCB0aW1lIGJ1dCB3aXRoIGFuIGFkZGl0aW9uYWwga3Byb2JlIG9uIHRoZSB0ZXN0X2Nhc2UKKyAqIGluc3RydWN0aW9uIGl0c2VsZi4gSWYgdGhlIGVtdWxhdGlvbiBpcyBhY2N1cmF0ZSB0aGVuIHRoZSByZXN1bHRzIHNlZW4KKyAqIGJ5IHRoZSB0ZXN0X2FmdGVyIHByb2JlIHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZSBmaXJzdCBydW4gd2hpY2ggZGlkbid0CisgKiBoYXZlIGEgcHJvYmUgb24gdGVzdF9jYXNlLgorICoKKyAqIEVhY2ggdGVzdCBjYXNlIGlzIHJ1biBzZXZlcmFsIHRpbWVzIHdpdGggYSB2YXJpZXR5IG9mIHZhcmlhdGlvbnMgaW4gdGhlCisgKiBmbGFncyB2YWx1ZSBvZiBzdG9yZWQgaW4gQ1BTUiwgYW5kIGZvciBUaHVtYiBjb2RlLCBkaWZmZXJlbnQgSVRTdGF0ZS4KKyAqCisgKiBGb3IgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBtb2RpZnkgUEMsIGEgc2Vjb25kIHRlc3RfYWZ0ZXIgcHJvYmUgaXMgdXNlZAorICogbGlrZSB0aGlzOgorICoKKyAqIHRlc3RfYmVmb3JlOiBub3AKKyAqIHRlc3RfY2FzZToJdGVzdF9pbnNuCisgKiB0ZXN0X2FmdGVyOglub3AKKyAqCQliIHRlc3RfZG9uZQorICogdGVzdF9hZnRlcjI6IG5vcAorICogdGVzdF9kb25lOgorICoKKyAqIFRoZSB0ZXN0IGNhc2UgaXMgY29uc3RydWN0ZWQgc3VjaCB0aGF0IHRlc3RfaW5zbiBicmFuY2hlcyB0bworICogdGVzdF9hZnRlcjIsIG9yLCBpZiB0ZXN0aW5nIGEgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24sIGl0IG1heSBqdXN0CisgKiBjb250aW51ZSB0byB0ZXN0X2FmdGVyLiBUaGUgcHJvYmVzIGluc2VydGVkIGF0IGJvdGggbG9jYXRpb25zIGxldCB1cworICogZGV0ZXJtaW5lIHdoaWNoIGhhcHBlbmVkLiBBIHNpbWlsYXIgYXBwcm9hY2ggaXMgdXNlZCBmb3IgdGVzdGluZworICogYmFja3dhcmRzIGJyYW5jaGVzLi4uCisgKgorICoJCWIgdGVzdF9iZWZvcmUKKyAqCQliIHRlc3RfZG9uZSAgQCBoZWxwcyB0byBjb3BlIHdpdGggb2ZmIGJ5IDEgYnJhbmNoZXMKKyAqIHRlc3RfYWZ0ZXIyOiBub3AKKyAqCQliIHRlc3RfZG9uZQorICogdGVzdF9iZWZvcmU6IG5vcAorICogdGVzdF9jYXNlOgl0ZXN0X2luc24KKyAqIHRlc3RfYWZ0ZXI6CW5vcAorICogdGVzdF9kb25lOgorICoKKyAqIFRoZSBtYWNyb3MgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9ucyBkZXNjcmliZSBhYm92ZQorICogYXJlIFRFU1RfSU5TVFJVQ1RJT04sIFRFU1RfQlJBTkNIX0YgKGJyYW5jaCBmb3J3YXJkcykgYW5kIFRFU1RfQlJBTkNIX0IKKyAqIChicmFuY2ggYmFja3dhcmRzKS4gSW4gdGhlc2UsIHRoZSBsb2NhbCB2YXJpYWJsZXMgbnVtYmVyZWQgMSwgNTAsIDIgYW5kCisgKiA5OSByZXByZXNlbnQ6IHRlc3RfYmVmb3JlLCB0ZXN0X2Nhc2UsIHRlc3RfYWZ0ZXIyIGFuZCB0ZXN0X2RvbmUuCisgKgorICogRlJBTUVXT1JLCisgKiAtLS0tLS0tLS0KKyAqCisgKiBFYWNoIHRlc3QgY2FzZSBpcyB3cmFwcGVkIGJldHdlZW4gdGhlIHBhaXIgb2YgbWFjcm9zIFRFU1RDQVNFX1NUQVJUIGFuZAorICogVEVTVENBU0VfRU5ELiBBcyB3ZWxsIGFzIHBlcmZvcm1pbmcgdGhlIGlubGluZSBhc3NlbWJsZXIgYm9pbGVycGxhdGUsCisgKiB0aGVzZSBjYWxsIG91dCB0byB0aGUga3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQoKSBhbmQKKyAqIGtwcm9iZXNfdGVzdF9jYXNlX2VuZCgpIGZ1bmN0aW9ucyB3aGljaCBkcml2ZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0ZXN0CisgKiBjYXNlLiBUaGUgc3BlY2lmaWMgYXJndW1lbnRzIHRvIHVzZSBmb3IgZWFjaCB0ZXN0IGNhc2UgYXJlIHN0b3JlZCBhcworICogaW5saW5lIGRhdGEgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHZhcmlvdXMgVEVTVF9BUkdfKiBtYWNyb3MuIFB1dHRpbmcKKyAqIHRoaXMgYWxsIHRvZ2V0aGVyLCBhIHNpbXBsZSB0ZXN0IGNhc2UgbWF5IGxvb2sgbGlrZToKKyAqCisgKglURVNUQ0FTRV9TVEFSVCgiVGVzdGluZyBtb3YgcjAsIHI3IikKKyAqCVRFU1RfQVJHX1JFRyg3LCAweDEyMzQ1Njc4KSAvLyBTZXQgcjc9MHgxMjM0NTY3OAorICoJVEVTVF9BUkdfRU5EKCIiKQorICoJVEVTVF9JTlNUUlVDVElPTigibW92IHIwLCByNyIpCisgKglURVNUQ0FTRV9FTkQKKyAqCisgKiBOb3RlLCBpbiBwcmFjdGljZSB0aGUgc2luZ2xlIGNvbnZlbmllbmNlIG1hY3JvIFRFU1RfUiB3b3VsZCBiZSB1c2VkIGZvciB0aGlzCisgKiBpbnN0ZWFkLgorICoKKyAqIFRoZSBhYm92ZSB3b3VsZCBleHBhbmQgdG8gYXNzZW1ibGVyIGxvb2tpbmcgc29tZXRoaW5nIGxpa2U6CisgKgorICoJQCBURVNUQ0FTRV9TVEFSVAorICoJYmwJX19rcHJvYmVzX3Rlc3RfY2FzZV9zdGFydAorICoJQCBzdGFydCBvZiBpbmxpbmUgZGF0YS4uLgorICoJLmFzY2lpICJtb3YgcjAsIHI3IglAIHRleHQgdGl0bGUgZm9yIHRlc3QgY2FzZQorICoJLmJ5dGUJMAorICoJLmFsaWduCTIKKyAqCisgKglAIFRFU1RfQVJHX1JFRworICoJLmJ5dGUJQVJHX1RZUEVfUkVHCisgKgkuYnl0ZQk3CisgKgkuc2hvcnQJMAorICoJLndvcmQJMHgxMjM0NTY3CisgKgorICoJQCBURVNUX0FSR19FTkQKKyAqCS5ieXRlCUFSR19UWVBFX0VORAorICoJLmJ5dGUJVEVTVF9JU0EJQCBmbGFncywgaW5jbHVkaW5nIElTQSBiZWluZyB0ZXN0ZWQKKyAqCS5zaG9ydAk1MGYtMGYJCUAgb2Zmc2V0IG9mICd0ZXN0X2JlZm9yZScKKyAqCS5zaG9ydAkyZi0wZgkJQCBvZmZzZXQgb2YgJ3Rlc3RfYWZ0ZXIyJyAoaWYgcmVsZXZlbnQpCisgKgkuc2hvcnQJOTlmLTBmCQlAIG9mZnNldCBvZiAndGVzdF9kb25lJworICoJQCBzdGFydCBvZiB0ZXN0IGNhc2UgY29kZS4uLgorICoJMDoKKyAqCS5jb2RlCVRFU1RfSVNBCUAgc3dpdGNoIHRvIElTQSBiZWluZyB0ZXN0ZWQKKyAqCisgKglAIFRFU1RfSU5TVFJVQ1RJT04KKyAqCTUwOglub3AJCUAgbG9jYXRpb24gZm9yICd0ZXN0X2JlZm9yZScgcHJvYmUKKyAqCTE6CW1vdiByMCwgcjcJQCB0aGUgdGVzdCBjYXNlIGluc3RydWN0aW9uICd0ZXN0X2luc24nCisgKgkJbm9wCQlAIGxvY2F0aW9uIGZvciAndGVzdF9hZnRlcicgcHJvYmUKKyAqCisgKgkvLyBURVNUQ0FTRV9FTkQKKyAqCTI6CisgKgk5OToJYmwgX19rcHJvYmVzX3Rlc3RfY2FzZV9lbmRfIyNURVNUX0lTQQorICoJLmNvZGUJTk9OTUFMX0lTQQorICoKKyAqIFdoZW4gdGhlIGFib3ZlIGlzIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBoYXBwZW5zLi4uCisgKgorICogX19rcHJvYmVzX3Rlc3RfY2FzZV9zdGFydCgpIGlzIGFuIGFzc2VtYmxlciB3cmFwcGVyIHdoaWNoIHNldHMgdXAgc3BhY2UKKyAqIGZvciBhIHN0YWNrIGJ1ZmZlciBhbmQgY2FsbHMgdGhlIEMgZnVuY3Rpb24ga3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQoKS4KKyAqIFRoaXMgQyBmdW5jdGlvbiB3aWxsIGRvIHNvbWUgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIHRoZSBpbmxpbmUgZGF0YSBhbmQKKyAqIHNldHVwIHNvbWUgZ2xvYmFsIHN0YXRlLiBJdCB0aGVuIGluc2VydHMgdGhlIHRlc3RfYmVmb3JlIGFuZCB0ZXN0X2FmdGVyCisgKiBrcHJvYmVzIGFuZCByZXR1cm5zIGEgdmFsdWUgd2hpY2ggY2F1c2VzIHRoZSBhc3NlbWJsZXIgd3JhcHBlciB0byBqdW1wCisgKiB0byB0aGUgc3RhcnQgb2YgdGhlIHRlc3QgY2FzZSBjb2RlLCAobG9jYWwgbGFiZWwgJzAnKS4KKyAqCisgKiBXaGVuIHRoZSB0ZXN0IGNhc2UgY29kZSBleGVjdXRlcywgdGhlIHRlc3RfYmVmb3JlIHByb2JlIHdpbGwgYmUgaGl0IGFuZAorICogdGVzdF9iZWZvcmVfcG9zdF9oYW5kbGVyIHdpbGwgY2FsbCBzZXR1cF90ZXN0X2NvbnRleHQoKS4gVGhpcyBmaWxscyB0aGUKKyAqIHN0YWNrIGJ1ZmZlciBhbmQgQ1BVIHJlZ2lzdGVycyB3aXRoIGEgdGVzdCBwYXR0ZXJuIGFuZCB0aGVuIHByb2Nlc3NlcworICogdGhlIHRlc3QgY2FzZSBhcmd1bWVudHMuIEluIG91ciBleGFtcGxlIHRoZXJlIGlzIG9uZSBURVNUX0FSR19SRUcgd2hpY2gKKyAqIGluZGljYXRlcyB0aGF0IFI3IHNob3VsZCBiZSBsb2FkZWQgd2l0aCB0aGUgdmFsdWUgMHgxMjM0NTY3OC4KKyAqCisgKiBXaGVuIHRoZSB0ZXN0X2JlZm9yZSBwcm9iZSBlbmRzLCB0aGUgdGVzdCBjYXNlIGNvbnRpbnVlcyBhbmQgZXhlY3V0ZXMKKyAqIHRoZSAibW92IHIwLCByNyIgaW5zdHJ1Y3Rpb24uIEl0IHRoZW4gaGl0cyB0aGUgdGVzdF9hZnRlciBwcm9iZSBhbmQgdGhlCisgKiBwcmUtaGFuZGxlciBmb3IgdGhpcyAodGVzdF9hZnRlcl9wcmVfaGFuZGxlcikgd2lsbCBzYXZlIGEgY29weSBvZiB0aGUKKyAqIENQVSByZWdpc3RlciBjb250ZXh0LiBUaGlzIHNob3VsZCBub3cgaGF2ZSBSMCBob2xkaW5nIHRoZSBzYW1lIHZhbHVlIGFzCisgKiBSNy4KKyAqCisgKiBGaW5hbGx5IHdlIGdldCB0byB0aGUgY2FsbCB0byBfX2twcm9iZXNfdGVzdF9jYXNlX2VuZF97MzIsMTZ9LiBUaGlzIGlzCisgKiBhbiBhc3NlbWJsZXIgd3JhcHBlciB3aGljaCBzd2l0Y2hlcyBiYWNrIHRvIHRoZSBJU0EgdXNlZCBieSB0aGUgdGVzdAorICogY29kZSBhbmQgY2FsbHMgdGhlIEMgZnVuY3Rpb24ga3Byb2Jlc190ZXN0X2Nhc2VfZW5kKCkuCisgKgorICogRm9yIGVhY2ggcnVuIHRocm91Z2ggdGhlIHRlc3QgY2FzZSwgdGVzdF9jYXNlX3J1bl9jb3VudCBpcyBpbmNyZW1lbnRlZAorICogYnkgb25lLiBGb3IgZXZlbiBydW5zLCBrcHJvYmVzX3Rlc3RfY2FzZV9lbmQoKSBzYXZlcyBhIGNvcHkgb2YgdGhlCisgKiByZWdpc3RlciBhbmQgc3RhY2sgYnVmZmVyIGNvbnRlbnRzIGZyb20gdGhlIHRlc3QgY2FzZSBqdXN0IHJ1bi4gSXQgdGhlbgorICogaW5zZXJ0cyBhIGtwcm9iZSBvbiB0aGUgdGVzdCBjYXNlIGluc3RydWN0aW9uICd0ZXN0X2luc24nIGFuZCByZXR1cm5zIGEKKyAqIHZhbHVlIHRvIGNhdXNlIHRoZSB0ZXN0IGNhc2UgY29kZSB0byBiZSByZS1ydW4uCisgKgorICogRm9yIG9kZCBudW1iZXJlZCBydW5zLCBrcHJvYmVzX3Rlc3RfY2FzZV9lbmQoKSBjb21wYXJlcyB0aGUgcmVnaXN0ZXIgYW5kCisgKiBzdGFjayBidWZmZXIgY29udGVudHMgdG8gdGhvc2UgdGhhdCB3ZXJlIHNhdmVkIG9uIHRoZSBwcmV2aW91cyBldmVuCisgKiBudW1iZXJlZCBydW4gKHRoZSBvbmUgd2l0aG91dCB0aGUga3Byb2JlIG9uIHRlc3RfaW5zbikuIFRoZXNlIHNob3VsZCBiZQorICogdGhlIHNhbWUgaWYgdGhlIGtwcm9iZSBpbnN0cnVjdGlvbiBzaW11bGF0aW9uIHJvdXRpbmUgaXMgY29ycmVjdC4KKyAqCisgKiBUaGUgcGFpciBvZiB0ZXN0IGNhc2UgcnVucyBpcyByZXBlYXRlZCB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YKKyAqIGZsYWcgdmFsdWVzIGluIENQU1IgYW5kLCBmb3IgVGh1bWIsIGRpZmZlcmVudCBJVFN0YXRlLiBUaGlzIGlzCisgKiBjb250cm9sbGVkIGJ5IHRlc3RfY29udGV4dF9jcHNyKCkuCisgKgorICogQlVJTERJTkcgVEVTVCBDQVNFUworICogLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiBBcyBhbiBhaWQgdG8gYnVpbGRpbmcgdGVzdCBjYXNlcywgdGhlIHN0YWNrIGJ1ZmZlciBpcyBpbml0aWFsaXNlZCB3aXRoCisgKiBzb21lIHNwZWNpYWwgdmFsdWVzOgorICoKKyAqICAgW1NQKzEzKjRdCUNvbnRhaW5zIFNQKzEyMC4gVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGluc3RydWN0aW9ucworICoJCXdoaWNoIGxvYWQgYSB2YWx1ZSBpbnRvIFNQLgorICoKKyAqICAgW1NQKzE1KjRdCVdoZW4gdGVzdGluZyBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zIHVzaW5nIFRFU1RfQlJBTkNIX3tGLEJ9LAorICoJCXRoaXMgaG9sZHMgdGhlIHRhcmdldCBhZGRyZXNzIG9mIHRoZSBicmFuY2gsICd0ZXN0X2FmdGVyMicuCisgKgkJVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IGluc3RydWN0aW9ucyB3aGljaCBsb2FkIGEgUEMgdmFsdWUKKyAqCQlmcm9tIG1lbW9yeS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKworI2luY2x1ZGUgImtwcm9iZXMuaCIKKyNpbmNsdWRlICJrcHJvYmVzLXRlc3QuaCIKKworCisjZGVmaW5lIEJFTkNITUFSS0lORwkxCisKKworLyoKKyAqIFRlc3QgYmFzaWMgQVBJCisgKi8KKworc3RhdGljIGJvb2wgdGVzdF9yZWdzX29rOworc3RhdGljIGludCB0ZXN0X2Z1bmNfaW5zdGFuY2U7CitzdGF0aWMgaW50IHByZV9oYW5kbGVyX2NhbGxlZDsKK3N0YXRpYyBpbnQgcG9zdF9oYW5kbGVyX2NhbGxlZDsKK3N0YXRpYyBpbnQganByb2JlX2Z1bmNfY2FsbGVkOworc3RhdGljIGludCBrcmV0cHJvYmVfaGFuZGxlcl9jYWxsZWQ7CisKKyNkZWZpbmUgRlVOQ19BUkcxIDB4MTIzNDU2NzgKKyNkZWZpbmUgRlVOQ19BUkcyIDB4YWJjZGVmCisKKworI2lmbmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCitsb25nIGFybV9mdW5jKGxvbmcgcjAsIGxvbmcgcjEpOworCitzdGF0aWMgdm9pZCBfX3VzZWQgX19uYWtlZCBfX2FybV9rcHJvYmVzX3Rlc3RfZnVuYyh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIi5hcm0JCQkJCVxuXHQiCisJCSIudHlwZSBhcm1fZnVuYywgJSVmdW5jdGlvbgkJXG5cdCIKKwkJImFybV9mdW5jOgkJCQlcblx0IgorCQkiYWRkcwlyMCwgcjAsIHIxCQkJXG5cdCIKKwkJImJ4CWxyCQkJCVxuXHQiCisJCSIuY29kZSAiTk9STUFMX0lTQQkgLyogQmFjayB0byBUaHVtYiBpZiBuZWNlc3NhcnkgKi8KKwkJOiA6IDogInIwIiwgInIxIiwgImNjIgorCSk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19USFVNQjJfS0VSTkVMICovCisKK2xvbmcgdGh1bWIxNl9mdW5jKGxvbmcgcjAsIGxvbmcgcjEpOworbG9uZyB0aHVtYjMyZXZlbl9mdW5jKGxvbmcgcjAsIGxvbmcgcjEpOworbG9uZyB0aHVtYjMyb2RkX2Z1bmMobG9uZyByMCwgbG9uZyByMSk7CisKK3N0YXRpYyB2b2lkIF9fdXNlZCBfX25ha2VkIF9fdGh1bWJfa3Byb2Jlc190ZXN0X2Z1bmNzKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiLnR5cGUgdGh1bWIxNl9mdW5jLCAlJWZ1bmN0aW9uCQlcblx0IgorCQkidGh1bWIxNl9mdW5jOgkJCQlcblx0IgorCQkiYWRkcy5uCXIwLCByMCwgcjEJCQlcblx0IgorCQkiYngJbHIJCQkJXG5cdCIKKworCQkiLmFsaWduCQkJCQlcblx0IgorCQkiLnR5cGUgdGh1bWIzMmV2ZW5fZnVuYywgJSVmdW5jdGlvbglcblx0IgorCQkidGh1bWIzMmV2ZW5fZnVuYzoJCQlcblx0IgorCQkiYWRkcy53CXIwLCByMCwgcjEJCQlcblx0IgorCQkiYngJbHIJCQkJXG5cdCIKKworCQkiLmFsaWduCQkJCQlcblx0IgorCQkibm9wLm4JCQkJCVxuXHQiCisJCSIudHlwZSB0aHVtYjMyb2RkX2Z1bmMsICUlZnVuY3Rpb24JXG5cdCIKKwkJInRodW1iMzJvZGRfZnVuYzoJCQlcblx0IgorCQkiYWRkcy53CXIwLCByMCwgcjEJCQlcblx0IgorCQkiYngJbHIJCQkJXG5cdCIKKworCQk6IDogOiAicjAiLCAicjEiLCAiY2MiCisJKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19USFVNQjJfS0VSTkVMICovCisKKworc3RhdGljIGludCBjYWxsX3Rlc3RfZnVuYyhsb25nICgqZnVuYykobG9uZywgbG9uZyksIGJvb2wgY2hlY2tfdGVzdF9yZWdzKQoreworCWxvbmcgcmV0OworCisJKyt0ZXN0X2Z1bmNfaW5zdGFuY2U7CisJdGVzdF9yZWdzX29rID0gZmFsc2U7CisKKwlyZXQgPSAoKmZ1bmMpKEZVTkNfQVJHMSwgRlVOQ19BUkcyKTsKKwlpZiAocmV0ICE9IEZVTkNfQVJHMSArIEZVTkNfQVJHMikgeworCQlwcl9lcnIoIkZBSUw6IGNhbGxfdGVzdF9mdW5jOiBmdW5jIHJldHVybmVkICVseFxuIiwgcmV0KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjaGVja190ZXN0X3JlZ3MgJiYgIXRlc3RfcmVnc19vaykgeworCQlwcl9lcnIoIkZBSUw6IHRlc3QgcmVncyBub3QgT0tcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIHByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByZV9oYW5kbGVyX2NhbGxlZCA9IHRlc3RfZnVuY19pbnN0YW5jZTsKKwlpZiAocmVncy0+QVJNX3IwID09IEZVTkNfQVJHMSAmJiByZWdzLT5BUk1fcjEgPT0gRlVOQ19BUkcyKQorCQl0ZXN0X3JlZ3Nfb2sgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgcG9zdF9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcG9zdF9oYW5kbGVyX2NhbGxlZCA9IHRlc3RfZnVuY19pbnN0YW5jZTsKKwlpZiAocmVncy0+QVJNX3IwICE9IEZVTkNfQVJHMSArIEZVTkNfQVJHMiB8fCByZWdzLT5BUk1fcjEgIT0gRlVOQ19BUkcyKQorCQl0ZXN0X3JlZ3Nfb2sgPSBmYWxzZTsKK30KKworc3RhdGljIHN0cnVjdCBrcHJvYmUgdGhlX2twcm9iZSA9IHsKKwkuYWRkcgkJPSAwLAorCS5wcmVfaGFuZGxlcgk9IHByZV9oYW5kbGVyLAorCS5wb3N0X2hhbmRsZXIJPSBwb3N0X2hhbmRsZXIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9rcHJvYmUobG9uZyAoKmZ1bmMpKGxvbmcsIGxvbmcpKQoreworCWludCByZXQ7CisKKwl0aGVfa3Byb2JlLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopZnVuYzsKKwlyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJnRoZV9rcHJvYmUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiRkFJTDogcmVnaXN0ZXJfa3Byb2JlIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNhbGxfdGVzdF9mdW5jKGZ1bmMsIHRydWUpOworCisJdW5yZWdpc3Rlcl9rcHJvYmUoJnRoZV9rcHJvYmUpOworCXRoZV9rcHJvYmUuZmxhZ3MgPSAwOyAvKiBDbGVhciBkaXNhYmxlIGZsYWcgdG8gYWxsb3cgcmV1c2UgKi8KKworCWlmICghcmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocHJlX2hhbmRsZXJfY2FsbGVkICE9IHRlc3RfZnVuY19pbnN0YW5jZSkgeworCQlwcl9lcnIoIkZBSUw6IGtwcm9iZSBwcmVfaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwb3N0X2hhbmRsZXJfY2FsbGVkICE9IHRlc3RfZnVuY19pbnN0YW5jZSkgeworCQlwcl9lcnIoIkZBSUw6IGtwcm9iZSBwb3N0X2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNhbGxfdGVzdF9mdW5jKGZ1bmMsIGZhbHNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHByZV9oYW5kbGVyX2NhbGxlZCA9PSB0ZXN0X2Z1bmNfaW5zdGFuY2UgfHwKKwkJCQlwb3N0X2hhbmRsZXJfY2FsbGVkID09IHRlc3RfZnVuY19pbnN0YW5jZSkgeworCQlwcl9lcnIoIkZBSUw6IHByb2JlIGNhbGxlZCBhZnRlciB1bnJlZ2lzdGVyaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyBqcHJvYmVfZnVuYyhsb25nIHIwLCBsb25nIHIxKQoreworCWpwcm9iZV9mdW5jX2NhbGxlZCA9IHRlc3RfZnVuY19pbnN0YW5jZTsKKwlpZiAocjAgPT0gRlVOQ19BUkcxICYmIHIxID09IEZVTkNfQVJHMikKKwkJdGVzdF9yZWdzX29rID0gdHJ1ZTsKKwlqcHJvYmVfcmV0dXJuKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QganByb2JlIHRoZV9qcHJvYmUgPSB7CisJLmVudHJ5CQk9IGpwcm9iZV9mdW5jLAorfTsKKworc3RhdGljIGludCB0ZXN0X2pwcm9iZShsb25nICgqZnVuYykobG9uZywgbG9uZykpCit7CisJaW50IHJldDsKKworCXRoZV9qcHJvYmUua3AuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKilmdW5jOworCXJldCA9IHJlZ2lzdGVyX2pwcm9iZSgmdGhlX2pwcm9iZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGQUlMOiByZWdpc3Rlcl9qcHJvYmUgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY2FsbF90ZXN0X2Z1bmMoZnVuYywgdHJ1ZSk7CisKKwl1bnJlZ2lzdGVyX2pwcm9iZSgmdGhlX2pwcm9iZSk7CisJdGhlX2pwcm9iZS5rcC5mbGFncyA9IDA7IC8qIENsZWFyIGRpc2FibGUgZmxhZyB0byBhbGxvdyByZXVzZSAqLworCisJaWYgKCFyZXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChqcHJvYmVfZnVuY19jYWxsZWQgIT0gdGVzdF9mdW5jX2luc3RhbmNlKSB7CisJCXByX2VycigiRkFJTDoganByb2JlIGhhbmRsZXIgZnVuY3Rpb24gbm90IGNhbGxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNhbGxfdGVzdF9mdW5jKGZ1bmMsIGZhbHNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGpwcm9iZV9mdW5jX2NhbGxlZCA9PSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBwcm9iZSBjYWxsZWQgYWZ0ZXIgdW5yZWdpc3RlcmluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fa3Byb2Jlcwora3JldHByb2JlX2hhbmRsZXIoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWtyZXRwcm9iZV9oYW5kbGVyX2NhbGxlZCA9IHRlc3RfZnVuY19pbnN0YW5jZTsKKwlpZiAocmVnc19yZXR1cm5fdmFsdWUocmVncykgPT0gRlVOQ19BUkcxICsgRlVOQ19BUkcyKQorCQl0ZXN0X3JlZ3Nfb2sgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtyZXRwcm9iZSB0aGVfa3JldHByb2JlID0geworCS5oYW5kbGVyCT0ga3JldHByb2JlX2hhbmRsZXIsCit9OworCitzdGF0aWMgaW50IHRlc3Rfa3JldHByb2JlKGxvbmcgKCpmdW5jKShsb25nLCBsb25nKSkKK3sKKwlpbnQgcmV0OworCisJdGhlX2tyZXRwcm9iZS5rcC5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKWZ1bmM7CisJcmV0ID0gcmVnaXN0ZXJfa3JldHByb2JlKCZ0aGVfa3JldHByb2JlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkZBSUw6IHJlZ2lzdGVyX2tyZXRwcm9iZSBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjYWxsX3Rlc3RfZnVuYyhmdW5jLCB0cnVlKTsKKworCXVucmVnaXN0ZXJfa3JldHByb2JlKCZ0aGVfa3JldHByb2JlKTsKKwl0aGVfa3JldHByb2JlLmtwLmZsYWdzID0gMDsgLyogQ2xlYXIgZGlzYWJsZSBmbGFnIHRvIGFsbG93IHJldXNlICovCisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtyZXRwcm9iZV9oYW5kbGVyX2NhbGxlZCAhPSB0ZXN0X2Z1bmNfaW5zdGFuY2UpIHsKKwkJcHJfZXJyKCJGQUlMOiBrcmV0cHJvYmUgaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghY2FsbF90ZXN0X2Z1bmMoZnVuYywgZmFsc2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoanByb2JlX2Z1bmNfY2FsbGVkID09IHRlc3RfZnVuY19pbnN0YW5jZSkgeworCQlwcl9lcnIoIkZBSUw6IGtyZXRwcm9iZSBjYWxsZWQgYWZ0ZXIgdW5yZWdpc3RlcmluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ1bl9hcGlfdGVzdHMobG9uZyAoKmZ1bmMpKGxvbmcsIGxvbmcpKQoreworCWludCByZXQ7CisKKwlwcl9pbmZvKCIgICAga3Byb2JlXG4iKTsKKwlyZXQgPSB0ZXN0X2twcm9iZShmdW5jKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXByX2luZm8oIiAgICBqcHJvYmVcbiIpOworCXJldCA9IHRlc3RfanByb2JlKGZ1bmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcHJfaW5mbygiICAgIGtyZXRwcm9iZVxuIik7CisJcmV0ID0gdGVzdF9rcmV0cHJvYmUoZnVuYyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQmVuY2htYXJraW5nCisgKi8KKworI2lmIEJFTkNITUFSS0lORworCitzdGF0aWMgdm9pZCBfX25ha2VkIGJlbmNobWFya19ub3Aodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJub3AJCVxuXHQiCisJCSJieAlsciIKKwkpOworfQorCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKyNkZWZpbmUgd2lkZSAiLnciCisjZWxzZQorI2RlZmluZSB3aWRlCisjZW5kaWYKKworc3RhdGljIHZvaWQgX19uYWtlZCBiZW5jaG1hcmtfcHVzaHBvcDEodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdG1kYiJ3aWRlIglzcCEsIHtyMy1yMTEsbHJ9ICBcblx0IgorCQkibGRtaWEid2lkZSIJc3AhLCB7cjMtcjExLHBjfSIKKwkpOworfQorCitzdGF0aWMgdm9pZCBfX25ha2VkIGJlbmNobWFya19wdXNocG9wMih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0bWRiIndpZGUiCXNwISwge3IwLXI4LGxyfSAgXG5cdCIKKwkJImxkbWlhIndpZGUiCXNwISwge3IwLXI4LHBjfSIKKwkpOworfQorCitzdGF0aWMgdm9pZCBfX25ha2VkIGJlbmNobWFya19wdXNocG9wMyh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0bWRiIndpZGUiCXNwISwge3I0LGxyfSAgXG5cdCIKKwkJImxkbWlhIndpZGUiCXNwISwge3I0LHBjfSIKKwkpOworfQorCitzdGF0aWMgdm9pZCBfX25ha2VkIGJlbmNobWFya19wdXNocG9wNCh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0bWRiIndpZGUiCXNwISwge3IwLGxyfSAgXG5cdCIKKwkJImxkbWlhIndpZGUiCXNwISwge3IwLHBjfSIKKwkpOworfQorCisKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCitzdGF0aWMgdm9pZCBfX25ha2VkIGJlbmNobWFya19wdXNocG9wX3RodW1iKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkicHVzaC5uCXtyMC1yNyxscn0gIFxuXHQiCisJCSJwb3Aubgl7cjAtcjcscGN9IgorCSk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa3Byb2JlcworYmVuY2htYXJrX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlbmNobWFyayh2b2lkKCpmbikodm9pZCkpCit7CisJdW5zaWduZWQgbiwgaSwgdCwgdDA7CisKKwlmb3IgKG4gPSAxMDAwOyA7IG4gKj0gMikgeworCQl0MCA9IHNjaGVkX2Nsb2NrKCk7CisJCWZvciAoaSA9IG47IGkgPiAwOyAtLWkpCisJCQlmbigpOworCQl0ID0gc2NoZWRfY2xvY2soKSAtIHQwOworCQlpZiAodCA+PSAyNTAwMDAwMDApCisJCQlicmVhazsgLyogU3RvcCBvbmNlIHdlIHRvb2sgbW9yZSB0aGFuIDAuMjUgc2Vjb25kcyAqLworCX0KKwlyZXR1cm4gdCAvIG47IC8qIFRpbWUgZm9yIG9uZSBpdGVyYXRpb24gaW4gbmFub3NlY29uZHMgKi8KK307CisKK3N0YXRpYyBpbnQga3Byb2JlX2JlbmNobWFyayh2b2lkKCpmbikodm9pZCksIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qga3Byb2JlIGsgPSB7CisJCS5hZGRyCQk9IChrcHJvYmVfb3Bjb2RlX3QgKikoKHVpbnRwdHJfdClmbiArIG9mZnNldCksCisJCS5wcmVfaGFuZGxlcgk9IGJlbmNobWFya19wcmVfaGFuZGxlciwKKwl9OworCisJaW50IHJldCA9IHJlZ2lzdGVyX2twcm9iZSgmayk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJGQUlMOiByZWdpc3Rlcl9rcHJvYmUgZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYmVuY2htYXJrKGZuKTsKKworCXVucmVnaXN0ZXJfa3Byb2JlKCZrKTsKKwlyZXR1cm4gcmV0OworfTsKKworc3RydWN0IGJlbmNobWFya3MgeworCXZvaWQJCSgqZm4pKHZvaWQpOworCXVuc2lnbmVkCW9mZnNldDsKKwljb25zdCBjaGFyCSp0aXRsZTsKK307CisKK3N0YXRpYyBpbnQgcnVuX2JlbmNobWFya3Modm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBiZW5jaG1hcmtzIGxpc3RbXSA9IHsKKwkJeyZiZW5jaG1hcmtfbm9wLCAwLCAibm9wIn0sCisJCS8qCisJCSAqIGJlbmNobWFya19wdXNocG9wezEsM30gd2lsbCBoYXZlIHRoZSBvcHRpbWlzZWQKKwkJICogaW5zdHJ1Y3Rpb24gZW11bGF0aW9uLCB3aGlsc3QgYmVuY2htYXJrX3B1c2hwb3B7Miw0fSB3aWxsCisJCSAqIGJlIHRoZSBlcXVpdmFsZW50IHVub3B0aW1pc2VkIGluc3RydWN0aW9ucy4KKwkJICovCisJCXsmYmVuY2htYXJrX3B1c2hwb3AxLCAwLCAic3RtZGIJc3AhLCB7cjMtcjExLGxyfSJ9LAorCQl7JmJlbmNobWFya19wdXNocG9wMSwgNCwgImxkbWlhCXNwISwge3IzLXIxMSxwY30ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDIsIDAsICJzdG1kYglzcCEsIHtyMC1yOCxscn0ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDIsIDQsICJsZG1pYQlzcCEsIHtyMC1yOCxwY30ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDMsIDAsICJzdG1kYglzcCEsIHtyNCxscn0ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDMsIDQsICJsZG1pYQlzcCEsIHtyNCxwY30ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDQsIDAsICJzdG1kYglzcCEsIHtyMCxscn0ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcDQsIDQsICJsZG1pYQlzcCEsIHtyMCxwY30ifSwKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCQl7JmJlbmNobWFya19wdXNocG9wX3RodW1iLCAwLCAicHVzaC5uCXtyMC1yNyxscn0ifSwKKwkJeyZiZW5jaG1hcmtfcHVzaHBvcF90aHVtYiwgMiwgInBvcC5uCXtyMC1yNyxwY30ifSwKKyNlbmRpZgorCQl7MH0KKwl9OworCisJc3RydWN0IGJlbmNobWFya3MgKmI7CisJZm9yIChiID0gbGlzdDsgYi0+Zm47ICsrYikgeworCQlyZXQgPSBrcHJvYmVfYmVuY2htYXJrKGItPmZuLCBiLT5vZmZzZXQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXByX2luZm8oIiAgICAlZG5zIGZvciBrcHJvYmUgJXNcbiIsIHJldCwgYi0+dGl0bGUpOworCX0KKworCXByX2luZm8oIlxuIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBCRU5DSE1BUktJTkcgKi8KKworCisvKgorICogRGVjb2RpbmcgdGFibGUgc2VsZi1jb25zaXN0ZW5jeSB0ZXN0cworICovCisKK3N0YXRpYyBjb25zdCBpbnQgZGVjb2RlX3N0cnVjdF9zaXplc1tOVU1fREVDT0RFX1RZUEVTXSA9IHsKKwlbREVDT0RFX1RZUEVfVEFCTEVdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfdGFibGUpLAorCVtERUNPREVfVFlQRV9DVVNUT01dCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfY3VzdG9tKSwKKwlbREVDT0RFX1RZUEVfU0lNVUxBVEVdCT0gc2l6ZW9mKHN0cnVjdCBkZWNvZGVfc2ltdWxhdGUpLAorCVtERUNPREVfVFlQRV9FTVVMQVRFXQk9IHNpemVvZihzdHJ1Y3QgZGVjb2RlX2VtdWxhdGUpLAorCVtERUNPREVfVFlQRV9PUl0JPSBzaXplb2Yoc3RydWN0IGRlY29kZV9vciksCisJW0RFQ09ERV9UWVBFX1JFSkVDVF0JPSBzaXplb2Yoc3RydWN0IGRlY29kZV9yZWplY3QpCit9OworCitzdGF0aWMgaW50IHRhYmxlX2l0ZXIoY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlLAorCQkJaW50ICgqZm4pKGNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyICosIHZvaWQgKiksCisJCQl2b2lkICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyICpoID0gKHN0cnVjdCBkZWNvZGVfaGVhZGVyICopdGFibGU7CisJaW50IHJlc3VsdDsKKworCWZvciAoOzspIHsKKwkJZW51bSBkZWNvZGVfdHlwZSB0eXBlID0gaC0+dHlwZV9yZWdzLmJpdHMgJiBERUNPREVfVFlQRV9NQVNLOworCisJCWlmICh0eXBlID09IERFQ09ERV9UWVBFX0VORCkKKwkJCXJldHVybiAwOworCisJCXJlc3VsdCA9IGZuKGgsIGFyZ3MpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloID0gKHN0cnVjdCBkZWNvZGVfaGVhZGVyICopCisJCQkoKHVpbnRwdHJfdCloICsgZGVjb2RlX3N0cnVjdF9zaXplc1t0eXBlXSk7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFibGVfdGVzdF9mYWlsKGNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyICpoLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworCisJcHJfZXJyKCJGQUlMOiBrcHJvYmVzIHRlc3QgZmFpbHVyZSBcIiVzXCIgKG1hc2sgJTA4eCwgdmFsdWUgJTA4eClcbiIsCisJCQkJCW1lc3NhZ2UsIGgtPm1hc2suYml0cywgaC0+dmFsdWUuYml0cyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0cnVjdCB0YWJsZV90ZXN0X2FyZ3MgeworCWNvbnN0IHVuaW9uIGRlY29kZV9pdGVtICpyb290X3RhYmxlOworCXUzMgkJCXBhcmVudF9tYXNrOworCXUzMgkJCXBhcmVudF92YWx1ZTsKK307CisKK3N0YXRpYyBpbnQgdGFibGVfdGVzdF9mbihjb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCwgdm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgdGFibGVfdGVzdF9hcmdzICphID0gKHN0cnVjdCB0YWJsZV90ZXN0X2FyZ3MgKilhcmdzOworCWVudW0gZGVjb2RlX3R5cGUgdHlwZSA9IGgtPnR5cGVfcmVncy5iaXRzICYgREVDT0RFX1RZUEVfTUFTSzsKKworCWlmIChoLT52YWx1ZS5iaXRzICYgfmgtPm1hc2suYml0cykKKwkJcmV0dXJuIHRhYmxlX3Rlc3RfZmFpbChoLCAiTWF0Y2ggdmFsdWUgaGFzIGJpdHMgbm90IGluIG1hc2siKTsKKworCWlmICgoaC0+bWFzay5iaXRzICYgYS0+cGFyZW50X21hc2spICE9IGEtPnBhcmVudF9tYXNrKQorCQlyZXR1cm4gdGFibGVfdGVzdF9mYWlsKGgsICJNYXNrIGhhcyBiaXRzIG5vdCBpbiBwYXJlbnQgbWFzayIpOworCisJaWYgKChoLT52YWx1ZS5iaXRzIF4gYS0+cGFyZW50X3ZhbHVlKSAmIGEtPnBhcmVudF9tYXNrKQorCQlyZXR1cm4gdGFibGVfdGVzdF9mYWlsKGgsICJWYWx1ZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBwYXJlbnQiKTsKKworCWlmICh0eXBlID09IERFQ09ERV9UWVBFX1RBQkxFKSB7CisJCXN0cnVjdCBkZWNvZGVfdGFibGUgKmQgPSAoc3RydWN0IGRlY29kZV90YWJsZSAqKWg7CisJCXN0cnVjdCB0YWJsZV90ZXN0X2FyZ3MgYXJnczIgPSAqYTsKKwkJYXJnczIucGFyZW50X21hc2sgPSBoLT5tYXNrLmJpdHM7CisJCWFyZ3MyLnBhcmVudF92YWx1ZSA9IGgtPnZhbHVlLmJpdHM7CisJCXJldHVybiB0YWJsZV9pdGVyKGQtPnRhYmxlLnRhYmxlLCB0YWJsZV90ZXN0X2ZuLCAmYXJnczIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhYmxlX3Rlc3QoY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlKQoreworCXN0cnVjdCB0YWJsZV90ZXN0X2FyZ3MgYXJncyA9IHsKKwkJLnJvb3RfdGFibGUJPSB0YWJsZSwKKwkJLnBhcmVudF9tYXNrCT0gMCwKKwkJLnBhcmVudF92YWx1ZQk9IDAKKwl9OworCXJldHVybiB0YWJsZV9pdGVyKGFyZ3Mucm9vdF90YWJsZSwgdGFibGVfdGVzdF9mbiwgJmFyZ3MpOworfQorCisKKy8qCisgKiBEZWNvZGluZyB0YWJsZSB0ZXN0IGNvdmVyYWdlIGFuYWx5c2lzCisgKgorICogY292ZXJhZ2Vfc3RhcnQoKSBidWlsZHMgYSBjb3ZlcmFnZV90YWJsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YKKyAqIGNvdmVyYWdlX2VudHJ5J3MgdG8gbWF0Y2ggZWFjaCBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGtwcm9iZXMgaW5zdHJ1Y3Rpb24KKyAqIGRlY29kaW5nIHRhYmxlLgorICoKKyAqIFdoZW4gdGVzdCBjYXNlcyBhcmUgcnVuLCBjb3ZlcmFnZV9hZGQoKSBpcyBjYWxsZWQgdG8gcHJvY2VzcyBlYWNoIGNhc2UuCisgKiBUaGlzIGxvb2tzIHVwIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBjb3ZlcmFnZV90YWJsZSBhbmQgc2V0cyBpdCBhcworICogYmVpbmcgbWF0Y2hlZCwgYXMgd2VsbCBhcyBjbGVhcmluZyB0aGUgcmVncyBmbGFnIGFwcHJvcHJpYXRlIGZvciB0aGUgdGVzdC4KKyAqCisgKiBBZnRlciBhbGwgdGVzdCBjYXNlcyBoYXZlIGJlZW4gcnVuLCBjb3ZlcmFnZV9lbmQoKSBpcyBjYWxsZWQgdG8gY2hlY2sgdGhhdAorICogYWxsIGVudHJpZXMgaW4gY292ZXJhZ2VfdGFibGUgaGF2ZSBiZWVuIG1hdGNoZWQgYW5kIHRoYXQgYWxsIHJlZ3MgZmxhZ3MgYXJlCisgKiBjbGVhcmVkLiBJLmUuIHRoYXQgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnN0cnVjdGlvbnMgZGVzY3JpYmVkIGJ5CisgKiB0aGUga3Byb2JlcyBkZWNvZGluZyB0YWJsZXMgaGF2ZSBoYWQgYSB0ZXN0IGNhc2UgZXhlY3V0ZWQgZm9yIHRoZW0uCisgKi8KKworYm9vbCBjb3ZlcmFnZV9mYWlsOworCisjZGVmaW5lIE1BWF9DT1ZFUkFHRV9FTlRSSUVTIDI1NgorCitzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgeworCWNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyCSpoZWFkZXI7CisJdW5zaWduZWQJCQlyZWdzOworCXVuc2lnbmVkCQkJbmVzdGluZzsKKwljaGFyCQkJCW1hdGNoZWQ7Cit9OworCitzdHJ1Y3QgY292ZXJhZ2VfdGFibGUgeworCXN0cnVjdCBjb3ZlcmFnZV9lbnRyeQkqYmFzZTsKKwl1bnNpZ25lZAkJbnVtX2VudHJpZXM7CisJdW5zaWduZWQJCW5lc3Rpbmc7Cit9OworCitzdHJ1Y3QgY292ZXJhZ2VfdGFibGUgY292ZXJhZ2U7CisKKyNkZWZpbmUgQ09WRVJBR0VfQU5ZX1JFRwkoMTw8MCkKKyNkZWZpbmUgQ09WRVJBR0VfU1AJCSgxPDwxKQorI2RlZmluZSBDT1ZFUkFHRV9QQwkJKDE8PDIpCisjZGVmaW5lIENPVkVSQUdFX1BDV0IJCSgxPDwzKQorCitzdGF0aWMgY29uc3QgY2hhciBjb3ZlcmFnZV9yZWdpc3Rlcl9sb29rdXBbMTZdID0geworCVtSRUdfVFlQRV9BTlldCQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9TUCB8IENPVkVSQUdFX1BDLAorCVtSRUdfVFlQRV9TQU1FQVMxNl0JPSBDT1ZFUkFHRV9BTllfUkVHLAorCVtSRUdfVFlQRV9TUF0JCT0gQ09WRVJBR0VfU1AsCisJW1JFR19UWVBFX1BDXQkJPSBDT1ZFUkFHRV9QQywKKwlbUkVHX1RZUEVfTk9TUF0JCT0gQ09WRVJBR0VfQU5ZX1JFRyB8IENPVkVSQUdFX1NQLAorCVtSRUdfVFlQRV9OT1NQUENdCT0gQ09WRVJBR0VfQU5ZX1JFRyB8IENPVkVSQUdFX1NQIHwgQ09WRVJBR0VfUEMsCisJW1JFR19UWVBFX05PUENdCQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9QQywKKwlbUkVHX1RZUEVfTk9QQ1dCXQk9IENPVkVSQUdFX0FOWV9SRUcgfCBDT1ZFUkFHRV9QQyB8IENPVkVSQUdFX1BDV0IsCisJW1JFR19UWVBFX05PUENYXQk9IENPVkVSQUdFX0FOWV9SRUcsCisJW1JFR19UWVBFX05PU1BQQ1hdCT0gQ09WRVJBR0VfQU5ZX1JFRyB8IENPVkVSQUdFX1NQLAorfTsKKwordW5zaWduZWQgY292ZXJhZ2Vfc3RhcnRfcmVnaXN0ZXJzKGNvbnN0IHN0cnVjdCBkZWNvZGVfaGVhZGVyICpoKQoreworCXVuc2lnbmVkIHJlZ3MgPSAwOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSArPSA0KSB7CisJCWludCByID0gKGgtPnR5cGVfcmVncy5iaXRzID4+IChERUNPREVfVFlQRV9CSVRTICsgaSkpICYgMHhmOworCQlyZWdzIHw9IGNvdmVyYWdlX3JlZ2lzdGVyX2xvb2t1cFtyXSA8PCBpOworCX0KKwlyZXR1cm4gcmVnczsKK30KKworc3RhdGljIGludCBjb3ZlcmFnZV9zdGFydF9mbihjb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCwgdm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgY292ZXJhZ2VfdGFibGUgKmNvdmVyYWdlID0gKHN0cnVjdCBjb3ZlcmFnZV90YWJsZSAqKWFyZ3M7CisJZW51bSBkZWNvZGVfdHlwZSB0eXBlID0gaC0+dHlwZV9yZWdzLmJpdHMgJiBERUNPREVfVFlQRV9NQVNLOworCXN0cnVjdCBjb3ZlcmFnZV9lbnRyeSAqZW50cnkgPSBjb3ZlcmFnZS0+YmFzZSArIGNvdmVyYWdlLT5udW1fZW50cmllczsKKworCWlmIChjb3ZlcmFnZS0+bnVtX2VudHJpZXMgPT0gTUFYX0NPVkVSQUdFX0VOVFJJRVMgLSAxKSB7CisJCXByX2VycigiRkFJTDogT3V0IG9mIHNwYWNlIGZvciB0ZXN0IGNvdmVyYWdlIGRhdGEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKytjb3ZlcmFnZS0+bnVtX2VudHJpZXM7CisKKwllbnRyeS0+aGVhZGVyID0gaDsKKwllbnRyeS0+cmVncyA9IGNvdmVyYWdlX3N0YXJ0X3JlZ2lzdGVycyhoKTsKKwllbnRyeS0+bmVzdGluZyA9IGNvdmVyYWdlLT5uZXN0aW5nOworCWVudHJ5LT5tYXRjaGVkID0gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBERUNPREVfVFlQRV9UQUJMRSkgeworCQlzdHJ1Y3QgZGVjb2RlX3RhYmxlICpkID0gKHN0cnVjdCBkZWNvZGVfdGFibGUgKiloOworCQlpbnQgcmV0OworCQkrK2NvdmVyYWdlLT5uZXN0aW5nOworCQlyZXQgPSB0YWJsZV9pdGVyKGQtPnRhYmxlLnRhYmxlLCBjb3ZlcmFnZV9zdGFydF9mbiwgY292ZXJhZ2UpOworCQktLWNvdmVyYWdlLT5uZXN0aW5nOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvdmVyYWdlX3N0YXJ0KGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtICp0YWJsZSkKK3sKKwljb3ZlcmFnZS5iYXNlID0ga21hbGxvYyhNQVhfQ09WRVJBR0VfRU5UUklFUyAqCisJCQkJc2l6ZW9mKHN0cnVjdCBjb3ZlcmFnZV9lbnRyeSksIEdGUF9LRVJORUwpOworCWNvdmVyYWdlLm51bV9lbnRyaWVzID0gMDsKKwljb3ZlcmFnZS5uZXN0aW5nID0gMDsKKwlyZXR1cm4gdGFibGVfaXRlcih0YWJsZSwgY292ZXJhZ2Vfc3RhcnRfZm4sICZjb3ZlcmFnZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3ZlcmFnZV9hZGRfcmVnaXN0ZXJzKHN0cnVjdCBjb3ZlcmFnZV9lbnRyeSAqZW50cnksIGtwcm9iZV9vcGNvZGVfdCBpbnNuKQoreworCWludCByZWdzID0gZW50cnktPmhlYWRlci0+dHlwZV9yZWdzLmJpdHMgPj4gREVDT0RFX1RZUEVfQklUUzsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkgKz0gNCkgeworCQllbnVtIGRlY29kZV9yZWdfdHlwZSByZWdfdHlwZSA9IChyZWdzID4+IGkpICYgMHhmOworCQlpbnQgcmVnID0gKGluc24gPj4gaSkgJiAweGY7CisJCWludCBmbGFnOworCisJCWlmICghcmVnX3R5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAocmVnID09IDEzKQorCQkJZmxhZyA9IENPVkVSQUdFX1NQOworCQllbHNlIGlmIChyZWcgPT0gMTUpCisJCQlmbGFnID0gQ09WRVJBR0VfUEM7CisJCWVsc2UKKwkJCWZsYWcgPSBDT1ZFUkFHRV9BTllfUkVHOworCQllbnRyeS0+cmVncyAmPSB+KGZsYWcgPDwgaSk7CisKKwkJc3dpdGNoIChyZWdfdHlwZSkgeworCisJCWNhc2UgUkVHX1RZUEVfTk9ORToKKwkJY2FzZSBSRUdfVFlQRV9BTlk6CisJCWNhc2UgUkVHX1RZUEVfU0FNRUFTMTY6CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX1NQOgorCQkJaWYgKHJlZyAhPSAxMykKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX1BDOgorCQkJaWYgKHJlZyAhPSAxNSkKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX05PU1A6CisJCQlpZiAocmVnID09IDEzKQorCQkJCXJldHVybjsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVHX1RZUEVfTk9TUFBDOgorCQljYXNlIFJFR19UWVBFX05PU1BQQ1g6CisJCQlpZiAocmVnID09IDEzIHx8IHJlZyA9PSAxNSkKKwkJCQlyZXR1cm47CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX05PUENXQjoKKwkJCWlmICghaXNfd3JpdGViYWNrKGluc24pKQorCQkJCWJyZWFrOworCQkJaWYgKHJlZyA9PSAxNSkgeworCQkJCWVudHJ5LT5yZWdzICY9IH4oQ09WRVJBR0VfUENXQiA8PCBpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJFR19UWVBFX05PUEM6CisJCWNhc2UgUkVHX1RZUEVfTk9QQ1g6CisJCQlpZiAocmVnID09IDE1KQorCQkJCXJldHVybjsKKwkJCWJyZWFrOworCQl9CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvdmVyYWdlX2FkZChrcHJvYmVfb3Bjb2RlX3QgaW5zbikKK3sKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVudHJ5ID0gY292ZXJhZ2UuYmFzZTsKKwlzdHJ1Y3QgY292ZXJhZ2VfZW50cnkgKmVuZCA9IGNvdmVyYWdlLmJhc2UgKyBjb3ZlcmFnZS5udW1fZW50cmllczsKKwlib29sIG1hdGNoZWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBuZXN0aW5nID0gMDsKKworCWZvciAoOyBlbnRyeSA8IGVuZDsgKytlbnRyeSkgeworCQljb25zdCBzdHJ1Y3QgZGVjb2RlX2hlYWRlciAqaCA9IGVudHJ5LT5oZWFkZXI7CisJCWVudW0gZGVjb2RlX3R5cGUgdHlwZSA9IGgtPnR5cGVfcmVncy5iaXRzICYgREVDT0RFX1RZUEVfTUFTSzsKKworCQlpZiAoZW50cnktPm5lc3RpbmcgPiBuZXN0aW5nKQorCQkJY29udGludWU7IC8qIFNraXAgc3ViLXRhYmxlIHdlIGRpZG4ndCBtYXRjaCAqLworCisJCWlmIChlbnRyeS0+bmVzdGluZyA8IG5lc3RpbmcpCisJCQlicmVhazsgLyogRW5kIG9mIHN1Yi10YWJsZSB3ZSB3ZXJlIHNjYW5uaW5nICovCisKKwkJaWYgKCFtYXRjaGVkKSB7CisJCQlpZiAoKGluc24gJiBoLT5tYXNrLmJpdHMpICE9IGgtPnZhbHVlLmJpdHMpCisJCQkJY29udGludWU7CisJCQllbnRyeS0+bWF0Y2hlZCA9IHRydWU7CisJCX0KKworCQlzd2l0Y2ggKHR5cGUpIHsKKworCQljYXNlIERFQ09ERV9UWVBFX1RBQkxFOgorCQkJKytuZXN0aW5nOworCQkJYnJlYWs7CisKKwkJY2FzZSBERUNPREVfVFlQRV9DVVNUT006CisJCWNhc2UgREVDT0RFX1RZUEVfU0lNVUxBVEU6CisJCWNhc2UgREVDT0RFX1RZUEVfRU1VTEFURToKKwkJCWNvdmVyYWdlX2FkZF9yZWdpc3RlcnMoZW50cnksIGluc24pOworCQkJcmV0dXJuOworCisJCWNhc2UgREVDT0RFX1RZUEVfT1I6CisJCQltYXRjaGVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgREVDT0RFX1RZUEVfUkVKRUNUOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvdmVyYWdlX2VuZCh2b2lkKQoreworCXN0cnVjdCBjb3ZlcmFnZV9lbnRyeSAqZW50cnkgPSBjb3ZlcmFnZS5iYXNlOworCXN0cnVjdCBjb3ZlcmFnZV9lbnRyeSAqZW5kID0gY292ZXJhZ2UuYmFzZSArIGNvdmVyYWdlLm51bV9lbnRyaWVzOworCisJZm9yICg7IGVudHJ5IDwgZW5kOyArK2VudHJ5KSB7CisJCXUzMiBtYXNrID0gZW50cnktPmhlYWRlci0+bWFzay5iaXRzOworCQl1MzIgdmFsdWUgPSBlbnRyeS0+aGVhZGVyLT52YWx1ZS5iaXRzOworCisJCWlmIChlbnRyeS0+cmVncykgeworCQkJcHJfZXJyKCJGQUlMOiBSZWdpc3RlciB0ZXN0IGNvdmVyYWdlIG1pc3NpbmcgZm9yICUwOHggJTA4eCAoJTA1eClcbiIsCisJCQkJbWFzaywgdmFsdWUsIGVudHJ5LT5yZWdzKTsKKwkJCWNvdmVyYWdlX2ZhaWwgPSB0cnVlOworCQl9CisJCWlmICghZW50cnktPm1hdGNoZWQpIHsKKwkJCXByX2VycigiRkFJTDogVGVzdCBjb3ZlcmFnZSBlbnRyeSBtaXNzaW5nIGZvciAlMDh4ICUwOHhcbiIsCisJCQkJbWFzaywgdmFsdWUpOworCQkJY292ZXJhZ2VfZmFpbCA9IHRydWU7CisJCX0KKwl9CisKKwlrZnJlZShjb3ZlcmFnZS5iYXNlKTsKK30KKworCisvKgorICogRnJhbWV3b3JrIGZvciBpbnN0cnVjdGlvbiBzZXQgdGVzdCBjYXNlcworICovCisKK3ZvaWQgX19uYWtlZCBfX2twcm9iZXNfdGVzdF9jYXNlX3N0YXJ0KHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RtZGIJc3AhLCB7cjQtcjExfQkJCQlcblx0IgorCQkic3ViCXNwLCBzcCwgIyJfX3N0cmluZ2lmeShURVNUX01FTU9SWV9TSVpFKSJcblx0IgorCQkiYmljCXIwLCBsciwgIzEgIEAgcjAgPSBpbmxpbmUgdGl0bGUgc3RyaW5nCVxuXHQiCisJCSJtb3YJcjEsIHNwCQkJCQlcblx0IgorCQkiYmwJa3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQJCQlcblx0IgorCQkiYngJcjAJCQkJCVxuXHQiCisJKTsKK30KKworI2lmbmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCit2b2lkIF9fbmFrZWQgX19rcHJvYmVzX3Rlc3RfY2FzZV9lbmRfMzIodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtb3YJcjQsIGxyCQkJCQlcblx0IgorCQkiYmwJa3Byb2Jlc190ZXN0X2Nhc2VfZW5kCQkJXG5cdCIKKwkJImNtcAlyMCwgIzAJCQkJCVxuXHQiCisJCSJtb3ZuZQlwYywgcjAJCQkJCVxuXHQiCisJCSJtb3YJcjAsIHI0CQkJCQlcblx0IgorCQkiYWRkCXNwLCBzcCwgIyJfX3N0cmluZ2lmeShURVNUX01FTU9SWV9TSVpFKSJcblx0IgorCQkibGRtaWEJc3AhLCB7cjQtcjExfQkJCQlcblx0IgorCQkibW92CXBjLCByMAkJCQkJXG5cdCIKKwkpOworfQorCisjZWxzZSAvKiBDT05GSUdfVEhVTUIyX0tFUk5FTCAqLworCit2b2lkIF9fbmFrZWQgX19rcHJvYmVzX3Rlc3RfY2FzZV9lbmRfMTYodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtb3YJcjQsIGxyCQkJCQlcblx0IgorCQkiYmwJa3Byb2Jlc190ZXN0X2Nhc2VfZW5kCQkJXG5cdCIKKwkJImNtcAlyMCwgIzAJCQkJCVxuXHQiCisJCSJieG5lCXIwCQkJCQlcblx0IgorCQkibW92CXIwLCByNAkJCQkJXG5cdCIKKwkJImFkZAlzcCwgc3AsICMiX19zdHJpbmdpZnkoVEVTVF9NRU1PUllfU0laRSkiXG5cdCIKKwkJImxkbWlhCXNwISwge3I0LXIxMX0JCQkJXG5cdCIKKwkJImJ4CXIwCQkJCQlcblx0IgorCSk7Cit9CisKK3ZvaWQgX19uYWtlZCBfX2twcm9iZXNfdGVzdF9jYXNlX2VuZF8zMih2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIi5hcm0JCQkJCQlcblx0IgorCQkib3JyCWxyLCBsciwgIzEgIEAgd2lsbCByZXR1cm4gdG8gVGh1bWIgY29kZQlcblx0IgorCQkibGRyCXBjLCAxZgkJCQkJXG5cdCIKKwkJIjE6CQkJCQkJXG5cdCIKKwkJIi53b3JkCV9fa3Byb2Jlc190ZXN0X2Nhc2VfZW5kXzE2CQlcblx0IgorCSk7Cit9CisKKyNlbmRpZgorCisKK2ludCBrcHJvYmVfdGVzdF9mbGFnczsKK2ludCBrcHJvYmVfdGVzdF9jY19wb3NpdGlvbjsKKworc3RhdGljIGludCB0ZXN0X3RyeV9jb3VudDsKK3N0YXRpYyBpbnQgdGVzdF9wYXNzX2NvdW50Oworc3RhdGljIGludCB0ZXN0X2ZhaWxfY291bnQ7CisKK3N0YXRpYyBzdHJ1Y3QgcHRfcmVncyBpbml0aWFsX3JlZ3M7CitzdGF0aWMgc3RydWN0IHB0X3JlZ3MgZXhwZWN0ZWRfcmVnczsKK3N0YXRpYyBzdHJ1Y3QgcHRfcmVncyByZXN1bHRfcmVnczsKKworc3RhdGljIHUzMiBleHBlY3RlZF9tZW1vcnlbVEVTVF9NRU1PUllfU0laRS9zaXplb2YodTMyKV07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X3RpdGxlOworc3RhdGljIHN0cnVjdCB0ZXN0X2FyZyAqY3VycmVudF9hcmdzOworc3RhdGljIHUzMiAqY3VycmVudF9zdGFjazsKK3N0YXRpYyB1aW50cHRyX3QgY3VycmVudF9icmFuY2hfdGFyZ2V0OworCitzdGF0aWMgdWludHB0cl90IGN1cnJlbnRfY29kZV9zdGFydDsKK3N0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgY3VycmVudF9pbnN0cnVjdGlvbjsKKworCisjZGVmaW5lIFRFU1RfQ0FTRV9QQVNTRUQgLTEKKyNkZWZpbmUgVEVTVF9DQVNFX0ZBSUxFRCAtMgorCitzdGF0aWMgaW50IHRlc3RfY2FzZV9ydW5fY291bnQ7CitzdGF0aWMgYm9vbCB0ZXN0X2Nhc2VfaXNfdGh1bWI7CitzdGF0aWMgaW50IHRlc3RfaW5zdGFuY2U7CisKKy8qCisgKiBXZSBpZ25vcmUgdGhlIHN0YXRlIG9mIHRoZSBpbXByZWNpc2UgYWJvcnQgZGlzYWJsZSBmbGFnIChDUFNSLkEpIGJlY2F1c2UgdGhpcworICogY2FuIGNoYW5nZSByYW5kb21seSBhcyB0aGUga2VybmVsIGRvZXNuJ3QgdGFrZSBjYXJlIHRvIHByZXNlcnZlIG9yIGluaXRpYWxpc2UKKyAqIHRoaXMgYWNyb3NzIGNvbnRleHQgc3dpdGNoZXMuIEFsc28sIHdpdGggU2VjdXJpdHkgRXh0ZW50aW9ucywgdGhlIGZsYWcgbWF5CisgKiBub3QgYmUgdW5kZXIgY29udHJvbCBvZiB0aGUga2VybmVsOyBmb3IgdGhpcyByZWFzb24gd2UgaWdub3JlIHRoZSBzdGF0ZSBvZgorICogdGhlIEZJUSBkaXNhYmxlIGZsYWcgQ1BTUi5GIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgUFNSX0lHTk9SRV9CSVRTIChQU1JfQV9CSVQgfCBQU1JfRl9CSVQpCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRlc3RfY2hlY2tfY2MoaW50IGNjLCB1bnNpZ25lZCBsb25nIGNwc3IpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCisJc3dpdGNoIChjYykgeworCWNhc2UgMHgwOiAvKiBlcSAqLworCQlyZXR1cm4gY3BzciAmIFBTUl9aX0JJVDsKKworCWNhc2UgMHgxOiAvKiBuZSAqLworCQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9aX0JJVDsKKworCWNhc2UgMHgyOiAvKiBjcyAqLworCQlyZXR1cm4gY3BzciAmIFBTUl9DX0JJVDsKKworCWNhc2UgMHgzOiAvKiBjYyAqLworCQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9DX0JJVDsKKworCWNhc2UgMHg0OiAvKiBtaSAqLworCQlyZXR1cm4gY3BzciAmIFBTUl9OX0JJVDsKKworCWNhc2UgMHg1OiAvKiBwbCAqLworCQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9OX0JJVDsKKworCWNhc2UgMHg2OiAvKiB2cyAqLworCQlyZXR1cm4gY3BzciAmIFBTUl9WX0JJVDsKKworCWNhc2UgMHg3OiAvKiB2YyAqLworCQlyZXR1cm4gKH5jcHNyKSAmIFBTUl9WX0JJVDsKKworCWNhc2UgMHg4OiAvKiBoaSAqLworCQljcHNyICY9IH4oY3BzciA+PiAxKTsgLyogUFNSX0NfQklUICY9IH5QU1JfWl9CSVQgKi8KKwkJcmV0dXJuIGNwc3IgJiBQU1JfQ19CSVQ7CisKKwljYXNlIDB4OTogLyogbHMgKi8KKwkJY3BzciAmPSB+KGNwc3IgPj4gMSk7IC8qIFBTUl9DX0JJVCAmPSB+UFNSX1pfQklUICovCisJCXJldHVybiAofmNwc3IpICYgUFNSX0NfQklUOworCisJY2FzZSAweGE6IC8qIGdlICovCisJCWNwc3IgXj0gKGNwc3IgPDwgMyk7IC8qIFBTUl9OX0JJVCBePSBQU1JfVl9CSVQgKi8KKwkJcmV0dXJuICh+Y3BzcikgJiBQU1JfTl9CSVQ7CisKKwljYXNlIDB4YjogLyogbHQgKi8KKwkJY3BzciBePSAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLworCQlyZXR1cm4gY3BzciAmIFBTUl9OX0JJVDsKKworCWNhc2UgMHhjOiAvKiBndCAqLworCQl0ZW1wID0gY3BzciBeIChjcHNyIDw8IDMpOyAvKiBQU1JfTl9CSVQgXj0gUFNSX1ZfQklUICovCisJCXRlbXAgfD0gKGNwc3IgPDwgMSk7CSAgIC8qIFBTUl9OX0JJVCB8PSBQU1JfWl9CSVQgKi8KKwkJcmV0dXJuICh+dGVtcCkgJiBQU1JfTl9CSVQ7CisKKwljYXNlIDB4ZDogLyogbGUgKi8KKwkJdGVtcCA9IGNwc3IgXiAoY3BzciA8PCAzKTsgLyogUFNSX05fQklUIF49IFBTUl9WX0JJVCAqLworCQl0ZW1wIHw9IChjcHNyIDw8IDEpOwkgICAvKiBQU1JfTl9CSVQgfD0gUFNSX1pfQklUICovCisJCXJldHVybiB0ZW1wICYgUFNSX05fQklUOworCisJY2FzZSAweGU6IC8qIGFsICovCisJY2FzZSAweGY6IC8qIHVuY29uZGl0aW9uYWwgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCUJVRygpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBpc19sYXN0X3NjZW5hcmlvOworc3RhdGljIGludCBwcm9iZV9zaG91bGRfcnVuOyAvKiAwID0gbm8sIDEgPSB5ZXMsIC0xID0gdW5rbm93biAqLworc3RhdGljIGludCBtZW1vcnlfbmVlZHNfY2hlY2tpbmc7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRlc3RfY29udGV4dF9jcHNyKGludCBzY2VuYXJpbykKK3sKKwl1bnNpZ25lZCBsb25nIGNwc3I7CisKKwlwcm9iZV9zaG91bGRfcnVuID0gMTsKKworCS8qIERlZmF1bHQgY2FzZSBpcyB0aGF0IHdlIGN5Y2xlIHRocm91Z2ggMTYgY29tYmluYXRpb25zIG9mIGZsYWdzICovCisJY3BzciAgPSAoc2NlbmFyaW8gJiAweGYpIDw8IDI4OyAvKiBOLFosQyxWIGZsYWdzICovCisJY3BzciB8PSAoc2NlbmFyaW8gJiAweGYpIDw8IDE2OyAvKiBHRSBmbGFncyAqLworCWNwc3IgfD0gKHNjZW5hcmlvICYgMHgxKSA8PCAyNzsgLyogVG9nZ2xlIFEgZmxhZyAqLworCisJaWYgKCF0ZXN0X2Nhc2VfaXNfdGh1bWIpIHsKKwkJLyogVGVzdGluZyBBUk0gY29kZSAqLworCQlwcm9iZV9zaG91bGRfcnVuID0gdGVzdF9jaGVja19jYyhjdXJyZW50X2luc3RydWN0aW9uID4+IDI4LCBjcHNyKSAhPSAwOworCQlpZiAoc2NlbmFyaW8gPT0gMTUpCisJCQlpc19sYXN0X3NjZW5hcmlvID0gdHJ1ZTsKKworCX0gZWxzZSBpZiAoa3Byb2JlX3Rlc3RfZmxhZ3MgJiBURVNUX0ZMQUdfTk9fSVRCTE9DSykgeworCQkvKiBUZXN0aW5nIFRodW1iIGNvZGUgd2l0aG91dCBzZXR0aW5nIElUU1RBVEUgKi8KKwkJaWYgKGtwcm9iZV90ZXN0X2NjX3Bvc2l0aW9uKSB7CisJCQlpbnQgY2MgPSAoY3VycmVudF9pbnN0cnVjdGlvbiA+PiBrcHJvYmVfdGVzdF9jY19wb3NpdGlvbikgJiAweGY7CisJCQlwcm9iZV9zaG91bGRfcnVuID0gdGVzdF9jaGVja19jYyhjYywgY3BzcikgIT0gMDsKKwkJfQorCisJCWlmIChzY2VuYXJpbyA9PSAxNSkKKwkJCWlzX2xhc3Rfc2NlbmFyaW8gPSB0cnVlOworCisJfSBlbHNlIGlmIChrcHJvYmVfdGVzdF9mbGFncyAmIFRFU1RfRkxBR19GVUxMX0lUQkxPQ0spIHsKKwkJLyogVGVzdGluZyBUaHVtYiBjb2RlIHdpdGggYWxsIGNvbWJpbmF0aW9ucyBvZiBJVFNUQVRFICovCisJCXVuc2lnbmVkIHggPSAoc2NlbmFyaW8gPj4gNCk7CisJCXVuc2lnbmVkIGNvbmRfYmFzZSA9IHggJSA3OyAvKiBJVFNUQVRFPDc6NT4gKi8KKwkJdW5zaWduZWQgbWFzayA9IHggLyA3ICsgMjsgIC8qIElUU1RBVEU8NDowPiwgYml0cyByZXZlcnNlZCAqLworCisJCWlmIChtYXNrID4gMHgxZikgeworCQkJLyogRmluaXNoIGJ5IHRlc3Rpbmcgc3RhdGUgZnJvbSBpbnN0cnVjdGlvbiAnaXR0IGFsJyAqLworCQkJY29uZF9iYXNlID0gNzsKKwkJCW1hc2sgPSAweDQ7CisJCQlpZiAoKHNjZW5hcmlvICYgMHhmKSA9PSAweGYpCisJCQkJaXNfbGFzdF9zY2VuYXJpbyA9IHRydWU7CisJCX0KKworCQljcHNyIHw9IGNvbmRfYmFzZSA8PCAxMzsJLyogSVRTVEFURTw3OjU+ICovCisJCWNwc3IgfD0gKG1hc2sgJiAweDEpIDw8IDEyOwkvKiBJVFNUQVRFPDQ+ICovCisJCWNwc3IgfD0gKG1hc2sgJiAweDIpIDw8IDEwOwkvKiBJVFNUQVRFPDM+ICovCisJCWNwc3IgfD0gKG1hc2sgJiAweDQpIDw8IDg7CS8qIElUU1RBVEU8Mj4gKi8KKwkJY3BzciB8PSAobWFzayAmIDB4OCkgPDwgMjM7CS8qIElUU1RBVEU8MT4gKi8KKwkJY3BzciB8PSAobWFzayAmIDB4MTApIDw8IDIxOwkvKiBJVFNUQVRFPDA+ICovCisKKwkJcHJvYmVfc2hvdWxkX3J1biA9IHRlc3RfY2hlY2tfY2MoKGNwc3IgPj4gMTIpICYgMHhmLCBjcHNyKSAhPSAwOworCisJfSBlbHNlIHsKKwkJLyogVGVzdGluZyBUaHVtYiBjb2RlIHdpdGggc2V2ZXJhbCBjb21iaW5hdGlvbnMgb2YgSVRTVEFURSAqLworCQlzd2l0Y2ggKHNjZW5hcmlvKSB7CisJCWNhc2UgMTY6IC8qIENsZWFyIE5aQ1YgZmxhZ3MgYW5kICdpdCBlcScgc3RhdGUgKGZhbHNlIGFzIFo9MCkgKi8KKwkJCWNwc3IgPSAweDAwMDAwODAwOworCQkJcHJvYmVfc2hvdWxkX3J1biA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxNzogLyogU2V0IE5aQ1YgZmxhZ3MgYW5kICdpdCB2Yycgc3RhdGUgKGZhbHNlIGFzIFY9MSkgKi8KKwkJCWNwc3IgPSAweGYwMDA3ODAwOworCQkJcHJvYmVfc2hvdWxkX3J1biA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxODogLyogQ2xlYXIgTlpDViBmbGFncyBhbmQgJ2l0IGxzJyBzdGF0ZSAodHJ1ZSBhcyBDPTApICovCisJCQljcHNyID0gMHgwMDAwOTgwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5OiAvKiBTZXQgTlpDViBmbGFncyBhbmQgJ2l0IGNzJyBzdGF0ZSAodHJ1ZSBhcyBDPTEpICovCisJCQljcHNyID0gMHhmMDAwMjgwMDsKKwkJCWlzX2xhc3Rfc2NlbmFyaW8gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY3BzcjsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfdGVzdF9jb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBzY2VuYXJpbyA9IHRlc3RfY2FzZV9ydW5fY291bnQ+PjE7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJc3RydWN0IHRlc3RfYXJnICphcmdzOworCWludCBpOworCisJaXNfbGFzdF9zY2VuYXJpbyA9IGZhbHNlOworCW1lbW9yeV9uZWVkc19jaGVja2luZyA9IGZhbHNlOworCisJLyogSW5pdGlhbGlzZSB0ZXN0IG1lbW9yeSBvbiBzdGFjayAqLworCXZhbCA9IChzY2VuYXJpbyAmIDEpID8gVkFMTSA6IH5WQUxNOworCWZvciAoaSA9IDA7IGkgPCBURVNUX01FTU9SWV9TSVpFIC8gc2l6ZW9mKGN1cnJlbnRfc3RhY2tbMF0pOyArK2kpCisJCWN1cnJlbnRfc3RhY2tbaV0gPSB2YWwgKyAoaSA8PCA4KTsKKwkvKiBQdXQgdGFyZ2V0IG9mIGJyYW5jaCBvbiBzdGFjayBmb3IgdGVzdHMgd2hpY2ggbG9hZCBQQyBmcm9tIG1lbW9yeSAqLworCWlmIChjdXJyZW50X2JyYW5jaF90YXJnZXQpCisJCWN1cnJlbnRfc3RhY2tbMTVdID0gY3VycmVudF9icmFuY2hfdGFyZ2V0OworCS8qIFB1dCBhIHZhbHVlIGZvciBTUCBvbiBzdGFjayBmb3IgdGVzdHMgd2hpY2ggbG9hZCBTUCBmcm9tIG1lbW9yeSAqLworCWN1cnJlbnRfc3RhY2tbMTNdID0gKHUzMiljdXJyZW50X3N0YWNrICsgMTIwOworCisJLyogSW5pdGlhbGlzZSByZWdpc3RlciB2YWx1ZXMgdG8gdGhlaXIgZGVmYXVsdCBzdGF0ZSAqLworCXZhbCA9IChzY2VuYXJpbyAmIDIpID8gVkFMUiA6IH5WQUxSOworCWZvciAoaSA9IDA7IGkgPCAxMzsgKytpKQorCQlyZWdzLT51cmVnc1tpXSA9IHZhbCBeIChpIDw8IDgpOworCXJlZ3MtPkFSTV9sciA9IHZhbCBeICgxNCA8PCA4KTsKKwlyZWdzLT5BUk1fY3BzciAmPSB+KEFQU1JfTUFTSyB8IFBTUl9JVF9NQVNLKTsKKwlyZWdzLT5BUk1fY3BzciB8PSB0ZXN0X2NvbnRleHRfY3BzcihzY2VuYXJpbyk7CisKKwkvKiBQZXJmb3JtIHRlc3RjYXNlIHNwZWNpZmljIHJlZ2lzdGVyIHNldHVwICAqLworCWFyZ3MgPSBjdXJyZW50X2FyZ3M7CisJZm9yICg7IGFyZ3NbMF0udHlwZSAhPSBBUkdfVFlQRV9FTkQ7ICsrYXJncykKKwkJc3dpdGNoIChhcmdzWzBdLnR5cGUpIHsKKwkJY2FzZSBBUkdfVFlQRV9SRUc6IHsKKwkJCXN0cnVjdCB0ZXN0X2FyZ19yZWdwdHIgKmFyZyA9CisJCQkJKHN0cnVjdCB0ZXN0X2FyZ19yZWdwdHIgKilhcmdzOworCQkJcmVncy0+dXJlZ3NbYXJnLT5yZWddID0gYXJnLT52YWw7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFSR19UWVBFX1BUUjogeworCQkJc3RydWN0IHRlc3RfYXJnX3JlZ3B0ciAqYXJnID0KKwkJCQkoc3RydWN0IHRlc3RfYXJnX3JlZ3B0ciAqKWFyZ3M7CisJCQlyZWdzLT51cmVnc1thcmctPnJlZ10gPQorCQkJCSh1bnNpZ25lZCBsb25nKWN1cnJlbnRfc3RhY2sgKyBhcmctPnZhbDsKKwkJCW1lbW9yeV9uZWVkc19jaGVja2luZyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEFSR19UWVBFX01FTTogeworCQkJc3RydWN0IHRlc3RfYXJnX21lbSAqYXJnID0gKHN0cnVjdCB0ZXN0X2FyZ19tZW0gKilhcmdzOworCQkJY3VycmVudF9zdGFja1thcmctPmluZGV4XSA9IGFyZy0+dmFsOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9Cit9CisKK3N0cnVjdCB0ZXN0X3Byb2JlIHsKKwlzdHJ1Y3Qga3Byb2JlCWtwcm9iZTsKKwlib29sCQlyZWdpc3RlcmVkOworCWludAkJaGl0OworfTsKKworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKHN0cnVjdCB0ZXN0X3Byb2JlICpwcm9iZSkKK3sKKwlpZiAocHJvYmUtPnJlZ2lzdGVyZWQpIHsKKwkJdW5yZWdpc3Rlcl9rcHJvYmUoJnByb2JlLT5rcHJvYmUpOworCQlwcm9iZS0+a3Byb2JlLmZsYWdzID0gMDsgLyogQ2xlYXIgZGlzYWJsZSBmbGFnIHRvIGFsbG93IHJldXNlICovCisJfQorCXByb2JlLT5yZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfdGVzdF9wcm9iZShzdHJ1Y3QgdGVzdF9wcm9iZSAqcHJvYmUpCit7CisJaW50IHJldDsKKworCWlmIChwcm9iZS0+cmVnaXN0ZXJlZCkKKwkJQlVHKCk7CisKKwlyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJnByb2JlLT5rcHJvYmUpOworCWlmIChyZXQgPj0gMCkgeworCQlwcm9iZS0+cmVnaXN0ZXJlZCA9IHRydWU7CisJCXByb2JlLT5oaXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2twcm9iZXMKK3Rlc3RfYmVmb3JlX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgdGVzdF9wcm9iZSwga3Byb2JlKS0+aGl0ID0gdGVzdF9pbnN0YW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19rcHJvYmVzCit0ZXN0X2JlZm9yZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzZXR1cF90ZXN0X2NvbnRleHQocmVncyk7CisJaW5pdGlhbF9yZWdzID0gKnJlZ3M7CisJaW5pdGlhbF9yZWdzLkFSTV9jcHNyICY9IH5QU1JfSUdOT1JFX0JJVFM7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzCit0ZXN0X2Nhc2VfcHJlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY29udGFpbmVyX29mKHAsIHN0cnVjdCB0ZXN0X3Byb2JlLCBrcHJvYmUpLT5oaXQgPSB0ZXN0X2luc3RhbmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcwordGVzdF9hZnRlcl9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoY29udGFpbmVyX29mKHAsIHN0cnVjdCB0ZXN0X3Byb2JlLCBrcHJvYmUpLT5oaXQgPT0gdGVzdF9pbnN0YW5jZSkKKwkJcmV0dXJuIDA7IC8qIEFscmVhZHkgcnVuIGZvciB0aGlzIHRlc3QgaW5zdGFuY2UgKi8KKworCXJlc3VsdF9yZWdzID0gKnJlZ3M7CisJcmVzdWx0X3JlZ3MuQVJNX2Nwc3IgJj0gflBTUl9JR05PUkVfQklUUzsKKworCS8qIFVuZG8gYW55IGNoYW5nZXMgZG9uZSB0byBTUCBieSB0aGUgdGVzdCBjYXNlICovCisJcmVncy0+QVJNX3NwID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudF9zdGFjazsKKworCWNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgdGVzdF9wcm9iZSwga3Byb2JlKS0+aGl0ID0gdGVzdF9pbnN0YW5jZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0ZXN0X3Byb2JlIHRlc3RfYmVmb3JlX3Byb2JlID0geworCS5rcHJvYmUucHJlX2hhbmRsZXIJPSB0ZXN0X2JlZm9yZV9wcmVfaGFuZGxlciwKKwkua3Byb2JlLnBvc3RfaGFuZGxlcgk9IHRlc3RfYmVmb3JlX3Bvc3RfaGFuZGxlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9wcm9iZSB0ZXN0X2Nhc2VfcHJvYmUgPSB7CisJLmtwcm9iZS5wcmVfaGFuZGxlcgk9IHRlc3RfY2FzZV9wcmVfaGFuZGxlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9wcm9iZSB0ZXN0X2FmdGVyX3Byb2JlID0geworCS5rcHJvYmUucHJlX2hhbmRsZXIJPSB0ZXN0X2FmdGVyX3ByZV9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZXN0X3Byb2JlIHRlc3RfYWZ0ZXIyX3Byb2JlID0geworCS5rcHJvYmUucHJlX2hhbmRsZXIJPSB0ZXN0X2FmdGVyX3ByZV9oYW5kbGVyLAorfTsKKworc3RhdGljIHZvaWQgdGVzdF9jYXNlX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfYmVmb3JlX3Byb2JlKTsKKwl1bnJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfY2FzZV9wcm9iZSk7CisJdW5yZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2FmdGVyX3Byb2JlKTsKKwl1bnJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfYWZ0ZXIyX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByX2VycigicjAgICUwOGx4IHwgcjEgICUwOGx4IHwgcjIgICUwOGx4IHwgcjMgICUwOGx4XG4iLAorCQlyZWdzLT5BUk1fcjAsIHJlZ3MtPkFSTV9yMSwgcmVncy0+QVJNX3IyLCByZWdzLT5BUk1fcjMpOworCXByX2VycigicjQgICUwOGx4IHwgcjUgICUwOGx4IHwgcjYgICUwOGx4IHwgcjcgICUwOGx4XG4iLAorCQlyZWdzLT5BUk1fcjQsIHJlZ3MtPkFSTV9yNSwgcmVncy0+QVJNX3I2LCByZWdzLT5BUk1fcjcpOworCXByX2VycigicjggICUwOGx4IHwgcjkgICUwOGx4IHwgcjEwICUwOGx4IHwgcjExICUwOGx4XG4iLAorCQlyZWdzLT5BUk1fcjgsIHJlZ3MtPkFSTV9yOSwgcmVncy0+QVJNX3IxMCwgcmVncy0+QVJNX2ZwKTsKKwlwcl9lcnIoInIxMiAlMDhseCB8IHNwICAlMDhseCB8IGxyICAlMDhseCB8IHBjICAlMDhseFxuIiwKKwkJcmVncy0+QVJNX2lwLCByZWdzLT5BUk1fc3AsIHJlZ3MtPkFSTV9sciwgcmVncy0+QVJNX3BjKTsKKwlwcl9lcnIoImNwc3IgJTA4bHhcbiIsIHJlZ3MtPkFSTV9jcHNyKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVtb3J5KHUzMiAqbWVtLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZih1MzIpOyBpICs9IDQpCisJCXByX2VycigiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgbWVtW2ldLCBtZW1baSsxXSwKKwkJCQkJCW1lbVtpKzJdLCBtZW1baSszXSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZXhwZWN0ZWRfbWVtb3J5X3NpemUodTMyICpzcCkKK3sKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihleHBlY3RlZF9tZW1vcnkpOworCWludCBvZmZzZXQgPSAodWludHB0cl90KXNwIC0gKHVpbnRwdHJfdCljdXJyZW50X3N0YWNrOworCWlmIChvZmZzZXQgPiAwKQorCQlzaXplIC09IG9mZnNldDsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jYXNlX2ZhaWxlZChjb25zdCBjaGFyICptZXNzYWdlKQoreworCXRlc3RfY2FzZV9jbGVhbnVwKCk7CisKKwlwcl9lcnIoIkZBSUw6ICVzXG4iLCBtZXNzYWdlKTsKKwlwcl9lcnIoIkZBSUw6IFRlc3QgJXNcbiIsIGN1cnJlbnRfdGl0bGUpOworCXByX2VycigiRkFJTDogU2NlbmFyaW8gJWRcbiIsIHRlc3RfY2FzZV9ydW5fY291bnQgPj4gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRfaW5zdHJ1Y3Rpb24odW5zaWduZWQgbG9uZyBwYykKK3sKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorCWlmICgocGMgJiAxKSAmJiAhaXNfd2lkZV9pbnN0cnVjdGlvbigqKHUxNiAqKShwYyAtIDEpKSkKKwkJcmV0dXJuIHBjICsgMjsKKwllbHNlCisjZW5kaWYKKwlyZXR1cm4gcGMgKyA0OworfQorCitzdGF0aWMgdWludHB0cl90IF9fdXNlZCBrcHJvYmVzX3Rlc3RfY2FzZV9zdGFydChjb25zdCBjaGFyICp0aXRsZSwgdm9pZCAqc3RhY2spCit7CisJc3RydWN0IHRlc3RfYXJnICphcmdzOworCXN0cnVjdCB0ZXN0X2FyZ19lbmQgKmVuZF9hcmc7CisJdW5zaWduZWQgbG9uZyB0ZXN0X2NvZGU7CisKKwlhcmdzID0gKHN0cnVjdCB0ZXN0X2FyZyAqKVBUUl9BTElHTih0aXRsZSArIHN0cmxlbih0aXRsZSkgKyAxLCA0KTsKKworCWN1cnJlbnRfdGl0bGUgPSB0aXRsZTsKKwljdXJyZW50X2FyZ3MgPSBhcmdzOworCWN1cnJlbnRfc3RhY2sgPSBzdGFjazsKKworCSsrdGVzdF90cnlfY291bnQ7CisKKwl3aGlsZSAoYXJncy0+dHlwZSAhPSBBUkdfVFlQRV9FTkQpCisJCSsrYXJnczsKKwllbmRfYXJnID0gKHN0cnVjdCB0ZXN0X2FyZ19lbmQgKilhcmdzOworCisJdGVzdF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpKGFyZ3MgKyAxKTsgLyogQ29kZSBzdGFydHMgYWZ0ZXIgYXJncyAqLworCisJdGVzdF9jYXNlX2lzX3RodW1iID0gZW5kX2FyZy0+ZmxhZ3MgJiBBUkdfRkxBR19USFVNQjsKKwlpZiAodGVzdF9jYXNlX2lzX3RodW1iKQorCQl0ZXN0X2NvZGUgfD0gMTsKKworCWN1cnJlbnRfY29kZV9zdGFydCA9IHRlc3RfY29kZTsKKworCWN1cnJlbnRfYnJhbmNoX3RhcmdldCA9IDA7CisJaWYgKGVuZF9hcmctPmJyYW5jaF9vZmZzZXQgIT0gZW5kX2FyZy0+ZW5kX29mZnNldCkKKwkJY3VycmVudF9icmFuY2hfdGFyZ2V0ID0gdGVzdF9jb2RlICsgZW5kX2FyZy0+YnJhbmNoX29mZnNldDsKKworCXRlc3RfY29kZSArPSBlbmRfYXJnLT5jb2RlX29mZnNldDsKKwl0ZXN0X2JlZm9yZV9wcm9iZS5rcHJvYmUuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKil0ZXN0X2NvZGU7CisKKwl0ZXN0X2NvZGUgPSBuZXh0X2luc3RydWN0aW9uKHRlc3RfY29kZSk7CisJdGVzdF9jYXNlX3Byb2JlLmtwcm9iZS5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKXRlc3RfY29kZTsKKworCWlmICh0ZXN0X2Nhc2VfaXNfdGh1bWIpIHsKKwkJdTE2ICpwID0gKHUxNiAqKSh0ZXN0X2NvZGUgJiB+MSk7CisJCWN1cnJlbnRfaW5zdHJ1Y3Rpb24gPSBwWzBdOworCQlpZiAoaXNfd2lkZV9pbnN0cnVjdGlvbihjdXJyZW50X2luc3RydWN0aW9uKSkgeworCQkJY3VycmVudF9pbnN0cnVjdGlvbiA8PD0gMTY7CisJCQljdXJyZW50X2luc3RydWN0aW9uIHw9IHBbMV07CisJCX0KKwl9IGVsc2UgeworCQljdXJyZW50X2luc3RydWN0aW9uID0gKih1MzIgKil0ZXN0X2NvZGU7CisJfQorCisJaWYgKGN1cnJlbnRfdGl0bGVbMF0gPT0gJy4nKQorCQl2ZXJib3NlKCIlc1xuIiwgY3VycmVudF90aXRsZSk7CisJZWxzZQorCQl2ZXJib3NlKCIlc1x0QCAlMCp4XG4iLCBjdXJyZW50X3RpdGxlLAorCQkJCQl0ZXN0X2Nhc2VfaXNfdGh1bWIgPyA0IDogOCwKKwkJCQkJY3VycmVudF9pbnN0cnVjdGlvbik7CisKKwl0ZXN0X2NvZGUgPSBuZXh0X2luc3RydWN0aW9uKHRlc3RfY29kZSk7CisJdGVzdF9hZnRlcl9wcm9iZS5rcHJvYmUuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKil0ZXN0X2NvZGU7CisKKwlpZiAoa3Byb2JlX3Rlc3RfZmxhZ3MgJiBURVNUX0ZMQUdfTkFSUk9XX0lOU1RSKSB7CisJCWlmICghdGVzdF9jYXNlX2lzX3RodW1iIHx8CisJCQlpc193aWRlX2luc3RydWN0aW9uKGN1cnJlbnRfaW5zdHJ1Y3Rpb24pKSB7CisJCQkJdGVzdF9jYXNlX2ZhaWxlZCgiZXhwZWN0ZWQgMTYtYml0IGluc3RydWN0aW9uIik7CisJCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfY2FzZV9pc190aHVtYiAmJgorCQkJIWlzX3dpZGVfaW5zdHJ1Y3Rpb24oY3VycmVudF9pbnN0cnVjdGlvbikpIHsKKwkJCQl0ZXN0X2Nhc2VfZmFpbGVkKCJleHBlY3RlZCAzMi1iaXQgaW5zdHJ1Y3Rpb24iKTsKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwljb3ZlcmFnZV9hZGQoY3VycmVudF9pbnN0cnVjdGlvbik7CisKKwlpZiAoZW5kX2FyZy0+ZmxhZ3MgJiBBUkdfRkxBR19VTlNVUFBPUlRFRCkgeworCQlpZiAocmVnaXN0ZXJfdGVzdF9wcm9iZSgmdGVzdF9jYXNlX3Byb2JlKSA8IDApCisJCQlnb3RvIHBhc3M7CisJCXRlc3RfY2FzZV9mYWlsZWQoInJlZ2lzdGVyZWQgcHJvYmUgZm9yIHVuc3VwcG9ydGVkIGluc3RydWN0aW9uIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoZW5kX2FyZy0+ZmxhZ3MgJiBBUkdfRkxBR19TVVBQT1JURUQpIHsKKwkJaWYgKHJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfY2FzZV9wcm9iZSkgPj0gMCkKKwkJCWdvdG8gcGFzczsKKwkJdGVzdF9jYXNlX2ZhaWxlZCgiY291bGRuJ3QgcmVnaXN0ZXIgcHJvYmUgZm9yIHN1cHBvcnRlZCBpbnN0cnVjdGlvbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfYmVmb3JlX3Byb2JlKSA8IDApIHsKKwkJdGVzdF9jYXNlX2ZhaWxlZCgicmVnaXN0ZXIgdGVzdF9iZWZvcmVfcHJvYmUgZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfYWZ0ZXJfcHJvYmUpIDwgMCkgeworCQl0ZXN0X2Nhc2VfZmFpbGVkKCJyZWdpc3RlciB0ZXN0X2FmdGVyX3Byb2JlIGZhaWxlZCIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChjdXJyZW50X2JyYW5jaF90YXJnZXQpIHsKKwkJdGVzdF9hZnRlcjJfcHJvYmUua3Byb2JlLmFkZHIgPQorCQkJCShrcHJvYmVfb3Bjb2RlX3QgKiljdXJyZW50X2JyYW5jaF90YXJnZXQ7CisJCWlmIChyZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2FmdGVyMl9wcm9iZSkgPCAwKSB7CisJCQl0ZXN0X2Nhc2VfZmFpbGVkKCJyZWdpc3RlciB0ZXN0X2FmdGVyMl9wcm9iZSBmYWlsZWQiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIFN0YXJ0IGZpcnN0IHJ1biBvZiB0ZXN0IGNhc2UgKi8KKwl0ZXN0X2Nhc2VfcnVuX2NvdW50ID0gMDsKKwkrK3Rlc3RfaW5zdGFuY2U7CisJcmV0dXJuIGN1cnJlbnRfY29kZV9zdGFydDsKK3Bhc3M6CisJdGVzdF9jYXNlX3J1bl9jb3VudCA9IFRFU1RfQ0FTRV9QQVNTRUQ7CisJcmV0dXJuICh1aW50cHRyX3QpdGVzdF9hZnRlcl9wcm9iZS5rcHJvYmUuYWRkcjsKK2ZhaWw6CisJdGVzdF9jYXNlX3J1bl9jb3VudCA9IFRFU1RfQ0FTRV9GQUlMRUQ7CisJcmV0dXJuICh1aW50cHRyX3QpdGVzdF9hZnRlcl9wcm9iZS5rcHJvYmUuYWRkcjsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfdGVzdF9yZXN1bHRzKHZvaWQpCit7CisJc2l6ZV90IG1lbV9zaXplID0gMDsKKwl1MzIgKm1lbSA9IDA7CisKKwlpZiAobWVtY21wKCZleHBlY3RlZF9yZWdzLCAmcmVzdWx0X3JlZ3MsIHNpemVvZihleHBlY3RlZF9yZWdzKSkpIHsKKwkJdGVzdF9jYXNlX2ZhaWxlZCgicmVnaXN0ZXJzIGRpZmZlciIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKG1lbW9yeV9uZWVkc19jaGVja2luZykgeworCQltZW0gPSAodTMyICopcmVzdWx0X3JlZ3MuQVJNX3NwOworCQltZW1fc2l6ZSA9IGV4cGVjdGVkX21lbW9yeV9zaXplKG1lbSk7CisJCWlmIChtZW1jbXAoZXhwZWN0ZWRfbWVtb3J5LCBtZW0sIG1lbV9zaXplKSkgeworCQkJdGVzdF9jYXNlX2ZhaWxlZCgidGVzdCBtZW1vcnkgZGlmZmVycyIpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7CisKK2ZhaWw6CisJcHJfZXJyKCJpbml0aWFsX3JlZ3M6XG4iKTsKKwlwcmludF9yZWdpc3RlcnMoJmluaXRpYWxfcmVncyk7CisJcHJfZXJyKCJleHBlY3RlZF9yZWdzOlxuIik7CisJcHJpbnRfcmVnaXN0ZXJzKCZleHBlY3RlZF9yZWdzKTsKKwlwcl9lcnIoInJlc3VsdF9yZWdzOlxuIik7CisJcHJpbnRfcmVnaXN0ZXJzKCZyZXN1bHRfcmVncyk7CisKKwlpZiAobWVtKSB7CisJCXByX2VycigiY3VycmVudF9zdGFjaz0lcFxuIiwgY3VycmVudF9zdGFjayk7CisJCXByX2VycigiZXhwZWN0ZWRfbWVtb3J5OlxuIik7CisJCXByaW50X21lbW9yeShleHBlY3RlZF9tZW1vcnksIG1lbV9zaXplKTsKKwkJcHJfZXJyKCJyZXN1bHRfbWVtb3J5OlxuIik7CisJCXByaW50X21lbW9yeShtZW0sIG1lbV9zaXplKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB1aW50cHRyX3QgX191c2VkIGtwcm9iZXNfdGVzdF9jYXNlX2VuZCh2b2lkKQoreworCWlmICh0ZXN0X2Nhc2VfcnVuX2NvdW50IDwgMCkgeworCQlpZiAodGVzdF9jYXNlX3J1bl9jb3VudCA9PSBURVNUX0NBU0VfUEFTU0VEKQorCQkJLyoga3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQgZGlkIGFsbCB0aGUgbmVlZGVkIHRlc3RpbmcgKi8KKwkJCWdvdG8gcGFzczsKKwkJZWxzZQorCQkJLyoga3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQgZmFpbGVkICovCisJCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHRlc3RfYmVmb3JlX3Byb2JlLmhpdCAhPSB0ZXN0X2luc3RhbmNlKSB7CisJCXRlc3RfY2FzZV9mYWlsZWQoInRlc3RfYmVmb3JlX2hhbmRsZXIgbm90IHJ1biIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHRlc3RfYWZ0ZXJfcHJvYmUuaGl0ICE9IHRlc3RfaW5zdGFuY2UgJiYKKwkJCQl0ZXN0X2FmdGVyMl9wcm9iZS5oaXQgIT0gdGVzdF9pbnN0YW5jZSkgeworCQl0ZXN0X2Nhc2VfZmFpbGVkKCJ0ZXN0X2FmdGVyX2hhbmRsZXIgbm90IHJ1biIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBFdmVuIG51bWJlcmVkIHRlc3QgcnVucyByYW4gd2l0aG91dCBhIHByb2JlIG9uIHRoZSB0ZXN0IGNhc2Ugc28KKwkgKiB3ZSBjYW4gZ2F0aGVyIHJlZmVyZW5jZSByZXN1bHRzLiBUaGUgc3Vic2VxdWVudCBvZGQgbnVtYmVyZWQgcnVuCisJICogd2lsbCBoYXZlIHRoZSBwcm9iZSBpbnNlcnRlZC4KKwkqLworCWlmICgodGVzdF9jYXNlX3J1bl9jb3VudCAmIDEpID09IDApIHsKKwkJLyogU2F2ZSByZXN1bHRzIGZyb20gcnVuIHdpdGhvdXQgcHJvYmUgKi8KKwkJdTMyICptZW0gPSAodTMyICopcmVzdWx0X3JlZ3MuQVJNX3NwOworCQlleHBlY3RlZF9yZWdzID0gcmVzdWx0X3JlZ3M7CisJCW1lbWNweShleHBlY3RlZF9tZW1vcnksIG1lbSwgZXhwZWN0ZWRfbWVtb3J5X3NpemUobWVtKSk7CisKKwkJLyogSW5zZXJ0IHByb2JlIG9udG8gdGVzdCBjYXNlIGluc3RydWN0aW9uICovCisJCWlmIChyZWdpc3Rlcl90ZXN0X3Byb2JlKCZ0ZXN0X2Nhc2VfcHJvYmUpIDwgMCkgeworCQkJdGVzdF9jYXNlX2ZhaWxlZCgicmVnaXN0ZXIgdGVzdF9jYXNlX3Byb2JlIGZhaWxlZCIpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgcHJvYmUgcmFuIGFzIGV4cGVjdGVkICovCisJCWlmIChwcm9iZV9zaG91bGRfcnVuID09IDEpIHsKKwkJCWlmICh0ZXN0X2Nhc2VfcHJvYmUuaGl0ICE9IHRlc3RfaW5zdGFuY2UpIHsKKwkJCQl0ZXN0X2Nhc2VfZmFpbGVkKCJ0ZXN0X2Nhc2VfaGFuZGxlciBub3QgcnVuIik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9IGVsc2UgaWYgKHByb2JlX3Nob3VsZF9ydW4gPT0gMCkgeworCQkJaWYgKHRlc3RfY2FzZV9wcm9iZS5oaXQgPT0gdGVzdF9pbnN0YW5jZSkgeworCQkJCXRlc3RfY2FzZV9mYWlsZWQoInRlc3RfY2FzZV9oYW5kbGVyIHJhbiIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCS8qIFJlbW92ZSBwcm9iZSBmb3IgYW55IHN1YnNlcXVlbnQgcmVmZXJlbmNlIHJ1biAqLworCQl1bnJlZ2lzdGVyX3Rlc3RfcHJvYmUoJnRlc3RfY2FzZV9wcm9iZSk7CisKKwkJaWYgKCFjaGVja190ZXN0X3Jlc3VsdHMoKSkKKwkJCWdvdG8gZmFpbDsKKworCQlpZiAoaXNfbGFzdF9zY2VuYXJpbykKKwkJCWdvdG8gcGFzczsKKwl9CisKKwkvKiBEbyBuZXh0IHRlc3QgcnVuICovCisJKyt0ZXN0X2Nhc2VfcnVuX2NvdW50OworCSsrdGVzdF9pbnN0YW5jZTsKKwlyZXR1cm4gY3VycmVudF9jb2RlX3N0YXJ0OworZmFpbDoKKwkrK3Rlc3RfZmFpbF9jb3VudDsKKwlnb3RvIGVuZDsKK3Bhc3M6CisJKyt0ZXN0X3Bhc3NfY291bnQ7CitlbmQ6CisJdGVzdF9jYXNlX2NsZWFudXAoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVG9wIGxldmVsIHRlc3QgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBydW5fdGVzdF9jYXNlcyh2b2lkICgqdGVzdHMpKHZvaWQpLCBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSAqdGFibGUpCit7CisJaW50IHJldDsKKworCXByX2luZm8oIiAgICBDaGVjayBkZWNvZGluZyB0YWJsZXNcbiIpOworCXJldCA9IHRhYmxlX3Rlc3QodGFibGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwcl9pbmZvKCIgICAgUnVuIHRlc3QgY2FzZXNcbiIpOworCXJldCA9IGNvdmVyYWdlX3N0YXJ0KHRhYmxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGVzdHMoKTsKKworCWNvdmVyYWdlX2VuZCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHJ1bl9hbGxfdGVzdHModm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByX2luZm8oIkJlZ2luaW5nIGtwcm9iZSB0ZXN0cy4uLlxuIik7CisKKyNpZm5kZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKworCXByX2luZm8oIlByb2JlIEFSTSBjb2RlXG4iKTsKKwlyZXQgPSBydW5fYXBpX3Rlc3RzKGFybV9mdW5jKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXByX2luZm8oIkFSTSBpbnN0cnVjdGlvbiBzaW11bGF0aW9uXG4iKTsKKwlyZXQgPSBydW5fdGVzdF9jYXNlcyhrcHJvYmVfYXJtX3Rlc3RfY2FzZXMsIGtwcm9iZV9kZWNvZGVfYXJtX3RhYmxlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworI2Vsc2UgLyogQ09ORklHX1RIVU1CMl9LRVJORUwgKi8KKworCXByX2luZm8oIlByb2JlIDE2LWJpdCBUaHVtYiBjb2RlXG4iKTsKKwlyZXQgPSBydW5fYXBpX3Rlc3RzKHRodW1iMTZfZnVuYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwcl9pbmZvKCJQcm9iZSAzMi1iaXQgVGh1bWIgY29kZSwgZXZlbiBoYWxmd29yZFxuIik7CisJcmV0ID0gcnVuX2FwaV90ZXN0cyh0aHVtYjMyZXZlbl9mdW5jKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXByX2luZm8oIlByb2JlIDMyLWJpdCBUaHVtYiBjb2RlLCBvZGQgaGFsZndvcmRcbiIpOworCXJldCA9IHJ1bl9hcGlfdGVzdHModGh1bWIzMm9kZF9mdW5jKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXByX2luZm8oIjE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbiBzaW11bGF0aW9uXG4iKTsKKwlyZXQgPSBydW5fdGVzdF9jYXNlcyhrcHJvYmVfdGh1bWIxNl90ZXN0X2Nhc2VzLAorCQkJCWtwcm9iZV9kZWNvZGVfdGh1bWIxNl90YWJsZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwcl9pbmZvKCIzMi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gc2ltdWxhdGlvblxuIik7CisJcmV0ID0gcnVuX3Rlc3RfY2FzZXMoa3Byb2JlX3RodW1iMzJfdGVzdF9jYXNlcywKKwkJCQlrcHJvYmVfZGVjb2RlX3RodW1iMzJfdGFibGUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworI2VuZGlmCisKKwlwcl9pbmZvKCJUb3RhbCBpbnN0cnVjdGlvbiBzaW11bGF0aW9uIHRlc3RzPSVkLCBwYXNzPSVkIGZhaWw9JWRcbiIsCisJCXRlc3RfdHJ5X2NvdW50LCB0ZXN0X3Bhc3NfY291bnQsIHRlc3RfZmFpbF9jb3VudCk7CisJaWYgKHRlc3RfZmFpbF9jb3VudCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiBCRU5DSE1BUktJTkcKKwlwcl9pbmZvKCJCZW5jaG1hcmtzXG4iKTsKKwlyZXQgPSBydW5fYmVuY2htYXJrcygpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworI2VuZGlmCisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNworCS8qIFdlIGFyZSBhYmxlIHRvIHJ1biBhbGwgdGVzdCBjYXNlcyBzbyBjb3ZlcmFnZSBzaG91bGQgYmUgY29tcGxldGUgKi8KKwlpZiAoY292ZXJhZ2VfZmFpbCkgeworCQlwcl9lcnIoIkZBSUw6IFRlc3QgY292ZXJhZ2UgY2hlY2tzIGZhaWxlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCitvdXQ6CisJaWYgKHJldCA9PSAwKQorCQlwcl9pbmZvKCJGaW5pc2hlZCBrcHJvYmUgdGVzdHMgT0tcbiIpOworCWVsc2UKKwkJcHJfZXJyKCJrcHJvYmUgdGVzdHMgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIE1vZHVsZSBzZXR1cAorICovCisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHZvaWQgX19leGl0IGtwcm9iZV90ZXN0X2V4aXQodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQocnVuX2FsbF90ZXN0cykKK21vZHVsZV9leGl0KGtwcm9iZV90ZXN0X2V4aXQpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNlbHNlIC8qICFNT0RVTEUgKi8KKworbGF0ZV9pbml0Y2FsbChydW5fYWxsX3Rlc3RzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmggYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjNWQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuaApAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIGFyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRlc3QuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKb24gTWVkaHVyc3QgPHRpeHlAeXhpdC5jby51az4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjZGVmaW5lIFZFUkJPU0UgMCAvKiBTZXQgdG8gJzEnIGZvciBtb3JlIGxvZ2dpbmcgb2YgdGVzdCBjYXNlcyAqLworCisjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKKyNkZWZpbmUgTk9STUFMX0lTQSAiMTYiCisjZWxzZQorI2RlZmluZSBOT1JNQUxfSVNBICIzMiIKKyNlbmRpZgorCisKKy8qIEZsYWdzIHVzZWQgaW4ga3Byb2JlX3Rlc3RfZmxhZ3MgKi8KKyNkZWZpbmUgVEVTVF9GTEFHX05PX0lUQkxPQ0sJKDE8PDApCisjZGVmaW5lIFRFU1RfRkxBR19GVUxMX0lUQkxPQ0sJKDE8PDEpCisjZGVmaW5lIFRFU1RfRkxBR19OQVJST1dfSU5TVFIJKDE8PDIpCisKK2V4dGVybiBpbnQga3Byb2JlX3Rlc3RfZmxhZ3M7CitleHRlcm4gaW50IGtwcm9iZV90ZXN0X2NjX3Bvc2l0aW9uOworCisKKyNkZWZpbmUgVEVTVF9NRU1PUllfU0laRSAyNTYKKworCisvKgorICogVGVzdCBjYXNlIHN0cnVjdHVyZXMuCisgKgorICogVGhlIGFyZ3VtZW50cyBnaXZlbiB0byB0ZXN0IGNhc2VzIGNhbiBiZSBvbmUgb2YgdGhyZWUgdHlwZXMuCisgKgorICogICBBUkdfVFlQRV9SRUcKKyAqCUxvYWQgYSByZWdpc3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiAgIEFSR19UWVBFX1BUUgorICoJTG9hZCBhIHJlZ2lzdGVyIHdpdGggYSBwb2ludGVyIGludG8gdGhlIHN0YWNrIGJ1ZmZlciAoU1AgKyBnaXZlbiB2YWx1ZSkuCisgKgorICogICBBUkdfVFlQRV9NRU0KKyAqCVN0b3JlIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBzdGFjayBidWZmZXIgYXQgW1NQK2luZGV4XS4KKyAqCisgKi8KKworI2RlZmluZQlBUkdfVFlQRV9FTkQJMAorI2RlZmluZQlBUkdfVFlQRV9SRUcJMQorI2RlZmluZQlBUkdfVFlQRV9QVFIJMgorI2RlZmluZQlBUkdfVFlQRV9NRU0JMworCisjZGVmaW5lIEFSR19GTEFHX1VOU1VQUE9SVEVECTB4MDEKKyNkZWZpbmUgQVJHX0ZMQUdfU1VQUE9SVEVECTB4MDIKKyNkZWZpbmUgQVJHX0ZMQUdfVEhVTUIJCTB4MTAJLyogTXVzdCBiZSAxNiBzbyBURVNUX0lTQSBjYW4gYmUgdXNlZCAqLworI2RlZmluZSBBUkdfRkxBR19BUk0JCTB4MjAJLyogTXVzdCBiZSAzMiBzbyBURVNUX0lTQSBjYW4gYmUgdXNlZCAqLworCitzdHJ1Y3QgdGVzdF9hcmcgeworCXU4CXR5cGU7CQkvKiBBUkdfVFlQRV94ICovCisJdTgJX3BhZGRpbmdbN107Cit9OworCitzdHJ1Y3QgdGVzdF9hcmdfcmVncHRyIHsKKwl1OAl0eXBlOwkJLyogQVJHX1RZUEVfUkVHIG9yIEFSR19UWVBFX1BUUiAqLworCXU4CXJlZzsKKwl1OAlfcGFkZGluZ1syXTsKKwl1MzIJdmFsOworfTsKKworc3RydWN0IHRlc3RfYXJnX21lbSB7CisJdTgJdHlwZTsJCS8qIEFSR19UWVBFX01FTSAqLworCXU4CWluZGV4OworCXU4CV9wYWRkaW5nWzJdOworCXUzMgl2YWw7Cit9OworCitzdHJ1Y3QgdGVzdF9hcmdfZW5kIHsKKwl1OAl0eXBlOwkJLyogQVJHX1RZUEVfRU5EICovCisJdTgJZmxhZ3M7CQkvKiBBUkdfRkxBR194ICovCisJdTE2CWNvZGVfb2Zmc2V0OworCXUxNglicmFuY2hfb2Zmc2V0OworCXUxNgllbmRfb2Zmc2V0OworfTsKKworCisvKgorICogQnVpbGRpbmcgYmxvY2tzIGZvciB0ZXN0IGNhc2VzLgorICoKKyAqIEVhY2ggdGVzdCBjYXNlIGlzIHdyYXBwZWQgYmV0d2VlbiBURVNUQ0FTRV9TVEFSVCBhbmQgVEVTVENBU0VfRU5ELgorICoKKyAqIFRvIHNwZWNpZnkgYXJndW1lbnRzIGZvciBhIHRlc3QgY2FzZSB0aGUgVEVTVF9BUkdfe1JFRyxQVFIsTUVNfSBtYWNyb3MgYXJlCisgKiB1c2VkIGZvbGxvd2VkIGJ5IGEgdGVybWluYXRpbmcgVEVTVF9BUkdfRU5ELgorICoKKyAqIEFmdGVyIHRoaXMsIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB0ZXN0ZWQgaXMgZGVmaW5lZCB3aXRoIFRFU1RfSU5TVFJVQ1RJT04uCisgKiBPciBmb3IgYnJhbmNoZXMsIFRFU1RfQlJBTkNIX0IgYW5kIFRFU1RfQlJBTkNIX0YgKGJyYW5jaCBmb3J3YXJkcy9iYWNrd2FyZHMpLgorICoKKyAqIFNvbWUgc3BlY2lmaWMgdGVzdCBjYXNlcyBtYXkgbWFrZSB1c2Ugb2Ygb3RoZXIgY3VzdG9tIGNvbnN0cnVjdHMuCisgKi8KKworI2lmIFZFUkJPU0UKKyNkZWZpbmUgdmVyYm9zZShmbXQsIC4uLikgcHJfaW5mbyhmbXQsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSB2ZXJib3NlKGZtdCwgLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVEVTVF9HUk9VUCh0aXRsZSkJCQkJCVwKKwl2ZXJib3NlKCJcbiIpOwkJCQkJCVwKKwl2ZXJib3NlKHRpdGxlIlxuIik7CQkJCQlcCisJdmVyYm9zZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworI2RlZmluZSBURVNUQ0FTRV9TVEFSVCh0aXRsZSkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCisJImJsCV9fa3Byb2Jlc190ZXN0X2Nhc2Vfc3RhcnQJCVxuXHQiCVwKKwkvKiBkb24ndCB1c2UgLmFzY2l6IGhlcmUgYXMgJ3RpdGxlJyBtYXkgYmUgKi8JCVwKKwkvKiBtdWx0aXBsZSBzdHJpbmdzIHRvIGJlIGNvbmNhdGVuYXRlZC4gICovCQlcCisJIi5hc2NpaSAiI3RpdGxlIgkJCQlcblx0IglcCisJIi5ieXRlCTAJCQkJCVxuXHQiCVwKKwkiLmFsaWduCTIJCQkJCVxuXHQiCisKKyNkZWZpbmUJVEVTVF9BUkdfUkVHKHJlZywgdmFsKQkJCQkJXAorCSIuYnl0ZQkiX19zdHJpbmdpZnkoQVJHX1RZUEVfUkVHKSIJCVxuXHQiCVwKKwkiLmJ5dGUJIiNyZWciCQkJCQlcblx0IglcCisJIi5zaG9ydAkwCQkJCQlcblx0IglcCisJIi53b3JkCSIjdmFsIgkJCQkJXG5cdCIKKworI2RlZmluZQlURVNUX0FSR19QVFIocmVnLCB2YWwpCQkJCQlcCisJIi5ieXRlCSJfX3N0cmluZ2lmeShBUkdfVFlQRV9QVFIpIgkJXG5cdCIJXAorCSIuYnl0ZQkiI3JlZyIJCQkJCVxuXHQiCVwKKwkiLnNob3J0CTAJCQkJCVxuXHQiCVwKKwkiLndvcmQJIiN2YWwiCQkJCQlcblx0IgorCisjZGVmaW5lCVRFU1RfQVJHX01FTShpbmRleCwgdmFsKQkJCQlcCisJIi5ieXRlCSJfX3N0cmluZ2lmeShBUkdfVFlQRV9NRU0pIgkJXG5cdCIJXAorCSIuYnl0ZQkiI2luZGV4IgkJCQlcblx0IglcCisJIi5zaG9ydAkwCQkJCQlcblx0IglcCisJIi53b3JkCSIjdmFsIgkJCQkJXG5cdCIKKworI2RlZmluZQlURVNUX0FSR19FTkQoZmxhZ3MpCQkJCQlcCisJIi5ieXRlCSJfX3N0cmluZ2lmeShBUkdfVFlQRV9FTkQpIgkJXG5cdCIJXAorCSIuYnl0ZQkiVEVTVF9JU0EgZmxhZ3MiCQkJXG5cdCIJXAorCSIuc2hvcnQJNTBmLTBmCQkJCQlcblx0IglcCisJIi5zaG9ydAkyZi0wZgkJCQkJXG5cdCIJXAorCSIuc2hvcnQJOTlmLTBmCQkJCQlcblx0IglcCisJIi5jb2RlICJURVNUX0lTQSIJCQkJXG5cdCIJXAorCSIwOgkJCQkJCVxuXHQiCisKKyNkZWZpbmUgVEVTVF9JTlNUUlVDVElPTihpbnN0cnVjdGlvbikJCQkJXAorCSI1MDoJbm9wCQkJCQlcblx0IglcCisJIjE6CSJpbnN0cnVjdGlvbiIJCQkJXG5cdCIJXAorCSIJbm9wCQkJCQlcblx0IgorCisjZGVmaW5lIFRFU1RfQlJBTkNIX0YoaW5zdHJ1Y3Rpb24sIHh0cmFfZGlzdCkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihpbnN0cnVjdGlvbikJCQkJXAorCSIuaWYgIiN4dHJhX2Rpc3QiCQkJCVxuXHQiCVwKKwkiCWIJOTlmCQkJCVxuXHQiCVwKKwkiLnNwYWNlICIjeHRyYV9kaXN0IgkJCQlcblx0IglcCisJIi5lbmRpZgkJCQkJCVxuXHQiCVwKKwkiCWIJOTlmCQkJCVxuXHQiCVwKKwkiMjoJbm9wCQkJCQlcblx0IgorCisjZGVmaW5lIFRFU1RfQlJBTkNIX0IoaW5zdHJ1Y3Rpb24sIHh0cmFfZGlzdCkJCQlcCisJIgliCTUwZgkJCQlcblx0IglcCisJIgliCTk5ZgkJCQlcblx0IglcCisJIjI6CW5vcAkJCQkJXG5cdCIJXAorCSIJYgk5OWYJCQkJXG5cdCIJXAorCSIuaWYgIiN4dHJhX2Rpc3QiCQkJCVxuXHQiCVwKKwkiLnNwYWNlICIjeHRyYV9kaXN0IgkJCQlcblx0IglcCisJIi5lbmRpZgkJCQkJCVxuXHQiCVwKKwlURVNUX0lOU1RSVUNUSU9OKGluc3RydWN0aW9uKQorCisjZGVmaW5lIFRFU1RDQVNFX0VORAkJCQkJCVwKKwkiMjoJCQkJCQlcblx0IglcCisJIjk5OgkJCQkJCVxuXHQiCVwKKwkiCWJsIF9fa3Byb2Jlc190ZXN0X2Nhc2VfZW5kXyJURVNUX0lTQSIJXG5cdCIJXAorCSIuY29kZSAiTk9STUFMX0lTQSIJCQkJXG5cdCIJXAorCTogOgkJCQkJCQlcCisJOiAicjAiLCAicjEiLCAicjIiLCAicjMiLCAiaXAiLCAibHIiLCAibWVtb3J5IiwgImNjIglcCisJKTsKKworCisvKgorICogTWFjcm9zIHRvIGRlZmluZSB0ZXN0IGNhc2VzLgorICoKKyAqIFRob3NlIG9mIHRoZSBmb3JtIFRFU1Rfe1IsUCxNfSogY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRlc3QgY2FzZXMKKyAqIHdoaWNoIHRha2UgY29tYmluYXRpb25zIG9mIHRoZSB0aHJlZSBiYXNpYyB0eXBlcyBvZiBhcmd1bWVudHMuIEUuZy4KKyAqCisgKiAgIFRFU1RfUglPbmUgcmVnaXN0ZXIgYXJndW1lbnQKKyAqICAgVEVTVF9SUglUd28gcmVnaXN0ZXIgYXJndW1lbnRzCisgKiAgIFRFU1RfUlBSCUEgcmVnaXN0ZXIsIGEgcG9pbnRlciwgdGhlbiBhIHJlZ2lzdGVyIGFyZ3VtZW50CisgKgorICogRm9yIHRlc3RpbmcgaW5zdHJ1Y3Rpb25zIHdoaWNoIG1heSBicmFuY2gsIHRoZXJlIGFyZSBtYWNyb3MgVEVTVF9CRl8qCisgKiBhbmQgVEVTVF9CQl8qIGZvciBicmFuY2hpbmcgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcy4KKyAqCisgKiBURVNUX1NVUFBPUlRFRCBhbmQgVEVTVF9VTlNVUFBPUlRFRCBkb24ndCBjYXVzZSB0aGUgY29kZSB0byBiZSBleGVjdXRlZCwKKyAqIHRoZSBqdXN0IHZlcmlmeSB0aGF0IGEga3Byb2JlIGlzIG9yIGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAqLworCisjZGVmaW5lIFRFU1QoY29kZSkJCQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUpCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlKQkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1VOU1VQUE9SVEVEKGNvZGUpCQkJCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQkJCVwKKwlURVNUX0FSR19FTkQoInwiX19zdHJpbmdpZnkoQVJHX0ZMQUdfVU5TVVBQT1JURUQpKQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlKQkJCQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfU1VQUE9SVEVEKGNvZGUpCQkJCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZSkJCQkJCVwKKwlURVNUX0FSR19FTkQoInwiX19zdHJpbmdpZnkoQVJHX0ZMQUdfU1VQUE9SVEVEKSkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZSkJCQkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1IoY29kZTEsIHJlZywgdmFsLCBjb2RlMikJCQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZyBjb2RlMikJCVwKKwlURVNUX0FSR19SRUcocmVnLCB2YWwpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcgY29kZTIpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9SUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMpCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUlJSKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMiwgcmVnMiwgdmFsMiwgY29kZTMsIHJlZzMsIHZhbDMsIGNvZGU0KVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCkJCVwKKwlURVNUX0FSR19SRUcocmVnMSwgdmFsMSkJCQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzIsIHZhbDIpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWczLCB2YWwzKQkJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0KQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUlJSUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCByZWczLCB2YWwzLCBjb2RlNCwgcmVnNCwgdmFsNCkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0ICNyZWc0KQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzMsIHZhbDMpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWc0LCB2YWw0KQkJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzICNyZWczIGNvZGU0ICNyZWc0KQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9QKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMikJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyKQlcCisJVEVTVF9BUkdfUFRSKHJlZzEsIHZhbDEpCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcxIGNvZGUyKQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9QUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMpCQlcCisJVEVTVF9BUkdfUFRSKHJlZzEsIHZhbDEpCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMiwgdmFsMikJCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUlAoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyLCByZWcyLCB2YWwyLCBjb2RlMykJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJXAorCVRFU1RfQVJHX1JFRyhyZWcxLCB2YWwxKQkJCQlcCisJVEVTVF9BUkdfUFRSKHJlZzIsIHZhbDIpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1BSUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCByZWczLCB2YWwzLCBjb2RlNClcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVF9BUkdfUFRSKHJlZzEsIHZhbDEpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcyLCB2YWwyKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMywgdmFsMykJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JQUihjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCByZWczLCB2YWwzLCBjb2RlNClcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCQkJXAorCVRFU1RfQVJHX1BUUihyZWcyLCB2YWwyKQkJCQkJCVwKKwlURVNUX0FSR19SRUcocmVnMywgdmFsMykJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JSUChjb2RlMSwgcmVnMSwgdmFsMSwgY29kZTIsIHJlZzIsIHZhbDIsIGNvZGUzLCByZWczLCB2YWwzLCBjb2RlNClcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMgI3JlZzMgY29kZTQpCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcyLCB2YWwyKQkJCQkJCVwKKwlURVNUX0FSR19QVFIocmVnMywgdmFsMykJCQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMyAjcmVnMyBjb2RlNCkJCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0JGX1AoY29kZTEsIHJlZzEsIHZhbDEsIGNvZGUyKQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZzEgY29kZTIpCVwKKwlURVNUX0FSR19QVFIocmVnMSwgdmFsMSkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCVRFU1RfQlJBTkNIX0YoY29kZTEgI3JlZzEgY29kZTIsIDApCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX0JGX1goY29kZSwgeHRyYV9kaXN0KQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUpCQkJXAorCVRFU1RfQVJHX0VORCgiIikJCQlcCisJVEVTVF9CUkFOQ0hfRihjb2RlLCB4dHJhX2Rpc3QpCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9CQl9YKGNvZGUsIHh0cmFfZGlzdCkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCVRFU1RfQlJBTkNIX0IoY29kZSwgeHRyYV9kaXN0KQkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfQkZfUlgoY29kZTEsIHJlZywgdmFsLCBjb2RlMiwgeHRyYV9kaXN0KQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZyBjb2RlMikJCVwKKwlURVNUX0FSR19SRUcocmVnLCB2YWwpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCVwKKwlURVNUX0JSQU5DSF9GKGNvZGUxICNyZWcgY29kZTIsIHh0cmFfZGlzdCkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfQkJfUlgoY29kZTEsIHJlZywgdmFsLCBjb2RlMiwgeHRyYV9kaXN0KQlcCisJVEVTVENBU0VfU1RBUlQoY29kZTEgI3JlZyBjb2RlMikJCVwKKwlURVNUX0FSR19SRUcocmVnLCB2YWwpCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCVwKKwlURVNUX0JSQU5DSF9CKGNvZGUxICNyZWcgY29kZTIsIHh0cmFfZGlzdCkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfQkYoY29kZSkJVEVTVF9CRl9YKGNvZGUsIDApCisjZGVmaW5lIFRFU1RfQkIoY29kZSkJVEVTVF9CQl9YKGNvZGUsIDApCisKKyNkZWZpbmUgVEVTVF9CRl9SKGNvZGUxLCByZWcsIHZhbCwgY29kZTIpIFRFU1RfQkZfUlgoY29kZTEsIHJlZywgdmFsLCBjb2RlMiwgMCkKKyNkZWZpbmUgVEVTVF9CQl9SKGNvZGUxLCByZWcsIHZhbCwgY29kZTIpIFRFU1RfQkJfUlgoY29kZTEsIHJlZywgdmFsLCBjb2RlMiwgMCkKKworI2RlZmluZSBURVNUX0JGX1JSKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMiwgcmVnMiwgdmFsMiwgY29kZTMpCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlMSAjcmVnMSBjb2RlMiAjcmVnMiBjb2RlMykJCVwKKwlURVNUX0FSR19SRUcocmVnMSwgdmFsMSkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcyLCB2YWwyKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQkJXAorCVRFU1RfQlJBTkNIX0YoY29kZTEgI3JlZzEgY29kZTIgI3JlZzIgY29kZTMsIDApCQlcCisJVEVTVENBU0VfRU5ECisKKyNkZWZpbmUgVEVTVF9YKGNvZGUsIGNvZGV4KQkJCVwKKwlURVNUQ0FTRV9TVEFSVChjb2RlKQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJXAorCVRFU1RfSU5TVFJVQ1RJT04oY29kZSkJCQlcCisJIgliCTk5ZgkJXG5cdCIJXAorCSIJImNvZGV4IgkJCVxuXHQiCVwKKwlURVNUQ0FTRV9FTkQKKworI2RlZmluZSBURVNUX1JYKGNvZGUxLCByZWcsIHZhbCwgY29kZTIsIGNvZGV4KQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcgY29kZTIpCQlcCisJVEVTVF9BUkdfUkVHKHJlZywgdmFsKQkJCQlcCisJVEVTVF9BUkdfRU5EKCIiKQkJCQlcCisJVEVTVF9JTlNUUlVDVElPTihjb2RlMSBfX3N0cmluZ2lmeShyZWcpIGNvZGUyKQlcCisJIgliCTk5ZgkJXG5cdCIJCVwKKwkiCSJjb2RleCIJCQlcblx0IgkJXAorCVRFU1RDQVNFX0VORAorCisjZGVmaW5lIFRFU1RfUlJYKGNvZGUxLCByZWcxLCB2YWwxLCBjb2RlMiwgcmVnMiwgdmFsMiwgY29kZTMsIGNvZGV4KQkJXAorCVRFU1RDQVNFX1NUQVJUKGNvZGUxICNyZWcxIGNvZGUyICNyZWcyIGNvZGUzKQkJCQlcCisJVEVTVF9BUkdfUkVHKHJlZzEsIHZhbDEpCQkJCQkJXAorCVRFU1RfQVJHX1JFRyhyZWcyLCB2YWwyKQkJCQkJCVwKKwlURVNUX0FSR19FTkQoIiIpCQkJCQkJCVwKKwlURVNUX0lOU1RSVUNUSU9OKGNvZGUxIF9fc3RyaW5naWZ5KHJlZzEpIGNvZGUyIF9fc3RyaW5naWZ5KHJlZzIpIGNvZGUzKQlcCisJIgliCTk5ZgkJXG5cdCIJCQkJCVwKKwkiCSJjb2RleCIJCQlcblx0IgkJCQkJXAorCVRFU1RDQVNFX0VORAorCisKKy8qIFZhcmlvdXMgdmFsdWVzIHVzZWQgaW4gdGVzdCBjYXNlcy4uLiAqLworI2RlZmluZSBOKHZhbCkJKHZhbCBeIDB4ZmZmZmZmZmYpCisjZGVmaW5lIFZBTDEJMHgxMjM0NTY3OAorI2RlZmluZSBWQUwyCU4oVkFMMSkKKyNkZWZpbmUgVkFMMwkweGE1ZjgwMQorI2RlZmluZSBWQUw0CU4oVkFMMykKKyNkZWZpbmUgVkFMTQkweDQ1Njc4OWFiCisjZGVmaW5lIFZBTFIJMHhkZWFkZGVhZAorI2RlZmluZSBISDEJMHgwMTIzZmVjYgorI2RlZmluZSBISDIJMHhhOTg3NDU2NworCisKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAordm9pZCBrcHJvYmVfdGh1bWIxNl90ZXN0X2Nhc2VzKHZvaWQpOwordm9pZCBrcHJvYmVfdGh1bWIzMl90ZXN0X2Nhc2VzKHZvaWQpOworI2Vsc2UKK3ZvaWQga3Byb2JlX2FybV90ZXN0X2Nhc2VzKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10aHVtYi5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMtdGh1bWIuYwppbmRleCA5MDJjYTU5Li44Zjk2ZWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy10aHVtYi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLXRodW1iLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImtwcm9iZXMuaCIKIApAQCAtOTQzLDYgKzk0NCw5IEBACiAJICovCiAJREVDT0RFX0VORAogfTsKKyNpZmRlZiBDT05GSUdfQVJNX0tQUk9CRVNfVEVTVF9NT0RVTEUKK0VYUE9SVF9TWU1CT0xfR1BMKGtwcm9iZV9kZWNvZGVfdGh1bWIzMl90YWJsZSk7CisjZW5kaWYKIAogc3RhdGljIHZvaWQgX19rcHJvYmVzCiB0MTZfc2ltdWxhdGVfYnhibHgoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0xNDIzLDYgKzE0MjcsOSBAQAogCiAJREVDT0RFX0VORAogfTsKKyNpZmRlZiBDT05GSUdfQVJNX0tQUk9CRVNfVEVTVF9NT0RVTEUKK0VYUE9SVF9TWU1CT0xfR1BMKGtwcm9iZV9kZWNvZGVfdGh1bWIxNl90YWJsZSk7CisjZW5kaWYKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHRodW1iX2NoZWNrX2NjKHVuc2lnbmVkIGxvbmcgY3BzcikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmggYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5oCmluZGV4IGE2YWVkYTAuLjM4OTQ1ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmgKKysrIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuaApAQCAtNDEzLDYgKzQxMywxNCBAQAogCURFQ09ERV9IRUFERVIoREVDT0RFX1RZUEVfUkVKRUNULCBfbWFzaywgX3ZhbHVlLCAwKQogCiAKKyNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAorZXh0ZXJuIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGtwcm9iZV9kZWNvZGVfdGh1bWIxNl90YWJsZVtdOworZXh0ZXJuIGNvbnN0IHVuaW9uIGRlY29kZV9pdGVtIGtwcm9iZV9kZWNvZGVfdGh1bWIzMl90YWJsZVtdOworI2Vsc2UKK2V4dGVybiBjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSBrcHJvYmVfZGVjb2RlX2FybV90YWJsZVtdOworI2VuZGlmCisKKwogaW50IGtwcm9iZV9kZWNvZGVfaW5zbihrcHJvYmVfb3Bjb2RlX3QgaW5zbiwgc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiAqYXNpLAogCQkJY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlLCBib29sIHRodW1iMTYpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jIGIvYXJjaC9hcm0va2VybmVsL2xlZHMuYwppbmRleCAwZjEwN2RjLi4wYmNkMzgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbGVkcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9sZWRzLmMKQEAgLTcsMTAgKzcsMTEgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggNTNjOWMyNi4uMjRlMjM0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xMiw5ICsxMiwxMCBAQAogICovCiAjZGVmaW5lIHByX2ZtdChmbXQpICJodyBwZXJmZXZlbnRzOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0yNiwxNiArMjcsOCBAQAogI2luY2x1ZGUgPGFzbS9wbXUuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG11X2RldmljZTsKLQogLyoKLSAqIEhhcmR3YXJlIGxvY2sgdG8gc2VyaWFsaXplIGFjY2Vzc2VzIHRvIFBNVSByZWdpc3RlcnMuIE5lZWRlZCBmb3IgdGhlCi0gKiByZWFkL21vZGlmeS93cml0ZSBzZXF1ZW5jZXMuCi0gKi8KLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHBtdV9sb2NrKTsKLQotLyoKLSAqIEFSTXY2IHN1cHBvcnRzIGEgbWF4aW11bSBvZiAzIGV2ZW50cywgc3RhcnRpbmcgZnJvbSBpbmRleCAxLiBJZiB3ZSBhZGQKKyAqIEFSTXY2IHN1cHBvcnRzIGEgbWF4aW11bSBvZiAzIGV2ZW50cywgc3RhcnRpbmcgZnJvbSBpbmRleCAwLiBJZiB3ZSBhZGQKICAqIGFub3RoZXIgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyBtb3JlLCB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoaXMgdG8gYmUgdGhlCiAgKiBsYXJnZXN0IG9mIGFsbCBwbGF0Zm9ybXMuCiAgKgpAQCAtNDMsNjIgKzM2LDI0IEBACiAgKiAgY3ljbGUgY291bnRlciBDQ05UICsgMzEgZXZlbnRzIGNvdW50ZXJzIENOVDAuLjMwLgogICogIENvcnRleC1BOCBoYXMgMSs0IGNvdW50ZXJzLCBDb3J0ZXgtQTkgaGFzIDErNiBjb3VudGVycy4KICAqLwotI2RlZmluZSBBUk1QTVVfTUFYX0hXRVZFTlRTCQkzMworI2RlZmluZSBBUk1QTVVfTUFYX0hXRVZFTlRTCQkzMgogCi0vKiBUaGUgZXZlbnRzIGZvciBhIGdpdmVuIENQVS4gKi8KLXN0cnVjdCBjcHVfaHdfZXZlbnRzIHsKLQkvKgotCSAqIFRoZSBldmVudHMgdGhhdCBhcmUgYWN0aXZlIG9uIHRoZSBDUFUgZm9yIHRoZSBnaXZlbiBpbmRleC4gSW5kZXggMAotCSAqIGlzIHJlc2VydmVkLgotCSAqLwotCXN0cnVjdCBwZXJmX2V2ZW50CSpldmVudHNbQVJNUE1VX01BWF9IV0VWRU5UU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfZXZlbnQgKiBbQVJNUE1VX01BWF9IV0VWRU5UU10sIGh3X2V2ZW50cyk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZyBbQklUU19UT19MT05HUyhBUk1QTVVfTUFYX0hXRVZFTlRTKV0sIHVzZWRfbWFzayk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBtdV9od19ldmVudHMsIGNwdV9od19ldmVudHMpOwogCi0JLyoKLQkgKiBBIDEgYml0IGZvciBhbiBpbmRleCBpbmRpY2F0ZXMgdGhhdCB0aGUgY291bnRlciBpcyBiZWluZyB1c2VkIGZvcgotCSAqIGFuIGV2ZW50LiBBIDAgbWVhbnMgdGhhdCB0aGUgY291bnRlciBjYW4gYmUgdXNlZC4KLQkgKi8KLQl1bnNpZ25lZCBsb25nCQl1c2VkX21hc2tbQklUU19UT19MT05HUyhBUk1QTVVfTUFYX0hXRVZFTlRTKV07Ci0KLQkvKgotCSAqIEEgMSBiaXQgZm9yIGFuIGluZGV4IGluZGljYXRlcyB0aGF0IHRoZSBjb3VudGVyIGlzIGFjdGl2ZWx5IGJlaW5nCi0JICogdXNlZC4KLQkgKi8KLQl1bnNpZ25lZCBsb25nCQlhY3RpdmVfbWFza1tCSVRTX1RPX0xPTkdTKEFSTVBNVV9NQVhfSFdFVkVOVFMpXTsKLX07Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9od19ldmVudHMsIGNwdV9od19ldmVudHMpOwotCi1zdHJ1Y3QgYXJtX3BtdSB7Ci0JZW51bSBhcm1fcGVyZl9wbXVfaWRzIGlkOwotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVfaXJxKShpbnQgaXJxX251bSwgdm9pZCAqZGV2KTsKLQl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2dCwgaW50IGlkeCk7Ci0Jdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KTsKLQlpbnQJCSgqZ2V0X2V2ZW50X2lkeCkoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCi0JCQkJCSBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjKTsKLQl1MzIJCSgqcmVhZF9jb3VudGVyKShpbnQgaWR4KTsKLQl2b2lkCQkoKndyaXRlX2NvdW50ZXIpKGludCBpZHgsIHUzMiB2YWwpOwotCXZvaWQJCSgqc3RhcnQpKHZvaWQpOwotCXZvaWQJCSgqc3RvcCkodm9pZCk7Ci0Jdm9pZAkJKCpyZXNldCkodm9pZCAqKTsKLQljb25zdCB1bnNpZ25lZAkoKmNhY2hlX21hcClbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCi0JCQkJICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KLQkJCQkgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF07Ci0JY29uc3QgdW5zaWduZWQJKCpldmVudF9tYXApW1BFUkZfQ09VTlRfSFdfTUFYXTsKLQl1MzIJCXJhd19ldmVudF9tYXNrOwotCWludAkJbnVtX2V2ZW50czsKLQl1NjQJCW1heF9wZXJpb2Q7Ci19OworI2RlZmluZSB0b19hcm1fcG11KHApIChjb250YWluZXJfb2YocCwgc3RydWN0IGFybV9wbXUsIHBtdSkpCiAKIC8qIFNldCBhdCBydW50aW1lIHdoZW4gd2Uga25vdyB3aGF0IENQVSB0eXBlIHdlIGFyZS4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11Oworc3RhdGljIHN0cnVjdCBhcm1fcG11ICpjcHVfcG11OwogCiBlbnVtIGFybV9wZXJmX3BtdV9pZHMKIGFybXBtdV9nZXRfcG11X2lkKHZvaWQpCiB7CiAJaW50IGlkID0gLUVOT0RFVjsKIAotCWlmIChhcm1wbXUgIT0gTlVMTCkKLQkJaWQgPSBhcm1wbXUtPmlkOworCWlmIChjcHVfcG11ICE9IE5VTEwpCisJCWlkID0gY3B1X3BtdS0+aWQ7CiAKIAlyZXR1cm4gaWQ7CiB9CkBAIC0xMDksOCArNjQsOCBAQAogewogCWludCBtYXhfZXZlbnRzID0gMDsKIAotCWlmIChhcm1wbXUgIT0gTlVMTCkKLQkJbWF4X2V2ZW50cyA9IGFybXBtdS0+bnVtX2V2ZW50czsKKwlpZiAoY3B1X3BtdSAhPSBOVUxMKQorCQltYXhfZXZlbnRzID0gY3B1X3BtdS0+bnVtX2V2ZW50czsKIAogCXJldHVybiBtYXhfZXZlbnRzOwogfQpAQCAtMTMwLDcgKzg1LDExIEBACiAjZGVmaW5lIENBQ0hFX09QX1VOU1VQUE9SVEVECQkweEZGRkYKIAogc3RhdGljIGludAotYXJtcG11X21hcF9jYWNoZV9ldmVudCh1NjQgY29uZmlnKQorYXJtcG11X21hcF9jYWNoZV9ldmVudChjb25zdCB1bnNpZ25lZCAoKmNhY2hlX21hcCkKKwkJCQkgICAgICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJICAgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCSAgICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdLAorCQkgICAgICAgdTY0IGNvbmZpZykKIHsKIAl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSwgY2FjaGVfb3AsIGNhY2hlX3Jlc3VsdCwgcmV0OwogCkBAIC0xNDYsNyArMTA1LDcgQEAKIAlpZiAoY2FjaGVfcmVzdWx0ID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSAoaW50KSgqYXJtcG11LT5jYWNoZV9tYXApW2NhY2hlX3R5cGVdW2NhY2hlX29wXVtjYWNoZV9yZXN1bHRdOworCXJldCA9IChpbnQpKCpjYWNoZV9tYXApW2NhY2hlX3R5cGVdW2NhY2hlX29wXVtjYWNoZV9yZXN1bHRdOwogCiAJaWYgKHJldCA9PSBDQUNIRV9PUF9VTlNVUFBPUlRFRCkKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xNTUsMjMgKzExNCw0NiBAQAogfQogCiBzdGF0aWMgaW50Ci1hcm1wbXVfbWFwX2V2ZW50KHU2NCBjb25maWcpCithcm1wbXVfbWFwX2V2ZW50KGNvbnN0IHVuc2lnbmVkICgqZXZlbnRfbWFwKVtQRVJGX0NPVU5UX0hXX01BWF0sIHU2NCBjb25maWcpCiB7Ci0JaW50IG1hcHBpbmcgPSAoKmFybXBtdS0+ZXZlbnRfbWFwKVtjb25maWddOwotCXJldHVybiBtYXBwaW5nID09IEhXX09QX1VOU1VQUE9SVEVEID8gLUVPUE5PVFNVUFAgOiBtYXBwaW5nOworCWludCBtYXBwaW5nID0gKCpldmVudF9tYXApW2NvbmZpZ107CisJcmV0dXJuIG1hcHBpbmcgPT0gSFdfT1BfVU5TVVBQT1JURUQgPyAtRU5PRU5UIDogbWFwcGluZzsKIH0KIAogc3RhdGljIGludAotYXJtcG11X21hcF9yYXdfZXZlbnQodTY0IGNvbmZpZykKK2FybXBtdV9tYXBfcmF3X2V2ZW50KHUzMiByYXdfZXZlbnRfbWFzaywgdTY0IGNvbmZpZykKIHsKLQlyZXR1cm4gKGludCkoY29uZmlnICYgYXJtcG11LT5yYXdfZXZlbnRfbWFzayk7CisJcmV0dXJuIChpbnQpKGNvbmZpZyAmIHJhd19ldmVudF9tYXNrKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIGludCBtYXBfY3B1X2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSBjb25zdCB1bnNpZ25lZCAoKmV2ZW50X21hcClbUEVSRl9DT1VOVF9IV19NQVhdLAorCQkJIGNvbnN0IHVuc2lnbmVkICgqY2FjaGVfbWFwKQorCQkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0sCisJCQkgdTMyIHJhd19ldmVudF9tYXNrKQoreworCXU2NCBjb25maWcgPSBldmVudC0+YXR0ci5jb25maWc7CisKKwlzd2l0Y2ggKGV2ZW50LT5hdHRyLnR5cGUpIHsKKwljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKKwkJcmV0dXJuIGFybXBtdV9tYXBfZXZlbnQoZXZlbnRfbWFwLCBjb25maWcpOworCWNhc2UgUEVSRl9UWVBFX0hXX0NBQ0hFOgorCQlyZXR1cm4gYXJtcG11X21hcF9jYWNoZV9ldmVudChjYWNoZV9tYXAsIGNvbmZpZyk7CisJY2FzZSBQRVJGX1RZUEVfUkFXOgorCQlyZXR1cm4gYXJtcG11X21hcF9yYXdfZXZlbnQocmF3X2V2ZW50X21hc2ssIGNvbmZpZyk7CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK2ludAogYXJtcG11X2V2ZW50X3NldF9wZXJpb2Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywKIAkJCWludCBpZHgpCiB7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CiAJczY0IGxlZnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cGVyaW9kX2xlZnQpOwogCXM2NCBwZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7CiAJaW50IHJldCA9IDA7CkBAIC0yMDIsMTEgKzE4NCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1NjQKK3U2NAogYXJtcG11X2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCSAgICBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAogCQkgICAgaW50IGlkeCwgaW50IG92ZXJmbG93KQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXU2NCBkZWx0YSwgcHJldl9yYXdfY291bnQsIG5ld19yYXdfY291bnQ7CiAKIGFnYWluOgpAQCAtMjQ2LDExICsyMjksOSBAQAogc3RhdGljIHZvaWQKIGFybXBtdV9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCi0JaWYgKCFhcm1wbXUpCi0JCXJldHVybjsKLQogCS8qCiAJICogQVJNIHBtdSBhbHdheXMgaGFzIHRvIHVwZGF0ZSB0aGUgY291bnRlciwgc28gaWdub3JlCiAJICogUEVSRl9FRl9VUERBVEUsIHNlZSBjb21tZW50cyBpbiBhcm1wbXVfc3RhcnQoKS4KQEAgLTI2NiwxMSArMjQ3LDkgQEAKIHN0YXRpYyB2b2lkCiBhcm1wbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CiAKLQlpZiAoIWFybXBtdSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBBUk0gcG11IGFsd2F5cyBoYXMgdG8gcmVwcm9ncmFtIHRoZSBwZXJpb2QsIHNvIGlnbm9yZQogCSAqIFBFUkZfRUZfUkVMT0FELCBzZWUgdGhlIGNvbW1lbnQgYmVsb3cuCkBAIC0yOTMsMTYgKzI3MiwxNiBAQAogc3RhdGljIHZvaWQKIGFybXBtdV9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqaHdfZXZlbnRzID0gYXJtcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CiAJaW50IGlkeCA9IGh3Yy0+aWR4OwogCiAJV0FSTl9PTihpZHggPCAwKTsKIAotCWNsZWFyX2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKTsKIAlhcm1wbXVfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwotCWNwdWMtPmV2ZW50c1tpZHhdID0gTlVMTDsKLQljbGVhcl9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spOworCWh3X2V2ZW50cy0+ZXZlbnRzW2lkeF0gPSBOVUxMOworCWNsZWFyX2JpdChpZHgsIGh3X2V2ZW50cy0+dXNlZF9tYXNrKTsKIAogCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIH0KQEAgLTMxMCw3ICsyODksOCBAQAogc3RhdGljIGludAogYXJtcG11X2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpod19ldmVudHMgPSBhcm1wbXUtPmdldF9od19ldmVudHMoKTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIAlpbnQgaWR4OwogCWludCBlcnIgPSAwOwpAQCAtMzE4LDcgKzI5OCw3IEBACiAJcGVyZl9wbXVfZGlzYWJsZShldmVudC0+cG11KTsKIAogCS8qIElmIHdlIGRvbid0IGhhdmUgYSBzcGFjZSBmb3IgdGhlIGNvdW50ZXIgdGhlbiBmaW5pc2ggZWFybHkuICovCi0JaWR4ID0gYXJtcG11LT5nZXRfZXZlbnRfaWR4KGNwdWMsIGh3Yyk7CisJaWR4ID0gYXJtcG11LT5nZXRfZXZlbnRfaWR4KGh3X2V2ZW50cywgaHdjKTsKIAlpZiAoaWR4IDwgMCkgewogCQllcnIgPSBpZHg7CiAJCWdvdG8gb3V0OwpAQCAtMzMwLDggKzMxMCw3IEBACiAJICovCiAJZXZlbnQtPmh3LmlkeCA9IGlkeDsKIAlhcm1wbXUtPmRpc2FibGUoaHdjLCBpZHgpOwotCWNwdWMtPmV2ZW50c1tpZHhdID0gZXZlbnQ7Ci0Jc2V0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKTsKKwlod19ldmVudHMtPmV2ZW50c1tpZHhdID0gZXZlbnQ7CiAKIAlod2MtPnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRCB8IFBFUkZfSEVTX1VQVE9EQVRFOwogCWlmIChmbGFncyAmIFBFUkZfRUZfU1RBUlQpCkBAIC0zNDUsMjUgKzMyNCwyNSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG11IHBtdTsKLQogc3RhdGljIGludAotdmFsaWRhdGVfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCit2YWxpZGF0ZV9ldmVudChzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqaHdfZXZlbnRzLAogCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgZmFrZV9ldmVudCA9IGV2ZW50LT5odzsKKwlzdHJ1Y3QgcG11ICpsZWFkZXJfcG11ID0gZXZlbnQtPmdyb3VwX2xlYWRlci0+cG11OwogCi0JaWYgKGV2ZW50LT5wbXUgIT0gJnBtdSB8fCBldmVudC0+c3RhdGUgPD0gUEVSRl9FVkVOVF9TVEFURV9PRkYpCisJaWYgKGV2ZW50LT5wbXUgIT0gbGVhZGVyX3BtdSB8fCBldmVudC0+c3RhdGUgPD0gUEVSRl9FVkVOVF9TVEFURV9PRkYpCiAJCXJldHVybiAxOwogCi0JcmV0dXJuIGFybXBtdS0+Z2V0X2V2ZW50X2lkeChjcHVjLCAmZmFrZV9ldmVudCkgPj0gMDsKKwlyZXR1cm4gYXJtcG11LT5nZXRfZXZlbnRfaWR4KGh3X2V2ZW50cywgJmZha2VfZXZlbnQpID49IDA7CiB9CiAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX2dyb3VwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZywgKmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgZmFrZV9wbXU7CisJc3RydWN0IHBtdV9od19ldmVudHMgZmFrZV9wbXU7CiAKIAltZW1zZXQoJmZha2VfcG11LCAwLCBzaXplb2YoZmFrZV9wbXUpKTsKIApAQCAtMzgzLDExMCArMzYyLDExOSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYXJtcG11X3BsYXRmb3JtX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCiB7Ci0Jc3RydWN0IGFybV9wbXVfcGxhdGRhdGEgKnBsYXQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwbXVfZGV2aWNlLT5kZXYpOworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSAoc3RydWN0IGFybV9wbXUgKikgZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2aWNlID0gYXJtcG11LT5wbGF0X2RldmljZTsKKwlzdHJ1Y3QgYXJtX3BtdV9wbGF0ZGF0YSAqcGxhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBsYXRfZGV2aWNlLT5kZXYpOwogCiAJcmV0dXJuIHBsYXQtPmhhbmRsZV9pcnEoaXJxLCBkZXYsIGFybXBtdS0+aGFuZGxlX2lycSk7CiB9CiAKK3N0YXRpYyB2b2lkCithcm1wbXVfcmVsZWFzZV9oYXJkd2FyZShzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQoreworCWludCBpLCBpcnEsIGlycXM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG11X2RldmljZSA9IGFybXBtdS0+cGxhdF9kZXZpY2U7CisKKwlpcnFzID0gbWluKHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXMsIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCisJZm9yIChpID0gMDsgaSA8IGlycXM7ICsraSkgeworCQlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGksICZhcm1wbXUtPmFjdGl2ZV9pcnFzKSkKKwkJCWNvbnRpbnVlOworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBtdV9kZXZpY2UsIGkpOworCQlpZiAoaXJxID49IDApCisJCQlmcmVlX2lycShpcnEsIGFybXBtdSk7CisJfQorCisJcmVsZWFzZV9wbXUoYXJtcG11LT50eXBlKTsKK30KKwogc3RhdGljIGludAotYXJtcG11X3Jlc2VydmVfaGFyZHdhcmUodm9pZCkKK2FybXBtdV9yZXNlcnZlX2hhcmR3YXJlKHN0cnVjdCBhcm1fcG11ICphcm1wbXUpCiB7CiAJc3RydWN0IGFybV9wbXVfcGxhdGRhdGEgKnBsYXQ7CiAJaXJxX2hhbmRsZXJfdCBoYW5kbGVfaXJxOwotCWludCBpLCBlcnIgPSAtRU5PREVWLCBpcnE7CisJaW50IGksIGVyciwgaXJxLCBpcnFzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBtdV9kZXZpY2UgPSBhcm1wbXUtPnBsYXRfZGV2aWNlOwogCi0JcG11X2RldmljZSA9IHJlc2VydmVfcG11KEFSTV9QTVVfREVWSUNFX0NQVSk7Ci0JaWYgKElTX0VSUihwbXVfZGV2aWNlKSkgeworCWVyciA9IHJlc2VydmVfcG11KGFybXBtdS0+dHlwZSk7CisJaWYgKGVycikgewogCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gcmVzZXJ2ZSBwbXVcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwbXVfZGV2aWNlKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlpbml0X3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwotCiAJcGxhdCA9IGRldl9nZXRfcGxhdGRhdGEoJnBtdV9kZXZpY2UtPmRldik7CiAJaWYgKHBsYXQgJiYgcGxhdC0+aGFuZGxlX2lycSkKIAkJaGFuZGxlX2lycSA9IGFybXBtdV9wbGF0Zm9ybV9pcnE7CiAJZWxzZQogCQloYW5kbGVfaXJxID0gYXJtcG11LT5oYW5kbGVfaXJxOwogCi0JaWYgKHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXMgPCAxKSB7CisJaXJxcyA9IG1pbihwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzLCBudW1fcG9zc2libGVfY3B1cygpKTsKKwlpZiAoaXJxcyA8IDEpIHsKIAkJcHJfZXJyKCJubyBpcnFzIGZvciBQTVVzIGRlZmluZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgcG11X2RldmljZS0+bnVtX3Jlc291cmNlczsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGlycXM7ICsraSkgeworCQllcnIgPSAwOwogCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBtdV9kZXZpY2UsIGkpOwogCQlpZiAoaXJxIDwgMCkKIAkJCWNvbnRpbnVlOwogCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSBzaW5nbGUgUE1VIGludGVycnVwdCB0aGF0IHdlIGNhbid0IHNoaWZ0LAorCQkgKiBhc3N1bWUgdGhhdCB3ZSdyZSBydW5uaW5nIG9uIGEgdW5pcHJvY2Vzc29yIG1hY2hpbmUgYW5kCisJCSAqIGNvbnRpbnVlLiBPdGhlcndpc2UsIGNvbnRpbnVlIHdpdGhvdXQgdGhpcyBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAoaXJxX3NldF9hZmZpbml0eShpcnEsIGNwdW1hc2tfb2YoaSkpICYmIGlycXMgPiAxKSB7CisJCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gc2V0IGlycSBhZmZpbml0eSAoaXJxPSVkLCBjcHU9JXUpXG4iLAorCQkJCSAgICBpcnEsIGkpOworCQkJY29udGludWU7CisJCX0KKwogCQllcnIgPSByZXF1ZXN0X2lycShpcnEsIGhhbmRsZV9pcnEsCiAJCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORywKLQkJCQkgICJhcm1wbXUiLCBOVUxMKTsKKwkJCQkgICJhcm0tcG11IiwgYXJtcG11KTsKIAkJaWYgKGVycikgewotCQkJcHJfd2FybmluZygidW5hYmxlIHRvIHJlcXVlc3QgSVJRJWQgZm9yIEFSTSBwZXJmICIKLQkJCQkiY291bnRlcnNcbiIsIGlycSk7Ci0JCQlicmVhazsKKwkJCXByX2VycigidW5hYmxlIHRvIHJlcXVlc3QgSVJRJWQgZm9yIEFSTSBQTVUgY291bnRlcnNcbiIsCisJCQkJaXJxKTsKKwkJCWFybXBtdV9yZWxlYXNlX2hhcmR3YXJlKGFybXBtdSk7CisJCQlyZXR1cm4gZXJyOwogCQl9CisKKwkJY3B1bWFza19zZXRfY3B1KGksICZhcm1wbXUtPmFjdGl2ZV9pcnFzKTsKIAl9CiAKLQlpZiAoZXJyKSB7Ci0JCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IC0taSkgewotCQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBpKTsKLQkJCWlmIChpcnEgPj0gMCkKLQkJCQlmcmVlX2lycShpcnEsIE5VTEwpOwotCQl9Ci0JCXJlbGVhc2VfcG11KEFSTV9QTVVfREVWSUNFX0NQVSk7Ci0JCXBtdV9kZXZpY2UgPSBOVUxMOwotCX0KLQotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCi1hcm1wbXVfcmVsZWFzZV9oYXJkd2FyZSh2b2lkKQotewotCWludCBpLCBpcnE7Ci0KLQlmb3IgKGkgPSBwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzIC0gMTsgaSA+PSAwOyAtLWkpIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBpKTsKLQkJaWYgKGlycSA+PSAwKQotCQkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKLQl9Ci0JYXJtcG11LT5zdG9wKCk7Ci0KLQlyZWxlYXNlX3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwotCXBtdV9kZXZpY2UgPSBOVUxMOwotfQotCi1zdGF0aWMgYXRvbWljX3QgYWN0aXZlX2V2ZW50cyA9IEFUT01JQ19JTklUKDApOwotc3RhdGljIERFRklORV9NVVRFWChwbXVfcmVzZXJ2ZV9tdXRleCk7Ci0KLXN0YXRpYyB2b2lkCiBod19wZXJmX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCWlmIChhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZhY3RpdmVfZXZlbnRzLCAmcG11X3Jlc2VydmVfbXV0ZXgpKSB7Ci0JCWFybXBtdV9yZWxlYXNlX2hhcmR3YXJlKCk7Ci0JCW11dGV4X3VubG9jaygmcG11X3Jlc2VydmVfbXV0ZXgpOworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOworCWF0b21pY190ICphY3RpdmVfZXZlbnRzCSA9ICZhcm1wbXUtPmFjdGl2ZV9ldmVudHM7CisJc3RydWN0IG11dGV4ICpwbXVfcmVzZXJ2ZV9tdXRleCA9ICZhcm1wbXUtPnJlc2VydmVfbXV0ZXg7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jayhhY3RpdmVfZXZlbnRzLCBwbXVfcmVzZXJ2ZV9tdXRleCkpIHsKKwkJYXJtcG11X3JlbGVhc2VfaGFyZHdhcmUoYXJtcG11KTsKKwkJbXV0ZXhfdW5sb2NrKHBtdV9yZXNlcnZlX211dGV4KTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQKK2V2ZW50X3JlcXVpcmVzX21vZGVfZXhjbHVzaW9uKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJcmV0dXJuIGF0dHItPmV4Y2x1ZGVfaWRsZSB8fCBhdHRyLT5leGNsdWRlX3VzZXIgfHwKKwkgICAgICAgYXR0ci0+ZXhjbHVkZV9rZXJuZWwgfHwgYXR0ci0+ZXhjbHVkZV9odjsKK30KKworc3RhdGljIGludAogX19od19wZXJmX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCWludCBtYXBwaW5nLCBlcnI7CiAKLQkvKiBEZWNvZGUgdGhlIGdlbmVyaWMgdHlwZSBpbnRvIGFuIEFSTSBldmVudCBpZGVudGlmaWVyLiAqLwotCWlmIChQRVJGX1RZUEVfSEFSRFdBUkUgPT0gZXZlbnQtPmF0dHIudHlwZSkgewotCQltYXBwaW5nID0gYXJtcG11X21hcF9ldmVudChldmVudC0+YXR0ci5jb25maWcpOwotCX0gZWxzZSBpZiAoUEVSRl9UWVBFX0hXX0NBQ0hFID09IGV2ZW50LT5hdHRyLnR5cGUpIHsKLQkJbWFwcGluZyA9IGFybXBtdV9tYXBfY2FjaGVfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKTsKLQl9IGVsc2UgaWYgKFBFUkZfVFlQRV9SQVcgPT0gZXZlbnQtPmF0dHIudHlwZSkgewotCQltYXBwaW5nID0gYXJtcG11X21hcF9yYXdfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiZXZlbnQgdHlwZSAleCBub3Qgc3VwcG9ydGVkXG4iLCBldmVudC0+YXR0ci50eXBlKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KKwltYXBwaW5nID0gYXJtcG11LT5tYXBfZXZlbnQoZXZlbnQpOwogCiAJaWYgKG1hcHBpbmcgPCAwKSB7CiAJCXByX2RlYnVnKCJldmVudCAleDolbGx4IG5vdCBzdXBwb3J0ZWRcbiIsIGV2ZW50LT5hdHRyLnR5cGUsCkBAIC00OTUsMzQgKzQ4MywzMSBAQAogCX0KIAogCS8qCi0JICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIGNvdW50ZXIgZnJvbSBjZXJ0YWluIG1vZGVzLgotCSAqIFRoZSBBUk0gcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIG9uIGFsbCBvZiB0aGUgdGltZSBzbyBpZiBzb21lb25lCi0JICogaGFzIGFza2VkIHVzIGZvciBzb21lIGV4Y2x1ZGVzIHRoZW4gd2UgaGF2ZSB0byBmYWlsLgorCSAqIFdlIGRvbid0IGFzc2lnbiBhbiBpbmRleCB1bnRpbCB3ZSBhY3R1YWxseSBwbGFjZSB0aGUgZXZlbnQgb250bworCSAqIGhhcmR3YXJlLiBVc2UgLTEgdG8gc2lnbmlmeSB0aGF0IHdlIGhhdmVuJ3QgZGVjaWRlZCB3aGVyZSB0byBwdXQgaXQKKwkgKiB5ZXQuIEZvciBTTVAgc3lzdGVtcywgZWFjaCBjb3JlIGhhcyBpdCdzIG93biBQTVUgc28gd2UgY2FuJ3QgZG8gYW55CisJICogY2xldmVyIGFsbG9jYXRpb24gb3IgY29uc3RyYWludHMgY2hlY2tpbmcgYXQgdGhpcyBwb2ludC4KIAkgKi8KLQlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyIHx8Ci0JICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlKSB7CisJaHdjLT5pZHgJCT0gLTE7CisJaHdjLT5jb25maWdfYmFzZQk9IDA7CisJaHdjLT5jb25maWcJCT0gMDsKKwlod2MtPmV2ZW50X2Jhc2UJCT0gMDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIGNvdW50ZXIgZnJvbSBjZXJ0YWluIG1vZGVzLgorCSAqLworCWlmICgoIWFybXBtdS0+c2V0X2V2ZW50X2ZpbHRlciB8fAorCSAgICAgYXJtcG11LT5zZXRfZXZlbnRfZmlsdGVyKGh3YywgJmV2ZW50LT5hdHRyKSkgJiYKKwkgICAgIGV2ZW50X3JlcXVpcmVzX21vZGVfZXhjbHVzaW9uKCZldmVudC0+YXR0cikpIHsKIAkJcHJfZGVidWcoIkFSTSBwZXJmb3JtYW5jZSBjb3VudGVycyBkbyBub3Qgc3VwcG9ydCAiCiAJCQkgIm1vZGUgZXhjbHVzaW9uXG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKIAkvKgotCSAqIFdlIGRvbid0IGFzc2lnbiBhbiBpbmRleCB1bnRpbCB3ZSBhY3R1YWxseSBwbGFjZSB0aGUgZXZlbnQgb250bwotCSAqIGhhcmR3YXJlLiBVc2UgLTEgdG8gc2lnbmlmeSB0aGF0IHdlIGhhdmVuJ3QgZGVjaWRlZCB3aGVyZSB0byBwdXQgaXQKLQkgKiB5ZXQuIEZvciBTTVAgc3lzdGVtcywgZWFjaCBjb3JlIGhhcyBpdCdzIG93biBQTVUgc28gd2UgY2FuJ3QgZG8gYW55Ci0JICogY2xldmVyIGFsbG9jYXRpb24gb3IgY29uc3RyYWludHMgY2hlY2tpbmcgYXQgdGhpcyBwb2ludC4KKwkgKiBTdG9yZSB0aGUgZXZlbnQgZW5jb2RpbmcgaW50byB0aGUgY29uZmlnX2Jhc2UgZmllbGQuCiAJICovCi0JaHdjLT5pZHggPSAtMTsKLQotCS8qCi0JICogU3RvcmUgdGhlIGV2ZW50IGVuY29kaW5nIGludG8gdGhlIGNvbmZpZ19iYXNlIGZpZWxkLiBjb25maWcgYW5kCi0JICogZXZlbnRfYmFzZSBhcmUgdW51c2VkIGFzIHRoZSBvbmx5IDIgdGhpbmdzIHdlIG5lZWQgdG8ga25vdyBhcmUKLQkgKiB0aGUgZXZlbnQgbWFwcGluZyBhbmQgdGhlIGNvdW50ZXIgdG8gdXNlLiBUaGUgY291bnRlciB0byB1c2UgaXMKLQkgKiBhbHNvIHRoZSBpbmR4IGFuZCB0aGUgY29uZmlnX2Jhc2UgaXMgdGhlIGV2ZW50IHR5cGUuCi0JICovCi0JaHdjLT5jb25maWdfYmFzZQkgICAgPSAodW5zaWduZWQgbG9uZyltYXBwaW5nOwotCWh3Yy0+Y29uZmlnCQkgICAgPSAwOwotCWh3Yy0+ZXZlbnRfYmFzZQkJICAgID0gMDsKKwlod2MtPmNvbmZpZ19iYXNlCSAgICB8PSAodW5zaWduZWQgbG9uZyltYXBwaW5nOwogCiAJaWYgKCFod2MtPnNhbXBsZV9wZXJpb2QpIHsKIAkJaHdjLT5zYW1wbGVfcGVyaW9kICA9IGFybXBtdS0+bWF4X3BlcmlvZDsKQEAgLTU0MiwzMiArNTI3LDIzIEBACiAKIHN0YXRpYyBpbnQgYXJtcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCWludCBlcnIgPSAwOworCWF0b21pY190ICphY3RpdmVfZXZlbnRzID0gJmFybXBtdS0+YWN0aXZlX2V2ZW50czsKIAotCXN3aXRjaCAoZXZlbnQtPmF0dHIudHlwZSkgewotCWNhc2UgUEVSRl9UWVBFX1JBVzoKLQljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKLQljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgorCWlmIChhcm1wbXUtPm1hcF9ldmVudChldmVudCkgPT0gLUVOT0VOVCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JaWYgKCFhcm1wbXUpCi0JCXJldHVybiAtRU5PREVWOwogCiAJZXZlbnQtPmRlc3Ryb3kgPSBod19wZXJmX2V2ZW50X2Rlc3Ryb3k7CiAKLQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJmFjdGl2ZV9ldmVudHMpKSB7Ci0JCW11dGV4X2xvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKLQkJaWYgKGF0b21pY19yZWFkKCZhY3RpdmVfZXZlbnRzKSA9PSAwKSB7Ci0JCQllcnIgPSBhcm1wbXVfcmVzZXJ2ZV9oYXJkd2FyZSgpOwotCQl9CisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKGFjdGl2ZV9ldmVudHMpKSB7CisJCW11dGV4X2xvY2soJmFybXBtdS0+cmVzZXJ2ZV9tdXRleCk7CisJCWlmIChhdG9taWNfcmVhZChhY3RpdmVfZXZlbnRzKSA9PSAwKQorCQkJZXJyID0gYXJtcG11X3Jlc2VydmVfaGFyZHdhcmUoYXJtcG11KTsKIAogCQlpZiAoIWVycikKLQkJCWF0b21pY19pbmMoJmFjdGl2ZV9ldmVudHMpOwotCQltdXRleF91bmxvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKKwkJCWF0b21pY19pbmMoYWN0aXZlX2V2ZW50cyk7CisJCW11dGV4X3VubG9jaygmYXJtcG11LT5yZXNlcnZlX211dGV4KTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNTgyLDIyICs1NTgsOSBAQAogCiBzdGF0aWMgdm9pZCBhcm1wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKIHsKLQkvKiBFbmFibGUgYWxsIG9mIHRoZSBwZXJmIGV2ZW50cyBvbiBoYXJkd2FyZS4gKi8KLQlpbnQgaWR4LCBlbmFibGVkID0gMDsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCi0JaWYgKCFhcm1wbXUpCi0JCXJldHVybjsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKLQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2lkeF07Ci0KLQkJaWYgKCFldmVudCkKLQkJCWNvbnRpbnVlOwotCi0JCWFybXBtdS0+ZW5hYmxlKCZldmVudC0+aHcsIGlkeCk7Ci0JCWVuYWJsZWQgPSAxOwotCX0KKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShwbXUpOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpod19ldmVudHMgPSBhcm1wbXUtPmdldF9od19ldmVudHMoKTsKKwlpbnQgZW5hYmxlZCA9IGJpdG1hcF93ZWlnaHQoaHdfZXZlbnRzLT51c2VkX21hc2ssIGFybXBtdS0+bnVtX2V2ZW50cyk7CiAKIAlpZiAoZW5hYmxlZCkKIAkJYXJtcG11LT5zdGFydCgpOwpAQCAtNjA1LDIwICs1NjgsMzIgQEAKIAogc3RhdGljIHZvaWQgYXJtcG11X2Rpc2FibGUoc3RydWN0IHBtdSAqcG11KQogewotCWlmIChhcm1wbXUpCi0JCWFybXBtdS0+c3RvcCgpOworCXN0cnVjdCBhcm1fcG11ICphcm1wbXUgPSB0b19hcm1fcG11KHBtdSk7CisJYXJtcG11LT5zdG9wKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG11IHBtdSA9IHsKLQkucG11X2VuYWJsZQk9IGFybXBtdV9lbmFibGUsCi0JLnBtdV9kaXNhYmxlCT0gYXJtcG11X2Rpc2FibGUsCi0JLmV2ZW50X2luaXQJPSBhcm1wbXVfZXZlbnRfaW5pdCwKLQkuYWRkCQk9IGFybXBtdV9hZGQsCi0JLmRlbAkJPSBhcm1wbXVfZGVsLAotCS5zdGFydAkJPSBhcm1wbXVfc3RhcnQsCi0JLnN0b3AJCT0gYXJtcG11X3N0b3AsCi0JLnJlYWQJCT0gYXJtcG11X3JlYWQsCi19Oworc3RhdGljIHZvaWQgX19pbml0IGFybXBtdV9pbml0KHN0cnVjdCBhcm1fcG11ICphcm1wbXUpCit7CisJYXRvbWljX3NldCgmYXJtcG11LT5hY3RpdmVfZXZlbnRzLCAwKTsKKwltdXRleF9pbml0KCZhcm1wbXUtPnJlc2VydmVfbXV0ZXgpOworCisJYXJtcG11LT5wbXUgPSAoc3RydWN0IHBtdSkgeworCQkucG11X2VuYWJsZQk9IGFybXBtdV9lbmFibGUsCisJCS5wbXVfZGlzYWJsZQk9IGFybXBtdV9kaXNhYmxlLAorCQkuZXZlbnRfaW5pdAk9IGFybXBtdV9ldmVudF9pbml0LAorCQkuYWRkCQk9IGFybXBtdV9hZGQsCisJCS5kZWwJCT0gYXJtcG11X2RlbCwKKwkJLnN0YXJ0CQk9IGFybXBtdV9zdGFydCwKKwkJLnN0b3AJCT0gYXJtcG11X3N0b3AsCisJCS5yZWFkCQk9IGFybXBtdV9yZWFkLAorCX07Cit9CisKK2ludCBfX2luaXQgYXJtcG11X3JlZ2lzdGVyKHN0cnVjdCBhcm1fcG11ICphcm1wbXUsIGNoYXIgKm5hbWUsIGludCB0eXBlKQoreworCWFybXBtdV9pbml0KGFybXBtdSk7CisJcmV0dXJuIHBlcmZfcG11X3JlZ2lzdGVyKCZhcm1wbXUtPnBtdSwgbmFtZSwgdHlwZSk7Cit9CiAKIC8qIEluY2x1ZGUgdGhlIFBNVS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMuICovCiAjaW5jbHVkZSAicGVyZl9ldmVudF94c2NhbGUuYyIKQEAgLTYzMCwxNCArNjA1LDcyIEBACiAgKiBUaGlzIHJlcXVpcmVzIFNNUCB0byBiZSBhdmFpbGFibGUsIHNvIGV4aXN0cyBhcyBhIHNlcGFyYXRlIGluaXRjYWxsLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotYXJtcG11X3Jlc2V0KHZvaWQpCitjcHVfcG11X3Jlc2V0KHZvaWQpCiB7Ci0JaWYgKGFybXBtdSAmJiBhcm1wbXUtPnJlc2V0KQotCQlyZXR1cm4gb25fZWFjaF9jcHUoYXJtcG11LT5yZXNldCwgTlVMTCwgMSk7CisJaWYgKGNwdV9wbXUgJiYgY3B1X3BtdS0+cmVzZXQpCisJCXJldHVybiBvbl9lYWNoX2NwdShjcHVfcG11LT5yZXNldCwgTlVMTCwgMSk7CiAJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKGFybXBtdV9yZXNldCk7CithcmNoX2luaXRjYWxsKGNwdV9wbXVfcmVzZXQpOwogCisvKgorICogUE1VIHBsYXRmb3JtIGRyaXZlciBhbmQgZGV2aWNldHJlZSBiaW5kaW5ncy4KKyAqLworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtcG11X29mX2RldmljZV9pZHNbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1wbXUifSwKKwl7LmNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOC1wbXUifSwKKwl7LmNvbXBhdGlibGUgPSAiYXJtLGFybTExMzYtcG11In0sCisJey5jb21wYXRpYmxlID0gImFybSxhcm0xMTc2LXBtdSJ9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYXJtcG11X3BsYXRfZGV2aWNlX2lkc1tdID0geworCXsubmFtZSA9ICJhcm0tcG11In0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhcm1wbXVfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY3B1X3BtdS0+cGxhdF9kZXZpY2UgPSBwZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1wbXVfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhcm0tcG11IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXJtcG11X29mX2RldmljZV9pZHMsCisJfSwKKwkucHJvYmUJCT0gYXJtcG11X2RldmljZV9wcm9iZSwKKwkuaWRfdGFibGUJPSBhcm1wbXVfcGxhdF9kZXZpY2VfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfcG11X2RyaXZlcih2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFybXBtdV9kcml2ZXIpOworfQorZGV2aWNlX2luaXRjYWxsKHJlZ2lzdGVyX3BtdV9kcml2ZXIpOworCitzdGF0aWMgc3RydWN0IHBtdV9od19ldmVudHMgKmFybXBtdV9nZXRfY3B1X2V2ZW50cyh2b2lkKQoreworCXJldHVybiAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNwdV9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQoreworCWludCBjcHU7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gJnBlcl9jcHUoY3B1X2h3X2V2ZW50cywgY3B1KTsKKwkJZXZlbnRzLT5ldmVudHMgPSBwZXJfY3B1KGh3X2V2ZW50cywgY3B1KTsKKwkJZXZlbnRzLT51c2VkX21hc2sgPSBwZXJfY3B1KHVzZWRfbWFzaywgY3B1KTsKKwkJcmF3X3NwaW5fbG9ja19pbml0KCZldmVudHMtPnBtdV9sb2NrKTsKKwl9CisJYXJtcG11LT5nZXRfaHdfZXZlbnRzID0gYXJtcG11X2dldF9jcHVfZXZlbnRzOworCWFybXBtdS0+dHlwZSA9IEFSTV9QTVVfREVWSUNFX0NQVTsKK30KKworLyoKKyAqIENQVSBQTVUgaWRlbnRpZmljYXRpb24gYW5kIHJlZ2lzdHJhdGlvbi4KKyAqLwogc3RhdGljIGludCBfX2luaXQKIGluaXRfaHdfcGVyZl9ldmVudHModm9pZCkKIHsKQEAgLTY1MSwyMiArNjg0LDIyIEBACiAJCWNhc2UgMHhCMzYwOgkvKiBBUk0xMTM2ICovCiAJCWNhc2UgMHhCNTYwOgkvKiBBUk0xMTU2ICovCiAJCWNhc2UgMHhCNzYwOgkvKiBBUk0xMTc2ICovCi0JCQlhcm1wbXUgPSBhcm12NnBtdV9pbml0KCk7CisJCQljcHVfcG11ID0gYXJtdjZwbXVfaW5pdCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhCMDIwOgkvKiBBUk0xMW1wY29yZSAqLwotCQkJYXJtcG11ID0gYXJtdjZtcGNvcmVfcG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSBhcm12Nm1wY29yZV9wbXVfaW5pdCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhDMDgwOgkvKiBDb3J0ZXgtQTggKi8KLQkJCWFybXBtdSA9IGFybXY3X2E4X3BtdV9pbml0KCk7CisJCQljcHVfcG11ID0gYXJtdjdfYThfcG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4QzA5MDoJLyogQ29ydGV4LUE5ICovCi0JCQlhcm1wbXUgPSBhcm12N19hOV9wbXVfaW5pdCgpOworCQkJY3B1X3BtdSA9IGFybXY3X2E5X3BtdV9pbml0KCk7CiAJCQlicmVhazsKIAkJY2FzZSAweEMwNTA6CS8qIENvcnRleC1BNSAqLwotCQkJYXJtcG11ID0gYXJtdjdfYTVfcG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSBhcm12N19hNV9wbXVfaW5pdCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhDMEYwOgkvKiBDb3J0ZXgtQTE1ICovCi0JCQlhcm1wbXUgPSBhcm12N19hMTVfcG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSBhcm12N19hMTVfcG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQl9CiAJLyogSW50ZWwgQ1BVcyBbeHNjYWxlXS4gKi8KQEAgLTY3NCwyMyArNzA3LDIzIEBACiAJCXBhcnRfbnVtYmVyID0gKGNwdWlkID4+IDEzKSAmIDB4NzsKIAkJc3dpdGNoIChwYXJ0X251bWJlcikgewogCQljYXNlIDE6Ci0JCQlhcm1wbXUgPSB4c2NhbGUxcG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSB4c2NhbGUxcG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQlhcm1wbXUgPSB4c2NhbGUycG11X2luaXQoKTsKKwkJCWNwdV9wbXUgPSB4c2NhbGUycG11X2luaXQoKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKGFybXBtdSkgeworCWlmIChjcHVfcG11KSB7CiAJCXByX2luZm8oImVuYWJsZWQgd2l0aCAlcyBQTVUgZHJpdmVyLCAlZCBjb3VudGVycyBhdmFpbGFibGVcbiIsCi0JCQlhcm1wbXUtPm5hbWUsIGFybXBtdS0+bnVtX2V2ZW50cyk7CisJCQljcHVfcG11LT5uYW1lLCBjcHVfcG11LT5udW1fZXZlbnRzKTsKKwkJY3B1X3BtdV9pbml0KGNwdV9wbXUpOworCQlhcm1wbXVfcmVnaXN0ZXIoY3B1X3BtdSwgImNwdSIsIFBFUkZfVFlQRV9SQVcpOwogCX0gZWxzZSB7CiAJCXByX2luZm8oIm5vIGhhcmR3YXJlIHN1cHBvcnQgYXZhaWxhYmxlXG4iKTsKIAl9CiAKLQlwZXJmX3BtdV9yZWdpc3RlcigmcG11LCAiY3B1IiwgUEVSRl9UWVBFX1JBVyk7Ci0KIAlyZXR1cm4gMDsKIH0KIGVhcmx5X2luaXRjYWxsKGluaXRfaHdfcGVyZl9ldmVudHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjYuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y2LmMKaW5kZXggZGQ3ZjNiOS4uZTYzZDgxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjYuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ni5jCkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiBlbnVtIGFybXY2X2NvdW50ZXJzIHsKLQlBUk1WNl9DWUNMRV9DT1VOVEVSID0gMSwKKwlBUk1WNl9DWUNMRV9DT1VOVEVSID0gMCwKIAlBUk1WNl9DT1VOVEVSMCwKIAlBUk1WNl9DT1VOVEVSMSwKIH07CkBAIC00MzMsNiArNDMzLDcgQEAKIAkJICAgICAgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCwgbWFzaywgZXZ0LCBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJaWYgKEFSTVY2X0NZQ0xFX0NPVU5URVIgPT0gaWR4KSB7CiAJCW1hc2sJPSAwOwpAQCAtNDU0LDEyICs0NTUsMjkgQEAKIAkgKiBNYXNrIG91dCB0aGUgY3VycmVudCBldmVudCBhbmQgc2V0IHRoZSBjb3VudGVyIHRvIGNvdW50IHRoZSBldmVudAogCSAqIHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbi4KIAkgKi8KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0gYXJtdjZfcG1jcl9yZWFkKCk7CiAJdmFsICY9IH5tYXNrOwogCXZhbCB8PSBldnQ7CiAJYXJtdjZfcG1jcl93cml0ZSh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY291bnRlcl9pc19hY3RpdmUodW5zaWduZWQgbG9uZyBwbWNyLCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDA7CisJaWYgKGlkeCA9PSBBUk1WNl9DWUNMRV9DT1VOVEVSKQorCQltYXNrID0gQVJNVjZfUE1DUl9DQ09VTlRfSUVOOworCWVsc2UgaWYgKGlkeCA9PSBBUk1WNl9DT1VOVEVSMCkKKwkJbWFzayA9IEFSTVY2X1BNQ1JfQ09VTlQwX0lFTjsKKwllbHNlIGlmIChpZHggPT0gQVJNVjZfQ09VTlRFUjEpCisJCW1hc2sgPSBBUk1WNl9QTUNSX0NPVU5UMV9JRU47CisKKwlpZiAobWFzaykKKwkJcmV0dXJuIHBtY3IgJiBtYXNrOworCisJV0FSTl9PTkNFKDEsICJpbnZhbGlkIGNvdW50ZXIgbnVtYmVyICglZClcbiIsIGlkeCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdApAQCAtNDY4LDcgKzQ4Niw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwbWNyID0gYXJtdjZfcG1jcl9yZWFkKCk7CiAJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YzsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YzsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAlpbnQgaWR4OwogCkBAIC00ODcsMTEgKzUwNSwxMSBAQAogCXBlcmZfc2FtcGxlX2RhdGFfaW5pdCgmZGF0YSwgMCk7CiAKIAljcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JZm9yIChpZHggPSAwOyBpZHggPD0gYXJtcG11LT5udW1fZXZlbnRzOyArK2lkeCkgeworCWZvciAoaWR4ID0gMDsgaWR4IDwgY3B1X3BtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2lkeF07CiAJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2M7CiAKLQkJaWYgKCF0ZXN0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKSkKKwkJaWYgKCFjb3VudGVyX2lzX2FjdGl2ZShwbWNyLCBpZHgpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTUwOCw3ICs1MjYsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKLQkJCWFybXBtdS0+ZGlzYWJsZShod2MsIGlkeCk7CisJCQljcHVfcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKIAl9CiAKIAkvKgpAQCAtNTI3LDI4ICs1NDUsMzAgQEAKIGFybXY2cG11X3N0YXJ0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0gYXJtdjZfcG1jcl9yZWFkKCk7CiAJdmFsIHw9IEFSTVY2X1BNQ1JfRU5BQkxFOwogCWFybXY2X3BtY3Jfd3JpdGUodmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogYXJtdjZwbXVfc3RvcCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbDsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IGFybXY2X3BtY3JfcmVhZCgpOwogCXZhbCAmPSB+QVJNVjZfUE1DUl9FTkFCTEU7CiAJYXJtdjZfcG1jcl93cml0ZSh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKLWFybXY2cG11X2dldF9ldmVudF9pZHgoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCithcm12NnBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjLAogCQkgICAgICAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2ZW50KQogewogCS8qIEFsd2F5cyBwbGFjZSBhIGN5Y2xlIGNvdW50ZXIgaW50byB0aGUgY3ljbGUgY291bnRlci4gKi8KQEAgLTU3OCw2ICs1OTgsNyBAQAogCQkgICAgICAgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCwgbWFzaywgZXZ0LCBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJaWYgKEFSTVY2X0NZQ0xFX0NPVU5URVIgPT0gaWR4KSB7CiAJCW1hc2sJPSBBUk1WNl9QTUNSX0NDT1VOVF9JRU47CkBAIC01OTgsMTIgKzYxOSwxMiBAQAogCSAqIG9mIEVUTSBidXMgc2lnbmFsIGFzc2VydGlvbiBjeWNsZXMuIFRoZSBleHRlcm5hbCByZXBvcnRpbmcgc2hvdWxkCiAJICogYmUgZGlzYWJsZWQgYW5kIHNvIHRoaXMgc2hvdWxkIG5ldmVyIGluY3JlbWVudC4KIAkgKi8KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0gYXJtdjZfcG1jcl9yZWFkKCk7CiAJdmFsICY9IH5tYXNrOwogCXZhbCB8PSBldnQ7CiAJYXJtdjZfcG1jcl93cml0ZSh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC02MTEsNiArNjMyLDcgQEAKIAkJCSAgICAgIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwsIG1hc2ssIGZsYWdzLCBldnQgPSAwOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKIAlpZiAoQVJNVjZfQ1lDTEVfQ09VTlRFUiA9PSBpZHgpIHsKIAkJbWFzawk9IEFSTVY2X1BNQ1JfQ0NPVU5UX0lFTjsKQEAgLTYyNywxNSArNjQ5LDIxIEBACiAJICogVW5saWtlIFVQIEFSTXY2LCB3ZSBkb24ndCBoYXZlIGEgd2F5IG9mIHN0b3BwaW5nIHRoZSBjb3VudGVycy4gV2UKIAkgKiBzaW1wbHkgZGlzYWJsZSB0aGUgaW50ZXJydXB0IHJlcG9ydGluZy4KIAkgKi8KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0gYXJtdjZfcG1jcl9yZWFkKCk7CiAJdmFsICY9IH5tYXNrOwogCXZhbCB8PSBldnQ7CiAJYXJtdjZfcG1jcl93cml0ZSh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSBhcm12NnBtdSA9IHsKK3N0YXRpYyBpbnQgYXJtdjZfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gbWFwX2NwdV9ldmVudChldmVudCwgJmFybXY2X3BlcmZfbWFwLAorCQkJCSZhcm12Nl9wZXJmX2NhY2hlX21hcCwgMHhGRik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSBhcm12NnBtdSA9IHsKIAkuaWQJCQk9IEFSTV9QRVJGX1BNVV9JRF9WNiwKIAkubmFtZQkJCT0gInY2IiwKIAkuaGFuZGxlX2lycQkJPSBhcm12NnBtdV9oYW5kbGVfaXJxLApAQCAtNjQ2LDE0ICs2NzQsMTIgQEAKIAkuZ2V0X2V2ZW50X2lkeAkJPSBhcm12NnBtdV9nZXRfZXZlbnRfaWR4LAogCS5zdGFydAkJCT0gYXJtdjZwbXVfc3RhcnQsCiAJLnN0b3AJCQk9IGFybXY2cG11X3N0b3AsCi0JLmNhY2hlX21hcAkJPSAmYXJtdjZfcGVyZl9jYWNoZV9tYXAsCi0JLmV2ZW50X21hcAkJPSAmYXJtdjZfcGVyZl9tYXAsCi0JLnJhd19ldmVudF9tYXNrCQk9IDB4RkYsCisJLm1hcF9ldmVudAkJPSBhcm12Nl9tYXBfZXZlbnQsCiAJLm51bV9ldmVudHMJCT0gMywKIAkubWF4X3BlcmlvZAkJPSAoMUxMVSA8PCAzMikgLSAxLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjZwbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjZwbXVfaW5pdCh2b2lkKQogewogCXJldHVybiAmYXJtdjZwbXU7CiB9CkBAIC02NjUsNyArNjkxLDE0IEBACiAgKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgcmVwb3J0aW5nIGFuZCB1cGRhdGUgdGhlIGV2ZW50LiBXaGVuIHVudGhyb3R0bGluZyB3ZQogICogcmVzZXQgdGhlIHBlcmlvZCBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHQgcmVwb3J0aW5nLgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgYXJtdjZtcGNvcmVfcG11ID0geworCitzdGF0aWMgaW50IGFybXY2bXBjb3JlX21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZhcm12Nm1wY29yZV9wZXJmX21hcCwKKwkJCQkmYXJtdjZtcGNvcmVfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgc3RydWN0IGFybV9wbXUgYXJtdjZtcGNvcmVfcG11ID0gewogCS5pZAkJCT0gQVJNX1BFUkZfUE1VX0lEX1Y2TVAsCiAJLm5hbWUJCQk9ICJ2Nm1wY29yZSIsCiAJLmhhbmRsZV9pcnEJCT0gYXJtdjZwbXVfaGFuZGxlX2lycSwKQEAgLTY3NiwyNCArNzA5LDIyIEBACiAJLmdldF9ldmVudF9pZHgJCT0gYXJtdjZwbXVfZ2V0X2V2ZW50X2lkeCwKIAkuc3RhcnQJCQk9IGFybXY2cG11X3N0YXJ0LAogCS5zdG9wCQkJPSBhcm12NnBtdV9zdG9wLAotCS5jYWNoZV9tYXAJCT0gJmFybXY2bXBjb3JlX3BlcmZfY2FjaGVfbWFwLAotCS5ldmVudF9tYXAJCT0gJmFybXY2bXBjb3JlX3BlcmZfbWFwLAotCS5yYXdfZXZlbnRfbWFzawkJPSAweEZGLAorCS5tYXBfZXZlbnQJCT0gYXJtdjZtcGNvcmVfbWFwX2V2ZW50LAogCS5udW1fZXZlbnRzCQk9IDMsCiAJLm1heF9wZXJpb2QJCT0gKDFMTFUgPDwgMzIpIC0gMSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2bXBjb3JlX3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12Nm1wY29yZV9wbXVfaW5pdCh2b2lkKQogewogCXJldHVybiAmYXJtdjZtcGNvcmVfcG11OwogfQogI2Vsc2UKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2cG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2cG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjZtcGNvcmVfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY2bXBjb3JlX3BtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYwppbmRleCA2YmUzZTJlLi4xZWY2ZDAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKQEAgLTE3LDYgKzE3LDkgQEAKICAqLwogCiAjaWZkZWYgQ09ORklHX0NQVV9WNworCitzdGF0aWMgc3RydWN0IGFybV9wbXUgYXJtdjdwbXU7CisKIC8qCiAgKiBDb21tb24gQVJNdjcgZXZlbnQgdHlwZXMKICAqCkBAIC02NzYsMjUgKzY3OSwyNiBAQAogfTsKIAogLyoKLSAqIFBlcmYgRXZlbnRzIGNvdW50ZXJzCisgKiBQZXJmIEV2ZW50cycgaW5kaWNlcwogICovCi1lbnVtIGFybXY3X2NvdW50ZXJzIHsKLQlBUk1WN19DWUNMRV9DT1VOVEVSCQk9IDEsCS8qIEN5Y2xlIGNvdW50ZXIgKi8KLQlBUk1WN19DT1VOVEVSMAkJCT0gMiwJLyogRmlyc3QgZXZlbnQgY291bnRlciAqLwotfTsKKyNkZWZpbmUJQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIJMAorI2RlZmluZQlBUk1WN19JRFhfQ09VTlRFUjAJMQorI2RlZmluZQlBUk1WN19JRFhfQ09VTlRFUl9MQVNUCShBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUiArIGNwdV9wbXUtPm51bV9ldmVudHMgLSAxKQogCi0vKgotICogVGhlIGN5Y2xlIGNvdW50ZXIgaXMgQVJNVjdfQ1lDTEVfQ09VTlRFUi4KLSAqIFRoZSBmaXJzdCBldmVudCBjb3VudGVyIGlzIEFSTVY3X0NPVU5URVIwLgotICogVGhlIGxhc3QgZXZlbnQgY291bnRlciBpcyAoQVJNVjdfQ09VTlRFUjAgKyBhcm1wbXUtPm51bV9ldmVudHMgLSAxKS4KLSAqLwotI2RlZmluZQlBUk1WN19DT1VOVEVSX0xBU1QJKEFSTVY3X0NPVU5URVIwICsgYXJtcG11LT5udW1fZXZlbnRzIC0gMSkKKyNkZWZpbmUJQVJNVjdfTUFYX0NPVU5URVJTCTMyCisjZGVmaW5lCUFSTVY3X0NPVU5URVJfTUFTSwkoQVJNVjdfTUFYX0NPVU5URVJTIC0gMSkKIAogLyoKICAqIEFSTXY3IGxvdyBsZXZlbCBQTU5DIGFjY2VzcwogICovCiAKIC8qCisgKiBQZXJmIEV2ZW50IHRvIGxvdyBsZXZlbCBjb3VudGVycyBtYXBwaW5nCisgKi8KKyNkZWZpbmUJQVJNVjdfSURYX1RPX0NPVU5URVIoeCkJXAorCSgoKHgpIC0gQVJNVjdfSURYX0NPVU5URVIwKSAmIEFSTVY3X0NPVU5URVJfTUFTSykKKworLyoKICAqIFBlci1DUFUgUE1OQzogY29uZmlnIHJlZwogICovCiAjZGVmaW5lIEFSTVY3X1BNTkNfRQkJKDEgPDwgMCkgLyogRW5hYmxlIGFsbCBjb3VudGVycyAqLwpAQCAtNzA4LDEwMyArNzEyLDc2IEBACiAjZGVmaW5lCUFSTVY3X1BNTkNfTUFTSwkJMHgzZgkgLyogTWFzayBmb3Igd3JpdGFibGUgYml0cyAqLwogCiAvKgotICogQXZhaWxhYmxlIGNvdW50ZXJzCi0gKi8KLSNkZWZpbmUgQVJNVjdfQ05UMAkJMAkvKiBGaXJzdCBldmVudCBjb3VudGVyICovCi0jZGVmaW5lIEFSTVY3X0NDTlQJCTMxCS8qIEN5Y2xlIGNvdW50ZXIgKi8KLQotLyogUGVyZiBFdmVudCB0byBsb3cgbGV2ZWwgY291bnRlcnMgbWFwcGluZyAqLwotI2RlZmluZSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeAkoQVJNVjdfQ09VTlRFUjAgLSBBUk1WN19DTlQwKQotCi0vKgotICogQ05URU5TOiBjb3VudGVycyBlbmFibGUgcmVnCi0gKi8KLSNkZWZpbmUgQVJNVjdfQ05URU5TX1AoaWR4KQkoMSA8PCAoaWR4IC0gQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgpKQotI2RlZmluZSBBUk1WN19DTlRFTlNfQwkJKDEgPDwgQVJNVjdfQ0NOVCkKLQotLyoKLSAqIENOVEVOQzogY291bnRlcnMgZGlzYWJsZSByZWcKLSAqLwotI2RlZmluZSBBUk1WN19DTlRFTkNfUChpZHgpCSgxIDw8IChpZHggLSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeCkpCi0jZGVmaW5lIEFSTVY3X0NOVEVOQ19DCQkoMSA8PCBBUk1WN19DQ05UKQotCi0vKgotICogSU5URU5TOiBjb3VudGVycyBvdmVyZmxvdyBpbnRlcnJ1cHQgZW5hYmxlIHJlZwotICovCi0jZGVmaW5lIEFSTVY3X0lOVEVOU19QKGlkeCkJKDEgPDwgKGlkeCAtIEFSTVY3X0VWRU5UX0NOVF9UT19DTlR4KSkKLSNkZWZpbmUgQVJNVjdfSU5URU5TX0MJCSgxIDw8IEFSTVY3X0NDTlQpCi0KLS8qCi0gKiBJTlRFTkM6IGNvdW50ZXJzIG92ZXJmbG93IGludGVycnVwdCBkaXNhYmxlIHJlZwotICovCi0jZGVmaW5lIEFSTVY3X0lOVEVOQ19QKGlkeCkJKDEgPDwgKGlkeCAtIEFSTVY3X0VWRU5UX0NOVF9UT19DTlR4KSkKLSNkZWZpbmUgQVJNVjdfSU5URU5DX0MJCSgxIDw8IEFSTVY3X0NDTlQpCi0KLS8qCi0gKiBFVlRTRUw6IEV2ZW50IHNlbGVjdGlvbiByZWcKLSAqLwotI2RlZmluZQlBUk1WN19FVlRTRUxfTUFTSwkweGZmCQkvKiBNYXNrIGZvciB3cml0YWJsZSBiaXRzICovCi0KLS8qCi0gKiBTRUxFQ1Q6IENvdW50ZXIgc2VsZWN0aW9uIHJlZwotICovCi0jZGVmaW5lCUFSTVY3X1NFTEVDVF9NQVNLCTB4MWYJCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KLQotLyoKICAqIEZMQUc6IGNvdW50ZXJzIG92ZXJmbG93IGZsYWcgc3RhdHVzIHJlZwogICovCi0jZGVmaW5lIEFSTVY3X0ZMQUdfUChpZHgpCSgxIDw8IChpZHggLSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeCkpCi0jZGVmaW5lIEFSTVY3X0ZMQUdfQwkJKDEgPDwgQVJNVjdfQ0NOVCkKICNkZWZpbmUJQVJNVjdfRkxBR19NQVNLCQkweGZmZmZmZmZmCS8qIE1hc2sgZm9yIHdyaXRhYmxlIGJpdHMgKi8KICNkZWZpbmUJQVJNVjdfT1ZFUkZMT1dFRF9NQVNLCUFSTVY3X0ZMQUdfTUFTSwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJtdjdfcG1uY19yZWFkKHZvaWQpCisvKgorICogUE1YRVZUWVBFUjogRXZlbnQgc2VsZWN0aW9uIHJlZworICovCisjZGVmaW5lCUFSTVY3X0VWVFlQRV9NQVNLCTB4YzAwMDAwZmYJLyogTWFzayBmb3Igd3JpdGFibGUgYml0cyAqLworI2RlZmluZQlBUk1WN19FVlRZUEVfRVZFTlQJMHhmZgkJLyogTWFzayBmb3IgRVZFTlQgYml0cyAqLworCisvKgorICogRXZlbnQgZmlsdGVycyBmb3IgUE1VdjIKKyAqLworI2RlZmluZQlBUk1WN19FWENMVURFX1BMMQkoMSA8PCAzMSkKKyNkZWZpbmUJQVJNVjdfRVhDTFVERV9VU0VSCSgxIDw8IDMwKQorI2RlZmluZQlBUk1WN19JTkNMVURFX0hZUAkoMSA8PCAyNykKKworc3RhdGljIGlubGluZSB1MzIgYXJtdjdfcG1uY19yZWFkKHZvaWQpCiB7CiAJdTMyIHZhbDsKIAlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEyLCAwIiA6ICI9ciIodmFsKSk7CiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFybXY3X3BtbmNfd3JpdGUodW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgYXJtdjdfcG1uY193cml0ZSh1MzIgdmFsKQogewogCXZhbCAmPSBBUk1WN19QTU5DX01BU0s7CiAJaXNiKCk7CiAJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMCIgOiA6ICJyIih2YWwpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19oYXNfb3ZlcmZsb3dlZCh1bnNpZ25lZCBsb25nIHBtbmMpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2hhc19vdmVyZmxvd2VkKHUzMiBwbW5jKQogewogCXJldHVybiBwbW5jICYgQVJNVjdfT1ZFUkZMT1dFRF9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2NvdW50ZXJfaGFzX292ZXJmbG93ZWQodW5zaWduZWQgbG9uZyBwbW5jLAotCQkJCQllbnVtIGFybXY3X2NvdW50ZXJzIGNvdW50ZXIpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaW50IGlkeCkKK3sKKwlyZXR1cm4gaWR4ID49IEFSTVY3X0lEWF9DWUNMRV9DT1VOVEVSICYmIGlkeCA8PSBBUk1WN19JRFhfQ09VTlRFUl9MQVNUOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2NvdW50ZXJfaGFzX292ZXJmbG93ZWQodTMyIHBtbmMsIGludCBpZHgpCiB7CiAJaW50IHJldCA9IDA7CisJdTMyIGNvdW50ZXI7CiAKLQlpZiAoY291bnRlciA9PSBBUk1WN19DWUNMRV9DT1VOVEVSKQotCQlyZXQgPSBwbW5jICYgQVJNVjdfRkxBR19DOwotCWVsc2UgaWYgKChjb3VudGVyID49IEFSTVY3X0NPVU5URVIwKSAmJiAoY291bnRlciA8PSBBUk1WN19DT1VOVEVSX0xBU1QpKQotCQlyZXQgPSBwbW5jICYgQVJNVjdfRkxBR19QKGNvdW50ZXIpOwotCWVsc2UKKwlpZiAoIWFybXY3X3BtbmNfY291bnRlcl92YWxpZChpZHgpKSB7CiAJCXByX2VycigiQ1BVJXUgY2hlY2tpbmcgd3JvbmcgY291bnRlciAlZCBvdmVyZmxvdyBzdGF0dXNcbiIsCi0JCQlzbXBfcHJvY2Vzc29yX2lkKCksIGNvdW50ZXIpOworCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOworCX0gZWxzZSB7CisJCWNvdW50ZXIgPSBBUk1WN19JRFhfVE9fQ09VTlRFUihpZHgpOworCQlyZXQgPSBwbW5jICYgQklUKGNvdW50ZXIpOworCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIodW5zaWduZWQgaW50IGlkeCkKK3N0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaW50IGlkeCkKIHsKLQl1MzIgdmFsOworCXUzMiBjb3VudGVyOwogCi0JaWYgKChpZHggPCBBUk1WN19DT1VOVEVSMCkgfHwgKGlkeCA+IEFSTVY3X0NPVU5URVJfTEFTVCkpIHsKLQkJcHJfZXJyKCJDUFUldSBzZWxlY3Rpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgotCQkJIiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOwotCQlyZXR1cm4gLTE7CisJaWYgKCFhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaWR4KSkgeworCQlwcl9lcnIoIkNQVSV1IHNlbGVjdGluZyB3cm9uZyBQTU5DIGNvdW50ZXIgJWRcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXZhbCA9IChpZHggLSBBUk1WN19FVkVOVF9DTlRfVE9fQ05UeCkgJiBBUk1WN19TRUxFQ1RfTUFTSzsKLQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEyLCA1IiA6IDogInIiICh2YWwpKTsKKwljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEyLCA1IiA6IDogInIiIChjb3VudGVyKSk7CiAJaXNiKCk7CiAKIAlyZXR1cm4gaWR4OwpAQCAtODEyLDEyNCArNzg5LDk1IEBACiAKIHN0YXRpYyBpbmxpbmUgdTMyIGFybXY3cG11X3JlYWRfY291bnRlcihpbnQgaWR4KQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAwOworCXUzMiB2YWx1ZSA9IDA7CiAKLQlpZiAoaWR4ID09IEFSTVY3X0NZQ0xFX0NPVU5URVIpCi0JCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogIj1yIiAodmFsdWUpKTsKLQllbHNlIGlmICgoaWR4ID49IEFSTVY3X0NPVU5URVIwKSAmJiAoaWR4IDw9IEFSTVY3X0NPVU5URVJfTEFTVCkpIHsKLQkJaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaWR4KSA9PSBpZHgpCi0JCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEzLCAyIgotCQkJCSAgICAgOiAiPXIiICh2YWx1ZSkpOwotCX0gZWxzZQorCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpCiAJCXByX2VycigiQ1BVJXUgcmVhZGluZyB3cm9uZyBjb3VudGVyICVkXG4iLAogCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOworCWVsc2UgaWYgKGlkeCA9PSBBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUikKKwkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiAiPXIiICh2YWx1ZSkpOworCWVsc2UgaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaWR4KSA9PSBpZHgpCisJCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDIiIDogIj1yIiAodmFsdWUpKTsKIAogCXJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFybXY3cG11X3dyaXRlX2NvdW50ZXIoaW50IGlkeCwgdTMyIHZhbHVlKQogewotCWlmIChpZHggPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiA6ICJyIiAodmFsdWUpKTsKLQllbHNlIGlmICgoaWR4ID49IEFSTVY3X0NPVU5URVIwKSAmJiAoaWR4IDw9IEFSTVY3X0NPVU5URVJfTEFTVCkpIHsKLQkJaWYgKGFybXY3X3BtbmNfc2VsZWN0X2NvdW50ZXIoaWR4KSA9PSBpZHgpCi0JCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEzLCAyIgotCQkJCSAgICAgOiA6ICJyIiAodmFsdWUpKTsKLQl9IGVsc2UKKwlpZiAoIWFybXY3X3BtbmNfY291bnRlcl92YWxpZChpZHgpKQogCQlwcl9lcnIoIkNQVSV1IHdyaXRpbmcgd3JvbmcgY291bnRlciAlZFxuIiwKIAkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKwllbHNlIGlmIChpZHggPT0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIpCisJCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTMsIDAiIDogOiAiciIgKHZhbHVlKSk7CisJZWxzZSBpZiAoYXJtdjdfcG1uY19zZWxlY3RfY291bnRlcihpZHgpID09IGlkeCkKKwkJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMywgMiIgOiA6ICJyIiAodmFsdWUpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKHVuc2lnbmVkIGludCBpZHgsIHUzMiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgYXJtdjdfcG1uY193cml0ZV9ldnRzZWwoaW50IGlkeCwgdTMyIHZhbCkKIHsKIAlpZiAoYXJtdjdfcG1uY19zZWxlY3RfY291bnRlcihpZHgpID09IGlkeCkgewotCQl2YWwgJj0gQVJNVjdfRVZUU0VMX01BU0s7CisJCXZhbCAmPSBBUk1WN19FVlRZUEVfTUFTSzsKIAkJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMywgMSIgOiA6ICJyIiAodmFsKSk7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2VuYWJsZV9jb3VudGVyKHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW5saW5lIGludCBhcm12N19wbW5jX2VuYWJsZV9jb3VudGVyKGludCBpZHgpCiB7Ci0JdTMyIHZhbDsKKwl1MzIgY291bnRlcjsKIAotCWlmICgoaWR4ICE9IEFSTVY3X0NZQ0xFX0NPVU5URVIpICYmCi0JICAgICgoaWR4IDwgQVJNVjdfQ09VTlRFUjApIHx8IChpZHggPiBBUk1WN19DT1VOVEVSX0xBU1QpKSkgewotCQlwcl9lcnIoIkNQVSV1IGVuYWJsaW5nIHdyb25nIFBNTkMgY291bnRlciIKLQkJCSIgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKLQkJcmV0dXJuIC0xOworCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpIHsKKwkJcHJfZXJyKCJDUFUldSBlbmFibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIgJWRcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpZHggPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJdmFsID0gQVJNVjdfQ05URU5TX0M7Ci0JZWxzZQotCQl2YWwgPSBBUk1WN19DTlRFTlNfUChpZHgpOwotCi0JYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMSIgOiA6ICJyIiAodmFsKSk7Ci0KKwljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEyLCAxIiA6IDogInIiIChCSVQoY291bnRlcikpKTsKIAlyZXR1cm4gaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2Rpc2FibGVfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4KQorc3RhdGljIGlubGluZSBpbnQgYXJtdjdfcG1uY19kaXNhYmxlX2NvdW50ZXIoaW50IGlkeCkKIHsKLQl1MzIgdmFsOworCXUzMiBjb3VudGVyOwogCi0KLQlpZiAoKGlkeCAhPSBBUk1WN19DWUNMRV9DT1VOVEVSKSAmJgotCSAgICAoKGlkeCA8IEFSTVY3X0NPVU5URVIwKSB8fCAoaWR4ID4gQVJNVjdfQ09VTlRFUl9MQVNUKSkpIHsKLQkJcHJfZXJyKCJDUFUldSBkaXNhYmxpbmcgd3JvbmcgUE1OQyBjb3VudGVyIgotCQkJIiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOwotCQlyZXR1cm4gLTE7CisJaWYgKCFhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaWR4KSkgeworCQlwcl9lcnIoIkNQVSV1IGRpc2FibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIgJWRcbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGlkeCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpZHggPT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikKLQkJdmFsID0gQVJNVjdfQ05URU5DX0M7Ci0JZWxzZQotCQl2YWwgPSBBUk1WN19DTlRFTkNfUChpZHgpOwotCi0JYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAwLCAlMCwgYzksIGMxMiwgMiIgOiA6ICJyIiAodmFsKSk7Ci0KKwljb3VudGVyID0gQVJNVjdfSURYX1RPX0NPVU5URVIoaWR4KTsKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzEyLCAyIiA6IDogInIiIChCSVQoY291bnRlcikpKTsKIAlyZXR1cm4gaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBhcm12N19wbW5jX2VuYWJsZV9pbnRlbnModW5zaWduZWQgaW50IGlkeCkKK3N0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfZW5hYmxlX2ludGVucyhpbnQgaWR4KQogewotCXUzMiB2YWw7CisJdTMyIGNvdW50ZXI7CiAKLQlpZiAoKGlkeCAhPSBBUk1WN19DWUNMRV9DT1VOVEVSKSAmJgotCSAgICAoKGlkeCA8IEFSTVY3X0NPVU5URVIwKSB8fCAoaWR4ID4gQVJNVjdfQ09VTlRFUl9MQVNUKSkpIHsKLQkJcHJfZXJyKCJDUFUldSBlbmFibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIiCi0JCQkiIGludGVycnVwdCBlbmFibGUgJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKLQkJcmV0dXJuIC0xOworCWlmICghYXJtdjdfcG1uY19jb3VudGVyX3ZhbGlkKGlkeCkpIHsKKwkJcHJfZXJyKCJDUFUldSBlbmFibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIgSVJRIGVuYWJsZSAlZFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGlkeCA9PSBBUk1WN19DWUNMRV9DT1VOVEVSKQotCQl2YWwgPSBBUk1WN19JTlRFTlNfQzsKLQllbHNlCi0JCXZhbCA9IEFSTVY3X0lOVEVOU19QKGlkeCk7Ci0KLQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE0LCAxIiA6IDogInIiICh2YWwpKTsKLQorCWNvdW50ZXIgPSBBUk1WN19JRFhfVE9fQ09VTlRFUihpZHgpOworCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTQsIDEiIDogOiAiciIgKEJJVChjb3VudGVyKSkpOwogCXJldHVybiBpZHg7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGFybXY3X3BtbmNfZGlzYWJsZV9pbnRlbnModW5zaWduZWQgaW50IGlkeCkKK3N0YXRpYyBpbmxpbmUgaW50IGFybXY3X3BtbmNfZGlzYWJsZV9pbnRlbnMoaW50IGlkeCkKIHsKLQl1MzIgdmFsOworCXUzMiBjb3VudGVyOwogCi0JaWYgKChpZHggIT0gQVJNVjdfQ1lDTEVfQ09VTlRFUikgJiYKLQkgICAgKChpZHggPCBBUk1WN19DT1VOVEVSMCkgfHwgKGlkeCA+IEFSTVY3X0NPVU5URVJfTEFTVCkpKSB7Ci0JCXByX2VycigiQ1BVJXUgZGlzYWJsaW5nIHdyb25nIFBNTkMgY291bnRlciIKLQkJCSIgaW50ZXJydXB0IGVuYWJsZSAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpZHgpOwotCQlyZXR1cm4gLTE7CisJaWYgKCFhcm12N19wbW5jX2NvdW50ZXJfdmFsaWQoaWR4KSkgeworCQlwcl9lcnIoIkNQVSV1IGRpc2FibGluZyB3cm9uZyBQTU5DIGNvdW50ZXIgSVJRIGVuYWJsZSAlZFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgaWR4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGlkeCA9PSBBUk1WN19DWUNMRV9DT1VOVEVSKQotCQl2YWwgPSBBUk1WN19JTlRFTkNfQzsKLQllbHNlCi0JCXZhbCA9IEFSTVY3X0lOVEVOQ19QKGlkeCk7Ci0KLQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE0LCAyIiA6IDogInIiICh2YWwpKTsKLQorCWNvdW50ZXIgPSBBUk1WN19JRFhfVE9fQ09VTlRFUihpZHgpOworCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTQsIDIiIDogOiAiciIgKEJJVChjb3VudGVyKSkpOwogCXJldHVybiBpZHg7CiB9CiAKQEAgLTk3MywxNCArOTIxLDE0IEBACiAJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzksIGMxMywgMCIgOiAiPXIiICh2YWwpKTsKIAlwcmludGsoS0VSTl9JTkZPICJDQ05UICA9MHglMDh4XG4iLCB2YWwpOwogCi0JZm9yIChjbnQgPSBBUk1WN19DT1VOVEVSMDsgY250IDwgQVJNVjdfQ09VTlRFUl9MQVNUOyBjbnQrKykgeworCWZvciAoY250ID0gQVJNVjdfSURYX0NPVU5URVIwOyBjbnQgPD0gQVJNVjdfSURYX0NPVU5URVJfTEFTVDsgY250KyspIHsKIAkJYXJtdjdfcG1uY19zZWxlY3RfY291bnRlcihjbnQpOwogCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEzLCAyIiA6ICI9ciIgKHZhbCkpOwogCQlwcmludGsoS0VSTl9JTkZPICJDTlRbJWRdIGNvdW50ID0weCUwOHhcbiIsCi0JCQljbnQtQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgsIHZhbCk7CisJCQlBUk1WN19JRFhfVE9fQ09VTlRFUihjbnQpLCB2YWwpOwogCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDAsICUwLCBjOSwgYzEzLCAxIiA6ICI9ciIgKHZhbCkpOwogCQlwcmludGsoS0VSTl9JTkZPICJDTlRbJWRdIGV2dHNlbD0weCUwOHhcbiIsCi0JCQljbnQtQVJNVjdfRVZFTlRfQ05UX1RPX0NOVHgsIHZhbCk7CisJCQlBUk1WN19JRFhfVE9fQ09VTlRFUihjbnQpLCB2YWwpOwogCX0KIH0KICNlbmRpZgpAQCAtOTg4LDEyICs5MzYsMTMgQEAKIHN0YXRpYyB2b2lkIGFybXY3cG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCS8qCiAJICogRW5hYmxlIGNvdW50ZXIgYW5kIGludGVycnVwdCwgYW5kIHNldCB0aGUgY291bnRlciB0byBjb3VudAogCSAqIHRoZSBldmVudCB0aGF0IHdlJ3JlIGludGVyZXN0ZWQgaW4uCiAJICovCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBEaXNhYmxlIGNvdW50ZXIKQEAgLTEwMDIsOSArOTUxLDEwIEBACiAKIAkvKgogCSAqIFNldCBldmVudCAoaWYgZGVzdGluZWQgZm9yIFBNTnggY291bnRlcnMpCi0JICogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIGV2ZW50IGlmIGl0J3MgYSBjeWNsZSBjb3VudAorCSAqIFdlIG9ubHkgbmVlZCB0byBzZXQgdGhlIGV2ZW50IGZvciB0aGUgY3ljbGUgY291bnRlciBpZiB3ZQorCSAqIGhhdmUgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBldmVudCBmaWx0ZXJpbmcuCiAJICovCi0JaWYgKGlkeCAhPSBBUk1WN19DWUNMRV9DT1VOVEVSKQorCWlmIChhcm12N3BtdS5zZXRfZXZlbnRfZmlsdGVyIHx8IGlkeCAhPSBBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUikKIAkJYXJtdjdfcG1uY193cml0ZV9ldnRzZWwoaWR4LCBod2MtPmNvbmZpZ19iYXNlKTsKIAogCS8qCkBAIC0xMDE3LDE3ICs5NjcsMTggQEAKIAkgKi8KIAlhcm12N19wbW5jX2VuYWJsZV9jb3VudGVyKGlkeCk7CiAKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBhcm12N3BtdV9kaXNhYmxlX2V2ZW50KHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJLyoKIAkgKiBEaXNhYmxlIGNvdW50ZXIgYW5kIGludGVycnVwdAogCSAqLwotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogRGlzYWJsZSBjb3VudGVyCkBAIC0xMDM5LDE0ICs5OTAsMTQgQEAKIAkgKi8KIAlhcm12N19wbW5jX2Rpc2FibGVfaW50ZW5zKGlkeCk7CiAKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYXJtdjdwbXVfaGFuZGxlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGV2KQogewotCXVuc2lnbmVkIGxvbmcgcG1uYzsKKwl1MzIgcG1uYzsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBkYXRhOwotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzOwogCWludCBpZHg7CiAKQEAgLTEwNjksMTMgKzEwMjAsMTAgQEAKIAlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCWZvciAoaWR4ID0gMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNwdV9wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwogCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjOwogCi0JCWlmICghdGVzdF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzaykpCi0JCQljb250aW51ZTsKLQogCQkvKgogCQkgKiBXZSBoYXZlIGEgc2luZ2xlIGludGVycnVwdCBmb3IgYWxsIGNvdW50ZXJzLiBDaGVjayB0aGF0CiAJCSAqIGVhY2ggY291bnRlciBoYXMgb3ZlcmZsb3dlZCBiZWZvcmUgd2UgcHJvY2VzcyBpdC4KQEAgLTEwOTAsNyArMTAzOCw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQotCQkJYXJtcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKKwkJCWNwdV9wbXUtPmRpc2FibGUoaHdjLCBpZHgpOwogCX0KIAogCS8qCkBAIC0xMTA4LDYxICsxMDU2LDExNCBAQAogc3RhdGljIHZvaWQgYXJtdjdwbXVfc3RhcnQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJLyogRW5hYmxlIGFsbCBjb3VudGVycyAqLwogCWFybXY3X3BtbmNfd3JpdGUoYXJtdjdfcG1uY19yZWFkKCkgfCBBUk1WN19QTU5DX0UpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFybXY3cG11X3N0b3Aodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJLyogRGlzYWJsZSBhbGwgY291bnRlcnMgKi8KIAlhcm12N19wbW5jX3dyaXRlKGFybXY3X3BtbmNfcmVhZCgpICYgfkFSTVY3X1BNTkNfRSk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBhcm12N3BtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorc3RhdGljIGludCBhcm12N3BtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjLAogCQkJCSAgc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2ZW50KQogewogCWludCBpZHg7CisJdW5zaWduZWQgbG9uZyBldnR5cGUgPSBldmVudC0+Y29uZmlnX2Jhc2UgJiBBUk1WN19FVlRZUEVfRVZFTlQ7CiAKIAkvKiBBbHdheXMgcGxhY2UgYSBjeWNsZSBjb3VudGVyIGludG8gdGhlIGN5Y2xlIGNvdW50ZXIuICovCi0JaWYgKGV2ZW50LT5jb25maWdfYmFzZSA9PSBBUk1WN19QRVJGQ1RSX0NQVV9DWUNMRVMpIHsKLQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQVJNVjdfQ1lDTEVfQ09VTlRFUiwgY3B1Yy0+dXNlZF9tYXNrKSkKKwlpZiAoZXZ0eXBlID09IEFSTVY3X1BFUkZDVFJfQ1BVX0NZQ0xFUykgeworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUiwgY3B1Yy0+dXNlZF9tYXNrKSkKIAkJCXJldHVybiAtRUFHQUlOOwogCi0JCXJldHVybiBBUk1WN19DWUNMRV9DT1VOVEVSOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEZvciBhbnl0aGluZyBvdGhlciB0aGFuIGEgY3ljbGUgY291bnRlciwgdHJ5IGFuZCB1c2UKLQkJICogdGhlIGV2ZW50cyBjb3VudGVycwotCQkgKi8KLQkJZm9yIChpZHggPSBBUk1WN19DT1VOVEVSMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpCi0JCQkJcmV0dXJuIGlkeDsKLQkJfQotCi0JCS8qIFRoZSBjb3VudGVycyBhcmUgYWxsIGluIHVzZS4gKi8KLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiBBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUjsKIAl9CisKKwkvKgorCSAqIEZvciBhbnl0aGluZyBvdGhlciB0aGFuIGEgY3ljbGUgY291bnRlciwgdHJ5IGFuZCB1c2UKKwkgKiB0aGUgZXZlbnRzIGNvdW50ZXJzCisJICovCisJZm9yIChpZHggPSBBUk1WN19JRFhfQ09VTlRFUjA7IGlkeCA8IGNwdV9wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpCisJCQlyZXR1cm4gaWR4OworCX0KKworCS8qIFRoZSBjb3VudGVycyBhcmUgYWxsIGluIHVzZS4gKi8KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoKKyAqIEFkZCBhbiBldmVudCBmaWx0ZXIgdG8gYSBnaXZlbiBldmVudC4gVGhpcyB3aWxsIG9ubHkgd29yayBmb3IgUE1VdjIgUE1Vcy4KKyAqLworc3RhdGljIGludCBhcm12N3BtdV9zZXRfZXZlbnRfZmlsdGVyKHN0cnVjdCBod19wZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJdW5zaWduZWQgbG9uZyBjb25maWdfYmFzZSA9IDA7CisKKwlpZiAoYXR0ci0+ZXhjbHVkZV9pZGxlKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChhdHRyLT5leGNsdWRlX3VzZXIpCisJCWNvbmZpZ19iYXNlIHw9IEFSTVY3X0VYQ0xVREVfVVNFUjsKKwlpZiAoYXR0ci0+ZXhjbHVkZV9rZXJuZWwpCisJCWNvbmZpZ19iYXNlIHw9IEFSTVY3X0VYQ0xVREVfUEwxOworCWlmICghYXR0ci0+ZXhjbHVkZV9odikKKwkJY29uZmlnX2Jhc2UgfD0gQVJNVjdfSU5DTFVERV9IWVA7CisKKwkvKgorCSAqIEluc3RhbGwgdGhlIGZpbHRlciBpbnRvIGNvbmZpZ19iYXNlIGFzIHRoaXMgaXMgdXNlZCB0bworCSAqIGNvbnN0cnVjdCB0aGUgZXZlbnQgdHlwZS4KKwkgKi8KKwlldmVudC0+Y29uZmlnX2Jhc2UgPSBjb25maWdfYmFzZTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhcm12N3BtdV9yZXNldCh2b2lkICppbmZvKQogewotCXUzMiBpZHgsIG5iX2NudCA9IGFybXBtdS0+bnVtX2V2ZW50czsKKwl1MzIgaWR4LCBuYl9jbnQgPSBjcHVfcG11LT5udW1fZXZlbnRzOwogCiAJLyogVGhlIGNvdW50ZXIgYW5kIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIGFyZSB1bmtub3duIGF0IHJlc2V0LiAqLwotCWZvciAoaWR4ID0gMTsgaWR4IDwgbmJfY250OyArK2lkeCkKKwlmb3IgKGlkeCA9IEFSTVY3X0lEWF9DWUNMRV9DT1VOVEVSOyBpZHggPCBuYl9jbnQ7ICsraWR4KQogCQlhcm12N3BtdV9kaXNhYmxlX2V2ZW50KE5VTEwsIGlkeCk7CiAKIAkvKiBJbml0aWFsaXplICYgUmVzZXQgUE1OQzogQyBhbmQgUCBiaXRzICovCiAJYXJtdjdfcG1uY193cml0ZShBUk1WN19QTU5DX1AgfCBBUk1WN19QTU5DX0MpOwogfQogCitzdGF0aWMgaW50IGFybXY3X2E4X21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZhcm12N19hOF9wZXJmX21hcCwKKwkJCQkmYXJtdjdfYThfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgaW50IGFybXY3X2E5X21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZhcm12N19hOV9wZXJmX21hcCwKKwkJCQkmYXJtdjdfYTlfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgaW50IGFybXY3X2E1X21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZhcm12N19hNV9wZXJmX21hcCwKKwkJCQkmYXJtdjdfYTVfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCitzdGF0aWMgaW50IGFybXY3X2ExNV9tYXBfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBtYXBfY3B1X2V2ZW50KGV2ZW50LCAmYXJtdjdfYTE1X3BlcmZfbWFwLAorCQkJCSZhcm12N19hMTVfcGVyZl9jYWNoZV9tYXAsIDB4RkYpOworfQorCiBzdGF0aWMgc3RydWN0IGFybV9wbXUgYXJtdjdwbXUgPSB7CiAJLmhhbmRsZV9pcnEJCT0gYXJtdjdwbXVfaGFuZGxlX2lycSwKIAkuZW5hYmxlCQkJPSBhcm12N3BtdV9lbmFibGVfZXZlbnQsCkBAIC0xMTczLDcgKzExNzQsNiBAQAogCS5zdGFydAkJCT0gYXJtdjdwbXVfc3RhcnQsCiAJLnN0b3AJCQk9IGFybXY3cG11X3N0b3AsCiAJLnJlc2V0CQkJPSBhcm12N3BtdV9yZXNldCwKLQkucmF3X2V2ZW50X21hc2sJCT0gMHhGRiwKIAkubWF4X3BlcmlvZAkJPSAoMUxMVSA8PCAzMikgLSAxLAogfTsKIApAQCAtMTE4OCw2MiArMTE4OCw1OSBAQAogCXJldHVybiBuYl9jbnQgKyAxOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hOF9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYThfcG11X2luaXQodm9pZCkKIHsKIAlhcm12N3BtdS5pZAkJPSBBUk1fUEVSRl9QTVVfSURfQ0E4OwogCWFybXY3cG11Lm5hbWUJCT0gIkFSTXY3IENvcnRleC1BOCI7Ci0JYXJtdjdwbXUuY2FjaGVfbWFwCT0gJmFybXY3X2E4X3BlcmZfY2FjaGVfbWFwOwotCWFybXY3cG11LmV2ZW50X21hcAk9ICZhcm12N19hOF9wZXJmX21hcDsKKwlhcm12N3BtdS5tYXBfZXZlbnQJPSBhcm12N19hOF9tYXBfZXZlbnQ7CiAJYXJtdjdwbXUubnVtX2V2ZW50cwk9IGFybXY3X3JlYWRfbnVtX3BtbmNfZXZlbnRzKCk7CiAJcmV0dXJuICZhcm12N3BtdTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTlfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E5X3BtdV9pbml0KHZvaWQpCiB7CiAJYXJtdjdwbXUuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX0NBOTsKIAlhcm12N3BtdS5uYW1lCQk9ICJBUk12NyBDb3J0ZXgtQTkiOwotCWFybXY3cG11LmNhY2hlX21hcAk9ICZhcm12N19hOV9wZXJmX2NhY2hlX21hcDsKLQlhcm12N3BtdS5ldmVudF9tYXAJPSAmYXJtdjdfYTlfcGVyZl9tYXA7CisJYXJtdjdwbXUubWFwX2V2ZW50CT0gYXJtdjdfYTlfbWFwX2V2ZW50OwogCWFybXY3cG11Lm51bV9ldmVudHMJPSBhcm12N19yZWFkX251bV9wbW5jX2V2ZW50cygpOwogCXJldHVybiAmYXJtdjdwbXU7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E1X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hNV9wbXVfaW5pdCh2b2lkKQogewogCWFybXY3cG11LmlkCQk9IEFSTV9QRVJGX1BNVV9JRF9DQTU7CiAJYXJtdjdwbXUubmFtZQkJPSAiQVJNdjcgQ29ydGV4LUE1IjsKLQlhcm12N3BtdS5jYWNoZV9tYXAJPSAmYXJtdjdfYTVfcGVyZl9jYWNoZV9tYXA7Ci0JYXJtdjdwbXUuZXZlbnRfbWFwCT0gJmFybXY3X2E1X3BlcmZfbWFwOworCWFybXY3cG11Lm1hcF9ldmVudAk9IGFybXY3X2E1X21hcF9ldmVudDsKIAlhcm12N3BtdS5udW1fZXZlbnRzCT0gYXJtdjdfcmVhZF9udW1fcG1uY19ldmVudHMoKTsKIAlyZXR1cm4gJmFybXY3cG11OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hMTVfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2ExNV9wbXVfaW5pdCh2b2lkKQogewogCWFybXY3cG11LmlkCQk9IEFSTV9QRVJGX1BNVV9JRF9DQTE1OwogCWFybXY3cG11Lm5hbWUJCT0gIkFSTXY3IENvcnRleC1BMTUiOwotCWFybXY3cG11LmNhY2hlX21hcAk9ICZhcm12N19hMTVfcGVyZl9jYWNoZV9tYXA7Ci0JYXJtdjdwbXUuZXZlbnRfbWFwCT0gJmFybXY3X2ExNV9wZXJmX21hcDsKKwlhcm12N3BtdS5tYXBfZXZlbnQJPSBhcm12N19hMTVfbWFwX2V2ZW50OwogCWFybXY3cG11Lm51bV9ldmVudHMJPSBhcm12N19yZWFkX251bV9wbW5jX2V2ZW50cygpOworCWFybXY3cG11LnNldF9ldmVudF9maWx0ZXIgPSBhcm12N3BtdV9zZXRfZXZlbnRfZmlsdGVyOwogCXJldHVybiAmYXJtdjdwbXU7CiB9CiAjZWxzZQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYThfcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E4X3BtdV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IGFybXY3X2E5X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hOV9wbXVfaW5pdCh2b2lkKQogewogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hNV9wbXVfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTVfcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgYXJtdjdfYTE1X3BtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCBhcm12N19hMTVfcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3hzY2FsZS5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKaW5kZXggM2M0Mzk3NC4uZTBjY2ExMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfeHNjYWxlLmMKQEAgLTQwLDcgKzQwLDcgQEAKIH07CiAKIGVudW0geHNjYWxlX2NvdW50ZXJzIHsKLQlYU0NBTEVfQ1lDTEVfQ09VTlRFUgk9IDEsCisJWFNDQUxFX0NZQ0xFX0NPVU5URVIJPSAwLAogCVhTQ0FMRV9DT1VOVEVSMCwKIAlYU0NBTEVfQ09VTlRFUjEsCiAJWFNDQUxFX0NPVU5URVIyLApAQCAtMjIyLDcgKzIyMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwbW5jOwogCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGE7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWM7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmNwdWM7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJaW50IGlkeDsKIApAQCAtMjQ5LDEzICsyNDksMTAgQEAKIAlwZXJmX3NhbXBsZV9kYXRhX2luaXQoJmRhdGEsIDApOwogCiAJY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCWZvciAoaWR4ID0gMDsgaWR4IDw9IGFybXBtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNwdV9wbXUtPm51bV9ldmVudHM7ICsraWR4KSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwogCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjOwogCi0JCWlmICghdGVzdF9iaXQoaWR4LCBjcHVjLT5hY3RpdmVfbWFzaykpCi0JCQljb250aW51ZTsKLQogCQlpZiAoIXhzY2FsZTFfcG1uY19jb3VudGVyX2hhc19vdmVyZmxvd2VkKHBtbmMsIGlkeCkpCiAJCQljb250aW51ZTsKIApAQCAtMjY2LDcgKzI2Myw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgJmRhdGEsIHJlZ3MpKQotCQkJYXJtcG11LT5kaXNhYmxlKGh3YywgaWR4KTsKKwkJCWNwdV9wbXUtPmRpc2FibGUoaHdjLCBpZHgpOwogCX0KIAogCWlycV93b3JrX3J1bigpOwpAQCAtMjg0LDYgKzI4MSw3IEBACiB4c2NhbGUxcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBtYXNrLCBldnQsIGZsYWdzOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgWFNDQUxFX0NZQ0xFX0NPVU5URVI6CkBAIC0zMDUsMTggKzMwMywxOSBAQAogCQlyZXR1cm47CiAJfQogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHhzY2FsZTFwbXVfcmVhZF9wbW5jKCk7CiAJdmFsICY9IH5tYXNrOwogCXZhbCB8PSBldnQ7CiAJeHNjYWxlMXBtdV93cml0ZV9wbW5jKHZhbCk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKIHhzY2FsZTFwbXVfZGlzYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBtYXNrLCBldnQsIGZsYWdzOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgWFNDQUxFX0NZQ0xFX0NPVU5URVI6CkBAIC0zMzYsMTYgKzMzNSwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHhzY2FsZTFwbXVfcmVhZF9wbW5jKCk7CiAJdmFsICY9IH5tYXNrOwogCXZhbCB8PSBldnQ7CiAJeHNjYWxlMXBtdV93cml0ZV9wbW5jKHZhbCk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludAoteHNjYWxlMXBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAoreHNjYWxlMXBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjLAogCQkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2ZW50KQogewogCWlmIChYU0NBTEVfUEVSRkNUUl9DQ05UID09IGV2ZW50LT5jb25maWdfYmFzZSkgewpAQCAtMzY4LDI0ICszNjcsMjYgQEAKIHhzY2FsZTFwbXVfc3RhcnQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSB4c2NhbGUxcG11X3JlYWRfcG1uYygpOwogCXZhbCB8PSBYU0NBTEVfUE1VX0VOQUJMRTsKIAl4c2NhbGUxcG11X3dyaXRlX3BtbmModmFsKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogeHNjYWxlMXBtdV9zdG9wKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSBjcHVfcG11LT5nZXRfaHdfZXZlbnRzKCk7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiAJdmFsID0geHNjYWxlMXBtdV9yZWFkX3BtbmMoKTsKIAl2YWwgJj0gflhTQ0FMRV9QTVVfRU5BQkxFOwogCXhzY2FsZTFwbXVfd3JpdGVfcG1uYyh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyCkBAIC00MjQsNyArNDI1LDEzIEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgeHNjYWxlMXBtdSA9IHsKK3N0YXRpYyBpbnQgeHNjYWxlX21hcF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIG1hcF9jcHVfZXZlbnQoZXZlbnQsICZ4c2NhbGVfcGVyZl9tYXAsCisJCQkJJnhzY2FsZV9wZXJmX2NhY2hlX21hcCwgMHhGRik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSB4c2NhbGUxcG11ID0gewogCS5pZAkJPSBBUk1fUEVSRl9QTVVfSURfWFNDQUxFMSwKIAkubmFtZQkJPSAieHNjYWxlMSIsCiAJLmhhbmRsZV9pcnEJPSB4c2NhbGUxcG11X2hhbmRsZV9pcnEsCkBAIC00MzUsMTQgKzQ0MiwxMiBAQAogCS5nZXRfZXZlbnRfaWR4CT0geHNjYWxlMXBtdV9nZXRfZXZlbnRfaWR4LAogCS5zdGFydAkJPSB4c2NhbGUxcG11X3N0YXJ0LAogCS5zdG9wCQk9IHhzY2FsZTFwbXVfc3RvcCwKLQkuY2FjaGVfbWFwCT0gJnhzY2FsZV9wZXJmX2NhY2hlX21hcCwKLQkuZXZlbnRfbWFwCT0gJnhzY2FsZV9wZXJmX21hcCwKLQkucmF3X2V2ZW50X21hc2sJPSAweEZGLAorCS5tYXBfZXZlbnQJPSB4c2NhbGVfbWFwX2V2ZW50LAogCS5udW1fZXZlbnRzCT0gMywKIAkubWF4X3BlcmlvZAk9ICgxTExVIDw8IDMyKSAtIDEsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFybV9wbXUgKl9faW5pdCB4c2NhbGUxcG11X2luaXQodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3BtdSAqX19pbml0IHhzY2FsZTFwbXVfaW5pdCh2b2lkKQogewogCXJldHVybiAmeHNjYWxlMXBtdTsKIH0KQEAgLTU2MCw3ICs1NjUsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcG1uYywgb2ZfZmxhZ3M7CiAJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YzsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqY3B1YzsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAlpbnQgaWR4OwogCkBAIC01ODEsMTMgKzU4NiwxMCBAQAogCXBlcmZfc2FtcGxlX2RhdGFfaW5pdCgmZGF0YSwgMCk7CiAKIAljcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JZm9yIChpZHggPSAwOyBpZHggPD0gYXJtcG11LT5udW1fZXZlbnRzOyArK2lkeCkgeworCWZvciAoaWR4ID0gMDsgaWR4IDwgY3B1X3BtdS0+bnVtX2V2ZW50czsgKytpZHgpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2lkeF07CiAJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2M7CiAKLQkJaWYgKCF0ZXN0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKSkKLQkJCWNvbnRpbnVlOwotCiAJCWlmICgheHNjYWxlMl9wbW5jX2NvdW50ZXJfaGFzX292ZXJmbG93ZWQocG1uYywgaWR4KSkKIAkJCWNvbnRpbnVlOwogCkBAIC01OTgsNyArNjAwLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChwZXJmX2V2ZW50X292ZXJmbG93KGV2ZW50LCAmZGF0YSwgcmVncykpCi0JCQlhcm1wbXUtPmRpc2FibGUoaHdjLCBpZHgpOworCQkJY3B1X3BtdS0+ZGlzYWJsZShod2MsIGlkeCk7CiAJfQogCiAJaXJxX3dvcmtfcnVuKCk7CkBAIC02MTYsNiArNjE4LDcgQEAKIHhzY2FsZTJwbXVfZW5hYmxlX2V2ZW50KHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsIGludCBpZHgpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaWVuLCBldnRzZWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAogCWllbiA9IHhzY2FsZTJwbXVfcmVhZF9pbnRfZW5hYmxlKCk7CiAJZXZ0c2VsID0geHNjYWxlMnBtdV9yZWFkX2V2ZW50X3NlbGVjdCgpOwpAQCAtNjQ5LDE2ICs2NTIsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl4c2NhbGUycG11X3dyaXRlX2V2ZW50X3NlbGVjdChldnRzZWwpOwogCXhzY2FsZTJwbXVfd3JpdGVfaW50X2VuYWJsZShpZW4pOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c2NhbGUycG11X2Rpc2FibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBpZW4sIGV2dHNlbDsKKwlzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzID0gY3B1X3BtdS0+Z2V0X2h3X2V2ZW50cygpOwogCiAJaWVuID0geHNjYWxlMnBtdV9yZWFkX2ludF9lbmFibGUoKTsKIAlldnRzZWwgPSB4c2NhbGUycG11X3JlYWRfZXZlbnRfc2VsZWN0KCk7CkBAIC02OTIsMTQgKzY5NiwxNCBAQAogCQlyZXR1cm47CiAJfQogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOwogCXhzY2FsZTJwbXVfd3JpdGVfZXZlbnRfc2VsZWN0KGV2dHNlbCk7CiAJeHNjYWxlMnBtdV93cml0ZV9pbnRfZW5hYmxlKGllbik7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludAoteHNjYWxlMnBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAoreHNjYWxlMnBtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjLAogCQkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2ZW50KQogewogCWludCBpZHggPSB4c2NhbGUxcG11X2dldF9ldmVudF9pZHgoY3B1YywgZXZlbnQpOwpAQCAtNzE4LDI0ICs3MjIsMjYgQEAKIHhzY2FsZTJwbXVfc3RhcnQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSB4c2NhbGUycG11X3JlYWRfcG1uYygpICYgflhTQ0FMRV9QTVVfQ05UNjQ7CiAJdmFsIHw9IFhTQ0FMRV9QTVVfRU5BQkxFOwogCXhzY2FsZTJwbXVfd3JpdGVfcG1uYyh2YWwpOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbXVfbG9jaywgZmxhZ3MpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c2NhbGUycG11X3N0b3Aodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IGNwdV9wbXUtPmdldF9od19ldmVudHMoKTsKIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG11X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIAl2YWwgPSB4c2NhbGUycG11X3JlYWRfcG1uYygpOwogCXZhbCAmPSB+WFNDQUxFX1BNVV9FTkFCTEU7CiAJeHNjYWxlMnBtdV93cml0ZV9wbW5jKHZhbCk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIKQEAgLTc4Niw3ICs3OTIsNyBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11IHhzY2FsZTJwbXUgPSB7CitzdGF0aWMgc3RydWN0IGFybV9wbXUgeHNjYWxlMnBtdSA9IHsKIAkuaWQJCT0gQVJNX1BFUkZfUE1VX0lEX1hTQ0FMRTIsCiAJLm5hbWUJCT0gInhzY2FsZTIiLAogCS5oYW5kbGVfaXJxCT0geHNjYWxlMnBtdV9oYW5kbGVfaXJxLApAQCAtNzk3LDI0ICs4MDMsMjIgQEAKIAkuZ2V0X2V2ZW50X2lkeAk9IHhzY2FsZTJwbXVfZ2V0X2V2ZW50X2lkeCwKIAkuc3RhcnQJCT0geHNjYWxlMnBtdV9zdGFydCwKIAkuc3RvcAkJPSB4c2NhbGUycG11X3N0b3AsCi0JLmNhY2hlX21hcAk9ICZ4c2NhbGVfcGVyZl9jYWNoZV9tYXAsCi0JLmV2ZW50X21hcAk9ICZ4c2NhbGVfcGVyZl9tYXAsCi0JLnJhd19ldmVudF9tYXNrCT0gMHhGRiwKKwkubWFwX2V2ZW50CT0geHNjYWxlX21hcF9ldmVudCwKIAkubnVtX2V2ZW50cwk9IDUsCiAJLm1heF9wZXJpb2QJPSAoMUxMVSA8PCAzMikgLSAxLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMnBtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCB4c2NhbGUycG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gJnhzY2FsZTJwbXU7CiB9CiAjZWxzZQotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMXBtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCB4c2NhbGUxcG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhcm1fcG11ICpfX2luaXQgeHNjYWxlMnBtdV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IGFybV9wbXUgKl9faW5pdCB4c2NhbGUycG11X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wajQtY3AwLmMgYi9hcmNoL2FybS9rZXJuZWwvcGo0LWNwMC5jCmluZGV4IGE0YjFiMDcuLjY3OWNmNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wajQtY3AwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BqNC1jcDAuYwpAQCAtMTAsNyArMTAsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcG11LmMgYi9hcmNoL2FybS9rZXJuZWwvcG11LmMKaW5kZXggYzUzNDc0Zi4uMmMzNDA3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BtdS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wbXUuYwpAQCAtMTAsMTkyICsxMCwyNiBAQAogICoKICAqLwogCi0jZGVmaW5lIHByX2ZtdChmbXQpICJQTVU6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vcG11Lmg+CiAKLXN0YXRpYyB2b2xhdGlsZSBsb25nIHBtdV9sb2NrOworLyoKKyAqIFBNVSBsb2NraW5nIHRvIGVuc3VyZSBtdXR1YWwgZXhjbHVzaW9uIGJldHdlZW4gZGlmZmVyZW50IHN1YnN5c3RlbXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBtdV9sb2NrW0JJVFNfVE9fTE9OR1MoQVJNX05VTV9QTVVfREVWSUNFUyldOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcG11X2RldmljZXNbQVJNX05VTV9QTVVfREVWSUNFU107Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHBtdV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCQllbnVtIGFybV9wbXVfdHlwZSB0eXBlKQotewotCWlmICh0eXBlIDwgMCB8fCB0eXBlID49IEFSTV9OVU1fUE1VX0RFVklDRVMpIHsKLQkJcHJfd2FybmluZygicmVjZWl2ZWQgcmVnaXN0cmF0aW9uIHJlcXVlc3QgZm9yIHVua25vd24gIgotCQkJCSJQTVUgZGV2aWNlIHR5cGUgJWRcbiIsIHR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocG11X2RldmljZXNbdHlwZV0pIHsKLQkJcHJfd2FybmluZygicmVqZWN0aW5nIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gb2YgUE1VIGRldmljZSAiCi0JCQkidHlwZSAlZC4iLCB0eXBlKTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JcHJfaW5mbygicmVnaXN0ZXJlZCBuZXcgUE1VIGRldmljZSBvZiB0eXBlICVkXG4iLCB0eXBlKTsKLQlwbXVfZGV2aWNlc1t0eXBlXSA9IHBkZXY7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgT0ZfTUFUQ0hfUE1VKF9uYW1lLCBfdHlwZSkgewlcCi0JLmNvbXBhdGlibGUgPSBfbmFtZSwJCVwKLQkuZGF0YSA9ICh2b2lkICopX3R5cGUsCQlcCi19Ci0KLSNkZWZpbmUgT0ZfTUFUQ0hfQ1BVKG5hbWUpCU9GX01BVENIX1BNVShuYW1lLCBBUk1fUE1VX0RFVklDRV9DUFUpCi0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybXBtdV9vZl9kZXZpY2VfaWRzW10gPSB7Ci0JT0ZfTUFUQ0hfQ1BVKCJhcm0sY29ydGV4LWE5LXBtdSIpLAotCU9GX01BVENIX0NQVSgiYXJtLGNvcnRleC1hOC1wbXUiKSwKLQlPRl9NQVRDSF9DUFUoImFybSxhcm0xMTM2LXBtdSIpLAotCU9GX01BVENIX0NQVSgiYXJtLGFybTExNzYtcG11IiksCi0Je30sCi19OwotCi0jZGVmaW5lIFBMQVRfTUFUQ0hfUE1VKF9uYW1lLCBfdHlwZSkgewlcCi0JLm5hbWUJCT0gX25hbWUsCVwKLQkuZHJpdmVyX2RhdGEJPSBfdHlwZSwJXAotfQotCi0jZGVmaW5lIFBMQVRfTUFUQ0hfQ1BVKF9uYW1lKQlQTEFUX01BVENIX1BNVShfbmFtZSwgQVJNX1BNVV9ERVZJQ0VfQ1BVKQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhcm1wbXVfcGxhdF9kZXZpY2VfaWRzW10gPSB7Ci0JUExBVF9NQVRDSF9DUFUoImFybS1wbXUiKSwKLQl7fSwKLX07Ci0KLWVudW0gYXJtX3BtdV90eXBlIGFybXBtdV9kZXZpY2VfdHlwZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQJKm9mX2lkOwotCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKnBkZXZfaWQ7Ci0KLQkvKiBwcm92aWRlZCBieSBvZl9kZXZpY2VfaWQgdGFibGUgKi8KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKLQkJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UoYXJtcG11X29mX2RldmljZV9pZHMsICZwZGV2LT5kZXYpOwotCQlCVUdfT04oIW9mX2lkKTsKLQkJcmV0dXJuIChlbnVtIGFybV9wbXVfdHlwZSlvZl9pZC0+ZGF0YTsKLQl9Ci0KLQkvKiBQcm92aWRlZCBieSBwbGF0Zm9ybV9kZXZpY2VfaWQgdGFibGUgKi8KLQlwZGV2X2lkID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KTsKLQlCVUdfT04oIXBkZXZfaWQpOwotCXJldHVybiBwZGV2X2lkLT5kcml2ZXJfZGF0YTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYXJtcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBwbXVfcmVnaXN0ZXIocGRldiwgYXJtcG11X2RldmljZV90eXBlKHBkZXYpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtcG11X2RyaXZlciA9IHsKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAiYXJtLXBtdSIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IGFybXBtdV9vZl9kZXZpY2VfaWRzLAotCX0sCi0JLnByb2JlCQk9IGFybXBtdV9kZXZpY2VfcHJvYmUsCi0JLmlkX3RhYmxlCT0gYXJtcG11X3BsYXRfZGV2aWNlX2lkcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3BtdV9kcml2ZXIodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhcm1wbXVfZHJpdmVyKTsKLX0KLWRldmljZV9pbml0Y2FsbChyZWdpc3Rlcl9wbXVfZHJpdmVyKTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqCitpbnQKIHJlc2VydmVfcG11KGVudW0gYXJtX3BtdV90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0X2xvY2sodHlwZSwgJnBtdV9sb2NrKSkgewotCQlwZGV2ID0gRVJSX1BUUigtRUJVU1kpOwotCX0gZWxzZSBpZiAocG11X2RldmljZXNbdHlwZV0gPT0gTlVMTCkgewotCQljbGVhcl9iaXRfdW5sb2NrKHR5cGUsICZwbXVfbG9jayk7Ci0JCXBkZXYgPSBFUlJfUFRSKC1FTk9ERVYpOwotCX0gZWxzZSB7Ci0JCXBkZXYgPSBwbXVfZGV2aWNlc1t0eXBlXTsKLQl9Ci0KLQlyZXR1cm4gcGRldjsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdF9sb2NrKHR5cGUsIHBtdV9sb2NrKSA/IC1FQlVTWSA6IDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZXNlcnZlX3BtdSk7CiAKLWludAordm9pZAogcmVsZWFzZV9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSkKIHsKLQlpZiAoV0FSTl9PTighcG11X2RldmljZXNbdHlwZV0pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQljbGVhcl9iaXRfdW5sb2NrKHR5cGUsICZwbXVfbG9jayk7Ci0JcmV0dXJuIDA7CisJY2xlYXJfYml0X3VubG9jayh0eXBlLCBwbXVfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyZWxlYXNlX3BtdSk7Ci0KLXN0YXRpYyBpbnQKLXNldF9pcnFfYWZmaW5pdHkoaW50IGlycSwKLQkJIHVuc2lnbmVkIGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWludCBlcnIgPSBpcnFfc2V0X2FmZmluaXR5KGlycSwgY3B1bWFza19vZihjcHUpKTsKLQlpZiAoZXJyKQotCQlwcl93YXJuaW5nKCJ1bmFibGUgdG8gc2V0IGlycSBhZmZpbml0eSAoaXJxPSVkLCBjcHU9JXUpXG4iLAotCQkJICAgaXJxLCBjcHUpOwotCXJldHVybiBlcnI7Ci0jZWxzZQotCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLWluaXRfY3B1X3BtdSh2b2lkKQotewotCWludCBpLCBpcnFzLCBlcnIgPSAwOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBwbXVfZGV2aWNlc1tBUk1fUE1VX0RFVklDRV9DUFVdOwotCi0JaWYgKCFwZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlycXMgPSBwZGV2LT5udW1fcmVzb3VyY2VzOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIFBNVSBpbnRlcnJ1cHQgdGhhdCB3ZSBjYW4ndCBzaGlmdCwgYXNzdW1lIHRoYXQKLQkgKiB3ZSdyZSBydW5uaW5nIG9uIGEgdW5pcHJvY2Vzc29yIG1hY2hpbmUgYW5kIGNvbnRpbnVlLgotCSAqLwotCWlmIChpcnFzID09IDEgJiYgIWlycV9jYW5fc2V0X2FmZmluaXR5KHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCkpKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBpcnFzOyArK2kpIHsKLQkJZXJyID0gc2V0X2lycV9hZmZpbml0eShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpLCBpKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLWludAotaW5pdF9wbXUoZW51bSBhcm1fcG11X3R5cGUgdHlwZSkKLXsKLQlpbnQgZXJyID0gMDsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQVJNX1BNVV9ERVZJQ0VfQ1BVOgotCQllcnIgPSBpbml0X2NwdV9wbXUoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfd2FybmluZygiYXR0ZW1wdCB0byBpbml0aWFsaXNlIFBNVSBvZiB1bmtub3duICIKLQkJCSAgICJ0eXBlICVkXG4iLCB0eXBlKTsKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9wbXUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmQwODE0MC4uNzUzMTZmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKi8KICNpbmNsdWRlIDxzdGRhcmcuaD4KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwppbmRleCAyNDkxZjNiLi40ODM3MjdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jIGIvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKaW5kZXggMGIxM2E3Mi4uODA4NTQxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKQEAgLTgsNyArOCw3IEBACiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpICYmICFkZWZpbmVkKENPTkZJR19BUk1fVU5XSU5EKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCAzZmU5M2Y3Li43ZTc5NzdhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtODQ5LDI1ICs4NDksOCBAQAogCiAJaWYgKF9fYXRhZ3NfcG9pbnRlcikKIAkJdGFncyA9IHBoeXNfdG9fdmlydChfX2F0YWdzX3BvaW50ZXIpOwotCWVsc2UgaWYgKG1kZXNjLT5ib290X3BhcmFtcykgewotI2lmZGVmIENPTkZJR19NTVUKLQkJLyoKLQkJICogV2Ugc3RpbGwgYXJlIGV4ZWN1dGluZyB3aXRoIGEgbWluaW1hbCBNTVUgbWFwcGluZyBjcmVhdGVkCi0JCSAqIHdpdGggdGhlIHByZXN1bXB0aW9uIHRoYXQgdGhlIG1hY2hpbmUgZGVmYXVsdCBmb3IgdGhpcwotCQkgKiBpcyBsb2NhdGVkIGluIHRoZSBmaXJzdCBNQiBvZiBSQU0uICBBbnl0aGluZyBlbHNlIHdpbGwKLQkJICogZmF1bHQgYW5kIHNpbGVudGx5IGhhbmcgdGhlIGtlcm5lbCBhdCB0aGlzIHBvaW50LgotCQkgKi8KLQkJaWYgKG1kZXNjLT5ib290X3BhcmFtcyA8IFBIWVNfT0ZGU0VUIHx8Ci0JCSAgICBtZGVzYy0+Ym9vdF9wYXJhbXMgPj0gUEhZU19PRkZTRVQgKyBTWl8xTSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJEZWZhdWx0IGJvb3QgcGFyYW1zIGF0IHBoeXNpY2FsIDB4JTA4bHggb3V0IG9mIHJlYWNoXG4iLAotCQkJICAgICAgIG1kZXNjLT5ib290X3BhcmFtcyk7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCXsKLQkJCXRhZ3MgPSBwaHlzX3RvX3ZpcnQobWRlc2MtPmJvb3RfcGFyYW1zKTsKLQkJfQotCX0KKwllbHNlIGlmIChtZGVzYy0+YXRhZ19vZmZzZXQpCisJCXRhZ3MgPSAodm9pZCAqKShQQUdFX09GRlNFVCArIG1kZXNjLT5hdGFnX29mZnNldCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERVBSRUNBVEVEX1BBUkFNX1NUUlVDVCkKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMgYi9hcmNoL2FybS9rZXJuZWwvc2xlZXAuUwppbmRleCBkYzkwMmYyLi4wMjBlOTljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2xlZXAuUworKysgYi9hcmNoL2FybS9rZXJuZWwvc2xlZXAuUwpAQCAtOCw5MiArOCw2MSBAQAogCS50ZXh0CiAKIC8qCi0gKiBTYXZlIENQVSBzdGF0ZSBmb3IgYSBzdXNwZW5kCi0gKiAgcjEgPSB2OnAgb2Zmc2V0Ci0gKiAgcjIgPSBzdXNwZW5kIGZ1bmN0aW9uIGFyZzAKLSAqICByMyA9IHN1c3BlbmQgZnVuY3Rpb24KKyAqIFNhdmUgQ1BVIHN0YXRlIGZvciBhIHN1c3BlbmQuICBUaGlzIHNhdmVzIHRoZSBDUFUgZ2VuZXJhbCBwdXJwb3NlCisgKiByZWdpc3RlcnMsIGFuZCBhbGxvY2F0ZXMgc3BhY2Ugb24gdGhlIGtlcm5lbCBzdGFjayB0byBzYXZlIHRoZSBDUFUKKyAqIHNwZWNpZmljIHJlZ2lzdGVycyBhbmQgc29tZSBvdGhlciBkYXRhIGZvciByZXN1bWUuCisgKiAgcjAgPSBzdXNwZW5kIGZ1bmN0aW9uIGFyZzAKKyAqICByMSA9IHN1c3BlbmQgZnVuY3Rpb24KICAqLwogRU5UUlkoX19jcHVfc3VzcGVuZCkKIAlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CiAjaWZkZWYgTVVMVElfQ1BVCiAJbGRyCXIxMCwgPXByb2Nlc3NvcgotCWxkcglyNSwgW3IxMCwgI0NQVV9TTEVFUF9TSVpFXSBAIHNpemUgb2YgQ1BVIHNsZWVwIHN0YXRlCi0JbGRyCWlwLCBbcjEwLCAjQ1BVX0RPX1JFU1VNRV0gQCB2aXJ0dWFsIHJlc3VtZSBmdW5jdGlvbgorCWxkcglyNCwgW3IxMCwgI0NQVV9TTEVFUF9TSVpFXSBAIHNpemUgb2YgQ1BVIHNsZWVwIHN0YXRlCiAjZWxzZQotCWxkcglyNSwgPWNwdV9zdXNwZW5kX3NpemUKLQlsZHIJaXAsID1jcHVfZG9fcmVzdW1lCisJbGRyCXI0LCA9Y3B1X3N1c3BlbmRfc2l6ZQogI2VuZGlmCi0JbW92CXI2LCBzcAkJCUAgY3VycmVudCB2aXJ0dWFsIFNQCi0Jc3ViCXNwLCBzcCwgcjUJCUAgYWxsb2NhdGUgQ1BVIHN0YXRlIG9uIHN0YWNrCi0JbW92CXIwLCBzcAkJCUAgc2F2ZSBwb2ludGVyIHRvIENQVSBzYXZlIGJsb2NrCi0JYWRkCWlwLCBpcCwgcjEJCUAgY29udmVydCByZXN1bWUgZm4gdG8gcGh5cwotCXN0bWZkCXNwISwge3IxLCByNiwgaXB9CUAgc2F2ZSB2OnAsIHZpcnQgU1AsIHBoeXMgcmVzdW1lIGZuCi0JbGRyCXI1LCA9c2xlZXBfc2F2ZV9zcAotCWFkZAlyNiwgc3AsIHIxCQlAIGNvbnZlcnQgU1AgdG8gcGh5cwotCXN0bWZkCXNwISwge3IyLCByM30JCUAgc2F2ZSBzdXNwZW5kIGZ1bmMgYXJnIGFuZCBwb2ludGVyCisJbW92CXI1LCBzcAkJCUAgY3VycmVudCB2aXJ0dWFsIFNQCisJYWRkCXI0LCByNCwgIzEyCQlAIFNwYWNlIGZvciBwZ2QsIHZpcnQgc3AsIHBoeXMgcmVzdW1lIGZuCisJc3ViCXNwLCBzcCwgcjQJCUAgYWxsb2NhdGUgQ1BVIHN0YXRlIG9uIHN0YWNrCisJc3RtZmQJc3AhLCB7cjAsIHIxfQkJQCBzYXZlIHN1c3BlbmQgZnVuYyBhcmcgYW5kIHBvaW50ZXIKKwlhZGQJcjAsIHNwLCAjOAkJQCBzYXZlIHBvaW50ZXIgdG8gc2F2ZSBibG9jaworCW1vdglyMSwgcjQJCQlAIHNpemUgb2Ygc2F2ZSBibG9jaworCW1vdglyMiwgcjUJCQlAIHZpcnR1YWwgU1AKKwlsZHIJcjMsID1zbGVlcF9zYXZlX3NwCiAjaWZkZWYgQ09ORklHX1NNUAogCUFMVF9TTVAobXJjIHAxNSwgMCwgbHIsIGMwLCBjMCwgNSkKIAlBTFRfVVAobW92IGxyLCAjMCkKIAlhbmQJbHIsIGxyLCAjMTUKLQlzdHIJcjYsIFtyNSwgbHIsIGxzbCAjMl0JQCBzYXZlIHBoeXMgU1AKLSNlbHNlCi0Jc3RyCXI2LCBbcjVdCQlAIHNhdmUgcGh5cyBTUAorCWFkZAlyMywgcjMsIGxyLCBsc2wgIzIKICNlbmRpZgotI2lmZGVmIE1VTFRJX0NQVQotCW1vdglsciwgcGMKLQlsZHIJcGMsIFtyMTAsICNDUFVfRE9fU1VTUEVORF0gQCBzYXZlIENQVSBzdGF0ZQotI2Vsc2UKLQlibAljcHVfZG9fc3VzcGVuZAotI2VuZGlmCi0KLQlAIGZsdXNoIGRhdGEgY2FjaGUKLSNpZmRlZiBNVUxUSV9DQUNIRQotCWxkcglyMTAsID1jcHVfY2FjaGUKLQltb3YJbHIsIHBjCi0JbGRyCXBjLCBbcjEwLCAjQ0FDSEVfRkxVU0hfS0VSTl9BTExdCi0jZWxzZQotCWJsCV9fY3B1Y19mbHVzaF9rZXJuX2FsbAotI2VuZGlmCisJYmwJX19jcHVfc3VzcGVuZF9zYXZlCiAJYWRyCWxyLCBCU1lNKGNwdV9zdXNwZW5kX2Fib3J0KQogCWxkbWZkCXNwISwge3IwLCBwY30JCUAgY2FsbCBzdXNwZW5kIGZuCiBFTkRQUk9DKF9fY3B1X3N1c3BlbmQpCiAJLmx0b3JnCiAKIGNwdV9zdXNwZW5kX2Fib3J0OgotCWxkbWlhCXNwISwge3IxIC0gcjN9CQlAIHBvcCB2OnAsIHZpcnQgU1AsIHBoeXMgcmVzdW1lIGZuCisJbGRtaWEJc3AhLCB7cjEgLSByM30JCUAgcG9wIHBoeXMgcGdkLCB2aXJ0IFNQLCBwaHlzIHJlc3VtZSBmbgorCXRlcQlyMCwgIzAKKwltb3ZlcQlyMCwgIzEJCQlAIGZvcmNlIG5vbi16ZXJvIHZhbHVlCiAJbW92CXNwLCByMgogCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KIEVORFBST0MoY3B1X3N1c3BlbmRfYWJvcnQpCiAKIC8qCiAgKiByMCA9IGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUKLSAqIHIxID0gdjpwIG9mZnNldCAocHJlc2VydmVkIGJ5IGNwdV9kb19yZXN1bWUpCi0gKiByMiA9IHBoeXMgcGFnZSB0YWJsZSBiYXNlCi0gKiByMyA9IEwxIHNlY3Rpb24gZmxhZ3MKICAqLwotRU5UUlkoY3B1X3Jlc3VtZV9tbXUpCi0JYWRyCXI0LCBjcHVfcmVzdW1lX3R1cm5fbW11X29uCi0JbW92CXI0LCByNCwgbHNyICMyMAotCW9ycglyMywgcjMsIHI0LCBsc2wgIzIwCi0JbGRyCXI1LCBbcjIsIHI0LCBsc2wgIzJdCUAgc2F2ZSBvbGQgbWFwcGluZwotCXN0cglyMywgW3IyLCByNCwgbHNsICMyXQlAIHNldHVwIDE6MSBtYXBwaW5nIGZvciBtbXUgY29kZQotCXN1YglyMiwgcjIsIHIxCi0JbGRyCXIzLCA9Y3B1X3Jlc3VtZV9hZnRlcl9tbXUKLQliaWMJcjEsIHIwLCAjQ1JfQwkJQCBlbnN1cmUgRC1jYWNoZSBpcyBkaXNhYmxlZAotCWIJY3B1X3Jlc3VtZV90dXJuX21tdV9vbgotRU5EUFJPQyhjcHVfcmVzdW1lX21tdSkKLQkubHRvcmcKIAkuYWxpZ24JNQotY3B1X3Jlc3VtZV90dXJuX21tdV9vbjoKLQltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAwCUAgdHVybiBvbiBNTVUsIEktY2FjaGUsIGV0YwotCW1yYwlwMTUsIDAsIHIxLCBjMCwgYzAsIDAJQCByZWFkIGlkIHJlZwotCW1vdglyMSwgcjEKLQltb3YJcjEsIHIxCitFTlRSWShjcHVfcmVzdW1lX21tdSkKKwlsZHIJcjMsID1jcHVfcmVzdW1lX2FmdGVyX21tdQorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJQCB0dXJuIG9uIE1NVSwgSS1jYWNoZSwgZXRjCisJbXJjCXAxNSwgMCwgcjAsIGMwLCBjMCwgMAlAIHJlYWQgaWQgcmVnCisJbW92CXIwLCByMAorCW1vdglyMCwgcjAKIAltb3YJcGMsIHIzCQkJQCBqdW1wIHRvIHZpcnR1YWwgYWRkcmVzcwotRU5EUFJPQyhjcHVfcmVzdW1lX3R1cm5fbW11X29uKQorRU5EUFJPQyhjcHVfcmVzdW1lX21tdSkKIGNwdV9yZXN1bWVfYWZ0ZXJfbW11OgotCXN0cglyNSwgW3IyLCByNCwgbHNsICMyXQlAIHJlc3RvcmUgb2xkIG1hcHBpbmcKLQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCUAgdHVybiBvbiBELWNhY2hlCiAJYmwJY3B1X2luaXQJCUAgcmVzdG9yZSB0aGUgdW5kL2FidC9pcnEgYmFua2VkIHJlZ3MKIAltb3YJcjAsICMwCQkJQCByZXR1cm4gemVybyBvbiBzdWNjZXNzCiAJbGRtZmQJc3AhLCB7cjQgLSByMTEsIHBjfQpAQCAtMTE5LDcgKzg4LDcgQEAKIAlsZHIJcjAsIHNsZWVwX3NhdmVfc3AJQCBzdGFjayBwaHlzIGFkZHIKICNlbmRpZgogCXNldG1vZGUJUFNSX0lfQklUIHwgUFNSX0ZfQklUIHwgU1ZDX01PREUsIHIxICBAIHNldCBTVkMsIGlycXMgb2ZmCi0JQCBsb2FkIHY6cCwgc3RhY2ssIHJlc3VtZSBmbgorCUAgbG9hZCBwaHlzIHBnZCwgc3RhY2ssIHJlc3VtZSBmbgogICBBUk0oCWxkbWlhCXIwISwge3IxLCBzcCwgcGN9CSkKIFRIVU1CKAlsZG1pYQlyMCEsIHtyMSwgcjIsIHIzfQkpCiBUSFVNQigJbW92CXNwLCByMgkJCSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCA5NGYzNGE2Li5lZjU2NDBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC00NjAsMTAgKzQ2MCw2IEBACiAJZm9yIChpID0gMDsgaSA8IE5SX0lQSTsgaSsrKQogCQlzdW0gKz0gX19nZXRfaXJxX3N0YXQoY3B1LCBpcGlfaXJxc1tpXSk7CiAKLSNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCi0Jc3VtICs9IF9fZ2V0X2lycV9zdGF0KGNwdSwgbG9jYWxfdGltZXJfaXJxcyk7Ci0jZW5kaWYKLQogCXJldHVybiBzdW07CiB9CiAKQEAgLTQ4MCwzOCArNDc2LDYgQEAKIAlpcnFfZXhpdCgpOwogfQogCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBkb19sb2NhbF90aW1lcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQloYW5kbGVfbG9jYWxfdGltZXIocmVncyk7Ci19Ci0KLXZvaWQgaGFuZGxlX2xvY2FsX3RpbWVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JaWYgKGxvY2FsX3RpbWVyX2FjaygpKSB7Ci0JCV9faW5jX2lycV9zdGF0KGNwdSwgbG9jYWxfdGltZXJfaXJxcyk7Ci0JCWlwaV90aW1lcigpOwotCX0KLQotCXNldF9pcnFfcmVncyhvbGRfcmVncyk7Ci19Ci0KLXZvaWQgc2hvd19sb2NhbF9pcnFzKHN0cnVjdCBzZXFfZmlsZSAqcCwgaW50IHByZWMpCi17Ci0JdW5zaWduZWQgaW50IGNwdTsKLQotCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIkxPQyIpOwotCi0JZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KQotCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIF9fZ2V0X2lycV9zdGF0KGNwdSwgbG9jYWxfdGltZXJfaXJxcykpOwotCi0Jc2VxX3ByaW50ZihwLCAiIExvY2FsIHRpbWVyIGludGVycnVwdHNcbiIpOwotfQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKIHN0YXRpYyB2b2lkIHNtcF90aW1lcl9icm9hZGNhc3QoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CkBAIC01NjIsNyArNTI2LDcgQEAKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZwZXJfY3B1KHBlcmNwdV9jbG9ja2V2ZW50LCBjcHUpOwogCi0JZXZ0LT5zZXRfbW9kZShDTE9DS19FVlRfTU9ERV9VTlVTRUQsIGV2dCk7CisJbG9jYWxfdGltZXJfc3RvcChldnQpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wX3R3ZC5jCmluZGV4IDAxYzE4NjIuLmE4YTY2ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXBfdHdkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcF90d2QuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vc21wX3R3ZC5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogCiAvKiBzZXQgdXAgYnkgdGhlIHBsYXRmb3JtIGNvZGUgKi8KQEAgLTI2LDYgKzI3LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdHdkX3RpbWVyX3JhdGU7CiAKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIF9fcGVyY3B1ICoqdHdkX2V2dDsKKwogc3RhdGljIHZvaWQgdHdkX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAogCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQogewpAQCAtODAsNiArODMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCB0d2RfdGltZXJfc3RvcChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCit7CisJdHdkX3NldF9tb2RlKENMT0NLX0VWVF9NT0RFX1VOVVNFRCwgY2xrKTsKKwlkaXNhYmxlX3BlcmNwdV9pcnEoY2xrLT5pcnEpOworfQorCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgdHdkX2NhbGlicmF0ZV9yYXRlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudDsKQEAgLTExOSwxMSArMTI4LDQzIEBACiAJfQogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgdHdkX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICooc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKilkZXZfaWQ7CisKKwlpZiAodHdkX3RpbWVyX2FjaygpKSB7CisJCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCiAvKgogICogU2V0dXAgdGhlIGxvY2FsIGNsb2NrIGV2ZW50cyBmb3IgYSBDUFUuCiAgKi8KIHZvaWQgX19jcHVpbml0IHR3ZF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCiB7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKnRoaXNfY3B1X2NsazsKKworCWlmICghdHdkX2V2dCkgeworCQlpbnQgZXJyOworCisJCXR3ZF9ldnQgPSBhbGxvY19wZXJjcHUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwkJaWYgKCF0d2RfZXZ0KSB7CisJCQlwcl9lcnIoInR3ZDogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWVyciA9IHJlcXVlc3RfcGVyY3B1X2lycShjbGstPmlycSwgdHdkX2hhbmRsZXIsCisJCQkJCSAidHdkIiwgdHdkX2V2dCk7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigidHdkOiBjYW4ndCByZWdpc3RlciBpbnRlcnJ1cHQgJWQgKCVkKVxuIiwKKwkJCSAgICAgICBjbGstPmlycSwgZXJyKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwogCXR3ZF9jYWxpYnJhdGVfcmF0ZSgpOwogCiAJY2xrLT5uYW1lID0gImxvY2FsX3RpbWVyIjsKQEAgLTEzNyw4ICsxNzgsMTAgQEAKIAljbGstPm1heF9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHhmZmZmZmZmZiwgY2xrKTsKIAljbGstPm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHhmLCBjbGspOwogCisJdGhpc19jcHVfY2xrID0gX190aGlzX2NwdV9wdHIodHdkX2V2dCk7CisJKnRoaXNfY3B1X2NsayA9IGNsazsKKwogCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjbGspOwogCi0JLyogTWFrZSBzdXJlIG91ciBsb2NhbCBpbnRlcnJ1cHQgY29udHJvbGxlciBoYXMgdGhpcyBlbmFibGVkICovCi0JZ2ljX2VuYWJsZV9wcGkoY2xrLT5pcnEpOworCWVuYWJsZV9wZXJjcHVfaXJxKGNsay0+aXJxLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL2FybS9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IDM4MWQyM2EuLjAwZjc5ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N1c3BlbmQuYyBiL2FyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMjJkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworc3RhdGljIHBnZF90ICpzdXNwZW5kX3BnZDsKKworZXh0ZXJuIGludCBfX2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcsIGludCAoKikodW5zaWduZWQgbG9uZykpOworZXh0ZXJuIHZvaWQgY3B1X3Jlc3VtZV9tbXUodm9pZCk7CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSBfX2NwdV9zdXNwZW5kKCkgdG8gc2F2ZSB0aGUgc3RhdGUsIGFuZCBkbyB3aGF0ZXZlcgorICogZmx1c2hpbmcgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgd2hlbiB0aGUgQ1BVIGdvZXMgdG8gc2xlZXAgd2UgaGF2ZQorICogdGhlIG5lY2Vzc2FyeSBkYXRhIGF2YWlsYWJsZSB3aGVuIHRoZSBjYWNoZXMgYXJlIG5vdCBzZWFyY2hlZC4KKyAqLwordm9pZCBfX2NwdV9zdXNwZW5kX3NhdmUodTMyICpwdHIsIHUzMiBwdHJzeiwgdTMyIHNwLCB1MzIgKnNhdmVfcHRyKQoreworCSpzYXZlX3B0ciA9IHZpcnRfdG9fcGh5cyhwdHIpOworCisJLyogVGhpcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIExETSBpbiBjcHVfcmVzdW1lKCkgYXNzZW1ibHkgKi8KKwkqcHRyKysgPSB2aXJ0X3RvX3BoeXMoc3VzcGVuZF9wZ2QpOworCSpwdHIrKyA9IHNwOworCSpwdHIrKyA9IHZpcnRfdG9fcGh5cyhjcHVfZG9fcmVzdW1lKTsKKworCWNwdV9kb19zdXNwZW5kKHB0cik7CisKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlvdXRlcl9jbGVhbl9yYW5nZSgqc2F2ZV9wdHIsICpzYXZlX3B0ciArIHB0cnN6KTsKKwlvdXRlcl9jbGVhbl9yYW5nZSh2aXJ0X3RvX3BoeXMoc2F2ZV9wdHIpLAorCQkJICB2aXJ0X3RvX3BoeXMoc2F2ZV9wdHIpICsgc2l6ZW9mKCpzYXZlX3B0cikpOworfQorCisvKgorICogSGlkZSB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyB0byBfX2NwdV9zdXNwZW5kIC0gdGhlc2UgYXJlIGFuIGltcGxlbWVudGF0aW9uCisgKiBkZXRhaWwgd2hpY2ggcGxhdGZvcm0gY29kZSBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0LgorICovCitpbnQgY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcsIGludCAoKmZuKSh1bnNpZ25lZCBsb25nKSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPmFjdGl2ZV9tbTsKKwlpbnQgcmV0OworCisJaWYgKCFzdXNwZW5kX3BnZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFByb3ZpZGUgYSB0ZW1wb3JhcnkgcGFnZSB0YWJsZSB3aXRoIGFuIGlkZW50aXR5IG1hcHBpbmcgZm9yCisJICogdGhlIE1NVS1lbmFibGUgY29kZSwgcmVxdWlyZWQgZm9yIHJlc3VtaW5nLiAgT24gc3VjY2Vzc2Z1bAorCSAqIHJlc3VtZSAoaW5kaWNhdGVkIGJ5IGEgemVybyByZXR1cm4gY29kZSksIHdlIG5lZWQgdG8gc3dpdGNoCisJICogYmFjayB0byB0aGUgY29ycmVjdCBwYWdlIHRhYmxlcy4KKwkgKi8KKwlyZXQgPSBfX2NwdV9zdXNwZW5kKGFyZywgZm4pOworCWlmIChyZXQgPT0gMCkgeworCQljcHVfc3dpdGNoX21tKG1tLT5wZ2QsIG1tKTsKKwkJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdV9zdXNwZW5kX2luaXQodm9pZCkKK3sKKwlzdXNwZW5kX3BnZCA9IHBnZF9hbGxvYygmaW5pdF9tbSk7CisJaWYgKHN1c3BlbmRfcGdkKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRfdG9fcGh5cyhjcHVfcmVzdW1lX21tdSk7CisJCWlkZW50aXR5X21hcHBpbmdfYWRkKHN1c3BlbmRfcGdkLCBhZGRyLCBhZGRyICsgU0VDVElPTl9TSVpFKTsKKwl9CisJcmV0dXJuIHN1c3BlbmRfcGdkID8gMCA6IC1FTk9NRU07Cit9Citjb3JlX2luaXRjYWxsKGNwdV9zdXNwZW5kX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYyBiL2FyY2gvYXJtL2tlcm5lbC9zeXNfYXJtLmMKaW5kZXggNjJlN2M2MS4uZDJiMTc3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3N5c19hcm0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvc3lzX2FybS5jCkBAIC0xMiw3ICsxMiw3IEBACiAgKiAgaGF2ZSBhIG5vbi1zdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIG9uIHRoZSBMaW51eC9hcm0KICAqICBwbGF0Zm9ybS4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RpbWUuYyBiL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKaW5kZXggNWE1NGI5NS4uOGM1N2RkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUk0tc3BlY2lmaWMgdGltZSBoYW5kbGluZyBkZXRhaWxzOgogICogIHJlYWRpbmcgdGhlIFJUQyBhdCBib290dXAsIGV0Yy4uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Vud2luZC5jIGIvYXJjaC9hcm0va2VybmVsL3Vud2luZC5jCmluZGV4IGQyY2IwYjMuLmU3ZTgzNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYyBiL2FyY2gvYXJtL2tlcm5lbC94c2NhbGUtY3AwLmMKaW5kZXggMTc5NjE1Ny4uZTQyYWRjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYworKysgYi9hcmNoL2FybS9rZXJuZWwveHNjYWxlLWNwMC5jCkBAIC04LDcgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCmluZGV4IDIyNDg0NjcuLmQxMTFjM2U5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZwpAQCAtMTgyLDYgKzE4MiwxMSBAQAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGVjbzkyMCBib2FyZAogCitjb25maWcgTUFDSF9SU0lfRVdTCisJYm9vbCAiUlNJIEVtYmVkZGVkIFdlYnNlcnZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgUlNJcyBFV1MgYm9hcmQuCiBlbmRpZgogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE5MCwxMiArMTk1LDYgQEAKIAogY29tbWVudCAiQVQ5MVNBTTkyNjAgVmFyaWFudHMiCiAKLWNvbmZpZyBBUkNIX0FUOTFTQU05MjYwX1NBTTlYRQotCWJvb2wgIkFUOTFTQU05WEUiCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBBdG1lbCdzIEFUOTFTQU05WEUgU3lzdGVtLW9uLUNoaXAuCi0JICBUaGV5IGFyZSBiYXNpY2FsbHkgQVQ5MVNBTTkyNjBzIHdpdGggdmFyaW91cyBzaXplcyBvZiBlbWJlZGRlZCBGbGFzaC4KLQogY29tbWVudCAiQVQ5MVNBTTkyNjAgLyBBVDkxU0FNOVhFIEJvYXJkIFR5cGUiCiAKIGNvbmZpZyBNQUNIX0FUOTFTQU05MjYwRUsKQEAgLTM4MSw2ICszODAsMTQgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgR1NfSUExOF9TIGJvYXJkCiAJICBwcm9kdWNlZCBieSBHZW9TSUcgTHRkIGNvbXBhbnkuIFRoaXMgaXMgYW4gaW50ZXJuZXQgYWNjZWxlcm9ncmFwaC4KIAkgIDxodHRwOi8vd3d3Lmdlb3NpZy5jb20+CisKK2NvbmZpZyBNQUNIX1VTQl9BOUcyMAorCWJvb2wgIkNBTEFPIFVTQi1BOUcyMCIKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVNBTTlHMjAKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIGEgQ2FsYW8gU3lzdGVtcyBVU0ItQTlHMjAuCisJICA8aHR0cDovL3d3dy5jYWxhby1zeXN0ZW1zLmNvbT4KKwogZW5kaWYKIAogaWYgKEFSQ0hfQVQ5MVNBTTkyNjAgfHwgQVJDSF9BVDkxU0FNOUcyMCkKQEAgLTQ0Miw2ICs0NDksMTcgQEAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2NvbW1lbnQgIkdlbmVyaWMgQm9hcmQgVHlwZSIKKworY29uZmlnIE1BQ0hfQVQ5MVNBTV9EVAorCWJvb2wgIkF0bWVsIEFUOTFTQU0gRXZhbHVhdGlvbiBLaXRzIHdpdGggZGV2aWNlLXRyZWUgc3VwcG9ydCIKKwlzZWxlY3QgVVNFX09GCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdG8gZXhwZXJpbWVudCBkZXZpY2UtdHJlZSB3aXRoCisJICBhbiBBdG1lbCBFdmFsdWF0aW9uIEtpdC4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNvbW1lbnQgIkFUOTEgQm9hcmQgT3B0aW9ucyIKIAogY29uZmlnIE1URF9BVDkxX0RBVEFGTEFTSF9DQVJECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKaW5kZXggYmY1N2U4Yi4uMjQyMTc0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQpAQCAtMzYsMTIgKzM2LDEzIEBACiBvYmotJChDT05GSUdfTUFDSF9ZTDkyMDApCSs9IGJvYXJkLXlsLTkyMDAubwogb2JqLSQoQ09ORklHX01BQ0hfQ1BVQVQ5MSkJKz0gYm9hcmQtY3B1YXQ5MS5vCiBvYmotJChDT05GSUdfTUFDSF9FQ085MjApCSs9IGJvYXJkLWVjbzkyMC5vCitvYmotJChDT05GSUdfTUFDSF9SU0lfRVdTKQkrPSBib2FyZC1yc2ktZXdzLm8KIAogIyBBVDkxU0FNOTI2MCBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9BVDkxU0FNOTI2MEVLKSArPSBib2FyZC1zYW05MjYwZWsubwogb2JqLSQoQ09ORklHX01BQ0hfQ0FNNjApCSs9IGJvYXJkLWNhbTYwLm8KIG9iai0kKENPTkZJR19NQUNIX1NBTTlfTDkyNjApCSs9IGJvYXJkLXNhbTktbDkyNjAubwotb2JqLSQoQ09ORklHX01BQ0hfVVNCX0E5MjYwKQkrPSBib2FyZC11c2ItYTkyNjAubworb2JqLSQoQ09ORklHX01BQ0hfVVNCX0E5MjYwKQkrPSBib2FyZC11c2ItYTkyNngubwogb2JqLSQoQ09ORklHX01BQ0hfUUlMX0E5MjYwKQkrPSBib2FyZC1xaWwtYTkyNjAubwogb2JqLSQoQ09ORklHX01BQ0hfQUZFQjkyNjApCSs9IGJvYXJkLWFmZWItOTI2MHYxLm8KIG9iai0kKENPTkZJR19NQUNIX0NQVTkyNjApCSs9IGJvYXJkLWNwdTlrcmVhLm8KQEAgLTUzLDcgKzU0LDcgQEAKIAogIyBBVDkxU0FNOTI2MyBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9BVDkxU0FNOTI2M0VLKSArPSBib2FyZC1zYW05MjYzZWsubwotb2JqLSQoQ09ORklHX01BQ0hfVVNCX0E5MjYzKQkrPSBib2FyZC11c2ItYTkyNjMubworb2JqLSQoQ09ORklHX01BQ0hfVVNCX0E5MjYzKQkrPSBib2FyZC11c2ItYTkyNngubwogb2JqLSQoQ09ORklHX01BQ0hfTkVPQ09SRTkyNikJKz0gYm9hcmQtbmVvY29yZTkyNi5vCiAKICMgQVQ5MVNBTTlSTCBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CkBAIC02Nyw2ICs2OCw3IEBACiBvYmotJChDT05GSUdfTUFDSF9QT1JUVVhHMjApCSs9IGJvYXJkLXN0YW1wOWcyMC5vCiBvYmotJChDT05GSUdfTUFDSF9QQ09OVFJPTF9HMjApCSs9IGJvYXJkLXBjb250cm9sLWcyMC5vIGJvYXJkLXN0YW1wOWcyMC5vCiBvYmotJChDT05GSUdfTUFDSF9HU0lBMThTKQkrPSBib2FyZC1nc2lhMThzLm8gYm9hcmQtc3RhbXA5ZzIwLm8KK29iai0kKENPTkZJR19NQUNIX1VTQl9BOUcyMCkJKz0gYm9hcmQtdXNiLWE5MjZ4Lm8KIAogIyBBVDkxU0FNOTI2MC9BVDkxU0FNOUcyMCBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9TTkFQUEVSXzkyNjApCSs9IGJvYXJkLXNuYXBwZXI5MjYwLm8KQEAgLTc0LDYgKzc2LDkgQEAKICMgQVQ5MVNBTTlHNDUgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVNBTTlNMTBHNDVFSykgKz0gYm9hcmQtc2FtOW0xMGc0NWVrLm8KIAorIyBBVDkxU0FNIGJvYXJkIHdpdGggZGV2aWNlLXRyZWUKK29iai0kKENPTkZJR19NQUNIX0FUOTFTQU1fRFQpICs9IGJvYXJkLWR0Lm8KKwogIyBBVDkxQ0FQOSBib2FyZC1zcGVjaWZpYyBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9BVDkxQ0FQOUFESykJKz0gYm9hcmQtY2FwOWFkay5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlLmJvb3QKaW5kZXggOWFiNWEzZS4uOGRkYWZhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlLmJvb3QKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlLmJvb3QKQEAgLTE2LDMgKzE2LDUgQEAKIHBhcmFtc19waHlzLXkJOj0gMHgyMDAwMDEwMAogaW5pdHJkX3BoeXMteQk6PSAweDIwNDEwMDAwCiBlbmRpZgorCitkdGItJChDT05GSUdfTUFDSF9BVDkxU0FNX0RUKSArPSBhdDkxc2FtOW0xMGc0NWVrLmR0YiB1c2JfYTlnMjAuZHRiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCmluZGV4IGJmYzY4NDQuLmVjZGQ1NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCkBAIC0yMTksNiArMjE5LDggQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjYl9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMSIsICZzc2MxX2NsayksCisJLyogZmFrZSBoY2xrIGNsb2NrICovCisJQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXQ5MV9vaGNpIiwgJm9oY2lfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOV9kZXZpY2VzLmMKaW5kZXggZGJhMGQ4ZC4uYWRhZDcwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5X2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDlfZGV2aWNlcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCkBAIC0yMyw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFjYXA5Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxY2FwOV9tYXRyaXguaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgpAQCAtODAsNiArODAsMTIgQEAKIAkJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnZidXNfcGluW2ldLCAwKTsKIAl9CiAKKwkvKiBFbmFibGUgb3ZlcmN1cnJlbnQgbm90aWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKKwkJaWYgKGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSkKKwkJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAxKTsKKwl9CisKIAl1c2JoX2RhdGEgPSAqZGF0YTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfdXNiaF9kZXZpY2UpOwogfQpAQCAtOTIsNyArOTgsNyBAQAogICogIFVTQiBIUyBEZXZpY2UgKEdhZGdldCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBX01PRFVMRSkKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JhX3VkY19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC0xMDE1LDggKzEwMjEsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCi0JCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKKwkJLnN0YXJ0CT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSwKKwkJLmVuZAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTEwMjksNyArMTAzNSw2IEBACiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CiAJLnVzZV9kbWFfdHgJPSAwLAogCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAogfTsKIAogc3RhdGljIHU2NCBkYmd1X2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggZjczMzAyZC4uNzEzZDNiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0xOTMsNiArMTkzLDggQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4yIiwgJnNzYzJfY2xrKSwKKwkvKiBmYWtlIGhjbGsgY2xvY2sgKi8KKwlDTEtERVZfQ09OX0RFVl9JRCgiaGNsayIsICJhdDkxX29oY2kiLCAmb2hjaV9jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKaW5kZXggNzIyNzc1NS4uNjY1OTFmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYwpAQCAtMTQsMTEgKzE0LDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogCkBAIC02MCw5ICs2MCwxNyBAQAogCiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpCiB7CisJaW50IGk7CisKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKIAorCS8qIEVuYWJsZSBvdmVyY3VycmVudCBub3RpZmljYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydHM7IGkrKykgeworCQlpZiAoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKQorCQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5vdmVyY3VycmVudF9waW5baV0sIDEpOworCX0KKwogCXVzYmhfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF91c2JoX2RldmljZSk7CiB9CkBAIC04NjksOCArODc3LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVRNRUwpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC04ODMsNyArODkxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLwotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCmluZGV4IGNiMzk3YmUuLmI4NGE5ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCkBAIC0xOTksNiArMTk5LDE2IEBACiAJQ0xLREVWX0NPTl9ERVZfSUQoInQ0X2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzRfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgidDVfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjNV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4wIiwgJnNzY19jbGspLAorCS8qIG1vcmUgdXNhcnQgbG9va3VwIHRhYmxlIGZvciBEVCBlbnRyaWVzICovCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZmZmMjAwLnNlcmlhbCIsICZtY2spLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZiMDAwMC5zZXJpYWwiLCAmdXNhcnQwX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZmI0MDAwLnNlcmlhbCIsICZ1c2FydDFfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmYjgwMDAuc2VyaWFsIiwgJnVzYXJ0Ml9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZkMDAwMC5zZXJpYWwiLCAmdXNhcnQzX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZmQ0MDAwLnNlcmlhbCIsICZ1c2FydDRfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmZDgwMDAuc2VyaWFsIiwgJnVzYXJ0NV9jbGspLAorCS8qIGZha2UgaGNsayBjbG9jayAqLworCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0OTFfb2hjaSIsICZvaGNpX2NsayksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgdXNhcnRfY2xvY2tzX2xvb2t1cHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCmluZGV4IDM5ZjgxZjQuLjI1ZTM0NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwpAQCAtMTMsMTEgKzEzLDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOTI2MC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjBfbWF0cml4Lmg+CkBAIC02MSw5ICs2MSwxNyBAQAogCiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpCiB7CisJaW50IGk7CisKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKIAorCS8qIEVuYWJsZSBvdmVyY3VycmVudCBub3RpZmljYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydHM7IGkrKykgeworCQlpZiAoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKQorCQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5vdmVyY3VycmVudF9waW5baV0sIDEpOworCX0KKwogCXVzYmhfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MV91c2JoX2RldmljZSk7CiB9CkBAIC0zMTksNyArMzI3LDcgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVRNQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKIAkJaWYgKGRhdGEtPnNsb3RbaV0uYnVzX3dpZHRoKSB7CiAJCQkvKiBpbnB1dC9pcnEgKi8KIAkJCWlmIChkYXRhLT5zbG90W2ldLmRldGVjdF9waW4pIHsKQEAgLTgyOSw4ICs4MzcsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCi0JCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKKwkJLnN0YXJ0CT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSwKKwkJLmVuZAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTg0Myw3ICs4NTEsNiBAQAogc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgZGJndV9kYXRhID0gewogCS51c2VfZG1hX3R4CT0gMCwKIAkudXNlX2RtYV9yeAk9IDAsCQkvKiBEQkdVIG5vdCBjYXBhYmxlIG9mIHJlY2VpdmUgRE1BICovCi0JLnJlZ3MJCT0gKHZvaWQgX19pb21lbSAqKShBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVKSwKIH07CiAKIHN0YXRpYyB1NjQgZGJndV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKaW5kZXggNmM4ZTNiNS4uNjU4YTUxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKQEAgLTEyOSw2ICsxMjksMjAgQEAKIAkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAogfTsKIAorLyogSENsb2NrcyAqLworc3RhdGljIHN0cnVjdCBjbGsgaGNrMCA9IHsKKwkubmFtZQkJPSAiaGNrMCIsCisJLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMCwKKwkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCisJLmlkCQk9IDAsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgaGNrMSA9IHsKKwkubmFtZQkJPSAiaGNrMSIsCisJLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMSwKKwkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCisJLmlkCQk9IDEsCit9OworCiBzdGF0aWMgc3RydWN0IGNsayAqcGVyaXBoX2Nsb2Nrc1tdIF9faW5pdGRhdGEgPSB7CiAJJnBpb0FfY2xrLAogCSZwaW9CX2NsaywKQEAgLTE2MSw2ICsxNzUsNyBAQAogCUNMS0RFVl9DT05fREVWX0lEKCJwY2xrIiwgInNzYy4wIiwgJnNzYzBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMSIsICZzc2MxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjIiLCAmc3NjMl9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0OTFfb2hjaSIsICZoY2swKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpAQCAtMTk5LDIwICsyMTQsNiBAQAogCS5pZAkJPSAzLAogfTsKIAotLyogSENsb2NrcyAqLwotc3RhdGljIHN0cnVjdCBjbGsgaGNrMCA9IHsKLQkubmFtZQkJPSAiaGNrMCIsCi0JLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMCwKLQkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCi0JLmlkCQk9IDAsCi19Owotc3RhdGljIHN0cnVjdCBjbGsgaGNrMSA9IHsKLQkubmFtZQkJPSAiaGNrMSIsCi0JLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMSwKLQkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCi0JLmlkCQk9IDEsCi19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYwppbmRleCAwZjkxNzkyLi5hZTc4ZjRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAKQEAgLTIxLDcgKzIyLDYgQEAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOTI2MS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjFfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KQEAgLTY0LDkgKzY0LDE3IEBACiAKIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91c2JoKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqZGF0YSkKIHsKKwlpbnQgaTsKKwogCWlmICghZGF0YSkKIAkJcmV0dXJuOwogCisJLyogRW5hYmxlIG92ZXJjdXJyZW50IG5vdGlmaWNhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wb3J0czsgaSsrKSB7CisJCWlmIChkYXRhLT5vdmVyY3VycmVudF9waW5baV0pCisJCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSwgMSk7CisJfQorCiAJdXNiaF9kYXRhID0gKmRhdGE7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MV91c2JoX2RldmljZSk7CiB9CkBAIC04MDgsOCArODE2LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVRNRUwpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC04MjIsNyArODMwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLwotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCmluZGV4IDA0NGYzYzkuLmY4M2ZiYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCkBAIC0xODksNiArMTg5LDggQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgic3BpX2NsayIsICJhdG1lbF9zcGkuMCIsICZzcGkwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInNwaV9jbGsiLCAiYXRtZWxfc3BpLjEiLCAmc3BpMV9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MF9jbGsiLCAiYXRtZWxfdGNiLjAiLCAmdGNiX2NsayksCisJLyogZmFrZSBoY2xrIGNsb2NrICovCisJQ0xLREVWX0NPTl9ERVZfSUQoImhjbGsiLCAiYXQ5MV9vaGNpIiwgJm9oY2lfY2xrKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCB1c2FydF9jbG9ja3NfbG9va3Vwc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKaW5kZXggYTA1MGY0MS4uYWQwMTdlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCkBAIC0yMCw3ICsyMSw2IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYzX21hdHJpeC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CkBAIC03NCw2ICs3NCwxMiBAQAogCQkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+dmJ1c19waW5baV0sIDApOwogCX0KIAorCS8qIEVuYWJsZSBvdmVyY3VycmVudCBub3RpZmljYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cG9ydHM7IGkrKykgeworCQlpZiAoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKQorCQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5vdmVyY3VycmVudF9waW5baV0sIDEpOworCX0KKwogCXVzYmhfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MV91c2JoX2RldmljZSk7CiB9CkBAIC0xMTkwLDggKzExOTYsOCBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC0xMjA0LDcgKzEyMTAsNiBAQAogc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgZGJndV9kYXRhID0gewogCS51c2VfZG1hX3R4CT0gMCwKIAkudXNlX2RtYV9yeAk9IDAsCQkvKiBEQkdVIG5vdCBjYXBhYmxlIG9mIHJlY2VpdmUgRE1BICovCi0JLnJlZ3MJCT0gKHZvaWQgX19pb21lbSAqKShBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVKSwKIH07CiAKIHN0YXRpYyB1NjQgZGJndV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKaW5kZXggZTA0YzVmYi4uMzE4YjA0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC01Myw2ICs1NCwxMSBAQAogCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTlHNDVfSURfUElPREUsCiAJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKIH07CitzdGF0aWMgc3RydWN0IGNsayB0cm5nX2NsayA9IHsKKwkubmFtZQkJPSAidHJuZ19jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTlHNDVfSURfVFJORywKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVzYXJ0MF9jbGsgPSB7CiAJLm5hbWUJCT0gInVzYXJ0MF9jbGsiLAogCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTlHNDVfSURfVVMwLApAQCAtMTc2LDYgKzE4Miw3IEBACiAJJnBpb0JfY2xrLAogCSZwaW9DX2NsaywKIAkmcGlvREVfY2xrLAorCSZ0cm5nX2NsaywKIAkmdXNhcnQwX2NsaywKIAkmdXNhcnQxX2NsaywKIAkmdXNhcnQyX2NsaywKQEAgLTIxNSw2ICsyMjIsMTUgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjYjBfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2MwX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInBjbGsiLCAic3NjLjEiLCAmc3NjMV9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKE5VTEwsICJhdG1lbC10cm5nIiwgJnRybmdfY2xrKSwKKwkvKiBtb3JlIHVzYXJ0IGxvb2t1cCB0YWJsZSBmb3IgRFQgZW50cmllcyAqLworCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZmZWUwMC5zZXJpYWwiLCAmbWNrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmOGMwMDAuc2VyaWFsIiwgJnVzYXJ0MF9jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmY5MDAwMC5zZXJpYWwiLCAmdXNhcnQxX2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInVzYXJ0IiwgImZmZjk0MDAwLnNlcmlhbCIsICZ1c2FydDJfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidXNhcnQiLCAiZmZmOTgwMDAuc2VyaWFsIiwgJnVzYXJ0M19jbGspLAorCS8qIGZha2UgaGNsayBjbG9jayAqLworCUNMS0RFVl9DT05fREVWX0lEKCJoY2xrIiwgImF0OTFfb2hjaSIsICZ1aHBoc19jbGspLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHVzYXJ0X2Nsb2Nrc19sb29rdXBzW10gPSB7CkBAIC0zMTksNiArMzM1LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9tYXBfaW8odm9pZCkKIHsKIAlhdDkxX2luaXRfc3JhbSgwLCBBVDkxU0FNOUc0NV9TUkFNX0JBU0UsIEFUOTFTQU05RzQ1X1NSQU1fU0laRSk7CisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKFNaXzRNKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDVfZGV2aWNlcy5jCmluZGV4IDYwMGJmZmIuLjA5YTE2ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NV9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1X2RldmljZXMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KQEAgLTIxLDcgKzIyLDYgQEAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOWc0NS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlnNDVfbWF0cml4Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KQEAgLTEyNCw2ICsxMjQsMTIgQEAKIAkJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnZidXNfcGluW2ldLCAwKTsKIAl9CiAKKwkvKiBFbmFibGUgb3ZlcmN1cnJlbnQgbm90aWZpY2F0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnBvcnRzOyBpKyspIHsKKwkJaWYgKGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSkKKwkJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAxKTsKKwl9CisKIAl1c2JoX29oY2lfZGF0YSA9ICpkYXRhOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MV91c2JoX29oY2lfZGV2aWNlKTsKIH0KQEAgLTE5MSw3ICsxOTcsNyBAQAogICogIFVTQiBIUyBEZXZpY2UgKEdhZGdldCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiYV91ZGNfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSBBVDkxU0FNOUc0NV9VRFBIU19GSUZPLApAQCAtMTA5NSw2ICsxMTAxLDM0IEBACiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUUk5HCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSFdfUkFORE9NX0FUTUVMKSB8fCBkZWZpbmVkKENPTkZJR19IV19SQU5ET01fQVRNRUxfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0cm5nX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTlHNDVfQkFTRV9UUk5HLAorCQkuZW5kCT0gQVQ5MVNBTTlHNDVfQkFTRV9UUk5HICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05ZzQ1X3RybmdfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbC10cm5nIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gdHJuZ19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRybmdfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHJuZyh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTlnNDVfdHJuZ19kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdHJuZyh2b2lkKSB7fQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgV2F0Y2hkb2cKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEyOTgsOCArMTMzMiw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuc3RhcnQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAorCQkuZW5kCT0gQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtMTMxMiw3ICsxMzQ2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xNTgzLDYgKzE2MTYsNyBAQAogCWF0OTFfYWRkX2RldmljZV9oZG1hYygpOwogCWF0OTFfYWRkX2RldmljZV9ydGMoKTsKIAlhdDkxX2FkZF9kZXZpY2VfcnR0KCk7CisJYXQ5MV9hZGRfZGV2aWNlX3RybmcoKTsKIAlhdDkxX2FkZF9kZXZpY2Vfd2F0Y2hkb2coKTsKIAlhdDkxX2FkZF9kZXZpY2VfdGMoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsX2RldmljZXMuYwppbmRleCBhYWNiMTlkLi42MjhlYjU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmxfZGV2aWNlcy5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogCkBAIC0xNyw3ICsxOCw2IEBACiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlybC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlybF9tYXRyaXguaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgpAQCAtNzUsNyArNzUsNyBAQAogICogIFVTQiBIUyBEZXZpY2UgKEdhZGdldCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0FUTUVMX1VTQkEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9BVE1FTF9VU0JBX01PRFVMRSkKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JhX3VkY19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC05MDgsOCArOTA4LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQVRNRUwpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRiZ3VfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVLAotCQkuZW5kCT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSArIFNaXzUxMiAtIDEsCisJCS5zdGFydAk9IEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC05MjIsNyArOTIyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKIAkudXNlX2RtYV90eAk9IDAsCiAJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLwotCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCiB9OwogCiBzdGF0aWMgdTY0IGRiZ3VfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYwppbmRleCA1YWE1ODg1Li4zNjdkNWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNCw3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKaW5kZXggYjBjNzk2ZC4uNDI4MmQ5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00Myw3ICs0NCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKQEAgLTEzMCwxOSArMTMwLDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShhZmViOTI2MF9uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGFmZWI5MjYwX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGFmZWI5MjYwX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIxLAogCS5jbGUJCT0gMjIsCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCiAJLmJ1c193aWR0aF8xNgk9IDAsCisJLnBhcnRzCQk9IGFmZWI5MjYwX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGFmZWI5MjYwX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwppbmRleCBkMWFiZDU4Li5mOTBjZmIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM4LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogCiAjaW5jbHVkZSAic2FtOV9zbWMuaCIKQEAgLTEzMiwxOSArMTMyLDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShjYW02MF9uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGNhbTYwX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGNhbTYwX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIxLAogCS5jbGUJCT0gMjIsCiAJLy8gLmRldF9waW4JPSAuLi4gbm90IHRoZXJlCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQTksCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQTcsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBjYW02MF9uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShjYW02MF9uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGNhbTYwX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCmluZGV4IDY3OWIwYjcuLjVkZmZkM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQxLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFjYXA5X21hdHJpeC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW1fcmV2Lmg+CkBAIC0xNjksMTkgKzE2OSwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoY2FwOWFka19uYW5kX3BhcnRpdGlvbnMpOwotCXJldHVybiBjYXA5YWRrX25hbmRfcGFydGl0aW9uczsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBjYXA5YWRrX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIxLAogCS5jbGUJCT0gMjIsCiAvLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCiAvLwkucmR5X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QRDE1LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gY2FwOWFka19uYW5kX3BhcnRpdGlvbnMsCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoY2FwOWFka19uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBjYXA5YWRrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCmluZGV4IGM1NzhjNWQ5MC4uNzc0Yzg3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsNyArMzYsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYwppbmRleCBmNGRhOGExLi5mYzg4NWE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwLDcgKzQxLDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYwX21hdHJpeC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYwppbmRleCAyZDkxOWY1Li5kMzVlNjViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNiw3ICszNyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwX21jLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCmluZGV4IDE3NjU0ZDUuLmMzOTM2NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOCw3ICszOSw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKaW5kZXggNzJiNTU2Ny4uNTg2MTAwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zNSw3ICszNiw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZHQuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1kdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2QzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZHQuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBTZXR1cCBjb2RlIGZvciBBVDkxU0FNIEV2YWx1YXRpb24gS2l0cyB3aXRoIERldmljZSBUcmVlIHN1cHBvcnQKKyAqCisgKiAgQ292ZXJzOiAqIEFUOTFTQU05RzQ1LUVLRVMgIGJvYXJkCisgKiAgICAgICAgICAqIEFUOTFTQU05TTEwLUVLRVMgIGJvYXJkCisgKiAgICAgICAgICAqIEFUOTFTQU05TTEwRzQ1LUVLIGJvYXJkCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBBdG1lbCwKKyAqICAgICAgICAgICAgICAgIDIwMTEgTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhdG1lbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL3N5c3RlbV9yZXYuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgInNhbTlfc21jLmgiCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwMCBNSHogY3J5c3RhbCAqLworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisKKwkvKiBER0JVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLworCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKKworCS8qIHNldCBzZXJpYWwgY29uc29sZSB0byB0dHlTMCAoaWUsIERCR1UpICovCisJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7Cit9CisKKy8qIGRldF9waW4gaXMgbm90IGNvbm5lY3RlZCAqLworc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CisJLmFsZQkJPSAyMSwKKwkuY2xlCQk9IDIyLAorCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEM4LAorCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gMiwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDIsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gNCwKKwkubnJkX3B1bHNlCQk9IDQsCisJLm5jc193cml0ZV9wdWxzZQk9IDQsCisJLm53ZV9wdWxzZQkJPSA0LAorCisJLnJlYWRfY3ljbGUJCT0gNywKKwkud3JpdGVfY3ljbGUJCT0gNywKKworCS5tb2RlCQkJPSBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUsCisJLnRkZl9jeWNsZXMJCT0gMywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwlla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2ID0gYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KCk7CisJLyogc2V0dXAgYnVzLXdpZHRoICg4IG9yIDE2KSAqLworCWlmIChla19uYW5kX2RhdGEuYnVzX3dpZHRoXzE2KQorCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfMTY7CisJZWxzZQorCQlla19uYW5kX3NtY19jb25maWcubW9kZSB8PSBBVDkxX1NNQ19EQldfODsKKworCS8qIGNvbmZpZ3VyZSBjaGlwLXNlbGVjdCAzIChOQU5EKSAqLworCXNhbTlfc21jX2NvbmZpZ3VyZSgzLCAmZWtfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhaWNfb2ZfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFybTkyMDAtYWljIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2R0X2luaXRfaXJxKHZvaWQpCit7CisJaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUoYWljX29mX21hdGNoLCAweGZmZmZmMDAwLCAwKTsKKwlhdDkxX2luaXRfaXJxX2RlZmF1bHQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGF0OTFfZHRfZGV2aWNlX2luaXQodm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwgTlVMTCwgTlVMTCk7CisKKwkvKiBOQU5EICovCisJZWtfYWRkX2RldmljZV9uYW5kKCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphdDkxX2R0X2JvYXJkX2NvbXBhdFtdIF9faW5pdGRhdGEgPSB7CisJImF0bWVsLGF0OTFzYW05bTEwZzQ1ZWsiLAorCSJjYWxhbyx1c2ItYTlnMjAiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoYXQ5MXNhbV9kdCwgIkF0bWVsIEFUOTFTQU0gKERldmljZSBUcmVlKSIpCisJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IGF0OTFfZHRfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGF0OTFfZHRfZGV2aWNlX2luaXQsCisJLmR0X2NvbXBhdAk9IGF0OTFfZHRfYm9hcmRfY29tcGF0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYwppbmRleCAwMTE3MGEyLi40NWRiN2EzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwppbmRleCA3YzAzMTNjLi4yZjljMTZkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzcsNyArMzgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYwppbmRleCA0YTE3MDg5Li4zYmFlNzNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNCw3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYwppbmRleCA5ZGM4ZDQ5Li5lNjEzNTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwX21jLmg+CiAKQEAgLTk3LDE5ICs5NywxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoa2I5MjAyX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4ga2I5MjAyX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGtiOTIwMl9uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMiwKIAkuY2xlCQk9IDIxLAogCS8vIC5kZXRfcGluCT0gLi4uIG5vdCB0aGVyZQogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMyOSwKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMjgsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBrYjkyMDJfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoa2I5MjAyX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBrYjkyMDJfYm9hcmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKaW5kZXggOWJjNmFiMy4uZWY4MTZjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDQsNyArNDUsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogCiAjaW5jbHVkZSAic2FtOV9zbWMuaCIKQEAgLTE4MiwxOSArMTgyLDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShuZW9jb3JlOTI2X25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gbmVvY29yZTkyNl9uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBuZW9jb3JlOTI2X25hbmRfZGF0YSA9IHsKIAkuYWxlCQkJPSAyMSwKIAkuY2xlCQkJPSAyMiwKIAkucmR5X3BpbgkJPSBBVDkxX1BJTl9QQjE5LAogCS5yZHlfcGluX2FjdGl2ZV9sb3cJPSAxLAogCS5lbmFibGVfcGluCQk9IEFUOTFfUElOX1BEMTUsCi0JLnBhcnRpdGlvbl9pbmZvCQk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCQk9IG5lb2NvcmU5MjZfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwkJPSBBUlJBWV9TSVpFKG5lb2NvcmU5MjZfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBuZW9jb3JlOTI2X25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCmluZGV4IGI3YjgzOTAuLjBhOGZlNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM3LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDBfbWMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwppbmRleCA4MWY5MTEwLi4wNzQyMWJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDAsNyArNDEsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCkBAIC0xMzAsMTkgKzEzMCwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKaW5kZXggNmYwOGZhYS4uODBhOGM5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOSw3ICs0MCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpAQCAtMTM4LDE5ICsxMzgsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGRrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZGtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZGtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjIsCiAJLmNsZQkJPSAyMSwKIAkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMSwKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMiwKIAkvLyAuZW5hYmxlX3Bpbgk9IC4uLiBub3QgdGhlcmUKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGRrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGRrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKICNkZWZpbmUgREtfRkxBU0hfQkFTRQlBVDkxX0NISVBTRUxFQ1RfMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYwppbmRleCA4NWJjY2NkLi45OWZkN2Y4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM5LDcgKzQwLDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwX21jLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcnNpLWV3cy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJzaS1ld3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJzaS1ld3MuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIGJvYXJkLXJzaS1ld3MuYworICoKKyAqICBDb3B5cmlnaHQgKEMpCisgKiAgMjAwNSBTQU4gUGVvcGxlLAorICogIDIwMDgtMjAxMSBSLVMtSSBFbGVrdHJvdGVjaG5payBHbWJIICYgQ28uIEtHCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCByc2lfZXdzX2luaXRfZWFybHkodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKKworCS8qIFNldHVwIHRoZSBMRURzICovCisJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEI2LCBBVDkxX1BJTl9QQjkpOworCisJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KKwkvKiBUaGlzIG9uZSBpcyBmb3IgZGVidWdnaW5nICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOworCisJLyogVVNBUlQxIG9uIHR0eVMyLiAoUngsIFR4LCBDVFMsIFJUUywgRFRSLCBEU1IsIERDRCwgUkkpICovCisJLyogRGlhbGluLy1vdXQgbW9kZW0gaW50ZXJmYWNlICovCisJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFSTTkyMDBfSURfVVMxLCAyLCBBVE1FTF9VQVJUX0NUUyB8IEFUTUVMX1VBUlRfUlRTCisJCQkgICB8IEFUTUVMX1VBUlRfRFRSIHwgQVRNRUxfVUFSVF9EU1IgfCBBVE1FTF9VQVJUX0RDRAorCQkJICAgfCBBVE1FTF9VQVJUX1JJKTsKKworCS8qIFVTQVJUMyBvbiB0dHlTNC4gKFJ4LCBUeCwgUlRTKSAqLworCS8qIFJTNDg1IGNvbW11bmljYXRpb24gKi8KKwlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVJNOTIwMF9JRF9VUzMsIDQsIEFUTUVMX1VBUlRfUlRTKTsKKworCS8qIHNldCBzZXJpYWwgY29uc29sZSB0byB0dHlTMCAoaWUsIERCR1UpICovCisJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7Cit9CisKKy8qCisgKiBFdGhlcm5ldAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgcnNpX2V3c19ldGhfZGF0YSBfX2luaXRkYXRhID0geworCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKKwkuaXNfcm1paQk9IDEsCit9OworCisvKgorICogVVNCIEhvc3QKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSByc2lfZXdzX3VzYmhfZGF0YSBfX2luaXRkYXRhID0geworCS5wb3J0cwkJPSAxLAorfTsKKworLyoKKyAqIFNEL01DCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSByc2lfZXdzX21tY19kYXRhIF9faW5pdGRhdGEgPSB7CisJLnNsb3RfYgkJPSAwLAorCS53aXJlNAkJPSAxLAorCS5kZXRfcGluCT0gQVQ5MV9QSU5fUEIyNywKKwkud3BfcGluCQk9IEFUOTFfUElOX1BCMjksCit9OworCisvKgorICogSTJDCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gcnNpX2V3c19pMmNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygiZHMxMzM3IiwgMHg2OCksCisJfSwKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCIyNGMwMSIsIDB4NTApLAorCX0KK307CisKKy8qCisgKiBMRURzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgcnNpX2V3c19sZWRzW10gPSB7CisJeworCQkubmFtZQkJCT0gImxlZDAiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEI2LAorCQkuYWN0aXZlX2xvdwkJPSAwLAorCX0sCisJeworCQkubmFtZQkJCT0gImxlZDEiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEI3LAorCQkuYWN0aXZlX2xvdwkJPSAwLAorCX0sCisJeworCQkubmFtZQkJCT0gImxlZDIiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEI4LAorCQkuYWN0aXZlX2xvdwkJPSAwLAorCX0sCisJeworCQkubmFtZQkJCT0gImxlZDMiLAorCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEI5LAorCQkuYWN0aXZlX2xvdwkJPSAwLAorCX0sCit9OworCisvKgorICogRGF0YUZsYXNoCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gcnNpX2V3c19zcGlfZGV2aWNlc1tdID0geworCXsJLyogRGF0YUZsYXNoIGNoaXAgMSovCisJCS5tb2RhbGlhcwk9ICJtdGRfZGF0YWZsYXNoIiwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwkJLm1heF9zcGVlZF9oegk9IDUgKiAxMDAwICogMTAwMCwKKwl9LAorCXsJLyogRGF0YUZsYXNoIGNoaXAgMiovCisJCS5tb2RhbGlhcwk9ICJtdGRfZGF0YWZsYXNoIiwKKwkJLmNoaXBfc2VsZWN0CT0gMSwKKwkJLm1heF9zcGVlZF9oegk9IDUgKiAxMDAwICogMTAwMCwKKwl9LAorfTsKKworLyoKKyAqIE5PUiBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcnNpZXdzX25vcl9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiYm9vdCIsCisJCS5vZmZzZXQJCT0gMCwKKwkJLnNpemUJCT0gMyAqIFNaXzEyOEssCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRQorCX0sCisJeworCQkubmFtZQkJPSAia2VybmVsIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCQk9IFNaXzJNIC0gKDMgKiBTWl8xMjhLKQorCX0sCisJeworCQkubmFtZQkJPSAicm9vdCIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQkJPSBTWl84TQorCX0sCisJeworCQkubmFtZQkJPSAia2VybmVsdXBkIiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCQk9IDMgKiBTWl81MTJLLAorCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUKKwl9LAorCXsKKwkJLm5hbWUJCT0gInJvb3R1cGQiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJCT0gOSAqIFNaXzUxMkssCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSByc2lld3Nfbm9yX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IHJzaWV3c19ub3JfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKHJzaWV3c19ub3JfcGFydGl0aW9ucyksCit9OworCisjZGVmaW5lIE5PUl9CQVNFCUFUOTFfQ0hJUFNFTEVDVF8wCisjZGVmaW5lIE5PUl9TSVpFCVNaXzE2TQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG5vcl9mbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE5PUl9CQVNFLAorCQkuZW5kCT0gTk9SX0JBU0UgKyBOT1JfU0laRSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJzaWV3c19ub3JfZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnJzaWV3c19ub3JfZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IG5vcl9mbGFzaF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG5vcl9mbGFzaF9yZXNvdXJjZXMpLAorfTsKKworLyoKKyAqIEluaXQgRnVuYworICovCitzdGF0aWMgdm9pZCBfX2luaXQgcnNpX2V3c19ib2FyZF9pbml0KHZvaWQpCit7CisJLyogU2VyaWFsICovCisJYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOworCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BBMjEsIDApOworCS8qIEV0aGVybmV0ICovCisJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmcnNpX2V3c19ldGhfZGF0YSk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmcnNpX2V3c191c2JoX2RhdGEpOworCS8qIEkyQyAqLworCWF0OTFfYWRkX2RldmljZV9pMmMocnNpX2V3c19pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUocnNpX2V3c19pMmNfZGV2aWNlcykpOworCS8qIFNQSSAqLworCWF0OTFfYWRkX2RldmljZV9zcGkocnNpX2V3c19zcGlfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUocnNpX2V3c19zcGlfZGV2aWNlcykpOworCS8qIE1NQyAqLworCWF0OTFfYWRkX2RldmljZV9tbWMoMCwgJnJzaV9ld3NfbW1jX2RhdGEpOworCS8qIE5PUiBGbGFzaCAqLworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcnNpZXdzX25vcl9mbGFzaCk7CisJLyogTEVEcyAqLworCWF0OTFfZ3Bpb19sZWRzKHJzaV9ld3NfbGVkcywgQVJSQVlfU0laRShyc2lfZXdzX2xlZHMpKTsKK30KKworTUFDSElORV9TVEFSVChSU0lfRVdTLCAiUlNJIEVXUyIpCisJLyogTWFpbnRhaW5lcjogSm9zZWYgSG9sem1heXIgPGhvbHptYXlyQHJzaS1lbGVrdHJvdGVjaG5pay5kZT4gKi8KKwkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IHJzaV9ld3NfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCisJLmluaXRfbWFjaGluZQk9IHJzaV9ld3NfYm9hcmRfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYwppbmRleCA0ZDNhMDJmLi4wNzJkNTNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNyw3ICszOCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAogI2luY2x1ZGUgInNhbTlfc21jLmgiCkBAIC0xMzEsMTkgKzEzMSwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwppbmRleCA4YTUwYzNlLi40ZjEwMTgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDEsNyArNDIsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtX3Jldi5oPgpAQCAtMTczLDE5ICsxNzMsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIC8vCS5kZXRfcGluCT0gLi4uIG5vdCBjb25uZWN0ZWQKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gZWtfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKaW5kZXggNTA5NmEwZS4uYjAwNWI3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQ1LDcgKzQ2LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KICNpbmNsdWRlIDxtYWNoL3N5c3RlbV9yZXYuaD4KQEAgLTE3OSwxOSArMTc5LDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKIAkuYWxlCQk9IDIyLAogCS5jbGUJCT0gMjEsCiAvLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCiAJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzE1LAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCmluZGV4IGVhOGYxODUuLmJjY2RjZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00NCw3ICs0NSw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW1fcmV2Lmg+CkBAIC0xODAsMTkgKzE4MCwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEEyMiwKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BEMTUsCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSBla19uYW5kX3BhcnRpdGlvbiwKKwkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwppbmRleCA4MTdmNTlkLi42NGZjNzVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDEsNyArNDIsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW1fcmV2Lmg+CiAKQEAgLTE1NywxOSArMTU3LDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCiAvKiBkZXRfcGluIGlzIG5vdCBjb25uZWN0ZWQgKi8KIHN0YXRpYyBzdHJ1Y3QgYXRtZWxfbmFuZF9kYXRhIF9faW5pdGRhdGEgZWtfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gMjEsCiAJLmNsZQkJPSAyMiwKIAkucmR5X3Bpbgk9IEFUOTFfUElOX1BDMTMsCiAJLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0LAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKKwkucGFydHMJCT0gZWtfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pLAogfTsKIAogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBla19uYW5kX3NtY19jb25maWcgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKaW5kZXggYWQyMzRjYy4uOTJkZTkxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTM4LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtX3Jldi5oPgpAQCAtMTM3LDE5ICsxMzcsMTQgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKLQlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Ci19Ci0KIC8qIGRldF9waW4gaXMgbm90IGNvbm5lY3RlZCAqLwogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEM4LAogCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwppbmRleCA0ZjE0YjU0Li5iMmI3NDgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMCw3ICszMSw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKQEAgLTg4LDE5ICs4OCwxNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiBfX2luaXQgbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOwotCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEQxNywKIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BCNiwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgZWtfbmFuZF9zbWNfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYwppbmRleCBjNzNkMjVlLi4wZGYwMWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYwpAQCAtOTcsMTggKzk3LDEyIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdAotc25hcHBlcjkyNjBfbmFuZF9wYXJ0aXRpb25faW5mbyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKHNuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9ucyk7Ci0JcmV0dXJuIHNuYXBwZXI5MjYwX25hbmRfcGFydGl0aW9uczsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBzbmFwcGVyOTI2MF9uYW5kX2RhdGEgPSB7CiAJLmFsZQkJPSAyMSwKIAkuY2xlCQk9IDIyLAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMywKLQkucGFydGl0aW9uX2luZm8JPSBzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbl9pbmZvLAorCS5wYXJ0cwkJPSBzbmFwcGVyOTI2MF9uYW5kX3BhcnRpdGlvbnMsCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoc25hcHBlcjkyNjBfbmFuZF9wYXJ0aXRpb25zKSwKIAkuYnVzX3dpZHRoXzE2CT0gMCwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0YzFhMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQotICogIENvcHlyaWdodCAoQykgMjAwNiBBdG1lbAotICogIENvcHlyaWdodCAoQykgMjAwNyBDYWxhby1zeXN0ZW1zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+Ci0jaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+Ci0KLSNpbmNsdWRlICJzYW05X3NtYy5oIgotI2luY2x1ZGUgImdlbmVyaWMuaCIKLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQotewotCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwotCi0JLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KLQlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7Ci0KLQkvKiBzZXQgc2VyaWFsIGNvbnNvbGUgdG8gdHR5UzAgKGllLCBEQkdVKSAqLwotCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwotfQotCi0vKgotICogVVNCIEhvc3QgcG9ydAotICovCi1zdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgZWtfdXNiaF9kYXRhID0gewotCS5wb3J0cwkJPSAyLAotfTsKLQotLyoKLSAqIFVTQiBEZXZpY2UgcG9ydAotICovCi1zdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBla191ZGNfZGF0YSA9IHsKLQkudmJ1c19waW4JPSBBVDkxX1BJTl9QQzUsCi0JLnB1bGx1cF9waW4JPSAwLAkJLyogcHVsbC11cCBkcml2ZW4gYnkgVURDICovCi19OwotCi0vKgotICogTUFDQiBFdGhlcm5ldCBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWtfbWFjYl9kYXRhID0gewotCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BBMzEsCi0JLmlzX3JtaWkJPSAxLAotfTsKLQotLyoKLSAqIE5BTkQgZmxhc2gKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIF9faW5pdGRhdGEgZWtfbmFuZF9wYXJ0aXRpb25bXSA9IHsKLQl7Ci0JCS5uYW1lCT0gIlVib290ICYgS2VybmVsIiwKLQkJLm9mZnNldAk9IDAsCi0JCS5zaXplCT0gU1pfMTZNLAotCX0sCi0JewotCQkubmFtZQk9ICJSb290IEZTIiwKLQkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKLQkJLnNpemUJPSAxMjAgKiBTWl8xTSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiRlMiLAotCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAotCQkuc2l6ZQk9IDEyMCAqIFNaXzFNLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCi1zdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKLQkuYWxlCQk9IDIxLAotCS5jbGUJCT0gMjIsCi0vLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCi0JLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAotCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKLQkubmNzX3JlYWRfc2V0dXAJCT0gMCwKLQkubnJkX3NldHVwCQk9IDEsCi0JLm5jc193cml0ZV9zZXR1cAk9IDAsCi0JLm53ZV9zZXR1cAkJPSAxLAotCi0JLm5jc19yZWFkX3B1bHNlCQk9IDMsCi0JLm5yZF9wdWxzZQkJPSAzLAotCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAotCS5ud2VfcHVsc2UJCT0gMywKLQotCS5yZWFkX2N5Y2xlCQk9IDUsCi0JLndyaXRlX2N5Y2xlCQk9IDUsCi0KLQkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCi0JLnRkZl9jeWNsZXMJCT0gMiwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKLXsKLQkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KLQlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7Ci0KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKLX0KLQotLyoKLSAqIEdQSU8gQnV0dG9ucwotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBla19idXR0b25zW10gPSB7Ci0JewkvKiBVU0VSIFBVU0ggQlVUVE9OICovCi0JCS5jb2RlCQk9IEtFWV9FTlRFUiwKLQkJLmdwaW8JCT0gQVQ5MV9QSU5fUEIxMCwKLQkJLmFjdGl2ZV9sb3cJPSAxLAotCQkuZGVzYwkJPSAidXNlcl9wYiIsCi0JCS53YWtldXAJCT0gMSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGVrX2J1dHRvbl9kYXRhID0gewotCS5idXR0b25zCT0gZWtfYnV0dG9ucywKLQkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGVrX2J1dHRvbnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWtfYnV0dG9uX2RldmljZSA9IHsKLQkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZla19idXR0b25fZGF0YSwKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpCi17Ci0JYXQ5MV9zZXRfR1BJT19wZXJpcGgoQVQ5MV9QSU5fUEIxMCwgMSk7CS8qIHVzZXIgcHVzaCBidXR0b24sIHB1bGwgdXAgZW5hYmxlZCAqLwotCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BCMTAsIDEpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZla19idXR0b25fZGV2aWNlKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpIHt9Ci0jZW5kaWYKLQotLyoKLSAqIExFRHMKLSAqLwotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBla19sZWRzW10gPSB7Ci0JewkvKiB1c2VyX2xlZCAoZ3JlZW4pICovCi0JCS5uYW1lCQkJPSAidXNlcl9sZWQiLAotCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEIyMSwKLQkJLmFjdGl2ZV9sb3cJCT0gMCwKLQkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAotCX0KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCi17Ci0JLyogU2VyaWFsICovCi0JYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOwotCS8qIFVTQiBIb3N0ICovCi0JYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmVrX3VzYmhfZGF0YSk7Ci0JLyogVVNCIERldmljZSAqLwotCWF0OTFfYWRkX2RldmljZV91ZGMoJmVrX3VkY19kYXRhKTsKLQkvKiBOQU5EICovCi0JZWtfYWRkX2RldmljZV9uYW5kKCk7Ci0JLyogSTJDICovCi0JYXQ5MV9hZGRfZGV2aWNlX2kyYyhOVUxMLCAwKTsKLQkvKiBFdGhlcm5ldCAqLwotCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7Ci0JLyogUHVzaCBCdXR0b25zICovCi0JZWtfYWRkX2RldmljZV9idXR0b25zKCk7Ci0JLyogTEVEcyAqLwotCWF0OTFfZ3Bpb19sZWRzKGVrX2xlZHMsIEFSUkFZX1NJWkUoZWtfbGVkcykpOwotCS8qIHNodXRkb3duIGNvbnRyb2xsZXIsIHdha2V1cCBidXR0b24gKDUgbXNlYyBsb3cpICovCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TSERXX01SLCBBVDkxX1NIRFdfQ1BUV0swXygxMCkgfCBBVDkxX1NIRFdfV0tNT0RFMF9MT1cKLQkJCQl8IEFUOTFfU0hEV19SVFRXS0VOKTsKLX0KLQotTUFDSElORV9TVEFSVChVU0JfQTkyNjAsICJDQUxBTyBVU0JfQTkyNjAiKQotCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KLQkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKLQkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTc5MzcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNBTiBQZW9wbGUKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3IENhbGFvLXN5c3RlbXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KLQotI2luY2x1ZGUgInNhbTlfc21jLmgiCi0jaW5jbHVkZSAiZ2VuZXJpYy5oIgotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCi17Ci0JLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKLQotCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCi0JYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwotCi0JLyogc2V0IHNlcmlhbCBjb25zb2xlIHRvIHR0eVMwIChpZSwgREJHVSkgKi8KLQlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKLX0KLQotLyoKLSAqIFVTQiBIb3N0IHBvcnQKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKLQkucG9ydHMJCT0gMiwKLX07Ci0KLS8qCi0gKiBVU0IgRGV2aWNlIHBvcnQKLSAqLwotc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgZWtfdWRjX2RhdGEgPSB7Ci0JLnZidXNfcGluCT0gQVQ5MV9QSU5fUEIxMSwKLQkucHVsbHVwX3Bpbgk9IDAsCQkvKiBwdWxsLXVwIGRyaXZlbiBieSBVREMgKi8KLX07Ci0KLS8qCi0gKiBTUEkgZGV2aWNlcy4KLSAqLwotc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBla19zcGlfZGV2aWNlc1tdID0gewotI2lmICFkZWZpbmVkKENPTkZJR19NTUNfQVQ5MSkKLQl7CS8qIERhdGFGbGFzaCBjaGlwICovCi0JCS5tb2RhbGlhcwk9ICJtdGRfZGF0YWZsYXNoIiwKLQkJLmNoaXBfc2VsZWN0CT0gMCwKLQkJLm1heF9zcGVlZF9oegk9IDE1ICogMTAwMCAqIDEwMDAsCi0JCS5idXNfbnVtCT0gMCwKLQl9Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBNQUNCIEV0aGVybmV0IGRldmljZQotICovCi1zdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBla19tYWNiX2RhdGEgPSB7Ci0JLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEUzMSwKLQkuaXNfcm1paQk9IDEsCi19OwotCi0vKgotICogTkFORCBmbGFzaAotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBla19uYW5kX3BhcnRpdGlvbltdID0gewotCXsKLQkJLm5hbWUJPSAiTGludXggS2VybmVsIiwKLQkJLm9mZnNldAk9IDAsCi0JCS5zaXplCT0gU1pfMTZNLAotCX0sCi0JewotCQkubmFtZQk9ICJSb290IEZTIiwKLQkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKLQkJLnNpemUJPSAxMjAgKiBTWl8xTSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiRlMiLAotCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAotCQkuc2l6ZQk9IDEyMCAqIFNaXzFNLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqIF9faW5pdCBuYW5kX3BhcnRpdGlvbnMoaW50IHNpemUsIGludCAqbnVtX3BhcnRpdGlvbnMpCi17Ci0JKm51bV9wYXJ0aXRpb25zID0gQVJSQVlfU0laRShla19uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIGVrX25hbmRfcGFydGl0aW9uOwotfQotCi1zdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKLQkuYWxlCQk9IDIxLAotCS5jbGUJCT0gMjIsCi0vLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCi0JLnJkeV9waW4JPSBBVDkxX1BJTl9QQTIyLAotCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEQxNSwKLQkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIGVrX25hbmRfc21jX2NvbmZpZyA9IHsKLQkubmNzX3JlYWRfc2V0dXAJCT0gMCwKLQkubnJkX3NldHVwCQk9IDEsCi0JLm5jc193cml0ZV9zZXR1cAk9IDAsCi0JLm53ZV9zZXR1cAkJPSAxLAotCi0JLm5jc19yZWFkX3B1bHNlCQk9IDMsCi0JLm5yZF9wdWxzZQkJPSAzLAotCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAotCS5ud2VfcHVsc2UJCT0gMywKLQotCS5yZWFkX2N5Y2xlCQk9IDUsCi0JLndyaXRlX2N5Y2xlCQk9IDUsCi0KLQkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCi0JLnRkZl9jeWNsZXMJCT0gMiwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKLXsKLQkvKiBjb25maWd1cmUgY2hpcC1zZWxlY3QgMyAoTkFORCkgKi8KLQlzYW05X3NtY19jb25maWd1cmUoMywgJmVrX25hbmRfc21jX2NvbmZpZyk7Ci0KLQlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKLX0KLQotCi0vKgotICogR1BJTyBCdXR0b25zCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBla19idXR0b25zW10gPSB7Ci0JewkvKiBVU0VSIFBVU0ggQlVUVE9OICovCi0JCS5jb2RlCQk9IEtFWV9FTlRFUiwKLQkJLmdwaW8JCT0gQVQ5MV9QSU5fUEIxMCwKLQkJLmFjdGl2ZV9sb3cJPSAxLAotCQkuZGVzYwkJPSAidXNlcl9wYiIsCi0JCS53YWtldXAJCT0gMSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGVrX2J1dHRvbl9kYXRhID0gewotCS5idXR0b25zCT0gZWtfYnV0dG9ucywKLQkubmJ1dHRvbnMJPSBBUlJBWV9TSVpFKGVrX2J1dHRvbnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWtfYnV0dG9uX2RldmljZSA9IHsKLQkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZla19idXR0b25fZGF0YSwKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpCi17Ci0JYXQ5MV9zZXRfR1BJT19wZXJpcGgoQVQ5MV9QSU5fUEIxMCwgMSk7CS8qIHVzZXIgcHVzaCBidXR0b24sIHB1bGwgdXAgZW5hYmxlZCAqLwotCWF0OTFfc2V0X2RlZ2xpdGNoKEFUOTFfUElOX1BCMTAsIDEpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZla19idXR0b25fZGV2aWNlKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9idXR0b25zKHZvaWQpIHt9Ci0jZW5kaWYKLQotLyoKLSAqIExFRHMKLSAqLwotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBla19sZWRzW10gPSB7Ci0JewkvKiB1c2VyX2xlZCAoZ3JlZW4pICovCi0JCS5uYW1lCQkJPSAidXNlcl9sZWQiLAotCQkuZ3BpbwkJCT0gQVQ5MV9QSU5fUEIyMSwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlZmF1bHRfdHJpZ2dlcgk9ICJoZWFydGJlYXQiLAotCX0KLX07Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGVrX2JvYXJkX2luaXQodm9pZCkKLXsKLQkvKiBTZXJpYWwgKi8KLQlhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKCk7Ci0JLyogVVNCIEhvc3QgKi8KLQlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmZWtfdXNiaF9kYXRhKTsKLQkvKiBVU0IgRGV2aWNlICovCi0JYXQ5MV9hZGRfZGV2aWNlX3VkYygmZWtfdWRjX2RhdGEpOwotCS8qIFNQSSAqLwotCWF0OTFfYWRkX2RldmljZV9zcGkoZWtfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUoZWtfc3BpX2RldmljZXMpKTsKLQkvKiBFdGhlcm5ldCAqLwotCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7Ci0JLyogTkFORCAqLwotCWVrX2FkZF9kZXZpY2VfbmFuZCgpOwotCS8qIEkyQyAqLwotCWF0OTFfYWRkX2RldmljZV9pMmMoTlVMTCwgMCk7Ci0JLyogUHVzaCBCdXR0b25zICovCi0JZWtfYWRkX2RldmljZV9idXR0b25zKCk7Ci0JLyogTEVEcyAqLwotCWF0OTFfZ3Bpb19sZWRzKGVrX2xlZHMsIEFSUkFZX1NJWkUoZWtfbGVkcykpOwotCS8qIHNodXRkb3duIGNvbnRyb2xsZXIsIHdha2V1cCBidXR0b24gKDUgbXNlYyBsb3cpICovCi0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TSERXX01SLCBBVDkxX1NIRFdfQ1BUV0swXygxMCkgfCBBVDkxX1NIRFdfV0tNT0RFMF9MT1cKLQkJCQl8IEFUOTFfU0hEV19SVFRXS0VOKTsKLX0KLQotTUFDSElORV9TVEFSVChVU0JfQTkyNjMsICJDQUxBTyBVU0JfQTkyNjMiKQotCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KLQkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKLQkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjZ4LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMGJhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNnguYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNnguYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQorICogIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbi4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FsYW8tc3lzdGVtcworICogIENvcHlyaWdodCAoQykgMjAxMSBKZWFuLUNocmlzdG9waGUgUExBR05JT0wtVklMTEFSRCA8cGxhZ25pb2pAamNyb3NvZnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21tY19zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFzYW05X3NtYy5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgorCisjaW5jbHVkZSAic2FtOV9zbWMuaCIKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAgTUh6IGNyeXN0YWwgKi8KKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOworCisJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KKwlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CisKKwkvKiBzZXQgc2VyaWFsIGNvbnNvbGUgdG8gdHR5UzAgKGllLCBEQkdVKSAqLworCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOworfQorCisvKgorICogVVNCIEhvc3QgcG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgZWtfdXNiaF9kYXRhID0geworCS5wb3J0cwkJPSAyLAorfTsKKworLyoKKyAqIFVTQiBEZXZpY2UgcG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBla191ZGNfZGF0YSA9IHsKKwkudmJ1c19waW4JPSBBVDkxX1BJTl9QQjExLAorCS5wdWxsdXBfcGluCT0gMCwJCS8qIHB1bGwtdXAgZHJpdmVuIGJ5IFVEQyAqLworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfdWRjKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdXNiX2E5MjYwKCkgfHwgbWFjaGluZV9pc191c2JfYTlnMjAoKSkKKwkJZWtfdWRjX2RhdGEudmJ1c19waW4gPSBBVDkxX1BJTl9QQzU7CisKKwlhdDkxX2FkZF9kZXZpY2VfdWRjKCZla191ZGNfZGF0YSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKKyNkZWZpbmUgTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQgQVQ5MV9QSU5fUEM0CitzdGF0aWMgaW50IGF0OTFfbW1jX3NwaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlpcnFyZXR1cm5fdCAoKmRldGVjdF9pbnQpKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwkvKiBDb25maWd1cmUgSW50ZXJydXB0IHBpbiBhcyBpbnB1dCwgbm8gcHVsbC11cCAqLworCWF0OTFfc2V0X2dwaW9faW5wdXQoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQsIDApOworCXJldHVybiByZXF1ZXN0X2lycShncGlvX3RvX2lycShNTUNfU1BJX0NBUkRfREVURUNUX0lOVCksIGRldGVjdF9pbnQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJIm1tYy1zcGktZGV0ZWN0IiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0OTFfbW1jX3NwaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShncGlvX3RvX2lycShNTUNfU1BJX0NBUkRfREVURUNUX0lOVCksIGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IG1tY19zcGlfcGxhdGZvcm1fZGF0YSBhdDkxX21tY19zcGlfcGRhdGEgPSB7CisJLmluaXQgPSBhdDkxX21tY19zcGlfaW5pdCwKKwkuZXhpdCA9IGF0OTFfbW1jX3NwaV9leGl0LAorCS5kZXRlY3RfZGVsYXkgPSAxMDAsIC8qIG1zZWNzICovCit9OworI2VuZGlmCisKKy8qCisgKiBTUEkgZGV2aWNlcy4KKyAqLworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyB1c2JfYTkyNjNfc3BpX2RldmljZXNbXSA9IHsKKyNpZiAhZGVmaW5lZChDT05GSUdfTU1DX0FUOTEpCisJewkvKiBEYXRhRmxhc2ggY2hpcCAqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDAsCisJCS5tYXhfc3BlZWRfaHoJPSAxNSAqIDEwMDAgKiAxMDAwLAorCQkuYnVzX251bQk9IDAsCisJfQorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHVzYl9hOWcyMF9zcGlfZGV2aWNlc1tdID0geworI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gIm1tY19zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsCS8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAxLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9ICZhdDkxX21tY19zcGlfcGRhdGEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9zcGkodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191c2JfYTkyNjMoKSkKKwkJYXQ5MV9hZGRfZGV2aWNlX3NwaSh1c2JfYTkyNjNfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUodXNiX2E5MjYzX3NwaV9kZXZpY2VzKSk7CisJZWxzZSBpZiAobWFjaGluZV9pc191c2JfYTlnMjAoKSkKKwkJYXQ5MV9hZGRfZGV2aWNlX3NwaSh1c2JfYTlnMjBfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUodXNiX2E5ZzIwX3NwaV9kZXZpY2VzKSk7Cit9CisKKy8qCisgKiBNQUNCIEV0aGVybmV0IGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBla19tYWNiX2RhdGEgPSB7CisJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEUzMSwKKwkuaXNfcm1paQk9IDEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9ldGgodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191c2JfYTkyNjAoKSB8fCBtYWNoaW5lX2lzX3VzYl9hOWcyMCgpKQorCQlla19tYWNiX2RhdGEucGh5X2lycV9waW4gPSBBVDkxX1BJTl9QQTMxOworCisJYXQ5MV9hZGRfZGV2aWNlX2V0aCgmZWtfbWFjYl9kYXRhKTsKK30KKworLyoKKyAqIE5BTkQgZmxhc2gKKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIF9faW5pdGRhdGEgZWtfbmFuZF9wYXJ0aXRpb25bXSA9IHsKKwl7CisJCS5uYW1lCT0gImJhcmVib3giLAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSAzICogU1pfMTI4SywKKwl9LCB7CisJCS5uYW1lCT0gImJhcmVib3hlbnYiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IFNaXzEyOEssCisJfSwgeworCQkubmFtZQk9ICJiYXJlYm94ZW52MiIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gU1pfMTI4SywKKwl9LCB7CisJCS5uYW1lCT0gImtlcm5lbCIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCT0gNCAqIFNaXzFNLAorCX0sIHsKKwkJLm5hbWUJPSAicm9vdGZzIiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJPSAxMjAgKiBTWl8xTSwKKwl9LCB7CisJCS5uYW1lCT0gImRhdGEiLAorCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CisJLmFsZQkJPSAyMSwKKwkuY2xlCQk9IDIyLAorLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAorCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEEyMiwKKwkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BEMTUsCisJLnBhcnRzCQk9IGVrX25hbmRfcGFydGl0aW9uLAorCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgdXNiX2E5MjYwX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDEsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDMsCisJLm5yZF9wdWxzZQkJPSAzLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzLAorCS5ud2VfcHVsc2UJCT0gMywKKworCS5yZWFkX2N5Y2xlCQk9IDUsCisJLndyaXRlX2N5Y2xlCQk9IDUsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCisJLnRkZl9jeWNsZXMJCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgdXNiX2E5ZzIwX25hbmRfc21jX2NvbmZpZyA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDIsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAyLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDQsCisJLm5yZF9wdWxzZQkJPSA0LAorCS5uY3Nfd3JpdGVfcHVsc2UJPSA0LAorCS5ud2VfcHVsc2UJCT0gNCwKKworCS5yZWFkX2N5Y2xlCQk9IDcsCisJLndyaXRlX2N5Y2xlCQk9IDcsCisKKwkubW9kZQkJCT0gQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfREJXXzgsCisJLnRkZl9jeWNsZXMJCT0gMywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX25hbmQodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191c2JfYTkyNjAoKSB8fCBtYWNoaW5lX2lzX3VzYl9hOWcyMCgpKSB7CisJCWVrX25hbmRfZGF0YS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxMzsKKwkJZWtfbmFuZF9kYXRhLmVuYWJsZV9waW4JPSBBVDkxX1BJTl9QQzE0OworCX0KKworCS8qIGNvbmZpZ3VyZSBjaGlwLXNlbGVjdCAzIChOQU5EKSAqLworCWlmIChtYWNoaW5lX2lzX3VzYl9hOWcyMCgpKQorCQlzYW05X3NtY19jb25maWd1cmUoMywgJnVzYl9hOWcyMF9uYW5kX3NtY19jb25maWcpOworCWVsc2UKKwkJc2FtOV9zbWNfY29uZmlndXJlKDMsICZ1c2JfYTkyNjBfbmFuZF9zbWNfY29uZmlnKTsKKworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworfQorCisKKy8qCisgKiBHUElPIEJ1dHRvbnMKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGVrX2J1dHRvbnNbXSA9IHsKKwl7CS8qIFVTRVIgUFVTSCBCVVRUT04gKi8KKwkJLmNvZGUJCT0gS0VZX0VOVEVSLAorCQkuZ3BpbwkJPSBBVDkxX1BJTl9QQjEwLAorCQkuYWN0aXZlX2xvdwk9IDEsCisJCS5kZXNjCQk9ICJ1c2VyX3BiIiwKKwkJLndha2V1cAkJPSAxLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgZWtfYnV0dG9uX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBla19idXR0b25zLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUoZWtfYnV0dG9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBla19idXR0b25fZGV2aWNlID0geworCS5uYW1lCQk9ICJncGlvLWtleXMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmVrX2J1dHRvbl9kYXRhLAorCX0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX2J1dHRvbnModm9pZCkKK3sKKwlhdDkxX3NldF9HUElPX3BlcmlwaChBVDkxX1BJTl9QQjEwLCAxKTsJLyogdXNlciBwdXNoIGJ1dHRvbiwgcHVsbCB1cCBlbmFibGVkICovCisJYXQ5MV9zZXRfZGVnbGl0Y2goQVQ5MV9QSU5fUEIxMCwgMSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVrX2J1dHRvbl9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBla19hZGRfZGV2aWNlX2J1dHRvbnModm9pZCkge30KKyNlbmRpZgorCisvKgorICogTEVEcworICovCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGVrX2xlZHNbXSA9IHsKKwl7CS8qIHVzZXJfbGVkIChncmVlbikgKi8KKwkJLm5hbWUJCQk9ICJ1c2VyX2xlZCIsCisJCS5ncGlvCQkJPSBBVDkxX1BJTl9QQjIxLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGVrX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicnYzMDI5YzIiLCAweDU2KSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfbGVkcyh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3VzYl9hOTI2MCgpIHx8IG1hY2hpbmVfaXNfdXNiX2E5ZzIwKCkpCisJCWVrX2xlZHNbMF0uYWN0aXZlX2xvdyA9IDA7CisKKwlhdDkxX2dwaW9fbGVkcyhla19sZWRzLCBBUlJBWV9TSVpFKGVrX2xlZHMpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVrX2JvYXJkX2luaXQodm9pZCkKK3sKKwkvKiBTZXJpYWwgKi8KKwlhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKCk7CisJLyogVVNCIEhvc3QgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdXNiaCgmZWtfdXNiaF9kYXRhKTsKKwkvKiBVU0IgRGV2aWNlICovCisJZWtfYWRkX2RldmljZV91ZGMoKTsKKwkvKiBTUEkgKi8KKwlla19hZGRfZGV2aWNlX3NwaSgpOworCS8qIEV0aGVybmV0ICovCisJZWtfYWRkX2RldmljZV9ldGgoKTsKKwkvKiBOQU5EICovCisJZWtfYWRkX2RldmljZV9uYW5kKCk7CisJLyogUHVzaCBCdXR0b25zICovCisJZWtfYWRkX2RldmljZV9idXR0b25zKCk7CisJLyogTEVEcyAqLworCWVrX2FkZF9kZXZpY2VfbGVkcygpOworCisJaWYgKG1hY2hpbmVfaXNfdXNiX2E5ZzIwKCkpIHsKKwkJLyogSTJDICovCisJCWF0OTFfYWRkX2RldmljZV9pMmMoZWtfaTJjX2RldmljZXMsIEFSUkFZX1NJWkUoZWtfaTJjX2RldmljZXMpKTsKKwl9IGVsc2UgeworCQkvKiBJMkMgKi8KKwkJYXQ5MV9hZGRfZGV2aWNlX2kyYyhOVUxMLCAwKTsKKwkJLyogc2h1dGRvd24gY29udHJvbGxlciwgd2FrZXVwIGJ1dHRvbiAoNSBtc2VjIGxvdykgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TSERXX01SLCBBVDkxX1NIRFdfQ1BUV0swXygxMCkKKwkJCQl8IEFUOTFfU0hEV19XS01PREUwX0xPVworCQkJCXwgQVQ5MV9TSERXX1JUVFdLRU4pOworCX0KK30KKworTUFDSElORV9TVEFSVChVU0JfQTkyNjMsICJDQUxBTyBVU0JfQTkyNjMiKQorCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKKwkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKK01BQ0hJTkVfRU5ECisKK01BQ0hJTkVfU1RBUlQoVVNCX0E5MjYwLCAiQ0FMQU8gVVNCX0E5MjYwIikKKwkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCisJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCisJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCitNQUNISU5FX0VORAorCitNQUNISU5FX1NUQVJUKFVTQl9BOUcyMCwgIkNBTEFPIFVTQl9BOTJHMCIpCisJLyogTWFpbnRhaW5lcjogSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgKi8KKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKKwkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYwppbmRleCA5NWVkY2JkLi4xMmEzZjk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00Myw3ICs0NCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXJtOTIwMF9tYy5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKQEAgLTE3MiwxOSArMTcyLDE0IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICogX19pbml0IG5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKHlsOTIwMF9uYW5kX3BhcnRpdGlvbik7Ci0JcmV0dXJuIHlsOTIwMF9uYW5kX3BhcnRpdGlvbjsKLX0KLQogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgX19pbml0ZGF0YSB5bDkyMDBfbmFuZF9kYXRhID0gewogCS5hbGUJCT0gNiwKIAkuY2xlCQk9IDcsCiAJLy8gLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAogCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxNCwJLyogUi8hQiAoU2hlZXQxMCkgKi8KIAkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTUsCS8qICFDRSAgKFNoZWV0MTApICovCi0JLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorCS5wYXJ0cwkJPSB5bDkyMDBfbmFuZF9wYXJ0aXRpb24sCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUoeWw5MjAwX25hbmRfcGFydGl0aW9uKSwKIH07CiAKIC8qCkBAIC0zODksNyArMzg0LDcgQEAKICNpbmNsdWRlIDx2aWRlby9zMWQxM3h4eGZiLmg+CiAKIAotc3RhdGljIHZvaWQgX19pbml0IHlsOTIwMF9pbml0X3ZpZGVvKHZvaWQpCitzdGF0aWMgdm9pZCB5bDkyMDBfaW5pdF92aWRlbyh2b2lkKQogewogCS8qIE5XQUlUIFNpZ25hbCAqLwogCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDNiwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2NwdWlkbGUuYwppbmRleCAxY2ZlYWMxLi5hODUxZTZjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2NwdWlkbGUuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvY3B1aWRsZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJwbS5oIgogCkBAIC0zMyw3ICszNCw4IEBACiAKIC8qIEFjdHVhbCBjb2RlIHRoYXQgcHV0cyB0aGUgU29DIGluIGRpZmZlcmVudCBpZGxlIHN0YXRlcyAqLwogc3RhdGljIGludCBhdDkxX2VudGVyX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQorCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkgICAgICAgaW50IGluZGV4KQogewogCXN0cnVjdCB0aW1ldmFsIGJlZm9yZSwgYWZ0ZXI7CiAJaW50IGlkbGVfdGltZTsKQEAgLTQxLDEwICs0MywxMCBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlkb19nZXR0aW1lb2ZkYXkoJmJlZm9yZSk7Ci0JaWYgKHN0YXRlID09ICZkZXYtPnN0YXRlc1swXSkKKwlpZiAoaW5kZXggPT0gMCkKIAkJLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCiAJCWNwdV9kb19pZGxlKCk7Ci0JZWxzZSBpZiAoc3RhdGUgPT0gJmRldi0+c3RhdGVzWzFdKSB7CisJZWxzZSBpZiAoaW5kZXggPT0gMSkgewogCQlhc20oImIgMWY7IC5hbGlnbiA1OyAxOiIpOwogCQlhc20oIm1jciBwMTUsIDAsIHIwLCBjNywgYzEwLCA0Iik7CS8qIGRyYWluIHdyaXRlIGJ1ZmZlciAqLwogCQlzYXZlZF9scHIgPSBzZHJhbV9zZWxmcmVmcmVzaF9lbmFibGUoKTsKQEAgLTU1LDM0ICs1NywzOCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlpZGxlX3RpbWUgPSAoYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYykgKiBVU0VDX1BFUl9TRUMgKwogCQkJKGFmdGVyLnR2X3VzZWMgLSBiZWZvcmUudHZfdXNlYyk7Ci0JcmV0dXJuIGlkbGVfdGltZTsKKworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBpZGxlX3RpbWU7CisJcmV0dXJuIGluZGV4OwogfQogCiAvKiBJbml0aWFsaXplIENQVSBpZGxlIGJ5IHJlZ2lzdGVyaW5nIHRoZSBpZGxlIHN0YXRlcyAqLwogc3RhdGljIGludCBhdDkxX2luaXRfY3B1aWRsZSh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlOwotCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmF0OTFfaWRsZV9kcml2ZXIpOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJpdmVyID0gJmF0OTFfaWRsZV9kcml2ZXI7CiAKIAlkZXZpY2UgPSAmcGVyX2NwdShhdDkxX2NwdWlkbGVfZGV2aWNlLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWRldmljZS0+c3RhdGVfY291bnQgPSBBVDkxX01BWF9TVEFURVM7CisJZHJpdmVyLT5zdGF0ZV9jb3VudCA9IEFUOTFfTUFYX1NUQVRFUzsKIAogCS8qIFdhaXQgZm9yIGludGVycnVwdCBzdGF0ZSAqLwotCWRldmljZS0+c3RhdGVzWzBdLmVudGVyID0gYXQ5MV9lbnRlcl9pZGxlOwotCWRldmljZS0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7Ci0JZGV2aWNlLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOworCWRyaXZlci0+c3RhdGVzWzBdLmVudGVyID0gYXQ5MV9lbnRlcl9pZGxlOworCWRyaXZlci0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7CisJZHJpdmVyLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOworCWRyaXZlci0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOwogCiAJLyogV2FpdCBmb3IgaW50ZXJydXB0IGFuZCBSQU0gc2VsZiByZWZyZXNoIHN0YXRlICovCi0JZGV2aWNlLT5zdGF0ZXNbMV0uZW50ZXIgPSBhdDkxX2VudGVyX2lkbGU7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0uZXhpdF9sYXRlbmN5ID0gMTA7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzFdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzFdLm5hbWUsICJSQU1fU1IiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0uZGVzYywgIldGSSBhbmQgUkFNIFNlbGYgUmVmcmVzaCIpOworCWRyaXZlci0+c3RhdGVzWzFdLmVudGVyID0gYXQ5MV9lbnRlcl9pZGxlOworCWRyaXZlci0+c3RhdGVzWzFdLmV4aXRfbGF0ZW5jeSA9IDEwOworCWRyaXZlci0+c3RhdGVzWzFdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKKwlkcml2ZXItPnN0YXRlc1sxXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXN0cmNweShkcml2ZXItPnN0YXRlc1sxXS5uYW1lLCAiUkFNX1NSIik7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzFdLmRlc2MsICJXRkkgYW5kIFJBTSBTZWxmIFJlZnJlc2giKTsKKworCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZhdDkxX2lkbGVfZHJpdmVyKTsKIAogCWlmIChjcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXZpY2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9pbml0X2NwdWlkbGU6IEZhaWxlZCByZWdpc3RlcmluZ1xuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2dwaW8uYwppbmRleCA0NjE1NTI4Li4yMjRlOWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ncGlvLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KQEAgLTIyLDkgKzIzLDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmgKaW5kZXggMmM2MTFiOS4uNDA2YmI2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaApAQCAtMTI4LDggKzEyOCw2IEBACiAjZGVmaW5lIEFUOTFTQU05RzQ1X0VIQ0lfQkFTRQkweDAwODAwMDAwCS8qIFVTQiBIb3N0IGNvbnRyb2xsZXIgKEVIQ0kpICovCiAjZGVmaW5lIEFUOTFTQU05RzQ1X1ZERUNfQkFTRQkweDAwOTAwMDAwCS8qIFZpZGVvIERlY29kZXIgQ29udHJvbGxlciAqLwogCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUJU1pfNE0KLQogLyoKICAqIERNQSBwZXJpcGhlcmFsIGlkZW50aWZpZXJzCiAgKiBmb3IgaGFyZHdhcmUgaGFuZHNoYWtpbmcgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggZWQ1NDRhMC4uZWFjOTJlOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ib2FyZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYm9hcmQuaApAQCAtOTgsNiArOTgsMTEgQEAKIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSB7CiAJdTgJCXBvcnRzOwkJLyogbnVtYmVyIG9mIHBvcnRzIG9uIHJvb3QgaHViICovCiAJdTgJCXZidXNfcGluWzJdOwkvKiBwb3J0IHBvd2VyLWNvbnRyb2wgcGluICovCisJdTggICAgICAgICAgICAgIHZidXNfcGluX2ludmVydGVkOworCXU4ICAgICAgICAgICAgICBvdmVyY3VycmVudF9zdXBwb3J0ZWQ7CisJdTggICAgICAgICAgICAgIG92ZXJjdXJyZW50X3BpblsyXTsKKwl1OCAgICAgICAgICAgICAgb3ZlcmN1cnJlbnRfc3RhdHVzWzJdOworCXU4ICAgICAgICAgICAgICBvdmVyY3VycmVudF9jaGFuZ2VkWzJdOwogfTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91c2JoX29oY2koc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKTsKQEAgLTExMiw3ICsxMTcsOCBAQAogCXU4CQlhbGU7CQkvKiBhZGRyZXNzIGxpbmUgbnVtYmVyIGNvbm5lY3RlZCB0byBBTEUgKi8KIAl1OAkJY2xlOwkJLyogYWRkcmVzcyBsaW5lIG51bWJlciBjb25uZWN0ZWQgdG8gQ0xFICovCiAJdTgJCWJ1c193aWR0aF8xNjsJLyogYnVzd2lkdGggaXMgMTYgYml0ICovCi0Jc3RydWN0IG10ZF9wYXJ0aXRpb24qICgqcGFydGl0aW9uX2luZm8pKGludCwgaW50Kik7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOworCXVuc2lnbmVkIGludAludW1fcGFydHM7CiB9OwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9uYW5kKHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKmRhdGEpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYmMxZTBiMi4uMGVkODY0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbGRyCVxycCwgPShBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVKQlAIFN5c3RlbSBwZXJpcGhlcmFscyAocGh5cyBhZGRyZXNzKQogCWxkcglccnYsID0oQVQ5MV9WQV9CQVNFX1NZUwkrIEFUOTFfREJHVSkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHZpcnQgYWRkcmVzcykKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAwNTZkYzY2Li4yYjlhMWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjE0LDExICsyMTQsNiBAQAogICovCiAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLwotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAogCiAjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pIChncGlvKQogI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpICAoaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC90aW1leC5oCmluZGV4IDMxYWMyZDkuLjg1ODIwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvdGltZXguaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3RpbWV4LmgKQEAgLTY0LDcgKzY0LDEyIEBACiAKICNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHMjApCiAKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1VTQl9BOUcyMCkKKyNkZWZpbmUgQVQ5MVNBTTlfTUFTVEVSX0NMT0NLCTEzMzAwMDAwMAorI2Vsc2UKICNkZWZpbmUgQVQ5MVNBTTlfTUFTVEVSX0NMT0NLCTEzMjA5NjAwMAorI2VuZGlmCisKICNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkoQVQ5MVNBTTlfTUFTVEVSX0NMT0NLLzE2KQogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05RzQ1KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAppbmRleCA4ZWI0NTlmLi44ZTRhMWJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApAQCAtMjEsNiArMjEsOCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1ZNQUxMT0NfSAogI2RlZmluZSBfX0FTTV9BUkNIX1ZNQUxMT0NfSAogCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCiAjZGVmaW5lIFZNQUxMT0NfRU5ECQkoQVQ5MV9WSVJUX0JBU0UgJiBQR0RJUl9NQVNLKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvbGVkcy5jCmluZGV4IDA0MTVhODM5Li44ZGZhZmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvbGVkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9sZWRzLmMKQEAgLTksMTMgKzksMTMgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCmluZGV4IDQxNTllY2EuLjcwNDYxNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtMjUsNyArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMKaW5kZXggMGNhMDAwNS4uYjUyYjhkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9kbWEuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IGVkNzhhYWIuLjZhZTIwYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICiAKICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgogI2luY2x1ZGUgPGNmZ19nbG9iYWwuaD4KICNpbmNsdWRlIDxtYWNoL2NzcC9tbV9pby5oPgogCkBAIC0zMSw3ICszMCw3IEBACiAgKiAgKl9TSVpFICBpcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaW9uCiAgKiAgKl9CQVNFICBpcyB0aGUgdmlydHVhbCBhZGRyZXNzCiAgKi8KLSNkZWZpbmUgUkFNX1NUQVJUICAgICAgICAgICAgICAgUExBVF9QSFlTX09GRlNFVAorI2RlZmluZSBSQU1fU1RBUlQgICAgICAgICAgICAgICBQSFlTX09GRlNFVAogCiAjZGVmaW5lIFJBTV9TSVpFICAgICAgICAgICAgICAgIChDRkdfR0xPQkFMX1JBTV9TSVpFLUNGR19HTE9CQUxfUkFNX1NJWkVfUkVTRVJWRUQpCiAjZGVmaW5lIFJBTV9CQVNFICAgICAgICAgICAgICAgIFBBR0VfT0ZGU0VUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxNjJlNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAyMDA1IC0gMjAwOCBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKLSogYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB0byB5b3UKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAgKHRoZSAiR1BMIikuCi0qCi0qIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lIHRoaXMKLSogc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhCi0qIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvciB3cml0dGVuCi0qIGNvbnNlbnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2luY2x1ZGUgPGNmZ19nbG9iYWwuaD4KLQotLyoKLSAqIFBoeXNpY2FsIHZzIHZpcnR1YWwgUkFNIGFkZHJlc3Mgc3BhY2UgY29udmVyc2lvbi4gIFRoZXNlIGFyZQotICogcHJpdmF0ZSBkZWZpbml0aW9ucyB3aGljaCBzaG91bGQgTk9UIGJlIHVzZWQgb3V0c2lkZSBtZW1vcnkuaAotICogZmlsZXMuICBVc2UgdmlydF90b19waHlzL3BoeXNfdG9fdmlydC9fX3BhL19fdmEgaW5zdGVhZC4KLSAqLwotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQgQ0ZHX0dMT0JBTF9SQU1fQkFTRQotCi0vKgotICogTWF4aW11bSBETUEgbWVtb3J5IGFsbG93ZWQgaXMgMTRNCi0gKi8KLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRSAoU1pfMTZNIC0gU1pfMk0pCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL21tLmMgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvbW0uYwppbmRleCAwZjFjMzdlLi4xYWRlYzc4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL21tLmMKQEAgLTEzLDYgKzEzLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtNTMsNCArNTUsNiBAQAogewogCiAJaW90YWJsZV9pbml0KGJjbXJpbmdfaW9fZGVzYywgQVJSQVlfU0laRShiY21yaW5nX2lvX2Rlc2MpKTsKKwkvKiBNYXhpbXVtIERNQSBtZW1vcnkgYWxsb3dlZCBpcyAxNE0gKi8KKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoMTQgPDwgMjApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCmluZGV4IDRhNzRiMmM5Li4wMjc2MDkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCkBAIC02NCw3ICs2NCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQVVUQ1BVMTIsICJhdXRyb25peCBhdXRjcHUxMiIpCiAJLyogTWFpbnRhaW5lcjogVGhvbWFzIEdsZWl4bmVyICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAyMDAwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDIwMDAwLAogCS5tYXBfaW8JCT0gYXV0Y3B1MTJfbWFwX2lvLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKaW5kZXggNWExNjg5ZC4uMjViM2JmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYwpAQCAtNTUsNyArNTUsNyBAQAogCiBNQUNISU5FX1NUQVJUKENEQjg5NzEyLCAiQ2lycnVzLUNEQjg5NzEyIikKIAkvKiBNYWludGFpbmVyOiBSYXkgTGVodGluaWVtaSAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBjZGI4OTcxMl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYwppbmRleCAxNjQ4MWNmLi4xZGY5ZWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCkBAIC01Niw3ICs1Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ0VJVkEsICJDRUlWQS9Qb2xhcm9pZCBQaG90byBNQVggRGlnaXRhbCBQaWN0dXJlIEZyYW1lIikKIAkvKiBNYWludGFpbmVyOiBSb2IgU2NvdHQgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gY2VpdmFfbWFwX2lvLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKaW5kZXggMGEyZTc0Zi4uODA0OTZjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYwpAQCAtMzYsNyArMzYsNyBAQAogCiBNQUNISU5FX1NUQVJUKENMRVA3MjEyLCAiQ2lycnVzIExvZ2ljIDcyMTIvNzMxMiIpCiAJLyogTWFpbnRhaW5lcjogTm9ib2R5ICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDAxMDAsCiAJLmZpeHVwCQk9IGZpeHVwX2NsZXA3MzEyLAogCS5tYXBfaW8JCT0gY2xwczcxMXhfbWFwX2lvLAogCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKaW5kZXggNzI1YTdhNS4uOTcyMWY2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCkBAIC01Niw3ICs1Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRURCNzIxMSwgIkNMLUVEQjcyMTEgKEVQNzIxMSBldmFsIGJvYXJkKSIpCiAJLyogTWFpbnRhaW5lcjogSm9uIE1jQ2xpbnRvY2sgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDIwMTAwLAkvKiAweGMwMDAwMDAwIC0gMHhjMDAxZmZmZiBjYW4gYmUgdmlkZW8gUkFNICovCisJLmF0YWdfb2Zmc2V0CT0gMHgyMDEwMCwJLyogMHhjMDAwMDAwMCAtIDB4YzAwMWZmZmYgY2FuIGJlIHZpZGVvIFJBTSAqLwogCS5maXh1cAkJPSBmaXh1cF9lZGI3MjExLAogCS5tYXBfaW8JCT0gZWRiNzIxMV9tYXBfaW8sCiAJLnJlc2VydmUJPSBlZGI3MjExX3Jlc2VydmUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKaW5kZXggMTk0N2IzMC4uZDk5MjU2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYwpAQCAtNzQsNyArNzQsNiBAQAogCiBNQUNISU5FX1NUQVJUKEZPUlRVTkVULCAiQVJNLUZvcnR1TmV0IikKIAkvKiBNYWludGFpbmVyOiBGb3J0dU5ldCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDAwMCwKIAkuZml4dXAJCT0gZm9ydHVuZXRfZml4dXAsCiAJLm1hcF9pbwkJPSBjbHBzNzExeF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA1MDdjNjg3Li5iODAyZThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NscHM3MTExLmg+CiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogI2lmbmRlZiBDT05GSUdfREVCVUdfQ0xQUzcxMVhfVUFSVDIKIAkJbW92CVxycCwgIzB4MDAwMAlAIFVBUlQxCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCmluZGV4IDNmNzk2ZTAuLjZlY2VhOTVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCkBAIC04OCw3ICs4OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUDcyMFQsICJBUk0tUHJvc3BlY3RvcjcyMFQiKQogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSBmaXh1cF9wNzIwdCwKIAkubWFwX2lvCQk9IHA3MjB0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9jbnMzNDIwdmIuYyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9jbnMzNDIwdmIuYwppbmRleCAzZTdkMTQ5Li41NWY3YjRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvY25zMzQyMHZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2NuczM0MjB2Yi5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTlMzNDIwVkIsICJDYXZpdW0gTmV0d29ya3MgQ05TMzQyMCBWYWxpZGF0aW9uIEJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gY25zMzQyMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY25zM3h4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNuczN4eHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNTZkODI4Ni4uZDA0YzE1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTAsNyArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotCQkubWFjcm8JYWRkcnVhcnQscnAscnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LHJwLHJ2LHRtcAogCQltb3YJXHJwLCAjMHgwMDAwOTAwMAogCQlvcnIJXHJ2LCBccnAsICMweGYwMDAwMDAwCUAgdmlydHVhbCBiYXNlCiAJCW9ycglccnAsIFxycCwgIzB4MTAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE2YzVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgQVJNIExpbWl0ZWQKLSAqIENvcHlyaWdodCAyMDA4IENhdml1bSBOZXR3b3JrcwotICoKLSAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9NRU1PUllfSAotI2RlZmluZSBfX01BQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCi0KLSNkZWZpbmUgX19waHlzX3RvX2J1cyh4KQkoKHgpICsgUEhZU19PRkZTRVQpCi0jZGVmaW5lIF9fYnVzX3RvX3BoeXMoeCkJKCh4KSAtIFBIWVNfT0ZGU0VUKQotCi0jZGVmaW5lIF9fdmlydF90b19idXModikJX19waHlzX3RvX2J1cyhfX3ZpcnRfdG9fcGh5cyh2KSkKLSNkZWZpbmUgX19idXNfdG9fdmlydChiKQlfX3BoeXNfdG9fdmlydChfX2J1c190b19waHlzKGIpKQotI2RlZmluZSBfX3Bmbl90b19idXMocCkJCV9fcGh5c190b19idXMoX19wZm5fdG9fcGh5cyhwKSkKLSNkZWZpbmUgX19idXNfdG9fcGZuKGIpCQlfX3BoeXNfdG9fcGZuKF9fYnVzX3RvX3BoeXMoYikpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvS2NvbmZpZwppbmRleCBjMGRlYWNhLi4zMmQ4MzdkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvS2NvbmZpZwpAQCAtMTkyLDYgKzE5MiwxNiBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIERBODUwX1dMMTJYWAorCWJvb2wgIkFNMTh4IHdsMTI3MSBkYXVnaHRlciBib2FyZCIKKwlkZXBlbmRzIG9uIE1BQ0hfREFWSU5DSV9EQTg1MF9FVk0KKwloZWxwCisJICBUaGUgd2wxMjcxIGRhdWdodGVyIGNhcmQgZm9yIEFNMTh4IEVWTXMgaXMgYSBjb21ibyB3aXJlbGVzcworCSAgY29ubmVjdGl2aXR5IGFkZC1vbiBjYXJkLCBiYXNlZCBvbiB0aGUgTFMgUmVzZWFyY2ggVGlXaSBtb2R1bGUgd2l0aAorCSAgVGV4YXMgSW5zdHJ1bWVudHMnIHdsMTI3MSBzb2x1dGlvbi4KKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSBhIHdsMTI3MSBleHBhbnNpb24gY2FyZCBjb25uZWN0ZWQgdG8gdGhlCisJICBBTTE4eCBFVk0uCisKIGNvbmZpZyBHUElPX1BDQTk1M1gKIAlkZWZhdWx0IE1BQ0hfREFWSU5DSV9EQTg1MF9FVk0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL01ha2VmaWxlCmluZGV4IDBiODdhMWMuLjQ5NWUzMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiAKICMgQ29tbW9uIG9iamVjdHMKIG9iai15IAkJCTo9IHRpbWUubyBjbG9jay5vIHNlcmlhbC5vIGlvLm8gcHNjLm8gXAotCQkJICAgZ3Bpby5vIGRtYS5vIHVzYi5vIGNvbW1vbi5vIHNyYW0ubyBhZW1pZi5vCisJCQkgICBkbWEubyB1c2IubyBjb21tb24ubyBzcmFtLm8gYWVtaWYubwogCiBvYmotJChDT05GSUdfREFWSU5DSV9NVVgpCQkrPSBtdXgubwogCkBAIC0xNyw3ICsxNyw2IEBACiBvYmotJChDT05GSUdfQVJDSF9EQVZJTkNJX0RBODMwKSAgICAgICAgKz0gZGE4MzAubyBkZXZpY2VzLWRhOHh4Lm8KIG9iai0kKENPTkZJR19BUkNIX0RBVklOQ0lfREE4NTApICAgICAgICArPSBkYTg1MC5vIGRldmljZXMtZGE4eHgubwogb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSV9UTkVUVjEwN1gpICAgICs9IHRuZXR2MTA3eC5vIGRldmljZXMtdG5ldHYxMDd4Lm8KLW9iai0kKENPTkZJR19BUkNIX0RBVklOQ0lfVE5FVFYxMDdYKSAgICArPSBncGlvLXRuZXR2MTA3eC5vCiAKIG9iai0kKENPTkZJR19BSU5UQykJCQkrPSBpcnEubwogb2JqLSQoQ09ORklHX0NQX0lOVEMpCQkJKz0gY3BfaW50Yy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4MzAtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4MzAtZXZtLmMKaW5kZXggODRmZDc4Ni4uMTFjM2RiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODMwLWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTgzMC1ldm0uYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShkYTgzMF9ldm1fbmFuZF9wYXJ0aXRpb25zKSwKIAkuZWNjX21vZGUJPSBOQU5EX0VDQ19IVywKIAkuZWNjX2JpdHMJPSA0LAotCS5vcHRpb25zCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAkuYmJ0X3RkCQk9ICZkYTgzMF9ldm1fbmFuZF9iYnRfbWFpbl9kZXNjciwKIAkuYmJ0X21kCQk9ICZkYTgzMF9ldm1fbmFuZF9iYnRfbWlycm9yX2Rlc2NyLAogCS50aW1pbmcgICAgICAgICA9ICZkYTgzMF9ldm1fbmFuZGZsYXNoX3RpbWluZywKQEAgLTY3Niw3ICs2NzYsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERBVklOQ0lfREE4MzBfRVZNLCAiRGFWaW5jaSBEQTgzMC9PTUFQLUwxMzcvQU0xN3ggRVZNIikKLQkuYm9vdF9wYXJhbXMJPSAoREE4WFhfRERSX0JBU0UgKyAweDEwMCksCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBkYTgzMF9ldm1fbWFwX2lvLAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKaW5kZXggMDA4ZDUxNC4uMWQ3ZDI0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYwpAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3RwczY1MDd4LXRzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2wxMnh4Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTQ5LDYgKzUxLDkgQEAKICNkZWZpbmUgREE4NTBfTU1DU0RfQ0RfUElOCQlHUElPX1RPX1BJTig0LCAwKQogI2RlZmluZSBEQTg1MF9NTUNTRF9XUF9QSU4JCUdQSU9fVE9fUElOKDQsIDEpCiAKKyNkZWZpbmUgREE4NTBfV0xBTl9FTgkJCUdQSU9fVE9fUElOKDYsIDkpCisjZGVmaW5lIERBODUwX1dMQU5fSVJRCQkJR1BJT19UT19QSU4oNiwgMTApCisKICNkZWZpbmUgREE4NTBfTUlJX01ESU9fQ0xLRU5fUElOCUdQSU9fVE9fUElOKDIsIDYpCiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYTg1MGV2bV9zcGlmbGFzaF9wYXJ0W10gPSB7CkBAIC0yNTEsNyArMjU2LDcgQEAKIAkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGRhODUwX2V2bV9uYW5kZmxhc2hfcGFydGl0aW9uKSwKIAkuZWNjX21vZGUJPSBOQU5EX0VDQ19IVywKIAkuZWNjX2JpdHMJPSA0LAotCS5vcHRpb25zCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAkudGltaW5nCQk9ICZkYTg1MF9ldm1fbmFuZGZsYXNoX3RpbWluZywKIH07CiAKQEAgLTExNDMsNiArMTE0OCwxMTAgQEAKIHN0YXRpYyBfX2luaXQgaW50IGRhODUwX2V2bV9pbml0X2NwdWZyZXEodm9pZCkgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfREE4NTBfV0wxMlhYCisKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zZXRfcG93ZXIoaW50IGluZGV4LCBib29sIHBvd2VyX29uKQoreworCXN0YXRpYyBib29sIHBvd2VyX3N0YXRlOworCisJcHJfZGVidWcoIlBvd2VyaW5nICVzIHdsMTJ4eCIsIHBvd2VyX29uID8gIm9uIiA6ICJvZmYiKTsKKworCWlmIChwb3dlcl9vbiA9PSBwb3dlcl9zdGF0ZSkKKwkJcmV0dXJuOworCXBvd2VyX3N0YXRlID0gcG93ZXJfb247CisKKwlpZiAocG93ZXJfb24pIHsKKwkJLyogUG93ZXIgdXAgc2VxdWVuY2UgcmVxdWlyZWQgZm9yIHdsMTI3eCBkZXZpY2VzICovCisJCWdwaW9fc2V0X3ZhbHVlKERBODUwX1dMQU5fRU4sIDEpOworCQl1c2xlZXBfcmFuZ2UoMTUwMDAsIDE1MDAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoREE4NTBfV0xBTl9FTiwgMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoREE4NTBfV0xBTl9FTiwgMSk7CisJCW1zbGVlcCg3MCk7CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWUoREE4NTBfV0xBTl9FTiwgMCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRhdmluY2lfbW1jX2NvbmZpZyBkYTg1MF93bDEyeHhfbW1jX2NvbmZpZyA9IHsKKwkuc2V0X3Bvd2VyCT0gd2wxMnh4X3NldF9wb3dlciwKKwkud2lyZXMJCT0gNCwKKwkubWF4X2ZyZXEJPSAyNTAwMDAwMCwKKwkuY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8CisJCQkgIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQsCisJLnZlcnNpb24JPSBNTUNfQ1RMUl9WRVJTSU9OXzIsCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgZGE4NTBfd2wxMnh4X3BpbnNbXSBfX2luaXRjb25zdCA9IHsKKwlEQTg1MF9NTUNTRDFfREFUXzAsIERBODUwX01NQ1NEMV9EQVRfMSwgREE4NTBfTU1DU0QxX0RBVF8yLAorCURBODUwX01NQ1NEMV9EQVRfMywgREE4NTBfTU1DU0QxX0NMSywgREE4NTBfTU1DU0QxX0NNRCwKKwlEQTg1MF9HUElPNl85LCBEQTg1MF9HUElPNl8xMCwKKwktMQorfTsKKworc3RhdGljIHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSBkYTg1MF93bDEyeHhfd2xhbl9kYXRhIF9faW5pdGRhdGEgPSB7CisJLmlycQkJCT0gLTEsCisJLmJvYXJkX3JlZl9jbG9jawk9IFdMMTJYWF9SRUZDTE9DS18zOCwKKwkucGxhdGZvcm1fcXVpcmtzCT0gV0wxMlhYX1BMQVRGT1JNX1FVSVJLX0VER0VfSVJRLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgZGE4NTBfd2wxMnh4X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGF2aW5jaV9jZmdfcmVnX2xpc3QoZGE4NTBfd2wxMnh4X3BpbnMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJ3bDEyeHgvbW1jIG11eCBzZXR1cCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gZGE4NTBfcmVnaXN0ZXJfbW1jc2QxKCZkYTg1MF93bDEyeHhfbW1jX2NvbmZpZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIndsMTJ4eC9tbWMgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKERBODUwX1dMQU5fRU4sIEdQSU9GX09VVF9JTklUX0xPVywgIndsMTJ4eF9lbiIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgcmVxdWVzdCB3bDEyeHggZW5hYmxlIGdwaW86ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShEQTg1MF9XTEFOX0lSUSwgR1BJT0ZfSU4sICJ3bDEyeHhfaXJxIik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCByZXF1ZXN0IHdsMTJ4eCBpcnEgZ3BpbzogJWRcbiIsIHJldCk7CisJCWdvdG8gZnJlZV93bGFuX2VuOworCX0KKworCWRhODUwX3dsMTJ4eF93bGFuX2RhdGEuaXJxID0gZ3Bpb190b19pcnEoREE4NTBfV0xBTl9JUlEpOworCisJcmV0ID0gd2wxMnh4X3NldF9wbGF0Zm9ybV9kYXRhKCZkYTg1MF93bDEyeHhfd2xhbl9kYXRhKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ291bGQgbm90IHNldCB3bDEyeHggZGF0YTogJWRcbiIsIHJldCk7CisJCWdvdG8gZnJlZV93bGFuX2lycTsKKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV93bGFuX2lycToKKwlncGlvX2ZyZWUoREE4NTBfV0xBTl9JUlEpOworCitmcmVlX3dsYW5fZW46CisJZ3Bpb19mcmVlKERBODUwX1dMQU5fRU4pOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKKyNlbHNlIC8qIENPTkZJR19EQTg1MF9XTDEyWFggKi8KKworc3RhdGljIF9faW5pdCBpbnQgZGE4NTBfd2wxMnh4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19EQTg1MF9XTDEyWFggKi8KKwogI2RlZmluZSBEQTg1MEVWTV9TQVRBX1JFRkNMS1BOX1JBVEUJKDEwMCAqIDEwMDAgKiAxMDAwKQogCiBzdGF0aWMgX19pbml0IHZvaWQgZGE4NTBfZXZtX2luaXQodm9pZCkKQEAgLTExOTcsNiArMTMwNiwxMSBAQAogCQlpZiAocmV0KQogCQkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IG1tY3NkMCByZWdpc3RyYXRpb24gZmFpbGVkOiIKIAkJCQkJIiAlZFxuIiwgcmV0KTsKKworCQlyZXQgPSBkYTg1MF93bDEyeHhfaW5pdCgpOworCQlpZiAocmV0KQorCQkJcHJfd2FybmluZygiZGE4NTBfZXZtX2luaXQ6IHdsMTJ4eCBpbml0aWFsaXphdGlvbiIKKwkJCQkgICAiIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJfQogCiAJZGF2aW5jaV9zZXJpYWxfaW5pdCgmZGE4NTBfZXZtX3VhcnRfY29uZmlnKTsKQEAgLTEyOTEsNyArMTQwNSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoREFWSU5DSV9EQTg1MF9FVk0sICJEYVZpbmNpIERBODUwL09NQVAtTDEzOC9BTTE4eCBFVk0iKQotCS5ib290X3BhcmFtcwk9IChEQThYWF9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGRhODUwX2V2bV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gY3BfaW50Y19pbml0LAogCS50aW1lcgkJPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1ldm0uYwppbmRleCAyNDFhNmJkLi40ZTBlNzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJLnBhcnRzCQkJPSBkYXZpbmNpX25hbmRfcGFydGl0aW9ucywKIAkubnJfcGFydHMJCT0gQVJSQVlfU0laRShkYXZpbmNpX25hbmRfcGFydGl0aW9ucyksCiAJLmVjY19tb2RlCQk9IE5BTkRfRUNDX0hXLAotCS5vcHRpb25zCQk9IE5BTkRfVVNFX0ZMQVNIX0JCVCwKKwkuYmJ0X29wdGlvbnMJCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogCS5lY2NfYml0cwkJPSA0LAogfTsKIApAQCAtMzUxLDcgKzM1MSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoREFWSU5DSV9ETTM1NV9FVk0sICJEYVZpbmNpIERNMzU1IEVWTSIpCi0JLmJvb3RfcGFyYW1zICA9ICgweDgwMDAwMTAwKSwKKwkuYXRhZ19vZmZzZXQgID0gMHgxMDAsCiAJLm1hcF9pbwkgICAgICA9IGRtMzU1X2V2bV9tYXBfaW8sCiAJLmluaXRfaXJxICAgICA9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCSAgICAgID0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWxlb3BhcmQuYwppbmRleCBiZWUyODRjLi5mZjJkMjQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNTUtbGVvcGFyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1sZW9wYXJkLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAkucGFydHMJCQk9IGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwkJPSBBUlJBWV9TSVpFKGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zKSwKIAkuZWNjX21vZGUJCT0gTkFORF9FQ0NfSFdfU1lORFJPTUUsCi0JLm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwkJPSBOQU5EX0JCVF9VU0VfRkxBU0gsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhdmluY2lfbmFuZF9yZXNvdXJjZXNbXSA9IHsKQEAgLTI3MCw3ICsyNzAsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERNMzU1X0xFT1BBUkQsICJEYVZpbmNpIERNMzU1IGxlb3BhcmQiKQotCS5ib290X3BhcmFtcyAgPSAoMHg4MDAwMDEwMCksCisJLmF0YWdfb2Zmc2V0ICA9IDB4MTAwLAogCS5tYXBfaW8JICAgICAgPSBkbTM1NV9sZW9wYXJkX21hcF9pbywKIAkuaW5pdF9pcnEgICAgID0gZGF2aW5jaV9pcnFfaW5pdCwKIAkudGltZXIJICAgICAgPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwppbmRleCA5ODE4ZjIxLi4xOTE4YWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkucGFydHMJCQk9IGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwkJPSBBUlJBWV9TSVpFKGRhdmluY2lfbmFuZF9wYXJ0aXRpb25zKSwKIAkuZWNjX21vZGUJCT0gTkFORF9FQ0NfSFcsCi0JLm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwkJPSBOQU5EX0JCVF9VU0VfRkxBU0gsCiAJLmVjY19iaXRzCQk9IDQsCiB9OwogCkBAIC02MTIsNyArNjEyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0RNMzY1X0VWTSwgIkRhVmluY2kgRE0zNjUgRVZNIikKLQkuYm9vdF9wYXJhbXMJPSAoMHg4MDAwMDEwMCksCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBkbTM2NV9ldm1fbWFwX2lvLAogCS5pbml0X2lycQk9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ0eC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NHgtZXZtLmMKaW5kZXggOTU2MDdhMS4uMGNmOGFiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ0eC1ldm0uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDR4LWV2bS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS90dnA1MTR4Lmg+CiAKQEAgLTE1MCw3ICsxNTEsNyBAQAogCS5wYXJ0cwkJPSBkYXZpbmNpX2V2bV9uYW5kZmxhc2hfcGFydGl0aW9uLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZGF2aW5jaV9ldm1fbmFuZGZsYXNoX3BhcnRpdGlvbiksCiAJLmVjY19tb2RlCT0gTkFORF9FQ0NfSFcsCi0JLm9wdGlvbnMJPSBOQU5EX1VTRV9GTEFTSF9CQlQsCisJLmJidF9vcHRpb25zCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogCS50aW1pbmcJCT0gJmRhdmluY2lfZXZtX25hbmRmbGFzaF90aW1pbmcsCiB9OwogCkBAIC03MTIsNyArNzEzLDcgQEAKIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0VWTSwgIkRhVmluY2kgRE02NDR4IEVWTSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSA8c291cmNlQG12aXN0YS5jb20+ICovCi0JLmJvb3RfcGFyYW1zICA9IChEQVZJTkNJX0REUl9CQVNFICsgMHgxMDApLAorCS5hdGFnX29mZnNldCAgPSAweDEwMCwKIAkubWFwX2lvCSAgICAgID0gZGF2aW5jaV9ldm1fbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lcgkgICAgICA9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMKaW5kZXggOTkzYTMxNDYuLmU1NzRkN2Y4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTc5Miw3ICs3OTMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERBVklOQ0lfRE02NDY3X0VWTSwgIkRhVmluY2kgRE02NDZ4IEVWTSIpCi0JLmJvb3RfcGFyYW1zICA9ICgweDgwMDAwMTAwKSwKKwkuYXRhZ19vZmZzZXQgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICA9IGRhdmluY2lfbWFwX2lvLAogCS5pbml0X2lycSAgICAgPSBkYXZpbmNpX2lycV9pbml0LAogCS50aW1lciAgICAgICAgPSAmZGF2aW5jaV90aW1lciwKQEAgLTgwMSw3ICs4MDIsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChEQVZJTkNJX0RNNjQ2N1RFVk0sICJEYVZpbmNpIERNNjQ2N1QgRVZNIikKLQkuYm9vdF9wYXJhbXMgID0gKDB4ODAwMDAxMDApLAorCS5hdGFnX29mZnNldCAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgID0gZGF2aW5jaV9tYXBfaW8sCiAJLmluaXRfaXJxICAgICA9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyICAgICAgICA9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW1pdHlvbWFwbDEzOC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW1pdHlvbWFwbDEzOC5jCmluZGV4IGMyNzgyMjYuLjNjZmZmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1taXR5b21hcGwxMzguYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbWl0eW9tYXBsMTM4LmMKQEAgLTM5Niw3ICszOTYsOCBAQAogCS5wYXJ0cwkJPSBtaXR5b21hcGwxMzhfbmFuZGZsYXNoX3BhcnRpdGlvbiwKIAkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG1pdHlvbWFwbDEzOF9uYW5kZmxhc2hfcGFydGl0aW9uKSwKIAkuZWNjX21vZGUJPSBOQU5EX0VDQ19IVywKLQkub3B0aW9ucwk9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfQlVTV0lEVEhfMTYsCisJLmJidF9vcHRpb25zCT0gTkFORF9CQlRfVVNFX0ZMQVNILAorCS5vcHRpb25zCT0gTkFORF9CVVNXSURUSF8xNiwKIAkuZWNjX2JpdHMJPSAxLCAvKiA0IGJpdCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCAxNiBiaXQgTkFORCAqLwogfTsKIApAQCAtNTY2LDcgKzU2Nyw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTUlUWU9NQVBMMTM4LCAiTWl0eURTUC1MMTM4L01pdHlBUk0tMTgwOCIpCi0JLmJvb3RfcGFyYW1zCT0gKERBOFhYX0REUl9CQVNFICsgMHgxMDApLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbWl0eW9tYXBsMTM4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBjcF9pbnRjX2luaXQsCiAJLnRpbWVyCQk9ICZkYXZpbmNpX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW5ldXJvcy1vc2QyLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbmV1cm9zLW9zZDIuYwppbmRleCBkNjBhODAwLi5lNWYyMzFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbmV1cm9zLW9zZDIuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtbmV1cm9zLW9zZDIuYwpAQCAtODcsNyArODcsNyBAQAogCS5wYXJ0cwkJPSBkYXZpbmNpX250b3NkMl9uYW5kZmxhc2hfcGFydGl0aW9uLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZGF2aW5jaV9udG9zZDJfbmFuZGZsYXNoX3BhcnRpdGlvbiksCiAJLmVjY19tb2RlCT0gTkFORF9FQ0NfSFcsCi0JLm9wdGlvbnMJPSBOQU5EX1VTRV9GTEFTSF9CQlQsCisJLmJidF9vcHRpb25zCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXZpbmNpX250b3NkMl9uYW5kZmxhc2hfcmVzb3VyY2VbXSA9IHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogCiBNQUNISU5FX1NUQVJUKE5FVVJPU19PU0QyLCAiTmV1cm9zIE9TRDIiKQogCS8qIE1haW50YWluZXI6IE5ldXJvcyBUZWNobm9sb2dpZXMgPG5ldXJvc0Bncm91cHMuZ29vZ2xlLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAoREFWSU5DSV9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQkgPSBkYXZpbmNpX250b3NkMl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZGF2aW5jaV9pcnFfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtb21hcGwxMzgtaGF3ay5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLW9tYXBsMTM4LWhhd2suYwppbmRleCAyMzczMzJhLi5jNjcwMWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtb21hcGwxMzgtaGF3ay5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1vbWFwbDEzOC1oYXdrLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBMMTM4X0hBV0tCT0FSRCwgIkFNMTh4L09NQVAtTDEzOCBIYXdrYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IChEQThYWF9ERFJfQkFTRSArIDB4MTAwKSwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG9tYXBsMTM4X2hhd2tfbWFwX2lvLAogCS5pbml0X2lycQk9IGNwX2ludGNfaW5pdCwKIAkudGltZXIJCT0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtc2Zmc2RyLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtc2Zmc2RyLmMKaW5kZXggNWY0Mzg1Yy4uNWRkNGRhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXNmZnNkci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1zZmZzZHIuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU0ZGU0RSLCAiTHlydGVjaCBTRkZTRFIiKQogCS8qIE1haW50YWluZXI6IEh1Z28gVmlsbGVuZXV2ZSBodWdvLnZpbGxlbmV1dmVAbHlydGVjaC5jb20gKi8KLQkuYm9vdF9wYXJhbXMgID0gKERBVklOQ0lfRERSX0JBU0UgKyAweDEwMCksCisJLmF0YWdfb2Zmc2V0ICA9IDB4MTAwLAogCS5tYXBfaW8JICAgICAgPSBkYXZpbmNpX3NmZnNkcl9tYXBfaW8sCiAJLmluaXRfaXJxICAgICA9IGRhdmluY2lfaXJxX2luaXQsCiAJLnRpbWVyCSAgICAgID0gJmRhdmluY2lfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtdG5ldHYxMDd4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLXRuZXR2MTA3eC1ldm0uYwppbmRleCA3ODI4OTIwLi5mNjllNDBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtdG5ldHYxMDd4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC10bmV0djEwN3gtZXZtLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCS5wYXJ0cwkJPSBuYW5kX3BhcnRpdGlvbnMsCiAJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShuYW5kX3BhcnRpdGlvbnMpLAogCS5lY2NfbW9kZQk9IE5BTkRfRUNDX0hXLAotCS5vcHRpb25zCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCS5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSCwKIAkuZWNjX2JpdHMJPSAxLAogfTsKIApAQCAtMjc3LDcgKzI3Nyw3IEBACiAjZW5kaWYKIAogTUFDSElORV9TVEFSVChUTkVUVjEwN1gsICJUTkVUVjEwN1ggRVZNIikKLQkuYm9vdF9wYXJhbXMJPSAoVE5FVFYxMDdYX0REUl9CQVNFICsgMHgxMDApLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdG5ldHYxMDd4X2luaXQsCiAJLmluaXRfaXJxCT0gY3BfaW50Y19pbml0LAogCS50aW1lcgkJPSAmZGF2aW5jaV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jZGNlOTQ5LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY2RjZTk0OS5jCmluZGV4IGJhOGIxMmIuLmYyMjMyY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jZGNlOTQ5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NkY2U5NDkuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvY2RjZTk0OS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NvbW1vbi5jCmluZGV4IDFkMjU1NzMuLjg2NWZmZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY29tbW9uLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGF2aW5jaV9lbWFjLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTg2LDYgKzg3LDggQEAKIAkJaW90YWJsZV9pbml0KGRhdmluY2lfc29jX2luZm8uaW9fZGVzYywKIAkJCQlkYXZpbmNpX3NvY19pbmZvLmlvX2Rlc2NfbnVtKTsKIAorCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNCA8PCAyMCk7CisKIAkvKgogCSAqIE5vcm1hbGx5IGRldmljZW1hcHNfaW5pdCgpIHdvdWxkIGZsdXNoIGNhY2hlcyBhbmQgdGxiIGFmdGVyCiAJICogbWRlc2MtPm1hcF9pbygpLCBidXQgd2UgbXVzdCBhbHNvIGRvIGl0IGhlcmUgYmVjYXVzZSBvZiB0aGUgQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWZyZXEuYwppbmRleCA0MTY2OWVjLi41YmJhNzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1ZnJlcS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVmcmVxLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2NwdWZyZXEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1aWRsZS5jCmluZGV4IGJkNTlmMzEuLmEzMGM3YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWlkbGUuYwpAQCAtMTYsMTAgKzE2LDExIEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CiAKICNpbmNsdWRlIDxtYWNoL2NwdWlkbGUuaD4KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgorI2luY2x1ZGUgPG1hY2gvZGRyMi5oPgogCiAjZGVmaW5lIERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTCTIKIApAQCAtNzgsOSArNzksMTEgQEAKIAogLyogQWN0dWFsIGNvZGUgdGhhdCBwdXRzIHRoZSBTb0MgaW4gZGlmZmVyZW50IGlkbGUgc3RhdGVzICovCiBzdGF0aWMgaW50IGRhdmluY2lfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQkJCWludCBpbmRleCkKIHsKLQlzdHJ1Y3QgZGF2aW5jaV9vcHMgKm9wcyA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XTsKKwlzdHJ1Y3QgZGF2aW5jaV9vcHMgKm9wcyA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZV91c2FnZSk7CiAJc3RydWN0IHRpbWV2YWwgYmVmb3JlLCBhZnRlcjsKIAlpbnQgaWRsZV90aW1lOwogCkBAIC05OCwxMyArMTAxLDE3IEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWlkbGVfdGltZSA9IChhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjKSAqIFVTRUNfUEVSX1NFQyArCiAJCQkoYWZ0ZXIudHZfdXNlYyAtIGJlZm9yZS50dl91c2VjKTsKLQlyZXR1cm4gaWRsZV90aW1lOworCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IGlkbGVfdGltZTsKKworCXJldHVybiBpbmRleDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9jcHVpZGxlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRyaXZlciA9ICZkYXZpbmNpX2lkbGVfZHJpdmVyOwogCXN0cnVjdCBkYXZpbmNpX2NwdWlkbGVfY29uZmlnICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJZGV2aWNlID0gJnBlcl9jcHUoZGF2aW5jaV9jcHVpZGxlX2RldmljZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKQEAgLTExNiwzMyArMTIzLDM0IEBACiAKIAlkZHIyX3JlZ19iYXNlID0gcGRhdGEtPmRkcjJfY3Rscl9iYXNlOwogCisJLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCisJZHJpdmVyLT5zdGF0ZXNbMF0uZW50ZXIgPSBkYXZpbmNpX2VudGVyX2lkbGU7CisJZHJpdmVyLT5zdGF0ZXNbMF0uZXhpdF9sYXRlbmN5ID0gMTsKKwlkcml2ZXItPnN0YXRlc1swXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7CisJZHJpdmVyLT5zdGF0ZXNbMF0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMF0ubmFtZSwgIldGSSIpOworCXN0cmNweShkcml2ZXItPnN0YXRlc1swXS5kZXNjLCAiV2FpdCBmb3IgaW50ZXJydXB0Iik7CisKKwkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgYW5kIEREUiBzZWxmIHJlZnJlc2ggc3RhdGUgKi8KKwlkcml2ZXItPnN0YXRlc1sxXS5lbnRlciA9IGRhdmluY2lfZW50ZXJfaWRsZTsKKwlkcml2ZXItPnN0YXRlc1sxXS5leGl0X2xhdGVuY3kgPSAxMDsKKwlkcml2ZXItPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7CisJZHJpdmVyLT5zdGF0ZXNbMV0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKKwlzdHJjcHkoZHJpdmVyLT5zdGF0ZXNbMV0ubmFtZSwgIkREUiBTUiIpOworCXN0cmNweShkcml2ZXItPnN0YXRlc1sxXS5kZXNjLCAiV0ZJIGFuZCBERFIgU2VsZiBSZWZyZXNoIik7CisJaWYgKHBkYXRhLT5kZHIyX3Bkb3duKQorCQlkYXZpbmNpX3N0YXRlc1sxXS5mbGFncyB8PSBEQVZJTkNJX0NQVUlETEVfRkxBR1NfRERSMl9QV0ROOworCWNwdWlkbGVfc2V0X3N0YXRlZGF0YSgmZGV2aWNlLT5zdGF0ZXNfdXNhZ2VbMV0sICZkYXZpbmNpX3N0YXRlc1sxXSk7CisKKwlkZXZpY2UtPnN0YXRlX2NvdW50ID0gREFWSU5DSV9DUFVJRExFX01BWF9TVEFURVM7CisJZHJpdmVyLT5zdGF0ZV9jb3VudCA9IERBVklOQ0lfQ1BVSURMRV9NQVhfU1RBVEVTOworCiAJcmV0ID0gY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmRhdmluY2lfaWRsZV9kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCi0JZGV2aWNlLT5zdGF0ZXNbMF0uZW50ZXIgPSBkYXZpbmNpX2VudGVyX2lkbGU7Ci0JZGV2aWNlLT5zdGF0ZXNbMF0uZXhpdF9sYXRlbmN5ID0gMTsKLQlkZXZpY2UtPnN0YXRlc1swXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7Ci0JZGV2aWNlLT5zdGF0ZXNbMF0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMF0ubmFtZSwgIldGSSIpOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1swXS5kZXNjLCAiV2FpdCBmb3IgaW50ZXJydXB0Iik7Ci0KLQkvKiBXYWl0IGZvciBpbnRlcnJ1cHQgYW5kIEREUiBzZWxmIHJlZnJlc2ggc3RhdGUgKi8KLQlkZXZpY2UtPnN0YXRlc1sxXS5lbnRlciA9IGRhdmluY2lfZW50ZXJfaWRsZTsKLQlkZXZpY2UtPnN0YXRlc1sxXS5leGl0X2xhdGVuY3kgPSAxMDsKLQlkZXZpY2UtPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0ubmFtZSwgIkREUiBTUiIpOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1sxXS5kZXNjLCAiV0ZJIGFuZCBERFIgU2VsZiBSZWZyZXNoIik7Ci0JaWYgKHBkYXRhLT5kZHIyX3Bkb3duKQotCQlkYXZpbmNpX3N0YXRlc1sxXS5mbGFncyB8PSBEQVZJTkNJX0NQVUlETEVfRkxBR1NfRERSMl9QV0ROOwotCWNwdWlkbGVfc2V0X3N0YXRlZGF0YSgmZGV2aWNlLT5zdGF0ZXNbMV0sICZkYXZpbmNpX3N0YXRlc1sxXSk7Ci0KLQlkZXZpY2UtPnN0YXRlX2NvdW50ID0gREFWSU5DSV9DUFVJRExFX01BWF9TVEFURVM7Ci0KIAlyZXQgPSBjcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXZpY2UpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4MzAuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTgzMC5jCmluZGV4IDJlZDJmODIuLmE2YmY1ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTgzMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kYTgzMC5jCkBAIC04LDYgKzgsNyBAQAogICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCiAgKiBvciBpbXBsaWVkLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIApAQCAtMTksNyArMjAsNyBAQAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bWFjaC9kYTh4eC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1kYXZpbmNpLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgIm11eC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RhODUwLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4NTAuYwppbmRleCA5MzVkYmVkLi5iMDQ3Zjg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4NTAuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGE4NTAuYwpAQCAtMTEsNiArMTEsNyBAQAogICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCiAgKiBvciBpbXBsaWVkLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTI3LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL2RhOHh4Lmg+CiAjaW5jbHVkZSA8bWFjaC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bWFjaC9wbS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1kYXZpbmNpLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgIm11eC5oIgpAQCAtNTM1LDYgKzUzNiwxMyBAQAogCU1VWF9DRkcoREE4NTAsIE1NQ1NEMF9EQVRfMywJMTAsCTIwLAkxNSwJMiwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgTU1DU0QwX0NMSywJMTAsCTAsCTE1LAkyLAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBNTUNTRDBfQ01ELAkxMCwJNCwJMTUsCTIsCWZhbHNlKQorCS8qIE1NQy9TRDEgZnVuY3Rpb24gKi8KKwlNVVhfQ0ZHKERBODUwLCBNTUNTRDFfREFUXzAsCTE4LAk4LAkxNSwJMiwJZmFsc2UpCisJTVVYX0NGRyhEQTg1MCwgTU1DU0QxX0RBVF8xLAkxOSwJMTYsCTE1LAkyLAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBNTUNTRDFfREFUXzIsCTE5LAkxMiwJMTUsCTIsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIE1NQ1NEMV9EQVRfMywJMTksCTgsCTE1LAkyLAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBNTUNTRDFfQ0xLLAkxOCwJMTIsCTE1LAkyLAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBNTUNTRDFfQ01ELAkxOCwJMTYsCTE1LAkyLAlmYWxzZSkKIAkvKiBFTUlGMi41L0VNSUZBIGZ1bmN0aW9uICovCiAJTVVYX0NGRyhEQTg1MCwgRU1BX0RfNywJCTksCTAsCTE1LAkxLAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBFTUFfRF82LAkJOSwJNCwJMTUsCTEsCWZhbHNlKQpAQCAtNTkzLDYgKzYwMSw4IEBACiAJTVVYX0NGRyhEQTg1MCwgR1BJTzNfMTMsCTcsCTgsCTE1LAk4LAlmYWxzZSkKIAlNVVhfQ0ZHKERBODUwLCBHUElPNF8wLAkJMTAsCTI4LAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgR1BJTzRfMSwJCTEwLAkyNCwJMTUsCTgsCWZhbHNlKQorCU1VWF9DRkcoREE4NTAsIEdQSU82XzksCQkxMywJMjQsCTE1LAk4LAlmYWxzZSkKKwlNVVhfQ0ZHKERBODUwLCBHUElPNl8xMCwJMTMsCTIwLAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgR1BJTzZfMTMsCTEzLAk4LAkxNSwJOCwJZmFsc2UpCiAJTVVYX0NGRyhEQTg1MCwgUlRDX0FMQVJNLAkwLAkyOCwJMTUsCTIsCWZhbHNlKQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMtZGE4eHguYwppbmRleCAyZjdlNzE5Li42OGRlZjcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy1kYTh4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLWRhOHh4LmMKQEAgLTEzNiw2ICsxMzYsNyBAQAogCS5uX2NjCQkJPSAxLAogCS5xdWV1ZV90Y19tYXBwaW5nCT0gZGE4eHhfcXVldWVfdGNfbWFwcGluZywKIAkucXVldWVfcHJpb3JpdHlfbWFwcGluZwk9IGRhOHh4X3F1ZXVlX3ByaW9yaXR5X21hcHBpbmcsCisJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVkbWFfc29jX2luZm8gKmRhODMwX2VkbWFfaW5mb1tFRE1BX01BWF9DQ10gPSB7CkBAIC0xNTEsNiArMTUyLDcgQEAKIAkJLm5fY2MJCQk9IDEsCiAJCS5xdWV1ZV90Y19tYXBwaW5nCT0gZGE4eHhfcXVldWVfdGNfbWFwcGluZywKIAkJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBkYTh4eF9xdWV1ZV9wcmlvcml0eV9tYXBwaW5nLAorCQkuZGVmYXVsdF9xdWV1ZQkJPSBFVkVOVFFfMSwKIAl9LAogCXsKIAkJLm5fY2hhbm5lbAkJPSAzMiwKQEAgLTE2MCw2ICsxNjIsNyBAQAogCQkubl9jYwkJCT0gMSwKIAkJLnF1ZXVlX3RjX21hcHBpbmcJPSBkYTg1MF9xdWV1ZV90Y19tYXBwaW5nLAogCQkucXVldWVfcHJpb3JpdHlfbWFwcGluZwk9IGRhODUwX3F1ZXVlX3ByaW9yaXR5X21hcHBpbmcsCisJCS5kZWZhdWx0X3F1ZXVlCQk9IEVWRU5UUV8wLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy10bmV0djEwN3guYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLXRuZXR2MTA3eC5jCmluZGV4IDYxNjJjYWUuLjI5YjE3ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLXRuZXR2MTA3eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLXRuZXR2MTA3eC5jCkBAIC04MCw2ICs4MCw3IEBACiAJLm5fY2MJCQk9IDEsCiAJLnF1ZXVlX3RjX21hcHBpbmcJPSBlZG1hX3RjX21hcHBpbmcsCiAJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBlZG1hX3ByaW9yaXR5X21hcHBpbmcsCisJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVkbWFfc29jX2luZm8gKnRuZXR2MTA3eF9lZG1hX2luZm9bRURNQV9NQVhfQ0NdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtMzU1LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNTUuYwppbmRleCBhM2E5NGU5Li5mZTUyMGQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNTUuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNTUuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKQEAgLTMwLDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvYXNwLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGkuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKQEAgLTU5MSw2ICs1OTEsNyBAQAogCS5uX2NjCQkJPSAxLAogCS5xdWV1ZV90Y19tYXBwaW5nCT0gcXVldWVfdGNfbWFwcGluZywKIAkucXVldWVfcHJpb3JpdHlfbWFwcGluZwk9IHF1ZXVlX3ByaW9yaXR5X21hcHBpbmcsCisJLmRlZmF1bHRfcXVldWUJCT0gRVZFTlRRXzEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGVkbWFfc29jX2luZm8gKmRtMzU1X2VkbWFfaW5mb1tFRE1BX01BWF9DQ10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG0zNjUuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM2NS5jCmluZGV4IDQ2MDRlNzIuLjY3OWUxNjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM2NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTM2NS5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTM0LDcgKzMzLDcgQEAKICNpbmNsdWRlIDxtYWNoL2FzcC5oPgogI2luY2x1ZGUgPG1hY2gva2V5c2Nhbi5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+Ci0KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NHguYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NHguYwppbmRleCA0YzgyYzI3Li4zNDcwOTgzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDR4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ0eC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIApAQCAtMjYsNiArMjUsNyBAQAogI2luY2x1ZGUgPG1hY2gvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2FzcC5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1kYXZpbmNpLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgIm11eC5oIgpAQCAtNTE0LDYgKzUxNCw3IEBACiAJLm5fY2MJCQk9IDEsCiAJLnF1ZXVlX3RjX21hcHBpbmcJPSBxdWV1ZV90Y19tYXBwaW5nLAogCS5xdWV1ZV9wcmlvcml0eV9tYXBwaW5nCT0gcXVldWVfcHJpb3JpdHlfbWFwcGluZywKKwkuZGVmYXVsdF9xdWV1ZQkJPSBFVkVOVFFfMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZWRtYV9zb2NfaW5mbyAqZG02NDR4X2VkbWFfaW5mb1tFRE1BX01BWF9DQ10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMKaW5kZXggMTgwMmU3MS4uMGI2OGVkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKQEAgLTI3LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9hc3AuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKQEAgLTU1NSw2ICs1NTUsNyBAQAogCS5uX2NjCQkJPSAxLAogCS5xdWV1ZV90Y19tYXBwaW5nCT0gZG02NDZ4X3F1ZXVlX3RjX21hcHBpbmcsCiAJLnF1ZXVlX3ByaW9yaXR5X21hcHBpbmcJPSBkbTY0NnhfcXVldWVfcHJpb3JpdHlfbWFwcGluZywKKwkuZGVmYXVsdF9xdWV1ZQkJPSBFVkVOVFFfMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZWRtYV9zb2NfaW5mbyAqZG02NDZ4X2VkbWFfaW5mb1tFRE1BX01BWF9DQ10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG1hLmMKaW5kZXggNmI5NjY5OC4uZGE5MDEwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbWEuYwpAQCAtMTQzNSwxMiArMTQzNSwxMSBAQAogCQkJZ290byBmYWlsMTsKIAkJfQogCi0JCWVkbWFfY2Nbal0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWRtYSksIEdGUF9LRVJORUwpOworCQllZG1hX2NjW2pdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVkbWEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFlZG1hX2NjW2pdKSB7CiAJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsMTsKIAkJfQotCQltZW1zZXQoZWRtYV9jY1tqXSwgMCwgc2l6ZW9mKHN0cnVjdCBlZG1hKSk7CiAKIAkJZWRtYV9jY1tqXS0+bnVtX2NoYW5uZWxzID0gbWluX3QodW5zaWduZWQsIGluZm9bal0tPm5fY2hhbm5lbCwKIAkJCQkJCQlFRE1BX01BWF9ETUFDSCk7CkBAIC0xNDUwLDggKzE0NDksNiBAQAogCQkJCQkJCUVETUFfTUFYX0NDKTsKIAogCQllZG1hX2NjW2pdLT5kZWZhdWx0X3F1ZXVlID0gaW5mb1tqXS0+ZGVmYXVsdF9xdWV1ZTsKLQkJaWYgKCFlZG1hX2NjW2pdLT5kZWZhdWx0X3F1ZXVlKQotCQkJZWRtYV9jY1tqXS0+ZGVmYXVsdF9xdWV1ZSA9IEVWRU5UUV8xOwogCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgIkRNQSBSRUcgQkFTRSBBRERSPSVwXG4iLAogCQkJZWRtYWNjX3JlZ3NfYmFzZVtqXSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmYmUxMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qCi0gKiBUSSBEYVZpbmNpIEdQSU8gU3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IERhdmlkIEJyb3duZWxsCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+Ci0KLXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyB7Ci0JdTMyCWRpcjsKLQl1MzIJb3V0X2RhdGE7Ci0JdTMyCXNldF9kYXRhOwotCXUzMgljbHJfZGF0YTsKLQl1MzIJaW5fZGF0YTsKLQl1MzIJc2V0X3Jpc2luZzsKLQl1MzIJY2xyX3Jpc2luZzsKLQl1MzIJc2V0X2ZhbGxpbmc7Ci0JdTMyCWNscl9mYWxsaW5nOwotCXUzMglpbnRzdGF0OwotfTsKLQotI2RlZmluZSBjaGlwMmNvbnRyb2xsZXIoY2hpcCkJXAotCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIsIGNoaXApCi0KLXN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgY2hpcHNbRElWX1JPVU5EX1VQKERBVklOQ0lfTl9HUElPLCAzMildOwotc3RhdGljIHZvaWQgX19pb21lbSAqZ3Bpb19iYXNlOwotCi1zdGF0aWMgc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gX19pbml0ICpncGlvMnJlZ3ModW5zaWduZWQgZ3BpbykKLXsKLQl2b2lkIF9faW9tZW0gKnB0cjsKLQotCWlmIChncGlvIDwgMzIgKiAxKQotCQlwdHIgPSBncGlvX2Jhc2UgKyAweDEwOwotCWVsc2UgaWYgKGdwaW8gPCAzMiAqIDIpCi0JCXB0ciA9IGdwaW9fYmFzZSArIDB4Mzg7Ci0JZWxzZSBpZiAoZ3BpbyA8IDMyICogMykKLQkJcHRyID0gZ3Bpb19iYXNlICsgMHg2MDsKLQllbHNlIGlmIChncGlvIDwgMzIgKiA0KQotCQlwdHIgPSBncGlvX2Jhc2UgKyAweDg4OwotCWVsc2UgaWYgKGdwaW8gPCAzMiAqIDUpCi0JCXB0ciA9IGdwaW9fYmFzZSArIDB4YjA7Ci0JZWxzZQotCQlwdHIgPSBOVUxMOwotCXJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmlycTJyZWdzKGludCBpcnEpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmc7Ci0KLQlnID0gKF9fZm9yY2Ugc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKilpcnFfZ2V0X2NoaXBfZGF0YShpcnEpOwotCi0JcmV0dXJuIGc7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfZ3Bpb19pcnFfc2V0dXAodm9pZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBib2FyZCBzZXR1cCBjb2RlICpNVVNUKiBzZXR1cCBwaW5tdXggYW5kIGVuYWJsZSB0aGUgR1BJTyBjbG9jay4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZGF2aW5jaV9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCXVuc2lnbmVkIG9mZnNldCwgYm9vbCBvdXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQgPSBjaGlwMmNvbnRyb2xsZXIoY2hpcCk7Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBkLT5yZWdzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHRlbXA7Ci0JdTMyIG1hc2sgPSAxIDw8IG9mZnNldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7Ci0JdGVtcCA9IF9fcmF3X3JlYWRsKCZnLT5kaXIpOwotCWlmIChvdXQpIHsKLQkJdGVtcCAmPSB+bWFzazsKLQkJX19yYXdfd3JpdGVsKG1hc2ssIHZhbHVlID8gJmctPnNldF9kYXRhIDogJmctPmNscl9kYXRhKTsKLQl9IGVsc2UgewotCQl0ZW1wIHw9IG1hc2s7Ci0JfQotCV9fcmF3X3dyaXRlbCh0ZW1wLCAmZy0+ZGlyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkYXZpbmNpX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIF9fZGF2aW5jaV9kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCBmYWxzZSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRhdmluY2lfZGlyZWN0aW9uX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlyZXR1cm4gX19kYXZpbmNpX2RpcmVjdGlvbihjaGlwLCBvZmZzZXQsIHRydWUsIHZhbHVlKTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIHBpbidzIHZhbHVlICh3b3JrcyBldmVuIGlmIGl0J3Mgc2V0IHVwIGFzIG91dHB1dCk7Ci0gKiByZXR1cm5zIHplcm8vbm9uemVyby4KLSAqCi0gKiBOb3RlIHRoYXQgY2hhbmdlcyBhcmUgc3luY2hlZCB0byB0aGUgR1BJTyBjbG9jaywgc28gcmVhZGluZyB2YWx1ZXMgYmFjawotICogcmlnaHQgYWZ0ZXIgeW91J3ZlIHNldCB0aGVtIG1heSBnaXZlIG9sZCB2YWx1ZXMuCi0gKi8KLXN0YXRpYyBpbnQgZGF2aW5jaV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkID0gY2hpcDJjb250cm9sbGVyKGNoaXApOwotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gZC0+cmVnczsKLQotCXJldHVybiAoMSA8PCBvZmZzZXQpICYgX19yYXdfcmVhZGwoJmctPmluX2RhdGEpOwotfQotCi0vKgotICogQXNzdW1pbmcgdGhlIHBpbiBpcyBtdXhlZCBhcyBhIGdwaW8gb3V0cHV0LCBzZXQgaXRzIG91dHB1dCB2YWx1ZS4KLSAqLwotc3RhdGljIHZvaWQKLWRhdmluY2lfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpkID0gY2hpcDJjb250cm9sbGVyKGNoaXApOwotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gZC0+cmVnczsKLQotCV9fcmF3X3dyaXRlbCgoMSA8PCBvZmZzZXQpLCB2YWx1ZSA/ICZnLT5zZXRfZGF0YSA6ICZnLT5jbHJfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfZ3Bpb19zZXR1cCh2b2lkKQotewotCWludCBpLCBiYXNlOwotCXVuc2lnbmVkIG5ncGlvOwotCXN0cnVjdCBkYXZpbmNpX3NvY19pbmZvICpzb2NfaW5mbyA9ICZkYXZpbmNpX3NvY19pbmZvOwotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyAqcmVnczsKLQotCWlmIChzb2NfaW5mby0+Z3Bpb190eXBlICE9IEdQSU9fVFlQRV9EQVZJTkNJKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogVGhlIGdwaW8gYmFua3MgY29uY2VwdHVhbGx5IGV4cG9zZSBhIHNlZ21lbnRlZCBiaXRtYXAsCi0JICogYW5kICJuZ3BpbyIgaXMgb25lIG1vcmUgdGhhbiB0aGUgbGFyZ2VzdCB6ZXJvLWJhc2VkCi0JICogYml0IGluZGV4IHRoYXQncyB2YWxpZC4KLQkgKi8KLQluZ3BpbyA9IHNvY19pbmZvLT5ncGlvX251bTsKLQlpZiAobmdwaW8gPT0gMCkgewotCQlwcl9lcnIoIkdQSU8gc2V0dXA6ICBob3cgbWFueSBHUElPcz9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoV0FSTl9PTihEQVZJTkNJX05fR1BJTyA8IG5ncGlvKSkKLQkJbmdwaW8gPSBEQVZJTkNJX05fR1BJTzsKLQotCWdwaW9fYmFzZSA9IGlvcmVtYXAoc29jX2luZm8tPmdwaW9fYmFzZSwgU1pfNEspOwotCWlmIChXQVJOX09OKCFncGlvX2Jhc2UpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDAsIGJhc2UgPSAwOyBiYXNlIDwgbmdwaW87IGkrKywgYmFzZSArPSAzMikgewotCQljaGlwc1tpXS5jaGlwLmxhYmVsID0gIkRhVmluY2kiOwotCi0JCWNoaXBzW2ldLmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gZGF2aW5jaV9kaXJlY3Rpb25faW47Ci0JCWNoaXBzW2ldLmNoaXAuZ2V0ID0gZGF2aW5jaV9ncGlvX2dldDsKLQkJY2hpcHNbaV0uY2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gZGF2aW5jaV9kaXJlY3Rpb25fb3V0OwotCQljaGlwc1tpXS5jaGlwLnNldCA9IGRhdmluY2lfZ3Bpb19zZXQ7Ci0KLQkJY2hpcHNbaV0uY2hpcC5iYXNlID0gYmFzZTsKLQkJY2hpcHNbaV0uY2hpcC5uZ3BpbyA9IG5ncGlvIC0gYmFzZTsKLQkJaWYgKGNoaXBzW2ldLmNoaXAubmdwaW8gPiAzMikKLQkJCWNoaXBzW2ldLmNoaXAubmdwaW8gPSAzMjsKLQotCQlzcGluX2xvY2tfaW5pdCgmY2hpcHNbaV0ubG9jayk7Ci0KLQkJcmVncyA9IGdwaW8ycmVncyhiYXNlKTsKLQkJY2hpcHNbaV0ucmVncyA9IHJlZ3M7Ci0JCWNoaXBzW2ldLnNldF9kYXRhID0gJnJlZ3MtPnNldF9kYXRhOwotCQljaGlwc1tpXS5jbHJfZGF0YSA9ICZyZWdzLT5jbHJfZGF0YTsKLQkJY2hpcHNbaV0uaW5fZGF0YSA9ICZyZWdzLT5pbl9kYXRhOwotCi0JCWdwaW9jaGlwX2FkZCgmY2hpcHNbaV0uY2hpcCk7Ci0JfQotCi0Jc29jX2luZm8tPmdwaW9fY3RscnMgPSBjaGlwczsKLQlzb2NfaW5mby0+Z3Bpb19jdGxyc19udW0gPSBESVZfUk9VTkRfVVAobmdwaW8sIDMyKTsKLQotCWRhdmluY2lfZ3Bpb19pcnFfc2V0dXAoKTsKLQlyZXR1cm4gMDsKLX0KLXB1cmVfaW5pdGNhbGwoZGF2aW5jaV9ncGlvX3NldHVwKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogV2UgZXhwZWN0IGlycXMgd2lsbCBub3JtYWxseSBiZSBzZXQgdXAgYXMgaW5wdXQgcGlucywgYnV0IHRoZXkgY2FuIGFsc28gYmUKLSAqIHVzZWQgYXMgb3V0cHV0IHBpbnMgLi4uIHdoaWNoIGlzIGNvbnZlbmllbnQgZm9yIHRlc3RpbmcuCi0gKgotICogTk9URTogIFRoZSBmaXJzdCBmZXcgR1BJT3MgYWxzbyBoYXZlIGRpcmVjdCBJTlRDIGhvb2t1cHMgaW4gYWRkaXRpb24KLSAqIHRvIHRoZWlyIEdQSU9CTkswIGlycSwgd2l0aCBhIGJpdCBsZXNzIG92ZXJoZWFkLgotICoKLSAqIEFsbCB0aG9zZSBJTlRDIGhvb2t1cHMgKGRpcmVjdCwgcGx1cyBzZXZlcmFsIElSUSBiYW5rcykgY2FuIGFsc28KLSAqIHNlcnZlIGFzIEVETUEgZXZlbnQgdHJpZ2dlcnMuCi0gKi8KLQotc3RhdGljIHZvaWQgZ3Bpb19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBpcnEycmVncyhkLT5pcnEpOwotCXUzMiBtYXNrID0gKHUzMikgaXJxX2RhdGFfZ2V0X2lycV9oYW5kbGVyX2RhdGEoZCk7Ci0KLQlfX3Jhd193cml0ZWwobWFzaywgJmctPmNscl9mYWxsaW5nKTsKLQlfX3Jhd193cml0ZWwobWFzaywgJmctPmNscl9yaXNpbmcpOwotfQotCi1zdGF0aWMgdm9pZCBncGlvX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBkYXZpbmNpX2dwaW9fcmVncyBfX2lvbWVtICpnID0gaXJxMnJlZ3MoZC0+aXJxKTsKLQl1MzIgbWFzayA9ICh1MzIpIGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGQpOwotCXVuc2lnbmVkIHN0YXR1cyA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkKTsKLQotCXN0YXR1cyAmPSBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORzsKLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkc7Ci0KLQlpZiAoc3RhdHVzICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQotCQlfX3Jhd193cml0ZWwobWFzaywgJmctPnNldF9mYWxsaW5nKTsKLQlpZiAoc3RhdHVzICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCV9fcmF3X3dyaXRlbChtYXNrLCAmZy0+c2V0X3Jpc2luZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHRyaWdnZXIpCi17Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBpcnEycmVncyhkLT5pcnEpOwotCXUzMiBtYXNrID0gKHUzMikgaXJxX2RhdGFfZ2V0X2lycV9oYW5kbGVyX2RhdGEoZCk7Ci0KLQlpZiAodHJpZ2dlciAmIH4oSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGdwaW9faXJxY2hpcCA9IHsKLQkubmFtZQkJPSAiR1BJTyIsCi0JLmlycV9lbmFibGUJPSBncGlvX2lycV9lbmFibGUsCi0JLmlycV9kaXNhYmxlCT0gZ3Bpb19pcnFfZGlzYWJsZSwKLQkuaXJxX3NldF90eXBlCT0gZ3Bpb19pcnFfdHlwZSwKLQkuZmxhZ3MJCT0gSVJRQ0hJUF9TRVRfVFlQRV9NQVNLRUQsCi19OwotCi1zdGF0aWMgdm9pZAotZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZzsKLQl1MzIgbWFzayA9IDB4ZmZmZjsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQ7Ci0KLQlkID0gKHN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqKWlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7Ci0JZyA9IChzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqKWQtPnJlZ3M7Ci0KLQkvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgb25lIGJhbmsgKi8KLQlpZiAoaXJxICYgMSkKLQkJbWFzayA8PD0gMTY7Ci0KLQkvKiB0ZW1wb3JhcmlseSBtYXNrIChsZXZlbCBzZW5zaXRpdmUpIHBhcmVudCBJUlEgKi8KLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfbWFzaygmZGVzYy0+aXJxX2RhdGEpOwotCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKLQl3aGlsZSAoMSkgewotCQl1MzIJCXN0YXR1czsKLQkJaW50CQluOwotCQlpbnQJCXJlczsKLQotCQkvKiBhY2sgYW55IGlycXMgKi8KLQkJc3RhdHVzID0gX19yYXdfcmVhZGwoJmctPmludHN0YXQpICYgbWFzazsKLQkJaWYgKCFzdGF0dXMpCi0JCQlicmVhazsKLQkJX19yYXdfd3JpdGVsKHN0YXR1cywgJmctPmludHN0YXQpOwotCi0JCS8qIG5vdyBkZW11eCB0aGVtIHRvIHRoZSByaWdodCBsb3dsZXZlbCBoYW5kbGVyICovCi0JCW4gPSBkLT5pcnFfYmFzZTsKLQkJaWYgKGlycSAmIDEpIHsKLQkJCW4gKz0gMTY7Ci0JCQlzdGF0dXMgPj49IDE2OwotCQl9Ci0KLQkJd2hpbGUgKHN0YXR1cykgewotCQkJcmVzID0gZmZzKHN0YXR1cyk7Ci0JCQluICs9IHJlczsKLQkJCWdlbmVyaWNfaGFuZGxlX2lycShuIC0gMSk7Ci0JCQlzdGF0dXMgPj49IHJlczsKLQkJfQotCX0KLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfdW5tYXNrKCZkZXNjLT5pcnFfZGF0YSk7Ci0JLyogbm93IGl0IG1heSByZS10cmlnZ2VyICovCi19Ci0KLXN0YXRpYyBpbnQgZ3Bpb190b19pcnFfYmFua2VkKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQgPSBjaGlwMmNvbnRyb2xsZXIoY2hpcCk7Ci0KLQlpZiAoZC0+aXJxX2Jhc2UgPj0gMCkKLQkJcmV0dXJuIGQtPmlycV9iYXNlICsgb2Zmc2V0OwotCWVsc2UKLQkJcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb190b19pcnFfdW5iYW5rZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBkYXZpbmNpX3NvY19pbmZvICpzb2NfaW5mbyA9ICZkYXZpbmNpX3NvY19pbmZvOwotCi0JLyogTk9URTogIHdlIGFzc3VtZSBmb3Igbm93IHRoYXQgb25seSBpcnFzIGluIHRoZSBmaXJzdCBncGlvX2NoaXAKLQkgKiBjYW4gcHJvdmlkZSBkaXJlY3QtbWFwcGVkIElSUXMgdG8gQUlOVEMgKHVwIHRvIDMyIEdQSU9zKS4KLQkgKi8KLQlpZiAob2Zmc2V0IDwgc29jX2luZm8tPmdwaW9fdW5iYW5rZWQpCi0JCXJldHVybiBzb2NfaW5mby0+Z3Bpb19pcnEgKyBvZmZzZXQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBncGlvX2lycV90eXBlX3VuYmFua2VkKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGQtPmlycSk7Ci0JdTMyIG1hc2sgPSAodTMyKSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKLQotCWlmICh0cmlnZ2VyICYgfihJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JX19yYXdfd3JpdGVsKG1hc2ssICh0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQotCQkgICAgID8gJmctPnNldF9mYWxsaW5nIDogJmctPmNscl9mYWxsaW5nKTsKLQlfX3Jhd193cml0ZWwobWFzaywgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKLQkJICAgICA/ICZnLT5zZXRfcmlzaW5nIDogJmctPmNscl9yaXNpbmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBOT1RFOiAgZm9yIHN1c3BlbmQvcmVzdW1lLCBwcm9iYWJseSBiZXN0IHRvIG1ha2UgYSBwbGF0Zm9ybV9kZXZpY2Ugd2l0aAotICogc3VzcGVuZF9sYXRlL3Jlc3VtZV9yZXN1bWUgY2FsbHMgaG9va2luZyBpbnRvIHJlc3VsdHMgb2YgdGhlIHNldF93YWtlKCkKLSAqIGNhbGxzIC4uLiBzbyBpZiBubyBncGlvcyBhcmUgd2FrZXVwIGV2ZW50cyB0aGUgY2xvY2sgY2FuIGJlIGRpc2FibGVkLAotICogd2l0aCBvdXRwdXRzIGxlZnQgYXQgcHJldmlvdXNseSBzZXQgbGV2ZWxzLCBhbmQgc28gdGhhdCBWREQzUDNWLklPUFdETjAKLSAqIChkbTY0NDYpIGNhbiBiZSBzZXQgYXBwcm9wcmlhdGVseSBmb3IgR1BJT1YzMyBwaW5zLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfZ3Bpb19pcnFfc2V0dXAodm9pZCkKLXsKLQl1bnNpZ25lZAlncGlvLCBpcnEsIGJhbms7Ci0Jc3RydWN0IGNsawkqY2xrOwotCXUzMgkJYmludGVuID0gMDsKLQl1bnNpZ25lZAluZ3BpbywgYmFua19pcnE7Ci0Jc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87Ci0Jc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzCV9faW9tZW0gKmc7Ci0KLQluZ3BpbyA9IHNvY19pbmZvLT5ncGlvX251bTsKLQotCWJhbmtfaXJxID0gc29jX2luZm8tPmdwaW9faXJxOwotCWlmIChiYW5rX2lycSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRG9uJ3Qga25vdyBmaXJzdCBHUElPIGJhbmsgSVJRLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNsayA9IGNsa19nZXQoTlVMTCwgImdwaW8iKTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlbGQgZ2V0dGluZyBncGlvIGNsb2NrP1xuIiwKLQkJICAgICAgIFBUUl9FUlIoY2xrKSk7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7Ci0JfQotCWNsa19lbmFibGUoY2xrKTsKLQotCS8qIEFycmFuZ2UgZ3Bpb190b19pcnEoKSBzdXBwb3J0LCBoYW5kbGluZyBlaXRoZXIgZGlyZWN0IElSUXMgb3IKLQkgKiBiYW5rZWQgSVJRcy4gIEhhdmluZyBHUElPcyBpbiB0aGUgZmlyc3QgR1BJTyBiYW5rIHVzZSBkaXJlY3QKLQkgKiBJUlFzLCB3aGlsZSB0aGUgb3RoZXJzIHVzZSBiYW5rZWQgSVJRcywgd291bGQgbmVlZCBzb21lIHNldHVwCi0JICogdHdlYWtzIHRvIHJlY29nbml6ZSBoYXJkd2FyZSB3aGljaCBjYW4gZG8gdGhhdC4KLQkgKi8KLQlmb3IgKGdwaW8gPSAwLCBiYW5rID0gMDsgZ3BpbyA8IG5ncGlvOyBiYW5rKyssIGdwaW8gKz0gMzIpIHsKLQkJY2hpcHNbYmFua10uY2hpcC50b19pcnEgPSBncGlvX3RvX2lycV9iYW5rZWQ7Ci0JCWNoaXBzW2JhbmtdLmlycV9iYXNlID0gc29jX2luZm8tPmdwaW9fdW5iYW5rZWQKLQkJCT8gLUVJTlZBTAotCQkJOiAoc29jX2luZm8tPmludGNfaXJxX251bSArIGdwaW8pOwotCX0KLQotCS8qCi0JICogQUlOVEMgY2FuIGhhbmRsZSBkaXJlY3QvdW5iYW5rZWQgSVJRcyBmb3IgR1BJT3MsIHdpdGggdGhlIEdQSU8KLQkgKiBjb250cm9sbGVyIG9ubHkgaGFuZGxpbmcgdHJpZ2dlciBtb2Rlcy4gIFdlIGN1cnJlbnRseSBhc3N1bWUgbm8KLQkgKiBJUlEgbXV4IGNvbmZsaWN0czsgZ3Bpb19pcnFfdHlwZV91bmJhbmtlZCgpIGlzIG9ubHkgZm9yIEdQSU9zLgotCSAqLwotCWlmIChzb2NfaW5mby0+Z3Bpb191bmJhbmtlZCkgewotCQlzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdwaW9faXJxY2hpcF91bmJhbmtlZDsKLQotCQkvKiBwYXNzICJiYW5rIDAiIEdQSU8gSVJRcyB0byBBSU5UQyAqLwotCQljaGlwc1swXS5jaGlwLnRvX2lycSA9IGdwaW9fdG9faXJxX3VuYmFua2VkOwotCQliaW50ZW4gPSBCSVQoMCk7Ci0KLQkJLyogQUlOVEMgaGFuZGxlcyBtYXNrL3VubWFzazsgR1BJTyBoYW5kbGVzIHRyaWdnZXJpbmcgKi8KLQkJaXJxID0gYmFua19pcnE7Ci0JCWdwaW9faXJxY2hpcF91bmJhbmtlZCA9ICppcnFfZ2V0X2NoaXAoaXJxKTsKLQkJZ3Bpb19pcnFjaGlwX3VuYmFua2VkLm5hbWUgPSAiR1BJTy1BSU5UQyI7Ci0JCWdwaW9faXJxY2hpcF91bmJhbmtlZC5pcnFfc2V0X3R5cGUgPSBncGlvX2lycV90eXBlX3VuYmFua2VkOwotCi0JCS8qIGRlZmF1bHQgdHJpZ2dlcjogYm90aCBlZGdlcyAqLwotCQlnID0gZ3BpbzJyZWdzKDApOwotCQlfX3Jhd193cml0ZWwofjAsICZnLT5zZXRfZmFsbGluZyk7Ci0JCV9fcmF3X3dyaXRlbCh+MCwgJmctPnNldF9yaXNpbmcpOwotCi0JCS8qIHNldCB0aGUgZGlyZWN0IElSUXMgdXAgdG8gdXNlIHRoYXQgaXJxY2hpcCAqLwotCQlmb3IgKGdwaW8gPSAwOyBncGlvIDwgc29jX2luZm8tPmdwaW9fdW5iYW5rZWQ7IGdwaW8rKywgaXJxKyspIHsKLQkJCWlycV9zZXRfY2hpcChpcnEsICZncGlvX2lycWNoaXBfdW5iYW5rZWQpOwotCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCAodm9pZCAqKV9fZ3Bpb19tYXNrKGdwaW8pKTsKLQkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgKF9fZm9yY2Ugdm9pZCAqKWcpOwotCQkJaXJxX3NldF9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfVFlQRV9FREdFX0JPVEgpOwotCQl9Ci0KLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogT3IsIEFJTlRDIGNhbiBoYW5kbGUgSVJRcyBmb3IgYmFua3Mgb2YgMTYgR1BJTyBJUlFzLCB3aGljaCB3ZQotCSAqIHRoZW4gY2hhaW4gdGhyb3VnaCBvdXIgb3duIGhhbmRsZXIuCi0JICovCi0JZm9yIChncGlvID0gMCwgaXJxID0gZ3Bpb190b19pcnEoMCksIGJhbmsgPSAwOwotCQkJZ3BpbyA8IG5ncGlvOwotCQkJYmFuaysrLCBiYW5rX2lycSsrKSB7Ci0JCXVuc2lnbmVkCQlpOwotCi0JCS8qIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGVuYWJsZWQgb25seSBhcyBuZWVkZWQgKi8KLQkJZyA9IGdwaW8ycmVncyhncGlvKTsKLQkJX19yYXdfd3JpdGVsKH4wLCAmZy0+Y2xyX2ZhbGxpbmcpOwotCQlfX3Jhd193cml0ZWwofjAsICZnLT5jbHJfcmlzaW5nKTsKLQotCQkvKiBzZXQgdXAgYWxsIGlycXMgaW4gdGhpcyBiYW5rICovCi0JCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGJhbmtfaXJxLCBncGlvX2lycV9oYW5kbGVyKTsKLQotCQkvKgotCQkgKiBFYWNoIGNoaXAgaGFuZGxlcyAzMiBncGlvcywgYW5kIGVhY2ggaXJxIGJhbmsgY29uc2lzdHMgb2YgMTYKLQkJICogZ3BpbyBpcnFzLiBQYXNzIHRoZSBpcnEgYmFuaydzIGNvcnJlc3BvbmRpbmcgY29udHJvbGxlciB0bwotCQkgKiB0aGUgY2hhaW5lZCBpcnEgaGFuZGxlci4KLQkJICovCi0JCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmtfaXJxLCAmY2hpcHNbZ3BpbyAvIDMyXSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGdwaW8gPCBuZ3BpbzsgaSsrLCBpcnErKywgZ3BpbysrKSB7Ci0JCQlpcnFfc2V0X2NoaXAoaXJxLCAmZ3Bpb19pcnFjaGlwKTsKLQkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgKF9fZm9yY2Ugdm9pZCAqKWcpOwotCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCAodm9pZCAqKV9fZ3Bpb19tYXNrKGdwaW8pKTsKLQkJCWlycV9zZXRfaGFuZGxlcihpcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKLQkJfQotCi0JCWJpbnRlbiB8PSBCSVQoYmFuayk7Ci0JfQotCi1kb25lOgotCS8qIEJJTlRFTiAtLSBwZXItYmFuayBpbnRlcnJ1cHQgZW5hYmxlLiBnZW5pcnEgd291bGQgYWxzbyBsZXQgdGhlc2UKLQkgKiBiaXRzIGJlIHNldC9jbGVhcmVkIGR5bmFtaWNhbGx5LgotCSAqLwotCV9fcmF3X3dyaXRlbChiaW50ZW4sIGdwaW9fYmFzZSArIDB4MDgpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRGFWaW5jaTogJWQgZ3BpbyBpcnFzXG4iLCBpcnEgLSBncGlvX3RvX2lycSgwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGRyMi5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kZHIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5ZTA0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGRyMi5oCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBERFIyX1NEUkNSX09GRlNFVAkweGMKKyNkZWZpbmUgRERSMl9TUlBEX0JJVAkJKDEgPDwgMjMpCisjZGVmaW5lIEREUjJfTUNMS1NUT1BFTl9CSVQJKDEgPDwgMzApCisjZGVmaW5lIEREUjJfTFBNT0RFTl9CSVQJKDEgPDwgMzEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZjhiN2VhNC4uY2Y5NDU1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTgsNTYgKzE4LDUwIEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAKLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KICNpbmNsdWRlIDxtYWNoL3NlcmlhbC5oPgogCiAjZGVmaW5lIFVBUlRfU0hJRlQJMgogCi0jZGVmaW5lIGRhdmluY2lfdWFydF92MnAoeCkJKCh4KSAtIFBBR0VfT0ZGU0VUICsgUExBVF9QSFlTX09GRlNFVCkKLSNkZWZpbmUgZGF2aW5jaV91YXJ0X3Aydih4KQkoKHgpIC0gUExBVF9QSFlTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotCiAJCS5wdXNoc2VjdGlvbiAuZGF0YQogZGF2aW5jaV91YXJ0X3BoeXM6CS53b3JkCTAKIGRhdmluY2lfdWFydF92aXJ0Ogkud29yZAkwCiAJCS5wb3BzZWN0aW9uCiAKLQkJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCiAJCS8qIFVzZSBkYXZpbmNpX3VhcnRfcGh5cy92aXJ0IGlmIGFscmVhZHkgY29uZmlndXJlZCAqLwotMTA6CQltcmMJcDE1LCAwLCBccnAsIGMxLCBjMAotCQl0c3QJXHJwLCAjMQkJCUAgTU1VIGVuYWJsZWQ/Ci0JCWxkcmVxCVxycCwgPWRhdmluY2lfdWFydF92MnAoZGF2aW5jaV91YXJ0X3BoeXMpCi0JCWxkcm5lCVxycCwgPWRhdmluY2lfdWFydF9waHlzCi0JCWFkZAlccnYsIFxycCwgIzQJCUAgZGF2aW5jaV91YXJ0X3ZpcnQKLQkJbGRyCVxycCwgW1xycCwgIzBdCi0JCWxkcglccnYsIFtccnYsICMwXQorMTA6CQlhZHIJXHJwLCA5OWYJCUAgZ2V0IGVmZmVjdGl2ZSBhZGRyIG9mIDk5ZgorCQlsZHIJXHJ2LCBbXHJwXQkJQCBnZXQgYWJzb2x1dGUgYWRkciBvZiA5OWYKKwkJc3ViCVxydiwgXHJ2LCBccnAJCUAgb2Zmc2V0IGJldHdlZW4gdGhlIHR3bworCQlsZHIJXHJwLCBbXHJwLCAjNF0JCUAgYWJzIGFkZHIgb2Ygb21hcF91YXJ0X3BoeXMKKwkJc3ViCVx0bXAsIFxycCwgXHJ2CQlAIG1ha2UgaXQgZWZmZWN0aXZlCisJCWxkcglccnAsIFtcdG1wLCAjMF0JCUAgZGF2aW5jaV91YXJ0X3BoeXMKKwkJbGRyCVxydiwgW1x0bXAsICM0XQkJQCBkYXZpbmNpX3VhcnRfdmlydAogCQljbXAJXHJwLCAjMAkJCUAgaXMgcG9ydCBjb25maWd1cmVkPwogCQljbXBuZQlccnYsICMwCi0JCWJuZQk5OWYJCQlAIGFscmVhZHkgY29uZmlndXJlZAorCQlibmUJMTAwZgkJCUAgYWxyZWFkeSBjb25maWd1cmVkCiAKIAkJLyogQ2hlY2sgdGhlIGRlYnVnIFVBUlQgYWRkcmVzcyBzZXQgaW4gdW5jb21wcmVzcy5oICovCi0JCW1yYwlwMTUsIDAsIFxycCwgYzEsIGMwCi0JCXRzdAlccnAsICMxCQkJQCBNTVUgZW5hYmxlZD8KKwkJYW5kCVxycCwgcGMsICMweGZmMDAwMDAwCisJCWxkcglccnYsID1EQVZJTkNJX1VBUlRfSU5GT19PRlMKKwkJYWRkCVxycCwgXHJwLCBccnYKIAogCQkvKiBDb3B5IHVhcnQgcGh5cyBhZGRyZXNzIGZyb20gZGVjb21wcmVzc29yIHVhcnQgaW5mbyAqLwotCQlsZHJlcQlccnYsID1kYXZpbmNpX3VhcnRfdjJwKGRhdmluY2lfdWFydF9waHlzKQotCQlsZHJuZQlccnYsID1kYXZpbmNpX3VhcnRfcGh5cwotCQlsZHJlcQlccnAsID1EQVZJTkNJX1VBUlRfSU5GTwotCQlsZHJuZQlccnAsID1kYXZpbmNpX3VhcnRfcDJ2KERBVklOQ0lfVUFSVF9JTkZPKQotCQlsZHIJXHJwLCBbXHJwLCAjMF0KLQkJc3RyCVxycCwgW1xydl0KKwkJbGRyCVxydiwgW1xycCwgIzBdCisJCXN0cglccnYsIFtcdG1wLCAjMF0KIAogCQkvKiBDb3B5IHVhcnQgdmlydCBhZGRyZXNzIGZyb20gZGVjb21wcmVzc29yIHVhcnQgaW5mbyAqLwotCQlsZHJlcQlccnYsID1kYXZpbmNpX3VhcnRfdjJwKGRhdmluY2lfdWFydF92aXJ0KQotCQlsZHJuZQlccnYsID1kYXZpbmNpX3VhcnRfdmlydAotCQlsZHJlcQlccnAsID1EQVZJTkNJX1VBUlRfSU5GTwotCQlsZHJuZQlccnAsID1kYXZpbmNpX3VhcnRfcDJ2KERBVklOQ0lfVUFSVF9JTkZPKQotCQlsZHIJXHJwLCBbXHJwLCAjNF0KLQkJc3RyCVxycCwgW1xydl0KKwkJbGRyCVxydiwgW1xycCwgIzRdCisJCXN0cglccnYsIFtcdG1wLCAjNF0KIAogCQliCTEwYgotOTk6CisKKwkJLmFsaWduCis5OToJCS53b3JkCS4KKwkJLndvcmQJZGF2aW5jaV91YXJ0X3BoeXMKKwkJLmx0b3JnCisKKzEwMDoKIAkJLmVuZG0KIAogCQkubWFjcm8Jc2VuZHVhcnQscmQscngKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby1kYXZpbmNpLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8tZGF2aW5jaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGQxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8tZGF2aW5jaS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBUSSBEYVZpbmNpIEdQSU8gU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChjKSAyMDA3LCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYJX19EQVZJTkNJX0RBVklOQ0lfR1BJT19ICisjZGVmaW5lCV9fREFWSU5DSV9EQVZJTkNJX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKworI2RlZmluZSBEQVZJTkNJX0dQSU9fQkFTRSAweDAxQzY3MDAwCisKK2VudW0gZGF2aW5jaV9ncGlvX3R5cGUgeworCUdQSU9fVFlQRV9EQVZJTkNJID0gMCwKKwlHUElPX1RZUEVfVE5FVFYxMDdYLAorfTsKKworLyoKKyAqIGJhc2ljIGdwaW8gcm91dGluZXMKKyAqCisgKiBib2FyZC1zcGVjaWZpYyBpbml0IHNob3VsZCBiZSBkb25lIGJ5IGFyY2gvLi4uLy4uLi9ib2FyZC1YWFguYyAobWF5YmUKKyAqIGluaXRpYWxpemluZyBiYW5rcyB0b2dldGhlcikgcmF0aGVyIHRoYW4gYm9vdCBsb2FkZXJzOyBrZXhlYygpIHdvbid0CisgKiBnbyB0aHJvdWdoIGJvb3QgbG9hZGVycy4KKyAqCisgKiB0aGUgZ3BpbyBjbG9jayB3aWxsIGJlIHR1cm5lZCBvbiB3aGVuIGdwaW9zIGFyZSB1c2VkLCBhbmQgeW91IG1heSBhbHNvCisgKiBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gUElOTVVYIHJlZ2lzdGVycyB0byBiZSBzdXJlIHRob3NlIHBpbnMgYXJlCisgKiB1c2VkIGFzIGdwaW9zLCBub3Qgd2l0aCBvdGhlciBwZXJpcGhlcmFscy4KKyAqCisgKiBPbi1jaGlwIEdQSU9zIGFyZSBudW1iZXJlZCAwLi4oREFWSU5DSV9OX0dQSU8tMSkuICBGb3IgZG9jdW1lbnRhdGlvbiwKKyAqIGFuZCBtYXliZSBmb3IgbGF0ZXIgdXBkYXRlcywgY29kZSBtYXkgd3JpdGUgR1BJTyhOKS4gIFRoZXNlIG1heSBiZQorICogYWxsIDEuOFYgc2lnbmFscywgYWxsIDMuM1Ygb25lcywgb3IgYSBtaXggb2YgdGhlIHR3by4gIEEgZ2l2ZW4gY2hpcAorICogbWF5IG5vdCBzdXBwb3J0IGFsbCB0aGUgR1BJT3MgaW4gdGhhdCByYW5nZS4KKyAqCisgKiBHUElPcyBjYW4gYWxzbyBiZSBvbiBleHRlcm5hbCBjaGlwcywgbnVtYmVyZWQgYWZ0ZXIgdGhlIG9uZXMgYnVpbHQtaW4KKyAqIHRvIHRoZSBEYVZpbmNpIGNoaXAuICBGb3Igbm93LCB0aGV5IHdvbid0IGJlIHVzYWJsZSBhcyBJUlEgc291cmNlcy4KKyAqLworI2RlZmluZQlHUElPKFgpCQkoWCkJCS8qIDAgPD0gWCA8PSAoREFWSU5DSV9OX0dQSU8gLSAxKSAqLworCisvKiBDb252ZXJ0IEdQSU8gc2lnbmFsIHRvIEdQSU8gcGluIG51bWJlciAqLworI2RlZmluZSBHUElPX1RPX1BJTihiYW5rLCBncGlvKQkoMTYgKiAoYmFuaykgKyAoZ3BpbykpCisKK3N0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciB7CisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCWludAkJCWlycV9iYXNlOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl2b2lkIF9faW9tZW0JCSpzZXRfZGF0YTsKKwl2b2lkIF9faW9tZW0JCSpjbHJfZGF0YTsKKwl2b2lkIF9faW9tZW0JCSppbl9kYXRhOworfTsKKworLyogVGhlIF9fZ3Bpb190b19jb250cm9sbGVyKCkgYW5kIF9fZ3Bpb19tYXNrKCkgZnVuY3Rpb25zIGlubGluZSB0byBjb25zdGFudHMKKyAqIHdpdGggY29uc3RhbnQgcGFyYW1ldGVyczsgb3IgaW4gb3V0bGluZWQgY29kZSB0aGV5IGV4ZWN1dGUgYXQgcnVudGltZS4KKyAqCisgKiBZb3UnZCBhY2Nlc3MgdGhlIGNvbnRyb2xsZXIgZGlyZWN0bHkgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgbW9yZSB0aGFuCisgKiBvbmUgZ3BpbyB2YWx1ZSBhdCBhIHRpbWUsIGFuZCB0byBzdXBwb3J0IHdpcmVkIGxvZ2ljIHdoZXJlIHRoZSB2YWx1ZQorICogYmVpbmcgZHJpdmVuIGJ5IHRoZSBjcHUgbmVlZCBub3QgbWF0Y2ggdGhlIHZhbHVlIHJlYWQgYmFjay4KKyAqCisgKiBUaGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGNyb3NzLXBsYXRmb3JtIEdQSU8gaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICoKK19fZ3Bpb190b19jb250cm9sbGVyKHVuc2lnbmVkIGdwaW8pCit7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyICpjdGxycyA9IGRhdmluY2lfc29jX2luZm8uZ3Bpb19jdGxyczsKKwlpbnQgaW5kZXggPSBncGlvIC8gMzI7CisKKwlpZiAoIWN0bHJzIHx8IGluZGV4ID49IGRhdmluY2lfc29jX2luZm8uZ3Bpb19jdGxyc19udW0pCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGN0bHJzICsgaW5kZXg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIF9fZ3Bpb19tYXNrKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIDEgPDwgKGdwaW8gJSAzMik7Cit9CisKKyNlbmRpZgkvKiBfX0RBVklOQ0lfREFWSU5DSV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZmJlY2UxMi4uOTYwZTlkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEzLDgwICsxMywxMiBAQAogI2lmbmRlZglfX0RBVklOQ0lfR1BJT19ICiAjZGVmaW5lCV9fREFWSU5DSV9HUElPX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjZGVmaW5lIF9fQVJNX0dQSU9MSUJfQ09NUExFWAogCi0jZGVmaW5lIERBVklOQ0lfR1BJT19CQVNFIDB4MDFDNjcwMDAKLQotZW51bSBkYXZpbmNpX2dwaW9fdHlwZSB7Ci0JR1BJT19UWVBFX0RBVklOQ0kgPSAwLAotCUdQSU9fVFlQRV9UTkVUVjEwN1gsCi19OwotCi0vKgotICogYmFzaWMgZ3BpbyByb3V0aW5lcwotICoKLSAqIGJvYXJkLXNwZWNpZmljIGluaXQgc2hvdWxkIGJlIGRvbmUgYnkgYXJjaC8uLi4vLi4uL2JvYXJkLVhYWC5jIChtYXliZQotICogaW5pdGlhbGl6aW5nIGJhbmtzIHRvZ2V0aGVyKSByYXRoZXIgdGhhbiBib290IGxvYWRlcnM7IGtleGVjKCkgd29uJ3QKLSAqIGdvIHRocm91Z2ggYm9vdCBsb2FkZXJzLgotICoKLSAqIHRoZSBncGlvIGNsb2NrIHdpbGwgYmUgdHVybmVkIG9uIHdoZW4gZ3Bpb3MgYXJlIHVzZWQsIGFuZCB5b3UgbWF5IGFsc28KLSAqIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0byBQSU5NVVggcmVnaXN0ZXJzIHRvIGJlIHN1cmUgdGhvc2UgcGlucyBhcmUKLSAqIHVzZWQgYXMgZ3Bpb3MsIG5vdCB3aXRoIG90aGVyIHBlcmlwaGVyYWxzLgotICoKLSAqIE9uLWNoaXAgR1BJT3MgYXJlIG51bWJlcmVkIDAuLihEQVZJTkNJX05fR1BJTy0xKS4gIEZvciBkb2N1bWVudGF0aW9uLAotICogYW5kIG1heWJlIGZvciBsYXRlciB1cGRhdGVzLCBjb2RlIG1heSB3cml0ZSBHUElPKE4pLiAgVGhlc2UgbWF5IGJlCi0gKiBhbGwgMS44ViBzaWduYWxzLCBhbGwgMy4zViBvbmVzLCBvciBhIG1peCBvZiB0aGUgdHdvLiAgQSBnaXZlbiBjaGlwCi0gKiBtYXkgbm90IHN1cHBvcnQgYWxsIHRoZSBHUElPcyBpbiB0aGF0IHJhbmdlLgotICoKLSAqIEdQSU9zIGNhbiBhbHNvIGJlIG9uIGV4dGVybmFsIGNoaXBzLCBudW1iZXJlZCBhZnRlciB0aGUgb25lcyBidWlsdC1pbgotICogdG8gdGhlIERhVmluY2kgY2hpcC4gIEZvciBub3csIHRoZXkgd29uJ3QgYmUgdXNhYmxlIGFzIElSUSBzb3VyY2VzLgotICovCi0jZGVmaW5lCUdQSU8oWCkJCShYKQkJLyogMCA8PSBYIDw9IChEQVZJTkNJX05fR1BJTyAtIDEpICovCi0KLS8qIENvbnZlcnQgR1BJTyBzaWduYWwgdG8gR1BJTyBwaW4gbnVtYmVyICovCi0jZGVmaW5lIEdQSU9fVE9fUElOKGJhbmssIGdwaW8pCSgxNiAqIChiYW5rKSArIChncGlvKSkKLQotc3RydWN0IGRhdmluY2lfZ3Bpb19jb250cm9sbGVyIHsKLQlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7Ci0JaW50CQkJaXJxX2Jhc2U7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQl2b2lkIF9faW9tZW0JCSpyZWdzOwotCXZvaWQgX19pb21lbQkJKnNldF9kYXRhOwotCXZvaWQgX19pb21lbQkJKmNscl9kYXRhOwotCXZvaWQgX19pb21lbQkJKmluX2RhdGE7Ci19OwotCi0vKiBUaGUgX19ncGlvX3RvX2NvbnRyb2xsZXIoKSBhbmQgX19ncGlvX21hc2soKSBmdW5jdGlvbnMgaW5saW5lIHRvIGNvbnN0YW50cwotICogd2l0aCBjb25zdGFudCBwYXJhbWV0ZXJzOyBvciBpbiBvdXRsaW5lZCBjb2RlIHRoZXkgZXhlY3V0ZSBhdCBydW50aW1lLgotICoKLSAqIFlvdSdkIGFjY2VzcyB0aGUgY29udHJvbGxlciBkaXJlY3RseSB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyBtb3JlIHRoYW4KLSAqIG9uZSBncGlvIHZhbHVlIGF0IGEgdGltZSwgYW5kIHRvIHN1cHBvcnQgd2lyZWQgbG9naWMgd2hlcmUgdGhlIHZhbHVlCi0gKiBiZWluZyBkcml2ZW4gYnkgdGhlIGNwdSBuZWVkIG5vdCBtYXRjaCB0aGUgdmFsdWUgcmVhZCBiYWNrLgotICoKLSAqIFRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgY3Jvc3MtcGxhdGZvcm0gR1BJTyBpbnRlcmZhY2UKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKgotX19ncGlvX3RvX2NvbnRyb2xsZXIodW5zaWduZWQgZ3BpbykKLXsKLQlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmN0bHJzID0gZGF2aW5jaV9zb2NfaW5mby5ncGlvX2N0bHJzOwotCWludCBpbmRleCA9IGdwaW8gLyAzMjsKLQotCWlmICghY3RscnMgfHwgaW5kZXggPj0gZGF2aW5jaV9zb2NfaW5mby5ncGlvX2N0bHJzX251bSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gY3RscnMgKyBpbmRleDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgX19ncGlvX21hc2sodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gMSA8PCAoZ3BpbyAlIDMyKTsKLX0KKy8qIFRoZSBpbmxpbmUgdmVyc2lvbnMgdXNlIHRoZSBzdGF0aWMgaW5saW5lcyBpbiB0aGUgZHJpdmVyIGhlYWRlciAqLworI2luY2x1ZGUgImdwaW8tZGF2aW5jaS5oIgogCiAvKgogICogVGhlIGdldC9zZXQvY2xlYXIgZnVuY3Rpb25zIHdpbGwgaW5saW5lIHdoZW4gY2FsbGVkIHdpdGggY29uc3RhbnQKQEAgLTE0NywxMSArNzksNiBAQAogCQlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fdG9faXJxKGdwaW8pOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpcnEpCiB7CiAJLyogZG9uJ3Qgc3VwcG9ydCB0aGUgcmV2ZXJzZSBtYXBwaW5nICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3MzE5NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIERhVmluY2kgbWVtb3J5IHNwYWNlIGRlZmluaXRpb25zCi0gKgotICogQXV0aG9yOiBLZXZpbiBIaWxtYW4sIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZWQgRmlsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERBVklOQ0lfRERSX0JBU0UJMHg4MDAwMDAwMAotI2RlZmluZSBEQThYWF9ERFJfQkFTRQkJMHhjMDAwMDAwMAotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9EQVZJTkNJX0RBOFhYKSAmJiBkZWZpbmVkKENPTkZJR19BUkNIX0RBVklOQ0lfRE14KQotI2Vycm9yIENhbm5vdCBlbmFibGUgRGFWaW5jaSBhbmQgREE4WFggcGxhdGZvcm1zIGNvbmN1cnJlbnRseQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9EQVZJTkNJX0RBOFhYKQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUIERBOFhYX0REUl9CQVNFCi0jZWxzZQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUIERBVklOQ0lfRERSX0JBU0UKLSNlbmRpZgotCi0jZGVmaW5lIEREUjJfU0RSQ1JfT0ZGU0VUCTB4YwotI2RlZmluZSBERFIyX1NSUERfQklUCQlCSVQoMjMpCi0jZGVmaW5lIEREUjJfTUNMS1NUT1BFTl9CSVQJQklUKDMwKQotI2RlZmluZSBERFIyX0xQTU9ERU5fQklUCUJJVCgzMSkKLQotLyoKLSAqIEluY3JlYXNlIHNpemUgb2YgRE1BLWNvbnNpc3RlbnQgbWVtb3J5IHJlZ2lvbgotICovCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgKDE0PDwyMCkKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbW1jLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL21tYy5oCmluZGV4IGQ0ZjFlOTYuLjViYTZiMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tbWMuaApAQCAtMTIsNiArMTIsOSBAQAogCS8qIGdldF9jZCgpL2dldF93cCgpIG1heSBzbGVlcCAqLwogCWludAkoKmdldF9jZCkoaW50IG1vZHVsZSk7CiAJaW50CSgqZ2V0X3JvKShpbnQgbW9kdWxlKTsKKworCXZvaWQJKCpzZXRfcG93ZXIpKGludCBtb2R1bGUsIGJvb2wgb24pOworCiAJLyogd2lyZXMgPT0gMCBpcyBlcXVpdmFsZW50IHRvIHdpcmVzID09IDQgKDQtYml0IHBhcmFsbGVsKSAqLwogCXU4CXdpcmVzOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL211eC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9tdXguaAppbmRleCA1ZDRlMGZlLi5hN2U5MmZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL211eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvbXV4LmgKQEAgLTg1Nyw2ICs4NTcsMTQgQEAKIAlEQTg1MF9NTUNTRDBfQ0xLLAogCURBODUwX01NQ1NEMF9DTUQsCiAKKwkvKiBNTUMvU0QxIGZ1bmN0aW9uICovCisJREE4NTBfTU1DU0QxX0RBVF8wLAorCURBODUwX01NQ1NEMV9EQVRfMSwKKwlEQTg1MF9NTUNTRDFfREFUXzIsCisJREE4NTBfTU1DU0QxX0RBVF8zLAorCURBODUwX01NQ1NEMV9DTEssCisJREE4NTBfTU1DU0QxX0NNRCwKKwogCS8qIEVNSUYyLjUvRU1JRkEgZnVuY3Rpb24gKi8KIAlEQTg1MF9FTUFfRF83LAogCURBODUwX0VNQV9EXzYsCkBAIC05MTYsNiArOTI0LDggQEAKIAlEQTg1MF9HUElPM18xMywKIAlEQTg1MF9HUElPNF8wLAogCURBODUwX0dQSU80XzEsCisJREE4NTBfR1BJTzZfOSwKKwlEQTg1MF9HUElPNl8xMCwKIAlEQTg1MF9HUElPNl8xMywKIAlEQTg1MF9SVENfQUxBUk0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9uYW5kLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL25hbmQuaAppbmRleCAwMjUxNTEwLi4xY2Y1NTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL25hbmQuaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL25hbmQuaApAQCAtNzQsOCArNzQsMTAgQEAKIAluYW5kX2VjY19tb2Rlc190CWVjY19tb2RlOwogCXU4CQkJZWNjX2JpdHM7CiAKLQkvKiBlLmcuIE5BTkRfQlVTV0lEVEhfMTYgb3IgTkFORF9VU0VfRkxBU0hfQkJUICovCisJLyogZS5nLiBOQU5EX0JVU1dJRFRIXzE2ICovCiAJdW5zaWduZWQJCW9wdGlvbnM7CisJLyogZS5nLiBOQU5EX0JCVF9VU0VfRkxBU0ggKi8KKwl1bnNpZ25lZAkJYmJ0X29wdGlvbnM7CiAKIAkvKiBNYWluIGFuZCBtaXJyb3IgYmJ0IGRlc2NyaXB0b3Igb3ZlcnJpZGVzICovCiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyCSpiYnRfdGQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3NlcmlhbC5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9zZXJpYWwuaAppbmRleCBjOWU2Y2UxLi5lMzQ3ZDg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3NlcmlhbC5oCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvc2VyaWFsLmgKQEAgLTIxLDggKzIxLDkgQEAKICAqIG1hY3JvcyBpbiBkZWJ1Zy1tYWNyby5TLgogICoKICAqIFRoaXMgYXJlYSBzaXRzIGp1c3QgYmVsb3cgdGhlIHBhZ2UgdGFibGVzIChzZWUgYXJjaC9hcm0va2VybmVsL2hlYWQuUykuCisgKiBXZSBkZWZpbmUgaXQgYXMgYSByZWxhdGl2ZSBvZmZzZXQgZnJvbSBzdGFydCBvZiB1c2FibGUgUkFNLgogICovCi0jZGVmaW5lIERBVklOQ0lfVUFSVF9JTkZPCShQTEFUX1BIWVNfT0ZGU0VUICsgMHgzZmY4KQorI2RlZmluZSBEQVZJTkNJX1VBUlRfSU5GT19PRlMJMHgzZmY4CiAKICNkZWZpbmUgREFWSU5DSV9VQVJUMF9CQVNFCShJT19QSFlTICsgMHgyMDAwMCkKICNkZWZpbmUgREFWSU5DSV9VQVJUMV9CQVNFCShJT19QSFlTICsgMHgyMDQwMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggNzhkODA2OC4uOWRjN2NmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTQzLDcgKzQzLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdWFydF9pbmZvKHUzMiBwaHlzLCB2b2lkICogX19pb21lbSB2aXJ0KQogewotCXUzMiAqdWFydF9pbmZvID0gKHUzMiAqKShEQVZJTkNJX1VBUlRfSU5GTyk7CisJLyoKKwkgKiBHZXQgYWRkcmVzcyBvZiBzb21lLmJzcyB2YXJpYWJsZSBhbmQgcm91bmQgaXQgZG93bgorCSAqIGEgbGEgQ09ORklHX0FVVE9fWlJFTEFERFIuCisJICovCisJdTMyIHJhbV9zdGFydCA9ICh1MzIpJnVhcnQgJiAweGY4MDAwMDAwOworCXUzMiAqdWFydF9pbmZvID0gKHUzMiAqKShyYW1fc3RhcnQgKyBEQVZJTkNJX1VBUlRfSU5GT19PRlMpOwogCiAJdWFydCA9ICh1MzIgKilwaHlzOwogCXVhcnRfaW5mb1swXSA9IHBoeXM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zbGVlcC5TCmluZGV4IDVmMWUwNDUuLmQ0ZTkzMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9zbGVlcC5TCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxtYWNoL3BzYy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+CisjaW5jbHVkZSA8bWFjaC9kZHIyLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvdG5ldHYxMDd4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvdG5ldHYxMDd4LmMKaW5kZXggMWIyOGZkZC4uNDA5YmI4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3RuZXR2MTA3eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS90bmV0djEwN3guYwpAQCAtMTIsNiArMTIsNyBAQAogICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC0yNyw5ICsyOCw5IEBACiAjaW5jbHVkZSA8bWFjaC9wc2MuaD4KICNpbmNsdWRlIDxtYWNoL2NwX2ludGMuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC90bmV0djEwN3guaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZGF2aW5jaS5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKICNpbmNsdWRlICJtdXguaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZG92ZS9jbS1hNTEwLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvY20tYTUxMC5jCmluZGV4IDAzZTExZjkuLmM4YTQwNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZG92ZS9jbS1hNTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2NtLWE1MTAuYwpAQCAtODcsNyArODcsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKENNX0E1MTAsICJDb21wdWxhYiBDTS1BNTEwIEJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBjbV9hNTEwX2luaXQsCiAJLm1hcF9pbwkJPSBkb3ZlX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGRvdmVfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZG92ZS9kb3ZlLWRiLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvZG92ZS1kYi1zZXR1cC5jCmluZGV4IDJhYzM0ZWMuLjExZWEzNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZG92ZS9kb3ZlLWRiLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2RvdmUtZGItc2V0dXAuYwpAQCAtOTQsNyArOTQsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKERPVkVfREIsICJNYXJ2ZWxsIERCLU1WODhBUDUxMC1CUCBEZXZlbG9wbWVudCBCb2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZG92ZV9kYl9pbml0LAogCS5tYXBfaW8JCT0gZG92ZV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBkb3ZlX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZGE4YmYyYi4uNTkyOWNiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtOCw3ICs4LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvYnJpZGdlLXJlZ3MuaD4KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcglccnAsID1ET1ZFX1NCX1JFR1NfUEhZU19CQVNFCiAJbGRyCVxydiwgPURPVkVfU0JfUkVHU19WSVJUX0JBU0UKIAlvcnIJXHJwLCBccnAsICMweDAwMDEyMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjOTNmZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtZG92ZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKaW5kZXggMDg3YmM3Ny4uZDBjZThhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAogTUFDSElORV9TVEFSVChFQlNBMTEwLCAiRUJTQTExMCIpCiAJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDQwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDQwMCwKIAkucmVzZXJ2ZV9scDAJPSAxLAogCS5yZXNlcnZlX2xwMgk9IDEsCiAJLnNvZnRfcmVib290CT0gMSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA3ZWY1NjkwLi5iYjAyYzA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogKiovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHhmMDAwMDAwMAogCQlvcnIJXHJwLCBccnAsICMweDAwMDAwYmUwCiAJCW1vdglccnAsIFxydgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKaW5kZXggM2EwOGIxOC4uOTdhMjQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCkBAIC0xODIsNiArMTgyLDEzIEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKIAkgIFRlY2hub2xvZ2ljIFN5c3RlbXMgVFMtNzJ4eCBib2FyZC4KIAorY29uZmlnIE1BQ0hfVklTSU9OX0VQOTMwNworCWJvb2wgIlN1cHBvcnQgVmlzaW9uIEVuZ3JhdmluZyBTeXN0ZW1zIEVQOTMwNyBTb00iCisJZGVwZW5kcyBvbiBFUDkzWFhfU0RDRTBfUEhZU19PRkZTRVQKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUKKwkgIFZpc2lvbiBFbmdyYXZpbmcgU3lzdGVtcyBFUDkzMDcgU29NLgorCiBjaG9pY2UKIAlwcm9tcHQgIlNlbGVjdCBhIFVBUlQgZm9yIGVhcmx5IGtlcm5lbCBtZXNzYWdlcyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZQppbmRleCAzY2VkY2YyLi41NzQyMDlkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUKQEAgLTE1LDMgKzE1LDQgQEAKIG9iai0kKENPTkZJR19NQUNIX1NJTV9PTkUpCSs9IHNpbW9uZS5vCiBvYmotJChDT05GSUdfTUFDSF9TTkFQUEVSX0NMMTUpCSs9IHNuYXBwZXJjbDE1Lm8KIG9iai0kKENPTkZJR19NQUNIX1RTNzJYWCkJKz0gdHM3Mnh4Lm8KK29iai0kKENPTkZJR19NQUNIX1ZJU0lPTl9FUDkzMDcpKz0gdmlzaW9uX2VwOTMwNy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCmluZGV4IDYxYjk4Y2UuLjA3MTM0NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCkBAIC0zMyw3ICszMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQURTU1BIRVJFLCAiQURTIFNwaGVyZSBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCBjNjBmMDgxLi4yNDMyYTZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC0zMywxMSArMzMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAjaW5jbHVkZSA8bWFjaC9lcDkzeHhfa2V5cGFkLmg+CiAjaW5jbHVkZSA8bWFjaC9lcDkzeHhfc3BpLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWVwOTN4eC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTN4eC5jCmluZGV4IDk5NjliYjEuLjcwZWY4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzeHguYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9lZGI5M3h4LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgogI2luY2x1ZGUgPG1hY2gvZXA5M3h4X3NwaS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1lcDkzeHguaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTU5LDYgKzE2MCwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEVEQjkzeHggSTJTCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVkYjkzeHhfYXVkaW9fZGV2aWNlID0geworCS5uYW1lCQk9ICJlZGI5M3h4LWF1ZGlvIiwKKwkuaWQJCT0gLTEsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBlZGI5M3h4X2hhc19hdWRpbyh2b2lkKQogewogCXJldHVybiAobWFjaGluZV9pc19lZGI5MzAxKCkgfHwgbWFjaGluZV9pc19lZGI5MzAyKCkgfHwKQEAgLTE3MCw2ICsxNzYsNyBAQAogewogCWlmIChlZGI5M3h4X2hhc19hdWRpbygpKSB7CiAJCWVwOTN4eF9yZWdpc3Rlcl9pMnMoKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI5M3h4X2F1ZGlvX2RldmljZSk7CiAJfQogfQogCkBAIC0yNDAsNyArMjQ3LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzAxCiBNQUNISU5FX1NUQVJUKEVEQjkzMDEsICJDaXJydXMgTG9naWMgRURCOTMwMSBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMjUxLDcgKzI1OCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMwMgogTUFDSElORV9TVEFSVChFREI5MzAyLCAiQ2lycnVzIExvZ2ljIEVEQjkzMDIgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogR2VvcmdlIEthc2hwZXJrbyA8Z2VvcmdlQGNoYXMuY29tLnVhPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC0yNjIsNyArMjY5LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzAyQQogTUFDSElORV9TVEFSVChFREI5MzAyQSwgIkNpcnJ1cyBMb2dpYyBFREI5MzAyQSBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTI3Myw3ICsyODAsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0VEQjkzMDcKIE1BQ0hJTkVfU1RBUlQoRURCOTMwNywgIkNpcnJ1cyBMb2dpYyBFREI5MzA3IEV2YWx1YXRpb24gQm9hcmQiKQogCS8qIE1haW50YWluZXI6IEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC0yODQsNyArMjkxLDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzA3QQogTUFDSElORV9TVEFSVChFREI5MzA3QSwgIkNpcnJ1cyBMb2dpYyBFREI5MzA3QSBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTI5NSw3ICszMDIsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0VEQjkzMTIKIE1BQ0hJTkVfU1RBUlQoRURCOTMxMiwgIkNpcnJ1cyBMb2dpYyBFREI5MzEyIEV2YWx1YXRpb24gQm9hcmQiKQogCS8qIE1haW50YWluZXI6IFRvdWZlZXEgSHVzc2FpbiA8dG91ZmVlcV9odXNzYWluQGluZm9zeXMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC0zMDYsNyArMzEzLDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9FREI5MzE1CiBNQUNISU5FX1NUQVJUKEVEQjkzMTUsICJDaXJydXMgTG9naWMgRURCOTMxNSBFdmFsdWF0aW9uIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMzE3LDcgKzMyNCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfRURCOTMxNUEKIE1BQ0hJTkVfU1RBUlQoRURCOTMxNUEsICJDaXJydXMgTG9naWMgRURCOTMxNUEgRXZhbHVhdGlvbiBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dlc2JjOTMxMi5jCmluZGV4IDliZDMxNTIuLjQ1ZWUyMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dlc2JjOTMxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2dlc2JjOTMxMi5jCkBAIC0zMyw3ICszMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoR0VTQkM5MzEyLCAiR2xvbWF0aW9uIEdFU0JDLTkzMTItc3giKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IEVQOTNYWF9TRENFM19QSFlTX0JBU0VfU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGIyNWJjOTA3Li5hZjU0ZTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bWFjaC9lcDkzeHgtcmVncy5oPgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPUVQOTNYWF9BUEJfUEhZU19CQVNFCUAgUGh5c2ljYWwgYmFzZQogCQlsZHIJXHJ2LCA9RVA5M1hYX0FQQl9WSVJUX0JBU0UJQCB2aXJ0dWFsIGJhc2UKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDBjMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8tZXA5M3h4LmggYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby1lcDkzeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmMmVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8tZXA5M3h4LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEluY2x1ZGUgZmlsZSBmb3IgdGhlIEVQOTNYWCBHUElPIGNvbnRyb2xsZXIgbWFjaGluZSBzcGVjaWZpY3MgKi8KKworI2lmbmRlZiBfX0dQSU9fRVA5M1hYX0gKKyNkZWZpbmUgX19HUElPX0VQOTNYWF9ICisKKy8qIEdQSU8gcG9ydCBBLiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9BKHgpCQkoKHgpICsgMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzAJCUVQOTNYWF9HUElPX0xJTkVfQSgwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMQkJRVA5M1hYX0dQSU9fTElORV9BKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8yCQlFUDkzWFhfR1BJT19MSU5FX0EoMikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzMJCUVQOTNYWF9HUElPX0xJTkVfQSgzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNAkJRVA5M1hYX0dQSU9fTElORV9BKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU81CQlFUDkzWFhfR1BJT19MSU5FX0EoNSkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzYJCUVQOTNYWF9HUElPX0xJTkVfQSg2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNwkJRVA5M1hYX0dQSU9fTElORV9BKDcpCisKKy8qIEdQSU8gcG9ydCBCLiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9CKHgpCQkoKHgpICsgOCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzgJCUVQOTNYWF9HUElPX0xJTkVfQigwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPOQkJRVA5M1hYX0dQSU9fTElORV9CKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMAlFUDkzWFhfR1BJT19MSU5FX0IoMikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzExCUVQOTNYWF9HUElPX0xJTkVfQigzKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTIJRVA5M1hYX0dQSU9fTElORV9CKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMwlFUDkzWFhfR1BJT19MSU5FX0IoNSkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzE0CUVQOTNYWF9HUElPX0xJTkVfQig2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTUJRVA5M1hYX0dQSU9fTElORV9CKDcpCisKKy8qIEdQSU8gcG9ydCBDLiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9DKHgpCQkoKHgpICsgNDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMAkJRVA5M1hYX0dQSU9fTElORV9DKDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMQkJRVA5M1hYX0dQSU9fTElORV9DKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMgkJRVA5M1hYX0dQSU9fTElORV9DKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMwkJRVA5M1hYX0dQSU9fTElORV9DKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNAkJRVA5M1hYX0dQSU9fTElORV9DKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNQkJRVA5M1hYX0dQSU9fTElORV9DKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNgkJRVA5M1hYX0dQSU9fTElORV9DKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNwkJRVA5M1hYX0dQSU9fTElORV9DKDcpCisKKy8qIEdQSU8gcG9ydCBELiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9EKHgpCQkoKHgpICsgMjQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMAkJRVA5M1hYX0dQSU9fTElORV9EKDApCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMQkJRVA5M1hYX0dQSU9fTElORV9EKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMgkJRVA5M1hYX0dQSU9fTElORV9EKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMwkJRVA5M1hYX0dQSU9fTElORV9EKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNAkJRVA5M1hYX0dQSU9fTElORV9EKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNQkJRVA5M1hYX0dQSU9fTElORV9EKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNgkJRVA5M1hYX0dQSU9fTElORV9EKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNwkJRVA5M1hYX0dQSU9fTElORV9EKDcpCisKKy8qIEdQSU8gcG9ydCBFLiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FKHgpCQkoKHgpICsgMzIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfR1JMRUQJCUVQOTNYWF9HUElPX0xJTkVfRSgwKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JETEVECQlFUDkzWFhfR1BJT19MSU5FX0UoMSkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ESU9SbgkJRVA5M1hYX0dQSU9fTElORV9FKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFQ1MxbglFUDkzWFhfR1BJT19MSU5FX0UoMykKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVDUzJuCUVQOTNYWF9HUElPX0xJTkVfRSg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERURBMAkJRVA5M1hYX0dQSU9fTElORV9FKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFREExCQlFUDkzWFhfR1BJT19MSU5FX0UoNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVEQTIJCUVQOTNYWF9HUElPX0xJTkVfRSg3KQorCisvKiBHUElPIHBvcnQgRi4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRih4KQkJKCh4KSArIDE2KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1dQCQlFUDkzWFhfR1BJT19MSU5FX0YoMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQ0NEMQkJRVA5M1hYX0dQSU9fTElORV9GKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNDRDIJCUVQOTNYWF9HUElPX0xJTkVfRigyKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQlZEMQkJRVA5M1hYX0dQSU9fTElORV9GKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNCVkQyCQlFUDkzWFhfR1BJT19MSU5FX0YoNCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9WUzEJCUVQOTNYWF9HUElPX0xJTkVfRig1KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JFQURZCQlFUDkzWFhfR1BJT19MSU5FX0YoNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9WUzIJCUVQOTNYWF9HUElPX0xJTkVfRig3KQorCisvKiBHUElPIHBvcnQgRy4gICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRyh4KQkJKCh4KSArIDQ4KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VFQ0xLCQlFUDkzWFhfR1BJT19MSU5FX0coMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FRURBVAkJRVA5M1hYX0dQSU9fTElORV9HKDEpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfU0xBMAkJRVA5M1hYX0dQSU9fTElORV9HKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfU0xBMQkJRVA5M1hYX0dQSU9fTElORV9HKDMpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxMgkJRVA5M1hYX0dQSU9fTElORV9HKDQpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxMwkJRVA5M1hYX0dQSU9fTElORV9HKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxNAkJRVA5M1hYX0dQSU9fTElORV9HKDYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxNQkJRVA5M1hYX0dQSU9fTElORV9HKDcpCisKKy8qIEdQSU8gcG9ydCBILiAgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9IKHgpCQkoKHgpICsgNTYpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQwCQlFUDkzWFhfR1BJT19MSU5FX0goMCkKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDEJCUVQOTNYWF9HUElPX0xJTkVfSCgxKQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMgkJRVA5M1hYX0dQSU9fTElORV9IKDIpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQzCQlFUDkzWFhfR1BJT19MSU5FX0goMykKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDQJCUVQOTNYWF9HUElPX0xJTkVfSCg0KQorI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0RENQkJRVA5M1hYX0dQSU9fTElORV9IKDUpCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ2CQlFUDkzWFhfR1BJT19MSU5FX0goNikKKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDcJCUVQOTNYWF9HUElPX0xJTkVfSCg3KQorCisvKiBtYXhpbXVtIHZhbHVlIGZvciBncGlvIGxpbmUgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQVgJCUVQOTNYWF9HUElPX0xJTkVfSCg3KQorCisvKiBtYXhpbXVtIHZhbHVlIGZvciBpcnEgY2FwYWJsZSBsaW5lIGlkZW50aWZpZXJzICovCisjZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUQlFUDkzWFhfR1BJT19MSU5FX0YoNykKKworI2VuZGlmIC8qIF9fR1BJT19FUDkzWFhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYzU3MTUyYy4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDEyMCArMSBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtZXA5M3h4L2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19ICi0KLS8qIEdQSU8gcG9ydCBBLiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9BKHgpCQkoKHgpICsgMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzAJCUVQOTNYWF9HUElPX0xJTkVfQSgwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMQkJRVA5M1hYX0dQSU9fTElORV9BKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8yCQlFUDkzWFhfR1BJT19MSU5FX0EoMikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzMJCUVQOTNYWF9HUElPX0xJTkVfQSgzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNAkJRVA5M1hYX0dQSU9fTElORV9BKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU81CQlFUDkzWFhfR1BJT19MSU5FX0EoNSkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzYJCUVQOTNYWF9HUElPX0xJTkVfQSg2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPNwkJRVA5M1hYX0dQSU9fTElORV9BKDcpCi0KLS8qIEdQSU8gcG9ydCBCLiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9CKHgpCQkoKHgpICsgOCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzgJCUVQOTNYWF9HUElPX0xJTkVfQigwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPOQkJRVA5M1hYX0dQSU9fTElORV9CKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMAlFUDkzWFhfR1BJT19MSU5FX0IoMikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzExCUVQOTNYWF9HUElPX0xJTkVfQigzKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTIJRVA5M1hYX0dQSU9fTElORV9CKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRUdQSU8xMwlFUDkzWFhfR1BJT19MSU5FX0IoNSkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FR1BJTzE0CUVQOTNYWF9HUElPX0xJTkVfQig2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VHUElPMTUJRVA5M1hYX0dQSU9fTElORV9CKDcpCi0KLS8qIEdQSU8gcG9ydCBDLiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9DKHgpCQkoKHgpICsgNDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMAkJRVA5M1hYX0dQSU9fTElORV9DKDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMQkJRVA5M1hYX0dQSU9fTElORV9DKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMgkJRVA5M1hYX0dQSU9fTElORV9DKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XMwkJRVA5M1hYX0dQSU9fTElORV9DKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNAkJRVA5M1hYX0dQSU9fTElORV9DKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNQkJRVA5M1hYX0dQSU9fTElORV9DKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNgkJRVA5M1hYX0dQSU9fTElORV9DKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfUk9XNwkJRVA5M1hYX0dQSU9fTElORV9DKDcpCi0KLS8qIEdQSU8gcG9ydCBELiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9EKHgpCQkoKHgpICsgMjQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMAkJRVA5M1hYX0dQSU9fTElORV9EKDApCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMQkJRVA5M1hYX0dQSU9fTElORV9EKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMgkJRVA5M1hYX0dQSU9fTElORV9EKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MMwkJRVA5M1hYX0dQSU9fTElORV9EKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNAkJRVA5M1hYX0dQSU9fTElORV9EKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNQkJRVA5M1hYX0dQSU9fTElORV9EKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNgkJRVA5M1hYX0dQSU9fTElORV9EKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfQ09MNwkJRVA5M1hYX0dQSU9fTElORV9EKDcpCi0KLS8qIEdQSU8gcG9ydCBFLiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FKHgpCQkoKHgpICsgMzIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfR1JMRUQJCUVQOTNYWF9HUElPX0xJTkVfRSgwKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JETEVECQlFUDkzWFhfR1BJT19MSU5FX0UoMSkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ESU9SbgkJRVA5M1hYX0dQSU9fTElORV9FKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFQ1MxbglFUDkzWFhfR1BJT19MSU5FX0UoMykKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVDUzJuCUVQOTNYWF9HUElPX0xJTkVfRSg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0lERURBMAkJRVA5M1hYX0dQSU9fTElORV9FKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfSURFREExCQlFUDkzWFhfR1BJT19MSU5FX0UoNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9JREVEQTIJCUVQOTNYWF9HUElPX0xJTkVfRSg3KQotCi0vKiBHUElPIHBvcnQgRi4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRih4KQkJKCh4KSArIDE2KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1dQCQlFUDkzWFhfR1BJT19MSU5FX0YoMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQ0NEMQkJRVA5M1hYX0dQSU9fTElORV9GKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNDRDIJCUVQOTNYWF9HUElPX0xJTkVfRigyKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX01DQlZEMQkJRVA5M1hYX0dQSU9fTElORV9GKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUNCVkQyCQlFUDkzWFhfR1BJT19MSU5FX0YoNCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9WUzEJCUVQOTNYWF9HUElPX0xJTkVfRig1KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX1JFQURZCQlFUDkzWFhfR1BJT19MSU5FX0YoNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9WUzIJCUVQOTNYWF9HUElPX0xJTkVfRig3KQotCi0vKiBHUElPIHBvcnQgRy4gICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfRyh4KQkJKCh4KSArIDQ4KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0VFQ0xLCQlFUDkzWFhfR1BJT19MSU5FX0coMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9FRURBVAkJRVA5M1hYX0dQSU9fTElORV9HKDEpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfU0xBMAkJRVA5M1hYX0dQSU9fTElORV9HKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfU0xBMQkJRVA5M1hYX0dQSU9fTElORV9HKDMpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxMgkJRVA5M1hYX0dQSU9fTElORV9HKDQpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxMwkJRVA5M1hYX0dQSU9fTElORV9HKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxNAkJRVA5M1hYX0dQSU9fTElORV9HKDYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQxNQkJRVA5M1hYX0dQSU9fTElORV9HKDcpCi0KLS8qIEdQSU8gcG9ydCBILiAgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9IKHgpCQkoKHgpICsgNTYpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQwCQlFUDkzWFhfR1BJT19MSU5FX0goMCkKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDEJCUVQOTNYWF9HUElPX0xJTkVfSCgxKQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0REMgkJRVA5M1hYX0dQSU9fTElORV9IKDIpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQzCQlFUDkzWFhfR1BJT19MSU5FX0goMykKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDQJCUVQOTNYWF9HUElPX0xJTkVfSCg0KQotI2RlZmluZSBFUDkzWFhfR1BJT19MSU5FX0RENQkJRVA5M1hYX0dQSU9fTElORV9IKDUpCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfREQ2CQlFUDkzWFhfR1BJT19MSU5FX0goNikKLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9ERDcJCUVQOTNYWF9HUElPX0xJTkVfSCg3KQotCi0vKiBtYXhpbXVtIHZhbHVlIGZvciBncGlvIGxpbmUgaWRlbnRpZmllcnMgKi8KLSNkZWZpbmUgRVA5M1hYX0dQSU9fTElORV9NQVgJCUVQOTNYWF9HUElPX0xJTkVfSCg3KQotCi0vKiBtYXhpbXVtIHZhbHVlIGZvciBpcnEgY2FwYWJsZSBsaW5lIGlkZW50aWZpZXJzICovCi0jZGVmaW5lIEVQOTNYWF9HUElPX0xJTkVfTUFYX0lSUQlFUDkzWFhfR1BJT19MSU5FX0YoNykKLQotLyogbmV3IGdlbmVyaWMgR1BJTyBBUEkgLSBzZWUgRG9jdW1lbnRhdGlvbi9ncGlvLnR4dCAqLwotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotCi0vKgotICogTWFwIEdQSU8gQTAuLkE3ICAoMC4uNykgIHRvIGlycSA2NC4uNzEsCi0gKiAgICAgICAgICBCMC4uQjcgICg3Li4xNSkgdG8gaXJxIDcyLi43OSwgYW5kCi0gKiAgICAgICAgICBGMC4uRjcgKDE2Li4yNCkgdG8gaXJxIDgwLi44Ny4KLSAqLwotI2RlZmluZSBncGlvX3RvX2lycShncGlvKQlcCi0JKCgoZ3BpbykgPD0gRVA5M1hYX0dQSU9fTElORV9NQVhfSVJRKSA/ICg2NCArIChncGlvKSkgOiAtRUlOVkFMKQotCi0jZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gZ3Bpb190b19pcnEoMCkpCi0KLSNlbmRpZgorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L21pY3JvOS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKaW5kZXggN2FkZWE2Mi4uZTcyZjczNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvbWljcm85LmMKQEAgLTc3LDcgKzc3LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9NSUNSTzlICiBNQUNISU5FX1NUQVJUKE1JQ1JPOSwgIkNvbnRlYyBNaWNybzktSGlnaCIpCiAJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9TWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKQEAgLTg4LDcgKzg4LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9NSUNSTzlNCiBNQUNISU5FX1NUQVJUKE1JQ1JPOU0sICJDb250ZWMgTWljcm85LU1pZCIpCiAJLyogTWFpbnRhaW5lcjogSHViZXJ0IEZldXJzdGVpbiA8aHViZXJ0LmZldXJzdGVpbkBjb250ZWMuYXQ+ICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UzX1BIWVNfQkFTRV9BU1lOQyArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCkBAIC05OSw3ICs5OSw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85TAogTUFDSElORV9TVEFSVChNSUNSTzlMLCAiQ29udGVjIE1pY3JvOS1MaXRlIikKIAkvKiBNYWludGFpbmVyOiBIdWJlcnQgRmV1cnN0ZWluIDxodWJlcnQuZmV1cnN0ZWluQGNvbnRlYy5hdD4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApAQCAtMTEwLDcgKzExMCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfTUlDUk85UwogTUFDSElORV9TVEFSVChNSUNSTzlTLCAiQ29udGVjIE1pY3JvOS1TbGltIikKIAkvKiBNYWludGFpbmVyOiBIdWJlcnQgRmV1cnN0ZWluIDxodWJlcnQuZmV1cnN0ZWluQGNvbnRlYy5hdD4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX0FTWU5DICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NpbW9uZS5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc2ltb25lLmMKaW5kZXggODM5MmU5NS4uNTJlMDkwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc2ltb25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc2ltb25lLmMKQEAgLTE4LDEyICsxOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWVwOTN4eC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC01Myw2ICs1MywxNyBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaW1vbmVfYXVkaW9fZGV2aWNlID0geworCS5uYW1lCQk9ICJzaW1vbmUtYXVkaW8iLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzaW1vbmVfcmVnaXN0ZXJfYXVkaW8odm9pZCkKK3sKKwllcDkzeHhfcmVnaXN0ZXJfYWM5NygpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2ltb25lX2F1ZGlvX2RldmljZSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzaW1vbmVfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJZXA5M3h4X2luaXRfZGV2aWNlcygpOwpAQCAtNjEsMTIgKzcyLDEyIEBACiAJZXA5M3h4X3JlZ2lzdGVyX2ZiKCZzaW1vbmVfZmJfaW5mbyk7CiAJZXA5M3h4X3JlZ2lzdGVyX2kyYygmc2ltb25lX2kyY19ncGlvX2RhdGEsIHNpbW9uZV9pMmNfYm9hcmRfaW5mbywKIAkJCSAgICBBUlJBWV9TSVpFKHNpbW9uZV9pMmNfYm9hcmRfaW5mbykpOwotCWVwOTN4eF9yZWdpc3Rlcl9hYzk3KCk7CisJc2ltb25lX3JlZ2lzdGVyX2F1ZGlvKCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoU0lNX09ORSwgIlNpbXBsZW1hY2hpbmVzIFNpbS5PbmUgQm9hcmQiKQotLyogTWFpbnRhaW5lcjogUnlhbiBNYWxsb24gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTBfUEhZU19CQVNFICsgMHgxMDAsCisJLyogTWFpbnRhaW5lcjogUnlhbiBNYWxsb24gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGVwOTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc25hcHBlcmNsMTUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L3NuYXBwZXJjbDE1LmMKaW5kZXggMmU5YzYxNC4uODEyMWUzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvc25hcHBlcmNsMTUuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9zbmFwcGVyY2wxNS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KQEAgLTMwLDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWVwOTN4eC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xNTAsNiArMTUwLDE3IEBACiAJLmJwcAkJCT0gMTYsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbmFwcGVyY2wxNV9hdWRpb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNuYXBwZXJjbDE1LWF1ZGlvIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc25hcHBlcmNsMTVfcmVnaXN0ZXJfYXVkaW8odm9pZCkKK3sKKwllcDkzeHhfcmVnaXN0ZXJfaTJzKCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzbmFwcGVyY2wxNV9hdWRpb19kZXZpY2UpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc25hcHBlcmNsMTVfaW5pdF9tYWNoaW5lKHZvaWQpCiB7CiAJZXA5M3h4X2luaXRfZGV2aWNlcygpOwpAQCAtMTU3LDEzICsxNjgsMTMgQEAKIAllcDkzeHhfcmVnaXN0ZXJfaTJjKCZzbmFwcGVyY2wxNV9pMmNfZ3Bpb19kYXRhLCBzbmFwcGVyY2wxNV9pMmNfZGF0YSwKIAkJCSAgICBBUlJBWV9TSVpFKHNuYXBwZXJjbDE1X2kyY19kYXRhKSk7CiAJZXA5M3h4X3JlZ2lzdGVyX2ZiKCZzbmFwcGVyY2wxNV9mYl9pbmZvKTsKLQllcDkzeHhfcmVnaXN0ZXJfaTJzKCk7CisJc25hcHBlcmNsMTVfcmVnaXN0ZXJfYXVkaW8oKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNuYXBwZXJjbDE1X25hbmRfZGV2aWNlKTsKIH0KIAogTUFDSElORV9TVEFSVChTTkFQUEVSX0NMMTUsICJCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIENMMTUiKQogCS8qIE1haW50YWluZXI6IFJ5YW4gTWFsbG9uICovCi0JLmJvb3RfcGFyYW1zCT0gRVA5M1hYX1NEQ0UwX1BIWVNfQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZXA5M3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCiAJLnRpbWVyIAkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwppbmRleCBjMmQyY2Y0Li44YjJmMTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwpAQCAtMTE2LDggKzExNiw5IEBACiAJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwJLyogZm9yY2UgcmVhZC1vbmx5ICovCiAJfSwgewogCQkubmFtZQkJPSAiTGludXgiLAotCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkJLnNpemUJCT0gMCwJCQkvKiBmaWxsZWQgaW4gbGF0ZXIgKi8KKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19SRVRBSU4sCisJCS5zaXplCQk9IFRTNzJYWF9SRURCT09UX1BBUlRfU0laRSwKKwkJCQkvKiBsZWF2ZSBzbyBtdWNoIGZvciBsYXN0IHBhcnRpdGlvbiAqLwogCX0sIHsKIAkJLm5hbWUJCT0gIlJlZEJvb3QiLAogCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKQEAgLTEyNiwyOCArMTI3LDE0IEBACiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIHRzNzJ4eF9uYW5kX3NldF9wYXJ0cyh1aW50NjRfdCBzaXplLAotCQkJCSAgc3RydWN0IHBsYXRmb3JtX25hbmRfY2hpcCAqY2hpcCkKLXsKLQkvKiBGYWN0b3J5IFRTLTcyeHggYm9hcmRzIG9ubHkgY29tZSB3aXRoIDMyTWlCIG9yIDEyOE1pQiBOQU5EIG9wdGlvbnMgKi8KLQlpZiAoc2l6ZSA9PSBTWl8zMk0gfHwgc2l6ZSA9PSBTWl8xMjhNKSB7Ci0JCS8qIFNldCB0aGUgIkxpbnV4IiBwYXJ0aXRpb24gc2l6ZSAqLwotCQl0czcyeHhfbmFuZF9wYXJ0c1sxXS5zaXplID0gc2l6ZSAtIFRTNzJYWF9SRURCT09UX1BBUlRfU0laRTsKLQotCQljaGlwLT5wYXJ0aXRpb25zID0gdHM3Mnh4X25hbmRfcGFydHM7Ci0JCWNoaXAtPm5yX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKHRzNzJ4eF9uYW5kX3BhcnRzKTsKLQl9IGVsc2UgewotCQlwcl93YXJuaW5nKCJVbmtub3duIG5hbmQgZGlzayBzaXplOiVsbHVNaUJcbiIsIHNpemUgPj4gMjApOwotCX0KLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9uYW5kX2RhdGEgdHM3Mnh4X25hbmRfZGF0YSA9IHsKIAkuY2hpcCA9IHsKIAkJLm5yX2NoaXBzCT0gMSwKIAkJLmNoaXBfb2Zmc2V0CT0gMCwKIAkJLmNoaXBfZGVsYXkJPSAxNSwKIAkJLnBhcnRfcHJvYmVfdHlwZXMgPSB0czcyeHhfbmFuZF9wYXJ0X3Byb2JlcywKLQkJLnNldF9wYXJ0cwk9IHRzNzJ4eF9uYW5kX3NldF9wYXJ0cywKKwkJLnBhcnRpdGlvbnMJPSB0czcyeHhfbmFuZF9wYXJ0cywKKwkJLm5yX3BhcnRpdGlvbnMJPSBBUlJBWV9TSVpFKHRzNzJ4eF9uYW5kX3BhcnRzKSwKIAl9LAogCS5jdHJsID0gewogCQkuY21kX2N0cmwJPSB0czcyeHhfbmFuZF9od2NvbnRyb2wsCkBAIC0yNTcsNyArMjQ0LDcgQEAKIAogTUFDSElORV9TVEFSVChUUzcyWFgsICJUZWNobm9sb2dpYyBTeXN0ZW1zIFRTLTcyeHggU0JDIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBFUDkzWFhfU0RDRTNfUEhZU19CQVNFX1NZTkMgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHRzNzJ4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZXA5M3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmZXA5M3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdmlzaW9uX2VwOTMwNy5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdmlzaW9uX2VwOTMwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmU0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC92aXNpb25fZXA5MzA3LmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWVwOTN4eC92aXNpb25fZXA5MzA3LmMKKyAqIFZpc2lvbiBFbmdyYXZpbmcgU3lzdGVtcyBFUDkzMDcgU29NIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVmlzaW9uIEVuZ3JhdmluZyBTeXN0ZW1zCisgKiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvcGNhOTUzeC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvbW1jX3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9mYi5oPgorI2luY2x1ZGUgPG1hY2gvZXA5M3h4X3NwaS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGF0aWMgSS9PIG1hcHBpbmdzIGZvciB0aGUgRlBHQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZJU0lPTl9QSFlTX0JBU0UJRVA5M1hYX0NTN19QSFlTX0JBU0UKKyNkZWZpbmUgVklTSU9OX1ZJUlRfQkFTRQkweGZlYmZmMDAwCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdmlzaW9uX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBWSVNJT05fVklSVF9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oVklTSU9OX1BIWVNfQkFTRSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHZpc2lvbl9tYXBfaW8odm9pZCkKK3sKKwllcDkzeHhfbWFwX2lvKCk7CisKKwlpb3RhYmxlX2luaXQodmlzaW9uX2lvX2Rlc2MsIEFSUkFZX1NJWkUodmlzaW9uX2lvX2Rlc2MpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV0aGVybmV0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIHZpc2lvbl9ldGhfZGF0YSBfX2luaXRkYXRhID0geworCS5waHlfaWQJCT0gMSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGcmFtZWJ1ZmZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZJU0lPTl9MQ0RfRU5BQkxFCUVQOTNYWF9HUElPX0xJTkVfRUdQSU8xCisKK3N0YXRpYyBpbnQgdmlzaW9uX2xjZF9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBncGlvX3JlcXVlc3Rfb25lKFZJU0lPTl9MQ0RfRU5BQkxFLCBHUElPRl9JTklUX0hJR0gsCisJCQkJZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcDkzeHhfZGV2Y2ZnX2NsZWFyX2JpdHMoRVA5M1hYX1NZU0NPTl9ERVZDRkdfUkFTIHwKKwkJCQkgRVA5M1hYX1NZU0NPTl9ERVZDRkdfUkFTT05QMyB8CisJCQkJIEVQOTNYWF9TWVNDT05fREVWQ0ZHX0VYVkMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpc2lvbl9sY2RfdGVhcmRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlncGlvX2ZyZWUoVklTSU9OX0xDRF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCB2aXNpb25fbGNkX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpZiAoYmxhbmtfbW9kZSkKKwkJZ3Bpb19zZXRfdmFsdWUoVklTSU9OX0xDRF9FTkFCTEUsIDApOworCWVsc2UKKwkJZ3Bpb19zZXRfdmFsdWUoVklTSU9OX0xDRF9FTkFCTEUsIDEpOworfQorCitzdGF0aWMgc3RydWN0IGVwOTN4eGZiX21hY2hfaW5mbyBlcDkzeHhmYl9pbmZvIF9faW5pdGRhdGEgPSB7CisJLm51bV9tb2Rlcwk9IEVQOTNYWEZCX1VTRV9NT0RFREIsCisJLmJwcAkJPSAxNiwKKwkuZmxhZ3MJCT0gRVA5M1hYRkJfVVNFX1NEQ1NOMCB8IEVQOTNYWEZCX1BDTEtfRkFMTElORywKKwkuc2V0dXAJCT0gdmlzaW9uX2xjZF9zZXR1cCwKKwkudGVhcmRvd24JPSB2aXNpb25fbGNkX3RlYXJkb3duLAorCS5ibGFuawkJPSB2aXNpb25fbGNkX2JsYW5rLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR1BJTyBFeHBhbmRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQQ0E5NTM5Xzc0X0dQSU9fQkFTRQkoRVA5M1hYX0dQSU9fTElORV9NQVggKyAxKQorI2RlZmluZSBQQ0E5NTM5Xzc1X0dQSU9fQkFTRQkoUENBOTUzOV83NF9HUElPX0JBU0UgKyAxNikKKyNkZWZpbmUgUENBOTUzOV83Nl9HUElPX0JBU0UJKFBDQTk1MzlfNzVfR1BJT19CQVNFICsgMTYpCisjZGVmaW5lIFBDQTk1MzlfNzdfR1BJT19CQVNFCShQQ0E5NTM5Xzc2X0dQSU9fQkFTRSArIDE2KQorCitzdGF0aWMgc3RydWN0IHBjYTk1M3hfcGxhdGZvcm1fZGF0YSBwY2E5NTN4Xzc0X2dwaW9fZGF0YSA9IHsKKwkuZ3Bpb19iYXNlCT0gUENBOTUzOV83NF9HUElPX0JBU0UsCisJLmlycV9iYXNlCT0gRVA5M1hYX0JPQVJEX0lSUSgwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIHBjYTk1M3hfNzVfZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBQQ0E5NTM5Xzc1X0dQSU9fQkFTRSwKKwkuaXJxX2Jhc2UJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIHBjYTk1M3hfNzZfZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBQQ0E5NTM5Xzc2X0dQSU9fQkFTRSwKKwkuaXJxX2Jhc2UJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIHBjYTk1M3hfNzdfZ3Bpb19kYXRhID0geworCS5ncGlvX2Jhc2UJPSBQQ0E5NTM5Xzc3X0dQSU9fQkFTRSwKKwkuaXJxX2Jhc2UJPSAtMSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJMkMgQnVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSB2aXNpb25faTJjX2dwaW9fZGF0YSBfX2luaXRkYXRhID0geworCS5zZGFfcGluCQk9IEVQOTNYWF9HUElPX0xJTkVfRUVEQVQsCisJLnNjbF9waW4JCT0gRVA5M1hYX0dQSU9fTElORV9FRUNMSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gdmlzaW9uX2kyY19pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJpc2wxMjA4IiwgMHg2ZiksCisJCS5pcnEJCT0gSVJRX0VQOTNYWF9FWFQxLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInBjYTk1MzkiLCAweDc0KSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGNhOTUzeF83NF9ncGlvX2RhdGEsCisJCS5pcnEJCT0gZ3Bpb190b19pcnEoRVA5M1hYX0dQSU9fTElORV9GKDcpKSwKKwl9LCB7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2E5NTM5IiwgMHg3NSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBjYTk1M3hfNzVfZ3Bpb19kYXRhLAorCX0sIHsKKwkJSTJDX0JPQVJEX0lORk8oInBjYTk1MzkiLCAweDc2KSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcGNhOTUzeF83Nl9ncGlvX2RhdGEsCisJfSwgeworCQlJMkNfQk9BUkRfSU5GTygicGNhOTUzOSIsIDB4NzcpLAorCQkucGxhdGZvcm1fZGF0YQk9ICZwY2E5NTN4Xzc3X2dwaW9fZGF0YSwKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNQSSBGbGFzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZJU0lPTl9TUElfRkxBU0hfQ1MJRVA5M1hYX0dQSU9fTElORV9FR1BJTzcKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHZpc2lvbl9zcGlfZmxhc2hfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJPSAiU1BJIGJvb3RzdHJhcCIsCisJCS5vZmZzZXQJPSAwLAorCQkuc2l6ZQk9IFNaXzRLLAorCX0sIHsKKwkJLm5hbWUJPSAiQm9vdHN0cmFwIGNvbmZpZyIsCisJCS5vZmZzZXQJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCT0gU1pfNEssCisJfSwgeworCQkubmFtZQk9ICJTeXN0ZW0gY29uZmlnIiwKKwkJLm9mZnNldAk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgdmlzaW9uX3NwaV9mbGFzaF9kYXRhID0geworCS5uYW1lCQk9ICJTUEkgRmxhc2giLAorCS5wYXJ0cwkJPSB2aXNpb25fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRSh2aXNpb25fc3BpX2ZsYXNoX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIGludCB2aXNpb25fc3BpX2ZsYXNoX2h3X3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGdwaW9fcmVxdWVzdF9vbmUoVklTSU9OX1NQSV9GTEFTSF9DUywgR1BJT0ZfSU5JVF9ISUdILAorCQkJCXNwaS0+bW9kYWxpYXMpOworfQorCitzdGF0aWMgdm9pZCB2aXNpb25fc3BpX2ZsYXNoX2h3X2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlncGlvX2ZyZWUoVklTSU9OX1NQSV9GTEFTSF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIHZpc2lvbl9zcGlfZmxhc2hfaHdfY3NfY29udHJvbChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgdmFsdWUpCit7CisJZ3Bpb19zZXRfdmFsdWUoVklTSU9OX1NQSV9GTEFTSF9DUywgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGVwOTN4eF9zcGlfY2hpcF9vcHMgdmlzaW9uX3NwaV9mbGFzaF9odyA9IHsKKwkuc2V0dXAJCT0gdmlzaW9uX3NwaV9mbGFzaF9od19zZXR1cCwKKwkuY2xlYW51cAk9IHZpc2lvbl9zcGlfZmxhc2hfaHdfY2xlYW51cCwKKwkuY3NfY29udHJvbAk9IHZpc2lvbl9zcGlfZmxhc2hfaHdfY3NfY29udHJvbCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTUEkgU0QvTU1DIGhvc3QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWSVNJT05fU1BJX01NQ19DUwlFUDkzWFhfR1BJT19MSU5FX0coMikKKyNkZWZpbmUgVklTSU9OX1NQSV9NTUNfV1AJRVA5M1hYX0dQSU9fTElORV9GKDApCisjZGVmaW5lIFZJU0lPTl9TUElfTU1DX0NECUVQOTNYWF9HUElPX0xJTkVfRUdQSU8xNQorCitzdGF0aWMgc3RydWN0IGdwaW8gdmlzaW9uX3NwaV9tbWNfZ3Bpb3NbXSA9IHsKKwl7IFZJU0lPTl9TUElfTU1DX1dQLCBHUElPRl9ESVJfSU4sICJtbWNfc3BpOndwIiB9LAorCXsgVklTSU9OX1NQSV9NTUNfQ0QsIEdQSU9GX0RJUl9JTiwgIm1tY19zcGk6Y2QiIH0sCit9OworCitzdGF0aWMgaW50IHZpc2lvbl9zcGlfbW1jX2luaXQoc3RydWN0IGRldmljZSAqcGRldiwKKwkJCWlycXJldHVybl90ICgqZnVuYykoaW50LCB2b2lkICopLCB2b2lkICpwZGF0YSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KHZpc2lvbl9zcGlfbW1jX2dwaW9zLAorCQkJCSBBUlJBWV9TSVpFKHZpc2lvbl9zcGlfbW1jX2dwaW9zKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGdwaW9fc2V0X2RlYm91bmNlKFZJU0lPTl9TUElfTU1DX0NELCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZXJyOworCisJZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoVklTSU9OX1NQSV9NTUNfQ0QpLCBmdW5jLAorCQkJSVJRX1RZUEVfRURHRV9CT1RILCAibW1jX3NwaTpjZCIsIHBkYXRhKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZXJyOworCisJcmV0dXJuIDA7CisKK2V4aXRfZXJyOgorCWdwaW9fZnJlZV9hcnJheSh2aXNpb25fc3BpX21tY19ncGlvcywgQVJSQVlfU0laRSh2aXNpb25fc3BpX21tY19ncGlvcykpOworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIHZvaWQgdmlzaW9uX3NwaV9tbWNfZXhpdChzdHJ1Y3QgZGV2aWNlICpwZGV2LCB2b2lkICpwZGF0YSkKK3sKKwlmcmVlX2lycShncGlvX3RvX2lycShWSVNJT05fU1BJX01NQ19DRCksIHBkYXRhKTsKKwlncGlvX2ZyZWVfYXJyYXkodmlzaW9uX3NwaV9tbWNfZ3Bpb3MsIEFSUkFZX1NJWkUodmlzaW9uX3NwaV9tbWNfZ3Bpb3MpKTsKK30KKworc3RhdGljIGludCB2aXNpb25fc3BpX21tY19nZXRfcm8oc3RydWN0IGRldmljZSAqcGRldikKK3sKKwlyZXR1cm4gISFncGlvX2dldF92YWx1ZShWSVNJT05fU1BJX01NQ19XUCk7Cit9CisKK3N0YXRpYyBpbnQgdmlzaW9uX3NwaV9tbWNfZ2V0X2NkKHN0cnVjdCBkZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuICFncGlvX2dldF92YWx1ZShWSVNJT05fU1BJX01NQ19DRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW1jX3NwaV9wbGF0Zm9ybV9kYXRhIHZpc2lvbl9zcGlfbW1jX2RhdGEgPSB7CisJLmluaXQJCT0gdmlzaW9uX3NwaV9tbWNfaW5pdCwKKwkuZXhpdAkJPSB2aXNpb25fc3BpX21tY19leGl0LAorCS5nZXRfcm8JCT0gdmlzaW9uX3NwaV9tbWNfZ2V0X3JvLAorCS5nZXRfY2QJCT0gdmlzaW9uX3NwaV9tbWNfZ2V0X2NkLAorCS5kZXRlY3RfZGVsYXkJPSAxMDAsCisJLnBvd2VydXBfbXNlY3MJPSAxMDAsCisJLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQsCit9OworCitzdGF0aWMgaW50IHZpc2lvbl9zcGlfbW1jX2h3X3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGdwaW9fcmVxdWVzdF9vbmUoVklTSU9OX1NQSV9NTUNfQ1MsIEdQSU9GX0lOSVRfSElHSCwKKwkJCQlzcGktPm1vZGFsaWFzKTsKK30KKworc3RhdGljIHZvaWQgdmlzaW9uX3NwaV9tbWNfaHdfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWdwaW9fZnJlZShWSVNJT05fU1BJX01NQ19DUyk7Cit9CisKK3N0YXRpYyB2b2lkIHZpc2lvbl9zcGlfbW1jX2h3X2NzX2NvbnRyb2woc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCWdwaW9fc2V0X3ZhbHVlKFZJU0lPTl9TUElfTU1DX0NTLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X3NwaV9jaGlwX29wcyB2aXNpb25fc3BpX21tY19odyA9IHsKKwkuc2V0dXAJCT0gdmlzaW9uX3NwaV9tbWNfaHdfc2V0dXAsCisJLmNsZWFudXAJPSB2aXNpb25fc3BpX21tY19od19jbGVhbnVwLAorCS5jc19jb250cm9sCT0gdmlzaW9uX3NwaV9tbWNfaHdfY3NfY29udHJvbCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTUEkgQnVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gdmlzaW9uX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcwkJPSAic3N0MjVsIiwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnZpc2lvbl9zcGlfZmxhc2hfZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YQk9ICZ2aXNpb25fc3BpX2ZsYXNoX2h3LAorCQkubWF4X3NwZWVkX2h6CQk9IDIwMDAwMDAwLAorCQkuYnVzX251bQkJPSAwLAorCQkuY2hpcF9zZWxlY3QJCT0gMCwKKwkJLm1vZGUJCQk9IFNQSV9NT0RFXzMsCisJfSwgeworCQkubW9kYWxpYXMJCT0gIm1tY19zcGkiLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmdmlzaW9uX3NwaV9tbWNfZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YQk9ICZ2aXNpb25fc3BpX21tY19odywKKwkJLm1heF9zcGVlZF9oegkJPSAyMDAwMDAwMCwKKwkJLmJ1c19udW0JCT0gMCwKKwkJLmNoaXBfc2VsZWN0CQk9IDEsCisJCS5tb2RlCQkJPSBTUElfTU9ERV8zLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGVwOTN4eF9zcGlfaW5mbyB2aXNpb25fc3BpX21hc3RlciBfX2luaXRkYXRhID0geworCS5udW1fY2hpcHNlbGVjdAkJPSBBUlJBWV9TSVpFKHZpc2lvbl9zcGlfYm9hcmRfaW5mbyksCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFjaGluZSBJbml0aWFsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX2luaXQgdmlzaW9uX2luaXRfbWFjaGluZSh2b2lkKQoreworCWVwOTN4eF9pbml0X2RldmljZXMoKTsKKwllcDkzeHhfcmVnaXN0ZXJfZmxhc2goMiwgRVA5M1hYX0NTNl9QSFlTX0JBU0UsIFNaXzY0TSk7CisJZXA5M3h4X3JlZ2lzdGVyX2V0aCgmdmlzaW9uX2V0aF9kYXRhLCAxKTsKKwllcDkzeHhfcmVnaXN0ZXJfZmIoJmVwOTN4eGZiX2luZm8pOworCWVwOTN4eF9yZWdpc3Rlcl9wd20oMSwgMCk7CisKKwkvKgorCSAqIFJlcXVlc3QgdGhlIGdwaW8gZXhwYW5kZXIncyBpbnRlcnJ1cHQgZ3BpbyBsaW5lIG5vdyB0byBwcmV2ZW50CisJICogdGhlIGtlcm5lbCBmcm9tIGRvaW5nIGEgV0FSTiBpbiBncGlvbGliOmdwaW9fZW5zdXJlX3JlcXVlc3RlZCgpLgorCSAqLworCWlmIChncGlvX3JlcXVlc3Rfb25lKEVQOTNYWF9HUElPX0xJTkVfRig3KSwgR1BJT0ZfRElSX0lOLAorCQkJCSJwY2E5NTM5Ojc0IikpCisJCXByX3dhcm4oImNhbm5vdCByZXF1ZXN0IGludGVycnVwdCBncGlvIGZvciBwY2E5NTM5Ojc0XG4iKTsKKworCWVwOTN4eF9yZWdpc3Rlcl9pMmMoJnZpc2lvbl9pMmNfZ3Bpb19kYXRhLCB2aXNpb25faTJjX2luZm8sCisJCQkJQVJSQVlfU0laRSh2aXNpb25faTJjX2luZm8pKTsKKwllcDkzeHhfcmVnaXN0ZXJfc3BpKCZ2aXNpb25fc3BpX21hc3RlciwgdmlzaW9uX3NwaV9ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUodmlzaW9uX3NwaV9ib2FyZF9pbmZvKSk7Cit9CisKK01BQ0hJTkVfU1RBUlQoVklTSU9OX0VQOTMwNywgIlZpc2lvbiBFbmdyYXZpbmcgU3lzdGVtcyBFUDkzMDciKQorCS8qIE1haW50YWluZXI6IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gdmlzaW9uX21hcF9pbywKKwkuaW5pdF9pcnEJPSBlcDkzeHhfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZlcDkzeHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IHZpc2lvbl9pbml0X21hY2hpbmUsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0ZWMwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKQEAgLTAsMCArMSwzNDkgQEAKKyMgYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZworIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorIwkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIKKworIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBFWFlOT1M0CisKK2lmIEFSQ0hfRVhZTk9TCisKK21lbnUgIlNBTVNVTkcgRVhZTk9TIFNvQ3MgU3VwcG9ydCIKKworY2hvaWNlCisJcHJvbXB0ICJFWFlOT1MgU3lzdGVtIFR5cGUiCisJZGVmYXVsdCBBUkNIX0VYWU5PUzQKKworY29uZmlnIEFSQ0hfRVhZTk9TNAorCWJvb2wgIlNBTVNVTkcgRVhZTk9TNCIKKwloZWxwCisJICBTYW1zdW5nIEVYWU5PUzQgU29DcyBiYXNlZCBzeXN0ZW1zCisKK2VuZGNob2ljZQorCitjb21tZW50ICJFWFlOT1MgU29DcyIKKworY29uZmlnIENQVV9FWFlOT1M0MjEwCisJYm9vbCAiU0FNU1VORyBFWFlOT1M0MjEwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVJDSF9FWFlOT1M0CisJc2VsZWN0IFNBTVNVTkdfRE1BREVWCisJc2VsZWN0IEFSTV9DUFVfU1VTUEVORCBpZiBQTQorCXNlbGVjdCBTNVBfUE0gaWYgUE0KKwlzZWxlY3QgUzVQX1NMRUVQIGlmIFBNCisJaGVscAorCSAgRW5hYmxlIEVYWU5PUzQyMTAgQ1BVIHN1cHBvcnQKKworY29uZmlnIFNPQ19FWFlOT1M0MjEyCisJYm9vbCAiU0FNU1VORyBFWFlOT1M0MjEyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVJDSF9FWFlOT1M0CisJc2VsZWN0IFM1UF9QTSBpZiBQTQorCXNlbGVjdCBTNVBfU0xFRVAgaWYgUE0KKwloZWxwCisJICBFbmFibGUgRVhZTk9TNDIxMiBTb0Mgc3VwcG9ydAorCitjb25maWcgU09DX0VYWU5PUzQ0MTIKKwlib29sICJTQU1TVU5HIEVYWU5PUzQ0MTIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUzQKKwloZWxwCisJICBFbmFibGUgRVhZTk9TNDQxMiBTb0Mgc3VwcG9ydAorCitjb25maWcgRVhZTk9TNF9NQ1QKKwlib29sCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXNlIE1DVCAoTXVsdGkgQ29yZSBUaW1lcikgYXMga2VybmVsIHRpbWVycworCitjb25maWcgRVhZTk9TNF9ERVZfQUhDSQorCWJvb2wKKwloZWxwCisJICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgQUhDSQorCitjb25maWcgRVhZTk9TNF9TRVRVUF9GSU1EMAorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgRklNRDAuCisKK2NvbmZpZyBFWFlOT1M0X0RFVl9QRAorCWJvb2wKKwloZWxwCisJICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgUG93ZXIgRG9tYWluCisKK2NvbmZpZyBFWFlOT1M0X0RFVl9TWVNNTVUKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFNZU1RFTSBNTVUgaW4gRVhZTk9TNAorCitjb25maWcgRVhZTk9TNF9ERVZfRFdNQ0kKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIERXTUNJCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzEKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMS4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDMgorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyAyLgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9JMkMzCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDMuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzQKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNC4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDNQorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyA1LgorCitjb25maWcgRVhZTk9TNF9TRVRVUF9JMkM2CisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDYuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzcKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNy4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfS0VZUEFECisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBrZXlwYWQuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX1NESENJCisJYm9vbAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJX0dQSU8KKwloZWxwCisJICBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBFWFlOT1M0IGJhc2VkIFNESENJIHN5c3RlbXMuCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX1NESENJX0dQSU8KKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFNESENJIGdwaW8uCisKK2NvbmZpZyBFWFlOT1M0X1NFVFVQX0ZJTUMKKwlib29sCisJaGVscAorCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIHRoZSBjYW1lcmEgaW50ZXJmYWNlcy4KKworY29uZmlnIEVYWU5PUzRfU0VUVVBfVVNCX1BIWQorCWJvb2wKKwloZWxwCisJICBDb21tb24gc2V0dXAgY29kZSBmb3IgVVNCIFBIWSBjb250cm9sbGVyCisKKyMgbWFjaGluZSBzdXBwb3J0CisKK2lmIEFSQ0hfRVhZTk9TNAorCitjb21tZW50ICJFWFlOT1M0MjEwIEJvYXJkcyIKKworY29uZmlnIE1BQ0hfU01ES0MyMTAKKwlib29sICJTTURLQzIxMCIKKwlzZWxlY3QgTUFDSF9TTURLVjMxMAorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBTTURLQzIxMAorCitjb25maWcgTUFDSF9TTURLVjMxMAorCWJvb2wgIlNNREtWMzEwIgorCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAorCXNlbGVjdCBTNVBfREVWX0ZJTUQwCisJc2VsZWN0IFMzQ19ERVZfUlRDCisJc2VsZWN0IFMzQ19ERVZfV0RUCisJc2VsZWN0IFMzQ19ERVZfSTJDMQorCXNlbGVjdCBTNVBfREVWX0ZJTUMwCisJc2VsZWN0IFM1UF9ERVZfRklNQzEKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMgorCXNlbGVjdCBTNVBfREVWX0ZJTUMzCisJc2VsZWN0IFM1UF9ERVZfSTJDX0hETUlQSFkKKwlzZWxlY3QgUzVQX0RFVl9NRkMKKwlzZWxlY3QgUzVQX0RFVl9UVgorCXNlbGVjdCBTNVBfREVWX1VTQl9FSENJCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzEKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzIKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzMKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCisJc2VsZWN0IEVYWU5PUzRfREVWX0FIQ0kKKwlzZWxlY3QgU0FNU1VOR19ERVZfS0VZUEFECisJc2VsZWN0IEVYWU5PUzRfREVWX1BECisJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQorCXNlbGVjdCBFWFlOT1M0X0RFVl9TWVNNTVUKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9GSU1EMAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9LRVlQQUQKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1VTQl9QSFkKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgU01ES1YzMTAKKworY29uZmlnIE1BQ0hfQVJNTEVYNDIxMAorCWJvb2wgIkFSTUxFWDQyMTAiCisJc2VsZWN0IENQVV9FWFlOT1M0MjEwCisJc2VsZWN0IFMzQ19ERVZfUlRDCisJc2VsZWN0IFMzQ19ERVZfV0RUCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzIKKwlzZWxlY3QgUzNDX0RFVl9IU01NQzMKKwlzZWxlY3QgRVhZTk9TNF9ERVZfQUhDSQorCXNlbGVjdCBFWFlOT1M0X0RFVl9TWVNNTVUKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBBUk1MRVg0MjEwIGJhc2VkIG9uIEVYWU5PUzQyMTAKKworY29uZmlnIE1BQ0hfVU5JVkVSU0FMX0MyMTAKKwlib29sICJNb2JpbGUgVU5JVkVSU0FMX0MyMTAgQm9hcmQiCisJc2VsZWN0IENQVV9FWFlOT1M0MjEwCisJc2VsZWN0IFM1UF9HUElPX0lOVAorCXNlbGVjdCBTNVBfREVWX0ZJTUMwCisJc2VsZWN0IFM1UF9ERVZfRklNQzEKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMgorCXNlbGVjdCBTNVBfREVWX0ZJTUMzCisJc2VsZWN0IFM1UF9ERVZfQ1NJUzAKKwlzZWxlY3QgUzVQX0RFVl9GSU1EMAorCXNlbGVjdCBTM0NfREVWX0hTTU1DCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMyCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMzCisJc2VsZWN0IFMzQ19ERVZfSTJDMQorCXNlbGVjdCBTM0NfREVWX0kyQzMKKwlzZWxlY3QgUzNDX0RFVl9JMkM1CisJc2VsZWN0IFM1UF9ERVZfSTJDX0hETUlQSFkKKwlzZWxlY3QgUzVQX0RFVl9NRkMKKwlzZWxlY3QgUzVQX0RFVl9PTkVOQU5ECisJc2VsZWN0IFM1UF9ERVZfVFYKKwlzZWxlY3QgRVhZTk9TNF9ERVZfUEQKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9GSU1EMAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNQworCXNlbGVjdCBTNVBfU0VUVVBfTUlQSVBIWQorCWhlbHAKKwkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBNb2JpbGUgVW5pdmVyc2FsIFM1UEMyMTAgUmVmZXJlbmNlCisJICBCb2FyZC4KKworY29uZmlnIE1BQ0hfTlVSSQorCWJvb2wgIk1vYmlsZSBOVVJJIEJvYXJkIgorCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAorCXNlbGVjdCBTNVBfR1BJT19JTlQKKwlzZWxlY3QgUzNDX0RFVl9XRFQKKwlzZWxlY3QgUzNDX0RFVl9SVEMKKwlzZWxlY3QgUzVQX0RFVl9GSU1EMAorCXNlbGVjdCBTM0NfREVWX0hTTU1DCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMyCisJc2VsZWN0IFMzQ19ERVZfSFNNTUMzCisJc2VsZWN0IFMzQ19ERVZfSTJDMQorCXNlbGVjdCBTM0NfREVWX0kyQzMKKwlzZWxlY3QgUzNDX0RFVl9JMkM1CisJc2VsZWN0IFM1UF9ERVZfQ1NJUzAKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMAorCXNlbGVjdCBTNVBfREVWX0ZJTUMxCisJc2VsZWN0IFM1UF9ERVZfRklNQzIKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMworCXNlbGVjdCBTNVBfREVWX01GQworCXNlbGVjdCBTNVBfREVWX1VTQl9FSENJCisJc2VsZWN0IFM1UF9TRVRVUF9NSVBJUEhZCisJc2VsZWN0IEVYWU5PUzRfREVWX1BECisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNQworCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0ZJTUQwCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzMKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkM1CisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9VU0JfUEhZCisJc2VsZWN0IFM1UF9TRVRVUF9NSVBJUEhZCisJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQorCXNlbGVjdCBTQU1TVU5HX0RFVl9BREMKKwloZWxwCisJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIE5VUkkgQm9hcmQuCisKK2NvbmZpZyBNQUNIX09SSUdFTgorCWJvb2wgIk9SSUdFTiIKKwlzZWxlY3QgQ1BVX0VYWU5PUzQyMTAKKwlzZWxlY3QgUzNDX0RFVl9SVEMKKwlzZWxlY3QgUzNDX0RFVl9XRFQKKwlzZWxlY3QgUzNDX0RFVl9IU01NQworCXNlbGVjdCBTM0NfREVWX0hTTU1DMgorCXNlbGVjdCBTNVBfREVWX0ZJTUMwCisJc2VsZWN0IFM1UF9ERVZfRklNQzEKKwlzZWxlY3QgUzVQX0RFVl9GSU1DMgorCXNlbGVjdCBTNVBfREVWX0ZJTUMzCisJc2VsZWN0IFM1UF9ERVZfRklNRDAKKwlzZWxlY3QgUzVQX0RFVl9JMkNfSERNSVBIWQorCXNlbGVjdCBTNVBfREVWX01GQworCXNlbGVjdCBTNVBfREVWX1RWCisJc2VsZWN0IFM1UF9ERVZfVVNCX0VIQ0kKKwlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCisJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQorCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0ZJTUQwCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9VU0JfUEhZCisJaGVscAorCSAgTWFjaGluZSBzdXBwb3J0IGZvciBPUklHRU4gYmFzZWQgb24gU2Ftc3VuZyBFWFlOT1M0MjEwCisKK2NvbW1lbnQgIkVYWU5PUzQyMTIgQm9hcmRzIgorCitjb25maWcgTUFDSF9TTURLNDIxMgorCWJvb2wgIlNNREs0MjEyIgorCXNlbGVjdCBTT0NfRVhZTk9TNDIxMgorCXNlbGVjdCBTM0NfREVWX0hTTU1DMgorCXNlbGVjdCBTM0NfREVWX0hTTU1DMworCXNlbGVjdCBTM0NfREVWX0kyQzEKKwlzZWxlY3QgUzNDX0RFVl9JMkMzCisJc2VsZWN0IFMzQ19ERVZfSTJDNworCXNlbGVjdCBTM0NfREVWX1JUQworCXNlbGVjdCBTM0NfREVWX1dEVAorCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKKwlzZWxlY3QgU0FNU1VOR19ERVZfS0VZUEFECisJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKKwlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMzCisJc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDNworCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0tFWVBBRAorCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJCisJaGVscAorCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIFNNREs0MjEyCisKK2NvbW1lbnQgIkVYWU5PUzQ0MTIgQm9hcmRzIgorCitjb25maWcgTUFDSF9TTURLNDQxMgorCWJvb2wgIlNNREs0NDEyIgorCXNlbGVjdCBTT0NfRVhZTk9TNDQxMgorCXNlbGVjdCBNQUNIX1NNREs0MjEyCisJaGVscAorCSAgTWFjaGluZSBzdXBwb3J0IGZvciBTYW1zdW5nIFNNREs0NDEyCitlbmRpZgorCitpZiBBUkNIX0VYWU5PUzQKKworY29tbWVudCAiQ29uZmlndXJhdGlvbiBmb3IgSFNNTUMgOC1iaXQgYnVzIHdpZHRoIgorCitjb25maWcgRVhZTk9TNF9TREhDSV9DSDBfOEJJVAorCWJvb2wgIkNoYW5uZWwgMCB3aXRoIDgtYml0IGJ1cyIKKwloZWxwCisJICBTdXBwb3J0IEhTTU1DIENoYW5uZWwgMCA4LWJpdCBidXMuCisJICBJZiBzZWxlY3RlZCwgQ2hhbm5lbCAxIGlzIGRpc2FibGVkLgorCitjb25maWcgRVhZTk9TNF9TREhDSV9DSDJfOEJJVAorCWJvb2wgIkNoYW5uZWwgMiB3aXRoIDgtYml0IGJ1cyIKKwloZWxwCisJICBTdXBwb3J0IEhTTU1DIENoYW5uZWwgMiA4LWJpdCBidXMuCisJICBJZiBzZWxlY3RlZCwgQ2hhbm5lbCAzIGlzIGRpc2FibGVkLgorZW5kaWYKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA2OWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUKQEAgLTAsMCArMSw2MCBAQAorIyBhcmNoL2FybS9tYWNoLWV4eW5vcy9NYWtlZmlsZQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorIwkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIKKworb2JqLXkJCQkJOj0KK29iai1tCQkJCTo9CitvYmotbgkJCQk6PQorb2JqLQkJCQk6PQorCisjIENvcmUgc3VwcG9ydCBmb3IgRVhZTk9TNCBzeXN0ZW0KKworb2JqLSQoQ09ORklHX0FSQ0hfRVhZTk9TNCkJKz0gY3B1Lm8gaW5pdC5vIGNsb2NrLm8gaXJxLWNvbWJpbmVyLm8gc2V0dXAtaTJjMC5vCitvYmotJChDT05GSUdfQVJDSF9FWFlOT1M0KQkrPSBpcnEtZWludC5vIGRtYS5vIHBtdS5vCitvYmotJChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCSs9IGNsb2NrLWV4eW5vczQyMTAubworb2JqLSQoQ09ORklHX1NPQ19FWFlOT1M0MjEyKQkrPSBjbG9jay1leHlub3M0MjEyLm8KK29iai0kKENPTkZJR19QTSkJCSs9IHBtLm8KK29iai0kKENPTkZJR19DUFVfSURMRSkJCSs9IGNwdWlkbGUubworCitvYmotJChDT05GSUdfU01QKQkJKz0gcGxhdHNtcC5vIGhlYWRzbXAubworCitvYmotJChDT05GSUdfRVhZTk9TNF9NQ1QpCSs9IG1jdC5vCisKK29iai0kKENPTkZJR19IT1RQTFVHX0NQVSkJKz0gaG90cGx1Zy5vCisKKyMgbWFjaGluZSBzdXBwb3J0CisKK29iai0kKENPTkZJR19NQUNIX1NNREtDMjEwKQkJKz0gbWFjaC1zbWRrdjMxMC5vCitvYmotJChDT05GSUdfTUFDSF9TTURLVjMxMCkJCSs9IG1hY2gtc21ka3YzMTAubworb2JqLSQoQ09ORklHX01BQ0hfQVJNTEVYNDIxMCkJCSs9IG1hY2gtYXJtbGV4NDIxMC5vCitvYmotJChDT05GSUdfTUFDSF9VTklWRVJTQUxfQzIxMCkJKz0gbWFjaC11bml2ZXJzYWxfYzIxMC5vCitvYmotJChDT05GSUdfTUFDSF9OVVJJKQkJCSs9IG1hY2gtbnVyaS5vCitvYmotJChDT05GSUdfTUFDSF9PUklHRU4pCQkrPSBtYWNoLW9yaWdlbi5vCisKK29iai0kKENPTkZJR19NQUNIX1NNREs0MjEyKQkJKz0gbWFjaC1zbWRrNHgxMi5vCitvYmotJChDT05GSUdfTUFDSF9TTURLNDQxMikJCSs9IG1hY2gtc21kazR4MTIubworCisjIGRldmljZSBzdXBwb3J0CisKK29iai0kKENPTkZJR19BUkNIX0VYWU5PUzQpCQkrPSBkZXYtYXVkaW8ubworb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX0FIQ0kpCQkrPSBkZXYtYWhjaS5vCitvYmotJChDT05GSUdfRVhZTk9TNF9ERVZfUEQpCQkrPSBkZXYtcGQubworb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX1NZU01NVSkJKz0gZGV2LXN5c21tdS5vCitvYmotJChDT05GSUdfRVhZTk9TNF9ERVZfRFdNQ0kpCQkrPSBkZXYtZHdtY2kubworCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9GSU1DKQkrPSBzZXR1cC1maW1jLm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0ZJTUQwKQkrPSBzZXR1cC1maW1kMC5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkMxKQkrPSBzZXR1cC1pMmMxLm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzIpCSs9IHNldHVwLWkyYzIubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDMykJKz0gc2V0dXAtaTJjMy5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM0KQkrPSBzZXR1cC1pMmM0Lm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzUpCSs9IHNldHVwLWkyYzUubworb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNikJKz0gc2V0dXAtaTJjNi5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM3KQkrPSBzZXR1cC1pMmM3Lm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0tFWVBBRCkJKz0gc2V0dXAta2V5cGFkLm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1NESENJKQkrPSBzZXR1cC1zZGhjaS5vCitvYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPKQkrPSBzZXR1cC1zZGhjaS1ncGlvLm8KK29iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1VTQl9QSFkpCSs9IHNldHVwLXVzYi1waHkubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9NYWtlZmlsZS5ib290CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUuYm9vdApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvTWFrZWZpbGUuYm9vdApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2stZXh5bm9zNDIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2stZXh5bm9zNDIxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDVlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jbG9jay1leHlub3M0MjEwLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2stZXh5bm9zNDIxMC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQyMTAgLSBDbG9jayBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbGwuaD4KKyNpbmNsdWRlIDxwbGF0L3M1cC1jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2stY2xrc3JjLmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9leHlub3M0LWNsb2NrLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0MjEwX2Nsb2NrX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19JTUFHRSksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTENEMSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfSU1BR0UpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0xDRDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfTENEMSksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0lNQUdFXzQyMTApLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9MQ0QxKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUEVSSVJfNDIxMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKnN5c2Nsa3NbXSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19MQ0QxLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtzcmNzW10gPSB7CisJeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX3NhdGEiLAorCQkJLmlkCQk9IC0xLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfbW91dF9jb3JlYnVzLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMjQsIC5zaXplID0gMSB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfZmltZCIsCisJCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjEiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDFfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0xDRDEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfTENEMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0geworCXsKKwkJLm5hbWUJCT0gInNhdGFwaHkiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDMpLAorCX0sIHsKKwkJLm5hbWUJCT0gInNhdGEiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJmaW1kIiwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4xIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwKK307CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgZXh5bm9zNDIxMF9jbG9ja19zdXNwZW5kKHZvaWQpCit7CisJczNjX3BtX2RvX3NhdmUoZXh5bm9zNDIxMF9jbG9ja19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczQyMTBfY2xvY2tfc2F2ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczQyMTBfY2xvY2tfcmVzdW1lKHZvaWQpCit7CisJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0MjEwX2Nsb2NrX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNDIxMF9jbG9ja19zYXZlKSk7Cit9CisKKyNlbHNlCisjZGVmaW5lIGV4eW5vczQyMTBfY2xvY2tfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGV4eW5vczQyMTBfY2xvY2tfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdHJ1Y3Qgc3lzY29yZV9vcHMgZXh5bm9zNDIxMF9jbG9ja19zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IGV4eW5vczQyMTBfY2xvY2tfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGV4eW5vczQyMTBfY2xvY2tfcmVzdW1lLAorfTsKKwordm9pZCBfX2luaXQgZXh5bm9zNDIxMF9yZWdpc3Rlcl9jbG9ja3Modm9pZCkKK3sKKwlpbnQgcHRyOworCisJY2xrX21vdXRfbXBsbC5yZWdfc3JjLnJlZyA9IFM1UF9DTEtTUkNfQ1BVOworCWNsa19tb3V0X21wbGwucmVnX3NyYy5zaGlmdCA9IDg7CisJY2xrX21vdXRfbXBsbC5yZWdfc3JjLnNpemUgPSAxOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHN5c2Nsa3MpOyBwdHIrKykKKwkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzeXNjbGtzW3B0cl0sIDEpOworCisJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzLCBBUlJBWV9TSVpFKGNsa3NyY3MpKTsKKworCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOworCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CisKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmZXh5bm9zNDIxMF9jbG9ja19zeXNjb3JlX29wcyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9jbG9jay1leHlub3M0MjEyLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jbG9jay1leHlub3M0MjEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkNWRlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Nsb2NrLWV4eW5vczQyMTIuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay1leHlub3M0MjEyLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogRVhZTk9TNDIxMiAtIENsb2NrIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgorI2luY2x1ZGUgPHBsYXQvczVwLWNsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay1jbGtzcmMuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL2V4eW5vczQtY2xvY2suaD4KKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczQyMTJfY2xvY2tfc2F2ZVtdID0geworCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0lNQUdFKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9JTUFHRSksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0lNQUdFXzQyMTIpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9QRVJJUl80MjEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfc3JjX21wbGxfdXNlcl9saXN0W10gPSB7CisJWzBdID0gJmNsa19maW5fbXBsbCwKKwlbMV0gPSAmY2xrX21vdXRfbXBsbC5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfbXBsbF91c2VyID0geworCS5zb3VyY2VzCT0gY2xrX3NyY19tcGxsX3VzZXJfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrX3NyY19tcGxsX3VzZXJfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbF91c2VyID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJtb3V0X21wbGxfdXNlciIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtfc3JjX21wbGxfdXNlciwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ1BVLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKnN5c2Nsa3NbXSA9IHsKKwkmY2xrX21vdXRfbXBsbF91c2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa3NyY3NbXSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9OworCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGV4eW5vczQyMTJfY2xvY2tfc3VzcGVuZCh2b2lkKQoreworCXMzY19wbV9kb19zYXZlKGV4eW5vczQyMTJfY2xvY2tfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0MjEyX2Nsb2NrX3NhdmUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0MjEyX2Nsb2NrX3Jlc3VtZSh2b2lkKQoreworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNDIxMl9jbG9ja19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczQyMTJfY2xvY2tfc2F2ZSkpOworfQorCisjZWxzZQorI2RlZmluZSBleHlub3M0MjEyX2Nsb2NrX3N1c3BlbmQgTlVMTAorI2RlZmluZSBleHlub3M0MjEyX2Nsb2NrX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RydWN0IHN5c2NvcmVfb3BzIGV4eW5vczQyMTJfY2xvY2tfc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBleHlub3M0MjEyX2Nsb2NrX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBleHlub3M0MjEyX2Nsb2NrX3Jlc3VtZSwKK307CisKK3ZvaWQgX19pbml0IGV4eW5vczQyMTJfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCit7CisJaW50IHB0cjsKKworCS8qIHVzYnBoeTEgaXMgcmVtb3ZlZCAqLworCWNsa3NldF9ncm91cF9saXN0WzRdID0gTlVMTDsKKworCS8qIG1vdXRfbXBsbF91c2VyIGlzIHVzZWQgKi8KKwljbGtzZXRfZ3JvdXBfbGlzdFs2XSA9ICZjbGtfbW91dF9tcGxsX3VzZXIuY2xrOworCWNsa3NldF9hY2xrX3RvcF9saXN0WzBdID0gJmNsa19tb3V0X21wbGxfdXNlci5jbGs7CisKKwljbGtfbW91dF9tcGxsLnJlZ19zcmMucmVnID0gUzVQX0NMS1NSQ19ETUM7CisJY2xrX21vdXRfbXBsbC5yZWdfc3JjLnNoaWZ0ID0gMTI7CisJY2xrX21vdXRfbXBsbC5yZWdfc3JjLnNpemUgPSAxOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHN5c2Nsa3MpOyBwdHIrKykKKwkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzeXNjbGtzW3B0cl0sIDEpOworCisJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzLCBBUlJBWV9TSVpFKGNsa3NyY3MpKTsKKworCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOworCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CisKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmZXh5bm9zNDIxMl9jbG9ja19zeXNjb3JlX29wcyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk0ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY2xvY2suYwpAQCAtMCwwICsxLDE0OTEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogRVhZTk9TNCAtIENsb2NrIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L3BsbC5oPgorI2luY2x1ZGUgPHBsYXQvczVwLWNsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay1jbGtzcmMuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvc3lzbW11Lmg+CisjaW5jbHVkZSA8bWFjaC9leHlub3M0LWNsb2NrLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X2Nsb2NrX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9MRUZUQlVTKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfTEVGVEJVUyksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfUklHSFRCVVMpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9SSUdIVEJVUyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfVE9QMCksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfVE9QMSksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfQ0FNKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19UViksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUZDKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19HM0QpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0xDRDApLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BVURJTyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfRlNZUyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfUEVSSUwwKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19QRVJJTDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0NBTSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfVFYpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX01GQyksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfRzNEKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9MQ0QwKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9NQVVESU8pLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMwKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfRlNZUzIpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMzKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDApLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMMSksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwyKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDMpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMNCksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUw1KSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9UT1ApLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfVE9QKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0NBTSksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19UViksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19MQ0QwKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX01BVURJTyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19GU1lTKSwKKwlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX1BFUklMMCksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19QRVJJTDEpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWMl9SQVRJTyksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX1NDTEtDQU0pLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9DQU0pLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9UViksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX01GQyksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0czRCksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0xDRDApLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9GU1lTKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfR1BTKSwKKwlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUEVSSUwpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9CTE9DSyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19ETUMpLAorCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0RNQyksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfRE1DMCksCisJU0FWRV9JVEVNKFM1UF9DTEtESVZfRE1DMSksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0RNQyksCisJU0FWRV9JVEVNKFM1UF9DTEtTUkNfQ1BVKSwKKwlTQVZFX0lURU0oUzVQX0NMS0RJVl9DUFUpLAorCVNBVkVfSVRFTShTNVBfQ0xLRElWX0NQVSArIDB4NCksCisJU0FWRV9JVEVNKFM1UF9DTEtHQVRFX1NDTEtDUFUpLAorCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9DUFUpLAorfTsKKworc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pMjdtID0geworCS5uYW1lCQk9ICJzY2xrX2hkbWkyN20iLAorCS5yYXRlCQk9IDI3MDAwMDAwLAorfTsKKworc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pcGh5ID0geworCS5uYW1lCQk9ICJzY2xrX2hkbWlwaHkiLAorfTsKKworc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkwID0geworCS5uYW1lCQk9ICJzY2xrX3VzYnBoeTAiLAorCS5yYXRlCQk9IDI3MDAwMDAwLAorfTsKKworc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkxID0geworCS5uYW1lCQk9ICJzY2xrX3VzYnBoeTEiLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHVtbXlfYXBiX3BjbGsgPSB7CisJLm5hbWUJCT0gImFwYl9wY2xrIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfdG9wX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX1RPUCwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX0NBTSwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19MQ0QwLCBjbGssIGVuYWJsZSk7Cit9CisKK2ludCBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfRlNZUywgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX1BFUklMMCwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX1BFUklMMSwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX21mY19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX01GQywgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfdHZfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfVFYsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9jYW1fY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9DQU0sIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19pcF90dl9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX1RWLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9JTUFHRSwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9MQ0QwLCBjbGssIGVuYWJsZSk7Cit9CisKK2ludCBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfTENEMSwgY2xrLCBlbmFibGUpOworfQorCitpbnQgZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX0ZTWVMsIGNsaywgZW5hYmxlKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX1BFUklMLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9QRVJJUiwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2hkbWlwaHlfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfSERNSV9QSFlfQ09OVFJPTCwgY2xrLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfY2xrX2RhY19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9EQUNfUEhZX0NPTlRST0wsIGNsaywgZW5hYmxlKTsKK30KKworLyogQ29yZSBsaXN0IG9mIENNVV9DUFUgc2lkZSAqLworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfYXBsbCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9hcGxsIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa19zcmNfYXBsbCwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ1BVLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKK307CisKK3N0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2FwbGwgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInNjbGtfYXBsbCIsCisJCS5wYXJlbnQJCT0gJmNsa19tb3V0X2FwbGwuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gMyB9LAorfTsKKworc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZXBsbCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9lcGxsIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa19zcmNfZXBsbCwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCit9OworCitzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9tcGxsID0geworCS5jbGsgPSB7CisJCS5uYW1lCQk9ICJtb3V0X21wbGwiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrX3NyY19tcGxsLAorCisJLyogcmVnX3NyYyB3aWxsIGJlIGFkZGVkIGluIGVhY2ggU29DcycgY2xvY2sgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dGNvcmVfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9hcGxsLmNsaywKKwlbMV0gPSAmY2xrX21vdXRfbXBsbC5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0Y29yZSA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9tb3V0Y29yZV9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dGNvcmVfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRjb3JlID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtb3V0Y29yZSIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfbW91dGNvcmUsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19jb3JlY2xrID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJjb3JlX2NsayIsCisJCS5wYXJlbnQJCT0gJmNsa19tb3V0Y29yZS5jbGssCisJfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYXJtY2xrID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhcm1jbGsiLAorCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlbTAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfY29yZW0wIiwKKwkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZXMgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfY29yZXMiLAorCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCisJfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlbTEgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfY29yZW0xIiwKKwkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gOCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BlcmlwaGNsayA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAicGVyaXBoY2xrIiwKKwkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LAorfTsKKworLyogQ29yZSBsaXN0IG9mIENNVV9DT1JFIHNpZGUgKi8KKworc3RydWN0IGNsayAqY2xrc2V0X2NvcmVidXNfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCit9OworCitzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfY29yZWJ1cyA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9jb3JlYnVzX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9jb3JlYnVzX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2NvcmVidXMgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfY29yZWJ1cyIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9jb3JlYnVzLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19ETUMsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2RtYyA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAic2Nsa19kbWMiLAorCQkucGFyZW50CQk9ICZjbGtfbW91dF9jb3JlYnVzLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZWQgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfY29yZWQiLAorCQkucGFyZW50CQk9ICZjbGtfc2Nsa19kbWMuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlcCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYWNsa19jb3JlcCIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrX2NvcmVkLmNsaywKKwl9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9ETUMwLCAuc2hpZnQgPSAyMCwgLnNpemUgPSAzIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfYWNwID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrX2FjcCIsCisJCS5wYXJlbnQJCT0gJmNsa19tb3V0X2NvcmVidXMuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDAsIC5zaXplID0gMyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19wY2xrX2FjcCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAicGNsa19hY3AiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa19hY3AuY2xrLAorCX0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDQsIC5zaXplID0gMyB9LAorfTsKKworLyogQ29yZSBsaXN0IG9mIENNVV9UT1Agc2lkZSAqLworCitzdHJ1Y3QgY2xrICpjbGtzZXRfYWNsa190b3BfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCit9OworCitzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X2FjbGsgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfYWNsa190b3BfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X2FjbGtfdG9wX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzIwMCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAiYWNsa18yMDAiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDEgfSwKKwkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfVE9QLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18xMDAgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFjbGtfMTAwIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAxNiwgLnNpemUgPSAxIH0sCisJLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RPUCwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTYwID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrXzE2MCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMjAsIC5zaXplID0gMSB9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDgsIC5zaXplID0gMyB9LAorfTsKKworc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTMzID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJhY2xrXzEzMyIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMjQsIC5zaXplID0gMSB9LAorCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfdnBsbHNyY19saXN0W10gPSB7CisJWzBdID0gJmNsa19maW5fdnBsbCwKKwlbMV0gPSAmY2xrX3NjbGtfaGRtaTI3bSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X3ZwbGxzcmMgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfdnBsbHNyY19saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfdnBsbHNyY19saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfdnBsbHNyYyA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAidnBsbF9zcmMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfdG9wX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfdnBsbHNyYywKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3NjbGtfdnBsbF9saXN0W10gPSB7CisJWzBdID0gJmNsa192cGxsc3JjLmNsaywKKwlbMV0gPSAmY2xrX2ZvdXRfdnBsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X3NjbGtfdnBsbCA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9zY2xrX3ZwbGxfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3NjbGtfdnBsbF9saXN0KSwKK307CisKK3N0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX3ZwbGwgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gInNjbGtfdnBsbCIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfc2Nsa192cGxsLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0geworCXsKKwkJLm5hbWUJCT0gInRpbWVycyIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMTw8MjQpLAorCX0sIHsKKwkJLm5hbWUJCT0gImNzaXMiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDQpLAorCX0sIHsKKwkJLm5hbWUJCT0gImNzaXMiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDUpLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbWMiLAorCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiZmltYyIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJmaW1jIiwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDIpLAorCX0sIHsKKwkJLm5hbWUJCT0gImZpbWMiLAorCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMyksCisJfSwgeworCQkubmFtZQkJPSAiZmltZCIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImhzbW1jIiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoc21tYyIsCisJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNiksCisJfSwgeworCQkubmFtZQkJPSAiaHNtbWMiLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDcpLAorCX0sIHsKKwkJLm5hbWUJCT0gImhzbW1jIiwKKwkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjMiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJkd21tYyIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDkpLAorCX0sIHsKKwkJLm5hbWUJCT0gImRhYyIsCisJCS5kZXZuYW1lCT0gInM1cC1zZG8iLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMiksCisJfSwgeworCQkubmFtZQkJPSAibWl4ZXIiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWl4ZXIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMSksCisJfSwgeworCQkubmFtZQkJPSAidnAiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWl4ZXIiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiaGRtaSIsCisJCS5kZXZuYW1lCT0gImV4eW5vczQtaGRtaSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfdHZfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoZG1pcGh5IiwKKwkJLmRldm5hbWUJPSAiZXh5bm9zNC1oZG1pIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19oZG1pcGh5X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiZGFjcGh5IiwKKwkJLmRldm5hbWUJPSAiczVwLXNkbyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfZGFjX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwLjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJkbWEiLAorCQkuZGV2bmFtZQk9ICJkbWEtcGwzMzAuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEpLAorCX0sIHsKKwkJLm5hbWUJCT0gImFkYyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNSksCisJfSwgeworCQkubmFtZQkJPSAia2V5cGFkIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJydGMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlyX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTUpLAorCX0sIHsKKwkJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDE0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1c2Job3N0IiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwgLAorCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJvdGciLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMyksCisJfSwgeworCQkubmFtZQkJPSAic3BpIiwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCisJfSwgeworCQkubmFtZQkJPSAic3BpIiwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNyksCisJfSwgeworCQkubmFtZQkJPSAic3BpIiwKKwkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxOCksCisJfSwgeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMCIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxOSksCisJfSwgeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCisJfSwgeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLmRldm5hbWUJPSAic2Ftc3VuZy1pMnMuMiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAyMSksCisJfSwgeworCQkubmFtZQkJPSAiYWM5NyIsCisJCS5kZXZuYW1lCT0gInNhbXN1bmctYWM5NyIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAyNyksCisJfSwgeworCQkubmFtZQkJPSAiZmltZzJkIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gIm1mYyIsCisJCS5kZXZuYW1lCT0gInM1cC1tZmMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX21mY19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjAiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNiksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMSIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJpMmMiLAorCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4yIiwKKwkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDgpLAorCX0sIHsKKwkJLm5hbWUJCT0gImkyYyIsCisJCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjMiLAorCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOSksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuNCIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuNSIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuNiIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuNyIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMyksCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1oZG1pcGh5LWkyYyIsCisJCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxNCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX01ETUEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ltYWdlX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNSksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMwIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA3KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfRklNQzEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDgpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOSksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMzIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxMCksCisJfSwgeworCQkubmFtZQkJPSAiU1lTTU1VX0pQRUciLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfRklNRDAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfRklNRDEiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDFfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfUENJZSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDE4KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfRzJEIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDMpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9ST1RBVE9SIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDQpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9UViIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfdHZfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJTWVNNTVVfTUZDX0wiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX21mY19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEpLAorCX0sIHsKKwkJLm5hbWUJCT0gIlNZU01NVV9NRkNfUiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbWZjX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMiksCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjAiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4xIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDEpLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMiIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAyKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMyksCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC40IiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDQpLAorCX0sIHsKKwkJLm5hbWUJCT0gInVhcnQiLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuNSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKKwl9Cit9OworCitzdHJ1Y3QgY2xrICpjbGtzZXRfZ3JvdXBfbGlzdFtdID0geworCVswXSA9ICZjbGtfZXh0X3h0YWxfbXV4LAorCVsxXSA9ICZjbGtfeHVzYnh0aSwKKwlbMl0gPSAmY2xrX3NjbGtfaGRtaTI3bSwKKwlbM10gPSAmY2xrX3NjbGtfdXNicGh5MCwKKwlbNF0gPSAmY2xrX3NjbGtfdXNicGh5MSwKKwlbNV0gPSAmY2xrX3NjbGtfaGRtaXBoeSwKKwlbNl0gPSAmY2xrX21vdXRfbXBsbC5jbGssCisJWzddID0gJmNsa19tb3V0X2VwbGwuY2xrLAorCVs4XSA9ICZjbGtfc2Nsa192cGxsLmNsaywKK307CisKK3N0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfZ3JvdXAgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfZ3JvdXBfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X2dyb3VwX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X2cyZDBfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X2cyZDAgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9nMmQwX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X2cyZDBfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZzJkMCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9nMmQwIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X2cyZDAsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0lNQUdFLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9nMmQxX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfZXBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX3ZwbGwuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQxID0geworCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkMV9saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9nMmQxX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2cyZDEgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gIm1vdXRfZzJkMSIsCisJfSwKKwkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQxLAorCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfZzJkX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX21vdXRfZzJkMC5jbGssCisJWzFdID0gJmNsa19tb3V0X2cyZDEuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9nMmRfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfZzJkX2xpc3QpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X21mYzBfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYzAgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmMwX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X21mYzBfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbWZjMCA9IHsKKwkuY2xrCT0geworCQkubmFtZQkJPSAibW91dF9tZmMwIiwKKwl9LAorCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X21mYzAsCisJLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX01GQywgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfbWZjMV9saXN0W10gPSB7CisJWzBdID0gJmNsa19tb3V0X2VwbGwuY2xrLAorCVsxXSA9ICZjbGtfc2Nsa192cGxsLmNsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfbWZjMSA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9tb3V0X21mYzFfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfbWZjMV9saXN0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9tZmMxID0geworCS5jbGsJPSB7CisJCS5uYW1lCQk9ICJtb3V0X21mYzEiLAorCX0sCisJLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRfbWZjMSwKKwkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTUZDLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9tZmNfbGlzdFtdID0geworCVswXSA9ICZjbGtfbW91dF9tZmMwLmNsaywKKwlbMV0gPSAmY2xrX21vdXRfbWZjMS5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYyA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9tb3V0X21mY19saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9tZmNfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X3NjbGtfZGFjX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX3NjbGtfdnBsbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2hkbWlwaHksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9zY2xrX2RhYyA9IHsKKwkuc291cmNlcwk9IGNsa3NldF9zY2xrX2RhY19saXN0LAorCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfc2Nsa19kYWNfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfZGFjID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAic2Nsa19kYWMiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfdHZfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9zY2xrX2RhYywKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVFYsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX3BpeGVsID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAic2Nsa19waXhlbCIsCisJCS5wYXJlbnQgPSAmY2xrX3NjbGtfdnBsbC5jbGssCisJfSwKKwkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfVFYsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9zY2xrX2hkbWlfbGlzdFtdID0geworCVswXSA9ICZjbGtfc2Nsa19waXhlbC5jbGssCisJWzFdID0gJmNsa19zY2xrX2hkbWlwaHksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9zY2xrX2hkbWkgPSB7CisJLnNvdXJjZXMJPSBjbGtzZXRfc2Nsa19oZG1pX2xpc3QsCisJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9zY2xrX2hkbWlfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfaGRtaSA9IHsKKwkuY2xrCQk9IHsKKwkJLm5hbWUJCT0gInNjbGtfaGRtaSIsCisJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza190dl9jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDApLAorCX0sCisJLnNvdXJjZXMgPSAmY2xrc2V0X3NjbGtfaGRtaSwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVFYsIC5zaGlmdCA9IDAsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9zY2xrX21peGVyX2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX3NjbGtfZGFjLmNsaywKKwlbMV0gPSAmY2xrX3NjbGtfaGRtaS5jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9zY2xrX21peGVyID0geworCS5zb3VyY2VzCT0gY2xrc2V0X3NjbGtfbWl4ZXJfbGlzdCwKKwkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X3NjbGtfbWl4ZXJfbGlzdCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfbWl4ZXIgPSB7CisJLmNsawkJPSB7CisJCS5uYW1lCQk9ICJzY2xrX21peGVyIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3R2X2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJfSwKKwkuc291cmNlcyA9ICZjbGtzZXRfc2Nsa19taXhlciwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVFYsIC5zaGlmdCA9IDQsIC5zaXplID0gMSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpzY2xrX3R2W10gPSB7CisJJmNsa19zY2xrX2RhYywKKwkmY2xrX3NjbGtfcGl4ZWwsCisJJmNsa19zY2xrX2hkbWksCisJJmNsa19zY2xrX21peGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzAgPSB7CisJLmNsawkJPSB7CisJCS5uYW1lCQk9ICJkb3V0X21tYzAiLAorCX0sCisJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzEgPSB7CisJLmNsawkJPSB7CisJCS5uYW1lCQk9ICJkb3V0X21tYzEiLAorCX0sCisJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKKwkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMyID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAiZG91dF9tbWMyIiwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZG91dF9tbWMzID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAiZG91dF9tbWMzIiwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfRlNZUywgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAorCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMiwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzQgPSB7CisJLmNsawkJPSB7CisJCS5uYW1lCQk9ICJkb3V0X21tYzQiLAorCX0sCisJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMzLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtzcmNzW10gPSB7CisJeworCQkuY2xrCT0geworCQkJLm5hbWUJCT0gInVjbGsxIiwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDAsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAidWNsazEiLAorCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjEiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJ1Y2xrMSIsCisJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMiIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDgpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInVjbGsxIiwKKwkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19wd20iLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwzLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfY3NpcyIsCisJCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjAiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX2NzaXMiLAorCQkJLmRldm5hbWUJPSAiczVwLW1pcGktY3Npcy4xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjgpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDI4LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMjgsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19jYW0wIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19jYW0xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjApLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4wIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgNCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4yIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgOCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1jIiwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4zIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19jYW1fY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19DQU0sIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAorCX0sIHsKKwkJLmNsawkJPSB7CisJCQkubmFtZQkJPSAic2Nsa19maW1kIiwKKwkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMCIsCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMF9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwkJfSwKKwkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAorCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTENEMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9MQ0QwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKKwkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKKwkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMSwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwxLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX3NwaSIsCisJCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4yIiwKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDFfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMjQpLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDEsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDQgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMiwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX2ZpbWcyZCIsCisJCX0sCisJCS5zb3VyY2VzID0gJmNsa3NldF9tb3V0X2cyZCwKKwkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0lNQUdFLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0lNQUdFLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfbWZjIiwKKwkJCS5kZXZuYW1lCT0gInM1cC1tZmMiLAorCQl9LAorCQkuc291cmNlcyA9ICZjbGtzZXRfbW91dF9tZmMsCisJCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19NRkMsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LAorCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfTUZDLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4wIiwKKwkJCS5wYXJlbnQJCT0gJmNsa19kb3V0X21tYzAuY2xrLAorCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKKwkJCS5jdHJsYml0CT0gKDEgPDwgMCksCisJCX0sCisJCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMSwgLnNoaWZ0ID0gOCwgLnNpemUgPSA4IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCisJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMS5jbGssCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKKwkJfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMxLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA4IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX21tYyIsCisJCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMiIsCisJCQkucGFyZW50ICAgICAgICAgPSAmY2xrX2RvdXRfbW1jMi5jbGssCisJCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAorCQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwkJfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDggfSwKKwl9LCB7CisJCS5jbGsJCT0geworCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKKwkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4zIiwKKwkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWMzLmNsaywKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDEyKSwKKwkJfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA4IH0sCisJfSwgeworCQkuY2xrCQk9IHsKKwkJCS5uYW1lCQk9ICJzY2xrX2R3bW1jIiwKKwkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWM0LmNsaywKKwkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCisJCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKKwkJfSwKKwkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMzLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDggfSwKKwl9Cit9OworCisvKiBDbG9jayBpbml0aWFsaXphdGlvbiBjb2RlICovCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKnN5c2Nsa3NbXSA9IHsKKwkmY2xrX21vdXRfYXBsbCwKKwkmY2xrX3NjbGtfYXBsbCwKKwkmY2xrX21vdXRfZXBsbCwKKwkmY2xrX21vdXRfbXBsbCwKKwkmY2xrX21vdXRjb3JlLAorCSZjbGtfY29yZWNsaywKKwkmY2xrX2FybWNsaywKKwkmY2xrX2FjbGtfY29yZW0wLAorCSZjbGtfYWNsa19jb3JlcywKKwkmY2xrX2FjbGtfY29yZW0xLAorCSZjbGtfcGVyaXBoY2xrLAorCSZjbGtfbW91dF9jb3JlYnVzLAorCSZjbGtfc2Nsa19kbWMsCisJJmNsa19hY2xrX2NvcmVkLAorCSZjbGtfYWNsa19jb3JlcCwKKwkmY2xrX2FjbGtfYWNwLAorCSZjbGtfcGNsa19hY3AsCisJJmNsa192cGxsc3JjLAorCSZjbGtfc2Nsa192cGxsLAorCSZjbGtfYWNsa18yMDAsCisJJmNsa19hY2xrXzEwMCwKKwkmY2xrX2FjbGtfMTYwLAorCSZjbGtfYWNsa18xMzMsCisJJmNsa19kb3V0X21tYzAsCisJJmNsa19kb3V0X21tYzEsCisJJmNsa19kb3V0X21tYzIsCisJJmNsa19kb3V0X21tYzMsCisJJmNsa19kb3V0X21tYzQsCisJJmNsa19tb3V0X21mYzAsCisJJmNsa19tb3V0X21mYzEsCit9OworCitzdGF0aWMgaW50IHh0YWxfcmF0ZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh5bm9zNF9mb3V0X2FwbGxfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQlyZXR1cm4gczVwX2dldF9wbGw0NXh4KHh0YWxfcmF0ZSwgX19yYXdfcmVhZGwoUzVQX0FQTExfQ09OMCksCisJCQkJCXBsbF80NTA4KTsKKwllbHNlIGlmIChzb2NfaXNfZXh5bm9zNDIxMigpIHx8IHNvY19pc19leHlub3M0NDEyKCkpCisJCXJldHVybiBzNXBfZ2V0X3BsbDM1eHgoeHRhbF9yYXRlLCBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIGV4eW5vczRfZm91dF9hcGxsX29wcyA9IHsKKwkuZ2V0X3JhdGUgPSBleHlub3M0X2ZvdXRfYXBsbF9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1MzIgdnBsbF9kaXZbXVs4XSA9IHsKKwl7ICA1NDAwMDAwMCwgMywgNTMsIDMsIDEwMjQsIDAsIDE3LCAwIH0sCisJeyAxMDgwMDAwMDAsIDMsIDUzLCAyLCAxMDI0LCAwLCAxNywgMCB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh5bm9zNF92cGxsX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorCitzdGF0aWMgaW50IGV4eW5vczRfdnBsbF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdnBsbF9jb24wLCB2cGxsX2NvbjEgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJLyogUmV0dXJuIGlmIG5vdGhpbmcgY2hhbmdlZCAqLworCWlmIChjbGstPnJhdGUgPT0gcmF0ZSkKKwkJcmV0dXJuIDA7CisKKwl2cGxsX2NvbjAgPSBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04wKTsKKwl2cGxsX2NvbjAgJj0gfigweDEgPDwgMjcgfAkJCQkJXAorCQkJUExMOTBYWF9NRElWX01BU0sgPDwgUExMNDZYWF9NRElWX1NISUZUIHwJXAorCQkJUExMOTBYWF9QRElWX01BU0sgPDwgUExMNDZYWF9QRElWX1NISUZUIHwJXAorCQkJUExMOTBYWF9TRElWX01BU0sgPDwgUExMNDZYWF9TRElWX1NISUZUKTsKKworCXZwbGxfY29uMSA9IF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjEpOworCXZwbGxfY29uMSAmPSB+KFBMTDQ2WFhfTVJSX01BU0sgPDwgUExMNDZYWF9NUlJfU0hJRlQgfAlcCisJCQlQTEw0NlhYX01GUl9NQVNLIDw8IFBMTDQ2WFhfTUZSX1NISUZUIHwJXAorCQkJUExMNDY1MENfS0RJVl9NQVNLIDw8IFBMTDQ2WFhfS0RJVl9TSElGVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2cGxsX2Rpdik7IGkrKykgeworCQlpZiAodnBsbF9kaXZbaV1bMF0gPT0gcmF0ZSkgeworCQkJdnBsbF9jb24wIHw9IHZwbGxfZGl2W2ldWzFdIDw8IFBMTDQ2WFhfUERJVl9TSElGVDsKKwkJCXZwbGxfY29uMCB8PSB2cGxsX2RpdltpXVsyXSA8PCBQTEw0NlhYX01ESVZfU0hJRlQ7CisJCQl2cGxsX2NvbjAgfD0gdnBsbF9kaXZbaV1bM10gPDwgUExMNDZYWF9TRElWX1NISUZUOworCQkJdnBsbF9jb24xIHw9IHZwbGxfZGl2W2ldWzRdIDw8IFBMTDQ2WFhfS0RJVl9TSElGVDsKKwkJCXZwbGxfY29uMSB8PSB2cGxsX2RpdltpXVs1XSA8PCBQTEw0NlhYX01GUl9TSElGVDsKKwkJCXZwbGxfY29uMSB8PSB2cGxsX2RpdltpXVs2XSA8PCBQTEw0NlhYX01SUl9TSElGVDsKKwkJCXZwbGxfY29uMCB8PSB2cGxsX2RpdltpXVs3XSA8PCAyNzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRSh2cGxsX2RpdikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBDbG9jayBWUExMIEZyZXF1ZW5jeVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCV9fcmF3X3dyaXRlbCh2cGxsX2NvbjAsIFM1UF9WUExMX0NPTjApOworCV9fcmF3X3dyaXRlbCh2cGxsX2NvbjEsIFM1UF9WUExMX0NPTjEpOworCisJLyogV2FpdCBmb3IgVlBMTCBsb2NrICovCisJd2hpbGUgKCEoX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCkgJiAoMSA8PCBQTEw0NlhYX0xPQ0tFRF9TSElGVCkpKQorCQljb250aW51ZTsKKworCWNsay0+cmF0ZSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBleHlub3M0X3ZwbGxfb3BzID0geworCS5nZXRfcmF0ZSA9IGV4eW5vczRfdnBsbF9nZXRfcmF0ZSwKKwkuc2V0X3JhdGUgPSBleHlub3M0X3ZwbGxfc2V0X3JhdGUsCit9OworCit2b2lkIF9faW5pdF9vcl9jcHVmcmVxIGV4eW5vczRfc2V0dXBfY2xvY2tzKHZvaWQpCit7CisJc3RydWN0IGNsayAqeHRhbF9jbGs7CisJdW5zaWduZWQgbG9uZyBhcGxsID0gMDsKKwl1bnNpZ25lZCBsb25nIG1wbGwgPSAwOworCXVuc2lnbmVkIGxvbmcgZXBsbCA9IDA7CisJdW5zaWduZWQgbG9uZyB2cGxsID0gMDsKKwl1bnNpZ25lZCBsb25nIHZwbGxzcmM7CisJdW5zaWduZWQgbG9uZyB4dGFsOworCXVuc2lnbmVkIGxvbmcgYXJtY2xrOworCXVuc2lnbmVkIGxvbmcgc2Nsa19kbWM7CisJdW5zaWduZWQgbG9uZyBhY2xrXzIwMDsKKwl1bnNpZ25lZCBsb25nIGFjbGtfMTAwOworCXVuc2lnbmVkIGxvbmcgYWNsa18xNjA7CisJdW5zaWduZWQgbG9uZyBhY2xrXzEzMzsKKwl1bnNpZ25lZCBpbnQgcHRyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWdpc3RlcmluZyBjbG9ja3NcbiIsIF9fZnVuY19fKTsKKworCXh0YWxfY2xrID0gY2xrX2dldChOVUxMLCAieHRhbCIpOworCUJVR19PTihJU19FUlIoeHRhbF9jbGspKTsKKworCXh0YWwgPSBjbGtfZ2V0X3JhdGUoeHRhbF9jbGspOworCisJeHRhbF9yYXRlID0geHRhbDsKKworCWNsa19wdXQoeHRhbF9jbGspOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB4dGFsIGlzICVsZFxuIiwgX19mdW5jX18sIHh0YWwpOworCisJaWYgKHNvY19pc19leHlub3M0MjEwKCkpIHsKKwkJYXBsbCA9IHM1cF9nZXRfcGxsNDV4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKSwKKwkJCQkJcGxsXzQ1MDgpOworCQltcGxsID0gczVwX2dldF9wbGw0NXh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9NUExMX0NPTjApLAorCQkJCQlwbGxfNDUwOCk7CisJCWVwbGwgPSBzNXBfZ2V0X3BsbDQ2eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX0VQTExfQ09OMCksCisJCQkJCV9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjEpLCBwbGxfNDYwMCk7CisKKwkJdnBsbHNyYyA9IGNsa19nZXRfcmF0ZSgmY2xrX3ZwbGxzcmMuY2xrKTsKKwkJdnBsbCA9IHM1cF9nZXRfcGxsNDZ4eCh2cGxsc3JjLCBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04wKSwKKwkJCQkJX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMSksIHBsbF80NjUwYyk7CisJfSBlbHNlIGlmIChzb2NfaXNfZXh5bm9zNDIxMigpIHx8IHNvY19pc19leHlub3M0NDEyKCkpIHsKKwkJYXBsbCA9IHM1cF9nZXRfcGxsMzV4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfQVBMTF9DT04wKSk7CisJCW1wbGwgPSBzNXBfZ2V0X3BsbDM1eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX01QTExfQ09OMCkpOworCQllcGxsID0gczVwX2dldF9wbGwzNnh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjApLAorCQkJCQlfX3Jhd19yZWFkbChTNVBfRVBMTF9DT04xKSk7CisKKwkJdnBsbHNyYyA9IGNsa19nZXRfcmF0ZSgmY2xrX3ZwbGxzcmMuY2xrKTsKKwkJdnBsbCA9IHM1cF9nZXRfcGxsMzZ4eCh2cGxsc3JjLCBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04wKSwKKwkJCQkJX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMSkpOworCX0gZWxzZSB7CisJCS8qIG5vdGhpbmcgKi8KKwl9CisKKwljbGtfZm91dF9hcGxsLm9wcyA9ICZleHlub3M0X2ZvdXRfYXBsbF9vcHM7CisJY2xrX2ZvdXRfbXBsbC5yYXRlID0gbXBsbDsKKwljbGtfZm91dF9lcGxsLnJhdGUgPSBlcGxsOworCWNsa19mb3V0X3ZwbGwub3BzID0gJmV4eW5vczRfdnBsbF9vcHM7CisJY2xrX2ZvdXRfdnBsbC5yYXRlID0gdnBsbDsKKworCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzQ6IFBMTCBzZXR0aW5ncywgQT0lbGQsIE09JWxkLCBFPSVsZCBWPSVsZCIsCisJCQlhcGxsLCBtcGxsLCBlcGxsLCB2cGxsKTsKKworCWFybWNsayA9IGNsa19nZXRfcmF0ZSgmY2xrX2FybWNsay5jbGspOworCXNjbGtfZG1jID0gY2xrX2dldF9yYXRlKCZjbGtfc2Nsa19kbWMuY2xrKTsKKworCWFjbGtfMjAwID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18yMDAuY2xrKTsKKwlhY2xrXzEwMCA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMTAwLmNsayk7CisJYWNsa18xNjAgPSBjbGtfZ2V0X3JhdGUoJmNsa19hY2xrXzE2MC5jbGspOworCWFjbGtfMTMzID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18xMzMuY2xrKTsKKworCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzQ6IEFSTUNMSz0lbGQsIERNQz0lbGQsIEFDTEsyMDA9JWxkXG4iCisJCQkgIkFDTEsxMDA9JWxkLCBBQ0xLMTYwPSVsZCwgQUNMSzEzMz0lbGRcbiIsCisJCQlhcm1jbGssIHNjbGtfZG1jLCBhY2xrXzIwMCwKKwkJCWFjbGtfMTAwLCBhY2xrXzE2MCwgYWNsa18xMzMpOworCisJY2xrX2YucmF0ZSA9IGFybWNsazsKKwljbGtfaC5yYXRlID0gc2Nsa19kbWM7CisJY2xrX3AucmF0ZSA9IGFjbGtfMTAwOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGNsa3NyY3MpOyBwdHIrKykKKwkJczNjX3NldF9jbGtzcmMoJmNsa3NyY3NbcHRyXSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW10gX19pbml0ZGF0YSA9IHsKKwkmY2xrX3NjbGtfaGRtaTI3bSwKKwkmY2xrX3NjbGtfaGRtaXBoeSwKKwkmY2xrX3NjbGtfdXNicGh5MCwKKwkmY2xrX3NjbGtfdXNicGh5MSwKK307CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbG9ja19zdXNwZW5kKHZvaWQpCit7CisJczNjX3BtX2RvX3NhdmUoZXh5bm9zNF9jbG9ja19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfY2xvY2tfc2F2ZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X2Nsb2NrX3Jlc3VtZSh2b2lkKQoreworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9jbG9ja19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfY2xvY2tfc2F2ZSkpOworfQorCisjZWxzZQorI2RlZmluZSBleHlub3M0X2Nsb2NrX3N1c3BlbmQgTlVMTAorI2RlZmluZSBleHlub3M0X2Nsb2NrX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RydWN0IHN5c2NvcmVfb3BzIGV4eW5vczRfY2xvY2tfc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBleHlub3M0X2Nsb2NrX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBleHlub3M0X2Nsb2NrX3Jlc3VtZSwKK307CisKK3ZvaWQgX19pbml0IGV4eW5vczRfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCit7CisJaW50IHB0cjsKKworCXMzYzI0eHhfcmVnaXN0ZXJfY2xvY2tzKGNsa3MsIEFSUkFZX1NJWkUoY2xrcykpOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHN5c2Nsa3MpOyBwdHIrKykKKwkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzeXNjbGtzW3B0cl0sIDEpOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKHNjbGtfdHYpOyBwdHIrKykKKwkJczNjX3JlZ2lzdGVyX2Nsa3NyYyhzY2xrX3R2W3B0cl0sIDEpOworCisJczNjX3JlZ2lzdGVyX2Nsa3NyYyhjbGtzcmNzLCBBUlJBWV9TSVpFKGNsa3NyY3MpKTsKKwlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKSk7CisKKwlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKKwlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOworCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmV4eW5vczRfY2xvY2tfc3lzY29yZV9vcHMpOworCXMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmR1bW15X2FwYl9wY2xrKTsKKworCXMzY19wd21jbGtfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGVjMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1LmMKQEAgLTAsMCArMSwyOTggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zL2NwdS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgorI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9mYi1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9maW1jLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9yZXNldC5oPgorI2luY2x1ZGUgPHBsYXQvdHYtY29yZS5oPgorCisjaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKwordW5zaWduZWQgaW50IGdpY19iYW5rX29mZnNldCBfX3JlYWRfbW9zdGx5OworCitleHRlcm4gaW50IGNvbWJpbmVyX2luaXQodW5zaWduZWQgaW50IGNvbWJpbmVyX25yLCB2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkgdW5zaWduZWQgaW50IGlycV9zdGFydCk7CitleHRlcm4gdm9pZCBjb21iaW5lcl9jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgY29tYmluZXJfbnIsIHVuc2lnbmVkIGludCBpcnEpOworCisvKiBJbml0aWFsIElPIG1hcHBpbmdzICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGV4eW5vc19pb2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1lTVElNRVIsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1NfUEFfU1lTVElNRVIpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9QTVUsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1NfUEFfUE1VKSwKKwkJLmxlbmd0aAkJPSBTWl82NEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0NPTUJJTkVSX0JBU0UsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1NfUEFfQ09NQklORVIpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HSUNfQ1BVLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TX1BBX0dJQ19DUFUpLAorCQkubGVuZ3RoCQk9IFNaXzY0SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfR0lDX0RJU1QsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1NfUEFfR0lDX0RJU1QpLAorCQkubGVuZ3RoCQk9IFNaXzY0SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVUFSVCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFMzQ19QQV9VQVJUKSwKKwkJLmxlbmd0aAkJPSBTWl81MTJLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgZXh5bm9zNF9pb2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfQ01VLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9DTVUpLAorCQkubGVuZ3RoCQk9IFNaXzEyOEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0NPUkVQRVJJX0JBU0UsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0NPUkVQRVJJKSwKKwkJLmxlbmd0aAkJPSBTWl84SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfTDJDQywKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfTDJDQyksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8xLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8yLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMiksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LCB7CisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8zLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMyksCisJCS5sZW5ndGgJCT0gU1pfMjU2LAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9ETUMwLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9ETUMwKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1JPTUMsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX1NST01DKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVVNCX0hTUEhZLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9IU1BIWSksCisJCS5sZW5ndGgJCT0gU1pfNEssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBleHlub3M0X2lvZGVzYzBbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfU1lTUkFNLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9TWVNSQU0wKSwKKwkJLmxlbmd0aAkJPSBTWl80SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGV4eW5vczRfaW9kZXNjMVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9TWVNSQU0sCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX1NZU1JBTTEpLAorCQkubGVuZ3RoCQk9IFNaXzRLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGV4eW5vc19pZGxlKHZvaWQpCit7CisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJY3B1X2RvX2lkbGUoKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9zd19yZXNldCh2b2lkKQoreworCV9fcmF3X3dyaXRlbCgweDEsIFM1UF9TV1JFU0VUKTsKK30KKworLyoKKyAqIGV4eW5vc19tYXBfaW8KKyAqCisgKiByZWdpc3RlciB0aGUgc3RhbmRhcmQgY3B1IElPIGFyZWFzCisgKi8KK3ZvaWQgX19pbml0IGV4eW5vczRfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KGV4eW5vc19pb2Rlc2MsIEFSUkFZX1NJWkUoZXh5bm9zX2lvZGVzYykpOworCWlvdGFibGVfaW5pdChleHlub3M0X2lvZGVzYywgQVJSQVlfU0laRShleHlub3M0X2lvZGVzYykpOworCisJaWYgKHNvY19pc19leHlub3M0MjEwKCkgJiYgc2Ftc3VuZ19yZXYoKSA9PSBFWFlOT1M0MjEwX1JFVl8wKQorCQlpb3RhYmxlX2luaXQoZXh5bm9zNF9pb2Rlc2MwLCBBUlJBWV9TSVpFKGV4eW5vczRfaW9kZXNjMCkpOworCWVsc2UKKwkJaW90YWJsZV9pbml0KGV4eW5vczRfaW9kZXNjMSwgQVJSQVlfU0laRShleHlub3M0X2lvZGVzYzEpKTsKKworCS8qIGluaXRpYWxpemUgZGV2aWNlIGluZm9ybWF0aW9uIGVhcmx5ICovCisJZXh5bm9zNF9kZWZhdWx0X3NkaGNpMCgpOworCWV4eW5vczRfZGVmYXVsdF9zZGhjaTEoKTsKKwlleHlub3M0X2RlZmF1bHRfc2RoY2kyKCk7CisJZXh5bm9zNF9kZWZhdWx0X3NkaGNpMygpOworCisJczNjX2FkY19zZXRuYW1lKCJzYW1zdW5nLWFkYy12MyIpOworCisJczNjX2ZpbWNfc2V0bmFtZSgwLCAiZXh5bm9zNC1maW1jIik7CisJczNjX2ZpbWNfc2V0bmFtZSgxLCAiZXh5bm9zNC1maW1jIik7CisJczNjX2ZpbWNfc2V0bmFtZSgyLCAiZXh5bm9zNC1maW1jIik7CisJczNjX2ZpbWNfc2V0bmFtZSgzLCAiZXh5bm9zNC1maW1jIik7CisKKwkvKiBUaGUgSTJDIGJ1cyBjb250cm9sbGVycyBhcmUgZGlyZWN0bHkgY29tcGF0aWJsZSB3aXRoIHMzYzI0NDAgKi8KKwlzM2NfaTJjMF9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOworCXMzY19pMmMxX3NldG5hbWUoInMzYzI0NDAtaTJjIik7CisJczNjX2kyYzJfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKKworCXM1cF9mYl9zZXRuYW1lKDAsICJleHlub3M0LWZiIik7CisJczVwX2hkbWlfc2V0bmFtZSgiZXh5bm9zNC1oZG1pIik7Cit9CisKK3ZvaWQgX19pbml0IGV4eW5vczRfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbml0aWFsaXppbmcgY2xvY2tzXG4iLCBfX2Z1bmNfXyk7CisKKwlzM2MyNHh4X3JlZ2lzdGVyX2Jhc2VjbG9ja3MoeHRhbCk7CisJczVwX3JlZ2lzdGVyX2Nsb2Nrcyh4dGFsKTsKKworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQlleHlub3M0MjEwX3JlZ2lzdGVyX2Nsb2NrcygpOworCWVsc2UgaWYgKHNvY19pc19leHlub3M0MjEyKCkgfHwgc29jX2lzX2V4eW5vczQ0MTIoKSkKKwkJZXh5bm9zNDIxMl9yZWdpc3Rlcl9jbG9ja3MoKTsKKworCWV4eW5vczRfcmVnaXN0ZXJfY2xvY2tzKCk7CisJZXh5bm9zNF9zZXR1cF9jbG9ja3MoKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9naWNfaXJxX2ZpeF9iYXNlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljX2RhdGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCWdpY19kYXRhLT5jcHVfYmFzZSA9IFM1UF9WQV9HSUNfQ1BVICsKKwkJCSAgICAoZ2ljX2Jhbmtfb2Zmc2V0ICogc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCWdpY19kYXRhLT5kaXN0X2Jhc2UgPSBTNVBfVkFfR0lDX0RJU1QgKworCQkJICAgIChnaWNfYmFua19vZmZzZXQgKiBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCit2b2lkIF9faW5pdCBleHlub3M0X2luaXRfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKworCWdpY19iYW5rX29mZnNldCA9IHNvY19pc19leHlub3M0NDEyKCkgPyAweDQwMDAgOiAweDgwMDA7CisKKwlnaWNfaW5pdCgwLCBJUlFfUFBJKDApLCBTNVBfVkFfR0lDX0RJU1QsIFM1UF9WQV9HSUNfQ1BVKTsKKwlnaWNfYXJjaF9leHRuLmlycV9lb2kgPSBleHlub3M0X2dpY19pcnFfZml4X2Jhc2U7CisJZ2ljX2FyY2hfZXh0bi5pcnFfdW5tYXNrID0gZXh5bm9zNF9naWNfaXJxX2ZpeF9iYXNlOworCWdpY19hcmNoX2V4dG4uaXJxX21hc2sgPSBleHlub3M0X2dpY19pcnFfZml4X2Jhc2U7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE1BWF9DT01CSU5FUl9OUjsgaXJxKyspIHsKKworCQljb21iaW5lcl9pbml0KGlycSwgKHZvaWQgX19pb21lbSAqKVM1UF9WQV9DT01CSU5FUihpcnEpLAorCQkJCUNPTUJJTkVSX0lSUShpcnEsIDApKTsKKwkJY29tYmluZXJfY2FzY2FkZV9pcnEoaXJxLCBJUlFfU1BJKGlycSkpOworCX0KKworCS8qIFRoZSBwYXJhbWV0ZXJzIG9mIHM1cF9pbml0X2lycSgpIGFyZSBmb3IgVklDIGluaXQuCisJICogVGhlc2VzIHBhcmFtZXRlcnMgc2hvdWxkIGJlIE5VTEwgYW5kIDAgYmVjYXVzZSBFWFlOT1M0CisJICogdXNlcyBHSUMgaW5zdGVhZCBvZiBWSUMuCisJICovCisJczVwX2luaXRfaXJxKE5VTEwsIDApOworfQorCitzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGV4eW5vczRfc3lzY2xhc3MgPSB7CisJLm5hbWUJPSAiZXh5bm9zNC1jb3JlIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBleHlub3M0X3N5c2RldiA9IHsKKwkuY2xzCT0gJmV4eW5vczRfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2NvcmVfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmV4eW5vczRfc3lzY2xhc3MpOworfQorY29yZV9pbml0Y2FsbChleHlub3M0X2NvcmVfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAorc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9sMngwX2NhY2hlX2luaXQodm9pZCkKK3sKKwkvKiBUQUcsIERhdGEgTGF0ZW5jeSBDb250cm9sOiAyY3ljbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgxMTAsIFM1UF9WQV9MMkNDICsgTDJYMF9UQUdfTEFURU5DWV9DVFJMKTsKKworCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQlfX3Jhd193cml0ZWwoMHgxMTAsIFM1UF9WQV9MMkNDICsgTDJYMF9EQVRBX0xBVEVOQ1lfQ1RSTCk7CisJZWxzZSBpZiAoc29jX2lzX2V4eW5vczQyMTIoKSB8fCBzb2NfaXNfZXh5bm9zNDQxMigpKQorCQlfX3Jhd193cml0ZWwoMHgxMjAsIFM1UF9WQV9MMkNDICsgTDJYMF9EQVRBX0xBVEVOQ1lfQ1RSTCk7CisKKwkvKiBMMlgwIFByZWZldGNoIENvbnRyb2wgKi8KKwlfX3Jhd193cml0ZWwoMHgzMDAwMDAwNywgUzVQX1ZBX0wyQ0MgKyBMMlgwX1BSRUZFVENIX0NUUkwpOworCisJLyogTDJYMCBQb3dlciBDb250cm9sICovCisJX19yYXdfd3JpdGVsKEwyWDBfRFlOQU1JQ19DTEtfR0FUSU5HX0VOIHwgTDJYMF9TVE5EQllfTU9ERV9FTiwKKwkJICAgICBTNVBfVkFfTDJDQyArIEwyWDBfUE9XRVJfQ1RSTCk7CisKKwlsMngwX2luaXQoUzVQX1ZBX0wyQ0MsIDB4N0M0NzAwMDEsIDB4QzIwMGZmZmYpOworCisJcmV0dXJuIDA7Cit9CisKK2Vhcmx5X2luaXRjYWxsKGV4eW5vczRfbDJ4MF9jYWNoZV9pbml0KTsKKyNlbmRpZgorCitpbnQgX19pbml0IGV4eW5vc19pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiRVhZTk9TOiBJbml0aWFsaXppbmcgYXJjaGl0ZWN0dXJlXG4iKTsKKworCS8qIHNldCBpZGxlIGZ1bmN0aW9uICovCisJcG1faWRsZSA9IGV4eW5vc19pZGxlOworCisJLyogc2V0IHN3X3Jlc2V0IGZ1bmN0aW9uICovCisJaWYgKHNvY19pc19leHlub3M0MjEwKCkgfHwgc29jX2lzX2V4eW5vczQyMTIoKSB8fCBzb2NfaXNfZXh5bm9zNDQxMigpKQorCQlzNXBfcmVzZXRfaG9vayA9IGV4eW5vczRfc3dfcmVzZXQ7CisKKwlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZleHlub3M0X3N5c2Rldik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHVpZGxlLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHVpZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNjUwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2NwdWlkbGUuYwpAQCAtMCwwICsxLDkwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1aWRsZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9lbnRlcl9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkgICAgICBpbnQgaW5kZXgpOworCitzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgZXh5bm9zNF9jcHVpZGxlX3NldFtdID0geworCVswXSA9IHsKKwkJLmVudGVyCQkJPSBleHlub3M0X2VudGVyX2lkbGUsCisJCS5leGl0X2xhdGVuY3kJCT0gMSwKKwkJLnRhcmdldF9yZXNpZGVuY3kJPSAxMDAwMDAsCisJCS5mbGFncwkJCT0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCisJCS5uYW1lCQkJPSAiSURMRSIsCisJCS5kZXNjCQkJPSAiQVJNIGNsb2NrIGdhdGluZyhXRkkpIiwKKwl9LAorfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVpZGxlX2RldmljZSwgZXh5bm9zNF9jcHVpZGxlX2RldmljZSk7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgZXh5bm9zNF9pZGxlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZXh5bm9zNF9pZGxlIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGV4eW5vczRfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCSAgICAgIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBiZWZvcmUsIGFmdGVyOworCWludCBpZGxlX3RpbWU7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRvX2dldHRpbWVvZmRheSgmYmVmb3JlKTsKKworCWNwdV9kb19pZGxlKCk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJmFmdGVyKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWRsZV90aW1lID0gKGFmdGVyLnR2X3NlYyAtIGJlZm9yZS50dl9zZWMpICogVVNFQ19QRVJfU0VDICsKKwkJICAgIChhZnRlci50dl91c2VjIC0gYmVmb3JlLnR2X3VzZWMpOworCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IGlkbGVfdGltZTsKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGV4eW5vczRfaW5pdF9jcHVpZGxlKHZvaWQpCit7CisJaW50IGksIG1heF9jcHVpZGxlX3N0YXRlLCBjcHVfaWQ7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmZXh5bm9zNF9pZGxlX2RyaXZlcjsKKworCS8qIFNldHVwIGNwdWlkbGUgZHJpdmVyICovCisJZHJ2LT5zdGF0ZV9jb3VudCA9IChzaXplb2YoZXh5bm9zNF9jcHVpZGxlX3NldCkgLworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwdWlkbGVfc3RhdGUpKTsKKwltYXhfY3B1aWRsZV9zdGF0ZSA9IGRydi0+c3RhdGVfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IG1heF9jcHVpZGxlX3N0YXRlOyBpKyspIHsKKwkJbWVtY3B5KCZkcnYtPnN0YXRlc1tpXSwgJmV4eW5vczRfY3B1aWRsZV9zZXRbaV0sCisJCQkJc2l6ZW9mKHN0cnVjdCBjcHVpZGxlX3N0YXRlKSk7CisJfQorCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZleHlub3M0X2lkbGVfZHJpdmVyKTsKKworCWZvcl9lYWNoX2NwdShjcHVfaWQsIGNwdV9vbmxpbmVfbWFzaykgeworCQlkZXZpY2UgPSAmcGVyX2NwdShleHlub3M0X2NwdWlkbGVfZGV2aWNlLCBjcHVfaWQpOworCQlkZXZpY2UtPmNwdSA9IGNwdV9pZDsKKworCQlkZXZpY2UtPnN0YXRlX2NvdW50ID0gZHJ2LT5zdGF0ZV9jb3VudDsKKworCQlpZiAoY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoZGV2aWNlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDUFVpZGxlIHJlZ2lzdGVyIGRldmljZSBmYWlsZWRcbiwiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKGV4eW5vczRfaW5pdF9jcHVpZGxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYWhjaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LWFoY2kuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1haGNpLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1haGNpLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtYXVkaW8uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1hdWRpby5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWF1ZGlvLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1hdWRpby5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LWR3bWNpLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtZHdtY2kuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1kd21jaS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9kZXYtZHdtY2kuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1wZC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LXBkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtcGQuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LXBkLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1zeXNtbXUuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2Rldi1zeXNtbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODE1NjNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZGV2LXN5c21tdS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LXN5c21tdS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBTeXN0ZW0gTU1VIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL3N5c21tdS5oPgorI2luY2x1ZGUgPHBsYXQvczVwLWNsb2NrLmg+CisKKy8qIFRoZXNlIG5hbWVzIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsb2NrIG5hbWVzIGluIG1hY2gtZXh5bm9zNC9jbG9jay5jICovCitjb25zdCBjaGFyICpzeXNtbXVfaXBzX25hbWVbRVhZTk9TNF9TWVNNTVVfVE9UQUxfSVBOVU1dID0geworCSJTWVNNTVVfTURNQSIJLAorCSJTWVNNTVVfU1NTIgksCisJIlNZU01NVV9GSU1DMCIJLAorCSJTWVNNTVVfRklNQzEiCSwKKwkiU1lTTU1VX0ZJTUMyIgksCisJIlNZU01NVV9GSU1DMyIJLAorCSJTWVNNTVVfSlBFRyIJLAorCSJTWVNNTVVfRklNRDAiCSwKKwkiU1lTTU1VX0ZJTUQxIgksCisJIlNZU01NVV9QQ0llIgksCisJIlNZU01NVV9HMkQiCSwKKwkiU1lTTU1VX1JPVEFUT1IiLAorCSJTWVNNTVVfTURNQTIiCSwKKwkiU1lTTU1VX1RWIgksCisJIlNZU01NVV9NRkNfTCIJLAorCSJTWVNNTVVfTUZDX1IiCSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXh5bm9zNF9zeXNtbXVfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfTURNQTBfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfTURNQTBfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1NTUywKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1NTUyArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1NTU18wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9TU1NfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbNF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMwLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzAgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVs1XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9GSU1DMF8wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9GSU1DMF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVs2XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzEsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMSArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzddID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMxXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMxXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzhdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMiwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMyICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbOV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfRklNQzJfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfRklNQzJfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMTBdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMywKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMzICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMTFdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMzXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMzXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzEyXSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfSlBFRywKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0pQRUcgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxM10gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfSlBFR18wLAorCQkuZW5kCT0gSVJRX1NZU01NVV9KUEVHXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzE0XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNRDAsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMCArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzE1XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9MQ0QwX00wXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX0xDRDBfTTBfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMTZdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMSwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQxICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMTddID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0xDRDFfTTFfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfTENEMV9NMV8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsxOF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1BDSWUsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9QQ0llICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMTldID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1BDSUVfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfUENJRV8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyMF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0cyRCwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0cyRCArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzIxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV8yRF8wLAorCQkuZW5kCT0gSVJRX1NZU01NVV8yRF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyMl0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1JPVEFUT1IsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9ST1RBVE9SICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMjNdID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1JPVEFUT1JfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfUk9UQVRPUl8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyNF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEyLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfTURNQTIgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsyNV0gPSB7CisJCS5zdGFydAk9IElSUV9TWVNNTVVfTURNQTFfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfTURNQTFfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMjZdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9UViwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1RWICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMjddID0geworCQkuc3RhcnQJPSBJUlFfU1lTTU1VX1RWX00wXzAsCisJCS5lbmQJPSBJUlFfU1lTTU1VX1RWX00wXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzI4XSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX0wsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfTCArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzI5XSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRkNfTTBfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfTUZDX00wXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzMwXSA9IHsKKwkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTUZDX1IsCisJCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfUiArIFNaXzY0SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzMxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRkNfTTFfMCwKKwkJLmVuZAk9IElSUV9TWVNNTVVfTUZDX00xXzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3N5c21tdSA9IHsKKwkubmFtZQkJPSAiczVwLXN5c21tdSIsCisJLmlkCQk9IDMyLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShleHlub3M0X3N5c21tdV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gZXh5bm9zNF9zeXNtbXVfcmVzb3VyY2UsCit9OworRVhQT1JUX1NZTUJPTChleHlub3M0X2RldmljZV9zeXNtbXUpOworCitzdGF0aWMgc3RydWN0IGNsayAqc3lzbW11X2Nsa1tTNVBfU1lTTU1VX1RPVEFMX0lQTlVNXTsKK3ZvaWQgc3lzbW11X2Nsa19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3lzbW11X2lwcyBpcHMpCit7CisJc3lzbW11X2Nsa1tpcHNdID0gY2xrX2dldChkZXYsIHN5c21tdV9pcHNfbmFtZVtpcHNdKTsKKwlpZiAoSVNfRVJSKHN5c21tdV9jbGtbaXBzXSkpCisJCXN5c21tdV9jbGtbaXBzXSA9IE5VTEw7CisJZWxzZQorCQljbGtfcHV0KHN5c21tdV9jbGtbaXBzXSk7Cit9CisKK3ZvaWQgc3lzbW11X2Nsa19lbmFibGUoc3lzbW11X2lwcyBpcHMpCit7CisJaWYgKHN5c21tdV9jbGtbaXBzXSkKKwkJY2xrX2VuYWJsZShzeXNtbXVfY2xrW2lwc10pOworfQorCit2b2lkIHN5c21tdV9jbGtfZGlzYWJsZShzeXNtbXVfaXBzIGlwcykKK3sKKwlpZiAoc3lzbW11X2Nsa1tpcHNdKQorCQljbGtfZGlzYWJsZShzeXNtbXVfY2xrW2lwc10pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvZG1hLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kbWEuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgorICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorCitzdGF0aWMgdTY0IGRtYV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWEwX3BlcmlbMjhdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTAsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMiwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBTX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDRfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQ0X1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVMyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzRfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVM0X1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X01JQ0lOLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X1BDTUlOLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9BQzk3X1BDTU9VVCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sCit9OworCitzdHJ1Y3QgZG1hX3BsMzMwX3BsYXRkYXRhIGV4eW5vczRfcGRtYTBfcGRhdGEgPSB7CisJLm5yX3ZhbGlkX3BlcmkgPSBBUlJBWV9TSVpFKHBkbWEwX3BlcmkpLAorCS5wZXJpID0gcGRtYTBfcGVyaSwKK307CisKK3N0cnVjdCBhbWJhX2RldmljZSBleHlub3M0X2RldmljZV9wZG1hMCA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMC4wIiwKKwkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YSA9ICZleHlub3M0X3BkbWEwX3BkYXRhLAorCX0sCisJLnJlcyA9IHsKKwkJLnN0YXJ0ID0gRVhZTk9TNF9QQV9QRE1BMCwKKwkJLmVuZCA9IEVYWU5PUzRfUEFfUERNQTAgKyBTWl80SywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxID0ge0lSUV9QRE1BMCwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAorfTsKKworc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWExX3BlcmlbMjVdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTEsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMywKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBTX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVMzX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TTElNQlVTM19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU0xJTUJVUzVfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NMSU1CVVM1X1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwKK307CisKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgZXh5bm9zNF9wZG1hMV9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUocGRtYTFfcGVyaSksCisJLnBlcmkgPSBwZG1hMV9wZXJpLAorfTsKKworc3RydWN0IGFtYmFfZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BkbWExID0geworCS5kZXYgPSB7CisJCS5pbml0X25hbWUgPSAiZG1hLXBsMzMwLjEiLAorCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhID0gJmV4eW5vczRfcGRtYTFfcGRhdGEsCisJfSwKKwkucmVzID0geworCQkuc3RhcnQgPSBFWFlOT1M0X1BBX1BETUExLAorCQkuZW5kID0gRVhZTk9TNF9QQV9QRE1BMSArIFNaXzRLLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS5pcnEgPSB7SVJRX1BETUExLCBOT19JUlF9LAorCS5wZXJpcGhpZCA9IDB4MDAwNDEzMzAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2RtYV9pbml0KHZvaWQpCit7CisJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoJmV4eW5vczRfZGV2aWNlX3BkbWEwLCAmaW9tZW1fcmVzb3VyY2UpOworCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZleHlub3M0X2RldmljZV9wZG1hMSwgJmlvbWVtX3Jlc291cmNlKTsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChleHlub3M0X2RtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9oZWFkc21wLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9oZWFkc21wLlMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2hlYWRzbXAuUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaG90cGx1Zy5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaG90cGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzBlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9ob3RwbHVnLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qIGxpbnV4IGFyY2gvYXJtL21hY2gtZXh5bm9zNC9ob3RwbHVnLmMKKyAqCisgKiAgQ2xvbmVkIGZyb20gbGludXgvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ob3RwbHVnLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFSTSBMdGQuCisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKworZXh0ZXJuIHZvbGF0aWxlIGludCBwZW5fcmVsZWFzZTsKKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9lbnRlcl9sb3dwb3dlcih2b2lkKQoreworCXVuc2lnbmVkIGludCB2OworCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJYXNtIHZvbGF0aWxlKAorCSIJbWNyCXAxNSwgMCwgJTEsIGM3LCBjNSwgMFxuIgorCSIJbWNyCXAxNSwgMCwgJTEsIGM3LCBjMTAsIDRcbiIKKwkvKgorCSAqIFR1cm4gb2ZmIGNvaGVyZW5jeQorCSAqLworCSIJbXJjCXAxNSwgMCwgJTAsIGMxLCBjMCwgMVxuIgorCSIJYmljCSUwLCAlMCwgJTNcbiIKKwkiCW1jcglwMTUsIDAsICUwLCBjMSwgYzAsIDFcbiIKKwkiCW1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKKwkiCWJpYwklMCwgJTAsICUyXG4iCisJIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJICA6ICI9JnIiICh2KQorCSAgOiAiciIgKDApLCAiSXIiIChDUl9DKSwgIklyIiAoMHg0MCkKKwkgIDogImNjIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfbGVhdmVfbG93cG93ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdjsKKworCWFzbSB2b2xhdGlsZSgKKwkibXJjCXAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgorCSIJb3JyCSUwLCAlMCwgJTFcbiIKKwkiCW1jcglwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKKwkiCW1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDFcbiIKKwkiCW9ycgklMCwgJTAsICUyXG4iCisJIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCisJICA6ICI9JnIiICh2KQorCSAgOiAiSXIiIChDUl9DKSwgIklyIiAoMHg0MCkKKwkgIDogImNjIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0Zm9ybV9kb19sb3dwb3dlcih1bnNpZ25lZCBpbnQgY3B1LCBpbnQgKnNwdXJpb3VzKQoreworCWZvciAoOzspIHsKKworCQkvKiBtYWtlIGNwdTEgdG8gYmUgdHVybmVkIG9mZiBhdCBuZXh0IFdGSSBjb21tYW5kICovCisJCWlmIChjcHUgPT0gMSkKKwkJCV9fcmF3X3dyaXRlbCgwLCBTNVBfQVJNX0NPUkUxX0NPTkZJR1VSQVRJT04pOworCisJCS8qCisJCSAqIGhlcmUncyB0aGUgV0ZJCisJCSAqLworCQlhc20oIi53b3JkCTB4ZTMyMGYwMDNcbiIKKwkJICAgIDoKKwkJICAgIDoKKwkJICAgIDogIm1lbW9yeSIsICJjYyIpOworCisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHVfbG9naWNhbF9tYXAoY3B1KSkgeworCQkJLyoKKwkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogR2V0dGluZyBoZXJlLCBtZWFucyB0aGF0IHdlIGhhdmUgY29tZSBvdXQgb2YgV0ZJIHdpdGhvdXQKKwkJICogaGF2aW5nIGJlZW4gd29rZW4gdXAgLSB0aGlzIHNob3VsZG4ndCBoYXBwZW4KKwkJICoKKwkJICogSnVzdCBub3RlIGl0IGhhcHBlbmluZyAtIHdoZW4gd2UncmUgd29rZW4sIHdlIGNhbiByZXBvcnQKKwkJICogaXRzIG9jY3VycmVuY2UuCisJCSAqLworCQkoKnNwdXJpb3VzKSsrOworCX0KK30KKworaW50IHBsYXRmb3JtX2NwdV9raWxsKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHRvIHNodXRkb3duIGEgQ1BVCisgKgorICogQ2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZAorICovCit2b2lkIHBsYXRmb3JtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgc3B1cmlvdXMgPSAwOworCisJLyoKKwkgKiB3ZSdyZSByZWFkeSBmb3Igc2h1dGRvd24gbm93LCBzbyBkbyBpdAorCSAqLworCWNwdV9lbnRlcl9sb3dwb3dlcigpOworCXBsYXRmb3JtX2RvX2xvd3Bvd2VyKGNwdSwgJnNwdXJpb3VzKTsKKworCS8qCisJICogYnJpbmcgdGhpcyBDUFUgYmFjayBpbnRvIHRoZSB3b3JsZCBvZiBjYWNoZQorCSAqIGNvaGVyZW5jeSwgYW5kIHRoZW4gcmVzdG9yZSBpbnRlcnJ1cHRzCisJICovCisJY3B1X2xlYXZlX2xvd3Bvd2VyKCk7CisKKwlpZiAoc3B1cmlvdXMpCisJCXByX3dhcm4oIkNQVSV1OiAldSBzcHVyaW91cyB3YWtldXAgY2FsbHNcbiIsIGNwdSwgc3B1cmlvdXMpOworfQorCitpbnQgcGxhdGZvcm1fY3B1X2Rpc2FibGUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIHdlIGRvbid0IGFsbG93IENQVSAwIHRvIGJlIHNodXRkb3duIChpdCBpcyBzdGlsbCB0b28gc3BlY2lhbAorCSAqIGUuZy4gY2xvY2sgdGljayBpbnRlcnJ1cHRzKQorCSAqLworCXJldHVybiBjcHUgPT0gMCA/IC1FUEVSTSA6IDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWNmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMCwwICsxLDM1IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworLyogcHVsbCBpbiB0aGUgcmVsZXZhbnQgcmVnaXN0ZXIgYW5kIG1hcCBmaWxlcy4gKi8KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKwkvKiBub3RlLCBmb3IgdGhlIGJvb3QgcHJvY2VzcyB0byB3b3JrIHdlIGhhdmUgdG8ga2VlcCB0aGUgVUFSVAorCSAqIHZpcnR1YWwgYWRkcmVzcyBhbGlnbmVkIHRvIGFuIDFNaUIgYm91bmRhcnkgZm9yIHRoZSBMMQorCSAqIG1hcHBpbmcgdGhlIGhlYWQgY29kZSBtYWtlcy4gV2Uga2VlcCB0aGUgVUFSVCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBhbGlnbmVkIGFuZCBhZGQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIGxvYWQgdGhlIHZhbHVlIGhlcmUuCisJICovCisKKwkubWFjcm8gYWRkcnVhcnQsIHJwLCBydiwgdG1wCisJCWxkcglccnAsID0gUzNDX1BBX1VBUlQKKwkJbGRyCVxydiwgPSBTM0NfVkFfVUFSVAorI2lmIENPTkZJR19ERUJVR19TM0NfVUFSVCAhPSAwCisJCWFkZAlccnAsIFxycCwgIygweDEwMDAwICogQ09ORklHX0RFQlVHX1MzQ19VQVJUKQorCQlhZGQJXHJ2LCBccnYsICMoMHgxMDAwMCAqIENPTkZJR19ERUJVR19TM0NfVUFSVCkKKyNlbmRpZgorCS5lbmRtCisKKyNkZWZpbmUgZmlmb19mdWxsIGZpZm9fZnVsbF9zNXB2MjEwCisjZGVmaW5lIGZpZm9fbGV2ZWwgZmlmb19sZXZlbF9zNXB2MjEwCisKKyNpbmNsdWRlIDxwbGF0L2RlYnVnLW1hY3JvLlM+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxODQyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KKyAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTUFDSF9ETUFfSAorI2RlZmluZSBfX01BQ0hfRE1BX0gKKworLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gRE1BIEFQSSBkcml2ZXIgZm9yIFBMMzMwICovCisjaW5jbHVkZSA8cGxhdC9kbWEtcGwzMzAuaD4KKworI2VuZGlmIC8qIF9fTUFDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kd21jaS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2R3bWNpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZHdtY2kuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2R3bWNpLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlOWZkOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0wLDAgKzEsOTEgQEAKKy8qIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworICoKKyAqIENsb25lZCBmcm9tIGFyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKyAqCisgKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIEVYWU5PUzQgcGxhdGZvcm1zCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqLworCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorCisJCS5tYWNybwlkaXNhYmxlX2ZpcQorCQkuZW5kbQorCisJCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKKwkJbW92CVx0bXAsICMwCisKKwkJbXJjCXAxNSwgMCwgXGJhc2UsIGMwLCBjMCwgNQorCQlhbmQJXGJhc2UsIFxiYXNlLCAjMworCQljbXAJXGJhc2UsICMwCisJCWJlcQkxZgorCisJCWxkcglcdG1wLCA9Z2ljX2Jhbmtfb2Zmc2V0CisJCWxkcglcdG1wLCBbXHRtcF0KKwkJY21wCVxiYXNlLCAjMQorCQliZXEJMWYKKworCQljbXAJXGJhc2UsICMyCisJCWFkZGVxCVx0bXAsIFx0bXAsIFx0bXAKKwkJYWRkbmUJXHRtcCwgXHRtcCwgXHRtcCwgTFNMICMxCisKKzE6CQlsZHIJXGJhc2UsID1naWNfY3B1X2Jhc2VfYWRkcgorCQlsZHIJXGJhc2UsIFtcYmFzZV0KKwkJYWRkCVxiYXNlLCBcYmFzZSwgXHRtcAorCQkuZW5kbQorCisJCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgorCQkuZW5kbQorCisJCS8qCisJCSAqIFRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZSBpcyBkZWZpbmVkIGluIHRoZQorCQkgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBzcGVjLiAgVG8gd2l0OgorCQkgKgorCQkgKiBJbnRlcnJ1cHRzIDAtMTUgYXJlIElQSQorCQkgKiAxNi0yOCBhcmUgcmVzZXJ2ZWQKKwkJICogMjktMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgorCQkgKiAzMi0xMDIwIGFyZSBnbG9iYWwKKwkJICogMTAyMS0xMDIyIGFyZSByZXNlcnZlZAorCQkgKiAxMDIzIGlzICJzcHVyaW91cyIgKG5vIGludGVycnVwdCkKKwkJICoKKwkJICogRm9yIG5vdywgd2UgaWdub3JlIGFsbCBsb2NhbCBpbnRlcnJ1cHRzIHNvIG9ubHkgcmV0dXJuIGFuIGludGVycnVwdCBpZiBpdCdzCisJCSAqIGJldHdlZW4gMzAgYW5kIDEwMjAuICBUaGUgdGVzdF9mb3JfaXBpIHJvdXRpbmUgYmVsb3cgd2lsbCBwaWNrIHVwIG9uIElQSXMuCisJCSAqCisJCSAqIEEgc2ltcGxlIHJlYWQgZnJvbSB0aGUgY29udHJvbGxlciB3aWxsIHRlbGwgdXMgdGhlIG51bWJlciBvZiB0aGUgaGlnaGVzdAorICAgICAgICAgICAgICAgICAqIHByaW9yaXR5IGVuYWJsZWQgaW50ZXJydXB0LiAgV2UgdGhlbiBqdXN0IG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBpbiB0aGUKKwkJICogdmFsaWQgcmFuZ2UgZm9yIGFuIElSUSAoMzAtMTAyMCBpbmNsdXNpdmUpLgorCQkgKi8KKworCQkubWFjcm8gIGdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAorCisJCWxkciAgICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfSU5UQUNLXSAvKiBiaXRzIDEyLTEwID0gc3JjIENQVSwgOS0wID0gaW50ICMgKi8KKworCQlsZHIJXHRtcCwgPTEwMjEKKworCQliaWMgICAgIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKKworCQljbXAgICAgIFxpcnFuciwgIzE1CisJCWNtcGNjCVxpcnFuciwgXGlycW5yCisJCWNtcG5lCVxpcnFuciwgXHRtcAorCQljbXBjcwlcaXJxbnIsIFxpcnFucgorCQlhZGRuZQlcaXJxbnIsIFxpcnFuciwgIzMyCisKKwkJLmVuZG0KKworCQkvKiBXZSBhc3N1bWUgdGhhdCBpcnFzdGF0ICh0aGUgcmF3IHZhbHVlIG9mIHRoZSBJUlEgYWNrbm93bGVkZ2UKKwkJICogcmVnaXN0ZXIpIGlzIHByZXNlcnZlZCBmcm9tIHRoZSBtYWNybyBhYm92ZS4KKwkJICogSWYgdGhlcmUgaXMgYW4gSVBJLCB3ZSBpbW1lZGlhdGVseSBzaWduYWwgZW5kIG9mIGludGVycnVwdCBvbiB0aGUKKwkJICogY29udHJvbGxlciwgc2luY2UgdGhpcyByZXF1aXJlcyB0aGUgb3JpZ2luYWwgaXJxc3RhdCB2YWx1ZSB3aGljaAorCQkgKiB3ZSB3b24ndCBlYXNpbHkgYmUgYWJsZSB0byByZWNyZWF0ZSBsYXRlci4KKwkJICovCisKKwkJLm1hY3JvIHRlc3RfZm9yX2lwaSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAorCQliaWMJXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAorCQljbXAJXGlycW5yLCAjMTYKKwkJc3RyY2MJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQorCQljbXBjcwlcaXJxbnIsIFxpcnFucgorCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2V4eW5vczQtY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9leHlub3M0LWNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZmNiZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9leHlub3M0LWNsb2NrLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZXh5bm9zNC1jbG9jay5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEhlYWRlciBmaWxlIGZvciBleHlub3M0IGNsb2NrIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0NMT0NLX0gKKyNkZWZpbmUgX19BU01fQVJDSF9DTE9DS19IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaTI3bTsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19zY2xrX3VzYnBoeTA7CitleHRlcm4gc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkxOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaXBoeTsKKworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX2FwbGw7CitleHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18xMzM7CitleHRlcm4gc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfc2Nsa192cGxsOworCitleHRlcm4gc3RydWN0IGNsayAqY2xrc2V0X2NvcmVidXNfbGlzdFtdOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9jb3JlYnVzOworCitleHRlcm4gc3RydWN0IGNsayAqY2xrc2V0X2FjbGtfdG9wX2xpc3RbXTsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X2FjbGs7CisKK2V4dGVybiBzdHJ1Y3QgY2xrICpjbGtzZXRfZ3JvdXBfbGlzdFtdOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfZ3JvdXA7CisKK2V4dGVybiBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKK2V4dGVybiBpbnQgZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IGV4eW5vczRfY2xrX2lwX2xjZDFfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOworCisjZW5kaWYgLyogX19BU01fQVJDSF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUyM2NhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDE0OSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBFWFlOT1M0IC0gR1BJTyBsaWIgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19IIF9fRklMRV9fCisKKy8qIFByYWN0aWNhbGx5LCBHUElPIGJhbmtzIHVwIHRvIEdQWiBhcmUgdGhlIGNvbmZpZ3VyYWJsZSBncGlvIGJhbmtzICovCisKKy8qIEdQSU8gYmFuayBzaXplcyAqLworI2RlZmluZSBFWFlOT1M0X0dQSU9fQTBfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19BMV9OUgkoNikKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0JfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19DMF9OUgkoNSkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0MxX05SCSg1KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRDBfTlIJKDQpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19EMV9OUgkoNCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0UwX05SCSg1KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRTFfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19FMl9OUgkoNikKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0UzX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRTRfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19GMF9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0YxX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fRjJfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19GM19OUgkoNikKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0owX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fSjFfTlIJKDUpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19LMF9OUgkoNykKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0sxX05SCSg3KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fSzJfTlIJKDcpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19LM19OUgkoNykKKyNkZWZpbmUgRVhZTk9TNF9HUElPX0wwX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fTDFfTlIJKDMpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19MMl9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1gwX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWDFfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19YMl9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1gzX05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWTBfTlIJKDYpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19ZMV9OUgkoNCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1kyX05SCSg2KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWTNfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19ZNF9OUgkoOCkKKyNkZWZpbmUgRVhZTk9TNF9HUElPX1k1X05SCSg4KQorI2RlZmluZSBFWFlOT1M0X0dQSU9fWTZfTlIJKDgpCisjZGVmaW5lIEVYWU5PUzRfR1BJT19aX05SCSg3KQorCisvKiBHUElPIGJhbmsgbnVtYmVycyAqLworCisjZGVmaW5lIEVYWU5PUzRfR1BJT19ORVhUKF9fZ3BpbykgXAorCSgoX19ncGlvIyNfU1RBUlQpICsgKF9fZ3BpbyMjX05SKSArIENPTkZJR19TM0NfR1BJT19TUEFDRSArIDEpCisKK2VudW0gczVwX2dwaW9fbnVtYmVyIHsKKwlFWFlOT1M0X0dQSU9fQTBfU1RBUlQJPSAwLAorCUVYWU5PUzRfR1BJT19BMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19BMCksCisJRVhZTk9TNF9HUElPX0JfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQTEpLAorCUVYWU5PUzRfR1BJT19DMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19CKSwKKwlFWFlOT1M0X0dQSU9fQzFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQzApLAorCUVYWU5PUzRfR1BJT19EMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19DMSksCisJRVhZTk9TNF9HUElPX0QxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0QwKSwKKwlFWFlOT1M0X0dQSU9fRTBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRDEpLAorCUVYWU5PUzRfR1BJT19FMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FMCksCisJRVhZTk9TNF9HUElPX0UyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0UxKSwKKwlFWFlOT1M0X0dQSU9fRTNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTIpLAorCUVYWU5PUzRfR1BJT19FNF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FMyksCisJRVhZTk9TNF9HUElPX0YwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0U0KSwKKwlFWFlOT1M0X0dQSU9fRjFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRjApLAorCUVYWU5PUzRfR1BJT19GMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19GMSksCisJRVhZTk9TNF9HUElPX0YzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YyKSwKKwlFWFlOT1M0X0dQSU9fSjBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRjMpLAorCUVYWU5PUzRfR1BJT19KMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19KMCksCisJRVhZTk9TNF9HUElPX0swX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0oxKSwKKwlFWFlOT1M0X0dQSU9fSzFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSzApLAorCUVYWU5PUzRfR1BJT19LMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19LMSksCisJRVhZTk9TNF9HUElPX0szX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0syKSwKKwlFWFlOT1M0X0dQSU9fTDBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSzMpLAorCUVYWU5PUzRfR1BJT19MMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19MMCksCisJRVhZTk9TNF9HUElPX0wyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0wxKSwKKwlFWFlOT1M0X0dQSU9fWDBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fTDIpLAorCUVYWU5PUzRfR1BJT19YMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19YMCksCisJRVhZTk9TNF9HUElPX1gyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1gxKSwKKwlFWFlOT1M0X0dQSU9fWDNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDIpLAorCUVYWU5PUzRfR1BJT19ZMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19YMyksCisJRVhZTk9TNF9HUElPX1kxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1kwKSwKKwlFWFlOT1M0X0dQSU9fWTJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTEpLAorCUVYWU5PUzRfR1BJT19ZM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMiksCisJRVhZTk9TNF9HUElPX1k0X1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1kzKSwKKwlFWFlOT1M0X0dQSU9fWTVfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTQpLAorCUVYWU5PUzRfR1BJT19ZNl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZNSksCisJRVhZTk9TNF9HUElPX1pfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTYpLAorfTsKKworLyogRVhZTk9TNCBHUElPIG51bWJlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFWFlOT1M0X0dQQTAoX25yKQkoRVhZTk9TNF9HUElPX0EwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BBMShfbnIpCShFWFlOT1M0X0dQSU9fQTFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEIoX25yKQkoRVhZTk9TNF9HUElPX0JfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEMwKF9ucikJKEVYWU5PUzRfR1BJT19DMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQQzEoX25yKQkoRVhZTk9TNF9HUElPX0MxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BEMChfbnIpCShFWFlOT1M0X0dQSU9fRDBfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEQxKF9ucikJKEVYWU5PUzRfR1BJT19EMV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRTAoX25yKQkoRVhZTk9TNF9HUElPX0UwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BFMShfbnIpCShFWFlOT1M0X0dQSU9fRTFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEUyKF9ucikJKEVYWU5PUzRfR1BJT19FMl9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRTMoX25yKQkoRVhZTk9TNF9HUElPX0UzX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BFNChfbnIpCShFWFlOT1M0X0dQSU9fRTRfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEYwKF9ucikJKEVYWU5PUzRfR1BJT19GMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQRjEoX25yKQkoRVhZTk9TNF9HUElPX0YxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BGMihfbnIpCShFWFlOT1M0X0dQSU9fRjJfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEYzKF9ucikJKEVYWU5PUzRfR1BJT19GM19TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQSjAoX25yKQkoRVhZTk9TNF9HUElPX0owX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BKMShfbnIpCShFWFlOT1M0X0dQSU9fSjFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEswKF9ucikJKEVYWU5PUzRfR1BJT19LMF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQSzEoX25yKQkoRVhZTk9TNF9HUElPX0sxX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BLMihfbnIpCShFWFlOT1M0X0dQSU9fSzJfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEszKF9ucikJKEVYWU5PUzRfR1BJT19LM19TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQTDAoX25yKQkoRVhZTk9TNF9HUElPX0wwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BMMShfbnIpCShFWFlOT1M0X0dQSU9fTDFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUEwyKF9ucikJKEVYWU5PUzRfR1BJT19MMl9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWDAoX25yKQkoRVhZTk9TNF9HUElPX1gwX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BYMShfbnIpCShFWFlOT1M0X0dQSU9fWDFfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFgyKF9ucikJKEVYWU5PUzRfR1BJT19YMl9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWDMoX25yKQkoRVhZTk9TNF9HUElPX1gzX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BZMChfbnIpCShFWFlOT1M0X0dQSU9fWTBfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFkxKF9ucikJKEVYWU5PUzRfR1BJT19ZMV9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWTIoX25yKQkoRVhZTk9TNF9HUElPX1kyX1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BZMyhfbnIpCShFWFlOT1M0X0dQSU9fWTNfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFk0KF9ucikJKEVYWU5PUzRfR1BJT19ZNF9TVEFSVCArIChfbnIpKQorI2RlZmluZSBFWFlOT1M0X0dQWTUoX25yKQkoRVhZTk9TNF9HUElPX1k1X1NUQVJUICsgKF9ucikpCisjZGVmaW5lIEVYWU5PUzRfR1BZNihfbnIpCShFWFlOT1M0X0dQSU9fWTZfU1RBUlQgKyAoX25yKSkKKyNkZWZpbmUgRVhZTk9TNF9HUFooX25yKQkoRVhZTk9TNF9HUElPX1pfU1RBUlQgKyAoX25yKSkKKworLyogdGhlIGVuZCBvZiB0aGUgRVhZTk9TNCBzcGVjaWZpYyBncGlvcyAqLworI2RlZmluZSBFWFlOT1M0X0dQSU9fRU5ECShFWFlOT1M0X0dQWihFWFlOT1M0X0dQSU9fWl9OUikgKyAxKQorI2RlZmluZSBTM0NfR1BJT19FTkQJCUVYWU5PUzRfR1BJT19FTkQKKworLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgZ3Bpb3Mgd2UgbmVlZCB0byB0aGUgb25lIGFmdGVyIHRoZSBHUFooKSByYW5nZSAqLworI2RlZmluZSBBUkNIX05SX0dQSU9TCQkoRVhZTk9TNF9HUFooRVhZTk9TNF9HUElPX1pfTlIpICsJXAorCQkJCSBDT05GSUdfU0FNU1VOR19HUElPX0VYVFJBICsgMSkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2lvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvaW8uaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL2lvLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvaXJxcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDRiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0wLDAgKzEsMTY5IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2lycXMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBJUlEgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0lSUVNfSAorI2RlZmluZSBfX0FTTV9BUkNIX0lSUVNfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CisKKy8qIFBQSTogUHJpdmF0ZSBQZXJpcGhlcmFsIEludGVycnVwdCAqLworCisjZGVmaW5lIElSUV9QUEkoeCkJCVM1UF9JUlEoeCsxNikKKworI2RlZmluZSBJUlFfTUNUX0xPQ0FMVElNRVIJSVJRX1BQSSgxMikKKworLyogU1BJOiBTaGFyZWQgUGVyaXBoZXJhbCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBJUlFfU1BJKHgpCQlTNVBfSVJRKHgrMzIpCisKKyNkZWZpbmUgSVJRX0VJTlQwCQlJUlFfU1BJKDE2KQorI2RlZmluZSBJUlFfRUlOVDEJCUlSUV9TUEkoMTcpCisjZGVmaW5lIElSUV9FSU5UMgkJSVJRX1NQSSgxOCkKKyNkZWZpbmUgSVJRX0VJTlQzCQlJUlFfU1BJKDE5KQorI2RlZmluZSBJUlFfRUlOVDQJCUlSUV9TUEkoMjApCisjZGVmaW5lIElSUV9FSU5UNQkJSVJRX1NQSSgyMSkKKyNkZWZpbmUgSVJRX0VJTlQ2CQlJUlFfU1BJKDIyKQorI2RlZmluZSBJUlFfRUlOVDcJCUlSUV9TUEkoMjMpCisjZGVmaW5lIElSUV9FSU5UOAkJSVJRX1NQSSgyNCkKKyNkZWZpbmUgSVJRX0VJTlQ5CQlJUlFfU1BJKDI1KQorI2RlZmluZSBJUlFfRUlOVDEwCQlJUlFfU1BJKDI2KQorI2RlZmluZSBJUlFfRUlOVDExCQlJUlFfU1BJKDI3KQorI2RlZmluZSBJUlFfRUlOVDEyCQlJUlFfU1BJKDI4KQorI2RlZmluZSBJUlFfRUlOVDEzCQlJUlFfU1BJKDI5KQorI2RlZmluZSBJUlFfRUlOVDE0CQlJUlFfU1BJKDMwKQorI2RlZmluZSBJUlFfRUlOVDE1CQlJUlFfU1BJKDMxKQorI2RlZmluZSBJUlFfRUlOVDE2XzMxCQlJUlFfU1BJKDMyKQorCisjZGVmaW5lIElSUV9QRE1BMAkJSVJRX1NQSSgzNSkKKyNkZWZpbmUgSVJRX1BETUExCQlJUlFfU1BJKDM2KQorI2RlZmluZSBJUlFfVElNRVIwX1ZJQwkJSVJRX1NQSSgzNykKKyNkZWZpbmUgSVJRX1RJTUVSMV9WSUMJCUlSUV9TUEkoMzgpCisjZGVmaW5lIElSUV9USU1FUjJfVklDCQlJUlFfU1BJKDM5KQorI2RlZmluZSBJUlFfVElNRVIzX1ZJQwkJSVJRX1NQSSg0MCkKKyNkZWZpbmUgSVJRX1RJTUVSNF9WSUMJCUlSUV9TUEkoNDEpCisjZGVmaW5lIElSUV9NQ1RfTDAJCUlSUV9TUEkoNDIpCisjZGVmaW5lIElSUV9XRFQJCQlJUlFfU1BJKDQzKQorI2RlZmluZSBJUlFfUlRDX0FMQVJNCQlJUlFfU1BJKDQ0KQorI2RlZmluZSBJUlFfUlRDX1RJQwkJSVJRX1NQSSg0NSkKKyNkZWZpbmUgSVJRX0dQSU9fWEIJCUlSUV9TUEkoNDYpCisjZGVmaW5lIElSUV9HUElPX1hBCQlJUlFfU1BJKDQ3KQorI2RlZmluZSBJUlFfTUNUX0wxCQlJUlFfU1BJKDQ4KQorCisjZGVmaW5lIElSUV9VQVJUMAkJSVJRX1NQSSg1MikKKyNkZWZpbmUgSVJRX1VBUlQxCQlJUlFfU1BJKDUzKQorI2RlZmluZSBJUlFfVUFSVDIJCUlSUV9TUEkoNTQpCisjZGVmaW5lIElSUV9VQVJUMwkJSVJRX1NQSSg1NSkKKyNkZWZpbmUgSVJRX1VBUlQ0CQlJUlFfU1BJKDU2KQorI2RlZmluZSBJUlFfTUNUX0cwCQlJUlFfU1BJKDU3KQorI2RlZmluZSBJUlFfSUlDCQkJSVJRX1NQSSg1OCkKKyNkZWZpbmUgSVJRX0lJQzEJCUlSUV9TUEkoNTkpCisjZGVmaW5lIElSUV9JSUMyCQlJUlFfU1BJKDYwKQorI2RlZmluZSBJUlFfSUlDMwkJSVJRX1NQSSg2MSkKKyNkZWZpbmUgSVJRX0lJQzQJCUlSUV9TUEkoNjIpCisjZGVmaW5lIElSUV9JSUM1CQlJUlFfU1BJKDYzKQorI2RlZmluZSBJUlFfSUlDNgkJSVJRX1NQSSg2NCkKKyNkZWZpbmUgSVJRX0lJQzcJCUlSUV9TUEkoNjUpCisKKyNkZWZpbmUgSVJRX1VTQl9IT1NUCQlJUlFfU1BJKDcwKQorI2RlZmluZSBJUlFfVVNCX0hTT1RHCQlJUlFfU1BJKDcxKQorI2RlZmluZSBJUlFfTU9ERU1fSUYJCUlSUV9TUEkoNzIpCisjZGVmaW5lIElSUV9IU01NQzAJCUlSUV9TUEkoNzMpCisjZGVmaW5lIElSUV9IU01NQzEJCUlSUV9TUEkoNzQpCisjZGVmaW5lIElSUV9IU01NQzIJCUlSUV9TUEkoNzUpCisjZGVmaW5lIElSUV9IU01NQzMJCUlSUV9TUEkoNzYpCisjZGVmaW5lIElSUV9EV01DSQkJSVJRX1NQSSg3NykKKworI2RlZmluZSBJUlFfTUlQSV9DU0lTMAkJSVJRX1NQSSg3OCkKKyNkZWZpbmUgSVJRX01JUElfQ1NJUzEJCUlSUV9TUEkoODApCisKKyNkZWZpbmUgSVJRX09ORU5BTkRfQVVESQlJUlFfU1BJKDgyKQorI2RlZmluZSBJUlFfUk9UQVRPUgkJSVJRX1NQSSg4MykKKyNkZWZpbmUgSVJRX0ZJTUMwCQlJUlFfU1BJKDg0KQorI2RlZmluZSBJUlFfRklNQzEJCUlSUV9TUEkoODUpCisjZGVmaW5lIElSUV9GSU1DMgkJSVJRX1NQSSg4NikKKyNkZWZpbmUgSVJRX0ZJTUMzCQlJUlFfU1BJKDg3KQorI2RlZmluZSBJUlFfSlBFRwkJSVJRX1NQSSg4OCkKKyNkZWZpbmUgSVJRXzJECQkJSVJRX1NQSSg4OSkKKyNkZWZpbmUgSVJRX1BDSUUJCUlSUV9TUEkoOTApCisKKyNkZWZpbmUgSVJRX01JWEVSCQlJUlFfU1BJKDkxKQorI2RlZmluZSBJUlFfSERNSQkJSVJRX1NQSSg5MikKKyNkZWZpbmUgSVJRX0lJQ19IRE1JUEhZCQlJUlFfU1BJKDkzKQorI2RlZmluZSBJUlFfTUZDCQkJSVJRX1NQSSg5NCkKKyNkZWZpbmUgSVJRX1NETwkJCUlSUV9TUEkoOTUpCisKKyNkZWZpbmUgSVJRX0FVRElPX1NTCQlJUlFfU1BJKDk2KQorI2RlZmluZSBJUlFfSTJTMAkJSVJRX1NQSSg5NykKKyNkZWZpbmUgSVJRX0kyUzEJCUlSUV9TUEkoOTgpCisjZGVmaW5lIElSUV9JMlMyCQlJUlFfU1BJKDk5KQorI2RlZmluZSBJUlFfQUM5NwkJSVJRX1NQSSgxMDApCisKKyNkZWZpbmUgSVJRX1NQRElGCQlJUlFfU1BJKDEwNCkKKyNkZWZpbmUgSVJRX0FEQzAJCUlSUV9TUEkoMTA1KQorI2RlZmluZSBJUlFfUEVOMAkJSVJRX1NQSSgxMDYpCisjZGVmaW5lIElSUV9BREMxCQlJUlFfU1BJKDEwNykKKyNkZWZpbmUgSVJRX1BFTjEJCUlSUV9TUEkoMTA4KQorI2RlZmluZSBJUlFfS0VZUEFECQlJUlFfU1BJKDEwOSkKKyNkZWZpbmUgSVJRX1BNVQkJCUlSUV9TUEkoMTEwKQorI2RlZmluZSBJUlFfR1BTCQkJSVJRX1NQSSgxMTEpCisjZGVmaW5lIElSUV9JTlRGRUVEQ1RSTF9TU1MJSVJRX1NQSSgxMTIpCisjZGVmaW5lIElSUV9TTElNQlVTCQlJUlFfU1BJKDExMykKKworI2RlZmluZSBJUlFfVFNJCQkJSVJRX1NQSSgxMTUpCisjZGVmaW5lIElSUV9TQVRBCQlJUlFfU1BJKDExNikKKworI2RlZmluZSBNQVhfSVJRX0lOX0NPTUJJTkVSCTgKKyNkZWZpbmUgQ09NQklORVJfR1JPVVAoeCkJKCh4KSAqIE1BWF9JUlFfSU5fQ09NQklORVIgKyBJUlFfU1BJKDEyOCkpCisjZGVmaW5lIENPTUJJTkVSX0lSUSh4LCB5KQkoQ09NQklORVJfR1JPVVAoeCkgKyB5KQorCisjZGVmaW5lIElSUV9TWVNNTVVfTURNQTBfMAlDT01CSU5FUl9JUlEoNCwgMCkKKyNkZWZpbmUgSVJRX1NZU01NVV9TU1NfMAlDT01CSU5FUl9JUlEoNCwgMSkKKyNkZWZpbmUgSVJRX1NZU01NVV9GSU1DMF8wCUNPTUJJTkVSX0lSUSg0LCAyKQorI2RlZmluZSBJUlFfU1lTTU1VX0ZJTUMxXzAJQ09NQklORVJfSVJRKDQsIDMpCisjZGVmaW5lIElSUV9TWVNNTVVfRklNQzJfMAlDT01CSU5FUl9JUlEoNCwgNCkKKyNkZWZpbmUgSVJRX1NZU01NVV9GSU1DM18wCUNPTUJJTkVSX0lSUSg0LCA1KQorI2RlZmluZSBJUlFfU1lTTU1VX0pQRUdfMAlDT01CSU5FUl9JUlEoNCwgNikKKyNkZWZpbmUgSVJRX1NZU01NVV8yRF8wCQlDT01CSU5FUl9JUlEoNCwgNykKKworI2RlZmluZSBJUlFfU1lTTU1VX1JPVEFUT1JfMAlDT01CSU5FUl9JUlEoNSwgMCkKKyNkZWZpbmUgSVJRX1NZU01NVV9NRE1BMV8wCUNPTUJJTkVSX0lSUSg1LCAxKQorI2RlZmluZSBJUlFfU1lTTU1VX0xDRDBfTTBfMAlDT01CSU5FUl9JUlEoNSwgMikKKyNkZWZpbmUgSVJRX1NZU01NVV9MQ0QxX00xXzAJQ09NQklORVJfSVJRKDUsIDMpCisjZGVmaW5lIElSUV9TWVNNTVVfVFZfTTBfMAlDT01CSU5FUl9JUlEoNSwgNCkKKyNkZWZpbmUgSVJRX1NZU01NVV9NRkNfTTBfMAlDT01CSU5FUl9JUlEoNSwgNSkKKyNkZWZpbmUgSVJRX1NZU01NVV9NRkNfTTFfMAlDT01CSU5FUl9JUlEoNSwgNikKKyNkZWZpbmUgSVJRX1NZU01NVV9QQ0lFXzAJQ09NQklORVJfSVJRKDUsIDcpCisKKyNkZWZpbmUgSVJRX0ZJTUQwX0ZJRk8JCUNPTUJJTkVSX0lSUSgxMSwgMCkKKyNkZWZpbmUgSVJRX0ZJTUQwX1ZTWU5DCQlDT01CSU5FUl9JUlEoMTEsIDEpCisjZGVmaW5lIElSUV9GSU1EMF9TWVNURU0JQ09NQklORVJfSVJRKDExLCAyKQorCisjZGVmaW5lIE1BWF9DT01CSU5FUl9OUgkJMTYKKworI2RlZmluZSBJUlFfQURDCQkJSVJRX0FEQzAKKyNkZWZpbmUgSVJRX1RDCQkJSVJRX1BFTjAKKworI2RlZmluZSBTNVBfSVJRX0VJTlRfQkFTRQlDT01CSU5FUl9JUlEoTUFYX0NPTUJJTkVSX05SLCAwKQorCisjZGVmaW5lIFM1UF9FSU5UX0JBU0UxCQkoUzVQX0lSUV9FSU5UX0JBU0UgKyAwKQorI2RlZmluZSBTNVBfRUlOVF9CQVNFMgkJKFM1UF9JUlFfRUlOVF9CQVNFICsgMTYpCisKKy8qIG9wdGlvbmFsIEdQSU8gaW50ZXJydXB0cyAqLworI2RlZmluZSBTNVBfR1BJT0lOVF9CQVNFCShTNVBfSVJRX0VJTlRfQkFTRSArIDMyKQorI2RlZmluZSBJUlFfR1BJTzFfTlJfR1JPVVBTCTE2CisjZGVmaW5lIElSUV9HUElPMl9OUl9HUk9VUFMJOQorI2RlZmluZSBJUlFfR1BJT19FTkQJCShTNVBfR1BJT0lOVF9CQVNFICsgUzVQX0dQSU9JTlRfQ09VTlQpCisKKy8qIFNldCB0aGUgZGVmYXVsdCBOUl9JUlFTICovCisjZGVmaW5lIE5SX0lSUVMJCQkoSVJRX0dQSU9fRU5EICsgNjQpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODU0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9tYXAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBFWFlOT1M0IC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfTUFQX0gKKyNkZWZpbmUgX19BU01fQVJDSF9NQVBfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8cGxhdC9tYXAtYmFzZS5oPgorCisvKgorICogRVhZTk9TNCBVQVJUIG9mZnNldCBpcyAweDEwMDAwIGJ1dCB0aGUgb2xkZXIgUzVQIFNvQ3MgYXJlIDB4NDAwLgorICogU28gbmVlZCB0byBkZWZpbmUgaXQsIGFuZCBoZXJlIGlzIHRvIGF2b2lkIHJlZGVmaW5pdGlvbiB3YXJuaW5nLgorICovCisjZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkJCSgweDEwMDAwKQorCisjaW5jbHVkZSA8cGxhdC9tYXAtczVwLmg+CisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNSQU0wCQkweDAyMDI1MDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTUkFNMQkJMHgwMjAyMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfRklNQzAJCTB4MTE4MDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9GSU1DMQkJMHgxMTgxMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMyCQkweDExODIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfRklNQzMJCTB4MTE4MzAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0kyUzAJCQkweDAzODMwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfSTJTMQkJCTB4RTMxMDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9JMlMyCQkJMHhFMkEwMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfUENNMAkJCTB4MDM4NDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9QQ00xCQkJMHgxMzk4MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1BDTTIJCQkweDEzOTkwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TUk9NX0JBTksoeCkJCSgweDA0MDAwMDAwICsgKCh4KSAqIDB4MDEwMDAwMDApKQorCisjZGVmaW5lIEVYWU5PUzRfUEFfT05FTkFORAkJMHgwQzAwMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX09ORU5BTkRfRE1BCQkweDBDNjAwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9DSElQSUQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1NZU0NPTgkJMHgxMDAxMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1BNVQkJCTB4MTAwMjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9DTVUJCQkweDEwMDMwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNUSU1FUgkJMHgxMDA1MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1dBVENIRE9HCQkweDEwMDYwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfUlRDCQkJMHgxMDA3MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfS0VZUEFECQkweDEwMEEwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9ETUMwCQkJMHgxMDQwMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfQ09NQklORVIJCTB4MTA0NDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0dJQ19DUFUJCTB4MTA0ODAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9HSUNfRElTVAkJMHgxMDQ5MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfQ09SRVBFUkkJCTB4MTA1MDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9UV0QJCQkweDEwNTAwNjAwCisjZGVmaW5lIEVYWU5PUzRfUEFfTDJDQwkJCTB4MTA1MDIwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX01ETUEJCQkweDEwODEwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfUERNQTAJCTB4MTI2ODAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9QRE1BMQkJMHgxMjY5MDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01ETUEJCTB4MTBBNDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfU1NTCQkweDEwQTUwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMwCQkweDExQTIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMxCQkweDExQTMwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMyCQkweDExQTQwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMzCQkweDExQTUwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0pQRUcJCTB4MTFBNjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNRDAJCTB4MTFFMjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNRDEJCTB4MTIyMjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfUENJZQkJMHgxMjYyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9HMkQJCTB4MTJBMjAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfUk9UQVRPUgkweDEyQTMwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01ETUEyCQkweDEyQTQwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX1RWCQkweDEyRTIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01GQ19MCQkweDEzNjIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX01GQ19SCQkweDEzNjMwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9HUElPMQkJMHgxMTQwMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0dQSU8yCQkweDExMDAwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfR1BJTzMJCTB4MDM4NjAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX01JUElfQ1NJUzAJCTB4MTE4ODAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9NSVBJX0NTSVMxCQkweDExODkwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9GSU1EMAkJMHgxMUMwMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfSFNNTUMoeCkJCSgweDEyNTEwMDAwICsgKCh4KSAqIDB4MTAwMDApKQorI2RlZmluZSBFWFlOT1M0X1BBX0RXTUNJCQkweDEyNTUwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TQVRBCQkJMHgxMjU2MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX1NBVEFQSFkJCTB4MTI1RDAwMDAKKyNkZWZpbmUgRVhZTk9TNF9QQV9TQVRBUEhZX0NUUkwJCTB4MTI2QjAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1NST01DCQkweDEyNTcwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9FSENJCQkJMHgxMjU4MDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0hTUEhZCQkweDEyNUIwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfTUZDCQkJMHgxMzQwMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfVUFSVAkJCTB4MTM4MDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1ZQCQkJMHgxMkMwMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX01JWEVSCQkweDEyQzEwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfU0RPCQkJMHgxMkMyMDAwMAorI2RlZmluZSBFWFlOT1M0X1BBX0hETUkJCQkweDEyRDAwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfSUlDX0hETUlQSFkJCTB4MTM4RTAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0lJQyh4KQkJKDB4MTM4NjAwMDAgKyAoKHgpICogMHgxMDAwMCkpCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9BREMJCQkweDEzOTEwMDAwCisjZGVmaW5lIEVYWU5PUzRfUEFfQURDMQkJCTB4MTM5MTEwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX0FDOTcJCQkweDEzOUEwMDAwCisKKyNkZWZpbmUgRVhZTk9TNF9QQV9TUERJRgkJMHgxMzlCMDAwMAorCisjZGVmaW5lIEVYWU5PUzRfUEFfVElNRVIJCTB4MTM5RDAwMDAKKworI2RlZmluZSBFWFlOT1M0X1BBX1NEUkFNCQkweDQwMDAwMDAwCisKKy8qIENvbXBhdGliaWx0aXkgRGVmaW5lcyAqLworCisjZGVmaW5lIFMzQ19QQV9IU01NQzAJCQlFWFlOT1M0X1BBX0hTTU1DKDApCisjZGVmaW5lIFMzQ19QQV9IU01NQzEJCQlFWFlOT1M0X1BBX0hTTU1DKDEpCisjZGVmaW5lIFMzQ19QQV9IU01NQzIJCQlFWFlOT1M0X1BBX0hTTU1DKDIpCisjZGVmaW5lIFMzQ19QQV9IU01NQzMJCQlFWFlOT1M0X1BBX0hTTU1DKDMpCisjZGVmaW5lIFMzQ19QQV9JSUMJCQlFWFlOT1M0X1BBX0lJQygwKQorI2RlZmluZSBTM0NfUEFfSUlDMQkJCUVYWU5PUzRfUEFfSUlDKDEpCisjZGVmaW5lIFMzQ19QQV9JSUMyCQkJRVhZTk9TNF9QQV9JSUMoMikKKyNkZWZpbmUgUzNDX1BBX0lJQzMJCQlFWFlOT1M0X1BBX0lJQygzKQorI2RlZmluZSBTM0NfUEFfSUlDNAkJCUVYWU5PUzRfUEFfSUlDKDQpCisjZGVmaW5lIFMzQ19QQV9JSUM1CQkJRVhZTk9TNF9QQV9JSUMoNSkKKyNkZWZpbmUgUzNDX1BBX0lJQzYJCQlFWFlOT1M0X1BBX0lJQyg2KQorI2RlZmluZSBTM0NfUEFfSUlDNwkJCUVYWU5PUzRfUEFfSUlDKDcpCisjZGVmaW5lIFMzQ19QQV9SVEMJCQlFWFlOT1M0X1BBX1JUQworI2RlZmluZSBTM0NfUEFfV0RUCQkJRVhZTk9TNF9QQV9XQVRDSERPRworI2RlZmluZSBTM0NfUEFfVUFSVAkJCUVYWU5PUzRfUEFfVUFSVAorCisjZGVmaW5lIFM1UF9QQV9DSElQSUQJCQlFWFlOT1M0X1BBX0NISVBJRAorI2RlZmluZSBTNVBfUEFfRUhDSQkJCUVYWU5PUzRfUEFfRUhDSQorI2RlZmluZSBTNVBfUEFfRklNQzAJCQlFWFlOT1M0X1BBX0ZJTUMwCisjZGVmaW5lIFM1UF9QQV9GSU1DMQkJCUVYWU5PUzRfUEFfRklNQzEKKyNkZWZpbmUgUzVQX1BBX0ZJTUMyCQkJRVhZTk9TNF9QQV9GSU1DMgorI2RlZmluZSBTNVBfUEFfRklNQzMJCQlFWFlOT1M0X1BBX0ZJTUMzCisjZGVmaW5lIFM1UF9QQV9GSU1EMAkJCUVYWU5PUzRfUEFfRklNRDAKKyNkZWZpbmUgUzVQX1BBX0hETUkJCQlFWFlOT1M0X1BBX0hETUkKKyNkZWZpbmUgUzVQX1BBX0lJQ19IRE1JUEhZCQlFWFlOT1M0X1BBX0lJQ19IRE1JUEhZCisjZGVmaW5lIFM1UF9QQV9NRkMJCQlFWFlOT1M0X1BBX01GQworI2RlZmluZSBTNVBfUEFfTUlQSV9DU0lTMAkJRVhZTk9TNF9QQV9NSVBJX0NTSVMwCisjZGVmaW5lIFM1UF9QQV9NSVBJX0NTSVMxCQlFWFlOT1M0X1BBX01JUElfQ1NJUzEKKyNkZWZpbmUgUzVQX1BBX01JWEVSCQkJRVhZTk9TNF9QQV9NSVhFUgorI2RlZmluZSBTNVBfUEFfT05FTkFORAkJCUVYWU5PUzRfUEFfT05FTkFORAorI2RlZmluZSBTNVBfUEFfT05FTkFORF9ETUEJCUVYWU5PUzRfUEFfT05FTkFORF9ETUEKKyNkZWZpbmUgUzVQX1BBX1NETwkJCUVYWU5PUzRfUEFfU0RPCisjZGVmaW5lIFM1UF9QQV9TRFJBTQkJCUVYWU5PUzRfUEFfU0RSQU0KKyNkZWZpbmUgUzVQX1BBX1NST01DCQkJRVhZTk9TNF9QQV9TUk9NQworI2RlZmluZSBTNVBfUEFfU1lTQ09OCQkJRVhZTk9TNF9QQV9TWVNDT04KKyNkZWZpbmUgUzVQX1BBX1RJTUVSCQkJRVhZTk9TNF9QQV9USU1FUgorI2RlZmluZSBTNVBfUEFfVlAJCQlFWFlOT1M0X1BBX1ZQCisKKyNkZWZpbmUgU0FNU1VOR19QQV9BREMJCQlFWFlOT1M0X1BBX0FEQworI2RlZmluZSBTQU1TVU5HX1BBX0FEQzEJCQlFWFlOT1M0X1BBX0FEQzEKKyNkZWZpbmUgU0FNU1VOR19QQV9LRVlQQUQJCUVYWU5PUzRfUEFfS0VZUEFECisKKyNkZWZpbmUgRVhZTk9TX1BBX0NPTUJJTkVSCQlFWFlOT1M0X1BBX0NPTUJJTkVSCisjZGVmaW5lIEVYWU5PU19QQV9HSUNfQ1BVCQlFWFlOT1M0X1BBX0dJQ19DUFUKKyNkZWZpbmUgRVhZTk9TX1BBX0dJQ19ESVNUCQlFWFlOT1M0X1BBX0dJQ19ESVNUCisjZGVmaW5lIEVYWU5PU19QQV9QTVUJCQlFWFlOT1M0X1BBX1BNVQorI2RlZmluZSBFWFlOT1NfUEFfU1lTVElNRVIJCUVYWU5PUzRfUEFfU1lTVElNRVIKKworLyogQ29tcGF0aWJpbGl0eSBVQVJUICovCisKKyNkZWZpbmUgUzNDX1ZBX1VBUlR4KHgpCQkJKFMzQ19WQV9VQVJUICsgKCh4KSAqIFMzQ19VQVJUX09GRlNFVCkpCisKKyNkZWZpbmUgUzVQX1BBX1VBUlQoeCkJCQkoUzNDX1BBX1VBUlQgKyAoKHgpICogUzNDX1VBUlRfT0ZGU0VUKSkKKyNkZWZpbmUgUzVQX1BBX1VBUlQwCQkJUzVQX1BBX1VBUlQoMCkKKyNkZWZpbmUgUzVQX1BBX1VBUlQxCQkJUzVQX1BBX1VBUlQoMSkKKyNkZWZpbmUgUzVQX1BBX1VBUlQyCQkJUzVQX1BBX1VBUlQoMikKKyNkZWZpbmUgUzVQX1BBX1VBUlQzCQkJUzVQX1BBX1VBUlQoMykKKyNkZWZpbmUgUzVQX1BBX1VBUlQ0CQkJUzVQX1BBX1VBUlQoNCkKKworI2RlZmluZSBTNVBfU1pfVUFSVAkJCVNaXzI1NgorCisjZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcG0tY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhkYTUxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcG0tY29yZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oLAorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBFWFlOT1M0MjEwIC0gUE0gY29yZSBzdXBwb3J0IGZvciBhcmNoL2FybS9wbGF0LXM1cC9wbS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9QTV9DT1JFX0gKKyNkZWZpbmUgX19BU01fQVJDSF9QTV9DT1JFX0ggX19GSUxFX18KKworI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9kZWJ1Z19pbml0X3VhcnQodm9pZCkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9wcmVwYXJlX2lycXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7CisJdG1wICY9IH4oMSA8PCAzMSk7CisJX19yYXdfd3JpdGVsKHRtcCwgUzVQX1dBS0VVUF9NQVNLKTsKKworCV9fcmF3X3dyaXRlbChzM2NfaXJxd2FrZV9pbnRtYXNrLCBTNVBfV0FLRVVQX01BU0spOworCV9fcmF3X3dyaXRlbChzM2NfaXJxd2FrZV9laW50bWFzaywgUzVQX0VJTlRfV0FLRVVQX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfc3RvcF9jbG9ja3Modm9pZCkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9zaG93X3Jlc3VtZV9pcnFzKHZvaWQpCit7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2FyY2hfdXBkYXRlX3VhcnQodm9pZCBfX2lvbWVtICpyZWdzLAorCQkJCQkgICBzdHJ1Y3QgcG1fdWFydF9zYXZlICpzYXZlKQoreworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9yZXN0b3JlZF9ncGlvcyh2b2lkKQoreworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfcG1fc2F2ZWRfZ3Bpb3Modm9pZCkKK3sKKwkvKiBub3RoaW5nIGhlcmUgeWV0ICovCit9CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1BNX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtdS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3BtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmRkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcG11LmgKQEAgLTAsMCArMSwzMiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbXUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogRVhZTk9TNDIxMCAtIFBNVShQb3dlciBNYW5hZ2VtZW50IFVuaXQpIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1BNVV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUE1VX0ggX19GSUxFX18KKworI2RlZmluZSBQTVVfVEFCTEVfRU5ECU5VTEwKKworZW51bSBzeXNfcG93ZXJkb3duIHsKKwlTWVNfQUZUUiwKKwlTWVNfTFBBLAorCVNZU19TTEVFUCwKKwlOVU1fU1lTX1BPV0VSRE9XTiwKK307CisKK3N0cnVjdCBleHlub3M0X3BtdV9jb25mIHsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1bnNpZ25lZCBpbnQgdmFsW05VTV9TWVNfUE9XRVJET1dOXTsKK307CisKK2V4dGVybiB2b2lkIGV4eW5vczRfc3lzX3Bvd2VyZG93bl9jb25mKGVudW0gc3lzX3Bvd2VyZG93biBtb2RlKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUE1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1hdWRzcy5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtYXVkc3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWF1ZHNzLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLWF1ZHNzLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzdlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCkBAIC0wLDAgKzEsMjEwIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBDbG9jayByZWdpc3RlciBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNkZWZpbmUgUzVQX0NMS1JFRyh4KQkJCShTNVBfVkFfQ01VICsgKHgpKQorCisjZGVmaW5lIFM1UF9DTEtESVZfTEVGVEJVUwkJUzVQX0NMS1JFRygweDA0NTAwKQorI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRfTEVGVEJVUwkJUzVQX0NMS1JFRygweDA0NjAwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9MRUZUQlVTCQlTNVBfQ0xLUkVHKDB4MDQ4MDApCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9SSUdIVEJVUwkJUzVQX0NMS1JFRygweDA4NTAwKQorI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRfUklHSFRCVVMJUzVQX0NMS1JFRygweDA4NjAwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9SSUdIVEJVUwkJUzVQX0NMS1JFRygweDA4ODAwKQorCisjZGVmaW5lIFM1UF9FUExMX0xPQ0sJCQlTNVBfQ0xLUkVHKDB4MEMwMTApCisjZGVmaW5lIFM1UF9WUExMX0xPQ0sJCQlTNVBfQ0xLUkVHKDB4MEMwMjApCisKKyNkZWZpbmUgUzVQX0VQTExfQ09OMAkJCVM1UF9DTEtSRUcoMHgwQzExMCkKKyNkZWZpbmUgUzVQX0VQTExfQ09OMQkJCVM1UF9DTEtSRUcoMHgwQzExNCkKKyNkZWZpbmUgUzVQX1ZQTExfQ09OMAkJCVM1UF9DTEtSRUcoMHgwQzEyMCkKKyNkZWZpbmUgUzVQX1ZQTExfQ09OMQkJCVM1UF9DTEtSRUcoMHgwQzEyNCkKKworI2RlZmluZSBTNVBfQ0xLU1JDX1RPUDAJCQlTNVBfQ0xLUkVHKDB4MEMyMTApCisjZGVmaW5lIFM1UF9DTEtTUkNfVE9QMQkJCVM1UF9DTEtSRUcoMHgwQzIxNCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19DQU0JCQlTNVBfQ0xLUkVHKDB4MEMyMjApCisjZGVmaW5lIFM1UF9DTEtTUkNfVFYJCQlTNVBfQ0xLUkVHKDB4MEMyMjQpCisjZGVmaW5lIFM1UF9DTEtTUkNfTUZDCQkJUzVQX0NMS1JFRygweDBDMjI4KQorI2RlZmluZSBTNVBfQ0xLU1JDX0czRAkJCVM1UF9DTEtSRUcoMHgwQzIyQykKKyNkZWZpbmUgUzVQX0NMS1NSQ19JTUFHRQkJUzVQX0NMS1JFRygweDBDMjMwKQorI2RlZmluZSBTNVBfQ0xLU1JDX0xDRDAJCQlTNVBfQ0xLUkVHKDB4MEMyMzQpCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFVRElPCQlTNVBfQ0xLUkVHKDB4MEMyM0MpCisjZGVmaW5lIFM1UF9DTEtTUkNfRlNZUwkJCVM1UF9DTEtSRUcoMHgwQzI0MCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19QRVJJTDAJCVM1UF9DTEtSRUcoMHgwQzI1MCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19QRVJJTDEJCVM1UF9DTEtSRUcoMHgwQzI1NCkKKworI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfVE9QCQlTNVBfQ0xLUkVHKDB4MEMzMTApCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19DQU0JCVM1UF9DTEtSRUcoMHgwQzMyMCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1RWCQlTNVBfQ0xLUkVHKDB4MEMzMjQpCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19MQ0QwCQlTNVBfQ0xLUkVHKDB4MEMzMzQpCisjZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19NQVVESU8JCVM1UF9DTEtSRUcoMHgwQzMzQykKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0ZTWVMJCVM1UF9DTEtSRUcoMHgwQzM0MCkKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX1BFUklMMAkJUzVQX0NMS1JFRygweDBDMzUwKQorI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfUEVSSUwxCQlTNVBfQ0xLUkVHKDB4MEMzNTQpCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9UT1AJCQlTNVBfQ0xLUkVHKDB4MEM1MTApCisjZGVmaW5lIFM1UF9DTEtESVZfQ0FNCQkJUzVQX0NMS1JFRygweDBDNTIwKQorI2RlZmluZSBTNVBfQ0xLRElWX1RWCQkJUzVQX0NMS1JFRygweDBDNTI0KQorI2RlZmluZSBTNVBfQ0xLRElWX01GQwkJCVM1UF9DTEtSRUcoMHgwQzUyOCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9HM0QJCQlTNVBfQ0xLUkVHKDB4MEM1MkMpCisjZGVmaW5lIFM1UF9DTEtESVZfSU1BR0UJCVM1UF9DTEtSRUcoMHgwQzUzMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9MQ0QwCQkJUzVQX0NMS1JFRygweDBDNTM0KQorI2RlZmluZSBTNVBfQ0xLRElWX01BVURJTwkJUzVQX0NMS1JFRygweDBDNTNDKQorI2RlZmluZSBTNVBfQ0xLRElWX0ZTWVMwCQlTNVBfQ0xLUkVHKDB4MEM1NDApCisjZGVmaW5lIFM1UF9DTEtESVZfRlNZUzEJCVM1UF9DTEtSRUcoMHgwQzU0NCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMgkJUzVQX0NMS1JFRygweDBDNTQ4KQorI2RlZmluZSBTNVBfQ0xLRElWX0ZTWVMzCQlTNVBfQ0xLUkVHKDB4MEM1NEMpCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUwwCQlTNVBfQ0xLUkVHKDB4MEM1NTApCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUwxCQlTNVBfQ0xLUkVHKDB4MEM1NTQpCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUwyCQlTNVBfQ0xLUkVHKDB4MEM1NTgpCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUwzCQlTNVBfQ0xLUkVHKDB4MEM1NUMpCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUw0CQlTNVBfQ0xLUkVHKDB4MEM1NjApCisjZGVmaW5lIFM1UF9DTEtESVZfUEVSSUw1CQlTNVBfQ0xLUkVHKDB4MEM1NjQpCisjZGVmaW5lIFM1UF9DTEtESVYyX1JBVElPCQlTNVBfQ0xLUkVHKDB4MEM1ODApCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX1RPUAkJUzVQX0NMS1JFRygweDBDNjEwKQorCisjZGVmaW5lIFM1UF9DTEtHQVRFX1NDTEtDQU0JCVM1UF9DTEtSRUcoMHgwQzgyMCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfQ0FNCQlTNVBfQ0xLUkVHKDB4MEM5MjApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX1RWCQlTNVBfQ0xLUkVHKDB4MEM5MjQpCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX01GQwkJUzVQX0NMS1JFRygweDBDOTI4KQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9HM0QJCVM1UF9DTEtSRUcoMHgwQzkyQykKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfSU1BR0UJCShzb2NfaXNfZXh5bm9zNDIxMCgpID8gXAorCQkJCQlTNVBfQ0xLUkVHKDB4MEM5MzApIDogXAorCQkJCQlTNVBfQ0xLUkVHKDB4MDQ5MzApKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9JTUFHRV80MjEwCVM1UF9DTEtSRUcoMHgwQzkzMCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfSU1BR0VfNDIxMglTNVBfQ0xLUkVHKDB4MDQ5MzApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0xDRDAJCVM1UF9DTEtSRUcoMHgwQzkzNCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfRlNZUwkJUzVQX0NMS1JFRygweDBDOTQwKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9HUFMJCVM1UF9DTEtSRUcoMHgwQzk0QykKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSUwJCVM1UF9DTEtSRUcoMHgwQzk1MCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSVIJCShzb2NfaXNfZXh5bm9zNDIxMCgpID8gXAorCQkJCQlTNVBfQ0xLUkVHKDB4MEM5NjApIDogXAorCQkJCQlTNVBfQ0xLUkVHKDB4MDg5NjApKQorI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9QRVJJUl80MjEwCVM1UF9DTEtSRUcoMHgwQzk2MCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSVJfNDIxMglTNVBfQ0xLUkVHKDB4MDg5NjApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0JMT0NLCQlTNVBfQ0xLUkVHKDB4MEM5NzApCisKKyNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0RNQwkJUzVQX0NMS1JFRygweDEwMzAwKQorI2RlZmluZSBTNVBfQ0xLU1JDX0RNQwkJCVM1UF9DTEtSRUcoMHgxMDIwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwCQkJUzVQX0NMS1JFRygweDEwNTAwKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzEJCQlTNVBfQ0xLUkVHKDB4MTA1MDQpCisjZGVmaW5lIFM1UF9DTEtESVZfU1RBVF9ETUMwCQlTNVBfQ0xLUkVHKDB4MTA2MDApCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0RNQwkJUzVQX0NMS1JFRygweDEwOTAwKQorCisjZGVmaW5lIFM1UF9BUExMX0xPQ0sJCQlTNVBfQ0xLUkVHKDB4MTQwMDApCisjZGVmaW5lIFM1UF9NUExMX0xPQ0sJCQkoc29jX2lzX2V4eW5vczQyMTAoKSA/IFwKKwkJCQkJUzVQX0NMS1JFRygweDE0MDA0KSA6ICBcCisJCQkJCVM1UF9DTEtSRUcoMHgxMDAwOCkpCisjZGVmaW5lIFM1UF9BUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MTQxMDApCisjZGVmaW5lIFM1UF9BUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MTQxMDQpCisjZGVmaW5lIFM1UF9NUExMX0NPTjAJCQkoc29jX2lzX2V4eW5vczQyMTAoKSA/IFwKKwkJCQkJUzVQX0NMS1JFRygweDE0MTA4KSA6IFwKKwkJCQkJUzVQX0NMS1JFRygweDEwMTA4KSkKKyNkZWZpbmUgUzVQX01QTExfQ09OMQkJCShzb2NfaXNfZXh5bm9zNDIxMCgpID8gXAorCQkJCQlTNVBfQ0xLUkVHKDB4MTQxMEMpIDogXAorCQkJCQlTNVBfQ0xLUkVHKDB4MTAxMEMpKQorCisjZGVmaW5lIFM1UF9DTEtTUkNfQ1BVCQkJUzVQX0NMS1JFRygweDE0MjAwKQorI2RlZmluZSBTNVBfQ0xLTVVYX1NUQVRDUFUJCVM1UF9DTEtSRUcoMHgxNDQwMCkKKworI2RlZmluZSBTNVBfQ0xLRElWX0NQVQkJCVM1UF9DTEtSRUcoMHgxNDUwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUxCQkJUzVQX0NMS1JFRygweDE0NTA0KQorI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRDUFUJCVM1UF9DTEtSRUcoMHgxNDYwMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUQ1BVMQkJUzVQX0NMS1JFRygweDE0NjA0KQorCisjZGVmaW5lIFM1UF9DTEtHQVRFX1NDTEtDUFUJCVM1UF9DTEtSRUcoMHgxNDgwMCkKKyNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ5MDApCisKKyNkZWZpbmUgUzVQX0FQTExfTE9DS1RJTUUJCSgweDFDMjApCS8qIDMwMHVzICovCisKKyNkZWZpbmUgUzVQX0FQTExDT04wX0VOQUJMRV9TSElGVAkoMzEpCisjZGVmaW5lIFM1UF9BUExMQ09OMF9MT0NLRURfU0hJRlQJKDI5KQorI2RlZmluZSBTNVBfQVBMTF9WQUxfMTAwMAkJKCgyNTAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxKQorI2RlZmluZSBTNVBfQVBMTF9WQUxfODAwCQkoKDIwMCA8PCAxNikgfCAoNiA8PCA4KSB8IDEpCisKKyNkZWZpbmUgUzVQX0VQTExDT04wX0VOQUJMRV9TSElGVAkoMzEpCisjZGVmaW5lIFM1UF9FUExMQ09OMF9MT0NLRURfU0hJRlQJKDI5KQorCisjZGVmaW5lIFM1UF9WUExMQ09OMF9FTkFCTEVfU0hJRlQJKDMxKQorI2RlZmluZSBTNVBfVlBMTENPTjBfTE9DS0VEX1NISUZUCSgyOSkKKworI2RlZmluZSBTNVBfQ0xLU1JDX0NQVV9NVVhDT1JFX1NISUZUCSgxNikKKyNkZWZpbmUgUzVQX0NMS01VWF9TVEFUQ1BVX01VWENPUkVfTUFTSwkoMHg3IDw8IFM1UF9DTEtTUkNfQ1BVX01VWENPUkVfU0hJRlQpCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVfU0hJRlQJKDApCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfQ09SRV9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMF9TSElGVAkoNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMF9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMV9TSElGVAkoOCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVNMV9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX1BFUklQSF9TSElGVAkoMTIpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9BVEJfU0hJRlQJKDE2KQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQVRCX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfQVRCX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19TSElGVAkoMjApCisjZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9QQ0xLREJHX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FQTExfU0hJRlQJKDI0KQorI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQVBMTF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0FQTExfU0hJRlQpCisKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0FDUF9TSElGVAkoMCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0FDUF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0FDUF9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0FDUFBDTEtfU0hJRlQJKDQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfQUNQUENMS19TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RQSFlfU0hJRlQJKDgpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9EUEhZX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRFBIWV9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ19TSElGVAkoMTIpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9ETUNfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNEX1NISUZUCSgxNikKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ0RfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9ETUNEX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DUF9TSElGVAkoMjApCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNQX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DUF9TSElGVCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0NPUFkyX1NISUZUCSgyNCkKKyNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0NPUFkyX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfQ09QWTJfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1JFVElfU0hJRlQJKDI4KQorI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQ09SRVRJX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfQ09SRVRJX1NISUZUKQorCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsyMDBfU0hJRlQJKDApCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsyMDBfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfVE9QX0FDTEsyMDBfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxMDBfU0hJRlQJKDQpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxMDBfTUFTSwkoMHhmIDw8IFM1UF9DTEtESVZfVE9QX0FDTEsxMDBfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxNjBfU0hJRlQJKDgpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxNjBfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfVE9QX0FDTEsxNjBfU0hJRlQpCisjZGVmaW5lIFM1UF9DTEtESVZfVE9QX0FDTEsxMzNfU0hJRlQJKDEyKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTMzX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTMzX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9PTkVOQU5EX1NISUZUCSgxNikKKyNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfT05FTkFORF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9UT1BfT05FTkFORF9TSElGVCkKKworI2RlZmluZSBTNVBfQ0xLRElWX0JVU19HRExSX1NISUZUCSgwKQorI2RlZmluZSBTNVBfQ0xLRElWX0JVU19HRExSX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0JVU19HRExSX1NISUZUKQorI2RlZmluZSBTNVBfQ0xLRElWX0JVU19HUExSX1NISUZUCSg0KQorI2RlZmluZSBTNVBfQ0xLRElWX0JVU19HUExSX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0JVU19HUExSX1NISUZUKQorCisvKiBPbmx5IGZvciBFWFlOT1M0MjEwICovCisKKyNkZWZpbmUgUzVQX0NMS1NSQ19MQ0QxCQkJUzVQX0NMS1JFRygweDBDMjM4KQorI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfTENEMQkJUzVQX0NMS1JFRygweDBDMzM4KQorI2RlZmluZSBTNVBfQ0xLRElWX0xDRDEJCQlTNVBfQ0xLUkVHKDB4MEM1MzgpCisjZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0xDRDEJCVM1UF9DTEtSRUcoMHgwQzkzOCkKKworLyogQ29tcGF0aWJpbGl0eSBkZWZpbmVzIGFuZCBpbmNsdXNpb24gKi8KKworI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKworI2RlZmluZSBTNVBfRVBMTF9DT04JCQlTNVBfRVBMTF9DT04wCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1pcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1pcnEuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtbWN0LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1tY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGRkMDJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtbWN0LmgKQEAgLTAsMCArMSw1MyBAQAorLyogYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLW1jdC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgTUNUIGNvbmZpZ3V0YXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfTUNUX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX01DVF9IIF9fRklMRV9fCisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIEVYWU5PUzRfTUNUUkVHKHgpCQkoUzVQX1ZBX1NZU1RJTUVSICsgKHgpKQorCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ05UX0wJCUVYWU5PUzRfTUNUUkVHKDB4MTAwKQorI2RlZmluZSBFWFlOT1M0X01DVF9HX0NOVF9VCQlFWFlOT1M0X01DVFJFRygweDEwNCkKKyNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DTlRfV1NUQVQJCUVYWU5PUzRfTUNUUkVHKDB4MTEwKQorCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ09NUDBfTAkJRVhZTk9TNF9NQ1RSRUcoMHgyMDApCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ09NUDBfVQkJRVhZTk9TNF9NQ1RSRUcoMHgyMDQpCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ09NUDBfQUREX0lOQ1IJRVhZTk9TNF9NQ1RSRUcoMHgyMDgpCisKKyNkZWZpbmUgRVhZTk9TNF9NQ1RfR19UQ09OCQlFWFlOT1M0X01DVFJFRygweDI0MCkKKworI2RlZmluZSBFWFlOT1M0X01DVF9HX0lOVF9DU1RBVAkJRVhZTk9TNF9NQ1RSRUcoMHgyNDQpCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfSU5UX0VOQgkJRVhZTk9TNF9NQ1RSRUcoMHgyNDgpCisjZGVmaW5lIEVYWU5PUzRfTUNUX0dfV1NUQVQJCUVYWU5PUzRfTUNUUkVHKDB4MjRDKQorCisjZGVmaW5lIF9FWFlOT1M0X01DVF9MX0JBU0UJCUVYWU5PUzRfTUNUUkVHKDB4MzAwKQorI2RlZmluZSBFWFlOT1M0X01DVF9MX0JBU0UoeCkJCShfRVhZTk9TNF9NQ1RfTF9CQVNFICsgKDB4MTAwICogeCkpCisjZGVmaW5lIEVYWU5PUzRfTUNUX0xfTUFTSwkJKDB4ZmZmZmZmMDApCisKKyNkZWZpbmUgTUNUX0xfVENOVEJfT0ZGU0VUCQkoMHgwMCkKKyNkZWZpbmUgTUNUX0xfSUNOVEJfT0ZGU0VUCQkoMHgwOCkKKyNkZWZpbmUgTUNUX0xfVENPTl9PRkZTRVQJCSgweDIwKQorI2RlZmluZSBNQ1RfTF9JTlRfQ1NUQVRfT0ZGU0VUCQkoMHgzMCkKKyNkZWZpbmUgTUNUX0xfSU5UX0VOQl9PRkZTRVQJCSgweDM0KQorI2RlZmluZSBNQ1RfTF9XU1RBVF9PRkZTRVQJCSgweDQwKQorCisjZGVmaW5lIE1DVF9HX1RDT05fU1RBUlQJCSgxIDw8IDgpCisjZGVmaW5lIE1DVF9HX1RDT05fQ09NUDBfQVVUT19JTkMJKDEgPDwgMSkKKyNkZWZpbmUgTUNUX0dfVENPTl9DT01QMF9FTkFCTEUJCSgxIDw8IDApCisKKyNkZWZpbmUgTUNUX0xfVENPTl9JTlRFUlZBTF9NT0RFCSgxIDw8IDIpCisjZGVmaW5lIE1DVF9MX1RDT05fSU5UX1NUQVJUCQkoMSA8PCAxKQorI2RlZmluZSBNQ1RfTF9UQ09OX1RJTUVSX1NUQVJUCQkoMSA8PCAwKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX01DVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtbWVtLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1tZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLW1lbS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1tZW0uaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy1wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmZmOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1wbXUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBQb3dlciBtYW5hZ2VtZW50IHVuaXQgZGVmaW5pdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19QTVVfSAorI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfUE1VX0ggX19GSUxFX18KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNkZWZpbmUgUzVQX1BNVVJFRyh4KQkJCQkoUzVQX1ZBX1BNVSArICh4KSkKKworI2RlZmluZSBTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDAyMDApCisKKyNkZWZpbmUgUzVQX0NFTlRSQUxfTE9XUFdSX0NGRwkJCSgxIDw8IDE2KQorCisjZGVmaW5lIFM1UF9DRU5UUkFMX1NFUV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MDIwOCkKKworI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZJMAkJCSgxIDw8IDE2KQorI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZJMQkJCSgxIDw8IDE3KQorI2RlZmluZSBTNVBfVVNFX1NUQU5EQllXRklfSVNQX0FSTQkJKDEgPDwgMTgpCisjZGVmaW5lIFM1UF9VU0VfU1RBTkRCWV9XRkUwCQkJKDEgPDwgMjQpCisjZGVmaW5lIFM1UF9VU0VfU1RBTkRCWV9XRkUxCQkJKDEgPDwgMjUpCisjZGVmaW5lIFM1UF9VU0VfU1RBTkRCWVdGRV9JU1BfQVJNCQkoMSA8PCAyNikKKworI2RlZmluZSBTNVBfU1dSRVNFVAkJCQlTNVBfUE1VUkVHKDB4MDQwMCkKKworI2RlZmluZSBTNVBfV0FLRVVQX1NUQVQJCQkJUzVQX1BNVVJFRygweDA2MDApCisjZGVmaW5lIFM1UF9FSU5UX1dBS0VVUF9NQVNLCQkJUzVQX1BNVVJFRygweDA2MDQpCisjZGVmaW5lIFM1UF9XQUtFVVBfTUFTSwkJCQlTNVBfUE1VUkVHKDB4MDYwOCkKKworI2RlZmluZSBTNVBfSERNSV9QSFlfQ09OVFJPTAkJCVM1UF9QTVVSRUcoMHgwNzAwKQorI2RlZmluZSBTNVBfSERNSV9QSFlfRU5BQkxFCQkJKDEgPDwgMCkKKworI2RlZmluZSBTNVBfREFDX1BIWV9DT05UUk9MCQkJUzVQX1BNVVJFRygweDA3MEMpCisjZGVmaW5lIFM1UF9EQUNfUEhZX0VOQUJMRQkJCSgxIDw8IDApCisKKyNkZWZpbmUgUzVQX01JUElfRFBIWV9DT05UUk9MKG4pCQlTNVBfUE1VUkVHKDB4MDcxMCArIChuKSAqIDQpCisjZGVmaW5lIFM1UF9NSVBJX0RQSFlfRU5BQkxFCQkJKDEgPDwgMCkKKyNkZWZpbmUgUzVQX01JUElfRFBIWV9TUkVTRVROCQkJKDEgPDwgMSkKKyNkZWZpbmUgUzVQX01JUElfRFBIWV9NUkVTRVROCQkJKDEgPDwgMikKKworI2RlZmluZSBTNVBfSU5GT1JNMAkJCQlTNVBfUE1VUkVHKDB4MDgwMCkKKyNkZWZpbmUgUzVQX0lORk9STTEJCQkJUzVQX1BNVVJFRygweDA4MDQpCisjZGVmaW5lIFM1UF9JTkZPUk0yCQkJCVM1UF9QTVVSRUcoMHgwODA4KQorI2RlZmluZSBTNVBfSU5GT1JNMwkJCQlTNVBfUE1VUkVHKDB4MDgwQykKKyNkZWZpbmUgUzVQX0lORk9STTQJCQkJUzVQX1BNVVJFRygweDA4MTApCisjZGVmaW5lIFM1UF9JTkZPUk01CQkJCVM1UF9QTVVSRUcoMHgwODE0KQorI2RlZmluZSBTNVBfSU5GT1JNNgkJCQlTNVBfUE1VUkVHKDB4MDgxOCkKKyNkZWZpbmUgUzVQX0lORk9STTcJCQkJUzVQX1BNVVJFRygweDA4MUMpCisKKyNkZWZpbmUgUzVQX0FSTV9DT1JFMF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTAwMCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfQ09SRTAJCQlTNVBfUE1VUkVHKDB4MTAwNCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfQ0VOVFJBTDAJCQlTNVBfUE1VUkVHKDB4MTAwOCkKKyNkZWZpbmUgUzVQX0FSTV9DT1JFMV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTAxMCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfQ09SRTEJCQlTNVBfUE1VUkVHKDB4MTAxNCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfQ0VOVFJBTDEJCQlTNVBfUE1VUkVHKDB4MTAxOCkKKyNkZWZpbmUgUzVQX0FSTV9DT01NT05fTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwODApCisjZGVmaW5lIFM1UF9MMl8wX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTBDMCkKKyNkZWZpbmUgUzVQX0wyXzFfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMEM0KQorI2RlZmluZSBTNVBfQ01VX0FDTEtTVE9QX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTAwKQorI2RlZmluZSBTNVBfQ01VX1NDTEtTVE9QX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTA0KQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTBDKQorI2RlZmluZSBTNVBfQVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMjApCisjZGVmaW5lIFM1UF9NUExMX1NZU0NMS19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEyNCkKKyNkZWZpbmUgUzVQX1ZQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTI4KQorI2RlZmluZSBTNVBfRVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMkMpCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HUFNfQUxJVkVfTE9XUFdSCVM1UF9QTVVSRUcoMHgxMTM4KQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX0dQU0FMSVZFX0xPV1BXUgkJUzVQX1BNVVJFRygweDExM0MpCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9DQU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0MCkKKyNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX1RWX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDQpCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9NRkNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0OCkKKyNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0czRF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTRDKQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTENEMF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTUwKQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTUFVRElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNTgpCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HUFNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE1QykKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9DQU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2MCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9UVl9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTE2NCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9NRkNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2OCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9HM0RfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2QykKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9MQ0QwX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNzApCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfTUFVRElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNzgpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfR1BTX0xPV1BXUgkJUzVQX1BNVVJFRygweDExN0MpCisjZGVmaW5lIFM1UF9UT1BfQlVTX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTgwKQorI2RlZmluZSBTNVBfVE9QX1JFVEVOVElPTl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTg0KQorI2RlZmluZSBTNVBfVE9QX1BXUl9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTE4OCkKKyNkZWZpbmUgUzVQX0xPR0lDX1JFU0VUX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUEwKQorI2RlZmluZSBTNVBfT05FTkFORF9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQzApCisjZGVmaW5lIFM1UF9HMkRfQUNQX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFDOCkKKyNkZWZpbmUgUzVQX1VTQk9UR19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQ0MpCisjZGVmaW5lIFM1UF9IU01NQ19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDApCisjZGVmaW5lIFM1UF9DU1NZU19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDQpCisjZGVmaW5lIFM1UF9TRUNTU19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDgpCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0RSQU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIwMCkKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fTUFVRElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMDQpCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0dQSU9fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIyMCkKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fVUFSVF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjI0KQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9NTUNBX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMjgpCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX01NQ0JfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIyQykKKyNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fRUJJQV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjMwKQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9FQklCX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMzQpCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0lTT0xBVElPTl9MT1dQV1IJUzVQX1BNVVJFRygweDEyNDApCisjZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0FMVl9TRUxfTE9XUFdSCVM1UF9QTVVSRUcoMHgxMjYwKQorI2RlZmluZSBTNVBfWFVTQlhUSV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTI4MCkKKyNkZWZpbmUgUzVQX1hYVElfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMjg0KQorI2RlZmluZSBTNVBfRVhUX1JFR1VMQVRPUl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMkMwKQorI2RlZmluZSBTNVBfR1BJT19NT0RFX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMzAwKQorI2RlZmluZSBTNVBfR1BJT19NT0RFX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMzQwKQorI2RlZmluZSBTNVBfQ0FNX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM4MCkKKyNkZWZpbmUgUzVQX1RWX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM4NCkKKyNkZWZpbmUgUzVQX01GQ19MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzODgpCisjZGVmaW5lIFM1UF9HM0RfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzhDKQorI2RlZmluZSBTNVBfTENEMF9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzOTApCisjZGVmaW5lIFM1UF9NQVVESU9fTE9XUFdSCQkJUzVQX1BNVVJFRygweDEzOTgpCisjZGVmaW5lIFM1UF9HUFNfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzlDKQorI2RlZmluZSBTNVBfR1BTX0FMSVZFX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxM0EwKQorCisjZGVmaW5lIFM1UF9BUk1fQ09SRTBfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDIwMDApCisjZGVmaW5lIFM1UF9BUk1fQ09SRTBfT1BUSU9OCQkJUzVQX1BNVVJFRygweDIwMDgpCisjZGVmaW5lIFM1UF9BUk1fQ09SRTFfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDIwODApCisjZGVmaW5lIFM1UF9BUk1fQ09SRTFfU1RBVFVTCQkJUzVQX1BNVVJFRygweDIwODQpCisjZGVmaW5lIFM1UF9BUk1fQ09SRTFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDIwODgpCisKKyNkZWZpbmUgUzVQX0FSTV9DT01NT05fT1BUSU9OCQkJUzVQX1BNVVJFRygweDI0MDgpCisjZGVmaW5lIFM1UF9UT1BfUFdSX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyQzQ4KQorI2RlZmluZSBTNVBfQ0FNX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0MwOCkKKyNkZWZpbmUgUzVQX1RWX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0MyOCkKKyNkZWZpbmUgUzVQX01GQ19PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDNDgpCisjZGVmaW5lIFM1UF9HM0RfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzY4KQorI2RlZmluZSBTNVBfTENEMF9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDODgpCisjZGVmaW5lIFM1UF9MQ0QxX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0NBOCkKKyNkZWZpbmUgUzVQX01BVURJT19PUFRJT04JCQlTNVBfUE1VUkVHKDB4M0NDOCkKKyNkZWZpbmUgUzVQX0dQU19PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDRTgpCisjZGVmaW5lIFM1UF9HUFNfQUxJVkVfT1BUSU9OCQkJUzVQX1BNVVJFRygweDNEMDgpCisKKyNkZWZpbmUgUzVQX1BBRF9SRVRfTUFVRElPX09QVElPTgkJUzVQX1BNVVJFRygweDMwMjgpCisjZGVmaW5lIFM1UF9QQURfUkVUX0dQSU9fT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxMDgpCisjZGVmaW5lIFM1UF9QQURfUkVUX1VBUlRfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxMjgpCisjZGVmaW5lIFM1UF9QQURfUkVUX01NQ0FfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxNDgpCisjZGVmaW5lIFM1UF9QQURfUkVUX01NQ0JfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxNjgpCisjZGVmaW5lIFM1UF9QQURfUkVUX0VCSUFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxODgpCisjZGVmaW5lIFM1UF9QQURfUkVUX0VCSUJfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxQTgpCisKKyNkZWZpbmUgUzVQX1BNVV9DQU1fQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzAwKQorI2RlZmluZSBTNVBfUE1VX1RWX0NPTkYJCQkJUzVQX1BNVVJFRygweDNDMjApCisjZGVmaW5lIFM1UF9QTVVfTUZDX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M0MCkKKyNkZWZpbmUgUzVQX1BNVV9HM0RfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzYwKQorI2RlZmluZSBTNVBfUE1VX0xDRDBfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzgwKQorI2RlZmluZSBTNVBfUE1VX0dQU19DT05GCQkJUzVQX1BNVVJFRygweDNDRTApCisKKyNkZWZpbmUgUzVQX1BNVV9TQVRBX1BIWV9DT05UUk9MX0VOCQkweDEKKyNkZWZpbmUgUzVQX0NPUkVfTE9DQUxfUFdSX0VOCQkJMHgzCisjZGVmaW5lIFM1UF9JTlRfTE9DQUxfUFdSX0VOCQkJMHg3CisKKyNkZWZpbmUgUzVQX0NIRUNLX1NMRUVQCQkJCTB4MDAwMDBCQUQKKworLyogT25seSBmb3IgRVhZTk9TNDIxMCAqLworI2RlZmluZSBTNVBfVVNCSE9TVF9QSFlfQ09OVFJPTAkJUzVQX1BNVVJFRygweDA3MDgpCisjZGVmaW5lIFM1UF9VU0JIT1NUX1BIWV9FTkFCTEUJCSgxIDw8IDApCisKKyNkZWZpbmUgUzVQX1BNVV9TQVRBX1BIWV9DT05UUk9MCVM1UF9QTVVSRUcoMHgwNzIwKQorCisjZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9MQ0QxX0xPV1BXUglTNVBfUE1VUkVHKDB4MTE1NCkKKyNkZWZpbmUgUzVQX0NNVV9SRVNFVF9MQ0QxX0xPV1BXUglTNVBfUE1VUkVHKDB4MTE3NCkKKyNkZWZpbmUgUzVQX01PRElNSUZfTUVNX0xPV1BXUgkJUzVQX1BNVVJFRygweDExQzQpCisjZGVmaW5lIFM1UF9QQ0lFX01FTV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMUUwKQorI2RlZmluZSBTNVBfU0FUQV9NRU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTFFNCkKKyNkZWZpbmUgUzVQX0xDRDFfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEzOTQpCisKKyNkZWZpbmUgUzVQX1BNVV9MQ0QxX0NPTkYJCVM1UF9QTVVSRUcoMHgzQ0EwKQorCisvKiBPbmx5IGZvciBFWFlOT1M0MjEyICovCisjZGVmaW5lIFM1UF9JU1BfQVJNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMDUwKQorI2RlZmluZSBTNVBfRElTX0lSUV9JU1BfQVJNX0xPQ0FMX0xPV1BXUglTNVBfUE1VUkVHKDB4MTA1NCkKKyNkZWZpbmUgUzVQX0RJU19JUlFfSVNQX0FSTV9DRU5UUkFMX0xPV1BXUglTNVBfUE1VUkVHKDB4MTA1OCkKKyNkZWZpbmUgUzVQX0NNVV9BQ0xLU1RPUF9DT1JFQkxLX0xPV1BXUgkJUzVQX1BNVVJFRygweDExMTApCisjZGVmaW5lIFM1UF9DTVVfU0NMS1NUT1BfQ09SRUJMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTE0KQorI2RlZmluZSBTNVBfQ01VX1JFU0VUX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTExQykKKyNkZWZpbmUgUzVQX01QTExVU0VSX1NZU0NMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTMwKQorI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfSVNQX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNTQpCisjZGVmaW5lIFM1UF9DTVVfUkVTRVRfSVNQX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNzQpCisjZGVmaW5lIFM1UF9UT1BfQlVTX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE5MCkKKyNkZWZpbmUgUzVQX1RPUF9SRVRFTlRJT05fQ09SRUJMS19MT1dQV1IJUzVQX1BNVVJFRygweDExOTQpCisjZGVmaW5lIFM1UF9UT1BfUFdSX0NPUkVCTEtfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE5OCkKKyNkZWZpbmUgUzVQX09TQ0NMS19HQVRFX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUE0KQorI2RlZmluZSBTNVBfTE9HSUNfUkVTRVRfQ09SRUJMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMUIwKQorI2RlZmluZSBTNVBfT1NDQ0xLX0dBVEVfQ09SRUJMS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMUI0KQorI2RlZmluZSBTNVBfSFNJX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFDNCkKKyNkZWZpbmUgUzVQX1JPVEFUT1JfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMURDKQorI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0NPUkVCTEtfTE9XUFdSCVM1UF9QTVVSRUcoMHgxMjNDKQorI2RlZmluZSBTNVBfUEFEX0lTT0xBVElPTl9DT1JFQkxLX0xPV1BXUglTNVBfUE1VUkVHKDB4MTI1MCkKKyNkZWZpbmUgUzVQX0dQSU9fTU9ERV9DT1JFQkxLX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzMjApCisjZGVmaW5lIFM1UF9UT1BfQVNCX1JFU0VUX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzNDQpCisjZGVmaW5lIFM1UF9UT1BfQVNCX0lTT0xBVElPTl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMzQ4KQorI2RlZmluZSBTNVBfSVNQX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM5NCkKKyNkZWZpbmUgUzVQX0RSQU1fRlJFUV9ET1dOX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzQjApCisjZGVmaW5lIFM1UF9ERFJQSFlfRExMT0ZGX0xPV1BXUgkJUzVQX1BNVVJFRygweDEzQjQpCisjZGVmaW5lIFM1UF9DTVVfU1lTQ0xLX0lTUF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxM0I4KQorI2RlZmluZSBTNVBfQ01VX1NZU0NMS19HUFNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTNCQykKKyNkZWZpbmUgUzVQX0xQRERSX1BIWV9ETExfTE9DS19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxM0MwKQorCisjZGVmaW5lIFM1UF9BUk1fTDJfMF9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MjYwOCkKKyNkZWZpbmUgUzVQX0FSTV9MMl8xX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyNjI4KQorI2RlZmluZSBTNVBfT05FTkFORF9NRU1fT1BUSU9OCQkJUzVQX1BNVVJFRygweDJFMDgpCisjZGVmaW5lIFM1UF9IU0lfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRTI4KQorI2RlZmluZSBTNVBfRzJEX0FDUF9NRU1fT1BUSU9OCQkJUzVQX1BNVVJFRygweDJFNDgpCisjZGVmaW5lIFM1UF9VU0JPVEdfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRTY4KQorI2RlZmluZSBTNVBfSFNNTUNfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRTg4KQorI2RlZmluZSBTNVBfQ1NTWVNfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRUE4KQorI2RlZmluZSBTNVBfU0VDU1NfTUVNX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyRUM4KQorI2RlZmluZSBTNVBfUk9UQVRPUl9NRU1fT1BUSU9OCQkJUzVQX1BNVVJFRygweDJGNDgpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfUE1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1zeXNtbXUuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLXN5c21tdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3Mtc3lzbW11LmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9yZWdzLXN5c21tdS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtdXNiLXBoeS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvcmVncy11c2ItcGh5LmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvc3lzbW11LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvc3lzbW11LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvc3lzbW11LmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9zeXNtbXUuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvdGltZXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC90aW1leC5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvdGltZXguaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2luaXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2luaXQuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaW5pdC5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaXJxLWNvbWJpbmVyLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pcnEtY29tYmluZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L2lycS1jb21iaW5lci5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9pcnEtY29tYmluZXIuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2lycS1laW50LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9pcnEtZWludC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvaXJxLWVpbnQuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3MvaXJxLWVpbnQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1hcm1sZXg0MjEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLWFybWxleDQyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNhNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1hcm1sZXg0MjEwLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLWFybWxleDQyMTAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNyb20uaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKKwkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQorCisjZGVmaW5lIEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4CisKKyNkZWZpbmUgQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzQgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHNCkKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgYXJtbGV4NDIxMF91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7CisJWzBdID0geworCQkuaHdwb3J0CQk9IDAsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVCwKKwl9LAorCVsxXSA9IHsKKwkJLmh3cG9ydAkJPSAxLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbMl0gPSB7CisJCS5od3BvcnQJCT0gMiwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzNdID0geworCQkuaHdwb3J0CQk9IDMsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgYXJtbGV4NDIxMF9oc21tYzBfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKKyNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDBfOEJJVAorCS5tYXhfd2lkdGgJCT0gOCwKKwkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgYXJtbGV4NDIxMF9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKKwkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUFgyKDUpLAorCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKKwkubWF4X3dpZHRoCQk9IDQsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBhcm1sZXg0MjEwX2hzbW1jM19wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9QRVJNQU5FTlQsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorCS5tYXhfd2lkdGgJCT0gNCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX3NkaGNpX2luaXQodm9pZCkKK3sKKwlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmYXJtbGV4NDIxMF9oc21tYzBfcGRhdGEpOworCXMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKCZhcm1sZXg0MjEwX2hzbW1jMl9wZGF0YSk7CisJczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJmFybWxleDQyMTBfaHNtbWMzX3BkYXRhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfd2xhbl9pbml0KHZvaWQpCit7CisJLyogZW5hYmxlICovCisJczNjX2dwaW9fY2ZncGluKEVYWU5PUzRfR1BYMigwKSwgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoRVhZTk9TNF9HUFgyKDApLCBTM0NfR1BJT19QVUxMX1VQKTsKKworCS8qIHJlc2V0ICovCisJczNjX2dwaW9fY2ZncGluKEVYWU5PUzRfR1BYMSg2KSwgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoRVhZTk9TNF9HUFgxKDYpLCBTM0NfR1BJT19QVUxMX1VQKTsKKworCS8qIHdha2V1cCAqLworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDEoNSksIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMSg1KSwgUzNDX0dQSU9fUFVMTF9VUCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXJtbGV4NDIxMF9zbXNjOTExeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDMpLAorCQkuZW5kCT0gRVhZTk9TNF9QQV9TUk9NX0JBTksoMykgKyBTWl82NEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX0VJTlQoMjcpLAorCQkuZW5kCT0gSVJRX0VJTlQoMjcpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElSUUZfVFJJR0dFUl9ISUdILAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyBzbXNjOTIxNV9jb25maWcgPSB7CisJLmlycV9wb2xhcml0eQk9IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfSElHSCwKKwkuaXJxX3R5cGUJPSBTTVNDOTExWF9JUlFfVFlQRV9QVVNIX1BVTEwsCisJLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8xNkJJVCB8IFNNU0M5MTFYX0ZPUkNFX0lOVEVSTkFMX1BIWSwKKwkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCisJLm1hYwkJPSB7MHgwMCwgMHg4MCwgMHgwMCwgMHgyMywgMHg0NSwgMHg2N30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhcm1sZXg0MjEwX3Ntc2M5MTF4ID0geworCS5uYW1lCQk9ICJzbXNjOTExeCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhcm1sZXg0MjEwX3Ntc2M5MTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gYXJtbGV4NDIxMF9zbXNjOTExeF9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNtc2M5MjE1X2NvbmZpZywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFybWxleDQyMTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfaHNtbWMwLAorCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzMsCisJJnMzY19kZXZpY2VfcnRjLAorCSZzM2NfZGV2aWNlX3dkdCwKKwkmZXh5bm9zNF9kZXZpY2Vfc3lzbW11LAorCSZzYW1zdW5nX2Fzb2NfZG1hLAorCSZhcm1sZXg0MjEwX3Ntc2M5MTF4LAorCSZleHlub3M0X2RldmljZV9haGNpLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfc21zYzkxMXhfaW5pdCh2b2lkKQoreworCXUzMiBjczE7CisKKwkvKiBjb25maWd1cmUgbkNTMSB3aWR0aCB0byAxNiBiaXRzICovCisJY3MxID0gX19yYXdfcmVhZGwoUzVQX1NST01fQlcpICYKKwkJfihTNVBfU1JPTV9CV19fQ1NfTUFTSyA8PCBTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQpOworCWNzMSB8PSAoKDEgPDwgUzVQX1NST01fQldfX0RBVEFXSURUSF9fU0hJRlQpIHwKKwkJKDAgPDwgUzVQX1NST01fQldfX1dBSVRFTkFCTEVfX1NISUZUKSB8CisJCSgxIDw8IFM1UF9TUk9NX0JXX19BRERSTU9ERV9fU0hJRlQpIHwKKwkJKDEgPDwgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUKSkgPDwKKwkJUzVQX1NST01fQldfX05DUzFfX1NISUZUOworCV9fcmF3X3dyaXRlbChjczEsIFM1UF9TUk9NX0JXKTsKKworCS8qIHNldCB0aW1pbmcgZm9yIG5DUzEgc3VpdGFibGUgZm9yIGV0aGVybmV0IGNoaXAgKi8KKwlfX3Jhd193cml0ZWwoKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQpIHwKKwkJICAgICAoMHg5IDw8IFM1UF9TUk9NX0JDWF9fVEFDUF9fU0hJRlQpIHwKKwkJICAgICAoMHhjIDw8IFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQpIHwKKwkJICAgICAoMHg2IDw8IFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQpIHwKKwkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQpLCBTNVBfU1JPTV9CQzEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF9tYXBfaW8odm9pZCkKK3sKKwlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMoYXJtbGV4NDIxMF91YXJ0Y2ZncywKKwkJCSAgIEFSUkFZX1NJWkUoYXJtbGV4NDIxMF91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF9tYWNoaW5lX2luaXQodm9pZCkKK3sKKwlhcm1sZXg0MjEwX3Ntc2M5MTF4X2luaXQoKTsKKworCWFybWxleDQyMTBfc2RoY2lfaW5pdCgpOworCisJYXJtbGV4NDIxMF93bGFuX2luaXQoKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGFybWxleDQyMTBfZGV2aWNlcywKKwkJCSAgICAgQVJSQVlfU0laRShhcm1sZXg0MjEwX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChBUk1MRVg0MjEwLCAiQVJNTEVYNDIxMCIpCisJLyogTWFpbnRhaW5lcjogQWxpbSBBa2h0YXIgPGFsaW0uYWtodGFyQHNhbXN1bmcuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBhcm1sZXg0MjEwX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gYXJtbGV4NDIxMF9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtbnVyaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1udXJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtbnVyaS5jCkBAIC0wLDAgKzEsMTMzOSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLW51cmkuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXRtZWxfbXh0X3RzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTcuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKworI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgorI2luY2x1ZGUgPG1lZGlhL201bW9scy5oPgorI2luY2x1ZGUgPG1lZGlhL3M1cF9maW1jLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2FkYy5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi12NC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9laGNpLmg+CisjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgorI2luY2x1ZGUgPHBsYXQvbWZjLmg+CisjaW5jbHVkZSA8cGxhdC9wZC5oPgorI2luY2x1ZGUgPHBsYXQvZmltYy1jb3JlLmg+CisjaW5jbHVkZSA8cGxhdC9jYW1wb3J0Lmg+CisjaW5jbHVkZSA8cGxhdC9taXBpX2NzaXMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKy8qIEZvbGxvd2luZyBhcmUgZGVmYXVsdCB2YWx1ZXMgZm9yIFVDT04sIFVMQ09OIGFuZCBVRkNPTiBVQVJUIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVVJJX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAorCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCisKKyNkZWZpbmUgTlVSSV9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKKworI2RlZmluZSBOVVJJX1VGQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUZDT05fRklGT01PREUgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fVFhUUklHMjU2IHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzI1NikKKworZW51bSBmaXhlZF9yZWd1bGF0b3JfaWQgeworCUZJWEVEX1JFR19JRF9NTUMgPSAwLAorCUZJWEVEX1JFR19JRF9NQVg4OTAzLAorCUZJWEVEX1JFR19JRF9DQU1fQTI4ViwKKwlGSVhFRF9SRUdfSURfQ0FNXzEyViwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIG51cmlfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLmh3cG9ydAkJPSAwLAorCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKKwl9LAorCXsKKwkJLmh3cG9ydAkJPSAxLAorCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKKwl9LAorCXsKKwkJLmh3cG9ydAkJPSAyLAorCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKKwl9LAorCXsKKwkJLmh3cG9ydAkJPSAzLAorCQkudWNvbgkJPSBOVVJJX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE5VUklfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE5VUklfVUZDT05fREVGQVVMVCwKKwl9LAorfTsKKworLyogZU1NQyAqLworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgbnVyaV9oc21tYzBfZGF0YSBfX2luaXRkYXRhID0geworCS5tYXhfd2lkdGgJCT0gOCwKKwkuaG9zdF9jYXBzCQk9IChNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKKwkJCQlNTUNfQ0FQX0RJU0FCTEUgfCBNTUNfQ0FQX0VSQVNFKSwKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBlbW1jX3N1cHBsaWVzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzM2Mtc2RoY2kuMCIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAiZHdfbW1jIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZW1tY19maXhlZF92b2x0YWdlX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJCT0geworCQkubmFtZQkJPSAiVk1FTV9WRERfMi44ViIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUoZW1tY19zdXBwbGllcyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gZW1tY19zdXBwbGllcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgZW1tY19maXhlZF92b2x0YWdlX2NvbmZpZyA9IHsKKwkuc3VwcGx5X25hbWUJCT0gIk1BU1NNRU1PUllfRU4gKGludmVydGVkKSIsCisJLm1pY3Jvdm9sdHMJCT0gMjgwMDAwMCwKKwkuZ3BpbwkJCT0gRVhZTk9TNF9HUEwxKDEpLAorCS5lbmFibGVfaGlnaAkJPSBmYWxzZSwKKwkuaW5pdF9kYXRhCQk9ICZlbW1jX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZW1tY19maXhlZF92b2x0YWdlID0geworCS5uYW1lCQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAkJCT0gRklYRURfUkVHX0lEX01NQywKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmVtbWNfZml4ZWRfdm9sdGFnZV9jb25maWcsCisJfSwKK307CisKKy8qIFNEICovCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBudXJpX2hzbW1jMl9kYXRhIF9faW5pdGRhdGEgPSB7CisJLm1heF93aWR0aAkJPSA0LAorCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8CisJCQkJTU1DX0NBUF9ESVNBQkxFLAorCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQWDMoMyksCS8qIFhFSU5UXzI3ICovCisJLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworLyogV0xBTiAqLworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgbnVyaV9oc21tYzNfZGF0YSBfX2luaXRkYXRhID0geworCS5tYXhfd2lkdGgJCT0gNCwKKwkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0VYVEVSTkFMLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX3NkaGNpX2luaXQodm9pZCkKK3sKKwlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmbnVyaV9oc21tYzBfZGF0YSk7CisJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJm51cmlfaHNtbWMyX2RhdGEpOworCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZudXJpX2hzbW1jM19kYXRhKTsKK30KKworLyogR1BJTyBLRVlTICovCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbnVyaV9ncGlvX2tleXNfdGFibGVzW10gPSB7CisJeworCQkuY29kZQkJCT0gS0VZX1ZPTFVNRVVQLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDApLAkvKiBYRUlOVDE2ICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FVVAiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9WT0xVTUVET1dOLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDEpLAkvKiBYRUlOVDE3ICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FRE9XTiIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX1BPV0VSLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDcpLAkvKiBYRUlOVDIzICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfUE9XRVIiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkud2FrZXVwCQkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIG51cmlfZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMJCT0gbnVyaV9ncGlvX2tleXNfdGFibGVzLAorCS5uYnV0dG9ucwkJPSBBUlJBWV9TSVpFKG51cmlfZ3Bpb19rZXlzX3RhYmxlcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBudXJpX2dwaW9fa2V5cyA9IHsKKwkubmFtZQkJCT0gImdwaW8ta2V5cyIsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX2dwaW9fa2V5c19kYXRhLAorCX0sCit9OworCisvKiBGcmFtZSBCdWZmZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BkX3dpbiBudXJpX2ZiX3dpbjAgPSB7CisJLndpbl9tb2RlID0geworCQkubGVmdF9tYXJnaW4JPSA2NCwKKwkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkudXBwZXJfbWFyZ2luCT0gNjQsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gNDgsCisJCS52c3luY19sZW4JPSAzLAorCQkueHJlcwkJPSAxMjgwLAorCQkueXJlcwkJPSA4MDAsCisJCS5yZWZyZXNoCT0gNjAsCisJfSwKKwkubWF4X2JwcAk9IDI0LAorCS5kZWZhdWx0X2JwcAk9IDE2LAorCS52aXJ0dWFsX3gJPSAxMjgwLAorCS52aXJ0dWFsX3kJPSA4MDAsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9wbGF0ZGF0YSBudXJpX2ZiX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLndpblswXQkJPSAmbnVyaV9mYl93aW4wLAorCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiB8CisJCQkgIFZJRENPTjBfQ0xLU0VMX0xDRCwKKwkudmlkY29uMQk9IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCisJLnNldHVwX2dwaW8JPSBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAsCit9OworCitzdGF0aWMgdm9pZCBudXJpX2xjZF9wb3dlcl9vbihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBwb3dlcikKK3sKKwlpbnQgZ3BpbyA9IEVYWU5PUzRfR1BFMSg1KTsKKworCWdwaW9fcmVxdWVzdChncGlvLCAiTFZEU19uU0hETiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCBwb3dlcik7CisJZ3Bpb19mcmVlKGdwaW8pOworfQorCitzdGF0aWMgaW50IG51cmlfYmxfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCwgZ3BpbyA9IEVYWU5PUzRfR1BFMigzKTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChncGlvLCAiTENEX0xET19FTiIpOworCWlmICghcmV0KQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG51cmlfYmxfbm90aWZ5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGJyaWdodG5lc3MpCit7CisJaWYgKGJyaWdodG5lc3MgPCAxKQorCQlicmlnaHRuZXNzID0gMDsKKworCWdwaW9fc2V0X3ZhbHVlKEVYWU5PUzRfR1BFMigzKSwgMSk7CisKKwlyZXR1cm4gYnJpZ2h0bmVzczsKK30KKworc3RhdGljIHZvaWQgbnVyaV9ibF9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlncGlvX2ZyZWUoRVhZTk9TNF9HUEUyKDMpKTsKK30KKworLyogbnVyaSBwd20gYmFja2xpZ2h0ICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBudXJpX2JhY2tsaWdodF9kYXRhID0geworCS5wd21faWQJCQk9IDAsCisJLnB3bV9wZXJpb2RfbnMJCT0gMzAwMDAsCisJLm1heF9icmlnaHRuZXNzCQk9IDEwMCwKKwkuZGZ0X2JyaWdodG5lc3MJCT0gNTAsCisJLmluaXQJCQk9IG51cmlfYmxfaW5pdCwKKwkubm90aWZ5CQkJPSBudXJpX2JsX25vdGlmeSwKKwkuZXhpdAkJCT0gbnVyaV9ibF9leGl0LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9iYWNrbGlnaHRfZGV2aWNlID0geworCS5uYW1lCQkJPSAicHdtLWJhY2tsaWdodCIsCisJLmlkCQkJPSAtMSwKKwkuZGV2CQkJPSB7CisJCS5wYXJlbnQJCT0gJnMzY19kZXZpY2VfdGltZXJbMF0uZGV2LAorCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX2JhY2tsaWdodF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgbnVyaV9sY2RfcGxhdGZvcm1fZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCQk9IG51cmlfbGNkX3Bvd2VyX29uLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9sY2RfZGV2aWNlID0geworCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKKwkuaWQJCQk9IC0xLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9sY2RfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworLyogSTJDMSAqLworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMxX2RldnNbXSBfX2luaXRkYXRhID0geworCS8qIEd5cm8sIFRvIGJlIHVwZGF0ZWQgKi8KK307CisKKy8qIFRTUCAqLworc3RhdGljIHU4IG14dF9pbml0X3ZhbHNbXSA9IHsKKwkvKiBNWFRfR0VOX0NPTU1BTkQoNikgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9HRU5fUE9XRVIoNykgKi8KKwkweDIwLCAweGZmLCAweDMyLAorCS8qIE1YVF9HRU5fQUNRVUlSRSg4KSAqLworCTB4MGEsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MjMsCisJLyogTVhUX1RPVUNIX01VTFRJKDkpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgxMywgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDAxLCAweDAxLCAweDBlLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwKKwkvKiBNWFRfVE9VQ0hfS0VZQVJSQVkoMTUpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDAwLAorCS8qIE1YVF9TUFRfR1BJT1BXTSgxOSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogTVhUX1BST0NJX0dSSVBGQUNFKDIwKSAqLworCTB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4MjgsIDB4MDQsCisJMHgwZiwgMHgwYSwKKwkvKiBNWFRfUFJPQ0dfTk9JU0UoMjIpICovCisJMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgyMywgMHgwMCwKKwkweDAwLCAweDA1LCAweDBmLCAweDE5LCAweDIzLCAweDJkLCAweDAzLAorCS8qIE1YVF9UT1VDSF9QUk9YSU1JVFkoMjMpICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCS8qIE1YVF9QUk9DSV9PTkVUT1VDSCgyNCkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogTVhUX1NQVF9TRUxGVEVTVCgyNSkgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogTVhUX1BST0NJX1RXT1RPVUNIKDI3KSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJLyogTVhUX1NQVF9DVEVDT05GSUcoMjgpICovCisJMHgwMCwgMHgwMCwgMHgwMiwgMHgwOCwgMHgxMCwgMHgwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXh0X3BsYXRmb3JtX2RhdGEgbXh0X3BsYXRmb3JtX2RhdGEgPSB7CisJLmNvbmZpZwkJCT0gbXh0X2luaXRfdmFscywKKwkuY29uZmlnX2xlbmd0aAkJPSBBUlJBWV9TSVpFKG14dF9pbml0X3ZhbHMpLAorCisJLnhfbGluZQkJCT0gMTgsCisJLnlfbGluZQkJCT0gMTEsCisJLnhfc2l6ZQkJCT0gMTAyNCwKKwkueV9zaXplCQkJPSA2MDAsCisJLmJsZW4JCQk9IDB4MSwKKwkudGhyZXNob2xkCQk9IDB4MjgsCisJLnZvbHRhZ2UJCT0gMjgwMDAwMCwJCS8qIDIuOFYgKi8KKwkub3JpZW50CQkJPSBNWFRfRElBR09OQUxfQ09VTlRFUiwKKwkuaXJxZmxhZ3MJCT0gSVJRRl9UUklHR0VSX0ZBTExJTkcsCit9OworCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGkyYzNfZGF0YSBfX2luaXRkYXRhID0geworCS5mbGFncwkJPSAwLAorCS5idXNfbnVtCT0gMywKKwkuc2xhdmVfYWRkcgk9IDB4MTAsCisJLmZyZXF1ZW5jeQk9IDQwMCAqIDEwMDAsCisJLnNkYV9kZWxheQk9IDEwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjM19kZXZzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhdG1lbF9teHRfdHMiLCAweDRhKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXh0X3BsYXRmb3JtX2RhdGEsCisJCS5pcnEJCT0gSVJRX0VJTlQoNCksCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX3RzcF9pbml0KHZvaWQpCit7CisJaW50IGdwaW87CisKKwkvKiBUT1VDSF9JTlQ6IFhFSU5UXzQgKi8KKwlncGlvID0gRVhZTk9TNF9HUFgwKDQpOworCWdwaW9fcmVxdWVzdChncGlvLCAiVE9VQ0hfSU5UIik7CisJczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfVVApOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzFfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgInM1cC1hZGMiKSwgLyogVXNlZCBieSBDUFUncyBBREMgZHJ2ICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8zX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDExIiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG80X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDE4IiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG81X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZoc2ljIiwgIm1vZGVtY3RsIiksIC8qIE1PREVNICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG83X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18xOCIsICIwLTAwMWYiKSwgLyogSENEODAzICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG84X1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZ1c2JfZCIsIE5VTEwpLCAvKiBVc2VkIGJ5IENQVSAqLworCVJFR1VMQVRPUl9TVVBQTFkoInZkYWMiLCBOVUxMKSwgLyogVXNlZCBieSBDUFUgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzExX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJwbGF0Zm9ybS1sY2QiKSwgLyogVTgwNCBMVkRTICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRpbyIsICI2LTAwM2MiKSwgLyogSERDODAyICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xM19bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInMzYy1zZGhjaS4yIiksIC8qIFRGTEFTSCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTRfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiaW5tb3RvciIsICJtYXg4OTk3LWhhcHRpYyIpLAorfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTVfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiYXZkZCIsICIzLTAwNGEiKSwgLyogVG91Y2ggU2NyZWVuICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJkX3NlbnNvciIsICIwLTAwMWYiKSwgLyogSERDODAzICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xOF9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAiMy0wMDRhIiksIC8qIFRvdWNoIFNjcmVlbiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazFfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpLCAvKiBDUFVGUkVRICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrMl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfaW50IiwgTlVMTCksIC8qIENQVUZSRVEgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2szX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJtYWxpX2Rldi4wIiksIC8qIEczRCBvZiBFeHlub3MgNCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazRfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiY29yZSIsICIwLTAwMWYiKSwgLyogSERDODAzICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrNl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMjgiLCAiMC0wMDFmIiksIC8qIHBpbiAiNyIgb2YgSERDODAzICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDFfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidXNiX3ZidXMiLCBOVUxMKSwgLyogQ1BVJ3MgVVNCIE9URyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfZXNhZmVvdXQyX1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInVzYl92YnVzIiwgIm1vZGVtY3RsIiksIC8qIFZCVVMgb2YgTW9kZW0gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfY2hhcmdlcl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGcxIiwgImNoYXJnZXItbWFuYWdlci4wIiksCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19jaGdfdG9mZl9bXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGdfc3RvcCIsIE5VTEwpLCAvKiBmb3IgamFjayBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfMzJraHpfYXBfW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZ3BzX2NsayIsICJiY200NzUxIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiYnRfY2xrIiwgImJjbTQzMzAtYjEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ3aWZpX2NsayIsICJiY200MzMtYjEiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZBRENfMy4zVl9DMjEwIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMV8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMV8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQUxJVkVfMS4xVl9DMjEwIiwKKwkJLm1pbl91VgkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVVNCXzEuMVZfQzIxMCIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzNfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzNfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG80X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVk1JUElfMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzRfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzRfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG81X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkhTSUNfMS4yVl9DMjEwIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvNV8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvNV8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzZfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQ0NfMS44Vl9QREEiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNBTV9JU1BfMS44ViIsCisJCS5taW5fdVYJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJPSAxODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzdfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzdfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG84X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlVTQi9WREFDXzMuM1ZfQzIxMCIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzhfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzhfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG85X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDXzIuOFZfUERBIiwKKwkJLm1pbl91VgkJPSAyODAwMDAwLAorCQkubWF4X3VWCQk9IDI4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEwX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlBMTF8xLjFWX0MyMTAiLAorCQkubWluX3VWCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzExX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiTFZEU19WREQzLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYm9vdF9vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xMV8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTFfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZUX0NBTV8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTJfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzEyXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVEZfMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzEzXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xM18sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE0X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDXzMuMFZfTU9UT1IiLAorCQkubWluX3VWCQk9IDMwMDAwMDAsCisJCS5tYXhfdVYJCT0gMzAwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xNF8pLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTRfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZUT1VDSF9BRFZWMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE1XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xNV8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE2X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX1NFTlNPUl9JT18xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTZfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzE2XywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMThfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVE9VQ0hfVkREMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE4XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xOF8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzIxX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREUV9NMU0yXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2sxX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkFSTV8xLjJWX0MyMTAiLAorCQkubWluX3VWCQk9IDkwMDAwMCwKKwkJLm1heF91VgkJPSAxMzUwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazFfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2sxXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWSU5UXzEuMVZfQzIxMCIsCisJCS5taW5fdVYJCT0gOTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrMl8pLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazJfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrM19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZHM0RfMS4xVl9DMjEwIiwKKwkJLm1pbl91VgkJPSA5MDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQkgIFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazNfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2szXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDQU1fSVNQX0NPUkVfMS4yViIsCisJCS5taW5fdVYJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJPSAxMjAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2s0XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrNF8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s1X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVk1FTV8xLjJWX0MyMTAiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazZfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDQU1fQUZfMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2s2XyksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrNl8sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s3X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDX1NVQl8yLjBWIiwKKwkJLm1pbl91VgkJPSAyMDAwMDAwLAorCQkubWF4X3VWCQk9IDIwMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3XzMya2h6X2FwX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiMzJLSHogQVAiLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfMzJraHpfYXBfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3XzMya2h6X2FwXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfMzJraHpfY3BfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICIzMktIeiBDUCIsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X3ZpY2hnX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVklDSEciLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJTQUZFT1VUMSIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfZXNhZmVvdXQxXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19lc2FmZW91dDFfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJTQUZFT1VUMiIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfZXNhZmVvdXQyXyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19lc2FmZW91dDJfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX2N2X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0hBUkdFUl9DViIsCisJCS5taW5fdVYJCT0gNDIwMDAwMCwKKwkJLm1heF91VgkJPSA0MjAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2NoYXJnZXJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDSEFSR0VSIiwKKwkJLm1pbl91QQkJPSAyMDAwMDAsCisJCS5tYXhfdUEJCT0gOTUwMDAwLAorCQkuYm9vdF9vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTIHwKKwkJCQlSRUdVTEFUT1JfQ0hBTkdFX0NVUlJFTlQsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2NoYXJnZXJfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2NoYXJnZXJfLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX3RvcG9mZl9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNIQVJHRVIgVE9QT0ZGIiwKKwkJLm1pbl91QQkJPSA1MDAwMCwKKwkJLm1heF91QQkJPSAyMDAwMDAsCisJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfQ1VSUkVOVCwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfY2hnX3RvZmZfKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2NoZ190b2ZmXywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4ODk5N19yZWd1bGF0b3JfZGF0YSBfX2luaXRkYXRhIG51cmlfbWF4ODk5N19yZWd1bGF0b3JzW10gPSB7CisJeyBNQVg4OTk3X0xETzEsICZtYXg4OTk3X2xkbzFfZGF0YSB9LAorCXsgTUFYODk5N19MRE8yLCAmbWF4ODk5N19sZG8yX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMywgJm1heDg5OTdfbGRvM19kYXRhIH0sCisJeyBNQVg4OTk3X0xETzQsICZtYXg4OTk3X2xkbzRfZGF0YSB9LAorCXsgTUFYODk5N19MRE81LCAmbWF4ODk5N19sZG81X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPNiwgJm1heDg5OTdfbGRvNl9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzcsICZtYXg4OTk3X2xkbzdfZGF0YSB9LAorCXsgTUFYODk5N19MRE84LCAmbWF4ODk5N19sZG84X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPOSwgJm1heDg5OTdfbGRvOV9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzEwLCAmbWF4ODk5N19sZG8xMF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzExLCAmbWF4ODk5N19sZG8xMV9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzEyLCAmbWF4ODk5N19sZG8xMl9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzEzLCAmbWF4ODk5N19sZG8xM19kYXRhIH0sCisJeyBNQVg4OTk3X0xETzE0LCAmbWF4ODk5N19sZG8xNF9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzE1LCAmbWF4ODk5N19sZG8xNV9kYXRhIH0sCisJeyBNQVg4OTk3X0xETzE2LCAmbWF4ODk5N19sZG8xNl9kYXRhIH0sCisKKwl7IE1BWDg5OTdfTERPMTgsICZtYXg4OTk3X2xkbzE4X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMjEsICZtYXg4OTk3X2xkbzIxX2RhdGEgfSwKKworCXsgTUFYODk5N19CVUNLMSwgJm1heDg5OTdfYnVjazFfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLMiwgJm1heDg5OTdfYnVjazJfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLMywgJm1heDg5OTdfYnVjazNfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNCwgJm1heDg5OTdfYnVjazRfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNSwgJm1heDg5OTdfYnVjazVfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNiwgJm1heDg5OTdfYnVjazZfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNywgJm1heDg5OTdfYnVjazdfZGF0YSB9LAorCisJeyBNQVg4OTk3X0VOMzJLSFpfQVAsICZtYXg4OTk3XzMya2h6X2FwX2RhdGEgfSwKKwl7IE1BWDg5OTdfRU4zMktIWl9DUCwgJm1heDg5OTdfMzJraHpfY3BfZGF0YSB9LAorCisJeyBNQVg4OTk3X0VOVklDSEcsICZtYXg4OTk3X3ZpY2hnX2RhdGEgfSwKKwl7IE1BWDg5OTdfRVNBRkVPVVQxLCAmbWF4ODk5N19lc2FmZW91dDFfZGF0YSB9LAorCXsgTUFYODk5N19FU0FGRU9VVDIsICZtYXg4OTk3X2VzYWZlb3V0Ml9kYXRhIH0sCisJeyBNQVg4OTk3X0NIQVJHRVJfQ1YsICZtYXg4OTk3X2NoYXJnZXJfY3ZfZGF0YSB9LAorCXsgTUFYODk5N19DSEFSR0VSLCAmbWF4ODk5N19jaGFyZ2VyX2RhdGEgfSwKKwl7IE1BWDg5OTdfQ0hBUkdFUl9UT1BPRkYsICZtYXg4OTk3X2NoYXJnZXJfdG9wb2ZmX2RhdGEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgbnVyaV9tYXg4OTk3X3BkYXRhID0geworCS53YWtldXAJCQk9IDEsCisKKwkubnVtX3JlZ3VsYXRvcnMJCT0gQVJSQVlfU0laRShudXJpX21heDg5OTdfcmVndWxhdG9ycyksCisJLnJlZ3VsYXRvcnMJCT0gbnVyaV9tYXg4OTk3X3JlZ3VsYXRvcnMsCisKKwkuYnVjazEyNV9ncGlvcyA9IHsgRVhZTk9TNF9HUFgwKDUpLCBFWFlOT1M0X0dQWDAoNiksIEVYWU5PUzRfR1BMMCgwKSB9LAorCS5idWNrMl9ncGlvZHZzID0gdHJ1ZSwKKworCS5idWNrMV92b2x0YWdlWzBdID0gMTM1MDAwMCwgLyogMS4zNVYgKi8KKwkuYnVjazFfdm9sdGFnZVsxXSA9IDEzMDAwMDAsIC8qIDEuM1YgKi8KKwkuYnVjazFfdm9sdGFnZVsyXSA9IDEyNTAwMDAsIC8qIDEuMjVWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbM10gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbNF0gPSAxMTUwMDAwLCAvKiAxLjE1ViAqLworCS5idWNrMV92b2x0YWdlWzVdID0gMTEwMDAwMCwgLyogMS4xViAqLworCS5idWNrMV92b2x0YWdlWzZdID0gMTAwMDAwMCwgLyogMS4wViAqLworCS5idWNrMV92b2x0YWdlWzddID0gOTUwMDAwLCAvKiAwLjk1ViAqLworCisJLmJ1Y2syX3ZvbHRhZ2VbMF0gPSAxMTAwMDAwLCAvKiAxLjFWICovCisJLmJ1Y2syX3ZvbHRhZ2VbMV0gPSAxMDAwMDAwLCAvKiAxLjBWICovCisJLmJ1Y2syX3ZvbHRhZ2VbMl0gPSA5NTAwMDAsIC8qIDAuOTVWICovCisJLmJ1Y2syX3ZvbHRhZ2VbM10gPSA5MDAwMDAsIC8qIDAuOVYgKi8KKwkuYnVjazJfdm9sdGFnZVs0XSA9IDExMDAwMDAsIC8qIDEuMVYgKi8KKwkuYnVjazJfdm9sdGFnZVs1XSA9IDEwMDAwMDAsIC8qIDEuMFYgKi8KKwkuYnVjazJfdm9sdGFnZVs2XSA9IDk1MDAwMCwgLyogMC45NVYgKi8KKwkuYnVjazJfdm9sdGFnZVs3XSA9IDkwMDAwMCwgLyogMC45ViAqLworCisJLmJ1Y2s1X3ZvbHRhZ2VbMF0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbMV0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbMl0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbM10gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNF0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNV0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbNl0gPSAxMjAwMDAwLCAvKiAxLjJWICovCisJLmJ1Y2s1X3ZvbHRhZ2VbN10gPSAxMjAwMDAwLCAvKiAxLjJWICovCit9OworCisvKiBHUElPIEkyQyA1IChQTUlDKSAqLworZW51bSB7IEkyQzVfTUFYODk5NyB9Oworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmM1X2RldnNbXSBfX2luaXRkYXRhID0geworCVtJMkM1X01BWDg5OTddID0geworCQlJMkNfQk9BUkRfSU5GTygibWF4ODk5NyIsIDB4Q0MgPj4gMSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfbWF4ODk5N19wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhIG51cmlfYmF0dGVyeV9wbGF0Zm9ybV9kYXRhID0geworfTsKKworLyogR1BJTyBJMkMgOSAoRnVlbCBHYXVnZSkgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBpMmM5X2dwaW9fZGF0YSA9IHsKKwkuc2RhX3BpbgkJPSBFWFlOT1M0X0dQWTQoMCksICAgICAgLyogWE0wQUREUl84ICovCisJLnNjbF9waW4JCT0gRVhZTk9TNF9HUFk0KDEpLCAgICAgIC8qIFhNMEFERFJfOSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyYzlfZ3BpbyA9IHsKKwkubmFtZQkJCT0gImkyYy1ncGlvIiwKKwkuaWQJCQk9IDksCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZpMmM5X2dwaW9fZGF0YSwKKwl9LAorfTsKK2VudW0geyBJMkM5X01BWDE3MDQyfTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjOV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwlbSTJDOV9NQVgxNzA0Ml0gPSB7CisJCUkyQ19CT0FSRF9JTkZPKCJtYXgxNzA0MiIsIDB4MzYpLAorCQkucGxhdGZvcm1fZGF0YSA9ICZudXJpX2JhdHRlcnlfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworLyogTUFYODkwMyBTZWNvbmRhcnkgQ2hhcmdlciAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHN1cHBsaWVzX21heDg5MDNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2aW5jaGcyIiwgImNoYXJnZXItbWFuYWdlci4wIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbWF4ODkwM19jaGFyZ2VyX2VuX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubmFtZQkJPSAiVk9VVF9DSEFSR0VSIiwKKwkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5ib290X29uCT0gMSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHN1cHBsaWVzX21heDg5MDMpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IHN1cHBsaWVzX21heDg5MDMsCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIG1heDg5MDNfY2hhcmdlcl9lbiA9IHsKKwkuc3VwcGx5X25hbWUgPSAiVk9VVF9DSEFSR0VSIiwKKwkubWljcm92b2x0cyA9IDUwMDAwMDAsIC8qIEFzc3VtZSA1VkRDICovCisJLmdwaW8gPSBFWFlOT1M0X0dQWTQoNSksIC8qIFRBX0VOIG5lZ2FnZWQgKi8KKwkuZW5hYmxlX2hpZ2ggPSAwLCAvKiBFbmFibGUgPSBMb3cgKi8KKwkuZW5hYmxlZF9hdF9ib290ID0gMSwKKwkuaW5pdF9kYXRhID0gJm1heDg5MDNfY2hhcmdlcl9lbl9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWF4ODkwM19maXhlZF9yZWdfZGV2ID0geworCS5uYW1lID0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQgPSBGSVhFRF9SRUdfSURfTUFYODkwMywKKwkuZGV2ID0geyAucGxhdGZvcm1fZGF0YQk9ICZtYXg4OTAzX2NoYXJnZXJfZW4gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4ODkwM19wZGF0YSBudXJpX21heDg5MDMgPSB7CisJLyoKKwkgKiBjZW46IGRvbid0IGNvbnRyb2wgd2l0aCB0aGUgZHJpdmVyLCBsZXQgaXQgYmUKKwkgKiBjb250cm9sbGVkIGJ5IHJlZ3VsYXRvciBhYm92ZQorCSAqLworCS5kb2sgPSBFWFlOT1M0X0dQWDEoNCksIC8qIFRBX25DT05ORUNURUQgKi8KKwkvKiB1b2ssIHVzdXM6IG5vdCBjb25uZWN0ZWQgKi8KKwkuY2hnID0gRVhZTk9TNF9HUEUyKDApLCAvKiBUQV9uQ0hHICovCisJLyogZmx0OiB2Y2NfMS44Vl9wZGEgKi8KKwkuZGNtID0gRVhZTk9TNF9HUEwwKDEpLCAvKiBDVVJSX0FESiAqLworCisJLmRjX3ZhbGlkID0gdHJ1ZSwKKwkudXNiX3ZhbGlkID0gZmFsc2UsIC8qIFVTQiBpcyBub3Qgd2lyZWQgdG8gTUFYODkwMyAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVyaV9tYXg4OTAzX2RldmljZSA9IHsKKwkubmFtZQkJCT0gIm1heDg5MDMtY2hhcmdlciIsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX21heDg5MDMsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX3Bvd2VyX2luaXQodm9pZCkKK3sKKwlpbnQgZ3BpbzsKKwlpbnQgaXJxX2Jhc2UgPSBJUlFfR1BJT19FTkQgKyAxOworCWludCB0YV9lbiA9IDA7CisKKwludXJpX21heDg5OTdfcGRhdGEuaXJxX2Jhc2UgPSBpcnFfYmFzZTsKKwlpcnFfYmFzZSArPSBNQVg4OTk3X0lSUV9OUjsKKworCWdwaW8gPSBFWFlOT1M0X0dQWDAoNyk7CisJZ3Bpb19yZXF1ZXN0KGdwaW8sICJBUF9QTUlDX0lSUSIpOworCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX05PTkUpOworCisJZ3BpbyA9IEVYWU5PUzRfR1BYMigzKTsKKwlncGlvX3JlcXVlc3QoZ3BpbywgIkZVRUxfQUxFUlQiKTsKKwlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOworCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9OT05FKTsKKworCWdwaW8gPSBudXJpX21heDg5MDMuZG9rOworCWdwaW9fcmVxdWVzdChncGlvLCAiVEFfbkNPTk5FQ1RFRCIpOworCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX05PTkUpOworCXRhX2VuID0gZ3Bpb19nZXRfdmFsdWUoZ3BpbykgPyAwIDogMTsKKworCWdwaW8gPSBudXJpX21heDg5MDMuY2hnOworCWdwaW9fcmVxdWVzdChncGlvLCAiVEFfbkNIRyIpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCisJZ3BpbyA9IG51cmlfbWF4ODkwMy5kY207CisJZ3Bpb19yZXF1ZXN0KGdwaW8sICJDVVJSX0FESiIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB0YV9lbik7Cit9CisKKy8qIFVTQiBFSENJICovCitzdGF0aWMgc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhIG51cmlfZWhjaV9wZGF0YTsKKworc3RhdGljIHZvaWQgX19pbml0IG51cmlfZWhjaV9pbml0KHZvaWQpCit7CisJc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpwZGF0YSA9ICZudXJpX2VoY2lfcGRhdGE7CisKKwlzNXBfZWhjaV9zZXRfcGxhdGRhdGEocGRhdGEpOworfQorCisvKiBDQU1FUkEgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBjYW1fdmRkYV9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJhX3NlbnNvciIsICIwLTAwMWYiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBjYW1fdmRkYV9yZWdfaW5pdF9kYXRhID0geworCS5jb25zdHJhaW50cyA9IHsgLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMgfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShjYW1fdmRkYV9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IGNhbV92ZGRhX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgY2FtX3ZkZGFfZml4ZWRfdm9sdGFnZV9jZmcgPSB7CisJLnN1cHBseV9uYW1lCT0gIkNBTV9JT19FTiIsCisJLm1pY3Jvdm9sdHMJPSAyODAwMDAwLAorCS5ncGlvCQk9IEVYWU5PUzRfR1BFMigxKSwgLyogQ0FNX0lPX0VOICovCisJLmVuYWJsZV9oaWdoCT0gMSwKKwkuaW5pdF9kYXRhCT0gJmNhbV92ZGRhX3JlZ19pbml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjYW1fdmRkYV9maXhlZF9yZGV2ID0geworCS5uYW1lID0gInJlZy1maXhlZC12b2x0YWdlIiwgLmlkID0gRklYRURfUkVHX0lEX0NBTV9BMjhWLAorCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhCT0gJmNhbV92ZGRhX2ZpeGVkX3ZvbHRhZ2VfY2ZnIH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgY2FtZXJhXzhtXzEydl9zdXBwbHkgPQorCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18xMiIsICIwLTAwMWYiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNhbV84bV8xMnZfcmVnX2luaXRfZGF0YSA9IHsKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmY2FtZXJhXzhtXzEydl9zdXBwbHksCisJLmNvbnN0cmFpbnRzID0geworCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUworCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGNhbV84bV8xMnZfZml4ZWRfdm9sdGFnZV9jZmcgPSB7CisJLnN1cHBseV9uYW1lCT0gIjhNXzEuMlYiLAorCS5taWNyb3ZvbHRzCT0gMTIwMDAwMCwKKwkuZ3BpbwkJPSBFWFlOT1M0X0dQRTIoNSksIC8qIDhNXzEuMlZfRU4gKi8KKwkuZW5hYmxlX2hpZ2gJPSAxLAorCS5pbml0X2RhdGEJPSAmY2FtXzhtXzEydl9yZWdfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2FtXzhtXzEydl9maXhlZF9yZGV2ID0geworCS5uYW1lID0gInJlZy1maXhlZC12b2x0YWdlIiwgLmlkID0gRklYRURfUkVHX0lEX0NBTV8xMlYsCisJLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmY2FtXzhtXzEydl9maXhlZF92b2x0YWdlX2NmZyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIG1pcGlfY3Npc19wbGF0ZGF0YSA9IHsKKwkuY2xrX3JhdGUJPSAxNjYwMDAwMDBVTCwKKwkubGFuZXMJCT0gMiwKKwkuYWxpZ25tZW50CT0gMzIsCisJLmhzX3NldHRsZQk9IDEyLAorCS5waHlfZW5hYmxlCT0gczVwX2NzaXNfcGh5X2VuYWJsZSwKK307CisKKyNkZWZpbmUgR1BJT19DQU1fTUVHQV9SU1QJRVhZTk9TNF9HUFkzKDcpIC8qIElTUF9SRVNFVCAqLworI2RlZmluZSBHUElPX0NBTV84TV9JU1BfSU5UCUVYWU5PUzRfR1BMMig1KQorCitzdGF0aWMgc3RydWN0IG01bW9sc19wbGF0Zm9ybV9kYXRhIG01bW9sc19wbGF0ZGF0YSA9IHsKKwkuZ3Bpb19yZXNldCA9IEdQSU9fQ0FNX01FR0FfUlNULAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBtNW1vbHNfYm9hcmRfaW5mbyA9IHsKKwlJMkNfQk9BUkRfSU5GTygiTTVNT0xTIiwgMHgxRiksCisJLnBsYXRmb3JtX2RhdGEJPSAmbTVtb2xzX3BsYXRkYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyBudXJpX2NhbWVyYV9zZW5zb3JzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQkJCSAgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1csCisJCS5idXNfdHlwZQk9IEZJTUNfTUlQSV9DU0kyLAorCQkuYm9hcmRfaW5mbwk9ICZtNW1vbHNfYm9hcmRfaW5mbywKKwkJLmNsa19mcmVxdWVuY3kJPSAyNDAwMDAwMFVMLAorCQkuY3NpX2RhdGFfYWxpZ24JPSAzMiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfcGxhdGZvcm1fZmltYyBmaW1jX21kX3BsYXRkYXRhID0geworCS5pc3BfaW5mbwk9IG51cmlfY2FtZXJhX3NlbnNvcnMsCisJLm51bV9jbGllbnRzCT0gQVJSQVlfU0laRShudXJpX2NhbWVyYV9zZW5zb3JzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3BpbyBudXJpX2NhbWVyYV9ncGlvc1tdID0geworCXsgR1BJT19DQU1fOE1fSVNQX0lOVCwJR1BJT0ZfSU4sICAgICAgICAgICAiOE1fSVNQX0lOVCIgIH0sCisJeyBHUElPX0NBTV9NRUdBX1JTVCwJR1BJT0ZfT1VUX0lOSVRfTE9XLCAiQ0FNXzhNX05SU1QiIH0sCit9OworCitzdGF0aWMgdm9pZCBudXJpX2NhbWVyYV9pbml0KHZvaWQpCit7CisJczNjX3NldF9wbGF0ZGF0YSgmbWlwaV9jc2lzX3BsYXRkYXRhLCBzaXplb2YobWlwaV9jc2lzX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9taXBpX2NzaXMwKTsKKwlzM2Nfc2V0X3BsYXRkYXRhKCZmaW1jX21kX3BsYXRkYXRhLCAgc2l6ZW9mKGZpbWNfbWRfcGxhdGRhdGEpLAorCQkJICZzNXBfZGV2aWNlX2ZpbWNfbWQpOworCisJaWYgKGdwaW9fcmVxdWVzdF9hcnJheShudXJpX2NhbWVyYV9ncGlvcywKKwkJCSAgICAgICBBUlJBWV9TSVpFKG51cmlfY2FtZXJhX2dwaW9zKSkpIHsKKwkJcHJfZXJyKCIlczogR1BJTyByZXF1ZXN0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJbTVtb2xzX2JvYXJkX2luZm8uaXJxID0gczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KEdQSU9fQ0FNXzhNX0lTUF9JTlQpOworCWlmICghSVNfRVJSX1ZBTFVFKG01bW9sc19ib2FyZF9pbmZvLmlycSkpCisJCXMzY19ncGlvX2NmZ3BpbihHUElPX0NBTV84TV9JU1BfSU5ULCBTM0NfR1BJT19TRk4oMHhGKSk7CisJZWxzZQorCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIDhNX0lTUF9JTlQgR1BJT1xuIiwgX19mdW5jX18pOworCisJLyogRnJlZSBHUElPcyBjb250cm9sbGVkIGRpcmVjdGx5IGJ5IHRoZSBzZW5zb3IgZHJpdmVycy4gKi8KKwlncGlvX2ZyZWUoR1BJT19DQU1fTUVHQV9SU1QpOworCisJaWYgKGV4eW5vczRfZmltY19zZXR1cF9ncGlvKFM1UF9DQU1QT1JUX0EpKSB7CisJCXByX2VycigiJXM6IENhbWVyYSBwb3J0IEEgc2V0dXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJLyogSW5jcmVhc2UgZHJpdmUgc3RyZW5ndGggb2YgdGhlIHNlbnNvciBjbG9jayBvdXRwdXQgKi8KKwlzNXBfZ3Bpb19zZXRfZHJ2c3RyKEVYWU5PUzRfR1BKMSgzKSwgUzVQX0dQSU9fRFJWU1RSX0xWNCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgbnVyaV9pMmMwX3BsYXRkYXRhIF9faW5pdGRhdGEgPSB7CisJLmZyZXF1ZW5jeQk9IDQwMDAwMFUsCisJLnNkYV9kZWxheQk9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudXJpX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCS8qIFNhbXN1bmcgUGxhdGZvcm0gRGV2aWNlcyAqLworCSZzM2NfZGV2aWNlX2kyYzUsIC8qIFBNSUMgc2hvdWxkIGluaXRpYWxpemUgZmlyc3QgKi8KKwkmczNjX2RldmljZV9pMmMwLAorCSZlbW1jX2ZpeGVkX3ZvbHRhZ2UsCisJJnM1cF9kZXZpY2VfbWlwaV9jc2lzMCwKKwkmczVwX2RldmljZV9maW1jMCwKKwkmczVwX2RldmljZV9maW1jMSwKKwkmczVwX2RldmljZV9maW1jMiwKKwkmczVwX2RldmljZV9maW1jMywKKwkmczVwX2RldmljZV9maW1kMCwKKwkmczNjX2RldmljZV9oc21tYzAsCisJJnMzY19kZXZpY2VfaHNtbWMyLAorCSZzM2NfZGV2aWNlX2hzbW1jMywKKwkmczNjX2RldmljZV93ZHQsCisJJnMzY19kZXZpY2VfdGltZXJbMF0sCisJJnM1cF9kZXZpY2VfZWhjaSwKKwkmczNjX2RldmljZV9pMmMzLAorCSZpMmM5X2dwaW8sCisJJnMzY19kZXZpY2VfYWRjLAorCSZzM2NfZGV2aWNlX3J0YywKKwkmczVwX2RldmljZV9tZmMsCisJJnM1cF9kZXZpY2VfbWZjX2wsCisJJnM1cF9kZXZpY2VfbWZjX3IsCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLAorCSZzNXBfZGV2aWNlX2ZpbWNfbWQsCisKKwkvKiBOVVJJIERldmljZXMgKi8KKwkmbnVyaV9ncGlvX2tleXMsCisJJm51cmlfbGNkX2RldmljZSwKKwkmbnVyaV9iYWNrbGlnaHRfZGV2aWNlLAorCSZtYXg4OTAzX2ZpeGVkX3JlZ19kZXYsCisJJm51cmlfbWF4ODkwM19kZXZpY2UsCisJJmNhbV92ZGRhX2ZpeGVkX3JkZXYsCisJJmNhbV84bV8xMnZfZml4ZWRfcmRldiwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX21hcF9pbyh2b2lkKQoreworCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOworCXMzYzI0eHhfaW5pdF9jbG9ja3MoMjQwMDAwMDApOworCXMzYzI0eHhfaW5pdF91YXJ0cyhudXJpX3VhcnRjZmdzLCBBUlJBWV9TSVpFKG51cmlfdWFydGNmZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG51cmlfcmVzZXJ2ZSh2b2lkKQoreworCXM1cF9tZmNfcmVzZXJ2ZV9tZW0oMHg0MzAwMDAwMCwgOCA8PCAyMCwgMHg1MTAwMDAwMCwgOCA8PCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBudXJpX21hY2hpbmVfaW5pdCh2b2lkKQoreworCW51cmlfc2RoY2lfaW5pdCgpOworCW51cmlfdHNwX2luaXQoKTsKKwludXJpX3Bvd2VyX2luaXQoKTsKKworCXMzY19pMmMwX3NldF9wbGF0ZGF0YSgmbnVyaV9pMmMwX3BsYXRkYXRhKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmMxX2RldnMsIEFSUkFZX1NJWkUoaTJjMV9kZXZzKSk7CisJczNjX2kyYzNfc2V0X3BsYXRkYXRhKCZpMmMzX2RhdGEpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIGkyYzNfZGV2cywgQVJSQVlfU0laRShpMmMzX2RldnMpKTsKKwlzM2NfaTJjNV9zZXRfcGxhdGRhdGEoTlVMTCk7CisJaTJjNV9kZXZzW0kyQzVfTUFYODk5N10uaXJxID0gZ3Bpb190b19pcnEoRVhZTk9TNF9HUFgwKDcpKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyg1LCBpMmM1X2RldnMsIEFSUkFZX1NJWkUoaTJjNV9kZXZzKSk7CisJaTJjOV9kZXZzW0kyQzlfTUFYMTcwNDJdLmlycSA9IGdwaW9fdG9faXJxKEVYWU5PUzRfR1BYMigzKSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oOSwgaTJjOV9kZXZzLCBBUlJBWV9TSVpFKGkyYzlfZGV2cykpOworCisJczVwX2ZpbWQwX3NldF9wbGF0ZGF0YSgmbnVyaV9mYl9wZGF0YSk7CisKKwludXJpX2NhbWVyYV9pbml0KCk7CisKKwludXJpX2VoY2lfaW5pdCgpOworCWNsa194dXNieHRpLnJhdGUgPSAyNDAwMDAwMDsKKworCS8qIExhc3QgKi8KKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhudXJpX2RldmljZXMsIEFSUkFZX1NJWkUobnVyaV9kZXZpY2VzKSk7CisJczVwX2RldmljZV9tZmMuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWQwLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0uZGV2OworCisJczVwX2RldmljZV9maW1jMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfZmltYzEuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWMyLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7CisJczVwX2RldmljZV9maW1jMy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfbWlwaV9jc2lzMC5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworfQorCitNQUNISU5FX1NUQVJUKE5VUkksICJOVVJJIikKKwkvKiBNYWludGFpbmVyOiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBudXJpX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gbnVyaV9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorCS5yZXNlcnZlICAgICAgICA9ICZudXJpX3Jlc2VydmUsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1vcmlnZW4uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtb3JpZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYjU2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtb3JpZ2VuLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLW9yaWdlbi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEluc2lnbmFsIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuaW5zaWduYWwuY28ua3IvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny5oPgorI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L2lpYy5oPgorI2luY2x1ZGUgPHBsYXQvZWhjaS5oPgorI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxwbGF0L3BkLmg+CisjaW5jbHVkZSA8cGxhdC9mYi5oPgorI2luY2x1ZGUgPHBsYXQvbWZjLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT1JJR0VOX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAorCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCisKKyNkZWZpbmUgT1JJR0VOX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAorCisjZGVmaW5lIE9SSUdFTl9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzQgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHNCkKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgb3JpZ2VuX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKKwlbMF0gPSB7CisJCS5od3BvcnQJCT0gMCwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IE9SSUdFTl9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBPUklHRU5fVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE9SSUdFTl9VRkNPTl9ERUZBVUxULAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CQk9IDEsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBPUklHRU5fVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gT1JJR0VOX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBPUklHRU5fVUZDT05fREVGQVVMVCwKKwl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkJPSAyLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gT1JJR0VOX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IE9SSUdFTl9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gT1JJR0VOX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbM10gPSB7CisJCS5od3BvcnQJCT0gMywKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IE9SSUdFTl9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBPUklHRU5fVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IE9SSUdFTl9VRkNPTl9ERUZBVUxULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG8zX2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkMTEiLCAiczVwLW1pcGktY3Npcy4wIiksIC8qIE1JUEkgKi8KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAiZXh5bm9zNC1oZG1pIiksIC8qIEhETUkgKi8KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfcGxsIiwgImV4eW5vczQtaGRtaSIpLCAvKiBIRE1JICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbGRvNl9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDE4IiwgInM1cC1taXBpLWNzaXMuMCIpLCAvKiBNSVBJICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbGRvN19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoImF2ZGQiLCAiYWxjNTYyNSIpLCAvKiBSZWFsdGVrIEFMQzU2MjUgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBsZG84X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgInM1cC1hZGMiKSwgLyogQURDICovCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX29zYyIsICJleHlub3M0LWhkbWkiKSwgLyogSERNSSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzlfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJkdmRkIiwgInN3Yi1hMzEiKSwgLyogQVI2MDAzIFdMQU4gJiBDU1IgODgxMCBCVCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzExX2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZHZkZCIsICJhbGM1NjI1IiksIC8qIFJlYWx0ZWsgQUxDNTYyNSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzE0X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiYXZkZDE4IiwgInN3Yi1hMzEiKSwgLyogQVI2MDAzIFdMQU4gJiBDU1IgODgxMCBCVCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGxkbzE3X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkMzMiLCAic3diLWEzMSIpLCAvKiBBUjYwMDMgV0xBTiAmIENTUiA4ODEwIEJUICovCit9Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgYnVjazFfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfYXJtIiwgTlVMTCksIC8qIENQVUZSRVEgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBidWNrMl9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9pbnQiLCBOVUxMKSwgLyogQ1BVRlJFUSAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIGJ1Y2szX2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2czZCIsICJtYWxpX2RybSIpLCAvKiBHM0QgKi8KK307CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBidWNrN19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZjYyIsICJwbGF0Zm9ybS1sY2QiKSwgLyogTENEICovCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQUJCXzMuM1YiLAorCQkubWluX3VWCQk9IDMzMDAwMDAsCisJCS5tYXhfdVYJCT0gMzMwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMl9kYXRhCT0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9BTElWRV8xLjFWIiwKKwkJLm1pbl91VgkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWTUlQSV8xLjFWIiwKKwkJLm1pbl91VgkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQk9IDExMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkbzNfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGxkbzNfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfUlRDXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzZfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWTUlQSV8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkbzZfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGxkbzZfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzdfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQVVEXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRvN19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRvN19jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvOF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZBRENfMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG84X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG84X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG85X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiRFZERF9TV0JfMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG85X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG85X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xMF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9QTExfMS4xViIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTFfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfQVVEXzNWIiwKKwkJLm1pbl91VgkJPSAzMDAwMDAwLAorCQkubWF4X3VWCQk9IDMwMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkbzExX2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZG8xMV9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJBVkREMThfU1dCXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRvMTRfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IGxkbzE0X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xN19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9TV0JfMy4zViIsCisJCS5taW5fdVYJCT0gMzMwMDAwMCwKKwkJLm1heF91VgkJPSAzMzAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShsZG8xN19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRvMTdfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzIxX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX01JRl8xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9BUk1fMS4yViIsCisJCS5taW5fdVYJCT0gOTUwMDAwLAorCQkubWF4X3VWCQk9IDEzNTAwMDAsCisJCS5hbHdheXNfb24JPSAxLAorCQkuYm9vdF9vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShidWNrMV9jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gYnVjazFfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2syX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0lOVF8xLjFWIiwKKwkJLm1pbl91VgkJPSA5MDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5ib290X29uCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGJ1Y2syX2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBidWNrMl9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfRzNEXzEuMVYiLAorCQkubWluX3VWCQk9IDkwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJCQlSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShidWNrM19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gYnVjazNfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s1X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREUV9NMU0yXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s3X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0xDRF8zLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS5ib290X29uCT0gMSwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShidWNrN19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gYnVjazdfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OTdfcmVndWxhdG9yX2RhdGEgX19pbml0ZGF0YSBvcmlnZW5fbWF4ODk5N19yZWd1bGF0b3JzW10gPSB7CisJeyBNQVg4OTk3X0xETzEsCQkmbWF4ODk5N19sZG8xX2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPMiwJCSZtYXg4OTk3X2xkbzJfZGF0YSB9LAorCXsgTUFYODk5N19MRE8zLAkJJm1heDg5OTdfbGRvM19kYXRhIH0sCisJeyBNQVg4OTk3X0xETzQsCQkmbWF4ODk5N19sZG80X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPNiwJCSZtYXg4OTk3X2xkbzZfZGF0YSB9LAorCXsgTUFYODk5N19MRE83LAkJJm1heDg5OTdfbGRvN19kYXRhIH0sCisJeyBNQVg4OTk3X0xETzgsCQkmbWF4ODk5N19sZG84X2RhdGEgfSwKKwl7IE1BWDg5OTdfTERPOSwJCSZtYXg4OTk3X2xkbzlfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMCwJJm1heDg5OTdfbGRvMTBfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xMSwJJm1heDg5OTdfbGRvMTFfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xNCwJJm1heDg5OTdfbGRvMTRfZGF0YSB9LAorCXsgTUFYODk5N19MRE8xNywJJm1heDg5OTdfbGRvMTdfZGF0YSB9LAorCXsgTUFYODk5N19MRE8yMSwJJm1heDg5OTdfbGRvMjFfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLMSwJJm1heDg5OTdfYnVjazFfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLMiwJJm1heDg5OTdfYnVjazJfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLMywJJm1heDg5OTdfYnVjazNfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNSwJJm1heDg5OTdfYnVjazVfZGF0YSB9LAorCXsgTUFYODk5N19CVUNLNywJJm1heDg5OTdfYnVjazdfZGF0YSB9LAorfTsKKworc3RydWN0IG1heDg5OTdfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG9yaWdlbl9tYXg4OTk3X3BkYXRhID0geworCS5udW1fcmVndWxhdG9ycyA9IEFSUkFZX1NJWkUob3JpZ2VuX21heDg5OTdfcmVndWxhdG9ycyksCisJLnJlZ3VsYXRvcnMJPSBvcmlnZW5fbWF4ODk5N19yZWd1bGF0b3JzLAorCisJLndha2V1cAk9IHRydWUsCisJLmJ1Y2sxX2dwaW9kdnMJPSBmYWxzZSwKKwkuYnVjazJfZ3Bpb2R2cwk9IGZhbHNlLAorCS5idWNrNV9ncGlvZHZzCT0gZmFsc2UsCisJLmlycV9iYXNlCT0gSVJRX0dQSU9fRU5EICsgMSwKKworCS5pZ25vcmVfZ3Bpb2R2c19zaWRlX2VmZmVjdCA9IHRydWUsCisJLmJ1Y2sxMjVfZGVmYXVsdF9pZHggPSAweDAsCisKKwkuYnVjazEyNV9ncGlvc1swXQk9IEVYWU5PUzRfR1BYMCgwKSwKKwkuYnVjazEyNV9ncGlvc1sxXQk9IEVYWU5PUzRfR1BYMCgxKSwKKwkuYnVjazEyNV9ncGlvc1syXQk9IEVYWU5PUzRfR1BYMCgyKSwKKworCS5idWNrMV92b2x0YWdlWzBdCT0gMTM1MDAwMCwKKwkuYnVjazFfdm9sdGFnZVsxXQk9IDEzMDAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2VbMl0JPSAxMjUwMDAwLAorCS5idWNrMV92b2x0YWdlWzNdCT0gMTIwMDAwMCwKKwkuYnVjazFfdm9sdGFnZVs0XQk9IDExNTAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2VbNV0JPSAxMTAwMDAwLAorCS5idWNrMV92b2x0YWdlWzZdCT0gMTAwMDAwMCwKKwkuYnVjazFfdm9sdGFnZVs3XQk9IDk1MDAwMCwKKworCS5idWNrMl92b2x0YWdlWzBdCT0gMTEwMDAwMCwKKwkuYnVjazJfdm9sdGFnZVsxXQk9IDExMDAwMDAsCisJLmJ1Y2syX3ZvbHRhZ2VbMl0JPSAxMTAwMDAwLAorCS5idWNrMl92b2x0YWdlWzNdCT0gMTEwMDAwMCwKKwkuYnVjazJfdm9sdGFnZVs0XQk9IDEwMDAwMDAsCisJLmJ1Y2syX3ZvbHRhZ2VbNV0JPSAxMDAwMDAwLAorCS5idWNrMl92b2x0YWdlWzZdCT0gMTAwMDAwMCwKKwkuYnVjazJfdm9sdGFnZVs3XQk9IDEwMDAwMDAsCisKKwkuYnVjazVfdm9sdGFnZVswXQk9IDEyMDAwMDAsCisJLmJ1Y2s1X3ZvbHRhZ2VbMV0JPSAxMjAwMDAwLAorCS5idWNrNV92b2x0YWdlWzJdCT0gMTIwMDAwMCwKKwkuYnVjazVfdm9sdGFnZVszXQk9IDEyMDAwMDAsCisJLmJ1Y2s1X3ZvbHRhZ2VbNF0JPSAxMjAwMDAwLAorCS5idWNrNV92b2x0YWdlWzVdCT0gMTIwMDAwMCwKKwkuYnVjazVfdm9sdGFnZVs2XQk9IDEyMDAwMDAsCisJLmJ1Y2s1X3ZvbHRhZ2VbN10JPSAxMjAwMDAwLAorfTsKKworLyogSTJDMCAqLworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMwX2RldnNbXSBfX2luaXRkYXRhID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oIm1heDg5OTciLCAoMHhDQyA+PiAxKSksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJm9yaWdlbl9tYXg4OTk3X3BkYXRhLAorCQkuaXJxCQk9IElSUV9FSU5UKDQpLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBvcmlnZW5faHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIG9yaWdlbl9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworLyogVVNCIEVIQ0kgKi8KK3N0YXRpYyBzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgb3JpZ2VuX2VoY2lfcGRhdGE7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcmlnZW5fZWhjaV9pbml0KHZvaWQpCit7CisJc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpwZGF0YSA9ICZvcmlnZW5fZWhjaV9wZGF0YTsKKworCXM1cF9laGNpX3NldF9wbGF0ZGF0YShwZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBvcmlnZW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJeworCQkuY29kZQkJCT0gS0VZX01FTlUsCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDEoNSksCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfTUVOVSIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS53YWtldXAJCQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX0hPTUUsCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDEoNiksCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfSE9NRSIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS53YWtldXAJCQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX0JBQ0ssCisJCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDEoNyksCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfQkFDSyIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS53YWtldXAJCQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX1VQLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDApLAorCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX1VQIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLndha2V1cAkJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LCB7CisJCS5jb2RlCQkJPSBLRVlfRE9XTiwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigxKSwKKwkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9ET1dOIiwKKwkJLnR5cGUJCQk9IEVWX0tFWSwKKwkJLmFjdGl2ZV9sb3cJCT0gMSwKKwkJLndha2V1cAkJCT0gMSwKKwkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBvcmlnZW5fZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMJPSBvcmlnZW5fZ3Bpb19rZXlzX3RhYmxlLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUob3JpZ2VuX2dwaW9fa2V5c190YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvcmlnZW5fZGV2aWNlX2dwaW9rZXlzID0geworCS5uYW1lCQk9ICJncGlvLWtleXMiLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZvcmlnZW5fZ3Bpb19rZXlzX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGxjZF9odjA3MHdzYV9zZXRfcG93ZXIoc3RydWN0IHBsYXRfbGNkX2RhdGEgKnBkLCB1bnNpZ25lZCBpbnQgcG93ZXIpCit7CisJaW50IHJldDsKKworCWlmIChwb3dlcikKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShFWFlOT1M0X0dQRTMoNCksCisJCQkJCUdQSU9GX09VVF9JTklUX0hJR0gsICJHUEUzXzQiKTsKKwllbHNlCisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEUzKDQpLAorCQkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJHUEUzXzQiKTsKKworCWdwaW9fZnJlZShFWFlOT1M0X0dQRTMoNCkpOworCisJaWYgKHJldCkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBncGlvIGZvciBMQ0QgcG93ZXI6ICVkXG4iLCByZXQpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgb3JpZ2VuX2xjZF9odjA3MHdzYV9kYXRhID0geworCS5zZXRfcG93ZXIgPSBsY2RfaHYwNzB3c2Ffc2V0X3Bvd2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb3JpZ2VuX2xjZF9odjA3MHdzYSA9IHsKKwkubmFtZQkJCT0gInBsYXRmb3JtLWxjZCIsCisJLmRldi5wYXJlbnQJCT0gJnM1cF9kZXZpY2VfZmltZDAuZGV2LAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZvcmlnZW5fbGNkX2h2MDcwd3NhX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gb3JpZ2VuX2ZiX3dpbjAgPSB7CisJLndpbl9tb2RlID0geworCQkubGVmdF9tYXJnaW4JPSA2NCwKKwkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkudXBwZXJfbWFyZ2luCT0gNjQsCisJCS5sb3dlcl9tYXJnaW4JPSAxNiwKKwkJLmhzeW5jX2xlbgk9IDQ4LAorCQkudnN5bmNfbGVuCT0gMywKKwkJLnhyZXMJCT0gMTAyNCwKKwkJLnlyZXMJCT0gNjAwLAorCX0sCisJLm1heF9icHAJCT0gMzIsCisJLmRlZmF1bHRfYnBwCQk9IDI0LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgb3JpZ2VuX2xjZF9wZGF0YSBfX2luaXRkYXRhID0geworCS53aW5bMF0JCT0gJm9yaWdlbl9mYl93aW4wLAorCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiwKKwkudmlkY29uMQk9IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCisJLnNldHVwX2dwaW8JPSBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3JpZ2VuX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzAsCisJJnMzY19kZXZpY2VfaTJjMCwKKwkmczNjX2RldmljZV9ydGMsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzNXBfZGV2aWNlX2VoY2ksCisJJnM1cF9kZXZpY2VfZmltYzAsCisJJnM1cF9kZXZpY2VfZmltYzEsCisJJnM1cF9kZXZpY2VfZmltYzIsCisJJnM1cF9kZXZpY2VfZmltYzMsCisJJnM1cF9kZXZpY2VfZmltZDAsCisJJnM1cF9kZXZpY2VfaGRtaSwKKwkmczVwX2RldmljZV9pMmNfaGRtaXBoeSwKKwkmczVwX2RldmljZV9tZmMsCisJJnM1cF9kZXZpY2VfbWZjX2wsCisJJnM1cF9kZXZpY2VfbWZjX3IsCisJJnM1cF9kZXZpY2VfbWl4ZXIsCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9UVl0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0czRF0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDFdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9HUFNdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLAorCSZvcmlnZW5fZGV2aWNlX2dwaW9rZXlzLAorCSZvcmlnZW5fbGNkX2h2MDcwd3NhLAorfTsKKworLyogTENEIEJhY2tsaWdodCBkYXRhICovCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfYmxfZ3Bpb19pbmZvIG9yaWdlbl9ibF9ncGlvX2luZm8gPSB7CisJLm5vCQk9IEVYWU5PUzRfR1BEMCgwKSwKKwkuZnVuYwkJPSBTM0NfR1BJT19TRk4oMiksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBvcmlnZW5fYmxfZGF0YSA9IHsKKwkucHdtX2lkCQk9IDAsCisJLnB3bV9wZXJpb2RfbnMJPSAxMDAwLAorfTsKKworc3RhdGljIHZvaWQgczVwX3R2X3NldHVwKHZvaWQpCit7CisJLyogRGlyZWN0IEhQRCB0byBIRE1JIGNoaXAgKi8KKwlncGlvX3JlcXVlc3Rfb25lKEVYWU5PUzRfR1BYMyg3KSwgR1BJT0ZfSU4sICJocGQtcGx1ZyIpOworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1NGTigweDMpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMyg3KSwgUzNDX0dQSU9fUFVMTF9OT05FKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9yaWdlbl9tYXBfaW8odm9pZCkKK3sKKwlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMob3JpZ2VuX3VhcnRjZmdzLCBBUlJBWV9TSVpFKG9yaWdlbl91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3JpZ2VuX3Bvd2VyX2luaXQodm9pZCkKK3sKKwlncGlvX3JlcXVlc3QoRVhZTk9TNF9HUFgwKDQpLCAiUE1JQ19JUlEiKTsKKwlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgwKDQpLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDAoNCksIFMzQ19HUElPX1BVTExfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcmlnZW5fcmVzZXJ2ZSh2b2lkKQoreworCXM1cF9tZmNfcmVzZXJ2ZV9tZW0oMHg0MzAwMDAwMCwgOCA8PCAyMCwgMHg1MTAwMDAwMCwgOCA8PCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcmlnZW5fbWFjaGluZV9pbml0KHZvaWQpCit7CisJb3JpZ2VuX3Bvd2VyX2luaXQoKTsKKworCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBpMmMwX2RldnMsIEFSUkFZX1NJWkUoaTJjMF9kZXZzKSk7CisKKwkvKgorCSAqIFNpbmNlIHNkaGNpIGluc3RhbmNlIDIgY2FuIGNvbnRhaW4gYSBib290YWJsZSBtZWRpYSwKKwkgKiBzZGhjaSBpbnN0YW5jZSAwIGlzIHJlZ2lzdGVyZWQgYWZ0ZXIgaW5zdGFuY2UgMi4KKwkgKi8KKwlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmb3JpZ2VuX2hzbW1jMl9wZGF0YSk7CisJczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJm9yaWdlbl9oc21tYzBfcGRhdGEpOworCisJb3JpZ2VuX2VoY2lfaW5pdCgpOworCWNsa194dXNieHRpLnJhdGUgPSAyNDAwMDAwMDsKKworCXM1cF90dl9zZXR1cCgpOworCXM1cF9pMmNfaGRtaXBoeV9zZXRfcGxhdGRhdGEoTlVMTCk7CisKKwlzNXBfZmltZDBfc2V0X3BsYXRkYXRhKCZvcmlnZW5fbGNkX3BkYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG9yaWdlbl9kZXZpY2VzLCBBUlJBWV9TSVpFKG9yaWdlbl9kZXZpY2VzKSk7CisKKwlzNXBfZGV2aWNlX2ZpbWQwLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0uZGV2OworCisJczVwX2RldmljZV9oZG1pLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKKwlzNXBfZGV2aWNlX21peGVyLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLmRldjsKKworCXM1cF9kZXZpY2VfbWZjLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXS5kZXY7CisKKwlzYW1zdW5nX2JsX3NldCgmb3JpZ2VuX2JsX2dwaW9faW5mbywgJm9yaWdlbl9ibF9kYXRhKTsKK30KKworTUFDSElORV9TVEFSVChPUklHRU4sICJPUklHRU4iKQorCS8qIE1haW50YWluZXI6IEplb25nSHllb24gS2ltIDxqaGtpbUBpbnNpZ25hbC5jby5rcj4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gb3JpZ2VuX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gb3JpZ2VuX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCisJLnJlc2VydmUJPSAmb3JpZ2VuX3Jlc2VydmUsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1zbWRrNHgxMi5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC1zbWRrNHgxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLXNtZGs0eDEyLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrNHgxMi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8cGxhdC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01ESzRYMTJfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1RYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYRklGT19UT0kgfAlcCisJCQkJIFMzQzI0NDNfVUNPTl9SWEVSUl9JUlFFTikKKworI2RlZmluZSBTTURLNFgxMl9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKKworI2RlZmluZSBTTURLNFgxMl9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzQgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHNCkKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgc21kazR4MTJfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkJPSAwLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ESzRYMTJfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ESzRYMTJfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREs0WDEyX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJCT0gMSwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREs0WDEyX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREs0WDEyX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLNFgxMl9VRkNPTl9ERUZBVUxULAorCX0sCisJWzJdID0geworCQkuaHdwb3J0CQk9IDIsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBTTURLNFgxMl9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBTTURLNFgxMl9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gU01ESzRYMTJfVUZDT05fREVGQVVMVCwKKwl9LAorCVszXSA9IHsKKwkJLmh3cG9ydAkJPSAzLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ESzRYMTJfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ESzRYMTJfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREs0WDEyX1VGQ09OX0RFRkFVTFQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGs0eDEyX2hzbW1jMl9wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCisjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gyXzhCSVQKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGs0eDEyX2hzbW1jM19wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbWF4ODk5N19idWNrMSA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbWF4ODk5N19idWNrMiA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2ludCIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbWF4ODk5N19idWNrMyA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2czZCIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbWF4ODk5N19idWNrMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZERF9BUk1fU01ESzRYMTIiLAorCQkubWluX3VWCQk9IDkyNTAwMCwKKwkJLm1heF91VgkJPSAxMzUwMDAwLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZtYXg4OTk3X2J1Y2sxLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIG1heDg5OTdfYnVjazJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRERfSU5UX1NNREs0WDEyIiwKKwkJLm1pbl91VgkJPSA5NTAwMDAsCisJCS5tYXhfdVYJCT0gMTE1MDAwMCwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbWF4ODk5N19idWNrMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBtYXg4OTk3X2J1Y2szX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkREX0czRF9TTURLNFgxMiIsCisJCS5taW5fdVYJCT0gOTUwMDAwLAorCQkubWF4X3VWCQk9IDExNTAwMDAsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQkJICBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmbWF4ODk5N19idWNrMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4ODk5N19yZWd1bGF0b3JfZGF0YSBzbWRrNHgxMl9tYXg4OTk3X3JlZ3VsYXRvcnNbXSA9IHsKKwl7IE1BWDg5OTdfQlVDSzEsICZtYXg4OTk3X2J1Y2sxX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzIsICZtYXg4OTk3X2J1Y2syX2RhdGEgfSwKKwl7IE1BWDg5OTdfQlVDSzMsICZtYXg4OTk3X2J1Y2szX2RhdGEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhIHNtZGs0eDEyX21heDg5OTdfcGRhdGEgPSB7CisJLm51bV9yZWd1bGF0b3JzCT0gQVJSQVlfU0laRShzbWRrNHgxMl9tYXg4OTk3X3JlZ3VsYXRvcnMpLAorCS5yZWd1bGF0b3JzCT0gc21kazR4MTJfbWF4ODk5N19yZWd1bGF0b3JzLAorCisJLmJ1Y2sxX3ZvbHRhZ2VbMF0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbMV0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbMl0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbM10gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbNF0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbNV0gPSAxMTAwMDAwLAkvKiAxLjFWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbNl0gPSAxMDAwMDAwLAkvKiAxLjBWICovCisJLmJ1Y2sxX3ZvbHRhZ2VbN10gPSA5NTAwMDAsCS8qIDAuOTVWICovCisKKwkuYnVjazJfdm9sdGFnZVswXSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazJfdm9sdGFnZVsxXSA9IDEwMDAwMDAsCS8qIDEuMFYgKi8KKwkuYnVjazJfdm9sdGFnZVsyXSA9IDk1MDAwMCwJLyogMC45NVYgKi8KKwkuYnVjazJfdm9sdGFnZVszXSA9IDkwMDAwMCwJLyogMC45ViAqLworCS5idWNrMl92b2x0YWdlWzRdID0gMTEwMDAwMCwJLyogMS4xViAqLworCS5idWNrMl92b2x0YWdlWzVdID0gMTAwMDAwMCwJLyogMS4wViAqLworCS5idWNrMl92b2x0YWdlWzZdID0gOTUwMDAwLAkvKiAwLjk1ViAqLworCS5idWNrMl92b2x0YWdlWzddID0gOTAwMDAwLAkvKiAwLjlWICovCisKKwkuYnVjazVfdm9sdGFnZVswXSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVsxXSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVsyXSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVszXSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVs0XSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVs1XSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVs2XSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KKwkuYnVjazVfdm9sdGFnZVs3XSA9IDExMDAwMDAsCS8qIDEuMVYgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gc21kazR4MTJfaTJjX2RldnMwW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJtYXg4OTk3IiwgMHg2NiksCisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNtZGs0eDEyX21heDg5OTdfcGRhdGEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBzbWRrNHgxMl9pMmNfZGV2czFbXSBfX2luaXRkYXRhID0geworCXsgSTJDX0JPQVJEX0lORk8oIndtODk5NCIsIDB4MWEpLCB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIHNtZGs0eDEyX2kyY19kZXZzM1tdIF9faW5pdGRhdGEgPSB7CisJLyogbm90aGluZyBoZXJlIHlldCAqLworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBzbWRrNHgxMl9pMmNfZGV2czdbXSBfX2luaXRkYXRhID0geworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazR4MTJfYmxfZ3Bpb19pbmZvID0geworCS5ubyA9IEVYWU5PUzRfR1BEMCgxKSwKKwkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGs0eDEyX2JsX2RhdGEgPSB7CisJLnB3bV9pZCA9IDEsCisJLnB3bV9wZXJpb2RfbnMgID0gMTAwMCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBzbWRrNHgxMl9rZXltYXBbXSBfX2luaXRkYXRhID0geworCS8qIEtFWShyb3csIGNvbCwga2V5Y29kZSkgKi8KKwlLRVkoMSwgMCwgS0VZX0QpLCBLRVkoMSwgMSwgS0VZX0EpLCBLRVkoMSwgMiwgS0VZX0IpLAorCUtFWSgxLCAzLCBLRVlfRSksIEtFWSgxLCA0LCBLRVlfQykKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIHNtZGs0eDEyX2tleW1hcF9kYXRhIF9faW5pdGRhdGEgPSB7CisJLmtleW1hcAkJPSBzbWRrNHgxMl9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShzbWRrNHgxMl9rZXltYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSBzbWRrNHgxMl9rZXlwYWRfZGF0YSBfX2luaXRkYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZzbWRrNHgxMl9rZXltYXBfZGF0YSwKKwkucm93cwkJPSAyLAorCS5jb2xzCQk9IDUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21kazR4MTJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnMzY19kZXZpY2VfaHNtbWMyLAorCSZzM2NfZGV2aWNlX2hzbW1jMywKKwkmczNjX2RldmljZV9pMmMwLAorCSZzM2NfZGV2aWNlX2kyYzEsCisJJnMzY19kZXZpY2VfaTJjMywKKwkmczNjX2RldmljZV9pMmM3LAorCSZzM2NfZGV2aWNlX3J0YywKKwkmczNjX2RldmljZV93ZHQsCisJJnNhbXN1bmdfZGV2aWNlX2tleXBhZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrNHgxMl9tYXBfaW8odm9pZCkKK3sKKwljbGtfeHVzYnh0aS5yYXRlID0gMjQwMDAwMDA7CisKKwlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKGNsa194dXNieHRpLnJhdGUpOworCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrNHgxMl91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrNHgxMl91YXJ0Y2ZncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21kazR4MTJfbWFjaGluZV9pbml0KHZvaWQpCit7CisJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIHNtZGs0eDEyX2kyY19kZXZzMCwKKwkJCQlBUlJBWV9TSVpFKHNtZGs0eDEyX2kyY19kZXZzMCkpOworCisJczNjX2kyYzFfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIHNtZGs0eDEyX2kyY19kZXZzMSwKKwkJCQlBUlJBWV9TSVpFKHNtZGs0eDEyX2kyY19kZXZzMSkpOworCisJczNjX2kyYzNfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIHNtZGs0eDEyX2kyY19kZXZzMywKKwkJCQlBUlJBWV9TSVpFKHNtZGs0eDEyX2kyY19kZXZzMykpOworCisJczNjX2kyYzdfc2V0X3BsYXRkYXRhKE5VTEwpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDcsIHNtZGs0eDEyX2kyY19kZXZzNywKKwkJCQlBUlJBWV9TSVpFKHNtZGs0eDEyX2kyY19kZXZzNykpOworCisJc2Ftc3VuZ19ibF9zZXQoJnNtZGs0eDEyX2JsX2dwaW9faW5mbywgJnNtZGs0eDEyX2JsX2RhdGEpOworCisJc2Ftc3VuZ19rZXlwYWRfc2V0X3BsYXRkYXRhKCZzbWRrNHgxMl9rZXlwYWRfZGF0YSk7CisKKwlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmc21kazR4MTJfaHNtbWMyX3BkYXRhKTsKKwlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmc21kazR4MTJfaHNtbWMzX3BkYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGs0eDEyX2RldmljZXMsIEFSUkFZX1NJWkUoc21kazR4MTJfZGV2aWNlcykpOworfQorCitNQUNISU5FX1NUQVJUKFNNREs0MjEyLCAiU01ESzQyMTIiKQorCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gc21kazR4MTJfbWFwX2lvLAorCS5pbml0X21hY2hpbmUJPSBzbWRrNHgxMl9tYWNoaW5lX2luaXQsCisJLnRpbWVyCQk9ICZleHlub3M0X3RpbWVyLAorTUFDSElORV9FTkQKKworTUFDSElORV9TVEFSVChTTURLNDQxMiwgIlNNREs0NDEyIikKKwkvKiBNYWludGFpbmVyOiBLdWtqaW4gS2ltIDxrZ2VuZS5raW1Ac2Ftc3VuZy5jb20+ICovCisJLyogTWFpbnRhaW5lcjogQ2hhbmdod2FuIFlvdW4gPGNoYW9zLnlvdW5Ac2Ftc3VuZy5jb20+ICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLmluaXRfaXJxCT0gZXh5bm9zNF9pbml0X2lycSwKKwkubWFwX2lvCQk9IHNtZGs0eDEyX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gc21kazR4MTJfbWFjaGluZV9pbml0LAorCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLXNtZGt2MzEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLXNtZGt2MzEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjMmFmYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21hY2gtc21ka3YzMTAuYwpAQCAtMCwwICsxLDM5MCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CisjaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+CisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLmg+CisjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KKyNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L3BkLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9tZmMuaD4KKyNpbmNsdWRlIDxwbGF0L2VoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01ES1YzMTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1RYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYSVJRTU9ERSB8CVwKKwkJCQkgUzNDMjQxMF9VQ09OX1JYRklGT19UT0kgfAlcCisJCQkJIFMzQzI0NDNfVUNPTl9SWEVSUl9JUlFFTikKKworI2RlZmluZSBTTURLVjMxMF9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKKworI2RlZmluZSBTTURLVjMxMF9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzQgfAlcCisJCQkJIFM1UFYyMTBfVUZDT05fUlhUUklHNCkKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgc21ka3YzMTBfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkJPSAwLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCisJfSwKKwlbMV0gPSB7CisJCS5od3BvcnQJCT0gMSwKKwkJLmZsYWdzCQk9IDAsCisJCS51Y29uCQk9IFNNREtWMzEwX1VDT05fREVGQVVMVCwKKwkJLnVsY29uCQk9IFNNREtWMzEwX1VMQ09OX0RFRkFVTFQsCisJCS51ZmNvbgkJPSBTTURLVjMxMF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzJdID0geworCQkuaHdwb3J0CQk9IDIsCisJCS5mbGFncwkJPSAwLAorCQkudWNvbgkJPSBTTURLVjMxMF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBTTURLVjMxMF9VTENPTl9ERUZBVUxULAorCQkudWZjb24JCT0gU01ES1YzMTBfVUZDT05fREVGQVVMVCwKKwl9LAorCVszXSA9IHsKKwkJLmh3cG9ydAkJPSAzLAorCQkuZmxhZ3MJCT0gMCwKKwkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAorCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMF9wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9JTlRFUk5BTCwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCisjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKKwkubWF4X3dpZHRoCQk9IDgsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHNtZGt2MzEwX2hzbW1jMV9wZGF0YSBfX2luaXRkYXRhID0geworCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAorCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQSzAoMiksCisJLmV4dF9jZF9ncGlvX2ludmVydAk9IDEsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAorCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKKyNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDJfOEJJVAorCS5tYXhfd2lkdGgJCT0gOCwKKwkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMzX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCisJLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMigyKSwKKwkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCitzdGF0aWMgdm9pZCBsY2RfbHRlNDgwd3Zfc2V0X3Bvd2VyKHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgcG93ZXIpCit7CisJaWYgKHBvd2VyKSB7CisjaWYgIWRlZmluZWQoQ09ORklHX0JBQ0tMSUdIVF9QV00pCisJCWdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEQwKDEpLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiR1BEMCIpOworCQlncGlvX2ZyZWUoRVhZTk9TNF9HUEQwKDEpKTsKKyNlbmRpZgorCQkvKiBmaXJlIG5SRVNFVCBvbiBwb3dlciB1cCAqLworCQlncGlvX3JlcXVlc3QoRVhZTk9TNF9HUFgwKDYpLCAiR1BYMCIpOworCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChFWFlOT1M0X0dQWDAoNiksIDEpOworCQltZGVsYXkoMTAwKTsKKworCQlncGlvX3NldF92YWx1ZShFWFlOT1M0X0dQWDAoNiksIDApOworCQltZGVsYXkoMTApOworCisJCWdwaW9fc2V0X3ZhbHVlKEVYWU5PUzRfR1BYMCg2KSwgMSk7CisJCW1kZWxheSgxMCk7CisKKwkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BYMCg2KSk7CisJfSBlbHNlIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfQkFDS0xJR0hUX1BXTSkKKwkJZ3Bpb19yZXF1ZXN0X29uZShFWFlOT1M0X0dQRDAoMSksIEdQSU9GX09VVF9JTklUX0xPVywgIkdQRDAiKTsKKwkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BEMCgxKSk7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBzbWRrdjMxMF9sY2RfbHRlNDgwd3ZfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCQk9IGxjZF9sdGU0ODB3dl9zZXRfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrdjMxMF9sY2RfbHRlNDgwd3YgPSB7CisJLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAorCS5kZXYucGFyZW50CQk9ICZzNXBfZGV2aWNlX2ZpbWQwLmRldiwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmc21ka3YzMTBfbGNkX2x0ZTQ4MHd2X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gc21ka3YzMTBfZmJfd2luMCA9IHsKKwkud2luX21vZGUgPSB7CisJCS5sZWZ0X21hcmdpbgk9IDEzLAorCQkucmlnaHRfbWFyZ2luCT0gOCwKKwkJLnVwcGVyX21hcmdpbgk9IDcsCisJCS5sb3dlcl9tYXJnaW4JPSA1LAorCQkuaHN5bmNfbGVuCT0gMywKKwkJLnZzeW5jX2xlbgk9IDEsCisJCS54cmVzCQk9IDgwMCwKKwkJLnlyZXMJCT0gNDgwLAorCX0sCisJLm1heF9icHAJCT0gMzIsCisJLmRlZmF1bHRfYnBwCQk9IDI0LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgc21ka3YzMTBfbGNkMF9wZGF0YSBfX2luaXRkYXRhID0geworCS53aW5bMF0JCT0gJnNtZGt2MzEwX2ZiX3dpbjAsCisJLnZpZGNvbjAJPSBWSURDT04wX1ZJRE9VVF9SR0IgfCBWSURDT04wX1BOUk1PREVfUkdCLAorCS52aWRjb24xCT0gVklEQ09OMV9JTlZfSFNZTkMgfCBWSURDT04xX0lOVl9WU1lOQywKKwkuc2V0dXBfZ3Bpbwk9IGV4eW5vczRfZmltZDBfZ3Bpb19zZXR1cF8yNGJwcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSwKKwkJLmVuZAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDEpICsgU1pfNjRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9FSU5UKDUpLAorCQkuZW5kCT0gSVJRX0VJTlQoNSksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSVJRRl9UUklHR0VSX0xPVywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMTVfY29uZmlnID0geworCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0xPVywKKwkuaXJxX3R5cGUJPSBTTVNDOTExWF9JUlFfVFlQRV9QVVNIX1BVTEwsCisJLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8xNkJJVCB8IFNNU0M5MTFYX0ZPUkNFX0lOVEVSTkFMX1BIWSwKKwkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCisJLm1hYwkJPSB7MHgwMCwgMHg4MCwgMHgwMCwgMHgyMywgMHg0NSwgMHg2N30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrdjMxMF9zbXNjOTExeCA9IHsKKwkubmFtZQkJPSAic21zYzkxMXgiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzbWRrdjMxMF9zbXNjOTExeF9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNtc2M5MjE1X2NvbmZpZywKKwl9LAorfTsKKworc3RhdGljIHVpbnQzMl90IHNtZGt2MzEwX2tleW1hcFtdIF9faW5pdGRhdGEgPSB7CisJLyogS0VZKHJvdywgY29sLCBrZXljb2RlKSAqLworCUtFWSgwLCAzLCBLRVlfMSksIEtFWSgwLCA0LCBLRVlfMiksIEtFWSgwLCA1LCBLRVlfMyksCisJS0VZKDAsIDYsIEtFWV80KSwgS0VZKDAsIDcsIEtFWV81KSwKKwlLRVkoMSwgMywgS0VZX0EpLCBLRVkoMSwgNCwgS0VZX0IpLCBLRVkoMSwgNSwgS0VZX0MpLAorCUtFWSgxLCA2LCBLRVlfRCksIEtFWSgxLCA3LCBLRVlfRSkKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIHNtZGt2MzEwX2tleW1hcF9kYXRhIF9faW5pdGRhdGEgPSB7CisJLmtleW1hcAkJPSBzbWRrdjMxMF9rZXltYXAsCisJLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShzbWRrdjMxMF9rZXltYXApLAorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSBzbWRrdjMxMF9rZXlwYWRfZGF0YSBfX2luaXRkYXRhID0geworCS5rZXltYXBfZGF0YQk9ICZzbWRrdjMxMF9rZXltYXBfZGF0YSwKKwkucm93cwkJPSAyLAorCS5jb2xzCQk9IDgsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyY19kZXZzMVtdIF9faW5pdGRhdGEgPSB7CisJe0kyQ19CT0FSRF9JTkZPKCJ3bTg5OTQiLCAweDFhKSx9LAorfTsKKworLyogVVNCIEVIQ0kgKi8KK3N0YXRpYyBzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgc21ka3YzMTBfZWhjaV9wZGF0YTsKKworc3RhdGljIHZvaWQgX19pbml0IHNtZGt2MzEwX2VoY2lfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGRhdGEgPSAmc21ka3YzMTBfZWhjaV9wZGF0YTsKKworCXM1cF9laGNpX3NldF9wbGF0ZGF0YShwZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrdjMxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmczNjX2RldmljZV9oc21tYzAsCisJJnMzY19kZXZpY2VfaHNtbWMxLAorCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzMsCisJJnMzY19kZXZpY2VfaTJjMSwKKwkmczVwX2RldmljZV9pMmNfaGRtaXBoeSwKKwkmczNjX2RldmljZV9ydGMsCisJJnMzY19kZXZpY2Vfd2R0LAorCSZzNXBfZGV2aWNlX2VoY2ksCisJJnM1cF9kZXZpY2VfZmltYzAsCisJJnM1cF9kZXZpY2VfZmltYzEsCisJJnM1cF9kZXZpY2VfZmltYzIsCisJJnM1cF9kZXZpY2VfZmltYzMsCisJJmV4eW5vczRfZGV2aWNlX2FjOTcsCisJJmV4eW5vczRfZGV2aWNlX2kyczAsCisJJnNhbXN1bmdfZGV2aWNlX2tleXBhZCwKKwkmczVwX2RldmljZV9tZmMsCisJJnM1cF9kZXZpY2VfbWZjX2wsCisJJnM1cF9kZXZpY2VfbWZjX3IsCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0czRF0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDBdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QxXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLAorCSZleHlub3M0X2RldmljZV9wZFtQRF9HUFNdLAorCSZleHlub3M0X2RldmljZV9zcGRpZiwKKwkmZXh5bm9zNF9kZXZpY2Vfc3lzbW11LAorCSZzYW1zdW5nX2Fzb2NfZG1hLAorCSZzYW1zdW5nX2Fzb2NfaWRtYSwKKwkmczVwX2RldmljZV9maW1kMCwKKwkmc21ka3YzMTBfbGNkX2x0ZTQ4MHd2LAorCSZzbWRrdjMxMF9zbXNjOTExeCwKKwkmZXh5bm9zNF9kZXZpY2VfYWhjaSwKKwkmczVwX2RldmljZV9oZG1pLAorCSZzNXBfZGV2aWNlX21peGVyLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHNtZGt2MzEwX3Ntc2M5MTF4X2luaXQodm9pZCkKK3sKKwl1MzIgY3MxOworCisJLyogY29uZmlndXJlIG5DUzEgd2lkdGggdG8gMTYgYml0cyAqLworCWNzMSA9IF9fcmF3X3JlYWRsKFM1UF9TUk9NX0JXKSAmCisJCX4oUzVQX1NST01fQldfX0NTX01BU0sgPDwgUzVQX1NST01fQldfX05DUzFfX1NISUZUKTsKKwljczEgfD0gKCgxIDw8IFM1UF9TUk9NX0JXX19EQVRBV0lEVEhfX1NISUZUKSB8CisJCSgxIDw8IFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVCkgfAorCQkoMSA8PCBTNVBfU1JPTV9CV19fQllURUVOQUJMRV9fU0hJRlQpKSA8PAorCQlTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQ7CisJX19yYXdfd3JpdGVsKGNzMSwgUzVQX1NST01fQlcpOworCisJLyogc2V0IHRpbWluZyBmb3IgbkNTMSBzdWl0YWJsZSBmb3IgZXRoZXJuZXQgY2hpcCAqLworCV9fcmF3X3dyaXRlbCgoMHgxIDw8IFM1UF9TUk9NX0JDWF9fUE1DX19TSElGVCkgfAorCQkgICAgICgweDkgPDwgUzVQX1NST01fQkNYX19UQUNQX19TSElGVCkgfAorCQkgICAgICgweGMgPDwgUzVQX1NST01fQkNYX19UQ0FIX19TSElGVCkgfAorCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09IX19TSElGVCkgfAorCQkgICAgICgweDYgPDwgUzVQX1NST01fQkNYX19UQUNDX19TSElGVCkgfAorCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09TX19TSElGVCkgfAorCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQUNTX19TSElGVCksIFM1UF9TUk9NX0JDMSk7Cit9CisKKy8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrdjMxMF9ibF9ncGlvX2luZm8gPSB7CisJLm5vID0gRVhZTk9TNF9HUEQwKDEpLAorCS5mdW5jID0gUzNDX0dQSU9fU0ZOKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka3YzMTBfYmxfZGF0YSA9IHsKKwkucHdtX2lkID0gMSwKKwkucHdtX3BlcmlvZF9ucyAgPSAxMDAwLAorfTsKKworc3RhdGljIHZvaWQgczVwX3R2X3NldHVwKHZvaWQpCit7CisJLyogZGlyZWN0IEhQRCB0byBIRE1JIGNoaXAgKi8KKwlXQVJOX09OKGdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUFgzKDcpLCBHUElPRl9JTiwgImhwZC1wbHVnIikpOworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1NGTigweDMpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMyg3KSwgUzNDX0dQSU9fUFVMTF9OT05FKTsKKworCS8qIHNldHVwIGRlcGVuZGVuY2llcyBiZXR3ZWVuIFRWIGRldmljZXMgKi8KKwlzNXBfZGV2aWNlX2hkbWkuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9UVl0uZGV2OworCXM1cF9kZXZpY2VfbWl4ZXIuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9UVl0uZGV2OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21ka3YzMTBfbWFwX2lvKHZvaWQpCit7CisJczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7CisJczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7CisJczNjMjR4eF9pbml0X3VhcnRzKHNtZGt2MzEwX3VhcnRjZmdzLCBBUlJBWV9TSVpFKHNtZGt2MzEwX3VhcnRjZmdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9yZXNlcnZlKHZvaWQpCit7CisJczVwX21mY19yZXNlcnZlX21lbSgweDQzMDAwMDAwLCA4IDw8IDIwLCAweDUxMDAwMDAwLCA4IDw8IDIwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNtZGt2MzEwX21hY2hpbmVfaW5pdCh2b2lkKQoreworCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmNfZGV2czEsIEFSUkFZX1NJWkUoaTJjX2RldnMxKSk7CisKKwlzbWRrdjMxMF9zbXNjOTExeF9pbml0KCk7CisKKwlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMwX3BkYXRhKTsKKwlzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMxX3BkYXRhKTsKKwlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMyX3BkYXRhKTsKKwlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMzX3BkYXRhKTsKKworCXM1cF90dl9zZXR1cCgpOworCXM1cF9pMmNfaGRtaXBoeV9zZXRfcGxhdGRhdGEoTlVMTCk7CisKKwlzYW1zdW5nX2tleXBhZF9zZXRfcGxhdGRhdGEoJnNtZGt2MzEwX2tleXBhZF9kYXRhKTsKKworCXNhbXN1bmdfYmxfc2V0KCZzbWRrdjMxMF9ibF9ncGlvX2luZm8sICZzbWRrdjMxMF9ibF9kYXRhKTsKKwlzNXBfZmltZDBfc2V0X3BsYXRkYXRhKCZzbWRrdjMxMF9sY2QwX3BkYXRhKTsKKworCXNtZGt2MzEwX2VoY2lfaW5pdCgpOworCWNsa194dXNieHRpLnJhdGUgPSAyNDAwMDAwMDsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNtZGt2MzEwX2RldmljZXMsIEFSUkFZX1NJWkUoc21ka3YzMTBfZGV2aWNlcykpOworCXM1cF9kZXZpY2VfbWZjLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXS5kZXY7Cit9CisKK01BQ0hJTkVfU1RBUlQoU01ES1YzMTAsICJTTURLVjMxMCIpCisJLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLworCS8qIE1haW50YWluZXI6IENoYW5naHdhbiBZb3VuIDxjaGFvcy55b3VuQHNhbXN1bmcuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBzbWRrdjMxMF9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHNtZGt2MzEwX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCisJLnJlc2VydmUJPSAmc21ka3YzMTBfcmVzZXJ2ZSwKK01BQ0hJTkVfRU5ECisKK01BQ0hJTkVfU1RBUlQoU01ES0MyMTAsICJTTURLQzIxMCIpCisJLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLworCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBzbWRrdjMxMF9tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHNtZGt2MzEwX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC11bml2ZXJzYWxfYzIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWFjaC11bml2ZXJzYWxfYzIxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTE3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9tYWNoLXVuaXZlcnNhbF9jMjEwLmMKQEAgLTAsMCArMSwxMDY0IEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC11bml2ZXJzYWxfYzIxMC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTguaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYXg4OTUyLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9tY3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvYXRtZWxfbXh0X3RzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvaWljLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L21mYy5oPgorI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KKyNpbmNsdWRlIDxwbGF0L3BkLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CisjaW5jbHVkZSA8cGxhdC9maW1jLWNvcmUuaD4KKyNpbmNsdWRlIDxwbGF0L2NhbXBvcnQuaD4KKyNpbmNsdWRlIDxwbGF0L21pcGlfY3Npcy5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zNXBfZmltYy5oPgorI2luY2x1ZGUgPG1lZGlhL201bW9scy5oPgorCisvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVU5JVkVSU0FMX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAorCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCisJCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAorCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCisKKyNkZWZpbmUgVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAorCisjZGVmaW5lIFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAorCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzI1NiB8CVwKKwkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUcyNTYpCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHVuaXZlcnNhbF91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7CisJWzBdID0geworCQkuaHdwb3J0CQk9IDAsCisJCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CQk9IDEsCisJCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzJdID0geworCQkuaHdwb3J0CQk9IDIsCisJCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAorCX0sCisJWzNdID0geworCQkuaHdwb3J0CQk9IDMsCisJCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCisJCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKKwkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbWF4ODk1Ml9jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfbWF4ODk1Ml9wZGF0YSBfX2luaXRkYXRhID0geworCS5ncGlvX3ZpZDAJPSBFWFlOT1M0X0dQWDAoMyksCisJLmdwaW9fdmlkMQk9IEVYWU5PUzRfR1BYMCg0KSwKKwkuZ3Bpb19lbgk9IC0xLCAvKiBOb3QgY29udHJvbGxhYmxlLCBzZXQgIkFsd2F5cyBIaWdoIiAqLworCS5kZWZhdWx0X21vZGUJPSAwLCAvKiB2aWQwID0gMCwgdmlkMSA9IDAgKi8KKwkuZHZzX21vZGUJPSB7IDQ4LCAzMiwgMjgsIDE4IH0sIC8qIDEuMjUsIDEuMjAsIDEuMDUsIDAuOTVWICovCisJLnN5bmNfZnJlcQk9IDAsIC8qIGRlZmF1bHQ6IGZhc3Rlc3QgKi8KKwkucmFtcF9zcGVlZAk9IDAsIC8qIGRlZmF1bHQ6IGZhc3Rlc3QgKi8KKworCS5yZWdfZGF0YQk9IHsKKwkJLmNvbnN0cmFpbnRzCT0geworCQkJLm5hbWUJCT0gIlZBUk1fMS4yViIsCisJCQkubWluX3VWCQk9IDc3MDAwMCwKKwkJCS5tYXhfdVYJCT0gMTQwMDAwMCwKKwkJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKKwkJCS5hbHdheXNfb24JPSAxLAorCQkJLmJvb3Rfb24JPSAxLAorCQl9LAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm1heDg5NTJfY29uc3VtZXIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfYnVjazFfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9pbnQiLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9idWNrMl9jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkZzNkIiwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfYnVjazNfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZkZXQiLCAiczVwLXNkbyIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2sxX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVklOVF8xLjFWIiwKKwkJLm1pbl91VgkJPSA3NTAwMDAsCisJCS5tYXhfdVYJCT0gMTUwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYm9vdF9vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gJmxwMzk3NF9idWNrMV9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWRzNEXzEuMVYiLAorCQkubWluX3VWCQk9IDc1MDAwMCwKKwkJLm1heF91VgkJPSAxNTAwMDAwLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAorCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5ib290X29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSAmbHAzOTc0X2J1Y2syX2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9idWNrM19kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZDQ18xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS5hbHdheXNfb24JPSAxLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gJmxwMzk3NF9idWNrM19jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWTUVNXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5hcHBseV91Vgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzJfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWQUxJVkVfMS4yViIsCisJCS5taW5fdVYJCT0gMTIwMDAwMCwKKwkJLm1heF91VgkJPSAxMjAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9sZG8zX2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgImV4eW5vczQtaGRtaSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9wbGwiLCAiZXh5bm9zNC1oZG1pIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkMTEiLCAiczVwLW1pcGktY3Npcy4wIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWVVNCK01JUElfMS4xViIsCisJCS5taW5fdVYJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJPSAxMTAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShscDM5NzRfbGRvM19jb25zdW1lciksCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gbHAzOTc0X2xkbzNfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzRfY29uc3VtZXJbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfb3NjIiwgImV4eW5vczQtaGRtaSIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG80X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkFEQ18zLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGxwMzk3NF9sZG80X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBscDM5NzRfbGRvNF9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvNV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlZURl8yLjhWIiwKKwkJLm1pbl91VgkJPSAyODAwMDAwLAorCQkubWF4X3VWCQk9IDI4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG82X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiTERPNiIsCisJCS5taW5fdVYJCT0gMjAwMDAwMCwKKwkJLm1heF91VgkJPSAyMDAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfbGRvN19jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDE4IiwgInM1cC1taXBpLWNzaXMuMCIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG83X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkxDRCtWTUlQSV8xLjhWIiwKKwkJLm1pbl91VgkJPSAxODAwMDAwLAorCQkubWF4X3VWCQk9IDE4MDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxwMzk3NF9sZG83X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBscDM5NzRfbGRvN19jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfbGRvOF9jb25zdW1lcltdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZDMzYV9kYWMiLCAiczVwLXNkbyIpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG84X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVlVTQitWREFDXzMuM1YiLAorCQkubWluX3VWCQk9IDMzMDAwMDAsCisJCS5tYXhfdVYJCT0gMzMwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobHAzOTc0X2xkbzhfY29uc3VtZXIpLAorCS5jb25zdW1lcl9zdXBwbGllcyA9IGxwMzk3NF9sZG84X2NvbnN1bWVyLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG85X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLmFsd2F5c19vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTBfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWUExMXzEuMVYiLAorCQkubWluX3VWCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCT0gMTEwMDAwMCwKKwkJLmJvb3Rfb24JPSAxLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfbGRvMTFfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18yOCIsICIwLTAwMWYiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xMV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIkNBTV9BRl8zLjNWIiwKKwkJLm1pbl91VgkJPSAzMzAwMDAwLAorCQkubWF4X3VWCQk9IDMzMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZscDM5NzRfbGRvMTFfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEyX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiUFNfMi44ViIsCisJCS5taW5fdVYJCT0gMjgwMDAwMCwKKwkJLm1heF91VgkJPSAyODAwMDAwLAorCQkuYXBwbHlfdVYJPSAxLAorCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWSElDXzEuMlYiLAorCQkubWluX3VWCQk9IDEyMDAwMDAsCisJCS5tYXhfdVYJCT0gMTIwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzE0X2NvbnN1bWVyID0KKwlSRUdVTEFUT1JfU1VQUExZKCJkaWdfMTgiLCAiMC0wMDFmIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJDQU1fSV9IT1NUXzEuOFYiLAorCQkubWluX3VWCQk9IDE4MDAwMDAsCisJCS5tYXhfdVYJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJmxwMzk3NF9sZG8xNF9jb25zdW1lciwKK307CisKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9sZG8xNV9jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgiZGlnXzEyIiwgIjAtMDAxZiIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE1X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX1NfRElHK0ZNMzNfQ09SRV8xLjJWIiwKKwkJLm1pbl91VgkJPSAxMjAwMDAwLAorCQkubWF4X3VWCQk9IDEyMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmRpc2FibGVkCT0gMSwKKwkJfSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZscDM5NzRfbGRvMTVfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbHAzOTc0X2xkbzE2X2NvbnN1bWVyW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiYV9zZW5zb3IiLCAiMC0wMDFmIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE2X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiQ0FNX1NfQU5BXzIuOFYiLAorCQkubWluX3VWCQk9IDI4MDAwMDAsCisJCS5tYXhfdVYJCT0gMjgwMDAwMCwKKwkJLmFwcGx5X3VWCT0gMSwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobHAzOTc0X2xkbzE2X2NvbnN1bWVyKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBscDM5NzRfbGRvMTZfY29uc3VtZXIsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE3X2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiVkNDXzMuMFZfTENEIiwKKwkJLm1pbl91VgkJPSAzMDAwMDAwLAorCQkubWF4X3VWCQk9IDMwMDAwMDAsCisJCS5hcHBseV91Vgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuYm9vdF9vbgk9IDEsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0XzMya2h6X2FwX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiMzJLSHogQVAiLAorCQkuYWx3YXlzX29uCT0gMSwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5lbmFibGVkCT0gMSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF8zMmtoel9jcF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIjMyS0h6IENQIiwKKwkJLnN0YXRlX21lbQk9IHsKKwkJCS5kaXNhYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfdmljaGdfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJPSB7CisJCS5uYW1lCQk9ICJWSUNIRyIsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZGlzYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2VzYWZlb3V0MV9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJCT0gIlNBRkVPVVQxIiwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCS5zdGF0ZV9tZW0JPSB7CisJCQkuZW5hYmxlZAk9IDEsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfZXNhZmVvdXQyX2RhdGEgPSB7CisJLmNvbnN0cmFpbnRzCT0geworCQkubmFtZQkJPSAiU0FGRU9VVDIiLAorCQkuYm9vdF9vbgk9IDEsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQkuc3RhdGVfbWVtCT0geworCQkJLmVuYWJsZWQJPSAxLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OThfcmVndWxhdG9yX2RhdGEgbHAzOTc0X3JlZ3VsYXRvcnNbXSA9IHsKKwl7IE1BWDg5OThfTERPMiwgICZscDM5NzRfbGRvMl9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzMsICAmbHAzOTc0X2xkbzNfZGF0YSB9LAorCXsgTUFYODk5OF9MRE80LCAgJmxwMzk3NF9sZG80X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPNSwgICZscDM5NzRfbGRvNV9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzYsICAmbHAzOTc0X2xkbzZfZGF0YSB9LAorCXsgTUFYODk5OF9MRE83LCAgJmxwMzk3NF9sZG83X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPOCwgICZscDM5NzRfbGRvOF9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzksICAmbHAzOTc0X2xkbzlfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xMCwgJmxwMzk3NF9sZG8xMF9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzExLCAmbHAzOTc0X2xkbzExX2RhdGEgfSwKKwl7IE1BWDg5OThfTERPMTIsICZscDM5NzRfbGRvMTJfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xMywgJmxwMzk3NF9sZG8xM19kYXRhIH0sCisJeyBNQVg4OTk4X0xETzE0LCAmbHAzOTc0X2xkbzE0X2RhdGEgfSwKKwl7IE1BWDg5OThfTERPMTUsICZscDM5NzRfbGRvMTVfZGF0YSB9LAorCXsgTUFYODk5OF9MRE8xNiwgJmxwMzk3NF9sZG8xNl9kYXRhIH0sCisJeyBNQVg4OTk4X0xETzE3LCAmbHAzOTc0X2xkbzE3X2RhdGEgfSwKKwl7IE1BWDg5OThfQlVDSzEsICZscDM5NzRfYnVjazFfZGF0YSB9LAorCXsgTUFYODk5OF9CVUNLMiwgJmxwMzk3NF9idWNrMl9kYXRhIH0sCisJeyBNQVg4OTk4X0JVQ0szLCAmbHAzOTc0X2J1Y2szX2RhdGEgfSwKKwl7IE1BWDg5OThfQlVDSzQsICZscDM5NzRfYnVjazRfZGF0YSB9LAorCXsgTUFYODk5OF9FTjMyS0haX0FQLCAmbHAzOTc0XzMya2h6X2FwX2RhdGEgfSwKKwl7IE1BWDg5OThfRU4zMktIWl9DUCwgJmxwMzk3NF8zMmtoel9jcF9kYXRhIH0sCisJeyBNQVg4OTk4X0VOVklDSEcsICZscDM5NzRfdmljaGdfZGF0YSB9LAorCXsgTUFYODk5OF9FU0FGRU9VVDEsICZscDM5NzRfZXNhZmVvdXQxX2RhdGEgfSwKKwl7IE1BWDg5OThfRVNBRkVPVVQyLCAmbHAzOTc0X2VzYWZlb3V0Ml9kYXRhIH0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfbHAzOTc0X3BkYXRhID0geworCS5udW1fcmVndWxhdG9ycwkJPSBBUlJBWV9TSVpFKGxwMzk3NF9yZWd1bGF0b3JzKSwKKwkucmVndWxhdG9ycwkJPSBscDM5NzRfcmVndWxhdG9ycywKKwkuYnVjazFfdm9sdGFnZTEJCT0gMTEwMDAwMCwJLyogSU5UICovCisJLmJ1Y2sxX3ZvbHRhZ2UyCQk9IDEwMDAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2UzCQk9IDExMDAwMDAsCisJLmJ1Y2sxX3ZvbHRhZ2U0CQk9IDEwMDAwMDAsCisJLmJ1Y2sxX3NldDEJCT0gRVhZTk9TNF9HUFgwKDUpLAorCS5idWNrMV9zZXQyCQk9IEVYWU5PUzRfR1BYMCg2KSwKKwkuYnVjazJfdm9sdGFnZTEJCT0gMTIwMDAwMCwJLyogRzNEICovCisJLmJ1Y2syX3ZvbHRhZ2UyCQk9IDExMDAwMDAsCisJLmJ1Y2sxX2RlZmF1bHRfaWR4CT0gMCwKKwkuYnVjazJfc2V0MwkJPSBFWFlOT1M0X0dQRTIoMCksCisJLmJ1Y2syX2RlZmF1bHRfaWR4CT0gMCwKKwkud2FrZXVwCQkJPSB0cnVlLAorfTsKKworCitlbnVtIGZpeGVkX3JlZ3VsYXRvcl9pZCB7CisJRklYRURfUkVHX0lEX01NQzAsCisJRklYRURfUkVHX0lEX0hETUlfNVYsCisJRklYRURfUkVHX0lEX0NBTV9TX0lGLAorCUZJWEVEX1JFR19JRF9DQU1fSV9DT1JFLAorCUZJWEVEX1JFR19JRF9DQU1fVlRfRElPLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGhkbWlfZml4ZWRfY29uc3VtZXIgPQorCVJFR1VMQVRPUl9TVVBQTFkoImhkbWktZW4iLCAiZXh5bm9zNC1oZG1pIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBoZG1pX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhID0geworCS5jb25zdHJhaW50cwkJPSB7CisJCS5uYW1lCQk9ICJIRE1JXzVWIiwKKwkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmaGRtaV9maXhlZF9jb25zdW1lciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgaGRtaV9maXhlZF92b2x0YWdlX2NvbmZpZyA9IHsKKwkuc3VwcGx5X25hbWUJCT0gIkhETUlfRU4xIiwKKwkubWljcm92b2x0cwkJPSA1MDAwMDAwLAorCS5ncGlvCQkJPSBFWFlOT1M0X0dQRTAoMSksCisJLmVuYWJsZV9oaWdoCQk9IHRydWUsCisJLmluaXRfZGF0YQkJPSAmaGRtaV9maXhlZF92b2x0YWdlX2luaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhkbWlfZml4ZWRfdm9sdGFnZSA9IHsKKwkubmFtZQkJCT0gInJlZy1maXhlZC12b2x0YWdlIiwKKwkuaWQJCQk9IEZJWEVEX1JFR19JRF9IRE1JXzVWLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaGRtaV9maXhlZF92b2x0YWdlX2NvbmZpZywKKwl9LAorfTsKKworLyogR1BJTyBJMkMgNSAoUE1JQykgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjNV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJtYXg4OTUyIiwgMHhDMCA+PiAxKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX21heDg5NTJfcGRhdGEsCisJfSwgeworCQlJMkNfQk9BUkRfSU5GTygibHAzOTc0IiwgMHhDQyA+PiAxKSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdW5pdmVyc2FsX2xwMzk3NF9wZGF0YSwKKwl9LAorfTsKKworLyogSTJDMyAoVFNQKSAqLworc3RhdGljIHN0cnVjdCBteHRfcGxhdGZvcm1fZGF0YSBxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhID0geworCS54X2xpbmUJCT0gMTksCisJLnlfbGluZQkJPSAxMSwKKwkueF9zaXplCQk9IDgwMCwKKwkueV9zaXplCQk9IDQ4MCwKKwkuYmxlbgkJPSAweDExLAorCS50aHJlc2hvbGQJPSAweDI4LAorCS52b2x0YWdlCT0gMjgwMDAwMCwJCS8qIDIuOFYgKi8KKwkub3JpZW50CQk9IE1YVF9ESUFHT05BTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjM19kZXZzW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJxdDYwMjI0MF90cyIsIDB4NGEpLAorCQkucGxhdGZvcm1fZGF0YSA9ICZxdDYwMjI0MF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3RzcF9pbml0KHZvaWQpCit7CisJaW50IGdwaW87CisKKwkvKiBUU1BfTERPX09OOiBYTURNQUREUl8xMSAqLworCWdwaW8gPSBFWFlOT1M0X0dQRTIoMyk7CisJZ3Bpb19yZXF1ZXN0KGdwaW8sICJUU1BfTERPX09OIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOworCWdwaW9fZXhwb3J0KGdwaW8sIDApOworCisJLyogVFNQX0lOVDogWE1ETUFERFJfNyAqLworCWdwaW8gPSBFWFlOT1M0X0dQRTEoNyk7CisJZ3Bpb19yZXF1ZXN0KGdwaW8sICJUU1BfSU5UIik7CisKKwlzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoZ3Bpbyk7CisJczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfVVApOworCWkyYzNfZGV2c1swXS5pcnEgPSBncGlvX3RvX2lycShncGlvKTsKK30KKworCisvKiBHUElPIEkyQyAxMiAoMyBUb3VjaGtleSkgKi8KK3N0YXRpYyB1aW50MzJfdCB0b3VjaGtleV9rZXltYXBbXSA9IHsKKwkvKiBNQ1NfS0VZX01BUCh2YWx1ZSwga2V5Y29kZSkgKi8KKwlNQ1NfS0VZX01BUCgwLCBLRVlfTUVOVSksCQkvKiBLRVlfU0VORCAqLworCU1DU19LRVlfTUFQKDEsIEtFWV9CQUNLKSwJCS8qIEtFWV9FTkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWNzX3BsYXRmb3JtX2RhdGEgdG91Y2hrZXlfZGF0YSA9IHsKKwkua2V5bWFwCQk9IHRvdWNoa2V5X2tleW1hcCwKKwkua2V5bWFwX3NpemUJPSBBUlJBWV9TSVpFKHRvdWNoa2V5X2tleW1hcCksCisJLmtleV9tYXh2YWwJPSAyLAorfTsKKworLyogR1BJTyBJMkMgM19UT1VDSCAyLjhWICovCisjZGVmaW5lIEkyQ19HUElPX0JVU18xMgkJMTIKK3N0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBpMmNfZ3BpbzEyX2RhdGEgPSB7CisJLnNkYV9waW4JPSBFWFlOT1M0X0dQRTQoMCksCS8qIFhNRE1EQVRBXzggKi8KKwkuc2NsX3Bpbgk9IEVYWU5PUzRfR1BFNCgxKSwJLyogWE1ETURBVEFfOSAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2dwaW8xMiA9IHsKKwkubmFtZQkJPSAiaTJjLWdwaW8iLAorCS5pZAkJPSBJMkNfR1BJT19CVVNfMTIsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmkyY19ncGlvMTJfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZ3BpbzEyX2RldnNbXSBfX2luaXRkYXRhID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oIm1jczUwODBfdG91Y2hrZXkiLCAweDIwKSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmdG91Y2hrZXlfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF90b3VjaGtleV9pbml0KHZvaWQpCit7CisJaW50IGdwaW87CisKKwlncGlvID0gRVhZTk9TNF9HUEUzKDcpOwkJCS8qIFhNRE1EQVRBXzcgKi8KKwlncGlvX3JlcXVlc3QoZ3BpbywgIjNfVE9VQ0hfSU5UIik7CisJczVwX3JlZ2lzdGVyX2dwaW9faW50ZXJydXB0KGdwaW8pOworCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7CisJaTJjX2dwaW8xMl9kZXZzWzBdLmlycSA9IGdwaW9fdG9faXJxKGdwaW8pOworCisJZ3BpbyA9IEVYWU5PUzRfR1BFMygzKTsJCQkvKiBYTURNREFUQV8zICovCisJZ3Bpb19yZXF1ZXN0KGdwaW8sICIzX1RPVUNIX0VOIik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOworfQorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIHVuaXZlcnNhbF9pMmMwX3BsYXRkYXRhIF9faW5pdGRhdGEgPSB7CisJLmZyZXF1ZW5jeQk9IDMwMCAqIDEwMDAsCisJLnNkYV9kZWxheQk9IDIwMCwKK307CisKKy8qIEdQSU8gS0VZUyAqLworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzW10gPSB7CisJeworCQkuY29kZQkJCT0gS0VZX1ZPTFVNRVVQLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDApLAkvKiBYRUlOVDE2ICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FVVAiLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sIHsKKwkJLmNvZGUJCQk9IEtFWV9WT0xVTUVET1dOLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDEpLAkvKiBYRUlOVDE3ICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FRE9XTiIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX0NPTkZJRywKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigyKSwJLyogWEVJTlQxOCAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0NPTkZJRyIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX0NBTUVSQSwKKwkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigzKSwJLyogWEVJTlQxOSAqLworCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0NBTUVSQSIsCisJCS50eXBlCQkJPSBFVl9LRVksCisJCS5hY3RpdmVfbG93CQk9IDEsCisJCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCisJfSwgeworCQkuY29kZQkJCT0gS0VZX09LLAorCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgzKDUpLAkvKiBYRUlOVDI5ICovCisJCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfT0siLAorCQkudHlwZQkJCT0gRVZfS0VZLAorCQkuYWN0aXZlX2xvdwkJPSAxLAorCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIHVuaXZlcnNhbF9ncGlvX2tleXNfZGF0YSA9IHsKKwkuYnV0dG9ucwk9IHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzLAorCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUodW5pdmVyc2FsX2dwaW9fa2V5c190YWJsZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdW5pdmVyc2FsX2dwaW9fa2V5cyA9IHsKKwkubmFtZQkJCT0gImdwaW8ta2V5cyIsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ1bml2ZXJzYWxfZ3Bpb19rZXlzX2RhdGEsCisJfSwKK307CisKKy8qIGVNTUMgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHVuaXZlcnNhbF9oc21tYzBfZGF0YSBfX2luaXRkYXRhID0geworCS5tYXhfd2lkdGgJCT0gOCwKKwkuaG9zdF9jYXBzCQk9IChNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKKwkJCQlNTUNfQ0FQX0RJU0FCTEUpLAorCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9QRVJNQU5FTlQsCisJLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1tYzBfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInMzYy1zZGhjaS4wIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbW1jMF9maXhlZF92b2x0YWdlX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMJCT0geworCQkubmFtZQkJPSAiVk1FTV9WRERfMi44ViIsCisJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobW1jMF9zdXBwbGllcyksCisJLmNvbnN1bWVyX3N1cHBsaWVzCT0gbW1jMF9zdXBwbGllcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgbW1jMF9maXhlZF92b2x0YWdlX2NvbmZpZyA9IHsKKwkuc3VwcGx5X25hbWUJCT0gIk1BU1NNRU1PUllfRU4iLAorCS5taWNyb3ZvbHRzCQk9IDI4MDAwMDAsCisJLmdwaW8JCQk9IEVYWU5PUzRfR1BFMSgzKSwKKwkuZW5hYmxlX2hpZ2gJCT0gdHJ1ZSwKKwkuaW5pdF9kYXRhCQk9ICZtbWMwX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW1jMF9maXhlZF92b2x0YWdlID0geworCS5uYW1lCQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAkJCT0gRklYRURfUkVHX0lEX01NQzAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtbWMwX2ZpeGVkX3ZvbHRhZ2VfY29uZmlnLAorCX0sCit9OworCisvKiBTRCAqLworc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgdW5pdmVyc2FsX2hzbW1jMl9kYXRhIF9faW5pdGRhdGEgPSB7CisJLm1heF93aWR0aAkJPSA0LAorCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8CisJCQkJTU1DX0NBUF9ESVNBQkxFLAorCS5leHRfY2RfZ3BpbwkJPSBFWFlOT1M0X0dQWDMoNCksICAgICAgLyogWEVJTlRfMjggKi8KKwkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKKwkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKKwkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCit9OworCisvKiBXaUZpICovCitzdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSB1bml2ZXJzYWxfaHNtbWMzX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCQk9IDQsCisJLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfAorCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKKwkJCQlNTUNfQ0FQX0RJU0FCTEUsCisJLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0VYVEVSTkFMLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9zZGhjaV9pbml0KHZvaWQpCit7CisJczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzBfZGF0YSk7CisJczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzJfZGF0YSk7CisJczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9oc21tYzNfZGF0YSk7Cit9CisKKy8qIEkyQzEgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMV9kZXZzW10gX19pbml0ZGF0YSA9IHsKKwkvKiBHeXJvLCBUbyBiZSB1cGRhdGVkICovCit9OworCisvKiBGcmFtZSBCdWZmZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BkX3dpbiB1bml2ZXJzYWxfZmJfd2luMCA9IHsKKwkud2luX21vZGUgPSB7CisJCS5sZWZ0X21hcmdpbgk9IDE2LAorCQkucmlnaHRfbWFyZ2luCT0gMTYsCisJCS51cHBlcl9tYXJnaW4JPSAyLAorCQkubG93ZXJfbWFyZ2luCT0gMjgsCisJCS5oc3luY19sZW4JPSAyLAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnhyZXMJCT0gNDgwLAorCQkueXJlcwkJPSA4MDAsCisJCS5yZWZyZXNoCT0gNTUsCisJfSwKKwkubWF4X2JwcAk9IDMyLAorCS5kZWZhdWx0X2JwcAk9IDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgdW5pdmVyc2FsX2xjZF9wZGF0YSBfX2luaXRkYXRhID0geworCS53aW5bMF0JCT0gJnVuaXZlcnNhbF9mYl93aW4wLAorCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiB8CisJCQkgIFZJRENPTjBfQ0xLU0VMX0xDRCwKKwkudmlkY29uMQk9IFZJRENPTjFfSU5WX1ZDTEsgfCBWSURDT04xX0lOVl9WREVOCisJCQkgIHwgVklEQ09OMV9JTlZfSFNZTkMgfCBWSURDT04xX0lOVl9WU1lOQywKKwkuc2V0dXBfZ3Bpbwk9IGV4eW5vczRfZmltZDBfZ3Bpb19zZXR1cF8yNGJwcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBjYW1faV9jb3JlX3N1cHBseSA9CisJUkVHVUxBVE9SX1NVUFBMWSgiY29yZSIsICIwLTAwMWYiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGNhbV9pX2NvcmVfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7IC52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTIH0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gJmNhbV9pX2NvcmVfc3VwcGx5LAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBjYW1faV9jb3JlX2ZpeGVkX3ZvbHRhZ2VfY2ZnID0geworCS5zdXBwbHlfbmFtZQk9ICJDQU1fSV9DT1JFXzEuMlYiLAorCS5taWNyb3ZvbHRzCT0gMTIwMDAwMCwKKwkuZ3BpbwkJPSBFWFlOT1M0X0dQRTIoMiksCS8qIENBTV84TV9DT1JFX0VOICovCisJLmVuYWJsZV9oaWdoCT0gMSwKKwkuaW5pdF9kYXRhCT0gJmNhbV9pX2NvcmVfcmVnX2luaXRfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNhbV9pX2NvcmVfZml4ZWRfcmVnX2RldiA9IHsKKwkubmFtZSA9ICJyZWctZml4ZWQtdm9sdGFnZSIsIC5pZCA9IEZJWEVEX1JFR19JRF9DQU1fSV9DT1JFLAorCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhCT0gJmNhbV9pX2NvcmVfZml4ZWRfdm9sdGFnZV9jZmcgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBjYW1fc19pZl9zdXBwbHkgPQorCVJFR1VMQVRPUl9TVVBQTFkoImRfc2Vuc29yIiwgIjAtMDAxZiIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgY2FtX3NfaWZfcmVnX2luaXRfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7IC52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTIH0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzID0gJmNhbV9zX2lmX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgY2FtX3NfaWZfZml4ZWRfdm9sdGFnZV9jZmcgPSB7CisJLnN1cHBseV9uYW1lCT0gIkNBTV9TX0lGXzEuOFYiLAorCS5taWNyb3ZvbHRzCT0gMTgwMDAwMCwKKwkuZ3BpbwkJPSBFWFlOT1M0X0dQRTMoMCksCS8qIENBTV9QV1JfRU4xICovCisJLmVuYWJsZV9oaWdoCT0gMSwKKwkuaW5pdF9kYXRhCT0gJmNhbV9zX2lmX3JlZ19pbml0X2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjYW1fc19pZl9maXhlZF9yZWdfZGV2ID0geworCS5uYW1lID0gInJlZy1maXhlZC12b2x0YWdlIiwgLmlkID0gRklYRURfUkVHX0lEX0NBTV9TX0lGLAorCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhCT0gJmNhbV9zX2lmX2ZpeGVkX3ZvbHRhZ2VfY2ZnIH0sCit9OworCitzdGF0aWMgc3RydWN0IHM1cF9wbGF0Zm9ybV9taXBpX2NzaXMgbWlwaV9jc2lzX3BsYXRkYXRhID0geworCS5jbGtfcmF0ZQk9IDE2NjAwMDAwMFVMLAorCS5sYW5lcwkJPSAyLAorCS5hbGlnbm1lbnQJPSAzMiwKKwkuaHNfc2V0dGxlCT0gMTIsCisJLnBoeV9lbmFibGUJPSBzNXBfY3Npc19waHlfZW5hYmxlLAorfTsKKworI2RlZmluZSBHUElPX0NBTV9MRVZFTF9FTihuKQlFWFlOT1M0X0dQRTQobiArIDMpCisjZGVmaW5lIEdQSU9fQ0FNXzhNX0lTUF9JTlQJRVhZTk9TNF9HUFgxKDUpCS8qIFhFSU5UXzEzICovCisjZGVmaW5lIEdQSU9fQ0FNX01FR0FfblJTVAlFWFlOT1M0X0dQRTIoNSkKKworc3RhdGljIGludCBtNW1vbHNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG9uKQoreworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fQ0FNX0xFVkVMX0VOKDEpLCAhb24pOworCWdwaW9fc2V0X3ZhbHVlKEdQSU9fQ0FNX0xFVkVMX0VOKDIpLCAhIW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtNW1vbHNfcGxhdGZvcm1fZGF0YSBtNW1vbHNfcGxhdGRhdGEgPSB7CisJLmdwaW9fcmVzZXQJPSBHUElPX0NBTV9NRUdBX25SU1QsCisJLnJlc2V0X3BvbGFyaXR5CT0gMCwKKwkuc2V0X3Bvd2VyCT0gbTVtb2xzX3NldF9wb3dlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbTVtb2xzX2JvYXJkX2luZm8gPSB7CisJSTJDX0JPQVJEX0lORk8oIk01TU9MUyIsIDB4MUYpLAorCS5wbGF0Zm9ybV9kYXRhID0gJm01bW9sc19wbGF0ZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gdW5pdmVyc2FsX2NhbWVyYV9zZW5zb3JzW10gPSB7CisJeworCQkubXV4X2lkCQk9IDAsCisJCS5mbGFncwkJPSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8CisJCQkJICBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVywKKwkJLmJ1c190eXBlCT0gRklNQ19NSVBJX0NTSTIsCisJCS5ib2FyZF9pbmZvCT0gJm01bW9sc19ib2FyZF9pbmZvLAorCQkuaTJjX2J1c19udW0JPSAwLAorCQkuY2xrX2ZyZXF1ZW5jeQk9IDIxNjAwMDAwVUwsCisJCS5jc2lfZGF0YV9hbGlnbgk9IDMyLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jIGZpbWNfbWRfcGxhdGRhdGEgPSB7CisJLmlzcF9pbmZvCT0gdW5pdmVyc2FsX2NhbWVyYV9zZW5zb3JzLAorCS5udW1fY2xpZW50cwk9IEFSUkFZX1NJWkUodW5pdmVyc2FsX2NhbWVyYV9zZW5zb3JzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3BpbyB1bml2ZXJzYWxfY2FtZXJhX2dwaW9zW10gPSB7CisJeyBHUElPX0NBTV9MRVZFTF9FTigxKSwJR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkNBTV9MVkxfRU4xIiB9LAorCXsgR1BJT19DQU1fTEVWRUxfRU4oMiksCUdQSU9GX09VVF9JTklUX0xPVywgICJDQU1fTFZMX0VOMiIgfSwKKwl7IEdQSU9fQ0FNXzhNX0lTUF9JTlQsCUdQSU9GX0lOLCAgICAgICAgICAgICI4TV9JU1BfSU5UIiAgfSwKKwl7IEdQSU9fQ0FNX01FR0FfblJTVCwJR1BJT0ZfT1VUX0lOSVRfTE9XLCAgIkNBTV84TV9OUlNUIiB9LAorfTsKKworc3RhdGljIHZvaWQgdW5pdmVyc2FsX2NhbWVyYV9pbml0KHZvaWQpCit7CisJczNjX3NldF9wbGF0ZGF0YSgmbWlwaV9jc2lzX3BsYXRkYXRhLCBzaXplb2YobWlwaV9jc2lzX3BsYXRkYXRhKSwKKwkJCSAmczVwX2RldmljZV9taXBpX2NzaXMwKTsKKwlzM2Nfc2V0X3BsYXRkYXRhKCZmaW1jX21kX3BsYXRkYXRhLCAgc2l6ZW9mKGZpbWNfbWRfcGxhdGRhdGEpLAorCQkJICZzNXBfZGV2aWNlX2ZpbWNfbWQpOworCisJaWYgKGdwaW9fcmVxdWVzdF9hcnJheSh1bml2ZXJzYWxfY2FtZXJhX2dwaW9zLAorCQkJICAgICAgIEFSUkFZX1NJWkUodW5pdmVyc2FsX2NhbWVyYV9ncGlvcykpKSB7CisJCXByX2VycigiJXM6IEdQSU8gcmVxdWVzdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghczNjX2dwaW9fY2ZncGluKEdQSU9fQ0FNXzhNX0lTUF9JTlQsIFMzQ19HUElPX1NGTigweGYpKSkKKwkJbTVtb2xzX2JvYXJkX2luZm8uaXJxID0gZ3Bpb190b19pcnEoR1BJT19DQU1fOE1fSVNQX0lOVCk7CisJZWxzZQorCQlwcl9lcnIoIkZhaWxlZCB0byBjb25maWd1cmUgOE1fSVNQX0lOVCBHUElPXG4iKTsKKworCS8qIEZyZWUgR1BJT3MgY29udHJvbGxlZCBkaXJlY3RseSBieSB0aGUgc2Vuc29yIGRyaXZlcnMuICovCisJZ3Bpb19mcmVlKEdQSU9fQ0FNX01FR0FfblJTVCk7CisJZ3Bpb19mcmVlKEdQSU9fQ0FNXzhNX0lTUF9JTlQpOworCisJaWYgKGV4eW5vczRfZmltY19zZXR1cF9ncGlvKFM1UF9DQU1QT1JUX0EpKQorCQlwcl9lcnIoIkNhbWVyYSBwb3J0IEEgc2V0dXAgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnVuaXZlcnNhbF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkvKiBTYW1zdW5nIFBsYXRmb3JtIERldmljZXMgKi8KKwkmczVwX2RldmljZV9taXBpX2NzaXMwLAorCSZzNXBfZGV2aWNlX2ZpbWMwLAorCSZzNXBfZGV2aWNlX2ZpbWMxLAorCSZzNXBfZGV2aWNlX2ZpbWMyLAorCSZzNXBfZGV2aWNlX2ZpbWMzLAorCSZtbWMwX2ZpeGVkX3ZvbHRhZ2UsCisJJnMzY19kZXZpY2VfaHNtbWMwLAorCSZzM2NfZGV2aWNlX2hzbW1jMiwKKwkmczNjX2RldmljZV9oc21tYzMsCisJJnMzY19kZXZpY2VfaTJjMCwKKwkmczNjX2RldmljZV9pMmMzLAorCSZzM2NfZGV2aWNlX2kyYzUsCisJJnM1cF9kZXZpY2VfaTJjX2hkbWlwaHksCisJJmhkbWlfZml4ZWRfdm9sdGFnZSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfVFZdLAorCSZzNXBfZGV2aWNlX2hkbWksCisJJnM1cF9kZXZpY2Vfc2RvLAorCSZzNXBfZGV2aWNlX21peGVyLAorCisJLyogVW5pdmVyc2FsIERldmljZXMgKi8KKwkmaTJjX2dwaW8xMiwKKwkmdW5pdmVyc2FsX2dwaW9fa2V5cywKKwkmczVwX2RldmljZV9vbmVuYW5kLAorCSZzNXBfZGV2aWNlX2ZpbWQwLAorCSZzNXBfZGV2aWNlX21mYywKKwkmczVwX2RldmljZV9tZmNfbCwKKwkmczVwX2RldmljZV9tZmNfciwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKKwkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0sCisJJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0sCisJJmNhbV9pX2NvcmVfZml4ZWRfcmVnX2RldiwKKwkmY2FtX3NfaWZfZml4ZWRfcmVnX2RldiwKKwkmczVwX2RldmljZV9maW1jX21kLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9tYXBfaW8odm9pZCkKK3sKKwlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKKwlzM2MyNHh4X2luaXRfdWFydHModW5pdmVyc2FsX3VhcnRjZmdzLCBBUlJBWV9TSVpFKHVuaXZlcnNhbF91YXJ0Y2ZncykpOworfQorCit2b2lkIHM1cF90dl9zZXR1cCh2b2lkKQoreworCS8qIGRpcmVjdCBIUEQgdG8gSERNSSBjaGlwICovCisJZ3Bpb19yZXF1ZXN0KEVYWU5PUzRfR1BYMyg3KSwgImhwZC1wbHVnIik7CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChFWFlOT1M0X0dQWDMoNykpOworCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDMoNyksIFMzQ19HUElPX1NGTigweDMpKTsKKwlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMyg3KSwgUzNDX0dQSU9fUFVMTF9OT05FKTsKKworCS8qIHNldHVwIGRlcGVuZGVuY2llcyBiZXR3ZWVuIFRWIGRldmljZXMgKi8KKwlzNXBfZGV2aWNlX2hkbWkuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9UVl0uZGV2OworCXM1cF9kZXZpY2VfbWl4ZXIuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9UVl0uZGV2OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3Jlc2VydmUodm9pZCkKK3sKKwlzNXBfbWZjX3Jlc2VydmVfbWVtKDB4NDMwMDAwMDAsIDggPDwgMjAsIDB4NTEwMDAwMDAsIDggPDwgMjApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX21hY2hpbmVfaW5pdCh2b2lkKQoreworCXVuaXZlcnNhbF9zZGhjaV9pbml0KCk7CisJczVwX3R2X3NldHVwKCk7CisKKwlzM2NfaTJjMF9zZXRfcGxhdGRhdGEoJnVuaXZlcnNhbF9pMmMwX3BsYXRkYXRhKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmMxX2RldnMsIEFSUkFZX1NJWkUoaTJjMV9kZXZzKSk7CisKKwl1bml2ZXJzYWxfdHNwX2luaXQoKTsKKwlzM2NfaTJjM19zZXRfcGxhdGRhdGEoTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMywgaTJjM19kZXZzLCBBUlJBWV9TSVpFKGkyYzNfZGV2cykpOworCisJczNjX2kyYzVfc2V0X3BsYXRkYXRhKE5VTEwpOworCXM1cF9pMmNfaGRtaXBoeV9zZXRfcGxhdGRhdGEoTlVMTCk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oNSwgaTJjNV9kZXZzLCBBUlJBWV9TSVpFKGkyYzVfZGV2cykpOworCisJczVwX2ZpbWQwX3NldF9wbGF0ZGF0YSgmdW5pdmVyc2FsX2xjZF9wZGF0YSk7CisKKwl1bml2ZXJzYWxfdG91Y2hrZXlfaW5pdCgpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKEkyQ19HUElPX0JVU18xMiwgaTJjX2dwaW8xMl9kZXZzLAorCQkJQVJSQVlfU0laRShpMmNfZ3BpbzEyX2RldnMpKTsKKworCXVuaXZlcnNhbF9jYW1lcmFfaW5pdCgpOworCisJLyogTGFzdCAqLworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHVuaXZlcnNhbF9kZXZpY2VzLCBBUlJBWV9TSVpFKHVuaXZlcnNhbF9kZXZpY2VzKSk7CisKKwlzNXBfZGV2aWNlX21mYy5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX01GQ10uZGV2OworCXM1cF9kZXZpY2VfZmltZDAuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QwXS5kZXY7CisKKwlzNXBfZGV2aWNlX2ZpbWMwLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7CisJczVwX2RldmljZV9maW1jMS5kZXYucGFyZW50ID0gJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0uZGV2OworCXM1cF9kZXZpY2VfZmltYzIuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLmRldjsKKwlzNXBfZGV2aWNlX2ZpbWMzLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7CisJczVwX2RldmljZV9taXBpX2NzaXMwLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfQ0FNXS5kZXY7Cit9CisKK01BQ0hJTkVfU1RBUlQoVU5JVkVSU0FMX0MyMTAsICJVTklWRVJTQUxfQzIxMCIpCisJLyogTWFpbnRhaW5lcjogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gdW5pdmVyc2FsX21hcF9pbywKKwkuaW5pdF9tYWNoaW5lCT0gdW5pdmVyc2FsX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCisJLnJlc2VydmUgICAgICAgID0gJnVuaXZlcnNhbF9yZXNlcnZlLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21jdC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczNDNkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL21jdC5jCkBAIC0wLDAgKzEsNDcxIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogRVhZTk9TNCBNQ1QoTXVsdGktQ29yZSBUaW1lcikgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1tY3QuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK2VudW0geworCU1DVF9JTlRfU1BJLAorCU1DVF9JTlRfUFBJCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfY250X3Blcl90aWNrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IG1jdF9pbnRfdHlwZTsKKworc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgeworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dDsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJY2hhciBuYW1lWzEwXTsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSwgcGVyY3B1X21jdF90aWNrKTsKKworc3RhdGljIHZvaWQgZXh5bm9zNF9tY3Rfd3JpdGUodW5zaWduZWQgaW50IHZhbHVlLCB2b2lkICphZGRyKQoreworCXZvaWQgX19pb21lbSAqc3RhdF9hZGRyOworCXUzMiBtYXNrOworCXUzMiBpOworCisJX19yYXdfd3JpdGVsKHZhbHVlLCBhZGRyKTsKKworCWlmIChsaWtlbHkoYWRkciA+PSBFWFlOT1M0X01DVF9MX0JBU0UoMCkpKSB7CisJCXUzMiBiYXNlID0gKHUzMikgYWRkciAmIEVYWU5PUzRfTUNUX0xfTUFTSzsKKwkJc3dpdGNoICgodTMyKSBhZGRyICYgfkVYWU5PUzRfTUNUX0xfTUFTSykgeworCQljYXNlICh1MzIpIE1DVF9MX1RDT05fT0ZGU0VUOgorCQkJc3RhdF9hZGRyID0gKHZvaWQgX19pb21lbSAqKSBiYXNlICsgTUNUX0xfV1NUQVRfT0ZGU0VUOworCQkJbWFzayA9IDEgPDwgMzsJCS8qIExfVENPTiB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQljYXNlICh1MzIpIE1DVF9MX0lDTlRCX09GRlNFVDoKKwkJCXN0YXRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgYmFzZSArIE1DVF9MX1dTVEFUX09GRlNFVDsKKwkJCW1hc2sgPSAxIDw8IDE7CQkvKiBMX0lDTlRCIHdyaXRlIHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWNhc2UgKHUzMikgTUNUX0xfVENOVEJfT0ZGU0VUOgorCQkJc3RhdF9hZGRyID0gKHZvaWQgX19pb21lbSAqKSBiYXNlICsgTUNUX0xfV1NUQVRfT0ZGU0VUOworCQkJbWFzayA9IDEgPDwgMDsJCS8qIExfVENOVEIgd3JpdGUgc3RhdHVzICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoKHUzMikgYWRkcikgeworCQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfVENPTjoKKwkJCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAxNjsJCS8qIEdfVENPTiB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ09NUDBfTDoKKwkJCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAwOwkJLyogR19DT01QMF9MIHdyaXRlIHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DT01QMF9VOgorCQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19XU1RBVDsKKwkJCW1hc2sgPSAxIDw8IDE7CQkvKiBHX0NPTVAwX1Ugd3JpdGUgc3RhdHVzICovCisJCQlicmVhazsKKwkJY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSOgorCQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19XU1RBVDsKKwkJCW1hc2sgPSAxIDw8IDI7CQkvKiBHX0NPTVAwX0FERF9JTkNSIHcgc3RhdHVzICovCisJCQlicmVhazsKKwkJY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NOVF9MOgorCQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfR19DTlRfV1NUQVQ7CisJCQltYXNrID0gMSA8PCAwOwkJLyogR19DTlRfTCB3cml0ZSBzdGF0dXMgKi8KKwkJCWJyZWFrOworCQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ05UX1U6CisJCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX0NOVF9XU1RBVDsKKwkJCW1hc2sgPSAxIDw8IDE7CQkvKiBHX0NOVF9VIHdyaXRlIHN0YXR1cyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBXYWl0IG1heGltdW0gMSBtcyB1bnRpbCB3cml0dGVuIHZhbHVlcyBhcmUgYXBwbGllZCAqLworCWZvciAoaSA9IDA7IGkgPCBsb29wc19wZXJfamlmZnkgLyAxMDAwICogSFo7IGkrKykKKwkJaWYgKF9fcmF3X3JlYWRsKHN0YXRfYWRkcikgJiBtYXNrKSB7CisJCQlfX3Jhd193cml0ZWwobWFzaywgc3RhdF9hZGRyKTsKKwkJCXJldHVybjsKKwkJfQorCisJcGFuaWMoIk1DVCBoYW5ncyBhZnRlciB3cml0aW5nICVkIChhZGRyOjB4JTA4eClcbiIsIHZhbHVlLCAodTMyKWFkZHIpOworfQorCisvKiBDbG9ja3NvdXJjZSBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfZnJjX3N0YXJ0KHUzMiBoaSwgdTMyIGxvKQoreworCXUzMiByZWc7CisKKwlleHlub3M0X21jdF93cml0ZShsbywgRVhZTk9TNF9NQ1RfR19DTlRfTCk7CisJZXh5bm9zNF9tY3Rfd3JpdGUoaGksIEVYWU5PUzRfTUNUX0dfQ05UX1UpOworCisJcmVnID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19UQ09OKTsKKwlyZWcgfD0gTUNUX0dfVENPTl9TVEFSVDsKKwlleHlub3M0X21jdF93cml0ZShyZWcsIEVYWU5PUzRfTUNUX0dfVENPTik7Cit9CisKK3N0YXRpYyBjeWNsZV90IGV4eW5vczRfZnJjX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwl1bnNpZ25lZCBpbnQgbG8sIGhpOworCXUzMiBoaTIgPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX0NOVF9VKTsKKworCWRvIHsKKwkJaGkgPSBoaTI7CisJCWxvID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19DTlRfTCk7CisJCWhpMiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfQ05UX1UpOworCX0gd2hpbGUgKGhpICE9IGhpMik7CisKKwlyZXR1cm4gKChjeWNsZV90KWhpIDw8IDMyKSB8IGxvOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X2ZyY19yZXN1bWUoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlleHlub3M0X21jdF9mcmNfc3RhcnQoMCwgMCk7Cit9CisKK3N0cnVjdCBjbG9ja3NvdXJjZSBtY3RfZnJjID0geworCS5uYW1lCQk9ICJtY3QtZnJjIiwKKwkucmF0aW5nCQk9IDQwMCwKKwkucmVhZAkJPSBleHlub3M0X2ZyY19yZWFkLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKKwkucmVzdW1lCQk9IGV4eW5vczRfZnJjX3Jlc3VtZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBleHlub3M0X2Nsb2Nrc291cmNlX2luaXQodm9pZCkKK3sKKwlleHlub3M0X21jdF9mcmNfc3RhcnQoMCwgMCk7CisKKwlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJm1jdF9mcmMsIGNsa19yYXRlKSkKKwkJcGFuaWMoIiVzOiBjYW4ndCByZWdpc3RlciBjbG9ja3NvdXJjZVxuIiwgbWN0X2ZyYy5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfY29tcDBfc3RvcCh2b2lkKQoreworCXVuc2lnbmVkIGludCB0Y29uOworCisJdGNvbiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfVENPTik7CisJdGNvbiAmPSB+KE1DVF9HX1RDT05fQ09NUDBfRU5BQkxFIHwgTUNUX0dfVENPTl9DT01QMF9BVVRPX0lOQyk7CisKKwlleHlub3M0X21jdF93cml0ZSh0Y29uLCBFWFlOT1M0X01DVF9HX1RDT04pOworCWV4eW5vczRfbWN0X3dyaXRlKDAsIEVYWU5PUzRfTUNUX0dfSU5UX0VOQik7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X2NvbXAwX3N0YXJ0KGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGN5Y2xlcykKK3sKKwl1bnNpZ25lZCBpbnQgdGNvbjsKKwljeWNsZV90IGNvbXBfY3ljbGU7CisKKwl0Y29uID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19UQ09OKTsKKworCWlmIChtb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKSB7CisJCXRjb24gfD0gTUNUX0dfVENPTl9DT01QMF9BVVRPX0lOQzsKKwkJZXh5bm9zNF9tY3Rfd3JpdGUoY3ljbGVzLCBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSKTsKKwl9CisKKwljb21wX2N5Y2xlID0gZXh5bm9zNF9mcmNfcmVhZCgmbWN0X2ZyYykgKyBjeWNsZXM7CisJZXh5bm9zNF9tY3Rfd3JpdGUoKHUzMiljb21wX2N5Y2xlLCBFWFlOT1M0X01DVF9HX0NPTVAwX0wpOworCWV4eW5vczRfbWN0X3dyaXRlKCh1MzIpKGNvbXBfY3ljbGUgPj4gMzIpLCBFWFlOT1M0X01DVF9HX0NPTVAwX1UpOworCisJZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBFWFlOT1M0X01DVF9HX0lOVF9FTkIpOworCisJdGNvbiB8PSBNQ1RfR19UQ09OX0NPTVAwX0VOQUJMRTsKKwlleHlub3M0X21jdF93cml0ZSh0Y29uICwgRVhZTk9TNF9NQ1RfR19UQ09OKTsKK30KKworc3RhdGljIGludCBleHlub3M0X2NvbXBfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlleHlub3M0X21jdF9jb21wMF9zdGFydChldnQtPm1vZGUsIGN5Y2xlcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zNF9jb21wX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCWV4eW5vczRfbWN0X2NvbXAwX3N0b3AoKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWV4eW5vczRfbWN0X2NvbXAwX3N0YXJ0KG1vZGUsIGNsa19jbnRfcGVyX3RpY2spOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG1jdF9jb21wX2RldmljZSA9IHsKKwkubmFtZQkJPSAibWN0LWNvbXAiLAorCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkucmF0aW5nCQk9IDI1MCwKKwkuc2V0X25leHRfZXZlbnQJPSBleHlub3M0X2NvbXBfc2V0X25leHRfZXZlbnQsCisJLnNldF9tb2RlCT0gZXh5bm9zNF9jb21wX3NldF9tb2RlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGV4eW5vczRfbWN0X2NvbXBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBkZXZfaWQ7CisKKwlleHlub3M0X21jdF93cml0ZSgweDEsIEVYWU5PUzRfTUNUX0dfSU5UX0NTVEFUKTsKKworCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY3RfY29tcF9ldmVudF9pcnEgPSB7CisJLm5hbWUJCT0gIm1jdF9jb21wX2lycSIsCisJLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCisJLmhhbmRsZXIJPSBleHlub3M0X21jdF9jb21wX2lzciwKKwkuZGV2X2lkCQk9ICZtY3RfY29tcF9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBleHlub3M0X2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQoreworCWNsa19jbnRfcGVyX3RpY2sgPSBjbGtfcmF0ZSAvIDIJLyBIWjsKKworCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdCgmbWN0X2NvbXBfZGV2aWNlLCBjbGtfcmF0ZSAvIDIsIDUpOworCW1jdF9jb21wX2RldmljZS5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsICZtY3RfY29tcF9kZXZpY2UpOworCW1jdF9jb21wX2RldmljZS5taW5fZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZiwgJm1jdF9jb21wX2RldmljZSk7CisJbWN0X2NvbXBfZGV2aWNlLmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmbWN0X2NvbXBfZGV2aWNlKTsKKworCXNldHVwX2lycShJUlFfTUNUX0cwLCAmbWN0X2NvbXBfZXZlbnRfaXJxKTsKK30KKworI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKKy8qIENsb2NrIGV2ZW50IGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBleHlub3M0X21jdF90aWNrX3N0b3Aoc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gTUNUX0xfVENPTl9JTlRfU1RBUlQgfCBNQ1RfTF9UQ09OX1RJTUVSX1NUQVJUOworCXZvaWQgX19pb21lbSAqYWRkciA9IG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVDsKKworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpOworCWlmICh0bXAgJiBtYXNrKSB7CisJCXRtcCAmPSB+bWFzazsKKwkJZXh5bm9zNF9tY3Rfd3JpdGUodG1wLCBhZGRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3RpY2tfc3RhcnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCisJCQkJICAgc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7CisKKwl0bXAgPSAoMSA8PCAzMSkgfCBjeWNsZXM7CS8qIE1DVF9MX1VQREFURV9JQ05UQiAqLworCisJLyogdXBkYXRlIGludGVycnVwdCBjb3VudCBidWZmZXIgKi8KKwlleHlub3M0X21jdF93cml0ZSh0bXAsIG1ldnQtPmJhc2UgKyBNQ1RfTF9JQ05UQl9PRkZTRVQpOworCisJLyogZW5hYmxlIE1DVCB0aWNrIGludGVycnVwdCAqLworCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgbWV2dC0+YmFzZSArIE1DVF9MX0lOVF9FTkJfT0ZGU0VUKTsKKworCXRtcCA9IF9fcmF3X3JlYWRsKG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVCk7CisJdG1wIHw9IE1DVF9MX1RDT05fSU5UX1NUQVJUIHwgTUNUX0xfVENPTl9USU1FUl9TVEFSVCB8CisJICAgICAgIE1DVF9MX1RDT05fSU5URVJWQUxfTU9ERTsKKwlleHlub3M0X21jdF93cml0ZSh0bXAsIG1ldnQtPmJhc2UgKyBNQ1RfTF9UQ09OX09GRlNFVCk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF90aWNrX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAorCQkJCSAgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQgPSB0aGlzX2NwdV9wdHIoJnBlcmNwdV9tY3RfdGljayk7CisKKwlleHlub3M0X21jdF90aWNrX3N0YXJ0KGN5Y2xlcywgbWV2dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4eW5vczRfdGlja19zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCA9IHRoaXNfY3B1X3B0cigmcGVyY3B1X21jdF90aWNrKTsKKworCWV4eW5vczRfbWN0X3RpY2tfc3RvcChtZXZ0KTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWV4eW5vczRfbWN0X3RpY2tfc3RhcnQoY2xrX2NudF9wZXJfdGljaywgbWV2dCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBleHlub3M0X21jdF90aWNrX2NsZWFyKHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IG1ldnQtPmV2dDsKKworCS8qCisJICogVGhpcyBpcyBmb3Igc3VwcG9ydGluZyBvbmVzaG90IG1vZGUuCisJICogTWN0IHdvdWxkIGdlbmVyYXRlIGludGVycnVwdCBwZXJpb2RpY2FsbHkKKwkgKiB3aXRob3V0IGV4cGxpY2l0IHN0b3BwaW5nLgorCSAqLworCWlmIChldnQtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCisJCWV4eW5vczRfbWN0X3RpY2tfc3RvcChtZXZ0KTsKKworCS8qIENsZWFyIHRoZSBNQ1QgdGljayBpbnRlcnJ1cHQgKi8KKwlpZiAoX19yYXdfcmVhZGwobWV2dC0+YmFzZSArIE1DVF9MX0lOVF9DU1RBVF9PRkZTRVQpICYgMSkgeworCQlleHlub3M0X21jdF93cml0ZSgweDEsIG1ldnQtPmJhc2UgKyBNQ1RfTF9JTlRfQ1NUQVRfT0ZGU0VUKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXh5bm9zNF9tY3RfdGlja19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0ID0gZGV2X2lkOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IG1ldnQtPmV2dDsKKworCWV4eW5vczRfbWN0X3RpY2tfY2xlYXIobWV2dCk7CisKKwlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWN0X3RpY2swX2V2ZW50X2lycSA9IHsKKwkubmFtZQkJPSAibWN0X3RpY2swX2lycSIsCisJLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5oYW5kbGVyCT0gZXh5bm9zNF9tY3RfdGlja19pc3IsCit9OworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY3RfdGljazFfZXZlbnRfaXJxID0geworCS5uYW1lCQk9ICJtY3RfdGljazFfaXJxIiwKKwkuZmxhZ3MJCT0gSVJRRl9USU1FUiB8IElSUUZfTk9CQUxBTkNJTkcsCisJLmhhbmRsZXIJPSBleHlub3M0X21jdF90aWNrX2lzciwKK307CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3RpY2tfaW5pdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQ7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCW1ldnQgPSB0aGlzX2NwdV9wdHIoJnBlcmNwdV9tY3RfdGljayk7CisJbWV2dC0+ZXZ0ID0gZXZ0OworCisJbWV2dC0+YmFzZSA9IEVYWU5PUzRfTUNUX0xfQkFTRShjcHUpOworCXNwcmludGYobWV2dC0+bmFtZSwgIm1jdF90aWNrJWQiLCBjcHUpOworCisJZXZ0LT5uYW1lID0gbWV2dC0+bmFtZTsKKwlldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CisJZXZ0LT5zZXRfbmV4dF9ldmVudCA9IGV4eW5vczRfdGlja19zZXRfbmV4dF9ldmVudDsKKwlldnQtPnNldF9tb2RlID0gZXh5bm9zNF90aWNrX3NldF9tb2RlOworCWV2dC0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZXZ0LT5yYXRpbmcgPSA0NTA7CisKKwljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoZXZ0LCBjbGtfcmF0ZSAvIDIsIDUpOworCWV2dC0+bWF4X2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweDdmZmZmZmZmLCBldnQpOworCWV2dC0+bWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweGYsIGV2dCk7CisKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoZXZ0KTsKKworCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgbWV2dC0+YmFzZSArIE1DVF9MX1RDTlRCX09GRlNFVCk7CisKKwlpZiAobWN0X2ludF90eXBlID09IE1DVF9JTlRfU1BJKSB7CisJCWlmIChjcHUgPT0gMCkgeworCQkJbWN0X3RpY2swX2V2ZW50X2lycS5kZXZfaWQgPSBtZXZ0OworCQkJZXZ0LT5pcnEgPSBJUlFfTUNUX0wwOworCQkJc2V0dXBfaXJxKElSUV9NQ1RfTDAsICZtY3RfdGljazBfZXZlbnRfaXJxKTsKKwkJfSBlbHNlIHsKKwkJCW1jdF90aWNrMV9ldmVudF9pcnEuZGV2X2lkID0gbWV2dDsKKwkJCWV2dC0+aXJxID0gSVJRX01DVF9MMTsKKwkJCXNldHVwX2lycShJUlFfTUNUX0wxLCAmbWN0X3RpY2sxX2V2ZW50X2lycSk7CisJCQlpcnFfc2V0X2FmZmluaXR5KElSUV9NQ1RfTDEsIGNwdW1hc2tfb2YoMSkpOworCQl9CisJfSBlbHNlIHsKKwkJZW5hYmxlX3BlcmNwdV9pcnEoSVJRX01DVF9MT0NBTFRJTUVSLCAwKTsKKwl9Cit9CisKKy8qIFNldHVwIHRoZSBsb2NhbCBjbG9jayBldmVudHMgZm9yIGEgQ1BVICovCitpbnQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlleHlub3M0X21jdF90aWNrX2luaXQoZXZ0KTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCWV2dC0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfVU5VU0VELCBldnQpOworCWlmIChtY3RfaW50X3R5cGUgPT0gTUNUX0lOVF9TUEkpCisJCWRpc2FibGVfaXJxKGV2dC0+aXJxKTsKKwllbHNlCisJCWRpc2FibGVfcGVyY3B1X2lycShJUlFfTUNUX0xPQ0FMVElNRVIpOworfQorI2VuZGlmIC8qIENPTkZJR19MT0NBTF9USU1FUlMgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczRfdGltZXJfcmVzb3VyY2VzKHZvaWQpCit7CisJc3RydWN0IGNsayAqbWN0X2NsazsKKwltY3RfY2xrID0gY2xrX2dldChOVUxMLCAieHRhbCIpOworCisJY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUobWN0X2Nsayk7CisKKwlpZiAobWN0X2ludF90eXBlID09IE1DVF9JTlRfUFBJKSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gcmVxdWVzdF9wZXJjcHVfaXJxKElSUV9NQ1RfTE9DQUxUSU1FUiwKKwkJCQkJIGV4eW5vczRfbWN0X3RpY2tfaXNyLCAiTUNUIiwKKwkJCQkJICZwZXJjcHVfbWN0X3RpY2spOworCQlXQVJOKGVyciwgIk1DVDogY2FuJ3QgcmVxdWVzdCBJUlEgJWQgKCVkKVxuIiwKKwkJICAgICBJUlFfTUNUX0xPQ0FMVElNRVIsIGVycik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNF90aW1lcl9pbml0KHZvaWQpCit7CisJaWYgKHNvY19pc19leHlub3M0MjEwKCkpCisJCW1jdF9pbnRfdHlwZSA9IE1DVF9JTlRfU1BJOworCWVsc2UKKwkJbWN0X2ludF90eXBlID0gTUNUX0lOVF9QUEk7CisKKwlleHlub3M0X3RpbWVyX3Jlc291cmNlcygpOworCWV4eW5vczRfY2xvY2tzb3VyY2VfaW5pdCgpOworCWV4eW5vczRfY2xvY2tldmVudF9pbml0KCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgZXh5bm9zNF90aW1lciA9IHsKKwkuaW5pdAkJPSBleHlub3M0X3RpbWVyX2luaXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcGxhdHNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmZiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9wbGF0c21wLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbGF0c21wLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBDbG9uZWQgZnJvbSBsaW51eC9hcmNoL2FybS9tYWNoLXZleHByZXNzL3BsYXRzbXAuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KKyAqICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KKyNpbmNsdWRlIDxhc20vdW5pZmllZC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2ljX2Jhbmtfb2Zmc2V0OworZXh0ZXJuIHZvaWQgZXh5bm9zNF9zZWNvbmRhcnlfc3RhcnR1cCh2b2lkKTsKKworI2RlZmluZSBDUFUxX0JPT1RfUkVHCQkoc2Ftc3VuZ19yZXYoKSA9PSBFWFlOT1M0MjEwX1JFVl8xXzEgPyBcCisJCQkJUzVQX0lORk9STTUgOiBTNVBfVkFfU1lTUkFNKQorCisvKgorICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5CisgKiBib290ICJob2xkaW5nIHBlbiIKKyAqLworCit2b2xhdGlsZSBpbnQgX19jcHVpbml0ZGF0YSBwZW5fcmVsZWFzZSA9IC0xOworCisvKgorICogV3JpdGUgcGVuX3JlbGVhc2UgaW4gYSB3YXkgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIHZpc2libGUgdG8gYWxsCisgKiBvYnNlcnZlcnMsIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIHRoZXkncmUgdGFraW5nIHBhcnQgaW4gY29oZXJlbmN5CisgKiBvciBub3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGhvdHBsdWcgY29kZSB0byB3b3JrIHJlbGlhYmx5LgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9wZW5fcmVsZWFzZShpbnQgdmFsKQoreworCXBlbl9yZWxlYXNlID0gdmFsOworCXNtcF93bWIoKTsKKwlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKikmcGVuX3JlbGVhc2UsIHNpemVvZihwZW5fcmVsZWFzZSkpOworCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIodm9pZCkKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKShTNVBfVkFfU0NVKTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZXh5bm9zNF9naWNfc2Vjb25kYXJ5X2luaXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZSA9IFM1UF9WQV9HSUNfRElTVCArCisJCQkJKGdpY19iYW5rX29mZnNldCAqIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJdm9pZCBfX2lvbWVtICpjcHVfYmFzZSA9IFM1UF9WQV9HSUNfQ1BVICsKKwkJCQkoZ2ljX2Jhbmtfb2Zmc2V0ICogc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpbnQgaTsKKworCS8qCisJICogRGVhbCB3aXRoIHRoZSBiYW5rZWQgUFBJIGFuZCBTR0kgaW50ZXJydXB0cyAtIGRpc2FibGUgYWxsCisJICogUFBJIGludGVycnVwdHMsIGVuc3VyZSBhbGwgU0dJIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisJICovCisJX19yYXdfd3JpdGVsKDB4ZmZmZjAwMDAsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUik7CisJX19yYXdfd3JpdGVsKDB4MDAwMGZmZmYsIGRpc3RfYmFzZSArIEdJQ19ESVNUX0VOQUJMRV9TRVQpOworCisJLyoKKwkgKiBTZXQgcHJpb3JpdHkgb24gUFBJIGFuZCBTR0kgaW50ZXJydXB0cworCSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSA0KQorCQlfX3Jhd193cml0ZWwoMHhhMGEwYTBhMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfUFJJICsgaSAqIDQgLyA0KTsKKworCV9fcmF3X3dyaXRlbCgweGYwLCBjcHVfYmFzZSArIEdJQ19DUFVfUFJJTUFTSyk7CisJX19yYXdfd3JpdGVsKDEsIGNwdV9iYXNlICsgR0lDX0NQVV9DVFJMKTsKK30KKwordm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIGlmIGFueSBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoZSBwcmltYXJ5CisJICogY29yZSAoZS5nLiB0aW1lciBpcnEpLCB0aGVuIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGVuYWJsZWQKKwkgKiBmb3IgdXM6IGRvIHNvCisJICovCisJZXh5bm9zNF9naWNfc2Vjb25kYXJ5X2luaXQoKTsKKworCS8qCisJICogbGV0IHRoZSBwcmltYXJ5IHByb2Nlc3NvciBrbm93IHdlJ3JlIG91dCBvZiB0aGUKKwkgKiBwZW4sIHRoZW4gaGVhZCBvZmYgaW50byB0aGUgQyBlbnRyeSBwb2ludAorCSAqLworCXdyaXRlX3Blbl9yZWxlYXNlKC0xKTsKKworCS8qCisJICogU3luY2hyb25pc2Ugd2l0aCB0aGUgYm9vdCB0aHJlYWQuCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKgorCSAqIFNldCBzeW5jaHJvbmlzYXRpb24gc3RhdGUgYmV0d2VlbiB0aGlzIGJvb3QgcHJvY2Vzc29yCisJICogYW5kIHRoZSBzZWNvbmRhcnkgb25lCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCisJLyoKKwkgKiBUaGUgc2Vjb25kYXJ5IHByb2Nlc3NvciBpcyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkIGZyb20KKwkgKiB0aGUgaG9sZGluZyBwZW4gLSByZWxlYXNlIGl0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZsYWcKKwkgKiB0aGF0IGl0IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHJlc2V0dGluZyBwZW5fcmVsZWFzZS4KKwkgKgorCSAqIE5vdGUgdGhhdCAicGVuX3JlbGVhc2UiIGlzIHRoZSBoYXJkd2FyZSBDUFUgSUQsIHdoZXJlYXMKKwkgKiAiY3B1IiBpcyBMaW51eCdzIGludGVybmFsIElELgorCSAqLworCXdyaXRlX3Blbl9yZWxlYXNlKGNwdV9sb2dpY2FsX21hcChjcHUpKTsKKworCWlmICghKF9fcmF3X3JlYWRsKFM1UF9BUk1fQ09SRTFfU1RBVFVTKSAmIFM1UF9DT1JFX0xPQ0FMX1BXUl9FTikpIHsKKwkJX19yYXdfd3JpdGVsKFM1UF9DT1JFX0xPQ0FMX1BXUl9FTiwKKwkJCSAgICAgUzVQX0FSTV9DT1JFMV9DT05GSUdVUkFUSU9OKTsKKworCQl0aW1lb3V0ID0gMTA7CisKKwkJLyogd2FpdCBtYXggMTAgbXMgdW50aWwgY3B1MSBpcyBvbiAqLworCQl3aGlsZSAoKF9fcmF3X3JlYWRsKFM1UF9BUk1fQ09SRTFfU1RBVFVTKQorCQkJJiBTNVBfQ09SRV9MT0NBTF9QV1JfRU4pICE9IFM1UF9DT1JFX0xPQ0FMX1BXUl9FTikgeworCQkJaWYgKHRpbWVvdXQtLSA9PSAwKQorCQkJCWJyZWFrOworCisJCQltZGVsYXkoMSk7CisJCX0KKworCQlpZiAodGltZW91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNwdTEgcG93ZXIgZW5hYmxlIGZhaWxlZCIpOworCQkJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0KKwkvKgorCSAqIFNlbmQgdGhlIHNlY29uZGFyeSBDUFUgYSBzb2Z0IGludGVycnVwdCwgdGhlcmVieSBjYXVzaW5nCisJICogdGhlIGJvb3QgbW9uaXRvciB0byByZWFkIHRoZSBzeXN0ZW0gd2lkZSBmbGFncyByZWdpc3RlciwKKwkgKiBhbmQgYnJhbmNoIHRvIHRoZSBhZGRyZXNzIGZvdW5kIHRoZXJlLgorCSAqLworCisJdGltZW91dCA9IGppZmZpZXMgKyAoMSAqIEhaKTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJc21wX3JtYigpOworCisJCV9fcmF3X3dyaXRlbChCU1lNKHZpcnRfdG9fcGh5cyhleHlub3M0X3NlY29uZGFyeV9zdGFydHVwKSksCisJCQlDUFUxX0JPT1RfUkVHKTsKKwkJZ2ljX3JhaXNlX3NvZnRpcnEoY3B1bWFza19vZihjcHUpLCAxKTsKKworCQlpZiAocGVuX3JlbGVhc2UgPT0gLTEpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCS8qCisJICogbm93IHRoZSBzZWNvbmRhcnkgY29yZSBpcyBzdGFydGluZyB1cCBsZXQgaXQgcnVuIGl0cworCSAqIGNhbGlicmF0aW9ucywgdGhlbiB3YWl0IGZvciBpdCB0byBmaW5pc2gKKwkgKi8KKwlzcGluX3VubG9jaygmYm9vdF9sb2NrKTsKKworCXJldHVybiBwZW5fcmVsZWFzZSAhPSAtMSA/IC1FTk9TWVMgOiAwOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgQ1BVIHBvc3NpYmxlIG1hcCBlYXJseSAtIHRoaXMgZGVzY3JpYmVzIHRoZSBDUFVzCisgKiB3aGljaCBtYXkgYmUgcHJlc2VudCBvciBiZWNvbWUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCisKK3ZvaWQgX19pbml0IHNtcF9pbml0X2NwdXModm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjdV9iYXNlID0gc2N1X2Jhc2VfYWRkcigpOworCXVuc2lnbmVkIGludCBpLCBuY29yZXM7CisKKwluY29yZXMgPSBzY3VfYmFzZSA/IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZSkgOiAxOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKG5jb3JlcyA+IG5yX2NwdV9pZHMpIHsKKwkJcHJfd2FybigiU01QOiAldSBjb3JlcyBncmVhdGVyIHRoYW4gbWF4aW11bSAoJXUpLCBjbGlwcGluZ1xuIiwKKwkJCW5jb3JlcywgbnJfY3B1X2lkcyk7CisJCW5jb3JlcyA9IG5yX2NwdV9pZHM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5jb3JlczsgaSsrKQorCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOworCisJc2V0X3NtcF9jcm9zc19jYWxsKGdpY19yYWlzZV9zb2Z0aXJxKTsKK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisKKwlzY3VfZW5hYmxlKHNjdV9iYXNlX2FkZHIoKSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBhZGRyZXNzIG9mIHNlY29uZGFyeSBzdGFydHVwIGludG8gdGhlCisJICogc3lzdGVtLXdpZGUgZmxhZ3MgcmVnaXN0ZXIuIFRoZSBib290IG1vbml0b3Igd2FpdHMKKwkgKiB1bnRpbCBpdCByZWNlaXZlcyBhIHNvZnQgaW50ZXJydXB0LCBhbmQgdGhlbiB0aGUKKwkgKiBzZWNvbmRhcnkgQ1BVIGJyYW5jaGVzIHRvIHRoaXMgYWRkcmVzcy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQlNZTSh2aXJ0X3RvX3BoeXMoZXh5bm9zNF9zZWNvbmRhcnlfc3RhcnR1cCkpLAorCQkJQ1BVMV9CT09UX1JFRyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9wbS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlhNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcG0uYwpAQCAtMCwwICsxLDQyOCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogRVhZTk9TNDIxMCAtIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydAorICoKKyAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9wbS5jCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorI2luY2x1ZGUgPHBsYXQvcGxsLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNyb20uaD4KKworI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KKyNpbmNsdWRlIDxtYWNoL3BtLWNvcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3BtdS5oPgorCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9zZXRfY2xrc3JjW10gPSB7CisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX1RPUAkJCSwgLnZhbCA9IDB4MDAwMDAwMDEsIH0sCisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0NBTQkJCSwgLnZhbCA9IDB4MTExMTExMTEsIH0sCisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX1RWCQkJLCAudmFsID0gMHgwMDAwMDExMSwgfSwKKwl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfTENEMAkJCSwgLnZhbCA9IDB4MDAwMDExMTEsIH0sCisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX01BVURJTwkJCSwgLnZhbCA9IDB4MDAwMDAwMDEsIH0sCisJeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0ZTWVMJCQksIC52YWwgPSAweDAxMDExMTExLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19QRVJJTDAJCQksIC52YWwgPSAweDAxMTExMTExLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19QRVJJTDEJCQksIC52YWwgPSAweDAxMTEwMTExLCB9LAorCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19ETUMJCQksIC52YWwgPSAweDAwMDEwMDAwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczQyMTBfc2V0X2Nsa3NyY1tdID0geworCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19MQ0QxCQkJLCAudmFsID0gMHgwMDAwMTExMSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X2VwbGxfc2F2ZVtdID0geworCVNBVkVfSVRFTShTNVBfRVBMTF9DT04wKSwKKwlTQVZFX0lURU0oUzVQX0VQTExfQ09OMSksCit9OworCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF92cGxsX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQX1ZQTExfQ09OMCksCisJU0FWRV9JVEVNKFM1UF9WUExMX0NPTjEpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfY29yZV9zYXZlW10gPSB7CisJLyogR0lDIHNpZGUgKi8KKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAwMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDA4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAwQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMTQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDE4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgwMDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDAwNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MTAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgxMDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDEwOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MzAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgzMDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDMwOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDAwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MDQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDBDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MTApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQxNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDE4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MUMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQyMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDI0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MjgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQyQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDMwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MzQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDNDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ0NCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDQ4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NEMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ1MCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDU0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NTgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ1QyksCisKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MDApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgwNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODA4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MEMpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgxMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODE0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MTgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgxQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODIwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MjQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyOCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODJDKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MzApLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgzNCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODM4KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4M0MpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg0MCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODQ0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NDgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg0QyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODUwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NTQpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1OCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODVDKSwKKworCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMwMCksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzA0KSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMDgpLAorCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMwQyksCisJU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzEwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMTQpLAorCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwMDApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDEwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDAyMCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwMzApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDQwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA1MCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwNjApLAorCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDcwKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA4MCksCisJU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwOTApLAorCisJLyogU1JPTSBzaWRlICovCisJU0FWRV9JVEVNKFM1UF9TUk9NX0JXKSwKKwlTQVZFX0lURU0oUzVQX1NST01fQkMwKSwKKwlTQVZFX0lURU0oUzVQX1NST01fQkMxKSwKKwlTQVZFX0lURU0oUzVQX1NST01fQkMyKSwKKwlTQVZFX0lURU0oUzVQX1NST01fQkMzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X2wyY2Nfc2F2ZVtdID0geworCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfVEFHX0xBVEVOQ1lfQ1RSTCksCisJU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9EQVRBX0xBVEVOQ1lfQ1RSTCksCisJU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9QUkVGRVRDSF9DVFJMKSwKKwlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX1BPV0VSX0NUUkwpLAorCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfQVVYX0NUUkwpLAorfTsKKworLyogRm9yIENvcnRleC1BOSBEaWFnbm9zdGljIGFuZCBQb3dlciBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNhdmVfYXJtX3JlZ2lzdGVyWzJdOworCitzdGF0aWMgaW50IGV4eW5vczRfY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJb3V0ZXJfZmx1c2hfYWxsKCk7CisKKwkvKiBpc3N1ZSB0aGUgc3RhbmRieSBzaWduYWwgaW50byB0aGUgcG0gdW5pdC4gKi8KKwljcHVfZG9faWRsZSgpOworCisJLyogd2Ugc2hvdWxkIG5ldmVyIGdldCBwYXN0IGhlcmUgKi8KKwlwYW5pYygic2xlZXAgcmVzdW1lZCB0byBvcmlnaW5hdG9yPyIpOworfQorCitzdGF0aWMgdm9pZCBleHlub3M0X3BtX3ByZXBhcmUodm9pZCkKK3sKKwl1MzIgdG1wOworCisJczNjX3BtX2RvX3NhdmUoZXh5bm9zNF9jb3JlX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9jb3JlX3NhdmUpKTsKKwlzM2NfcG1fZG9fc2F2ZShleHlub3M0X2wyY2Nfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2wyY2Nfc2F2ZSkpOworCXMzY19wbV9kb19zYXZlKGV4eW5vczRfZXBsbF9zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfZXBsbF9zYXZlKSk7CisJczNjX3BtX2RvX3NhdmUoZXh5bm9zNF92cGxsX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF92cGxsX3NhdmUpKTsKKworCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9JTkZPUk0xKTsKKworCS8qIFNldCB2YWx1ZSBvZiBwb3dlciBkb3duIHJlZ2lzdGVyIGZvciBzbGVlcCBtb2RlICovCisKKwlleHlub3M0X3N5c19wb3dlcmRvd25fY29uZihTWVNfU0xFRVApOworCV9fcmF3X3dyaXRlbChTNVBfQ0hFQ0tfU0xFRVAsIFM1UF9JTkZPUk0xKTsKKworCS8qIGVuc3VyZSBhdCBsZWFzdCBJTkZPUk0wIGhhcyB0aGUgcmVzdW1lIGFkZHJlc3MgKi8KKworCV9fcmF3X3dyaXRlbCh2aXJ0X3RvX3BoeXMoczNjX2NwdV9yZXN1bWUpLCBTNVBfSU5GT1JNMCk7CisKKwkvKiBCZWZvcmUgZW50ZXIgY2VudHJhbCBzZXF1ZW5jZSBtb2RlLCBjbG9jayBzcmMgcmVnaXN0ZXIgaGF2ZSB0byBzZXQgKi8KKworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9zZXRfY2xrc3JjLCBBUlJBWV9TSVpFKGV4eW5vczRfc2V0X2Nsa3NyYykpOworCisJaWYgKHNvY19pc19leHlub3M0MjEwKCkpCisJCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNDIxMF9zZXRfY2xrc3JjLCBBUlJBWV9TSVpFKGV4eW5vczQyMTBfc2V0X2Nsa3NyYykpOworCit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9wbV9hZGQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlwbV9jcHVfcHJlcCA9IGV4eW5vczRfcG1fcHJlcGFyZTsKKwlwbV9jcHVfc2xlZXAgPSBleHlub3M0X2NwdV9zdXNwZW5kOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY29weSBmcm9tIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9zbXBfc2N1LmMgKi8KKwordm9pZCBleHlub3M0X3NjdV9lbmFibGUodm9pZCBfX2lvbWVtICpzY3VfYmFzZSkKK3sKKwl1MzIgc2N1X2N0cmw7CisKKwlzY3VfY3RybCA9IF9fcmF3X3JlYWRsKHNjdV9iYXNlKTsKKwkvKiBhbHJlYWR5IGVuYWJsZWQ/ICovCisJaWYgKHNjdV9jdHJsICYgMSkKKwkJcmV0dXJuOworCisJc2N1X2N0cmwgfD0gMTsKKwlfX3Jhd193cml0ZWwoc2N1X2N0cmwsIHNjdV9iYXNlKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIGRhdGEgYWNjZXNzZWQgYnkgQ1BVMCBiZWZvcmUgdGhlIFNDVSB3YXMKKwkgKiBpbml0aWFsaXNlZCBpcyB2aXNpYmxlIHRvIHRoZSBvdGhlciBDUFVzLgorCSAqLworCWZsdXNoX2NhY2hlX2FsbCgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGxfYmFzZV9yYXRlOworCitzdGF0aWMgdm9pZCBleHlub3M0X3Jlc3RvcmVfcGxsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwbGxfY29uLCBsb2NrdGltZSwgbG9ja2NudDsKKwl1bnNpZ25lZCBsb25nIHBsbF9pbl9yYXRlOworCXVuc2lnbmVkIGludCBwX2RpdiwgZXBsbF93YWl0ID0gMCwgdnBsbF93YWl0ID0gMDsKKworCWlmIChwbGxfYmFzZV9yYXRlID09IDApCisJCXJldHVybjsKKworCXBsbF9pbl9yYXRlID0gcGxsX2Jhc2VfcmF0ZTsKKworCS8qIEVQTEwgKi8KKwlwbGxfY29uID0gZXh5bm9zNF9lcGxsX3NhdmVbMF0udmFsOworCisJaWYgKHBsbF9jb24gJiAoMSA8PCAzMSkpIHsKKwkJcGxsX2NvbiAmPSAoUExMNDZYWF9QRElWX01BU0sgPDwgUExMNDZYWF9QRElWX1NISUZUKTsKKwkJcF9kaXYgPSAocGxsX2NvbiA+PiBQTEw0NlhYX1BESVZfU0hJRlQpOworCisJCXBsbF9pbl9yYXRlIC89IDEwMDAwMDA7CisKKwkJbG9ja3RpbWUgPSAoMzAwMCAvIHBsbF9pbl9yYXRlKSAqIHBfZGl2OworCQlsb2NrY250ID0gbG9ja3RpbWUgKiAxMDAwMCAvICgxMDAwMCAvIHBsbF9pbl9yYXRlKTsKKworCQlfX3Jhd193cml0ZWwobG9ja2NudCwgUzVQX0VQTExfTE9DSyk7CisKKwkJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X2VwbGxfc2F2ZSwKKwkJCQkJQVJSQVlfU0laRShleHlub3M0X2VwbGxfc2F2ZSkpOworCQllcGxsX3dhaXQgPSAxOworCX0KKworCXBsbF9pbl9yYXRlID0gcGxsX2Jhc2VfcmF0ZTsKKworCS8qIFZQTEwgKi8KKwlwbGxfY29uID0gZXh5bm9zNF92cGxsX3NhdmVbMF0udmFsOworCisJaWYgKHBsbF9jb24gJiAoMSA8PCAzMSkpIHsKKwkJcGxsX2luX3JhdGUgLz0gMTAwMDAwMDsKKwkJLyogNzUwdXMgKi8KKwkJbG9ja3RpbWUgPSA3NTA7CisJCWxvY2tjbnQgPSBsb2NrdGltZSAqIDEwMDAwIC8gKDEwMDAwIC8gcGxsX2luX3JhdGUpOworCisJCV9fcmF3X3dyaXRlbChsb2NrY250LCBTNVBfVlBMTF9MT0NLKTsKKworCQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfdnBsbF9zYXZlLAorCQkJCQlBUlJBWV9TSVpFKGV4eW5vczRfdnBsbF9zYXZlKSk7CisJCXZwbGxfd2FpdCA9IDE7CisJfQorCisJLyogV2FpdCBQTEwgbG9ja2luZyAqLworCisJZG8geworCQlpZiAoZXBsbF93YWl0KSB7CisJCQlwbGxfY29uID0gX19yYXdfcmVhZGwoUzVQX0VQTExfQ09OMCk7CisJCQlpZiAocGxsX2NvbiAmICgxIDw8IFM1UF9FUExMQ09OMF9MT0NLRURfU0hJRlQpKQorCQkJCWVwbGxfd2FpdCA9IDA7CisJCX0KKworCQlpZiAodnBsbF93YWl0KSB7CisJCQlwbGxfY29uID0gX19yYXdfcmVhZGwoUzVQX1ZQTExfQ09OMCk7CisJCQlpZiAocGxsX2NvbiAmICgxIDw8IFM1UF9WUExMQ09OMF9MT0NLRURfU0hJRlQpKQorCQkJCXZwbGxfd2FpdCA9IDA7CisJCX0KKwl9IHdoaWxlIChlcGxsX3dhaXQgfHwgdnBsbF93YWl0KTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIGV4eW5vczRfcG1fZHJpdmVyID0geworCS5hZGQJCT0gZXh5bm9zNF9wbV9hZGQsCit9OworCitzdGF0aWMgX19pbml0IGludCBleHlub3M0X3BtX2RydmluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpwbGxfYmFzZTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJczNjX3BtX2luaXQoKTsKKworCS8qIEFsbCB3YWtldXAgZGlzYWJsZSAqLworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQX1dBS0VVUF9NQVNLKTsKKwl0bXAgfD0gKCgweEZGIDw8IDgpIHwgKDB4MUYgPDwgMSkpOworCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9XQUtFVVBfTUFTSyk7CisKKwlwbGxfYmFzZSA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKKworCWlmICghSVNfRVJSKHBsbF9iYXNlKSkgeworCQlwbGxfYmFzZV9yYXRlID0gY2xrX2dldF9yYXRlKHBsbF9iYXNlKTsKKwkJY2xrX3B1dChwbGxfYmFzZSk7CisJfQorCisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmV4eW5vczRfc3lzY2xhc3MsICZleHlub3M0X3BtX2RyaXZlcik7Cit9CithcmNoX2luaXRjYWxsKGV4eW5vczRfcG1fZHJ2aW5pdCk7CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9wbV9zdXNwZW5kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkvKiBTZXR0aW5nIENlbnRyYWwgU2VxdWVuY2UgUmVnaXN0ZXIgZm9yIHBvd2VyIGRvd24gbW9kZSAqLworCisJdG1wID0gX19yYXdfcmVhZGwoUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04pOworCXRtcCAmPSB+UzVQX0NFTlRSQUxfTE9XUFdSX0NGRzsKKwlfX3Jhd193cml0ZWwodG1wLCBTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7CisKKwlpZiAoc29jX2lzX2V4eW5vczQyMTIoKSkgeworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0VOVFJBTF9TRVFfT1BUSU9OKTsKKwkJdG1wICY9IH4oUzVQX1VTRV9TVEFOREJZV0ZJX0lTUF9BUk0gfAorCQkJIFM1UF9VU0VfU1RBTkRCWVdGRV9JU1BfQVJNKTsKKwkJX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NFTlRSQUxfU0VRX09QVElPTik7CisJfQorCisJLyogU2F2ZSBQb3dlciBjb250cm9sIHJlZ2lzdGVyICovCisJYXNtICgibXJjIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDAiCisJICAgICA6ICI9ciIgKHRtcCkgOiA6ICJjYyIpOworCXNhdmVfYXJtX3JlZ2lzdGVyWzBdID0gdG1wOworCisJLyogU2F2ZSBEaWFnbm9zdGljIHJlZ2lzdGVyICovCisJYXNtICgibXJjIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDEiCisJICAgICA6ICI9ciIgKHRtcCkgOiA6ICJjYyIpOworCXNhdmVfYXJtX3JlZ2lzdGVyWzFdID0gdG1wOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vczRfcG1fcmVzdW1lKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkvKgorCSAqIElmIFBNVSBmYWlsZWQgd2hpbGUgZW50ZXJpbmcgc2xlZXAgbW9kZSwgV0ZJIHdpbGwgYmUKKwkgKiBpZ25vcmVkIGJ5IFBNVSBhbmQgdGhlbiBleGl0aW5nIGNwdV9kb19pZGxlKCkuCisJICogUzVQX0NFTlRSQUxfTE9XUFdSX0NGRyBiaXQgd2lsbCBub3QgYmUgc2V0IGF1dG9tYXRpY2FsbHkKKwkgKiBpbiB0aGlzIHNpdHVhdGlvbi4KKwkgKi8KKwl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7CisJaWYgKCEodG1wICYgUzVQX0NFTlRSQUxfTE9XUFdSX0NGRykpIHsKKwkJdG1wIHw9IFM1UF9DRU5UUkFMX0xPV1BXUl9DRkc7CisJCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DRU5UUkFMX1NFUV9DT05GSUdVUkFUSU9OKTsKKwkJLyogTm8gbmVlZCB0byBwZXJmb3JtIGJlbG93IHJlc3RvcmUgY29kZSAqLworCQlnb3RvIGVhcmx5X3dha2V1cDsKKwl9CisJLyogUmVzdG9yZSBQb3dlciBjb250cm9sIHJlZ2lzdGVyICovCisJdG1wID0gc2F2ZV9hcm1fcmVnaXN0ZXJbMF07CisJYXNtIHZvbGF0aWxlICgibWNyIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDAiCisJCSAgICAgIDogOiAiciIgKHRtcCkKKwkJICAgICAgOiAiY2MiKTsKKworCS8qIFJlc3RvcmUgRGlhZ25vc3RpYyByZWdpc3RlciAqLworCXRtcCA9IHNhdmVfYXJtX3JlZ2lzdGVyWzFdOworCWFzbSB2b2xhdGlsZSAoIm1jciBwMTUsIDAsICUwLCBjMTUsIGMwLCAxIgorCQkgICAgICA6IDogInIiICh0bXApCisJCSAgICAgIDogImNjIik7CisKKwkvKiBGb3IgcmVsZWFzZSByZXRlbnRpb24gKi8KKworCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01BVURJT19PUFRJT04pOworCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX0dQSU9fT1BUSU9OKTsKKwlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9VQVJUX09QVElPTik7CisJX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfTU1DQV9PUFRJT04pOworCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01NQ0JfT1BUSU9OKTsKKwlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9FQklBX09QVElPTik7CisJX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfRUJJQl9PUFRJT04pOworCisJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X2NvcmVfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2NvcmVfc2F2ZSkpOworCisJZXh5bm9zNF9yZXN0b3JlX3BsbCgpOworCisJZXh5bm9zNF9zY3VfZW5hYmxlKFM1UF9WQV9TQ1UpOworCisjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKKwlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfbDJjY19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfbDJjY19zYXZlKSk7CisJb3V0ZXJfaW52X2FsbCgpOworCS8qIGVuYWJsZSBMMlgwKi8KKwl3cml0ZWxfcmVsYXhlZCgxLCBTNVBfVkFfTDJDQyArIEwyWDBfQ1RSTCk7CisjZW5kaWYKKworZWFybHlfd2FrZXVwOgorCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBleHlub3M0X3BtX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gZXh5bm9zNF9wbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZXh5bm9zNF9wbV9yZXN1bWUsCit9OworCitzdGF0aWMgX19pbml0IGludCBleHlub3M0X3BtX3N5c2NvcmVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZleHlub3M0X3BtX3N5c2NvcmVfb3BzKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZXh5bm9zNF9wbV9zeXNjb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvcG11LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE0OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvcG11LmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbXUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogRVhZTk9TNDIxMCAtIENQVSBQTVUoUG93ZXIgTWFuYWdlbWVudCBVbml0KSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvcG11Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgZXh5bm9zNF9wbXVfY29uZiAqZXh5bm9zNF9wbXVfY29uZmlnOworCitzdGF0aWMgc3RydWN0IGV4eW5vczRfcG11X2NvbmYgZXh5bm9zNDIxMF9wbXVfY29uZmlnW10gPSB7CisJLyogeyAucmVnID0gYWRkcmVzcywgLnZhbCA9IHsgQUZUUiwgTFBBLCBTTEVFUCB9ICovCisJeyBTNVBfQVJNX0NPUkUwX0xPV1BXUiwJCQl7IDB4MCwgMHgwLCAweDIgfSB9LAorCXsgUzVQX0RJU19JUlFfQ09SRTAsCQkJeyAweDAsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NFTlRSQUwwLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQVJNX0NPUkUxX0xPV1BXUiwJCQl7IDB4MCwgMHgwLCAweDIgfSB9LAorCXsgUzVQX0RJU19JUlFfQ09SRTEsCQkJeyAweDAsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NFTlRSQUwxLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQVJNX0NPTU1PTl9MT1dQV1IsCQl7IDB4MCwgMHgwLCAweDIgfSB9LAorCXsgUzVQX0wyXzBfTE9XUFdSLAkJCXsgMHgyLCAweDIsIDB4MyB9IH0sCisJeyBTNVBfTDJfMV9MT1dQV1IsCQkJeyAweDIsIDB4MiwgMHgzIH0gfSwKKwl7IFM1UF9DTVVfQUNMS1NUT1BfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfU0NMS1NUT1BfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfTE9XUFdSLAkJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQVBMTF9TWVNDTEtfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9NUExMX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1ZQTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRVBMTF9TWVNDTEtfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9HUFNfQUxJVkVfTE9XUFdSLAl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9HUFNBTElWRV9MT1dQV1IsCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfQ0FNX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfVFZfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9NRkNfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9HM0RfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfQ0xLU1RPUF9MQ0QwX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfTENEMV9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX01BVURJT19MT1dQV1IsCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfR1BTX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0NBTV9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9UVl9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9NRkNfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfRzNEX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0xDRDBfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfTENEMV9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9NQVVESU9fTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfR1BTX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfVE9QX0JVU19MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UT1BfUkVURU5USU9OX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MSB9IH0sCisJeyBTNVBfVE9QX1BXUl9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgzIH0gfSwKKwl7IFM1UF9MT0dJQ19SRVNFVF9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX09ORU5BTkRfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTU9ESU1JRl9NRU1fTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9HMkRfQUNQX01FTV9MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1VTQk9UR19NRU1fTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9IU01NQ19NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ1NTWVNfTUVNX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1NFQ1NTX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQ0lFX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9TQVRBX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0RSQU1fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fTUFVRElPX0xPV1BXUiwJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0dQSU9fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fVUFSVF9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9NTUNBX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX01NQ0JfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fRUJJQV9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9FQklCX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0lTT0xBVElPTl9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9BTFZfU0VMX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9YVVNCWFRJX0xPV1BXUiwJCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX1hYVElfTE9XUFdSLAkJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfRVhUX1JFR1VMQVRPUl9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0dQSU9fTU9ERV9MT1dQV1IsCQkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9HUElPX01PREVfTUFVRElPX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfQ0FNX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1RWX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX01GQ19MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9HM0RfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTENEMF9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9MQ0QxX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX01BVURJT19MT1dQV1IsCQkJeyAweDcsIDB4NywgMHgwIH0gfSwKKwl7IFM1UF9HUFNfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfR1BTX0FMSVZFX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUE1VX1RBQkxFX0VORCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBleHlub3M0X3BtdV9jb25mIGV4eW5vczQyMTJfcG11X2NvbmZpZ1tdID0geworCXsgUzVQX0FSTV9DT1JFMF9MT1dQV1IsCQkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NPUkUwLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9DRU5UUkFMMCwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0FSTV9DT1JFMV9MT1dQV1IsCQkJeyAweDAsIDB4MCwgMHgyIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0NPUkUxLAkJCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9DRU5UUkFMMSwJCQl7IDB4MCwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0lTUF9BUk1fTE9XUFdSLAkJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRElTX0lSUV9JU1BfQVJNX0xPQ0FMX0xPV1BXUiwJeyAweDAsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9ESVNfSVJRX0lTUF9BUk1fQ0VOVFJBTF9MT1dQV1IsCXsgMHgwLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQVJNX0NPTU1PTl9MT1dQV1IsCQl7IDB4MCwgMHgwLCAweDIgfSB9LAorCXsgUzVQX0wyXzBfTE9XUFdSLAkJCXsgMHgwLCAweDAsIDB4MyB9IH0sCisJLyogWFhYX09QVElPTiByZWdpc3RlciBzaG91bGQgYmUgc2V0IG90aGVyIGZpZWxkICovCisJeyBTNVBfQVJNX0wyXzBfT1BUSU9OLAkJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9MMl8xX0xPV1BXUiwJCQl7IDB4MCwgMHgwLCAweDMgfSB9LAorCXsgUzVQX0FSTV9MMl8xX09QVElPTiwJCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0FDTEtTVE9QX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1NDTEtTVE9QX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0xPV1BXUiwJCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0RSQU1fRlJFUV9ET1dOX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MSB9IH0sCisJeyBTNVBfRERSUEhZX0RMTE9GRl9MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDEgfSB9LAorCXsgUzVQX0xQRERSX1BIWV9ETExfTE9DS19MT1dQV1IsCXsgMHgxLCAweDEsIDB4MSB9IH0sCisJeyBTNVBfQ01VX0FDTEtTVE9QX0NPUkVCTEtfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9TQ0xLU1RPUF9DT1JFQkxLX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfQ09SRUJMS19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0FQTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfTVBMTF9TWVNDTEtfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9WUExMX1NZU0NMS19MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0VQTExfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfTVBMTFVTRVJfU1lTQ0xLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfR1BTX0FMSVZFX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfR1BTQUxJVkVfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0NBTV9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX1RWX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfTUZDX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfRzNEX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfTENEMF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX0lTUF9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9DTEtTVE9QX01BVURJT19MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX0NMS1NUT1BfR1BTX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0NBTV9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9UVl9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9NRkNfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfRzNEX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX0xDRDBfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9DTVVfUkVTRVRfSVNQX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1JFU0VUX01BVURJT19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX0NNVV9SRVNFVF9HUFNfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UT1BfQlVTX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1RPUF9SRVRFTlRJT05fTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgxIH0gfSwKKwl7IFM1UF9UT1BfUFdSX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDMgfSB9LAorCXsgUzVQX1RPUF9CVVNfQ09SRUJMS19MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1RPUF9SRVRFTlRJT05fQ09SRUJMS19MT1dQV1IsCXsgMHgxLCAweDAsIDB4MSB9IH0sCisJeyBTNVBfVE9QX1BXUl9DT1JFQkxLX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MyB9IH0sCisJeyBTNVBfTE9HSUNfUkVTRVRfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9PU0NDTEtfR0FURV9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDEgfSB9LAorCXsgUzVQX0xPR0lDX1JFU0VUX0NPUkVCTEtfTE9XUFdSLAl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX09TQ0NMS19HQVRFX0NPUkVCTEtfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDEgfSB9LAorCXsgUzVQX09ORU5BTkRfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfT05FTkFORF9NRU1fT1BUSU9OLAkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX0hTSV9NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfSFNJX01FTV9PUFRJT04sCQkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX0cyRF9BQ1BfTUVNX0xPV1BXUiwJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRzJEX0FDUF9NRU1fT1BUSU9OLAkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX1VTQk9UR19NRU1fTE9XUFdSLAkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9VU0JPVEdfTUVNX09QVElPTiwJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9IU01NQ19NRU1fTE9XUFdSLAkJCXsgMHgzLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfSFNNTUNfTUVNX09QVElPTiwJCQl7IDB4MTAsIDB4MTAsIDB4MCB9IH0sCisJeyBTNVBfQ1NTWVNfTUVNX0xPV1BXUiwJCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NTU1lTX01FTV9PUFRJT04sCQkJeyAweDEwLCAweDEwLCAweDAgfSB9LAorCXsgUzVQX1NFQ1NTX01FTV9MT1dQV1IsCQkJeyAweDMsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9TRUNTU19NRU1fT1BUSU9OLAkJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9ST1RBVE9SX01FTV9MT1dQV1IsCQl7IDB4MywgMHgwLCAweDAgfSB9LAorCXsgUzVQX1JPVEFUT1JfTUVNX09QVElPTiwJCXsgMHgxMCwgMHgxMCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0RSQU1fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fTUFVRElPX0xPV1BXUiwJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0dQSU9fTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fVUFSVF9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9NTUNBX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX01NQ0JfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1BBRF9SRVRFTlRJT05fRUJJQV9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX1JFVEVOVElPTl9FQklCX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0dQSU9fQ09SRUJMS19MT1dQV1IseyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0lTT0xBVElPTl9MT1dQV1IsCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfUEFEX0lTT0xBVElPTl9DT1JFQkxLX0xPV1BXUiwJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9QQURfUkVURU5USU9OX0FMVl9TRUxfTE9XUFdSLAl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX1hVU0JYVElfTE9XUFdSLAkJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfWFhUSV9MT1dQV1IsCQkJeyAweDEsIDB4MSwgMHgwIH0gfSwKKwl7IFM1UF9FWFRfUkVHVUxBVE9SX0xPV1BXUiwJCXsgMHgxLCAweDEsIDB4MCB9IH0sCisJeyBTNVBfR1BJT19NT0RFX0xPV1BXUiwJCQl7IDB4MSwgMHgwLCAweDAgfSB9LAorCXsgUzVQX0dQSU9fTU9ERV9DT1JFQkxLX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfR1BJT19NT0RFX01BVURJT19MT1dQV1IsCQl7IDB4MSwgMHgxLCAweDAgfSB9LAorCXsgUzVQX1RPUF9BU0JfUkVTRVRfTE9XUFdSLAkJeyAweDEsIDB4MSwgMHgxIH0gfSwKKwl7IFM1UF9UT1BfQVNCX0lTT0xBVElPTl9MT1dQV1IsCQl7IDB4MSwgMHgwLCAweDEgfSB9LAorCXsgUzVQX0NBTV9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9UVl9MT1dQV1IsCQkJeyAweDcsIDB4MCwgMHgwIH0gfSwKKwl7IFM1UF9NRkNfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfRzNEX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0xDRDBfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfSVNQX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX01BVURJT19MT1dQV1IsCQkJeyAweDcsIDB4NywgMHgwIH0gfSwKKwl7IFM1UF9HUFNfTE9XUFdSLAkJCXsgMHg3LCAweDAsIDB4MCB9IH0sCisJeyBTNVBfR1BTX0FMSVZFX0xPV1BXUiwJCQl7IDB4NywgMHgwLCAweDAgfSB9LAorCXsgUzVQX0NNVV9TWVNDTEtfSVNQX0xPV1BXUiwJCXsgMHgxLCAweDAsIDB4MCB9IH0sCisJeyBTNVBfQ01VX1NZU0NMS19HUFNfTE9XUFdSLAkJeyAweDEsIDB4MCwgMHgwIH0gfSwKKwl7IFBNVV9UQUJMRV9FTkQsfSwKK307CisKK3ZvaWQgZXh5bm9zNF9zeXNfcG93ZXJkb3duX2NvbmYoZW51bSBzeXNfcG93ZXJkb3duIG1vZGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyAoZXh5bm9zNF9wbXVfY29uZmlnW2ldLnJlZyAhPSBQTVVfVEFCTEVfRU5EKSA7IGkrKykKKwkJX19yYXdfd3JpdGVsKGV4eW5vczRfcG11X2NvbmZpZ1tpXS52YWxbbW9kZV0sCisJCQkJZXh5bm9zNF9wbXVfY29uZmlnW2ldLnJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGV4eW5vczRfcG11X2luaXQodm9pZCkKK3sKKwlleHlub3M0X3BtdV9jb25maWcgPSBleHlub3M0MjEwX3BtdV9jb25maWc7CisKKwlpZiAoc29jX2lzX2V4eW5vczQyMTAoKSkgeworCQlleHlub3M0X3BtdV9jb25maWcgPSBleHlub3M0MjEwX3BtdV9jb25maWc7CisJCXByX2luZm8oIkVYWU5PUzQyMTAgUE1VIEluaXRpYWxpemVcbiIpOworCX0gZWxzZSBpZiAoc29jX2lzX2V4eW5vczQyMTIoKSkgeworCQlleHlub3M0X3BtdV9jb25maWcgPSBleHlub3M0MjEyX3BtdV9jb25maWc7CisJCXByX2luZm8oIkVYWU5PUzQyMTIgUE1VIEluaXRpYWxpemVcbiIpOworCX0gZWxzZSB7CisJCXByX2luZm8oIkVYWU5PUzQ6IFBNVSBub3Qgc3VwcG9ydGVkXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZXh5bm9zNF9wbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtZmltYy5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtZmltYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtZmltYy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1maW1jLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1maW1kMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtZmltZDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWZpbWQwLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWZpbWQwLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMwLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzEuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzEuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjMS5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMi5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjMi5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMzLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmMzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmMzLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzQuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzQuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjNC5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjNS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjNS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtaTJjNS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmM1LmMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM2LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1pMmM2LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1pMmM2LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzYuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzcuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLWkyYzcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWkyYzcuYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtaTJjNy5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAta2V5cGFkLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1rZXlwYWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLWtleXBhZC5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1rZXlwYWQuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLWdwaW8uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLXNkaGNpLWdwaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLWdwaW8uYwpyZW5hbWUgdG8gYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtc2RoY2ktZ3Bpby5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtc2RoY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjkzN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2V0dXAtc2RoY2kuYwpAQCAtMCwwICsxLDIyIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtc2RoY2kuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEVYWU5PUzQgLSBIZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aWduIHVwIFNESENJIGRldmljZShzKSAoSFNNTUMpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLworCitjaGFyICpleHlub3M0X2hzbW1jX2Nsa3NyY3NbNF0gPSB7CisJWzBdID0gTlVMTCwKKwlbMV0gPSBOVUxMLAorCVsyXSA9ICJzY2xrX21tYyIsCS8qIG1tY19idXMgKi8KKwlbM10gPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC11c2ItcGh5LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zZXR1cC11c2ItcGh5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC11c2ItcGh5LmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtZXh5bm9zL3NldHVwLXVzYi1waHkuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxZjkyZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9LY29uZmlnCi0jCi0jIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0jCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotIwotIyBMaWNlbnNlZCB1bmRlciBHUEx2MgotCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEVYWU5PUzQKLQotaWYgQVJDSF9FWFlOT1M0Ci0KLWNvbmZpZyBDUFVfRVhZTk9TNDIxMAotCWJvb2wKLQlzZWxlY3QgUzNDX1BMMzMwX0RNQQotCXNlbGVjdCBBUk1fQ1BVX1NVU1BFTkQgaWYgUE0KLQloZWxwCi0JICBFbmFibGUgRVhZTk9TNDIxMCBDUFUgc3VwcG9ydAotCi1jb25maWcgRVhZTk9TNF9NQ1QKLQlib29sCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVXNlIE1DVCAoTXVsdGkgQ29yZSBUaW1lcikgYXMga2VybmVsIHRpbWVycwotCi1jb25maWcgRVhZTk9TNF9ERVZfQUhDSQotCWJvb2wKLQloZWxwCi0JICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgQUhDSQotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9GSU1EMAotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgRklNRDAuCi0KLWNvbmZpZyBFWFlOT1M0X0RFVl9QRAotCWJvb2wKLQloZWxwCi0JICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgUG93ZXIgRG9tYWluCi0KLWNvbmZpZyBFWFlOT1M0X0RFVl9TWVNNTVUKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFNZU1RFTSBNTVUgaW4gRVhZTk9TNAotCi1jb25maWcgRVhZTk9TNF9ERVZfRFdNQ0kKLQlib29sCi0JaGVscAotCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIERXTUNJCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzEKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgMS4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDMgotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyAyLgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9JMkMzCi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDMuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzQKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNC4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfSTJDNQotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgaTJjIGJ1cyA1LgotCi1jb25maWcgRVhZTk9TNF9TRVRVUF9JMkM2Ci0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBpMmMgYnVzIDYuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0kyQzcKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIGkyYyBidXMgNy4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfS0VZUEFECi0JYm9vbAotCWhlbHAKLQkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBrZXlwYWQuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX1NESENJCi0JYm9vbAotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX1NESENJX0dQSU8KLQloZWxwCi0JICBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvciBFWFlOT1M0IGJhc2VkIFNESENJIHN5c3RlbXMuCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX1NESENJX0dQSU8KLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIFNESENJIGdwaW8uCi0KLWNvbmZpZyBFWFlOT1M0X1NFVFVQX0ZJTUMKLQlib29sCi0JaGVscAotCSAgQ29tbW9uIHNldHVwIGNvZGUgZm9yIHRoZSBjYW1lcmEgaW50ZXJmYWNlcy4KLQotY29uZmlnIEVYWU5PUzRfU0VUVVBfVVNCX1BIWQotCWJvb2wKLQloZWxwCi0JICBDb21tb24gc2V0dXAgY29kZSBmb3IgVVNCIFBIWSBjb250cm9sbGVyCi0KLSMgbWFjaGluZSBzdXBwb3J0Ci0KLW1lbnUgIkVYWU5PUzQgTWFjaGluZXMiCi0KLWNvbmZpZyBNQUNIX1NNREtDMjEwCi0JYm9vbCAiU01ES0MyMTAiCi0Jc2VsZWN0IENQVV9FWFlOT1M0MjEwCi0Jc2VsZWN0IFM1UF9ERVZfRklNRDAKLQlzZWxlY3QgUzNDX0RFVl9SVEMKLQlzZWxlY3QgUzNDX0RFVl9XRFQKLQlzZWxlY3QgUzNDX0RFVl9JMkMxCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzEKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzIKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzMKLQlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCi0Jc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAotCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAotCXNlbGVjdCBFWFlOT1M0X0RFVl9TWVNNTVUKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9GSU1EMAotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzEKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQotCWhlbHAKLQkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBTTURLQzIxMAotCi1jb25maWcgTUFDSF9TTURLVjMxMAotCWJvb2wgIlNNREtWMzEwIgotCXNlbGVjdCBDUFVfRVhZTk9TNDIxMAotCXNlbGVjdCBTNVBfREVWX0ZJTUQwCi0Jc2VsZWN0IFMzQ19ERVZfUlRDCi0Jc2VsZWN0IFMzQ19ERVZfV0RUCi0Jc2VsZWN0IFMzQ19ERVZfSTJDMQotCXNlbGVjdCBTM0NfREVWX0hTTU1DCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMxCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMyCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMzCi0Jc2VsZWN0IFNBTVNVTkdfREVWX0JBQ0tMSUdIVAotCXNlbGVjdCBFWFlOT1M0X0RFVl9BSENJCi0Jc2VsZWN0IFNBTVNVTkdfREVWX0tFWVBBRAotCXNlbGVjdCBFWFlOT1M0X0RFVl9QRAotCXNlbGVjdCBTQU1TVU5HX0RFVl9QV00KLQlzZWxlY3QgRVhZTk9TNF9ERVZfU1lTTU1VCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfRklNRDAKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkMxCi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfS0VZUEFECi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKLQloZWxwCi0JICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgU01ES1YzMTAKLQotY29uZmlnIE1BQ0hfQVJNTEVYNDIxMAotCWJvb2wgIkFSTUxFWDQyMTAiCi0Jc2VsZWN0IENQVV9FWFlOT1M0MjEwCi0Jc2VsZWN0IFMzQ19ERVZfUlRDCi0Jc2VsZWN0IFMzQ19ERVZfV0RUCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzIKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzMKLQlzZWxlY3QgRVhZTk9TNF9ERVZfQUhDSQotCXNlbGVjdCBFWFlOT1M0X0RFVl9TWVNNTVUKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9TREhDSQotCWhlbHAKLQkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgU2Ftc3VuZyBBUk1MRVg0MjEwIGJhc2VkIG9uIEVYWU5PUzQyMTAKLQotY29uZmlnIE1BQ0hfVU5JVkVSU0FMX0MyMTAKLQlib29sICJNb2JpbGUgVU5JVkVSU0FMX0MyMTAgQm9hcmQiCi0Jc2VsZWN0IENQVV9FWFlOT1M0MjEwCi0Jc2VsZWN0IFM1UF9HUElPX0lOVAotCXNlbGVjdCBTNVBfREVWX0ZJTUMwCi0Jc2VsZWN0IFM1UF9ERVZfRklNQzEKLQlzZWxlY3QgUzVQX0RFVl9GSU1DMgotCXNlbGVjdCBTNVBfREVWX0ZJTUMzCi0Jc2VsZWN0IFMzQ19ERVZfSFNNTUMKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzIKLQlzZWxlY3QgUzNDX0RFVl9IU01NQzMKLQlzZWxlY3QgUzNDX0RFVl9JMkMxCi0Jc2VsZWN0IFMzQ19ERVZfSTJDMwotCXNlbGVjdCBTM0NfREVWX0kyQzUKLQlzZWxlY3QgUzVQX0RFVl9NRkMKLQlzZWxlY3QgUzVQX0RFVl9PTkVOQU5ECi0Jc2VsZWN0IEVYWU5PUzRfREVWX1BECi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzMKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkM1Ci0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKLQloZWxwCi0JICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIFVuaXZlcnNhbCBTNVBDMjEwIFJlZmVyZW5jZQotCSAgQm9hcmQuCi0KLWNvbmZpZyBNQUNIX05VUkkKLQlib29sICJNb2JpbGUgTlVSSSBCb2FyZCIKLQlzZWxlY3QgQ1BVX0VYWU5PUzQyMTAKLQlzZWxlY3QgUzNDX0RFVl9XRFQKLQlzZWxlY3QgUzNDX0RFVl9IU01NQwotCXNlbGVjdCBTM0NfREVWX0hTTU1DMgotCXNlbGVjdCBTM0NfREVWX0hTTU1DMwotCXNlbGVjdCBTM0NfREVWX0kyQzEKLQlzZWxlY3QgUzNDX0RFVl9JMkMzCi0Jc2VsZWN0IFMzQ19ERVZfSTJDNQotCXNlbGVjdCBTNVBfREVWX01GQwotCXNlbGVjdCBTNVBfREVWX1VTQl9FSENJCi0Jc2VsZWN0IEVYWU5PUzRfREVWX1BECi0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfSTJDMQotCXNlbGVjdCBFWFlOT1M0X1NFVFVQX0kyQzMKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9JMkM1Ci0Jc2VsZWN0IEVYWU5PUzRfU0VUVVBfU0RIQ0kKLQlzZWxlY3QgRVhZTk9TNF9TRVRVUF9VU0JfUEhZCi0Jc2VsZWN0IFNBTVNVTkdfREVWX1BXTQotCXNlbGVjdCBTQU1TVU5HX0RFVl9BREMKLQloZWxwCi0JICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgTW9iaWxlIE5VUkkgQm9hcmQuCi0KLWVuZG1lbnUKLQotY29tbWVudCAiQ29uZmlndXJhdGlvbiBmb3IgSFNNTUMgYnVzIHdpZHRoIgotCi1tZW51ICJVc2UgOC1iaXQgYnVzIHdpZHRoIgotCi1jb25maWcgRVhZTk9TNF9TREhDSV9DSDBfOEJJVAotCWJvb2wgIkNoYW5uZWwgMCB3aXRoIDgtYml0IGJ1cyIKLQloZWxwCi0JICBTdXBwb3J0IEhTTU1DIENoYW5uZWwgMCA4LWJpdCBidXMuCi0JICBJZiBzZWxlY3RlZCwgQ2hhbm5lbCAxIGlzIGRpc2FibGVkLgotCi1jb25maWcgRVhZTk9TNF9TREhDSV9DSDJfOEJJVAotCWJvb2wgIkNoYW5uZWwgMiB3aXRoIDgtYml0IGJ1cyIKLQloZWxwCi0JICBTdXBwb3J0IEhTTU1DIENoYW5uZWwgMiA4LWJpdCBidXMuCi0JICBJZiBzZWxlY3RlZCwgQ2hhbm5lbCAzIGlzIGRpc2FibGVkLgotCi1lbmRtZW51Ci0KLWVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmUxZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBhcmNoL2FybS9tYWNoLWV4eW5vczQvTWFrZWZpbGUKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSMJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0jCi0jIExpY2Vuc2VkIHVuZGVyIEdQTHYyCi0KLW9iai15CQkJCTo9Ci1vYmotbQkJCQk6PQotb2JqLW4JCQkJOj0KLW9iai0JCQkJOj0KLQotIyBDb3JlIHN1cHBvcnQgZm9yIEVYWU5PUzQgc3lzdGVtCi0KLW9iai0kKENPTkZJR19DUFVfRVhZTk9TNDIxMCkJKz0gY3B1Lm8gaW5pdC5vIGNsb2NrLm8gaXJxLWNvbWJpbmVyLm8KLW9iai0kKENPTkZJR19DUFVfRVhZTk9TNDIxMCkJKz0gc2V0dXAtaTJjMC5vIGlycS1laW50Lm8gZG1hLm8gcG11Lm8KLW9iai0kKENPTkZJR19QTSkJCSs9IHBtLm8gc2xlZXAubwotb2JqLSQoQ09ORklHX0NQVV9JRExFKQkJKz0gY3B1aWRsZS5vCi0KLW9iai0kKENPTkZJR19TTVApCQkrPSBwbGF0c21wLm8gaGVhZHNtcC5vCi0KLW9iai0kKENPTkZJR19FWFlOT1M0X01DVCkJKz0gbWN0Lm8KLQotb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBob3RwbHVnLm8KLQotIyBtYWNoaW5lIHN1cHBvcnQKLQotb2JqLSQoQ09ORklHX01BQ0hfU01ES0MyMTApCQkrPSBtYWNoLXNtZGtjMjEwLm8KLW9iai0kKENPTkZJR19NQUNIX1NNREtWMzEwKQkJKz0gbWFjaC1zbWRrdjMxMC5vCi1vYmotJChDT05GSUdfTUFDSF9BUk1MRVg0MjEwKQkJKz0gbWFjaC1hcm1sZXg0MjEwLm8KLW9iai0kKENPTkZJR19NQUNIX1VOSVZFUlNBTF9DMjEwKQkrPSBtYWNoLXVuaXZlcnNhbF9jMjEwLm8KLW9iai0kKENPTkZJR19NQUNIX05VUkkpCQkJKz0gbWFjaC1udXJpLm8KLQotIyBkZXZpY2Ugc3VwcG9ydAotCi1vYmoteQkJCQkJKz0gZGV2LWF1ZGlvLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X0RFVl9BSENJKQkJKz0gZGV2LWFoY2kubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX1BEKQkJKz0gZGV2LXBkLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X0RFVl9TWVNNTVUpCSs9IGRldi1zeXNtbXUubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfREVWX0RXTUNJKQkrPSBkZXYtZHdtY2kubwotCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9GSU1DKQkrPSBzZXR1cC1maW1jLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0ZJTUQwKQkrPSBzZXR1cC1maW1kMC5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkMxKQkrPSBzZXR1cC1pMmMxLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzIpCSs9IHNldHVwLWkyYzIubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDMykJKz0gc2V0dXAtaTJjMy5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM0KQkrPSBzZXR1cC1pMmM0Lm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0kyQzUpCSs9IHNldHVwLWkyYzUubwotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfSTJDNikJKz0gc2V0dXAtaTJjNi5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9JMkM3KQkrPSBzZXR1cC1pMmM3Lm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX0tFWVBBRCkJKz0gc2V0dXAta2V5cGFkLm8KLW9iai0kKENPTkZJR19FWFlOT1M0X1NFVFVQX1NESENJKQkrPSBzZXR1cC1zZGhjaS5vCi1vYmotJChDT05GSUdfRVhZTk9TNF9TRVRVUF9TREhDSV9HUElPKQkrPSBzZXR1cC1zZGhjaS1ncGlvLm8KLQotb2JqLSQoQ09ORklHX0VYWU5PUzRfU0VUVVBfVVNCX1BIWSkJKz0gc2V0dXAtdXNiLXBoeS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njk2NGQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY2xvY2suYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBDbG9jayBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgotI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvcGxsLmg+Ci0jaW5jbHVkZSA8cGxhdC9zNXAtY2xvY2suaD4KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLWNsa3NyYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3N5c21tdS5oPgotCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pMjdtID0gewotCS5uYW1lCQk9ICJzY2xrX2hkbWkyN20iLAotCS5yYXRlCQk9IDI3MDAwMDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3NjbGtfaGRtaXBoeSA9IHsKLQkubmFtZQkJPSAic2Nsa19oZG1pcGh5IiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNsa19zY2xrX3VzYnBoeTAgPSB7Ci0JLm5hbWUJCT0gInNjbGtfdXNicGh5MCIsCi0JLnJhdGUJCT0gMjcwMDAwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa191c2JwaHkxID0gewotCS5uYW1lCQk9ICJzY2xrX3VzYnBoeTEiLAotfTsKLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3RvcF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19UT1AsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19DQU0sIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX2xjZDBfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLU1JDX01BU0tfTENEMCwgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19MQ0QxLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS1NSQ19NQVNLX0ZTWVMsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19QRVJJTDAsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtTUkNfTUFTS19QRVJJTDEsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9tZmNfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9NRkMsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9jYW1fY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9DQU0sIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF90dl9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX1RWLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9JTUFHRSwgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX2xjZDBfY3RybChzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JcmV0dXJuIHM1cF9nYXRlY3RybChTNVBfQ0xLR0FURV9JUF9MQ0QwLCBjbGssIGVuYWJsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaXBfbGNkMV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX0xDRDEsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfRlNZUywgY2xrLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0NMS0dBVEVfSVBfUEVSSUwsIGNsaywgZW5hYmxlKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtHQVRFX0lQX1BFUklSLCBjbGssIGVuYWJsZSk7Ci19Ci0KLS8qIENvcmUgbGlzdCBvZiBDTVVfQ1BVIHNpZGUgKi8KLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2FwbGwgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfYXBsbCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtfc3JjX2FwbGwsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfYXBsbCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAic2Nsa19hcGxsIiwKLQkJLnBhcmVudAkJPSAmY2xrX21vdXRfYXBsbC5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZXBsbCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dF9lcGxsIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa19zcmNfZXBsbCwKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbXBsbCA9IHsKLQkuY2xrID0gewotCQkubmFtZQkJPSAibW91dF9tcGxsIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa19zcmNfbXBsbCwKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ1BVLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dGNvcmVfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9hcGxsLmNsaywKLQlbMV0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0Y29yZSA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9tb3V0Y29yZV9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dGNvcmVfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRjb3JlID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJtb3V0Y29yZSIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfbW91dGNvcmUsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NQVSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19jb3JlY2xrID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJjb3JlX2NsayIsCi0JCS5wYXJlbnQJCT0gJmNsa19tb3V0Y29yZS5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYXJtY2xrID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhcm1jbGsiLAotCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlbTAgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfY29yZW0wIiwKLQkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfY29yZXMgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfY29yZXMiLAotCQkucGFyZW50CQk9ICZjbGtfY29yZWNsay5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ1BVLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlbTEgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfY29yZW0xIiwKLQkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gOCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BlcmlwaGNsayA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAicGVyaXBoY2xrIiwKLQkJLnBhcmVudAkJPSAmY2xrX2NvcmVjbGsuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NQVSwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LAotfTsKLQotLyogQ29yZSBsaXN0IG9mIENNVV9DT1JFIHNpZGUgKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9jb3JlYnVzX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfbXBsbC5jbGssCi0JWzFdID0gJmNsa19zY2xrX2FwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9jb3JlYnVzID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X2NvcmVidXNfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X2NvcmVidXNfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfY29yZWJ1cyA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dF9jb3JlYnVzIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X2NvcmVidXMsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0RNQywgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3NjbGtfZG1jID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJzY2xrX2RtYyIsCi0JCS5wYXJlbnQJCT0gJmNsa19tb3V0X2NvcmVidXMuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDEyLCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19jb3JlZCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYWNsa19jb3JlZCIsCi0JCS5wYXJlbnQJCT0gJmNsa19zY2xrX2RtYy5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrX2NvcmVwID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrX2NvcmVwIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfY29yZWQuY2xrLAotCX0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0RNQzAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa19hY3AgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfYWNwIiwKLQkJLnBhcmVudAkJPSAmY2xrX21vdXRfY29yZWJ1cy5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX3BjbGtfYWNwID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJwY2xrX2FjcCIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrX2FjcC5jbGssCi0JfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfRE1DMCwgLnNoaWZ0ID0gNCwgLnNpemUgPSAzIH0sCi19OwotCi0vKiBDb3JlIGxpc3Qgb2YgQ01VX1RPUCBzaWRlICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfYWNsa190b3BfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKLQlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9hY2xrID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X2FjbGtfdG9wX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9hY2xrX3RvcF9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18yMDAgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfMjAwIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSAxIH0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RPUCwgLnNoaWZ0ID0gMCwgLnNpemUgPSAzIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2FjbGtfMTAwID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhY2xrXzEwMCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfYWNsaywKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfVE9QMCwgLnNoaWZ0ID0gMTYsIC5zaXplID0gMSB9LAotCS5yZWdfZGl2CT0geyAucmVnID0gUzVQX0NMS0RJVl9UT1AsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hY2xrXzE2MCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiYWNsa18xNjAiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X2FjbGssCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1RPUDAsIC5zaGlmdCA9IDIwLCAuc2l6ZSA9IDEgfSwKLQkucmVnX2Rpdgk9IHsgLnJlZyA9IFM1UF9DTEtESVZfVE9QLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDMgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYWNsa18xMzMgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImFjbGtfMTMzIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9hY2xrLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCi0JLnJlZ19kaXYJPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1RPUCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gMyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF92cGxsc3JjX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX2Zpbl92cGxsLAotCVsxXSA9ICZjbGtfc2Nsa19oZG1pMjdtLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfdnBsbHNyYyA9IHsKLQkuc291cmNlcwk9IGNsa3NldF92cGxsc3JjX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF92cGxsc3JjX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa192cGxsc3JjID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJ2cGxsX3NyYyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza190b3BfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF92cGxsc3JjLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfc2Nsa192cGxsX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX3ZwbGxzcmMuY2xrLAotCVsxXSA9ICZjbGtfZm91dF92cGxsLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfc2Nsa192cGxsID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X3NjbGtfdnBsbF9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfc2Nsa192cGxsX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX3ZwbGwgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gInNjbGtfdnBsbCIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfc2Nsa192cGxsLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19UT1AwLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewotCXsKLQkJLm5hbWUJCT0gInRpbWVycyIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMTw8MjQpLAotCX0sIHsKLQkJLm5hbWUJCT0gImNzaXMiLAotCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCX0sIHsKLQkJLm5hbWUJCT0gImNzaXMiLAotCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDUpLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWMiLAotCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMCksCi0JfSwgewotCQkubmFtZQkJPSAiZmltYyIsCi0JCS5kZXZuYW1lCT0gImV4eW5vczQtZmltYy4xIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJmaW1jIiwKLQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjIiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDIpLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWMiLAotCQkuZGV2bmFtZQk9ICJleHlub3M0LWZpbWMuMyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMyksCi0JfSwgewotCQkubmFtZQkJPSAiZmltZCIsCi0JCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfbGNkMF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDApLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWQiLAotCQkuZGV2bmFtZQk9ICJleHlub3M0LWZiLjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2xjZDFfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJzYXRhcGh5IiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMyksCi0JfSwgewotCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMCIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDUpLAotCX0sIHsKLQkJLm5hbWUJCT0gImhzbW1jIiwKLQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjEiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMzMuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA2KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJoc21tYyIsCi0JCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNyksCi0JfSwgewotCQkubmFtZQkJPSAiaHNtbWMiLAotCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMyIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDgpLAotCX0sIHsKLQkJLm5hbWUJCT0gImR3bW1jIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTMzLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgOSksCi0JfSwgewotCQkubmFtZQkJPSAic2F0YSIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEzMy5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDEwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJwZG1hIiwKLQkJLmRldm5hbWUJPSAiczNjLXBsMzMwLjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJhZGMiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTUpLAotCX0sIHsKLQkJLm5hbWUJCT0gImtleXBhZCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCi0JfSwgewotCQkubmFtZQkJPSAicnRjIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpcl9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDE1KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaXJfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxNCksCi0JfSwgewotCQkubmFtZQkJPSAidXNiaG9zdCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfZnN5c19jdHJsICwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCi0JfSwgewotCQkubmFtZQkJPSAib3RnIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9mc3lzX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTMpLAotCX0sIHsKLQkJLm5hbWUJCT0gInNwaSIsCi0JCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTYpLAotCX0sIHsKLQkJLm5hbWUJCT0gInNwaSIsCi0JCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTcpLAotCX0sIHsKLQkJLm5hbWUJCT0gInNwaSIsCi0JCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjIiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTgpLAotCX0sIHsKLQkJLm5hbWUJCT0gImlpcyIsCi0JCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjAiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTkpLAotCX0sIHsKLQkJLm5hbWUJCT0gImlpcyIsCi0JCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjEiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMjApLAotCX0sIHsKLQkJLm5hbWUJCT0gImlpcyIsCi0JCS5kZXZuYW1lCT0gInNhbXN1bmctaTJzLjIiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMjEpLAotCX0sIHsKLQkJLm5hbWUJCT0gImFjOTciLAotCQkuZGV2bmFtZQk9ICJzYW1zdW5nLWFjOTciLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMjcpLAotCX0sIHsKLQkJLm5hbWUJCT0gImZpbWcyZCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJtZmMiLAotCQkuZGV2bmFtZQk9ICJzNXAtbWZjIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4wIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDYpLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjEiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNyksCi0JfSwgewotCQkubmFtZQkJPSAiaTJjIiwKLQkJLmRldm5hbWUJPSAiczNjMjQ0MC1pMmMuMiIsCi0JCS5wYXJlbnQJCT0gJmNsa19hY2xrXzEwMC5jbGssCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJpMmMiLAotCQkuZGV2bmFtZQk9ICJzM2MyNDQwLWkyYy4zIiwKLQkJLnBhcmVudAkJPSAmY2xrX2FjbGtfMTAwLmNsaywKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDkpLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjQiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTApLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjUiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTEpLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjYiLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTIpLAotCX0sIHsKLQkJLm5hbWUJCT0gImkyYyIsCi0JCS5kZXZuYW1lCT0gInMzYzI0NDAtaTJjLjciLAotCQkucGFyZW50CQk9ICZjbGtfYWNsa18xMDAuY2xrLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTMpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9NRE1BIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9pbWFnZV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDUpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNyksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUMxIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfRklNQzIiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2NhbV9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDkpLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9GSU1DMyIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfY2FtX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMTApLAotCX0sIHsKLQkJLm5hbWUJCT0gIlNZU01NVV9KUEVHIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9jYW1fY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxMSksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUQwIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QwX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX0ZJTUQxIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9sY2QxX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX1BDSWUiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX2ZzeXNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxOCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX0cyRCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAzKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfUk9UQVRPUiIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfaW1hZ2VfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfVFYiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3R2X2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNCksCi0JfSwgewotCQkubmFtZQkJPSAiU1lTTU1VX01GQ19MIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9tZmNfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJTWVNNTVVfTUZDX1IiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX21mY19jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDIpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7Ci0JewotCQkubmFtZQkJPSAidWFydCIsCi0JCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4wIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDApLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMSIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjIiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgMiksCi0JfSwgewotCQkubmFtZQkJPSAidWFydCIsCi0JCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4zIiwKLQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19pcF9wZXJpbF9jdHJsLAotCQkuY3RybGJpdAk9ICgxIDw8IDMpLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuNCIsCi0JCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtfaXBfcGVyaWxfY3RybCwKLQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJ1YXJ0IiwKLQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjUiLAotCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2lwX3BlcmlsX2N0cmwsCi0JCS5jdHJsYml0CT0gKDEgPDwgNSksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9ncm91cF9saXN0W10gPSB7Ci0JWzBdID0gJmNsa19leHRfeHRhbF9tdXgsCi0JWzFdID0gJmNsa194dXNieHRpLAotCVsyXSA9ICZjbGtfc2Nsa19oZG1pMjdtLAotCVszXSA9ICZjbGtfc2Nsa191c2JwaHkwLAotCVs0XSA9ICZjbGtfc2Nsa191c2JwaHkxLAotCVs1XSA9ICZjbGtfc2Nsa19oZG1pcGh5LAotCVs2XSA9ICZjbGtfbW91dF9tcGxsLmNsaywKLQlbN10gPSAmY2xrX21vdXRfZXBsbC5jbGssCi0JWzhdID0gJmNsa19zY2xrX3ZwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfZ3JvdXAgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfZ3JvdXBfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X2dyb3VwX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X2cyZDBfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKLQlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X2cyZDAgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9nMmQwX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X2cyZDBfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfZzJkMCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dF9nMmQwIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X2cyZDAsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0lNQUdFLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9nMmQxX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfZXBsbC5jbGssCi0JWzFdID0gJmNsa19zY2xrX3ZwbGwuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQxID0gewotCS5zb3VyY2VzCT0gY2xrc2V0X21vdXRfZzJkMV9saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9nMmQxX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tb3V0X2cyZDEgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gIm1vdXRfZzJkMSIsCi0JfSwKLQkuc291cmNlcwk9ICZjbGtzZXRfbW91dF9nMmQxLAotCS5yZWdfc3JjCT0geyAucmVnID0gUzVQX0NMS1NSQ19JTUFHRSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfZzJkX2xpc3RbXSA9IHsKLQlbMF0gPSAmY2xrX21vdXRfZzJkMC5jbGssCi0JWzFdID0gJmNsa19tb3V0X2cyZDEuY2xrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtzZXRfbW91dF9nMmQgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9nMmRfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfZzJkX2xpc3QpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NldF9tb3V0X21mYzBfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9tcGxsLmNsaywKLQlbMV0gPSAmY2xrX3NjbGtfYXBsbC5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYzAgPSB7Ci0JLnNvdXJjZXMJPSBjbGtzZXRfbW91dF9tZmMwX2xpc3QsCi0JLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9tb3V0X21mYzBfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX21vdXRfbWZjMCA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAibW91dF9tZmMwIiwKLQl9LAotCS5zb3VyY2VzCT0gJmNsa3NldF9tb3V0X21mYzAsCi0JLnJlZ19zcmMJPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX01GQywgLnNoaWZ0ID0gMCwgLnNpemUgPSAxIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc2V0X21vdXRfbWZjMV9saXN0W10gPSB7Ci0JWzBdID0gJmNsa19tb3V0X2VwbGwuY2xrLAotCVsxXSA9ICZjbGtfc2Nsa192cGxsLmNsaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrc2V0X21vdXRfbWZjMSA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9tb3V0X21mYzFfbGlzdCwKLQkubnJfc291cmNlcwk9IEFSUkFZX1NJWkUoY2xrc2V0X21vdXRfbWZjMV9saXN0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbW91dF9tZmMxID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJtb3V0X21mYzEiLAotCX0sCi0JLnNvdXJjZXMJPSAmY2xrc2V0X21vdXRfbWZjMSwKLQkucmVnX3NyYwk9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTUZDLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfbW91dF9tZmNfbGlzdFtdID0gewotCVswXSA9ICZjbGtfbW91dF9tZmMwLmNsaywKLQlbMV0gPSAmY2xrX21vdXRfbWZjMS5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa3NldF9tb3V0X21mYyA9IHsKLQkuc291cmNlcwk9IGNsa3NldF9tb3V0X21mY19saXN0LAotCS5ucl9zb3VyY2VzCT0gQVJSQVlfU0laRShjbGtzZXRfbW91dF9tZmNfbGlzdCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jMCA9IHsKLQkuY2xrCQk9IHsKLQkJLm5hbWUJCT0gImRvdXRfbW1jMCIsCi0JfSwKLQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jMSA9IHsKLQkuY2xrCQk9IHsKLQkJLm5hbWUJCT0gImRvdXRfbW1jMSIsCi0JfSwKLQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAotCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzIgPSB7Ci0JLmNsawkJPSB7Ci0JCS5uYW1lCQk9ICJkb3V0X21tYzIiLAotCX0sCi0JLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKLQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzIsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19kb3V0X21tYzMgPSB7Ci0JLmNsawkJPSB7Ci0JCS5uYW1lCQk9ICJkb3V0X21tYzMiLAotCX0sCi0JLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCi0JLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMyLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2RvdXRfbW1jNCA9IHsKLQkuY2xrCQk9IHsKLQkJLm5hbWUJCT0gImRvdXRfbW1jNCIsCi0JfSwKLQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0ZTWVMsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKLQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzMsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa3NyY3NbXSA9IHsKLQl7Ci0JCS5jbGsJPSB7Ci0JCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjAiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX1BFUklMMCwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJ1Y2xrMSIsCi0JCQkuZGV2bmFtZQk9ICJzNXB2MjEwLXVhcnQuMSIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19QRVJJTDAsIC5zaGlmdCA9IDQsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwwLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInVjbGsxIiwKLQkJCS5kZXZuYW1lCT0gInM1cHYyMTAtdWFydC4yIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19wZXJpbDBfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgOCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDAsIC5zaGlmdCA9IDgsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAidWNsazEiLAotCQkJLmRldm5hbWUJPSAiczVwdjIxMC11YXJ0LjMiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMF9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMCwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwwLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX3B3bSIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwwX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwwLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDMsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19jc2lzIiwKLQkJCS5kZXZuYW1lCT0gInM1cC1taXBpLWNzaXMuMCIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfY2FtX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDI0KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAyNCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9DQU0sIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfY3NpcyIsCi0JCQkuZGV2bmFtZQk9ICJzNXAtbWlwaS1jc2lzLjEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyOCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMjgsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAyOCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2NhbTAiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAxNiksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMTYsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2NhbTEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyMCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAyMCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjAiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjEiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCA0KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gNCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjIiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfQ0FNLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0NBTSwgLnNoaWZ0ID0gOCwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWMiLAotCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1maW1jLjMiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2NhbV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAxMiksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX0NBTSwgLnNoaWZ0ID0gMTIsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfQ0FNLCAuc2hpZnQgPSAxMiwgLnNpemUgPSA0IH0sCi0JfSwgewotCQkuY2xrCQk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX2ZpbWQiLAotCQkJLmRldm5hbWUJPSAiZXh5bm9zNC1mYi4wIiwKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19sY2QwX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDApLAotCQl9LAotCQkuc291cmNlcyA9ICZjbGtzZXRfZ3JvdXAsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19MQ0QwLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0xDRDAsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19maW1kIiwKLQkJCS5kZXZuYW1lCT0gImV4eW5vczQtZmIuMSIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfbGNkMV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfTENEMSwgLnNoaWZ0ID0gMCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9MQ0QxLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfc2F0YSIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9tb3V0X2NvcmVidXMsCi0JCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS1NSQ19GU1lTLCAuc2hpZnQgPSAyNCwgLnNpemUgPSAxIH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9GU1lTMCwgLnNoaWZ0ID0gMjAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMCIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwxLCAuc2hpZnQgPSAxNiwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDEsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19zcGkiLAotCQkJLmRldm5hbWUJPSAiczNjNjR4eC1zcGkuMSIsCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfcGVyaWwxX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDIwKSwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X2dyb3VwLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfUEVSSUwxLCAuc2hpZnQgPSAyMCwgLnNpemUgPSA0IH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9QRVJJTDEsIC5zaGlmdCA9IDE2LCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfc3BpIiwKLQkJCS5kZXZuYW1lCT0gInMzYzY0eHgtc3BpLjIiLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX3BlcmlsMV9jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAyNCksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9ncm91cCwKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX1BFUklMMSwgLnNoaWZ0ID0gMjQsIC5zaXplID0gNCB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfUEVSSUwyLCAuc2hpZnQgPSAwLCAuc2l6ZSA9IDQgfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfZmltZzJkIiwKLQkJfSwKLQkJLnNvdXJjZXMgPSAmY2xrc2V0X21vdXRfZzJkLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtTUkNfSU1BR0UsIC5zaGlmdCA9IDgsIC5zaXplID0gMSB9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfSU1BR0UsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19tZmMiLAotCQkJLmRldm5hbWUJPSAiczVwLW1mYyIsCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9tb3V0X21mYywKLQkJLnJlZ19zcmMgPSB7IC5yZWcgPSBTNVBfQ0xLU1JDX01GQywgLnNoaWZ0ID0gOCwgLnNpemUgPSAxIH0sCi0JCS5yZWdfZGl2ID0geyAucmVnID0gUzVQX0NMS0RJVl9NRkMsIC5zaGlmdCA9IDAsIC5zaXplID0gNCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjAiLAotCQkJLnBhcmVudAkJPSAmY2xrX2RvdXRfbW1jMC5jbGssCi0JCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrc3JjX21hc2tfZnN5c19jdHJsLAotCQkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKLQkJfSwKLQkJLnJlZ19kaXYgPSB7IC5yZWcgPSBTNVBfQ0xLRElWX0ZTWVMxLCAuc2hpZnQgPSA4LCAuc2l6ZSA9IDggfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4xIiwKLQkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWMxLmNsaywKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDQpLAotCQl9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzEsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDggfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfbW1jIiwKLQkJCS5kZXZuYW1lCT0gInMzYy1zZGhjaS4yIiwKLQkJCS5wYXJlbnQgICAgICAgICA9ICZjbGtfZG91dF9tbWMyLmNsaywKLQkJCS5lbmFibGUJCT0gZXh5bm9zNF9jbGtzcmNfbWFza19mc3lzX2N0cmwsCi0JCQkuY3RybGJpdAk9ICgxIDw8IDgpLAotCQl9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzIsIC5zaGlmdCA9IDgsIC5zaXplID0gOCB9LAotCX0sIHsKLQkJLmNsawkJPSB7Ci0JCQkubmFtZQkJPSAic2Nsa19tbWMiLAotCQkJLmRldm5hbWUJPSAiczNjLXNkaGNpLjMiLAotCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzMuY2xrLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMTIpLAotCQl9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzIsIC5zaGlmdCA9IDI0LCAuc2l6ZSA9IDggfSwKLQl9LCB7Ci0JCS5jbGsJCT0gewotCQkJLm5hbWUJCT0gInNjbGtfZHdtbWMiLAotCQkJLnBhcmVudCAgICAgICAgID0gJmNsa19kb3V0X21tYzQuY2xrLAotCQkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa3NyY19tYXNrX2ZzeXNfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMTYpLAotCQl9LAotCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtESVZfRlNZUzMsIC5zaGlmdCA9IDgsIC5zaXplID0gOCB9LAotCX0KLX07Ci0KLS8qIENsb2NrIGluaXRpYWxpemF0aW9uIGNvZGUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayAqc3lzY2xrc1tdID0gewotCSZjbGtfbW91dF9hcGxsLAotCSZjbGtfc2Nsa19hcGxsLAotCSZjbGtfbW91dF9lcGxsLAotCSZjbGtfbW91dF9tcGxsLAotCSZjbGtfbW91dGNvcmUsCi0JJmNsa19jb3JlY2xrLAotCSZjbGtfYXJtY2xrLAotCSZjbGtfYWNsa19jb3JlbTAsCi0JJmNsa19hY2xrX2NvcmVzLAotCSZjbGtfYWNsa19jb3JlbTEsCi0JJmNsa19wZXJpcGhjbGssCi0JJmNsa19tb3V0X2NvcmVidXMsCi0JJmNsa19zY2xrX2RtYywKLQkmY2xrX2FjbGtfY29yZWQsCi0JJmNsa19hY2xrX2NvcmVwLAotCSZjbGtfYWNsa19hY3AsCi0JJmNsa19wY2xrX2FjcCwKLQkmY2xrX3ZwbGxzcmMsCi0JJmNsa19zY2xrX3ZwbGwsCi0JJmNsa19hY2xrXzIwMCwKLQkmY2xrX2FjbGtfMTAwLAotCSZjbGtfYWNsa18xNjAsCi0JJmNsa19hY2xrXzEzMywKLQkmY2xrX2RvdXRfbW1jMCwKLQkmY2xrX2RvdXRfbW1jMSwKLQkmY2xrX2RvdXRfbW1jMiwKLQkmY2xrX2RvdXRfbW1jMywKLQkmY2xrX2RvdXRfbW1jNCwKLQkmY2xrX21vdXRfbWZjMCwKLQkmY2xrX21vdXRfbWZjMSwKLX07Ci0KLXN0YXRpYyBpbnQgeHRhbF9yYXRlOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHlub3M0X2ZvdXRfYXBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JcmV0dXJuIHM1cF9nZXRfcGxsNDV4eCh4dGFsX3JhdGUsIF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApLCBwbGxfNDUwOCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBleHlub3M0X2ZvdXRfYXBsbF9vcHMgPSB7Ci0JLmdldF9yYXRlID0gZXh5bm9zNF9mb3V0X2FwbGxfZ2V0X3JhdGUsCi19OwotCi12b2lkIF9faW5pdF9vcl9jcHVmcmVxIGV4eW5vczRfc2V0dXBfY2xvY2tzKHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqeHRhbF9jbGs7Ci0JdW5zaWduZWQgbG9uZyBhcGxsOwotCXVuc2lnbmVkIGxvbmcgbXBsbDsKLQl1bnNpZ25lZCBsb25nIGVwbGw7Ci0JdW5zaWduZWQgbG9uZyB2cGxsOwotCXVuc2lnbmVkIGxvbmcgdnBsbHNyYzsKLQl1bnNpZ25lZCBsb25nIHh0YWw7Ci0JdW5zaWduZWQgbG9uZyBhcm1jbGs7Ci0JdW5zaWduZWQgbG9uZyBzY2xrX2RtYzsKLQl1bnNpZ25lZCBsb25nIGFjbGtfMjAwOwotCXVuc2lnbmVkIGxvbmcgYWNsa18xMDA7Ci0JdW5zaWduZWQgbG9uZyBhY2xrXzE2MDsKLQl1bnNpZ25lZCBsb25nIGFjbGtfMTMzOwotCXVuc2lnbmVkIGludCBwdHI7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlZ2lzdGVyaW5nIGNsb2Nrc1xuIiwgX19mdW5jX18pOwotCi0JeHRhbF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7Ci0JQlVHX09OKElTX0VSUih4dGFsX2NsaykpOwotCi0JeHRhbCA9IGNsa19nZXRfcmF0ZSh4dGFsX2Nsayk7Ci0KLQl4dGFsX3JhdGUgPSB4dGFsOwotCi0JY2xrX3B1dCh4dGFsX2Nsayk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHh0YWwgaXMgJWxkXG4iLCBfX2Z1bmNfXywgeHRhbCk7Ci0KLQlhcGxsID0gczVwX2dldF9wbGw0NXh4KHh0YWwsIF9fcmF3X3JlYWRsKFM1UF9BUExMX0NPTjApLCBwbGxfNDUwOCk7Ci0JbXBsbCA9IHM1cF9nZXRfcGxsNDV4eCh4dGFsLCBfX3Jhd19yZWFkbChTNVBfTVBMTF9DT04wKSwgcGxsXzQ1MDgpOwotCWVwbGwgPSBzNXBfZ2V0X3BsbDQ2eHgoeHRhbCwgX19yYXdfcmVhZGwoUzVQX0VQTExfQ09OMCksCi0JCQkJX19yYXdfcmVhZGwoUzVQX0VQTExfQ09OMSksIHBsbF80NjAwKTsKLQotCXZwbGxzcmMgPSBjbGtfZ2V0X3JhdGUoJmNsa192cGxsc3JjLmNsayk7Ci0JdnBsbCA9IHM1cF9nZXRfcGxsNDZ4eCh2cGxsc3JjLCBfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04wKSwKLQkJCQlfX3Jhd19yZWFkbChTNVBfVlBMTF9DT04xKSwgcGxsXzQ2NTBjKTsKLQotCWNsa19mb3V0X2FwbGwub3BzID0gJmV4eW5vczRfZm91dF9hcGxsX29wczsKLQljbGtfZm91dF9tcGxsLnJhdGUgPSBtcGxsOwotCWNsa19mb3V0X2VwbGwucmF0ZSA9IGVwbGw7Ci0JY2xrX2ZvdXRfdnBsbC5yYXRlID0gdnBsbDsKLQotCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzQ6IFBMTCBzZXR0aW5ncywgQT0lbGQsIE09JWxkLCBFPSVsZCBWPSVsZCIsCi0JCQlhcGxsLCBtcGxsLCBlcGxsLCB2cGxsKTsKLQotCWFybWNsayA9IGNsa19nZXRfcmF0ZSgmY2xrX2FybWNsay5jbGspOwotCXNjbGtfZG1jID0gY2xrX2dldF9yYXRlKCZjbGtfc2Nsa19kbWMuY2xrKTsKLQotCWFjbGtfMjAwID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18yMDAuY2xrKTsKLQlhY2xrXzEwMCA9IGNsa19nZXRfcmF0ZSgmY2xrX2FjbGtfMTAwLmNsayk7Ci0JYWNsa18xNjAgPSBjbGtfZ2V0X3JhdGUoJmNsa19hY2xrXzE2MC5jbGspOwotCWFjbGtfMTMzID0gY2xrX2dldF9yYXRlKCZjbGtfYWNsa18xMzMuY2xrKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkVYWU5PUzQ6IEFSTUNMSz0lbGQsIERNQz0lbGQsIEFDTEsyMDA9JWxkXG4iCi0JCQkgIkFDTEsxMDA9JWxkLCBBQ0xLMTYwPSVsZCwgQUNMSzEzMz0lbGRcbiIsCi0JCQlhcm1jbGssIHNjbGtfZG1jLCBhY2xrXzIwMCwKLQkJCWFjbGtfMTAwLCBhY2xrXzE2MCwgYWNsa18xMzMpOwotCi0JY2xrX2YucmF0ZSA9IGFybWNsazsKLQljbGtfaC5yYXRlID0gc2Nsa19kbWM7Ci0JY2xrX3AucmF0ZSA9IGFjbGtfMTAwOwotCi0JZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGNsa3NyY3MpOyBwdHIrKykKLQkJczNjX3NldF9jbGtzcmMoJmNsa3NyY3NbcHRyXSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW10gX19pbml0ZGF0YSA9IHsKLQkvKiBOb3RoaW5nIGhlcmUgeWV0ICovCi19OwotCi12b2lkIF9faW5pdCBleHlub3M0X3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKQotewotCWludCBwdHI7Ci0KLQlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrcyhjbGtzLCBBUlJBWV9TSVpFKGNsa3MpKTsKLQotCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShzeXNjbGtzKTsgcHRyKyspCi0JCXMzY19yZWdpc3Rlcl9jbGtzcmMoc3lzY2xrc1twdHJdLCAxKTsKLQotCXMzY19yZWdpc3Rlcl9jbGtzcmMoY2xrc3JjcywgQVJSQVlfU0laRShjbGtzcmNzKSk7Ci0JczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2NrcywgQVJSQVlfU0laRShpbml0X2Nsb2NrcykpOwotCi0JczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7Ci0JczNjX2Rpc2FibGVfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKLQotCXMzY19wd21jbGtfaW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZkNmZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgotCi0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9hZGMtY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2ZiLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2ZpbWMtY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvaWljLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L3Jlc2V0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLXBtdS5oPgotCi1leHRlcm4gaW50IGNvbWJpbmVyX2luaXQodW5zaWduZWQgaW50IGNvbWJpbmVyX25yLCB2b2lkIF9faW9tZW0gKmJhc2UsCi0JCQkgdW5zaWduZWQgaW50IGlycV9zdGFydCk7Ci1leHRlcm4gdm9pZCBjb21iaW5lcl9jYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgY29tYmluZXJfbnIsIHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBJbml0aWFsIElPIG1hcHBpbmdzICovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGV4eW5vczRfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX1NZU1RJTUVSLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9TWVNUSU1FUiksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCSAJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9TWVNSQU0sCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX1NZU1JBTSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0NNVSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfQ01VKSwKLQkJLmxlbmd0aAkJPSBTWl8xMjhLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9QTVUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX1BNVSksCi0JCS5sZW5ndGgJCT0gU1pfNjRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9DT01CSU5FUl9CQVNFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9DT01CSU5FUiksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0NPUkVQRVJJX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0NPUkVQRVJJKSwKLQkJLmxlbmd0aAkJPSBTWl84SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfTDJDQywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfTDJDQyksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8xLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8yLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMiksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpUzVQX1ZBX0dQSU8zLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9HUElPMyksCi0JCS5sZW5ndGgJCT0gU1pfMjU2LAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9ETUMwLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVhZTk9TNF9QQV9ETUMwKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTM0NfVkFfVUFSVCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFMzQ19QQV9VQVJUKSwKLQkJLmxlbmd0aAkJPSBTWl81MTJLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9TUk9NQywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfU1JPTUMpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9VU0JfSFNQSFksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0hTUEhZKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylTNVBfVkFfR0lDX0NQVSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR0lDX0NQVSksCi0JCS5sZW5ndGgJCT0gU1pfNjRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9HSUNfRElTVCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfR0lDX0RJU1QpLAotCQkubGVuZ3RoCQk9IFNaXzY0SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBleHlub3M0X2lkbGUodm9pZCkKLXsKLQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQljcHVfZG9faWRsZSgpOwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X3N3X3Jlc2V0KHZvaWQpCi17Ci0JX19yYXdfd3JpdGVsKDB4MSwgUzVQX1NXUkVTRVQpOwotfQotCi0vKgotICogZXh5bm9zNF9tYXBfaW8KLSAqCi0gKiByZWdpc3RlciB0aGUgc3RhbmRhcmQgY3B1IElPIGFyZWFzCi0gKi8KLXZvaWQgX19pbml0IGV4eW5vczRfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KGV4eW5vczRfaW9kZXNjLCBBUlJBWV9TSVpFKGV4eW5vczRfaW9kZXNjKSk7Ci0KLQkvKiBpbml0aWFsaXplIGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLwotCWV4eW5vczRfZGVmYXVsdF9zZGhjaTAoKTsKLQlleHlub3M0X2RlZmF1bHRfc2RoY2kxKCk7Ci0JZXh5bm9zNF9kZWZhdWx0X3NkaGNpMigpOwotCWV4eW5vczRfZGVmYXVsdF9zZGhjaTMoKTsKLQotCXMzY19hZGNfc2V0bmFtZSgic2Ftc3VuZy1hZGMtdjMiKTsKLQotCXMzY19maW1jX3NldG5hbWUoMCwgImV4eW5vczQtZmltYyIpOwotCXMzY19maW1jX3NldG5hbWUoMSwgImV4eW5vczQtZmltYyIpOwotCXMzY19maW1jX3NldG5hbWUoMiwgImV4eW5vczQtZmltYyIpOwotCXMzY19maW1jX3NldG5hbWUoMywgImV4eW5vczQtZmltYyIpOwotCi0JLyogVGhlIEkyQyBidXMgY29udHJvbGxlcnMgYXJlIGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBzM2MyNDQwICovCi0JczNjX2kyYzBfc2V0bmFtZSgiczNjMjQ0MC1pMmMiKTsKLQlzM2NfaTJjMV9zZXRuYW1lKCJzM2MyNDQwLWkyYyIpOwotCXMzY19pMmMyX3NldG5hbWUoInMzYzI0NDAtaTJjIik7Ci0KLQlzNXBfZmJfc2V0bmFtZSgwLCAiZXh5bm9zNC1mYiIpOwotfQotCi12b2lkIF9faW5pdCBleHlub3M0X2luaXRfY2xvY2tzKGludCB4dGFsKQotewotCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5pdGlhbGl6aW5nIGNsb2Nrc1xuIiwgX19mdW5jX18pOwotCi0JczNjMjR4eF9yZWdpc3Rlcl9iYXNlY2xvY2tzKHh0YWwpOwotCXM1cF9yZWdpc3Rlcl9jbG9ja3MoeHRhbCk7Ci0JZXh5bm9zNF9yZWdpc3Rlcl9jbG9ja3MoKTsKLQlleHlub3M0X3NldHVwX2Nsb2NrcygpOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X2dpY19pcnFfZW9pKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljX2RhdGEgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQotCWdpY19kYXRhLT5jcHVfYmFzZSA9IFM1UF9WQV9HSUNfQ1BVICsKLQkJCSAgICAoRVhZTk9TNF9HSUNfQkFOS19PRkZTRVQgKiBzbXBfcHJvY2Vzc29yX2lkKCkpOwotfQotCi12b2lkIF9faW5pdCBleHlub3M0X2luaXRfaXJxKHZvaWQpCi17Ci0JaW50IGlycTsKLQotCWdpY19pbml0KDAsIElSUV9TUEkoMCksIFM1UF9WQV9HSUNfRElTVCwgUzVQX1ZBX0dJQ19DUFUpOwotCWdpY19hcmNoX2V4dG4uaXJxX2VvaSA9IGV4eW5vczRfZ2ljX2lycV9lb2k7Ci0KLQlmb3IgKGlycSA9IDA7IGlycSA8IE1BWF9DT01CSU5FUl9OUjsgaXJxKyspIHsKLQotCQljb21iaW5lcl9pbml0KGlycSwgKHZvaWQgX19pb21lbSAqKVM1UF9WQV9DT01CSU5FUihpcnEpLAotCQkJCUNPTUJJTkVSX0lSUShpcnEsIDApKTsKLQkJY29tYmluZXJfY2FzY2FkZV9pcnEoaXJxLCBJUlFfU1BJKGlycSkpOwotCX0KLQotCS8qIFRoZSBwYXJhbWV0ZXJzIG9mIHM1cF9pbml0X2lycSgpIGFyZSBmb3IgVklDIGluaXQuCi0JICogVGhlc2VzIHBhcmFtZXRlcnMgc2hvdWxkIGJlIE5VTEwgYW5kIDAgYmVjYXVzZSBFWFlOT1M0Ci0JICogdXNlcyBHSUMgaW5zdGVhZCBvZiBWSUMuCi0JICovCi0JczVwX2luaXRfaXJxKE5VTEwsIDApOwotfQotCi1zdHJ1Y3Qgc3lzZGV2X2NsYXNzIGV4eW5vczRfc3lzY2xhc3MgPSB7Ci0JLm5hbWUJPSAiZXh5bm9zNC1jb3JlIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBleHlub3M0X3N5c2RldiA9IHsKLQkuY2xzCT0gJmV4eW5vczRfc3lzY2xhc3MsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2NvcmVfaW5pdCh2b2lkKQotewotCXJldHVybiBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmV4eW5vczRfc3lzY2xhc3MpOwotfQotCi1jb3JlX2luaXRjYWxsKGV4eW5vczRfY29yZV9pbml0KTsKLQotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi1zdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2wyeDBfY2FjaGVfaW5pdCh2b2lkKQotewotCS8qIFRBRywgRGF0YSBMYXRlbmN5IENvbnRyb2w6IDJjeWNsZSAqLwotCV9fcmF3X3dyaXRlbCgweDExMCwgUzVQX1ZBX0wyQ0MgKyBMMlgwX1RBR19MQVRFTkNZX0NUUkwpOwotCV9fcmF3X3dyaXRlbCgweDExMCwgUzVQX1ZBX0wyQ0MgKyBMMlgwX0RBVEFfTEFURU5DWV9DVFJMKTsKLQotCS8qIEwyWDAgUHJlZmV0Y2ggQ29udHJvbCAqLwotCV9fcmF3X3dyaXRlbCgweDMwMDAwMDA3LCBTNVBfVkFfTDJDQyArIEwyWDBfUFJFRkVUQ0hfQ1RSTCk7Ci0KLQkvKiBMMlgwIFBvd2VyIENvbnRyb2wgKi8KLQlfX3Jhd193cml0ZWwoTDJYMF9EWU5BTUlDX0NMS19HQVRJTkdfRU4gfCBMMlgwX1NUTkRCWV9NT0RFX0VOLAotCQkgICAgIFM1UF9WQV9MMkNDICsgTDJYMF9QT1dFUl9DVFJMKTsKLQotCWwyeDBfaW5pdChTNVBfVkFfTDJDQywgMHg3QzQ3MDAwMSwgMHhDMjAwZmZmZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotZWFybHlfaW5pdGNhbGwoZXh5bm9zNF9sMngwX2NhY2hlX2luaXQpOwotI2VuZGlmCi0KLWludCBfX2luaXQgZXh5bm9zNF9pbml0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRVhZTk9TNDogSW5pdGlhbGl6aW5nIGFyY2hpdGVjdHVyZVxuIik7Ci0KLQkvKiBzZXQgaWRsZSBmdW5jdGlvbiAqLwotCXBtX2lkbGUgPSBleHlub3M0X2lkbGU7Ci0KLQkvKiBzZXQgc3dfcmVzZXQgZnVuY3Rpb24gKi8KLQlzNXBfcmVzZXRfaG9vayA9IGV4eW5vczRfc3dfcmVzZXQ7Ci0KLQlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZleHlub3M0X3N5c2Rldik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWlkbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZTk2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvY3B1aWRsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2NwdWlkbGUuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgotCi1zdGF0aWMgaW50IGV4eW5vczRfZW50ZXJfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBleHlub3M0X2NwdWlkbGVfc2V0W10gPSB7Ci0JWzBdID0gewotCQkuZW50ZXIJCQk9IGV4eW5vczRfZW50ZXJfaWRsZSwKLQkJLmV4aXRfbGF0ZW5jeQkJPSAxLAotCQkudGFyZ2V0X3Jlc2lkZW5jeQk9IDEwMDAwMCwKLQkJLmZsYWdzCQkJPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKLQkJLm5hbWUJCQk9ICJJRExFIiwKLQkJLmRlc2MJCQk9ICJBUk0gY2xvY2sgZ2F0aW5nKFdGSSkiLAotCX0sCi19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdWlkbGVfZGV2aWNlLCBleHlub3M0X2NwdWlkbGVfZGV2aWNlKTsKLQotc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBleHlub3M0X2lkbGVfZHJpdmVyID0gewotCS5uYW1lCQk9ICJleHlub3M0X2lkbGUiLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgZXh5bm9zNF9lbnRlcl9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCB0aW1ldmFsIGJlZm9yZSwgYWZ0ZXI7Ci0JaW50IGlkbGVfdGltZTsKLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JZG9fZ2V0dGltZW9mZGF5KCZiZWZvcmUpOwotCi0JY3B1X2RvX2lkbGUoKTsKLQotCWRvX2dldHRpbWVvZmRheSgmYWZ0ZXIpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQlpZGxlX3RpbWUgPSAoYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYykgKiBVU0VDX1BFUl9TRUMgKwotCQkgICAgKGFmdGVyLnR2X3VzZWMgLSBiZWZvcmUudHZfdXNlYyk7Ci0KLQlyZXR1cm4gaWRsZV90aW1lOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBleHlub3M0X2luaXRfY3B1aWRsZSh2b2lkKQotewotCWludCBpLCBtYXhfY3B1aWRsZV9zdGF0ZSwgY3B1X2lkOwotCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlOwotCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmV4eW5vczRfaWRsZV9kcml2ZXIpOwotCi0JZm9yX2VhY2hfY3B1KGNwdV9pZCwgY3B1X29ubGluZV9tYXNrKSB7Ci0JCWRldmljZSA9ICZwZXJfY3B1KGV4eW5vczRfY3B1aWRsZV9kZXZpY2UsIGNwdV9pZCk7Ci0JCWRldmljZS0+Y3B1ID0gY3B1X2lkOwotCi0JCWRldmljZS0+c3RhdGVfY291bnQgPSAoc2l6ZW9mKGV4eW5vczRfY3B1aWRsZV9zZXQpIC8KLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSkpOwotCi0JCW1heF9jcHVpZGxlX3N0YXRlID0gZGV2aWNlLT5zdGF0ZV9jb3VudDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdWlkbGVfc3RhdGU7IGkrKykgewotCQkJbWVtY3B5KCZkZXZpY2UtPnN0YXRlc1tpXSwgJmV4eW5vczRfY3B1aWRsZV9zZXRbaV0sCi0JCQkJCXNpemVvZihzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSkpOwotCQl9Ci0KLQkJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldmljZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiQ1BVaWRsZSByZWdpc3RlciBkZXZpY2UgZmFpbGVkXG4sIik7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0Y2FsbChleHlub3M0X2luaXRfY3B1aWRsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LXN5c21tdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2Rldi1zeXNtbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3Y2FlMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZGV2LXN5c21tdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kZXYtc3lzbW11LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogRVhZTk9TNCAtIFN5c3RlbSBNTVUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvc3lzbW11Lmg+Ci0jaW5jbHVkZSA8cGxhdC9zNXAtY2xvY2suaD4KLQotLyogVGhlc2UgbmFtZXMgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xvY2sgbmFtZXMgaW4gbWFjaC1leHlub3M0L2Nsb2NrLmMgKi8KLWNvbnN0IGNoYXIgKnN5c21tdV9pcHNfbmFtZVtFWFlOT1M0X1NZU01NVV9UT1RBTF9JUE5VTV0gPSB7Ci0JIlNZU01NVV9NRE1BIgksCi0JIlNZU01NVV9TU1MiCSwKLQkiU1lTTU1VX0ZJTUMwIgksCi0JIlNZU01NVV9GSU1DMSIJLAotCSJTWVNNTVVfRklNQzIiCSwKLQkiU1lTTU1VX0ZJTUMzIgksCi0JIlNZU01NVV9KUEVHIgksCi0JIlNZU01NVV9GSU1EMCIJLAotCSJTWVNNTVVfRklNRDEiCSwKLQkiU1lTTU1VX1BDSWUiCSwKLQkiU1lTTU1VX0cyRCIJLAotCSJTWVNNTVVfUk9UQVRPUiIsCi0JIlNZU01NVV9NRE1BMiIJLAotCSJTWVNNTVVfVFYiCSwKLQkiU1lTTU1VX01GQ19MIgksCi0JIlNZU01NVV9NRkNfUiIJLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBleHlub3M0X3N5c21tdV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTURNQSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX01ETUEgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRE1BMF8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9NRE1BMF8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfU1NTLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfU1NTICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfU1NTXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX1NTU18wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVs0XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzAsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMCArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzVdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0ZJTUMwXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX0ZJTUMwXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzZdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1DMSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMxICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbN10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfRklNQzFfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfRklNQzFfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbOF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMyLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzIgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVs5XSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9GSU1DMl8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9GSU1DMl8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsxMF0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUMzLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNQzMgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfRklNQzNfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfRklNQzNfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMTJdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9KUEVHLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfSlBFRyArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzEzXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9KUEVHXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VX0pQRUdfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMTRdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMCwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQwICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMTVdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX0xDRDBfTTBfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfTENEMF9NMF8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsxNl0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX0ZJTUQxLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRklNRDEgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxN10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfTENEMV9NMV8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9MQ0QxX00xXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzE4XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfUENJZSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1BDSWUgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxOV0gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfUENJRV8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9QQ0lFXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzIwXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfRzJELAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfRzJEICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMjFdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VXzJEXzAsCi0JCS5lbmQJPSBJUlFfU1lTTU1VXzJEXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzIyXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfUk9UQVRPUiwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX1JPVEFUT1IgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsyM10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfUk9UQVRPUl8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9ST1RBVE9SXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzI0XSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9TWVNNTVVfTURNQTIsCi0JCS5lbmQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRE1BMiArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzI1XSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1NZU01NVV9NRE1BMV8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9NRE1BMV8wLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyNl0gPSB7Ci0JCS5zdGFydAk9IEVYWU5PUzRfUEFfU1lTTU1VX1RWLAotCQkuZW5kCT0gRVhZTk9TNF9QQV9TWVNNTVVfVFYgKyBTWl82NEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsyN10gPSB7Ci0JCS5zdGFydAk9IElSUV9TWVNNTVVfVFZfTTBfMCwKLQkJLmVuZAk9IElSUV9TWVNNTVVfVFZfTTBfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMjhdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfTCwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX01GQ19MICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMjldID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX01GQ19NMF8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9NRkNfTTBfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMzBdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NZU01NVV9NRkNfUiwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1lTTU1VX01GQ19SICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMzFdID0gewotCQkuc3RhcnQJPSBJUlFfU1lTTU1VX01GQ19NMV8wLAotCQkuZW5kCT0gSVJRX1NZU01NVV9NRkNfTTFfMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2Vfc3lzbW11ID0gewotCS5uYW1lCQk9ICJzNXAtc3lzbW11IiwKLQkuaWQJCT0gMzIsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGV4eW5vczRfc3lzbW11X3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBleHlub3M0X3N5c21tdV9yZXNvdXJjZSwKLX07Ci1FWFBPUlRfU1lNQk9MKGV4eW5vczRfZGV2aWNlX3N5c21tdSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpzeXNtbXVfY2xrW1M1UF9TWVNNTVVfVE9UQUxfSVBOVU1dOwotdm9pZCBzeXNtbXVfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzeXNtbXVfaXBzIGlwcykKLXsKLQlzeXNtbXVfY2xrW2lwc10gPSBjbGtfZ2V0KGRldiwgc3lzbW11X2lwc19uYW1lW2lwc10pOwotCWlmIChJU19FUlIoc3lzbW11X2Nsa1tpcHNdKSkKLQkJc3lzbW11X2Nsa1tpcHNdID0gTlVMTDsKLQllbHNlCi0JCWNsa19wdXQoc3lzbW11X2Nsa1tpcHNdKTsKLX0KLQotdm9pZCBzeXNtbXVfY2xrX2VuYWJsZShzeXNtbXVfaXBzIGlwcykKLXsKLQlpZiAoc3lzbW11X2Nsa1tpcHNdKQotCQljbGtfZW5hYmxlKHN5c21tdV9jbGtbaXBzXSk7Ci19Ci0KLXZvaWQgc3lzbW11X2Nsa19kaXNhYmxlKHN5c21tdV9pcHMgaXBzKQotewotCWlmIChzeXNtbXVfY2xrW2lwc10pCi0JCWNsa19kaXNhYmxlKHN5c21tdV9jbGtbaXBzXSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NGJiNTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2RtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9kbWEuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgotICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9pcnFzLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9zM2MtcGwzMzAtcGRhdGEuaD4KLQotc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXh5bm9zNF9wZG1hMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9QRE1BMCwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfUERNQTAgKyBTWl80SywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9QRE1BMCwKLQkJLmVuZAk9IElSUV9QRE1BMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIGV4eW5vczRfcGRtYTBfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsxXSA9IERNQUNIX1BDTTBfVFgsCi0JCVsyXSA9IERNQUNIX1BDTTJfUlgsCi0JCVszXSA9IERNQUNIX1BDTTJfVFgsCi0JCVs0XSA9IERNQUNIX01TTV9SRVEwLAotCQlbNV0gPSBETUFDSF9NU01fUkVRMiwKLQkJWzZdID0gRE1BQ0hfU1BJMF9SWCwKLQkJWzddID0gRE1BQ0hfU1BJMF9UWCwKLQkJWzhdID0gRE1BQ0hfU1BJMl9SWCwKLQkJWzldID0gRE1BQ0hfU1BJMl9UWCwKLQkJWzEwXSA9IERNQUNIX0kyUzBTX1RYLAotCQlbMTFdID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzEyXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxM10gPSBETUFDSF9JMlMyX1JYLAotCQlbMTRdID0gRE1BQ0hfSTJTMl9UWCwKLQkJWzE1XSA9IERNQUNIX1VBUlQwX1JYLAotCQlbMTZdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsxN10gPSBETUFDSF9VQVJUMl9SWCwKLQkJWzE4XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbMTldID0gRE1BQ0hfVUFSVDRfUlgsCi0JCVsyMF0gPSBETUFDSF9VQVJUNF9UWCwKLQkJWzIxXSA9IERNQUNIX1NMSU1CVVMwX1JYLAotCQlbMjJdID0gRE1BQ0hfU0xJTUJVUzBfVFgsCi0JCVsyM10gPSBETUFDSF9TTElNQlVTMl9SWCwKLQkJWzI0XSA9IERNQUNIX1NMSU1CVVMyX1RYLAotCQlbMjVdID0gRE1BQ0hfU0xJTUJVUzRfUlgsCi0JCVsyNl0gPSBETUFDSF9TTElNQlVTNF9UWCwKLQkJWzI3XSA9IERNQUNIX0FDOTdfTUlDSU4sCi0JCVsyOF0gPSBETUFDSF9BQzk3X1BDTUlOLAotCQlbMjldID0gRE1BQ0hfQUM5N19QQ01PVVQsCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BkbWEwID0gewotCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShleHlub3M0X3BkbWEwX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBleHlub3M0X3BkbWEwX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmV4eW5vczRfcGRtYTBfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXh5bm9zNF9wZG1hMV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gRVhZTk9TNF9QQV9QRE1BMSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfUERNQTEgKyBTWl80SywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9QRE1BMSwKLQkJLmVuZAk9IElSUV9QRE1BMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIGV4eW5vczRfcGRtYTFfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsxXSA9IERNQUNIX1BDTTBfVFgsCi0JCVsyXSA9IERNQUNIX1BDTTFfUlgsCi0JCVszXSA9IERNQUNIX1BDTTFfVFgsCi0JCVs0XSA9IERNQUNIX01TTV9SRVExLAotCQlbNV0gPSBETUFDSF9NU01fUkVRMywKLQkJWzZdID0gRE1BQ0hfU1BJMV9SWCwKLQkJWzddID0gRE1BQ0hfU1BJMV9UWCwKLQkJWzhdID0gRE1BQ0hfSTJTMFNfVFgsCi0JCVs5XSA9IERNQUNIX0kyUzBfUlgsCi0JCVsxMF0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTFdID0gRE1BQ0hfSTJTMV9SWCwKLQkJWzEyXSA9IERNQUNIX0kyUzFfVFgsCi0JCVsxM10gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzE0XSA9IERNQUNIX1VBUlQwX1RYLAotCQlbMTVdID0gRE1BQ0hfVUFSVDFfUlgsCi0JCVsxNl0gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzE3XSA9IERNQUNIX1VBUlQzX1JYLAotCQlbMThdID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVsxOV0gPSBETUFDSF9TTElNQlVTMV9SWCwKLQkJWzIwXSA9IERNQUNIX1NMSU1CVVMxX1RYLAotCQlbMjFdID0gRE1BQ0hfU0xJTUJVUzNfUlgsCi0JCVsyMl0gPSBETUFDSF9TTElNQlVTM19UWCwKLQkJWzIzXSA9IERNQUNIX1NMSU1CVVM1X1JYLAotCQlbMjRdID0gRE1BQ0hfU0xJTUJVUzVfVFgsCi0JCVsyNV0gPSBETUFDSF9TTElNQlVTMEFVWF9SWCwKLQkJWzI2XSA9IERNQUNIX1NMSU1CVVMwQVVYX1RYLAotCQlbMjddID0gRE1BQ0hfU1BESUYsCi0JCVsyOF0gPSBETUFDSF9NQVgsCi0JCVsyOV0gPSBETUFDSF9NQVgsCi0JCVszMF0gPSBETUFDSF9NQVgsCi0JCVszMV0gPSBETUFDSF9NQVgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BkbWExID0gewotCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAotCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShleHlub3M0X3BkbWExX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBleHlub3M0X3BkbWExX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmV4eW5vczRfcGRtYTFfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpleHlub3M0X2RtYWNzW10gX19pbml0ZGF0YSA9IHsKLQkmZXh5bm9zNF9kZXZpY2VfcGRtYTAsCi0JJmV4eW5vczRfZGV2aWNlX3BkbWExLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZXh5bm9zNF9kbWFfaW5pdCh2b2lkKQotewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGV4eW5vczRfZG1hY3MsIEFSUkFZX1NJWkUoZXh5bm9zNF9kbWFjcykpOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGV4eW5vczRfZG1hX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9ob3RwbHVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTA3ODkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2hvdHBsdWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKiBsaW51eCBhcmNoL2FybS9tYWNoLWV4eW5vczQvaG90cGx1Zy5jCi0gKgotICogIENsb25lZCBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgotICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+Ci0KLWV4dGVybiB2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2U7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfZW50ZXJfbG93cG93ZXIodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgdjsKLQotCWZsdXNoX2NhY2hlX2FsbCgpOwotCWFzbSB2b2xhdGlsZSgKLQkiCW1jcglwMTUsIDAsICUxLCBjNywgYzUsIDBcbiIKLQkiCW1jcglwMTUsIDAsICUxLCBjNywgYzEwLCA0XG4iCi0JLyoKLQkgKiBUdXJuIG9mZiBjb2hlcmVuY3kKLQkgKi8KLQkiCW1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDFcbiIKLQkiCWJpYwklMCwgJTAsICUzXG4iCi0JIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCi0JIgltcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCi0JIgliaWMJJTAsICUwLCAlMlxuIgotCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCSAgOiAiPSZyIiAodikKLQkgIDogInIiICgwKSwgIklyIiAoQ1JfQyksICJJciIgKDB4NDApCi0JICA6ICJjYyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1X2xlYXZlX2xvd3Bvd2VyKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHY7Ci0KLQlhc20gdm9sYXRpbGUoCi0JIm1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKLQkiCW9ycgklMCwgJTAsICUxXG4iCi0JIgltY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCi0JIgltcmMJcDE1LCAwLCAlMCwgYzEsIGMwLCAxXG4iCi0JIglvcnIJJTAsICUwLCAlMlxuIgotCSIJbWNyCXAxNSwgMCwgJTAsIGMxLCBjMCwgMVxuIgotCSAgOiAiPSZyIiAodikKLQkgIDogIklyIiAoQ1JfQyksICJJciIgKDB4NDApCi0JICA6ICJjYyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGxhdGZvcm1fZG9fbG93cG93ZXIodW5zaWduZWQgaW50IGNwdSwgaW50ICpzcHVyaW91cykKLXsKLQlmb3IgKDs7KSB7Ci0KLQkJLyogbWFrZSBjcHUxIHRvIGJlIHR1cm5lZCBvZmYgYXQgbmV4dCBXRkkgY29tbWFuZCAqLwotCQlpZiAoY3B1ID09IDEpCi0JCQlfX3Jhd193cml0ZWwoMCwgUzVQX0FSTV9DT1JFMV9DT05GSUdVUkFUSU9OKTsKLQotCQkvKgotCQkgKiBoZXJlJ3MgdGhlIFdGSQotCQkgKi8KLQkJYXNtKCIud29yZAkweGUzMjBmMDAzXG4iCi0JCSAgICA6Ci0JCSAgICA6Ci0JCSAgICA6ICJtZW1vcnkiLCAiY2MiKTsKLQotCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7Ci0JCQkvKgotCQkJICogT0ssIHByb3BlciB3YWtldXAsIHdlJ3JlIGRvbmUKLQkJCSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBHZXR0aW5nIGhlcmUsIG1lYW5zIHRoYXQgd2UgaGF2ZSBjb21lIG91dCBvZiBXRkkgd2l0aG91dAotCQkgKiBoYXZpbmcgYmVlbiB3b2tlbiB1cCAtIHRoaXMgc2hvdWxkbid0IGhhcHBlbgotCQkgKgotCQkgKiBKdXN0IG5vdGUgaXQgaGFwcGVuaW5nIC0gd2hlbiB3ZSdyZSB3b2tlbiwgd2UgY2FuIHJlcG9ydAotCQkgKiBpdHMgb2NjdXJyZW5jZS4KLQkJICovCi0JCSgqc3B1cmlvdXMpKys7Ci0JfQotfQotCi1pbnQgcGxhdGZvcm1fY3B1X2tpbGwodW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgdG8gc2h1dGRvd24gYSBDUFUKLSAqCi0gKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkCi0gKi8KLXZvaWQgcGxhdGZvcm1fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQotewotCWludCBzcHVyaW91cyA9IDA7Ci0KLQkvKgotCSAqIHdlJ3JlIHJlYWR5IGZvciBzaHV0ZG93biBub3csIHNvIGRvIGl0Ci0JICovCi0JY3B1X2VudGVyX2xvd3Bvd2VyKCk7Ci0JcGxhdGZvcm1fZG9fbG93cG93ZXIoY3B1LCAmc3B1cmlvdXMpOwotCi0JLyoKLQkgKiBicmluZyB0aGlzIENQVSBiYWNrIGludG8gdGhlIHdvcmxkIG9mIGNhY2hlCi0JICogY29oZXJlbmN5LCBhbmQgdGhlbiByZXN0b3JlIGludGVycnVwdHMKLQkgKi8KLQljcHVfbGVhdmVfbG93cG93ZXIoKTsKLQotCWlmIChzcHVyaW91cykKLQkJcHJfd2FybigiQ1BVJXU6ICV1IHNwdXJpb3VzIHdha2V1cCBjYWxsc1xuIiwgY3B1LCBzcHVyaW91cyk7Ci19Ci0KLWludCBwbGF0Zm9ybV9jcHVfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQotewotCS8qCi0JICogd2UgZG9uJ3QgYWxsb3cgQ1BVIDAgdG8gYmUgc2h1dGRvd24gKGl0IGlzIHN0aWxsIHRvbyBzcGVjaWFsCi0JICogZS5nLiBjbG9jayB0aWNrIGludGVycnVwdHMpCi0JICovCi0JcmV0dXJuIGNwdSA9PSAwID8gLUVQRVJNIDogMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDJlZjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIHB1bGwgaW4gdGhlIHJlbGV2YW50IHJlZ2lzdGVyIGFuZCBtYXAgZmlsZXMuICovCi0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0JLyogbm90ZSwgZm9yIHRoZSBib290IHByb2Nlc3MgdG8gd29yayB3ZSBoYXZlIHRvIGtlZXAgdGhlIFVBUlQKLQkgKiB2aXJ0dWFsIGFkZHJlc3MgYWxpZ25lZCB0byBhbiAxTWlCIGJvdW5kYXJ5IGZvciB0aGUgTDEKLQkgKiBtYXBwaW5nIHRoZSBoZWFkIGNvZGUgbWFrZXMuIFdlIGtlZXAgdGhlIFVBUlQgdmlydHVhbCBhZGRyZXNzCi0JICogYWxpZ25lZCBhbmQgYWRkIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSBsb2FkIHRoZSB2YWx1ZSBoZXJlLgotCSAqLwotCi0JLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYKLQkJbGRyCVxycCwgPSBTM0NfUEFfVUFSVAotCQlsZHIJXHJ2LCA9IFMzQ19WQV9VQVJUCi0jaWYgQ09ORklHX0RFQlVHX1MzQ19VQVJUICE9IDAKLQkJYWRkCVxycCwgXHJwLCAjKDB4MTAwMDAgKiBDT05GSUdfREVCVUdfUzNDX1VBUlQpCi0JCWFkZAlccnYsIFxydiwgIygweDEwMDAwICogQ09ORklHX0RFQlVHX1MzQ19VQVJUKQotI2VuZGlmCi0JLmVuZG0KLQotI2RlZmluZSBmaWZvX2Z1bGwgZmlmb19mdWxsX3M1cHYyMTAKLSNkZWZpbmUgZmlmb19sZXZlbCBmaWZvX2xldmVsX3M1cHYyMTAKLQotI2luY2x1ZGUgPHBsYXQvZGVidWctbWFjcm8uUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2RtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTIwOWViLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvZG1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9ETUFfSAotI2RlZmluZSBfX01BQ0hfRE1BX0gKLQotLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gUzNDIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLwotI2luY2x1ZGUgPHBsYXQvczNjLWRtYS1wbDMzMC5oPgotCi0jZW5kaWYgLyogX19NQUNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTFlMjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCi0gKgotICogQ2xvbmVkIGZyb20gYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwotICoKLSAqIExvdy1sZXZlbCBJUlEgaGVscGVyIG1hY3JvcyBmb3IgRVhZTk9TNCBwbGF0Zm9ybXMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSovCi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+Ci0KLQkJLm1hY3JvCWRpc2FibGVfZmlxCi0JCS5lbmRtCi0KLQkJLm1hY3JvICBnZXRfaXJxbnJfcHJlYW1ibGUsIGJhc2UsIHRtcAotCQlsZHIJXGJhc2UsID1naWNfY3B1X2Jhc2VfYWRkcgotCQlsZHIJXGJhc2UsIFtcYmFzZV0KLQkJbXJjICAgICBwMTUsIDAsIFx0bXAsIGMwLCBjMCwgNQotCQlhbmQgICAgIFx0bXAsIFx0bXAsICMzCi0JCWNtcCAgICAgXHRtcCwgIzEKLQkJYWRkZXEgICBcYmFzZSwgXGJhc2UsICNFWFlOT1M0X0dJQ19CQU5LX09GRlNFVAotCQkuZW5kbQotCi0JCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgotCQkuZW5kbQotCi0JCS8qCi0JCSAqIFRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZSBpcyBkZWZpbmVkIGluIHRoZQotCQkgKiBpbnRlcnJ1cHQgY29udHJvbGxlciBzcGVjLiAgVG8gd2l0OgotCQkgKgotCQkgKiBJbnRlcnJ1cHRzIDAtMTUgYXJlIElQSQotCQkgKiAxNi0yOCBhcmUgcmVzZXJ2ZWQKLQkJICogMjktMzEgYXJlIGxvY2FsLiAgV2UgYWxsb3cgMzAgdG8gYmUgdXNlZCBmb3IgdGhlIHdhdGNoZG9nLgotCQkgKiAzMi0xMDIwIGFyZSBnbG9iYWwKLQkJICogMTAyMS0xMDIyIGFyZSByZXNlcnZlZAotCQkgKiAxMDIzIGlzICJzcHVyaW91cyIgKG5vIGludGVycnVwdCkKLQkJICoKLQkJICogRm9yIG5vdywgd2UgaWdub3JlIGFsbCBsb2NhbCBpbnRlcnJ1cHRzIHNvIG9ubHkgcmV0dXJuIGFuIGludGVycnVwdCBpZiBpdCdzCi0JCSAqIGJldHdlZW4gMzAgYW5kIDEwMjAuICBUaGUgdGVzdF9mb3JfaXBpIHJvdXRpbmUgYmVsb3cgd2lsbCBwaWNrIHVwIG9uIElQSXMuCi0JCSAqCi0JCSAqIEEgc2ltcGxlIHJlYWQgZnJvbSB0aGUgY29udHJvbGxlciB3aWxsIHRlbGwgdXMgdGhlIG51bWJlciBvZiB0aGUgaGlnaGVzdAotICAgICAgICAgICAgICAgICAqIHByaW9yaXR5IGVuYWJsZWQgaW50ZXJydXB0LiAgV2UgdGhlbiBqdXN0IG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBpbiB0aGUKLQkJICogdmFsaWQgcmFuZ2UgZm9yIGFuIElSUSAoMzAtMTAyMCBpbmNsdXNpdmUpLgotCQkgKi8KLQotCQkubWFjcm8gIGdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCi0JCWxkciAgICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfSU5UQUNLXSAvKiBiaXRzIDEyLTEwID0gc3JjIENQVSwgOS0wID0gaW50ICMgKi8KLQotCQlsZHIJXHRtcCwgPTEwMjEKLQotCQliaWMgICAgIFxpcnFuciwgXGlycXN0YXQsICMweDFjMDAKLQotCQljbXAgICAgIFxpcnFuciwgIzI5Ci0JCWNtcGNjCVxpcnFuciwgXGlycW5yCi0JCWNtcG5lCVxpcnFuciwgXHRtcAotCQljbXBjcwlcaXJxbnIsIFxpcnFucgotCQlhZGRuZQlcaXJxbnIsIFxpcnFuciwgIzMyCi0KLQkJLmVuZG0KLQotCQkvKiBXZSBhc3N1bWUgdGhhdCBpcnFzdGF0ICh0aGUgcmF3IHZhbHVlIG9mIHRoZSBJUlEgYWNrbm93bGVkZ2UKLQkJICogcmVnaXN0ZXIpIGlzIHByZXNlcnZlZCBmcm9tIHRoZSBtYWNybyBhYm92ZS4KLQkJICogSWYgdGhlcmUgaXMgYW4gSVBJLCB3ZSBpbW1lZGlhdGVseSBzaWduYWwgZW5kIG9mIGludGVycnVwdCBvbiB0aGUKLQkJICogY29udHJvbGxlciwgc2luY2UgdGhpcyByZXF1aXJlcyB0aGUgb3JpZ2luYWwgaXJxc3RhdCB2YWx1ZSB3aGljaAotCQkgKiB3ZSB3b24ndCBlYXNpbHkgYmUgYWJsZSB0byByZWNyZWF0ZSBsYXRlci4KLQkJICovCi0KLQkJLm1hY3JvIHRlc3RfZm9yX2lwaSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCQliaWMJXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotCQljbXAJXGlycW5yLCAjMTYKLQkJc3RyY2MJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQotCQljbXBjcwlcaXJxbnIsIFxpcnFucgotCQkuZW5kbQotCi0JCS8qIEFzIGFib3ZlLCB0aGlzIGFzc3VtZXMgdGhhdCBpcnFzdGF0IGFuZCBiYXNlIGFyZSBwcmVzZXJ2ZWQuLiAqLwotCi0JCS5tYWNybyB0ZXN0X2Zvcl9sdGlycSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5MjY2Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2dwaW8uaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBHUElPIGxpYiBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKLSNkZWZpbmUgX19BU01fQVJDSF9HUElPX0ggX19GSUxFX18KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQotCi0vKiBQcmFjdGljYWxseSwgR1BJTyBiYW5rcyB1cCB0byBHUFogYXJlIHRoZSBjb25maWd1cmFibGUgZ3BpbyBiYW5rcyAqLwotCi0vKiBHUElPIGJhbmsgc2l6ZXMgKi8KLSNkZWZpbmUgRVhZTk9TNF9HUElPX0EwX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fQTFfTlIJKDYpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19CX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fQzBfTlIJKDUpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19DMV9OUgkoNSkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0QwX05SCSg0KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRDFfTlIJKDQpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19FMF9OUgkoNSkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0UxX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRTJfTlIJKDYpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19FM19OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0U0X05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRjBfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19GMV9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0YyX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fRjNfTlIJKDYpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19KMF9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0oxX05SCSg1KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fSzBfTlIJKDcpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19LMV9OUgkoNykKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0syX05SCSg3KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fSzNfTlIJKDcpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19MMF9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX0wxX05SCSgzKQotI2RlZmluZSBFWFlOT1M0X0dQSU9fTDJfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19YMF9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1gxX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWDJfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19YM19OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1kwX05SCSg2KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWTFfTlIJKDQpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19ZMl9OUgkoNikKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1kzX05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWTRfTlIJKDgpCi0jZGVmaW5lIEVYWU5PUzRfR1BJT19ZNV9OUgkoOCkKLSNkZWZpbmUgRVhZTk9TNF9HUElPX1k2X05SCSg4KQotI2RlZmluZSBFWFlOT1M0X0dQSU9fWl9OUgkoNykKLQotLyogR1BJTyBiYW5rIG51bWJlcnMgKi8KLQotI2RlZmluZSBFWFlOT1M0X0dQSU9fTkVYVChfX2dwaW8pIFwKLQkoKF9fZ3BpbyMjX1NUQVJUKSArIChfX2dwaW8jI19OUikgKyBDT05GSUdfUzNDX0dQSU9fU1BBQ0UgKyAxKQotCi1lbnVtIHM1cF9ncGlvX251bWJlciB7Ci0JRVhZTk9TNF9HUElPX0EwX1NUQVJUCT0gMCwKLQlFWFlOT1M0X0dQSU9fQTFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQTApLAotCUVYWU5PUzRfR1BJT19CX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0ExKSwKLQlFWFlOT1M0X0dQSU9fQzBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQiksCi0JRVhZTk9TNF9HUElPX0MxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0MwKSwKLQlFWFlOT1M0X0dQSU9fRDBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fQzEpLAotCUVYWU5PUzRfR1BJT19EMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19EMCksCi0JRVhZTk9TNF9HUElPX0UwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0QxKSwKLQlFWFlOT1M0X0dQSU9fRTFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTApLAotCUVYWU5PUzRfR1BJT19FMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FMSksCi0JRVhZTk9TNF9HUElPX0UzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0UyKSwKLQlFWFlOT1M0X0dQSU9fRTRfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRTMpLAotCUVYWU5PUzRfR1BJT19GMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19FNCksCi0JRVhZTk9TNF9HUElPX0YxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YwKSwKLQlFWFlOT1M0X0dQSU9fRjJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fRjEpLAotCUVYWU5PUzRfR1BJT19GM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19GMiksCi0JRVhZTk9TNF9HUElPX0owX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0YzKSwKLQlFWFlOT1M0X0dQSU9fSjFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSjApLAotCUVYWU5PUzRfR1BJT19LMF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19KMSksCi0JRVhZTk9TNF9HUElPX0sxX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0swKSwKLQlFWFlOT1M0X0dQSU9fSzJfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fSzEpLAotCUVYWU5PUzRfR1BJT19LM19TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19LMiksCi0JRVhZTk9TNF9HUElPX0wwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0szKSwKLQlFWFlOT1M0X0dQSU9fTDFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fTDApLAotCUVYWU5PUzRfR1BJT19MMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19MMSksCi0JRVhZTk9TNF9HUElPX1gwX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX0wyKSwKLQlFWFlOT1M0X0dQSU9fWDFfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDApLAotCUVYWU5PUzRfR1BJT19YMl9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19YMSksCi0JRVhZTk9TNF9HUElPX1gzX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1gyKSwKLQlFWFlOT1M0X0dQSU9fWTBfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWDMpLAotCUVYWU5PUzRfR1BJT19ZMV9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMCksCi0JRVhZTk9TNF9HUElPX1kyX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1kxKSwKLQlFWFlOT1M0X0dQSU9fWTNfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTIpLAotCUVYWU5PUzRfR1BJT19ZNF9TVEFSVAk9IEVYWU5PUzRfR1BJT19ORVhUKEVYWU5PUzRfR1BJT19ZMyksCi0JRVhZTk9TNF9HUElPX1k1X1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1k0KSwKLQlFWFlOT1M0X0dQSU9fWTZfU1RBUlQJPSBFWFlOT1M0X0dQSU9fTkVYVChFWFlOT1M0X0dQSU9fWTUpLAotCUVYWU5PUzRfR1BJT19aX1NUQVJUCT0gRVhZTk9TNF9HUElPX05FWFQoRVhZTk9TNF9HUElPX1k2KSwKLX07Ci0KLS8qIEVYWU5PUzQgR1BJTyBudW1iZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRVhZTk9TNF9HUEEwKF9ucikJKEVYWU5PUzRfR1BJT19BMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQQTEoX25yKQkoRVhZTk9TNF9HUElPX0ExX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BCKF9ucikJKEVYWU5PUzRfR1BJT19CX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BDMChfbnIpCShFWFlOT1M0X0dQSU9fQzBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEMxKF9ucikJKEVYWU5PUzRfR1BJT19DMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRDAoX25yKQkoRVhZTk9TNF9HUElPX0QwX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BEMShfbnIpCShFWFlOT1M0X0dQSU9fRDFfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEUwKF9ucikJKEVYWU5PUzRfR1BJT19FMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRTEoX25yKQkoRVhZTk9TNF9HUElPX0UxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BFMihfbnIpCShFWFlOT1M0X0dQSU9fRTJfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEUzKF9ucikJKEVYWU5PUzRfR1BJT19FM19TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRTQoX25yKQkoRVhZTk9TNF9HUElPX0U0X1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BGMChfbnIpCShFWFlOT1M0X0dQSU9fRjBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEYxKF9ucikJKEVYWU5PUzRfR1BJT19GMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQRjIoX25yKQkoRVhZTk9TNF9HUElPX0YyX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BGMyhfbnIpCShFWFlOT1M0X0dQSU9fRjNfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEowKF9ucikJKEVYWU5PUzRfR1BJT19KMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQSjEoX25yKQkoRVhZTk9TNF9HUElPX0oxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BLMChfbnIpCShFWFlOT1M0X0dQSU9fSzBfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEsxKF9ucikJKEVYWU5PUzRfR1BJT19LMV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQSzIoX25yKQkoRVhZTk9TNF9HUElPX0syX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BLMyhfbnIpCShFWFlOT1M0X0dQSU9fSzNfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUEwwKF9ucikJKEVYWU5PUzRfR1BJT19MMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQTDEoX25yKQkoRVhZTk9TNF9HUElPX0wxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BMMihfbnIpCShFWFlOT1M0X0dQSU9fTDJfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFgwKF9ucikJKEVYWU5PUzRfR1BJT19YMF9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWDEoX25yKQkoRVhZTk9TNF9HUElPX1gxX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BYMihfbnIpCShFWFlOT1M0X0dQSU9fWDJfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFgzKF9ucikJKEVYWU5PUzRfR1BJT19YM19TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWTAoX25yKQkoRVhZTk9TNF9HUElPX1kwX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BZMShfbnIpCShFWFlOT1M0X0dQSU9fWTFfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFkyKF9ucikJKEVYWU5PUzRfR1BJT19ZMl9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWTMoX25yKQkoRVhZTk9TNF9HUElPX1kzX1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BZNChfbnIpCShFWFlOT1M0X0dQSU9fWTRfU1RBUlQgKyAoX25yKSkKLSNkZWZpbmUgRVhZTk9TNF9HUFk1KF9ucikJKEVYWU5PUzRfR1BJT19ZNV9TVEFSVCArIChfbnIpKQotI2RlZmluZSBFWFlOT1M0X0dQWTYoX25yKQkoRVhZTk9TNF9HUElPX1k2X1NUQVJUICsgKF9ucikpCi0jZGVmaW5lIEVYWU5PUzRfR1BaKF9ucikJKEVYWU5PUzRfR1BJT19aX1NUQVJUICsgKF9ucikpCi0KLS8qIHRoZSBlbmQgb2YgdGhlIEVYWU5PUzQgc3BlY2lmaWMgZ3Bpb3MgKi8KLSNkZWZpbmUgRVhZTk9TNF9HUElPX0VORAkoRVhZTk9TNF9HUFooRVhZTk9TNF9HUElPX1pfTlIpICsgMSkKLSNkZWZpbmUgUzNDX0dQSU9fRU5ECQlFWFlOT1M0X0dQSU9fRU5ECi0KLS8qIGRlZmluZSB0aGUgbnVtYmVyIG9mIGdwaW9zIHdlIG5lZWQgdG8gdGhlIG9uZSBhZnRlciB0aGUgR1BaKCkgcmFuZ2UgKi8KLSNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKEVYWU5PUzRfR1BaKEVYWU5PUzRfR1BJT19aX05SKSArCVwKLQkJCQkgQ09ORklHX1NBTVNVTkdfR1BJT19FWFRSQSArIDEpCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2lycXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5NTJmOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL2lycXMuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBJUlEgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0lSUVNfSAotI2RlZmluZSBfX0FTTV9BUkNIX0lSUVNfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8cGxhdC9pcnFzLmg+Ci0KLS8qIFBQSTogUHJpdmF0ZSBQZXJpcGhlcmFsIEludGVycnVwdCAqLwotCi0jZGVmaW5lIElSUV9QUEkoeCkJCVM1UF9JUlEoeCsxNikKLQotLyogU1BJOiBTaGFyZWQgUGVyaXBoZXJhbCBJbnRlcnJ1cHQgKi8KLQotI2RlZmluZSBJUlFfU1BJKHgpCQlTNVBfSVJRKHgrMzIpCi0KLSNkZWZpbmUgSVJRX0VJTlQwCQlJUlFfU1BJKDE2KQotI2RlZmluZSBJUlFfRUlOVDEJCUlSUV9TUEkoMTcpCi0jZGVmaW5lIElSUV9FSU5UMgkJSVJRX1NQSSgxOCkKLSNkZWZpbmUgSVJRX0VJTlQzCQlJUlFfU1BJKDE5KQotI2RlZmluZSBJUlFfRUlOVDQJCUlSUV9TUEkoMjApCi0jZGVmaW5lIElSUV9FSU5UNQkJSVJRX1NQSSgyMSkKLSNkZWZpbmUgSVJRX0VJTlQ2CQlJUlFfU1BJKDIyKQotI2RlZmluZSBJUlFfRUlOVDcJCUlSUV9TUEkoMjMpCi0jZGVmaW5lIElSUV9FSU5UOAkJSVJRX1NQSSgyNCkKLSNkZWZpbmUgSVJRX0VJTlQ5CQlJUlFfU1BJKDI1KQotI2RlZmluZSBJUlFfRUlOVDEwCQlJUlFfU1BJKDI2KQotI2RlZmluZSBJUlFfRUlOVDExCQlJUlFfU1BJKDI3KQotI2RlZmluZSBJUlFfRUlOVDEyCQlJUlFfU1BJKDI4KQotI2RlZmluZSBJUlFfRUlOVDEzCQlJUlFfU1BJKDI5KQotI2RlZmluZSBJUlFfRUlOVDE0CQlJUlFfU1BJKDMwKQotI2RlZmluZSBJUlFfRUlOVDE1CQlJUlFfU1BJKDMxKQotI2RlZmluZSBJUlFfRUlOVDE2XzMxCQlJUlFfU1BJKDMyKQotCi0jZGVmaW5lIElSUV9QRE1BMAkJSVJRX1NQSSgzNSkKLSNkZWZpbmUgSVJRX1BETUExCQlJUlFfU1BJKDM2KQotI2RlZmluZSBJUlFfVElNRVIwX1ZJQwkJSVJRX1NQSSgzNykKLSNkZWZpbmUgSVJRX1RJTUVSMV9WSUMJCUlSUV9TUEkoMzgpCi0jZGVmaW5lIElSUV9USU1FUjJfVklDCQlJUlFfU1BJKDM5KQotI2RlZmluZSBJUlFfVElNRVIzX1ZJQwkJSVJRX1NQSSg0MCkKLSNkZWZpbmUgSVJRX1RJTUVSNF9WSUMJCUlSUV9TUEkoNDEpCi0jZGVmaW5lIElSUV9NQ1RfTDAJCUlSUV9TUEkoNDIpCi0jZGVmaW5lIElSUV9XRFQJCQlJUlFfU1BJKDQzKQotI2RlZmluZSBJUlFfUlRDX0FMQVJNCQlJUlFfU1BJKDQ0KQotI2RlZmluZSBJUlFfUlRDX1RJQwkJSVJRX1NQSSg0NSkKLSNkZWZpbmUgSVJRX0dQSU9fWEIJCUlSUV9TUEkoNDYpCi0jZGVmaW5lIElSUV9HUElPX1hBCQlJUlFfU1BJKDQ3KQotI2RlZmluZSBJUlFfTUNUX0wxCQlJUlFfU1BJKDQ4KQotCi0jZGVmaW5lIElSUV9VQVJUMAkJSVJRX1NQSSg1MikKLSNkZWZpbmUgSVJRX1VBUlQxCQlJUlFfU1BJKDUzKQotI2RlZmluZSBJUlFfVUFSVDIJCUlSUV9TUEkoNTQpCi0jZGVmaW5lIElSUV9VQVJUMwkJSVJRX1NQSSg1NSkKLSNkZWZpbmUgSVJRX1VBUlQ0CQlJUlFfU1BJKDU2KQotI2RlZmluZSBJUlFfTUNUX0cwCQlJUlFfU1BJKDU3KQotI2RlZmluZSBJUlFfSUlDCQkJSVJRX1NQSSg1OCkKLSNkZWZpbmUgSVJRX0lJQzEJCUlSUV9TUEkoNTkpCi0jZGVmaW5lIElSUV9JSUMyCQlJUlFfU1BJKDYwKQotI2RlZmluZSBJUlFfSUlDMwkJSVJRX1NQSSg2MSkKLSNkZWZpbmUgSVJRX0lJQzQJCUlSUV9TUEkoNjIpCi0jZGVmaW5lIElSUV9JSUM1CQlJUlFfU1BJKDYzKQotI2RlZmluZSBJUlFfSUlDNgkJSVJRX1NQSSg2NCkKLSNkZWZpbmUgSVJRX0lJQzcJCUlSUV9TUEkoNjUpCi0KLSNkZWZpbmUgSVJRX1VTQl9IT1NUCQlJUlFfU1BJKDcwKQotI2RlZmluZSBJUlFfVVNCX0hTT1RHCQlJUlFfU1BJKDcxKQotI2RlZmluZSBJUlFfTU9ERU1fSUYJCUlSUV9TUEkoNzIpCi0jZGVmaW5lIElSUV9IU01NQzAJCUlSUV9TUEkoNzMpCi0jZGVmaW5lIElSUV9IU01NQzEJCUlSUV9TUEkoNzQpCi0jZGVmaW5lIElSUV9IU01NQzIJCUlSUV9TUEkoNzUpCi0jZGVmaW5lIElSUV9IU01NQzMJCUlSUV9TUEkoNzYpCi0jZGVmaW5lIElSUV9EV01DSQkJSVJRX1NQSSg3NykKLQotI2RlZmluZSBJUlFfTUlQSV9DU0lTMAkJSVJRX1NQSSg3OCkKLSNkZWZpbmUgSVJRX01JUElfQ1NJUzEJCUlSUV9TUEkoODApCi0KLSNkZWZpbmUgSVJRX09ORU5BTkRfQVVESQlJUlFfU1BJKDgyKQotI2RlZmluZSBJUlFfUk9UQVRPUgkJSVJRX1NQSSg4MykKLSNkZWZpbmUgSVJRX0ZJTUMwCQlJUlFfU1BJKDg0KQotI2RlZmluZSBJUlFfRklNQzEJCUlSUV9TUEkoODUpCi0jZGVmaW5lIElSUV9GSU1DMgkJSVJRX1NQSSg4NikKLSNkZWZpbmUgSVJRX0ZJTUMzCQlJUlFfU1BJKDg3KQotI2RlZmluZSBJUlFfSlBFRwkJSVJRX1NQSSg4OCkKLSNkZWZpbmUgSVJRXzJECQkJSVJRX1NQSSg4OSkKLSNkZWZpbmUgSVJRX1BDSUUJCUlSUV9TUEkoOTApCi0KLSNkZWZpbmUgSVJRX01GQwkJCUlSUV9TUEkoOTQpCi0KLSNkZWZpbmUgSVJRX0FVRElPX1NTCQlJUlFfU1BJKDk2KQotI2RlZmluZSBJUlFfSTJTMAkJSVJRX1NQSSg5NykKLSNkZWZpbmUgSVJRX0kyUzEJCUlSUV9TUEkoOTgpCi0jZGVmaW5lIElSUV9JMlMyCQlJUlFfU1BJKDk5KQotI2RlZmluZSBJUlFfQUM5NwkJSVJRX1NQSSgxMDApCi0KLSNkZWZpbmUgSVJRX1NQRElGCQlJUlFfU1BJKDEwNCkKLSNkZWZpbmUgSVJRX0FEQzAJCUlSUV9TUEkoMTA1KQotI2RlZmluZSBJUlFfUEVOMAkJSVJRX1NQSSgxMDYpCi0jZGVmaW5lIElSUV9BREMxCQlJUlFfU1BJKDEwNykKLSNkZWZpbmUgSVJRX1BFTjEJCUlSUV9TUEkoMTA4KQotI2RlZmluZSBJUlFfS0VZUEFECQlJUlFfU1BJKDEwOSkKLSNkZWZpbmUgSVJRX1BNVQkJCUlSUV9TUEkoMTEwKQotI2RlZmluZSBJUlFfR1BTCQkJSVJRX1NQSSgxMTEpCi0jZGVmaW5lIElSUV9JTlRGRUVEQ1RSTF9TU1MJSVJRX1NQSSgxMTIpCi0jZGVmaW5lIElSUV9TTElNQlVTCQlJUlFfU1BJKDExMykKLQotI2RlZmluZSBJUlFfVFNJCQkJSVJRX1NQSSgxMTUpCi0jZGVmaW5lIElSUV9TQVRBCQlJUlFfU1BJKDExNikKLQotI2RlZmluZSBNQVhfSVJRX0lOX0NPTUJJTkVSCTgKLSNkZWZpbmUgQ09NQklORVJfR1JPVVAoeCkJKCh4KSAqIE1BWF9JUlFfSU5fQ09NQklORVIgKyBJUlFfU1BJKDEyOCkpCi0jZGVmaW5lIENPTUJJTkVSX0lSUSh4LCB5KQkoQ09NQklORVJfR1JPVVAoeCkgKyB5KQotCi0jZGVmaW5lIElSUV9TWVNNTVVfTURNQTBfMAlDT01CSU5FUl9JUlEoNCwgMCkKLSNkZWZpbmUgSVJRX1NZU01NVV9TU1NfMAlDT01CSU5FUl9JUlEoNCwgMSkKLSNkZWZpbmUgSVJRX1NZU01NVV9GSU1DMF8wCUNPTUJJTkVSX0lSUSg0LCAyKQotI2RlZmluZSBJUlFfU1lTTU1VX0ZJTUMxXzAJQ09NQklORVJfSVJRKDQsIDMpCi0jZGVmaW5lIElSUV9TWVNNTVVfRklNQzJfMAlDT01CSU5FUl9JUlEoNCwgNCkKLSNkZWZpbmUgSVJRX1NZU01NVV9GSU1DM18wCUNPTUJJTkVSX0lSUSg0LCA1KQotI2RlZmluZSBJUlFfU1lTTU1VX0pQRUdfMAlDT01CSU5FUl9JUlEoNCwgNikKLSNkZWZpbmUgSVJRX1NZU01NVV8yRF8wCQlDT01CSU5FUl9JUlEoNCwgNykKLQotI2RlZmluZSBJUlFfU1lTTU1VX1JPVEFUT1JfMAlDT01CSU5FUl9JUlEoNSwgMCkKLSNkZWZpbmUgSVJRX1NZU01NVV9NRE1BMV8wCUNPTUJJTkVSX0lSUSg1LCAxKQotI2RlZmluZSBJUlFfU1lTTU1VX0xDRDBfTTBfMAlDT01CSU5FUl9JUlEoNSwgMikKLSNkZWZpbmUgSVJRX1NZU01NVV9MQ0QxX00xXzAJQ09NQklORVJfSVJRKDUsIDMpCi0jZGVmaW5lIElSUV9TWVNNTVVfVFZfTTBfMAlDT01CSU5FUl9JUlEoNSwgNCkKLSNkZWZpbmUgSVJRX1NZU01NVV9NRkNfTTBfMAlDT01CSU5FUl9JUlEoNSwgNSkKLSNkZWZpbmUgSVJRX1NZU01NVV9NRkNfTTFfMAlDT01CSU5FUl9JUlEoNSwgNikKLSNkZWZpbmUgSVJRX1NZU01NVV9QQ0lFXzAJQ09NQklORVJfSVJRKDUsIDcpCi0KLSNkZWZpbmUgSVJRX0ZJTUQwX0ZJRk8JCUNPTUJJTkVSX0lSUSgxMSwgMCkKLSNkZWZpbmUgSVJRX0ZJTUQwX1ZTWU5DCQlDT01CSU5FUl9JUlEoMTEsIDEpCi0jZGVmaW5lIElSUV9GSU1EMF9TWVNURU0JQ09NQklORVJfSVJRKDExLCAyKQotCi0jZGVmaW5lIE1BWF9DT01CSU5FUl9OUgkJMTYKLQotI2RlZmluZSBJUlFfQURDCQkJSVJRX0FEQzAKLSNkZWZpbmUgSVJRX1RDCQkJSVJRX1BFTjAKLQotI2RlZmluZSBTNVBfSVJRX0VJTlRfQkFTRQlDT01CSU5FUl9JUlEoTUFYX0NPTUJJTkVSX05SLCAwKQotCi0jZGVmaW5lIFM1UF9FSU5UX0JBU0UxCQkoUzVQX0lSUV9FSU5UX0JBU0UgKyAwKQotI2RlZmluZSBTNVBfRUlOVF9CQVNFMgkJKFM1UF9JUlFfRUlOVF9CQVNFICsgMTYpCi0KLS8qIG9wdGlvbmFsIEdQSU8gaW50ZXJydXB0cyAqLwotI2RlZmluZSBTNVBfR1BJT0lOVF9CQVNFCShTNVBfSVJRX0VJTlRfQkFTRSArIDMyKQotI2RlZmluZSBJUlFfR1BJTzFfTlJfR1JPVVBTCTE2Ci0jZGVmaW5lIElSUV9HUElPMl9OUl9HUk9VUFMJOQotI2RlZmluZSBJUlFfR1BJT19FTkQJCShTNVBfR1BJT0lOVF9CQVNFICsgUzVQX0dQSU9JTlRfQ09VTlQpCi0KLS8qIFNldCB0aGUgZGVmYXVsdCBOUl9JUlFTICovCi0jZGVmaW5lIE5SX0lSUVMJCQkoSVJRX0dQSU9fRU5EICsgNjQpCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjI5NmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL21hcC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEVYWU5PUzQgLSBNZW1vcnkgbWFwIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NQVBfSAotI2RlZmluZSBfX0FTTV9BUkNIX01BUF9IIF9fRklMRV9fCi0KLSNpbmNsdWRlIDxwbGF0L21hcC1iYXNlLmg+Ci0KLS8qCi0gKiBFWFlOT1M0IFVBUlQgb2Zmc2V0IGlzIDB4MTAwMDAgYnV0IHRoZSBvbGRlciBTNVAgU29DcyBhcmUgMHg0MDAuCi0gKiBTbyBuZWVkIHRvIGRlZmluZSBpdCwgYW5kIGhlcmUgaXMgdG8gYXZvaWQgcmVkZWZpbml0aW9uIHdhcm5pbmcuCi0gKi8KLSNkZWZpbmUgUzNDX1VBUlRfT0ZGU0VUCQkJKDB4MTAwMDApCi0KLSNpbmNsdWRlIDxwbGF0L21hcC1zNXAuaD4KLQotI2RlZmluZSBFWFlOT1M0X1BBX1NZU1JBTQkJMHgwMjAyMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfRklNQzAJCTB4MTE4MDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9GSU1DMQkJMHgxMTgxMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUMyCQkweDExODIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfRklNQzMJCTB4MTE4MzAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0kyUzAJCQkweDAzODMwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfSTJTMQkJCTB4RTMxMDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9JMlMyCQkJMHhFMkEwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfUENNMAkJCTB4MDM4NDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9QQ00xCQkJMHgxMzk4MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1BDTTIJCQkweDEzOTkwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TUk9NX0JBTksoeCkJCSgweDA0MDAwMDAwICsgKCh4KSAqIDB4MDEwMDAwMDApKQotCi0jZGVmaW5lIEVYWU5PUzRfUEFfT05FTkFORAkJMHgwQzAwMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX09ORU5BTkRfRE1BCQkweDBDNjAwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9DSElQSUQJCTB4MTAwMDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1NZU0NPTgkJMHgxMDAxMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1BNVQkJCTB4MTAwMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9DTVUJCQkweDEwMDMwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNUSU1FUgkJMHgxMDA1MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1dBVENIRE9HCQkweDEwMDYwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfUlRDCQkJMHgxMDA3MDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfS0VZUEFECQkweDEwMEEwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9ETUMwCQkJMHgxMDQwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfQ09NQklORVIJCTB4MTA0NDAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0dJQ19DUFUJCTB4MTA0ODAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9HSUNfRElTVAkJMHgxMDQ5MDAwMAotI2RlZmluZSBFWFlOT1M0X0dJQ19CQU5LX09GRlNFVAkJMHg4MDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9DT1JFUEVSSQkJMHgxMDUwMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1RXRAkJCTB4MTA1MDA2MDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9MMkNDCQkJMHgxMDUwMjAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfTURNQQkJCTB4MTA4MTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9QRE1BMAkJMHgxMjY4MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1BETUExCQkweDEyNjkwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfTURNQQkJMHgxMEE0MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9TU1MJCTB4MTBBNTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNQzAJCTB4MTFBMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNQzEJCTB4MTFBMzAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNQzIJCTB4MTFBNDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfRklNQzMJCTB4MTFBNTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfSlBFRwkJMHgxMUE2MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMAkJMHgxMUUyMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9GSU1EMQkJMHgxMjIyMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9QQ0llCQkweDEyNjIwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1lTTU1VX0cyRAkJMHgxMkEyMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NZU01NVV9ST1RBVE9SCTB4MTJBMzAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfTURNQTIJCTB4MTJBNDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfVFYJCTB4MTJFMjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfTUZDX0wJCTB4MTM2MjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9TWVNNTVVfTUZDX1IJCTB4MTM2MzAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0dQSU8xCQkweDExNDAwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfR1BJTzIJCTB4MTEwMDAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9HUElPMwkJMHgwMzg2MDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfTUlQSV9DU0lTMAkJMHgxMTg4MDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX01JUElfQ1NJUzEJCTB4MTE4OTAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0ZJTUQwCQkweDExQzAwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9IU01NQyh4KQkJKDB4MTI1MTAwMDAgKyAoKHgpICogMHgxMDAwMCkpCi0jZGVmaW5lIEVYWU5PUzRfUEFfRFdNQ0kJCTB4MTI1NTAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1NBVEEJCQkweDEyNTYwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfU0FUQVBIWQkJMHgxMjVEMDAwMAotI2RlZmluZSBFWFlOT1M0X1BBX1NBVEFQSFlfQ1RSTAkJMHgxMjZCMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfU1JPTUMJCTB4MTI1NzAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX0VIQ0kJCQkweDEyNTgwMDAwCi0jZGVmaW5lIEVYWU5PUzRfUEFfSFNQSFkJCTB4MTI1QjAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9NRkMJCQkweDEzNDAwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9VQVJUCQkJMHgxMzgwMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfSUlDKHgpCQkoMHgxMzg2MDAwMCArICgoeCkgKiAweDEwMDAwKSkKLQotI2RlZmluZSBFWFlOT1M0X1BBX0FEQwkJCTB4MTM5MTAwMDAKLSNkZWZpbmUgRVhZTk9TNF9QQV9BREMxCQkJMHgxMzkxMTAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfQUM5NwkJCTB4MTM5QTAwMDAKLQotI2RlZmluZSBFWFlOT1M0X1BBX1NQRElGCQkweDEzOUIwMDAwCi0KLSNkZWZpbmUgRVhZTk9TNF9QQV9USU1FUgkJMHgxMzlEMDAwMAotCi0jZGVmaW5lIEVYWU5PUzRfUEFfU0RSQU0JCTB4NDAwMDAwMDAKLQotLyogQ29tcGF0aWJpbHRpeSBEZWZpbmVzICovCi0KLSNkZWZpbmUgUzNDX1BBX0hTTU1DMAkJCUVYWU5PUzRfUEFfSFNNTUMoMCkKLSNkZWZpbmUgUzNDX1BBX0hTTU1DMQkJCUVYWU5PUzRfUEFfSFNNTUMoMSkKLSNkZWZpbmUgUzNDX1BBX0hTTU1DMgkJCUVYWU5PUzRfUEFfSFNNTUMoMikKLSNkZWZpbmUgUzNDX1BBX0hTTU1DMwkJCUVYWU5PUzRfUEFfSFNNTUMoMykKLSNkZWZpbmUgUzNDX1BBX0lJQwkJCUVYWU5PUzRfUEFfSUlDKDApCi0jZGVmaW5lIFMzQ19QQV9JSUMxCQkJRVhZTk9TNF9QQV9JSUMoMSkKLSNkZWZpbmUgUzNDX1BBX0lJQzIJCQlFWFlOT1M0X1BBX0lJQygyKQotI2RlZmluZSBTM0NfUEFfSUlDMwkJCUVYWU5PUzRfUEFfSUlDKDMpCi0jZGVmaW5lIFMzQ19QQV9JSUM0CQkJRVhZTk9TNF9QQV9JSUMoNCkKLSNkZWZpbmUgUzNDX1BBX0lJQzUJCQlFWFlOT1M0X1BBX0lJQyg1KQotI2RlZmluZSBTM0NfUEFfSUlDNgkJCUVYWU5PUzRfUEFfSUlDKDYpCi0jZGVmaW5lIFMzQ19QQV9JSUM3CQkJRVhZTk9TNF9QQV9JSUMoNykKLSNkZWZpbmUgU0FNU1VOR19QQV9BREMJCQlFWFlOT1M0X1BBX0FEQwotI2RlZmluZSBTQU1TVU5HX1BBX0FEQzEJCQlFWFlOT1M0X1BBX0FEQzEKLSNkZWZpbmUgUzNDX1BBX1JUQwkJCUVYWU5PUzRfUEFfUlRDCi0jZGVmaW5lIFMzQ19QQV9XRFQJCQlFWFlOT1M0X1BBX1dBVENIRE9HCi0KLSNkZWZpbmUgUzVQX1BBX0NISVBJRAkJCUVYWU5PUzRfUEFfQ0hJUElECi0jZGVmaW5lIFM1UF9QQV9GSU1DMAkJCUVYWU5PUzRfUEFfRklNQzAKLSNkZWZpbmUgUzVQX1BBX0ZJTUMxCQkJRVhZTk9TNF9QQV9GSU1DMQotI2RlZmluZSBTNVBfUEFfRklNQzIJCQlFWFlOT1M0X1BBX0ZJTUMyCi0jZGVmaW5lIFM1UF9QQV9GSU1DMwkJCUVYWU5PUzRfUEFfRklNQzMKLSNkZWZpbmUgUzVQX1BBX01JUElfQ1NJUzAJCUVYWU5PUzRfUEFfTUlQSV9DU0lTMAotI2RlZmluZSBTNVBfUEFfTUlQSV9DU0lTMQkJRVhZTk9TNF9QQV9NSVBJX0NTSVMxCi0jZGVmaW5lIFM1UF9QQV9GSU1EMAkJCUVYWU5PUzRfUEFfRklNRDAKLSNkZWZpbmUgUzVQX1BBX09ORU5BTkQJCQlFWFlOT1M0X1BBX09ORU5BTkQKLSNkZWZpbmUgUzVQX1BBX09ORU5BTkRfRE1BCQlFWFlOT1M0X1BBX09ORU5BTkRfRE1BCi0jZGVmaW5lIFM1UF9QQV9TRFJBTQkJCUVYWU5PUzRfUEFfU0RSQU0KLSNkZWZpbmUgUzVQX1BBX1NST01DCQkJRVhZTk9TNF9QQV9TUk9NQwotI2RlZmluZSBTNVBfUEFfTUZDCQkJRVhZTk9TNF9QQV9NRkMKLSNkZWZpbmUgUzVQX1BBX1NZU0NPTgkJCUVYWU5PUzRfUEFfU1lTQ09OCi0jZGVmaW5lIFM1UF9QQV9USU1FUgkJCUVYWU5PUzRfUEFfVElNRVIKLSNkZWZpbmUgUzVQX1BBX0VIQ0kJCQlFWFlOT1M0X1BBX0VIQ0kKLQotI2RlZmluZSBTQU1TVU5HX1BBX0tFWVBBRAkJRVhZTk9TNF9QQV9LRVlQQUQKLQotLyogVUFSVCAqLwotCi0jZGVmaW5lIFMzQ19QQV9VQVJUCQkJRVhZTk9TNF9QQV9VQVJUCi0KLSNkZWZpbmUgUzVQX1BBX1VBUlQoeCkJCQkoUzNDX1BBX1VBUlQgKyAoKHgpICogUzNDX1VBUlRfT0ZGU0VUKSkKLSNkZWZpbmUgUzVQX1BBX1VBUlQwCQkJUzVQX1BBX1VBUlQoMCkKLSNkZWZpbmUgUzVQX1BBX1VBUlQxCQkJUzVQX1BBX1VBUlQoMSkKLSNkZWZpbmUgUzVQX1BBX1VBUlQyCQkJUzVQX1BBX1VBUlQoMikKLSNkZWZpbmUgUzVQX1BBX1VBUlQzCQkJUzVQX1BBX1VBUlQoMykKLSNkZWZpbmUgUzVQX1BBX1VBUlQ0CQkJUzVQX1BBX1VBUlQoNCkKLQotI2RlZmluZSBTNVBfU1pfVUFSVAkJCVNaXzI1NgotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbS1jb3JlLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmM2I4MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oLAotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBFWFlOT1M0MjEwIC0gUE0gY29yZSBzdXBwb3J0IGZvciBhcmNoL2FybS9wbGF0LXM1cC9wbS5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0jaW5jbHVkZSA8bWFjaC9yZWdzLXBtdS5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX2RlYnVnX2luaXRfdWFydCh2b2lkKQotewotCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9hcmNoX3ByZXBhcmVfaXJxcyh2b2lkKQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0JdG1wID0gX19yYXdfcmVhZGwoUzVQX1dBS0VVUF9NQVNLKTsKLQl0bXAgJj0gfigxIDw8IDMxKTsKLQlfX3Jhd193cml0ZWwodG1wLCBTNVBfV0FLRVVQX01BU0spOwotCi0JX19yYXdfd3JpdGVsKHMzY19pcnF3YWtlX2ludG1hc2ssIFM1UF9XQUtFVVBfTUFTSyk7Ci0JX19yYXdfd3JpdGVsKHMzY19pcnF3YWtlX2VpbnRtYXNrLCBTNVBfRUlOVF9XQUtFVVBfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9zdG9wX2Nsb2Nrcyh2b2lkKQotewotCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9hcmNoX3Nob3dfcmVzdW1lX2lycXModm9pZCkKLXsKLQkvKiBub3RoaW5nIGhlcmUgeWV0ICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF91cGRhdGVfdWFydCh2b2lkIF9faW9tZW0gKnJlZ3MsCi0JCQkJCSAgIHN0cnVjdCBwbV91YXJ0X3NhdmUgKnNhdmUpCi17Ci0JLyogbm90aGluZyBoZXJlIHlldCAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3Jlc3RvcmVkX2dwaW9zKHZvaWQpCi17Ci0JLyogbm90aGluZyBoZXJlIHlldCAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3NhdmVkX2dwaW9zKHZvaWQpCi17Ci0JLyogbm90aGluZyBoZXJlIHlldCAqLwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbXUuaCBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTI5MDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcG11LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEVYWU5PUzQyMTAgLSBQTVUoUG93ZXIgTWFuYWdlbWVudCBVbml0KSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9QTVVfSAotI2RlZmluZSBfX0FTTV9BUkNIX1BNVV9IIF9fRklMRV9fCi0KLWVudW0gc3lzX3Bvd2VyZG93biB7Ci0JU1lTX0FGVFIsCi0JU1lTX0xQQSwKLQlTWVNfU0xFRVAsCi0JTlVNX1NZU19QT1dFUkRPV04sCi19OwotCi1leHRlcm4gdm9pZCBleHlub3M0X3N5c19wb3dlcmRvd25fY29uZihlbnVtIHN5c19wb3dlcmRvd24gbW9kZSk7Ci0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1BNVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxMjA5MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKLSAqCi0gKiBFWFlOT1M0IC0gcHdtIGNsb2NrIGFuZCB0aW1lciBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9QV01DTEtfSAotI2RlZmluZSBfX0FTTV9BUkNIX1BXTUNMS19IIF9fRklMRV9fCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIHRjZmcgPT0gUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSzsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8IHRjZmcxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9QV01DTEtfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5M2ZkYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBDbG9jayByZWdpc3RlciBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19IIF9fRklMRV9fCi0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jZGVmaW5lIFM1UF9DTEtSRUcoeCkJCQkoUzVQX1ZBX0NNVSArICh4KSkKLQotI2RlZmluZSBTNVBfQ0xLRElWX0xFRlRCVVMJCVM1UF9DTEtSRUcoMHgwNDUwMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX0xFRlRCVVMJCVM1UF9DTEtSRUcoMHgwNDYwMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfTEVGVEJVUwkJUzVQX0NMS1JFRygweDA0ODAwKQotCi0jZGVmaW5lIFM1UF9DTEtESVZfUklHSFRCVVMJCVM1UF9DTEtSRUcoMHgwODUwMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX1JJR0hUQlVTCVM1UF9DTEtSRUcoMHgwODYwMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUklHSFRCVVMJCVM1UF9DTEtSRUcoMHgwODgwMCkKLQotI2RlZmluZSBTNVBfRVBMTF9MT0NLCQkJUzVQX0NMS1JFRygweDBDMDEwKQotI2RlZmluZSBTNVBfVlBMTF9MT0NLCQkJUzVQX0NMS1JFRygweDBDMDIwKQotCi0jZGVmaW5lIFM1UF9FUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MEMxMTApCi0jZGVmaW5lIFM1UF9FUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MEMxMTQpCi0jZGVmaW5lIFM1UF9WUExMX0NPTjAJCQlTNVBfQ0xLUkVHKDB4MEMxMjApCi0jZGVmaW5lIFM1UF9WUExMX0NPTjEJCQlTNVBfQ0xLUkVHKDB4MEMxMjQpCi0KLSNkZWZpbmUgUzVQX0NMS1NSQ19UT1AwCQkJUzVQX0NMS1JFRygweDBDMjEwKQotI2RlZmluZSBTNVBfQ0xLU1JDX1RPUDEJCQlTNVBfQ0xLUkVHKDB4MEMyMTQpCi0jZGVmaW5lIFM1UF9DTEtTUkNfQ0FNCQkJUzVQX0NMS1JFRygweDBDMjIwKQotI2RlZmluZSBTNVBfQ0xLU1JDX1RWCQkJUzVQX0NMS1JFRygweDBDMjI0KQotI2RlZmluZSBTNVBfQ0xLU1JDX01GQwkJCVM1UF9DTEtSRUcoMHgwQzIyOCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19HM0QJCQlTNVBfQ0xLUkVHKDB4MEMyMkMpCi0jZGVmaW5lIFM1UF9DTEtTUkNfSU1BR0UJCVM1UF9DTEtSRUcoMHgwQzIzMCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19MQ0QwCQkJUzVQX0NMS1JFRygweDBDMjM0KQotI2RlZmluZSBTNVBfQ0xLU1JDX0xDRDEJCQlTNVBfQ0xLUkVHKDB4MEMyMzgpCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFVRElPCQlTNVBfQ0xLUkVHKDB4MEMyM0MpCi0jZGVmaW5lIFM1UF9DTEtTUkNfRlNZUwkJCVM1UF9DTEtSRUcoMHgwQzI0MCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19QRVJJTDAJCVM1UF9DTEtSRUcoMHgwQzI1MCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19QRVJJTDEJCVM1UF9DTEtSRUcoMHgwQzI1NCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUAkJCVM1UF9DTEtSRUcoMHgwQzUxMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DQU0JCQlTNVBfQ0xLUkVHKDB4MEM1MjApCi0jZGVmaW5lIFM1UF9DTEtESVZfVFYJCQlTNVBfQ0xLUkVHKDB4MEM1MjQpCi0jZGVmaW5lIFM1UF9DTEtESVZfTUZDCQkJUzVQX0NMS1JFRygweDBDNTI4KQotI2RlZmluZSBTNVBfQ0xLRElWX0czRAkJCVM1UF9DTEtSRUcoMHgwQzUyQykKLSNkZWZpbmUgUzVQX0NMS0RJVl9JTUFHRQkJUzVQX0NMS1JFRygweDBDNTMwKQotI2RlZmluZSBTNVBfQ0xLRElWX0xDRDAJCQlTNVBfQ0xLUkVHKDB4MEM1MzQpCi0jZGVmaW5lIFM1UF9DTEtESVZfTENEMQkJCVM1UF9DTEtSRUcoMHgwQzUzOCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9NQVVESU8JCVM1UF9DTEtSRUcoMHgwQzUzQykKLSNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMAkJUzVQX0NMS1JFRygweDBDNTQwKQotI2RlZmluZSBTNVBfQ0xLRElWX0ZTWVMxCQlTNVBfQ0xLUkVHKDB4MEM1NDQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRlNZUzIJCVM1UF9DTEtSRUcoMHgwQzU0OCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9GU1lTMwkJUzVQX0NMS1JFRygweDBDNTRDKQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMAkJUzVQX0NMS1JFRygweDBDNTUwKQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMQkJUzVQX0NMS1JFRygweDBDNTU0KQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMgkJUzVQX0NMS1JFRygweDBDNTU4KQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMMwkJUzVQX0NMS1JFRygweDBDNTVDKQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMNAkJUzVQX0NMS1JFRygweDBDNTYwKQotI2RlZmluZSBTNVBfQ0xLRElWX1BFUklMNQkJUzVQX0NMS1JFRygweDBDNTY0KQotI2RlZmluZSBTNVBfQ0xLRElWMl9SQVRJTwkJUzVQX0NMS1JFRygweDBDNTgwKQotCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19UT1AJCVM1UF9DTEtSRUcoMHgwQzMxMCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0NBTQkJUzVQX0NMS1JFRygweDBDMzIwKQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfVFYJCVM1UF9DTEtSRUcoMHgwQzMyNCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0xDRDAJCVM1UF9DTEtSRUcoMHgwQzMzNCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX0xDRDEJCVM1UF9DTEtSRUcoMHgwQzMzOCkKLSNkZWZpbmUgUzVQX0NMS1NSQ19NQVNLX01BVURJTwkJUzVQX0NMS1JFRygweDBDMzNDKQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfRlNZUwkJUzVQX0NMS1JFRygweDBDMzQwKQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfUEVSSUwwCQlTNVBfQ0xLUkVHKDB4MEMzNTApCi0jZGVmaW5lIFM1UF9DTEtTUkNfTUFTS19QRVJJTDEJCVM1UF9DTEtSRUcoMHgwQzM1NCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX1NUQVRfVE9QCQlTNVBfQ0xLUkVHKDB4MEM2MTApCi0KLSNkZWZpbmUgUzVQX0NMS0dBVEVfU0NMS0NBTQkJUzVQX0NMS1JFRygweDBDODIwKQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9DQU0JCVM1UF9DTEtSRUcoMHgwQzkyMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfVFYJCVM1UF9DTEtSRUcoMHgwQzkyNCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfTUZDCQlTNVBfQ0xLUkVHKDB4MEM5MjgpCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0czRAkJUzVQX0NMS1JFRygweDBDOTJDKQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9JTUFHRQkJUzVQX0NMS1JFRygweDBDOTMwKQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9MQ0QwCQlTNVBfQ0xLUkVHKDB4MEM5MzQpCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0xDRDEJCVM1UF9DTEtSRUcoMHgwQzkzOCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfRlNZUwkJUzVQX0NMS1JFRygweDBDOTQwKQotI2RlZmluZSBTNVBfQ0xLR0FURV9JUF9HUFMJCVM1UF9DTEtSRUcoMHgwQzk0QykKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSUwJCVM1UF9DTEtSRUcoMHgwQzk1MCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfUEVSSVIJCVM1UF9DTEtSRUcoMHgwQzk2MCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfQkxPQ0sJCVM1UF9DTEtSRUcoMHgwQzk3MCkKLQotI2RlZmluZSBTNVBfQ0xLU1JDX01BU0tfRE1DCQlTNVBfQ0xLUkVHKDB4MTAzMDApCi0jZGVmaW5lIFM1UF9DTEtTUkNfRE1DCQkJUzVQX0NMS1JFRygweDEwMjAwKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzAJCQlTNVBfQ0xLUkVHKDB4MTA1MDApCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMQkJCVM1UF9DTEtSRUcoMHgxMDUwNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUX0RNQzAJCVM1UF9DTEtSRUcoMHgxMDYwMCkKLSNkZWZpbmUgUzVQX0NMS0dBVEVfSVBfRE1DCQlTNVBfQ0xLUkVHKDB4MTA5MDApCi0KLSNkZWZpbmUgUzVQX0FQTExfTE9DSwkJCVM1UF9DTEtSRUcoMHgxNDAwMCkKLSNkZWZpbmUgUzVQX01QTExfTE9DSwkJCVM1UF9DTEtSRUcoMHgxNDAwNCkKLSNkZWZpbmUgUzVQX0FQTExfQ09OMAkJCVM1UF9DTEtSRUcoMHgxNDEwMCkKLSNkZWZpbmUgUzVQX0FQTExfQ09OMQkJCVM1UF9DTEtSRUcoMHgxNDEwNCkKLSNkZWZpbmUgUzVQX01QTExfQ09OMAkJCVM1UF9DTEtSRUcoMHgxNDEwOCkKLSNkZWZpbmUgUzVQX01QTExfQ09OMQkJCVM1UF9DTEtSRUcoMHgxNDEwQykKLQotI2RlZmluZSBTNVBfQ0xLU1JDX0NQVQkJCVM1UF9DTEtSRUcoMHgxNDIwMCkKLSNkZWZpbmUgUzVQX0NMS01VWF9TVEFUQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ0MDApCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUJCQlTNVBfQ0xLUkVHKDB4MTQ1MDApCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMQkJCVM1UF9DTEtSRUcoMHgxNDUwNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9TVEFUQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ2MDApCi0jZGVmaW5lIFM1UF9DTEtESVZfU1RBVENQVTEJCVM1UF9DTEtSRUcoMHgxNDYwNCkKLQotI2RlZmluZSBTNVBfQ0xLR0FURV9TQ0xLQ1BVCQlTNVBfQ0xLUkVHKDB4MTQ4MDApCi0jZGVmaW5lIFM1UF9DTEtHQVRFX0lQX0NQVQkJUzVQX0NMS1JFRygweDE0OTAwKQotCi0jZGVmaW5lIFM1UF9BUExMX0xPQ0tUSU1FCQkoMHgxQzIwKQkvKiAzMDB1cyAqLwotCi0jZGVmaW5lIFM1UF9BUExMQ09OMF9FTkFCTEVfU0hJRlQJKDMxKQotI2RlZmluZSBTNVBfQVBMTENPTjBfTE9DS0VEX1NISUZUCSgyOSkKLSNkZWZpbmUgUzVQX0FQTExfVkFMXzEwMDAJCSgoMjUwIDw8IDE2KSB8ICg2IDw8IDgpIHwgMSkKLSNkZWZpbmUgUzVQX0FQTExfVkFMXzgwMAkJKCgyMDAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxKQotCi0jZGVmaW5lIFM1UF9FUExMQ09OMF9FTkFCTEVfU0hJRlQJKDMxKQotI2RlZmluZSBTNVBfRVBMTENPTjBfTE9DS0VEX1NISUZUCSgyOSkKLQotI2RlZmluZSBTNVBfVlBMTENPTjBfRU5BQkxFX1NISUZUCSgzMSkKLSNkZWZpbmUgUzVQX1ZQTExDT04wX0xPQ0tFRF9TSElGVAkoMjkpCi0KLSNkZWZpbmUgUzVQX0NMS1NSQ19DUFVfTVVYQ09SRV9TSElGVAkoMTYpCi0jZGVmaW5lIFM1UF9DTEtNVVhfU1RBVENQVV9NVVhDT1JFX01BU0sJKDB4NyA8PCBTNVBfQ0xLU1JDX0NQVV9NVVhDT1JFX1NISUZUKQotCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFX1NISUZUCSgwKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQ09SRV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0NPUkVfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfU0hJRlQJKDQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTBfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfU0hJRlQJKDgpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9DT1JFTTFfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9QRVJJUEhfU0hJRlQJKDEyKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0NQVTBfUEVSSVBIX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfQVRCX1NISUZUCSgxNikKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FUQl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX0FUQl9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfU0hJRlQJKDIwKQotI2RlZmluZSBTNVBfQ0xLRElWX0NQVTBfUENMS0RCR19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9DUFUwX1BDTEtEQkdfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfQ1BVMF9BUExMX1NISUZUCSgyNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9DUFUwX0FQTExfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfQ1BVMF9BUExMX1NISUZUKQotCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BfU0hJRlQJKDApCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfRE1DMF9BQ1BfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9BQ1BQQ0xLX1NISUZUCSg0KQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQUNQUENMS19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0FDUFBDTEtfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9EUEhZX1NISUZUCSg4KQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRFBIWV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RQSFlfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNfU0hJRlQJKDEyKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DRF9TSElGVAkoMTYpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9ETUNEX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX0RNQzBfRE1DRF9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfU0hJRlQJKDIwKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfRE1DUF9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0RNQ1BfU0hJRlQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1BZMl9TSElGVAkoMjQpCi0jZGVmaW5lIFM1UF9DTEtESVZfRE1DMF9DT1BZMl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0NPUFkyX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX0RNQzBfQ09SRVRJX1NISUZUCSgyOCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9ETUMwX0NPUkVUSV9TSElGVCkKLQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX1NISUZUCSgwKQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMjAwX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX1NISUZUCSg0KQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX01BU0sJKDB4ZiA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTAwX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX1NISUZUCSg4KQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX01BU0sJKDB4NyA8PCBTNVBfQ0xLRElWX1RPUF9BQ0xLMTYwX1NISUZUKQotI2RlZmluZSBTNVBfQ0xLRElWX1RPUF9BQ0xLMTMzX1NISUZUCSgxMikKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9UT1BfQUNMSzEzM19TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9UT1BfT05FTkFORF9TSElGVAkoMTYpCi0jZGVmaW5lIFM1UF9DTEtESVZfVE9QX09ORU5BTkRfTUFTSwkoMHg3IDw8IFM1UF9DTEtESVZfVE9QX09ORU5BTkRfU0hJRlQpCi0KLSNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR0RMUl9TSElGVAkoMCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR0RMUl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9CVVNfR0RMUl9TSElGVCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR1BMUl9TSElGVAkoNCkKLSNkZWZpbmUgUzVQX0NMS0RJVl9CVVNfR1BMUl9NQVNLCSgweDcgPDwgUzVQX0NMS0RJVl9CVVNfR1BMUl9TSElGVCkKLQotLyogQ29tcGF0aWJpbGl0eSBkZWZpbmVzIGFuZCBpbmNsdXNpb24gKi8KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1wbXUuaD4KLQotI2RlZmluZSBTNVBfRVBMTF9DT04JCQlTNVBfRVBMTF9DT04wCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLW1jdC5oIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLW1jdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTljODQzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1tY3QuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBFWFlOT1M0IE1DVCBjb25maWd1dGF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9SRUdTX01DVF9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19NQ1RfSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2RlZmluZSBFWFlOT1M0X01DVFJFRyh4KQkJKFM1UF9WQV9TWVNUSU1FUiArICh4KSkKLQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0NOVF9MCQlFWFlOT1M0X01DVFJFRygweDEwMCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19DTlRfVQkJRVhZTk9TNF9NQ1RSRUcoMHgxMDQpCi0jZGVmaW5lIEVYWU5PUzRfTUNUX0dfQ05UX1dTVEFUCQlFWFlOT1M0X01DVFJFRygweDExMCkKLQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX0wJCUVYWU5PUzRfTUNUUkVHKDB4MjAwKQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX1UJCUVYWU5PUzRfTUNUUkVHKDB4MjA0KQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0NPTVAwX0FERF9JTkNSCUVYWU5PUzRfTUNUUkVHKDB4MjA4KQotCi0jZGVmaW5lIEVYWU5PUzRfTUNUX0dfVENPTgkJRVhZTk9TNF9NQ1RSRUcoMHgyNDApCi0KLSNkZWZpbmUgRVhZTk9TNF9NQ1RfR19JTlRfQ1NUQVQJCUVYWU5PUzRfTUNUUkVHKDB4MjQ0KQotI2RlZmluZSBFWFlOT1M0X01DVF9HX0lOVF9FTkIJCUVYWU5PUzRfTUNUUkVHKDB4MjQ4KQotI2RlZmluZSBFWFlOT1M0X01DVF9HX1dTVEFUCQlFWFlOT1M0X01DVFJFRygweDI0QykKLQotI2RlZmluZSBFWFlOT1M0X01DVF9MMF9CQVNFCQlFWFlOT1M0X01DVFJFRygweDMwMCkKLSNkZWZpbmUgRVhZTk9TNF9NQ1RfTDFfQkFTRQkJRVhZTk9TNF9NQ1RSRUcoMHg0MDApCi0KLSNkZWZpbmUgTUNUX0xfVENOVEJfT0ZGU0VUCQkoMHgwMCkKLSNkZWZpbmUgTUNUX0xfSUNOVEJfT0ZGU0VUCQkoMHgwOCkKLSNkZWZpbmUgTUNUX0xfVENPTl9PRkZTRVQJCSgweDIwKQotI2RlZmluZSBNQ1RfTF9JTlRfQ1NUQVRfT0ZGU0VUCQkoMHgzMCkKLSNkZWZpbmUgTUNUX0xfSU5UX0VOQl9PRkZTRVQJCSgweDM0KQotI2RlZmluZSBNQ1RfTF9XU1RBVF9PRkZTRVQJCSgweDQwKQotCi0jZGVmaW5lIE1DVF9HX1RDT05fU1RBUlQJCSgxIDw8IDgpCi0jZGVmaW5lIE1DVF9HX1RDT05fQ09NUDBfQVVUT19JTkMJKDEgPDwgMSkKLSNkZWZpbmUgTUNUX0dfVENPTl9DT01QMF9FTkFCTEUJCSgxIDw8IDApCi0KLSNkZWZpbmUgTUNUX0xfVENPTl9JTlRFUlZBTF9NT0RFCSgxIDw8IDIpCi0jZGVmaW5lIE1DVF9MX1RDT05fSU5UX1NUQVJUCQkoMSA8PCAxKQotI2RlZmluZSBNQ1RfTF9UQ09OX1RJTUVSX1NUQVJUCQkoMSA8PCAwKQotCi0jZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX01DVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmggYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvaW5jbHVkZS9tYWNoL3JlZ3MtcG11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjliNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLXBtdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1wbXUuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBQb3dlciBtYW5hZ2VtZW50IHVuaXQgZGVmaW5pdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19QTVVfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfUE1VX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNkZWZpbmUgUzVQX1BNVVJFRyh4KQkJCQkoUzVQX1ZBX1BNVSArICh4KSkKLQotI2RlZmluZSBTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDAyMDApCi0KLSNkZWZpbmUgUzVQX0NFTlRSQUxfTE9XUFdSX0NGRwkJCSgxIDw8IDE2KQotCi0jZGVmaW5lIFM1UF9DRU5UUkFMX1NFUV9PUFRJT04JCQlTNVBfUE1VUkVHKDB4MDIwOCkKLQotI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZJMAkJCSgxIDw8IDE2KQotI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZJMQkJCSgxIDw8IDE3KQotI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZFMAkJCSgxIDw8IDI0KQotI2RlZmluZSBTNVBfVVNFX1NUQU5EQllfV0ZFMQkJCSgxIDw8IDI1KQotI2RlZmluZSBTNVBfVVNFX01BU0sJCQkJKCgweDMgPDwgMTYpIHwgKDB4MyA8PCAyNCkpCi0KLSNkZWZpbmUgUzVQX1NXUkVTRVQJCQkJUzVQX1BNVVJFRygweDA0MDApCi0KLSNkZWZpbmUgUzVQX1dBS0VVUF9TVEFUCQkJCVM1UF9QTVVSRUcoMHgwNjAwKQotI2RlZmluZSBTNVBfRUlOVF9XQUtFVVBfTUFTSwkJCVM1UF9QTVVSRUcoMHgwNjA0KQotI2RlZmluZSBTNVBfV0FLRVVQX01BU0sJCQkJUzVQX1BNVVJFRygweDA2MDgpCi0KLSNkZWZpbmUgUzVQX1VTQkhPU1RfUEhZX0NPTlRST0wJCQlTNVBfUE1VUkVHKDB4MDcwOCkKLSNkZWZpbmUgUzVQX1VTQkhPU1RfUEhZX0VOQUJMRQkJCSgxIDw8IDApCi0KLSNkZWZpbmUgUzVQX01JUElfRFBIWV9DT05UUk9MKG4pCQlTNVBfUE1VUkVHKDB4MDcxMCArIChuKSAqIDQpCi0jZGVmaW5lIFM1UF9NSVBJX0RQSFlfRU5BQkxFCQkJKDEgPDwgMCkKLSNkZWZpbmUgUzVQX01JUElfRFBIWV9TUkVTRVROCQkJKDEgPDwgMSkKLSNkZWZpbmUgUzVQX01JUElfRFBIWV9NUkVTRVROCQkJKDEgPDwgMikKLQotI2RlZmluZSBTNVBfUE1VX1NBVEFfUEhZX0NPTlRST0wJCVM1UF9QTVVSRUcoMHgwNzIwKQotI2RlZmluZSBTNVBfSU5GT1JNMAkJCQlTNVBfUE1VUkVHKDB4MDgwMCkKLSNkZWZpbmUgUzVQX0lORk9STTEJCQkJUzVQX1BNVVJFRygweDA4MDQpCi0jZGVmaW5lIFM1UF9JTkZPUk0yCQkJCVM1UF9QTVVSRUcoMHgwODA4KQotI2RlZmluZSBTNVBfSU5GT1JNMwkJCQlTNVBfUE1VUkVHKDB4MDgwQykKLSNkZWZpbmUgUzVQX0lORk9STTQJCQkJUzVQX1BNVVJFRygweDA4MTApCi0jZGVmaW5lIFM1UF9JTkZPUk01CQkJCVM1UF9QTVVSRUcoMHgwODE0KQotI2RlZmluZSBTNVBfSU5GT1JNNgkJCQlTNVBfUE1VUkVHKDB4MDgxOCkKLSNkZWZpbmUgUzVQX0lORk9STTcJCQkJUzVQX1BNVVJFRygweDA4MUMpCi0KLSNkZWZpbmUgUzVQX0FSTV9DT1JFMF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTAwMCkKLSNkZWZpbmUgUzVQX0RJU19JUlFfQ09SRTAJCQlTNVBfUE1VUkVHKDB4MTAwNCkKLSNkZWZpbmUgUzVQX0RJU19JUlFfQ0VOVFJBTDAJCQlTNVBfUE1VUkVHKDB4MTAwOCkKLSNkZWZpbmUgUzVQX0FSTV9DT1JFMV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTAxMCkKLSNkZWZpbmUgUzVQX0RJU19JUlFfQ09SRTEJCQlTNVBfUE1VUkVHKDB4MTAxNCkKLSNkZWZpbmUgUzVQX0RJU19JUlFfQ0VOVFJBTDEJCQlTNVBfUE1VUkVHKDB4MTAxOCkKLSNkZWZpbmUgUzVQX0FSTV9DT01NT05fTE9XUFdSCQkJUzVQX1BNVVJFRygweDEwODApCi0jZGVmaW5lIFM1UF9MMl8wX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTBDMCkKLSNkZWZpbmUgUzVQX0wyXzFfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMEM0KQotI2RlZmluZSBTNVBfQ01VX0FDTEtTVE9QX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTAwKQotI2RlZmluZSBTNVBfQ01VX1NDTEtTVE9QX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTA0KQotI2RlZmluZSBTNVBfQ01VX1JFU0VUX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTBDKQotI2RlZmluZSBTNVBfQVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMjApCi0jZGVmaW5lIFM1UF9NUExMX1NZU0NMS19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTEyNCkKLSNkZWZpbmUgUzVQX1ZQTExfU1lTQ0xLX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMTI4KQotI2RlZmluZSBTNVBfRVBMTF9TWVNDTEtfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExMkMpCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HUFNfQUxJVkVfTE9XUFdSCVM1UF9QTVVSRUcoMHgxMTM4KQotI2RlZmluZSBTNVBfQ01VX1JFU0VUX0dQU0FMSVZFX0xPV1BXUgkJUzVQX1BNVVJFRygweDExM0MpCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9DQU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0MCkKLSNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX1RWX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNDQpCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9NRkNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE0OCkKLSNkZWZpbmUgUzVQX0NNVV9DTEtTVE9QX0czRF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTRDKQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTENEMF9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTUwKQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTENEMV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTU0KQotI2RlZmluZSBTNVBfQ01VX0NMS1NUT1BfTUFVRElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNTgpCi0jZGVmaW5lIFM1UF9DTVVfQ0xLU1RPUF9HUFNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE1QykKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9DQU1fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2MCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9UVl9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTE2NCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9NRkNfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2OCkKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9HM0RfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE2QykKLSNkZWZpbmUgUzVQX0NNVV9SRVNFVF9MQ0QwX0xPV1BXUgkJUzVQX1BNVVJFRygweDExNzApCi0jZGVmaW5lIFM1UF9DTVVfUkVTRVRfTENEMV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTc0KQotI2RlZmluZSBTNVBfQ01VX1JFU0VUX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTc4KQotI2RlZmluZSBTNVBfQ01VX1JFU0VUX0dQU19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMTdDKQotI2RlZmluZSBTNVBfVE9QX0JVU19MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTE4MCkKLSNkZWZpbmUgUzVQX1RPUF9SRVRFTlRJT05fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTE4NCkKLSNkZWZpbmUgUzVQX1RPUF9QV1JfTE9XUFdSCQkJUzVQX1BNVVJFRygweDExODgpCi0jZGVmaW5lIFM1UF9MT0dJQ19SRVNFVF9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFBMCkKLSNkZWZpbmUgUzVQX09ORU5BTkRfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUMwKQotI2RlZmluZSBTNVBfTU9ESU1JRl9NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQzQpCi0jZGVmaW5lIFM1UF9HMkRfQUNQX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFDOCkKLSNkZWZpbmUgUzVQX1VTQk9UR19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExQ0MpCi0jZGVmaW5lIFM1UF9IU01NQ19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDApCi0jZGVmaW5lIFM1UF9DU1NZU19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDQpCi0jZGVmaW5lIFM1UF9TRUNTU19NRU1fTE9XUFdSCQkJUzVQX1BNVVJFRygweDExRDgpCi0jZGVmaW5lIFM1UF9QQ0lFX01FTV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTFFMCkKLSNkZWZpbmUgUzVQX1NBVEFfTUVNX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxMUU0KQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9EUkFNX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMDApCi0jZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX01BVURJT19MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjA0KQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9HUElPX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMjApCi0jZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX1VBUlRfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIyNCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fTU1DQV9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjI4KQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9NTUNCX0xPV1BXUgkJUzVQX1BNVVJFRygweDEyMkMpCi0jZGVmaW5lIFM1UF9QQURfUkVURU5USU9OX0VCSUFfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTIzMCkKLSNkZWZpbmUgUzVQX1BBRF9SRVRFTlRJT05fRUJJQl9MT1dQV1IJCVM1UF9QTVVSRUcoMHgxMjM0KQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9JU09MQVRJT05fTE9XUFdSCVM1UF9QTVVSRUcoMHgxMjQwKQotI2RlZmluZSBTNVBfUEFEX1JFVEVOVElPTl9BTFZfU0VMX0xPV1BXUglTNVBfUE1VUkVHKDB4MTI2MCkKLSNkZWZpbmUgUzVQX1hVU0JYVElfTE9XUFdSCQkJUzVQX1BNVVJFRygweDEyODApCi0jZGVmaW5lIFM1UF9YWFRJX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTI4NCkKLSNkZWZpbmUgUzVQX0VYVF9SRUdVTEFUT1JfTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTJDMCkKLSNkZWZpbmUgUzVQX0dQSU9fTU9ERV9MT1dQV1IJCQlTNVBfUE1VUkVHKDB4MTMwMCkKLSNkZWZpbmUgUzVQX0dQSU9fTU9ERV9NQVVESU9fTE9XUFdSCQlTNVBfUE1VUkVHKDB4MTM0MCkKLSNkZWZpbmUgUzVQX0NBTV9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzODApCi0jZGVmaW5lIFM1UF9UVl9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzODQpCi0jZGVmaW5lIFM1UF9NRkNfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzg4KQotI2RlZmluZSBTNVBfRzNEX0xPV1BXUgkJCQlTNVBfUE1VUkVHKDB4MTM4QykKLSNkZWZpbmUgUzVQX0xDRDBfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzkwKQotI2RlZmluZSBTNVBfTENEMV9MT1dQV1IJCQkJUzVQX1BNVVJFRygweDEzOTQpCi0jZGVmaW5lIFM1UF9NQVVESU9fTE9XUFdSCQkJUzVQX1BNVVJFRygweDEzOTgpCi0jZGVmaW5lIFM1UF9HUFNfTE9XUFdSCQkJCVM1UF9QTVVSRUcoMHgxMzlDKQotI2RlZmluZSBTNVBfR1BTX0FMSVZFX0xPV1BXUgkJCVM1UF9QTVVSRUcoMHgxM0EwKQotCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTBfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDIwMDApCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTBfT1BUSU9OCQkJUzVQX1BNVVJFRygweDIwMDgpCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTFfQ09ORklHVVJBVElPTgkJUzVQX1BNVVJFRygweDIwODApCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTFfU1RBVFVTCQkJUzVQX1BNVVJFRygweDIwODQpCi0jZGVmaW5lIFM1UF9BUk1fQ09SRTFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDIwODgpCi0KLSNkZWZpbmUgUzVQX0FSTV9DT01NT05fT1BUSU9OCQkJUzVQX1BNVVJFRygweDI0MDgpCi0jZGVmaW5lIFM1UF9UT1BfUFdSX09QVElPTgkJCVM1UF9QTVVSRUcoMHgyQzQ4KQotI2RlZmluZSBTNVBfQ0FNX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0MwOCkKLSNkZWZpbmUgUzVQX1RWX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0MyOCkKLSNkZWZpbmUgUzVQX01GQ19PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDNDgpCi0jZGVmaW5lIFM1UF9HM0RfT1BUSU9OCQkJCVM1UF9QTVVSRUcoMHgzQzY4KQotI2RlZmluZSBTNVBfTENEMF9PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDODgpCi0jZGVmaW5lIFM1UF9MQ0QxX09QVElPTgkJCQlTNVBfUE1VUkVHKDB4M0NBOCkKLSNkZWZpbmUgUzVQX01BVURJT19PUFRJT04JCQlTNVBfUE1VUkVHKDB4M0NDOCkKLSNkZWZpbmUgUzVQX0dQU19PUFRJT04JCQkJUzVQX1BNVVJFRygweDNDRTgpCi0jZGVmaW5lIFM1UF9HUFNfQUxJVkVfT1BUSU9OCQkJUzVQX1BNVVJFRygweDNEMDgpCi0KLSNkZWZpbmUgUzVQX1BBRF9SRVRfTUFVRElPX09QVElPTgkJUzVQX1BNVVJFRygweDMwMjgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX0dQSU9fT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxMDgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX1VBUlRfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxMjgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX01NQ0FfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxNDgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX01NQ0JfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxNjgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX0VCSUFfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxODgpCi0jZGVmaW5lIFM1UF9QQURfUkVUX0VCSUJfT1BUSU9OCQkJUzVQX1BNVVJFRygweDMxQTgpCi0KLSNkZWZpbmUgUzVQX1BNVV9DQU1fQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzAwKQotI2RlZmluZSBTNVBfUE1VX1RWX0NPTkYJCQkJUzVQX1BNVVJFRygweDNDMjApCi0jZGVmaW5lIFM1UF9QTVVfTUZDX0NPTkYJCQlTNVBfUE1VUkVHKDB4M0M0MCkKLSNkZWZpbmUgUzVQX1BNVV9HM0RfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzYwKQotI2RlZmluZSBTNVBfUE1VX0xDRDBfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQzgwKQotI2RlZmluZSBTNVBfUE1VX0xDRDFfQ09ORgkJCVM1UF9QTVVSRUcoMHgzQ0EwKQotI2RlZmluZSBTNVBfUE1VX0dQU19DT05GCQkJUzVQX1BNVVJFRygweDNDRTApCi0KLSNkZWZpbmUgUzVQX1BNVV9TQVRBX1BIWV9DT05UUk9MX0VOCQkweDEKLSNkZWZpbmUgUzVQX0NPUkVfTE9DQUxfUFdSX0VOCQkJMHgzCi0jZGVmaW5lIFM1UF9JTlRfTE9DQUxfUFdSX0VOCQkJMHg3Ci0KLSNkZWZpbmUgUzVQX0NIRUNLX1NMRUVQCQkJCTB4MDAwMDBCQUQKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVHU19QTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtYXJtbGV4NDIxMC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtYXJtbGV4NDIxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDgyYzYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLWFybWxleDQyMTAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1hcm1sZXg0MjEwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2V4eW5vczQuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxUCShTM0MyNDEwX1VDT05fVFhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1RYSVJRTU9ERSB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSVJRTU9ERSB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYRklGT19UT0kgfAlcCi0JCQkJIFMzQzI0NDNfVUNPTl9SWEVSUl9JUlFFTikKLQotI2RlZmluZSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAotCi0jZGVmaW5lIEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCi0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIGFybWxleDQyMTBfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0gewotCVswXSA9IHsKLQkJLmh3cG9ydAkJPSAwLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbMV0gPSB7Ci0JCS5od3BvcnQJCT0gMSwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IEFSTUxFWDQyMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gQVJNTEVYNDIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gQVJNTEVYNDIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzJdID0gewotCQkuaHdwb3J0CQk9IDIsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBBUk1MRVg0MjEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IEFSTUxFWDQyMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IEFSTUxFWDQyMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVszXSA9IHsKLQkJLmh3cG9ydAkJPSAzLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gQVJNTEVYNDIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBBUk1MRVg0MjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBBUk1MRVg0MjEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIGFybWxleDQyMTBfaHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX1BFUk1BTkVOVCwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0jaWZkZWYgQ09ORklHX0VYWU5PUzRfU0RIQ0lfQ0gwXzhCSVQKLQkubWF4X3dpZHRoCQk9IDgsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzhfQklUX0RBVEEsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIGFybWxleDQyMTBfaHNtbWMyX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BYMig1KSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi0JLm1heF93aWR0aAkJPSA0LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgYXJtbGV4NDIxMF9oc21tYzNfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfUEVSTUFORU5ULAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLQkubWF4X3dpZHRoCQk9IDQsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXJtbGV4NDIxMF9zZGhjaV9pbml0KHZvaWQpCi17Ci0JczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoJmFybWxleDQyMTBfaHNtbWMwX3BkYXRhKTsKLQlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmYXJtbGV4NDIxMF9oc21tYzJfcGRhdGEpOwotCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZhcm1sZXg0MjEwX2hzbW1jM19wZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX3dsYW5faW5pdCh2b2lkKQotewotCS8qIGVuYWJsZSAqLwotCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDIoMCksIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMigwKSwgUzNDX0dQSU9fUFVMTF9VUCk7Ci0KLQkvKiByZXNldCAqLwotCXMzY19ncGlvX2NmZ3BpbihFWFlOT1M0X0dQWDEoNiksIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKEVYWU5PUzRfR1BYMSg2KSwgUzNDX0dQSU9fUFVMTF9VUCk7Ci0KLQkvKiB3YWtldXAgKi8KLQlzM2NfZ3Bpb19jZmdwaW4oRVhZTk9TNF9HUFgxKDUpLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChFWFlOT1M0X0dQWDEoNSksIFMzQ19HUElPX1BVTExfVVApOwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGFybWxleDQyMTBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygzKSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDMpICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9FSU5UKDI3KSwKLQkJLmVuZAk9IElSUV9FSU5UKDI3KSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJUlFGX1RSSUdHRVJfSElHSCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMTVfY29uZmlnID0gewotCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0hJR0gsCi0JLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAotCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQgfCBTTVNDOTExWF9GT1JDRV9JTlRFUk5BTF9QSFksCi0JLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAotCS5tYWMJCT0gezB4MDAsIDB4ODAsIDB4MDAsIDB4MjMsIDB4NDUsIDB4Njd9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXJtbGV4NDIxMF9zbXNjOTExeCA9IHsKLQkubmFtZQkJPSAic21zYzkxMXgiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXJtbGV4NDIxMF9zbXNjOTExeF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGFybWxleDQyMTBfc21zYzkxMXhfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzbXNjOTIxNV9jb25maWcsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphcm1sZXg0MjEwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzM2NfZGV2aWNlX2hzbW1jMCwKLQkmczNjX2RldmljZV9oc21tYzIsCi0JJnMzY19kZXZpY2VfaHNtbWMzLAotCSZzM2NfZGV2aWNlX3J0YywKLQkmczNjX2RldmljZV93ZHQsCi0JJmV4eW5vczRfZGV2aWNlX3N5c21tdSwKLQkmc2Ftc3VuZ19hc29jX2RtYSwKLQkmYXJtbGV4NDIxMF9zbXNjOTExeCwKLQkmZXh5bm9zNF9kZXZpY2VfYWhjaSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhcm1sZXg0MjEwX3Ntc2M5MTF4X2luaXQodm9pZCkKLXsKLQl1MzIgY3MxOwotCi0JLyogY29uZmlndXJlIG5DUzEgd2lkdGggdG8gMTYgYml0cyAqLwotCWNzMSA9IF9fcmF3X3JlYWRsKFM1UF9TUk9NX0JXKSAmCi0JCX4oUzVQX1NST01fQldfX0NTX01BU0sgPDwgUzVQX1NST01fQldfX05DUzFfX1NISUZUKTsKLQljczEgfD0gKCgxIDw8IFM1UF9TUk9NX0JXX19EQVRBV0lEVEhfX1NISUZUKSB8Ci0JCSgwIDw8IFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVCkgfAotCQkoMSA8PCBTNVBfU1JPTV9CV19fQUREUk1PREVfX1NISUZUKSB8Ci0JCSgxIDw8IFM1UF9TUk9NX0JXX19CWVRFRU5BQkxFX19TSElGVCkpIDw8Ci0JCVM1UF9TUk9NX0JXX19OQ1MxX19TSElGVDsKLQlfX3Jhd193cml0ZWwoY3MxLCBTNVBfU1JPTV9CVyk7Ci0KLQkvKiBzZXQgdGltaW5nIGZvciBuQ1MxIHN1aXRhYmxlIGZvciBldGhlcm5ldCBjaGlwICovCi0JX19yYXdfd3JpdGVsKCgweDEgPDwgUzVQX1NST01fQkNYX19QTUNfX1NISUZUKSB8Ci0JCSAgICAgKDB4OSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1BfX1NISUZUKSB8Ci0JCSAgICAgKDB4YyA8PCBTNVBfU1JPTV9CQ1hfX1RDQUhfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT0hfX1NISUZUKSB8Ci0JCSAgICAgKDB4NiA8PCBTNVBfU1JPTV9CQ1hfX1RBQ0NfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RDT1NfX1NISUZUKSB8Ci0JCSAgICAgKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1RBQ1NfX1NISUZUKSwgUzVQX1NST01fQkMxKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfbWFwX2lvKHZvaWQpCi17Ci0JczVwX2luaXRfaW8oTlVMTCwgMCwgUzVQX1ZBX0NISVBJRCk7Ci0JczNjMjR4eF9pbml0X2Nsb2NrcygyNDAwMDAwMCk7Ci0JczNjMjR4eF9pbml0X3VhcnRzKGFybWxleDQyMTBfdWFydGNmZ3MsCi0JCQkgICBBUlJBWV9TSVpFKGFybWxleDQyMTBfdWFydGNmZ3MpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGFybWxleDQyMTBfbWFjaGluZV9pbml0KHZvaWQpCi17Ci0JYXJtbGV4NDIxMF9zbXNjOTExeF9pbml0KCk7Ci0KLQlhcm1sZXg0MjEwX3NkaGNpX2luaXQoKTsKLQotCWFybWxleDQyMTBfd2xhbl9pbml0KCk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhcm1sZXg0MjEwX2RldmljZXMsCi0JCQkgICAgIEFSUkFZX1NJWkUoYXJtbGV4NDIxMF9kZXZpY2VzKSk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoQVJNTEVYNDIxMCwgIkFSTUxFWDQyMTAiKQotCS8qIE1haW50YWluZXI6IEFsaW0gQWtodGFyIDxhbGltLmFraHRhckBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKLQkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAotCS5tYXBfaW8JCT0gYXJtbGV4NDIxMF9tYXBfaW8sCi0JLmluaXRfbWFjaGluZQk9IGFybWxleDQyMTBfbWFjaGluZV9pbml0LAotCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1udXJpLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1udXJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmU3MWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtbnVyaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtbnVyaS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy9hdG1lbF9teHRfdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlci9tYXg4OTAzX2NoYXJnZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZml4ZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk3LXByaXZhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgotCi0jaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvYWRjLmg+Ci0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvZXh5bm9zNC5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvZWhjaS5oPgotI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L21mYy5oPgotI2luY2x1ZGUgPHBsYXQvcGQuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLS8qIEZvbGxvd2luZyBhcmUgZGVmYXVsdCB2YWx1ZXMgZm9yIFVDT04sIFVMQ09OIGFuZCBVRkNPTiBVQVJUIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVVJJX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAotCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCi0KLSNkZWZpbmUgTlVSSV9VTENPTl9ERUZBVUxUCVMzQzI0MTBfTENPTl9DUzgKLQotI2RlZmluZSBOVVJJX1VGQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUZDT05fRklGT01PREUgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fVFhUUklHMjU2IHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzI1NikKLQotZW51bSBmaXhlZF9yZWd1bGF0b3JfaWQgewotCUZJWEVEX1JFR19JRF9NTUMgPSAwLAotCUZJWEVEX1JFR19JRF9NQVg4OTAzLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgbnVyaV91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkuaHdwb3J0CQk9IDAsCi0JCS51Y29uCQk9IE5VUklfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gTlVSSV9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gTlVSSV9VRkNPTl9ERUZBVUxULAotCX0sCi0JewotCQkuaHdwb3J0CQk9IDEsCi0JCS51Y29uCQk9IE5VUklfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gTlVSSV9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gTlVSSV9VRkNPTl9ERUZBVUxULAotCX0sCi0JewotCQkuaHdwb3J0CQk9IDIsCi0JCS51Y29uCQk9IE5VUklfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gTlVSSV9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gTlVSSV9VRkNPTl9ERUZBVUxULAotCX0sCi0JewotCQkuaHdwb3J0CQk9IDMsCi0JCS51Y29uCQk9IE5VUklfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gTlVSSV9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gTlVSSV9VRkNPTl9ERUZBVUxULAotCX0sCi19OwotCi0vKiBlTU1DICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBudXJpX2hzbW1jMF9kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLm1heF93aWR0aAkJPSA4LAotCS5ob3N0X2NhcHMJCT0gKE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAotCQkJCU1NQ19DQVBfRElTQUJMRSB8IE1NQ19DQVBfRVJBU0UpLAotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9QRVJNQU5FTlQsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGVtbWNfc3VwcGxpZXNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInMzYy1zZGhjaS4wIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJkd19tbWMiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBlbW1jX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhID0gewotCS5jb25zdHJhaW50cwkJPSB7Ci0JCS5uYW1lCQk9ICJWTUVNX1ZERF8yLjhWIiwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShlbW1jX3N1cHBsaWVzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBlbW1jX3N1cHBsaWVzLAotfTsKLQotc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBlbW1jX2ZpeGVkX3ZvbHRhZ2VfY29uZmlnID0gewotCS5zdXBwbHlfbmFtZQkJPSAiTUFTU01FTU9SWV9FTiAoaW52ZXJ0ZWQpIiwKLQkubWljcm92b2x0cwkJPSAyODAwMDAwLAotCS5ncGlvCQkJPSBFWFlOT1M0X0dQTDEoMSksCi0JLmVuYWJsZV9oaWdoCQk9IGZhbHNlLAotCS5pbml0X2RhdGEJCT0gJmVtbWNfZml4ZWRfdm9sdGFnZV9pbml0X2RhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlbW1jX2ZpeGVkX3ZvbHRhZ2UgPSB7Ci0JLm5hbWUJCQk9ICJyZWctZml4ZWQtdm9sdGFnZSIsCi0JLmlkCQkJPSBGSVhFRF9SRUdfSURfTU1DLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmZW1tY19maXhlZF92b2x0YWdlX2NvbmZpZywKLQl9LAotfTsKLQotLyogU0QgKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIG51cmlfaHNtbWMyX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCQk9IDQsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQlNTUNfQ0FQX0RJU0FCTEUsCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BYMygzKSwJLyogWEVJTlRfMjcgKi8KLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi0vKiBXTEFOICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBudXJpX2hzbW1jM19kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLm1heF93aWR0aAkJPSA0LAotCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCQlNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfRVhURVJOQUwsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG51cmlfc2RoY2lfaW5pdCh2b2lkKQotewotCXMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKCZudXJpX2hzbW1jMF9kYXRhKTsKLQlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmbnVyaV9oc21tYzJfZGF0YSk7Ci0JczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoJm51cmlfaHNtbWMzX2RhdGEpOwotfQotCi0vKiBHUElPIEtFWVMgKi8KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiBudXJpX2dwaW9fa2V5c190YWJsZXNbXSA9IHsKLQl7Ci0JCS5jb2RlCQkJPSBLRVlfVk9MVU1FVVAsCi0JCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMCksCS8qIFhFSU5UMTYgKi8KLQkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9WT0xVTUVVUCIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwgewotCQkuY29kZQkJCT0gS0VZX1ZPTFVNRURPV04sCi0JCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoMSksCS8qIFhFSU5UMTcgKi8KLQkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9WT0xVTUVET1dOIiwKLQkJLnR5cGUJCQk9IEVWX0tFWSwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMSwKLQl9LCB7Ci0JCS5jb2RlCQkJPSBLRVlfUE9XRVIsCi0JCS5ncGlvCQkJPSBFWFlOT1M0X0dQWDIoNyksCS8qIFhFSU5UMjMgKi8KLQkJLmRlc2MJCQk9ICJncGlvLWtleXM6IEtFWV9QT1dFUiIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS53YWtldXAJCQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgbnVyaV9ncGlvX2tleXNfZGF0YSA9IHsKLQkuYnV0dG9ucwkJPSBudXJpX2dwaW9fa2V5c190YWJsZXMsCi0JLm5idXR0b25zCQk9IEFSUkFZX1NJWkUobnVyaV9ncGlvX2tleXNfdGFibGVzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG51cmlfZ3Bpb19rZXlzID0gewotCS5uYW1lCQkJPSAiZ3Bpby1rZXlzIiwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfZ3Bpb19rZXlzX2RhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIG51cmlfbGNkX3Bvd2VyX29uKHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHBvd2VyKQotewotCWludCBncGlvID0gRVhZTk9TNF9HUEUxKDUpOwotCi0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJMVkRTX25TSEROIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIHBvd2VyKTsKLQlncGlvX2ZyZWUoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbnQgbnVyaV9ibF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0LCBncGlvID0gRVhZTk9TNF9HUEUyKDMpOwotCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJMQ0RfTERPX0VOIik7Ci0JaWYgKCFyZXQpCi0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCAwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbnVyaV9ibF9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYnJpZ2h0bmVzcykKLXsKLQlpZiAoYnJpZ2h0bmVzcyA8IDEpCi0JCWJyaWdodG5lc3MgPSAwOwotCi0JZ3Bpb19zZXRfdmFsdWUoRVhZTk9TNF9HUEUyKDMpLCAxKTsKLQotCXJldHVybiBicmlnaHRuZXNzOwotfQotCi1zdGF0aWMgdm9pZCBudXJpX2JsX2V4aXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWdwaW9fZnJlZShFWFlOT1M0X0dQRTIoMykpOwotfQotCi0vKiBudXJpIHB3bSBiYWNrbGlnaHQgKi8KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIG51cmlfYmFja2xpZ2h0X2RhdGEgPSB7Ci0JLnB3bV9pZAkJCT0gMCwKLQkucHdtX3BlcmlvZF9ucwkJPSAzMDAwMCwKLQkubWF4X2JyaWdodG5lc3MJCT0gMTAwLAotCS5kZnRfYnJpZ2h0bmVzcwkJPSA1MCwKLQkuaW5pdAkJCT0gbnVyaV9ibF9pbml0LAotCS5ub3RpZnkJCQk9IG51cmlfYmxfbm90aWZ5LAotCS5leGl0CQkJPSBudXJpX2JsX2V4aXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBudXJpX2JhY2tsaWdodF9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJwd20tYmFja2xpZ2h0IiwKLQkuaWQJCQk9IC0xLAotCS5kZXYJCQk9IHsKLQkJLnBhcmVudAkJPSAmczNjX2RldmljZV90aW1lclswXS5kZXYsCi0JCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfYmFja2xpZ2h0X2RhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBudXJpX2xjZF9wbGF0Zm9ybV9kYXRhID0gewotCS5zZXRfcG93ZXIJCT0gbnVyaV9sY2RfcG93ZXJfb24sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBudXJpX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAotCS5pZAkJCT0gLTEsCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZudXJpX2xjZF9wbGF0Zm9ybV9kYXRhLAotCX0sCi19OwotCi0vKiBJMkMxICovCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzFfZGV2c1tdIF9faW5pdGRhdGEgPSB7Ci0JLyogR3lybywgVG8gYmUgdXBkYXRlZCAqLwotfTsKLQotLyogVFNQICovCi1zdGF0aWMgdTggbXh0X2luaXRfdmFsc1tdID0gewotCS8qIE1YVF9HRU5fQ09NTUFORCg2KSAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX0dFTl9QT1dFUig3KSAqLwotCTB4MjAsIDB4ZmYsIDB4MzIsCi0JLyogTVhUX0dFTl9BQ1FVSVJFKDgpICovCi0JMHgwYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOSwgMHgyMywKLQkvKiBNWFRfVE9VQ0hfTVVMVEkoOSkgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAotCTB4MDAsIDB4MDEsIDB4MDEsIDB4MGUsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLAotCS8qIE1YVF9UT1VDSF9LRVlBUlJBWSgxNSkgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAotCTB4MDAsCi0JLyogTVhUX1NQVF9HUElPUFdNKDE5KSAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkvKiBNWFRfUFJPQ0lfR1JJUEZBQ0UoMjApICovCi0JMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MCwgMHgyOCwgMHgwNCwKLQkweDBmLCAweDBhLAotCS8qIE1YVF9QUk9DR19OT0lTRSgyMikgKi8KLQkweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDIzLCAweDAwLAotCTB4MDAsIDB4MDUsIDB4MGYsIDB4MTksIDB4MjMsIDB4MmQsIDB4MDMsCi0JLyogTVhUX1RPVUNIX1BST1hJTUlUWSgyMykgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JLyogTVhUX1BST0NJX09ORVRPVUNIKDI0KSAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkvKiBNWFRfU1BUX1NFTEZURVNUKDI1KSAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkvKiBNWFRfUFJPQ0lfVFdPVE9VQ0goMjcpICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkvKiBNWFRfU1BUX0NURUNPTkZJRygyOCkgKi8KLQkweDAwLCAweDAwLCAweDAyLCAweDA4LCAweDEwLCAweDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBteHRfcGxhdGZvcm1fZGF0YSBteHRfcGxhdGZvcm1fZGF0YSA9IHsKLQkuY29uZmlnCQkJPSBteHRfaW5pdF92YWxzLAotCS5jb25maWdfbGVuZ3RoCQk9IEFSUkFZX1NJWkUobXh0X2luaXRfdmFscyksCi0KLQkueF9saW5lCQkJPSAxOCwKLQkueV9saW5lCQkJPSAxMSwKLQkueF9zaXplCQkJPSAxMDI0LAotCS55X3NpemUJCQk9IDYwMCwKLQkuYmxlbgkJCT0gMHgxLAotCS50aHJlc2hvbGQJCT0gMHgyOCwKLQkudm9sdGFnZQkJPSAyODAwMDAwLAkJLyogMi44ViAqLwotCS5vcmllbnQJCQk9IE1YVF9ESUFHT05BTF9DT1VOVEVSLAotCS5pcnFmbGFncwkJPSBJUlFGX1RSSUdHRVJfRkFMTElORywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgaTJjM19kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCQk9IDAsCi0JLmJ1c19udW0JPSAzLAotCS5zbGF2ZV9hZGRyCT0gMHgxMCwKLQkuZnJlcXVlbmN5CT0gNDAwICogMTAwMCwKLQkuc2RhX2RlbGF5CT0gMTAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMzX2RldnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJSTJDX0JPQVJEX0lORk8oImF0bWVsX214dF90cyIsIDB4NGEpLAotCQkucGxhdGZvcm1fZGF0YQk9ICZteHRfcGxhdGZvcm1fZGF0YSwKLQkJLmlycQkJPSBJUlFfRUlOVCg0KSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG51cmlfdHNwX2luaXQodm9pZCkKLXsKLQlpbnQgZ3BpbzsKLQotCS8qIFRPVUNIX0lOVDogWEVJTlRfNCAqLwotCWdwaW8gPSBFWFlOT1M0X0dQWDAoNCk7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJUT1VDSF9JTlQiKTsKLQlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOwotCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9VUCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMV9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQiLCAiczVwLWFkYyIpLCAvKiBVc2VkIGJ5IENQVSdzIEFEQyBkcnYgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzNfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkMTEiLCAiczVwLW1pcGktY3Npcy4wIiksIC8qIE1JUEkgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzRfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkMTgiLCAiczVwLW1pcGktY3Npcy4wIiksIC8qIE1JUEkgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzVfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmhzaWMiLCAibW9kZW1jdGwiKSwgLyogTU9ERU0gKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzdfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgiZGlnXzE4IiwgIjAtMDAxZiIpLCAvKiBIQ0Q4MDMgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzhfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidnVzYl9kIiwgTlVMTCksIC8qIFVzZWQgYnkgQ1BVICovCi0JUkVHVUxBVE9SX1NVUFBMWSgidmRhYyIsIE5VTEwpLCAvKiBVc2VkIGJ5IENQVSAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTFfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgInBsYXRmb3JtLWxjZCIpLCAvKiBVODA0IExWRFMgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEyX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZGlvIiwgIjYtMDAzYyIpLCAvKiBIREM4MDIgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEzX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAiczNjLXNkaGNpLjIiKSwgLyogVEZMQVNIICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNF9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJpbm1vdG9yIiwgIm1heDg5OTctaGFwdGljIiksCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19sZG8xNV9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJhdmRkIiwgIjMtMDA0YSIpLCAvKiBUb3VjaCBTY3JlZW4gKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE2X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoImRfc2Vuc29yIiwgIjAtMDAxZiIpLCAvKiBIREM4MDMgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE4X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICIzLTAwNGEiKSwgLyogVG91Y2ggU2NyZWVuICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrMV9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRfYXJtIiwgTlVMTCksIC8qIENQVUZSRVEgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2syX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9pbnQiLCBOVUxMKSwgLyogQ1BVRlJFUSAqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazNfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgIm1hbGlfZGV2LjAiKSwgLyogRzNEIG9mIEV4eW5vcyA0ICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19idWNrNF9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJjb3JlIiwgIjAtMDAxZiIpLCAvKiBIREM4MDMgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2s2X1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoImRpZ18yOCIsICIwLTAwMWYiKSwgLyogcGluICI3IiBvZiBIREM4MDMgKi8KLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2VzYWZlb3V0MV9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ1c2JfdmJ1cyIsIE5VTEwpLCAvKiBDUFUncyBVU0IgT1RHICovCi19Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19lc2FmZW91dDJfW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidXNiX3ZidXMiLCAibW9kZW1jdGwiKSwgLyogVkJVUyBvZiBNb2RlbSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N19jaGFyZ2VyX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZpbmNoZzEiLCAiY2hhcmdlci1tYW5hZ2VyLjAiKSwKLX07Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgX19pbml0ZGF0YSBtYXg4OTk3X2NoZ190b2ZmX1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZpbmNoZ19zdG9wIiwgTlVMTCksIC8qIGZvciBqYWNrIGludGVycnVwdCBoYW5kbGVycyAqLwotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IF9faW5pdGRhdGEgbWF4ODk5N18zMmtoel9hcF9bXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJncHNfY2xrIiwgImJjbTQ3NTEiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJidF9jbGsiLCAiYmNtNDMzMC1iMSIpLAotCVJFR1VMQVRPUl9TVVBQTFkoIndpZmlfY2xrIiwgImJjbTQzMy1iMSIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkFEQ18zLjNWX0MyMTAiLAotCQkubWluX3VWCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzMwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZBTElWRV8xLjFWX0MyMTAiLAotCQkubWluX3VWCQk9IDExMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTEwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvM19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZVU0JfMS4xVl9DMjEwIiwKLQkJLm1pbl91VgkJPSAxMTAwMDAwLAotCQkubWF4X3VWCQk9IDExMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvM18pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvM18sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWTUlQSV8xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvNF8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvNF8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzVfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSFNJQ18xLjJWX0MyMTAiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG81XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG81XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvNl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZDQ18xLjhWX1BEQSIsCi0JCS5taW5fdVYJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJPSAxODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG83X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0FNX0lTUF8xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvN18pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvN18sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzhfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVVNCL1ZEQUNfMy4zVl9DMjEwIiwKLQkJLm1pbl91VgkJPSAzMzAwMDAwLAotCQkubWF4X3VWCQk9IDMzMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvOF8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvOF8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzlfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfMi44Vl9QREEiLAotCQkubWluX3VWCQk9IDI4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMjgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTBfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWUExMXzEuMVZfQzIxMCIsCi0JCS5taW5fdVYJCT0gMTEwMDAwMCwKLQkJLm1heF91VgkJPSAxMTAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTFfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJMVkRTX1ZERDMuM1YiLAotCQkubWluX3VWCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzMwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5ib290X29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzExXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xMV8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzEyX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlRfQ0FNXzEuOFYiLAotCQkubWluX3VWCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTgwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xMl8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTJfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xM19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZURl8yLjhWIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTNfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzEzXywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfMy4wVl9NT1RPUiIsCi0JCS5taW5fdVYJCT0gMzAwMDAwMCwKLQkJLm1heF91VgkJPSAzMDAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShtYXg4OTk3X2xkbzE0XyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbWF4ODk5N19sZG8xNF8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2xkbzE1X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlRPVUNIX0FEVlYyLjhWIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMTVfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzE1XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMTZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDQU1fU0VOU09SX0lPXzEuOFYiLAotCQkubWluX3VWCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTgwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19sZG8xNl8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfbGRvMTZfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19sZG8xOF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZUT1VDSF9WREQyLjhWIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfbGRvMThfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2xkbzE4XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfbGRvMjFfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWRERRX00xTTJfMS4yViIsCi0JCS5taW5fdVYJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJPSAxMjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazFfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQVJNXzEuMlZfQzIxMCIsCi0JCS5taW5fdVYJCT0gOTAwMDAwLAotCQkubWF4X3VWCQk9IDEzNTAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrMV8pLAotCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazFfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrMl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZJTlRfMS4xVl9DMjEwIiwKLQkJLm1pbl91VgkJPSA5MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTEwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2J1Y2syXyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gbWF4ODk5N19idWNrMl8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2J1Y2szX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkczRF8xLjFWX0MyMTAiLAotCQkubWluX3VWCQk9IDkwMDAwMCwKLQkJLm1heF91VgkJPSAxMTAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAotCQkJCSAgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19idWNrM18pLAotCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfYnVjazNfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrNF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9JU1BfQ09SRV8xLjJWIiwKLQkJLm1pbl91VgkJPSAxMjAwMDAwLAotCQkubWF4X3VWCQk9IDEyMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazRfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2s0XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazVfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWTUVNXzEuMlZfQzIxMCIsCi0JCS5taW5fdVYJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJPSAxMjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N19idWNrNl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9BRl8yLjhWIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG1heDg5OTdfYnVjazZfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSBtYXg4OTk3X2J1Y2s2XywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfYnVjazdfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfU1VCXzIuMFYiLAotCQkubWluX3VWCQk9IDIwMDAwMDAsCi0JCS5tYXhfdVYJCT0gMjAwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfMzJraHpfYXBfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICIzMktIeiBBUCIsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N18zMmtoel9hcF8pLAotCS5jb25zdW1lcl9zdXBwbGllcyA9IG1heDg5OTdfMzJraHpfYXBfLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIF9faW5pdGRhdGEgbWF4ODk5N18zMmtoel9jcF9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIjMyS0h6IENQIiwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfdmljaGdfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSUNIRyIsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2VzYWZlb3V0MV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlNBRkVPVVQxIiwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19lc2FmZW91dDFfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2VzYWZlb3V0MV8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2VzYWZlb3V0Ml9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlNBRkVPVVQyIiwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19lc2FmZW91dDJfKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSBtYXg4OTk3X2VzYWZlb3V0Ml8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2NoYXJnZXJfY3ZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDSEFSR0VSX0NWIiwKLQkJLm1pbl91VgkJPSA0MjAwMDAwLAotCQkubWF4X3VWCQk9IDQyMDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBfX2luaXRkYXRhIG1heDg5OTdfY2hhcmdlcl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNIQVJHRVIiLAotCQkubWluX3VBCQk9IDIwMDAwMCwKLQkJLm1heF91QQkJPSA5NTAwMDAsCi0JCS5ib290X29uCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMgfAotCQkJCVJFR1VMQVRPUl9DSEFOR0VfQ1VSUkVOVCwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKG1heDg5OTdfY2hhcmdlcl8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfY2hhcmdlcl8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgX19pbml0ZGF0YSBtYXg4OTk3X2NoYXJnZXJfdG9wb2ZmX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0hBUkdFUiBUT1BPRkYiLAotCQkubWluX3VBCQk9IDUwMDAwLAotCQkubWF4X3VBCQk9IDIwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9DVVJSRU5ULAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19jaGdfdG9mZl8pLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IG1heDg5OTdfY2hnX3RvZmZfLAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXg4OTk3X3JlZ3VsYXRvcl9kYXRhIF9faW5pdGRhdGEgbnVyaV9tYXg4OTk3X3JlZ3VsYXRvcnNbXSA9IHsKLQl7IE1BWDg5OTdfTERPMSwgJm1heDg5OTdfbGRvMV9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzIsICZtYXg4OTk3X2xkbzJfZGF0YSB9LAotCXsgTUFYODk5N19MRE8zLCAmbWF4ODk5N19sZG8zX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPNCwgJm1heDg5OTdfbGRvNF9kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzUsICZtYXg4OTk3X2xkbzVfZGF0YSB9LAotCXsgTUFYODk5N19MRE82LCAmbWF4ODk5N19sZG82X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPNywgJm1heDg5OTdfbGRvN19kYXRhIH0sCi0JeyBNQVg4OTk3X0xETzgsICZtYXg4OTk3X2xkbzhfZGF0YSB9LAotCXsgTUFYODk5N19MRE85LCAmbWF4ODk5N19sZG85X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTAsICZtYXg4OTk3X2xkbzEwX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTEsICZtYXg4OTk3X2xkbzExX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTIsICZtYXg4OTk3X2xkbzEyX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTMsICZtYXg4OTk3X2xkbzEzX2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTQsICZtYXg4OTk3X2xkbzE0X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTUsICZtYXg4OTk3X2xkbzE1X2RhdGEgfSwKLQl7IE1BWDg5OTdfTERPMTYsICZtYXg4OTk3X2xkbzE2X2RhdGEgfSwKLQotCXsgTUFYODk5N19MRE8xOCwgJm1heDg5OTdfbGRvMThfZGF0YSB9LAotCXsgTUFYODk5N19MRE8yMSwgJm1heDg5OTdfbGRvMjFfZGF0YSB9LAotCi0JeyBNQVg4OTk3X0JVQ0sxLCAmbWF4ODk5N19idWNrMV9kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0syLCAmbWF4ODk5N19idWNrMl9kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0szLCAmbWF4ODk5N19idWNrM19kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0s0LCAmbWF4ODk5N19idWNrNF9kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0s1LCAmbWF4ODk5N19idWNrNV9kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0s2LCAmbWF4ODk5N19idWNrNl9kYXRhIH0sCi0JeyBNQVg4OTk3X0JVQ0s3LCAmbWF4ODk5N19idWNrN19kYXRhIH0sCi0KLQl7IE1BWDg5OTdfRU4zMktIWl9BUCwgJm1heDg5OTdfMzJraHpfYXBfZGF0YSB9LAotCXsgTUFYODk5N19FTjMyS0haX0NQLCAmbWF4ODk5N18zMmtoel9jcF9kYXRhIH0sCi0KLQl7IE1BWDg5OTdfRU5WSUNIRywgJm1heDg5OTdfdmljaGdfZGF0YSB9LAotCXsgTUFYODk5N19FU0FGRU9VVDEsICZtYXg4OTk3X2VzYWZlb3V0MV9kYXRhIH0sCi0JeyBNQVg4OTk3X0VTQUZFT1VUMiwgJm1heDg5OTdfZXNhZmVvdXQyX2RhdGEgfSwKLQl7IE1BWDg5OTdfQ0hBUkdFUl9DViwgJm1heDg5OTdfY2hhcmdlcl9jdl9kYXRhIH0sCi0JeyBNQVg4OTk3X0NIQVJHRVIsICZtYXg4OTk3X2NoYXJnZXJfZGF0YSB9LAotCXsgTUFYODk5N19DSEFSR0VSX1RPUE9GRiwgJm1heDg5OTdfY2hhcmdlcl90b3BvZmZfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBudXJpX21heDg5OTdfcGRhdGEgPSB7Ci0JLndha2V1cAkJCT0gMSwKLQotCS5udW1fcmVndWxhdG9ycwkJPSBBUlJBWV9TSVpFKG51cmlfbWF4ODk5N19yZWd1bGF0b3JzKSwKLQkucmVndWxhdG9ycwkJPSBudXJpX21heDg5OTdfcmVndWxhdG9ycywKLQotCS5idWNrMTI1X2dwaW9zID0geyBFWFlOT1M0X0dQWDAoNSksIEVYWU5PUzRfR1BYMCg2KSwgRVhZTk9TNF9HUEwwKDApIH0sCi0JLmJ1Y2syX2dwaW9kdnMgPSB0cnVlLAotCi0JLmJ1Y2sxX3ZvbHRhZ2VbMF0gPSAxMzUwMDAwLCAvKiAxLjM1ViAqLwotCS5idWNrMV92b2x0YWdlWzFdID0gMTMwMDAwMCwgLyogMS4zViAqLwotCS5idWNrMV92b2x0YWdlWzJdID0gMTI1MDAwMCwgLyogMS4yNVYgKi8KLQkuYnVjazFfdm9sdGFnZVszXSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazFfdm9sdGFnZVs0XSA9IDExNTAwMDAsIC8qIDEuMTVWICovCi0JLmJ1Y2sxX3ZvbHRhZ2VbNV0gPSAxMTAwMDAwLCAvKiAxLjFWICovCi0JLmJ1Y2sxX3ZvbHRhZ2VbNl0gPSAxMDAwMDAwLCAvKiAxLjBWICovCi0JLmJ1Y2sxX3ZvbHRhZ2VbN10gPSA5NTAwMDAsIC8qIDAuOTVWICovCi0KLQkuYnVjazJfdm9sdGFnZVswXSA9IDExMDAwMDAsIC8qIDEuMVYgKi8KLQkuYnVjazJfdm9sdGFnZVsxXSA9IDEwMDAwMDAsIC8qIDEuMFYgKi8KLQkuYnVjazJfdm9sdGFnZVsyXSA9IDk1MDAwMCwgLyogMC45NVYgKi8KLQkuYnVjazJfdm9sdGFnZVszXSA9IDkwMDAwMCwgLyogMC45ViAqLwotCS5idWNrMl92b2x0YWdlWzRdID0gMTEwMDAwMCwgLyogMS4xViAqLwotCS5idWNrMl92b2x0YWdlWzVdID0gMTAwMDAwMCwgLyogMS4wViAqLwotCS5idWNrMl92b2x0YWdlWzZdID0gOTUwMDAwLCAvKiAwLjk1ViAqLwotCS5idWNrMl92b2x0YWdlWzddID0gOTAwMDAwLCAvKiAwLjlWICovCi0KLQkuYnVjazVfdm9sdGFnZVswXSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVsxXSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVsyXSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVszXSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVs0XSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVs1XSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVs2XSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLQkuYnVjazVfdm9sdGFnZVs3XSA9IDEyMDAwMDAsIC8qIDEuMlYgKi8KLX07Ci0KLS8qIEdQSU8gSTJDIDUgKFBNSUMpICovCi1lbnVtIHsgSTJDNV9NQVg4OTk3IH07Ci1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyYzVfZGV2c1tdIF9faW5pdGRhdGEgPSB7Ci0JW0kyQzVfTUFYODk5N10gPSB7Ci0JCUkyQ19CT0FSRF9JTkZPKCJtYXg4OTk3IiwgMHhDQyA+PiAxKSwKLQkJLnBsYXRmb3JtX2RhdGEJPSAmbnVyaV9tYXg4OTk3X3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1heDE3MDQyX3BsYXRmb3JtX2RhdGEgbnVyaV9iYXR0ZXJ5X3BsYXRmb3JtX2RhdGEgPSB7Ci19OwotCi0vKiBHUElPIEkyQyA5IChGdWVsIEdhdWdlKSAqLwotc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGkyYzlfZ3Bpb19kYXRhID0gewotCS5zZGFfcGluCQk9IEVYWU5PUzRfR1BZNCgwKSwgICAgICAvKiBYTTBBRERSXzggKi8KLQkuc2NsX3BpbgkJPSBFWFlOT1M0X0dQWTQoMSksICAgICAgLyogWE0wQUREUl85ICovCi19Owotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjOV9ncGlvID0gewotCS5uYW1lCQkJPSAiaTJjLWdwaW8iLAotCS5pZAkJCT0gOSwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmkyYzlfZ3Bpb19kYXRhLAotCX0sCi19OwotZW51bSB7IEkyQzlfTUFYMTcwNDJ9Owotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmM5X2RldnNbXSBfX2luaXRkYXRhID0gewotCVtJMkM5X01BWDE3MDQyXSA9IHsKLQkJSTJDX0JPQVJEX0lORk8oIm1heDE3MDQyIiwgMHgzNiksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJm51cmlfYmF0dGVyeV9wbGF0Zm9ybV9kYXRhLAotCX0sCi19OwotCi0vKiBNQVg4OTAzIFNlY29uZGFyeSBDaGFyZ2VyICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc3VwcGxpZXNfbWF4ODkwM1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZpbmNoZzIiLCAiY2hhcmdlci1tYW5hZ2VyLjAiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBtYXg4OTAzX2NoYXJnZXJfZW5fZGF0YSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQk9ICJWT1VUX0NIQVJHRVIiLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmJvb3Rfb24JPSAxLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoc3VwcGxpZXNfbWF4ODkwMyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzID0gc3VwcGxpZXNfbWF4ODkwMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgbWF4ODkwM19jaGFyZ2VyX2VuID0gewotCS5zdXBwbHlfbmFtZSA9ICJWT1VUX0NIQVJHRVIiLAotCS5taWNyb3ZvbHRzID0gNTAwMDAwMCwgLyogQXNzdW1lIDVWREMgKi8KLQkuZ3BpbyA9IEVYWU5PUzRfR1BZNCg1KSwgLyogVEFfRU4gbmVnYWdlZCAqLwotCS5lbmFibGVfaGlnaCA9IDAsIC8qIEVuYWJsZSA9IExvdyAqLwotCS5lbmFibGVkX2F0X2Jvb3QgPSAxLAotCS5pbml0X2RhdGEgPSAmbWF4ODkwM19jaGFyZ2VyX2VuX2RhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtYXg4OTAzX2ZpeGVkX3JlZ19kZXYgPSB7Ci0JLm5hbWUgPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAotCS5pZCA9IEZJWEVEX1JFR19JRF9NQVg4OTAzLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhCT0gJm1heDg5MDNfY2hhcmdlcl9lbiB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXg4OTAzX3BkYXRhIG51cmlfbWF4ODkwMyA9IHsKLQkvKgotCSAqIGNlbjogZG9uJ3QgY29udHJvbCB3aXRoIHRoZSBkcml2ZXIsIGxldCBpdCBiZQotCSAqIGNvbnRyb2xsZWQgYnkgcmVndWxhdG9yIGFib3ZlCi0JICovCi0JLmRvayA9IEVYWU5PUzRfR1BYMSg0KSwgLyogVEFfbkNPTk5FQ1RFRCAqLwotCS8qIHVvaywgdXN1czogbm90IGNvbm5lY3RlZCAqLwotCS5jaGcgPSBFWFlOT1M0X0dQRTIoMCksIC8qIFRBX25DSEcgKi8KLQkvKiBmbHQ6IHZjY18xLjhWX3BkYSAqLwotCS5kY20gPSBFWFlOT1M0X0dQTDAoMSksIC8qIENVUlJfQURKICovCi0KLQkuZGNfdmFsaWQgPSB0cnVlLAotCS51c2JfdmFsaWQgPSBmYWxzZSwgLyogVVNCIGlzIG5vdCB3aXJlZCB0byBNQVg4OTAzICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBudXJpX21heDg5MDNfZGV2aWNlID0gewotCS5uYW1lCQkJPSAibWF4ODkwMy1jaGFyZ2VyIiwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJm51cmlfbWF4ODkwMywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgKm51cmlfY21fZGV2aWNlc1tdID0gewotCSZzM2NfZGV2aWNlX2kyYzUuZGV2LAotCSZzM2NfZGV2aWNlX2FkYy5kZXYsCi0JTlVMTCwgLyogUmVzZXJ2ZWQgZm9yIFVBUlQgKi8KLQlOVUxMLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG51cmlfcG93ZXJfaW5pdCh2b2lkKQotewotCWludCBncGlvOwotCWludCBpcnFfYmFzZSA9IElSUV9HUElPX0VORCArIDE7Ci0JaW50IHRhX2VuID0gMDsKLQotCW51cmlfbWF4ODk5N19wZGF0YS5pcnFfYmFzZSA9IGlycV9iYXNlOwotCWlycV9iYXNlICs9IE1BWDg5OTdfSVJRX05SOwotCi0JZ3BpbyA9IEVYWU5PUzRfR1BYMCg3KTsKLQlncGlvX3JlcXVlc3QoZ3BpbywgIkFQX1BNSUNfSVJRIik7Ci0JczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfTk9ORSk7Ci0KLQlncGlvID0gRVhZTk9TNF9HUFgyKDMpOwotCWdwaW9fcmVxdWVzdChncGlvLCAiRlVFTF9BTEVSVCIpOwotCXMzY19ncGlvX2NmZ3BpbihncGlvLCBTM0NfR1BJT19TRk4oMHhmKSk7Ci0JczNjX2dwaW9fc2V0cHVsbChncGlvLCBTM0NfR1BJT19QVUxMX05PTkUpOwotCi0JZ3BpbyA9IG51cmlfbWF4ODkwMy5kb2s7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJUQV9uQ09OTkVDVEVEIik7Ci0JczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKLQlzM2NfZ3Bpb19zZXRwdWxsKGdwaW8sIFMzQ19HUElPX1BVTExfTk9ORSk7Ci0JdGFfZW4gPSBncGlvX2dldF92YWx1ZShncGlvKSA/IDAgOiAxOwotCi0JZ3BpbyA9IG51cmlfbWF4ODkwMy5jaGc7Ci0JZ3Bpb19yZXF1ZXN0KGdwaW8sICJUQV9uQ0hHIik7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Ci0KLQlncGlvID0gbnVyaV9tYXg4OTAzLmRjbTsKLQlncGlvX3JlcXVlc3QoZ3BpbywgIkNVUlJfQURKIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIHRhX2VuKTsKLX0KLQotLyogVVNCIEVIQ0kgKi8KLXN0YXRpYyBzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgbnVyaV9laGNpX3BkYXRhOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVyaV9laGNpX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkYXRhID0gJm51cmlfZWhjaV9wZGF0YTsKLQotCXM1cF9laGNpX3NldF9wbGF0ZGF0YShwZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudXJpX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCS8qIFNhbXN1bmcgUGxhdGZvcm0gRGV2aWNlcyAqLwotCSZzM2NfZGV2aWNlX2kyYzUsIC8qIFBNSUMgc2hvdWxkIGluaXRpYWxpemUgZmlyc3QgKi8KLQkmZW1tY19maXhlZF92b2x0YWdlLAotCSZzM2NfZGV2aWNlX2hzbW1jMCwKLQkmczNjX2RldmljZV9oc21tYzIsCi0JJnMzY19kZXZpY2VfaHNtbWMzLAotCSZzM2NfZGV2aWNlX3dkdCwKLQkmczNjX2RldmljZV90aW1lclswXSwKLQkmczVwX2RldmljZV9laGNpLAotCSZzM2NfZGV2aWNlX2kyYzMsCi0JJmkyYzlfZ3BpbywKLQkmczNjX2RldmljZV9hZGMsCi0JJnMzY19kZXZpY2VfcnRjLAotCSZzNXBfZGV2aWNlX21mYywKLQkmczVwX2RldmljZV9tZmNfbCwKLQkmczVwX2RldmljZV9tZmNfciwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKLQotCS8qIE5VUkkgRGV2aWNlcyAqLwotCSZudXJpX2dwaW9fa2V5cywKLQkmbnVyaV9sY2RfZGV2aWNlLAotCSZudXJpX2JhY2tsaWdodF9kZXZpY2UsCi0JJm1heDg5MDNfZml4ZWRfcmVnX2RldiwKLQkmbnVyaV9tYXg4OTAzX2RldmljZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX21hcF9pbyh2b2lkKQotewotCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOwotCXMzYzI0eHhfaW5pdF9jbG9ja3MoMjQwMDAwMDApOwotCXMzYzI0eHhfaW5pdF91YXJ0cyhudXJpX3VhcnRjZmdzLCBBUlJBWV9TSVpFKG51cmlfdWFydGNmZ3MpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG51cmlfcmVzZXJ2ZSh2b2lkKQotewotCXM1cF9tZmNfcmVzZXJ2ZV9tZW0oMHg0MzAwMDAwMCwgOCA8PCAyMCwgMHg1MTAwMDAwMCwgOCA8PCAyMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudXJpX21hY2hpbmVfaW5pdCh2b2lkKQotewotCW51cmlfc2RoY2lfaW5pdCgpOwotCW51cmlfdHNwX2luaXQoKTsKLQludXJpX3Bvd2VyX2luaXQoKTsKLQotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyYzFfZGV2cywgQVJSQVlfU0laRShpMmMxX2RldnMpKTsKLQlzM2NfaTJjM19zZXRfcGxhdGRhdGEoJmkyYzNfZGF0YSk7Ci0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMywgaTJjM19kZXZzLCBBUlJBWV9TSVpFKGkyYzNfZGV2cykpOwotCXMzY19pMmM1X3NldF9wbGF0ZGF0YShOVUxMKTsKLQlpMmM1X2RldnNbSTJDNV9NQVg4OTk3XS5pcnEgPSBncGlvX3RvX2lycShFWFlOT1M0X0dQWDAoNykpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDUsIGkyYzVfZGV2cywgQVJSQVlfU0laRShpMmM1X2RldnMpKTsKLQlpMmM5X2RldnNbSTJDOV9NQVgxNzA0Ml0uaXJxID0gZ3Bpb190b19pcnEoRVhZTk9TNF9HUFgyKDMpKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyg5LCBpMmM5X2RldnMsIEFSUkFZX1NJWkUoaTJjOV9kZXZzKSk7Ci0KLQludXJpX2VoY2lfaW5pdCgpOwotCWNsa194dXNieHRpLnJhdGUgPSAyNDAwMDAwMDsKLQotCS8qIExhc3QgKi8KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhudXJpX2RldmljZXMsIEFSUkFZX1NJWkUobnVyaV9kZXZpY2VzKSk7Ci0JczVwX2RldmljZV9tZmMuZGV2LnBhcmVudCA9ICZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLmRldjsKLX0KLQotTUFDSElORV9TVEFSVChOVVJJLCAiTlVSSSIpCi0JLyogTWFpbnRhaW5lcjogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKLQkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAotCS5tYXBfaW8JCT0gbnVyaV9tYXBfaW8sCi0JLmluaXRfbWFjaGluZQk9IG51cmlfbWFjaGluZV9pbml0LAotCS50aW1lcgkJPSAmZXh5bm9zNF90aW1lciwKLQkucmVzZXJ2ZSAgICAgICAgPSAmbnVyaV9yZXNlcnZlLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGtjMjEwLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrYzIxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M2NWUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGtjMjEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka2MyMTAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9sY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+Ci0jaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2ZiLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9wZC5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2JhY2tsaWdodC5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotLyogRm9sbG93aW5nIGFyZSBkZWZhdWx0IHZhbHVlcyBmb3IgVUNPTiwgVUxDT04gYW5kIFVGQ09OIFVBUlQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNNREtDMjEwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAotCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCi0KLSNkZWZpbmUgU01ES0MyMTBfVUxDT05fREVGQVVMVAlTM0MyNDEwX0xDT05fQ1M4Ci0KLSNkZWZpbmUgU01ES0MyMTBfVUZDT05fREVGQVVMVAkoUzNDMjQxMF9VRkNPTl9GSUZPTU9ERSB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9UWFRSSUc0IHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1JYVFJJRzQpCi0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHNtZGtjMjEwX3VhcnRjZmdzW10gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7Ci0JCS5od3BvcnQJCT0gMCwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IFNNREtDMjEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IFNNREtDMjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBTTURLQzIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzFdID0gewotCQkuaHdwb3J0CQk9IDEsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLQzIxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLQzIxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES0MyMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVsyXSA9IHsKLQkJLmh3cG9ydAkJPSAyLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gU01ES0MyMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gU01ES0MyMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFNNREtDMjEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbM10gPSB7Ci0JCS5od3BvcnQJCT0gMywKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IFNNREtDMjEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IFNNREtDMjEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBTTURLQzIxMF9VRkNPTl9ERUZBVUxULAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrYzIxMF9oc21tYzBfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEswKDIpLAotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLSNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDBfOEJJVAotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka2MyMTBfaHNtbWMxX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMCgyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrYzIxMF9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEsyKDIpLAotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLSNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDJfOEJJVAotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka2MyMTBfaHNtbWMzX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMigyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi1zdGF0aWMgdm9pZCBsY2RfbHRlNDgwd3Zfc2V0X3Bvd2VyKHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgcG93ZXIpCi17Ci0JaWYgKHBvd2VyKSB7Ci0jaWYgIWRlZmluZWQoQ09ORklHX0JBQ0tMSUdIVF9QV00pCi0JCWdwaW9fcmVxdWVzdF9vbmUoRVhZTk9TNF9HUEQwKDEpLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiR1BEMCIpOwotCQlncGlvX2ZyZWUoRVhZTk9TNF9HUEQwKDEpKTsKLSNlbmRpZgotCQkvKiBmaXJlIG5SRVNFVCBvbiBwb3dlciB1cCAqLwotCQlncGlvX3JlcXVlc3QoRVhZTk9TNF9HUFgwKDYpLCAiR1BYMCIpOwotCi0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChFWFlOT1M0X0dQWDAoNiksIDEpOwotCQltZGVsYXkoMTAwKTsKLQotCQlncGlvX3NldF92YWx1ZShFWFlOT1M0X0dQWDAoNiksIDApOwotCQltZGVsYXkoMTApOwotCi0JCWdwaW9fc2V0X3ZhbHVlKEVYWU5PUzRfR1BYMCg2KSwgMSk7Ci0JCW1kZWxheSgxMCk7Ci0KLQkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BYMCg2KSk7Ci0JfSBlbHNlIHsKLSNpZiAhZGVmaW5lZChDT05GSUdfQkFDS0xJR0hUX1BXTSkKLQkJZ3Bpb19yZXF1ZXN0X29uZShFWFlOT1M0X0dQRDAoMSksIEdQSU9GX09VVF9JTklUX0xPVywgIkdQRDAiKTsKLQkJZ3Bpb19mcmVlKEVYWU5PUzRfR1BEMCgxKSk7Ci0jZW5kaWYKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBzbWRrYzIxMF9sY2RfbHRlNDgwd3ZfZGF0YSA9IHsKLQkuc2V0X3Bvd2VyCQk9IGxjZF9sdGU0ODB3dl9zZXRfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrYzIxMF9sY2RfbHRlNDgwd3YgPSB7Ci0JLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAotCS5kZXYucGFyZW50CQk9ICZzNXBfZGV2aWNlX2ZpbWQwLmRldiwKLQkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmc21ka2MyMTBfbGNkX2x0ZTQ4MHd2X2RhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19mYl9wZF93aW4gc21ka2MyMTBfZmJfd2luMCA9IHsKLQkud2luX21vZGUgPSB7Ci0JCS5sZWZ0X21hcmdpbgk9IDEzLAotCQkucmlnaHRfbWFyZ2luCT0gOCwKLQkJLnVwcGVyX21hcmdpbgk9IDcsCi0JCS5sb3dlcl9tYXJnaW4JPSA1LAotCQkuaHN5bmNfbGVuCT0gMywKLQkJLnZzeW5jX2xlbgk9IDEsCi0JCS54cmVzCQk9IDgwMCwKLQkJLnlyZXMJCT0gNDgwLAotCX0sCi0JLm1heF9icHAJCT0gMzIsCi0JLmRlZmF1bHRfYnBwCQk9IDI0LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgc21ka2MyMTBfbGNkMF9wZGF0YSBfX2luaXRkYXRhID0gewotCS53aW5bMF0JCT0gJnNtZGtjMjEwX2ZiX3dpbjAsCi0JLnZpZGNvbjAJPSBWSURDT04wX1ZJRE9VVF9SR0IgfCBWSURDT04wX1BOUk1PREVfUkdCLAotCS52aWRjb24xCT0gVklEQ09OMV9JTlZfSFNZTkMgfCBWSURDT04xX0lOVl9WU1lOQywKLQkuc2V0dXBfZ3Bpbwk9IGV4eW5vczRfZmltZDBfZ3Bpb19zZXR1cF8yNGJwcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21ka2MyMTBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDEpICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9FSU5UKDUpLAotCQkuZW5kCT0gSVJRX0VJTlQoNSksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSVJRRl9UUklHR0VSX0xPVywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMTVfY29uZmlnID0gewotCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0xPVywKLQkuaXJxX3R5cGUJPSBTTVNDOTExWF9JUlFfVFlQRV9QVVNIX1BVTEwsCi0JLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8xNkJJVCB8IFNNU0M5MTFYX0ZPUkNFX0lOVEVSTkFMX1BIWSwKLQkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCi0JLm1hYwkJPSB7MHgwMCwgMHg4MCwgMHgwMCwgMHgyMywgMHg0NSwgMHg2N30sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrYzIxMF9zbXNjOTExeCA9IHsKLQkubmFtZQkJPSAic21zYzkxMXgiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21ka2MyMTBfc21zYzkxMXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzbWRrYzIxMF9zbXNjOTExeF9yZXNvdXJjZXMsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNtc2M5MjE1X2NvbmZpZywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czFbXSBfX2luaXRkYXRhID0gewotCXtJMkNfQk9BUkRfSU5GTygid204OTk0IiwgMHgxYSksfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbWRrYzIxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmczNjX2RldmljZV9oc21tYzAsCi0JJnMzY19kZXZpY2VfaHNtbWMxLAotCSZzM2NfZGV2aWNlX2hzbW1jMiwKLQkmczNjX2RldmljZV9oc21tYzMsCi0JJnMzY19kZXZpY2VfaTJjMSwKLQkmczNjX2RldmljZV9ydGMsCi0JJnMzY19kZXZpY2Vfd2R0LAotCSZleHlub3M0X2RldmljZV9hYzk3LAotCSZleHlub3M0X2RldmljZV9pMnMwLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9HM0RdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9MQ0QwXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMV0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0NBTV0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX1RWXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfR1BTXSwKLQkmZXh5bm9zNF9kZXZpY2Vfc3lzbW11LAotCSZzYW1zdW5nX2Fzb2NfZG1hLAotCSZzNXBfZGV2aWNlX2ZpbWQwLAotCSZzbWRrYzIxMF9sY2RfbHRlNDgwd3YsCi0JJnNtZGtjMjEwX3Ntc2M5MTF4LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHNtZGtjMjEwX3Ntc2M5MTF4X2luaXQodm9pZCkKLXsKLQl1MzIgY3MxOwotCi0JLyogY29uZmlndXJlIG5DUzEgd2lkdGggdG8gMTYgYml0cyAqLwotCWNzMSA9IF9fcmF3X3JlYWRsKFM1UF9TUk9NX0JXKSAmCi0JCX4oUzVQX1NST01fQldfX0NTX01BU0sgPDwgUzVQX1NST01fQldfX05DUzFfX1NISUZUKTsKLQljczEgfD0gKCgxIDw8IFM1UF9TUk9NX0JXX19EQVRBV0lEVEhfX1NISUZUKSB8Ci0JCSgxIDw8IFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVCkgfAotCQkoMSA8PCBTNVBfU1JPTV9CV19fQllURUVOQUJMRV9fU0hJRlQpKSA8PAotCQlTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQ7Ci0JX19yYXdfd3JpdGVsKGNzMSwgUzVQX1NST01fQlcpOwotCi0JLyogc2V0IHRpbWluZyBmb3IgbkNTMSBzdWl0YWJsZSBmb3IgZXRoZXJuZXQgY2hpcCAqLwotCV9fcmF3X3dyaXRlbCgoMHgxIDw8IFM1UF9TUk9NX0JDWF9fUE1DX19TSElGVCkgfAotCQkgICAgICgweDkgPDwgUzVQX1NST01fQkNYX19UQUNQX19TSElGVCkgfAotCQkgICAgICgweGMgPDwgUzVQX1NST01fQkNYX19UQ0FIX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09IX19TSElGVCkgfAotCQkgICAgICgweDYgPDwgUzVQX1NST01fQkNYX19UQUNDX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQ09TX19TSElGVCkgfAotCQkgICAgICgweDEgPDwgUzVQX1NST01fQkNYX19UQUNTX19TSElGVCksIFM1UF9TUk9NX0JDMSk7Ci19Ci0KLS8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLwotc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrYzIxMF9ibF9ncGlvX2luZm8gPSB7Ci0JLm5vID0gRVhZTk9TNF9HUEQwKDEpLAotCS5mdW5jID0gUzNDX0dQSU9fU0ZOKDIpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka2MyMTBfYmxfZGF0YSA9IHsKLQkucHdtX2lkID0gMSwKLQkucHdtX3BlcmlvZF9ucyAgPSAxMDAwLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHNtZGtjMjEwX21hcF9pbyh2b2lkKQotewotCXM1cF9pbml0X2lvKE5VTEwsIDAsIFM1UF9WQV9DSElQSUQpOwotCXMzYzI0eHhfaW5pdF9jbG9ja3MoMjQwMDAwMDApOwotCXMzYzI0eHhfaW5pdF91YXJ0cyhzbWRrYzIxMF91YXJ0Y2ZncywgQVJSQVlfU0laRShzbWRrYzIxMF91YXJ0Y2ZncykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21ka2MyMTBfbWFjaGluZV9pbml0KHZvaWQpCi17Ci0JczNjX2kyYzFfc2V0X3BsYXRkYXRhKE5VTEwpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDEsIGkyY19kZXZzMSwgQVJSQVlfU0laRShpMmNfZGV2czEpKTsKLQotCXNtZGtjMjEwX3Ntc2M5MTF4X2luaXQoKTsKLQotCXMzY19zZGhjaTBfc2V0X3BsYXRkYXRhKCZzbWRrYzIxMF9oc21tYzBfcGRhdGEpOwotCXMzY19zZGhjaTFfc2V0X3BsYXRkYXRhKCZzbWRrYzIxMF9oc21tYzFfcGRhdGEpOwotCXMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKCZzbWRrYzIxMF9oc21tYzJfcGRhdGEpOwotCXMzY19zZGhjaTNfc2V0X3BsYXRkYXRhKCZzbWRrYzIxMF9oc21tYzNfcGRhdGEpOwotCi0Jc2Ftc3VuZ19ibF9zZXQoJnNtZGtjMjEwX2JsX2dwaW9faW5mbywgJnNtZGtjMjEwX2JsX2RhdGEpOwotCXM1cF9maW1kMF9zZXRfcGxhdGRhdGEoJnNtZGtjMjEwX2xjZDBfcGRhdGEpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMoc21ka2MyMTBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrYzIxMF9kZXZpY2VzKSk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoU01ES0MyMTAsICJTTURLQzIxMCIpCi0JLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UF9QQV9TRFJBTSArIDB4MTAwLAotCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCi0JLm1hcF9pbwkJPSBzbWRrYzIxMF9tYXBfaW8sCi0JLmluaXRfbWFjaGluZQk9IHNtZGtjMjEwX21hY2hpbmVfaW5pdCwKLQkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXNtZGt2MzEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDE0OTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtc21ka3YzMTAuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC1zbWRrdjMxMC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+Ci0jaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvcGQuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9iYWNrbGlnaHQuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLS8qIEZvbGxvd2luZyBhcmUgZGVmYXVsdCB2YWx1ZXMgZm9yIFVDT04sIFVMQ09OIGFuZCBVRkNPTiBVQVJUIHJlZ2lzdGVycyAqLwotI2RlZmluZSBTTURLVjMxMF9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKLQkJCQkgUzNDMjQxMF9VQ09OX1JYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fVFhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJUlFNT0RFIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhGSUZPX1RPSSB8CVwKLQkJCQkgUzNDMjQ0M19VQ09OX1JYRVJSX0lSUUVOKQotCi0jZGVmaW5lIFNNREtWMzEwX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAotCi0jZGVmaW5lIFNNREtWMzEwX1VGQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUZDT05fRklGT01PREUgfAlcCi0JCQkJIFM1UFYyMTBfVUZDT05fVFhUUklHNCB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUc0KQotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdWFydGNmZyBzbWRrdjMxMF91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7Ci0JWzBdID0gewotCQkuaHdwb3J0CQk9IDAsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLVjMxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLVjMxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES1YzMTBfVUZDT05fREVGQVVMVCwKLQl9LAotCVsxXSA9IHsKLQkJLmh3cG9ydAkJPSAxLAotCQkuZmxhZ3MJCT0gMCwKLQkJLnVjb24JCT0gU01ES1YzMTBfVUNPTl9ERUZBVUxULAotCQkudWxjb24JCT0gU01ES1YzMTBfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFNNREtWMzEwX1VGQ09OX0RFRkFVTFQsCi0JfSwKLQlbMl0gPSB7Ci0JCS5od3BvcnQJCT0gMiwKLQkJLmZsYWdzCQk9IDAsCi0JCS51Y29uCQk9IFNNREtWMzEwX1VDT05fREVGQVVMVCwKLQkJLnVsY29uCQk9IFNNREtWMzEwX1VMQ09OX0RFRkFVTFQsCi0JCS51ZmNvbgkJPSBTTURLVjMxMF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzNdID0gewotCQkuaHdwb3J0CQk9IDMsCi0JCS5mbGFncwkJPSAwLAotCQkudWNvbgkJPSBTTURLVjMxMF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBTTURLVjMxMF9VTENPTl9ERUZBVUxULAotCQkudWZjb24JCT0gU01ES1YzMTBfVUZDT05fREVGQVVMVCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMwX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0lOVEVSTkFMLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLSNpZmRlZiBDT05GSUdfRVhZTk9TNF9TREhDSV9DSDBfOEJJVAotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfOF9CSVRfREFUQSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgc21ka3YzMTBfaHNtbWMxX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmNkX3R5cGUJCT0gUzNDX1NESENJX0NEX0dQSU8sCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BLMCgyKSwKLQkuZXh0X2NkX2dwaW9faW52ZXJ0CT0gMSwKLQkuY2xrX3R5cGUJCT0gUzNDX1NESENJX0NMS19ESVZfRVhURVJOQUwsCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzJfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfSU5URVJOQUwsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotI2lmZGVmIENPTkZJR19FWFlOT1M0X1NESENJX0NIMl84QklUCi0JLm1heF93aWR0aAkJPSA4LAotCS5ob3N0X2NhcHMJCT0gTU1DX0NBUF84X0JJVF9EQVRBLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzbWRrdjMxMF9oc21tYzNfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfR1BJTywKLQkuZXh0X2NkX2dwaW8JCT0gRVhZTk9TNF9HUEsyKDIpLAotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBFWFlOT1M0X1BBX1NST01fQkFOSygxKSwKLQkJLmVuZAk9IEVYWU5PUzRfUEFfU1JPTV9CQU5LKDEpICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9FSU5UKDUpLAotCQkuZW5kCT0gSVJRX0VJTlQoNSksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSVJRRl9UUklHR0VSX0xPVywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkyMTVfY29uZmlnID0gewotCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0xPVywKLQkuaXJxX3R5cGUJPSBTTVNDOTExWF9JUlFfVFlQRV9QVVNIX1BVTEwsCi0JLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8xNkJJVCB8IFNNU0M5MTFYX0ZPUkNFX0lOVEVSTkFMX1BIWSwKLQkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCi0JLm1hYwkJPSB7MHgwMCwgMHg4MCwgMHgwMCwgMHgyMywgMHg0NSwgMHg2N30sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrdjMxMF9zbXNjOTExeCA9IHsKLQkubmFtZQkJPSAic21zYzkxMXgiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21ka3YzMTBfc21zYzkxMXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzbWRrdjMxMF9zbXNjOTExeF9yZXNvdXJjZXMsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnNtc2M5MjE1X2NvbmZpZywKLQl9LAotfTsKLQotc3RhdGljIHVpbnQzMl90IHNtZGt2MzEwX2tleW1hcFtdIF9faW5pdGRhdGEgPSB7Ci0JLyogS0VZKHJvdywgY29sLCBrZXljb2RlKSAqLwotCUtFWSgwLCAzLCBLRVlfMSksIEtFWSgwLCA0LCBLRVlfMiksIEtFWSgwLCA1LCBLRVlfMyksCi0JS0VZKDAsIDYsIEtFWV80KSwgS0VZKDAsIDcsIEtFWV81KSwKLQlLRVkoMSwgMywgS0VZX0EpLCBLRVkoMSwgNCwgS0VZX0IpLCBLRVkoMSwgNSwgS0VZX0MpLAotCUtFWSgxLCA2LCBLRVlfRCksIEtFWSgxLCA3LCBLRVlfRSkKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIHNtZGt2MzEwX2tleW1hcF9kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmtleW1hcAkJPSBzbWRrdjMxMF9rZXltYXAsCi0JLmtleW1hcF9zaXplCT0gQVJSQVlfU0laRShzbWRrdjMxMF9rZXltYXApLAotfTsKLQotc3RhdGljIHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSBzbWRrdjMxMF9rZXlwYWRfZGF0YSBfX2luaXRkYXRhID0gewotCS5rZXltYXBfZGF0YQk9ICZzbWRrdjMxMF9rZXltYXBfZGF0YSwKLQkucm93cwkJPSAyLAotCS5jb2xzCQk9IDgsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyY19kZXZzMVtdIF9faW5pdGRhdGEgPSB7Ci0Je0kyQ19CT0FSRF9JTkZPKCJ3bTg5OTQiLCAweDFhKSx9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGt2MzEwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzM2NfZGV2aWNlX2hzbW1jMCwKLQkmczNjX2RldmljZV9oc21tYzEsCi0JJnMzY19kZXZpY2VfaHNtbWMyLAotCSZzM2NfZGV2aWNlX2hzbW1jMywKLQkmczNjX2RldmljZV9pMmMxLAotCSZzM2NfZGV2aWNlX3J0YywKLQkmczNjX2RldmljZV93ZHQsCi0JJmV4eW5vczRfZGV2aWNlX2FjOTcsCi0JJmV4eW5vczRfZGV2aWNlX2kyczAsCi0JJnNhbXN1bmdfZGV2aWNlX2tleXBhZCwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfRzNEXSwKLQkmZXh5bm9zNF9kZXZpY2VfcGRbUERfTENEMF0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0xDRDFdLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9DQU1dLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9UVl0sCi0JJmV4eW5vczRfZGV2aWNlX3BkW1BEX0dQU10sCi0JJmV4eW5vczRfZGV2aWNlX3NwZGlmLAotCSZleHlub3M0X2RldmljZV9zeXNtbXUsCi0JJnNhbXN1bmdfYXNvY19kbWEsCi0JJnNhbXN1bmdfYXNvY19pZG1hLAotCSZzbWRrdjMxMF9zbXNjOTExeCwKLQkmZXh5bm9zNF9kZXZpY2VfYWhjaSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9zbXNjOTExeF9pbml0KHZvaWQpCi17Ci0JdTMyIGNzMTsKLQotCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KLQljczEgPSBfX3Jhd19yZWFkbChTNVBfU1JPTV9CVykgJgotCQl+KFM1UF9TUk9NX0JXX19DU19NQVNLIDw8IFM1UF9TUk9NX0JXX19OQ1MxX19TSElGVCk7Ci0JY3MxIHw9ICgoMSA8PCBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVCkgfAotCQkoMSA8PCBTNVBfU1JPTV9CV19fV0FJVEVOQUJMRV9fU0hJRlQpIHwKLQkJKDEgPDwgUzVQX1NST01fQldfX0JZVEVFTkFCTEVfX1NISUZUKSkgPDwKLQkJUzVQX1NST01fQldfX05DUzFfX1NISUZUOwotCV9fcmF3X3dyaXRlbChjczEsIFM1UF9TUk9NX0JXKTsKLQotCS8qIHNldCB0aW1pbmcgZm9yIG5DUzEgc3VpdGFibGUgZm9yIGV0aGVybmV0IGNoaXAgKi8KLQlfX3Jhd193cml0ZWwoKDB4MSA8PCBTNVBfU1JPTV9CQ1hfX1BNQ19fU0hJRlQpIHwKLQkJICAgICAoMHg5IDw8IFM1UF9TUk9NX0JDWF9fVEFDUF9fU0hJRlQpIHwKLQkJICAgICAoMHhjIDw8IFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPSF9fU0hJRlQpIHwKLQkJICAgICAoMHg2IDw8IFM1UF9TUk9NX0JDWF9fVEFDQ19fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVENPU19fU0hJRlQpIHwKLQkJICAgICAoMHgxIDw8IFM1UF9TUk9NX0JDWF9fVEFDU19fU0hJRlQpLCBTNVBfU1JPTV9CQzEpOwotfQotCi0vKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka3YzMTBfYmxfZ3Bpb19pbmZvID0gewotCS5ubyA9IEVYWU5PUzRfR1BEMCgxKSwKLQkuZnVuYyA9IFMzQ19HUElPX1NGTigyKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fcHdtX2JhY2tsaWdodF9kYXRhIHNtZGt2MzEwX2JsX2RhdGEgPSB7Ci0JLnB3bV9pZCA9IDEsCi0JLnB3bV9wZXJpb2RfbnMgID0gMTAwMCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzbWRrdjMxMF9tYXBfaW8odm9pZCkKLXsKLQlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKLQlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKLQlzM2MyNHh4X2luaXRfdWFydHMoc21ka3YzMTBfdWFydGNmZ3MsIEFSUkFZX1NJWkUoc21ka3YzMTBfdWFydGNmZ3MpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNtZGt2MzEwX21hY2hpbmVfaW5pdCh2b2lkKQotewotCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBpMmNfZGV2czEsIEFSUkFZX1NJWkUoaTJjX2RldnMxKSk7Ci0KLQlzbWRrdjMxMF9zbXNjOTExeF9pbml0KCk7Ci0KLQlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMwX3BkYXRhKTsKLQlzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMxX3BkYXRhKTsKLQlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMyX3BkYXRhKTsKLQlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfaHNtbWMzX3BkYXRhKTsKLQotCXNhbXN1bmdfa2V5cGFkX3NldF9wbGF0ZGF0YSgmc21ka3YzMTBfa2V5cGFkX2RhdGEpOwotCi0Jc2Ftc3VuZ19ibF9zZXQoJnNtZGt2MzEwX2JsX2dwaW9faW5mbywgJnNtZGt2MzEwX2JsX2RhdGEpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXMoc21ka3YzMTBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrdjMxMF9kZXZpY2VzKSk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoU01ES1YzMTAsICJTTURLVjMxMCIpCi0JLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLwotCS8qIE1haW50YWluZXI6IENoYW5naHdhbiBZb3VuIDxjaGFvcy55b3VuQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UF9QQV9TRFJBTSArIDB4MTAwLAotCS5pbml0X2lycQk9IGV4eW5vczRfaW5pdF9pcnEsCi0JLm1hcF9pbwkJPSBzbWRrdjMxMF9tYXBfaW8sCi0JLmluaXRfbWFjaGluZQk9IHNtZGt2MzEwX21hY2hpbmVfaW5pdCwKLQkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtdW5pdmVyc2FsX2MyMTAuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tYWNoLXVuaXZlcnNhbF9jMjEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjVkODkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L21hY2gtdW5pdmVyc2FsX2MyMTAuYworKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWFjaC11bml2ZXJzYWxfYzIxMC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZml4ZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWF4ODk1Mi5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvbWNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL2F0bWVsX214dF90cy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+Ci0jaW5jbHVkZSA8cGxhdC9leHlub3M0Lmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L21mYy5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L3BkLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0vKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVU5JVkVSU0FMX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAotCQkJCSBTM0MyNDEwX1VDT05fUlhJTEVWRUwgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9UWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWElSUU1PREUgfAlcCi0JCQkJIFMzQzI0MTBfVUNPTl9SWEZJRk9fVE9JIHwJXAotCQkJCSBTM0MyNDQzX1VDT05fUlhFUlJfSVJRRU4pCi0KLSNkZWZpbmUgVU5JVkVSU0FMX1VMQ09OX0RFRkFVTFQJUzNDMjQxMF9MQ09OX0NTOAotCi0jZGVmaW5lIFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxUCShTM0MyNDEwX1VGQ09OX0ZJRk9NT0RFIHwJXAotCQkJCSBTNVBWMjEwX1VGQ09OX1RYVFJJRzI1NiB8CVwKLQkJCQkgUzVQVjIxMF9VRkNPTl9SWFRSSUcyNTYpCi0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnIHVuaXZlcnNhbF91YXJ0Y2Znc1tdIF9faW5pdGRhdGEgPSB7Ci0JWzBdID0gewotCQkuaHdwb3J0CQk9IDAsCi0JCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzFdID0gewotCQkuaHdwb3J0CQk9IDEsCi0JCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzJdID0gewotCQkuaHdwb3J0CQk9IDIsCi0JCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAotCX0sCi0JWzNdID0gewotCQkuaHdwb3J0CQk9IDMsCi0JCS51Y29uCQk9IFVOSVZFUlNBTF9VQ09OX0RFRkFVTFQsCi0JCS51bGNvbgkJPSBVTklWRVJTQUxfVUxDT05fREVGQVVMVCwKLQkJLnVmY29uCQk9IFVOSVZFUlNBTF9VRkNPTl9ERUZBVUxULAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbWF4ODk1Ml9jb25zdW1lciA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkX2FybSIsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IG1heDg5NTJfcGxhdGZvcm1fZGF0YSB1bml2ZXJzYWxfbWF4ODk1Ml9wZGF0YSBfX2luaXRkYXRhID0gewotCS5ncGlvX3ZpZDAJPSBFWFlOT1M0X0dQWDAoMyksCi0JLmdwaW9fdmlkMQk9IEVYWU5PUzRfR1BYMCg0KSwKLQkuZ3Bpb19lbgk9IC0xLCAvKiBOb3QgY29udHJvbGxhYmxlLCBzZXQgIkFsd2F5cyBIaWdoIiAqLwotCS5kZWZhdWx0X21vZGUJPSAwLCAvKiB2aWQwID0gMCwgdmlkMSA9IDAgKi8KLQkuZHZzX21vZGUJPSB7IDQ4LCAzMiwgMjgsIDE4IH0sIC8qIDEuMjUsIDEuMjAsIDEuMDUsIDAuOTVWICovCi0JLnN5bmNfZnJlcQk9IDAsIC8qIGRlZmF1bHQ6IGZhc3Rlc3QgKi8KLQkucmFtcF9zcGVlZAk9IDAsIC8qIGRlZmF1bHQ6IGZhc3Rlc3QgKi8KLQotCS5yZWdfZGF0YQk9IHsKLQkJLmNvbnN0cmFpbnRzCT0gewotCQkJLm5hbWUJCT0gIlZBUk1fMS4yViIsCi0JCQkubWluX3VWCQk9IDc3MDAwMCwKLQkJCS5tYXhfdVYJCT0gMTQwMDAwMCwKLQkJCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSwKLQkJCS5hbHdheXNfb24JPSAxLAotCQkJLmJvb3Rfb24JPSAxLAotCQl9LAotCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKLQkJLmNvbnN1bWVyX3N1cHBsaWVzCT0gJm1heDg5NTJfY29uc3VtZXIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBscDM5NzRfYnVjazFfY29uc3VtZXIgPQotCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9pbnQiLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxwMzk3NF9idWNrMl9jb25zdW1lciA9Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkZzNkIiwgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazFfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSU5UXzEuMVYiLAotCQkubWluX3VWCQk9IDc1MDAwMCwKLQkJLm1heF91VgkJPSAxNTAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UgfAotCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5ib290X29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gMSwKLQkuY29uc3VtZXJfc3VwcGxpZXMgPSAmbHAzOTc0X2J1Y2sxX2NvbnN1bWVyLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9idWNrMl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZHM0RfMS4xViIsCi0JCS5taW5fdVYJCT0gNzUwMDAwLAotCQkubWF4X3VWCQk9IDE1MDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8Ci0JCQlSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLmJvb3Rfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxLAotCS5jb25zdW1lcl9zdXBwbGllcyA9ICZscDM5NzRfYnVjazJfY29uc3VtZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2J1Y2szX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVkNDXzEuOFYiLAotCQkubWluX3VWCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLmFsd2F5c19vbgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfYnVjazRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWTUVNXzEuMlYiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQUxJVkVfMS4yViIsCi0JCS5taW5fdVYJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJPSAxMjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkuYWx3YXlzX29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8zX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlVTQitNSVBJXzEuMVYiLAotCQkubWluX3VWCQk9IDExMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTEwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQURDXzMuM1YiLAotCQkubWluX3VWCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzMwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzVfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVEZfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvNl9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkxETzYiLAotCQkubWluX3VWCQk9IDIwMDAwMDAsCi0JCS5tYXhfdVYJCT0gMjAwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzdfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWTENEK1ZNSVBJXzEuOFYiLAotCQkubWluX3VWCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzhfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWVVNCK1ZEQUNfMy4zViIsCi0JCS5taW5fdVYJCT0gMzMwMDAwMCwKLQkJLm1heF91VgkJPSAzMzAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvOV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZDQ18yLjhWIiwKLQkJLm1pbl91VgkJPSAyODAwMDAwLAotCQkubWF4X3VWCQk9IDI4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEwX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiVlBMTF8xLjFWIiwKLQkJLm1pbl91VgkJPSAxMTAwMDAwLAotCQkubWF4X3VWCQk9IDExMDAwMDAsCi0JCS5ib290X29uCT0gMSwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzExX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0FNX0FGXzMuM1YiLAotCQkubWluX3VWCQk9IDMzMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzMwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzEyX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiUFNfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTNfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWSElDXzEuMlYiLAotCQkubWluX3VWCQk9IDEyMDAwMDAsCi0JCS5tYXhfdVYJCT0gMTIwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZGlzYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0X2xkbzE0X2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiQ0FNX0lfSE9TVF8xLjhWIiwKLQkJLm1pbl91VgkJPSAxODAwMDAwLAotCQkubWF4X3VWCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91Vgk9IDEsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9sZG8xNV9kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIkNBTV9TX0RJRytGTTMzX0NPUkVfMS4yViIsCi0JCS5taW5fdVYJCT0gMTIwMDAwMCwKLQkJLm1heF91VgkJPSAxMjAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTZfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJDQU1fU19BTkFfMi44ViIsCi0JCS5taW5fdVYJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJPSAxLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfbGRvMTdfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJWQ0NfMy4wVl9MQ0QiLAotCQkubWluX3VWCQk9IDMwMDAwMDAsCi0JCS5tYXhfdVYJCT0gMzAwMDAwMCwKLQkJLmFwcGx5X3VWCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5ib290X29uCT0gMSwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfMzJraHpfYXBfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICIzMktIeiBBUCIsCi0JCS5hbHdheXNfb24JPSAxLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmVuYWJsZWQJPSAxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbHAzOTc0XzMya2h6X2NwX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiMzJLSHogQ1AiLAotCQkuc3RhdGVfbWVtCT0gewotCQkJLmRpc2FibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF92aWNoZ19kYXRhID0gewotCS5jb25zdHJhaW50cwk9IHsKLQkJLm5hbWUJCT0gIlZJQ0hHIiwKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5kaXNhYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBscDM5NzRfZXNhZmVvdXQxX2RhdGEgPSB7Ci0JLmNvbnN0cmFpbnRzCT0gewotCQkubmFtZQkJPSAiU0FGRU9VVDEiLAotCQkudmFsaWRfb3BzX21hc2sJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQkJLnN0YXRlX21lbQk9IHsKLQkJCS5lbmFibGVkCT0gMSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxwMzk3NF9lc2FmZW91dDJfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJPSB7Ci0JCS5uYW1lCQk9ICJTQUZFT1VUMiIsCi0JCS5ib290X29uCT0gMSwKLQkJLnZhbGlkX29wc19tYXNrCT0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JCS5zdGF0ZV9tZW0JPSB7Ci0JCQkuZW5hYmxlZAk9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4ODk5OF9yZWd1bGF0b3JfZGF0YSBscDM5NzRfcmVndWxhdG9yc1tdID0gewotCXsgTUFYODk5OF9MRE8yLCAgJmxwMzk3NF9sZG8yX2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMywgICZscDM5NzRfbGRvM19kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzQsICAmbHAzOTc0X2xkbzRfZGF0YSB9LAotCXsgTUFYODk5OF9MRE81LCAgJmxwMzk3NF9sZG81X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPNiwgICZscDM5NzRfbGRvNl9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzcsICAmbHAzOTc0X2xkbzdfZGF0YSB9LAotCXsgTUFYODk5OF9MRE84LCAgJmxwMzk3NF9sZG84X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPOSwgICZscDM5NzRfbGRvOV9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzEwLCAmbHAzOTc0X2xkbzEwX2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMTEsICZscDM5NzRfbGRvMTFfZGF0YSB9LAotCXsgTUFYODk5OF9MRE8xMiwgJmxwMzk3NF9sZG8xMl9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzEzLCAmbHAzOTc0X2xkbzEzX2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMTQsICZscDM5NzRfbGRvMTRfZGF0YSB9LAotCXsgTUFYODk5OF9MRE8xNSwgJmxwMzk3NF9sZG8xNV9kYXRhIH0sCi0JeyBNQVg4OTk4X0xETzE2LCAmbHAzOTc0X2xkbzE2X2RhdGEgfSwKLQl7IE1BWDg5OThfTERPMTcsICZscDM5NzRfbGRvMTdfZGF0YSB9LAotCXsgTUFYODk5OF9CVUNLMSwgJmxwMzk3NF9idWNrMV9kYXRhIH0sCi0JeyBNQVg4OTk4X0JVQ0syLCAmbHAzOTc0X2J1Y2syX2RhdGEgfSwKLQl7IE1BWDg5OThfQlVDSzMsICZscDM5NzRfYnVjazNfZGF0YSB9LAotCXsgTUFYODk5OF9CVUNLNCwgJmxwMzk3NF9idWNrNF9kYXRhIH0sCi0JeyBNQVg4OTk4X0VOMzJLSFpfQVAsICZscDM5NzRfMzJraHpfYXBfZGF0YSB9LAotCXsgTUFYODk5OF9FTjMyS0haX0NQLCAmbHAzOTc0XzMya2h6X2NwX2RhdGEgfSwKLQl7IE1BWDg5OThfRU5WSUNIRywgJmxwMzk3NF92aWNoZ19kYXRhIH0sCi0JeyBNQVg4OTk4X0VTQUZFT1VUMSwgJmxwMzk3NF9lc2FmZW91dDFfZGF0YSB9LAotCXsgTUFYODk5OF9FU0FGRU9VVDIsICZscDM5NzRfZXNhZmVvdXQyX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4ODk5OF9wbGF0Zm9ybV9kYXRhIHVuaXZlcnNhbF9scDM5NzRfcGRhdGEgPSB7Ci0JLm51bV9yZWd1bGF0b3JzCQk9IEFSUkFZX1NJWkUobHAzOTc0X3JlZ3VsYXRvcnMpLAotCS5yZWd1bGF0b3JzCQk9IGxwMzk3NF9yZWd1bGF0b3JzLAotCS5idWNrMV92b2x0YWdlMQkJPSAxMTAwMDAwLAkvKiBJTlQgKi8KLQkuYnVjazFfdm9sdGFnZTIJCT0gMTAwMDAwMCwKLQkuYnVjazFfdm9sdGFnZTMJCT0gMTEwMDAwMCwKLQkuYnVjazFfdm9sdGFnZTQJCT0gMTAwMDAwMCwKLQkuYnVjazFfc2V0MQkJPSBFWFlOT1M0X0dQWDAoNSksCi0JLmJ1Y2sxX3NldDIJCT0gRVhZTk9TNF9HUFgwKDYpLAotCS5idWNrMl92b2x0YWdlMQkJPSAxMjAwMDAwLAkvKiBHM0QgKi8KLQkuYnVjazJfdm9sdGFnZTIJCT0gMTEwMDAwMCwKLQkuYnVjazFfZGVmYXVsdF9pZHgJPSAwLAotCS5idWNrMl9zZXQzCQk9IEVYWU5PUzRfR1BFMigwKSwKLQkuYnVjazJfZGVmYXVsdF9pZHgJPSAwLAotCS53YWtldXAJCQk9IHRydWUsCi19OwotCi0vKiBHUElPIEkyQyA1IChQTUlDKSAqLwotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmM1X2RldnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJSTJDX0JPQVJEX0lORk8oIm1heDg5NTIiLCAweEMwID4+IDEpLAotCQkucGxhdGZvcm1fZGF0YQk9ICZ1bml2ZXJzYWxfbWF4ODk1Ml9wZGF0YSwKLQl9LCB7Ci0JCUkyQ19CT0FSRF9JTkZPKCJscDM5NzQiLCAweENDID4+IDEpLAotCQkucGxhdGZvcm1fZGF0YQk9ICZ1bml2ZXJzYWxfbHAzOTc0X3BkYXRhLAotCX0sCi19OwotCi0vKiBJMkMzIChUU1ApICovCi1zdGF0aWMgc3RydWN0IG14dF9wbGF0Zm9ybV9kYXRhIHF0NjAyMjQwX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnhfbGluZQkJPSAxOSwKLQkueV9saW5lCQk9IDExLAotCS54X3NpemUJCT0gODAwLAotCS55X3NpemUJCT0gNDgwLAotCS5ibGVuCQk9IDB4MTEsCi0JLnRocmVzaG9sZAk9IDB4MjgsCi0JLnZvbHRhZ2UJPSAyODAwMDAwLAkJLyogMi44ViAqLwotCS5vcmllbnQJCT0gTVhUX0RJQUdPTkFMLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMzX2RldnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJSTJDX0JPQVJEX0lORk8oInF0NjAyMjQwX3RzIiwgMHg0YSksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnF0NjAyMjQwX3BsYXRmb3JtX2RhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB1bml2ZXJzYWxfdHNwX2luaXQodm9pZCkKLXsKLQlpbnQgZ3BpbzsKLQotCS8qIFRTUF9MRE9fT046IFhNRE1BRERSXzExICovCi0JZ3BpbyA9IEVYWU5PUzRfR1BFMigzKTsKLQlncGlvX3JlcXVlc3QoZ3BpbywgIlRTUF9MRE9fT04iKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMSk7Ci0JZ3Bpb19leHBvcnQoZ3BpbywgMCk7Ci0KLQkvKiBUU1BfSU5UOiBYTURNQUREUl83ICovCi0JZ3BpbyA9IEVYWU5PUzRfR1BFMSg3KTsKLQlncGlvX3JlcXVlc3QoZ3BpbywgIlRTUF9JTlQiKTsKLQotCXM1cF9yZWdpc3Rlcl9ncGlvX2ludGVycnVwdChncGlvKTsKLQlzM2NfZ3Bpb19jZmdwaW4oZ3BpbywgUzNDX0dQSU9fU0ZOKDB4ZikpOwotCXMzY19ncGlvX3NldHB1bGwoZ3BpbywgUzNDX0dQSU9fUFVMTF9VUCk7Ci0JaTJjM19kZXZzWzBdLmlycSA9IGdwaW9fdG9faXJxKGdwaW8pOwotfQotCi0KLS8qIEdQSU8gSTJDIDEyICgzIFRvdWNoa2V5KSAqLwotc3RhdGljIHVpbnQzMl90IHRvdWNoa2V5X2tleW1hcFtdID0gewotCS8qIE1DU19LRVlfTUFQKHZhbHVlLCBrZXljb2RlKSAqLwotCU1DU19LRVlfTUFQKDAsIEtFWV9NRU5VKSwJCS8qIEtFWV9TRU5EICovCi0JTUNTX0tFWV9NQVAoMSwgS0VZX0JBQ0spLAkJLyogS0VZX0VORCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtY3NfcGxhdGZvcm1fZGF0YSB0b3VjaGtleV9kYXRhID0gewotCS5rZXltYXAJCT0gdG91Y2hrZXlfa2V5bWFwLAotCS5rZXltYXBfc2l6ZQk9IEFSUkFZX1NJWkUodG91Y2hrZXlfa2V5bWFwKSwKLQkua2V5X21heHZhbAk9IDIsCi19OwotCi0vKiBHUElPIEkyQyAzX1RPVUNIIDIuOFYgKi8KLSNkZWZpbmUgSTJDX0dQSU9fQlVTXzEyCQkxMgotc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGkyY19ncGlvMTJfZGF0YSA9IHsKLQkuc2RhX3Bpbgk9IEVYWU5PUzRfR1BFNCgwKSwJLyogWE1ETURBVEFfOCAqLwotCS5zY2xfcGluCT0gRVhZTk9TNF9HUEU0KDEpLAkvKiBYTURNREFUQV85ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfZ3BpbzEyID0gewotCS5uYW1lCQk9ICJpMmMtZ3BpbyIsCi0JLmlkCQk9IEkyQ19HUElPX0JVU18xMiwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmaTJjX2dwaW8xMl9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyY19ncGlvMTJfZGV2c1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQlJMkNfQk9BUkRfSU5GTygibWNzNTA4MF90b3VjaGtleSIsIDB4MjApLAotCQkucGxhdGZvcm1fZGF0YSA9ICZ0b3VjaGtleV9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3RvdWNoa2V5X2luaXQodm9pZCkKLXsKLQlpbnQgZ3BpbzsKLQotCWdwaW8gPSBFWFlOT1M0X0dQRTMoNyk7CQkJLyogWE1ETURBVEFfNyAqLwotCWdwaW9fcmVxdWVzdChncGlvLCAiM19UT1VDSF9JTlQiKTsKLQlzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoZ3Bpbyk7Ci0JczNjX2dwaW9fY2ZncGluKGdwaW8sIFMzQ19HUElPX1NGTigweGYpKTsKLQlpMmNfZ3BpbzEyX2RldnNbMF0uaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7Ci0KLQlncGlvID0gRVhZTk9TNF9HUEUzKDMpOwkJCS8qIFhNRE1EQVRBXzMgKi8KLQlncGlvX3JlcXVlc3QoZ3BpbywgIjNfVE9VQ0hfRU4iKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgMSk7Ci19Ci0KLS8qIEdQSU8gS0VZUyAqLwotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzW10gPSB7Ci0JewotCQkuY29kZQkJCT0gS0VZX1ZPTFVNRVVQLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDApLAkvKiBYRUlOVDE2ICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FVVAiLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sIHsKLQkJLmNvZGUJCQk9IEtFWV9WT0xVTUVET1dOLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgyKDEpLAkvKiBYRUlOVDE3ICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfVk9MVU1FRE9XTiIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwgewotCQkuY29kZQkJCT0gS0VZX0NPTkZJRywKLQkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigyKSwJLyogWEVJTlQxOCAqLwotCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0NPTkZJRyIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwgewotCQkuY29kZQkJCT0gS0VZX0NBTUVSQSwKLQkJLmdwaW8JCQk9IEVYWU5PUzRfR1BYMigzKSwJLyogWEVJTlQxOSAqLwotCQkuZGVzYwkJCT0gImdwaW8ta2V5czogS0VZX0NBTUVSQSIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDEsCi0JfSwgewotCQkuY29kZQkJCT0gS0VZX09LLAotCQkuZ3BpbwkJCT0gRVhZTk9TNF9HUFgzKDUpLAkvKiBYRUlOVDI5ICovCi0JCS5kZXNjCQkJPSAiZ3Bpby1rZXlzOiBLRVlfT0siLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIHVuaXZlcnNhbF9ncGlvX2tleXNfZGF0YSA9IHsKLQkuYnV0dG9ucwk9IHVuaXZlcnNhbF9ncGlvX2tleXNfdGFibGVzLAotCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUodW5pdmVyc2FsX2dwaW9fa2V5c190YWJsZXMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdW5pdmVyc2FsX2dwaW9fa2V5cyA9IHsKLQkubmFtZQkJCT0gImdwaW8ta2V5cyIsCi0JLmRldgkJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZ1bml2ZXJzYWxfZ3Bpb19rZXlzX2RhdGEsCi0JfSwKLX07Ci0KLS8qIGVNTUMgKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHVuaXZlcnNhbF9oc21tYzBfZGF0YSBfX2luaXRkYXRhID0gewotCS5tYXhfd2lkdGgJCT0gOCwKLQkuaG9zdF9jYXBzCQk9IChNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQlNTUNfQ0FQX0RJU0FCTEUpLAotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9QRVJNQU5FTlQsCi0JLmNsa190eXBlCQk9IFMzQ19TREhDSV9DTEtfRElWX0VYVEVSTkFMLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IG1tYzBfc3VwcGxpZXNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInMzYy1zZGhjaS4wIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbW1jMF9maXhlZF92b2x0YWdlX2luaXRfZGF0YSA9IHsKLQkuY29uc3RyYWludHMJCT0gewotCQkubmFtZQkJPSAiVk1FTV9WRERfMi44ViIsCi0JCS52YWxpZF9vcHNfbWFzawk9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobW1jMF9zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbW1jMF9zdXBwbGllcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZml4ZWRfdm9sdGFnZV9jb25maWcgbW1jMF9maXhlZF92b2x0YWdlX2NvbmZpZyA9IHsKLQkuc3VwcGx5X25hbWUJCT0gIk1BU1NNRU1PUllfRU4iLAotCS5taWNyb3ZvbHRzCQk9IDI4MDAwMDAsCi0JLmdwaW8JCQk9IEVYWU5PUzRfR1BFMSgzKSwKLQkuZW5hYmxlX2hpZ2gJCT0gdHJ1ZSwKLQkuaW5pdF9kYXRhCQk9ICZtbWMwX2ZpeGVkX3ZvbHRhZ2VfaW5pdF9kYXRhLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW1jMF9maXhlZF92b2x0YWdlID0gewotCS5uYW1lCQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAotCS5pZAkJCT0gMCwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJm1tYzBfZml4ZWRfdm9sdGFnZV9jb25maWcsCi0JfSwKLX07Ci0KLS8qIFNEICovCi1zdGF0aWMgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSB1bml2ZXJzYWxfaHNtbWMyX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCQk9IDQsCi0JLmhvc3RfY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJCU1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwKLQkJCQlNTUNfQ0FQX0RJU0FCTEUsCi0JLmV4dF9jZF9ncGlvCQk9IEVYWU5PUzRfR1BYMyg0KSwgICAgICAvKiBYRUlOVF8yOCAqLwotCS5leHRfY2RfZ3Bpb19pbnZlcnQJPSAxLAotCS5jZF90eXBlCQk9IFMzQ19TREhDSV9DRF9HUElPLAotCS5jbGtfdHlwZQkJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTCwKLX07Ci0KLS8qIFdpRmkgKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHVuaXZlcnNhbF9oc21tYzNfZGF0YSBfX2luaXRkYXRhID0gewotCS5tYXhfd2lkdGgJCT0gNCwKLQkuaG9zdF9jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkJTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAotCQkJCU1NQ19DQVBfRElTQUJMRSwKLQkuY2RfdHlwZQkJPSBTM0NfU0RIQ0lfQ0RfRVhURVJOQUwsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3NkaGNpX2luaXQodm9pZCkKLXsKLQlzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSgmdW5pdmVyc2FsX2hzbW1jMF9kYXRhKTsKLQlzM2Nfc2RoY2kyX3NldF9wbGF0ZGF0YSgmdW5pdmVyc2FsX2hzbW1jMl9kYXRhKTsKLQlzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YSgmdW5pdmVyc2FsX2hzbW1jM19kYXRhKTsKLX0KLQotLyogSTJDMCAqLwotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMwX2RldnNbXSBfX2luaXRkYXRhID0gewotCS8qIENhbWVyYSwgVG8gYmUgdXBkYXRlZCAqLwotfTsKLQotLyogSTJDMSAqLwotc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmMxX2RldnNbXSBfX2luaXRkYXRhID0gewotCS8qIEd5cm8sIFRvIGJlIHVwZGF0ZWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1bml2ZXJzYWxfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JLyogU2Ftc3VuZyBQbGF0Zm9ybSBEZXZpY2VzICovCi0JJnM1cF9kZXZpY2VfZmltYzAsCi0JJnM1cF9kZXZpY2VfZmltYzEsCi0JJnM1cF9kZXZpY2VfZmltYzIsCi0JJnM1cF9kZXZpY2VfZmltYzMsCi0JJm1tYzBfZml4ZWRfdm9sdGFnZSwKLQkmczNjX2RldmljZV9oc21tYzAsCi0JJnMzY19kZXZpY2VfaHNtbWMyLAotCSZzM2NfZGV2aWNlX2hzbW1jMywKLQkmczNjX2RldmljZV9pMmMzLAotCSZzM2NfZGV2aWNlX2kyYzUsCi0KLQkvKiBVbml2ZXJzYWwgRGV2aWNlcyAqLwotCSZpMmNfZ3BpbzEyLAotCSZ1bml2ZXJzYWxfZ3Bpb19rZXlzLAotCSZzNXBfZGV2aWNlX29uZW5hbmQsCi0JJnM1cF9kZXZpY2VfbWZjLAotCSZzNXBfZGV2aWNlX21mY19sLAotCSZzNXBfZGV2aWNlX21mY19yLAotCSZleHlub3M0X2RldmljZV9wZFtQRF9NRkNdLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHVuaXZlcnNhbF9tYXBfaW8odm9pZCkKLXsKLQlzNXBfaW5pdF9pbyhOVUxMLCAwLCBTNVBfVkFfQ0hJUElEKTsKLQlzM2MyNHh4X2luaXRfY2xvY2tzKDI0MDAwMDAwKTsKLQlzM2MyNHh4X2luaXRfdWFydHModW5pdmVyc2FsX3VhcnRjZmdzLCBBUlJBWV9TSVpFKHVuaXZlcnNhbF91YXJ0Y2ZncykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX3Jlc2VydmUodm9pZCkKLXsKLQlzNXBfbWZjX3Jlc2VydmVfbWVtKDB4NDMwMDAwMDAsIDggPDwgMjAsIDB4NTEwMDAwMDAsIDggPDwgMjApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5pdmVyc2FsX21hY2hpbmVfaW5pdCh2b2lkKQotewotCXVuaXZlcnNhbF9zZGhjaV9pbml0KCk7Ci0KLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBpMmMwX2RldnMsIEFSUkFZX1NJWkUoaTJjMF9kZXZzKSk7Ci0JaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMSwgaTJjMV9kZXZzLCBBUlJBWV9TSVpFKGkyYzFfZGV2cykpOwotCi0JdW5pdmVyc2FsX3RzcF9pbml0KCk7Ci0JczNjX2kyYzNfc2V0X3BsYXRkYXRhKE5VTEwpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsIGkyYzNfZGV2cywgQVJSQVlfU0laRShpMmMzX2RldnMpKTsKLQotCXMzY19pMmM1X3NldF9wbGF0ZGF0YShOVUxMKTsKLQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyg1LCBpMmM1X2RldnMsIEFSUkFZX1NJWkUoaTJjNV9kZXZzKSk7Ci0KLQl1bml2ZXJzYWxfdG91Y2hrZXlfaW5pdCgpOwotCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKEkyQ19HUElPX0JVU18xMiwgaTJjX2dwaW8xMl9kZXZzLAotCQkJQVJSQVlfU0laRShpMmNfZ3BpbzEyX2RldnMpKTsKLQotCS8qIExhc3QgKi8KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh1bml2ZXJzYWxfZGV2aWNlcywgQVJSQVlfU0laRSh1bml2ZXJzYWxfZGV2aWNlcykpOwotCXM1cF9kZXZpY2VfbWZjLmRldi5wYXJlbnQgPSAmZXh5bm9zNF9kZXZpY2VfcGRbUERfTUZDXS5kZXY7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoVU5JVkVSU0FMX0MyMTAsICJVTklWRVJTQUxfQzIxMCIpCi0JLyogTWFpbnRhaW5lcjogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKLQkuaW5pdF9pcnEJPSBleHlub3M0X2luaXRfaXJxLAotCS5tYXBfaW8JCT0gdW5pdmVyc2FsX21hcF9pbywKLQkuaW5pdF9tYWNoaW5lCT0gdW5pdmVyc2FsX21hY2hpbmVfaW5pdCwKLQkudGltZXIJCT0gJmV4eW5vczRfdGltZXIsCi0JLnJlc2VydmUgICAgICAgID0gJnVuaXZlcnNhbF9yZXNlcnZlLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tY3QuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9tY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkODY4Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvbWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L21jdC5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgTUNUKE11bHRpLUNvcmUgVGltZXIpIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1tY3QuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19jbnRfcGVyX3RpY2s7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKLQotc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dDsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci19OwotCi1zdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSBtY3RfdGlja1syXTsKLQotc3RhdGljIHZvaWQgZXh5bm9zNF9tY3Rfd3JpdGUodW5zaWduZWQgaW50IHZhbHVlLCB2b2lkICphZGRyKQotewotCXZvaWQgX19pb21lbSAqc3RhdF9hZGRyOwotCXUzMiBtYXNrOwotCXUzMiBpOwotCi0JX19yYXdfd3JpdGVsKHZhbHVlLCBhZGRyKTsKLQotCXN3aXRjaCAoKHUzMikgYWRkcikgewotCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19UQ09OOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOwotCQltYXNrID0gMSA8PCAxNjsJCS8qIEdfVENPTiB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NPTVAwX0w6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7Ci0JCW1hc2sgPSAxIDw8IDA7CQkvKiBHX0NPTVAwX0wgd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikgRVhZTk9TNF9NQ1RfR19DT01QMF9VOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX1dTVEFUOwotCQltYXNrID0gMSA8PCAxOwkJLyogR19DT01QMF9VIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ09NUDBfQUREX0lOQ1I6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfV1NUQVQ7Ci0JCW1hc2sgPSAxIDw8IDI7CQkvKiBHX0NPTVAwX0FERF9JTkNSIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpIEVYWU5PUzRfTUNUX0dfQ05UX0w6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0dfQ05UX1dTVEFUOwotCQltYXNrID0gMSA8PCAwOwkJLyogR19DTlRfTCB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKSBFWFlOT1M0X01DVF9HX0NOVF9VOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9HX0NOVF9XU1RBVDsKLQkJbWFzayA9IDEgPDwgMTsJCS8qIEdfQ05UX1Ugd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikoRVhZTk9TNF9NQ1RfTDBfQkFTRSArIE1DVF9MX1RDT05fT0ZGU0VUKToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfTDBfQkFTRSArIE1DVF9MX1dTVEFUX09GRlNFVDsKLQkJbWFzayA9IDEgPDwgMzsJCS8qIEwwX1RDT04gd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikoRVhZTk9TNF9NQ1RfTDFfQkFTRSArIE1DVF9MX1RDT05fT0ZGU0VUKToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfTDFfQkFTRSArIE1DVF9MX1dTVEFUX09GRlNFVDsKLQkJbWFzayA9IDEgPDwgMzsJCS8qIEwxX1RDT04gd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikoRVhZTk9TNF9NQ1RfTDBfQkFTRSArIE1DVF9MX1RDTlRCX09GRlNFVCk6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0wwX0JBU0UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7Ci0JCW1hc2sgPSAxIDw8IDA7CQkvKiBMMF9UQ05UQiB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAodTMyKShFWFlOT1M0X01DVF9MMV9CQVNFICsgTUNUX0xfVENOVEJfT0ZGU0VUKToKLQkJc3RhdF9hZGRyID0gRVhZTk9TNF9NQ1RfTDFfQkFTRSArIE1DVF9MX1dTVEFUX09GRlNFVDsKLQkJbWFzayA9IDEgPDwgMDsJCS8qIEwxX1RDTlRCIHdyaXRlIHN0YXR1cyAqLwotCQlicmVhazsKLQljYXNlICh1MzIpKEVYWU5PUzRfTUNUX0wwX0JBU0UgKyBNQ1RfTF9JQ05UQl9PRkZTRVQpOgotCQlzdGF0X2FkZHIgPSBFWFlOT1M0X01DVF9MMF9CQVNFICsgTUNUX0xfV1NUQVRfT0ZGU0VUOwotCQltYXNrID0gMSA8PCAxOwkJLyogTDBfSUNOVEIgd3JpdGUgc3RhdHVzICovCi0JCWJyZWFrOwotCWNhc2UgKHUzMikoRVhZTk9TNF9NQ1RfTDFfQkFTRSArIE1DVF9MX0lDTlRCX09GRlNFVCk6Ci0JCXN0YXRfYWRkciA9IEVYWU5PUzRfTUNUX0wxX0JBU0UgKyBNQ1RfTF9XU1RBVF9PRkZTRVQ7Ci0JCW1hc2sgPSAxIDw8IDE7CQkvKiBMMV9JQ05UQiB3cml0ZSBzdGF0dXMgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdhaXQgbWF4aW11bSAxIG1zIHVudGlsIHdyaXR0ZW4gdmFsdWVzIGFyZSBhcHBsaWVkICovCi0JZm9yIChpID0gMDsgaSA8IGxvb3BzX3Blcl9qaWZmeSAvIDEwMDAgKiBIWjsgaSsrKQotCQlpZiAoX19yYXdfcmVhZGwoc3RhdF9hZGRyKSAmIG1hc2spIHsKLQkJCV9fcmF3X3dyaXRlbChtYXNrLCBzdGF0X2FkZHIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQlwYW5pYygiTUNUIGhhbmdzIGFmdGVyIHdyaXRpbmcgJWQgKGFkZHI6MHglMDh4KVxuIiwgdmFsdWUsICh1MzIpYWRkcik7Ci19Ci0KLS8qIENsb2Nrc291cmNlIGhhbmRsaW5nICovCi1zdGF0aWMgdm9pZCBleHlub3M0X21jdF9mcmNfc3RhcnQodTMyIGhpLCB1MzIgbG8pCi17Ci0JdTMyIHJlZzsKLQotCWV4eW5vczRfbWN0X3dyaXRlKGxvLCBFWFlOT1M0X01DVF9HX0NOVF9MKTsKLQlleHlub3M0X21jdF93cml0ZShoaSwgRVhZTk9TNF9NQ1RfR19DTlRfVSk7Ci0KLQlyZWcgPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX1RDT04pOwotCXJlZyB8PSBNQ1RfR19UQ09OX1NUQVJUOwotCWV4eW5vczRfbWN0X3dyaXRlKHJlZywgRVhZTk9TNF9NQ1RfR19UQ09OKTsKLX0KLQotc3RhdGljIGN5Y2xlX3QgZXh5bm9zNF9mcmNfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXVuc2lnbmVkIGludCBsbywgaGk7Ci0JdTMyIGhpMiA9IF9fcmF3X3JlYWRsKEVYWU5PUzRfTUNUX0dfQ05UX1UpOwotCi0JZG8gewotCQloaSA9IGhpMjsKLQkJbG8gPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX0NOVF9MKTsKLQkJaGkyID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19DTlRfVSk7Ci0JfSB3aGlsZSAoaGkgIT0gaGkyKTsKLQotCXJldHVybiAoKGN5Y2xlX3QpaGkgPDwgMzIpIHwgbG87Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfZnJjX3Jlc3VtZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCWV4eW5vczRfbWN0X2ZyY19zdGFydCgwLCAwKTsKLX0KLQotc3RydWN0IGNsb2Nrc291cmNlIG1jdF9mcmMgPSB7Ci0JLm5hbWUJCT0gIm1jdC1mcmMiLAotCS5yYXRpbmcJCT0gNDAwLAotCS5yZWFkCQk9IGV4eW5vczRfZnJjX3JlYWQsCi0JLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAotCS5yZXN1bWUJCT0gZXh5bm9zNF9mcmNfcmVzdW1lLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczRfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKQotewotCWV4eW5vczRfbWN0X2ZyY19zdGFydCgwLCAwKTsKLQotCWlmIChjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmbWN0X2ZyYywgY2xrX3JhdGUpKQotCQlwYW5pYygiJXM6IGNhbid0IHJlZ2lzdGVyIGNsb2Nrc291cmNlXG4iLCBtY3RfZnJjLm5hbWUpOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X21jdF9jb21wMF9zdG9wKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHRjb247Ci0KLQl0Y29uID0gX19yYXdfcmVhZGwoRVhZTk9TNF9NQ1RfR19UQ09OKTsKLQl0Y29uICY9IH4oTUNUX0dfVENPTl9DT01QMF9FTkFCTEUgfCBNQ1RfR19UQ09OX0NPTVAwX0FVVE9fSU5DKTsKLQotCWV4eW5vczRfbWN0X3dyaXRlKHRjb24sIEVYWU5PUzRfTUNUX0dfVENPTik7Ci0JZXh5bm9zNF9tY3Rfd3JpdGUoMCwgRVhZTk9TNF9NQ1RfR19JTlRfRU5CKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfY29tcDBfc3RhcnQoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgY3ljbGVzKQotewotCXVuc2lnbmVkIGludCB0Y29uOwotCWN5Y2xlX3QgY29tcF9jeWNsZTsKLQotCXRjb24gPSBfX3Jhd19yZWFkbChFWFlOT1M0X01DVF9HX1RDT04pOwotCi0JaWYgKG1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpIHsKLQkJdGNvbiB8PSBNQ1RfR19UQ09OX0NPTVAwX0FVVE9fSU5DOwotCQlleHlub3M0X21jdF93cml0ZShjeWNsZXMsIEVYWU5PUzRfTUNUX0dfQ09NUDBfQUREX0lOQ1IpOwotCX0KLQotCWNvbXBfY3ljbGUgPSBleHlub3M0X2ZyY19yZWFkKCZtY3RfZnJjKSArIGN5Y2xlczsKLQlleHlub3M0X21jdF93cml0ZSgodTMyKWNvbXBfY3ljbGUsIEVYWU5PUzRfTUNUX0dfQ09NUDBfTCk7Ci0JZXh5bm9zNF9tY3Rfd3JpdGUoKHUzMikoY29tcF9jeWNsZSA+PiAzMiksIEVYWU5PUzRfTUNUX0dfQ09NUDBfVSk7Ci0KLQlleHlub3M0X21jdF93cml0ZSgweDEsIEVYWU5PUzRfTUNUX0dfSU5UX0VOQik7Ci0KLQl0Y29uIHw9IE1DVF9HX1RDT05fQ09NUDBfRU5BQkxFOwotCWV4eW5vczRfbWN0X3dyaXRlKHRjb24gLCBFWFlOT1M0X01DVF9HX1RDT04pOwotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfY29tcF9zZXRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKLQkJCQkgICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQotewotCWV4eW5vczRfbWN0X2NvbXAwX3N0YXJ0KGV2dC0+bW9kZSwgY3ljbGVzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3M0X2NvbXBfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JZXh5bm9zNF9tY3RfY29tcDBfc3RvcCgpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKLQkJZXh5bm9zNF9tY3RfY29tcDBfc3RhcnQobW9kZSwgY2xrX2NudF9wZXJfdGljayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgbWN0X2NvbXBfZGV2aWNlID0gewotCS5uYW1lCQk9ICJtY3QtY29tcCIsCi0JLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAotCS5yYXRpbmcJCT0gMjUwLAotCS5zZXRfbmV4dF9ldmVudAk9IGV4eW5vczRfY29tcF9zZXRfbmV4dF9ldmVudCwKLQkuc2V0X21vZGUJPSBleHlub3M0X2NvbXBfc2V0X21vZGUsCi19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZXh5bm9zNF9tY3RfY29tcF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKLQotCWV4eW5vczRfbWN0X3dyaXRlKDB4MSwgRVhZTk9TNF9NQ1RfR19JTlRfQ1NUQVQpOwotCi0JZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1jdF9jb21wX2V2ZW50X2lycSA9IHsKLQkubmFtZQkJPSAibWN0X2NvbXBfaXJxIiwKLQkuZmxhZ3MJCT0gSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKLQkuaGFuZGxlcgk9IGV4eW5vczRfbWN0X2NvbXBfaXNyLAotCS5kZXZfaWQJCT0gJm1jdF9jb21wX2RldmljZSwKLX07Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfY2xvY2tldmVudF9pbml0KHZvaWQpCi17Ci0JY2xrX2NudF9wZXJfdGljayA9IGNsa19yYXRlIC8gMgkvIEhaOwotCi0JY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KCZtY3RfY29tcF9kZXZpY2UsIGNsa19yYXRlIC8gMiwgNSk7Ci0JbWN0X2NvbXBfZGV2aWNlLm1heF9kZWx0YV9ucyA9Ci0JCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmZmZmZmZmZiwgJm1jdF9jb21wX2RldmljZSk7Ci0JbWN0X2NvbXBfZGV2aWNlLm1pbl9kZWx0YV9ucyA9Ci0JCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmLCAmbWN0X2NvbXBfZGV2aWNlKTsKLQltY3RfY29tcF9kZXZpY2UuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7Ci0JY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZtY3RfY29tcF9kZXZpY2UpOwotCi0Jc2V0dXBfaXJxKElSUV9NQ1RfRzAsICZtY3RfY29tcF9ldmVudF9pcnEpOwotfQotCi0jaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwotLyogQ2xvY2sgZXZlbnQgaGFuZGxpbmcgKi8KLXN0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3RpY2tfc3RvcChzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQl1bnNpZ25lZCBsb25nIG1hc2sgPSBNQ1RfTF9UQ09OX0lOVF9TVEFSVCB8IE1DVF9MX1RDT05fVElNRVJfU1RBUlQ7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gbWV2dC0+YmFzZSArIE1DVF9MX1RDT05fT0ZGU0VUOwotCi0JdG1wID0gX19yYXdfcmVhZGwoYWRkcik7Ci0JaWYgKHRtcCAmIG1hc2spIHsKLQkJdG1wICY9IH5tYXNrOwotCQlleHlub3M0X21jdF93cml0ZSh0bXAsIGFkZHIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfdGlja19zdGFydCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKLQkJCQkgICBzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWV4eW5vczRfbWN0X3RpY2tfc3RvcChtZXZ0KTsKLQotCXRtcCA9ICgxIDw8IDMxKSB8IGN5Y2xlczsJLyogTUNUX0xfVVBEQVRFX0lDTlRCICovCi0KLQkvKiB1cGRhdGUgaW50ZXJydXB0IGNvdW50IGJ1ZmZlciAqLwotCWV4eW5vczRfbWN0X3dyaXRlKHRtcCwgbWV2dC0+YmFzZSArIE1DVF9MX0lDTlRCX09GRlNFVCk7Ci0KLQkvKiBlbmFibGUgTUNUIHRpY2sgaW50ZXJydXB0ICovCi0JZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBtZXZ0LT5iYXNlICsgTUNUX0xfSU5UX0VOQl9PRkZTRVQpOwotCi0JdG1wID0gX19yYXdfcmVhZGwobWV2dC0+YmFzZSArIE1DVF9MX1RDT05fT0ZGU0VUKTsKLQl0bXAgfD0gTUNUX0xfVENPTl9JTlRfU1RBUlQgfCBNQ1RfTF9UQ09OX1RJTUVSX1NUQVJUIHwKLQkgICAgICAgTUNUX0xfVENPTl9JTlRFUlZBTF9NT0RFOwotCWV4eW5vczRfbWN0X3dyaXRlKHRtcCwgbWV2dC0+YmFzZSArIE1DVF9MX1RDT05fT0ZGU0VUKTsKLX0KLQotc3RhdGljIGludCBleHlub3M0X3RpY2tfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCi0JCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCA9ICZtY3RfdGlja1tzbXBfcHJvY2Vzc29yX2lkKCldOwotCi0JZXh5bm9zNF9tY3RfdGlja19zdGFydChjeWNsZXMsIG1ldnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBleHlub3M0X3RpY2tfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0Jc3RydWN0IG1jdF9jbG9ja19ldmVudF9kZXZpY2UgKm1ldnQgPSAmbWN0X3RpY2tbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQotCWV4eW5vczRfbWN0X3RpY2tfc3RvcChtZXZ0KTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCWV4eW5vczRfbWN0X3RpY2tfc3RhcnQoY2xrX2NudF9wZXJfdGljaywgbWV2dCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGlycXJldHVybl90IGV4eW5vczRfbWN0X3RpY2tfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbWN0X2Nsb2NrX2V2ZW50X2RldmljZSAqbWV2dCA9IGRldl9pZDsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBtZXZ0LT5ldnQ7Ci0KLQkvKgotCSAqIFRoaXMgaXMgZm9yIHN1cHBvcnRpbmcgb25lc2hvdCBtb2RlLgotCSAqIE1jdCB3b3VsZCBnZW5lcmF0ZSBpbnRlcnJ1cHQgcGVyaW9kaWNhbGx5Ci0JICogd2l0aG91dCBleHBsaWNpdCBzdG9wcGluZy4KLQkgKi8KLQlpZiAoZXZ0LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKQotCQlleHlub3M0X21jdF90aWNrX3N0b3AobWV2dCk7Ci0KLQkvKiBDbGVhciB0aGUgTUNUIHRpY2sgaW50ZXJydXB0ICovCi0JZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBtZXZ0LT5iYXNlICsgTUNUX0xfSU5UX0NTVEFUX09GRlNFVCk7Ci0KLQlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWN0X3RpY2swX2V2ZW50X2lycSA9IHsKLQkubmFtZQkJPSAibWN0X3RpY2swX2lycSIsCi0JLmZsYWdzCQk9IElSUUZfVElNRVIgfCBJUlFGX05PQkFMQU5DSU5HLAotCS5oYW5kbGVyCT0gZXh5bm9zNF9tY3RfdGlja19pc3IsCi19OwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtY3RfdGljazFfZXZlbnRfaXJxID0gewotCS5uYW1lCQk9ICJtY3RfdGljazFfaXJxIiwKLQkuZmxhZ3MJCT0gSVJRRl9USU1FUiB8IElSUUZfTk9CQUxBTkNJTkcsCi0JLmhhbmRsZXIJPSBleHlub3M0X21jdF90aWNrX2lzciwKLX07Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfbWN0X3RpY2tfaW5pdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCW1jdF90aWNrW2NwdV0uZXZ0ID0gZXZ0OwotCi0JaWYgKGNwdSA9PSAwKSB7Ci0JCW1jdF90aWNrW2NwdV0uYmFzZSA9IEVYWU5PUzRfTUNUX0wwX0JBU0U7Ci0JCWV2dC0+bmFtZSA9ICJtY3RfdGljazAiOwotCX0gZWxzZSB7Ci0JCW1jdF90aWNrW2NwdV0uYmFzZSA9IEVYWU5PUzRfTUNUX0wxX0JBU0U7Ci0JCWV2dC0+bmFtZSA9ICJtY3RfdGljazEiOwotCX0KLQotCWV2dC0+Y3B1bWFzayA9IGNwdW1hc2tfb2YoY3B1KTsKLQlldnQtPnNldF9uZXh0X2V2ZW50ID0gZXh5bm9zNF90aWNrX3NldF9uZXh0X2V2ZW50OwotCWV2dC0+c2V0X21vZGUgPSBleHlub3M0X3RpY2tfc2V0X21vZGU7Ci0JZXZ0LT5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKLQlldnQtPnJhdGluZyA9IDQ1MDsKLQotCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdChldnQsIGNsa19yYXRlIC8gMiwgNSk7Ci0JZXZ0LT5tYXhfZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4N2ZmZmZmZmYsIGV2dCk7Ci0JZXZ0LT5taW5fZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZiwgZXZ0KTsKLQotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShldnQpOwotCi0JZXh5bm9zNF9tY3Rfd3JpdGUoMHgxLCBtY3RfdGlja1tjcHVdLmJhc2UgKyBNQ1RfTF9UQ05UQl9PRkZTRVQpOwotCi0JaWYgKGNwdSA9PSAwKSB7Ci0JCW1jdF90aWNrMF9ldmVudF9pcnEuZGV2X2lkID0gJm1jdF90aWNrW2NwdV07Ci0JCXNldHVwX2lycShJUlFfTUNUX0wwLCAmbWN0X3RpY2swX2V2ZW50X2lycSk7Ci0JfSBlbHNlIHsKLQkJbWN0X3RpY2sxX2V2ZW50X2lycS5kZXZfaWQgPSAmbWN0X3RpY2tbY3B1XTsKLQkJc2V0dXBfaXJxKElSUV9NQ1RfTDEsICZtY3RfdGljazFfZXZlbnRfaXJxKTsKLQkJaXJxX3NldF9hZmZpbml0eShJUlFfTUNUX0wxLCBjcHVtYXNrX29mKDEpKTsKLQl9Ci19Ci0KLS8qIFNldHVwIHRoZSBsb2NhbCBjbG9jayBldmVudHMgZm9yIGEgQ1BVICovCi1pbnQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlleHlub3M0X21jdF90aWNrX2luaXQoZXZ0KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbG9jYWxfdGltZXJfYWNrKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTE9DQUxfVElNRVJTICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M0X3RpbWVyX3Jlc291cmNlcyh2b2lkKQotewotCXN0cnVjdCBjbGsgKm1jdF9jbGs7Ci0JbWN0X2NsayA9IGNsa19nZXQoTlVMTCwgInh0YWwiKTsKLQotCWNsa19yYXRlID0gY2xrX2dldF9yYXRlKG1jdF9jbGspOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNF90aW1lcl9pbml0KHZvaWQpCi17Ci0JZXh5bm9zNF90aW1lcl9yZXNvdXJjZXMoKTsKLQlleHlub3M0X2Nsb2Nrc291cmNlX2luaXQoKTsKLQlleHlub3M0X2Nsb2NrZXZlbnRfaW5pdCgpOwotfQotCi1zdHJ1Y3Qgc3lzX3RpbWVyIGV4eW5vczRfdGltZXIgPSB7Ci0JLmluaXQJCT0gZXh5bm9zNF90aW1lcl9pbml0LAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vczQvcGxhdHNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkwODk2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbGF0c21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BsYXRzbXAuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIENsb25lZCBmcm9tIGxpbnV4L2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvcGxhdHNtcC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgotICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KLSNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgotI2luY2x1ZGUgPGFzbS91bmlmaWVkLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLXBtdS5oPgotCi1leHRlcm4gdm9pZCBleHlub3M0X3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOwotCi0jZGVmaW5lIENQVTFfQk9PVF9SRUcgUzVQX1ZBX1NZU1JBTQotCi0vKgotICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5Ci0gKiBib290ICJob2xkaW5nIHBlbiIKLSAqLwotCi12b2xhdGlsZSBpbnQgX19jcHVpbml0ZGF0YSBwZW5fcmVsZWFzZSA9IC0xOwotCi0vKgotICogV3JpdGUgcGVuX3JlbGVhc2UgaW4gYSB3YXkgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIHZpc2libGUgdG8gYWxsCi0gKiBvYnNlcnZlcnMsIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIHRoZXkncmUgdGFraW5nIHBhcnQgaW4gY29oZXJlbmN5Ci0gKiBvciBub3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGhvdHBsdWcgY29kZSB0byB3b3JrIHJlbGlhYmx5LgotICovCi1zdGF0aWMgdm9pZCB3cml0ZV9wZW5fcmVsZWFzZShpbnQgdmFsKQotewotCXBlbl9yZWxlYXNlID0gdmFsOwotCXNtcF93bWIoKTsKLQlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKikmcGVuX3JlbGVhc2UsIHNpemVvZihwZW5fcmVsZWFzZSkpOwotCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIodm9pZCkKLXsKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKShTNVBfVkFfU0NVKTsKLX0KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOwotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgZXh5bm9zNF9naWNfc2Vjb25kYXJ5X2luaXQodm9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmRpc3RfYmFzZSA9IFM1UF9WQV9HSUNfRElTVCArCi0JCQkJIChFWFlOT1M0X0dJQ19CQU5LX09GRlNFVCAqIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0Jdm9pZCBfX2lvbWVtICpjcHVfYmFzZSA9IFM1UF9WQV9HSUNfQ1BVICsKLQkJCQkoRVhZTk9TNF9HSUNfQkFOS19PRkZTRVQgKiBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCWludCBpOwotCi0JLyoKLQkgKiBEZWFsIHdpdGggdGhlIGJhbmtlZCBQUEkgYW5kIFNHSSBpbnRlcnJ1cHRzIC0gZGlzYWJsZSBhbGwKLQkgKiBQUEkgaW50ZXJydXB0cywgZW5zdXJlIGFsbCBTR0kgaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KLQkgKi8KLQlfX3Jhd193cml0ZWwoMHhmZmZmMDAwMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfRU5BQkxFX0NMRUFSKTsKLQlfX3Jhd193cml0ZWwoMHgwMDAwZmZmZiwgZGlzdF9iYXNlICsgR0lDX0RJU1RfRU5BQkxFX1NFVCk7Ci0KLQkvKgotCSAqIFNldCBwcmlvcml0eSBvbiBQUEkgYW5kIFNHSSBpbnRlcnJ1cHRzCi0JICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDQpCi0JCV9fcmF3X3dyaXRlbCgweGEwYTBhMGEwLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCAvIDQpOwotCi0JX19yYXdfd3JpdGVsKDB4ZjAsIGNwdV9iYXNlICsgR0lDX0NQVV9QUklNQVNLKTsKLQlfX3Jhd193cml0ZWwoMSwgY3B1X2Jhc2UgKyBHSUNfQ1BVX0NUUkwpOwotfQotCi12b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQotewotCS8qCi0JICogaWYgYW55IGludGVycnVwdHMgYXJlIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhlIHByaW1hcnkKLQkgKiBjb3JlIChlLmcuIHRpbWVyIGlycSksIHRoZW4gdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gZW5hYmxlZAotCSAqIGZvciB1czogZG8gc28KLQkgKi8KLQlleHlub3M0X2dpY19zZWNvbmRhcnlfaW5pdCgpOwotCi0JLyoKLQkgKiBsZXQgdGhlIHByaW1hcnkgcHJvY2Vzc29yIGtub3cgd2UncmUgb3V0IG9mIHRoZQotCSAqIHBlbiwgdGhlbiBoZWFkIG9mZiBpbnRvIHRoZSBDIGVudHJ5IHBvaW50Ci0JICovCi0Jd3JpdGVfcGVuX3JlbGVhc2UoLTEpOwotCi0JLyoKLQkgKiBTeW5jaHJvbmlzZSB3aXRoIHRoZSBib290IHRocmVhZC4KLQkgKi8KLQlzcGluX2xvY2soJmJvb3RfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7Ci0KLQlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOwotfQotCi1pbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQkvKgotCSAqIFNldCBzeW5jaHJvbmlzYXRpb24gc3RhdGUgYmV0d2VlbiB0aGlzIGJvb3QgcHJvY2Vzc29yCi0JICogYW5kIHRoZSBzZWNvbmRhcnkgb25lCi0JICovCi0Jc3Bpbl9sb2NrKCZib290X2xvY2spOwotCi0JLyoKLQkgKiBUaGUgc2Vjb25kYXJ5IHByb2Nlc3NvciBpcyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkIGZyb20KLQkgKiB0aGUgaG9sZGluZyBwZW4gLSByZWxlYXNlIGl0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZsYWcKLQkgKiB0aGF0IGl0IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHJlc2V0dGluZyBwZW5fcmVsZWFzZS4KLQkgKgotCSAqIE5vdGUgdGhhdCAicGVuX3JlbGVhc2UiIGlzIHRoZSBoYXJkd2FyZSBDUFUgSUQsIHdoZXJlYXMKLQkgKiAiY3B1IiBpcyBMaW51eCdzIGludGVybmFsIElELgotCSAqLwotCXdyaXRlX3Blbl9yZWxlYXNlKGNwdSk7Ci0KLQlpZiAoIShfX3Jhd19yZWFkbChTNVBfQVJNX0NPUkUxX1NUQVRVUykgJiBTNVBfQ09SRV9MT0NBTF9QV1JfRU4pKSB7Ci0JCV9fcmF3X3dyaXRlbChTNVBfQ09SRV9MT0NBTF9QV1JfRU4sCi0JCQkgICAgIFM1UF9BUk1fQ09SRTFfQ09ORklHVVJBVElPTik7Ci0KLQkJdGltZW91dCA9IDEwOwotCi0JCS8qIHdhaXQgbWF4IDEwIG1zIHVudGlsIGNwdTEgaXMgb24gKi8KLQkJd2hpbGUgKChfX3Jhd19yZWFkbChTNVBfQVJNX0NPUkUxX1NUQVRVUykKLQkJCSYgUzVQX0NPUkVfTE9DQUxfUFdSX0VOKSAhPSBTNVBfQ09SRV9MT0NBTF9QV1JfRU4pIHsKLQkJCWlmICh0aW1lb3V0LS0gPT0gMCkKLQkJCQlicmVhazsKLQotCQkJbWRlbGF5KDEpOwotCQl9Ci0KLQkJaWYgKHRpbWVvdXQgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjcHUxIHBvd2VyIGVuYWJsZSBmYWlsZWQiKTsKLQkJCXNwaW5fdW5sb2NrKCZib290X2xvY2spOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBTZW5kIHRoZSBzZWNvbmRhcnkgQ1BVIGEgc29mdCBpbnRlcnJ1cHQsIHRoZXJlYnkgY2F1c2luZwotCSAqIHRoZSBib290IG1vbml0b3IgdG8gcmVhZCB0aGUgc3lzdGVtIHdpZGUgZmxhZ3MgcmVnaXN0ZXIsCi0JICogYW5kIGJyYW5jaCB0byB0aGUgYWRkcmVzcyBmb3VuZCB0aGVyZS4KLQkgKi8KLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgKDEgKiBIWik7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXNtcF9ybWIoKTsKLQotCQlfX3Jhd193cml0ZWwoQlNZTSh2aXJ0X3RvX3BoeXMoZXh5bm9zNF9zZWNvbmRhcnlfc3RhcnR1cCkpLAotCQkJQ1BVMV9CT09UX1JFRyk7Ci0JCWdpY19yYWlzZV9zb2Z0aXJxKGNwdW1hc2tfb2YoY3B1KSwgMSk7Ci0KLQkJaWYgKHBlbl9yZWxlYXNlID09IC0xKQotCQkJYnJlYWs7Ci0KLQkJdWRlbGF5KDEwKTsKLQl9Ci0KLQkvKgotCSAqIG5vdyB0aGUgc2Vjb25kYXJ5IGNvcmUgaXMgc3RhcnRpbmcgdXAgbGV0IGl0IHJ1biBpdHMKLQkgKiBjYWxpYnJhdGlvbnMsIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoCi0JICovCi0Jc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7Ci0KLQlyZXR1cm4gcGVuX3JlbGVhc2UgIT0gLTEgPyAtRU5PU1lTIDogMDsKLX0KLQotLyoKLSAqIEluaXRpYWxpc2UgdGhlIENQVSBwb3NzaWJsZSBtYXAgZWFybHkgLSB0aGlzIGRlc2NyaWJlcyB0aGUgQ1BVcwotICogd2hpY2ggbWF5IGJlIHByZXNlbnQgb3IgYmVjb21lIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4KLSAqLwotCi12b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKLQl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzOwotCi0JbmNvcmVzID0gc2N1X2Jhc2UgPyBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2UpIDogMTsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChuY29yZXMgPiBucl9jcHVfaWRzKSB7Ci0JCXByX3dhcm4oIlNNUDogJXUgY29yZXMgZ3JlYXRlciB0aGFuIG1heGltdW0gKCV1KSwgY2xpcHBpbmdcbiIsCi0JCQluY29yZXMsIG5yX2NwdV9pZHMpOwotCQluY29yZXMgPSBucl9jcHVfaWRzOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuY29yZXM7IGkrKykKLQkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKLQotCXNldF9zbXBfY3Jvc3NfY2FsbChnaWNfcmFpc2Vfc29mdGlycSk7Ci19Ci0KLXZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQotewotCi0Jc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwotCi0JLyoKLQkgKiBXcml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCBpbnRvIHRoZQotCSAqIHN5c3RlbS13aWRlIGZsYWdzIHJlZ2lzdGVyLiBUaGUgYm9vdCBtb25pdG9yIHdhaXRzCi0JICogdW50aWwgaXQgcmVjZWl2ZXMgYSBzb2Z0IGludGVycnVwdCwgYW5kIHRoZW4gdGhlCi0JICogc2Vjb25kYXJ5IENQVSBicmFuY2hlcyB0byB0aGlzIGFkZHJlc3MuCi0JICovCi0JX19yYXdfd3JpdGVsKEJTWU0odmlydF90b19waHlzKGV4eW5vczRfc2Vjb25kYXJ5X3N0YXJ0dXApKSwgUzVQX1ZBX1NZU1JBTSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG0uYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZjYTk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQyMTAgLSBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQKLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0uYwotICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPHBsYXQvcG0uaD4KLSNpbmNsdWRlIDxwbGF0L3BsbC5oPgotI2luY2x1ZGUgPHBsYXQvcmVncy1zcm9tLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtcG11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9wbS1jb3JlLmg+Ci0jaW5jbHVkZSA8bWFjaC9wbXUuaD4KLQotc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfc2V0X2Nsa3NyY1tdID0gewotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19UT1AJCQksIC52YWwgPSAweDAwMDAwMDAxLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19DQU0JCQksIC52YWwgPSAweDExMTExMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19UVgkJCSwgLnZhbCA9IDB4MDAwMDAxMTEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0xDRDAJCQksIC52YWwgPSAweDAwMDAxMTExLCB9LAotCXsgLnJlZyA9IFM1UF9DTEtTUkNfTUFTS19MQ0QxCQkJLCAudmFsID0gMHgwMDAwMTExMSwgfSwKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfTUFVRElPCQkJLCAudmFsID0gMHgwMDAwMDAwMSwgfSwKLQl7IC5yZWcgPSBTNVBfQ0xLU1JDX01BU0tfRlNZUwkJCSwgLnZhbCA9IDB4MDEwMTExMTEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX1BFUklMMAkJCSwgLnZhbCA9IDB4MDExMTExMTEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX1BFUklMMQkJCSwgLnZhbCA9IDB4MDExMTAxMTEsIH0sCi0JeyAucmVnID0gUzVQX0NMS1NSQ19NQVNLX0RNQwkJCSwgLnZhbCA9IDB4MDAwMTAwMDAsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9lcGxsX3NhdmVbXSA9IHsKLQlTQVZFX0lURU0oUzVQX0VQTExfQ09OMCksCi0JU0FWRV9JVEVNKFM1UF9FUExMX0NPTjEpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIGV4eW5vczRfdnBsbF9zYXZlW10gPSB7Ci0JU0FWRV9JVEVNKFM1UF9WUExMX0NPTjApLAotCVNBVkVfSVRFTShTNVBfVlBMTF9DT04xKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2xlZXBfc2F2ZSBleHlub3M0X2NvcmVfc2F2ZVtdID0gewotCS8qIENNVSBzaWRlICovCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfTEVGVEJVUyksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0xFRlRCVVMpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX1JJR0hUQlVTKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfUklHSFRCVVMpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1RPUDApLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1RPUDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0NBTSksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfVFYpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01GQyksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfRzNEKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19JTUFHRSksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTENEMCksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTENEMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFVRElPKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19GU1lTKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19QRVJJTDApLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX1BFUklMMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfQ0FNKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9UViksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfTUZDKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9HM0QpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0lNQUdFKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9MQ0QwKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9MQ0QxKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9NQVVESU8pLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMwKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9GU1lTMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfRlNZUzIpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0ZTWVMzKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDApLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUwyKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9QRVJJTDMpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX1BFUklMNCksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfUEVSSUw1KSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9UT1ApLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfVE9QKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0NBTSksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19UViksCi0JU0FWRV9JVEVNKFM1UF9DTEtTUkNfTUFTS19MQ0QwKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0xDRDEpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfTUFVRElPKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX0ZTWVMpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfUEVSSUwwKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19NQVNLX1BFUklMMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVYyX1JBVElPKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfU0NMS0NBTSksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0NBTSksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX1RWKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfTUZDKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfRzNEKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfSU1BR0UpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9MQ0QwKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfTENEMSksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX0ZTWVMpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9HUFMpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9QRVJJTCksCi0JU0FWRV9JVEVNKFM1UF9DTEtHQVRFX0lQX1BFUklSKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfQkxPQ0spLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX01BU0tfRE1DKSwKLQlTQVZFX0lURU0oUzVQX0NMS1NSQ19ETUMpLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0RNQzApLAotCVNBVkVfSVRFTShTNVBfQ0xLRElWX0RNQzEpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9JUF9ETUMpLAotCVNBVkVfSVRFTShTNVBfQ0xLU1JDX0NQVSksCi0JU0FWRV9JVEVNKFM1UF9DTEtESVZfQ1BVKSwKLQlTQVZFX0lURU0oUzVQX0NMS0RJVl9DUFUgKyAweDQpLAotCVNBVkVfSVRFTShTNVBfQ0xLR0FURV9TQ0xLQ1BVKSwKLQlTQVZFX0lURU0oUzVQX0NMS0dBVEVfSVBfQ1BVKSwKLQotCS8qIEdJQyBzaWRlICovCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAwOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfQ1BVICsgMHgwMEMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0NQVSArIDB4MDE0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19DUFUgKyAweDAxOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MDAwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgwMDQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDEwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MTA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgxMDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDMwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4MzA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHgzMDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDA0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MDgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQwQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDEwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MTQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQxOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDFDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MjApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQyNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDI4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MkMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDM0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0MzgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQzQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDQwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NDQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ0OCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDRDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NTApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDQ1NCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4NDU4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg0NUMpLAotCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODAwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MDQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgwOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODBDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MTApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgxNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODE4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MUMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODI0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MjgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgyQyksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODMwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4MzQpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDgzOCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODNDKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg0NCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODQ4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NEMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1MCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4ODU0KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHg4NTgpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweDg1QyksCi0KLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMDApLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMwNCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzA4KSwKLQlTQVZFX0lURU0oUzVQX1ZBX0dJQ19ESVNUICsgMHhDMEMpLAotCVNBVkVfSVRFTShTNVBfVkFfR0lDX0RJU1QgKyAweEMxMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9HSUNfRElTVCArIDB4QzE0KSwKLQotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDAwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDAxMCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwMjApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDMwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA0MCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwNTApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDYwKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAweDA3MCksCi0JU0FWRV9JVEVNKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgMHgwODApLAotCVNBVkVfSVRFTShTNVBfVkFfQ09NQklORVJfQkFTRSArIDB4MDkwKSwKLQotCS8qIFNST00gc2lkZSAqLwotCVNBVkVfSVRFTShTNVBfU1JPTV9CVyksCi0JU0FWRV9JVEVNKFM1UF9TUk9NX0JDMCksCi0JU0FWRV9JVEVNKFM1UF9TUk9NX0JDMSksCi0JU0FWRV9JVEVNKFM1UF9TUk9NX0JDMiksCi0JU0FWRV9JVEVNKFM1UF9TUk9NX0JDMyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgZXh5bm9zNF9sMmNjX3NhdmVbXSA9IHsKLQlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX1RBR19MQVRFTkNZX0NUUkwpLAotCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfREFUQV9MQVRFTkNZX0NUUkwpLAotCVNBVkVfSVRFTShTNVBfVkFfTDJDQyArIEwyWDBfUFJFRkVUQ0hfQ1RSTCksCi0JU0FWRV9JVEVNKFM1UF9WQV9MMkNDICsgTDJYMF9QT1dFUl9DVFJMKSwKLQlTQVZFX0lURU0oUzVQX1ZBX0wyQ0MgKyBMMlgwX0FVWF9DVFJMKSwKLX07Ci0KLS8qIEZvciBDb3J0ZXgtQTkgRGlhZ25vc3RpYyBhbmQgUG93ZXIgY29udHJvbCByZWdpc3RlciAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzYXZlX2FybV9yZWdpc3RlclsyXTsKLQotc3RhdGljIGludCBleHlub3M0X2NwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCW91dGVyX2ZsdXNoX2FsbCgpOwotCi0JLyogaXNzdWUgdGhlIHN0YW5kYnkgc2lnbmFsIGludG8gdGhlIHBtIHVuaXQuICovCi0JY3B1X2RvX2lkbGUoKTsKLQotCS8qIHdlIHNob3VsZCBuZXZlciBnZXQgcGFzdCBoZXJlICovCi0JcGFuaWMoInNsZWVwIHJlc3VtZWQgdG8gb3JpZ2luYXRvcj8iKTsKLX0KLQotc3RhdGljIHZvaWQgZXh5bm9zNF9wbV9wcmVwYXJlKHZvaWQpCi17Ci0JdTMyIHRtcDsKLQotCXMzY19wbV9kb19zYXZlKGV4eW5vczRfY29yZV9zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfY29yZV9zYXZlKSk7Ci0JczNjX3BtX2RvX3NhdmUoZXh5bm9zNF9sMmNjX3NhdmUsIEFSUkFZX1NJWkUoZXh5bm9zNF9sMmNjX3NhdmUpKTsKLQlzM2NfcG1fZG9fc2F2ZShleHlub3M0X2VwbGxfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2VwbGxfc2F2ZSkpOwotCXMzY19wbV9kb19zYXZlKGV4eW5vczRfdnBsbF9zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfdnBsbF9zYXZlKSk7Ci0KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfSU5GT1JNMSk7Ci0KLQkvKiBTZXQgdmFsdWUgb2YgcG93ZXIgZG93biByZWdpc3RlciBmb3Igc2xlZXAgbW9kZSAqLwotCi0JZXh5bm9zNF9zeXNfcG93ZXJkb3duX2NvbmYoU1lTX1NMRUVQKTsKLQlfX3Jhd193cml0ZWwoUzVQX0NIRUNLX1NMRUVQLCBTNVBfSU5GT1JNMSk7Ci0KLQkvKiBlbnN1cmUgYXQgbGVhc3QgSU5GT1JNMCBoYXMgdGhlIHJlc3VtZSBhZGRyZXNzICovCi0KLQlfX3Jhd193cml0ZWwodmlydF90b19waHlzKHMzY19jcHVfcmVzdW1lKSwgUzVQX0lORk9STTApOwotCi0JLyogQmVmb3JlIGVudGVyIGNlbnRyYWwgc2VxdWVuY2UgbW9kZSwgY2xvY2sgc3JjIHJlZ2lzdGVyIGhhdmUgdG8gc2V0ICovCi0KLQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfc2V0X2Nsa3NyYywgQVJSQVlfU0laRShleHlub3M0X3NldF9jbGtzcmMpKTsKLQotfQotCi1zdGF0aWMgaW50IGV4eW5vczRfcG1fYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCi17Ci0JcG1fY3B1X3ByZXAgPSBleHlub3M0X3BtX3ByZXBhcmU7Ci0JcG1fY3B1X3NsZWVwID0gZXh5bm9zNF9jcHVfc3VzcGVuZDsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNvcHkgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvc21wX3NjdS5jICovCi0KLXZvaWQgZXh5bm9zNF9zY3VfZW5hYmxlKHZvaWQgX19pb21lbSAqc2N1X2Jhc2UpCi17Ci0JdTMyIHNjdV9jdHJsOwotCi0Jc2N1X2N0cmwgPSBfX3Jhd19yZWFkbChzY3VfYmFzZSk7Ci0JLyogYWxyZWFkeSBlbmFibGVkPyAqLwotCWlmIChzY3VfY3RybCAmIDEpCi0JCXJldHVybjsKLQotCXNjdV9jdHJsIHw9IDE7Ci0JX19yYXdfd3JpdGVsKHNjdV9jdHJsLCBzY3VfYmFzZSk7Ci0KLQkvKgotCSAqIEVuc3VyZSB0aGF0IHRoZSBkYXRhIGFjY2Vzc2VkIGJ5IENQVTAgYmVmb3JlIHRoZSBTQ1Ugd2FzCi0JICogaW5pdGlhbGlzZWQgaXMgdmlzaWJsZSB0byB0aGUgb3RoZXIgQ1BVcy4KLQkgKi8KLQlmbHVzaF9jYWNoZV9hbGwoKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsX2Jhc2VfcmF0ZTsKLQotc3RhdGljIHZvaWQgZXh5bm9zNF9yZXN0b3JlX3BsbCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcGxsX2NvbiwgbG9ja3RpbWUsIGxvY2tjbnQ7Ci0JdW5zaWduZWQgbG9uZyBwbGxfaW5fcmF0ZTsKLQl1bnNpZ25lZCBpbnQgcF9kaXYsIGVwbGxfd2FpdCA9IDAsIHZwbGxfd2FpdCA9IDA7Ci0KLQlpZiAocGxsX2Jhc2VfcmF0ZSA9PSAwKQotCQlyZXR1cm47Ci0KLQlwbGxfaW5fcmF0ZSA9IHBsbF9iYXNlX3JhdGU7Ci0KLQkvKiBFUExMICovCi0JcGxsX2NvbiA9IGV4eW5vczRfZXBsbF9zYXZlWzBdLnZhbDsKLQotCWlmIChwbGxfY29uICYgKDEgPDwgMzEpKSB7Ci0JCXBsbF9jb24gJj0gKFBMTDQ2WFhfUERJVl9NQVNLIDw8IFBMTDQ2WFhfUERJVl9TSElGVCk7Ci0JCXBfZGl2ID0gKHBsbF9jb24gPj4gUExMNDZYWF9QRElWX1NISUZUKTsKLQotCQlwbGxfaW5fcmF0ZSAvPSAxMDAwMDAwOwotCi0JCWxvY2t0aW1lID0gKDMwMDAgLyBwbGxfaW5fcmF0ZSkgKiBwX2RpdjsKLQkJbG9ja2NudCA9IGxvY2t0aW1lICogMTAwMDAgLyAoMTAwMDAgLyBwbGxfaW5fcmF0ZSk7Ci0KLQkJX19yYXdfd3JpdGVsKGxvY2tjbnQsIFM1UF9FUExMX0xPQ0spOwotCi0JCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoZXh5bm9zNF9lcGxsX3NhdmUsCi0JCQkJCUFSUkFZX1NJWkUoZXh5bm9zNF9lcGxsX3NhdmUpKTsKLQkJZXBsbF93YWl0ID0gMTsKLQl9Ci0KLQlwbGxfaW5fcmF0ZSA9IHBsbF9iYXNlX3JhdGU7Ci0KLQkvKiBWUExMICovCi0JcGxsX2NvbiA9IGV4eW5vczRfdnBsbF9zYXZlWzBdLnZhbDsKLQotCWlmIChwbGxfY29uICYgKDEgPDwgMzEpKSB7Ci0JCXBsbF9pbl9yYXRlIC89IDEwMDAwMDA7Ci0JCS8qIDc1MHVzICovCi0JCWxvY2t0aW1lID0gNzUwOwotCQlsb2NrY250ID0gbG9ja3RpbWUgKiAxMDAwMCAvICgxMDAwMCAvIHBsbF9pbl9yYXRlKTsKLQotCQlfX3Jhd193cml0ZWwobG9ja2NudCwgUzVQX1ZQTExfTE9DSyk7Ci0KLQkJczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X3ZwbGxfc2F2ZSwKLQkJCQkJQVJSQVlfU0laRShleHlub3M0X3ZwbGxfc2F2ZSkpOwotCQl2cGxsX3dhaXQgPSAxOwotCX0KLQotCS8qIFdhaXQgUExMIGxvY2tpbmcgKi8KLQotCWRvIHsKLQkJaWYgKGVwbGxfd2FpdCkgewotCQkJcGxsX2NvbiA9IF9fcmF3X3JlYWRsKFM1UF9FUExMX0NPTjApOwotCQkJaWYgKHBsbF9jb24gJiAoMSA8PCBTNVBfRVBMTENPTjBfTE9DS0VEX1NISUZUKSkKLQkJCQllcGxsX3dhaXQgPSAwOwotCQl9Ci0KLQkJaWYgKHZwbGxfd2FpdCkgewotCQkJcGxsX2NvbiA9IF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTjApOwotCQkJaWYgKHBsbF9jb24gJiAoMSA8PCBTNVBfVlBMTENPTjBfTE9DS0VEX1NISUZUKSkKLQkJCQl2cGxsX3dhaXQgPSAwOwotCQl9Ci0JfSB3aGlsZSAoZXBsbF93YWl0IHx8IHZwbGxfd2FpdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBleHlub3M0X3BtX2RyaXZlciA9IHsKLQkuYWRkCQk9IGV4eW5vczRfcG1fYWRkLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgZXh5bm9zNF9wbV9kcnZpbml0KHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqcGxsX2Jhc2U7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCXMzY19wbV9pbml0KCk7Ci0KLQkvKiBBbGwgd2FrZXVwIGRpc2FibGUgKi8KLQotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9XQUtFVVBfTUFTSyk7Ci0JdG1wIHw9ICgoMHhGRiA8PCA4KSB8ICgweDFGIDw8IDEpKTsKLQlfX3Jhd193cml0ZWwodG1wLCBTNVBfV0FLRVVQX01BU0spOwotCi0JcGxsX2Jhc2UgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7Ci0KLQlpZiAoIUlTX0VSUihwbGxfYmFzZSkpIHsKLQkJcGxsX2Jhc2VfcmF0ZSA9IGNsa19nZXRfcmF0ZShwbGxfYmFzZSk7Ci0JCWNsa19wdXQocGxsX2Jhc2UpOwotCX0KLQotCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZleHlub3M0X3N5c2NsYXNzLCAmZXh5bm9zNF9wbV9kcml2ZXIpOwotfQotYXJjaF9pbml0Y2FsbChleHlub3M0X3BtX2RydmluaXQpOwotCi1zdGF0aWMgaW50IGV4eW5vczRfcG1fc3VzcGVuZCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JLyogU2V0dGluZyBDZW50cmFsIFNlcXVlbmNlIFJlZ2lzdGVyIGZvciBwb3dlciBkb3duIG1vZGUgKi8KLQotCXRtcCA9IF9fcmF3X3JlYWRsKFM1UF9DRU5UUkFMX1NFUV9DT05GSUdVUkFUSU9OKTsKLQl0bXAgJj0gflM1UF9DRU5UUkFMX0xPV1BXUl9DRkc7Ci0JX19yYXdfd3JpdGVsKHRtcCwgUzVQX0NFTlRSQUxfU0VRX0NPTkZJR1VSQVRJT04pOwotCi0JLyogU2F2ZSBQb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JYXNtICgibXJjIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDAiCi0JICAgICA6ICI9ciIgKHRtcCkgOiA6ICJjYyIpOwotCXNhdmVfYXJtX3JlZ2lzdGVyWzBdID0gdG1wOwotCi0JLyogU2F2ZSBEaWFnbm9zdGljIHJlZ2lzdGVyICovCi0JYXNtICgibXJjIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDEiCi0JICAgICA6ICI9ciIgKHRtcCkgOiA6ICJjYyIpOwotCXNhdmVfYXJtX3JlZ2lzdGVyWzFdID0gdG1wOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4eW5vczRfcG1fcmVzdW1lKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQkvKgotCSAqIElmIFBNVSBmYWlsZWQgd2hpbGUgZW50ZXJpbmcgc2xlZXAgbW9kZSwgV0ZJIHdpbGwgYmUKLQkgKiBpZ25vcmVkIGJ5IFBNVSBhbmQgdGhlbiBleGl0aW5nIGNwdV9kb19pZGxlKCkuCi0JICogUzVQX0NFTlRSQUxfTE9XUFdSX0NGRyBiaXQgd2lsbCBub3QgYmUgc2V0IGF1dG9tYXRpY2FsbHkKLQkgKiBpbiB0aGlzIHNpdHVhdGlvbi4KLQkgKi8KLQl0bXAgPSBfX3Jhd19yZWFkbChTNVBfQ0VOVFJBTF9TRVFfQ09ORklHVVJBVElPTik7Ci0JaWYgKCEodG1wICYgUzVQX0NFTlRSQUxfTE9XUFdSX0NGRykpIHsKLQkJdG1wIHw9IFM1UF9DRU5UUkFMX0xPV1BXUl9DRkc7Ci0JCV9fcmF3X3dyaXRlbCh0bXAsIFM1UF9DRU5UUkFMX1NFUV9DT05GSUdVUkFUSU9OKTsKLQkJLyogTm8gbmVlZCB0byBwZXJmb3JtIGJlbG93IHJlc3RvcmUgY29kZSAqLwotCQlnb3RvIGVhcmx5X3dha2V1cDsKLQl9Ci0JLyogUmVzdG9yZSBQb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JdG1wID0gc2F2ZV9hcm1fcmVnaXN0ZXJbMF07Ci0JYXNtIHZvbGF0aWxlICgibWNyIHAxNSwgMCwgJTAsIGMxNSwgYzAsIDAiCi0JCSAgICAgIDogOiAiciIgKHRtcCkKLQkJICAgICAgOiAiY2MiKTsKLQotCS8qIFJlc3RvcmUgRGlhZ25vc3RpYyByZWdpc3RlciAqLwotCXRtcCA9IHNhdmVfYXJtX3JlZ2lzdGVyWzFdOwotCWFzbSB2b2xhdGlsZSAoIm1jciBwMTUsIDAsICUwLCBjMTUsIGMwLCAxIgotCQkgICAgICA6IDogInIiICh0bXApCi0JCSAgICAgIDogImNjIik7Ci0KLQkvKiBGb3IgcmVsZWFzZSByZXRlbnRpb24gKi8KLQotCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01BVURJT19PUFRJT04pOwotCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX0dQSU9fT1BUSU9OKTsKLQlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9VQVJUX09QVElPTik7Ci0JX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfTU1DQV9PUFRJT04pOwotCV9fcmF3X3dyaXRlbCgoMSA8PCAyOCksIFM1UF9QQURfUkVUX01NQ0JfT1BUSU9OKTsKLQlfX3Jhd193cml0ZWwoKDEgPDwgMjgpLCBTNVBfUEFEX1JFVF9FQklBX09QVElPTik7Ci0JX19yYXdfd3JpdGVsKCgxIDw8IDI4KSwgUzVQX1BBRF9SRVRfRUJJQl9PUFRJT04pOwotCi0JczNjX3BtX2RvX3Jlc3RvcmVfY29yZShleHlub3M0X2NvcmVfc2F2ZSwgQVJSQVlfU0laRShleHlub3M0X2NvcmVfc2F2ZSkpOwotCi0JZXh5bm9zNF9yZXN0b3JlX3BsbCgpOwotCi0JZXh5bm9zNF9zY3VfZW5hYmxlKFM1UF9WQV9TQ1UpOwotCi0jaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKLQlzM2NfcG1fZG9fcmVzdG9yZV9jb3JlKGV4eW5vczRfbDJjY19zYXZlLCBBUlJBWV9TSVpFKGV4eW5vczRfbDJjY19zYXZlKSk7Ci0Jb3V0ZXJfaW52X2FsbCgpOwotCS8qIGVuYWJsZSBMMlgwKi8KLQl3cml0ZWxfcmVsYXhlZCgxLCBTNVBfVkFfTDJDQyArIEwyWDBfQ1RSTCk7Ci0jZW5kaWYKLQotZWFybHlfd2FrZXVwOgotCXJldHVybjsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBleHlub3M0X3BtX3N5c2NvcmVfb3BzID0gewotCS5zdXNwZW5kCT0gZXh5bm9zNF9wbV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gZXh5bm9zNF9wbV9yZXN1bWUsCi19OwotCi1zdGF0aWMgX19pbml0IGludCBleHlub3M0X3BtX3N5c2NvcmVfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZleHlub3M0X3BtX3N5c2NvcmVfb3BzKTsKLQlyZXR1cm4gMDsKLX0KLWFyY2hfaW5pdGNhbGwoZXh5bm9zNF9wbV9zeXNjb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtdS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3BtdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE5ZWIyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9wbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvcG11LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIEVYWU5PUzQyMTAgLSBDUFUgUE1VKFBvd2VyIE1hbmFnZW1lbnQgVW5pdCkgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3BtdS5oPgotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpzeXNfcG93ZXJkb3duX3JlZ1tdID0gewotCVM1UF9BUk1fQ09SRTBfTE9XUFdSLAotCVM1UF9ESVNfSVJRX0NPUkUwLAotCVM1UF9ESVNfSVJRX0NFTlRSQUwwLAotCVM1UF9BUk1fQ09SRTFfTE9XUFdSLAotCVM1UF9ESVNfSVJRX0NPUkUxLAotCVM1UF9ESVNfSVJRX0NFTlRSQUwxLAotCVM1UF9BUk1fQ09NTU9OX0xPV1BXUiwKLQlTNVBfTDJfMF9MT1dQV1IsCi0JUzVQX0wyXzFfTE9XUFdSLAotCVM1UF9DTVVfQUNMS1NUT1BfTE9XUFdSLAotCVM1UF9DTVVfU0NMS1NUT1BfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfTE9XUFdSLAotCVM1UF9BUExMX1NZU0NMS19MT1dQV1IsCi0JUzVQX01QTExfU1lTQ0xLX0xPV1BXUiwKLQlTNVBfVlBMTF9TWVNDTEtfTE9XUFdSLAotCVM1UF9FUExMX1NZU0NMS19MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX0dQU19BTElWRV9MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9HUFNBTElWRV9MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX0NBTV9MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX1RWX0xPV1BXUiwKLQlTNVBfQ01VX0NMS1NUT1BfTUZDX0xPV1BXUiwKLQlTNVBfQ01VX0NMS1NUT1BfRzNEX0xPV1BXUiwKLQlTNVBfQ01VX0NMS1NUT1BfTENEMF9MT1dQV1IsCi0JUzVQX0NNVV9DTEtTVE9QX0xDRDFfTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9NQVVESU9fTE9XUFdSLAotCVM1UF9DTVVfQ0xLU1RPUF9HUFNfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfQ0FNX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX1RWX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX01GQ19MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9HM0RfTE9XUFdSLAotCVM1UF9DTVVfUkVTRVRfTENEMF9MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9MQ0QxX0xPV1BXUiwKLQlTNVBfQ01VX1JFU0VUX01BVURJT19MT1dQV1IsCi0JUzVQX0NNVV9SRVNFVF9HUFNfTE9XUFdSLAotCVM1UF9UT1BfQlVTX0xPV1BXUiwKLQlTNVBfVE9QX1JFVEVOVElPTl9MT1dQV1IsCi0JUzVQX1RPUF9QV1JfTE9XUFdSLAotCVM1UF9MT0dJQ19SRVNFVF9MT1dQV1IsCi0JUzVQX09ORU5BTkRfTUVNX0xPV1BXUiwKLQlTNVBfTU9ESU1JRl9NRU1fTE9XUFdSLAotCVM1UF9HMkRfQUNQX01FTV9MT1dQV1IsCi0JUzVQX1VTQk9UR19NRU1fTE9XUFdSLAotCVM1UF9IU01NQ19NRU1fTE9XUFdSLAotCVM1UF9DU1NZU19NRU1fTE9XUFdSLAotCVM1UF9TRUNTU19NRU1fTE9XUFdSLAotCVM1UF9QQ0lFX01FTV9MT1dQV1IsCi0JUzVQX1NBVEFfTUVNX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9EUkFNX0xPV1BXUiwKLQlTNVBfUEFEX1JFVEVOVElPTl9NQVVESU9fTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX0dQSU9fTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX1VBUlRfTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX01NQ0FfTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX01NQ0JfTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX0VCSUFfTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX0VCSUJfTE9XUFdSLAotCVM1UF9QQURfUkVURU5USU9OX0lTT0xBVElPTl9MT1dQV1IsCi0JUzVQX1BBRF9SRVRFTlRJT05fQUxWX1NFTF9MT1dQV1IsCi0JUzVQX1hVU0JYVElfTE9XUFdSLAotCVM1UF9YWFRJX0xPV1BXUiwKLQlTNVBfRVhUX1JFR1VMQVRPUl9MT1dQV1IsCi0JUzVQX0dQSU9fTU9ERV9MT1dQV1IsCi0JUzVQX0dQSU9fTU9ERV9NQVVESU9fTE9XUFdSLAotCVM1UF9DQU1fTE9XUFdSLAotCVM1UF9UVl9MT1dQV1IsCi0JUzVQX01GQ19MT1dQV1IsCi0JUzVQX0czRF9MT1dQV1IsCi0JUzVQX0xDRDBfTE9XUFdSLAotCVM1UF9MQ0QxX0xPV1BXUiwKLQlTNVBfTUFVRElPX0xPV1BXUiwKLQlTNVBfR1BTX0xPV1BXUiwKLQlTNVBfR1BTX0FMSVZFX0xPV1BXUiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3lzX3Bvd2VyZG93bl92YWxbXVtOVU1fU1lTX1BPV0VSRE9XTl0gPSB7Ci0JLyogeyBBRlRSLCBMUEEsIFNMRUVQIH0qLwotCXsgMCwgMCwgMiB9LAkvKiBBUk1fQ09SRTAgKi8KLQl7IDAsIDAsIDAgfSwJLyogQVJNX0RJU19JUlFfQ09SRTAgKi8KLQl7IDAsIDAsIDAgfSwJLyogQVJNX0RJU19JUlFfQ0VOVFJBTDAgKi8KLQl7IDAsIDAsIDIgfSwJLyogQVJNX0NPUkUxICovCi0JeyAwLCAwLCAwIH0sCS8qIEFSTV9ESVNfSVJRX0NPUkUxICovCi0JeyAwLCAwLCAwIH0sCS8qIEFSTV9ESVNfSVJRX0NFTlRSQUwxICovCi0JeyAwLCAwLCAyIH0sCS8qIEFSTV9DT01NT04gKi8KLQl7IDIsIDIsIDMgfSwJLyogQVJNX0NQVV9MMl8wICovCi0JeyAyLCAyLCAzIH0sCS8qIEFSTV9DUFVfTDJfMSAqLwotCXsgMSwgMCwgMCB9LAkvKiBDTVVfQUNMS1NUT1AgKi8KLQl7IDEsIDAsIDAgfSwJLyogQ01VX1NDTEtTVE9QICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVCAqLwotCXsgMSwgMCwgMCB9LAkvKiBBUExMX1NZU0NMSyAqLwotCXsgMSwgMCwgMCB9LAkvKiBNUExMX1NZU0NMSyAqLwotCXsgMSwgMCwgMCB9LAkvKiBWUExMX1NZU0NMSyAqLwotCXsgMSwgMSwgMCB9LAkvKiBFUExMX1NZU0NMSyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9HUFNfQUxJVkUgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX0dQU19BTElWRSAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9DQU0gKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfVFYgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfTUZDICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX0czRCAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfQ0xLU1RPUF9MQ0QwICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX0xDRDEgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX0NMS1NUT1BfTUFVRElPICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9DTEtTVE9QX0dQUyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVRfQ0FNICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9UViAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVRfTUZDICovCi0JeyAxLCAxLCAwIH0sCS8qIENNVV9SRVNFVF9HM0QgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX0xDRDAgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX0xDRDEgKi8KLQl7IDEsIDEsIDAgfSwJLyogQ01VX1JFU0VUX01BVURJTyAqLwotCXsgMSwgMSwgMCB9LAkvKiBDTVVfUkVTRVRfR1BTICovCi0JeyAzLCAwLCAwIH0sCS8qIFRPUF9CVVMgKi8KLQl7IDEsIDAsIDEgfSwJLyogVE9QX1JFVEVOVElPTiAqLwotCXsgMywgMCwgMyB9LAkvKiBUT1BfUFdSICovCi0JeyAxLCAxLCAwIH0sCS8qIExPR0lDX1JFU0VUICovCi0JeyAzLCAwLCAwIH0sCS8qIE9ORU5BTkRfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIE1PRElNSUZfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIEcyRF9BQ1BfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIFVTQk9UR19NRU0gKi8KLQl7IDMsIDAsIDAgfSwJLyogSFNNTUNfTUVNICovCi0JeyAzLCAwLCAwIH0sCS8qIENTU1lTX01FTSAqLwotCXsgMywgMCwgMCB9LAkvKiBTRUNTU19NRU0gKi8KLQl7IDMsIDAsIDAgfSwJLyogUENJRV9NRU0gKi8KLQl7IDMsIDAsIDAgfSwJLyogU0FUQV9NRU0gKi8KLQl7IDEsIDAsIDAgfSwJLyogUEFEX1JFVEVOVElPTl9EUkFNICovCi0JeyAxLCAxLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fTUFVRElPICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fR1BJTyAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX1VBUlQgKi8KLQl7IDEsIDAsIDAgfSwJLyogUEFEX1JFVEVOVElPTl9NTUNBICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fTU1DQiAqLwotCXsgMSwgMCwgMCB9LAkvKiBQQURfUkVURU5USU9OX0VCSUEgKi8KLQl7IDEsIDAsIDAgfSwJLyogUEFEX1JFVEVOVElPTl9FQklCICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fSVNPTEFUSU9OICovCi0JeyAxLCAwLCAwIH0sCS8qIFBBRF9SRVRFTlRJT05fQUxWX1NFTCAqLwotCXsgMSwgMSwgMCB9LAkvKiBYVVNCWFRJICovCi0JeyAxLCAxLCAwIH0sCS8qIFhYVEkgKi8KLQl7IDEsIDEsIDAgfSwJLyogRVhUX1JFR1VMQVRPUiAqLwotCXsgMSwgMCwgMCB9LAkvKiBHUElPX01PREUgKi8KLQl7IDEsIDEsIDAgfSwJLyogR1BJT19NT0RFX01BVURJTyAqLwotCXsgNywgMCwgMCB9LAkvKiBDQU0gKi8KLQl7IDcsIDAsIDAgfSwJLyogVFYgKi8KLQl7IDcsIDAsIDAgfSwJLyogTUZDICovCi0JeyA3LCAwLCAwIH0sCS8qIEczRCAqLwotCXsgNywgMCwgMCB9LAkvKiBMQ0QwICovCi0JeyA3LCAwLCAwIH0sCS8qIExDRDEgKi8KLQl7IDcsIDcsIDAgfSwJLyogTUFVRElPICovCi0JeyA3LCAwLCAwIH0sCS8qIEdQUyAqLwotCXsgNywgMCwgMCB9LAkvKiBHUFNfQUxJVkUgKi8KLX07Ci0KLXZvaWQgZXh5bm9zNF9zeXNfcG93ZXJkb3duX2NvbmYoZW51bSBzeXNfcG93ZXJkb3duIG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gQVJSQVlfU0laRShzeXNfcG93ZXJkb3duX3JlZyk7Ci0KLQlmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQotCQlfX3Jhd193cml0ZWwoc3lzX3Bvd2VyZG93bl92YWxbY291bnQgLSAxXVttb2RlXSwKLQkJCQlzeXNfcG93ZXJkb3duX3JlZ1tjb3VudCAtIDFdKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODNmOGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NldHVwLXNkaGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2V0dXAtc2RoY2kuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEVYWU5PUzQgLSBIZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aWduIHVwIFNESENJIGRldmljZShzKSAoSFNNTUMpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2RoY2kuaD4KLQotLyogY2xvY2sgc291cmNlcyBmb3IgdGhlIG1tYyBidXMgY2xvY2ssIG9yZGVyIGFzIGZvciB0aGUgY3RybDJbNS4uNF0gKi8KLQotY2hhciAqZXh5bm9zNF9oc21tY19jbGtzcmNzWzRdID0gewotCVswXSA9IE5VTEwsCi0JWzFdID0gTlVMTCwKLQlbMl0gPSAic2Nsa19tbWMiLAkvKiBtbWNfYnVzICovCi0JWzNdID0gTlVMTCwKLX07Ci0KLXZvaWQgZXh5bm9zNF9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqciwKLQkJCQkgIHN0cnVjdCBtbWNfaW9zICppb3MsIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKLXsKLQl1MzIgY3RybDIsIGN0cmwzOwotCi0JLyogZG9uJ3QgbmVlZCB0byBhbHRlciBhbnl0aGluZyBhY2NvcmRpbmcgdG8gY2FyZC10eXBlICovCi0KLQljdHJsMiA9IHJlYWRsKHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCi0JLyogc2VsZWN0IGJhc2UgY2xvY2sgc291cmNlIHRvIEhDTEsgKi8KLQotCWN0cmwyICY9IFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0s7Ci0KLQkvKgotCSAqIGNsZWFyIGFzeW5jIG1vZGUsIGVuYWJsZSBjb25mbGljdCBtYXNrLCByeCBmZWVkYmFjayBjdHJsLCBTRAotCSAqIGNsayBob2xkIGFuZCBubyB1c2UgZGVib3VuY2UgY291bnQKLQkgKi8KLQotCWN0cmwyIHw9IChTM0M2NFhYX1NESENJX0NUUkwyX0VOU1RBQVNZTkNDTFIgfAotCQkgIFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5DTURDTkZNU0sgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkZCQ0xLUlggfAotCQkgIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9OT05FIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5DTEtPVVRIT0xEKTsKLQotCS8qIFR4IGFuZCBSeCBmZWVkYmFjayBjbG9jayBkZWxheSBjb250cm9sICovCi0KLQlpZiAoaW9zLT5jbG9jayA8IDI1ICogMTAwMDAwMCkKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMyB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMiB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0JZWxzZQotCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0KLQl3cml0ZWwoY3RybDIsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCXdyaXRlbChjdHJsMywgciArIFMzQ19TREhDSV9DT05UUk9MMyk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vczQvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTg0MDc4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zNC9zbGVlcC5TCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L3NsZWVwLlMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogRVhZTk9TNDIxMCBwb3dlciBNYW5hZ2VyIChTdXNwZW5kLVRvLVJBTSkgc3VwcG9ydAotICogQmFzZWQgb24gUzNDMjQxMCBzbGVlcCBjb2RlIGJ5OgotICoJQmVuIERvb2tzLCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCi0gKiBCYXNlZCBvbiBQWEEvU0ExMTAwIHNsZWVwIGNvZGUgYnk6Ci0gKglOaWNvbGFzIFBpdHJlLCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSBJbmMKLSAqCUNsaWZmIEJyYWtlLCAoYykgMjAwMQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgotI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KLQotCS50ZXh0Ci0KLQkvKgotCSAqIHNsZWVwIG1hZ2ljLCB0byBhbGxvdyB0aGUgYm9vdGxvYWRlciB0byBjaGVjayBmb3IgYW4gdmFsaWQKLQkgKiBpbWFnZSB0byByZXN1bWUgdG8uIE11c3QgYmUgdGhlIGZpcnN0IHdvcmQgYmVmb3JlIHRoZQotCSAqIHMzY19jcHVfcmVzdW1lIGVudHJ5LgotCSAqLwotCi0JLndvcmQJMHgyYmVkZjAwZAotCi0JLyoKLQkgKiBzM2NfY3B1X3Jlc3VtZQotCSAqCi0JICogcmVzdW1lIGNvZGUgZW50cnkgZm9yIGJvb3Rsb2FkZXIgdG8gY2FsbAotCSAqCi0JICogd2UgbXVzdCBwdXQgdGhpcyBjb2RlIGhlcmUgaW4gdGhlIGRhdGEgc2VnbWVudCBhcyB3ZSBoYXZlIG5vCi0JICogb3RoZXIgd2F5IG9mIHJlc3RvcmluZyB0aGUgc3RhY2sgcG9pbnRlciBhZnRlciBzbGVlcCwgYW5kIHdlCi0JICogbXVzdCBub3Qgd3JpdGUgdG8gdGhlIGNvZGUgc2VnbWVudCAoY29kZSBpcyByZWFkLW9ubHkpCi0JICovCi0KLUVOVFJZKHMzY19jcHVfcmVzdW1lKQotCWIJY3B1X3Jlc3VtZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKaW5kZXggMjA2ZmYyZi4uZDVmMTc4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCkBAIC04NSw3ICs4NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQ0FUUywgIkNoYWxpY2UtQ0FUUyIpCiAJLyogTWFpbnRhaW5lcjogUGhpbGlwIEJsdW5kZWxsICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuc29mdF9yZWJvb3QJPSAxLAogCS5maXh1cAkJPSBmaXh1cF9jYXRzLAogCS5tYXBfaW8JCT0gZm9vdGJyaWRnZV9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUuYwppbmRleCAyZWY2OWZmLi4wMTIyMTBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogTUFDSElORV9TVEFSVChFQlNBMjg1LCAiRUJTQTI4NSIpCiAJLyogTWFpbnRhaW5lcjogUnVzc2VsbCBLaW5nICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkudmlkZW9fc3RhcnQJPSAweDAwMGEwMDAwLAogCS52aWRlb19lbmQJPSAweDAwMGJmZmZmLAogCS5tYXBfaW8JCT0gZm9vdGJyaWRnZV9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMWJlMmVlYi4uZTVhY2RlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTUsNyArMTUsNyBAQAogCiAjaWZuZGVmIENPTkZJR19ERUJVR19EQzIxMjg1X1BPUlQKIAkvKiBGb3IgTmV0V2luZGVyIGRlYnVnZ2luZyAqLwotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMDAwM2Y4CiAJCW9ycglccnYsIFxycCwgIzB4ZmYwMDAwMDAJQCB2aXJ0dWFsCiAJCW9ycglccnAsIFxycCwgIzB4N2MwMDAwMDAJQCBwaHlzaWNhbApAQCAtMzEsNyArMzEsNyBAQAogCQkuZXF1CWRjMjEyODVfaGlnaCwgQVJNQ1NSX0JBU0UgJiAweGZmMDAwMDAwCiAJCS5lcXUJZGMyMTI4NV9sb3csICBBUk1DU1JfQkFTRSAmIDB4MDBmZmZmZmYKIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCS5pZglkYzIxMjg1X2xvdwogCQltb3YJXHJwLCAjZGMyMTI4NV9sb3cKIAkJLmVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYwppbmRleCAwZjdhZWZmLi4wZDM4NDZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCkBAIC02NDcsNyArNjQ3LDcgQEAKIAogTUFDSElORV9TVEFSVChORVRXSU5ERVIsICJSZWJlbC1OZXRXaW5kZXIiKQogCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZy9SZWJlbC5jb20gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS52aWRlb19zdGFydAk9IDB4MDAwYTAwMDAsCiAJLnZpZGVvX2VuZAk9IDB4MDAwYmZmZmYsCiAJLnJlc2VydmVfbHAwCT0gMSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKaW5kZXggMzI4NWU5MS4uZjQxZGJhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogTUFDSElORV9TVEFSVChQRVJTT05BTF9TRVJWRVIsICJDb21wYXEtUGVyc29uYWxTZXJ2ZXIiKQogCS8qIE1haW50YWluZXI6IEphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZSAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKIAkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLW5hczQyMjBiLmMgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1uYXM0MjIwYi5jCmluZGV4IDBjZjdhMDcuLjU5MjdkM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLW5hczQyMjBiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtbmFzNDIyMGIuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTkFTNDIyMEIsICJSYWlkc29uaWMgTkFTIElCLTQyMjAtQiIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBnZW1pbmlfbWFwX2lvLAogCS5pbml0X2lycQk9IGdlbWluaV9pbml0X2lycSwKIAkudGltZXIJCT0gJmliNDIyMGJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC1ydXQxeHguYyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXJ1dDF4eC5jCmluZGV4IDRmYTA5YWYuLmNkNzQzN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXJ1dDF4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXJ1dDF4eC5jCkBAIC04Niw3ICs4Niw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUlVUMTAwLCAiVGVsdG9uaWthIFJVVDEwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBnZW1pbmlfbWFwX2lvLAogCS5pbml0X2lycQk9IGdlbWluaV9pbml0X2lycSwKIAkudGltZXIJCT0gJnJ1dDF4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2JvYXJkLXdiZDExMS5jIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMTExLmMKaW5kZXggODhjYzQyMi4uYTM2Nzg4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMTExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMTExLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFdCRDExMSwgIldpbGlib2FyZCBXQkQtMTExIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGdlbWluaV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gZ2VtaW5pX2luaXRfaXJxLAogCS50aW1lcgkJPSAmd2JkMTExX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvYm9hcmQtd2JkMjIyLmMgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC13YmQyMjIuYwppbmRleCAzYTIyMDM0Li5mMzgyODExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC13YmQyMjIuYworKysgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9ib2FyZC13YmQyMjIuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoV0JEMjIyLCAiV2lsaWJvYXJkIFdCRC0yMjIiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZ2VtaW5pX21hcF9pbywKIAkuaW5pdF9pcnEJPSBnZW1pbmlfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZ3YmQyMjJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGY0MGUwMDYuLjgzNzY3MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9R0VNSU5JX1VBUlRfQkFTRQkJCUAgcGh5c2ljYWwKIAlsZHIJXHJ2LCA9SU9fQUREUkVTUyhHRU1JTklfVUFSVF9CQVNFKQlAIHZpcnR1YWwKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggM2JjMmM3MC4uNDBhMDUyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMywxMSArMTMsNiBAQAogI2RlZmluZSBfX01BQ0hfR1BJT19IX18KIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKIAogI2RlZmluZSBncGlvX3RvX2lycSh4KQkoKHgpICsgR1BJT19JUlFfQkFTRSkKICNkZWZpbmUgaXJxX3RvX2dwaW8oeCkJKCh4KSAtIEdQSU9fSVJRX0JBU0UpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWdlbWluaS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDkxNWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBTdG9ybGluaywgQ29ycC4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBQYXVsaXVzIFphbGVja2FzIDxwYXVsaXVzLnphbGVja2FzQHRlbHRvbmlrYS5sdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaWZuZGVmIF9fTUFDSF9NRU1PUllfSAotI2RlZmluZSBfX01BQ0hfTUVNT1JZX0gKLQotI2lmZGVmIENPTkZJR19HRU1JTklfTUVNX1NXQVAKLSMgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLSNlbHNlCi0jIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MTAwMDAwMDApCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTUFDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYwppbmRleCA2NWYxYmVhLi45ODg2ZjE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAxLWV2YWwuYwpAQCAtMjksNyArMjksNyBAQAogCiBNQUNISU5FX1NUQVJUKEg3MjAxLCAiSHluaXggR01TMzBDNzIwMSIpCiAJLyogTWFpbnRhaW5lcjogUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMDEwMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAwLAogCS5tYXBfaW8JCT0gaDcyMHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGg3MjB4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaDcyMDFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jCmluZGV4IDg4NDU4NGEuLjI4NGExMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jCkBAIC03MSw3ICs3MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSDcyMDIsICJIeW5peCBITVMzMEM3MjAyIikKIAkvKiBNYWludGFpbmVyOiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4ICovCi0JLmJvb3RfcGFyYW1zCT0gMHg0MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGg3MjB4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBoNzIwMl9pbml0X2lycSwKIAkudGltZXIJCT0gJmg3MjAyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYzIwOTNlOC4uOGE0NjE1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNiw3ICsxNiw3IEBACiAJCS5lcXUgICAgaW9fdmlydCwgSU9fVklSVAogCQkuZXF1ICAgIGlvX3BoeXMsIElPX1BIWVMKIAotCQkubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92ICAgICBccnAsICMweDAwMDIwMDAwCUAgVUFSVDEKIAkJYWRkICAgICBccnYsIFxycCwgI2lvX3ZpcnQJQCB2aXJ0dWFsIGFkZHJlc3MKIAkJYWRkICAgICBccnAsIFxycCwgI2lvX3BoeXMJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZGNmNTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1oNzIweC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgSnVuZ2p1biBLaW0KLSAqCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDQwMDAwMDAwKQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY5NThhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK29iai15CQkJCQk6PSBjbG9jay5vIGhpZ2hiYW5rLm8gc3lzdGVtLm8KK29iai0kKENPTkZJR19ERUJVR19ISUdIQkFOS19VQVJUKQkrPSBsbHVhcnQubworb2JqLSQoQ09ORklHX1NNUCkJCQkrPSBwbGF0c21wLm8KK29iai0kKENPTkZJR19MT0NBTF9USU1FUlMpCQkrPSBsb2NhbHRpbWVyLm8KK29iai0kKENPTkZJR19IT1RQTFVHX0NQVSkJCSs9IGhvdHBsdWcubworb2JqLSQoQ09ORklHX1BNX1NMRUVQKQkJCSs9IHBtLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWU5NjYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEgQEAKK3pyZWxhZGRyLXkJOj0gMHgwMDAwODAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9jbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWEyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2Nsb2NrLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKworc3RydWN0IGNsayB7CisJdW5zaWduZWQgbG9uZyByYXRlOworfTsKKworaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiAwOworfQorCit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3t9CisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorCitsb25nIGNsa19yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXJldHVybiBjbGstPnJhdGU7Cit9CisKK2ludCBjbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGVjbGsgPSB7IC5yYXRlID0gMjAwMDAwMDAwIH07CitzdGF0aWMgc3RydWN0IGNsayBwY2xrID0geyAucmF0ZSA9IDE1MDAwMDAwMCB9OworCitzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0geworCXsgLmNsayA9ICZwY2xrLCAuY29uX2lkID0gImFwYl9wY2xrIiwgfSwKKwl7IC5jbGsgPSAmcGNsaywgLmRldl9pZCA9ICJzcDgwNCIsIH0sCisJeyAuY2xrID0gJmVjbGssIC5kZXZfaWQgPSAiZmZlMGUwMDAuc2RoY2kiLCB9LAorCXsgLmNsayA9ICZwY2xrLCAuZGV2X2lkID0gImZmZjM2MDAwLnNlcmlhbCIsIH0sCit9OworCit2b2lkIF9faW5pdCBoaWdoYmFua19jbG9ja3NfaW5pdCh2b2lkKQoreworCWNsa2Rldl9hZGRfdGFibGUobG9va3VwcywgQVJSQVlfU0laRShsb29rdXBzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2NvcmUuaApAQCAtMCwwICsxLDkgQEAKK2V4dGVybiB2b2lkIGhpZ2hiYW5rX3NldF9jcHVfanVtcChpbnQgY3B1LCB2b2lkICpqdW1wX2FkZHIpOworZXh0ZXJuIHZvaWQgaGlnaGJhbmtfY2xvY2tzX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyOworI2lmZGVmIENPTkZJR19ERUJVR19ISUdIQkFOS19VQVJUCitleHRlcm4gdm9pZCBoaWdoYmFua19sbHVhcnRfbWFwX2lvKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWdoYmFua19sbHVhcnRfbWFwX2lvKHZvaWQpIHt9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9oaWdoYmFuay5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9oaWdoYmFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2hpZ2hiYW5rLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdW5pZmllZC5oPgorI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FybV90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS90aW1lci1zcC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzcmVncy5oIgorCit2b2lkIF9faW9tZW0gKnNyZWdzX2Jhc2U7CisKKyNkZWZpbmUgSEJfU0NVX1ZJUlRfQkFTRQkweGZlZTAwMDAwCit2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIgPSAoKHZvaWQgX19pb21lbSAqKShIQl9TQ1VfVklSVF9CQVNFKSk7CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc2N1X2lvX2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkudmlydHVhbAk9IEhCX1NDVV9WSVJUX0JBU0UsCisJLnBmbgkJPSAwLCAvKiBydW4tdGltZSAqLworCS5sZW5ndGgJCT0gU1pfNEssCisJLnR5cGUJCT0gTVRfREVWSUNFLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGhpZ2hiYW5rX3NjdV9tYXBfaW8odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwkvKiBHZXQgU0NVIGJhc2UgKi8KKwlhc20oIm1yYyBwMTUsIDQsICUwLCBjMTUsIGMwLCAwIiA6ICI9ciIgKGJhc2UpKTsKKworCXNjdV9pb19kZXNjLnBmbiA9IF9fcGh5c190b19wZm4oYmFzZSk7CisJaW90YWJsZV9pbml0KCZzY3VfaW9fZGVzYywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoaWdoYmFua19tYXBfaW8odm9pZCkKK3sKKwloaWdoYmFua19zY3VfbWFwX2lvKCk7CisJaGlnaGJhbmtfbGx1YXJ0X21hcF9pbygpOworfQorCisjZGVmaW5lIEhCX0pVTVBfVEFCTEVfUEhZUyhjcHUpCQkoMHg0MCArICgweDEwICogKGNwdSkpKQorI2RlZmluZSBIQl9KVU1QX1RBQkxFX1ZJUlQoY3B1KQkJcGh5c190b192aXJ0KEhCX0pVTVBfVEFCTEVfUEhZUyhjcHUpKQorCit2b2lkIGhpZ2hiYW5rX3NldF9jcHVfanVtcChpbnQgY3B1LCB2b2lkICpqdW1wX2FkZHIpCit7CisJd3JpdGVsKEJTWU0odmlydF90b19waHlzKGp1bXBfYWRkcikpLCBIQl9KVU1QX1RBQkxFX1ZJUlQoY3B1KSk7CisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKEhCX0pVTVBfVEFCTEVfVklSVChjcHUpLCAxNik7CisJb3V0ZXJfY2xlYW5fcmFuZ2UoSEJfSlVNUF9UQUJMRV9QSFlTKGNwdSksCisJCQkgIEhCX0pVTVBfVEFCTEVfUEhZUyhjcHUpICsgMTUpOworfQorCitjb25zdCBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpcnFfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktZ2ljIiwgLmRhdGEgPSBnaWNfb2ZfaW5pdCwgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGhpZ2hiYW5rX2luaXRfaXJxKHZvaWQpCit7CisJb2ZfaXJxX2luaXQoaXJxX21hdGNoKTsKKwlsMngwX29mX2luaXQoMCwgfjBVTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoaWdoYmFua190aW1lcl9pbml0KHZvaWQpCit7CisJaW50IGlycTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXZvaWQgX19pb21lbSAqdGltZXJfYmFzZTsKKworCS8qIE1hcCBzeXN0ZW0gcmVnaXN0ZXJzICovCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiY2FseGVkYSxoYi1zcmVncyIpOworCXNyZWdzX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJV0FSTl9PTighc3JlZ3NfYmFzZSk7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJhcm0sc3A4MDQiKTsKKwl0aW1lcl9iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCVdBUk5fT04oIXRpbWVyX2Jhc2UpOworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKworCWhpZ2hiYW5rX2Nsb2Nrc19pbml0KCk7CisKKwlzcDgwNF9jbG9ja3NvdXJjZV9pbml0KHRpbWVyX2Jhc2UgKyAweDIwLCAidGltZXIxIik7CisJc3A4MDRfY2xvY2tldmVudHNfaW5pdCh0aW1lcl9iYXNlLCBpcnEsICJ0aW1lcjAiKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgaGlnaGJhbmtfdGltZXIgPSB7CisJLmluaXQgPSBoaWdoYmFua190aW1lcl9pbml0LAorfTsKKworc3RhdGljIHZvaWQgaGlnaGJhbmtfcG93ZXJfb2ZmKHZvaWQpCit7CisJaGlnbmJhbmtfc2V0X3B3cl9zaHV0ZG93bigpOworCXNjdV9wb3dlcl9tb2RlKHNjdV9iYXNlX2FkZHIsIFNDVV9QTV9QT1dFUk9GRik7CisKKwl3aGlsZSAoMSkKKwkJY3B1X2RvX2lkbGUoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGhpZ2hiYW5rX2luaXQodm9pZCkKK3sKKwlwbV9wb3dlcl9vZmYgPSBoaWdoYmFua19wb3dlcl9vZmY7CisKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpoaWdoYmFua19tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCSJjYWx4ZWRhLGhpZ2hiYW5rIiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChISUdIQkFOSywgIkhpZ2hiYW5rIikKKwkubWFwX2lvCQk9IGhpZ2hiYW5rX21hcF9pbywKKwkuaW5pdF9pcnEJPSBoaWdoYmFua19pbml0X2lycSwKKwkudGltZXIJCT0gJmhpZ2hiYW5rX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBoaWdoYmFua19pbml0LAorCS5kdF9jb21wYXQJPSBoaWdoYmFua19tYXRjaCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaG90cGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3N2NlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2hvdHBsdWcuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgQ2FseGVkYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorCitleHRlcm4gdm9pZCBzZWNvbmRhcnlfc3RhcnR1cCh2b2lkKTsKKworaW50IHBsYXRmb3JtX2NwdV9raWxsKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHRvIHNodXRkb3duIGEgQ1BVCisgKgorICovCit2b2lkIHBsYXRmb3JtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKworCWhpZ2hiYW5rX3NldF9jcHVfanVtcChjcHUsIHNlY29uZGFyeV9zdGFydHVwKTsKKwlzY3VfcG93ZXJfbW9kZShzY3VfYmFzZV9hZGRyLCBTQ1VfUE1fUE9XRVJPRkYpOworCisJY3B1X2RvX2lkbGUoKTsKKworCS8qIFdlIHNob3VsZCBuZXZlciByZXR1cm4gZnJvbSBpZGxlICovCisJcGFuaWMoImhpZ2hiYW5rOiBjcHUgJWQgdW5leHBlY3RlZGx5IGV4aXQgZnJvbSBzaHV0ZG93blxuIiwgY3B1KTsKK30KKworaW50IHBsYXRmb3JtX2NwdV9kaXNhYmxlKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBDUFUwIHNob3VsZCBub3QgYmUgc2h1dCBkb3duIHZpYSBob3RwbHVnLiAgY3B1X2lkbGUgY2FuIFdGSQorCSAqIG9yIGEgcHJvcGVyIHNodXRkb3duIG9yIGhpYmVybmF0ZSBzaG91bGQgYmUgdXNlZC4KKwkgKi8KKwlyZXR1cm4gY3B1ID09IDAgPyAtRVBFUk0gOiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1N2ZlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIERlYnVnZ2luZyBtYWNybyBpbmNsdWRlIGhlYWRlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OSBSdXNzZWxsIEtpbmcKKyAqICBNb3ZlZCBmcm9tIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9kZWJ1Zy5TIGJ5IEJlbiBEb29rcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCQkubWFjcm8JYWRkcnVhcnQscnAscnYsdG1wCisJCW1vdncJXHJ2LCAjMHg2MDAwCisJCW1vdnQJXHJ2LCAjMHhmZWUzCisJCW1vdncJXHJwLCAjMHg2MDAwCisJCW1vdnQJXHJwLCAjMHhmZmYzCisJCS5lbmRtCisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVidWctcGwwMXguUz4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUz4KKworCS5tYWNybwlkaXNhYmxlX2ZpcQorCS5lbmRtCisKKwkubWFjcm8JYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgorCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvZ3Bpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9ncGlvLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2ZhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX01BQ0hfSU9fSAorI2RlZmluZSBfX01BQ0hfSU9fSAorCisjZGVmaW5lIF9faW8oYSkJCSh7ICh2b2lkKShhKTsgX190eXBlc2FmZV9pbygwKTsgfSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ2YWFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX01BQ0hfSVJRU19ICisjZGVmaW5lIF9fTUFDSF9JUlFTX0gKKworI2RlZmluZSBOUl9JUlFTCQkJMTkyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaApjb3B5IHRvIGFyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODE5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBDYWx4ZWRhLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBfX01BQ0hfU1lTVEVNX0gKKyNkZWZpbmUgX19NQUNIX1NZU1RFTV9ICisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKKwljcHVfZG9faWRsZSgpOworfQorCitleHRlcm4gdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSwgY29uc3QgY2hhciAqY21kKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRhYzdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdGltZXguaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19NQUNIX1RJTUVYX0gKKyNkZWZpbmUgX19NQUNIX1RJTUVYX0gKKworI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCTEwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMjBlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19NQUNIX1VOQ09NUFJFU1NfSAorI2RlZmluZSBfX01BQ0hfVU5DT01QUkVTU19ICisKKyNkZWZpbmUgcHV0YyhjKQorI2RlZmluZSBmbHVzaCgpCisjZGVmaW5lIGFyY2hfZGVjb21wX3NldHVwKCkKKyNkZWZpbmUgYXJjaF9kZWNvbXBfd2RvZygpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdm1hbGxvYy5oIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjllOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBWTUFMTE9DX0VORAkJMHhGRUUwMDAwMFVMCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2xsdWFydC5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9sbHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzE1NzUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9sbHVhcnQuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgQ2FseGVkYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2RlZmluZSBIQl9ERUJVR19MTF9QSFlTX0JBU0UJMHhmZmYzNjAwMAorI2RlZmluZSBIQl9ERUJVR19MTF9WSVJUX0JBU0UJMHhmZWUzNjAwMAorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGxsdWFydF9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLnZpcnR1YWwJPSBIQl9ERUJVR19MTF9WSVJUX0JBU0UsCisJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEhCX0RFQlVHX0xMX1BIWVNfQkFTRSksCisJLmxlbmd0aAkJPSBTWl80SywKKwkudHlwZQkJPSBNVF9ERVZJQ0UsCit9OworCit2b2lkIF9faW5pdCBoaWdoYmFua19sbHVhcnRfbWFwX2lvKHZvaWQpCit7CisJaW90YWJsZV9pbml0KCZsbHVhcnRfaW9fZGVzYywgMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2xvY2FsdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvbG9jYWx0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL2xvY2FsdGltZXIuYwpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBDYWx4ZWRhLCBJbmMuCisgKiBCYXNlZCBvbiBsb2NhbHRpbWVyLmMsIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorCisjaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KKworLyoKKyAqIFNldHVwIHRoZSBsb2NhbCBjbG9jayBldmVudHMgZm9yIGEgQ1BVLgorICovCitpbnQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiYXJtLHNtcC10d2QiKTsKKwlpZiAoIXR3ZF9iYXNlKSB7CisJCXR3ZF9iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCQlXQVJOX09OKCF0d2RfYmFzZSk7CisJfQorCWV2dC0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCXR3ZF90aW1lcl9zZXR1cChldnQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEzNjRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbGF0c21wLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLTIwMTEgQ2FseGVkYSwgSW5jLgorICogQmFzZWQgb24gcGxhdHNtcC5jLCBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKworZXh0ZXJuIHZvaWQgc2Vjb25kYXJ5X3N0YXJ0dXAodm9pZCk7CisKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJZ2ljX3NlY29uZGFyeV9pbml0KDApOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwlnaWNfcmFpc2Vfc29mdGlycShjcHVtYXNrX29mKGNwdSksIDApOworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgQ1BVIHBvc3NpYmxlIG1hcCBlYXJseSAtIHRoaXMgZGVzY3JpYmVzIHRoZSBDUFVzCisgKiB3aGljaCBtYXkgYmUgcHJlc2VudCBvciBiZWNvbWUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCit2b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIG5jb3JlczsKKworCW5jb3JlcyA9IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZV9hZGRyKTsKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChuY29yZXMgPiBOUl9DUFVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJoaWdoYmFuazogbm8uIG9mIGNvcmVzICglZCkgZ3JlYXRlciB0aGFuIGNvbmZpZ3VyZWQgIgorCQkgICAgICAgIm1heGltdW0gb2YgJWQgLSBjbGlwcGluZ1xuIiwKKwkJICAgICAgIG5jb3JlcywgTlJfQ1BVUyk7CisJCW5jb3JlcyA9IE5SX0NQVVM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5jb3JlczsgaSsrKQorCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOworCisJc2V0X3NtcF9jcm9zc19jYWxsKGdpY19yYWlzZV9zb2Z0aXJxKTsKK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW50IGk7CisKKwlzY3VfZW5hYmxlKHNjdV9iYXNlX2FkZHIpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCBpbnRvIHRoZSBqdW1wIHRhYmxlCisJICogVGhlIGNvcmVzIGFyZSBpbiB3ZmkgYW5kIHdhaXQgdW50aWwgdGhleSByZWNlaXZlIGEgc29mdCBpbnRlcnJ1cHQKKwkgKiBhbmQgYSBub24temVybyB2YWx1ZSB0byBqdW1wIHRvLiBUaGVuIHRoZSBzZWNvbmRhcnkgQ1BVIGJyYW5jaGVzCisJICogdG8gdGhpcyBhZGRyZXNzLgorCSAqLworCWZvciAoaSA9IDE7IGkgPCBtYXhfY3B1czsgaSsrKQorCQloaWdoYmFua19zZXRfY3B1X2p1bXAoaSwgc2Vjb25kYXJ5X3N0YXJ0dXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbS5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjNiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3BtLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KKyNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzcmVncy5oIgorCitzdGF0aWMgaW50IGhpZ2hiYW5rX3N1c3BlbmRfZmluaXNoKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWNwdV9kb19pZGxlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlnaGJhbmtfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCWhpZ25iYW5rX3NldF9wd3Jfc3VzcGVuZCgpOworCWhpZ2hiYW5rX3NldF9jcHVfanVtcCgwLCBjcHVfcmVzdW1lKTsKKworCXNjdV9wb3dlcl9tb2RlKHNjdV9iYXNlX2FkZHIsIFNDVV9QTV9QT1dFUk9GRik7CisJY3B1X3N1c3BlbmQoMCwgaGlnaGJhbmtfc3VzcGVuZF9maW5pc2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgaGlnaGJhbmtfcG1fb3BzID0geworCS5lbnRlciA9IGhpZ2hiYW5rX3BtX2VudGVyLAorCS52YWxpZCA9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoaWdoYmFua19wbV9pbml0KHZvaWQpCit7CisJc3VzcGVuZF9zZXRfb3BzKCZoaWdoYmFua19wbV9vcHMpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoaGlnaGJhbmtfcG1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3N5c3JlZ3MuaCBiL2FyY2gvYXJtL21hY2gtaGlnaGJhbmsvc3lzcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTEzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3N5c3JlZ3MuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgQ2FseGVkYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpZm5kZWYgX01BQ0hfSElHSEJBTktfX1NZU1JFR1NfSF8KKyNkZWZpbmUgX01BQ0hfSElHSEJBTktfX1NZU1JFR1NfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKK2V4dGVybiB2b2lkIF9faW9tZW0gKnNyZWdzX2Jhc2U7CisKKyNkZWZpbmUgSEJfU1JFR19BOV9QV1JfUkVRCQkweGYwMAorI2RlZmluZSBIQl9TUkVHX0E5X0JPT1RfU1RBVAkJMHhmMDQKKyNkZWZpbmUgSEJfU1JFR19BOV9CT09UX0RBVEEJCTB4ZjA4CisKKyNkZWZpbmUgSEJfUFdSX1NVU1BFTkQJCQkwCisjZGVmaW5lIEhCX1BXUl9TT0ZUX1JFU0VUCQkxCisjZGVmaW5lIEhCX1BXUl9IQVJEX1JFU0VUCQkyCisjZGVmaW5lIEhCX1BXUl9TSFVURE9XTgkJCTMKKworc3RhdGljIGlubGluZSB2b2lkIGhpZ25iYW5rX3NldF9wd3Jfc3VzcGVuZCh2b2lkKQoreworCXdyaXRlbChIQl9QV1JfU1VTUEVORCwgc3JlZ3NfYmFzZSArIEhCX1NSRUdfQTlfUFdSX1JFUSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWduYmFua19zZXRfcHdyX3NodXRkb3duKHZvaWQpCit7CisJd3JpdGVsKEhCX1BXUl9TSFVURE9XTiwgc3JlZ3NfYmFzZSArIEhCX1NSRUdfQTlfUFdSX1JFUSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWduYmFua19zZXRfcHdyX3NvZnRfcmVzZXQodm9pZCkKK3sKKwl3cml0ZWwoSEJfUFdSX1NPRlRfUkVTRVQsIHNyZWdzX2Jhc2UgKyBIQl9TUkVHX0E5X1BXUl9SRVEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlnbmJhbmtfc2V0X3B3cl9oYXJkX3Jlc2V0KHZvaWQpCit7CisJd3JpdGVsKEhCX1BXUl9IQVJEX1JFU0VULCBzcmVnc19iYXNlICsgSEJfU1JFR19BOV9QV1JfUkVRKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWhpZ2hiYW5rL3N5c3RlbS5jIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwYzRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1oaWdoYmFuay9zeXN0ZW0uYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgQ2FseGVkYSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzcmVncy5oIgorCit2b2lkIGFyY2hfcmVzZXQoY2hhciBtb2RlLCBjb25zdCBjaGFyICpjbWQpCit7CisJaWYgKG1vZGUgPT0gJ2gnKQorCQloaWduYmFua19zZXRfcHdyX2hhcmRfcmVzZXQoKTsKKwllbHNlCisJCWhpZ25iYW5rX3NldF9wd3Jfc29mdF9yZXNldCgpOworCisJc2N1X3Bvd2VyX21vZGUoc2N1X2Jhc2VfYWRkciwgU0NVX1BNX1BPV0VST0ZGKTsKKwljcHVfZG9faWRsZSgpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZwppbmRleCAwNTE5ZGQ3Li41ZjdmOWMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKQEAgLTEsMTAgKzEsMzIgQEAKIGNvbmZpZyBJTVhfSEFWRV9ETUFfVjEKIAlib29sCisKK2NvbmZpZyBIQVZFX0lNWF9HUEMKKwlib29sCisKK2NvbmZpZyBIQVZFX0lNWF9NTURDCisJYm9vbAorCitjb25maWcgSEFWRV9JTVhfU1JDCisJYm9vbAorCiAjCiAjIEFSQ0hfTVgzMSBhbmQgQVJDSF9NWDM1IGFyZSBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CiAjIFNvbWUgdXNhZ2VzIGFzc3VtZSB0aGF0IGhhdmluZyBvbmUgb2YgdGhlbSBpbXBsaWVzIG5vdCBoYXZpbmcgKGUuZy4pIEFSQ0hfTVgyLgogIyBUbyBlYXNpbHkgZGlzdGluZ3Vpc2ggZ29vZCBhbmQgcmV2aWV3ZWQgZnJvbSB1bnJldmlld2VkIHVzYWdlcyBuZXcgKGFuZCBJTUhPCiAjIG1vcmUgc2Vuc2libGUpIG5hbWVzIGFyZSB1c2VkOiBTT0NfSU1YMzEgYW5kIFNPQ19JTVgzNQorY29uZmlnIEFSQ0hfTVgxCisJYm9vbAorCitjb25maWcgTUFDSF9NWDIxCisJYm9vbAorCitjb25maWcgQVJDSF9NWDI1CisJYm9vbAorCitjb25maWcgTUFDSF9NWDI3CisJYm9vbAorCiBjb25maWcgQVJDSF9NWDMxCiAJYm9vbAogCkBAIC0xMyw2ICszNSw3IEBACiAKIGNvbmZpZyBTT0NfSU1YMQogCWJvb2wKKwlzZWxlY3QgQVJDSF9NWDEKIAlzZWxlY3QgQ1BVX0FSTTkyMFQKIAlzZWxlY3QgSU1YX0hBVkVfRE1BX1YxCiAJc2VsZWN0IElNWF9IQVZFX0lPTVVYX1YxCkBAIC0yMCw2ICs0Myw3IEBACiAKIGNvbmZpZyBTT0NfSU1YMjEKIAlib29sCisJc2VsZWN0IE1BQ0hfTVgyMQogCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjEKIAlzZWxlY3QgSU1YX0hBVkVfRE1BX1YxCkBAIC0yOCw2ICs1Miw3IEBACiAKIGNvbmZpZyBTT0NfSU1YMjUKIAlib29sCisJc2VsZWN0IEFSQ0hfTVgyNQogCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjIKIAlzZWxlY3QgQVJDSF9NWENfSU9NVVhfVjMKQEAgLTM1LDYgKzYwLDcgQEAKIAogY29uZmlnIFNPQ19JTVgyNwogCWJvb2wKKwlzZWxlY3QgTUFDSF9NWDI3CiAJc2VsZWN0IENQVV9BUk05MjZUCiAJc2VsZWN0IEFSQ0hfTVhDX0FVRE1VWF9WMQogCXNlbGVjdCBJTVhfSEFWRV9ETUFfVjEKQEAgLTQ4LDYgKzc0LDcgQEAKIAlzZWxlY3QgQVJDSF9NWENfQVVETVVYX1YyCiAJc2VsZWN0IEFSQ0hfTVgzMQogCXNlbGVjdCBNWENfQVZJQworCXNlbGVjdCBTTVBfT05fVVAgaWYgU01QCiAKIGNvbmZpZyBTT0NfSU1YMzUKIAlib29sCkBAIC01Nyw5ICs4NCwxMCBAQAogCXNlbGVjdCBIQVZFX0VQSVQKIAlzZWxlY3QgQVJDSF9NWDM1CiAJc2VsZWN0IE1YQ19BVklDCisJc2VsZWN0IFNNUF9PTl9VUCBpZiBTTVAKIAogCi1pZiBBUkNIX01YMQoraWYgQVJDSF9JTVhfVjRfVjUKIAogY29tbWVudCAiTVgxIHBsYXRmb3JtczoiCiBjb25maWcgTUFDSF9NWExBRFMKQEAgLTg3LDMwICsxMTUsNiBAQAogCWhlbHAKIAkgIFNheSBZZXMgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBBcm1hZGV1cyBBUEY5MzI4IGRldmVsb3BtZW50IGJvYXJkCiAKLWVuZGlmCi0KLWlmIEFSQ0hfTVgyCi0KLWNob2ljZQotCXByb21wdCAiQ1BVczoiCi0JZGVmYXVsdCBNQUNIX01YMjEKLQotY29uZmlnIE1BQ0hfTVgyMQotCWJvb2wgImkuTVgyMSBzdXBwb3J0IgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUncyBNWDIgYmFzZWQgaS5NWDIxIHByb2Nlc3Nvci4KLQotY29uZmlnIE1BQ0hfTVgyNwotCWJvb2wgImkuTVgyNyBzdXBwb3J0IgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUncyBNWDIgYmFzZWQgaS5NWDI3IHByb2Nlc3Nvci4KLQotZW5kY2hvaWNlCi0KLWVuZGlmCi0KLWlmIE1BQ0hfTVgyMQotCiBjb21tZW50ICJNWDIxIHBsYXRmb3JtczoiCiAKIGNvbmZpZyBNQUNIX01YMjFBRFMKQEAgLTEyNCwxNSArMTI4LDEyIEBACiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YMjFBRFMgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KIAotZW5kaWYKLQotaWYgQVJDSF9NWDI1Ci0KIGNvbW1lbnQgIk1YMjUgcGxhdGZvcm1zOiIKIAogY29uZmlnIE1BQ0hfTVgyNV8zRFMKIAlib29sICJTdXBwb3J0IE1YMjVQREsgKDNEUykgUGxhdGZvcm0iCiAJc2VsZWN0IFNPQ19JTVgyNQorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9GTEVYQ0FOCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZTTF9VU0IyX1VEQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVgyX1dEVAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhESV9SVEMKQEAgLTE3NCwxMCArMTc1LDYgQEAKIAogZW5kY2hvaWNlCiAKLWVuZGlmCi0KLWlmIE1BQ0hfTVgyNwotCiBjb21tZW50ICJNWDI3IHBsYXRmb3JtczoiCiAKIGNvbmZpZyBNQUNIX01YMjdBRFMKQEAgLTM1Niw3ICszNTMsNyBAQAogCiBlbmRpZgogCi1pZiBBUkNIX01YMworaWYgQVJDSF9JTVhfVjZfVjcKIAogY29tbWVudCAiTVgzMSBwbGF0Zm9ybXM6IgogCkBAIC00NDksNiArNDQ2LDcgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSVBVX0NPUkUKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX0VIQ0kKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX01NQwogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJc2VsZWN0IE1YQ19VTFBJIGlmIFVTQl9VTFBJCkBAIC00ODUsNiArNDgzLDcgQEAKIAlib29sICJTdXBwb3J0IERhdmUvREVOWCBRb25nRVZCLUxJVEUgcGxhdGZvcm0iCiAJc2VsZWN0IFNPQ19JTVgzMQogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVgyX1dEVAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRGF2ZS9ERU5YIFFvbmdFVkItTElURSBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcwogCSAgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgpAQCAtNjA1LDQgKzYwNCwyMCBAQAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBWUFIyMDAgcGxhdGZvcm0uIFRoaXMgaW5jbHVkZXMgc3BlY2lmaWMKIAkgIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYm9hcmQgYW5kIGl0cyBwZXJpcGhlcmFscy4KIAorY29tbWVudCAiaS5NWDYgZmFtaWx5OiIKKworY29uZmlnIFNPQ19JTVg2UQorCWJvb2wgImkuTVg2IFF1YWQgc3VwcG9ydCIKKwlzZWxlY3QgQVJNX0dJQworCXNlbGVjdCBDQUNIRV9MMlgwCisJc2VsZWN0IENQVV9WNworCXNlbGVjdCBIQVZFX0FSTV9TQ1UKKwlzZWxlY3QgSEFWRV9JTVhfR1BDCisJc2VsZWN0IEhBVkVfSU1YX01NREMKKwlzZWxlY3QgSEFWRV9JTVhfU1JDCisJc2VsZWN0IFVTRV9PRgorCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEZyZWVzY2FsZSBpLk1YNiBRdWFkIHByb2Nlc3Nvci4KKwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKaW5kZXggZTllYjM2ZC4uYWJhNzMyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKQEAgLTEsMTYgKzEsMTUgQEAKIG9iai0kKENPTkZJR19JTVhfSEFWRV9ETUFfVjEpICs9IGRtYS12MS5vCiAKLW9iai0kKENPTkZJR19BUkNIX01YMSkgKz0gY2xvY2staW14MS5vIG1tLWlteDEubwotb2JqLSQoQ09ORklHX01BQ0hfTVgyMSkgKz0gY2xvY2staW14MjEubyBtbS1pbXgyMS5vCitvYmotJChDT05GSUdfU09DX0lNWDEpICs9IGNsb2NrLWlteDEubyBtbS1pbXgxLm8KK29iai0kKENPTkZJR19TT0NfSU1YMjEpICs9IGNsb2NrLWlteDIxLm8gbW0taW14MjEubwogCi1vYmotJChDT05GSUdfQVJDSF9NWDI1KSArPSBjbG9jay1pbXgyNS5vIG1tLWlteDI1Lm8gZWhjaS1pbXgyNS5vCitvYmotJChDT05GSUdfU09DX0lNWDI1KSArPSBjbG9jay1pbXgyNS5vIG1tLWlteDI1Lm8gZWhjaS1pbXgyNS5vIGNwdS1pbXgyNS5vCiAKLW9iai0kKENPTkZJR19NQUNIX01YMjcpICs9IGNwdS1pbXgyNy5vIHBtLWlteDI3Lm8KLW9iai0kKENPTkZJR19NQUNIX01YMjcpICs9IGNsb2NrLWlteDI3Lm8gbW0taW14MjcubyBlaGNpLWlteDI3Lm8KK29iai0kKENPTkZJR19TT0NfSU1YMjcpICs9IGNwdS1pbXgyNy5vIHBtLWlteDI3Lm8KK29iai0kKENPTkZJR19TT0NfSU1YMjcpICs9IGNsb2NrLWlteDI3Lm8gbW0taW14MjcubyBlaGNpLWlteDI3Lm8KIAotb2JqLSQoQ09ORklHX1NPQ19JTVgzMSkgKz0gbW0taW14MzEubyBjcHUtaW14MzEubyBjbG9jay1pbXgzMS5vIGlvbXV4LWlteDMxLm8gZWhjaS1pbXgzMS5vCi1vYmotJChDT05GSUdfU09DX0lNWDM1KSArPSBtbS1pbXgzNS5vIGNwdS1pbXgzNS5vIGNsb2NrLWlteDM1Lm8gZWhjaS1pbXgzNS5vCi1vYmotJChDT05GSUdfQ0FDSEVfTDJYMCkgKz0gY2FjaGUtbDJ4MC5vCitvYmotJChDT05GSUdfU09DX0lNWDMxKSArPSBtbS1pbXgzLm8gY3B1LWlteDMxLm8gY2xvY2staW14MzEubyBpb211eC1pbXgzMS5vIGVoY2ktaW14MzEubworb2JqLSQoQ09ORklHX1NPQ19JTVgzNSkgKz0gbW0taW14My5vIGNwdS1pbXgzNS5vIGNsb2NrLWlteDM1Lm8gZWhjaS1pbXgzNS5vCiAKICMgU3VwcG9ydCBmb3IgQ01PUyBzZW5zb3IgaW50ZXJmYWNlCiBvYmotJChDT05GSUdfTVgxX1ZJREVPKSArPSBteDEtY2FtZXJhLWZpcS5vIG14MS1jYW1lcmEtZmlxLWtzeW0ubwpAQCAtNjEsMyArNjAsMTQgQEAKIG9iai0kKENPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgzNSkgKz0gbWFjaC1jcHVpbXgzNS5vCiBvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVhTRDM1X0JBU0VCT0FSRCkgKz0gZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQubwogb2JqLSQoQ09ORklHX01BQ0hfVlBSMjAwKSArPSBtYWNoLXZwcjIwMC5vCisKK29iai0kKENPTkZJR19ERUJVR19MTCkgKz0gbGx1YXJ0Lm8KK29iai0kKENPTkZJR19IQVZFX0lNWF9HUEMpICs9IGdwYy5vCitvYmotJChDT05GSUdfSEFWRV9JTVhfTU1EQykgKz0gbW1kYy5vCitvYmotJChDT05GSUdfSEFWRV9JTVhfU1JDKSArPSBzcmMubworb2JqLSQoQ09ORklHX0NQVV9WNykgKz0gaGVhZC12Ny5vCitBRkxBR1NfaGVhZC12Ny5vIDo9LVdhLC1tYXJjaD1hcm12Ny1hCitvYmotJChDT05GSUdfU01QKSArPSBwbGF0c21wLm8KK29iai0kKENPTkZJR19IT1RQTFVHX0NQVSkgKz0gaG90cGx1Zy5vCitvYmotJChDT05GSUdfTE9DQUxfVElNRVJTKSArPSBsb2NhbHRpbWVyLm8KK29iai0kKENPTkZJR19TT0NfSU1YNlEpICs9IGNsb2NrLWlteDZxLm8gbWFjaC1pbXg2cS5vIHBtLWlteDZxLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZS5ib290CmluZGV4IGRiZTYxMjAuLmNmZWRlNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlLmJvb3QKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUuYm9vdApAQCAtMSwxOSArMSwyNyBAQAotenJlbGFkZHItJChDT05GSUdfQVJDSF9NWDEpCSs9IDB4MDgwMDgwMDAKLXBhcmFtc19waHlzLSQoQ09ORklHX0FSQ0hfTVgxKQk6PSAweDA4MDAwMTAwCi1pbml0cmRfcGh5cy0kKENPTkZJR19BUkNIX01YMSkJOj0gMHgwODgwMDAwMAorenJlbGFkZHItJChDT05GSUdfU09DX0lNWDEpCSs9IDB4MDgwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX1NPQ19JTVgxKQk6PSAweDA4MDAwMTAwCitpbml0cmRfcGh5cy0kKENPTkZJR19TT0NfSU1YMSkJOj0gMHgwODgwMDAwMAogCi16cmVsYWRkci0kKENPTkZJR19NQUNIX01YMjEpCSs9IDB4QzAwMDgwMDAKLXBhcmFtc19waHlzLSQoQ09ORklHX01BQ0hfTVgyMSkJOj0gMHhDMDAwMDEwMAotaW5pdHJkX3BoeXMtJChDT05GSUdfTUFDSF9NWDIxKQk6PSAweEMwODAwMDAwCit6cmVsYWRkci0kKENPTkZJR19TT0NfSU1YMjEpCSs9IDB4QzAwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX1NPQ19JTVgyMSkJOj0gMHhDMDAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfU09DX0lNWDIxKQk6PSAweEMwODAwMDAwCiAKLXpyZWxhZGRyLSQoQ09ORklHX0FSQ0hfTVgyNSkJKz0gMHg4MDAwODAwMAotcGFyYW1zX3BoeXMtJChDT05GSUdfQVJDSF9NWDI1KQk6PSAweDgwMDAwMTAwCi1pbml0cmRfcGh5cy0kKENPTkZJR19BUkNIX01YMjUpCTo9IDB4ODA4MDAwMDAKK3pyZWxhZGRyLSQoQ09ORklHX1NPQ19JTVgyNSkJKz0gMHg4MDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfU09DX0lNWDI1KQk6PSAweDgwMDAwMTAwCitpbml0cmRfcGh5cy0kKENPTkZJR19TT0NfSU1YMjUpCTo9IDB4ODA4MDAwMDAKIAotenJlbGFkZHItJChDT05GSUdfTUFDSF9NWDI3KQkrPSAweEEwMDA4MDAwCi1wYXJhbXNfcGh5cy0kKENPTkZJR19NQUNIX01YMjcpCTo9IDB4QTAwMDAxMDAKLWluaXRyZF9waHlzLSQoQ09ORklHX01BQ0hfTVgyNykJOj0gMHhBMDgwMDAwMAorenJlbGFkZHItJChDT05GSUdfU09DX0lNWDI3KQkrPSAweEEwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19TT0NfSU1YMjcpCTo9IDB4QTAwMDAxMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX1NPQ19JTVgyNykJOj0gMHhBMDgwMDAwMAogCi16cmVsYWRkci0kKENPTkZJR19BUkNIX01YMykJKz0gMHg4MDAwODAwMAotcGFyYW1zX3BoeXMtJChDT05GSUdfQVJDSF9NWDMpCTo9IDB4ODAwMDAxMDAKLWluaXRyZF9waHlzLSQoQ09ORklHX0FSQ0hfTVgzKQk6PSAweDgwODAwMDAwCit6cmVsYWRkci0kKENPTkZJR19TT0NfSU1YMzEpCSs9IDB4ODAwMDgwMDAKK3BhcmFtc19waHlzLSQoQ09ORklHX1NPQ19JTVgzMSkJOj0gMHg4MDAwMDEwMAoraW5pdHJkX3BoeXMtJChDT05GSUdfU09DX0lNWDMxKQk6PSAweDgwODAwMDAwCisKK3pyZWxhZGRyLSQoQ09ORklHX1NPQ19JTVgzNSkJKz0gMHg4MDAwODAwMAorcGFyYW1zX3BoeXMtJChDT05GSUdfU09DX0lNWDM1KQk6PSAweDgwMDAwMTAwCitpbml0cmRfcGh5cy0kKENPTkZJR19TT0NfSU1YMzUpCTo9IDB4ODA4MDAwMDAKKworenJlbGFkZHItJChDT05GSUdfU09DX0lNWDZRKQkrPSAweDEwMDA4MDAwCitwYXJhbXNfcGh5cy0kKENPTkZJR19TT0NfSU1YNlEpCTo9IDB4MTAwMDAxMDAKK2luaXRyZF9waHlzLSQoQ09ORklHX1NPQ19JTVg2USkJOj0gMHgxMDgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2FjaGUtbDJ4MC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2FjaGUtbDJ4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWQxMzIyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2NhY2hlLWwyeDAuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBQZW5ndXRyb25peAotICogU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgotICogSnVlcmdlbiBCZWlzZXJ0IDxqLmJlaXNlcnRAcGVuZ3V0cm9uaXguZGU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotc3RhdGljIGludCBteGNfaW5pdF9sMngwKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICpjbGtjdGxfYmFzZTsKLQotCWlmICghY3B1X2lzX214MzEoKSAmJiAhY3B1X2lzX214MzUoKSkKLQkJcmV0dXJuIDA7Ci0KLS8qCi0gKiBGaXJzdCBvZiBhbGwsIHdlIG11c3QgcmVwYWlyIGJyb2tlbiBjaGlwIHNldHRpbmdzLiBUaGVyZSBhcmUgc29tZQotICogaS5NWDM1IENQVXMgaW4gdGhlIHdpbGQsIGNvbW1pbmcgd2l0aCBib2d1cyBMMiBjYWNoZSBzZXR0aW5ncy4gVGhlc2UKLSAqIG1pc2NvbmZpZ3VyZWQgQ1BVcyB3aWxsIHJ1biBhbW9rIGltbWVkaWF0ZWx5IHdoZW4gdGhlIEwyIGNhY2hlIGdldHMgZW5hYmxlZC4KLSAqIFdvcmthcmFvdW5kIGlzIHRvIHNldHVwIHRoZSBjb3JyZWN0IHJlZ2lzdGVyIHNldHRpbmcgcHJpb3IgZW5hYmxpbmcgdGhlCi0gKiBMMiBjYWNoZS4gVGhpcyBzaG91bGQgbm90IGh1cnQgYWxyZWFkeSB3b3JraW5nIENQVXMsIGFzIHRoZXkgYXJlIHVzaW5nIHRoZQotICogc2FtZSB2YWx1ZS4KLSAqLwotI2RlZmluZSBMMl9NRU1fVkFMIDB4MTAKLQotCWNsa2N0bF9iYXNlID0gaW9yZW1hcChNWDM1X0NMS0NUTF9CQVNFX0FERFIsIDQwOTYpOwotCWlmIChjbGtjdGxfYmFzZSAhPSBOVUxMKSB7Ci0JCXdyaXRlbCgweDAwMDAwNTE1LCBjbGtjdGxfYmFzZSArIEwyX01FTV9WQUwpOwotCQlpb3VubWFwKGNsa2N0bF9iYXNlKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIkwyIGNhY2hlOiBDYW5ub3QgZml4IHRpbWluZy4gVHJ5aW5nIHRvIGNvbnRpbnVlIHdpdGhvdXRcbiIpOwotCX0KLQotCWwyeDBfYmFzZSA9IGlvcmVtYXAoTVgzeF9MMkNDX0JBU0VfQUREUiwgNDA5Nik7Ci0JaWYgKElTX0VSUihsMngwX2Jhc2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmVtYXBwaW5nIEwyIGNhY2hlIGFyZWEgZmFpbGVkIHdpdGggJWxkXG4iLAotCQkJCVBUUl9FUlIobDJ4MF9iYXNlKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWwyeDBfaW5pdChsMngwX2Jhc2UsIDB4MDAwMzAwMjQsIDB4MDAwMDAwMDApOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKG14Y19pbml0X2wyeDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKaW5kZXggZTYzZTIzNS4uYjBmZWM3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYwpAQCAtMjYzLDYgKzI2Myw3IEBACiBERUZJTkVfQ0xPQ0soY3NpX2NsaywgICAgMCwgQ0NNX0NHQ1IxLCAgNCwgZ2V0X3JhdGVfY3NpLCBOVUxMLCAgJmNzaV9wZXJfY2xrKTsKIERFRklORV9DTE9DSyhjYW4xX2NsaywJIDAsIENDTV9DR0NSMSwgIDIsIGdldF9yYXRlX2lwZywgTlVMTCwgTlVMTCk7CiBERUZJTkVfQ0xPQ0soY2FuMl9jbGssCSAxLCBDQ01fQ0dDUjEsICAzLCBnZXRfcmF0ZV9pcGcsIE5VTEwsIE5VTEwpOworREVGSU5FX0NMT0NLKGlpbV9jbGssICAgIDAsIENDTV9DR0NSMSwgMjYsIE5VTEwsIE5VTEwsIE5VTEwpOwogCiAjZGVmaW5lIF9SRUdJU1RFUl9DTE9DSyhkLCBuLCBjKQlcCiAJewkJCQlcCkBAIC0zMTAsNiArMzExLDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImZsZXhjYW4uMSIsIE5VTEwsIGNhbjJfY2xrKQogCS8qIGkubXgyNSBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KIAlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImlpbSIsIGlpbV9jbGspCiB9OwogCiBpbnQgX19pbml0IG14MjVfY2xvY2tzX2luaXQodm9pZCkKQEAgLTMzNCw2ICszMzYsMTAgQEAKIAkvKiBDbG9jayBzb3VyY2UgZm9yIGdwdCBpcyBhaGJfZGl2ICovCiAJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENSTV9CQVNFKzB4NjQpICYgfigxIDw8IDUpLCBDUk1fQkFTRSArIDB4NjQpOwogCisJY2xrX2VuYWJsZSgmaWltX2Nsayk7CisJaW14X3ByaW50X3NpbGljb25fcmV2KCJpLk1YMjUiLCBteDI1X3JldmlzaW9uKCkpOworCWNsa19kaXNhYmxlKCZpaW1fY2xrKTsKKwogCW14Y190aW1lcl9pbml0KCZncHRfY2xrLCBNWDI1X0lPX0FERFJFU1MoTVgyNV9HUFQxX0JBU0VfQUREUiksIDU0KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMKaW5kZXggNjkxMmI4Mi4uODhmZTAwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jCkBAIC01ODMsNyArNTgzLDcgQEAKIERFRklORV9DTE9DSyhkbWFfY2xrMSwgICAgIDAsIFBDQ1IxLCAyMCwgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwogREVGSU5FX0NMT0NLKGNzaV9jbGsxLCAgICAgMCwgUENDUjEsIDIxLCBOVUxMLCBOVUxMLCAmYWhiX2Nsayk7CiBERUZJTkVfQ0xPQ0soYnJvbV9jbGssICAgICAwLCBQQ0NSMSwgMjIsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKLURFRklORV9DTE9DSyhhdGFfY2xrLCAgICAgIDAsIFBDQ1IxLCAyMywgTlVMTCwgTlVMTCwgJmFoYl9jbGspOworREVGSU5FX0NMT0NLKHBhdGFfY2xrLCAgICAgIDAsIFBDQ1IxLCAyMywgTlVMTCwgTlVMTCwgJmFoYl9jbGspOwogREVGSU5FX0NMT0NLKHdkb2dfY2xrLCAgICAgMCwgUENDUjEsIDI0LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CiBERUZJTkVfQ0xPQ0sodXNiX2NsaywgICAgICAwLCBQQ0NSMSwgMjUsIGdldF9yYXRlX3VzYiwgJnVzYl9jbGsxLCAmc3BsbF9jbGspOwogREVGSU5FX0NMT0NLKHVhcnQ2X2NsazEsICAgMCwgUENDUjEsIDI2LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CkBAIC02NjYsNyArNjY2LDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteDI3LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVtaSIsIGVtaV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzYWhhcmEyIiwgc2FoYXJhMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygicGF0YV9pbXgiLCBOVUxMLCBwYXRhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm1zdGljayIsIG1zdGlja19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyLXdkdC4wIiwgTlVMTCwgd2RvZ19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3Bpb19jbGspCkBAIC03NTEsNiArNzUxLDggQEAKIAljbGtfZW5hYmxlKCZncGlvX2Nsayk7CiAJY2xrX2VuYWJsZSgmZW1pX2Nsayk7CiAJY2xrX2VuYWJsZSgmaWltX2Nsayk7CisJaW14X3ByaW50X3NpbGljb25fcmV2KCJpLk1YMjciLCBteDI3X3JldmlzaW9uKCkpOworCWNsa19kaXNhYmxlKCZpaW1fY2xrKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0xMKSAmJiAhZGVmaW5lZChDT05GSUdfREVCVUdfSUNFRENDKQogCWNsa19lbmFibGUoJnVhcnQxX2Nsayk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYwppbmRleCBkOTczNzcwLi45ODhhMjgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogREVGSU5FX0NMT0NLKGVwaXQxX2NsaywgICAwLCBNWENfQ0NNX0NHUjAsICA2LCBOVUxMLCBOVUxMLCAmcGVyY2xrX2Nsayk7CiBERUZJTkVfQ0xPQ0soZXBpdDJfY2xrLCAgIDEsIE1YQ19DQ01fQ0dSMCwgIDgsIE5VTEwsIE5VTEwsICZwZXJjbGtfY2xrKTsKIERFRklORV9DTE9DSyhpaW1fY2xrLCAgICAgMCwgTVhDX0NDTV9DR1IwLCAxMCwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwotREVGSU5FX0NMT0NLKGF0YV9jbGssICAgICAwLCBNWENfQ0NNX0NHUjAsIDEyLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CitERUZJTkVfQ0xPQ0socGF0YV9jbGssICAgICAwLCBNWENfQ0NNX0NHUjAsIDEyLCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CiBERUZJTkVfQ0xPQ0soc2RtYV9jbGsxLCAgIDAsIE1YQ19DQ01fQ0dSMCwgMTQsIE5VTEwsIE5VTEwsICZhaGJfY2xrKTsKIERFRklORV9DTE9DSyhjc3BpM19jbGssICAgMiwgTVhDX0NDTV9DR1IwLCAxNiwgTlVMTCwgTlVMTCwgJmlwZ19jbGspOwogREVGSU5FX0NMT0NLKHJuZ19jbGssICAgICAwLCBNWENfQ0NNX0NHUjAsIDE4LCBOVUxMLCBOVUxMLCAmaXBnX2Nsayk7CkBAIC01NjIsNyArNTYyLDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJmaXJpIiwgZmlyaV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygicGF0YV9pbXgiLCBOVUxMLCBwYXRhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0aWMiLCBydGljX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJuZyIsIHJuZ19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzMS1zZG1hIiwgTlVMTCwgc2RtYV9jbGsxKQpAQCAtNjExLDExICs2MTEsMTEgQEAKIAljbGtfZW5hYmxlKCZncHRfY2xrKTsKIAljbGtfZW5hYmxlKCZlbWlfY2xrKTsKIAljbGtfZW5hYmxlKCZpaW1fY2xrKTsKKwlteDMxX3JldmlzaW9uKCk7CisJY2xrX2Rpc2FibGUoJmlpbV9jbGspOwogCiAJY2xrX2VuYWJsZSgmc2VyaWFsX3BsbF9jbGspOwogCi0JbXgzMV9yZWFkX2NwdV9yZXYoKTsKLQogCWlmIChteDMxX3JldmlzaW9uKCkgPj0gSU1YX0NISVBfUkVWSVNJT05fMl8wKSB7CiAJCXJlZyA9IF9fcmF3X3JlYWRsKE1YQ19DQ01fUE1DUjEpOwogCQkvKiBObyBQTEwgcmVzdGFydCBvbiBEVkZTIHN3aXRjaDsgZW5hYmxlIGF1dG8gRU1JIGhhbmRzaGFrZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKaW5kZXggODhiNjJhMDcuLjgxMTZmMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYwpAQCAtMzU0LDcgKzM1NCw3IEBACiAJfQogCiBERUZJTkVfQ0xPQ0soYXNyY19jbGssICAgMCwgQ0NNX0NHUjAsICAwLCBOVUxMLCBOVUxMKTsKLURFRklORV9DTE9DSyhhdGFfY2xrLCAgICAwLCBDQ01fQ0dSMCwgIDIsIGdldF9yYXRlX2lwZywgTlVMTCk7CitERUZJTkVfQ0xPQ0socGF0YV9jbGssICAgIDAsIENDTV9DR1IwLCAgMiwgZ2V0X3JhdGVfaXBnLCBOVUxMKTsKIC8qIERFRklORV9DTE9DSyhhdWRtdXhfY2xrLCAwLCBDQ01fQ0dSMCwgIDQsIE5VTEwsIE5VTEwpOyAqLwogREVGSU5FX0NMT0NLKGNhbjFfY2xrLCAgIDAsIENDTV9DR1IwLCAgNiwgZ2V0X3JhdGVfaXBnLCBOVUxMKTsKIERFRklORV9DTE9DSyhjYW4yX2NsaywgICAxLCBDQ01fQ0dSMCwgIDgsIGdldF9yYXRlX2lwZywgTlVMTCk7CkBAIC00NDcsNyArNDQ3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImFzcmMiLCBhc3JjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF0YSIsIGF0YV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJwYXRhX2lteCIsIE5VTEwsIHBhdGFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4wIiwgTlVMTCwgY2FuMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJmbGV4Y2FuLjEiLCBOVUxMLCBjYW4yX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMCIsIE5VTEwsIGNzcGkxX2NsaykKQEAgLTUzNyw3ICs1MzcsOCBAQAogCV9fcmF3X3dyaXRlbChjZ3IzLCBDQ01fQkFTRSArIENDTV9DR1IzKTsKIAogCWNsa19lbmFibGUoJmlpbV9jbGspOwotCW14MzVfcmVhZF9jcHVfcmV2KCk7CisJaW14X3ByaW50X3NpbGljb25fcmV2KCJpLk1YMzUiLCBteDM1X3JldmlzaW9uKCkpOworCWNsa19kaXNhYmxlKCZpaW1fY2xrKTsKIAogI2lmZGVmIENPTkZJR19NWENfVVNFX0VQSVQKIAllcGl0X3RpbWVyX2luaXQoJmVwaXQxX2NsaywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDZxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXg2cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2ExYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXg2cS5jCkBAIC0wLDAgKzEsMjAyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIFBMTF9CQVNFCQlJTVhfSU9fQUREUkVTUyhNWDZRX0FOQVRPUF9CQVNFX0FERFIpCisjZGVmaW5lIFBMTDFfU1lTCQkoUExMX0JBU0UgKyAweDAwMCkKKyNkZWZpbmUgUExMMl9CVVMJCShQTExfQkFTRSArIDB4MDMwKQorI2RlZmluZSBQTEwzX1VTQl9PVEcJCShQTExfQkFTRSArIDB4MDEwKQorI2RlZmluZSBQTEw0X0FVRElPCQkoUExMX0JBU0UgKyAweDA3MCkKKyNkZWZpbmUgUExMNV9WSURFTwkJKFBMTF9CQVNFICsgMHgwYTApCisjZGVmaW5lIFBMTDZfTUxCCQkoUExMX0JBU0UgKyAweDBkMCkKKyNkZWZpbmUgUExMN19VU0JfSE9TVAkJKFBMTF9CQVNFICsgMHgwMjApCisjZGVmaW5lIFBMTDhfRU5FVAkJKFBMTF9CQVNFICsgMHgwZTApCisjZGVmaW5lIFBGRF80ODAJCQkoUExMX0JBU0UgKyAweDBmMCkKKyNkZWZpbmUgUEZEXzUyOAkJCShQTExfQkFTRSArIDB4MTAwKQorI2RlZmluZSBQTExfTlVNX09GRlNFVAkJMHgwMTAKKyNkZWZpbmUgUExMX0RFTk9NX09GRlNFVAkweDAyMAorCisjZGVmaW5lIFBGRDAJCQk3CisjZGVmaW5lIFBGRDEJCQkxNQorI2RlZmluZSBQRkQyCQkJMjMKKyNkZWZpbmUgUEZEMwkJCTMxCisjZGVmaW5lIFBGRF9GUkFDX01BU0sJCTB4M2YKKworI2RlZmluZSBCTV9QTExfQllQQVNTCQkJKDB4MSA8PCAxNikKKyNkZWZpbmUgQk1fUExMX0VOQUJMRQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIEJNX1BMTF9QT1dFUl9ET1dOCQkoMHgxIDw8IDEyKQorI2RlZmluZSBCTV9QTExfTE9DSwkJCSgweDEgPDwgMzEpCisjZGVmaW5lIEJQX1BMTF9TWVNfRElWX1NFTEVDVAkJMAorI2RlZmluZSBCTV9QTExfU1lTX0RJVl9TRUxFQ1QJCSgweDdmIDw8IDApCisjZGVmaW5lIEJQX1BMTF9CVVNfRElWX1NFTEVDVAkJMAorI2RlZmluZSBCTV9QTExfQlVTX0RJVl9TRUxFQ1QJCSgweDEgPDwgMCkKKyNkZWZpbmUgQlBfUExMX1VTQl9ESVZfU0VMRUNUCQkwCisjZGVmaW5lIEJNX1BMTF9VU0JfRElWX1NFTEVDVAkJKDB4MyA8PCAwKQorI2RlZmluZSBCUF9QTExfQVZfRElWX1NFTEVDVAkJMAorI2RlZmluZSBCTV9QTExfQVZfRElWX1NFTEVDVAkJKDB4N2YgPDwgMCkKKyNkZWZpbmUgQlBfUExMX0VORVRfRElWX1NFTEVDVAkJMAorI2RlZmluZSBCTV9QTExfRU5FVF9ESVZfU0VMRUNUCQkoMHgzIDw8IDApCisjZGVmaW5lIEJNX1BMTF9FTkVUX0VOX1BDSUUJCSgweDEgPDwgMTkpCisjZGVmaW5lIEJNX1BMTF9FTkVUX0VOX1NBVEEJCSgweDEgPDwgMjApCisKKyNkZWZpbmUgQ0NNX0JBU0UJSU1YX0lPX0FERFJFU1MoTVg2UV9DQ01fQkFTRV9BRERSKQorI2RlZmluZSBDQ1IJCShDQ01fQkFTRSArIDB4MDApCisjZGVmaW5lIENDRFIJCShDQ01fQkFTRSArIDB4MDQpCisjZGVmaW5lIENTUgkJKENDTV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgQ0NTUgkJKENDTV9CQVNFICsgMHgwYykKKyNkZWZpbmUgQ0FDUlIJCShDQ01fQkFTRSArIDB4MTApCisjZGVmaW5lIENCQ0RSCQkoQ0NNX0JBU0UgKyAweDE0KQorI2RlZmluZSBDQkNNUgkJKENDTV9CQVNFICsgMHgxOCkKKyNkZWZpbmUgQ1NDTVIxCQkoQ0NNX0JBU0UgKyAweDFjKQorI2RlZmluZSBDU0NNUjIJCShDQ01fQkFTRSArIDB4MjApCisjZGVmaW5lIENTQ0RSMQkJKENDTV9CQVNFICsgMHgyNCkKKyNkZWZpbmUgQ1MxQ0RSCQkoQ0NNX0JBU0UgKyAweDI4KQorI2RlZmluZSBDUzJDRFIJCShDQ01fQkFTRSArIDB4MmMpCisjZGVmaW5lIENEQ0RSCQkoQ0NNX0JBU0UgKyAweDMwKQorI2RlZmluZSBDSFNDQ0RSCQkoQ0NNX0JBU0UgKyAweDM0KQorI2RlZmluZSBDU0NEUjIJCShDQ01fQkFTRSArIDB4MzgpCisjZGVmaW5lIENTQ0RSMwkJKENDTV9CQVNFICsgMHgzYykKKyNkZWZpbmUgQ1NDRFI0CQkoQ0NNX0JBU0UgKyAweDQwKQorI2RlZmluZSBDV0RSCQkoQ0NNX0JBU0UgKyAweDQ0KQorI2RlZmluZSBDREhJUFIJCShDQ01fQkFTRSArIDB4NDgpCisjZGVmaW5lIENEQ1IJCShDQ01fQkFTRSArIDB4NGMpCisjZGVmaW5lIENUT1IJCShDQ01fQkFTRSArIDB4NTApCisjZGVmaW5lIENMUENSCQkoQ0NNX0JBU0UgKyAweDU0KQorI2RlZmluZSBDSVNSCQkoQ0NNX0JBU0UgKyAweDU4KQorI2RlZmluZSBDSU1SCQkoQ0NNX0JBU0UgKyAweDVjKQorI2RlZmluZSBDQ09TUgkJKENDTV9CQVNFICsgMHg2MCkKKyNkZWZpbmUgQ0dQUgkJKENDTV9CQVNFICsgMHg2NCkKKyNkZWZpbmUgQ0NHUjAJCShDQ01fQkFTRSArIDB4NjgpCisjZGVmaW5lIENDR1IxCQkoQ0NNX0JBU0UgKyAweDZjKQorI2RlZmluZSBDQ0dSMgkJKENDTV9CQVNFICsgMHg3MCkKKyNkZWZpbmUgQ0NHUjMJCShDQ01fQkFTRSArIDB4NzQpCisjZGVmaW5lIENDR1I0CQkoQ0NNX0JBU0UgKyAweDc4KQorI2RlZmluZSBDQ0dSNQkJKENDTV9CQVNFICsgMHg3YykKKyNkZWZpbmUgQ0NHUjYJCShDQ01fQkFTRSArIDB4ODApCisjZGVmaW5lIENDR1I3CQkoQ0NNX0JBU0UgKyAweDg0KQorI2RlZmluZSBDTUVPUgkJKENDTV9CQVNFICsgMHg4OCkKKworI2RlZmluZSBDRzAJCTAKKyNkZWZpbmUgQ0cxCQkyCisjZGVmaW5lIENHMgkJNAorI2RlZmluZSBDRzMJCTYKKyNkZWZpbmUgQ0c0CQk4CisjZGVmaW5lIENHNQkJMTAKKyNkZWZpbmUgQ0c2CQkxMgorI2RlZmluZSBDRzcJCTE0CisjZGVmaW5lIENHOAkJMTYKKyNkZWZpbmUgQ0c5CQkxOAorI2RlZmluZSBDRzEwCQkyMAorI2RlZmluZSBDRzExCQkyMgorI2RlZmluZSBDRzEyCQkyNAorI2RlZmluZSBDRzEzCQkyNgorI2RlZmluZSBDRzE0CQkyOAorI2RlZmluZSBDRzE1CQkzMAorCisjZGVmaW5lIEJNX0NDU1JfUExMMV9TV19TRUwJCSgweDEgPDwgMikKKyNkZWZpbmUgQk1fQ0NTUl9TVEVQX1NFTAkJKDB4MSA8PCA4KQorCisjZGVmaW5lIEJQX0NBQ1JSX0FSTV9QT0RGCQkwCisjZGVmaW5lIEJNX0NBQ1JSX0FSTV9QT0RGCQkoMHg3IDw8IDApCisKKyNkZWZpbmUgQlBfQ0JDRFJfUEVSSVBIMl9DTEsyX1BPREYJMAorI2RlZmluZSBCTV9DQkNEUl9QRVJJUEgyX0NMSzJfUE9ERgkoMHg3IDw8IDApCisjZGVmaW5lIEJQX0NCQ0RSX01NRENfQ0gxX0FYSV9QT0RGCTMKKyNkZWZpbmUgQk1fQ0JDRFJfTU1EQ19DSDFfQVhJX1BPREYJKDB4NyA8PCAzKQorI2RlZmluZSBCUF9DQkNEUl9BWElfU0VMCQk2CisjZGVmaW5lIEJNX0NCQ0RSX0FYSV9TRUwJCSgweDMgPDwgNikKKyNkZWZpbmUgQlBfQ0JDRFJfSVBHX1BPREYJCTgKKyNkZWZpbmUgQk1fQ0JDRFJfSVBHX1BPREYJCSgweDMgPDwgOCkKKyNkZWZpbmUgQlBfQ0JDRFJfQUhCX1BPREYJCTEwCisjZGVmaW5lIEJNX0NCQ0RSX0FIQl9QT0RGCQkoMHg3IDw8IDEwKQorI2RlZmluZSBCUF9DQkNEUl9BWElfUE9ERgkJMTYKKyNkZWZpbmUgQk1fQ0JDRFJfQVhJX1BPREYJCSgweDcgPDwgMTYpCisjZGVmaW5lIEJQX0NCQ0RSX01NRENfQ0gwX0FYSV9QT0RGCTE5CisjZGVmaW5lIEJNX0NCQ0RSX01NRENfQ0gwX0FYSV9QT0RGCSgweDcgPDwgMTkpCisjZGVmaW5lIEJQX0NCQ0RSX1BFUklQSF9DTEtfU0VMCQkyNQorI2RlZmluZSBCTV9DQkNEUl9QRVJJUEhfQ0xLX1NFTAkJKDB4MSA8PCAyNSkKKyNkZWZpbmUgQlBfQ0JDRFJfUEVSSVBIMl9DTEtfU0VMCTI2CisjZGVmaW5lIEJNX0NCQ0RSX1BFUklQSDJfQ0xLX1NFTAkoMHgxIDw8IDI2KQorI2RlZmluZSBCUF9DQkNEUl9QRVJJUEhfQ0xLMl9QT0RGCTI3CisjZGVmaW5lIEJNX0NCQ0RSX1BFUklQSF9DTEsyX1BPREYJKDB4NyA8PCAyNykKKworI2RlZmluZSBCUF9DQkNNUl9HUFUyRF9BWElfU0VMCQkwCisjZGVmaW5lIEJNX0NCQ01SX0dQVTJEX0FYSV9TRUwJCSgweDEgPDwgMCkKKyNkZWZpbmUgQlBfQ0JDTVJfR1BVM0RfQVhJX1NFTAkJMQorI2RlZmluZSBCTV9DQkNNUl9HUFUzRF9BWElfU0VMCQkoMHgxIDw8IDEpCisjZGVmaW5lIEJQX0NCQ01SX0dQVTNEX0NPUkVfU0VMCQk0CisjZGVmaW5lIEJNX0NCQ01SX0dQVTNEX0NPUkVfU0VMCQkoMHgzIDw8IDQpCisjZGVmaW5lIEJQX0NCQ01SX0dQVTNEX1NIQURFUl9TRUwJOAorI2RlZmluZSBCTV9DQkNNUl9HUFUzRF9TSEFERVJfU0VMCSgweDMgPDwgOCkKKyNkZWZpbmUgQlBfQ0JDTVJfUENJRV9BWElfU0VMCQkxMAorI2RlZmluZSBCTV9DQkNNUl9QQ0lFX0FYSV9TRUwJCSgweDEgPDwgMTApCisjZGVmaW5lIEJQX0NCQ01SX1ZET19BWElfU0VMCQkxMQorI2RlZmluZSBCTV9DQkNNUl9WRE9fQVhJX1NFTAkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgQlBfQ0JDTVJfUEVSSVBIX0NMSzJfU0VMCTEyCisjZGVmaW5lIEJNX0NCQ01SX1BFUklQSF9DTEsyX1NFTAkoMHgzIDw8IDEyKQorI2RlZmluZSBCUF9DQkNNUl9WUFVfQVhJX1NFTAkJMTQKKyNkZWZpbmUgQk1fQ0JDTVJfVlBVX0FYSV9TRUwJCSgweDMgPDwgMTQpCisjZGVmaW5lIEJQX0NCQ01SX0dQVTJEX0NPUkVfU0VMCQkxNgorI2RlZmluZSBCTV9DQkNNUl9HUFUyRF9DT1JFX1NFTAkJKDB4MyA8PCAxNikKKyNkZWZpbmUgQlBfQ0JDTVJfUFJFX1BFUklQSF9DTEtfU0VMCTE4CisjZGVmaW5lIEJNX0NCQ01SX1BSRV9QRVJJUEhfQ0xLX1NFTAkoMHgzIDw8IDE4KQorI2RlZmluZSBCUF9DQkNNUl9QRVJJUEgyX0NMSzJfU0VMCTIwCisjZGVmaW5lIEJNX0NCQ01SX1BFUklQSDJfQ0xLMl9TRUwJKDB4MSA8PCAyMCkKKyNkZWZpbmUgQlBfQ0JDTVJfUFJFX1BFUklQSDJfQ0xLX1NFTAkyMQorI2RlZmluZSBCTV9DQkNNUl9QUkVfUEVSSVBIMl9DTEtfU0VMCSgweDMgPDwgMjEpCisjZGVmaW5lIEJQX0NCQ01SX0dQVTJEX0NPUkVfUE9ERgkyMworI2RlZmluZSBCTV9DQkNNUl9HUFUyRF9DT1JFX1BPREYJKDB4NyA8PCAyMykKKyNkZWZpbmUgQlBfQ0JDTVJfR1BVM0RfQ09SRV9QT0RGCTI2CisjZGVmaW5lIEJNX0NCQ01SX0dQVTNEX0NPUkVfUE9ERgkoMHg3IDw8IDI2KQorI2RlZmluZSBCUF9DQkNNUl9HUFUzRF9TSEFERVJfUE9ERgkyOQorI2RlZmluZSBCTV9DQkNNUl9HUFUzRF9TSEFERVJfUE9ERgkoMHg3IDw8IDI5KQorCisjZGVmaW5lIEJQX0NTQ01SMV9QRVJDTEtfUE9ERgkJMAorI2RlZmluZSBCTV9DU0NNUjFfUEVSQ0xLX1BPREYJCSgweDNmIDw8IDApCisjZGVmaW5lIEJQX0NTQ01SMV9TU0kxX1NFTAkJMTAKKyNkZWZpbmUgQk1fQ1NDTVIxX1NTSTFfU0VMCQkoMHgzIDw8IDEwKQorI2RlZmluZSBCUF9DU0NNUjFfU1NJMl9TRUwJCTEyCisjZGVmaW5lIEJNX0NTQ01SMV9TU0kyX1NFTAkJKDB4MyA8PCAxMikKKyNkZWZpbmUgQlBfQ1NDTVIxX1NTSTNfU0VMCQkxNAorI2RlZmluZSBCTV9DU0NNUjFfU1NJM19TRUwJCSgweDMgPDwgMTQpCisjZGVmaW5lIEJQX0NTQ01SMV9VU0RIQzFfU0VMCQkxNgorI2RlZmluZSBCTV9DU0NNUjFfVVNESEMxX1NFTAkJKDB4MSA8PCAxNikKKyNkZWZpbmUgQlBfQ1NDTVIxX1VTREhDMl9TRUwJCTE3CisjZGVmaW5lIEJNX0NTQ01SMV9VU0RIQzJfU0VMCQkoMHgxIDw8IDE3KQorI2RlZmluZSBCUF9DU0NNUjFfVVNESEMzX1NFTAkJMTgKKyNkZWZpbmUgQk1fQ1NDTVIxX1VTREhDM19TRUwJCSgweDEgPDwgMTgpCisjZGVmaW5lIEJQX0NTQ01SMV9VU0RIQzRfU0VMCQkxOQorI2RlZmluZSBCTV9DU0NNUjFfVVNESEM0X1NFTAkJKDB4MSA8PCAxOSkKKyNkZWZpbmUgQlBfQ1NDTVIxX0VNSV9QT0RGCQkyMAorI2RlZmluZSBCTV9DU0NNUjFfRU1JX1BPREYJCSgweDcgPDwgMjApCisjZGVmaW5lIEJQX0NTQ01SMV9FTUlfU0xPV19QT0RGCQkyMworI2RlZmluZSBCTV9DU0NNUjFfRU1JX1NMT1dfUE9ERgkJKDB4NyA8PCAyMykKKyNkZWZpbmUgQlBfQ1NDTVIxX0VNSV9TRUwJCTI3CisjZGVmaW5lIEJNX0NTQ01SMV9FTUlfU0VMCQkoMHgzIDw8IDI3KQorI2RlZmluZSBCUF9DU0NNUjFfRU1JX1NMT1dfU0VMCQkyOQorI2RlZmluZSBCTV9DU0NNUjFfRU1JX1NMT1dfU0VMCQkoMHgzIDw8IDI5KQorCisjZGVmaW5lIEJQX0NTQ01SMl9DQU5fUE9ERgkJMgorI2RlZmluZSBCTV9DU0NNUjJfQ0FOX1BPREYJCSgweDNmIDw8IDIpCisjZGVmaW5lIEJNX0NTQ01SMl9MREJfREkwX0lQVV9ESVYJKDB4MSA8PCAxMCkKKyNkZWZpbmUgQk1fQ1NDTVIyX0xEQl9ESTFfSVBVX0RJVgkoMHgxIDw8IDExKQorI2RlZmluZSBCUF9DU0NNUjJfRVNBSV9TRUwJCTE5CisjZGVmaW5lIEJNX0NTQ01SMl9FU0FJX1NFTAkJKDB4MyA8PCAxOSkKKworI2RlZmluZSBCUF9DU0NEUjFfVUFSVF9QT0RGCQkwCisjZGVmaW5lIEJNX0NTQ0RSMV9VQVJUX1BPREYJCSgweDNmIDw8IDApCisjZGVmaW5lIEJQX0NTQ0RSMV9VU0RIQzFfUE9ERgkJMTEKKyNkZWZpbmUgQk1fQ1NDRFIxX1VTREhDMV9QT0RGCQkoMHg3IDw8IDExKQorI2RlZmluZSBCUF9DU0NEUjFfVVNESEMyX1BPREYJCTE2CisjZGVmaW5lIEJNX0NTQ0RSMV9VU0RIQzJfUE9ERgkJKDB4NyA8PCAxNikKKyNkZWZpbmUgQlBfQ1NDRFIxX1VTREhDM19QT0RGCQkxOQorI2RlZmluZSBCTV9DU0NEUjFfVVNESEMzX1BPREYJCSgweDcgPDwgMTkpCisjZGVmaW5lIEJQX0NTQ0RSMV9VU0RIQzRfUE9ERgkJMjIKKyNkZWZpbmUgQk1fQ1NDRFIxX1VTREhDNF9QT0RGCQkoMHg3IDw8IDIyKQorI2RlZmluZSBCUF9DU0NEUjFfVlBVX0FYSV9QT0RGCQkyNQorI2RlZmluZSBCTV9DU0NEUjFfVlBVX0FYSV9QT0RGCQkoMHg3IDw8IDI1KQorCisjZGVmaW5lIEJQX0NTMUNEUl9TU0kxX1BPREYJCTAKKyNkZWZpbmUgQk1fQ1MxQ0RSX1NTSTFfUE9ERgkJKDB4M2YgPDwgMCkKKyNkZWZpbmUgQlBfQ1MxQ0RSX1NTSTFfUFJFRAkJNgorI2RlZmluZSBCTV9DUzFDRFJfU1NJMV9QUkVECQkoMHg3IDw8IDYpCisjZGVmaW5lIEJQX0NTMUNEUl9FU0FJX1BSRUQJCTkKKyNkZWZpbmUgQk1fQ1MxQ0RSX0VTQUlfUFJFRAkJKDB4NyA8PCA5KQorI2RlZmluZSBCUF9DUzFDRFJfU1NJM19QT0RGCQkxNgorI2RlZmluZSBCTV9DUzFDRFJfU1NJM19QT0RGCQkoMHgzZiA8PCAxNikKKyNkZWZpbmUgQlBfQ1MxQ0RSX1NTSTNfUFJFRAkJMjIKKyNkZWZpbmUgQk1fQ1MxQ0RSX1NTSTNfUFJFRAkJKDB4NyA8PCAyMikKKyNkZWZpbmUgQlBfQ1MxQ0RSX0VTQUlfUE9ERgkJMjUKKyNkZWZpbmUgQk1fQ1MxQ0RSX0VTQUlfUE9ERgkJKDB4NyA8PCAyNSkKKworI2RlZmluZSBCUF9DUzJDRFJfU1NJMl9QT0RGCQkwCisjZGVmaW5lIEJNX0NTMkNEUl9TU0kyX1BPREYJCSgweDNmIDw8IDApCisjZGVmaW5lIEJQX0NTMkNEUl9TU0kyX1BSRUQJCTYKKyNkZWZpbmUgQk1fQ1MyQ0RSX1NTSTJfUFJFRAkJKDB4NyA8PCA2KQorI2RlZmluZSBCUF9DUzJDRFJfTERCX0RJMF9TRUwJCTkKKyNkZWZpbmUgQk1fQ1MyQ0RSX0xEQl9ESTBfU0VMCQkoMHg3IDw8IDkpCisjZGVmaW5lIEJQX0NTMkNEUl9MREJfREkxX1NFTAkJMTIKKyNkZWZpbmUgQk1fQ1MyQ0RSX0xEQl9ESTFfU0VMCQkoMHg3IDw8IDEyKQorI2RlZmluZSBCUF9DUzJDRFJfRU5GQ19TRUwJCTE2CisjZGVmaW5lIEJNX0NTMkNEUl9FTkZDX1NFTAkJKDB4MyA8PCAxNikKKyNkZWZpbmUgQlBfQ1MyQ0RSX0VORkNfUFJFRAkJMTgKKyNkZWZpbmUgQk1fQ1MyQ0RSX0VORkNfUFJFRAkJKDB4NyA8PCAxOCkKKyNkZWZpbmUgQlBfQ1MyQ0RSX0VORkNfUE9ERgkJMjEKKyNkZWZpbmUgQk1fQ1MyQ0RSX0VORkNfUE9ERgkJKDB4M2YgPDwgMjEpCisKKyNkZWZpbmUgQlBfQ0RDRFJfQVNSQ19TRVJJQUxfU0VMCTcKKyNkZWZpbmUgQk1fQ0RDRFJfQVNSQ19TRVJJQUxfU0VMCSgweDMgPDwgNykKKyNkZWZpbmUgQlBfQ0RDRFJfQVNSQ19TRVJJQUxfUE9ERgk5CisjZGVmaW5lIEJNX0NEQ0RSX0FTUkNfU0VSSUFMX1BPREYJKDB4NyA8PCA5KQorI2RlZmluZSBCUF9DRENEUl9BU1JDX1NFUklBTF9QUkVECTEyCisjZGVmaW5lIEJNX0NEQ0RSX0FTUkNfU0VSSUFMX1BSRUQJKDB4NyA8PCAxMikKKyNkZWZpbmUgQlBfQ0RDRFJfU1BESUZfU0VMCQkyMAorI2RlZmluZSBCTV9DRENEUl9TUERJRl9TRUwJCSgweDMgPDwgMjApCisjZGVmaW5lIEJQX0NEQ0RSX1NQRElGX1BPREYJCTIyCisjZGVmaW5lIEJNX0NEQ0RSX1NQRElGX1BPREYJCSgweDcgPDwgMjIpCisjZGVmaW5lIEJQX0NEQ0RSX1NQRElGX1BSRUQJCTI1CisjZGVmaW5lIEJNX0NEQ0RSX1NQRElGX1BSRUQJCSgweDcgPDwgMjUpCisjZGVmaW5lIEJQX0NEQ0RSX0hTSV9UWF9QT0RGCQkyOQorI2RlZmluZSBCTV9DRENEUl9IU0lfVFhfUE9ERgkJKDB4NyA8PCAyOSkKKyNkZWZpbmUgQlBfQ0RDRFJfSFNJX1RYX1NFTAkJMjgKKyNkZWZpbmUgQk1fQ0RDRFJfSFNJX1RYX1NFTAkJKDB4MSA8PCAyOCkKKworI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkwX1NFTAkJMAorI2RlZmluZSBCTV9DSFNDQ0RSX0lQVTFfREkwX1NFTAkJKDB4NyA8PCAwKQorI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkwX1BSRV9QT0RGCTMKKyNkZWZpbmUgQk1fQ0hTQ0NEUl9JUFUxX0RJMF9QUkVfUE9ERgkoMHg3IDw8IDMpCisjZGVmaW5lIEJQX0NIU0NDRFJfSVBVMV9ESTBfUFJFX1NFTAk2CisjZGVmaW5lIEJNX0NIU0NDRFJfSVBVMV9ESTBfUFJFX1NFTAkoMHg3IDw8IDYpCisjZGVmaW5lIEJQX0NIU0NDRFJfSVBVMV9ESTFfU0VMCQk5CisjZGVmaW5lIEJNX0NIU0NDRFJfSVBVMV9ESTFfU0VMCQkoMHg3IDw8IDkpCisjZGVmaW5lIEJQX0NIU0NDRFJfSVBVMV9ESTFfUFJFX1BPREYJMTIKKyNkZWZpbmUgQk1fQ0hTQ0NEUl9JUFUxX0RJMV9QUkVfUE9ERgkoMHg3IDw8IDEyKQorI2RlZmluZSBCUF9DSFNDQ0RSX0lQVTFfREkxX1BSRV9TRUwJMTUKKyNkZWZpbmUgQk1fQ0hTQ0NEUl9JUFUxX0RJMV9QUkVfU0VMCSgweDcgPDwgMTUpCisKKyNkZWZpbmUgQlBfQ1NDRFIyX0lQVTJfREkwX1NFTAkJMAorI2RlZmluZSBCTV9DU0NEUjJfSVBVMl9ESTBfU0VMCQkoMHg3KQorI2RlZmluZSBCUF9DU0NEUjJfSVBVMl9ESTBfUFJFX1BPREYJMworI2RlZmluZSBCTV9DU0NEUjJfSVBVMl9ESTBfUFJFX1BPREYJKDB4NyA8PCAzKQorI2RlZmluZSBCUF9DU0NEUjJfSVBVMl9ESTBfUFJFX1NFTAk2CisjZGVmaW5lIEJNX0NTQ0RSMl9JUFUyX0RJMF9QUkVfU0VMCSgweDcgPDwgNikKKyNkZWZpbmUgQlBfQ1NDRFIyX0lQVTJfREkxX1NFTAkJOQorI2RlZmluZSBCTV9DU0NEUjJfSVBVMl9ESTFfU0VMCQkoMHg3IDw8IDkpCisjZGVmaW5lIEJQX0NTQ0RSMl9JUFUyX0RJMV9QUkVfUE9ERgkxMgorI2RlZmluZSBCTV9DU0NEUjJfSVBVMl9ESTFfUFJFX1BPREYJKDB4NyA8PCAxMikKKyNkZWZpbmUgQlBfQ1NDRFIyX0lQVTJfREkxX1BSRV9TRUwJMTUKKyNkZWZpbmUgQk1fQ1NDRFIyX0lQVTJfREkxX1BSRV9TRUwJKDB4NyA8PCAxNSkKKyNkZWZpbmUgQlBfQ1NDRFIyX0VDU1BJX0NMS19QT0RGCTE5CisjZGVmaW5lIEJNX0NTQ0RSMl9FQ1NQSV9DTEtfUE9ERgkoMHgzZiA8PCAxOSkKKworI2RlZmluZSBCUF9DU0NEUjNfSVBVMV9IU1BfU0VMCQk5CisjZGVmaW5lIEJNX0NTQ0RSM19JUFUxX0hTUF9TRUwJCSgweDMgPDwgOSkKKyNkZWZpbmUgQlBfQ1NDRFIzX0lQVTFfSFNQX1BPREYJCTExCisjZGVmaW5lIEJNX0NTQ0RSM19JUFUxX0hTUF9QT0RGCQkoMHg3IDw8IDExKQorI2RlZmluZSBCUF9DU0NEUjNfSVBVMl9IU1BfU0VMCQkxNAorI2RlZmluZSBCTV9DU0NEUjNfSVBVMl9IU1BfU0VMCQkoMHgzIDw8IDE0KQorI2RlZmluZSBCUF9DU0NEUjNfSVBVMl9IU1BfUE9ERgkJMTYKKyNkZWZpbmUgQk1fQ1NDRFIzX0lQVTJfSFNQX1BPREYJCSgweDcgPDwgMTYpCisKKyNkZWZpbmUgQk1fQ0RISVBSX0FYSV9QT0RGX0JVU1kJCSgweDEgPDwgMCkKKyNkZWZpbmUgQk1fQ0RISVBSX0FIQl9QT0RGX0JVU1kJCSgweDEgPDwgMSkKKyNkZWZpbmUgQk1fQ0RISVBSX01NRENfQ0gxX1BPREZfQlVTWQkoMHgxIDw8IDIpCisjZGVmaW5lIEJNX0NESElQUl9QRVJJUEgyX1NFTF9CVVNZCSgweDEgPDwgMykKKyNkZWZpbmUgQk1fQ0RISVBSX01NRENfQ0gwX1BPREZfQlVTWQkoMHgxIDw8IDQpCisjZGVmaW5lIEJNX0NESElQUl9QRVJJUEhfU0VMX0JVU1kJKDB4MSA8PCA1KQorI2RlZmluZSBCTV9DREhJUFJfQVJNX1BPREZfQlVTWQkJKDB4MSA8PCAxNikKKworI2RlZmluZSBCUF9DTFBDUl9MUE0JCQkwCisjZGVmaW5lIEJNX0NMUENSX0xQTQkJCSgweDMgPDwgMCkKKyNkZWZpbmUgQk1fQ0xQQ1JfQllQQVNTX1BNSUNfUkVBRFkJKDB4MSA8PCAyKQorI2RlZmluZSBCTV9DTFBDUl9BUk1fQ0xLX0RJU19PTl9MUE0JKDB4MSA8PCA1KQorI2RlZmluZSBCTV9DTFBDUl9TQllPUwkJCSgweDEgPDwgNikKKyNkZWZpbmUgQk1fQ0xQQ1JfRElTX1JFRl9PU0MJCSgweDEgPDwgNykKKyNkZWZpbmUgQk1fQ0xQQ1JfVlNUQlkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIEJQX0NMUENSX1NUQllfQ09VTlQJCTkKKyNkZWZpbmUgQk1fQ0xQQ1JfU1RCWV9DT1VOVAkJKDB4MyA8PCA5KQorI2RlZmluZSBCTV9DTFBDUl9DT1NDX1BXUkRPV04JCSgweDEgPDwgMTEpCisjZGVmaW5lIEJNX0NMUENSX1dCX1BFUl9BVF9MUE0JCSgweDEgPDwgMTYpCisjZGVmaW5lIEJNX0NMUENSX1dCX0NPUkVfQVRfTFBNCQkoMHgxIDw8IDE3KQorI2RlZmluZSBCTV9DTFBDUl9CWVBfTU1EQ19DSDBfTFBNX0hTCSgweDEgPDwgMTkpCisjZGVmaW5lIEJNX0NMUENSX0JZUF9NTURDX0NIMV9MUE1fSFMJKDB4MSA8PCAyMSkKKyNkZWZpbmUgQk1fQ0xQQ1JfTUFTS19DT1JFMF9XRkkJCSgweDEgPDwgMjIpCisjZGVmaW5lIEJNX0NMUENSX01BU0tfQ09SRTFfV0ZJCQkoMHgxIDw8IDIzKQorI2RlZmluZSBCTV9DTFBDUl9NQVNLX0NPUkUyX1dGSQkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgQk1fQ0xQQ1JfTUFTS19DT1JFM19XRkkJCSgweDEgPDwgMjUpCisjZGVmaW5lIEJNX0NMUENSX01BU0tfU0NVX0lETEUJCSgweDEgPDwgMjYpCisjZGVmaW5lIEJNX0NMUENSX01BU0tfTDJDQ19JRExFCQkoMHgxIDw8IDI3KQorCisjZGVmaW5lIEZSRVFfNDgwTQk0ODAwMDAwMDAKKyNkZWZpbmUgRlJFUV81MjhNCTUyODAwMDAwMAorI2RlZmluZSBGUkVRXzU5NE0JNTk0MDAwMDAwCisjZGVmaW5lIEZSRVFfNjUwTQk2NTAwMDAwMDAKKyNkZWZpbmUgRlJFUV8xMzAwTQkxMzAwMDAwMDAwCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDFfc3lzOworc3RhdGljIHN0cnVjdCBjbGsgcGxsMl9idXM7CitzdGF0aWMgc3RydWN0IGNsayBwbGwzX3VzYl9vdGc7CitzdGF0aWMgc3RydWN0IGNsayBwbGw0X2F1ZGlvOworc3RhdGljIHN0cnVjdCBjbGsgcGxsNV92aWRlbzsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDZfbWxiOworc3RhdGljIHN0cnVjdCBjbGsgcGxsN191c2JfaG9zdDsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbDhfZW5ldDsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFwYmhfZG1hX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcGdfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgYWhiX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGF4aV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBtbWRjX2NoMF9heGlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgbW1kY19jaDFfYXhpX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmlwaF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBwZXJpcGhfcHJlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmlwaF9jbGsyX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBlcmlwaDJfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgcGVyaXBoMl9wcmVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgcGVyaXBoMl9jbGsyX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdTJkX2NvcmVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZ3B1M2RfY29yZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBncHUzZF9zaGFkZXJfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXBnX3BlcmNsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGVtaV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBlbWlfc2xvd19jbGs7CitzdGF0aWMgc3RydWN0IGNsayBjYW4xX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnRfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgdXNkaGMxX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzZGhjMl9jbGs7CitzdGF0aWMgc3RydWN0IGNsayB1c2RoYzNfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgdXNkaGM0X2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZwdV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBoc2lfdHhfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1MV9kaTBfcHJlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwdTFfZGkxX3ByZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUyX2RpMF9wcmVfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1Ml9kaTFfcHJlX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwdTFfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgaXB1Ml9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBzc2kxX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNzaTNfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgZXNhaV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBzc2kyX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwZGlmX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFzcmNfc2VyaWFsX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGdwdTJkX2F4aV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBncHUzZF9heGlfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgcGNpZV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayB2ZG9fYXhpX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGxkYl9kaTBfY2xrOworc3RhdGljIHN0cnVjdCBjbGsgbGRiX2RpMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUxX2RpMF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUxX2RpMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUyX2RpMF9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBpcHUyX2RpMV9jbGs7CitzdGF0aWMgc3RydWN0IGNsayBlbmZjX2NsazsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2NsayA9IHt9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHRlcm5hbF9oaWdoX3JlZmVyZW5jZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4dGVybmFsX2xvd19yZWZlcmVuY2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvc2NpbGxhdG9yX3JlZmVyZW5jZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29zY2lsbGF0b3JfcmVmZXJlbmNlX2Nsb2NrX3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBvc2NpbGxhdG9yX3JlZmVyZW5jZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2hpZ2hfcmVmZXJlbmNlX2Nsb2NrX3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBleHRlcm5hbF9oaWdoX3JlZmVyZW5jZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2xvd19yZWZlcmVuY2VfY2xvY2tfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGV4dGVybmFsX2xvd19yZWZlcmVuY2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNraWxfY2xrID0geworCS5nZXRfcmF0ZSA9IGdldF9sb3dfcmVmZXJlbmNlX2Nsb2NrX3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBja2loX2NsayA9IHsKKwkuZ2V0X3JhdGUgPSBnZXRfaGlnaF9yZWZlcmVuY2VfY2xvY2tfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG9zY19jbGsgPSB7CisJLmdldF9yYXRlID0gZ2V0X29zY2lsbGF0b3JfcmVmZXJlbmNlX2Nsb2NrX3JhdGUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGxsX2dldF9yZWdfYWRkcihzdHJ1Y3QgY2xrICpwbGwpCit7CisJaWYgKHBsbCA9PSAmcGxsMV9zeXMpCisJCXJldHVybiBQTEwxX1NZUzsKKwllbHNlIGlmIChwbGwgPT0gJnBsbDJfYnVzKQorCQlyZXR1cm4gUExMMl9CVVM7CisJZWxzZSBpZiAocGxsID09ICZwbGwzX3VzYl9vdGcpCisJCXJldHVybiBQTEwzX1VTQl9PVEc7CisJZWxzZSBpZiAocGxsID09ICZwbGw0X2F1ZGlvKQorCQlyZXR1cm4gUExMNF9BVURJTzsKKwllbHNlIGlmIChwbGwgPT0gJnBsbDVfdmlkZW8pCisJCXJldHVybiBQTEw1X1ZJREVPOworCWVsc2UgaWYgKHBsbCA9PSAmcGxsNl9tbGIpCisJCXJldHVybiBQTEw2X01MQjsKKwllbHNlIGlmIChwbGwgPT0gJnBsbDdfdXNiX2hvc3QpCisJCXJldHVybiBQTEw3X1VTQl9IT1NUOworCWVsc2UgaWYgKHBsbCA9PSAmcGxsOF9lbmV0KQorCQlyZXR1cm4gUExMOF9FTkVUOworCWVsc2UKKwkJQlVHKCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgdGltZW91dCA9IDB4MTAwMDAwOworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiB2YWw7CisKKwlyZWcgPSBwbGxfZ2V0X3JlZ19hZGRyKGNsayk7CisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCAmPSB+Qk1fUExMX0JZUEFTUzsKKwl2YWwgJj0gfkJNX1BMTF9QT1dFUl9ET1dOOworCS8qIDQ4ME1IeiBQTExzIGhhdmUgdGhlIG9wcG9zaXRlIGRlZmluaXRpb24gZm9yIHBvd2VyIGJpdCAqLworCWlmIChjbGsgPT0gJnBsbDNfdXNiX290ZyB8fCBjbGsgPT0gJnBsbDdfdXNiX2hvc3QpCisJCXZhbCB8PSBCTV9QTExfUE9XRVJfRE9XTjsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHJlZyk7CisKKwkvKiBXYWl0IGZvciBQTEwgdG8gbG9jayAqLworCXdoaWxlICghKHJlYWRsX3JlbGF4ZWQocmVnKSAmIEJNX1BMTF9MT0NLKSAmJiAtLXRpbWVvdXQpCisJCWNwdV9yZWxheCgpOworCisJaWYgKHVubGlrZWx5KCF0aW1lb3V0KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEVuYWJsZSB0aGUgUExMIG91dHB1dCBub3cgKi8KKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsIHw9IEJNX1BMTF9FTkFCTEU7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsbF9kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJcmVnID0gcGxsX2dldF9yZWdfYWRkcihjbGspOworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKTsKKwl2YWwgJj0gfkJNX1BMTF9FTkFCTEU7CisJdmFsIHw9IEJNX1BMTF9CWVBBU1M7CisJdmFsIHw9IEJNX1BMTF9QT1dFUl9ET1dOOworCWlmIChjbGsgPT0gJnBsbDNfdXNiX290ZyB8fCBjbGsgPT0gJnBsbDdfdXNiX2hvc3QpCisJCXZhbCAmPSB+Qk1fUExMX1BPV0VSX0RPV047CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGwxX3N5c19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGRpdiA9IChyZWFkbF9yZWxheGVkKFBMTDFfU1lTKSAmIEJNX1BMTF9TWVNfRElWX1NFTEVDVCkgPj4KKwkJICBCUF9QTExfU1lTX0RJVl9TRUxFQ1Q7CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIGRpdiAvIDI7Cit9CisKK3N0YXRpYyBpbnQgcGxsMV9zeXNfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdTMyIHZhbCwgZGl2OworCisJaWYgKHJhdGUgPCBGUkVRXzY1ME0gfHwgcmF0ZSA+IEZSRVFfMTMwME0pCisJCXJldHVybiAtRUlOVkFMOworCisJZGl2ID0gcmF0ZSAqIDIgLyBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoUExMMV9TWVMpOworCXZhbCAmPSB+Qk1fUExMX1NZU19ESVZfU0VMRUNUOworCXZhbCB8PSBkaXYgPDwgQlBfUExMX1NZU19ESVZfU0VMRUNUOworCXdyaXRlbF9yZWxheGVkKHZhbCwgUExMMV9TWVMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbDhfZW5ldF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGRpdiA9IChyZWFkbF9yZWxheGVkKFBMTDhfRU5FVCkgJiBCTV9QTExfRU5FVF9ESVZfU0VMRUNUKSA+PgorCQkgIEJQX1BMTF9FTkVUX0RJVl9TRUxFQ1Q7CisKKwlzd2l0Y2ggKGRpdikgeworCWNhc2UgMDoKKwkJcmV0dXJuIDI1MDAwMDAwOworCWNhc2UgMToKKwkJcmV0dXJuIDUwMDAwMDAwOworCWNhc2UgMjoKKwkJcmV0dXJuIDEwMDAwMDAwMDsKKwljYXNlIDM6CisJCXJldHVybiAxMjUwMDAwMDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxsOF9lbmV0X3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiB2YWwsIGRpdjsKKworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMjUwMDAwMDA6CisJCWRpdiA9IDA7CisJCWJyZWFrOworCWNhc2UgNTAwMDAwMDA6CisJCWRpdiA9IDE7CisJCWJyZWFrOworCWNhc2UgMTAwMDAwMDAwOgorCQlkaXYgPSAyOworCQlicmVhazsKKwljYXNlIDEyNTAwMDAwMDoKKwkJZGl2ID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFsID0gcmVhZGxfcmVsYXhlZChQTEw4X0VORVQpOworCXZhbCAmPSB+Qk1fUExMX0VORVRfRElWX1NFTEVDVDsKKwl2YWwgfD0gZGl2IDw8IEJQX1BMTF9FTkVUX0RJVl9TRUxFQ1Q7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBQTEw4X0VORVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9hdl9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSAoY2xrID09ICZwbGw0X2F1ZGlvKSA/IFBMTDRfQVVESU8gOiBQTEw1X1ZJREVPOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXUzMiBtZm4gPSByZWFkbF9yZWxheGVkKHJlZyArIFBMTF9OVU1fT0ZGU0VUKTsKKwl1MzIgbWZkID0gcmVhZGxfcmVsYXhlZChyZWcgKyBQTExfREVOT01fT0ZGU0VUKTsKKwl1MzIgZGl2ID0gKHJlYWRsX3JlbGF4ZWQocmVnKSAmIEJNX1BMTF9BVl9ESVZfU0VMRUNUKSA+PgorCQkgIEJQX1BMTF9BVl9ESVZfU0VMRUNUOworCisJcmV0dXJuIChwYXJlbnRfcmF0ZSAqIGRpdikgKyAoKHBhcmVudF9yYXRlIC8gbWZkKSAqIG1mbik7Cit9CisKK3N0YXRpYyBpbnQgcGxsX2F2X3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gKGNsayA9PSAmcGxsNF9hdWRpbykgPyBQTEw0X0FVRElPIDogUExMNV9WSURFTzsKKwl1bnNpZ25lZCBpbnQgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXUzMiB2YWwsIGRpdjsKKwl1MzIgbWZuLCBtZmQgPSAxMDAwMDAwOworCXM2NCB0ZW1wNjQ7CisKKwlpZiAocmF0ZSA8IEZSRVFfNjUwTSB8fCByYXRlID4gRlJFUV8xMzAwTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaXYgPSByYXRlIC8gcGFyZW50X3JhdGU7CisJdGVtcDY0ID0gKHU2NCkgKHJhdGUgLSBkaXYgKiBwYXJlbnRfcmF0ZSk7CisJdGVtcDY0ICo9IG1mZDsKKwlkb19kaXYodGVtcDY0LCBwYXJlbnRfcmF0ZSk7CisJbWZuID0gdGVtcDY0OworCisJdmFsID0gcmVhZGxfcmVsYXhlZChyZWcpOworCXZhbCAmPSB+Qk1fUExMX0FWX0RJVl9TRUxFQ1Q7CisJdmFsIHw9IGRpdiA8PCBCUF9QTExfQVZfRElWX1NFTEVDVDsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHJlZyk7CisJd3JpdGVsX3JlbGF4ZWQobWZuLCByZWcgKyBQTExfTlVNX09GRlNFVCk7CisJd3JpdGVsX3JlbGF4ZWQobWZkLCByZWcgKyBQTExfREVOT01fT0ZGU0VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpwbGxfZ2V0X2Rpdl9yZWdfYml0KHN0cnVjdCBjbGsgKmNsaywgdTMyICpicCwgdTMyICpibSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKworCWlmIChjbGsgPT0gJnBsbDJfYnVzKSB7CisJCXJlZyA9IFBMTDJfQlVTOworCQkqYnAgPSBCUF9QTExfQlVTX0RJVl9TRUxFQ1Q7CisJCSpibSA9IEJNX1BMTF9CVVNfRElWX1NFTEVDVDsKKwl9IGVsc2UgaWYgKGNsayA9PSAmcGxsM191c2Jfb3RnKSB7CisJCXJlZyA9IFBMTDNfVVNCX09URzsKKwkJKmJwID0gQlBfUExMX1VTQl9ESVZfU0VMRUNUOworCQkqYm0gPSBCTV9QTExfVVNCX0RJVl9TRUxFQ1Q7CisJfSBlbHNlIGlmIChjbGsgPT0gJnBsbDdfdXNiX2hvc3QpIHsKKwkJcmVnID0gUExMN19VU0JfSE9TVDsKKwkJKmJwID0gQlBfUExMX1VTQl9ESVZfU0VMRUNUOworCQkqYm0gPSBCTV9QTExfVVNCX0RJVl9TRUxFQ1Q7CisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgZGl2LCBicCwgYm07CisKKwlyZWcgPSBwbGxfZ2V0X2Rpdl9yZWdfYml0KGNsaywgJmJwLCAmYm0pOworCWRpdiA9IChyZWFkbF9yZWxheGVkKHJlZykgJiBibSkgPj4gYnA7CisKKwlyZXR1cm4gKGRpdiA9PSAxKSA/IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAyMiA6CisJCQkgICAgY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDIwOworfQorCitzdGF0aWMgaW50IHBsbF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsLCBkaXYsIGJwLCBibTsKKworCWlmIChyYXRlID09IEZSRVFfNTI4TSkKKwkJZGl2ID0gMTsKKwllbHNlIGlmIChyYXRlID09IEZSRVFfNDgwTSkKKwkJZGl2ID0gMDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gcGxsX2dldF9kaXZfcmVnX2JpdChjbGssICZicCwgJmJtKTsKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH5ibTsKKwl2YWwgfD0gZGl2IDw8IGJwOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHBsbDJfYnVzX2dldF9yYXRlCXBsbF9nZXRfcmF0ZQorI2RlZmluZSBwbGwyX2J1c19zZXRfcmF0ZQlwbGxfc2V0X3JhdGUKKyNkZWZpbmUgcGxsM191c2Jfb3RnX2dldF9yYXRlCXBsbF9nZXRfcmF0ZQorI2RlZmluZSBwbGwzX3VzYl9vdGdfc2V0X3JhdGUJcGxsX3NldF9yYXRlCisjZGVmaW5lIHBsbDdfdXNiX2hvc3RfZ2V0X3JhdGUJcGxsX2dldF9yYXRlCisjZGVmaW5lIHBsbDdfdXNiX2hvc3Rfc2V0X3JhdGUJcGxsX3NldF9yYXRlCisjZGVmaW5lIHBsbDRfYXVkaW9fZ2V0X3JhdGUJcGxsX2F2X2dldF9yYXRlCisjZGVmaW5lIHBsbDRfYXVkaW9fc2V0X3JhdGUJcGxsX2F2X3NldF9yYXRlCisjZGVmaW5lIHBsbDVfdmlkZW9fZ2V0X3JhdGUJcGxsX2F2X2dldF9yYXRlCisjZGVmaW5lIHBsbDVfdmlkZW9fc2V0X3JhdGUJcGxsX2F2X3NldF9yYXRlCisjZGVmaW5lIHBsbDZfbWxiX2dldF9yYXRlCU5VTEwKKyNkZWZpbmUgcGxsNl9tbGJfc2V0X3JhdGUJTlVMTAorCisjZGVmaW5lIERFRl9QTEwobmFtZSkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCVwKKwkJLmVuYWJsZQkJPSBwbGxfZW5hYmxlLAkJXAorCQkuZGlzYWJsZQk9IHBsbF9kaXNhYmxlLAkJXAorCQkuZ2V0X3JhdGUJPSBuYW1lIyNfZ2V0X3JhdGUsCVwKKwkJLnNldF9yYXRlCT0gbmFtZSMjX3NldF9yYXRlLAlcCisJCS5wYXJlbnQJCT0gJm9zY19jbGssCQlcCisJfQorCitERUZfUExMKHBsbDFfc3lzKTsKK0RFRl9QTEwocGxsMl9idXMpOworREVGX1BMTChwbGwzX3VzYl9vdGcpOworREVGX1BMTChwbGw0X2F1ZGlvKTsKK0RFRl9QTEwocGxsNV92aWRlbyk7CitERUZfUExMKHBsbDZfbWxiKTsKK0RFRl9QTEwocGxsN191c2JfaG9zdCk7CitERUZfUExMKHBsbDhfZW5ldCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBmZF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTY0IHRtcCA9ICh1NjQpIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAxODsKKwl1MzIgZnJhYywgYnBfZnJhYzsKKworCWlmIChhcGJoX2RtYV9jbGsudXNlY291bnQgPT0gMCkKKwkJYXBiaF9kbWFfY2xrLmVuYWJsZSgmYXBiaF9kbWFfY2xrKTsKKworCWJwX2ZyYWMgPSBjbGstPmVuYWJsZV9zaGlmdCAtIDc7CisJZnJhYyA9IHJlYWRsX3JlbGF4ZWQoY2xrLT5lbmFibGVfcmVnKSA+PiBicF9mcmFjICYgUEZEX0ZSQUNfTUFTSzsKKwlkb19kaXYodG1wLCBmcmFjKTsKKworCXJldHVybiB0bXA7Cit9CisKK3N0YXRpYyBpbnQgcGZkX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiB2YWwsIGZyYWMsIGJwX2ZyYWM7CisJdTY0IHRtcCA9ICh1NjQpIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgKiAxODsKKworCWlmIChhcGJoX2RtYV9jbGsudXNlY291bnQgPT0gMCkKKwkJYXBiaF9kbWFfY2xrLmVuYWJsZSgmYXBiaF9kbWFfY2xrKTsKKworCS8qCisJICogUm91bmQgdXAgdGhlIGRpdmlkZXIgc28gdGhhdCB3ZSBkb24ndCBzZXQgYSByYXRlCisJICogaGlnaGVyIHRoYW4gd2hhdCBpcyByZXF1ZXN0ZWQKKwkgKi8KKwl0bXAgKz0gcmF0ZSAvIDI7CisJZG9fZGl2KHRtcCwgcmF0ZSk7CisJZnJhYyA9IHRtcDsKKwlmcmFjID0gKGZyYWMgPCAxMikgPyAxMiA6IGZyYWM7CisJZnJhYyA9IChmcmFjID4gMzUpID8gMzUgOiBmcmFjOworCisJLyoKKwkgKiBUaGUgZnJhYyBmaWVsZCBhbHdheXMgc3RhcnRzIGZyb20gNyBiaXRzIGxvd2VyCisJICogcG9zaXRpb24gb2YgZW5hYmxlIGJpdAorCSAqLworCWJwX2ZyYWMgPSBjbGstPmVuYWJsZV9zaGlmdCAtIDc7CisJdmFsID0gcmVhZGxfcmVsYXhlZChjbGstPmVuYWJsZV9yZWcpOworCXZhbCAmPSB+KFBGRF9GUkFDX01BU0sgPDwgYnBfZnJhYyk7CisJdmFsIHw9IGZyYWMgPDwgYnBfZnJhYzsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGNsay0+ZW5hYmxlX3JlZyk7CisKKwl0bXAgPSAodTY0KSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMTg7CisJZG9fZGl2KHRtcCwgZnJhYyk7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5kaXNhYmxlKCZhcGJoX2RtYV9jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBmZF9yb3VuZF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXUzMiBmcmFjOworCXU2NCB0bXA7CisKKwl0bXAgPSAodTY0KSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMTg7CisJdG1wICs9IHJhdGUgLyAyOworCWRvX2Rpdih0bXAsIHJhdGUpOworCWZyYWMgPSB0bXA7CisJZnJhYyA9IChmcmFjIDwgMTIpID8gMTIgOiBmcmFjOworCWZyYWMgPSAoZnJhYyA+IDM1KSA/IDM1IDogZnJhYzsKKwl0bXAgPSAodTY0KSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpICogMTg7CisJZG9fZGl2KHRtcCwgZnJhYyk7CisKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IHBmZF9lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2YWw7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5lbmFibGUoJmFwYmhfZG1hX2Nsayk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKGNsay0+ZW5hYmxlX3JlZyk7CisJdmFsICY9IH4oMSA8PCBjbGstPmVuYWJsZV9zaGlmdCk7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBjbGstPmVuYWJsZV9yZWcpOworCisJaWYgKGFwYmhfZG1hX2Nsay51c2Vjb3VudCA9PSAwKQorCQlhcGJoX2RtYV9jbGsuZGlzYWJsZSgmYXBiaF9kbWFfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZmRfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKworCWlmIChhcGJoX2RtYV9jbGsudXNlY291bnQgPT0gMCkKKwkJYXBiaF9kbWFfY2xrLmVuYWJsZSgmYXBiaF9kbWFfY2xrKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoY2xrLT5lbmFibGVfcmVnKTsKKwl2YWwgfD0gMSA8PCBjbGstPmVuYWJsZV9zaGlmdDsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGNsay0+ZW5hYmxlX3JlZyk7CisKKwlpZiAoYXBiaF9kbWFfY2xrLnVzZWNvdW50ID09IDApCisJCWFwYmhfZG1hX2Nsay5kaXNhYmxlKCZhcGJoX2RtYV9jbGspOworfQorCisjZGVmaW5lIERFRl9QRkQobmFtZSwgZXIsIGVzLCBwKQkJCVwKKwlzdGF0aWMgc3RydWN0IGNsayBuYW1lID0gewkJCVwKKwkJLmVuYWJsZV9yZWcJPSBlciwJCQlcCisJCS5lbmFibGVfc2hpZnQJPSBlcywJCQlcCisJCS5lbmFibGUJCT0gcGZkX2VuYWJsZSwJCVwKKwkJLmRpc2FibGUJPSBwZmRfZGlzYWJsZSwJCVwKKwkJLmdldF9yYXRlCT0gcGZkX2dldF9yYXRlLAkJXAorCQkuc2V0X3JhdGUJPSBwZmRfc2V0X3JhdGUsCQlcCisJCS5yb3VuZF9yYXRlCT0gcGZkX3JvdW5kX3JhdGUsCVwKKwkJLnBhcmVudAkJPSBwLAkJCVwKKwl9CisKK0RFRl9QRkQocGxsMl9wZmRfMzUybSwgUEZEXzUyOCwgUEZEMCwgJnBsbDJfYnVzKTsKK0RFRl9QRkQocGxsMl9wZmRfNTk0bSwgUEZEXzUyOCwgUEZEMSwgJnBsbDJfYnVzKTsKK0RFRl9QRkQocGxsMl9wZmRfNDAwbSwgUEZEXzUyOCwgUEZEMiwgJnBsbDJfYnVzKTsKK0RFRl9QRkQocGxsM19wZmRfNzIwbSwgUEZEXzQ4MCwgUEZEMCwgJnBsbDNfdXNiX290Zyk7CitERUZfUEZEKHBsbDNfcGZkXzU0MG0sIFBGRF80ODAsIFBGRDEsICZwbGwzX3VzYl9vdGcpOworREVGX1BGRChwbGwzX3BmZF81MDhtLCBQRkRfNDgwLCBQRkQyLCAmcGxsM191c2Jfb3RnKTsKK0RFRl9QRkQocGxsM19wZmRfNDU0bSwgUEZEXzQ4MCwgUEZEMywgJnBsbDNfdXNiX290Zyk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbDJfMjAwbV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAyOworfQorCitzdGF0aWMgc3RydWN0IGNsayBwbGwyXzIwMG0gPSB7CisJLnBhcmVudCA9ICZwbGwyX3BmZF80MDBtLAorCS5nZXRfcmF0ZSA9IHBsbDJfMjAwbV9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbDNfMTIwbV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyA0OworfQorCitzdGF0aWMgc3RydWN0IGNsayBwbGwzXzEyMG0gPSB7CisJLnBhcmVudCA9ICZwbGwzX3VzYl9vdGcsCisJLmdldF9yYXRlID0gcGxsM18xMjBtX2dldF9yYXRlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsM184MG1fZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gNjsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGxsM184MG0gPSB7CisJLnBhcmVudCA9ICZwbGwzX3VzYl9vdGcsCisJLmdldF9yYXRlID0gcGxsM184MG1fZ2V0X3JhdGUsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGwzXzYwbV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyA4OworfQorCitzdGF0aWMgc3RydWN0IGNsayBwbGwzXzYwbSA9IHsKKwkucGFyZW50ID0gJnBsbDNfdXNiX290ZywKKwkuZ2V0X3JhdGUgPSBwbGwzXzYwbV9nZXRfcmF0ZSwKK307CisKK3N0YXRpYyBpbnQgcGxsMV9zd19jbGtfc2V0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwl1MzIgdmFsID0gcmVhZGxfcmVsYXhlZChDQ1NSKTsKKworCWlmIChwYXJlbnQgPT0gJnBsbDFfc3lzKSB7CisJCXZhbCAmPSB+Qk1fQ0NTUl9QTEwxX1NXX1NFTDsKKwkJdmFsICY9IH5CTV9DQ1NSX1NURVBfU0VMOworCX0gZWxzZSBpZiAocGFyZW50ID09ICZvc2NfY2xrKSB7CisJCXZhbCB8PSBCTV9DQ1NSX1BMTDFfU1dfU0VMOworCQl2YWwgJj0gfkJNX0NDU1JfU1RFUF9TRUw7CisJfSBlbHNlIGlmIChwYXJlbnQgPT0gJnBsbDJfcGZkXzQwMG0pIHsKKwkJdmFsIHw9IEJNX0NDU1JfUExMMV9TV19TRUw7CisJCXZhbCB8PSBCTV9DQ1NSX1NURVBfU0VMOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdyaXRlbF9yZWxheGVkKHZhbCwgQ0NTUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGxsMV9zd19jbGsgPSB7CisJLnBhcmVudCA9ICZwbGwxX3N5cywKKwkuc2V0X3BhcmVudCA9IHBsbDFfc3dfY2xrX3NldF9wYXJlbnQsCit9OworCitzdGF0aWMgdm9pZCBjYWxjX3ByZWRfcG9kZl9kaXZpZGVycyh1MzIgZGl2LCB1MzIgKnByZWQsIHUzMiAqcG9kZikKK3sKKwl1MzIgbWluX3ByZWQsIHRlbXBfcHJlZCwgb2xkX2VyciwgZXJyOworCisJaWYgKGRpdiA+PSA1MTIpIHsKKwkJKnByZWQgPSA4OworCQkqcG9kZiA9IDY0OworCX0gZWxzZSBpZiAoZGl2ID49IDgpIHsKKwkJbWluX3ByZWQgPSAoZGl2IC0gMSkgLyA2NCArIDE7CisJCW9sZF9lcnIgPSA4OworCQlmb3IgKHRlbXBfcHJlZCA9IDg7IHRlbXBfcHJlZCA+PSBtaW5fcHJlZDsgdGVtcF9wcmVkLS0pIHsKKwkJCWVyciA9IGRpdiAlIHRlbXBfcHJlZDsKKwkJCWlmIChlcnIgPT0gMCkgeworCQkJCSpwcmVkID0gdGVtcF9wcmVkOworCQkJCWJyZWFrOworCQkJfQorCQkJZXJyID0gdGVtcF9wcmVkIC0gZXJyOworCQkJaWYgKGVyciA8IG9sZF9lcnIpIHsKKwkJCQlvbGRfZXJyID0gZXJyOworCQkJCSpwcmVkID0gdGVtcF9wcmVkOworCQkJfQorCQl9CisJCSpwb2RmID0gKGRpdiArICpwcmVkIC0gMSkgLyAqcHJlZDsKKwl9IGVsc2UgaWYgKGRpdiA8IDgpIHsKKwkJKnByZWQgPSBkaXY7CisJCSpwb2RmID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiByZWc7CisJcmVnID0gcmVhZGxfcmVsYXhlZChjbGstPmVuYWJsZV9yZWcpOworCXJlZyB8PSAweDMgPDwgY2xrLT5lbmFibGVfc2hpZnQ7CisJd3JpdGVsX3JlbGF4ZWQocmVnLCBjbGstPmVuYWJsZV9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHJlZzsKKwlyZWcgPSByZWFkbF9yZWxheGVkKGNsay0+ZW5hYmxlX3JlZyk7CisJcmVnICY9IH4oMHgzIDw8IGNsay0+ZW5hYmxlX3NoaWZ0KTsKKwl3cml0ZWxfcmVsYXhlZChyZWcsIGNsay0+ZW5hYmxlX3JlZyk7Cit9CisKK3N0cnVjdCBkaXZpZGVyIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIGJwX3ByZWQ7CisJdTMyIGJtX3ByZWQ7CisJdTMyIGJwX3BvZGY7CisJdTMyIGJtX3BvZGY7Cit9OworCisjZGVmaW5lIERFRl9DTEtfRElWMShkLCBjLCByLCBiKQkJCQlcCisJc3RhdGljIHN0cnVjdCBkaXZpZGVyIGQgPSB7CQkJCVwKKwkJLmNsayA9IGMsCQkJCQlcCisJCS5yZWcgPSByLAkJCQkJXAorCQkuYnBfcG9kZiA9IEJQXyMjciMjXyMjYiMjX1BPREYsCQkJXAorCQkuYm1fcG9kZiA9IEJNXyMjciMjXyMjYiMjX1BPREYsCQkJXAorCX0KKworREVGX0NMS19ESVYxKGFybV9kaXYsCQkmYXJtX2NsaywJCUNBQ1JSLAlBUk0pOworREVGX0NMS19ESVYxKGlwZ19kaXYsCQkmaXBnX2NsaywJCUNCQ0RSLAlJUEcpOworREVGX0NMS19ESVYxKGFoYl9kaXYsCQkmYWhiX2NsaywJCUNCQ0RSLAlBSEIpOworREVGX0NMS19ESVYxKGF4aV9kaXYsCQkmYXhpX2NsaywJCUNCQ0RSLAlBWEkpOworREVGX0NMS19ESVYxKG1tZGNfY2gwX2F4aV9kaXYsCSZtbWRjX2NoMF9heGlfY2xrLAlDQkNEUiwJTU1EQ19DSDBfQVhJKTsKK0RFRl9DTEtfRElWMShtbWRjX2NoMV9heGlfZGl2LAkmbW1kY19jaDFfYXhpX2NsaywJQ0JDRFIsCU1NRENfQ0gxX0FYSSk7CitERUZfQ0xLX0RJVjEocGVyaXBoX2NsazJfZGl2LAkmcGVyaXBoX2NsazJfY2xrLAlDQkNEUiwJUEVSSVBIX0NMSzIpOworREVGX0NMS19ESVYxKHBlcmlwaDJfY2xrMl9kaXYsCSZwZXJpcGgyX2NsazJfY2xrLAlDQkNEUiwJUEVSSVBIMl9DTEsyKTsKK0RFRl9DTEtfRElWMShncHUyZF9jb3JlX2RpdiwJJmdwdTJkX2NvcmVfY2xrLAlDQkNNUiwJR1BVMkRfQ09SRSk7CitERUZfQ0xLX0RJVjEoZ3B1M2RfY29yZV9kaXYsCSZncHUzZF9jb3JlX2NsaywJQ0JDTVIsCUdQVTNEX0NPUkUpOworREVGX0NMS19ESVYxKGdwdTNkX3NoYWRlcl9kaXYsCSZncHUzZF9zaGFkZXJfY2xrLAlDQkNNUiwJR1BVM0RfU0hBREVSKTsKK0RFRl9DTEtfRElWMShpcGdfcGVyY2xrX2RpdiwJJmlwZ19wZXJjbGssCQlDU0NNUjEsCVBFUkNMSyk7CitERUZfQ0xLX0RJVjEoZW1pX2RpdiwJCSZlbWlfY2xrLAkJQ1NDTVIxLAlFTUkpOworREVGX0NMS19ESVYxKGVtaV9zbG93X2RpdiwJJmVtaV9zbG93X2NsaywJCUNTQ01SMSwJRU1JX1NMT1cpOworREVGX0NMS19ESVYxKGNhbl9kaXYsCQkmY2FuMV9jbGssCQlDU0NNUjIsCUNBTik7CitERUZfQ0xLX0RJVjEodWFydF9kaXYsCQkmdWFydF9jbGssCQlDU0NEUjEsCVVBUlQpOworREVGX0NMS19ESVYxKHVzZGhjMV9kaXYsCSZ1c2RoYzFfY2xrLAkJQ1NDRFIxLAlVU0RIQzEpOworREVGX0NMS19ESVYxKHVzZGhjMl9kaXYsCSZ1c2RoYzJfY2xrLAkJQ1NDRFIxLAlVU0RIQzIpOworREVGX0NMS19ESVYxKHVzZGhjM19kaXYsCSZ1c2RoYzNfY2xrLAkJQ1NDRFIxLAlVU0RIQzMpOworREVGX0NMS19ESVYxKHVzZGhjNF9kaXYsCSZ1c2RoYzRfY2xrLAkJQ1NDRFIxLAlVU0RIQzQpOworREVGX0NMS19ESVYxKHZwdV9kaXYsCQkmdnB1X2NsaywJCUNTQ0RSMSwJVlBVX0FYSSk7CitERUZfQ0xLX0RJVjEoaHNpX3R4X2RpdiwJJmhzaV90eF9jbGssCQlDRENEUiwJSFNJX1RYKTsKK0RFRl9DTEtfRElWMShpcHUxX2RpMF9wcmVfZGl2LAkmaXB1MV9kaTBfcHJlX2NsaywJQ0hTQ0NEUiwgSVBVMV9ESTBfUFJFKTsKK0RFRl9DTEtfRElWMShpcHUxX2RpMV9wcmVfZGl2LAkmaXB1MV9kaTFfcHJlX2NsaywJQ0hTQ0NEUiwgSVBVMV9ESTFfUFJFKTsKK0RFRl9DTEtfRElWMShpcHUyX2RpMF9wcmVfZGl2LAkmaXB1Ml9kaTBfcHJlX2NsaywJQ1NDRFIyLAlJUFUyX0RJMF9QUkUpOworREVGX0NMS19ESVYxKGlwdTJfZGkxX3ByZV9kaXYsCSZpcHUyX2RpMV9wcmVfY2xrLAlDU0NEUjIsCUlQVTJfREkxX1BSRSk7CitERUZfQ0xLX0RJVjEoaXB1MV9kaXYsCQkmaXB1MV9jbGssCQlDU0NEUjMsCUlQVTFfSFNQKTsKK0RFRl9DTEtfRElWMShpcHUyX2RpdiwJCSZpcHUyX2NsaywJCUNTQ0RSMywJSVBVMl9IU1ApOworCisjZGVmaW5lIERFRl9DTEtfRElWMihkLCBjLCByLCBiKQkJCQlcCisJc3RhdGljIHN0cnVjdCBkaXZpZGVyIGQgPSB7CQkJCVwKKwkJLmNsayA9IGMsCQkJCQlcCisJCS5yZWcgPSByLAkJCQkJXAorCQkuYnBfcHJlZCA9IEJQXyMjciMjXyMjYiMjX1BSRUQsCQkJXAorCQkuYm1fcHJlZCA9IEJNXyMjciMjXyMjYiMjX1BSRUQsCQkJXAorCQkuYnBfcG9kZiA9IEJQXyMjciMjXyMjYiMjX1BPREYsCQkJXAorCQkuYm1fcG9kZiA9IEJNXyMjciMjXyMjYiMjX1BPREYsCQkJXAorCX0KKworREVGX0NMS19ESVYyKHNzaTFfZGl2LAkJJnNzaTFfY2xrLAkJQ1MxQ0RSLAlTU0kxKTsKK0RFRl9DTEtfRElWMihzc2kzX2RpdiwJCSZzc2kzX2NsaywJCUNTMUNEUiwJU1NJMyk7CitERUZfQ0xLX0RJVjIoZXNhaV9kaXYsCQkmZXNhaV9jbGssCQlDUzFDRFIsCUVTQUkpOworREVGX0NMS19ESVYyKHNzaTJfZGl2LAkJJnNzaTJfY2xrLAkJQ1MyQ0RSLAlTU0kyKTsKK0RFRl9DTEtfRElWMihlbmZjX2RpdiwJCSZlbmZjX2NsaywJCUNTMkNEUiwJRU5GQyk7CitERUZfQ0xLX0RJVjIoc3BkaWZfZGl2LAkJJnNwZGlmX2NsaywJCUNEQ0RSLAlTUERJRik7CitERUZfQ0xLX0RJVjIoYXNyY19zZXJpYWxfZGl2LAkmYXNyY19zZXJpYWxfY2xrLAlDRENEUiwJQVNSQ19TRVJJQUwpOworCitzdGF0aWMgc3RydWN0IGRpdmlkZXIgKmRpdmlkZXJzW10gPSB7CisJJmFybV9kaXYsCisJJmlwZ19kaXYsCisJJmFoYl9kaXYsCisJJmF4aV9kaXYsCisJJm1tZGNfY2gwX2F4aV9kaXYsCisJJm1tZGNfY2gxX2F4aV9kaXYsCisJJnBlcmlwaF9jbGsyX2RpdiwKKwkmcGVyaXBoMl9jbGsyX2RpdiwKKwkmZ3B1MmRfY29yZV9kaXYsCisJJmdwdTNkX2NvcmVfZGl2LAorCSZncHUzZF9zaGFkZXJfZGl2LAorCSZpcGdfcGVyY2xrX2RpdiwKKwkmZW1pX2RpdiwKKwkmZW1pX3Nsb3dfZGl2LAorCSZjYW5fZGl2LAorCSZ1YXJ0X2RpdiwKKwkmdXNkaGMxX2RpdiwKKwkmdXNkaGMyX2RpdiwKKwkmdXNkaGMzX2RpdiwKKwkmdXNkaGM0X2RpdiwKKwkmdnB1X2RpdiwKKwkmaHNpX3R4X2RpdiwKKwkmaXB1MV9kaTBfcHJlX2RpdiwKKwkmaXB1MV9kaTFfcHJlX2RpdiwKKwkmaXB1Ml9kaTBfcHJlX2RpdiwKKwkmaXB1Ml9kaTFfcHJlX2RpdiwKKwkmaXB1MV9kaXYsCisJJmlwdTJfZGl2LAorCSZzc2kxX2RpdiwKKwkmc3NpM19kaXYsCisJJmVzYWlfZGl2LAorCSZzc2kyX2RpdiwKKwkmZW5mY19kaXYsCisJJnNwZGlmX2RpdiwKKwkmYXNyY19zZXJpYWxfZGl2LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGRiX2RpX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQoQ1NDTVIyKTsKKworCXZhbCAmPSAoY2xrID09ICZsZGJfZGkwX2NsaykgPyBCTV9DU0NNUjJfTERCX0RJMF9JUFVfRElWIDoKKwkJCQkgICAgICAgQk1fQ1NDTVIyX0xEQl9ESTFfSVBVX0RJVjsKKwlpZiAodmFsKQorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAvIDc7CisJZWxzZQorCQlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KSAqIDIgLyA3OworfQorCitzdGF0aWMgaW50IGxkYl9kaV9jbGtfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQoQ1NDTVIyKTsKKworCWlmIChyYXRlICogNyA8PSBwYXJlbnRfcmF0ZSArIHBhcmVudF9yYXRlIC8gMjApCisJCXZhbCB8PSBCTV9DU0NNUjJfTERCX0RJMF9JUFVfRElWOworCWVsc2UKKwkJdmFsICY9IH5CTV9DU0NNUjJfTERCX0RJMF9JUFVfRElWOworCisJd3JpdGVsX3JlbGF4ZWQodmFsLCBDU0NNUjIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxkYl9kaV9jbGtfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKworCWlmIChyYXRlICogNyA8PSBwYXJlbnRfcmF0ZSArIHBhcmVudF9yYXRlIC8gMjApCisJCXJldHVybiBwYXJlbnRfcmF0ZSAvIDc7CisJZWxzZQorCQlyZXR1cm4gMiAqIHBhcmVudF9yYXRlIC8gNzsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJc3RydWN0IGRpdmlkZXIgKmQ7CisJdTMyIHZhbCwgcHJlZCwgcG9kZjsKKwlpbnQgaSwgbnVtOworCisJaWYgKGNsayA9PSAmbGRiX2RpMF9jbGsgfHwgY2xrID09ICZsZGJfZGkxX2NsaykKKwkJcmV0dXJuIGxkYl9kaV9jbGtfZ2V0X3JhdGUoY2xrKTsKKworCW51bSA9IEFSUkFZX1NJWkUoZGl2aWRlcnMpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJaWYgKGRpdmlkZXJzW2ldLT5jbGsgPT0gY2xrKSB7CisJCQlkID0gZGl2aWRlcnNbaV07CisJCQlicmVhazsKKwkJfQorCWlmIChpID09IG51bSkKKwkJcmV0dXJuIGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKGQtPnJlZyk7CisJcHJlZCA9ICgodmFsICYgZC0+Ym1fcHJlZCkgPj4gZC0+YnBfcHJlZCkgKyAxOworCXBvZGYgPSAoKHZhbCAmIGQtPmJtX3BvZGYpID4+IGQtPmJwX3BvZGYpICsgMTsKKworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpIC8gKHByZWQgKiBwb2RmKTsKK30KKworc3RhdGljIGludCBjbGtfYnVzeV93YWl0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgdGltZW91dCA9IDB4MTAwMDAwOworCXUzMiBibTsKKworCWlmIChjbGsgPT0gJmF4aV9jbGspCisJCWJtID0gQk1fQ0RISVBSX0FYSV9QT0RGX0JVU1k7CisJZWxzZSBpZiAoY2xrID09ICZhaGJfY2xrKQorCQlibSA9IEJNX0NESElQUl9BSEJfUE9ERl9CVVNZOworCWVsc2UgaWYgKGNsayA9PSAmbW1kY19jaDBfYXhpX2NsaykKKwkJYm0gPSBCTV9DREhJUFJfTU1EQ19DSDBfUE9ERl9CVVNZOworCWVsc2UgaWYgKGNsayA9PSAmcGVyaXBoX2NsaykKKwkJYm0gPSBCTV9DREhJUFJfUEVSSVBIX1NFTF9CVVNZOworCWVsc2UgaWYgKGNsayA9PSAmYXJtX2NsaykKKwkJYm0gPSBCTV9DREhJUFJfQVJNX1BPREZfQlVTWTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKChyZWFkbF9yZWxheGVkKENESElQUikgJiBibSkgJiYgLS10aW1lb3V0KQorCQljcHVfcmVsYXgoKTsKKworCWlmICh1bmxpa2VseSghdGltZW91dCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXN0cnVjdCBkaXZpZGVyICpkOworCXUzMiB2YWwsIGRpdiwgbWF4X2RpdiwgcHJlZCA9IDAsIHBvZGY7CisJaW50IGksIG51bTsKKworCWlmIChjbGsgPT0gJmxkYl9kaTBfY2xrIHx8IGNsayA9PSAmbGRiX2RpMV9jbGspCisJCXJldHVybiBsZGJfZGlfY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7CisKKwludW0gPSBBUlJBWV9TSVpFKGRpdmlkZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWlmIChkaXZpZGVyc1tpXS0+Y2xrID09IGNsaykgeworCQkJZCA9IGRpdmlkZXJzW2ldOworCQkJYnJlYWs7CisJCX0KKwlpZiAoaSA9PSBudW0pCisJCXJldHVybiAtRUlOVkFMOworCisJbWF4X2RpdiA9ICgoZC0+Ym1fcHJlZCA+PiBkLT5icF9wcmVkKSArIDEpICoKKwkJICAoKGQtPmJtX3BvZGYgPj4gZC0+YnBfcG9kZikgKyAxKTsKKworCWRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKwlpZiAoZGl2ID09IDApCisJCWRpdisrOworCisJaWYgKChwYXJlbnRfcmF0ZSAvIGRpdiAhPSByYXRlKSB8fCBkaXYgPiBtYXhfZGl2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkLT5ibV9wcmVkKSB7CisJCWNhbGNfcHJlZF9wb2RmX2RpdmlkZXJzKGRpdiwgJnByZWQsICZwb2RmKTsKKwl9IGVsc2UgeworCQlwcmVkID0gMTsKKwkJcG9kZiA9IGRpdjsKKwl9CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKGQtPnJlZyk7CisJdmFsICY9IH4oZC0+Ym1fcHJlZCB8IGQtPmJtX3BvZGYpOworCXZhbCB8PSAocHJlZCAtIDEpIDw8IGQtPmJwX3ByZWQgfCAocG9kZiAtIDEpIDw8IGQtPmJwX3BvZGY7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBkLT5yZWcpOworCisJaWYgKGNsayA9PSAmYXhpX2NsayB8fCBjbGsgPT0gJmFoYl9jbGsgfHwKKwkgICAgY2xrID09ICZtbWRjX2NoMF9heGlfY2xrIHx8IGNsayA9PSAmYXJtX2NsaykKKwkJcmV0dXJuIGNsa19idXN5X3dhaXQoY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdTMyIGRpdiA9IHBhcmVudF9yYXRlIC8gcmF0ZTsKKwl1MzIgZGl2X21heCwgcHJlZCA9IDAsIHBvZGY7CisJc3RydWN0IGRpdmlkZXIgKmQ7CisJaW50IGksIG51bTsKKworCWlmIChjbGsgPT0gJmxkYl9kaTBfY2xrIHx8IGNsayA9PSAmbGRiX2RpMV9jbGspCisJCXJldHVybiBsZGJfZGlfY2xrX3JvdW5kX3JhdGUoY2xrLCByYXRlKTsKKworCW51bSA9IEFSUkFZX1NJWkUoZGl2aWRlcnMpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJaWYgKGRpdmlkZXJzW2ldLT5jbGsgPT0gY2xrKSB7CisJCQlkID0gZGl2aWRlcnNbaV07CisJCQlicmVhazsKKwkJfQorCWlmIChpID09IG51bSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGl2ID09IDAgfHwgcGFyZW50X3JhdGUgJSByYXRlKQorCQlkaXYrKzsKKworCWlmIChkLT5ibV9wcmVkKSB7CisJCWNhbGNfcHJlZF9wb2RmX2RpdmlkZXJzKGRpdiwgJnByZWQsICZwb2RmKTsKKwkJZGl2ID0gcHJlZCAqIHBvZGY7CisJfSBlbHNlIHsKKwkJZGl2X21heCA9IChkLT5ibV9wb2RmID4+IGQtPmJwX3BvZGYpICsgMTsKKwkJaWYgKGRpdiA+IGRpdl9tYXgpCisJCQlkaXYgPSBkaXZfbWF4OworCX0KKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIGRpdjsKK30KKworc3RydWN0IG11bHRpcGxleGVyIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIGJwOworCXUzMiBibTsKKwlpbnQgcG51bTsKKwlzdHJ1Y3QgY2xrICpwYXJlbnRzW107Cit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGF4aV9tdXggPSB7CisJLmNsayA9ICZheGlfY2xrLAorCS5yZWcgPSBDQkNEUiwKKwkuYnAgPSBCUF9DQkNEUl9BWElfU0VMLAorCS5ibSA9IEJNX0NCQ0RSX0FYSV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwZXJpcGhfY2xrLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJJnBsbDNfcGZkXzU0MG0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBwZXJpcGhfbXV4ID0geworCS5jbGsgPSAmcGVyaXBoX2NsaywKKwkucmVnID0gQ0JDRFIsCisJLmJwID0gQlBfQ0JDRFJfUEVSSVBIX0NMS19TRUwsCisJLmJtID0gQk1fQ0JDRFJfUEVSSVBIX0NMS19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwZXJpcGhfcHJlX2NsaywKKwkJJnBlcmlwaF9jbGsyX2NsaywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHBlcmlwaF9wcmVfbXV4ID0geworCS5jbGsgPSAmcGVyaXBoX3ByZV9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX1BSRV9QRVJJUEhfQ0xLX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9QUkVfUEVSSVBIX0NMS19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwbGwyX2J1cywKKwkJJnBsbDJfcGZkXzQwMG0sCisJCSZwbGwyX3BmZF8zNTJtLAorCQkmcGxsMl8yMDBtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgcGVyaXBoX2NsazJfbXV4ID0geworCS5jbGsgPSAmcGVyaXBoX2NsazJfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9QRVJJUEhfQ0xLMl9TRUwsCisJLmJtID0gQk1fQ0JDTVJfUEVSSVBIX0NMSzJfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsM191c2Jfb3RnLAorCQkmb3NjX2NsaywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHBlcmlwaDJfbXV4ID0geworCS5jbGsgPSAmcGVyaXBoMl9jbGssCisJLnJlZyA9IENCQ0RSLAorCS5icCA9IEJQX0NCQ0RSX1BFUklQSDJfQ0xLX1NFTCwKKwkuYm0gPSBCTV9DQkNEUl9QRVJJUEgyX0NMS19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwZXJpcGgyX3ByZV9jbGssCisJCSZwZXJpcGgyX2NsazJfY2xrLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgcGVyaXBoMl9wcmVfbXV4ID0geworCS5jbGsgPSAmcGVyaXBoMl9wcmVfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9QUkVfUEVSSVBIMl9DTEtfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1BSRV9QRVJJUEgyX0NMS19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwbGwyX2J1cywKKwkJJnBsbDJfcGZkXzQwMG0sCisJCSZwbGwyX3BmZF8zNTJtLAorCQkmcGxsMl8yMDBtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgcGVyaXBoMl9jbGsyX211eCA9IHsKKwkuY2xrID0gJnBlcmlwaDJfY2xrMl9jbGssCisJLnJlZyA9IENCQ01SLAorCS5icCA9IEJQX0NCQ01SX1BFUklQSDJfQ0xLMl9TRUwsCisJLmJtID0gQk1fQ0JDTVJfUEVSSVBIMl9DTEsyX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDNfdXNiX290ZywKKwkJJm9zY19jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBncHUyZF9heGlfbXV4ID0geworCS5jbGsgPSAmZ3B1MmRfYXhpX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfR1BVMkRfQVhJX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9HUFUyRF9BWElfU0VMLAorCS5wYXJlbnRzID0geworCQkmYXhpX2NsaywKKwkJJmFoYl9jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBncHUzZF9heGlfbXV4ID0geworCS5jbGsgPSAmZ3B1M2RfYXhpX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfR1BVM0RfQVhJX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9HUFUzRF9BWElfU0VMLAorCS5wYXJlbnRzID0geworCQkmYXhpX2NsaywKKwkJJmFoYl9jbGssCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBncHUzZF9jb3JlX211eCA9IHsKKwkuY2xrID0gJmdwdTNkX2NvcmVfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9HUFUzRF9DT1JFX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9HUFUzRF9DT1JFX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJm1tZGNfY2gwX2F4aV9jbGssCisJCSZwbGwzX3VzYl9vdGcsCisJCSZwbGwyX3BmZF81OTRtLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGdwdTNkX3NoYWRlcl9tdXggPSB7CisJLmNsayA9ICZncHUzZF9zaGFkZXJfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9HUFUzRF9TSEFERVJfU0VMLAorCS5ibSA9IEJNX0NCQ01SX0dQVTNEX1NIQURFUl9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZtbWRjX2NoMF9heGlfY2xrLAorCQkmcGxsM191c2Jfb3RnLAorCQkmcGxsMl9wZmRfNTk0bSwKKwkJJnBsbDNfcGZkXzcyMG0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBwY2llX2F4aV9tdXggPSB7CisJLmNsayA9ICZwY2llX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfUENJRV9BWElfU0VMLAorCS5ibSA9IEJNX0NCQ01SX1BDSUVfQVhJX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZhaGJfY2xrLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgdmRvX2F4aV9tdXggPSB7CisJLmNsayA9ICZ2ZG9fYXhpX2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfVkRPX0FYSV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfVkRPX0FYSV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmYWhiX2NsaywKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIHZwdV9heGlfbXV4ID0geworCS5jbGsgPSAmdnB1X2NsaywKKwkucmVnID0gQ0JDTVIsCisJLmJwID0gQlBfQ0JDTVJfVlBVX0FYSV9TRUwsCisJLmJtID0gQk1fQ0JDTVJfVlBVX0FYSV9TRUwsCisJLnBhcmVudHMgPSB7CisJCSZheGlfY2xrLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJJnBsbDJfcGZkXzM1Mm0sCisJCU5VTEwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBncHUyZF9jb3JlX211eCA9IHsKKwkuY2xrID0gJmdwdTJkX2NvcmVfY2xrLAorCS5yZWcgPSBDQkNNUiwKKwkuYnAgPSBCUF9DQkNNUl9HUFUyRF9DT1JFX1NFTCwKKwkuYm0gPSBCTV9DQkNNUl9HUFUyRF9DT1JFX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZwbGwzX3VzYl9vdGcsCisJCSZwbGwyX3BmZF8zNTJtLAorCQkmcGxsMl9wZmRfNDAwbSwKKwkJTlVMTAorCX0sCit9OworCisjZGVmaW5lIERFRl9TU0lfTVVYKGlkKQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBtdWx0aXBsZXhlciBzc2kjI2lkIyNfbXV4ID0gewkJCVwKKwkJLmNsayA9ICZzc2kjI2lkIyNfY2xrLAkJCQkJXAorCQkucmVnID0gQ1NDTVIxLAkJCQkJCVwKKwkJLmJwID0gQlBfQ1NDTVIxX1NTSSMjaWQjI19TRUwsCQkJCVwKKwkJLmJtID0gQk1fQ1NDTVIxX1NTSSMjaWQjI19TRUwsCQkJCVwKKwkJLnBhcmVudHMgPSB7CQkJCQkJXAorCQkJJnBsbDNfcGZkXzUwOG0sCQkJCQlcCisJCQkmcGxsM19wZmRfNDU0bSwJCQkJCVwKKwkJCSZwbGw0X2F1ZGlvLAkJCQkJXAorCQkJTlVMTAkJCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworREVGX1NTSV9NVVgoMSk7CitERUZfU1NJX01VWCgyKTsKK0RFRl9TU0lfTVVYKDMpOworCisjZGVmaW5lIERFRl9VU0RIQ19NVVgoaWQpCQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgdXNkaGMjI2lkIyNfbXV4ID0gewkJCVwKKwkJLmNsayA9ICZ1c2RoYyMjaWQjI19jbGssCQkJCVwKKwkJLnJlZyA9IENTQ01SMSwJCQkJCQlcCisJCS5icCA9IEJQX0NTQ01SMV9VU0RIQyMjaWQjI19TRUwsCQkJXAorCQkuYm0gPSBCTV9DU0NNUjFfVVNESEMjI2lkIyNfU0VMLAkJCVwKKwkJLnBhcmVudHMgPSB7CQkJCQkJXAorCQkJJnBsbDJfcGZkXzQwMG0sCQkJCQlcCisJCQkmcGxsMl9wZmRfMzUybSwJCQkJCVwKKwkJCU5VTEwJCQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK0RFRl9VU0RIQ19NVVgoMSk7CitERUZfVVNESENfTVVYKDIpOworREVGX1VTREhDX01VWCgzKTsKK0RFRl9VU0RIQ19NVVgoNCk7CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZW1pX211eCA9IHsKKwkuY2xrID0gJmVtaV9jbGssCisJLnJlZyA9IENTQ01SMSwKKwkuYnAgPSBCUF9DU0NNUjFfRU1JX1NFTCwKKwkuYm0gPSBCTV9DU0NNUjFfRU1JX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZwbGwzX3VzYl9vdGcsCisJCSZwbGwyX3BmZF80MDBtLAorCQkmcGxsMl9wZmRfMzUybSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGVtaV9zbG93X211eCA9IHsKKwkuY2xrID0gJmVtaV9zbG93X2NsaywKKwkucmVnID0gQ1NDTVIxLAorCS5icCA9IEJQX0NTQ01SMV9FTUlfU0xPV19TRUwsCisJLmJtID0gQk1fQ1NDTVIxX0VNSV9TTE9XX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJmF4aV9jbGssCisJCSZwbGwzX3VzYl9vdGcsCisJCSZwbGwyX3BmZF80MDBtLAorCQkmcGxsMl9wZmRfMzUybSwKKwkJTlVMTAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGVzYWlfbXV4ID0geworCS5jbGsgPSAmZXNhaV9jbGssCisJLnJlZyA9IENTQ01SMiwKKwkuYnAgPSBCUF9DU0NNUjJfRVNBSV9TRUwsCisJLmJtID0gQk1fQ1NDTVIyX0VTQUlfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsNF9hdWRpbywKKwkJJnBsbDNfcGZkXzUwOG0sCisJCSZwbGwzX3BmZF80NTRtLAorCQkmcGxsM191c2Jfb3RnLAorCQlOVUxMCisJfSwKK307CisKKyNkZWZpbmUgREVGX0xEQl9ESV9NVVgoaWQpCQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgbGRiX2RpIyNpZCMjX211eCA9IHsJCQlcCisJCS5jbGsgPSAmbGRiX2RpIyNpZCMjX2NsaywJCQkJXAorCQkucmVnID0gQ1MyQ0RSLAkJCQkJCVwKKwkJLmJwID0gQlBfQ1MyQ0RSX0xEQl9ESSMjaWQjI19TRUwsCQkJXAorCQkuYm0gPSBCTV9DUzJDRFJfTERCX0RJIyNpZCMjX1NFTCwJCQlcCisJCS5wYXJlbnRzID0gewkJCQkJCVwKKwkJCSZwbGw1X3ZpZGVvLAkJCQkJXAorCQkJJnBsbDJfcGZkXzM1Mm0sCQkJCQlcCisJCQkmcGxsMl9wZmRfNDAwbSwJCQkJCVwKKwkJCSZwbGwzX3BmZF81NDBtLAkJCQkJXAorCQkJJnBsbDNfdXNiX290ZywJCQkJCVwKKwkJCU5VTEwJCQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK0RFRl9MREJfRElfTVVYKDApOworREVGX0xEQl9ESV9NVVgoMSk7CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgZW5mY19tdXggPSB7CisJLmNsayA9ICZlbmZjX2NsaywKKwkucmVnID0gQ1MyQ0RSLAorCS5icCA9IEJQX0NTMkNEUl9FTkZDX1NFTCwKKwkuYm0gPSBCTV9DUzJDRFJfRU5GQ19TRUwsCisJLnBhcmVudHMgPSB7CisJCSZwbGwyX3BmZF8zNTJtLAorCQkmcGxsMl9idXMsCisJCSZwbGwzX3VzYl9vdGcsCisJCSZwbGwyX3BmZF80MDBtLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgc3BkaWZfbXV4ID0geworCS5jbGsgPSAmc3BkaWZfY2xrLAorCS5yZWcgPSBDRENEUiwKKwkuYnAgPSBCUF9DRENEUl9TUERJRl9TRUwsCisJLmJtID0gQk1fQ0RDRFJfU1BESUZfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsNF9hdWRpbywKKwkJJnBsbDNfcGZkXzUwOG0sCisJCSZwbGwzX3BmZF80NTRtLAorCQkmcGxsM191c2Jfb3RnLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgYXNyY19zZXJpYWxfbXV4ID0geworCS5jbGsgPSAmYXNyY19zZXJpYWxfY2xrLAorCS5yZWcgPSBDRENEUiwKKwkuYnAgPSBCUF9DRENEUl9BU1JDX1NFUklBTF9TRUwsCisJLmJtID0gQk1fQ0RDRFJfQVNSQ19TRVJJQUxfU0VMLAorCS5wYXJlbnRzID0geworCQkmcGxsNF9hdWRpbywKKwkJJnBsbDNfcGZkXzUwOG0sCisJCSZwbGwzX3BmZF80NTRtLAorCQkmcGxsM191c2Jfb3RnLAorCQlOVUxMCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXVsdGlwbGV4ZXIgaHNpX3R4X211eCA9IHsKKwkuY2xrID0gJmhzaV90eF9jbGssCisJLnJlZyA9IENEQ0RSLAorCS5icCA9IEJQX0NEQ0RSX0hTSV9UWF9TRUwsCisJLmJtID0gQk1fQ0RDRFJfSFNJX1RYX1NFTCwKKwkucGFyZW50cyA9IHsKKwkJJnBsbDNfMTIwbSwKKwkJJnBsbDJfcGZkXzQwMG0sCisJCU5VTEwKKwl9LAorfTsKKworI2RlZmluZSBERUZfSVBVX0RJX1BSRV9NVVgociwgaSwgZCkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGlwdSMjaSMjX2RpIyNkIyNfcHJlX211eCA9IHsJCVwKKwkJLmNsayA9ICZpcHUjI2kjI19kaSMjZCMjX3ByZV9jbGssCQkJXAorCQkucmVnID0gciwJCQkJCQlcCisJCS5icCA9IEJQXyMjciMjX0lQVSMjaSMjX0RJIyNkIyNfUFJFX1NFTCwJCVwKKwkJLmJtID0gQk1fIyNyIyNfSVBVIyNpIyNfREkjI2QjI19QUkVfU0VMLAkJXAorCQkucGFyZW50cyA9IHsJCQkJCQlcCisJCQkmbW1kY19jaDBfYXhpX2NsaywJCQkJXAorCQkJJnBsbDNfdXNiX290ZywJCQkJCVwKKwkJCSZwbGw1X3ZpZGVvLAkJCQkJXAorCQkJJnBsbDJfcGZkXzM1Mm0sCQkJCQlcCisJCQkmcGxsMl9wZmRfNDAwbSwJCQkJCVwKKwkJCSZwbGwzX3BmZF81NDBtLAkJCQkJXAorCQkJTlVMTAkJCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworREVGX0lQVV9ESV9QUkVfTVVYKENIU0NDRFIsIDEsIDApOworREVGX0lQVV9ESV9QUkVfTVVYKENIU0NDRFIsIDEsIDEpOworREVGX0lQVV9ESV9QUkVfTVVYKENTQ0RSMiwgMiwgMCk7CitERUZfSVBVX0RJX1BSRV9NVVgoQ1NDRFIyLCAyLCAxKTsKKworI2RlZmluZSBERUZfSVBVX0RJX01VWChyLCBpLCBkKQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGlwdSMjaSMjX2RpIyNkIyNfbXV4ID0gewkJXAorCQkuY2xrID0gJmlwdSMjaSMjX2RpIyNkIyNfY2xrLAkJCQlcCisJCS5yZWcgPSByLAkJCQkJCVwKKwkJLmJwID0gQlBfIyNyIyNfSVBVIyNpIyNfREkjI2QjI19TRUwsCQkJXAorCQkuYm0gPSBCTV8jI3IjI19JUFUjI2kjI19ESSMjZCMjX1NFTCwJCQlcCisJCS5wYXJlbnRzID0gewkJCQkJCVwKKwkJCSZpcHUjI2kjI19kaSMjZCMjX3ByZV9jbGssCQkJXAorCQkJJmR1bW15X2NsaywJCQkJCVwKKwkJCSZkdW1teV9jbGssCQkJCQlcCisJCQkmbGRiX2RpMF9jbGssCQkJCQlcCisJCQkmbGRiX2RpMV9jbGssCQkJCQlcCisJCQlOVUxMCQkJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitERUZfSVBVX0RJX01VWChDSFNDQ0RSLCAxLCAwKTsKK0RFRl9JUFVfRElfTVVYKENIU0NDRFIsIDEsIDEpOworREVGX0lQVV9ESV9NVVgoQ1NDRFIyLCAyLCAwKTsKK0RFRl9JUFVfRElfTVVYKENTQ0RSMiwgMiwgMSk7CisKKyNkZWZpbmUgREVGX0lQVV9NVVgoaWQpCQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyIGlwdSMjaWQjI19tdXggPSB7CQkJXAorCQkuY2xrID0gJmlwdSMjaWQjI19jbGssCQkJCQlcCisJCS5yZWcgPSBDU0NEUjMsCQkJCQkJXAorCQkuYnAgPSBCUF9DU0NEUjNfSVBVIyNpZCMjX0hTUF9TRUwsCQkJXAorCQkuYm0gPSBCTV9DU0NEUjNfSVBVIyNpZCMjX0hTUF9TRUwsCQkJXAorCQkucGFyZW50cyA9IHsJCQkJCQlcCisJCQkmbW1kY19jaDBfYXhpX2NsaywJCQkJXAorCQkJJnBsbDJfcGZkXzQwMG0sCQkJCQlcCisJCQkmcGxsM18xMjBtLAkJCQkJXAorCQkJJnBsbDNfcGZkXzU0MG0sCQkJCQlcCisJCQlOVUxMCQkJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitERUZfSVBVX01VWCgxKTsKK0RFRl9JUFVfTVVYKDIpOworCitzdGF0aWMgc3RydWN0IG11bHRpcGxleGVyICptdWx0aXBsZXhlcnNbXSA9IHsKKwkmYXhpX211eCwKKwkmcGVyaXBoX211eCwKKwkmcGVyaXBoX3ByZV9tdXgsCisJJnBlcmlwaF9jbGsyX211eCwKKwkmcGVyaXBoMl9tdXgsCisJJnBlcmlwaDJfcHJlX211eCwKKwkmcGVyaXBoMl9jbGsyX211eCwKKwkmZ3B1MmRfYXhpX211eCwKKwkmZ3B1M2RfYXhpX211eCwKKwkmZ3B1M2RfY29yZV9tdXgsCisJJmdwdTNkX3NoYWRlcl9tdXgsCisJJnBjaWVfYXhpX211eCwKKwkmdmRvX2F4aV9tdXgsCisJJnZwdV9heGlfbXV4LAorCSZncHUyZF9jb3JlX211eCwKKwkmc3NpMV9tdXgsCisJJnNzaTJfbXV4LAorCSZzc2kzX211eCwKKwkmdXNkaGMxX211eCwKKwkmdXNkaGMyX211eCwKKwkmdXNkaGMzX211eCwKKwkmdXNkaGM0X211eCwKKwkmZW1pX211eCwKKwkmZW1pX3Nsb3dfbXV4LAorCSZlc2FpX211eCwKKwkmbGRiX2RpMF9tdXgsCisJJmxkYl9kaTFfbXV4LAorCSZlbmZjX211eCwKKwkmc3BkaWZfbXV4LAorCSZhc3JjX3NlcmlhbF9tdXgsCisJJmhzaV90eF9tdXgsCisJJmlwdTFfZGkwX3ByZV9tdXgsCisJJmlwdTFfZGkwX211eCwKKwkmaXB1MV9kaTFfcHJlX211eCwKKwkmaXB1MV9kaTFfbXV4LAorCSZpcHUyX2RpMF9wcmVfbXV4LAorCSZpcHUyX2RpMF9tdXgsCisJJmlwdTJfZGkxX3ByZV9tdXgsCisJJmlwdTJfZGkxX211eCwKKwkmaXB1MV9tdXgsCisJJmlwdTJfbXV4LAorfTsKKworc3RhdGljIGludCBfY2xrX3NldF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJc3RydWN0IG11bHRpcGxleGVyICptOworCWludCBpLCBudW07CisJdTMyIHZhbDsKKworCW51bSA9IEFSUkFZX1NJWkUobXVsdGlwbGV4ZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWlmIChtdWx0aXBsZXhlcnNbaV0tPmNsayA9PSBjbGspIHsKKwkJCW0gPSBtdWx0aXBsZXhlcnNbaV07CisJCQlicmVhazsKKwkJfQorCWlmIChpID09IG51bSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpID0gMDsKKwl3aGlsZSAobS0+cGFyZW50c1tpXSkgeworCQlpZiAocGFyZW50ID09IG0tPnBhcmVudHNbaV0pCisJCQlicmVhazsKKwkJaSsrOworCX0KKwlpZiAoIW0tPnBhcmVudHNbaV0pCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChtLT5yZWcpOworCXZhbCAmPSB+bS0+Ym07CisJdmFsIHw9IGkgPDwgbS0+YnA7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBtLT5yZWcpOworCisJaWYgKGNsayA9PSAmcGVyaXBoX2NsaykKKwkJcmV0dXJuIGNsa19idXN5X3dhaXQoY2xrKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIERFRl9OR19DTEsobmFtZSwgcCkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgY2xrIG5hbWUgPSB7CQkJXAorCQkuZ2V0X3JhdGUJPSBfY2xrX2dldF9yYXRlLAlcCisJCS5zZXRfcmF0ZQk9IF9jbGtfc2V0X3JhdGUsCVwKKwkJLnJvdW5kX3JhdGUJPSBfY2xrX3JvdW5kX3JhdGUsCVwKKwkJLnNldF9wYXJlbnQJPSBfY2xrX3NldF9wYXJlbnQsCVwKKwkJLnBhcmVudAkJPSBwLAkJCVwKKwl9CisKK0RFRl9OR19DTEsocGVyaXBoX2NsazJfY2xrLAkmb3NjX2Nsayk7CitERUZfTkdfQ0xLKHBlcmlwaF9wcmVfY2xrLAkmcGxsMl9idXMpOworREVGX05HX0NMSyhwZXJpcGhfY2xrLAkJJnBlcmlwaF9wcmVfY2xrKTsKK0RFRl9OR19DTEsocGVyaXBoMl9jbGsyX2NsaywJJm9zY19jbGspOworREVGX05HX0NMSyhwZXJpcGgyX3ByZV9jbGssCSZwbGwyX2J1cyk7CitERUZfTkdfQ0xLKHBlcmlwaDJfY2xrLAkJJnBlcmlwaDJfcHJlX2Nsayk7CitERUZfTkdfQ0xLKGF4aV9jbGssCQkmcGVyaXBoX2Nsayk7CitERUZfTkdfQ0xLKGVtaV9jbGssCQkmYXhpX2Nsayk7CitERUZfTkdfQ0xLKGFybV9jbGssCQkmcGxsMV9zd19jbGspOworREVGX05HX0NMSyhhaGJfY2xrLAkJJnBlcmlwaF9jbGspOworREVGX05HX0NMSyhpcGdfY2xrLAkJJmFoYl9jbGspOworREVGX05HX0NMSyhpcGdfcGVyY2xrLAkJJmlwZ19jbGspOworREVGX05HX0NMSyhpcHUxX2RpMF9wcmVfY2xrLAkmcGxsM19wZmRfNTQwbSk7CitERUZfTkdfQ0xLKGlwdTFfZGkxX3ByZV9jbGssCSZwbGwzX3BmZF81NDBtKTsKK0RFRl9OR19DTEsoaXB1Ml9kaTBfcHJlX2NsaywJJnBsbDNfcGZkXzU0MG0pOworREVGX05HX0NMSyhpcHUyX2RpMV9wcmVfY2xrLAkmcGxsM19wZmRfNTQwbSk7CitERUZfTkdfQ0xLKGFzcmNfc2VyaWFsX2NsaywJJnBsbDNfdXNiX290Zyk7CisKKyNkZWZpbmUgREVGX0NMSyhuYW1lLCBlciwgZXMsIHAsIHMpCQkJXAorCXN0YXRpYyBzdHJ1Y3QgY2xrIG5hbWUgPSB7CQkJXAorCQkuZW5hYmxlX3JlZwk9IGVyLAkJCVwKKwkJLmVuYWJsZV9zaGlmdAk9IGVzLAkJCVwKKwkJLmVuYWJsZQkJPSBfY2xrX2VuYWJsZSwJCVwKKwkJLmRpc2FibGUJPSBfY2xrX2Rpc2FibGUsCQlcCisJCS5nZXRfcmF0ZQk9IF9jbGtfZ2V0X3JhdGUsCVwKKwkJLnNldF9yYXRlCT0gX2Nsa19zZXRfcmF0ZSwJXAorCQkucm91bmRfcmF0ZQk9IF9jbGtfcm91bmRfcmF0ZSwJXAorCQkuc2V0X3BhcmVudAk9IF9jbGtfc2V0X3BhcmVudCwJXAorCQkucGFyZW50CQk9IHAsCQkJXAorCQkuc2Vjb25kYXJ5CT0gcywJCQlcCisJfQorCitERUZfQ0xLKGFpcHNfdHoxX2NsaywJICBDQ0dSMCwgQ0cwLCAgJmFoYl9jbGssCSAgTlVMTCk7CitERUZfQ0xLKGFpcHNfdHoyX2NsaywJICBDQ0dSMCwgQ0cxLCAgJmFoYl9jbGssCSAgTlVMTCk7CitERUZfQ0xLKGFwYmhfZG1hX2NsaywJICBDQ0dSMCwgQ0cyLCAgJmFoYl9jbGssCSAgTlVMTCk7CitERUZfQ0xLKGFzcmNfY2xrLAkgIENDR1IwLCBDRzMsICAmcGxsNF9hdWRpbywJICBOVUxMKTsKK0RFRl9DTEsoY2FuMV9zZXJpYWxfY2xrLCAgQ0NHUjAsIENHOCwgICZwbGwzX3VzYl9vdGcsCSAgTlVMTCk7CitERUZfQ0xLKGNhbjFfY2xrLAkgIENDR1IwLCBDRzcsICAmcGxsM191c2Jfb3RnLAkgICZjYW4xX3NlcmlhbF9jbGspOworREVGX0NMSyhjYW4yX3NlcmlhbF9jbGssICBDQ0dSMCwgQ0cxMCwgJnBsbDNfdXNiX290ZywJICBOVUxMKTsKK0RFRl9DTEsoY2FuMl9jbGssCSAgQ0NHUjAsIENHOSwgICZwbGwzX3VzYl9vdGcsCSAgJmNhbjJfc2VyaWFsX2Nsayk7CitERUZfQ0xLKGVjc3BpMV9jbGssCSAgQ0NHUjEsIENHMCwgICZwbGwzXzYwbSwJICBOVUxMKTsKK0RFRl9DTEsoZWNzcGkyX2NsaywJICBDQ0dSMSwgQ0cxLCAgJnBsbDNfNjBtLAkgIE5VTEwpOworREVGX0NMSyhlY3NwaTNfY2xrLAkgIENDR1IxLCBDRzIsICAmcGxsM182MG0sCSAgTlVMTCk7CitERUZfQ0xLKGVjc3BpNF9jbGssCSAgQ0NHUjEsIENHMywgICZwbGwzXzYwbSwJICBOVUxMKTsKK0RFRl9DTEsoZWNzcGk1X2NsaywJICBDQ0dSMSwgQ0c0LCAgJnBsbDNfNjBtLAkgIE5VTEwpOworREVGX0NMSyhlbmV0X2NsaywJICBDQ0dSMSwgQ0c1LCAgJmlwZ19jbGssCSAgTlVMTCk7CitERUZfQ0xLKGVzYWlfY2xrLAkgIENDR1IxLCBDRzgsICAmcGxsM191c2Jfb3RnLAkgIE5VTEwpOworREVGX0NMSyhncHRfc2VyaWFsX2NsaywJICBDQ0dSMSwgQ0cxMSwgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKGdwdF9jbGssCSAgQ0NHUjEsIENHMTAsICZpcGdfcGVyY2xrLAkgICZncHRfc2VyaWFsX2Nsayk7CitERUZfQ0xLKGdwdTJkX2NvcmVfY2xrLAkgIENDR1IxLCBDRzEyLCAmcGxsMl9wZmRfMzUybSwJICAmZ3B1MmRfYXhpX2Nsayk7CitERUZfQ0xLKGdwdTNkX2NvcmVfY2xrLAkgIENDR1IxLCBDRzEzLCAmcGxsMl9wZmRfNTk0bSwJICAmZ3B1M2RfYXhpX2Nsayk7CitERUZfQ0xLKGdwdTNkX3NoYWRlcl9jbGssIENDR1IxLCBDRzEzLCAmcGxsM19wZmRfNzIwbSwJICAmZ3B1M2RfYXhpX2Nsayk7CitERUZfQ0xLKGhkbWlfaWFoYl9jbGssCSAgQ0NHUjIsIENHMCwgICZhaGJfY2xrLAkgIE5VTEwpOworREVGX0NMSyhoZG1pX2lzZnJfY2xrLAkgIENDR1IyLCBDRzIsICAmcGxsM19wZmRfNTQwbSwJICAmaGRtaV9pYWhiX2Nsayk7CitERUZfQ0xLKGkyYzFfY2xrLAkgIENDR1IyLCBDRzMsICAmaXBnX3BlcmNsaywJICBOVUxMKTsKK0RFRl9DTEsoaTJjMl9jbGssCSAgQ0NHUjIsIENHNCwgICZpcGdfcGVyY2xrLAkgIE5VTEwpOworREVGX0NMSyhpMmMzX2NsaywJICBDQ0dSMiwgQ0c1LCAgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKGlpbV9jbGssCSAgQ0NHUjIsIENHNiwgICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyhlbmZjX2NsaywJICBDQ0dSMiwgQ0c3LCAgJnBsbDJfcGZkXzM1Mm0sCSAgTlVMTCk7CitERUZfQ0xLKGlwdTFfY2xrLAkgIENDR1IzLCBDRzAsICAmbW1kY19jaDBfYXhpX2NsaywgTlVMTCk7CitERUZfQ0xLKGlwdTFfZGkwX2NsaywJICBDQ0dSMywgQ0cxLCAgJmlwdTFfZGkwX3ByZV9jbGssIE5VTEwpOworREVGX0NMSyhpcHUxX2RpMV9jbGssCSAgQ0NHUjMsIENHMiwgICZpcHUxX2RpMV9wcmVfY2xrLCBOVUxMKTsKK0RFRl9DTEsoaXB1Ml9jbGssCSAgQ0NHUjMsIENHMywgICZtbWRjX2NoMF9heGlfY2xrLCBOVUxMKTsKK0RFRl9DTEsoaXB1Ml9kaTBfY2xrLAkgIENDR1IzLCBDRzQsICAmaXB1Ml9kaTBfcHJlX2NsaywgTlVMTCk7CitERUZfQ0xLKGlwdTJfZGkxX2NsaywJICBDQ0dSMywgQ0c1LCAgJmlwdTJfZGkxX3ByZV9jbGssIE5VTEwpOworREVGX0NMSyhsZGJfZGkwX2NsaywJICBDQ0dSMywgQ0c2LCAgJnBsbDNfcGZkXzU0MG0sCSAgTlVMTCk7CitERUZfQ0xLKGxkYl9kaTFfY2xrLAkgIENDR1IzLCBDRzcsICAmcGxsM19wZmRfNTQwbSwJICBOVUxMKTsKK0RFRl9DTEsoaHNpX3R4X2NsaywJICBDQ0dSMywgQ0c4LCAgJnBsbDJfcGZkXzQwMG0sCSAgTlVMTCk7CitERUZfQ0xLKG1sYl9jbGssCSAgQ0NHUjMsIENHOSwgICZwbGw2X21sYiwJICBOVUxMKTsKK0RFRl9DTEsobW1kY19jaDBfaXBnX2NsaywgQ0NHUjMsIENHMTIsICZpcGdfY2xrLAkgIE5VTEwpOworREVGX0NMSyhtbWRjX2NoMF9heGlfY2xrLCBDQ0dSMywgQ0cxMCwgJnBlcmlwaF9jbGssCSAgJm1tZGNfY2gwX2lwZ19jbGspOworREVGX0NMSyhtbWRjX2NoMV9pcGdfY2xrLCBDQ0dSMywgQ0cxMywgJmlwZ19jbGssCSAgTlVMTCk7CitERUZfQ0xLKG1tZGNfY2gxX2F4aV9jbGssIENDR1IzLCBDRzExLCAmcGVyaXBoMl9jbGssCSAgJm1tZGNfY2gxX2lwZ19jbGspOworREVGX0NMSyhvcGVudmdfYXhpX2NsaywgICBDQ0dSMywgQ0cxMywgJmF4aV9jbGssCSAgTlVMTCk7CitERUZfQ0xLKHB3bTFfY2xrLAkgIENDR1I0LCBDRzgsICAmaXBnX3BlcmNsaywJICBOVUxMKTsKK0RFRl9DTEsocHdtMl9jbGssCSAgQ0NHUjQsIENHOSwgICZpcGdfcGVyY2xrLAkgIE5VTEwpOworREVGX0NMSyhwd20zX2NsaywJICBDQ0dSNCwgQ0cxMCwgJmlwZ19wZXJjbGssCSAgTlVMTCk7CitERUZfQ0xLKHB3bTRfY2xrLAkgIENDR1I0LCBDRzExLCAmaXBnX3BlcmNsaywJICBOVUxMKTsKK0RFRl9DTEsoZ3BtaV9iY2hfYXBiX2NsaywgQ0NHUjQsIENHMTIsICZ1c2RoYzNfY2xrLAkgIE5VTEwpOworREVGX0NMSyhncG1pX2JjaF9jbGssCSAgQ0NHUjQsIENHMTMsICZ1c2RoYzRfY2xrLAkgICZncG1pX2JjaF9hcGJfY2xrKTsKK0RFRl9DTEsoZ3BtaV9hcGJfY2xrLAkgIENDR1I0LCBDRzE1LCAmdXNkaGMzX2NsaywJICAmZ3BtaV9iY2hfY2xrKTsKK0RFRl9DTEsoZ3BtaV9pb19jbGssCSAgQ0NHUjQsIENHMTQsICZlbmZjX2NsaywJICAmZ3BtaV9hcGJfY2xrKTsKK0RFRl9DTEsoc2RtYV9jbGssCSAgQ0NHUjUsIENHMywgICZhaGJfY2xrLAkgIE5VTEwpOworREVGX0NMSyhzcGJhX2NsaywJICBDQ0dSNSwgQ0c2LCAgJmlwZ19jbGssCSAgTlVMTCk7CitERUZfQ0xLKHNwZGlmX2NsaywJICBDQ0dSNSwgQ0c3LCAgJnBsbDNfdXNiX290ZywJICAmc3BiYV9jbGspOworREVGX0NMSyhzc2kxX2NsaywJICBDQ0dSNSwgQ0c5LCAgJnBsbDNfcGZkXzUwOG0sCSAgTlVMTCk7CitERUZfQ0xLKHNzaTJfY2xrLAkgIENDR1I1LCBDRzEwLCAmcGxsM19wZmRfNTA4bSwJICBOVUxMKTsKK0RFRl9DTEsoc3NpM19jbGssCSAgQ0NHUjUsIENHMTEsICZwbGwzX3BmZF81MDhtLAkgIE5VTEwpOworREVGX0NMSyh1YXJ0X3NlcmlhbF9jbGssICBDQ0dSNSwgQ0cxMywgJnBsbDNfdXNiX290ZywJICBOVUxMKTsKK0RFRl9DTEsodWFydF9jbGssCSAgQ0NHUjUsIENHMTIsICZwbGwzXzgwbSwJICAmdWFydF9zZXJpYWxfY2xrKTsKK0RFRl9DTEsodXNib2gzX2NsaywJICBDQ0dSNiwgQ0cwLCAgJmlwZ19jbGssCSAgTlVMTCk7CitERUZfQ0xLKHVzZGhjMV9jbGssCSAgQ0NHUjYsIENHMSwgICZwbGwyX3BmZF80MDBtLAkgIE5VTEwpOworREVGX0NMSyh1c2RoYzJfY2xrLAkgIENDR1I2LCBDRzIsICAmcGxsMl9wZmRfNDAwbSwJICBOVUxMKTsKK0RFRl9DTEsodXNkaGMzX2NsaywJICBDQ0dSNiwgQ0czLCAgJnBsbDJfcGZkXzQwMG0sCSAgTlVMTCk7CitERUZfQ0xLKHVzZGhjNF9jbGssCSAgQ0NHUjYsIENHNCwgICZwbGwyX3BmZF80MDBtLAkgIE5VTEwpOworREVGX0NMSyhlbWlfc2xvd19jbGssCSAgQ0NHUjYsIENHNSwgICZheGlfY2xrLAkgIE5VTEwpOworREVGX0NMSyh2ZG9fYXhpX2NsaywJICBDQ0dSNiwgQ0c2LCAgJmF4aV9jbGssCSAgTlVMTCk7CitERUZfQ0xLKHZwdV9jbGssCSAgQ0NHUjYsIENHNywgICZheGlfY2xrLAkgIE5VTEwpOworCitzdGF0aWMgaW50IHBjaWVfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoUExMOF9FTkVUKTsKKwl2YWwgfD0gQk1fUExMX0VORVRfRU5fUENJRTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIFBMTDhfRU5FVCk7CisKKwlyZXR1cm4gX2Nsa19lbmFibGUoY2xrKTsKK30KKworc3RhdGljIHZvaWQgcGNpZV9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKworCV9jbGtfZGlzYWJsZShjbGspOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChQTEw4X0VORVQpOworCXZhbCAmPSBCTV9QTExfRU5FVF9FTl9QQ0lFOworCXdyaXRlbF9yZWxheGVkKHZhbCwgUExMOF9FTkVUKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgcGNpZV9jbGsgPSB7CisJLmVuYWJsZV9yZWcgPSBDQ0dSNCwKKwkuZW5hYmxlX3NoaWZ0ID0gQ0cwLAorCS5lbmFibGUgPSBwY2llX2Nsa19lbmFibGUsCisJLmRpc2FibGUgPSBwY2llX2Nsa19kaXNhYmxlLAorCS5zZXRfcGFyZW50ID0gX2Nsa19zZXRfcGFyZW50LAorCS5wYXJlbnQgPSAmYXhpX2NsaywKKwkuc2Vjb25kYXJ5ID0gJnBsbDhfZW5ldCwKK307CisKK3N0YXRpYyBpbnQgc2F0YV9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChQTEw4X0VORVQpOworCXZhbCB8PSBCTV9QTExfRU5FVF9FTl9TQVRBOworCXdyaXRlbF9yZWxheGVkKHZhbCwgUExMOF9FTkVUKTsKKworCXJldHVybiBfY2xrX2VuYWJsZShjbGspOworfQorCitzdGF0aWMgdm9pZCBzYXRhX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1MzIgdmFsOworCisJX2Nsa19kaXNhYmxlKGNsayk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKFBMTDhfRU5FVCk7CisJdmFsICY9IEJNX1BMTF9FTkVUX0VOX1NBVEE7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBQTEw4X0VORVQpOworfQorCitzdGF0aWMgc3RydWN0IGNsayBzYXRhX2NsayA9IHsKKwkuZW5hYmxlX3JlZyA9IENDR1I1LAorCS5lbmFibGVfc2hpZnQgPSBDRzIsCisJLmVuYWJsZSA9IHNhdGFfY2xrX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHNhdGFfY2xrX2Rpc2FibGUsCisJLnBhcmVudCA9ICZpcGdfY2xrLAorCS5zZWNvbmRhcnkgPSAmcGxsOF9lbmV0LAorfTsKKworI2RlZmluZSBfUkVHSVNURVJfQ0xPQ0soZCwgbiwgYykgXAorCXsgXAorCQkuZGV2X2lkID0gZCwgXAorCQkuY29uX2lkID0gbiwgXAorCQkuY2xrID0gJmMsIFwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CisJX1JFR0lTVEVSX0NMT0NLKCIyMDIwMDAwLnVhcnQiLCBOVUxMLCB1YXJ0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWU4MDAwLnVhcnQiLCBOVUxMLCB1YXJ0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWVjMDAwLnVhcnQiLCBOVUxMLCB1YXJ0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWYwMDAwLnVhcnQiLCBOVUxMLCB1YXJ0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWY0MDAwLnVhcnQiLCBOVUxMLCB1YXJ0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMTg4MDAwLmVuZXQiLCBOVUxMLCBlbmV0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMTkwMDAwLnVzZGhjIiwgTlVMTCwgdXNkaGMxX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMTk0MDAwLnVzZGhjIiwgTlVMTCwgdXNkaGMyX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMTk4MDAwLnVzZGhjIiwgTlVMTCwgdXNkaGMzX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMTljMDAwLnVzZGhjIiwgTlVMTCwgdXNkaGM0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMWEwMDAwLmkyYyIsIE5VTEwsIGkyYzFfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soIjIxYTQwMDAuaTJjIiwgTlVMTCwgaTJjMl9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjFhODAwMC5pMmMiLCBOVUxMLCBpMmMzX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMDA4MDAwLmVjc3BpIiwgTlVMTCwgZWNzcGkxX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMDBjMDAwLmVjc3BpIiwgTlVMTCwgZWNzcGkyX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMDEwMDAwLmVjc3BpIiwgTlVMTCwgZWNzcGkzX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMDE0MDAwLmVjc3BpIiwgTlVMTCwgZWNzcGk0X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMDE4MDAwLmVjc3BpIiwgTlVMTCwgZWNzcGk1X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMGVjMDAwLnNkbWEiLCBOVUxMLCBzZG1hX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKCIyMGJjMDAwLndkb2ciLCBOVUxMLCBkdW1teV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSygiMjBjMDAwMC53ZG9nIiwgTlVMTCwgZHVtbXlfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNraWgiLCBja2loX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJja2lsX2NsayIsIGNraWxfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImFpcHNfdHoxX2NsayIsIGFpcHNfdHoxX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhaXBzX3R6Ml9jbGsiLCBhaXBzX3R6Ml9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXNyY19jbGsiLCBhc3JjX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjYW4yX2NsayIsIGNhbjJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImhkbWlfaXNmcl9jbGsiLCBoZG1pX2lzZnJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImlpbV9jbGsiLCBpaW1fY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm1sYl9jbGsiLCBtbGJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm9wZW52Z19heGlfY2xrIiwgb3BlbnZnX2F4aV9jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicHdtMV9jbGsiLCBwd20xX2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJwd20yX2NsayIsIHB3bTJfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInB3bTNfY2xrIiwgcHdtM19jbGspLAorCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicHdtNF9jbGsiLCBwd200X2NsayksCisJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncG1pX2lvX2NsayIsIGdwbWlfaW9fY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInVzYm9oM19jbGsiLCB1c2JvaDNfY2xrKSwKKwlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNhdGFfY2xrIiwgc2F0YV9jbGspLAorfTsKKworaW50IGlteDZxX3NldF9scG0oZW51bSBteGNfY3B1X3B3cl9tb2RlIG1vZGUpCit7CisJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQoQ0xQQ1IpOworCisJdmFsICY9IH5CTV9DTFBDUl9MUE07CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBXQUlUX0NMT0NLRUQ6CisJCWJyZWFrOworCWNhc2UgV0FJVF9VTkNMT0NLRUQ6CisJCXZhbCB8PSAweDEgPDwgQlBfQ0xQQ1JfTFBNOworCQlicmVhazsKKwljYXNlIFNUT1BfUE9XRVJfT046CisJCXZhbCB8PSAweDIgPDwgQlBfQ0xQQ1JfTFBNOworCQlicmVhazsKKwljYXNlIFdBSVRfVU5DTE9DS0VEX1BPV0VSX09GRjoKKwkJdmFsIHw9IDB4MSA8PCBCUF9DTFBDUl9MUE07CisJCXZhbCAmPSB+Qk1fQ0xQQ1JfVlNUQlk7CisJCXZhbCAmPSB+Qk1fQ0xQQ1JfU0JZT1M7CisJCXZhbCB8PSBCTV9DTFBDUl9CWVBfTU1EQ19DSDFfTFBNX0hTOworCQlicmVhazsKKwljYXNlIFNUT1BfUE9XRVJfT0ZGOgorCQl2YWwgfD0gMHgyIDw8IEJQX0NMUENSX0xQTTsKKwkJdmFsIHw9IDB4MyA8PCBCUF9DTFBDUl9TVEJZX0NPVU5UOworCQl2YWwgfD0gQk1fQ0xQQ1JfVlNUQlk7CisJCXZhbCB8PSBCTV9DTFBDUl9TQllPUzsKKwkJdmFsIHw9IEJNX0NMUENSX0JZUF9NTURDX0NIMV9MUE1fSFM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl3cml0ZWxfcmVsYXhlZCh2YWwsIENMUENSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlteDZxX2Nsb2NrX2Rlc2NbXSA9IHsKKwlpbXhfbWFwX2VudHJ5KE1YNlEsIENDTSwgTVRfREVWSUNFKSwKKwlpbXhfbWFwX2VudHJ5KE1YNlEsIEFOQVRPUCwgTVRfREVWSUNFKSwKK307CisKK2ludCBfX2luaXQgbXg2cV9jbG9ja3NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBpLCBpcnE7CisKKwlpb3RhYmxlX2luaXQoaW14NnFfY2xvY2tfZGVzYywgQVJSQVlfU0laRShpbXg2cV9jbG9ja19kZXNjKSk7CisKKwkvKiByZXRyaWV2ZSB0aGUgZnJlcWVuY3kgb2YgZml4ZWQgY2xvY2tzIGZyb20gZGV2aWNlIHRyZWUgKi8KKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsIE5VTEwsICJmaXhlZC1jbG9jayIpIHsKKwkJdTMyIHJhdGU7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZyYXRlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXgtY2tpbCIpKQorCQkJZXh0ZXJuYWxfbG93X3JlZmVyZW5jZSA9IHJhdGU7CisJCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteC1ja2loMSIpKQorCQkJZXh0ZXJuYWxfaGlnaF9yZWZlcmVuY2UgPSByYXRlOworCQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXgtb3NjIikpCisJCQlvc2NpbGxhdG9yX3JlZmVyZW5jZSA9IHJhdGU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG9va3Vwcyk7IGkrKykKKwkJY2xrZGV2X2FkZCgmbG9va3Vwc1tpXSk7CisKKwkvKiBvbmx5IGtlZXAgbmVjZXNzYXJ5IGNsb2NrcyBvbiAqLworCXdyaXRlbF9yZWxheGVkKDB4MyA8PCBDRzAgIHwgMHgzIDw8IENHMSAgfCAweDMgPDwgQ0cyLAlDQ0dSMCk7CisJd3JpdGVsX3JlbGF4ZWQoMHgzIDw8IENHOCAgfCAweDMgPDwgQ0c5ICB8IDB4MyA8PCBDRzEwLAlDQ0dSMik7CisJd3JpdGVsX3JlbGF4ZWQoMHgzIDw8IENHMTAgfCAweDMgPDwgQ0cxMiwJCUNDR1IzKTsKKwl3cml0ZWxfcmVsYXhlZCgweDMgPDwgQ0c0ICB8IDB4MyA8PCBDRzYgIHwgMHgzIDw8IENHNywJQ0NHUjQpOworCXdyaXRlbF9yZWxheGVkKDB4MyA8PCBDRzAsCQkJCUNDR1I1KTsKKwl3cml0ZWxfcmVsYXhlZCgwLAkJCQkJQ0NHUjYpOworCXdyaXRlbF9yZWxheGVkKDAsCQkJCQlDQ0dSNyk7CisKKwljbGtfZW5hYmxlKCZ1YXJ0X2Nsayk7CisJY2xrX2VuYWJsZSgmbW1kY19jaDBfYXhpX2Nsayk7CisKKwljbGtfc2V0X3JhdGUoJnBsbDRfYXVkaW8sIEZSRVFfNjUwTSk7CisJY2xrX3NldF9yYXRlKCZwbGw1X3ZpZGVvLCBGUkVRXzY1ME0pOworCWNsa19zZXRfcGFyZW50KCZpcHUxX2RpMF9jbGssICZpcHUxX2RpMF9wcmVfY2xrKTsKKwljbGtfc2V0X3BhcmVudCgmaXB1MV9kaTBfcHJlX2NsaywgJnBsbDVfdmlkZW8pOworCWNsa19zZXRfcGFyZW50KCZncHUzZF9zaGFkZXJfY2xrLCAmcGxsMl9wZmRfNTk0bSk7CisJY2xrX3NldF9yYXRlKCZncHUzZF9zaGFkZXJfY2xrLCBGUkVRXzU5NE0pOworCWNsa19zZXRfcGFyZW50KCZncHUzZF9jb3JlX2NsaywgJm1tZGNfY2gwX2F4aV9jbGspOworCWNsa19zZXRfcmF0ZSgmZ3B1M2RfY29yZV9jbGssIEZSRVFfNTI4TSk7CisJY2xrX3NldF9wYXJlbnQoJmFzcmNfc2VyaWFsX2NsaywgJnBsbDNfdXNiX290Zyk7CisJY2xrX3NldF9yYXRlKCZhc3JjX3NlcmlhbF9jbGssIDE1MDAwMDApOworCWNsa19zZXRfcmF0ZSgmZW5mY19jbGssIDExMDAwMDAwKTsKKworCS8qCisJICogQmVmb3JlIHBpbmN0cmwgQVBJIGlzIGF2YWlsYWJsZSwgd2UgaGF2ZSB0byByZWx5IG9uIHRoZSBwYWQKKwkgKiBjb25maWd1cmF0aW9uIHNldCB1cCBieSBib290bG9hZGVyLiAgRm9yIHVzZGhjIGV4YW1wbGUgaGVyZSwKKwkgKiB1LWJvb3Qgc2V0cyB1cCB0aGUgcGFkcyBmb3IgNDkuNSBNSHogY2FzZSwgYW5kIHdlIGhhdmUgdG8gbG93ZXIKKwkgKiB0aGUgdXNkaGMgY2xvY2sgZnJvbSAxOTggdG8gNDkuNSBNSHogdG8gbWF0Y2ggdGhlIHBhZCBjb25maWd1cmF0aW9uLgorCSAqCisJICogRklYTUU6IFRoaXMgaXMgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgcGluY3RybCBBUEkgaXMgYXZhaWxhYmxlLgorCSAqIEF0IHRoYXQgdGltZSwgdXNkaGMgZHJpdmVyIGNhbiBjYWxsIHBpbmN0cmwgQVBJIHRvIGNoYW5nZSBwYWQKKwkgKiBjb25maWd1cmF0aW9uIGR5bmFtaWNhbGx5IHBlciBkaWZmZXJlbnQgdXNkaGMgY2xvY2sgc2V0dGluZ3MuCisJICovCisJY2xrX3NldF9yYXRlKCZ1c2RoYzFfY2xrLCA0OTUwMDAwMCk7CisJY2xrX3NldF9yYXRlKCZ1c2RoYzJfY2xrLCA0OTUwMDAwMCk7CisJY2xrX3NldF9yYXRlKCZ1c2RoYzNfY2xrLCA0OTUwMDAwMCk7CisJY2xrX3NldF9yYXRlKCZ1c2RoYzRfY2xrLCA0OTUwMDAwMCk7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsaW14NnEtZ3B0Iik7CisJYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlXQVJOX09OKCFiYXNlKTsKKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJbXhjX3RpbWVyX2luaXQoJmdwdF9jbGssIGJhc2UsIGlycSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNGJjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNS5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBNWDI1IENQVSB0eXBlIGRldGVjdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBEYW5pZWwgTWFjayA8ZGFuaWVsQGNhaWFxLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9paW0uaD4KKworc3RhdGljIGludCBteDI1X2NwdV9yZXYgPSAtMTsKKworc3RhdGljIGludCBteDI1X3JlYWRfY3B1X3Jldih2b2lkKQoreworCXUzMiByZXY7CisKKwlyZXYgPSBfX3Jhd19yZWFkbChNWDI1X0lPX0FERFJFU1MoTVgyNV9JSU1fQkFTRV9BRERSICsgTVhDX0lJTVNSRVYpKTsKKwlzd2l0Y2ggKHJldikgeworCWNhc2UgMHgwMDoKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzFfMDsKKwljYXNlIDB4MDE6CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl8xXzE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OX1VOS05PV047CisJfQorfQorCitpbnQgbXgyNV9yZXZpc2lvbih2b2lkKQoreworCWlmIChteDI1X2NwdV9yZXYgPT0gLTEpCisJCW14MjVfY3B1X3JldiA9IG14MjVfcmVhZF9jcHVfcmV2KCk7CisKKwlyZXR1cm4gbXgyNV9jcHVfcmV2OworfQorRVhQT1JUX1NZTUJPTChteDI1X3JldmlzaW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDI3LmMKaW5kZXggM2IxMTdiZS4uZmYzOGUxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDI3LmMKQEAgLTI2LDEyICsyNiwxMiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi1zdGF0aWMgaW50IGNwdV9zaWxpY29uX3JldiA9IC0xOwotc3RhdGljIGludCBjcHVfcGFydG51bWJlcjsKK3N0YXRpYyBpbnQgbXgyN19jcHVfcmV2ID0gLTE7CitzdGF0aWMgaW50IG14MjdfY3B1X3BhcnRudW1iZXI7CiAKICNkZWZpbmUgU1lTX0NISVBfSUQgICAgICAgICAgICAgMHgwMCAgICAvKiBUaGUgb2Zmc2V0IG9mIENISVAgSUQgcmVnaXN0ZXIgKi8KIAotc3RhdGljIHZvaWQgcXVlcnlfc2lsaWNvbl9wYXJhbWV0ZXIodm9pZCkKK3N0YXRpYyBpbnQgbXgyN19yZWFkX2NwdV9yZXYodm9pZCkKIHsKIAl1MzIgdmFsOwogCS8qCkBAIC00MiwyMCArNDIsMTggQEAKIAl2YWwgPSBfX3Jhd19yZWFkbChNWDI3X0lPX0FERFJFU1MoTVgyN19TWVNDVFJMX0JBU0VfQUREUgogCQkJCSsgU1lTX0NISVBfSUQpKTsKIAorCW14MjdfY3B1X3BhcnRudW1iZXIgPSAoaW50KSgodmFsID4+IDEyKSAmIDB4RkZGRik7CisKIAlzd2l0Y2ggKHZhbCA+PiAyOCkgewogCWNhc2UgMDoKLQkJY3B1X3NpbGljb25fcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8wOwotCQlicmVhazsKKwkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzFfMDsKIAljYXNlIDE6Ci0JCWNwdV9zaWxpY29uX3JldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMDsKLQkJYnJlYWs7CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl8yXzA7CiAJY2FzZSAyOgotCQljcHVfc2lsaWNvbl9yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzE7Ci0JCWJyZWFrOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMl8xOwogCWRlZmF1bHQ6Ci0JCWNwdV9zaWxpY29uX3JldiA9IElNWF9DSElQX1JFVklTSU9OX1VOS05PV047CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOwogCX0KLQljcHVfcGFydG51bWJlciA9IChpbnQpKCh2YWwgPj4gMTIpICYgMHhGRkZGKTsKIH0KIAogLyoKQEAgLTY1LDEyICs2MywxMiBAQAogICovCiBpbnQgbXgyN19yZXZpc2lvbih2b2lkKQogewotCWlmIChjcHVfc2lsaWNvbl9yZXYgPT0gLTEpCi0JCXF1ZXJ5X3NpbGljb25fcGFyYW1ldGVyKCk7CisJaWYgKG14MjdfY3B1X3JldiA9PSAtMSkKKwkJbXgyN19jcHVfcmV2ID0gbXgyN19yZWFkX2NwdV9yZXYoKTsKIAotCWlmIChjcHVfcGFydG51bWJlciAhPSAweDg4MjEpCisJaWYgKG14MjdfY3B1X3BhcnRudW1iZXIgIT0gMHg4ODIxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBjcHVfc2lsaWNvbl9yZXY7CisJcmV0dXJuIG14MjdfY3B1X3JldjsKIH0KIEVYUE9SVF9TWU1CT0wobXgyN19yZXZpc2lvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jcHUtaW14MzEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzMS5jCmluZGV4IGEzNzgwNzAuLjNmMjM0NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzMS5jCkBAIC0xMyw0NSArMTMsNTAgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lpbS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAKLXVuc2lnbmVkIGludCBteDMxX2NwdV9yZXY7Ci1FWFBPUlRfU1lNQk9MKG14MzFfY3B1X3Jldik7CitzdGF0aWMgaW50IG14MzFfY3B1X3JldiA9IC0xOwogCiBzdGF0aWMgc3RydWN0IHsKIAl1OCBzcmV2OwogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqdjsKIAl1bnNpZ25lZCBpbnQgcmV2OwotfSBteDMxX2NwdV90eXBlW10gX19pbml0ZGF0YSA9IHsKLQl7IC5zcmV2ID0gMHgwMCwgLm5hbWUgPSAiaS5NWDMxKEwpIiwgLnYgPSAiMS4wIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzAJfSwKLQl7IC5zcmV2ID0gMHgxMCwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnYgPSAiMS4xIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEJfSwKLQl7IC5zcmV2ID0gMHgxMSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnYgPSAiMS4xIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEJfSwKLQl7IC5zcmV2ID0gMHgxMiwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnYgPSAiMS4xNSIsIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEJfSwKLQl7IC5zcmV2ID0gMHgxMywgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnYgPSAiMS4xNSIsIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEJfSwKLQl7IC5zcmV2ID0gMHgxNCwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnYgPSAiMS4yIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzIJfSwKLQl7IC5zcmV2ID0gMHgxNSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnYgPSAiMS4yIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzIJfSwKLQl7IC5zcmV2ID0gMHgyOCwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnYgPSAiMi4wIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzAJfSwKLQl7IC5zcmV2ID0gMHgyOSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnYgPSAiMi4wIiwgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzAJfSwKK30gbXgzMV9jcHVfdHlwZVtdID0geworCXsgLnNyZXYgPSAweDAwLCAubmFtZSA9ICJpLk1YMzEoTCkiLCAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8wIH0sCisJeyAuc3JldiA9IDB4MTAsIC5uYW1lID0gImkuTVgzMSIsICAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEgfSwKKwl7IC5zcmV2ID0gMHgxMSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMSB9LAorCXsgLnNyZXYgPSAweDEyLCAubmFtZSA9ICJpLk1YMzEiLCAgICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8xIH0sCisJeyAuc3JldiA9IDB4MTMsIC5uYW1lID0gImkuTVgzMUwiLCAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzEgfSwKKwl7IC5zcmV2ID0gMHgxNCwgLm5hbWUgPSAiaS5NWDMxIiwgICAgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzFfMiB9LAorCXsgLnNyZXYgPSAweDE1LCAubmFtZSA9ICJpLk1YMzFMIiwgICAucmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8yIH0sCisJeyAuc3JldiA9IDB4MjgsIC5uYW1lID0gImkuTVgzMSIsICAgIC5yZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzAgfSwKKwl7IC5zcmV2ID0gMHgyOSwgLm5hbWUgPSAiaS5NWDMxTCIsICAgLnJldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMCB9LAogfTsKIAotdm9pZCBfX2luaXQgbXgzMV9yZWFkX2NwdV9yZXYodm9pZCkKK3N0YXRpYyBpbnQgbXgzMV9yZWFkX2NwdV9yZXYodm9pZCkKIHsKIAl1MzIgaSwgc3JldjsKIAogCS8qIHJlYWQgU1JFViByZWdpc3RlciBmcm9tIElJTSBtb2R1bGUgKi8KIAlzcmV2ID0gX19yYXdfcmVhZGwoTVgzMV9JT19BRERSRVNTKE1YMzFfSUlNX0JBU0VfQUREUiArIE1YQ19JSU1TUkVWKSk7CisJc3JldiAmPSAweGZmOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXgzMV9jcHVfdHlwZSk7IGkrKykKIAkJaWYgKHNyZXYgPT0gbXgzMV9jcHVfdHlwZVtpXS5zcmV2KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJIkNQVSBpZGVudGlmaWVkIGFzICVzLCBzaWxpY29uIHJldiAlc1xuIiwKLQkJCQlteDMxX2NwdV90eXBlW2ldLm5hbWUsIG14MzFfY3B1X3R5cGVbaV0udik7Ci0KLQkJCW14MzFfY3B1X3JldiA9IG14MzFfY3B1X3R5cGVbaV0ucmV2OwotCQkJcmV0dXJuOworCQkJaW14X3ByaW50X3NpbGljb25fcmV2KG14MzFfY3B1X3R5cGVbaV0ubmFtZSwKKwkJCQkJCW14MzFfY3B1X3R5cGVbaV0ucmV2KTsKKwkJCXJldHVybiBteDMxX2NwdV90eXBlW2ldLnJldjsKIAkJfQogCi0JbXgzMV9jcHVfcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTjsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgIlVua25vd24gQ1BVIGlkZW50aWZpZXIuIHNyZXYgPSAlMDJ4XG4iLCBzcmV2KTsKKwlpbXhfcHJpbnRfc2lsaWNvbl9yZXYoImkuTVgzMSIsIElNWF9DSElQX1JFVklTSU9OX1VOS05PV04pOworCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOwogfQorCitpbnQgbXgzMV9yZXZpc2lvbih2b2lkKQoreworCWlmIChteDMxX2NwdV9yZXYgPT0gLTEpCisJCW14MzFfY3B1X3JldiA9IG14MzFfcmVhZF9jcHVfcmV2KCk7CisKKwlyZXR1cm4gbXgzMV9jcHVfcmV2OworfQorRVhQT1JUX1NZTUJPTChteDMxX3JldmlzaW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2NwdS1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDM1LmMKaW5kZXggNjYzN2NkOC4uODQ2ZTQ2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1LWlteDM1LmMKQEAgLTEzLDMyICsxMywzMCBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lpbS5oPgogCi11bnNpZ25lZCBpbnQgbXgzNV9jcHVfcmV2OwotRVhQT1JUX1NZTUJPTChteDM1X2NwdV9yZXYpOworc3RhdGljIGludCBteDM1X2NwdV9yZXYgPSAtMTsKIAotdm9pZCBfX2luaXQgbXgzNV9yZWFkX2NwdV9yZXYodm9pZCkKK3N0YXRpYyBpbnQgbXgzNV9yZWFkX2NwdV9yZXYodm9pZCkKIHsKIAl1MzIgcmV2OwotCWNoYXIgKnNyZXY7CiAKIAlyZXYgPSBfX3Jhd19yZWFkbChNWDM1X0lPX0FERFJFU1MoTVgzNV9JSU1fQkFTRV9BRERSICsgTVhDX0lJTVNSRVYpKTsKIAlzd2l0Y2ggKHJldikgewogCWNhc2UgMHgwMDoKLQkJbXgzNV9jcHVfcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMV8wOwotCQlzcmV2ID0gIjEuMCI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMV8wOwogCWNhc2UgMHgxMDoKLQkJbXgzNV9jcHVfcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8wOwotCQlzcmV2ID0gIjIuMCI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMl8wOwogCWNhc2UgMHgxMToKLQkJbXgzNV9jcHVfcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8xOwotCQlzcmV2ID0gIjIuMSI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMl8xOwogCWRlZmF1bHQ6Ci0JCW14MzVfY3B1X3JldiA9IElNWF9DSElQX1JFVklTSU9OX1VOS05PV047Ci0JCXNyZXYgPSAidW5rbm93biI7CisJCXJldHVybiBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOOwogCX0KLQotCXByaW50ayhLRVJOX0lORk8gIkNQVSBpZGVudGlmaWVkIGFzIGkuTVgzNSwgc2lsaWNvbiByZXYgJXNcbiIsIHNyZXYpOwogfQorCitpbnQgbXgzNV9yZXZpc2lvbih2b2lkKQoreworCWlmIChteDM1X2NwdV9yZXYgPT0gLTEpCisJCW14MzVfY3B1X3JldiA9IG14MzVfcmVhZF9jcHVfcmV2KCk7CisKKwlyZXR1cm4gbXgzNV9jcHVfcmV2OworfQorRVhQT1JUX1NZTUJPTChteDM1X3JldmlzaW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MjcuaCBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MjcuaAppbmRleCA3Zjk3YTNjLi4yZjcyN2Q3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDI3LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgyNy5oCkBAIC03NiwzICs3Niw3IEBACiAjZGVmaW5lIGlteDI3X2FkZF9zcGlfaW14MChwZGF0YSkJaW14MjdfYWRkX2NzcGkoMCwgcGRhdGEpCiAjZGVmaW5lIGlteDI3X2FkZF9zcGlfaW14MShwZGF0YSkJaW14MjdfYWRkX2NzcGkoMSwgcGRhdGEpCiAjZGVmaW5lIGlteDI3X2FkZF9zcGlfaW14MihwZGF0YSkJaW14MjdfYWRkX2NzcGkoMiwgcGRhdGEpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgaW14MjdfcGF0YV9pbXhfZGF0YTsKKyNkZWZpbmUgaW14MjdfYWRkX3BhdGFfaW14KCkgXAorCWlteF9hZGRfcGF0YV9pbXgoJmlteDI3X3BhdGFfaW14X2RhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDMxLmggYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDMxLmgKaW5kZXggZGJlOTQwZC4uNDg4ZTI0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzMS5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MzEuaApAQCAtNzgsMyArNzgsNyBAQAogI2RlZmluZSBpbXgzMV9hZGRfc3BpX2lteDAocGRhdGEpCWlteDMxX2FkZF9jc3BpKDAsIHBkYXRhKQogI2RlZmluZSBpbXgzMV9hZGRfc3BpX2lteDEocGRhdGEpCWlteDMxX2FkZF9jc3BpKDEsIHBkYXRhKQogI2RlZmluZSBpbXgzMV9hZGRfc3BpX2lteDIocGRhdGEpCWlteDMxX2FkZF9jc3BpKDIsIHBkYXRhKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDMxX3BhdGFfaW14X2RhdGE7CisjZGVmaW5lIGlteDMxX2FkZF9wYXRhX2lteCgpIFwKKwlpbXhfYWRkX3BhdGFfaW14KCZpbXgzMV9wYXRhX2lteF9kYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzNS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgzNS5oCmluZGV4IDIzNGNiZDMuLjdiOTllZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MzUuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzLWlteDM1LmgKQEAgLTgxLDMgKzgxLDcgQEAKIAlpbXhfYWRkX3NwaV9pbXgoJmlteDM1X2NzcGlfZGF0YVtpZF0sIHBkYXRhKQogI2RlZmluZSBpbXgzNV9hZGRfc3BpX2lteDAocGRhdGEpCWlteDM1X2FkZF9jc3BpKDAsIHBkYXRhKQogI2RlZmluZSBpbXgzNV9hZGRfc3BpX2lteDEocGRhdGEpCWlteDM1X2FkZF9jc3BpKDEsIHBkYXRhKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDM1X3BhdGFfaW14X2RhdGE7CisjZGVmaW5lIGlteDM1X2FkZF9wYXRhX2lteCgpIFwKKwlpbXhfYWRkX3BhdGFfaW14KCZpbXgzNV9wYXRhX2lteF9kYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZ3BjLmMgYi9hcmNoL2FybS9tYWNoLWlteC9ncGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTUzN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZ3BjLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKworI2RlZmluZSBHUENfSU1SMQkJMHgwMDgKKyNkZWZpbmUgR1BDX1BHQ19DUFVfUEROCQkweDJhMAorCisjZGVmaW5lIElNUl9OVU0JCQk0CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmdwY19iYXNlOworc3RhdGljIHUzMiBncGNfd2FrZV9pcnFzW0lNUl9OVU1dOworc3RhdGljIHUzMiBncGNfc2F2ZWRfaW1yc1tJTVJfTlVNXTsKKwordm9pZCBpbXhfZ3BjX3ByZV9zdXNwZW5kKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpyZWdfaW1yMSA9IGdwY19iYXNlICsgR1BDX0lNUjE7CisJaW50IGk7CisKKwkvKiBUZWxsIEdQQyB0byBwb3dlciBvZmYgQVJNIGNvcmUgd2hlbiBzdXNwZW5kICovCisJd3JpdGVsX3JlbGF4ZWQoMHgxLCBncGNfYmFzZSArIEdQQ19QR0NfQ1BVX1BETik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1SX05VTTsgaSsrKSB7CisJCWdwY19zYXZlZF9pbXJzW2ldID0gcmVhZGxfcmVsYXhlZChyZWdfaW1yMSArIGkgKiA0KTsKKwkJd3JpdGVsX3JlbGF4ZWQofmdwY193YWtlX2lycXNbaV0sIHJlZ19pbXIxICsgaSAqIDQpOworCX0KK30KKwordm9pZCBpbXhfZ3BjX3Bvc3RfcmVzdW1lKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpyZWdfaW1yMSA9IGdwY19iYXNlICsgR1BDX0lNUjE7CisJaW50IGk7CisKKwkvKiBLZWVwIEFSTSBjb3JlIHBvd2VyZWQgb24gZm9yIG90aGVyIGxvdy1wb3dlciBtb2RlcyAqLworCXdyaXRlbF9yZWxheGVkKDB4MCwgZ3BjX2Jhc2UgKyBHUENfUEdDX0NQVV9QRE4pOworCisJZm9yIChpID0gMDsgaSA8IElNUl9OVU07IGkrKykKKwkJd3JpdGVsX3JlbGF4ZWQoZ3BjX3NhdmVkX2ltcnNbaV0sIHJlZ19pbXIxICsgaSAqIDQpOworfQorCitzdGF0aWMgaW50IGlteF9ncGNfaXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQoreworCXVuc2lnbmVkIGludCBpZHggPSBkLT5pcnEgLyAzMiAtIDE7CisJdTMyIG1hc2s7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIFNQSSBpcnEgKi8KKwlpZiAoZC0+aXJxIDwgMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFzayA9IDEgPDwgZC0+aXJxICUgMzI7CisJZ3BjX3dha2VfaXJxc1tpZHhdID0gb24gPyBncGNfd2FrZV9pcnFzW2lkeF0gfCBtYXNrIDoKKwkJCQkgIGdwY193YWtlX2lycXNbaWR4XSAmIH5tYXNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlteF9ncGNfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbDsKKworCS8qIFNhbml0eSBjaGVjayBmb3IgU1BJIGlycSAqLworCWlmIChkLT5pcnEgPCAzMikKKwkJcmV0dXJuOworCisJcmVnID0gZ3BjX2Jhc2UgKyBHUENfSU1SMSArIChkLT5pcnEgLyAzMiAtIDEpICogNDsKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH4oMSA8PCBkLT5pcnEgJSAzMik7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBpbXhfZ3BjX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJLyogU2FuaXR5IGNoZWNrIGZvciBTUEkgaXJxICovCisJaWYgKGQtPmlycSA8IDMyKQorCQlyZXR1cm47CisKKwlyZWcgPSBncGNfYmFzZSArIEdQQ19JTVIxICsgKGQtPmlycSAvIDMyIC0gMSkgKiA0OworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKTsKKwl2YWwgfD0gMSA8PCAoZC0+aXJxICUgMzIpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKK30KKwordm9pZCBfX2luaXQgaW14X2dwY19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpbXg2cS1ncGMiKTsKKwlncGNfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlXQVJOX09OKCFncGNfYmFzZSk7CisKKwkvKiBSZWdpc3RlciBHUEMgYXMgdGhlIHNlY29uZGFyeSBpbnRlcnJ1cHQgY29udHJvbGxlciBiZWhpbmQgR0lDICovCisJZ2ljX2FyY2hfZXh0bi5pcnFfbWFzayA9IGlteF9ncGNfaXJxX21hc2s7CisJZ2ljX2FyY2hfZXh0bi5pcnFfdW5tYXNrID0gaW14X2dwY19pcnFfdW5tYXNrOworCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gaW14X2dwY19pcnFfc2V0X3dha2U7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9oZWFkLXY3LlMgYi9hcmNoL2FybS9tYWNoLWlteC9oZWFkLXY3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyOWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2hlYWQtdjcuUwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorCisJLnNlY3Rpb24gIi50ZXh0LmhlYWQiLCAiYXgiCisJX19DUFVJTklUCisKKy8qCisgKiBUaGUgc2Vjb25kYXJ5IGtlcm5lbCBpbml0IGNhbGxzIHY3X2ZsdXNoX2RjYWNoZV9hbGwgYmVmb3JlIGl0IGVuYWJsZXMKKyAqIHRoZSBMMTsgaG93ZXZlciwgdGhlIEwxIGNvbWVzIG91dCBvZiByZXNldCBpbiBhbiB1bmRlZmluZWQgc3RhdGUsIHNvCisgKiB0aGUgY2xlYW4gKyBpbnZhbGlkYXRlIHBlcmZvcm1lZCBieSB2N19mbHVzaF9kY2FjaGVfYWxsIGNhdXNlcyBhIGJ1bmNoCisgKiBvZiBjYWNoZSBsaW5lcyB3aXRoIHVuaW5pdGlhbGl6ZWQgZGF0YSBhbmQgdW5pbml0aWFsaXplZCB0YWdzIHRvIGdldAorICogd3JpdHRlbiBvdXQgdG8gbWVtb3J5LCB3aGljaCBkb2VzIHJlYWxseSB1bnBsZWFzYW50IHRoaW5ncyB0byB0aGUgbWFpbgorICogcHJvY2Vzc29yLiAgV2UgZml4IHRoaXMgYnkgcGVyZm9ybWluZyBhbiBpbnZhbGlkYXRlLCByYXRoZXIgdGhhbiBhCisgKiBjbGVhbiArIGludmFsaWRhdGUsIGJlZm9yZSBqdW1waW5nIGludG8gdGhlIGtlcm5lbC4KKyAqCisgKiBUaGlzIGZ1bmNpdG9uIGlzIGNsb25lZCBmcm9tIGFyY2gvYXJtL21hY2gtdGVncmEvaGVhZHNtcC5TLCBhbmQgbmVlZHMKKyAqIHRvIGJlIGNhbGxlZCBmb3IgYm90aCBzZWNvbmRhcnkgY29yZXMgc3RhcnR1cCBhbmQgcHJpbWFyeSBjb3JlIHJlc3VtZQorICogcHJvY2VkdXJlcy4gIElkZWFsbHksIGl0IHNob3VsZCBiZSBtb3ZlZCBpbnRvIGFyY2gvYXJtL21tL2NhY2hlLXY3LlMuCisgKi8KK0VOVFJZKHY3X2ludmFsaWRhdGVfbDEpCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDIsIHIwLCBjMCwgYzAsIDAKKwltcmMJcDE1LCAxLCByMCwgYzAsIGMwLCAwCisKKwlsZHIJcjEsID0weDdmZmYKKwlhbmQJcjIsIHIxLCByMCwgbHNyICMxMworCisJbGRyCXIxLCA9MHgzZmYKKworCWFuZAlyMywgcjEsIHIwLCBsc3IgIzMJQCBOdW1XYXlzIC0gMQorCWFkZAlyMiwgcjIsICMxCQlAIE51bVNldHMKKworCWFuZAlyMCwgcjAsICMweDcKKwlhZGQJcjAsIHIwLCAjNAlAIFNldFNoaWZ0CisKKwljbHoJcjEsIHIzCQlAIFdheVNoaWZ0CisJYWRkCXI0LCByMywgIzEJQCBOdW1XYXlzCisxOglzdWIJcjIsIHIyLCAjMQlAIE51bVNldHMtLQorCW1vdglyMywgcjQJCUAgVGVtcCA9IE51bVdheXMKKzI6CXN1YnMJcjMsIHIzLCAjMQlAIFRlbXAtLQorCW1vdglyNSwgcjMsIGxzbCByMQorCW1vdglyNiwgcjIsIGxzbCByMAorCW9ycglyNSwgcjUsIHI2CUAgUmVnID0gKFRlbXA8PFdheVNoaWZ0KXwoTnVtU2V0czw8U2V0U2hpZnQpCisJbWNyCXAxNSwgMCwgcjUsIGM3LCBjNiwgMgorCWJndAkyYgorCWNtcAlyMiwgIzAKKwliZ3QJMWIKKwlkc2IKKwlpc2IKKwltb3YJcGMsIGxyCitFTkRQUk9DKHY3X2ludmFsaWRhdGVfbDEpCisKKyNpZmRlZiBDT05GSUdfU01QCitFTlRSWSh2N19zZWNvbmRhcnlfc3RhcnR1cCkKKwlibAl2N19pbnZhbGlkYXRlX2wxCisJYglzZWNvbmRhcnlfc3RhcnR1cAorRU5EUFJPQyh2N19zZWNvbmRhcnlfc3RhcnR1cCkKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGxvY2F0ZWQgaW50byB0aGUgLmRhdGEgc2VjdGlvbi4gIFRoaXMgaXMgdG8KKyAqIGFsbG93IHBoeXNfbDJ4MF9zYXZlZF9yZWdzIHRvIGJlIGFjY2Vzc2VkIHdpdGggYSByZWxhdGl2ZSBsb2FkCisgKiBhcyB3ZSBhcmUgcnVubmluZyBvbiBwaHlzaWNhbCBhZGRyZXNzIGhlcmUuCisgKi8KKwkuZGF0YQorCS5hbGlnbgorCisJLm1hY3JvCXBsMzEwX3Jlc3VtZQorCWxkcglyMiwgcGh5c19sMngwX3NhdmVkX3JlZ3MKKwlsZHIJcjAsIFtyMiwgI0wyWDBfUl9QSFlfQkFTRV0JQCBnZXQgcGh5c2ljYWwgYmFzZSBvZiBsMngwCisJbGRyCXIxLCBbcjIsICNMMlgwX1JfQVVYX0NUUkxdCUAgZ2V0IGF1eF9jdHJsIHZhbHVlCisJc3RyCXIxLCBbcjAsICNMMlgwX0FVWF9DVFJMXQlAIHJlc3RvcmUgYXV4X2N0cmwKKwltb3YJcjEsICMweDEKKwlzdHIJcjEsIFtyMCwgI0wyWDBfQ1RSTF0JCUAgcmUtZW5hYmxlIEwyCisJLmVuZG0KKworRU5UUlkodjdfY3B1X3Jlc3VtZSkKKwlibAl2N19pbnZhbGlkYXRlX2wxCisJcGwzMTBfcmVzdW1lCisJYgljcHVfcmVzdW1lCitFTkRQUk9DKHY3X2NwdV9yZXN1bWUpCisKKwkuZ2xvYmwJcGh5c19sMngwX3NhdmVkX3JlZ3MKK3BoeXNfbDJ4MF9zYXZlZF9yZWdzOgorICAgICAgICAubG9uZyAgIDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtaW14L2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ5M2FiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaG90cGx1Zy5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKworaW50IHBsYXRmb3JtX2NwdV9raWxsKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHRvIHNodXRkb3duIGEgQ1BVCisgKgorICogQ2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZAorICovCit2b2lkIHBsYXRmb3JtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlpbXhfZW5hYmxlX2NwdShjcHUsIGZhbHNlKTsKKwljcHVfZG9faWRsZSgpOworCisJLyogV2Ugc2hvdWxkIG5ldmVyIHJldHVybiBmcm9tIGlkbGUgKi8KKwlwYW5pYygiY3B1ICVkIHVuZXhwZWN0ZWRseSBleGl0IGZyb20gc2h1dGRvd25cbiIsIGNwdSk7Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qCisJICogd2UgZG9uJ3QgYWxsb3cgQ1BVIDAgdG8gYmUgc2h1dGRvd24gKGl0IGlzIHN0aWxsIHRvbyBzcGVjaWFsCisJICogZS5nLiBjbG9jayB0aWNrIGludGVycnVwdHMpCisJICovCisJcmV0dXJuIGNwdSA9PSAwID8gLUVQRVJNIDogMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2lvbXV4LWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9pb211eC1pbXgzMS5jCmluZGV4IGNmOGY4MDkuLjgyYmQ0NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2lvbXV4LWlteDMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW9tdXgtaW14MzEuYwpAQCAtMTcsMTMgKzE3LDEyIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCiAgKiBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgzLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9sbHVhcnQuYyBiL2FyY2gvYXJtL21hY2gtaW14L2xsdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9sbHVhcnQuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlteF9sbHVhcnRfZGVzYyA9IHsKKyNpZmRlZiBDT05GSUdfREVCVUdfSU1YNlFfVUFSVAorCS52aXJ0dWFsCT0gTVg2UV9JT19QMlYoTVg2UV9VQVJUNF9CQVNFX0FERFIpLAorCS5wZm4JCT0gX19waHlzX3RvX3BmbihNWDZRX1VBUlQ0X0JBU0VfQUREUiksCisJLmxlbmd0aAkJPSBNWDZRX1VBUlQ0X1NJWkUsCisJLnR5cGUJCT0gTVRfREVWSUNFLAorI2VuZGlmCit9OworCit2b2lkIF9faW5pdCBpbXhfbGx1YXJ0X21hcF9pbyh2b2lkKQoreworCWlmIChpbXhfbGx1YXJ0X2Rlc2MudmlydHVhbCkKKwkJaW90YWJsZV9pbml0KCZpbXhfbGx1YXJ0X2Rlc2MsIDEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbG9jYWx0aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbG9jYWx0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTYzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9sb2NhbHRpbWVyLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGFzbS9zbXBfdHdkLmg+CisKKy8qCisgKiBTZXR1cCB0aGUgbG9jYWwgY2xvY2sgZXZlbnRzIGZvciBhIENQVS4KKyAqLworaW50IF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImFybSxzbXAtdHdkIik7CisJaWYgKCF0d2RfYmFzZSkgeworCQl0d2RfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwkJV0FSTl9PTighdHdkX2Jhc2UpOworCX0KKwlldnQtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwl0d2RfdGltZXJfc2V0dXAoZXZ0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYwppbmRleCBhNDA0Yzg5Li4xZTQ4NmU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJLm1hcF9pbyAgICAgICA9IG14MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgICA9IGlteDFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgICAgID0gbXgxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxICAgPSBpbXgxX2hhbmRsZV9pcnEsCiAJLnRpbWVyICAgICAgICA9ICZhcGY5MzI4X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBhcGY5MzI4X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcm1hZGlsbG81eDAuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYXJtYWRpbGxvNXgwLmMKaW5kZXggZWRlMjcxMC4uYzlhOWNmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcm1hZGlsbG81eDAuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFybWFkaWxsbzV4MC5jCkBAIC0zMTQsMjUgKzMxNCwxOSBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBhcm1hZGlsbG81eDBfbm9yX2ZsYXNoX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEKKwkJYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkud2lkdGgJCT0gMiwKIAkucGFydHMJCT0gYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wYXJ0aXRpb25zKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9yZXNvdXJjZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9yZXNvdXJjZSBfX2luaXRjb25zdCA9IHsKIAkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiAJLnN0YXJ0CQk9IE1YMzFfQ1MwX0JBU0VfQUREUiwKIAkuZW5kCQk9IE1YMzFfQ1MwX0JBU0VfQUREUiArIFNaXzY0TSAtIDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhcm1hZGlsbG81eDBfbm9yX2ZsYXNoID0gewotCS5uYW1lCQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwkJPSAxLAotCS5yZXNvdXJjZQkJPSAmYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9yZXNvdXJjZSwKLX07Ci0KIC8qCiAgKiBGQiBzdXBwb3J0CiAgKi8KQEAgLTUxNCw4ICs1MDgsMTAgQEAKIAlpbXgzMV9hZGRfbXgzX3NkY19mYigmbXgzZmJfcGRhdGEpOwogCiAJLyogUmVnaXN0ZXIgTk9SIEZsYXNoICovCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmYXJtYWRpbGxvNXgwX25vcl9mbGFzaCwKLQkJCSAgICAmYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9wZGF0YSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKE5VTEwsICJwaHlzbWFwLWZsYXNoIiwgLTEsCisJCQkmYXJtYWRpbGxvNXgwX25vcl9mbGFzaF9yZXNvdXJjZSwgMSwKKwkJCSZhcm1hZGlsbG81eDBfbm9yX2ZsYXNoX3BkYXRhLAorCQkJc2l6ZW9mKGFybWFkaWxsbzV4MF9ub3JfZmxhc2hfcGRhdGEpKTsKIAogCS8qIFJlZ2lzdGVyIE5BTkQgRmxhc2ggKi8KIAlpbXgzMV9hZGRfbXhjX25hbmQoJmFybWFkaWxsbzV4MF9uYW5kX2JvYXJkX2luZm8pOwpAQCAtNTU4LDEwICs1NTQsMTEgQEAKIAogTUFDSElORV9TVEFSVChBUk1BRElMTE81WDAsICJBcm1hZGlsbG8tNTAwIikKIAkvKiBNYWludGFpbmVyOiBBbGJlcnRvIFBhbml6em8gICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJmFybWFkaWxsbzV4MF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gYXJtYWRpbGxvNXgwX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1idWcuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtYnVnLmMKaW5kZXggZjQ5NDcwNS4uMzEzZjYyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1idWcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWJ1Zy5jCkBAIC02Miw2ICs2Miw3IEBACiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmYnVnX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBidWdfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDI3LmMKaW5kZXggZjg1MWZlOS4uZWRiMzczMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MjcuYwpAQCAtMzExLDEwICszMTEsMTEgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoRVVLUkVBX0NQVUlNWDI3LCAiRVVLUkVBIENQVUlNWDI3IikKLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmZXVrcmVhX2NwdWlteDI3X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14MjdfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMKaW5kZXggNGJkMDgzYi4uNjZhZjJlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MzUuYwpAQCAtNjYsNyArNjYsNyBAQAogCQlJMkNfQk9BUkRfSU5GTygidHNjMjAwNyIsIDB4NDgpLAogCQkudHlwZQkJPSAidHNjMjAwNyIsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJnRzYzIwMDdfaW5mbywKLQkJLmlycQkJPSBncGlvX3RvX2lycShUU0MyMDA3X0lSUUdQSU8pLAorCQkuaXJxCQk9IElNWF9HUElPX1RPX0lSUShUU0MyMDA3X0lSUUdQSU8pLAogCX0sCiB9OwogCkBAIC0xOTQsMTAgKzE5NCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKEVVS1JFQV9DUFVJTVgzNVNELCAiRXVrcmVhIENQVUlNWDM1IikKIAkvKiBNYWludGFpbmVyOiBFdWtyZWEgRWxlY3Ryb21hdGlxdWUgKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MzVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDM1X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzVfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmZXVrcmVhX2NwdWlteDM1X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14MzVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWV1a3JlYV9jcHVpbXgyNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1ldWtyZWFfY3B1aW14MjUuYwppbmRleCAyNDQyZDVkLi5hYjhmYmNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWV1a3JlYV9jcHVpbXgyNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtZXVrcmVhX2NwdWlteDI1LmMKQEAgLTE2MywxMCArMTYzLDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoRVVLUkVBX0NQVUlNWDI1U0QsICJFdWtyZWEgQ1BVSU1YMjUiKQogCS8qIE1haW50YWluZXI6IEV1a3JlYSBFbGVjdHJvbWF0aXF1ZSAqLwotCS5ib290X3BhcmFtcyA9IE1YMjVfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyNV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyNV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjVfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyNV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZldWtyZWFfY3B1aW14MjVfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IGV1a3JlYV9jcHVpbXgyNV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14Mjdfdmlzc3RyaW1fbTEwLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3X3Zpc3N0cmltX20xMC5jCmluZGV4IDY3NzhmODEuLjM4ZWI5ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14Mjdfdmlzc3RyaW1fbTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN192aXNzdHJpbV9tMTAuYwpAQCAtMjc1LDEwICsyNzUsMTEgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoSU1YMjdfVklTU1RSSU1fTTEwLCAiVmlzdGEgU2lsaWNvbiBWaXNzdHJpbV9NMTAiKQotCS5ib290X3BhcmFtcyA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyN19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyN19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjdfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyN19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZ2aXNzdHJpbV9tMTBfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHZpc3N0cmltX20xMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdpcGNhbS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKaW5kZXggMjcyZjc5My4uNzA1MjE1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2lwY2FtLmMKQEAgLTcxLDEwICs3MSwxMSBAQAogCiBNQUNISU5FX1NUQVJUKElNWDI3SVBDQU0sICJGcmVlc2NhbGUgSU1YMjdJUENBTSIpCiAJLyogbWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgyN2lwY2FtX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDI3aXBjYW1faW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3bGl0ZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgyN2xpdGUuYwppbmRleCBkODFhNzY5Li44ZDZhNjM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDI3bGl0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MjdsaXRlLmMKQEAgLTc3LDEwICs3NywxMSBAQAogfTsKIAogTUFDSElORV9TVEFSVChJTVgyN0xJVEUsICJMb2dpY1BEIGkuTVgyN0xJVEUiKQotCS5ib290X3BhcmFtcyA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyN19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyN19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjdfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyN19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDI3bGl0ZV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgyN2xpdGVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmNWZhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnEuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsIE5VTEwsIE5VTEwpOworCisJaW14NnFfcG1faW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfbWFwX2lvKHZvaWQpCit7CisJaW14X2xsdWFydF9tYXBfaW8oKTsKKwlpbXhfc2N1X21hcF9pbygpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKK3sKKwlzdGF0aWMgaW50IGdwaW9faXJxX2Jhc2UgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBBUkNIX05SX0dQSU9TIC0KKwkJCQkgICAzMiAqIDc7IC8qIGlteDZxIGdldHMgNyBncGlvIHBvcnRzICovCisKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIGdwaW9faXJxX2Jhc2UpOworCWdwaW9faXJxX2Jhc2UgKz0gMzI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDZxX2lycV9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiLCAuZGF0YSA9IGdpY19vZl9pbml0LCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZxLWdwaW8iLCAuZGF0YSA9IGlteDZxX2dwaW9fYWRkX2lycV9kb21haW4sIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfaW5pdF9pcnEodm9pZCkKK3sKKwlsMngwX29mX2luaXQoMCwgfjBVTCk7CisJaW14X3NyY19pbml0KCk7CisJaW14X2dwY19pbml0KCk7CisJb2ZfaXJxX2luaXQoaW14NnFfaXJxX21hdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteDZxX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDZxX2Nsb2Nrc19pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGlteDZxX3RpbWVyID0geworCS5pbml0ID0gaW14NnFfdGltZXJfaW5pdCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppbXg2cV9kdF9jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJmc2wsaW14NnEtc2FicmVhdXRvIiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChJTVg2USwgIkZyZWVzY2FsZSBpLk1YNiBRdWFkIChEZXZpY2UgVHJlZSkiKQorCS5tYXBfaW8JCT0gaW14NnFfbWFwX2lvLAorCS5pbml0X2lycQk9IGlteDZxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxCT0gaW14NnFfaGFuZGxlX2lycSwKKwkudGltZXIJCT0gJmlteDZxX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBpbXg2cV9pbml0X21hY2hpbmUsCisJLmR0X2NvbXBhdAk9IGlteDZxX2R0X2NvbXBhdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1rem1fYXJtMTFfMDEuYwppbmRleCBlNDcyYTFkLi41ZjM3Zjg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gta3ptX2FybTExXzAxLmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14My5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXgzMS5oIgpAQCAtMjcxLDEwICsyNzIsMTEgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoS1pNX0FSTTExXzAxLCAiS3lvdG8gTWljcm9jb21wdXRlciBDby4sIEx0ZC4gS1pNLUFSTTExLTAxIikKLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IGt6bV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzMV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzMV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZrem1fdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IGt6bV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MWFkcy5jCmluZGV4IDVjZDhiZWUuLmZjNDk3ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgxYWRzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDFhZHMuYwpAQCAtNjgsMjMgKzY4LDE2IEBACiAgKiBQaHlzbWFwIGZsYXNoCiAgKi8KIAotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgbXgxYWRzX2ZsYXNoX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBteDFhZHNfZmxhc2hfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkud2lkdGgJCT0gNCwJCS8qIGJhbmt3aWR0aCBpbiBieXRlcyAqLwogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgX19pbml0Y29uc3QgPSB7CiAJLnN0YXJ0CT0gTVgxX0NTMF9QSFlTLAogCS5lbmQJPSBNWDFfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAogCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxhc2hfZGV2aWNlID0gewotCS5uYW1lCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAk9IDAsCi0JLnJlc291cmNlID0gJmZsYXNoX3Jlc291cmNlLAotCS5udW1fcmVzb3VyY2VzID0gMSwKLX07Ci0KIC8qCiAgKiBJMkMKICAqLwpAQCAtMTI1LDcgKzExOCw5IEBACiAJaW14MV9hZGRfaW14X3VhcnQxKCZ1YXJ0MV9wZGF0YSk7CiAKIAkvKiBQaHlzbWFwIGZsYXNoICovCi0JbXhjX3JlZ2lzdGVyX2RldmljZSgmZmxhc2hfZGV2aWNlLCAmbXgxYWRzX2ZsYXNoX2RhdGEpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YShOVUxMLCAicGh5c21hcC1mbGFzaCIsIDAsCisJCQkmZmxhc2hfcmVzb3VyY2UsIDEsCisJCQkmbXgxYWRzX2ZsYXNoX2RhdGEsIHNpemVvZihteDFhZHNfZmxhc2hfZGF0YSkpOwogCiAJLyogSTJDICovCiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbXgxYWRzX2kyY19kZXZpY2VzLApAQCAtMTQ1LDE5ICsxNDAsMjEgQEAKIAogTUFDSElORV9TVEFSVChNWDFBRFMsICJGcmVlc2NhbGUgTVgxQURTIikKIAkvKiBNYWludGFpbmVyOiBTYXNjaGEgSGF1ZXIsIFBlbmd1dHJvbml4ICovCi0JLmJvb3RfcGFyYW1zID0gTVgxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDFhZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MWFkc19pbml0LAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNWExBRFMsICJGcmVlc2NhbGUgTVhMQURTIikKLQkuYm9vdF9wYXJhbXMgPSBNWDFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MWFkc190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgxYWRzX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDIxYWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjFhZHMuYwppbmRleCBkMzg5ZWNmLi4yNWY4NDAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjFhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjFhZHMuYwpAQCAtMzA1LDEwICszMDUsMTEgQEAKIAogTUFDSElORV9TVEFSVChNWDIxQURTLCAiRnJlZXNjYWxlIGkuTVgyMUFEUyIpCiAJLyogbWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDIxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjFhZHNfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDIxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgyMWFkc190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgyMWFkc19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYwppbmRleCA3ZjY2YTkxLi44OGRjY2YxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCkBAIC00Myw2ICs0Myw4IEBACiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDI1LmgiCiAKKyNkZWZpbmUgTVgyNVBES19DQU5fUFdETglJTVhfR1BJT19OUig0LCA2KQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCiB9OwpAQCAtMTA4LDYgKzExMCwxMSBAQAogCS8qIEkyQzEgKi8KIAlNWDI1X1BBRF9JMkMxX0NMS19fSTJDMV9DTEssCiAJTVgyNV9QQURfSTJDMV9EQVRfX0kyQzFfREFULAorCisJLyogQ0FOMSAqLworCU1YMjVfUEFEX0dQSU9fQV9fQ0FOMV9UWCwKKwlNWDI1X1BBRF9HUElPX0JfX0NBTjFfUlgsCisJTVgyNV9QQURfRDE0X19HUElPXzRfNiwJLyogQ0FOX1BXRE4gKi8KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2RhdGEgbXgyNV9mZWNfcGRhdGEgX19pbml0Y29uc3QgPSB7CkBAIC0yNDAsNiArMjQ3LDkgQEAKIAogCWlteDI1X2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgJm14MjVwZGtfZXNkaGNfcGRhdGEpOwogCWlteDI1X2FkZF9pbXhfaTJjMCgmbXgyNV8zZHNfaTJjMF9kYXRhKTsKKworCWdwaW9fcmVxdWVzdF9vbmUoTVgyNVBES19DQU5fUFdETiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiY2FuLXB3ZG4iKTsKKwlpbXgyNV9hZGRfZmxleGNhbjAoTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDI1cGRrX3RpbWVyX2luaXQodm9pZCkKQEAgLTI1MywxMCArMjYzLDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgyNV8zRFMsICJGcmVlc2NhbGUgTVgyNVBESyAoM0RTKSIpCiAJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDI1X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjVfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI1X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjVfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgyNXBka190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgyNXBka19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN18zZHMuYwppbmRleCA2ZmE2OTM0Li5iYTIzMmQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI3XzNkcy5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2bW1jMV9jb25zdW1lcnNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJsY2RfMnY4IiwgTlVMTCksCisJUkVHVUxBVE9SX1NVUFBMWSgidmNvcmUiLCAic3BpMC4wIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdm1tYzFfaW5pdCA9IHsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHZnZW5fY29uc3VtZXJzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmRkX2xjZGlvIiwgTlVMTCksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkIiwgInNwaTAuMCIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHZnZW5faW5pdCA9IHsKQEAgLTI5Myw4ICsyOTMsNyBAQAogCQkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKG14MjdfM2RzX3JlZ3VsYXRvcnMpLAogCiAJfSwKLQkuZmxhZ3MgID0gTUMxMzc4M19VU0VfUkVHVUxBVE9SIHwgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4gfAotCU1DMTM3ODNfVVNFX1JUQywKKwkuZmxhZ3MgID0gTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4gfCBNQzEzWFhYX1VTRV9SVEMsCiB9OwogCiAvKiBTUEkgKi8KQEAgLTM0OCw4ICszNDcsNiBAQAogc3RhdGljIHN0cnVjdCBsNGYwMDI0MnQwM19wZGF0YSBteDI3XzNkc19sY2RfcGRhdGEgPSB7CiAJLnJlc2V0X2dwaW8JCT0gTENEX1JFU0VULAogCS5kYXRhX2VuYWJsZV9ncGlvCT0gTENEX0VOQUJMRSwKLQkuY29yZV9zdXBwbHkJCT0gImxjZF8ydjgiLAotCS5pb19zdXBwbHkJCT0gInZkZF9sY2RpbyIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIG14MjdfM2RzX3NwaV9kZXZzW10gX19pbml0ZGF0YSA9IHsKQEAgLTM1OSw3ICszNTYsNyBAQAogCQkuYnVzX251bQk9IDEsCiAJCS5jaGlwX3NlbGVjdAk9IDAsIC8qIFNTMCAqLwogCQkucGxhdGZvcm1fZGF0YQk9ICZtYzEzNzgzX3BkYXRhLAotCQkuaXJxID0gZ3Bpb190b19pcnEoUE1JQ19JTlQpLAorCQkuaXJxID0gSU1YX0dQSU9fVE9fSVJRKFBNSUNfSU5UKSwKIAkJLm1vZGUgPSBTUElfQ1NfSElHSCwKIAl9LCB7CiAJCS5tb2RhbGlhcwk9ICJsNGYwMDI0MnQwMyIsCkBAIC00MjEsMTAgKzQxOCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE1YMjdfM0RTLCAiRnJlZXNjYWxlIE1YMjdQREsiKQogCS8qIG1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MjdwZGtfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MjdwZGtfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjdhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCmluZGV4IGZjMjZlZDcuLjc0ZGQ1NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyN2Fkcy5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyNy5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXgyNy5oIgpAQCAtMzQ1LDEwICszNDQsMTEgQEAKIAogTUFDSElORV9TVEFSVChNWDI3QURTLCAiRnJlZXNjYWxlIGkuTVgyN0FEUyIpCiAJLyogbWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdhZHNfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgyN2Fkc190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgyN2Fkc19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMV8zZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMV8zZHMuYwppbmRleCBjMjBiZTc1Li5iOGM1NGI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFfM2RzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxXzNkcy5jCkBAIC0yODUsOCArMjg1LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbDRmMDAyNDJ0MDNfcGRhdGEgbXgzMV8zZHNfbDRmMDAyNDJ0MDNfcGRhdGEgPSB7CiAJLnJlc2V0X2dwaW8JCT0gSU9NVVhfVE9fR1BJTyhNWDMxX1BJTl9MQ1MxKSwKIAkuZGF0YV9lbmFibGVfZ3Bpbwk9IElPTVVYX1RPX0dQSU8oTVgzMV9QSU5fU0VSX1JTKSwKLQkuY29yZV9zdXBwbHkJCT0gImxjZF8ydjgiLAotCS5pb19zdXBwbHkJCT0gInZkZF9sY2RpbyIsCiB9OwogCiAvKgpAQCAtNDExLDcgKzQwOSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdm1tYzFfY29uc3VtZXJzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgibGNkXzJ2OCIsIE5VTEwpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZjb3JlIiwgInNwaTAuMCIpLAogCVJFR1VMQVRPUl9TVVBQTFkoImNtb3NfMnY4IiwgInNvYy1jYW1lcmEtcGRydi4wIiksCiB9OwogCkBAIC00MjgsNyArNDI2LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2Z2VuX2NvbnN1bWVyc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZF9sY2RpbyIsIE5VTEwpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICJzcGkwLjAiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB2Z2VuX2luaXQgPSB7CkBAIC00OTQsNyArNDkyLDcgQEAKIAkJLnJlZ3VsYXRvcnMgPSBteDMxXzNkc19yZWd1bGF0b3JzLAogCQkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKG14MzFfM2RzX3JlZ3VsYXRvcnMpLAogCX0sCi0JLmZsYWdzICA9IE1DMTM3ODNfVVNFX1JFR1VMQVRPUiB8IE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOLAorCS5mbGFncyAgPSBNQzEzWFhYX1VTRV9UT1VDSFNDUkVFTiwKIH07CiAKIC8qIFNQSSAqLwpAQCAtNTQyLDcgKzU0MCw3IEBACiBteDMxXzNkc19uYW5kX2JvYXJkX2luZm8gX19pbml0Y29uc3QgPSB7CiAJLndpZHRoCQk9IDEsCiAJLmh3X2VjYwkJPSAxLAotI2lmZGVmIE1BQ0hfTVgzMV8zRFNfTVhDX05BTkRfVVNFX0JCVAorI2lmZGVmIENPTkZJR19NQUNIX01YMzFfM0RTX01YQ19OQU5EX1VTRV9CQlQKIAkuZmxhc2hfYmJ0CT0gMSwKICNlbmRpZgogfTsKQEAgLTc2NCwxMCArNzYyLDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgzMV8zRFMsICJGcmVlc2NhbGUgTVgzMVBESyAoM0RTKSIpCiAJLyogTWFpbnRhaW5lcjogRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgzMV8zZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MzFfM2RzX2luaXQsCiAJLnJlc2VydmUgPSBteDMxXzNkc19yZXNlcnZlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxYWRzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFhZHMuYwppbmRleCAyOWNhODkwLi45Y2MxYTQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFhZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFhZHMuYwpAQCAtNTM1LDEwICs1MzUsMTEgQEAKIAogTUFDSElORV9TVEFSVChNWDMxQURTLCAiRnJlZXNjYWxlIE1YMzFBRFMiKQogCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxYWRzX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDMxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzMWFkc19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDMxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MzFhZHNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MzFhZHNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaWxseS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGlsbHkuYwppbmRleCAxMjY5MTNhLi4xMDJlYzk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaWxseS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpbGx5LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KQEAgLTI5NSwxMCArMjk2LDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKExJTExZMTEzMSwgIklOQ08gc3RhcnRlYyBMSUxMWS0xMTMxIikKLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXgzMWxpbGx5X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDMxbGlsbHlfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaXRlLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFsaXRlLmMKaW5kZXggNGI0N2ZkOS4uNTM2NmQyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbGl0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMWxpdGUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Ntc2M5MTF4Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC0xMTIsOCArMTEzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9wbGF0Zm9ybV9kYXRhIG1jMTM3ODNfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuZmxhZ3MgID0gTUMxM1hYWF9VU0VfUlRDIHwKLQkJICBNQzEzWFhYX1VTRV9SRUdVTEFUT1IsCisJLmZsYWdzID0gTUMxM1hYWF9VU0VfUlRDLAogfTsKIAogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBtYzEzNzgzX3NwaV9kZXYgX19pbml0ZGF0YSA9IHsKQEAgLTI4MCwxMCArMjgwLDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVgzMUxJVEUsICJMb2dpY1BEIGkuTVgzMSBTT00iKQogCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDMxbGl0ZV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzMV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzMV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDMxbGl0ZV90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgzMWxpdGVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzFtb2JvYXJkLmMKaW5kZXggYjM1ODM4My4uOTMyNjkxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDMxbW9ib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzMW1vYm9hcmQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KQEAgLTI4LDYgKzI5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KQEAgLTIyMiw3ICsyMjcsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG1jMTM3ODNfbGVkX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9sZWRbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9sZWRfcGxhdGZvcm1fZGF0YSBtb2JvYXJkX2xlZFtdID0gewogCXsKIAkJLmlkID0gTUMxMzc4M19MRURfUjEsCiAJCS5uYW1lID0gImNvcmVib2FyZC1sZWQtNDpyZWQiLApAQCAtMjU1LDcgKzI2MCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWMxMzc4M19sZWRzX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9sZWRzID0geworc3RhdGljIHN0cnVjdCBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YSBtb2JvYXJkX2xlZHMgPSB7CiAJLm51bV9sZWRzID0gQVJSQVlfU0laRShtb2JvYXJkX2xlZCksCiAJLmxlZCA9IG1vYm9hcmRfbGVkLAogCS5mbGFncyA9IE1DMTM3ODNfTEVEX1NMRVdMSU1UQywKQEAgLTI2NCwxNCArMjY5LDIwIEBACiAJLnRjMl9wZXJpb2QgPSBNQzEzNzgzX0xFRF9QRVJJT0RfMTBNUywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9idXR0b25zX3BsYXRmb3JtX2RhdGEgbW9ib2FyZF9idXR0b25zID0geworCS5iMW9uX2ZsYWdzID0gTUMxMzc4M19CVVRUT05fREJOQ183NTBNUyB8IE1DMTM3ODNfQlVUVE9OX0VOQUJMRSB8CisJCQlNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJULAorCS5iMW9uX2tleSA9IEtFWV9QT1dFUiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWMxM3h4eF9wbGF0Zm9ybV9kYXRhIG1vYm9hcmRfcG1pYyA9IHsKIAkucmVndWxhdG9ycyA9IHsKIAkJLnJlZ3VsYXRvcnMgPSBtb2JvYXJkX3JlZ3VsYXRvcnMsCiAJCS5udW1fcmVndWxhdG9ycyA9IEFSUkFZX1NJWkUobW9ib2FyZF9yZWd1bGF0b3JzKSwKIAl9LAogCS5sZWRzID0gJm1vYm9hcmRfbGVkcywKLQkuZmxhZ3MgPSBNQzEzWFhYX1VTRV9SRUdVTEFUT1IgfCBNQzEzWFhYX1VTRV9SVEMgfAotCQlNQzEzWFhYX1VTRV9BREMgfCBNQzEzWFhYX1VTRV9MRUQsCisJLmJ1dHRvbnMgPSAmbW9ib2FyZF9idXR0b25zLAorCS5mbGFncyA9IE1DMTNYWFhfVVNFX1JUQyB8IE1DMTNYWFhfVVNFX0FEQywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gbW9ib2FyZF9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CkBAIC00OTAsNiArNTAxLDE4IEBACiAKIH0KIAorc3RhdGljIHZvaWQgbXgzMW1vYm9hcmRfcG93ZXJvZmYodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0X3N5cygiaW14Mi13ZHQuMCIsIE5VTEwpOworCisJaWYgKCFJU19FUlIoY2xrKSkKKwkJY2xrX2VuYWJsZShjbGspOworCisJbXhjX2lvbXV4X21vZGUoTVgzMV9QSU5fV0FUQ0hET0dfUlNUX19XQVRDSERPR19SU1QpOworCisJX19yYXdfd3JpdGV3KDEgPDwgNiB8IDEgPDwgMiwgTVgzMV9JT19BRERSRVNTKE1YMzFfV0RPR19CQVNFX0FERFIpKTsKK30KKwogc3RhdGljIGludCBteDMxbW9ib2FyZF9iYXNlYm9hcmQ7CiBjb3JlX3BhcmFtKG14MzFtb2JvYXJkX2Jhc2Vib2FyZCwgbXgzMW1vYm9hcmRfYmFzZWJvYXJkLCBpbnQsIDA0NDQpOwogCkBAIC01MjgsNiArNTUxLDggQEAKIAogCW1vYm9hcmRfdXNiaDJfaW5pdCgpOwogCisJcG1fcG93ZXJfb2ZmID0gbXgzMW1vYm9hcmRfcG93ZXJvZmY7CisKIAlzd2l0Y2ggKG14MzFtb2JvYXJkX2Jhc2Vib2FyZCkgewogCWNhc2UgTVgzMU5PQk9BUkQ6CiAJCWJyZWFrOwpAQCAtNTY3LDExICs1OTIsMTIgQEAKIAogTUFDSElORV9TVEFSVChNWDMxTU9CT0FSRCwgIkVQRkwgTW9ib3RzIG14MzFtb2JvYXJkIikKIAkvKiBNYWludGFpbmVyOiBWYWxlbnRpbiBMb25nY2hhbXAsIEVQRkwgTW9ib3RzIGdyb3VwICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5yZXNlcnZlID0gbXgzMW1vYm9hcmRfcmVzZXJ2ZSwKIAkubWFwX2lvID0gbXgzMV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzMV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzMV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDMxbW9ib2FyZF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXgzMW1vYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzVfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MzVfM2RzLmMKaW5kZXggYjNiOWJkOC4uN2E0NjIwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDM1XzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgzNV8zZHMuYwpAQCAtMjE3LDEwICsyMTcsMTEgQEAKIAogTUFDSElORV9TVEFSVChNWDM1XzNEUywgIkZyZWVzY2FsZSBNWDM1UERLIikKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDM1X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDM1X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgzNV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDM1X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14MzVwZGtfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14MzVfM2RzX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teHRfdGQ2MC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teHRfdGQ2MC5jCmluZGV4IGM4NTg3NmYuLjEyNWMxOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXh0X3RkNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14dF90ZDYwLmMKQEAgLTI2NywxMCArMjY3LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVhUX1RENjAsICJNYXh0cmFjayBpLU1YVCBURDYwIikKIAkvKiBtYWludGFpbmVyOiBNYXh0cmFjayBJbmR1c3RyaWFsICovCi0JLmJvb3RfcGFyYW1zID0gTVgyN19QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDI3X21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDI3X2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXgyN19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDI3X2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14dF90ZDYwX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteHRfdGQ2MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjYTEwMC5jCmluZGV4IDcxMDgzYWEuLjI2MDcyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNhMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY2ExMDAuYwpAQCAtNDM1LDEwICs0MzUsMTEgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoUENBMTAwLCAicGh5Q0FSRC1pLk1YMjciKQotCS5ib290X3BhcmFtcyA9IE1YMjdfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgyN19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgyN19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MjdfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgyN19oYW5kbGVfaXJxLAogCS5pbml0X21hY2hpbmUgPSBwY2ExMDBfaW5pdCwKIAkudGltZXIgPSAmcGNhMTAwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jCmluZGV4IGY0NWI3Y2QuLmVmZDZiNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzcuYwpAQCAtNjg4LDExICs2ODgsMTIgQEAKIAogTUFDSElORV9TVEFSVChQQ00wMzcsICJQaHl0ZWMgUGh5Y29yZSBwY20wMzciKQogCS8qIE1haW50YWluZXI6IFBlbmd1dHJvbml4ICovCi0JLmJvb3RfcGFyYW1zID0gTVgzeF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5yZXNlcnZlID0gcGNtMDM3X3Jlc2VydmUsCiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmcGNtMDM3X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBwY20wMzdfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYwppbmRleCAyZDZhNjRiLi5hMTdlOWM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKQEAgLTE3Niw3ICsxNzYsOSBAQAogICogc2V0dXAgb3RoZXIgc3R1ZmZzIHRvIGFjY2VzcyB0aGUgc3JhbS4gKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBwY20wMzhfaW5pdF9zcmFtKHZvaWQpCiB7Ci0JbXgyN19zZXR1cF93ZWltY3MoMSwgMHgwMDAwZDg0MywgMHgyMjI1MjUyMSwgMHgyMjIyMGEwMCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMGQ4NDMsIE1YMjdfSU9fQUREUkVTUyhNWDI3X1dFSU1fQ1NDUnhVKDEpKSk7CisJX19yYXdfd3JpdGVsKDB4MjIyNTI1MjEsIE1YMjdfSU9fQUREUkVTUyhNWDI3X1dFSU1fQ1NDUnhMKDEpKSk7CisJX19yYXdfd3JpdGVsKDB4MjIyMjBhMDAsIE1YMjdfSU9fQUREUkVTUyhNWDI3X1dFSU1fQ1NDUnhBKDEpKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgcGNtMDM4X2kyYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKQEAgLTI2Niw4ICsyNjgsNyBAQAogCQkucmVndWxhdG9ycyA9IHBjbTAzOF9yZWd1bGF0b3JzLAogCQkubnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKHBjbTAzOF9yZWd1bGF0b3JzKSwKIAl9LAotCS5mbGFncyA9IE1DMTM3ODNfVVNFX0FEQyB8IE1DMTM3ODNfVVNFX1JFR1VMQVRPUiB8Ci0JCSBNQzEzNzgzX1VTRV9UT1VDSFNDUkVFTiwKKwkuZmxhZ3MgPSBNQzEzWFhYX1VTRV9BREMgfCBNQzEzWFhYX1VTRV9UT1VDSFNDUkVFTiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gcGNtMDM4X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKQEAgLTM0OSwxMCArMzUwLDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKFBDTTAzOCwgInBoeUNPUkUtaS5NWDI3IikKLQkuYm9vdF9wYXJhbXMgPSBNWDI3X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MjdfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MjdfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDI3X2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MjdfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmcGNtMDM4X3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBwY20wMzhfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYwppbmRleCA2NjBlYzNlLi43MzY2YzJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKQEAgLTQxOCwxMCArNDE4LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoUENNMDQzLCAiUGh5dGVjIFBoeWNvcmUgcGNtMDQzIikKIAkvKiBNYWludGFpbmVyOiBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcyA9IE1YM3hfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXgzNV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzNV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzVfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzNV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZwY20wNDNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHBjbTA0M19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcW9uZy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1xb25nLmMKaW5kZXggMzYyNmY0OC4uNGZmNWZhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1xb25nLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1xb25nLmMKQEAgLTE5MCw3ICsxOTAsMTAgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBxb25nX2luaXRfbmFuZF9tdGQodm9pZCkKIHsKIAkvKiBpbml0IENTICovCi0JbXgzMV9zZXR1cF93ZWltY3MoMywgMHgwMDAwNGYwMCwgMHgyMDAxM2IzMSwgMHgwMDAyMDgwMCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDRmMDAsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dFSU1fQ1NDUnhVKDMpKSk7CisJX19yYXdfd3JpdGVsKDB4MjAwMTNiMzEsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dFSU1fQ1NDUnhMKDMpKSk7CisJX19yYXdfd3JpdGVsKDB4MDAwMjA4MDAsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dFSU1fQ1NDUnhBKDMpKSk7CisKIAlteGNfaW9tdXhfc2V0X2dwcihNVVhfU0RDVExfQ1NEMV9TRUwsIHRydWUpOwogCiAJLyogZW5hYmxlIHBpbiAqLwpAQCAtMjQ5LDYgKzI1Miw3IEBACiAJbXhjX2luaXRfaW14X3VhcnQoKTsKIAlxb25nX2luaXRfbm9yX210ZCgpOwogCXFvbmdfaW5pdF9mcGdhKCk7CisJaW14MzFfYWRkX2lteDJfd2R0KE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgcW9uZ190aW1lcl9pbml0KHZvaWQpCkBAIC0yNjIsMTAgKzI2NiwxMSBAQAogCiBNQUNISU5FX1NUQVJUKFFPTkcsICJEYXZlL0RFTlggUW9uZ0VWQi1MSVRFIikKIAkvKiBNYWludGFpbmVyOiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkggKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDN4X1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14MzFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14MzFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDMxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14MzFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmcW9uZ190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gcW9uZ19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtc2NiOTMyOC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMKaW5kZXggZGIyZDYwNC4uYmI2ZTViMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMKQEAgLTEzNywxMCArMTM3LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoU0NCOTMyOCwgIlN5bmVydHJvbml4eCBzY2I5MzI4IikKIAkvKiBTYXNjaGEgSGF1ZXIgKi8KLQkuYm9vdF9wYXJhbXMgPSAweDA4MDAwMTAwLAorCS5hdGFnX29mZnNldCA9IDEwMCwKIAkubWFwX2lvID0gbXgxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJnNjYjkzMjhfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHNjYjkzMjhfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXZwcjIwMC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC12cHIyMDAuYwppbmRleCA3ZDhlMDEyLi42OTA5MjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXZwcjIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtdnByMjAwLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCX0sIHsKIAkJSTJDX0JPQVJEX0lORk8oIm1jMTM4OTIiLCAweDA4KSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmdnByMjAwX3BtaWMsCi0JCS5pcnEgPSBncGlvX3RvX2lycShHUElPX1BNSUNfSU5UKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShHUElPX1BNSUNfSU5UKSwKIAl9CiB9OwogCkBAIC0zMTksNiArMzE5LDcgQEAKIAkubWFwX2lvID0gbXgzNV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXgzNV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14MzVfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXgzNV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZ2cHIyMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHZwcjIwMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBlODJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14My5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEFybSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKKyAqICBDb3B5cmlnaHQgMjAwNS0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAtIGFkZCBNWDMxIHNwZWNpZmljIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4LXYzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKK3N0YXRpYyB2b2lkIGlteDNfaWRsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcmVnID0gMDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJLyogZGlzYWJsZSBJIGFuZCBEIGNhY2hlICovCisJCSJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJCSJiaWMgJTAsICUwLCAjMHgwMDAwMTAwMFxuIgorCQkiYmljICUwLCAlMCwgIzB4MDAwMDAwMDRcbiIKKwkJIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKKwkJLyogaW52YWxpZGF0ZSBJIGNhY2hlICovCisJCSJtb3YgJTAsICMwXG4iCisJCSJtY3IgcDE1LCAwLCAlMCwgYzcsIGM1LCAwXG4iCisJCS8qIGNsZWFyIGFuZCBpbnZhbGlkYXRlIEQgY2FjaGUgKi8KKwkJIm1vdiAlMCwgIzBcbiIKKwkJIm1jciBwMTUsIDAsICUwLCBjNywgYzE0LCAwXG4iCisJCS8qIFdGSSAqLworCQkibW92ICUwLCAjMFxuIgorCQkibWNyIHAxNSwgMCwgJTAsIGM3LCBjMCwgNFxuIgorCQkibm9wXG4iICJub3BcbiIgIm5vcFxuIiAibm9wXG4iCisJCSJub3BcbiIgIm5vcFxuIiAibm9wXG4iCisJCS8qIGVuYWJsZSBJIGFuZCBEIGNhY2hlICovCisJCSJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCisJCSJvcnIgJTAsICUwLCAjMHgwMDAwMTAwMFxuIgorCQkib3JyICUwLCAlMCwgIzB4MDAwMDAwMDRcbiIKKwkJIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKKwkJOiAiPXIiIChyZWcpKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqaW14M19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIGludCBtdHlwZSkKK3sKKwlpZiAobXR5cGUgPT0gTVRfREVWSUNFKSB7CisJCS8qCisJCSAqIEFjY2VzcyBhbGwgcGVyaXBoZXJhbHMgYmVsb3cgMHg4MDAwMDAwMCBhcyBub25zaGFyZWQgZGV2aWNlCisJCSAqIG9uIG14MywgYnV0IGxlYXZlIGwyY2MgYWxvbmUuICBPdGhlcndpc2UgY2FjaGUgY29ycnVwdGlvbnMKKwkJICogY2FuIG9jY3VyLgorCQkgKi8KKwkJaWYgKHBoeXNfYWRkciA8IDB4ODAwMDAwMDAgJiYKKwkJCQkhYWRkcl9pbl9tb2R1bGUocGh5c19hZGRyLCBNWDN4X0wyQ0MpKQorCQkJbXR5cGUgPSBNVF9ERVZJQ0VfTk9OU0hBUkVEOworCX0KKworCXJldHVybiBfX2FybV9pb3JlbWFwKHBoeXNfYWRkciwgc2l6ZSwgbXR5cGUpOworfQorCit2b2lkIGlteDNfaW5pdF9sMngwKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpjbGtjdGxfYmFzZTsKKworLyoKKyAqIEZpcnN0IG9mIGFsbCwgd2UgbXVzdCByZXBhaXIgYnJva2VuIGNoaXAgc2V0dGluZ3MuIFRoZXJlIGFyZSBzb21lCisgKiBpLk1YMzUgQ1BVcyBpbiB0aGUgd2lsZCwgY29tbWluZyB3aXRoIGJvZ3VzIEwyIGNhY2hlIHNldHRpbmdzLiBUaGVzZQorICogbWlzY29uZmlndXJlZCBDUFVzIHdpbGwgcnVuIGFtb2sgaW1tZWRpYXRlbHkgd2hlbiB0aGUgTDIgY2FjaGUgZ2V0cyBlbmFibGVkLgorICogV29ya2FyYW91bmQgaXMgdG8gc2V0dXAgdGhlIGNvcnJlY3QgcmVnaXN0ZXIgc2V0dGluZyBwcmlvciBlbmFibGluZyB0aGUKKyAqIEwyIGNhY2hlLiBUaGlzIHNob3VsZCBub3QgaHVydCBhbHJlYWR5IHdvcmtpbmcgQ1BVcywgYXMgdGhleSBhcmUgdXNpbmcgdGhlCisgKiBzYW1lIHZhbHVlLgorICovCisjZGVmaW5lIEwyX01FTV9WQUwgMHgxMAorCisJY2xrY3RsX2Jhc2UgPSBpb3JlbWFwKE1YMzVfQ0xLQ1RMX0JBU0VfQUREUiwgNDA5Nik7CisJaWYgKGNsa2N0bF9iYXNlICE9IE5VTEwpIHsKKwkJd3JpdGVsKDB4MDAwMDA1MTUsIGNsa2N0bF9iYXNlICsgTDJfTUVNX1ZBTCk7CisJCWlvdW5tYXAoY2xrY3RsX2Jhc2UpOworCX0gZWxzZSB7CisJCXByX2VycigiTDIgY2FjaGU6IENhbm5vdCBmaXggdGltaW5nLiBUcnlpbmcgdG8gY29udGludWUgd2l0aG91dFxuIik7CisJfQorCisJbDJ4MF9iYXNlID0gaW9yZW1hcChNWDN4X0wyQ0NfQkFTRV9BRERSLCA0MDk2KTsKKwlpZiAoSVNfRVJSKGwyeDBfYmFzZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZW1hcHBpbmcgTDIgY2FjaGUgYXJlYSBmYWlsZWQgd2l0aCAlbGRcbiIsCisJCQkJUFRSX0VSUihsMngwX2Jhc2UpKTsKKwkJcmV0dXJuOworCX0KKworCWwyeDBfaW5pdChsMngwX2Jhc2UsIDB4MDAwMzAwMjQsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MzFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJaW14X21hcF9lbnRyeShNWDMxLCBYX01FTUMsIE1UX0RFVklDRSksCisJaW14X21hcF9lbnRyeShNWDMxLCBBVklDLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzEsIEFJUFMxLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzEsIEFJUFMyLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzEsIFNQQkEwLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQorICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncworICogZm9yIHRoZSBJTyBtb2R1bGVzLgorICovCit2b2lkIF9faW5pdCBteDMxX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChteDMxX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgzMV9pb19kZXNjKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXgzNV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlpbXhfbWFwX2VudHJ5KE1YMzUsIFhfTUVNQywgTVRfREVWSUNFKSwKKwlpbXhfbWFwX2VudHJ5KE1YMzUsIEFWSUMsIE1UX0RFVklDRV9OT05TSEFSRUQpLAorCWlteF9tYXBfZW50cnkoTVgzNSwgQUlQUzEsIE1UX0RFVklDRV9OT05TSEFSRUQpLAorCWlteF9tYXBfZW50cnkoTVgzNSwgQUlQUzIsIE1UX0RFVklDRV9OT05TSEFSRUQpLAorCWlteF9tYXBfZW50cnkoTVgzNSwgU1BCQTAsIE1UX0RFVklDRV9OT05TSEFSRUQpLAorfTsKKwordm9pZCBfX2luaXQgbXgzNV9tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXgzNV9pb19kZXNjLCBBUlJBWV9TSVpFKG14MzVfaW9fZGVzYykpOworfQorCit2b2lkIF9faW5pdCBpbXgzMV9pbml0X2Vhcmx5KHZvaWQpCit7CisJbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YMzEpOworCW14Y19hcmNoX3Jlc2V0X2luaXQoTVgzMV9JT19BRERSRVNTKE1YMzFfV0RPR19CQVNFX0FERFIpKTsKKwlpbXhfaWRsZSA9IGlteDNfaWRsZTsKKwlpbXhfaW9yZW1hcCA9IGlteDNfaW9yZW1hcDsKK30KKwordm9pZCBfX2luaXQgaW14MzVfaW5pdF9lYXJseSh2b2lkKQoreworCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDM1KTsKKwlteGNfaW9tdXhfdjNfaW5pdChNWDM1X0lPX0FERFJFU1MoTVgzNV9JT01VWENfQkFTRV9BRERSKSk7CisJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDM1X0lPX0FERFJFU1MoTVgzNV9XRE9HX0JBU0VfQUREUikpOworCWlteF9pZGxlID0gaW14M19pZGxlOworCWlteF9pb3JlbWFwID0gaW14M19pb3JlbWFwOworfQorCit2b2lkIF9faW5pdCBteDMxX2luaXRfaXJxKHZvaWQpCit7CisJbXhjX2luaXRfaXJxKE1YMzFfSU9fQUREUkVTUyhNWDMxX0FWSUNfQkFTRV9BRERSKSk7Cit9CisKK3ZvaWQgX19pbml0IG14MzVfaW5pdF9pcnEodm9pZCkKK3sKKwlteGNfaW5pdF9pcnEoTVgzNV9JT19BRERSRVNTKE1YMzVfQVZJQ19CQVNFX0FERFIpKTsKK30KKworc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBpbXgzMV90bzFfc2RtYV9zY3JpcHQgX19pbml0ZGF0YSA9IHsKKwkucGVyXzJfcGVyX2FkZHIgPSAxNjc3LAorfTsKKworc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBpbXgzMV90bzJfc2RtYV9zY3JpcHQgX19pbml0ZGF0YSA9IHsKKwkuYXBfMl9hcF9hZGRyID0gNDIzLAorCS5hcF8yX2JwX2FkZHIgPSA4MjksCisJLmJwXzJfYXBfYWRkciA9IDEwMjksCit9OworCitzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXgzMV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmZ3X25hbWUgPSAic2RtYS1pbXgzMS10bzIuYmluIiwKKwkuc2NyaXB0X2FkZHJzID0gJmlteDMxX3RvMl9zZG1hX3NjcmlwdCwKK307CisKK3ZvaWQgX19pbml0IGlteDMxX3NvY19pbml0KHZvaWQpCit7CisJaW50IHRvX3ZlcnNpb24gPSBteDMxX3JldmlzaW9uKCkgPj4gNDsKKworCWlteDNfaW5pdF9sMngwKCk7CisKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YMzFfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8xLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YMzFfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8yLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMzFfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8zLCAwKTsKKworCWlmICh0b192ZXJzaW9uID09IDEpIHsKKwkJc3RybmNweShpbXgzMV9zZG1hX3BkYXRhLmZ3X25hbWUsICJzZG1hLWlteDMxLXRvMS5iaW4iLAorCQkJc3RybGVuKGlteDMxX3NkbWFfcGRhdGEuZndfbmFtZSkpOworCQlpbXgzMV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzFfc2RtYV9zY3JpcHQ7CisJfQorCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzEtc2RtYSIsIE1YMzFfU0RNQV9CQVNFX0FERFIsIE1YMzFfSU5UX1NETUEsICZpbXgzMV9zZG1hX3BkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyBpbXgzNV90bzFfc2RtYV9zY3JpcHQgX19pbml0ZGF0YSA9IHsKKwkuYXBfMl9hcF9hZGRyID0gNjQyLAorCS51YXJ0XzJfbWN1X2FkZHIgPSA4MTcsCisJLm1jdV8yX2FwcF9hZGRyID0gNzQ3LAorCS51YXJ0c2hfMl9tY3VfYWRkciA9IDExODMsCisJLnBlcl8yX3NocF9hZGRyID0gMTAzMywKKwkubWN1XzJfc2hwX2FkZHIgPSA5NjEsCisJLmF0YV8yX21jdV9hZGRyID0gMTMzMywKKwkubWN1XzJfYXRhX2FkZHIgPSAxMjUyLAorCS5hcHBfMl9tY3VfYWRkciA9IDY4MywKKwkuc2hwXzJfcGVyX2FkZHIgPSAxMTExLAorCS5zaHBfMl9tY3VfYWRkciA9IDg5MiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzVfdG8yX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7CisJLmFwXzJfYXBfYWRkciA9IDcyOSwKKwkudWFydF8yX21jdV9hZGRyID0gOTA0LAorCS5wZXJfMl9hcHBfYWRkciA9IDE1OTcsCisJLm1jdV8yX2FwcF9hZGRyID0gODM0LAorCS51YXJ0c2hfMl9tY3VfYWRkciA9IDEyNzAsCisJLnBlcl8yX3NocF9hZGRyID0gMTEyMCwKKwkubWN1XzJfc2hwX2FkZHIgPSAxMDQ4LAorCS5hdGFfMl9tY3VfYWRkciA9IDE0MjksCisJLm1jdV8yX2F0YV9hZGRyID0gMTMzOSwKKwkuYXBwXzJfcGVyX2FkZHIgPSAxNTMxLAorCS5hcHBfMl9tY3VfYWRkciA9IDc3MCwKKwkuc2hwXzJfcGVyX2FkZHIgPSAxMTk4LAorCS5zaHBfMl9tY3VfYWRkciA9IDk3OSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDM1X3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuZndfbmFtZSA9ICJzZG1hLWlteDM1LXRvMi5iaW4iLAorCS5zY3JpcHRfYWRkcnMgPSAmaW14MzVfdG8yX3NkbWFfc2NyaXB0LAorfTsKKwordm9pZCBfX2luaXQgaW14MzVfc29jX2luaXQodm9pZCkKK3sKKwlpbnQgdG9fdmVyc2lvbiA9IG14MzVfcmV2aXNpb24oKSA+PiA0OworCisJaW14M19pbml0X2wyeDAoKTsKKworCS8qIGkubXgzNSBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YMzVfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8xLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YMzVfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8yLCAwKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMzVfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8zLCAwKTsKKworCWlmICh0b192ZXJzaW9uID09IDEpIHsKKwkJc3RybmNweShpbXgzNV9zZG1hX3BkYXRhLmZ3X25hbWUsICJzZG1hLWlteDM1LXRvMS5iaW4iLAorCQkJc3RybGVuKGlteDM1X3NkbWFfcGRhdGEuZndfbmFtZSkpOworCQlpbXgzNV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzNV90bzFfc2RtYV9zY3JpcHQ7CisJfQorCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YMzVfU0RNQV9CQVNFX0FERFIsIE1YMzVfSU5UX1NETUEsICZpbXgzNV9zZG1hX3BkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2M1NWU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIEFybSBMaW1pdGVkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIFNoYW5lIE5heSAoc2hhbmVAbWluaXJsLmNvbSkKLSAqICBDb3B5cmlnaHQgMjAwNS0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAgICAtIGFkZCBNWDMxIHNwZWNpZmljIGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC12My5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MzFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JaW14X21hcF9lbnRyeShNWDMxLCBYX01FTUMsIE1UX0RFVklDRSksCi0JaW14X21hcF9lbnRyeShNWDMxLCBBVklDLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzEsIEFJUFMxLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzEsIEFJUFMyLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzEsIFNQQkEwLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLX07Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQotICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncwotICogZm9yIHRoZSBJTyBtb2R1bGVzLgotICovCi12b2lkIF9faW5pdCBteDMxX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChteDMxX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgzMV9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IGlteDMxX2luaXRfZWFybHkodm9pZCkKLXsKLQlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVgzMSk7Ci0JbXhjX2FyY2hfcmVzZXRfaW5pdChNWDMxX0lPX0FERFJFU1MoTVgzMV9XRE9HX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBteDMxX2luaXRfaXJxKHZvaWQpCi17Ci0JbXhjX2luaXRfaXJxKE1YMzFfSU9fQUREUkVTUyhNWDMxX0FWSUNfQkFTRV9BRERSKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzFfdG8xX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7Ci0JLnBlcl8yX3Blcl9hZGRyID0gMTY3NywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzFfdG8yX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7Ci0JLmFwXzJfYXBfYWRkciA9IDQyMywKLQkuYXBfMl9icF9hZGRyID0gODI5LAotCS5icF8yX2FwX2FkZHIgPSAxMDI5LAotfTsKLQotc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzFfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5md19uYW1lID0gInNkbWEtaW14MzEtdG8yLmJpbiIsCi0JLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzJfc2RtYV9zY3JpcHQsCi19OwotCi12b2lkIF9faW5pdCBpbXgzMV9zb2NfaW5pdCh2b2lkKQotewotCWludCB0b192ZXJzaW9uID0gbXgzMV9yZXZpc2lvbigpID4+IDQ7Ci0KLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YMzFfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8xLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YMzFfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8yLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMzFfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzFfSU5UX0dQSU8zLCAwKTsKLQotCWlmICh0b192ZXJzaW9uID09IDEpIHsKLQkJc3RybmNweShpbXgzMV9zZG1hX3BkYXRhLmZ3X25hbWUsICJzZG1hLWlteDMxLXRvMS5iaW4iLAotCQkJc3RybGVuKGlteDMxX3NkbWFfcGRhdGEuZndfbmFtZSkpOwotCQlpbXgzMV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzFfc2RtYV9zY3JpcHQ7Ci0JfQotCi0JaW14X2FkZF9pbXhfc2RtYSgiaW14MzEtc2RtYSIsIE1YMzFfU0RNQV9CQVNFX0FERFIsIE1YMzFfSU5UX1NETUEsICZpbXgzMV9zZG1hX3BkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDliYWM3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBBcm0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICogIENvcHlyaWdodCAoQykgMjAwMiBTaGFuZSBOYXkgKHNoYW5lQG1pbmlybC5jb20pCi0gKiAgQ29weXJpZ2h0IDIwMDUtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogICAgLSBhZGQgTVgzMSBzcGVjaWZpYyBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC12My5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MzVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JaW14X21hcF9lbnRyeShNWDM1LCBYX01FTUMsIE1UX0RFVklDRSksCi0JaW14X21hcF9lbnRyeShNWDM1LCBBVklDLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzUsIEFJUFMxLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzUsIEFJUFMyLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLQlpbXhfbWFwX2VudHJ5KE1YMzUsIFNQQkEwLCBNVF9ERVZJQ0VfTk9OU0hBUkVEKSwKLX07Ci0KLXZvaWQgX19pbml0IG14MzVfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KG14MzVfaW9fZGVzYywgQVJSQVlfU0laRShteDM1X2lvX2Rlc2MpKTsKLX0KLQotdm9pZCBfX2luaXQgaW14MzVfaW5pdF9lYXJseSh2b2lkKQotewotCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDM1KTsKLQlteGNfaW9tdXhfdjNfaW5pdChNWDM1X0lPX0FERFJFU1MoTVgzNV9JT01VWENfQkFTRV9BRERSKSk7Ci0JbXhjX2FyY2hfcmVzZXRfaW5pdChNWDM1X0lPX0FERFJFU1MoTVgzNV9XRE9HX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBteDM1X2luaXRfaXJxKHZvaWQpCi17Ci0JbXhjX2luaXRfaXJxKE1YMzVfSU9fQUREUkVTUyhNWDM1X0FWSUNfQkFTRV9BRERSKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14MzVfdG8xX3NkbWFfc2NyaXB0IF9faW5pdGRhdGEgPSB7Ci0JLmFwXzJfYXBfYWRkciA9IDY0MiwKLQkudWFydF8yX21jdV9hZGRyID0gODE3LAotCS5tY3VfMl9hcHBfYWRkciA9IDc0NywKLQkudWFydHNoXzJfbWN1X2FkZHIgPSAxMTgzLAotCS5wZXJfMl9zaHBfYWRkciA9IDEwMzMsCi0JLm1jdV8yX3NocF9hZGRyID0gOTYxLAotCS5hdGFfMl9tY3VfYWRkciA9IDEzMzMsCi0JLm1jdV8yX2F0YV9hZGRyID0gMTI1MiwKLQkuYXBwXzJfbWN1X2FkZHIgPSA2ODMsCi0JLnNocF8yX3Blcl9hZGRyID0gMTExMSwKLQkuc2hwXzJfbWN1X2FkZHIgPSA4OTIsCi19OwotCi1zdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIGlteDM1X3RvMl9zZG1hX3NjcmlwdCBfX2luaXRkYXRhID0gewotCS5hcF8yX2FwX2FkZHIgPSA3MjksCi0JLnVhcnRfMl9tY3VfYWRkciA9IDkwNCwKLQkucGVyXzJfYXBwX2FkZHIgPSAxNTk3LAotCS5tY3VfMl9hcHBfYWRkciA9IDgzNCwKLQkudWFydHNoXzJfbWN1X2FkZHIgPSAxMjcwLAotCS5wZXJfMl9zaHBfYWRkciA9IDExMjAsCi0JLm1jdV8yX3NocF9hZGRyID0gMTA0OCwKLQkuYXRhXzJfbWN1X2FkZHIgPSAxNDI5LAotCS5tY3VfMl9hdGFfYWRkciA9IDEzMzksCi0JLmFwcF8yX3Blcl9hZGRyID0gMTUzMSwKLQkuYXBwXzJfbWN1X2FkZHIgPSA3NzAsCi0JLnNocF8yX3Blcl9hZGRyID0gMTE5OCwKLQkuc2hwXzJfbWN1X2FkZHIgPSA5NzksCi19OwotCi1zdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXgzNV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmZ3X25hbWUgPSAic2RtYS1pbXgzNS10bzIuYmluIiwKLQkuc2NyaXB0X2FkZHJzID0gJmlteDM1X3RvMl9zZG1hX3NjcmlwdCwKLX07Ci0KLXZvaWQgX19pbml0IGlteDM1X3NvY19pbml0KHZvaWQpCi17Ci0JaW50IHRvX3ZlcnNpb24gPSBteDM1X3JldmlzaW9uKCkgPj4gNDsKLQotCS8qIGkubXgzNSBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YMzVfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8xLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YMzVfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8yLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMzVfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMzVfSU5UX0dQSU8zLCAwKTsKLQotCWlmICh0b192ZXJzaW9uID09IDEpIHsKLQkJc3RybmNweShpbXgzNV9zZG1hX3BkYXRhLmZ3X25hbWUsICJzZG1hLWlteDM1LXRvMS5iaW4iLAotCQkJc3RybGVuKGlteDM1X3NkbWFfcGRhdGEuZndfbmFtZSkpOwotCQlpbXgzNV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzNV90bzFfc2RtYV9zY3JpcHQ7Ci0JfQotCi0JaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YMzVfU0RNQV9CQVNFX0FERFIsIE1YMzVfSU5UX1NETUEsICZpbXgzNV9zZG1hX3BkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tZGMuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYxZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW1kYy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKworI2RlZmluZSBNTURDX01BUFNSCQkweDQwNAorI2RlZmluZSBCUF9NTURDX01BUFNSX1BTRAkwCisjZGVmaW5lIEJQX01NRENfTUFQU1JfUFNTCTQKKworc3RhdGljIGludCBfX2RldmluaXQgaW14X21tZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJdm9pZCBfX2lvbWVtICptbWRjX2Jhc2UsICpyZWc7CisJdTMyIHZhbDsKKwlpbnQgdGltZW91dCA9IDB4NDAwOworCisJbW1kY19iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCVdBUk5fT04oIW1tZGNfYmFzZSk7CisKKwlyZWcgPSBtbWRjX2Jhc2UgKyBNTURDX01BUFNSOworCisJLyogRW5hYmxlIGF1dG9tYXRpYyBwb3dlciBzYXZpbmcgKi8KKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH4oMSA8PCBCUF9NTURDX01BUFNSX1BTRCk7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCByZWcpOworCisJLyogRW5zdXJlIGl0J3Mgc3VjY2Vzc2Z1bGx5IGVuYWJsZWQgKi8KKwl3aGlsZSAoIShyZWFkbF9yZWxheGVkKHJlZykgJiAxIDw8IEJQX01NRENfTUFQU1JfUFNTKSAmJiAtLXRpbWVvdXQpCisJCWNwdV9yZWxheCgpOworCisJaWYgKHVubGlrZWx5KCF0aW1lb3V0KSkgeworCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGVuYWJsZSBhdXRvbWF0aWMgcG93ZXIgc2F2aW5nXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpbXhfbW1kY19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1tbWRjIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlteF9tbWRjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaW14LW1tZGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X21tZGNfZHRfaWRzLAorCX0sCisJLnByb2JlCQk9IGlteF9tbWRjX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW14X21tZGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlteF9tbWRjX2RyaXZlcik7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChpbXhfbW1kY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtaW14L3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjk4YzZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvcGxhdHNtcC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHZvaWQgX19pb21lbSAqc2N1X2Jhc2U7CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc2N1X2lvX2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkvKiAudmlydHVhbCBhbmQgLnBmbiBhcmUgcnVuLXRpbWUgYXNzaWduZWQgKi8KKwkubGVuZ3RoCQk9IFNaXzRLLAorCS50eXBlCQk9IE1UX0RFVklDRSwKK307CisKK3ZvaWQgX19pbml0IGlteF9zY3VfbWFwX2lvKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCisJLyogR2V0IFNDVSBiYXNlICovCisJYXNtKCJtcmMgcDE1LCA0LCAlMCwgYzE1LCBjMCwgMCIgOiAiPXIiIChiYXNlKSk7CisKKwlzY3VfaW9fZGVzYy52aXJ0dWFsID0gSU1YX0lPX1AyVihiYXNlKTsKKwlzY3VfaW9fZGVzYy5wZm4gPSBfX3BoeXNfdG9fcGZuKGJhc2UpOworCWlvdGFibGVfaW5pdCgmc2N1X2lvX2Rlc2MsIDEpOworCisJc2N1X2Jhc2UgPSBJTVhfSU9fQUREUkVTUyhiYXNlKTsKK30KKwordm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIGlmIGFueSBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZm9yIHRoZSBwcmltYXJ5CisJICogY29yZSAoZS5nLiB0aW1lciBpcnEpLCB0aGVuIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGVuYWJsZWQKKwkgKiBmb3IgdXM6IGRvIHNvCisJICovCisJZ2ljX3NlY29uZGFyeV9pbml0KDApOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwlpbXhfc2V0X2NwdV9qdW1wKGNwdSwgdjdfc2Vjb25kYXJ5X3N0YXJ0dXApOworCWlteF9lbmFibGVfY3B1KGNwdSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBDUFUgcG9zc2libGUgbWFwIGVhcmx5IC0gdGhpcyBkZXNjcmliZXMgdGhlIENQVXMKKyAqIHdoaWNoIG1heSBiZSBwcmVzZW50IG9yIGJlY29tZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgX19pbml0IHNtcF9pbml0X2NwdXModm9pZCkKK3sKKwlpbnQgaSwgbmNvcmVzOworCisJbmNvcmVzID0gc2N1X2dldF9jb3JlX2NvdW50KHNjdV9iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBuY29yZXM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKworCXNldF9zbXBfY3Jvc3NfY2FsbChnaWNfcmFpc2Vfc29mdGlycSk7Cit9CisKK3ZvaWQgaW14X3NtcF9wcmVwYXJlKHZvaWQpCit7CisJc2N1X2VuYWJsZShzY3VfYmFzZSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWlteF9zbXBfcHJlcGFyZSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMKaW5kZXggYWNmMTc2OS4uZTQ1NWQyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXgyNy5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxtYWNoL214MjcuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKIHN0YXRpYyBpbnQgbXgyN19zdXNwZW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDZxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMGYxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2cS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMTEgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGUgY29kZSBjb250YWluZWQgaGVyZWluIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgorI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c19sMngwX3NhdmVkX3JlZ3M7CisKK3N0YXRpYyBpbnQgaW14NnFfc3VzcGVuZF9maW5pc2godW5zaWduZWQgbG9uZyB2YWwpCit7CisJY3B1X2RvX2lkbGUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbXg2cV9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9NRU06CisJCWlteDZxX3NldF9scG0oU1RPUF9QT1dFUl9PRkYpOworCQlpbXhfZ3BjX3ByZV9zdXNwZW5kKCk7CisJCWlteF9zZXRfY3B1X2p1bXAoMCwgdjdfY3B1X3Jlc3VtZSk7CisJCS8qIFp6eiAuLi4gKi8KKwkJY3B1X3N1c3BlbmQoMCwgaW14NnFfc3VzcGVuZF9maW5pc2gpOworCQlpbXhfc21wX3ByZXBhcmUoKTsKKwkJaW14X2dwY19wb3N0X3Jlc3VtZSgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBpbXg2cV9wbV9vcHMgPSB7CisJLmVudGVyID0gaW14NnFfcG1fZW50ZXIsCisJLnZhbGlkID0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKK307CisKK3ZvaWQgX19pbml0IGlteDZxX3BtX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFRoZSBsMngwIGNvcmUgY29kZSBwcm92aWRlcyBhbiBpbmZyYXN0dWN0dXJlIHRvIHNhdmUgYW5kIHJlc3RvcmUKKwkgKiBsMngwIHJlZ2lzdGVycyBhY3Jvc3Mgc3VzcGVuZC9yZXN1bWUgY3ljbGUuICBCdXQgYmVjYXVzZSBpbXg2cQorCSAqIHJldGFpbnMgTDIgY29udGVudCBkdXJpbmcgc3VzcGVuZCBhbmQgbmVlZHMgdG8gcmVzdW1lIEwyIGJlZm9yZQorCSAqIE1NVSBpcyBlbmFibGVkLCBpdCBjYW4gb25seSB1dGlsaXplIHJlZ2lzdGVyIHNhdmluZyBzdXBwb3J0IGFuZAorCSAqIGhhdmUgdG8gdGFrZSBjYXJlIG9mIHJlc3RvcmluZyBvbiBpdHMgb3duLiAgU28gd2Ugc2F2ZSBwaHlzaWNhbAorCSAqIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgbDJ4MCBjb3JlIHRvIHNhdmUgcmVnaXN0ZXJzLAorCSAqIGFuZCBsYXRlciByZXN0b3JlIHRoZSBuZWNlc3Nhcnkgb25lcyBpbiBpbXg2cSByZXN1bWUgZW50cnkuCisJICovCisJcGh5c19sMngwX3NhdmVkX3JlZ3MgPSBfX3BhKCZsMngwX3NhdmVkX3JlZ3MpOworCisJc3VzcGVuZF9zZXRfb3BzKCZpbXg2cV9wbV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvc3JjLmMgYi9hcmNoL2FybS9tYWNoLWlteC9zcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNhY2JkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvc3JjLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGFzbS91bmlmaWVkLmg+CisKKyNkZWZpbmUgU1JDX1NDUgkJCQkweDAwMAorI2RlZmluZSBTUkNfR1BSMQkJCTB4MDIwCisjZGVmaW5lIEJQX1NSQ19TQ1JfQ09SRTFfUlNUCQkxNAorI2RlZmluZSBCUF9TUkNfU0NSX0NPUkUxX0VOQUJMRQkJMjIKKworc3RhdGljIHZvaWQgX19pb21lbSAqc3JjX2Jhc2U7CisKK3ZvaWQgaW14X2VuYWJsZV9jcHUoaW50IGNwdSwgYm9vbCBlbmFibGUpCit7CisJdTMyIG1hc2ssIHZhbDsKKworCW1hc2sgPSAxIDw8IChCUF9TUkNfU0NSX0NPUkUxX0VOQUJMRSArIGNwdSAtIDEpOworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoc3JjX2Jhc2UgKyBTUkNfU0NSKTsKKwl2YWwgPSBlbmFibGUgPyB2YWwgfCBtYXNrIDogdmFsICYgfm1hc2s7CisJd3JpdGVsX3JlbGF4ZWQodmFsLCBzcmNfYmFzZSArIFNSQ19TQ1IpOworfQorCit2b2lkIGlteF9zZXRfY3B1X2p1bXAoaW50IGNwdSwgdm9pZCAqanVtcF9hZGRyKQoreworCXdyaXRlbF9yZWxheGVkKEJTWU0odmlydF90b19waHlzKGp1bXBfYWRkcikpLAorCQkgICAgICAgc3JjX2Jhc2UgKyBTUkNfR1BSMSArIGNwdSAqIDgpOworfQorCit2b2lkIF9faW5pdCBpbXhfc3JjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDZxLXNyYyIpOworCXNyY19iYXNlID0gb2ZfaW9tYXAobnAsIDApOworCVdBUk5fT04oIXNyY19iYXNlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBhMWY1OThmLi40MTFiMTE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDE2MDAwMDAwCUAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzCiAJCW1vdglccnYsICMweGYwMDAwMDAwCUAgdmlydHVhbCBiYXNlCiAJCWFkZAlccnYsIFxydiwgIzB4MTYwMDAwMDAgPj4gNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggZjIxMTk5MC4uYTE3NjlmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC00NjUsNyArNDY1LDcgQEAKIAogTUFDSElORV9TVEFSVChJTlRFR1JBVE9SLCAiQVJNLUludGVncmF0b3IiKQogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gaW50ZWdyYXRvcl9yZXNlcnZlLAogCS5tYXBfaW8JCT0gYXBfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gaW50ZWdyYXRvcl9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKaW5kZXggNGViMDNhYi4uNWRlNDljMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCkBAIC00OTIsNyArNDkyLDcgQEAKIAogTUFDSElORV9TVEFSVChDSU5URUdSQVRPUiwgIkFSTS1JbnRlZ3JhdG9yQ1AiKQogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gaW50ZWdyYXRvcl9yZXNlcnZlLAogCS5tYXBfaW8JCT0gaW50Y3BfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gaW50Y3BfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBlNjY0NDY2Li5kODY5YTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbW92CVxycCwgIzB4MDAwMDIzMDAKIAlvcnIJXHJwLCBccnAsICMweDAwMDAwMDQwCiAJb3JyCVxydiwgXHJwLCAjMHhmZTAwMDAwMAlAIHZpcnR1YWwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYwppbmRleCAyM2RmYWZmLi40Y2YyY2M0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCkBAIC05MSw3ICs5MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVE4MTM0ME1DLCAiSW50ZWwgSVE4MTM0ME1DIikKIAkvKiBNYWludGFpbmVyOiBEYW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgICAgPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IGlvcDEzeHhfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IGlvcDEzeHhfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJmlxODEzNDBtY190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwc2MuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwc2MuYwppbmRleCBkZjM0OTJhLi5jZDllMjc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MHNjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBzYy5jCkBAIC05Myw3ICs5Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVE4MTM0MFNDLCAiSW50ZWwgSVE4MTM0MFNDIikKIAkvKiBNYWludGFpbmVyOiBEYW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgICAgPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IGlvcDEzeHhfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IGlvcDEzeHhfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJmlxODEzNDBzY190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYwppbmRleCAyNTFjNDA4Li5kYjAxMmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCmluZGV4IDZjYmZmYmYuLjQzMjUwNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFTTcyMTAsICJMYW5uZXIgRU03MjEwIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZW03MjEwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpb3AzMnhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlbTcyMTBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYwppbmRleCBjZWVmNWQ0Li4wZWRjODgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiBNQUNISU5FX1NUQVJUKEdMQU5UQU5LLCAiR0xBTiBUYW5rIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZ2xhbnRhbmtfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmdsYW50YW5rX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBmZjllNzZjLi4zNjNiZGY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweGZlMDAwMDAwCUAgcGh5c2ljYWwgYXMgd2VsbCBhcyB2aXJ0dWFsCiAJCW9ycglccnAsIFxycCwgIzB4MDA4MDAwMDAJQCBsb2NhdGlvbiBvZiB0aGUgVUFSVAogCQltb3YJXHJ2LCBccnAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5Y2MyMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1pb3AzMngvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKi8KLQotI2lmbmRlZiBfX01FTU9SWV9ICi0jZGVmaW5lIF9fTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHhhMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMKaW5kZXggM2E2MjUxNC4uOWU3YWFjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVEzMTI0NCwgIkludGVsIElRMzEyNDQiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlxMzEyNDRfbWFwX2lvLAogCS5pbml0X2lycQk9IGlvcDMyeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmlxMzEyNDRfdGltZXIsCkBAIC0zMjcsNyArMzI3LDcgQEAKICAqLwogTUFDSElORV9TVEFSVChFUDgwMjE5LCAiSW50ZWwgRVA4MDIxOSIpCiAJLyogTWFpbnRhaW5lcjogSW50ZWwgQ29ycC4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXEzMTI0NF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzJ4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXEzMTI0NF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYwppbmRleCAzNWI3ZTY5Li41M2VhODZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAogTUFDSElORV9TVEFSVChJUTgwMzIxLCAiSW50ZWwgSVE4MDMyMSIpCiAJLyogTWFpbnRhaW5lcjogSW50ZWwgQ29ycC4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXE4MDMyMV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzJ4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXE4MDMyMV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDFhMzc0ZWEuLmQ3MjY5MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtMzI3LDcgKzMyNyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTjIxMDAsICJUaGVjdXMgTjIxMDAiKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBuMjEwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzJ4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbjIxMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDQwYzUwMGQuLjM2MWJlMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4MDBmZjAwMDAKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDAwZjcwMAogCQlvcnIJXHJ2LCAjMHhmZTAwMDAwMAlAIHZpcnR1YWwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZGFmNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1pb3AzM3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKi8KLQotI2lmbmRlZiBfX01FTU9SWV9ICi0jZGVmaW5lIF9fTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKaW5kZXggNjM3YzAyNy4uOWUxNGNjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVE4MDMzMSwgIkludGVsIElRODAzMzEiKQogCS8qIE1haW50YWluZXI6IEludGVsIENvcnAuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlvcDN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaW9wMzN4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXE4MDMzMV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYwppbmRleCA5MGEwNDM2Li4wOWM4OTlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIAogTUFDSElORV9TVEFSVChJUTgwMzMyLCAiSW50ZWwgSVE4MDMzMiIpCiAJLyogTWFpbnRhaW5lcjogSW50ZWwgQ29ycC4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaW9wM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpb3AzM3hfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpcTgwMzMyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKaW5kZXggNDA2ODE2Ni4uMjRmMGZlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgCiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTM5LDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8taXhwMjAwMC5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl4cDIwMDBfc2xvd3BvcnRfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpeHAyMDAwX3Nsb3dwb3J0X2lycV9mbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCmluZGV4IDYyYzYwYWQuLmFmOTk5NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRU5QMjYxMSwgIlJhZGlzeXMgRU5QLTI2MTEgUENJIG5ldHdvcmsgcHJvY2Vzc29yIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZW5wMjYxMV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwMjAwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVucDI2MTFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMGVmNTMzYi4uYmRkM2NjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMDMwMDAwCiAjaWZkZWYJX19BUk1FQl9fCiAJCW9ycglccnAsIFxycCwgIzB4MDAwMDAwMDMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9pbmNsdWRlL21hY2gvZ3Bpby1peHAyMDAwLmggYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8taXhwMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODM2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8taXhwMjAwMC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBJWFAyMDAwIEdQSU8gaW4vb3V0LCBlZGdlL2xldmVsIGRldGVjdGlvbiBmb3IgSVJRczoKKyAqIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBGYWxsaW5nLWVkZ2UsIFJpc2luZy1FZGdlLCBMZXZlbC1sb3csIExldmVsLUhpZ2gKKyAqIG9yIGJvdGggRmFsbGluZy1lZGdlIGFuZCBSaXNpbmctZWRnZS4KKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGNvcnJlc3BvbmRpbmcgSVJRIGlzIHJlZ2lzdGVyZC4KKyAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZGlyZWN0bHkgc2V0dGluZyB0aGUgR1BJTyByZWdpc3RlcnMuCisgKiBHUElPcyBtYXkgYWxzbyBiZSB1c2VkIGFzIEdQSU9zIChlLmcuIGZvciBlbXVsYXRpbmcgaTJjL3NtYikKKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIEdQSU9fSU4JCQkJMAorI2RlZmluZSBHUElPX09VVAkJCTEKKworI2RlZmluZSBJWFAyMDAwX0dQSU9fTE9XCQkwCisjZGVmaW5lIElYUDIwMDBfR1BJT19ISUdICQkxCisKK2V4dGVybiB2b2lkIGdwaW9fbGluZV9jb25maWcoaW50IGxpbmUsIGludCBkaXJlY3Rpb24pOworCitzdGF0aWMgaW5saW5lIGludCBncGlvX2xpbmVfZ2V0KGludCBsaW5lKQoreworCXJldHVybiAoKCgqSVhQMjAwMF9HUElPX1BMUikgPj4gbGluZSkgJiAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fbGluZV9zZXQoaW50IGxpbmUsIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gSVhQMjAwMF9HUElPX0hJR0gpIHsKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BPU1IsIDEgPDwgbGluZSk7CisJfSBlbHNlIGlmICh2YWx1ZSA9PSBJWFAyMDAwX0dQSU9fTE9XKSB7CisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT0NSLCAxIDw8IGxpbmUpOworCX0KK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIEFTTV9BUkNIX0lYUDIwMDBfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4OGQyYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWl4cDIwMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0vKgotICogSVhQMjAwMCBHUElPIGluL291dCwgZWRnZS9sZXZlbCBkZXRlY3Rpb24gZm9yIElSUXM6Ci0gKiBJUlFzIGFyZSBnZW5lcmF0ZWQgb24gRmFsbGluZy1lZGdlLCBSaXNpbmctRWRnZSwgTGV2ZWwtbG93LCBMZXZlbC1IaWdoCi0gKiBvciBib3RoIEZhbGxpbmctZWRnZSBhbmQgUmlzaW5nLWVkZ2UuICAKLSAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGNvcnJlc3BvbmRpbmcgSVJRIGlzIHJlZ2lzdGVyZC4KLSAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZGlyZWN0bHkgc2V0dGluZyB0aGUgR1BJTyByZWdpc3RlcnMuCi0gKiBHUElPcyBtYXkgYWxzbyBiZSB1c2VkIGFzIEdQSU9zIChlLmcuIGZvciBlbXVsYXRpbmcgaTJjL3NtYikKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAotI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jZGVmaW5lIEdQSU9fSU4JCQkJMAotI2RlZmluZSBHUElPX09VVAkJCTEKLQotI2RlZmluZSBJWFAyMDAwX0dQSU9fTE9XCQkwCi0jZGVmaW5lIElYUDIwMDBfR1BJT19ISUdICQkxCi0KLWV4dGVybiB2b2lkIGdwaW9fbGluZV9jb25maWcoaW50IGxpbmUsIGludCBkaXJlY3Rpb24pOwotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2xpbmVfZ2V0KGludCBsaW5lKQotewotCXJldHVybiAoKCgqSVhQMjAwMF9HUElPX1BMUikgPj4gbGluZSkgJiAxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fbGluZV9zZXQoaW50IGxpbmUsIGludCB2YWx1ZSkKLXsKLQlpZiAodmFsdWUgPT0gSVhQMjAwMF9HUElPX0hJR0gpIHsKLQkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BPU1IsIDEgPDwgbGluZSk7Ci0JfSBlbHNlIGlmICh2YWx1ZSA9PSBJWFAyMDAwX0dQSU9fTE9XKSB7Ci0JCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT0NSLCAxIDw8IGxpbmUpOwotCX0KLX0KLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotI2VuZGlmIC8qIEFTTV9BUkNIX0lYUDIwMDBfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwppbmRleCA1YmFkMWE4Li5mN2RmZDk3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDI0MDAsICJJbnRlbCBJWERQMjQwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpeGRwMngwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhkcDI0MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMjQwMF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKaW5kZXggM2QzY2VmOC4uZDMzYmNhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCiBNQUNISU5FX1NUQVJUKElYRFAyODAwLCAiSW50ZWwgSVhEUDI4MDAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhkcDJ4MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4ZHAyODAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDI4MDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCmluZGV4IDIzNTYzOGYuLjYzNGI2YzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTQwLDggKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotCisjaW5jbHVkZSA8bWFjaC9ncGlvLWl4cDIwMDAuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElYRFAyeDAwIElSUSBJbml0aWFsaXphdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwppbmRleCBiZTJhMjU0Li42MWEyODY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYwpAQCAtNDE3LDcgKzQxNyw3IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDI0MDEKIE1BQ0hJTkVfU1RBUlQoSVhEUDI0MDEsICJJbnRlbCBJWERQMjQwMSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCiAJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpeGRwMngwMV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhkcDJ4MDFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMngwMV90aW1lciwKQEAgLTQyOCw3ICs0MjgsNyBAQAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyODAxCiBNQUNISU5FX1NUQVJUKElYRFAyODAxLCAiSW50ZWwgSVhEUDI4MDEgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhkcDJ4MDFfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4ZHAyeDAxX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDJ4MDFfdGltZXIsCkBAIC00NDEsNyArNDQxLDcgQEAKICAqLwogTUFDSElORV9TVEFSVChJWERQMjhYNSwgIkludGVsIElYRFAyODA1LzI4NTUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQogCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhkcDJ4MDFfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4ZHAyeDAxX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDJ4MDFfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9lc3ByZXNzby5jCmluZGV4IGUyNWU1ZmUuLjMwZGQzMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9lc3ByZXNzby5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9lc3ByZXNzby5jCkBAIC04OCw2ICs4OCw2IEBACiAJLm1hcF9pbwkJPSBpeHAyM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHAyM3h4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwMjN4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBlc3ByZXNzb19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBmN2M2ZWVmLi41ZmY1MjRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMiw3ICsxMiw3IEBACiAgKi8KICNpbmNsdWRlIDxtYWNoL2l4cDIzeHguaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID1JWFAyM1hYX1BFUklQSEVSQUxfUEhZUyAJQCBwaHlzaWNhbAogCQlsZHIJXHJ2LCA9SVhQMjNYWF9QRVJJUEhFUkFMX1ZJUlQJQCB2aXJ0dWFsCiAjaWZkZWYgX19BUk1FQl9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCmluZGV4IGVjMDI4ZTMuLmIzYTU3ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCkBAIC0zMzEsNiArMzMxLDYgQEAKIAkubWFwX2lvCQk9IGl4ZHAyMzUxX21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeGRwMjM1MV9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDIzeHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaXhkcDIzNTFfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYwppbmRleCA4NDQ1NTFkLi44ZjRkY2JiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKQEAgLTE3NSw2ICsxNzUsNiBAQAogCS5tYXBfaW8JCT0gaXhwMjN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwMjN4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDIzeHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcm9hZHJ1bm5lcl9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCmluZGV4IDZmOTkxYzUuLmZkNWU3YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZwpAQCAtMTc5LDYgKzE3OSwyNSBAQAogCQkiSGlnaCBTcGVlZCIgVUFSVCBpcyBuL2MgKGFzIGZhciBhcyBJIGNhbiB0ZWxsKQogCQkyMCBQaW4gQVJNL1hzY2FsZSBKVEFHIGludGVyZmFjZSBvbiBKMgogCitjb25maWcgTUFDSF9ERVZJWFAKKwlib29sICJPbWljcm9uIERFVklYUCIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgREVWSVhQCisJICBib2FyZCBmcm9tIE9NSUNST04gZWxlY3Ryb25pY3MgR21iSC4KKworY29uZmlnIE1BQ0hfTUlDQ1BUCisJYm9vbCAiT21pY3JvbiBNSUNDUFQiCisJc2VsZWN0IFBDSQorCWhlbHAKKwkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZSBNSUNDUFQKKwkgIGJvYXJkIGZyb20gT01JQ1JPTiBlbGVjdHJvbmljcyBHbWJILgorCitjb25maWcgTUFDSF9NSUMyNTYKKwlib29sICJPbWljcm9uIE1JQzI1NiIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgTUlDMjU2CisJICBib2FyZCBmcm9tIE9NSUNST04gZWxlY3Ryb25pY3MgR21iSC4KKwogY29tbWVudCAiSVhQNHh4IE9wdGlvbnMiCiAKIGNvbmZpZyBJWFA0WFhfSU5ESVJFQ1RfUENJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L01ha2VmaWxlCmluZGV4IGQ4MDdmYzMuLmVkZWQ5NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotcGNpLSQoQ09ORklHX01BQ0hfSVhEUEc0MjUpCQkrPSBpeGRwZzQyNS1wY2kubwogb2JqLXBjaS0kKENPTkZJR19BUkNIX0FESV9DT1lPVEUpCSs9IGNveW90ZS1wY2kubwogb2JqLXBjaS0kKENPTkZJR19NQUNIX0dUV1g1NzE1KQkJKz0gZ3R3eDU3MTUtcGNpLm8KK29iai1wY2ktJChDT05GSUdfTUFDSF9NSUNDUFQpCQkrPSBtaWNjcHQtcGNpLm8KIG9iai1wY2ktJChDT05GSUdfTUFDSF9OU0xVMikJCSs9IG5zbHUyLXBjaS5vCiBvYmotcGNpLSQoQ09ORklHX01BQ0hfTkFTMTAwRCkJCSs9IG5hczEwMGQtcGNpLm8KIG9iai1wY2ktJChDT05GSUdfTUFDSF9EU01HNjAwKQkJKz0gZHNtZzYwMC1wY2kubwpAQCAtMjUsNiArMjYsOSBAQAogb2JqLSQoQ09ORklHX01BQ0hfSVhEUEc0MjUpCSs9IGNveW90ZS1zZXR1cC5vCiBvYmotJChDT05GSUdfQVJDSF9BRElfQ09ZT1RFKQkrPSBjb3lvdGUtc2V0dXAubwogb2JqLSQoQ09ORklHX01BQ0hfR1RXWDU3MTUpCSs9IGd0d3g1NzE1LXNldHVwLm8KK29iai0kKENPTkZJR19NQUNIX0RFVklYUCkJKz0gb21peHAtc2V0dXAubworb2JqLSQoQ09ORklHX01BQ0hfTUlDQ1BUKQkrPSBvbWl4cC1zZXR1cC5vCitvYmotJChDT05GSUdfTUFDSF9NSUMyNTYpCSs9IG9taXhwLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX05TTFUyKQkrPSBuc2x1Mi1zZXR1cC5vCiBvYmotJChDT05GSUdfTUFDSF9OQVMxMDBEKQkrPSBuYXMxMDBkLXNldHVwLm8KIG9iai0kKENPTkZJR19NQUNIX0RTTUc2MDApICAgICAgKz0gZHNtZzYwMC1zZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtc2V0dXAuYwppbmRleCBlZTE5YzFkLi4zNzYwOWEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXNldHVwLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBhdmlsYV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKQEAgLTE4NSw3ICsxODUsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBhdmlsYV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwppbmRleCBmNzJhM2E4Li44MzI1MDU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKaW5kZXggMDc3NzI1Ny4uYjg2YTAwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCmluZGV4IGUyNDU2NGIuLjgxZGZlYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1zZXR1cC5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gY295b3RlX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApAQCAtMTMwLDcgKzEzMCw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGNveW90ZV9pbml0LAogTUFDSElORV9FTkQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jCmluZGV4IDAzZTU0NTEuLjg4MzdmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIEF1dGhvcjogUm9kIFdoaXRieSA8cm9kQHdoaXRieS5pZC5hdT4KICAqIE1haW50YWluZXJzOiBodHRwOi8vd3d3Lm5zbHUyLWxpbnV4Lm9yZy8KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjZGVmaW5lIERTTUc2MDBfU0RBX1BJTgkJNQogI2RlZmluZSBEU01HNjAwX1NDTF9QSU4JCTQKQEAgLTI3OSw3ICsyNzgsNyBAQAogCiBNQUNISU5FX1NUQVJUKERTTUc2MDAsICJELUxpbmsgRFNNLUc2MDAgUmV2QSIpCiAJLyogTWFpbnRhaW5lcjogd3d3Lm5zbHUyLWxpbnV4Lm9yZyAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIgICAgICAgICAgPSAmZHNtZzYwMF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKaW5kZXggMjNhOGIzNi4uMjg4N2MzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXNldHVwLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqIE1haW50YWluZXJzOiBodHRwOi8vd3d3Lm5zbHUyLWxpbnV4Lm9yZy8KICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2RlZmluZSBGU0dfU0RBX1BJTgkJMTIKICNkZWZpbmUgRlNHX1NDTF9QSU4JCTEzCkBAIC0yNzMsNyArMjcyLDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZnNnX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXNldHVwLmMKaW5kZXggZDRmODUxYi4uZDY5ZDFiMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1zZXR1cC5jCkBAIC05OSw3ICs5OSw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGdhdGV3YXk3MDAxX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCmluZGV4IDc1NDhkOWEuLmJmNjY3OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKQEAgLTQ5OSw3ICs0OTksNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBnbWxyX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKaW5kZXggMzc5MGRmZi4uYWEwMjlmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZ3R3eDU3MTVfaW5pdCwKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGI5NzRhNDkuLjhjOWY4ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKLSAgICAgICAgICAgICAgICAubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYKKyAgICAgICAgICAgICAgICAubWFjcm8gIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogI2lmZGVmIF9fQVJNRUJfXwogICAgICAgICAgICAgICAgIG1vdiAgICAgXHJwLCAjMyAgICAgICAgIEAgVWFydCByZWdzIGFyZSBhdCBvZmYgc2V0IG9mIDMgaWYKIAkJCQkJQCBieXRlIHdyaXRlcyB1c2VkIC0gQmlnIEVuZGlhbi4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGE1Zjg3ZGUuLjgzZDZiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAorI2RlZmluZSBfX0FSTV9HUElPTElCX0NPTVBMRVgKKwogc3RhdGljIGlubGluZSBpbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQogewogCXJldHVybiAwOwpAQCAtNzAsNiArNzIsNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4JCQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLwogCiBleHRlcm4gaW50IGdwaW9fdG9faXJxKGludCBncGlvKTsKKyNkZWZpbmUgZ3Bpb190b19pcnEgZ3Bpb190b19pcnEKIGV4dGVybiBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmMTc2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDIxOWQ3YzEuLmViOTQ1YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtNDEsNyArNDEsOCBAQAogCSAqIFNvbWUgYm9hcmRzIGFyZSB1c2luZyBVQVJUMiBhcyBjb25zb2xlCiAJICovCiAJaWYgKG1hY2hpbmVfaXNfYWRpX2NveW90ZSgpIHx8IG1hY2hpbmVfaXNfZ3R3eDU3MTUoKSB8fAotCQkJIG1hY2hpbmVfaXNfZ2F0ZXdheTcwMDEoKSB8fCBtYWNoaW5lX2lzX3dnMzAydjIoKSkKKwkgICAgbWFjaGluZV9pc19nYXRld2F5NzAwMSgpIHx8IG1hY2hpbmVfaXNfd2czMDJ2MigpIHx8CisJICAgIG1hY2hpbmVfaXNfZGV2aXhwKCkgfHwgbWFjaGluZV9pc19taWNjcHQoKSB8fCBtYWNoaW5lX2lzX21pYzI1NigpKQogCQl1YXJ0X2Jhc2UgPSAodm9sYXRpbGUgdTMyKikgSVhQNFhYX1VBUlQyX0JBU0VfUEhZUzsKIAllbHNlCiAJCXVhcnRfYmFzZSA9ICh2b2xhdGlsZSB1MzIqKSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCmluZGV4IDZhMjkyNzkuLmYyMzVmODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApAQCAtMjcwLDcgKzI3MCw3IEBACiAJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAJLmRtYV96b25lX3NpemUJPSBTWl82NE0sCkBAIC0yODQsNyArMjg0LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIAkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKQEAgLTI5OCw3ICsyOTgsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbWljY3B0LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbWljY3B0LXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9taWNjcHQtcGNpLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaXhwNHh4L21pY2NwdC1wY2kuYworICoKKyAqIE1JQ0NQVCBib2FyZC1sZXZlbCBQQ0kgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgT01JQ1JPTiBlbGVjdHJvbmljcyBHbWJICisgKgorICogQXV0aG9yOiBNaWNoYWVsIEpvY2h1bSA8bWljaGFlbC5qb2NodW1Ab21pY3Jvbi5hdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjZGVmaW5lIE1BWF9ERVYJCTQKKyNkZWZpbmUgSVJRX0xJTkVTCTQKKworLyogUENJIGNvbnRyb2xsZXIgR1BJTyB0byBJUlEgcGluIG1hcHBpbmdzICovCisjZGVmaW5lIElOVEEJCTEKKyNkZWZpbmUgSU5UQgkJMgorI2RlZmluZSBJTlRDCQkzCisjZGVmaW5lIElOVEQJCTQKKworCit2b2lkIF9faW5pdCBtaWNjcHRfcGNpX3ByZWluaXQodm9pZCkKK3sKKwlpcnFfc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRBKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlpcnFfc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRCKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlpcnFfc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlRDKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlpcnFfc2V0X2lycV90eXBlKElYUDRYWF9HUElPX0lSUShJTlREKSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwlpeHA0eHhfcGNpX3ByZWluaXQoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbWljY3B0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoreworCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0geworCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCisJCUlYUDRYWF9HUElPX0lSUShJTlRCKSwKKwkJSVhQNFhYX0dQSU9fSVJRKElOVEMpLAorCQlJWFA0WFhfR1BJT19JUlEoSU5URCkKKwl9OworCisJaWYgKHNsb3QgPj0gMSAmJiBzbG90IDw9IE1BWF9ERVYgJiYgcGluID49IDEgJiYgcGluIDw9IElSUV9MSU5FUykKKwkJcmV0dXJuIHBjaV9pcnFfdGFibGVbKHNsb3QgKyBwaW4gLSAyKSAlIDRdOworCisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgaHdfcGNpIG1pY2NwdF9wY2kgX19pbml0ZGF0YSA9IHsKKwkubnJfY29udHJvbGxlcnMgPSAxLAorCS5wcmVpbml0CT0gbWljY3B0X3BjaV9wcmVpbml0LAorCS5zd2l6emxlCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5zZXR1cAkJPSBpeHA0eHhfc2V0dXAsCisJLnNjYW4JCT0gaXhwNHh4X3NjYW5fYnVzLAorCS5tYXBfaXJxCT0gbWljY3B0X21hcF9pcnEsCit9OworCitpbnQgX19pbml0IG1pY2NwdF9wY2lfaW5pdCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX21pY2NwdCgpKQorCQlwY2lfY29tbW9uX2luaXQoJm1pY2NwdF9wY2kpOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwobWljY3B0X3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwppbmRleCBhZmI1MTg3Li5kZTcxNmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBNYWludGFpbmVyczogaHR0cDovL3d3dy5uc2x1Mi1saW51eC5vcmcvCiAgKgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjZGVmaW5lIE5BUzEwMERfU0RBX1BJTgkJNQogI2RlZmluZSBOQVMxMDBEX1NDTF9QSU4JCTYKQEAgLTMxNCw3ICszMTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKE5BUzEwMEQsICJJb21lZ2EgTkFTIDEwMGQiKQogCS8qIE1haW50YWluZXI6IHd3dy5uc2x1Mi1saW51eC5vcmcgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJml4cDR4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCmluZGV4IDY5ZTQwZjIuLmFjODFjY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwpAQCAtMTYsNyArMTYsNyBAQAogICogTWFpbnRhaW5lcnM6IGh0dHA6Ly93d3cubnNsdTItbGludXgub3JnLwogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNkZWZpbmUgTlNMVTJfU0RBX1BJTgkJNwogI2RlZmluZSBOU0xVMl9TQ0xfUElOCQk2CkBAIC0zMDAsNyArMjk5LDcgQEAKIAogTUFDSElORV9TVEFSVChOU0xVMiwgIkxpbmtzeXMgTlNMVTIiKQogCS8qIE1haW50YWluZXI6IHd3dy5uc2x1Mi1saW51eC5vcmcgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyICAgICAgICAgID0gJm5zbHUyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvb21peHAtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L29taXhwLXNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2YTgxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L29taXhwLXNldHVwLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWl4cDR4eC9vbWl4cC1zZXR1cC5jCisgKgorICogb21pY3JvbiBpeHA0eHggYm9hcmQgc2V0dXAKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDA5IE9NSUNST04gZWxlY3Ryb25pY3MgR21iSAorICoKKyAqIGJhc2VkIG5zbHUyLXNldHVwLmMsIGl4ZHA0MjUtc2V0dXAuYzoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG9taXhwX2ZsYXNoX3Jlc291cmNlc1tdID0geworCXsKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG9taXhwX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0JCSJSZWNvdmVyeSBCb290bG9hZGVyIiwKKwkJLnNpemUgPQkJMHgwMDAyMDAwMCwKKwkJLm9mZnNldCA9CTAsCisJfSwgeworCQkubmFtZSA9CQkiQ2FsaWJyYXRpb24gRGF0YSIsCisJCS5zaXplID0JCTB4MDAwMjAwMDAsCisJCS5vZmZzZXQgPQkweDAwMDIwMDAwLAorCX0sIHsKKwkJLm5hbWUgPQkJIlJlY292ZXJ5IEZQR0EiLAorCQkuc2l6ZSA9CQkweDAwMDIwMDAwLAorCQkub2Zmc2V0ID0JMHgwMDA0MDAwMCwKKwl9LCB7CisJCS5uYW1lID0JCSJSZWxlYXNlIEJvb3Rsb2FkZXIiLAorCQkuc2l6ZSA9CQkweDAwMDIwMDAwLAorCQkub2Zmc2V0ID0JMHgwMDA2MDAwMCwKKwl9LCB7CisJCS5uYW1lID0JCSJSZWxlYXNlIEZQR0EiLAorCQkuc2l6ZSA9CQkweDAwMDIwMDAwLAorCQkub2Zmc2V0ID0JMHgwMDA4MDAwMCwKKwl9LCB7CisJCS5uYW1lID0JCSJLZXJuZWwiLAorCQkuc2l6ZSA9CQkweDAwMTYwMDAwLAorCQkub2Zmc2V0ID0JMHgwMDBhMDAwMCwKKwl9LCB7CisJCS5uYW1lID0JCSJGaWxlc3lzdGVtIiwKKwkJLnNpemUgPQkJMHgwMEMwMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAyMDAwMDAsCisJfSwgeworCQkubmFtZSA9CQkiUGVyc2lzdGVudCBTdG9yYWdlIiwKKwkJLnNpemUgPQkJMHgwMDIwMDAwMCwKKwkJLm9mZnNldCA9CTB4MDBFMDAwMDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBvbWl4cF9mbGFzaF9kYXRhW10gPSB7CisJeworCQkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkJLnBhcnRzCQk9IG9taXhwX3BhcnRpdGlvbnMsCisJCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUob21peHBfcGFydGl0aW9ucyksCisJfSwgeworCQkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKKwkJLnBhcnRzCQk9IE5VTEwsCisJCS5ucl9wYXJ0cwk9IDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9taXhwX2ZsYXNoX2RldmljZVtdID0geworCXsKKwkJLm5hbWUJCT0gIklYUDRYWC1GbGFzaCIsCisJCS5pZAkJPSAwLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmb21peHBfZmxhc2hfZGF0YVswXSwKKwkJfSwKKwkJLnJlc291cmNlID0gJm9taXhwX2ZsYXNoX3Jlc291cmNlc1swXSwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCX0sIHsKKwkJLm5hbWUJCT0gIklYUDRYWC1GbGFzaCIsCisJCS5pZAkJPSAxLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEgPSAmb21peHBfZmxhc2hfZGF0YVsxXSwKKwkJfSwKKwkJLnJlc291cmNlID0gJm9taXhwX2ZsYXNoX3Jlc291cmNlc1sxXSwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCX0sCit9OworCisvKiBTd2FwIFVBUlQncyAtIFRoZXNlIGJvYXJkcyBoYXZlIHRoZSBjb25zb2xlIG9uIFVBUlQyLiBUaGUgZm9sbG93aW5nCisgKiBjb25maWd1cmF0aW9uIGlzIHVzZWQ6CisgKiAgICAgIHR0eVMwIC4uIFVBUlQyCisgKiAgICAgIHR0eVMxIC4uIFVBUlQxCisgKiBUaGlzIHdheSBzdGFuZGFyZCBpbWFnZXMgY2FuIGJlIHVzZWQgd2l0aCB0aGUga2VybmVsIHRoYXQgZXhwZWN0CisgKiB0aGUgY29uc29sZSBvbiB0dHlTMC4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWl4cF91YXJ0X3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CQk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJCS5lbmQJCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUyArIDB4MGZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CQk9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVMsCisJCS5lbmQJCT0gSVhQNFhYX1VBUlQxX0JBU0VfUEhZUyArIDB4MGZmZiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IG9taXhwX3VhcnRfZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAorCQkubWVtYmFzZQk9IChjaGFyICopSVhQNFhYX1VBUlQyX0JBU0VfVklSVCArIFJFR19PRkZTRVQsCisJCS5pcnEJCT0gSVJRX0lYUDRYWF9VQVJUMiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorCX0sIHsKKwkJLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTLAorCQkubWVtYmFzZQk9IChjaGFyICopSVhQNFhYX1VBUlQxX0JBU0VfVklSVCArIFJFR19PRkZTRVQsCisJCS5pcnEJCT0gSVJRX0lYUDRYWF9VQVJUMSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorCX0sIHsKKwkJLyogbGlzdCB0ZXJtaW5hdGlvbiAqLworCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9taXhwX3VhcnQgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSBvbWl4cF91YXJ0X2RhdGEsCisJLm51bV9yZXNvdXJjZXMJCT0gMiwKKwkucmVzb3VyY2UJCT0gb21peHBfdWFydF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIG1pYzI1Nl9sZWRfcGluc1tdID0geworCXsKKwkJLm5hbWUJCT0gIkxFRC1BIiwKKwkJLmdwaW8JCT0gNywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIG1pYzI1Nl9sZWRfZGF0YSA9IHsKKwkubnVtX2xlZHMJCT0gQVJSQVlfU0laRShtaWMyNTZfbGVkX3BpbnMpLAorCS5sZWRzCQkJPSBtaWMyNTZfbGVkX3BpbnMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtaWMyNTZfbGVkcyA9IHsKKwkubmFtZQkJCT0gImxlZHMtZ3BpbyIsCisJLmlkCQkJPSAtMSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmbWljMjU2X2xlZF9kYXRhLAorfTsKKworLyogQnVpbHQtaW4gMTAvMTAwIEV0aGVybmV0IE1BQyBpbnRlcmZhY2VzICovCitzdGF0aWMgc3RydWN0IGV0aF9wbGF0X2luZm8gaXhkcDQyNV9wbGF0X2V0aFtdID0geworCXsKKwkJLnBoeQkJPSAwLAorCQkucnhxCQk9IDMsCisJCS50eHJlYWR5cQk9IDIwLAorCX0sIHsKKwkJLnBoeQkJPSAxLAorCQkucnhxCQk9IDQsCisJCS50eHJlYWR5cQk9IDIxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpeGRwNDI1X2V0aFtdID0geworCXsKKwkJLm5hbWUJCQk9ICJpeHA0eHhfZXRoIiwKKwkJLmlkCQkJPSBJWFA0WFhfRVRIX05QRUIsCisJCS5kZXYucGxhdGZvcm1fZGF0YQk9IGl4ZHA0MjVfcGxhdF9ldGgsCisJfSwgeworCQkubmFtZQkJCT0gIml4cDR4eF9ldGgiLAorCQkuaWQJCQk9IElYUDRYWF9FVEhfTlBFQywKKwkJLmRldi5wbGF0Zm9ybV9kYXRhCT0gaXhkcDQyNV9wbGF0X2V0aCArIDEsCisJfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldml4cF9wbGRldltdIF9faW5pdGRhdGEgPSB7CisJJm9taXhwX3VhcnQsCisJJm9taXhwX2ZsYXNoX2RldmljZVswXSwKKwkmaXhkcDQyNV9ldGhbMF0sCisJJml4ZHA0MjVfZXRoWzFdLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pYzI1Nl9wbGRldltdIF9faW5pdGRhdGEgPSB7CisJJm9taXhwX3VhcnQsCisJJm9taXhwX2ZsYXNoX2RldmljZVswXSwKKwkmbWljMjU2X2xlZHMsCisJJml4ZHA0MjVfZXRoWzBdLAorCSZpeGRwNDI1X2V0aFsxXSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptaWNjcHRfcGxkZXZbXSBfX2luaXRkYXRhID0geworCSZvbWl4cF91YXJ0LAorCSZvbWl4cF9mbGFzaF9kZXZpY2VbMF0sCisJJm9taXhwX2ZsYXNoX2RldmljZVsxXSwKKwkmaXhkcDQyNV9ldGhbMF0sCisJJml4ZHA0MjVfZXRoWzFdLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9taXhwX2luaXQodm9pZCkKK3sKKwlpeHA0eHhfc3lzX2luaXQoKTsKKworCS8qIDE2TWlCIEJvb3QgRmxhc2ggKi8KKwlvbWl4cF9mbGFzaF9yZXNvdXJjZXNbMF0uc3RhcnQgPSBJWFA0WFhfRVhQX0JVU19CQVNFKDApOworCW9taXhwX2ZsYXNoX3Jlc291cmNlc1swXS5lbmQgICA9IElYUDRYWF9FWFBfQlVTX0VORCgwKTsKKworCS8qIDMyIE1pQiBEYXRhIEZsYXNoICovCisJb21peHBfZmxhc2hfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gSVhQNFhYX0VYUF9CVVNfQkFTRSgyKTsKKwlvbWl4cF9mbGFzaF9yZXNvdXJjZXNbMV0uZW5kICAgPSBJWFA0WFhfRVhQX0JVU19FTkQoMik7CisKKwlpZiAobWFjaGluZV9pc19kZXZpeHAoKSkKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aXhwX3BsZGV2LCBBUlJBWV9TSVpFKGRldml4cF9wbGRldikpOworCWVsc2UgaWYgKG1hY2hpbmVfaXNfbWljY3B0KCkpCisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG1pY2NwdF9wbGRldiwgQVJSQVlfU0laRShtaWNjcHRfcGxkZXYpKTsKKwllbHNlIGlmIChtYWNoaW5lX2lzX21pYzI1NigpKQorCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtaWMyNTZfcGxkZXYsIEFSUkFZX1NJWkUobWljMjU2X3BsZGV2KSk7Cit9CisKKyNpZmRlZiBDT05GSUdfTUFDSF9ERVZJWFAKK01BQ0hJTkVfU1RBUlQoREVWSVhQLCAiT21pY3JvbiBERVZJWFAiKQorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAorCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCisJLnRpbWVyICAgICAgICAgID0gJml4cDR4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gb21peHBfaW5pdCwKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX01JQ0NQVAorTUFDSElORV9TVEFSVChNSUNDUFQsICJPbWljcm9uIE1JQ0NQVCIpCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCisJLm1hcF9pbwkJPSBpeHA0eHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKKwkudGltZXIgICAgICAgICAgPSAmaXhwNHh4X3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBvbWl4cF9pbml0LAorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzY0TSwKKyNlbmRpZgorTUFDSElORV9FTkQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfTUlDMjU2CitNQUNISU5FX1NUQVJUKE1JQzI1NiwgIk9taWNyb24gTUlDMjU2IikKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKKwkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAorCS50aW1lciAgICAgICAgICA9ICZpeHA0eHhfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG9taXhwX2luaXQsCitNQUNISU5FX0VORAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1zZXR1cC5jCmluZGV4IDA0NTMzNmMuLjI3ZTQ2OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1zZXR1cC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkubWFwX2lvCQk9IGl4cDR4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gdnVsY2FuX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1zZXR1cC5jCmluZGV4IDQwYjlmYWQuLmIxNDE0NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXNldHVwLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCS5tYXBfaW8JCT0gaXhwNHh4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB3ZzMwMnYyX2luaXQsCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQogCS5kbWFfem9uZV9zaXplCT0gU1pfNjRNLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jcHVpZGxlLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NwdWlkbGUuYwppbmRleCBmNjhkMzNmLi43MDg4MTgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NwdWlkbGUuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NwdWlkbGUuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPG1hY2gva2lya3dvb2QuaD4KIApAQCAtMzIsMTcgKzMzLDE4IEBACiAKIC8qIEFjdHVhbCBjb2RlIHRoYXQgcHV0cyB0aGUgU29DIGluIGRpZmZlcmVudCBpZGxlIHN0YXRlcyAqLwogc3RhdGljIGludCBraXJrd29vZF9lbnRlcl9pZGxlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCSAgICAgICBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHRpbWV2YWwgYmVmb3JlLCBhZnRlcjsKIAlpbnQgaWRsZV90aW1lOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlkb19nZXR0aW1lb2ZkYXkoJmJlZm9yZSk7Ci0JaWYgKHN0YXRlID09ICZkZXYtPnN0YXRlc1swXSkKKwlpZiAoaW5kZXggPT0gMCkKIAkJLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCiAJCWNwdV9kb19pZGxlKCk7Ci0JZWxzZSBpZiAoc3RhdGUgPT0gJmRldi0+c3RhdGVzWzFdKSB7CisJZWxzZSBpZiAoaW5kZXggPT0gMSkgewogCQkvKgogCQkgKiBGb2xsb3dpbmcgd3JpdGUgd2lsbCBwdXQgRERSIGluIHNlbGYgcmVmcmVzaC4KIAkJICogTm90ZSB0aGF0IHdlIGhhdmUgMjU2IGN5Y2xlcyBiZWZvcmUgRERSIHB1dHMgaXQKQEAgLTU3LDM1ICs1OSw0MCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlpZGxlX3RpbWUgPSAoYWZ0ZXIudHZfc2VjIC0gYmVmb3JlLnR2X3NlYykgKiBVU0VDX1BFUl9TRUMgKwogCQkJKGFmdGVyLnR2X3VzZWMgLSBiZWZvcmUudHZfdXNlYyk7Ci0JcmV0dXJuIGlkbGVfdGltZTsKKworCS8qIFVwZGF0ZSBsYXN0IHJlc2lkZW5jeSAqLworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBpZGxlX3RpbWU7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIC8qIEluaXRpYWxpemUgQ1BVIGlkbGUgYnkgcmVnaXN0ZXJpbmcgdGhlIGlkbGUgc3RhdGVzICovCiBzdGF0aWMgaW50IGtpcmt3b29kX2luaXRfY3B1aWRsZSh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlOwotCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmtpcmt3b29kX2lkbGVfZHJpdmVyKTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRyaXZlciA9ICZraXJrd29vZF9pZGxlX2RyaXZlcjsKIAogCWRldmljZSA9ICZwZXJfY3B1KGtpcmt3b29kX2NwdWlkbGVfZGV2aWNlLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWRldmljZS0+c3RhdGVfY291bnQgPSBLSVJLV09PRF9NQVhfU1RBVEVTOworCWRyaXZlci0+c3RhdGVfY291bnQgPSBLSVJLV09PRF9NQVhfU1RBVEVTOwogCiAJLyogV2FpdCBmb3IgaW50ZXJydXB0IHN0YXRlICovCi0JZGV2aWNlLT5zdGF0ZXNbMF0uZW50ZXIgPSBraXJrd29vZF9lbnRlcl9pZGxlOwotCWRldmljZS0+c3RhdGVzWzBdLmV4aXRfbGF0ZW5jeSA9IDE7Ci0JZGV2aWNlLT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IDEwMDAwOwotCWRldmljZS0+c3RhdGVzWzBdLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0Jc3RyY3B5KGRldmljZS0+c3RhdGVzWzBdLm5hbWUsICJXRkkiKTsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMF0uZGVzYywgIldhaXQgZm9yIGludGVycnVwdCIpOworCWRyaXZlci0+c3RhdGVzWzBdLmVudGVyID0ga2lya3dvb2RfZW50ZXJfaWRsZTsKKwlkcml2ZXItPnN0YXRlc1swXS5leGl0X2xhdGVuY3kgPSAxOworCWRyaXZlci0+c3RhdGVzWzBdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKKwlkcml2ZXItPnN0YXRlc1swXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXN0cmNweShkcml2ZXItPnN0YXRlc1swXS5uYW1lLCAiV0ZJIik7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzBdLmRlc2MsICJXYWl0IGZvciBpbnRlcnJ1cHQiKTsKIAogCS8qIFdhaXQgZm9yIGludGVycnVwdCBhbmQgRERSIHNlbGYgcmVmcmVzaCBzdGF0ZSAqLwotCWRldmljZS0+c3RhdGVzWzFdLmVudGVyID0ga2lya3dvb2RfZW50ZXJfaWRsZTsKLQlkZXZpY2UtPnN0YXRlc1sxXS5leGl0X2xhdGVuY3kgPSAxMDsKLQlkZXZpY2UtPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwMDA7Ci0JZGV2aWNlLT5zdGF0ZXNbMV0uZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKLQlzdHJjcHkoZGV2aWNlLT5zdGF0ZXNbMV0ubmFtZSwgIkREUiBTUiIpOwotCXN0cmNweShkZXZpY2UtPnN0YXRlc1sxXS5kZXNjLCAiV0ZJIGFuZCBERFIgU2VsZiBSZWZyZXNoIik7CisJZHJpdmVyLT5zdGF0ZXNbMV0uZW50ZXIgPSBraXJrd29vZF9lbnRlcl9pZGxlOworCWRyaXZlci0+c3RhdGVzWzFdLmV4aXRfbGF0ZW5jeSA9IDEwOworCWRyaXZlci0+c3RhdGVzWzFdLnRhcmdldF9yZXNpZGVuY3kgPSAxMDAwMDsKKwlkcml2ZXItPnN0YXRlc1sxXS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXN0cmNweShkcml2ZXItPnN0YXRlc1sxXS5uYW1lLCAiRERSIFNSIik7CisJc3RyY3B5KGRyaXZlci0+c3RhdGVzWzFdLmRlc2MsICJXRkkgYW5kIEREUiBTZWxmIFJlZnJlc2giKTsKIAorCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZraXJrd29vZF9pZGxlX2RyaXZlcik7CiAJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldmljZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJraXJrd29vZF9pbml0X2NwdWlkbGU6IEZhaWxlZCByZWdpc3RlcmluZ1xuIik7CiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kMm5ldF92Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kMm5ldF92Mi1zZXR1cC5jCmluZGV4IDA0M2NmZDUuLmY0NTdlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZDJuZXRfdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2QybmV0X3YyLXNldHVwLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEQyTkVUX1YyLCAiTGFDaWUgZDIgTmV0d29yayB2MiIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZDJuZXRfdjJfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kYjg4ZjYyODEtYnAtc2V0dXAuYwppbmRleCBiZmYwNGUwLi5mZjRjMjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RiODhmNjI4MS1icC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZGI4OGY2MjgxLWJwLXNldHVwLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAogTUFDSElORV9TVEFSVChEQjg4RjYyODFfQlAsICJNYXJ2ZWxsIERCLTg4RjYyODEtQlAgRGV2ZWxvcG1lbnQgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IFNhZWVkIEJpc2hhcmEgPHNhZWVkQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGRiODhmNjI4MV9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZG9ja3N0YXItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZG9ja3N0YXItc2V0dXAuYwppbmRleCBmMTRkZmI4Li5lNGQxOTliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2RvY2tzdGFyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9kb2Nrc3Rhci1zZXR1cC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChET0NLU1RBUiwgIlNlYWdhdGUgRnJlZUFnZW50IERvY2tTdGFyIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBkb2Nrc3Rhcl9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZ3VydXBsdWctc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvZ3VydXBsdWctc2V0dXAuYwppbmRleCA0MWQxYjQwLi42YzQwZjc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2d1cnVwbHVnLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9ndXJ1cGx1Zy1zZXR1cC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogTUFDSElORV9TVEFSVChHVVJVUExVRywgIk1hcnZlbGwgR3VydVBsdWcgUmVmZXJlbmNlIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTaWRkYXJ0aCBHb3JlIDxnb3Jlc0BtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBndXJ1cGx1Z19pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGRiMDZhZTQzLi5mNzg1ZDQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2JyaWRnZS1yZWdzLmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9S0lSS1dPT0RfUkVHU19QSFlTX0JBU0UKIAlsZHIJXHJ2LCA9S0lSS1dPT0RfUkVHU19WSVJUX0JBU0UKIAlvcnIJXHJwLCBccnAsICMweDAwMDEyMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAwYjQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gta2lya3dvb2QvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2lycS5jCmluZGV4IDA1ZDE5M2EuLmM0YzY4ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9pcnEuYwpAQCAtNywxNCArNywxMyBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9icmlkZ2UtcmVncy5oPgogI2luY2x1ZGUgPHBsYXQvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlICJjb21tb24uaCIKIAogc3RhdGljIHZvaWQgZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tcHAuYwppbmRleCBiMGE3ZDk3Li5jYzQzMWZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL21wcC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXBwLmMKQEAgLTcsMTIgKzcsMTEgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L21wcC5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tdjg4ZjYyODFndHdfZ2Utc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbXY4OGY2MjgxZ3R3X2dlLXNldHVwLmMKaW5kZXggMDBjY2EyMi4uOWExZTkxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9tdjg4ZjYyODFndHdfZ2Utc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL212ODhmNjI4MWd0d19nZS1zZXR1cC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogTUFDSElORV9TVEFSVChNVjg4RjYyODFHVFdfR0UsICJNYXJ2ZWxsIDg4RjYyODEgR1RXIEdFIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBtdjg4ZjYyODFndHdfZ2VfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHNwYWNlX3YyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHNwYWNlX3YyLXNldHVwLmMKaW5kZXggN2NkYWI1Ny4uODg0OWJjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXRzcGFjZV92Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvbmV0c3BhY2VfdjItc2V0dXAuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9ORVRTUEFDRV9WMgogTUFDSElORV9TVEFSVChORVRTUEFDRV9WMiwgIkxhQ2llIE5ldHdvcmsgU3BhY2UgdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG5ldHNwYWNlX3YyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtMjY5LDcgKzI2OSw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9JTkVUU1BBQ0VfVjIKIE1BQ0hJTkVfU1RBUlQoSU5FVFNQQUNFX1YyLCAiTGFDaWUgSW50ZXJuZXQgU3BhY2UgdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG5ldHNwYWNlX3YyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtMjgwLDcgKzI4MCw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9ORVRTUEFDRV9NQVhfVjIKIE1BQ0hJTkVfU1RBUlQoTkVUU1BBQ0VfTUFYX1YyLCAiTGFDaWUgTmV0d29yayBTcGFjZSBNYXggdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG5ldHNwYWNlX3YyX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9uZXR4YmlnX3YyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHhiaWdfdjItc2V0dXAuYwppbmRleCA2YmU2MjdkLi4xYmExMmM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHhiaWdfdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL25ldHhiaWdfdjItc2V0dXAuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9ORVQyQklHX1YyCiBNQUNISU5FX1NUQVJUKE5FVDJCSUdfVjIsICJMYUNpZSAyQmlnIE5ldHdvcmsgdjIiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IG5ldHhiaWdfdjJfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCkBAIC00MTAsNyArNDEwLDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX05FVDVCSUdfVjIKIE1BQ0hJTkVfU1RBUlQoTkVUNUJJR19WMiwgIkxhQ2llIDVCaWcgTmV0d29yayB2MiIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbmV0eGJpZ192Ml9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL29wZW5yZC1zZXR1cC5jCmluZGV4IGY2OWJlZWYuLjU2NjBjYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9vcGVucmQtc2V0dXAuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfT1BFTlJEX0JBU0UKIE1BQ0hJTkVfU1RBUlQoT1BFTlJEX0JBU0UsICJNYXJ2ZWxsIE9wZW5SRCBCYXNlIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBEaGF2YWwgVmFzYSA8ZGhhdmFsLnZhc2FAZWluZm9jaGlwcy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gb3BlbnJkX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtMjI2LDcgKzIyNiw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfT1BFTlJEX0NMSUVOVAogTUFDSElORV9TVEFSVChPUEVOUkRfQ0xJRU5ULCAiTWFydmVsbCBPcGVuUkQgQ2xpZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBEaGF2YWwgVmFzYSA8ZGhhdmFsLnZhc2FAZWluZm9jaGlwcy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gb3BlbnJkX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApAQCAtMjM4LDcgKzIzOCw3IEBACiAjaWZkZWYgQ09ORklHX01BQ0hfT1BFTlJEX1VMVElNQVRFCiBNQUNISU5FX1NUQVJUKE9QRU5SRF9VTFRJTUFURSwgIk1hcnZlbGwgT3BlblJEIFVsdGltYXRlIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBEaGF2YWwgVmFzYSA8ZGhhdmFsLnZhc2FAZWluZm9jaGlwcy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gb3BlbnJkX2luaXQsCiAJLm1hcF9pbwkJPSBraXJrd29vZF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBraXJrd29vZF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYxOTItbmFzLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjE5Mi1uYXMtc2V0dXAuYwppbmRleCA3NWM2NjAxLi42NjYzODY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjE5Mi1uYXMtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjE5Mi1uYXMtc2V0dXAuYwpAQCAtNzksNyArNzksNyBAQAogCiBNQUNISU5FX1NUQVJUKFJEODhGNjE5Ml9OQVMsICJNYXJ2ZWxsIFJELTg4RjYxOTItTkFTIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDg4ZjYxOTJfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9yZDg4ZjYyODEtc2V0dXAuYwppbmRleCAwZjc1NDk0Li42NmIzYzA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3JkODhmNjI4MS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcmQ4OGY2MjgxLXNldHVwLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJEODhGNjI4MSwgIk1hcnZlbGwgUkQtODhGNjI4MSBSZWZlcmVuY2UgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IFNhZWVkIEJpc2hhcmEgPHNhZWVkQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJkODhmNjI4MV9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvc2hlZXZhcGx1Zy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9zaGVldmFwbHVnLXNldHVwLmMKaW5kZXggMTdkZTBiZi4uOGIxMDJkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9zaGVldmFwbHVnLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9zaGVldmFwbHVnLXNldHVwLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX1NIRUVWQVBMVUcKIE1BQ0hJTkVfU1RBUlQoU0hFRVZBUExVRywgIk1hcnZlbGwgU2hlZXZhUGx1ZyBSZWZlcmVuY2UgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IHNoYWRpIEFtbW91cmkgPHNoYWRpQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHNoZWV2YXBsdWdfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCkBAIC0xNDksNyArMTQ5LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX0VTQVRBX1NIRUVWQVBMVUcKIE1BQ0hJTkVfU1RBUlQoRVNBVEFfU0hFRVZBUExVRywgIk1hcnZlbGwgZVNBVEEgU2hlZXZhUGx1ZyBSZWZlcmVuY2UgQm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHNoZWV2YXBsdWdfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3Q1MzI1LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3Q1MzI1LXNldHVwLmMKaW5kZXggZTZiOWIxYi4uZWExMDRmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90NTMyNS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdDUzMjUtc2V0dXAuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVDUzMjUsICJIUCB0NTMyNSBUaGluIENsaWVudCIpCiAJLyogTWFpbnRhaW5lcjogTWFydGluIE1pY2hsbWF5ciA8dGJtQGN5cml1cy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gaHBfdDUzMjVfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzMjE5LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzMjE5LXNldHVwLmMKaW5kZXggNjhmMzJmMi4uMjYyYzAzNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czIxOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHMyMTktc2V0dXAuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFMyMTksICJRTkFQIFRTLTExOS9UUy0yMTkiKQogCS8qIE1haW50YWluZXI6IE1hcnRpbiBNaWNobG1heXIgPHRibUBjeXJpdXMuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHFuYXBfdHMyMTlfaW5pdCwKIAkubWFwX2lvCQk9IGtpcmt3b29kX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtpcmt3b29kX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzNDF4LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3RzNDF4LXNldHVwLmMKaW5kZXggZDVkMDA5OS4uYjY4ZjViNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC90czQxeC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvdHM0MXgtc2V0dXAuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFM0MVgsICJRTkFQIFRTLTQxeCIpCiAJLyogTWFpbnRhaW5lcjogTWFydGluIE1pY2hsbWF5ciA8dGJtQGN5cml1cy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcW5hcF90czQxeF9pbml0LAogCS5tYXBfaW8JCT0ga2lya3dvb2RfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2lya3dvb2RfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvTWFrZWZpbGUKaW5kZXggN2UzZTgxNi4uODUzZWZkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjIE1ha2VmaWxlIGZvciBLUzg2OTUgYXJjaGl0ZWN0dXJlIHN1cHBvcnQKICMKIAotb2JqLXkJCQkJOj0gY3B1Lm8gaXJxLm8gdGltZS5vIGdwaW8ubyBkZXZpY2VzLm8KK29iai15CQkJCTo9IGNwdS5vIGlycS5vIHRpbWUubyBkZXZpY2VzLm8KIG9iai1tCQkJCTo9CiBvYmotbgkJCQk6PQogb2JqLQkJCQk6PQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtYWNzNWsuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWFjczVrLmMKaW5kZXggM2NhNGY4ZS4uYTkxZjk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtYWNzNWsuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1hY3M1ay5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWtzODY5NS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC0yMjMsNyArMjIzLDcgQEAKIAogTUFDSElORV9TVEFSVChBQ1M1SywgIkJyaXZvIFN5c3RlbXMgTExDIEFDUy01MDAwIE1hc3RlciBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU2ltdGVjIEVsZWN0cm9uaWNzLiAqLwotCS5ib290X3BhcmFtcwk9IEtTODY5NV9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0ga3M4Njk1X21hcF9pbywKIAkuaW5pdF9pcnEJPSBrczg2OTVfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFjczVrX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCmluZGV4IDEzMzhjYjMuLmQyNGJjZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWtzODY5NS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogTUFDSElORV9TVEFSVChEU00zMjAsICJELUxpbmsgRFNNLTMyMCBXaXJlbGVzcyBNZWRpYSBQbGF5ZXIiKQogCS8qIE1haW50YWluZXI6IFNpbXRlYyBFbGVjdHJvbmljcy4gKi8KLQkuYm9vdF9wYXJhbXMJPSBLUzg2OTVfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGtzODY5NV9tYXBfaW8sCiAJLmluaXRfaXJxCT0ga3M4Njk1X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBkc20zMjBfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKaW5kZXggZTJlM2NiYS4uMTZjOTU2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKQEAgLTUsNyArNSw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWtzODY5NS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpAQCAtNTMsNyArNTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKEtTODY5NSwgIktTODY5NSBDZW50YXVyIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBNaWNyZWwgU2VtaWNvbmR1Y3RvciBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gS1M4Njk1X1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBrczg2OTVfbWFwX2lvLAogCS5pbml0X2lycQk9IGtzODY5NV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbWljcmVsX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKaW5kZXggYjg5ZmI2ZC4uNzNiZDYzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWU0NTY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJldyBWaWN0b3IKLSAqIFVwZGF0ZWQgdG8gR1BJT0xJQiwgQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgICAgICAgICAgICAgICAgIERhbmllbCBTaWx2ZXJzdG9uZSA8ZHNpbHZlcnNAc2ltdGVjLmNvLnVrPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0KLS8qCi0gKiBDb25maWd1cmUgYSBHUElPIGxpbmUgZm9yIGVpdGhlciBHUElPIGZ1bmN0aW9uLCBvciBpdHMgaW50ZXJuYWwKLSAqIGZ1bmN0aW9uIChJbnRlcnJ1cHQsIFRpbWVyLCBldGMpLgotICovCi1zdGF0aWMgdm9pZCBrczg2OTVfZ3Bpb19tb2RlKHVuc2lnbmVkIGludCBwaW4sIHNob3J0IGdwaW8pCi17Ci0JdW5zaWduZWQgaW50IGVuYWJsZVtdID0geyBJT1BDX0lPRUlOVDBFTiwgSU9QQ19JT0VJTlQxRU4sIElPUENfSU9FSU5UMkVOLCBJT1BDX0lPRUlOVDNFTiwgSU9QQ19JT1RJTTBFTiwgSU9QQ19JT1RJTTFFTiB9OwotCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7Ci0KLQlpZiAocGluID4gS1M4Njk1X0dQSU9fNSkJLyogb25seSBHUElPIDAuLjUgaGF2ZSBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEMpOwotCWlmIChncGlvKQkJCS8qIEdQSU86IHNldCBiaXQgdG8gMCAqLwotCQl4ICY9IH5lbmFibGVbcGluXTsKLQllbHNlCQkJCS8qIEludGVybmFsIGZ1bmN0aW9uOiBzZXQgYml0IHRvIDEgKi8KLQkJeCB8PSBlbmFibGVbcGluXTsKLQlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QQyk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9faXJxW10gPSB7IEtTODY5NV9JUlFfRVhURVJOMCwgS1M4Njk1X0lSUV9FWFRFUk4xLCBLUzg2OTVfSVJRX0VYVEVSTjIsIEtTODY5NV9JUlFfRVhURVJOMyB9OwotCi0vKgotICogQ29uZmlndXJlIEdQSU8gcGluIGFzIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2UuCi0gKi8KLWludCBrczg2OTVfZ3Bpb19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKLQotCWlmIChwaW4gPiBLUzg2OTVfR1BJT18zKQkvKiBvbmx5IEdQSU8gMC4uMyBjYW4gZ2VuZXJhdGUgSVJRICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogc2V0IHBpbiBhcyBpbnB1dCAqLwotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQl4ICY9IH5JT1BNKHBpbik7Ci0JX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JLyogU2V0IElSUSB0cmlnZ2VyaW5nIHR5cGUgKi8KLQlpcnFfc2V0X2lycV90eXBlKGdwaW9faXJxW3Bpbl0sIHR5cGUpOwotCi0JLyogZW5hYmxlIGludGVycnVwdCBtb2RlICovCi0Ja3M4Njk1X2dwaW9fbW9kZShwaW4sIDApOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGtzODY5NV9ncGlvX2ludGVycnVwdCk7Ci0KLQotCi0vKiAuLi4uIEdlbmVyaWMgR1BJTyBpbnRlcmZhY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwotCi0vKgotICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gaW5wdXQuCi0gKi8KLXN0YXRpYyBpbnQga3M4Njk1X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQotewotCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7Ci0KLQlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc2V0IHBpbiB0byBHUElPIG1vZGUgKi8KLQlrczg2OTVfZ3Bpb19tb2RlKHBpbiwgMSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBzZXQgcGluIGFzIGlucHV0ICovCi0JeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOwotCXggJj0gfklPUE0ocGluKTsKLQlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gb3V0cHV0LCB3aXRoIGRlZmF1bHQgc3RhdGUuCi0gKi8KLXN0YXRpYyBpbnQga3M4Njk1X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQkJdW5zaWduZWQgaW50IHBpbiwgaW50IHN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7Ci0KLQlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc2V0IHBpbiB0byBHUElPIG1vZGUgKi8KLQlrczg2OTVfZ3Bpb19tb2RlKHBpbiwgMSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBzZXQgbGluZSBzdGF0ZSAqLwotCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKLQlpZiAoc3RhdGUpCi0JCXggfD0gSU9QRChwaW4pOwotCWVsc2UKLQkJeCAmPSB+SU9QRChwaW4pOwotCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKLQotCS8qIHNldCBwaW4gYXMgb3V0cHV0ICovCi0JeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOwotCXggfD0gSU9QTShwaW4pOwotCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBTZXQgdGhlIHN0YXRlIG9mIGFuIG91dHB1dCBHUElPIGxpbmUuCi0gKi8KLXN0YXRpYyB2b2lkIGtzODY5NV9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCQkgIHVuc2lnbmVkIGludCBwaW4sIGludCBzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOwotCi0JaWYgKHBpbiA+IEtTODY5NV9HUElPXzE1KQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBzZXQgb3V0cHV0IGxpbmUgc3RhdGUgKi8KLQl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7Ci0JaWYgKHN0YXRlKQotCQl4IHw9IElPUEQocGluKTsKLQllbHNlCi0JCXggJj0gfklPUEQocGluKTsKLQlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLQotLyoKLSAqIFJlYWQgdGhlIHN0YXRlIG9mIGEgR1BJTyBsaW5lLgotICovCi1zdGF0aWMgaW50IGtzODY5NV9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKLXsKLQl1bnNpZ25lZCBsb25nIHg7Ci0KLQlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwotCXJldHVybiAoeCAmIElPUEQocGluKSkgIT0gMDsKLX0KLQotCi0vKgotICogTWFwIEdQSU8gbGluZSB0byBJUlEgbnVtYmVyLgotICovCi1zdGF0aWMgaW50IGtzODY5NV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKLXsKLQlpZiAocGluID4gS1M4Njk1X0dQSU9fMykJLyogb25seSBHUElPIDAuLjMgY2FuIGdlbmVyYXRlIElSUSAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBncGlvX2lycVtwaW5dOwotfQotCi0vKgotICogTWFwIElSUSBudW1iZXIgdG8gR1BJTyBsaW5lLgotICovCi1pbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoKGlycSA8IEtTODY5NV9JUlFfRVhURVJOMCkgfHwgKGlycSA+IEtTODY5NV9JUlFfRVhURVJOMykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIChpcnEgLSBLUzg2OTVfSVJRX0VYVEVSTjApOwotfQotRVhQT1JUX1NZTUJPTChpcnFfdG9fZ3Bpbyk7Ci0KLS8qIEdQSU9MSUIgaW50ZXJmYWNlICovCi0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGtzODY5NV9ncGlvX2NoaXAgPSB7Ci0JLmxhYmVsCQkJPSAiS1M4Njk1IiwKLQkuZGlyZWN0aW9uX2lucHV0CT0ga3M4Njk1X2dwaW9fZGlyZWN0aW9uX2lucHV0LAotCS5kaXJlY3Rpb25fb3V0cHV0CT0ga3M4Njk1X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkuZ2V0CQkJPSBrczg2OTVfZ3Bpb19nZXRfdmFsdWUsCi0JLnNldAkJCT0ga3M4Njk1X2dwaW9fc2V0X3ZhbHVlLAotCS50b19pcnEJCQk9IGtzODY5NV9ncGlvX3RvX2lycSwKLQkuYmFzZQkJCT0gMCwKLQkubmdwaW8JCQk9IDE2LAotCS5jYW5fc2xlZXAJCT0gMCwKLX07Ci0KLS8qIFJlZ2lzdGVyIHRoZSBHUElPcyAqLwotdm9pZCBrczg2OTVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCkKLXsKLQlpZiAoZ3Bpb2NoaXBfYWRkKCZrczg2OTVfZ3Bpb19jaGlwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY29yZSBHUElPc1xuIik7Ci19Ci0KLS8qIC4uLi4gRGVidWcgaW50ZXJmYWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQotc3RhdGljIGludCBrczg2OTVfZ3Bpb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQotewotCXVuc2lnbmVkIGludCBlbmFibGVbXSA9IHsgSU9QQ19JT0VJTlQwRU4sIElPUENfSU9FSU5UMUVOLCBJT1BDX0lPRUlOVDJFTiwgSU9QQ19JT0VJTlQzRU4sIElPUENfSU9USU0wRU4sIElPUENfSU9USU0xRU4gfTsKLQl1bnNpZ25lZCBpbnQgaW50bWFza1tdID0geyBJT1BDX0lPRUlOVDBUTSwgSU9QQ19JT0VJTlQxVE0sIElPUENfSU9FSU5UMlRNLCBJT1BDX0lPRUlOVDNUTSB9OwotCXVuc2lnbmVkIGxvbmcgbW9kZSwgY3RybCwgZGF0YTsKLQlpbnQgaTsKLQotCW1vZGUgPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKLQljdHJsID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QQyk7Ci0JZGF0YSA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOwotCi0Jc2VxX3ByaW50ZihzLCAiUGluXHRJL09cdEZ1bmN0aW9uXHRTdGF0ZVxuXG4iKTsKLQotCWZvciAoaSA9IEtTODY5NV9HUElPXzA7IGkgPD0gS1M4Njk1X0dQSU9fMTUgOyBpKyspIHsKLQkJc2VxX3ByaW50ZihzLCAiJWk6XHQiLCBpKTsKLQotCQlzZXFfcHJpbnRmKHMsICIlc1x0IiwgKG1vZGUgJiBJT1BNKGkpKSA/ICJPdXRwdXQiIDogIklucHV0Iik7Ci0KLQkJaWYgKGkgPD0gS1M4Njk1X0dQSU9fMykgewotCQkJaWYgKGN0cmwgJiBlbmFibGVbaV0pIHsKLQkJCQlzZXFfcHJpbnRmKHMsICJFWFQlaSAiLCBpKTsKLQotCQkJCXN3aXRjaCAoKGN0cmwgJiBpbnRtYXNrW2ldKSA+PiAoNCAqIGkpKSB7Ci0JCQkJCWNhc2UgSU9QQ19UTV9MT1c6Ci0JCQkJCQlzZXFfcHJpbnRmKHMsICIoTG93KSIpOwkJYnJlYWs7Ci0JCQkJCWNhc2UgSU9QQ19UTV9ISUdIOgotCQkJCQkJc2VxX3ByaW50ZihzLCAiKEhpZ2gpIik7CWJyZWFrOwotCQkJCQljYXNlIElPUENfVE1fUklTSU5HOgotCQkJCQkJc2VxX3ByaW50ZihzLCAiKFJpc2luZykiKTsJYnJlYWs7Ci0JCQkJCWNhc2UgSU9QQ19UTV9GQUxMSU5HOgotCQkJCQkJc2VxX3ByaW50ZihzLCAiKEZhbGxpbmcpIik7CWJyZWFrOwotCQkJCQljYXNlIElPUENfVE1fRURHRToKLQkJCQkJCXNlcV9wcmludGYocywgIihFZGdlcykiKTsJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCXNlcV9wcmludGYocywgIkdQSU9cdCIpOwotCQl9Ci0JCWVsc2UgaWYgKGkgPD0gS1M4Njk1X0dQSU9fNSkgewotCQkJaWYgKGN0cmwgJiBlbmFibGVbaV0pCi0JCQkJc2VxX3ByaW50ZihzLCAiVE9VVCVpXHQiLCBpIC0gS1M4Njk1X0dQSU9fNCk7Ci0JCQllbHNlCi0JCQkJc2VxX3ByaW50ZihzLCAiR1BJT1x0Iik7Ci0JCX0KLQkJZWxzZQotCQkJc2VxX3ByaW50ZihzLCAiR1BJT1x0Iik7Ci0KLQkJc2VxX3ByaW50ZihzLCAiXHQiKTsKLQotCQlzZXFfcHJpbnRmKHMsICIlaVxuIiwgKGRhdGEgJiBJT1BEKGkpKSA/IDEgOiAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQga3M4Njk1X2dwaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwga3M4Njk1X2dwaW9fc2hvdywgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtzODY5NV9ncGlvX29wZXJhdGlvbnMgPSB7Ci0JLm9wZW4JCT0ga3M4Njk1X2dwaW9fb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQga3M4Njk1X2dwaW9fZGVidWdmc19pbml0KHZvaWQpCi17Ci0JLyogL3N5cy9rZXJuZWwvZGVidWcva3M4Njk1X2dwaW8gKi8KLQkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgia3M4Njk1X2dwaW8iLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgTlVMTCwgJmtzODY5NV9ncGlvX29wZXJhdGlvbnMpOwotCXJldHVybiAwOwotfQotcG9zdGNvcmVfaW5pdGNhbGwoa3M4Njk1X2dwaW9fZGVidWdmc19pbml0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGJmNTE2YWQuLmE3OWU0ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy11YXJ0Lmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPUtTODY5NV9VQVJUX1BBCQlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcwogCQlsZHIJXHJ2LCA9S1M4Njk1X1VBUlRfVkEJCUAgdmlydHVhbCBiYXNlIGFkZHJlc3MKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8ta3M4Njk1LmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZ3Bpby1rczg2OTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIwMzRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8ta3M4Njk1LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRyZXcgVmljdG9yCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTUFDSF9LUzg2NTlfR1BJT19ICisjZGVmaW5lIF9fTUFDSF9LUzg2NTlfR1BJT19ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2RlZmluZSBLUzg2OTVfR1BJT18wCQkwCisjZGVmaW5lIEtTODY5NV9HUElPXzEJCTEKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMgkJMgorI2RlZmluZSBLUzg2OTVfR1BJT18zCQkzCisjZGVmaW5lIEtTODY5NV9HUElPXzQJCTQKKyNkZWZpbmUgS1M4Njk1X0dQSU9fNQkJNQorI2RlZmluZSBLUzg2OTVfR1BJT182CQk2CisjZGVmaW5lIEtTODY5NV9HUElPXzcJCTcKKyNkZWZpbmUgS1M4Njk1X0dQSU9fOAkJOAorI2RlZmluZSBLUzg2OTVfR1BJT185CQk5CisjZGVmaW5lIEtTODY5NV9HUElPXzEwCQkxMAorI2RlZmluZSBLUzg2OTVfR1BJT18xMQkJMTEKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMTIJCTEyCisjZGVmaW5lIEtTODY5NV9HUElPXzEzCQkxMworI2RlZmluZSBLUzg2OTVfR1BJT18xNAkJMTQKKyNkZWZpbmUgS1M4Njk1X0dQSU9fMTUJCTE1CisKKy8qCisgKiBDb25maWd1cmUgR1BJTyBwaW4gYXMgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZS4KKyAqLworZXh0ZXJuIGludCBrczg2OTVfZ3Bpb19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHR5cGUpOworCisvKiBSZWdpc3RlciB0aGUgR1BJT3MgKi8KK2V4dGVybiB2b2lkIGtzODY5NV9yZWdpc3Rlcl9ncGlvcyh2b2lkKTsKKworI2VuZGlmIC8qIF9fTUFDSF9LUzg2NTlfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA4NjMxMmQ0Li5mNWZkYTM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTExLDQ3ICsxMSw5IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19IXwogI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSF8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jZGVmaW5lIEtTODY5NV9HUElPXzAJCTAKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMQkJMQotI2RlZmluZSBLUzg2OTVfR1BJT18yCQkyCi0jZGVmaW5lIEtTODY5NV9HUElPXzMJCTMKLSNkZWZpbmUgS1M4Njk1X0dQSU9fNAkJNAotI2RlZmluZSBLUzg2OTVfR1BJT181CQk1Ci0jZGVmaW5lIEtTODY5NV9HUElPXzYJCTYKLSNkZWZpbmUgS1M4Njk1X0dQSU9fNwkJNwotI2RlZmluZSBLUzg2OTVfR1BJT184CQk4Ci0jZGVmaW5lIEtTODY5NV9HUElPXzkJCTkKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMTAJCTEwCi0jZGVmaW5lIEtTODY5NV9HUElPXzExCQkxMQotI2RlZmluZSBLUzg2OTVfR1BJT18xMgkJMTIKLSNkZWZpbmUgS1M4Njk1X0dQSU9fMTMJCTEzCi0jZGVmaW5lIEtTODY5NV9HUElPXzE0CQkxNAotI2RlZmluZSBLUzg2OTVfR1BJT18xNQkJMTUKLQotLyoKLSAqIENvbmZpZ3VyZSBHUElPIHBpbiBhcyBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlLgotICovCi1leHRlcm4gaW50IGtzODY5NV9ncGlvX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdHlwZSk7Ci0KIC8qCiAgKiBNYXAgSVJRIG51bWJlciB0byBHUElPIGxpbmUuCiAgKi8KIGV4dGVybiBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSk7CiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLS8qIElmIGl0IHR1cm5zIG91dCB0aGF0IHdlIG5lZWQgdG8gb3B0aW1pc2UgR1BJTyBhY2Nlc3MgZm9yIHRoZQotICogTWljcmVsJ3MgR1BJT3MsIHRoZW4gdGhlc2UgY2FuIGJlIGNoYW5nZWQgdG8gY2hlY2sgdGhlaXIgYXJndW1lbnQKLSAqIGRpcmVjdGx5IGFzIHN0YXRpYyBpbmxpbmVzLiBIb3dldmVyIGZvciBub3cgaXQncyBwcm9iYWJseSBub3QKLSAqIHdvcnRod2hpbGUuCi0gKi8KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUgX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZSBfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fdG9faXJxIF9fZ3Bpb190b19pcnEKLQotLyogUmVnaXN0ZXIgdGhlIEdQSU9zICovCi1leHRlcm4gdm9pZCBrczg2OTVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvbGVkcy5jCmluZGV4IDE4NGVmNzQuLmQ2ZjY1MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2xlZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9sZWRzLmMKQEAgLTcsMTQgKzcsMTQgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrczg2OTVfbGVkX29uKHVuc2lnbmVkIGludCBsZWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiMGEyZGI3Li4wYjRlNzYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWw3MjAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDcgKzE0LDcgQEAKIAkJLmVxdQlpb192aXJ0LCBJT19CQVNFCiAJCS5lcXUJaW9fcGh5cywgSU9fU1RBUlQKIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMDQ0MDAwCUAgVUFSVDEKIEAJCW1vdglccnAsICMweDAwMDQ1MDAwCUAgVUFSVDIKIAkJYWRkCVxydiwgXHJwLCAjaW9fdmlydAlAIHZpcnR1YWwgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L01ha2VmaWxlCmluZGV4IGE1ZmM1ZDAuLmY1ZGI4MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvTWFrZWZpbGUKQEAgLTMsNiArMyw2IEBACiAjCiAKIG9iai15CTo9IHRpbWVyLm8gaXJxLm8gY29tbW9uLm8gc2VyaWFsLm8gY2xvY2subwotb2JqLXkJKz0gZ3Bpb2xpYi5vIHBtLm8gc3VzcGVuZC5vCitvYmoteQkrPSBwbS5vIHN1c3BlbmQubwogb2JqLXkJKz0gcGh5MzI1MC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9ncGlvbGliLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvZ3Bpb2xpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA2MWVhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9ncGlvbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9ncGlvbGliLmMKLSAqCi0gKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KLSNpbmNsdWRlICJjb21tb24uaCIKLQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfSU5QX1NUQVRFCQlfR1BSRUcoMHgwMDApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19PVVRQX1NFVAkJX0dQUkVHKDB4MDA0KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9DTFIJCV9HUFJFRygweDAwOCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX09VVFBfU1RBVEUJCV9HUFJFRygweDAwQykKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQJCQlfR1BSRUcoMHgwMTApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9ESVJfQ0xSCQkJX0dQUkVHKDB4MDE0KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfRElSX1NUQVRFCQlfR1BSRUcoMHgwMTgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9JTlBfU1RBVEUJCV9HUFJFRygweDAxQykKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX09VVFBfU0VUCQlfR1BSRUcoMHgwMjApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9PVVRQX0NMUgkJX0dQUkVHKDB4MDI0KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTVVYX1NFVAkJCV9HUFJFRygweDAyOCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01VWF9DTFIJCQlfR1BSRUcoMHgwMkMpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NVVhfU1RBVEUJCV9HUFJFRygweDAzMCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0lOUF9TVEFURQkJX0dQUkVHKDB4MDQwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TRVQJCV9HUFJFRygweDA0NCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX09VVFBfQ0xSCQlfR1BSRUcoMHgwNDgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9PVVRQX1NUQVRFCQlfR1BSRUcoMHgwNEMpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9ESVJfU0VUCQkJX0dQUkVHKDB4MDUwKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfRElSX0NMUgkJCV9HUFJFRygweDA1NCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0RJUl9TVEFURQkJX0dQUkVHKDB4MDU4KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfSU5QX1NUQVRFCQlfR1BSRUcoMHgwNjApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9PVVRQX1NFVAkJX0dQUkVHKDB4MDY0KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9DTFIJCV9HUFJFRygweDA2OCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX09VVFBfU1RBVEUJCV9HUFJFRygweDA2QykKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0RJUl9TRVQJCQlfR1BSRUcoMHgwNzApCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9ESVJfQ0xSCQkJX0dQUkVHKDB4MDc0KQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfRElSX1NUQVRFCQlfR1BSRUcoMHgwNzgpCi0KLSNkZWZpbmUgR1BJTzAxMl9QSU5fVE9fQklUKHgpCQkJKDEgPDwgKHgpKQotI2RlZmluZSBHUElPM19QSU5fVE9fQklUKHgpCQkJKDEgPDwgKCh4KSArIDI1KSkKLSNkZWZpbmUgR1BPM19QSU5fVE9fQklUKHgpCQkJKDEgPDwgKHgpKQotI2RlZmluZSBHUElPMDEyX1BJTl9JTl9TRUwoeCwgeSkJCSgoKHgpID4+ICh5KSkgJiAxKQotI2RlZmluZSBHUElPM19QSU5fSU5fU0hJRlQoeCkJCQkoKHgpID09IDUgPyAyNCA6IDEwICsgKHgpKQotI2RlZmluZSBHUElPM19QSU5fSU5fU0VMKHgsIHkpCQkJKCh4KSA+PiBHUElPM19QSU5fSU5fU0hJRlQoeSkpCi0jZGVmaW5lIEdQSU8zX1BJTjVfSU5fU0VMKHgpCQkJKCgoeCkgPj4gMjQpICYgMSkKLSNkZWZpbmUgR1BJM19QSU5fSU5fU0VMKHgsIHkpCQkJKCgoeCkgPj4gKHkpKSAmIDEpCi0KLXN0cnVjdCBncGlvX3JlZ3MgewotCXZvaWQgX19pb21lbSAqaW5wX3N0YXRlOwotCXZvaWQgX19pb21lbSAqb3V0cF9zZXQ7Ci0Jdm9pZCBfX2lvbWVtICpvdXRwX2NscjsKLQl2b2lkIF9faW9tZW0gKmRpcl9zZXQ7Ci0Jdm9pZCBfX2lvbWVtICpkaXJfY2xyOwotfTsKLQotLyoKLSAqIEdQSU8gbmFtZXMKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDBfbmFtZXNbTFBDMzJYWF9HUElPX1AwX01BWF0gPSB7Ci0JInAwLjAiLCAicDAuMSIsICJwMC4yIiwgInAwLjMiLAotCSJwMC40IiwgInAwLjUiLCAicDAuNiIsICJwMC43IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDFfbmFtZXNbTFBDMzJYWF9HUElPX1AxX01BWF0gPSB7Ci0JInAxLjAiLCAicDEuMSIsICJwMS4yIiwgInAxLjMiLAotCSJwMS40IiwgInAxLjUiLCAicDEuNiIsICJwMS43IiwKLQkicDEuOCIsICJwMS45IiwgInAxLjEwIiwgInAxLjExIiwKLQkicDEuMTIiLCAicDEuMTMiLCAicDEuMTQiLCAicDEuMTUiLAotCSJwMS4xNiIsICJwMS4xNyIsICJwMS4xOCIsICJwMS4xOSIsCi0JInAxLjIwIiwgInAxLjIxIiwgInAxLjIyIiwgInAxLjIzIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpncGlvX3AyX25hbWVzW0xQQzMyWFhfR1BJT19QMl9NQVhdID0gewotCSJwMi4wIiwgInAyLjEiLCAicDIuMiIsICJwMi4zIiwKLQkicDIuNCIsICJwMi41IiwgInAyLjYiLCAicDIuNyIsCi0JInAyLjgiLCAicDIuOSIsICJwMi4xMCIsICJwMi4xMSIsCi0JInAyLjEyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDNfbmFtZXNbTFBDMzJYWF9HUElPX1AzX01BWF0gPSB7Ci0JImdwaTAwMCIsICJncGlvMDEiLCAiZ3BpbzAyIiwgImdwaW8wMyIsCi0JImdwaW8wNCIsICJncGlvMDUiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZ3BpX3AzX25hbWVzW0xQQzMyWFhfR1BJX1AzX01BWF0gPSB7Ci0JImdwaTAwIiwgImdwaTAxIiwgImdwaTAyIiwgImdwaTAzIiwKLQkiZ3BpMDQiLCAiZ3BpMDUiLCAiZ3BpMDYiLCAiZ3BpMDciLAotCSJncGkwOCIsICJncGkwOSIsICBOVUxMLCAgICBOVUxMLAotCSBOVUxMLCAgICBOVUxMLCAgICBOVUxMLCAgICJncGkxNSIsCi0JImdwaTE2IiwgImdwaTE3IiwgImdwaTE4IiwgImdwaTE5IiwKLQkiZ3BpMjAiLCAiZ3BpMjEiLCAiZ3BpMjIiLCAiZ3BpMjMiLAotCSJncGkyNCIsICJncGkyNSIsICJncGkyNiIsICJncGkyNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpncG9fcDNfbmFtZXNbTFBDMzJYWF9HUE9fUDNfTUFYXSA9IHsKLQkiZ3BvMDAiLCAiZ3BvMDEiLCAiZ3BvMDIiLCAiZ3BvMDMiLAotCSJncG8wNCIsICJncG8wNSIsICJncG8wNiIsICJncG8wNyIsCi0JImdwbzA4IiwgImdwbzA5IiwgImdwbzEwIiwgImdwbzExIiwKLQkiZ3BvMTIiLCAiZ3BvMTMiLCAiZ3BvMTQiLCAiZ3BvMTUiLAotCSJncG8xNiIsICJncG8xNyIsICJncG8xOCIsICJncG8xOSIsCi0JImdwbzIwIiwgImdwbzIxIiwgImdwbzIyIiwgImdwbzIzIgotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMCA9IHsKLQkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AwX0lOUF9TVEFURSwKLQkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9TRVQsCi0JLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AwX09VVFBfQ0xSLAotCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AwX0RJUl9TRVQsCi0JLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDBfRElSX0NMUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDEgPSB7Ci0JLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QMV9JTlBfU1RBVEUsCi0JLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AxX09VVFBfU0VULAotCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QMV9PVVRQX0NMUiwKLQkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMV9ESVJfU0VULAotCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AxX0RJUl9DTFIsCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AyID0gewotCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDJfSU5QX1NUQVRFLAotCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QMl9PVVRQX1NFVCwKLQkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9DTFIsCi0JLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDJfRElSX1NFVCwKLQkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMl9ESVJfQ0xSLAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMyA9IHsKLQkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AzX0lOUF9TVEFURSwKLQkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9TRVQsCi0JLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AzX09VVFBfQ0xSLAotCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AyX0RJUl9TRVQsCi0JLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDJfRElSX0NMUiwKLX07Ci0KLXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCB7Ci0Jc3RydWN0IGdwaW9fY2hpcAljaGlwOwotCXN0cnVjdCBncGlvX3JlZ3MJKmdwaW9fZ3JwOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKnRvX2xwYzMyeHhfZ3BpbygKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpncGMpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihncGMsIHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCwgY2hpcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fc2V0X2dwaW9fZGlyX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKLQl1bnNpZ25lZCBwaW4sIGludCBpbnB1dCkKLXsKLQlpZiAoaW5wdXQpCi0JCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKLQkJCWdyb3VwLT5ncGlvX2dycC0+ZGlyX2Nscik7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCi0JCQlncm91cC0+Z3Bpb19ncnAtPmRpcl9zZXQpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NldF9ncGlvX2Rpcl9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbiwgaW50IGlucHV0KQotewotCXUzMiB1ID0gR1BJTzNfUElOX1RPX0JJVChwaW4pOwotCi0JaWYgKGlucHV0KQotCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfY2xyKTsKLQllbHNlCi0JCV9fcmF3X3dyaXRlbCh1LCBncm91cC0+Z3Bpb19ncnAtPmRpcl9zZXQpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NldF9ncGlvX2xldmVsX3AwMTIoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKLQl1bnNpZ25lZCBwaW4sIGludCBoaWdoKQotewotCWlmIChoaWdoKQotCQlfX3Jhd193cml0ZWwoR1BJTzAxMl9QSU5fVE9fQklUKHBpbiksCi0JCQlncm91cC0+Z3Bpb19ncnAtPm91dHBfc2V0KTsKLQllbHNlCi0JCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKLQkJCWdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NldF9ncGlvX2xldmVsX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCi0JdW5zaWduZWQgcGluLCBpbnQgaGlnaCkKLXsKLQl1MzIgdSA9IEdQSU8zX1BJTl9UT19CSVQocGluKTsKLQotCWlmIChoaWdoKQotCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwodSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX2Nscik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fc2V0X2dwb19sZXZlbF9wMyhzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbiwgaW50IGhpZ2gpCi17Ci0JaWYgKGhpZ2gpCi0JCV9fcmF3X3dyaXRlbChHUE8zX1BJTl9UT19CSVQocGluKSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX3NldCk7Ci0JZWxzZQotCQlfX3Jhd193cml0ZWwoR1BPM19QSU5fVE9fQklUKHBpbiksIGdyb3VwLT5ncGlvX2dycC0+b3V0cF9jbHIpOwotfQotCi1zdGF0aWMgaW50IF9fZ2V0X2dwaW9fc3RhdGVfcDAxMihzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlyZXR1cm4gR1BJTzAxMl9QSU5fSU5fU0VMKF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKSwKLQkJcGluKTsKLX0KLQotc3RhdGljIGludCBfX2dldF9ncGlvX3N0YXRlX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCi0JdW5zaWduZWQgcGluKQotewotCWludCBzdGF0ZSA9IF9fcmF3X3JlYWRsKGdyb3VwLT5ncGlvX2dycC0+aW5wX3N0YXRlKTsKLQotCS8qCi0JICogUDMgR1BJTyBwaW4gaW5wdXQgbWFwcGluZyBpcyBub3QgY29udGlndW91cywgR1BJT1AzLTAuLjQgaXMgbWFwcGVkCi0JICogdG8gYml0cyAxMC4uMTQsIHdoaWxlIEdQSU9QMy01IGlzIG1hcHBlZCB0byBiaXQgMjQuCi0JICovCi0JcmV0dXJuIEdQSU8zX1BJTl9JTl9TRUwoc3RhdGUsIHBpbik7Ci19Ci0KLXN0YXRpYyBpbnQgX19nZXRfZ3BpX3N0YXRlX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCi0JdW5zaWduZWQgcGluKQotewotCXJldHVybiBHUEkzX1BJTl9JTl9TRUwoX19yYXdfcmVhZGwoZ3JvdXAtPmdwaW9fZ3JwLT5pbnBfc3RhdGUpLCBwaW4pOwotfQotCi0vKgotICogR0VORVJJQ19HUElPIHByaW1pdGl2ZXMuCi0gKi8KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JdW5zaWduZWQgcGluKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlfX3NldF9ncGlvX2Rpcl9wMDEyKGdyb3VwLCBwaW4sIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JX19zZXRfZ3Bpb19kaXJfcDMoZ3JvdXAsIHBpbiwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX2luX2Fsd2F5cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCXVuc2lnbmVkIHBpbikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlyZXR1cm4gX19nZXRfZ3Bpb19zdGF0ZV9wMDEyKGdyb3VwLCBwaW4pOwotfQotCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlyZXR1cm4gX19nZXRfZ3Bpb19zdGF0ZV9wMyhncm91cCwgcGluKTsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaV9nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlyZXR1cm4gX19nZXRfZ3BpX3N0YXRlX3AzKGdyb3VwLCBwaW4pOwotfQotCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAotCWludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JX19zZXRfZ3Bpb19kaXJfcDAxMihncm91cCwgcGluLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKLQlpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKLQotCV9fc2V0X2dwaW9fZGlyX3AzKGdyb3VwLCBwaW4sIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9vdXRfYWx3YXlzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKLQlpbnQgdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCi0JaW50IHZhbHVlKQotewotCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7Ci0KLQlfX3NldF9ncGlvX2xldmVsX3AwMTIoZ3JvdXAsIHBpbiwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKLQlpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKLQotCV9fc2V0X2dwaW9fbGV2ZWxfcDMoZ3JvdXAsIHBpbiwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBscGMzMnh4X2dwb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAotCWludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOwotCi0JX19zZXRfZ3BvX2xldmVsX3AzKGdyb3VwLCBwaW4sIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBscGMzMnh4X2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCi17Ci0JaWYgKHBpbiA8IGNoaXAtPm5ncGlvKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwIGxwYzMyeHhfZ3Bpb2NoaXBbXSA9IHsKLQl7Ci0JCS5jaGlwID0gewotCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMCIsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAotCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAotCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAotCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCi0JCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AwX0dSUCwKLQkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AwX01BWCwKLQkJCS5uYW1lcwkJCT0gZ3Bpb19wMF9uYW1lcywKLQkJCS5jYW5fc2xlZXAJCT0gMCwKLQkJfSwKLQkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDAsCi0JfSwKLQl7Ci0JCS5jaGlwID0gewotCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMSIsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAotCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAotCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAotCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCi0JCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AxX0dSUCwKLQkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AxX01BWCwKLQkJCS5uYW1lcwkJCT0gZ3Bpb19wMV9uYW1lcywKLQkJCS5jYW5fc2xlZXAJCT0gMCwKLQkJfSwKLQkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDEsCi0JfSwKLQl7Ci0JCS5jaGlwID0gewotCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMiIsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMDEyLAotCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMDEyLAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dHB1dF9wMDEyLAotCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyLAotCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCi0JCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AyX0dSUCwKLQkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AyX01BWCwKLQkJCS5uYW1lcwkJCT0gZ3Bpb19wMl9uYW1lcywKLQkJCS5jYW5fc2xlZXAJCT0gMCwKLQkJfSwKLQkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDIsCi0JfSwKLQl7Ci0JCS5jaGlwID0gewotCQkJLmxhYmVsCQkJPSAiZ3Bpb19wMyIsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbnB1dF9wMywKLQkJCS5nZXQJCQk9IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDMsCi0JCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AzLAotCQkJLnNldAkJCT0gbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMywKLQkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAotCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJT19QM19HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJT19QM19NQVgsCi0JCQkubmFtZXMJCQk9IGdwaW9fcDNfbmFtZXMsCi0JCQkuY2FuX3NsZWVwCQk9IDAsCi0JCX0sCi0JCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AzLAotCX0sCi0JewotCQkuY2hpcCA9IHsKLQkJCS5sYWJlbAkJCT0gImdwaV9wMyIsCi0JCQkuZGlyZWN0aW9uX2lucHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9pbl9hbHdheXMsCi0JCQkuZ2V0CQkJPSBscGMzMnh4X2dwaV9nZXRfdmFsdWUsCi0JCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKLQkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSV9QM19HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BJX1AzX01BWCwKLQkJCS5uYW1lcwkJCT0gZ3BpX3AzX25hbWVzLAotCQkJLmNhbl9zbGVlcAkJPSAwLAotCQl9LAotCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKLQl9LAotCXsKLQkJLmNoaXAgPSB7Ci0JCQkubGFiZWwJCQk9ICJncG9fcDMiLAotCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBscGMzMnh4X2dwaW9fZGlyX291dF9hbHdheXMsCi0JCQkuc2V0CQkJPSBscGMzMnh4X2dwb19zZXRfdmFsdWUsCi0JCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKLQkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQT19QM19HUlAsCi0JCQkubmdwaW8JCQk9IExQQzMyWFhfR1BPX1AzX01BWCwKLQkJCS5uYW1lcwkJCT0gZ3BvX3AzX25hbWVzLAotCQkJLmNhbl9zbGVlcAkJPSAwLAotCQl9LAotCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMywKLQl9LAotfTsKLQotdm9pZCBfX2luaXQgbHBjMzJ4eF9ncGlvX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxwYzMyeHhfZ3Bpb2NoaXApOyBpKyspCi0JCWdwaW9jaGlwX2FkZCgmbHBjMzJ4eF9ncGlvY2hpcFtpXS5jaGlwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA2MjllNzQ0Li4zNTFiZDZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMCw3ICsyMCw3IEBACiAgKiBEZWJ1ZyBvdXRwdXQgaXMgaGFyZGNvZGVkIHRvIHN0YW5kYXJkIFVBUlQgNQogKi8KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcmVxCVxycCwgPTB4NDAwOTAwMDAKIAlsZHJuZQlccnYsID0weEY0MDkwMDAwCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby1scGMzMnh4LmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8tbHBjMzJ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8tbHBjMzJ4eC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX01BQ0hfR1BJT19MUEMzMlhYX0gKKyNkZWZpbmUgX19NQUNIX0dQSU9fTFBDMzJYWF9ICisKKy8qCisgKiBOb3RlIQorICogTXV4ZWQgR1AgcGlucyBuZWVkIHRvIGJlIHNldHVwIHRvIHRoZSBHUCBzdGF0ZSBpbiB0aGUgYm9hcmQgbGV2ZWwKKyAqIGNvZGUgcHJpb3IgdG8gdXNpbmcgdGhpcyBkcml2ZXIuCisgKiBHUEkgcGlucyA6IDI4eFAzIGdyb3VwCisgKiBHUE8gcGlucyA6IDI0eFAzIGdyb3VwCisgKiBHUElPIHBpbnM6IDh4UDAgZ3JvdXAsIDI0eFAxIGdyb3VwLCAxM3hQMiBncm91cCwgNnhQMyBncm91cAorICovCisKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX01BWCA4CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9NQVggMjQKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01BWCAxMworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfTUFYIDYKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfTUFYIDI4CisjZGVmaW5lIExQQzMyWFhfR1BPX1AzX01BWCAyNAorCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9HUlAgMAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfR1JQIChMUEMzMlhYX0dQSU9fUDBfR1JQICsgTFBDMzJYWF9HUElPX1AwX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0dSUCAoTFBDMzJYWF9HUElPX1AxX0dSUCArIExQQzMyWFhfR1BJT19QMV9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19HUlAgKExQQzMyWFhfR1BJT19QMl9HUlAgKyBMUEMzMlhYX0dQSU9fUDJfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSV9QM19HUlAgKExQQzMyWFhfR1BJT19QM19HUlAgKyBMUEMzMlhYX0dQSU9fUDNfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQT19QM19HUlAgKExQQzMyWFhfR1BJX1AzX0dSUCArIExQQzMyWFhfR1BJX1AzX01BWCkKKworLyoKKyAqIEEgc3BlY2lmaWMgR1BJTyBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGlzIG1hY3JvCisgKiBpZSwgR1BJT18wNSBjYW4gYmUgc2VsZWN0ZWQgd2l0aCBMUEMzMlhYX0dQSU8oTFBDMzJYWF9HUElPX1AzX0dSUCwgNSkKKyAqIFNlZSB0aGUgTFBDMzJ4MCBVc2VyJ3MgZ3VpZGUgZm9yIEdQSU8gZ3JvdXAgbnVtYmVycworICovCisjZGVmaW5lIExQQzMyWFhfR1BJTyh4LCB5KSAoKHgpICsgKHkpKQorCisjZW5kaWYgLyogX19NQUNIX0dQSU9fTFBDMzJYWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDY3ZDAzZGEuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDc0ICsxIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAotI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0vKgotICogTm90ZSEKLSAqIE11eGVkIEdQIHBpbnMgbmVlZCB0byBiZSBzZXR1cCB0byB0aGUgR1Agc3RhdGUgaW4gdGhlIGJvYXJkIGxldmVsCi0gKiBjb2RlIHByaW9yIHRvIHVzaW5nIHRoaXMgZHJpdmVyLgotICogR1BJIHBpbnMgOiAyOHhQMyBncm91cAotICogR1BPIHBpbnMgOiAyNHhQMyBncm91cAotICogR1BJTyBwaW5zOiA4eFAwIGdyb3VwLCAyNHhQMSBncm91cCwgMTN4UDIgZ3JvdXAsIDZ4UDMgZ3JvdXAKLSAqLwotCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NQVggOAotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTUFYIDI0Ci0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NQVggMTMKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01BWCA2Ci0jZGVmaW5lIExQQzMyWFhfR1BJX1AzX01BWCAyOAotI2RlZmluZSBMUEMzMlhYX0dQT19QM19NQVggMjQKLQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfR1JQIDAKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0dSUCAoTFBDMzJYWF9HUElPX1AwX0dSUCArIExQQzMyWFhfR1BJT19QMF9NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMl9HUlAgKExQQzMyWFhfR1BJT19QMV9HUlAgKyBMUEMzMlhYX0dQSU9fUDFfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfR1JQIChMUEMzMlhYX0dQSU9fUDJfR1JQICsgTFBDMzJYWF9HUElPX1AyX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUElfUDNfR1JQIChMUEMzMlhYX0dQSU9fUDNfR1JQICsgTFBDMzJYWF9HUElPX1AzX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfR1JQIChMUEMzMlhYX0dQSV9QM19HUlAgKyBMUEMzMlhYX0dQSV9QM19NQVgpCi0KLS8qCi0gKiBBIHNwZWNpZmljIEdQSU8gY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhpcyBtYWNybwotICogaWUsIEdQSU9fMDUgY2FuIGJlIHNlbGVjdGVkIHdpdGggTFBDMzJYWF9HUElPKExQQzMyWFhfR1BJT19QM19HUlAsIDUpCi0gKiBTZWUgdGhlIExQQzMyeDAgVXNlcidzIGd1aWRlIGZvciBHUElPIGdyb3VwIG51bWJlcnMKLSAqLwotI2RlZmluZSBMUEMzMlhYX0dQSU8oeCwgeSkgKCh4KSArICh5KSkKLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQlfX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7Ci19Ci0KLSNlbmRpZgorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ3ZGQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1scGMzMnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQgb2YgYmFuayAwCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDgwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9waHkzMjUwLmMgYi9hcmNoL2FybS9tYWNoLWxwYzMyeHgvcGh5MzI1MC5jCmluZGV4IDc5OTNiMDkuLjZkMmYwZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9waHkzMjUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BoeTMyNTAuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tbHBjMzJ4eC5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCiAvKgpAQCAtMzgyLDcgKzM4Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUEhZMzI1MCwgIlBoeXRlYyAzMjUwIGJvYXJkIHdpdGggdGhlIExQQzMyNTAgTWljcm9jb250cm9sbGVyIikKIAkvKiBNYWludGFpbmVyOiBLZXZpbiBXZWxscywgTlhQIFNlbWljb25kdWN0b3JzICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGxwYzMyeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IGxwYzMyeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZscGMzMnh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbW1wL0tjb25maWcKaW5kZXggNTZlZjVmNi4uMzIzZDRjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW1tcC9LY29uZmlnCkBAIC03Nyw3ICs3Nyw3IEBACiAJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCB0aGUgTWFydmVsbCBQWEExNjgtYmFzZWQKIAkgIFRldG9uIEJHQSBEZXZlbG9wbWVudCBCb2FyZC4KIAotY29uZmlnIE1BQ0hfU0hFRVZBRAorY29uZmlnIE1BQ0hfR1BMVUdECiAJYm9vbCAiTWFydmVsbCdzIFBYQTE2OCBHdXJ1UGx1ZyBEaXNwbGF5IChncGx1Z0QpIEJvYXJkIgogCXNlbGVjdCBDUFVfUFhBMTY4CiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1tcC9NYWtlZmlsZQppbmRleCBiMGFjOTQyLi5iYTI1NGE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW1tcC9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKICMgU29DIHN1cHBvcnQKIG9iai0kKENPTkZJR19DUFVfUFhBMTY4KQkrPSBweGExNjgubyBpcnEtcHhhMTY4Lm8KIG9iai0kKENPTkZJR19DUFVfUFhBOTEwKQkrPSBweGE5MTAubyBpcnEtcHhhMTY4Lm8KLW9iai0kKENPTkZJR19DUFVfTU1QMikJCSs9IG1tcDIubyBpcnEtbW1wMi5vCitvYmotJChDT05GSUdfQ1BVX01NUDIpCQkrPSBtbXAyLm8gaXJxLW1tcDIubyBzcmFtLm8KIAogIyBib2FyZCBzdXBwb3J0CiBvYmotJChDT05GSUdfTUFDSF9BU1BFTklURSkJKz0gYXNwZW5pdGUubwpAQCAtMTksNCArMTksNCBAQAogb2JqLSQoQ09ORklHX01BQ0hfRkxJTlQpCSs9IGZsaW50Lm8KIG9iai0kKENPTkZJR19NQUNIX01BUlZFTExfSkFTUEVSKSArPSBqYXNwZXIubwogb2JqLSQoQ09ORklHX01BQ0hfVEVUT05fQkdBKQkrPSB0ZXRvbl9iZ2Eubwotb2JqLSQoQ09ORklHX01BQ0hfU0hFRVZBRCkJKz0gZ3BsdWdkLm8KK29iai0kKENPTkZJR19NQUNIX0dQTFVHRCkJKz0gZ3BsdWdkLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2FzcGVuaXRlLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9hc3Blbml0ZS5jCmluZGV4IDQ5YzVkNmQuLjdhNjBiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2FzcGVuaXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvYXNwZW5pdGUuYwpAQCAtOCw3ICs4LDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE3LDEzICsxNywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxtYWNoL2FkZHItbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAtcHhhMTY4Lmg+CiAjaW5jbHVkZSA8bWFjaC9weGExNjguaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDx2aWRlby9weGExNjhmYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8cGxhdC9weGEyN3hfa2V5cGFkLmg+CkBAIC0xNjcsOCArMTY3LDkgQEAKIAogc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIGFzcGVuaXRlX25hbmRfaW5mbyA9IHsKIAkuZW5hYmxlX2FyYml0ZXIJPSAxLAotCS5wYXJ0cwkJPSBhc3Blbml0ZV9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShhc3Blbml0ZV9uYW5kX3BhcnRpdGlvbnMpLAorCS5udW1fY3MgPSAxLAorCS5wYXJ0c1swXQk9IGFzcGVuaXRlX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydHNbMF0JPSBBUlJBWV9TSVpFKGFzcGVuaXRlX25hbmRfcGFydGl0aW9ucyksCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGFzcGVuaXRlX2kyY19pbmZvW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2Jyb3duc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtbW1wL2Jyb3duc3RvbmUuYwppbmRleCBjNzkxNjJhLi45ODNjZmIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9icm93bnN0b25lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvYnJvd25zdG9uZS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWF4ODY0OS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgpAQCAtMTg2LDYgKzE4NSwxNSBAQAogCQl8IFBYQV9GTEFHX1NEXzhfQklUX0NBUEFCTEVfU0xPVCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc3JhbV9wbGF0ZGF0YSBtbXAyX2FzcmFtX3BsYXRkYXRhID0geworCS5wb29sX25hbWUJPSAiYXNyYW0iLAorCS5ncmFudWxhcml0eQk9IFNSQU1fR1JBTlVMQVJJVFksCit9OworCitzdGF0aWMgc3RydWN0IHNyYW1fcGxhdGRhdGEgbW1wMl9pc3JhbV9wbGF0ZGF0YSA9IHsKKwkucG9vbF9uYW1lCT0gImlzcmFtIiwKKwkuZ3JhbnVsYXJpdHkJPSBTUkFNX0dSQU5VTEFSSVRZLAorfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGJyb3duc3RvbmVfaW5pdCh2b2lkKQogewpAQCAtMTk3LDYgKzIwNSw4IEBACiAJbW1wMl9hZGRfdHdzaSgxLCBOVUxMLCBBUlJBWV9BTkRfU0laRShicm93bnN0b25lX3R3c2kxX2luZm8pKTsKIAltbXAyX2FkZF9zZGhvc3QoMCwgJm1tcDJfc2RoX3BsYXRkYXRhX21tYzApOyAvKiBTRC9NTUMgKi8KIAltbXAyX2FkZF9zZGhvc3QoMiwgJm1tcDJfc2RoX3BsYXRkYXRhX21tYzIpOyAvKiBlTU1DICovCisJbW1wMl9hZGRfYXNyYW0oJm1tcDJfYXNyYW1fcGxhdGRhdGEpOworCW1tcDJfYWRkX2lzcmFtKCZtbXAyX2lzcmFtX3BsYXRkYXRhKTsKIAogCS8qIGVuYWJsZSA1diByZWd1bGF0b3IgKi8KIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmJyb3duc3RvbmVfdl81dnBfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLW1tcC9jbG9jay5oCmluZGV4IDMxNDNlOTkuLjE0OWIzMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvY2xvY2suaApAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIEFQQkNfQ0xLKF9uYW1lLCBfcmVnLCBfZm5jbGtzZWwsIF9yYXRlKQkJCVwKIHN0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCQlcCi0JCS5jbGtfcnN0CT0gKHZvaWQgX19pb21lbSAqKUFQQkNfIyNfcmVnLAlcCisJCS5jbGtfcnN0CT0gQVBCQ18jI19yZWcsCQkJXAogCQkuZm5jbGtzZWwJPSBfZm5jbGtzZWwsCQkJXAogCQkucmF0ZQkJPSBfcmF0ZSwJCQlcCiAJCS5vcHMJCT0gJmFwYmNfY2xrX29wcywJCVwKQEAgLTM4LDcgKzM4LDcgQEAKIAogI2RlZmluZSBBUEJDX0NMS19PUFMoX25hbWUsIF9yZWcsIF9mbmNsa3NlbCwgX3JhdGUsIF9vcHMpCVwKIHN0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCQlcCi0JCS5jbGtfcnN0CT0gKHZvaWQgX19pb21lbSAqKUFQQkNfIyNfcmVnLAlcCisJCS5jbGtfcnN0CT0gQVBCQ18jI19yZWcsCQkJXAogCQkuZm5jbGtzZWwJPSBfZm5jbGtzZWwsCQkJXAogCQkucmF0ZQkJPSBfcmF0ZSwJCQlcCiAJCS5vcHMJCT0gX29wcywJCQkJXApAQCAtNDYsNyArNDYsNyBAQAogCiAjZGVmaW5lIEFQTVVfQ0xLKF9uYW1lLCBfcmVnLCBfZXZhbCwgX3JhdGUpCQkJXAogc3RydWN0IGNsayBjbGtfIyNfbmFtZSA9IHsJCQkJCVwKLQkJLmNsa19yc3QJPSAodm9pZCBfX2lvbWVtICopQVBNVV8jI19yZWcsCVwKKwkJLmNsa19yc3QJPSBBUE1VXyMjX3JlZywJCQlcCiAJCS5lbmFibGVfdmFsCT0gX2V2YWwsCQkJXAogCQkucmF0ZQkJPSBfcmF0ZSwJCQlcCiAJCS5vcHMJCT0gJmFwbXVfY2xrX29wcywJCVwKQEAgLTU0LDcgKzU0LDcgQEAKIAogI2RlZmluZSBBUE1VX0NMS19PUFMoX25hbWUsIF9yZWcsIF9ldmFsLCBfcmF0ZSwgX29wcykJCVwKIHN0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCQlcCi0JCS5jbGtfcnN0CT0gKHZvaWQgX19pb21lbSAqKUFQTVVfIyNfcmVnLAlcCisJCS5jbGtfcnN0CT0gQVBNVV8jI19yZWcsCQkJXAogCQkuZW5hYmxlX3ZhbAk9IF9ldmFsLAkJCVwKIAkJLnJhdGUJCT0gX3JhdGUsCQkJXAogCQkub3BzCQk9IF9vcHMsCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvY29tbW9uLmMKaW5kZXggMGVjMGNhOC4uNTcyMDY3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvY29tbW9uLmMKQEAgLTI3LDEyICsyNywxMiBAQAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzdGFuZGFyZF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBUEJfUEhZU19CQVNFKSwKLQkJLnZpcnR1YWwJPSBBUEJfVklSVF9CQVNFLAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKUFQQl9WSVJUX0JBU0UsCiAJCS5sZW5ndGgJCT0gQVBCX1BIWVNfU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sIHsKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFYSV9QSFlTX0JBU0UpLAotCQkudmlydHVhbAk9IEFYSV9WSVJUX0JBU0UsCisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpQVhJX1ZJUlRfQkFTRSwKIAkJLmxlbmd0aAkJPSBBWElfUEhZU19TSVpFLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2dwbHVnZC5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvZ3BsdWdkLmMKaW5kZXggOThlMjVkOS4uNjkxNTY1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvZ3BsdWdkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvZ3BsdWdkLmMKQEAgLTksMTEgKzksMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGExNjguaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGExNjguaD4KIApAQCAtMTg4LDcgKzE4OCw3IEBACiAJcHhhMTY4X2FkZF9ldGgoJmdwbHVnZF9ldGhfcGxhdGZvcm1fZGF0YSk7CiB9CiAKLU1BQ0hJTkVfU1RBUlQoU0hFRVZBRCwgIlBYQTE2OC1iYXNlZCBHdXJ1UGx1ZyBEaXNwbGF5IChncGx1Z0QpIFBsYXRmb3JtIikKK01BQ0hJTkVfU1RBUlQoR1BMVUdELCAiUFhBMTY4LWJhc2VkIEd1cnVQbHVnIERpc3BsYXkgKGdwbHVnRCkgUGxhdGZvcm0iKQogCS5tYXBfaW8JCT0gbW1wX21hcF9pbywKIAkubnJfaXJxcwk9IElSUV9CT0FSRF9TVEFSVCwKIAkuaW5pdF9pcnEgICAgICAgPSBweGExNjhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvYWRkci1tYXAuaCBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCmluZGV4IDMyNTQwODkuLjNlNDA0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCkBAIC0xMSw2ICsxMSwxMiBAQAogI2lmbmRlZiBfX0FTTV9NQUNIX0FERFJfTUFQX0gKICNkZWZpbmUgX19BU01fTUFDSF9BRERSX01BUF9ICiAKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBJT01FTSh4KQkoKHZvaWQgX19pb21lbSAqKSh4KSkKKyNlbHNlCisjZGVmaW5lIElPTUVNKHgpCSh4KQorI2VuZGlmCisKIC8qIEFQQiAtIEFwcGxpY2F0aW9uIFN1YnN5c3RlbSBQZXJpcGhlcmFsIEJ1cwogICoKICAqIE5PVEU6IHRoZSBETUEgY29udHJvbGxlciByZWdpc3RlcnMgYXJlIGFjdHVhbGx5IG9uIHRoZSBBWEkgZmFicmljICMxCkBAIC0xOCwxMSArMjQsMTEgQEAKICAqIHBlcmlwaGVyYWxzIG9uIEFQQiwgbGV0J3MgY291bnQgaXQgaW50byB0aGUgQUJQIG1hcHBpbmcgYXJlYS4KICAqLwogI2RlZmluZSBBUEJfUEhZU19CQVNFCQkweGQ0MDAwMDAwCi0jZGVmaW5lIEFQQl9WSVJUX0JBU0UJCTB4ZmUwMDAwMDAKKyNkZWZpbmUgQVBCX1ZJUlRfQkFTRQkJSU9NRU0oMHhmZTAwMDAwMCkKICNkZWZpbmUgQVBCX1BIWVNfU0laRQkJMHgwMDIwMDAwMAogCiAjZGVmaW5lIEFYSV9QSFlTX0JBU0UJCTB4ZDQyMDAwMDAKLSNkZWZpbmUgQVhJX1ZJUlRfQkFTRQkJMHhmZTIwMDAwMAorI2RlZmluZSBBWElfVklSVF9CQVNFCQlJT01FTSgweGZlMjAwMDAwKQogI2RlZmluZSBBWElfUEhZU19TSVpFCQkweDAwMjAwMDAwCiAKIC8qIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlciAtIENoaXAgU2VsZWN0IDAgYW5kIDEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggN2UyZWJkMy4uYjZmMTRkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTExLDcgKzExLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvYWRkci1tYXAuaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID1BUEJfUEhZU19CQVNFCQlAIHBoeXNpY2FsCiAJCWxkcglccnYsID1BUEJfVklSVF9CQVNFCQlAIHZpcnR1YWwKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDAxNzAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2dwaW8tcHhhLmggYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvZ3Bpby1weGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTRlZWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2dwaW8tcHhhLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfX0FTTV9NQUNIX0dQSU9fUFhBX0gKKyNkZWZpbmUgX19BU01fTUFDSF9HUElPX1BYQV9ICisKKyNpbmNsdWRlIDxtYWNoL2FkZHItbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNkZWZpbmUgR1BJT19SRUdTX1ZJUlQJKEFQQl9WSVJUX0JBU0UgKyAweDE5MDAwKQorCisjZGVmaW5lIEJBTktfT0ZGKG4pCSgoKG4pIDwgMykgPyAobikgPDwgMiA6IDB4MTAwICsgKCgobikgLSAzKSA8PCAyKSkKKyNkZWZpbmUgR1BJT19SRUcoeCkJKEdQSU9fUkVHU19WSVJUICsgKHgpKQorCisjZGVmaW5lIE5SX0JVSUxUSU5fR1BJTwkJSVJRX0dQSU9fTlVNCisKKyNkZWZpbmUgZ3Bpb190b19iYW5rKGdwaW8pCSgoZ3BpbykgPj4gNSkKKworLyogTk9URTogdGhlc2UgbWFjcm9zIGFyZSBkZWZpbmVkIGhlcmUgdG8gbWFrZSBvcHRpbWl6YXRpb24gb2YKKyAqIGdwaW9fe2dldCxzZXR9X3ZhbHVlKCkgdG8gd29yayB3aGVuICdncGlvJyBpcyBhIGNvbnN0YW50LgorICogVXNhZ2Ugb2YgdGhlc2UgbWFjcm9zIG90aGVyd2lzZSBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQsCisgKiB1c2UgZ2VuZXJpYyBHUElPIEFQSSB3aGVuZXZlciBwb3NzaWJsZS4KKyAqLworI2RlZmluZSBHUElPX2JpdChncGlvKQkoMSA8PCAoKGdwaW8pICYgMHgxZikpCisKKyNkZWZpbmUgR1BMUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MDApCisjZGVmaW5lIEdQRFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDBjKQorI2RlZmluZSBHUFNSKHgpCQlHUElPX1JFRyhCQU5LX09GRihncGlvX3RvX2JhbmsoeCkpICsgMHgxOCkKKyNkZWZpbmUgR1BDUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MjQpCisKKyNpbmNsdWRlIDxwbGF0L2dwaW8tcHhhLmg+CisKKyNlbmRpZiAvKiBfX0FTTV9NQUNIX0dQSU9fUFhBX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDdiZmI4MjcuLjY4MTI2MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwzNiArMSwxMyBAQAogI2lmbmRlZiBfX0FTTV9NQUNIX0dQSU9fSAogI2RlZmluZSBfX0FTTV9NQUNIX0dQSU9fSAogCi0jaW5jbHVkZSA8bWFjaC9hZGRyLW1hcC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAotI2RlZmluZSBHUElPX1JFR1NfVklSVAkoQVBCX1ZJUlRfQkFTRSArIDB4MTkwMDApCi0KLSNkZWZpbmUgQkFOS19PRkYobikJKCgobikgPCAzKSA/IChuKSA8PCAyIDogMHgxMDAgKyAoKChuKSAtIDMpIDw8IDIpKQotI2RlZmluZSBHUElPX1JFRyh4KQkoKigodm9sYXRpbGUgdTMyICopKEdQSU9fUkVHU19WSVJUICsgKHgpKSkpCi0KLSNkZWZpbmUgTlJfQlVJTFRJTl9HUElPCQlJUlFfR1BJT19OVU0KLQotI2RlZmluZSBncGlvX3RvX2JhbmsoZ3BpbykJKChncGlvKSA+PiA1KQogI2RlZmluZSBncGlvX3RvX2lycShncGlvKQkoSVJRX0dQSU9fU1RBUlQgKyAoZ3BpbykpCiAjZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gSVJRX0dQSU9fU1RBUlQpCiAKLQogI2RlZmluZSBfX2dwaW9faXNfaW52ZXJ0ZWQoZ3BpbykJKDApCiAjZGVmaW5lIF9fZ3Bpb19pc19vY2N1cGllZChncGlvKQkoMCkKIAotLyogTk9URTogdGhlc2UgbWFjcm9zIGFyZSBkZWZpbmVkIGhlcmUgdG8gbWFrZSBvcHRpbWl6YXRpb24gb2YKLSAqIGdwaW9fe2dldCxzZXR9X3ZhbHVlKCkgdG8gd29yayB3aGVuICdncGlvJyBpcyBhIGNvbnN0YW50LgotICogVXNhZ2Ugb2YgdGhlc2UgbWFjcm9zIG90aGVyd2lzZSBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQsCi0gKiB1c2UgZ2VuZXJpYyBHUElPIEFQSSB3aGVuZXZlciBwb3NzaWJsZS4KLSAqLwotI2RlZmluZSBHUElPX2JpdChncGlvKQkoMSA8PCAoKGdwaW8pICYgMHgxZikpCi0KLSNkZWZpbmUgR1BMUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MDApCi0jZGVmaW5lIEdQRFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKGdwaW9fdG9fYmFuayh4KSkgKyAweDBjKQotI2RlZmluZSBHUFNSKHgpCQlHUElPX1JFRyhCQU5LX09GRihncGlvX3RvX2JhbmsoeCkpICsgMHgxOCkKLSNkZWZpbmUgR1BDUih4KQkJR1BJT19SRUcoQkFOS19PRkYoZ3Bpb190b19iYW5rKHgpKSArIDB4MjQpCi0KICNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KICNlbmRpZiAvKiBfX0FTTV9NQUNIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhiNTBhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BU01fTUFDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9NQUNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYgLyogX19BU01fTUFDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21tcDIuaCBiL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9tbXAyLmgKaW5kZXggZGU3Yjg4OC4uMmY3YjJkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL21tcDIuaAorKysgYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvbW1wMi5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3B4YS1pMmMuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KKyNpbmNsdWRlIDxtYWNoL3NyYW0uaD4KIAogZXh0ZXJuIHN0cnVjdCBweGFfZGV2aWNlX2Rlc2MgbW1wMl9kZXZpY2VfdWFydDE7CiBleHRlcm4gc3RydWN0IHB4YV9kZXZpY2VfZGVzYyBtbXAyX2RldmljZV91YXJ0MjsKQEAgLTI4LDYgKzI5LDggQEAKIGV4dGVybiBzdHJ1Y3QgcHhhX2RldmljZV9kZXNjIG1tcDJfZGV2aWNlX3NkaDE7CiBleHRlcm4gc3RydWN0IHB4YV9kZXZpY2VfZGVzYyBtbXAyX2RldmljZV9zZGgyOwogZXh0ZXJuIHN0cnVjdCBweGFfZGV2aWNlX2Rlc2MgbW1wMl9kZXZpY2Vfc2RoMzsKK2V4dGVybiBzdHJ1Y3QgcHhhX2RldmljZV9kZXNjIG1tcDJfZGV2aWNlX2FzcmFtOworZXh0ZXJuIHN0cnVjdCBweGFfZGV2aWNlX2Rlc2MgbW1wMl9kZXZpY2VfaXNyYW07CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1tcDJfYWRkX3VhcnQoaW50IGlkKQogewpAQCAtODUsNSArODgsMTUgQEAKIAlyZXR1cm4gcHhhX3JlZ2lzdGVyX2RldmljZShkLCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbW1wMl9hZGRfYXNyYW0oc3RydWN0IHNyYW1fcGxhdGRhdGEgKmRhdGEpCit7CisJcmV0dXJuIHB4YV9yZWdpc3Rlcl9kZXZpY2UoJm1tcDJfZGV2aWNlX2FzcmFtLCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbW1wMl9hZGRfaXNyYW0oc3RydWN0IHNyYW1fcGxhdGRhdGEgKmRhdGEpCit7CisJcmV0dXJuIHB4YV9yZWdpc3Rlcl9kZXZpY2UoJm1tcDJfZGV2aWNlX2lzcmFtLCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKK30KKwogI2VuZGlmIC8qIF9fQVNNX01BQ0hfTU1QMl9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2luY2x1ZGUvbWFjaC9zcmFtLmggYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvc3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWUwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1tcC9pbmNsdWRlL21hY2gvc3JhbS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1tbXAvaW5jbHVkZS9tYWNoL3NyYW0uaAorICoKKyAqICBTUkFNIE1lbW9yeSBNYW5hZ2VtZW50CisgKgorICogIENvcHlyaWdodCAoYykgMjAxMSBNYXJ2ZWxsIFNlbWljb25kdWN0b3JzIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfU1JBTV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfU1JBTV9ICisKKyNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgorCisvKiBBUkJJVFJBUlk6ICBTUkFNIGFsbG9jYXRpb25zIGFyZSBtdWx0aXBsZXMgb2YgdGhpcyAyXk4gc2l6ZSAqLworI2RlZmluZSBTUkFNX0dSQU5VTEFSSVRZCTUxMgorCitlbnVtIHNyYW1fdHlwZSB7CisJTU1QX1NSQU1fVU5ERUZJTkVEID0gMCwKKwlNTVBfQVNSQU0sCisJTU1QX0lTUkFNLAorfTsKKworc3RydWN0IHNyYW1fcGxhdGRhdGEgeworCWNoYXIgKnBvb2xfbmFtZTsKKwlpbnQgZ3JhbnVsYXJpdHk7Cit9OworCitleHRlcm4gc3RydWN0IGdlbl9wb29sICpzcmFtX2dldF9ncG9vbChjaGFyICpwb29sX25hbWUpOworCisjZW5kaWYgLyogX19BU01fQVJDSF9TUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL2phc3Blci5jIGIvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKaW5kZXggNWQ2NDIxZC4uOGJmYWM2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvamFzcGVyLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYXg4NjQ5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDg5MjUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL21tcDIuYyBiL2FyY2gvYXJtL21hY2gtbW1wL21tcDIuYwppbmRleCAwNzljMTg4Li41ZGQxZDRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9tbXAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvbW1wMi5jCkBAIC05LDcgKzksNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNSw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL21mcC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1weGEuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KICNpbmNsdWRlIDxtYWNoL21tcDIuaD4KIApAQCAtODcsNyArODYsOCBAQAogCiB2b2lkIG1tcDJfY2xlYXJfcG1pY19pbnQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG1mcHJfcG1pYywgZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1mcHJfcG1pYzsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAltZnByX3BtaWMgPSBBUEJfVklSVF9CQVNFICsgMHgxZTAwMCArIDB4MmM0OwogCWRhdGEgPSBfX3Jhd19yZWFkbChtZnByX3BtaWMpOwpAQCAtMjI2LDQgKzIyNiw3IEBACiBNTVAyX0RFVklDRShzZGgxLCAic2RoY2ktcHhhdjMiLCAxLCBNTUMyLCAweGQ0MjgwODAwLCAweDEyMCk7CiBNTVAyX0RFVklDRShzZGgyLCAic2RoY2ktcHhhdjMiLCAyLCBNTUMzLCAweGQ0MjgxMDAwLCAweDEyMCk7CiBNTVAyX0RFVklDRShzZGgzLCAic2RoY2ktcHhhdjMiLCAzLCBNTUM0LCAweGQ0MjgxODAwLCAweDEyMCk7CitNTVAyX0RFVklDRShhc3JhbSwgImFzcmFtIiwgLTEsIE5PTkUsIDB4ZTAwMDAwMDAsIDB4NDAwMCk7CisvKiAweGQxMDAwMDAwIH4gMHhkMTAxZmZmZiBpcyByZXNlcnZlZCBmb3Igc2VjdXJlIHByb2Nlc3NvciAqLworTU1QMl9ERVZJQ0UoaXNyYW0sICJpc3JhbSIsIC0xLCBOT05FLCAweGQxMDIwMDAwLCAweDE4MDAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhMTY4LmMgYi9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYwppbmRleCBiMmIyODBjLi43NmNhMTVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYworKysgYi9hcmNoL2FybS9tYWNoLW1tcC9weGExNjguYwpAQCAtNyw3ICs3LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjEsNyArMjAsNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1hcGJjLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWFwbXUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KICNpbmNsdWRlIDxtYWNoL21mcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvcHhhOTEwLmMgYi9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYwppbmRleCAxNDY0NjA3Li40ZWJiZmJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYworKysgYi9hcmNoL2FybS9tYWNoLW1tcC9weGE5MTAuYwpAQCAtNyw3ICs3LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjAsNyArMTksNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1hcG11Lmg+CiAjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLXB4YS5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbW1wL3NyYW0uYyBiL2FyY2gvYXJtL21hY2gtbW1wL3NyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA0Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tbXAvc3JhbS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtbW1wL3NyYW0uYworICoKKyAqICBiYXNlZCBvbiBtYWNoLWRhdmluY2kvc3JhbS5jIC0gRGFWaW5jaSBzaW1wbGUgU1JBTSBhbGxvY2F0b3IKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIE1hcnZlbGwgU2VtaWNvbmR1Y3RvcnMgSW5jLgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgQWRkIGZvciBtbXAgc3JhbSBzdXBwb3J0IC0gTGVvIFlhbiA8bGVveUBtYXJ2ZWxsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CisKKyNpbmNsdWRlIDxtYWNoL3NyYW0uaD4KKworc3RydWN0IHNyYW1fYmFua19pbmZvIHsKKwljaGFyICpwb29sX25hbWU7CisJc3RydWN0IGdlbl9wb29sICpncG9vbDsKKwlpbnQgZ3JhbnVsYXJpdHk7CisKKwlwaHlzX2FkZHJfdCBzcmFtX3BoeXM7CisJdm9pZCBfX2lvbWVtICpzcmFtX3ZpcnQ7CisJdTMyIHNyYW1fc2l6ZTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0YXRpYyBERUZJTkVfTVVURVgoc3JhbV9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoc3JhbV9iYW5rX2xpc3QpOworCitzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fZ2V0X2dwb29sKGNoYXIgKnBvb2xfbmFtZSkKK3sKKwlzdHJ1Y3Qgc3JhbV9iYW5rX2luZm8gKmluZm8gPSBOVUxMOworCisJaWYgKCFwb29sX25hbWUpCisJCXJldHVybiBOVUxMOworCisJbXV0ZXhfbG9jaygmc3JhbV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJnNyYW1fYmFua19saXN0LCBub2RlKQorCQlpZiAoIXN0cmNtcChwb29sX25hbWUsIGluZm8tPnBvb2xfbmFtZSkpCisJCQlicmVhazsKKworCW11dGV4X3VubG9jaygmc3JhbV9sb2NrKTsKKworCWlmICgmaW5mby0+bm9kZSA9PSAmc3JhbV9iYW5rX2xpc3QpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGluZm8tPmdwb29sOworfQorRVhQT1JUX1NZTUJPTChzcmFtX2dldF9ncG9vbCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNyYW1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3JhbV9wbGF0ZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc3JhbV9iYW5rX2luZm8gKmluZm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXBkYXRhICYmICFwZGF0YS0+cG9vbF9uYW1lKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghcmVzb3VyY2Vfc2l6ZShyZXMpKQorCQlyZXR1cm4gMDsKKworCWluZm8tPnNyYW1fcGh5cyAgID0gKHBoeXNfYWRkcl90KXJlcy0+c3RhcnQ7CisJaW5mby0+c3JhbV9zaXplICAgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaW5mby0+c3JhbV92aXJ0ICAgPSBpb3JlbWFwKGluZm8tPnNyYW1fcGh5cywgaW5mby0+c3JhbV9zaXplKTsKKwlpbmZvLT5wb29sX25hbWUJICA9IGtzdHJkdXAocGRhdGEtPnBvb2xfbmFtZSwgR0ZQX0tFUk5FTCk7CisJaW5mby0+Z3JhbnVsYXJpdHkgPSBwZGF0YS0+Z3JhbnVsYXJpdHk7CisKKwlpbmZvLT5ncG9vbCA9IGdlbl9wb29sX2NyZWF0ZShpbG9nMihpbmZvLT5ncmFudWxhcml0eSksIC0xKTsKKwlpZiAoIWluZm8tPmdwb29sKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNyZWF0ZSBwb29sIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY3JlYXRlX3Bvb2xfZXJyOworCX0KKworCXJldCA9IGdlbl9wb29sX2FkZF92aXJ0KGluZm8tPmdwb29sLCAodW5zaWduZWQgbG9uZylpbmZvLT5zcmFtX3ZpcnQsCisJCQkJaW5mby0+c3JhbV9waHlzLCBpbmZvLT5zcmFtX3NpemUsIC0xKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJhZGQgbmV3IGNodW5rIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWRkX2NodW5rX2VycjsKKwl9CisKKwltdXRleF9sb2NrKCZzcmFtX2xvY2spOworCWxpc3RfYWRkKCZpbmZvLT5ub2RlLCAmc3JhbV9iYW5rX2xpc3QpOworCW11dGV4X3VubG9jaygmc3JhbV9sb2NrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRpYWxpemVkXG4iKTsKKwlyZXR1cm4gMDsKKworYWRkX2NodW5rX2VycjoKKwlnZW5fcG9vbF9kZXN0cm95KGluZm8tPmdwb29sKTsKK2NyZWF0ZV9wb29sX2VycjoKKwlpb3VubWFwKGluZm8tPnNyYW1fdmlydCk7CisJa2ZyZWUoaW5mby0+cG9vbF9uYW1lKTsKK291dDoKKwlrZnJlZShpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzcmFtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcmFtX2JhbmtfaW5mbyAqaW5mbzsKKworCWluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJnNyYW1fbG9jayk7CisJbGlzdF9kZWwoJmluZm8tPm5vZGUpOworCW11dGV4X3VubG9jaygmc3JhbV9sb2NrKTsKKworCWdlbl9wb29sX2Rlc3Ryb3koaW5mby0+Z3Bvb2wpOworCWlvdW5tYXAoaW5mby0+c3JhbV92aXJ0KTsKKwlrZnJlZShpbmZvLT5wb29sX25hbWUpOworCWtmcmVlKGluZm8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzcmFtX2lkX3RhYmxlW10gPSB7CisJeyAiYXNyYW0iLCBNTVBfQVNSQU0gfSwKKwl7ICJpc3JhbSIsIE1NUF9JU1JBTSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3JhbV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNyYW1fcHJvYmUsCisJLnJlbW92ZQkJPSBzcmFtX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibW1wLXNyYW0iLAorCX0sCisJLmlkX3RhYmxlCT0gc3JhbV9pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNyYW1faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNyYW1fZHJpdmVyKTsKK30KK2NvcmVfaW5pdGNhbGwoc3JhbV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tbXAvdGF2b3JldmIuYyBiL2FyY2gvYXJtL21hY2gtbW1wL3Rhdm9yZXZiLmMKaW5kZXggYzI5NmI3NS4uZWI1YmU4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tbXAvdGF2b3JldmIuYworKysgYi9hcmNoL2FybS9tYWNoLW1tcC90YXZvcmV2Yi5jCkBAIC03LDE4ICs3LDE4IEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8bWFjaC9hZGRyLW1hcC5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTkxMC5oPgogI2luY2x1ZGUgPG1hY2gvcHhhOTEwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJjb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQppbmRleCA0Mjg1ZGZkLi40YWQzOTY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQpAQCAtMTUsNiArMTUsOCBAQAogb2JqLSQoQ09ORklHX01TTV9TTUQpICs9IGxhc3RfcmFkaW9fbG9nLm8KIG9iai0kKENPTkZJR19NU01fU0NNKSArPSBzY20ubyBzY20tYm9vdC5vCiAKK0NGTEFHU19zY20ubyA6PSQoY2FsbCBhcy1pbnN0ciwuYXJjaF9leHRlbnNpb24gc2VjLC1EUkVRVUlSRVNfU0VDPTEpCisKIG9iai0kKENPTkZJR19IT1RQTFVHX0NQVSkgKz0gaG90cGx1Zy5vCiBvYmotJChDT05GSUdfU01QKSArPSBoZWFkc21wLm8gcGxhdHNtcC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWhhbGlidXQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLWhhbGlidXQuYwppbmRleCBmODFlZjFmLi5hNjBhYjZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1oYWxpYnV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtaGFsaWJ1dC5jCkBAIC05Myw3ICs5Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSEFMSUJVVCwgIkhhbGlidXQgQm9hcmQgKFFDVCBTVVJGNzIwMEEpIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSBoYWxpYnV0X2ZpeHVwLAogCS5tYXBfaW8JCT0gaGFsaWJ1dF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gaGFsaWJ1dF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1haGltYWhpLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tYWhpbWFoaS5jCmluZGV4IDFkZjE1YWEuLjVhNDg4MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1haGltYWhpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbWFoaW1haGkuYwpAQCAtNzQsNyArNzQsNyBAQAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyOwogCiBNQUNISU5FX1NUQVJUKE1BSElNQUhJLCAibWFoaW1haGkiKQotCS5ib290X3BhcmFtcwk9IDB4MjAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IG1haGltYWhpX2ZpeHVwLAogCS5tYXBfaW8JCT0gbWFoaW1haGlfbWFwX2lvLAogCS5pbml0X2lycQk9IG1zbV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MjcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MjcuYwppbmRleCBjMDNmMjY5Li42ZDg0ZWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc203eDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtN3gyNy5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTM0LDcgKzM0LDYgQEAKIAogI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgogI2luY2x1ZGUgPG1hY2gvbXBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAKQEAgLTEzMCw3ICsxMjksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE1TTTdYMjdfU1VSRiwgIlFDVCBNU003eDI3IFNVUkYiKQotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1zbTd4MnhfbWFwX2lvLAogCS5pbml0X2lycQk9IG1zbTd4MnhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG1zbTd4MnhfaW5pdCwKQEAgLTEzOCw3ICsxMzcsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNU003WDI3X0ZGQSwgIlFDVCBNU003eDI3IEZGQSIpCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbXNtN3gyeF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbXNtN3gyeF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbXNtN3gyeF9pbml0LApAQCAtMTQ2LDcgKzE0NSw3IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE1TTTdYMjVfU1VSRiwgIlFDVCBNU003eDI1IFNVUkYiKQotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1zbTd4MnhfbWFwX2lvLAogCS5pbml0X2lycQk9IG1zbTd4MnhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG1zbTd4MnhfaW5pdCwKQEAgLTE1NCw3ICsxNTMsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNU003WDI1X0ZGQSwgIlFDVCBNU003eDI1IEZGQSIpCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbXNtN3gyeF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbXNtN3gyeF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbXNtN3gyeF9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtN3gzMC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtN3gzMC5jCmluZGV4IGQxZTRjYzguLmRiODFlZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTd4MzAuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc203eDMwLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKICAqIDAyMTEwLTEzMDEsIFVTQS4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgpAQCAtNDMsOCArNDIsOCBAQAogCiBleHRlcm4gc3RydWN0IHN5c190aW1lciBtc21fdGltZXI7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtc203eDMwX2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZywKLQkJCSBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQorc3RhdGljIHZvaWQgX19pbml0IG1zbTd4MzBfZml4dXAoc3RydWN0IHRhZyAqdGFnLCBjaGFyICoqY21kbGluZSwKKwkJc3RydWN0IG1lbWluZm8gKm1pKQogewogCWZvciAoOyB0YWctPmhkci5zaXplOyB0YWcgPSB0YWdfbmV4dCh0YWcpKQogCQlpZiAodGFnLT5oZHIudGFnID09IEFUQUdfTUVNICYmIHRhZy0+dS5tZW0uc3RhcnQgPT0gMHgyMDAwMDApIHsKQEAgLTEyMiw3ICsxMjEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE1TTTdYMzBfU1VSRiwgIlFDVCBNU003WDMwIFNVUkYiKQotCS5ib290X3BhcmFtcyA9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkuZml4dXAgPSBtc203eDMwX2ZpeHVwLAogCS5yZXNlcnZlID0gbXNtN3gzMF9yZXNlcnZlLAogCS5tYXBfaW8gPSBtc203eDMwX21hcF9pbywKQEAgLTEzMiw3ICsxMzEsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChNU003WDMwX0ZGQSwgIlFDVCBNU003WDMwIEZGQSIpCi0JLmJvb3RfcGFyYW1zID0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5maXh1cCA9IG1zbTd4MzBfZml4dXAsCiAJLnJlc2VydmUgPSBtc203eDMwX3Jlc2VydmUsCiAJLm1hcF9pbyA9IG1zbTd4MzBfbWFwX2lvLApAQCAtMTQyLDcgKzE0MSw3IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKE1TTTdYMzBfRkxVSUQsICJRQ1QgTVNNN1gzMCBGTFVJRCIpCi0JLmJvb3RfcGFyYW1zID0gUExBVF9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5maXh1cCA9IG1zbTd4MzBfZml4dXAsCiAJLnJlc2VydmUgPSBtc203eDMwX3Jlc2VydmUsCiAJLm1hcF9pbyA9IG1zbTd4MzBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtODk2MC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtODk2MC5jCmluZGV4IGIwNDQ2OGUuLjZkYzFjYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTg5NjAuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc204OTYwLmMKQEAgLTMyLDggKzMyLDggQEAKIAogI2luY2x1ZGUgImRldmljZXMuaCIKIAotc3RhdGljIHZvaWQgX19pbml0IG1zbTg5NjBfZml4dXAoc3RydWN0IG1hY2hpbmVfZGVzYyAqZGVzYywgc3RydWN0IHRhZyAqdGFnLAotCQkJIGNoYXIgKipjbWRsaW5lLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCitzdGF0aWMgdm9pZCBfX2luaXQgbXNtODk2MF9maXh1cChzdHJ1Y3QgdGFnICp0YWcsIGNoYXIgKipjbWRsaW5lLAorCQlzdHJ1Y3QgbWVtaW5mbyAqbWkpCiB7CiAJZm9yICg7IHRhZy0+aGRyLnNpemU7IHRhZyA9IHRhZ19uZXh0KHRhZykpCiAJCWlmICh0YWctPmhkci50YWcgPT0gQVRBR19NRU0gJiYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTh4NjAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLW1zbTh4NjAuYwppbmRleCA5MjIxZjU0Li40NGJmNzE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1tc204eDYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtbXNtOHg2MC5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtOCwxOCArOCwxNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EuCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zMCw4ICsyOCw4IEBACiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtc204eDYwX2ZpeHVwKHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MsIHN0cnVjdCB0YWcgKnRhZywKLQkJCSBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQorc3RhdGljIHZvaWQgX19pbml0IG1zbTh4NjBfZml4dXAoc3RydWN0IHRhZyAqdGFnLCBjaGFyICoqY21kbGluZSwKKwkJc3RydWN0IG1lbWluZm8gKm1pKQogewogCWZvciAoOyB0YWctPmhkci5zaXplOyB0YWcgPSB0YWdfbmV4dCh0YWcpKQogCQlpZiAodGFnLT5oZHIudGFnID09IEFUQUdfTUVNICYmCkBAIC01Myw4ICs1MSw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtc204eDYwX2luaXRfaXJxKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KIAlnaWNfaW5pdCgwLCBHSUNfUFBJX1NUQVJULCBNU01fUUdJQ19ESVNUX0JBU0UsCiAJCSAodm9pZCAqKU1TTV9RR0lDX0NQVV9CQVNFKTsKIApAQCAtNjYsMjEgKzYyLDQ3IEBACiAJICovCiAJaWYgKCFtYWNoaW5lX2lzX21zbTh4NjBfc2ltKCkpCiAJCXdyaXRlbCgweDAwMDBGRkZGLCBNU01fUUdJQ19ESVNUX0JBU0UgKyBHSUNfRElTVF9FTkFCTEVfU0VUKTsKLQotCS8qIEZJWE1FOiBOb3QgaW5zdGFsbGluZyBBVlNfU1ZJQ0lOVCBhbmQgQVZTX1NWSUNJTlRTV0RPTkUgeWV0Ci0JICogYXMgdGhleSBhcmUgY29uZmlndXJlZCBhcyBsZXZlbCwgd2hpY2ggZG9lcyBub3QgcGxheSBuaWNlIHdpdGgKLQkgKiBoYW5kbGVfcGVyY3B1X2lycS4KLQkgKi8KLQlmb3IgKGkgPSBHSUNfUFBJX1NUQVJUOyBpIDwgR0lDX1NQSV9TVEFSVDsgaSsrKSB7Ci0JCWlmIChpICE9IEFWU19TVklDSU5UICYmIGkgIT0gQVZTX1NWSUNJTlRTV0RPTkUpCi0JCQlpcnFfc2V0X2hhbmRsZXIoaSwgaGFuZGxlX3BlcmNwdV9pcnEpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1zbTh4NjBfaW5pdCh2b2lkKQogewogfQogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgc3RydWN0IG9mX2Rldl9hdXhkYXRhIG1zbV9hdXhkYXRhX2xvb2t1cFtdIF9faW5pdGRhdGEgPSB7CisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kdF9naWNfbWF0Y2hbXSBfX2luaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tODY2MC1xZ2ljIiwgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG1zbTh4NjBfZHRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhOVUxMLCBtc21fZHRfZ2ljX21hdGNoLAorCQkJTVNNOFg2MF9RR0lDX0RJU1RfUEhZUyk7CisJaWYgKG5vZGUpCisJCWlycV9kb21haW5fYWRkX3NpbXBsZShub2RlLCBHSUNfU1BJX1NUQVJUKTsKKworCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoInFjb20sbXNtODY2MC1zdXJmIikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdCBzdXJmIFVBUlQgcmVnaXN0ZXJzXG4iKTsKKwkJbXNtOHg2MF9pbml0X3VhcnQxMmRtKCk7CisJfQorCisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsCisJCQltc21fYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbXNtOHg2MF9mbHVpZF9tYXRjaFtdIF9faW5pdGRhdGEgPSB7CisJInFjb20sbXNtODY2MC1mbHVpZCIsCisJInFjb20sbXNtODY2MC1zdXJmIiwKKwlOVUxMCit9OworI2VuZGlmIC8qIENPTkZJR19PRiAqLworCiBNQUNISU5FX1NUQVJUKE1TTThYNjBfUlVNSTMsICJRQ1QgTVNNOFg2MCBSVU1JMyIpCiAJLmZpeHVwID0gbXNtOHg2MF9maXh1cCwKIAkucmVzZXJ2ZSA9IG1zbTh4NjBfcmVzZXJ2ZSwKQEAgLTExNiwzICsxMzgsMTQgQEAKIAkuaW5pdF9tYWNoaW5lID0gbXNtOHg2MF9pbml0LAogCS50aW1lciA9ICZtc21fdGltZXIsCiBNQUNISU5FX0VORAorCisjaWZkZWYgQ09ORklHX09GCisvKiBUT0RPOiBHZW5lcmFsIGRldmljZSB0cmVlIHN1cHBvcnQgZm9yIGFsbCBNU00uICovCitEVF9NQUNISU5FX1NUQVJUKE1TTV9EVCwgIlF1YWxjb21tIE1TTSAoRmxhdHRlbmVkIERldmljZSBUcmVlKSIpCisJLm1hcF9pbyA9IG1zbTh4NjBfbWFwX2lvLAorCS5pbml0X2lycSA9IG1zbTh4NjBfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZSA9IG1zbTh4NjBfZHRfaW5pdCwKKwkudGltZXIgPSAmbXNtX3RpbWVyLAorCS5kdF9jb21wYXQgPSBtc204eDYwX2ZsdWlkX21hdGNoLAorTUFDSElORV9FTkQKKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXFzZDh4NTAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXFzZDh4NTAuYwppbmRleCA2YTk2OTExLi43ZTg5MDljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1xc2Q4eDUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtcXNkOHg1MC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiAgKiAwMjExMC0xMzAxLCBVU0EuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvc2lyYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAKQEAgLTE5Myw3ICsxOTIsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFFTRDhYNTBfU1VSRiwgIlFDVCBRU0Q4WDUwIFNVUkYiKQotCS5ib290X3BhcmFtcyA9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gcXNkOHg1MF9tYXBfaW8sCiAJLmluaXRfaXJxID0gcXNkOHg1MF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lID0gcXNkOHg1MF9pbml0LApAQCAtMjAxLDcgKzIwMCw3IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKFFTRDhYNTBBX1NUMV81LCAiUUNUIFFTRDhYNTBBIFNUMS41IikKLQkuYm9vdF9wYXJhbXMgPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHFzZDh4NTBfbWFwX2lvLAogCS5pbml0X2lycSA9IHFzZDh4NTBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZSA9IHFzZDh4NTBfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXNhcHBoaXJlLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC1zYXBwaGlyZS5jCmluZGV4IGM2ZTA0M2MuLjMyYjQ2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXNhcHBoaXJlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtc2FwcGhpcmUuYwpAQCAtMTEsNyArMTEsNyBAQAogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTA1LDcgKzEwNCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU0FQUEhJUkUsICJzYXBwaGlyZSIpCiAvKiBNYWludGFpbmVyOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgICAgPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLmZpeHVwICAgICAgICAgID0gc2FwcGhpcmVfZml4dXAsCiAJLm1hcF9pbyAgICAgICAgID0gc2FwcGhpcmVfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IHNhcHBoaXJlX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtbW1jLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1tbWMuYwppbmRleCBmN2E5NzI0Li44NjUwMzQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1tbWMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LW1tYy5jCiAqKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgogKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCi0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtcGFuZWwuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LXBhbmVsLmMKaW5kZXggNzI5YmI0OS4uMjUxMDVjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtcGFuZWwuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC1wYW5lbC5jCkBAIC0xLDcgKzEsNyBAQAogLyogbGludXgvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQtbWRkaS5jCiAqKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgogKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxtYWNoL21zbV9mYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2JvYXJkLXRyb3V0LmMKaW5kZXggN2FjZDIwMi4uNmI5YjIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vYm9hcmQtdHJvdXQuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ib2FyZC10cm91dC5jCkBAIC05Myw3ICs5Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVFJPVVQsICJIVEMgRHJlYW0iKQotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHRyb3V0X2ZpeHVwLAogCS5tYXBfaW8JCT0gdHJvdXRfbWFwX2lvLAogCS5pbml0X2lycQk9IHRyb3V0X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1tc203eDAwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLW1zbTd4MDAuYwppbmRleCBjNGY1ZTI2Li45OTM3ODBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLW1zbTd4MDAuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLW1zbTd4MDAuYwpAQCAtMTc2LDEyICsxNzYsNiBAQAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAogCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzFfMSwKLQkJLmVuZAk9IElOVF9TREMxXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAotCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgogCX0sCkBAIC0yMDQsMTIgKzE5OCw2IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAotCQl7Ci0JCS5zdGFydAk9IElOVF9TREMyXzEsCi0JCS5lbmQJPSBJTlRfU0RDMl8xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQkJLm5hbWUJPSAicGlvX2lycSIsCi0JfSwKIAl7CiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9ESVNBQkxFRCwKIAkJLm5hbWUJPSAic3RhdHVzX2lycSIKQEAgLTIzMywxMiArMjIxLDYgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJCS5uYW1lCT0gImNtZF9pcnEiLAogCX0sCi0JCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzNfMSwKLQkJLmVuZAk9IElOVF9TREMzXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAogCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgpAQCAtMjYyLDEyICsyNDQsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAkJLm5hbWUJPSAiY21kX2lycSIsCiAJfSwKLQkJewotCQkuc3RhcnQJPSBJTlRfU0RDNF8xLAotCQkuZW5kCT0gSU5UX1NEQzRfMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JCS5uYW1lCT0gInBpb19pcnEiLAotCX0sCiAJewogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRElTQUJMRUQsCiAJCS5uYW1lCT0gInN0YXR1c19pcnEiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLXFzZDh4NTAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMtcXNkOHg1MC5jCmluZGV4IDEyZDhkZWIuLjEzMTYzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMtcXNkOHg1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMtcXNkOHg1MC5jCkBAIC0xNDAsMTIgKzE0MCw2IEBACiAJCS5uYW1lCT0gImNtZF9pcnEiLAogCX0sCiAJewotCQkuc3RhcnQJPSBJTlRfU0RDMV8xLAotCQkuZW5kCT0gSU5UX1NEQzFfMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JCS5uYW1lCT0gInBpb19pcnEiLAotCX0sCi0JewogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRElTQUJMRUQsCiAJCS5uYW1lCT0gInN0YXR1c19pcnEiCiAJfSwKQEAgLTE2OCwxMiArMTYyLDYgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJCS5uYW1lCT0gImNtZF9pcnEiLAogCX0sCi0JCXsKLQkJLnN0YXJ0CT0gSU5UX1NEQzJfMSwKLQkJLmVuZAk9IElOVF9TREMyXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCQkubmFtZQk9ICJwaW9faXJxIiwKLQl9LAogCXsKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0RJU0FCTEVELAogCQkubmFtZQk9ICJzdGF0dXNfaXJxIgpAQCAtMTk3LDEyICsxODUsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAkJLm5hbWUJPSAiY21kX2lycSIsCiAJfSwKLQkJewotCQkuc3RhcnQJPSBJTlRfU0RDM18xLAotCQkuZW5kCT0gSU5UX1NEQzNfMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JCS5uYW1lCT0gInBpb19pcnEiLAotCX0sCiAJewogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfRElTQUJMRUQsCiAJCS5uYW1lCT0gInN0YXR1c19pcnEiCkBAIC0yMjYsMTIgKzIwOCw2IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCQkubmFtZQk9ICJjbWRfaXJxIiwKIAl9LAotCQl7Ci0JCS5zdGFydAk9IElOVF9TREM0XzEsCi0JCS5lbmQJPSBJTlRfU0RDNF8xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQkJLm5hbWUJPSAicGlvX2lycSIsCi0JfSwKIAl7CiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9ESVNBQkxFRCwKIAkJLm5hbWUJPSAic3RhdHVzX2lycSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYwppbmRleCA1YTMxZjcwLi40MWMyNTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaG90cGx1Zy5jCkBAIC0zNyw3ICszNyw3IEBACiAJCSAgICA6CiAJCSAgICA6ICJtZW1vcnkiLCAiY2MiKTsKIAotCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7CisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHVfbG9naWNhbF9tYXAoY3B1KSkgewogCQkJLyoKIAkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNjQ2Yjk5ZS4uMmRjNzNjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfSEFTX01TTV9ERUJVR19VQVJUX1BIWVMpICYmICFkZWZpbmVkKENPTkZJR19NU01fREVCVUdfVUFSVF9OT05FKQotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcglccnAsID1NU01fREVCVUdfVUFSVF9QSFlTCiAJbGRyCVxydiwgPU1TTV9ERUJVR19VQVJUX0JBU0UKIAkuZW5kbQpAQCAtMzcsNyArMzcsNyBAQAogCWJlcQkxMDAxYgogCS5lbmRtCiAjZWxzZQotCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJbW92CVxydiwgIzB4ZmYwMDAwMDAKIAlvcnIJXHJ2LCBccnYsICMweDAwZjAwMDAwCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby1xZ2ljLlMgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8tcWdpYy5TCmluZGV4IDEyNDY3MTUuLjcxNzA3NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby1xZ2ljLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLXFnaWMuUwpAQCAtOCw4MSArOCwxMCBAQAogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUz4KIAogCS5tYWNybwlkaXNhYmxlX2ZpcQogCS5lbmRtCiAKLQkubWFjcm8gIGdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCi0JbGRyCVxiYXNlLCA9Z2ljX2NwdV9iYXNlX2FkZHIKLQlsZHIJXGJhc2UsIFtcYmFzZV0KLQkuZW5kbQotCiAJLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCiAJLmVuZG0KLQotCS8qCi0JICogVGhlIGludGVycnVwdCBudW1iZXJpbmcgc2NoZW1lIGlzIGRlZmluZWQgaW4gdGhlCi0JICogaW50ZXJydXB0IGNvbnRyb2xsZXIgc3BlYy4gIFRvIHdpdDoKLQkgKgotCSAqIE1pZ3JhdGVkIHRoZSBjb2RlIGZyb20gQVJNIE1QIHBvcnQgdG8gYmUgbW9yZSBjb25zaXN0ZW50Ci0JICogd2l0aCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAsIHRoZSBmb2xsb3dpbmcgc3RpbGwgaG9sZHMgdHJ1ZQotCSAqIGhvd2V2ZXIsIGFsbCBpbnRlcnJ1cHRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKLQkgKiBpZiB0aGV5IGFyZSBsb2NhbCBJUEkgb3IgUFBJCi0JICoKLQkgKiBJbnRlcnJ1cHRzIDAtMTUgYXJlIElQSQotCSAqIDE2LTMxIGFyZSBQUEkKLQkgKiAgICgxNi0xOCBhcmUgdGhlIHRpbWVycykKLQkgKiAzMi0xMDIwIGFyZSBnbG9iYWwKLQkgKiAxMDIxLTEwMjIgYXJlIHJlc2VydmVkCi0JICogMTAyMyBpcyAic3B1cmlvdXMiIChubyBpbnRlcnJ1cHQpCi0JICoKLQkgKiBBIHNpbXBsZSByZWFkIGZyb20gdGhlIGNvbnRyb2xsZXIgd2lsbCB0ZWxsIHVzIHRoZSBudW1iZXIgb2YgdGhlCi0JICogaGlnaGVzdCBwcmlvcml0eSBlbmFibGVkIGludGVycnVwdC4gIFdlIHRoZW4ganVzdCBuZWVkIHRvIGNoZWNrCi0JICogd2hldGhlciBpdCBpcyBpbiB0aGUgdmFsaWQgcmFuZ2UgZm9yIGFuIElSUSAoMC0xMDIwIGluY2x1c2l2ZSkuCi0JICoKLQkgKiBCYXNlIEFSTSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbG9jYWwgKHByaXZhdGUpIHBlcmlwaGVyYWwgaW50ZXJydXB0cwotCSAqIGFyZSBub3QgdmFsaWQsIHdlIHRyZWF0IHRoZW0gZGlmZmVyZW50bHksIGluIHRoYXQgdGhlIHByaXZhdGVzIGFyZQotCSAqIGhhbmRsZWQgbGlrZSBub3JtYWwgc2hhcmVkIGludGVycnVwdHMgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgb25seQotCSAqIG9uZSBwcm9jZXNzb3IgY2FuIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgYW5kIHRoZSBoYW5kbGVyIG11c3QgYmUKLQkgKiB0aGUgc2FtZSBmb3IgYWxsIHByb2Nlc3NvcnMuCi0JICovCi0KLQkubWFjcm8gIGdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCi0JbGRyICBcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9JTlRBQ0tdIC8qIGJpdHMgMTItMTAgPXNyY0NQVSwKLQkJCQkJCSAgIDktMCA9aW50ICMgKi8KLQotCWJpYyAgICAgXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAlAbWFzayBzcmMKLQljbXAgICAgIFxpcnFuciwgIzE1Ci0JbGRyCQlcdG1wLCA9MTAyMQotCWNtcGNjCVxpcnFuciwgXGlycW5yCi0JY21wbmUJXGlycW5yLCBcdG1wCi0JY21wY3MJXGlycW5yLCBcaXJxbnIKLQotCS5lbmRtCi0KLQkvKiBXZSBhc3N1bWUgdGhhdCBpcnFzdGF0ICh0aGUgcmF3IHZhbHVlIG9mIHRoZSBJUlEgYWNrbm93bGVkZ2UKLQkgKiByZWdpc3RlcikgaXMgcHJlc2VydmVkIGZyb20gdGhlIG1hY3JvIGFib3ZlLgotCSAqIElmIHRoZXJlIGlzIGFuIElQSSwgd2UgaW1tZWRpYXRlbHkgc2lnbmFsIGVuZCBvZiBpbnRlcnJ1cHQgb24gdGhlCi0JICogY29udHJvbGxlciwgc2luY2UgdGhpcyByZXF1aXJlcyB0aGUgb3JpZ2luYWwgaXJxc3RhdCB2YWx1ZSB3aGljaAotCSAqIHdlIHdvbid0IGVhc2lseSBiZSBhYmxlIHRvIHJlY3JlYXRlIGxhdGVyLgotCSAqLwotCS5tYWNybyB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLSAgICBiaWMgXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotICAgIGNtcCBcaXJxbnIsICMxNgotICAgIHN0cmNjICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQotICAgIGNtcGNzICAgXGlycW5yLCBcaXJxbnIKLQkuZW5kbQotCi0JLyogQXMgYWJvdmUsIHRoaXMgYXNzdW1lcyB0aGF0IGlycXN0YXQgYW5kIGJhc2UgYXJlIHByZXNlcnZlZC4uICovCi0KLQkubWFjcm8gdGVzdF9mb3JfbHRpcnEsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLSAgICBiaWMgXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAotICAgIG1vdiAgICAgXHRtcCwgIzAKLSAgICBjbXAgXGlycW5yLCAjMTYKLSAgICBtb3ZlcSAgIFx0bXAsICMxCi0gICAgc3RyZXEgICBcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9FT0ldCi0gICAgY21wIFx0bXAsICMwCi0JLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDM2YWQ1MGQuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSwyNiArMSBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19BU01fQVJDSF9NU01fR1BJT19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVNNX0dQSU9fSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlICBfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlICBfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAgICBfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEgICAgIF9fZ3Bpb190b19pcnEKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVNNX0dQSU9fSCAqLworLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkNWU3ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyogcGh5c2ljYWwgb2Zmc2V0IG9mIFJBTSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUVNEOFg1MCkgJiYgZGVmaW5lZChDT05GSUdfTVNNX1NPQ19SRVZfQSkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfUVNEOFg1MCkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgyMDAwMDAwMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gzMCkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNOFg2MCkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHg0MDAwMDAwMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNODk2MCkKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHg0MDAwMDAwMCkKLSNlbHNlCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MTAwMDAwMDApCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tbWMuaAppbmRleCA1NjMxYjUxLi5mZmNkOWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21tYy5oCkBAIC04LDEzICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KIAotc3RydWN0IGVtYmVkZGVkX3NkaW9fZGF0YSB7Ci0Jc3RydWN0IHNkaW9fY2lzIGNpczsKLQlzdHJ1Y3Qgc2Rpb19jY2NyIGNjY3I7Ci0Jc3RydWN0IHNkaW9fZW1iZWRkZWRfZnVuYyAqZnVuY3M7Ci0JaW50IG51bV9mdW5jczsKLX07Ci0KIHN0cnVjdCBtc21fbW1jX2dwaW8gewogCXVuc2lnbmVkIG5vOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yOSw5ICsyMiw5IEBACiAJdW5zaWduZWQgaW50IG9jcl9tYXNrOwkJCS8qIGF2YWlsYWJsZSB2b2x0YWdlcyAqLwogCXUzMiAoKnRyYW5zbGF0ZV92ZGQpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKIAl1bnNpZ25lZCBpbnQgKCpzdGF0dXMpKHN0cnVjdCBkZXZpY2UgKik7Ci0Jc3RydWN0IGVtYmVkZGVkX3NkaW9fZGF0YSAqZW1iZWRkZWRfc2RpbzsKIAlpbnQgKCpyZWdpc3Rlcl9zdGF0dXNfbm90aWZ5KSh2b2lkICgqY2FsbGJhY2spKGludCBjYXJkX3ByZXNlbnQsIHZvaWQgKmRldl9pZCksIHZvaWQgKmRldl9pZCk7CiAJc3RydWN0IG1zbV9tbWNfZ3Bpb19kYXRhICpncGlvX2RhdGE7CisJdm9pZCAoKmluaXRfY2FyZCkoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKaW5kZXggMTQwZGRiYi4uODc1OWVjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYwppbmRleCA3Mjc2NTk1Li5mZGVjNThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9wbGF0c21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkgKiBOb3RlIHRoYXQgInBlbl9yZWxlYXNlIiBpcyB0aGUgaGFyZHdhcmUgQ1BVIElELCB3aGVyZWFzCiAJICogImNwdSIgaXMgTGludXgncyBpbnRlcm5hbCBJRC4KIAkgKi8KLQlwZW5fcmVsZWFzZSA9IGNwdTsKKwlwZW5fcmVsZWFzZSA9IGNwdV9sb2dpY2FsX21hcChjcHUpOwogCV9fY3B1Y19mbHVzaF9kY2FjaGVfYXJlYSgodm9pZCAqKSZwZW5fcmVsZWFzZSwgc2l6ZW9mKHBlbl9yZWxlYXNlKSk7CiAJb3V0ZXJfY2xlYW5fcmFuZ2UoX19wYSgmcGVuX3JlbGVhc2UpLCBfX3BhKCZwZW5fcmVsZWFzZSArIDEpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwppbmRleCAyMzJmOTdhLi5iYWZhYmI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9zY20uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwpAQCAtMTgwLDYgKzE4MCw5IEBACiAJCQlfX2FzbWVxKCIlMSIsICJyMCIpCiAJCQlfX2FzbWVxKCIlMiIsICJyMSIpCiAJCQlfX2FzbWVxKCIlMyIsICJyMiIpCisjaWZkZWYgUkVRVUlSRVNfU0VDCisJCQkiLmFyY2hfZXh0ZW5zaW9uIHNlY1xuIgorI2VuZGlmCiAJCQkic21jCSMwCUAgc3dpdGNoIHRvIHNlY3VyZSB3b3JsZFxuIgogCQkJOiAiPXIiIChyMCkKIAkJCTogInIiIChyMCksICJyIiAocjEpLCAiciIgKHIyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKaW5kZXggNjM2MjFmMS4uYWZlZWNhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCkBAIC03MSwxMiArNzEsMTYgQEAKIHN0cnVjdCBtc21fY2xvY2sgewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgICBjbG9ja2V2ZW50OwogCXN0cnVjdCBjbG9ja3NvdXJjZSAgICAgICAgICBjbG9ja3NvdXJjZTsKLQlzdHJ1Y3QgaXJxYWN0aW9uICAgICAgICAgICAgaXJxOworCXVuc2lnbmVkIGludAkJICAgIGlycTsKIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKnJlZ2Jhc2U7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGZyZXE7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHNoaWZ0OwogCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAqZ2xvYmFsX2NvdW50ZXI7CiAJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICpsb2NhbF9jb3VudGVyOworCXVuaW9uIHsKKwkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZQkJKmV2dDsKKwkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBfX3BlcmNwdQkqKnBlcmNwdV9ldnQ7CisJfTsJCQogfTsKIAogZW51bSB7CkBAIC04NywxMyArOTEsMTAgQEAKIAogCiBzdGF0aWMgc3RydWN0IG1zbV9jbG9jayBtc21fY2xvY2tzW107Ci1zdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbG9jYWxfY2xvY2tfZXZlbnQ7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtc21fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSBkZXZfaWQ7Ci0JaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKQotCQlldnQgPSBsb2NhbF9jbG9ja19ldmVudDsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAqKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKiopZGV2X2lkOwogCWlmIChldnQtPmV2ZW50X2hhbmRsZXIgPT0gTlVMTCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwpAQCAtMTcxLDEzICsxNzIsNyBAQAogCQkJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJCQkuZmxhZ3MgICAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkJfSwKLQkJLmlycSA9IHsKLQkJCS5uYW1lICAgID0gImdwX3RpbWVyIiwKLQkJCS5mbGFncyAgID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJLmhhbmRsZXIgPSBtc21fdGltZXJfaW50ZXJydXB0LAotCQkJLmRldl9pZCAgPSAmbXNtX2Nsb2Nrc1swXS5jbG9ja2V2ZW50LAotCQkJLmlycSAgICAgPSBJTlRfR1BfVElNRVJfRVhQCi0JCX0sCisJCS5pcnEgPSBJTlRfR1BfVElNRVJfRVhQLAogCQkuZnJlcSA9IEdQVF9IWiwKIAl9LAogCVtNU01fQ0xPQ0tfREdUXSA9IHsKQEAgLTE5NiwxMyArMTkxLDcgQEAKIAkJCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soKDMyIC0gTVNNX0RHVF9TSElGVCkpLAogCQkJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJCX0sCi0JCS5pcnEgPSB7Ci0JCQkubmFtZSAgICA9ICJkZ190aW1lciIsCi0JCQkuZmxhZ3MgICA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCS5oYW5kbGVyID0gbXNtX3RpbWVyX2ludGVycnVwdCwKLQkJCS5kZXZfaWQgID0gJm1zbV9jbG9ja3NbMV0uY2xvY2tldmVudCwKLQkJCS5pcnEgICAgID0gSU5UX0RFQlVHX1RJTUVSX0VYUAotCQl9LAorCQkuaXJxID0gSU5UX0RFQlVHX1RJTUVSX0VYUCwKIAkJLmZyZXEgPSBER1RfSFogPj4gTVNNX0RHVF9TSElGVCwKIAkJLnNoaWZ0ID0gTVNNX0RHVF9TSElGVCwKIAl9CkBAIC0yNjEsMTAgKzI1MCwzMCBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJtc21fdGltZXJfaW5pdDogY2xvY2tzb3VyY2VfcmVnaXN0ZXIgIgogCQkJICAgICAgICJmYWlsZWQgZm9yICVzXG4iLCBjcy0+bmFtZSk7CiAKLQkJcmVzID0gc2V0dXBfaXJxKGNsb2NrLT5pcnEuaXJxLCAmY2xvY2stPmlycSk7CisJCWNlLT5pcnEgPSBjbG9jay0+aXJxOworCQlpZiAoY3B1X2lzX21zbTh4NjAoKSB8fCBjcHVfaXNfbXNtODk2MCgpKSB7CisJCQljbG9jay0+cGVyY3B1X2V2dCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCQkJaWYgKCFjbG9jay0+cGVyY3B1X2V2dCkgeworCQkJCXByX2VycigibXNtX3RpbWVyX2luaXQ6IG1lbW9yeSBhbGxvY2F0aW9uICIKKwkJCQkgICAgICAgImZhaWxlZCBmb3IgJXNcbiIsIGNlLT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJKl9fdGhpc19jcHVfcHRyKGNsb2NrLT5wZXJjcHVfZXZ0KSA9IGNlOworCQkJcmVzID0gcmVxdWVzdF9wZXJjcHVfaXJxKGNlLT5pcnEsIG1zbV90aW1lcl9pbnRlcnJ1cHQsCisJCQkJCQkgY2UtPm5hbWUsIGNsb2NrLT5wZXJjcHVfZXZ0KTsKKwkJCWlmICghcmVzKQorCQkJCWVuYWJsZV9wZXJjcHVfaXJxKGNlLT5pcnEsIDApOworCQl9IGVsc2UgeworCQkJY2xvY2stPmV2dCA9IGNlOworCQkJcmVzID0gcmVxdWVzdF9pcnEoY2UtPmlycSwgbXNtX3RpbWVyX2ludGVycnVwdCwKKwkJCQkJICBJUlFGX1RJTUVSIHwgSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJCSAgY2UtPm5hbWUsICZjbG9jay0+ZXZ0KTsKKwkJfQorCiAJCWlmIChyZXMpCi0JCQlwcmludGsoS0VSTl9FUlIgIm1zbV90aW1lcl9pbml0OiBzZXR1cF9pcnEgIgotCQkJICAgICAgICJmYWlsZWQgZm9yICVzXG4iLCBjcy0+bmFtZSk7CisJCQlwcl9lcnIoIm1zbV90aW1lcl9pbml0OiByZXF1ZXN0X2lycSBmYWlsZWQgZm9yICVzXG4iLAorCQkJICAgICAgIGNlLT5uYW1lKTsKIAogCQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2UpOwogCX0KQEAgLTI3Myw2ICsyODIsNyBAQAogI2lmZGVmIENPTkZJR19TTVAKIGludCBfX2NwdWluaXQgbG9jYWxfdGltZXJfc2V0dXAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogeworCXN0YXRpYyBib29sIGxvY2FsX3RpbWVyX2luaXRlZDsKIAlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9ICZtc21fY2xvY2tzW01TTV9HTE9CQUxfVElNRVJdOwogCiAJLyogVXNlIGV4aXN0aW5nIGNsb2NrX2V2ZW50IGZvciBjcHUgMCAqLwpAQCAtMjgxLDEyICsyOTEsMTMgQEAKIAogCXdyaXRlbChER1RfQ0xLX0NUTF9ESVZfNCwgTVNNX1RNUl9CQVNFICsgREdUX0NMS19DVEwpOwogCi0JaWYgKCFsb2NhbF9jbG9ja19ldmVudCkgeworCWlmICghbG9jYWxfdGltZXJfaW5pdGVkKSB7CiAJCXdyaXRlbCgwLCBjbG9jay0+cmVnYmFzZSAgKyBUSU1FUl9FTkFCTEUpOwogCQl3cml0ZWwoMCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9DTEVBUik7CiAJCXdyaXRlbCh+MCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9NQVRDSF9WQUwpOworCQlsb2NhbF90aW1lcl9pbml0ZWQgPSB0cnVlOwogCX0KLQlldnQtPmlycSA9IGNsb2NrLT5pcnEuaXJxOworCWV2dC0+aXJxID0gY2xvY2stPmlycTsKIAlldnQtPm5hbWUgPSAibG9jYWxfdGltZXIiOwogCWV2dC0+ZmVhdHVyZXMgPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UOwogCWV2dC0+cmF0aW5nID0gY2xvY2stPmNsb2NrZXZlbnQucmF0aW5nOwpAQCAtMjk4LDE3ICszMDksMTcgQEAKIAkJY2xvY2tldmVudF9kZWx0YTJucygweGYwMDAwMDAwID4+IGNsb2NrLT5zaGlmdCwgZXZ0KTsKIAlldnQtPm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoNCwgZXZ0KTsKIAotCWxvY2FsX2Nsb2NrX2V2ZW50ID0gZXZ0OwotCi0JZ2ljX2VuYWJsZV9wcGkoY2xvY2stPmlycS5pcnEpOworCSpfX3RoaXNfY3B1X3B0cihjbG9jay0+cGVyY3B1X2V2dCkgPSBldnQ7CisJZW5hYmxlX3BlcmNwdV9pcnEoZXZ0LT5pcnEsIDApOwogCiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGV2dCk7CiAJcmV0dXJuIDA7CiB9CiAKLWlubGluZSBpbnQgbG9jYWxfdGltZXJfYWNrKHZvaWQpCit2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXJldHVybiAxOworCWV2dC0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfVU5VU0VELCBldnQpOworCWRpc2FibGVfcGVyY3B1X2lycShldnQtPmlycSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2J1ZmZhbG8td3hsLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvYnVmZmFsby13eGwtc2V0dXAuYwppbmRleCAyMGYzZjEyLi4wZTk0MjY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvYnVmZmFsby13eGwtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvYnVmZmFsby13eGwtc2V0dXAuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVEVSQVNUQVRJT05fV1hMLCAiQnVmZmFsbyBOYXMgV1hMIikKIAkvKiBNYWludGFpbmVyOiBTZWJhc3RpZW4gUmVxdWllbSA8c2ViYXN0aWVuQHJlcXVpZW0uZnI+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gd3hsX2luaXQsCiAJLm1hcF9pbwkJPSBtdjc4eHgwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG12Nzh4eDBfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9kYjc4eDAwLWJwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvZGI3OHgwMC1icC1zZXR1cC5jCmluZGV4IGRmNWFlYmUuLjUwYjg1YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9kYjc4eDAwLWJwLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2RiNzh4MDAtYnAtc2V0dXAuYwpAQCAtOTMsNyArOTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKERCNzhYMDBfQlAsICJNYXJ2ZWxsIERCLTc4eDAwLUJQIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBkYjc4eDAwX2luaXQsCiAJLm1hcF9pbwkJPSBtdjc4eHgwX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG12Nzh4eDBfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCAwNDg5MTQyLi5hN2RmMDJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9tdjc4eHgwLmg+CiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9TVY3OFhYMF9SRUdTX1BIWVNfQkFTRQogCWxkcglccnYsID1NVjc4WFgwX1JFR1NfVklSVF9CQVNFCiAJb3JyCVxycCwgXHJwLCAjMHgwMDAxMjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDhjNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW12Nzh4eDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9pcnEuYwppbmRleCAzZTI0NDMxLi5lNDIxYjcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL2lycS5jCkBAIC03LDEyICs3LDExIEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2JyaWRnZS1yZWdzLmg+CiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9tcHAuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9tcHAuYwppbmRleCA1OWI3Njg2Li5jZjRlNDk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvbXBwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL21wcC5jCkBAIC03LDEzICs3LDEyIEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8cGxhdC9tcHAuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJtcHAuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9yZDc4eDAwLW1hc2Etc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9yZDc4eDAwLW1hc2Etc2V0dXAuYwppbmRleCBkOTI3ZjE0Li5lODUyMjJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcmQ3OHgwMC1tYXNhLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3JkNzh4MDAtbWFzYS1zZXR1cC5jCkBAIC03OCw3ICs3OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkQ3OFgwMF9NQVNBLCAiTWFydmVsbCBSRC03OHgwMC1NQVNBIERldmVsb3BtZW50IEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDc4eDAwX21hc2FfaW5pdCwKIAkubWFwX2lvCQk9IG12Nzh4eDBfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gbXY3OHh4MF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXg1L0tjb25maWcKaW5kZXggYjRlN2M1OC4uYWYwYzIxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW14NS9LY29uZmlnCkBAIC0xLDggKzEsOSBAQAotaWYgQVJDSF9NWDUwMyB8fCBBUkNIX01YNTEKK2lmIEFSQ0hfTVg1CisKICMgQVJDSF9NWDUvNTAvNTMgYXJlIGxlZnQgdG8gbWFyayBwbGFjZXMgd2hlcmUgcHJldmVudCBtdWx0aS1zb2MgaW4gc2luZ2xlCiAjIGltYWdlLiBTbyBmb3IgbW9zdCB0aW1lLCBTT0NfSU1YNTAvNTEvNTMgc2hvdWxkIGJlIHVzZWQuCiAKLWNvbmZpZyBBUkNIX01YNQorY29uZmlnIEFSQ0hfTVg1MQogCWJvb2wKIAogY29uZmlnIEFSQ0hfTVg1MApAQCAtMTksNyArMjAsNiBAQAogCXNlbGVjdCBBUkNIX01YQ19JT01VWF9WMwogCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjIKIAlzZWxlY3QgQVJDSF9IQVNfQ1BVRlJFUQotCXNlbGVjdCBBUkNIX01YNQogCXNlbGVjdCBBUkNIX01YNTAKIAogY29uZmlnCVNPQ19JTVg1MQpAQCAtMzAsNyArMzAsNyBAQAogCXNlbGVjdCBBUkNIX01YQ19JT01VWF9WMwogCXNlbGVjdCBBUkNIX01YQ19BVURNVVhfVjIKIAlzZWxlY3QgQVJDSF9IQVNfQ1BVRlJFUQotCXNlbGVjdCBBUkNIX01YNQorCXNlbGVjdCBBUkNIX01YNTEKIAogY29uZmlnCVNPQ19JTVg1MwogCWJvb2wKQEAgLTM4LDEwICszOCw4IEBACiAJc2VsZWN0IEFSTV9MMV9DQUNIRV9TSElGVF82CiAJc2VsZWN0IE1YQ19UWklDCiAJc2VsZWN0IEFSQ0hfTVhDX0lPTVVYX1YzCi0Jc2VsZWN0IEFSQ0hfTVg1CiAJc2VsZWN0IEFSQ0hfTVg1MwogCi1pZiBBUkNIX01YNTBfU1VQUE9SVEVECiAjY29tbWVudCAiaS5NWDUwIG1hY2hpbmVzOiIKIAogY29uZmlnIE1BQ0hfTVg1MF9SRFAKQEAgLTUyLDIyICs1MCwyOSBAQAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TREhDSV9FU0RIQ19JTVgKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAotCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9GRUMKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIE1YNTAgcmVmZXJlbmNlIGRlc2lnbiBwbGF0Zm9ybSAoUkRQKSBib2FyZC4gVGhpcwogCSAgaW5jbHVkZXMgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgogCi1lbmRpZiAjIEFSQ0hfTVg1MF9TVVBQT1JURUQKLQotaWYgQVJDSF9NWDUxCiBjb21tZW50ICJpLk1YNTEgbWFjaGluZXM6IgogCitjb25maWcgTUFDSF9JTVg1MV9EVAorCWJvb2wgIlN1cHBvcnQgaS5NWDUxIHBsYXRmb3JtcyBmcm9tIGRldmljZSB0cmVlIgorCXNlbGVjdCBTT0NfSU1YNTEKKwlzZWxlY3QgVVNFX09GCisJc2VsZWN0IE1BQ0hfTVg1MV9CQUJCQUdFCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBGcmVlc2NhbGUgaS5NWDUxIGJhc2VkIHBsYXRmb3JtcworCSAgdXNpbmcgdGhlIGRldmljZSB0cmVlIGZvciBkaXNjb3ZlcnkKKwogY29uZmlnIE1BQ0hfTVg1MV9CQUJCQUdFCiAJYm9vbCAiU3VwcG9ydCBNWDUxIEJBQkJBR0UgcGxhdGZvcm1zIgogCXNlbGVjdCBTT0NfSU1YNTEKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fRlNMX1VTQjJfVURDCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWDJfV0RUCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX0VIQ0kKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU0RIQ0lfRVNESENfSU1YCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgKIAloZWxwCkBAIC05MSw4ICs5NiwxMCBAQAogY29uZmlnIE1BQ0hfRVVLUkVBX0NQVUlNWDUxCiAJYm9vbCAiU3VwcG9ydCBFdWtyZWEgQ1BVSU1YNTEgbW9kdWxlIgogCXNlbGVjdCBTT0NfSU1YNTEKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fRlNMX1VTQjJfVURDCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX0VIQ0kKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCWhlbHAKQEAgLTExOSwxMCArMTI2LDEyIEBACiBjb25maWcgTUFDSF9FVUtSRUFfQ1BVSU1YNTFTRAogCWJvb2wgIlN1cHBvcnQgRXVrcmVhIENQVUlNWDUxU0QgbW9kdWxlIgogCXNlbGVjdCBTT0NfSU1YNTEKKwlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fRlNMX1VTQjJfVURDCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMKLQlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfRUhDSQogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9NWENfTkFORAorCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBFdWtyZWEgQ1BVSU1YNTFTRCBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcwogCSAgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUgYW5kIGl0cyBwZXJpcGhlcmFscy4KQEAgLTE0Nyw2ICsxNTYsOCBAQAogCWJvb2wKIAlzZWxlY3QgU09DX0lNWDUxCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0lNWF9VQVJUCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX01YQ19FSENJCisJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1BBVEFfSU1YCiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX1NESENJX0VTREhDX0lNWAogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9TUElfSU1YCiAJc2VsZWN0IE1YQ19VTFBJIGlmIFVTQl9VTFBJCkBAIC0xNjcsMTEgKzE3OCwyMCBAQAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBHZW5lc2kgRWZpa2EgU21hcnRib29rLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCiAJICBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGJvYXJkIGFuZCBpdHMgcGVyaXBoZXJhbHMuCiAKLWVuZGlmICMgQVJDSF9NWDUxCi0KLWlmIEFSQ0hfTVg1M19TVVBQT1JURUQKIGNvbW1lbnQgImkuTVg1MyBtYWNoaW5lczoiCiAKK2NvbmZpZyBNQUNIX0lNWDUzX0RUCisJYm9vbCAiU3VwcG9ydCBpLk1YNTMgcGxhdGZvcm1zIGZyb20gZGV2aWNlIHRyZWUiCisJc2VsZWN0IFNPQ19JTVg1MworCXNlbGVjdCBVU0VfT0YKKwlzZWxlY3QgTUFDSF9NWDUzX0FSRAorCXNlbGVjdCBNQUNIX01YNTNfRVZLCisJc2VsZWN0IE1BQ0hfTVg1M19MT0NPCisJc2VsZWN0IE1BQ0hfTVg1M19TTUQKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIEZyZWVzY2FsZSBpLk1YNTMgYmFzZWQgcGxhdGZvcm1zCisJICB1c2luZyB0aGUgZGV2aWNlIHRyZWUgZm9yIGRpc2NvdmVyeQorCiBjb25maWcgTUFDSF9NWDUzX0VWSwogCWJvb2wgIlN1cHBvcnQgTVg1MyBFVksgcGxhdGZvcm1zIgogCXNlbGVjdCBTT0NfSU1YNTMKQEAgLTIyMSw2ICsyNDEsNCBAQAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDUzIEFSRCBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgogCi1lbmRpZiAjIEFSQ0hfTVg1M19TVVBQT1JURUQKLQogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1teDUvTWFrZWZpbGUKaW5kZXggMzgzZTdjZC4uMGZjNjA4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvTWFrZWZpbGUKQEAgLTMsOCArMyw3IEBACiAjCiAKICMgT2JqZWN0IGZpbGUgbGlzdHMuCi1vYmoteSAgIDo9IGNwdS5vIG1tLm8gY2xvY2stbXg1MS1teDUzLm8gZGV2aWNlcy5vIGVoY2kubyBzeXN0ZW0ubwotb2JqLSQoQ09ORklHX1NPQ19JTVg1MCkgKz0gbW0tbXg1MC5vCitvYmoteSAgIDo9IGNwdS5vIG1tLm8gY2xvY2stbXg1MS1teDUzLm8gZWhjaS5vIHN5c3RlbS5vCiAKIG9iai0kKENPTkZJR19QTSkgKz0gcG0taW14NS5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVFfSU1YKSAgICArPSBjcHVfb3AtbXg1MS5vCkBAIC0yMiwzICsyMSw2IEBACiBvYmotJChDT05GSUdfTUFDSF9NWDUxX0VGSUtBTVgpICs9IGJvYXJkLW14NTFfZWZpa2FteC5vCiBvYmotJChDT05GSUdfTUFDSF9NWDUxX0VGSUtBU0IpICs9IGJvYXJkLW14NTFfZWZpa2FzYi5vCiBvYmotJChDT05GSUdfTUFDSF9NWDUwX1JEUCkgKz0gYm9hcmQtbXg1MF9yZHAubworCitvYmotJChDT05GSUdfTUFDSF9JTVg1MV9EVCkgKz0gaW14NTEtZHQubworb2JqLSQoQ09ORklHX01BQ0hfSU1YNTNfRFQpICs9IGlteDUzLWR0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MS5jCmluZGV4IDY4OTM0ZWEuLjFmYzExMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTEuYwpAQCAtMjIsMjEgKzIyLDE4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ldWtyZWEtYmFzZWJvYXJkcy5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXg1MS5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAKICNkZWZpbmUgQ1BVSU1YNTFfVVNCSDFfU1RQCUlNWF9HUElPX05SKDEsIDI3KQogI2RlZmluZSBDUFVJTVg1MV9RVUFSVEFfR1BJTwlJTVhfR1BJT19OUigzLCAyOCkKQEAgLTU3LDcgKzU0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKIAl7CiAJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YNTFfQ1MxX0JBU0VfQUREUiArIDB4NDAwMDAwKSwKLQkJLmlycSA9IGdwaW9fdG9faXJxKENQVUlNWDUxX1FVQVJUQV9HUElPKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShDUFVJTVg1MV9RVUFSVEFfR1BJTyksCiAJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAogCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCiAJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULApAQCAtNjUsNyArNjIsNyBAQAogCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKIAl9LCB7CiAJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YNTFfQ1MxX0JBU0VfQUREUiArIDB4ODAwMDAwKSwKLQkJLmlycSA9IGdwaW9fdG9faXJxKENQVUlNWDUxX1FVQVJUQl9HUElPKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShDUFVJTVg1MV9RVUFSVEJfR1BJTyksCiAJCS5pcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdILAogCQkudWFydGNsayA9IENQVUlNWDUxX1FVQVJUX1hUQUwsCiAJCS5yZWdzaGlmdCA9IENQVUlNWDUxX1FVQVJUX1JFR1NISUZULApAQCAtNzMsNyArNzAsNyBAQAogCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKIAl9LCB7CiAJCS5tYXBiYXNlID0gKHVuc2lnbmVkIGxvbmcpKE1YNTFfQ1MxX0JBU0VfQUREUiArIDB4MTAwMDAwMCksCi0JCS5pcnEgPSBncGlvX3RvX2lycShDUFVJTVg1MV9RVUFSVENfR1BJTyksCisJCS5pcnEgPSBJTVhfR1BJT19UT19JUlEoQ1BVSU1YNTFfUVVBUlRDX0dQSU8pLAogCQkuaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCwKIAkJLnVhcnRjbGsgPSBDUFVJTVg1MV9RVUFSVF9YVEFMLAogCQkucmVnc2hpZnQgPSBDUFVJTVg1MV9RVUFSVF9SRUdTSElGVCwKQEAgLTgxLDcgKzc4LDcgQEAKIAkJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0lPUkVNQVAsCiAJfSwgewogCQkubWFwYmFzZSA9ICh1bnNpZ25lZCBsb25nKShNWDUxX0NTMV9CQVNFX0FERFIgKyAweDIwMDAwMDApLAotCQkuaXJxID0gZ3Bpb190b19pcnEoQ1BVSU1YNTFfUVVBUlREX0dQSU8pLAorCQkuaXJxID0gSU1YX0dQSU9fVE9fSVJRKENQVUlNWDUxX1FVQVJURF9HUElPKSwKIAkJLmlycWZsYWdzID0gSVJRRl9UUklHR0VSX0hJR0gsCiAJCS51YXJ0Y2xrID0gQ1BVSU1YNTFfUVVBUlRfWFRBTCwKIAkJLnJlZ3NoaWZ0ID0gQ1BVSU1YNTFfUVVBUlRfUkVHU0hJRlQsCkBAIC0xNjcsNyArMTY0LDcgQEAKIAl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOwogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKIAotCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9VU0JfT1RHX0JBU0VfQUREUiwgU1pfNEspOwogCWlmICghdXNiX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCXVzYm90aGVyX2Jhc2UgPSB1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVDsKQEAgLTE5MCw3ICsxODcsNyBAQAogCXZvaWQgX19pb21lbSAqdXNiX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXNib3RoZXJfYmFzZSA9IHVzYl9iYXNlICsgTVg1X1VTQk9USEVSX1JFR1NfT0ZGU0VUOwpAQCAtMjA2LDE3ICsyMDMsMTcgQEAKIAkJCU1YQ19FSENJX0lUQ19OT19USFJFU0hPTEQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgZHJfdXRtaV9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgZHJfdXRtaV9jb25maWcgX19pbml0Y29uc3QgPSB7CiAJLmluaXQJCT0gaW5pdGlhbGl6ZV9vdGdfcG9ydCwKIAkucG9ydHNjCT0gTVhDX0VIQ0lfVVRNSV8xNkJJVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JfcGRhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgdXNiX3BkYXRhIF9faW5pdGNvbnN0ID0gewogCS5vcGVyYXRpbmdfbW9kZQk9IEZTTF9VU0IyX0RSX0RFVklDRSwKIAkucGh5X21vZGUJPSBGU0xfVVNCMl9QSFlfVVRNSV9XSURFLAogfTsKIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMV9jb25maWcgX19pbml0Y29uc3QgPSB7CiAJLmluaXQJCT0gaW5pdGlhbGl6ZV91c2JoMV9wb3J0LAogCS5wb3J0c2MJPSBNWENfRUhDSV9NT0RFX1VMUEksCiB9OwpAQCAtMjcwLDEyICsyNjcsMTIgQEAKIAkJCQlBUlJBWV9TSVpFKGV1a3JlYV9jcHVpbXg1MV9pMmNfZGV2aWNlcykpOwogCiAJaWYgKG90Z19tb2RlX2hvc3QpCi0JCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2Jkcl9ob3N0X2RldmljZSwgJmRyX3V0bWlfY29uZmlnKTsKKwkJaW14NTFfYWRkX214Y19laGNpX290ZygmZHJfdXRtaV9jb25maWcpOwogCWVsc2UgewogCQlpbml0aWFsaXplX290Z19wb3J0KE5VTEwpOwotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfdWRjX2RldmljZSwgJnVzYl9wZGF0YSk7CisJCWlteDUxX2FkZF9mc2xfdXNiMl91ZGMoJnVzYl9wZGF0YSk7CiAJfQotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMV9kZXZpY2UsICZ1c2JoMV9jb25maWcpOworCWlteDUxX2FkZF9teGNfZWhjaV9ocygxLCAmdXNiaDFfY29uZmlnKTsKIAogI2lmZGVmIENPTkZJR19NQUNIX0VVS1JFQV9NQklNWDUxX0JBU0VCT0FSRAogCWV1a3JlYV9tYmlteDUxX2Jhc2Vib2FyZF9pbml0KCk7CkBAIC0yOTMsMTAgKzI5MCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKEVVS1JFQV9DUFVJTVg1MSwgIkV1a3JlYSBDUFVJTVg1MSBNb2R1bGUiKQogCS8qIE1haW50YWluZXI6IEVyaWMgQsOpbmFyZCA8ZXJpY0BldWtyZWEuY29tPiAqLwotCS5ib290X3BhcmFtcyA9IE1YNTFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXg1MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteGNfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IGV1a3JlYV9jcHVpbXg1MV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxc2QuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLWNwdWlteDUxc2QuYwppbmRleCBmZjA5NmQ1Li41MmExMWMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1jcHVpbXg1MXNkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtY3B1aW14NTFzZC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9wbGF0Zm9ybS9tY3AyNTF4Lmg+CkBAIC0zMiwxNCArMzEsMTIgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC1teDUxLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXg1MS5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKICNpbmNsdWRlICJjcHVfb3AtbXg1MS5oIgogCiAjZGVmaW5lIFVTQkgxX1JTVAkJSU1YX0dQSU9fTlIoMiwgMjgpCkBAIC0xMDgsNyArMTA1LDcgQEAKIAogCS8qIFRvdWNoc2NyZWVuICovCiAJLyogSVJRICovCi0JX01YNTFfUEFEX0dQSU9fTkFORF9fR1BJT19OQU5EIHwgTVVYX1BBRF9DVFJMKFBBRF9DVExfUFVTXzIyS19VUCB8CisJTkVXX1BBRF9DVFJMKE1YNTFfUEFEX0dQSU9fTkFORF9fR1BJT19OQU5ELCBQQURfQ1RMX1BVU18yMktfVVAgfAogCQkJUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1NSRV9GQVNUIHwKIAkJCVBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVRSB8IFBBRF9DVExfSFlTKSwKIH07CkBAIC0xMjksNyArMTI2LDcgQEAKIAkJSTJDX0JPQVJEX0lORk8oInRzYzIwMDciLCAweDQ5KSwKIAkJLnR5cGUJCT0gInRzYzIwMDciLAogCQkucGxhdGZvcm1fZGF0YQk9ICZ0c2MyMDA3X2luZm8sCi0JCS5pcnEJCT0gZ3Bpb190b19pcnEoVFNDMjAwN19JUlFHUElPKSwKKwkJLmlycQkJPSBJTVhfR1BJT19UT19JUlEoVFNDMjAwN19JUlFHUElPKSwKIAl9LAogfTsKIApAQCAtMTQ5LDcgKzE0Niw3IEBACiAJdm9pZCBfX2lvbWVtICp1c2JfYmFzZTsKIAl2b2lkIF9faW9tZW0gKnVzYm90aGVyX2Jhc2U7CiAKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlpZiAoIXVzYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAl1c2JvdGhlcl9iYXNlID0gdXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQ7CkBAIC0xNzIsNyArMTY5LDcgQEAKIAl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOwogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKIAotCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX09UR19CQVNFX0FERFIsIFNaXzRLKTsKKwl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9VU0JfT1RHX0JBU0VfQUREUiwgU1pfNEspOwogCWlmICghdXNiX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCXVzYm90aGVyX2Jhc2UgPSB1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVDsKQEAgLTE4OSwxNyArMTg2LDE3IEBACiAJCQlNWENfRUhDSV9JVENfTk9fVEhSRVNIT0xEKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnIF9faW5pdGNvbnN0ID0gewogCS5pbml0CQk9IGluaXRpYWxpemVfb3RnX3BvcnQsCiAJLnBvcnRzYwk9IE1YQ19FSENJX1VUTUlfMTZCSVQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZzbF91c2IyX3BsYXRmb3JtX2RhdGEgdXNiX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkub3BlcmF0aW5nX21vZGUJPSBGU0xfVVNCMl9EUl9ERVZJQ0UsCiAJLnBoeV9tb2RlCT0gRlNMX1VTQjJfUEhZX1VUTUlfV0lERSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSB1c2JoMV9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnIF9faW5pdGNvbnN0ID0gewogCS5pbml0CQk9IGluaXRpYWxpemVfdXNiaDFfcG9ydCwKIAkucG9ydHNjCT0gTVhDX0VIQ0lfTU9ERV9VTFBJLAogfTsKQEAgLTI0NSw3ICsyNDIsNyBAQAogCQkubW9kZQkJPSBTUElfTU9ERV8wLAogCQkuY2hpcF9zZWxlY3QgICAgID0gMCwKIAkJLnBsYXRmb3JtX2RhdGEgICA9ICZtY3AyNTF4X2luZm8sCi0JCS5pcnEgICAgICAgICAgICAgPSBncGlvX3RvX2lycShDQU5fSVJRR1BJTykKKwkJLmlycSAgICAgICAgICAgICA9IElNWF9HUElPX1RPX0lSUShDQU5fSVJRR1BJTykKIAl9LAogfTsKIApAQCAtMzAzLDE3ICszMDAsMTcgQEAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwbGF0Zm9ybV9kZXZpY2VzLCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpKTsKIAogCWlmIChvdGdfbW9kZV9ob3N0KQotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfaG9zdF9kZXZpY2UsICZkcl91dG1pX2NvbmZpZyk7CisJCWlteDUxX2FkZF9teGNfZWhjaV9vdGcoJmRyX3V0bWlfY29uZmlnKTsKIAllbHNlIHsKIAkJaW5pdGlhbGl6ZV9vdGdfcG9ydChOVUxMKTsKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX3VkY19kZXZpY2UsICZ1c2JfcGRhdGEpOworCQlpbXg1MV9hZGRfZnNsX3VzYjJfdWRjKCZ1c2JfcGRhdGEpOwogCX0KIAogCWdwaW9fcmVxdWVzdChVU0JIMV9SU1QsICJ1c2JfcnN0Iik7CiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFVTQkgxX1JTVCwgMCk7CiAJbXNsZWVwKDIwKTsKIAlncGlvX3NldF92YWx1ZShVU0JIMV9SU1QsIDEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMV9kZXZpY2UsICZ1c2JoMV9jb25maWcpOworCWlteDUxX2FkZF9teGNfZWhjaV9ocygxLCAmdXNiaDFfY29uZmlnKTsKIAogI2lmZGVmIENPTkZJR19NQUNIX0VVS1JFQV9NQklNWFNENTFfQkFTRUJPQVJECiAJZXVrcmVhX21iaW14c2Q1MV9iYXNlYm9hcmRfaW5pdCgpOwpAQCAtMzMxLDEwICszMjgsMTEgQEAKIAogTUFDSElORV9TVEFSVChFVUtSRUFfQ1BVSU1YNTFTRCwgIkV1a3JlYSBDUFVJTVg1MVNEIikKIAkvKiBNYWludGFpbmVyOiBFcmljIELDqW5hcmQgPGVyaWNAZXVrcmVhLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMgPSBNWDUxX1BIWVNfT0ZGU0VUICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IG14NTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUxX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTFfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXhjX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBldWtyZWFfY3B1aW14NTFzZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTBfcmRwLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUwX3JkcC5jCmluZGV4IDdkZTI1YzYuLmZjMzYyMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTBfcmRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MF9yZHAuYwpAQCAtMjE5LDYgKzIxOSw3IEBACiAJLm1hcF9pbyA9IG14NTBfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUwX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTBfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1MF9yZHBfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTBfcmRwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV8zZHMuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfM2RzLmMKaW5kZXggMDdhMzgxNS4uMDU3ODM5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxXzNkcy5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bWFjaC8zZHNfZGVidWdib2FyZC5oPgogCiAjaW5jbHVkZSAiZGV2aWNlcy1pbXg1MS5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKIAogI2RlZmluZSBFWFBJT19QQVJFTlRfSU5UCWdwaW9fdG9faXJxKElNWF9HUElPX05SKDEsIDYpKQogI2RlZmluZSBNWDUxXzNEU19FQ1NQSTJfQ1MJKEdQSU9fUE9SVEMgKyAyOCkKQEAgLTE2OSwxMCArMTY4LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVg1MV8zRFMsICJGcmVlc2NhbGUgTVg1MSAzLVN0YWNrIEJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwotCS5ib290X3BhcmFtcyA9IE1YNTFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXg1MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUxXzNkc190aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXg1MV8zZHNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IDExYjBmZjYuLjVjODM3NjAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYwpAQCAtMjQsMTQgKzI0LDEyIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXg1MS5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAjaW5jbHVkZSAiY3B1X29wLW14NTEuaCIKIAogI2RlZmluZSBCQUJCQUdFX1VTQl9IVUJfUkVTRVQJSU1YX0dQSU9fTlIoMSwgNykKQEAgLTE3Niw3ICsxNzQsNyBAQAogCS5iaXRyYXRlID0gMTAwMDAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSBiYWJiYWdlX2hzaTJjX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIGJhYmJhZ2VfaHNpMmNfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuYml0cmF0ZSA9IDQwMDAwMCwKIH07CiAKQEAgLTI0OSw3ICsyNDcsNyBAQAogCXZvaWQgX19pb21lbSAqdXNiX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJdXNib3RoZXJfYmFzZSA9IHVzYl9iYXNlICsgTVg1X1VTQk9USEVSX1JFR1NfT0ZGU0VUOwpAQCAtMjcyLDcgKzI3MCw3IEBACiAJdm9pZCBfX2lvbWVtICp1c2JfYmFzZTsKIAl2b2lkIF9faW9tZW0gKnVzYm90aGVyX2Jhc2U7CiAKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlpZiAoIXVzYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAl1c2JvdGhlcl9iYXNlID0gdXNiX2Jhc2UgKyBNWDVfVVNCT1RIRVJfUkVHU19PRkZTRVQ7CkBAIC0yODgsMTcgKzI4NiwxNyBAQAogCQkJTVhDX0VIQ0lfSVRDX05PX1RIUkVTSE9MRCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhjX3VzYmhfcGxhdGZvcm1fZGF0YSBkcl91dG1pX2NvbmZpZyBfX2luaXRjb25zdCA9IHsKIAkuaW5pdAkJPSBpbml0aWFsaXplX290Z19wb3J0LAogCS5wb3J0c2MJPSBNWENfRUhDSV9VVE1JXzE2QklULAogfTsKIAotc3RhdGljIHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhIHVzYl9wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX3VzYjJfcGxhdGZvcm1fZGF0YSB1c2JfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLm9wZXJhdGluZ19tb2RlCT0gRlNMX1VTQjJfRFJfREVWSUNFLAogCS5waHlfbW9kZQk9IEZTTF9VU0IyX1BIWV9VVE1JX1dJREUsCiB9OwogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyBfX2luaXRjb25zdCA9IHsKIAkuaW5pdAkJPSBpbml0aWFsaXplX3VzYmgxX3BvcnQsCiAJLnBvcnRzYwk9IE1YQ19FSENJX01PREVfVUxQSSwKIH07CkBAIC0zNTEsMjIgKzM0OSwyNyBAQAogCS53cF90eXBlID0gRVNESENfV1BfR1BJTywKIH07CiAKK3ZvaWQgX19pbml0IGlteDUxX2JhYmJhZ2VfY29tbW9uX2luaXQodm9pZCkKK3sKKwlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUxYmFiYmFnZV9wYWRzLAorCQkJCQkgQVJSQVlfU0laRShteDUxYmFiYmFnZV9wYWRzKSk7Cit9CisKIC8qCiAgKiBCb2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IG14NTFfYmFiYmFnZV9pbml0KHZvaWQpCiB7CiAJaW9tdXhfdjNfY2ZnX3QgdXNiaDFzdHAgPSBNWDUxX1BBRF9VU0JIMV9TVFBfX1VTQkgxX1NUUDsKLQlpb211eF92M19jZmdfdCBwb3dlcl9rZXkgPSBfTVg1MV9QQURfRUlNX0EyN19fR1BJTzJfMjEgfAotCQlNVVhfUEFEX0NUUkwoUEFEX0NUTF9TUkVfRkFTVCB8IFBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVU18xMDBLX1VQKTsKKwlpb211eF92M19jZmdfdCBwb3dlcl9rZXkgPSBORVdfUEFEX0NUUkwoTVg1MV9QQURfRUlNX0EyN19fR1BJTzJfMjEsCisJCVBBRF9DVExfU1JFX0ZBU1QgfCBQQURfQ1RMX0RTRV9ISUdIIHwgUEFEX0NUTF9QVVNfMTAwS19VUCk7CiAKIAlpbXg1MV9zb2NfaW5pdCgpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfSU1YKQogCWdldF9jcHVfb3AgPSBteDUxX2dldF9jcHVfb3A7CiAjZW5kaWYKLQlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUxYmFiYmFnZV9wYWRzLAotCQkJCQlBUlJBWV9TSVpFKG14NTFiYWJiYWdlX3BhZHMpKTsKKwlpbXg1MV9iYWJiYWdlX2NvbW1vbl9pbml0KCk7CiAKIAlpbXg1MV9hZGRfaW14X3VhcnQoMCwgJnVhcnRfcGRhdGEpOwogCWlteDUxX2FkZF9pbXhfdWFydCgxLCBOVUxMKTsKQEAgLTM4MSwxNyArMzg0LDE3IEBACiAKIAlpbXg1MV9hZGRfaW14X2kyYygwLCAmYmFiYmFnZV9pMmNfZGF0YSk7CiAJaW14NTFfYWRkX2lteF9pMmMoMSwgJmJhYmJhZ2VfaTJjX2RhdGEpOwotCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y19oc2kyY19kZXZpY2UsICZiYWJiYWdlX2hzaTJjX2RhdGEpOworCWlteDUxX2FkZF9oc2kyYygmYmFiYmFnZV9oc2kyY19kYXRhKTsKIAogCWlmIChvdGdfbW9kZV9ob3N0KQotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfaG9zdF9kZXZpY2UsICZkcl91dG1pX2NvbmZpZyk7CisJCWlteDUxX2FkZF9teGNfZWhjaV9vdGcoJmRyX3V0bWlfY29uZmlnKTsKIAllbHNlIHsKIAkJaW5pdGlhbGl6ZV9vdGdfcG9ydChOVUxMKTsKLQkJbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmRyX3VkY19kZXZpY2UsICZ1c2JfcGRhdGEpOworCQlpbXg1MV9hZGRfZnNsX3VzYjJfdWRjKCZ1c2JfcGRhdGEpOwogCX0KIAogCWdwaW9fdXNiaDFfYWN0aXZlKCk7Ci0JbXhjX3JlZ2lzdGVyX2RldmljZSgmbXhjX3VzYmgxX2RldmljZSwgJnVzYmgxX2NvbmZpZyk7CisJaW14NTFfYWRkX214Y19laGNpX2hzKDEsICZ1c2JoMV9jb25maWcpOwogCS8qIHNldGJhY2sgVVNCSDFfU1RQIHRvIGJlIGZ1bmN0aW9uICovCiAJbXhjX2lvbXV4X3YzX3NldHVwX3BhZCh1c2JoMXN0cCk7CiAJYmFiYmFnZV91c2JodWJfcmVzZXQoKTsKQEAgLTQxNiwxMCArNDE5LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVg1MV9CQUJCQUdFLCAiRnJlZXNjYWxlIE1YNTEgQmFiYmFnZSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogQW1pdCBLdWNoZXJpYSA8YW1pdC5rdWNoZXJpYUBjYW5vbmljYWwuY29tPiAqLwotCS5ib290X3BhcmFtcyA9IE1YNTFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXg1MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1MV9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUxX2JhYmJhZ2VfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTFfYmFiYmFnZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfZWZpa2FteC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYW14LmMKaW5kZXggNTUxZGFmOC4uYTllNDg2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYW14LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYW14LmMKQEAgLTMyLDE0ICszMiwxMiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lvbXV4LW14NTEuaD4KIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogI2luY2x1ZGUgImVmaWthLmgiCiAKICNkZWZpbmUgRUZJS0FNWF9QQ0JJRDAJCUlNWF9HUElPX05SKDMsIDE2KQpAQCAtMTYzLDYgKzE2MSwxMSBAQAogCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUobXg1MV9lZmlrYW14X2xlZHMpLAogfTsKIAorc3RhdGljIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHNkX3BkYXRhID0geworCS5jZF90eXBlID0gRVNESENfQ0RfQ09OVFJPTExFUiwKKwkud3BfdHlwZSA9IEVTREhDX1dQX0NPTlRST0xMRVIsCit9OworCiBzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbXg1MV9lZmlrYW14X3Bvd2Vya2V5W10gPSB7CiAJewogCQkuY29kZSA9IEtFWV9QT1dFUiwKQEAgLTIzOSw5ICsyNDIsMTEgQEAKIAogCS8qIG9uIDwgMS4yIGJvYXJkcyBib3RoIFNEIGNvbnRyb2xsZXJzIGFyZSB1c2VkICovCiAJaWYgKHN5c3RlbV9yZXYgPCAweDEyKSB7Ci0JCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMSwgTlVMTCk7CisJCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgTlVMTCk7CisJCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMSwgJnNkX3BkYXRhKTsKIAkJbXg1MV9lZmlrYW14X2xlZHNbMl0uZGVmYXVsdF90cmlnZ2VyID0gIm1tYzEiOwotCX0KKwl9IGVsc2UKKwkJaW14NTFfYWRkX3NkaGNpX2VzZGhjX2lteCgwLCAmc2RfcGRhdGEpOwogCiAJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKC0xLCAmbXg1MV9lZmlrYW14X2xlZHNfZGF0YSk7CiAJaW14X2FkZF9ncGlvX2tleXMoJm14NTFfZWZpa2FteF9wb3dlcmtleV9kYXRhKTsKQEAgLTI4MCwxMCArMjg1LDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoTVg1MV9FRklLQU1YLCAiR2VuZXNpIEVmaWthTVggbmV0dG9wIikKIAkvKiBNYWludGFpbmVyOiBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQGxpbmFyby5vcmc+ICovCi0JLmJvb3RfcGFyYW1zID0gTVg1MV9QSFlTX09GRlNFVCArIDB4MTAwLAorCS5hdGFnX29mZnNldCA9IDB4MTAwLAogCS5tYXBfaW8gPSBteDUxX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDUxX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXg1MV9pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDUxX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14NTFfZWZpa2FteF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXg1MV9lZmlrYW14X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9lZmlrYXNiLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthc2IuYwppbmRleCA4YTliY2EyLi4zOGM0YTNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthc2IuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2VmaWthc2IuYwpAQCAtMzUsMTQgKzM1LDEyIEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXg1MS5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAjaW5jbHVkZSAiZWZpa2EuaCIKIAogI2RlZmluZSBFRklLQVNCX1VTQkgyX1NUUAlJTVhfR1BJT19OUigyLCAyMCkKQEAgLTU2LDYgKzU0LDcgQEAKICNkZWZpbmUgRUZJS0FTQl9SRktJTEwJCUlNWF9HUElPX05SKDMsIDEpCiAKICNkZWZpbmUgTVg1MV9QQURfUFdSS0VZIElPTVVYX1BBRCgweDQ4YywgMHgwZjgsIDEsIDB4MCwgICAwLCBQQURfQ1RMX1BVU18xMDBLX1VQIHwgUEFEX0NUTF9QS0UpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DRAlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCAxLCBfX05BXywgMCwgTVg1MV9FU0RIQ19QQURfQ1RSTCkKIAogc3RhdGljIGlvbXV4X3YzX2NmZ190IG14NTFlZmlrYXNiX3BhZHNbXSA9IHsKIAkvKiBVU0IgSE9TVDIgKi8KQEAgLTk3LDYgKzk2LDggQEAKIAogCS8qIEJUICovCiAJTVg1MV9QQURfRUlNX0ExN19fR1BJTzJfMTEsCisKKwlNWDUxX1BBRF9TRDFfQ0QsCiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVfdXNiaDJfcG9ydChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTE5LDcgKzEyMCw3IEBACiAJcmV0dXJuIG14NTFfaW5pdGlhbGl6ZV91c2JfaHcocGRldi0+aWQsIE1YQ19FSENJX0lUQ19OT19USFJFU0hPTEQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDJfY29uZmlnID0geworc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgyX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS5pbml0ICAgPSBpbml0aWFsaXplX3VzYmgyX3BvcnQsCiAJLnBvcnRzYyA9IE1YQ19FSENJX01PREVfVUxQSSwKIH07CkBAIC0xMjksNyArMTMwLDcgQEAKIAl1c2JoMl9jb25maWcub3RnID0gaW14X290Z191bHBpX2NyZWF0ZShVTFBJX09UR19EUlZWQlVTIHwKIAkJCVVMUElfT1RHX0RSVlZCVVNfRVhUIHwgVUxQSV9PVEdfRVhUVkJVU0lORCk7CiAJaWYgKHVzYmgyX2NvbmZpZy5vdGcpCi0JCW14Y19yZWdpc3Rlcl9kZXZpY2UoJm14Y191c2JoMl9kZXZpY2UsICZ1c2JoMl9jb25maWcpOworCQlpbXg1MV9hZGRfbXhjX2VoY2lfaHMoMiwgJnVzYmgyX2NvbmZpZyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19sZWQgbXg1MV9lZmlrYXNiX2xlZHNbXSBfX2luaXRjb25zdCA9IHsKQEAgLTE4Miw2ICsxODMsMTggQEAKIAkubmJ1dHRvbnMgPSBBUlJBWV9TSVpFKG14NTFfZWZpa2FzYl9rZXlzKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBzZDBfcGRhdGEgPSB7CisjZGVmaW5lIEVGSUtBU0JfU0QxX0NECUlNWF9HUElPX05SKDIsIDI3KQorCS5jZF9ncGlvID0gRUZJS0FTQl9TRDFfQ0QsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfQ09OVFJPTExFUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBzZDFfcGRhdGEgPSB7CisJLmNkX3R5cGUgPSBFU0RIQ19DRF9DT05UUk9MTEVSLAorCS53cF90eXBlID0gRVNESENfV1BfQ09OVFJPTExFUiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpwd2d0MSwgKnB3Z3QyOwogCiBzdGF0aWMgdm9pZCBteDUxX2VmaWthc2JfcG93ZXJfb2ZmKHZvaWQpCkBAIC0yNTAsNyArMjYzLDggQEAKIAogCW14NTFfZWZpa2FzYl9ib2FyZF9pZCgpOwogCW14NTFfZWZpa2FzYl91c2IoKTsKLQlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDEsIE5VTEwpOworCWlteDUxX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgJnNkMF9wZGF0YSk7CisJaW14NTFfYWRkX3NkaGNpX2VzZGhjX2lteCgxLCAmc2QxX3BkYXRhKTsKIAogCWdwaW9fbGVkX3JlZ2lzdGVyX2RldmljZSgtMSwgJm14NTFfZWZpa2FzYl9sZWRzX2RhdGEpOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZteDUxX2VmaWthc2Jfa2V5c19kYXRhKTsKQEAgLTI2NiwxMCArMjgwLDExIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKE1YNTFfRUZJS0FTQiwgIkdlbmVzaSBFZmlrYSBTbWFydGJvb2siKQotCS5ib290X3BhcmFtcyA9IE1YNTFfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gbXg1MV9tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1MV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTFfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1MV9oYW5kbGVfaXJxLAogCS5pbml0X21hY2hpbmUgPSAgZWZpa2FzYl9ib2FyZF9pbml0LAogCS50aW1lciA9ICZteDUxX2VmaWthc2JfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfYXJkLmMKaW5kZXggNzZhNjdjNC4uMGQ3ZjBmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2FyZC5jCkBAIC0xMzQsOCArMTM0LDggQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7Ci0JCS5zdGFydCA9ICBncGlvX3RvX2lycShBUkRfRVRIRVJORVRfSU5UX0IpLAotCQkuZW5kID0gIGdwaW9fdG9faXJxKEFSRF9FVEhFUk5FVF9JTlRfQiksCisJCS5zdGFydCA9ICBJTVhfR1BJT19UT19JUlEoQVJEX0VUSEVSTkVUX0lOVF9CKSwKKwkJLmVuZCA9ICBJTVhfR1BJT19UT19JUlEoQVJEX0VUSEVSTkVUX0lOVF9CKSwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CkBAIC0xNzEsOSArMTcxLDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IG14NTNfYXJkX2lvX2luaXQodm9pZCkKIHsKLQlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX2FyZF9wYWRzLAotCQkJCUFSUkFZX1NJWkUobXg1M19hcmRfcGFkcykpOwotCiAJZ3Bpb19yZXF1ZXN0KEFSRF9FVEhFUk5FVF9JTlRfQiwgImV0aC1pbnQtYiIpOwogCWdwaW9fZGlyZWN0aW9uX2lucHV0KEFSRF9FVEhFUk5FVF9JTlRfQik7CiAKQEAgLTIxNiw2ICsyMTMsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBfX2luaXQgaW14NTNfYXJkX2NvbW1vbl9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19hcmRfcGFkcywKKwkJCQkJIEFSUkFZX1NJWkUobXg1M19hcmRfcGFkcykpOworCXdlaW1fY3NfY29uZmlnKCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmYXJkX3Ntc2NfbGFuOTIyMF9kZXZpY2UsCiB9OwpAQCAtMjI1LDggKzIyOSw4IEBACiAJaW14NTNfc29jX2luaXQoKTsKIAlpbXg1M19hZGRfaW14X3VhcnQoMCwgTlVMTCk7CiAKKwlpbXg1M19hcmRfY29tbW9uX2luaXQoKTsKIAlteDUzX2FyZF9pb19pbml0KCk7Ci0Jd2VpbV9jc19jb25maWcoKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAogCWlteDUzX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgJm14NTNfYXJkX3NkMV9kYXRhKTsKQEAgLTIzNCw2ICsyMzgsNyBAQAogCWlteDUzX2FkZF9pbXhfaTJjKDEsICZteDUzX2FyZF9pMmMyX2RhdGEpOwogCWlteDUzX2FkZF9pbXhfaTJjKDIsICZteDUzX2FyZF9pMmMzX2RhdGEpOwogCWlteF9hZGRfZ3Bpb19rZXlzKCZhcmRfYnV0dG9uX2RhdGEpOworCWlteDUzX2FkZF9haGNpX2lteCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXg1M19hcmRfdGltZXJfaW5pdCh2b2lkKQpAQCAtMjQ5LDYgKzI1NCw3IEBACiAJLm1hcF9pbyA9IG14NTNfbWFwX2lvLAogCS5pbml0X2Vhcmx5ID0gaW14NTNfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgPSBteDUzX2luaXRfaXJxLAorCS5oYW5kbGVfaXJxID0gaW14NTNfaGFuZGxlX2lycSwKIAkudGltZXIgPSAmbXg1M19hcmRfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTNfYXJkX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfZXZrLmMKaW5kZXggMWI0MTdiMC4uNmJlYTMxYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2V2ay5jCkBAIC0xMzEsMTIgKzEzMSwxNyBAQAogCS5udW1fY2hpcHNlbGVjdCA9IEFSUkFZX1NJWkUobXg1M19ldmtfc3BpX2NzKSwKIH07CiAKK3ZvaWQgX19pbml0IGlteDUzX2V2a19jb21tb25faW5pdCh2b2lkKQoreworCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfZXZrX3BhZHMsCisJCQkJCSBBUlJBWV9TSVpFKG14NTNfZXZrX3BhZHMpKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IG14NTNfZXZrX2JvYXJkX2luaXQodm9pZCkKIHsKIAlpbXg1M19zb2NfaW5pdCgpOworCWlteDUzX2V2a19jb21tb25faW5pdCgpOwogCi0JbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19ldmtfcGFkcywKLQkJCQkJQVJSQVlfU0laRShteDUzX2V2a19wYWRzKSk7CiAJbXg1M19ldmtfaW5pdF91YXJ0KCk7CiAJbXg1M19ldmtfZmVjX3Jlc2V0KCk7CiAJaW14NTNfYWRkX2ZlYygmbXg1M19ldmtfZmVjX3BkYXRhKTsKQEAgLTE2Nyw2ICsxNzIsNyBAQAogCS5tYXBfaW8gPSBteDUzX21hcF9pbywKIAkuaW5pdF9lYXJseSA9IGlteDUzX2luaXRfZWFybHksCiAJLmluaXRfaXJxID0gbXg1M19pbml0X2lycSwKKwkuaGFuZGxlX2lycSA9IGlteDUzX2hhbmRsZV9pcnEsCiAJLnRpbWVyID0gJm14NTNfZXZrX3RpbWVyLAogCS5pbml0X21hY2hpbmUgPSBteDUzX2V2a19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKaW5kZXggNGUxZDUxZC4uNzY3OGY3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtNDIsNiArNDMsNyBAQAogI2RlZmluZSBMT0NPX1NEM19DRAkJCUlNWF9HUElPX05SKDMsIDExKQogI2RlZmluZSBMT0NPX1NEM19XUAkJCUlNWF9HUElPX05SKDMsIDEyKQogI2RlZmluZSBMT0NPX1NEMV9DRAkJCUlNWF9HUElPX05SKDMsIDEzKQorI2RlZmluZSBMT0NPX0FDQ0VMX0VOCQkJSU1YX0dQSU9fTlIoNiwgMTQpCiAKIHN0YXRpYyBpb211eF92M19jZmdfdCBteDUzX2xvY29fcGFkc1tdID0gewogCS8qIEZFQyAqLwpAQCAtNjQsNiArNjYsMTAgQEAKIAlNWDUzX1BBRF9LRVlfUk9XMF9fQVVETVVYX0FVRDVfVFhELAogCU1YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTLAogCU1YNTNfUEFEX0tFWV9ST1cxX19BVURNVVhfQVVENV9SWEQsCisJLyogSTJDMSAqLworCU1YNTNfUEFEX0NTSTBfREFUOF9fSTJDMV9TREEsCisJTVg1M19QQURfQ1NJMF9EQVQ5X19JMkMxX1NDTCwKKwlNWDUzX1BBRF9OQU5ERl9DUzFfX0dQSU82XzE0LAkvKiBBY2NlbGVyb21ldGVyIEVuYWJsZSAqLwogCS8qIEkyQzIgKi8KIAlNWDUzX1BBRF9LRVlfQ09MM19fSTJDMl9TQ0wsCiAJTVg1M19QQURfS0VZX1JPVzNfX0kyQzJfU0RBLApAQCAtMjU3LDIyICsyNjMsNDIgQEAKIAkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKG14NTNsb2NvX2xlZHMpLAogfTsKIAordm9pZCBfX2luaXQgaW14NTNfcXNiX2NvbW1vbl9pbml0KHZvaWQpCit7CisJbXhjX2lvbXV4X3YzX3NldHVwX211bHRpcGxlX3BhZHMobXg1M19sb2NvX3BhZHMsCisJCQkJCSBBUlJBWV9TSVpFKG14NTNfbG9jb19wYWRzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gbXg1M2xvY29faTJjX2RldmljZXNbXSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJtbWE4NDUwIiwgMHgxQyksCisJfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX2xvY29fYm9hcmRfaW5pdCh2b2lkKQogeworCWludCByZXQ7CiAJaW14NTNfc29jX2luaXQoKTsKKwlpbXg1M19xc2JfY29tbW9uX2luaXQoKTsKIAotCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfbG9jb19wYWRzLAotCQkJCQlBUlJBWV9TSVpFKG14NTNfbG9jb19wYWRzKSk7CiAJaW14NTNfYWRkX2lteF91YXJ0KDAsIE5VTEwpOwogCW14NTNfbG9jb19mZWNfcmVzZXQoKTsKIAlpbXg1M19hZGRfZmVjKCZteDUzX2xvY29fZmVjX2RhdGEpOwogCWlteDUzX2FkZF9pbXgyX3dkdCgwLCBOVUxMKTsKKworCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTE9DT19BQ0NFTF9FTiwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgImFjY2VsX2VuIik7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJDYW5ub3QgcmVxdWVzdCBBQ0NFTF9FTiBwaW46ICVkXG4iLCByZXQpOworCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbXg1M2xvY29faTJjX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShteDUzbG9jb19pMmNfZGV2aWNlcykpOwogCWlteDUzX2FkZF9pbXhfaTJjKDAsICZteDUzX2xvY29faTJjX2RhdGEpOwogCWlteDUzX2FkZF9pbXhfaTJjKDEsICZteDUzX2xvY29faTJjX2RhdGEpOwogCWlteDUzX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgJm14NTNfbG9jb19zZDFfZGF0YSk7CiAJaW14NTNfYWRkX3NkaGNpX2VzZGhjX2lteCgyLCAmbXg1M19sb2NvX3NkM19kYXRhKTsKIAlpbXhfYWRkX2dwaW9fa2V5cygmbG9jb19idXR0b25fZGF0YSk7CiAJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKC0xLCAmbXg1M2xvY29fbGVkc19kYXRhKTsKKwlpbXg1M19hZGRfYWhjaV9pbXgoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG14NTNfbG9jb190aW1lcl9pbml0KHZvaWQpCkBAIC0yODgsNiArMzE0LDcgQEAKIAkubWFwX2lvID0gbXg1M19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1M19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTNfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1M19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUzX2xvY29fdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IG14NTNfbG9jb19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfc21kLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jCmluZGV4IGJjMDI4OTQuLjU5YzA4NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfc21kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19zbWQuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImRldmljZXMtaW14NTMuaCIKIAogI2RlZmluZSBTTURfRkVDX1BIWV9SU1QJCUlNWF9HUElPX05SKDcsIDYpCisjZGVmaW5lIE1YNTNfU01EX1NBVEFfUFdSX0VOICAgIElNWF9HUElPX05SKDMsIDMpCiAKIHN0YXRpYyBpb211eF92M19jZmdfdCBteDUzX3NtZF9wYWRzW10gPSB7CiAJTVg1M19QQURfQ1NJMF9EQVQxMF9fVUFSVDFfVFhEX01VWCwKQEAgLTExMSwxMiArMTEyLDMwIEBACiAJLmJpdHJhdGUgPSAxMDAwMDAsCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgbXg1M19zbWRfYWhjaV9wd3Jfb24odm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogRW5hYmxlIFNBVEEgUFdSICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShNWDUzX1NNRF9TQVRBX1BXUl9FTiwKKwkJCUdQSU9GX0RJUl9PVVQgfCBHUElPRl9JTklUX0hJR0gsICJhaGNpLXNhdGEtcHdyIik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBlbmFibGUgU0FUQV9QV1JfRU46ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkIF9faW5pdCBpbXg1M19zbWRfY29tbW9uX2luaXQodm9pZCkKK3sKKwlteGNfaW9tdXhfdjNfc2V0dXBfbXVsdGlwbGVfcGFkcyhteDUzX3NtZF9wYWRzLAorCQkJCQkgQVJSQVlfU0laRShteDUzX3NtZF9wYWRzKSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX3NtZF9ib2FyZF9pbml0KHZvaWQpCiB7CiAJaW14NTNfc29jX2luaXQoKTsKKwlpbXg1M19zbWRfY29tbW9uX2luaXQoKTsKIAotCW14Y19pb211eF92M19zZXR1cF9tdWx0aXBsZV9wYWRzKG14NTNfc21kX3BhZHMsCi0JCQkJCUFSUkFZX1NJWkUobXg1M19zbWRfcGFkcykpOwogCW14NTNfc21kX2luaXRfdWFydCgpOwogCW14NTNfc21kX2ZlY19yZXNldCgpOwogCWlteDUzX2FkZF9mZWMoJm14NTNfc21kX2ZlY19kYXRhKTsKQEAgLTEyNSw2ICsxNDQsOCBAQAogCWlteDUzX2FkZF9zZGhjaV9lc2RoY19pbXgoMCwgTlVMTCk7CiAJaW14NTNfYWRkX3NkaGNpX2VzZGhjX2lteCgxLCBOVUxMKTsKIAlpbXg1M19hZGRfc2RoY2lfZXNkaGNfaW14KDIsIE5VTEwpOworCW14NTNfc21kX2FoY2lfcHdyX29uKCk7CisJaW14NTNfYWRkX2FoY2lfaW14KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDUzX3NtZF90aW1lcl9pbml0KHZvaWQpCkBAIC0xNDAsNiArMTYxLDcgQEAKIAkubWFwX2lvID0gbXg1M19tYXBfaW8sCiAJLmluaXRfZWFybHkgPSBpbXg1M19pbml0X2Vhcmx5LAogCS5pbml0X2lycSA9IG14NTNfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEgPSBpbXg1M19oYW5kbGVfaXJxLAogCS50aW1lciA9ICZteDUzX3NtZF90aW1lciwKIAkuaW5pdF9tYWNoaW5lID0gbXg1M19zbWRfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jCmluZGV4IGY3YmY5OTYuLjRjYjI3NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKQEAgLTEyODAsOSArMTI4MSw5IEBACiAJTlVMTCwgIE5VTEwsICZpcGdfY2xrLCAmZ3B0X2lwZ19jbGspOwogCiBERUZJTkVfQ0xPQ0socHdtMV9jbGssIDAsIE1YQ19DQ01fQ0NHUjIsIE1YQ19DQ01fQ0NHUnhfQ0c2X09GRlNFVCwKLQlOVUxMLCBOVUxMLCAmaXBnX2NsaywgTlVMTCk7CisJTlVMTCwgTlVMTCwgJmlwZ19wZXJjbGssIE5VTEwpOwogREVGSU5FX0NMT0NLKHB3bTJfY2xrLCAwLCBNWENfQ0NNX0NDR1IyLCBNWENfQ0NNX0NDR1J4X0NHOF9PRkZTRVQsCi0JTlVMTCwgTlVMTCwgJmlwZ19jbGssIE5VTEwpOworCU5VTEwsIE5VTEwsICZpcGdfcGVyY2xrLCBOVUxMKTsKIAogLyogSTJDICovCiBERUZJTkVfQ0xPQ0soaTJjMV9jbGssIDAsIE1YQ19DQ01fQ0NHUjEsIE1YQ19DQ01fQ0NHUnhfQ0c5X09GRlNFVCwKQEAgLTE0MDEsNiArMTQwMiwyMiBAQAogCS5zZWNvbmRhcnkgPSAmZXNkaGM0X2lwZ19jbGssCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBzYXRhX2NsayA9IHsKKwkucGFyZW50ID0gJmlwZ19jbGssCisJLmVuYWJsZSA9IF9jbGtfbWF4X2VuYWJsZSwKKwkuZW5hYmxlX3JlZyA9IE1YQ19DQ01fQ0NHUjQsCisJLmVuYWJsZV9zaGlmdCA9IE1YQ19DQ01fQ0NHUnhfQ0cxX09GRlNFVCwKKwkuZGlzYWJsZSA9IF9jbGtfbWF4X2Rpc2FibGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhaGNpX3BoeV9jbGsgPSB7CisJLnBhcmVudCA9ICZ1c2JfcGh5MV9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhaGNpX2RtYV9jbGsgPSB7CisJLnBhcmVudCA9ICZhaGJfY2xrLAorfTsKKwogREVGSU5FX0NMT0NLKG1pcGlfZXNjX2NsaywgMCwgTVhDX0NDTV9DQ0dSNCwgTVhDX0NDTV9DQ0dSeF9DRzVfT0ZGU0VULCBOVUxMLCBOVUxMLCBOVUxMLCAmcGxsMl9zd19jbGspOwogREVGSU5FX0NMT0NLKG1pcGlfaHNjMl9jbGssIDAsIE1YQ19DQ01fQ0NHUjQsIE1YQ19DQ01fQ0NHUnhfQ0c0X09GRlNFVCwgTlVMTCwgTlVMTCwgJm1pcGlfZXNjX2NsaywgJnBsbDJfc3dfY2xrKTsKIERFRklORV9DTE9DSyhtaXBpX2hzYzFfY2xrLCAwLCBNWENfQ0NNX0NDR1I0LCBNWENfQ0NNX0NDR1J4X0NHM19PRkZTRVQsIE5VTEwsIE5VTEwsICZtaXBpX2hzYzJfY2xrLCAmcGxsMl9zd19jbGspOwpAQCAtMTQxOCw2ICsxNDM1LDEwIEBACiBERUZJTkVfQ0xPQ0soaXB1X2RpMV9jbGssIDAsIE1YQ19DQ01fQ0NHUjYsIE1YQ19DQ01fQ0NHUnhfQ0c2X09GRlNFVCwKIAkJTlVMTCwgTlVMTCwgJnBsbDNfc3dfY2xrLCBOVUxMKTsKIAorLyogUEFUQSAqLworREVGSU5FX0NMT0NLKHBhdGFfY2xrLCAwLCBNWENfQ0NNX0NDR1I0LCBNWENfQ0NNX0NDR1J4X0NHMF9PRkZTRVQsCisJCU5VTEwsIE5VTEwsICZpcGdfY2xrLCAmc3BiYV9jbGspOworCiAjZGVmaW5lIF9SRUdJU1RFUl9DTE9DSyhkLCBuLCBjKSBcCiAgICAgICAgeyBcCiAJCS5kZXZfaWQgPSBkLCBcCkBAIC0xNDc0LDYgKzE0OTUsNyBAQAogCV9SRUdJU1RFUl9DTE9DSygiaW14LWlwdXYzIiwgImRpMCIsIGlwdV9kaTBfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWlwdXYzIiwgImRpMSIsIGlwdV9kaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BjX2R2ZnMiLCBncGNfZHZmc19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJwYXRhX2lteCIsIE5VTEwsIHBhdGFfY2xrKQogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIG14NTNfbG9va3Vwc1tdID0gewpAQCAtMTUwNyw2ICsxNTI5LDEwIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMiIsIE5VTEwsIHNzaTNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWtleXBhZCIsIE5VTEwsIGR1bW15X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInBhdGFfaW14IiwgTlVMTCwgcGF0YV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXg1My1haGNpLjAiLCAiYWhjaSIsIHNhdGFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14NTMtYWhjaS4wIiwgImFoY2lfcGh5IiwgYWhjaV9waHlfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14NTMtYWhjaS4wIiwgImFoY2lfZG1hIiwgYWhjaV9kbWFfY2xrKQogfTsKIAogc3RhdGljIHZvaWQgY2xrX3RyZWVfaW5pdCh2b2lkKQpAQCAtMTU0OCw5ICsxNTc0LDggQEAKIAljbGtfZW5hYmxlKCZtYWluX2J1c19jbGspOwogCiAJY2xrX2VuYWJsZSgmaWltX2Nsayk7Ci0JbXg1MV9yZXZpc2lvbigpOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDUxIiwgbXg1MV9yZXZpc2lvbigpKTsKIAljbGtfZGlzYWJsZSgmaWltX2Nsayk7Ci0JbXg1MV9kaXNwbGF5X3JldmlzaW9uKCk7CiAKIAkvKiBtb3ZlIHVzYl9waHlfY2xrIHRvIDI0TUh6ICovCiAJY2xrX3NldF9wYXJlbnQoJnVzYl9waHkxX2NsaywgJm9zY19jbGspOwpAQCAtMTU2OCw3ICsxNTkzLDcgQEAKIAogCS8qIFN5c3RlbSB0aW1lciAqLwogCW14Y190aW1lcl9pbml0KCZncHRfY2xrLCBNWDUxX0lPX0FERFJFU1MoTVg1MV9HUFQxX0JBU0VfQUREUiksCi0JCU1YNTFfTVhDX0lOVF9HUFQpOworCQlNWDUxX0lOVF9HUFQpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTkyLDkgKzE2MTcsOCBAQAogCWNsa19lbmFibGUoJm1haW5fYnVzX2Nsayk7CiAKIAljbGtfZW5hYmxlKCZpaW1fY2xrKTsKLQlteDUzX3JldmlzaW9uKCk7CisJaW14X3ByaW50X3NpbGljb25fcmV2KCJpLk1YNTMiLCBteDUzX3JldmlzaW9uKCkpOwogCWNsa19kaXNhYmxlKCZpaW1fY2xrKTsKLQlteDUzX2Rpc3BsYXlfcmV2aXNpb24oKTsKIAogCS8qIFNldCBTREhDIHBhcmVudHMgdG8gYmUgUExMMiAqLwogCWNsa19zZXRfcGFyZW50KCZlc2RoYzFfY2xrLCAmcGxsMl9zd19jbGspOwpAQCAtMTYwOSwzICsxNjMzLDQzIEBACiAJCU1YNTNfSU5UX0dQVCk7CiAJcmV0dXJuIDA7CiB9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyB2b2lkIF9faW5pdCBjbGtfZ2V0X2ZyZXFfZHQodW5zaWduZWQgbG9uZyAqY2tpbCwgdW5zaWduZWQgbG9uZyAqb3NjLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmNraWgxLCB1bnNpZ25lZCBsb25nICpja2loMikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJLyogcmV0cmlldmUgdGhlIGZyZXFlbmN5IG9mIGZpeGVkIGNsb2NrcyBmcm9tIGRldmljZSB0cmVlICovCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZml4ZWQtY2xvY2siKSB7CisJCXUzMiByYXRlOworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmcmF0ZSkpCisJCQljb250aW51ZTsKKworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14LWNraWwiKSkKKwkJCSpja2lsID0gcmF0ZTsKKwkJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14LW9zYyIpKQorCQkJKm9zYyA9IHJhdGU7CisJCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteC1ja2loMSIpKQorCQkJKmNraWgxID0gcmF0ZTsKKwkJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14LWNraWgyIikpCisJCQkqY2tpaDIgPSByYXRlOworCX0KK30KKworaW50IF9faW5pdCBteDUxX2Nsb2Nrc19pbml0X2R0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBja2lsLCBvc2MsIGNraWgxLCBja2loMjsKKworCWNsa19nZXRfZnJlcV9kdCgmY2tpbCwgJm9zYywgJmNraWgxLCAmY2tpaDIpOworCXJldHVybiBteDUxX2Nsb2Nrc19pbml0KGNraWwsIG9zYywgY2tpaDEsIGNraWgyKTsKK30KKworaW50IF9faW5pdCBteDUzX2Nsb2Nrc19pbml0X2R0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBja2lsLCBvc2MsIGNraWgxLCBja2loMjsKKworCWNsa19nZXRfZnJlcV9kdCgmY2tpbCwgJm9zYywgJmNraWgxLCAmY2tpaDIpOworCXJldHVybiBteDUzX2Nsb2Nrc19pbml0KGNraWwsIG9zYywgY2tpaDEsIGNraWgyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvY3B1LmMgYi9hcmNoL2FybS9tYWNoLW14NS9jcHUuYwppbmRleCA4NmY4N2RhLi41YzUzMjgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9jcHUuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotc3RhdGljIGludCBjcHVfc2lsaWNvbl9yZXYgPSAtMTsKK3N0YXRpYyBpbnQgbXg1X2NwdV9yZXYgPSAtMTsKIAogI2RlZmluZSBJSU1fU1JFViAweDI0CiAjZGVmaW5lIE1YNTBfSFdfQURBRElHX0RJR1BST0cJMHhCMApAQCAtMjgsMTEgKzI4LDE0IEBACiAJdm9pZCBfX2lvbWVtICppaW1fYmFzZSA9IE1YNTFfSU9fQUREUkVTUyhNWDUxX0lJTV9CQVNFX0FERFIpOwogCXUzMiByZXYgPSByZWFkbChpaW1fYmFzZSArIElJTV9TUkVWKSAmIDB4ZmY7CiAKLQlpZiAocmV2ID09IDB4MCkKKwlzd2l0Y2ggKHJldikgeworCWNhc2UgMHgwOgogCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fMl8wOwotCWVsc2UgaWYgKHJldiA9PSAweDEwKQorCWNhc2UgMHgxMDoKIAkJcmV0dXJuIElNWF9DSElQX1JFVklTSU9OXzNfMDsKLQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gSU1YX0NISVBfUkVWSVNJT05fVU5LTk9XTjsKKwl9CiB9CiAKIC8qCkBAIC00NSwzMyArNDgsMTMgQEAKIAlpZiAoIWNwdV9pc19teDUxKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNwdV9zaWxpY29uX3JldiA9PSAtMSkKLQkJY3B1X3NpbGljb25fcmV2ID0gZ2V0X214NTFfc3JldigpOworCWlmIChteDVfY3B1X3JldiA9PSAtMSkKKwkJbXg1X2NwdV9yZXYgPSBnZXRfbXg1MV9zcmV2KCk7CiAKLQlyZXR1cm4gY3B1X3NpbGljb25fcmV2OworCXJldHVybiBteDVfY3B1X3JldjsKIH0KIEVYUE9SVF9TWU1CT0wobXg1MV9yZXZpc2lvbik7CiAKLXZvaWQgbXg1MV9kaXNwbGF5X3JldmlzaW9uKHZvaWQpCi17Ci0JaW50IHJldjsKLQljaGFyICpzcmV2OwotCXJldiA9IG14NTFfcmV2aXNpb24oKTsKLQotCXN3aXRjaCAocmV2KSB7Ci0JY2FzZSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzA6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8yXzBfU1RSSU5HOwotCQlicmVhazsKLQljYXNlIElNWF9DSElQX1JFVklTSU9OXzNfMDoKLQkJc3JldiA9IElNWF9DSElQX1JFVklTSU9OXzNfMF9TVFJJTkc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl9VTktOT1dOX1NUUklORzsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIGlkZW50aWZpZWQgYXMgaS5NWDUxLCBzaWxpY29uIHJldiAlc1xuIiwgc3Jldik7Ci19Ci1FWFBPUlRfU1lNQk9MKG14NTFfZGlzcGxheV9yZXZpc2lvbik7Ci0KICNpZmRlZiBDT05GSUdfTkVPTgogCiAvKgpAQCAtMTIxLDEwICsxMDQsMTAgQEAKIAlpZiAoIWNwdV9pc19teDUzKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNwdV9zaWxpY29uX3JldiA9PSAtMSkKLQkJY3B1X3NpbGljb25fcmV2ID0gZ2V0X214NTNfc3JldigpOworCWlmIChteDVfY3B1X3JldiA9PSAtMSkKKwkJbXg1X2NwdV9yZXYgPSBnZXRfbXg1M19zcmV2KCk7CiAKLQlyZXR1cm4gY3B1X3NpbGljb25fcmV2OworCXJldHVybiBteDVfY3B1X3JldjsKIH0KIEVYUE9SVF9TWU1CT0wobXg1M19yZXZpc2lvbik7CiAKQEAgLTEzNCw3ICsxMTcsNyBAQAogCXUzMiByZXY7CiAKIAlpZiAoIWFuYXRvcCkgewotCQljcHVfc2lsaWNvbl9yZXYgPSAtRUlOVkFMOworCQlteDVfY3B1X3JldiA9IC1FSU5WQUw7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTU5LDM2ICsxNDIsMTMgQEAKIAlpZiAoIWNwdV9pc19teDUwKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNwdV9zaWxpY29uX3JldiA9PSAtMSkKLQkJY3B1X3NpbGljb25fcmV2ID0gZ2V0X214NTBfc3JldigpOworCWlmIChteDVfY3B1X3JldiA9PSAtMSkKKwkJbXg1X2NwdV9yZXYgPSBnZXRfbXg1MF9zcmV2KCk7CiAKLQlyZXR1cm4gY3B1X3NpbGljb25fcmV2OworCXJldHVybiBteDVfY3B1X3JldjsKIH0KIEVYUE9SVF9TWU1CT0wobXg1MF9yZXZpc2lvbik7CiAKLXZvaWQgbXg1M19kaXNwbGF5X3JldmlzaW9uKHZvaWQpCi17Ci0JaW50IHJldjsKLQljaGFyICpzcmV2OwotCXJldiA9IG14NTNfcmV2aXNpb24oKTsKLQotCXN3aXRjaCAocmV2KSB7Ci0JY2FzZSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzA6Ci0JCXNyZXYgPSBJTVhfQ0hJUF9SRVZJU0lPTl8xXzBfU1RSSU5HOwotCQlicmVhazsKLQljYXNlIElNWF9DSElQX1JFVklTSU9OXzJfMDoKLQkJc3JldiA9IElNWF9DSElQX1JFVklTSU9OXzJfMF9TVFJJTkc7Ci0JCWJyZWFrOwotCWNhc2UgSU1YX0NISVBfUkVWSVNJT05fMl8xOgotCQlzcmV2ID0gSU1YX0NISVBfUkVWSVNJT05fMl8xX1NUUklORzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc3JldiA9IElNWF9DSElQX1JFVklTSU9OX1VOS05PV05fU1RSSU5HOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJDUFUgaWRlbnRpZmllZCBhcyBpLk1YNTMsIHNpbGljb24gcmV2ICVzXG4iLCBzcmV2KTsKLX0KLUVYUE9SVF9TWU1CT0wobXg1M19kaXNwbGF5X3JldmlzaW9uKTsKLQogc3RhdGljIGludCBfX2luaXQgcG9zdF9jcHVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCByZWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLWlteDUxLmggYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLWlteDUxLmgKaW5kZXggZTExYmMwZS4uYWY0ODhiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1MS5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMtaW14NTEuaApAQCAtMTMsOSArMTMsMTUgQEAKICNkZWZpbmUgaW14NTFfYWRkX2ZlYyhwZGF0YSkJXAogCWlteF9hZGRfZmVjKCZpbXg1MV9mZWNfZGF0YSwgcGRhdGEpCiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2ZzbF91c2IyX3VkY19kYXRhIGlteDUxX2ZzbF91c2IyX3VkY19kYXRhOworI2RlZmluZSBpbXg1MV9hZGRfZnNsX3VzYjJfdWRjKHBkYXRhKQlcCisJaW14X2FkZF9mc2xfdXNiMl91ZGMoJmlteDUxX2ZzbF91c2IyX3VkY19kYXRhLCBwZGF0YSkKKwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfaW14X2kyY19kYXRhIGlteDUxX2lteF9pMmNfZGF0YVtdOwogI2RlZmluZSBpbXg1MV9hZGRfaW14X2kyYyhpZCwgcGRhdGEpCVwKIAlpbXhfYWRkX2lteF9pMmMoJmlteDUxX2lteF9pMmNfZGF0YVtpZF0sIHBkYXRhKQorI2RlZmluZSBpbXg1MV9hZGRfaHNpMmMocGRhdGEpCVwKKwlpbXg1MV9hZGRfaW14X2kyYygyLCBwZGF0YSkKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfaW14X3NzaV9kYXRhIGlteDUxX2lteF9zc2lfZGF0YVtdOwogI2RlZmluZSBpbXg1MV9hZGRfaW14X3NzaShpZCwgcGRhdGEpCVwKQEAgLTI1LDYgKzMxLDEzIEBACiAjZGVmaW5lIGlteDUxX2FkZF9pbXhfdWFydChpZCwgcGRhdGEpCVwKIAlpbXhfYWRkX2lteF91YXJ0XzFpcnEoJmlteDUxX2lteF91YXJ0X2RhdGFbaWRdLCBwZGF0YSkKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfbXhjX2VoY2lfZGF0YSBpbXg1MV9teGNfZWhjaV9vdGdfZGF0YTsKKyNkZWZpbmUgaW14NTFfYWRkX214Y19laGNpX290ZyhwZGF0YSkJXAorCWlteF9hZGRfbXhjX2VoY2koJmlteDUxX214Y19laGNpX290Z19kYXRhLCBwZGF0YSkKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW14X214Y19laGNpX2RhdGEgaW14NTFfbXhjX2VoY2lfaHNfZGF0YVtdOworI2RlZmluZSBpbXg1MV9hZGRfbXhjX2VoY2lfaHMoaWQsIHBkYXRhKQlcCisJaW14X2FkZF9teGNfZWhjaSgmaW14NTFfbXhjX2VoY2lfaHNfZGF0YVtpZCAtIDFdLCBwZGF0YSkKKwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfbXhjX25hbmRfZGF0YSBpbXg1MV9teGNfbmFuZF9kYXRhOwogI2RlZmluZSBpbXg1MV9hZGRfbXhjX25hbmQocGRhdGEpCVwKIAlpbXhfYWRkX214Y19uYW5kKCZpbXg1MV9teGNfbmFuZF9kYXRhLCBwZGF0YSkKQEAgLTUyLDMgKzY1LDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2lteF9rZXlwYWRfZGF0YSBpbXg1MV9pbXhfa2V5cGFkX2RhdGE7CiAjZGVmaW5lIGlteDUxX2FkZF9pbXhfa2V5cGFkKHBkYXRhKQlcCiAJaW14X2FkZF9pbXhfa2V5cGFkKCZpbXg1MV9pbXhfa2V5cGFkX2RhdGEsIHBkYXRhKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDUxX3BhdGFfaW14X2RhdGE7CisjZGVmaW5lIGlteDUxX2FkZF9wYXRhX2lteCgpIFwKKwlpbXhfYWRkX3BhdGFfaW14KCZpbXg1MV9wYXRhX2lteF9kYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1My5oIGIvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy1pbXg1My5oCmluZGV4IGMyN2ZlOGIuLjZlMWU1ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMtaW14NTMuaAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLWlteDUzLmgKQEAgLTQwLDMgKzQwLDkgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2lteF9rZXlwYWRfZGF0YSBpbXg1M19pbXhfa2V5cGFkX2RhdGE7CiAjZGVmaW5lIGlteDUzX2FkZF9pbXhfa2V5cGFkKHBkYXRhKQlcCiAJaW14X2FkZF9pbXhfa2V5cGFkKCZpbXg1M19pbXhfa2V5cGFkX2RhdGEsIHBkYXRhKQorCitleHRlcm4gY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDUzX3BhdGFfaW14X2RhdGE7CisjZGVmaW5lIGlteDUzX2FkZF9wYXRhX2lteCgpIFwKKwlpbXhfYWRkX3BhdGFfaW14KCZpbXg1M19wYXRhX2lteF9kYXRhKQorCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteDUzX2FkZF9haGNpX2lteCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2RldmljZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxY2E4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA5IEFtaXQgS3VjaGVyaWEgPGFtaXQua3VjaGVyaWFAY2Fub25pY2FsLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKLSAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotICoKLSAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAotICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBteGNfaHNpMmNfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQgPSBNWDUxX0hTSTJDX0RNQV9CQVNFX0FERFIsCi0JCS5lbmQgPSBNWDUxX0hTSTJDX0RNQV9CQVNFX0FERFIgKyBTWl8xNksgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTVg1MV9NWENfSU5UX0hTX0kyQywKLQkJLmVuZCA9IE1YNTFfTVhDX0lOVF9IU19JMkMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y19oc2kyY19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAiaW14LWkyYyIsCi0JLmlkID0gMiwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobXhjX2hzaTJjX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gbXhjX2hzaTJjX3Jlc291cmNlcwotfTsKLQotc3RhdGljIHU2NCB1c2JfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYm90Z19yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YNTFfT1RHX0JBU0VfQUREUiwKLQkJLmVuZCA9IE1YNTFfT1RHX0JBU0VfQUREUiArIDB4MWZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTVg1MV9NWENfSU5UX1VTQl9PVEcsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi0vKiBPVEcgZ2FkZ2V0IGRldmljZSAqLwotc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiZHJfdWRjX2RldmljZSA9IHsKLQkubmFtZQkJPSAiZnNsLXVzYjItdWRjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVzYm90Z19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHVzYm90Z19yZXNvdXJjZXMsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmdXNiX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2Jkcl9ob3N0X2RldmljZSA9IHsKLQkubmFtZSA9ICJteGMtZWhjaSIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodXNib3RnX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gdXNib3RnX3Jlc291cmNlcywKLQkuZGV2ID0gewotCQkuZG1hX21hc2sgPSAmdXNiX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmgxX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gTVg1MV9PVEdfQkFTRV9BRERSICsgMHgyMDAsCi0JCS5lbmQgPSBNWDUxX09UR19CQVNFX0FERFIgKyAweDIwMCArIDB4MWZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTVg1MV9NWENfSU5UX1VTQl9IMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgxX2RldmljZSA9IHsKLQkubmFtZSA9ICJteGMtZWhjaSIsCi0JLmlkID0gMSwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUodXNiaDFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSB1c2JoMV9yZXNvdXJjZXMsCi0JLmRldiA9IHsKLQkJLmRtYV9tYXNrID0gJnVzYl9kbWFfbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JoMl9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IE1YNTFfT1RHX0JBU0VfQUREUiArIDB4NDAwLAotCQkuZW5kID0gTVg1MV9PVEdfQkFTRV9BRERSICsgMHg0MDAgKyAweDFmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydCA9IE1YNTFfTVhDX0lOVF9VU0JfSDIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2JoMl9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXhjLWVoY2kiLAotCS5pZCA9IDIsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVzYmgyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gdXNiaDJfcmVzb3VyY2VzLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzayA9ICZ1c2JfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLW14NS9kZXZpY2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTUxMjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZGV2aWNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiZHJfaG9zdF9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBteGNfdXNiaDFfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX3VzYmgyX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG14Y191c2Jkcl91ZGNfZGV2aWNlOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXhjX2hzaTJjX2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2VoY2kuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2VoY2kuYwppbmRleCA3Y2UxMmM4Li5jMTdmYTEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9laGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZWhjaS5jCkBAIC01Miw3ICs1Miw3IEBACiAJdm9pZCBfX2lvbWVtICp1c2JvdGhlcl9iYXNlOwogCWludCByZXQgPSAwOwogCi0JdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfT1RHX0JBU0VfQUREUiwgU1pfNEspOworCXVzYl9iYXNlID0gaW9yZW1hcChNWDUxX1VTQl9PVEdfQkFTRV9BRERSLCBTWl80Syk7CiAJaWYgKCF1c2JfYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzKCk6IGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14NTEtYmFzZWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXg1MS1iYXNlYm9hcmQuYwppbmRleCBiYmY0NTY0Li5hNmEzYWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXg1MS1iYXNlYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ldWtyZWFfbWJpbXg1MS1iYXNlYm9hcmQuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAKICNkZWZpbmUgTUJJTVg1MV9UU0MyMDA3X0dQSU8JSU1YX0dQSU9fTlIoMywgMzApCiAjZGVmaW5lIE1CSU1YNTFfTEVEMAkJSU1YX0dQSU9fTlIoMywgNSkKQEAgLTE2MCw3ICsxNTksNyBAQAogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBtYmlteDUxX2kyY19kZXZpY2VzW10gPSB7CiAJewogCQlJMkNfQk9BUkRfSU5GTygidHNjMjAwNyIsIDB4NDkpLAotCQkuaXJxICA9IGdwaW9fdG9faXJxKE1CSU1YNTFfVFNDMjAwN19HUElPKSwKKwkJLmlycSAgPSBJTVhfR1BJT19UT19JUlEoTUJJTVg1MV9UU0MyMDA3X0dQSU8pLAogCQkucGxhdGZvcm1fZGF0YSA9ICZ0c2MyMDA3X2RhdGEsCiAJfSwgewogCQlJMkNfQk9BUkRfSU5GTygidGx2MzIwYWljMjMiLCAweDFhKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2V1a3JlYV9tYmlteHNkLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKaW5kZXggMjYxOTIzOS4uZDgxN2ZjOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvZXVrcmVhX21iaW14c2QtYmFzZWJvYXJkLmMKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTQxLDEzICs0MCwxMiBAQAogI2luY2x1ZGUgPG1hY2gvYXVkbXV4Lmg+CiAKICNpbmNsdWRlICJkZXZpY2VzLWlteDUxLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgogCiBzdGF0aWMgaW9tdXhfdjNfY2ZnX3QgZXVrcmVhX21iaW14c2RfcGFkc1tdID0gewogCS8qIExFRCAqLwogCU1YNTFfUEFEX05BTkRGX0QxMF9fR1BJTzNfMzAsCiAJLyogU1dJVENIICovCi0JX01YNTFfUEFEX05BTkRGX0Q5X19HUElPM18zMSB8IE1VWF9QQURfQ1RSTChQQURfQ1RMX1BVU18yMktfVVAgfAorCU5FV19QQURfQ1RSTChNWDUxX1BBRF9OQU5ERl9EOV9fR1BJTzNfMzEsIFBBRF9DVExfUFVTXzIyS19VUCB8CiAJCQlQQURfQ1RMX1BLRSB8IFBBRF9DVExfU1JFX0ZBU1QgfAogCQkJUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVFIHwgUEFEX0NUTF9IWVMpLAogCS8qIFVBUlQyICovCkBAIC02Niw3ICs2NCw3IEBACiAJTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIsCiAJTVg1MV9QQURfU0QxX0RBVEEzX19TRDFfREFUQTMsCiAJLyogU0QxIENEICovCi0JX01YNTFfUEFEX0dQSU8xXzBfX1NEMV9DRCB8IE1VWF9QQURfQ1RSTChQQURfQ1RMX1BVU18yMktfVVAgfAorCU5FV19QQURfQ1RSTChNWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QsIFBBRF9DVExfUFVTXzIyS19VUCB8CiAJCQlQQURfQ1RMX1BLRSB8IFBBRF9DVExfU1JFX0ZBU1QgfAogCQkJUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVFIHwgUEFEX0NUTF9IWVMpLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2lteDUxLWR0LmMgYi9hcmNoL2FybS9tYWNoLW14NS9pbXg1MS1kdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYzYxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9pbXg1MS1kdC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9teDUxLmg+CisKKy8qCisgKiBMb29rdXAgdGFibGUgZm9yIGF0dGFjaGluZyBhIHNwZWNpZmljIG5hbWUgYW5kIHBsYXRmb3JtX2RhdGEgcG9pbnRlciB0bworICogZGV2aWNlcyBhcyB0aGV5IGdldCBjcmVhdGVkIGJ5IG9mX3BsYXRmb3JtX3BvcHVsYXRlKCkuICBJZGVhbGx5IHRoaXMgdGFibGUKKyAqIHdvdWxkIG5vdCBleGlzdCwgYnV0IHRoZSBjdXJyZW50IGNsb2NrIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gc29tZSBkZXZpY2VzCisgKiBoYXZpbmcgYSBzcGVjaWZpYyBuYW1lLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rldl9hdXhkYXRhIGlteDUxX2F1eGRhdGFfbG9va3VwW10gX19pbml0Y29uc3QgPSB7CisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS11YXJ0IiwgTVg1MV9VQVJUMV9CQVNFX0FERFIsICJpbXgyMS11YXJ0LjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLXVhcnQiLCBNWDUxX1VBUlQyX0JBU0VfQUREUiwgImlteDIxLXVhcnQuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtdWFydCIsIE1YNTFfVUFSVDNfQkFTRV9BRERSLCAiaW14MjEtdWFydC4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1mZWMiLCBNWDUxX0ZFQ19CQVNFX0FERFIsICJpbXgyNy1mZWMuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtZXNkaGMiLCBNWDUxX0VTREhDMV9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1MS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1lc2RoYyIsIE1YNTFfRVNESEMyX0JBU0VfQUREUiwgInNkaGNpLWVzZGhjLWlteDUxLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWVzZGhjIiwgTVg1MV9FU0RIQzNfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTEuMiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtZXNkaGMiLCBNWDUxX0VTREhDNF9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1MS4zIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1MS1lY3NwaSIsIE1YNTFfRUNTUEkxX0JBU0VfQUREUiwgImlteDUxLWVjc3BpLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWVjc3BpIiwgTVg1MV9FQ1NQSTJfQkFTRV9BRERSLCAiaW14NTEtZWNzcGkuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtY3NwaSIsIE1YNTFfQ1NQSV9CQVNFX0FERFIsICJpbXgzNS1jc3BpLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWkyYyIsIE1YNTFfSTJDMV9CQVNFX0FERFIsICJpbXgtaTJjLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLWkyYyIsIE1YNTFfSTJDMl9CQVNFX0FERFIsICJpbXgtaTJjLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUxLXNkbWEiLCBNWDUxX1NETUFfQkFTRV9BRERSLCAiaW14MzUtc2RtYSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTEtd2R0IiwgTVg1MV9XRE9HMV9CQVNFX0FERFIsICJpbXgyLXdkdC4wIiwgTlVMTCksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTFfdHppY19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKK3sKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTFfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKK3sKKwlzdGF0aWMgaW50IGdwaW9faXJxX2Jhc2UgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBBUkNIX05SX0dQSU9TIC0KKwkJCQkgICAzMiAqIDQ7IC8qIGlteDUxIGdldHMgNCBncGlvIHBvcnRzICovCisKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIGdwaW9faXJxX2Jhc2UpOworCWdwaW9faXJxX2Jhc2UgKz0gMzI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDUxX2lycV9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXR6aWMiLCAuZGF0YSA9IGlteDUxX3R6aWNfYWRkX2lycV9kb21haW4sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZ3BpbyIsIC5kYXRhID0gaW14NTFfZ3Bpb19hZGRfaXJxX2RvbWFpbiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDUxX2lvbXV4Y19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWlvbXV4Yy1iYWJiYWdlIiwgLmRhdGEgPSBpbXg1MV9iYWJiYWdlX2NvbW1vbl9pbml0LCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGlteDUxX2R0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJdm9pZCAoKmZ1bmMpKHZvaWQpOworCisJb2ZfaXJxX2luaXQoaW14NTFfaXJxX21hdGNoKTsKKworCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgaW14NTFfaW9tdXhjX29mX21hdGNoKTsKKwlpZiAobm9kZSkgeworCQlvZl9pZCA9IG9mX21hdGNoX25vZGUoaW14NTFfaW9tdXhjX29mX21hdGNoLCBub2RlKTsKKwkJZnVuYyA9IG9mX2lkLT5kYXRhOworCQlmdW5jKCk7CisJCW9mX25vZGVfcHV0KG5vZGUpOworCX0KKworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLAorCQkJICAgICBpbXg1MV9hdXhkYXRhX2xvb2t1cCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbXg1MV90aW1lcl9pbml0KHZvaWQpCit7CisJbXg1MV9jbG9ja3NfaW5pdF9kdCgpOworfQorCitzdGF0aWMgc3RydWN0IHN5c190aW1lciBpbXg1MV90aW1lciA9IHsKKwkuaW5pdCA9IGlteDUxX3RpbWVyX2luaXQsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaW14NTFfZHRfYm9hcmRfY29tcGF0W10gX19pbml0ZGF0YSA9IHsKKwkiZnNsLGlteDUxLWJhYmJhZ2UiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoSU1YNTFfRFQsICJGcmVlc2NhbGUgaS5NWDUxIChEZXZpY2UgVHJlZSBTdXBwb3J0KSIpCisJLm1hcF9pbwkJPSBteDUxX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IGlteDUxX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gbXg1MV9pbml0X2lycSwKKwkuaGFuZGxlX2lycQk9IGlteDUxX2hhbmRsZV9pcnEsCisJLnRpbWVyCQk9ICZpbXg1MV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gaW14NTFfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gaW14NTFfZHRfYm9hcmRfY29tcGF0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2lteDUzLWR0LmMgYi9hcmNoL2FybS9tYWNoLW14NS9pbXg1My1kdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWEwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14NS9pbXg1My1kdC5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDExIExpbmFybyBMdGQuCisgKgorICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgb3IgbGF0ZXIgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisgKgorICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5odG1sCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL214NTMuaD4KKworLyoKKyAqIExvb2t1cCB0YWJsZSBmb3IgYXR0YWNoaW5nIGEgc3BlY2lmaWMgbmFtZSBhbmQgcGxhdGZvcm1fZGF0YSBwb2ludGVyIHRvCisgKiBkZXZpY2VzIGFzIHRoZXkgZ2V0IGNyZWF0ZWQgYnkgb2ZfcGxhdGZvcm1fcG9wdWxhdGUoKS4gIElkZWFsbHkgdGhpcyB0YWJsZQorICogd291bGQgbm90IGV4aXN0LCBidXQgdGhlIGN1cnJlbnQgY2xvY2sgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBzb21lIGRldmljZXMKKyAqIGhhdmluZyBhIHNwZWNpZmljIG5hbWUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgaW14NTNfYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRjb25zdCA9IHsKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXVhcnQiLCBNWDUzX1VBUlQxX0JBU0VfQUREUiwgImlteDIxLXVhcnQuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtdWFydCIsIE1YNTNfVUFSVDJfQkFTRV9BRERSLCAiaW14MjEtdWFydC4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My11YXJ0IiwgTVg1M19VQVJUM19CQVNFX0FERFIsICJpbXgyMS11YXJ0LjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXVhcnQiLCBNWDUzX1VBUlQ0X0JBU0VfQUREUiwgImlteDIxLXVhcnQuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtdWFydCIsIE1YNTNfVUFSVDVfQkFTRV9BRERSLCAiaW14MjEtdWFydC40IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1mZWMiLCBNWDUzX0ZFQ19CQVNFX0FERFIsICJpbXgyNS1mZWMuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtZXNkaGMiLCBNWDUzX0VTREhDMV9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1My4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1lc2RoYyIsIE1YNTNfRVNESEMyX0JBU0VfQUREUiwgInNkaGNpLWVzZGhjLWlteDUzLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWVzZGhjIiwgTVg1M19FU0RIQzNfQkFTRV9BRERSLCAic2RoY2ktZXNkaGMtaW14NTMuMiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtZXNkaGMiLCBNWDUzX0VTREhDNF9CQVNFX0FERFIsICJzZGhjaS1lc2RoYy1pbXg1My4zIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImZzbCxpbXg1My1lY3NwaSIsIE1YNTNfRUNTUEkxX0JBU0VfQUREUiwgImlteDUxLWVjc3BpLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWVjc3BpIiwgTVg1M19FQ1NQSTJfQkFTRV9BRERSLCAiaW14NTEtZWNzcGkuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtY3NwaSIsIE1YNTNfQ1NQSV9CQVNFX0FERFIsICJpbXgzNS1jc3BpLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWkyYyIsIE1YNTNfSTJDMV9CQVNFX0FERFIsICJpbXgtaTJjLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWkyYyIsIE1YNTNfSTJDMl9CQVNFX0FERFIsICJpbXgtaTJjLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLWkyYyIsIE1YNTNfSTJDM19CQVNFX0FERFIsICJpbXgtaTJjLjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiZnNsLGlteDUzLXNkbWEiLCBNWDUzX1NETUFfQkFTRV9BRERSLCAiaW14MzUtc2RtYSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJmc2wsaW14NTMtd2R0IiwgTVg1M19XRE9HMV9CQVNFX0FERFIsICJpbXgyLXdkdC4wIiwgTlVMTCksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfdHppY19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKK3sKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKK3sKKwlzdGF0aWMgaW50IGdwaW9faXJxX2Jhc2UgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBBUkNIX05SX0dQSU9TIC0KKwkJCQkgICAzMiAqIDc7IC8qIGlteDUzIGdldHMgNyBncGlvIHBvcnRzICovCisKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIGdwaW9faXJxX2Jhc2UpOworCWdwaW9faXJxX2Jhc2UgKz0gMzI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDUzX2lycV9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXR6aWMiLCAuZGF0YSA9IGlteDUzX3R6aWNfYWRkX2lycV9kb21haW4sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtZ3BpbyIsIC5kYXRhID0gaW14NTNfZ3Bpb19hZGRfaXJxX2RvbWFpbiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDUzX2lvbXV4Y19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlvbXV4Yy1hcmQiLCAuZGF0YSA9IGlteDUzX2FyZF9jb21tb25faW5pdCwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1pb211eGMtZXZrIiwgLmRhdGEgPSBpbXg1M19ldmtfY29tbW9uX2luaXQsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtaW9tdXhjLXFzYiIsIC5kYXRhID0gaW14NTNfcXNiX2NvbW1vbl9pbml0LCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWlvbXV4Yy1zbWQiLCAuZGF0YSA9IGlteDUzX3NtZF9jb21tb25faW5pdCwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbXg1M19kdF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXZvaWQgKCpmdW5jKSh2b2lkKTsKKworCW9mX2lycV9pbml0KGlteDUzX2lycV9tYXRjaCk7CisKKwlub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGlteDUzX2lvbXV4Y19vZl9tYXRjaCk7CisJaWYgKG5vZGUpIHsKKwkJb2ZfaWQgPSBvZl9tYXRjaF9ub2RlKGlteDUzX2lvbXV4Y19vZl9tYXRjaCwgbm9kZSk7CisJCWZ1bmMgPSBvZl9pZC0+ZGF0YTsKKwkJZnVuYygpOworCQlvZl9ub2RlX3B1dChub2RlKTsKKwl9CisKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwKKwkJCSAgICAgaW14NTNfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfdGltZXJfaW5pdCh2b2lkKQoreworCW14NTNfY2xvY2tzX2luaXRfZHQoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgaW14NTNfdGltZXIgPSB7CisJLmluaXQgPSBpbXg1M190aW1lcl9pbml0LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlteDUzX2R0X2JvYXJkX2NvbXBhdFtdIF9faW5pdGRhdGEgPSB7CisJImZzbCxpbXg1My1hcmQiLAorCSJmc2wsaW14NTMtZXZrIiwKKwkiZnNsLGlteDUzLXFzYiIsCisJImZzbCxpbXg1My1zbWQiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoSU1YNTNfRFQsICJGcmVlc2NhbGUgaS5NWDUzIChEZXZpY2UgVHJlZSBTdXBwb3J0KSIpCisJLm1hcF9pbwkJPSBteDUzX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IGlteDUzX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gbXg1M19pbml0X2lycSwKKwkuaGFuZGxlX2lycQk9IGlteDUzX2hhbmRsZV9pcnEsCisJLnRpbWVyCQk9ICZpbXg1M190aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gaW14NTNfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gaW14NTNfZHRfYm9hcmRfY29tcGF0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L21tLW14NTAuYyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLW14NTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlMzc0Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9tbS1teDUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIENyZWF0ZSBzdGF0aWMgbWFwcGluZyBiZXR3ZWVuIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb211eC12My5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0vKgotICogRGVmaW5lIHRoZSBNWDUwIG1lbW9yeSBtYXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXg1MF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQlpbXhfbWFwX2VudHJ5KE1YNTAsIFRaSUMsIE1UX0RFVklDRSksCi0JaW14X21hcF9lbnRyeShNWDUwLCBTUEJBMCwgTVRfREVWSUNFKSwKLQlpbXhfbWFwX2VudHJ5KE1YNTAsIEFJUFMxLCBNVF9ERVZJQ0UpLAotCWlteF9tYXBfZW50cnkoTVg1MCwgQUlQUzIsIE1UX0RFVklDRSksCi19OwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbWVtb3J5IG1hcC4gSXQgaXMgY2FsbGVkIGR1cmluZyB0aGUKLSAqIHN5c3RlbSBzdGFydHVwIHRvIGNyZWF0ZSBzdGF0aWMgcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MKLSAqIGZvciB0aGUgSU8gbW9kdWxlcy4KLSAqLwotdm9pZCBfX2luaXQgbXg1MF9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQobXg1MF9pb19kZXNjLCBBUlJBWV9TSVpFKG14NTBfaW9fZGVzYykpOwotfQotCi12b2lkIF9faW5pdCBpbXg1MF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0JbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YNTApOwotCW14Y19pb211eF92M19pbml0KE1YNTBfSU9fQUREUkVTUyhNWDUwX0lPTVVYQ19CQVNFX0FERFIpKTsKLQlteGNfYXJjaF9yZXNldF9pbml0KE1YNTBfSU9fQUREUkVTUyhNWDUwX1dET0dfQkFTRV9BRERSKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14NTBfaW5pdF9pcnEodm9pZCkKLXsKLQl0emljX2luaXRfaXJxKE1YNTBfSU9fQUREUkVTUyhNWDUwX1RaSUNfQkFTRV9BRERSKSk7Ci19Ci0KLXZvaWQgX19pbml0IGlteDUwX3NvY19pbml0KHZvaWQpCi17Ci0JLyogaS5teDUwIGhhcyB0aGUgaS5teDMxIHR5cGUgZ3BpbyAqLwotCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMCwgTVg1MF9HUElPMV9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzFfTE9XLCBNWDUwX0lOVF9HUElPMV9ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YNTBfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU8yX0xPVywgTVg1MF9JTlRfR1BJTzJfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDUwX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPM19MT1csIE1YNTBfSU5UX0dQSU8zX0hJR0gpOwotCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMywgTVg1MF9HUElPNF9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzRfTE9XLCBNWDUwX0lOVF9HUElPNF9ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDQsIE1YNTBfR1BJTzVfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU81X0xPVywgTVg1MF9JTlRfR1BJTzVfSElHSCk7Ci0JbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA1LCBNWDUwX0dQSU82X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPNl9MT1csIE1YNTBfSU5UX0dQSU82X0hJR0gpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvbW0uYyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKaW5kZXggYmFlYTZlNS4uMjZlYWNjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvbW0uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9tbS5jCkBAIC0yMSwxMiArMjEsMjcgQEAKICNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9pb211eC12My5oPgogCitzdGF0aWMgdm9pZCBpbXg1X2lkbGUodm9pZCkKK3sKKwlteDVfY3B1X2xwX3NldChXQUlUX1VOQ0xPQ0tFRF9QT1dFUl9PRkYpOworfQorCisvKgorICogRGVmaW5lIHRoZSBNWDUwIG1lbW9yeSBtYXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXg1MF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlpbXhfbWFwX2VudHJ5KE1YNTAsIFRaSUMsIE1UX0RFVklDRSksCisJaW14X21hcF9lbnRyeShNWDUwLCBTUEJBMCwgTVRfREVWSUNFKSwKKwlpbXhfbWFwX2VudHJ5KE1YNTAsIEFJUFMxLCBNVF9ERVZJQ0UpLAorCWlteF9tYXBfZW50cnkoTVg1MCwgQUlQUzIsIE1UX0RFVklDRSksCit9OworCiAvKgogICogRGVmaW5lIHRoZSBNWDUxIG1lbW9yeSBtYXAuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbXg1MV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlpbXhfbWFwX2VudHJ5KE1YNTEsIFRaSUMsIE1UX0RFVklDRSksCiAJaW14X21hcF9lbnRyeShNWDUxLCBJUkFNLCBNVF9ERVZJQ0UpLAotCWlteF9tYXBfZW50cnkoTVg1MSwgREVCVUcsIE1UX0RFVklDRSksCiAJaW14X21hcF9lbnRyeShNWDUxLCBBSVBTMSwgTVRfREVWSUNFKSwKIAlpbXhfbWFwX2VudHJ5KE1YNTEsIFNQQkEwLCBNVF9ERVZJQ0UpLAogCWlteF9tYXBfZW50cnkoTVg1MSwgQUlQUzIsIE1UX0RFVklDRSksCkBAIC0zNiw2ICs1MSw3IEBACiAgKiBEZWZpbmUgdGhlIE1YNTMgbWVtb3J5IG1hcC4KICAqLwogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDUzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCWlteF9tYXBfZW50cnkoTVg1MywgVFpJQywgTVRfREVWSUNFKSwKIAlpbXhfbWFwX2VudHJ5KE1YNTMsIEFJUFMxLCBNVF9ERVZJQ0UpLAogCWlteF9tYXBfZW50cnkoTVg1MywgU1BCQTAsIE1UX0RFVklDRSksCiAJaW14X21hcF9lbnRyeShNWDUzLCBBSVBTMiwgTVRfREVWSUNFKSwKQEAgLTQ2LDIxICs2MiwzNCBAQAogICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncwogICogZm9yIHRoZSBJTyBtb2R1bGVzLgogICovCit2b2lkIF9faW5pdCBteDUwX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChteDUwX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXg1MF9pb19kZXNjKSk7Cit9CisKIHZvaWQgX19pbml0IG14NTFfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG14NTFfaW9fZGVzYywgQVJSQVlfU0laRShteDUxX2lvX2Rlc2MpKTsKIH0KIAordm9pZCBfX2luaXQgbXg1M19tYXBfaW8odm9pZCkKK3sKKwlpb3RhYmxlX2luaXQobXg1M19pb19kZXNjLCBBUlJBWV9TSVpFKG14NTNfaW9fZGVzYykpOworfQorCit2b2lkIF9faW5pdCBpbXg1MF9pbml0X2Vhcmx5KHZvaWQpCit7CisJbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YNTApOworCW14Y19pb211eF92M19pbml0KE1YNTBfSU9fQUREUkVTUyhNWDUwX0lPTVVYQ19CQVNFX0FERFIpKTsKKwlteGNfYXJjaF9yZXNldF9pbml0KE1YNTBfSU9fQUREUkVTUyhNWDUwX1dET0dfQkFTRV9BRERSKSk7Cit9CisKIHZvaWQgX19pbml0IGlteDUxX2luaXRfZWFybHkodm9pZCkKIHsKIAlteGNfc2V0X2NwdV90eXBlKE1YQ19DUFVfTVg1MSk7CiAJbXhjX2lvbXV4X3YzX2luaXQoTVg1MV9JT19BRERSRVNTKE1YNTFfSU9NVVhDX0JBU0VfQUREUikpOwogCW14Y19hcmNoX3Jlc2V0X2luaXQoTVg1MV9JT19BRERSRVNTKE1YNTFfV0RPRzFfQkFTRV9BRERSKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14NTNfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KG14NTNfaW9fZGVzYywgQVJSQVlfU0laRShteDUzX2lvX2Rlc2MpKTsKKwlpbXhfaWRsZSA9IGlteDVfaWRsZTsKIH0KIAogdm9pZCBfX2luaXQgaW14NTNfaW5pdF9lYXJseSh2b2lkKQpAQCAtNzAsMzUgKzk5LDE5IEBACiAJbXhjX2FyY2hfcmVzZXRfaW5pdChNWDUzX0lPX0FERFJFU1MoTVg1M19XRE9HMV9CQVNFX0FERFIpKTsKIH0KIAordm9pZCBfX2luaXQgbXg1MF9pbml0X2lycSh2b2lkKQoreworCXR6aWNfaW5pdF9pcnEoTVg1MF9JT19BRERSRVNTKE1YNTBfVFpJQ19CQVNFX0FERFIpKTsKK30KKwogdm9pZCBfX2luaXQgbXg1MV9pbml0X2lycSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdHppY19hZGRyOwotCXZvaWQgX19pb21lbSAqdHppY192aXJ0OwotCi0JaWYgKG14NTFfcmV2aXNpb24oKSA8IElNWF9DSElQX1JFVklTSU9OXzJfMCkKLQkJdHppY19hZGRyID0gTVg1MV9UWklDX0JBU0VfQUREUl9UTzE7Ci0JZWxzZQotCQl0emljX2FkZHIgPSBNWDUxX1RaSUNfQkFTRV9BRERSOwotCi0JdHppY192aXJ0ID0gaW9yZW1hcCh0emljX2FkZHIsIFNaXzE2Syk7Ci0JaWYgKCF0emljX3ZpcnQpCi0JCXBhbmljKCJ1bmFibGUgdG8gbWFwIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXJcbiIpOwotCi0JdHppY19pbml0X2lycSh0emljX3ZpcnQpOworCXR6aWNfaW5pdF9pcnEoTVg1MV9JT19BRERSRVNTKE1YNTFfVFpJQ19CQVNFX0FERFIpKTsKIH0KIAogdm9pZCBfX2luaXQgbXg1M19pbml0X2lycSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdHppY19hZGRyOwotCXZvaWQgX19pb21lbSAqdHppY192aXJ0OwotCi0JdHppY19hZGRyID0gTVg1M19UWklDX0JBU0VfQUREUjsKLQotCXR6aWNfdmlydCA9IGlvcmVtYXAodHppY19hZGRyLCBTWl8xNkspOwotCWlmICghdHppY192aXJ0KQotCQlwYW5pYygidW5hYmxlIHRvIG1hcCBUWklDIGludGVycnVwdCBjb250cm9sbGVyXG4iKTsKLQotCXR6aWNfaW5pdF9pcnEodHppY192aXJ0KTsKKwl0emljX2luaXRfaXJxKE1YNTNfSU9fQUREUkVTUyhNWDUzX1RaSUNfQkFTRV9BRERSKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgaW14NTFfc2RtYV9zY3JpcHQgX19pbml0ZGF0YSA9IHsKQEAgLTEzOCwxMyArMTUxLDI0IEBACiAJLnNjcmlwdF9hZGRycyA9ICZpbXg1M19zZG1hX3NjcmlwdCwKIH07CiAKK3ZvaWQgX19pbml0IGlteDUwX3NvY19pbml0KHZvaWQpCit7CisJLyogaS5teDUwIGhhcyB0aGUgaS5teDMxIHR5cGUgZ3BpbyAqLworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMCwgTVg1MF9HUElPMV9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzFfTE9XLCBNWDUwX0lOVF9HUElPMV9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YNTBfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU8yX0xPVywgTVg1MF9JTlRfR1BJTzJfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDUwX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPM19MT1csIE1YNTBfSU5UX0dQSU8zX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMywgTVg1MF9HUElPNF9CQVNFX0FERFIsIFNaXzE2SywgTVg1MF9JTlRfR1BJTzRfTE9XLCBNWDUwX0lOVF9HUElPNF9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDQsIE1YNTBfR1BJTzVfQkFTRV9BRERSLCBTWl8xNkssIE1YNTBfSU5UX0dQSU81X0xPVywgTVg1MF9JTlRfR1BJTzVfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA1LCBNWDUwX0dQSU82X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUwX0lOVF9HUElPNl9MT1csIE1YNTBfSU5UX0dQSU82X0hJR0gpOworfQorCiB2b2lkIF9faW5pdCBpbXg1MV9zb2NfaW5pdCh2b2lkKQogewogCS8qIGkubXg1MSBoYXMgdGhlIGkubXgzMSB0eXBlIGdwaW8gKi8KLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YNTFfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPMV9MT1csIE1YNTFfTVhDX0lOVF9HUElPMV9ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDEsIE1YNTFfR1BJTzJfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPMl9MT1csIE1YNTFfTVhDX0lOVF9HUElPMl9ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YNTFfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPM19MT1csIE1YNTFfTVhDX0lOVF9HUElPM19ISUdIKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTFfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPNF9MT1csIE1YNTFfTVhDX0lOVF9HUElPNF9ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDAsIE1YNTFfR1BJTzFfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfSU5UX0dQSU8xX0xPVywgTVg1MV9JTlRfR1BJTzFfSElHSCk7CisJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAxLCBNWDUxX0dQSU8yX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX0lOVF9HUElPMl9MT1csIE1YNTFfSU5UX0dQSU8yX0hJR0gpOworCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgMiwgTVg1MV9HUElPM19CQVNFX0FERFIsIFNaXzE2SywgTVg1MV9JTlRfR1BJTzNfTE9XLCBNWDUxX0lOVF9HUElPM19ISUdIKTsKKwlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTFfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfSU5UX0dQSU80X0xPVywgTVg1MV9JTlRfR1BJTzRfSElHSCk7CiAKIAkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCiAJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YNTFfU0RNQV9CQVNFX0FERFIsIE1YNTFfSU5UX1NETUEsICZpbXg1MV9zZG1hX3BkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYyBiL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYwppbmRleCBjOTIwOTQ1Li5lYzZjYTkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jCkBAIC0zNCwxNCArMzQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvdWxwaS5oPgogI2luY2x1ZGUgPG1hY2gvdWxwaS5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogI2luY2x1ZGUgImRldmljZXMtaW14NTEuaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCiAjaW5jbHVkZSAiZWZpa2EuaCIKICNpbmNsdWRlICJjcHVfb3AtbXg1MS5oIgogCkBAIC0xMzMsNyArMTMxLDcgQEAKIAl1MzIgdjsKIAl2b2lkIF9faW9tZW0gKnVzYl9iYXNlOwogCXZvaWQgX19pb21lbSAqdXNib3RoZXJfYmFzZTsKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlpZiAoIXVzYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAl1c2JvdGhlcl9iYXNlID0gKHZvaWQgX19pb21lbSAqKSh1c2JfYmFzZSArIE1YNV9VU0JPVEhFUl9SRUdTX09GRlNFVCk7CkBAIC0xNTAsNyArMTQ4LDcgQEAKIAlyZXR1cm4gbXg1MV9pbml0aWFsaXplX3VzYl9odyhwZGV2LT5pZCwgTVhDX0VIQ0lfSU5URVJOQUxfUEhZKTsKIH0KIAotc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIGRyX3V0bWlfY29uZmlnIF9faW5pdGNvbnN0ID0gewogCS5pbml0ICAgPSBpbml0aWFsaXplX290Z19wb3J0LAogCS5wb3J0c2MgPSBNWENfRUhDSV9VVE1JXzE2QklULAogfTsKQEAgLTE3MCw3ICsxNjgsNyBAQAogCWdwaW9fc2V0X3ZhbHVlKEVGSUtBTVhfVVNCSDFfU1RQLCAxKTsKIAltc2xlZXAoMSk7CiAKLQl1c2JfYmFzZSA9IGlvcmVtYXAoTVg1MV9PVEdfQkFTRV9BRERSLCBTWl80Syk7CisJdXNiX2Jhc2UgPSBpb3JlbWFwKE1YNTFfVVNCX09UR19CQVNFX0FERFIsIFNaXzRLKTsKIAlzb2NyZWdzX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopKHVzYl9iYXNlICsgTVg1X1VTQk9USEVSX1JFR1NfT0ZGU0VUKTsKIAogCS8qIFRoZSBjbG9jayBmb3IgdGhlIFVTQkgxIFVMUEkgcG9ydCB3aWxsIGNvbWUgZXh0ZXJuYWxseSAqLwpAQCAtMTg5LDcgKzE4Nyw3IEBACiAJcmV0dXJuIG14NTFfaW5pdGlhbGl6ZV91c2JfaHcocGRldi0+aWQsIE1YQ19FSENJX0lUQ19OT19USFJFU0hPTEQpOwogfQogCi1zdGF0aWMgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgdXNiaDFfY29uZmlnID0geworc3RhdGljIHN0cnVjdCBteGNfdXNiaF9wbGF0Zm9ybV9kYXRhIHVzYmgxX2NvbmZpZyBfX2luaXRkYXRhID0gewogCS5pbml0ICAgPSBpbml0aWFsaXplX3VzYmgxX3BvcnQsCiAJLnBvcnRzYyA9IE1YQ19FSENJX01PREVfVUxQSSwKIH07CkBAIC0yMTcsOSArMjE1LDkgQEAKIAl1c2JoMV9jb25maWcub3RnID0gaW14X290Z191bHBpX2NyZWF0ZShVTFBJX09UR19EUlZWQlVTIHwKIAkJCVVMUElfT1RHX0RSVlZCVVNfRVhUIHwgVUxQSV9PVEdfRVhUVkJVU0lORCk7CiAKLQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiZHJfaG9zdF9kZXZpY2UsICZkcl91dG1pX2NvbmZpZyk7CisJaW14NTFfYWRkX214Y19laGNpX290ZygmZHJfdXRtaV9jb25maWcpOwogCWlmICh1c2JoMV9jb25maWcub3RnKQotCQlteGNfcmVnaXN0ZXJfZGV2aWNlKCZteGNfdXNiaDFfZGV2aWNlLCAmdXNiaDFfY29uZmlnKTsKKwkJaW14NTFfYWRkX214Y19laGNpX2hzKDEsICZ1c2JoMV9jb25maWcpOwogfQogCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbXg1MV9lZmlrYV9zcGlfbm9yX3BhcnRpdGlvbnNbXSA9IHsKQEAgLTU2Nyw3ICs1NjUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtYzEzeHh4X3BsYXRmb3JtX2RhdGEgbXg1MV9lZmlrYV9tYzEzODkyX2RhdGEgPSB7Ci0JLmZsYWdzID0gTUMxM1hYWF9VU0VfUlRDIHwgTUMxM1hYWF9VU0VfUkVHVUxBVE9SLAorCS5mbGFncyA9IE1DMTNYWFhfVVNFX1JUQywKIAkucmVndWxhdG9ycyA9IHsKIAkJLm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShteDUxX2VmaWthX3JlZ3VsYXRvcnMpLAogCQkucmVndWxhdG9ycyA9IG14NTFfZWZpa2FfcmVndWxhdG9ycywKQEAgLTU4OSw3ICs1ODcsNyBAQAogCQkuYnVzX251bSA9IDAsCiAJCS5jaGlwX3NlbGVjdCA9IDAsCiAJCS5wbGF0Zm9ybV9kYXRhID0gJm14NTFfZWZpa2FfbWMxMzg5Ml9kYXRhLAotCQkuaXJxID0gZ3Bpb190b19pcnEoRUZJS0FNWF9QTUlDKSwKKwkJLmlycSA9IElNWF9HUElPX1RPX0lSUShFRklLQU1YX1BNSUMpLAogCX0sCiB9OwogCkBAIC02MDksNyArNjA3LDYgQEAKIAkJCQkJQVJSQVlfU0laRShteDUxZWZpa2FfcGFkcykpOwogCWlteDUxX2FkZF9pbXhfdWFydCgwLCAmdWFydF9wZGF0YSk7CiAJbXg1MV9lZmlrYV91c2IoKTsKLQlpbXg1MV9hZGRfc2RoY2lfZXNkaGNfaW14KDAsIE5VTEwpOwogCiAJLyogRklYTUU6IGNvbWVzIGZyb20gb3JpZ2luYWwgY29kZS4gY2hlY2sgdGhpcy4gKi8KIAlpZiAobXg1MV9yZXZpc2lvbigpIDwgSU1YX0NISVBfUkVWSVNJT05fMl8wKQpAQCAtNjI3LDggKzYyNCw5IEBACiAJCUFSUkFZX1NJWkUobXg1MV9lZmlrYV9zcGlfYm9hcmRfaW5mbykpOwogCWlteDUxX2FkZF9lY3NwaSgwLCAmbXg1MV9lZmlrYV9zcGlfcGRhdGEpOwogCisJaW14NTFfYWRkX3BhdGFfaW14KCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9JTVgpCiAJZ2V0X2NwdV9vcCA9IG14NTFfZ2V0X2NwdV9vcDsKICNlbmRpZgogfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9wbS1pbXg1LmMgYi9hcmNoL2FybS9tYWNoLW14NS9wbS1pbXg1LmMKaW5kZXggZTQ1MjlhZi4uOTgwNTJmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvcG0taW14NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L3BtLWlteDUuYwpAQCAtMTQsMTQgKzE0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgorI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImNybV9yZWdzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpncGNfZHZmc19jbGs7CiAKK3N0YXRpYyBpbnQgbXg1X3N1c3BlbmRfcHJlcGFyZSh2b2lkKQoreworCXJldHVybiBjbGtfZW5hYmxlKGdwY19kdmZzX2Nsayk7Cit9CisKIHN0YXRpYyBpbnQgbXg1X3N1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewotCWNsa19lbmFibGUoZ3BjX2R2ZnNfY2xrKTsKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBQTV9TVVNQRU5EX01FTToKIAkJbXg1X2NwdV9scF9zZXQoU1RPUF9QT1dFUl9PRkYpOwpAQCAtNDIsMTEgKzQ3LDE0IEBACiAJCV9fcmF3X3dyaXRlbCgwLCBNWENfU1JQR19FTVBHQzFfU1JQR0NSKTsKIAl9CiAJY3B1X2RvX2lkbGUoKTsKLQljbGtfZGlzYWJsZShncGNfZHZmc19jbGspOwotCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG14NV9zdXNwZW5kX2ZpbmlzaCh2b2lkKQoreworCWNsa19kaXNhYmxlKGdwY19kdmZzX2Nsayk7Cit9CisKIHN0YXRpYyBpbnQgbXg1X3BtX3ZhbGlkKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKIAlyZXR1cm4gKHN0YXRlID4gUE1fU1VTUEVORF9PTiAmJiBzdGF0ZSA8PSBQTV9TVVNQRU5EX01BWCk7CkBAIC01NCw3ICs2Miw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbXg1X3N1c3BlbmRfb3BzID0gewogCS52YWxpZCA9IG14NV9wbV92YWxpZCwKKwkucHJlcGFyZSA9IG14NV9zdXNwZW5kX3ByZXBhcmUsCiAJLmVudGVyID0gbXg1X3N1c3BlbmRfZW50ZXIsCisJLmZpbmlzaCA9IG14NV9zdXNwZW5kX2ZpbmlzaCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG14NV9wbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9zeXN0ZW0uYyBiL2FyY2gvYXJtL21hY2gtbXg1L3N5c3RlbS5jCmluZGV4IDc2YWU4ZGMuLjE0NGViZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L3N5c3RlbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L3N5c3RlbS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KICNpbmNsdWRlICJjcm1fcmVncy5oIgogCiAvKiBzZXQgY3B1IGxvdyBwb3dlciBtb2RlIGJlZm9yZSBXRkkgaW5zdHJ1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1teHMvS2NvbmZpZwppbmRleCA0Y2QwMjMxLi5jZjAwYjNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL0tjb25maWcKQEAgLTIzLDYgKzIzLDcgQEAKIAlzZWxlY3QgTVhTX0hBVkVfQU1CQV9EVUFSVAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9BVUFSVAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX1JUQ19TVE1QM1hYWAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgU1RNUDM3OHgtZGV2YiBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgpAQCAtMzQsNiArMzUsNyBAQAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9BVUFSVAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfTU1DCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU0ZCCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX1JUQ19TVE1QM1hYWAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgyM0VWSyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgpAQCAtNDgsNiArNTAsOSBAQAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9GTEVYQ0FOCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19NTUMKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTRkIKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX1NBSUYKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX0kyQworCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgKIAlzZWxlY3QgTVhTX09DT1RQCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBNWDI4RVZLIHBsYXRmb3JtLiBUaGlzIGluY2x1ZGVzIHNwZWNpZmljCkBAIC02Myw5ICs2OCwyNyBAQAogCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfSTJDCiAJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19NTUMKIAlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTX1BXTQorCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgKKworY29uZmlnIE1PRFVMRV9NMjgKKwlib29sCisJc2VsZWN0IFNPQ19JTVgyOAorCXNlbGVjdCBMRURTX0dQSU9fUkVHSVNURVIKKwlzZWxlY3QgTVhTX0hBVkVfQU1CQV9EVUFSVAorCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9BVUFSVAorCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9GRUMKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fRkxFWENBTgorCXNlbGVjdCBNWFNfSEFWRV9QTEFURk9STV9NWFNfSTJDCisJc2VsZWN0IE1YU19IQVZFX1BMQVRGT1JNX01YU19NTUMKKwlzZWxlY3QgTVhTX0hBVkVfUExBVEZPUk1fTVhTRkIKKwlzZWxlY3QgTVhTX09DT1RQCiAKIGNvbmZpZyBNQUNIX1RYMjgKIAlib29sICJLYS1SbyBUWDI4IG1vZHVsZSIKIAlzZWxlY3QgTU9EVUxFX1RYMjgKIAorY29uZmlnIE1BQ0hfTTI4RVZLCisJYm9vbCAiU3VwcG9ydCBERU5YIE0yOEVWSyBQbGF0Zm9ybSIKKwlzZWxlY3QgTU9EVUxFX00yOAorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQppbmRleCA2YzM4MjYyLi44YzkzYjI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW14cy9NYWtlZmlsZQpAQCAtMSwxNSArMSwxNiBAQAogIyBDb21tb24gc3VwcG9ydAotb2JqLXkgOj0gY2xvY2subyBkZXZpY2VzLm8gaWNvbGwubyBpb211eC5vIHN5c3RlbS5vIHRpbWVyLm8KK29iai15IDo9IGNsb2NrLm8gZGV2aWNlcy5vIGljb2xsLm8gaW9tdXgubyBzeXN0ZW0ubyB0aW1lci5vIG1tLm8KIAogb2JqLSQoQ09ORklHX01YU19PQ09UUCkgKz0gb2NvdHAubwogb2JqLSQoQ09ORklHX1BNKSArPSBwbS5vCiAKLW9iai0kKENPTkZJR19TT0NfSU1YMjMpICs9IGNsb2NrLW14MjMubyBtbS1teDIzLm8KLW9iai0kKENPTkZJR19TT0NfSU1YMjgpICs9IGNsb2NrLW14MjgubyBtbS1teDI4Lm8KK29iai0kKENPTkZJR19TT0NfSU1YMjMpICs9IGNsb2NrLW14MjMubworb2JqLSQoQ09ORklHX1NPQ19JTVgyOCkgKz0gY2xvY2stbXgyOC5vCiAKIG9iai0kKENPTkZJR19NQUNIX1NUTVAzNzhYX0RFVkIpICs9IG1hY2gtc3RtcDM3OHhfZGV2Yi5vCiBvYmotJChDT05GSUdfTUFDSF9NWDIzRVZLKSArPSBtYWNoLW14MjNldmsubwogb2JqLSQoQ09ORklHX01BQ0hfTVgyOEVWSykgKz0gbWFjaC1teDI4ZXZrLm8KK29iai0kKENPTkZJR19NQUNIX00yOEVWSykgICAgKz0gbWFjaC1tMjhldmsubwogb2JqLSQoQ09ORklHX01PRFVMRV9UWDI4KSArPSBtb2R1bGUtdHgyOC5vCiBvYmotJChDT05GSUdfTUFDSF9UWDI4KSAgICArPSBtYWNoLXR4MjgubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9jbG9jay1teDI4LmMgYi9hcmNoL2FybS9tYWNoLW14cy9jbG9jay1teDI4LmMKaW5kZXggNWRjYzU5ZC4uMjI5YWUzNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvY2xvY2stbXgyOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2Nsb2NrLW14MjguYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJCQkJCQkJCQlcCiAJCXJlZyA9IF9fcmF3X3JlYWRsKENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF8jI2ZyKTsJXAogCQlyZWcgJj0gfkJNX0NMS0NUUkxfIyNmciMjXyMjZnMjI0ZSQUM7CQkJXAotCQlyZWcgfD0gZnJhYzsJCQkJCQlcCisJCXJlZyB8PSBmcmFjIDw8IEJQX0NMS0NUUkxfIyNmciMjXyMjZnMjI0ZSQUM7CQlcCiAJCV9fcmF3X3dyaXRlbChyZWcsIENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF8jI2ZyKTsJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTY0MCw2ICs2NDAsOCBAQAogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibHJhZGMiLCBscmFkY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzcGRpZiIsIHNwZGlmX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDI4LWZiIiwgTlVMTCwgbGNkaWZfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygibXhzLXNhaWYuMCIsIE5VTEwsIHNhaWYwX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soIm14cy1zYWlmLjEiLCBOVUxMLCBzYWlmMV9jbGspCiB9OwogCiBzdGF0aWMgaW50IGNsa19taXNjX2luaXQodm9pZCkKQEAgLTcwOCwxMSArNzEwLDExIEBACiAKIAkvKiBTQUlGIGhhcyB0byB1c2UgZnJhYyBkaXYgZm9yIGZ1bmN0aW9uYWwgb3BlcmF0aW9uICovCiAJcmVnID0gX19yYXdfcmVhZGwoQ0xLQ1RSTF9CQVNFX0FERFIgKyBIV19DTEtDVFJMX1NBSUYwKTsKLQlyZWcgJj0gfkJNX0NMS0NUUkxfU0FJRjBfRElWX0ZSQUNfRU47CisJcmVnIHw9IEJNX0NMS0NUUkxfU0FJRjBfRElWX0ZSQUNfRU47CiAJX19yYXdfd3JpdGVsKHJlZywgQ0xLQ1RSTF9CQVNFX0FERFIgKyBIV19DTEtDVFJMX1NBSUYwKTsKIAogCXJlZyA9IF9fcmF3X3JlYWRsKENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9TQUlGMSk7Ci0JcmVnICY9IH5CTV9DTEtDVFJMX1NBSUYxX0RJVl9GUkFDX0VOOworCXJlZyB8PSBCTV9DTEtDVFJMX1NBSUYxX0RJVl9GUkFDX0VOOwogCV9fcmF3X3dyaXRlbChyZWcsIENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9TQUlGMSk7CiAKIAkvKgpAQCAtNzM4LDExICs3NDAsMTcgQEAKIAlfX3Jhd193cml0ZWwoQk1fQ0xLQ1RSTF9DUFVfSU5URVJSVVBUX1dBSVQsCiAJCQlDTEtDVFJMX0JBU0VfQUREUiArIEhXX0NMS0NUUkxfQ1BVX1NFVCk7CiAKLQkvKiBFeHRyYSBmZWMgY2xvY2sgc2V0dGluZyAqLwotCXJlZyA9IF9fcmF3X3JlYWRsKENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9FTkVUKTsKLQlyZWcgJj0gfkJNX0NMS0NUUkxfRU5FVF9TTEVFUDsKLQlyZWcgfD0gQk1fQ0xLQ1RSTF9FTkVUX0NMS19PVVRfRU47Ci0JX19yYXdfd3JpdGVsKHJlZywgQ0xLQ1RSTF9CQVNFX0FERFIgKyBIV19DTEtDVFJMX0VORVQpOworCS8qCisJICogRXh0cmEgZmVjIGNsb2NrIHNldHRpbmcKKwkgKiBUaGUgREVOWCBNMjggdXNlcyBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2UKKwkgKiBhbmQgdGhlIGNsb2NrIG91dHB1dCBtdXN0IG5vdCBiZSBlbmFibGVkCisJICovCisJaWYgKCFtYWNoaW5lX2lzX20yOGV2aygpKSB7CisJCXJlZyA9IF9fcmF3X3JlYWRsKENMS0NUUkxfQkFTRV9BRERSICsgSFdfQ0xLQ1RSTF9FTkVUKTsKKwkJcmVnICY9IH5CTV9DTEtDVFJMX0VORVRfU0xFRVA7CisJCXJlZyB8PSBCTV9DTEtDVFJMX0VORVRfQ0xLX09VVF9FTjsKKwkJX19yYXdfd3JpdGVsKHJlZywgQ0xLQ1RSTF9CQVNFX0FERFIgKyBIV19DTEtDVFJMX0VORVQpOworCX0KIAogCS8qCiAJICogNDgwIE1IeiBzZWVtcyB0b28gaGlnaCB0byBiZSBzc3AgY2xvY2sgc291cmNlIGRpcmVjdGx5LApAQCAtNzc0LDYgKzc4Miw4IEBACiAJY2xrX2VuYWJsZSgmdWFydF9jbGspOwogCiAJY2xrX3NldF9wYXJlbnQoJmxjZGlmX2NsaywgJnJlZl9waXhfY2xrKTsKKwljbGtfc2V0X3BhcmVudCgmc2FpZjBfY2xrLCAmcGxsMF9jbGspOworCWNsa19zZXRfcGFyZW50KCZzYWlmMV9jbGssICZwbGwwX2Nsayk7CiAKIAljbGtkZXZfYWRkX3RhYmxlKGxvb2t1cHMsIEFSUkFZX1NJWkUobG9va3VwcykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzLW14MjMuaCBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyMy5oCmluZGV4IGM2ZjM0NWYuLjNmYTY1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyMy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyMy5oCkBAIC0yOSwzICsyOSw1IEBACiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBteDIzX2FkZF9teHNmYigKIAkJY29uc3Qgc3RydWN0IG14c2ZiX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14MjNfYWRkX3J0Y19zdG1wM3h4eCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMtbXgyOC5oIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy1teDI4LmgKaW5kZXggNzliOTQ1Mi4uYzg4ODcxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy1teDI4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy1teDI4LmgKQEAgLTQ1LDMgKzQ1LDggQEAKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14MjhfYWRkX214c2ZiKAogCQljb25zdCBzdHJ1Y3QgbXhzZmJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworCitleHRlcm4gY29uc3Qgc3RydWN0IG14c19zYWlmX2RhdGEgbXgyOF9zYWlmX2RhdGFbXSBfX2luaXRjb25zdDsKKyNkZWZpbmUgbXgyOF9hZGRfc2FpZihpZCkgICAgICAgICAgICAgIG14c19hZGRfc2FpZigmbXgyOF9zYWlmX2RhdGFbaWRdKQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgbXgyOF9hZGRfcnRjX3N0bXAzeHh4KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9LY29uZmlnCmluZGV4IGFjZjllZWEuLjE4YjZiZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL0tjb25maWcKQEAgLTIzLDMgKzIzLDkgQEAKIAogY29uZmlnIE1YU19IQVZFX1BMQVRGT1JNX01YU0ZCCiAJYm9vbAorCitjb25maWcgTVhTX0hBVkVfUExBVEZPUk1fTVhTX1NBSUYKKwlib29sCisKK2NvbmZpZyBNWFNfSEFWRV9QTEFURk9STV9SVENfU1RNUDNYWFgKKwlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9NYWtlZmlsZQppbmRleCAzNTE5MTVjLi5mNTJlM2U1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvTWFrZWZpbGUKQEAgLTgsMyArOCw1IEBACiBvYmotJChDT05GSUdfTVhTX0hBVkVfUExBVEZPUk1fTVhTX1BXTSkgKz0gcGxhdGZvcm0tbXhzLXB3bS5vCiBvYmoteSArPSBwbGF0Zm9ybS1ncGlvLW14cy5vCiBvYmotJChDT05GSUdfTVhTX0hBVkVfUExBVEZPUk1fTVhTRkIpICs9IHBsYXRmb3JtLW14c2ZiLm8KK29iai0kKENPTkZJR19NWFNfSEFWRV9QTEFURk9STV9NWFNfU0FJRikgKz0gcGxhdGZvcm0tbXhzLXNhaWYubworb2JqLSQoQ09ORklHX01YU19IQVZFX1BMQVRGT1JNX1JUQ19TVE1QM1hYWCkgKz0gcGxhdGZvcm0tcnRjLXN0bXAzeHh4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tbXhzLXNhaWYuYyBiL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tbXhzLXNhaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM5NjVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvZGV2aWNlcy9wbGF0Zm9ybS1teHMtc2FpZi5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgorI2luY2x1ZGUgPG1hY2gvbXgyOC5oPgorI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KKworI2RlZmluZSBteHNfc2FpZl9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9pZCkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLmlkID0gX2lkLAkJCQkJCVwKKwkJLmlvYmFzZSA9IHNvYyAjIyBfU0FJRiAjIyBfaWQgIyMgX0JBU0VfQUREUiwJCVwKKwkJLmlycSA9IHNvYyAjIyBfSU5UX1NBSUYgIyMgX2lkLAkJCQlcCisJCS5kbWEgPSBzb2MgIyMgX0RNQV9TQUlGICMjIF9pZCwJCQkJXAorCQkuZG1haXJxID0gc29jICMjIF9JTlRfU0FJRiAjIyBfaWQgIyNfRE1BLAkJXAorCX0KKworI2RlZmluZSBteHNfc2FpZl9kYXRhX2VudHJ5KHNvYywgX2lkKQkJCQkJXAorCVtfaWRdID0gbXhzX3NhaWZfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfaWQpCisKKyNpZmRlZiBDT05GSUdfU09DX0lNWDI4Citjb25zdCBzdHJ1Y3QgbXhzX3NhaWZfZGF0YSBteDI4X3NhaWZfZGF0YVtdIF9faW5pdGNvbnN0ID0geworCW14c19zYWlmX2RhdGFfZW50cnkoTVgyOCwgMCksCisJbXhzX3NhaWZfZGF0YV9lbnRyeShNWDI4LCAxKSwKK307CisjZW5kaWYKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14c19hZGRfc2FpZihjb25zdCBzdHJ1Y3QgbXhzX3NhaWZfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IGRhdGEtPmlvYmFzZSwKKwkJCS5lbmQgPSBkYXRhLT5pb2Jhc2UgKyBTWl80SyAtIDEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwgeworCQkJLnN0YXJ0ID0gZGF0YS0+aXJxLAorCQkJLmVuZCA9IGRhdGEtPmlycSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LCB7CisJCQkuc3RhcnQgPSBkYXRhLT5kbWEsCisJCQkuZW5kID0gZGF0YS0+ZG1hLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJCX0sIHsKKwkJCS5zdGFydCA9IGRhdGEtPmRtYWlycSwKKwkJCS5lbmQgPSBkYXRhLT5kbWFpcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKworCX07CisKKwlyZXR1cm4gbXhzX2FkZF9wbGF0Zm9ybV9kZXZpY2UoIm14cy1zYWlmIiwgZGF0YS0+aWQsIHJlcywKKwkJCQkJQVJSQVlfU0laRShyZXMpLCBOVUxMLCAwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2RldmljZXMvcGxhdGZvcm0tcnRjLXN0bXAzeHh4LmMgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLXJ0Yy1zdG1wM3h4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWVhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9kZXZpY2VzL3BsYXRmb3JtLXJ0Yy1zdG1wM3h4eC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGVuZ3V0cm9uaXgsIFdvbGZyYW0gU2FuZyA8dy5zYW5nQHBlbmd1dHJvbml4LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxtYWNoL214MjMuaD4KKyNpbmNsdWRlIDxtYWNoL214MjguaD4KKyNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfU09DX0lNWDIzCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgbXgyM19hZGRfcnRjX3N0bXAzeHh4KHZvaWQpCit7CisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBNWDIzX1JUQ19CQVNFX0FERFIsCisJCQkuZW5kID0gTVgyM19SVENfQkFTRV9BRERSICsgU1pfOEsgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IE1YMjNfSU5UX1JUQ19BTEFSTSwKKwkJCS5lbmQgPSBNWDIzX0lOVF9SVENfQUxBUk0sCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCisJcmV0dXJuIG14c19hZGRfcGxhdGZvcm1fZGV2aWNlKCJzdG1wM3h4eC1ydGMiLCAwLCByZXMsIEFSUkFZX1NJWkUocmVzKSwKKwkJCQkJTlVMTCwgMCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1NPQ19JTVgyMyAqLworCisjaWZkZWYgQ09ORklHX1NPQ19JTVgyOAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14MjhfYWRkX3J0Y19zdG1wM3h4eCh2b2lkKQoreworCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKKwkJeworCQkJLnN0YXJ0ID0gTVgyOF9SVENfQkFTRV9BRERSLAorCQkJLmVuZCA9IE1YMjhfUlRDX0JBU0VfQUREUiArIFNaXzhLIC0gMSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LCB7CisJCQkuc3RhcnQgPSBNWDI4X0lOVF9SVENfQUxBUk0sCisJCQkuZW5kID0gTVgyOF9JTlRfUlRDX0FMQVJNLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCisJfTsKKworCXJldHVybiBteHNfYWRkX3BsYXRmb3JtX2RldmljZSgic3RtcDN4eHgtcnRjIiwgMCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksCisJCQkJCU5VTEwsIDApOworfQorI2VuZGlmIC8qIENPTkZJR19TT0NfSU1YMjggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggNzk2NTBhMS4uOTBjNmI3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE0LDIzICsxNCwxNSBAQAogI2luY2x1ZGUgPG1hY2gvbXgyMy5oPgogI2luY2x1ZGUgPG1hY2gvbXgyOC5oPgogCi0jaWZkZWYgQ09ORklHX1NPQ19JTVgyMwotI2lmZGVmIFVBUlRfUEFERFIKLSNlcnJvciAiQ09ORklHX0RFQlVHX0xMIGlzIGluY29tcGF0aWJsZSB3aXRoIG11bHRpcGxlIGFyY2hzIgotI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX0lNWDIzX1VBUlQKICNkZWZpbmUgVUFSVF9QQUREUglNWDIzX0RVQVJUX0JBU0VfQUREUgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU09DX0lNWDI4Ci0jaWZkZWYgVUFSVF9QQUREUgotI2Vycm9yICJDT05GSUdfREVCVUdfTEwgaXMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGlwbGUgYXJjaHMiCi0jZW5kaWYKKyNlbGlmIGRlZmluZWQgKENPTkZJR19ERUJVR19JTVgyOF9VQVJUKQogI2RlZmluZSBVQVJUX1BBRERSCU1YMjhfRFVBUlRfQkFTRV9BRERSCiAjZW5kaWYKIAogI2RlZmluZSBVQVJUX1ZBRERSCU1YU19JT19BRERSRVNTKFVBUlRfUEFERFIpCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9VUFSVF9QQUREUglAIHBoeXNpY2FsCiAJCWxkcglccnYsID1VQVJUX1ZBRERSCUAgdmlydHVhbAogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAppbmRleCA4MTJkN2E4Li5hODA4MGY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApAQCAtOTIsMyArOTIsMTUgQEAKIC8qIHB3bSAqLwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14c19hZGRfbXhzX3B3bSgKIAkJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgaW50IGlkKTsKKworLyogc2FpZiAqLworc3RydWN0IG14c19zYWlmX2RhdGEgeworCWludCBpZDsKKwlyZXNvdXJjZV9zaXplX3QgaW9iYXNlOworCXJlc291cmNlX3NpemVfdCBpcnE7CisJcmVzb3VyY2Vfc2l6ZV90IGRtYTsKKwlyZXNvdXJjZV9zaXplX3QgZG1haXJxOworfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IG14c19hZGRfc2FpZigKKwkJY29uc3Qgc3RydWN0IG14c19zYWlmX2RhdGEgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggODI4Y2NjYy4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDM1ICsxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIENvcHlyaWdodCAyMDA4IEp1ZXJnZW4gQmVpc2VydCwga2VybmVsQHBlbmd1dHJvbml4LmRlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19NQUNIX01YU19HUElPX0hfXwotI2RlZmluZSBfX01BQ0hfTVhTX0dQSU9fSF9fCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgTVhTX0dQSU9fTlIoYmFuaywgbnIpCSgoYmFuaykgKiAzMiArIChucikpCi0KLS8qIHVzZSBncGlvbGliIGRpc3BhdGNoZXJzICovCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQkJX19ncGlvX3RvX2lycQotCi0jZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhTX0dQSU9fSVJRX1NUQVJUKQotCi0jZW5kaWYgLyogX19NQUNIX01YU19HUElPX0hfXyAqLworLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0MjBhNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICovCi0KLSNpZm5kZWYgX19NQUNIX01YU19NRU1PUllfSF9fCi0jZGVmaW5lIF9fTUFDSF9NWFNfTUVNT1JZX0hfXwotCi0jZGVmaW5lIFBIWVNfT0ZGU0VUCQlVTCgweDQwMDAwMDAwKQotCi0jZW5kaWYgLyogX19NQUNIX01YU19NRU1PUllfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbXhzLmggYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbXhzLmgKaW5kZXggMzVhODlkZC4uMGQyZDJiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214cy5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9teHMuaApAQCAtMzMsNiArMzMsNyBAQAogCQkwKQogI2RlZmluZSBjcHVfaXNfbXgyOCgpCQkoCQkJCQlcCiAJCW1hY2hpbmVfaXNfbXgyOGV2aygpIHx8CQkJCQlcCisJCW1hY2hpbmVfaXNfbTI4ZXZrKCkgfHwJCQkJCVwKIAkJbWFjaGluZV9pc190eDI4KCkgfHwJCQkJCVwKIAkJMCkKIApAQCAtODYsNiArODcsOCBAQAogCS50eXBlID0gX3R5cGUsCQkJCQkJCVwKIH0KIAorI2RlZmluZSBNWFNfR1BJT19OUihiYW5rLCBucikJKChiYW5rKSAqIDMyICsgKG5yKSkKKwogI2RlZmluZSBNWFNfU0VUX0FERFIJCTB4NAogI2RlZmluZSBNWFNfQ0xSX0FERFIJCTB4OAogI2RlZmluZSBNWFNfVE9HX0FERFIJCTB4YwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKaW5kZXggN2Y4YmY2NS4uNjc3NzY3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC02Myw2ICs2Myw3IEBACiAJCW14c19kdWFydF9iYXNlID0gTVgyM19EVUFSVF9CQVNFX0FERFI7CiAJCWJyZWFrOwogCWNhc2UgTUFDSF9UWVBFX01YMjhFVks6CisJY2FzZSBNQUNIX1RZUEVfTTI4RVZLOgogCWNhc2UgTUFDSF9UWVBFX1RYMjg6CiAJCW14c19kdWFydF9iYXNlID0gTVgyOF9EVUFSVF9CQVNFX0FERFI7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1tMjhldmsuYyBiL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbTI4ZXZrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxNjgxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbTI4ZXZrLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEKKyAqIFN0ZWZhbm8gQmFiaWMsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxzYmFiaWNAZGVueC5kZT4KKyAqCisgKiBiYXNlZCBvbjogbWFjaC1teDI4X2V2ay5jCisgKiBDb3B5cmlnaHQgMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPG1hY2gvaW9tdXgtbXgyOC5oPgorCisjaW5jbHVkZSAiZGV2aWNlcy1teDI4LmgiCisKKyNkZWZpbmUgTTI4RVZLX0dQSU9fVVNFUkxFRDEJTVhTX0dQSU9fTlIoMywgMTYpCisjZGVmaW5lIE0yOEVWS19HUElPX1VTRVJMRUQyCU1YU19HUElPX05SKDMsIDE3KQorCisjZGVmaW5lIE1YMjhFVktfQkxfRU5BQkxFCU1YU19HUElPX05SKDMsIDE4KQorI2RlZmluZSBNMjhFVktfTENEX0VOQUJMRQlNWFNfR1BJT19OUigzLCAyOCkKKworI2RlZmluZSBNWDI4RVZLX01NQzBfV1JJVEVfUFJPVEVDVAlNWFNfR1BJT19OUigyLCAxMikKKyNkZWZpbmUgTVgyOEVWS19NTUMxX1dSSVRFX1BST1RFQ1QJTVhTX0dQSU9fTlIoMCwgMjgpCisKK3N0YXRpYyBjb25zdCBpb211eF9jZmdfdCBtMjhldmtfcGFkc1tdIF9faW5pdGNvbnN0ID0geworCS8qIGR1YXJ0ICovCisJTVgyOF9QQURfQVVBUlQwX0NUU19fRFVBUlRfUlggfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfQVVBUlQwX1JUU19fRFVBUlRfVFggfCBNWFNfUEFEX0NUUkwsCisKKwkvKiBhdWFydDAgKi8KKwlNWDI4X1BBRF9BVUFSVDBfUlhfX0FVQVJUMF9SWCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9BVUFSVDBfVFhfX0FVQVJUMF9UWCB8IE1YU19QQURfQ1RSTCwKKworCS8qIGF1YXJ0MyAqLworCU1YMjhfUEFEX0FVQVJUM19SWF9fQVVBUlQzX1JYIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0FVQVJUM19UWF9fQVVBUlQzX1RYIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0FVQVJUM19DVFNfX0FVQVJUM19DVFMgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfQVVBUlQzX1JUU19fQVVBUlQzX1JUUyB8IE1YU19QQURfQ1RSTCwKKworI2RlZmluZSBNWFNfUEFEX0ZFQwkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKQorCS8qIGZlYzAgKi8KKwlNWDI4X1BBRF9FTkVUMF9NRENfX0VORVQwX01EQyB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX01ESU9fX0VORVQwX01ESU8gfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9SWF9FTl9fRU5FVDBfUlhfRU4gfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9SWEQwX19FTkVUMF9SWEQwIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfUlhEMV9fRU5FVDBfUlhEMSB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1RYX0VOX19FTkVUMF9UWF9FTiB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1RYRDBfX0VORVQwX1RYRDAgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9UWEQxX19FTkVUMF9UWEQxIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVF9DTEtfX0NMS0NUUkxfRU5FVCB8IE1YU19QQURfRkVDLAorCS8qIGZlYzEgKi8KKwlNWDI4X1BBRF9FTkVUMF9DUlNfX0VORVQxX1JYX0VOIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfUlhEMl9fRU5FVDFfUlhEMCB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1JYRDNfX0VORVQxX1JYRDEgfCBNWFNfUEFEX0ZFQywKKwlNWDI4X1BBRF9FTkVUMF9DT0xfX0VORVQxX1RYX0VOIHwgTVhTX1BBRF9GRUMsCisJTVgyOF9QQURfRU5FVDBfVFhEMl9fRU5FVDFfVFhEMCB8IE1YU19QQURfRkVDLAorCU1YMjhfUEFEX0VORVQwX1RYRDNfX0VORVQxX1RYRDEgfCBNWFNfUEFEX0ZFQywKKworCS8qIGZsZXhjYW4wICovCisJTVgyOF9QQURfR1BNSV9SRFkyX19DQU4wX1RYLAorCU1YMjhfUEFEX0dQTUlfUkRZM19fQ0FOMF9SWCwKKworCS8qIGZsZXhjYW4xICovCisJTVgyOF9QQURfR1BNSV9DRTJOX19DQU4xX1RYLAorCU1YMjhfUEFEX0dQTUlfQ0UzTl9fQ0FOMV9SWCwKKworCS8qIEkyQyAqLworCU1YMjhfUEFEX0kyQzBfU0NMX19JMkMwX1NDTCwKKwlNWDI4X1BBRF9JMkMwX1NEQV9fSTJDMF9TREEsCisKKwkvKiBteHNmYiAobGNkaWYpICovCisJTVgyOF9QQURfTENEX0QwMF9fTENEX0QwIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDFfX0xDRF9EMSB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDAyX19MQ0RfRDIgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwM19fTENEX0QzIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDRfX0xDRF9ENCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDA1X19MQ0RfRDUgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwNl9fTENEX0Q2IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMDdfX0xDRF9ENyB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDA4X19MQ0RfRDggfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QwOV9fTENEX0Q5IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTBfX0xDRF9EMTAgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxMV9fTENEX0QxMSB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDEyX19MQ0RfRDEyIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTNfX0xDRF9EMTMgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxNF9fTENEX0QxNCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDE1X19MQ0RfRDE1IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTZfX0xDRF9EMTYgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QxN19fTENEX0QxNyB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDE4X19MQ0RfRDE4IHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMTlfX0xDRF9EMTkgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QyMF9fTENEX0QyMCB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9MQ0RfRDIxX19MQ0RfRDIxIHwgTVhTX1BBRF9DVFJMLAorCU1YMjhfUEFEX0xDRF9EMjJfX0xDRF9EMjIgfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0QyM19fTENEX0QyMyB8IE1YU19QQURfQ1RSTCwKKworCU1YMjhfUEFEX0xDRF9FTkFCTEVfX0xDRF9FTkFCTEUJfCBNWFNfUEFEX0NUUkwsCisJTVgyOF9QQURfTENEX0RPVENMS19fTENEX0RPVENMSyB8IE1YU19QQURfQ1RSTCwKKworCS8qIG1tYzAgKi8KKwlNWDI4X1BBRF9TU1AwX0RBVEEwX19TU1AwX0QwIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU1NQMF9EQVRBMV9fU1NQMF9EMSB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREFUQTJfX1NTUDBfRDIgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0RBVEEzX19TU1AwX0QzIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU1NQMF9EQVRBNF9fU1NQMF9ENCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREFUQTVfX1NTUDBfRDUgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TU1AwX0RBVEE2X19TU1AwX0Q2IHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU1NQMF9EQVRBN19fU1NQMF9ENyB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfQ01EX19TU1AwX0NNRCB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX1NTUDBfREVURUNUX19TU1AwX0NBUkRfREVURUNUIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfU1NQMF9TQ0tfX1NTUDBfU0NLIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAorCisJLyogbW1jMSAqLworCU1YMjhfUEFEX0dQTUlfRDAwX19TU1AxX0QwIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9EMDFfX1NTUDFfRDEgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX0QwMl9fU1NQMV9EMiB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfRDAzX19TU1AxX0QzIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9EMDRfX1NTUDFfRDQgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX0QwNV9fU1NQMV9ENSB8CisJCShNWFNfUEFEXzhNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9QVUxMVVApLAorCU1YMjhfUEFEX0dQTUlfRDA2X19TU1AxX0Q2IHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9EMDdfX1NTUDFfRDcgfAorCQkoTVhTX1BBRF84TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX1JEWTFfX1NTUDFfQ01EIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9SRFkwX19TU1AxX0NBUkRfREVURUNUIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9XUk5fX1NTUDFfU0NLIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfM1YzIHwgTVhTX1BBRF9OT1BVTEwpLAorCS8qIHdyaXRlIHByb3RlY3QgKi8KKwlNWDI4X1BBRF9HUE1JX1JFU0VUTl9fR1BJT18wXzI4IHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX05PUFVMTCksCisJLyogc2xvdCBwb3dlciBlbmFibGUgKi8KKwlNWDI4X1BBRF9QV000X19HUElPXzNfMjkgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfTk9QVUxMKSwKKworCS8qIGxlZCAqLworCU1YMjhfUEFEX1BXTTBfX0dQSU9fM18xNiB8IE1YU19QQURfQ1RSTCwKKwlNWDI4X1BBRF9QV00xX19HUElPXzNfMTcgfCBNWFNfUEFEX0NUUkwsCisKKwkvKiBuYW5kICovCisJTVgyOF9QQURfR1BNSV9EMDBfX0dQTUlfRDAgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0QwMV9fR1BNSV9EMSB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfRDAyX19HUE1JX0QyIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9EMDNfX0dQTUlfRDMgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0QwNF9fR1BNSV9ENCB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfRDA1X19HUE1JX0Q1IHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9EMDZfX0dQTUlfRDYgfAorCQkoTVhTX1BBRF80TUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfTk9QVUxMKSwKKwlNWDI4X1BBRF9HUE1JX0QwN19fR1BNSV9ENyB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfQ0UwTl9fR1BNSV9DRTBOIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX05PUFVMTCksCisJTVgyOF9QQURfR1BNSV9SRFkwX19HUE1JX1JFQURZMCB8CisJCShNWFNfUEFEXzRNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9OT1BVTEwpLAorCU1YMjhfUEFEX0dQTUlfUkROX19HUE1JX1JETiB8CisJCShNWFNfUEFEXzEyTUEgfCBNWFNfUEFEXzFWOCB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9HUE1JX1dSTl9fR1BNSV9XUk4gfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9BTEVfX0dQTUlfQUxFIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9DTEVfX0dQTUlfQ0xFIHwKKwkJKE1YU19QQURfNE1BIHwgTVhTX1BBRF8xVjggfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfR1BNSV9SRVNFVE5fX0dQTUlfUkVTRVROIHwKKwkJKE1YU19QQURfMTJNQSB8IE1YU19QQURfMVY4IHwgTVhTX1BBRF9QVUxMVVApLAorCisJLyogQmFja2xpZ2h0ICovCisJTVgyOF9QQURfUFdNM19fR1BJT18zXzI4IHwgTVhTX1BBRF9DVFJMLAorfTsKKworLyogbGVkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fbGVkIG0yOGV2a19sZWRzW10gX19pbml0Y29uc3QgPSB7CisJeworCQkubmFtZSA9ICJ1c2VyLWxlZDEiLAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImhlYXJ0YmVhdCIsCisJCS5ncGlvID0gTTI4RVZLX0dQSU9fVVNFUkxFRDEsCisJfSwKKwl7CisJCS5uYW1lID0gInVzZXItbGVkMiIsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiaGVhcnRiZWF0IiwKKwkJLmdwaW8gPSBNMjhFVktfR1BJT19VU0VSTEVEMiwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIG0yOGV2a19sZWRfZGF0YSBfX2luaXRjb25zdCA9IHsKKwkubGVkcyA9IG0yOGV2a19sZWRzLAorCS5udW1fbGVkcyA9IEFSUkFZX1NJWkUobTI4ZXZrX2xlZHMpLAorfTsKKworc3RhdGljIHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSBteDI4X2ZlY19wZGF0YVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkvKiBmZWMwICovCisJCS5waHkgPSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSwKKwl9LCB7CisJCS8qIGZlYzEgKi8KKwkJLnBoeSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtMjhldmtfZmVjX2dldF9tYWModm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdmFsOworCWNvbnN0IHUzMiAqb2NvdHAgPSBteHNfZ2V0X29jb3RwKCk7CisKKwlpZiAoIW9jb3RwKSB7CisJCXByX2VycigiJXM6IHRpbWVvdXQgd2hlbiByZWFkaW5nIGZlYyBtYWMgZnJvbSBPQ09UUFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJLyoKKwkgKiBPQ09UUCBvbmx5IHN0b3JlcyB0aGUgbGFzdCA0IG9jdGV0cyBmb3IgZWFjaCBtYWMgYWRkcmVzcywKKwkgKiBzbyBoYXJkLWNvZGUgREVOWCBPVUkgKEMwOkU1OjRFKSBoZXJlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdmFsID0gb2NvdHBbaSAqIDRdOworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbMF0gPSAweEMwOworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbMV0gPSAweEU1OworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbMl0gPSAweDRFOworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbM10gPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJCW14MjhfZmVjX3BkYXRhW2ldLm1hY1s0XSA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlteDI4X2ZlY19wZGF0YVtpXS5tYWNbNV0gPSAodmFsID4+IDApICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogbXhzZmIgKGxjZGlmKSAqLworc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgbTI4ZXZrX3ZpZGVvX21vZGVzW10gPSB7CisJeworCQkubmFtZQkJPSAiQW1waXJlIEFNLTgwMDQ4MFIyVE1RVy1UMDFIIiwKKwkJLnJlZnJlc2gJPSA2MCwKKwkJLnhyZXMJCT0gODAwLAorCQkueXJlcwkJPSA0ODAsCisJCS5waXhjbG9jawk9IDMwMDY2LCAvKiBwaWNvc2Vjb25kICgzMy4yNiBNSHopICovCisJCS5sZWZ0X21hcmdpbgk9IDAsCisJCS5yaWdodF9tYXJnaW4JPSAyNTYsCisJCS51cHBlcl9tYXJnaW4JPSAwLAorCQkubG93ZXJfbWFyZ2luCT0gNDUsCisJCS5oc3luY19sZW4JPSAxLAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnN5bmMJCT0gRkJfU1lOQ19EQVRBX0VOQUJMRV9ISUdIX0FDVCwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHNmYl9wbGF0Zm9ybV9kYXRhIG0yOGV2a19teHNmYl9wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkubW9kZV9saXN0CT0gbTI4ZXZrX3ZpZGVvX21vZGVzLAorCS5tb2RlX2NvdW50CT0gQVJSQVlfU0laRShtMjhldmtfdmlkZW9fbW9kZXMpLAorCS5kZWZhdWx0X2JwcAk9IDE2LAorCS5sZF9pbnRmX3dpZHRoCT0gU1RNTENESUZfMThCSVQsCit9OworCitzdGF0aWMgc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSBtMjhldmtfZWVwcm9tID0geworCS5ieXRlX2xlbiA9IDE2Mzg0LAorCS5wYWdlX3NpemUgPSAzMiwKKwkuZmxhZ3MgPSBBVDI0X0ZMQUdfQUREUjE2LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBtMjhfc3RrNXYzX2kyY19ib2FyZGluZm9bXSBfX2luaXRkYXRhID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oImF0MjQiLCAweDUxKSwJLyogRTA9MSwgRTE9MCwgRTI9MCAqLworCQkucGxhdGZvcm1fZGF0YSA9ICZtMjhldmtfZWVwcm9tLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG14c19tbWNfcGxhdGZvcm1fZGF0YSBtMjhldmtfbW1jX3BkYXRhW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS8qIG1tYzAgKi8KKwkJLndwX2dwaW8gPSBNWDI4RVZLX01NQzBfV1JJVEVfUFJPVEVDVCwKKwkJLmZsYWdzID0gU0xPVEZfOF9CSVRfQ0FQQUJMRSwKKwl9LCB7CisJCS8qIG1tYzEgKi8KKwkJLndwX2dwaW8gPSBNWDI4RVZLX01NQzFfV1JJVEVfUFJPVEVDVCwKKwkJLmZsYWdzID0gU0xPVEZfOF9CSVRfQ0FQQUJMRSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG0yOGV2a19pbml0KHZvaWQpCit7CisJbXhzX2lvbXV4X3NldHVwX211bHRpcGxlX3BhZHMobTI4ZXZrX3BhZHMsIEFSUkFZX1NJWkUobTI4ZXZrX3BhZHMpKTsKKworCW14MjhfYWRkX2R1YXJ0KCk7CisJbXgyOF9hZGRfYXVhcnQwKCk7CisJbXgyOF9hZGRfYXVhcnQzKCk7CisKKwlpZiAoIW0yOGV2a19mZWNfZ2V0X21hYygpKSB7CisJCW14MjhfYWRkX2ZlYygwLCAmbXgyOF9mZWNfcGRhdGFbMF0pOworCQlteDI4X2FkZF9mZWMoMSwgJm14MjhfZmVjX3BkYXRhWzFdKTsKKwl9CisKKwlteDI4X2FkZF9mbGV4Y2FuKDAsIE5VTEwpOworCW14MjhfYWRkX2ZsZXhjYW4oMSwgTlVMTCk7CisKKwlteDI4X2FkZF9teHNmYigmbTI4ZXZrX214c2ZiX3BkYXRhKTsKKworCW14MjhfYWRkX214c19tbWMoMCwgJm0yOGV2a19tbWNfcGRhdGFbMF0pOworCW14MjhfYWRkX214c19tbWMoMSwgJm0yOGV2a19tbWNfcGRhdGFbMV0pOworCisJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKDAsICZtMjhldmtfbGVkX2RhdGEpOworCisJLyogSTJDICovCisJbXgyOF9hZGRfbXhzX2kyYygwKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBtMjhfc3RrNXYzX2kyY19ib2FyZGluZm8sCisJCQlBUlJBWV9TSVpFKG0yOF9zdGs1djNfaTJjX2JvYXJkaW5mbykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbTI4ZXZrX3RpbWVyX2luaXQodm9pZCkKK3sKKwlteDI4X2Nsb2Nrc19pbml0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIG0yOGV2a190aW1lciA9IHsKKwkuaW5pdAk9IG0yOGV2a190aW1lcl9pbml0LAorfTsKKworTUFDSElORV9TVEFSVChNMjhFVkssICJERU5YIE0yOCBFVksiKQorCS5tYXBfaW8JCT0gbXgyOF9tYXBfaW8sCisJLmluaXRfaXJxCT0gbXgyOF9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gbTI4ZXZrX2luaXQsCisJLnRpbWVyCQk9ICZtMjhldmtfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDIzZXZrLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjNldmsuYwppbmRleCAzYzJkZTMzLi5jMzI1ZmJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjNldmsuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14MjNldmsuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xNjcsNiArMTY2LDcgQEAKIAkJZ3Bpb19zZXRfdmFsdWUoTVgyM0VWS19CTF9FTkFCTEUsIDEpOwogCiAJbXgyM19hZGRfbXhzZmIoJm14MjNldmtfbXhzZmJfcGRhdGEpOworCW14MjNfYWRkX3J0Y19zdG1wM3h4eCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyM2V2a190aW1lcl9pbml0KHZvaWQpCkBAIC0xODIsNiArMTgyLDYgQEAKIAkvKiBNYWludGFpbmVyOiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLwogCS5tYXBfaW8JCT0gbXgyM19tYXBfaW8sCiAJLmluaXRfaXJxCT0gbXgyM19pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lCT0gbXgyM2V2a19pbml0LAogCS50aW1lcgkJPSAmbXgyM2V2a190aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gbXgyM2V2a19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXgyOGV2ay5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDI4ZXZrLmMKaW5kZXggZWFhZjZmZi4uMDY0ZWM1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDI4ZXZrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teDI4ZXZrLmMKQEAgLTE2LDggKzE2LDEwIEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0xODMsNiArMTg1LDI0IEBACiAKIAkvKiBsZWQgKi8KIAlNWDI4X1BBRF9BVUFSVDFfVFhfX0dQSU9fM181IHwgTVhTX1BBRF9DVFJMLAorCisJLyogSTJDICovCisJTVgyOF9QQURfSTJDMF9TQ0xfX0kyQzBfU0NMIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfSTJDMF9TREFfX0kyQzBfU0RBIHwKKwkJKE1YU19QQURfOE1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisKKwkvKiBzYWlmMCAmIHNhaWYxICovCisJTVgyOF9QQURfU0FJRjBfTUNMS19fU0FJRjBfTUNMSyB8CisJCShNWFNfUEFEXzEyTUEgfCBNWFNfUEFEXzNWMyB8IE1YU19QQURfUFVMTFVQKSwKKwlNWDI4X1BBRF9TQUlGMF9MUkNMS19fU0FJRjBfTFJDTEsgfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU0FJRjBfQklUQ0xLX19TQUlGMF9CSVRDTEsgfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU0FJRjBfU0RBVEEwX19TQUlGMF9TREFUQTAgfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCisJTVgyOF9QQURfU0FJRjFfU0RBVEEwX19TQUlGMV9TREFUQTAgfAorCQkoTVhTX1BBRF8xMk1BIHwgTVhTX1BBRF8zVjMgfCBNWFNfUEFEX1BVTExVUCksCiB9OwogCiAvKiBsZWQgKi8KQEAgLTM1Miw2ICszNzIsNTUgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBteHNfaTJjMF9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJzZ3RsNTAwMCIsIDB4MGEpLAorCX0sCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UpIHx8IGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBteDI4ZXZrX2F1ZGlvX2NvbnN1bWVyX3N1cHBsaWVzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiVkREQSIsICIwLTAwMGEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJWRERJTyIsICIwLTAwMGEiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBteDI4ZXZrX3ZkZF9yZWdfaW5pdF9kYXRhID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLm5hbWUJPSAiM1YzIiwKKwkJLmFsd2F5c19vbiA9IDEsCisJfSwKKwkuY29uc3VtZXJfc3VwcGxpZXMgPSBteDI4ZXZrX2F1ZGlvX2NvbnN1bWVyX3N1cHBsaWVzLAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKG14MjhldmtfYXVkaW9fY29uc3VtZXJfc3VwcGxpZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBteDI4ZXZrX3ZkZF9wZGF0YSA9IHsKKwkuc3VwcGx5X25hbWUJPSAiYm9hcmQtM1YzIiwKKwkubWljcm92b2x0cwk9IDMzMDAwMDAsCisJLmdwaW8JCT0gLUVJTlZBTCwKKwkuZW5hYmxlZF9hdF9ib290ID0gMSwKKwkuaW5pdF9kYXRhCT0gJm14MjhldmtfdmRkX3JlZ19pbml0X2RhdGEsCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXgyOGV2a192b2x0YWdlX3JlZ3VsYXRvciA9IHsKKwkubmFtZQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm14MjhldmtfdmRkX3BkYXRhLAorCX0sCit9Oworc3RhdGljIHZvaWQgX19pbml0IG14MjhldmtfYWRkX3JlZ3VsYXRvcnModm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm14Mjhldmtfdm9sdGFnZV9yZWd1bGF0b3IpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBteDI4ZXZrX2FkZF9yZWd1bGF0b3JzKHZvaWQpIHt9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBncGlvIG14MjhldmtfbGNkX2dwaW9zW10gPSB7CisJeyBNWDI4RVZLX0xDRF9FTkFCTEUsIEdQSU9GX09VVF9JTklUX0hJR0gsICJsY2QtZW5hYmxlIiB9LAorCXsgTVgyOEVWS19CTF9FTkFCTEUsIEdQSU9GX09VVF9JTklUX0hJR0gsICJibC1lbmFibGUiIH0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyOGV2a19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTM3OCwzMiArNDQ3LDQxIEBACiAJCW14MjhfYWRkX2ZsZXhjYW4oMSwgJm14MjhldmtfZmxleGNhbl9wZGF0YVsxXSk7CiAJfQogCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShNWDI4RVZLX0xDRF9FTkFCTEUsIEdQSU9GX0RJUl9PVVQsICJsY2QtZW5hYmxlIik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X2FycmF5KG14MjhldmtfbGNkX2dwaW9zLAorCQkJCSBBUlJBWV9TSVpFKG14MjhldmtfbGNkX2dwaW9zKSk7CiAJaWYgKHJldCkKLQkJcHJfd2FybigiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBsY2QtZW5hYmxlOiAlZFxuIiwgcmV0KTsKKwkJcHJfd2FybigiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBwaW5zIGZvciBsY2Q6ICVkXG4iLCByZXQpOwogCWVsc2UKLQkJZ3Bpb19zZXRfdmFsdWUoTVgyOEVWS19MQ0RfRU5BQkxFLCAxKTsKKwkJbXgyOF9hZGRfbXhzZmIoJm14MjhldmtfbXhzZmJfcGRhdGEpOwogCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShNWDI4RVZLX0JMX0VOQUJMRSwgR1BJT0ZfRElSX09VVCwgImJsLWVuYWJsZSIpOwotCWlmIChyZXQpCi0JCXByX3dhcm4oImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gYmwtZW5hYmxlOiAlZFxuIiwgcmV0KTsKLQllbHNlCi0JCWdwaW9fc2V0X3ZhbHVlKE1YMjhFVktfQkxfRU5BQkxFLCAxKTsKKwlteDI4X2FkZF9zYWlmKDApOworCW14MjhfYWRkX3NhaWYoMSk7CiAKLQlteDI4X2FkZF9teHNmYigmbXgyOGV2a19teHNmYl9wZGF0YSk7CisJbXgyOF9hZGRfbXhzX2kyYygwKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBteHNfaTJjMF9ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUobXhzX2kyYzBfYm9hcmRfaW5mbykpOworCisJbXgyOGV2a19hZGRfcmVndWxhdG9ycygpOworCisJbXhzX2FkZF9wbGF0Zm9ybV9kZXZpY2UoIm14cy1zZ3RsNTAwMCIsIDAsIE5VTEwsIDAsCisJCQlOVUxMLCAwKTsKIAogCS8qIHBvd2VyIG9uIG1tYyBzbG90IGJ5IHdyaXRpbmcgMCB0byB0aGUgZ3BpbyAqLwogCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTVgyOEVWS19NTUMwX1NMT1RfUE9XRVIsIEdQSU9GX09VVF9JTklUX0xPVywKIAkJCSAgICAgICAibW1jMC1zbG90LXBvd2VyIik7CiAJaWYgKHJldCkKIAkJcHJfd2FybigiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBtbWMwLXNsb3QtcG93ZXI6ICVkXG4iLCByZXQpOwotCW14MjhfYWRkX214c19tbWMoMCwgJm14MjhldmtfbW1jX3BkYXRhWzBdKTsKKwllbHNlCisJCW14MjhfYWRkX214c19tbWMoMCwgJm14MjhldmtfbW1jX3BkYXRhWzBdKTsKIAogCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoTVgyOEVWS19NTUMxX1NMT1RfUE9XRVIsIEdQSU9GX09VVF9JTklUX0xPVywKIAkJCSAgICAgICAibW1jMS1zbG90LXBvd2VyIik7CiAJaWYgKHJldCkKIAkJcHJfd2FybigiZmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyBtbWMxLXNsb3QtcG93ZXI6ICVkXG4iLCByZXQpOwotCW14MjhfYWRkX214c19tbWMoMSwgJm14MjhldmtfbW1jX3BkYXRhWzFdKTsKKwllbHNlCisJCW14MjhfYWRkX214c19tbWMoMSwgJm14MjhldmtfbW1jX3BkYXRhWzFdKTsKKworCW14MjhfYWRkX3J0Y19zdG1wM3h4eCgpOwogCiAJZ3Bpb19sZWRfcmVnaXN0ZXJfZGV2aWNlKDAsICZteDI4ZXZrX2xlZF9kYXRhKTsKIH0KQEAgLTQyMSw2ICs0OTksNiBAQAogCS8qIE1haW50YWluZXI6IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuICovCiAJLm1hcF9pbwkJPSBteDI4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBteDI4X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUJPSBteDI4ZXZrX2luaXQsCiAJLnRpbWVyCQk9ICZteDI4ZXZrX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBteDI4ZXZrX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXN0bXAzNzh4X2RldmIuYwppbmRleCA3ZjM4ZDgyLi4xNzdlNTMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXN0bXAzNzh4X2RldmIuYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXN0bXAzNzh4X2RldmIuYwpAQCAtMTksNyArMTksNiBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC05MSw2ICs5MCw3IEBACiAKIAlteDIzX2FkZF9kdWFydCgpOwogCW14MjNfYWRkX2F1YXJ0MCgpOworCW14MjNfYWRkX3J0Y19zdG1wM3h4eCgpOwogCiAJLyogcG93ZXIgb24gbW1jIHNsb3QgKi8KIAlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKFNUTVAzNzhYX0RFVkJfTU1DMF9TTE9UX1BPV0VSLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC10eDI4LmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXR4MjguYwppbmRleCA1MTVhNDIzLi45YTFmMGU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXR4MjguYworKysgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLXR4MjguYwpAQCAtMTYxLDYgKzE2MSw3IEBACiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgdHgyOF9zdGs1djNfaTJjX2JvYXJkaW5mbywKIAkJCUFSUkFZX1NJWkUodHgyOF9zdGs1djNfaTJjX2JvYXJkaW5mbykpOwogCW14MjhfYWRkX214c19tbWMoMCwgJnR4MjhfbW1jMF9wZGF0YSk7CisJbXgyOF9hZGRfcnRjX3N0bXAzeHh4KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0eDI4X3RpbWVyX2luaXQodm9pZCkKQEAgLTE3NSw2ICsxNzYsNiBAQAogTUFDSElORV9TVEFSVChUWDI4LCAiS2EtUm8gZWxlY3Ryb25pY3MgVFgyOCBtb2R1bGUiKQogCS5tYXBfaW8gPSBteDI4X21hcF9pbywKIAkuaW5pdF9pcnEgPSBteDI4X2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUgPSB0eDI4X3N0azV2M19pbml0LAogCS50aW1lciA9ICZ0eDI4X3RpbWVyLAorCS5pbml0X21hY2hpbmUgPSB0eDI4X3N0azV2M19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjMuYyBiL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyMzQ1YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tbS1teDIzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLSAqCi0gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAotICoKLSAqIENyZWF0ZSBzdGF0aWMgbWFwcGluZyBiZXR3ZWVuIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9teDIzLmg+Ci0jaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KLSNpbmNsdWRlIDxtYWNoL2lvbXV4Lmg+Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIE1YMjMgbWVtb3J5IG1hcC4KLSAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDIzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCW14c19tYXBfZW50cnkoTVgyMywgT0NSQU0sIE1UX0RFVklDRSksCi0JbXhzX21hcF9lbnRyeShNWDIzLCBJTywgTVRfREVWSUNFKSwKLX07Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQotICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncwotICogZm9yIHRoZSBJTyBtb2R1bGVzLgotICovCi12b2lkIF9faW5pdCBteDIzX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChteDIzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyM19pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IG14MjNfaW5pdF9pcnEodm9pZCkKLXsKLQlpY29sbF9pbml0X2lycSgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbW0tbXgyOC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmUxOGRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL21tLW14MjguYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhlIGNvZGUgY29udGFpbmVkIGhlcmVpbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotICoKLSAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAotICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi0gKgotICogQ3JlYXRlIHN0YXRpYyBtYXBwaW5nIGJldHdlZW4gcGh5c2ljYWwgdG8gdmlydHVhbCBtZW1vcnkuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL214MjguaD4KLSNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgotI2luY2x1ZGUgPG1hY2gvaW9tdXguaD4KLQotLyoKLSAqIERlZmluZSB0aGUgTVgyOCBtZW1vcnkgbWFwLgotICovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG14MjhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JbXhzX21hcF9lbnRyeShNWDI4LCBPQ1JBTSwgTVRfREVWSUNFKSwKLQlteHNfbWFwX2VudHJ5KE1YMjgsIElPLCBNVF9ERVZJQ0UpLAotfTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSBtYXAuIEl0IGlzIGNhbGxlZCBkdXJpbmcgdGhlCi0gKiBzeXN0ZW0gc3RhcnR1cCB0byBjcmVhdGUgc3RhdGljIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5IG1hcHBpbmdzCi0gKiBmb3IgdGhlIElPIG1vZHVsZXMuCi0gKi8KLXZvaWQgX19pbml0IG14MjhfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KG14MjhfaW9fZGVzYywgQVJSQVlfU0laRShteDI4X2lvX2Rlc2MpKTsKLX0KLQotdm9pZCBfX2luaXQgbXgyOF9pbml0X2lycSh2b2lkKQotewotCWljb2xsX2luaXRfaXJxKCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tbS5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFmNWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbW0uYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBvciBsYXRlciBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKyAqCisgKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLmh0bWwKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICoKKyAqIENyZWF0ZSBzdGF0aWMgbWFwcGluZyBiZXR3ZWVuIHBoeXNpY2FsIHRvIHZpcnR1YWwgbWVtb3J5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9teDIzLmg+CisjaW5jbHVkZSA8bWFjaC9teDI4Lmg+CisjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL2lvbXV4Lmg+CisKKy8qCisgKiBEZWZpbmUgdGhlIE1YMjMgbWVtb3J5IG1hcC4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDIzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCW14c19tYXBfZW50cnkoTVgyMywgT0NSQU0sIE1UX0RFVklDRSksCisJbXhzX21hcF9lbnRyeShNWDIzLCBJTywgTVRfREVWSUNFKSwKK307CisKKy8qCisgKiBEZWZpbmUgdGhlIE1YMjggbWVtb3J5IG1hcC4KKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBteDI4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCW14c19tYXBfZW50cnkoTVgyOCwgT0NSQU0sIE1UX0RFVklDRSksCisJbXhzX21hcF9lbnRyeShNWDI4LCBJTywgTVRfREVWSUNFKSwKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBtZW1vcnkgbWFwLiBJdCBpcyBjYWxsZWQgZHVyaW5nIHRoZQorICogc3lzdGVtIHN0YXJ0dXAgdG8gY3JlYXRlIHN0YXRpYyBwaHlzaWNhbCB0byB2aXJ0dWFsIG1lbW9yeSBtYXBwaW5ncworICogZm9yIHRoZSBJTyBtb2R1bGVzLgorICovCit2b2lkIF9faW5pdCBteDIzX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChteDIzX2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyM19pb19kZXNjKSk7Cit9CisKK3ZvaWQgX19pbml0IG14MjNfaW5pdF9pcnEodm9pZCkKK3sKKwlpY29sbF9pbml0X2lycSgpOworfQorCit2b2lkIF9faW5pdCBteDI4X21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChteDI4X2lvX2Rlc2MsIEFSUkFZX1NJWkUobXgyOF9pb19kZXNjKSk7Cit9CisKK3ZvaWQgX19pbml0IG14MjhfaW5pdF9pcnEodm9pZCkKK3sKKwlpY29sbF9pbml0X2lycSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDU2YTkxNTIuLjI0Nzc4MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgImhhcmR3YXJlLmgiCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDAwMGEwMAogCQlvcnIJXHJ2LCBccnAsICNpb19wMnYoMHgwMDEwMDAwMCkJQCB2aXJ0dWFsCiAJCW9ycglccnAsIFxycCwgIzB4MDAxMDAwMDAJCUAgcGh5c2ljYWwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW5ldHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU2MTQ5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL21hY2gtbmV0eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUIFVMKDB4ODAwMDAwMDApCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvbnhkYjUwMC5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L254ZGI1MDAuYwppbmRleCBjYThiMjAzLi45MDkwM2RkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvbnhkYjUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC9ueGRiNTAwLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKE5YREI1MDAsICJIaWxzY2hlciBueGRiNTAwIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbmV0eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbmV0eF9pbml0X2lycSwKIAkudGltZXIJCT0gJm5ldHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvbnhka24uYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9ueGRrbi5jCmluZGV4IGQ3NzVjYmUuLmM2MzM4NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC9ueGRrbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC9ueGRrbi5jCkBAIC05Myw3ICs5Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTlhES04sICJIaWxzY2hlciBueGRrbiIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG5ldHhfbWFwX2lvLAogCS5pbml0X2lycQk9IG5ldHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZuZXR4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L254ZWI1MDBobWkuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9ueGViNTAwaG1pLmMKaW5kZXggZGUzNjljZC4uOGY1NDhlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L254ZWI1MDBobWkuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvbnhlYjUwMGhtaS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChOWEVCNTAwSE1JLCAiSGlsc2NoZXIgbnhlYjUwMGhtaSIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG5ldHhfbWFwX2lvLAogCS5pbml0X2lycQk9IG5ldHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZuZXR4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwppbmRleCBmMDA5YjU0Li5lNGNmYjdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgveGMuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgveGMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvYm9hcmQtbmhrODgxNS5jIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2JvYXJkLW5oazg4MTUuYwppbmRleCAxMzk5MzAzLi4wY2JiNzRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvYm9hcmQtbmhrODgxNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9ib2FyZC1uaGs4ODE1LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KICNpbmNsdWRlIDxwbGF0L210dS5oPgogCiAjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgpAQCAtMjc2LDcgKzI3Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTk9NQURJSywgIk5ISzg4MTUiKQogCS8qIE1haW50YWluZXI6IFNUIE1pY3JvRWxlY3Ryb25pY3MgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGNwdTg4MTVfbWFwX2lvLAogCS5pbml0X2lycQk9IGNwdTg4MTVfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZub21hZGlrX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2NwdS04ODE1LmMgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvY3B1LTg4MTUuYwppbmRleCBhYzU4ZTNiLi5kYzY3NzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvY3B1LTg4MTUuYworKysgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvY3B1LTg4MTUuYwpAQCAtMjEsOCArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaTJjLTg4MTVuaGsuYyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pMmMtODgxNW5oay5jCmluZGV4IGFiZmUyNWEuLjBmYzJmNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pMmMtODgxNW5oay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pMmMtODgxNW5oay5jCkBAIC0zLDggKzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAKIC8qCiAgKiBUaGVyZSBhcmUgdHdvIGJ1c3NlcyBpbiB0aGUgODgxNU5ISy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBlNzE1MWI0Li43MzU0MTc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMCw3ICsxMCw3IEBACiAgKgogKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMTAwMDAwCiAJCWFkZAlccnAsIFxycCwgIzB4MDAwZmIwMDAKIAkJYWRkCVxydiwgXHJwLCAjMHhmMDAwMDAwMAlAIHZpcnR1YWwgYmFzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ub21hZGlrL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA3YTgxYTA0Li5lZmRkZTBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw2ICsxLDQgQEAKICNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKICNkZWZpbmUgX19BU01fQVJDSF9HUElPX0gKIAotI2luY2x1ZGUgPHBsYXQvZ3Bpby5oPgotCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLW5vbWFkaWsvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMyNTIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogIG1hY2gtbm9tYWRpay9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmM0MGEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1pZiBBUkNIX05VQzkzWAotCi1jb25maWcgQ1BVX05VQzkzMgotCWJvb2wKLQloZWxwCi0JICBTdXBwb3J0IGZvciBOVUM5MzIgb2YgTnV2b3RvbiBOVUM5M1ggQ1BVcy4KLQotbWVudSAiTlVDOTMyIE1hY2hpbmVzIgotCi1jb25maWcgTUFDSF9OVUM5MzJFVkIKLQlib29sICJOdXZvdG9uIE5VQzkzMiBFdmFsdWF0aW9uIEJvYXJkIgotCWRlZmF1bHQgeQotCXNlbGVjdCBDUFVfTlVDOTMyCi0JaGVscAotCSAgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgTnV2b3RvbiBOVUM5MzJFVkIKLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwZTJkZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgT2JqZWN0IGZpbGUgbGlzdHMuCi0KLW9iai15CQkJCTo9IGlycS5vIHRpbWUubyBkZXYubyBjcHUubyBjbG9jay5vCi0jIE5VQzkzMiBDUFUgc3VwcG9ydCBmaWxlcwotCi1vYmotJChDT05GSUdfQ1BVX05VQzkzMikJKz0gbnVjOTMyLm8KLQotIyBtYWNoaW5lIHN1cHBvcnQKLQotb2JqLSQoQ09ORklHX01BQ0hfTlVDOTMyRVZCKQkrPSBtYWNoLW51YzkzMmV2Yi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvTWFrZWZpbGUuYm9vdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZDQyMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9NYWtlZmlsZS5ib290CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi16cmVsYWRkci15CSs9IDB4MDAwMDgwMDAKLXBhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyMWVmYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtbnVjOTN4L2Nsb2NrLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSAiY2xvY2suaCIKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NfbG9jayk7Ci0KLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2Nrc19sb2NrLCBmbGFncyk7Ci0JaWYgKGNsay0+ZW5hYmxlZCsrID09IDApCi0JCShjbGstPmVuYWJsZSkoY2xrLCAxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19lbmFibGUpOwotCi12b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JV0FSTl9PTihjbGstPmVuYWJsZWQgPT0gMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzX2xvY2ssIGZsYWdzKTsKLQlpZiAoLS1jbGstPmVuYWJsZWQgPT0gMCkKLQkJKGNsay0+ZW5hYmxlKShjbGssIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2Nrc19sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19kaXNhYmxlKTsKLQotdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiAyNzAwMDAwMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKLQotdm9pZCBudWM5M3hfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgaW50IGNsb2NrcyA9IGNsay0+Y2tlbjsKLQl1bnNpZ25lZCBsb25nIGNsa2VuOwotCi0JY2xrZW4gPSBfX3Jhd19yZWFkbChOVUM5M1hfVkFfQ0xLUFdSKTsKLQotCWlmIChlbmFibGUpCi0JCWNsa2VuIHw9IGNsb2NrczsKLQllbHNlCi0JCWNsa2VuICY9IH5jbG9ja3M7Ci0KLQlfX3Jhd193cml0ZWwoY2xrZW4sIE5VQzkzWF9WQV9DTEtQV1IpOwotfQotCi12b2lkIGNsa3NfcmVnaXN0ZXIoc3RydWN0IGNsa19sb29rdXAgKmNsa3MsIHNpemVfdCBudW0pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0JCWNsa2Rldl9hZGQoJmNsa3NbaV0pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Nsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTFmMWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW51YzkzeC9jbG9jay5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotCi12b2lkIG51YzkzeF9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7Ci12b2lkIGNsa3NfcmVnaXN0ZXIoc3RydWN0IGNsa19sb29rdXAgKmNsa3MsIHNpemVfdCBudW0pOwotCi1zdHJ1Y3QgY2xrIHsKLQl1bnNpZ25lZCBsb25nCQlja2VuOwotCXVuc2lnbmVkIGludAkJZW5hYmxlZDsKLQl2b2lkCQkJKCplbmFibGUpKHN0cnVjdCBjbGsgKiwgaW50IGVuYWJsZSk7Ci19OwotCi0jZGVmaW5lIERFRklORV9DTEsoX25hbWUsIF9jdHJsYml0KQkJCVwKLXN0cnVjdCBjbGsgY2xrXyMjX25hbWUgPSB7CQkJCVwKLQkJLmVuYWJsZQk9IG51YzkzeF9jbGtfZW5hYmxlLAkJXAotCQkuY2tlbgk9ICgxIDw8IF9jdHJsYml0KSwJCVwKLQl9Ci0KLSNkZWZpbmUgREVGX0NMS0xPT0soX2NsaywgX2Rldm5hbWUsIF9jb25uYW1lKQkJXAotCXsJCQkJCQlcCi0JCS5jbGsJCT0gX2NsaywJCQlcCi0JCS5kZXZfaWQJCT0gX2Rldm5hbWUsCQlcCi0JCS5jb25faWQJCT0gX2Nvbm5hbWUsCQlcCi0JfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmZmNWQ4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOdXZvdG9uIGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBOVUM5M3ggc2VyaWVzIGNwdSBjb21tb24gc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1lYmkuaD4KLQotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImNsb2NrLmgiCi0KLS8qIEluaXRpYWwgSU8gbWFwcGluZ3MgKi8KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBudWM5M3hfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQlJT0RFU0NfRU5UKElSUSksCi0JSU9ERVNDX0VOVChHQ1IpLAotCUlPREVTQ19FTlQoVUFSVCksCi0JSU9ERVNDX0VOVChUSU1FUiksCi0JSU9ERVNDX0VOVChFQkkpLAotfTsKLQotLyogSW5pdGlhbCBudWM5MzIgY2xvY2sgZGVjbGFyYXRpb25zLiAqLwotc3RhdGljIERFRklORV9DTEsoYXVkaW8sIDIpOwotc3RhdGljIERFRklORV9DTEsoc2QsIDMpOwotc3RhdGljIERFRklORV9DTEsoanBnLCA0KTsKLXN0YXRpYyBERUZJTkVfQ0xLKHZpZGVvLCA1KTsKLXN0YXRpYyBERUZJTkVfQ0xLKHZwb3N0LCA2KTsKLXN0YXRpYyBERUZJTkVfQ0xLKDJkLCA3KTsKLXN0YXRpYyBERUZJTkVfQ0xLKGdwdSwgOCk7Ci1zdGF0aWMgREVGSU5FX0NMSyhnZG1hLCA5KTsKLXN0YXRpYyBERUZJTkVfQ0xLKGFkYywgMTApOwotc3RhdGljIERFRklORV9DTEsodWFydCwgMTEpOwotc3RhdGljIERFRklORV9DTEsoc3BpLCAxMik7Ci1zdGF0aWMgREVGSU5FX0NMSyhwd20sIDEzKTsKLXN0YXRpYyBERUZJTkVfQ0xLKHRpbWVyLCAxNCk7Ci1zdGF0aWMgREVGSU5FX0NMSyh3ZHQsIDE1KTsKLXN0YXRpYyBERUZJTkVfQ0xLKGFjOTcsIDE2KTsKLXN0YXRpYyBERUZJTkVfQ0xLKGkycywgMTYpOwotc3RhdGljIERFRklORV9DTEsodXNiY2ssIDE3KTsKLXN0YXRpYyBERUZJTkVfQ0xLKHVzYjQ4LCAxOCk7Ci1zdGF0aWMgREVGSU5FX0NMSyh1c2JoLCAxOSk7Ci1zdGF0aWMgREVGSU5FX0NMSyhpMmMsIDIwKTsKLXN0YXRpYyBERUZJTkVfQ0xLKGV4dCwgMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBudWM5MzJfY2xrcmVnc1tdID0gewotICAgICAgIERFRl9DTEtMT09LKCZjbGtfYXVkaW8sICJudWM5MzItYXVkaW8iLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3NkLCAibnVjOTMyLXNkIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19qcGcsICJudWM5MzItanBnIiwgIk5VTEwiKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3ZpZGVvLCAibnVjOTMyLXZpZGVvIiwgIk5VTEwiKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3Zwb3N0LCAibnVjOTMyLXZwb3N0IiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa18yZCwgIm51YzkzMi0yZCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfZ3B1LCAibnVjOTMyLWdwdSIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfZ2RtYSwgIm51YzkzMi1nZG1hIiwgIk5VTEwiKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX2FkYywgIm51YzkzMi1hZGMiLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3VhcnQsIE5VTEwsICJ1YXJ0IiksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19zcGksICJudWM5MzItc3BpIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19wd20sICJudWM5MzItcHdtIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa190aW1lciwgTlVMTCwgInRpbWVyIiksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa193ZHQsICJudWM5MzItd2R0IiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19hYzk3LCAibnVjOTMyLWFjOTciLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX2kycywgIm51YzkzMi1pMnMiLCBOVUxMKSwKLSAgICAgICBERUZfQ0xLTE9PSygmY2xrX3VzYmNrLCAibnVjOTMyLXVzYmNrIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa191c2I0OCwgIm51YzkzMi11c2I0OCIsIE5VTEwpLAotICAgICAgIERFRl9DTEtMT09LKCZjbGtfdXNiaCwgIm51YzkzMi11c2JoIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19pMmMsICJudWM5MzItaTJjIiwgTlVMTCksCi0gICAgICAgREVGX0NMS0xPT0soJmNsa19leHQsIE5VTEwsICJleHQiKSwKLX07Ci0KLS8qIEluaXRpYWwgc2VyaWFsIHBsYXRmb3JtIGRhdGEgKi8KLQotc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IG51YzkzeF91YXJ0X2RhdGFbXSA9IHsKLQlOVUM5M1hfODI1MFBPUlQoVUFSVDApLAotCXt9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBudWM5M3hfc2VyaWFsX2RldmljZSA9IHsKLQkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSBudWM5M3hfdWFydF9kYXRhLAotCX0sCi19OwotCi0vKkluaXQgTlVDOTN4IGV2YiBpbyovCi0KLXZvaWQgX19pbml0IG51YzkzeF9tYXBfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBtYWNoX3NpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBpZGNvZGUgPSAweDA7Ci0KLQlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBtYWNoX3NpemUpOwotCWlvdGFibGVfaW5pdChudWM5M3hfaW9kZXNjLCBBUlJBWV9TSVpFKG51YzkzeF9pb2Rlc2MpKTsKLQotCWlkY29kZSA9IF9fcmF3X3JlYWRsKE5VQzkzWFBESUQpOwotCWlmIChpZGNvZGUgPT0gTlVDOTMyX0NQVUlEKQotCQlwcmludGsoS0VSTl9JTkZPICJDUFUgdHlwZSAweCUwOGx4IGlzIE5VQzkxMFxuIiwgaWRjb2RlKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiQ1BVIHR5cGUgZGV0ZWN0IGVycm9yIVxuIik7Ci0KLX0KLQotLypJbml0IE5VQzkzeCBjbG9jayovCi0KLXZvaWQgX19pbml0IG51YzkzeF9pbml0X2Nsb2Nrcyh2b2lkKQotewotCWNsa3NfcmVnaXN0ZXIobnVjOTMyX2Nsa3JlZ3MsIEFSUkFZX1NJWkUobnVjOTMyX2Nsa3JlZ3MpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvY3B1LmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9jcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlZjI4MTk3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2NwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2NwdS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgTlVDOTNYIENQVSBzdXBwb3J0Ci0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNkZWZpbmUgSU9ERVNDX0VOVCh5KQkJCQkJXAotewkJCQkJCQlcCi0JLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylOVUM5M1hfVkFfIyN5LAlcCi0JLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKE5VQzkzWF9QQV8jI3kpLAlcCi0JLmxlbmd0aCAgPSBOVUM5M1hfU1pfIyN5LAkJCVwKLQkudHlwZSAgICA9IE1UX0RFVklDRSwJCQkJXAotfQotCi0jZGVmaW5lIE5VQzkzWF84MjUwUE9SVChuYW1lKQkJCQkJXAotewkJCQkJCQkJXAotCS5tZW1iYXNlCT0gbmFtZSMjX0JBLAkJCQlcCi0JLm1hcGJhc2UJPSBuYW1lIyNfUEEsCQkJCVwKLQkuaXJxCQk9IElSUV8jI25hbWUsCQkJCVwKLQkudWFydGNsawk9IDU3MTM5MjAwLAkJCQlcCi0JLnJlZ3NoaWZ0CT0gMiwJCQkJCVwKLQkuaW90eXBlCQk9IFVQSU9fTUVNLAkJCQlcCi0JLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwJXAotfQotCi0vKkNwdSBpZGVudGlmaWVyIHJlZ2lzdGVyKi8KLQotI2RlZmluZSBOVUM5M1hQRElECU5VQzkzWF9WQV9HQ1IKLSNkZWZpbmUgTlVDOTMyX0NQVUlECTB4Mjk1NTAwOTEKLQotLyogZXh0ZXJuIGZpbGUgZnJvbSBjcHUuYyAqLwotCi1leHRlcm4gdm9pZCBudWM5M3hfY2xvY2tfc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqc3JjKTsKLWV4dGVybiB2b2lkIG51YzkzeF9pbml0X2Nsb2Nrcyh2b2lkKTsKLWV4dGVybiB2b2lkIG51YzkzeF9tYXBfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBtYWNoX3NpemUpOwotZXh0ZXJuIHZvaWQgbnVjOTN4X2JvYXJkX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKmRldmljZSwgaW50IHNpemUpOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbnVjOTN4X3NlcmlhbF9kZXZpY2U7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2Rldi5jIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjJhZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvZGV2LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgTnV2b3RvbiBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlICJjcHUuaCIKLQotLypIZXJlIHNob3VsZCBiZSB5b3VyIGV2YiByZXNvdXJzZSxzdWNoIGFzIExDRCovCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudWM5M3hfcHVibGljX2RldltdIF9faW5pdGRhdGEgPSB7Ci0JJm51YzkzeF9zZXJpYWxfZGV2aWNlLAotfTsKLQotLyogUHJvdmlkZSBhZGRpbmcgc3BlY2lmaWMgQ1BVIHBsYXRmb3JtIGRldmljZXMgQVBJICovCi0KLXZvaWQgX19pbml0IG51YzkzeF9ib2FyZF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipkZXZpY2UsIGludCBzaXplKQotewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZSwgc2l6ZSk7Ci0JcGxhdGZvcm1fYWRkX2RldmljZXMobnVjOTN4X3B1YmxpY19kZXYsIEFSUkFZX1NJWkUobnVjOTN4X3B1YmxpY19kZXYpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1MmNiZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1pcnEuaD4KLQotCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLQkuZW5kbQotCi0JLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCi0JLmVuZG0KLQotCS5tYWNybwlnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKLQotCQltb3YJXGJhc2UsICNBSUNfQkEKLQotCQlsZHIJXGlycW5yLCBbIFxiYXNlLCAjQUlDX0lQRVJdCi0JCWxkcglcaXJxbnIsIFsgXGJhc2UsICNBSUNfSVNOUl0KLQkJY21wCVxpcnFuciwgIzAKLQotCS5lbmRtCi0KLQkvKiBjdXJyZW50bHkgZG9uJ3QgbmVlZCBhbiBkaXNhYmxlX2ZpcSBtYWNybyAqLwotCi0JLm1hY3JvCWRpc2FibGVfZmlxCi0JLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWM2ZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAotI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKLQotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTUwNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lPX0gKLSNkZWZpbmUgX19BU01fQVJNX0FSQ0hfSU9fSAotCi0jZGVmaW5lIElPX1NQQUNFX0xJTUlUCTB4ZmZmZmZmZmYKLQotLyoKLSAqIDE6MSBtYXBwaW5nIGZvciBpb3JlbWFwcGVkIHJlZ2lvbnMuCi0gKi8KLQotI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCi0jZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL2lycXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0YWE3MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9pcnFzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICi0KLSNkZWZpbmUgTlVDOTNYX0lSUSh4KQkoeCkKLQotLyogTWFpbiBjcHUgaW50ZXJydXB0cyAqLwotCi0jZGVmaW5lIElSUV9XRFQJCU5VQzkzWF9JUlEoMSkKLSNkZWZpbmUgSVJRX0lSUTAJTlVDOTNYX0lSUSgyKQotI2RlZmluZSBJUlFfSVJRMQlOVUM5M1hfSVJRKDMpCi0jZGVmaW5lIElSUV9JUlEyCU5VQzkzWF9JUlEoNCkKLSNkZWZpbmUgSVJRX0lSUTMJTlVDOTNYX0lSUSg1KQotI2RlZmluZSBJUlFfVVNCSAlOVUM5M1hfSVJRKDYpCi0jZGVmaW5lIElSUV9BUFUJCU5VQzkzWF9JUlEoNykKLSNkZWZpbmUgSVJRX1ZQT1NUCU5VQzkzWF9JUlEoOCkKLSNkZWZpbmUgSVJRX0FEQwkJTlVDOTNYX0lSUSg5KQotI2RlZmluZSBJUlFfVUFSVDAJTlVDOTNYX0lSUSgxMCkKLSNkZWZpbmUgSVJRX1RJTUVSMAlOVUM5M1hfSVJRKDExKQotI2RlZmluZSBJUlFfR1BVMAlOVUM5M1hfSVJRKDEyKQotI2RlZmluZSBJUlFfR1BVMQlOVUM5M1hfSVJRKDEzKQotI2RlZmluZSBJUlFfR1BVMglOVUM5M1hfSVJRKDE0KQotI2RlZmluZSBJUlFfR1BVMwlOVUM5M1hfSVJRKDE1KQotI2RlZmluZSBJUlFfR1BVNAlOVUM5M1hfSVJRKDE2KQotI2RlZmluZSBJUlFfVklOCQlOVUM5M1hfSVJRKDE3KQotI2RlZmluZSBJUlFfVVNCRAlOVUM5M1hfSVJRKDE4KQotI2RlZmluZSBJUlFfVlJBTUxECU5VQzkzWF9JUlEoMTkpCi0jZGVmaW5lIElSUV9HRE1BMAlOVUM5M1hfSVJRKDIwKQotI2RlZmluZSBJUlFfR0RNQTEJTlVDOTNYX0lSUSgyMSkKLSNkZWZpbmUgSVJRX1NESU8JTlVDOTNYX0lSUSgyMikKLSNkZWZpbmUgSVJRX0ZNSQkJTlVDOTNYX0lSUSgyMikKLSNkZWZpbmUgSVJRX0pQRUcJTlVDOTNYX0lSUSgyMykKLSNkZWZpbmUgSVJRX1NQSTAJTlVDOTNYX0lSUSgyNCkKLSNkZWZpbmUgSVJRX1NQSTEJTlVDOTNYX0lSUSgyNSkKLSNkZWZpbmUgSVJRX1JUQwkJTlVDOTNYX0lSUSgyNikKLSNkZWZpbmUgSVJRX1BXTTAJTlVDOTNYX0lSUSgyNykKLSNkZWZpbmUgSVJRX1BXTTEJTlVDOTNYX0lSUSgyOCkKLSNkZWZpbmUgSVJRX1BXTTIJTlVDOTNYX0lSUSgyOSkKLSNkZWZpbmUgSVJRX1BXTTMJTlVDOTNYX0lSUSgzMCkKLSNkZWZpbmUgSVJRX0kyU0FDOTcJTlVDOTNYX0lSUSgzMSkKLSNkZWZpbmUgSVJRX0NBUDAJSVJRX1BXTTAKLSNkZWZpbmUgSVJRX0NBUDEJSVJRX1BXTTEKLSNkZWZpbmUgSVJRX0NBUDIJSVJRX1BXTTIKLSNkZWZpbmUgSVJRX0NBUDMJSVJRX1BXTTMKLSNkZWZpbmUgTlJfSVJRUwkJKElSUV9JMlNBQzk3ICsgMSkKLQotI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwYjVlOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tYXAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NQVBfSAotI2RlZmluZSBfX0FTTV9BUkNIX01BUF9ICi0KLSNkZWZpbmUgTUFQX09GRlNFVAkoMHhmZmYwMDAwMCkKLSNkZWZpbmUgQ0xLX09GRlNFVAkoMHgxMCkKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgTlVDOTNYX0FERFIoeCkJKCh2b2lkIF9faW9tZW0gKikoMHhGMDAwMDAwMCArICgoeCkmKH5NQVBfT0ZGU0VUKSkpKQotI2Vsc2UKLSNkZWZpbmUgTlVDOTNYX0FERFIoeCkJKDB4RjAwMDAwMDAgKyAoKHgpJih+TUFQX09GRlNFVCkpKQotI2VuZGlmCi0KLSAvKgotICAqIG51YzkzMiBoYXJkd2FyZSByZWdpc3RlciBkZWZpbml0aW9uCi0gICovCi0KLSNkZWZpbmUgTlVDOTNYX1BBX0lSUQkJKDB4RkZGODMwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9HQ1IJCSgweEZGRjAwMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfRUJJCQkoMHhGRkYwMTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1VBUlQJCSgweEZGRjgwMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfVElNRVIJCSgweEZGRjgxMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfR1BJTwkJKDB4RkZGODQwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9HRE1BCQkoMHhGRkYwMzAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1VTQkhPU1QJKDB4RkZGMGQwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9JMkMJCSgweEZGRjg5MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfTENECQkoMHhGRkYwNjAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0dFCQkoMHhGRkYwNTAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0FEQwkJKDB4RkZGODUwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9SVEMJCSgweEZGRjg3MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfUFdNCQkoMHhGRkY4MjAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0FDVEwJCSgweEZGRjBhMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfVVNCREVWCSgweEZGRjBDMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfSkVQRUcJCSgweEZGRjBlMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfQ0FDSEVfVAkoMHhGRkY2MDAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX1ZSQU0JCSgweEZGRjBiMDAwKQotI2RlZmluZSBOVUM5M1hfUEFfRE1BQwkJKDB4RkZGMDkwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9JMlNNCQkoMHhGRkYwODAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0NBQ0hFCQkoMHhGRkYwMjAwMCkKLSNkZWZpbmUgTlVDOTNYX1BBX0dQVQkJKDB4RkZGMDQwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9WSURFT0lOCSgweEZGRjA3MDAwKQotI2RlZmluZSBOVUM5M1hfUEFfU1BJMAkJKDB4RkZGODYwMDApCi0jZGVmaW5lIE5VQzkzWF9QQV9TUEkxCQkoMHhGRkY4ODAwMCkKLQotIC8qCi0gICogbnVjOTMyIHZpcnR1YWwgYWRkcmVzcyBtYXBwaW5nLgotICAqIGludGVycnVwdCBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCB0aGluZyB3ZSBwdXQgaW4sIHRvIG1ha2UKLSAgKiB0aGUgYXNzZW1ibHkgY29kZSBmb3IgdGhlIGlycSBkZXRlY3Rpb24gZWFzaWVyCi0gICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX0lSUQkJTlVDOTNYX0FERFIoMHgwMDAwMDAwMCkKLSNkZWZpbmUgTlVDOTNYX1NaX0lSUQkJU1pfNEsKLQotI2RlZmluZSBOVUM5M1hfVkFfR0NSCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfSVJRKQotI2RlZmluZSBOVUM5M1hfVkFfQ0xLUFdSCShOVUM5M1hfVkFfR0NSK0NMS19PRkZTRVQpCi0jZGVmaW5lIE5VQzkzWF9TWl9HQ1IJCVNaXzRLCi0KLS8qIEVCSSBtYW5hZ2VtZW50ICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX0VCSQkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0VCSSkKLSNkZWZpbmUgTlVDOTNYX1NaX0VCSQkJU1pfNEsKLQotLyogVUFSVHMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfVUFSVAkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX1VBUlQpCi0jZGVmaW5lIE5VQzkzWF9TWl9VQVJUCQlTWl80SwotCi0vKiBUaW1lcnMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfVElNRVIJTlVDOTNYX0FERFIoTlVDOTNYX1BBX1RJTUVSKQotI2RlZmluZSBOVUM5M1hfU1pfVElNRVIJU1pfNEsKLQotLyogR1BJTyBwb3J0cyAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9HUElPCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfR1BJTykKLSNkZWZpbmUgTlVDOTNYX1NaX0dQSU8JCVNaXzRLCi0KLS8qIEdETUEgY29udHJvbCAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9HRE1BCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfR0RNQSkKLSNkZWZpbmUgTlVDOTNYX1NaX0dETUEJCVNaXzRLCi0KLS8qIEkyQyBoYXJkd2FyZSBjb250cm9sbGVyICovCi0KLSNkZWZpbmUgTlVDOTNYX1ZBX0kyQwkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0kyQykKLSNkZWZpbmUgTlVDOTNYX1NaX0kyQwkJU1pfNEsKLQotLyogTENEIGNvbnRyb2xsZXIqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9MQ0QJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9MQ0QpCi0jZGVmaW5lIE5VQzkzWF9TWl9MQ0QJCVNaXzRLCi0KLS8qIDJEIGNvbnRyb2xsZXIqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9HRQkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0dFKQotI2RlZmluZSBOVUM5M1hfU1pfR0UJCVNaXzRLCi0KLS8qIEFEQyAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9BREMJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9BREMpCi0jZGVmaW5lIE5VQzkzWF9TWl9BREMJCVNaXzRLCi0KLS8qIFJUQyAqLwotCi0jZGVmaW5lIE5VQzkzWF9WQV9SVEMJCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9SVEMpCi0jZGVmaW5lIE5VQzkzWF9TWl9SVEMJCVNaXzRLCi0KLS8qIFB1bHNlIFdpZHRoIE1vZHVsYXRpb24oUFdNKSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfUFdNCQlOVUM5M1hfQUREUihOVUM5M1hfUEFfUFdNKQotI2RlZmluZSBOVUM5M1hfU1pfUFdNCQlTWl80SwotCi0vKiBBdWRpbyBDb250cm9sbGVyIGNvbnRyb2xsZXIgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfQUNUTAkJTlVDOTNYX0FERFIoTlVDOTNYX1BBX0FDVEwpCi0jZGVmaW5lIE5VQzkzWF9TWl9BQ1RMCQlTWl80SwotCi0vKiBVU0IgRGV2aWNlIHBvcnQgKi8KLQotI2RlZmluZSBOVUM5M1hfVkFfVVNCREVWCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9VU0JERVYpCi0jZGVmaW5lIE5VQzkzWF9TWl9VU0JERVYJU1pfNEsKLQotLyogVVNCIGhvc3QgY29udHJvbGxlciovCi0jZGVmaW5lIE5VQzkzWF9WQV9VU0JIT1NUCU5VQzkzWF9BRERSKE5VQzkzWF9QQV9VU0JIT1NUKQotI2RlZmluZSBOVUM5M1hfU1pfVVNCSE9TVAlTWl80SwotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjk4NjRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiMjk1NC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19DTE9DS19ICi0KLS8qIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICAqLwotI2RlZmluZSBDTEtfQkEJCU5VQzkzWF9WQV9DTEtQV1IKLSNkZWZpbmUgUkVHX0NMS0VOCShDTEtfQkEgKyAweDAwKQotI2RlZmluZSBSRUdfQ0xLU0VMCShDTEtfQkEgKyAweDA0KQotI2RlZmluZSBSRUdfQ0xLRElWCShDTEtfQkEgKyAweDA4KQotI2RlZmluZSBSRUdfUExMQ09OMAkoQ0xLX0JBICsgMHgwQykKLSNkZWZpbmUgUkVHX1BMTENPTjEJKENMS19CQSArIDB4MTApCi0jZGVmaW5lIFJFR19QTUNPTgkoQ0xLX0JBICsgMHgxNCkKLSNkZWZpbmUgUkVHX0lSUVdBS0VDT04JKENMS19CQSArIDB4MTgpCi0jZGVmaW5lIFJFR19JUlFXQUtFRkxBRwkoQ0xLX0JBICsgMHgxQykKLSNkZWZpbmUgUkVHX0lQU1JTVAkoQ0xLX0JBICsgMHgyMCkKLSNkZWZpbmUgUkVHX0NMS0VOMQkoQ0xLX0JBICsgMHgyNCkKLSNkZWZpbmUgUkVHX0NMS0RJVjEJKENMS19CQSArIDB4MjgpCi0KLS8qIERlZmluZSBQTEwgZnJlcSBzZXR0aW5nICovCi0jZGVmaW5lIFBMTF9ESVNBQkxFCQkweDEyQjYzCi0jZGVmaW5lCVBMTF82Nk1IWgkJMHgyQjYzCi0jZGVmaW5lCVBMTF8xMDBNSFoJCTB4NEY2NAotI2RlZmluZSBQTExfMTIwTUhaCQkweDRGNjMKLSNkZWZpbmUJUExMXzE2Nk1IWgkJMHg0MTI0Ci0jZGVmaW5lCVBMTF8yMDBNSFoJCTB4NEYyNAotCi0vKiBEZWZpbmUgQUhCOkNQVUZSRVEgcmF0aW8gKi8KLSNkZWZpbmUJQUhCX0NQVUNMS18xXzEJCTB4MDAKLSNkZWZpbmUJQUhCX0NQVUNMS18xXzIJCTB4MDEKLSNkZWZpbmUJQUhCX0NQVUNMS18xXzQJCTB4MDIKLSNkZWZpbmUJQUhCX0NQVUNMS18xXzgJCTB4MDMKLQotLyogRGVmaW5lIEFQQjpBSEIgcmF0aW8gKi8KLSNkZWZpbmUgQVBCX0FIQl8xXzIJCTB4MDEKLSNkZWZpbmUgQVBCX0FIQl8xXzQJCTB4MDIKLSNkZWZpbmUgQVBCX0FIQl8xXzgJCTB4MDMKLQotLyogRGVmaW5lIGNsb2NrIHNrZXcgKi8KLSNkZWZpbmUgREVGQVVMVFNLRVcJCTB4NDgKLQotI2VuZGlmIC8qICBfX0FTTV9BUkNIX1JFR1NfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtZWJpLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1lYmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MjU1MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1lYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1lYmkuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9SRUdTX0VCSV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19FQklfSAotCi0vKiBFQkkgQ29udHJvbCBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBFQklfQkEJCU5VQzkzWF9WQV9FQkkKLSNkZWZpbmUgUkVHX0VCSUNPTgkoRUJJX0JBICsgMHgwMCkKLSNkZWZpbmUgUkVHX1JPTUNPTgkoRUJJX0JBICsgMHgwNCkKLSNkZWZpbmUgUkVHX1NEQ09ORjAJKEVCSV9CQSArIDB4MDgpCi0jZGVmaW5lIFJFR19TRENPTkYxCShFQklfQkEgKyAweDBDKQotI2RlZmluZSBSRUdfU0RUSU1FMAkoRUJJX0JBICsgMHgxMCkKLSNkZWZpbmUgUkVHX1NEVElNRTEJKEVCSV9CQSArIDB4MTQpCi0jZGVmaW5lIFJFR19FWFQwQ09OCShFQklfQkEgKyAweDE4KQotI2RlZmluZSBSRUdfRVhUMUNPTgkoRUJJX0JBICsgMHgxQykKLSNkZWZpbmUgUkVHX0VYVDJDT04JKEVCSV9CQSArIDB4MjApCi0jZGVmaW5lIFJFR19FWFQzQ09OCShFQklfQkEgKyAweDI0KQotI2RlZmluZSBSRUdfRVhUNENPTgkoRUJJX0JBICsgMHgyOCkKLSNkZWZpbmUgUkVHX0NLU0tFVwkoRUJJX0JBICsgMHgyQykKLQotI2VuZGlmIC8qICBfX0FTTV9BUkNIX1JFR1NfRUJJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLWlycS5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDIxNTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtaXJxLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fX0FTTV9BUkNIX1JFR1NfSVJRX0gKLSNkZWZpbmUgX19fQVNNX0FSQ0hfUkVHU19JUlFfSAotCi0vKiBBZHZhbmNlIEludGVycnVwdCBDb250cm9sbGVyIChBSUMpIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIEFJQ19CQSAgICAJCU5VQzkzWF9WQV9JUlEKLQotI2RlZmluZSBSRUdfQUlDX0lSUVNDCQkoQUlDX0JBKzB4ODApCi0jZGVmaW5lIFJFR19BSUNfR0VOCQkoQUlDX0JBKzB4ODQpCi0jZGVmaW5lIFJFR19BSUNfR0FTUgkJKEFJQ19CQSsweDg4KQotI2RlZmluZSBSRUdfQUlDX0dTQ1IJCShBSUNfQkErMHg4QykKLSNkZWZpbmUgUkVHX0FJQ19JUlNSCQkoQUlDX0JBKzB4MTAwKQotI2RlZmluZSBSRUdfQUlDX0lBU1IJCShBSUNfQkErMHgxMDQpCi0jZGVmaW5lIFJFR19BSUNfSVNSCQkoQUlDX0JBKzB4MTA4KQotI2RlZmluZSBSRUdfQUlDX0lQRVIJCShBSUNfQkErMHgxMEMpCi0jZGVmaW5lIFJFR19BSUNfSVNOUgkJKEFJQ19CQSsweDExMCkKLSNkZWZpbmUgUkVHX0FJQ19JTVIJCShBSUNfQkErMHgxMTQpCi0jZGVmaW5lIFJFR19BSUNfT0lTUgkJKEFJQ19CQSsweDExOCkKLSNkZWZpbmUgUkVHX0FJQ19NRUNSCQkoQUlDX0JBKzB4MTIwKQotI2RlZmluZSBSRUdfQUlDX01EQ1IJCShBSUNfQkErMHgxMjQpCi0jZGVmaW5lIFJFR19BSUNfU1NDUgkJKEFJQ19CQSsweDEyOCkKLSNkZWZpbmUgUkVHX0FJQ19TQ0NSCQkoQUlDX0JBKzB4MTJDKQotI2RlZmluZSBSRUdfQUlDX0VPU0NSCQkoQUlDX0JBKzB4MTMwKQotI2RlZmluZSBBSUNfSVBFUgkJKDB4MTBDKQotI2RlZmluZSBBSUNfSVNOUgkJKDB4MTEwKQotCi0jZW5kaWYgLyogX19fQVNNX0FSQ0hfUkVHU19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3Mtc2VyaWFsLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1zZXJpYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YTA0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1zZXJpYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy1zZXJpYWwuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJNX1JFR1NfU0VSSUFMX0gKLSNkZWZpbmUgX19BU01fQVJNX1JFR1NfU0VSSUFMX0gKLQotI2RlZmluZSBVQVJUMF9CQQlOVUM5M1hfVkFfVUFSVAotI2RlZmluZSBVQVJUMV9CQQkoTlVDOTNYX1ZBX1VBUlQrMHgxMDApCi0KLSNkZWZpbmUgVUFSVDBfUEEJTlVDOTNYX1BBX1VBUlQKLSNkZWZpbmUgVUFSVDFfUEEJKE5VQzkzWF9QQV9VQVJUKzB4MTAwKQotCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLXN0cnVjdCBudWM5M3hfdWFydF9jbGtzcmMgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JdW5zaWduZWQgaW50CWRpdmlzb3I7Ci0JdW5zaWduZWQgaW50CW1pbl9iYXVkOwotCXVuc2lnbmVkIGludAltYXhfYmF1ZDsKLX07Ci0KLXN0cnVjdCBudWM5M3hfdWFydGNmZyB7Ci0JdW5zaWduZWQgY2hhcglod3BvcnQ7Ci0JdW5zaWduZWQgY2hhcgl1bnVzZWQ7Ci0JdW5zaWduZWQgc2hvcnQJZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwl1YXJ0X2ZsYWdzOwotCi0JdW5zaWduZWQgbG9uZwl1Y29uOwotCXVuc2lnbmVkIGxvbmcJdWxjb247Ci0JdW5zaWduZWQgbG9uZwl1ZmNvbjsKLQotCXN0cnVjdCBudWM5M3hfdWFydF9jbGtzcmMgKmNsb2NrczsKLQl1bnNpZ25lZCBpbnQJY2xvY2tzX3NpemU7Ci19OwotCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KLSNlbmRpZiAvKiBfX0FTTV9BUk1fUkVHU19TRVJJQUxfSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy10aW1lci5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3JlZ3MtdGltZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YmU5Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvcmVncy10aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9yZWdzLXRpbWVyLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19USU1FUl9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19USU1FUl9ICi0KLS8qIFRpbWVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIFRNUl9CQQkJCU5VQzkzWF9WQV9USU1FUgotI2RlZmluZSBSRUdfVENTUjAJCShUTVJfQkErMHgwMCkKLSNkZWZpbmUgUkVHX1RJQ1IwCQkoVE1SX0JBKzB4MDgpCi0jZGVmaW5lIFJFR19URFIwCQkoVE1SX0JBKzB4MTApCi0jZGVmaW5lIFJFR19USVNSCQkoVE1SX0JBKzB4MTgpCi0jZGVmaW5lIFJFR19XVENSCQkoVE1SX0JBKzB4MUMpCi0KLSNlbmRpZiAvKiAgX19BU01fQVJDSF9SRUdTX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2YmQ5YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaG51YzkzeC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgotCi1zdGF0aWMgdm9pZCBhcmNoX2lkbGUodm9pZCkKLXsKLX0KLQotc3RhdGljIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKLXsKLQljcHVfcmVzZXQoMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3RpbWV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzE5Y2MuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3RpbWV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3RpbWV4LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3RpbWV4LmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfVElNRVhfSAotI2RlZmluZSBfX0FTTV9BUkNIX1RJTUVYX0gKLQotLyogQ0xPQ0tfVElDS19SQVRFIE5vdywgSSBkb24ndCB1c2UgaXQuICovCi0KLSNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFIDI3MDAwMDAwCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODFjYjliLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1VOQ09NUFJFU1NfSAotI2RlZmluZSBfX0FTTV9BUkNIX1VOQ09NUFJFU1NfSAotCi0vKiBEZWZpbmVzIGZvciBVQVJUIHJlZ2lzdGVycyAqLwotCi0jaW5jbHVkZSA8bWFjaC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotCi0jZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQotCi0jZGVmaW5lIFRYX0RPTkUJKFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFKQotc3RhdGljIHUzMiAqIGNvbnN0IHVhcnRfYmFzZSA9ICh1MzIgKilVQVJUMF9QQTsKLQotc3RhdGljIHZvaWQgcHV0YyhpbnQgY2gpCi17Ci0JLyogQ2hlY2sgVEhSRSBhbmQgVEVNVCBiaXRzIGJlZm9yZSB3ZSB0cmFuc21pdCB0aGUgY2hhcmFjdGVyLgotCSAqLwotCXdoaWxlICgodWFydF9iYXNlW1VBUlRfTFNSXSAmIFRYX0RPTkUpICE9IFRYX0RPTkUpCi0JCWJhcnJpZXIoKTsKLQotCSp1YXJ0X2Jhc2UgPSBjaDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY2hfZGVjb21wX3NldHVwKHZvaWQpCi17Ci19Ci0KLSNlbmRpZi8qIF9fQVNNX05VQzkzWF9VTkNPTVBSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDExYTVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1udWM5M3gvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdm1hbGxvYy5oCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1ZNQUxMT0NfSAotI2RlZmluZSBfX0FTTV9BUkNIX1ZNQUxMT0NfSAotCi0jZGVmaW5lIFZNQUxMT0NfRU5ECSAgMHhFMDAwMDAwMFVMCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1ZNQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW51YzkzeC9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNzlmMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW51YzkzeC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW51YzkzeC9pcnEuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBOdXZvdG9uIHRlY2hub2xvZ3kgY29ycG9yYXRpb24uCi0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjt2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+Ci0KLXN0YXRpYyB2b2lkIG51YzkzeF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JX19yYXdfd3JpdGVsKDEgPDwgZC0+aXJxLCBSRUdfQUlDX01EQ1IpOwotfQotCi0vKgotICogQnkgdGhlIHc5MHA5MTAgc3BlYyxhbnkgaXJxLG9ubHkgd3JpdGUgMQotICogdG8gUkVHX0FJQ19FT1NDUiBmb3IgQUNLCi0gKi8KLQotc3RhdGljIHZvaWQgbnVjOTN4X2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQotewotCV9fcmF3X3dyaXRlbCgweDAxLCBSRUdfQUlDX0VPU0NSKTsKLX0KLQotc3RhdGljIHZvaWQgbnVjOTN4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCV9fcmF3X3dyaXRlbCgxIDw8IGQtPmlycSwgUkVHX0FJQ19NRUNSKTsKLQotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIG51YzkzeF9pcnFfY2hpcCA9IHsKLQkuaXJxX2Fjawk9IG51YzkzeF9pcnFfYWNrLAotCS5pcnFfbWFzawk9IG51YzkzeF9pcnFfbWFzaywKLQkuaXJxX3VubWFzawk9IG51YzkzeF9pcnFfdW5tYXNrLAotfTsKLQotdm9pZCBfX2luaXQgbnVjOTN4X2luaXRfaXJxKHZvaWQpCi17Ci0JaW50IGlycW5vOwotCi0JX19yYXdfd3JpdGVsKDB4RkZGRkZGRkUsIFJFR19BSUNfTURDUik7Ci0KLQlmb3IgKGlycW5vID0gSVJRX1dEVDsgaXJxbm8gPD0gTlJfSVJRUzsgaXJxbm8rKykgewotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxbm8sICZudWM5M3hfaXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvbWFjaC1udWM5MzJldmIuYyBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L21hY2gtbnVjOTMyZXZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDI1NzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvbWFjaC1udWM5MzJldmIuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC1udWM5MTBldmIuYwotICoKLSAqIEJhc2VkIG9uIG1hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMgYnkgSm9uYXMgRGlldHNjaGUKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTnV2b3RvbiB0ZWNobm9sb2d5IGNvcnBvcmF0aW9uLgotICoKLSAqIFdhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgIm51YzkzMi5oIgotCi1zdGF0aWMgdm9pZCBfX2luaXQgbnVjOTMyZXZiX21hcF9pbyh2b2lkKQotewotCW51YzkzMl9tYXBfaW8oKTsKLQludWM5MzJfaW5pdF9jbG9ja3MoKTsKLQludWM5MzJfaW5pdF91YXJ0Y2xrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBudWM5MzJldmJfaW5pdCh2b2lkKQotewotCW51YzkzMl9ib2FyZF9pbml0KCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoTlVDOTMyRVZCLCAiTlVDOTMyRVZCIikKLQkvKiBNYWludGFpbmVyOiBXYW4gWm9uZ1NodW4gKi8KLQkuYm9vdF9wYXJhbXMJPSAwLAotCS5tYXBfaW8JCT0gbnVjOTMyZXZiX21hcF9pbywKLQkuaW5pdF9pcnEJPSBudWM5M3hfaW5pdF9pcnEsCi0JLmluaXRfbWFjaGluZQk9IG51YzkzMmV2Yl9pbml0LAotCS50aW1lcgkJPSAmbnVjOTN4X3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5jIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvbnVjOTMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjZlYWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvbnVjOTMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvbnVjOTMyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTnV2b3RvbiBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogTlVDOTMyIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uO3ZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSAiY3B1LmgiCi0jaW5jbHVkZSAiY2xvY2suaCIKLQotLyogZGVmaW5lIHNwZWNpZmljIENQVSBwbGF0Zm9ybSBkZXZpY2UgKi8KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm51YzkzMl9kZXZbXSBfX2luaXRkYXRhID0gewotfTsKLQotLyogZGVmaW5lIHNwZWNpZmljIENQVSBwbGF0Zm9ybSBpbyBtYXAgKi8KLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBudWM5MzJldmJfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKLX07Ci0KLS8qSW5pdCBOVUM5MzIgZXZiIGlvKi8KLQotdm9pZCBfX2luaXQgbnVjOTMyX21hcF9pbyh2b2lkKQotewotCW51YzkzeF9tYXBfaW8obnVjOTMyZXZiX2lvZGVzYywgQVJSQVlfU0laRShudWM5MzJldmJfaW9kZXNjKSk7Ci19Ci0KLS8qSW5pdCBOVUM5MzIgY2xvY2sqLwotCi12b2lkIF9faW5pdCBudWM5MzJfaW5pdF9jbG9ja3Modm9pZCkKLXsKLQludWM5M3hfaW5pdF9jbG9ja3MoKTsKLX0KLQotLyplbmFibGUgTlVDOTMyIHVhcnQgY2xvY2sqLwotCi12b2lkIF9faW5pdCBudWM5MzJfaW5pdF91YXJ0Y2xrKHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqY2tfdWFydCA9IGNsa19nZXQoTlVMTCwgInVhcnQiKTsKLQlCVUdfT04oSVNfRVJSKGNrX3VhcnQpKTsKLQotCWNsa19lbmFibGUoY2tfdWFydCk7Ci19Ci0KLS8qSW5pdCBOVUM5MzIgYm9hcmQgaW5mbyovCi0KLXZvaWQgX19pbml0IG51YzkzMl9ib2FyZF9pbml0KHZvaWQpCi17Ci0JbnVjOTN4X2JvYXJkX2luaXQobnVjOTMyX2RldiwgQVJSQVlfU0laRShudWM5MzJfZGV2KSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW51YzkzeC9udWM5MzIuaCBiL2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTY2ZWRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtbnVjOTN4L251YzkzMi5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gY29ycG9yYXRpb24KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgTlVDOTN4IENQVSBzdXBwb3J0Ci0gKgotICogV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLXN0cnVjdCBtYXBfZGVzYzsKLXN0cnVjdCBzeXNfdGltZXI7Ci0KLS8qIGNvcmUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zICovCi0KLWV4dGVybiB2b2lkIG51YzkzeF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG51YzkzeF90aW1lcjsKLQotLyogZXh0ZXJuIGZpbGUgZnJvbSBudWM5MzIuYyAqLwotCi1leHRlcm4gdm9pZCBudWM5MzJfYm9hcmRfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIG51YzkzMl9pbml0X2Nsb2Nrcyh2b2lkKTsKLWV4dGVybiB2b2lkIG51YzkzMl9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBudWM5MzJfaW5pdF91YXJ0Y2xrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1udWM5M3gvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1udWM5M3gvdGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgwN2MwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbnVjOTN4L3RpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1udWM5M3gvdGltZS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbi4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbGVkcy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLXRpbWVyLmg+Ci0KLSNkZWZpbmUgUkVTRVRJTlQJMHgwMQotI2RlZmluZSBQRVJJT0QJCSgweDAxIDw8IDI3KQotI2RlZmluZSBPTkVTSE9UCQkoMHgwMCA8PCAyNykKLSNkZWZpbmUgQ09VTlRFTgkJKDB4MDEgPDwgMzApCi0jZGVmaW5lIElOVEVOCQkoMHgwMSA8PCAyOSkKLQotI2RlZmluZSBUSUNLU19QRVJfU0VDCTEwMAotI2RlZmluZSBQUkVTQ0FMRQkweDYzIC8qIERpdmlkZXIgPSBwcmVzY2FsZSArIDEgKi8KLQotdW5zaWduZWQgaW50IHRpbWVyMF9sb2FkOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBudWM5M3hfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi0vKklSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbnVjOTN4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdGltZXJfdGljaygpOwotCV9fcmF3X3dyaXRlbCgweDAxLCBSRUdfVElTUik7IC8qIGNsZWFyIFRJRjAgKi8KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG51YzkzeF90aW1lcl9pcnEgPSB7Ci0JLm5hbWUJCT0gIm51YzkzeCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCi0JLmhhbmRsZXIJPSBudWM5M3hfdGltZXJfaW50ZXJydXB0LAotfTsKLQotLypTZXQgdXAgdGltZXIgcmVnLiovCi0KLXN0YXRpYyB2b2lkIG51YzkzeF90aW1lcl9zZXR1cCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNrX2V4dCA9IGNsa19nZXQoTlVMTCwgImV4dCIpOwotCXN0cnVjdCBjbGsgKmNrX3RpbWVyID0gY2xrX2dldChOVUxMLCAidGltZXIiKTsKLQl1bnNpZ25lZCBpbnQgcmF0ZSwgdmFsID0gMDsKLQotCUJVR19PTihJU19FUlIoY2tfZXh0KSB8fCBJU19FUlIoY2tfdGltZXIpKTsKLQotCWNsa19lbmFibGUoY2tfdGltZXIpOwotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2tfZXh0KTsKLQljbGtfcHV0KGNrX2V4dCk7Ci0JcmF0ZSA9IHJhdGUgLyAoUFJFU0NBTEUgKyAweDAxKTsKLQotCSAvKiBzZXQgYSBrbm93biBzdGF0ZSAqLwotCV9fcmF3X3dyaXRlbCgweDAwLCBSRUdfVENTUjApOwotCV9fcmF3X3dyaXRlbChSRVNFVElOVCwgUkVHX1RJU1IpOwotCi0JdGltZXIwX2xvYWQgPSAocmF0ZSAvIFRJQ0tTX1BFUl9TRUMpOwotCV9fcmF3X3dyaXRlbCh0aW1lcjBfbG9hZCwgUkVHX1RJQ1IwKTsKLQotCXZhbCB8PSAoUEVSSU9EIHwgQ09VTlRFTiB8IElOVEVOIHwgUFJFU0NBTEUpOwotCV9fcmF3X3dyaXRlbCh2YWwsIFJFR19UQ1NSMCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG51YzkzeF90aW1lcl9pbml0KHZvaWQpCi17Ci0JbnVjOTN4X3RpbWVyX3NldHVwKCk7Ci0Jc2V0dXBfaXJxKElSUV9USU1FUjAsICZudWM5M3hfdGltZXJfaXJxKTsKLX0KLQotc3RydWN0IHN5c190aW1lciBudWM5M3hfdGltZXIgPSB7Ci0JLmluaXQJCT0gbnVjOTN4X3RpbWVyX2luaXQsCi0JLm9mZnNldAkJPSBudWM5M3hfZ2V0dGltZW9mZnNldCwKLQkucmVzdW1lCQk9IG51YzkzeF90aW1lcl9zZXR1cAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCmluZGV4IDViMTE0ZDEuLjExYzg1Y2QyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKICMgQ29tbW9uIHN1cHBvcnQKIG9iai15IDo9IGlvLm8gaWQubyBzcmFtLm8gdGltZS5vIGlycS5vIG11eC5vIGZsYXNoLm8gc2VyaWFsLm8gZGV2aWNlcy5vIGRtYS5vCi1vYmoteSArPSBjbG9jay5vIGNsb2NrX2RhdGEubyBvcHBfZGF0YS5vIHJlc2V0Lm8gcG1fYnVzLm8KK29iai15ICs9IGNsb2NrLm8gY2xvY2tfZGF0YS5vIG9wcF9kYXRhLm8gcmVzZXQubyBwbV9idXMubyB0aW1lci5vCiAKIG9iai0kKENPTkZJR19PTUFQX01DQlNQKSArPSBtY2JzcC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCmluZGV4IDMxMmVhNmIuLjUxYmFlMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwpAQCAtMTEsNyArMTEsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAKQEAgLTMwLDcgKzMxLDYgQEAKIAogI2luY2x1ZGUgPHBsYXQvaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLWFtcy1kZWx0YS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQva2V5cGFkLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgpAQCAtMTM1LDEyICsxMzUsNiBAQAogCSoodm9sYXRpbGUgX191MTYgKikgQU1TX0RFTFRBX0xBVENIMl9WSVJUID0gYW1zX2RlbHRhX2xhdGNoMl9yZWc7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhbXNfZGVsdGFfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYW1zX2RlbHRhX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCS8qIEFNU19ERUxUQV9MQVRDSDEgKi8KIAl7CkBAIC0zNzksMTcgKzM3MywxMyBAQAogfQogYXJjaF9pbml0Y2FsbChhbXNfZGVsdGFfbW9kZW1faW5pdCk7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhbXNfZGVsdGFfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOwotfQotCiBNQUNISU5FX1NUQVJUKEFNU19ERUxUQSwgIkFtc3RyYWQgRTMgKERlbHRhKSIpCiAJLyogTWFpbnRhaW5lcjogSm9uYXRoYW4gTWNEb3dlbGwgPG5vb2RsZXNAZWFydGgubGk+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IGFtc19kZWx0YV9tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTV4eF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IGFtc19kZWx0YV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gYW1zX2RlbHRhX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWZzYW1wbGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCmluZGV4IGE2YjFiZWEuLjIzMTc4MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZnNhbXBsZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3RjLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+CkBAIC0yOTcsNjMgKzI5Niw2IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2ZzYW1wbGVfaW5pdCh2b2lkKQogewotCWZzYW1wbGVfaW5pdF9zbWM5MXgoKTsKLQotCWlmIChncGlvX3JlcXVlc3QoRlNBTVBMRV9OQU5EX1JCX0dQSU9fUElOLCAiTkFORCByZWFkeSIpIDwgMCkKLQkJQlVHKCk7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoRlNBTVBMRV9OQU5EX1JCX0dQSU9fUElOKTsKLQotCW9tYXBfY2ZnX3JlZyhMM18xNjEwX0ZMQVNIX0NTMkJfT0UpOwotCW9tYXBfY2ZnX3JlZyhNOF8xNjEwX0ZMQVNIX0NTMkJfV0UpOwotCi0JLyogTXV4IHBpbnMgZm9yIGtleXBhZCAqLwotCW9tYXBfY2ZnX3JlZyhFMl83WFhfS0JSMCk7Ci0Jb21hcF9jZmdfcmVnKEo3XzdYWF9LQlIxKTsKLQlvbWFwX2NmZ19yZWcoRTFfN1hYX0tCUjIpOwotCW9tYXBfY2ZnX3JlZyhGM183WFhfS0JSMyk7Ci0Jb21hcF9jZmdfcmVnKEQyXzdYWF9LQlI0KTsKLQlvbWFwX2NmZ19yZWcoQzJfN1hYX0tCQzApOwotCW9tYXBfY2ZnX3JlZyhEM183WFhfS0JDMSk7Ci0Jb21hcF9jZmdfcmVnKEU0XzdYWF9LQkMyKTsKLQlvbWFwX2NmZ19yZWcoRjRfN1hYX0tCQzMpOwotCW9tYXBfY2ZnX3JlZyhFM183WFhfS0JDNCk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKLQotCW9tYXBfYm9hcmRfY29uZmlnID0gZnNhbXBsZV9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZnNhbXBsZV9jb25maWcpOwotCW9tYXBfc2VyaWFsX2luaXQoKTsKLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMTAwLCBOVUxMLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZnNhbXBsZV9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQotLyogT25seSBGUEdBIG5lZWRzIHRvIGJlIG1hcHBlZCBoZXJlLiBBbGwgb3RoZXJzIGFyZSBkb25lIHdpdGggaW9yZW1hcCAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX2ZzYW1wbGVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEgyUDJfREJHX0ZQR0FfQkFTRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEgyUDJfREJHX0ZQR0FfU1RBUlQpLAotCQkubGVuZ3RoCQk9IEgyUDJfREJHX0ZQR0FfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFCi0JfSwKLQl7Ci0JCS52aXJ0dWFsCT0gRlNBTVBMRV9DUExEX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihGU0FNUExFX0NQTERfU1RBUlQpLAotCQkubGVuZ3RoCQk9IEZTQU1QTEVfQ1BMRF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9mc2FtcGxlX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLQlpb3RhYmxlX2luaXQob21hcF9mc2FtcGxlX2lvX2Rlc2MsCi0JCSAgICAgQVJSQVlfU0laRShvbWFwX2ZzYW1wbGVfaW9fZGVzYykpOwotCiAJLyogRWFybHksIGJvYXJkLWRlcGVuZGVudCBpbml0ICovCiAKIAkvKgpAQCAtMzg0LDE1ICszMjYsNjggQEAKIAkgKiBDb25maWd1cmUgTVBVX0VYVF9OSVJRIElPIGluIElPX0NPTkY5IHJlZ2lzdGVyLAogCSAqIEl0IGlzIHVzZWQgYXMgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIgaW50ZXJydXB0CiAJICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQN1hYX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLCBPTUFQN1hYX0lPX0NPTkZfOSk7CisJb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQN1hYX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLAorCQkJT01BUDdYWF9JT19DT05GXzkpOworCisJZnNhbXBsZV9pbml0X3NtYzkxeCgpOworCisJaWYgKGdwaW9fcmVxdWVzdChGU0FNUExFX05BTkRfUkJfR1BJT19QSU4sICJOQU5EIHJlYWR5IikgPCAwKQorCQlCVUcoKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChGU0FNUExFX05BTkRfUkJfR1BJT19QSU4pOworCisJb21hcF9jZmdfcmVnKEwzXzE2MTBfRkxBU0hfQ1MyQl9PRSk7CisJb21hcF9jZmdfcmVnKE04XzE2MTBfRkxBU0hfQ1MyQl9XRSk7CisKKwkvKiBNdXggcGlucyBmb3Iga2V5cGFkICovCisJb21hcF9jZmdfcmVnKEUyXzdYWF9LQlIwKTsKKwlvbWFwX2NmZ19yZWcoSjdfN1hYX0tCUjEpOworCW9tYXBfY2ZnX3JlZyhFMV83WFhfS0JSMik7CisJb21hcF9jZmdfcmVnKEYzXzdYWF9LQlIzKTsKKwlvbWFwX2NmZ19yZWcoRDJfN1hYX0tCUjQpOworCW9tYXBfY2ZnX3JlZyhDMl83WFhfS0JDMCk7CisJb21hcF9jZmdfcmVnKEQzXzdYWF9LQkMxKTsKKwlvbWFwX2NmZ19yZWcoRTRfN1hYX0tCQzIpOworCW9tYXBfY2ZnX3JlZyhGNF83WFhfS0JDMyk7CisJb21hcF9jZmdfcmVnKEUzXzdYWF9LQkM0KTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCisJb21hcF9ib2FyZF9jb25maWcgPSBmc2FtcGxlX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShmc2FtcGxlX2NvbmZpZyk7CisJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygxLCAxMDAsIE5VTEwsIDApOworfQorCisvKiBPbmx5IEZQR0EgbmVlZHMgdG8gYmUgbWFwcGVkIGhlcmUuIEFsbCBvdGhlcnMgYXJlIGRvbmUgd2l0aCBpb3JlbWFwICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfZnNhbXBsZV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gSDJQMl9EQkdfRlBHQV9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oSDJQMl9EQkdfRlBHQV9TVEFSVCksCisJCS5sZW5ndGgJCT0gSDJQMl9EQkdfRlBHQV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBGU0FNUExFX0NQTERfQkFTRSwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEZTQU1QTEVfQ1BMRF9TVEFSVCksCisJCS5sZW5ndGgJCT0gRlNBTVBMRV9DUExEX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRQorCX0KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2ZzYW1wbGVfbWFwX2lvKHZvaWQpCit7CisJb21hcDE1eHhfbWFwX2lvKCk7CisJaW90YWJsZV9pbml0KG9tYXBfZnNhbXBsZV9pb19kZXNjLAorCQkgICAgIEFSUkFZX1NJWkUob21hcF9mc2FtcGxlX2lvX2Rlc2MpKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX0ZTQU1QTEUsICJPTUFQNzMwIEYtU2FtcGxlIikKIC8qIE1haW50YWluZXI6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBvbWFwX2ZzYW1wbGVfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX2ZzYW1wbGVfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZnNhbXBsZV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwppbmRleCAwNGZjMzU2Li5kYzViNzVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYwpAQCAtMTIsNyArMTIsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjIsMTggKzIyLDExIEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiAvKiBhc3N1bWUgbm8gTWluaS1BQiBwb3J0ICovCiAKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWApAQCAtODcsMTcgKzgwLDEzIEBACiAJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDFfbWFwX2NvbW1vbl9pbygpOwotfQotCiBNQUNISU5FX1NUQVJUKE9NQVBfR0VORVJJQywgIkdlbmVyaWMgT01BUDE1MTAvMTYxMC8xNzEwIikKIAkvKiBNYWludGFpbmVyOiBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBvbWFwX2dlbmVyaWNfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE2eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX2dlbmVyaWNfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi1tbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMKaW5kZXggZjJmYzQzZC4uZGEwZTM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLW1tYy5jCkBAIC0xMSwxMyArMTEsMTIgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjL3RwczY1MDEwLmg+CiAKICNpbmNsdWRlIDxwbGF0L21tYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiYm9hcmQtaDIuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCmluZGV4IGNiN2ZiMWEuLmIzMzRiMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzczLDEyICszNzIsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGgyX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkvKiB1c2IxIGhhcyBhIE1pbmktQUIgcG9ydCBhbmQgZXh0ZXJuYWwgaXNwMTMwMSB0cmFuc2NlaXZlciAqLwogCS5vdGcJCT0gMiwKQEAgLTQ1NCwxNyArNDQ3LDEzIEBACiAJaDJfbW1jX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGgyX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX0gyLCAiVEktSDIiKQogCS8qIE1haW50YWluZXI6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gaDJfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE2eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gaDJfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGgyX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLW1tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYwppbmRleCAyMDk4NTI1Li5mODI0MmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLW1tYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMtbW1jLmMKQEAgLTExLDEzICsxMSwxMiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KIAogI2luY2x1ZGUgPHBsYXQvbW1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJib2FyZC1oMy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKaW5kZXggMzFmMzQ4Ny4uNzRlYmU3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpAQCAtMTMsNyArMTMsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC00MzYsMjMgKzQzNSwxMyBAQAogCWgzX21tY19pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGgzX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX0gzLCAiVEkgT01BUDE3MTAgSDMgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFRleGFzIEluc3RydW1lbnRzLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IGgzX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNnh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IGgzX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBoM19pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKaW5kZXggMzZlMDZlYS4uM2U5MWJhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiAwMjExMC0xMzAxLCBVU0EuCiAgKgogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC01MDAsNyArNDk5LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGh0Y2hlcmFsZF9tYXBfaW8odm9pZCkKIHsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7CisJb21hcDd4eF9tYXBfaW8oKTsKIAogCS8qCiAJICogVGhlIExDRCBwYW5lbCBtdXN0IGJlIGRpc2FibGVkIGFuZCBETUEgdHVybmVkIG9mZiBoZXJlLCBhcyBkb2luZwpAQCAtNjAxLDIwICs2MDAsMTQgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaHRjaGVyYWxkX2luaXRfaXJxKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaHRjaGVyYWxkX2luaXRfaXJxLlxuIik7Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiBNQUNISU5FX1NUQVJUKEhFUkFMRCwgIkhUQyBIZXJhbGQiKQogCS8qIE1haW50YWluZXI6IENvcnkgTWFjY2Fycm9uZSA8ZGFya3N0YXI2MjYyQGdtYWlsLmNvbT4gKi8KIAkvKiBNYWludGFpbmVyOiB3aW5nLWxpbnV4LnNvdXJjZWZvcmdlLm5ldCAqLwotCS5ib290X3BhcmFtcyAgICA9IDB4MTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gaHRjaGVyYWxkX21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycSAgICAgICA9IGh0Y2hlcmFsZF9pbml0X2lycSwKKwkuaW5pdF9pcnEgICAgICAgPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lICAgPSBodGNoZXJhbGRfaW5pdCwKIAkudGltZXIgICAgICAgICAgPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKaW5kZXggMGIxYmE0Ni4uMjczMTUzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCkBAIC0xNSw3ICsxNSw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC90Yy5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KQEAgLTI4OSwxMiArMjg4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTVYWAogc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaW5ub3ZhdG9yMTUxMF91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLyogZm9yIGJ1bmRsZWQgbm9uLXN0YW5kYXJkIGhvc3QgYW5kIHBlcmlwaGVyYWwgY2FibGVzICovCkBAIC00MzksMzAgKzQzMiwzMiBAQAogCWlubm92YXRvcl9tbWNfaW5pdCgpOwogfQogCisvKgorICogUkVWSVNJVDogQXNzdW1lIDE1eHggZm9yIG5vdywgd2UgZG9uJ3Qgd2FudCB0byBkbyByZXZpc2lvbiBjaGVjaworICogdW50aWwgbGF0ZXIgb24uIFRoZSByaWdodCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gc2V0IHVwIGEgZGlmZmVyZW50CisgKiBtYWNoaW5lX2lkIGZvciAxNnh4IElubm92YXRvciwgb3IgdXNlIGRldmljZSB0cmVlLgorICovCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX21hcF9pbyh2b2lkKQogewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKKwlvbWFwMTV4eF9tYXBfaW8oKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWlvdGFibGVfaW5pdChpbm5vdmF0b3IxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTUxMF9pb19kZXNjKSk7Ci0JCXVkZWxheSgxMCk7CS8qIERlbGF5IG5lZWRlZCBmb3IgRlBHQSAqLworCWlvdGFibGVfaW5pdChpbm5vdmF0b3IxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTUxMF9pb19kZXNjKSk7CisJdWRlbGF5KDEwKTsJLyogRGVsYXkgbmVlZGVkIGZvciBGUEdBICovCiAKLQkJLyogRHVtcCB0aGUgSW5ub3ZhdG9yIEZQR0EgcmV2IGVhcmx5IC0gdXNlZnVsIGluZm8gZm9yIHN1cHBvcnQuICovCi0JCXByaW50aygiSW5ub3ZhdG9yIEZQR0EgUmV2ICVkLiVkIEJvYXJkIFJldiAlZFxuIiwKLQkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1JFVl9ISUdIKSwKLQkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1JFVl9MT1cpLAotCQkgICAgICAgZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfQk9BUkRfUkVWKSk7Ci0JfQotI2VuZGlmCisJLyogRHVtcCB0aGUgSW5ub3ZhdG9yIEZQR0EgcmV2IGVhcmx5IC0gdXNlZnVsIGluZm8gZm9yIHN1cHBvcnQuICovCisJcHJfZGVidWcoIklubm92YXRvciBGUEdBIFJldiAlZC4lZCBCb2FyZCBSZXYgJWRcbiIsCisJCQlmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfSElHSCksCisJCQlmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfTE9XKSwKKwkJCWZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX0JPQVJEX1JFVikpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfSU5OT1ZBVE9SLCAiVEktSW5ub3ZhdG9yIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGlubm92YXRvcl9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBpbm5vdmF0b3JfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGlubm92YXRvcl9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCmluZGV4IDU0NjljZTIuLjY3OThiODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgpAQCAtMzksMjEgKzM4LDYgQEAKIAogI2RlZmluZSBBRFM3ODQ2X1BFTkRPV05fR1BJTwkxNQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9ub2tpYTc3MF9pbml0X2lycSh2b2lkKQotewotCS8qIE9uIE5va2lhIDc3MCwgdGhlIFNsZWVwWCBzaWduYWwgaXMgbWFza2VkIHdpdGggYW4KLQkgKiBNUFVJTyBsaW5lIGJ5IGRlZmF1bHQuICBJdCBoYXMgdG8gYmUgdW5tYXNrZWQgZm9yIGl0Ci0JICogdG8gYmVjb21lIGZ1bmN0aW9uYWwgKi8KLQotCS8qIFNsZWVwWCBtYXNrIGRpcmVjdGlvbiAqLwotCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDgpICYgfjIpLCAweGZmZmI1MDA4KTsKLQkvKiBVbm1hc2sgU2xlZXBYIHNpZ25hbCAqLwotCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDQpICYgfjIpLCAweGZmZmI1MDA0KTsKLQotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub2tpYTc3MF9rZXltYXBbXSA9IHsKIAlLRVkoMSwgMCwgR1JPVVBfMCB8IEtFWV9VUCksCiAJS0VZKDIsIDAsIEdST1VQXzEgfCBLRVlfRjUpLApAQCAtMjQ2LDYgKzIzMCwxNSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9ub2tpYTc3MF9pbml0KHZvaWQpCiB7CisJLyogT24gTm9raWEgNzcwLCB0aGUgU2xlZXBYIHNpZ25hbCBpcyBtYXNrZWQgd2l0aCBhbgorCSAqIE1QVUlPIGxpbmUgYnkgZGVmYXVsdC4gIEl0IGhhcyB0byBiZSB1bm1hc2tlZCBmb3IgaXQKKwkgKiB0byBiZWNvbWUgZnVuY3Rpb25hbCAqLworCisJLyogU2xlZXBYIG1hc2sgZGlyZWN0aW9uICovCisJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoMHhmZmZiNTAwOCkgJiB+MiksIDB4ZmZmYjUwMDgpOworCS8qIFVubWFzayBTbGVlcFggc2lnbmFsICovCisJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoMHhmZmZiNTAwNCkgJiB+MiksIDB4ZmZmYjUwMDQpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMobm9raWE3NzBfZGV2aWNlcywgQVJSQVlfU0laRShub2tpYTc3MF9kZXZpY2VzKSk7CiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8obm9raWE3NzBfc3BpX2JvYXJkX2luZm8sCiAJCQkJQVJSQVlfU0laRShub2tpYTc3MF9zcGlfYm9hcmRfaW5mbykpOwpAQCAtMjU4LDE2ICsyNTEsMTIgQEAKIAlub2tpYTc3MF9tbWNfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9ub2tpYTc3MF9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoTk9LSUE3NzAsICJOb2tpYSA3NzAiKQotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBvbWFwX25va2lhNzcwX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNnh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IG9tYXBfbm9raWE3NzBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfbm9raWE3NzBfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCmluZGV4IGIwOGEyMTMuLmMzODU5MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpAQCAtMjUsNyArMjUsNyBAQAogICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0yNzksMTIgKzI3OCw2IEBACiAJaXJxX3NldF9pcnFfdHlwZShncGlvX3RvX2lycSg2MiksIElSUV9UWVBFX0VER0VfRkFMTElORyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwMV9pbml0X2NvbW1vbl9odygpOwotCW9tYXAxX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIG9za191c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLyogaGFzIHVzYiBob3N0IGNvbm5lY3RvciAoQSkgLi4uIGZvciBkZXZlbG9wbWVudCBpdCBjYW4gYWxzbwogCSAqIGJlIHVzZWQsIHdpdGggYSBOT05TVEFOREFSRCBnZW5kZXItYmVuZGluZyBjYWJsZS9kb25nbGUsIGFzCkBAIC01NzYsMTcgKzU2OSwxMyBAQAogCW9za19taXN0cmFsX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9za19tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIE1BQ0hJTkVfU1RBUlQoT01BUF9PU0ssICJUSS1PU0siKQogCS8qIE1haW50YWluZXI6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCi0JLm1hcF9pbwkJPSBvc2tfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE2eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvc2tfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9za19pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXRlLmMKaW5kZXggNDU5Y2I2Yi4uZjljNDRjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdGUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10ZS5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgpAQCAtNTksMTIgKzU4LDYgQEAKICNkZWZpbmUgUEFMTVRFX01NQzJfR1BJTwlPTUFQX01QVUlPKDcpCiAjZGVmaW5lIFBBTE1URV9NTUMzX0dQSU8JT01BUF9NUFVJTygxMSkKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGFsbXRlX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBhbG10ZV9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0YxKSwJCS8qIENhbGVuZGFyICovCiAJS0VZKDEsIDAsIEtFWV9GMiksCQkvKiBDb250YWN0cyAqLwpAQCAtMjY5LDE2ICsyNjIsMTIgQEAKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMTAwLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGFsbXRlX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX1BBTE1URSwgIk9NQVAzMTAgYmFzZWQgUGFsbSBUdW5nc3RlbiBFIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb21hcF9wYWxtdGVfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE1eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb21hcF9wYWxtdGVfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfcGFsbXRlX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtdHQuYwppbmRleCBiMjE0ZjQ1Li4xMWE5ODUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG10dC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGFsbXR0LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMzAsNyArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC9sZWQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgpAQCAtMjYzLDEyICsyNjMsNiBAQAogCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BhbG10dF9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgcGFsbXR0X3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKIAkucmVnaXN0ZXJfZGV2CT0gMSwKIAkuaG1jX21vZGUJPSAwLApAQCAtMzE1LDE2ICszMDksMTIgQEAKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMTAwLCBOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGFsbXR0X21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX1BBTE1UVCwgIk9NQVAxNTEwIGJhc2VkIFBhbG0gVHVuZ3N0ZW58VCIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IG9tYXBfcGFsbXR0X21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNXh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IG9tYXBfcGFsbXR0X2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BhbG10dF9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wYWxtejcxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwppbmRleCA5YjBlYTQ4Li40MjA2MTU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBhbG16NzEuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zMiw3ICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxwbGF0L2lyZGEuaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+Ci0jaW5jbHVkZSA8cGxhdC9vbWFwLWFsc2EuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgpAQCAtNTcsMTMgKzU2LDYgQEAKICNkZWZpbmUgUEFMTVo3MV9TTElERVJfR1BJTwlPTUFQX01QVUlPKDMpCiAjZGVmaW5lIFBBTE1aNzFfTU1DX0lOX0dQSU8JT01BUF9NUFVJTyg0KQogCi1zdGF0aWMgdm9pZCBfX2luaXQKLW9tYXBfcGFsbXo3MV9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYWxtejcxX2tleW1hcFtdID0gewogCUtFWSgwLCAwLCBLRVlfRjEpLAogCUtFWSgxLCAwLCBLRVlfRjIpLApAQCAtMzM0LDE3ICszMjYsMTIgQEAKIAlwYWxtejcxX2dwaW9fc2V0dXAoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotb21hcF9wYWxtejcxX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQX1BBTE1aNzEsICJPTUFQMzEwIGJhc2VkIFBhbG0gWmlyZTcxIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb21hcF9wYWxtejcxX21hcF9pbywKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkubWFwX2lvCQk9IG9tYXAxNXh4X21hcF9pbywKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMV9pbml0X2Vhcmx5LAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5pbml0X2lycQk9IG9tYXBfcGFsbXo3MV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBvbWFwMV9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9wYWxtejcxX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKaW5kZXggNjdhY2Q0MS4uMjAzYWUwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1wZXJzZXVzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC90Yy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgpAQCAtMjY1LDU2ICsyNjQsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9pbml0KHZvaWQpCiB7Ci0JcGVyc2V1czJfaW5pdF9zbWM5MXgoKTsKLQotCWlmIChncGlvX3JlcXVlc3QoUDJfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCi0JCUJVRygpOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KFAyX05BTkRfUkJfR1BJT19QSU4pOwotCi0Jb21hcF9jZmdfcmVnKEwzXzE2MTBfRkxBU0hfQ1MyQl9PRSk7Ci0Jb21hcF9jZmdfcmVnKE04XzE2MTBfRkxBU0hfQ1MyQl9XRSk7Ci0KLQkvKiBNdXggcGlucyBmb3Iga2V5cGFkICovCi0Jb21hcF9jZmdfcmVnKEUyXzdYWF9LQlIwKTsKLQlvbWFwX2NmZ19yZWcoSjdfN1hYX0tCUjEpOwotCW9tYXBfY2ZnX3JlZyhFMV83WFhfS0JSMik7Ci0Jb21hcF9jZmdfcmVnKEYzXzdYWF9LQlIzKTsKLQlvbWFwX2NmZ19yZWcoRDJfN1hYX0tCUjQpOwotCW9tYXBfY2ZnX3JlZyhDMl83WFhfS0JDMCk7Ci0Jb21hcF9jZmdfcmVnKEQzXzdYWF9LQkMxKTsKLQlvbWFwX2NmZ19yZWcoRTRfN1hYX0tCQzIpOwotCW9tYXBfY2ZnX3JlZyhGNF83WFhfS0JDMyk7Ci0Jb21hcF9jZmdfcmVnKEUzXzdYWF9LQkM0KTsKLQotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwotCi0Jb21hcF9ib2FyZF9jb25maWcgPSBwZXJzZXVzMl9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUocGVyc2V1czJfY29uZmlnKTsKLQlvbWFwX3NlcmlhbF9pbml0KCk7Ci0Jb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BlcnNldXMyX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotLyogT25seSBGUEdBIG5lZWRzIHRvIGJlIG1hcHBlZCBoZXJlLiBBbGwgb3RoZXJzIGFyZSBkb25lIHdpdGggaW9yZW1hcCAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX3BlcnNldXMyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBIMlAyX0RCR19GUEdBX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihIMlAyX0RCR19GUEdBX1NUQVJUKSwKLQkJLmxlbmd0aAkJPSBIMlAyX0RCR19GUEdBX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRQotCX0KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BlcnNldXMyX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLQlpb3RhYmxlX2luaXQob21hcF9wZXJzZXVzMl9pb19kZXNjLAotCQkgICAgIEFSUkFZX1NJWkUob21hcF9wZXJzZXVzMl9pb19kZXNjKSk7Ci0KIAkvKiBFYXJseSwgYm9hcmQtZGVwZW5kZW50IGluaXQgKi8KIAogCS8qCkBAIC0zNDUsMTUgKzI5NCw2MiBAQAogCSAqIENvbmZpZ3VyZSBNUFVfRVhUX05JUlEgSU8gaW4gSU9fQ09ORjkgcmVnaXN0ZXIsCiAJICogSXQgaXMgdXNlZCBhcyB0aGUgRXRoZXJuZXQgY29udHJvbGxlciBpbnRlcnJ1cHQKIAkgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKE9NQVA3WFhfSU9fQ09ORl85KSAmIDB4MUZGRkZGRkYsIE9NQVA3WFhfSU9fQ09ORl85KTsKKwlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKE9NQVA3WFhfSU9fQ09ORl85KSAmIDB4MUZGRkZGRkYsCisJCQkJT01BUDdYWF9JT19DT05GXzkpOworCisJcGVyc2V1czJfaW5pdF9zbWM5MXgoKTsKKworCWlmIChncGlvX3JlcXVlc3QoUDJfTkFORF9SQl9HUElPX1BJTiwgIk5BTkQgcmVhZHkiKSA8IDApCisJCUJVRygpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KFAyX05BTkRfUkJfR1BJT19QSU4pOworCisJb21hcF9jZmdfcmVnKEwzXzE2MTBfRkxBU0hfQ1MyQl9PRSk7CisJb21hcF9jZmdfcmVnKE04XzE2MTBfRkxBU0hfQ1MyQl9XRSk7CisKKwkvKiBNdXggcGlucyBmb3Iga2V5cGFkICovCisJb21hcF9jZmdfcmVnKEUyXzdYWF9LQlIwKTsKKwlvbWFwX2NmZ19yZWcoSjdfN1hYX0tCUjEpOworCW9tYXBfY2ZnX3JlZyhFMV83WFhfS0JSMik7CisJb21hcF9jZmdfcmVnKEYzXzdYWF9LQlIzKTsKKwlvbWFwX2NmZ19yZWcoRDJfN1hYX0tCUjQpOworCW9tYXBfY2ZnX3JlZyhDMl83WFhfS0JDMCk7CisJb21hcF9jZmdfcmVnKEQzXzdYWF9LQkMxKTsKKwlvbWFwX2NmZ19yZWcoRTRfN1hYX0tCQzIpOworCW9tYXBfY2ZnX3JlZyhGNF83WFhfS0JDMyk7CisJb21hcF9jZmdfcmVnKEUzXzdYWF9LQkM0KTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworCisJb21hcF9ib2FyZF9jb25maWcgPSBwZXJzZXVzMl9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUocGVyc2V1czJfY29uZmlnKTsKKwlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9yZWdpc3Rlcl9pMmNfYnVzKDEsIDEwMCwgTlVMTCwgMCk7Cit9CisKKy8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9wZXJzZXVzMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gSDJQMl9EQkdfRlBHQV9CQVNFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oSDJQMl9EQkdfRlBHQV9TVEFSVCksCisJCS5sZW5ndGgJCT0gSDJQMl9EQkdfRlBHQV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9tYXBfaW8odm9pZCkKK3sKKwlvbWFwN3h4X21hcF9pbygpOworCWlvdGFibGVfaW5pdChvbWFwX3BlcnNldXMyX2lvX2Rlc2MsCisJCSAgICAgQVJSQVlfU0laRShvbWFwX3BlcnNldXMyX2lvX2Rlc2MpKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX1BFUlNFVVMyLCAiT01BUDczMCBQZXJzZXVzMiIpCiAJLyogTWFpbnRhaW5lcjogS2V2aW4gSGlsbWFuIDxramhAaGlsbWFuLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gb21hcF9wZXJzZXVzMl9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSBvbWFwX3BlcnNldXMyX2luaXRfaXJxLAorCS5pbml0X2lycQk9IG9tYXAxX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3BlcnNldXMyX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS1tbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLW1tYy5jCmluZGV4IGU4ZGRkODYuLmI1OWY3ODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLW1tYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLW1tYy5jCkBAIC0xMiwxMSArMTIsMTEgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLXN4MS5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXN4MS5jCmluZGV4IDljM2I3YzUuLjA5MmE0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEuYwpAQCAtMTQsNyArMTQsNyBAQAogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yNiwxMyArMjYsMTMgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2ZsYXNoLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlIDxwbGF0L2RtYS5oPgpAQCAtNDA3LDI0ICs0MDcsMTMgQEAKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoMTEsIDApOwkvKkFfU1dJVENIID0gMCAqLwogCWdwaW9fZGlyZWN0aW9uX291dHB1dCgxNSwgMCk7CS8qQV9VU0JfT04gPSAwICovCiB9Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc3gxX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDFfaW5pdF9jb21tb25faHcoKTsKLQlvbWFwMV9pbml0X2lycSgpOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfc3gxX21hcF9pbyh2b2lkKQotewotCW9tYXAxX21hcF9jb21tb25faW8oKTsKLX0KIAogTUFDSElORV9TVEFSVChTWDEsICJPTUFQMzEwIGJhc2VkIFNpZW1lbnMgU1gxIikKLQkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAotCS5tYXBfaW8JCT0gb21hcF9zeDFfbWFwX2lvLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5tYXBfaW8JCT0gb21hcDE1eHhfbWFwX2lvLAorCS5pbml0X2Vhcmx5ICAgICA9IG9tYXAxX2luaXRfZWFybHksCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLmluaXRfaXJxCT0gb21hcF9zeDFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXBfc3gxX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYwppbmRleCAwMzZlZGMwZS4uNjFlZDZjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpAQCAtMjQsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc3lzdGVtLmg+CkBAIC0zMyw3ICszNSw2IEBACiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLXZvaWNlYmx1ZS5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAjaW5jbHVkZSA8cGxhdC90Yy5oPgpAQCAtMTU5LDE3ICsxNjAsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgdm9pY2VibHVlX2NvbmZpZ1tdID0gewogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0X2lycSh2b2lkKQotewotCW9tYXAxX2luaXRfY29tbW9uX2h3KCk7Ci0Jb21hcDFfaW5pdF9pcnEoKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMV9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KICNkZWZpbmUgTUFDSElORV9QQU5JQ0VECQkxCiAjZGVmaW5lIE1BQ0hJTkVfUkVCT09USU5HCTIKICNkZWZpbmUgTUFDSElORV9SRUJPT1QJCTQKQEAgLTMwMSwxMCArMjkxLDExIEBACiAKIE1BQ0hJTkVfU1RBUlQoVk9JQ0VCTFVFLCAiVm9pY2VCbHVlIE9NQVA1OTEwIikKIAkvKiBNYWludGFpbmVyOiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKLQkubWFwX2lvCQk9IHZvaWNlYmx1ZV9tYXBfaW8sCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCisJLm1hcF9pbwkJPSBvbWFwMTV4eF9tYXBfaW8sCisJLmluaXRfZWFybHkgICAgID0gb21hcDFfaW5pdF9lYXJseSwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkuaW5pdF9pcnEJPSB2b2ljZWJsdWVfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gb21hcDFfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHZvaWNlYmx1ZV9pbml0LAogCS50aW1lcgkJPSAmb21hcDFfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwppbmRleCAzNmYyNmMzLi40OGVmOTg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMSwxMCArMjIsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvdGMuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L21tYy5oPgogI2luY2x1ZGUgPHBsYXQvb21hcDd4eC5oPgogI2luY2x1ZGUgPHBsYXQvbWNic3AuaD4KQEAgLTI5MSw2ICsyOTIsOCBAQAogCWlmICghY3B1X2NsYXNzX2lzX29tYXAxKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJb21hcF9zcmFtX2luaXQoKTsKKwogCS8qIHBsZWFzZSBrZWVwIHRoZXNlIGNhbGxzLCBhbmQgdGhlaXIgaW1wbGVtZW50YXRpb25zIGFib3ZlLAogCSAqIGluIGFscGhhYmV0aWNhbCBvcmRlciBzbyB0aGV5J3JlIGVhc2llciB0byBzb3J0IHRocm91Z2guCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCmluZGV4IGNkZGJmOGIuLjBhMTdhMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTI4LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiBzdGF0aWMgdm9pZCBmcGdhX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDYyODU2MDQuLjJiMzZhMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTMsMTMgKzEzLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KIAotI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KLQogI2luY2x1ZGUgPHBsYXQvc2VyaWFsLmg+CiAKLSNkZWZpbmUgb21hcF91YXJ0X3YycCh4KQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBQTEFUX1BIWVNfT0ZGU0VUKQotI2RlZmluZSBvbWFwX3VhcnRfcDJ2KHgpCSgoeCkgLSBQTEFUX1BIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCi0KIAkJLnB1c2hzZWN0aW9uIC5kYXRhCiBvbWFwX3VhcnRfcGh5czoJLndvcmQJMHgwCiBvbWFwX3VhcnRfdmlydDoJLndvcmQJMHgwCkBAIC0zMSwyNiArMjYsMjQgQEAKIAkJICogdGhlIGRlc2lyZWQgVUFSVCBwaHlzIGFuZCB2aXJ0IGFkZHJlc3NlcyB0ZW1wb3JhcmlseSBpbnRvCiAJCSAqIHRoZSBvbWFwX3VhcnRfcGh5cyBhbmQgb21hcF91YXJ0X3ZpcnQgYWJvdmUuCiAJCSAqLwotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAKIAkJLyogVXNlIG9tYXBfdWFydF9waHlzL3ZpcnQgaWYgYWxyZWFkeSBjb25maWd1cmVkICovCi05OgkJbXJjCXAxNSwgMCwgXHJwLCBjMSwgYzAKLQkJdHN0CVxycCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnAsID1vbWFwX3VhcnRfdjJwKG9tYXBfdWFydF9waHlzKQlAIE1NVSBkaXNhYmxlZAotCQlsZHJuZQlccnAsID1vbWFwX3VhcnRfcGh5cwlAIE1NVSBlbmFibGVkCi0JCWFkZAlccnYsIFxycCwgIzQJCUAgb21hcF91YXJ0X3ZpcnQKLQkJbGRyCVxycCwgW1xycCwgIzBdCi0JCWxkcglccnYsIFtccnYsICMwXQorOToJCWFkcglccnAsIDk5ZgkJQCBnZXQgZWZmZWN0aXZlIGFkZHIgb2YgOTlmCisJCWxkcglccnYsIFtccnBdCQlAIGdldCBhYnNvbHV0ZSBhZGRyIG9mIDk5ZgorCQlzdWIJXHJ2LCBccnYsIFxycAkJQCBvZmZzZXQgYmV0d2VlbiB0aGUgdHdvCisJCWxkcglccnAsIFtccnAsICM0XQkJQCBhYnMgYWRkciBvZiBvbWFwX3VhcnRfcGh5cworCQlzdWIJXHRtcCwgXHJwLCBccnYJCUAgbWFrZSBpdCBlZmZlY3RpdmUKKwkJbGRyCVxycCwgW1x0bXAsICMwXQkJQCBvbWFwX3VhcnRfcGh5cworCQlsZHIJXHJ2LCBbXHRtcCwgIzRdCQlAIG9tYXBfdWFydF92aXJ0CiAJCWNtcAlccnAsICMwCQkJQCBpcyBwb3J0IGNvbmZpZ3VyZWQ/CiAJCWNtcG5lCVxydiwgIzAKLQkJYm5lCTk5ZgkJCUAgYWxyZWFkeSBjb25maWd1cmVkCisJCWJuZQkxMDBmCQkJQCBhbHJlYWR5IGNvbmZpZ3VyZWQKIAogCQkvKiBDaGVjayB0aGUgZGVidWcgVUFSVCBjb25maWd1cmF0aW9uIHNldCBpbiB1bmNvbXByZXNzLmggKi8KLQkJbXJjCXAxNSwgMCwgXHJwLCBjMSwgYzAKLQkJdHN0CVxycCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnAsID1PTUFQX1VBUlRfSU5GTwlAIE1NVSBub3QgZW5hYmxlZAotCQlsZHJuZQlccnAsID1vbWFwX3VhcnRfcDJ2KE9NQVBfVUFSVF9JTkZPKQlAIE1NVSBlbmFibGVkCi0JCWxkcglccnAsIFtccnAsICMwXQorCQlhbmQJXHJwLCBwYywgIzB4ZmYwMDAwMDAKKwkJbGRyCVxydiwgPU9NQVBfVUFSVF9JTkZPX09GUworCQlsZHIJXHJwLCBbXHJwLCBccnZdCiAKIAkJLyogU2VsZWN0IHRoZSBVQVJUIHRvIHVzZSBiYXNlZCBvbiB0aGUgVUFSVDEgc2NyYXRjaHBhZCB2YWx1ZSAqLwogMTA6CQljbXAJXHJwLCAjMAkJCUAgbm8gcG9ydCBjb25maWd1cmVkPwpAQCAtNzQsMTcgKzY3LDE4IEBACiAKIAkJLyogU3RvcmUgYm90aCBwaHlzIGFuZCB2aXJ0IGFkZHJlc3MgZm9yIHRoZSB1YXJ0ICovCiA5ODoJCWFkZAlccnAsIFxycCwgIzB4ZmYwMDAwMDAJQCBwaHlzIGJhc2UKLQkJbXJjCXAxNSwgMCwgXHJ2LCBjMSwgYzAKLQkJdHN0CVxydiwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnYsID1vbWFwX3VhcnRfdjJwKG9tYXBfdWFydF9waHlzKQlAIE1NVSBkaXNhYmxlZAotCQlsZHJuZQlccnYsID1vbWFwX3VhcnRfcGh5cwlAIE1NVSBlbmFibGVkCi0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzBdCQlAIG9tYXBfdWFydF9waHlzCiAJCXN1YglccnAsIFxycCwgIzB4ZmYwMDAwMDAJQCBwaHlzIGJhc2UKIAkJYWRkCVxycCwgXHJwLCAjMHhmZTAwMDAwMAlAIHZpcnQgYmFzZQotCQlhZGQJXHJ2LCBccnYsICM0CQlAIG9tYXBfdWFydF9sc3IKLQkJc3RyCVxycCwgW1xydiwgIzBdCisJCXN0cglccnAsIFtcdG1wLCAjNF0JCUAgb21hcF91YXJ0X3ZpcnQKIAkJYgk5YgotOTk6CisKKwkJLmFsaWduCis5OToJCS53b3JkCS4KKwkJLndvcmQJb21hcF91YXJ0X3BoeXMKKwkJLmx0b3JnCisKKzEwMDoKIAkJLmVuZG0KIAogCQkubWFjcm8Jc2VuZHVhcnQscmQscngKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggZTliNjAwYy4uYzYzMzc2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTIsNCArMiw1NSBAQAogICogYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKICAqLwogCi0jaW5jbHVkZSA8cGxhdC9tZW1vcnkuaD4KKyNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAorI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICisKKy8qCisgKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KKyAqLworI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDEwMDAwMDAwKQorCisvKgorICogQnVzIGFkZHJlc3MgaXMgcGh5c2ljYWwgYWRkcmVzcywgZXhjZXB0IGZvciBPTUFQLTE1MTAgTG9jYWwgQnVzLgorICogT01BUC0xNTEwIGJ1cyBhZGRyZXNzIGlzIHRyYW5zbGF0ZWQgaW50byBhIExvY2FsIEJ1cyBhZGRyZXNzIGlmIHRoZQorICogT01BUCBidXMgdHlwZSBpcyBsYnVzLiBXZSBkbyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUKKyAqIGRldmljZSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cyB1c2VkIGluIHRoZSBkbWEtbWFwcGluZyBBUEkuCisgKiBOb3RlIHRoYXQgdGhlIGlzX2xidXNfZGV2aWNlKCkgdGVzdCBpcyBub3QgdmVyeSBlZmZpY2llbnQgb24gMTUxMAorICogYmVjYXVzZSBvZiB0aGUgc3RybmNtcCgpLgorICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKKworLyoKKyAqIE9NQVAtMTUxMCBMb2NhbCBCdXMgYWRkcmVzcyBvZmZzZXQKKyAqLworI2RlZmluZSBPTUFQMTUxMF9MQl9PRkZTRVQJVUwoMHgzMDAwMDAwMCkKKworI2RlZmluZSB2aXJ0X3RvX2xidXMoeCkJCSgoeCkgLSBQQUdFX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVCkKKyNkZWZpbmUgbGJ1c190b192aXJ0KHgpCQkoKHgpIC0gT01BUDE1MTBfTEJfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCisjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXZfbmFtZShkZXYpLCAib2hjaSIsIDQpID09IDApKQorCisjZGVmaW5lIF9fYXJjaF9wZm5fdG9fZG1hKGRldiwgcGZuKQlcCisJKHsgZG1hX2FkZHJfdCBfX2RtYSA9IF9fcGZuX3RvX3BoeXMocGZuKTsgXAorCSAgIGlmIChpc19sYnVzX2RldmljZShkZXYpKSBcCisJCV9fZG1hID0gX19kbWEgLSBQSFlTX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVDsgXAorCSAgIF9fZG1hOyB9KQorCisjZGVmaW5lIF9fYXJjaF9kbWFfdG9fcGZuKGRldiwgYWRkcikJXAorCSh7IGRtYV9hZGRyX3QgX19kbWEgPSBhZGRyOwkJCQlcCisJICAgaWYgKGlzX2xidXNfZGV2aWNlKGRldikpCQkJCVwKKwkJX19kbWEgKz0gUEhZU19PRkZTRVQgLSBPTUFQMTUxMF9MQl9PRkZTRVQ7CVwKKwkgICBfX3BoeXNfdG9fcGZuKF9fZG1hKTsJCQkJXAorCX0pCisKKyNkZWZpbmUgX19hcmNoX2RtYV90b192aXJ0KGRldiwgYWRkcikJKHsgKHZvaWQgKikgKGlzX2xidXNfZGV2aWNlKGRldikgPyBcCisJCQkJCQlsYnVzX3RvX3ZpcnQoYWRkcikgOiBcCisJCQkJCQlfX3BoeXNfdG9fdmlydChhZGRyKSk7IH0pCisKKyNkZWZpbmUgX19hcmNoX3ZpcnRfdG9fZG1hKGRldiwgYWRkcikJKHsgdW5zaWduZWQgbG9uZyBfX2FkZHIgPSAodW5zaWduZWQgbG9uZykoYWRkcik7IFwKKwkJCQkJICAgKGRtYV9hZGRyX3QpIChpc19sYnVzX2RldmljZShkZXYpID8gXAorCQkJCQkJdmlydF90b19sYnVzKF9fYWRkcikgOiBcCisJCQkJCQlfX3ZpcnRfdG9fcGh5cyhfX2FkZHIpKTsgfSkKKworI2VuZGlmCS8qIENPTkZJR19BUkNIX09NQVAxNVhYICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pby5jCmluZGV4IDg3MDg4NmEuLjc5NjljZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJjbG9jay5oIgogCiBleHRlcm4gdm9pZCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpOwotZXh0ZXJuIHZvaWQgb21hcF9zcmFtX2luaXQodm9pZCk7CiAKIC8qCiAgKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIG1heSBwcm92aWRlIHRoZSBleHRyYSBtYXBwaW5nIGJlc2lkZXMgdGhlCkBAIC04NSw1MCArODQsNDUgQEAKICNlbmRpZgogCiAvKgotICogTWFwcyBjb21tb24gSU8gcmVnaW9ucyBmb3Igb21hcDEuIFRoaXMgc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmcm9tCi0gKiBib2FyZCBzcGVjaWZpYyBpbml0LgorICogTWFwcyBjb21tb24gSU8gcmVnaW9ucyBmb3Igb21hcDEKICAqLwotdm9pZCBfX2luaXQgb21hcDFfbWFwX2NvbW1vbl9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9tYXAxX21hcF9jb21tb25faW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQob21hcF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfaW9fZGVzYykpOwotCi0JLyogTm9ybWFsbHkgZGV2aWNlbWFwc19pbml0KCkgd291bGQgZmx1c2ggY2FjaGVzIGFuZCB0bGIgYWZ0ZXIKLQkgKiBtZGVzYy0+bWFwX2lvKCksIGJ1dCB3ZSBtdXN0IGFsc28gZG8gaXQgaGVyZSBiZWNhdXNlIG9mIHRoZSBDUFUKLQkgKiByZXZpc2lvbiBjaGVjayBiZWxvdy4KLQkgKi8KLQlsb2NhbF9mbHVzaF90bGJfYWxsKCk7Ci0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0KLQkvKiBXZSB3YW50IHRvIGNoZWNrIENQVSByZXZpc2lvbiBlYXJseSBmb3IgY3B1X2lzX29tYXB4eHh4KCkgbWFjcm9zLgotCSAqIElPIHNwYWNlIG1hcHBpbmcgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuIGRvIHRoYXQuCi0JICovCi0Jb21hcF9jaGVja19yZXZpc2lvbigpOwotCi0jaWYgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDg1MCkKLQlpZiAoY3B1X2lzX29tYXA3eHgoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDd4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3eHhfaW9fZGVzYykpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCi0JaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7Ci0JCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDE2eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTZ4eF9pb19kZXNjKSk7Ci0JfQotI2VuZGlmCi0KLQlvbWFwX3NyYW1faW5pdCgpOwogfQogCi0vKgotICogQ29tbW9uIGxvdy1sZXZlbCBoYXJkd2FyZSBpbml0IGZvciBvbWFwMS4gVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20KLSAqIGJvYXJkIHNwZWNpZmljIGluaXQuCi0gKi8KLXZvaWQgX19pbml0IG9tYXAxX2luaXRfY29tbW9uX2h3KHZvaWQpCisjaWYgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDg1MCkKK3ZvaWQgX19pbml0IG9tYXA3eHhfbWFwX2lvKHZvaWQpCiB7CisJb21hcDFfbWFwX2NvbW1vbl9pbygpOworCWlvdGFibGVfaW5pdChvbWFwN3h4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDd4eF9pb19kZXNjKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCit2b2lkIF9faW5pdCBvbWFwMTV4eF9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMV9tYXBfY29tbW9uX2lvKCk7CisJaW90YWJsZV9pbml0KG9tYXAxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDE1MTBfaW9fZGVzYykpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQordm9pZCBfX2luaXQgb21hcDE2eHhfbWFwX2lvKHZvaWQpCit7CisJb21hcDFfbWFwX2NvbW1vbl9pbygpOworCWlvdGFibGVfaW5pdChvbWFwMTZ4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNnh4X2lvX2Rlc2MpKTsKK30KKyNlbmRpZgorCisvKgorICogQ29tbW9uIGxvdy1sZXZlbCBoYXJkd2FyZSBpbml0IGZvciBvbWFwMS4KKyAqLwordm9pZCBvbWFwMV9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcF9jaGVja19yZXZpc2lvbigpOworCW9tYXBfaW9yZW1hcF9pbml0KCk7CisKIAkvKiBSRVZJU0lUOiBSZWZlciB0byBPTUFQNTkxMCBFcnJhdGEsIEFkdmlzb3J5IFNZU18xOiAiVGltZW91dCBBYm9ydAogCSAqIG9uIGEgUG9zdGVkIFdyaXRlIGluIHRoZSBUSVBCIEJyaWRnZSIuCiAJICovCkBAIC0xMzgsOCArMTMyLDggQEAKIAkvKiBNdXN0IGluaXQgY2xvY2tzIGVhcmx5IHRvIGFzc3VyZSB0aGF0IHRpbWVyIGludGVycnVwdCB3b3JrcwogCSAqLwogCW9tYXAxX2Nsa19pbml0KCk7Ci0KIAlvbWFwMV9tdXhfaW5pdCgpOworCW9tYXBfaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwppbmRleCBlMmI5YzkwLi5lNWIxMDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKQEAgLTM1LDcgKzM1LDcgQEAKICAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNkZWZpbmUgSVJRX0JBTksoaXJxKSAoKGlycSkgPj4gNSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCmluZGV4IGI0ZjliZTUuLjRiODE4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1oMnAyLWRlYnVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwpAQCAtOSw2ICs5LDcgQEAKICAqIFRoZSAic3VyZmVyIiBleHBhbnNpb24gYm9hcmQgYW5kIEgyIHNhbXBsZSBib2FyZCBhbHNvIGhhdmUgdHdvLWNvbG9yCiAgKiBncmVlbityZWQgTEVEcyAoaW4gcGFyYWxsZWwpLCB1c2VkIGhlcmUgZm9yIHRpbWVyIGFuZCBpZGxlIGluZGljYXRvcnMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTIwLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8cGxhdC9mcGdhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJsZWRzLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwppbmRleCA0OTlkN2FkLi5kYTA5ZjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCkBAIC0zLDE0ICszLDEzIEBACiAgKgogICogTEVEIGRyaXZlciBmb3IgT1NLIHdpdGggb3B0aW9uYWwgTWlzdHJhbCBRVkdBIGJvYXJkCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0KICNpbmNsdWRlICJsZWRzLmgiCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwppbmRleCAyMmViMTFkLi5hZTZkZDkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMuYwpAQCAtMywxMyArMywxMyBAQAogICoKICAqIE9NQVAgTEVEcyBkaXNwYXRjaGVyCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KIAogI2luY2x1ZGUgImxlZHMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWFpbGJveC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tYWlsYm94LmMKaW5kZXggYzBlMWY0OC4uZTk2MjkyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tYWlsYm94LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tYWlsYm94LmMKQEAgLTksNiArOSw3IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCmluZGV4IGFiNzM5NWQuLjkxZjlhYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHN0YXRpYyBpbnQgZHNwX3VzZTsKIHN0YXRpYyBzdHJ1Y3QgY2xrICphcGlfY2xrOwogc3RhdGljIHN0cnVjdCBjbGsgKmRzcF9jbGs7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKm9tYXBfbWNic3BfZGV2aWNlczsKIAogc3RhdGljIHZvaWQgb21hcDFfbWNic3BfcmVxdWVzdCh1bnNpZ25lZCBpbnQgaWQpCiB7CkBAIC03OCw2ICs3OSwxNyBAQAogCS5mcmVlCQk9IG9tYXAxX21jYnNwX2ZyZWUsCiB9OwogCisjZGVmaW5lIE9NQVA3WFhfTUNCU1AxX0JBU0UJMHhmZmZiMTAwMAorI2RlZmluZSBPTUFQN1hYX01DQlNQMl9CQVNFCTB4ZmZmYjE4MDAKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfQkFTRQkweGUxMDExODAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMl9CQVNFCTB4ZmZmYjEwMDAKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AzX0JBU0UJMHhlMTAxNzAwMAorCisjZGVmaW5lIE9NQVAxNjEwX01DQlNQMV9CQVNFCTB4ZTEwMTE4MDAKKyNkZWZpbmUgT01BUDE2MTBfTUNCU1AyX0JBU0UJMHhmZmZiMTAwMAorI2RlZmluZSBPTUFQMTYxMF9NQ0JTUDNfQkFTRQkweGUxMDE3MDAwCisKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA3MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDg1MCkKIHN0cnVjdCByZXNvdXJjZSBvbWFwN3h4X21jYnNwX3Jlc1tdWzZdID0gewogCXsKQEAgLTM2OSw2ICszODEsMzkgQEAKICNkZWZpbmUgT01BUDE2WFhfTUNCU1BfQ09VTlQJCTAKICNlbmRpZgogCitzdGF0aWMgdm9pZCBvbWFwX21jYnNwX3JlZ2lzdGVyX2JvYXJkX2NmZyhzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc19jb3VudCwKKwkJCXN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgKmNvbmZpZywgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlvbWFwX21jYnNwX2RldmljZXMgPSBremFsbG9jKHNpemUgKiBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghb21hcF9tY2JzcF9kZXZpY2VzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIE1jQlNQIGRldmljZXNcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuZXdfbWNic3A7CisJCWludCByZXQ7CisKKwkJbmV3X21jYnNwID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJvbWFwLW1jYnNwIiwgaSArIDEpOworCQlpZiAoIW5ld19tY2JzcCkKKwkJCWNvbnRpbnVlOworCQlwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhuZXdfbWNic3AsICZyZXNbaSAqIHJlc19jb3VudF0sCisJCQkJCXJlc19jb3VudCk7CisJCWNvbmZpZ1tpXS5yZWdfc2l6ZSA9IDI7CisJCWNvbmZpZ1tpXS5yZWdfc3RlcCA9IDI7CisJCW5ld19tY2JzcC0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmY29uZmlnW2ldOworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG5ld19tY2JzcCk7CisJCWlmIChyZXQpIHsKKwkJCXBsYXRmb3JtX2RldmljZV9wdXQobmV3X21jYnNwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9tYXBfbWNic3BfZGV2aWNlc1tpXSA9IG5ld19tY2JzcDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAxX21jYnNwX2luaXQodm9pZCkKIHsKIAlpZiAoIWNwdV9jbGFzc19pc19vbWFwMSgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCmluZGV4IDQ5NWIzOTguLjg5ZWEyMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWZkZWYgQ09ORklHX09NQVBfTVBVX1RJTUVSCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NUFVfVElNRVIpICYmICFkZWZpbmVkKENPTkZJR19PTUFQX0RNX1RJTUVSKQogI3dhcm5pbmcgRW5hYmxlIDMya0h6IE9TIHRpbWVyIGluIG9yZGVyIHRvIGFsbG93IHNsZWVwIHN0YXRlcyBpbiBpZGxlCiAJdXNlX2lkbGVjdDEgPSB1c2VfaWRsZWN0MSAmIH4oMSA8PCA5KTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwppbmRleCA1NTBjYTlkLi45M2FlOGYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvc2VyaWFsLmMKQEAgLTcsNyArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2ZwZ2EuaD4KIAogI2luY2x1ZGUgInBtLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5MDY2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZXIuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoqCisgKiBPTUFQMSBEdWFsLU1vZGUgVGltZXJzIC0gcGxhdGZvcm0gZGV2aWNlIHJlZ2lzdHJhdGlvbgorICoKKyAqIENvbnRhaW5zIGZpcnN0IGxldmVsIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIHdoaWNoIGludGVybmFsbHkKKyAqIGdlbmVyYXRlcyB0aW1lciBkZXZpY2UgaW5mb3JtYXRpb24gYW5kIHJlZ2lzdGVycyB3aXRoIGxpbnV4CisgKiBkZXZpY2UgbW9kZWwuIEl0IGFsc28gaGFzIGxvdyBsZXZlbCBmdW5jdGlvbiB0byBjaG5hZ2UgdGhlIHRpbWVyCisgKiBpbnB1dCBjbG9jayBzb3VyY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogVGFydW4gS2FudGkgRGViQmFybWEgPHRhcnVuLmthbnRpQHRpLmNvbT4KKyAqIFRoYXJhIEdvcGluYXRoIDx0aGFyYUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KKworI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSMV9CQVNFCQkweGZmZmIxNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQVElNRVIyX0JBU0UJCTB4ZmZmYjFjMDAKKyNkZWZpbmUgT01BUDE2MTBfR1BUSU1FUjNfQkFTRQkJMHhmZmZiMjQwMAorI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSNF9CQVNFCQkweGZmZmIyYzAwCisjZGVmaW5lIE9NQVAxNjEwX0dQVElNRVI1X0JBU0UJCTB4ZmZmYjM0MDAKKyNkZWZpbmUgT01BUDE2MTBfR1BUSU1FUjZfQkFTRQkJMHhmZmZiM2MwMAorI2RlZmluZSBPTUFQMTYxMF9HUFRJTUVSN19CQVNFCQkweGZmZmI3NDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQVElNRVI4X0JBU0UJCTB4ZmZmYmQ0MDAKKworI2RlZmluZSBPTUFQMV9ETV9USU1FUl9DT1VOVAkJOAorCitzdGF0aWMgaW50IG9tYXAxX2RtX3RpbWVyX3NldF9zcmMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlpbnQgc291cmNlKQoreworCWludCBuID0gKHBkZXYtPmlkIC0gMSkgPDwgMTsKKwl1MzIgbDsKKworCWwgPSBfX3Jhd19yZWFkbChNT0RfQ09ORl9DVFJMXzEpICYgfigweDAzIDw8IG4pOworCWwgfD0gc291cmNlIDw8IG47CisJX19yYXdfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgX19pbml0IG9tYXAxX2RtX3RpbWVyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDE7IGkgPD0gT01BUDFfRE1fVElNRVJfQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzJdOworCQl1MzIgYmFzZSwgaXJxOworCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDE6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjFfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVIxOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWJhc2UgPSBPTUFQMTYxMF9HUFRJTUVSMl9CQVNFOworCQkJaXJxID0gSU5UXzE2MTBfR1BUSU1FUjI7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYmFzZSA9IE9NQVAxNjEwX0dQVElNRVIzX0JBU0U7CisJCQlpcnEgPSBJTlRfMTYxMF9HUFRJTUVSMzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjRfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVI0OworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWJhc2UgPSBPTUFQMTYxMF9HUFRJTUVSNV9CQVNFOworCQkJaXJxID0gSU5UXzE2MTBfR1BUSU1FUjU7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYmFzZSA9IE9NQVAxNjEwX0dQVElNRVI2X0JBU0U7CisJCQlpcnEgPSBJTlRfMTYxMF9HUFRJTUVSNjsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQliYXNlID0gT01BUDE2MTBfR1BUSU1FUjdfQkFTRTsKKwkJCWlycSA9IElOVF8xNjEwX0dQVElNRVI3OworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWJhc2UgPSBPTUFQMTYxMF9HUFRJTUVSOF9CQVNFOworCQkJaXJxID0gSU5UXzE2MTBfR1BUSU1FUjg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBub3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZS4KKwkJCSAqIHRoaXMgaXMgdG8gcmVtb3ZlIHdhcm5pbmcuCisJCQkgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygib21hcF90aW1lciIsIGkpOworCQlpZiAoIXBkZXYpIHsKKwkJCXByX2VycigiJXM6IEZhaWxlZCB0byBkZXZpY2UgYWxsb2MgZm9yIGRtdGltZXIlZFxuIiwKKwkJCQlfX2Z1bmNfXywgaSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChyZXMsIDAsIDIgKiBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJCXJlc1swXS5zdGFydCA9IGJhc2U7CisJCXJlc1swXS5lbmQgPSBiYXNlICsgMHg0NjsKKwkJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCXJlc1sxXS5zdGFydCA9IGlycTsKKwkJcmVzWzFdLmVuZCA9IGlycTsKKwkJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHJlcywKKwkJCQlBUlJBWV9TSVpFKHJlcykpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGFkZCByZXNvdXJjZXMuXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2ZyZWVfcGRldjsKKwkJfQorCisJCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGRhdGEpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgcGRhdGEuXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9mcmVlX3BkYXRhOworCQl9CisKKwkJcGRhdGEtPnNldF90aW1lcl9zcmMgPSBvbWFwMV9kbV90aW1lcl9zZXRfc3JjOworCQlwZGF0YS0+bmVlZHNfbWFudWFsX3Jlc2V0ID0gMTsKKworCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhZGQgcGxhdGZvcm0gZGF0YS5cbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnJfZnJlZV9wZGF0YTsKKwkJfQorCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWRkIHBsYXRmb3JtIGRldmljZS5cbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBlcnJfZnJlZV9wZGF0YTsKKwkJfQorCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIiBSZWdpc3RlcmVkLlxuIik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX3BkYXRhOgorCWtmcmVlKHBkYXRhKTsKKworZXJyX2ZyZWVfcGRldjoKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKworCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKG9tYXAxX2RtX3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCmluZGV4IDg5YmZiNDkuLjUwMzQxNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKQEAgLTE0LDcgKzE0LDYgQEAKIAlzZWxlY3QgU0VSSUFMX09NQVBfQ09OU09MRQogCXNlbGVjdCBJMkMKIAlzZWxlY3QgSTJDX09NQVAKLQlzZWxlY3QgTUZEX1NVUFBPUlQKIAlzZWxlY3QgTUVORUxBVVMgaWYgQVJDSF9PTUFQMgogCXNlbGVjdCBUV0w0MDMwX0NPUkUgaWYgQVJDSF9PTUFQMyB8fCBBUkNIX09NQVA0CiAJc2VsZWN0IFRXTDQwMzBfUE9XRVIgaWYgQVJDSF9PTUFQMyB8fCBBUkNIX09NQVA0CkBAIC0xMDgsOSArMTA3LDEzIEBACiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUwogCiBjb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKLQlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAyCisJYm9vbCAiR2VuZXJpYyBPTUFQMisgYm9hcmQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUworCXNlbGVjdCBVU0VfT0YKIAlkZWZhdWx0IHkKKwloZWxwCisJICBTdXBwb3J0IGZvciBnZW5lcmljIFRJIE9NQVAyKyBib2FyZHMgdXNpbmcgRmxhdHRlbmVkIERldmljZSBUcmVlLgorCSAgTW9yZSBpbmZvcm1hdGlvbiBhdCBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUKIAogY29uZmlnIE1BQ0hfT01BUDJfVFVTQjYwMTAKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQppbmRleCA3MzE3YTJiLi42OWFiMWMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKQEAgLTg5LDE0ICs4OSwxMyBAQAogCQkJCQkgICB2cDQ0eHhfZGF0YS5vCiAKICMgT01BUCB2b2x0YWdlIGRvbWFpbnMKLWlmZXEgKCQoQ09ORklHX1BNKSx5KQotdm9sdGFnZWRvbWFpbi1jb21tb24JCQk6PSB2b2x0YWdlLm8KLW9iai0kKENPTkZJR19BUkNIX09NQVAyKQkJKz0gJCh2b2x0YWdlZG9tYWluLWNvbW1vbikKK3ZvbHRhZ2Vkb21haW4tY29tbW9uCQkJOj0gdm9sdGFnZS5vIHZjLm8gdnAubworb2JqLSQoQ09ORklHX0FSQ0hfT01BUDIpCQkrPSAkKHZvbHRhZ2Vkb21haW4tY29tbW9uKSBcCisJCQkJCSAgIHZvbHRhZ2Vkb21haW5zMnh4eF9kYXRhLm8KIG9iai0kKENPTkZJR19BUkNIX09NQVAzKQkJKz0gJCh2b2x0YWdlZG9tYWluLWNvbW1vbikgXAogCQkJCQkgICB2b2x0YWdlZG9tYWluczN4eHhfZGF0YS5vCiBvYmotJChDT05GSUdfQVJDSF9PTUFQNCkJCSs9ICQodm9sdGFnZWRvbWFpbi1jb21tb24pIFwKIAkJCQkJICAgdm9sdGFnZWRvbWFpbnM0NHh4X2RhdGEubwotZW5kaWYKIAogIyBPTUFQIHBvd2VyZG9tYWluIGZyYW1ld29yawogcG93ZXJkb21haW4tY29tbW9uCQkJKz0gcG93ZXJkb21haW4ubyBwb3dlcmRvbWFpbi1jb21tb24ubwpAQCAtMTE2LDkgKzExNSwxMiBAQAogb2JqLSQoQ09ORklHX0FSQ0hfT01BUDIpCQkrPSBjbG9ja2RvbWFpbi5vIFwKIAkJCQkJICAgY2xvY2tkb21haW4yeHh4XzN4eHgubyBcCiAJCQkJCSAgIGNsb2NrZG9tYWluczJ4eHhfM3h4eF9kYXRhLm8KK29iai0kKENPTkZJR19TT0NfT01BUDI0MjApCQkrPSBjbG9ja2RvbWFpbnMyNDIwX2RhdGEubworb2JqLSQoQ09ORklHX1NPQ19PTUFQMjQzMCkJCSs9IGNsb2NrZG9tYWluczI0MzBfZGF0YS5vCiBvYmotJChDT05GSUdfQVJDSF9PTUFQMykJCSs9IGNsb2NrZG9tYWluLm8gXAogCQkJCQkgICBjbG9ja2RvbWFpbjJ4eHhfM3h4eC5vIFwKLQkJCQkJICAgY2xvY2tkb21haW5zMnh4eF8zeHh4X2RhdGEubworCQkJCQkgICBjbG9ja2RvbWFpbnMyeHh4XzN4eHhfZGF0YS5vIFwKKwkJCQkJICAgY2xvY2tkb21haW5zM3h4eF9kYXRhLm8KIG9iai0kKENPTkZJR19BUkNIX09NQVA0KQkJKz0gY2xvY2tkb21haW4ubyBcCiAJCQkJCSAgIGNsb2NrZG9tYWluNDR4eC5vIFwKIAkJCQkJICAgY2xvY2tkb21haW5zNDR4eF9kYXRhLm8KQEAgLTE4NSw3NSArMTg3LDYyIEBACiAjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKIG9iai0kKENPTkZJR19NQUNIX09NQVBfR0VORVJJQykJCSs9IGJvYXJkLWdlbmVyaWMubwogb2JqLSQoQ09ORklHX01BQ0hfT01BUF9INCkJCSs9IGJvYXJkLWg0Lm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfMjQzMFNEUCkJCSs9IGJvYXJkLTI0MzBzZHAubyBcCi0JCQkJCSAgIGhzbW1jLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfMjQzMFNEUCkJCSs9IGJvYXJkLTI0MzBzZHAubwogb2JqLSQoQ09ORklHX01BQ0hfT01BUF9BUE9MTE9OKQkJKz0gYm9hcmQtYXBvbGxvbi5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQM19CRUFHTEUpCQkrPSBib2FyZC1vbWFwM2JlYWdsZS5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfREVWS0lUODAwMCkgICAgIAkrPSBib2FyZC1kZXZraXQ4MDAwLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfTERQKQkJKz0gYm9hcmQtbGRwLm8gXAotCQkJCQkgICBib2FyZC1mbGFzaC5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDM1MzBfTFZfU09NKSAgICAgICs9IGJvYXJkLW9tYXAzbG9naWMubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVAzX1RPUlBFRE8pICAgICAgICArPSBib2FyZC1vbWFwM2xvZ2ljLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PVkVSTykJCSs9IGJvYXJkLW92ZXJvLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQM0VWTSkJCSs9IGJvYXJkLW9tYXAzZXZtLm8gXAotCQkJCQkgICBoc21tYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQM19QQU5ET1JBKQkrPSBib2FyZC1vbWFwM3BhbmRvcmEubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfMzQzMFNEUCkJCSs9IGJvYXJkLTM0MzBzZHAubyBcCi0JCQkJCSAgIGhzbW1jLm8gXAotCQkJCQkgICBib2FyZC1mbGFzaC5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQM19CRUFHTEUpCQkrPSBib2FyZC1vbWFwM2JlYWdsZS5vCitvYmotJChDT05GSUdfTUFDSF9ERVZLSVQ4MDAwKSAgICAgCSs9IGJvYXJkLWRldmtpdDgwMDAubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9MRFApCQkrPSBib2FyZC1sZHAubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDM1MzBfTFZfU09NKSAgICAgICs9IGJvYXJkLW9tYXAzbG9naWMubworb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfVE9SUEVETykgICAgICAgICs9IGJvYXJkLW9tYXAzbG9naWMubworb2JqLSQoQ09ORklHX01BQ0hfRU5DT1JFKQkJKz0gYm9hcmQtb21hcDNlbmNvcmUubworb2JqLSQoQ09ORklHX01BQ0hfT1ZFUk8pCQkrPSBib2FyZC1vdmVyby5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQM0VWTSkJCSs9IGJvYXJkLW9tYXAzZXZtLm8KK29iai0kKENPTkZJR19NQUNIX09NQVAzX1BBTkRPUkEpCSs9IGJvYXJkLW9tYXAzcGFuZG9yYS5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQXzM0MzBTRFApCQkrPSBib2FyZC0zNDMwc2RwLm8KIG9iai0kKENPTkZJR19NQUNIX05PS0lBX044WDApCQkrPSBib2FyZC1uOHgwLm8KIG9iai0kKENPTkZJR19NQUNIX05PS0lBX1JNNjgwKQkJKz0gYm9hcmQtcm02ODAubyBcCi0JCQkJCSAgIHNkcmFtLW5va2lhLm8gXAotCQkJCQkgICBoc21tYy5vCisJCQkJCSAgIHNkcmFtLW5va2lhLm8KIG9iai0kKENPTkZJR19NQUNIX05PS0lBX1JYNTEpCQkrPSBib2FyZC1yeDUxLm8gXAogCQkJCQkgICBzZHJhbS1ub2tpYS5vIFwKIAkJCQkJICAgYm9hcmQtcng1MS1wZXJpcGhlcmFscy5vIFwKLQkJCQkJICAgYm9hcmQtcng1MS12aWRlby5vIFwKLQkJCQkJICAgaHNtbWMubworCQkJCQkgICBib2FyZC1yeDUxLXZpZGVvLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfWk9PTTIpCQkrPSBib2FyZC16b29tLm8gXAogCQkJCQkgICBib2FyZC16b29tLXBlcmlwaGVyYWxzLm8gXAogCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubyBcCi0JCQkJCSAgIGJvYXJkLWZsYXNoLm8gXAotCQkJCQkgICBoc21tYy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kZWJ1Z2JvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfWk9PTTMpCQkrPSBib2FyZC16b29tLm8gXAogCQkJCQkgICBib2FyZC16b29tLXBlcmlwaGVyYWxzLm8gXAogCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubyBcCi0JCQkJCSAgIGJvYXJkLWZsYXNoLm8gXAotCQkJCQkgICBoc21tYy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kZWJ1Z2JvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfMzYzMFNEUCkJCSs9IGJvYXJkLTM2MzBzZHAubyBcCiAJCQkJCSAgIGJvYXJkLXpvb20tcGVyaXBoZXJhbHMubyBcCi0JCQkJCSAgIGJvYXJkLXpvb20tZGlzcGxheS5vIFwKLQkJCQkJICAgYm9hcmQtZmxhc2gubyBcCi0JCQkJCSAgIGhzbW1jLm8KLW9iai0kKENPTkZJR19NQUNIX0NNX1QzNSkJCSs9IGJvYXJkLWNtLXQzNS5vIFwKLQkJCQkJICAgaHNtbWMubworCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubworb2JqLSQoQ09ORklHX01BQ0hfQ01fVDM1KQkJKz0gYm9hcmQtY20tdDM1Lm8KIG9iai0kKENPTkZJR19NQUNIX0NNX1QzNTE3KQkJKz0gYm9hcmQtY20tdDM1MTcubwotb2JqLSQoQ09ORklHX01BQ0hfSUdFUDAwMjApCQkrPSBib2FyZC1pZ2VwMDAyMC5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDNfVE9VQ0hCT09LKQkrPSBib2FyZC1vbWFwM3RvdWNoYm9vay5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUF80NDMwU0RQKQkJKz0gYm9hcmQtNDQzMHNkcC5vIFwKLQkJCQkJICAgaHNtbWMubwotb2JqLSQoQ09ORklHX01BQ0hfT01BUDRfUEFOREEpCQkrPSBib2FyZC1vbWFwNHBhbmRhLm8gXAotCQkJCQkgICBoc21tYy5vCitvYmotJChDT05GSUdfTUFDSF9JR0VQMDAyMCkJCSs9IGJvYXJkLWlnZXAwMDIwLm8KK29iai0kKENPTkZJR19NQUNIX09NQVAzX1RPVUNIQk9PSykJKz0gYm9hcmQtb21hcDN0b3VjaGJvb2subworb2JqLSQoQ09ORklHX01BQ0hfT01BUF80NDMwU0RQKQkJKz0gYm9hcmQtNDQzMHNkcC5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQNF9QQU5EQSkJCSs9IGJvYXJkLW9tYXA0cGFuZGEubworCitvYmotJChDT05GSUdfTUFDSF9QQ00wNDkpCQkrPSBib2FyZC1vbWFwNHBjbTA0OS5vCiAKIG9iai0kKENPTkZJR19NQUNIX09NQVAzNTE3RVZNKQkJKz0gYm9hcmQtYW0zNTE3ZXZtLm8KIAogb2JqLSQoQ09ORklHX01BQ0hfQ1JBTkVCT0FSRCkJCSs9IGJvYXJkLWFtMzUxN2NyYW5lLm8KIAotb2JqLSQoQ09ORklHX01BQ0hfU0JDMzUzMCkJCSs9IGJvYXJkLW9tYXAzc3RhbGtlci5vIFwKLQkJCQkJICAgaHNtbWMubworb2JqLSQoQ09ORklHX01BQ0hfU0JDMzUzMCkJCSs9IGJvYXJkLW9tYXAzc3RhbGtlci5vCiBvYmotJChDT05GSUdfTUFDSF9USTgxNjhFVk0pCQkrPSBib2FyZC10aTgxNjhldm0ubworCiAjIFBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0IGNvZGUKKworb21hcC1mbGFzaC0kKENPTkZJR19NVERfTkFORF9PTUFQMikJOj0gYm9hcmQtZmxhc2gubworb21hcC1mbGFzaC0kKENPTkZJR19NVERfT05FTkFORF9PTUFQMikJOj0gYm9hcmQtZmxhc2gubworb2JqLXkJCQkJCSs9ICQob21hcC1mbGFzaC15KSAkKG9tYXAtZmxhc2gtbSkKKworb21hcC1oc21tYy0kKENPTkZJR19NTUNfT01BUF9IUykJOj0gaHNtbWMubworb2JqLXkJCQkJCSs9ICQob21hcC1oc21tYy1tKSAkKG9tYXAtaHNtbWMteSkKKworCiB1c2Jmcy0kKENPTkZJR19BUkNIX09NQVBfT1RHKQkJOj0gdXNiLWZzLm8KIG9iai15CQkJCQkrPSAkKHVzYmZzLW0pICQodXNiZnMteSkKIG9iai15CQkJCQkrPSB1c2ItbXVzYi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTI0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCmluZGV4IGY3OWI3ZDIuLmQ3MDRmMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMjQzMHNkcC5jCkBAIC0zOSw2ICszOSw5IEBACiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMtc21jOTF4Lmg+CiAKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAiaHNtbWMuaCIKICNpbmNsdWRlICJjb21tb24tYm9hcmQtZGV2aWNlcy5oIgpAQCAtOTksMjAgKzEwMiw3MiBAQAogCS5yZXNvdXJjZQk9ICZzZHAyNDMwX2ZsYXNoX3Jlc291cmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2RwMjQzMF9sY2RfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzZHAyNDMwX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkcDI0MzBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNkcDI0MzBfZmxhc2hfZGV2aWNlLAorfTsKKworLyogTENEICovCisjZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCTkxCisjZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPCQkxNTQKKworc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX2VuYWJsZV9sY2Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRFAyNDMwX0xDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFNEUDI0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZHAyNDMwX3BhbmVsX2Rpc2FibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoU0RQMjQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRFAyNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBzZHAyNDMwX3BhbmVsX2RhdGEgPSB7CisJLm5hbWUJCQk9ICJuZWNfbmwyNDMyZHIyMi0xMWIiLAorCS5wbGF0Zm9ybV9lbmFibGUJPSBzZHAyNDMwX3BhbmVsX2VuYWJsZV9sY2QsCisJLnBsYXRmb3JtX2Rpc2FibGUJPSBzZHAyNDMwX3BhbmVsX2Rpc2FibGVfbGNkLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugc2RwMjQzMF9sY2RfZGV2aWNlID0geworCS5uYW1lCQkJPSAibGNkIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAorCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxNiwKKwkuZGF0YQkJCT0gJnNkcDI0MzBfcGFuZWxfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpzZHAyNDMwX2Rzc19kZXZpY2VzW10gPSB7CiAJJnNkcDI0MzBfbGNkX2RldmljZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHNkcDI0MzBfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIHNkcDI0MzBfZHNzX2RhdGEgPSB7CisJLm51bV9kZXZpY2VzCT0gQVJSQVlfU0laRShzZHAyNDMwX2Rzc19kZXZpY2VzKSwKKwkuZGV2aWNlcwk9IHNkcDI0MzBfZHNzX2RldmljZXMsCisJLmRlZmF1bHRfZGV2aWNlCT0gJnNkcDI0MzBfbGNkX2RldmljZSwKIH07CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBzZHAyNDMwX2Rpc3BsYXlfaW5pdCh2b2lkKQoreworCWludCByOworCisJc3RhdGljIHN0cnVjdCBncGlvIGdwaW9zW10gX19pbml0ZGF0YSA9IHsKKwkJeyBTRFAyNDMwX0xDRF9QQU5FTF9FTkFCTEVfR1BJTywgR1BJT0ZfT1VUX0lOSVRfTE9XLAorCQkJIkxDRCByZXNldCIgfSwKKwkJeyBTRFAyNDMwX0xDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgR1BJT0ZfT1VUX0lOSVRfTE9XLAorCQkJIkxDRCBCYWNrbGlnaHQiIH0sCisJfTsKKworCXIgPSBncGlvX3JlcXVlc3RfYXJyYXkoZ3Bpb3MsIEFSUkFZX1NJWkUoZ3Bpb3MpKTsKKwlpZiAocikgeworCQlwcl9lcnIoIkNhbm5vdCByZXF1ZXN0IExDRCBHUElPcywgZXJyb3IgJWRcbiIsIHIpOworCQlyZXR1cm47CisJfQorCisJb21hcF9kaXNwbGF5X2luaXQoJnNkcDI0MzBfZHNzX2RhdGEpOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MXhfTU9EVUxFKQogCiBzdGF0aWMgc3RydWN0IG9tYXBfc21jOTF4X3BsYXRmb3JtX2RhdGEgYm9hcmRfc21jOTF4X2RhdGEgPSB7CkBAIC0xMzcsMTYgKzE5Miw2IEBACiAKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBzZHAyNDMwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0Je09NQVBfVEFHX0xDRCwgJnNkcDI0MzBfbGNkX2NvbmZpZ30sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF8yNDMwc2RwX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBzZHAyNDMwX3ZtbWMxX3N1cHBsaWVzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKIH07CkBAIC0yMjksMTMgKzI3NCwxMSBAQAogewogCW9tYXAyNDMwX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX1pBQyk7CiAKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IHNkcDI0MzBfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHNkcDI0MzBfY29uZmlnKTsKLQogCW9tYXAyNDMwX2kyY19pbml0KCk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzZHAyNDMwX2RldmljZXMsIEFSUkFZX1NJWkUoc2RwMjQzMF9kZXZpY2VzKSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKIAlvbWFwMl91c2Jmc19pbml0KCZzZHAyNDMwX3VzYl9jb25maWcpOwogCkBAIC0yNDcsMjAgKzI5MCwxNiBAQAogCS8qIFR1cm4gb2ZmIHNlY29uZGFyeSBMQ0QgYmFja2xpZ2h0ICovCiAJZ3Bpb19yZXF1ZXN0X29uZShTRUNPTkRBUllfTENEX0dQSU8sIEdQSU9GX09VVF9JTklUX0xPVywKIAkJCSAiU2Vjb25kYXJ5IExDRCBiYWNrbGlnaHQiKTsKLX0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfMjQzMHNkcF9tYXBfaW8odm9pZCkKLXsKLQlvbWFwMl9zZXRfZ2xvYmFsc18yNDN4KCk7Ci0Jb21hcDI0M3hfbWFwX2NvbW1vbl9pbygpOworCXNkcDI0MzBfZGlzcGxheV9pbml0KCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF8yNDMwU0RQLCAiT01BUDI0MzAgc2RwMjQzMCBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU3llZCBLaGFzaW0gLSBUZXhhcyBJbnN0cnVtZW50cyBJbmMgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcF8yNDMwc2RwX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfMjQzMHNkcF9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDI0M3hfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF8yNDMwc2RwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKaW5kZXggYmQ2MDBjZi4uNzcxNDJjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KIAogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbWM5MXguaD4KIApAQCAtMTg2LDggKzE4Niw3IEBACiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBzZHAzNDMwX3BhbmVsX2Rpc2FibGVfbGNkLAogfTsKIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IHNkcDM0MzBfcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9kdmksCiB9OwpAQCAtMTk1LDcgKzE5NCw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHAzNDMwX2R2aV9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJkdmkiLAogCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJkdmkiLAogCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKIH07CkBAIC0yMjUsMTIgKzIyNCw2IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBzZHAzNDMwX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF8zNDMwc2RwX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoaHliMThtNTEyMTYwYWY2X3NkcmNfcGFyYW1zLCBOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBvbWFwMl9oc21tY19pbmZvIG1tY1tdID0gewogCXsKIAkJLm1tYwkJPSAxLApAQCAtNzE5LDYgKzcxMiw3IEBACiAJCWdwaW9fcGVuZG93biA9IFNEUDM0MzBfVFNfR1BJT19JUlFfU0RQVjE7CiAJb21hcF9hZHM3ODQ2X2luaXQoMSwgZ3Bpb19wZW5kb3duLCAzMTAsIE5VTEwpOwogCWJvYXJkX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoaHliMThtNTEyMTYwYWY2X3NkcmNfcGFyYW1zLCBOVUxMKTsKIAl1c2JfbXVzYl9pbml0KE5VTEwpOwogCWJvYXJkX3NtYzkxeF9pbml0KCk7CiAJYm9hcmRfZmxhc2hfaW5pdChzZHBfZmxhc2hfcGFydGl0aW9ucywgY2hpcF9zZWxfMzQzMCwgMCk7CkBAIC03MjksMTAgKzcyMywxMCBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVBfMzQzMFNEUCwgIk9NQVAzNDMwIDM0MzBTRFAgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFN5ZWQgS2hhc2ltIC0gVGV4YXMgSW5zdHJ1bWVudHMgSW5jICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfMzQzMHNkcF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM0MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF8zNDMwc2RwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKaW5kZXggZTRmMzdiNS4uZjU1MjMwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKQEAgLTcwLDEzICs3MCw2IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBzZHBfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3NkcF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcywKLQkJCQkgIGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKIAl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LApAQCAtMjA3LDYgKzIwMCw4IEBACiAJb21hcF9ib2FyZF9jb25maWcgPSBzZHBfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHNkcF9jb25maWcpOwogCXpvb21fcGVyaXBoZXJhbHNfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcywKKwkJCQkgIGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcyk7CiAJem9vbV9kaXNwbGF5X2luaXQoKTsKIAlib2FyZF9zbWM5MXhfaW5pdCgpOwogCWJvYXJkX2ZsYXNoX2luaXQoc2RwX2ZsYXNoX3BhcnRpdGlvbnMsIGNoaXBfc2VsX3NkcCwgTkFORF9CVVNXSURUSF8xNik7CkBAIC0yMTUsMTAgKzIxMCwxMCBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfMzYzMFNEUCwgIk9NQVAgMzYzMFNEUCBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfc2RwX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzYzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3NkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLTQ0MzBzZHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCmluZGV4IGM3Y2VmNDQuLjUxNTY0NjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KICNpbmNsdWRlIDxwbGF0L29tYXA0LWtleXBhZC5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLW5va2lhLWRzaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogCiAjaW5jbHVkZSAibXV4LmgiCkBAIC01Miw2ICs1NCw4IEBACiAjZGVmaW5lIE9NQVA0X1NGSDc3NDFfRU5BQkxFX0dQSU8JCTE4OAogI2RlZmluZSBIRE1JX0dQSU9fSFBEIDYwIC8qIEhvdCBwbHVnIHBpbiBmb3IgSERNSSAqLwogI2RlZmluZSBIRE1JX0dQSU9fTFNfT0UgNDEgLyogTGV2ZWwgc2hpZnRlciBmb3IgSERNSSAqLworI2RlZmluZSBESVNQTEFZX1NFTF9HUElPCTU5CS8qIExDRDIvUGljb0RMUCBzd2l0Y2ggKi8KKyNkZWZpbmUgRExQX1BPV0VSX09OX0dQSU8JNDAKIAogI2RlZmluZSBHUElPX1dJRklfUE1FTkEJCTU0CiAjZGVmaW5lIEdQSU9fV0lGSV9JUlEJCTUzCkBAIC0xMjksNyArMTMzLDcgQEAKIAlLRVkoNywgNiwgS0VZX09LKSwKIAlLRVkoNywgNywgS0VZX0RPV04pLAogfTsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcGFkIGtleXBhZF9wYWRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcGFkIGtleXBhZF9wYWRzW10gPSB7CiAJewkubmFtZSAgID0gImtwZF9jb2wxLmtwZF9jb2wxIiwKIAkJLmVuYWJsZSA9IE9NQVBfV0FLRVVQX0VOIHwgT01BUF9NVVhfTU9ERTEsCiAJfSwKQEAgLTM0MCwxMSArMzQ0LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZHA0NDMwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNkcDQ0MzBfbGNkIiwKLQkuaWQJCT0gLTEsCi19OwotCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgc2RwNDQzMF92YmF0X3N1cHBseVtdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHZpYmwiLCAidHdsNjA0MC12aWJyYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHZpYnIiLCAidHdsNjA0MC12aWJyYSIpLApAQCAtMzc0LDI3ICszNzMsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZHA0NDMwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzZHA0NDMwX2xjZF9kZXZpY2UsCiAJJnNkcDQ0MzBfZ3Bpb19rZXlzX2RldmljZSwKIAkmc2RwNDQzMF9sZWRzX2dwaW8sCiAJJnNkcDQ0MzBfbGVkc19wd20sCiAJJnNkcDQ0MzBfdmJhdCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHNkcDQ0MzBfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgc2RwNDQzMF9jb25maWdbXSBfX2luaXRkYXRhID0gewotCXsgT01BUF9UQUdfTENELAkJJnNkcDQ0MzBfbGNkX2NvbmZpZyB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfNDQzMHNkcF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfbXVzYl9ib2FyZF9kYXRhIG11c2JfYm9hcmRfZGF0YSA9IHsKIAkuaW50ZXJmYWNlX3R5cGUJCT0gTVVTQl9JTlRFUkZBQ0VfVVRNSSwKIAkubW9kZQkJCT0gTVVTQl9PVEcsCkBAIC02NDgsMzcgKzYzMiwyMDIgQEAKIAlncGlvX2ZyZWUoSERNSV9HUElPX0hQRCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgbm9raWFfZHNpX3BhbmVsX2RhdGEgZHNpMV9wYW5lbCA9IHsKKwkJLm5hbWUJCT0gInRhYWwiLAorCQkucmVzZXRfZ3Bpbwk9IDEwMiwKKwkJLnVzZV9leHRfdGUJPSBmYWxzZSwKKwkJLmV4dF90ZV9ncGlvCT0gMTAxLAorCQkuZXNkX2ludGVydmFsCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDQ0MzBfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCisJLmRyaXZlcl9uYW1lCQk9ICJ0YWFsIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFNJLAorCS5kYXRhCQkJPSAmZHNpMV9wYW5lbCwKKwkucGh5LmRzaQkJPSB7CisJCS5jbGtfbGFuZQk9IDEsCisJCS5jbGtfcG9sCT0gMCwKKwkJLmRhdGExX2xhbmUJPSAyLAorCQkuZGF0YTFfcG9sCT0gMCwKKwkJLmRhdGEyX2xhbmUJPSAzLAorCQkuZGF0YTJfcG9sCT0gMCwKKworCQkubW9kdWxlCQk9IDAsCisJfSwKKworCS5jbG9ja3MgPSB7CisJCS5kaXNwYyA9IHsKKwkJCS5jaGFubmVsID0geworCQkJCS8qIExvZ2ljIENsb2NrID0gMTcyLjggTUh6ICovCisJCQkJLmxja19kaXYJPSAxLAorCQkJCS8qIFBpeGVsIENsb2NrID0gMzQuNTYgTUh6ICovCisJCQkJLnBja19kaXYJPSA1LAorCQkJCS5sY2RfY2xrX3NyYwk9IE9NQVBfRFNTX0NMS19TUkNfRFNJX1BMTF9IU0RJVl9ESVNQQywKKwkJCX0sCisJCQkuZGlzcGNfZmNsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0ZDSywKKwkJfSwKKworCQkuZHNpID0geworCQkJLnJlZ24JCT0gMTYsCS8qIEZpbnQgPSAyLjQgTUh6ICovCisJCQkucmVnbQkJPSAxODAsCS8qIEREUiBDbG9jayA9IDIxNiBNSHogKi8KKwkJCS5yZWdtX2Rpc3BjCT0gNSwJLyogUExMMV9DTEsxID0gMTcyLjggTUh6ICovCisJCQkucmVnbV9kc2kJPSA1LAkvKiBQTEwxX0NMSzIgPSAxNzIuOCBNSHogKi8KKworCQkJLmxwX2Nsa19kaXYJPSAxMCwJLyogTFAgQ2xvY2sgPSA4LjY0IE1IeiAqLworCQkJLmRzaV9mY2xrX3NyYwk9IE9NQVBfRFNTX0NMS19TUkNfRFNJX1BMTF9IU0RJVl9EU0ksCisJCX0sCisJfSwKKwkuY2hhbm5lbAkJPSBPTUFQX0RTU19DSEFOTkVMX0xDRCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm9raWFfZHNpX3BhbmVsX2RhdGEgZHNpMl9wYW5lbCA9IHsKKwkJLm5hbWUJCT0gInRhYWwiLAorCQkucmVzZXRfZ3Bpbwk9IDEwNCwKKwkJLnVzZV9leHRfdGUJPSBmYWxzZSwKKwkJLmV4dF90ZV9ncGlvCT0gMTAzLAorCQkuZXNkX2ludGVydmFsCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHNkcDQ0MzBfbGNkMl9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJsY2QyIiwKKwkuZHJpdmVyX25hbWUJCT0gInRhYWwiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EU0ksCisJLmRhdGEJCQk9ICZkc2kyX3BhbmVsLAorCS5waHkuZHNpCQk9IHsKKwkJLmNsa19sYW5lCT0gMSwKKwkJLmNsa19wb2wJPSAwLAorCQkuZGF0YTFfbGFuZQk9IDIsCisJCS5kYXRhMV9wb2wJPSAwLAorCQkuZGF0YTJfbGFuZQk9IDMsCisJCS5kYXRhMl9wb2wJPSAwLAorCisJCS5tb2R1bGUJCT0gMSwKKwl9LAorCisJLmNsb2NrcyA9IHsKKwkJLmRpc3BjID0geworCQkJLmNoYW5uZWwgPSB7CisJCQkJLyogTG9naWMgQ2xvY2sgPSAxNzIuOCBNSHogKi8KKwkJCQkubGNrX2Rpdgk9IDEsCisJCQkJLyogUGl4ZWwgQ2xvY2sgPSAzNC41NiBNSHogKi8KKwkJCQkucGNrX2Rpdgk9IDUsCisJCQkJLmxjZF9jbGtfc3JjCT0gT01BUF9EU1NfQ0xLX1NSQ19EU0kyX1BMTF9IU0RJVl9ESVNQQywKKwkJCX0sCisJCQkuZGlzcGNfZmNsa19zcmMJPSBPTUFQX0RTU19DTEtfU1JDX0ZDSywKKwkJfSwKKworCQkuZHNpID0geworCQkJLnJlZ24JCT0gMTYsCS8qIEZpbnQgPSAyLjQgTUh6ICovCisJCQkucmVnbQkJPSAxODAsCS8qIEREUiBDbG9jayA9IDIxNiBNSHogKi8KKwkJCS5yZWdtX2Rpc3BjCT0gNSwJLyogUExMMV9DTEsxID0gMTcyLjggTUh6ICovCisJCQkucmVnbV9kc2kJPSA1LAkvKiBQTEwxX0NMSzIgPSAxNzIuOCBNSHogKi8KKworCQkJLmxwX2Nsa19kaXYJPSAxMCwJLyogTFAgQ2xvY2sgPSA4LjY0IE1IeiAqLworCQkJLmRzaV9mY2xrX3NyYwk9IE9NQVBfRFNTX0NMS19TUkNfRFNJMl9QTExfSFNESVZfRFNJLAorCQl9LAorCX0sCisJLmNoYW5uZWwJCT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyLAorfTsKKworc3RhdGljIHZvaWQgc2RwNDQzMF9sY2RfaW5pdCh2b2lkKQoreworCWludCByOworCisJciA9IGdwaW9fcmVxdWVzdF9vbmUoZHNpMV9wYW5lbC5yZXNldF9ncGlvLCBHUElPRl9ESVJfT1VULAorCQkibGNkMV9yZXNldF9ncGlvIik7CisJaWYgKHIpCisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgbGNkMV9yZXNldF9ncGlvXG4iLCBfX2Z1bmNfXyk7CisKKwlyID0gZ3Bpb19yZXF1ZXN0X29uZShkc2kyX3BhbmVsLnJlc2V0X2dwaW8sIEdQSU9GX0RJUl9PVVQsCisJCSJsY2QyX3Jlc2V0X2dwaW8iKTsKKwlpZiAocikKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBsY2QyX3Jlc2V0X2dwaW9cbiIsIF9fZnVuY19fKTsKK30KKwogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugc2RwNDQzMF9oZG1pX2RldmljZSA9IHsKIAkubmFtZSA9ICJoZG1pIiwKIAkuZHJpdmVyX25hbWUgPSAiaGRtaV9wYW5lbCIsCiAJLnR5cGUgPSBPTUFQX0RJU1BMQVlfVFlQRV9IRE1JLAotCS5jbG9ja3MJPSB7Ci0JCS5kaXNwYwk9IHsKLQkJCS5kaXNwY19mY2xrX3NyYwk9IE9NQVBfRFNTX0NMS19TUkNfRkNLLAotCQl9LAotCQkuaGRtaQk9IHsKLQkJCS5yZWduCT0gMTUsCi0JCQkucmVnbTIJPSAxLAotCQl9LAotCX0sCiAJLnBsYXRmb3JtX2VuYWJsZSA9IHNkcDQ0MzBfcGFuZWxfZW5hYmxlX2hkbWksCiAJLnBsYXRmb3JtX2Rpc2FibGUgPSBzZHA0NDMwX3BhbmVsX2Rpc2FibGVfaGRtaSwKIAkuY2hhbm5lbCA9IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQsCiB9OwogCitzdGF0aWMgc3RydWN0IHBpY29kbHBfcGFuZWxfZGF0YSBzZHA0NDMwX3BpY29kbHBfcGRhdGEgPSB7CisJLnBpY29kbHBfYWRhcHRlcl9pZAk9IDIsCisJLmVtdV9kb25lX2dwaW8JCT0gNDQsCisJLnB3cmdvb2RfZ3BpbwkJPSA0NSwKK307CisKK3N0YXRpYyB2b2lkIHNkcDQ0MzBfcGljb2RscF9pbml0KHZvaWQpCit7CisJaW50IHI7CisJY29uc3Qgc3RydWN0IGdwaW8gcGljb2RscF9ncGlvc1tdID0geworCQl7RExQX1BPV0VSX09OX0dQSU8sIEdQSU9GX09VVF9JTklUX0xPVywKKwkJCSJETFAgUE9XRVIgT04ifSwKKwkJe3NkcDQ0MzBfcGljb2RscF9wZGF0YS5lbXVfZG9uZV9ncGlvLCBHUElPRl9JTiwKKwkJCSJETFAgRU1VIERPTkUifSwKKwkJe3NkcDQ0MzBfcGljb2RscF9wZGF0YS5wd3Jnb29kX2dwaW8sIEdQSU9GX09VVF9JTklUX0xPVywKKwkJCSJETFAgUFdSR09PRCJ9LAorCX07CisKKwlyID0gZ3Bpb19yZXF1ZXN0X2FycmF5KHBpY29kbHBfZ3Bpb3MsIEFSUkFZX1NJWkUocGljb2RscF9ncGlvcykpOworCWlmIChyKQorCQlwcl9lcnIoIkNhbm5vdCByZXF1ZXN0IFBpY29ETFAgR1BJT3MsIGVycm9yICVkXG4iLCByKTsKK30KKworc3RhdGljIGludCBzZHA0NDMwX3BhbmVsX2VuYWJsZV9waWNvZGxwKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlncGlvX3NldF92YWx1ZShESVNQTEFZX1NFTF9HUElPLCAwKTsKKwlncGlvX3NldF92YWx1ZShETFBfUE9XRVJfT05fR1BJTywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RwNDQzMF9wYW5lbF9kaXNhYmxlX3BpY29kbHAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWdwaW9fc2V0X3ZhbHVlKERMUF9QT1dFUl9PTl9HUElPLCAwKTsKKwlncGlvX3NldF92YWx1ZShESVNQTEFZX1NFTF9HUElPLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugc2RwNDQzMF9waWNvZGxwX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInBpY29kbHAiLAorCS5kcml2ZXJfbmFtZQkJPSAicGljb2RscF9wYW5lbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCisJLmNoYW5uZWwJCT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyLAorCS5wbGF0Zm9ybV9lbmFibGUJPSBzZHA0NDMwX3BhbmVsX2VuYWJsZV9waWNvZGxwLAorCS5wbGF0Zm9ybV9kaXNhYmxlCT0gc2RwNDQzMF9wYW5lbF9kaXNhYmxlX3BpY29kbHAsCisJLmRhdGEJCQk9ICZzZHA0NDMwX3BpY29kbHBfcGRhdGEsCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqc2RwNDQzMF9kc3NfZGV2aWNlc1tdID0geworCSZzZHA0NDMwX2xjZF9kZXZpY2UsCisJJnNkcDQ0MzBfbGNkMl9kZXZpY2UsCiAJJnNkcDQ0MzBfaGRtaV9kZXZpY2UsCisJJnNkcDQ0MzBfcGljb2RscF9kZXZpY2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gc2RwNDQzMF9kc3NfZGF0YSA9IHsKIAkubnVtX2RldmljZXMJPSBBUlJBWV9TSVpFKHNkcDQ0MzBfZHNzX2RldmljZXMpLAogCS5kZXZpY2VzCT0gc2RwNDQzMF9kc3NfZGV2aWNlcywKLQkuZGVmYXVsdF9kZXZpY2UJPSAmc2RwNDQzMF9oZG1pX2RldmljZSwKKwkuZGVmYXVsdF9kZXZpY2UJPSAmc2RwNDQzMF9sY2RfZGV2aWNlLAogfTsKIAotdm9pZCBvbWFwXzQ0MzBzZHBfZGlzcGxheV9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBvbWFwXzQ0MzBzZHBfZGlzcGxheV9pbml0KHZvaWQpCiB7CisJaW50IHI7CisKKwkvKiBFbmFibGUgTENEMiBieSBkZWZhdWx0IChpbnN0ZWFkIG9mIFBpY28gRExQKSAqLworCXIgPSBncGlvX3JlcXVlc3Rfb25lKERJU1BMQVlfU0VMX0dQSU8sIEdQSU9GX09VVF9JTklUX0hJR0gsCisJCQkiZGlzcGxheV9zZWwiKTsKKwlpZiAocikKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBkaXNwbGF5X3NlbCBHUElPXG4iLCBfX2Z1bmNfXyk7CisKKwlzZHA0NDMwX2xjZF9pbml0KCk7CiAJc2RwNDQzMF9oZG1pX211eF9pbml0KCk7CisJc2RwNDQzMF9waWNvZGxwX2luaXQoKTsKIAlvbWFwX2Rpc3BsYXlfaW5pdCgmc2RwNDQzMF9kc3NfZGF0YSk7CiB9CiAKQEAgLTgwMiwxMyArOTUxLDExIEBACiAJCXBhY2thZ2UgPSBPTUFQX1BBQ0tBR0VfQ0JMOwogCW9tYXA0X211eF9pbml0KGJvYXJkX211eCwgTlVMTCwgcGFja2FnZSk7CiAKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IHNkcDQ0MzBfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHNkcDQ0MzBfY29uZmlnKTsKLQogCW9tYXA0X2kyY19pbml0KCk7CiAJb21hcF9zZmg3NzQxcHJveF9pbml0KCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2RwNDQzMF9kZXZpY2VzLCBBUlJBWV9TSVpFKHNkcDQ0MzBfZGV2aWNlcykpOwogCWJvYXJkX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJb21hcDRfc2RwNDQzMF93aWZpX2luaXQoKTsKIAlvbWFwNF90d2w2MDMwX2hzbW1jX2luaXQobW1jKTsKIApAQCAtODMwLDE4ICs5NzcsMTIgQEAKIAlvbWFwXzQ0MzBzZHBfZGlzcGxheV9pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwXzQ0MzBzZHBfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDJfc2V0X2dsb2JhbHNfNDQzeCgpOwotCW9tYXA0NHh4X21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQXzQ0MzBTRFAsICJPTUFQNDQzMCA0NDMwU0RQIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTYW50b3NoIFNoaWxpbWthciAtIFRleGFzIEluc3RydW1lbnRzIEluYyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBvbWFwXzQ0MzBzZHBfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcF80NDMwc2RwX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwNF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwNDQzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF80NDMwc2RwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwNF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3Y3JhbmUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3Y3JhbmUuYwppbmRleCA5MzNlOTM1Li43ODM0NTM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2NyYW5lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdjcmFuZS5jCkBAIC00NywxMiArNDcsNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgYW0zNTE3X2NyYW5lX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdXNiaHNfb21hcF9ib2FyZF9kYXRhIHVzYmhzX2JkYXRhIF9faW5pdGRhdGEgPSB7CiAJLnBvcnRfbW9kZVswXSA9IE9NQVBfRUhDSV9QT1JUX01PREVfUEhZLAogCS5wb3J0X21vZGVbMV0gPSBPTUFQX1VTQkhTX1BPUlRfTU9ERV9VTlVTRUQsCkBAIC03MCw2ICs2NCw3IEBACiAKIAlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAogCW9tYXBfYm9hcmRfY29uZmlnID0gYW0zNTE3X2NyYW5lX2NvbmZpZzsKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShhbTM1MTdfY3JhbmVfY29uZmlnKTsKQEAgLTk4LDEwICs5MywxMCBAQAogfQogCiBNQUNISU5FX1NUQVJUKENSQU5FQk9BUkQsICJBTTM1MTcvMDUgQ1JBTkVCT0FSRCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IGFtMzUxN19jcmFuZV9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gYW0zNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGFtMzUxN19jcmFuZV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYwppbmRleCBmMzAwNmMzLi5kMzE0ZjAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KIAogI2luY2x1ZGUgIm11eC5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKQEAgLTMzMyw4ICszMzQsNyBAQAogCWR2aV9lbmFibGVkID0gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IGFtMzUxN19ldm1fcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IGFtMzUxN19ldm1fcGFuZWxfZGlzYWJsZV9kdmksCiB9OwpAQCAtMzQyLDcgKzM0Miw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBhbTM1MTdfZXZtX2R2aV9kZXZpY2UgPSB7CiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKIAkubmFtZQkJCT0gImR2aSIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJkdmkiLAogCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKIH07CkBAIC0zNjIsMTEgKzM2Miw2IEBACiAvKgogICogQm9hcmQgaW5pdGlhbGl6YXRpb24KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGFtMzUxN19ldm1faW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KIAogc3RhdGljIHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSBtdXNiX2JvYXJkX2RhdGEgPSB7CiAJLmludGVyZmFjZV90eXBlICAgICAgICAgPSBNVVNCX0lOVEVSRkFDRV9VTFBJLApAQCAtNDY5LDYgKzQ2NCw3IEBACiAJYW0zNTE3X2V2bV9pMmNfaW5pdCgpOwogCW9tYXBfZGlzcGxheV9pbml0KCZhbTM1MTdfZXZtX2Rzc19kYXRhKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAKIAkvKiBDb25maWd1cmUgR1BJTyBmb3IgRUhDSSBwb3J0ICovCiAJb21hcF9tdXhfaW5pdF9ncGlvKDU3LCBPTUFQX1BJTl9PVVRQVVQpOwpAQCAtNDkwLDEwICs0ODYsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChPTUFQMzUxN0VWTSwgIk9NQVAzNTE3L0FNMzUxNyBFVk0iKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBhbTM1MTdfZXZtX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBhbTM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gYW0zNTE3X2V2bV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFwb2xsb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCmluZGV4IDcwMjExNzAuLmRlODEzNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYXBvbGxvbi5jCkBAIC00MCw2ICs0MCw5IEBACiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KIAorI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJjb250cm9sLmgiCiAKQEAgLTE0OSwxMSArMTUyLDYgQEAKIAkucmVzb3VyY2UJPSBhcG9sbG9uX3NtYzkxeF9yZXNvdXJjZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhcG9sbG9uX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImFwb2xsb25fbGNkIiwKLQkuaWQJCT0gLTEsCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfbGVkX2NvbmZpZyBhcG9sbG9uX2xlZF9jb25maWdbXSA9IHsKIAl7CiAJCS5jZGV2CT0gewpAQCAtMTkxLDcgKzE4OSw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXBvbGxvbl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmYXBvbGxvbl9vbmVuYW5kX2RldmljZSwKIAkmYXBvbGxvbl9zbWM5MXhfZGV2aWNlLAotCSZhcG9sbG9uX2xjZF9kZXZpY2UsCiAJJmFwb2xsb25fbGVkX2RldmljZSwKIH07CiAKQEAgLTI2NSwxOSArMjYyLDI3IEBACiAJLnBpbnNbMF0JPSA2LAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb25maWcgYXBvbGxvbl9sY2RfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLmN0cmxfbmFtZQk9ICJpbnRlcm5hbCIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgYXBvbGxvbl9wYW5lbF9kYXRhID0geworCS5uYW1lCQkJPSAiYXBvbGxvbiIsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBhcG9sbG9uX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBPTUFQX1RBR19MQ0QsCQkmYXBvbGxvbl9sY2RfY29uZmlnIH0sCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBhcG9sbG9uX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJsY2QiLAorCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDE4LAorCS5kYXRhCQkJPSAmYXBvbGxvbl9wYW5lbF9kYXRhLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfYXBvbGxvbl9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmFwb2xsb25fZHNzX2RldmljZXNbXSA9IHsKKwkmYXBvbGxvbl9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIGFwb2xsb25fZHNzX2RhdGEgPSB7CisJLm51bV9kZXZpY2VzCT0gQVJSQVlfU0laRShhcG9sbG9uX2Rzc19kZXZpY2VzKSwKKwkuZGV2aWNlcwk9IGFwb2xsb25fZHNzX2RldmljZXMsCisJLmRlZmF1bHRfZGV2aWNlCT0gJmFwb2xsb25fbGNkX2RldmljZSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgZ3BpbyBhcG9sbG9uX2dwaW9fbGVkc1tdIF9faW5pdGRhdGEgPSB7CiAJeyBMRUQwX0dQSU8xMywgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiTEVEMCIgfSwgLyogTEVEMCAtIEFBMTAgKi8KQEAgLTMxNCw4ICszMTksNiBAQAogCXUzMiB2OwogCiAJb21hcDI0MjBfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfWkFDKTsKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IGFwb2xsb25fY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGFwb2xsb25fY29uZmlnKTsKIAogCWFwb2xsb25faW5pdF9zbWM5MXgoKTsKIAlhcG9sbG9uX2xlZF9pbml0KCk7CkBAIC0zNDAsMjAgKzM0MywxNiBAQAogCSAqLwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGFwb2xsb25fZGV2aWNlcywgQVJSQVlfU0laRShhcG9sbG9uX2RldmljZXMpKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2Fwb2xsb25fbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDJfc2V0X2dsb2JhbHNfMjQyeCgpOwotCW9tYXAyNDJ4X21hcF9jb21tb25faW8oKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKKwlvbWFwX2Rpc3BsYXlfaW5pdCgmYXBvbGxvbl9kc3NfZGF0YSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9BUE9MTE9OLCAiT01BUDI0eHggQXBvbGxvbiIpCiAJLyogTWFpbnRhaW5lcjogS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcF9hcG9sbG9uX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfYXBvbGxvbl9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDI0MnhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MjBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9hcG9sbG9uX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IDNhZjhhYWIuLmJkMWJjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTI0Miw4ICsyNDMsNyBAQAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxOCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUJPSBjbV90MzVfcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IGNtX3QzNV9wYW5lbF9kaXNhYmxlX2R2aSwKIH07CkBAIC0yNTEsNyArMjUxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGNtX3QzNV9kdmlfZGV2aWNlID0gewogCS5uYW1lCQkJPSAiZHZpIiwKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiB9OwpAQCAtNDcxLDEzICs0NzEsNiBAQAogCW9tYXAzX3BtaWNfaW5pdCgidHBzNjU5MzAiLCAmY21fdDM1X3R3bGRhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY21fdDM1X2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCSAgICAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKIAkvKiBuQ1MgYW5kIElSUSBmb3IgQ00tVDM1IGV0aGVybmV0ICovCkBAIC02MTAsNiArNjAzLDggQEAKIAlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShjbV90MzVfY29uZmlnKTsKIAlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DVVMpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJICAgICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKIAljbV90MzVfaW5pdF9pMmMoKTsKIAlvbWFwX2Fkczc4NDZfaW5pdCgxLCBDTV9UMzVfR1BJT19QRU5ET1dOLCAwLCBOVUxMKTsKIAljbV90MzVfaW5pdF9ldGhlcm5ldCgpOwpAQCAtNjM0LDIwICs2MjksMjAgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTV9UMzUsICJDb21wdWxhYiBDTS1UMzUiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBjbV90MzVfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGNtX3QzNV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKENNX1QzNzMwLCAiQ29tcHVsYWIgQ00tVDM3MzAiKQotCS5ib290X3BhcmFtcyAgICA9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLnJlc2VydmUgICAgICAgID0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8gICAgICAgICA9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseSAgICAgPSBjbV90MzVfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseSAgICAgPSBvbWFwMzYzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycSAgICAgICA9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUgICA9IGNtX3QzNzMwX2luaXQsCiAJLnRpbWVyICAgICAgICAgID0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUxNy5jCmluZGV4IDA1YzcyZjQuLjNmNGRjNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1MTcuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNTE3LmMKQEAgLTI1MSwxMiArMjUxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGNtX3QzNTE3X2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgY21fdDM1MTdfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KLQogI2lmZGVmIENPTkZJR19PTUFQX01VWAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCBib2FyZF9tdXhbXSBfX2luaXRkYXRhID0gewogCS8qIEdQSU8xODYgLSBHcmVlbiBMRUQgKi8KQEAgLTI4OSw2ICsyODMsNyBAQAogewogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCQik7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwogCW9tYXBfYm9hcmRfY29uZmlnID0gY21fdDM1MTdfY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGNtX3QzNTE3X2NvbmZpZyk7CiAJY21fdDM1MTdfaW5pdF9sZWRzKCk7CkBAIC0yOTksMTAgKzI5NCwxMCBAQAogfQogCiBNQUNISU5FX1NUQVJUKENNX1QzNTE3LCAiQ29tcHVsYWIgQ00tVDM1MTciKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUgICAgICAgID0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gY21fdDM1MTdfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IGFtMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBjbV90MzUxN19pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWRldmtpdDgwMDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCmluZGV4IGI2MDAyZWMuLjkwMTU0ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZHZpLmg+CiAKICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgpAQCAtMTM5LDcgKzE0MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgbGNkX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCisJLm5hbWUJCQk9ICJpbm5vbHV4X2F0MDcwdG44MyIsCiAJLnBsYXRmb3JtX2VuYWJsZSAgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2VuYWJsZV9sY2QsCiAJLnBsYXRmb3JtX2Rpc2FibGUgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2Rpc2FibGVfbGNkLAogfTsKQEAgLTE1Miw4ICsxNTMsNyBAQAogCS5waHkuZHBpLmRhdGFfbGluZXMgICAgID0gMjQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlICAgICAgICA9IGRldmtpdDgwMDBfcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZSAgICAgICA9IGRldmtpdDgwMDBfcGFuZWxfZGlzYWJsZV9kdmksCiB9OwpAQCAtMTYxLDcgKzE2MSw3IEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBkZXZraXQ4MDAwX2R2aV9kZXZpY2UgPSB7CiAJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiZHZpIiwKIAkudHlwZSAgICAgICAgICAgICAgICAgICA9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkuZHJpdmVyX25hbWUgICAgICAgICAgICA9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lICAgICAgICAgICAgPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzICAgICA9IDI0LAogfTsKQEAgLTIyNiw3ICsyMjYsNiBAQAogewogCWludCByZXQ7CiAKLQlvbWFwX211eF9pbml0X2dwaW8oMjksIE9NQVBfUElOX0lOUFVUKTsKIAkvKiBncGlvICsgMCBpcyAibW1jMF9jZCIgKGlucHV0L0lSUSkgKi8KIAltbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOwogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKQEAgLTI2Nyw3ICsyNjYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGV2a2l0ODAwMF92cGxsMV9zdXBwbGllc1tdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaTEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaS4wIiksCiB9OwogCiAvKiBWTU1DMSBmb3IgTU1DMSBwaW5zIENNRCwgQ0xLLCBEQVQwLi5EQVQzICgyMCBtQSwgcGx1cyBjYXJkID09IG1heCAyMjAgbUEpICovCkBAIC0zOTcsMTkgKzM5Niw2IEBACiAJfSwKIH07CiAKLQotc3RhdGljIHZvaWQgX19pbml0IGRldmtpdDgwMDBfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAotCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBkZXZraXQ4MDAwX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDNfaW5pdF9pcnEoKTsKLX0KLQogI2RlZmluZSBPTUFQX0RNOTAwMF9CQVNFCTB4MmMwMDAwMDAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWFwX2RtOTAwMF9yZXNvdXJjZXNbXSA9IHsKQEAgLTY0NSw2ICs2MzEsOCBAQAogewogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NVUyk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKIAogCW9tYXBfZG05MDAwX2luaXQoKTsKIApAQCAtNjY3LDExICs2NTUsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChERVZLSVQ4MDAwLCAiT01BUDMgRGV2a2l0ODAwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IGRldmtpdDgwMDBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBkZXZraXQ4MDAwX2luaXRfaXJxLAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gZGV2a2l0ODAwMF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfc2VjdXJlX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYwppbmRleCBhYTFiMGNiLi4zMGE2ZjUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5jCkBAIC0xNDgsMTEgKzE0OCw2IEBACiAJYm9hcmRfbmFuZF9kYXRhLmdwbWNfaXJxID0gT01BUF9HUE1DX0lSUV9CQVNFICsgY3M7CiAJZ3BtY19uYW5kX2luaXQoJmJvYXJkX25hbmRfZGF0YSk7CiB9Ci0jZWxzZQotdm9pZAotX19pbml0IGJvYXJkX25hbmRfaW5pdChzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbmFuZF9wYXJ0cywgdTggbnJfcGFydHMsIHU4IGNzLCBpbnQgbmFuZF90eXBlKQotewotfQogI2VuZGlmIC8qIENPTkZJR19NVERfTkFORF9PTUFQMiB8fCBDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFICovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5oCmluZGV4IGMyNDBhM2YuLmQyNTUwM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmgKQEAgLTI0LDcgKzI0LDI2IEBACiAJaW50IG5yX3BhcnRzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX09NQVAyKSB8fCBcCisJCWRlZmluZWQoQ09ORklHX01URF9OQU5EX09NQVAyX01PRFVMRSkgfHwgXAorCQlkZWZpbmVkKENPTkZJR19NVERfT05FTkFORF9PTUFQMikgfHwgXAorCQlkZWZpbmVkKENPTkZJR19NVERfT05FTkFORF9PTUFQMl9NT0RVTEUpCiBleHRlcm4gdm9pZCBib2FyZF9mbGFzaF9pbml0KHN0cnVjdCBmbGFzaF9wYXJ0aXRpb25zIFtdLAogCQkJCWNoYXIgY2hpcF9zZWxbXVtHUE1DX0NTX05VTV0sIGludCBuYW5kX3R5cGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBib2FyZF9mbGFzaF9pbml0KHN0cnVjdCBmbGFzaF9wYXJ0aXRpb25zIHBhcnRbXSwKKwkJCQljaGFyIGNoaXBfc2VsW11bR1BNQ19DU19OVU1dLCBpbnQgbmFuZF90eXBlKQoreworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgXAorCQlkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpCiBleHRlcm4gdm9pZCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydHMsCiAJCQkJCXU4IG5yX3BhcnRzLCB1OCBjcywgaW50IG5hbmRfdHlwZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGJvYXJkX25hbmRfaW5pdChzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbmFuZF9wYXJ0cywKKwkJCQkJdTggbnJfcGFydHMsIHU4IGNzLCBpbnQgbmFuZF90eXBlKQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZ2VuZXJpYy5jCmluZGV4IDU0ZGI0MWEuLmZiNTVmYTNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYwpAQCAtMSw3NiArMSwxNjUgQEAKIC8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWdlbmVyaWMuYwotICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogICogQXV0aG9yOiBQYXVsIE11bmR0IDxwYXVsLm11bmR0QG5va2lhLmNvbT4KICAqCi0gKiBNb2RpZmllZCBmcm9tIG1hY2gtb21hcC9vbWFwMS9ib2FyZC1nZW5lcmljLmMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KICAqCi0gKiBDb2RlIGZvciBnZW5lcmljIE9NQVAyIGJvYXJkLiBTaG91bGQgd29yayBvbiBtYW55IE9NQVAyIHN5c3RlbXMgd2hlcmUKLSAqIHRoZSBib290bG9hZGVyIHBhc3NlcyB0aGUgYm9hcmQtc3BlY2lmaWMgZGF0YSB0byB0aGUga2VybmVsLgotICogRG8gbm90IHB1dCBhbnkgYm9hcmQgc3BlY2lmaWMgY29kZSB0byB0aGlzIGZpbGU7IGNyZWF0ZSBhIG5ldyBtYWNoaW5lCi0gKiB0eXBlIGlmIHlvdSBuZWVkIGN1c3RvbSBsb3ctbGV2ZWwgaW5pdGlhbGl6YXRpb25zLgorICogTW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwgbWFjaC1vbWFwL29tYXAyL2JvYXJkLWdlbmVyaWMuYyBkaWQgYnkgUGF1bAorICogdG8gc3VwcG9ydCB0aGUgT01BUDIrIGRldmljZSB0cmVlIGJvYXJkcyB3aXRoIGFuIHVuaXF1ZSBib2FyZCBmaWxlLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KKyNpbmNsdWRlIDxtYWNoL29tYXA0LWNvbW1vbi5oPgorI2luY2x1ZGUgImNvbW1vbi1ib2FyZC1kZXZpY2VzLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGdlbmVyaWNfY29uZmlnW10gPSB7CisvKgorICogWFhYOiBTdGlsbCBuZWVkZWQgdG8gYm9vdCB1bnRpbCB0aGUgaTJjICYgdHdsIGRyaXZlciBpcyBhZGFwdGVkIHRvCisgKiBkZXZpY2UtdHJlZQorICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhIHNkcDQ0MzBfdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w2MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNjAzMF9JUlFfRU5ELAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2Vhcmx5KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDRfaTJjX2luaXQodm9pZCkKIHsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7CisJb21hcDRfcG1pY19pbml0KCJ0d2w2MDMwIiwgJnNkcDQ0MzBfdHdsZGF0YSk7CiB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCitzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBiZWFnbGVfdHdsZGF0YSA9IHsKKwkuaXJxX2Jhc2UJPSBUV0w0MDMwX0lSUV9CQVNFLAorCS5pcnFfZW5kCT0gVFdMNDAzMF9JUlFfRU5ELAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2kyY19pbml0KHZvaWQpCit7CisJb21hcDNfcG1pY19pbml0KCJ0d2w0MDMwIiwgJmJlYWdsZV90d2xkYXRhKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvbWFwX2R0X21hdGNoX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksb21hcC1pbmZyYSIsIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpbnRjX21hdGNoW10gX19pbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLG9tYXAzLWludGMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hOS1naWMiLCB9LAorCXsgfQorfTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0KHZvaWQpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGludGNfbWF0Y2gpOworCWlmIChub2RlKQorCQlpcnFfZG9tYWluX2FkZF9zaW1wbGUobm9kZSwgMCk7CisKIAlvbWFwX3NlcmlhbF9pbml0KCk7Ci0Jb21hcF9ib2FyZF9jb25maWcgPSBnZW5lcmljX2NvbmZpZzsKLQlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShnZW5lcmljX2NvbmZpZyk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CisKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvbWFwX2R0X21hdGNoX3RhYmxlLCBOVUxMLCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19tYXBfaW8odm9pZCkKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAorc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X2luaXQodm9pZCkKIHsKLQlpZiAoY3B1X2lzX29tYXAyNDJ4KCkpIHsKLQkJb21hcDJfc2V0X2dsb2JhbHNfMjQyeCgpOwotCQlvbWFwMjQyeF9tYXBfY29tbW9uX2lvKCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0M3goKSkgewotCQlvbWFwMl9zZXRfZ2xvYmFsc18yNDN4KCk7Ci0JCW9tYXAyNDN4X21hcF9jb21tb25faW8oKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCW9tYXAyX3NldF9nbG9iYWxzXzN4eHgoKTsKLQkJb21hcDM0eHhfbWFwX2NvbW1vbl9pbygpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJb21hcDJfc2V0X2dsb2JhbHNfNDQzeCgpOwotCQlvbWFwNDR4eF9tYXBfY29tbW9uX2lvKCk7Ci0JfQorCW9tYXA0X2kyY19pbml0KCk7CisJb21hcF9nZW5lcmljX2luaXQoKTsKIH0KKyNlbmRpZgogCi0vKiBYWFggVGhpcyBtYWNoaW5lIGVudHJ5IG5hbWUgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KLU1BQ0hJTkVfU1RBUlQoT01BUF9HRU5FUklDLCAiR2VuZXJpYyBPTUFQMjR4eCIpCi0JLyogTWFpbnRhaW5lcjogUGF1bCBNdW5kdCA8cGF1bC5tdW5kdEBub2tpYS5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX2luaXQodm9pZCkKK3sKKwlvbWFwM19pMmNfaW5pdCgpOworCW9tYXBfZ2VuZXJpY19pbml0KCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NPQ19PTUFQMjQyMCkKK3N0YXRpYyBjb25zdCBjaGFyICpvbWFwMjQyeF9ib2FyZHNfY29tcGF0W10gX19pbml0ZGF0YSA9IHsKKwkidGksb21hcDI0MjAiLAorCU5VTEwsCit9OworCitEVF9NQUNISU5FX1NUQVJUKE9NQVAyNDJYX0RULCAiR2VuZXJpYyBPTUFQMjQyMCAoRmxhdHRlbmVkIERldmljZSBUcmVlKSIpCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBvbWFwX2dlbmVyaWNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcF9nZW5lcmljX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwMjQyeF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMjQyMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2dlbmVyaWNfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAorCS5kdF9jb21wYXQJPSBvbWFwMjQyeF9ib2FyZHNfY29tcGF0LAogTUFDSElORV9FTkQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU09DX09NQVAyNDMwKQorc3RhdGljIGNvbnN0IGNoYXIgKm9tYXAyNDN4X2JvYXJkc19jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJ0aSxvbWFwMjQzMCIsCisJTlVMTCwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoT01BUDI0M1hfRFQsICJHZW5lcmljIE9NQVAyNDMwIChGbGF0dGVuZWQgRGV2aWNlIFRyZWUpIikKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKKwkubWFwX2lvCQk9IG9tYXAyNDN4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDMwX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAorCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCisJLmR0X2NvbXBhdAk9IG9tYXAyNDN4X2JvYXJkc19jb21wYXQsCitNQUNISU5FX0VORAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQorc3RhdGljIGNvbnN0IGNoYXIgKm9tYXAzX2JvYXJkc19jb21wYXRbXSBfX2luaXRkYXRhID0geworCSJ0aSxvbWFwMyIsCisJTlVMTCwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoT01BUDNfRFQsICJHZW5lcmljIE9NQVAzIChGbGF0dGVuZWQgRGV2aWNlIFRyZWUpIikKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKKwkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKKwkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAzNDMwX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXAzX2luaXQsCisJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKKwkuZHRfY29tcGF0CT0gb21hcDNfYm9hcmRzX2NvbXBhdCwKK01BQ0hJTkVfRU5ECisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDQpCitzdGF0aWMgY29uc3QgY2hhciAqb21hcDRfYm9hcmRzX2NvbXBhdFtdIF9faW5pdGRhdGEgPSB7CisJInRpLG9tYXA0IiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChPTUFQNF9EVCwgIkdlbmVyaWMgT01BUDQgKEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSkiKQorCS5hdGFnX29mZnNldAk9IDB4MTAwLAorCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAorCS5tYXBfaW8JCT0gb21hcDRfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDQ0MzBfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXA0X2luaXQsCisJLnRpbWVyCQk9ICZvbWFwNF90aW1lciwKKwkuZHRfY29tcGF0CT0gb21hcDRfYm9hcmRzX2NvbXBhdCwKK01BQ0hJTkVfRU5ECisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwppbmRleCA0NWRlMmIzLi44YjM1MWQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNSwyMSArMjUsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9ib2FyZC5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+Ci0jaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KICNpbmNsdWRlIDxwbGF0L21lbmVsYXVzLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KIAorI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJjb250cm9sLmgiCiAKQEAgLTQ4LDEwICs1MCw4IEBACiAKICNkZWZpbmUgSDRfRVRIUl9HUElPX0lSUQkJOTIKIAotc3RhdGljIHVuc2lnbmVkIGludCByb3dfZ3Bpb3NbNl0gPSB7IDg4LCA4OSwgMTI0LCAxMSwgNiwgOTYgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29sX2dwaW9zWzddID0geyA5MCwgOTEsIDEwMCwgMzYsIDEyLCA5NywgOTggfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoNF9rZXltYXBbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9NQVRSSVgpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX01BVFJJWF9NT0RVTEUpCitzdGF0aWMgY29uc3QgdWludDMyX3QgYm9hcmRfbWF0cml4X2tleXNbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0xFRlQpLAogCUtFWSgxLCAwLCBLRVlfUklHSFQpLAogCUtFWSgyLCAwLCBLRVlfQSksCkBAIC04NCw2ICs4NCw3MSBAQAogCUtFWSg0LCA1LCBLRVlfRU5URVIpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtYXRyaXhfa2V5bWFwX2RhdGEgYm9hcmRfa2V5bWFwX2RhdGEgPSB7CisJLmtleW1hcAkJCT0gYm9hcmRfbWF0cml4X2tleXMsCisJLmtleW1hcF9zaXplCQk9IEFSUkFZX1NJWkUoYm9hcmRfbWF0cml4X2tleXMpLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBib2FyZF9rZXlwYWRfcm93X2dwaW9zW10gPSB7CisJODgsIDg5LCAxMjQsIDExLCA2LCA5NgorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBib2FyZF9rZXlwYWRfY29sX2dwaW9zW10gPSB7CisJOTAsIDkxLCAxMDAsIDM2LCAxMiwgOTcsIDk4Cit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXlwYWRfcGxhdGZvcm1fZGF0YSBib2FyZF9rZXlwYWRfcGxhdGZvcm1fZGF0YSA9IHsKKwkua2V5bWFwX2RhdGEJPSAmYm9hcmRfa2V5bWFwX2RhdGEsCisJLnJvd19ncGlvcwk9IGJvYXJkX2tleXBhZF9yb3dfZ3Bpb3MsCisJLm51bV9yb3dfZ3Bpb3MJPSBBUlJBWV9TSVpFKGJvYXJkX2tleXBhZF9yb3dfZ3Bpb3MpLAorCS5jb2xfZ3Bpb3MJPSBib2FyZF9rZXlwYWRfY29sX2dwaW9zLAorCS5udW1fY29sX2dwaW9zCT0gQVJSQVlfU0laRShib2FyZF9rZXlwYWRfY29sX2dwaW9zKSwKKwkuYWN0aXZlX2xvdwk9IDEsCisKKwkuZGVib3VuY2VfbXMJCT0gMjAsCisJLmNvbF9zY2FuX2RlbGF5X3VzCT0gNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJvYXJkX2tleWJvYXJkID0geworCS5uYW1lCT0gIm1hdHJpeC1rZXlwYWQiLAorCS5pZAk9IC0xLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJvYXJkX2tleXBhZF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9Oworc3RhdGljIHZvaWQgX19pbml0IGJvYXJkX21rcF9pbml0KHZvaWQpCit7CisJb21hcF9tdXhfaW5pdF9ncGlvKDg4LCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwlvbWFwX211eF9pbml0X2dwaW8oODksIE9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOworCW9tYXBfbXV4X2luaXRfZ3BpbygxMjQsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJtY2JzcDJfZHIuZ3Bpb18xMSIsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOworCWlmIChvbWFwX2hhc19tZW5lbGF1cygpKSB7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2ExNC5ncGlvMCIsCisJCQlPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoInZseW5xX3J4MC5ncGlvXzE1IiwgMCk7CisJCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzk4IiwgMCk7CisJCWJvYXJkX2tleXBhZF9yb3dfZ3Bpb3NbNV0gPSAwOworCQlib2FyZF9rZXlwYWRfY29sX2dwaW9zWzJdID0gMTU7CisJCWJvYXJkX2tleXBhZF9jb2xfZ3Bpb3NbNl0gPSAxODsKKwl9IGVsc2UgeworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185NiIsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX1BVTExfVVApOworCQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb18xMDAiLCAwKTsKKwkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTgiLCAwKTsKKwl9CisJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTAiLCAwKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185MSIsIDApOworCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzM2IiwgMCk7CisJb21hcF9tdXhfaW5pdF9zaWduYWwoIm1jYnNwMl9jbGt4LmdwaW9fMTIiLCAwKTsKKwlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185NyIsIDApOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZib2FyZF9rZXlib2FyZCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGJvYXJkX21rcF9pbml0KHZvaWQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGg0X3BhcnRpdGlvbnNbXSA9IHsKIAkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCiAJewpAQCAtMTM1LDM5ICsyMDAsMzIgQEAKIAkucmVzb3VyY2UJPSAmaDRfZmxhc2hfcmVzb3VyY2UsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBoNF9rZXltYXBfZGF0YSA9IHsKLQkua2V5bWFwCQk9IGg0X2tleW1hcCwKLQkua2V5bWFwX3NpemUJPSBBUlJBWV9TSVpFKGg0X2tleW1hcCksCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfa3BfcGxhdGZvcm1fZGF0YSBoNF9rcF9kYXRhID0gewotCS5yb3dzCQk9IDYsCi0JLmNvbHMJCT0gNywKLQkua2V5bWFwX2RhdGEJPSAmaDRfa2V5bWFwX2RhdGEsCi0JLnJlcAkJPSB0cnVlLAotCS5yb3dfZ3Bpb3MgCT0gcm93X2dwaW9zLAotCS5jb2xfZ3Bpb3MgCT0gY29sX2dwaW9zLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDRfa3BfZGV2aWNlID0gewotCS5uYW1lCQk9ICJvbWFwLWtleXBhZCIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZoNF9rcF9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoNF9sY2RfZGV2aWNlID0gewotCS5uYW1lCQk9ICJsY2RfaDQiLAotCS5pZAkJPSAtMSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpoNF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmaDRfZmxhc2hfZGV2aWNlLAotCSZoNF9rcF9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgaDRfcGFuZWxfZGF0YSA9IHsKKwkubmFtZQkJCT0gImg0IiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGg0X2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJsY2QiLAorCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDE2LAorCS5kYXRhCQkJPSAmaDRfcGFuZWxfZGF0YSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpoNF9kc3NfZGV2aWNlc1tdID0gewogCSZoNF9sY2RfZGV2aWNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIGg0X2Rzc19kYXRhID0geworCS5udW1fZGV2aWNlcwk9IEFSUkFZX1NJWkUoaDRfZHNzX2RldmljZXMpLAorCS5kZXZpY2VzCT0gaDRfZHNzX2RldmljZXMsCisJLmRlZmF1bHRfZGV2aWNlCT0gJmg0X2xjZF9kZXZpY2UsCit9OworCiAvKiAyNDIwIFN5c2Jvb3Qgc2V0dXAgKDI0MzAgaXMgZGlmZmVyZW50KSAqLwogc3RhdGljIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQogewpAQCAtMjcxLDEwICszMjksNiBAQAogCWg0X2ZsYXNoX3Jlc291cmNlLmVuZAk9IGJhc2UgKyBTWl82NE0gLSAxOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBoNF9sY2RfY29uZmlnIF9faW5pdGRhdGEgPSB7Ci0JLmN0cmxfbmFtZQk9ICJpbnRlcm5hbCIsCi19OwotCiBzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBoNF91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CiAJLyogUzEuMTAgT0ZGIC0tIHVzYiAiZG93bmxvYWQgcG9ydCIKIAkgKiB1c2IwIHN3aXRjaGVkIHRvIE1pbmktQiBwb3J0IGFuZCBpc3AxMTA1IHRyYW5zY2VpdmVyOwpAQCAtMjg2LDIxICszNDAsNiBAQAogCS5obWNfbW9kZQk9IDB4MDAsCQkvKiAwOmRldnxvdGcgMTpkaXNhYmxlIDI6ZGlzYWJsZSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDRfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKLQl7IE9NQVBfVEFHX0xDRCwJCSZoNF9sY2RfY29uZmlnIH0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9oNF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9oNF9pbml0X2lycSh2b2lkKQotewotCW9tYXAyX2luaXRfaXJxKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIG0yNGMwMSA9IHsKIAkuYnl0ZV9sZW4JPSBTWl8xSyAvIDgsCiAJLnBhZ2Vfc2l6ZQk9IDE2LApAQCAtMzMxLDYyICszNzAsMzIgQEAKIHsKIAlvbWFwMjQyMF9tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9aQUYpOwogCi0Jb21hcF9ib2FyZF9jb25maWcgPSBoNF9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoaDRfY29uZmlnKTsKLQogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBzZXJpYWwgcG9ydHMgYXJlIG11eGVkIG9uIGF0IHRoaXMgcG9pbnQuCiAJICogWW91IGhhdmUgdG8gbXV4IHRoZW0gb2ZmIGluIGRldmljZSBkcml2ZXJzIGxhdGVyIG9uCiAJICogaWYgbm90IG5lZWRlZC4KIAkgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX09NQVApIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX09NQVBfTU9EVUxFKQotCW9tYXBfbXV4X2luaXRfZ3Bpbyg4OCwgT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0Jb21hcF9tdXhfaW5pdF9ncGlvKDg5LCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKLQlvbWFwX211eF9pbml0X2dwaW8oMTI0LCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKLQlvbWFwX211eF9pbml0X3NpZ25hbCgibWNic3AyX2RyLmdwaW9fMTEiLCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKLQlpZiAob21hcF9oYXNfbWVuZWxhdXMoKSkgewotCQlvbWFwX211eF9pbml0X3NpZ25hbCgic2RyY19hMTQuZ3BpbzAiLAotCQkJT01BUF9QVUxMX0VOQSB8IE9NQVBfUFVMTF9VUCk7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ2bHlucV9yeDAuZ3Bpb18xNSIsIDApOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb185OCIsIDApOwotCQlyb3dfZ3Bpb3NbNV0gPSAwOwotCQljb2xfZ3Bpb3NbMl0gPSAxNTsKLQkJY29sX2dwaW9zWzZdID0gMTg7Ci0JfSBlbHNlIHsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTYiLCBPTUFQX1BVTExfRU5BIHwgT01BUF9QVUxMX1VQKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fMTAwIiwgMCk7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzk4IiwgMCk7Ci0JfQotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJncGlvXzkwIiwgMCk7Ci0Jb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTEiLCAwKTsKLQlvbWFwX211eF9pbml0X3NpZ25hbCgiZ3Bpb18zNiIsIDApOwotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJtY2JzcDJfY2xreC5ncGlvXzEyIiwgMCk7Ci0Jb21hcF9tdXhfaW5pdF9zaWduYWwoImdwaW9fOTciLCAwKTsKLSNlbmRpZgotCisJYm9hcmRfbWtwX2luaXQoKTsKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygxLCBoNF9pMmNfYm9hcmRfaW5mbywKIAkJCUFSUkFZX1NJWkUoaDRfaTJjX2JvYXJkX2luZm8pKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGg0X2RldmljZXMsIEFSUkFZX1NJWkUoaDRfZGV2aWNlcykpOwogCW9tYXAyX3VzYmZzX2luaXQoJmg0X3VzYl9jb25maWcpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAloNF9pbml0X2ZsYXNoKCk7Ci19CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2g0X21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzI0MngoKTsKLQlvbWFwMjQyeF9tYXBfY29tbW9uX2lvKCk7CisJb21hcF9kaXNwbGF5X2luaXQoJmg0X2Rzc19kYXRhKTsKIH0KIAogTUFDSElORV9TVEFSVChPTUFQX0g0LCAiT01BUDI0MjAgSDQgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBvbWFwX2g0X21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfaDRfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbWFwX2g0X2luaXRfaXJxLAorCS5tYXBfaW8JCT0gb21hcDI0MnhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MjBfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF9oNF9pbml0LAogCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCmluZGV4IDM1YmU3NzguLmQwYTNmNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KICNpbmNsdWRlIDxwbGF0L29uZW5hbmQuaD4KIAogI2luY2x1ZGUgIm11eC5oIgpAQCAtNDU1LDE2ICs0NTUsMTYgQEAKIAlncGlvX2RpcmVjdGlvbl9vdXRwdXQoSUdFUDJfR1BJT19EVklfUFVQLCAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAorc3RhdGljIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSBkdmlfcGFuZWwgPSB7CiAJLnBsYXRmb3JtX2VuYWJsZQk9IGlnZXAyX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBpZ2VwMl9kaXNhYmxlX2R2aSwKKwkuaTJjX2J1c19udW0gPSAzLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgaWdlcDJfZHZpX2RldmljZSA9IHsKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAogCS5uYW1lCQkJPSAiZHZpIiwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAogfTsKQEAgLTQ5MSwxMyArNDkxLDYgQEAKIAkmaWdlcF92d2xhbl9kZXZpY2UsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaWdlcF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG02NWt4eHh4YW1fc2RyY19wYXJhbXMsCi0JCQkJICBtNjVreHh4eGFtX3NkcmNfcGFyYW1zKTsKLX0KLQogc3RhdGljIGludCBpZ2VwMl9rZXltYXBbXSA9IHsKIAlLRVkoMCwgMCwgS0VZX0xFRlQpLAogCUtFWSgwLCAxLCBLRVlfUklHSFQpLApAQCAtNjUwLDYgKzY0Myw4IEBACiAJaWdlcF9pMmNfaW5pdCgpOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGlnZXBfZGV2aWNlcywgQVJSQVlfU0laRShpZ2VwX2RldmljZXMpKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobTY1a3h4eHhhbV9zZHJjX3BhcmFtcywKKwkJCQkgIG02NWt4eHh4YW1fc2RyY19wYXJhbXMpOwogCXVzYl9tdXNiX2luaXQoTlVMTCk7CiAKIAlpZ2VwX2ZsYXNoX2luaXQoKTsKQEAgLTY3MiwyMCArNjY3LDIwIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSUdFUDAwMjAsICJJR0VQIHYyIGJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gaWdlcF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gaWdlcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKElHRVAwMDMwLCAiSUdFUCBPTUFQMyBtb2R1bGUiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBpZ2VwX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBpZ2VwX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCmluZGV4IDIxODc2NGMuLmUxNzlkYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1sZHAuYwpAQCAtMTAsNyArMTAsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMzQsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCiAjaW5jbHVkZSA8cGxhdC9tY3NwaS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgpAQCAtNDQsNiArNDQsOSBAQAogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncG1jLXNtc2M5MTF4Lmg+CiAKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1nZW5lcmljLWRwaS5oPgorCiAjaW5jbHVkZSAiYm9hcmQtZmxhc2guaCIKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJoc21tYy5oIgpAQCAtMTgwLDI5ICsxODMsMTAyIEBACiAJZ3BtY19zbXNjOTExeF9pbml0KCZzbXNjOTExeF9jZmcpOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZHBfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPSAibGRwX2xjZCIsCi0JLmlkCQk9IC0xLAotfTsKKy8qIExDRCAqLwogCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBsZHBfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAotfTsKK3N0YXRpYyBpbnQgbGRwX2JhY2tsaWdodF9ncGlvOworc3RhdGljIGludCBsZHBfbGNkX2VuYWJsZV9ncGlvOwogCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBsZHBfY29uZmlnW10gX19pbml0ZGF0YSA9IHsKLQl7IE9NQVBfVEFHX0xDRCwJCSZsZHBfbGNkX2NvbmZpZyB9LAotfTsKKyNkZWZpbmUgTENEX1BBTkVMX1JFU0VUX0dQSU8JCTU1CisjZGVmaW5lIExDRF9QQU5FTF9RVkdBX0dQSU8JCTU2CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2xkcF9pbml0X2Vhcmx5KHZvaWQpCitzdGF0aWMgaW50IGxkcF9wYW5lbF9lbmFibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7CisJaWYgKGdwaW9faXNfdmFsaWQobGRwX2xjZF9lbmFibGVfZ3BpbykpCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChsZHBfbGNkX2VuYWJsZV9ncGlvLCAxKTsKKwlpZiAoZ3Bpb19pc192YWxpZChsZHBfYmFja2xpZ2h0X2dwaW8pKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobGRwX2JhY2tsaWdodF9ncGlvLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsZHBfcGFuZWxfZGlzYWJsZV9sY2Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWlmIChncGlvX2lzX3ZhbGlkKGxkcF9sY2RfZW5hYmxlX2dwaW8pKQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobGRwX2xjZF9lbmFibGVfZ3BpbywgMCk7CisJaWYgKGdwaW9faXNfdmFsaWQobGRwX2JhY2tsaWdodF9ncGlvKSkKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxkcF9iYWNrbGlnaHRfZ3BpbywgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBsZHBfcGFuZWxfZGF0YSA9IHsKKwkubmFtZQkJCT0gIm5lY19ubDI0MzJkcjIyLTExYiIsCisJLnBsYXRmb3JtX2VuYWJsZQk9IGxkcF9wYW5lbF9lbmFibGVfbGNkLAorCS5wbGF0Zm9ybV9kaXNhYmxlCT0gbGRwX3BhbmVsX2Rpc2FibGVfbGNkLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgbGRwX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJsY2QiLAorCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDE4LAorCS5kYXRhCQkJPSAmbGRwX3BhbmVsX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqbGRwX2Rzc19kZXZpY2VzW10gPSB7CisJJmxkcF9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIGxkcF9kc3NfZGF0YSA9IHsKKwkubnVtX2RldmljZXMJPSBBUlJBWV9TSVpFKGxkcF9kc3NfZGV2aWNlcyksCisJLmRldmljZXMJPSBsZHBfZHNzX2RldmljZXMsCisJLmRlZmF1bHRfZGV2aWNlCT0gJmxkcF9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGxkcF9kaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXN0YXRpYyBzdHJ1Y3QgZ3BpbyBncGlvc1tdIF9faW5pdGRhdGEgPSB7CisJCXtMQ0RfUEFORUxfUkVTRVRfR1BJTywgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkxDRCBSRVNFVCJ9LAorCQl7TENEX1BBTkVMX1FWR0FfR1BJTywgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkxDRCBRVkdBIn0sCisJfTsKKworCXIgPSBncGlvX3JlcXVlc3RfYXJyYXkoZ3Bpb3MsIEFSUkFZX1NJWkUoZ3Bpb3MpKTsKKwlpZiAocikgeworCQlwcl9lcnIoIkNhbm5vdCByZXF1ZXN0IExDRCBHUElPcywgZXJyb3IgJWRcbiIsIHIpOworCQlyZXR1cm47CisJfQorCisJb21hcF9kaXNwbGF5X2luaXQoJmxkcF9kc3NfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbGRwX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCit7CisJaW50IHI7CisKKwlzdHJ1Y3QgZ3BpbyBncGlvc1tdID0geworCQl7Z3BpbyArIDcgLCBHUElPRl9PVVRfSU5JVF9MT1csICJMQ0QgRU5BQkxFIn0sCisJCXtncGlvICsgMTUsIEdQSU9GX09VVF9JTklUX0xPVywgIkxDRCBCQUNLTElHSFQifSwKKwl9OworCisJciA9IGdwaW9fcmVxdWVzdF9hcnJheShncGlvcywgQVJSQVlfU0laRShncGlvcykpOworCWlmIChyKSB7CisJCXByX2VycigiQ2Fubm90IHJlcXVlc3QgTENEIEdQSU9zLCBlcnJvciAlZFxuIiwgcik7CisJCWxkcF9iYWNrbGlnaHRfZ3BpbyA9IC1FSU5WQUw7CisJCWxkcF9sY2RfZW5hYmxlX2dwaW8gPSAtRUlOVkFMOworCQlyZXR1cm4gcjsKKwl9CisKKwlsZHBfYmFja2xpZ2h0X2dwaW8gPSBncGlvICsgMTU7CisJbGRwX2xjZF9lbmFibGVfZ3BpbyA9IGdwaW8gKyA3OworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgbGRwX2dwaW9fZGF0YSA9IHsKIAkuZ3Bpb19iYXNlCT0gT01BUF9NQVhfR1BJT19MSU5FUywKIAkuaXJxX2Jhc2UJPSBUV0w0MDMwX0dQSU9fSVJRX0JBU0UsCiAJLmlycV9lbmQJPSBUV0w0MDMwX0dQSU9fSVJRX0VORCwKKwkuc2V0dXAJCT0gbGRwX3R3bF9ncGlvX3NldHVwLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxkcF92bW1jMV9zdXBwbHlbXSA9IHsKQEAgLTI0NCwxMCArMzIwLDMxIEBACiAJLmNvbnN1bWVyX3N1cHBsaWVzCQk9IGxkcF92YXV4MV9zdXBwbGllcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBsZHBfdnBsbDJfc3VwcGxpZXNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kxIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgbGRwX3ZwbGwyID0geworCS5jb25zdHJhaW50cyA9IHsKKwkJLm5hbWUJCQk9ICJWRFZJIiwKKwkJLm1pbl91VgkJCT0gMTgwMDAwMCwKKwkJLm1heF91VgkJCT0gMTgwMDAwMCwKKwkJLmFwcGx5X3VWCQk9IHRydWUsCisJCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCisJCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKKwkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRwX3ZwbGwyX3N1cHBsaWVzKSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBsZHBfdnBsbDJfc3VwcGxpZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBsZHBfdHdsZGF0YSA9IHsKIAkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KIAkudm1tYzEJCT0gJmxkcF92bW1jMSwKIAkudmF1eDEJCT0gJmxkcF92YXV4MSwKKwkudnBsbDIJCT0gJmxkcF92cGxsMiwKIAkuZ3BpbwkJPSAmbGRwX2dwaW9fZGF0YSwKIAkua2V5cGFkCQk9ICZsZHBfa3BfdHdsNDAzMF9kYXRhLAogfTsKQEAgLTI3Myw3ICszNzAsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmxkcF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmbGRwX2xjZF9kZXZpY2UsCiAJJmxkcF9ncGlvX2tleXNfZGV2aWNlLAogfTsKIApAQCAtMzE4LDI1ICs0MTQsMjUgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2xkcF9pbml0KHZvaWQpCiB7CiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IGxkcF9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUobGRwX2NvbmZpZyk7CiAJbGRwX2luaXRfc21zYzkxMXgoKTsKIAlvbWFwX2kyY19pbml0KCk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMobGRwX2RldmljZXMsIEFSUkFZX1NJWkUobGRwX2RldmljZXMpKTsKIAlvbWFwX2Fkczc4NDZfaW5pdCgxLCA1NCwgMzEwLCBOVUxMKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJdXNiX211c2JfaW5pdChOVUxMKTsKIAlib2FyZF9uYW5kX2luaXQobGRwX25hbmRfcGFydGl0aW9ucywKIAkJQVJSQVlfU0laRShsZHBfbmFuZF9wYXJ0aXRpb25zKSwgWk9PTV9OQU5EX0NTLCAwKTsKIAogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKKwlsZHBfZGlzcGxheV9pbml0KCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUF9MRFAsICJPTUFQIExEUCBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfbGRwX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX2xkcF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCmluZGV4IGUxMWYwYzUuLmU5ZDVmNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCkBAIC02MTYsMTggKzYxNiw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBuOHgwX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzI0MngoKTsKLQlvbWFwMjQyeF9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBuOHgwX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKIAkvKiBJMlMgY29kZWMgcG9ydCBwaW5zIGZvciBNY0JTUCBibG9jayAqLwpAQCAtNjg5LDM2ICs2NzcsMzcgQEAKIAkJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMiwgbjgxMF9pMmNfYm9hcmRfaW5mb18yLAogCQkJCQlBUlJBWV9TSVpFKG44MTBfaTJjX2JvYXJkX2luZm9fMikpOwogCWJvYXJkX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJZ3BtY19vbmVuYW5kX2luaXQoYm9hcmRfb25lbmFuZF9kYXRhKTsKIAluOHgwX21tY19pbml0KCk7CiAJbjh4MF91c2JfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE5PS0lBX044MDAsICJOb2tpYSBOODAwIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gbjh4MF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBuOHgwX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwMjQyeF9tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMjQyMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAyX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBuOHgwX2luaXRfbWFjaGluZSwKIAkudGltZXIJCT0gJm9tYXAyX3RpbWVyLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChOT0tJQV9OODEwLCAiTm9raWEgTjgxMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IG44eDBfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gbjh4MF9pbml0X2Vhcmx5LAorCS5tYXBfaW8JCT0gb21hcDI0MnhfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gb21hcDI0MjBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwMl9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gbjh4MF9pbml0X21hY2hpbmUsCiAJLnRpbWVyCQk9ICZvbWFwMl90aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoTk9LSUFfTjgxMF9XSU1BWCwgIk5va2lhIE44MTAgV2lNQVgiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBuOHgwX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG44eDBfaW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXAyNDJ4X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAyNDIwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDJfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG44eDBfaW5pdF9tYWNoaW5lLAogCS50aW1lcgkJPSAmb21hcDJfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKaW5kZXggM2FlMTZiNC4uNGE3MWNiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgpAQCAtMjAzLDE2ICsyMDMsMTYgQEAKIAkJZ3Bpb19zZXRfdmFsdWUoZHNzZGV2LT5yZXNldF9ncGlvLCAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKLQkubmFtZSA9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUgPSBiZWFnbGVfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZSA9IGJlYWdsZV9kaXNhYmxlX2R2aSwKKwkuaTJjX2J1c19udW0gPSAzLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgYmVhZ2xlX2R2aV9kZXZpY2UgPSB7CiAJLnR5cGUgPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCiAJLm5hbWUgPSAiZHZpIiwKLQkuZHJpdmVyX25hbWUgPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZSA9ICJkdmkiLAogCS5kYXRhID0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzID0gMjQsCiAJLnJlc2V0X2dwaW8gPSAtRUlOVkFMLApAQCAtMzc4LDcgKzM3OCw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBvbWFwM19iZWFnbGVfaTJjX2luaXQodm9pZCkKIHsKIAlvbWFwM19wbWljX2dldF9jb25maWcoJmJlYWdsZV90d2xkYXRhLAotCQkJVFdMX0NPTU1PTl9QREFUQV9VU0IgfCBUV0xfQ09NTU9OX1BEQVRBX0FVRElPLAorCQkJVFdMX0NPTU1PTl9QREFUQV9VU0IgfCBUV0xfQ09NTU9OX1BEQVRBX01BREMgfAorCQkJVFdMX0NPTU1PTl9QREFUQV9BVURJTywKIAkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMgfCBUV0xfQ09NTU9OX1JFR1VMQVRPUl9WUExMMik7CiAKIAliZWFnbGVfdHdsZGF0YS52cGxsMi0+Y29uc3RyYWludHMubmFtZSA9ICJWRFZJIjsKQEAgLTQ0NCwyMSArNDQ1LDE1IEBACiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19iZWFnbGVfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAotCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19iZWFnbGVfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwM19pbml0X2lycSgpOwotfQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWFkY19od21vbiA9IHsKKwkubmFtZQk9ICJ0d2w0MDMwX21hZGNfaHdtb24iLAorCS5pZAk9IC0xLAorfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXAzX2JlYWdsZV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmbGVkc19ncGlvLAogCSZrZXlzX2dwaW8sCisJJm1hZGNfaHdtb24sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYmhzX29tYXBfYm9hcmRfZGF0YSB1c2Joc19iZGF0YSBfX2luaXRjb25zdCA9IHsKQEAgLTQ5Myw4ICs0ODgsOCBAQAogCWlmIChjcHVfaXNfb21hcDM2MzAoKSkgewogCQlzdHJ1Y3QgZGV2aWNlICptcHVfZGV2LCAqaXZhX2RldjsKIAotCQltcHVfZGV2ID0gb21hcDJfZ2V0X21wdXNzX2RldmljZSgpOwotCQlpdmFfZGV2ID0gb21hcDJfZ2V0X2l2YV9kZXZpY2UoKTsKKwkJbXB1X2RldiA9IG9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKCJtcHUiKTsKKwkJaXZhX2RldiA9IG9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKCJpdmEiKTsKIAogCQlpZiAoIW1wdV9kZXYgfHwgIWl2YV9kZXYpIHsKIAkJCXByX2VycigiJXM6IEFpZWUuLiBubyBtcHUvZHNwIGRldmljZXM/ICVwICVwXG4iLApAQCAtNTM0LDYgKzUyOSw4IEBACiAJCQlBUlJBWV9TSVpFKG9tYXAzX2JlYWdsZV9kZXZpY2VzKSk7CiAJb21hcF9kaXNwbGF5X2luaXQoJmJlYWdsZV9kc3NfZGF0YSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKIAogCW9tYXBfbXV4X2luaXRfZ3BpbygxNzAsIE9NQVBfUElOX0lOUFVUKTsKIAkvKiBSRVZJU0lUIGxlYXZlIERWSSBwb3dlcmVkIGRvd24gdW50aWwgaXQncyBuZWVkZWQgLi4uICovCkBAIC01NTcsMTEgKzU1NCwxMSBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVAzX0JFQUdMRSwgIk9NQVAzIEJlYWdsZSBCb2FyZCIpCiAJLyogTWFpbnRhaW5lcjogU3llZCBNb2hhbW1lZCBLaGFzaW0gLSBodHRwOi8vYmVhZ2xlYm9hcmQub3JnICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXAzX2JlYWdsZV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXAzX2JlYWdsZV9pbml0X2lycSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzX2JlYWdsZV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfc2VjdXJlX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYwppbmRleCBjNDUyYjNmLi5lYzAwYjJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC00NSw3ICs0Niw3IEBACiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgotI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgogCiAjaW5jbHVkZSAibXV4LmgiCiAjaW5jbHVkZSAic2RyYW0tbWljcm9uLW10NDZoMzJtMzJsZi02LmgiCkBAIC0yNDcsOCArMjQ4LDcgQEAKIAlkdmlfZW5hYmxlZCA9IDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7Ci0JLm5hbWUJCQk9ICJnZW5lcmljIiwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgZHZpX3BhbmVsID0gewogCS5wbGF0Zm9ybV9lbmFibGUJPSBvbWFwM19ldm1fZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IG9tYXAzX2V2bV9kaXNhYmxlX2R2aSwKIH07CkBAIC0yNTYsNyArMjU2LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXAzX2V2bV9kdmlfZGV2aWNlID0gewogCS5uYW1lCQkJPSAiZHZpIiwKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiB9OwpAQCAtNTIwLDEyICs1MjAsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgb21hcDNfZXZtX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfZXZtX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywgTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdXNiaHNfb21hcF9ib2FyZF9kYXRhIHVzYmhzX2JkYXRhIF9faW5pdGRhdGEgPSB7CiAKIAkucG9ydF9tb2RlWzBdID0gT01BUF9VU0JIU19QT1JUX01PREVfVU5VU0VELApAQCAtNjQwLDYgKzYzNCw3IEBACiAJb21hcF9kaXNwbGF5X2luaXQoJm9tYXAzX2V2bV9kc3NfZGF0YSk7CiAKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywgTlVMTCk7CiAKIAkvKiBPTUFQM0VWTSB1c2VzIElTUDE1MDQgcGh5IGFuZCBzbyByZWdpc3RlciBub3AgdHJhbnNjZWl2ZXIgKi8KIAl1c2Jfbm9wX3hjZWl2X3JlZ2lzdGVyKCk7CkBAIC02ODEsMTAgKzY3NiwxMCBAQAogCiBNQUNISU5FX1NUQVJUKE9NQVAzRVZNLCAiT01BUDMgRVZNIikKIAkvKiBNYWludGFpbmVyOiBTeWVkIE1vaGFtbWVkIEtoYXNpbSAtIFRleGFzIEluc3RydW1lbnRzICovCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXAzX2V2bV9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNfZXZtX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNsb2dpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2xvZ2ljLmMKaW5kZXggNzAzYWViNS4uN2MwZjE5MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2xvZ2ljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2xvZ2ljLmMKQEAgLTE4MiwxMiArMTgyLDYgQEAKIAlncG1jX3Ntc2M5MTF4X2luaXQoJmJvYXJkX3Ntc2M5MTF4X2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNsb2dpY19pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKE5VTEwsIE5VTEwpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKQEAgLTIwMCw2ICsxOTQsNyBAQAogCW9tYXAzdG9ycGVkb19maXhfcGJpYXNfdm9sdGFnZSgpOwogCW9tYXAzbG9naWNfaTJjX2luaXQoKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQoTlVMTCwgTlVMTCk7CiAJYm9hcmRfbW1jX2luaXQoKTsKIAlib2FyZF9zbXNjOTExeF9pbml0KCk7CiAKQEAgLTIwOSwxOCArMjA0LDE4IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoT01BUDNfVE9SUEVETywgIkxvZ2ljIE9NQVAzIFRvcnBlZG8gYm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwM2xvZ2ljX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwM2xvZ2ljX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoT01BUDM1MzBfTFZfU09NLCAiT01BUCBMb2dpYyAzNTMwIExWIFNPTSBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXAzbG9naWNfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzbG9naWNfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNwYW5kb3JhLmMKaW5kZXggMDgwZDdiZC4uZjc4MTFmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3BhbmRvcmEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzcGFuZG9yYS5jCkBAIC0zMzUsNyArMzM1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZkZHNfc3VwcGxpZXNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX3NkaSIsICJvbWFwZHNzIiksCiAJUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzcyIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpMSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpLjAiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwYW5kb3JhX3ZjY19sY2Rfc3VwcGx5W10gPSB7CkBAIC01MjUsMTMgKzUyNSw2IEBACiAJfQogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzcGFuZG9yYV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCi0JCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHBhbmRvcmFfd2wxMjUxX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgcGFuZG9yYV93bDEyNTFfcGRhdGE7CkBAIC01OTMsNiArNTg2LDggQEAKIAkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2RldmljZXMpKTsKIAlvbWFwX2Rpc3BsYXlfaW5pdCgmcGFuZG9yYV9kc3NfZGF0YSk7CiAJb21hcF9zZXJpYWxfaW5pdCgpOworCW9tYXBfc2RyY19pbml0KG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMsCisJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKIAlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhvbWFwM3BhbmRvcmFfc3BpX2JvYXJkX2luZm8sCiAJCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9zcGlfYm9hcmRfaW5mbykpOwogCW9tYXBfYWRzNzg0Nl9pbml0KDEsIE9NQVAzX1BBTkRPUkFfVFNfR1BJTywgMCwgTlVMTCk7CkBAIC02MDYsMTAgKzYwMSwxMCBAQAogfQogCiBNQUNISU5FX1NUQVJUKE9NQVAzX1BBTkRPUkEsICJQYW5kb3JhIEhhbmRoZWxkIENvbnNvbGUiKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwM3BhbmRvcmFfaW5pdF9lYXJseSwKKwkuaW5pdF9lYXJseQk9IG9tYXAzNXh4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IG9tYXAzcGFuZG9yYV9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzc3RhbGtlci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYwppbmRleCA4ZTEwNDk4Li5kZGI3ZDY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzc3RhbGtlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNzdGFsa2VyLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWdlbmVyaWMtZHBpLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kdmkuaD4KIAogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CkBAIC0xMDcsMzkgKzEwOCw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IG9tYXAzX3N0YWxrZXJfZW5hYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaWYgKGR2aV9lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGVuYWJsZSBMQ0QsIERWSSBpcyBlbmFibGVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWdwaW9fc2V0X3ZhbHVlKERTU19FTkFCTEVfR1BJTywgMSk7Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX1BBTkVMX0JLTElHSFRfR1BJTywgMSk7Ci0JbGNkX2VuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwM19zdGFsa2VyX2Rpc2FibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlncGlvX3NldF92YWx1ZShEU1NfRU5BQkxFX0dQSU8sIDApOwotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9CS0xJR0hUX0dQSU8sIDApOwotCWxjZF9lbmFibGVkID0gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGxjZF9wYW5lbCA9IHsKLQkubmFtZQkJCT0gImdlbmVyaWMiLAotCS5wbGF0Zm9ybV9lbmFibGUJPSBvbWFwM19zdGFsa2VyX2VuYWJsZV9sY2QsCi0JLnBsYXRmb3JtX2Rpc2FibGUJPSBvbWFwM19zdGFsa2VyX2Rpc2FibGVfbGNkLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugb21hcDNfc3RhbGtlcl9sY2RfZGV2aWNlID0gewotCS5uYW1lCQkJPSAibGNkIiwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKLQkuZGF0YQkJCT0gJmxjZF9wYW5lbCwKLQkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCi0JLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLX07Ci0KIHN0YXRpYyBpbnQgb21hcDNfc3RhbGtlcl9lbmFibGVfdHYoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCXJldHVybiAwOwpAQCAtMTc5LDggKzE0Nyw3IEBACiAJZHZpX2VuYWJsZWQgPSAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDNfc3RhbGtlcl9lbmFibGVfZHZpLAogCS5wbGF0Zm9ybV9kaXNhYmxlCT0gb21hcDNfc3RhbGtlcl9kaXNhYmxlX2R2aSwKIH07CkBAIC0xODgsMTMgKzE1NSwxMiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugb21hcDNfc3RhbGtlcl9kdmlfZGV2aWNlID0gewogCS5uYW1lCQkJPSAiZHZpIiwKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kcml2ZXJfbmFtZQkJPSAiZHZpIiwKIAkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqb21hcDNfc3RhbGtlcl9kc3NfZGV2aWNlc1tdID0gewotCSZvbWFwM19zdGFsa2VyX2xjZF9kZXZpY2UsCiAJJm9tYXAzX3N0YWxrZXJfdHZfZGV2aWNlLAogCSZvbWFwM19zdGFsa2VyX2R2aV9kZXZpY2UsCiB9OwpAQCAtNDI4LDE3ICszOTQsNiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgb21hcDNfc3RhbGtlcl9jb25maWdbXSBfX2luaXRkYXRhID0gewogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3N0YWxrZXJfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3N0YWxrZXJfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwM19pbml0X2lycSgpOwotfQotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb21hcDNfc3RhbGtlcl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkma2V5c19ncGlvLAogfTsKQEAgLTQ3OCw2ICs0MzMsNyBAQAogCW9tYXBfZGlzcGxheV9pbml0KCZvbWFwM19zdGFsa2VyX2Rzc19kYXRhKTsKIAogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLCBOVUxMKTsKIAl1c2JfbXVzYl9pbml0KE5VTEwpOwogCXVzYmhzX2luaXQoJnVzYmhzX2JkYXRhKTsKIAlvbWFwX2Fkczc4NDZfaW5pdCgxLCBPTUFQM19TVEFMS0VSX1RTX0dQSU8sIDMxMCwgTlVMTCk7CkBAIC00OTQsMTAgKzQ1MCwxMCBAQAogCiBNQUNISU5FX1NUQVJUKFNCQzM1MzAsICJPTUFQMyBTVEFMS0VSIikKIAkvKiBNYWludGFpbmVyOiBKYXNvbiBMYW0gLWx6Z0BlbWEtdGVjaC5jb20gKi8KLQkuYm9vdF9wYXJhbXMJCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJCT0gMHgxMDAsCiAJLm1hcF9pbwkJCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CQk9IG9tYXAzX3N0YWxrZXJfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJCT0gb21hcDNfc3RhbGtlcl9pbml0X2lycSwKKwkuaW5pdF9lYXJseQkJPSBvbWFwMzV4eF9pbml0X2Vhcmx5LAorCS5pbml0X2lycQkJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCQk9IG9tYXAzX3N0YWxrZXJfaW5pdCwKIAkudGltZXIJCQk9ICZvbWFwM19zZWN1cmVfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3RvdWNoYm9vay5jCmluZGV4IDg1MmVhMDQuLmEyZDBkMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDN0b3VjaGJvb2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzdG91Y2hib29rLmMKQEAgLTEwNCwxNSArMTA0LDYgQEAKIAl7fQkvKiBUZXJtaW5hdG9yICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwM190b3VjaGJvb2tfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcDN0b3VjaGJvb2tfbGNkIiwKLQkuaWQJCT0gLTEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfbGNkX2NvbmZpZyBvbWFwM190b3VjaGJvb2tfbGNkX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS5jdHJsX25hbWUJPSAiaW50ZXJuYWwiLAotfTsKLQogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHRvdWNoYm9va192bW1jMV9zdXBwbHlbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAogfTsKQEAgLTE2NSwxNCArMTU2LDEyIEBACiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgdG91Y2hib29rX3ZkYWNfc3VwcGx5W10gPSB7CiB7CiAJLnN1cHBseQkJPSAidmRhYyIsCi0JLmRldgkJPSAmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UuZGV2LAogfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB0b3VjaGJvb2tfdmR2aV9zdXBwbHlbXSA9IHsKIHsKIAkuc3VwcGx5CQk9ICJ2ZHZpIiwKLQkuZGV2CQk9ICZvbWFwM190b3VjaGJvb2tfbGNkX2RldmljZS5kZXYsCiB9LAogfTsKIApAQCAtMzE2LDMwICszMDUsMTMgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgb21hcDNfdG91Y2hib29rX2NvbmZpZ1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBPTUFQX1RBR19MQ0QsCQkmb21hcDNfdG91Y2hib29rX2xjZF9jb25maWcgfSwKLX07Ci0KICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKIAl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAogfTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdG91Y2hib29rX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdG91Y2hib29rX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcDNfaW5pdF9pcnEoKTsKLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXAzX3RvdWNoYm9va19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmb21hcDNfdG91Y2hib29rX2xjZF9kZXZpY2UsCiAJJmxlZHNfZ3BpbywKIAkma2V5c19ncGlvLAogfTsKQEAgLTM3Niw4ICszNDgsNiBAQAogc3RhdGljIHZvaWQgX19pbml0IG9tYXAzX3RvdWNoYm9va19pbml0KHZvaWQpCiB7CiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IG9tYXAzX3RvdWNoYm9va19jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUob21hcDNfdG91Y2hib29rX2NvbmZpZyk7CiAKIAlwbV9wb3dlcl9vZmYgPSBvbWFwM190b3VjaGJvb2tfcG93ZXJvZmY7CiAKQEAgLTM4NSw2ICszNTUsOCBAQAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG9tYXAzX3RvdWNoYm9va19kZXZpY2VzLAogCQkJQVJSQVlfU0laRShvbWFwM190b3VjaGJvb2tfZGV2aWNlcykpOwogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAorCQkJCSAgbXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcyk7CiAKIAlvbWFwX211eF9pbml0X2dwaW8oMTcwLCBPTUFQX1BJTl9JTlBVVCk7CiAJLyogUkVWSVNJVCBsZWF2ZSBEVkkgcG93ZXJlZCBkb3duIHVudGlsIGl0J3MgbmVlZGVkIC4uLiAqLwpAQCAtNDA0LDExICszNzYsMTEgQEAKIAogTUFDSElORV9TVEFSVChUT1VDSEJPT0ssICJPTUFQMyB0b3VjaGJvb2sgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IEdyZWdvaXJlIEdlbnRpbCAtIGh0dHA6Ly93d3cuYWx3YXlzaW5ub3ZhdGluZy5jb20gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcDNfdG91Y2hib29rX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gb21hcDNfdG91Y2hib29rX2luaXRfaXJxLAorCS5pbml0X2Vhcmx5CT0gb21hcDM0MzBfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcDNfdG91Y2hib29rX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM19zZWN1cmVfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYwppbmRleCA5YWFhOTYwLi5hOGMyYzQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXA0cGFuZGEuYwpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L21tYy5oPgotI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgogCiAjaW5jbHVkZSAiaHNtbWMuaCIKICNpbmNsdWRlICJjb250cm9sLmgiCkBAIC05NSwxMiArOTUsNiBAQAogCSZ3bDEyNzFfZGV2aWNlLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X3BhbmRhX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoTlVMTCwgTlVMTCk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiaHNfb21hcF9ib2FyZF9kYXRhIHVzYmhzX2JkYXRhIF9faW5pdGNvbnN0ID0gewogCS5wb3J0X21vZGVbMF0gPSBPTUFQX0VIQ0lfUE9SVF9NT0RFX1BIWSwKIAkucG9ydF9tb2RlWzFdID0gT01BUF9VU0JIU19QT1JUX01PREVfVU5VU0VELApAQCAtNDU1LDE2ICs0NDksMTYgQEAKIH0KIAogLyogVXNpbmcgZ2VuZXJpYyBkaXNwbGF5IHBhbmVsICovCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgb21hcDRfZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIG9tYXA0X2R2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDRfcGFuZGFfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IG9tYXA0X3BhbmRhX2Rpc2FibGVfZHZpLAorCS5pMmNfYnVzX251bSA9IDMsCiB9OwogCiBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXA0X3BhbmRhX2R2aV9kZXZpY2UgPSB7CiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKIAkubmFtZQkJCT0gImR2aSIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJkdmkiLAogCS5kYXRhCQkJPSAmb21hcDRfZHZpX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKIAkucmVzZXRfZ3BpbwkJPSBQQU5EQV9EVklfVEZQNDEwX1BPV0VSX0RPV05fR1BJTywKQEAgLTU2OSwyNCArNTYzLDE5IEBACiAJcGxhdGZvcm1fYWRkX2RldmljZXMocGFuZGFfZGV2aWNlcywgQVJSQVlfU0laRShwYW5kYV9kZXZpY2VzKSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvbWFwX3Z3bGFuX2RldmljZSk7CiAJYm9hcmRfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAlvbWFwNF90d2w2MDMwX2hzbW1jX2luaXQobW1jKTsKIAlvbWFwNF9laGNpX2luaXQoKTsKIAl1c2JfbXVzYl9pbml0KCZtdXNiX2JvYXJkX2RhdGEpOwogCW9tYXA0X3BhbmRhX2Rpc3BsYXlfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDRfcGFuZGFfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDJfc2V0X2dsb2JhbHNfNDQzeCgpOwotCW9tYXA0NHh4X21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChPTUFQNF9QQU5EQSwgIk9NQVA0IFBhbmRhIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBEYXZpZCBBbmRlcnMgLSBUZXhhcyBJbnN0cnVtZW50cyBJbmMgKi8KLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAotCS5tYXBfaW8JCT0gb21hcDRfcGFuZGFfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcDRfcGFuZGFfaW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXA0X21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXA0NDMwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwNF9wYW5kYV9pbml0LAogCS50aW1lcgkJPSAmb21hcDRfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW92ZXJvLmMKaW5kZXggZjk0OWE5OS4uNGNmN2FlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vdmVyby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb3Zlcm8uYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtZ2VuZXJpYy1kcGkuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KQEAgLTE4MiwxNiArMTgzLDE2IEBACiAJZHZpX2VuYWJsZWQgPSAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0gewotCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCitzdGF0aWMgc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhIGR2aV9wYW5lbCA9IHsKIAkucGxhdGZvcm1fZW5hYmxlCT0gb3Zlcm9fcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IG92ZXJvX3BhbmVsX2Rpc2FibGVfZHZpLAorCS5pMmNfYnVzX251bQkJPSAzLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugb3Zlcm9fZHZpX2RldmljZSA9IHsKIAkubmFtZQkJCT0gImR2aSIsCiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImR2aSIsCiAJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAogfTsKQEAgLTQ3OCwxMyArNDc5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG92ZXJvX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCW9tYXAyX2luaXRfY29tbW9uX2RldmljZXMobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKLQkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYmhzX29tYXBfYm9hcmRfZGF0YSB1c2Joc19iZGF0YSBfX2luaXRjb25zdCA9IHsKIAkucG9ydF9tb2RlWzBdID0gT01BUF9VU0JIU19QT1JUX01PREVfVU5VU0VELAogCS5wb3J0X21vZGVbMV0gPSBPTUFQX0VIQ0lfUE9SVF9NT0RFX1BIWSwKQEAgLTUxNCw2ICs1MDgsOCBAQAogCW92ZXJvX2kyY19pbml0KCk7CiAJb21hcF9kaXNwbGF5X2luaXQoJm92ZXJvX2Rzc19kYXRhKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKKwkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwogCW9tYXBfbmFuZF9mbGFzaF9pbml0KDAsIG92ZXJvX25hbmRfcGFydGl0aW9ucywKIAkJCSAgICAgQVJSQVlfU0laRShvdmVyb19uYW5kX3BhcnRpdGlvbnMpKTsKIAl1c2JfbXVzYl9pbml0KE5VTEwpOwpAQCAtNTYxLDEwICs1NTcsMTAgQEAKIH0KIAogTUFDSElORV9TVEFSVChPVkVSTywgIkd1bXN0aXggT3Zlcm8iKQotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvdmVyb19pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM1eHhfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb3Zlcm9faW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1ybTY4MC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1ybTY4MC5jCmluZGV4IDdkZmVkMjQuLjYxNmZiMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcm02ODAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJtNjgwLmMKQEAgLTEyMywxNSArMTIzLDYgQEAKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBybTY4MF9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfcGFyYW1zOwotCi0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlzZHJjX3BhcmFtcyA9IG5va2lhX2dldF9zZHJhbV90aW1pbmdzKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhzZHJjX3BhcmFtcywgc2RyY19wYXJhbXMpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKQEAgLTE0MCwyMyArMTMxLDIzIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBybTY4MF9pbml0KHZvaWQpCiB7CisJc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfcGFyYW1zOworCiAJb21hcDNfbXV4X2luaXQoYm9hcmRfbXV4LCBPTUFQX1BBQ0tBR0VfQ0JCKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisKKwlzZHJjX3BhcmFtcyA9IG5va2lhX2dldF9zZHJhbV90aW1pbmdzKCk7CisJb21hcF9zZHJjX2luaXQoc2RyY19wYXJhbXMsIHNkcmNfcGFyYW1zKTsKKwogCXVzYl9tdXNiX2luaXQoTlVMTCk7CiAJcm02ODBfcGVyaXBoZXJhbHNfaW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcm02ODBfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcDJfc2V0X2dsb2JhbHNfM3h4eCgpOwotCW9tYXAzNHh4X21hcF9jb21tb25faW8oKTsKLX0KLQogTUFDSElORV9TVEFSVChOT0tJQV9STTY4MCwgIk5va2lhIFJNLTY4MCBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IHJtNjgwX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IHJtNjgwX2luaXRfZWFybHksCisJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCisJLmluaXRfZWFybHkJPSBvbWFwMzYzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBybTY4MF9pbml0LAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IDVhODg2Y2QuLmJhMWFhMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC05MDAsNyArOTAwLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHBhNjEzMGEyX3BsYXRmb3JtX2RhdGEgcng1MV90cGE2MTMwYTJfZGF0YSBfX2luaXRkYXRhX29yX21vZHVsZSA9IHsKLQkuaWQJCQk9IFRQQTYxMzBBMiwKIAkucG93ZXJfZ3BpbwkJPSA5OCwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmMKaW5kZXggNWVhMTQyZi4uNGFmN2M0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmMKQEAgLTc5LDM4ICs3OSw2IEBACiAJezc1MDUgKyAxNTI3NCwgNDg0MzI5LCAxfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9sY2RfY29uZmlnIHJ4NTFfbGNkX2NvbmZpZyA9IHsKLQkuY3RybF9uYW1lCT0gImludGVybmFsIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9mYm1lbV9jb25maWcgcng1MV9mYm1lbTBfY29uZmlnID0gewotCS5zaXplID0gNzUyICogMTAyNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9mYm1lbV9jb25maWcgcng1MV9mYm1lbTFfY29uZmlnID0gewotCS5zaXplID0gNzUyICogMTAyNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9mYm1lbV9jb25maWcgcng1MV9mYm1lbTJfY29uZmlnID0gewotCS5zaXplID0gNzUyICogMTAyNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHJ4NTFfY29uZmlnW10gPSB7Ci0JeyBPTUFQX1RBR19GQk1FTSwJJnJ4NTFfZmJtZW0wX2NvbmZpZyB9LAotCXsgT01BUF9UQUdfRkJNRU0sCSZyeDUxX2ZibWVtMV9jb25maWcgfSwKLQl7IE9NQVBfVEFHX0ZCTUVNLAkmcng1MV9mYm1lbTJfY29uZmlnIH0sCi0JeyBPTUFQX1RBR19MQ0QsCQkmcng1MV9sY2RfY29uZmlnIH0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfcGFyYW1zOwotCi0Jb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKLQlzZHJjX3BhcmFtcyA9IG5va2lhX2dldF9zZHJhbV90aW1pbmdzKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhzZHJjX3BhcmFtcywgc2RyY19wYXJhbXMpOwotfQotCiBleHRlcm4gdm9pZCBfX2luaXQgcng1MV9wZXJpcGhlcmFsc19pbml0KHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCkBAIC0xMjcsMTEgKzk1LDE1IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCByeDUxX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19wYXJhbXM7CisKIAlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwotCW9tYXBfYm9hcmRfY29uZmlnID0gcng1MV9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUocng1MV9jb25maWcpOwogCW9tYXAzX3BtX2luaXRfY3B1aWRsZShyeDUxX2NwdWlkbGVfcGFyYW1zKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CisKKwlzZHJjX3BhcmFtcyA9IG5va2lhX2dldF9zZHJhbV90aW1pbmdzKCk7CisJb21hcF9zZHJjX2luaXQoc2RyY19wYXJhbXMsIHNkcmNfcGFyYW1zKTsKKwogCXVzYl9tdXNiX2luaXQoJm11c2JfYm9hcmRfZGF0YSk7CiAJcng1MV9wZXJpcGhlcmFsc19pbml0KCk7CiAKQEAgLTE0MiwxMiArMTE0LDYgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmxlZHNfZ3Bpbyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCByeDUxX21hcF9pbyh2b2lkKQotewotCW9tYXAyX3NldF9nbG9iYWxzXzN4eHgoKTsKLQlvbWFwMzR4eF9tYXBfY29tbW9uX2lvKCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCByeDUxX3Jlc2VydmUodm9pZCkKIHsKIAlyeDUxX3ZpZGVvX21lbV9pbml0KCk7CkBAIC0xNTYsMTAgKzEyMiwxMCBAQAogCiBNQUNISU5FX1NUQVJUKE5PS0lBX1JYNTEsICJOb2tpYSBSWC01MSBib2FyZCIpCiAJLyogTWFpbnRhaW5lcjogTGF1cmkgTGV1a2t1bmVuIDxsYXVyaS5sZXVra3VuZW5Abm9raWEuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmUJPSByeDUxX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSByeDUxX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IHJ4NTFfaW5pdF9lYXJseSwKKwkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKKwkuaW5pdF9lYXJseQk9IG9tYXAzNDMwX2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gb21hcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHJ4NTFfaW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC10aTgxNjhldm0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtdGk4MTY4ZXZtLmMKaW5kZXggYTg1ZDViMC4uZTZlZTg4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC10aTgxNjhldm0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXRpODE2OGV2bS5jCkBAIC0yNywzMCArMjcsMjQgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHRpODE2OF9ldm1fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB0aTgxNjhfaW5pdF9lYXJseSh2b2lkKQotewotCW9tYXAyX2luaXRfY29tbW9uX2luZnJhc3RydWN0dXJlKCk7Ci0Jb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhOVUxMLCBOVUxMKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHRpODE2OF9ldm1faW5pdCh2b2lkKQogewogCW9tYXBfc2VyaWFsX2luaXQoKTsKKwlvbWFwX3NkcmNfaW5pdChOVUxMLCBOVUxMKTsKIAlvbWFwX2JvYXJkX2NvbmZpZyA9IHRpODE2OF9ldm1fY29uZmlnOwogCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKHRpODE2OF9ldm1fY29uZmlnKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHRpODE2OF9ldm1fbWFwX2lvKHZvaWQpCiB7Ci0Jb21hcDJfc2V0X2dsb2JhbHNfdGk4MTZ4KCk7CiAJb21hcHRpODE2eF9tYXBfY29tbW9uX2lvKCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoVEk4MTY4RVZNLCAidGk4MTY4ZXZtIikKIAkvKiBNYWludGFpbmVyOiBUZXhhcyBJbnN0cnVtZW50cyAqLwotCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB0aTgxNjhfZXZtX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IHRpODE2OF9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gdGk4MTZ4X2luaXRfZWFybHksCiAJLmluaXRfaXJxCT0gdGk4MTZ4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmb21hcDNfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IHRpODE2OF9ldm1faW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKaW5kZXggOGE5OGMzYy4uYmU2Njg0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKQEAgLTM0LDE3ICszNCw2IEBACiAKICNkZWZpbmUgWk9PTTNfRUhDSV9SRVNFVF9HUElPCQk2NAogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF96b29tX2luaXRfZWFybHkodm9pZCkKLXsKLQlvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSgpOwotCWlmIChtYWNoaW5lX2lzX29tYXBfem9vbTIoKSkKLQkJb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zLAotCQkJCQkgIG10NDZoMzJtMzJsZjZfc2RyY19wYXJhbXMpOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF96b29tMygpKQotCQlvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcywKLQkJCQkJICBoOG1ieDAwdTBtZXIwZW1fc2RyY19wYXJhbXMpOwotfQotCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CiAJLyogV0xBTiBJUlEgLSBHUElPIDE2MiAqLwpAQCAtMTI5LDI0ICsxMTgsMzIgQEAKIAkJCQkJCVpPT01fTkFORF9DUywgTkFORF9CVVNXSURUSF8xNik7CiAJem9vbV9kZWJ1Z2JvYXJkX2luaXQoKTsKIAl6b29tX3BlcmlwaGVyYWxzX2luaXQoKTsKKworCWlmIChtYWNoaW5lX2lzX29tYXBfem9vbTIoKSkKKwkJb21hcF9zZHJjX2luaXQobXQ0NmgzMm0zMmxmNl9zZHJjX3BhcmFtcywKKwkJCQkJICBtdDQ2aDMybTMybGY2X3NkcmNfcGFyYW1zKTsKKwllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfem9vbTMoKSkKKwkJb21hcF9zZHJjX2luaXQoaDhtYngwMHUwbWVyMGVtX3NkcmNfcGFyYW1zLAorCQkJCQkgIGg4bWJ4MDB1MG1lcjBlbV9zZHJjX3BhcmFtcyk7CisKIAl6b29tX2Rpc3BsYXlfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfWk9PTTIsICJPTUFQIFpvb20yIGJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSAweDgwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5yZXNlcnZlCT0gb21hcF9yZXNlcnZlLAogCS5tYXBfaW8JCT0gb21hcDNfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gb21hcF96b29tX2luaXRfZWFybHksCisJLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvbWFwX3pvb21faW5pdCwKIAkudGltZXIJCT0gJm9tYXAzX3RpbWVyLAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChPTUFQX1pPT00zLCAiT01BUCBab29tMyBib2FyZCIpCi0JLmJvb3RfcGFyYW1zCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IG9tYXBfcmVzZXJ2ZSwKIAkubWFwX2lvCQk9IG9tYXAzX21hcF9pbywKLQkuaW5pdF9lYXJseQk9IG9tYXBfem9vbV9pbml0X2Vhcmx5LAorCS5pbml0X2Vhcmx5CT0gb21hcDM2MzBfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSBvbWFwM19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gb21hcF96b29tX2luaXQsCiAJLnRpbWVyCQk9ICZvbWFwM190aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xrdF9kcGxsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsa3RfZHBsbC5jCmluZGV4IGJjZmZlZTAuLmUwNjlhOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xrdF9kcGxsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbGt0X2RwbGwuYwpAQCAtNDYsMTAgKzQ2LDE5IEBACiAJCQkJCSAoRFBMTF9TQ0FMRV9GQUNUT1IgLyBEUExMX1NDQUxFX0JBU0UpKQogCiAvKiBEUExMIHZhbGlkIEZpbnQgZnJlcXVlbmN5IGJhbmQgbGltaXRzIC0gZnJvbSAzNHh4IFRSTSBTZWN0aW9uIDQuNy42LjIgKi8KLSNkZWZpbmUgRFBMTF9GSU5UX0JBTkQxX01JTgkJNzUwMDAwCi0jZGVmaW5lIERQTExfRklOVF9CQU5EMV9NQVgJCTIxMDAwMDAKLSNkZWZpbmUgRFBMTF9GSU5UX0JBTkQyX01JTgkJNzUwMDAwMAotI2RlZmluZSBEUExMX0ZJTlRfQkFORDJfTUFYCQkyMTAwMDAwMAorI2RlZmluZSBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDFfTUlOCTc1MDAwMAorI2RlZmluZSBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDFfTUFYCTIxMDAwMDAKKyNkZWZpbmUgT01BUDM0MzBfRFBMTF9GSU5UX0JBTkQyX01JTgk3NTAwMDAwCisjZGVmaW5lIE9NQVAzNDMwX0RQTExfRklOVF9CQU5EMl9NQVgJMjEwMDAwMDAKKworLyoKKyAqIERQTEwgdmFsaWQgRmludCBmcmVxdWVuY3kgcmFuZ2UgZm9yIE9NQVAzNnh4IGFuZCBPTUFQNHh4eC4KKyAqIEZyb20gZGV2aWNlIGRhdGEgbWFudWFsIHNlY3Rpb24gNC4zICJEUExMIGFuZCBETEwgU3BlY2lmaWNhdGlvbnMiLgorICovCisjZGVmaW5lIE9NQVAzUExVU19EUExMX0ZJTlRfSlRZUEVfTUlOCTUwMDAwMAorI2RlZmluZSBPTUFQM1BMVVNfRFBMTF9GSU5UX0pUWVBFX01BWAkyNTAwMDAwCisjZGVmaW5lIE9NQVAzUExVU19EUExMX0ZJTlRfTUlOCQkzMjAwMAorI2RlZmluZSBPTUFQM1BMVVNfRFBMTF9GSU5UX01BWAkJNTIwMDAwMDAKIAogLyogX2RwbGxfdGVzdF9maW50KCkgcmV0dXJuIGNvZGVzICovCiAjZGVmaW5lIERQTExfRklOVF9VTkRFUkZMT1cJCS0xCkBAIC03MSwzMyArODAsNDMgQEAKIHN0YXRpYyBpbnQgX2RwbGxfdGVzdF9maW50KHN0cnVjdCBjbGsgKmNsaywgdTggbikKIHsKIAlzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKLQlsb25nIGZpbnQ7CisJbG9uZyBmaW50LCBmaW50X21pbiwgZmludF9tYXg7CiAJaW50IHJldCA9IDA7CiAKIAlkZCA9IGNsay0+ZHBsbF9kYXRhOwogCiAJLyogRFBMTCBkaXZpZGVyIG11c3QgcmVzdWx0IGluIGEgdmFsaWQgaml0dGVyIGNvcnJlY3Rpb24gdmFsICovCiAJZmludCA9IGNsay0+cGFyZW50LT5yYXRlIC8gbjsKLQlpZiAoZmludCA8IERQTExfRklOVF9CQU5EMV9NSU4pIHsKIAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgeworCQkvKiBTaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgT01BUDIsIHNvIHdhcm4gaWYgaXQgaXMgY2FsbGVkICovCisJCVdBUk4oMSwgIk5vIGZpbnQgbGltaXRzIGF2YWlsYWJsZSBmb3IgT01BUDIhXG4iKTsKKwkJcmV0dXJuIERQTExfRklOVF9JTlZBTElEOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNDMwKCkpIHsKKwkJZmludF9taW4gPSBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDFfTUlOOworCQlmaW50X21heCA9IE9NQVAzNDMwX0RQTExfRklOVF9CQU5EMl9NQVg7CisJfSBlbHNlIGlmIChkZC0+ZmxhZ3MgJiBEUExMX0pfVFlQRSkgeworCQlmaW50X21pbiA9IE9NQVAzUExVU19EUExMX0ZJTlRfSlRZUEVfTUlOOworCQlmaW50X21heCA9IE9NQVAzUExVU19EUExMX0ZJTlRfSlRZUEVfTUFYOworCX0gZWxzZSB7CisJCWZpbnRfbWluID0gT01BUDNQTFVTX0RQTExfRklOVF9NSU47CisJCWZpbnRfbWF4ID0gT01BUDNQTFVTX0RQTExfRklOVF9NQVg7CisJfQorCisJaWYgKGZpbnQgPCBmaW50X21pbikgewogCQlwcl9kZWJ1ZygicmVqZWN0aW5nIG49JWQgZHVlIHRvIEZpbnQgZmFpbHVyZSwgIgogCQkJICJsb3dlcmluZyBtYXhfZGl2aWRlclxuIiwgbik7CiAJCWRkLT5tYXhfZGl2aWRlciA9IG47CiAJCXJldCA9IERQTExfRklOVF9VTkRFUkZMT1c7Ci0KLQl9IGVsc2UgaWYgKGZpbnQgPiBEUExMX0ZJTlRfQkFORDFfTUFYICYmCi0JCSAgIGZpbnQgPCBEUExMX0ZJTlRfQkFORDJfTUlOKSB7Ci0KLQkJcHJfZGVidWcoInJlamVjdGluZyBuPSVkIGR1ZSB0byBGaW50IGZhaWx1cmVcbiIsIG4pOwotCQlyZXQgPSBEUExMX0ZJTlRfSU5WQUxJRDsKLQotCX0gZWxzZSBpZiAoZmludCA+IERQTExfRklOVF9CQU5EMl9NQVgpIHsKLQorCX0gZWxzZSBpZiAoZmludCA+IGZpbnRfbWF4KSB7CiAJCXByX2RlYnVnKCJyZWplY3Rpbmcgbj0lZCBkdWUgdG8gRmludCBmYWlsdXJlLCAiCiAJCQkgImJvb3N0aW5nIG1pbl9kaXZpZGVyXG4iLCBuKTsKIAkJZGQtPm1pbl9kaXZpZGVyID0gbjsKIAkJcmV0ID0gRFBMTF9GSU5UX0lOVkFMSUQ7Ci0KKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzQzMCgpICYmIGZpbnQgPiBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDFfTUFYICYmCisJCSAgIGZpbnQgPCBPTUFQMzQzMF9EUExMX0ZJTlRfQkFORDJfTUlOKSB7CisJCXByX2RlYnVnKCJyZWplY3Rpbmcgbj0lZCBkdWUgdG8gRmludCBmYWlsdXJlXG4iLCBuKTsKKwkJcmV0ID0gRFBMTF9GSU5UX0lOVkFMSUQ7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2suaAppbmRleCA0OGFjNTY4Li4yMzExYmMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jay5oCkBAIC02Niw2ICs2Niw4IEBACiBpbnQgb21hcDRfZHBsbG14X2dhdGVjdHJsX3JlYWQoc3RydWN0IGNsayAqY2xrKTsKIHZvaWQgb21hcDRfZHBsbG14X2FsbG93X2dhdGVjdHJsKHN0cnVjdCBjbGsgKmNsayk7CiB2b2lkIG9tYXA0X2RwbGxteF9kZW55X2dhdGVjdHJsKHN0cnVjdCBjbGsgKmNsayk7Citsb25nIG9tYXA0X2RwbGxfcmVnbTR4ZW5fcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3JhdGUpOwordW5zaWduZWQgbG9uZyBvbWFwNF9kcGxsX3JlZ200eGVuX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspOwogCiAjaWZkZWYgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTCiB2b2lkIG9tYXAyX2Nsa19kaXNhYmxlX3VudXNlZChzdHJ1Y3QgY2xrICpjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MjBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MjBfZGF0YS5jCmluZGV4IGRlYmMwNDAuLjYxYWQzODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDIwX2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjQyMF9kYXRhLmMKQEAgLTE4OTgsNiArMTg5OCw0MiBAQAogCUNMSyhOVUxMLAkicGthX2ljayIsCSZwa2FfaWNrLAlDS18yNDJYKSwKIAlDTEsoTlVMTCwJInVzYl9mY2siLAkmdXNiX2ZjaywJQ0tfMjQyWCksCiAJQ0xLKCJtdXNiLWhkcmMiLAkiZmNrIiwJJm9zY19jaywJQ0tfMjQyWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMiIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNSIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci42IiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkiMzJrX2NrIiwJJmZ1bmNfMzJrX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOCIsCSIzMmtfY2siLAkmZnVuY18zMmtfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjExIiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJIjMya19jayIsCSZmdW5jXzMya19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjIiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMSIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTIiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjIiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMSIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTIiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MzBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0MzBfZGF0YS5jCmluZGV4IDk2YTk0MmUuLjBjYzEyODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNDMwX2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjQzMF9kYXRhLmMKQEAgLTE5OTgsNiArMTk5OCw0MiBAQAogCUNMSyhOVUxMLAkibWRtX2ludGNfaWNrIiwJJm1kbV9pbnRjX2ljaywJQ0tfMjQzWCksCiAJQ0xLKCJvbWFwX2hzbW1jLjAiLCAibW1jaHNkYl9mY2siLAkmbW1jaHNkYjFfZmNrLAlDS18yNDNYKSwKIAlDTEsoIm9tYXBfaHNtbWMuMSIsICJtbWNoc2RiX2ZjayIsCSZtbWNoc2RiMl9mY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjIiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJIjMya19jayIsICAmZnVuY18zMmtfY2ssICAgQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkiMzJrX2NrIiwgICZmdW5jXzMya19jaywgICBDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMSIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMiIsCSIzMmtfY2siLCAgJmZ1bmNfMzJrX2NrLCAgIENLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci42IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci42IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJhbHRfY2siLAkmYWx0X2NrLAlDS18yNDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkiYWx0X2NrIiwJJmFsdF9jaywJQ0tfMjQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEyIiwJImFsdF9jayIsCSZhbHRfY2ssCUNLXzI0M1gpLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYwppbmRleCBiOWI4NDQ2Li41ZDAwNjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazN4eHhfZGF0YS5jCkBAIC0zNDY0LDYgKzM0NjQsMzAgQEAKIAlDTEsoIm11c2ItYW0zNXgiLAkiZmNrIiwJCSZoc290Z3VzYl9mY2tfYW0zNXh4LAlDS19BTTM1WFgpLAogCUNMSyhOVUxMLAkiaGVjY19jayIsCSZoZWNjX2NrLAlDS19BTTM1WFgpLAogCUNMSyhOVUxMLAkidWFydDRfaWNrIiwJJnVhcnQ0X2lja19hbTM1eHgsCUNLX0FNMzVYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4yIiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci41IiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci44IiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJIjMya19jayIsCSZvbWFwXzMya19mY2ssICBDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkiMzJrX2NrIiwJJm9tYXBfMzJrX2ZjaywgIENLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4xMiIsCSIzMmtfY2siLAkmb21hcF8zMmtfZmNrLCAgQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjIiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjMiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjYiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjkiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJInN5c19jayIsCSZzeXNfY2ssCUNLXzNYWFgpLAorCUNMSygib21hcF90aW1lci4xMSIsCSJzeXNfY2siLAkmc3lzX2NrLAlDS18zWFhYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTIiLAkic3lzX2NrIiwJJnN5c19jaywJQ0tfM1hYWCksCiB9OwogCiAKQEAgLTM0NzIsNyArMzQ5NiwxNiBAQAogCXN0cnVjdCBvbWFwX2NsayAqYzsKIAl1MzIgY3B1X2Nsa2ZsZyA9IDA7CiAKLQlpZiAoY3B1X2lzX29tYXAzNTE3KCkpIHsKKwkvKgorCSAqIDM1MDUgbXVzdCBiZSB0ZXN0ZWQgYmVmb3JlIDM1MTcsIHNpbmNlIDM1MTcgcmV0dXJucyB0cnVlCisJICogZm9yIGJvdGggQU0zNTE3IGNoaXBzIGFuZCBBTTM1MTcgZmFtaWx5IGNoaXBzLCB3aGljaAorCSAqIGluY2x1ZGVzIDM1MDUuICBVbmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm8gb2J2aW91cyBmYW1pbHkKKwkgKiB0ZXN0IGZvciAzNTE3LzM1MDUgOi0oCisJICovCisJaWYgKGNwdV9pc19vbWFwMzUwNSgpKSB7CisJCWNwdV9tYXNrID0gUkFURV9JTl8zNFhYOworCQljcHVfY2xrZmxnID0gQ0tfMzUwNTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzUxNygpKSB7CiAJCWNwdV9tYXNrID0gUkFURV9JTl8zNFhYOwogCQljcHVfY2xrZmxnID0gQ0tfMzUxNzsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzUwNSgpKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHguaAppbmRleCA3Y2ViODcwLi4yODdhNDZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4LmgKQEAgLTgsNiArOCwxMyBAQAogI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfQ0xPQ0s0NFhYX0gKICNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0NMT0NLNDRYWF9ICiAKKy8qCisgKiBPTUFQNDQzMF9SRUdNNFhFTl9NVUxUOiBJZiB0aGUgQ01fQ0xLTU9ERV9EUExMX0FCRS5EUExMX1JFR000WEVOIGJpdCBpcworICogICAgc2V0LCB0aGVuIHRoZSBEUExMJ3MgbG9jayBmcmVxdWVuY3kgaXMgbXVsdGlwbGllZCBieSA0IChPTUFQNDQzMCBUUk0KKyAqICAgIHZWIFNlY3Rpb24gMy42LjMuMy4xICJEUExMcyBPdXRwdXQgQ2xvY2tzIFBhcmFtZXRlcnMiKQorICovCisjZGVmaW5lIE9NQVA0NDMwX1JFR000WEVOX01VTFQJNAorCiBpbnQgb21hcDR4eHhfY2xrX2luaXQodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazQ0eHhfZGF0YS5jCmluZGV4IGMwYjZmYmQuLjA3OThhODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2s0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrNDR4eF9kYXRhLmMKQEAgLTI3MCw4ICsyNzAsOCBAQAogCS5kcGxsX2RhdGEJPSAmZHBsbF9hYmVfZGQsCiAJLmluaXQJCT0gJm9tYXAyX2luaXRfZHBsbF9wYXJlbnQsCiAJLm9wcwkJPSAmY2xrb3BzX29tYXAzX25vbmNvcmVfZHBsbF9vcHMsCi0JLnJlY2FsYwkJPSAmb21hcDNfZHBsbF9yZWNhbGMsCi0JLnJvdW5kX3JhdGUJPSAmb21hcDJfZHBsbF9yb3VuZF9yYXRlLAorCS5yZWNhbGMJCT0gJm9tYXA0X2RwbGxfcmVnbTR4ZW5fcmVjYWxjLAorCS5yb3VuZF9yYXRlCT0gJm9tYXA0X2RwbGxfcmVnbTR4ZW5fcm91bmRfcmF0ZSwKIAkuc2V0X3JhdGUJPSAmb21hcDNfbm9uY29yZV9kcGxsX3NldF9yYXRlLAogfTsKIApAQCAtMTE5NSwxMSArMTE5NSwyNSBAQAogCS5yZWNhbGMJCT0gJm9tYXAyX2Nsa3NlbF9yZWNhbGMsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa3NlbF9yYXRlIGRpdjJfMnRvMV9yYXRlc1tdID0geworCXsgLmRpdiA9IDEsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0MzAgfSwKKwl7IC5kaXYgPSAyLCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDMwIH0sCisJeyAuZGl2ID0gMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWwgb2NwX2FiZV9pY2xrX2RpdltdID0geworCXsgLnBhcmVudCA9ICZhZXNzX2ZjbGssIC5yYXRlcyA9IGRpdjJfMnRvMV9yYXRlcyB9LAorCXsgLnBhcmVudCA9IE5VTEwgfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrIG9jcF9hYmVfaWNsayA9IHsKIAkubmFtZQkJPSAib2NwX2FiZV9pY2xrIiwKIAkucGFyZW50CQk9ICZhZXNzX2ZjbGssCisJLmNsa3NlbAkJPSBvY3BfYWJlX2ljbGtfZGl2LAorCS5jbGtzZWxfcmVnCT0gT01BUDQ0MzBfQ00xX0FCRV9BRVNTX0NMS0NUUkwsCisJLmNsa3NlbF9tYXNrCT0gT01BUDQ0MzBfQ0xLU0VMX0FFU1NfRkNMS19NQVNLLAogCS5vcHMJCT0gJmNsa29wc19udWxsLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLnJlY2FsYwkJPSAmb21hcDJfY2xrc2VsX3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHBlcl9hYmVfMjRtX2ZjbGsgPSB7CkBAIC0xMzk4LDkgKzE0MTIsOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtzZWxfcmF0ZSBkaXYzXzh0bzMyX3JhdGVzW10gPSB7Ci0JeyAuZGl2ID0gOCwgLnZhbCA9IDAsIC5mbGFncyA9IFJBVEVfSU5fNDRYWCB9LAotCXsgLmRpdiA9IDE2LCAudmFsID0gMSwgLmZsYWdzID0gUkFURV9JTl80NFhYIH0sCi0JeyAuZGl2ID0gMzIsIC52YWwgPSAyLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0WFggfSwKKwl7IC5kaXYgPSA4LCAudmFsID0gMCwgLmZsYWdzID0gUkFURV9JTl80NDYwIH0sCisJeyAuZGl2ID0gMTYsIC52YWwgPSAxLCAuZmxhZ3MgPSBSQVRFX0lOXzQ0NjAgfSwKKwl7IC5kaXYgPSAzMiwgLnZhbCA9IDIsIC5mbGFncyA9IFJBVEVfSU5fNDQ2MCB9LAogCXsgLmRpdiA9IDAgfSwKIH07CiAKQEAgLTMzNjMsNiArMzM3NywyOCBAQAogCUNMSygidXNiaHMtb21hcC4wIiwJInVzYmhvc3RfaWNrIiwJCSZkdW1teV9jaywJCUNLXzQ0M1gpLAogCUNMSygidXNiaHMtb21hcC4wIiwJInVzYnRsbF9mY2siLAkJJmR1bW15X2NrLAlDS180NDNYKSwKIAlDTEsoIm9tYXBfd2R0IiwJImljayIsCQkJCSZkdW1teV9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMyIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjQiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci41IiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjciLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci44IiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuOSIsCSIzMmtfY2siLAkmc3lzXzMya19jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjEwIiwJIjMya19jayIsCSZzeXNfMzJrX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkiMzJrX2NrIiwJJnN5c18zMmtfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4xIiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4yIiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4zIiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci40IiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci45IiwJInN5c19jayIsCSZzeXNfY2xraW5fY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci4xMCIsCSJzeXNfY2siLAkmc3lzX2Nsa2luX2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuMTEiLAkic3lzX2NrIiwJJnN5c19jbGtpbl9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjUiLAkic3lzX2NrIiwJJnN5Y19jbGtfZGl2X2NrLAlDS180NDNYKSwKKwlDTEsoIm9tYXBfdGltZXIuNiIsCSJzeXNfY2siLAkmc3ljX2Nsa19kaXZfY2ssCUNLXzQ0M1gpLAorCUNMSygib21hcF90aW1lci43IiwJInN5c19jayIsCSZzeWNfY2xrX2Rpdl9jaywJQ0tfNDQzWCksCisJQ0xLKCJvbWFwX3RpbWVyLjgiLAkic3lzX2NrIiwJJnN5Y19jbGtfZGl2X2NrLAlDS180NDNYKSwKIH07CiAKIGludCBfX2luaXQgb21hcDR4eHhfY2xrX2luaXQodm9pZCkKQEAgLTMzNzAsMTIgKzM0MDYsMTIgQEAKIAlzdHJ1Y3Qgb21hcF9jbGsgKmM7CiAJdTMyIGNwdV9jbGtmbGc7CiAKLQlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKKwlpZiAoY3B1X2lzX29tYXA0NDN4KCkpIHsKIAkJY3B1X21hc2sgPSBSQVRFX0lOXzQ0MzA7CiAJCWNwdV9jbGtmbGcgPSBDS180NDNYOwogCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NDZ4KCkpIHsKLQkJY3B1X21hc2sgPSBSQVRFX0lOXzQ0NjA7Ci0JCWNwdV9jbGtmbGcgPSBDS180NDZYOworCQljcHVfbWFzayA9IFJBVEVfSU5fNDQ2MCB8IFJBVEVfSU5fNDQzMDsKKwkJY3B1X2Nsa2ZsZyA9IENLXzQ0NlggfCBDS180NDNYOwogCX0gZWxzZSB7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uYwppbmRleCA4ZjA4OTA2Li5hZDA3Njg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KQEAgLTczLDkgKzc0LDYgQEAKIAlpZiAoIWNsa2RtIHx8ICFjbGtkbS0+bmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIW9tYXBfY2hpcF9pcyhjbGtkbS0+b21hcF9jaGlwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlwd3JkbSA9IHB3cmRtX2xvb2t1cChjbGtkbS0+cHdyZG0ubmFtZSk7CiAJaWYgKCFwd3JkbSkgewogCQlwcl9lcnIoImNsb2NrZG9tYWluOiAlczogcG93ZXJkb21haW4gJXMgZG9lcyBub3QgZXhpc3RcbiIsCkBAIC0xMDUsMTMgKzEwMywxMCBAQAogewogCXN0cnVjdCBjbGtkbV9kZXAgKmNkOwogCi0JaWYgKCFjbGtkbSB8fCAhZGVwcyB8fCAhb21hcF9jaGlwX2lzKGNsa2RtLT5vbWFwX2NoaXApKQorCWlmICghY2xrZG0gfHwgIWRlcHMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJZm9yIChjZCA9IGRlcHM7IGNkLT5jbGtkbV9uYW1lOyBjZCsrKSB7Ci0JCWlmICghb21hcF9jaGlwX2lzKGNkLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7Ci0KIAkJaWYgKCFjZC0+Y2xrZG0gJiYgY2QtPmNsa2RtX25hbWUpCiAJCQljZC0+Y2xrZG0gPSBfY2xrZG1fbG9va3VwKGNkLT5jbGtkbV9uYW1lKTsKIApAQCAtMTQ4LDkgKzE0Myw2IEBACiAJaWYgKCFhdXRvZGVwKQogCQlyZXR1cm47CiAKLQlpZiAoIW9tYXBfY2hpcF9pcyhhdXRvZGVwLT5vbWFwX2NoaXApKQotCQlyZXR1cm47Ci0KIAljbGtkbSA9IGNsa2RtX2xvb2t1cChhdXRvZGVwLT5jbGtkbS5uYW1lKTsKIAlpZiAoIWNsa2RtKSB7CiAJCXByX2VycigiY2xvY2tkb21haW46IGF1dG9kZXBzOiBjbG9ja2RvbWFpbiAlcyBkb2VzIG5vdCBleGlzdFxuIiwKQEAgLTE4Miw5ICsxNzQsNiBAQAogCQlpZiAoSVNfRVJSKGF1dG9kZXAtPmNsa2RtLnB0cikpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIW9tYXBfY2hpcF9pcyhhdXRvZGVwLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7Ci0KIAkJcHJfZGVidWcoImNsb2NrZG9tYWluOiBhZGRpbmcgJXMgc2xlZXBkZXAvd2tkZXAgZm9yICIKIAkJCSAiY2xrZG0gJXNcbiIsIGF1dG9kZXAtPmNsa2RtLnB0ci0+bmFtZSwKIAkJCSBjbGtkbS0+bmFtZSk7CkBAIC0yMTYsOSArMjA1LDYgQEAKIAkJaWYgKElTX0VSUihhdXRvZGVwLT5jbGtkbS5wdHIpKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFvbWFwX2NoaXBfaXMoYXV0b2RlcC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwotCiAJCXByX2RlYnVnKCJjbG9ja2RvbWFpbjogcmVtb3ZpbmcgJXMgc2xlZXBkZXAvd2tkZXAgZm9yICIKIAkJCSAiY2xrZG0gJXNcbiIsIGF1dG9kZXAtPmNsa2RtLnB0ci0+bmFtZSwKIAkJCSBjbGtkbS0+bmFtZSk7CkBAIC0yNDMsOCArMjI5LDYgQEAKIAlzdHJ1Y3QgY2xrZG1fZGVwICpjZDsKIAogCWZvciAoY2QgPSBjbGtkbV9kZXBzOyBjZCAmJiBjZC0+Y2xrZG1fbmFtZTsgY2QrKykgewotCQlpZiAoIW9tYXBfY2hpcF9pcyhjZC0+b21hcF9jaGlwKSkKLQkJCWNvbnRpbnVlOwogCQlpZiAoY2QtPmNsa2RtKQogCQkJY29udGludWU7CiAJCWNkLT5jbGtkbSA9IF9jbGtkbV9sb29rdXAoY2QtPmNsa2RtX25hbWUpOwpAQCAtMjU3LDQzICsyNDEsMTEzIEBACiAvKiBQdWJsaWMgZnVuY3Rpb25zICovCiAKIC8qKgotICogY2xrZG1faW5pdCAtIHNldCB1cCB0aGUgY2xvY2tkb21haW4gbGF5ZXIKLSAqIEBjbGtkbXM6IG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xvY2tkb21haW5zIHRvIHJlZ2lzdGVyCi0gKiBAaW5pdF9hdXRvZGVwczogb3B0aW9uYWwgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhdXRvZGVwcyB0byByZWdpc3RlcgotICogQGN1c3RvbV9mdW5jczogZnVuYyBwb2ludGVycyBmb3IgYXJjaCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKKyAqIGNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzIC0gcmVnaXN0ZXIgY2xvY2tkb21haW4gaW1wbGVtZW50YXRpb24gZm5zCisgKiBAY286IGZ1bmMgcG9pbnRlcnMgZm9yIGFyY2ggc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zCiAgKgotICogU2V0IHVwIGludGVybmFsIHN0YXRlLiAgSWYgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNsb2NrZG9tYWlucwotICogQGNsa2RtcyB3YXMgc3VwcGxpZWQsIGxvb3AgdGhyb3VnaCB0aGUgbGlzdCBvZiBjbG9ja2RvbWFpbnMsCi0gKiByZWdpc3RlciBhbGwgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLiBTaW1pbGFybHksCi0gKiBpZiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2xvY2tkb21haW4gYXV0b2RlcGVuZGVuY2llcwotICogQGluaXRfYXV0b2RlcHMgd2FzIHByb3ZpZGVkLCByZWdpc3RlciB0aG9zZS4gIE5vIHJldHVybiB2YWx1ZS4KKyAqIFJlZ2lzdGVyIHRoZSBsaXN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgdG8gaW1wbGVtZW50IHRoZQorICogY2xvY2tkb21haW4gZnVuY3Rpb25zIG9uIGRpZmZlcmVudCBPTUFQIFNvQ3MuICBTaG91bGQgYmUgY2FsbGVkCisgKiBiZWZvcmUgYW55IG90aGVyIGNsa2RtX3JlZ2lzdGVyKigpIGZ1bmN0aW9uLiAgUmV0dXJucyAtRUlOVkFMIGlmCisgKiBAY28gaXMgbnVsbCwgLUVFWElTVCBpZiBwbGF0Zm9ybSBmdW5jdGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4KKyAqIHJlZ2lzdGVyZWQsIG9yIDAgdXBvbiBzdWNjZXNzLgogICovCi12b2lkIGNsa2RtX2luaXQoc3RydWN0IGNsb2NrZG9tYWluICoqY2xrZG1zLAotCQlzdHJ1Y3QgY2xrZG1fYXV0b2RlcCAqaW5pdF9hdXRvZGVwcywKLQkJc3RydWN0IGNsa2RtX29wcyAqY3VzdG9tX2Z1bmNzKQoraW50IGNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKHN0cnVjdCBjbGtkbV9vcHMgKmNvKQoreworCWlmICghY28pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyY2hfY2xrZG0pCisJCXJldHVybiAtRUVYSVNUOworCisJYXJjaF9jbGtkbSA9IGNvOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIGNsa2RtX3JlZ2lzdGVyX2Nsa2RtcyAtIHJlZ2lzdGVyIFNvQyBjbG9ja2RvbWFpbnMKKyAqIEBjczogcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgY2xvY2tkb21haW4gdG8gcmVnaXN0ZXIKKyAqCisgKiBSZWdpc3RlciB0aGUgY2xvY2tkb21haW5zIGF2YWlsYWJsZSBvbiBhIHBhcnRpY3VsYXIgT01BUCBTb0MuICBNdXN0CisgKiBiZSBjYWxsZWQgYWZ0ZXIgY2xrZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoKS4gIE1heSBiZSBjYWxsZWQKKyAqIG11bHRpcGxlIHRpbWVzLiAgUmV0dXJucyAtRUFDQ0VTIGlmIGNhbGxlZCBiZWZvcmUKKyAqIGNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCk7IC1FSU5WQUwgaWYgdGhlIGFyZ3VtZW50IEBjcyBpcworICogbnVsbDsgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBjbGtkbV9yZWdpc3Rlcl9jbGtkbXMoc3RydWN0IGNsb2NrZG9tYWluICoqY3MpCiB7CiAJc3RydWN0IGNsb2NrZG9tYWluICoqYyA9IE5VTEw7Ci0Jc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbTsKLQlzdHJ1Y3QgY2xrZG1fYXV0b2RlcCAqYXV0b2RlcCA9IE5VTEw7CiAKLQlpZiAoIWN1c3RvbV9mdW5jcykKLQkJV0FSTigxLCAiTm8gY3VzdG9tIGNsa2RtIGZ1bmN0aW9ucyByZWdpc3RlcmVkXG4iKTsKLQllbHNlCi0JCWFyY2hfY2xrZG0gPSBjdXN0b21fZnVuY3M7CisJaWYgKCFhcmNoX2Nsa2RtKQorCQlyZXR1cm4gLUVBQ0NFUzsKIAotCWlmIChjbGtkbXMpCi0JCWZvciAoYyA9IGNsa2RtczsgKmM7IGMrKykKLQkJCV9jbGtkbV9yZWdpc3RlcigqYyk7CisJaWYgKCFjcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhdXRvZGVwcyA9IGluaXRfYXV0b2RlcHM7CisJZm9yIChjID0gY3M7ICpjOyBjKyspCisJCV9jbGtkbV9yZWdpc3RlcigqYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjbGtkbV9yZWdpc3Rlcl9hdXRvZGVwcyAtIHJlZ2lzdGVyIGF1dG9kZXBzIChpZiByZXF1aXJlZCkKKyAqIEBpYTogcG9pbnRlciB0byBhIHN0YXRpYyBhcnJheSBvZiBzdHJ1Y3QgY2xrZG1fYXV0b2RlcCB0byByZWdpc3RlcgorICoKKyAqIFJlZ2lzdGVyIGNsb2NrZG9tYWluICJhdXRvbWF0aWMgZGVwZW5kZW5jaWVzLiIgIFRoZXNlIGFyZQorICogY2xvY2tkb21haW4gd2FrZXVwIGFuZCBzbGVlcCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXV0b21hdGljYWxseQorICogYWRkZWQgd2hlbmV2ZXIgdGhlIGZpcnN0IGNsb2NrIGluc2lkZSBhIGNsb2NrZG9tYWluIGlzIGVuYWJsZWQsIGFuZAorICogcmVtb3ZlZCB3aGVuZXZlciB0aGUgbGFzdCBjbG9jayBpbnNpZGUgYSBjbG9ja2RvbWFpbiBpcyBkaXNhYmxlZC4KKyAqIFRoZXNlIGFyZSBjdXJyZW50bHkgb25seSB1c2VkIG9uIE9NQVAzIGRldmljZXMsIGFuZCBhcmUgZGVwcmVjYXRlZCwKKyAqIHNpbmNlIHRoZXkgd2FzdGUgZW5lcmd5LiAgSG93ZXZlciwgdW50aWwgdGhlIE9NQVAyLzMgSVAgYmxvY2sKKyAqIGVuYWJsZS9kaXNhYmxlIHNlcXVlbmNlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gbWF0Y2ggdGhlIE9NQVA0CisgKiBzZXF1ZW5jZSwgdGhleSBhcmUgbmVlZGVkLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYWxsIG9mIHRoZSBTb0MgY2xvY2tkb21haW5zIGFyZQorICogcmVnaXN0ZXJlZCwgc2luY2UgdGhlIGZ1bmN0aW9uIHdpbGwgcmVzb2x2ZSBhdXRvZGVwIGNsb2NrZG9tYWluCisgKiBuYW1lcyBpbnRvIGNsb2NrZG9tYWluIHBvaW50ZXJzLgorICoKKyAqIFRoZSBzdHJ1Y3QgY2xrZG1fYXV0b2RlcCBAaWEgYXJyYXkgbXVzdCBiZSBzdGF0aWMsIGFzIHRoaXMgZnVuY3Rpb24KKyAqIGRvZXMgbm90IGNvcHkgdGhlIGFycmF5IGVsZW1lbnRzLgorICoKKyAqIFJldHVybnMgLUVBQ0NFUyBpZiBjYWxsZWQgYmVmb3JlIGFueSBjbG9ja2RvbWFpbnMgaGF2ZSBiZWVuCisgKiByZWdpc3RlcmVkLCAtRUlOVkFMIGlmIGNhbGxlZCB3aXRoIGEgbnVsbCBAaWEgYXJndW1lbnQsIC1FRVhJU1QgaWYKKyAqIGF1dG9kZXBzIGhhdmUgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIG9yIDAgdXBvbiBzdWNjZXNzLgorICovCitpbnQgY2xrZG1fcmVnaXN0ZXJfYXV0b2RlcHMoc3RydWN0IGNsa2RtX2F1dG9kZXAgKmlhKQoreworCXN0cnVjdCBjbGtkbV9hdXRvZGVwICphID0gTlVMTDsKKworCWlmIChsaXN0X2VtcHR5KCZjbGtkbV9saXN0KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoIWlhKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChhdXRvZGVwcykKLQkJZm9yIChhdXRvZGVwID0gYXV0b2RlcHM7IGF1dG9kZXAtPmNsa2RtLnB0cjsgYXV0b2RlcCsrKQotCQkJX2F1dG9kZXBfbG9va3VwKGF1dG9kZXApOworCQlyZXR1cm4gLUVFWElTVDsKIAotCS8qCi0JICogUHV0IGFsbCBjbG9ja2RvbWFpbnMgaW50byBzb2Z0d2FyZS1zdXBlcnZpc2VkIG1vZGU7IFBNIGNvZGUKLQkgKiBzaG91bGQgbGF0ZXIgZW5hYmxlIGhhcmR3YXJlLXN1cGVydmlzZWQgbW9kZSBhcyBhcHByb3ByaWF0ZQotCSAqLworCWF1dG9kZXBzID0gaWE7CisJZm9yIChhID0gYXV0b2RlcHM7IGEtPmNsa2RtLnB0cjsgYSsrKQorCQlfYXV0b2RlcF9sb29rdXAoYSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjbGtkbV9jb21wbGV0ZV9pbml0IC0gc2V0IHVwIHRoZSBjbG9ja2RvbWFpbiBsYXllcgorICoKKyAqIFB1dCBhbGwgY2xvY2tkb21haW5zIGludG8gc29mdHdhcmUtc3VwZXJ2aXNlZCBtb2RlOyBQTSBjb2RlIHNob3VsZAorICogbGF0ZXIgZW5hYmxlIGhhcmR3YXJlLXN1cGVydmlzZWQgbW9kZSBhcyBhcHByb3ByaWF0ZS4gIE11c3QgYmUKKyAqIGNhbGxlZCBhZnRlciBjbGtkbV9yZWdpc3Rlcl9jbGtkbXMoKS4gIFJldHVybnMgLUVBQ0NFUyBpZiBjYWxsZWQKKyAqIGJlZm9yZSBjbGtkbV9yZWdpc3Rlcl9jbGtkbXMoKSwgb3IgMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBjbGtkbV9jb21wbGV0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbTsKKworCWlmIChsaXN0X2VtcHR5KCZjbGtkbV9saXN0KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsa2RtLCAmY2xrZG1fbGlzdCwgbm9kZSkgewogCQlpZiAoY2xrZG0tPmZsYWdzICYgQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCkKIAkJCWNsa2RtX3dha2V1cChjbGtkbSk7CkBAIC0zMDYsNiArMzYwLDggQEAKIAkJX3Jlc29sdmVfY2xrZG1fZGVwcyhjbGtkbSwgY2xrZG0tPnNsZWVwZGVwX3NyY3MpOwogCQljbGtkbV9jbGVhcl9hbGxfc2xlZXBkZXBzKGNsa2RtKTsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmgKaW5kZXggMWU1MGM4OC4uZjdiNTg2MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmgKQEAgLTQ1LDcgKzQ1LDYgQEAKIC8qKgogICogc3RydWN0IGNsa2RtX2F1dG9kZXAgLSBjbGtkbSBkZXBzIHRvIGFkZCB3aGVuIGVudGVyaW5nL2V4aXRpbmcgaHdzdXAgbW9kZQogICogQGNsa2RtOiBjbG9ja2RvbWFpbiB0byBhZGQgd2tkZXArc2xlZXBkZXAgb24gLSBzZXQgbmFtZSBtZW1iZXIgb25seQotICogQG9tYXBfY2hpcDogT01BUCBjaGlwIHR5cGVzIHRoYXQgdGhpcyBhdXRvZGVwIGlzIHZhbGlkIG9uCiAgKgogICogQSBjbG9ja2RvbWFpbiB0aGF0IHNob3VsZCBoYXZlIHdrZGVwcyBhbmQgc2xlZXBkZXBzIGFkZGVkIHdoZW4gYQogICogY2xvY2tkb21haW4gc2hvdWxkIHN0YXkgYWN0aXZlIGluIGh3c3VwIG1vZGU7IGFuZCBjb252ZXJzZWx5LApAQCAtNjAsMTQgKzU5LDEyIEBACiAJCWNvbnN0IGNoYXIgKm5hbWU7CiAJCXN0cnVjdCBjbG9ja2RvbWFpbiAqcHRyOwogCX0gY2xrZG07Ci0JY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CiB9OwogCiAvKioKICAqIHN0cnVjdCBjbGtkbV9kZXAgLSBlbmNvZGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gY2xvY2tkb21haW5zCiAgKiBAY2xrZG1fbmFtZTogY2xvY2tkb21haW4gbmFtZQogICogQGNsa2RtOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2xvY2tkb21haW4gb2YgQGNsa2RtX25hbWUKLSAqIEBvbWFwX2NoaXA6IE9NQVAgY2hpcCB0eXBlcyB0aGF0IHRoaXMgZGVwZW5kZW5jeSBpcyB2YWxpZCBvbgogICogQHdrZGVwX3VzZWNvdW50OiBOdW1iZXIgb2Ygd2FrZXVwIGRlcGVuZGVuY2llcyBjYXVzaW5nIHRoaXMgY2xrZG0gdG8gd2FrZQogICogQHNsZWVwZGVwX3VzZWNvdW50OiBOdW1iZXIgb2Ygc2xlZXAgZGVwcyB0aGF0IGNvdWxkIHByZXZlbnQgY2xrZG0gZnJvbSBpZGxlCiAgKgpAQCAtODEsNyArNzgsNiBAQAogCXN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG07CiAJYXRvbWljX3Qgd2tkZXBfdXNlY291bnQ7CiAJYXRvbWljX3Qgc2xlZXBkZXBfdXNlY291bnQ7Ci0JY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CiB9OwogCiAvKiBQb3NzaWJsZSBmbGFncyBmb3Igc3RydWN0IGNsb2NrZG9tYWluLl9mbGFncyAqLwpAQCAtMTAxLDcgKzk3LDYgQEAKICAqIEBjbGtkbV9vZmZzOiAoT01BUDQgb25seSkgQ00gY2xvY2tkb21haW4gcmVnaXN0ZXIgb2Zmc2V0CiAgKiBAd2tkZXBfc3JjczogQ2xvY2tkb21haW5zIHRoYXQgY2FuIGJlIHRvbGQgdG8gd2FrZSB0aGlzIHBvd2VyZG9tYWluIHVwCiAgKiBAc2xlZXBkZXBfc3JjczogQ2xvY2tkb21haW5zIHRoYXQgY2FuIGJlIHRvbGQgdG8ga2VlcCB0aGlzIGNsa2RtIGZyb20gaW5hY3QKLSAqIEBvbWFwX2NoaXA6IE9NQVAgY2hpcCB0eXBlcyB0aGF0IHRoaXMgY2xvY2tkb21haW4gaXMgdmFsaWQgb24KICAqIEB1c2Vjb3VudDogVXNlY291bnQgdHJhY2tpbmcKICAqIEBub2RlOiBsaXN0X2hlYWQgdG8gbGluayBhbGwgY2xvY2tkb21haW5zIHRvZ2V0aGVyCiAgKgpAQCAtMTI2LDcgKzEyMSw2IEBACiAJY29uc3QgdTE2IGNsa2RtX29mZnM7CiAJc3RydWN0IGNsa2RtX2RlcCAqd2tkZXBfc3JjczsKIAlzdHJ1Y3QgY2xrZG1fZGVwICpzbGVlcGRlcF9zcmNzOwotCWNvbnN0IHN0cnVjdCBvbWFwX2NoaXBfaWQgb21hcF9jaGlwOwogCWF0b21pY190IHVzZWNvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlzcGlubG9ja190IGxvY2s7CkBAIC0xNjYsOCArMTYwLDExIEBACiAJaW50CSgqY2xrZG1fY2xrX2Rpc2FibGUpKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0pOwogfTsKIAotdm9pZCBjbGtkbV9pbml0KHN0cnVjdCBjbG9ja2RvbWFpbiAqKmNsa2Rtcywgc3RydWN0IGNsa2RtX2F1dG9kZXAgKmF1dG9kZXBzLAotCQkJc3RydWN0IGNsa2RtX29wcyAqY3VzdG9tX2Z1bmNzKTsKK2ludCBjbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcyhzdHJ1Y3QgY2xrZG1fb3BzICpjbyk7CitpbnQgY2xrZG1fcmVnaXN0ZXJfYXV0b2RlcHMoc3RydWN0IGNsa2RtX2F1dG9kZXAgKmlhKTsKK2ludCBjbGtkbV9yZWdpc3Rlcl9jbGtkbXMoc3RydWN0IGNsb2NrZG9tYWluICoqYyk7CitpbnQgY2xrZG1fY29tcGxldGVfaW5pdCh2b2lkKTsKKwogc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CiAKIGludCBjbGtkbV9mb3JfZWFjaChpbnQgKCpmbikoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgdm9pZCAqdXNlciksCkBAIC0xOTUsNyArMTkyLDggQEAKIGludCBjbGtkbV9od21vZF9lbmFibGUoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSwgc3RydWN0IG9tYXBfaHdtb2QgKm9oKTsKIGludCBjbGtkbV9od21vZF9kaXNhYmxlKHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xrZG0sIHN0cnVjdCBvbWFwX2h3bW9kICpvaCk7CiAKLWV4dGVybiB2b2lkIF9faW5pdCBvbWFwMnh4eF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBvbWFwMjQyeF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBvbWFwMjQzeF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBvbWFwM3h4eF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBvbWFwNDR4eF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9jbGtkbV9hZGRfYXV0b2RlcHMoc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSk7CkBAIC0yMDUsNCArMjAzLDEwIEBACiBleHRlcm4gc3RydWN0IGNsa2RtX29wcyBvbWFwM19jbGtkbV9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBjbGtkbV9vcHMgb21hcDRfY2xrZG1fb3BlcmF0aW9uczsKIAorZXh0ZXJuIHN0cnVjdCBjbGtkbV9kZXAgZ2Z4XzI0eHhfd2tkZXBzW107CitleHRlcm4gc3RydWN0IGNsa2RtX2RlcCBkc3BfMjR4eF93a2RlcHNbXTsKK2V4dGVybiBzdHJ1Y3QgY2xvY2tkb21haW4gd2t1cF9jb21tb25fY2xrZG07CitleHRlcm4gc3RydWN0IGNsb2NrZG9tYWluIHBybV9jb21tb25fY2xrZG07CitleHRlcm4gc3RydWN0IGNsb2NrZG9tYWluIGNtX2NvbW1vbl9jbGtkbTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluMnh4eF8zeHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluMnh4eF8zeHh4LmMKaW5kZXggZjc0MGVkYi4uYTBkNjhkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjJ4eHhfM3h4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4yeHh4XzN4eHguYwpAQCAtNTIsOCArNTIsNiBAQAogCXUzMiBtYXNrID0gMDsKIAogCWZvciAoY2QgPSBjbGtkbS0+d2tkZXBfc3JjczsgY2QgJiYgY2QtPmNsa2RtX25hbWU7IGNkKyspIHsKLQkJaWYgKCFvbWFwX2NoaXBfaXMoY2QtPm9tYXBfY2hpcCkpCi0JCQljb250aW51ZTsKIAkJaWYgKCFjZC0+Y2xrZG0pCiAJCQljb250aW51ZTsgLyogb25seSBoYXBwZW5zIGlmIGRhdGEgaXMgZXJyb25lb3VzICovCiAKQEAgLTk4LDggKzk2LDYgQEAKIAl1MzIgbWFzayA9IDA7CiAKIAlmb3IgKGNkID0gY2xrZG0tPnNsZWVwZGVwX3NyY3M7IGNkICYmIGNkLT5jbGtkbV9uYW1lOyBjZCsrKSB7Ci0JCWlmICghb21hcF9jaGlwX2lzKGNkLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7CiAJCWlmICghY2QtPmNsa2RtKQogCQkJY29udGludWU7IC8qIG9ubHkgaGFwcGVucyBpZiBkYXRhIGlzIGVycm9uZW91cyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluNDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbjQ0eHguYwppbmRleCBiNDM3MDZhLi45MzVjN2YwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluNDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW40NHh4LmMKQEAgLTUyLDggKzUyLDYgQEAKIAl1MzIgbWFzayA9IDA7CiAKIAlmb3IgKGNkID0gY2xrZG0tPndrZGVwX3NyY3M7IGNkICYmIGNkLT5jbGtkbV9uYW1lOyBjZCsrKSB7Ci0JCWlmICghb21hcF9jaGlwX2lzKGNkLT5vbWFwX2NoaXApKQotCQkJY29udGludWU7CiAJCWlmICghY2QtPmNsa2RtKQogCQkJY29udGludWU7IC8qIG9ubHkgaGFwcGVucyBpZiBkYXRhIGlzIGVycm9uZW91cyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczI0MjBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyNDIwX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI4ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyNDIwX2RhdGEuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIE9NQVAyNDIwIGNsb2NrZG9tYWlucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjbG9ja2RvbWFpbnMgYW5kIGNsb2NrZG9tYWluIHdha2V1cCBkZXBlbmRlbmNpZXMKKyAqIGZvciBPTUFQMjQyMCBjaGlwcy4gIFNvbWUgbm90ZXM6CisgKgorICogQSB1c2VmdWwgdmFsaWRhdGlvbiBydWxlIGZvciBzdHJ1Y3QgY2xvY2tkb21haW46IEFueSBjbG9ja2RvbWFpbgorICogcmVmZXJlbmNlZCBieSBhIHdrZGVwX3NyY3MgbXVzdCBoYXZlIGEgZGVwX2JpdCBhc3NpZ25lZC4gIFNvCisgKiB3a2RlcF9zcmNzIGFyZSByZWFsbHkganVzdCBzb2Z0d2FyZS1jb250cm9sbGFibGUgZGVwZW5kZW5jaWVzLgorICogTm9uLXNvZnR3YXJlLWNvbnRyb2xsYWJsZSBkZXBlbmRlbmNpZXMgZG8gZXhpc3QsIGJ1dCB0aGV5IGFyZSBub3QKKyAqIGVuY29kZWQgYmVsb3cgKHlldCkuCisgKgorICogMjR4eCBkb2VzIG5vdCBzdXBwb3J0IHByb2dyYW1tYWJsZSBzbGVlcCBkZXBlbmRlbmNpZXMgKFNMRUVQREVQKQorICoKKyAqIFRoZSBvdmVybHktc3BlY2lmaWMgZGVwX2JpdCBuYW1lcyBhcmUgZHVlIHRvIGEgYml0IG5hbWUgY29sbGlzaW9uCisgKiB3aXRoIENNX0ZDTEtFTl97RFNQLElWQTJ9LiAgVGhlIERTUC9JVkEyIFBNX1dLREVQIGFuZCBDTV9TTEVFUERFUCBzaGlmdAorICogdmFsdWUgYXJlIHRoZSBzYW1lIGZvciBhbGwgcG93ZXJkb21haW5zOiAyCisgKgorICogWFhYIHNob3VsZCBkZXBfYml0IGJlIGEgbWFzaywgc28gd2UgY2FuIHRlc3QgdG8gc2VlIGlmIGl0IGlzIDAgYXMgYQorICogc2FuaXR5IGNoZWNrPworICogWFhYIGVuY29kZSBoYXJkd2FyZSBmaXhlZCB3YWtldXAgZGVwZW5kZW5jaWVzIC0tIGVzcC4gZm9yIDM0MzAgQ09SRQorICovCisKKy8qCisgKiBUby1EbyBMaXN0CisgKiAtPiBQb3J0IHRoZSBTbGVlcC9XYWtldXAgZGVwZW5kZW5jaWVzIGZvciB0aGUgZG9tYWlucworICogICAgZnJvbSB0aGUgUG93ZXIgZG9tYWluIGZyYW1ld29yaworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiY2xvY2tkb21haW4uaCIKKyNpbmNsdWRlICJwcm0yeHh4XzN4eHguaCIKKyNpbmNsdWRlICJjbTJ4eHhfM3h4eC5oIgorI2luY2x1ZGUgImNtLXJlZ2JpdHMtMjR4eC5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTI0eHguaCIKKworLyoKKyAqIENsb2NrZG9tYWluIGRlcGVuZGVuY2llcyBmb3Igd2tkZXBzCisgKgorICogWFhYIEhhcmR3YXJlIGRlcGVuZGVuY2llcyAoZS5nLiwgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlCisgKiBjaGFuZ2VkIGluIHNvZnR3YXJlKSBhcmUgbm90IGluY2x1ZGVkIGhlcmUgeWV0LCBidXQgc2hvdWxkIGJlLgorICovCisKKy8qIFdha2V1cCBkZXBlbmRlbmN5IHNvdXJjZSBhcnJheXMgKi8KKworLyogMjQyMC1zcGVjaWZpYyBwb3NzaWJsZSB3YWtldXAgZGVwZW5kZW5jaWVzICovCisKKy8qIDI0MjAgUE1fV0tERVBfTVBVOiBDT1JFLCBEU1AsIFdLVVAgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV8yNDIwX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJkc3BfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMjQyMCBQTV9XS0RFUF9DT1JFOiBEU1AsIEdGWCwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBjb3JlXzI0MjBfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJkc3BfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJnZnhfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyoKKyAqIDI0MjAtb25seSBjbG9ja2RvbWFpbnMKKyAqLworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV8yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJtcHVfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1wdV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS53a2RlcF9zcmNzCT0gbXB1XzI0MjBfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9NUFVfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gaXZhMV8yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJpdmExX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkc3BfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1BfU0hJRlQsCisJLndrZGVwX3NyY3MJPSBkc3BfMjR4eF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0MjBfQVVUT1NUQVRFX0lWQV9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3BfMjQyMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHNwX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkc3BfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNQX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGdmeF8yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJnZnhfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImdmeF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS53a2RlcF9zcmNzCT0gZ2Z4XzI0eHhfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9HRlhfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sM18yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLndrZGVwX3NyY3MJPSBjb3JlXzI0MjBfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MM19NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2w0XzI0MjBfY2xrZG0gPSB7CisJLm5hbWUJCT0gImNvcmVfbDRfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkud2tkZXBfc3Jjcwk9IGNvcmVfMjQyMF93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0w0X01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18yNDIwX2Nsa2RtID0geworCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNTX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcDI0MnhbXSBfX2luaXRkYXRhID0geworCSZ3a3VwX2NvbW1vbl9jbGtkbSwKKwkmY21fY29tbW9uX2Nsa2RtLAorCSZwcm1fY29tbW9uX2Nsa2RtLAorCSZtcHVfMjQyMF9jbGtkbSwKKwkmaXZhMV8yNDIwX2Nsa2RtLAorCSZkc3BfMjQyMF9jbGtkbSwKKwkmZ2Z4XzI0MjBfY2xrZG0sCisJJmNvcmVfbDNfMjQyMF9jbGtkbSwKKwkmY29yZV9sNF8yNDIwX2Nsa2RtLAorCSZkc3NfMjQyMF9jbGtkbSwKKwlOVUxMLAorfTsKKwordm9pZCBfX2luaXQgb21hcDI0MnhfY2xvY2tkb21haW5zX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9pc19vbWFwMjQyeCgpKQorCQlyZXR1cm47CisKKwljbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDJfY2xrZG1fb3BlcmF0aW9ucyk7CisJY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKGNsb2NrZG9tYWluc19vbWFwMjQyeCk7CisJY2xrZG1fY29tcGxldGVfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyNDMwX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMjQzMF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NWVkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMjQzMF9kYXRhLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBPTUFQMnh4eCBjbG9ja2RvbWFpbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBQYXVsIFdhbG1zbGV5LCBKb3VuaSBIw7ZnYW5kZXIKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgY2xvY2tkb21haW5zIGFuZCBjbG9ja2RvbWFpbiB3YWtldXAgZGVwZW5kZW5jaWVzCisgKiBmb3IgT01BUDJ4eHggY2hpcHMuICBTb21lIG5vdGVzOgorICoKKyAqIEEgdXNlZnVsIHZhbGlkYXRpb24gcnVsZSBmb3Igc3RydWN0IGNsb2NrZG9tYWluOiBBbnkgY2xvY2tkb21haW4KKyAqIHJlZmVyZW5jZWQgYnkgYSB3a2RlcF9zcmNzIG11c3QgaGF2ZSBhIGRlcF9iaXQgYXNzaWduZWQuICBTbworICogd2tkZXBfc3JjcyBhcmUgcmVhbGx5IGp1c3Qgc29mdHdhcmUtY29udHJvbGxhYmxlIGRlcGVuZGVuY2llcy4KKyAqIE5vbi1zb2Z0d2FyZS1jb250cm9sbGFibGUgZGVwZW5kZW5jaWVzIGRvIGV4aXN0LCBidXQgdGhleSBhcmUgbm90CisgKiBlbmNvZGVkIGJlbG93ICh5ZXQpLgorICoKKyAqIDI0eHggZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtbWFibGUgc2xlZXAgZGVwZW5kZW5jaWVzIChTTEVFUERFUCkKKyAqCisgKiBUaGUgb3Zlcmx5LXNwZWNpZmljIGRlcF9iaXQgbmFtZXMgYXJlIGR1ZSB0byBhIGJpdCBuYW1lIGNvbGxpc2lvbgorICogd2l0aCBDTV9GQ0xLRU5fe0RTUCxJVkEyfS4gIFRoZSBEU1AvSVZBMiBQTV9XS0RFUCBhbmQgQ01fU0xFRVBERVAgc2hpZnQKKyAqIHZhbHVlIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHBvd2VyZG9tYWluczogMgorICoKKyAqIFhYWCBzaG91bGQgZGVwX2JpdCBiZSBhIG1hc2ssIHNvIHdlIGNhbiB0ZXN0IHRvIHNlZSBpZiBpdCBpcyAwIGFzIGEKKyAqIHNhbml0eSBjaGVjaz8KKyAqIFhYWCBlbmNvZGUgaGFyZHdhcmUgZml4ZWQgd2FrZXVwIGRlcGVuZGVuY2llcyAtLSBlc3AuIGZvciAzNDMwIENPUkUKKyAqLworCisvKgorICogVG8tRG8gTGlzdAorICogLT4gUG9ydCB0aGUgU2xlZXAvV2FrZXVwIGRlcGVuZGVuY2llcyBmb3IgdGhlIGRvbWFpbnMKKyAqICAgIGZyb20gdGhlIFBvd2VyIGRvbWFpbiBmcmFtZXdvcmsKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImNsb2NrZG9tYWluLmgiCisjaW5jbHVkZSAicHJtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20yeHh4XzN4eHguaCIKKyNpbmNsdWRlICJjbS1yZWdiaXRzLTI0eHguaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0yNHh4LmgiCisKKy8qCisgKiBDbG9ja2RvbWFpbiBkZXBlbmRlbmNpZXMgZm9yIHdrZGVwcworICoKKyAqIFhYWCBIYXJkd2FyZSBkZXBlbmRlbmNpZXMgKGUuZy4sIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZQorICogY2hhbmdlZCBpbiBzb2Z0d2FyZSkgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIHlldCwgYnV0IHNob3VsZCBiZS4KKyAqLworCisvKiBXYWtldXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzICovCisKKy8qIDI0MzAtc3BlY2lmaWMgcG9zc2libGUgd2FrZXVwIGRlcGVuZGVuY2llcyAqLworCisvKiAyNDMwIFBNX1dLREVQX0NPUkU6IERTUCwgR0ZYLCBNUFUsIFdLVVAsIE1ETSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgY29yZV8yNDMwX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiZHNwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZ2Z4X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1kbV9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDI0MzAgUE1fV0tERVBfTVBVOiBDT1JFLCBEU1AsIFdLVVAsIE1ETSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbXB1XzI0MzBfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImRzcF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtZG1fY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAyNDMwIFBNX1dLREVQX01ETTogQ09SRSwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBtZG1fMjQzMF93a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qCisgKiAyNDMwLW9ubHkgY2xvY2tkb21haW5zCisgKi8KKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfMjQzMF9jbGtkbSA9IHsKKwkubmFtZQkJPSAibXB1X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJtcHVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IG1wdV8yNDMwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTVBVX01BU0ssCit9OworCisvKiBBbm90aGVyIGNhc2Ugb2YgYml0IG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNldmVyYWwgcmVnaXN0ZXJzOiBFTl9NRE0gKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbWRtX2Nsa2RtID0geworCS5uYW1lCQk9ICJtZG1fY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1kbV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5kZXBfYml0CT0gT01BUDI0MzBfUE1fV0tERVBfTVBVX0VOX01ETV9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IG1kbV8yNDMwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjQzMF9BVVRPU1RBVEVfTURNX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzcF8yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJkc3BfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRzcF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS5kZXBfYml0CT0gT01BUDI0WFhfUE1fV0tERVBfTVBVX0VOX0RTUF9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IGRzcF8yNHh4X3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNQX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGdmeF8yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJnZnhfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImdmeF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS53a2RlcF9zcmNzCT0gZ2Z4XzI0eHhfd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9HRlhfTUFTSywKK307CisKKy8qCisgKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKKyAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfMjR4eF9jbGtkbSBhbmQgY29yZV9sNF8yNHh4X2Nsa2RtCisgKiBjb3VsZCBjYXVzZSB0cm91YmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sM18yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJjb3JlX2wzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmRlcF9iaXQJPSBPTUFQMjRYWF9FTl9DT1JFX1NISUZULAorCS53a2RlcF9zcmNzCT0gY29yZV8yNDMwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDNfTUFTSywKK307CisKKy8qCisgKiBYWFggYWRkIHVzZWNvdW50aW5nIGZvciBjbGtkbSBkZXBlbmRlbmNpZXMsIG90aGVyd2lzZSB0aGUgcHJlc2VuY2UKKyAqIG9mIGEgc2luZ2xlIGRlcCBiaXQgZm9yIGNvcmVfbDNfMjR4eF9jbGtkbSBhbmQgY29yZV9sNF8yNHh4X2Nsa2RtCisgKiBjb3VsZCBjYXVzZSB0cm91YmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gY29yZV9sNF8yNDMwX2Nsa2RtID0geworCS5uYW1lCQk9ICJjb3JlX2w0X2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCisJLmRlcF9iaXQJPSBPTUFQMjRYWF9FTl9DT1JFX1NISUZULAorCS53a2RlcF9zcmNzCT0gY29yZV8yNDMwX3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfTDRfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNzXzI0MzBfY2xrZG0gPSB7CisJLm5hbWUJCT0gImRzc19jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9EU1NfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gKmNsb2NrZG9tYWluc19vbWFwMjQzeFtdIF9faW5pdGRhdGEgPSB7CisJJndrdXBfY29tbW9uX2Nsa2RtLAorCSZjbV9jb21tb25fY2xrZG0sCisJJnBybV9jb21tb25fY2xrZG0sCisJJm1wdV8yNDMwX2Nsa2RtLAorCSZtZG1fY2xrZG0sCisJJmRzcF8yNDMwX2Nsa2RtLAorCSZnZnhfMjQzMF9jbGtkbSwKKwkmY29yZV9sM18yNDMwX2Nsa2RtLAorCSZjb3JlX2w0XzI0MzBfY2xrZG0sCisJJmRzc18yNDMwX2Nsa2RtLAorCU5VTEwsCit9OworCit2b2lkIF9faW5pdCBvbWFwMjQzeF9jbG9ja2RvbWFpbnNfaW5pdCh2b2lkKQoreworCWlmICghY3B1X2lzX29tYXAyNDN4KCkpCisJCXJldHVybjsKKworCWNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCZvbWFwMl9jbGtkbV9vcGVyYXRpb25zKTsKKwljbGtkbV9yZWdpc3Rlcl9jbGtkbXMoY2xvY2tkb21haW5zX29tYXAyNDN4KTsKKwljbGtkbV9jb21wbGV0ZV9pbml0KCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMnh4eF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zMnh4eF8zeHh4X2RhdGEuYwppbmRleCAxM2JkZTk1Li4wYTZhMDQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnMyeHh4XzN4eHhfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIE9NQVAyLzMgY2xvY2tkb21haW5zCisgKiBPTUFQMi8zIGNsb2NrZG9tYWluIGNvbW1vbiBkYXRhCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgpAQCAtNTEsMzc0ICs1MSwyOCBAQAogICogY2hhbmdlZCBpbiBzb2Z0d2FyZSkgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIHlldCwgYnV0IHNob3VsZCBiZS4KICAqLwogCi0vKiBPTUFQMi8zLWNvbW1vbiB3YWtldXAgZGVwZW5kZW5jaWVzICovCi0KLS8qCi0gKiAyNDIwLzI0MzAgUE1fV0tERVBfR0ZYOiBDT1JFLCBNUFUsIFdLVVAKLSAqIDM0MzBFUzEgUE1fV0tERVBfR0ZYOiBhZGRzIElWQTIsIHJlbW92ZXMgQ09SRQotICogMzQzMEVTMiBQTV9XS0RFUF9TR1g6IGFkZHMgSVZBMiwgcmVtb3ZlcyBDT1JFCi0gKiBUaGVzZSBjYW4gc2hhcmUgZGF0YSBzaW5jZSB0aGV5IHdpbGwgbmV2ZXIgYmUgcHJlc2VudCBzaW11bHRhbmVvdXNseQotICogb24gdGhlIHNhbWUgZGV2aWNlLgotICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBnZnhfc2d4X3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFggfAotCQkJCQkgICAgQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwKLQkJCQkJICAgIENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLQotLyogMjRYWC1zcGVjaWZpYyBwb3NzaWJsZSBkZXBlbmRlbmNpZXMgKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCi0KIC8qIFdha2V1cCBkZXBlbmRlbmN5IHNvdXJjZSBhcnJheXMgKi8KIAotLyogMjQyMC8yNDMwIFBNX1dLREVQX0RTUDogQ09SRSwgTVBVLCBXS1VQICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBkc3BfMjR4eF93a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDNfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCisvKiAyeHh4LXNwZWNpZmljIHBvc3NpYmxlIGRlcGVuZGVuY2llcyAqLworCisvKiAyeHh4IFBNX1dLREVQX0dGWDogQ09SRSwgTVBVLCBXS1VQICovCitzdHJ1Y3QgY2xrZG1fZGVwIGdmeF8yNHh4X3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAotLyoKLSAqIDI0MjAgUE1fV0tERVBfTVBVOiBDT1JFLCBEU1AsIFdLVVAKLSAqIDI0MzAgYWRkcyBNRE0KLSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbXB1XzI0eHhfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiZHNwX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibWRtX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCi0JfSwKKy8qIDJ4eHggUE1fV0tERVBfRFNQOiBDT1JFLCBNUFUsIFdLVVAgKi8KK3N0cnVjdCBjbGtkbV9kZXAgZHNwXzI0eHhfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCi0vKgotICogMjQyMCBQTV9XS0RFUF9DT1JFOiBEU1AsIEdGWCwgTVBVLCBXS1VQCi0gKiAyNDMwIGFkZHMgTURNCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGNvcmVfMjR4eF93a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImRzcF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJnZnhfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibWRtX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMiAqLwotCi0vKiAyNDMwLXNwZWNpZmljIHBvc3NpYmxlIHdha2V1cCBkZXBlbmRlbmNpZXMgKi8KLQotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MzAKLQotLyogMjQzMCBQTV9XS0RFUF9NRE06IENPUkUsIE1QVSwgV0tVUCAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbWRtXzI0MzBfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19TT0NfT01BUDI0MzAgKi8KLQotCi0vKiBPTUFQMy1zcGVjaWZpYyBwb3NzaWJsZSBkZXBlbmRlbmNpZXMgKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCi0KLS8qIDM0MzA6IFBNX1dLREVQX1BFUjogQ09SRSwgSVZBMiwgTVBVLCBXS1VQICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBwZXJfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwRVMyOiBQTV9XS0RFUF9VU0JIT1NUOiBDT1JFLCBJVkEyLCBNUFUsIFdLVVAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIHVzYmhvc3Rfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwIFBNX1dLREVQX01QVTogQ09SRSwgSVZBMiwgRFNTLCBQRVIgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG1wdV8zeHh4X3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2w0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiZHNzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gInBlcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwIFBNX1dLREVQX0lWQTI6IENPUkUsIE1QVSwgV0tVUCwgRFNTLCBQRVIgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGl2YTJfd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiZHNzX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gInBlcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0KLS8qIDM0MzAgUE1fV0tERVBfQ0FNOiBJVkEyLCBNUFUsIFdLVVAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGNhbV93a2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyogMzQzMCBQTV9XS0RFUF9EU1M6IElWQTIsIE1QVSwgV0tVUCAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZHNzX3drZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwOiBQTV9XS0RFUF9ORU9OOiBNUFUgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIG5lb25fd2tkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotCi0vKiBTbGVlcCBkZXBlbmRlbmN5IHNvdXJjZSBhcnJheXMgZm9yIE9NQVAzLXNwZWNpZmljIGNsa2RtcyAqLwotCi0vKiAzNDMwOiBDTV9TTEVFUERFUF9EU1M6IE1QVSwgSVZBICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBkc3Nfc2xlZXBkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwOiBDTV9TTEVFUERFUF9QRVI6IE1QVSwgSVZBICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBwZXJfc2xlZXBkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0vKiAzNDMwRVMyOiBDTV9TTEVFUERFUF9VU0JIT1NUOiBNUFUsIElWQSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgdXNiaG9zdF9zbGVlcGRlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcCA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCi0JfSwKLQl7IE5VTEwgfSwKLX07Ci0KLS8qIDM0MzA6IENNX1NMRUVQREVQX0NBTTogTVBVICovCi1zdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBjYW1fc2xlZXBkZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iLAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsgTlVMTCB9LAotfTsKLQotLyoKLSAqIDM0MzBFUzE6IENNX1NMRUVQREVQX0dGWDogTVBVCi0gKiAzNDMwRVMyOiBDTV9TTEVFUERFUF9TR1g6IE1QVQotICogVGhlc2UgY2FuIHNoYXJlIGRhdGEgc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgc2ltdWx0YW5lb3VzbHkKLSAqIG9uIHRoZSBzYW1lIGRldmljZS4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZ2Z4X3NneF9zbGVlcGRlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQotCX0sCi0JeyBOVUxMIH0sCi19OwotCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDMgKi8KLQogCiAvKgogICogT01BUDIvMy1jb21tb24gY2xvY2tkb21haW5zCkBAIC00MzAsNDM5ICs4NCwxOCBAQAogICovCiAKIC8qIFRoaXMgaXMgYW4gaW1wbGljaXQgY2xvY2tkb21haW4gLSBpdCBpcyBuZXZlciBkZWZpbmVkIGFzIHN1Y2ggaW4gVFJNICovCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHdrdXBfY2xrZG0gPSB7CitzdHJ1Y3QgY2xvY2tkb21haW4gd2t1cF9jb21tb25fY2xrZG0gPSB7CiAJLm5hbWUJCT0gIndrdXBfY2xrZG0iLAogCS5wd3JkbQkJPSB7IC5uYW1lID0gIndrdXBfcHdyZG0iIH0sCiAJLmRlcF9iaXQJPSBPTUFQX0VOX1dLVVBfU0hJRlQsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFggfCBDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gcHJtX2Nsa2RtID0geworc3RydWN0IGNsb2NrZG9tYWluIHBybV9jb21tb25fY2xrZG0gPSB7CiAJLm5hbWUJCT0gInBybV9jbGtkbSIsCiAJLnB3cmRtCQk9IHsgLm5hbWUgPSAid2t1cF9wd3JkbSIgfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCB8IENISVBfSVNfT01BUDM0MzApLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjbV9jbGtkbSA9IHsKK3N0cnVjdCBjbG9ja2RvbWFpbiBjbV9jb21tb25fY2xrZG0gPSB7CiAJLm5hbWUJCT0gImNtX2Nsa2RtIiwKIAkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwgQ0hJUF9JU19PTUFQMzQzMCksCiB9OwotCi0vKgotICogMjQyMC1vbmx5IGNsb2NrZG9tYWlucwotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfT01BUDI0MjApCi0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIm1wdV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAibXB1X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLndrZGVwX3NyY3MJPSBtcHVfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX01QVV9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gaXZhMV8yNDIwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJpdmExX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkc3BfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAyNFhYX1BNX1dLREVQX01QVV9FTl9EU1BfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBkc3BfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0MjBfQVVUT1NUQVRFX0lWQV9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNwXzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRzcF9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHNwX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTUF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZ2Z4XzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImdmeF9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZ2Z4X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSBnZnhfc2d4X3drZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfR0ZYX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2wzXzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDNfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkud2tkZXBfc3Jjcwk9IGNvcmVfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0wzX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2w0XzI0MjBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDRfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkud2tkZXBfc3Jjcwk9IGNvcmVfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0w0X01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3NfMjQyMF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHNzX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVAsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0RTU19NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKLX07Ci0KLSNlbmRpZiAgIC8qIENPTkZJR19TT0NfT01BUDI0MjAgKi8KLQotCi0vKgotICogMjQzMC1vbmx5IGNsb2NrZG9tYWlucwotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfT01BUDI0MzApCi0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1XzI0MzBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIm1wdV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAibXB1X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSBtcHVfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX01QVV9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKLX07Ci0KLS8qIEFub3RoZXIgY2FzZSBvZiBiaXQgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnM6IEVOX01ETSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtZG1fY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIm1kbV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAibWRtX3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLmRlcF9iaXQJPSBPTUFQMjQzMF9QTV9XS0RFUF9NUFVfRU5fTURNX1NISUZULAotCS53a2RlcF9zcmNzCT0gbWRtXzI0MzBfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNDMwX0FVVE9TVEFURV9NRE1fTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzcF8yNDMwX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkc3BfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRzcF9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5kZXBfYml0CT0gT01BUDI0WFhfUE1fV0tERVBfTVBVX0VOX0RTUF9TSElGVCwKLQkud2tkZXBfc3Jjcwk9IGRzcF8yNHh4X3drZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMjRYWF9BVVRPU1RBVEVfRFNQX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBnZnhfMjQzMF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiZ2Z4X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJnZnhfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkud2tkZXBfc3Jjcwk9IGdmeF9zZ3hfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9HRlhfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCi19OwotCi0vKgotICogWFhYIGFkZCB1c2Vjb3VudGluZyBmb3IgY2xrZG0gZGVwZW5kZW5jaWVzLCBvdGhlcndpc2UgdGhlIHByZXNlbmNlCi0gKiBvZiBhIHNpbmdsZSBkZXAgYml0IGZvciBjb3JlX2wzXzI0eHhfY2xrZG0gYW5kIGNvcmVfbDRfMjR4eF9jbGtkbQotICogY291bGQgY2F1c2UgdHJvdWJsZQotICovCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDNfMjQzMF9jbGtkbSA9IHsKLQkubmFtZQkJPSAiY29yZV9sM19jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5kZXBfYml0CT0gT01BUDI0WFhfRU5fQ09SRV9TSElGVCwKLQkud2tkZXBfc3Jjcwk9IGNvcmVfMjR4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDI0WFhfQVVUT1NUQVRFX0wzX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAotfTsKLQotLyoKLSAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQotICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18yNHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzI0eHhfY2xrZG0KLSAqIGNvdWxkIGNhdXNlIHRyb3VibGUKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2w0XzI0MzBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDRfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAyNFhYX0VOX0NPUkVfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBjb3JlXzI0eHhfd2tkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9MNF9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHNzXzI0MzBfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRzc19jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAyNFhYX0FVVE9TVEFURV9EU1NfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCi19OwotCi0jZW5kaWYgICAgLyogQ09ORklHX1NPQ19PTUFQMjQzMCAqLwotCi0KLS8qCi0gKiBPTUFQMyBjbG9ja2RvbWFpbnMKLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfM3h4eF9jbGtkbSA9IHsKLQkubmFtZQkJPSAibXB1X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJtcHVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCB8IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAsCi0JLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9NUFVfU0hJRlQsCi0JLndrZGVwX3NyY3MJPSBtcHVfM3h4eF93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX01QVV9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbmVvbl9jbGtkbSA9IHsKLQkubmFtZQkJPSAibmVvbl9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAibmVvbl9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS53a2RlcF9zcmNzCT0gbmVvbl93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX05FT05fTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGl2YTJfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gIml2YTJfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gIml2YTJfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9JVkEyX1NISUZULAotCS53a2RlcF9zcmNzCT0gaXZhMl93a2RlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0lWQTJfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGdmeF8zNDMwZXMxX2Nsa2RtID0gewotCS5uYW1lCQk9ICJnZnhfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImdmeF9wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS53a2RlcF9zcmNzCT0gZ2Z4X3NneF93a2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJPSBnZnhfc2d4X3NsZWVwZGVwcywKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMEVTMV9DTEtUUkNUUkxfR0ZYX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEpLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBzZ3hfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gInNneF9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAic2d4X3B3cmRtIiB9LAotCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLndrZGVwX3NyY3MJPSBnZnhfc2d4X3drZGVwcywKLQkuc2xlZXBkZXBfc3Jjcwk9IGdmeF9zZ3hfc2xlZXBkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwRVMyX0NMS1RSQ1RSTF9TR1hfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiksCi19OwotCi0vKgotICogVGhlIGRpZS10by1kaWUgY2xvY2tkb21haW4gd2FzIGRvY3VtZW50ZWQgaW4gdGhlIDM0eHggRVMxIFRSTSwgYnV0Ci0gKiB0aGVuIHRoYXQgaW5mb3JtYXRpb24gd2FzIHJlbW92ZWQgZnJvbSB0aGUgMzR4eCBFUzIrIFRSTS4gIEl0IGlzCi0gKiB1bmNsZWFyIHdoZXRoZXIgdGhlIGNvcmUgaXMgc3RpbGwgdGhlcmUsIGJ1dCB0aGUgY2xvY2tkb21haW4gbG9naWMKLSAqIGlzIHRoZXJlLCBhbmQgbXVzdCBiZSBwcm9ncmFtbWVkIHRvIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGlmIHRoZQotICogQ09SRSBjbG9ja2RvbWFpbiBpcyB0byBiZWNvbWUgaW5hY3RpdmUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZDJkX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkMmRfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMEVTMV9DTEtUUkNUUkxfRDJEX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotLyoKLSAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQotICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18zeHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzN4eHhfY2xrZG0KLSAqIGNvdWxkIGNhdXNlIHRyb3VibGUKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2wzXzN4eHhfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDNfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX0NPUkVfU0hJRlQsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0wzX01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotLyoKLSAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQotICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18zeHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzN4eHhfY2xrZG0KLSAqIGNvdWxkIGNhdXNlIHRyb3VibGUKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2w0XzN4eHhfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImNvcmVfbDRfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX0NPUkVfU0hJRlQsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0w0X01BU0ssCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotLyogQW5vdGhlciBjYXNlIG9mIGJpdCBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXZlcmFsIHJlZ2lzdGVyczogRU5fRFNTICovCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRzc18zeHh4X2Nsa2RtID0gewotCS5uYW1lCQk9ICJkc3NfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRzc19wd3JkbSIgfSwKLQkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5kZXBfYml0CT0gT01BUDM0MzBfUE1fV0tERVBfTVBVX0VOX0RTU19TSElGVCwKLQkud2tkZXBfc3Jjcwk9IGRzc193a2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJPSBkc3Nfc2xlZXBkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9EU1NfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNhbV9jbGtkbSA9IHsKLQkubmFtZQkJPSAiY2FtX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJjYW1fcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkud2tkZXBfc3Jjcwk9IGNhbV93a2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJPSBjYW1fc2xlZXBkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9DQU1fTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHVzYmhvc3RfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gInVzYmhvc3RfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gInVzYmhvc3RfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkud2tkZXBfc3Jjcwk9IHVzYmhvc3Rfd2tkZXBzLAotCS5zbGVlcGRlcF9zcmNzCT0gdXNiaG9zdF9zbGVlcGRlcHMsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzJfQ0xLVFJDVFJMX1VTQkhPU1RfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIHBlcl9jbGtkbSA9IHsKLQkubmFtZQkJPSAicGVyX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJwZXJfcHdyZG0iIH0sCi0JLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX1BFUl9TSElGVCwKLQkud2tkZXBfc3Jjcwk9IHBlcl93a2RlcHMsCi0JLnNsZWVwZGVwX3NyY3MJPSBwZXJfc2xlZXBkZXBzLAotCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9QRVJfTUFTSywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi0vKgotICogRGlzYWJsZSBodyBzdXBlcnZpc2VkIG1vZGUgZm9yIGVtdV9jbGtkbSwgYmVjYXVzZSBlbXVfcHdyZG0gaXMKLSAqIHN3aXRjaGVkIG9mIGV2ZW4gaWYgc2R0aSBpcyBpbiB1c2UKLSAqLwotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBlbXVfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImVtdV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZW11X3B3cmRtIiB9LAotCS5mbGFncwkJPSAvKiBDTEtETV9DQU5fRU5BQkxFX0FVVE8gfCAgKi9DTEtETV9DQU5fU1dTVVAsCi0JLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0VNVV9NQVNLLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDFfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRwbGwxX2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsMV9wd3JkbSIgfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRwbGwyX2Nsa2RtID0gewotCS5uYW1lCQk9ICJkcGxsMl9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHBsbDJfcHdyZG0iIH0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsM19jbGtkbSA9IHsKLQkubmFtZQkJPSAiZHBsbDNfY2xrZG0iLAotCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGwzX3B3cmRtIiB9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZHBsbDRfY2xrZG0gPSB7Ci0JLm5hbWUJCT0gImRwbGw0X2Nsa2RtIiwKLQkucHdyZG0JCT0geyAubmFtZSA9ICJkcGxsNF9wd3JkbSIgfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGRwbGw1X2Nsa2RtID0gewotCS5uYW1lCQk9ICJkcGxsNV9jbGtkbSIsCi0JLnB3cmRtCQk9IHsgLm5hbWUgPSAiZHBsbDVfcHdyZG0iIH0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfR0VfT01BUDM0MzBFUzIpLAotfTsKLQotI2VuZGlmICAgLyogQ09ORklHX0FSQ0hfT01BUDMgKi8KLQotLyoKLSAqIENsb2NrZG9tYWluIGh3c3VwIGRlcGVuZGVuY2llcyAoT01BUDMgb25seSkKLSAqLwotCi1zdGF0aWMgc3RydWN0IGNsa2RtX2F1dG9kZXAgY2xrZG1fYXV0b2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbQkgICA9IHsgLm5hbWUgPSAibXB1X2Nsa2RtIiB9LAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtCSAgID0geyAubmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAotCQkub21hcF9jaGlwID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKLQl9LAotCXsKLQkJLmNsa2RtCSAgID0geyAubmFtZSA9IE5VTEwgfSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcDJbXSBfX2luaXRkYXRhID0gewotCSZ3a3VwX2Nsa2RtLAotCSZjbV9jbGtkbSwKLQkmcHJtX2Nsa2RtLAotCi0jaWZkZWYgQ09ORklHX1NPQ19PTUFQMjQyMAotCSZtcHVfMjQyMF9jbGtkbSwKLQkmaXZhMV8yNDIwX2Nsa2RtLAotCSZkc3BfMjQyMF9jbGtkbSwKLQkmZ2Z4XzI0MjBfY2xrZG0sCi0JJmNvcmVfbDNfMjQyMF9jbGtkbSwKLQkmY29yZV9sNF8yNDIwX2Nsa2RtLAotCSZkc3NfMjQyMF9jbGtkbSwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NPQ19PTUFQMjQzMAotCSZtcHVfMjQzMF9jbGtkbSwKLQkmbWRtX2Nsa2RtLAotCSZkc3BfMjQzMF9jbGtkbSwKLQkmZ2Z4XzI0MzBfY2xrZG0sCi0JJmNvcmVfbDNfMjQzMF9jbGtkbSwKLQkmY29yZV9sNF8yNDMwX2Nsa2RtLAotCSZkc3NfMjQzMF9jbGtkbSwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKLQkmbXB1XzN4eHhfY2xrZG0sCi0JJm5lb25fY2xrZG0sCi0JJml2YTJfY2xrZG0sCi0JJmdmeF8zNDMwZXMxX2Nsa2RtLAotCSZzZ3hfY2xrZG0sCi0JJmQyZF9jbGtkbSwKLQkmY29yZV9sM18zeHh4X2Nsa2RtLAotCSZjb3JlX2w0XzN4eHhfY2xrZG0sCi0JJmRzc18zeHh4X2Nsa2RtLAotCSZjYW1fY2xrZG0sCi0JJnVzYmhvc3RfY2xrZG0sCi0JJnBlcl9jbGtkbSwKLQkmZW11X2Nsa2RtLAotCSZkcGxsMV9jbGtkbSwKLQkmZHBsbDJfY2xrZG0sCi0JJmRwbGwzX2Nsa2RtLAotCSZkcGxsNF9jbGtkbSwKLQkmZHBsbDVfY2xrZG0sCi0jZW5kaWYKLQlOVUxMLAotfTsKLQotdm9pZCBfX2luaXQgb21hcDJ4eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCkKLXsKLQljbGtkbV9pbml0KGNsb2NrZG9tYWluc19vbWFwMiwgY2xrZG1fYXV0b2RlcHMsICZvbWFwMl9jbGtkbV9vcGVyYXRpb25zKTsKLX0KLQotdm9pZCBfX2luaXQgb21hcDN4eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCkKLXsKLQljbGtkbV9pbml0KGNsb2NrZG9tYWluc19vbWFwMiwgY2xrZG1fYXV0b2RlcHMsICZvbWFwM19jbGtkbV9vcGVyYXRpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zM3h4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczN4eHhfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NGUxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczN4eHhfZGF0YS5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogT01BUDN4eHggY2xvY2tkb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogUGF1bCBXYWxtc2xleSwgSm91bmkgSMO2Z2FuZGVyCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNsb2NrZG9tYWlucyBhbmQgY2xvY2tkb21haW4gd2FrZXVwL3NsZWVwCisgKiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBPTUFQM3h4eCBjaGlwcy4gIFNvbWUgbm90ZXM6CisgKgorICogQSB1c2VmdWwgdmFsaWRhdGlvbiBydWxlIGZvciBzdHJ1Y3QgY2xvY2tkb21haW46IEFueSBjbG9ja2RvbWFpbgorICogcmVmZXJlbmNlZCBieSBhIHdrZGVwX3NyY3Mgb3Igc2xlZXBkZXBfc3JjcyBhcnJheSBtdXN0IGhhdmUgYQorICogZGVwX2JpdCBhc3NpZ25lZC4gIFNvIHdrZGVwX3NyY3Mvc2xlZXBkZXBfc3JjcyBhcmUgcmVhbGx5IGp1c3QKKyAqIHNvZnR3YXJlLWNvbnRyb2xsYWJsZSBkZXBlbmRlbmNpZXMuICBOb24tc29mdHdhcmUtY29udHJvbGxhYmxlCisgKiBkZXBlbmRlbmNpZXMgZG8gZXhpc3QsIGJ1dCB0aGV5IGFyZSBub3QgZW5jb2RlZCBiZWxvdyAoeWV0KS4KKyAqCisgKiBUaGUgb3Zlcmx5LXNwZWNpZmljIGRlcF9iaXQgbmFtZXMgYXJlIGR1ZSB0byBhIGJpdCBuYW1lIGNvbGxpc2lvbgorICogd2l0aCBDTV9GQ0xLRU5fe0RTUCxJVkEyfS4gIFRoZSBEU1AvSVZBMiBQTV9XS0RFUCBhbmQgQ01fU0xFRVBERVAgc2hpZnQKKyAqIHZhbHVlIGFyZSB0aGUgc2FtZSBmb3IgYWxsIHBvd2VyZG9tYWluczogMgorICoKKyAqIFhYWCBzaG91bGQgZGVwX2JpdCBiZSBhIG1hc2ssIHNvIHdlIGNhbiB0ZXN0IHRvIHNlZSBpZiBpdCBpcyAwIGFzIGEKKyAqIHNhbml0eSBjaGVjaz8KKyAqIFhYWCBlbmNvZGUgaGFyZHdhcmUgZml4ZWQgd2FrZXVwIGRlcGVuZGVuY2llcyAtLSBlc3AuIGZvciAzNDMwIENPUkUKKyAqLworCisvKgorICogVG8tRG8gTGlzdAorICogLT4gUG9ydCB0aGUgU2xlZXAvV2FrZXVwIGRlcGVuZGVuY2llcyBmb3IgdGhlIGRvbWFpbnMKKyAqICAgIGZyb20gdGhlIFBvd2VyIGRvbWFpbiBmcmFtZXdvcmsKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImNsb2NrZG9tYWluLmgiCisjaW5jbHVkZSAicHJtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20yeHh4XzN4eHguaCIKKyNpbmNsdWRlICJjbS1yZWdiaXRzLTM0eHguaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0zNHh4LmgiCisKKy8qCisgKiBDbG9ja2RvbWFpbiBkZXBlbmRlbmNpZXMgZm9yIHdrZGVwcy9zbGVlcGRlcHMKKyAqCisgKiBYWFggSGFyZHdhcmUgZGVwZW5kZW5jaWVzIChlLmcuLCBkZXBlbmRlbmNpZXMgdGhhdCBjYW5ub3QgYmUKKyAqIGNoYW5nZWQgaW4gc29mdHdhcmUpIGFyZSBub3QgaW5jbHVkZWQgaGVyZSB5ZXQsIGJ1dCBzaG91bGQgYmUuCisgKi8KKworLyogT01BUDMtc3BlY2lmaWMgcG9zc2libGUgZGVwZW5kZW5jaWVzICovCisKKy8qCisgKiAzNDMwRVMxIFBNX1dLREVQX0dGWDogYWRkcyBJVkEyLCByZW1vdmVzIENPUkUKKyAqIDM0MzBFUzIgUE1fV0tERVBfU0dYOiBhZGRzIElWQTIsIHJlbW92ZXMgQ09SRQorICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBnZnhfc2d4XzN4eHhfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiwgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIsIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiwgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzA6IFBNX1dLREVQX1BFUjogQ09SRSwgSVZBMiwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBwZXJfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMEVTMjogUE1fV0tERVBfVVNCSE9TVDogQ09SRSwgSVZBMiwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCB1c2Job3N0X3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sM19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImNvcmVfbDRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzAgUE1fV0tERVBfTVBVOiBDT1JFLCBJVkEyLCBEU1MsIFBFUiAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbXB1XzN4eHhfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJkc3NfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJwZXJfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwIFBNX1dLREVQX0lWQTI6IENPUkUsIE1QVSwgV0tVUCwgRFNTLCBQRVIgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGl2YTJfd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJjb3JlX2wzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiY29yZV9sNF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIndrdXBfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJkc3NfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJwZXJfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwIFBNX1dLREVQX0NBTTogSVZBMiwgTVBVLCBXS1VQICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBjYW1fd2tkZXBzW10gPSB7CisJeyAuY2xrZG1fbmFtZSA9ICJpdmEyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAid2t1cF9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzAgUE1fV0tERVBfRFNTOiBJVkEyLCBNUFUsIFdLVVAgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGRzc193a2RlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJ3a3VwX2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogMzQzMDogUE1fV0tERVBfTkVPTjogTVBVICovCitzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBuZW9uX3drZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyogU2xlZXAgZGVwZW5kZW5jeSBzb3VyY2UgYXJyYXlzIGZvciBPTUFQMy1zcGVjaWZpYyBjbGtkbXMgKi8KKworLyogMzQzMDogQ01fU0xFRVBERVBfRFNTOiBNUFUsIElWQSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZHNzX3NsZWVwZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhMl9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qIDM0MzA6IENNX1NMRUVQREVQX1BFUjogTVBVLCBJVkEgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIHBlcl9zbGVlcGRlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwRVMyOiBDTV9TTEVFUERFUF9VU0JIT1NUOiBNUFUsIElWQSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgdXNiaG9zdF9zbGVlcGRlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YTJfY2xrZG0iIH0sCisJeyBOVUxMIH0sCit9OworCisvKiAzNDMwOiBDTV9TTEVFUERFUF9DQU06IE1QVSAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgY2FtX3NsZWVwZGVwc1tdID0geworCXsgLmNsa2RtX25hbWUgPSAibXB1X2Nsa2RtIiB9LAorCXsgTlVMTCB9LAorfTsKKworLyoKKyAqIDM0MzBFUzE6IENNX1NMRUVQREVQX0dGWDogTVBVCisgKiAzNDMwRVMyOiBDTV9TTEVFUERFUF9TR1g6IE1QVQorICogVGhlc2UgY2FuIHNoYXJlIGRhdGEgc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgc2ltdWx0YW5lb3VzbHkKKyAqIG9uIHRoZSBzYW1lIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgZ2Z4X3NneF9zbGVlcGRlcHNbXSA9IHsKKwl7IC5jbGtkbV9uYW1lID0gIm1wdV9jbGtkbSIgfSwKKwl7IE5VTEwgfSwKK307CisKKy8qCisgKiBPTUFQMyBjbG9ja2RvbWFpbnMKKyAqLworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG1wdV8zeHh4X2Nsa2RtID0geworCS5uYW1lCQk9ICJtcHVfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gIm1wdV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQIHwgQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCwKKwkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX01QVV9TSElGVCwKKwkud2tkZXBfc3Jjcwk9IG1wdV8zeHh4X3drZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTVBVX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIG5lb25fY2xrZG0gPSB7CisJLm5hbWUJCT0gIm5lb25fY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gIm5lb25fcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IG5lb25fd2tkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9ORU9OX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGl2YTJfY2xrZG0gPSB7CisJLm5hbWUJCT0gIml2YTJfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gIml2YTJfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9JVkEyX1NISUZULAorCS53a2RlcF9zcmNzCT0gaXZhMl93a2RlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0lWQTJfTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gZ2Z4XzM0MzBlczFfY2xrZG0gPSB7CisJLm5hbWUJCT0gImdmeF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiZ2Z4X3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLndrZGVwX3NyY3MJPSBnZnhfc2d4XzN4eHhfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gZ2Z4X3NneF9zbGVlcGRlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzFfQ0xLVFJDVFJMX0dGWF9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBzZ3hfY2xrZG0gPSB7CisJLm5hbWUJCT0gInNneF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAic2d4X3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLndrZGVwX3NyY3MJPSBnZnhfc2d4XzN4eHhfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gZ2Z4X3NneF9zbGVlcGRlcHMsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzJfQ0xLVFJDVFJMX1NHWF9NQVNLLAorfTsKKworLyoKKyAqIFRoZSBkaWUtdG8tZGllIGNsb2NrZG9tYWluIHdhcyBkb2N1bWVudGVkIGluIHRoZSAzNHh4IEVTMSBUUk0sIGJ1dAorICogdGhlbiB0aGF0IGluZm9ybWF0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIDM0eHggRVMyKyBUUk0uICBJdCBpcworICogdW5jbGVhciB3aGV0aGVyIHRoZSBjb3JlIGlzIHN0aWxsIHRoZXJlLCBidXQgdGhlIGNsb2NrZG9tYWluIGxvZ2ljCisgKiBpcyB0aGVyZSwgYW5kIG11c3QgYmUgcHJvZ3JhbW1lZCB0byBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBpZiB0aGUKKyAqIENPUkUgY2xvY2tkb21haW4gaXMgdG8gYmVjb21lIGluYWN0aXZlLgorICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGQyZF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZDJkX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjb3JlX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBFUzFfQ0xLVFJDVFJMX0QyRF9NQVNLLAorfTsKKworLyoKKyAqIFhYWCBhZGQgdXNlY291bnRpbmcgZm9yIGNsa2RtIGRlcGVuZGVuY2llcywgb3RoZXJ3aXNlIHRoZSBwcmVzZW5jZQorICogb2YgYSBzaW5nbGUgZGVwIGJpdCBmb3IgY29yZV9sM18zeHh4X2Nsa2RtIGFuZCBjb3JlX2w0XzN4eHhfY2xrZG0KKyAqIGNvdWxkIGNhdXNlIHRyb3VibGUKKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBjb3JlX2wzXzN4eHhfY2xrZG0gPSB7CisJLm5hbWUJCT0gImNvcmVfbDNfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImNvcmVfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAzNDMwX0VOX0NPUkVfU0hJRlQsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0wzX01BU0ssCit9OworCisvKgorICogWFhYIGFkZCB1c2Vjb3VudGluZyBmb3IgY2xrZG0gZGVwZW5kZW5jaWVzLCBvdGhlcndpc2UgdGhlIHByZXNlbmNlCisgKiBvZiBhIHNpbmdsZSBkZXAgYml0IGZvciBjb3JlX2wzXzN4eHhfY2xrZG0gYW5kIGNvcmVfbDRfM3h4eF9jbGtkbQorICogY291bGQgY2F1c2UgdHJvdWJsZQorICovCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNvcmVfbDRfM3h4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY29yZV9sNF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiY29yZV9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQLAorCS5kZXBfYml0CT0gT01BUDM0MzBfRU5fQ09SRV9TSElGVCwKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfTDRfTUFTSywKK307CisKKy8qIEFub3RoZXIgY2FzZSBvZiBiaXQgbmFtZSBjb2xsaXNpb25zIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnM6IEVOX0RTUyAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkc3NfM3h4eF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHNzX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJkc3NfcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkuZGVwX2JpdAk9IE9NQVAzNDMwX1BNX1dLREVQX01QVV9FTl9EU1NfU0hJRlQsCisJLndrZGVwX3NyY3MJPSBkc3Nfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gZHNzX3NsZWVwZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfRFNTX01BU0ssCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGNhbV9jbGtkbSA9IHsKKwkubmFtZQkJPSAiY2FtX2Nsa2RtIiwKKwkucHdyZG0JCT0geyAubmFtZSA9ICJjYW1fcHdyZG0iIH0sCisJLmZsYWdzCQk9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKKwkud2tkZXBfc3Jjcwk9IGNhbV93a2RlcHMsCisJLnNsZWVwZGVwX3NyY3MJPSBjYW1fc2xlZXBkZXBzLAorCS5jbGt0cmN0cmxfbWFzayA9IE9NQVAzNDMwX0NMS1RSQ1RSTF9DQU1fTUFTSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gdXNiaG9zdF9jbGtkbSA9IHsKKwkubmFtZQkJPSAidXNiaG9zdF9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAidXNiaG9zdF9wd3JkbSIgfSwKKwkuZmxhZ3MJCT0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAorCS53a2RlcF9zcmNzCT0gdXNiaG9zdF93a2RlcHMsCisJLnNsZWVwZGVwX3NyY3MJPSB1c2Job3N0X3NsZWVwZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMEVTMl9DTEtUUkNUUkxfVVNCSE9TVF9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBwZXJfY2xrZG0gPSB7CisJLm5hbWUJCT0gInBlcl9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAicGVyX3B3cmRtIiB9LAorCS5mbGFncwkJPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCisJLmRlcF9iaXQJPSBPTUFQMzQzMF9FTl9QRVJfU0hJRlQsCisJLndrZGVwX3NyY3MJPSBwZXJfd2tkZXBzLAorCS5zbGVlcGRlcF9zcmNzCT0gcGVyX3NsZWVwZGVwcywKKwkuY2xrdHJjdHJsX21hc2sgPSBPTUFQMzQzMF9DTEtUUkNUUkxfUEVSX01BU0ssCit9OworCisvKgorICogRGlzYWJsZSBodyBzdXBlcnZpc2VkIG1vZGUgZm9yIGVtdV9jbGtkbSwgYmVjYXVzZSBlbXVfcHdyZG0gaXMKKyAqIHN3aXRjaGVkIG9mIGV2ZW4gaWYgc2R0aSBpcyBpbiB1c2UKKyAqLworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBlbXVfY2xrZG0gPSB7CisJLm5hbWUJCT0gImVtdV9jbGtkbSIsCisJLnB3cmRtCQk9IHsgLm5hbWUgPSAiZW11X3B3cmRtIiB9LAorCS5mbGFncwkJPSAvKiBDTEtETV9DQU5fRU5BQkxFX0FVVE8gfCAgKi9DTEtETV9DQU5fU1dTVVAsCisJLmNsa3RyY3RybF9tYXNrID0gT01BUDM0MzBfQ0xLVFJDVFJMX0VNVV9NQVNLLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsMV9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHBsbDFfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGwxX3B3cmRtIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsMl9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHBsbDJfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGwyX3B3cmRtIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsM19jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHBsbDNfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGwzX3B3cmRtIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsNF9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHBsbDRfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGw0X3B3cmRtIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBkcGxsNV9jbGtkbSA9IHsKKwkubmFtZQkJPSAiZHBsbDVfY2xrZG0iLAorCS5wd3JkbQkJPSB7IC5uYW1lID0gImRwbGw1X3B3cmRtIiB9LAorfTsKKworLyoKKyAqIENsb2NrZG9tYWluIGh3c3VwIGRlcGVuZGVuY2llcworICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrZG1fYXV0b2RlcCBjbGtkbV9hdXRvZGVwc1tdID0geworCXsKKwkJLmNsa2RtID0geyAubmFtZSA9ICJtcHVfY2xrZG0iIH0sCisJfSwKKwl7CisJCS5jbGtkbSA9IHsgLm5hbWUgPSAiaXZhMl9jbGtkbSIgfSwKKwl9LAorCXsKKwkJLmNsa2RtID0geyAubmFtZSA9IE5VTEwgfSwKKwl9Cit9OworCisvKgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcDM0MzBfY29tbW9uW10gX19pbml0ZGF0YSA9IHsKKwkmd2t1cF9jb21tb25fY2xrZG0sCisJJmNtX2NvbW1vbl9jbGtkbSwKKwkmcHJtX2NvbW1vbl9jbGtkbSwKKwkmbXB1XzN4eHhfY2xrZG0sCisJJm5lb25fY2xrZG0sCisJJml2YTJfY2xrZG0sCisJJmQyZF9jbGtkbSwKKwkmY29yZV9sM18zeHh4X2Nsa2RtLAorCSZjb3JlX2w0XzN4eHhfY2xrZG0sCisJJmRzc18zeHh4X2Nsa2RtLAorCSZjYW1fY2xrZG0sCisJJnBlcl9jbGtkbSwKKwkmZW11X2Nsa2RtLAorCSZkcGxsMV9jbGtkbSwKKwkmZHBsbDJfY2xrZG0sCisJJmRwbGwzX2Nsa2RtLAorCSZkcGxsNF9jbGtkbSwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluICpjbG9ja2RvbWFpbnNfb21hcDM0MzBlczFbXSBfX2luaXRkYXRhID0geworCSZnZnhfMzQzMGVzMV9jbGtkbSwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiAqY2xvY2tkb21haW5zX29tYXAzNDMwZXMycGx1c1tdIF9faW5pdGRhdGEgPSB7CisJJnNneF9jbGtkbSwKKwkmZHBsbDVfY2xrZG0sCisJJnVzYmhvc3RfY2xrZG0sCisJTlVMTCwKK307CisKK3ZvaWQgX19pbml0IG9tYXAzeHh4X2Nsb2NrZG9tYWluc19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsb2NrZG9tYWluICoqc2M7CisKKwlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKQorCQlyZXR1cm47CisKKwljbGtkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDNfY2xrZG1fb3BlcmF0aW9ucyk7CisJY2xrZG1fcmVnaXN0ZXJfY2xrZG1zKGNsb2NrZG9tYWluc19vbWFwMzQzMF9jb21tb24pOworCisJc2MgPSAob21hcF9yZXYoKSA9PSBPTUFQMzQzMF9SRVZfRVMxXzApID8gY2xvY2tkb21haW5zX29tYXAzNDMwZXMxIDoKKwkJY2xvY2tkb21haW5zX29tYXAzNDMwZXMycGx1czsKKworCWNsa2RtX3JlZ2lzdGVyX2Nsa2RtcyhzYyk7CisKKwljbGtkbV9yZWdpc3Rlcl9hdXRvZGVwcyhjbGtkbV9hdXRvZGVwcyk7CisJY2xrZG1fY29tcGxldGVfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnM0NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW5zNDR4eF9kYXRhLmMKaW5kZXggZGNjYzY1MS4uOTI5OWFjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbnM0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluczQ0eHhfZGF0YS5jCkBAIC0zNCwzNTAgKzM0LDEyMiBAQAogLyogU3RhdGljIERlcGVuZGVuY2llcyBmb3IgT01BUDQgQ2xvY2sgRG9tYWlucyAqLwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBkMmRfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiYWJlX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19pbml0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfY2ZnX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfcGVyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJhYmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzFfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18yX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2luaXRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9jZmdfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9wZXJfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBkdWNhdGlfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiYWJlX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2Rzc19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19nZnhfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19pbml0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfY2ZnX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfcGVyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfc2VjdXJlX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfd2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gInRlc2xhX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJhYmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzFfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18yX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZHNzX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2dmeF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2luaXRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9jZmdfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9wZXJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF9zZWN1cmVfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsNF93a3VwX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAidGVzbGFfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBpc3Nfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGl2YWhkX3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGwzX2RtYV93a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJhYmVfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJkdWNhdGlfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzFfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19kc3NfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3NlY3VyZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3drdXBfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gImFiZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImR1Y2F0aV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2Rzc19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19pbml0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfY2ZnX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfc2VjdXJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfd2t1cF9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrZG1fZGVwIGwzX2Rzc193a3VwX3NsZWVwX2RlcHNbXSA9IHsKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJpdmFoZF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCisJeyAuY2xrZG1fbmFtZSA9ICJpdmFoZF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzJfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbDNfZ2Z4X3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBsM19pbml0X3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZW1pZl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3NlY3VyZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3drdXBfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gImFiZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gIml2YWhkX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfZW1pZl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X2NmZ19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3Blcl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3NlY3VyZV9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImw0X3drdXBfY2xrZG0iIH0sCiAJeyBOVUxMIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa2RtX2RlcCBsNF9zZWN1cmVfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsNF9wZXJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzXzFfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19lbWlmX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgbXB1X3drdXBfc2xlZXBfZGVwc1tdID0gewotCXsKLQkJLmNsa2RtX25hbWUJID0gImFiZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImR1Y2F0aV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gIml2YWhkX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzXzJfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19kc3NfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19lbWlmX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfZ2Z4X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfaW5pdF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X2NmZ19jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3Blcl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3NlY3VyZV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImw0X3drdXBfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJ0ZXNsYV9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiYWJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiZHVjYXRpX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2Rzc19jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19nZnhfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19pbml0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfY2ZnX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfc2VjdXJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfd2t1cF9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gInRlc2xhX2Nsa2RtIiB9LAogCXsgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtkbV9kZXAgdGVzbGFfd2t1cF9zbGVlcF9kZXBzW10gPSB7Ci0JewotCQkuY2xrZG1fbmFtZQkgPSAiYWJlX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAiaXZhaGRfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM18xX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDNfMl9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAotCXsKLQkJLmNsa2RtX25hbWUJID0gImwzX2VtaWZfY2xrZG0iLAotCQkub21hcF9jaGlwCSA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApCi0JfSwKLQl7Ci0JCS5jbGtkbV9uYW1lCSA9ICJsM19pbml0X2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfY2ZnX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfcGVyX2Nsa2RtIiwKLQkJLm9tYXBfY2hpcAkgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKQotCX0sCi0JewotCQkuY2xrZG1fbmFtZQkgPSAibDRfd2t1cF9jbGtkbSIsCi0JCS5vbWFwX2NoaXAJID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCkKLQl9LAorCXsgLmNsa2RtX25hbWUgPSAiYWJlX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAiaXZhaGRfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM18xX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDNfMl9jbGtkbSIgfSwKKwl7IC5jbGtkbV9uYW1lID0gImwzX2VtaWZfY2xrZG0iIH0sCisJeyAuY2xrZG1fbmFtZSA9ICJsM19pbml0X2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfY2ZnX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfcGVyX2Nsa2RtIiB9LAorCXsgLmNsa2RtX25hbWUgPSAibDRfd2t1cF9jbGtkbSIgfSwKIAl7IE5VTEwgfSwKIH07CiAKQEAgLTM4OCw3ICsxNjAsNiBAQAogCS5jbV9pbnN0CSAgPSBPTUFQNDQzMF9DTTJfQ0VGVVNFX0lOU1QsCiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9DRUZVU0VfQ0VGVVNFX0NET0ZGUywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsNF9jZmdfNDR4eF9jbGtkbSA9IHsKQEAgLTM5OSw3ICsxNzAsNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9MNENGR19DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX0w0Q0ZHX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiB0ZXNsYV80NHh4X2Nsa2RtID0gewpAQCAtNDEyLDcgKzE4Miw2IEBACiAJLndrZGVwX3NyY3MJICA9IHRlc2xhX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gdGVzbGFfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfZ2Z4XzQ0eHhfY2xrZG0gPSB7CkBAIC00MjUsNyArMTk0LDYgQEAKIAkud2tkZXBfc3JjcwkgID0gbDNfZ2Z4X3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbDNfZ2Z4X3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGl2YWhkXzQ0eHhfY2xrZG0gPSB7CkBAIC00MzgsNyArMjA2LDYgQEAKIAkud2tkZXBfc3JjcwkgID0gaXZhaGRfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBpdmFoZF93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsNF9zZWN1cmVfNDR4eF9jbGtkbSA9IHsKQEAgLTQ1MSw3ICsyMTgsNiBAQAogCS53a2RlcF9zcmNzCSAgPSBsNF9zZWN1cmVfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBsNF9zZWN1cmVfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDRfcGVyXzQ0eHhfY2xrZG0gPSB7CkBAIC00NjIsNyArMjI4LDYgQEAKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfQ00yX0w0UEVSX0w0UEVSX0NET0ZGUywKIAkuZGVwX2JpdAkgID0gT01BUDQ0MzBfTDRQRVJfU1RBVERFUF9TSElGVCwKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGFiZV80NHh4X2Nsa2RtID0gewpAQCAtNDczLDcgKzIzOCw2IEBACiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMV9BQkVfQUJFX0NET0ZGUywKIAkuZGVwX2JpdAkgID0gT01BUDQ0MzBfQUJFX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM19pbnN0cl80NHh4X2Nsa2RtID0gewpAQCAtNDgyLDcgKzI0Niw2IEBACiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9DTTJfUEFSVElUSU9OLAogCS5jbV9pbnN0CSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9JTlNULAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9MM0lOU1RSX0NET0ZGUywKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfaW5pdF80NHh4X2Nsa2RtID0gewpAQCAtNDk1LDcgKzI1OCw2IEBACiAJLndrZGVwX3NyY3MJICA9IGwzX2luaXRfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBsM19pbml0X3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGQyZF80NHh4X2Nsa2RtID0gewpAQCAtNTA3LDcgKzI2OSw2IEBACiAJLndrZGVwX3NyY3MJICA9IGQyZF93a3VwX3NsZWVwX2RlcHMsCiAJLnNsZWVwZGVwX3NyY3MJICA9IGQyZF93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbXB1MF80NHh4X2Nsa2RtID0gewpAQCAtNTE3LDcgKzI3OCw2IEBACiAJLmNtX2luc3QJICA9IE9NQVA0NDMwX1BSQ01fTVBVX0NQVTBfSU5TVCwKIAkuY2xrZG1fb2ZmcwkgID0gT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMF9DUFUwX0NET0ZGUywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fRk9SQ0VfV0FLRVVQIHwgQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHUxXzQ0eHhfY2xrZG0gPSB7CkBAIC01MjcsNyArMjg3LDYgQEAKIAkuY21faW5zdAkgID0gT01BUDQ0MzBfUFJDTV9NUFVfQ1BVMV9JTlNULAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0NQVTFfQ0RPRkZTLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzX2VtaWZfNDR4eF9jbGtkbSA9IHsKQEAgLTUzOCw3ICsyOTcsNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9NRU1JRl9DRE9GRlMsCiAJLmRlcF9iaXQJICA9IE9NQVA0NDMwX01FTUlGX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0ZPUkNFX1dBS0VVUCB8IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDRfYW9fNDR4eF9jbGtkbSA9IHsKQEAgLTU0OCw3ICszMDYsNiBAQAogCS5jbV9pbnN0CSAgPSBPTUFQNDQzMF9DTTJfQUxXQVlTX09OX0lOU1QsCiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9BTFdBWVNfT05fQUxXT05fQ0RPRkZTLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGR1Y2F0aV80NHh4X2Nsa2RtID0gewpAQCAtNTYxLDcgKzMxOCw2IEBACiAJLndrZGVwX3NyY3MJICA9IGR1Y2F0aV93a3VwX3NsZWVwX2RlcHMsCiAJLnNsZWVwZGVwX3NyY3MJICA9IGR1Y2F0aV93a3VwX3NsZWVwX2RlcHMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQX1NXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBtcHVfNDR4eF9jbGtkbSA9IHsKQEAgLTU3Myw3ICszMjksNiBAQAogCS53a2RlcF9zcmNzCSAgPSBtcHVfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBtcHVfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGwzXzJfNDR4eF9jbGtkbSA9IHsKQEAgLTU4NCw3ICszMzksNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9DTTJfQ09SRV9MM18yX0NET0ZGUywKIAkuZGVwX2JpdAkgID0gT01BUDQ0MzBfTDNfMl9TVEFUREVQX1NISUZULAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfMV80NHh4X2Nsa2RtID0gewpAQCAtNTk1LDcgKzM0OSw2IEBACiAJLmNsa2RtX29mZnMJICA9IE9NQVA0NDMwX0NNMl9DT1JFX0wzXzFfQ0RPRkZTLAogCS5kZXBfYml0CSAgPSBPTUFQNDQzMF9MM18xX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBpc3NfNDR4eF9jbGtkbSA9IHsKQEAgLTYwNyw3ICszNjAsNiBAQAogCS53a2RlcF9zcmNzCSAgPSBpc3Nfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBpc3Nfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9IV1NVUF9TV1NVUCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tkb21haW4gbDNfZHNzXzQ0eHhfY2xrZG0gPSB7CkBAIC02MjAsNyArMzcyLDYgQEAKIAkud2tkZXBfc3JjcwkgID0gbDNfZHNzX3drdXBfc2xlZXBfZGVwcywKIAkuc2xlZXBkZXBfc3JjcwkgID0gbDNfZHNzX3drdXBfc2xlZXBfZGVwcywKIAkuZmxhZ3MJCSAgPSBDTEtETV9DQU5fSFdTVVBfU1dTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsb2NrZG9tYWluIGw0X3drdXBfNDR4eF9jbGtkbSA9IHsKQEAgLTYzMSw3ICszODIsNiBAQAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fV0tVUF9DTV9XS1VQX0NET0ZGUywKIAkuZGVwX2JpdAkgID0gT01BUDQ0MzBfTDRXS1VQX1NUQVRERVBfU0hJRlQsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBlbXVfc3lzXzQ0eHhfY2xrZG0gPSB7CkBAIC02NDEsNyArMzkxLDYgQEAKIAkuY21faW5zdAkgID0gT01BUDQ0MzBfUFJNX0VNVV9DTV9JTlNULAogCS5jbGtkbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fRU1VX0NNX0VNVV9DRE9GRlMsCiAJLmZsYWdzCQkgID0gQ0xLRE1fQ0FOX0hXU1VQLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbG9ja2RvbWFpbiBsM19kbWFfNDR4eF9jbGtkbSA9IHsKQEAgLTY1Myw3ICs0MDIsNiBAQAogCS53a2RlcF9zcmNzCSAgPSBsM19kbWFfd2t1cF9zbGVlcF9kZXBzLAogCS5zbGVlcGRlcF9zcmNzCSAgPSBsM19kbWFfd2t1cF9zbGVlcF9kZXBzLAogCS5mbGFncwkJICA9IENMS0RNX0NBTl9GT1JDRV9XQUtFVVAgfCBDTEtETV9DQU5fSFdTVVAsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBBcyBjbG9ja2RvbWFpbnMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgYWJvdmUsIHRoaXMgbGlzdCBtdXN0IGFsc28gYmUgY2hhbmdlZCAqLwpAQCAtNjg1LDcgKzQzMywxMCBAQAogCU5VTEwKIH07CiAKKwogdm9pZCBfX2luaXQgb21hcDQ0eHhfY2xvY2tkb21haW5zX2luaXQodm9pZCkKIHsKLQljbGtkbV9pbml0KGNsb2NrZG9tYWluc19vbWFwNDR4eCwgTlVMTCwgJm9tYXA0X2Nsa2RtX29wZXJhdGlvbnMpOworCWNsa2RtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCZvbWFwNF9jbGtkbV9vcGVyYXRpb25zKTsKKwljbGtkbV9yZWdpc3Rlcl9jbGtkbXMoY2xvY2tkb21haW5zX29tYXA0NHh4KTsKKwljbGtkbV9jb21wbGV0ZV9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24uYwppbmRleCAzZjIwY2JiLi4xMTBlNWI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLmMKQEAgLTQ1LDE3ICs0NSwyMiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2dsb2JhbHMgb21hcDI0MnhfZ2xvYmFscyA9IHsKIAkuY2xhc3MJPSBPTUFQMjQyWF9DTEFTUywKIAkudGFwCT0gT01BUDJfTDRfSU9fQUREUkVTUygweDQ4MDE0MDAwKSwKLQkuc2RyYwk9IE9NQVAyNDIwX1NEUkNfQkFTRSwKLQkuc21zCT0gT01BUDI0MjBfU01TX0JBU0UsCi0JLmN0cmwJPSBPTUFQMjQyWF9DVFJMX0JBU0UsCi0JLnBybQk9IE9NQVAyNDIwX1BSTV9CQVNFLAotCS5jbQk9IE9NQVAyNDIwX0NNX0JBU0UsCisJLnNkcmMJPSBPTUFQMl9MM19JT19BRERSRVNTKE9NQVAyNDIwX1NEUkNfQkFTRSksCisJLnNtcwk9IE9NQVAyX0wzX0lPX0FERFJFU1MoT01BUDI0MjBfU01TX0JBU0UpLAorCS5jdHJsCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQyWF9DVFJMX0JBU0UpLAorCS5wcm0JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNDIwX1BSTV9CQVNFKSwKKwkuY20JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNDIwX0NNX0JBU0UpLAogfTsKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfMjQyeCh2b2lkKQogewogCV9fb21hcDJfc2V0X2dsb2JhbHMoJm9tYXAyNDJ4X2dsb2JhbHMpOwogfQorCit2b2lkIF9faW5pdCBvbWFwMjQyeF9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMjQyeF9tYXBfY29tbW9uX2lvKCk7Cit9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NPQ19PTUFQMjQzMCkKQEAgLTYzLDE3ICs2OCwyMiBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2dsb2JhbHMgb21hcDI0M3hfZ2xvYmFscyA9IHsKIAkuY2xhc3MJPSBPTUFQMjQzWF9DTEFTUywKIAkudGFwCT0gT01BUDJfTDRfSU9fQUREUkVTUygweDQ5MDBhMDAwKSwKLQkuc2RyYwk9IE9NQVAyNDNYX1NEUkNfQkFTRSwKLQkuc21zCT0gT01BUDI0M1hfU01TX0JBU0UsCi0JLmN0cmwJPSBPTUFQMjQzWF9DVFJMX0JBU0UsCi0JLnBybQk9IE9NQVAyNDMwX1BSTV9CQVNFLAotCS5jbQk9IE9NQVAyNDMwX0NNX0JBU0UsCisJLnNkcmMJPSBPTUFQMl9MM19JT19BRERSRVNTKE9NQVAyNDNYX1NEUkNfQkFTRSksCisJLnNtcwk9IE9NQVAyX0wzX0lPX0FERFJFU1MoT01BUDI0M1hfU01TX0JBU0UpLAorCS5jdHJsCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMjQzWF9DVFJMX0JBU0UpLAorCS5wcm0JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNDMwX1BSTV9CQVNFKSwKKwkuY20JPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVAyNDMwX0NNX0JBU0UpLAogfTsKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfMjQzeCh2b2lkKQogewogCV9fb21hcDJfc2V0X2dsb2JhbHMoJm9tYXAyNDN4X2dsb2JhbHMpOwogfQorCit2b2lkIF9faW5pdCBvbWFwMjQzeF9tYXBfaW8odm9pZCkKK3sKKwlvbWFwMjQzeF9tYXBfY29tbW9uX2lvKCk7Cit9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCkBAIC04MSwxMSArOTEsMTEgQEAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9nbG9iYWxzIG9tYXAzX2dsb2JhbHMgPSB7CiAJLmNsYXNzCT0gT01BUDM0M1hfQ0xBU1MsCiAJLnRhcAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoMHg0ODMwQTAwMCksCi0JLnNkcmMJPSBPTUFQMzQzWF9TRFJDX0JBU0UsCi0JLnNtcwk9IE9NQVAzNDNYX1NNU19CQVNFLAotCS5jdHJsCT0gT01BUDM0M1hfQ1RSTF9CQVNFLAotCS5wcm0JPSBPTUFQMzQzMF9QUk1fQkFTRSwKLQkuY20JPSBPTUFQMzQzMF9DTV9CQVNFLAorCS5zZHJjCT0gT01BUDJfTDNfSU9fQUREUkVTUyhPTUFQMzQzWF9TRFJDX0JBU0UpLAorCS5zbXMJPSBPTUFQMl9MM19JT19BRERSRVNTKE9NQVAzNDNYX1NNU19CQVNFKSwKKwkuY3RybAk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDM0M1hfQ1RSTF9CQVNFKSwKKwkucHJtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMzQzMF9QUk1fQkFTRSksCisJLmNtCT0gT01BUDJfTDRfSU9fQUREUkVTUyhPTUFQMzQzMF9DTV9CQVNFKSwKIH07CiAKIHZvaWQgX19pbml0IG9tYXAyX3NldF9nbG9iYWxzXzN4eHgodm9pZCkKQEAgLTk1LDcgKzEwNSw2IEBACiAKIHZvaWQgX19pbml0IG9tYXAzX21hcF9pbyh2b2lkKQogewotCW9tYXAyX3NldF9nbG9iYWxzXzN4eHgoKTsKIAlvbWFwMzR4eF9tYXBfY29tbW9uX2lvKCk7CiB9CiAKQEAgLTExMCw5ICsxMTksOSBAQAogc3RhdGljIHN0cnVjdCBvbWFwX2dsb2JhbHMgdGk4MTZ4X2dsb2JhbHMgPSB7CiAJLmNsYXNzICA9IE9NQVAzNDNYX0NMQVNTLAogCS50YXAgICAgPSBPTUFQMl9MNF9JT19BRERSRVNTKFRJODE2WF9UQVBfQkFTRSksCi0JLmN0cmwgICA9IFRJODE2WF9DVFJMX0JBU0UsCi0JLnBybSAgICA9IFRJODE2WF9QUkNNX0JBU0UsCi0JLmNtICAgICA9IFRJODE2WF9QUkNNX0JBU0UsCisJLmN0cmwgICA9IE9NQVAyX0w0X0lPX0FERFJFU1MoVEk4MTZYX0NUUkxfQkFTRSksCisJLnBybSAgICA9IE9NQVAyX0w0X0lPX0FERFJFU1MoVEk4MTZYX1BSQ01fQkFTRSksCisJLmNtICAgICA9IE9NQVAyX0w0X0lPX0FERFJFU1MoVEk4MTZYX1BSQ01fQkFTRSksCiB9OwogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc190aTgxNngodm9pZCkKQEAgLTEyNSwxMSArMTM0LDExIEBACiBzdGF0aWMgc3RydWN0IG9tYXBfZ2xvYmFscyBvbWFwNF9nbG9iYWxzID0gewogCS5jbGFzcwk9IE9NQVA0NDNYX0NMQVNTLAogCS50YXAJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDNYX1NDTV9CQVNFKSwKLQkuY3RybAk9IE9NQVA0NDNYX1NDTV9CQVNFLAotCS5jdHJsX3BhZAk9IE9NQVA0NDNYX0NUUkxfQkFTRSwKLQkucHJtCT0gT01BUDQ0MzBfUFJNX0JBU0UsCi0JLmNtCT0gT01BUDQ0MzBfQ01fQkFTRSwKLQkuY20yCT0gT01BUDQ0MzBfQ00yX0JBU0UsCisJLmN0cmwJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDNYX1NDTV9CQVNFKSwKKwkuY3RybF9wYWQJPSBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NDNYX0NUUkxfQkFTRSksCisJLnBybQk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDQ0MzBfUFJNX0JBU0UpLAorCS5jbQk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDQ0MzBfQ01fQkFTRSksCisJLmNtMgk9IE9NQVAyX0w0X0lPX0FERFJFU1MoT01BUDQ0MzBfQ00yX0JBU0UpLAogfTsKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfNDQzeCh2b2lkKQpAQCAtMTM4LDUgKzE0NywxMCBAQAogCW9tYXAyX3NldF9nbG9iYWxzX2NvbnRyb2woJm9tYXA0X2dsb2JhbHMpOwogCW9tYXAyX3NldF9nbG9iYWxzX3ByY20oJm9tYXA0X2dsb2JhbHMpOwogfQorCit2b2lkIF9faW5pdCBvbWFwNF9tYXBfaW8odm9pZCkKK3sKKwlvbWFwNDR4eF9tYXBfY29tbW9uX2lvKCk7Cit9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb250cm9sLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbnRyb2wuYwppbmRleCBhYWI4ODRmLi5lMzRkMjdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbnRyb2wuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbnRyb2wuYwpAQCAtMTQ5LDE3ICsxNDksMTEgQEAKIAogdm9pZCBfX2luaXQgb21hcDJfc2V0X2dsb2JhbHNfY29udHJvbChzdHJ1Y3Qgb21hcF9nbG9iYWxzICpvbWFwMl9nbG9iYWxzKQogewotCS8qIFN0YXRpYyBtYXBwaW5nLCBuZXZlciByZWxlYXNlZCAqLwotCWlmIChvbWFwMl9nbG9iYWxzLT5jdHJsKSB7Ci0JCW9tYXAyX2N0cmxfYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+Y3RybCwgU1pfNEspOwotCQlXQVJOX09OKCFvbWFwMl9jdHJsX2Jhc2UpOwotCX0KKwlpZiAob21hcDJfZ2xvYmFscy0+Y3RybCkKKwkJb21hcDJfY3RybF9iYXNlID0gb21hcDJfZ2xvYmFscy0+Y3RybDsKIAotCS8qIFN0YXRpYyBtYXBwaW5nLCBuZXZlciByZWxlYXNlZCAqLwotCWlmIChvbWFwMl9nbG9iYWxzLT5jdHJsX3BhZCkgewotCQlvbWFwNF9jdHJsX3BhZF9iYXNlID0gaW9yZW1hcChvbWFwMl9nbG9iYWxzLT5jdHJsX3BhZCwgU1pfNEspOwotCQlXQVJOX09OKCFvbWFwNF9jdHJsX3BhZF9iYXNlKTsKLQl9CisJaWYgKG9tYXAyX2dsb2JhbHMtPmN0cmxfcGFkKQorCQlvbWFwNF9jdHJsX3BhZF9iYXNlID0gb21hcDJfZ2xvYmFscy0+Y3RybF9wYWQ7CiB9CiAKIHZvaWQgX19pb21lbSAqb21hcF9jdHJsX2Jhc2VfZ2V0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGUzNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGUzNHh4LmMKaW5kZXggNGJmNmU2ZS4uMWZlMzVjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY3B1aWRsZTM0eHguYwpAQCAtODgsMTcgKzg4LDIxIEBACiAvKioKICAqIG9tYXAzX2VudGVyX2lkbGUgLSBQcm9ncmFtcyBPTUFQMyB0byBlbnRlciB0aGUgc3BlY2lmaWVkIHN0YXRlCiAgKiBAZGV2OiBjcHVpZGxlIGRldmljZQotICogQHN0YXRlOiBUaGUgdGFyZ2V0IHN0YXRlIHRvIGJlIHByb2dyYW1tZWQKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCisgKiBAaW5kZXg6IHRoZSBpbmRleCBvZiBzdGF0ZSB0byBiZSBlbnRlcmVkCiAgKgogICogQ2FsbGVkIGZyb20gdGhlIENQVWlkbGUgZnJhbWV3b3JrIHRvIHByb2dyYW0gdGhlIGRldmljZSB0byB0aGUKICAqIHNwZWNpZmllZCB0YXJnZXQgc3RhdGUgc2VsZWN0ZWQgYnkgdGhlIGdvdmVybm9yLgogICovCiBzdGF0aWMgaW50IG9tYXAzX2VudGVyX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJaW50IGluZGV4KQogewotCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3ggPQorCQkJY3B1aWRsZV9nZXRfc3RhdGVkYXRhKCZkZXYtPnN0YXRlc191c2FnZVtpbmRleF0pOwogCXN0cnVjdCB0aW1lc3BlYyB0c19wcmVpZGxlLCB0c19wb3N0aWRsZSwgdHNfaWRsZTsKIAl1MzIgbXB1X3N0YXRlID0gY3gtPm1wdV9zdGF0ZSwgY29yZV9zdGF0ZSA9IGN4LT5jb3JlX3N0YXRlOworCWludCBpZGxlX3RpbWU7CiAKIAkvKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHRvdGFsIHRpbWUgaW4gaWRsZSAqLwogCWdldG5zdGltZW9mZGF5KCZ0c19wcmVpZGxlKTsKQEAgLTExMyw3ICsxMTcsNyBAQAogCQlnb3RvIHJldHVybl9zbGVlcF90aW1lOwogCiAJLyogRGVueSBpZGxlIGZvciBDMSAqLwotCWlmIChzdGF0ZSA9PSAmZGV2LT5zdGF0ZXNbMF0pIHsKKwlpZiAoaW5kZXggPT0gMCkgewogCQlwd3JkbV9mb3JfZWFjaF9jbGtkbShtcHVfcGQsIF9jcHVpZGxlX2RlbnlfaWRsZSk7CiAJCXB3cmRtX2Zvcl9lYWNoX2Nsa2RtKGNvcmVfcGQsIF9jcHVpZGxlX2RlbnlfaWRsZSk7CiAJfQpAQCAtMTIyLDcgKzEyNiw3IEBACiAJb21hcF9zcmFtX2lkbGUoKTsKIAogCS8qIFJlLWFsbG93IGlkbGUgZm9yIEMxICovCi0JaWYgKHN0YXRlID09ICZkZXYtPnN0YXRlc1swXSkgeworCWlmIChpbmRleCA9PSAwKSB7CiAJCXB3cmRtX2Zvcl9lYWNoX2Nsa2RtKG1wdV9wZCwgX2NwdWlkbGVfYWxsb3dfaWRsZSk7CiAJCXB3cmRtX2Zvcl9lYWNoX2Nsa2RtKGNvcmVfcGQsIF9jcHVpZGxlX2FsbG93X2lkbGUpOwogCX0KQEAgLTEzNCwyOCArMTM4LDM4IEBACiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWxvY2FsX2ZpcV9lbmFibGUoKTsKIAotCXJldHVybiB0c19pZGxlLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDICsgdHNfaWRsZS50dl9zZWMgKiBVU0VDX1BFUl9TRUM7CisJaWRsZV90aW1lID0gdHNfaWRsZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQyArIHRzX2lkbGUudHZfc2VjICogXAorCQkJCQkJCQlVU0VDX1BFUl9TRUM7CisKKwkvKiBVcGRhdGUgY3B1aWRsZSBjb3VudGVycyAqLworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSBpZGxlX3RpbWU7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIC8qKgogICogbmV4dF92YWxpZF9zdGF0ZSAtIEZpbmQgbmV4dCB2YWxpZCBDLXN0YXRlCiAgKiBAZGV2OiBjcHVpZGxlIGRldmljZQotICogQHN0YXRlOiBDdXJyZW50bHkgc2VsZWN0ZWQgQy1zdGF0ZQorICogQGRydjogY3B1aWRsZSBkcml2ZXIKKyAqIEBpbmRleDogSW5kZXggb2YgY3VycmVudGx5IHNlbGVjdGVkIGMtc3RhdGUKICAqCi0gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB2YWxpZCwgaXQgaXMgcmV0dXJuZWQgYmFjayB0byB0aGUgY2FsbGVyLgotICogRWxzZSwgdGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBsb3dlciBjLXN0YXRlIHdoaWNoIGlzIHN0aWxsCi0gKiB2YWxpZC4KKyAqIElmIHRoZSBzdGF0ZSBjb3JyZXNwb25kaW5nIHRvIGluZGV4IGlzIHZhbGlkLCBpbmRleCBpcyByZXR1cm5lZCBiYWNrCisgKiB0byB0aGUgY2FsbGVyLiBFbHNlLCB0aGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhIGxvd2VyIGMtc3RhdGUgd2hpY2ggaXMKKyAqIHN0aWxsIHZhbGlkIChhcyBkZWZpbmVkIGluIG9tYXAzX3Bvd2VyX3N0YXRlc1tdKSBhbmQgcmV0dXJucyBpdHMgaW5kZXguCiAgKgogICogQSBzdGF0ZSBpcyB2YWxpZCBpZiB0aGUgJ3ZhbGlkJyBmaWVsZCBpcyBlbmFibGVkIGFuZAogICogaWYgaXQgc2F0aXNmaWVzIHRoZSBlbmFibGVfb2ZmX21vZGUgY29uZGl0aW9uLgogICovCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgKm5leHRfdmFsaWRfc3RhdGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpjdXJyKQorc3RhdGljIGludCBuZXh0X3ZhbGlkX3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJaW50IGluZGV4KQogewotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpuZXh0ID0gTlVMTDsKLQlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKGN1cnIpOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpjdXJyX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqY3VyciA9ICZkcnYtPnN0YXRlc1tpbmRleF07CisJc3RydWN0IG9tYXAzX2lkbGVfc3RhdGVkYXRhICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShjdXJyX3VzYWdlKTsKIAl1MzIgbXB1X2RlZXBlc3Rfc3RhdGUgPSBQV1JETV9QT1dFUl9SRVQ7CiAJdTMyIGNvcmVfZGVlcGVzdF9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKKwlpbnQgbmV4dF9pbmRleCA9IC0xOwogCiAJaWYgKGVuYWJsZV9vZmZfbW9kZSkgewogCQltcHVfZGVlcGVzdF9zdGF0ZSA9IFBXUkRNX1BPV0VSX09GRjsKQEAgLTE3MiwyMCArMTg2LDIwIEBACiAJaWYgKChjeC0+dmFsaWQpICYmCiAJICAgIChjeC0+bXB1X3N0YXRlID49IG1wdV9kZWVwZXN0X3N0YXRlKSAmJgogCSAgICAoY3gtPmNvcmVfc3RhdGUgPj0gY29yZV9kZWVwZXN0X3N0YXRlKSkgewotCQlyZXR1cm4gY3VycjsKKwkJcmV0dXJuIGluZGV4OwogCX0gZWxzZSB7CiAJCWludCBpZHggPSBPTUFQM19OVU1fU1RBVEVTIC0gMTsKIAogCQkvKiBSZWFjaCB0aGUgY3VycmVudCBzdGF0ZSBzdGFydGluZyBhdCBoaWdoZXN0IEMtc3RhdGUgKi8KIAkJZm9yICg7IGlkeCA+PSAwOyBpZHgtLSkgewotCQkJaWYgKCZkZXYtPnN0YXRlc1tpZHhdID09IGN1cnIpIHsKLQkJCQluZXh0ID0gJmRldi0+c3RhdGVzW2lkeF07CisJCQlpZiAoJmRydi0+c3RhdGVzW2lkeF0gPT0gY3VycikgeworCQkJCW5leHRfaW5kZXggPSBpZHg7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAogCQkvKiBTaG91bGQgbmV2ZXIgaGl0IHRoaXMgY29uZGl0aW9uICovCi0JCVdBUk5fT04obmV4dCA9PSBOVUxMKTsKKwkJV0FSTl9PTihuZXh0X2luZGV4ID09IC0xKTsKIAogCQkvKgogCQkgKiBEcm9wIHRvIG5leHQgdmFsaWQgc3RhdGUuCkBAIC0xOTMsNDEgKzIwNyw0NCBAQAogCQkgKi8KIAkJaWR4LS07CiAJCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKLQkJCWN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKCZkZXYtPnN0YXRlc1tpZHhdKTsKKwkJCWN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKCZkZXYtPnN0YXRlc191c2FnZVtpZHhdKTsKIAkJCWlmICgoY3gtPnZhbGlkKSAmJgogCQkJICAgIChjeC0+bXB1X3N0YXRlID49IG1wdV9kZWVwZXN0X3N0YXRlKSAmJgogCQkJICAgIChjeC0+Y29yZV9zdGF0ZSA+PSBjb3JlX2RlZXBlc3Rfc3RhdGUpKSB7Ci0JCQkJbmV4dCA9ICZkZXYtPnN0YXRlc1tpZHhdOworCQkJCW5leHRfaW5kZXggPSBpZHg7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJLyoKIAkJICogQzEgaXMgYWx3YXlzIHZhbGlkLgotCQkgKiBTbywgbm8gbmVlZCB0byBjaGVjayBmb3IgJ25leHQ9PU5VTEwnIG91dHNpZGUgdGhpcyBsb29wLgorCQkgKiBTbywgbm8gbmVlZCB0byBjaGVjayBmb3IgJ25leHRfaW5kZXggPT0gLTEnIG91dHNpZGUKKwkJICogdGhpcyBsb29wLgogCQkgKi8KIAl9CiAKLQlyZXR1cm4gbmV4dDsKKwlyZXR1cm4gbmV4dF9pbmRleDsKIH0KIAogLyoqCiAgKiBvbWFwM19lbnRlcl9pZGxlX2JtIC0gQ2hlY2tzIGZvciBhbnkgYnVzIGFjdGl2aXR5CiAgKiBAZGV2OiBjcHVpZGxlIGRldmljZQotICogQHN0YXRlOiBUaGUgdGFyZ2V0IHN0YXRlIHRvIGJlIHByb2dyYW1tZWQKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCisgKiBAaW5kZXg6IGFycmF5IGluZGV4IG9mIHRhcmdldCBzdGF0ZSB0byBiZSBwcm9ncmFtbWVkCiAgKgogICogVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIGFueSBwZW5kaW5nIGFjdGl2aXR5IGFuZCB0aGVuIHByb2dyYW1zCiAgKiB0aGUgZGV2aWNlIHRvIHRoZSBzcGVjaWZpZWQgb3IgYSBzYWZlciBzdGF0ZS4KICAqLwogc3RhdGljIGludCBvbWFwM19lbnRlcl9pZGxlX2JtKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCSAgICAgICBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKm5ld19zdGF0ZTsKKwlpbnQgbmV3X3N0YXRlX2lkeDsKIAl1MzIgY29yZV9uZXh0X3N0YXRlLCBwZXJfbmV4dF9zdGF0ZSA9IDAsIHBlcl9zYXZlZF9zdGF0ZSA9IDAsIGNhbV9zdGF0ZTsKIAlzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKmN4OwogCWludCByZXQ7CiAKIAlpZiAoIW9tYXAzX2Nhbl9zbGVlcCgpKSB7Ci0JCW5ld19zdGF0ZSA9IGRldi0+c2FmZV9zdGF0ZTsKKwkJbmV3X3N0YXRlX2lkeCA9IGRydi0+c2FmZV9zdGF0ZV9pbmRleDsKIAkJZ290byBzZWxlY3Rfc3RhdGU7CiAJfQogCkBAIC0yMzcsNyArMjU0LDcgQEAKIAkgKi8KIAljYW1fc3RhdGUgPSBwd3JkbV9yZWFkX3B3cnN0KGNhbV9wZCk7CiAJaWYgKGNhbV9zdGF0ZSA9PSBQV1JETV9QT1dFUl9PTikgewotCQluZXdfc3RhdGUgPSBkZXYtPnNhZmVfc3RhdGU7CisJCW5ld19zdGF0ZV9pZHggPSBkcnYtPnNhZmVfc3RhdGVfaW5kZXg7CiAJCWdvdG8gc2VsZWN0X3N0YXRlOwogCX0KIApAQCAtMjUzLDcgKzI3MCw3IEBACiAJICogUHJldmVudCBQRVIgb2ZmIGlmIENPUkUgaXMgbm90IGluIHJldGVudGlvbiBvciBvZmYgYXMgdGhpcwogCSAqIHdvdWxkIGRpc2FibGUgUEVSIHdha2V1cHMgY29tcGxldGVseS4KIAkgKi8KLQljeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XSk7CiAJY29yZV9uZXh0X3N0YXRlID0gY3gtPmNvcmVfc3RhdGU7CiAJcGVyX25leHRfc3RhdGUgPSBwZXJfc2F2ZWRfc3RhdGUgPSBwd3JkbV9yZWFkX25leHRfcHdyc3QocGVyX3BkKTsKIAlpZiAoKHBlcl9uZXh0X3N0YXRlID09IFBXUkRNX1BPV0VSX09GRikgJiYKQEAgLTI2NCwxMSArMjgxLDEwIEBACiAJaWYgKHBlcl9uZXh0X3N0YXRlICE9IHBlcl9zYXZlZF9zdGF0ZSkKIAkJcHdyZG1fc2V0X25leHRfcHdyc3QocGVyX3BkLCBwZXJfbmV4dF9zdGF0ZSk7CiAKLQluZXdfc3RhdGUgPSBuZXh0X3ZhbGlkX3N0YXRlKGRldiwgc3RhdGUpOworCW5ld19zdGF0ZV9pZHggPSBuZXh0X3ZhbGlkX3N0YXRlKGRldiwgZHJ2LCBpbmRleCk7CiAKIHNlbGVjdF9zdGF0ZToKLQlkZXYtPmxhc3Rfc3RhdGUgPSBuZXdfc3RhdGU7Ci0JcmV0ID0gb21hcDNfZW50ZXJfaWRsZShkZXYsIG5ld19zdGF0ZSk7CisJcmV0ID0gb21hcDNfZW50ZXJfaWRsZShkZXYsIGRydiwgbmV3X3N0YXRlX2lkeCk7CiAKIAkvKiBSZXN0b3JlIG9yaWdpbmFsIFBFUiBzdGF0ZSBpZiBpdCB3YXMgbW9kaWZpZWQgKi8KIAlpZiAocGVyX25leHRfc3RhdGUgIT0gcGVyX3NhdmVkX3N0YXRlKQpAQCAtMzAxLDIyICszMTcsMzEgQEAKIAkub3duZXIgPSAJVEhJU19NT0RVTEUsCiB9OwogCi0vKiBIZWxwZXIgdG8gZmlsbCB0aGUgQy1zdGF0ZSBjb21tb24gZGF0YSBhbmQgcmVnaXN0ZXIgdGhlIGRyaXZlcl9kYXRhICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqX2ZpbGxfY3N0YXRlKAotCQkJCQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKy8qIEhlbHBlciB0byBmaWxsIHRoZSBDLXN0YXRlIGNvbW1vbiBkYXRhKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfZmlsbF9jc3RhdGUoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCiAJCQkJCWludCBpZHgsIGNvbnN0IGNoYXIgKmRlc2NyKQogewotCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3ggPSAmb21hcDNfaWRsZV9kYXRhW2lkeF07Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRldi0+c3RhdGVzW2lkeF07CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRydi0+c3RhdGVzW2lkeF07CiAKIAlzdGF0ZS0+ZXhpdF9sYXRlbmN5CT0gY3B1aWRsZV9wYXJhbXNfdGFibGVbaWR4XS5leGl0X2xhdGVuY3k7CiAJc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kJPSBjcHVpZGxlX3BhcmFtc190YWJsZVtpZHhdLnRhcmdldF9yZXNpZGVuY3k7CiAJc3RhdGUtPmZsYWdzCQk9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwogCXN0YXRlLT5lbnRlcgkJPSBvbWFwM19lbnRlcl9pZGxlX2JtOwotCWN4LT52YWxpZAkJPSBjcHVpZGxlX3BhcmFtc190YWJsZVtpZHhdLnZhbGlkOwogCXNwcmludGYoc3RhdGUtPm5hbWUsICJDJWQiLCBpZHggKyAxKTsKIAlzdHJuY3B5KHN0YXRlLT5kZXNjLCBkZXNjciwgQ1BVSURMRV9ERVNDX0xFTik7Ci0JY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0YXRlLCBjeCk7CisKK30KKworLyogSGVscGVyIHRvIHJlZ2lzdGVyIHRoZSBkcml2ZXJfZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgb21hcDNfaWRsZV9zdGF0ZWRhdGEgKl9maWxsX2NzdGF0ZV91c2FnZSgKKwkJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCQkJCWludCBpZHgpCit7CisJc3RydWN0IG9tYXAzX2lkbGVfc3RhdGVkYXRhICpjeCA9ICZvbWFwM19pZGxlX2RhdGFbaWR4XTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UgPSAmZGV2LT5zdGF0ZXNfdXNhZ2VbaWR4XTsKKworCWN4LT52YWxpZAkJPSBjcHVpZGxlX3BhcmFtc190YWJsZVtpZHhdLnZhbGlkOworCWNwdWlkbGVfc2V0X3N0YXRlZGF0YShzdGF0ZV91c2FnZSwgY3gpOwogCiAJcmV0dXJuIGN4OwogfQpAQCAtMzMwLDYgKzM1NSw3IEBACiBpbnQgX19pbml0IG9tYXAzX2lkbGVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2OworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJm9tYXAzX2lkbGVfZHJpdmVyOwogCXN0cnVjdCBvbWFwM19pZGxlX3N0YXRlZGF0YSAqY3g7CiAKIAltcHVfcGQgPSBwd3JkbV9sb29rdXAoIm1wdV9wd3JkbSIpOwpAQCAtMzM3LDQ0ICszNjMsNTIgQEAKIAlwZXJfcGQgPSBwd3JkbV9sb29rdXAoInBlcl9wd3JkbSIpOwogCWNhbV9wZCA9IHB3cmRtX2xvb2t1cCgiY2FtX3B3cmRtIik7CiAKLQljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmb21hcDNfaWRsZV9kcml2ZXIpOworCisJZHJ2LT5zYWZlX3N0YXRlX2luZGV4ID0gLTE7CiAJZGV2ID0gJnBlcl9jcHUob21hcDNfaWRsZV9kZXYsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAkvKiBDMSAuIE1QVSBXRkkgKyBDb3JlIGFjdGl2ZSAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgMCwgIk1QVSBPTiArIENPUkUgT04iKTsKLQkoJmRldi0+c3RhdGVzWzBdKS0+ZW50ZXIgPSBvbWFwM19lbnRlcl9pZGxlOwotCWRldi0+c2FmZV9zdGF0ZSA9ICZkZXYtPnN0YXRlc1swXTsKKwlfZmlsbF9jc3RhdGUoZHJ2LCAwLCAiTVBVIE9OICsgQ09SRSBPTiIpOworCSgmZHJ2LT5zdGF0ZXNbMF0pLT5lbnRlciA9IG9tYXAzX2VudGVyX2lkbGU7CisJZHJ2LT5zYWZlX3N0YXRlX2luZGV4ID0gMDsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDApOwogCWN4LT52YWxpZCA9IDE7CS8qIEMxIGlzIGFsd2F5cyB2YWxpZCAqLwogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9PTjsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09OOwogCiAJLyogQzIgLiBNUFUgV0ZJICsgQ29yZSBpbmFjdGl2ZSAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgMSwgIk1QVSBPTiArIENPUkUgT04iKTsKKwlfZmlsbF9jc3RhdGUoZHJ2LCAxLCAiTVBVIE9OICsgQ09SRSBPTiIpOworCWN4ID0gX2ZpbGxfY3N0YXRlX3VzYWdlKGRldiwgMSk7CiAJY3gtPm1wdV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09OOwogCWN4LT5jb3JlX3N0YXRlID0gUFdSRE1fUE9XRVJfT047CiAKIAkvKiBDMyAuIE1QVSBDU1dSICsgQ29yZSBpbmFjdGl2ZSAqLwotCWN4ID0gX2ZpbGxfY3N0YXRlKGRldiwgMiwgIk1QVSBSRVQgKyBDT1JFIE9OIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgMiwgIk1QVSBSRVQgKyBDT1JFIE9OIik7CisJY3ggPSBfZmlsbF9jc3RhdGVfdXNhZ2UoZGV2LCAyKTsKIAljeC0+bXB1X3N0YXRlID0gUFdSRE1fUE9XRVJfUkVUOwogCWN4LT5jb3JlX3N0YXRlID0gUFdSRE1fUE9XRVJfT047CiAKIAkvKiBDNCAuIE1QVSBPRkYgKyBDb3JlIGluYWN0aXZlICovCi0JY3ggPSBfZmlsbF9jc3RhdGUoZGV2LCAzLCAiTVBVIE9GRiArIENPUkUgT04iKTsKKwlfZmlsbF9jc3RhdGUoZHJ2LCAzLCAiTVBVIE9GRiArIENPUkUgT04iKTsKKwljeCA9IF9maWxsX2NzdGF0ZV91c2FnZShkZXYsIDMpOwogCWN4LT5tcHVfc3RhdGUgPSBQV1JETV9QT1dFUl9PRkY7CiAJY3gtPmNvcmVfc3RhdGUgPSBQV1JETV9QT1dFUl9PTjsKIAogCS8qIEM1IC4gTVBVIFJFVCArIENvcmUgUkVUICovCi0JY3ggPSBfZmlsbF9jc3RhdGUoZGV2LCA0LCAiTVBVIFJFVCArIENPUkUgUkVUIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgNCwgIk1QVSBSRVQgKyBDT1JFIFJFVCIpOworCWN4ID0gX2ZpbGxfY3N0YXRlX3VzYWdlKGRldiwgNCk7CiAJY3gtPm1wdV9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKIAogCS8qIEM2IC4gTVBVIE9GRiArIENvcmUgUkVUICovCi0JY3ggPSBfZmlsbF9jc3RhdGUoZGV2LCA1LCAiTVBVIE9GRiArIENPUkUgUkVUIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgNSwgIk1QVSBPRkYgKyBDT1JFIFJFVCIpOworCWN4ID0gX2ZpbGxfY3N0YXRlX3VzYWdlKGRldiwgNSk7CiAJY3gtPm1wdV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09GRjsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX1JFVDsKIAogCS8qIEM3IC4gTVBVIE9GRiArIENvcmUgT0ZGICovCi0JY3ggPSBfZmlsbF9jc3RhdGUoZGV2LCA2LCAiTVBVIE9GRiArIENPUkUgT0ZGIik7CisJX2ZpbGxfY3N0YXRlKGRydiwgNiwgIk1QVSBPRkYgKyBDT1JFIE9GRiIpOworCWN4ID0gX2ZpbGxfY3N0YXRlX3VzYWdlKGRldiwgNik7CiAJLyoKIAkgKiBFcnJhdHVtIGk1ODM6IGltcGxlbWVudGF0aW9uIGZvciBFUyByZXYgPCBFczEuMiBvbiAzNjMwLiBXZSBjYW5ub3QKIAkgKiBlbmFibGUgT0ZGIG1vZGUgaW4gYSBzdGFibGUgZm9ybSBmb3IgcHJldmlvdXMgcmV2aXNpb25zLgpAQCAtMzg4LDYgKzQyMiw5IEBACiAJY3gtPm1wdV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09GRjsKIAljeC0+Y29yZV9zdGF0ZSA9IFBXUkRNX1BPV0VSX09GRjsKIAorCWRydi0+c3RhdGVfY291bnQgPSBPTUFQM19OVU1fU1RBVEVTOworCWNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZvbWFwM19pZGxlX2RyaXZlcik7CisKIAlkZXYtPnN0YXRlX2NvdW50ID0gT01BUDNfTlVNX1NUQVRFUzsKIAlpZiAoY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUFVpZGxlIHJlZ2lzdGVyIGRldmljZSBmYWlsZWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IDEwNzdhZDYuLmMxNWNmYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC04LDcgKzgsNyBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CkBAIC0yNiw3ICsyNyw2IEBACiAjaW5jbHVkZSA8cGxhdC90Yy5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgpAQCAtNDQsNyArNDQsNyBAQAogewogCWludCBsOwogCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJY2hhciBvaF9uYW1lW0wzX01PRFVMRVNfTUFYX0xFTl07CiAKIAkvKgpAQCAtNjEsMTIgKzYxLDEyIEBACiAJaWYgKCFvaCkKIAkJcHJfZXJyKCJjb3VsZCBub3QgbG9vayB1cCAlc1xuIiwgb2hfbmFtZSk7CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKCJvbWFwX2wzX3NteCIsIDAsIG9oLCBOVUxMLCAwLAorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZCgib21hcF9sM19zbXgiLCAwLCBvaCwgTlVMTCwgMCwKIAkJCQkJCQkgICBOVUxMLCAwLCAwKTsKIAotCVdBUk4oSVNfRVJSKG9kKSwgImNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsIG9oX25hbWUpOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiY291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwgb2hfbmFtZSk7CiAKLQlyZXR1cm4gSVNfRVJSKG9kKSA/IFBUUl9FUlIob2QpIDogMDsKKwlyZXR1cm4gSVNfRVJSKHBkZXYpID8gUFRSX0VSUihwZGV2KSA6IDA7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChvbWFwM19sM19pbml0KTsKIApAQCAtNzQsOSArNzQsMTMgQEAKIHsKIAlpbnQgbCwgaTsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2hbM107Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWNoYXIgb2hfbmFtZVtMM19NT0RVTEVTX01BWF9MRU5dOwogCisJLyogSWYgZHRiIGlzIHRoZXJlLCB0aGUgZGV2aWNlcyB3aWxsIGJlIGNyZWF0ZWQgZHluYW1pY2FsbHkgKi8KKwlpZiAob2ZfaGF2ZV9wb3B1bGF0ZWRfZHQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKgogCSAqIFRvIGF2b2lkIGNvZGUgcnVubmluZyBvbiBvdGhlciBPTUFQcyBpbgogCSAqIG11bHRpLW9tYXAgYnVpbGRzCkBAIC05MiwxMiArOTYsMTIgQEAKIAkJCXByX2VycigiY291bGQgbm90IGxvb2sgdXAgJXNcbiIsIG9oX25hbWUpOwogCX0KIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGRfc3MoIm9tYXBfbDNfbm9jIiwgMCwgb2gsIDMsIE5VTEwsCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkX3NzKCJvbWFwX2wzX25vYyIsIDAsIG9oLCAzLCBOVUxMLAogCQkJCQkJICAgICAwLCBOVUxMLCAwLCAwKTsKIAotCVdBUk4oSVNfRVJSKG9kKSwgImNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsIG9oX25hbWUpOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiY291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlc1xuIiwgb2hfbmFtZSk7CiAKLQlyZXR1cm4gSVNfRVJSKG9kKSA/IFBUUl9FUlIob2QpIDogMDsKKwlyZXR1cm4gSVNfRVJSKHBkZXYpID8gUFRSX0VSUihwZGV2KSA6IDA7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChvbWFwNF9sM19pbml0KTsKIApAQCAtMjIxLDE4ICsyMjUsMTAgQEAKICNlbmRpZgogfQogCi1zdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX2tleWJvYXJkX2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncyA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIGludCBfX2luaXQgb21hcDRfa2V5Ym9hcmRfaW5pdChzdHJ1Y3Qgb21hcDRfa2V5cGFkX3BsYXRmb3JtX2RhdGEKIAkJCSpzZHA0NDMwX2tleXBhZF9kYXRhLCBzdHJ1Y3Qgb21hcF9ib2FyZF9kYXRhICpiZGF0YSkKIHsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwogCXN0cnVjdCBvbWFwNF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqa2V5cGFkX2RhdGE7CiAJdW5zaWduZWQgaW50IGlkID0gLTE7CkBAIC0yNDcsMTUgKzI0MywxMyBAQAogCiAJa2V5cGFkX2RhdGEgPSBzZHA0NDMwX2tleXBhZF9kYXRhOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBpZCwgb2gsIGtleXBhZF9kYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBvbWFwNF9rZXlwYWRfcGxhdGZvcm1fZGF0YSksCi0JCQlvbWFwX2tleWJvYXJkX2xhdGVuY3ksCi0JCQlBUlJBWV9TSVpFKG9tYXBfa2V5Ym9hcmRfbGF0ZW5jeSksIDApOworCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBpZCwgb2gsIGtleXBhZF9kYXRhLAorCQkJc2l6ZW9mKHN0cnVjdCBvbWFwNF9rZXlwYWRfcGxhdGZvcm1fZGF0YSksIE5VTEwsIDAsIDApOwogCi0JaWYgKElTX0VSUihvZCkpIHsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CiAJCVdBUk4oMSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolcy5cbiIsCiAJCQkJCQluYW1lLCBvaC0+bmFtZSk7Ci0JCXJldHVybiBQVFJfRVJSKG9kKTsKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CiAJfQogCW9oLT5tdXggPSBvbWFwX2h3bW9kX211eF9pbml0KGJkYXRhLT5wYWRzLCBiZGF0YS0+cGFkc19jbnQpOwogCkBAIC0yNjMsMTggKzI1NywxMCBAQAogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NQk9YX0ZXSykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9NQk9YX0ZXS19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgbWJveF9sYXRlbmNpZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5hY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X21ib3godm9pZCkKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAJb2ggPSBvbWFwX2h3bW9kX2xvb2t1cCgibWFpbGJveCIpOwogCWlmICghb2gpIHsKQEAgLTI4MiwxMCArMjY4LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQoIm9tYXAtbWFpbGJveCIsIC0xLCBvaCwgTlVMTCwgMCwKLQkJCQltYm94X2xhdGVuY2llcywgQVJSQVlfU0laRShtYm94X2xhdGVuY2llcyksIDApOwotCVdBUk4oSVNfRVJSKG9kKSwgIiVzOiBjb3VsZCBub3QgYnVpbGQgZGV2aWNlLCBlcnIgJWxkXG4iLAotCQkJCQkJX19mdW5jX18sIFBUUl9FUlIob2QpKTsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQoIm9tYXAtbWFpbGJveCIsIC0xLCBvaCwgTlVMTCwgMCwgTlVMTCwgMCwgMCk7CisJV0FSTihJU19FUlIocGRldiksICIlczogY291bGQgbm90IGJ1aWxkIGRldmljZSwgZXJyICVsZFxuIiwKKwkJCQkJCV9fZnVuY19fLCBQVFJfRVJSKHBkZXYpKTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pbml0X21ib3godm9pZCkgeyB9CkBAIC0zMzAsMjEgKzMxNSwzNCBAQAogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9hdWRpbyh2b2lkKSB7fQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfTUNQRE0pIHx8IFwKKwkJZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX01DUERNX01PRFVMRSkKKworc3RhdGljIHZvaWQgb21hcF9pbml0X21jcGRtKHZvaWQpCit7CisJc3RydWN0IG9tYXBfaHdtb2QgKm9oOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlvaCA9IG9tYXBfaHdtb2RfbG9va3VwKCJtY3BkbSIpOworCWlmICghb2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgbG9vayB1cCBtY3BkbSBod19tb2RcbiIpOworCQlyZXR1cm47CisJfQorCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKCJvbWFwLW1jcGRtIiwgLTEsIG9oLCBOVUxMLCAwLCBOVUxMLCAwLCAwKTsKKwlXQVJOKElTX0VSUihwZGV2KSwgIkNhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciBvbWFwLW1jcGRtLlxuIik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaW5pdF9tY3BkbSh2b2lkKSB7fQorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfT01BUDI0WFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9PTUFQMjRYWF9NT0RVTEUpCiAKICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAKLXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfbWNzcGlfbGF0ZW5jeVtdID0gewotCVswXSA9IHsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYyAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzCQkgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAotCX0sCi19OwotCiBzdGF0aWMgaW50IG9tYXBfbWNzcGlfaW5pdChzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJY2hhciAqbmFtZSA9ICJvbWFwMl9tY3NwaSI7CiAJc3RydWN0IG9tYXAyX21jc3BpX3BsYXRmb3JtX2NvbmZpZyAqcGRhdGE7CiAJc3RhdGljIGludCBzcGlfbnVtOwpAQCAtMzcxLDEwICszNjksOSBAQAogCX0KIAogCXNwaV9udW0rKzsKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIHNwaV9udW0sIG9oLCBwZGF0YSwKLQkJCQlzaXplb2YoKnBkYXRhKSwJb21hcF9tY3NwaV9sYXRlbmN5LAotCQkJCUFSUkFZX1NJWkUob21hcF9tY3NwaV9sYXRlbmN5KSwgMCk7Ci0JV0FSTihJU19FUlIob2QpLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzXG4iLAorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBzcGlfbnVtLCBvaCwgcGRhdGEsCisJCQkJc2l6ZW9mKCpwZGF0YSksCU5VTEwsIDAsIDApOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzXG4iLAogCQkJCW5hbWUsIG9oLT5uYW1lKTsKIAlrZnJlZShwZGF0YSk7CiAJcmV0dXJuIDA7CkBAIC02ODMsNiArNjgwLDcgQEAKIAkgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhleSdyZSBlYXNpZXIgdG8gc29ydCB0aHJvdWdoLgogCSAqLwogCW9tYXBfaW5pdF9hdWRpbygpOworCW9tYXBfaW5pdF9tY3BkbSgpOwogCW9tYXBfaW5pdF9jYW1lcmEoKTsKIAlvbWFwX2luaXRfbWJveCgpOwogCW9tYXBfaW5pdF9tY3NwaSgpOwpAQCAtNjk4LDE4ICs2OTYsMTAgQEAKIGFyY2hfaW5pdGNhbGwob21hcDJfaW5pdF9kZXZpY2VzKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfV0FUQ0hET0dfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfd2R0X2xhdGVuY3lbXSA9IHsKLQlbMF0gPSB7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncwkJID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0X3dkdCh2b2lkKQogewogCWludCBpZCA9IC0xOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7CiAJY2hhciAqb2hfbmFtZSA9ICJ3ZF90aW1lcjIiOwogCWNoYXIgKmRldl9uYW1lID0gIm9tYXBfd2R0IjsKQEAgLTcyMywxMCArNzEzLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChkZXZfbmFtZSwgaWQsIG9oLCBOVUxMLCAwLAotCQkJCW9tYXBfd2R0X2xhdGVuY3ksCi0JCQkJQVJSQVlfU0laRShvbWFwX3dkdF9sYXRlbmN5KSwgMCk7Ci0JV0FSTihJU19FUlIob2QpLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzLlxuIiwKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQoZGV2X25hbWUsIGlkLCBvaCwgTlVMTCwgMCwgTlVMTCwgMCwgMCk7CisJV0FSTihJU19FUlIocGRldiksICJDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6JXMuXG4iLAogCQkJCWRldl9uYW1lLCBvaC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCmluZGV4IGE1YjdhMjMuLmFkYjI3NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNyw2ICsyOCw4IEBACiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgogI2luY2x1ZGUgPHBsYXQvb21hcC1wbS5oPgogCisjaW5jbHVkZSAiY29udHJvbC5oIgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX2Rpc3BsYXlfZGV2aWNlID0gewogCS5uYW1lICAgICAgICAgID0gIm9tYXBkc3MiLAogCS5pZCAgICAgICAgICAgID0gLTEsCkBAIC0zNSwxNCArMzgsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF9kc3NfbGF0ZW5jeVtdID0gewotCVswXSA9IHsKLQkJLmRlYWN0aXZhdGVfZnVuYyAgICAgICAgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICAgICAgICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCQk9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0cnVjdCBvbWFwX2Rzc19od21vZF9kYXRhIHsKIAljb25zdCBjaGFyICpvaF9uYW1lOwogCWNvbnN0IGNoYXIgKmRldl9uYW1lOwpAQCAtNjEsNyArNTYsNyBAQAogCXsgImRzc19kaXNwYyIsICJvbWFwZHNzX2Rpc3BjIiwgLTEgfSwKIAl7ICJkc3NfcmZiaSIsICJvbWFwZHNzX3JmYmkiLCAtMSB9LAogCXsgImRzc192ZW5jIiwgIm9tYXBkc3NfdmVuYyIsIC0xIH0sCi0JeyAiZHNzX2RzaTEiLCAib21hcGRzc19kc2kxIiwgLTEgfSwKKwl7ICJkc3NfZHNpMSIsICJvbWFwZHNzX2RzaSIsIDAgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfaHdtb2RfZGF0YSBvbWFwNF9kc3NfaHdtb2RfZGF0YVtdIF9faW5pdGRhdGEgPSB7CkBAIC02OSwxNiArNjQsNjMgQEAKIAl7ICJkc3NfZGlzcGMiLCAib21hcGRzc19kaXNwYyIsIC0xIH0sCiAJeyAiZHNzX3JmYmkiLCAib21hcGRzc19yZmJpIiwgLTEgfSwKIAl7ICJkc3NfdmVuYyIsICJvbWFwZHNzX3ZlbmMiLCAtMSB9LAotCXsgImRzc19kc2kxIiwgIm9tYXBkc3NfZHNpMSIsIC0xIH0sCi0JeyAiZHNzX2RzaTIiLCAib21hcGRzc19kc2kyIiwgLTEgfSwKKwl7ICJkc3NfZHNpMSIsICJvbWFwZHNzX2RzaSIsIDAgfSwKKwl7ICJkc3NfZHNpMiIsICJvbWFwZHNzX2RzaSIsIDEgfSwKIAl7ICJkc3NfaGRtaSIsICJvbWFwZHNzX2hkbWkiLCAtMSB9LAogfTsKIAorc3RhdGljIGludCBvbWFwNF9kc2lfbXV4X3BhZHMoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZXMpCit7CisJdTMyIGVuYWJsZV9tYXNrLCBlbmFibGVfc2hpZnQ7CisJdTMyIHBpcGRfbWFzaywgcGlwZF9zaGlmdDsKKwl1MzIgcmVnOworCisJaWYgKGRzaV9pZCA9PSAwKSB7CisJCWVuYWJsZV9tYXNrID0gT01BUDRfRFNJMV9MQU5FRU5BQkxFX01BU0s7CisJCWVuYWJsZV9zaGlmdCA9IE9NQVA0X0RTSTFfTEFORUVOQUJMRV9TSElGVDsKKwkJcGlwZF9tYXNrID0gT01BUDRfRFNJMV9QSVBEX01BU0s7CisJCXBpcGRfc2hpZnQgPSBPTUFQNF9EU0kxX1BJUERfU0hJRlQ7CisJfSBlbHNlIGlmIChkc2lfaWQgPT0gMSkgeworCQllbmFibGVfbWFzayA9IE9NQVA0X0RTSTJfTEFORUVOQUJMRV9NQVNLOworCQllbmFibGVfc2hpZnQgPSBPTUFQNF9EU0kyX0xBTkVFTkFCTEVfU0hJRlQ7CisJCXBpcGRfbWFzayA9IE9NQVA0X0RTSTJfUElQRF9NQVNLOworCQlwaXBkX3NoaWZ0ID0gT01BUDRfRFNJMl9QSVBEX1NISUZUOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZyA9IG9tYXA0X2N0cmxfcGFkX3JlYWRsKE9NQVA0X0NUUkxfTU9EVUxFX1BBRF9DT1JFX0NPTlRST0xfRFNJUEhZKTsKKworCXJlZyAmPSB+ZW5hYmxlX21hc2s7CisJcmVnICY9IH5waXBkX21hc2s7CisKKwlyZWcgfD0gKGxhbmVzIDw8IGVuYWJsZV9zaGlmdCkgJiBlbmFibGVfbWFzazsKKwlyZWcgfD0gKGxhbmVzIDw8IHBpcGRfc2hpZnQpICYgcGlwZF9tYXNrOworCisJb21hcDRfY3RybF9wYWRfd3JpdGVsKHJlZywgT01BUDRfQ1RSTF9NT0RVTEVfUEFEX0NPUkVfQ09OVFJPTF9EU0lQSFkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kc2lfZW5hYmxlX3BhZHMoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKQoreworCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKKwkJcmV0dXJuIG9tYXA0X2RzaV9tdXhfcGFkcyhkc2lfaWQsIGxhbmVfbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcF9kc2lfZGlzYWJsZV9wYWRzKGludCBkc2lfaWQsIHVuc2lnbmVkIGxhbmVfbWFzaykKK3sKKwlpZiAoY3B1X2lzX29tYXA0NHh4KCkpCisJCW9tYXA0X2RzaV9tdXhfcGFkcyhkc2lfaWQsIDApOworfQorCiBpbnQgX19pbml0IG9tYXBfZGlzcGxheV9pbml0KHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9kYXRhKQogewogCWludCByID0gMDsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWludCBpLCBvaF9jb3VudDsKIAlzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEgcGRhdGE7CiAJY29uc3Qgc3RydWN0IG9tYXBfZHNzX2h3bW9kX2RhdGEgKmN1cnJfZHNzX2h3bW9kOwpAQCAtOTYsNiArMTM4LDExIEBACiAJCW9oX2NvdW50ID0gQVJSQVlfU0laRShvbWFwNF9kc3NfaHdtb2RfZGF0YSk7CiAJfQogCisJaWYgKGJvYXJkX2RhdGEtPmRzaV9lbmFibGVfcGFkcyA9PSBOVUxMKQorCQlib2FyZF9kYXRhLT5kc2lfZW5hYmxlX3BhZHMgPSBvbWFwX2RzaV9lbmFibGVfcGFkczsKKwlpZiAoYm9hcmRfZGF0YS0+ZHNpX2Rpc2FibGVfcGFkcyA9PSBOVUxMKQorCQlib2FyZF9kYXRhLT5kc2lfZGlzYWJsZV9wYWRzID0gb21hcF9kc2lfZGlzYWJsZV9wYWRzOworCiAJcGRhdGEuYm9hcmRfZGF0YSA9IGJvYXJkX2RhdGE7CiAJcGRhdGEuYm9hcmRfZGF0YS0+Z2V0X2NvbnRleHRfbG9zc19jb3VudCA9CiAJCW9tYXBfcG1fZ2V0X2Rldl9jb250ZXh0X2xvc3NfY291bnQ7CkBAIC0xMDgsMTMgKzE1NSwxMiBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKGN1cnJfZHNzX2h3bW9kW2ldLmRldl9uYW1lLAorCQlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQoY3Vycl9kc3NfaHdtb2RbaV0uZGV2X25hbWUsCiAJCQkJY3Vycl9kc3NfaHdtb2RbaV0uaWQsIG9oLCAmcGRhdGEsCiAJCQkJc2l6ZW9mKHN0cnVjdCBvbWFwX2Rpc3BsYXlfcGxhdGZvcm1fZGF0YSksCi0JCQkJb21hcF9kc3NfbGF0ZW5jeSwKLQkJCQlBUlJBWV9TSVpFKG9tYXBfZHNzX2xhdGVuY3kpLCAwKTsKKwkJCQlOVUxMLCAwLCAwKTsKIAotCQlpZiAoV0FSTigoSVNfRVJSKG9kKSksICJDb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLAorCQlpZiAoV0FSTigoSVNfRVJSKHBkZXYpKSwgIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsCiAJCQkJY3Vycl9kc3NfaHdtb2RbaV0ub2hfbmFtZSkpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kbWEuYwppbmRleCBjOWZmMGU3Li5hNTlhNDVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZG1hLmMKQEAgLTg3LDE0ICs4Nyw2IEBACiAJW0NDRE5dCQkJPSAweGQ4LAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXAyX2RtYV9sYXRlbmN5W10gPSB7Ci0JewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jCSA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncwkJID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotfTsKLQogc3RhdGljIHZvaWQgX19pb21lbSAqZG1hX2Jhc2U7CiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3dyaXRlKHUzMiB2YWwsIGludCByZWcsIGludCBsY2gpCiB7CkBAIC0yMjgsNyArMjIwLDcgQEAKIC8qIE9uZSB0aW1lIGluaXRpYWxpemF0aW9ucyAqLwogc3RhdGljIGludCBfX2luaXQgb21hcDJfc3lzdGVtX2RtYV9pbml0X2RldihzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UJCQkqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJCSpwZGV2OwogCXN0cnVjdCBvbWFwX3N5c3RlbV9kbWFfcGxhdF9pbmZvCSpwOwogCXN0cnVjdCByZXNvdXJjZQkJCQkqbWVtOwogCWNoYXIJCQkJCSpuYW1lID0gIm9tYXBfZG1hX3N5c3RlbSI7CkBAIC0yNTgsMjMgKzI1MCwyMiBAQAogCiAJcC0+ZXJyYXRhCQk9IGNvbmZpZ3VyZV9kbWFfZXJyYXRhKCk7CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIDAsIG9oLCBwLCBzaXplb2YoKnApLAotCQkJb21hcDJfZG1hX2xhdGVuY3ksIEFSUkFZX1NJWkUob21hcDJfZG1hX2xhdGVuY3kpLCAwKTsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgMCwgb2gsIHAsIHNpemVvZigqcCksIE5VTEwsIDAsIDApOwogCWtmcmVlKHApOwotCWlmIChJU19FUlIob2QpKSB7CisJaWYgKElTX0VSUihwZGV2KSkgewogCQlwcl9lcnIoIiVzOiBDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6JXMuXG4iLAogCQkJX19mdW5jX18sIG5hbWUsIG9oLT5uYW1lKTsKLQkJcmV0dXJuIFBUUl9FUlIob2QpOworCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKIAl9CiAKLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoJm9kLT5wZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIW1lbSkgewotCQlkZXZfZXJyKCZvZC0+cGRldi5kZXYsICIlczogbm8gbWVtIHJlc291cmNlXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBubyBtZW0gcmVzb3VyY2VcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRtYV9iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwogCWlmICghZG1hX2Jhc2UpIHsKLQkJZGV2X2Vycigmb2QtPnBkZXYuZGV2LCAiJXM6IGlvcmVtYXAgZmFpbFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogaW9yZW1hcCBmYWlsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjgzLDcgKzI3NCw3IEBACiAJCQkJCShkLT5sY2hfY291bnQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghZC0+Y2hhbikgewotCQlkZXZfZXJyKCZvZC0+cGRldi5kZXYsICIlczoga3phbGxvYyBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBremFsbG9jIGZhaWxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsM3h4eC5jCmluZGV4IGY3NzAyMmIuLmZjNTY3NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbDN4eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGwzeHh4LmMKQEAgLTM5MCw3ICszOTAsOCBAQAogCSAqIHByb3BhZ2F0aW5nPwogCSAqLwogCWlmICghcikKLQkJY2xrLT5yYXRlID0gb21hcDJfZ2V0X2RwbGxfcmF0ZShjbGspOworCQljbGstPnJhdGUgPSAoY2xrLT5yZWNhbGMpID8gY2xrLT5yZWNhbGMoY2xrKSA6CisJCQlvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7CiAKIAlyZXR1cm4gcjsKIH0KQEAgLTQyNCw2ICs0MjUsNyBAQAogaW50IG9tYXAzX25vbmNvcmVfZHBsbF9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAlzdHJ1Y3QgY2xrICpuZXdfcGFyZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGh3X3JhdGU7CiAJdTE2IGZyZXFzZWwgPSAwOwogCXN0cnVjdCBkcGxsX2RhdGEgKmRkOwogCWludCByZXQ7CkBAIC00MzUsNyArNDM3LDggQEAKIAlpZiAoIWRkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChyYXRlID09IG9tYXAyX2dldF9kcGxsX3JhdGUoY2xrKSkKKwlod19yYXRlID0gKGNsay0+cmVjYWxjKSA/IGNsay0+cmVjYWxjKGNsaykgOiBvbWFwMl9nZXRfZHBsbF9yYXRlKGNsayk7CisJaWYgKHJhdGUgPT0gaHdfcmF0ZSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNDU1LDcgKzQ1OCw3IEBACiAJCQluZXdfcGFyZW50ID0gZGQtPmNsa19ieXBhc3M7CiAJfSBlbHNlIHsKIAkJaWYgKGRkLT5sYXN0X3JvdW5kZWRfcmF0ZSAhPSByYXRlKQotCQkJb21hcDJfZHBsbF9yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisJCQlyYXRlID0gY2xrLT5yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CiAKIAkJaWYgKGRkLT5sYXN0X3JvdW5kZWRfcmF0ZSA9PSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGw0NHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RwbGw0NHh4LmMKaW5kZXggNGU0ZGE2MS4uOWM2YTI5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcGxsNDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZHBsbDQ0eHguYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiY2xvY2s0NHh4LmgiCiAjaW5jbHVkZSAiY20tcmVnYml0cy00NHh4LmgiCiAKIC8qIFN1cHBvcnRlZCBvbmx5IG9uIE9NQVA0ICovCkBAIC04MiwzICs4Myw3MSBAQAogCS5kZW55X2lkbGUJPSBvbWFwNF9kcGxsbXhfZGVueV9nYXRlY3RybCwKIH07CiAKKy8qKgorICogb21hcDRfZHBsbF9yZWdtNHhlbl9yZWNhbGMgLSBjb21wdXRlIERQTEwgcmF0ZSwgY29uc2lkZXJpbmcgUkVHTTRYRU4gYml0CisgKiBAY2xrOiBzdHJ1Y3QgY2xrICogb2YgdGhlIERQTEwgdG8gY29tcHV0ZSB0aGUgcmF0ZSBmb3IKKyAqCisgKiBDb21wdXRlIHRoZSBvdXRwdXQgcmF0ZSBmb3IgdGhlIE9NQVA0IERQTEwgcmVwcmVzZW50ZWQgYnkgQGNsay4KKyAqIFRha2VzIHRoZSBSRUdNNFhFTiBiaXQgaW50byBjb25zaWRlcmF0aW9uLCB3aGljaCBpcyBuZWVkZWQgZm9yIHRoZQorICogT01BUDQgQUJFIERQTEwuICBSZXR1cm5zIHRoZSBEUExMJ3Mgb3V0cHV0IHJhdGUgKGJlZm9yZSBNLWRpdmlkZXJzKQorICogdXBvbiBzdWNjZXNzLCBvciAwIHVwb24gZXJyb3IuCisgKi8KK3Vuc2lnbmVkIGxvbmcgb21hcDRfZHBsbF9yZWdtNHhlbl9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXUzMiB2OworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwlzdHJ1Y3QgZHBsbF9kYXRhICpkZDsKKworCWlmICghY2xrIHx8ICFjbGstPmRwbGxfZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlkZCA9IGNsay0+ZHBsbF9kYXRhOworCisJcmF0ZSA9IG9tYXAyX2dldF9kcGxsX3JhdGUoY2xrKTsKKworCS8qIHJlZ200eGVuIGFkZHMgYSBtdWx0aXBsaWVyIG9mIDQgdG8gRFBMTCBjYWxjdWxhdGlvbnMgKi8KKwl2ID0gX19yYXdfcmVhZGwoZGQtPmNvbnRyb2xfcmVnKTsKKwlpZiAodiAmIE9NQVA0NDMwX0RQTExfUkVHTTRYRU5fTUFTSykKKwkJcmF0ZSAqPSBPTUFQNDQzMF9SRUdNNFhFTl9NVUxUOworCisJcmV0dXJuIHJhdGU7Cit9CisKKy8qKgorICogb21hcDRfZHBsbF9yZWdtNHhlbl9yb3VuZF9yYXRlIC0gcm91bmQgRFBMTCByYXRlLCBjb25zaWRlcmluZyBSRUdNNFhFTiBiaXQKKyAqIEBjbGs6IHN0cnVjdCBjbGsgKiBvZiB0aGUgRFBMTCB0byByb3VuZCBhIHJhdGUgZm9yCisgKiBAdGFyZ2V0X3JhdGU6IHRoZSBkZXNpcmVkIHJhdGUgb2YgdGhlIERQTEwKKyAqCisgKiBDb21wdXRlIHRoZSByYXRlIHRoYXQgd291bGQgYmUgcHJvZ3JhbW1lZCBpbnRvIHRoZSBEUExMIGhhcmR3YXJlCisgKiBmb3IgQGNsayBpZiBzZXRfcmF0ZSgpIHdlcmUgdG8gYmUgcHJvdmlkZWQgd2l0aCB0aGUgcmF0ZQorICogQHRhcmdldF9yYXRlLiAgVGFrZXMgdGhlIFJFR000WEVOIGJpdCBpbnRvIGNvbnNpZGVyYXRpb24sIHdoaWNoIGlzCisgKiBuZWVkZWQgZm9yIHRoZSBPTUFQNCBBQkUgRFBMTC4gIFJldHVybnMgdGhlIHJvdW5kZWQgcmF0ZSAoYmVmb3JlCisgKiBNLWRpdmlkZXJzKSB1cG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGNsayBpcyBudWxsIG9yIG5vdCBhIERQTEwsIG9yCisgKiB+MCBpZiBhbiBlcnJvciBvY2N1cnJlZCBpbiBvbWFwMl9kcGxsX3JvdW5kX3JhdGUoKS4KKyAqLworbG9uZyBvbWFwNF9kcGxsX3JlZ200eGVuX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHRhcmdldF9yYXRlKQoreworCXUzMiB2OworCXN0cnVjdCBkcGxsX2RhdGEgKmRkOworCWxvbmcgcjsKKworCWlmICghY2xrIHx8ICFjbGstPmRwbGxfZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZCA9IGNsay0+ZHBsbF9kYXRhOworCisJLyogcmVnbTR4ZW4gYWRkcyBhIG11bHRpcGxpZXIgb2YgNCB0byBEUExMIGNhbGN1bGF0aW9ucyAqLworCXYgPSBfX3Jhd19yZWFkbChkZC0+Y29udHJvbF9yZWcpICYgT01BUDQ0MzBfRFBMTF9SRUdNNFhFTl9NQVNLOworCisJaWYgKHYpCisJCXRhcmdldF9yYXRlID0gdGFyZ2V0X3JhdGUgLyBPTUFQNDQzMF9SRUdNNFhFTl9NVUxUOworCisJciA9IG9tYXAyX2RwbGxfcm91bmRfcmF0ZShjbGssIHRhcmdldF9yYXRlKTsKKwlpZiAociA9PSB+MCkKKwkJcmV0dXJuIHI7CisKKwlpZiAodikKKwkJY2xrLT5kcGxsX2RhdGEtPmxhc3Rfcm91bmRlZF9yYXRlICo9IE9NQVA0NDMwX1JFR000WEVOX01VTFQ7CisKKwlyZXR1cm4gY2xrLT5kcGxsX2RhdGEtPmxhc3Rfcm91bmRlZF9yYXRlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kc3AuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZHNwLmMKaW5kZXggOTExY2QyZS4uNzRmMThmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kc3AuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RzcC5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBvZiB0aGUgT01BUCBQTSBjb3JlIGNvZGUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgImNtMnh4eF8zeHh4LmgiCiAjaW5jbHVkZSAicHJtMnh4eF8zeHh4LmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZ3Bpby5jCmluZGV4IDI3NjVjZGMuLjhjYmZiYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZ3Bpby5jCkBAIC0yNCwxNyArMjQsOSBAQAogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KIAotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfZ3Bpb19sYXRlbmN5W10gPSB7Ci0JWzBdID0gewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCSA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0YXRpYyBpbnQgb21hcDJfZ3Bpb19kZXZfaW5pdChzdHJ1Y3Qgb21hcF9od21vZCAqb2gsIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3Qgb21hcF9ncGlvX2Rldl9hdHRyICpkZXZfYXR0cjsKIAljaGFyICpuYW1lID0gIm9tYXBfZ3BpbyI7CkBAIC0xMDcsMTkgKzk5LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgaWQgLSAxLCBvaCwgcGRhdGEsCi0JCQkJc2l6ZW9mKCpwZGF0YSksCW9tYXBfZ3Bpb19sYXRlbmN5LAotCQkJCUFSUkFZX1NJWkUob21hcF9ncGlvX2xhdGVuY3kpLAotCQkJCWZhbHNlKTsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgaWQgLSAxLCBvaCwgcGRhdGEsCisJCQkJc2l6ZW9mKCpwZGF0YSksCU5VTEwsIDAsIGZhbHNlKTsKIAlrZnJlZShwZGF0YSk7CiAKLQlpZiAoSVNfRVJSKG9kKSkgeworCWlmIChJU19FUlIocGRldikpIHsKIAkJV0FSTigxLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzLlxuIiwKIAkJCQkJbmFtZSwgb2gtPm5hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihvZCk7CisJCXJldHVybiBQVFJfRVJSKHBkZXYpOwogCX0KIAotCW9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKG9kKTsKKwlvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChwZGV2KTsKIAogCWdwaW9fYmFua19jb3VudCsrOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLW9uZW5hbmQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1vbmVuYW5kLmMKaW5kZXggZDc3NmRlZC4uNWNkY2UxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ncG1jLW9uZW5hbmQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMtb25lbmFuZC5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmRfcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCmluZGV4IDA5N2E0MmQuLmY0YTEwMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKQEAgLTEyOSwxNSArMTI5LDExIEBACiAJICogQXNzdW1lIHdlIHBvd2VyIGJvdGggT01BUCBWTU1DMSAoZm9yIENNRCwgQ0xLLCBEQVQwLi4zKSBhbmQgdGhlCiAJICogY2FyZCB3aXRoIFZjYyByZWd1bGF0b3IgKGZyb20gdHdsNDAzMCBvciB3aGF0ZXZlcikuICBPTUFQIGhhcyBib3RoCiAJICogMS44ViBhbmQgMy4wViBtb2RlcywgY29udHJvbGxlZCBieSB0aGUgUEJJQVMgcmVnaXN0ZXIuCi0JICoKLQkgKiBJbiA4LWJpdCBtb2RlcywgT01BUCBWTU1DMUEgKGZvciBEQVQ0Li43KSBuZWVkcyBhIHN1cHBseSwgd2hpY2gKLQkgKiBpcyBtb3N0IG5hdHVyYWxseSBUV0wgVlNJTTsgdGhvc2UgcGlucyBhbHNvIHVzZSBQQklBUy4KLQkgKgotCSAqIEZJWE1FIGhhbmRsZSBWTU1DMUEgYXMgbmVlZGVkIC4uLgogCSAqLwogCXJlZyA9IG9tYXA0X2N0cmxfcGFkX3JlYWRsKGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKIAlyZWcgJj0gfihPTUFQNF9NTUMxX1BCSUFTTElURV9QV1JETlpfTUFTSyB8Ci0JCU9NQVA0X01NQzFfUFdSRE5aX01BU0spOworCQlPTUFQNF9NTUMxX1BXUkROWl9NQVNLIHwKKwkJT01BUDRfTU1DMV9QQklBU0xJVEVfVk1PREVfTUFTSyk7CiAJb21hcDRfY3RybF9wYWRfd3JpdGVsKHJlZywgY29udHJvbF9wYmlhc19vZmZzZXQpOwogfQogCkBAIC0xNzIsMTIgKzE2OCw2IEBACiAJCQlyZWcgJj0gfihPTUFQNF9NTUMxX1BXUkROWl9NQVNLKTsKIAkJCW9tYXA0X2N0cmxfcGFkX3dyaXRlbChyZWcsIGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKIAkJfQotCX0gZWxzZSB7Ci0JCXJlZyA9IG9tYXA0X2N0cmxfcGFkX3JlYWRsKGNvbnRyb2xfcGJpYXNfb2Zmc2V0KTsKLQkJcmVnIHw9IChPTUFQNF9NTUMxX1BCSUFTTElURV9QV1JETlpfTUFTSyB8Ci0JCQlPTUFQNF9NTUMxX1BXUkROWl9NQVNLIHwKLQkJCU9NQVA0X01NQzFfUEJJQVNMSVRFX1ZNT0RFX01BU0spOwotCQlvbWFwNF9jdHJsX3BhZF93cml0ZWwocmVnLCBjb250cm9sX3BiaWFzX29mZnNldCk7CiAJfQogfQogCkBAIC00MDksMzEgKzM5OSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF9oc21tY19sYXRlbmN5W10gPSB7Ci0JWzBdID0gewotCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jCSA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncwkJID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotCS8qCi0JICogWFhYIFRoZXJlIHNob3VsZCBhbHNvIGJlIGFuIGVudHJ5IGhlcmUgdG8gcG93ZXIgb2ZmL29uIHRoZQotCSAqIE1NQyByZWd1bGF0b3JzL1BCSUFTIGNlbGxzLCBldGMuCi0JICovCi19OwotCiAjZGVmaW5lIE1BWF9PTUFQX01NQ19IV01PRF9OQU1FX0xFTgkJMTYKIAogdm9pZCBfX2luaXQgb21hcF9pbml0X2hzbW1jKHN0cnVjdCBvbWFwMl9oc21tY19pbmZvICpoc21tY2luZm8sIGludCBjdHJsX25yKQogewogCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpvaGw7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAljaGFyIG9oX25hbWVbTUFYX09NQVBfTU1DX0hXTU9EX05BTUVfTEVOXTsKIAlzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jX2RhdGE7CiAJc3RydWN0IG9tYXBfbW1jX2Rldl9hdHRyICptbWNfZGV2X2F0dHI7CiAJY2hhciAqbmFtZTsKIAlpbnQgbDsKLQlpbnQgb2hsX2NudCA9IDA7CiAKIAltbWNfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtbWNfZGF0YSkgewpAQCAtNDQ4LDggKzQyNCw2IEBACiAJb21hcF9oc21tY19tdXgobW1jX2RhdGEsIChjdHJsX25yIC0gMSkpOwogCiAJbmFtZSA9ICJvbWFwX2hzbW1jIjsKLQlvaGwgPSBvbWFwX2hzbW1jX2xhdGVuY3k7Ci0Jb2hsX2NudCA9IEFSUkFZX1NJWkUob21hcF9oc21tY19sYXRlbmN5KTsKIAogCWwgPSBzbnByaW50ZihvaF9uYW1lLCBNQVhfT01BUF9NTUNfSFdNT0RfTkFNRV9MRU4sCiAJCSAgICAgIm1tYyVkIiwgY3RybF9ucik7CkBAIC00NjcsOSArNDQxLDkgQEAKIAkJbW1jX2RhdGEtPmNvbnRyb2xsZXJfZmxhZ3MgPSBtbWNfZGV2X2F0dHItPmZsYWdzOwogCX0KIAotCW9kID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgY3RybF9uciAtIDEsIG9oLCBtbWNfZGF0YSwKLQkJc2l6ZW9mKHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhKSwgb2hsLCBvaGxfY250LCBmYWxzZSk7Ci0JaWYgKElTX0VSUihvZCkpIHsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgY3RybF9uciAtIDEsIG9oLCBtbWNfZGF0YSwKKwkJc2l6ZW9mKHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhKSwgTlVMTCwgMCwgZmFsc2UpOworCWlmIChJU19FUlIocGRldikpIHsKIAkJV0FSTigxLCAiQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiVzLlxuIiwgbmFtZSwgb2gtPm5hbWUpOwogCQlrZnJlZShtbWNfZGF0YS0+c2xvdHNbMF0ubmFtZSk7CiAJCWdvdG8gZG9uZTsKQEAgLTQ3OCw3ICs0NTIsNyBAQAogCSAqIHJldHVybiBkZXZpY2UgaGFuZGxlIHRvIGJvYXJkIHNldHVwIGNvZGUKIAkgKiByZXF1aXJlZCB0byBwb3B1bGF0ZSBmb3IgcmVndWxhdG9yIGZyYW1ld29yayBzdHJ1Y3R1cmUKIAkgKi8KLQloc21tY2luZm8tPmRldiA9ICZvZC0+cGRldi5kZXY7CisJaHNtbWNpbmZvLT5kZXYgPSAmcGRldi0+ZGV2OwogCiBkb25lOgogCWtmcmVlKG1tY19kYXRhKTsKQEAgLTUwNSw3ICs0NzksNyBAQAogCQkJT01BUDRfU0RNTUMxX1BVU1RSRU5HVEhfR1JQMV9NQVNLKTsKIAkJcmVnICY9IH4oT01BUDRfU0RNTUMxX1BVU1RSRU5HVEhfR1JQMl9NQVNLIHwKIAkJCU9NQVA0X1NETU1DMV9QVVNUUkVOR1RIX0dSUDNfTUFTSyk7Ci0JCXJlZyB8PSAoT01BUDRfVVNCQzFfRFIwX1NQRUVEQ1RSTF9NQVNLfAorCQlyZWcgfD0gKE9NQVA0X1NETU1DMV9EUjBfU1BFRURDVFJMX01BU0sgfAogCQkJT01BUDRfU0RNTUMxX0RSMV9TUEVFRENUUkxfTUFTSyB8CiAJCQlPTUFQNF9TRE1NQzFfRFIyX1NQRUVEQ1RSTF9NQVNLKTsKIAkJb21hcDRfY3RybF9wYWRfd3JpdGVsKHJlZywgY29udHJvbF9tbWMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHdzcGlubG9jay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9od3NwaW5sb2NrLmMKaW5kZXggMDZkNGE4MC4uNDU0ZGZjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9od3NwaW5sb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9od3NwaW5sb2NrLmMKQEAgLTE5LDIzICsxOSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9od3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAKLXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfc3BpbmxvY2tfbGF0ZW5jeVtdID0gewotCXsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYyAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKLQkJLmZsYWdzID0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9CitzdGF0aWMgc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEgb21hcF9od3NwaW5sb2NrX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLmJhc2VfaWQgPSAwLAogfTsKIAogaW50IF9faW5pdCBod3NwaW5sb2Nrc19pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IG9tYXBfaHdtb2QgKm9oOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAljb25zdCBjaGFyICpvaF9uYW1lID0gInNwaW5sb2NrIjsKIAljb25zdCBjaGFyICpkZXZfbmFtZSA9ICJvbWFwX2h3c3BpbmxvY2siOwogCkBAIC00OCwxMyArNDUsMTMgQEAKIAlpZiAob2ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKGRldl9uYW1lLCAwLCBvaCwgTlVMTCwgMCwKLQkJCQlvbWFwX3NwaW5sb2NrX2xhdGVuY3ksCi0JCQkJQVJSQVlfU0laRShvbWFwX3NwaW5sb2NrX2xhdGVuY3kpLCBmYWxzZSk7Ci0JaWYgKElTX0VSUihvZCkpIHsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQoZGV2X25hbWUsIDAsIG9oLCAmb21hcF9od3NwaW5sb2NrX3BkYXRhLAorCQkJCXNpemVvZihzdHJ1Y3QgaHdzcGlubG9ja19wZGF0YSksCisJCQkJTlVMTCwgMCwgZmFsc2UpOworCWlmIChJU19FUlIocGRldikpIHsKIAkJcHJfZXJyKCJDYW4ndCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6JXNcbiIsIGRldl9uYW1lLAogCQkJCQkJCQlvaF9uYW1lKTsKLQkJcmV0dmFsID0gUFRSX0VSUihvZCk7CisJCXJldHZhbCA9IFBUUl9FUlIocGRldik7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYwppbmRleCAzN2VmYjg2Li43ZjQ3MDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlICJjb250cm9sLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9jaGlwX2lkIG9tYXBfY2hpcDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgb21hcF9yZXZpc2lvbjsKIAogdTMyIG9tYXBfZmVhdHVyZXM7CkBAIC0zOSwxOSArMzgsNiBAQAogfQogRVhQT1JUX1NZTUJPTChvbWFwX3Jldik7CiAKLS8qKgotICogb21hcF9jaGlwX2lzIC0gdGVzdCB3aGV0aGVyIGN1cnJlbnRseSBydW5uaW5nIE9NQVAgbWF0Y2hlcyBhIGNoaXAgdHlwZQotICogQG9jOiBvbWFwX2NoaXBfdCB0byB0ZXN0IGFnYWluc3QKLSAqCi0gKiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnRseS1ydW5uaW5nIE9NQVAgY2hpcCBtYXRjaGVzIHRoZSBzdXBwbGllZAotICogY2hpcCB0eXBlICdvYycuICBSZXR1cm5zIDEgdXBvbiBhIG1hdGNoOyAwIHVwb24gZmFpbHVyZS4KLSAqLwotaW50IG9tYXBfY2hpcF9pcyhzdHJ1Y3Qgb21hcF9jaGlwX2lkIG9jaSkKLXsKLQlyZXR1cm4gKG9jaS5vYyAmIG9tYXBfY2hpcC5vYykgPyAxIDogMDsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9jaGlwX2lzKTsKLQogaW50IG9tYXBfdHlwZSh2b2lkKQogewogCXUzMiB2YWwgPSAwOwpAQCAtMjAxLDggKzE4NywxMSBAQAogCU9NQVAzX0NIRUNLX0ZFQVRVUkUoc3RhdHVzLCBJU1ApOwogCWlmIChjcHVfaXNfb21hcDM2MzAoKSkKIAkJb21hcF9mZWF0dXJlcyB8PSBPTUFQM19IQVNfMTkyTUhaX0NMSzsKLQlpZiAoIWNwdV9pc19vbWFwMzUwNSgpICYmICFjcHVfaXNfb21hcDM1MTcoKSkKKwlpZiAoY3B1X2lzX29tYXAzNDMwKCkgfHwgY3B1X2lzX29tYXAzNjMwKCkpCiAJCW9tYXBfZmVhdHVyZXMgfD0gT01BUDNfSEFTX0lPX1dBS0VVUDsKKwlpZiAoY3B1X2lzX29tYXAzNjMwKCkgfHwgb21hcF9yZXYoKSA9PSBPTUFQMzQzMF9SRVZfRVMzXzEgfHwKKwkgICAgb21hcF9yZXYoKSA9PSBPTUFQMzQzMF9SRVZfRVMzXzFfMikKKwkJb21hcF9mZWF0dXJlcyB8PSBPTUFQM19IQVNfSU9fQ0hBSU5fQ1RSTDsKIAogCW9tYXBfZmVhdHVyZXMgfD0gT01BUDNfSEFTX1NEUkM7CiAKQEAgLTI0MiwxNCArMjMxLDEyIEBACiAJb21hcF9mZWF0dXJlcyA9IE9NQVAzX0hBU19ORU9OOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfY2hlY2tfcmV2aXNpb24odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19jaGVja19yZXZpc2lvbihjb25zdCBjaGFyICoqY3B1X3JldikKIHsKIAl1MzIgY3B1aWQsIGlkY29kZTsKIAl1MTYgaGF3a2V5ZTsKIAl1OCByZXY7CiAKLQlvbWFwX2NoaXAub2MgPSBDSElQX0lTX09NQVAzNDMwOwotCiAJLyoKIAkgKiBXZSBjYW5ub3QgYWNjZXNzIHJldmlzaW9uIHJlZ2lzdGVycyBvbiBFUzEuMC4KIAkgKiBJZiB0aGUgcHJvY2Vzc29yIHR5cGUgaXMgQ29ydGV4LUE4IGFuZCB0aGUgcmV2aXNpb24gaXMgMHgwCkBAIC0yNTgsNyArMjQ1LDcgQEAKIAljcHVpZCA9IHJlYWRfY3B1aWQoQ1BVSURfSUQpOwogCWlmICgoKChjcHVpZCA+PiA0KSAmIDB4ZmZmKSA9PSAweGMwOCkgJiYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSkgewogCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTMV8wOwotCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTMTsKKwkJKmNwdV9yZXYgPSAiMS4wIjsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjc5LDc3ICsyNjYsODUgQEAKIAkJY2FzZSAwOiAvKiBUYWtlIGNhcmUgb2YgZWFybHkgc2FtcGxlcyAqLwogCQljYXNlIDE6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTMl8wOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzI7CisJCQkqY3B1X3JldiA9ICIyLjAiOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMyXzE7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTMjsKKwkJCSpjcHVfcmV2ID0gIjIuMSI7CiAJCQlicmVhazsKIAkJY2FzZSAzOgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNDMwX1JFVl9FUzNfMDsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNDMwRVMzXzA7CisJCQkqY3B1X3JldiA9ICIzLjAiOwogCQkJYnJlYWs7CiAJCWNhc2UgNDoKIAkJCW9tYXBfcmV2aXNpb24gPSBPTUFQMzQzMF9SRVZfRVMzXzE7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzQzMEVTM18xOworCQkJKmNwdV9yZXYgPSAiMy4xIjsKIAkJCWJyZWFrOwogCQljYXNlIDc6CiAJCS8qIEZBTExUSFJPVUdIICovCiAJCWRlZmF1bHQ6CiAJCQkvKiBVc2UgdGhlIGxhdGVzdCBrbm93biByZXZpc2lvbiBhcyBkZWZhdWx0ICovCiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM0MzBfUkVWX0VTM18xXzI7Ci0KLQkJCS8qIFJFVklTSVQ6IEFkZCBDSElQX0lTX09NQVAzNDMwRVMzXzFfMj8gKi8KLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNDMwRVMzXzE7CisJCQkqY3B1X3JldiA9ICIzLjEuMiI7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweGI4Njg6Ci0JCS8qIEhhbmRsZSBPTUFQMzV4eC9BTTM1eHggZGV2aWNlcworCQkvKgorCQkgKiBIYW5kbGUgT01BUC9BTSAzNTA1LzM1MTcgZGV2aWNlcwogCQkgKgotCQkgKiBTZXQgdGhlIGRldmljZSB0byBiZSBPTUFQMzUwNSBoZXJlLiBBY3R1YWwgZGV2aWNlCisJCSAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIE9NQVAzNTE3IGhlcmUuIEFjdHVhbCBkZXZpY2UKIAkJICogaXMgaWRlbnRpZmllZCBsYXRlciBiYXNlZCBvbiB0aGUgZmVhdHVyZXMuCi0JCSAqCi0JCSAqIFJFVklTSVQ6IEFNMzUwNS9BTTM1MTcgc2hvdWxkIGhhdmUgdGhlaXIgb3duIENISVBfSVMKIAkJICovCi0JCW9tYXBfcmV2aXNpb24gPSBPTUFQMzUwNV9SRVYocmV2KTsKLQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM0MzBFUzNfMTsKKwkJc3dpdGNoIChyZXYpIHsKKwkJY2FzZSAwOgorCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTE3X1JFVl9FUzFfMDsKKwkJCSpjcHVfcmV2ID0gIjEuMCI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkvKiBGQUxMVEhST1VHSCAqLworCQlkZWZhdWx0OgorCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTE3X1JFVl9FUzFfMTsKKwkJCSpjcHVfcmV2ID0gIjEuMSI7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSAweGI4OTE6CiAJCS8qIEhhbmRsZSAzNnh4IGRldmljZXMgKi8KLQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM2MzBFUzE7CiAKIAkJc3dpdGNoKHJldikgewogCQljYXNlIDA6IC8qIFRha2UgY2FyZSBvZiBlYXJseSBzYW1wbGVzICovCiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM2MzBfUkVWX0VTMV8wOworCQkJKmNwdV9yZXYgPSAiMS4wIjsKIAkJCWJyZWFrOwogCQljYXNlIDE6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDM2MzBfUkVWX0VTMV8xOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDM2MzBFUzFfMTsKKwkJCSpjcHVfcmV2ID0gIjEuMSI7CiAJCQlicmVhazsKIAkJY2FzZSAyOgorCQkvKiBGQUxMVEhST1VHSCAqLwogCQlkZWZhdWx0OgotCQkJb21hcF9yZXZpc2lvbiA9ICBPTUFQMzYzMF9SRVZfRVMxXzI7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQMzYzMEVTMV8yOworCQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNjMwX1JFVl9FUzFfMjsKKwkJCSpjcHVfcmV2ID0gIjEuMiI7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweGI4MWU6Ci0JCW9tYXBfY2hpcC5vYyA9IENISVBfSVNfVEk4MTZYOwotCiAJCXN3aXRjaCAocmV2KSB7CiAJCWNhc2UgMDoKIAkJCW9tYXBfcmV2aXNpb24gPSBUSTgxNjhfUkVWX0VTMV8wOworCQkJKmNwdV9yZXYgPSAiMS4wIjsKIAkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlvbWFwX3JldmlzaW9uID0gVEk4MTY4X1JFVl9FUzFfMTsKLQkJCWJyZWFrOworCQkvKiBGQUxMVEhST1VHSCAqLwogCQlkZWZhdWx0OgotCQkJb21hcF9yZXZpc2lvbiA9ICBUSTgxNjhfUkVWX0VTMV8xOworCQkJb21hcF9yZXZpc2lvbiA9IFRJODE2OF9SRVZfRVMxXzE7CisJCQkqY3B1X3JldiA9ICIxLjEiOworCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJLyogVW5rbm93biBkZWZhdWx0IHRvIGxhdGVzdCBzaWxpY29uIHJldiBhcyBkZWZhdWx0Ki8KLQkJb21hcF9yZXZpc2lvbiA9ICBPTUFQMzYzMF9SRVZfRVMxXzI7Ci0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAzNjMwRVMxXzI7CisJCS8qIFVua25vd24gZGVmYXVsdCB0byBsYXRlc3Qgc2lsaWNvbiByZXYgYXMgZGVmYXVsdCAqLworCQlvbWFwX3JldmlzaW9uID0gT01BUDM2MzBfUkVWX0VTMV8yOworCQkqY3B1X3JldiA9ICIxLjIiOworCQlwcl93YXJuKCJXYXJuaW5nOiB1bmtub3duIGNoaXAgdHlwZTsgYXNzdW1pbmcgT01BUDM2MzBFUzEuMlxuIik7CiAJfQogfQogCkBAIC0zODIsMjQgKzM3NywyMCBAQAogCQlzd2l0Y2ggKHJldikgewogCQljYXNlIDA6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDQ0MzBfUkVWX0VTMV8wOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDQ0MzBFUzE7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQlkZWZhdWx0OgogCQkJb21hcF9yZXZpc2lvbiA9IE9NQVA0NDMwX1JFVl9FUzJfMDsKLQkJCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVA0NDMwRVMyOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMHhiOTVjOgogCQlzd2l0Y2ggKHJldikgewogCQljYXNlIDM6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDQ0MzBfUkVWX0VTMl8xOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDQ0MzBFUzJfMTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6CiAJCWRlZmF1bHQ6CiAJCQlvbWFwX3JldmlzaW9uID0gT01BUDQ0MzBfUkVWX0VTMl8yOwotCQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDQ0MzBFUzJfMjsKIAkJfQogCQlicmVhazsKIAljYXNlIDB4Yjk0ZToKQEAgLTQwNywxNCArMzk4LDEyIEBACiAJCWNhc2UgMDoKIAkJZGVmYXVsdDoKIAkJCW9tYXBfcmV2aXNpb24gPSBPTUFQNDQ2MF9SRVZfRVMxXzA7Ci0JCQlvbWFwX2NoaXAub2MgfD0gQ0hJUF9JU19PTUFQNDQ2MEVTMV8wOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogVW5rbm93biBkZWZhdWx0IHRvIGxhdGVzdCBzaWxpY29uIHJldiBhcyBkZWZhdWx0ICovCiAJCW9tYXBfcmV2aXNpb24gPSBPTUFQNDQzMF9SRVZfRVMyXzI7Ci0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVA0NDMwRVMyXzI7CiAJfQogCiAJcHJfaW5mbygiT01BUCUwNHggRVMlZC4lZFxuIiwgb21hcF9yZXYoKSA+PiAxNiwKQEAgLTQyNSw5NCArNDE0LDMzIEBACiAJaWYgKG9tYXAzX2hhc18gIyNmZWF0KCkpCQlcCiAJCXByaW50aygjZmVhdCIgIik7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM19jcHVpbmZvKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfY3B1aW5mbyhjb25zdCBjaGFyICpjcHVfcmV2KQogewotCXU4IHJldiA9IEdFVF9PTUFQX1JFVklTSU9OKCk7Ci0JY2hhciBjcHVfbmFtZVsxNl0sIGNwdV9yZXZbMTZdOworCWNvbnN0IGNoYXIgKmNwdV9uYW1lOwogCi0JLyogT01BUDM0MzAgYW5kIE9NQVAzNTMwIGFyZSBhc3N1bWVkIHRvIGJlIHNhbWUuCisJLyoKKwkgKiBPTUFQMzQzMCBhbmQgT01BUDM1MzAgYXJlIGFzc3VtZWQgdG8gYmUgc2FtZS4KIAkgKgogCSAqIE9NQVAzNTI1LCBPTUFQMzUxNSBhbmQgT01BUDM1MDMgY2FuIGJlIGRldGVjdGVkIG9ubHkgYmFzZWQKIAkgKiBvbiBhdmFpbGFibGUgZmVhdHVyZXMuIFVwb24gZGV0ZWN0aW9uLCB1cGRhdGUgdGhlIENQVSBpZAogCSAqIGFuZCBDUFUgY2xhc3MgYml0cy4KIAkgKi8KIAlpZiAoY3B1X2lzX29tYXAzNjMwKCkpIHsKLQkJc3RyY3B5KGNwdV9uYW1lLCAiT01BUDM2MzAiKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzUwNSgpKSB7Ci0JCS8qCi0JCSAqIEFNMzV4eCBkZXZpY2VzCi0JCSAqLwotCQlpZiAob21hcDNfaGFzX3NneCgpKSB7Ci0JCQlvbWFwX3JldmlzaW9uID0gT01BUDM1MTdfUkVWKHJldik7Ci0JCQlzdHJjcHkoY3B1X25hbWUsICJBTTM1MTciKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEFscmVhZHkgc2V0IGluIG9tYXAzX2NoZWNrX3JldmlzaW9uKCkgKi8KLQkJCXN0cmNweShjcHVfbmFtZSwgIkFNMzUwNSIpOwotCQl9CisJCWNwdV9uYW1lID0gIk9NQVAzNjMwIjsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzUxNygpKSB7CisJCS8qIEFNMzV4eCBkZXZpY2VzICovCisJCWNwdV9uYW1lID0gKG9tYXAzX2hhc19zZ3goKSkgPyAiQU0zNTE3IiA6ICJBTTM1MDUiOwogCX0gZWxzZSBpZiAoY3B1X2lzX3RpODE2eCgpKSB7Ci0JCXN0cmNweShjcHVfbmFtZSwgIlRJODE2WCIpOworCQljcHVfbmFtZSA9ICJUSTgxNlgiOwogCX0gZWxzZSBpZiAob21hcDNfaGFzX2l2YSgpICYmIG9tYXAzX2hhc19zZ3goKSkgewogCQkvKiBPTUFQMzQzMCwgT01BUDM1MjUsIE9NQVAzNTE1LCBPTUFQMzUwMyBkZXZpY2VzICovCi0JCXN0cmNweShjcHVfbmFtZSwgIk9NQVAzNDMwLzM1MzAiKTsKKwkJY3B1X25hbWUgPSAiT01BUDM0MzAvMzUzMCI7CiAJfSBlbHNlIGlmIChvbWFwM19oYXNfaXZhKCkpIHsKLQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTI1X1JFVihyZXYpOwotCQlzdHJjcHkoY3B1X25hbWUsICJPTUFQMzUyNSIpOworCQljcHVfbmFtZSA9ICJPTUFQMzUyNSI7CiAJfSBlbHNlIGlmIChvbWFwM19oYXNfc2d4KCkpIHsKLQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTE1X1JFVihyZXYpOwotCQlzdHJjcHkoY3B1X25hbWUsICJPTUFQMzUxNSIpOworCQljcHVfbmFtZSA9ICJPTUFQMzUxNSI7CiAJfSBlbHNlIHsKLQkJb21hcF9yZXZpc2lvbiA9IE9NQVAzNTAzX1JFVihyZXYpOwotCQlzdHJjcHkoY3B1X25hbWUsICJPTUFQMzUwMyIpOwotCX0KLQotCWlmIChjcHVfaXNfb21hcDM2MzAoKSB8fCBjcHVfaXNfdGk4MTZ4KCkpIHsKLQkJc3dpdGNoIChyZXYpIHsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDA6Ci0JCQlzdHJjcHkoY3B1X3JldiwgIjEuMCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAxOgotCQkJc3RyY3B5KGNwdV9yZXYsICIxLjEiKTsKLQkJCWJyZWFrOwotCQljYXNlIE9NQVBfUkVWQklUU18wMjoKLQkJCS8qIEZBTExUSFJPVUdIICovCi0JCWRlZmF1bHQ6Ci0JCQkvKiBVc2UgdGhlIGxhdGVzdCBrbm93biByZXZpc2lvbiBhcyBkZWZhdWx0ICovCi0JCQlzdHJjcHkoY3B1X3JldiwgIjEuMiIpOwotCQl9Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDM1MDUoKSB8fCBjcHVfaXNfb21hcDM1MTcoKSkgewotCQlzd2l0Y2ggKHJldikgewotCQljYXNlIE9NQVBfUkVWQklUU18wMDoKLQkJCXN0cmNweShjcHVfcmV2LCAiMS4wIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDE6Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQlkZWZhdWx0OgotCQkJLyogVXNlIHRoZSBsYXRlc3Qga25vd24gcmV2aXNpb24gYXMgZGVmYXVsdCAqLwotCQkJc3RyY3B5KGNwdV9yZXYsICIxLjEiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXN3aXRjaCAocmV2KSB7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAwOgotCQkJc3RyY3B5KGNwdV9yZXYsICIxLjAiKTsKLQkJCWJyZWFrOwotCQljYXNlIE9NQVBfUkVWQklUU18wMToKLQkJCXN0cmNweShjcHVfcmV2LCAiMi4wIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDI6Ci0JCQlzdHJjcHkoY3B1X3JldiwgIjIuMSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT01BUF9SRVZCSVRTXzAzOgotCQkJc3RyY3B5KGNwdV9yZXYsICIzLjAiKTsKLQkJCWJyZWFrOwotCQljYXNlIE9NQVBfUkVWQklUU18wNDoKLQkJCXN0cmNweShjcHVfcmV2LCAiMy4xIik7Ci0JCQlicmVhazsKLQkJY2FzZSBPTUFQX1JFVkJJVFNfMDU6Ci0JCQkvKiBGQUxMVEhST1VHSCAqLwotCQlkZWZhdWx0OgotCQkJLyogVXNlIHRoZSBsYXRlc3Qga25vd24gcmV2aXNpb24gYXMgZGVmYXVsdCAqLwotCQkJc3RyY3B5KGNwdV9yZXYsICIzLjEuMiIpOwotCQl9CisJCWNwdV9uYW1lID0gIk9NQVAzNTAzIjsKIAl9CiAKIAkvKiBQcmludCB2ZXJib3NlIGluZm9ybWF0aW9uICovCkBAIC01MzMsNiArNDYxLDggQEAKICAqLwogdm9pZCBfX2luaXQgb21hcDJfY2hlY2tfcmV2aXNpb24odm9pZCkKIHsKKwljb25zdCBjaGFyICpjcHVfcmV2OworCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYW4gaWRlYSBhYm91dCB0aGUgcHJvY2Vzc29yIHJldmlzaW9uIHNldAogCSAqIGVhcmxpZXIgd2l0aCBvbWFwMl9zZXRfZ2xvYmFsc190YXAoKS4KQEAgLTU0MCw3ICs0NzAsNyBAQAogCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewogCQlvbWFwMjR4eF9jaGVja19yZXZpc2lvbigpOwogCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJb21hcDNfY2hlY2tfcmV2aXNpb24oKTsKKwkJb21hcDNfY2hlY2tfcmV2aXNpb24oJmNwdV9yZXYpOwogCiAJCS8qIFRJODE2WCBkb2Vzbid0IGhhdmUgZmVhdHVyZSByZWdpc3RlciAqLwogCQlpZiAoIWNwdV9pc190aTgxNngoKSkKQEAgLTU0OCw3ICs0NzgsNyBAQAogCQllbHNlCiAJCQl0aTgxNnhfY2hlY2tfZmVhdHVyZXMoKTsKIAotCQlvbWFwM19jcHVpbmZvKCk7CisJCW9tYXAzX2NwdWluZm8oY3B1X3Jldik7CiAJCXJldHVybjsKIAl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CiAJCW9tYXA0X2NoZWNrX3JldmlzaW9uKCk7CkBAIC01NTcsMjIgKzQ4Nyw2IEBACiAJfSBlbHNlIHsKIAkJcHJfZXJyKCJPTUFQIHJldmlzaW9uIHVua25vd24sIHBsZWFzZSBmaXghXG4iKTsKIAl9Ci0KLQkvKgotCSAqIE9LLCBub3cgd2Uga25vdyB0aGUgZXhhY3QgcmV2aXNpb24uIEluaXRpYWxpemUgb21hcF9jaGlwIGJpdHMKLQkgKiBmb3IgcG93ZXJkb3dtYWluIGFuZCBjbG9ja2RvbWFpbiBjb2RlLgotCSAqLwotCWlmIChjcHVfaXNfb21hcDI0M3goKSkgewotCQkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyAyNDMwRVMyLjEgYW5kIDI0MzAtYWxsICovCi0JCW9tYXBfY2hpcC5vYyB8PSBDSElQX0lTX09NQVAyNDMwOwotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0MngoKSkgewotCQkvKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyAyNDIwRVMyLjEuMSBhbmQgMjQyMC1hbGwgKi8KLQkJb21hcF9jaGlwLm9jIHw9IENISVBfSVNfT01BUDI0MjA7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9lcnIoIlVuaW5pdGlhbGl6ZWQgb21hcF9jaGlwLCBwbGVhc2UgZml4IVxuIik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9jdHJsX21vZHVsZV9wYWRfY29yZV80NHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9jdHJsX21vZHVsZV9wYWRfY29yZV80NHh4LmgKaW5kZXggYzg4NDIwZC4uMWUyZDMzMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvY3RybF9tb2R1bGVfcGFkX2NvcmVfNDR4eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2N0cmxfbW9kdWxlX3BhZF9jb3JlXzQ0eHguaApAQCAtOTQxLDEwICs5NDEsMTAgQEAKICNkZWZpbmUgT01BUDRfRFNJMl9MQU5FRU5BQkxFX01BU0sJCQkJKDB4NyA8PCAyOSkKICNkZWZpbmUgT01BUDRfRFNJMV9MQU5FRU5BQkxFX1NISUZUCQkJCTI0CiAjZGVmaW5lIE9NQVA0X0RTSTFfTEFORUVOQUJMRV9NQVNLCQkJCSgweDFmIDw8IDI0KQotI2RlZmluZSBPTUFQNF9EU0kxX1BJUERfU0hJRlQJCQkJCTE5Ci0jZGVmaW5lIE9NQVA0X0RTSTFfUElQRF9NQVNLCQkJCQkoMHgxZiA8PCAxOSkKLSNkZWZpbmUgT01BUDRfRFNJMl9QSVBEX1NISUZUCQkJCQkxNAotI2RlZmluZSBPTUFQNF9EU0kyX1BJUERfTUFTSwkJCQkJKDB4MWYgPDwgMTQpCisjZGVmaW5lIE9NQVA0X0RTSTJfUElQRF9TSElGVAkJCQkJMTkKKyNkZWZpbmUgT01BUDRfRFNJMl9QSVBEX01BU0sJCQkJCSgweDFmIDw8IDE5KQorI2RlZmluZSBPTUFQNF9EU0kxX1BJUERfU0hJRlQJCQkJCTE0CisjZGVmaW5lIE9NQVA0X0RTSTFfUElQRF9NQVNLCQkJCQkoMHgxZiA8PCAxNCkKIAogLyogQ09OVFJPTF9NQ0JTUExQICovCiAjZGVmaW5lIE9NQVA0X0FMQkNUUkxSWF9GU1hfU0hJRlQJCQkJMzEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDQ4YWRmZTkuLjEzZjk4ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTMsMTUgKzEzLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAKLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KICNpbmNsdWRlIDxwbGF0L3NlcmlhbC5oPgogCiAjZGVmaW5lIFVBUlRfT0ZGU0VUKGFkZHIpCSgoYWRkcikgJiAweDAwZmZmZmZmKQogCi0jZGVmaW5lIG9tYXBfdWFydF92MnAoeCkJKCh4KSAtIFBBR0VfT0ZGU0VUICsgUExBVF9QSFlTX09GRlNFVCkKLSNkZWZpbmUgb21hcF91YXJ0X3Aydih4KQkoKHgpIC0gUExBVF9QSFlTX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotCiAJCS5wdXNoc2VjdGlvbiAuZGF0YQogb21hcF91YXJ0X3BoeXM6CS53b3JkCTAKIG9tYXBfdWFydF92aXJ0Ogkud29yZAkwCkBAIC0zNCwyNiArMjksMjUgQEAKIAkJICogdGhlIGRlc2lyZWQgVUFSVCBwaHlzIGFuZCB2aXJ0IGFkZHJlc3NlcyB0ZW1wb3JhcmlseSBpbnRvCiAJCSAqIHRoZSBvbWFwX3VhcnRfcGh5cyBhbmQgb21hcF91YXJ0X3ZpcnQgYWJvdmUuCiAJCSAqLwotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAKIAkJLyogVXNlIG9tYXBfdWFydF9waHlzL3ZpcnQgaWYgYWxyZWFkeSBjb25maWd1cmVkICovCi0xMDoJCW1yYwlwMTUsIDAsIFxycCwgYzEsIGMwCi0JCXRzdAlccnAsICMxCQkJQCBNTVUgZW5hYmxlZD8KLQkJbGRyZXEJXHJwLCA9b21hcF91YXJ0X3YycChvbWFwX3VhcnRfcGh5cykJQCBNTVUgZGlzYWJsZWQKLQkJbGRybmUJXHJwLCA9b21hcF91YXJ0X3BoeXMJQCBNTVUgZW5hYmxlZAotCQlhZGQJXHJ2LCBccnAsICM0CQlAIG9tYXBfdWFydF92aXJ0Ci0JCWxkcglccnAsIFtccnAsICMwXQotCQlsZHIJXHJ2LCBbXHJ2LCAjMF0KKzEwOgkJYWRyCVxycCwgOTlmCQlAIGdldCBlZmZlY3RpdmUgYWRkciBvZiA5OWYKKwkJbGRyCVxydiwgW1xycF0JCUAgZ2V0IGFic29sdXRlIGFkZHIgb2YgOTlmCisJCXN1YglccnYsIFxydiwgXHJwCQlAIG9mZnNldCBiZXR3ZWVuIHRoZSB0d28KKwkJbGRyCVxycCwgW1xycCwgIzRdCQlAIGFicyBhZGRyIG9mIG9tYXBfdWFydF9waHlzCisJCXN1YglcdG1wLCBccnAsIFxydgkJQCBtYWtlIGl0IGVmZmVjdGl2ZQorCQlsZHIJXHJwLCBbXHRtcCwgIzBdCQlAIG9tYXBfdWFydF9waHlzCisJCWxkcglccnYsIFtcdG1wLCAjNF0JCUAgb21hcF91YXJ0X3ZpcnQKIAkJY21wCVxycCwgIzAJCQlAIGlzIHBvcnQgY29uZmlndXJlZD8KIAkJY21wbmUJXHJ2LCAjMAotCQlibmUJOTlmCQkJQCBhbHJlYWR5IGNvbmZpZ3VyZWQKKwkJYm5lCTEwMGYJCQlAIGFscmVhZHkgY29uZmlndXJlZAogCiAJCS8qIENoZWNrIHRoZSBkZWJ1ZyBVQVJUIGNvbmZpZ3VyYXRpb24gc2V0IGluIHVuY29tcHJlc3MuaCAqLwotCQltcmMJcDE1LCAwLCBccnAsIGMxLCBjMAotCQl0c3QJXHJwLCAjMQkJCUAgTU1VIGVuYWJsZWQ/Ci0JCWxkcmVxCVxycCwgPU9NQVBfVUFSVF9JTkZPCUAgTU1VIG5vdCBlbmFibGVkCi0JCWxkcm5lCVxycCwgPW9tYXBfdWFydF9wMnYoT01BUF9VQVJUX0lORk8pCUAgTU1VIGVuYWJsZWQKLQkJbGRyCVxycCwgW1xycCwgIzBdCisJCW1vdglccnAsIHBjCisJCWxkcglccnYsID1PTUFQX1VBUlRfSU5GT19PRlMKKwkJYW5kCVxycCwgXHJwLCAjMHhmZjAwMDAwMAorCQlsZHIJXHJwLCBbXHJwLCBccnZdCiAKIAkJLyogU2VsZWN0IHRoZSBVQVJUIHRvIHVzZSBiYXNlZCBvbiB0aGUgVUFSVDEgc2NyYXRjaHBhZCB2YWx1ZSAqLwogCQljbXAJXHJwLCAjMAkJCUAgbm8gcG9ydCBjb25maWd1cmVkPwpAQCAtMTA2LDUwICsxMDAsNDcgQEAKIAkJYgk5OGYKIDgzOgkJbW92CVxycCwgI1VBUlRfT0ZGU0VUKFRJODE2WF9VQVJUM19CQVNFKQogCQliCTk4ZgorCiA5NToJCWxkcglccnAsID1aT09NX1VBUlRfQkFTRQotCQltcmMJcDE1LCAwLCBccnYsIGMxLCBjMAotCQl0c3QJXHJ2LCAjMQkJCUAgTU1VIGVuYWJsZWQ/Ci0JCWxkcmVxCVxydiwgPW9tYXBfdWFydF92MnAob21hcF91YXJ0X3BoeXMpCUAgTU1VIGRpc2FibGVkCi0JCWxkcm5lCVxydiwgPW9tYXBfdWFydF9waHlzCUAgTU1VIGVuYWJsZWQKLQkJc3RyCVxycCwgW1xydiwgIzBdCisJCXN0cglccnAsIFtcdG1wLCAjMF0JCUAgb21hcF91YXJ0X3BoeXMKIAkJbGRyCVxycCwgPVpPT01fVUFSVF9WSVJUCi0JCWFkZAlccnYsIFxydiwgIzQJCUAgb21hcF91YXJ0X3ZpcnQKLQkJc3RyCVxycCwgW1xydiwgIzBdCisJCXN0cglccnAsIFtcdG1wLCAjNF0JCUAgb21hcF91YXJ0X3ZpcnQKIAkJbW92CVxycCwgIyhVQVJUX0xTUiA8PCBaT09NX1BPUlRfU0hJRlQpCi0JCWFkZAlccnYsIFxydiwgIzQJCUAgb21hcF91YXJ0X2xzcgotCQlzdHIJXHJwLCBbXHJ2LCAjMF0KKwkJc3RyCVxycCwgW1x0bXAsICM4XQkJQCBvbWFwX3VhcnRfbHNyCiAJCWIJMTBiCiAKIAkJLyogU3RvcmUgYm90aCBwaHlzIGFuZCB2aXJ0IGFkZHJlc3MgZm9yIHRoZSB1YXJ0ICovCiA5ODoJCWFkZAlccnAsIFxycCwgIzB4NDgwMDAwMDAJQCBwaHlzIGJhc2UKLQkJbXJjCXAxNSwgMCwgXHJ2LCBjMSwgYzAKLQkJdHN0CVxydiwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccnYsID1vbWFwX3VhcnRfdjJwKG9tYXBfdWFydF9waHlzKQlAIE1NVSBkaXNhYmxlZAotCQlsZHJuZQlccnYsID1vbWFwX3VhcnRfcGh5cwlAIE1NVSBlbmFibGVkCi0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzBdCQlAIG9tYXBfdWFydF9waHlzCiAJCXN1YglccnAsIFxycCwgIzB4NDgwMDAwMDAJQCBwaHlzIGJhc2UKIAkJYWRkCVxycCwgXHJwLCAjMHhmYTAwMDAwMAlAIHZpcnQgYmFzZQotCQlhZGQJXHJ2LCBccnYsICM0CQlAIG9tYXBfdWFydF92aXJ0Ci0JCXN0cglccnAsIFtccnYsICMwXQorCQlzdHIJXHJwLCBbXHRtcCwgIzRdCQlAIG9tYXBfdWFydF92aXJ0CiAJCW1vdglccnAsICMoVUFSVF9MU1IgPDwgT01BUF9QT1JUX1NISUZUKQotCQlhZGQJXHJ2LCBccnYsICM0CQlAIG9tYXBfdWFydF9sc3IKLQkJc3RyCVxycCwgW1xydiwgIzBdCisJCXN0cglccnAsIFtcdG1wLCAjOF0JCUAgb21hcF91YXJ0X2xzcgogCiAJCWIJMTBiCi05OToKKworCQkuYWxpZ24KKzk5OgkJLndvcmQJLgorCQkud29yZAlvbWFwX3VhcnRfcGh5cworCQkubHRvcmcKKworMTAwOgkJLyogUGFzcyB0aGUgVUFSVF9MU1IgcmVnIGFkZHJlc3MgKi8KKwkJbGRyCVx0bXAsIFtcdG1wLCAjOF0JQCBvbWFwX3VhcnRfbHNyCisJCWFkZAlccnAsIFxycCwgXHRtcAorCQlhZGQJXHJ2LCBccnYsIFx0bXAKIAkJLmVuZG0KIAogCQkubWFjcm8Jc2VuZHVhcnQscmQscngKLQkJc3RyYglccmQsIFtccnhdCisJCW9ycglccmQsIFxyZCwgXHJ4LCBsc2wgIzI0CUAgcHJlc2VydmUgTFNSIHJlZyBvZmZzZXQKKwkJYmljCVxyeCwgXHJ4LCAjMHhmZgkJQCBnZXQgYmFzZSAoVEhSKSByZWcgYWRkcmVzcworCQlzdHJiCVxyZCwgW1xyeF0JCUAgc2VuZCBsb3dlciBieXRlIG9mIHJkCisJCW9ycglccngsIFxyeCwgXHJkLCBsc3IgIzI0CUAgcmVzdG9yZSBvcmlnaW5hbCByeCAoTFNSKQorCQliaWMJXHJkLCBccmQsICMoMHhmZiA8PCAyNCkJQCByZXN0b3JlIG9yaWdpbmFsIHJkCiAJCS5lbmRtCiAKIAkJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4Ci0xMDAxOgkJbXJjCXAxNSwgMCwgXHJkLCBjMSwgYzAKLQkJdHN0CVxyZCwgIzEJCQlAIE1NVSBlbmFibGVkPwotCQlsZHJlcQlccmQsID1vbWFwX3VhcnRfdjJwKG9tYXBfdWFydF9sc3IpCUAgTU1VIGRpc2FibGVkCi0JCWxkcm5lCVxyZCwgPW9tYXBfdWFydF9sc3IJQCBNTVUgZW5hYmxlZAotCQlsZHIJXHJkLCBbXHJkLCAjMF0KLQkJbGRyYglccmQsIFtccngsIFxyZF0KKzEwMDE6CQlsZHJiCVxyZCwgW1xyeF0JCUAgcnggY29udGFpbnMgVUFSVF9MU1IgYWRkcmVzcwogCQlhbmQJXHJkLCBccmQsICMoVUFSVF9MU1JfVEVNVCB8IFVBUlRfTFNSX1RIUkUpCiAJCXRlcQlccmQsICMoVUFSVF9MU1JfVEVNVCB8IFVBUlRfTFNSX1RIUkUpCiAJCWJuZQkxMDAxYgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggY2ViOGI3ZS4uZmViOTBhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC03OCw3ICs3OCw3IEBACiA0NDAxOgkJbGRyICAgICBcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9JTlRBQ0tdCiAJCWxkciAgICAgXHRtcCwgPTEwMjEKIAkJYmljICAgICBcaXJxbnIsIFxpcnFzdGF0LCAjMHgxYzAwCi0JCWNtcCAgICAgXGlycW5yLCAjMjkKKwkJY21wICAgICBcaXJxbnIsICMxNQogCQljbXBjYyAgIFxpcnFuciwgXGlycW5yCiAJCWNtcG5lICAgXGlycW5yLCBcdG1wCiAJCWNtcGNzICAgXGlycW5yLCBcaXJxbnIKQEAgLTEwMSwxOCArMTAxLDYgQEAKIAkJaXQJY3MKIAkJY21wY3MJXGlycW5yLCBcaXJxbnIKIAkJLmVuZG0KLQotCQkvKiBBcyBhYm92ZSwgdGhpcyBhc3N1bWVzIHRoYXQgaXJxc3RhdCBhbmQgYmFzZSBhcmUgcHJlc2VydmVkICovCi0KLQkJLm1hY3JvIHRlc3RfZm9yX2x0aXJxLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCi0JCWJpYwlcaXJxbnIsIFxpcnFzdGF0LCAjMHgxYzAwCi0JCW1vdiAJXHRtcCwgIzAKLQkJY21wCVxpcnFuciwgIzI5Ci0JCWl0dAllcQotCQltb3ZlcQlcdG1wLCAjMQotCQlzdHJlcQlcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9FT0ldCi0JCWNtcAlcdG1wLCAjMAotCQkuZW5kbQogI2VuZGlmCS8qIENPTkZJR19TTVAgKi8KIAogI2Vsc2UJLyogTVVMVElfT01BUDIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNmQzMmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICovCi0KLSNpbmNsdWRlIDxwbGF0L21lbW9yeS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCmluZGV4IDJjZTFjZTYuLjI1ZDIwY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzUsMTQgKzM0LDE2IEBACiAjaW5jbHVkZSAiY2xvY2syeHh4LmgiCiAjaW5jbHVkZSAiY2xvY2szeHh4LmgiCiAjaW5jbHVkZSAiY2xvY2s0NHh4LmgiCi0jaW5jbHVkZSAiaW8uaCIKIAorI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwLXBtLmg+CisjaW5jbHVkZSAidm9sdGFnZS5oIgogI2luY2x1ZGUgInBvd2VyZG9tYWluLmgiCiAKICNpbmNsdWRlICJjbG9ja2RvbWFpbi5oIgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogI2luY2x1ZGUgPHBsYXQvbXVsdGkuaD4KKyNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogCiAvKgogICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBtYXkgcHJvdmlkZSB0aGUgZXh0cmEgbWFwcGluZyBiZXNpZGVzIHRoZQpAQCAtMjM5LDI1ICsyNDAsMTEgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pbml0IF9vbWFwMl9tYXBfY29tbW9uX2lvKHZvaWQpCi17Ci0JLyogTm9ybWFsbHkgZGV2aWNlbWFwc19pbml0KCkgd291bGQgZmx1c2ggY2FjaGVzIGFuZCB0bGIgYWZ0ZXIKLQkgKiBtZGVzYy0+bWFwX2lvKCksIGJ1dCB3ZSBtdXN0IGFsc28gZG8gaXQgaGVyZSBiZWNhdXNlIG9mIHRoZSBDUFUKLQkgKiByZXZpc2lvbiBjaGVjayBiZWxvdy4KLQkgKi8KLQlsb2NhbF9mbHVzaF90bGJfYWxsKCk7Ci0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0KLQlvbWFwMl9jaGVja19yZXZpc2lvbigpOwotCW9tYXBfc3JhbV9pbml0KCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfU09DX09NQVAyNDIwCiB2b2lkIF9faW5pdCBvbWFwMjQyeF9tYXBfY29tbW9uX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KG9tYXAyNHh4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcDI0eHhfaW9fZGVzYykpOwogCWlvdGFibGVfaW5pdChvbWFwMjQyeF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAyNDJ4X2lvX2Rlc2MpKTsKLQlfb21hcDJfbWFwX2NvbW1vbl9pbygpOwogfQogI2VuZGlmCiAKQEAgLTI2Niw3ICsyNTMsNiBAQAogewogCWlvdGFibGVfaW5pdChvbWFwMjR4eF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAyNHh4X2lvX2Rlc2MpKTsKIAlpb3RhYmxlX2luaXQob21hcDI0M3hfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMjQzeF9pb19kZXNjKSk7Ci0JX29tYXAyX21hcF9jb21tb25faW8oKTsKIH0KICNlbmRpZgogCkBAIC0yNzQsNyArMjYwLDYgQEAKIHZvaWQgX19pbml0IG9tYXAzNHh4X21hcF9jb21tb25faW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQob21hcDM0eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMzR4eF9pb19kZXNjKSk7Ci0JX29tYXAyX21hcF9jb21tb25faW8oKTsKIH0KICNlbmRpZgogCkBAIC0yODIsNyArMjY3LDYgQEAKIHZvaWQgX19pbml0IG9tYXB0aTgxNnhfbWFwX2NvbW1vbl9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChvbWFwdGk4MTZ4X2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcHRpODE2eF9pb19kZXNjKSk7Ci0JX29tYXAyX21hcF9jb21tb25faW8oKTsKIH0KICNlbmRpZgogCkBAIC0yOTAsNyArMjc0LDYgQEAKIHZvaWQgX19pbml0IG9tYXA0NHh4X21hcF9jb21tb25faW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQob21hcDQ0eHhfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNDR4eF9pb19kZXNjKSk7Ci0JX29tYXAyX21hcF9jb21tb25faW8oKTsKIH0KICNlbmRpZgogCkBAIC0zMzYsMzAgKzMxOSwxNyBAQAogLyogU2VlIGlycS5jLCBvbWFwNC1jb21tb24uYyBhbmQgZW50cnktbWFjcm8uUyAqLwogdm9pZCBfX2lvbWVtICpvbWFwX2lycV9iYXNlOwogCi12b2lkIF9faW5pdCBvbWFwMl9pbml0X2NvbW1vbl9pbmZyYXN0cnVjdHVyZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG9tYXBfY29tbW9uX2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwMl9jaGVja19yZXZpc2lvbigpOworCW9tYXBfaW9yZW1hcF9pbml0KCk7CisJb21hcF9pbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfaHdtb2RfaW5pdF9wb3N0c2V0dXAodm9pZCkKIHsKIAl1OCBwb3N0c2V0dXBfc3RhdGU7CiAKLQlpZiAoY3B1X2lzX29tYXAyNDJ4KCkpIHsKLQkJb21hcDJ4eHhfcG93ZXJkb21haW5zX2luaXQoKTsKLQkJb21hcDJ4eHhfY2xvY2tkb21haW5zX2luaXQoKTsKLQkJb21hcDI0MjBfaHdtb2RfaW5pdCgpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDN4KCkpIHsKLQkJb21hcDJ4eHhfcG93ZXJkb21haW5zX2luaXQoKTsKLQkJb21hcDJ4eHhfY2xvY2tkb21haW5zX2luaXQoKTsKLQkJb21hcDI0MzBfaHdtb2RfaW5pdCgpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJb21hcDN4eHhfcG93ZXJkb21haW5zX2luaXQoKTsKLQkJb21hcDN4eHhfY2xvY2tkb21haW5zX2luaXQoKTsKLQkJb21hcDN4eHhfaHdtb2RfaW5pdCgpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJb21hcDQ0eHhfcG93ZXJkb21haW5zX2luaXQoKTsKLQkJb21hcDQ0eHhfY2xvY2tkb21haW5zX2luaXQoKTsKLQkJb21hcDQ0eHhfaHdtb2RfaW5pdCgpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiQ291bGQgbm90IGluaXQgaHdtb2QgZGF0YSAtIHVua25vd24gU29DXG4iKTsKLSAgICAgICAgfQotCiAJLyogU2V0IHRoZSBkZWZhdWx0IHBvc3RzZXR1cCBzdGF0ZSBmb3IgYWxsIGh3bW9kcyAqLwogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiAJcG9zdHNldHVwX3N0YXRlID0gX0hXTU9EX1NUQVRFX0lETEU7CkBAIC0zNzYsNyArMzQ2LDcgQEAKIAkgKiBvbWFwX2h3bW9kX2xhdGVfaW5pdCgpLCBzbyBib2FyZHMgdGhhdCBkZXNpcmUgZnVsbCB3YXRjaGRvZwogCSAqIGNvdmVyYWdlIG9mIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjYW4gcmVwcm9ncmFtIHRoZQogCSAqIHBvc3RzZXR1cF9zdGF0ZSBiZXR3ZWVuIHRoZSBjYWxscyB0bwotCSAqIG9tYXAyX2luaXRfY29tbW9uX2luZnJhKCkgYW5kIG9tYXAyX2luaXRfY29tbW9uX2RldmljZXMoKS4KKwkgKiBvbWFwMl9pbml0X2NvbW1vbl9pbmZyYSgpIGFuZCBvbWFwX3NkcmNfaW5pdCgpLgogCSAqCiAJICogWFhYIGlkZWFsbHkgd2UgY291bGQgZGV0ZWN0IHdoZXRoZXIgdGhlIE1QVSBXRFQgd2FzIGN1cnJlbnRseQogCSAqIGVuYWJsZWQgaGVyZSBhbmQgbWFrZSB0aGlzIGNvbmRpdGlvbmFsCkBAIC0zODcsMjcgKzM1NywxMDcgQEAKIAkJCQkgICAgICZwb3N0c2V0dXBfc3RhdGUpOwogCiAJb21hcF9wbV9pZl9lYXJseV9pbml0KCk7Ci0KLQlpZiAoY3B1X2lzX29tYXAyNDIwKCkpCi0JCW9tYXAyNDIwX2Nsa19pbml0KCk7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXAyNDMwKCkpCi0JCW9tYXAyNDMwX2Nsa19pbml0KCk7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCi0JCW9tYXAzeHh4X2Nsa19pbml0KCk7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCW9tYXA0eHh4X2Nsa19pbml0KCk7Ci0JZWxzZQotCQlwcl9lcnIoIkNvdWxkIG5vdCBpbml0IGNsb2NrIGZyYW1ld29yayAtIHVua25vd24gU29DXG4iKTsKIH0KIAotdm9pZCBfX2luaXQgb21hcDJfaW5pdF9jb21tb25fZGV2aWNlcyhzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczAsCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDIKK3ZvaWQgX19pbml0IG9tYXAyNDIwX2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwMl9zZXRfZ2xvYmFsc18yNDJ4KCk7CisJb21hcF9jb21tb25faW5pdF9lYXJseSgpOworCW9tYXAyeHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQoKTsKKwlvbWFwMjQyeF9wb3dlcmRvbWFpbnNfaW5pdCgpOworCW9tYXAyNDJ4X2Nsb2NrZG9tYWluc19pbml0KCk7CisJb21hcDI0MjBfaHdtb2RfaW5pdCgpOworCW9tYXBfaHdtb2RfaW5pdF9wb3N0c2V0dXAoKTsKKwlvbWFwMjQyMF9jbGtfaW5pdCgpOworfQorCit2b2lkIF9faW5pdCBvbWFwMjQzMF9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDJfc2V0X2dsb2JhbHNfMjQzeCgpOworCW9tYXBfY29tbW9uX2luaXRfZWFybHkoKTsKKwlvbWFwMnh4eF92b2x0YWdlZG9tYWluc19pbml0KCk7CisJb21hcDI0M3hfcG93ZXJkb21haW5zX2luaXQoKTsKKwlvbWFwMjQzeF9jbG9ja2RvbWFpbnNfaW5pdCgpOworCW9tYXAyNDMwX2h3bW9kX2luaXQoKTsKKwlvbWFwX2h3bW9kX2luaXRfcG9zdHNldHVwKCk7CisJb21hcDI0MzBfY2xrX2luaXQoKTsKK30KKyNlbmRpZgorCisvKgorICogQ3VycmVudGx5IG9ubHkgYm9hcmQtb21hcDNiZWFnbGUuYyBzaG91bGQgY2FsbCB0aGlzIGJlY2F1c2Ugb2YgdGhlCisgKiBzYW1lIG1hY2hpbmVfaWQgZm9yIDM0eHggYW5kIDM2eHggYmVhZ2xlLi4gV2lsbCBnZXQgZml4ZWQgd2l0aCBEVC4KKyAqLworI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCit2b2lkIF9faW5pdCBvbWFwM19pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDJfc2V0X2dsb2JhbHNfM3h4eCgpOworCW9tYXBfY29tbW9uX2luaXRfZWFybHkoKTsKKwlvbWFwM3h4eF92b2x0YWdlZG9tYWluc19pbml0KCk7CisJb21hcDN4eHhfcG93ZXJkb21haW5zX2luaXQoKTsKKwlvbWFwM3h4eF9jbG9ja2RvbWFpbnNfaW5pdCgpOworCW9tYXAzeHh4X2h3bW9kX2luaXQoKTsKKwlvbWFwX2h3bW9kX2luaXRfcG9zdHNldHVwKCk7CisJb21hcDN4eHhfY2xrX2luaXQoKTsKK30KKwordm9pZCBfX2luaXQgb21hcDM0MzBfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAzX2luaXRfZWFybHkoKTsKK30KKwordm9pZCBfX2luaXQgb21hcDM1eHhfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAzX2luaXRfZWFybHkoKTsKK30KKwordm9pZCBfX2luaXQgb21hcDM2MzBfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAzX2luaXRfZWFybHkoKTsKK30KKwordm9pZCBfX2luaXQgYW0zNXh4X2luaXRfZWFybHkodm9pZCkKK3sKKwlvbWFwM19pbml0X2Vhcmx5KCk7Cit9CisKK3ZvaWQgX19pbml0IHRpODE2eF9pbml0X2Vhcmx5KHZvaWQpCit7CisJb21hcDJfc2V0X2dsb2JhbHNfdGk4MTZ4KCk7CisJb21hcF9jb21tb25faW5pdF9lYXJseSgpOworCW9tYXAzeHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQoKTsKKwlvbWFwM3h4eF9wb3dlcmRvbWFpbnNfaW5pdCgpOworCW9tYXAzeHh4X2Nsb2NrZG9tYWluc19pbml0KCk7CisJb21hcDN4eHhfaHdtb2RfaW5pdCgpOworCW9tYXBfaHdtb2RfaW5pdF9wb3N0c2V0dXAoKTsKKwlvbWFwM3h4eF9jbGtfaW5pdCgpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNAordm9pZCBfX2luaXQgb21hcDQ0MzBfaW5pdF9lYXJseSh2b2lkKQoreworCW9tYXAyX3NldF9nbG9iYWxzXzQ0M3goKTsKKwlvbWFwX2NvbW1vbl9pbml0X2Vhcmx5KCk7CisJb21hcDQ0eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCgpOworCW9tYXA0NHh4X3Bvd2VyZG9tYWluc19pbml0KCk7CisJb21hcDQ0eHhfY2xvY2tkb21haW5zX2luaXQoKTsKKwlvbWFwNDR4eF9od21vZF9pbml0KCk7CisJb21hcF9od21vZF9pbml0X3Bvc3RzZXR1cCgpOworCW9tYXA0eHh4X2Nsa19pbml0KCk7Cit9CisjZW5kaWYKKwordm9pZCBfX2luaXQgb21hcF9zZHJjX2luaXQoc3RydWN0IG9tYXBfc2RyY19wYXJhbXMgKnNkcmNfY3MwLAogCQkJCSAgICAgIHN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX2NzMSkKIHsKKwlvbWFwX3NyYW1faW5pdCgpOworCiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IG9tYXAzX2hhc19zZHJjKCkpIHsKIAkJb21hcDJfc2RyY19pbml0KHNkcmNfY3MwLCBzZHJjX2NzMSk7CiAJCV9vbWFwMl9pbml0X3JlcHJvZ3JhbV9zZHJjKCk7CiAJfQotCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvLmgKaW5kZXggZmQyMzBjNi4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW8uaApAQCAtMSw3ICswLDAgQEAKLQotI2lmbmRlZiBfX01BQ0hfT01BUDJfSU9fSF9fCi0jZGVmaW5lIF9fTUFDSF9PTUFQMl9JT19IX18KLQotZXh0ZXJuIGludCBfX2luaXQgb21hcF9zcmFtX2luaXQodm9pZCk7Ci0KLSNlbmRpZiAvKiAgX19NQUNIX09NQVAyX0lPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pb21tdTIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW9tbXUyLmMKaW5kZXggZjI4NjAxMi4uZWVmYzM3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pb21tdTIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lvbW11Mi5jCkBAIC02Niw3ICs2Niw3IEBACiAJICgocGdzeikgPT0gTU1VX0NBTV9QR1NaXzRLKSAgPyAweGZmZmZmMDAwIDogMCkKIAogCi1zdGF0aWMgdm9pZCBfX2lvbW11X3NldF90d2woc3RydWN0IGlvbW11ICpvYmosIGJvb2wgb24pCitzdGF0aWMgdm9pZCBfX2lvbW11X3NldF90d2woc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgYm9vbCBvbikKIHsKIAl1MzIgbCA9IGlvbW11X3JlYWRfcmVnKG9iaiwgTU1VX0NOVEwpOwogCkBAIC04NSw3ICs4NSw3IEBACiB9CiAKIAotc3RhdGljIGludCBvbWFwMl9pb21tdV9lbmFibGUoc3RydWN0IGlvbW11ICpvYmopCitzdGF0aWMgaW50IG9tYXAyX2lvbW11X2VuYWJsZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQogewogCXUzMiBsLCBwYTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CkBAIC0xMjcsNyArMTI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfaW9tbXVfZGlzYWJsZShzdHJ1Y3QgaW9tbXUgKm9iaikKK3N0YXRpYyB2b2lkIG9tYXAyX2lvbW11X2Rpc2FibGUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaikKIHsKIAl1MzIgbCA9IGlvbW11X3JlYWRfcmVnKG9iaiwgTU1VX0NOVEwpOwogCkBAIC0xMzgsMTIgKzEzOCwxMiBAQAogCWRldl9kYmcob2JqLT5kZXYsICIlcyBpcyBzaHV0dGluZyBkb3duXG4iLCBvYmotPm5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9zZXRfdHdsKHN0cnVjdCBpb21tdSAqb2JqLCBib29sIG9uKQorc3RhdGljIHZvaWQgb21hcDJfaW9tbXVfc2V0X3R3bChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBib29sIG9uKQogewogCV9faW9tbXVfc2V0X3R3bChvYmosIGZhbHNlKTsKIH0KIAotc3RhdGljIHUzMiBvbWFwMl9pb21tdV9mYXVsdF9pc3Ioc3RydWN0IGlvbW11ICpvYmosIHUzMiAqcmEpCitzdGF0aWMgdTMyIG9tYXAyX2lvbW11X2ZhdWx0X2lzcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgKnJhKQogewogCXUzMiBzdGF0LCBkYTsKIAl1MzIgZXJycyA9IDA7CkBAIC0xNzMsMTMgKzE3MywxMyBAQAogCXJldHVybiBlcnJzOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMl90bGJfcmVhZF9jcihzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQorc3RhdGljIHZvaWQgb21hcDJfdGxiX3JlYWRfY3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQogewogCWNyLT5jYW0gPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9SRUFEX0NBTSk7CiAJY3ItPnJhbSA9IGlvbW11X3JlYWRfcmVnKG9iaiwgTU1VX1JFQURfUkFNKTsKIH0KIAotc3RhdGljIHZvaWQgb21hcDJfdGxiX2xvYWRfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKK3N0YXRpYyB2b2lkIG9tYXAyX3RsYl9sb2FkX2NyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKIHsKIAlpb21tdV93cml0ZV9yZWcob2JqLCBjci0+Y2FtIHwgTU1VX0NBTV9WLCBNTVVfQ0FNKTsKIAlpb21tdV93cml0ZV9yZWcob2JqLCBjci0+cmFtLCBNTVVfUkFNKTsKQEAgLTE5Myw3ICsxOTMsOCBAQAogCXJldHVybiBjci0+Y2FtICYgbWFzazsKIH0KIAotc3RhdGljIHN0cnVjdCBjcl9yZWdzICpvbWFwMl9hbGxvY19jcihzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQorc3RhdGljIHN0cnVjdCBjcl9yZWdzICpvbWFwMl9hbGxvY19jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJc3RydWN0IGlvdGxiX2VudHJ5ICplKQogewogCXN0cnVjdCBjcl9yZWdzICpjcjsKIApAQCAtMjMwLDcgKzIzMSw4IEBACiAJcmV0dXJuIGF0dHI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG9tYXAyX2R1bXBfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QKK29tYXAyX2R1bXBfY3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyLCBjaGFyICpidWYpCiB7CiAJY2hhciAqcCA9IGJ1ZjsKIApAQCAtMjU0LDcgKzI1Niw4IEBACiAJCQlnb3RvIG91dDsJCQkJCVwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgc3NpemVfdCBvbWFwMl9pb21tdV9kdW1wX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90CitvbWFwMl9pb21tdV9kdW1wX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgbGVuKQogewogCWNoYXIgKnAgPSBidWY7CiAKQEAgLTI4MCw3ICsyODMsNyBAQAogCXJldHVybiBwIC0gYnVmOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9zYXZlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaikKK3N0YXRpYyB2b2lkIG9tYXAyX2lvbW11X3NhdmVfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCiB7CiAJaW50IGk7CiAJdTMyICpwID0gb2JqLT5jdHg7CkBAIC0yOTMsNyArMjk2LDcgQEAKIAlCVUdfT04ocFswXSAhPSBJT01NVV9BUkNIX1ZFUlNJT04pOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwMl9pb21tdV9yZXN0b3JlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaikKK3N0YXRpYyB2b2lkIG9tYXAyX2lvbW11X3Jlc3RvcmVfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCiB7CiAJaW50IGk7CiAJdTMyICpwID0gb2JqLT5jdHg7CkBAIC0zNDMsMTMgKzM0NiwxMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9pb21tdV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGluc3RhbGxfaW9tbXVfYXJjaCgmb21hcDJfaW9tbXVfb3BzKTsKKwlyZXR1cm4gb21hcF9pbnN0YWxsX2lvbW11X2FyY2goJm9tYXAyX2lvbW11X29wcyk7CiB9CiBtb2R1bGVfaW5pdChvbWFwMl9pb21tdV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IG9tYXAyX2lvbW11X2V4aXQodm9pZCkKIHsKLQl1bmluc3RhbGxfaW9tbXVfYXJjaCgmb21hcDJfaW9tbXVfb3BzKTsKKwlvbWFwX3VuaW5zdGFsbF9pb21tdV9hcmNoKCZvbWFwMl9pb21tdV9vcHMpOwogfQogbW9kdWxlX2V4aXQob21hcDJfaW9tbXVfZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCmluZGV4IDNhMTJmNzUuLjY1ZjFiZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYwpAQCAtMTY1LDggKzE2NSw4IEBACiAKIAkJb21hcF9pcnFfYmFua19pbml0X29uZShiYW5rKTsKIAotCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGJhbmstPm5yX2lycXM7IGkgKz0gMzIsIGogKz0gMHgyMCkKLQkJCW9tYXBfYWxsb2NfZ2MoYmFuay0+YmFzZV9yZWcgKyBqLCBpLCAzMik7CisJCWZvciAoaiA9IDA7IGogPCBiYW5rLT5ucl9pcnFzOyBqICs9IDMyKQorCQkJb21hcF9hbGxvY19nYyhiYW5rLT5iYXNlX3JlZyArIGosIGosIDMyKTsKIAogCQlucl9vZl9pcnFzICs9IGJhbmstPm5yX2lycXM7CiAJCW5yX2JhbmtzKys7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21haWxib3guYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWFpbGJveC5jCmluZGV4IDg2ZDU2NGEuLjYwOWVhMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWFpbGJveC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWFpbGJveC5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYwppbmRleCA0YTZlZjZhLi4yOTJlZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCkBAIC0yNyw2NiArMjcsNjkgQEAKIAogI2luY2x1ZGUgImNvbnRyb2wuaCIKIAotLyogTWNCU1AgaW50ZXJuYWwgc2lnbmFsIG11eGluZyBmdW5jdGlvbnMgKi8KKy8qCisgKiBGSVhNRTogRmluZCBhIG1lY2hhbmlzbSB0byBlbmFibGUvZGlzYWJsZSBydW50aW1lIHRoZSBNY0JTUCBJQ0xLIGF1dG9pZGxlLgorICogU2lkZXRvbmUgbmVlZHMgbm9uLWdhdGVkIElDTEsgYW5kIHNpZGV0b25lIGF1dG9pZGxlIGlzIGJyb2tlbi4KKyAqLworI2luY2x1ZGUgImNtMnh4eF8zeHh4LmgiCisjaW5jbHVkZSAiY20tcmVnYml0cy0zNHh4LmgiCiAKLXZvaWQgb21hcDJfbWNic3AxX211eF9jbGtyX3NyYyh1OCBtdXgpCisvKiBNY0JTUCBpbnRlcm5hbCBzaWduYWwgbXV4aW5nIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IG9tYXAyX21jYnNwMV9tdXhfcnhfY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqc2lnbmFsLAorCQkJCSAgIGNvbnN0IGNoYXIgKnNyYykKIHsKIAl1MzIgdjsKIAogCXYgPSBvbWFwX2N0cmxfcmVhZGwoT01BUDJfQ09OVFJPTF9ERVZDT05GMCk7Ci0JaWYgKG11eCA9PSBDTEtSX1NSQ19DTEtSKQotCQl2ICY9IH5PTUFQMl9NQ0JTUDFfQ0xLUl9NQVNLOwotCWVsc2UgaWYgKG11eCA9PSBDTEtSX1NSQ19DTEtYKQotCQl2IHw9IE9NQVAyX01DQlNQMV9DTEtSX01BU0s7Ci0Jb21hcF9jdHJsX3dyaXRlbCh2LCBPTUFQMl9DT05UUk9MX0RFVkNPTkYwKTsKLX0KLUVYUE9SVF9TWU1CT0wob21hcDJfbWNic3AxX211eF9jbGtyX3NyYyk7CiAKLXZvaWQgb21hcDJfbWNic3AxX211eF9mc3Jfc3JjKHU4IG11eCkKLXsKLQl1MzIgdjsKKwlpZiAoIXN0cmNtcChzaWduYWwsICJjbGtyIikpIHsKKwkJaWYgKCFzdHJjbXAoc3JjLCAiY2xrciIpKQorCQkJdiAmPSB+T01BUDJfTUNCU1AxX0NMS1JfTUFTSzsKKwkJZWxzZSBpZiAoIXN0cmNtcChzcmMsICJjbGt4IikpCisJCQl2IHw9IE9NQVAyX01DQlNQMV9DTEtSX01BU0s7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoIXN0cmNtcChzaWduYWwsICJmc3IiKSkgeworCQlpZiAoIXN0cmNtcChzcmMsICJmc3IiKSkKKwkJCXYgJj0gfk9NQVAyX01DQlNQMV9GU1JfTUFTSzsKKwkJZWxzZSBpZiAoIXN0cmNtcChzcmMsICJmc3giKSkKKwkJCXYgfD0gT01BUDJfTUNCU1AxX0ZTUl9NQVNLOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQl2ID0gb21hcF9jdHJsX3JlYWRsKE9NQVAyX0NPTlRST0xfREVWQ09ORjApOwotCWlmIChtdXggPT0gRlNSX1NSQ19GU1IpCi0JCXYgJj0gfk9NQVAyX01DQlNQMV9GU1JfTUFTSzsKLQllbHNlIGlmIChtdXggPT0gRlNSX1NSQ19GU1gpCi0JCXYgfD0gT01BUDJfTUNCU1AxX0ZTUl9NQVNLOwogCW9tYXBfY3RybF93cml0ZWwodiwgT01BUDJfQ09OVFJPTF9ERVZDT05GMCk7CisKKwlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wob21hcDJfbWNic3AxX211eF9mc3Jfc3JjKTsKIAogLyogTWNCU1AgQ0xLUyBzb3VyY2Ugc3dpdGNoaW5nIGZ1bmN0aW9uICovCi0KLWludCBvbWFwMl9tY2JzcF9zZXRfY2xrc19zcmModTggaWQsIHU4IGZja19zcmNfaWQpCitzdGF0aWMgaW50IG9tYXAyX21jYnNwX3NldF9jbGtfc3JjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsayAqY2xrLAorCQkJCSAgIGNvbnN0IGNoYXIgKnNyYykKIHsKLQlzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3A7CiAJc3RydWN0IGNsayAqZmNrX3NyYzsKIAljaGFyICpmY2tfc3JjX25hbWU7CiAJaW50IHI7CiAKLQlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7Ci0KLQlpZiAoZmNrX3NyY19pZCA9PSBNQ0JTUF9DTEtTX1BBRF9TUkMpCisJaWYgKCFzdHJjbXAoc3JjLCAiY2xrc19leHQiKSkKIAkJZmNrX3NyY19uYW1lID0gInBhZF9mY2siOwotCWVsc2UgaWYgKGZja19zcmNfaWQgPT0gTUNCU1BfQ0xLU19QUkNNX1NSQykKKwllbHNlIGlmICghc3RyY21wKHNyYywgImNsa3NfZmNsayIpKQogCQlmY2tfc3JjX25hbWUgPSAicHJjbV9mY2siOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmY2tfc3JjID0gY2xrX2dldChtY2JzcC0+ZGV2LCBmY2tfc3JjX25hbWUpOworCWZja19zcmMgPSBjbGtfZ2V0KGRldiwgZmNrX3NyY19uYW1lKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZmNrX3NyYykpIHsKIAkJcHJfZXJyKCJvbWFwLW1jYnNwOiAlczogY291bGQgbm90IGNsa19nZXQoKSAlc1xuIiwgImNsa3MiLAogCQkgICAgICAgZmNrX3NyY19uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcG1fcnVudGltZV9wdXRfc3luYyhtY2JzcC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiAKLQlyID0gY2xrX3NldF9wYXJlbnQobWNic3AtPmZjbGssIGZja19zcmMpOworCXIgPSBjbGtfc2V0X3BhcmVudChjbGssIGZja19zcmMpOwogCWlmIChJU19FUlJfVkFMVUUocikpIHsKIAkJcHJfZXJyKCJvbWFwLW1jYnNwOiAlczogY291bGQgbm90IGNsa19zZXRfcGFyZW50KCkgdG8gJXNcbiIsCiAJCSAgICAgICAiY2xrcyIsIGZja19zcmNfbmFtZSk7CkBAIC05NCwyMSArOTcsMzAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcG1fcnVudGltZV9nZXRfc3luYyhtY2JzcC0+ZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAKIAljbGtfcHV0KGZja19zcmMpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKG9tYXAyX21jYnNwX3NldF9jbGtzX3NyYyk7CiAKLXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXAyX21jYnNwX2xhdGVuY3lbXSA9IHsKLQl7Ci0JCS5kZWFjdGl2YXRlX2Z1bmMgPSBvbWFwX2RldmljZV9pZGxlX2h3bW9kcywKLQkJLmFjdGl2YXRlX2Z1bmMgICA9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncyA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07CitzdGF0aWMgaW50IG9tYXAzX2VuYWJsZV9zdF9jbG9jayh1bnNpZ25lZCBpbnQgaWQsIGJvb2wgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCB3OworCisJLyoKKwkgKiBTaWRldG9uZSB1c2VzIE1jQlNQIElDTEsgLSB3aGljaCBtdXN0IG5vdCBpZGxlIHdoZW4gc2lkZXRvbmVzCisJICogYXJlIGVuYWJsZWQgb3Igc2lkZXRvbmVzIHN0YXJ0IHNvdW5kaW5nIHVnbHkuCisJICovCisJdyA9IG9tYXAyX2NtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMF9QRVJfTU9ELCBDTV9BVVRPSURMRSk7CisJaWYgKGVuYWJsZSkKKwkJdyAmPSB+KDEgPDwgKGlkIC0gMikpOworCWVsc2UKKwkJdyB8PSAxIDw8IChpZCAtIDIpOworCW9tYXAyX2NtX3dyaXRlX21vZF9yZWcodywgT01BUDM0MzBfUEVSX01PRCwgQ01fQVVUT0lETEUpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgb21hcF9pbml0X21jYnNwKHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqdW51c2VkKQogewpAQCAtMTE2LDcgKzEyOCw3IEBACiAJY2hhciAqbmFtZSA9ICJvbWFwLW1jYnNwIjsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2hfZGV2aWNlWzJdOwogCXN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKIAlzc2NhbmYob2gtPm5hbWUsICJtY2JzcCVkIiwgJmlkKTsKIApAQCAtMTI2LDcgKzEzOCwxMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwZGF0YS0+bWNic3BfY29uZmlnX3R5cGUgPSBvaC0+Y2xhc3MtPnJldjsKKwlwZGF0YS0+cmVnX3N0ZXAgPSA0OworCWlmIChvaC0+Y2xhc3MtPnJldiA8IE1DQlNQX0NPTkZJR19UWVBFMikgeworCQlwZGF0YS0+cmVnX3NpemUgPSAyOworCX0gZWxzZSB7CisJCXBkYXRhLT5yZWdfc2l6ZSA9IDQ7CisJCXBkYXRhLT5oYXNfY2NyID0gdHJ1ZTsKKwl9CiAKIAlpZiAob2gtPmNsYXNzLT5yZXYgPT0gTUNCU1BfQ09ORklHX1RZUEUzKSB7CiAJCWlmIChpZCA9PSAyKQpAQCAtMTM3LDIyICsxNTUsMjggQEAKIAkJCXBkYXRhLT5idWZmZXJfc2l6ZSA9IDB4ODA7CiAJfQogCisJaWYgKG9oLT5jbGFzcy0+cmV2ID49IE1DQlNQX0NPTkZJR19UWVBFMykKKwkJcGRhdGEtPmhhc193YWtldXAgPSB0cnVlOworCiAJb2hfZGV2aWNlWzBdID0gb2g7CiAKIAlpZiAob2gtPmRldl9hdHRyKSB7CiAJCW9oX2RldmljZVsxXSA9IG9tYXBfaHdtb2RfbG9va3VwKCgKIAkJKHN0cnVjdCBvbWFwX21jYnNwX2Rldl9hdHRyICopKG9oLT5kZXZfYXR0cikpLT5zaWRldG9uZSk7CisJCXBkYXRhLT5lbmFibGVfc3RfY2xvY2sgPSBvbWFwM19lbmFibGVfc3RfY2xvY2s7CiAJCWNvdW50Kys7CiAJfQotCW9kID0gb21hcF9kZXZpY2VfYnVpbGRfc3MobmFtZSwgaWQsIG9oX2RldmljZSwgY291bnQsIHBkYXRhLAotCQkJCXNpemVvZigqcGRhdGEpLCBvbWFwMl9tY2JzcF9sYXRlbmN5LAotCQkJCUFSUkFZX1NJWkUob21hcDJfbWNic3BfbGF0ZW5jeSksIGZhbHNlKTsKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGRfc3MobmFtZSwgaWQsIG9oX2RldmljZSwgY291bnQsIHBkYXRhLAorCQkJCXNpemVvZigqcGRhdGEpLCBOVUxMLCAwLCBmYWxzZSk7CiAJa2ZyZWUocGRhdGEpOwotCWlmIChJU19FUlIob2QpKSAgeworCWlmIChJU19FUlIocGRldikpICB7CiAJCXByX2VycigiJXM6IENhbid0IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczolcy5cbiIsIF9fZnVuY19fLAogCQkJCQluYW1lLCBvaC0+bmFtZSk7Ci0JCXJldHVybiBQVFJfRVJSKG9kKTsKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CiAJfQorCXBkYXRhLT5zZXRfY2xrX3NyYyA9IG9tYXAyX21jYnNwX3NldF9jbGtfc3JjOworCWlmIChpZCA9PSAxKQorCQlwZGF0YS0+bXV4X3NpZ25hbCA9IG9tYXAyX21jYnNwMV9tdXhfcnhfY2xrOwogCW9tYXBfbWNic3BfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMKaW5kZXggZTYxZmVhZC4uYjg4MjIwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHBsYXQvaW9tbXUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC1zbXAuYwppbmRleCA4ODk0NjRkLi40NDEyZGRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtc21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXNtcC5jCkBAIC0xMDIsOCArMTAyLDExIEBACiB7CiAJdW5zaWduZWQgaW50IGksIG5jb3JlczsKIAotCS8qIE5ldmVyIHJlbGVhc2VkICovCi0Jc2N1X2Jhc2UgPSBpb3JlbWFwKE9NQVA0NFhYX1NDVV9CQVNFLCBTWl8yNTYpOworCS8qCisJICogQ3VycmVudGx5IHdlIGNhbid0IGNhbGwgaW9yZW1hcCBoZXJlIGJlY2F1c2UKKwkgKiBTb0MgZGV0ZWN0aW9uIHdvbid0IHdvcmsgdW50aWwgYWZ0ZXIgaW5pdF9lYXJseS4KKwkgKi8KKwlzY3VfYmFzZSA9ICBPTUFQMl9MNF9JT19BRERSRVNTKE9NQVA0NFhYX1NDVV9CQVNFKTsKIAlCVUdfT04oIXNjdV9iYXNlKTsKIAogCW5jb3JlcyA9IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCmluZGV4IDg0Y2MwYmQuLjZiMzA4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jCkBAIC0xOTU0LDkgKzE5NTQsNiBAQAogCiAJaSA9IDA7CiAJZG8gewotCQlpZiAoIW9tYXBfY2hpcF9pcyhvaHNbaV0tPm9tYXBfY2hpcCkpCi0JCQljb250aW51ZTsKLQogCQlyID0gX3JlZ2lzdGVyKG9oc1tpXSk7CiAJCVdBUk4ociwgIm9tYXBfaHdtb2Q6ICVzOiBfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIG9oc1tpXS0+bmFtZSwKIAkJICAgICByKTsKQEAgLTI2MjgsNyArMjYyNSw3IEBACiAgKiBSZXR1cm5zIHRoZSBjb250ZXh0IGxvc3MgY291bnQgb2YgdGhlIHBvd2VyZG9tYWluIGFzc29jYXRlZCB3aXRoIEBvaAogICogdXBvbiBzdWNjZXNzLCBvciB6ZXJvIGlmIG5vIHBvd2VyZG9tYWluIGV4aXN0cyBmb3IgQG9oLgogICovCi11MzIgb21hcF9od21vZF9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBvbWFwX2h3bW9kICpvaCkKK2ludCBvbWFwX2h3bW9kX2dldF9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IG9tYXBfaHdtb2QgKm9oKQogewogCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG07CiAJaW50IHJldCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQyMF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQyMF9kYXRhLmMKaW5kZXggYTAxNWM2OS4uNmQ3MjA2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MjBfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDIwX2RhdGEuYwpAQCAtMTAwLDcgKzEwMCw2IEBACiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9sM19tYWluX21hc3RlcnMpLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfbDNfbWFpbl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2wzX21haW5fc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTIwNiw3ICsyMDUsNiBAQAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbDRfY29yZV9tYXN0ZXJzKSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX2w0X2NvcmVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9sNF9jb3JlX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0yMjcsNyArMjI1LDYgQEAKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2w0X3drdXBfbWFzdGVycyksCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF9sNF93a3VwX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbDRfd2t1cF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMjQzLDcgKzI0MCw2IEBACiAJLm1haW5fY2xrCT0gIm1wdV9jayIsCiAJLm1hc3RlcnMJPSBvbWFwMjQyMF9tcHVfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21wdV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKgpAQCAtMjcxLDcgKzI2NywxNiBAQAogCS5jbGFzcwkJPSAmaXZhX2h3bW9kX2NsYXNzLAogCS5tYXN0ZXJzCT0gb21hcDI0MjBfaXZhX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9pdmFfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCit9OworCisvKiBhbHdheXMtb24gdGltZXJzIGRldiBhdHRyaWJ1dGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF90aW1lcl9jYXBhYmlsaXR5X2Rldl9hdHRyIGNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkgICAgICAgPSBPTUFQX1RJTUVSX0FMV09OLAorfTsKKworLyogcHdtIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciA9IHsKKwkudGltZXJfY2FwYWJpbGl0eSAgICAgICA9IE9NQVBfVElNRVJfSEFTX1BXTSwKIH07CiAKIC8qIHRpbWVyMSAqLwpAQCAtMzE0LDEwICszMTksMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQxX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXIyICovCkBAIC0zNTEsMTAgKzM1NiwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDJfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjMgKi8KQEAgLTM4OCwxMCArMzkzLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUM19TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyNCAqLwpAQCAtNDI1LDEwICs0MzAsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ0X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjRfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXI1ICovCkBAIC00NjIsMTAgKzQ2NywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDVfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyNV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAKQEAgLTUwMCwxMCArNTA1LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUNl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXI2X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXI2X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyNyAqLwpAQCAtNTM3LDEwICs1NDIsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ3X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjdfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjdfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXI4ICovCkBAIC01NzQsMTAgKzU3OSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDhfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyOF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyOF9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjkgKi8KQEAgLTYxMSwxMCArNjE2LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUOV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyOV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyOV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiB0aW1lcjEwICovCkBAIC02NDgsMTAgKzY1MywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDEwX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdGltZXIxMF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3RpbWVyMTBfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKQogfTsKIAogLyogdGltZXIxMSAqLwpAQCAtNjg1LDEwICs2OTAsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQxMV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3RpbWVyMTFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF90aW1lcjExX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCkKIH07CiAKIC8qIHRpbWVyMTIgKi8KQEAgLTcyMiwxMCArNzI3LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMTJfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQyMF90aW1lcjEyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdGltZXIxMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApCiB9OwogCiAvKiBsNF93a3VwIC0+IHdkX3RpbWVyMiAqLwpAQCAtNzY2LDcgKzc3MSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3dkX3RpbWVyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3dkX3RpbWVyMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIFVBUlQxICovCkBAIC03OTIsNyArNzk2LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX3VhcnQxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfdWFydDFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogVUFSVDIgKi8KQEAgLTgxOCw3ICs4MjEsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfdWFydDJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF91YXJ0Ml9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBVQVJUMyAqLwpAQCAtODQ0LDcgKzg0Niw2IEBACiAJLnNsYXZlcwkJPSBvbWFwMjQyMF91YXJ0M19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX3VhcnQzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIGRzcyAqLwpAQCAtODk4LDcgKzg5OSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2Rzc19zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDI0MjBfZHNzX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9kc3NfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC05MzgsNyArOTM4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfZHNzX2Rpc3BjX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZHNzX2Rpc3BjX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC05NzUsNyArOTc0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfZHNzX3JmYmlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9kc3NfcmZiaV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTAxMyw3ICsxMDExLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfZHNzX3ZlbmNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9kc3NfdmVuY19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTA2NCw3ICsxMDYxLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfaTJjMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogCS5mbGFncwkJPSBIV01PRF8xNkJJVF9SRUcsCiB9OwogCkBAIC0xMDkyLDcgKzEwODgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9pMmMyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZpMmNfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmkyY19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiAJLmZsYWdzCQk9IEhXTU9EXzE2QklUX1JFRywKIH07CiAKQEAgLTExOTcsNyArMTE5Miw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW8xX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIGdwaW8yICovCkBAIC0xMjIzLDcgKzEyMTcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQyMF9ncGlvMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBncGlvMyAqLwpAQCAtMTI0OSw3ICsxMjQyLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZ3BpbzNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyogZ3BpbzQgKi8KQEAgLTEyNzUsNyArMTI2Nyw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX2dwaW80X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIGRtYSBhdHRyaWJ1dGVzICovCkBAIC0xMzIyLDcgKzEzMTMsNiBAQAogCS5tYXN0ZXJzCT0gb21hcDI0MjBfZG1hX3N5c3RlbV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfZG1hX3N5c3RlbV9tYXN0ZXJzKSwKIAkuZGV2X2F0dHIJPSAmZG1hX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTM2Myw3ICsxMzUzLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfbWFpbGJveF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21haWxib3hfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQyMCksCiB9OwogCiAvKiBtY3NwaTEgKi8KQEAgLTEzOTMsNyArMTM4Miw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jc3BpMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkxX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIG1jc3BpMiAqLwpAQCAtMTQyMyw3ICsxNDExLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWNzcGkyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIJPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogLyoKQEAgLTE0NzMsNyArMTQ2MCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDIwX21jYnNwMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDIwX21jYnNwMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDIwKSwKIH07CiAKIC8qIG1jYnNwMiAqLwpAQCAtMTUxNCw3ICsxNTAwLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MjBfbWNic3AyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MjBfbWNic3AyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MjApLAogfTsKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXAyNDIwX2h3bW9kc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MzBfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzI0MzBfZGF0YS5jCmluZGV4IDQwODE5M2QuLmEyNTgwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8yNDMwX2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMjQzMF9kYXRhLmMKQEAgLTExMCw3ICsxMTAsNiBAQAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbDNfbWFpbl9tYXN0ZXJzKSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2wzX21haW5fc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9sM19tYWluX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0yNTAsNyArMjQ5LDYgQEAKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2w0X2NvcmVfbWFzdGVycyksCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9sNF9jb3JlX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbDRfY29yZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMzAxLDcgKzI5OSw2IEBACiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9sNF93a3VwX21hc3RlcnMpLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbDRfd2t1cF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2w0X3drdXBfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTMxNyw3ICszMTQsNiBAQAogCS5tYWluX2Nsawk9ICJtcHVfY2siLAogCS5tYXN0ZXJzCT0gb21hcDI0MzBfbXB1X21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tcHVfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyoKQEAgLTM0NSw3ICszNDEsMTYgQEAKIAkuY2xhc3MJCT0gJml2YV9od21vZF9jbGFzcywKIAkubWFzdGVycwk9IG9tYXAyNDMwX2l2YV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfaXZhX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQorfTsKKworLyogYWx3YXlzLW9uIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5ICAgICAgID0gT01BUF9USU1FUl9BTFdPTiwKK307CisKKy8qIHB3bSB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkgICAgICAgPSBPTUFQX1RJTUVSX0hBU19QV00sCiB9OwogCiAvKiB0aW1lcjEgKi8KQEAgLTM4OCwxMCArMzkzLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMiAqLwpAQCAtNDI1LDEwICs0MzAsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQyX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXIzICovCkBAIC00NjIsMTAgKzQ2NywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDNfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjQgKi8KQEAgLTQ5OSwxMCArNTA0LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUNF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI0X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyNSAqLwpAQCAtNTM2LDEwICs1NDEsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ1X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjVfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI2ICovCkBAIC01NzMsMTAgKzU3OCwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDZfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyNl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjcgKi8KQEAgLTYxMCwxMCArNjE1LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUN19TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXI3X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXI3X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyOCAqLwpAQCAtNjQ3LDEwICs2NTIsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQ4X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjhfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjhfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXI5ICovCkBAIC02ODQsMTAgKzY4OSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDlfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjlfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogdGltZXIxMCAqLwpAQCAtNzIxLDEwICs3MjYsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMjRYWF9TVF9HUFQxMF9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3RpbWVyMTBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF90aW1lcjEwX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCkKIH07CiAKIC8qIHRpbWVyMTEgKi8KQEAgLTc1OCwxMCArNzYzLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDI0WFhfU1RfR1BUMTFfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF90aW1lcjExX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdGltZXIxMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApCiB9OwogCiAvKiB0aW1lcjEyICovCkBAIC03OTUsMTAgKzgwMCwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAyNFhYX1NUX0dQVDEyX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdGltZXIxMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3RpbWVyMTJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyogbDRfd2t1cCAtPiB3ZF90aW1lcjIgKi8KQEAgLTgzOSw3ICs4NDQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF93ZF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF93ZF90aW1lcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBVQVJUMSAqLwpAQCAtODY1LDcgKzg2OSw2IEBACiAJLnNsYXZlcwkJPSBvbWFwMjQzMF91YXJ0MV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX3VhcnQxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIFVBUlQyICovCkBAIC04OTEsNyArODk0LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX3VhcnQyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfdWFydDJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogVUFSVDMgKi8KQEAgLTkxNyw3ICs5MTksNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF91YXJ0M19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBkc3MgKi8KQEAgLTk2NSw3ICs5NjYsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXAyNDMwX2Rzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZHNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtOTk5LDcgKzk5OSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX2Rzc19kaXNwY19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2Rzc19kaXNwY19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTAzMCw3ICsxMDI5LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfZHNzX3JmYmlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3NfcmZiaV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTA2Miw3ICsxMDYwLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfZHNzX3ZlbmNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9kc3NfdmVuY19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTEyMyw3ICsxMTIwLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfaTJjMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogSTJDMiAqLwpAQCAtMTE1MSw3ICsxMTQ3LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfaTJjMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbDRfd2t1cCAtPiBncGlvMSAqLwpAQCAtMTI3Myw3ICsxMjY4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZ3BpbzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogZ3BpbzIgKi8KQEAgLTEyOTksNyArMTI5Myw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW8yX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGdwaW8zICovCkBAIC0xMzI1LDcgKzEzMTgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9ncGlvM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBncGlvNCAqLwpAQCAtMTM1MSw3ICsxMzQzLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZ3BpbzRfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogZ3BpbzUgKi8KQEAgLTEzODIsNyArMTM3Myw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX2dwaW81X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIGRtYSBhdHRyaWJ1dGVzICovCkBAIC0xNDI5LDcgKzE0MTksNiBAQAogCS5tYXN0ZXJzCT0gb21hcDI0MzBfZG1hX3N5c3RlbV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfZG1hX3N5c3RlbV9tYXN0ZXJzKSwKIAkuZGV2X2F0dHIJPSAmZG1hX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtMTQ2OSw3ICsxNDU4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbWFpbGJveF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21haWxib3hfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY3NwaTEgKi8KQEAgLTE0OTksNyArMTQ4Nyw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jc3BpMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJ4eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyCT0gJm9tYXBfbWNzcGkxX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIG1jc3BpMiAqLwpAQCAtMTUyOSw3ICsxNTE2LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNzcGkyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMnh4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIJPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbWNzcGkzICovCkBAIC0xNTcyLDcgKzE1NTgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY3NwaTNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyeHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZvbWFwX21jc3BpM19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKgpAQCAtMTYyOCw3ICsxNjEzLDYgQEAKIAkgKi8KIAkuZmxhZ3MJCT0gSFdNT0RfTk9fT0NQX0FVVE9JRExFIHwgSFdNT0RfU1dTVVBfU0lETEUKIAkJCQl8IEhXTU9EX1NXU1VQX01TVEFOREJZLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKQogfTsKIAogLyoKQEAgLTE2ODksNyArMTY3Myw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21jYnNwMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIG1jYnNwMiAqLwpAQCAtMTczMSw3ICsxNzE0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbWNic3AyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3AyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogbWNic3AzICovCkBAIC0xNzgzLDcgKzE3NjUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9tY2JzcDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMjQzMF9tY2JzcDNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBtY2JzcDQgKi8KQEAgLTE4NDEsNyArMTgyMiw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAyNDMwX21jYnNwNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21jYnNwNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIC8qIG1jYnNwNSAqLwpAQCAtMTg5OSw3ICsxODc5LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbWNic3A1X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbWNic3A1X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0MzApLAogfTsKIAogLyogTU1DL1NEL1NESU8gY29tbW9uICovCkBAIC0xOTY2LDcgKzE5NDUsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDI0MzBfbW1jMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAyNDMwX21tYzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyNDMwX21tY19jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjQzMCksCiB9OwogCiAvKiBNTUMvU0QvU0RJTzIgKi8KQEAgLTIwMTAsNyArMTk4OCw2IEBACiAJLnNsYXZlcwkJPSBvbWFwMjQzMF9tbWMyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDI0MzBfbW1jMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDI0MzBfbW1jX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIH07CiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMjQzMF9od21vZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwppbmRleCAyNWJmNDNiLi5iYzkwMzVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCkBAIC0xNTYsNyArMTU2LDYgQEAKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2wzX21haW5fbWFzdGVycyksCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9sM19tYWluX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbDNfbWFpbl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkuZmxhZ3MJCT0gSFdNT0RfTk9fSURMRVNULAogfTsKIApAQCAtNDU5LDcgKzQ1OCw2IEBACiAJLmNsYXNzCQk9ICZsNF9od21vZF9jbGFzcywKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2w0X2NvcmVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9sNF9jb3JlX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC00NzQsNyArNDcyLDYgQEAKIAkuY2xhc3MJCT0gJmw0X2h3bW9kX2NsYXNzLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbDRfcGVyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbDRfcGVyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC00ODksNyArNDg2LDYgQEAKIAkuY2xhc3MJCT0gJmw0X2h3bW9kX2NsYXNzLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbDRfd2t1cF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2w0X3drdXBfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTUwNSw3ICs1MDEsNiBAQAogCS5tYWluX2Nsawk9ICJhcm1fZmNrIiwKIAkubWFzdGVycwk9IG9tYXAzeHh4X21wdV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbXB1X21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qCkBAIC01MzMsNyArNTI4LDYgQEAKIAkuY2xhc3MJCT0gJml2YV9od21vZF9jbGFzcywKIAkubWFzdGVycwk9IG9tYXAzeHh4X2l2YV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfaXZhX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXIgY2xhc3MgKi8KQEAgLTU3MCw2ICs1NjQsMjEgQEAKIAkucmV2ID0gIE9NQVBfVElNRVJfSVBfVkVSU0lPTl8xLAogfTsKIAorLyogc2VjdXJlIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X3NlY3VyZV9kZXZfYXR0ciA9IHsKKwkudGltZXJfY2FwYWJpbGl0eSAgICAgICA9IE9NQVBfVElNRVJfU0VDVVJFLAorfTsKKworLyogYWx3YXlzLW9uIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyID0geworCS50aW1lcl9jYXBhYmlsaXR5ICAgICAgID0gT01BUF9USU1FUl9BTFdPTiwKK307CisKKy8qIHB3bSB0aW1lcnMgZGV2IGF0dHJpYnV0ZSAqLworc3RhdGljIHN0cnVjdCBvbWFwX3RpbWVyX2NhcGFiaWxpdHlfZGV2X2F0dHIgY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkgICAgICAgPSBPTUFQX1RJTUVSX0hBU19QV00sCit9OworCiAvKiB0aW1lcjEgKi8KIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwM3h4eF90aW1lcjFfaHdtb2Q7CiAKQEAgLTYxMCwxMCArNjE5LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUMV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXIxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIxX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl8xbXNfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjIgKi8KQEAgLTY1NiwxMCArNjY1LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUMl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl8xbXNfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjMgKi8KQEAgLTcwMiwxMCArNzExLDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUM19TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXIzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXIzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyNCAqLwpAQCAtNzQ4LDEwICs3NTcsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQ0X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjRfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXI1ICovCkBAIC03OTQsMTAgKzgwMywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDVfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyNV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfdGltZXJfaHdtb2RfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApCiB9OwogCiAvKiB0aW1lcjYgKi8KQEAgLTg0MCwxMCArODQ5LDEwIEBACiAJCQkuaWRsZXN0X2lkbGVfYml0ID0gT01BUDM0MzBfU1RfR1BUNl9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXI2X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdGltZXI2X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyNyAqLwpAQCAtODg2LDEwICs4OTUsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQ3X1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjdfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjdfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXI4ICovCkBAIC05MzIsMTAgKzk0MSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDhfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjhfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjhfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXI5ICovCkBAIC05NzgsMTAgKzk4NywxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDlfU0hJRlQsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9wd21fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF90aW1lcjlfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjlfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdGltZXIxMCAqLwpAQCAtMTAxNSwxMCArMTAyNCwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDEwX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXIxMF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMTBfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyXzFtc19od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyMTEgKi8KQEAgLTEwNTIsMTAgKzEwNjEsMTAgQEAKIAkJCS5pZGxlc3RfaWRsZV9iaXQgPSBPTUFQMzQzMF9TVF9HUFQxMV9TSElGVCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3RpbWVyMTFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF90aW1lcjExX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF90aW1lcl9od21vZF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCkKIH07CiAKIC8qIHRpbWVyMTIqLwpAQCAtMTEwMiwxMCArMTExMSwxMCBAQAogCQkJLmlkbGVzdF9pZGxlX2JpdCA9IE9NQVAzNDMwX1NUX0dQVDEyX1NISUZULAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfc2VjdXJlX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdGltZXIxMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3RpbWVyMTJfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X3RpbWVyX2h3bW9kX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogbDRfd2t1cCAtPiB3ZF90aW1lcjIgKi8KQEAgLTExODIsNyArMTE5MSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3dkX3RpbWVyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3dkX3RpbWVyMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkvKgogCSAqIFhYWDogVXNlIHNvZnR3YXJlIHN1cGVydmlzZWQgbW9kZSwgSFcgc3VwZXJ2aXNlZCBzbWFydGlkbGUgc2VlbXMgdG8KIAkgKiBibG9jayBDT1JFIHBvd2VyIGRvbWFpbiBpZGxlIHRyYW5zaXRpb25zLiBNYXliZSBhIEhXIGJ1ZyBpbiB3ZHQyPwpAQCAtMTIxMyw3ICsxMjIxLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3VhcnQxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdWFydDFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogVUFSVDIgKi8KQEAgLTEyMzksNyArMTI0Niw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF91YXJ0Ml9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X3VhcnQyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMl91YXJ0X2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIFVBUlQzICovCkBAIC0xMjY1LDcgKzEyNzEsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfdWFydDNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF91YXJ0M19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDJfdWFydF9jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBVQVJUNCAqLwpAQCAtMTMwMiw3ICsxMzA3LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X3VhcnQ0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfdWFydDRfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAyX3VhcnRfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM2MzBFUzEpLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzIGkyY19jbGFzcyA9IHsKQEAgLTEzOTAsNyArMTM5NCw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNDMwZXMxX2Rzc19zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDN4eHhfZHNzX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3NfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzBFUzEpLAogCS5mbGFncwkJPSBIV01PRF9OT19JRExFU1QsCiB9OwogCkBAIC0xNDE1LDggKzE0MTgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXAzeHh4X2Rzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0dFX09NQVAzNDMwRVMyIHwKLQkJCQlDSElQX0lTX09NQVAzNjMwRVMxIHwgQ0hJUF9HRV9PTUFQMzYzMEVTMV8xKSwKIH07CiAKIC8qIGw0X2NvcmUgLT4gZHNzX2Rpc3BjICovCkBAIC0xNDU0LDkgKzE0NTUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9kc3NfZGlzcGNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9kc3NfZGlzcGNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMSB8Ci0JCQkJQ0hJUF9HRV9PTUFQMzQzMEVTMiB8IENISVBfSVNfT01BUDM2MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM2MzBFUzFfMSksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTE1MTgsOSArMTUxNiw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2Rzc19kc2kxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX2RzaTFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMSB8Ci0JCQkJQ0hJUF9HRV9PTUFQMzQzMEVTMiB8IENISVBfSVNfT01BUDM2MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM2MzBFUzFfMSksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTE1NTgsOSArMTU1Myw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2Rzc19yZmJpX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX3JmYmlfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMSB8Ci0JCQkJQ0hJUF9HRV9PTUFQMzQzMEVTMiB8IENISVBfSVNfT01BUDM2MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM2MzBFUzFfMSksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTE1OTksOSArMTU5MSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X2Rzc192ZW5jX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZHNzX3ZlbmNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTMSB8Ci0JCQkJQ0hJUF9HRV9PTUFQMzQzMEVTMiB8IENISVBfSVNfT01BUDM2MzBFUzEgfAotCQkJCUNISVBfR0VfT01BUDM2MzBFUzFfMSksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTE2MzcsNyArMTYyNiw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2kyYzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJmkyY19jbGFzcywKIAkuZGV2X2F0dHIJPSAmaTJjMV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBJMkMyICovCkBAIC0xNjcyLDcgKzE2NjAsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9pMmMyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZpMmNfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmkyYzJfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogSTJDMyAqLwpAQCAtMTcxOCw3ICsxNzA1LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfaTJjM19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmaTJjX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZpMmMzX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIGw0X3drdXAgLT4gZ3BpbzEgKi8KQEAgLTE4ODAsNyArMTg2Niw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW8xX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIGdwaW8yICovCkBAIC0xOTEyLDcgKzE4OTcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBncGlvMyAqLwpAQCAtMTk0NCw3ICsxOTI4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogZ3BpbzQgKi8KQEAgLTE5NzYsNyArMTk1OSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2dwaW80X3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwM3h4eF9ncGlvX2h3bW9kX2NsYXNzLAogCS5kZXZfYXR0cgk9ICZncGlvX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIGdwaW81ICovCkBAIC0yMDEzLDcgKzE5OTUsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9ncGlvNV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDN4eHhfZ3Bpb19od21vZF9jbGFzcywKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBncGlvNiAqLwpAQCAtMjA1MCw3ICsyMDMxLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfZ3BpbzZfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzeHh4X2dwaW9faHdtb2RfY2xhc3MsCiAJLmRldl9hdHRyCT0gJmdwaW9fZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogZG1hX3N5c3RlbSAtPiBMMyAqLwpAQCAtMjEzNCw3ICsyMTE0LDYgQEAKIAkubWFzdGVycwk9IG9tYXAzeHh4X2RtYV9zeXN0ZW1fbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X2RtYV9zeXN0ZW1fbWFzdGVycyksCiAJLmRldl9hdHRyCT0gJmRtYV9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLmZsYWdzCQk9IEhXTU9EX05PX0lETEVTVCwKIH07CiAKQEAgLTIyMDcsNyArMjE4Niw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jYnNwMiAqLwpAQCAtMjI2NCw3ICsyMjQyLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwMl9zbGF2ZXMpLAogCS5kZXZfYXR0cgk9ICZvbWFwMzR4eF9tY2JzcDJfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogbWNic3AzICovCkBAIC0yMzIxLDcgKzIyOTgsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbWNic3AzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AzX3NsYXZlcyksCiAJLmRldl9hdHRyCT0gJm9tYXAzNHh4X21jYnNwM19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBtY2JzcDQgKi8KQEAgLTIzNzksNyArMjM1NSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21jYnNwNF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21jYnNwNF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jYnNwNSAqLwpAQCAtMjQzNyw3ICsyNDEyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbWNic3A1X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3A1X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIC8qICdtY2JzcCBzaWRldG9uZScgY2xhc3MgKi8KIApAQCAtMjQ5OCw3ICsyNDcyLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbWNic3AyX3NpZGV0b25lX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbWNic3AyX3NpZGV0b25lX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogbWNic3AzX3NpZGV0b25lICovCkBAIC0yNTQ3LDcgKzI1MjAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tY2JzcDNfc2lkZXRvbmVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tY2JzcDNfc2lkZXRvbmVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAKQEAgLTI1OTcsNyArMjU2OSw3IEBACiAJLm5hbWUJCT0gInNyMV9od21vZCIsCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9zbWFydHJlZmxleF9od21vZF9jbGFzcywKIAkubWFpbl9jbGsJPSAic3IxX2ZjayIsCi0JLnZkZF9uYW1lCT0gIm1wdSIsCisJLnZkZF9uYW1lCT0gIm1wdV9pdmEiLAogCS5wcmNtCQk9IHsKIAkJLm9tYXAyID0gewogCQkJLnByY21fcmVnX2lkID0gMSwKQEAgLTI2MDksOSArMjU4MSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzX3NyMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzX3NyMV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMyIHwKLQkJCQkJQ0hJUF9JU19PTUFQMzQzMEVTM18wIHwKLQkJCQkJQ0hJUF9JU19PTUFQMzQzMEVTM18xKSwKIAkuZmxhZ3MJCT0gSFdNT0RfU0VUX0RFRkFVTFRfQ0xPQ0tBQ1QsCiB9OwogCkBAIC0yNjE5LDcgKzI1ODgsNyBAQAogCS5uYW1lCQk9ICJzcjFfaHdtb2QiLAogCS5jbGFzcwkJPSAmb21hcDM2eHhfc21hcnRyZWZsZXhfaHdtb2RfY2xhc3MsCiAJLm1haW5fY2xrCT0gInNyMV9mY2siLAotCS52ZGRfbmFtZQk9ICJtcHUiLAorCS52ZGRfbmFtZQk9ICJtcHVfaXZhIiwKIAkucHJjbQkJPSB7CiAJCS5vbWFwMiA9IHsKIAkJCS5wcmNtX3JlZ19pZCA9IDEsCkBAIC0yNjMxLDcgKzI2MDAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM19zcjFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM19zcjFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzYzMEVTMSksCiB9OwogCiAvKiBTUjIgKi8KQEAgLTI2NTUsOSArMjYyMyw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXAzX3NyMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzX3NyMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMyIHwKLQkJCQkJQ0hJUF9JU19PTUFQMzQzMEVTM18wIHwKLQkJCQkJQ0hJUF9JU19PTUFQMzQzMEVTM18xKSwKIAkuZmxhZ3MJCT0gSFdNT0RfU0VUX0RFRkFVTFRfQ0xPQ0tBQ1QsCiB9OwogCkBAIC0yNjc3LDcgKzI2NDIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwM19zcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM19zcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzYzMEVTMSksCiB9OwogCiAvKgpAQCAtMjc0NSw3ICsyNzA5LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbWFpbGJveF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21haWxib3hfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBsNCBjb3JlIC0+IG1jc3BpMSBpbnRlcmZhY2UgKi8KQEAgLTI4NDMsNyArMjgwNiw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzNHh4X21jc3BpMV9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDM0eHhfbWNzcGlfY2xhc3MsCiAJLmRldl9hdHRyICAgICAgID0gJm9tYXBfbWNzcGkxX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIG1jc3BpMiAqLwpAQCAtMjg3Myw3ICsyODM1LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDM0eHhfbWNzcGkyX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9tY3NwaV9jbGFzcywKIAkuZGV2X2F0dHIgICAgICAgPSAmb21hcF9tY3NwaTJfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogLyogbWNzcGkzICovCkBAIC0yOTE2LDcgKzI4NzcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTNfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzNHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0ciAgICAgICA9ICZvbWFwX21jc3BpM19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBTUEk0ICovCkBAIC0yOTU3LDcgKzI5MTcsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwMzR4eF9tY3NwaTRfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzNHh4X21jc3BpX2NsYXNzLAogCS5kZXZfYXR0ciAgICAgICA9ICZvbWFwX21jc3BpNF9kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKgpAQCAtMzAxNCw3ICsyOTczLDYgQEAKIAkgKi8KIAkuZmxhZ3MJCT0gSFdNT0RfTk9fT0NQX0FVVE9JRExFIHwgSFdNT0RfU1dTVVBfU0lETEUKIAkJCQl8IEhXTU9EX1NXU1VQX01TVEFOREJZLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKQogfTsKIAogLyogdXNiX290Z19ocyAqLwpAQCAtMzA0Miw3ICszMDAwLDYgQEAKIAkuc2xhdmVzCQk9IGFtMzV4eF91c2Joc290Z19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKGFtMzV4eF91c2Joc290Z19zbGF2ZXMpLAogCS5jbGFzcwkJPSAmYW0zNXh4X3VzYm90Z19jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMEVTM18xKQogfTsKIAogLyogTU1DL1NEL1NESU8gY29tbW9uICovCkBAIC0zMTA4LDcgKzMwNjUsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDN4eHhfbW1jMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXAzeHh4X21tYzFfc2xhdmVzKSwKIAkuY2xhc3MJCT0gJm9tYXAzNHh4X21tY19jbGFzcywKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiB9OwogCiAvKiBNTUMvU0QvU0RJTzIgKi8KQEAgLTMxNTEsNyArMzEwNyw2IEBACiAJLnNsYXZlcwkJPSBvbWFwM3h4eF9tbWMyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDN4eHhfbW1jMl9zbGF2ZXMpLAogCS5jbGFzcwkJPSAmb21hcDM0eHhfbW1jX2NsYXNzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIH07CiAKIC8qIE1NQy9TRC9TRElPMyAqLwpAQCAtMzE5Myw3ICszMTQ4LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXAzeHh4X21tYzNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwM3h4eF9tbWMzX3NsYXZlcyksCiAJLmNsYXNzCQk9ICZvbWFwMzR4eF9tbWNfY2xhc3MsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogfTsKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXAzeHh4X2h3bW9kc1tdID0gewpAQCAtMzIwNSw3ICszMTU5LDYgQEAKIAkmb21hcDN4eHhfbW1jMl9od21vZCwKIAkmb21hcDN4eHhfbW1jM19od21vZCwKIAkmb21hcDN4eHhfbXB1X2h3bW9kLAotCSZvbWFwM3h4eF9pdmFfaHdtb2QsCiAKIAkmb21hcDN4eHhfdGltZXIxX2h3bW9kLAogCSZvbWFwM3h4eF90aW1lcjJfaHdtb2QsCkBAIC0zMjI0LDEwICszMTc3LDcgQEAKIAkmb21hcDN4eHhfdWFydDFfaHdtb2QsCiAJJm9tYXAzeHh4X3VhcnQyX2h3bW9kLAogCSZvbWFwM3h4eF91YXJ0M19od21vZCwKLQkmb21hcDN4eHhfdWFydDRfaHdtb2QsCiAJLyogZHNzIGNsYXNzICovCi0JJm9tYXAzNDMwZXMxX2Rzc19jb3JlX2h3bW9kLAotCSZvbWFwM3h4eF9kc3NfY29yZV9od21vZCwKIAkmb21hcDN4eHhfZHNzX2Rpc3BjX2h3bW9kLAogCSZvbWFwM3h4eF9kc3NfZHNpMV9od21vZCwKIAkmb21hcDN4eHhfZHNzX3JmYmlfaHdtb2QsCkBAIC0zMjM3LDExICszMTg3LDYgQEAKIAkmb21hcDN4eHhfaTJjMV9od21vZCwKIAkmb21hcDN4eHhfaTJjMl9od21vZCwKIAkmb21hcDN4eHhfaTJjM19od21vZCwKLQkmb21hcDM0eHhfc3IxX2h3bW9kLAotCSZvbWFwMzR4eF9zcjJfaHdtb2QsCi0JJm9tYXAzNnh4X3NyMV9od21vZCwKLQkmb21hcDM2eHhfc3IyX2h3bW9kLAotCiAKIAkvKiBncGlvIGNsYXNzICovCiAJJm9tYXAzeHh4X2dwaW8xX2h3bW9kLApAQCAtMzI2Myw4ICszMjA4LDYgQEAKIAkmb21hcDN4eHhfbWNic3AyX3NpZGV0b25lX2h3bW9kLAogCSZvbWFwM3h4eF9tY2JzcDNfc2lkZXRvbmVfaHdtb2QsCiAKLQkvKiBtYWlsYm94IGNsYXNzICovCi0JJm9tYXAzeHh4X21haWxib3hfaHdtb2QsCiAKIAkvKiBtY3NwaSBjbGFzcyAqLwogCSZvbWFwMzR4eF9tY3NwaTEsCkBAIC0zMjcyLDE2ICszMjE1LDEwNCBAQAogCSZvbWFwMzR4eF9tY3NwaTMsCiAJJm9tYXAzNHh4X21jc3BpNCwKIAotCS8qIHVzYm90ZyBjbGFzcyAqLwotCSZvbWFwM3h4eF91c2Joc290Z19od21vZCwKLQotCS8qIHVzYm90ZyBmb3IgYW0zNXggKi8KLQkmYW0zNXh4X3VzYmhzb3RnX2h3bW9kLAotCiAJTlVMTCwKIH07CiAKKy8qIDM0MzBFUzEtb25seSBod21vZHMgKi8KK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMzQzMGVzMV9od21vZHNbXSA9IHsKKwkmb21hcDN4eHhfaXZhX2h3bW9kLAorCSZvbWFwMzQzMGVzMV9kc3NfY29yZV9od21vZCwKKwkmb21hcDN4eHhfbWFpbGJveF9od21vZCwKKwlOVUxMCit9OworCisvKiAzNDMwRVMyKy1vbmx5IGh3bW9kcyAqLworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXAzNDMwZXMycGx1c19od21vZHNbXSA9IHsKKwkmb21hcDN4eHhfaXZhX2h3bW9kLAorCSZvbWFwM3h4eF9kc3NfY29yZV9od21vZCwKKwkmb21hcDN4eHhfdXNiaHNvdGdfaHdtb2QsCisJJm9tYXAzeHh4X21haWxib3hfaHdtb2QsCisJTlVMTAorfTsKKworLyogMzR4eC1vbmx5IGh3bW9kcyAoYWxsIEVTIHJldmlzaW9ucykgKi8KK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMzR4eF9od21vZHNbXSA9IHsKKwkmb21hcDN4eHhfaXZhX2h3bW9kLAorCSZvbWFwMzR4eF9zcjFfaHdtb2QsCisJJm9tYXAzNHh4X3NyMl9od21vZCwKKwkmb21hcDN4eHhfbWFpbGJveF9od21vZCwKKwlOVUxMCit9OworCisvKiAzNnh4LW9ubHkgaHdtb2RzIChhbGwgRVMgcmV2aXNpb25zKSAqLworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXAzNnh4X2h3bW9kc1tdID0geworCSZvbWFwM3h4eF9pdmFfaHdtb2QsCisJJm9tYXAzeHh4X3VhcnQ0X2h3bW9kLAorCSZvbWFwM3h4eF9kc3NfY29yZV9od21vZCwKKwkmb21hcDM2eHhfc3IxX2h3bW9kLAorCSZvbWFwMzZ4eF9zcjJfaHdtb2QsCisJJm9tYXAzeHh4X3VzYmhzb3RnX2h3bW9kLAorCSZvbWFwM3h4eF9tYWlsYm94X2h3bW9kLAorCU5VTEwKK307CisKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICphbTM1eHhfaHdtb2RzW10gPSB7CisJJm9tYXAzeHh4X2Rzc19jb3JlX2h3bW9kLCAvKiBYWFggPz8/ICovCisJJmFtMzV4eF91c2Joc290Z19od21vZCwKKwlOVUxMCit9OworCiBpbnQgX19pbml0IG9tYXAzeHh4X2h3bW9kX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gb21hcF9od21vZF9yZWdpc3RlcihvbWFwM3h4eF9od21vZHMpOworCWludCByOworCXN0cnVjdCBvbWFwX2h3bW9kICoqaCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHJldjsKKworCS8qIFJlZ2lzdGVyIGh3bW9kcyBjb21tb24gdG8gYWxsIE9NQVAzICovCisJciA9IG9tYXBfaHdtb2RfcmVnaXN0ZXIob21hcDN4eHhfaHdtb2RzKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcmV2ID0gb21hcF9yZXYoKTsKKworCS8qCisJICogUmVnaXN0ZXIgaHdtb2RzIGNvbW1vbiB0byBpbmRpdmlkdWFsIE9NQVAzIGZhbWlsaWVzLCBhbGwKKwkgKiBzaWxpY29uIHJldmlzaW9ucyAoZS5nLiwgMzR4eCwgb3IgQU0zNTA1LzM1MTcsIG9yIDM2eHgpCisJICogQWxsIHBvc3NpYmxlIHJldmlzaW9ucyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhpcyBjb25kaXRpb25hbC4KKwkgKi8KKwlpZiAocmV2ID09IE9NQVAzNDMwX1JFVl9FUzFfMCB8fCByZXYgPT0gT01BUDM0MzBfUkVWX0VTMl8wIHx8CisJICAgIHJldiA9PSBPTUFQMzQzMF9SRVZfRVMyXzEgfHwgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMCB8fAorCSAgICByZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xIHx8IHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzFfMikgeworCQloID0gb21hcDM0eHhfaHdtb2RzOworCX0gZWxzZSBpZiAocmV2ID09IE9NQVAzNTE3X1JFVl9FUzFfMCB8fCByZXYgPT0gT01BUDM1MTdfUkVWX0VTMV8xKSB7CisJCWggPSBhbTM1eHhfaHdtb2RzOworCX0gZWxzZSBpZiAocmV2ID09IE9NQVAzNjMwX1JFVl9FUzFfMCB8fCByZXYgPT0gT01BUDM2MzBfUkVWX0VTMV8xIHx8CisJCSAgIHJldiA9PSBPTUFQMzYzMF9SRVZfRVMxXzIpIHsKKwkJaCA9IG9tYXAzNnh4X2h3bW9kczsKKwl9IGVsc2UgeworCQlXQVJOKDEsICJPTUFQMyBod21vZCBmYW1pbHkgaW5pdDogdW5rbm93biBjaGlwIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJciA9IG9tYXBfaHdtb2RfcmVnaXN0ZXIoaCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCS8qCisJICogUmVnaXN0ZXIgaHdtb2RzIHNwZWNpZmljIHRvIGNlcnRhaW4gRVMgbGV2ZWxzIG9mIGEKKwkgKiBwYXJ0aWN1bGFyIGZhbWlseSBvZiBzaWxpY29uIChlLmcuLCAzNHh4IEVTMS4wKQorCSAqLworCWggPSBOVUxMOworCWlmIChyZXYgPT0gT01BUDM0MzBfUkVWX0VTMV8wKSB7CisJCWggPSBvbWFwMzQzMGVzMV9od21vZHM7CisJfSBlbHNlIGlmIChyZXYgPT0gT01BUDM0MzBfUkVWX0VTMl8wIHx8IHJldiA9PSBPTUFQMzQzMF9SRVZfRVMyXzEgfHwKKwkJICAgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMCB8fCByZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xIHx8CisJCSAgIHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzFfMikgeworCQloID0gb21hcDM0MzBlczJwbHVzX2h3bW9kczsKKwl9OworCisJaWYgKGgpCisJCXIgPSBvbWFwX2h3bW9kX3JlZ2lzdGVyKGgpOworCisJcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKaW5kZXggNjIwMTQyMmMuLjc2OTVlNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF80NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfNDR4eF9kYXRhLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAjaW5jbHVkZSA8cGxhdC9tbWMuaD4KICNpbmNsdWRlIDxwbGF0L2kyYy5oPgorI2luY2x1ZGUgPHBsYXQvZG10aW1lci5oPgogCiAjaW5jbHVkZSAib21hcF9od21vZF9jb21tb25fZGF0YS5oIgogCkBAIC0xMzMsNyArMTM0LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2RtbV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtbV9zbGF2ZXMpLAogCS5tcHVfaXJxcwk9IG9tYXA0NHh4X2RtbV9pcnFzLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xODksNyArMTg5LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZW1pZl9md19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2VtaWZfZndfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjM2LDcgKzIzNSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2wzX2luc3RyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDNfaW5zdHJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsM19tYWluXzEgKi8KQEAgLTMzNiw3ICszMzQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sM19tYWluXzFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sM19tYWluXzFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsM19tYWluXzIgKi8KQEAgLTQzOCw3ICs0MzUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sM19tYWluXzJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sM19tYWluXzJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBsM19tYWluXzMgKi8KQEAgLTQ5Niw3ICs0OTIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sM19tYWluXzNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9sM19tYWluXzNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtNTU5LDcgKzU1NCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2w0X2FiZV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2w0X2FiZV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGw0X2NmZyAqLwpAQCAtNTg4LDcgKzU4Miw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2w0X2NmZ19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2w0X2NmZ19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGw0X3BlciAqLwpAQCAtNjE3LDcgKzYxMCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2w0X3Blcl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2w0X3Blcl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGw0X3drdXAgKi8KQEAgLTY0Niw3ICs2MzgsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9sNF93a3VwX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbDRfd2t1cF9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC02NzcsNyArNjY4LDYgQEAKIAkuY2xrZG1fbmFtZQk9ICJtcHVzc19jbGtkbSIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tcHVfcHJpdmF0ZV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21wdV9wcml2YXRlX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTgyOCw3ICs4MTgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9hZXNzX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9hZXNzX21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9hZXNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC04NTYsNyArODQ1LDYgQEAKIAl9LAogCS5vcHRfY2xrcwk9IGJhbmRnYXBfb3B0X2Nsa3MsCiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUoYmFuZGdhcF9vcHRfY2xrcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTkxNyw3ICs5MDUsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9jb3VudGVyXzMya19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2NvdW50ZXJfMzJrX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTEwMDUsNyArOTkyLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZG1hX3N5c3RlbV9zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfZG1hX3N5c3RlbV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZG1hX3N5c3RlbV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTA5OCw3ICsxMDg0LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZG1pY19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2RtaWNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTE2NCw3ICsxMTQ5LDYgQEAKIAkJCS5yc3RjdHJsX29mZnMgPSBPTUFQNF9STV9URVNMQV9SU1RDVFJMX09GRlNFVCwKIAkJfSwKIAl9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9kc3BfaHdtb2QgPSB7CkBAIC0xMTg3LDcgKzExNzEsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3Bfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2RzcF9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNwX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xMjc4LDcgKzEyNjEsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2Rzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xMzgxLDcgKzEzNjMsNiBAQAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGRzc19kaXNwY19vcHRfY2xrcyksCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kc3NfZGlzcGNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZGlzcGNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTQ4MCw3ICsxNDYxLDYgQEAKIAkub3B0X2Nsa3NfY250CT0gQVJSQVlfU0laRShkc3NfZHNpMV9vcHRfY2xrcyksCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kc3NfZHNpMV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19kc2kxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogZHNzX2RzaTIgKi8KQEAgLTE1NTgsNyArMTUzOCw2IEBACiAJLm9wdF9jbGtzX2NudAk9IEFSUkFZX1NJWkUoZHNzX2RzaTJfb3B0X2Nsa3MpLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfZHNzX2RzaTJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9kc3NfZHNpMl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0xNjU2LDcgKzE2MzUsNiBAQAogCS5vcHRfY2xrc19jbnQJPSBBUlJBWV9TSVpFKGRzc19oZG1pX29wdF9jbGtzKSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2Rzc19oZG1pX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX2hkbWlfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTc0OCw3ICsxNzI2LDYgQEAKIAkub3B0X2Nsa3NfY250CT0gQVJSQVlfU0laRShkc3NfcmZiaV9vcHRfY2xrcyksCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9kc3NfcmZiaV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2Rzc19yZmJpX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTE4MTcsNyArMTc5NCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2Rzc192ZW5jX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZHNzX3ZlbmNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMTkwMSw3ICsxODc3LDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW8xX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBncGlvMiAqLwpAQCAtMTk1Nyw3ICsxOTMyLDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW8yX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBncGlvMyAqLwpAQCAtMjAxMyw3ICsxOTg3LDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW8zX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBncGlvNCAqLwpAQCAtMjA2OSw3ICsyMDQyLDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW80X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzRfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBncGlvNSAqLwpAQCAtMjEyNSw3ICsyMDk3LDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW81X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBncGlvNiAqLwpAQCAtMjE4MSw3ICsyMTUyLDYgQEAKIAkuZGV2X2F0dHIJPSAmZ3Bpb19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2dwaW82X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfZ3BpbzZfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjI2MSw3ICsyMjMxLDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaHNpX3NsYXZlcyksCiAJLm1hc3RlcnMJPSBvbWFwNDR4eF9oc2lfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2hzaV9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjM0NSw3ICsyMzE0LDYgQEAKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2kyYzFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmMxX3NsYXZlcyksCiAJLmRldl9hdHRyCT0gJmkyY19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBpMmMyICovCkBAIC0yNDAyLDcgKzIzNzAsNiBAQAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfaTJjMl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X2kyYzJfc2xhdmVzKSwKIAkuZGV2X2F0dHIJPSAmaTJjX2Rldl9hdHRyLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIGkyYzMgKi8KQEAgLTI0NTksNyArMjQyNiw2IEBACiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9pMmMzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaTJjM19zbGF2ZXMpLAogCS5kZXZfYXR0cgk9ICZpMmNfZGV2X2F0dHIsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogaTJjNCAqLwpAQCAtMjUxNiw3ICsyNDgyLDYgQEAKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X2kyYzRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pMmM0X3NsYXZlcyksCiAJLmRldl9hdHRyCT0gJmkyY19kZXZfYXR0ciwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjU3Nyw3ICsyNTQyLDYgQEAKIAkJCS5yc3RjdHJsX29mZnMgPSBPTUFQNF9STV9EVUNBVElfUlNUQ1RSTF9PRkZTRVQsCiAJCX0sCiAJfSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBQc2V1ZG8gaHdtb2QgZm9yIHJlc2V0IGNvbnRyb2wgcHVycG9zZSBvbmx5ICovCkBAIC0yNTkzLDcgKzI1NTcsNiBAQAogCQkJLnJzdGN0cmxfb2ZmcyA9IE9NQVA0X1JNX0RVQ0FUSV9SU1RDVFJMX09GRlNFVCwKIAkJfSwKIAl9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pcHVfaHdtb2QgPSB7CkBAIC0yNjE2LDcgKzI1NzksNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pcHVfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2lwdV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXB1X21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0yNzA2LDcgKzI2NjgsNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pc3Nfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2lzc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXNzX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0yNzgxLDcgKzI3NDIsNiBAQAogCQkJLnJzdGN0cmxfb2ZmcyA9IE9NQVA0X1JNX0lWQUhEX1JTVENUUkxfT0ZGU0VULAogCQl9LAogCX0sCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogUHNldWRvIGh3bW9kIGZvciByZXNldCBjb250cm9sIHB1cnBvc2Ugb25seSAqLwpAQCAtMjc5Nyw3ICsyNzU3LDYgQEAKIAkJCS5yc3RjdHJsX29mZnMgPSBPTUFQNF9STV9JVkFIRF9SU1RDVFJMX09GRlNFVCwKIAkJfSwKIAl9LAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZCBvbWFwNDR4eF9pdmFfaHdtb2QgPSB7CkBAIC0yODIwLDcgKzI3NzksNiBAQAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9pdmFfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X2l2YV9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfaXZhX21hc3RlcnMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC0yODkwLDcgKzI4NDgsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9rYmRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9rYmRfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMjk1Niw3ICsyOTEzLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWFpbGJveF9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21haWxib3hfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMzA1MSw3ICszMDA3LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNic3AxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3AxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbWNic3AyICovCkBAIC0zMTI3LDcgKzMwODIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tY2JzcDJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY2JzcDJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtY2JzcDMgKi8KQEAgLTMyMDMsNyArMzE1Nyw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jYnNwM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jYnNwM19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1jYnNwNCAqLwpAQCAtMzI1OCw3ICszMjExLDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNic3A0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNic3A0X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTMzNTMsNyArMzMwNSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jcGRtX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNwZG1fc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMzQ0Miw3ICszMzkzLDYgQEAKIAkuZGV2X2F0dHIJPSAmbWNzcGkxX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNzcGkxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGkxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbWNzcGkyICovCkBAIC0zNTA1LDcgKzM0NTUsNiBAQAogCS5kZXZfYXR0cgk9ICZtY3NwaTJfZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tY3NwaTJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tY3NwaTJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtY3NwaTMgKi8KQEAgLTM1NjgsNyArMzUxNyw2IEBACiAJLmRldl9hdHRyCT0gJm1jc3BpM19kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21jc3BpM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21jc3BpM19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1jc3BpNCAqLwpAQCAtMzYyOSw3ICszNTc3LDYgQEAKIAkuZGV2X2F0dHIJPSAmbWNzcGk0X2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbWNzcGk0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbWNzcGk0X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTM3MTgsNyArMzY2NSw2IEBACiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzFfc2xhdmVzKSwKIAkubWFzdGVycwk9IG9tYXA0NHh4X21tYzFfbWFzdGVycywKIAkubWFzdGVyc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzFfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbW1jMiAqLwpAQCAtMzc3OSw3ICszNzI1LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jMl9zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfbW1jMl9tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jMl9tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBtbWMzICovCkBAIC0zODM0LDcgKzM3NzksNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9tbWMzX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfbW1jM19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIG1tYzQgKi8KQEAgLTM4OTAsNyArMzgzNCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X21tYzRfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tbWM0X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogbW1jNSAqLwpAQCAtMzk0NSw3ICszODg4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfbW1jNV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X21tYzVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtMzk4Nyw3ICszOTI5LDYgQEAKIAl9LAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfbXB1X21hc3RlcnMsCiAJLm1hc3RlcnNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9tcHVfbWFzdGVycyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTQwNjMsNyArNDAwNCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3NtYXJ0cmVmbGV4X2NvcmVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zbWFydHJlZmxleF9jb3JlX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogc21hcnRyZWZsZXhfaXZhICovCkBAIC00MTEyLDcgKzQwNTIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9zbWFydHJlZmxleF9pdmFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF9zbWFydHJlZmxleF9pdmFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiBzbWFydHJlZmxleF9tcHUgKi8KQEAgLTQxNjEsNyArNDEwMCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3NtYXJ0cmVmbGV4X21wdV9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qCkBAIC00MjI0LDcgKzQxNjIsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF9zcGlubG9ja19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3NwaW5sb2NrX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTQyNjUsNiArNDIwMiwxNiBAQAogCS5zeXNjCT0gJm9tYXA0NHh4X3RpbWVyX3N5c2MsCiB9OwogCisvKiBhbHdheXMtb24gdGltZXJzIGRldiBhdHRyaWJ1dGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF90aW1lcl9jYXBhYmlsaXR5X2Rldl9hdHRyIGNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIgPSB7CisJLnRpbWVyX2NhcGFiaWxpdHkJPSBPTUFQX1RJTUVSX0FMV09OLAorfTsKKworLyogcHdtIHRpbWVycyBkZXYgYXR0cmlidXRlICovCitzdGF0aWMgc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciBjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciA9IHsKKwkudGltZXJfY2FwYWJpbGl0eQk9IE9NQVBfVElNRVJfSEFTX1BXTSwKK307CisKIC8qIHRpbWVyMSAqLwogc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kIG9tYXA0NHh4X3RpbWVyMV9od21vZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwNDR4eF90aW1lcjFfaXJxc1tdID0gewpAQCAtNDMwOCw5ICs0MjU1LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXIxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXIxX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXIyICovCkBAIC00MzU2LDkgKzQzMDMsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjJfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB0aW1lcjMgKi8KQEAgLTQ0MDQsOSArNDM1MSw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyM19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyM19zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyNCAqLwpAQCAtNDQ1Miw5ICs0Mzk5LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXI0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI0X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXI1ICovCkBAIC00NTE5LDkgKzQ0NjYsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfYWx3b25fZGV2X2F0dHIsCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF90aW1lcjVfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjVfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB0aW1lcjYgKi8KQEAgLTQ1ODcsOSArNDUzNCw5IEBACiAJCQkubW9kdWxlbW9kZSAgID0gTU9EVUxFTU9ERV9TV0NUUkwsCiAJCX0sCiAJfSwKKwkuZGV2X2F0dHIJPSAmY2FwYWJpbGl0eV9hbHdvbl9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyNl9zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3RpbWVyNl9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHRpbWVyNyAqLwpAQCAtNDY1NCw5ICs0NjAxLDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X2Fsd29uX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXI3X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI3X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXI4ICovCkBAIC00NzIxLDkgKzQ2NjgsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXI4X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI4X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXI5ICovCkBAIC00NzY5LDkgKzQ3MTYsOSBAQAogCQkJLm1vZHVsZW1vZGUgICA9IE1PRFVMRU1PREVfU1dDVFJMLAogCQl9LAogCX0sCisJLmRldl9hdHRyCT0gJmNhcGFiaWxpdHlfcHdtX2Rldl9hdHRyLAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdGltZXI5X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdGltZXI5X3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXIxMCAqLwpAQCAtNDgxNyw5ICs0NzY0LDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyMTBfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjEwX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdGltZXIxMSAqLwpAQCAtNDg2NSw5ICs0ODEyLDkgQEAKIAkJCS5tb2R1bGVtb2RlICAgPSBNT0RVTEVNT0RFX1NXQ1RSTCwKIAkJfSwKIAl9LAorCS5kZXZfYXR0cgk9ICZjYXBhYmlsaXR5X3B3bV9kZXZfYXR0ciwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3RpbWVyMTFfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF90aW1lcjExX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyoKQEAgLTQ5NDQsNyArNDg5MSw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3VhcnQxX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDFfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKiB1YXJ0MiAqLwpAQCAtNDk5OSw3ICs0OTQ1LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfdWFydDJfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF91YXJ0Ml9zbGF2ZXMpLAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIH07CiAKIC8qIHVhcnQzICovCkBAIC01MDU1LDcgKzUwMDAsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF91YXJ0M19zbGF2ZXMsCiAJLnNsYXZlc19jbnQJPSBBUlJBWV9TSVpFKG9tYXA0NHh4X3VhcnQzX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogdWFydDQgKi8KQEAgLTUxMTAsNyArNTA1NCw2IEBACiAJfSwKIAkuc2xhdmVzCQk9IG9tYXA0NHh4X3VhcnQ0X3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdWFydDRfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtNTE5NSw3ICs1MTM4LDYgQEAKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdXNiX290Z19oc19zbGF2ZXMpLAogCS5tYXN0ZXJzCT0gb21hcDQ0eHhfdXNiX290Z19oc19tYXN0ZXJzLAogCS5tYXN0ZXJzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfdXNiX290Z19oc19tYXN0ZXJzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiAvKgpAQCAtNTI2Niw3ICs1MjA4LDYgQEAKIAl9LAogCS5zbGF2ZXMJCT0gb21hcDQ0eHhfd2RfdGltZXIyX3NsYXZlcywKIAkuc2xhdmVzX2NudAk9IEFSUkFZX1NJWkUob21hcDQ0eHhfd2RfdGltZXIyX3NsYXZlcyksCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogfTsKIAogLyogd2RfdGltZXIzICovCkBAIC01MzMzLDcgKzUyNzQsNiBAQAogCX0sCiAJLnNsYXZlcwkJPSBvbWFwNDR4eF93ZF90aW1lcjNfc2xhdmVzLAogCS5zbGF2ZXNfY250CT0gQVJSQVlfU0laRShvbWFwNDR4eF93ZF90aW1lcjNfc2xhdmVzKSwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiB9OwogCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb21hcF9od21vZCAqb21hcDQ0eHhfaHdtb2RzW10gPSB7CkBAIC01NDMwLDcgKzUzNzAsNyBAQAogCSZvbWFwNDR4eF9tY2JzcDRfaHdtb2QsCiAKIAkvKiBtY3BkbSBjbGFzcyAqLwotLyoJJm9tYXA0NHh4X21jcGRtX2h3bW9kLCAqLworCSZvbWFwNDR4eF9tY3BkbV9od21vZCwKIAogCS8qIG1jc3BpIGNsYXNzICovCiAJJm9tYXA0NHh4X21jc3BpMV9od21vZCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuYwppbmRleCA3YjlmMTkwLi42YTY2YWE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfbm9jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX25vYy5jCkBAIC0xLDI1ICsxLDI2IEBACiAvKgotICAqIE9NQVA0WFhYIEwzIEludGVyY29ubmVjdCBlcnJvciBoYW5kbGluZyBkcml2ZXIKLSAgKgotICAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBDb3Jwb3JhdGlvbgotICAqCVNhbnRvc2ggU2hpbGlta2FyIDxzYW50b3NoLnNoaWxpbWthckB0aS5jb20+Ci0gICoJU3JpY2hhcmFuIDxyLnNyaWNoYXJhbkB0aS5jb20+Ci0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgKgotICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3Ci0gICogVVNBCi0gICovCisgKiBPTUFQNFhYWCBMMyBJbnRlcmNvbm5lY3QgZXJyb3IgaGFuZGxpbmcgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIENvcnBvcmF0aW9uCisgKglTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgorICoJU3JpY2hhcmFuIDxyLnNyaWNoYXJhbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTU1LDEyICs1NiwxMiBAQAogc3RhdGljIGlycXJldHVybl90IGwzX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9sMykKIHsKIAotCXN0cnVjdCBvbWFwNF9sMwkJKmwzID0gX2wzOwotCWludCBpbnR0eXBlLCBpLCBqOworCXN0cnVjdCBvbWFwNF9sMyAqbDMgPSBfbDM7CisJaW50IGludHR5cGUsIGksIGs7CiAJaW50IGVycl9zcmMgPSAwOwotCXUzMiBzdGRfZXJyX21haW5fYWRkciwgc3RkX2Vycl9tYWluLCBlcnJfcmVnOwotCXUzMiBiYXNlLCBzbGF2ZV9hZGRyLCBjbGVhcjsKLQljaGFyICpzb3VyY2VfbmFtZTsKKwl1MzIgc3RkX2Vycl9tYWluLCBlcnJfcmVnLCBjbGVhciwgbWFzdGVyaWQ7CisJdm9pZCBfX2lvbWVtICpiYXNlLCAqbDNfdGFyZ19iYXNlOworCWNoYXIgKnRhcmdldF9uYW1lLCAqbWFzdGVyX25hbWUgPSAiVU4gSURFTlRJRklFRCI7CiAKIAkvKiBHZXQgdGhlIFR5cGUgb2YgaW50ZXJydXB0ICovCiAJaW50dHlwZSA9IGlycSA9PSBsMy0+YXBwX2lycSA/IEwzX0FQUExJQ0FUSU9OX0VSUk9SIDogTDNfREVCVUdfRVJST1I7CkBAIC03MCw0MyArNzEsNTAgQEAKIAkJICogUmVhZCB0aGUgcmVnZXJyIHJlZ2lzdGVyIG9mIHRoZSBjbG9jayBkb21haW4KIAkJICogdG8gZGV0ZXJtaW5lIHRoZSBzb3VyY2UKIAkJICovCi0JCWJhc2UgPSAodTMyKWwzLT5sM19iYXNlW2ldOwotCQllcnJfcmVnID0gIHJlYWRsKGJhc2UgKyBsM19mbGFnbXV4W2ldICsgKGludHR5cGUgPDwgMykpOworCQliYXNlID0gbDMtPmwzX2Jhc2VbaV07CisJCWVycl9yZWcgPSBfX3Jhd19yZWFkbChiYXNlICsgbDNfZmxhZ211eFtpXSArCisJCQkJCSsgTDNfRkxBR01VWF9SRUdFUlIwICsgKGludHR5cGUgPDwgMykpOwogCiAJCS8qIEdldCB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBhbmQgYW5hbHlzZSAqLwogCQlpZiAoZXJyX3JlZykgewogCQkJLyogSWRlbnRpZnkgdGhlIHNvdXJjZSBmcm9tIGNvbnRyb2wgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQlmb3IgKGogPSAwOyAhKGVycl9yZWcgJiAoMSA8PCBqKSk7IGorKykKLQkJCQkJCQkJCTsKKwkJCWVycl9zcmMgPSBfX2ZmcyhlcnJfcmVnKTsKIAotCQkJZXJyX3NyYyA9IGo7CiAJCQkvKiBSZWFkIHRoZSBzdGRlcnJsb2dfbWFpbl9zb3VyY2UgZnJvbSBjbGsgZG9tYWluICovCi0JCQlzdGRfZXJyX21haW5fYWRkciA9IGJhc2UgKyAqKGwzX3RhcmdbaV0gKyBlcnJfc3JjKTsKLQkJCXN0ZF9lcnJfbWFpbiA9IHJlYWRsKHN0ZF9lcnJfbWFpbl9hZGRyKTsKKwkJCWwzX3RhcmdfYmFzZSA9IGJhc2UgKyAqKGwzX3RhcmdbaV0gKyBlcnJfc3JjKTsKKwkJCXN0ZF9lcnJfbWFpbiA9ICBfX3Jhd19yZWFkbChsM190YXJnX2Jhc2UgKworCQkJCQlMM19UQVJHX1NUREVSUkxPR19NQUlOKTsKKwkJCW1hc3RlcmlkID0gX19yYXdfcmVhZGwobDNfdGFyZ19iYXNlICsKKwkJCQkJTDNfVEFSR19TVERFUlJMT0dfTVNUQUREUik7CiAKIAkJCXN3aXRjaCAoc3RkX2Vycl9tYWluICYgQ1VTVE9NX0VSUk9SKSB7CiAJCQljYXNlIFNUQU5EQVJEX0VSUk9SOgotCQkJCXNvdXJjZV9uYW1lID0KLQkJCQlsM190YXJnX3N0ZGVycmxvZ19tYWluX25hbWVbaV1bZXJyX3NyY107Ci0KLQkJCQlzbGF2ZV9hZGRyID0gc3RkX2Vycl9tYWluX2FkZHIgKwotCQkJCQkJTDNfU0xBVkVfQUREUkVTU19PRkZTRVQ7Ci0JCQkJV0FSTih0cnVlLCAiTDMgc3RhbmRhcmQgZXJyb3I6IFNPVVJDRTolcyBhdCBhZGRyZXNzIDB4JXhcbiIsCi0JCQkJCXNvdXJjZV9uYW1lLCByZWFkbChzbGF2ZV9hZGRyKSk7CisJCQkJdGFyZ2V0X25hbWUgPQorCQkJCQlsM190YXJnX2luc3RfbmFtZVtpXVtlcnJfc3JjXTsKKwkJCQlXQVJOKHRydWUsICJMMyBzdGFuZGFyZCBlcnJvcjogVEFSR0VUOiVzIGF0IGFkZHJlc3MgMHgleFxuIiwKKwkJCQkJdGFyZ2V0X25hbWUsCisJCQkJCV9fcmF3X3JlYWRsKGwzX3RhcmdfYmFzZSArCisJCQkJCQlMM19UQVJHX1NUREVSUkxPR19TTFZPRlNMU0IpKTsKIAkJCQkvKiBjbGVhciB0aGUgc3RkIGVycm9yIGxvZyovCiAJCQkJY2xlYXIgPSBzdGRfZXJyX21haW4gfCBDTEVBUl9TVERFUlJfTE9HOwotCQkJCXdyaXRlbChjbGVhciwgc3RkX2Vycl9tYWluX2FkZHIpOworCQkJCXdyaXRlbChjbGVhciwgbDNfdGFyZ19iYXNlICsKKwkJCQkJTDNfVEFSR19TVERFUlJMT0dfTUFJTik7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQ1VTVE9NX0VSUk9SOgotCQkJCXNvdXJjZV9uYW1lID0KLQkJCQlsM190YXJnX3N0ZGVycmxvZ19tYWluX25hbWVbaV1bZXJyX3NyY107Ci0KLQkJCQlXQVJOKHRydWUsICJDVVNUT00gU1JFU1AgZXJyb3Igd2l0aCBTT1VSQ0U6JXNcbiIsCi0JCQkJCQkJc291cmNlX25hbWUpOworCQkJCXRhcmdldF9uYW1lID0KKwkJCQkJbDNfdGFyZ19pbnN0X25hbWVbaV1bZXJyX3NyY107CisJCQkJZm9yIChrID0gMDsgayA8IE5VTV9PRl9MM19NQVNURVJTOyBrKyspIHsKKwkJCQkJaWYgKG1hc3RlcmlkID09IGwzX21hc3RlcnNba10uaWQpCisJCQkJCQltYXN0ZXJfbmFtZSA9CisJCQkJCQkJbDNfbWFzdGVyc1trXS5uYW1lOworCQkJCX0KKwkJCQlXQVJOKHRydWUsICJMMyBjdXN0b20gZXJyb3I6IE1BU1RFUjolcyBUQVJHRVQ6JXNcbiIsCisJCQkJCW1hc3Rlcl9uYW1lLCB0YXJnZXRfbmFtZSk7CiAJCQkJLyogY2xlYXIgdGhlIHN0ZCBlcnJvciBsb2cqLwogCQkJCWNsZWFyID0gc3RkX2Vycl9tYWluIHwgQ0xFQVJfU1RERVJSX0xPRzsKLQkJCQl3cml0ZWwoY2xlYXIsIHN0ZF9lcnJfbWFpbl9hZGRyKTsKKwkJCQl3cml0ZWwoY2xlYXIsIGwzX3RhcmdfYmFzZSArCisJCQkJCUwzX1RBUkdfU1RERVJSTE9HX01BSU4pOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgpAQCAtMTIwLDEyICsxMjgsMTEgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG9tYXA0X2wzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwNF9sM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0YXRpYyBzdHJ1Y3Qgb21hcDRfbDMJCSpsMzsKLQlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXM7Ci0JaW50CQkJcmV0OwotCWludAkJCWlycTsKKwlzdGF0aWMgc3RydWN0IG9tYXA0X2wzICpsMzsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKKwlpbnQgcmV0OwogCiAJbDMgPSBremFsbG9jKHNpemVvZigqbDMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWwzKQpAQCAtMTc3LDI3ICsxODQsMjUgQEAKIAkvKgogCSAqIFNldHVwIGludGVycnVwdCBIYW5kbGVycwogCSAqLwotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLAorCWwzLT5kZWJ1Z19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCXJldCA9IHJlcXVlc3RfaXJxKGwzLT5kZWJ1Z19pcnEsCiAJCQlsM19pbnRlcnJ1cHRfaGFuZGxlciwKIAkJCUlSUUZfRElTQUJMRUQsICJsMy1kYmctaXJxIiwgbDMpOwogCWlmIChyZXQpIHsKIAkJcHJfY3JpdCgiTDM6IHJlcXVlc3RfaXJxIGZhaWxlZCB0byByZWdpc3RlciBmb3IgMHgleFxuIiwKLQkJCQkJIE9NQVA0NFhYX0lSUV9MM19EQkcpOworCQkJCQkJT01BUDQ0WFhfSVJRX0wzX0RCRyk7CiAJCWdvdG8gZXJyMzsKIAl9Ci0JbDMtPmRlYnVnX2lycSA9IGlycTsKIAotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7Ci0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLAorCWwzLT5hcHBfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlyZXQgPSByZXF1ZXN0X2lycShsMy0+YXBwX2lycSwKIAkJCWwzX2ludGVycnVwdF9oYW5kbGVyLAogCQkJSVJRRl9ESVNBQkxFRCwgImwzLWFwcC1pcnEiLCBsMyk7CiAJaWYgKHJldCkgewogCQlwcl9jcml0KCJMMzogcmVxdWVzdF9pcnEgZmFpbGVkIHRvIHJlZ2lzdGVyIGZvciAweCV4XG4iLAotCQkJCQkgT01BUDQ0WFhfSVJRX0wzX0FQUCk7CisJCQkJCQlPTUFQNDRYWF9JUlFfTDNfQVBQKTsKIAkJZ290byBlcnI0OwogCX0KLQlsMy0+YXBwX2lycSA9IGlycTsKIAogCXJldHVybiAwOwogCkBAIC0yMTQsOSArMjE5LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBvbWFwNF9sM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXA0X2wzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBvbWFwNF9sMyAgICAgICAgICpsMyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbWFwNF9sMyAqbDMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWZyZWVfaXJxKGwzLT5hcHBfaXJxLCBsMyk7CiAJZnJlZV9pcnEobDMtPmRlYnVnX2lycSwgbDMpOwpAQCAtMjI4LDE2ICsyMzMsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbDNfbm9jX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gInRpLG9tYXA0LWwzLW5vYyIsIH0sCisJe30sCit9CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBsM19ub2NfbWF0Y2gpOworI2Vsc2UKKyNkZWZpbmUgbDNfbm9jX21hdGNoIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwNF9sM19kcml2ZXIgPSB7Ci0JLnJlbW92ZQkJPSBfX2V4aXRfcChvbWFwNF9sM19yZW1vdmUpLAorCS5wcm9iZQkJPSBvbWFwNF9sM19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9tYXA0X2wzX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7Ci0JLm5hbWUJCT0gIm9tYXBfbDNfbm9jIiwKKwkJLm5hbWUJCT0gIm9tYXBfbDNfbm9jIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBsM19ub2NfbWF0Y2gsCiAJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXA0X2wzX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZvbWFwNF9sM19kcml2ZXIsIG9tYXA0X2wzX3Byb2JlKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwNF9sM19kcml2ZXIpOwogfQogcG9zdGNvcmVfaW5pdGNhbGxfc3luYyhvbWFwNF9sM19pbml0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX25vYy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX25vYy5oCmluZGV4IDM1OWI4MzMuLjkwYjUwOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19ub2MuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfbm9jLmgKQEAgLTEsMTMyICsxLDE2MiBAQAotIC8qCi0gICogT01BUDRYWFggTDMgSW50ZXJjb25uZWN0ICBlcnJvciBoYW5kbGluZyBkcml2ZXIgaGVhZGVyCi0gICoKLSAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KLSAgKglTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgotICAqCXNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICoKLSAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNwotICAqIFVTQQotICAqLworLyoKKyAqIE9NQVA0WFhYIEwzIEludGVyY29ubmVjdCAgZXJyb3IgaGFuZGxpbmcgZHJpdmVyIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBDb3Jwb3JhdGlvbgorICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KKyAqCXNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCiAjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9MM19JTlRFUkNPTk5FQ1RfM1hYWF9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9MM19JTlRFUkNPTk5FQ1RfM1hYWF9ICiAKLS8qCi0gKiBMMyByZWdpc3RlciBvZmZzZXRzCi0gKi8KICNkZWZpbmUgTDNfTU9EVUxFUwkJCTMKICNkZWZpbmUgQ0xFQVJfU1RERVJSX0xPRwkJKDEgPDwgMzEpCiAjZGVmaW5lIENVU1RPTV9FUlJPUgkJCTB4MgogI2RlZmluZSBTVEFOREFSRF9FUlJPUgkJCTB4MAogI2RlZmluZSBJTkJBTkRfRVJST1IJCQkweDAKLSNkZWZpbmUgRU1JRl9LRVJSTE9HX09GRlNFVAkJMHgxMAotI2RlZmluZSBMM19TTEFWRV9BRERSRVNTX09GRlNFVAkJMHgxNAotI2RlZmluZSBMT0dJQ0FMX0FERFJfRVJST1JMT0cJCTB4NAogI2RlZmluZSBMM19BUFBMSUNBVElPTl9FUlJPUgkJMHgwCiAjZGVmaW5lIEwzX0RFQlVHX0VSUk9SCQkJMHgxCiAKLXUzMiBsM19mbGFnbXV4W0wzX01PRFVMRVNdID0gewotCTB4NTBDLAotCTB4MTAwQywKLQkwWDAyMEMKKy8qIEwzIFRBUkcgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBMM19UQVJHX1NUREVSUkxPR19NQUlOCQkweDQ4CisjZGVmaW5lIEwzX1RBUkdfU1RERVJSTE9HX1NMVk9GU0xTQgkweDVjCisjZGVmaW5lIEwzX1RBUkdfU1RERVJSTE9HX01TVEFERFIJMHg2OAorI2RlZmluZSBMM19GTEFHTVVYX1JFR0VSUjAJCTB4YworCisjZGVmaW5lIE5VTV9PRl9MM19NQVNURVJTCShzaXplb2YobDNfbWFzdGVycykvc2l6ZW9mKGwzX21hc3RlcnNbMF0pKQorCitzdGF0aWMgdTMyIGwzX2ZsYWdtdXhbTDNfTU9EVUxFU10gPSB7CisJMHg1MDAsCisJMHgxMDAwLAorCTBYMDIwMAogfTsKIAotLyoKLSAqIEwzIFRhcmdldCBzdGFuZGFyZCBFcnJvciByZWdpc3RlciBvZmZzZXRzCi0gKi8KLXUzMiBsM190YXJnX3N0ZGVycmxvZ19tYWluX2NsazFbXSA9IHsKLQkweDE0OCwgLyogRE1NMSAqLwotCTB4MjQ4LCAvKiBETU0yICovCi0JMHgzNDgsIC8qIEFCRSAqLwotCTB4NDQ4LCAvKiBMNENGRyAqLwotCTB4NjQ4ICAvKiBDTEsyIFBXUiBESVNDICovCisvKiBMMyBUYXJnZXQgc3RhbmRhcmQgRXJyb3IgcmVnaXN0ZXIgb2Zmc2V0cyAqLworc3RhdGljIHUzMiBsM190YXJnX2luc3RfY2xrMVtdID0geworCTB4MTAwLCAvKiBETU0xICovCisJMHgyMDAsIC8qIERNTTIgKi8KKwkweDMwMCwgLyogQUJFICovCisJMHg0MDAsIC8qIEw0Q0ZHICovCisJMHg2MDAgIC8qIENMSzIgUFdSIERJU0MgKi8KIH07CiAKLXUzMiBsM190YXJnX3N0ZGVycmxvZ19tYWluX2NsazJbXSA9IHsKLQkweDU0OCwJCS8qIENPUlRFWCBNMyAqLwotCTB4MzQ4LAkJLyogRFNTICovCi0JMHgxNDgsCQkvKiBHUE1DICovCi0JMHg0NDgsCQkvKiBJU1MgKi8KLQkweDc0OCwJCS8qIElWQUhEICovCi0JMHhENDgsCQkvKiBtaXNzaW5nIGluIFRSTSAgY29ycmVzcG9uZHMgdG8gQUVTMSovCi0JMHg5NDgsCQkvKiBMNCBQRVIwKi8KLQkweDI0OCwJCS8qIE9DTVJBTSAqLwotCTB4MTQ4LAkJLyogbWlzc2luZyBpbiBUUk0gY29ycmVzcG9uZHMgdG8gR1BNQyBzRVJST1IqLwotCTB4NjQ4LAkJLyogU0dYICovCi0JMHg4NDgsCQkvKiBTTDIgKi8KLQkweDE2NDgsCQkvKiBDMkMgKi8KLQkweDExNDgsCQkvKiBtaXNzaW5nIGluIFRSTSBjb3JyZXNwb25kcyBQV1IgRElTQyBDTEsxKi8KLQkweEY0OCwJCS8qIG1pc3NpbmcgaW4gVFJNIGNvcnJzcG9uZHMgdG8gU0hBMSovCi0JMHhFNDgsCQkvKiBtaXNzaW5nIGluIFRSTSBjb3JyZXNwb25kcyB0byBBRVMyKi8KLQkweEM0OCwJCS8qIEw0IFBFUjMgKi8KLQkweEE0OCwJCS8qIEw0IFBFUjEqLwotCTB4QjQ4CQkvKiBMNCBQRVIyKi8KK3N0YXRpYyB1MzIgbDNfdGFyZ19pbnN0X2NsazJbXSA9IHsKKwkweDUwMCwgLyogQ09SVEVYIE0zICovCisJMHgzMDAsIC8qIERTUyAqLworCTB4MTAwLCAvKiBHUE1DICovCisJMHg0MDAsIC8qIElTUyAqLworCTB4NzAwLCAvKiBJVkFIRCAqLworCTB4RDAwLCAvKiBtaXNzaW5nIGluIFRSTSAgY29ycmVzcG9uZHMgdG8gQUVTMSovCisJMHg5MDAsIC8qIEw0IFBFUjAqLworCTB4MjAwLCAvKiBPQ01SQU0gKi8KKwkweDEwMCwgLyogbWlzc2luZyBpbiBUUk0gY29ycmVzcG9uZHMgdG8gR1BNQyBzRVJST1IqLworCTB4NjAwLCAvKiBTR1ggKi8KKwkweDgwMCwgLyogU0wyICovCisJMHgxNjAwLCAvKiBDMkMgKi8KKwkweDExMDAsCS8qIG1pc3NpbmcgaW4gVFJNIGNvcnJlc3BvbmRzIFBXUiBESVNDIENMSzEqLworCTB4RjAwLCAvKiBtaXNzaW5nIGluIFRSTSBjb3Jyc3BvbmRzIHRvIFNIQTEqLworCTB4RTAwLCAvKiBtaXNzaW5nIGluIFRSTSBjb3JyZXNwb25kcyB0byBBRVMyKi8KKwkweEMwMCwgLyogTDQgUEVSMyAqLworCTB4QTAwLCAvKiBMNCBQRVIxKi8KKwkweEIwMCAvKiBMNCBQRVIyKi8KIH07CiAKLXUzMiBsM190YXJnX3N0ZGVycmxvZ19tYWluX2NsazNbXSA9IHsKLQkweDAxNDgJLyogRU1VU1MgKi8KK3N0YXRpYyB1MzIgbDNfdGFyZ19pbnN0X2NsazNbXSA9IHsKKwkweDAxMDAJLyogRU1VU1MgKi8KIH07CiAKLWNoYXIgKmwzX3Rhcmdfc3RkZXJybG9nX21haW5fbmFtZVtMM19NT0RVTEVTXVsxOF0gPSB7CitzdGF0aWMgc3RydWN0IGwzX21hc3RlcnNfZGF0YSB7CisJdTMyIGlkOworCWNoYXIgbmFtZVsxMF07Cit9IGwzX21hc3RlcnNbXSA9IHsKKwl7IDB4MCAsICJNUFUifSwKKwl7IDB4MTAsICJDU19BRFAifSwKKwl7IDB4MTQsICJ4eHgifSwKKwl7IDB4MjAsICJEU1AifSwKKwl7IDB4MzAsICJJVkFIRCJ9LAorCXsgMHg0MCwgIklTUyJ9LAorCXsgMHg0NCwgIkR1Y2F0aU0zIn0sCisJeyAweDQ4LCAiRmFjZURldGVjdCJ9LAorCXsgMHg1MCwgIlNETUFfUmQifSwKKwl7IDB4NTQsICJTRE1BX1dyIn0sCisJeyAweDU4LCAieHh4In0sCisJeyAweDVDLCAieHh4In0sCisJeyAweDYwLCAiU0dYIn0sCisJeyAweDcwLCAiRFNTIn0sCisJeyAweDgwLCAiQzJDIn0sCisJeyAweDg4LCAieHh4In0sCisJeyAweDhDLCAieHh4In0sCisJeyAweDkwLCAiSFNJIn0sCisJeyAweEEwLCAiTU1DMSJ9LAorCXsgMHhBNCwgIk1NQzIifSwKKwl7IDB4QTgsICJNTUM2In0sCisJeyAweEIwLCAiVU5JUFJPMSJ9LAorCXsgMHhDMCwgIlVTQkhPU1RIUyJ9LAorCXsgMHhDNCwgIlVTQk9UR0hTIn0sCisJeyAweEM4LCAiVVNCSE9TVEZTIn0KK307CisKK3N0YXRpYyBjaGFyICpsM190YXJnX2luc3RfbmFtZVtMM19NT0RVTEVTXVsxOF0gPSB7CiAJewotCSJETU0xIiwKLQkiRE1NMiIsCi0JIkFCRSIsCi0JIkw0Q0ZHIiwKLQkiQ0xLMiBQV1IgRElTQyIsCisJCSJETU0xIiwKKwkJIkRNTTIiLAorCQkiQUJFIiwKKwkJIkw0Q0ZHIiwKKwkJIkNMSzIgUFdSIERJU0MiLAogCX0sCiAJewotCSJDT1JURVggTTMiICwKLQkiRFNTICIsCi0JIkdQTUMgIiwKLQkiSVNTICIsCi0JIklWQUhEICIsCi0JIkFFUzEiLAotCSJMNCBQRVIwIiwKLQkiT0NNUkFNICIsCi0JIkdQTUMgc0VSUk9SIiwKLQkiU0dYICIsCi0JIlNMMiAiLAotCSJDMkMgIiwKLQkiUFdSIERJU0MgQ0xLMSIsCi0JIlNIQTEiLAotCSJBRVMyIiwKLQkiTDQgUEVSMyIsCi0JIkw0IFBFUjEiLAotCSJMNCBQRVIyIiwKKwkJIkNPUlRFWCBNMyIgLAorCQkiRFNTICIsCisJCSJHUE1DICIsCisJCSJJU1MgIiwKKwkJIklWQUhEICIsCisJCSJBRVMxIiwKKwkJIkw0IFBFUjAiLAorCQkiT0NNUkFNICIsCisJCSJHUE1DIHNFUlJPUiIsCisJCSJTR1ggIiwKKwkJIlNMMiAiLAorCQkiQzJDICIsCisJCSJQV1IgRElTQyBDTEsxIiwKKwkJIlNIQTEiLAorCQkiQUVTMiIsCisJCSJMNCBQRVIzIiwKKwkJIkw0IFBFUjEiLAorCQkiTDQgUEVSMiIsCiAJfSwKIAl7Ci0JIkVNVVNTIiwKKwkJIkVNVVNTIiwKIAl9LAogfTsKIAotdTMyICpsM190YXJnW0wzX01PRFVMRVNdID0gewotCWwzX3Rhcmdfc3RkZXJybG9nX21haW5fY2xrMSwKLQlsM190YXJnX3N0ZGVycmxvZ19tYWluX2NsazIsCi0JbDNfdGFyZ19zdGRlcnJsb2dfbWFpbl9jbGszLAorc3RhdGljIHUzMiAqbDNfdGFyZ1tMM19NT0RVTEVTXSA9IHsKKwlsM190YXJnX2luc3RfY2xrMSwKKwlsM190YXJnX2luc3RfY2xrMiwKKwlsM190YXJnX2luc3RfY2xrMywKIH07CiAKIHN0cnVjdCBvbWFwNF9sMyB7Ci0Jc3RydWN0IGRldmljZQkqZGV2OwotCXN0cnVjdCBjbGsJKmljazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGNsayAqaWNrOwogCiAJLyogbWVtb3J5IGJhc2UgKi8KLQl2b2lkIF9faW9tZW0gKmwzX2Jhc2VbNF07CisJdm9pZCBfX2lvbWVtICpsM19iYXNlW0wzX01PRFVMRVNdOwogCi0JaW50CQlkZWJ1Z19pcnE7Ci0JaW50CQlhcHBfaXJxOworCWludCBkZWJ1Z19pcnE7CisJaW50IGFwcF9pcnE7CiB9OwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguYwppbmRleCA4NzNjMGUzLi5hMDVhNjJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX3NteC5jCkBAIC0xLDI2ICsxLDI2IEBACi0gLyoKLSAgKiBPTUFQM1hYWCBMMyBJbnRlcmNvbm5lY3QgRHJpdmVyCi0gICoKLSAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KLSAgKglGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4KLSAgKglTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgotICAqCVNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgotICAqCi0gICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICoKLSAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNwotICAqIFVTQQotICAqLworLyoKKyAqIE9NQVAzWFhYIEwzIEludGVyY29ubmVjdCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgQ29ycG9yYXRpb24KKyAqCUZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgorICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KKyAqCVNyaWNoYXJhbiA8ci5zcmljaGFyYW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMzUsNyArMTM1LDcgQEAKIAl9CiB9CiAKLS8qKgorLyoKICAqIG9tYXAzX2wzX2Jsb2NrX2lycSAtIGhhbmRsZXMgYSByZWdpc3RlciBibG9jaydzIGlycQogICogQGwzOiBzdHJ1Y3Qgb21hcDNfbDMgKgogICogQGJhc2U6IHJlZ2lzdGVyIGJsb2NrIGJhc2UgYWRkcmVzcwpAQCAtMTUwLDMwICsxNTAsMjkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwM19sM19ibG9ja19pcnEoc3RydWN0IG9tYXAzX2wzICpsMywKIAkJCQkJdTY0IGVycm9yLCBpbnQgZXJyb3JfYWRkcikKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gb21hcDNfbDNfZGVjb2RlX2Vycm9yX2NvZGUoZXJyb3IpOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIGluaXRpZCA9IG9tYXAzX2wzX2RlY29kZV9pbml0aWQoZXJyb3IpOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIG11bHRpID0gZXJyb3IgJiBMM19FUlJPUl9MT0dfTVVMVEk7Ci0JdTMyCQkJYWRkcmVzcyA9IG9tYXAzX2wzX2RlY29kZV9hZGRyKGVycm9yX2FkZHIpOworCXU4IGNvZGUgPSBvbWFwM19sM19kZWNvZGVfZXJyb3JfY29kZShlcnJvcik7CisJdTggaW5pdGlkID0gb21hcDNfbDNfZGVjb2RlX2luaXRpZChlcnJvcik7CisJdTggbXVsdGkgPSBlcnJvciAmIEwzX0VSUk9SX0xPR19NVUxUSTsKKwl1MzIgYWRkcmVzcyA9IG9tYXAzX2wzX2RlY29kZV9hZGRyKGVycm9yX2FkZHIpOwogCiAJV0FSTih0cnVlLCAiJXMgc2VlbiBieSAlcyAlcyBhdCBhZGRyZXNzICV4XG4iLAotCQkJCSBvbWFwM19sM19jb2RlX3N0cmluZyhjb2RlKSwKLQkJCSAgb21hcDNfbDNfaW5pdGlhdG9yX3N0cmluZyhpbml0aWQpLAotCQkJICAgICBtdWx0aSA/ICJNdWx0aXBsZSBFcnJvcnMiIDogIiIsCi0JCQkJCQkgICBhZGRyZXNzKTsKKwkJCW9tYXAzX2wzX2NvZGVfc3RyaW5nKGNvZGUpLAorCQkJb21hcDNfbDNfaW5pdGlhdG9yX3N0cmluZyhpbml0aWQpLAorCQkJbXVsdGkgPyAiTXVsdGlwbGUgRXJyb3JzIiA6ICIiLCBhZGRyZXNzKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IG9tYXAzX2wzX2FwcF9pcnEoaW50IGlycSwgdm9pZCAqX2wzKQogewotCXN0cnVjdCBvbWFwM19sMyAgICAgICAgICpsMyA9IF9sMzsKLQl1NjQgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGNsZWFyOwotCXU2NCAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotCXU2NAkJCWVycm9yX2FkZHI7Ci0JdTY0CQkJZXJyX3NvdXJjZSA9IDA7Ci0Jdm9pZAkJCV9faW9tZW0gKmJhc2U7Ci0JaW50CQkJaW50X3R5cGU7Ci0JaXJxcmV0dXJuX3QgICAgICAgICAgICAgcmV0ID0gSVJRX05PTkU7CisJc3RydWN0IG9tYXAzX2wzICpsMyA9IF9sMzsKKwl1NjQgc3RhdHVzLCBjbGVhcjsKKwl1NjQgZXJyb3I7CisJdTY0IGVycm9yX2FkZHI7CisJdTY0IGVycl9zb3VyY2UgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgaW50X3R5cGU7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CiAKIAlpbnRfdHlwZSA9IGlycSA9PSBsMy0+YXBwX2lycSA/IEwzX0FQUExJQ0FUSU9OX0VSUk9SIDogTDNfREVCVUdfRVJST1I7CiAJaWYgKCFpbnRfdHlwZSkgewpAQCAtMTkxLDE0ICsxOTAsMTIgQEAKIAl9CiAKIAkvKiBpZGVudGlmeSB0aGUgZXJyb3Igc291cmNlICovCi0JZm9yIChlcnJfc291cmNlID0gMDsgIShzdGF0dXMgJiAoMSA8PCBlcnJfc291cmNlKSk7IGVycl9zb3VyY2UrKykKLQkJCQkJCQkJCTsKKwllcnJfc291cmNlID0gX19mZnMoc3RhdHVzKTsKIAotCWJhc2UgPSBsMy0+cnQgKyAqKG9tYXAzX2wzX2Jhc2VzW2ludF90eXBlXSArIGVycl9zb3VyY2UpOworCWJhc2UgPSBsMy0+cnQgKyBvbWFwM19sM19iYXNlc1tpbnRfdHlwZV1bZXJyX3NvdXJjZV07CiAJZXJyb3IgPSBvbWFwM19sM19yZWFkbGwoYmFzZSwgTDNfRVJST1JfTE9HKTsKIAlpZiAoZXJyb3IpIHsKIAkJZXJyb3JfYWRkciA9IG9tYXAzX2wzX3JlYWRsbChiYXNlLCBMM19FUlJPUl9MT0dfQUREUik7Ci0KIAkJcmV0IHw9IG9tYXAzX2wzX2Jsb2NrX2lycShsMywgZXJyb3IsIGVycm9yX2FkZHIpOwogCX0KIApAQCAtMjE1LDkgKzIxMiw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAzX2wzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IG9tYXAzX2wzICAgICAgICAgKmwzOwotCXN0cnVjdCByZXNvdXJjZSAgICAgICAgICpyZXM7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBvbWFwM19sMyAqbDM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKIAogCWwzID0ga3phbGxvYyhzaXplb2YoKmwzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsMykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9sM19zbXguaAppbmRleCBiYTJlZDlhLi40ZjNjZWJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfbDNfc214LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2wzX3NteC5oCkBAIC0xLDI2ICsxLDI2IEBACi0gLyoKLSAgKiBPTUFQM1hYWCBMMyBJbnRlcmNvbm5lY3QgRHJpdmVyIGhlYWRlcgotICAqCi0gICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIENvcnBvcmF0aW9uCi0gICoJRmVsaXBlIEJhbGJpIDxiYWxiaUB0aS5jb20+Ci0gICoJU2FudG9zaCBTaGlsaW1rYXIgPHNhbnRvc2guc2hpbGlta2FyQHRpLmNvbT4KLSAgKglzcmljaGFyYW4gPHIuc3JpY2hhcmFuQHRpLmNvbT4KLSAgKgotICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICoKLSAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAqCi0gICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKLSAgKiBVU0EKLSAgKi8KKy8qCisgKiBPTUFQM1hYWCBMMyBJbnRlcmNvbm5lY3QgRHJpdmVyIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBDb3Jwb3JhdGlvbgorICoJRmVsaXBlIEJhbGJpIDxiYWxiaUB0aS5jb20+CisgKglTYW50b3NoIFNoaWxpbWthciA8c2FudG9zaC5zaGlsaW1rYXJAdGkuY29tPgorICoJc3JpY2hhcmFuIDxyLnNyaWNoYXJhbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisgKi8KICNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVAyX0wzX0lOVEVSQ09OTkVDVF8zWFhYX0gKICNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVAyX0wzX0lOVEVSQ09OTkVDVF8zWFhYX0gKIApAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBMM19TSV9DT05UUk9MCQkJMHgwMjAKICNkZWZpbmUgTDNfU0lfRkxBR19TVEFUVVNfMAkJMHg1MTAKIAotY29uc3QgdTY0IHNoaWZ0ID0gMTsKK3N0YXRpYyBjb25zdCB1NjQgc2hpZnQgPSAxOwogCiAjZGVmaW5lIEwzX1NUQVRVU18wX01QVUlBX0JSU1QJCShzaGlmdCA8PCAwKQogI2RlZmluZSBMM19TVEFUVVNfMF9NUFVJQV9SU1AJCShzaGlmdCA8PCAxKQpAQCAtNzgsMzIgKzc4LDMyIEBACiAjZGVmaW5lIEwzX1NUQVRVU18wX0w0RU1VVEFfUkVRCQkoc2hpZnQgPDwgNjApCiAjZGVmaW5lIEwzX1NUQVRVU18wX01BRDJEVEFfUkVRCQkoc2hpZnQgPDwgNjEpCiAKLSNkZWZpbmUgTDNfU1RBVFVTXzBfVElNRU9VVF9NQVNLCShMM19TVEFUVVNfMF9NUFVJQV9CUlNUICAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX01QVUlBX1JTUCAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9JVkFJQV9CUlNUICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfSVZBSUFfUlNQICAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX1NHWElBX0JSU1QgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9TR1hJQV9SU1AgICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfQ0FNSUFfQlJTVCAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0NBTUlBX1JTUCAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9ESVNQSUFfQlJTVCAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfRElTUElBX1JTUCAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0RNQVJESUFfQlJTVCAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9ETUFSRElBX1JTUCAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfRE1BV1JJQV9CUlNUICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0RNQVdSSUFfUlNQICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9VU0JPVEdJQV9CUlNUICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfVVNCT1RHSUFfUlNQICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX1VTQkhPU1RJQV9CUlNUICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9TTVNUQV9SRVEgICAgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfR1BNQ1RBX1JFUSAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX09DTVJBTVRBX1JFUSAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9PQ01ST01UQV9SRVEgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfSVZBVEFfUkVRICAgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX1NHWFRBX1JFUSAgICAgICAgIFwKLQkJCQkJfCBMM19TVEFUVVNfMF9MNENPUkVUQV9SRVEgICAgICBcCi0JCQkJCXwgTDNfU1RBVFVTXzBfTDRQRVJUQV9SRVEgICAgICAgXAotCQkJCQl8IEwzX1NUQVRVU18wX0w0RU1VVEFfUkVRICAgICAgIFwKKyNkZWZpbmUgTDNfU1RBVFVTXzBfVElNRU9VVF9NQVNLCShMM19TVEFUVVNfMF9NUFVJQV9CUlNUCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfTVBVSUFfUlNQCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfSVZBSUFfQlJTVAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfSVZBSUFfUlNQCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfU0dYSUFfQlJTVAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfU0dYSUFfUlNQCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfQ0FNSUFfQlJTVAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfQ0FNSUFfUlNQCQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfRElTUElBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RJU1BJQV9SU1AJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RNQVJESUFfQlJTVAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfRE1BUkRJQV9SU1AJXAorCQkJCQl8IEwzX1NUQVRVU18wX0RNQVdSSUFfQlJTVAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfRE1BV1JJQV9SU1AJXAorCQkJCQl8IEwzX1NUQVRVU18wX1VTQk9UR0lBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX1VTQk9UR0lBX1JTUAlcCisJCQkJCXwgTDNfU1RBVFVTXzBfVVNCSE9TVElBX0JSU1QJXAorCQkJCQl8IEwzX1NUQVRVU18wX1NNU1RBX1JFUQkJXAorCQkJCQl8IEwzX1NUQVRVU18wX0dQTUNUQV9SRVEJXAorCQkJCQl8IEwzX1NUQVRVU18wX09DTVJBTVRBX1JFUQlcCisJCQkJCXwgTDNfU1RBVFVTXzBfT0NNUk9NVEFfUkVRCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9JVkFUQV9SRVEJCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9TR1hUQV9SRVEJCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9MNENPUkVUQV9SRVEJXAorCQkJCQl8IEwzX1NUQVRVU18wX0w0UEVSVEFfUkVRCVwKKwkJCQkJfCBMM19TVEFUVVNfMF9MNEVNVVRBX1JFUQlcCiAJCQkJCXwgTDNfU1RBVFVTXzBfTUFEMkRUQV9SRVEpCiAKICNkZWZpbmUgTDNfU0lfRkxBR19TVEFUVVNfMQkJMHg1MzAKQEAgLTEzNywxOSArMTM3LDE5IEBACiAKIGVudW0gb21hcDNfbDNfaW5pdGlhdG9yX2lkIHsKIAkvKiBMQ0QgaGFzIDEgSUQgKi8KLQlPTUFQX0wzX0xDRAkgICAgICAgID0gMjksCisJT01BUF9MM19MQ0QgPSAyOSwKIAkvKiBTQUQyRCBoYXMgMSBJRCAqLwotCU9NQVBfTDNfU0FEMkQJCT0gMjgsCisJT01BUF9MM19TQUQyRCA9IDI4LAogCS8qIE1QVSBoYXMgNSBJRHMgKi8KLQlPTUFQX0wzX0lBX01QVV9TU18xICAgICA9IDI3LAotCU9NQVBfTDNfSUFfTVBVX1NTXzIgICAgID0gMjYsCi0JT01BUF9MM19JQV9NUFVfU1NfMyAgICAgPSAyNSwKLQlPTUFQX0wzX0lBX01QVV9TU180ICAgICA9IDI0LAotCU9NQVBfTDNfSUFfTVBVX1NTXzUgICAgID0gMjMsCisJT01BUF9MM19JQV9NUFVfU1NfMSA9IDI3LAorCU9NQVBfTDNfSUFfTVBVX1NTXzIgPSAyNiwKKwlPTUFQX0wzX0lBX01QVV9TU18zID0gMjUsCisJT01BUF9MM19JQV9NUFVfU1NfNCA9IDI0LAorCU9NQVBfTDNfSUFfTVBVX1NTXzUgPSAyMywKIAkvKiBJVkEyLjIgU1MgaGFzIDMgSURzKi8KLQlPTUFQX0wzX0lBX0lWQV9TU18xICAgICA9IDIyLAotCU9NQVBfTDNfSUFfSVZBX1NTXzIgICAgID0gMjEsCi0JT01BUF9MM19JQV9JVkFfU1NfMyAgICAgPSAyMCwKKwlPTUFQX0wzX0lBX0lWQV9TU18xID0gMjIsCisJT01BUF9MM19JQV9JVkFfU1NfMiA9IDIxLAorCU9NQVBfTDNfSUFfSVZBX1NTXzMgPSAyMCwKIAkvKiBJVkEgMi4yIFNTIERNQSBoYXMgNiBJRFMgKi8KIAlPTUFQX0wzX0lBX0lWQV9TU19ETUFfMSA9IDE5LAogCU9NQVBfTDNfSUFfSVZBX1NTX0RNQV8yID0gMTgsCkBAIC0xNTgsMjUgKzE1OCwyNSBAQAogCU9NQVBfTDNfSUFfSVZBX1NTX0RNQV81ID0gMTUsCiAJT01BUF9MM19JQV9JVkFfU1NfRE1BXzYgPSAxNCwKIAkvKiBTR1ggaGFzIDEgSUQgKi8KLQlPTUFQX0wzX0lBX1NHWAkJPSAxMywKKwlPTUFQX0wzX0lBX1NHWCA9IDEzLAogCS8qIENBTSBoYXMgMyBJRCAqLwotCU9NQVBfTDNfSUFfQ0FNXzEJPSAxMiwKLQlPTUFQX0wzX0lBX0NBTV8yCT0gMTEsCi0JT01BUF9MM19JQV9DQU1fMwk9IDEwLAorCU9NQVBfTDNfSUFfQ0FNXzEgPSAxMiwKKwlPTUFQX0wzX0lBX0NBTV8yID0gMTEsCisJT01BUF9MM19JQV9DQU1fMyA9IDEwLAogCS8qIERBUCBoYXMgMSBJRCAqLwotCU9NQVBfTDNfSUFfREFQCQk9IDksCisJT01BUF9MM19JQV9EQVAgPSA5LAogCS8qIFNETUEgV1IgaGFzIDIgSURzICovCi0JT01BUF9MM19TRE1BX1dSXzEJPSA4LAotCU9NQVBfTDNfU0RNQV9XUl8yCT0gNywKKwlPTUFQX0wzX1NETUFfV1JfMSA9IDgsCisJT01BUF9MM19TRE1BX1dSXzIgPSA3LAogCS8qIFNETUEgUkQgaGFzIDQgSURzICovCi0JT01BUF9MM19TRE1BX1JEXzEJPSA2LAotCU9NQVBfTDNfU0RNQV9SRF8yCT0gNSwKLQlPTUFQX0wzX1NETUFfUkRfMwk9IDQsCi0JT01BUF9MM19TRE1BX1JEXzQJPSAzLAorCU9NQVBfTDNfU0RNQV9SRF8xID0gNiwKKwlPTUFQX0wzX1NETUFfUkRfMiA9IDUsCisJT01BUF9MM19TRE1BX1JEXzMgPSA0LAorCU9NQVBfTDNfU0RNQV9SRF80ID0gMywKIAkvKiBIU1VTQiBPVEcgaGFzIDEgSUQgKi8KLQlPTUFQX0wzX1VTQk9URwkJPSAyLAorCU9NQVBfTDNfVVNCT1RHID0gMiwKIAkvKiBIU1VTQiBIT1NUIGhhcyAxIElEICovCi0JT01BUF9MM19VU0JIT1NUCQk9IDEsCisJT01BUF9MM19VU0JIT1NUID0gMSwKIH07CiAKIGVudW0gb21hcDNfbDNfY29kZSB7CkBAIC0xOTIsMjEgKzE5MiwyMSBAQAogfTsKIAogc3RydWN0IG9tYXAzX2wzIHsKLQlzdHJ1Y3QgZGV2aWNlICAgKmRldjsKLQlzdHJ1Y3QgY2xrICAgICAgKmljazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGNsayAqaWNrOwogCiAJLyogbWVtb3J5IGJhc2UqLwotCXZvaWQgX19pb21lbSAgICAqcnQ7CisJdm9pZCBfX2lvbWVtICpydDsKIAotCWludCAgICAgICAgICAgICBkZWJ1Z19pcnE7Ci0JaW50ICAgICAgICAgICAgIGFwcF9pcnE7CisJaW50IGRlYnVnX2lycTsKKwlpbnQgYXBwX2lycTsKIAogCS8qIHRydWUgd2hlbiBhbmQgaW5iYW5kIGZ1bmN0aW9uYWwgZXJyb3Igb2NjdXJzICovCi0JdW5zaWduZWQgICAgICAgIGluYmFuZDoxOworCXVuc2lnbmVkIGluYmFuZDoxOwogfTsKIAogLyogb2Zmc2V0cyBmb3IgbDMgYWdlbnRzIGluIG9yZGVyIHdpdGggdGhlIEZsYWcgc3RhdHVzIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgX19pb21lbSBvbWFwM19sM19hcHBfYmFzZXNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb21hcDNfbDNfYXBwX2Jhc2VzW10gPSB7CiAJLyogTVBVIElBICovCiAJMHgxNDAwLAogCTB4MTQwMCwKQEAgLTMwNSw3ICszMDUsNyBAQAogCTAsCiB9OwogCi11bnNpZ25lZCBpbnQgX19pb21lbSBvbWFwM19sM19kZWJ1Z19iYXNlc1tdID0geworc3RhdGljIHVuc2lnbmVkIGludCBvbWFwM19sM19kZWJ1Z19iYXNlc1tdID0gewogCS8qIE1QVSBEQVRBIElBICovCiAJMHgxNDAwLAogCS8qIFJFU0VSVkVEICovCkBAIC0zMjEsNyArMzIxLDcgQEAKIAkvKiBSRVNUIFJFU0VSVkVEICovCiB9OwogCi11MzIgKm9tYXAzX2wzX2Jhc2VzW10gPSB7CitzdGF0aWMgdTMyICpvbWFwM19sM19iYXNlc1tdID0gewogCW9tYXAzX2wzX2FwcF9iYXNlcywKIAlvbWFwM19sM19kZWJ1Z19iYXNlcywKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfdHdsLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfdHdsLmMKaW5kZXggMDdkNjE0MC4uZjUxNWExYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3R3bC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF90d2wuYwpAQCAtNDIsOCArNDIsMTEgQEAKIAogI2RlZmluZSBPTUFQNF9TUkkyQ19TTEFWRV9BRERSCQkweDEyCiAjZGVmaW5lIE9NQVA0X1ZERF9NUFVfU1JfVk9MVF9SRUcJMHg1NQorI2RlZmluZSBPTUFQNF9WRERfTVBVX1NSX0NNRF9SRUcJMHg1NgogI2RlZmluZSBPTUFQNF9WRERfSVZBX1NSX1ZPTFRfUkVHCTB4NUIKKyNkZWZpbmUgT01BUDRfVkREX0lWQV9TUl9DTURfUkVHCTB4NUMKICNkZWZpbmUgT01BUDRfVkREX0NPUkVfU1JfVk9MVF9SRUcJMHg2MQorI2RlZmluZSBPTUFQNF9WRERfQ09SRV9TUl9DTURfUkVHCTB4NjIKIAogI2RlZmluZSBPTUFQNF9WUF9DT05GSUdfRVJST1JPRkZTRVQJMHgwMAogI2RlZmluZSBPTUFQNF9WUF9WU1RFUE1JTl9WU1RFUE1JTgkweDAxCkBAIC05NSw2ICs5OCw4IEBACiAJCWlzX29mZnNldF92YWxpZCA9IHRydWU7CiAJfQogCisJaWYgKCF2c2VsKQorCQlyZXR1cm4gMDsKIAkvKgogCSAqIFRoZXJlIGlzIG5vIHNwZWNpZmljIGZvcm11bGEgZm9yIHZvbHRhZ2UgdG8gdnNlbAogCSAqIGNvbnZlcnNpb24gYWJvdmUgMS4zVi4gVGhlcmUgYXJlIHNwZWNpYWwgaGFyZGNvZGVkCkBAIC0xMDYsOSArMTExLDkgQEAKIAkJcmV0dXJuIDEzNTAwMDA7CiAKIAlpZiAoc21wc19vZmZzZXQgJiAweDgpCi0JCXJldHVybiAoKCgodnNlbCAtIDEpICogMTI1KSArIDcwMDApKSAqIDEwMDsKKwkJcmV0dXJuICgoKCh2c2VsIC0gMSkgKiAxMjY2KSArIDcwOTAwKSkgKiAxMDsKIAllbHNlCi0JCXJldHVybiAoKCgodnNlbCAtIDEpICogMTI1KSArIDYwMDApKSAqIDEwMDsKKwkJcmV0dXJuICgoKCh2c2VsIC0gMSkgKiAxMjY2KSArIDYwNzcwKSkgKiAxMDsKIH0KIAogc3RhdGljIHU4IHR3bDYwMzBfdXZfdG9fdnNlbCh1bnNpZ25lZCBsb25nIHV2KQpAQCAtMTI3LDYgKzEzMiw4IEBACiAJCWlzX29mZnNldF92YWxpZCA9IHRydWU7CiAJfQogCisJaWYgKCF1dikKKwkJcmV0dXJuIDB4MDA7CiAJLyoKIAkgKiBUaGVyZSBpcyBubyBzcGVjaWZpYyBmb3JtdWxhIGZvciB2b2x0YWdlIHRvIHZzZWwKIAkgKiBjb252ZXJzaW9uIGFib3ZlIDEuM1YuIFRoZXJlIGFyZSBzcGVjaWFsIGhhcmRjb2RlZApAQCAtMTM0LDE2ICsxNDEsMjEgQEAKIAkgKiBoYXJkY29kaW5nIG9ubHkgZm9yIDEuMzUgViB3aGljaCBpcyB1c2VkIGZvciAxR0ggT1BQIGZvcgogCSAqIE9NQVA0NDMwLgogCSAqLwotCWlmICh1diA9PSAxMzUwMDAwKQorCWlmICh1diA+IHR3bDYwMzBfdnNlbF90b191digweDM5KSkgeworCQlpZiAodXYgPT0gMTM1MDAwMCkKKwkJCXJldHVybiAweDNBOworCQlwcl9lcnIoIiVzOk9VVCBPRiBSQU5HRSEgbm9uIG1hcHBlZCB2c2VsIGZvciAlbGQgVnMgbWF4ICVsZFxuIiwKKwkJCV9fZnVuY19fLCB1diwgdHdsNjAzMF92c2VsX3RvX3V2KDB4MzkpKTsKIAkJcmV0dXJuIDB4M0E7CisJfQogCiAJaWYgKHNtcHNfb2Zmc2V0ICYgMHg4KQotCQlyZXR1cm4gRElWX1JPVU5EX1VQKHV2IC0gNzAwMDAwLCAxMjUwMCkgKyAxOworCQlyZXR1cm4gRElWX1JPVU5EX1VQKHV2IC0gNzA5MDAwLCAxMjY2MCkgKyAxOwogCWVsc2UKLQkJcmV0dXJuIERJVl9ST1VORF9VUCh1diAtIDYwMDAwMCwgMTI1MDApICsgMTsKKwkJcmV0dXJuIERJVl9ST1VORF9VUCh1diAtIDYwNzcwMCwgMTI2NjApICsgMTsKIH0KIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIG9tYXAzX21wdV92b2x0X2luZm8gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfdm9sdGRtX3BtaWMgb21hcDNfbXB1X3BtaWMgPSB7CiAJLnNsZXdfcmF0ZQkJPSA0MDAwLAogCS5zdGVwX3NpemUJCT0gMTI1MDAsCiAJLm9uX3ZvbHQJCT0gMTIwMDAwMCwKQEAgLTE1OCwxMiArMTcwLDEzIEBACiAJLnZwX3ZkZG1heAkJPSBPTUFQMzQzMF9WUDFfVkxJTUlUVE9fVkRETUFYLAogCS52cF90aW1lb3V0X3VzCQk9IE9NQVAzX1ZQX1ZMSU1JVFRPX1RJTUVPVVRfVVMsCiAJLmkyY19zbGF2ZV9hZGRyCQk9IE9NQVAzX1NSSTJDX1NMQVZFX0FERFIsCi0JLnBtaWNfcmVnCQk9IE9NQVAzX1ZERF9NUFVfU1JfQ09OVFJPTF9SRUcsCisJLnZvbHRfcmVnX2FkZHIJCT0gT01BUDNfVkREX01QVV9TUl9DT05UUk9MX1JFRywKKwkuaTJjX2hpZ2hfc3BlZWQJCT0gdHJ1ZSwKIAkudnNlbF90b191dgkJPSB0d2w0MDMwX3ZzZWxfdG9fdXYsCiAJLnV2X3RvX3ZzZWwJCT0gdHdsNDAzMF91dl90b192c2VsLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIG9tYXAzX2NvcmVfdm9sdF9pbmZvID0geworc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIG9tYXAzX2NvcmVfcG1pYyA9IHsKIAkuc2xld19yYXRlCQk9IDQwMDAsCiAJLnN0ZXBfc2l6ZQkJPSAxMjUwMCwKIAkub25fdm9sdCAgICAgICAgICAgICAgICA9IDEyMDAwMDAsCkBAIC0xNzgsMTggKzE5MSwxOSBAQAogCS52cF92ZGRtYXgJCT0gT01BUDM0MzBfVlAyX1ZMSU1JVFRPX1ZERE1BWCwKIAkudnBfdGltZW91dF91cwkJPSBPTUFQM19WUF9WTElNSVRUT19USU1FT1VUX1VTLAogCS5pMmNfc2xhdmVfYWRkcgkJPSBPTUFQM19TUkkyQ19TTEFWRV9BRERSLAotCS5wbWljX3JlZwkJPSBPTUFQM19WRERfQ09SRV9TUl9DT05UUk9MX1JFRywKKwkudm9sdF9yZWdfYWRkcgkJPSBPTUFQM19WRERfQ09SRV9TUl9DT05UUk9MX1JFRywKKwkuaTJjX2hpZ2hfc3BlZWQJCT0gdHJ1ZSwKIAkudnNlbF90b191dgkJPSB0d2w0MDMwX3ZzZWxfdG9fdXYsCiAJLnV2X3RvX3ZzZWwJCT0gdHdsNDAzMF91dl90b192c2VsLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIG9tYXA0X21wdV92b2x0X2luZm8gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfdm9sdGRtX3BtaWMgb21hcDRfbXB1X3BtaWMgPSB7CiAJLnNsZXdfcmF0ZQkJPSA0MDAwLAotCS5zdGVwX3NpemUJCT0gMTI1MDAsCi0JLm9uX3ZvbHQJCT0gMTM1MDAwMCwKLQkub25scF92b2x0CQk9IDEzNTAwMDAsCi0JLnJldF92b2x0CQk9IDgzNzUwMCwKLQkub2ZmX3ZvbHQJCT0gNjAwMDAwLAorCS5zdGVwX3NpemUJCT0gMTI2NjAsCisJLm9uX3ZvbHQJCT0gMTM3NTAwMCwKKwkub25scF92b2x0CQk9IDEzNzUwMDAsCisJLnJldF92b2x0CQk9IDgzMDAwMCwKKwkub2ZmX3ZvbHQJCT0gMCwKIAkudm9sdF9zZXR1cF90aW1lCT0gMCwKIAkudnBfZXJyb3JvZmZzZXQJCT0gT01BUDRfVlBfQ09ORklHX0VSUk9ST0ZGU0VULAogCS52cF92c3RlcG1pbgkJPSBPTUFQNF9WUF9WU1RFUE1JTl9WU1RFUE1JTiwKQEAgLTE5OCwxOCArMjEyLDIwIEBACiAJLnZwX3ZkZG1heAkJPSBPTUFQNF9WUF9NUFVfVkxJTUlUVE9fVkRETUFYLAogCS52cF90aW1lb3V0X3VzCQk9IE9NQVA0X1ZQX1ZMSU1JVFRPX1RJTUVPVVRfVVMsCiAJLmkyY19zbGF2ZV9hZGRyCQk9IE9NQVA0X1NSSTJDX1NMQVZFX0FERFIsCi0JLnBtaWNfcmVnCQk9IE9NQVA0X1ZERF9NUFVfU1JfVk9MVF9SRUcsCisJLnZvbHRfcmVnX2FkZHIJCT0gT01BUDRfVkREX01QVV9TUl9WT0xUX1JFRywKKwkuY21kX3JlZ19hZGRyCQk9IE9NQVA0X1ZERF9NUFVfU1JfQ01EX1JFRywKKwkuaTJjX2hpZ2hfc3BlZWQJCT0gdHJ1ZSwKIAkudnNlbF90b191dgkJPSB0d2w2MDMwX3ZzZWxfdG9fdXYsCiAJLnV2X3RvX3ZzZWwJCT0gdHdsNjAzMF91dl90b192c2VsLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIG9tYXA0X2l2YV92b2x0X2luZm8gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfdm9sdGRtX3BtaWMgb21hcDRfaXZhX3BtaWMgPSB7CiAJLnNsZXdfcmF0ZQkJPSA0MDAwLAotCS5zdGVwX3NpemUJCT0gMTI1MDAsCi0JLm9uX3ZvbHQJCT0gMTEwMDAwMCwKLQkub25scF92b2x0CQk9IDExMDAwMDAsCi0JLnJldF92b2x0CQk9IDgzNzUwMCwKLQkub2ZmX3ZvbHQJCT0gNjAwMDAwLAorCS5zdGVwX3NpemUJCT0gMTI2NjAsCisJLm9uX3ZvbHQJCT0gMTE4ODAwMCwKKwkub25scF92b2x0CQk9IDExODgwMDAsCisJLnJldF92b2x0CQk9IDgzMDAwMCwKKwkub2ZmX3ZvbHQJCT0gMCwKIAkudm9sdF9zZXR1cF90aW1lCT0gMCwKIAkudnBfZXJyb3JvZmZzZXQJCT0gT01BUDRfVlBfQ09ORklHX0VSUk9ST0ZGU0VULAogCS52cF92c3RlcG1pbgkJPSBPTUFQNF9WUF9WU1RFUE1JTl9WU1RFUE1JTiwKQEAgLTIxOCwxOCArMjM0LDIwIEBACiAJLnZwX3ZkZG1heAkJPSBPTUFQNF9WUF9JVkFfVkxJTUlUVE9fVkRETUFYLAogCS52cF90aW1lb3V0X3VzCQk9IE9NQVA0X1ZQX1ZMSU1JVFRPX1RJTUVPVVRfVVMsCiAJLmkyY19zbGF2ZV9hZGRyCQk9IE9NQVA0X1NSSTJDX1NMQVZFX0FERFIsCi0JLnBtaWNfcmVnCQk9IE9NQVA0X1ZERF9JVkFfU1JfVk9MVF9SRUcsCisJLnZvbHRfcmVnX2FkZHIJCT0gT01BUDRfVkREX0lWQV9TUl9WT0xUX1JFRywKKwkuY21kX3JlZ19hZGRyCQk9IE9NQVA0X1ZERF9JVkFfU1JfQ01EX1JFRywKKwkuaTJjX2hpZ2hfc3BlZWQJCT0gdHJ1ZSwKIAkudnNlbF90b191dgkJPSB0d2w2MDMwX3ZzZWxfdG9fdXYsCiAJLnV2X3RvX3ZzZWwJCT0gdHdsNjAzMF91dl90b192c2VsLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIG9tYXA0X2NvcmVfdm9sdF9pbmZvID0geworc3RhdGljIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIG9tYXA0X2NvcmVfcG1pYyA9IHsKIAkuc2xld19yYXRlCQk9IDQwMDAsCi0JLnN0ZXBfc2l6ZQkJPSAxMjUwMCwKLQkub25fdm9sdAkJPSAxMTAwMDAwLAotCS5vbmxwX3ZvbHQJCT0gMTEwMDAwMCwKLQkucmV0X3ZvbHQJCT0gODM3NTAwLAotCS5vZmZfdm9sdAkJPSA2MDAwMDAsCisJLnN0ZXBfc2l6ZQkJPSAxMjY2MCwKKwkub25fdm9sdAkJPSAxMjAwMDAwLAorCS5vbmxwX3ZvbHQJCT0gMTIwMDAwMCwKKwkucmV0X3ZvbHQJCT0gODMwMDAwLAorCS5vZmZfdm9sdAkJPSAwLAogCS52b2x0X3NldHVwX3RpbWUJPSAwLAogCS52cF9lcnJvcm9mZnNldAkJPSBPTUFQNF9WUF9DT05GSUdfRVJST1JPRkZTRVQsCiAJLnZwX3ZzdGVwbWluCQk9IE9NQVA0X1ZQX1ZTVEVQTUlOX1ZTVEVQTUlOLApAQCAtMjM4LDcgKzI1Niw4IEBACiAJLnZwX3ZkZG1heAkJPSBPTUFQNF9WUF9DT1JFX1ZMSU1JVFRPX1ZERE1BWCwKIAkudnBfdGltZW91dF91cwkJPSBPTUFQNF9WUF9WTElNSVRUT19USU1FT1VUX1VTLAogCS5pMmNfc2xhdmVfYWRkcgkJPSBPTUFQNF9TUkkyQ19TTEFWRV9BRERSLAotCS5wbWljX3JlZwkJPSBPTUFQNF9WRERfQ09SRV9TUl9WT0xUX1JFRywKKwkudm9sdF9yZWdfYWRkcgkJPSBPTUFQNF9WRERfQ09SRV9TUl9WT0xUX1JFRywKKwkuY21kX3JlZ19hZGRyCQk9IE9NQVA0X1ZERF9DT1JFX1NSX0NNRF9SRUcsCiAJLnZzZWxfdG9fdXYJCT0gdHdsNjAzMF92c2VsX3RvX3V2LAogCS51dl90b192c2VsCQk9IHR3bDYwMzBfdXZfdG9fdnNlbCwKIH07CkBAIC0yNTAsMTQgKzI2OSwxNCBAQAogCWlmICghY3B1X2lzX29tYXA0NHh4KCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jdm9sdGRtID0gb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoIm1wdSIpOwotCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXA0X21wdV92b2x0X2luZm8pOworCXZvbHRkbSA9IHZvbHRkbV9sb29rdXAoIm1wdSIpOworCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXA0X21wdV9wbWljKTsKIAotCXZvbHRkbSA9IG9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKCJpdmEiKTsKLQlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwNF9pdmFfdm9sdF9pbmZvKTsKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKCJpdmEiKTsKKwlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwNF9pdmFfcG1pYyk7CiAKLQl2b2x0ZG0gPSBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cCgiY29yZSIpOwotCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXA0X2NvcmVfdm9sdF9pbmZvKTsKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKCJjb3JlIik7CisJb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWModm9sdGRtLCAmb21hcDRfY29yZV9wbWljKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjcwLDEwICsyODksMTAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoY3B1X2lzX29tYXAzNjMwKCkpIHsKLQkJb21hcDNfbXB1X3ZvbHRfaW5mby52cF92ZGRtaW4gPSBPTUFQMzYzMF9WUDFfVkxJTUlUVE9fVkRETUlOOwotCQlvbWFwM19tcHVfdm9sdF9pbmZvLnZwX3ZkZG1heCA9IE9NQVAzNjMwX1ZQMV9WTElNSVRUT19WRERNQVg7Ci0JCW9tYXAzX2NvcmVfdm9sdF9pbmZvLnZwX3ZkZG1pbiA9IE9NQVAzNjMwX1ZQMl9WTElNSVRUT19WRERNSU47Ci0JCW9tYXAzX2NvcmVfdm9sdF9pbmZvLnZwX3ZkZG1heCA9IE9NQVAzNjMwX1ZQMl9WTElNSVRUT19WRERNQVg7CisJCW9tYXAzX21wdV9wbWljLnZwX3ZkZG1pbiA9IE9NQVAzNjMwX1ZQMV9WTElNSVRUT19WRERNSU47CisJCW9tYXAzX21wdV9wbWljLnZwX3ZkZG1heCA9IE9NQVAzNjMwX1ZQMV9WTElNSVRUT19WRERNQVg7CisJCW9tYXAzX2NvcmVfcG1pYy52cF92ZGRtaW4gPSBPTUFQMzYzMF9WUDJfVkxJTUlUVE9fVkRETUlOOworCQlvbWFwM19jb3JlX3BtaWMudnBfdmRkbWF4ID0gT01BUDM2MzBfVlAyX1ZMSU1JVFRPX1ZERE1BWDsKIAl9CiAKIAkvKgpAQCAtMjg4LDExICszMDcsMTEgQEAKIAlpZiAoIXR3bF9zcl9lbmFibGVfYXV0b2luaXQpCiAJCW9tYXAzX3R3bF9zZXRfc3JfYml0KHRydWUpOwogCi0Jdm9sdGRtID0gb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoIm1wdSIpOwotCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXAzX21wdV92b2x0X2luZm8pOworCXZvbHRkbSA9IHZvbHRkbV9sb29rdXAoIm1wdV9pdmEiKTsKKwlvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyh2b2x0ZG0sICZvbWFwM19tcHVfcG1pYyk7CiAKLQl2b2x0ZG0gPSBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cCgiY29yZSIpOwotCW9tYXBfdm9sdGFnZV9yZWdpc3Rlcl9wbWljKHZvbHRkbSwgJm9tYXAzX2NvcmVfdm9sdF9pbmZvKTsKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKCJjb3JlIik7CisJb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWModm9sdGRtLCAmb21hcDNfY29yZV9wbWljKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vcHAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb3BwLmMKaW5kZXggYWI4YjM1Yi4uOTI2MmE2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vcHAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29wcC5jCkBAIC02OSw3ICs2OSw3IEBACiAJCQkJb3BwX2RlZi0+aHdtb2RfbmFtZSwgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlkZXYgPSAmb2gtPm9kLT5wZGV2LmRldjsKKwkJZGV2ID0gJm9oLT5vZC0+cGRldi0+ZGV2OwogCiAJCXIgPSBvcHBfYWRkKGRldiwgb3BwX2RlZi0+ZnJlcSwgb3BwX2RlZi0+dV92b2x0KTsKIAkJaWYgKHIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYwppbmRleCA0NzJiZjIyLi4xZTc5YmRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHBsYXQvb21hcC1wbS5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KQEAgLTI2LDU0ICsyNywyMSBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgKnBtX2xhdHM7CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICptcHVfZGV2Owotc3RhdGljIHN0cnVjdCBkZXZpY2UgKml2YV9kZXY7Ci1zdGF0aWMgc3RydWN0IGRldmljZSAqbDNfZGV2Owotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmRzcF9kZXY7Ci0KLXN0cnVjdCBkZXZpY2UgKm9tYXAyX2dldF9tcHVzc19kZXZpY2Uodm9pZCkKLXsKLQlXQVJOX09OX09OQ0UoIW1wdV9kZXYpOwotCXJldHVybiBtcHVfZGV2OwotfQotCi1zdHJ1Y3QgZGV2aWNlICpvbWFwMl9nZXRfaXZhX2RldmljZSh2b2lkKQotewotCVdBUk5fT05fT05DRSghaXZhX2Rldik7Ci0JcmV0dXJuIGl2YV9kZXY7Ci19Ci0KLXN0cnVjdCBkZXZpY2UgKm9tYXAyX2dldF9sM19kZXZpY2Uodm9pZCkKLXsKLQlXQVJOX09OX09OQ0UoIWwzX2Rldik7Ci0JcmV0dXJuIGwzX2RldjsKLX0KLQotc3RydWN0IGRldmljZSAqb21hcDRfZ2V0X2RzcF9kZXZpY2Uodm9pZCkKLXsKLQlXQVJOX09OX09OQ0UoIWRzcF9kZXYpOwotCXJldHVybiBkc3BfZGV2OwotfQotRVhQT1JUX1NZTUJPTChvbWFwNF9nZXRfZHNwX2RldmljZSk7Ci0KLS8qIHN0YXRpYyBpbnQgX2luaXRfb21hcF9kZXZpY2Uoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1c2VyKSAqLwotc3RhdGljIGludCBfaW5pdF9vbWFwX2RldmljZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICoqbmV3X2RldikKK3N0YXRpYyBpbnQgX2luaXRfb21hcF9kZXZpY2UoY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAJb2ggPSBvbWFwX2h3bW9kX2xvb2t1cChuYW1lKTsKIAlpZiAoV0FSTighb2gsICIlczogY291bGQgbm90IGZpbmQgb21hcF9od21vZCBmb3IgJXNcbiIsCiAJCSBfX2Z1bmNfXywgbmFtZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChvaC0+bmFtZSwgMCwgb2gsIE5VTEwsIDAsIHBtX2xhdHMsIDAsIGZhbHNlKTsKLQlpZiAoV0FSTihJU19FUlIob2QpLCAiJXM6IGNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG9oLT5uYW1lLCAwLCBvaCwgTlVMTCwgMCwgcG1fbGF0cywgMCwgZmFsc2UpOworCWlmIChXQVJOKElTX0VSUihwZGV2KSwgIiVzOiBjb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLAogCQkgX19mdW5jX18sIG5hbWUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCSpuZXdfZGV2ID0gJm9kLT5wZGV2LmRldjsKLQogCXJldHVybiAwOwogfQogCkBAIC04MiwxNiArNTAsMTYgQEAKICAqLwogc3RhdGljIHZvaWQgb21hcDJfaW5pdF9wcm9jZXNzb3JfZGV2aWNlcyh2b2lkKQogewotCV9pbml0X29tYXBfZGV2aWNlKCJtcHUiLCAmbXB1X2Rldik7CisJX2luaXRfb21hcF9kZXZpY2UoIm1wdSIpOwogCWlmIChvbWFwM19oYXNfaXZhKCkpCi0JCV9pbml0X29tYXBfZGV2aWNlKCJpdmEiLCAmaXZhX2Rldik7CisJCV9pbml0X29tYXBfZGV2aWNlKCJpdmEiKTsKIAogCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQlfaW5pdF9vbWFwX2RldmljZSgibDNfbWFpbl8xIiwgJmwzX2Rldik7Ci0JCV9pbml0X29tYXBfZGV2aWNlKCJkc3AiLCAmZHNwX2Rldik7Ci0JCV9pbml0X29tYXBfZGV2aWNlKCJpdmEiLCAmaXZhX2Rldik7CisJCV9pbml0X29tYXBfZGV2aWNlKCJsM19tYWluXzEiKTsKKwkJX2luaXRfb21hcF9kZXZpY2UoImRzcCIpOworCQlfaW5pdF9vbWFwX2RldmljZSgiaXZhIik7CiAJfSBlbHNlIHsKLQkJX2luaXRfb21hcF9kZXZpY2UoImwzX21haW4iLCAmbDNfZGV2KTsKKwkJX2luaXRfb21hcF9kZXZpY2UoImwzX21haW4iKTsKIAl9CiB9CiAKQEAgLTEzNiw4ICsxMDQsOCBAQAogCiAJcmV0ID0gcHdyZG1fc2V0X25leHRfcHdyc3QocHdyZG0sIHN0YXRlKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHNldCBzdGF0ZSBvZiBwb3dlcmRvbWFpbjogJXNcbiIsCi0JCSAgICAgICBwd3JkbS0+bmFtZSk7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBzZXQgc3RhdGUgb2YgcG93ZXJkb21haW46ICVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIHB3cmRtLT5uYW1lKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0xNjEsMzcgKzEyOSw0NCBAQAogfQogCiAvKgotICogVGhpcyBBUEkgaXMgdG8gYmUgY2FsbGVkIGR1cmluZyBpbml0IHRvIHB1dCB0aGUgdmFyaW91cyB2b2x0YWdlCisgKiBUaGlzIEFQSSBpcyB0byBiZSBjYWxsZWQgZHVyaW5nIGluaXQgdG8gc2V0IHRoZSB2YXJpb3VzIHZvbHRhZ2UKICAqIGRvbWFpbnMgdG8gdGhlIHZvbHRhZ2UgYXMgcGVyIHRoZSBvcHAgdGFibGUuIFR5cGljYWxseSB3ZSBib290IHVwCiAgKiBhdCB0aGUgbm9taW5hbCB2b2x0YWdlLiBTbyB0aGlzIGZ1bmN0aW9uIGZpbmRzIG91dCB0aGUgcmF0ZSBvZgogICogdGhlIGNsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdm9sdGFnZSBkb21haW4sIGZpbmRzIG91dCB0aGUgY29ycmVjdAotICogb3BwIGVudHJ5IGFuZCBwdXRzIHRoZSB2b2x0YWdlIGRvbWFpbiB0byB0aGUgdm9sdGFnZSBzcGVjaWZpZXMKKyAqIG9wcCBlbnRyeSBhbmQgc2V0cyB0aGUgdm9sdGFnZSBkb21haW4gdG8gdGhlIHZvbHRhZ2Ugc3BlY2lmaWVkCiAgKiBpbiB0aGUgb3BwIGVudHJ5CiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoY2hhciAqdmRkX25hbWUsIGNoYXIgKmNsa19uYW1lLAotCQkJCQkJc3RydWN0IGRldmljZSAqZGV2KQorCQkJCQkgY29uc3QgY2hhciAqb2hfbmFtZSkKIHsKIAlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtOwogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3Qgb3BwICpvcHA7CiAJdW5zaWduZWQgbG9uZyBmcmVxLCBib290dXBfdm9sdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlpZiAoIXZkZF9uYW1lIHx8ICFjbGtfbmFtZSB8fCAhZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcGFyYW1ldGVycyFcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXZkZF9uYW1lIHx8ICFjbGtfbmFtZSB8fCAhb2hfbmFtZSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIAotCXZvbHRkbSA9IG9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKHZkZF9uYW1lKTsKKwlkZXYgPSBvbWFwX2RldmljZV9nZXRfYnlfaHdtb2RfbmFtZShvaF9uYW1lKTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCBkZXYgcG9pbnRlciBmb3IgaHdtb2QgJXNcbiIsCisJCQlfX2Z1bmNfXywgb2hfbmFtZSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKHZkZF9uYW1lKTsKIAlpZiAoSVNfRVJSKHZvbHRkbSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCB2ZGQgcG9pbnRlciBmb3IgdmRkXyVzXG4iLAorCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IHZkZCBwb2ludGVyIGZvciB2ZGRfJXNcbiIsCiAJCQlfX2Z1bmNfXywgdmRkX25hbWUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJY2xrID0gIGNsa19nZXQoTlVMTCwgY2xrX25hbWUpOwogCWlmIChJU19FUlIoY2xrKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IGNsayAlc1xuIiwKLQkJCV9fZnVuY19fLCBjbGtfbmFtZSk7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBnZXQgY2xrICVzXG4iLCBfX2Z1bmNfXywgY2xrX25hbWUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0yMDAsMjQgKzE3NSwyMyBAQAogCiAJb3BwID0gb3BwX2ZpbmRfZnJlcV9jZWlsKGRldiwgJmZyZXEpOwogCWlmIChJU19FUlIob3BwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZmluZCBib290IHVwIE9QUCBmb3IgdmRkXyVzXG4iLAorCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZmluZCBib290IHVwIE9QUCBmb3IgdmRkXyVzXG4iLAogCQkJX19mdW5jX18sIHZkZF9uYW1lKTsKIAkJZ290byBleGl0OwogCX0KIAogCWJvb3R1cF92b2x0ID0gb3BwX2dldF92b2x0YWdlKG9wcCk7CiAJaWYgKCFib290dXBfdm9sdCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZmluZCB2b2x0YWdlIGNvcnJlc3BvbmRpbmciCisJCXByX2VycigiJXM6IHVuYWJsZSB0byBmaW5kIHZvbHRhZ2UgY29ycmVzcG9uZGluZyAiCiAJCQkidG8gdGhlIGJvb3R1cCBPUFAgZm9yIHZkZF8lc1xuIiwgX19mdW5jX18sIHZkZF9uYW1lKTsKIAkJZ290byBleGl0OwogCX0KIAotCW9tYXBfdm9sdGFnZV9zY2FsZV92ZGQodm9sdGRtLCBib290dXBfdm9sdCk7CisJdm9sdGRtX3NjYWxlKHZvbHRkbSwgYm9vdHVwX3ZvbHQpOwogCXJldHVybiAwOwogCiBleGl0OgotCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBwdXQgdmRkXyVzIHRvIGl0cyBpbml0IHZvbHRhZ2VcblxuIiwKLQkJX19mdW5jX18sIHZkZF9uYW1lKTsKKwlwcl9lcnIoIiVzOiB1bmFibGUgdG8gc2V0IHZkZF8lc1xuIiwgX19mdW5jX18sIHZkZF9uYW1lKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMjI2LDggKzIwMCw4IEBACiAJaWYgKCFjcHVfaXNfb21hcDM0eHgoKSkKIAkJcmV0dXJuOwogCi0Jb21hcDJfc2V0X2luaXRfdm9sdGFnZSgibXB1IiwgImRwbGwxX2NrIiwgbXB1X2Rldik7Ci0Jb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiY29yZSIsICJsM19pY2siLCBsM19kZXYpOworCW9tYXAyX3NldF9pbml0X3ZvbHRhZ2UoIm1wdV9pdmEiLCAiZHBsbDFfY2siLCAibXB1Iik7CisJb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiY29yZSIsICJsM19pY2siLCAibDNfbWFpbiIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcDRfaW5pdF92b2x0YWdlcyh2b2lkKQpAQCAtMjM1LDE0ICsyMDksMTUgQEAKIAlpZiAoIWNwdV9pc19vbWFwNDR4eCgpKQogCQlyZXR1cm47CiAKLQlvbWFwMl9zZXRfaW5pdF92b2x0YWdlKCJtcHUiLCAiZHBsbF9tcHVfY2siLCBtcHVfZGV2KTsKLQlvbWFwMl9zZXRfaW5pdF92b2x0YWdlKCJjb3JlIiwgImwzX2Rpdl9jayIsIGwzX2Rldik7Ci0Jb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiaXZhIiwgImRwbGxfaXZhX201eDJfY2siLCBpdmFfZGV2KTsKKwlvbWFwMl9zZXRfaW5pdF92b2x0YWdlKCJtcHUiLCAiZHBsbF9tcHVfY2siLCAibXB1Iik7CisJb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiY29yZSIsICJsM19kaXZfY2siLCAibDNfbWFpbl8xIik7CisJb21hcDJfc2V0X2luaXRfdm9sdGFnZSgiaXZhIiwgImRwbGxfaXZhX201eDJfY2siLCAiaXZhIik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG9tYXAyX2NvbW1vbl9wbV9pbml0KHZvaWQpCiB7Ci0Jb21hcDJfaW5pdF9wcm9jZXNzb3JfZGV2aWNlcygpOworCWlmICghb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQoKSkKKwkJb21hcDJfaW5pdF9wcm9jZXNzb3JfZGV2aWNlcygpOwogCW9tYXBfcG1faWZfaW5pdCgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMjR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYwppbmRleCBiZjA4OWU3Li5jZjBjMjE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMjR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0yNHh4LmMKQEAgLTUzLDggKzUzLDYgQEAKICNpbmNsdWRlICJwb3dlcmRvbWFpbi5oIgogI2luY2x1ZGUgImNsb2NrZG9tYWluLmgiCiAKLXN0YXRpYyBpbnQgb21hcDJfcG1fZGVidWc7Ci0KICNpZmRlZiBDT05GSUdfU1VTUEVORAogc3RhdGljIHN1c3BlbmRfc3RhdGVfdCBzdXNwZW5kX3N0YXRlID0gUE1fU1VTUEVORF9PTjsKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19zdXNwZW5kaW5nKHZvaWQpCkBAIC05Niw3ICs5NCw2IEBACiBzdGF0aWMgdm9pZCBvbWFwMl9lbnRlcl9mdWxsX3JldGVudGlvbih2b2lkKQogewogCXUzMiBsOwotCXN0cnVjdCB0aW1lc3BlYyB0c19wcmVpZGxlLCB0c19wb3N0aWRsZSwgdHNfaWRsZTsKIAogCS8qIFRoZXJlIGlzIDEgcmVmZXJlbmNlIGhvbGQgZm9yIGFsbCBjaGlsZHJlbiBvZiB0aGUgb3NjaWxsYXRvcgogCSAqIGNsb2NrLCB0aGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGl0LiBJZiBubyBvbmUgZWxzZSB1c2VzIHRoZQpAQCAtMTI0LDEwICsxMjEsNiBAQAogCiAJb21hcDJfZ3Bpb19wcmVwYXJlX2Zvcl9pZGxlKDApOwogCi0JaWYgKG9tYXAyX3BtX2RlYnVnKSB7Ci0JCWdldG5zdGltZW9mZGF5KCZ0c19wcmVpZGxlKTsKLQl9Ci0KIAkvKiBPbmUgbGFzdCBjaGVjayBmb3IgcGVuZGluZyBJUlFzIHRvIGF2b2lkIGV4dHJhIGxhdGVuY3kgZHVlCiAJICogdG8gc2xlZXBpbmcgdW5uZWNlc3NhcmlseS4gKi8KIAlpZiAob21hcF9pcnFfcGVuZGluZygpKQpAQCAtMTU1LDEzICsxNDgsNiBAQAogCQljb25zb2xlX3VubG9jaygpOwogCiBub19zbGVlcDoKLQlpZiAob21hcDJfcG1fZGVidWcpIHsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKLQotCQlnZXRuc3RpbWVvZmRheSgmdHNfcG9zdGlkbGUpOwotCQl0c19pZGxlID0gdGltZXNwZWNfc3ViKHRzX3Bvc3RpZGxlLCB0c19wcmVpZGxlKTsKLQkJdG1wID0gdGltZXNwZWNfdG9fbnMoJnRzX2lkbGUpICogTlNFQ19QRVJfVVNFQzsKLQl9CiAJb21hcDJfZ3Bpb19yZXN1bWVfYWZ0ZXJfaWRsZSgpOwogCiAJY2xrX2VuYWJsZShvc2NfY2spOwpAQCAtMjE5LDcgKzIwNSw2IEBACiBzdGF0aWMgdm9pZCBvbWFwMl9lbnRlcl9tcHVfcmV0ZW50aW9uKHZvaWQpCiB7CiAJaW50IG9ubHlfaWRsZSA9IDA7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzX3ByZWlkbGUsIHRzX3Bvc3RpZGxlLCB0c19pZGxlOwogCiAJLyogUHV0dGluZyBNUFUgaW50byB0aGUgV0ZJIHN0YXRlIHdoaWxlIGEgdHJhbnNmZXIgaXMgYWN0aXZlCiAJICogc2VlbXMgdG8gY2F1c2UgdGhlIEkyQyBibG9jayB0byB0aW1lb3V0LiBXaHk/IEdvb2QgcXVlc3Rpb24uICovCkBAIC0yNDYsMTkgKzIzMSw3IEBACiAJCW9ubHlfaWRsZSA9IDE7CiAJfQogCi0JaWYgKG9tYXAyX3BtX2RlYnVnKSB7Ci0JCWdldG5zdGltZW9mZGF5KCZ0c19wcmVpZGxlKTsKLQl9Ci0KIAlvbWFwMl9zcmFtX2lkbGUoKTsKLQotCWlmIChvbWFwMl9wbV9kZWJ1ZykgewotCQl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOwotCi0JCWdldG5zdGltZW9mZGF5KCZ0c19wb3N0aWRsZSk7Ci0JCXRzX2lkbGUgPSB0aW1lc3BlY19zdWIodHNfcG9zdGlkbGUsIHRzX3ByZWlkbGUpOwotCQl0bXAgPSB0aW1lc3BlY190b19ucygmdHNfaWRsZSkgKiBOU0VDX1BFUl9VU0VDOwotCX0KIH0KIAogc3RhdGljIGludCBvbWFwMl9jYW5fc2xlZXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jCmluZGV4IDcyNTVkOWIuLmVmYTY2NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIHN1c3BlbmRfc3RhdGVfdCBzdXNwZW5kX3N0YXRlID0gUE1fU1VTUEVORF9PTjsKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19zdXNwZW5kaW5nKHZvaWQpCiB7Ci0JcmV0dXJuIChzdXNwZW5kX3N0YXRlICE9IFBNX1NVU1BFTkRfT04pOworCXJldHVybiAoc3VzcGVuZF9zdGF0ZSAhPSBQTV9TVVNQRU5EX09OKSAmJiBjb25zb2xlX3N1c3BlbmRfZW5hYmxlZDsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfc3VzcGVuZGluZyh2b2lkKQpAQCAtOTksMzEgKzk5LDI3IEBACiB7CiAJaW50IHRpbWVvdXQgPSAwOwogCi0JaWYgKG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18xKSB7Ci0JCW9tYXAyX3BybV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX0NIQUlOX01BU0ssIFdLVVBfTU9ELAotCQkJCSAgICAgUE1fV0tFTik7Ci0JCS8qIERvIGEgcmVhZGJhY2sgdG8gYXNzdXJlIHdyaXRlIGhhcyBiZWVuIGRvbmUgKi8KLQkJb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhXS1VQX01PRCwgUE1fV0tFTik7CisJb21hcDJfcHJtX3NldF9tb2RfcmVnX2JpdHMoT01BUDM0MzBfRU5fSU9fQ0hBSU5fTUFTSywgV0tVUF9NT0QsCisJCQkJICAgUE1fV0tFTik7CisJLyogRG8gYSByZWFkYmFjayB0byBhc3N1cmUgd3JpdGUgaGFzIGJlZW4gZG9uZSAqLworCW9tYXAyX3BybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLRU4pOwogCi0JCXdoaWxlICghKG9tYXAyX3BybV9yZWFkX21vZF9yZWcoV0tVUF9NT0QsIFBNX1dLRU4pICYKLQkJCSBPTUFQMzQzMF9TVF9JT19DSEFJTl9NQVNLKSkgewotCQkJdGltZW91dCsrOwotCQkJaWYgKHRpbWVvdXQgPiAxMDAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJXYWtlIHVwIGRhaXN5IGNoYWluICIKLQkJCQkgICAgICAgImFjdGl2YXRpb24gZmFpbGVkLlxuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJb21hcDJfcHJtX3NldF9tb2RfcmVnX2JpdHMoT01BUDM0MzBfU1RfSU9fQ0hBSU5fTUFTSywKLQkJCQkJICAgICBXS1VQX01PRCwgUE1fV0tFTik7CisJd2hpbGUgKCEob21hcDJfcHJtX3JlYWRfbW9kX3JlZyhXS1VQX01PRCwgUE1fV0tFTikgJgorCQkgT01BUDM0MzBfU1RfSU9fQ0hBSU5fTUFTSykpIHsKKwkJdGltZW91dCsrOworCQlpZiAodGltZW91dCA+IDEwMDApIHsKKwkJCXByX2VycigiV2FrZSB1cCBkYWlzeSBjaGFpbiBhY3RpdmF0aW9uIGZhaWxlZC5cbiIpOworCQkJcmV0dXJuOwogCQl9CisJCW9tYXAyX3BybV9zZXRfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX1NUX0lPX0NIQUlOX01BU0ssCisJCQkJCSAgIFdLVVBfTU9ELCBQTV9XS0VOKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXAzX2Rpc2FibGVfaW9fY2hhaW4odm9pZCkKIHsKLQlpZiAob21hcF9yZXYoKSA+PSBPTUFQMzQzMF9SRVZfRVMzXzEpCi0JCW9tYXAyX3BybV9jbGVhcl9tb2RfcmVnX2JpdHMoT01BUDM0MzBfRU5fSU9fQ0hBSU5fTUFTSywgV0tVUF9NT0QsCi0JCQkJICAgICAgIFBNX1dLRU4pOworCW9tYXAyX3BybV9jbGVhcl9tb2RfcmVnX2JpdHMoT01BUDM0MzBfRU5fSU9fQ0hBSU5fTUFTSywgV0tVUF9NT0QsCisJCQkJICAgICBQTV9XS0VOKTsKIH0KIAogc3RhdGljIHZvaWQgb21hcDNfY29yZV9zYXZlX2NvbnRleHQodm9pZCkKQEAgLTM2Myw3ICszNTksNiBAQAogCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgbXB1IHN0YXRlIGluIHNyYW1faWRsZVxuIik7CiAJCXJldHVybjsKIAl9Ci0JcHdyZG1fcHJlX3RyYW5zaXRpb24oKTsKIAogCS8qIE5FT04gY29udHJvbCAqLwogCWlmIChwd3JkbV9yZWFkX3B3cnN0KG5lb25fcHdyZG0pID09IFBXUkRNX1BPV0VSX09OKQpAQCAtMzc2LDcgKzM3MSw4IEBACiAJICAgIChwZXJfbmV4dF9zdGF0ZSA8IFBXUkRNX1BPV0VSX09OIHx8CiAJICAgICBjb3JlX25leHRfc3RhdGUgPCBQV1JETV9QT1dFUl9PTikpIHsKIAkJb21hcDJfcHJtX3NldF9tb2RfcmVnX2JpdHMoT01BUDM0MzBfRU5fSU9fTUFTSywgV0tVUF9NT0QsIFBNX1dLRU4pOwotCQlvbWFwM19lbmFibGVfaW9fY2hhaW4oKTsKKwkJaWYgKG9tYXAzX2hhc19pb19jaGFpbl9jdHJsKCkpCisJCQlvbWFwM19lbmFibGVfaW9fY2hhaW4oKTsKIAl9CiAKIAkvKiBCbG9jayBjb25zb2xlIG91dHB1dCBpbiBjYXNlIGl0IGlzIG9uIG9uZSBvZiB0aGUgT01BUCBVQVJUcyAqLwpAQCAtMzg2LDYgKzM4Miw4IEBACiAJCQlpZiAoIWNvbnNvbGVfdHJ5bG9jaygpKQogCQkJCWdvdG8gY29uc29sZV9zdGlsbF9hY3RpdmU7CiAKKwlwd3JkbV9wcmVfdHJhbnNpdGlvbigpOworCiAJLyogUEVSICovCiAJaWYgKHBlcl9uZXh0X3N0YXRlIDwgUFdSRE1fUE9XRVJfT04pIHsKIAkJcGVyX2dvaW5nX29mZiA9IChwZXJfbmV4dF9zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpID8gMSA6IDA7CkBAIC00MDksMTMgKzQwNywxNCBAQAogCW9tYXAzX2ludGNfcHJlcGFyZV9pZGxlKCk7CiAKIAkvKgotCSogT24gRU1VL0hTIGRldmljZXMgUk9NIGNvZGUgcmVzdG9yZXMgYSBTUkRDIHZhbHVlCi0JKiBmcm9tIHNjcmF0Y2hwYWQgd2hpY2ggaGFzIGF1dG9tYXRpYyBzZWxmIHJlZnJlc2ggb24gdGltZW91dAotCSogb2YgQVVUT19DTlQgPSAxIGVuYWJsZWQuIFRoaXMgdGFrZXMgY2FyZSBvZiBlcnJhdHVtIElEIGk0NDMuCi0JKiBIZW5jZSBzdG9yZS9yZXN0b3JlIHRoZSBTRFJDX1BPV0VSIHJlZ2lzdGVyIGhlcmUuCi0JKi8KLQlpZiAob21hcF9yZXYoKSA+PSBPTUFQMzQzMF9SRVZfRVMzXzAgJiYKLQkgICAgb21hcF90eXBlKCkgIT0gT01BUDJfREVWSUNFX1RZUEVfR1AgJiYKKwkgKiBPbiBFTVUvSFMgZGV2aWNlcyBST00gY29kZSByZXN0b3JlcyBhIFNSREMgdmFsdWUKKwkgKiBmcm9tIHNjcmF0Y2hwYWQgd2hpY2ggaGFzIGF1dG9tYXRpYyBzZWxmIHJlZnJlc2ggb24gdGltZW91dAorCSAqIG9mIEFVVE9fQ05UID0gMSBlbmFibGVkLiBUaGlzIHRha2VzIGNhcmUgb2YgZXJyYXR1bSBJRCBpNDQzLgorCSAqIEhlbmNlIHN0b3JlL3Jlc3RvcmUgdGhlIFNEUkNfUE9XRVIgcmVnaXN0ZXIgaGVyZS4KKwkgKi8KKwlpZiAoY3B1X2lzX29tYXAzNDMwKCkgJiYgb21hcF9yZXYoKSA+PSBPTUFQMzQzMF9SRVZfRVMzXzAgJiYKKwkgICAgKG9tYXBfdHlwZSgpID09IE9NQVAyX0RFVklDRV9UWVBFX0VNVSB8fAorCSAgICAgb21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfU0VDKSAmJgogCSAgICBjb3JlX25leHRfc3RhdGUgPT0gUFdSRE1fUE9XRVJfT0ZGKQogCQlzZHJjX3B3ciA9IHNkcmNfcmVhZF9yZWcoU0RSQ19QT1dFUik7CiAKQEAgLTQzMiw4ICs0MzEsOSBAQAogCQlvbWFwMzR4eF9kb19zcmFtX2lkbGUoc2F2ZV9zdGF0ZSk7CiAKIAkvKiBSZXN0b3JlIG5vcm1hbCBTRFJDIFBPV0VSIHNldHRpbmdzICovCi0JaWYgKG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18wICYmCi0JICAgIG9tYXBfdHlwZSgpICE9IE9NQVAyX0RFVklDRV9UWVBFX0dQICYmCisJaWYgKGNwdV9pc19vbWFwMzQzMCgpICYmIG9tYXBfcmV2KCkgPj0gT01BUDM0MzBfUkVWX0VTM18wICYmCisJICAgIChvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9FTVUgfHwKKwkgICAgIG9tYXBfdHlwZSgpID09IE9NQVAyX0RFVklDRV9UWVBFX1NFQykgJiYKIAkgICAgY29yZV9uZXh0X3N0YXRlID09IFBXUkRNX1BPV0VSX09GRikKIAkJc2RyY193cml0ZV9yZWcoc2RyY19wd3IsIFNEUkNfUE9XRVIpOwogCkBAIC00NTUsNiArNDU1LDggQEAKIAl9CiAJb21hcDNfaW50Y19yZXN1bWVfaWRsZSgpOwogCisJcHdyZG1fcG9zdF90cmFuc2l0aW9uKCk7CisKIAkvKiBQRVIgKi8KIAlpZiAocGVyX25leHRfc3RhdGUgPCBQV1JETV9QT1dFUl9PTikgewogCQlwZXJfcHJldl9zdGF0ZSA9IHB3cmRtX3JlYWRfcHJldl9wd3JzdChwZXJfcHdyZG0pOwpAQCAtNDc1LDExICs0NzcsMTAgQEAKIAkgICAgIGNvcmVfbmV4dF9zdGF0ZSA8IFBXUkRNX1BPV0VSX09OKSkgewogCQlvbWFwMl9wcm1fY2xlYXJfbW9kX3JlZ19iaXRzKE9NQVAzNDMwX0VOX0lPX01BU0ssIFdLVVBfTU9ELAogCQkJCQkgICAgIFBNX1dLRU4pOwotCQlvbWFwM19kaXNhYmxlX2lvX2NoYWluKCk7CisJCWlmIChvbWFwM19oYXNfaW9fY2hhaW5fY3RybCgpKQorCQkJb21hcDNfZGlzYWJsZV9pb19jaGFpbigpOwogCX0KIAotCXB3cmRtX3Bvc3RfdHJhbnNpdGlvbigpOwotCiAJY2xrZG1fYWxsb3dfaWRsZShtcHVfcHdyZG0tPnB3cmRtX2Nsa2Rtc1swXSk7CiB9CiAKQEAgLTg3MCw2ICs4NzEsOSBAQAogCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKCFvbWFwM19oYXNfaW9fY2hhaW5fY3RybCgpKQorCQlwcl93YXJuaW5nKCJQTTogbm8gc29mdHdhcmUgSS9PIGNoYWluIGNvbnRyb2w7IHNvbWUgd2FrZXVwcyBtYXkgYmUgbG9zdFxuIik7CisKIAlwbV9lcnJhdGFfY29uZmlndXJlKCk7CiAKIAkvKiBYWFggcHJjbV9zZXR1cF9yZWdzIG5lZWRzIHRvIGJlIGJlZm9yZSBlbmFibGluZyBodwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4tY29tbW9uLmMKaW5kZXggMTcxZmNjZC4uZjk3YWZmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi1jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLWNvbW1vbi5jCkBAIC0xLDkgKzEsOCBAQAogLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLWNvbW1vbi5jCi0gKiAgQ29udGFpbnMgY29tbW9uIHBvd2VyZG9tYWluIGZyYW1ld29yayBmdW5jdGlvbnMKKyAqIENvbW1vbiBwb3dlcmRvbWFpbiBmcmFtZXdvcmsgZnVuY3Rpb25zCiAgKgotICogIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICogIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIERlcml2ZWQgZnJvbSBtYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMgd3JpdHRlbiBieSBQYXVsIFdhbG1zbGV5CiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5jCmluZGV4IGVmNzFmZGQuLjhhMThkMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogT01BUCBwb3dlcmRvbWFpbiBjb250cm9sCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4LCAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFdyaXR0ZW4gYnkgUGF1bCBXYWxtc2xleQpAQCAtNzcsMTMgKzc3LDExIEBACiBzdGF0aWMgaW50IF9wd3JkbV9yZWdpc3RlcihzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQogewogCWludCBpOworCXN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG07CiAKIAlpZiAoIXB3cmRtIHx8ICFwd3JkbS0+bmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIW9tYXBfY2hpcF9pcyhwd3JkbS0+b21hcF9jaGlwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAoY3B1X2lzX29tYXA0NHh4KCkgJiYKIAkgICAgcHdyZG0tPnByY21fcGFydGl0aW9uID09IE9NQVA0NDMwX0lOVkFMSURfUFJDTV9QQVJUSVRJT04pIHsKIAkJcHJfZXJyKCJwb3dlcmRvbWFpbjogJXM6IG1pc3NpbmcgT01BUDQgUFJDTSBwYXJ0aXRpb24gSURcbiIsCkBAIC05NCw2ICs5MiwxNiBAQAogCWlmIChfcHdyZG1fbG9va3VwKHB3cmRtLT5uYW1lKSkKIAkJcmV0dXJuIC1FRVhJU1Q7CiAKKwl2b2x0ZG0gPSB2b2x0ZG1fbG9va3VwKHB3cmRtLT52b2x0ZG0ubmFtZSk7CisJaWYgKCF2b2x0ZG0pIHsKKwkJcHJfZXJyKCJwb3dlcmRvbWFpbjogJXM6IHZvbHRhZ2Vkb21haW4gJXMgZG9lcyBub3QgZXhpc3RcbiIsCisJCSAgICAgICBwd3JkbS0+bmFtZSwgcHdyZG0tPnZvbHRkbS5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXB3cmRtLT52b2x0ZG0ucHRyID0gdm9sdGRtOworCUlOSVRfTElTVF9IRUFEKCZwd3JkbS0+dm9sdGRtX25vZGUpOworCXZvbHRkbV9hZGRfcHdyZG0odm9sdGRtLCBwd3JkbSk7CisKIAlsaXN0X2FkZCgmcHdyZG0tPm5vZGUsICZwd3JkbV9saXN0KTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHBvd2VyZG9tYWluJ3Mgc3RhdGUgY291bnRlciAqLwpAQCAtMTk0LDM2ICsyMDIsNzYgQEAKIC8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KIAogLyoqCi0gKiBwd3JkbV9pbml0IC0gc2V0IHVwIHRoZSBwb3dlcmRvbWFpbiBsYXllcgotICogQHB3cmRtczogYXJyYXkgb2Ygc3RydWN0IHBvd2VyZG9tYWluIHBvaW50ZXJzIHRvIHJlZ2lzdGVyCi0gKiBAY3VzdG9tX2Z1bmNzOiBmdW5jIHBvaW50ZXJzIGZvciBhcmNoIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucworICogcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MgLSByZWdpc3RlciBwb3dlcmRvbWFpbiBpbXBsZW1lbnRhdGlvbiBmbnMKKyAqIEBwbzogZnVuYyBwb2ludGVycyBmb3IgYXJjaCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMKICAqCi0gKiBMb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIHBvd2VyZG9tYWlucyBAcHdyZG1zLCByZWdpc3RlcmluZyBhbGwKLSAqIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBDUFUuICBBbHNvLCBwcm9ncmFtIGFsbAotICogcG93ZXJkb21haW4gdGFyZ2V0IHN0YXRlIGFzIE9OOyB0aGlzIGlzIHRvIHByZXZlbnQgZG9tYWlucyBmcm9tCi0gKiBoaXR0aW5nIGxvdyBwb3dlciBzdGF0ZXMgKGlmIGJvb3Rsb2FkZXIgaGFzIHRhcmdldCBzdGF0ZXMgc2V0IHRvCi0gKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBPTikgYW5kIHBvdGVudGlhbGx5IGV2ZW4gbG9zaW5nIGNvbnRleHQgd2hpbGUKLSAqIFBNIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZC4gIFRoZSBQTSBsYXRlIGluaXQgY29kZSBjYW4gdGhlbiBwcm9ncmFtCi0gKiB0aGUgZGVzaXJlZCB0YXJnZXQgc3RhdGUgZm9yIGFsbCB0aGUgcG93ZXIgZG9tYWlucy4gIE5vIHJldHVybgotICogdmFsdWUuCisgKiBSZWdpc3RlciB0aGUgbGlzdCBvZiBmdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGltcGxlbWVudCB0aGUKKyAqIHBvd2VyZG9tYWluIGZ1bmN0aW9ucyBvbiBkaWZmZXJlbnQgT01BUCBTb0NzLiAgU2hvdWxkIGJlIGNhbGxlZAorICogYmVmb3JlIGFueSBvdGhlciBwd3JkbV9yZWdpc3RlciooKSBmdW5jdGlvbi4gIFJldHVybnMgLUVJTlZBTCBpZgorICogQHBvIGlzIG51bGwsIC1FRVhJU1QgaWYgcGxhdGZvcm0gZnVuY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCisgKiByZWdpc3RlcmVkLCBvciAwIHVwb24gc3VjY2Vzcy4KICAqLwotdm9pZCBwd3JkbV9pbml0KHN0cnVjdCBwb3dlcmRvbWFpbiAqKnB3cmRtcywgc3RydWN0IHB3cmRtX29wcyAqY3VzdG9tX2Z1bmNzKQoraW50IHB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKHN0cnVjdCBwd3JkbV9vcHMgKnBvKQoreworCWlmICghcG8pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyY2hfcHdyZG0pCisJCXJldHVybiAtRUVYSVNUOworCisJYXJjaF9wd3JkbSA9IHBvOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHdyZG1fcmVnaXN0ZXJfcHdyZG1zIC0gcmVnaXN0ZXIgU29DIHBvd2VyZG9tYWlucworICogQHBzOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcmRvbWFpbiB0byByZWdpc3RlcgorICoKKyAqIFJlZ2lzdGVyIHRoZSBwb3dlcmRvbWFpbnMgYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciBPTUFQIFNvQy4gIE11c3QKKyAqIGJlIGNhbGxlZCBhZnRlciBwd3JkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygpLiAgTWF5IGJlIGNhbGxlZAorICogbXVsdGlwbGUgdGltZXMuICBSZXR1cm5zIC1FQUNDRVMgaWYgY2FsbGVkIGJlZm9yZQorICogcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoKTsgLUVJTlZBTCBpZiB0aGUgYXJndW1lbnQgQHBzIGlzCisgKiBudWxsOyBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX3JlZ2lzdGVyX3B3cmRtcyhzdHJ1Y3QgcG93ZXJkb21haW4gKipwcykKIHsKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKipwID0gTlVMTDsKKworCWlmICghYXJjaF9wd3JkbSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlpZiAoIXBzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAocCA9IHBzOyAqcDsgcCsrKQorCQlfcHdyZG1fcmVnaXN0ZXIoKnApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHdyZG1fY29tcGxldGVfaW5pdCAtIHNldCB1cCB0aGUgcG93ZXJkb21haW4gbGF5ZXIKKyAqCisgKiBEbyB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSByZWdpc3RlcmVkIHBvd2VyZG9tYWlucyBhbmQKKyAqIHBvd2VyZG9tYWluIGNvZGUuICBDdXJyZW50bHksIHRoaXMgcHJvZ3JhbXMgdGhlIG5leHQgcG93ZXIgc3RhdGUKKyAqIGZvciBlYWNoIHBvd2VyZG9tYWluIHRvIE9OLiAgVGhpcyBwcmV2ZW50cyBwb3dlcmRvbWFpbnMgZnJvbQorICogdW5leHBlY3RlZGx5IGxvc2luZyBjb250ZXh0IG9yIGVudGVyaW5nIGhpZ2ggd2FrZXVwIGxhdGVuY3kgbW9kZXMKKyAqIHdpdGggbm9uLXBvd2VyLW1hbmFnZW1lbnQtZW5hYmxlZCBrZXJuZWxzLiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAqIHB3cmRtX3JlZ2lzdGVyX3B3cmRtcygpLiAgUmV0dXJucyAtRUFDQ0VTIGlmIGNhbGxlZCBiZWZvcmUKKyAqIHB3cmRtX3JlZ2lzdGVyX3B3cmRtcygpLCBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHB3cmRtX2NvbXBsZXRlX2luaXQodm9pZCkKK3sKIAlzdHJ1Y3QgcG93ZXJkb21haW4gKnRlbXBfcDsKIAotCWlmICghY3VzdG9tX2Z1bmNzKQotCQlXQVJOKDEsICJwb3dlcmRvbWFpbjogTm8gY3VzdG9tIHB3cmRtIGZ1bmN0aW9ucyByZWdpc3RlcmVkXG4iKTsKLQllbHNlCi0JCWFyY2hfcHdyZG0gPSBjdXN0b21fZnVuY3M7Ci0KLQlpZiAocHdyZG1zKSB7Ci0JCWZvciAocCA9IHB3cmRtczsgKnA7IHArKykKLQkJCV9wd3JkbV9yZWdpc3RlcigqcCk7Ci0JfQorCWlmIChsaXN0X2VtcHR5KCZwd3JkbV9saXN0KSkKKwkJcmV0dXJuIC1FQUNDRVM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXBfcCwgJnB3cmRtX2xpc3QsIG5vZGUpCiAJCXB3cmRtX3NldF9uZXh0X3B3cnN0KHRlbXBfcCwgUFdSRE1fUE9XRVJfT04pOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzkwLDYgKzQzOCwxOCBAQAogfQogCiAvKioKKyAqIHB3cmRtX2dldF92b2x0ZG0gLSByZXR1cm4gYSBwdHIgdG8gdGhlIHZvbHRkbSB0aGF0IHRoaXMgcHdyZG0gcmVzaWRlcyBpbgorICogQHB3cmRtOiBzdHJ1Y3QgcG93ZXJkb21haW4gKgorICoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCB2b2x0YWdlb21haW4gdGhhdCB0aGUgc3BlY2lmaWVkIHBvd2VyZG9tYWluCisgKiBAcHdyZG0gZXhpc3RzIGluLgorICovCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqcHdyZG1fZ2V0X3ZvbHRkbShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKQoreworCXJldHVybiBwd3JkbS0+dm9sdGRtLnB0cjsKK30KKworLyoqCiAgKiBwd3JkbV9nZXRfbWVtX2JhbmtfY291bnQgLSBnZXQgbnVtYmVyIG9mIG1lbW9yeSBiYW5rcyBpbiB0aGlzIHBvd2VyZG9tYWluCiAgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqCiAgKgpAQCAtOTQyLDE2ICsxMDAyLDE2IEBACiAgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIHdhaXQgZm9yCiAgKgogICogQ29udGV4dCBsb3NzIGNvdW50IGlzIHRoZSBzdW0gb2YgcG93ZXJkb21haW4gb2ZmLW1vZGUgY291bnRlciwgdGhlCi0gKiBsb2dpYyBvZmYgY291bnRlciBhbmQgdGhlIHBlci1iYW5rIG1lbW9yeSBvZmYgY291bnRlci4gIFJldHVybnMgMAorICogbG9naWMgb2ZmIGNvdW50ZXIgYW5kIHRoZSBwZXItYmFuayBtZW1vcnkgb2ZmIGNvdW50ZXIuICBSZXR1cm5zIG5lZ2F0aXZlCiAgKiAoYW5kIFdBUk5zKSB1cG9uIGVycm9yLCBvdGhlcndpc2UsIHJldHVybnMgdGhlIGNvbnRleHQgbG9zcyBjb3VudC4KICAqLwotdTMyIHB3cmRtX2dldF9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK2ludCBwd3JkbV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pCiB7CiAJaW50IGksIGNvdW50OwogCiAJaWYgKCFwd3JkbSkgewogCQlXQVJOKDEsICJwb3dlcmRvbWFpbjogJXM6IHB3cmRtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWNvdW50ID0gcHdyZG0tPnN0YXRlX2NvdW50ZXJbUFdSRE1fUE9XRVJfT0ZGXTsKQEAgLTk2MCw3ICsxMDIwLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IHB3cmRtLT5iYW5rczsgaSsrKQogCQljb3VudCArPSBwd3JkbS0+cmV0X21lbV9vZmZfY291bnRlcltpXTsKIAotCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogJXM6IGNvbnRleHQgbG9zcyBjb3VudCA9ICV1XG4iLAorCS8qCisJICogQ29udGV4dCBsb3NzIGNvdW50IGhhcyB0byBiZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZS4gQ2xlYXIgdGhlIHNpZ24KKwkgKiBiaXQgdG8gZ2V0IGEgdmFsdWUgcmFuZ2UgZnJvbSAwIHRvIElOVF9NQVguCisJICovCisJY291bnQgJj0gSU5UX01BWDsKKworCXByX2RlYnVnKCJwb3dlcmRvbWFpbjogJXM6IGNvbnRleHQgbG9zcyBjb3VudCA9ICVkXG4iLAogCQkgcHdyZG0tPm5hbWUsIGNvdW50KTsKIAogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4uaAppbmRleCBkMjNkOTc5Li4wZDcyYThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbi5oCkBAIC0yNCw2ICsyNCw4IEBACiAKICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCisjaW5jbHVkZSAidm9sdGFnZS5oIgorCiAvKiBQb3dlcmRvbWFpbiBiYXNpYyBwb3dlciBzdGF0ZXMgKi8KICNkZWZpbmUgUFdSRE1fUE9XRVJfT0ZGCQkweDAKICNkZWZpbmUgUFdSRE1fUE9XRVJfUkVUCQkweDEKQEAgLTc4LDcgKzgwLDcgQEAKIC8qKgogICogc3RydWN0IHBvd2VyZG9tYWluIC0gT01BUCBwb3dlcmRvbWFpbgogICogQG5hbWU6IFBvd2VyZG9tYWluIG5hbWUKLSAqIEBvbWFwX2NoaXA6IHJlcHJlc2VudHMgdGhlIE9NQVAgY2hpcCB0eXBlcyBjb250YWluaW5nIHRoaXMgcHdyZG0KKyAqIEB2b2x0ZG06IHZvbHRhZ2Vkb21haW4gY29udGFpbmluZyB0aGlzIHBvd2VyZG9tYWluCiAgKiBAcHJjbV9vZmZzOiB0aGUgYWRkcmVzcyBvZmZzZXQgZnJvbSBDTV9CQVNFL1BSTV9CQVNFCiAgKiBAcHJjbV9wYXJ0aXRpb246IChPTUFQNCBvbmx5KSB0aGUgUFJDTSBwYXJ0aXRpb24gSUQgY29udGFpbmluZyBAcHJjbV9vZmZzCiAgKiBAcHdyc3RzOiBQb3NzaWJsZSBwb3dlcmRvbWFpbiBwb3dlciBzdGF0ZXMKQEAgLTg5LDYgKzkxLDcgQEAKICAqIEBwd3JzdHNfbWVtX29uOiBQb3NzaWJsZSBtZW1vcnkgYmFuayBwd3JzdGF0ZXMgd2hlbiBwd3JkbSBpbiBPTgogICogQHB3cmRtX2Nsa2RtczogQ2xvY2tkb21haW5zIGluIHRoaXMgcG93ZXJkb21haW4KICAqIEBub2RlOiBsaXN0X2hlYWQgbGlua2luZyBhbGwgcG93ZXJkb21haW5zCisgKiBAdm9sdGRtX25vZGU6IGxpc3RfaGVhZCBsaW5raW5nIGFsbCBwb3dlcmRvbWFpbnMgaW4gYSB2b2x0YWdlZG9tYWluCiAgKiBAc3RhdGU6CiAgKiBAc3RhdGVfY291bnRlcjoKICAqIEB0aW1lcjoKQEAgLTk4LDcgKzEwMSwxMCBAQAogICovCiBzdHJ1Y3QgcG93ZXJkb21haW4gewogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZCBvbWFwX2NoaXA7CisJdW5pb24geworCQljb25zdCBjaGFyICpuYW1lOworCQlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqcHRyOworCX0gdm9sdGRtOwogCWNvbnN0IHMxNiBwcmNtX29mZnM7CiAJY29uc3QgdTggcHdyc3RzOwogCWNvbnN0IHU4IHB3cnN0c19sb2dpY19yZXQ7CkBAIC0xMDksNiArMTE1LDcgQEAKIAljb25zdCB1OCBwcmNtX3BhcnRpdGlvbjsKIAlzdHJ1Y3QgY2xvY2tkb21haW4gKnB3cmRtX2Nsa2Rtc1tQV1JETV9NQVhfQ0xLRE1TXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCB2b2x0ZG1fbm9kZTsKIAlpbnQgc3RhdGU7CiAJdW5zaWduZWQgc3RhdGVfY291bnRlcltQV1JETV9NQVhfUFdSU1RTXTsKIAl1bnNpZ25lZCByZXRfbG9naWNfb2ZmX2NvdW50ZXI7CkBAIC0xNjIsNyArMTY5LDkgQEAKIAlpbnQJKCpwd3JkbV93YWl0X3RyYW5zaXRpb24pKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOwogfTsKIAotdm9pZCBwd3JkbV9pbml0KHN0cnVjdCBwb3dlcmRvbWFpbiAqKnB3cmRtX2xpc3QsIHN0cnVjdCBwd3JkbV9vcHMgKmN1c3RvbV9mdW5jcyk7CitpbnQgcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3Moc3RydWN0IHB3cmRtX29wcyAqY3VzdG9tX2Z1bmNzKTsKK2ludCBwd3JkbV9yZWdpc3Rlcl9wd3JkbXMoc3RydWN0IHBvd2VyZG9tYWluICoqcHdyZG1fbGlzdCk7CitpbnQgcHdyZG1fY29tcGxldGVfaW5pdCh2b2lkKTsKIAogc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CiAKQEAgLTE3Niw2ICsxODUsNyBAQAogaW50IHB3cmRtX2Zvcl9lYWNoX2Nsa2RtKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sCiAJCQkgaW50ICgqZm4pKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sCiAJCQkJICAgc3RydWN0IGNsb2NrZG9tYWluICpjbGtkbSkpOworc3RydWN0IHZvbHRhZ2Vkb21haW4gKnB3cmRtX2dldF92b2x0ZG0oc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CiAKIGludCBwd3JkbV9nZXRfbWVtX2JhbmtfY291bnQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CiAKQEAgLTIwNywxMCArMjE3LDExIEBACiBpbnQgcHdyZG1fcHJlX3RyYW5zaXRpb24odm9pZCk7CiBpbnQgcHdyZG1fcG9zdF90cmFuc2l0aW9uKHZvaWQpOwogaW50IHB3cmRtX3NldF9sb3dwd3JzdGNoYW5nZShzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKLXUzMiBwd3JkbV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworaW50IHB3cmRtX2dldF9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSk7CiBib29sIHB3cmRtX2Nhbl9ldmVyX2xvc2VfY29udGV4dChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtKTsKIAotZXh0ZXJuIHZvaWQgb21hcDJ4eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvbWFwMjQyeF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXAyNDN4X3Bvd2VyZG9tYWluc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgb21hcDN4eHhfcG93ZXJkb21haW5zX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBvbWFwNDR4eF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbjJ4eHhfM3h4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbjJ4eHhfM3h4eC5jCmluZGV4IGNmNjAwZTIuLjZhMTdlNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW4yeHh4XzN4eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluMnh4eF8zeHh4LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogT01BUDIgYW5kIE9NQVAzIHBvd2VyZG9tYWluIGNvbnRyb2wKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogRGVyaXZlZCBmcm9tIG1hY2gtb21hcDIvcG93ZXJkb21haW4uYyB3cml0dGVuIGJ5IFBhdWwgV2FsbXNsZXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF8zeHh4X2RhdGEuYwppbmRleCA0MjEwYzMzLi5kM2E1Mzk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczJ4eHhfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyeHh4XzN4eHhfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE9NQVAyLzMgY29tbW9uIHBvd2VyZG9tYWluIGRlZmluaXRpb25zCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4LCAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgpAQCAtMTIsMjAgKzEyLDYgQEAKICAqLwogCiAvKgotICogVG8gRG8gTGlzdAotICogLT4gTW92ZSB0aGUgU2xlZXAvV2FrZXVwIGRlcGVuZGVuY2llcyBmcm9tIFBvd2VyIERvbWFpbiBmcmFtZXdvcmsgdG8KLSAqICAgIENsb2NrIERvbWFpbiBGcmFtZXdvcmsKLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgcG93ZXJkb21haW5zIHRoYXQgaGF2ZSBzb21lIGVsZW1lbnQKLSAqIG9mIHNvZnR3YXJlIGNvbnRyb2wgZm9yIHRoZSBPTUFQMjR4eCBhbmQgT01BUDM0eHggY2hpcHMuCi0gKgotICogVGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0aW5nIG9mIHBvd2VyZG9tYWlucyBvbiB0aGUgY2hpcHM7IG9ubHkKLSAqIHBvd2VyZG9tYWlucyB0aGF0IGNhbiBiZSBjb250cm9sbGVkIGluIHNvZnR3YXJlLgotICovCi0KLS8qCiAgKiBUaGUgbmFtZXMgZm9yIHRoZSBEU1AvSVZBMiBwb3dlcmRvbWFpbnMgYXJlIGNvbmZ1c2luZy4KICAqCiAgKiBNb3N0IE9NQVAgY2hpcHMgaGF2ZSBhbiBvbi1ib2FyZCBEU1AuCkBAIC01OSw4ICs0NSw2IEBACiBzdHJ1Y3QgcG93ZXJkb21haW4gZ2Z4X29tYXAyX3B3cmRtID0gewogCS5uYW1lCQkgID0gImdmeF9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gR0ZYX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwKLQkJCQkJICAgQ0hJUF9JU19PTUFQMzQzMEVTMSksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX1JFVCwKIAkuYmFua3MJCSAgPSAxLApAQCAtNzAsMTEgKzU0LDEyIEBACiAJLnB3cnN0c19tZW1fb24JICA9IHsKIAkJWzBdID0gUFdSU1RTX09OLCAgLyogTUVNT05TVEFURSAqLwogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiBzdHJ1Y3QgcG93ZXJkb21haW4gd2t1cF9vbWFwMl9wd3JkbSA9IHsKIAkubmFtZQkJPSAid2t1cF9wd3JkbSIsCiAJLnByY21fb2Zmcwk9IFdLVVBfTU9ELAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNFhYIHwgQ0hJUF9JU19PTUFQMzQzMCksCiAJLnB3cnN0cwkJPSBQV1JTVFNfT04sCisJLnZvbHRkbSAgICAgICAgID0geyAubmFtZSA9ICJ3YWtldXAiIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zMnh4eF9kYXRhLmMKaW5kZXggY2MzODlmYi4uMjM4NWMxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMyeHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczJ4eHhfZGF0YS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIE9NQVAyWFhYIHBvd2VyZG9tYWluIGRlZmluaXRpb25zCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4LCAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqIFBhdWwgV2FsbXNsZXksIEpvdW5pIEjDtmdhbmRlcgpAQCAtMjgsNyArMjgsNiBAQAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkc3BfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiZHNwX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMjRYWF9EU1BfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDI0WFgpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTM4LDEyICszNywxMiBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwKIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBtcHVfMjR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJtcHVfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE1QVV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTUzLDEyICs1MiwxMiBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwKIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjb3JlXzI0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiY29yZV9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gQ09SRV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMjRYWCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5iYW5rcwkJICA9IDMsCiAJLnB3cnN0c19tZW1fcmV0CSAgPSB7CkBAIC03MSw2ICs3MCw3IEBACiAJCVsxXSA9IFBXUlNUU19PRkZfUkVUX09OLCAvKiBNRU0yT05TVEFURSAqLwogCQlbMl0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNM09OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogCkBAIC03OCwxNCArNzgsMTEgQEAKICAqIDI0MzAtc3BlY2lmaWMgcG93ZXJkb21haW5zCiAgKi8KIAotI2lmZGVmIENPTkZJR19TT0NfT01BUDI0MzAKLQogLyogWFhYIDI0MzAgS0lMTERPTUFJTldLVVAgYml0PyAgTm8gY3VycmVudCB1c2VycyBhcHBhcmVudGx5ICovCiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gbWRtX3B3cmRtID0gewogCS5uYW1lCQkgID0gIm1kbV9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDI0MzBfTURNX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAyNDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC05NSwyOSArOTIsNDQgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sICAvKiBNRU1PTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKLSNlbmRpZiAgICAgLyogQ09ORklHX1NPQ19PTUFQMjQzMCAqLworLyoKKyAqCisgKi8KIAotLyogQXMgcG93ZXJkb21haW5zIGFyZSBhZGRlZCBvciByZW1vdmVkIGFib3ZlLCB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIGNoYW5nZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMnh4eFtdIF9faW5pdGRhdGEgPSB7Ci0KK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMjR4eFtdIF9faW5pdGRhdGEgPSB7CiAJJndrdXBfb21hcDJfcHdyZG0sCiAJJmdmeF9vbWFwMl9wd3JkbSwKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAyCiAJJmRzcF9wd3JkbSwKIAkmbXB1XzI0eHhfcHdyZG0sCiAJJmNvcmVfMjR4eF9wd3JkbSwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NPQ19PTUFQMjQzMAotCSZtZG1fcHdyZG0sCi0jZW5kaWYKIAlOVUxMCiB9OwogCi12b2lkIF9faW5pdCBvbWFwMnh4eF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqcG93ZXJkb21haW5zX29tYXAyNDMwW10gX19pbml0ZGF0YSA9IHsKKwkmbWRtX3B3cmRtLAorCU5VTEwKK307CisKK3ZvaWQgX19pbml0IG9tYXAyNDJ4X3Bvd2VyZG9tYWluc19pbml0KHZvaWQpCiB7Ci0JcHdyZG1faW5pdChwb3dlcmRvbWFpbnNfb21hcDJ4eHgsICZvbWFwMl9wd3JkbV9vcGVyYXRpb25zKTsKKwlpZiAoIWNwdV9pc19vbWFwMjQyMCgpKQorCQlyZXR1cm47CisKKwlwd3JkbV9yZWdpc3Rlcl9wbGF0Zm9ybV9mdW5jcygmb21hcDJfcHdyZG1fb3BlcmF0aW9ucyk7CisJcHdyZG1fcmVnaXN0ZXJfcHdyZG1zKHBvd2VyZG9tYWluc19vbWFwMjR4eCk7CisJcHdyZG1fY29tcGxldGVfaW5pdCgpOworfQorCit2b2lkIF9faW5pdCBvbWFwMjQzeF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKQoreworCWlmICghY3B1X2lzX29tYXAyNDMwKCkpCisJCXJldHVybjsKKworCXB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCZvbWFwMl9wd3JkbV9vcGVyYXRpb25zKTsKKwlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAyNHh4KTsKKwlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAyNDMwKTsKKwlwd3JkbV9jb21wbGV0ZV9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczN4eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnMzeHh4X2RhdGEuYwppbmRleCA0NjlhOTIwLi44ZWYyNmRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zM3h4eF9kYXRhLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogT01BUDMgcG93ZXJkb21haW4gZGVmaW5pdGlvbnMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDgsIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDExIE5va2lhIENvcnBvcmF0aW9uCiAgKgogICogUGF1bCBXYWxtc2xleSwgSm91bmkgSMO2Z2FuZGVyCkBAIC0xNCw2ICsxNCw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKwogI2luY2x1ZGUgInBvd2VyZG9tYWluLmgiCiAjaW5jbHVkZSAicG93ZXJkb21haW5zMnh4eF8zeHh4X2RhdGEuaCIKIApAQCAtMjcsOCArMjksNiBAQAogICogMzRYWC1zcGVjaWZpYyBwb3dlcmRvbWFpbnMsIGRlcGVuZGVuY2llcwogICovCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwotCiAvKgogICogUG93ZXJkb21haW5zCiAgKi8KQEAgLTM2LDcgKzM2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gaXZhMl9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJpdmEyX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9JVkEyX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGX1JFVCwKIAkuYmFua3MJCSAgPSA0LApAQCAtNTIsMTIgKzUxLDEyIEBACiAJCVsyXSA9IFBXUlNUU19PRkZfT04sCiAJCVszXSA9IFBXUlNUU19PTiwKIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJtcHVfaXZhIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBtcHVfM3h4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJtcHVfcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE1QVV9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmZsYWdzCQkgID0gUFdSRE1fSEFTX01QVV9RVUlSSywKQEAgLTY4LDYgKzY3LDcgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT0ZGX09OLAogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gIm1wdV9pdmEiIH0sCiB9OwogCiAvKgpAQCAtODMsMTAgKzgzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY29yZV8zeHh4X3ByZV9lczNfMV9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjb3JlX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBDT1JFX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMxIHwKLQkJCQkJICAgQ0hJUF9JU19PTUFQMzQzMEVTMiB8Ci0JCQkJCSAgIENISVBfSVNfT01BUDM0MzBFUzNfMCB8Ci0JCQkJCSAgIENISVBfSVNfT01BUDM2MzBFUzEpLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDIsCkBAIC05OCwxMyArOTQsMTIgQEAKIAkJWzBdID0gUFdSU1RTX09GRl9SRVRfT04sIC8qIE1FTTFPTlNUQVRFICovCiAJCVsxXSA9IFBXUlNUU19PRkZfUkVUX09OLCAvKiBNRU0yT05TVEFURSAqLwogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNvcmVfM3h4eF9lczNfMV9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjb3JlX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBDT1JFX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwRVMzXzEgfAotCQkJCQkgIENISVBfR0VfT01BUDM2MzBFUzFfMSksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLyoKQEAgLTEyMSwxMSArMTE2LDExIEBACiAJCVswXSA9IFBXUlNUU19PRkZfUkVUX09OLCAvKiBNRU0xT05TVEFURSAqLwogCQlbMV0gPSBQV1JTVFNfT0ZGX1JFVF9PTiwgLyogTUVNMk9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkc3NfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiZHNzX3B3cmRtIiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9EU1NfTU9ELAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCkBAIC0xMzYsNiArMTMxLDcgQEAKIAkucHdyc3RzX21lbV9vbgkgID0gewogCQlbMF0gPSBQV1JTVFNfT04sICAvKiBNRU1PTlNUQVRFICovCiAJfSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIC8qCkBAIC0xNDYsNyArMTQyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gc2d4X3B3cmRtID0gewogCS5uYW1lCQkgID0gInNneF9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBFUzJfU0dYX01PRCwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0dFX09NQVAzNDMwRVMyKSwKIAkvKiBYWFggVGhpcyBpcyBhY2N1cmF0ZSBmb3IgMzQzMCBTR1gsIGJ1dCB3aGF0IGFib3V0IEdGWD8gKi8KIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCkBAIC0xNTcsMTEgKzE1MiwxMSBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwgIC8qIE1FTU9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBjYW1fcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiY2FtX3B3cmRtIiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9DQU1fTU9ELAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCkBAIC0xNzIsMTIgKzE2NywxMiBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwgIC8qIE1FTU9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBwZXJfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAicGVyX3B3cmRtIiwKIAkucHJjbV9vZmZzCSAgPSBPTUFQMzQzMF9QRVJfTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDEsCkBAIC0xODcsMjYgKzE4MiwyNiBAQAogCS5wd3JzdHNfbWVtX29uCSAgPSB7CiAJCVswXSA9IFBXUlNUU19PTiwgIC8qIE1FTU9OU1RBVEUgKi8KIAl9LAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBlbXVfcHdyZG0gPSB7CiAJLm5hbWUJCT0gImVtdV9wd3JkbSIsCiAJLnByY21fb2Zmcwk9IE9NQVAzNDMwX0VNVV9NT0QsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBuZW9uX3B3cmRtID0gewogCS5uYW1lCQkgID0gIm5lb25fcHdyZG0iLAogCS5wcmNtX29mZnMJICA9IE9NQVAzNDMwX05FT05fTU9ELAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19SRVQsCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gIm1wdV9pdmEiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHVzYmhvc3RfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAidXNiaG9zdF9wd3JkbSIsCiAJLnByY21fb2ZmcwkgID0gT01BUDM0MzBFUzJfVVNCSE9TVF9NT0QsCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX1JFVCwKIAkvKgpAQCAtMjIzLDY1ICsyMTgsMTAzIEBACiAJLnB3cnN0c19tZW1fb24JICA9IHsKIAkJWzBdID0gUFdSU1RTX09OLCAgLyogTUVNT05TVEFURSAqLwogCX0sCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGRwbGwxX3B3cmRtID0gewogCS5uYW1lCQk9ICJkcGxsMV9wd3JkbSIsCiAJLnByY21fb2Zmcwk9IE1QVV9NT0QsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJtcHVfaXZhIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkcGxsMl9wd3JkbSA9IHsKIAkubmFtZQkJPSAiZHBsbDJfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBPTUFQMzQzMF9JVkEyX01PRCwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQMzQzMCksCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gIm1wdV9pdmEiIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGRwbGwzX3B3cmRtID0gewogCS5uYW1lCQk9ICJkcGxsM19wd3JkbSIsCiAJLnByY21fb2Zmcwk9IFBMTF9NT0QsCi0JLm9tYXBfY2hpcAk9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDM0MzApLAorCS52b2x0ZG0gICAgICAgICAgID0geyAubmFtZSA9ICJjb3JlIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkcGxsNF9wd3JkbSA9IHsKIAkubmFtZQkJPSAiZHBsbDRfcHdyZG0iLAogCS5wcmNtX29mZnMJPSBQTExfTU9ELAotCS5vbWFwX2NoaXAJPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVAzNDMwKSwKKwkudm9sdGRtICAgICAgICAgICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZHBsbDVfcHdyZG0gPSB7CiAJLm5hbWUJCT0gImRwbGw1X3B3cmRtIiwKIAkucHJjbV9vZmZzCT0gUExMX01PRCwKLQkub21hcF9jaGlwCT0gT01BUF9DSElQX0lOSVQoQ0hJUF9HRV9PTUFQMzQzMEVTMiksCisJLnZvbHRkbSAgICAgICAgICAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiB9OwogCiAvKiBBcyBwb3dlcmRvbWFpbnMgYXJlIGFkZGVkIG9yIHJlbW92ZWQgYWJvdmUsIHRoaXMgbGlzdCBtdXN0IGFsc28gYmUgY2hhbmdlZCAqLwotc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqcG93ZXJkb21haW5zX29tYXAzeHh4W10gX19pbml0ZGF0YSA9IHsKLQorc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqcG93ZXJkb21haW5zX29tYXAzNDMwX2NvbW1vbltdIF9faW5pdGRhdGEgPSB7CiAJJndrdXBfb21hcDJfcHdyZG0sCi0JJmdmeF9vbWFwMl9wd3JkbSwKIAkmaXZhMl9wd3JkbSwKIAkmbXB1XzN4eHhfcHdyZG0sCiAJJm5lb25fcHdyZG0sCi0JJmNvcmVfM3h4eF9wcmVfZXMzXzFfcHdyZG0sCi0JJmNvcmVfM3h4eF9lczNfMV9wd3JkbSwKIAkmY2FtX3B3cmRtLAogCSZkc3NfcHdyZG0sCiAJJnBlcl9wd3JkbSwKIAkmZW11X3B3cmRtLAotCSZzZ3hfcHdyZG0sCi0JJnVzYmhvc3RfcHdyZG0sCiAJJmRwbGwxX3B3cmRtLAogCSZkcGxsMl9wd3JkbSwKIAkmZHBsbDNfcHdyZG0sCiAJJmRwbGw0X3B3cmRtLAotCSZkcGxsNV9wd3JkbSwKLSNlbmRpZgogCU5VTEwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMzQzMGVzMVtdIF9faW5pdGRhdGEgPSB7CisJJmdmeF9vbWFwMl9wd3JkbSwKKwkmY29yZV8zeHh4X3ByZV9lczNfMV9wd3JkbSwKKwlOVUxMCit9OworCisvKiBhbHNvIGluY2x1ZGVzIDM2MzBFUzEuMCAqLworc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqcG93ZXJkb21haW5zX29tYXAzNDMwZXMyX2VzM18wW10gX19pbml0ZGF0YSA9IHsKKwkmY29yZV8zeHh4X3ByZV9lczNfMV9wd3JkbSwKKwkmc2d4X3B3cmRtLAorCSZ1c2Job3N0X3B3cmRtLAorCSZkcGxsNV9wd3JkbSwKKwlOVUxMCit9OworCisvKiBhbHNvIGluY2x1ZGVzIDM2MzBFUzEuMSsgKi8KK3N0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKnBvd2VyZG9tYWluc19vbWFwMzQzMGVzM18xcGx1c1tdIF9faW5pdGRhdGEgPSB7CisJJmNvcmVfM3h4eF9lczNfMV9wd3JkbSwKKwkmc2d4X3B3cmRtLAorCSZ1c2Job3N0X3B3cmRtLAorCSZkcGxsNV9wd3JkbSwKKwlOVUxMCit9OwogCiB2b2lkIF9faW5pdCBvbWFwM3h4eF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKQogewotCXB3cmRtX2luaXQocG93ZXJkb21haW5zX29tYXAzeHh4LCAmb21hcDNfcHdyZG1fb3BlcmF0aW9ucyk7CisJdW5zaWduZWQgaW50IHJldjsKKworCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCisJCXJldHVybjsKKworCXB3cmRtX3JlZ2lzdGVyX3BsYXRmb3JtX2Z1bmNzKCZvbWFwM19wd3JkbV9vcGVyYXRpb25zKTsKKwlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAzNDMwX2NvbW1vbik7CisKKwlyZXYgPSBvbWFwX3JldigpOworCisJaWYgKHJldiA9PSBPTUFQMzQzMF9SRVZfRVMxXzApCisJCXB3cmRtX3JlZ2lzdGVyX3B3cmRtcyhwb3dlcmRvbWFpbnNfb21hcDM0MzBlczEpOworCWVsc2UgaWYgKHJldiA9PSBPTUFQMzQzMF9SRVZfRVMyXzAgfHwgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzJfMSB8fAorCQkgcmV2ID09IE9NQVAzNDMwX1JFVl9FUzNfMCB8fCByZXYgPT0gT01BUDM2MzBfUkVWX0VTMV8wKQorCQlwd3JkbV9yZWdpc3Rlcl9wd3JkbXMocG93ZXJkb21haW5zX29tYXAzNDMwZXMyX2VzM18wKTsKKwllbHNlIGlmIChyZXYgPT0gT01BUDM0MzBfUkVWX0VTM18xIHx8IHJldiA9PSBPTUFQMzQzMF9SRVZfRVMzXzFfMiB8fAorCQkgcmV2ID09IE9NQVAzNTE3X1JFVl9FUzFfMCB8fCByZXYgPT0gT01BUDM1MTdfUkVWX0VTMV8xIHx8CisJCSByZXYgPT0gT01BUDM2MzBfUkVWX0VTMV8xIHx8IHJldiA9PSBPTUFQMzYzMF9SRVZfRVMxXzIpCisJCXB3cmRtX3JlZ2lzdGVyX3B3cmRtcyhwb3dlcmRvbWFpbnNfb21hcDM0MzBlczNfMXBsdXMpOworCWVsc2UKKwkJV0FSTigxLCAiT01BUDMgcG93ZXJkb21haW4gaW5pdDogdW5rbm93biBjaGlwIHR5cGVcbiIpOworCisJcHdyZG1fY29tcGxldGVfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnM0NHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG93ZXJkb21haW5zNDR4eF9kYXRhLmMKaW5kZXggMjQ3ZTc5NC4uNzA0NjY0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wb3dlcmRvbWFpbnM0NHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3Bvd2VyZG9tYWluczQ0eHhfZGF0YS5jCkBAIC0zMyw5ICszMyw5IEBACiAvKiBjb3JlXzQ0eHhfcHdyZG06IENPUkUgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNvcmVfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJjb3JlX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJjb3JlIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9DT1JFX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gNSwKQEAgLTU5LDkgKzU5LDkgQEAKIC8qIGdmeF80NHh4X3B3cmRtOiAzRCBhY2NlbGVyYXRvciBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZ2Z4XzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiZ2Z4X3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJjb3JlIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9HRlhfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfT04sCiAJLmJhbmtzCQkgID0gMSwKIAkucHdyc3RzX21lbV9yZXQJPSB7CkBAIC03Niw5ICs3Niw5IEBACiAvKiBhYmVfNDR4eF9wd3JkbTogQXVkaW8gYmFjayBlbmQgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGFiZV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImFiZV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiaXZhIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9BQkVfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRiwKIAkuYmFua3MJCSAgPSAyLApAQCAtOTYsOSArOTYsOSBAQAogLyogZHNzXzQ0eHhfcHdyZG06IERpc3BsYXkgc3Vic3lzdGVtIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBkc3NfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJkc3NfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0RTU19JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGLAogCS5iYW5rcwkJICA9IDEsCkBAIC0xMTQsOSArMTE0LDkgQEAKIC8qIHRlc2xhXzQ0eHhfcHdyZG06IFRlc2xhIHByb2Nlc3NvciBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gdGVzbGFfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJ0ZXNsYV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiaXZhIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9URVNMQV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9SRVRfT04sCiAJLnB3cnN0c19sb2dpY19yZXQgPSBQV1JTVFNfT0ZGX1JFVCwKIAkuYmFua3MJCSAgPSAzLApAQCAtMTM2LDkgKzEzNiw5IEBACiAvKiB3a3VwXzQ0eHhfcHdyZG06IFdha2UtdXAgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIHdrdXBfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJ3a3VwX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJ3YWtldXAiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX1dLVVBfSU5TVCwKIAkucHJjbV9wYXJ0aXRpb24JICA9IE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PTiwKIAkuYmFua3MJCSAgPSAxLAogCS5wd3JzdHNfbWVtX3JldAk9IHsKQEAgLTE1Miw5ICsxNTIsOSBAQAogLyogY3B1MF80NHh4X3B3cmRtOiBNUFUwIHByb2Nlc3NvciBhbmQgTmVvbiBjb3Byb2Nlc3NvciBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY3B1MF80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImNwdTBfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gIm1wdSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUkNNX01QVV9DUFUwX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUkNNX01QVV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTE2OSw5ICsxNjksOSBAQAogLyogY3B1MV80NHh4X3B3cmRtOiBNUFUxIHByb2Nlc3NvciBhbmQgTmVvbiBjb3Byb2Nlc3NvciBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gY3B1MV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImNwdTFfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gIm1wdSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUkNNX01QVV9DUFUxX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUkNNX01QVV9QQVJUSVRJT04sCi0JLm9tYXBfY2hpcAkgID0gT01BUF9DSElQX0lOSVQoQ0hJUF9JU19PTUFQNDQzMCksCiAJLnB3cnN0cwkJICA9IFBXUlNUU19PRkZfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTE4Niw5ICsxODYsOSBAQAogLyogZW11XzQ0eHhfcHdyZG06IEVtdWxhdGlvbiBwb3dlciBkb21haW4gKi8KIHN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gZW11XzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiZW11X3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJ3YWtldXAiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0VNVV9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09GRl9PTiwKIAkuYmFua3MJCSAgPSAxLAogCS5wd3JzdHNfbWVtX3JldAk9IHsKQEAgLTIwMiw5ICsyMDIsOSBAQAogLyogbXB1XzQ0eHhfcHdyZG06IE1vZGVuYSBwcm9jZXNzb3IgYW5kIHRoZSBOZW9uIGNvcHJvY2Vzc29yIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBtcHVfNDR4eF9wd3JkbSA9IHsKIAkubmFtZQkJICA9ICJtcHVfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gIm1wdSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fTVBVX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMywKQEAgLTIyMyw5ICsyMjMsOSBAQAogLyogaXZhaGRfNDR4eF9wd3JkbTogSVZBLUhEIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBpdmFoZF80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gIml2YWhkX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJpdmEiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0lWQUhEX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkYsCiAJLmJhbmtzCQkgID0gNCwKQEAgLTI0Nyw5ICsyNDcsOSBAQAogLyogY2FtXzQ0eHhfcHdyZG06IENhbWVyYSBzdWJzeXN0ZW0gcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNhbV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImNhbV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fQ0FNX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX09OLAogCS5iYW5rcwkJICA9IDEsCiAJLnB3cnN0c19tZW1fcmV0CT0gewpAQCAtMjY0LDkgKzI2NCw5IEBACiAvKiBsM2luaXRfNDR4eF9wd3JkbTogTDMgaW5pdGF0b3JzIHBoZXJpcGhlcmFscyBwb3dlciBkb21haW4gICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGwzaW5pdF80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImwzaW5pdF9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fTDNJTklUX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfUkVUX09OLAogCS5wd3JzdHNfbG9naWNfcmV0ID0gUFdSU1RTX09GRl9SRVQsCiAJLmJhbmtzCQkgID0gMSwKQEAgLTI4Miw5ICsyODIsOSBAQAogLyogbDRwZXJfNDR4eF9wd3JkbTogVGFyZ2V0IHBlcmlwaGVyYWxzIHBvd2VyIGRvbWFpbiAqLwogc3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiBsNHBlcl80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImw0cGVyX3B3cmRtIiwKKwkudm9sdGRtCQkgID0geyAubmFtZSA9ICJjb3JlIiB9LAogCS5wcmNtX29mZnMJICA9IE9NQVA0NDMwX1BSTV9MNFBFUl9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX1JFVF9PTiwKIAkucHdyc3RzX2xvZ2ljX3JldCA9IFBXUlNUU19PRkZfUkVULAogCS5iYW5rcwkJICA9IDIsCkBAIC0zMDUsMTggKzMwNSwxOCBAQAogICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGFsd2F5c19vbl9jb3JlXzQ0eHhfcHdyZG0gPSB7CiAJLm5hbWUJCSAgPSAiYWx3YXlzX29uX2NvcmVfcHdyZG0iLAorCS52b2x0ZG0JCSAgPSB7IC5uYW1lID0gImNvcmUiIH0sCiAJLnByY21fb2ZmcwkgID0gT01BUDQ0MzBfUFJNX0FMV0FZU19PTl9JTlNULAogCS5wcmNtX3BhcnRpdGlvbgkgID0gT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKLQkub21hcF9jaGlwCSAgPSBPTUFQX0NISVBfSU5JVChDSElQX0lTX09NQVA0NDMwKSwKIAkucHdyc3RzCQkgID0gUFdSU1RTX09OLAogfTsKIAogLyogY2VmdXNlXzQ0eHhfcHdyZG06IEN1c3RvbWVyIGVmdXNlIGNvbnRyb2xsZXIgcG93ZXIgZG9tYWluICovCiBzdGF0aWMgc3RydWN0IHBvd2VyZG9tYWluIGNlZnVzZV80NHh4X3B3cmRtID0gewogCS5uYW1lCQkgID0gImNlZnVzZV9wd3JkbSIsCisJLnZvbHRkbQkJICA9IHsgLm5hbWUgPSAiY29yZSIgfSwKIAkucHJjbV9vZmZzCSAgPSBPTUFQNDQzMF9QUk1fQ0VGVVNFX0lOU1QsCiAJLnByY21fcGFydGl0aW9uCSAgPSBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAotCS5vbWFwX2NoaXAJICA9IE9NQVBfQ0hJUF9JTklUKENISVBfSVNfT01BUDQ0MzApLAogCS5wd3JzdHMJCSAgPSBQV1JTVFNfT0ZGX09OLAogCS5mbGFncwkJICA9IFBXUkRNX0hBU19MT1dQT1dFUlNUQVRFQ0hBTkdFLAogfTsKQEAgLTM1Miw1ICszNTIsNyBAQAogCiB2b2lkIF9faW5pdCBvbWFwNDR4eF9wb3dlcmRvbWFpbnNfaW5pdCh2b2lkKQogewotCXB3cmRtX2luaXQocG93ZXJkb21haW5zX29tYXA0NHh4LCAmb21hcDRfcHdyZG1fb3BlcmF0aW9ucyk7CisJcHdyZG1fcmVnaXN0ZXJfcGxhdGZvcm1fZnVuY3MoJm9tYXA0X3B3cmRtX29wZXJhdGlvbnMpOworCXB3cmRtX3JlZ2lzdGVyX3B3cmRtcyhwb3dlcmRvbWFpbnNfb21hcDQ0eHgpOworCXB3cmRtX2NvbXBsZXRlX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJjbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKaW5kZXggMmU0MGE1Yy4uNTk3ZTJkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcmNtLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtYWNoL3N5c3RlbS5oPgogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CkBAIC0xNTEsMTcgKzE1MiwxMCBAQAogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc19wcmNtKHN0cnVjdCBvbWFwX2dsb2JhbHMgKm9tYXAyX2dsb2JhbHMpCiB7Ci0JLyogU3RhdGljIG1hcHBpbmcsIG5ldmVyIHJlbGVhc2VkICovCi0JaWYgKG9tYXAyX2dsb2JhbHMtPnBybSkgewotCQlwcm1fYmFzZSA9IGlvcmVtYXAob21hcDJfZ2xvYmFscy0+cHJtLCBTWl84Syk7Ci0JCVdBUk5fT04oIXBybV9iYXNlKTsKLQl9Ci0JaWYgKG9tYXAyX2dsb2JhbHMtPmNtKSB7Ci0JCWNtX2Jhc2UgPSBpb3JlbWFwKG9tYXAyX2dsb2JhbHMtPmNtLCBTWl84Syk7Ci0JCVdBUk5fT04oIWNtX2Jhc2UpOwotCX0KLQlpZiAob21hcDJfZ2xvYmFscy0+Y20yKSB7Ci0JCWNtMl9iYXNlID0gaW9yZW1hcChvbWFwMl9nbG9iYWxzLT5jbTIsIFNaXzhLKTsKLQkJV0FSTl9PTighY20yX2Jhc2UpOwotCX0KKwlpZiAob21hcDJfZ2xvYmFscy0+cHJtKQorCQlwcm1fYmFzZSA9IG9tYXAyX2dsb2JhbHMtPnBybTsKKwlpZiAob21hcDJfZ2xvYmFscy0+Y20pCisJCWNtX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5jbTsKKwlpZiAob21hcDJfZ2xvYmFscy0+Y20yKQorCQljbTJfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPmNtMjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5jCmluZGV4IDA1MTIxM2YuLmYwMmQ4N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0yeHh4XzN4eHguYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9wcmNtLmg+CiAKKyNpbmNsdWRlICJ2cC5oIgorCiAjaW5jbHVkZSAicHJtMnh4eF8zeHh4LmgiCiAjaW5jbHVkZSAiY20yeHh4XzN4eHguaCIKICNpbmNsdWRlICJwcm0tcmVnYml0cy0yNHh4LmgiCkBAIC0xNTYsMyArMTU4LDU3IEBACiAKIAlyZXR1cm4gKGMgPT0gTUFYX01PRFVMRV9IQVJEUkVTRVRfV0FJVCkgPyAtRUJVU1kgOiAwOwogfQorCisvKiBQUk0gVlAgKi8KKworLyoKKyAqIHN0cnVjdCBvbWFwM192cCAtIE9NQVAzIFZQIHJlZ2lzdGVyIGFjY2VzcyBkZXNjcmlwdGlvbi4KKyAqIEB0cmFueGRvbmVfc3RhdHVzOiBWUF9UUkFOWERPTkVfU1QgYml0bWFzayBpbiBQUk1fSVJRU1RBVFVTX01QVSByZWcKKyAqLworc3RydWN0IG9tYXAzX3ZwIHsKKwl1MzIgdHJhbnhkb25lX3N0YXR1czsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcDNfdnAgb21hcDNfdnBbXSA9IHsKKwlbT01BUDNfVlBfVkREX01QVV9JRF0gPSB7CisJCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDM0MzBfVlAxX1RSQU5YRE9ORV9TVF9NQVNLLAorCX0sCisJW09NQVAzX1ZQX1ZERF9DT1JFX0lEXSA9IHsKKwkJLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQMzQzMF9WUDJfVFJBTlhET05FX1NUX01BU0ssCisJfSwKK307CisKKyNkZWZpbmUgTUFYX1ZQX0lEIEFSUkFZX1NJWkUob21hcDNfdnApOworCit1MzIgb21hcDNfcHJtX3ZwX2NoZWNrX3R4ZG9uZSh1OCB2cF9pZCkKK3sKKwlzdHJ1Y3Qgb21hcDNfdnAgKnZwID0gJm9tYXAzX3ZwW3ZwX2lkXTsKKwl1MzIgaXJxc3RhdHVzOworCisJaXJxc3RhdHVzID0gb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhPQ1BfTU9ELAorCQkJCQkgICBPTUFQM19QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQpOworCXJldHVybiBpcnFzdGF0dXMgJiB2cC0+dHJhbnhkb25lX3N0YXR1czsKK30KKwordm9pZCBvbWFwM19wcm1fdnBfY2xlYXJfdHhkb25lKHU4IHZwX2lkKQoreworCXN0cnVjdCBvbWFwM192cCAqdnAgPSAmb21hcDNfdnBbdnBfaWRdOworCisJb21hcDJfcHJtX3dyaXRlX21vZF9yZWcodnAtPnRyYW54ZG9uZV9zdGF0dXMsCisJCQkJT0NQX01PRCwgT01BUDNfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VUKTsKK30KKwordTMyIG9tYXAzX3BybV92Y3ZwX3JlYWQodTggb2Zmc2V0KQoreworCXJldHVybiBvbWFwMl9wcm1fcmVhZF9tb2RfcmVnKE9NQVAzNDMwX0dSX01PRCwgb2Zmc2V0KTsKK30KKwordm9pZCBvbWFwM19wcm1fdmN2cF93cml0ZSh1MzIgdmFsLCB1OCBvZmZzZXQpCit7CisJb21hcDJfcHJtX3dyaXRlX21vZF9yZWcodmFsLCBPTUFQMzQzMF9HUl9NT0QsIG9mZnNldCk7Cit9CisKK3UzMiBvbWFwM19wcm1fdmN2cF9ybXcodTMyIG1hc2ssIHUzMiBiaXRzLCB1OCBvZmZzZXQpCit7CisJcmV0dXJuIG9tYXAyX3BybV9ybXdfbW9kX3JlZ19iaXRzKG1hc2ssIGJpdHMsIE9NQVAzNDMwX0dSX01PRCwgb2Zmc2V0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5oCmluZGV4IGExZmM2MmEuLmNlZjUzM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0yeHh4XzN4eHguaApAQCAtMzAzLDcgKzMwMywxOSBAQAogZXh0ZXJuIGludCBvbWFwMl9wcm1fYXNzZXJ0X2hhcmRyZXNldChzMTYgcHJtX21vZCwgdTggc2hpZnQpOwogZXh0ZXJuIGludCBvbWFwMl9wcm1fZGVhc3NlcnRfaGFyZHJlc2V0KHMxNiBwcm1fbW9kLCB1OCByc3Rfc2hpZnQsIHU4IHN0X3NoaWZ0KTsKIAorLyogT01BUDMtc3BlY2lmaWMgVlAgZnVuY3Rpb25zICovCit1MzIgb21hcDNfcHJtX3ZwX2NoZWNrX3R4ZG9uZSh1OCB2cF9pZCk7Cit2b2lkIG9tYXAzX3BybV92cF9jbGVhcl90eGRvbmUodTggdnBfaWQpOworCisvKgorICogT01BUDMgYWNjZXNzIGZ1bmN0aW9ucyBmb3Igdm9sdGFnZSBjb250cm9sbGVyIChWQykgYW5kCisgKiB2b2x0YWdlIHByb2NjZXNzb3IgKFZQKSBpbiB0aGUgUFJNLgorICovCitleHRlcm4gdTMyIG9tYXAzX3BybV92Y3ZwX3JlYWQodTggb2Zmc2V0KTsKK2V4dGVybiB2b2lkIG9tYXAzX3BybV92Y3ZwX3dyaXRlKHUzMiB2YWwsIHU4IG9mZnNldCk7CitleHRlcm4gdTMyIG9tYXAzX3BybV92Y3ZwX3Jtdyh1MzIgbWFzaywgdTMyIGJpdHMsIHU4IG9mZnNldCk7CiAjZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDQgKi8KKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTQ0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5jCmluZGV4IDAwMTY1NTUuLjQ5NWEzMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5jCkBAIC0yMSw4ICsyMSwxMSBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9wcmNtLmg+CiAKKyNpbmNsdWRlICJ2cC5oIgogI2luY2x1ZGUgInBybTQ0eHguaCIKICNpbmNsdWRlICJwcm0tcmVnYml0cy00NHh4LmgiCisjaW5jbHVkZSAicHJjbTQ0eHguaCIKKyNpbmNsdWRlICJwcm1pbnN0NDR4eC5oIgogCiAvKiBQUk0gbG93LWxldmVsIGZ1bmN0aW9ucyAqLwogCkBAIC01MCwzICs1Myw3MSBAQAogCiAJcmV0dXJuIHY7CiB9CisKKy8qIFBSTSBWUCAqLworCisvKgorICogc3RydWN0IG9tYXA0X3ZwIC0gT01BUDQgVlAgcmVnaXN0ZXIgYWNjZXNzIGRlc2NyaXB0aW9uLgorICogQGlycXN0YXR1c19tcHU6IG9mZnNldCB0byBJUlFTVEFUVVNfTVBVIHJlZ2lzdGVyIGZvciBWUAorICogQHRyYW54ZG9uZV9zdGF0dXM6IFZQX1RSQU5YRE9ORV9TVCBiaXRtYXNrIGluIFBSTV9JUlFTVEFUVVNfTVBVIHJlZworICovCitzdHJ1Y3Qgb21hcDRfdnAgeworCXUzMiBpcnFzdGF0dXNfbXB1OworCXUzMiB0cmFueGRvbmVfc3RhdHVzOworfTsKKworc3RhdGljIHN0cnVjdCBvbWFwNF92cCBvbWFwNF92cFtdID0geworCVtPTUFQNF9WUF9WRERfTVBVX0lEXSA9IHsKKwkJLmlycXN0YXR1c19tcHUgPSBPTUFQNF9QUk1fSVJRU1RBVFVTX01QVV8yX09GRlNFVCwKKwkJLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQNDQzMF9WUF9NUFVfVFJBTlhET05FX1NUX01BU0ssCisJfSwKKwlbT01BUDRfVlBfVkREX0lWQV9JRF0gPSB7CisJCS5pcnFzdGF0dXNfbXB1ID0gT01BUDRfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VULAorCQkudHJhbnhkb25lX3N0YXR1cyA9IE9NQVA0NDMwX1ZQX0lWQV9UUkFOWERPTkVfU1RfTUFTSywKKwl9LAorCVtPTUFQNF9WUF9WRERfQ09SRV9JRF0gPSB7CisJCS5pcnFzdGF0dXNfbXB1ID0gT01BUDRfUFJNX0lSUVNUQVRVU19NUFVfT0ZGU0VULAorCQkudHJhbnhkb25lX3N0YXR1cyA9IE9NQVA0NDMwX1ZQX0NPUkVfVFJBTlhET05FX1NUX01BU0ssCisJfSwKK307CisKK3UzMiBvbWFwNF9wcm1fdnBfY2hlY2tfdHhkb25lKHU4IHZwX2lkKQoreworCXN0cnVjdCBvbWFwNF92cCAqdnAgPSAmb21hcDRfdnBbdnBfaWRdOworCXUzMiBpcnFzdGF0dXM7CisKKwlpcnFzdGF0dXMgPSBvbWFwNF9wcm1pbnN0X3JlYWRfaW5zdF9yZWcoT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKKwkJCQkJCU9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX0lOU1QsCisJCQkJCQl2cC0+aXJxc3RhdHVzX21wdSk7CisJcmV0dXJuIGlycXN0YXR1cyAmIHZwLT50cmFueGRvbmVfc3RhdHVzOworfQorCit2b2lkIG9tYXA0X3BybV92cF9jbGVhcl90eGRvbmUodTggdnBfaWQpCit7CisJc3RydWN0IG9tYXA0X3ZwICp2cCA9ICZvbWFwNF92cFt2cF9pZF07CisKKwlvbWFwNF9wcm1pbnN0X3dyaXRlX2luc3RfcmVnKHZwLT50cmFueGRvbmVfc3RhdHVzLAorCQkJCSAgICAgT01BUDQ0MzBfUFJNX1BBUlRJVElPTiwKKwkJCQkgICAgIE9NQVA0NDMwX1BSTV9PQ1BfU09DS0VUX0lOU1QsCisJCQkJICAgICB2cC0+aXJxc3RhdHVzX21wdSk7Cit9OworCit1MzIgb21hcDRfcHJtX3ZjdnBfcmVhZCh1OCBvZmZzZXQpCit7CisJcmV0dXJuIG9tYXA0X3BybWluc3RfcmVhZF9pbnN0X3JlZyhPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAorCQkJCQkgICBPTUFQNDQzMF9QUk1fREVWSUNFX0lOU1QsIG9mZnNldCk7Cit9CisKK3ZvaWQgb21hcDRfcHJtX3ZjdnBfd3JpdGUodTMyIHZhbCwgdTggb2Zmc2V0KQoreworCW9tYXA0X3BybWluc3Rfd3JpdGVfaW5zdF9yZWcodmFsLCBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAorCQkJCSAgICAgT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULCBvZmZzZXQpOworfQorCit1MzIgb21hcDRfcHJtX3ZjdnBfcm13KHUzMiBtYXNrLCB1MzIgYml0cywgdTggb2Zmc2V0KQoreworCXJldHVybiBvbWFwNF9wcm1pbnN0X3Jtd19pbnN0X3JlZ19iaXRzKG1hc2ssIGJpdHMsCisJCQkJCSAgICAgICBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLAorCQkJCQkgICAgICAgT01BUDQ0MzBfUFJNX0RFVklDRV9JTlNULAorCQkJCQkgICAgICAgb2Zmc2V0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtNDR4eC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKaW5kZXggN2RmYTM3OS4uM2Q2NmNjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm00NHh4LmgKQEAgLTc1MSw2ICs3NTEsMTggQEAKIGV4dGVybiB2b2lkIG9tYXA0X3BybV93cml0ZV9pbnN0X3JlZyh1MzIgdmFsLCBzMTYgaW5zdCwgdTE2IGlkeCk7CiBleHRlcm4gdTMyIG9tYXA0X3BybV9ybXdfaW5zdF9yZWdfYml0cyh1MzIgbWFzaywgdTMyIGJpdHMsIHMxNiBpbnN0LCBzMTYgaWR4KTsKIAorLyogT01BUDQtc3BlY2lmaWMgVlAgZnVuY3Rpb25zICovCit1MzIgb21hcDRfcHJtX3ZwX2NoZWNrX3R4ZG9uZSh1OCB2cF9pZCk7Cit2b2lkIG9tYXA0X3BybV92cF9jbGVhcl90eGRvbmUodTggdnBfaWQpOworCisvKgorICogT01BUDQgYWNjZXNzIGZ1bmN0aW9ucyBmb3Igdm9sdGFnZSBjb250cm9sbGVyIChWQykgYW5kCisgKiB2b2x0YWdlIHByb2NjZXNzb3IgKFZQKSBpbiB0aGUgUFJNLgorICovCitleHRlcm4gdTMyIG9tYXA0X3BybV92Y3ZwX3JlYWQodTggb2Zmc2V0KTsKK2V4dGVybiB2b2lkIG9tYXA0X3BybV92Y3ZwX3dyaXRlKHUzMiB2YWwsIHU4IG9mZnNldCk7CitleHRlcm4gdTMyIG9tYXA0X3BybV92Y3ZwX3Jtdyh1MzIgbWFzaywgdTMyIGJpdHMsIHU4IG9mZnNldCk7CisKICMgZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NkcmMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5jCmluZGV4IGRhNmYzYTYuLjhmMjc4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2RyYy5jCkBAIC0xMTcsMTUgKzExNywxMCBAQAogCiB2b2lkIF9faW5pdCBvbWFwMl9zZXRfZ2xvYmFsc19zZHJjKHN0cnVjdCBvbWFwX2dsb2JhbHMgKm9tYXAyX2dsb2JhbHMpCiB7Ci0JLyogU3RhdGljIG1hcHBpbmcsIG5ldmVyIHJlbGVhc2VkICovCi0JaWYgKG9tYXAyX2dsb2JhbHMtPnNkcmMpIHsKLQkJb21hcDJfc2RyY19iYXNlID0gaW9yZW1hcChvbWFwMl9nbG9iYWxzLT5zZHJjLCBTWl82NEspOwotCQlXQVJOX09OKCFvbWFwMl9zZHJjX2Jhc2UpOwotCX0KLQlpZiAob21hcDJfZ2xvYmFscy0+c21zKSB7Ci0JCW9tYXAyX3Ntc19iYXNlID0gaW9yZW1hcChvbWFwMl9nbG9iYWxzLT5zbXMsIFNaXzY0Syk7Ci0JCVdBUk5fT04oIW9tYXAyX3Ntc19iYXNlKTsKLQl9CisJaWYgKG9tYXAyX2dsb2JhbHMtPnNkcmMpCisJCW9tYXAyX3NkcmNfYmFzZSA9IG9tYXAyX2dsb2JhbHMtPnNkcmM7CisJaWYgKG9tYXAyX2dsb2JhbHMtPnNtcykKKwkJb21hcDJfc21zX2Jhc2UgPSBvbWFwMl9nbG9iYWxzLT5zbXM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKaW5kZXggNDY2ZmM3MjIuLjk5OTJkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYwpAQCAtMTA3LDI4ICsxMDcsNiBAQAogc3RhdGljIExJU1RfSEVBRCh1YXJ0X2xpc3QpOwogc3RhdGljIHU4IG51bV91YXJ0czsKIAotc3RhdGljIGludCB1YXJ0X2lkbGVfaHdtb2Qoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKLXsKLQlvbWFwX2h3bW9kX2lkbGUob2QtPmh3bW9kc1swXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1YXJ0X2VuYWJsZV9od21vZChzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKQotewotCW9tYXBfaHdtb2RfZW5hYmxlKG9kLT5od21vZHNbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX3VhcnRfbGF0ZW5jeVtdID0gewotCXsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IHVhcnRfaWRsZV9od21vZCwKLQkJLmFjdGl2YXRlX2Z1bmMJID0gdWFydF9lbmFibGVfaHdtb2QsCi0JCS5mbGFncyA9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fc2VyaWFsX3JlYWRfcmVnKHN0cnVjdCB1YXJ0X3BvcnQgKnVwLAogCQkJCQkgICAgIGludCBvZmZzZXQpCiB7CkBAIC03MTEsNyArNjg5LDcgQEAKIHsKIAlzdHJ1Y3Qgb21hcF91YXJ0X3N0YXRlICp1YXJ0OwogCXN0cnVjdCBvbWFwX2h3bW9kICpvaDsKLQlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJdm9pZCAqcGRhdGEgPSBOVUxMOwogCXUzMiBwZGF0YV9zaXplID0gMDsKIAljaGFyICpuYW1lOwpAQCAtNzk5LDIwICs3NzcsMTkgQEAKIAlpZiAoV0FSTl9PTighb2gpKQogCQlyZXR1cm47CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIHVhcnQtPm51bSwgb2gsIHBkYXRhLCBwZGF0YV9zaXplLAotCQkJICAgICAgIG9tYXBfdWFydF9sYXRlbmN5LAotCQkJICAgICAgIEFSUkFZX1NJWkUob21hcF91YXJ0X2xhdGVuY3kpLCBmYWxzZSk7Ci0JV0FSTihJU19FUlIob2QpLCAiQ291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczogJXMuXG4iLAorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCB1YXJ0LT5udW0sIG9oLCBwZGF0YSwgcGRhdGFfc2l6ZSwKKwkJCQkgTlVMTCwgMCwgZmFsc2UpOworCVdBUk4oSVNfRVJSKHBkZXYpLCAiQ291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlczogJXMuXG4iLAogCSAgICAgbmFtZSwgb2gtPm5hbWUpOwogCi0Jb21hcF9kZXZpY2VfZGlzYWJsZV9pZGxlX29uX3N1c3BlbmQob2QpOworCW9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKHBkZXYpOwogCW9oLT5tdXggPSBvbWFwX2h3bW9kX211eF9pbml0KGJkYXRhLT5wYWRzLCBiZGF0YS0+cGFkc19jbnQpOwogCiAJdWFydC0+aXJxID0gb2gtPm1wdV9pcnFzWzBdLmlycTsKIAl1YXJ0LT5yZWdzaGlmdCA9IDI7CiAJdWFydC0+bWFwYmFzZSA9IG9oLT5zbGF2ZXNbMF0tPmFkZHItPnBhX3N0YXJ0OwogCXVhcnQtPm1lbWJhc2UgPSBvbWFwX2h3bW9kX2dldF9tcHVfcnRfdmEob2gpOwotCXVhcnQtPnBkZXYgPSAmb2QtPnBkZXY7CisJdWFydC0+cGRldiA9IHBkZXY7CiAKIAlvaC0+ZGV2X2F0dHIgPSB1YXJ0OwogCkBAIC04NDYsOCArODIzLDggQEAKIAogCWlmICgoY3B1X2lzX29tYXAzNHh4KCkgJiYgdWFydC0+cGFkY29uZikgfHwKIAkgICAgKHVhcnQtPndrX2VuICYmIHVhcnQtPndrX21hc2spKSB7Ci0JCWRldmljZV9pbml0X3dha2V1cCgmb2QtPnBkZXYuZGV2LCB0cnVlKTsKLQkJREVWX0NSRUFURV9GSUxFKCZvZC0+cGRldi5kZXYsICZkZXZfYXR0cl9zbGVlcF90aW1lb3V0KTsKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIHRydWUpOworCQlERVZfQ1JFQVRFX0ZJTEUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3NsZWVwX3RpbWVvdXQpOwogCX0KIAogCS8qIEVuYWJsZSB0aGUgTURSMSBlcnJhdGEgZm9yIE9NQVAzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LWNsYXNzMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC1jbGFzczMuYwppbmRleCBmNDM4Y2Y0Li41M2Q5ZDBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LWNsYXNzMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXgtY2xhc3MzLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogc3RhdGljIGludCBzcl9jbGFzczNfZW5hYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCiB7Ci0JdW5zaWduZWQgbG9uZyB2b2x0ID0gb21hcF92b2x0YWdlX2dldF9ub21fdm9sdCh2b2x0ZG0pOworCXVuc2lnbmVkIGxvbmcgdm9sdCA9IHZvbHRkbV9nZXRfdm9sdGFnZSh2b2x0ZG0pOwogCiAJaWYgKCF2b2x0KSB7CiAJCXByX3dhcm5pbmcoIiVzOiBDdXJyIHZvbHRhZ2UgdW5rbm93bi4gQ2Fubm90IGVuYWJsZSBzcl8lc1xuIiwKQEAgLTMyLDcgKzMyLDcgQEAKIAlvbWFwX3ZwX2Rpc2FibGUodm9sdGRtKTsKIAlzcl9kaXNhYmxlKHZvbHRkbSk7CiAJaWYgKGlzX3ZvbHRfcmVzZXQpCi0JCW9tYXBfdm9sdGFnZV9yZXNldCh2b2x0ZG0pOworCQl2b2x0ZG1fcmVzZXQodm9sdGRtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zbWFydHJlZmxleC5jCmluZGV4IGY0OTgwNGYuLjZhNGY2ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc21hcnRyZWZsZXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NtYXJ0cmVmbGV4LmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtNjIsNiArNjMsNyBAQAogCiBzdGF0aWMgc3RydWN0IG9tYXBfc3JfY2xhc3NfZGF0YSAqc3JfY2xhc3M7CiBzdGF0aWMgc3RydWN0IG9tYXBfc3JfcG1pY19kYXRhICpzcl9wbWljX2RhdGE7CitzdGF0aWMgc3RydWN0IGRlbnRyeQkJKnNyX2RiZ19kaXI7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcl93cml0ZV9yZWcoc3RydWN0IG9tYXBfc3IgKnNyLCB1bnNpZ25lZCBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKQEAgLTgyNiw5ICs4MjgsMTAgQEAKIAlzdHJ1Y3Qgb21hcF9zciAqc3JfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX3NyKSwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IG9tYXBfc3JfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlycTsKLQlzdHJ1Y3QgZGVudHJ5ICp2ZGRfZGJnX2RpciwgKm52YWx1ZV9kaXI7CisJc3RydWN0IGRlbnRyeSAqbnZhbHVlX2RpcjsKIAlzdHJ1Y3Qgb21hcF92b2x0X2RhdGEgKnZvbHRfZGF0YTsKIAlpbnQgaSwgcmV0ID0gMDsKKwljaGFyICpuYW1lOwogCiAJaWYgKCFzcl9pbmZvKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgc3JfaW5mb1xuIiwKQEAgLTg5OSwxOCArOTAyLDI1IEBACiAJfQogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBTbWFydFJlZmxleCBkcml2ZXIgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKLQotCS8qCi0JICogSWYgdGhlIHZvbHRhZ2UgZG9tYWluIGRlYnVnZnMgZGlyZWN0b3J5IGlzIG5vdCBjcmVhdGVkLCBkbwotCSAqIG5vdCB0cnkgdG8gY3JlYXRlIHJlc3Qgb2YgdGhlIGRlYnVnZnMgZW50cmllcy4KLQkgKi8KLQl2ZGRfZGJnX2RpciA9IG9tYXBfdm9sdGFnZV9nZXRfZGJnZGlyKHNyX2luZm8tPnZvbHRkbSk7Ci0JaWYgKCF2ZGRfZGJnX2RpcikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9pb3VubWFwOworCWlmICghc3JfZGJnX2RpcikgeworCQlzcl9kYmdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJzbWFydHJlZmxleCIsIE5VTEwpOworCQlpZiAoIXNyX2RiZ19kaXIpIHsKKwkJCXJldCA9IFBUUl9FUlIoc3JfZGJnX2Rpcik7CisJCQlwcl9lcnIoIiVzOnNyIGRlYnVnZnMgZGlyIGNyZWF0aW9uIGZhaWxlZCglZClcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCQlnb3RvIGVycl9pb3VubWFwOworCQl9CiAJfQogCi0Jc3JfaW5mby0+ZGJnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic21hcnRyZWZsZXgiLCB2ZGRfZGJnX2Rpcik7CisJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAic3JfJXMiLCBzcl9pbmZvLT52b2x0ZG0tPm5hbWUpOworCWlmICghbmFtZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGFsbG9jIGRlYnVnZnMgbmFtZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisJc3JfaW5mby0+ZGJnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBzcl9kYmdfZGlyKTsKKwlrZnJlZShuYW1lKTsKIAlpZiAoSVNfRVJSKHNyX2luZm8tPmRiZ19kaXIpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iLAogCQkJX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcl9kZXZpY2UuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc3JfZGV2aWNlLmMKaW5kZXggMTBkM2M1ZS4uOWY0M2ZjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcl9kZXZpY2UuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NyX2RldmljZS5jCkBAIC0zMSwxNCArMzEsNiBAQAogCiBzdGF0aWMgYm9vbCBzcl9lbmFibGVfb25faW5pdDsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfc3JfbGF0ZW5jeVtdID0gewotCXsKLQkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYwkgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNUCi0JfSwKLX07Ci0KIC8qIFJlYWQgRUZVU0UgdmFsdWVzIGZyb20gY29udHJvbCByZWdpc3RlcnMgZm9yIE9NQVAzNDMwICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc3Jfc2V0X252YWx1ZXMoc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGEsCiAJCQkJc3RydWN0IG9tYXBfc3JfZGF0YSAqc3JfZGF0YSkKQEAgLTgwLDcgKzcyLDcgQEAKIHN0YXRpYyBpbnQgc3JfZGV2X2luaXQoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1c2VyKQogewogCXN0cnVjdCBvbWFwX3NyX2RhdGEgKnNyX2RhdGE7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqdm9sdF9kYXRhOwogCWNoYXIgKm5hbWUgPSAic21hcnRyZWZsZXgiOwogCXN0YXRpYyBpbnQgaTsKQEAgLTEwMiw3ICs5NCw3IEBACiAJc3JfZGF0YS0+c2Vubl9tb2QgPSAweDE7CiAJc3JfZGF0YS0+c2VucF9tb2QgPSAweDE7CiAKLQlzcl9kYXRhLT52b2x0ZG0gPSBvbWFwX3ZvbHRhZ2VfZG9tYWluX2xvb2t1cChvaC0+dmRkX25hbWUpOworCXNyX2RhdGEtPnZvbHRkbSA9IHZvbHRkbV9sb29rdXAob2gtPnZkZF9uYW1lKTsKIAlpZiAoSVNfRVJSKHNyX2RhdGEtPnZvbHRkbSkpIHsKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCB2b2x0YWdlIGRvbWFpbiBwb2ludGVyIGZvciBWREQgJXNcbiIsCiAJCQlfX2Z1bmNfXywgb2gtPnZkZF9uYW1lKTsKQEAgLTEyMCwxMCArMTEyLDkgQEAKIAogCXNyX2RhdGEtPmVuYWJsZV9vbl9pbml0ID0gc3JfZW5hYmxlX29uX2luaXQ7CiAKLQlvZCA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGksIG9oLCBzcl9kYXRhLCBzaXplb2YoKnNyX2RhdGEpLAotCQkJICAgICAgIG9tYXBfc3JfbGF0ZW5jeSwKLQkJCSAgICAgICBBUlJBWV9TSVpFKG9tYXBfc3JfbGF0ZW5jeSksIDApOwotCWlmIChJU19FUlIob2QpKQorCXBkZXYgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBpLCBvaCwgc3JfZGF0YSwgc2l6ZW9mKCpzcl9kYXRhKSwKKwkJCQkgTlVMTCwgMCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkKIAkJcHJfd2FybmluZygiJXM6IENvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXM6ICVzLlxuXG4iLAogCQkJX19mdW5jX18sIG5hbWUsIG9oLT5uYW1lKTsKIGV4aXQ6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3RpbWVyLmMKaW5kZXggY2YxZGU3ZC4uMDM3YjBkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdGltZXIuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KQEAgLTQyLDYgKzQzLDEwIEBACiAjaW5jbHVkZSA8YXNtL3NjaGVkX2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KICNpbmNsdWRlIDxwbGF0L29tYXBfaHdtb2QuaD4KKyNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CisjaW5jbHVkZSA8cGxhdC9vbWFwLXBtLmg+CisKKyNpbmNsdWRlICJwb3dlcmRvbWFpbi5oIgogCiAvKiBQYXJlbnQgY2xvY2tzLCBldmVudHVhbGx5IHRoZXNlIHdpbGwgY29tZSBmcm9tIHRoZSBjbG9jayBmcmFtZXdvcmsgKi8KIApAQCAtNjcsNyArNzIsNyBAQAogLyogTUFYX0dQVElNRVJfSUQ6IG51bWJlciBvZiBHUFRJTUVScyBvbiB0aGUgY2hpcCAqLwogI2RlZmluZSBNQVhfR1BUSU1FUl9JRAkJMTIKIAotdTMyIHN5c190aW1lcl9yZXNlcnZlZDsKK3N0YXRpYyB1MzIgc3lzX3RpbWVyX3Jlc2VydmVkOwogCiAvKiBDbG9ja2V2ZW50IGNvZGUgKi8KIApAQCAtNzgsNyArODMsNyBAQAogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZjbG9ja2V2ZW50X2dwdDsKIAotCV9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoY2xrZXYuaW9fYmFzZSwgT01BUF9USU1FUl9JTlRfT1ZFUkZMT1cpOworCV9fb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoJmNsa2V2LCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CiAKIAlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC05Myw3ICs5OCw3IEBACiBzdGF0aWMgaW50IG9tYXAyX2dwX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAogCQkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KGNsa2V2LmlvX2Jhc2UsIE9NQVBfVElNRVJfQ1RSTF9TVCwKKwlfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydCgmY2xrZXYsIE9NQVBfVElNRVJfQ1RSTF9TVCwKIAkJCQkJCTB4ZmZmZmZmZmYgLSBjeWNsZXMsIDEpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDQsMTYgKzEwOSwxNiBAQAogewogCXUzMiBwZXJpb2Q7CiAKLQlfX29tYXBfZG1fdGltZXJfc3RvcChjbGtldi5pb19iYXNlLCAxLCBjbGtldi5yYXRlKTsKKwlfX29tYXBfZG1fdGltZXJfc3RvcCgmY2xrZXYsIDEsIGNsa2V2LnJhdGUpOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKIAkJcGVyaW9kID0gY2xrZXYucmF0ZSAvIEhaOwogCQlwZXJpb2QgLT0gMTsKIAkJLyogTG9va3MgbGlrZSB3ZSBuZWVkIHRvIGZpcnN0IHNldCB0aGUgbG9hZCB2YWx1ZSBzZXBhcmF0ZWx5ICovCi0JCV9fb21hcF9kbV90aW1lcl93cml0ZShjbGtldi5pb19iYXNlLCBPTUFQX1RJTUVSX0xPQURfUkVHLAorCQlfX29tYXBfZG1fdGltZXJfd3JpdGUoJmNsa2V2LCBPTUFQX1RJTUVSX0xPQURfUkVHLAogCQkJCQkweGZmZmZmZmZmIC0gcGVyaW9kLCAxKTsKLQkJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoY2xrZXYuaW9fYmFzZSwKKwkJX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoJmNsa2V2LAogCQkJCQlPTUFQX1RJTUVSX0NUUkxfQVIgfCBPTUFQX1RJTUVSX0NUUkxfU1QsCiAJCQkJCQkweGZmZmZmZmZmIC0gcGVyaW9kLCAxKTsKIAkJYnJlYWs7CkBAIC0xODksNyArMTk0LDggQEAKIAkJCWNsa19wdXQoc3JjKTsKIAkJfQogCX0KLQlfX29tYXBfZG1fdGltZXJfcmVzZXQodGltZXItPmlvX2Jhc2UsIDEsIDEpOworCV9fb21hcF9kbV90aW1lcl9pbml0X3JlZ3ModGltZXIpOworCV9fb21hcF9kbV90aW1lcl9yZXNldCh0aW1lciwgMSwgMSk7CiAJdGltZXItPnBvc3RlZCA9IDE7CiAKIAl0aW1lci0+cmF0ZSA9IGNsa19nZXRfcmF0ZSh0aW1lci0+ZmNsayk7CkBAIC0yMTAsNyArMjE2LDcgQEAKIAlvbWFwMl9ncF90aW1lcl9pcnEuZGV2X2lkID0gKHZvaWQgKikmY2xrZXY7CiAJc2V0dXBfaXJxKGNsa2V2LmlycSwgJm9tYXAyX2dwX3RpbWVyX2lycSk7CiAKLQlfX29tYXBfZG1fdGltZXJfaW50X2VuYWJsZShjbGtldi5pb19iYXNlLCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CisJX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUoJmNsa2V2LCBPTUFQX1RJTUVSX0lOVF9PVkVSRkxPVyk7CiAKIAljbG9ja2V2ZW50X2dwdC5tdWx0ID0gZGl2X3NjKGNsa2V2LnJhdGUsIE5TRUNfUEVSX1NFQywKIAkJCQkgICAgIGNsb2NrZXZlbnRfZ3B0LnNoaWZ0KTsKQEAgLTI1MSw3ICsyNTcsNyBAQAogc3RhdGljIERFRklORV9DTE9DS19EQVRBKGNkKTsKIHN0YXRpYyBjeWNsZV90IGNsb2Nrc291cmNlX3JlYWRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7Ci0JcmV0dXJuIChjeWNsZV90KV9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoY2xrc3JjLmlvX2Jhc2UsIDEpOworCXJldHVybiAoY3ljbGVfdClfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKCZjbGtzcmMsIDEpOwogfQogCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2dwdCA9IHsKQEAgLTI2Niw3ICsyNzIsNyBAQAogewogCXUzMiBjeWM7CiAKLQljeWMgPSBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKGNsa3NyYy5pb19iYXNlLCAxKTsKKwljeWMgPSBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKCZjbGtzcmMsIDEpOwogCiAJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKIH0KQEAgLTI3Niw3ICsyODIsNyBAQAogCXUzMiBjeWMgPSAwOwogCiAJaWYgKGNsa3NyYy5yZXNlcnZlZCkKLQkJY3ljID0gX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcihjbGtzcmMuaW9fYmFzZSwgMSk7CisJCWN5YyA9IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoJmNsa3NyYywgMSk7CiAKIAlyZXR1cm4gY3ljX3RvX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKIH0KQEAgLTI5Myw3ICsyOTksNyBAQAogCXByX2luZm8oIk9NQVAgY2xvY2tzb3VyY2U6IEdQVElNRVIlZCBhdCAlbHUgSHpcbiIsCiAJCWdwdGltZXJfaWQsIGNsa3NyYy5yYXRlKTsKIAotCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KGNsa3NyYy5pb19iYXNlLAorCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KCZjbGtzcmMsCiAJCQlPTUFQX1RJTUVSX0NUUkxfU1QgfCBPTUFQX1RJTUVSX0NUUkxfQVIsIDAsIDEpOwogCWluaXRfc2NoZWRfY2xvY2soJmNkLCBkbXRpbWVyX3VwZGF0ZV9zY2hlZF9jbG9jaywgMzIsIGNsa3NyYy5yYXRlKTsKIApAQCAtMzQxLDMgKzM0NywxNTcgQEAKIH0KIE9NQVBfU1lTX1RJTUVSKDQpCiAjZW5kaWYKKworLyoqCisgKiBvbWFwMl9kbV90aW1lcl9zZXRfc3JjIC0gY2hhbmdlIHRoZSB0aW1lciBpbnB1dCBjbG9jayBzb3VyY2UKKyAqIEBwZGV2Ogl0aW1lciBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgorICogQHNvdXJjZToJYXJyYXkgaW5kZXggb2YgcGFyZW50IGNsb2NrIHNvdXJjZQorICovCitzdGF0aWMgaW50IG9tYXAyX2RtX3RpbWVyX3NldF9zcmMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHNvdXJjZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGNsayAqZmNsaywgKnBhcmVudDsKKwljaGFyICpwYXJlbnRfbmFtZSA9IE5VTEw7CisKKwlmY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGZjbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiAlZDogY2xrX2dldCgpIEZBSUxFRFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgT01BUF9USU1FUl9TUkNfU1lTX0NMSzoKKwkJcGFyZW50X25hbWUgPSAic3lzX2NrIjsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfVElNRVJfU1JDXzMyX0tIWjoKKwkJcGFyZW50X25hbWUgPSAiMzJrX2NrIjsKKwkJYnJlYWs7CisKKwljYXNlIE9NQVBfVElNRVJfU1JDX0VYVF9DTEs6CisJCWlmIChwZGF0YS0+dGltZXJfaXBfdmVyc2lvbiA9PSBPTUFQX1RJTUVSX0lQX1ZFUlNJT05fMSkgeworCQkJcGFyZW50X25hbWUgPSAiYWx0X2NrIjsKKwkJCWJyZWFrOworCQl9CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiAlZDogaW52YWxpZCBjbGsgc3JjLlxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWNsa19wdXQoZmNsayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhcmVudCA9IGNsa19nZXQoJnBkZXYtPmRldiwgcGFyZW50X25hbWUpOworCWlmIChJU19FUlJfT1JfTlVMTChwYXJlbnQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiAlZDogY2xrX2dldCgpICVzIEZBSUxFRFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcGFyZW50X25hbWUpOworCQljbGtfcHV0KGZjbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBjbGtfc2V0X3BhcmVudChmY2xrLCBwYXJlbnQpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY2xrX3NldF9wYXJlbnQoKSB0byAlcyBGQUlMRURcbiIsCisJCQlfX2Z1bmNfXywgcGFyZW50X25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWNsa19wdXQocGFyZW50KTsKKwljbGtfcHV0KGZjbGspOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBvbWFwX3RpbWVyX2luaXQgLSBidWlsZCBhbmQgcmVnaXN0ZXIgdGltZXIgZGV2aWNlIHdpdGggYW4KKyAqIGFzc29jaWF0ZWQgdGltZXIgaHdtb2QKKyAqIEBvaDoJdGltZXIgaHdtb2QgcG9pbnRlciB0byBiZSB1c2VkIHRvIGJ1aWxkIHRpbWVyIGRldmljZQorICogQHVzZXI6CXBhcmFtZXRlciB0aGF0IGNhbiBiZSBwYXNzZWQgZnJvbSBjYWxsaW5nIGh3bW9kIEFQSQorICoKKyAqIENhbGxlZCBieSBvbWFwX2h3bW9kX2Zvcl9lYWNoX2J5X2NsYXNzIHRvIHJlZ2lzdGVyIGVhY2ggb2YgdGhlIHRpbWVyCisgKiBkZXZpY2VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4gVGhlIG51bWJlciBvZiB0aW1lciBkZXZpY2VzIGlzIGtub3duCisgKiBieSBwYXJzaW5nIHRocm91Z2ggdGhlIGh3bW9kIGRhdGFiYXNlIGZvciBhIGdpdmVuIGNsYXNzIG5hbWUuIEF0IHRoZQorICogZW5kIG9mIGZ1bmN0aW9uIGNhbGwgbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGltZXIgZGV2aWNlIGFuZCBpdCBpcworICogcmVnaXN0ZXJlZCB0byB0aGUgZnJhbWV3b3JrIHJlYWR5IHRvIGJlIHByb3ZlZCBieSB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX3RpbWVyX2luaXQoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICp1bnVzZWQpCit7CisJaW50IGlkOworCWludCByZXQgPSAwOworCWNoYXIgKm5hbWUgPSAib21hcF90aW1lciI7CisJc3RydWN0IGRtdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3Qgb21hcF90aW1lcl9jYXBhYmlsaXR5X2Rldl9hdHRyICp0aW1lcl9kZXZfYXR0cjsKKwlzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtOworCisJcHJfZGVidWcoIiVzOiAlc1xuIiwgX19mdW5jX18sIG9oLT5uYW1lKTsKKworCS8qIG9uIHNlY3VyZSBkZXZpY2UsIGRvIG5vdCByZWdpc3RlciBzZWN1cmUgdGltZXIgKi8KKwl0aW1lcl9kZXZfYXR0ciA9IG9oLT5kZXZfYXR0cjsKKwlpZiAob21hcF90eXBlKCkgIT0gT01BUDJfREVWSUNFX1RZUEVfR1AgJiYgdGltZXJfZGV2X2F0dHIpCisJCWlmICh0aW1lcl9kZXZfYXR0ci0+dGltZXJfY2FwYWJpbGl0eSA9PSBPTUFQX1RJTUVSX1NFQ1VSRSkKKwkJCXJldHVybiByZXQ7CisKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpIHsKKwkJcHJfZXJyKCIlczogTm8gbWVtb3J5IGZvciBbJXNdXG4iLCBfX2Z1bmNfXywgb2gtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIEV4dHJhY3QgdGhlIElEcyBmcm9tIG5hbWUgZmllbGQgaW4gaHdtb2QgZGF0YWJhc2UKKwkgKiBhbmQgdXNlIHRoZSBzYW1lIGZvciBjb25zdHJ1Y3RpbmcgaWRzJyBmb3IgdGhlCisJICogdGltZXIgZGV2aWNlcy4gSW4gYSB3YXksIHdlIGFyZSBhdm9pZGluZyB1c2FnZSBvZgorCSAqIHN0YXRpYyB2YXJpYWJsZSB3aXRpbiB0aGUgZnVuY3Rpb24gdG8gZG8gdGhlIHNhbWUuCisJICogQ0FVVElPTjogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGFuZCBtYWtlIHN1cmUgdGhlCisJICogbmFtZSBpbiBod21vZCBkYXRhYmFzZSBkb2VzIG5vdCBjaGFuZ2UgaW4gd2hpY2ggY2FzZQorCSAqIHdlIG1pZ2h0IGVpdGhlciBtYWtlIGNvcnJlc3BvbmRpbmcgY2hhbmdlIGhlcmUgb3IKKwkgKiBzd2l0Y2ggYmFjayBzdGF0aWMgdmFyaWFibGUgbWVjaGFuaXNtLgorCSAqLworCXNzY2FuZihvaC0+bmFtZSwgInRpbWVyJTJkIiwgJmlkKTsKKworCXBkYXRhLT5zZXRfdGltZXJfc3JjID0gb21hcDJfZG1fdGltZXJfc2V0X3NyYzsKKwlwZGF0YS0+dGltZXJfaXBfdmVyc2lvbiA9IG9oLT5jbGFzcy0+cmV2OworCisJLyogTWFyayBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCB0aW1lcnMgYXMgcmVzZXJ2ZWQgKi8KKwlpZiAoKHN5c190aW1lcl9yZXNlcnZlZCA+PiAoaWQgLSAxKSkgJiAweDEpCisJCXBkYXRhLT5yZXNlcnZlZCA9IDE7CisKKwlwd3JkbSA9IG9tYXBfaHdtb2RfZ2V0X3B3cmRtKG9oKTsKKwlwZGF0YS0+bG9zZXNfY29udGV4dCA9IHB3cmRtX2Nhbl9ldmVyX2xvc2VfY29udGV4dChwd3JkbSk7CisjaWZkZWYgQ09ORklHX1BNCisJcGRhdGEtPmdldF9jb250ZXh0X2xvc3NfY291bnQgPSBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50OworI2VuZGlmCisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGlkLCBvaCwgcGRhdGEsIHNpemVvZigqcGRhdGEpLAorCQkJCSBOVUxMLCAwLCAwKTsKKworCWlmIChJU19FUlIocGRldikpIHsKKwkJcHJfZXJyKCIlczogQ2FuJ3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzOiAlcy5cbiIsCisJCQlfX2Z1bmNfXywgbmFtZSwgb2gtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWtmcmVlKHBkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb21hcDJfZG1fdGltZXJfaW5pdCAtIHRvcCBsZXZlbCByZWd1bGFyIGRldmljZSBpbml0aWFsaXphdGlvbgorICoKKyAqIFVzZXMgZGVkaWNhdGVkIGh3bW9kIGFwaSB0byBwYXJzZSB0aHJvdWdoIGh3bW9kIGRhdGFiYXNlIGZvcgorICogZ2l2ZW4gY2xhc3MgbmFtZSBhbmQgdGhlbiBidWlsZCBhbmQgcmVnaXN0ZXIgdGhlIHRpbWVyIGRldmljZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgb21hcDJfZG1fdGltZXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvbWFwX2h3bW9kX2Zvcl9lYWNoX2J5X2NsYXNzKCJ0aW1lciIsIG9tYXBfdGltZXJfaW5pdCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCIlczogZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChvbWFwMl9kbV90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi90d2wtY29tbW9uLmMKaW5kZXggZGFhMDU2ZS4uNTIyNDM1NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCkBAIC05OSw3ICs5OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwM192cGxsMl9zdXBwbGllc1tdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaTEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaS4wIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDNfdnBsbDJfaWRhdGEgPSB7CkBAIC0yMzUsNiArMjM1LDEyIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBvbWFwNF92Y3hpb19zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzcyIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3NfZHNpLjAiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RzaS4xIiksCit9OworCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfdmN4aW9faWRhdGEgPSB7CiAJLmNvbnN0cmFpbnRzID0gewogCQkubWluX3VWCQkJPSAxODAwMDAwLApAQCAtMjQzLDcgKzI0OSwxMCBAQAogCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJLmFsd2F5c19vbgkJPSB0cnVlLAogCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUob21hcDRfdmN4aW9fc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSBvbWFwNF92Y3hpb19zdXBwbHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgb21hcDRfdnVzYl9pZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLW11c2IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLW11c2IuYwppbmRleCAxOWU0ZGFjLi4yNjc5NzUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi1tdXNiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItbXVzYi5jCkBAIC02MCw1MiArNjAsNiBAQAogCiBzdGF0aWMgdTY0IG11c2JfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX211c2JfbGF0ZW5jeVtdID0gewotCXsKLQkJLmRlYWN0aXZhdGVfZnVuYwk9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAotCQkuYWN0aXZhdGVfZnVuYwkJPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAotCQkuZmxhZ3MJCQk9IE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIHVzYl9tdXNiX211eF9pbml0KHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSAqYm9hcmRfZGF0YSkKLXsKLQlzd2l0Y2ggKGJvYXJkX2RhdGEtPmludGVyZmFjZV90eXBlKSB7Ci0JY2FzZSBNVVNCX0lOVEVSRkFDRV9VVE1JOgotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfb3RnX2RwIiwgT01BUF9QSU5fSU5QVVQpOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfb3RnX2RtIiwgT01BUF9QSU5fSU5QVVQpOwotCQlicmVhazsKLQljYXNlIE1VU0JfSU5URVJGQUNFX1VMUEk6Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2NsayIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X3N0cCIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RpciIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X254dCIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RhdDAiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQxIiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX3VscGlwaHlfZGF0MiIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RhdDMiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQ0IiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJb21hcF9tdXhfaW5pdF9zaWduYWwoInVzYmEwX3VscGlwaHlfZGF0NSIsCi0JCQkJCQlPTUFQX1BJTl9JTlBVVF9QVUxMRE9XTik7Ci0JCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJ1c2JhMF91bHBpcGh5X2RhdDYiLAotCQkJCQkJT01BUF9QSU5fSU5QVVRfUFVMTERPV04pOwotCQlvbWFwX211eF9pbml0X3NpZ25hbCgidXNiYTBfdWxwaXBoeV9kYXQ3IiwKLQkJCQkJCU9NQVBfUElOX0lOUFVUX1BVTExET1dOKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfbXVzYl9ib2FyZF9kYXRhIG11c2JfZGVmYXVsdF9ib2FyZF9kYXRhID0gewogCS5pbnRlcmZhY2VfdHlwZQkJPSBNVVNCX0lOVEVSRkFDRV9VTFBJLAogCS5tb2RlCQkJPSBNVVNCX09URywKQEAgLTExNSw3ICs2OSw2IEBACiB2b2lkIF9faW5pdCB1c2JfbXVzYl9pbml0KHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSAqbXVzYl9ib2FyZF9kYXRhKQogewogCXN0cnVjdCBvbWFwX2h3bW9kCQkqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlCQkqb2Q7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJaW50CQkJCWJ1c19pZCA9IC0xOwpAQCAtMTQ1LDIyICs5OCwxOSBAQAogCQluYW1lID0gIm11c2Itb21hcDI0MzAiOwogCX0KIAotCW9oID0gb21hcF9od21vZF9sb29rdXAob2hfbmFtZSk7Ci0JaWYgKCFvaCkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBsb29rIHVwICVzXG4iLCBvaF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KKyAgICAgICAgb2ggPSBvbWFwX2h3bW9kX2xvb2t1cChvaF9uYW1lKTsKKyAgICAgICAgaWYgKFdBUk4oIW9oLCAiJXM6IGNvdWxkIG5vdCBmaW5kIG9tYXBfaHdtb2QgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb2hfbmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBidXNfaWQsIG9oLCAmbXVzYl9wbGF0LAotCQkJICAgICAgIHNpemVvZihtdXNiX3BsYXQpLCBvbWFwX211c2JfbGF0ZW5jeSwKLQkJCSAgICAgICBBUlJBWV9TSVpFKG9tYXBfbXVzYl9sYXRlbmN5KSwgZmFsc2UpOwotCWlmIChJU19FUlIob2QpKSB7CisJcGRldiA9IG9tYXBfZGV2aWNlX2J1aWxkKG5hbWUsIGJ1c19pZCwgb2gsICZtdXNiX3BsYXQsCisJCQkgICAgICAgc2l6ZW9mKG11c2JfcGxhdCksIE5VTEwsIDAsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CiAJCXByX2VycigiQ291bGQgbm90IGJ1aWxkIG9tYXBfZGV2aWNlIGZvciAlcyAlc1xuIiwKIAkJCQkJCW5hbWUsIG9oX25hbWUpOwogCQlyZXR1cm47CiAJfQogCi0JcGRldiA9ICZvZC0+cGRldjsKIAlkZXYgPSAmcGRldi0+ZGV2OwogCWdldF9kZXZpY2UoZGV2KTsKIAlkZXYtPmRtYV9tYXNrID0gJm11c2JfZG1hbWFzazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLXR1c2I2MDEwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3VzYi10dXNiNjAxMC5jCmluZGV4IDhkZDI2YjcuLjk5NGQ4ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdXNiLXR1c2I2MDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi91c2ItdHVzYjYwMTAuYwpAQCAtOCwxMSArOCwxMyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9tdXNiLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFkMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92Yy5jCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogT01BUCBWb2x0YWdlIENvbnRyb2xsZXIgKFZDKSBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCisjaW5jbHVkZSAidm9sdGFnZS5oIgorI2luY2x1ZGUgInZjLmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtMzR4eC5oIgorI2luY2x1ZGUgInBybS1yZWdiaXRzLTQ0eHguaCIKKyNpbmNsdWRlICJwcm00NHh4LmgiCisKKy8qKgorICogc3RydWN0IG9tYXBfdmNfY2hhbm5lbF9jZmcgLSBkZXNjcmliZSB0aGUgY2ZnX2NoYW5uZWwgYml0ZmllbGQKKyAqIEBzYTogYml0IGZvciBzbGF2ZSBhZGRyZXNzCisgKiBAcmF2OiBiaXQgZm9yIHZvbHRhZ2UgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICogQHJhYzogYml0IGZvciBjb21tYW5kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqIEByYWNlbjogZW5hYmxlIGJpdCBmb3IgUkFDCisgKiBAY21kOiBiaXQgZm9yIGNvbW1hbmQgdmFsdWUgc2V0IHNlbGVjdGlvbgorICoKKyAqIENoYW5uZWwgY29uZmlndXJhdGlvbiBiaXRzLCBjb21tb24gZm9yIE9NQVAzKworICogT01BUDMgcmVnaXN0ZXI6IFBSTV9WQ19DSF9DT05GCisgKiBPTUFQNCByZWdpc3RlcjogUFJNX1ZDX0NGR19DSEFOTkVMCisgKiBPTUFQNSByZWdpc3RlcjogUFJNX1ZDX1NNUFNfPHZvbHRkbT5fQ09ORklHCisgKi8KK3N0cnVjdCBvbWFwX3ZjX2NoYW5uZWxfY2ZnIHsKKwl1OCBzYTsKKwl1OCByYXY7CisJdTggcmFjOworCXU4IHJhY2VuOworCXU4IGNtZDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92Y19jaGFubmVsX2NmZyB2Y19kZWZhdWx0X2NoYW5uZWxfY2ZnID0geworCS5zYSAgICA9IEJJVCgwKSwKKwkucmF2ICAgPSBCSVQoMSksCisJLnJhYyAgID0gQklUKDIpLAorCS5yYWNlbiA9IEJJVCgzKSwKKwkuY21kICAgPSBCSVQoNCksCit9OworCisvKgorICogT24gT01BUDMrLCBhbGwgVkMgY2hhbm5lbHMgaGF2ZSB0aGUgYWJvdmUgZGVmYXVsdCBiaXRmaWVsZAorICogY29uZmlndXJhdGlvbiwgZXhjZXB0IHRoZSBPTUFQNCBNUFUgY2hhbm5lbC4gIFRoaXMgYXBwZWFycworICogdG8gYmUgYSBmcmVhayBhY2NpZGVudCBhcyBldmVyeSBvdGhlciBWQyBjaGFubmVsIGhhcyB0aGUKKyAqIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgdGh1cyBjcmVhdGluZyBhIG11dGFudCBjaGFubmVsIGNvbmZpZy4KKyAqLworc3RhdGljIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWxfY2ZnIHZjX211dGFudF9jaGFubmVsX2NmZyA9IHsKKwkuc2EgICAgPSBCSVQoMCksCisJLnJhdiAgID0gQklUKDIpLAorCS5yYWMgICA9IEJJVCgzKSwKKwkucmFjZW4gPSBCSVQoNCksCisJLmNtZCAgID0gQklUKDEpLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWxfY2ZnICp2Y19jZmdfYml0czsKKyNkZWZpbmUgQ0ZHX0NIQU5ORUxfTUFTSyAweDFmCisKKy8qKgorICogb21hcF92Y19jb25maWdfY2hhbm5lbCAtIGNvbmZpZ3VyZSBWQyBjaGFubmVsIHRvIFBNSUMgbWFwcGluZ3MKKyAqIEB2b2x0ZG06IHBvaW50ZXIgdG8gdm9sdGFnZG9tYWluIGRlZmluaW5nIHRoZSBkZXNpcmVkIFZDIGNoYW5uZWwKKyAqCisgKiBDb25maWd1cmVzIHRoZSBWQyBjaGFubmVsIHRvIFBNSUMgbWFwcGluZ3MgZm9yIHRoZSBmb2xsb3dpbmcKKyAqIFBNSUMgc2V0dGluZ3MKKyAqIC0gaTJjIHNsYXZlIGFkZHJlc3MgKFNBKQorICogLSB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyAoUkFWKQorICogLSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyAoUkFDKSBhbmQgZW5hYmxlIGJpdCAoUkFDRU4pCisgKiAtIGNvbW1hbmQgdmFsdWVzIGZvciBPTiwgT05MUCwgUkVUIGFuZCBPRkYgKENNRCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBvbmx5IGFsbG93cyBmbGV4aWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZQorICogbm9uLWRlZmF1bHQgY2hhbm5lbC4gIFN0YXJ0aW5nIHdpdGggT01BUDQsIHRoZXJlIGFyZSBtb3JlIHRoYW4gMgorICogY2hhbm5lbHMsIHdpdGggb25lIGRlZmluZWQgYXMgdGhlIGRlZmF1bHQgKG9uIE9NQVA0LCBpdCdzIE1QVS4pCisgKiBPbmx5IHRoZSBub24tZGVmYXVsdCBjaGFubmVsIGNhbiBiZSBjb25maWd1cmVkLgorICovCitzdGF0aWMgaW50IG9tYXBfdmNfY29uZmlnX2NoYW5uZWwoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdHJ1Y3Qgb21hcF92Y19jaGFubmVsICp2YyA9IHZvbHRkbS0+dmM7CisKKwkvKgorCSAqIEZvciBkZWZhdWx0IGNoYW5uZWwsIHRoZSBvbmx5IGNvbmZpZ3VyYWJsZSBiaXQgaXMgUkFDRU4uCisJICogQWxsIG90aGVycyBtdXN0IHN0YXkgYXQgemVybyAoc2VlIGZ1bmN0aW9uIGNvbW1lbnQgYWJvdmUuKQorCSAqLworCWlmICh2Yy0+ZmxhZ3MgJiBPTUFQX1ZDX0NIQU5ORUxfREVGQVVMVCkKKwkJdmMtPmNmZ19jaGFubmVsICY9IHZjX2NmZ19iaXRzLT5yYWNlbjsKKworCXZvbHRkbS0+cm13KENGR19DSEFOTkVMX01BU0sgPDwgdmMtPmNmZ19jaGFubmVsX3NhX3NoaWZ0LAorCQkgICAgdmMtPmNmZ19jaGFubmVsIDw8IHZjLT5jZmdfY2hhbm5lbF9zYV9zaGlmdCwKKwkJICAgIHZjLT5jZmdfY2hhbm5lbF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFZvbHRhZ2Ugc2NhbGUgYW5kIGFjY2Vzc29yeSBBUElzICovCitpbnQgb21hcF92Y19wcmVfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCwKKwkJICAgICAgdTggKnRhcmdldF92c2VsLCB1OCAqY3VycmVudF92c2VsKQoreworCXN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgKnZjID0gdm9sdGRtLT52YzsKKwl1MzIgdmNfY21kdmFsOworCisJLyogQ2hlY2sgaWYgc3VmZmljaWVudCBwbWljIGluZm8gaXMgYXZhaWxhYmxlIGZvciB0aGlzIHZkZCAqLworCWlmICghdm9sdGRtLT5wbWljKSB7CisJCXByX2VycigiJXM6IEluc3VmZmljaWVudCBwbWljIGluZm8gdG8gc2NhbGUgdGhlIHZkZF8lc1xuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCkgeworCQlwcl9lcnIoIiVzOiBQTUlDIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdm9sdGFnZSBpbiB1ViB0byIKKwkJCSJ2c2VsIG5vdCByZWdpc3RlcmVkLiBIZW5jZSB1bmFibGUgdG8gc2NhbGUgdm9sdGFnZSIKKwkJCSJmb3IgdmRkXyVzXG4iLCBfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKworCWlmICghdm9sdGRtLT5yZWFkIHx8ICF2b2x0ZG0tPndyaXRlKSB7CisJCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnRhcmdldF92c2VsID0gdm9sdGRtLT5wbWljLT51dl90b192c2VsKHRhcmdldF92b2x0KTsKKwkqY3VycmVudF92c2VsID0gdm9sdGRtLT5wbWljLT51dl90b192c2VsKHZvbHRkbS0+bm9taW5hbF92b2x0KTsKKworCS8qIFNldHRpbmcgdGhlIE9OIHZvbHRhZ2UgdG8gdGhlIG5ldyB0YXJnZXQgdm9sdGFnZSAqLworCXZjX2NtZHZhbCA9IHZvbHRkbS0+cmVhZCh2Yy0+Y21kdmFsX3JlZyk7CisJdmNfY21kdmFsICY9IH52Yy0+Y29tbW9uLT5jbWRfb25fbWFzazsKKwl2Y19jbWR2YWwgfD0gKCp0YXJnZXRfdnNlbCA8PCB2Yy0+Y29tbW9uLT5jbWRfb25fc2hpZnQpOworCXZvbHRkbS0+d3JpdGUodmNfY21kdmFsLCB2Yy0+Y21kdmFsX3JlZyk7CisKKwlvbWFwX3ZwX3VwZGF0ZV9lcnJvcmdhaW4odm9sdGRtLCB0YXJnZXRfdm9sdCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbWFwX3ZjX3Bvc3Rfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQsCisJCQl1OCB0YXJnZXRfdnNlbCwgdTggY3VycmVudF92c2VsKQoreworCXUzMiBzbXBzX3N0ZXBzID0gMCwgc21wc19kZWxheSA9IDA7CisKKwlzbXBzX3N0ZXBzID0gYWJzKHRhcmdldF92c2VsIC0gY3VycmVudF92c2VsKTsKKwkvKiBTTVBTIHNsZXcgcmF0ZSAvIHN0ZXAgc2l6ZS4gMnVzIGFkZGVkIGFzIGJ1ZmZlci4gKi8KKwlzbXBzX2RlbGF5ID0gKChzbXBzX3N0ZXBzICogdm9sdGRtLT5wbWljLT5zdGVwX3NpemUpIC8KKwkJCXZvbHRkbS0+cG1pYy0+c2xld19yYXRlKSArIDI7CisJdWRlbGF5KHNtcHNfZGVsYXkpOworfQorCisvKiB2Y19ieXBhc3Nfc2NhbGUgLSBWQyBieXBhc3MgbWV0aG9kIG9mIHZvbHRhZ2Ugc2NhbGluZyAqLworaW50IG9tYXBfdmNfYnlwYXNzX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCkKK3sKKwlzdHJ1Y3Qgb21hcF92Y19jaGFubmVsICp2YyA9IHZvbHRkbS0+dmM7CisJdTMyIGxvb3BfY250ID0gMCwgcmV0cmllc19jbnQgPSAwOworCXUzMiB2Y192YWxpZCwgdmNfYnlwYXNzX3ZhbF9yZWcsIHZjX2J5cGFzc192YWx1ZTsKKwl1OCB0YXJnZXRfdnNlbCwgY3VycmVudF92c2VsOworCWludCByZXQ7CisKKwlyZXQgPSBvbWFwX3ZjX3ByZV9zY2FsZSh2b2x0ZG0sIHRhcmdldF92b2x0LCAmdGFyZ2V0X3ZzZWwsICZjdXJyZW50X3ZzZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2Y192YWxpZCA9IHZjLT5jb21tb24tPnZhbGlkOworCXZjX2J5cGFzc192YWxfcmVnID0gdmMtPmNvbW1vbi0+YnlwYXNzX3ZhbF9yZWc7CisJdmNfYnlwYXNzX3ZhbHVlID0gKHRhcmdldF92c2VsIDw8IHZjLT5jb21tb24tPmRhdGFfc2hpZnQpIHwKKwkJKHZjLT52b2x0X3JlZ19hZGRyIDw8IHZjLT5jb21tb24tPnJlZ2FkZHJfc2hpZnQpIHwKKwkJKHZjLT5pMmNfc2xhdmVfYWRkciA8PCB2Yy0+Y29tbW9uLT5zbGF2ZWFkZHJfc2hpZnQpOworCisJdm9sdGRtLT53cml0ZSh2Y19ieXBhc3NfdmFsdWUsIHZjX2J5cGFzc192YWxfcmVnKTsKKwl2b2x0ZG0tPndyaXRlKHZjX2J5cGFzc192YWx1ZSB8IHZjX3ZhbGlkLCB2Y19ieXBhc3NfdmFsX3JlZyk7CisKKwl2Y19ieXBhc3NfdmFsdWUgPSB2b2x0ZG0tPnJlYWQodmNfYnlwYXNzX3ZhbF9yZWcpOworCS8qCisJICogTG9vcCB0aWxsIHRoZSBieXBhc3MgY29tbWFuZCBpcyBhY2tub3dsZWRnZWQgZnJvbSB0aGUgU01QUy4KKwkgKiBOT1RFOiBUaGlzIGlzIGxlZ2FjeSBjb2RlLiBUaGUgbG9vcCBjb3VudCBhbmQgcmV0cnkgY291bnQgbmVlZHMKKwkgKiB0byBiZSByZXZpc2l0ZWQuCisJICovCisJd2hpbGUgKCEodmNfYnlwYXNzX3ZhbHVlICYgdmNfdmFsaWQpKSB7CisJCWxvb3BfY250Kys7CisKKwkJaWYgKHJldHJpZXNfY250ID4gMTApIHsKKwkJCXByX3dhcm5pbmcoIiVzOiBSZXRyeSBjb3VudCBleGNlZWRlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlpZiAobG9vcF9jbnQgPiA1MCkgeworCQkJcmV0cmllc19jbnQrKzsKKwkJCWxvb3BfY250ID0gMDsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJdmNfYnlwYXNzX3ZhbHVlID0gdm9sdGRtLT5yZWFkKHZjX2J5cGFzc192YWxfcmVnKTsKKwl9CisKKwlvbWFwX3ZjX3Bvc3Rfc2NhbGUodm9sdGRtLCB0YXJnZXRfdm9sdCwgdGFyZ2V0X3ZzZWwsIGN1cnJlbnRfdnNlbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwM192ZnNtX2luaXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwkvKgorCSAqIFZvbHRhZ2UgTWFuYWdlciBGU00gcGFyYW1ldGVycyBpbml0CisJICogWFhYIFRoaXMgZGF0YSBzaG91bGQgYmUgcGFzc2VkIGluIGZyb20gdGhlIGJvYXJkIGZpbGUKKwkgKi8KKwl2b2x0ZG0tPndyaXRlKE9NQVAzX0NMS1NFVFVQLCBPTUFQM19QUk1fQ0xLU0VUVVBfT0ZGU0VUKTsKKwl2b2x0ZG0tPndyaXRlKE9NQVAzX1ZPTFRPRkZTRVQsIE9NQVAzX1BSTV9WT0xUT0ZGU0VUX09GRlNFVCk7CisJdm9sdGRtLT53cml0ZShPTUFQM19WT0xUU0VUVVAyLCBPTUFQM19QUk1fVk9MVFNFVFVQMl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcDNfdmNfaW5pdF9jaGFubmVsKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJc3RhdGljIGJvb2wgaXNfaW5pdGlhbGl6ZWQ7CisKKwlpZiAoaXNfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCW9tYXAzX3Zmc21faW5pdCh2b2x0ZG0pOworCisJaXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCisKKy8qIE9NQVA0IHNwZWNpZmljIHZvbHRhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF92Y19pbml0X2NoYW5uZWwoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlzdGF0aWMgYm9vbCBpc19pbml0aWFsaXplZDsKKwl1MzIgdmNfdmFsOworCisJaWYgKGlzX2luaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwkvKiBYWFggVGhlc2UgYXJlIG1hZ2ljIG51bWJlcnMgYW5kIGRvIG5vdCBiZWxvbmchICovCisJdmNfdmFsID0gKDB4NjAgPDwgT01BUDQ0MzBfU0NMTF9TSElGVCB8IDB4MjYgPDwgT01BUDQ0MzBfU0NMSF9TSElGVCk7CisJdm9sdGRtLT53cml0ZSh2Y192YWwsIE9NQVA0X1BSTV9WQ19DRkdfSTJDX0NMS19PRkZTRVQpOworCisJaXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCisvKioKKyAqIG9tYXBfdmNfaTJjX2luaXQgLSBpbml0aWFsaXplIEkyQyBpbnRlcmZhY2UgdG8gUE1JQworICogQHZvbHRkbTogdm9sdGFnZSBkb21haW4gY29udGFpbmluZyBWQyBkYXRhCisgKgorICogVXNlIFBNSUMgc3VwcGxpZWQgc2VldGluZ3MgZm9yIEkyQyBoaWdoLXNwZWVkIG1vZGUgYW5kCisgKiBtYXN0ZXIgY29kZSAoaWYgc2V0KSBhbmQgcHJvZ3JhbSB0aGUgVkMgSTJDIGNvbmZpZ3VyYXRpb24KKyAqIHJlZ2lzdGVyLgorICoKKyAqIFRoZSBWQyBJMkMgY29uZmlndXJhdGlvbiBpcyBjb21tb24gdG8gYWxsIFZDIGNoYW5uZWxzLAorICogc28gdGhpcyBmdW5jdGlvbiBvbmx5IGNvbmZpZ3VyZXMgSTJDIGZvciB0aGUgZmlyc3QgVkMKKyAqIGNoYW5uZWwgcmVnaXN0ZXJzLiAgQWxsIG90aGVyIFZDIGNoYW5uZWxzIHdpbGwgdXNlIHRoZQorICogc2FtZSBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF92Y19pMmNfaW5pdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgKnZjID0gdm9sdGRtLT52YzsKKwlzdGF0aWMgYm9vbCBpbml0aWFsaXplZDsKKwlzdGF0aWMgYm9vbCBpMmNfaGlnaF9zcGVlZDsKKwl1OCBtY29kZTsKKworCWlmIChpbml0aWFsaXplZCkgeworCQlpZiAodm9sdGRtLT5wbWljLT5pMmNfaGlnaF9zcGVlZCAhPSBpMmNfaGlnaF9zcGVlZCkKKwkJCXByX3dhcm4oIiVzOiBJMkMgY29uZmlnIGZvciBhbGwgY2hhbm5lbHMgbXVzdCBtYXRjaC4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWkyY19oaWdoX3NwZWVkID0gdm9sdGRtLT5wbWljLT5pMmNfaGlnaF9zcGVlZDsKKwlpZiAoaTJjX2hpZ2hfc3BlZWQpCisJCXZvbHRkbS0+cm13KHZjLT5jb21tb24tPmkyY19jZmdfaHNlbl9tYXNrLAorCQkJICAgIHZjLT5jb21tb24tPmkyY19jZmdfaHNlbl9tYXNrLAorCQkJICAgIHZjLT5jb21tb24tPmkyY19jZmdfcmVnKTsKKworCW1jb2RlID0gdm9sdGRtLT5wbWljLT5pMmNfbWNvZGU7CisJaWYgKG1jb2RlKQorCQl2b2x0ZG0tPnJtdyh2Yy0+Y29tbW9uLT5pMmNfbWNvZGVfbWFzaywKKwkJCSAgICBtY29kZSA8PCBfX2Zmcyh2Yy0+Y29tbW9uLT5pMmNfbWNvZGVfbWFzayksCisJCQkgICAgdmMtPmNvbW1vbi0+aTJjX2NmZ19yZWcpOworCisJaW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit2b2lkIF9faW5pdCBvbWFwX3ZjX2luaXRfY2hhbm5lbChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgKnZjID0gdm9sdGRtLT52YzsKKwl1OCBvbl92c2VsLCBvbmxwX3ZzZWwsIHJldF92c2VsLCBvZmZfdnNlbDsKKwl1MzIgdmFsOworCisJaWYgKCF2b2x0ZG0tPnBtaWMgfHwgIXZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCkgeworCQlwcl9lcnIoIiVzOiBQTUlDIGluZm8gcmVxdXJpZWQgdG8gY29uZmlndXJlIHZjIGZvciIKKwkJCSJ2ZGRfJXMgbm90IHBvcHVsYXRlZC5IZW5jZSBjYW5ub3QgaW5pdGlhbGl6ZSB2Y1xuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKCF2b2x0ZG0tPnJlYWQgfHwgIXZvbHRkbS0+d3JpdGUpIHsKKwkJcHJfZXJyKCIlczogTm8gcmVhZC93cml0ZSBBUEkgZm9yIGFjY2Vzc2luZyB2ZGRfJXMgcmVnc1xuIiwKKwkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJdmMtPmNmZ19jaGFubmVsID0gMDsKKwlpZiAodmMtPmZsYWdzICYgT01BUF9WQ19DSEFOTkVMX0NGR19NVVRBTlQpCisJCXZjX2NmZ19iaXRzID0gJnZjX211dGFudF9jaGFubmVsX2NmZzsKKwllbHNlCisJCXZjX2NmZ19iaXRzID0gJnZjX2RlZmF1bHRfY2hhbm5lbF9jZmc7CisKKwkvKiBnZXQgUE1JQy9ib2FyZCBzcGVjaWZpYyBzZXR0aW5ncyAqLworCXZjLT5pMmNfc2xhdmVfYWRkciA9IHZvbHRkbS0+cG1pYy0+aTJjX3NsYXZlX2FkZHI7CisJdmMtPnZvbHRfcmVnX2FkZHIgPSB2b2x0ZG0tPnBtaWMtPnZvbHRfcmVnX2FkZHI7CisJdmMtPmNtZF9yZWdfYWRkciA9IHZvbHRkbS0+cG1pYy0+Y21kX3JlZ19hZGRyOworCXZjLT5zZXR1cF90aW1lID0gdm9sdGRtLT5wbWljLT52b2x0X3NldHVwX3RpbWU7CisKKwkvKiBDb25maWd1cmUgdGhlIGkyYyBzbGF2ZSBhZGRyZXNzIGZvciB0aGlzIFZDICovCisJdm9sdGRtLT5ybXcodmMtPnNtcHNfc2FfbWFzaywKKwkJICAgIHZjLT5pMmNfc2xhdmVfYWRkciA8PCBfX2Zmcyh2Yy0+c21wc19zYV9tYXNrKSwKKwkJICAgIHZjLT5zbXBzX3NhX3JlZyk7CisJdmMtPmNmZ19jaGFubmVsIHw9IHZjX2NmZ19iaXRzLT5zYTsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBQTUlDIHJlZ2lzdGVyIGFkZHJlc3Nlcy4KKwkgKi8KKwl2b2x0ZG0tPnJtdyh2Yy0+c21wc192b2xyYV9tYXNrLAorCQkgICAgdmMtPnZvbHRfcmVnX2FkZHIgPDwgX19mZnModmMtPnNtcHNfdm9scmFfbWFzayksCisJCSAgICB2Yy0+c21wc192b2xyYV9yZWcpOworCXZjLT5jZmdfY2hhbm5lbCB8PSB2Y19jZmdfYml0cy0+cmF2OworCisJaWYgKHZjLT5jbWRfcmVnX2FkZHIpIHsKKwkJdm9sdGRtLT5ybXcodmMtPnNtcHNfY21kcmFfbWFzaywKKwkJCSAgICB2Yy0+Y21kX3JlZ19hZGRyIDw8IF9fZmZzKHZjLT5zbXBzX2NtZHJhX21hc2spLAorCQkJICAgIHZjLT5zbXBzX2NtZHJhX3JlZyk7CisJCXZjLT5jZmdfY2hhbm5lbCB8PSB2Y19jZmdfYml0cy0+cmFjIHwgdmNfY2ZnX2JpdHMtPnJhY2VuOworCX0KKworCS8qIFNldCB1cCB0aGUgb24sIGluYWN0aXZlLCByZXRlbnRpb24gYW5kIG9mZiB2b2x0YWdlICovCisJb25fdnNlbCA9IHZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCh2b2x0ZG0tPnBtaWMtPm9uX3ZvbHQpOworCW9ubHBfdnNlbCA9IHZvbHRkbS0+cG1pYy0+dXZfdG9fdnNlbCh2b2x0ZG0tPnBtaWMtPm9ubHBfdm9sdCk7CisJcmV0X3ZzZWwgPSB2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwodm9sdGRtLT5wbWljLT5yZXRfdm9sdCk7CisJb2ZmX3ZzZWwgPSB2b2x0ZG0tPnBtaWMtPnV2X3RvX3ZzZWwodm9sdGRtLT5wbWljLT5vZmZfdm9sdCk7CisJdmFsID0gKChvbl92c2VsIDw8IHZjLT5jb21tb24tPmNtZF9vbl9zaGlmdCkgfAorCSAgICAgICAob25scF92c2VsIDw8IHZjLT5jb21tb24tPmNtZF9vbmxwX3NoaWZ0KSB8CisJICAgICAgIChyZXRfdnNlbCA8PCB2Yy0+Y29tbW9uLT5jbWRfcmV0X3NoaWZ0KSB8CisJICAgICAgIChvZmZfdnNlbCA8PCB2Yy0+Y29tbW9uLT5jbWRfb2ZmX3NoaWZ0KSk7CisJdm9sdGRtLT53cml0ZSh2YWwsIHZjLT5jbWR2YWxfcmVnKTsKKwl2Yy0+Y2ZnX2NoYW5uZWwgfD0gdmNfY2ZnX2JpdHMtPmNtZDsKKworCS8qIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLworCW9tYXBfdmNfY29uZmlnX2NoYW5uZWwodm9sdGRtKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgc2V0dXAgdGltZXMgKi8KKwl2b2x0ZG0tPnJtdyh2b2x0ZG0tPnZmc20tPnZvbHRzZXR1cF9tYXNrLAorCQkgICAgdmMtPnNldHVwX3RpbWUgPDwgX19mZnModm9sdGRtLT52ZnNtLT52b2x0c2V0dXBfbWFzayksCisJCSAgICB2b2x0ZG0tPnZmc20tPnZvbHRzZXR1cF9yZWcpOworCisJb21hcF92Y19pMmNfaW5pdCh2b2x0ZG0pOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQorCQlvbWFwM192Y19pbml0X2NoYW5uZWwodm9sdGRtKTsKKwllbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkKKwkJb21hcDRfdmNfaW5pdF9jaGFubmVsKHZvbHRkbSk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuaAppbmRleCBlNzc2Nzc3Li40NzhiZjZiNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92Yy5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmMuaApAQCAtMTksMTIgKzE5LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAorc3RydWN0IHZvbHRhZ2Vkb21haW47CisKIC8qKgotICogc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgLSBwZXItVkMgcmVnaXN0ZXIvYml0ZmllbGQgZGF0YQorICogc3RydWN0IG9tYXBfdmNfY29tbW9uIC0gcGVyLVZDIHJlZ2lzdGVyL2JpdGZpZWxkIGRhdGEKICAqIEBjbWRfb25fbWFzazogT04gYml0bWFzayBpbiBQUk1fVkNfQ01EX1ZBTCogcmVnaXN0ZXIKICAqIEB2YWxpZDogVkFMSUQgYml0bWFzayBpbiBQUk1fVkNfQllQQVNTX1ZBTCByZWdpc3RlcgotICogQHNtcHNfc2FfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX1NNUFNfU0EgcmVnIGZyb20gUFJNIHN0YXJ0Ci0gKiBAc21wc192b2xyYV9yZWc6IE9mZnNldCBvZiBQUk1fVkNfU01QU19WT0xfUkEgcmVnIGZyb20gUFJNIHN0YXJ0CiAgKiBAYnlwYXNzX3ZhbF9yZWc6IE9mZnNldCBvZiBQUk1fVkNfQllQQVNTX1ZBTCByZWcgZnJvbSBQUk0gc3RhcnQKICAqIEBkYXRhX3NoaWZ0OiBEQVRBIGZpZWxkIHNoaWZ0IGluIFBSTV9WQ19CWVBBU1NfVkFMIHJlZ2lzdGVyCiAgKiBAc2xhdmVhZGRyX3NoaWZ0OiBTTEFWRUFERFIgZmllbGQgc2hpZnQgaW4gUFJNX1ZDX0JZUEFTU19WQUwgcmVnaXN0ZXIKQEAgLTMzLDE1ICszMywxNiBAQAogICogQGNtZF9vbmxwX3NoaWZ0OiBPTkxQIGZpZWxkIHNoaWZ0IGluIFBSTV9WQ19DTURfVkFMXyogcmVnaXN0ZXIKICAqIEBjbWRfcmV0X3NoaWZ0OiBSRVQgZmllbGQgc2hpZnQgaW4gUFJNX1ZDX0NNRF9WQUxfKiByZWdpc3RlcgogICogQGNtZF9vZmZfc2hpZnQ6IE9GRiBmaWVsZCBzaGlmdCBpbiBQUk1fVkNfQ01EX1ZBTF8qIHJlZ2lzdGVyCisgKiBAaTJjX2NmZ19yZWc6IEkyQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldAorICogQGkyY19jZmdfaHNlbl9tYXNrOiBoaWdoLXNwZWVkIG1vZGUgYml0IGZpZWxkIG1hc2sgaW4gSTJDIGNvbmZpZyByZWdpc3RlcgorICogQGkyY19tY29kZV9tYXNrOiBNQ09ERSBmaWVsZCBtYXNrIGZvciBJMkMgY29uZmlnIHJlZ2lzdGVyCiAgKgogICogWFhYIE9uZSBvZiBjbWRfb25fbWFzayBhbmQgY21kX29uX3NoaWZ0IGFyZSBub3QgbmVlZGVkCiAgKiBYWFggVkFMSUQgc2hvdWxkIHByb2JhYmx5IGJlIGEgc2hpZnQsIG5vdCBhIG1hc2sKICAqLwotc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgeworc3RydWN0IG9tYXBfdmNfY29tbW9uIHsKIAl1MzIgY21kX29uX21hc2s7CiAJdTMyIHZhbGlkOwotCXU4IHNtcHNfc2FfcmVnOwotCXU4IHNtcHNfdm9scmFfcmVnOwogCXU4IGJ5cGFzc192YWxfcmVnOwogCXU4IGRhdGFfc2hpZnQ7CiAJdTggc2xhdmVhZGRyX3NoaWZ0OwpAQCAtNTAsMzQgKzUxLDc1IEBACiAJdTggY21kX29ubHBfc2hpZnQ7CiAJdTggY21kX3JldF9zaGlmdDsKIAl1OCBjbWRfb2ZmX3NoaWZ0OworCXU4IGkyY19jZmdfcmVnOworCXU4IGkyY19jZmdfaHNlbl9tYXNrOworCXU4IGkyY19tY29kZV9tYXNrOwogfTsKIAorLyogb21hcF92Y19jaGFubmVsLmZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBPTUFQX1ZDX0NIQU5ORUxfREVGQVVMVCBCSVQoMCkKKyNkZWZpbmUgT01BUF9WQ19DSEFOTkVMX0NGR19NVVRBTlQgQklUKDEpCisKIC8qKgotICogc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSAtIFZDIHBlci1pbnN0YW5jZSBkYXRhCi0gKiBAdmNfY29tbW9uOiBwb2ludGVyIHRvIFZDIGNvbW1vbiBkYXRhIGZvciB0aGlzIHBsYXRmb3JtCi0gKiBAc21wc19zYV9tYXNrOiBTQSogYml0bWFzayBpbiB0aGUgUFJNX1ZDX1NNUFNfU0EgcmVnaXN0ZXIKLSAqIEBzbXBzX3ZvbHJhX21hc2s6IFZPTFJBKiBiaXRtYXNrIGluIHRoZSBQUk1fVkNfVk9MX1JBIHJlZ2lzdGVyCi0gKiBAc21wc19zYV9zaGlmdDogU0EqIGZpZWxkIHNoaWZ0IGluIHRoZSBQUk1fVkNfU01QU19TQSByZWdpc3RlcgotICogQHNtcHNfdm9scmFfc2hpZnQ6IFZPTFJBKiBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZDX1ZPTF9SQSByZWdpc3RlcgorICogc3RydWN0IG9tYXBfdmNfY2hhbm5lbCAtIFZDIHBlci1pbnN0YW5jZSBkYXRhCisgKiBAaTJjX3NsYXZlX2FkZHI6IEkyQyBzbGF2ZSBhZGRyZXNzIG9mIFBNSUMgZm9yIHRoaXMgVkMgY2hhbm5lbAorICogQHZvbHRfcmVnX2FkZHI6IHZvbHRhZ2UgY29uZmlndXJhdGlvbiByZWdpc3RlciBhZGRyZXNzCisgKiBAY21kX3JlZ19hZGRyOiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcworICogQHNldHVwX3RpbWU6IHNldHVwIHRpbWUgKGluIHN5c19jbGsgY3ljbGVzKSBvZiByZWd1bGF0b3IgZm9yIHRoaXMgY2hhbm5lbAorICogQGNmZ19jaGFubmVsOiBjdXJyZW50IHZhbHVlIG9mIFZDIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICogQGkyY19oaWdoX3NwZWVkOiB3aGV0aGVyIG9yIG5vdCB0byB1c2UgSTJDIGhpZ2gtc3BlZWQgbW9kZQogICoKLSAqIFhYWCBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGhhdmUgYm90aCBhICpfbWFzayBhbmQgYSAqX3NoaWZ0IC0KLSAqICAgICByZW1vdmUgb25lCisgKiBAY29tbW9uOiBwb2ludGVyIHRvIFZDIGNvbW1vbiBkYXRhIGZvciB0aGlzIHBsYXRmb3JtCisgKiBAc21wc19zYV9tYXNrOiBpMmMgc2xhdmUgYWRkcmVzcyBiaXRtYXNrIGluIHRoZSBQUk1fVkNfU01QU19TQSByZWdpc3RlcgorICogQHNtcHNfdm9scmFfbWFzazogVk9MUkEqIGJpdG1hc2sgaW4gdGhlIFBSTV9WQ19WT0xfUkEgcmVnaXN0ZXIKKyAqIEBzbXBzX2NtZHJhX21hc2s6IENNRFJBKiBiaXRtYXNrIGluIHRoZSBQUk1fVkNfQ01EX1JBIHJlZ2lzdGVyCisgKiBAY21kdmFsX3JlZzogcmVnaXN0ZXIgZm9yIG9uL3JldC9vZmYgdm9sdGFnZSBsZXZlbCB2YWx1ZXMgZm9yIHRoaXMgY2hhbm5lbAorICogQHNtcHNfc2FfcmVnOiBPZmZzZXQgb2YgUFJNX1ZDX1NNUFNfU0EgcmVnIGZyb20gUFJNIHN0YXJ0CisgKiBAc21wc192b2xyYV9yZWc6IE9mZnNldCBvZiBQUk1fVkNfU01QU19WT0xfUkEgcmVnIGZyb20gUFJNIHN0YXJ0CisgKiBAc21wc19jbWRyYV9yZWc6IE9mZnNldCBvZiBQUk1fVkNfU01QU19DTURfUkEgcmVnIGZyb20gUFJNIHN0YXJ0CisgKiBAY2ZnX2NoYW5uZWxfcmVnOiBWQyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqIEBjZmdfY2hhbm5lbF9zYV9zaGlmdDogYml0IHNoaWZ0IGZvciBzbGF2ZSBhZGRyZXNzIGNmZ19jaGFubmVsIHJlZ2lzdGVyCisgKiBAZmxhZ3M6IFZDIGNoYW5uZWwtc3BlY2lmaWMgZmxhZ3MgKG9wdGlvbmFsKQogICovCi1zdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIHsKLQljb25zdCBzdHJ1Y3Qgb21hcF92Y19jb21tb25fZGF0YSAqdmNfY29tbW9uOworc3RydWN0IG9tYXBfdmNfY2hhbm5lbCB7CisJLyogY2hhbm5lbCBzdGF0ZSAqLworCXUxNiBpMmNfc2xhdmVfYWRkcjsKKwl1MTYgdm9sdF9yZWdfYWRkcjsKKwl1MTYgY21kX3JlZ19hZGRyOworCXUxNiBzZXR1cF90aW1lOworCXU4IGNmZ19jaGFubmVsOworCWJvb2wgaTJjX2hpZ2hfc3BlZWQ7CisKKwkvKiByZWdpc3RlciBhY2Nlc3MgZGF0YSAqLworCWNvbnN0IHN0cnVjdCBvbWFwX3ZjX2NvbW1vbiAqY29tbW9uOwogCXUzMiBzbXBzX3NhX21hc2s7CiAJdTMyIHNtcHNfdm9scmFfbWFzazsKKwl1MzIgc21wc19jbWRyYV9tYXNrOwogCXU4IGNtZHZhbF9yZWc7Ci0JdTggc21wc19zYV9zaGlmdDsKLQl1OCBzbXBzX3ZvbHJhX3NoaWZ0OworCXU4IHNtcHNfc2FfcmVnOworCXU4IHNtcHNfdm9scmFfcmVnOworCXU4IHNtcHNfY21kcmFfcmVnOworCXU4IGNmZ19jaGFubmVsX3JlZzsKKwl1OCBjZmdfY2hhbm5lbF9zYV9zaGlmdDsKKwl1OCBmbGFnczsKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXAzX3ZjMV9kYXRhOwotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDNfdmMyX2RhdGE7CitleHRlcm4gc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwM192Y19tcHU7CitleHRlcm4gc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwM192Y19jb3JlOwogCi1leHRlcm4gc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwNF92Y19tcHVfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXA0X3ZjX2l2YV9kYXRhOwotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDRfdmNfY29yZV9kYXRhOworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDRfdmNfbXB1OworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDRfdmNfaXZhOworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDRfdmNfY29yZTsKKwordm9pZCBvbWFwX3ZjX2luaXRfY2hhbm5lbChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKK2ludCBvbWFwX3ZjX3ByZV9zY2FsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LAorCQkgICAgICB1OCAqdGFyZ2V0X3ZzZWwsIHU4ICpjdXJyZW50X3ZzZWwpOwordm9pZCBvbWFwX3ZjX3Bvc3Rfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQsCisJCQl1OCB0YXJnZXRfdnNlbCwgdTggY3VycmVudF92c2VsKTsKK2ludCBvbWFwX3ZjX2J5cGFzc19zY2FsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzN4eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzN4eHhfZGF0YS5jCmluZGV4IGYzN2RjNGIuLmNmZTM0OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdmMzeHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjM3h4eF9kYXRhLmMKQEAgLTI5LDkgKzI5LDcgQEAKICAqIFZDIGRhdGEgY29tbW9uIHRvIDM0eHgvMzZ4eCBjaGlwcwogICogWFhYIFRoaXMgc3R1ZmYgcHJlc3VtYWJseSBiZWxvbmdzIGluIHRoZSB2YzN4eHguYyBvciB2Yy5jIGZpbGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF92Y19jb21tb25fZGF0YSBvbWFwM192Y19jb21tb24gPSB7Ci0JLnNtcHNfc2FfcmVnCSA9IE9NQVAzX1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKLQkuc21wc192b2xyYV9yZWcJID0gT01BUDNfUFJNX1ZDX1NNUFNfVk9MX1JBX09GRlNFVCwKK3N0YXRpYyBzdHJ1Y3Qgb21hcF92Y19jb21tb24gb21hcDNfdmNfY29tbW9uID0gewogCS5ieXBhc3NfdmFsX3JlZwkgPSBPTUFQM19QUk1fVkNfQllQQVNTX1ZBTF9PRkZTRVQsCiAJLmRhdGFfc2hpZnQJID0gT01BUDM0MzBfREFUQV9TSElGVCwKIAkuc2xhdmVhZGRyX3NoaWZ0ID0gT01BUDM0MzBfU0xBVkVBRERSX1NISUZULApAQCAtNDIsMjIgKzQwLDMzIEBACiAJLmNtZF9vbmxwX3NoaWZ0CSA9IE9NQVAzNDMwX1ZDX0NNRF9PTkxQX1NISUZULAogCS5jbWRfcmV0X3NoaWZ0CSA9IE9NQVAzNDMwX1ZDX0NNRF9SRVRfU0hJRlQsCiAJLmNtZF9vZmZfc2hpZnQJID0gT01BUDM0MzBfVkNfQ01EX09GRl9TSElGVCwKKwkuaTJjX2NmZ19oc2VuX21hc2sgPSBPTUFQMzQzMF9IU0VOX01BU0ssCisJLmkyY19jZmdfcmVnCSA9IE9NQVAzX1BSTV9WQ19JMkNfQ0ZHX09GRlNFVCwKKwkuaTJjX21jb2RlX21hc2sJID0gT01BUDM0MzBfTUNPREVfTUFTSywKIH07CiAKLXN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDNfdmMxX2RhdGEgPSB7Ci0JLnZjX2NvbW1vbiA9ICZvbWFwM192Y19jb21tb24sCitzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXAzX3ZjX21wdSA9IHsKKwkuY29tbW9uID0gJm9tYXAzX3ZjX2NvbW1vbiwKKwkuc21wc19zYV9yZWcJID0gT01BUDNfUFJNX1ZDX1NNUFNfU0FfT0ZGU0VULAorCS5zbXBzX3ZvbHJhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19WT0xfUkFfT0ZGU0VULAorCS5zbXBzX2NtZHJhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19DTURfUkFfT0ZGU0VULAorCS5jZmdfY2hhbm5lbF9yZWcgPSBPTUFQM19QUk1fVkNfQ0hfQ09ORl9PRkZTRVQsCiAJLmNtZHZhbF9yZWcgPSBPTUFQM19QUk1fVkNfQ01EX1ZBTF8wX09GRlNFVCwKLQkuc21wc19zYV9zaGlmdCA9IE9NQVAzNDMwX1BSTV9WQ19TTVBTX1NBX1NBMF9TSElGVCwKIAkuc21wc19zYV9tYXNrID0gT01BUDM0MzBfUFJNX1ZDX1NNUFNfU0FfU0EwX01BU0ssCi0JLnNtcHNfdm9scmFfc2hpZnQgPSBPTUFQMzQzMF9WT0xSQTBfU0hJRlQsCiAJLnNtcHNfdm9scmFfbWFzayA9IE9NQVAzNDMwX1ZPTFJBMF9NQVNLLAorCS5zbXBzX2NtZHJhX21hc2sgPSBPTUFQMzQzMF9DTURSQTBfTUFTSywKKwkuY2ZnX2NoYW5uZWxfc2Ffc2hpZnQgPSBPTUFQMzQzMF9QUk1fVkNfU01QU19TQV9TQTBfU0hJRlQsCiB9OwogCi1zdHJ1Y3Qgb21hcF92Y19pbnN0YW5jZV9kYXRhIG9tYXAzX3ZjMl9kYXRhID0gewotCS52Y19jb21tb24gPSAmb21hcDNfdmNfY29tbW9uLAorc3RydWN0IG9tYXBfdmNfY2hhbm5lbCBvbWFwM192Y19jb3JlID0geworCS5jb21tb24gPSAmb21hcDNfdmNfY29tbW9uLAorCS5zbXBzX3NhX3JlZwkgPSBPTUFQM19QUk1fVkNfU01QU19TQV9PRkZTRVQsCisJLnNtcHNfdm9scmFfcmVnCSA9IE9NQVAzX1BSTV9WQ19TTVBTX1ZPTF9SQV9PRkZTRVQsCisJLnNtcHNfY21kcmFfcmVnCSA9IE9NQVAzX1BSTV9WQ19TTVBTX0NNRF9SQV9PRkZTRVQsCisJLmNmZ19jaGFubmVsX3JlZyA9IE9NQVAzX1BSTV9WQ19DSF9DT05GX09GRlNFVCwKIAkuY21kdmFsX3JlZyA9IE9NQVAzX1BSTV9WQ19DTURfVkFMXzFfT0ZGU0VULAotCS5zbXBzX3NhX3NoaWZ0ID0gT01BUDM0MzBfUFJNX1ZDX1NNUFNfU0FfU0ExX1NISUZULAogCS5zbXBzX3NhX21hc2sgPSBPTUFQMzQzMF9QUk1fVkNfU01QU19TQV9TQTFfTUFTSywKLQkuc21wc192b2xyYV9zaGlmdCA9IE9NQVAzNDMwX1ZPTFJBMV9TSElGVCwKIAkuc21wc192b2xyYV9tYXNrID0gT01BUDM0MzBfVk9MUkExX01BU0ssCisJLnNtcHNfY21kcmFfbWFzayA9IE9NQVAzNDMwX0NNRFJBMV9NQVNLLAorCS5jZmdfY2hhbm5lbF9zYV9zaGlmdCA9IE9NQVAzNDMwX1BSTV9WQ19TTVBTX1NBX1NBMV9TSElGVCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZjNDR4eF9kYXRhLmMKaW5kZXggYTk4ZGE4ZC4uMjc0MGE5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92YzQ0eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdmM0NHh4X2RhdGEuYwpAQCAtMzAsOSArMzAsNyBAQAogICogVkMgZGF0YSBjb21tb24gdG8gNDR4eCBjaGlwcwogICogWFhYIFRoaXMgc3R1ZmYgcHJlc3VtYWJseSBiZWxvbmdzIGluIHRoZSB2YzN4eHguYyBvciB2Yy5jIGZpbGUuCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92Y19jb21tb25fZGF0YSBvbWFwNF92Y19jb21tb24gPSB7Ci0JLnNtcHNfc2FfcmVnID0gT01BUDRfUFJNX1ZDX1NNUFNfU0FfT0ZGU0VULAotCS5zbXBzX3ZvbHJhX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfU01QU19SQV9WT0xfT0ZGU0VULAorc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZjX2NvbW1vbiBvbWFwNF92Y19jb21tb24gPSB7CiAJLmJ5cGFzc192YWxfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9CWVBBU1NfT0ZGU0VULAogCS5kYXRhX3NoaWZ0ID0gT01BUDQ0MzBfREFUQV9TSElGVCwKIAkuc2xhdmVhZGRyX3NoaWZ0ID0gT01BUDQ0MzBfU0xBVkVBRERSX1NISUZULApAQCAtNDMsMzMgKzQxLDQ5IEBACiAJLmNtZF9vbmxwX3NoaWZ0ID0gT01BUDQ0MzBfT05MUF9TSElGVCwKIAkuY21kX3JldF9zaGlmdCA9IE9NQVA0NDMwX1JFVF9TSElGVCwKIAkuY21kX29mZl9zaGlmdCA9IE9NQVA0NDMwX09GRl9TSElGVCwKKwkuaTJjX2NmZ19yZWcgPSBPTUFQNF9QUk1fVkNfQ0ZHX0kyQ19NT0RFX09GRlNFVCwKKwkuaTJjX2NmZ19oc2VuX21hc2sgPSBPTUFQNDQzMF9IU01PREVFTl9NQVNLLAorCS5pMmNfbWNvZGVfbWFzawkgPSBPTUFQNDQzMF9IU01DT0RFX01BU0ssCiB9OwogCiAvKiBWQyBpbnN0YW5jZSBkYXRhIGZvciBlYWNoIGNvbnRyb2xsYWJsZSB2b2x0YWdlIGxpbmUgKi8KLXN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgb21hcDRfdmNfbXB1X2RhdGEgPSB7Ci0JLnZjX2NvbW1vbiA9ICZvbWFwNF92Y19jb21tb24sCitzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX21wdSA9IHsKKwkuZmxhZ3MgPSBPTUFQX1ZDX0NIQU5ORUxfREVGQVVMVCB8IE9NQVBfVkNfQ0hBTk5FTF9DRkdfTVVUQU5ULAorCS5jb21tb24gPSAmb21hcDRfdmNfY29tbW9uLAorCS5zbXBzX3NhX3JlZyA9IE9NQVA0X1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKKwkuc21wc192b2xyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfVk9MX09GRlNFVCwKKwkuc21wc19jbWRyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfQ01EX09GRlNFVCwKKwkuY2ZnX2NoYW5uZWxfcmVnID0gT01BUDRfUFJNX1ZDX0NGR19DSEFOTkVMX09GRlNFVCwKIAkuY21kdmFsX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfQ01EX1ZERF9NUFVfTF9PRkZTRVQsCi0JLnNtcHNfc2Ffc2hpZnQgPSBPTUFQNDQzMF9TQV9WRERfTVBVX0xfUFJNX1ZDX1NNUFNfU0FfU0hJRlQsCiAJLnNtcHNfc2FfbWFzayA9IE9NQVA0NDMwX1NBX1ZERF9NUFVfTF9QUk1fVkNfU01QU19TQV9NQVNLLAotCS5zbXBzX3ZvbHJhX3NoaWZ0ID0gT01BUDQ0MzBfVk9MUkFfVkREX01QVV9MX1NISUZULAogCS5zbXBzX3ZvbHJhX21hc2sgPSBPTUFQNDQzMF9WT0xSQV9WRERfTVBVX0xfTUFTSywKKwkuc21wc19jbWRyYV9tYXNrID0gT01BUDQ0MzBfQ01EUkFfVkREX01QVV9MX01BU0ssCisJLmNmZ19jaGFubmVsX3NhX3NoaWZ0ID0gT01BUDQ0MzBfU0FfVkREX01QVV9MX1NISUZULAogfTsKIAotc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwNF92Y19pdmFfZGF0YSA9IHsKLQkudmNfY29tbW9uID0gJm9tYXA0X3ZjX2NvbW1vbiwKK3N0cnVjdCBvbWFwX3ZjX2NoYW5uZWwgb21hcDRfdmNfaXZhID0geworCS5jb21tb24gPSAmb21hcDRfdmNfY29tbW9uLAorCS5zbXBzX3NhX3JlZyA9IE9NQVA0X1BSTV9WQ19TTVBTX1NBX09GRlNFVCwKKwkuc21wc192b2xyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfVk9MX09GRlNFVCwKKwkuc21wc19jbWRyYV9yZWcgPSBPTUFQNF9QUk1fVkNfVkFMX1NNUFNfUkFfQ01EX09GRlNFVCwKKwkuY2ZnX2NoYW5uZWxfcmVnID0gT01BUDRfUFJNX1ZDX0NGR19DSEFOTkVMX09GRlNFVCwKIAkuY21kdmFsX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfQ01EX1ZERF9JVkFfTF9PRkZTRVQsCi0JLnNtcHNfc2Ffc2hpZnQgPSBPTUFQNDQzMF9TQV9WRERfSVZBX0xfUFJNX1ZDX1NNUFNfU0FfU0hJRlQsCiAJLnNtcHNfc2FfbWFzayA9IE9NQVA0NDMwX1NBX1ZERF9JVkFfTF9QUk1fVkNfU01QU19TQV9NQVNLLAotCS5zbXBzX3ZvbHJhX3NoaWZ0ID0gT01BUDQ0MzBfVk9MUkFfVkREX0lWQV9MX1NISUZULAogCS5zbXBzX3ZvbHJhX21hc2sgPSBPTUFQNDQzMF9WT0xSQV9WRERfSVZBX0xfTUFTSywKKwkuc21wc19jbWRyYV9tYXNrID0gT01BUDQ0MzBfQ01EUkFfVkREX0lWQV9MX01BU0ssCisJLmNmZ19jaGFubmVsX3NhX3NoaWZ0ID0gT01BUDQ0MzBfU0FfVkREX0lWQV9MX1NISUZULAogfTsKIAotc3RydWN0IG9tYXBfdmNfaW5zdGFuY2VfZGF0YSBvbWFwNF92Y19jb3JlX2RhdGEgPSB7Ci0JLnZjX2NvbW1vbiA9ICZvbWFwNF92Y19jb21tb24sCitzdHJ1Y3Qgb21hcF92Y19jaGFubmVsIG9tYXA0X3ZjX2NvcmUgPSB7CisJLmNvbW1vbiA9ICZvbWFwNF92Y19jb21tb24sCisJLnNtcHNfc2FfcmVnID0gT01BUDRfUFJNX1ZDX1NNUFNfU0FfT0ZGU0VULAorCS5zbXBzX3ZvbHJhX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfU01QU19SQV9WT0xfT0ZGU0VULAorCS5zbXBzX2NtZHJhX3JlZyA9IE9NQVA0X1BSTV9WQ19WQUxfU01QU19SQV9DTURfT0ZGU0VULAorCS5jZmdfY2hhbm5lbF9yZWcgPSBPTUFQNF9QUk1fVkNfQ0ZHX0NIQU5ORUxfT0ZGU0VULAogCS5jbWR2YWxfcmVnID0gT01BUDRfUFJNX1ZDX1ZBTF9DTURfVkREX0NPUkVfTF9PRkZTRVQsCi0JLnNtcHNfc2Ffc2hpZnQgPSBPTUFQNDQzMF9TQV9WRERfQ09SRV9MXzBfNl9TSElGVCwKIAkuc21wc19zYV9tYXNrID0gT01BUDQ0MzBfU0FfVkREX0NPUkVfTF8wXzZfTUFTSywKLQkuc21wc192b2xyYV9zaGlmdCA9IE9NQVA0NDMwX1ZPTFJBX1ZERF9DT1JFX0xfU0hJRlQsCiAJLnNtcHNfdm9scmFfbWFzayA9IE9NQVA0NDMwX1ZPTFJBX1ZERF9DT1JFX0xfTUFTSywKKwkuc21wc19jbWRyYV9tYXNrID0gT01BUDQ0MzBfQ01EUkFfVkREX0NPUkVfTF9NQVNLLAorCS5jZmdfY2hhbm5lbF9zYV9zaGlmdCA9IE9NQVA0NDMwX1NBX1ZERF9DT1JFX0xfU0hJRlQsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZS5jCmluZGV4IDllZjM3ODkuLjFmOGZkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZS5jCkBAIC0yMSwxMCArMjEsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8cGxhdC9jb21tb24uaD4KIApAQCAtMzYsODM5ICszNyw4OCBAQAogI2luY2x1ZGUgImNvbnRyb2wuaCIKIAogI2luY2x1ZGUgInZvbHRhZ2UuaCIKKyNpbmNsdWRlICJwb3dlcmRvbWFpbi5oIgogCiAjaW5jbHVkZSAidmMuaCIKICNpbmNsdWRlICJ2cC5oIgogCi0jZGVmaW5lIFZPTFRBR0VfRElSX1NJWkUJMTYKLQotCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gKip2ZGRfaW5mbzsKLQotLyoKLSAqIE51bWJlciBvZiBzY2FsYWJsZSB2b2x0YWdlIGRvbWFpbnMuCi0gKi8KLXN0YXRpYyBpbnQgbnJfc2NhbGFibGVfdmRkOwotCi0vKiBYWFggZG9jdW1lbnQgKi8KLXN0YXRpYyBzMTYgcHJtX21vZF9vZmZzOwotc3RhdGljIHMxNiBwcm1faXJxc3Rfb2NwX21vZF9vZmZzOwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqdm9sdGFnZV9kaXI7Ci0KLS8qIEluaXQgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLXN0YXRpYyBpbnQgdnBfZm9yY2V1cGRhdGVfc2NhbGVfdm9sdGFnZShzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkLAotCQkJCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KTsKLQotc3RhdGljIHUzMiBvbWFwM192b2x0YWdlX3JlYWRfcmVnKHUxNiBtb2QsIHU4IG9mZnNldCkKLXsKLQlyZXR1cm4gb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhtb2QsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAzX3ZvbHRhZ2Vfd3JpdGVfcmVnKHUzMiB2YWwsIHUxNiBtb2QsIHU4IG9mZnNldCkKLXsKLQlvbWFwMl9wcm1fd3JpdGVfbW9kX3JlZyh2YWwsIG1vZCwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHUzMiBvbWFwNF92b2x0YWdlX3JlYWRfcmVnKHUxNiBtb2QsIHU4IG9mZnNldCkKLXsKLQlyZXR1cm4gb21hcDRfcHJtaW5zdF9yZWFkX2luc3RfcmVnKE9NQVA0NDMwX1BSTV9QQVJUSVRJT04sCi0JCQkJCW1vZCwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgb21hcDRfdm9sdGFnZV93cml0ZV9yZWcodTMyIHZhbCwgdTE2IG1vZCwgdTggb2Zmc2V0KQotewotCW9tYXA0X3BybWluc3Rfd3JpdGVfaW5zdF9yZWcodmFsLCBPTUFQNDQzMF9QUk1fUEFSVElUSU9OLCBtb2QsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IF9jb25maWdfY29tbW9uX3ZkZF9kYXRhKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JY2hhciAqc3lzX2NrX25hbWU7Ci0Jc3RydWN0IGNsayAqc3lzX2NrOwotCXUzMiBzeXNfY2xrX3NwZWVkLCB0aW1lb3V0X3ZhbCwgd2FpdHRpbWU7Ci0KLQkvKgotCSAqIFhYWCBDbG9ja2Z3IHNob3VsZCBoYW5kbGUgdGhpcywgb3IgdGhpcyBzaG91bGQgYmUgaW4gYQotCSAqIHN0cnVjdCByZWNvcmQKLQkgKi8KLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkgfHwgY3B1X2lzX29tYXAzNHh4KCkpCi0JCXN5c19ja19uYW1lID0gInN5c19jayI7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCXN5c19ja19uYW1lID0gInN5c19jbGtpbl9jayI7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogU3lzIGNsayByYXRlIGlzIHJlcXVpcmUgdG8gY2FsY3VsYXRlIHZwIHRpbWVvdXQgdmFsdWUgYW5kCi0JICogc21wc3dhaXR0aW1lbWluIGFuZCBzbXBzd2FpdHRpbWVtYXguCi0JICovCi0Jc3lzX2NrID0gY2xrX2dldChOVUxMLCBzeXNfY2tfbmFtZSk7Ci0JaWYgKElTX0VSUihzeXNfY2spKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBDb3VsZCBub3QgZ2V0IHRoZSBzeXMgY2xrIHRvIGNhbGN1bGF0ZSIKLQkJCSJ2YXJpb3VzIHZkZF8lcyBwYXJhbXNcbiIsIF9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN5c19jbGtfc3BlZWQgPSBjbGtfZ2V0X3JhdGUoc3lzX2NrKTsKLQljbGtfcHV0KHN5c19jayk7Ci0JLyogRGl2aWRlIHRvIGF2b2lkIG92ZXJmbG93ICovCi0Jc3lzX2Nsa19zcGVlZCAvPSAxMDAwOwotCi0JLyogR2VuZXJpYyB2b2x0YWdlIHBhcmFtZXRlcnMgKi8KLQl2ZGQtPnZvbHRfc2NhbGUgPSB2cF9mb3JjZXVwZGF0ZV9zY2FsZV92b2x0YWdlOwotCXZkZC0+dnBfZW5hYmxlZCA9IGZhbHNlOwotCi0JdmRkLT52cF9ydF9kYXRhLnZwY29uZmlnX2Vycm9yb2Zmc2V0ID0KLQkJKHZkZC0+cG1pY19pbmZvLT52cF9lcnJvcm9mZnNldCA8PAotCQkgdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2Vycm9yb2Zmc2V0X3NoaWZ0KTsKLQotCXRpbWVvdXRfdmFsID0gKHN5c19jbGtfc3BlZWQgKiB2ZGQtPnBtaWNfaW5mby0+dnBfdGltZW91dF91cykgLyAxMDAwOwotCXZkZC0+dnBfcnRfZGF0YS52bGltaXR0b190aW1lb3V0ID0gdGltZW91dF92YWw7Ci0JdmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3ZkZG1pbiA9IHZkZC0+cG1pY19pbmZvLT52cF92ZGRtaW47Ci0JdmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3ZkZG1heCA9IHZkZC0+cG1pY19pbmZvLT52cF92ZGRtYXg7Ci0KLQl3YWl0dGltZSA9ICgodmRkLT5wbWljX2luZm8tPnN0ZXBfc2l6ZSAvIHZkZC0+cG1pY19pbmZvLT5zbGV3X3JhdGUpICoKLQkJCQlzeXNfY2xrX3NwZWVkKSAvIDEwMDA7Ci0JdmRkLT52cF9ydF9kYXRhLnZzdGVwbWluX3NtcHN3YWl0dGltZW1pbiA9IHdhaXR0aW1lOwotCXZkZC0+dnBfcnRfZGF0YS52c3RlcG1heF9zbXBzd2FpdHRpbWVtYXggPSB3YWl0dGltZTsKLQl2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtaW5fc3RlcG1pbiA9IHZkZC0+cG1pY19pbmZvLT52cF92c3RlcG1pbjsKLQl2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc3RlcG1heCA9IHZkZC0+cG1pY19pbmZvLT52cF92c3RlcG1heDsKLQotCXJldHVybiAwOwotfQotCi0vKiBWb2x0YWdlIGRlYnVnZnMgc3VwcG9ydCAqLwotc3RhdGljIGludCB2cF92b2x0X2RlYnVnX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKLXsKLQlzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkID0gKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICopIGRhdGE7Ci0JdTggdnNlbDsKLQotCWlmICghdmRkKSB7Ci0JCXByX3dhcm5pbmcoIldyb25nIHBhcmFtYXRlciBwYXNzZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2c2VsID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dm9sdGFnZSk7Ci0KLQlpZiAoIXZkZC0+cG1pY19pbmZvLT52c2VsX3RvX3V2KSB7Ci0JCXByX3dhcm5pbmcoIlBNSUMgZnVuY3Rpb24gdG8gY29udmVydCB2c2VsIHRvIHZvbHRhZ2UiCi0JCQkiaW4gdVYgbm90IHJlZ2lzdGVyZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSp2YWwgPSB2ZGQtPnBtaWNfaW5mby0+dnNlbF90b191dih2c2VsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBub21fdm9sdF9kZWJ1Z19nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCA9IChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqKSBkYXRhOwotCi0JaWYgKCF2ZGQpIHsKLQkJcHJfd2FybmluZygiV3JvbmcgcGFyYW1hdGVyIHBhc3NlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSp2YWwgPSBvbWFwX3ZvbHRhZ2VfZ2V0X25vbV92b2x0KCZ2ZGQtPnZvbHRkbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUodnBfdm9sdF9kZWJ1Z19mb3BzLCB2cF92b2x0X2RlYnVnX2dldCwgTlVMTCwgIiVsbHVcbiIpOwotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUobm9tX3ZvbHRfZGVidWdfZm9wcywgbm9tX3ZvbHRfZGVidWdfZ2V0LCBOVUxMLAotCQkJCQkJCQkiJWxsdVxuIik7Ci1zdGF0aWMgdm9pZCB2cF9sYXRjaF92c2VsKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JdTMyIHZwY29uZmlnOwotCXVuc2lnbmVkIGxvbmcgdXZkYzsKLQljaGFyIHZzZWw7Ci0KLQl1dmRjID0gb21hcF92b2x0YWdlX2dldF9ub21fdm9sdCgmdmRkLT52b2x0ZG0pOwotCWlmICghdXZkYykgewotCQlwcl93YXJuaW5nKCIlczogdW5hYmxlIHRvIGZpbmQgY3VycmVudCB2b2x0YWdlIGZvciB2ZGRfJXNcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXZkZC0+cG1pY19pbmZvIHx8ICF2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCkgewotCQlwcl93YXJuaW5nKCIlczogUE1JQyBmdW5jdGlvbiB0byBjb252ZXJ0IHZvbHRhZ2UgaW4gdVYgdG8iCi0JCQkiIHZzZWwgbm90IHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXZzZWwgPSB2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCh1dmRjKTsKLQotCXZwY29uZmlnID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCXZwY29uZmlnICY9IH4odmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2b2x0YWdlX21hc2sgfAotCQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2ZGQpOwotCXZwY29uZmlnIHw9IHZzZWwgPDwgdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2b2x0YWdlX3NoaWZ0OwotCi0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0KLQkvKiBUcmlnZ2VyIGluaXRWREQgdmFsdWUgY29weSB0byB2b2x0YWdlIHByb2Nlc3NvciAqLwotCXZkZC0+d3JpdGVfcmVnKCh2cGNvbmZpZyB8IHZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dmRkKSwKLQkJICAgICAgIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0KLQkvKiBDbGVhciBpbml0VkREIGNvcHkgdHJpZ2dlciBiaXQgKi8KLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLX0KLQotLyogR2VuZXJpYyB2b2x0YWdlIGluaXQgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBfX2luaXQgdnBfaW5pdChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkKQotewotCXUzMiB2cF92YWw7Ci0KLQlpZiAoIXZkZC0+cmVhZF9yZWcgfHwgIXZkZC0+d3JpdGVfcmVnKSB7Ci0JCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2cF92YWwgPSB2ZGQtPnZwX3J0X2RhdGEudnBjb25maWdfZXJyb3JvZmZzZXQgfAotCQkodmRkLT52cF9ydF9kYXRhLnZwY29uZmlnX2Vycm9yZ2FpbiA8PAotCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfZXJyb3JnYWluX3NoaWZ0KSB8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ190aW1lb3V0ZW47Ci0JdmRkLT53cml0ZV9yZWcodnBfdmFsLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JdnBfdmFsID0gKCh2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluIDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW5fc2hpZnQpIHwKLQkJKHZkZC0+dnBfcnRfZGF0YS52c3RlcG1pbl9zdGVwbWluIDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52c3RlcG1pbl9zdGVwbWluX3NoaWZ0KSk7Ci0JdmRkLT53cml0ZV9yZWcodnBfdmFsLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnN0ZXBtaW4pOwotCi0JdnBfdmFsID0gKCh2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4IDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52c3RlcG1heF9zbXBzd2FpdHRpbWVtYXhfc2hpZnQpIHwKLQkJKHZkZC0+dnBfcnRfZGF0YS52c3RlcG1heF9zdGVwbWF4IDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52c3RlcG1heF9zdGVwbWF4X3NoaWZ0KSk7Ci0JdmRkLT53cml0ZV9yZWcodnBfdmFsLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnN0ZXBtYXgpOwotCi0JdnBfdmFsID0gKCh2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdmRkbWF4IDw8Ci0JCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52bGltaXR0b192ZGRtYXhfc2hpZnQpIHwKLQkJKHZkZC0+dnBfcnRfZGF0YS52bGltaXR0b192ZGRtaW4gPDwKLQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZsaW1pdHRvX3ZkZG1pbl9zaGlmdCkgfAotCQkodmRkLT52cF9ydF9kYXRhLnZsaW1pdHRvX3RpbWVvdXQgPDwKLQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZsaW1pdHRvX3RpbWVvdXRfc2hpZnQpKTsKLQl2ZGQtPndyaXRlX3JlZyh2cF92YWwsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52bGltaXR0byk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2ZGRfZGVidWdmc19pbml0KHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0JY2hhciAqbmFtZTsKLQotCW5hbWUgPSBremFsbG9jKFZPTFRBR0VfRElSX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghbmFtZSkgewotCQlwcl93YXJuaW5nKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGVidWdmcyIKLQkJCSIgZGlyZWN0b3J5IG5hbWUgZm9yIHZkZF8lcyIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0Jc3RyY3B5KG5hbWUsICJ2ZGRfIik7Ci0Jc3RyY2F0KG5hbWUsIHZkZC0+dm9sdGRtLm5hbWUpOwotCi0JdmRkLT5kZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgdm9sdGFnZV9kaXIpOwotCWtmcmVlKG5hbWUpOwotCWlmIChJU19FUlIodmRkLT5kZWJ1Z19kaXIpKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBVbmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5IGZvciIKLQkJCSIgdmRkXyVzXG4iLCBfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXZkZC0+ZGVidWdfZGlyID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94MTYoInZwX2Vycm9yZ2FpbiIsIFNfSVJVR08sIHZkZC0+ZGVidWdfZGlyLAotCQkJCSYodmRkLT52cF9ydF9kYXRhLnZwY29uZmlnX2Vycm9yZ2FpbikpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94MTYoInZwX3NtcHN3YWl0dGltZW1pbiIsIFNfSVJVR08sCi0JCQkJdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluKSk7Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX3g4KCJ2cF9zdGVwbWluIiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtaW5fc3RlcG1pbikpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94MTYoInZwX3NtcHN3YWl0dGltZW1heCIsIFNfSVJVR08sCi0JCQkJdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4KSk7Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX3g4KCJ2cF9zdGVwbWF4IiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudnN0ZXBtYXhfc3RlcG1heCkpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV94OCgidnBfdmRkbWF4IiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdmRkbWF4KSk7Ci0JKHZvaWQpIGRlYnVnZnNfY3JlYXRlX3g4KCJ2cF92ZGRtaW4iLCBTX0lSVUdPLCB2ZGQtPmRlYnVnX2RpciwKLQkJCQkmKHZkZC0+dnBfcnRfZGF0YS52bGltaXR0b192ZGRtaW4pKTsKLQkodm9pZCkgZGVidWdmc19jcmVhdGVfeDE2KCJ2cF90aW1lb3V0IiwgU19JUlVHTywgdmRkLT5kZWJ1Z19kaXIsCi0JCQkJJih2ZGQtPnZwX3J0X2RhdGEudmxpbWl0dG9fdGltZW91dCkpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjdXJyX3ZwX3ZvbHQiLCBTX0lSVUdPLCB2ZGQtPmRlYnVnX2RpciwKLQkJCQkodm9pZCAqKSB2ZGQsICZ2cF92b2x0X2RlYnVnX2ZvcHMpOwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjdXJyX25vbWluYWxfdm9sdCIsIFNfSVJVR08sCi0JCQkJdmRkLT5kZWJ1Z19kaXIsICh2b2lkICopIHZkZCwKLQkJCQkmbm9tX3ZvbHRfZGVidWdfZm9wcyk7Ci19Ci0KLS8qIFZvbHRhZ2Ugc2NhbGUgYW5kIGFjY2Vzc29yeSBBUElzICovCi1zdGF0aWMgaW50IF9wcmVfdm9sdF9zY2FsZShzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkLAotCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LCB1OCAqdGFyZ2V0X3ZzZWwsIHU4ICpjdXJyZW50X3ZzZWwpCi17Ci0Jc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGE7Ci0JY29uc3Qgc3RydWN0IG9tYXBfdmNfY29tbW9uX2RhdGEgKnZjX2NvbW1vbjsKLQljb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb25fZGF0YSAqdnBfY29tbW9uOwotCXUzMiB2Y19jbWR2YWwsIHZwX2VycmdhaW5fdmFsOwotCi0JdmNfY29tbW9uID0gdmRkLT52Y19kYXRhLT52Y19jb21tb247Ci0JdnBfY29tbW9uID0gdmRkLT52cF9kYXRhLT52cF9jb21tb247Ci0KLQkvKiBDaGVjayBpZiBzdWZmaWVjaWVudCBwbWljIGluZm8gaXMgYXZhaWxhYmxlIGZvciB0aGlzIHZkZCAqLwotCWlmICghdmRkLT5wbWljX2luZm8pIHsKLQkJcHJfZXJyKCIlczogSW5zdWZmaWNpZW50IHBtaWMgaW5mbyB0byBzY2FsZSB0aGUgdmRkXyVzXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKSB7Ci0JCXByX2VycigiJXM6IFBNSUMgZnVuY3Rpb24gdG8gY29udmVydCB2b2x0YWdlIGluIHVWIHRvIgotCQkJInZzZWwgbm90IHJlZ2lzdGVyZWQuIEhlbmNlIHVuYWJsZSB0byBzY2FsZSB2b2x0YWdlIgotCQkJImZvciB2ZGRfJXNcbiIsIF9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQkJcmV0dXJuIC1FTk9EQVRBOwotCX0KLQotCWlmICghdmRkLT5yZWFkX3JlZyB8fCAhdmRkLT53cml0ZV9yZWcpIHsKLQkJcHJfZXJyKCIlczogTm8gcmVhZC93cml0ZSBBUEkgZm9yIGFjY2Vzc2luZyB2ZGRfJXMgcmVnc1xuIiwKLQkJCV9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogR2V0IHZvbHRfZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRhcmdldF92b2x0ICovCi0Jdm9sdF9kYXRhID0gb21hcF92b2x0YWdlX2dldF92b2x0ZGF0YSgmdmRkLT52b2x0ZG0sIHRhcmdldF92b2x0KTsKLQlpZiAoSVNfRVJSKHZvbHRfZGF0YSkpCi0JCXZvbHRfZGF0YSA9IE5VTEw7Ci0KLQkqdGFyZ2V0X3ZzZWwgPSB2ZGQtPnBtaWNfaW5mby0+dXZfdG9fdnNlbCh0YXJnZXRfdm9sdCk7Ci0JKmN1cnJlbnRfdnNlbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZvbHRhZ2UpOwotCi0JLyogU2V0dGluZyB0aGUgT04gdm9sdGFnZSB0byB0aGUgbmV3IHRhcmdldCB2b2x0YWdlICovCi0JdmNfY21kdmFsID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dmNfZGF0YS0+Y21kdmFsX3JlZyk7Ci0JdmNfY21kdmFsICY9IH52Y19jb21tb24tPmNtZF9vbl9tYXNrOwotCXZjX2NtZHZhbCB8PSAoKnRhcmdldF92c2VsIDw8IHZjX2NvbW1vbi0+Y21kX29uX3NoaWZ0KTsKLQl2ZGQtPndyaXRlX3JlZyh2Y19jbWR2YWwsIHBybV9tb2Rfb2ZmcywgdmRkLT52Y19kYXRhLT5jbWR2YWxfcmVnKTsKLQotCS8qIFNldHRpbmcgdnAgZXJyb3JnYWluIGJhc2VkIG9uIHRoZSB2b2x0YWdlICovCi0JaWYgKHZvbHRfZGF0YSkgewotCQl2cF9lcnJnYWluX3ZhbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLAotCQkJCQkgICAgICAgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JCXZkZC0+dnBfcnRfZGF0YS52cGNvbmZpZ19lcnJvcmdhaW4gPSB2b2x0X2RhdGEtPnZwX2VycmdhaW47Ci0JCXZwX2VycmdhaW5fdmFsICY9IH52cF9jb21tb24tPnZwY29uZmlnX2Vycm9yZ2Fpbl9tYXNrOwotCQl2cF9lcnJnYWluX3ZhbCB8PSB2ZGQtPnZwX3J0X2RhdGEudnBjb25maWdfZXJyb3JnYWluIDw8Ci0JCQl2cF9jb21tb24tPnZwY29uZmlnX2Vycm9yZ2Fpbl9zaGlmdDsKLQkJdmRkLT53cml0ZV9yZWcodnBfZXJyZ2Fpbl92YWwsIHBybV9tb2Rfb2ZmcywKLQkJCSAgICAgICB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX3Bvc3Rfdm9sdF9zY2FsZShzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkLAotCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LCB1OCB0YXJnZXRfdnNlbCwgdTggY3VycmVudF92c2VsKQotewotCXUzMiBzbXBzX3N0ZXBzID0gMCwgc21wc19kZWxheSA9IDA7Ci0KLQlzbXBzX3N0ZXBzID0gYWJzKHRhcmdldF92c2VsIC0gY3VycmVudF92c2VsKTsKLQkvKiBTTVBTIHNsZXcgcmF0ZSAvIHN0ZXAgc2l6ZS4gMnVzIGFkZGVkIGFzIGJ1ZmZlci4gKi8KLQlzbXBzX2RlbGF5ID0gKChzbXBzX3N0ZXBzICogdmRkLT5wbWljX2luZm8tPnN0ZXBfc2l6ZSkgLwotCQkJdmRkLT5wbWljX2luZm8tPnNsZXdfcmF0ZSkgKyAyOwotCXVkZWxheShzbXBzX2RlbGF5KTsKLQotCXZkZC0+Y3Vycl92b2x0ID0gdGFyZ2V0X3ZvbHQ7Ci19Ci0KLS8qIHZjX2J5cGFzc19zY2FsZV92b2x0YWdlIC0gVkMgYnlwYXNzIG1ldGhvZCBvZiB2b2x0YWdlIHNjYWxpbmcgKi8KLXN0YXRpYyBpbnQgdmNfYnlwYXNzX3NjYWxlX3ZvbHRhZ2Uoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCwKLQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCkKLXsKLQl1MzIgbG9vcF9jbnQgPSAwLCByZXRyaWVzX2NudCA9IDA7Ci0JdTMyIHZjX3ZhbGlkLCB2Y19ieXBhc3NfdmFsX3JlZywgdmNfYnlwYXNzX3ZhbHVlOwotCXU4IHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWw7Ci0JaW50IHJldDsKLQotCXJldCA9IF9wcmVfdm9sdF9zY2FsZSh2ZGQsIHRhcmdldF92b2x0LCAmdGFyZ2V0X3ZzZWwsICZjdXJyZW50X3ZzZWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl2Y192YWxpZCA9IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT52YWxpZDsKLQl2Y19ieXBhc3NfdmFsX3JlZyA9IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5ieXBhc3NfdmFsX3JlZzsKLQl2Y19ieXBhc3NfdmFsdWUgPSAodGFyZ2V0X3ZzZWwgPDwgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPmRhdGFfc2hpZnQpIHwKLQkJCSh2ZGQtPnBtaWNfaW5mby0+cG1pY19yZWcgPDwKLQkJCXZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5yZWdhZGRyX3NoaWZ0KSB8Ci0JCQkodmRkLT5wbWljX2luZm8tPmkyY19zbGF2ZV9hZGRyIDw8Ci0JCQl2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+c2xhdmVhZGRyX3NoaWZ0KTsKLQotCXZkZC0+d3JpdGVfcmVnKHZjX2J5cGFzc192YWx1ZSwgcHJtX21vZF9vZmZzLCB2Y19ieXBhc3NfdmFsX3JlZyk7Ci0JdmRkLT53cml0ZV9yZWcodmNfYnlwYXNzX3ZhbHVlIHwgdmNfdmFsaWQsIHBybV9tb2Rfb2ZmcywKLQkJICAgICAgIHZjX2J5cGFzc192YWxfcmVnKTsKLQotCXZjX2J5cGFzc192YWx1ZSA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2Y19ieXBhc3NfdmFsX3JlZyk7Ci0JLyoKLQkgKiBMb29wIHRpbGwgdGhlIGJ5cGFzcyBjb21tYW5kIGlzIGFja25vd2xlZGdlZCBmcm9tIHRoZSBTTVBTLgotCSAqIE5PVEU6IFRoaXMgaXMgbGVnYWN5IGNvZGUuIFRoZSBsb29wIGNvdW50IGFuZCByZXRyeSBjb3VudCBuZWVkcwotCSAqIHRvIGJlIHJldmlzaXRlZC4KLQkgKi8KLQl3aGlsZSAoISh2Y19ieXBhc3NfdmFsdWUgJiB2Y192YWxpZCkpIHsKLQkJbG9vcF9jbnQrKzsKLQotCQlpZiAocmV0cmllc19jbnQgPiAxMCkgewotCQkJcHJfd2FybmluZygiJXM6IFJldHJ5IGNvdW50IGV4Y2VlZGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCi0JCWlmIChsb29wX2NudCA+IDUwKSB7Ci0JCQlyZXRyaWVzX2NudCsrOwotCQkJbG9vcF9jbnQgPSAwOwotCQkJdWRlbGF5KDEwKTsKLQkJfQotCQl2Y19ieXBhc3NfdmFsdWUgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywKLQkJCQkJCXZjX2J5cGFzc192YWxfcmVnKTsKLQl9Ci0KLQlfcG9zdF92b2x0X3NjYWxlKHZkZCwgdGFyZ2V0X3ZvbHQsIHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWwpOwotCXJldHVybiAwOwotfQotCi0vKiBWUCBmb3JjZSB1cGRhdGUgbWV0aG9kIG9mIHZvbHRhZ2Ugc2NhbGluZyAqLwotc3RhdGljIGludCB2cF9mb3JjZXVwZGF0ZV9zY2FsZV92b2x0YWdlKHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQsCi0JCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCi17Ci0JdTMyIHZwY29uZmlnOwotCXU4IHRhcmdldF92c2VsLCBjdXJyZW50X3ZzZWwsIHBybV9pcnFzdF9yZWc7Ci0JaW50IHJldCwgdGltZW91dCA9IDA7Ci0KLQlyZXQgPSBfcHJlX3ZvbHRfc2NhbGUodmRkLCB0YXJnZXRfdm9sdCwgJnRhcmdldF92c2VsLCAmY3VycmVudF92c2VsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHJtX2lycXN0X3JlZyA9IHZkZC0+dnBfZGF0YS0+cHJtX2lycXN0X2RhdGEtPnBybV9pcnFzdF9yZWc7Ci0KLQkvKgotCSAqIENsZWFyIGFsbCBwZW5kaW5nIFRyYW5zYWN0aW9uRG9uZSBpbnRlcnJ1cHQvc3RhdHVzLiBUeXBpY2FsIGxhdGVuY3kKLQkgKiBpcyA8M3VzCi0JICovCi0Jd2hpbGUgKHRpbWVvdXQrKyA8IFZQX1RSQU5YRE9ORV9USU1FT1VUKSB7Ci0JCXZkZC0+d3JpdGVfcmVnKHZkZC0+dnBfZGF0YS0+cHJtX2lycXN0X2RhdGEtPnRyYW54ZG9uZV9zdGF0dXMsCi0JCQkgICAgICAgcHJtX2lycXN0X29jcF9tb2Rfb2ZmcywgcHJtX2lycXN0X3JlZyk7Ci0JCWlmICghKHZkZC0+cmVhZF9yZWcocHJtX2lycXN0X29jcF9tb2Rfb2ZmcywgcHJtX2lycXN0X3JlZykgJgotCQkgICAgICB2ZGQtPnZwX2RhdGEtPnBybV9pcnFzdF9kYXRhLT50cmFueGRvbmVfc3RhdHVzKSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMSk7Ci0JfQotCWlmICh0aW1lb3V0ID49IFZQX1RSQU5YRE9ORV9USU1FT1VUKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiB2ZGRfJXMgVFJBTlhET05FIHRpbWVvdXQgZXhjZWVkZWQuIgotCQkJIlZvbHRhZ2UgY2hhbmdlIGFib3J0ZWQiLCBfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCS8qIENvbmZpZ3VyZSBmb3IgVlAtRm9yY2UgVXBkYXRlICovCi0JdnBjb25maWcgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JdnBjb25maWcgJj0gfih2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfaW5pdHZkZCB8Ci0JCQl2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfZm9yY2V1cGRhdGUgfAotCQkJdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2luaXR2b2x0YWdlX21hc2spOwotCXZwY29uZmlnIHw9ICgodGFyZ2V0X3ZzZWwgPDwKLQkJCXZkZC0+dnBfZGF0YS0+dnBfY29tbW9uLT52cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdCkpOwotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JLyogVHJpZ2dlciBpbml0VkREIHZhbHVlIGNvcHkgdG8gdm9sdGFnZSBwcm9jZXNzb3IgKi8KLQl2cGNvbmZpZyB8PSB2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfaW5pdHZkZDsKLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQotCS8qIEZvcmNlIHVwZGF0ZSBvZiB2b2x0YWdlICovCi0JdnBjb25maWcgfD0gdmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2ZvcmNldXBkYXRlOwotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBUcmFuc2FjdGlvbkRvbmUuIFR5cGljYWwgbGF0ZW5jeSBpcyA8MjAwdXMuCi0JICogRGVwZW5kcyBvbiBTTVBTV0FJVFRJTUVNSU4vTUFYIGFuZCB2b2x0YWdlIGNoYW5nZQotCSAqLwotCXRpbWVvdXQgPSAwOwotCW9tYXBfdGVzdF90aW1lb3V0KCh2ZGQtPnJlYWRfcmVnKHBybV9pcnFzdF9vY3BfbW9kX29mZnMsIHBybV9pcnFzdF9yZWcpICYKLQkJCSAgIHZkZC0+dnBfZGF0YS0+cHJtX2lycXN0X2RhdGEtPnRyYW54ZG9uZV9zdGF0dXMpLAotCQkJICBWUF9UUkFOWERPTkVfVElNRU9VVCwgdGltZW91dCk7Ci0JaWYgKHRpbWVvdXQgPj0gVlBfVFJBTlhET05FX1RJTUVPVVQpCi0JCXByX2VycigiJXM6IHZkZF8lcyBUUkFOWERPTkUgdGltZW91dCBleGNlZWRlZC4iCi0JCQkiVFJBTlhET05FIG5ldmVyIGdvdCBzZXQgYWZ0ZXIgdGhlIHZvbHRhZ2UgdXBkYXRlXG4iLAotCQkJX19mdW5jX18sIHZkZC0+dm9sdGRtLm5hbWUpOwotCi0JX3Bvc3Rfdm9sdF9zY2FsZSh2ZGQsIHRhcmdldF92b2x0LCB0YXJnZXRfdnNlbCwgY3VycmVudF92c2VsKTsKLQotCS8qCi0JICogRGlzYWJsZSBUcmFuc2FjdGlvbkRvbmUgaW50ZXJydXB0ICwgY2xlYXIgYWxsIHN0YXR1cywgY2xlYXIKLQkgKiBjb250cm9sIHJlZ2lzdGVycwotCSAqLwotCXRpbWVvdXQgPSAwOwotCXdoaWxlICh0aW1lb3V0KysgPCBWUF9UUkFOWERPTkVfVElNRU9VVCkgewotCQl2ZGQtPndyaXRlX3JlZyh2ZGQtPnZwX2RhdGEtPnBybV9pcnFzdF9kYXRhLT50cmFueGRvbmVfc3RhdHVzLAotCQkJICAgICAgIHBybV9pcnFzdF9vY3BfbW9kX29mZnMsIHBybV9pcnFzdF9yZWcpOwotCQlpZiAoISh2ZGQtPnJlYWRfcmVnKHBybV9pcnFzdF9vY3BfbW9kX29mZnMsIHBybV9pcnFzdF9yZWcpICYKLQkJICAgICAgdmRkLT52cF9kYXRhLT5wcm1faXJxc3RfZGF0YS0+dHJhbnhkb25lX3N0YXR1cykpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEpOwotCX0KLQotCWlmICh0aW1lb3V0ID49IFZQX1RSQU5YRE9ORV9USU1FT1VUKQotCQlwcl93YXJuaW5nKCIlczogdmRkXyVzIFRSQU5YRE9ORSB0aW1lb3V0IGV4Y2VlZGVkIHdoaWxlIHRyeWluZyIKLQkJCSJ0byBjbGVhciB0aGUgVFJBTlhET05FIHN0YXR1c1xuIiwKLQkJCV9fZnVuY19fLCB2ZGQtPnZvbHRkbS5uYW1lKTsKLQotCXZwY29uZmlnID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCS8qIENsZWFyIGluaXRWREQgY29weSB0cmlnZ2VyIGJpdCAqLwotCXZwY29uZmlnICY9IH52ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfaW5pdHZkZDsKLQl2ZGQtPndyaXRlX3JlZyh2cGNvbmZpZywgcHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQkvKiBDbGVhciBmb3JjZSBiaXQgKi8KLQl2cGNvbmZpZyAmPSB+dmRkLT52cF9kYXRhLT52cF9jb21tb24tPnZwY29uZmlnX2ZvcmNldXBkYXRlOwotCXZkZC0+d3JpdGVfcmVnKHZwY29uZmlnLCBwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM192ZnNtX2luaXQoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCkKLXsKLQkvKgotCSAqIFZvbHRhZ2UgTWFuYWdlciBGU00gcGFyYW1ldGVycyBpbml0Ci0JICogWFhYIFRoaXMgZGF0YSBzaG91bGQgYmUgcGFzc2VkIGluIGZyb20gdGhlIGJvYXJkIGZpbGUKLQkgKi8KLQl2ZGQtPndyaXRlX3JlZyhPTUFQM19DTEtTRVRVUCwgcHJtX21vZF9vZmZzLCBPTUFQM19QUk1fQ0xLU0VUVVBfT0ZGU0VUKTsKLQl2ZGQtPndyaXRlX3JlZyhPTUFQM19WT0xUT0ZGU0VULCBwcm1fbW9kX29mZnMsCi0JCSAgICAgICBPTUFQM19QUk1fVk9MVE9GRlNFVF9PRkZTRVQpOwotCXZkZC0+d3JpdGVfcmVnKE9NQVAzX1ZPTFRTRVRVUDIsIHBybV9tb2Rfb2ZmcywKLQkJICAgICAgIE9NQVAzX1BSTV9WT0xUU0VUVVAyX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwM192Y19pbml0KHN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQpCi17Ci0Jc3RhdGljIGJvb2wgaXNfaW5pdGlhbGl6ZWQ7Ci0JdTggb25fdnNlbCwgb25scF92c2VsLCByZXRfdnNlbCwgb2ZmX3ZzZWw7Ci0JdTMyIHZjX3ZhbDsKLQotCWlmIChpc19pbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCi0JLyogU2V0IHVwIHRoZSBvbiwgaW5hY3RpdmUsIHJldGVudGlvbiBhbmQgb2ZmIHZvbHRhZ2UgKi8KLQlvbl92c2VsID0gdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwodmRkLT5wbWljX2luZm8tPm9uX3ZvbHQpOwotCW9ubHBfdnNlbCA9IHZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKHZkZC0+cG1pY19pbmZvLT5vbmxwX3ZvbHQpOwotCXJldF92c2VsID0gdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwodmRkLT5wbWljX2luZm8tPnJldF92b2x0KTsKLQlvZmZfdnNlbCA9IHZkZC0+cG1pY19pbmZvLT51dl90b192c2VsKHZkZC0+cG1pY19pbmZvLT5vZmZfdm9sdCk7Ci0JdmNfdmFsCT0gKChvbl92c2VsIDw8IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5jbWRfb25fc2hpZnQpIHwKLQkJKG9ubHBfdnNlbCA8PCB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+Y21kX29ubHBfc2hpZnQpIHwKLQkJKHJldF92c2VsIDw8IHZkZC0+dmNfZGF0YS0+dmNfY29tbW9uLT5jbWRfcmV0X3NoaWZ0KSB8Ci0JCShvZmZfdnNlbCA8PCB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+Y21kX29mZl9zaGlmdCkpOwotCXZkZC0+d3JpdGVfcmVnKHZjX3ZhbCwgcHJtX21vZF9vZmZzLCB2ZGQtPnZjX2RhdGEtPmNtZHZhbF9yZWcpOwotCi0JLyoKLQkgKiBHZW5lcmljIFZDIHBhcmFtZXRlcnMgaW5pdAotCSAqIFhYWCBUaGlzIGRhdGEgc2hvdWxkIGJlIGFic3RyYWN0ZWQgb3V0Ci0JICovCi0JdmRkLT53cml0ZV9yZWcoT01BUDM0MzBfQ01EMV9NQVNLIHwgT01BUDM0MzBfUkFWMV9NQVNLLCBwcm1fbW9kX29mZnMsCi0JCQlPTUFQM19QUk1fVkNfQ0hfQ09ORl9PRkZTRVQpOwotCXZkZC0+d3JpdGVfcmVnKE9NQVAzNDMwX01DT0RFX1NISUZUIHwgT01BUDM0MzBfSFNFTl9NQVNLLCBwcm1fbW9kX29mZnMsCi0JCQlPTUFQM19QUk1fVkNfSTJDX0NGR19PRkZTRVQpOwotCi0Jb21hcDNfdmZzbV9pbml0KHZkZCk7Ci0KLQlpc19pbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLQotLyogT01BUDQgc3BlY2lmaWMgdm9sdGFnZSBpbml0IGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgX19pbml0IG9tYXA0X3ZjX2luaXQoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCkKLXsKLQlzdGF0aWMgYm9vbCBpc19pbml0aWFsaXplZDsKLQl1MzIgdmNfdmFsOwotCi0JaWYgKGlzX2luaXRpYWxpemVkKQotCQlyZXR1cm47Ci0KLQkvKiBUT0RPOiBDb25maWd1cmUgc2V0dXAgdGltZXMgYW5kIENNRF9WQUwgdmFsdWVzKi8KLQotCS8qCi0JICogR2VuZXJpYyBWQyBwYXJhbWV0ZXJzIGluaXQKLQkgKiBYWFggVGhpcyBkYXRhIHNob3VsZCBiZSBhYnN0cmFjdGVkIG91dAotCSAqLwotCXZjX3ZhbCA9IChPTUFQNDQzMF9SQVZfVkREX01QVV9MX01BU0sgfCBPTUFQNDQzMF9DTURfVkREX01QVV9MX01BU0sgfAotCQkgIE9NQVA0NDMwX1JBVl9WRERfSVZBX0xfTUFTSyB8IE9NQVA0NDMwX0NNRF9WRERfSVZBX0xfTUFTSyB8Ci0JCSAgT01BUDQ0MzBfUkFWX1ZERF9DT1JFX0xfTUFTSyB8IE9NQVA0NDMwX0NNRF9WRERfQ09SRV9MX01BU0spOwotCXZkZC0+d3JpdGVfcmVnKHZjX3ZhbCwgcHJtX21vZF9vZmZzLCBPTUFQNF9QUk1fVkNfQ0ZHX0NIQU5ORUxfT0ZGU0VUKTsKLQotCS8qIFhYWCBUaGVzZSBhcmUgbWFnaWMgbnVtYmVycyBhbmQgZG8gbm90IGJlbG9uZyEgKi8KLQl2Y192YWwgPSAoMHg2MCA8PCBPTUFQNDQzMF9TQ0xMX1NISUZUIHwgMHgyNiA8PCBPTUFQNDQzMF9TQ0xIX1NISUZUKTsKLQl2ZGQtPndyaXRlX3JlZyh2Y192YWwsIHBybV9tb2Rfb2ZmcywgT01BUDRfUFJNX1ZDX0NGR19JMkNfQ0xLX09GRlNFVCk7Ci0KLQlpc19pbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3ZjX2luaXQoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCkKLXsKLQl1MzIgdmNfdmFsOwotCi0JaWYgKCF2ZGQtPnBtaWNfaW5mbyB8fCAhdmRkLT5wbWljX2luZm8tPnV2X3RvX3ZzZWwpIHsKLQkJcHJfZXJyKCIlczogUE1JQyBpbmZvIHJlcXVyaWVkIHRvIGNvbmZpZ3VyZSB2YyBmb3IiCi0JCQkidmRkXyVzIG5vdCBwb3B1bGF0ZWQuSGVuY2UgY2Fubm90IGluaXRpYWxpemUgdmNcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXZkZC0+cmVhZF9yZWcgfHwgIXZkZC0+d3JpdGVfcmVnKSB7Ci0JCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIFNNUFNfU0EoaTJjIHNsYXZlIGFkZHJlc3MgaW4gVkMgKi8KLQl2Y192YWwgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywKLQkJCSAgICAgICB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+c21wc19zYV9yZWcpOwotCXZjX3ZhbCAmPSB+dmRkLT52Y19kYXRhLT5zbXBzX3NhX21hc2s7Ci0JdmNfdmFsIHw9IHZkZC0+cG1pY19pbmZvLT5pMmNfc2xhdmVfYWRkciA8PCB2ZGQtPnZjX2RhdGEtPnNtcHNfc2Ffc2hpZnQ7Ci0JdmRkLT53cml0ZV9yZWcodmNfdmFsLCBwcm1fbW9kX29mZnMsCi0JCSAgICAgICB2ZGQtPnZjX2RhdGEtPnZjX2NvbW1vbi0+c21wc19zYV9yZWcpOwotCi0JLyogU2V0dXAgdGhlIFZPTFJBKHBtaWMgcmVnIGFkZHIpIGluIFZDICovCi0JdmNfdmFsID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsCi0JCQkgICAgICAgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPnNtcHNfdm9scmFfcmVnKTsKLQl2Y192YWwgJj0gfnZkZC0+dmNfZGF0YS0+c21wc192b2xyYV9tYXNrOwotCXZjX3ZhbCB8PSB2ZGQtPnBtaWNfaW5mby0+cG1pY19yZWcgPDwgdmRkLT52Y19kYXRhLT5zbXBzX3ZvbHJhX3NoaWZ0OwotCXZkZC0+d3JpdGVfcmVnKHZjX3ZhbCwgcHJtX21vZF9vZmZzLAotCQkgICAgICAgdmRkLT52Y19kYXRhLT52Y19jb21tb24tPnNtcHNfdm9scmFfcmVnKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgc2V0dXAgdGltZXMgKi8KLQl2Y192YWwgPSB2ZGQtPnJlYWRfcmVnKHBybV9tb2Rfb2ZmcywgdmRkLT52ZnNtLT52b2x0c2V0dXBfcmVnKTsKLQl2Y192YWwgJj0gfnZkZC0+dmZzbS0+dm9sdHNldHVwX21hc2s7Ci0JdmNfdmFsIHw9IHZkZC0+cG1pY19pbmZvLT52b2x0X3NldHVwX3RpbWUgPDwKLQkJCXZkZC0+dmZzbS0+dm9sdHNldHVwX3NoaWZ0OwotCXZkZC0+d3JpdGVfcmVnKHZjX3ZhbCwgcHJtX21vZF9vZmZzLCB2ZGQtPnZmc20tPnZvbHRzZXR1cF9yZWcpOwotCi0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQlvbWFwM192Y19pbml0KHZkZCk7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCW9tYXA0X3ZjX2luaXQodmRkKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgb21hcF92ZGRfZGF0YV9jb25maWd1cmUoc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZCkKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWlmICghdmRkLT5wbWljX2luZm8pIHsKLQkJcHJfZXJyKCIlczogUE1JQyBpbmZvIHJlcXVyaWVkIHRvIGNvbmZpZ3VyZSB2ZGRfJXMgbm90IgotCQkJInBvcHVsYXRlZC5IZW5jZSBjYW5ub3QgaW5pdGlhbGl6ZSB2ZGRfJXNcbiIsCi0JCQlfX2Z1bmNfXywgdmRkLT52b2x0ZG0ubmFtZSwgdmRkLT52b2x0ZG0ubmFtZSk7Ci0JCWdvdG8gb3ZkY19vdXQ7Ci0JfQotCi0JaWYgKElTX0VSUl9WQUxVRShfY29uZmlnX2NvbW1vbl92ZGRfZGF0YSh2ZGQpKSkKLQkJZ290byBvdmRjX291dDsKLQotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQl2ZGQtPnJlYWRfcmVnID0gb21hcDNfdm9sdGFnZV9yZWFkX3JlZzsKLQkJdmRkLT53cml0ZV9yZWcgPSBvbWFwM192b2x0YWdlX3dyaXRlX3JlZzsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCXZkZC0+cmVhZF9yZWcgPSBvbWFwNF92b2x0YWdlX3JlYWRfcmVnOwotCQl2ZGQtPndyaXRlX3JlZyA9IG9tYXA0X3ZvbHRhZ2Vfd3JpdGVfcmVnOwotCQlyZXQgPSAwOwotCX0KLQotb3ZkY19vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KK3N0YXRpYyBMSVNUX0hFQUQodm9sdGRtX2xpc3QpOwogCiAvKiBQdWJsaWMgZnVuY3Rpb25zICovCiAvKioKLSAqIG9tYXBfdm9sdGFnZV9nZXRfbm9tX3ZvbHQoKSAtIEdldHMgdGhlIGN1cnJlbnQgbm9uLWF1dG8tY29tcGVuc2F0ZWQgdm9sdGFnZQotICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIGZvciB3aGljaCBjdXJyZW50IHZvbHRhZ2UgaW5mbyBpcyBuZWVkZWQKKyAqIHZvbHRkbV9nZXRfdm9sdGFnZSgpIC0gR2V0cyB0aGUgY3VycmVudCBub24tYXV0by1jb21wZW5zYXRlZCB2b2x0YWdlCisgKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSB2b2x0ZG0gZm9yIHdoaWNoIGN1cnJlbnQgdm9sdGFnZSBpbmZvIGlzIG5lZWRlZAogICoKLSAqIEFQSSB0byBnZXQgdGhlIGN1cnJlbnQgbm9uLWF1dG8tY29tcGVuc2F0ZWQgdm9sdGFnZSBmb3IgYSBWREQuCi0gKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBlcnJvciBlbHNlIHJldHVybnMgdGhlIGN1cnJlbnQgdm9sdGFnZSBmb3IgdGhlIFZERC4KKyAqIEFQSSB0byBnZXQgdGhlIGN1cnJlbnQgbm9uLWF1dG8tY29tcGVuc2F0ZWQgdm9sdGFnZSBmb3IgYSB2b2x0YWdlIGRvbWFpbi4KKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIGVycm9yIGVsc2UgcmV0dXJucyB0aGUgY3VycmVudCB2b2x0YWdlLgogICovCi11bnNpZ25lZCBsb25nIG9tYXBfdm9sdGFnZV9nZXRfbm9tX3ZvbHQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3Vuc2lnbmVkIGxvbmcgdm9sdGRtX2dldF92b2x0YWdlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCiB7Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQogCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQotCXJldHVybiB2ZGQtPmN1cnJfdm9sdDsKKwlyZXR1cm4gdm9sdGRtLT5ub21pbmFsX3ZvbHQ7CiB9CiAKIC8qKgotICogb21hcF92cF9nZXRfY3Vycl92b2x0KCkgLSBBUEkgdG8gZ2V0IHRoZSBjdXJyZW50IHZwIHZvbHRhZ2UuCi0gKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQuCi0gKgotICogVGhpcyBBUEkgcmV0dXJucyB0aGUgY3VycmVudCB2b2x0YWdlIGZvciB0aGUgc3BlY2lmaWVkIHZvbHRhZ2UgcHJvY2Vzc29yCi0gKi8KLXVuc2lnbmVkIGxvbmcgb21hcF92cF9nZXRfY3Vycl92b2x0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQl1OCBjdXJyX3ZzZWw7Ci0KLQlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewotCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0JaWYgKCF2ZGQtPnJlYWRfcmVnKSB7Ci0JCXByX2VycigiJXM6IE5vIHJlYWQgQVBJIGZvciByZWFkaW5nIHZkZF8lcyByZWdzXG4iLAotCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWN1cnJfdnNlbCA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZvbHRhZ2UpOwotCi0JaWYgKCF2ZGQtPnBtaWNfaW5mbyB8fCAhdmRkLT5wbWljX2luZm8tPnZzZWxfdG9fdXYpIHsKLQkJcHJfd2FybmluZygiJXM6IFBNSUMgZnVuY3Rpb24gdG8gY29udmVydCB2c2VsIHRvIHZvbHRhZ2UiCi0JCQkiaW4gdVYgbm90IHJlZ2lzdGVyZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gdmRkLT5wbWljX2luZm8tPnZzZWxfdG9fdXYoY3Vycl92c2VsKTsKLX0KLQotLyoqCi0gKiBvbWFwX3ZwX2VuYWJsZSgpIC0gQVBJIHRvIGVuYWJsZSBhIHBhcnRpY3VsYXIgVlAKLSAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCB3aG9zZSBWUCBpcyB0byBiZSBlbmFibGVkLgotICoKLSAqIFRoaXMgQVBJIGVuYWJsZXMgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgcHJvY2Vzc29yLiBOZWVkZWQgYnkgdGhlIHNtYXJ0cmVmbGV4Ci0gKiBjbGFzcyBkcml2ZXJzLgotICovCi12b2lkIG9tYXBfdnBfZW5hYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQl1MzIgdnBjb25maWc7Ci0KLQlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewotCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCWlmICghdmRkLT5yZWFkX3JlZyB8fCAhdmRkLT53cml0ZV9yZWcpIHsKLQkJcHJfZXJyKCIlczogTm8gcmVhZC93cml0ZSBBUEkgZm9yIGFjY2Vzc2luZyB2ZGRfJXMgcmVnc1xuIiwKLQkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgVlAgaXMgYWxyZWFkeSBlbmFibGVkLCBkbyBub3RoaW5nLiBSZXR1cm4gKi8KLQlpZiAodmRkLT52cF9lbmFibGVkKQotCQlyZXR1cm47Ci0KLQl2cF9sYXRjaF92c2VsKHZkZCk7Ci0KLQkvKiBFbmFibGUgVlAgKi8KLQl2cGNvbmZpZyA9IHZkZC0+cmVhZF9yZWcocHJtX21vZF9vZmZzLCB2ZGQtPnZwX2RhdGEtPnZwY29uZmlnKTsKLQl2cGNvbmZpZyB8PSB2ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfdnBlbmFibGU7Ci0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0JdmRkLT52cF9lbmFibGVkID0gdHJ1ZTsKLX0KLQotLyoqCi0gKiBvbWFwX3ZwX2Rpc2FibGUoKSAtIEFQSSB0byBkaXNhYmxlIGEgcGFydGljdWxhciBWUAotICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIHdob3NlIFZQIGlzIHRvIGJlIGRpc2FibGVkLgotICoKLSAqIFRoaXMgQVBJIGRpc2FibGVzIGEgcGFydGljdWxhciB2b2x0YWdlIHByb2Nlc3Nvci4gTmVlZGVkIGJ5IHRoZSBzbWFydHJlZmxleAotICogY2xhc3MgZHJpdmVycy4KLSAqLwotdm9pZCBvbWFwX3ZwX2Rpc2FibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKLXsKLQlzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkOwotCXUzMiB2cGNvbmZpZzsKLQlpbnQgdGltZW91dDsKLQotCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0JaWYgKCF2ZGQtPnJlYWRfcmVnIHx8ICF2ZGQtPndyaXRlX3JlZykgewotCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAotCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBJZiBWUCBpcyBhbHJlYWR5IGRpc2FibGVkLCBkbyBub3RoaW5nLiBSZXR1cm4gKi8KLQlpZiAoIXZkZC0+dnBfZW5hYmxlZCkgewotCQlwcl93YXJuaW5nKCIlczogVHJ5aW5nIHRvIGRpc2FibGUgVlAgZm9yIHZkZF8lcyB3aGVuIgotCQkJIml0IGlzIGFscmVhZHkgZGlzYWJsZWRcbiIsIF9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRGlzYWJsZSBWUCAqLwotCXZwY29uZmlnID0gdmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnBjb25maWcpOwotCXZwY29uZmlnICY9IH52ZGQtPnZwX2RhdGEtPnZwX2NvbW1vbi0+dnBjb25maWdfdnBlbmFibGU7Ci0JdmRkLT53cml0ZV9yZWcodnBjb25maWcsIHBybV9tb2Rfb2ZmcywgdmRkLT52cF9kYXRhLT52cGNvbmZpZyk7Ci0KLQkvKgotCSAqIFdhaXQgZm9yIFZQIGlkbGUgVHlwaWNhbCBsYXRlbmN5IGlzIDwydXMuIE1heGltdW0gbGF0ZW5jeSBpcyB+MTAwdXMKLQkgKi8KLQlvbWFwX3Rlc3RfdGltZW91dCgodmRkLT5yZWFkX3JlZyhwcm1fbW9kX29mZnMsIHZkZC0+dnBfZGF0YS0+dnN0YXR1cykpLAotCQkJCVZQX0lETEVfVElNRU9VVCwgdGltZW91dCk7Ci0KLQlpZiAodGltZW91dCA+PSBWUF9JRExFX1RJTUVPVVQpCi0JCXByX3dhcm5pbmcoIiVzOiB2ZGRfJXMgaWRsZSB0aW1lZG91dFxuIiwKLQkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwotCi0JdmRkLT52cF9lbmFibGVkID0gZmFsc2U7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKgotICogb21hcF92b2x0YWdlX3NjYWxlX3ZkZCgpIC0gQVBJIHRvIHNjYWxlIHZvbHRhZ2Ugb2YgYSBwYXJ0aWN1bGFyCi0gKgkJCQl2b2x0YWdlIGRvbWFpbi4KLSAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCB3aGljaCBpcyB0byBiZSBzY2FsZWQuCi0gKiBAdGFyZ2V0X3ZvbHQ6CVRoZSB0YXJnZXQgdm9sdGFnZSBvZiB0aGUgdm9sdGFnZSBkb21haW4KKyAqIHZvbHRkbV9zY2FsZSgpIC0gQVBJIHRvIHNjYWxlIHZvbHRhZ2Ugb2YgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgZG9tYWluLgorICogQHZvbHRkbTogcG9pbnRlciB0byB0aGUgdm9sdGFnZSBkb21haW4gd2hpY2ggaXMgdG8gYmUgc2NhbGVkLgorICogQHRhcmdldF92b2x0OiBUaGUgdGFyZ2V0IHZvbHRhZ2Ugb2YgdGhlIHZvbHRhZ2UgZG9tYWluCiAgKgogICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUga2VybmVsIHRvIGRvIHRoZSB2b2x0YWdlIHNjYWxpbmcKLSAqIGZvciBhIHBhcnRpY3VsYXIgdm9sdGFnZSBkb21haW4gZHVyaW5nIGR2ZnMgb3IgYW55IG90aGVyIHNpdHVhdGlvbi4KKyAqIGZvciBhIHBhcnRpY3VsYXIgdm9sdGFnZSBkb21haW4gZHVyaW5nIERWRlMuCiAgKi8KLWludCBvbWFwX3ZvbHRhZ2Vfc2NhbGVfdmRkKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCitpbnQgdm9sdGRtX3NjYWxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCSB1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7CisJaW50IHJldDsKIAogCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQotCWlmICghdmRkLT52b2x0X3NjYWxlKSB7CisJaWYgKCF2b2x0ZG0tPnNjYWxlKSB7CiAJCXByX2VycigiJXM6IE5vIHZvbHRhZ2Ugc2NhbGUgQVBJIHJlZ2lzdGVyZWQgZm9yIHZkZF8lc1xuIiwKIAkJCV9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOwogCQlyZXR1cm4gLUVOT0RBVEE7CiAJfQogCi0JcmV0dXJuIHZkZC0+dm9sdF9zY2FsZSh2ZGQsIHRhcmdldF92b2x0KTsKKwlyZXQgPSB2b2x0ZG0tPnNjYWxlKHZvbHRkbSwgdGFyZ2V0X3ZvbHQpOworCWlmICghcmV0KQorCQl2b2x0ZG0tPm5vbWluYWxfdm9sdCA9IHRhcmdldF92b2x0OworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiBvbWFwX3ZvbHRhZ2VfcmVzZXQoKSAtIFJlc2V0cyB0aGUgdm9sdGFnZSBvZiBhIHBhcnRpY3VsYXIgdm9sdGFnZSBkb21haW4KLSAqCQkJdG8gdGhhdCBvZiB0aGUgY3VycmVudCBPUFAuCi0gKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hvc2Ugdm9sdGFnZSBpcyB0byBiZSByZXNldC4KKyAqIHZvbHRkbV9yZXNldCgpIC0gUmVzZXRzIHRoZSB2b2x0YWdlIG9mIGEgcGFydGljdWxhciB2b2x0YWdlIGRvbWFpbgorICoJCSAgICB0byB0aGF0IG9mIHRoZSBjdXJyZW50IE9QUC4KKyAqIEB2b2x0ZG06IHBvaW50ZXIgdG8gdGhlIHZvbHRhZ2UgZG9tYWluIHdob3NlIHZvbHRhZ2UgaXMgdG8gYmUgcmVzZXQuCiAgKgogICogVGhpcyBBUEkgZmluZHMgb3V0IHRoZSBjb3JyZWN0IHZvbHRhZ2UgdGhlIHZvbHRhZ2UgZG9tYWluIGlzIHN1cHBvc2VkCiAgKiB0byBiZSBhdCBhbmQgcmVzZXRzIHRoZSB2b2x0YWdlIHRvIHRoYXQgbGV2ZWwuIFNob3VsZCBiZSB1c2VkIGVzcGVjaWFsbHkKICAqIHdoaWxlIGRpc2FibGluZyBhbnkgdm9sdGFnZSBjb21wZW5zYXRpb24gbW9kdWxlcy4KICAqLwotdm9pZCBvbWFwX3ZvbHRhZ2VfcmVzZXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3ZvaWQgdm9sdGRtX3Jlc2V0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCiB7Ci0JdW5zaWduZWQgbG9uZyB0YXJnZXRfdXZkYzsKKwl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0OwogCiAJaWYgKCF2b2x0ZG0gfHwgSVNfRVJSKHZvbHRkbSkpIHsKIAkJcHJfd2FybmluZygiJXM6IFZERCBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQl0YXJnZXRfdXZkYyA9IG9tYXBfdm9sdGFnZV9nZXRfbm9tX3ZvbHQodm9sdGRtKTsKLQlpZiAoIXRhcmdldF91dmRjKSB7CisJdGFyZ2V0X3ZvbHQgPSB2b2x0ZG1fZ2V0X3ZvbHRhZ2Uodm9sdGRtKTsKKwlpZiAoIXRhcmdldF92b2x0KSB7CiAJCXByX2VycigiJXM6IHVuYWJsZSB0byBmaW5kIGN1cnJlbnQgdm9sdGFnZSBmb3IgdmRkXyVzXG4iLAogCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQlvbWFwX3ZvbHRhZ2Vfc2NhbGVfdmRkKHZvbHRkbSwgdGFyZ2V0X3V2ZGMpOworCXZvbHRkbV9zY2FsZSh2b2x0ZG0sIHRhcmdldF92b2x0KTsKIH0KIAogLyoqCkBAIC04ODQsMTggKzEzNCwxNCBAQAogICoKICAqLwogdm9pZCBvbWFwX3ZvbHRhZ2VfZ2V0X3ZvbHR0YWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlzdHJ1Y3Qgb21hcF92b2x0X2RhdGEgKip2b2x0X2RhdGEpCisJCQkJc3RydWN0IG9tYXBfdm9sdF9kYXRhICoqdm9sdF9kYXRhKQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0KIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewogCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotCXZkZCA9IGNvbnRhaW5lcl9vZih2b2x0ZG0sIHN0cnVjdCBvbWFwX3ZkZF9pbmZvLCB2b2x0ZG0pOwotCi0JKnZvbHRfZGF0YSA9IHZkZC0+dm9sdF9kYXRhOworCSp2b2x0X2RhdGEgPSB2b2x0ZG0tPnZvbHRfZGF0YTsKIH0KIAogLyoqCkBAIC05MTQsOSArMTYwLDggQEAKICAqIGRvbWFpbiBvciBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBlbnRyeS4KICAqLwogc3RydWN0IG9tYXBfdm9sdF9kYXRhICpvbWFwX3ZvbHRhZ2VfZ2V0X3ZvbHRkYXRhKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCXVuc2lnbmVkIGxvbmcgdm9sdCkKKwkJCQkJCSB1bnNpZ25lZCBsb25nIHZvbHQpCiB7Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKIAlpbnQgaTsKIAogCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CkBAIC05MjQsMTcgKzE2OSwxNSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQotCWlmICghdmRkLT52b2x0X2RhdGEpIHsKKwlpZiAoIXZvbHRkbS0+dm9sdF9kYXRhKSB7CiAJCXByX3dhcm5pbmcoIiVzOiB2b2x0YWdlIHRhYmxlIGRvZXMgbm90IGV4aXN0IGZvciB2ZGRfJXNcbiIsCiAJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOwogCX0KIAotCWZvciAoaSA9IDA7IHZkZC0+dm9sdF9kYXRhW2ldLnZvbHRfbm9taW5hbCAhPSAwOyBpKyspIHsKLQkJaWYgKHZkZC0+dm9sdF9kYXRhW2ldLnZvbHRfbm9taW5hbCA9PSB2b2x0KQotCQkJcmV0dXJuICZ2ZGQtPnZvbHRfZGF0YVtpXTsKKwlmb3IgKGkgPSAwOyB2b2x0ZG0tPnZvbHRfZGF0YVtpXS52b2x0X25vbWluYWwgIT0gMDsgaSsrKSB7CisJCWlmICh2b2x0ZG0tPnZvbHRfZGF0YVtpXS52b2x0X25vbWluYWwgPT0gdm9sdCkKKwkJCXJldHVybiAmdm9sdGRtLT52b2x0X2RhdGFbaV07CiAJfQogCiAJcHJfbm90aWNlKCIlczogVW5hYmxlIHRvIG1hdGNoIHRoZSBjdXJyZW50IHZvbHRhZ2Ugd2l0aCB0aGUgdm9sdGFnZSIKQEAgLTk0Nyw1NCArMTkwLDI1IEBACiAgKiBvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYygpIC0gQVBJIHRvIHJlZ2lzdGVyIFBNSUMgc3BlY2lmaWMgZGF0YQogICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIGZvciB3aGljaCB0aGUgUE1JQyBzcGVjaWZpYyBkYXRhIGlzCiAgKgkJdG8gYmUgcmVnaXN0ZXJlZAotICogQHBtaWNfaW5mbzoJdGhlIHN0cnVjdHVyZSBjb250YWluaW5nIHBtaWMgaW5mbworICogQHBtaWM6CXRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwbWljIGluZm8KICAqCiAgKiBUaGlzIEFQSSBpcyB0byBiZSBjYWxsZWQgYnkgdGhlIFNPQy9QTUlDIGZpbGUgdG8gc3BlY2lmeSB0aGUKLSAqIHBtaWMgc3BlY2lmaWMgaW5mbyBhcyBwcmVzZW50IGluIG9tYXBfdm9sdF9wbWljX2luZm8gc3RydWN0dXJlLgorICogcG1pYyBzcGVjaWZpYyBpbmZvIGFzIHByZXNlbnQgaW4gb21hcF92b2x0ZG1fcG1pYyBzdHJ1Y3R1cmUuCiAgKi8KIGludCBvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyhzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyAqcG1pY19pbmZvKQorCQkJICAgICAgIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljICpwbWljKQogewotCXN0cnVjdCBvbWFwX3ZkZF9pbmZvICp2ZGQ7Ci0KIAlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgewogCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KLQl2ZGQtPnBtaWNfaW5mbyA9IHBtaWNfaW5mbzsKKwl2b2x0ZG0tPnBtaWMgPSBwbWljOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogb21hcF92b2x0YWdlX2dldF9kYmdkaXIoKSAtIEFQSSB0byBnZXQgcG9pbnRlciB0byB0aGUgZGVidWdmcyBkaXJlY3RvcnkKLSAqCQkJCWNvcnJlc3BvbmRpbmcgdG8gYSB2b2x0YWdlIGRvbWFpbi4KLSAqCi0gKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hvc2UgZGVidWcgZGlyZWN0b3J5IGlzIHJlcXVpcmVkLgotICoKLSAqIFRoaXMgQVBJIHJldHVybnMgcG9pbnRlciB0byB0aGUgZGVidWdmcyBkaXJlY3RvcnkgY29ycmVzcG9uZGluZwotICogdG8gdGhlIHZvbHRhZ2UgZG9tYWluLiBTaG91bGQgYmUgdXNlZCBieSBkcml2ZXJzIHJlcXVpcmluZyB0bwotICogYWRkIGFueSBkZWJ1ZyBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgZG9tYWluLiBSZXR1cm5zIE5VTEwKLSAqIGluIGNhc2Ugb2YgZXJyb3IuCi0gKi8KLXN0cnVjdCBkZW50cnkgKm9tYXBfdm9sdGFnZV9nZXRfZGJnZGlyKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCi17Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQotCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl2ZGQgPSBjb250YWluZXJfb2Yodm9sdGRtLCBzdHJ1Y3Qgb21hcF92ZGRfaW5mbywgdm9sdGRtKTsKLQotCXJldHVybiB2ZGQtPmRlYnVnX2RpcjsKLX0KLQotLyoqCiAgKiBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKCkgLSBBUEkgdG8gY2hhbmdlIHRoZSB2b2x0YWdlIHNjYWxpbmcgbWV0aG9kLgogICogQHZvbHRkbToJcG9pbnRlciB0byB0aGUgVkREIHdob3NlIHZvbHRhZ2Ugc2NhbGluZyBtZXRob2QKICAqCQloYXMgdG8gYmUgY2hhbmdlZC4KQEAgLTEwMDUsMjMgKzIxOSwxOSBAQAogICogZGVmaW5lZCBpbiB2b2x0YWdlLmgKICAqLwogdm9pZCBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCWludCB2b2x0c2NhbGVfbWV0aG9kKQorCQkJCSAgaW50IHZvbHRzY2FsZV9tZXRob2QpCiB7Ci0Jc3RydWN0IG9tYXBfdmRkX2luZm8gKnZkZDsKLQogCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CiAJCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0JdmRkID0gY29udGFpbmVyX29mKHZvbHRkbSwgc3RydWN0IG9tYXBfdmRkX2luZm8sIHZvbHRkbSk7Ci0KIAlzd2l0Y2ggKHZvbHRzY2FsZV9tZXRob2QpIHsKIAljYXNlIFZPTFRTQ0FMRV9WUEZPUkNFVVBEQVRFOgotCQl2ZGQtPnZvbHRfc2NhbGUgPSB2cF9mb3JjZXVwZGF0ZV9zY2FsZV92b2x0YWdlOworCQl2b2x0ZG0tPnNjYWxlID0gb21hcF92cF9mb3JjZXVwZGF0ZV9zY2FsZTsKIAkJcmV0dXJuOwogCWNhc2UgVk9MVFNDQUxFX1ZDQllQQVNTOgotCQl2ZGQtPnZvbHRfc2NhbGUgPSB2Y19ieXBhc3Nfc2NhbGVfdm9sdGFnZTsKKwkJdm9sdGRtLT5zY2FsZSA9IG9tYXBfdmNfYnlwYXNzX3NjYWxlOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJcHJfd2FybmluZygiJXM6IFRyeWluZyB0byBjaGFuZ2UgdGhlIG1ldGhvZCBvZiB2b2x0YWdlIHNjYWxpbmciCkBAIC0xMDMwLDM4ICsyNDAsNiBAQAogfQogCiAvKioKLSAqIG9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKCkgLSBBUEkgdG8gZ2V0IHRoZSB2b2x0YWdlIGRvbWFpbiBwb2ludGVyCi0gKiBAbmFtZToJTmFtZSBvZiB0aGUgdm9sdGFnZSBkb21haW4KLSAqCi0gKiBUaGlzIEFQSSBsb29rcyB1cCBpbiB0aGUgZ2xvYmFsIHZkZF9pbmZvIHN0cnVjdCBmb3IgdGhlCi0gKiBleGlzdGVuY2Ugb2Ygdm9sdGFnZSBkb21haW4gPG5hbWU+LiBJZiBpdCBleGlzdHMsIHRoZSBBUEkgcmV0dXJucwotICogYSBwb2ludGVyIHRvIHRoZSB2b2x0YWdlIGRvbWFpbiBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIFZERDxuYW1lPi4gRWxzZSByZXR1bnMgZXJyb3IgcG9pbnRlci4KLSAqLwotc3RydWN0IHZvbHRhZ2Vkb21haW4gKm9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIXZkZF9pbmZvKSB7Ci0JCXByX2VycigiJXM6IFZvbHRhZ2UgZHJpdmVyIGluaXQgbm90IHlldCBoYXBwZW5lZC5GYXVsdGluZyFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCWlmICghbmFtZSkgewotCQlwcl9lcnIoIiVzOiBObyBuYW1lIHRvIGdldCB0aGUgdm90YWdlIGRvbWFpbiFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG5yX3NjYWxhYmxlX3ZkZDsgaSsrKSB7Ci0JCWlmICghKHN0cmNtcChuYW1lLCB2ZGRfaW5mb1tpXS0+dm9sdGRtLm5hbWUpKSkKLQkJCXJldHVybiAmdmRkX2luZm9baV0tPnZvbHRkbTsKLQl9Ci0KLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLX0KLQotLyoqCiAgKiBvbWFwX3ZvbHRhZ2VfbGF0ZV9pbml0KCkgLSBJbml0IHRoZSB2YXJpb3VzIHZvbHRhZ2UgcGFyYW1ldGVycwogICoKICAqIFRoaXMgQVBJIGlzIHRvIGJlIGNhbGxlZCBpbiB0aGUgbGF0ZXIgc3RhZ2VzIG9mIHRoZQpAQCAtMTA3MCwzNyArMjQ4LDE4NCBAQAogICovCiBpbnQgX19pbml0IG9tYXBfdm9sdGFnZV9sYXRlX2luaXQodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtOwogCi0JaWYgKCF2ZGRfaW5mbykgeworCWlmIChsaXN0X2VtcHR5KCZ2b2x0ZG1fbGlzdCkpIHsKIAkJcHJfZXJyKCIlczogVm9sdGFnZSBkcml2ZXIgc3VwcG9ydCBub3QgYWRkZWRcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXZvbHRhZ2VfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ2b2x0YWdlIiwgTlVMTCk7Ci0JaWYgKElTX0VSUih2b2x0YWdlX2RpcikpCi0JCXByX2VycigiJXM6IFVuYWJsZSB0byBjcmVhdGUgdm9sdGFnZSBkZWJ1Z2ZzIG1haW4gZGlyXG4iLAotCQkJX19mdW5jX18pOwotCWZvciAoaSA9IDA7IGkgPCBucl9zY2FsYWJsZV92ZGQ7IGkrKykgewotCQlpZiAob21hcF92ZGRfZGF0YV9jb25maWd1cmUodmRkX2luZm9baV0pKQorCWxpc3RfZm9yX2VhY2hfZW50cnkodm9sdGRtLCAmdm9sdGRtX2xpc3QsIG5vZGUpIHsKKwkJc3RydWN0IGNsayAqc3lzX2NrOworCisJCWlmICghdm9sdGRtLT5zY2FsYWJsZSkKIAkJCWNvbnRpbnVlOwotCQlvbWFwX3ZjX2luaXQodmRkX2luZm9baV0pOwotCQl2cF9pbml0KHZkZF9pbmZvW2ldKTsKLQkJdmRkX2RlYnVnZnNfaW5pdCh2ZGRfaW5mb1tpXSk7CisKKwkJc3lzX2NrID0gY2xrX2dldChOVUxMLCB2b2x0ZG0tPnN5c19jbGsubmFtZSk7CisJCWlmIChJU19FUlIoc3lzX2NrKSkgeworCQkJcHJfd2FybmluZygiJXM6IENvdWxkIG5vdCBnZXQgc3lzIGNsay5cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXZvbHRkbS0+c3lzX2Nsay5yYXRlID0gY2xrX2dldF9yYXRlKHN5c19jayk7CisJCVdBUk5fT04oIXZvbHRkbS0+c3lzX2Nsay5yYXRlKTsKKwkJY2xrX3B1dChzeXNfY2spOworCisJCWlmICh2b2x0ZG0tPnZjKSB7CisJCQl2b2x0ZG0tPnNjYWxlID0gb21hcF92Y19ieXBhc3Nfc2NhbGU7CisJCQlvbWFwX3ZjX2luaXRfY2hhbm5lbCh2b2x0ZG0pOworCQl9CisKKwkJaWYgKHZvbHRkbS0+dnApIHsKKwkJCXZvbHRkbS0+c2NhbGUgPSBvbWFwX3ZwX2ZvcmNldXBkYXRlX3NjYWxlOworCQkJb21hcF92cF9pbml0KHZvbHRkbSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotLyogWFhYIGRvY3VtZW50ICovCi1pbnQgX19pbml0IG9tYXBfdm9sdGFnZV9lYXJseV9pbml0KHMxNiBwcm1fbW9kLCBzMTYgcHJtX2lycXN0X29jcF9tb2QsCi0JCQkJICAgc3RydWN0IG9tYXBfdmRkX2luZm8gKm9tYXBfdmRkX2FycmF5W10sCi0JCQkJICAgdTggb21hcF92ZGRfY291bnQpCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gKl92b2x0ZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JcHJtX21vZF9vZmZzID0gcHJtX21vZDsKLQlwcm1faXJxc3Rfb2NwX21vZF9vZmZzID0gcHJtX2lycXN0X29jcF9tb2Q7Ci0JdmRkX2luZm8gPSBvbWFwX3ZkZF9hcnJheTsKLQlucl9zY2FsYWJsZV92ZGQgPSBvbWFwX3ZkZF9jb3VudDsKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLCAqdGVtcF92b2x0ZG07CisKKwl2b2x0ZG0gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wX3ZvbHRkbSwgJnZvbHRkbV9saXN0LCBub2RlKSB7CisJCWlmICghc3RyY21wKG5hbWUsIHRlbXBfdm9sdGRtLT5uYW1lKSkgeworCQkJdm9sdGRtID0gdGVtcF92b2x0ZG07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB2b2x0ZG07Cit9CisKKy8qKgorICogdm9sdGRtX2FkZF9wd3JkbSAtIGFkZCBhIHBvd2VyZG9tYWluIHRvIGEgdm9sdGFnZWRvbWFpbgorICogQHZvbHRkbTogc3RydWN0IHZvbHRhZ2Vkb21haW4gKiB0byBhZGQgdGhlIHBvd2VyZG9tYWluIHRvCisgKiBAcHdyZG06IHN0cnVjdCBwb3dlcmRvbWFpbiAqIHRvIGFzc29jaWF0ZSB3aXRoIGEgdm9sdGFnZWRvbWFpbgorICoKKyAqIEFzc29jaWF0ZSB0aGUgcG93ZXJkb21haW4gQHB3cmRtIHdpdGggYSB2b2x0YWdlZG9tYWluIEB2b2x0ZG0uICBUaGlzCisgKiBlbmFibGVzIHRoZSB1c2Ugb2Ygdm9sdGRtX2Zvcl9lYWNoX3B3cmRtKCkuICBSZXR1cm5zIC1FSU5WQUwgaWYKKyAqIHByZXNlbnRlZCB3aXRoIGludmFsaWQgcG9pbnRlcnM7IC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQ7CisgKiBvciAwIHVwb24gc3VjY2Vzcy4KKyAqLworaW50IHZvbHRkbV9hZGRfcHdyZG0oc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgc3RydWN0IHBvd2VyZG9tYWluICpwd3JkbSkKK3sKKwlpZiAoIXZvbHRkbSB8fCAhcHdyZG0pCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInZvbHRhZ2Vkb21haW46IGFzc29jaWF0aW5nIHBvd2VyZG9tYWluICVzIHdpdGggdm9sdGFnZWRvbWFpbiAiCisJCSAiJXNcbiIsIHB3cmRtLT5uYW1lLCB2b2x0ZG0tPm5hbWUpOworCisJbGlzdF9hZGQoJnB3cmRtLT52b2x0ZG1fbm9kZSwgJnZvbHRkbS0+cHdyZG1fbGlzdCk7CisKIAlyZXR1cm4gMDsKIH0KKworLyoqCisgKiB2b2x0ZG1fZm9yX2VhY2hfcHdyZG0gLSBjYWxsIGZ1bmN0aW9uIGZvciBlYWNoIHB3cmRtIGluIGEgdm9sdGRtCisgKiBAdm9sdGRtOiBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqIHRvIGl0ZXJhdGUgb3ZlcgorICogQGZuOiBjYWxsYmFjayBmdW5jdGlvbiAqCisgKgorICogQ2FsbCB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gQGZuIGZvciBlYWNoIHBvd2VyZG9tYWluIGluIHRoZQorICogdm9sdGFnZWRvbWFpbiBAdm9sdGRtLiAgUmV0dXJucyAtRUlOVkFMIGlmIHByZXNlbnRlZCB3aXRoIGludmFsaWQKKyAqIHBvaW50ZXJzOyBvciBwYXNzZXMgYWxvbmcgdGhlIGxhc3QgcmV0dXJuIHZhbHVlIG9mIHRoZSBjYWxsYmFjaworICogZnVuY3Rpb24sIHdoaWNoIHNob3VsZCBiZSAwIGZvciBzdWNjZXNzIG9yIGFueXRoaW5nIGVsc2UgdG8KKyAqIGluZGljYXRlIGZhaWx1cmUuCisgKi8KK2ludCB2b2x0ZG1fZm9yX2VhY2hfcHdyZG0oc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCSAgaW50ICgqZm4pKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkJICAgIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pKQoreworCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG07CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWZuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocHdyZG0sICZ2b2x0ZG0tPnB3cmRtX2xpc3QsIHZvbHRkbV9ub2RlKQorCQlyZXQgPSAoKmZuKSh2b2x0ZG0sIHB3cmRtKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm9sdGRtX2Zvcl9lYWNoIC0gY2FsbCBmdW5jdGlvbiBvbiBlYWNoIHJlZ2lzdGVyZWQgdm9sdGFnZWRvbWFpbgorICogQGZuOiBjYWxsYmFjayBmdW5jdGlvbiAqCisgKgorICogQ2FsbCB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gQGZuIGZvciBlYWNoIHJlZ2lzdGVyZWQgdm9sdGFnZWRvbWFpbi4KKyAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBAZm4gY2FuIHJldHVybiBhbnl0aGluZyBidXQgMCB0byBiYWlsIG91dAorICogZWFybHkgZnJvbSB0aGUgaXRlcmF0b3IuICBSZXR1cm5zIHRoZSBsYXN0IHJldHVybiB2YWx1ZSBvZiB0aGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBzaG91bGQgYmUgMCBmb3Igc3VjY2VzcyBvciBhbnl0aGluZyBlbHNlCisgKiB0byBpbmRpY2F0ZSBmYWlsdXJlOyBvciAtRUlOVkFMIGlmIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIG51bGwuCisgKi8KK2ludCB2b2x0ZG1fZm9yX2VhY2goaW50ICgqZm4pKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHZvaWQgKnVzZXIpLAorCQkgICAgdm9pZCAqdXNlcikKK3sKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdGVtcF92b2x0ZG07CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWZuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcF92b2x0ZG0sICZ2b2x0ZG1fbGlzdCwgbm9kZSkgeworCQlyZXQgPSAoKmZuKSh0ZW1wX3ZvbHRkbSwgdXNlcik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF92b2x0ZG1fcmVnaXN0ZXIoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSkKK3sKKwlpZiAoIXZvbHRkbSB8fCAhdm9sdGRtLT5uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlOSVRfTElTVF9IRUFEKCZ2b2x0ZG0tPnB3cmRtX2xpc3QpOworCWxpc3RfYWRkKCZ2b2x0ZG0tPm5vZGUsICZ2b2x0ZG1fbGlzdCk7CisKKwlwcl9kZWJ1Zygidm9sdGFnZWRvbWFpbjogcmVnaXN0ZXJlZCAlc1xuIiwgdm9sdGRtLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZvbHRkbV9sb29rdXAgLSBsb29rIHVwIGEgdm9sdGFnZWRvbWFpbiBieSBuYW1lLCByZXR1cm4gYSBwb2ludGVyCisgKiBAbmFtZTogbmFtZSBvZiB2b2x0YWdlZG9tYWluCisgKgorICogRmluZCBhIHJlZ2lzdGVyZWQgdm9sdGFnZWRvbWFpbiBieSBpdHMgbmFtZSBAbmFtZS4gIFJldHVybnMgYSBwb2ludGVyCisgKiB0byB0aGUgc3RydWN0IHZvbHRhZ2Vkb21haW4gaWYgZm91bmQsIG9yIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0gOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCXZvbHRkbSA9IF92b2x0ZG1fbG9va3VwKG5hbWUpOworCisJcmV0dXJuIHZvbHRkbTsKK30KKworLyoqCisgKiB2b2x0ZG1faW5pdCAtIHNldCB1cCB0aGUgdm9sdGFnZWRvbWFpbiBsYXllcgorICogQHZvbHRkbV9saXN0OiBhcnJheSBvZiBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBwb2ludGVycyB0byByZWdpc3RlcgorICoKKyAqIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2Ygdm9sdGFnZWRvbWFpbnMgQHZvbHRkbV9saXN0LCByZWdpc3RlcmluZyBhbGwKKyAqIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBDUFUuIElmIHZvbHRkbV9saXN0IGlzIHN1cHBsaWVkCisgKiBhbmQgbm90IG51bGwsIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCB2b2x0YWdlZG9tYWlucyB3aWxsIGJlCisgKiByZWdpc3RlcmVkLiAgTm8gcmV0dXJuIHZhbHVlLgorICovCit2b2lkIHZvbHRkbV9pbml0KHN0cnVjdCB2b2x0YWdlZG9tYWluICoqdm9sdGRtcykKK3sKKwlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqKnY7CisKKwlpZiAodm9sdGRtcykgeworCQlmb3IgKHYgPSB2b2x0ZG1zOyAqdjsgdisrKQorCQkJX3ZvbHRkbV9yZWdpc3Rlcigqdik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuaAppbmRleCBlOWY1NDA4Li4xNmExYjA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2UuaApAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgInZjLmgiCiAjaW5jbHVkZSAidnAuaCIKIAorc3RydWN0IHBvd2VyZG9tYWluOworCiAvKiBYWFggZG9jdW1lbnQgKi8KICNkZWZpbmUgVk9MVFNDQUxFX1ZQRk9SQ0VVUERBVEUJCTEKICNkZWZpbmUgVk9MVFNDQUxFX1ZDQllQQVNTCQkyCkBAIC0zMiwyOSArMzQsNjAgQEAKICNkZWZpbmUgT01BUDNfVk9MVFNFVFVQMgkweGZmCiAKIC8qKgotICogc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZV9kYXRhIC0gcGVyLXZvbHRhZ2UgbWFuYWdlciBGU00gcmVnaXN0ZXIvYml0ZmllbGQKKyAqIHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2UgLSBwZXItdm9sdGFnZSBtYW5hZ2VyIEZTTSByZWdpc3Rlci9iaXRmaWVsZAogICogZGF0YQogICogQHZvbHRzZXR1cF9tYXNrOiBTRVRVUF9USU1FKiBiaXRtYXNrIGluIHRoZSBQUk1fVk9MVFNFVFVQKiByZWdpc3RlcgogICogQHZvbHRzZXR1cF9yZWc6IHJlZ2lzdGVyIG9mZnNldCBvZiBQUk1fVk9MVFNFVFVQIGZyb20gUFJNIGJhc2UKLSAqIEB2b2x0c2V0dXBfc2hpZnQ6IFNFVFVQX1RJTUUqIGZpZWxkIHNoaWZ0IGluIHRoZSBQUk1fVk9MVFNFVFVQKiByZWdpc3RlcgogICoKICAqIFhYWCBXaGF0IGFib3V0IFZPTFRPRkZTRVQvVk9MVENUUkw/Ci0gKiBYWFggSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBoYXZlIGJvdGggYSBfbWFzayBhbmQgYSBfc2hpZnQgZm9yIHRoZSBzYW1lCi0gKiAgICAgYml0ZmllbGQgLSByZW1vdmUgb25lIQogICovCi1zdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlX2RhdGEgeworc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZSB7CiAJdTMyIHZvbHRzZXR1cF9tYXNrOwogCXU4IHZvbHRzZXR1cF9yZWc7Ci0JdTggdm9sdHNldHVwX3NoaWZ0OwogfTsKIAogLyoqCiAgKiBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAtIG9tYXAgdm9sdGFnZSBkb21haW4gZ2xvYmFsIHN0cnVjdHVyZS4KLSAqIEBuYW1lOglOYW1lIG9mIHRoZSB2b2x0YWdlIGRvbWFpbiB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIHVuaXF1ZQotICoJCWlkZW50aWZpZXIuCisgKiBAbmFtZTogTmFtZSBvZiB0aGUgdm9sdGFnZSBkb21haW4gd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllci4KKyAqIEBzY2FsYWJsZTogV2hldGhlciBvciBub3QgdGhpcyB2b2x0YWdlIGRvbWFpbiBpcyBzY2FsYWJsZQorICogQG5vZGU6IGxpc3RfaGVhZCBsaW5raW5nIGFsbCB2b2x0YWdlIGRvbWFpbnMKKyAqIEBwd3JkbV9saXN0OiBsaXN0X2hlYWQgbGlua2luZyBhbGwgcG93ZXJkb21haW5zIGluIHRoaXMgdm9sdGFnZWRvbWFpbgorICogQHZjOiBwb2ludGVyIHRvIFZDIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdm9sdGFnZWRvbWFpbgorICogQHZwOiBwb2ludGVyIHRvIFZQIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZvbHRhZ2Vkb21haW4KKyAqIEByZWFkOiByZWFkIGEgVkMvVlAgcmVnaXN0ZXIKKyAqIEB3cml0ZTogd3JpdGUgYSBWQy9WUCByZWdpc3RlcgorICogQHJlYWQ6IHJlYWQtbW9kaWZ5LXdyaXRlIGEgVkMvVlAgcmVnaXN0ZXIKKyAqIEBzeXNfY2xrOiBzeXN0ZW0gY2xvY2sgbmFtZS9mcmVxdWVuY3ksIHVzZWQgZm9yIHZhcmlvdXMgdGltaW5nIGNhbGN1bGF0aW9ucworICogQHNjYWxlOiBmdW5jdGlvbiB1c2VkIHRvIHNjYWxlIHRoZSB2b2x0YWdlIG9mIHRoZSB2b2x0YWdlZG9tYWluCisgKiBAbm9taW5hbF92b2x0OiBjdXJyZW50IG5vbWluYWwgdm9sdGFnZSBmb3IgdGhpcyB2b2x0YWdlIGRvbWFpbgorICogQHZvbHRfZGF0YTogdm9sdGFnZSB0YWJsZSBoYXZpbmcgdGhlIGRpc3RpbmN0IHZvbHRhZ2VzIHN1cHBvcnRlZAorICogICAgICAgICAgICAgYnkgdGhlIGRvbWFpbiBhbmQgb3RoZXIgYXNzb2NpYXRlZCBwZXIgdm9sdGFnZSBkYXRhLgogICovCiBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiB7CiAJY2hhciAqbmFtZTsKKwlib29sIHNjYWxhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHB3cmRtX2xpc3Q7CisJc3RydWN0IG9tYXBfdmNfY2hhbm5lbCAqdmM7CisJY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZSAqdmZzbTsKKwlzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSAqdnA7CisJc3RydWN0IG9tYXBfdm9sdGRtX3BtaWMgKnBtaWM7CisKKwkvKiBWQy9WUCByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zOiBTb0Mgc3BlY2lmaWMgKi8KKwl1MzIgKCpyZWFkKSAodTggb2Zmc2V0KTsKKwl2b2lkICgqd3JpdGUpICh1MzIgdmFsLCB1OCBvZmZzZXQpOworCXUzMiAoKnJtdykodTMyIG1hc2ssIHUzMiBiaXRzLCB1OCBvZmZzZXQpOworCisJdW5pb24geworCQljb25zdCBjaGFyICpuYW1lOworCQl1MzIgcmF0ZTsKKwl9IHN5c19jbGs7CisKKwlpbnQgKCpzY2FsZSkgKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOworCisJdTMyIG5vbWluYWxfdm9sdDsKKwlzdHJ1Y3Qgb21hcF92b2x0X2RhdGEgKnZvbHRfZGF0YTsKIH07CiAKIC8qKgpAQCAtNzcsMTMgKzExMCwxOCBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyAtIFBNSUMgc3BlY2lmaWMgZGF0YSByZXF1aXJlZCBieSB2b2x0YWdlIGRyaXZlci4KKyAqIHN0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIC0gUE1JQyBzcGVjaWZpYyBkYXRhIHJlcXVpcmVkIGJ5IHZvbHRhZ2UgZHJpdmVyLgogICogQHNsZXdfcmF0ZToJUE1JQyBzbGV3IHJhdGUgKGluIHV2L3VzKQogICogQHN0ZXBfc2l6ZToJUE1JQyB2b2x0YWdlIHN0ZXAgc2l6ZSAoaW4gdXYpCisgKiBAaTJjX3NsYXZlX2FkZHI6IEkyQyBzbGF2ZSBhZGRyZXNzIG9mIFBNSUMKKyAqIEB2b2x0X3JlZ19hZGRyOiB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYWRkcmVzcworICogQGNtZF9yZWdfYWRkcjogY29tbWFuZCAob24sIG9uLUxQLCByZXQsIG9mZikgY29uZmlndXJhdGlvbiByZWdpc3RlciBhZGRyZXNzCisgKiBAaTJjX2hpZ2hfc3BlZWQ6IHdoZXRoZXIgVkMgdXNlcyBJMkMgaGlnaC1zcGVlZCBtb2RlIHRvIFBNSUMKKyAqIEBpMmNfbWNvZGU6IG1hc3RlciBjb2RlIHZhbHVlIGZvciBJMkMgaGlnaC1zcGVlZCBwcmVhbWJsZSB0cmFuc21pc3Npb24KICAqIEB2c2VsX3RvX3V2OglQTUlDIEFQSSB0byBjb252ZXJ0IHZzZWwgdmFsdWUgdG8gYWN0dWFsIHZvbHRhZ2UgaW4gdVYuCiAgKiBAdXZfdG9fdnNlbDoJUE1JQyBBUEkgdG8gY29udmVydCB2b2x0YWdlIGluIHVWIHRvIHZzZWwgdmFsdWUuCiAgKi8KLXN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvIHsKK3N0cnVjdCBvbWFwX3ZvbHRkbV9wbWljIHsKIAlpbnQgc2xld19yYXRlOwogCWludCBzdGVwX3NpemU7CiAJdTMyIG9uX3ZvbHQ7CkBAIC05MSw5NCArMTI5LDQ0IEBACiAJdTMyIHJldF92b2x0OwogCXUzMiBvZmZfdm9sdDsKIAl1MTYgdm9sdF9zZXR1cF90aW1lOworCXUxNiBpMmNfc2xhdmVfYWRkcjsKKwl1MTYgdm9sdF9yZWdfYWRkcjsKKwl1MTYgY21kX3JlZ19hZGRyOwogCXU4IHZwX2Vycm9yb2Zmc2V0OwogCXU4IHZwX3ZzdGVwbWluOwogCXU4IHZwX3ZzdGVwbWF4OwogCXU4IHZwX3ZkZG1pbjsKIAl1OCB2cF92ZGRtYXg7CiAJdTggdnBfdGltZW91dF91czsKLQl1OCBpMmNfc2xhdmVfYWRkcjsKLQl1OCBwbWljX3JlZzsKKwlib29sIGkyY19oaWdoX3NwZWVkOworCXU4IGkyY19tY29kZTsKIAl1bnNpZ25lZCBsb25nICgqdnNlbF90b191dikgKGNvbnN0IHU4IHZzZWwpOwogCXU4ICgqdXZfdG9fdnNlbCkgKHVuc2lnbmVkIGxvbmcgdVYpOwogfTsKIAotLyoqCi0gKiBvbWFwX3ZkZF9pbmZvIC0gUGVyIFZvbHRhZ2UgRG9tYWluIGluZm8KLSAqCi0gKiBAdm9sdF9kYXRhCQk6IHZvbHRhZ2UgdGFibGUgaGF2aW5nIHRoZSBkaXN0aW5jdCB2b2x0YWdlcyBzdXBwb3J0ZWQKLSAqCQkJICBieSB0aGUgZG9tYWluIGFuZCBvdGhlciBhc3NvY2lhdGVkIHBlciB2b2x0YWdlIGRhdGEuCi0gKiBAcG1pY19pbmZvCQk6IHBtaWMgc3BlY2lmaWMgcGFyYW1ldGVycyB3aGljaCBzaG91bGQgYmUgcG9wdWx0ZWQgYnkKLSAqCQkJICB0aGUgcG1pYyBkcml2ZXJzLgotICogQHZwX2RhdGEJCTogdGhlIHJlZ2lzdGVyIHZhbHVlcywgc2hpZnRzLCBtYXNrcyBmb3IgdmFyaW91cwotICoJCQkgIHZwIHJlZ2lzdGVycwotICogQHZwX3J0X2RhdGEgICAgICAgICAgOiBWUCBkYXRhIGRlcml2ZWQgYXQgcnVudGltZSwgbm90IHByZWRlZmluZWQKLSAqIEB2Y19kYXRhCQk6IHN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlvdXMgdmFyaW91cyB2YyByZWdpc3RlcnMsCi0gKgkJCSAgc2hpZnRzLCBtYXNrcyBldGMuCi0gKiBAdmZzbSAgICAgICAgICAgICAgICA6IHZvbHRhZ2UgbWFuYWdlciBGU00gZGF0YQotICogQHZvbHRkbQkJOiBwb2ludGVyIHRvIHRoZSB2b2x0YWdlIGRvbWFpbiBzdHJ1Y3R1cmUKLSAqIEBkZWJ1Z19kaXIJCTogZGVidWcgZGlyZWN0b3J5IGZvciB0aGlzIHZvbHRhZ2UgZG9tYWluLgotICogQGN1cnJfdm9sdAkJOiBjdXJyZW50IHZvbHRhZ2UgZm9yIHRoaXMgdmRkLgotICogQHZwX2VuYWJsZWQJCTogZmxhZyB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdnAgaXMgZW5hYmxlZCBvciBub3QKLSAqIEB2b2x0X3NjYWxlCQk6IEFQSSB0byBzY2FsZSB0aGUgdm9sdGFnZSBvZiB0aGUgdmRkLgotICovCi1zdHJ1Y3Qgb21hcF92ZGRfaW5mbyB7Ci0Jc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGE7Ci0Jc3RydWN0IG9tYXBfdm9sdF9wbWljX2luZm8gKnBtaWNfaW5mbzsKLQlzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhICp2cF9kYXRhOwotCXN0cnVjdCBvbWFwX3ZwX3J1bnRpbWVfZGF0YSB2cF9ydF9kYXRhOwotCXN0cnVjdCBvbWFwX3ZjX2luc3RhbmNlX2RhdGEgKnZjX2RhdGE7Ci0JY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZV9kYXRhICp2ZnNtOwotCXN0cnVjdCB2b2x0YWdlZG9tYWluIHZvbHRkbTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7Ci0JdTMyIGN1cnJfdm9sdDsKLQlib29sIHZwX2VuYWJsZWQ7Ci0JdTMyICgqcmVhZF9yZWcpICh1MTYgbW9kLCB1OCBvZmZzZXQpOwotCXZvaWQgKCp3cml0ZV9yZWcpICh1MzIgdmFsLCB1MTYgbW9kLCB1OCBvZmZzZXQpOwotCWludCAoKnZvbHRfc2NhbGUpIChzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqdmRkLAotCQl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0KTsKLX07Ci0KLXVuc2lnbmVkIGxvbmcgb21hcF92cF9nZXRfY3Vycl92b2x0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwotdm9pZCBvbWFwX3ZwX2VuYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKLXZvaWQgb21hcF92cF9kaXNhYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwotaW50IG9tYXBfdm9sdGFnZV9zY2FsZV92ZGQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKLQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7Ci12b2lkIG9tYXBfdm9sdGFnZV9yZXNldChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKIHZvaWQgb21hcF92b2x0YWdlX2dldF92b2x0dGFibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKIAkJc3RydWN0IG9tYXBfdm9sdF9kYXRhICoqdm9sdF9kYXRhKTsKIHN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAqb21hcF92b2x0YWdlX2dldF92b2x0ZGF0YShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAogCQl1bnNpZ25lZCBsb25nIHZvbHQpOwotdW5zaWduZWQgbG9uZyBvbWFwX3ZvbHRhZ2VfZ2V0X25vbV92b2x0KHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwotc3RydWN0IGRlbnRyeSAqb21hcF92b2x0YWdlX2dldF9kYmdkaXIoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7Ci1pbnQgX19pbml0IG9tYXBfdm9sdGFnZV9lYXJseV9pbml0KHMxNiBwcm1fbW9kLCBzMTYgcHJtX2lycXN0X21vZCwKLQkJCQkgICBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqb21hcF92ZGRfYXJyYXlbXSwKLQkJCQkgICB1OCBvbWFwX3ZkZF9jb3VudCk7Ci0jaWZkZWYgQ09ORklHX1BNCiBpbnQgb21hcF92b2x0YWdlX3JlZ2lzdGVyX3BtaWMoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKLQkJc3RydWN0IG9tYXBfdm9sdF9wbWljX2luZm8gKnBtaWNfaW5mbyk7CisJCQkgICAgICAgc3RydWN0IG9tYXBfdm9sdGRtX3BtaWMgKnBtaWMpOwogdm9pZCBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCiAJCWludCB2b2x0c2NhbGVfbWV0aG9kKTsKLS8qIEFQSSB0byBnZXQgdGhlIHZvbHRhZ2Vkb21haW4gcG9pbnRlciAqLwotc3RydWN0IHZvbHRhZ2Vkb21haW4gKm9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUpOwotCiBpbnQgb21hcF92b2x0YWdlX2xhdGVfaW5pdCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyhzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyAqcG1pY19pbmZvKQotewotCXJldHVybiAtRUlOVkFMOwotfQotc3RhdGljIGlubGluZSAgdm9pZCBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCi0JCWludCB2b2x0c2NhbGVfbWV0aG9kKSB7fQotc3RhdGljIGlubGluZSBpbnQgb21hcF92b2x0YWdlX2xhdGVfaW5pdCh2b2lkKQotewotCXJldHVybiAtRUlOVkFMOwotfQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLX0KLSNlbmRpZgogCitleHRlcm4gdm9pZCBvbWFwMnh4eF92b2x0YWdlZG9tYWluc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcDN4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9tYXA0NHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQodm9pZCk7CisKK3N0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB2b2x0ZG1faW5pdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqKnZvbHRkbV9saXN0KTsKK2ludCB2b2x0ZG1fYWRkX3B3cmRtKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pOworaW50IHZvbHRkbV9mb3JfZWFjaChpbnQgKCpmbikoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgdm9pZCAqdXNlciksCisJCSAgICB2b2lkICp1c2VyKTsKK2ludCB2b2x0ZG1fZm9yX2VhY2hfcHdyZG0oc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCSAgaW50ICgqZm4pKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkJICAgIHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0pKTsKK2ludCB2b2x0ZG1fc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7Cit2b2lkIHZvbHRkbV9yZXNldChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKK3Vuc2lnbmVkIGxvbmcgdm9sdGRtX2dldF92b2x0YWdlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zMnh4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zMnh4eF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MTM0OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnMyeHh4X2RhdGEuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogT01BUDMgdm9sdGFnZSBkb21haW4gZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJ2b2x0YWdlLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwMl92b2x0ZG1fY29yZSA9IHsKKwkubmFtZSA9ICJjb3JlIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwMl92b2x0ZG1fd2t1cCA9IHsKKwkubmFtZSA9ICJ3YWtldXAiLAorfTsKKworc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0YWdlZG9tYWluc19vbWFwMltdIF9faW5pdGRhdGEgPSB7CisJJm9tYXAyX3ZvbHRkbV9jb3JlLAorCSZvbWFwMl92b2x0ZG1fd2t1cCwKKwlOVUxMLAorfTsKKwordm9pZCBfX2luaXQgb21hcDJ4eHhfdm9sdGFnZWRvbWFpbnNfaW5pdCh2b2lkKQoreworCXZvbHRkbV9pbml0KHZvbHRhZ2Vkb21haW5zX29tYXAyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnMzeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnMzeHh4X2RhdGEuYwppbmRleCBkZWYyMzBmLi4wNzExMDFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczN4eHhfZGF0YS5jCkBAIC0zMSw2NSArMzEsNzAgQEAKICAqIFZERCBkYXRhCiAgKi8KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSBvbWFwM192ZGQxX3Zmc21fZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIG9tYXAzX3ZkZDFfdmZzbSA9IHsKIAkudm9sdHNldHVwX3JlZyA9IE9NQVAzX1BSTV9WT0xUU0VUVVAxX09GRlNFVCwKLQkudm9sdHNldHVwX3NoaWZ0ID0gT01BUDM0MzBfU0VUVVBfVElNRTFfU0hJRlQsCiAJLnZvbHRzZXR1cF9tYXNrID0gT01BUDM0MzBfU0VUVVBfVElNRTFfTUFTSywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyBvbWFwM192ZGQxX2luZm8gPSB7Ci0JLnZwX2RhdGEgPSAmb21hcDNfdnAxX2RhdGEsCi0JLnZjX2RhdGEgPSAmb21hcDNfdmMxX2RhdGEsCi0JLnZmc20gPSAmb21hcDNfdmRkMV92ZnNtX2RhdGEsCi0JLnZvbHRkbSA9IHsKLQkJLm5hbWUgPSAibXB1IiwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSBvbWFwM192ZGQyX3Zmc21fZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIG9tYXAzX3ZkZDJfdmZzbSA9IHsKIAkudm9sdHNldHVwX3JlZyA9IE9NQVAzX1BSTV9WT0xUU0VUVVAxX09GRlNFVCwKLQkudm9sdHNldHVwX3NoaWZ0ID0gT01BUDM0MzBfU0VUVVBfVElNRTJfU0hJRlQsCiAJLnZvbHRzZXR1cF9tYXNrID0gT01BUDM0MzBfU0VUVVBfVElNRTJfTUFTSywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyBvbWFwM192ZGQyX2luZm8gPSB7Ci0JLnZwX2RhdGEgPSAmb21hcDNfdnAyX2RhdGEsCi0JLnZjX2RhdGEgPSAmb21hcDNfdmMyX2RhdGEsCi0JLnZmc20gPSAmb21hcDNfdmRkMl92ZnNtX2RhdGEsCi0JLnZvbHRkbSA9IHsKLQkJLm5hbWUgPSAiY29yZSIsCi0JfSwKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwM192b2x0ZG1fbXB1ID0geworCS5uYW1lID0gIm1wdV9pdmEiLAorCS5zY2FsYWJsZSA9IHRydWUsCisJLnJlYWQgPSBvbWFwM19wcm1fdmN2cF9yZWFkLAorCS53cml0ZSA9IG9tYXAzX3BybV92Y3ZwX3dyaXRlLAorCS5ybXcgPSBvbWFwM19wcm1fdmN2cF9ybXcsCisJLnZjID0gJm9tYXAzX3ZjX21wdSwKKwkudmZzbSA9ICZvbWFwM192ZGQxX3Zmc20sCisJLnZwID0gJm9tYXAzX3ZwX21wdSwKIH07CiAKLS8qIE9NQVAzIFZERCBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gKm9tYXAzX3ZkZF9pbmZvW10gPSB7Ci0JJm9tYXAzX3ZkZDFfaW5mbywKLQkmb21hcDNfdmRkMl9pbmZvLAorc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluIG9tYXAzX3ZvbHRkbV9jb3JlID0geworCS5uYW1lID0gImNvcmUiLAorCS5zY2FsYWJsZSA9IHRydWUsCisJLnJlYWQgPSBvbWFwM19wcm1fdmN2cF9yZWFkLAorCS53cml0ZSA9IG9tYXAzX3BybV92Y3ZwX3dyaXRlLAorCS5ybXcgPSBvbWFwM19wcm1fdmN2cF9ybXcsCisJLnZjID0gJm9tYXAzX3ZjX2NvcmUsCisJLnZmc20gPSAmb21hcDNfdmRkMl92ZnNtLAorCS52cCA9ICZvbWFwM192cF9jb3JlLAogfTsKIAotLyogT01BUDMgc3BlY2lmaWMgdm9sdGFnZSBpbml0IGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBfX2luaXQgb21hcDN4eHhfdm9sdGFnZV9lYXJseV9pbml0KHZvaWQpCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDNfdm9sdGRtX3drdXAgPSB7CisJLm5hbWUgPSAid2FrZXVwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGFnZWRvbWFpbnNfb21hcDNbXSBfX2luaXRkYXRhID0geworCSZvbWFwM192b2x0ZG1fbXB1LAorCSZvbWFwM192b2x0ZG1fY29yZSwKKwkmb21hcDNfdm9sdGRtX3drdXAsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeXNfY2xrX25hbWUgX19pbml0ZGF0YSA9ICJzeXNfY2siOworCit2b2lkIF9faW5pdCBvbWFwM3h4eF92b2x0YWdlZG9tYWluc19pbml0KHZvaWQpCiB7Ci0JczE2IHBybV9tb2QgPSBPTUFQMzQzMF9HUl9NT0Q7Ci0JczE2IHBybV9pcnFzdF9vY3BfbW9kID0gT0NQX01PRDsKLQotCWlmICghY3B1X2lzX29tYXAzNHh4KCkpCi0JCXJldHVybiAwOworCXN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG07CisJaW50IGk7CiAKIAkvKgogCSAqIFhYWCBXaWxsIGRlcGVuZCBvbiB0aGUgcHJvY2VzcywgdmFsaWRhdGlvbiwgYW5kIGJpbm5pbmcKIAkgKiBmb3IgdGhlIGN1cnJlbnRseS1ydW5uaW5nIElDCiAJICovCiAJaWYgKGNwdV9pc19vbWFwMzYzMCgpKSB7Ci0JCW9tYXAzX3ZkZDFfaW5mby52b2x0X2RhdGEgPSBvbWFwMzZ4eF92ZGRtcHVfdm9sdF9kYXRhOwotCQlvbWFwM192ZGQyX2luZm8udm9sdF9kYXRhID0gb21hcDM2eHhfdmRkY29yZV92b2x0X2RhdGE7CisJCW9tYXAzX3ZvbHRkbV9tcHUudm9sdF9kYXRhID0gb21hcDM2eHhfdmRkbXB1X3ZvbHRfZGF0YTsKKwkJb21hcDNfdm9sdGRtX2NvcmUudm9sdF9kYXRhID0gb21hcDM2eHhfdmRkY29yZV92b2x0X2RhdGE7CiAJfSBlbHNlIHsKLQkJb21hcDNfdmRkMV9pbmZvLnZvbHRfZGF0YSA9IG9tYXAzNHh4X3ZkZG1wdV92b2x0X2RhdGE7Ci0JCW9tYXAzX3ZkZDJfaW5mby52b2x0X2RhdGEgPSBvbWFwMzR4eF92ZGRjb3JlX3ZvbHRfZGF0YTsKKwkJb21hcDNfdm9sdGRtX21wdS52b2x0X2RhdGEgPSBvbWFwMzR4eF92ZGRtcHVfdm9sdF9kYXRhOworCQlvbWFwM192b2x0ZG1fY29yZS52b2x0X2RhdGEgPSBvbWFwMzR4eF92ZGRjb3JlX3ZvbHRfZGF0YTsKIAl9CiAKLQlyZXR1cm4gb21hcF92b2x0YWdlX2Vhcmx5X2luaXQocHJtX21vZCwgcHJtX2lycXN0X29jcF9tb2QsCi0JCQkJICAgICAgIG9tYXAzX3ZkZF9pbmZvLAotCQkJCSAgICAgICBBUlJBWV9TSVpFKG9tYXAzX3ZkZF9pbmZvKSk7CisJZm9yIChpID0gMDsgdm9sdGRtID0gdm9sdGFnZWRvbWFpbnNfb21hcDNbaV0sIHZvbHRkbTsgaSsrKQorCQl2b2x0ZG0tPnN5c19jbGsubmFtZSA9IHN5c19jbGtfbmFtZTsKKworCXZvbHRkbV9pbml0KHZvbHRhZ2Vkb21haW5zX29tYXAzKTsKIH07Ci1jb3JlX2luaXRjYWxsKG9tYXAzeHh4X3ZvbHRhZ2VfZWFybHlfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZvbHRhZ2Vkb21haW5zNDR4eF9kYXRhLmMKaW5kZXggY2I2NDk5Ni4uYzQ1ODRlOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92b2x0YWdlZG9tYWluczQ0eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdm9sdGFnZWRvbWFpbnM0NHh4X2RhdGEuYwpAQCAtMzIsNzEgKzMyLDgwIEBACiAjaW5jbHVkZSAidmMuaCIKICNpbmNsdWRlICJ2cC5oIgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmZzbV9pbnN0YW5jZV9kYXRhIG9tYXA0X3ZkZF9tcHVfdmZzbV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2Ugb21hcDRfdmRkX21wdV92ZnNtID0gewogCS52b2x0c2V0dXBfcmVnID0gT01BUDRfUFJNX1ZPTFRTRVRVUF9NUFVfUkVUX1NMRUVQX09GRlNFVCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyBvbWFwNF92ZGRfbXB1X2luZm8gPSB7Ci0JLnZwX2RhdGEgPSAmb21hcDRfdnBfbXB1X2RhdGEsCi0JLnZjX2RhdGEgPSAmb21hcDRfdmNfbXB1X2RhdGEsCi0JLnZmc20gPSAmb21hcDRfdmRkX21wdV92ZnNtX2RhdGEsCi0JLnZvbHRkbSA9IHsKLQkJLm5hbWUgPSAibXB1IiwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2VfZGF0YSBvbWFwNF92ZGRfaXZhX3Zmc21fZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlIG9tYXA0X3ZkZF9pdmFfdmZzbSA9IHsKIAkudm9sdHNldHVwX3JlZyA9IE9NQVA0X1BSTV9WT0xUU0VUVVBfSVZBX1JFVF9TTEVFUF9PRkZTRVQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfdmRkX2luZm8gb21hcDRfdmRkX2l2YV9pbmZvID0gewotCS52cF9kYXRhID0gJm9tYXA0X3ZwX2l2YV9kYXRhLAotCS52Y19kYXRhID0gJm9tYXA0X3ZjX2l2YV9kYXRhLAotCS52ZnNtID0gJm9tYXA0X3ZkZF9pdmFfdmZzbV9kYXRhLAotCS52b2x0ZG0gPSB7Ci0JCS5uYW1lID0gIml2YSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92ZnNtX2luc3RhbmNlX2RhdGEgb21hcDRfdmRkX2NvcmVfdmZzbV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3Zmc21faW5zdGFuY2Ugb21hcDRfdmRkX2NvcmVfdmZzbSA9IHsKIAkudm9sdHNldHVwX3JlZyA9IE9NQVA0X1BSTV9WT0xUU0VUVVBfQ09SRV9SRVRfU0xFRVBfT0ZGU0VULAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX3ZkZF9pbmZvIG9tYXA0X3ZkZF9jb3JlX2luZm8gPSB7Ci0JLnZwX2RhdGEgPSAmb21hcDRfdnBfY29yZV9kYXRhLAotCS52Y19kYXRhID0gJm9tYXA0X3ZjX2NvcmVfZGF0YSwKLQkudmZzbSA9ICZvbWFwNF92ZGRfY29yZV92ZnNtX2RhdGEsCi0JLnZvbHRkbSA9IHsKLQkJLm5hbWUgPSAiY29yZSIsCi0JfSwKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwNF92b2x0ZG1fbXB1ID0geworCS5uYW1lID0gIm1wdSIsCisJLnNjYWxhYmxlID0gdHJ1ZSwKKwkucmVhZCA9IG9tYXA0X3BybV92Y3ZwX3JlYWQsCisJLndyaXRlID0gb21hcDRfcHJtX3ZjdnBfd3JpdGUsCisJLnJtdyA9IG9tYXA0X3BybV92Y3ZwX3JtdywKKwkudmMgPSAmb21hcDRfdmNfbXB1LAorCS52ZnNtID0gJm9tYXA0X3ZkZF9tcHVfdmZzbSwKKwkudnAgPSAmb21hcDRfdnBfbXB1LAogfTsKIAotLyogT01BUDQgVkREIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF92ZGRfaW5mbyAqb21hcDRfdmRkX2luZm9bXSA9IHsKLQkmb21hcDRfdmRkX21wdV9pbmZvLAotCSZvbWFwNF92ZGRfaXZhX2luZm8sCi0JJm9tYXA0X3ZkZF9jb3JlX2luZm8sCitzdGF0aWMgc3RydWN0IHZvbHRhZ2Vkb21haW4gb21hcDRfdm9sdGRtX2l2YSA9IHsKKwkubmFtZSA9ICJpdmEiLAorCS5zY2FsYWJsZSA9IHRydWUsCisJLnJlYWQgPSBvbWFwNF9wcm1fdmN2cF9yZWFkLAorCS53cml0ZSA9IG9tYXA0X3BybV92Y3ZwX3dyaXRlLAorCS5ybXcgPSBvbWFwNF9wcm1fdmN2cF9ybXcsCisJLnZjID0gJm9tYXA0X3ZjX2l2YSwKKwkudmZzbSA9ICZvbWFwNF92ZGRfaXZhX3Zmc20sCisJLnZwID0gJm9tYXA0X3ZwX2l2YSwKIH07CiAKLS8qIE9NQVA0IHNwZWNpZmljIHZvbHRhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgX19pbml0IG9tYXA0NHh4X3ZvbHRhZ2VfZWFybHlfaW5pdCh2b2lkKQorc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluIG9tYXA0X3ZvbHRkbV9jb3JlID0geworCS5uYW1lID0gImNvcmUiLAorCS5zY2FsYWJsZSA9IHRydWUsCisJLnJlYWQgPSBvbWFwNF9wcm1fdmN2cF9yZWFkLAorCS53cml0ZSA9IG9tYXA0X3BybV92Y3ZwX3dyaXRlLAorCS5ybXcgPSBvbWFwNF9wcm1fdmN2cF9ybXcsCisJLnZjID0gJm9tYXA0X3ZjX2NvcmUsCisJLnZmc20gPSAmb21hcDRfdmRkX2NvcmVfdmZzbSwKKwkudnAgPSAmb21hcDRfdnBfY29yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiBvbWFwNF92b2x0ZG1fd2t1cCA9IHsKKwkubmFtZSA9ICJ3YWtldXAiLAorfTsKKworc3RhdGljIHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0YWdlZG9tYWluc19vbWFwNFtdIF9faW5pdGRhdGEgPSB7CisJJm9tYXA0X3ZvbHRkbV9tcHUsCisJJm9tYXA0X3ZvbHRkbV9pdmEsCisJJm9tYXA0X3ZvbHRkbV9jb3JlLAorCSZvbWFwNF92b2x0ZG1fd2t1cCwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnN5c19jbGtfbmFtZSBfX2luaXRkYXRhID0gInN5c19jbGtpbl9jayI7CisKK3ZvaWQgX19pbml0IG9tYXA0NHh4X3ZvbHRhZ2Vkb21haW5zX2luaXQodm9pZCkKIHsKLQlzMTYgcHJtX21vZCA9IE9NQVA0NDMwX1BSTV9ERVZJQ0VfSU5TVDsKLQlzMTYgcHJtX2lycXN0X29jcF9tb2QgPSBPTUFQNDQzMF9QUk1fT0NQX1NPQ0tFVF9JTlNUOwotCi0JaWYgKCFjcHVfaXNfb21hcDQ0eHgoKSkKLQkJcmV0dXJuIDA7CisJc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbTsKKwlpbnQgaTsKIAogCS8qCiAJICogWFhYIFdpbGwgZGVwZW5kIG9uIHRoZSBwcm9jZXNzLCB2YWxpZGF0aW9uLCBhbmQgYmlubmluZwogCSAqIGZvciB0aGUgY3VycmVudGx5LXJ1bm5pbmcgSUMKIAkgKi8KLQlvbWFwNF92ZGRfbXB1X2luZm8udm9sdF9kYXRhID0gb21hcDQ0eHhfdmRkX21wdV92b2x0X2RhdGE7Ci0Jb21hcDRfdmRkX2l2YV9pbmZvLnZvbHRfZGF0YSA9IG9tYXA0NHh4X3ZkZF9pdmFfdm9sdF9kYXRhOwotCW9tYXA0X3ZkZF9jb3JlX2luZm8udm9sdF9kYXRhID0gb21hcDQ0eHhfdmRkX2NvcmVfdm9sdF9kYXRhOworCW9tYXA0X3ZvbHRkbV9tcHUudm9sdF9kYXRhID0gb21hcDQ0eHhfdmRkX21wdV92b2x0X2RhdGE7CisJb21hcDRfdm9sdGRtX2l2YS52b2x0X2RhdGEgPSBvbWFwNDR4eF92ZGRfaXZhX3ZvbHRfZGF0YTsKKwlvbWFwNF92b2x0ZG1fY29yZS52b2x0X2RhdGEgPSBvbWFwNDR4eF92ZGRfY29yZV92b2x0X2RhdGE7CiAKLQlyZXR1cm4gb21hcF92b2x0YWdlX2Vhcmx5X2luaXQocHJtX21vZCwgcHJtX2lycXN0X29jcF9tb2QsCi0JCQkJICAgICAgIG9tYXA0X3ZkZF9pbmZvLAotCQkJCSAgICAgICBBUlJBWV9TSVpFKG9tYXA0X3ZkZF9pbmZvKSk7CisJZm9yIChpID0gMDsgdm9sdGRtID0gdm9sdGFnZWRvbWFpbnNfb21hcDRbaV0sIHZvbHRkbTsgaSsrKQorCQl2b2x0ZG0tPnN5c19jbGsubmFtZSA9IHN5c19jbGtfbmFtZTsKKworCXZvbHRkbV9pbml0KHZvbHRhZ2Vkb21haW5zX29tYXA0KTsKIH07Ci1jb3JlX2luaXRjYWxsKG9tYXA0NHh4X3ZvbHRhZ2VfZWFybHlfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiZDcwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdnAuYwpAQCAtMCwwICsxLDI3OCBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CisKKyNpbmNsdWRlICJ2b2x0YWdlLmgiCisjaW5jbHVkZSAidnAuaCIKKyNpbmNsdWRlICJwcm0tcmVnYml0cy0zNHh4LmgiCisjaW5jbHVkZSAicHJtLXJlZ2JpdHMtNDR4eC5oIgorI2luY2x1ZGUgInBybTQ0eHguaCIKKworc3RhdGljIHUzMiBfdnBfc2V0X2luaXRfdm9sdGFnZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLCB1MzIgdm9sdCkKK3sKKwlzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSAqdnAgPSB2b2x0ZG0tPnZwOworCXUzMiB2cGNvbmZpZzsKKwljaGFyIHZzZWw7CisKKwl2c2VsID0gdm9sdGRtLT5wbWljLT51dl90b192c2VsKHZvbHQpOworCisJdnBjb25maWcgPSB2b2x0ZG0tPnJlYWQodnAtPnZwY29uZmlnKTsKKwl2cGNvbmZpZyAmPSB+KHZwLT5jb21tb24tPnZwY29uZmlnX2luaXR2b2x0YWdlX21hc2sgfAorCQkgICAgICB2cC0+Y29tbW9uLT52cGNvbmZpZ19mb3JjZXVwZGF0ZSB8CisJCSAgICAgIHZwLT5jb21tb24tPnZwY29uZmlnX2luaXR2ZGQpOworCXZwY29uZmlnIHw9IHZzZWwgPDwgX19mZnModnAtPmNvbW1vbi0+dnBjb25maWdfaW5pdHZvbHRhZ2VfbWFzayk7CisJdm9sdGRtLT53cml0ZSh2cGNvbmZpZywgdnAtPnZwY29uZmlnKTsKKworCS8qIFRyaWdnZXIgaW5pdFZERCB2YWx1ZSBjb3B5IHRvIHZvbHRhZ2UgcHJvY2Vzc29yICovCisJdm9sdGRtLT53cml0ZSgodnBjb25maWcgfCB2cC0+Y29tbW9uLT52cGNvbmZpZ19pbml0dmRkKSwKKwkJICAgICAgIHZwLT52cGNvbmZpZyk7CisKKwkvKiBDbGVhciBpbml0VkREIGNvcHkgdHJpZ2dlciBiaXQgKi8KKwl2b2x0ZG0tPndyaXRlKHZwY29uZmlnLCB2cC0+dnBjb25maWcpOworCisJcmV0dXJuIHZwY29uZmlnOworfQorCisvKiBHZW5lcmljIHZvbHRhZ2UgaW5pdCBmdW5jdGlvbnMgKi8KK3ZvaWQgX19pbml0IG9tYXBfdnBfaW5pdChzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlICp2cCA9IHZvbHRkbS0+dnA7CisJdTMyIHZhbCwgc3lzX2Nsa19yYXRlLCB0aW1lb3V0LCB3YWl0dGltZTsKKwl1MzIgdmRkbWluLCB2ZGRtYXgsIHZzdGVwbWluLCB2c3RlcG1heDsKKworCWlmICghdm9sdGRtLT5yZWFkIHx8ICF2b2x0ZG0tPndyaXRlKSB7CisJCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXZwLT5lbmFibGVkID0gZmFsc2U7CisKKwkvKiBEaXZpZGUgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKwlzeXNfY2xrX3JhdGUgPSB2b2x0ZG0tPnN5c19jbGsucmF0ZSAvIDEwMDA7CisKKwl0aW1lb3V0ID0gKHN5c19jbGtfcmF0ZSAqIHZvbHRkbS0+cG1pYy0+dnBfdGltZW91dF91cykgLyAxMDAwOworCXZkZG1pbiA9IHZvbHRkbS0+cG1pYy0+dnBfdmRkbWluOworCXZkZG1heCA9IHZvbHRkbS0+cG1pYy0+dnBfdmRkbWF4OworCisJd2FpdHRpbWUgPSAoKHZvbHRkbS0+cG1pYy0+c3RlcF9zaXplIC8gdm9sdGRtLT5wbWljLT5zbGV3X3JhdGUpICoKKwkJICAgIHN5c19jbGtfcmF0ZSkgLyAxMDAwOworCXZzdGVwbWluID0gdm9sdGRtLT5wbWljLT52cF92c3RlcG1pbjsKKwl2c3RlcG1heCA9IHZvbHRkbS0+cG1pYy0+dnBfdnN0ZXBtYXg7CisKKwkvKgorCSAqIFZQX0NPTkZJRzogZXJyb3IgZ2FpbiBpcyBub3Qgc2V0IGhlcmUsIGl0IHdpbGwgYmUgdXBkYXRlZAorCSAqIG9uIGVhY2ggc2NhbGUsIGJhc2VkIG9uIE9QUC4KKwkgKi8KKwl2YWwgPSAodm9sdGRtLT5wbWljLT52cF9lcnJvcm9mZnNldCA8PAorCSAgICAgICBfX2Zmcyh2b2x0ZG0tPnZwLT5jb21tb24tPnZwY29uZmlnX2Vycm9yb2Zmc2V0X21hc2spKSB8CisJCXZwLT5jb21tb24tPnZwY29uZmlnX3RpbWVvdXRlbjsKKwl2b2x0ZG0tPndyaXRlKHZhbCwgdnAtPnZwY29uZmlnKTsKKworCS8qIFZTVEVQTUlOICovCisJdmFsID0gKHdhaXR0aW1lIDw8IHZwLT5jb21tb24tPnZzdGVwbWluX3NtcHN3YWl0dGltZW1pbl9zaGlmdCkgfAorCQkodnN0ZXBtaW4gPDwgIHZwLT5jb21tb24tPnZzdGVwbWluX3N0ZXBtaW5fc2hpZnQpOworCXZvbHRkbS0+d3JpdGUodmFsLCB2cC0+dnN0ZXBtaW4pOworCisJLyogVlNURVBNQVggKi8KKwl2YWwgPSAodnN0ZXBtYXggPDwgdnAtPmNvbW1vbi0+dnN0ZXBtYXhfc3RlcG1heF9zaGlmdCkgfAorCQkod2FpdHRpbWUgPDwgdnAtPmNvbW1vbi0+dnN0ZXBtYXhfc21wc3dhaXR0aW1lbWF4X3NoaWZ0KTsKKwl2b2x0ZG0tPndyaXRlKHZhbCwgdnAtPnZzdGVwbWF4KTsKKworCS8qIFZMSU1JVFRPICovCisJdmFsID0gKHZkZG1heCA8PCB2cC0+Y29tbW9uLT52bGltaXR0b192ZGRtYXhfc2hpZnQpIHwKKwkJKHZkZG1pbiA8PCB2cC0+Y29tbW9uLT52bGltaXR0b192ZGRtaW5fc2hpZnQpIHwKKwkJKHRpbWVvdXQgPDwgIHZwLT5jb21tb24tPnZsaW1pdHRvX3RpbWVvdXRfc2hpZnQpOworCXZvbHRkbS0+d3JpdGUodmFsLCB2cC0+dmxpbWl0dG8pOworfQorCitpbnQgb21hcF92cF91cGRhdGVfZXJyb3JnYWluKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCit7CisJc3RydWN0IG9tYXBfdm9sdF9kYXRhICp2b2x0X2RhdGE7CisKKwlpZiAoIXZvbHRkbS0+dnApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogR2V0IHZvbHRfZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRhcmdldF92b2x0ICovCisJdm9sdF9kYXRhID0gb21hcF92b2x0YWdlX2dldF92b2x0ZGF0YSh2b2x0ZG0sIHRhcmdldF92b2x0KTsKKwlpZiAoSVNfRVJSKHZvbHRfZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU2V0dGluZyB2cCBlcnJvcmdhaW4gYmFzZWQgb24gdGhlIHZvbHRhZ2UgKi8KKwl2b2x0ZG0tPnJtdyh2b2x0ZG0tPnZwLT5jb21tb24tPnZwY29uZmlnX2Vycm9yZ2Fpbl9tYXNrLAorCQkgICAgdm9sdF9kYXRhLT52cF9lcnJnYWluIDw8CisJCSAgICBfX2Zmcyh2b2x0ZG0tPnZwLT5jb21tb24tPnZwY29uZmlnX2Vycm9yZ2Fpbl9tYXNrKSwKKwkJICAgIHZvbHRkbS0+dnAtPnZwY29uZmlnKTsKKworCXJldHVybiAwOworfQorCisvKiBWUCBmb3JjZSB1cGRhdGUgbWV0aG9kIG9mIHZvbHRhZ2Ugc2NhbGluZyAqLworaW50IG9tYXBfdnBfZm9yY2V1cGRhdGVfc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpCit7CisJc3RydWN0IG9tYXBfdnBfaW5zdGFuY2UgKnZwID0gdm9sdGRtLT52cDsKKwl1MzIgdnBjb25maWc7CisJdTggdGFyZ2V0X3ZzZWwsIGN1cnJlbnRfdnNlbDsKKwlpbnQgcmV0LCB0aW1lb3V0ID0gMDsKKworCXJldCA9IG9tYXBfdmNfcHJlX3NjYWxlKHZvbHRkbSwgdGFyZ2V0X3ZvbHQsICZ0YXJnZXRfdnNlbCwgJmN1cnJlbnRfdnNlbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQ2xlYXIgYWxsIHBlbmRpbmcgVHJhbnNhY3Rpb25Eb25lIGludGVycnVwdC9zdGF0dXMuIFR5cGljYWwgbGF0ZW5jeQorCSAqIGlzIDwzdXMKKwkgKi8KKwl3aGlsZSAodGltZW91dCsrIDwgVlBfVFJBTlhET05FX1RJTUVPVVQpIHsKKwkJdnAtPmNvbW1vbi0+b3BzLT5jbGVhcl90eGRvbmUodnAtPmlkKTsKKwkJaWYgKCF2cC0+Y29tbW9uLT5vcHMtPmNoZWNrX3R4ZG9uZSh2cC0+aWQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJaWYgKHRpbWVvdXQgPj0gVlBfVFJBTlhET05FX1RJTUVPVVQpIHsKKwkJcHJfd2FybmluZygiJXM6IHZkZF8lcyBUUkFOWERPTkUgdGltZW91dCBleGNlZWRlZC4iCisJCQkiVm9sdGFnZSBjaGFuZ2UgYWJvcnRlZCIsIF9fZnVuY19fLCB2b2x0ZG0tPm5hbWUpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwl2cGNvbmZpZyA9IF92cF9zZXRfaW5pdF92b2x0YWdlKHZvbHRkbSwgdGFyZ2V0X3ZvbHQpOworCisJLyogRm9yY2UgdXBkYXRlIG9mIHZvbHRhZ2UgKi8KKwl2b2x0ZG0tPndyaXRlKHZwY29uZmlnIHwgdnAtPmNvbW1vbi0+dnBjb25maWdfZm9yY2V1cGRhdGUsCisJCSAgICAgIHZvbHRkbS0+dnAtPnZwY29uZmlnKTsKKworCS8qCisJICogV2FpdCBmb3IgVHJhbnNhY3Rpb25Eb25lLiBUeXBpY2FsIGxhdGVuY3kgaXMgPDIwMHVzLgorCSAqIERlcGVuZHMgb24gU01QU1dBSVRUSU1FTUlOL01BWCBhbmQgdm9sdGFnZSBjaGFuZ2UKKwkgKi8KKwl0aW1lb3V0ID0gMDsKKwlvbWFwX3Rlc3RfdGltZW91dCh2cC0+Y29tbW9uLT5vcHMtPmNoZWNrX3R4ZG9uZSh2cC0+aWQpLAorCQkJICBWUF9UUkFOWERPTkVfVElNRU9VVCwgdGltZW91dCk7CisJaWYgKHRpbWVvdXQgPj0gVlBfVFJBTlhET05FX1RJTUVPVVQpCisJCXByX2VycigiJXM6IHZkZF8lcyBUUkFOWERPTkUgdGltZW91dCBleGNlZWRlZC4iCisJCQkiVFJBTlhET05FIG5ldmVyIGdvdCBzZXQgYWZ0ZXIgdGhlIHZvbHRhZ2UgdXBkYXRlXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisKKwlvbWFwX3ZjX3Bvc3Rfc2NhbGUodm9sdGRtLCB0YXJnZXRfdm9sdCwgdGFyZ2V0X3ZzZWwsIGN1cnJlbnRfdnNlbCk7CisKKwkvKgorCSAqIERpc2FibGUgVHJhbnNhY3Rpb25Eb25lIGludGVycnVwdCAsIGNsZWFyIGFsbCBzdGF0dXMsIGNsZWFyCisJICogY29udHJvbCByZWdpc3RlcnMKKwkgKi8KKwl0aW1lb3V0ID0gMDsKKwl3aGlsZSAodGltZW91dCsrIDwgVlBfVFJBTlhET05FX1RJTUVPVVQpIHsKKwkJdnAtPmNvbW1vbi0+b3BzLT5jbGVhcl90eGRvbmUodnAtPmlkKTsKKwkJaWYgKCF2cC0+Y29tbW9uLT5vcHMtPmNoZWNrX3R4ZG9uZSh2cC0+aWQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlpZiAodGltZW91dCA+PSBWUF9UUkFOWERPTkVfVElNRU9VVCkKKwkJcHJfd2FybmluZygiJXM6IHZkZF8lcyBUUkFOWERPTkUgdGltZW91dCBleGNlZWRlZCB3aGlsZSB0cnlpbmciCisJCQkidG8gY2xlYXIgdGhlIFRSQU5YRE9ORSBzdGF0dXNcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKworCS8qIENsZWFyIGZvcmNlIGJpdCAqLworCXZvbHRkbS0+d3JpdGUodnBjb25maWcsIHZwLT52cGNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvbWFwX3ZwX2VuYWJsZSgpIC0gQVBJIHRvIGVuYWJsZSBhIHBhcnRpY3VsYXIgVlAKKyAqIEB2b2x0ZG06CXBvaW50ZXIgdG8gdGhlIFZERCB3aG9zZSBWUCBpcyB0byBiZSBlbmFibGVkLgorICoKKyAqIFRoaXMgQVBJIGVuYWJsZXMgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgcHJvY2Vzc29yLiBOZWVkZWQgYnkgdGhlIHNtYXJ0cmVmbGV4CisgKiBjbGFzcyBkcml2ZXJzLgorICovCit2b2lkIG9tYXBfdnBfZW5hYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pCit7CisJc3RydWN0IG9tYXBfdnBfaW5zdGFuY2UgKnZwOworCXUzMiB2cGNvbmZpZywgdm9sdDsKKworCWlmICghdm9sdGRtIHx8IElTX0VSUih2b2x0ZG0pKSB7CisJCXByX3dhcm5pbmcoIiVzOiBWREQgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0IVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJdnAgPSB2b2x0ZG0tPnZwOworCWlmICghdm9sdGRtLT5yZWFkIHx8ICF2b2x0ZG0tPndyaXRlKSB7CisJCXByX2VycigiJXM6IE5vIHJlYWQvd3JpdGUgQVBJIGZvciBhY2Nlc3NpbmcgdmRkXyVzIHJlZ3NcbiIsCisJCQlfX2Z1bmNfXywgdm9sdGRtLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIFZQIGlzIGFscmVhZHkgZW5hYmxlZCwgZG8gbm90aGluZy4gUmV0dXJuICovCisJaWYgKHZwLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwl2b2x0ID0gdm9sdGRtX2dldF92b2x0YWdlKHZvbHRkbSk7CisJaWYgKCF2b2x0KSB7CisJCXByX3dhcm5pbmcoIiVzOiB1bmFibGUgdG8gZmluZCBjdXJyZW50IHZvbHRhZ2UgZm9yICVzXG4iLAorCQkJICAgX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwl2cGNvbmZpZyA9IF92cF9zZXRfaW5pdF92b2x0YWdlKHZvbHRkbSwgdm9sdCk7CisKKwkvKiBFbmFibGUgVlAgKi8KKwl2cGNvbmZpZyB8PSB2cC0+Y29tbW9uLT52cGNvbmZpZ192cGVuYWJsZTsKKwl2b2x0ZG0tPndyaXRlKHZwY29uZmlnLCB2cC0+dnBjb25maWcpOworCisJdnAtPmVuYWJsZWQgPSB0cnVlOworfQorCisvKioKKyAqIG9tYXBfdnBfZGlzYWJsZSgpIC0gQVBJIHRvIGRpc2FibGUgYSBwYXJ0aWN1bGFyIFZQCisgKiBAdm9sdGRtOglwb2ludGVyIHRvIHRoZSBWREQgd2hvc2UgVlAgaXMgdG8gYmUgZGlzYWJsZWQuCisgKgorICogVGhpcyBBUEkgZGlzYWJsZXMgYSBwYXJ0aWN1bGFyIHZvbHRhZ2UgcHJvY2Vzc29yLiBOZWVkZWQgYnkgdGhlIHNtYXJ0cmVmbGV4CisgKiBjbGFzcyBkcml2ZXJzLgorICovCit2b2lkIG9tYXBfdnBfZGlzYWJsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKQoreworCXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlICp2cDsKKwl1MzIgdnBjb25maWc7CisJaW50IHRpbWVvdXQ7CisKKwlpZiAoIXZvbHRkbSB8fCBJU19FUlIodm9sdGRtKSkgeworCQlwcl93YXJuaW5nKCIlczogVkREIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXZwID0gdm9sdGRtLT52cDsKKwlpZiAoIXZvbHRkbS0+cmVhZCB8fCAhdm9sdGRtLT53cml0ZSkgeworCQlwcl9lcnIoIiVzOiBObyByZWFkL3dyaXRlIEFQSSBmb3IgYWNjZXNzaW5nIHZkZF8lcyByZWdzXG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBWUCBpcyBhbHJlYWR5IGRpc2FibGVkLCBkbyBub3RoaW5nLiBSZXR1cm4gKi8KKwlpZiAoIXZwLT5lbmFibGVkKSB7CisJCXByX3dhcm5pbmcoIiVzOiBUcnlpbmcgdG8gZGlzYWJsZSBWUCBmb3IgdmRkXyVzIHdoZW4iCisJCQkiaXQgaXMgYWxyZWFkeSBkaXNhYmxlZFxuIiwgX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEaXNhYmxlIFZQICovCisJdnBjb25maWcgPSB2b2x0ZG0tPnJlYWQodnAtPnZwY29uZmlnKTsKKwl2cGNvbmZpZyAmPSB+dnAtPmNvbW1vbi0+dnBjb25maWdfdnBlbmFibGU7CisJdm9sdGRtLT53cml0ZSh2cGNvbmZpZywgdnAtPnZwY29uZmlnKTsKKworCS8qCisJICogV2FpdCBmb3IgVlAgaWRsZSBUeXBpY2FsIGxhdGVuY3kgaXMgPDJ1cy4gTWF4aW11bSBsYXRlbmN5IGlzIH4xMDB1cworCSAqLworCW9tYXBfdGVzdF90aW1lb3V0KCh2b2x0ZG0tPnJlYWQodnAtPnZzdGF0dXMpKSwKKwkJCSAgVlBfSURMRV9USU1FT1VULCB0aW1lb3V0KTsKKworCWlmICh0aW1lb3V0ID49IFZQX0lETEVfVElNRU9VVCkKKwkJcHJfd2FybmluZygiJXM6IHZkZF8lcyBpZGxlIHRpbWVkb3V0XG4iLAorCQkJX19mdW5jX18sIHZvbHRkbS0+bmFtZSk7CisKKwl2cC0+ZW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92cC5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92cC5oCmluZGV4IDdjZTEzNGYuLjdjMTU1ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdnAuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwLmgKQEAgLTE5LDQ0ICsxOSw2MCBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKK3N0cnVjdCB2b2x0YWdlZG9tYWluOworCisvKgorICogVm9sdGFnZSBQcm9jZXNzb3IgKFZQKSBpZGVudGlmaWVycworICovCisjZGVmaW5lIE9NQVAzX1ZQX1ZERF9NUFVfSUQgMAorI2RlZmluZSBPTUFQM19WUF9WRERfQ09SRV9JRCAxCisjZGVmaW5lIE9NQVA0X1ZQX1ZERF9DT1JFX0lEIDAKKyNkZWZpbmUgT01BUDRfVlBfVkREX0lWQV9JRCAxCisjZGVmaW5lIE9NQVA0X1ZQX1ZERF9NUFVfSUQgMgorCiAvKiBYWFggZG9jdW1lbnQgKi8KICNkZWZpbmUgVlBfSURMRV9USU1FT1VUCQkyMDAKICNkZWZpbmUgVlBfVFJBTlhET05FX1RJTUVPVVQJMzAwCiAKKy8qKgorICogc3RydWN0IG9tYXBfdnBfb3BzIC0gcGVyLVZQIG9wZXJhdGlvbnMKKyAqIEBjaGVja190eGRvbmU6IGNoZWNrIGZvciBWUCB0cmFuc2FjdGlvbiBkb25lCisgKiBAY2xlYXJfdHhkb25lOiBjbGVhciBWUCB0cmFuc2FjdGlvbiBkb25lIHN0YXR1cworICovCitzdHJ1Y3Qgb21hcF92cF9vcHMgeworCXUzMiAoKmNoZWNrX3R4ZG9uZSkodTggdnBfaWQpOworCXZvaWQgKCpjbGVhcl90eGRvbmUpKHU4IHZwX2lkKTsKK307CiAKIC8qKgotICogc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgLSByZWdpc3RlciBkYXRhIGNvbW1vbiB0byBhbGwgVkREcworICogc3RydWN0IG9tYXBfdnBfY29tbW9uIC0gcmVnaXN0ZXIgZGF0YSBjb21tb24gdG8gYWxsIFZERHMKKyAqIEB2cGNvbmZpZ19lcnJvcm9mZnNldF9tYXNrOiBFUlJPUk9GRlNFVCBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19lcnJvcmdhaW5fbWFzazogRVJST1JHQUlOIGJpdG1hc2sgaW4gdGhlIFBSTV9WUCpfQ09ORklHIHJlZwogICogQHZwY29uZmlnX2luaXR2b2x0YWdlX21hc2s6IElOSVRWT0xUQUdFIGJpdG1hc2sgaW4gdGhlIFBSTV9WUCpfQ09ORklHIHJlZwotICogQHZwY29uZmlnX3RpbWVvdXRlbl9tYXNrOiBUSU1FT1VUIGJpdG1hc2sgaW4gdGhlIFBSTV9WUCpfQ09ORklHIHJlZworICogQHZwY29uZmlnX3RpbWVvdXRlbjogVElNRU9VVCBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ19pbml0dmRkOiBJTklUVkREIGJpdG1hc2sgaW4gdGhlIFBSTV9WUCpfQ09ORklHIHJlZwogICogQHZwY29uZmlnX2ZvcmNldXBkYXRlOiBGT1JDRVVQREFURSBiaXRtYXNrIGluIHRoZSBQUk1fVlAqX0NPTkZJRyByZWcKICAqIEB2cGNvbmZpZ192cGVuYWJsZTogVlBFTkFCTEUgYml0bWFzayBpbiB0aGUgUFJNX1ZQKl9DT05GSUcgcmVnCiAgKiBAdnBjb25maWdfZXJyb3JvZmZzZXRfc2hpZnQ6IEVSUk9ST0ZGU0VUIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfQ09ORklHIHJlZwogICogQHZwY29uZmlnX2Vycm9yZ2Fpbl9zaGlmdDogRVJST1JHQUlOIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfQ09ORklHIHJlZwogICogQHZwY29uZmlnX2luaXR2b2x0YWdlX3NoaWZ0OiBJTklUVk9MVEFHRSBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX0NPTkZJRyByZWcKLSAqIEB2cGNvbmZpZ19zdGVwbWluX3NoaWZ0OiBWU1RFUE1JTiBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZQKl9WU1RFUE1JTiByZWcKLSAqIEB2cGNvbmZpZ19zbXBzd2FpdHRpbWVtaW5fc2hpZnQ6IFNNUFNXQUlUVElNRU1JTiBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZTVEVQTUlOIHJlZwotICogQHZwY29uZmlnX3N0ZXBtYXhfc2hpZnQ6IFZTVEVQTUFYIGZpZWxkIHNoaWZ0IGluIHRoZSBQUk1fVlAqX1ZTVEVQTUFYIHJlZwotICogQHZwY29uZmlnX3NtcHN3YWl0dGltZW1heF9zaGlmdDogU01QU1dBSVRUSU1FTUFYIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVlNURVBNQVggcmVnCi0gKiBAdnBjb25maWdfdmxpbWl0dG9fdmRkbWluX3NoaWZ0OiBWRERNSU4gZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKLSAqIEB2cGNvbmZpZ192bGltaXR0b192ZGRtYXhfc2hpZnQ6IFZERE1BWCBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZMSU1JVFRPIHJlZwotICogQHZwY29uZmlnX3ZsaW1pdHRvX3RpbWVvdXRfc2hpZnQ6IFRJTUVPVVQgZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKLSAqCi0gKiBYWFggSXQgaXQgbm90IG5lY2Vzc2FyeSB0byBoYXZlIGJvdGggYSBtYXNrIGFuZCBhIHNoaWZ0IGZvciB0aGUgc2FtZQotICogICAgIGJpdGZpZWxkIC0gcmVtb3ZlIG9uZQotICogWFhYIE1hbnkgb2YgdGhlc2UgZmllbGRzIGFyZSB3cm9uZ2x5IG5hbWVkIC0tIGUuZy4sIHZwY29uZmlnX3NtcHMqIC0tIGZpeCEKKyAqIEB2c3RlcG1pbl9zdGVwbWluX3NoaWZ0OiBWU1RFUE1JTiBmaWVsZCBzaGlmdCBpbiB0aGUgUFJNX1ZQKl9WU1RFUE1JTiByZWcKKyAqIEB2c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW5fc2hpZnQ6IFNNUFNXQUlUVElNRU1JTiBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZTVEVQTUlOIHJlZworICogQHZzdGVwbWF4X3N0ZXBtYXhfc2hpZnQ6IFZTVEVQTUFYIGZpZWxkIHNoaWZ0IGluIHRoZSBQUk1fVlAqX1ZTVEVQTUFYIHJlZworICogQHZzdGVwbWF4X3NtcHN3YWl0dGltZW1heF9zaGlmdDogU01QU1dBSVRUSU1FTUFYIGZpZWxkIHNoaWZ0IGluIFBSTV9WUCpfVlNURVBNQVggcmVnCisgKiBAdmxpbWl0dG9fdmRkbWluX3NoaWZ0OiBWRERNSU4gZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKKyAqIEB2bGltaXR0b192ZGRtYXhfc2hpZnQ6IFZERE1BWCBmaWVsZCBzaGlmdCBpbiBQUk1fVlAqX1ZMSU1JVFRPIHJlZworICogQHZsaW1pdHRvX3RpbWVvdXRfc2hpZnQ6IFRJTUVPVVQgZmllbGQgc2hpZnQgaW4gUFJNX1ZQKl9WTElNSVRUTyByZWcKKyAqIEB2cHZvbHRhZ2VfbWFzazogVlBWT0xUQUdFIGZpZWxkIG1hc2sgaW4gUFJNX1ZQKl9WT0xUQUdFIHJlZwogICovCi1zdHJ1Y3Qgb21hcF92cF9jb21tb25fZGF0YSB7CitzdHJ1Y3Qgb21hcF92cF9jb21tb24geworCXUzMiB2cGNvbmZpZ19lcnJvcm9mZnNldF9tYXNrOwogCXUzMiB2cGNvbmZpZ19lcnJvcmdhaW5fbWFzazsKIAl1MzIgdnBjb25maWdfaW5pdHZvbHRhZ2VfbWFzazsKLQl1MzIgdnBjb25maWdfdGltZW91dGVuOwotCXUzMiB2cGNvbmZpZ19pbml0dmRkOwotCXUzMiB2cGNvbmZpZ19mb3JjZXVwZGF0ZTsKLQl1MzIgdnBjb25maWdfdnBlbmFibGU7Ci0JdTggdnBjb25maWdfZXJyb3JvZmZzZXRfc2hpZnQ7Ci0JdTggdnBjb25maWdfZXJyb3JnYWluX3NoaWZ0OwotCXU4IHZwY29uZmlnX2luaXR2b2x0YWdlX3NoaWZ0OworCXU4IHZwY29uZmlnX3RpbWVvdXRlbjsKKwl1OCB2cGNvbmZpZ19pbml0dmRkOworCXU4IHZwY29uZmlnX2ZvcmNldXBkYXRlOworCXU4IHZwY29uZmlnX3ZwZW5hYmxlOwogCXU4IHZzdGVwbWluX3N0ZXBtaW5fc2hpZnQ7CiAJdTggdnN0ZXBtaW5fc21wc3dhaXR0aW1lbWluX3NoaWZ0OwogCXU4IHZzdGVwbWF4X3N0ZXBtYXhfc2hpZnQ7CkBAIC02NCw4MCArODAsNDkgQEAKIAl1OCB2bGltaXR0b192ZGRtaW5fc2hpZnQ7CiAJdTggdmxpbWl0dG9fdmRkbWF4X3NoaWZ0OwogCXU4IHZsaW1pdHRvX3RpbWVvdXRfc2hpZnQ7CisJdTggdnB2b2x0YWdlX21hc2s7CisKKwljb25zdCBzdHJ1Y3Qgb21hcF92cF9vcHMgKm9wczsKIH07CiAKIC8qKgotICogc3RydWN0IG9tYXBfdnBfcHJtX2lycXN0X2RhdGEgLSBQUk1fSVJRU1RBVFVTX01QVS5WUF9UUkFOWERPTkVfU1QgZGF0YQotICogQHBybV9pcnFzdF9yZWc6IHJlZyBvZmZzZXQgZm9yIFBSTV9JUlFTVEFUVVNfTVBVIGZyb20gdG9wIG9mIFBSTQotICogQHRyYW54ZG9uZV9zdGF0dXM6IFZQX1RSQU5YRE9ORV9TVCBiaXRtYXNrIGluIFBSTV9JUlFTVEFUVVNfTVBVIHJlZwotICoKLSAqIFhYWCBwcm1faXJxc3RfcmVnIGRvZXMgbm90IGJlbG9uZyBoZXJlCi0gKiBYWFggTm90ZSB0aGF0IG9uIE9NQVAzLCBWUF9UUkFOWERPTkUgaW50ZXJydXB0IG1heSBub3Qgd29yayBkdWUgdG8gYQotICogICAgIGhhcmR3YXJlIGJ1ZwotICogWFhYIFRoaXMgc3RydWN0dXJlIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQKLSAqLwotc3RydWN0IG9tYXBfdnBfcHJtX2lycXN0X2RhdGEgewotCXU4IHBybV9pcnFzdF9yZWc7Ci0JdTMyIHRyYW54ZG9uZV9zdGF0dXM7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgLSBWUCByZWdpc3RlciBvZmZzZXRzIChwZXItVkREKQotICogQHZwX2NvbW1vbjogcG9pbnRlciB0byBzdHJ1Y3Qgb21hcF92cF9jb21tb25fZGF0YSAqIGZvciB0aGlzIFNvQwotICogQHBybV9pcnFzdF9kYXRhOiBwb2ludGVyIHRvIHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIGZvciB0aGlzIFZERAorICogc3RydWN0IG9tYXBfdnBfaW5zdGFuY2UgLSBWUCByZWdpc3RlciBvZmZzZXRzIChwZXItVkREKQorICogQGNvbW1vbjogcG9pbnRlciB0byBzdHJ1Y3Qgb21hcF92cF9jb21tb24gKiBmb3IgdGhpcyBTb0MKICAqIEB2cGNvbmZpZzogUFJNX1ZQKl9DT05GSUcgcmVnIG9mZnNldCBmcm9tIFBSTSBzdGFydAogICogQHZzdGVwbWluOiBQUk1fVlAqX1ZTVEVQTUlOIHJlZyBvZmZzZXQgZnJvbSBQUk0gc3RhcnQKICAqIEB2bGltaXR0bzogUFJNX1ZQKl9WTElNSVRUTyByZWcgb2Zmc2V0IGZyb20gUFJNIHN0YXJ0CiAgKiBAdnN0YXR1czogUFJNX1ZQKl9WU1RBVFVTIHJlZyBvZmZzZXQgZnJvbSBQUk0gc3RhcnQKICAqIEB2b2x0YWdlOiBQUk1fVlAqX1ZPTFRBR0UgcmVnIG9mZnNldCBmcm9tIFBSTSBzdGFydAorICogQGlkOiBVbmlxdWUgaWRlbnRpZmllciBmb3IgVlAgaW5zdGFuY2UuCisgKiBAZW5hYmxlZDogZmxhZyB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdnAgaXMgZW5hYmxlZCBvciBub3QKICAqCiAgKiBYWFggdnBfY29tbW9uIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgc2luY2UgaXQgaXMgcGVyLVNvQwogICovCi1zdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIHsKLQljb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb25fZGF0YSAqdnBfY29tbW9uOwotCWNvbnN0IHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhICpwcm1faXJxc3RfZGF0YTsKK3N0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIHsKKwljb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb24gKmNvbW1vbjsKIAl1OCB2cGNvbmZpZzsKIAl1OCB2c3RlcG1pbjsKIAl1OCB2c3RlcG1heDsKIAl1OCB2bGltaXR0bzsKIAl1OCB2c3RhdHVzOwogCXU4IHZvbHRhZ2U7CisJdTggaWQ7CisJYm9vbCBlbmFibGVkOwogfTsKIAotLyoqCi0gKiBzdHJ1Y3Qgb21hcF92cF9ydW50aW1lX2RhdGEgLSBWUCBkYXRhIHBvcHVsYXRlZCBhdCBydW50aW1lIGJ5IGNvZGUKLSAqIEB2cGNvbmZpZ19lcnJvcm9mZnNldDogdmFsdWUgb2YgRVJST1JPRkZTRVQgYml0ZmllbGQgaW4gUFJNX1ZQKl9DT05GSUcKLSAqIEB2cGNvbmZpZ19lcnJvcmdhaW46IHZhbHVlIG9mIEVSUk9SR0FJTiBiaXRmaWVsZCBpbiBQUk1fVlAqX0NPTkZJRwotICogQHZzdGVwbWluX3NtcHN3YWl0dGltZW1pbjogdmFsdWUgb2YgU01QU1dBSVRUSU1FTUlOIGJpdGZpZWxkIGluIFBSTV9WUCpfVlNURVBNSU4KLSAqIEB2c3RlcG1heF9zbXBzd2FpdHRpbWVtYXg6IHZhbHVlIG9mIFNNUFNXQUlUVElNRU1BWCBiaXRmaWVsZCBpbiBQUk1fVlAqX1ZTVEVQTUFYCi0gKiBAdmxpbWl0dG9fdGltZW91dDogdmFsdWUgb2YgVElNRU9VVCBiaXRmaWVsZCBpbiBQUk1fVlAqX1ZMSU1JVFRPCi0gKiBAdnN0ZXBtaW5fc3RlcG1pbjogdmFsdWUgb2YgVlNURVBNSU4gYml0ZmllbGQgaW4gUFJNX1ZQKl9WU1RFUE1JTgotICogQHZzdGVwbWF4X3N0ZXBtYXg6IHZhbHVlIG9mIFZTVEVQTUFYIGJpdGZpZWxkIGluIFBSTV9WUCpfVlNURVBNQVgKLSAqIEB2bGltaXR0b192ZGRtaW46IHZhbHVlIG9mIFZERE1JTiBiaXRmaWVsZCBpbiBQUk1fVlAqX1ZMSU1JVFRPCi0gKiBAdmxpbWl0dG9fdmRkbWF4OiB2YWx1ZSBvZiBWRERNQVggYml0ZmllbGQgaW4gUFJNX1ZQKl9WTElNSVRUTwotICoKLSAqIFhYWCBJcyB0aGlzIHN0cnVjdHVyZSByZWFsbHkgbmVlZGVkPyAgV2h5IG5vdCBqdXN0IHByb2dyYW0gdGhlCi0gKiBkZXZpY2UgZGlyZWN0bHk/ICBUaGV5IGFyZSBpbiBQUk0gc3BhY2UsIHRoZXJlZm9yZSBpbiB0aGUgV0tVUAotICogcG93ZXJkb21haW4sIHNvIHJlZ2lzdGVyIGNvbnRlbnRzIHNob3VsZCBub3QgYmUgbG9zdCBpbiBvZmYtbW9kZS4KLSAqIFhYWCBTb21lIG9mIHRoZXNlIGZpZWxkcyBhcmUgaW5jb3JyZWN0bHkgbmFtZWQsIGUuZy4sIHZzdGVwKgotICovCi1zdHJ1Y3Qgb21hcF92cF9ydW50aW1lX2RhdGEgewotCXUzMiB2cGNvbmZpZ19lcnJvcm9mZnNldDsKLQl1MTYgdnBjb25maWdfZXJyb3JnYWluOwotCXUxNiB2c3RlcG1pbl9zbXBzd2FpdHRpbWVtaW47Ci0JdTE2IHZzdGVwbWF4X3NtcHN3YWl0dGltZW1heDsKLQl1MTYgdmxpbWl0dG9fdGltZW91dDsKLQl1OCB2c3RlcG1pbl9zdGVwbWluOwotCXU4IHZzdGVwbWF4X3N0ZXBtYXg7Ci0JdTggdmxpbWl0dG9fdmRkbWluOwotCXU4IHZsaW1pdHRvX3ZkZG1heDsKLX07CitleHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDNfdnBfbXB1OworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXAzX3ZwX2NvcmU7CiAKLWV4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXAzX3ZwMV9kYXRhOwotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDNfdnAyX2RhdGE7CitleHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDRfdnBfbXB1OworZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXA0X3ZwX2l2YTsKK2V4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwNF92cF9jb3JlOwogCi1leHRlcm4gc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwNF92cF9tcHVfZGF0YTsKLWV4dGVybiBzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXA0X3ZwX2l2YV9kYXRhOwotZXh0ZXJuIHN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDRfdnBfY29yZV9kYXRhOwordm9pZCBvbWFwX3ZwX2luaXQoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7Cit2b2lkIG9tYXBfdnBfZW5hYmxlKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0pOwordm9pZCBvbWFwX3ZwX2Rpc2FibGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSk7CitpbnQgb21hcF92cF9mb3JjZXVwZGF0ZV9zY2FsZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7CitpbnQgb21hcF92cF91cGRhdGVfZXJyb3JnYWluKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvdnAzeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdnAzeHh4X2RhdGEuYwppbmRleCA2NDUyMTcwLi4yNjBjNTU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi92cDN4eHhfZGF0YS5jCkBAIC0yNSwxNiArMjUsMjAgQEAKICNpbmNsdWRlICJ2b2x0YWdlLmgiCiAKICNpbmNsdWRlICJ2cC5oIgorI2luY2x1ZGUgInBybTJ4eHhfM3h4eC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfb3BzIG9tYXAzX3ZwX29wcyA9IHsKKwkuY2hlY2tfdHhkb25lID0gb21hcDNfcHJtX3ZwX2NoZWNrX3R4ZG9uZSwKKwkuY2xlYXJfdHhkb25lID0gb21hcDNfcHJtX3ZwX2NsZWFyX3R4ZG9uZSwKK307CiAKIC8qCiAgKiBWUCBkYXRhIGNvbW1vbiB0byAzNHh4LzM2eHggY2hpcHMKICAqIFhYWCBUaGlzIHN0dWZmIHByZXN1bWFibHkgYmVsb25ncyBpbiB0aGUgdnAzeHh4LmMgb3IgdnAuYyBmaWxlLgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfY29tbW9uX2RhdGEgb21hcDNfdnBfY29tbW9uID0gewotCS52cGNvbmZpZ19lcnJvcm9mZnNldF9zaGlmdCA9IE9NQVAzNDMwX0VSUk9ST0ZGU0VUX1NISUZULAorc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX2NvbW1vbiBvbWFwM192cF9jb21tb24gPSB7CisJLnZwY29uZmlnX2Vycm9yb2Zmc2V0X21hc2sgPSBPTUFQMzQzMF9FUlJPUk9GRlNFVF9NQVNLLAogCS52cGNvbmZpZ19lcnJvcmdhaW5fbWFzayA9IE9NQVAzNDMwX0VSUk9SR0FJTl9NQVNLLAotCS52cGNvbmZpZ19lcnJvcmdhaW5fc2hpZnQgPSBPTUFQMzQzMF9FUlJPUkdBSU5fU0hJRlQsCi0JLnZwY29uZmlnX2luaXR2b2x0YWdlX3NoaWZ0ID0gT01BUDM0MzBfSU5JVFZPTFRBR0VfU0hJRlQsCiAJLnZwY29uZmlnX2luaXR2b2x0YWdlX21hc2sgPSBPTUFQMzQzMF9JTklUVk9MVEFHRV9NQVNLLAogCS52cGNvbmZpZ190aW1lb3V0ZW4gPSBPTUFQMzQzMF9USU1FT1VURU5fTUFTSywKIAkudnBjb25maWdfaW5pdHZkZCA9IE9NQVAzNDMwX0lOSVRWRERfTUFTSywKQEAgLTQ3LDM2ICs1MSwyOSBAQAogCS52bGltaXR0b192ZGRtaW5fc2hpZnQgPSBPTUFQMzQzMF9WRERNSU5fU0hJRlQsCiAJLnZsaW1pdHRvX3ZkZG1heF9zaGlmdCA9IE9NQVAzNDMwX1ZERE1BWF9TSElGVCwKIAkudmxpbWl0dG9fdGltZW91dF9zaGlmdCA9IE9NQVAzNDMwX1RJTUVPVVRfU0hJRlQsCisJLnZwdm9sdGFnZV9tYXNrID0gT01BUDM0MzBfVlBWT0xUQUdFX01BU0ssCisKKwkub3BzID0gJm9tYXAzX3ZwX29wcywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBvbWFwM192cDFfcHJtX2lycXN0X2RhdGEgPSB7Ci0JLnBybV9pcnFzdF9yZWcgPSBPTUFQM19QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQsCi0JLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQMzQzMF9WUDFfVFJBTlhET05FX1NUX01BU0ssCi19OwotCi1zdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXAzX3ZwMV9kYXRhID0gewotCS52cF9jb21tb24gPSAmb21hcDNfdnBfY29tbW9uLAorc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDNfdnBfbXB1ID0geworCS5pZCA9IE9NQVAzX1ZQX1ZERF9NUFVfSUQsCisJLmNvbW1vbiA9ICZvbWFwM192cF9jb21tb24sCiAJLnZwY29uZmlnID0gT01BUDNfUFJNX1ZQMV9DT05GSUdfT0ZGU0VULAogCS52c3RlcG1pbiA9IE9NQVAzX1BSTV9WUDFfVlNURVBNSU5fT0ZGU0VULAogCS52c3RlcG1heCA9IE9NQVAzX1BSTV9WUDFfVlNURVBNQVhfT0ZGU0VULAogCS52bGltaXR0byA9IE9NQVAzX1BSTV9WUDFfVkxJTUlUVE9fT0ZGU0VULAogCS52c3RhdHVzID0gT01BUDNfUFJNX1ZQMV9TVEFUVVNfT0ZGU0VULAogCS52b2x0YWdlID0gT01BUDNfUFJNX1ZQMV9WT0xUQUdFX09GRlNFVCwKLQkucHJtX2lycXN0X2RhdGEgPSAmb21hcDNfdnAxX3BybV9pcnFzdF9kYXRhLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIG9tYXAzX3ZwMl9wcm1faXJxc3RfZGF0YSA9IHsKLQkucHJtX2lycXN0X3JlZyA9IE9NQVAzX1BSTV9JUlFTVEFUVVNfTVBVX09GRlNFVCwKLQkudHJhbnhkb25lX3N0YXR1cyA9IE9NQVAzNDMwX1ZQMl9UUkFOWERPTkVfU1RfTUFTSywKLX07Ci0KLXN0cnVjdCBvbWFwX3ZwX2luc3RhbmNlX2RhdGEgb21hcDNfdnAyX2RhdGEgPSB7Ci0JLnZwX2NvbW1vbiA9ICZvbWFwM192cF9jb21tb24sCitzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwM192cF9jb3JlID0geworCS5pZCA9IE9NQVAzX1ZQX1ZERF9DT1JFX0lELAorCS5jb21tb24gPSAmb21hcDNfdnBfY29tbW9uLAogCS52cGNvbmZpZyA9IE9NQVAzX1BSTV9WUDJfQ09ORklHX09GRlNFVCwKIAkudnN0ZXBtaW4gPSBPTUFQM19QUk1fVlAyX1ZTVEVQTUlOX09GRlNFVCwKIAkudnN0ZXBtYXggPSBPTUFQM19QUk1fVlAyX1ZTVEVQTUFYX09GRlNFVCwKIAkudmxpbWl0dG8gPSBPTUFQM19QUk1fVlAyX1ZMSU1JVFRPX09GRlNFVCwKIAkudnN0YXR1cyA9IE9NQVAzX1BSTV9WUDJfU1RBVFVTX09GRlNFVCwKIAkudm9sdGFnZSA9IE9NQVAzX1BSTV9WUDJfVk9MVEFHRV9PRkZTRVQsCi0JLnBybV9pcnFzdF9kYXRhID0gJm9tYXAzX3ZwMl9wcm1faXJxc3RfZGF0YSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwNDR4eF9kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3ZwNDR4eF9kYXRhLmMKaW5kZXggNjVkMWFkNi4uYjRlNzcwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi92cDQ0eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdnA0NHh4X2RhdGEuYwpAQCAtMjcsMTUgKzI3LDE4IEBACiAKICNpbmNsdWRlICJ2cC5oIgogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdnBfb3BzIG9tYXA0X3ZwX29wcyA9IHsKKwkuY2hlY2tfdHhkb25lID0gb21hcDRfcHJtX3ZwX2NoZWNrX3R4ZG9uZSwKKwkuY2xlYXJfdHhkb25lID0gb21hcDRfcHJtX3ZwX2NsZWFyX3R4ZG9uZSwKK307CisKIC8qCiAgKiBWUCBkYXRhIGNvbW1vbiB0byA0NHh4IGNoaXBzCiAgKiBYWFggVGhpcyBzdHVmZiBwcmVzdW1hYmx5IGJlbG9uZ3MgaW4gdGhlIHZwNDR4eC5jIG9yIHZwLmMgZmlsZS4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX2NvbW1vbl9kYXRhIG9tYXA0X3ZwX2NvbW1vbiA9IHsKLQkudnBjb25maWdfZXJyb3JvZmZzZXRfc2hpZnQgPSBPTUFQNDQzMF9FUlJPUk9GRlNFVF9TSElGVCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9jb21tb24gb21hcDRfdnBfY29tbW9uID0geworCS52cGNvbmZpZ19lcnJvcm9mZnNldF9tYXNrID0gT01BUDQ0MzBfRVJST1JPRkZTRVRfTUFTSywKIAkudnBjb25maWdfZXJyb3JnYWluX21hc2sgPSBPTUFQNDQzMF9FUlJPUkdBSU5fTUFTSywKLQkudnBjb25maWdfZXJyb3JnYWluX3NoaWZ0ID0gT01BUDQ0MzBfRVJST1JHQUlOX1NISUZULAotCS52cGNvbmZpZ19pbml0dm9sdGFnZV9zaGlmdCA9IE9NQVA0NDMwX0lOSVRWT0xUQUdFX1NISUZULAogCS52cGNvbmZpZ19pbml0dm9sdGFnZV9tYXNrID0gT01BUDQ0MzBfSU5JVFZPTFRBR0VfTUFTSywKIAkudnBjb25maWdfdGltZW91dGVuID0gT01BUDQ0MzBfVElNRU9VVEVOX01BU0ssCiAJLnZwY29uZmlnX2luaXR2ZGQgPSBPTUFQNDQzMF9JTklUVkREX01BU0ssCkBAIC00OCw1MyArNTEsMzkgQEAKIAkudmxpbWl0dG9fdmRkbWluX3NoaWZ0ID0gT01BUDQ0MzBfVkRETUlOX1NISUZULAogCS52bGltaXR0b192ZGRtYXhfc2hpZnQgPSBPTUFQNDQzMF9WRERNQVhfU0hJRlQsCiAJLnZsaW1pdHRvX3RpbWVvdXRfc2hpZnQgPSBPTUFQNDQzMF9USU1FT1VUX1NISUZULAorCS52cHZvbHRhZ2VfbWFzayA9IE9NQVA0NDMwX1ZQVk9MVEFHRV9NQVNLLAorCS5vcHMgPSAmb21hcDRfdnBfb3BzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIG9tYXA0X3ZwX21wdV9wcm1faXJxc3RfZGF0YSA9IHsKLQkucHJtX2lycXN0X3JlZyA9IE9NQVA0X1BSTV9JUlFTVEFUVVNfTVBVXzJfT0ZGU0VULAotCS50cmFueGRvbmVfc3RhdHVzID0gT01BUDQ0MzBfVlBfTVBVX1RSQU5YRE9ORV9TVF9NQVNLLAotfTsKLQotc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwNF92cF9tcHVfZGF0YSA9IHsKLQkudnBfY29tbW9uID0gJm9tYXA0X3ZwX2NvbW1vbiwKK3N0cnVjdCBvbWFwX3ZwX2luc3RhbmNlIG9tYXA0X3ZwX21wdSA9IHsKKwkuaWQgPSBPTUFQNF9WUF9WRERfTVBVX0lELAorCS5jb21tb24gPSAmb21hcDRfdnBfY29tbW9uLAogCS52cGNvbmZpZyA9IE9NQVA0X1BSTV9WUF9NUFVfQ09ORklHX09GRlNFVCwKIAkudnN0ZXBtaW4gPSBPTUFQNF9QUk1fVlBfTVBVX1ZTVEVQTUlOX09GRlNFVCwKIAkudnN0ZXBtYXggPSBPTUFQNF9QUk1fVlBfTVBVX1ZTVEVQTUFYX09GRlNFVCwKIAkudmxpbWl0dG8gPSBPTUFQNF9QUk1fVlBfTVBVX1ZMSU1JVFRPX09GRlNFVCwKIAkudnN0YXR1cyA9IE9NQVA0X1BSTV9WUF9NUFVfU1RBVFVTX09GRlNFVCwKIAkudm9sdGFnZSA9IE9NQVA0X1BSTV9WUF9NUFVfVk9MVEFHRV9PRkZTRVQsCi0JLnBybV9pcnFzdF9kYXRhID0gJm9tYXA0X3ZwX21wdV9wcm1faXJxc3RfZGF0YSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF92cF9wcm1faXJxc3RfZGF0YSBvbWFwNF92cF9pdmFfcHJtX2lycXN0X2RhdGEgPSB7Ci0JLnBybV9pcnFzdF9yZWcgPSBPTUFQNF9QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQsCi0JLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQNDQzMF9WUF9JVkFfVFJBTlhET05FX1NUX01BU0ssCi19OwotCi1zdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZV9kYXRhIG9tYXA0X3ZwX2l2YV9kYXRhID0gewotCS52cF9jb21tb24gPSAmb21hcDRfdnBfY29tbW9uLAorc3RydWN0IG9tYXBfdnBfaW5zdGFuY2Ugb21hcDRfdnBfaXZhID0geworCS5pZCA9IE9NQVA0X1ZQX1ZERF9JVkFfSUQsCisJLmNvbW1vbiA9ICZvbWFwNF92cF9jb21tb24sCiAJLnZwY29uZmlnID0gT01BUDRfUFJNX1ZQX0lWQV9DT05GSUdfT0ZGU0VULAogCS52c3RlcG1pbiA9IE9NQVA0X1BSTV9WUF9JVkFfVlNURVBNSU5fT0ZGU0VULAogCS52c3RlcG1heCA9IE9NQVA0X1BSTV9WUF9JVkFfVlNURVBNQVhfT0ZGU0VULAogCS52bGltaXR0byA9IE9NQVA0X1BSTV9WUF9JVkFfVkxJTUlUVE9fT0ZGU0VULAogCS52c3RhdHVzID0gT01BUDRfUFJNX1ZQX0lWQV9TVEFUVVNfT0ZGU0VULAogCS52b2x0YWdlID0gT01BUDRfUFJNX1ZQX0lWQV9WT0xUQUdFX09GRlNFVCwKLQkucHJtX2lycXN0X2RhdGEgPSAmb21hcDRfdnBfaXZhX3BybV9pcnFzdF9kYXRhLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX3ZwX3BybV9pcnFzdF9kYXRhIG9tYXA0X3ZwX2NvcmVfcHJtX2lycXN0X2RhdGEgPSB7Ci0JLnBybV9pcnFzdF9yZWcgPSBPTUFQNF9QUk1fSVJRU1RBVFVTX01QVV9PRkZTRVQsCi0JLnRyYW54ZG9uZV9zdGF0dXMgPSBPTUFQNDQzMF9WUF9DT1JFX1RSQU5YRE9ORV9TVF9NQVNLLAotfTsKLQotc3RydWN0IG9tYXBfdnBfaW5zdGFuY2VfZGF0YSBvbWFwNF92cF9jb3JlX2RhdGEgPSB7Ci0JLnZwX2NvbW1vbiA9ICZvbWFwNF92cF9jb21tb24sCitzdHJ1Y3Qgb21hcF92cF9pbnN0YW5jZSBvbWFwNF92cF9jb3JlID0geworCS5pZCA9IE9NQVA0X1ZQX1ZERF9DT1JFX0lELAorCS5jb21tb24gPSAmb21hcDRfdnBfY29tbW9uLAogCS52cGNvbmZpZyA9IE9NQVA0X1BSTV9WUF9DT1JFX0NPTkZJR19PRkZTRVQsCiAJLnZzdGVwbWluID0gT01BUDRfUFJNX1ZQX0NPUkVfVlNURVBNSU5fT0ZGU0VULAogCS52c3RlcG1heCA9IE9NQVA0X1BSTV9WUF9DT1JFX1ZTVEVQTUFYX09GRlNFVCwKIAkudmxpbWl0dG8gPSBPTUFQNF9QUk1fVlBfQ09SRV9WTElNSVRUT19PRkZTRVQsCiAJLnZzdGF0dXMgPSBPTUFQNF9QUk1fVlBfQ09SRV9TVEFUVVNfT0ZGU0VULAogCS52b2x0YWdlID0gT01BUDRfUFJNX1ZQX0NPUkVfVk9MVEFHRV9PRkZTRVQsCi0JLnBybV9pcnFzdF9kYXRhID0gJm9tYXA0X3ZwX2NvcmVfcHJtX2lycXN0X2RhdGEsCiB9OwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZDJuZXQtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kMm5ldC1zZXR1cC5jCmluZGV4IDE5Y2Y1YmYuLjhjODMwMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kMm5ldC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kMm5ldC1zZXR1cC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX0QyTkVUCiBNQUNISU5FX1NUQVJUKEQyTkVULCAiTGFDaWUgZDIgTmV0d29yayIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZDJuZXRfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApAQCAtMzQ4LDcgKzM0OCw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9CSUdESVNLCiBNQUNISU5FX1NUQVJUKEJJR0RJU0ssICJMYUNpZSBCaWcgRGlzayBOZXR3b3JrIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBkMm5ldF9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKaW5kZXggYTNlM2U5ZS4uNGI3OWE4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYwpAQCAtOSw3ICs5LDcgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4X2V0aC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0zNTksNyArMzU4LDcgQEAKIAogTUFDSElORV9TVEFSVChEQjg4RjUyODEsICJNYXJ2ZWxsIE9yaW9uLTIgRGV2ZWxvcG1lbnQgQm9hcmQiKQogCS8qIE1haW50YWluZXI6IFR6YWNoaSBQZXJlbHN0ZWluIDx0emFjaGlAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gZGI4OGY1MjgxX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwppbmRleCBjMTA1NTU2Li4zNDNmNjBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L21hcnZlbGxfcGh5Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KQEAgLTczMCw3ICs3MjksNyBAQAogLyogV2FybmluZzogRC1MaW5rIHVzZXMgYSB3cm9uZyBtYWNoLXR5cGUgKD01MjYpIGluIHRoZWlyIGJvb3Rsb2FkZXIgKi8KIE1BQ0hJTkVfU1RBUlQoRE5TMzIzLCAiRC1MaW5rIEROUy0zMjMiKQogCS8qIE1haW50YWluZXI6IEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGRuczMyM19pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZWRtaW5pX3YyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZWRtaW5pX3YyLXNldHVwLmMKaW5kZXggYjY3Y2ZmMC4uNzBhNGU5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2VkbWluaV92Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9lZG1pbmlfdjItc2V0dXAuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAvKiBXYXJuaW5nOiBMYUNpZSB1c2UgYSB3cm9uZyBtYWNoLXR5cGUgKDB4MjBlPTUyNikgaW4gdGhlaXIgYm9vdGxvYWRlci4gKi8KIE1BQ0hJTkVfU1RBUlQoRURNSU5JX1YyLCAiTGFDaWUgRXRoZXJuZXQgRGlzayBtaW5pIFYyIikKIAkvKiBNYWludGFpbmVyOiBDaHJpc3RvcGhlciBNb29yZSA8bW9vcmVAZnJlZS5mcj4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBlZG1pbmlfdjJfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDVlM2JmNWIuLmYzNDBlZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTEwLDcgKzEwLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgogCi0JLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvICBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAlsZHIJXHJwLCA9T1JJT041WF9SRUdTX1BIWVNfQkFTRQogCWxkcglccnYsID1PUklPTjVYX1JFR1NfVklSVF9CQVNFCiAJb3JyCVxycCwgXHJwLCAjMHgwMDAxMjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3Njk5MTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLW9yaW9uNXgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogTWFydmVsbCBPcmlvbiBtZW1vcnkgZGVmaW5pdGlvbnMKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvaXJxLmMKaW5kZXggNDNjZjhiYy4uYjFiNDVmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9pcnEuYwpAQCAtOSwxMiArOSwxMSBAQAogICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2JyaWRnZS1yZWdzLmg+CiAjaW5jbHVkZSA8cGxhdC9pcnEuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKaW5kZXggMDAzODEyNC4uZDNjZDNmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0zODAsNyArMzc5LDcgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9LVVJPQk9YX1BSTwogTUFDSElORV9TVEFSVChLVVJPQk9YX1BSTywgIkJ1ZmZhbG8vUmV2b2dlYXIgS3Vyb2JveCBQcm8iKQogCS8qIE1haW50YWluZXI6IFJvbmVuIFNoaXRyaXQgPHJzaGl0cml0QG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGt1cm9ib3hfcHJvX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKQEAgLTM5Myw3ICszOTIsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0xJTktTVEFUSU9OX1BSTwogTUFDSElORV9TVEFSVChMSU5LU1RBVElPTl9QUk8sICJCdWZmYWxvIExpbmtzdGF0aW9uIFByby9MaXZlIikKIAkvKiBNYWludGFpbmVyOiBCeXJvbiBCcmFkbGV5IDxieXJvbi5iYnJhZGxleUBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0ga3Vyb2JveF9wcm9faW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzLWNobC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzLWNobC1zZXR1cC5jCmluZGV4IDUwNjU4MDMuLjk1MDNmZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9scy1jaGwtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHMtY2hsLXNldHVwLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCiBNQUNISU5FX1NUQVJUKExJTktTVEFUSU9OX0xTQ0hMLCAiQnVmZmFsbyBMaW5rc3RhdGlvbiBMaXZlVjMgKExTLUNITCkiKQogCS8qIE1haW50YWluZXI6IEFzaCBIdWdoZXMgPGFzaGxleS5odWdoZXNAYmx1ZXlvbmRlci5jby51az4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBsc2NobF9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHNfaGdsLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHNfaGdsLXNldHVwLmMKaW5kZXggODUwM2QwYS4uZWQ2ZDc3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzX2hnbC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc19oZ2wtc2V0dXAuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTElOS1NUQVRJT05fTFNfSEdMLCAiQnVmZmFsbyBMaW5rc3RhdGlvbiBMUy1IR0wiKQogCS8qIE1haW50YWluZXI6IFpodSBRaW5nc2VuIDx6aHVxc0Bjbi5mdWppc3R1LmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBsc19oZ2xfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzbWluaS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2xzbWluaS1zZXR1cC5jCmluZGV4IDljODI3MjMuLjc0M2Y3ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9sc21pbmktc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbHNtaW5pLXNldHVwLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogI2lmZGVmIENPTkZJR19NQUNIX0xJTktTVEFUSU9OX01JTkkKIE1BQ0hJTkVfU1RBUlQoTElOS1NUQVRJT05fTUlOSSwgIkJ1ZmZhbG8gTGlua3N0YXRpb24gTWluaSIpCiAJLyogTWFpbnRhaW5lcjogQWxleGV5IEtvcHl0a28gPGFsZXhleUBrb3B5dGtvLnJ1PiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGxzbWluaV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYwppbmRleCBlZjNiYjhlLi42MDIwZTI2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAogTUFDSElORV9TVEFSVChNU1MyLCAiTWF4dG9yIFNoYXJlZCBTdG9yYWdlIElJIikKIAkvKiBNYWludGFpbmVyOiBTeWx2ZXIgQnJ1bmVhdSA8c3lsdmVyLmJydW5lYXVAZ29vZ2xlbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbXNzMl9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXYyMTIwLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXYyMTIwLXNldHVwLmMKaW5kZXggNjNmZjEwYy4uMjAxYWUzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L212MjEyMC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tdjIxMjAtc2V0dXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQogICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgpAQCAtMjI5LDcgKzIyOCw3IEBACiAvKiBXYXJuaW5nOiBIUCB1c2VzIGEgd3JvbmcgbWFjaC10eXBlICg9NTI2KSBpbiB0aGVpciBib290bG9hZGVyICovCiBNQUNISU5FX1NUQVJUKE1WMjEyMCwgIkhQIE1lZGlhIFZhdWx0IG12MjEyMCIpCiAJLyogTWFpbnRhaW5lcjogTWFydGluIE1pY2hsbWF5ciA8dGJtQGN5cml1cy5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gbXYyMTIwX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9uZXQyYmlnLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbmV0MmJpZy1zZXR1cC5jCmluZGV4IGU0M2IzOWMuLjYxOTdjNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9uZXQyYmlnLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L25ldDJiaWctc2V0dXAuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiAKIC8qIFdhcm5pbmc6IExhQ2llIHVzZSBhIHdyb25nIG1hY2gtdHlwZSAoMHgyMGU9NTI2KSBpbiB0aGVpciBib290bG9hZGVyLiAqLwogTUFDSElORV9TVEFSVChORVQyQklHLCAiTGFDaWUgMkJpZyBOZXR3b3JrIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBuZXQyYmlnX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKaW5kZXggMjkxZDIyYi4uZWJkNjc2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CkBAIC0xNjksNyArMTY4LDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjUxODFMX0ZYTywgIk1hcnZlbGwgT3Jpb24tVm9JUCBGWE8gUmVmZXJlbmNlIERlc2lnbiIpCiAJLyogTWFpbnRhaW5lcjogTmljb2xhcyBQaXRyZSA8bmljb0BtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDg4ZjUxODFsX2Z4b19pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYwppbmRleCAzZjAyMzYyLi4wNWRiMmQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWdlLXNldHVwLmMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KQEAgLTE4MSw3ICsxODAsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJEODhGNTE4MUxfR0UsICJNYXJ2ZWxsIE9yaW9uLVZvSVAgR0UgUmVmZXJlbmNlIERlc2lnbiIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmQ4OGY1MTgxbF9nZV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKaW5kZXggMjdmZDM4ZS4uZTQ3ZmEwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYwpAQCAtOSw3ICs5LDcgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CkBAIC0zMDYsNyArMzA1LDcgQEAKIAogTUFDSElORV9TVEFSVChSRDg4RjUxODIsICJNYXJ2ZWxsIE9yaW9uLU5BUyBSZWZlcmVuY2UgRGVzaWduIikKIAkvKiBNYWludGFpbmVyOiBSb25lbiBTaGl0cml0IDxyc2hpdHJpdEBtYXJ2ZWxsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSByZDg4ZjUxODJfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNjE4M2FwLWdlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY2MTgzYXAtZ2Utc2V0dXAuYwppbmRleCBhZDJlYmE5Li42NDMxNzI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY2MTgzYXAtZ2Utc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY2MTgzYXAtZ2Utc2V0dXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KQEAgLTEyMiw3ICsxMjEsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJEODhGNjE4M0FQX0dFLCAiTWFydmVsbCBPcmlvbi0xLTkwIEFQIEdFIFJlZmVyZW5jZSBEZXNpZ24iKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJkODhmNjE4M2FwX2dlX2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jCmluZGV4IGEzNGU0ZmEuLjI5ZjE1MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwpAQCAtOCw3ICs4LDcgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KQEAgLTM1OCw3ICszNTcsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRFUkFTVEFUSU9OX1BSTzIsICJCdWZmYWxvIFRlcmFzdGF0aW9uIFBybyBJSS9MaXZlIikKIAkvKiBNYWludGFpbmVyOiAgU3lsdmVyIEJydW5lYXUgPHN5bHZlci5icnVuZWF1QGdvb2dsZW1haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHRzcDJfaW5pdCwKIAkubWFwX2lvCQk9IG9yaW9uNXhfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gb3Jpb241eF9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHMyMDktc2V0dXAuYwppbmRleCBjOTgzMTYxLi4zMWU1MWY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHMyMDktc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHMyMDktc2V0dXAuYwpAQCAtOCw3ICs4LDcgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxtYWNoL29yaW9uNXguaD4KQEAgLTMyMyw3ICszMjIsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRTMjA5LCAiUU5BUCBUUy0xMDkvVFMtMjA5IikKIAkvKiBNYWludGFpbmVyOiBCeXJvbiBCcmFkbGV5IDxieXJvbi5iYnJhZGxleUBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcW5hcF90czIwOV9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCmluZGV4IGNjMzNiMjIuLjBmYmNjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0zMTIsNyArMzExLDcgQEAKIAogTUFDSElORV9TVEFSVChUUzQwOSwgIlFOQVAgVFMtNDA5IikKIAkvKiBNYWludGFpbmVyOiAgU3lsdmVyIEJydW5lYXUgPHN5bHZlci5icnVuZWF1QGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBxbmFwX3RzNDA5X2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czc4eHgtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czc4eHgtc2V0dXAuYwppbmRleCA2YjdiNTQxLi5iMzVlMjAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM3OHh4LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNzh4eC1zZXR1cC5jCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJLnBhcnRpdGlvbnMJCT0gdHM3OHh4X3RzX25hbmRfcGFydHMsCiAJCS5ucl9wYXJ0aXRpb25zCQk9IEFSUkFZX1NJWkUodHM3OHh4X3RzX25hbmRfcGFydHMpLAogCQkuY2hpcF9kZWxheQkJPSAxNSwKLQkJLm9wdGlvbnMJCT0gTkFORF9VU0VfRkxBU0hfQkJULAorCQkuYmJ0X29wdGlvbnMJCT0gTkFORF9CQlRfVVNFX0ZMQVNILAogCX0sCiAJLmN0cmwJPSB7CiAJCS8qCkBAIC02MjEsNyArNjIxLDcgQEAKIAogTUFDSElORV9TVEFSVChUUzc4WFgsICJUZWNobm9sb2dpYyBTeXN0ZW1zIFRTLTc4eHggU0JDIikKIAkvKiBNYWludGFpbmVyOiBBbGV4YW5kZXIgQ2xvdXRlciA8YWxleEBkaWdyaXoub3JnLnVrPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHRzNzh4eF9pbml0LAogCS5tYXBfaW8JCT0gdHM3OHh4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCmluZGV4IDI2NTM1OTUuLmI4YmU3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8bWFjaC9vcmlvbjV4Lmg+CkBAIC0xNzMsNyArMTcyLDcgQEAKIAogTUFDSElORV9TVEFSVChXTlI4NTRULCAiTmV0Z2VhciBXTlI4NTRUIikKIAkvKiBNYWludGFpbmVyOiBJbXJlIEthbG96IDxrYWxvekBvcGVud3J0Lm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSB3bnI4NTR0X2luaXQsCiAJLm1hcF9pbwkJPSBvcmlvbjV4X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9yaW9uNXhfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCmluZGV4IDI1MWVmMTUuLmZhZjgxYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPG1hY2gvb3Jpb241eC5oPgpAQCAtMjYxLDcgKzI2MCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoV1JUMzUwTl9WMiwgIkxpbmtzeXMgV1JUMzUwTiB2MiIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gd3J0MzUwbl92Ml9pbml0LAogCS5tYXBfaW8JCT0gb3Jpb241eF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvcmlvbjV4X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTBiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai15CTo9IGNvbW1vbi5vCitvYmoteQkrPSB0aW1lLm8KK29iai15CSs9IGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZS5ib290Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjcxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEgQEAKK3pyZWxhZGRyLXkgOj0gMHgwMDAwODAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQwODM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbGwgZW5xdWlyaWVzIHRvIHN1cHBvcnRAcGljb2NoaXAuY29tCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS92aWMuaD4KKworI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9waWNveGNlbGxfc29jLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHZvaWQgX19pbml0IHBpY294Y2VsbF9pbml0X21hY2hpbmUodm9pZCkKK3sKKwlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShOVUxMLCBvZl9kZWZhdWx0X2J1c19tYXRjaF90YWJsZSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwaWNveGNlbGxfZHRfbWF0Y2hbXSA9IHsKKwkicGljb2NoaXAscGMzeDIiLAorCSJwaWNvY2hpcCxwYzN4MyIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmljX29mX21hdGNoW10gX19pbml0Y29uc3QgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhcm0scGwxOTItdmljIiB9LAorCXsgLyogU2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHBpY294Y2VsbF9pbml0X2lycSh2b2lkKQoreworCXZpY19pbml0KElPX0FERFJFU1MoUElDT1hDRUxMX1ZJQzBfQkFTRSksIDAsIH4wLCAwKTsKKwl2aWNfaW5pdChJT19BRERSRVNTKFBJQ09YQ0VMTF9WSUMxX0JBU0UpLCAzMiwgfjAsIDApOworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKHZpY19vZl9tYXRjaCwgUElDT1hDRUxMX1ZJQzBfQkFTRSwgMCk7CisJaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUodmljX29mX21hdGNoLCBQSUNPWENFTExfVklDMV9CQVNFLCAzMik7Cit9CisKK0RUX01BQ0hJTkVfU1RBUlQoUElDT1hDRUxMLCAiUGljb2NoaXAgcGljb1hjZWxsIikKKwkubWFwX2lvCQk9IHBpY294Y2VsbF9tYXBfaW8sCisJLm5yX2lycXMJPSBBUkNIX05SX0lSUVMsCisJLmluaXRfaXJxCT0gcGljb3hjZWxsX2luaXRfaXJxLAorCS50aW1lcgkJPSAmcGljb3hjZWxsX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBwaWNveGNlbGxfaW5pdF9tYWNoaW5lLAorCS5kdF9jb21wYXQJPSBwaWNveGNlbGxfZHRfbWF0Y2gsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjYzZjBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvY29tbW9uLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbGwgZW5xdWlyaWVzIHRvIHN1cHBvcnRAcGljb2NoaXAuY29tCisgKi8KKyNpZm5kZWYgX19QSUNPWENFTExfQ09NTU9OX0hfXworI2RlZmluZSBfX1BJQ09YQ0VMTF9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHBpY294Y2VsbF90aW1lcjsKK2V4dGVybiB2b2lkIHBpY294Y2VsbF9tYXBfaW8odm9pZCk7CisKKyNlbmRpZiAvKiBfX1BJQ09YQ0VMTF9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDRlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERlcml2ZWQgZnJvbSBhcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgdG8gdXNlIDMyLWJpdAorICogYWNjZXNzZXMgdG8gdGhlIDgyNTAuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNkZWZpbmUgVUFSVF9TSElGVCAyCisKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAorCQlsZHIJXHJ2LCA9UEhZU19UT19JTyhQSUNPWENFTExfVUFSVDFfQkFTRSkKKwkJbGRyCVxycCwgPVBJQ09YQ0VMTF9VQVJUMV9CQVNFCisJCS5lbmRtCisKKwkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4CisJCXN0cglccmQsIFtccngsICNVQVJUX1RYIDw8IFVBUlRfU0hJRlRdCisJCS5lbmRtCisKKwkJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4CisxMDAyOgkJbGRyCVxyZCwgW1xyeCwgI1VBUlRfTFNSIDw8IFVBUlRfU0hJRlRdCisJCWFuZAlccmQsIFxyZCwgI1VBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFCisJCXRlcQlccmQsICNVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfVEhSRQorCQlibmUJMTAwMmIKKwkJLmVuZG0KKworCQkvKiBUaGUgVUFSVCdzIGRvbid0IGhhdmUgYW55IGZsb3cgY29udHJvbCBJTydzIHdpcmVkIHVwLiAqLworCQkubWFjcm8Jd2FpdHVhcnQscmQscngKKwkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMDlmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBlbnRyeS1tYWNyby5TCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBMb3ctbGV2ZWwgSVJRIGhlbHBlciBtYWNyb3MgZm9yIHBpY29YY2VsbCBwbGF0Zm9ybXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorCisjZGVmaW5lIFZBX1ZJQzAJCUlPX0FERFJFU1MoUElDT1hDRUxMX1ZJQzBfQkFTRSkKKyNkZWZpbmUgVkFfVklDMQkJSU9fQUREUkVTUyhQSUNPWENFTExfVklDMV9CQVNFKQorCisjaW5jbHVkZSA8YXNtL2VudHJ5LW1hY3JvLXZpYzIuUz4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvZ3Bpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaApjb3B5IHRvIGFyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9ncGlvLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmZjU4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgZGVmaW5pdGlvbnMgb2YgdGhlIHBpY29YY2VsbCBTb0MgZGV2aWNlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorCisjaW5jbHVkZSA8bWFjaC9waWNveGNlbGxfc29jLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTczZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lPX0gKKyNkZWZpbmUgX19BU01fQVJNX0FSQ0hfSU9fSAorCisvKiBObyBpb3BvcnRzLCBidXQgbmVlZGVkIGZvciBkcml2ZXIgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgX19pbyhhKQkJCV9fdHlwZXNhZmVfaW8oYSkKKy8qIE5vIFBDSSBwb3NzaWJsZSBvbiBwaWNveGNlbGwuICovCisjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCisKKyNlbmRpZiAvKiBfX0FTTV9BUk1fQVJDSF9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDEzZWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBvZiB0aGUgcGljb1hjZWxsIFNvQyBkZXZpY2VzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX01BQ0hfSVJRU19ICisjZGVmaW5lIF9fTUFDSF9JUlFTX0gKKworI2RlZmluZSBBUkNIX05SX0lSUVMJCQk2NAorI2RlZmluZSBOUl9JUlFTCQkJCSgxMjggKyBBUkNIX05SX0lSUVMpCisKKyNkZWZpbmUgSVJRX1ZJQzBfQkFTRQkJCTAKKyNkZWZpbmUgSVJRX1ZJQzFfQkFTRQkJCTMyCisKKyNlbmRpZiAvKiBfX01BQ0hfSVJRU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2YWZhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19QSUNPWENFTExfTUFQX0hfXworI2RlZmluZSBfX1BJQ09YQ0VMTF9NQVBfSF9fCisKKyNkZWZpbmUgUEhZU19UT19JTyh4KQkJKCgoeCkgJiAweDAwZmZmZmZmKSB8IDB4ZmUwMDAwMDApCisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgSU9fQUREUkVTUyh4KQkJUEhZU19UT19JTygoeCkpCisjZWxzZQorI2RlZmluZSBJT19BRERSRVNTKHgpCQkodm9pZCBfX2lvbWVtIF9fZm9yY2UgKikoUEhZU19UT19JTygoeCkpKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1BJQ09YQ0VMTF9NQVBfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL21lbW9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaApjb3B5IHRvIGFyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3BpY294Y2VsbF9zb2MuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9waWNveGNlbGxfc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2NmZjOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC9waWNveGNlbGxfc29jLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBvZiB0aGUgcGljb1hjZWxsIFNvQyBkZXZpY2VzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX1BJQ09YQ0VMTF9TT0NfSF9fCisjZGVmaW5lIF9fUElDT1hDRUxMX1NPQ19IX18KKworI2RlZmluZSBQSUNPWENFTExfVUFSVDFfQkFTRQkJMHg4MDIzMDAwMAorI2RlZmluZSBQSUNPWENFTExfUEVSSVBIX0JBU0UJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUElDT1hDRUxMX1BFUklQSF9MRU5HVEgJCVNaXzRNCisjZGVmaW5lIFBJQ09YQ0VMTF9WSUMwX0JBU0UJCTB4ODAwNjAwMDAKKyNkZWZpbmUgUElDT1hDRUxMX1ZJQzFfQkFTRQkJMHg4MDA2NDAwMAorCisjZW5kaWYgLyogX19QSUNPWENFTExfU09DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3N5c3RlbS5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzU4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBpY294Y2VsbC9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKKyNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCit7CisJLyoKKwkgKiBUaGlzIHNob3VsZCBkbyBhbGwgdGhlIGNsb2NrIHN3aXRjaGluZyBhbmQgd2FpdCBmb3IgaW50ZXJydXB0CisJICogdHJpY2tzLgorCSAqLworCWNwdV9kb19pZGxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGludCBtb2RlLCBjb25zdCBjaGFyICpjbWQpCit7CisJLyogV2F0Y2hkb2cgcmVzZXQgdG8gZ28gaGVyZS4gKi8KK30KKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC90aW1leC5oIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NDBhNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX1RJTUVYX0hfXworI2RlZmluZSBfX1RJTUVYX0hfXworCisvKiBCb2d1cyB2YWx1ZSB0byBhbGxvdyB0aGUga2VybmVsIHRvIGNvbXBpbGUuICovCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJMTAwMDAwMAorCisjZW5kaWYgLyogX19USU1FWF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwYjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjZGVmaW5lIHB1dGMoYykKKyNkZWZpbmUgZmx1c2goKQorI2RlZmluZSBhcmNoX2RlY29tcF9zZXR1cCgpCisjZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaCBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxNmNjNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjZGVmaW5lIFZNQUxMT0NfRU5ECTB4ZmUwMDAwMDBVTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvaW8uYyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllOWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL2lvLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQaWNvY2hpcCBMdGQuLCBKYW1pZSBJbGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbGwgZW5xdWlyaWVzIHRvIHN1cHBvcnRAcGljb2NoaXAuY29tCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3BpY294Y2VsbF9zb2MuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCit2b2lkIF9faW5pdCBwaWNveGNlbGxfbWFwX2lvKHZvaWQpCit7CisJc3RydWN0IG1hcF9kZXNjIGlvX21hcCA9IHsKKwkJLnZpcnR1YWwJPSBQSFlTX1RPX0lPKFBJQ09YQ0VMTF9QRVJJUEhfQkFTRSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQSUNPWENFTExfUEVSSVBIX0JBU0UpLAorCQkubGVuZ3RoCQk9IFBJQ09YQ0VMTF9QRVJJUEhfTEVOR1RILAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfTsKKworCWlvdGFibGVfaW5pdCgmaW9fbWFwLCAxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtcGljb3hjZWxsL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE1NTRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1waWNveGNlbGwvdGltZS5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsbCBlbnF1aXJpZXMgdG8gc3VwcG9ydEBwaWNvY2hpcC5jb20KKyAqLworI2luY2x1ZGUgPGxpbnV4L2R3X2FwYl90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3NjaGVkX2Nsb2NrLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworc3RhdGljIHZvaWQgdGltZXJfZ2V0X2Jhc2VfYW5kX3JhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgdm9pZCBfX2lvbWVtICoqYmFzZSwgdTMyICpyYXRlKQoreworCSpiYXNlID0gb2ZfaW9tYXAobnAsIDApOworCisJaWYgKCEqYmFzZSkKKwkJcGFuaWMoIlVuYWJsZSB0byBtYXAgcmVncyBmb3IgJXMiLCBucC0+bmFtZSk7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxIiwgcmF0ZSkpCisJCXBhbmljKCJObyBjbG9jay1mcmVxIHByb3BlcnR5IGZvciAlcyIsIG5wLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgcGljb3hjZWxsX2FkZF9jbG9ja2V2ZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZXZlbnRfdGltZXIpCit7CisJdm9pZCBfX2lvbWVtICppb2Jhc2U7CisJc3RydWN0IGR3X2FwYl9jbG9ja19ldmVudF9kZXZpY2UgKmNlZDsKKwl1MzIgaXJxLCByYXRlOworCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZXZlbnRfdGltZXIsIDApOworCWlmIChpcnEgPT0gTk9fSVJRKQorCQlwYW5pYygiTm8gSVJRIGZvciBjbG9jayBldmVudCB0aW1lciIpOworCisJdGltZXJfZ2V0X2Jhc2VfYW5kX3JhdGUoZXZlbnRfdGltZXIsICZpb2Jhc2UsICZyYXRlKTsKKworCWNlZCA9IGR3X2FwYl9jbG9ja2V2ZW50X2luaXQoMCwgZXZlbnRfdGltZXItPm5hbWUsIDMwMCwgaW9iYXNlLCBpcnEsCisJCQkJICAgICByYXRlKTsKKwlpZiAoIWNlZCkKKwkJcGFuaWMoIlVuYWJsZSB0byBpbml0aWFsaXNlIGNsb2NrZXZlbnQgZGV2aWNlIik7CisKKwlkd19hcGJfY2xvY2tldmVudF9yZWdpc3RlcihjZWQpOworfQorCitzdGF0aWMgdm9pZCBwaWNveGNlbGxfYWRkX2Nsb2Nrc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqc291cmNlX3RpbWVyKQoreworCXZvaWQgX19pb21lbSAqaW9iYXNlOworCXN0cnVjdCBkd19hcGJfY2xvY2tzb3VyY2UgKmNzOworCXUzMiByYXRlOworCisJdGltZXJfZ2V0X2Jhc2VfYW5kX3JhdGUoc291cmNlX3RpbWVyLCAmaW9iYXNlLCAmcmF0ZSk7CisKKwljcyA9IGR3X2FwYl9jbG9ja3NvdXJjZV9pbml0KDMwMCwgc291cmNlX3RpbWVyLT5uYW1lLCBpb2Jhc2UsIHJhdGUpOworCWlmICghY3MpCisJCXBhbmljKCJVbmFibGUgdG8gaW5pdGlhbGlzZSBjbG9ja3NvdXJjZSBkZXZpY2UiKTsKKworCWR3X2FwYl9jbG9ja3NvdXJjZV9zdGFydChjcyk7CisJZHdfYXBiX2Nsb2Nrc291cmNlX3JlZ2lzdGVyKGNzKTsKK30KKworc3RhdGljIERFRklORV9DTE9DS19EQVRBKGNkKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjaGVkX2lvX2Jhc2U7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBub3RyYWNlIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJY3ljbGVfdCBjeWMgPSBzY2hlZF9pb19iYXNlID8gX19yYXdfcmVhZGwoc2NoZWRfaW9fYmFzZSkgOiAwOworCisJcmV0dXJuIGN5Y190b19zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCk7Cit9CisKK3N0YXRpYyB2b2lkIG5vdHJhY2UgcGljb3hjZWxsX3VwZGF0ZV9zY2hlZF9jbG9jayh2b2lkKQoreworCWN5Y2xlX3QgY3ljID0gc2NoZWRfaW9fYmFzZSA/IF9fcmF3X3JlYWRsKHNjaGVkX2lvX2Jhc2UpIDogMDsKKworCXVwZGF0ZV9zY2hlZF9jbG9jaygmY2QsIGN5YywgKHUzMil+MCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBpY294Y2VsbF9ydGNfaWRzW10gX19pbml0Y29uc3QgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxwYzN4Mi1ydGMiIH0sCisJeyAvKiBTZW50aW5lbCAqLyB9LAorfTsKKworc3RhdGljIHZvaWQgcGljb3hjZWxsX2luaXRfc2NoZWRfY2xvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNjaGVkX3RpbWVyOworCXUzMiByYXRlOworCisJc2NoZWRfdGltZXIgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgcGljb3hjZWxsX3J0Y19pZHMpOworCWlmICghc2NoZWRfdGltZXIpCisJCXBhbmljKCJObyBSVEMgZm9yIHNjaGVkIGNsb2NrIHRvIHVzZSIpOworCisJdGltZXJfZ2V0X2Jhc2VfYW5kX3JhdGUoc2NoZWRfdGltZXIsICZzY2hlZF9pb19iYXNlLCAmcmF0ZSk7CisJb2Zfbm9kZV9wdXQoc2NoZWRfdGltZXIpOworCisJaW5pdF9zY2hlZF9jbG9jaygmY2QsIHBpY294Y2VsbF91cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCByYXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGljb3hjZWxsX3RpbWVyX2lkc1tdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAicGljb2NoaXAscGMzeDItdGltZXIiIH0sCisJe30sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcGljb3hjZWxsX3RpbWVyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmV2ZW50X3RpbWVyLCAqc291cmNlX3RpbWVyOworCisJZXZlbnRfdGltZXIgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgcGljb3hjZWxsX3RpbWVyX2lkcyk7CisJaWYgKCFldmVudF90aW1lcikKKwkJcGFuaWMoIk5vIHRpbWVyIGZvciBjbG9ja2V2ZW50Iik7CisJcGljb3hjZWxsX2FkZF9jbG9ja2V2ZW50KGV2ZW50X3RpbWVyKTsKKworCXNvdXJjZV90aW1lciA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShldmVudF90aW1lciwgcGljb3hjZWxsX3RpbWVyX2lkcyk7CisJaWYgKCFzb3VyY2VfdGltZXIpCisJCXBhbmljKCJObyB0aW1lciBmb3IgY2xvY2tzb3VyY2UiKTsKKwlwaWNveGNlbGxfYWRkX2Nsb2Nrc291cmNlKHNvdXJjZV90aW1lcik7CisKKwlvZl9ub2RlX3B1dChzb3VyY2VfdGltZXIpOworCisJcGljb3hjZWxsX2luaXRfc2NoZWRfY2xvY2soKTsKK30KKworc3RydWN0IHN5c190aW1lciBwaWNveGNlbGxfdGltZXIgPSB7CisJLmluaXQgPSBwaWNveGNlbGxfdGltZXJfaW5pdCwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYwppbmRleCA2MzM5OTc1NS4uY2RiOTVlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAogTUFDSElORV9TVEFSVChQTlg0MDA4LCAiUGhpbGlwcyBQTlg0MDA4IikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJCT0gMHg4MDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJCT0gMHgxMDAsCiAJLm1hcF9pbyAJCT0gcG54NDAwOF9tYXBfaW8sCiAJLmluaXRfaXJxIAkJPSBwbng0MDA4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUgCQk9IHBueDQwMDhfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCmluZGV4IGYyMTk5MTQuLmQzZTcxZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYwpAQCAtMTMsMTQgKzEzLDEzIEBACiAgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKICAqIG9yIGltcGxpZWQuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1wbng0MDA4Lmg+CiAKIC8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFBJT19WQV9CQVNFCUlPX0FERFJFU1MoUE5YNDAwOF9QSU9fQkFTRSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA5MzFhZmViLi40NjlkNjBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweDAwMDkwMDAwCiAJCWFkZAlccnYsIFxycCwgIzB4ZjQwMDAwMDAJQCB2aXJ0dWFsCiAJCWFkZAlccnAsIFxycCwgIzB4NDAwMDAwMDAJQCBwaHlzaWNhbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLXBueDQwMDguaCBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZ3Bpby1wbng0MDA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvZ3Bpby1wbng0MDA4LmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2dwaW8tcG54NDAwOC5oCisgKgorICogUE5YNDAwOCBHUElPIGRyaXZlciAtIGhlYWRlciBmaWxlCisgKgorICogQXV0aG9yOiBEbWl0cnkgQ2hpZ2lyZXYgPHNvdXJjZUBtdmlzdGEuY29tPgorICoKKyAqIEJhc2VkIG9uIHJlZmVyZW5jZSBjb2RlIGJ5IEl3byBNZXJnbGVyIGFuZCBaLlRhYmFhbG91dGUgZnJvbSBQaGlsaXBzOgorICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbmlua2xpamtlIFBoaWxpcHMgRWxlY3Ryb25pY3MgTi5WLgorICoKKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfUE5YNDAwOF9HUElPX0hfCisjZGVmaW5lIF9QTlg0MDA4X0dQSU9fSF8KKworCisvKiBCbG9jayBudW1iZXJzICovCisjZGVmaW5lIEdQSU9fSU4JCSgwKQorI2RlZmluZSBHUElPX09VVAkJKDB4MTAwKQorI2RlZmluZSBHUElPX0JJRAkJKDB4MjAwKQorI2RlZmluZSBHUElPX1JBTQkJKDB4MzAwKQorI2RlZmluZSBHUElPX01VWAkJKDB4NDAwKQorCisjZGVmaW5lIEdQSU9fVFlQRV9NQVNLKEspICgoSykgJiAweDcwMCkKKworLyogSU5QVVQgR1BJT3MgKi8KKy8qIEdQSSAqLworI2RlZmluZSBHUElfMDAJCShHUElPX0lOIHwgMCkKKyNkZWZpbmUgR1BJXzAxCQkoR1BJT19JTiB8IDEpCisjZGVmaW5lIEdQSV8wMiAgIAkoR1BJT19JTiB8IDIpCisjZGVmaW5lIEdQSV8wMyAJIAkoR1BJT19JTiB8IDMpCisjZGVmaW5lIEdQSV8wNCAgIAkoR1BJT19JTiB8IDQpCisjZGVmaW5lIEdQSV8wNSAgIAkoR1BJT19JTiB8IDUpCisjZGVmaW5lIEdQSV8wNiAgIAkoR1BJT19JTiB8IDYpCisjZGVmaW5lIEdQSV8wNyAgIAkoR1BJT19JTiB8IDcpCisjZGVmaW5lIEdQSV8wOCAgIAkoR1BJT19JTiB8IDgpCisjZGVmaW5lIEdQSV8wOSAgIAkoR1BJT19JTiB8IDkpCisjZGVmaW5lIFUxX1JYIAkJKEdQSU9fSU4gfCAxNSkKKyNkZWZpbmUgVTJfSFRDUyAJKEdQSU9fSU4gfCAxNikKKyNkZWZpbmUgVTJfUlgJIAkoR1BJT19JTiB8IDE3KQorI2RlZmluZSBVM19SWAkJKEdQSU9fSU4gfCAxOCkKKyNkZWZpbmUgVTRfUlgJCShHUElPX0lOIHwgMTkpCisjZGVmaW5lIFU1X1JYCQkoR1BJT19JTiB8IDIwKQorI2RlZmluZSBVNl9JUlJYIAkoR1BJT19JTiB8IDIxKQorI2RlZmluZSBVN19IQ1RTIAkoR1BJT19JTiB8IDIyKQorI2RlZmluZSBVN19SWAkJKEdQSU9fSU4gfCAyMykKKy8qIE1JU0MgSU4gKi8KKyNkZWZpbmUgU1BJMV9EQVRJTgkoR1BJT19JTiB8IDI1KQorI2RlZmluZSBESVNQX1NZTkMJKEdQSU9fSU4gfCAyNikKKyNkZWZpbmUgU1BJMl9EQVRJTgkoR1BJT19JTiB8IDI3KQorI2RlZmluZSBHUElfMTEgIAkoR1BJT19JTiB8IDI4KQorCisjZGVmaW5lIEdQSU9fSU5fTUFTSyAgIDB4MWVmZjgzZmYKKworLyogT1VUUFVUIEdQSU9zICovCisvKiBHUE8gKi8KKyNkZWZpbmUgR1BPXzAwCQkoR1BJT19PVVQgfCAwKQorI2RlZmluZSBHUE9fMDEgICAJKEdQSU9fT1VUIHwgMSkKKyNkZWZpbmUgR1BPXzAyICAgCShHUElPX09VVCB8IDIpCisjZGVmaW5lIEdQT18wMyAJIAkoR1BJT19PVVQgfCAzKQorI2RlZmluZSBHUE9fMDQgICAJKEdQSU9fT1VUIHwgNCkKKyNkZWZpbmUgR1BPXzA1ICAgCShHUElPX09VVCB8IDUpCisjZGVmaW5lIEdQT18wNiAgIAkoR1BJT19PVVQgfCA2KQorI2RlZmluZSBHUE9fMDcgICAJKEdQSU9fT1VUIHwgNykKKyNkZWZpbmUgR1BPXzA4CQkoR1BJT19PVVQgfCA4KQorI2RlZmluZSBHUE9fMDkgICAJKEdQSU9fT1VUIHwgOSkKKyNkZWZpbmUgR1BPXzEwICAgCShHUElPX09VVCB8IDEwKQorI2RlZmluZSBHUE9fMTEgCSAJKEdQSU9fT1VUIHwgMTEpCisjZGVmaW5lIEdQT18xMiAgIAkoR1BJT19PVVQgfCAxMikKKyNkZWZpbmUgR1BPXzEzICAgCShHUElPX09VVCB8IDEzKQorI2RlZmluZSBHUE9fMTQgICAJKEdQSU9fT1VUIHwgMTQpCisjZGVmaW5lIEdQT18xNSAgIAkoR1BJT19PVVQgfCAxNSkKKyNkZWZpbmUgR1BPXzE2ICAJKEdQSU9fT1VUIHwgMTYpCisjZGVmaW5lIEdQT18xNyAJIAkoR1BJT19PVVQgfCAxNykKKyNkZWZpbmUgR1BPXzE4ICAgCShHUElPX09VVCB8IDE4KQorI2RlZmluZSBHUE9fMTkgICAJKEdQSU9fT1VUIHwgMTkpCisjZGVmaW5lIEdQT18yMCAgIAkoR1BJT19PVVQgfCAyMCkKKyNkZWZpbmUgR1BPXzIxICAgCShHUElPX09VVCB8IDIxKQorI2RlZmluZSBHUE9fMjIgICAJKEdQSU9fT1VUIHwgMjIpCisjZGVmaW5lIEdQT18yMyAgIAkoR1BJT19PVVQgfCAyMykKKworI2RlZmluZSBHUElPX09VVF9NQVNLICAgMHhmZmZmZmYKKworLyogQklESVJFQ1RJT05BTCBHUElPcyAqLworLyogUkFNIHBpbnMgKi8KKyNkZWZpbmUgUkFNX0QxOQkJKEdQSU9fUkFNIHwgMCkKKyNkZWZpbmUgUkFNX0QyMCAgCShHUElPX1JBTSB8IDEpCisjZGVmaW5lIFJBTV9EMjEgIAkoR1BJT19SQU0gfCAyKQorI2RlZmluZSBSQU1fRDIyIAkoR1BJT19SQU0gfCAzKQorI2RlZmluZSBSQU1fRDIzICAJKEdQSU9fUkFNIHwgNCkKKyNkZWZpbmUgUkFNX0QyNCAgCShHUElPX1JBTSB8IDUpCisjZGVmaW5lIFJBTV9EMjUgIAkoR1BJT19SQU0gfCA2KQorI2RlZmluZSBSQU1fRDI2ICAJKEdQSU9fUkFNIHwgNykKKyNkZWZpbmUgUkFNX0QyNwkJKEdQSU9fUkFNIHwgOCkKKyNkZWZpbmUgUkFNX0QyOCAgCShHUElPX1JBTSB8IDkpCisjZGVmaW5lIFJBTV9EMjkgIAkoR1BJT19SQU0gfCAxMCkKKyNkZWZpbmUgUkFNX0QzMCAJKEdQSU9fUkFNIHwgMTEpCisjZGVmaW5lIFJBTV9EMzEgIAkoR1BJT19SQU0gfCAxMikKKworI2RlZmluZSBHUElPX1JBTV9NQVNLICAgMHgxZmZmCisKKy8qIEkvTyBwaW5zICovCisjZGVmaW5lIEdQSU9fMDAgIAkoR1BJT19CSUQgfCAyNSkKKyNkZWZpbmUgR1BJT18wMSAJKEdQSU9fQklEIHwgMjYpCisjZGVmaW5lIEdQSU9fMDIgIAkoR1BJT19CSUQgfCAyNykKKyNkZWZpbmUgR1BJT18wMyAgCShHUElPX0JJRCB8IDI4KQorI2RlZmluZSBHUElPXzA0IAkoR1BJT19CSUQgfCAyOSkKKyNkZWZpbmUgR1BJT18wNSAgCShHUElPX0JJRCB8IDMwKQorCisjZGVmaW5lIEdQSU9fQklEX01BU0sgICAweDdlMDAwMDAwCisKKy8qIE5vbi1HUElPIG11bHRpcGxleGVkIFBJT3MuIEZvciBtdWx0aXBsZXhpbmcgd2l0aCBHUElPLCBwbGVhc2UgdXNlIEdQSU8gbWFjcm9zICovCisjZGVmaW5lIEdQSU9fU0RSQU1fU0VMIAkoR1BJT19NVVggfCAzKQorCisjZGVmaW5lIEdQSU9fTVVYX01BU0sgICAweDgKKworLyogRXh0cmFjdGlvbi9hc3NlbWJseSBtYWNyb3MgKi8KKyNkZWZpbmUgR1BJT19CSVRfTUFTSyhLKSAoKEspICYgMHgxRikKKyNkZWZpbmUgR1BJT19CSVQoSykgKDEgPDwgR1BJT19CSVRfTUFTSyhLKSkKKyNkZWZpbmUgR1BJT19JU01VWChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fTVVYKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX01VWF9NQVNLKSkKKyNkZWZpbmUgR1BJT19JU1JBTShLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fUkFNKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX1JBTV9NQVNLKSkKKyNkZWZpbmUgR1BJT19JU0JJRChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fQklEKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX0JJRF9NQVNLKSkKKyNkZWZpbmUgR1BJT19JU09VVChLKSAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fT1VUKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX09VVF9NQVNLKSkKKyNkZWZpbmUgR1BJT19JU0lOKEspICAoKEdQSU9fVFlQRV9NQVNLKEspID09IEdQSU9fSU4pICYmIChHUElPX0JJVChLKSAmIEdQSU9fSU5fTUFTSykpCisKKy8qIFN0YXJ0IEVuYWJsZSBQaW4gSW50ZXJydXB0cyAtIHRhYmxlIDU4IHBhZ2UgNjYgKi8KKworI2RlZmluZSBTRV9QSU5fQkFTRV9JTlQgICAzMgorCisjZGVmaW5lIFNFX1U3X1JYX0lOVCAgICAgICAgICAgIDYzCisjZGVmaW5lIFNFX1U3X0hDVFNfSU5UICAgICAgICAgIDYyCisjZGVmaW5lIFNFX0JUX0NMS1JFUV9JTlQgICAgICAgIDYxCisjZGVmaW5lIFNFX1U2X0lSUlhfSU5UICAgICAgICAgIDYwCisvKjU5IHVudXNlZCovCisjZGVmaW5lIFNFX1U1X1JYX0lOVCAgICAgICAgICAgIDU4CisjZGVmaW5lIFNFX0dQSV8xMV9JTlQgICAgICAgICAgIDU3CisjZGVmaW5lIFNFX1UzX1JYX0lOVCAgICAgICAgICAgIDU2CisjZGVmaW5lIFNFX1UyX0hDVFNfSU5UICAgICAgICAgIDU1CisjZGVmaW5lIFNFX1UyX1JYX0lOVCAgICAgICAgICAgIDU0CisjZGVmaW5lIFNFX1UxX1JYX0lOVCAgICAgICAgICAgIDUzCisjZGVmaW5lIFNFX0RJU1BfU1lOQ19JTlQgICAgICAgIDUyCisvKjUxIHVudXNlZCovCisjZGVmaW5lIFNFX1NESU9fSU5UX04gICAgICAgICAgIDUwCisjZGVmaW5lIFNFX01TRElPX1NUQVJUX0lOVCAgICAgIDQ5CisjZGVmaW5lIFNFX0dQSV8wNl9JTlQgICAgICAgICAgIDQ4CisjZGVmaW5lIFNFX0dQSV8wNV9JTlQgICAgICAgICAgIDQ3CisjZGVmaW5lIFNFX0dQSV8wNF9JTlQgICAgICAgICAgIDQ2CisjZGVmaW5lIFNFX0dQSV8wM19JTlQgICAgICAgICAgIDQ1CisjZGVmaW5lIFNFX0dQSV8wMl9JTlQgICAgICAgICAgIDQ0CisjZGVmaW5lIFNFX0dQSV8wMV9JTlQgICAgICAgICAgIDQzCisjZGVmaW5lIFNFX0dQSV8wMF9JTlQgICAgICAgICAgIDQyCisjZGVmaW5lIFNFX1NZU0NMS0VOX1BJTl9JTlQgICAgIDQxCisjZGVmaW5lIFNFX1NQSTFfREFUQUlOX0lOVCAgICAgIDQwCisjZGVmaW5lIFNFX0dQSV8wN19JTlQgICAgICAgICAgIDM5CisjZGVmaW5lIFNFX1NQSTJfREFUQUlOX0lOVCAgICAgIDM4CisjZGVmaW5lIFNFX0dQSV8xMF9JTlQgICAgICAgICAgIDM3CisjZGVmaW5lIFNFX0dQSV8wOV9JTlQgICAgICAgICAgIDM2CisjZGVmaW5lIFNFX0dQSV8wOF9JTlQgICAgICAgICAgIDM1CisvKjM0LTMyIHVudXNlZCovCisKKy8qIFN0YXJ0IEVuYWJsZSBJbnRlcm5hbCBJbnRlcnJ1cHRzIC0gdGFibGUgNTcgcGFnZSA2NSAqLworCisjZGVmaW5lIFNFX0lOVF9CQVNFX0lOVCAgIDAKKworI2RlZmluZSBTRV9UU19JUlEgICAgICAgICAgICAgICAzMQorI2RlZmluZSBTRV9UU19QX0lOVCAgICAgICAgICAgICAzMAorI2RlZmluZSBTRV9UU19BVVhfSU5UICAgICAgICAgICAyOQorLyoyNy0yOCB1bnVzZWQqLworI2RlZmluZSBTRV9VU0JfQUhCX05FRURfQ0xLX0lOVCAyNgorI2RlZmluZSBTRV9NU1RJTUVSX0lOVCAgICAgICAgICAyNQorI2RlZmluZSBTRV9SVENfSU5UICAgICAgICAgICAgICAyNAorI2RlZmluZSBTRV9VU0JfTkVFRF9DTEtfSU5UICAgICAyMworI2RlZmluZSBTRV9VU0JfSU5UICAgICAgICAgICAgICAyMgorI2RlZmluZSBTRV9VU0JfSTJDX0lOVCAgICAgICAgICAyMQorI2RlZmluZSBTRV9VU0JfT1RHX1RJTUVSX0lOVCAgICAyMAorI2RlZmluZSBTRV9VU0JfT1RHX0FUWF9JTlRfTiAgICAxOQorLyoxOCB1bnVzZWQqLworI2RlZmluZSBTRV9EU1BfR1BJTzRfSU5UICAgICAgICAxNworI2RlZmluZSBTRV9LRVlfSVJRICAgICAgICAgICAgICAxNgorI2RlZmluZSBTRV9EU1BfU0xBVkVQT1JUX0lOVCAgICAxNQorI2RlZmluZSBTRV9EU1BfR1BJTzFfSU5UICAgICAgICAxNAorI2RlZmluZSBTRV9EU1BfR1BJTzBfSU5UICAgICAgICAxMworI2RlZmluZSBTRV9EU1BfQUhCX0lOVCAgICAgICAgICAxMgorLyoxMS02IHVudXNlZCovCisjZGVmaW5lIFNFX0dQSU9fMDVfSU5UICAgICAgICAgIDUKKyNkZWZpbmUgU0VfR1BJT18wNF9JTlQgICAgICAgICAgNAorI2RlZmluZSBTRV9HUElPXzAzX0lOVCAgICAgICAgICAzCisjZGVmaW5lIFNFX0dQSU9fMDJfSU5UICAgICAgICAgIDIKKyNkZWZpbmUgU0VfR1BJT18wMV9JTlQgICAgICAgICAgMQorI2RlZmluZSBTRV9HUElPXzAwX0lOVCAgICAgICAgICAwCisKKyNkZWZpbmUgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSAoMTw8KChpcnEpJjB4MUYpKQorCisjZGVmaW5lIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSAgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MjAgKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQorI2RlZmluZSBTVEFSVF9JTlRfUlNSX1JFRyhpcnEpICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDI0ICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKKyNkZWZpbmUgU1RBUlRfSU5UX1NSX1JFRyhpcnEpICAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyOCArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCisjZGVmaW5lIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MkMgKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQorCitleHRlcm4gaW50IHBueDQwMDhfZ3Bpb19yZWdpc3Rlcl9waW4odW5zaWduZWQgc2hvcnQgcGluKTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3VucmVnaXN0ZXJfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwbng0MDA4X2dwaW9fcmVhZF9waW4odW5zaWduZWQgc2hvcnQgcGluKTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3dyaXRlX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4sIGludCBvdXRwdXQpOworZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fc2V0X3Bpbl9kaXJlY3Rpb24odW5zaWduZWQgc2hvcnQgcGluLCBpbnQgb3V0cHV0KTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3JlYWRfcGluX2RpcmVjdGlvbih1bnNpZ25lZCBzaG9ydCBwaW4pOworZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fc2V0X3Bpbl9tdXgodW5zaWduZWQgc2hvcnQgcGluLCBpbnQgb3V0cHV0KTsKK2V4dGVybiBpbnQgcG54NDAwOF9ncGlvX3JlYWRfcGluX211eCh1bnNpZ25lZCBzaG9ydCBwaW4pOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3VtYXNrKHU4IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0VSX1JFRyhpcnEpKSB8CisJCSAgICAgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0VSX1JFRyhpcnEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9tYXNrKHU4IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0VSX1JFRyhpcnEpKSAmCisJCSAgICAgflNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfYWNrKHU4IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX1JTUl9SRUcoaXJxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfc2V0X2ZhbGxpbmdfZWRnZSh1OCBpcnEpCit7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpICYKKwkJICAgICB+U1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfc2V0X3Jpc2luZ19lZGdlKHU4IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSkgfAorCQkgICAgIFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpOworfQorCisjZW5kaWYJCQkJLyogX1BOWDQwMDhfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MTQ2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9ncGlvLmgKLSAqCi0gKiBQTlg0MDA4IEdQSU8gZHJpdmVyIC0gaGVhZGVyIGZpbGUKLSAqCi0gKiBBdXRob3I6IERtaXRyeSBDaGlnaXJldiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogQmFzZWQgb24gcmVmZXJlbmNlIGNvZGUgYnkgSXdvIE1lcmdsZXIgYW5kIFouVGFiYWFsb3V0ZSBmcm9tIFBoaWxpcHM6Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgS29uaW5rbGlqa2UgUGhpbGlwcyBFbGVjdHJvbmljcyBOLlYuCi0gKgotICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KLSAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcwotICogb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9QTlg0MDA4X0dQSU9fSF8KLSNkZWZpbmUgX1BOWDQwMDhfR1BJT19IXwotCi0KLS8qIEJsb2NrIG51bWJlcnMgKi8KLSNkZWZpbmUgR1BJT19JTgkJKDApCi0jZGVmaW5lIEdQSU9fT1VUCQkoMHgxMDApCi0jZGVmaW5lIEdQSU9fQklECQkoMHgyMDApCi0jZGVmaW5lIEdQSU9fUkFNCQkoMHgzMDApCi0jZGVmaW5lIEdQSU9fTVVYCQkoMHg0MDApCi0KLSNkZWZpbmUgR1BJT19UWVBFX01BU0soSykgKChLKSAmIDB4NzAwKQotCi0vKiBJTlBVVCBHUElPcyAqLwotLyogR1BJICovCi0jZGVmaW5lIEdQSV8wMAkJKEdQSU9fSU4gfCAwKQotI2RlZmluZSBHUElfMDEJCShHUElPX0lOIHwgMSkKLSNkZWZpbmUgR1BJXzAyICAgCShHUElPX0lOIHwgMikKLSNkZWZpbmUgR1BJXzAzIAkgCShHUElPX0lOIHwgMykKLSNkZWZpbmUgR1BJXzA0ICAgCShHUElPX0lOIHwgNCkKLSNkZWZpbmUgR1BJXzA1ICAgCShHUElPX0lOIHwgNSkKLSNkZWZpbmUgR1BJXzA2ICAgCShHUElPX0lOIHwgNikKLSNkZWZpbmUgR1BJXzA3ICAgCShHUElPX0lOIHwgNykKLSNkZWZpbmUgR1BJXzA4ICAgCShHUElPX0lOIHwgOCkKLSNkZWZpbmUgR1BJXzA5ICAgCShHUElPX0lOIHwgOSkKLSNkZWZpbmUgVTFfUlggCQkoR1BJT19JTiB8IDE1KQotI2RlZmluZSBVMl9IVENTIAkoR1BJT19JTiB8IDE2KQotI2RlZmluZSBVMl9SWAkgCShHUElPX0lOIHwgMTcpCi0jZGVmaW5lIFUzX1JYCQkoR1BJT19JTiB8IDE4KQotI2RlZmluZSBVNF9SWAkJKEdQSU9fSU4gfCAxOSkKLSNkZWZpbmUgVTVfUlgJCShHUElPX0lOIHwgMjApCi0jZGVmaW5lIFU2X0lSUlggCShHUElPX0lOIHwgMjEpCi0jZGVmaW5lIFU3X0hDVFMgCShHUElPX0lOIHwgMjIpCi0jZGVmaW5lIFU3X1JYCQkoR1BJT19JTiB8IDIzKQotLyogTUlTQyBJTiAqLwotI2RlZmluZSBTUEkxX0RBVElOCShHUElPX0lOIHwgMjUpCi0jZGVmaW5lIERJU1BfU1lOQwkoR1BJT19JTiB8IDI2KQotI2RlZmluZSBTUEkyX0RBVElOCShHUElPX0lOIHwgMjcpCi0jZGVmaW5lIEdQSV8xMSAgCShHUElPX0lOIHwgMjgpCi0KLSNkZWZpbmUgR1BJT19JTl9NQVNLICAgMHgxZWZmODNmZgotCi0vKiBPVVRQVVQgR1BJT3MgKi8KLS8qIEdQTyAqLwotI2RlZmluZSBHUE9fMDAJCShHUElPX09VVCB8IDApCi0jZGVmaW5lIEdQT18wMSAgIAkoR1BJT19PVVQgfCAxKQotI2RlZmluZSBHUE9fMDIgICAJKEdQSU9fT1VUIHwgMikKLSNkZWZpbmUgR1BPXzAzIAkgCShHUElPX09VVCB8IDMpCi0jZGVmaW5lIEdQT18wNCAgIAkoR1BJT19PVVQgfCA0KQotI2RlZmluZSBHUE9fMDUgICAJKEdQSU9fT1VUIHwgNSkKLSNkZWZpbmUgR1BPXzA2ICAgCShHUElPX09VVCB8IDYpCi0jZGVmaW5lIEdQT18wNyAgIAkoR1BJT19PVVQgfCA3KQotI2RlZmluZSBHUE9fMDgJCShHUElPX09VVCB8IDgpCi0jZGVmaW5lIEdQT18wOSAgIAkoR1BJT19PVVQgfCA5KQotI2RlZmluZSBHUE9fMTAgICAJKEdQSU9fT1VUIHwgMTApCi0jZGVmaW5lIEdQT18xMSAJIAkoR1BJT19PVVQgfCAxMSkKLSNkZWZpbmUgR1BPXzEyICAgCShHUElPX09VVCB8IDEyKQotI2RlZmluZSBHUE9fMTMgICAJKEdQSU9fT1VUIHwgMTMpCi0jZGVmaW5lIEdQT18xNCAgIAkoR1BJT19PVVQgfCAxNCkKLSNkZWZpbmUgR1BPXzE1ICAgCShHUElPX09VVCB8IDE1KQotI2RlZmluZSBHUE9fMTYgIAkoR1BJT19PVVQgfCAxNikKLSNkZWZpbmUgR1BPXzE3IAkgCShHUElPX09VVCB8IDE3KQotI2RlZmluZSBHUE9fMTggICAJKEdQSU9fT1VUIHwgMTgpCi0jZGVmaW5lIEdQT18xOSAgIAkoR1BJT19PVVQgfCAxOSkKLSNkZWZpbmUgR1BPXzIwICAgCShHUElPX09VVCB8IDIwKQotI2RlZmluZSBHUE9fMjEgICAJKEdQSU9fT1VUIHwgMjEpCi0jZGVmaW5lIEdQT18yMiAgIAkoR1BJT19PVVQgfCAyMikKLSNkZWZpbmUgR1BPXzIzICAgCShHUElPX09VVCB8IDIzKQotCi0jZGVmaW5lIEdQSU9fT1VUX01BU0sgICAweGZmZmZmZgotCi0vKiBCSURJUkVDVElPTkFMIEdQSU9zICovCi0vKiBSQU0gcGlucyAqLwotI2RlZmluZSBSQU1fRDE5CQkoR1BJT19SQU0gfCAwKQotI2RlZmluZSBSQU1fRDIwICAJKEdQSU9fUkFNIHwgMSkKLSNkZWZpbmUgUkFNX0QyMSAgCShHUElPX1JBTSB8IDIpCi0jZGVmaW5lIFJBTV9EMjIgCShHUElPX1JBTSB8IDMpCi0jZGVmaW5lIFJBTV9EMjMgIAkoR1BJT19SQU0gfCA0KQotI2RlZmluZSBSQU1fRDI0ICAJKEdQSU9fUkFNIHwgNSkKLSNkZWZpbmUgUkFNX0QyNSAgCShHUElPX1JBTSB8IDYpCi0jZGVmaW5lIFJBTV9EMjYgIAkoR1BJT19SQU0gfCA3KQotI2RlZmluZSBSQU1fRDI3CQkoR1BJT19SQU0gfCA4KQotI2RlZmluZSBSQU1fRDI4ICAJKEdQSU9fUkFNIHwgOSkKLSNkZWZpbmUgUkFNX0QyOSAgCShHUElPX1JBTSB8IDEwKQotI2RlZmluZSBSQU1fRDMwIAkoR1BJT19SQU0gfCAxMSkKLSNkZWZpbmUgUkFNX0QzMSAgCShHUElPX1JBTSB8IDEyKQotCi0jZGVmaW5lIEdQSU9fUkFNX01BU0sgICAweDFmZmYKLQotLyogSS9PIHBpbnMgKi8KLSNkZWZpbmUgR1BJT18wMCAgCShHUElPX0JJRCB8IDI1KQotI2RlZmluZSBHUElPXzAxIAkoR1BJT19CSUQgfCAyNikKLSNkZWZpbmUgR1BJT18wMiAgCShHUElPX0JJRCB8IDI3KQotI2RlZmluZSBHUElPXzAzICAJKEdQSU9fQklEIHwgMjgpCi0jZGVmaW5lIEdQSU9fMDQgCShHUElPX0JJRCB8IDI5KQotI2RlZmluZSBHUElPXzA1ICAJKEdQSU9fQklEIHwgMzApCi0KLSNkZWZpbmUgR1BJT19CSURfTUFTSyAgIDB4N2UwMDAwMDAKLQotLyogTm9uLUdQSU8gbXVsdGlwbGV4ZWQgUElPcy4gRm9yIG11bHRpcGxleGluZyB3aXRoIEdQSU8sIHBsZWFzZSB1c2UgR1BJTyBtYWNyb3MgKi8KLSNkZWZpbmUgR1BJT19TRFJBTV9TRUwgCShHUElPX01VWCB8IDMpCi0KLSNkZWZpbmUgR1BJT19NVVhfTUFTSyAgIDB4OAotCi0vKiBFeHRyYWN0aW9uL2Fzc2VtYmx5IG1hY3JvcyAqLwotI2RlZmluZSBHUElPX0JJVF9NQVNLKEspICgoSykgJiAweDFGKQotI2RlZmluZSBHUElPX0JJVChLKSAoMSA8PCBHUElPX0JJVF9NQVNLKEspKQotI2RlZmluZSBHUElPX0lTTVVYKEspICgoR1BJT19UWVBFX01BU0soSykgPT0gR1BJT19NVVgpICYmIChHUElPX0JJVChLKSAmIEdQSU9fTVVYX01BU0spKQotI2RlZmluZSBHUElPX0lTUkFNKEspICgoR1BJT19UWVBFX01BU0soSykgPT0gR1BJT19SQU0pICYmIChHUElPX0JJVChLKSAmIEdQSU9fUkFNX01BU0spKQotI2RlZmluZSBHUElPX0lTQklEKEspICgoR1BJT19UWVBFX01BU0soSykgPT0gR1BJT19CSUQpICYmIChHUElPX0JJVChLKSAmIEdQSU9fQklEX01BU0spKQotI2RlZmluZSBHUElPX0lTT1VUKEspICgoR1BJT19UWVBFX01BU0soSykgPT0gR1BJT19PVVQpICYmIChHUElPX0JJVChLKSAmIEdQSU9fT1VUX01BU0spKQotI2RlZmluZSBHUElPX0lTSU4oSykgICgoR1BJT19UWVBFX01BU0soSykgPT0gR1BJT19JTikgJiYgKEdQSU9fQklUKEspICYgR1BJT19JTl9NQVNLKSkKLQotLyogU3RhcnQgRW5hYmxlIFBpbiBJbnRlcnJ1cHRzIC0gdGFibGUgNTggcGFnZSA2NiAqLwotCi0jZGVmaW5lIFNFX1BJTl9CQVNFX0lOVCAgIDMyCi0KLSNkZWZpbmUgU0VfVTdfUlhfSU5UICAgICAgICAgICAgNjMKLSNkZWZpbmUgU0VfVTdfSENUU19JTlQgICAgICAgICAgNjIKLSNkZWZpbmUgU0VfQlRfQ0xLUkVRX0lOVCAgICAgICAgNjEKLSNkZWZpbmUgU0VfVTZfSVJSWF9JTlQgICAgICAgICAgNjAKLS8qNTkgdW51c2VkKi8KLSNkZWZpbmUgU0VfVTVfUlhfSU5UICAgICAgICAgICAgNTgKLSNkZWZpbmUgU0VfR1BJXzExX0lOVCAgICAgICAgICAgNTcKLSNkZWZpbmUgU0VfVTNfUlhfSU5UICAgICAgICAgICAgNTYKLSNkZWZpbmUgU0VfVTJfSENUU19JTlQgICAgICAgICAgNTUKLSNkZWZpbmUgU0VfVTJfUlhfSU5UICAgICAgICAgICAgNTQKLSNkZWZpbmUgU0VfVTFfUlhfSU5UICAgICAgICAgICAgNTMKLSNkZWZpbmUgU0VfRElTUF9TWU5DX0lOVCAgICAgICAgNTIKLS8qNTEgdW51c2VkKi8KLSNkZWZpbmUgU0VfU0RJT19JTlRfTiAgICAgICAgICAgNTAKLSNkZWZpbmUgU0VfTVNESU9fU1RBUlRfSU5UICAgICAgNDkKLSNkZWZpbmUgU0VfR1BJXzA2X0lOVCAgICAgICAgICAgNDgKLSNkZWZpbmUgU0VfR1BJXzA1X0lOVCAgICAgICAgICAgNDcKLSNkZWZpbmUgU0VfR1BJXzA0X0lOVCAgICAgICAgICAgNDYKLSNkZWZpbmUgU0VfR1BJXzAzX0lOVCAgICAgICAgICAgNDUKLSNkZWZpbmUgU0VfR1BJXzAyX0lOVCAgICAgICAgICAgNDQKLSNkZWZpbmUgU0VfR1BJXzAxX0lOVCAgICAgICAgICAgNDMKLSNkZWZpbmUgU0VfR1BJXzAwX0lOVCAgICAgICAgICAgNDIKLSNkZWZpbmUgU0VfU1lTQ0xLRU5fUElOX0lOVCAgICAgNDEKLSNkZWZpbmUgU0VfU1BJMV9EQVRBSU5fSU5UICAgICAgNDAKLSNkZWZpbmUgU0VfR1BJXzA3X0lOVCAgICAgICAgICAgMzkKLSNkZWZpbmUgU0VfU1BJMl9EQVRBSU5fSU5UICAgICAgMzgKLSNkZWZpbmUgU0VfR1BJXzEwX0lOVCAgICAgICAgICAgMzcKLSNkZWZpbmUgU0VfR1BJXzA5X0lOVCAgICAgICAgICAgMzYKLSNkZWZpbmUgU0VfR1BJXzA4X0lOVCAgICAgICAgICAgMzUKLS8qMzQtMzIgdW51c2VkKi8KLQotLyogU3RhcnQgRW5hYmxlIEludGVybmFsIEludGVycnVwdHMgLSB0YWJsZSA1NyBwYWdlIDY1ICovCi0KLSNkZWZpbmUgU0VfSU5UX0JBU0VfSU5UICAgMAotCi0jZGVmaW5lIFNFX1RTX0lSUSAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIFNFX1RTX1BfSU5UICAgICAgICAgICAgIDMwCi0jZGVmaW5lIFNFX1RTX0FVWF9JTlQgICAgICAgICAgIDI5Ci0vKjI3LTI4IHVudXNlZCovCi0jZGVmaW5lIFNFX1VTQl9BSEJfTkVFRF9DTEtfSU5UIDI2Ci0jZGVmaW5lIFNFX01TVElNRVJfSU5UICAgICAgICAgIDI1Ci0jZGVmaW5lIFNFX1JUQ19JTlQgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFNFX1VTQl9ORUVEX0NMS19JTlQgICAgIDIzCi0jZGVmaW5lIFNFX1VTQl9JTlQgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIFNFX1VTQl9JMkNfSU5UICAgICAgICAgIDIxCi0jZGVmaW5lIFNFX1VTQl9PVEdfVElNRVJfSU5UICAgIDIwCi0jZGVmaW5lIFNFX1VTQl9PVEdfQVRYX0lOVF9OICAgIDE5Ci0vKjE4IHVudXNlZCovCi0jZGVmaW5lIFNFX0RTUF9HUElPNF9JTlQgICAgICAgIDE3Ci0jZGVmaW5lIFNFX0tFWV9JUlEgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFNFX0RTUF9TTEFWRVBPUlRfSU5UICAgIDE1Ci0jZGVmaW5lIFNFX0RTUF9HUElPMV9JTlQgICAgICAgIDE0Ci0jZGVmaW5lIFNFX0RTUF9HUElPMF9JTlQgICAgICAgIDEzCi0jZGVmaW5lIFNFX0RTUF9BSEJfSU5UICAgICAgICAgIDEyCi0vKjExLTYgdW51c2VkKi8KLSNkZWZpbmUgU0VfR1BJT18wNV9JTlQgICAgICAgICAgNQotI2RlZmluZSBTRV9HUElPXzA0X0lOVCAgICAgICAgICA0Ci0jZGVmaW5lIFNFX0dQSU9fMDNfSU5UICAgICAgICAgIDMKLSNkZWZpbmUgU0VfR1BJT18wMl9JTlQgICAgICAgICAgMgotI2RlZmluZSBTRV9HUElPXzAxX0lOVCAgICAgICAgICAxCi0jZGVmaW5lIFNFX0dQSU9fMDBfSU5UICAgICAgICAgIDAKLQotI2RlZmluZSBTVEFSVF9JTlRfUkVHX0JJVChpcnEpICgxPDwoKGlycSkmMHgxRikpCi0KLSNkZWZpbmUgU1RBUlRfSU5UX0VSX1JFRyhpcnEpICAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyMCArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCi0jZGVmaW5lIFNUQVJUX0lOVF9SU1JfUkVHKGlycSkgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MjQgKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQotI2RlZmluZSBTVEFSVF9JTlRfU1JfUkVHKGlycSkgICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDI4ICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKLSNkZWZpbmUgU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyQyArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCi0KLWV4dGVybiBpbnQgcG54NDAwOF9ncGlvX3JlZ2lzdGVyX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4pOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fdW5yZWdpc3Rlcl9waW4odW5zaWduZWQgc2hvcnQgcGluKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBueDQwMDhfZ3Bpb19yZWFkX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4pOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fd3JpdGVfcGluKHVuc2lnbmVkIHNob3J0IHBpbiwgaW50IG91dHB1dCk7Ci1leHRlcm4gaW50IHBueDQwMDhfZ3Bpb19zZXRfcGluX2RpcmVjdGlvbih1bnNpZ25lZCBzaG9ydCBwaW4sIGludCBvdXRwdXQpOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fcmVhZF9waW5fZGlyZWN0aW9uKHVuc2lnbmVkIHNob3J0IHBpbik7Ci1leHRlcm4gaW50IHBueDQwMDhfZ3Bpb19zZXRfcGluX211eCh1bnNpZ25lZCBzaG9ydCBwaW4sIGludCBvdXRwdXQpOwotZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fcmVhZF9waW5fbXV4KHVuc2lnbmVkIHNob3J0IHBpbik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfdW1hc2sodTggaXJxKQotewotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfRVJfUkVHKGlycSkpIHwKLQkJICAgICBTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfRVJfUkVHKGlycSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X21hc2sodTggaXJxKQotewotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfRVJfUkVHKGlycSkpICYKLQkJICAgICB+U1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0VSX1JFRyhpcnEpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9hY2sodTggaXJxKQotewotCV9fcmF3X3dyaXRlbChTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfUlNSX1JFRyhpcnEpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9zZXRfZmFsbGluZ19lZGdlKHU4IGlycSkKLXsKLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSkgJgotCQkgICAgIH5TVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9zZXRfcmlzaW5nX2VkZ2UodTggaXJxKQotewotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKSB8Ci0JCSAgICAgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSk7Ci19Ci0KLSNlbmRpZgkJCQkvKiBfUE5YNDAwOF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3NWRiNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtcG54NDAwOC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgUGhpbGlwcyBTZW1pY29uZHVjdG9ycwotICogQ29weXJpZ2h0IChjKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDgwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYwppbmRleCBmNDA5NjFlLi4zNzRjMTM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3NlcmlhbC5jCkBAIC05LDcgKzksNiBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTE5LDggKzE4LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCisjaW5jbHVkZSA8bWFjaC9ncGlvLXBueDQwMDguaD4KICNpbmNsdWRlIDxtYWNoL2Nsb2NrLmg+CiAKICNkZWZpbmUgVUFSVF8zCQkwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL01ha2VmaWxlCmluZGV4IDdhZjdmYzAuLjEzZGQxNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL01ha2VmaWxlCkBAIC0zLDUgKzMsNyBAQAogb2JqLXkgKz0gY2xvY2subwogb2JqLXkgKz0gcnN0Yy5vCiBvYmoteSArPSBwcmltYTIubworb2JqLXkgKz0gcnRjaW9icmcubwogb2JqLSQoQ09ORklHX0RFQlVHX0xMKSArPSBsbHVhcnQubwogb2JqLSQoQ09ORklHX0NBQ0hFX0wyWDApICs9IGwyeDAubworb2JqLSQoQ09ORklHX1NVU1BFTkQpICs9IHBtLm8gc2xlZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2Nsb2NrLmMKaW5kZXggNjE1YTRlNy4uYWViYWQ3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9jbG9jay5jCkBAIC0zNTAsMTAgKzM1MCwxMCBAQAogCQkuY2xrID0gJmNsa19tZW0sCiAJfSwgewogCQkuZGV2X2lkID0gInN5cyIsCi0JCQkuY2xrID0gJmNsa19zeXMsCisJCS5jbGsgPSAmY2xrX3N5cywKIAl9LCB7CiAJCS5kZXZfaWQgPSAiaW8iLAotCQkJLmNsayA9ICZjbGtfaW8sCisJCS5jbGsgPSAmY2xrX2lvLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGJmNzUxMDYuLmNkOTc0OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3VhcnQuaD4KIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcglccnAsID1TSVJGU09DX1VBUlQxX1BBX0JBU0UJCUAgcGh5c2ljYWwKIAlsZHIJXHJ2LCA9U0lSRlNPQ19VQVJUMV9WQV9CQVNFCQlAIHZpcnR1YWwKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjZDVhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXByaW1hMi9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAg4oCTIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCi0gKgotICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUICAgICAgICBVTCgweDAwMDAwMDAwKQotCi0vKgotICogUmVzdHJpY3QgRE1BLWFibGUgcmVnaW9uIHRvIHdvcmthcm91bmQgc2lsaWNvbiBsaW1pdGF0aW9uLgotICogVGhlIGxpbWl0YXRpb24gcmVzdHJpY3RzIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBETUEgdG8gU0QvTU1DCi0gKiBoYXJkd2FyZSB0byBiZSBiZWxvdyAyNTZNQgotICovCi0jZGVmaW5lIEFSTV9ETUFfWk9ORV9TSVpFCShTWl8yNTZNKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvaXJxLmMKaW5kZXggN2FmMjU0ZC4uZDkzY2VlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvaXJxLmMKQEAgLTEzLDYgKzEzLDggQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogCiAjZGVmaW5lIFNJUkZTT0NfSU5UX1JJU0NfTUFTSzAgICAgICAgICAgMHgwMDE4CiAjZGVmaW5lIFNJUkZTT0NfSU5UX1JJU0NfTUFTSzEgICAgICAgICAgMHgwMDFDCkBAIC02Niw3ICs2OCw0OCBAQAogCWlmICghc2lyZnNvY19pbnRjX2Jhc2UpCiAJCXBhbmljKCJ1bmFibGUgdG8gbWFwIGludGMgY3B1IHJlZ2lzdGVyc1xuIik7CiAKKwlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIDApOworCiAJb2Zfbm9kZV9wdXQobnApOwogCiAJc2lyZnNvY19pcnFfaW5pdCgpOwogfQorCitzdHJ1Y3Qgc2lyZnNvY19pcnFfc3RhdHVzIHsKKwl1MzIgbWFzazA7CisJdTMyIG1hc2sxOworCXUzMiBsZXZlbDA7CisJdTMyIGxldmVsMTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2lyZnNvY19pcnFfc3RhdHVzIHNpcmZzb2NfaXJxX3N0OworCitzdGF0aWMgaW50IHNpcmZzb2NfaXJxX3N1c3BlbmQodm9pZCkKK3sKKwlzaXJmc29jX2lycV9zdC5tYXNrMCA9IHJlYWRsX3JlbGF4ZWQoc2lyZnNvY19pbnRjX2Jhc2UgKyBTSVJGU09DX0lOVF9SSVNDX01BU0swKTsKKwlzaXJmc29jX2lycV9zdC5tYXNrMSA9IHJlYWRsX3JlbGF4ZWQoc2lyZnNvY19pbnRjX2Jhc2UgKyBTSVJGU09DX0lOVF9SSVNDX01BU0sxKTsKKwlzaXJmc29jX2lycV9zdC5sZXZlbDAgPSByZWFkbF9yZWxheGVkKHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19MRVZFTDApOworCXNpcmZzb2NfaXJxX3N0LmxldmVsMSA9IHJlYWRsX3JlbGF4ZWQoc2lyZnNvY19pbnRjX2Jhc2UgKyBTSVJGU09DX0lOVF9SSVNDX0xFVkVMMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2lyZnNvY19pcnFfcmVzdW1lKHZvaWQpCit7CisJd3JpdGVsX3JlbGF4ZWQoc2lyZnNvY19pcnFfc3QubWFzazAsIHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19NQVNLMCk7CisJd3JpdGVsX3JlbGF4ZWQoc2lyZnNvY19pcnFfc3QubWFzazEsIHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19NQVNLMSk7CisJd3JpdGVsX3JlbGF4ZWQoc2lyZnNvY19pcnFfc3QubGV2ZWwwLCBzaXJmc29jX2ludGNfYmFzZSArIFNJUkZTT0NfSU5UX1JJU0NfTEVWRUwwKTsKKwl3cml0ZWxfcmVsYXhlZChzaXJmc29jX2lycV9zdC5sZXZlbDEsIHNpcmZzb2NfaW50Y19iYXNlICsgU0lSRlNPQ19JTlRfUklTQ19MRVZFTDEpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHNpcmZzb2NfaXJxX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kCT0gc2lyZnNvY19pcnFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNpcmZzb2NfaXJxX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpcmZzb2NfaXJxX3BtX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmc2lyZnNvY19pcnFfc3lzY29yZV9vcHMpOworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKHNpcmZzb2NfaXJxX3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvbDJ4MC5jIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvbDJ4MC5jCmluZGV4IDljZGEyMDUuLmM5OTgzNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL2wyeDAuYworKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9sMngwLmMKQEAgLTgsNTIgKzgsMjQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KLSNpbmNsdWRlIDxtYWNoL21lbW9yeS5oPgogCi0jZGVmaW5lIEwyWDBfQUREUl9GSUxURVJJTkdfU1RBUlQgICAgICAgMHhDMDAKLSNkZWZpbmUgTDJYMF9BRERSX0ZJTFRFUklOR19FTkQgICAgICAgICAweEMwNAotCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBsMnhfaWRzW10gID0gewotCXsgLmNvbXBhdGlibGUgPSAiYXJtLHBsMzEwLWNhY2hlIiB9LAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcHJpbWEyX2wyeDBfaWRzW10gID0geworCXsgLmNvbXBhdGlibGUgPSAic2lyZixwcmltYTItcGwzMTAtY2FjaGUiIH0sCisJe30sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX29mX2wyeF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX2wyeDBfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jdm9pZCBfX2lvbWVtICpzaXJmc29jX2wyeF9iYXNlOwogCi0JbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgbDJ4X2lkcyk7Ci0JaWYgKCFucCkKLQkJcGFuaWMoInVuYWJsZSB0byBmaW5kIGNvbXBhdGlibGUgbDJ4IG5vZGUgaW4gZHRiXG4iKTsKLQotCXNpcmZzb2NfbDJ4X2Jhc2UgPSBvZl9pb21hcChucCwgMCk7Ci0JaWYgKCFzaXJmc29jX2wyeF9iYXNlKQotCQlwYW5pYygidW5hYmxlIHRvIG1hcCBsMnggY3B1IHJlZ2lzdGVyc1xuIik7Ci0KLQlvZl9ub2RlX3B1dChucCk7Ci0KLQlpZiAoIShyZWFkbF9yZWxheGVkKHNpcmZzb2NfbDJ4X2Jhc2UgKyBMMlgwX0NUUkwpICYgMSkpIHsKLQkJLyoKLQkJICogc2V0IHRoZSBwaHlzaWNhbCBtZW1vcnkgd2luZG93cyBMMiBjYWNoZSB3aWxsIGNvdmVyCi0JCSAqLwotCQl3cml0ZWxfcmVsYXhlZChQTEFUX1BIWVNfT0ZGU0VUICsgMTAyNCAqIDEwMjQgKiAxMDI0LAotCQkJc2lyZnNvY19sMnhfYmFzZSArIEwyWDBfQUREUl9GSUxURVJJTkdfRU5EKTsKLQkJd3JpdGVsX3JlbGF4ZWQoUExBVF9QSFlTX09GRlNFVCB8IDB4MSwKLQkJCXNpcmZzb2NfbDJ4X2Jhc2UgKyBMMlgwX0FERFJfRklMVEVSSU5HX1NUQVJUKTsKLQotCQl3cml0ZWxfcmVsYXhlZCgwLAotCQkJc2lyZnNvY19sMnhfYmFzZSArIEwyWDBfVEFHX0xBVEVOQ1lfQ1RSTCk7Ci0JCXdyaXRlbF9yZWxheGVkKDAsCi0JCQlzaXJmc29jX2wyeF9iYXNlICsgTDJYMF9EQVRBX0xBVEVOQ1lfQ1RSTCk7CisJbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgcHJpbWEyX2wyeDBfaWRzKTsKKwlpZiAobnApIHsKKwkJcHJfaW5mbygiSW5pdGlhbGl6aW5nIHByaW1hMiBMMiBjYWNoZVxuIik7CisJCXJldHVybiBsMngwX29mX2luaXQoMHg0MDAwMCwgMCk7CiAJfQotCWwyeDBfaW5pdCgodm9pZCBfX2lvbWVtICopc2lyZnNvY19sMnhfYmFzZSwgMHgwMDA0MDAwMCwKLQkJMHgwMDAwMDAwMCk7CiAKIAlyZXR1cm4gMDsKIH0KLWVhcmx5X2luaXRjYWxsKHNpcmZzb2Nfb2ZfbDJ4X2luaXQpOworZWFybHlfaW5pdGNhbGwoc2lyZnNvY19sMngwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MzE2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3BtLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBwb3dlciBtYW5hZ2VtZW50IGVudHJ5IGZvciBDU1IgU2lSRnByaW1hSUkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy9zaXJmc29jX3J0Y2lvYnJnLmg+CisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorCisjaW5jbHVkZSAicG0uaCIKKworLyoKKyAqIHN1c3BlbmQgYXNtIGNvZGVzIHdpbGwgYWNjZXNzIHRoZXNlIHRvIG1ha2UgRFJBTSBiZWNvbWUgc2VsZi1yZWZyZXNoIGFuZAorICogc3lzdGVtIHNsZWVwCisgKi8KK3UzMiBzaXJmc29jX3B3cmNfYmFzZTsKK3ZvaWQgX19pb21lbSAqc2lyZnNvY19tZW1jX2Jhc2U7CisKK3N0YXRpYyB2b2lkIHNpcmZzb2Nfc2V0X3dha2V1cF9zb3VyY2Uodm9pZCkKK3sKKwl1MzIgcHdyX3RyaWdnZXJfZW5fcmVnOworCXB3cl90cmlnZ2VyX2VuX3JlZyA9IHNpcmZzb2NfcnRjX2lvYnJnX3JlYWRsKHNpcmZzb2NfcHdyY19iYXNlICsKKwkJU0lSRlNPQ19QV1JDX1RSSUdHRVJfRU4pOworI2RlZmluZSBYX09OX0tFWV9CICgxIDw8IDApCisJc2lyZnNvY19ydGNfaW9icmdfd3JpdGVsKHB3cl90cmlnZ2VyX2VuX3JlZyB8IFhfT05fS0VZX0IsCisJCXNpcmZzb2NfcHdyY19iYXNlICsgU0lSRlNPQ19QV1JDX1RSSUdHRVJfRU4pOworfQorCitzdGF0aWMgdm9pZCBzaXJmc29jX3NldF9zbGVlcF9tb2RlKHUzMiBtb2RlKQoreworCXUzMiBzbGVlcF9tb2RlID0gc2lyZnNvY19ydGNfaW9icmdfcmVhZGwoc2lyZnNvY19wd3JjX2Jhc2UgKworCQlTSVJGU09DX1BXUkNfUEROX0NUUkwpOworCXNsZWVwX21vZGUgJj0gfihTSVJGU09DX1NMRUVQX01PREVfTUFTSyA8PCAxKTsKKwlzbGVlcF9tb2RlIHw9IG1vZGUgPDwgMTsKKwlzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwoc2xlZXBfbW9kZSwgc2lyZnNvY19wd3JjX2Jhc2UgKworCQlTSVJGU09DX1BXUkNfUEROX0NUUkwpOworfQorCitzdGF0aWMgaW50IHNpcmZzb2NfcHJlX3N1c3BlbmRfcG93ZXJfb2ZmKHZvaWQpCit7CisJdTMyIHdha2V1cF9lbnRyeSA9IHZpcnRfdG9fcGh5cyhjcHVfcmVzdW1lKTsKKworCXNpcmZzb2NfcnRjX2lvYnJnX3dyaXRlbCh3YWtldXBfZW50cnksIHNpcmZzb2NfcHdyY19iYXNlICsKKwkJU0lSRlNPQ19QV1JDX1NDUkFUQ0hfUEFEMSk7CisKKwlzaXJmc29jX3NldF93YWtldXBfc291cmNlKCk7CisKKwlzaXJmc29jX3NldF9zbGVlcF9tb2RlKFNJUkZTT0NfREVFUF9TTEVFUF9NT0RFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpcmZzb2NfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFBNX1NVU1BFTkRfTUVNOgorCQlzaXJmc29jX3ByZV9zdXNwZW5kX3Bvd2VyX29mZigpOworCisJCW91dGVyX2ZsdXNoX2FsbCgpOworCQlvdXRlcl9kaXNhYmxlKCk7CisJCS8qIGdvIHp6eiAqLworCQljcHVfc3VzcGVuZCgwLCBzaXJmc29jX2ZpbmlzaF9zdXNwZW5kKTsKKwkJb3V0ZXJfcmVzdW1lKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBzaXJmc29jX3BtX29wcyA9IHsKKwkuZW50ZXIgPSBzaXJmc29jX3BtX2VudGVyLAorCS52YWxpZCA9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaXJmc29jX3BtX2luaXQodm9pZCkKK3sKKwlzdXNwZW5kX3NldF9vcHMoJnNpcmZzb2NfcG1fb3BzKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc2lyZnNvY19wbV9pbml0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcHdyY19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXB3cmMiIH0sCisJe30KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpcmZzb2Nfb2ZfcHdyY19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIHB3cmNfaWRzKTsKKwlpZiAoIW5wKQorCQlwYW5pYygidW5hYmxlIHRvIGZpbmQgY29tcGF0aWJsZSBwd3JjIG5vZGUgaW4gZHRiXG4iKTsKKworCS8qCisJICogcHdyYyBiZWhpbmQgcnRjaW9icmcgaXMgbm90IGxvY2F0ZWQgaW4gbWVtb3J5IHNwYWNlCisJICogdGhvdWdoIHRoZSBwcm9wZXJ0eSBpcyBuYW1lZCByZWcuIHJlZyBvbmx5IG1lYW5zIGJhc2UKKwkgKiBvZmZzZXQgZm9yIHB3cmMuIHRoZW4gb2ZfaW9tYXAgaXMgbm90IHN1aXRhYmxlIGhlcmUuCisJICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicmVnIiwgJnNpcmZzb2NfcHdyY19iYXNlKSkKKwkJcGFuaWMoInVuYWJsZSB0byBmaW5kIGJhc2UgYWRkcmVzcyBvZiBwd3JjIG5vZGUgaW4gZHRiXG4iKTsKKworCW9mX25vZGVfcHV0KG5wKTsKKworCXJldHVybiAwOworfQorcG9zdGNvcmVfaW5pdGNhbGwoc2lyZnNvY19vZl9wd3JjX2luaXQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtZW1jX2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAic2lyZixwcmltYTItbWVtYyIgfSwKKwl7fQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2lyZnNvY19tZW1jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvcC0+ZGV2Lm9mX25vZGU7CisKKwlzaXJmc29jX21lbWNfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXNpcmZzb2NfbWVtY19iYXNlKQorCQlwYW5pYygidW5hYmxlIHRvIG1hcCBtZW1jIHJlZ2lzdGVyc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZnNvY19tZW1jX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2lyZnNvY19tZW1jX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInNpcmZzb2MtbWVtYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBtZW1jX2lkcywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2lyZnNvY19tZW1jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaXJmc29jX21lbWNfZHJpdmVyKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHNpcmZzb2NfbWVtY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3BtLmggYi9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTZkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXByaW1hMi9wbS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX01BQ0hfUFJJTUEyX1BNX0hfCisjZGVmaW5lIF9NQUNIX1BSSU1BMl9QTV9IXworCisjZGVmaW5lIFNJUkZTT0NfUFdSX1NMRUVQRk9SQ0UJCTB4MDEKKworI2RlZmluZSBTSVJGU09DX1NMRUVQX01PREVfTUFTSyAgICAgICAgIDB4MworI2RlZmluZSBTSVJGU09DX0RFRVBfU0xFRVBfTU9ERSAgICAgICAgIDB4MQorCisjZGVmaW5lIFNJUkZTT0NfUFdSQ19QRE5fQ1RSTCAgICAgICAgICAgMHgwCisjZGVmaW5lIFNJUkZTT0NfUFdSQ19QT05fT0ZGICAgICAgICAgICAgMHg0CisjZGVmaW5lIFNJUkZTT0NfUFdSQ19UUklHR0VSX0VOICAgICAgICAgMHg4CisjZGVmaW5lIFNJUkZTT0NfUFdSQ19QSU5fU1RBVFVTICAgICAgICAgMHgxNAorI2RlZmluZSBTSVJGU09DX1BXUkNfU0NSQVRDSF9QQUQxICAgICAgIDB4MTgKKyNkZWZpbmUgU0lSRlNPQ19QV1JDX1NDUkFUQ0hfUEFEMiAgICAgICAweDFDCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gaW50IHNpcmZzb2NfZmluaXNoX3N1c3BlbmQodW5zaWduZWQgbG9uZyk7CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvcHJpbWEyLmMKaW5kZXggZjU3MTI0Yi4uZWY1NTVjMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvcHJpbWEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvcHJpbWEyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogRGVmaW5lcyBtYWNoaW5lcyBmb3IgQ1NSIFNpUkZwcmltYUlJIAorICogRGVmaW5lcyBtYWNoaW5lcyBmb3IgQ1NSIFNpUkZwcmltYUlJCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgogICoKQEAgLTMxLDExICszMSwxMiBAQAogCiBNQUNISU5FX1NUQVJUKFBSSU1BMl9FVkIsICJwcmltYTJjYiIpCiAJLyogTWFpbnRhaW5lcjogQmFycnkgU29uZyA8YmFvaHVhLnNvbmdAY3NyLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2Vhcmx5ICAgICA9IHNpcmZzb2Nfb2ZfY2xrX2luaXQsCiAJLm1hcF9pbyAgICAgICAgID0gc2lyZnNvY19tYXBfbGx1YXJ0LAogCS5pbml0X2lycQk9IHNpcmZzb2Nfb2ZfaXJxX2luaXQsCiAJLnRpbWVyCQk9ICZzaXJmc29jX3RpbWVyLAorCS5kbWFfem9uZV9zaXplCT0gU1pfMjU2TSwKIAkuaW5pdF9tYWNoaW5lCT0gc2lyZnNvY19tYWNoX2luaXQsCiAJLmR0X2NvbXBhdCAgICAgID0gcHJpbWEyY2JfZHRfbWF0Y2gsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvcnRjaW9icmcuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3J0Y2lvYnJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MGYxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3J0Y2lvYnJnLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBSVEMgSS9PIEJyaWRnZSBpbnRlcmZhY2VzIGZvciBDU1IgU2lSRnByaW1hSUkKKyAqIEFSTSBhY2Nlc3MgdGhlIHJlZ2lzdGVycyBvZiBTWVNSVEMsIEdQU1JUQyBhbmQgUFdSQyB0aHJvdWdoIHRoaXMgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNkZWZpbmUgU0lSRlNPQ19DUFVJT0JSR19DVFJMICAgICAgICAgICAweDAwCisjZGVmaW5lIFNJUkZTT0NfQ1BVSU9CUkdfV1JCRSAgICAgICAgICAgMHgwNAorI2RlZmluZSBTSVJGU09DX0NQVUlPQlJHX0FERFIgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0lSRlNPQ19DUFVJT0JSR19EQVRBICAgICAgICAgICAweDBjCisKKy8qCisgKiBzdXNwZW5kIGFzbSBjb2RlcyB3aWxsIGFjY2VzcyB0aGlzIGFkZHJlc3MgdG8gbWFrZSBzeXN0ZW0gZGVlcHNsZWVwCisgKiBhZnRlciBEUkFNIGJlY29tZXMgc2VsZi1yZWZyZXNoCisgKi8KK3ZvaWQgX19pb21lbSAqc2lyZnNvY19ydGNpb2JyZ19iYXNlOworc3RhdGljIERFRklORV9TUElOTE9DSyhydGNpb2JyZ19sb2NrKTsKKworLyoKKyAqIHN5bWJvbHMgd2l0aG91dCBsb2NrIGFyZSBvbmx5IHVzZWQgYnkgc3VzcGVuZCBhc20gY29kZXMKKyAqIGFuZCB0aGVzZSBzeW1ib2xzIGFyZSBub3QgZXhwb3J0ZWQgdG9vCisgKi8KK3ZvaWQgc2lyZnNvY19ydGNfaW9icmdfd2FpdF9zeW5jKHZvaWQpCit7CisJd2hpbGUgKHJlYWRsX3JlbGF4ZWQoc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19DVFJMKSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3ZvaWQgc2lyZnNvY19ydGNfaW9icmdfYmVzeW5jaW5nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNpb2JyZ19sb2NrLCBmbGFncyk7CisKKwlzaXJmc29jX3J0Y19pb2JyZ193YWl0X3N5bmMoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y2lvYnJnX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNpcmZzb2NfcnRjX2lvYnJnX2Jlc3luY2luZyk7CisKK3UzMiBfX3NpcmZzb2NfcnRjX2lvYnJnX3JlYWRsKHUzMiBhZGRyKQoreworCXNpcmZzb2NfcnRjX2lvYnJnX3dhaXRfc3luYygpOworCisJd3JpdGVsX3JlbGF4ZWQoMHgwMCwgc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19XUkJFKTsKKwl3cml0ZWxfcmVsYXhlZChhZGRyLCBzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgKyBTSVJGU09DX0NQVUlPQlJHX0FERFIpOworCXdyaXRlbF9yZWxheGVkKDB4MDEsIHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfQ1RSTCk7CisKKwlzaXJmc29jX3J0Y19pb2JyZ193YWl0X3N5bmMoKTsKKworCXJldHVybiByZWFkbF9yZWxheGVkKHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfREFUQSk7Cit9CisKK3UzMiBzaXJmc29jX3J0Y19pb2JyZ19yZWFkbCh1MzIgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjaW9icmdfbG9jaywgZmxhZ3MpOworCisJdmFsID0gX19zaXJmc29jX3J0Y19pb2JyZ19yZWFkbChhZGRyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y2lvYnJnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaXJmc29jX3J0Y19pb2JyZ19yZWFkbCk7CisKK3ZvaWQgc2lyZnNvY19ydGNfaW9icmdfcHJlX3dyaXRlbCh1MzIgdmFsLCB1MzIgYWRkcikKK3sKKwlzaXJmc29jX3J0Y19pb2JyZ193YWl0X3N5bmMoKTsKKworCXdyaXRlbF9yZWxheGVkKDB4ZjEsIHNpcmZzb2NfcnRjaW9icmdfYmFzZSArIFNJUkZTT0NfQ1BVSU9CUkdfV1JCRSk7CisJd3JpdGVsX3JlbGF4ZWQoYWRkciwgc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19BRERSKTsKKworCXdyaXRlbF9yZWxheGVkKHZhbCwgc2lyZnNvY19ydGNpb2JyZ19iYXNlICsgU0lSRlNPQ19DUFVJT0JSR19EQVRBKTsKK30KKwordm9pZCBzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwodTMyIHZhbCwgdTMyIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNpb2JyZ19sb2NrLCBmbGFncyk7CisKKwlzaXJmc29jX3J0Y19pb2JyZ19wcmVfd3JpdGVsKHZhbCwgYWRkcik7CisKKwl3cml0ZWxfcmVsYXhlZCgweDAxLCBzaXJmc29jX3J0Y2lvYnJnX2Jhc2UgKyBTSVJGU09DX0NQVUlPQlJHX0NUUkwpOworCisJc2lyZnNvY19ydGNfaW9icmdfd2FpdF9zeW5jKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNpb2JyZ19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydGNpb2JyZ19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpcmYscHJpbWEyLXJ0Y2lvYmciIH0sCisJe30KK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpcmZzb2NfcnRjaW9icmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9wLT5kZXYub2Zfbm9kZTsKKworCXNpcmZzb2NfcnRjaW9icmdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIXNpcmZzb2NfcnRjaW9icmdfYmFzZSkKKwkJcGFuaWMoInVuYWJsZSB0byBtYXAgcnRjIGlvYnJnIHJlZ2lzdGVyc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2lyZnNvY19ydGNpb2JyZ19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNpcmZzb2NfcnRjaW9icmdfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2lyZnNvYy1ydGNpb2JyZyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBydGNpb2JyZ19pZHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpcmZzb2NfcnRjaW9icmdfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNpcmZzb2NfcnRjaW9icmdfZHJpdmVyKTsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHNpcmZzb2NfcnRjaW9icmdfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlpoaXd1IFNvbmcgPHpoaXd1LnNvbmdAY3NyLmNvbT4sICIKKwkJIkJhcnJ5IFNvbmcgPGJhb2h1YS5zb25nQGNzci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNTUiBTaVJGcHJpbWFJSSBydGMgaW8gYnJpZGdlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ1YWJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1wcmltYTIvc2xlZXAuUwpAQCAtMCwwICsxLDY0IEBACisvKgorICogc2xlZXAgbW9kZSBmb3IgQ1NSIFNpUkZwcmltYUlJCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvIExpbWl0ZWQsIGEgQ1NSIHBsYyBncm91cCBjb21wYW55LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworI2luY2x1ZGUgInBtLmgiCisKKyNkZWZpbmUgREVOQUxJX0NUTF8yMl9PRkYJMHg1OAorI2RlZmluZSBERU5BTElfQ1RMXzExMl9PRkYJMHgxYzAKKworCS50ZXh0CisKK0VOVFJZKHNpcmZzb2NfZmluaXNoX3N1c3BlbmQpCisJQCByNTogCW1lbSBjb250cm9sbGVyCisJbGRyICAgICByMCwgPXNpcmZzb2NfbWVtY19iYXNlCisJbGRyCXI1LCBbcjBdCisJQCByNjogCXB3cmMgYmFzZSBvZmZzZXQKKwlsZHIgICAgIHIwLCA9c2lyZnNvY19wd3JjX2Jhc2UKKwlsZHIJcjYsIFtyMF0KKwlAIHI3OiAJcnRjIGlvYnJnIGNvbnRyb2xsZXIKKwlsZHIgICAgIHIwLCA9c2lyZnNvY19ydGNpb2JyZ19iYXNlCisJbGRyCXI3LCBbcjBdCisKKwlAIFJlYWQgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIHNldCB0aGUKKwlAIHNsZWVwIGZvcmNlIGJpdC4KKwlhZGQJcjAsIHI2LCAjU0lSRlNPQ19QV1JDX1BETl9DVFJMCisJYmwJX19zaXJmc29jX3J0Y19pb2JyZ19yZWFkbAorCW9ycglyMCxyMCwjU0lSRlNPQ19QV1JfU0xFRVBGT1JDRQorCWFkZAlyMSwgcjYsICNTSVJGU09DX1BXUkNfUEROX0NUUkwKKwlibAlzaXJmc29jX3J0Y19pb2JyZ19wcmVfd3JpdGVsCisJbW92CXIxLCAjMHgxCisKKwlAIHJlYWQgdGhlIE1FTSBjdGwgcmVnaXN0ZXIgYW5kIHNldCB0aGUgc2VsZgorCUAgcmVmcmVzaCBiaXQKKworCWxkcglyMiwgW3I1LCAjREVOQUxJX0NUTF8yMl9PRkZdCisJb3JyCXIyLCByMiwgIzB4MQorCisJQCBGb2xsb3dpbmcgY29kZSBoYXMgdG8gcnVuIGZyb20gY2FjaGUgc2luY2UKKwlAIHRoZSBSQU0gaXMgZ29pbmcgdG8gc2VsZiByZWZyZXNoIG1vZGUKKwkuYWxpZ24gNQorCXN0cglyMiwgW3I1LCAjREVOQUxJX0NUTF8yMl9PRkZdCisKKzE6CisJbGRyCXI0LCBbcjUsICNERU5BTElfQ1RMXzExMl9PRkZdCisJdHN0CXI0LCAjMHgxCisJYm5lCTFiCisKKwlAIHdyaXRlIFNMRUVQRk9SQ0UgdGhyb3VnaCBydGMgaW9icmlkZ2UKKworCXN0cglyMSwgW3I3XQorCUAgd2FpdCBydGMgaW8gYnJpZGdlIHN5bmMKKzE6CisJbGRyCXIzLCBbcjddCisJdHN0CXIzLCAjMHgwMQorCWJuZQkxYgorCWIgLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3RpbWVyLmMKaW5kZXggZWQ3ZWM0OC4uYjdhNjA5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi90aW1lci5jCkBAIC00MCw2ICs0MCwxNyBAQAogCiAjZGVmaW5lIFNJUkZTT0NfVElNRVJfTEFUQ0hfQklUCSBCSVQoMCkKIAorI2RlZmluZSBTSVJGU09DX1RJTUVSX1JFR19DTlQgMTEKKworc3RhdGljIGNvbnN0IHUzMiBzaXJmc29jX3RpbWVyX3JlZ19saXN0W1NJUkZTT0NfVElNRVJfUkVHX0NOVF0gPSB7CisJU0lSRlNPQ19USU1FUl9NQVRDSF8wLCBTSVJGU09DX1RJTUVSX01BVENIXzEsIFNJUkZTT0NfVElNRVJfTUFUQ0hfMiwKKwlTSVJGU09DX1RJTUVSX01BVENIXzMsIFNJUkZTT0NfVElNRVJfTUFUQ0hfNCwgU0lSRlNPQ19USU1FUl9NQVRDSF81LAorCVNJUkZTT0NfVElNRVJfSU5UX0VOLCBTSVJGU09DX1RJTUVSX1dBVENIRE9HX0VOLCBTSVJGU09DX1RJTUVSX0RJViwKKwlTSVJGU09DX1RJTUVSX0xBVENIRURfTE8sIFNJUkZTT0NfVElNRVJfTEFUQ0hFRF9ISSwKK307CisKK3N0YXRpYyB1MzIgc2lyZnNvY190aW1lcl9yZWdfdmFsW1NJUkZTT0NfVElNRVJfUkVHX0NOVF07CisKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnNpcmZzb2NfdGltZXJfYmFzZTsKIHN0YXRpYyB2b2lkIF9faW5pdCBzaXJmc29jX29mX3RpbWVyX21hcCh2b2lkKTsKIApAQCAtMTA2LDYgKzExNywyNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc2lyZnNvY19jbG9ja3NvdXJjZV9zdXNwZW5kKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJaW50IGk7CisKKwl3cml0ZWxfcmVsYXhlZChTSVJGU09DX1RJTUVSX0xBVENIX0JJVCwgc2lyZnNvY190aW1lcl9iYXNlICsgU0lSRlNPQ19USU1FUl9MQVRDSCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0lSRlNPQ19USU1FUl9SRUdfQ05UOyBpKyspCisJCXNpcmZzb2NfdGltZXJfcmVnX3ZhbFtpXSA9IHJlYWRsX3JlbGF4ZWQoc2lyZnNvY190aW1lcl9iYXNlICsgc2lyZnNvY190aW1lcl9yZWdfbGlzdFtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHNpcmZzb2NfY2xvY2tzb3VyY2VfcmVzdW1lKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0lSRlNPQ19USU1FUl9SRUdfQ05UOyBpKyspCisJCXdyaXRlbF9yZWxheGVkKHNpcmZzb2NfdGltZXJfcmVnX3ZhbFtpXSwgc2lyZnNvY190aW1lcl9iYXNlICsgc2lyZnNvY190aW1lcl9yZWdfbGlzdFtpXSk7CisKKwl3cml0ZWxfcmVsYXhlZChzaXJmc29jX3RpbWVyX3JlZ192YWxbaSAtIDJdLCBzaXJmc29jX3RpbWVyX2Jhc2UgKyBTSVJGU09DX1RJTUVSX0NPVU5URVJfTE8pOworCXdyaXRlbF9yZWxheGVkKHNpcmZzb2NfdGltZXJfcmVnX3ZhbFtpIC0gMV0sIHNpcmZzb2NfdGltZXJfYmFzZSArIFNJUkZTT0NfVElNRVJfQ09VTlRFUl9ISSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIHNpcmZzb2NfY2xvY2tldmVudCA9IHsKIAkubmFtZSA9ICJzaXJmc29jX2Nsb2NrZXZlbnQiLAogCS5yYXRpbmcgPSAyMDAsCkBAIC0xMjAsNiArMTUyLDggQEAKIAkubWFzayA9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogCS5yZWFkID0gc2lyZnNvY190aW1lcl9yZWFkLAorCS5zdXNwZW5kID0gc2lyZnNvY19jbG9ja3NvdXJjZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBzaXJmc29jX2Nsb2Nrc291cmNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHNpcmZzb2NfdGltZXJfaXJxID0gewpAQCAtMTMzLDE0ICsxNjcsMTQgQEAKIC8qIE92ZXJ3cml0ZSB3ZWFrIGRlZmF1bHQgc2NoZWRfY2xvY2sgd2l0aCBtb3JlIHByZWNpc2Ugb25lICovCiB1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQogewotCXN0YXRpYyBpbnQgaXNfbWFwcGVkID0gMDsKKwlzdGF0aWMgaW50IGlzX21hcHBlZDsKIAogCS8qCiAJICogc2NoZWRfY2xvY2sgaXMgY2FsbGVkIGVhcmxpZXIgdGhhbiAuaW5pdCBvZiBzeXNfdGltZXIKIAkgKiBpZiB3ZSBtYXAgdGltZXIgbWVtb3J5IGluIC5pbml0IG9mIHN5c190aW1lciwgc3lzdGVtCiAJICogd2lsbCBwYW5pYyBkdWUgdG8gaWxsZWdhbCBtZW1vcnkgYWNjZXNzCiAJICovCi0JaWYoIWlzX21hcHBlZCkgeworCWlmICghaXNfbWFwcGVkKSB7CiAJCXNpcmZzb2Nfb2ZfdGltZXJfbWFwKCk7CiAJCWlzX21hcHBlZCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKaW5kZXggY2QxOTMwOS4uNjFkM2M3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCkBAIC0yLDYgKzIsMjcgQEAKIAogbWVudSAiSW50ZWwgUFhBMnh4L1BYQTN4eCBJbXBsZW1lbnRhdGlvbnMiCiAKK2NvbmZpZyBBUkNIX1BYQV9WNworCWJvb2wgIkFSTXY3IChQWEE5NXgpIGJhc2VkIHN5c3RlbXMiCisKK2lmIEFSQ0hfUFhBX1Y3Citjb21tZW50ICJNYXJ2ZWxsIERldiBQbGF0Zm9ybXMgKHNvcnRlZCBieSBoYXJkd2FyZSByZWxlYXNlIHRpbWUpIgorY29uZmlnIE1BQ0hfVEFWT1JFVkIzCisJYm9vbCAiUFhBOTV4IERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgVGF2b3JFVkIgSUlJKSIKKwlzZWxlY3QgQ1BVX1BYQTk1NQorCitjb25maWcgTUFDSF9TQUFSQgorCWJvb2wgIlBYQTk1NSBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVJCKSIKKwlzZWxlY3QgQ1BVX1BYQTk1NQorZW5kaWYKKworY29uZmlnIFBYQV9WN19NQUNIX0FVVE8KKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBUkNIX1BYQV9WNworCWRlcGVuZHMgb24gIU1BQ0hfU0FBUkIKKwlzZWxlY3QgTUFDSF9UQVZPUkVWQjMKKworaWYgIUFSQ0hfUFhBX1Y3CiBjb21tZW50ICJJbnRlbC9NYXJ2ZWxsIERldiBQbGF0Zm9ybXMgKHNvcnRlZCBieSBoYXJkd2FyZSByZWxlYXNlIHRpbWUpIgogCiBjb25maWcgQVJDSF9MVUJCT0NLCkBAIC00MSwxOSArNjIsMTEgQEAKIAlzZWxlY3QgUFhBM3h4CiAJc2VsZWN0IENQVV9QWEE5MzAKIAotY29uZmlnIE1BQ0hfVEFWT1JFVkIzCi0JYm9vbCAiUFhBOTV4IERldmVsb3BtZW50IFBsYXRmb3JtIChha2EgVGF2b3JFVkIgSUlJKSIKLQlzZWxlY3QgQ1BVX1BYQTk1MAotCiBjb25maWcgTUFDSF9TQUFSCiAJYm9vbCAiUFhBOTMwIEhhbmRoZWxkIFBsYXRmb3JtIChha2EgU0FBUikiCiAJc2VsZWN0IFBYQTN4eAogCXNlbGVjdCBDUFVfUFhBOTMwCiAKLWNvbmZpZyBNQUNIX1NBQVJCCi0JYm9vbCAiUFhBOTU1IEhhbmRoZWxkIFBsYXRmb3JtIChha2EgU0FBUkIpIgotCXNlbGVjdCBDUFVfUFhBOTU1Ci0KIGNvbW1lbnQgIlRoaXJkIFBhcnR5IERldiBQbGF0Zm9ybXMgKHNvcnRlZCBieSB2ZW5kb3IgbmFtZSkiCiAKIGNvbmZpZyBBUkNIX1BYQV9JRFAKQEAgLTQxNCw2ICs0MjcsNyBAQAogCWJvb2wgIlBhbG0gQ2VudHJvIDY4NSAoR1NNKSIKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEFSQ0hfUFhBX1BBTE0KKwlzZWxlY3QgTUFDSF9QQUxNMjdYCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBJV01NWFQKIAlzZWxlY3QgUEFMTV9UUkVPCkBAIC00MjUsNiArNDM5LDcgQEAKIAlib29sICJQYWxtIFRyZW8gNjgwIgogCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gQVJDSF9QWEFfUEFMTQorCXNlbGVjdCBNQUNIX1BBTE0yN1gKIAlzZWxlY3QgUFhBMjd4CiAJc2VsZWN0IElXTU1YVAogCXNlbGVjdCBQQUxNX1RSRU8KQEAgLTQzNiwxNSArNDUxLDE4IEBACiAJYm9vbCAiUmF1bWZlbGQgQ29udHJvbGxlciIKIAlzZWxlY3QgUFhBM3h4CiAJc2VsZWN0IENQVV9QWEEzMDAKKwlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IEhBVkVfUFdNCiAKIGNvbmZpZyBNQUNIX1JBVU1GRUxEX0NPTk5FQ1RPUgogCWJvb2wgIlJhdW1mZWxkIENvbm5lY3RvciIKKwlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IFBYQTN4eAogCXNlbGVjdCBDUFVfUFhBMzAwCiAKIGNvbmZpZyBNQUNIX1JBVU1GRUxEX1NQRUFLRVIKIAlib29sICJSYXVtZmVsZCBTcGVha2VyIgorCXNlbGVjdCBQT1dFUl9TVVBQTFkKIAlzZWxlY3QgUFhBM3h4CiAJc2VsZWN0IENQVV9QWEEzMDAKIApAQCAtNTk4LDcgKzYxNiw3IEBACiAJYm9vbCAiWmlwaXQgWjIgSGFuZGhlbGQiCiAJc2VsZWN0IFBYQTI3eAogCXNlbGVjdCBIQVZFX1BXTQotCitlbmRpZgogZW5kbWVudQogCiBjb25maWcgUFhBMjV4CkBAIC02ODgsNiArNzA2LDggQEAKIGNvbmZpZyBTSEFSUFNMX1BNX01BWDExMTEKIAlib29sCiAJc2VsZWN0IEhXTU9OCisJc2VsZWN0IFNQSQorCXNlbGVjdCBTUElfTUFTVEVSCiAJc2VsZWN0IFNFTlNPUlNfTUFYMTExMQogCiBjb25maWcgUFhBX0hBVkVfSVNBX0lSUVMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKaW5kZXggY2MzOWQxNy4uYmUwZjdkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUKQEAgLTE5LDcgKzE5LDcgQEAKIG9iai0kKENPTkZJR19QWEEyNXgpCQkrPSBtZnAtcHhhMnh4Lm8gY2xvY2stcHhhMnh4Lm8gcHhhMnh4Lm8gcHhhMjV4Lm8KIG9iai0kKENPTkZJR19QWEEyN3gpCQkrPSBtZnAtcHhhMnh4Lm8gY2xvY2stcHhhMnh4Lm8gcHhhMnh4Lm8gcHhhMjd4Lm8KIG9iai0kKENPTkZJR19QWEEzeHgpCQkrPSBtZnAtcHhhM3h4Lm8gY2xvY2stcHhhM3h4Lm8gcHhhM3h4Lm8gc21lbWMubyBweGEzeHgtdWxwaS5vCi1vYmotJChDT05GSUdfUFhBOTV4KQkJKz0gbWZwLXB4YTN4eC5vIGNsb2NrLXB4YTN4eC5vIHB4YTk1eC5vIHNtZW1jLm8KK29iai0kKENPTkZJR19QWEE5NXgpCQkrPSBtZnAtcHhhM3h4Lm8gY2xvY2stcHhhM3h4Lm8gcHhhM3h4Lm8gcHhhOTV4Lm8gc21lbWMubwogb2JqLSQoQ09ORklHX0NQVV9QWEEzMDApCSs9IHB4YTMwMC5vCiBvYmotJChDT05GSUdfQ1BVX1BYQTMyMCkJKz0gcHhhMzIwLm8KIG9iai0kKENPTkZJR19DUFVfUFhBOTMwKQkrPSBweGE5MzAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2JhbGxvb24zLmMKaW5kZXggZWYzZThiMS4uZmMwYjg1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvYmFsbG9vbjMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9iYWxsb29uMy5jCkBAIC01OTEsNyArNTkxLDcgQEAKIAkJCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHKTsKIAkJaWYgKGJhbGxvb24zX2N0bF9zZXQpCiAJCQlfX3Jhd193cml0ZWwoYmFsbG9vbjNfY3RsX3NldCwKLQkJCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHIHwKKwkJCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHICsKIAkJCQlCQUxMT09OM19GUEdBX1NFVG5DTFIpOwogCX0KIApAQCAtNjA4LDcgKzYwOCw3IEBACiAJX19yYXdfd3JpdGV3KAogCQlCQUxMT09OM19OQU5EX0NPTlRST0xfRkxDRTAgfCBCQUxMT09OM19OQU5EX0NPTlRST0xfRkxDRTEgfAogCQlCQUxMT09OM19OQU5EX0NPTlRST0xfRkxDRTIgfCBCQUxMT09OM19OQU5EX0NPTlRST0xfRkxDRTMsCi0JCUJBTExPT04zX05BTkRfQ09OVFJPTF9SRUcgfCBCQUxMT09OM19GUEdBX1NFVG5DTFIpOworCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHICsgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKIAogCS8qIERlYXNzZXJ0IGNvcnJlY3QgbkNFIGxpbmUgKi8KIAlfX3Jhd193cml0ZXcoQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UwIDw8IGNoaXAsCkBAIC02MjYsNyArNjI2LDcgQEAKIAlpbnQgcmV0OwogCiAJX19yYXdfd3JpdGV3KEJBTExPT04zX05BTkRfQ09OVFJPTDJfMTZCSVQsCi0JCUJBTExPT04zX05BTkRfQ09OVFJPTDJfUkVHIHwgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKKwkJQkFMTE9PTjNfTkFORF9DT05UUk9MMl9SRUcgKyBCQUxMT09OM19GUEdBX1NFVG5DTFIpOwogCiAJdmVyID0gX19yYXdfcmVhZHcoQkFMTE9PTjNfRlBHQV9WRVIpOwogCWlmICh2ZXIgPCAweDRmMDgpCkBAIC02NDksNyArNjQ5LDcgQEAKIAkJQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UwIHwgQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UxIHwKIAkJQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UyIHwgQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMQ0UzIHwKIAkJQkFMTE9PTjNfTkFORF9DT05UUk9MX0ZMV1AsCi0JCUJBTExPT04zX05BTkRfQ09OVFJPTF9SRUcgfCBCQUxMT09OM19GUEdBX1NFVG5DTFIpOworCQlCQUxMT09OM19OQU5EX0NPTlRST0xfUkVHICsgQkFMTE9PTjNfRlBHQV9TRVRuQ0xSKTsKIAlyZXR1cm4gMDsKIAogZXJyMjoKQEAgLTgwNyw3ICs4MDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGJhbGxvb24zX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsJLyogQ1BMRC9GUEdBICovCi0JCS52aXJ0dWFsCT0gIEJBTExPT04zX0ZQR0FfVklSVCwKKwkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylCQUxMT09OM19GUEdBX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihCQUxMT09OM19GUEdBX1BIWVMpLAogCQkubGVuZ3RoCQk9IEJBTExPT04zX0ZQR0FfTEVOR1RILAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCkBAIC04MjgsNSArODI4LDUgQEAKIAkuaGFuZGxlX2lycQk9IHB4YTI3eF9oYW5kbGVfaXJxLAogCS50aW1lcgkJPSAmcHhhX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBiYWxsb29uM19pbml0LAotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jYXBjNzExNy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY2FwYzcxMTcuYwppbmRleCA2NDhiMGFiLi40ZWZjMTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jYXBjNzExNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NhcGM3MTE3LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiBNQUNISU5FX1NUQVJUKENBUEM3MTE3LAogCSAgICAgICJFbWJlZGlhbiBDQVBDLTcxMTcgZXZhbHVhdGlvbiBraXQgYmFzZWQgb24gdGhlIE1YTS04eDEwIENvTSIpCi0JLmJvb3RfcGFyYW1zID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEgPSBweGEzeHhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEgPSBweGEzeHhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNTUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyNTUuYwppbmRleCA5M2Y1OWY4Li5iZTc1MTQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14MjU1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDI1NS5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLWdwaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCmluZGV4IDZiZjQ3OWQuLmViZDkyNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2l0ODE1Mi5oPgogCi11bnNpZ25lZCBsb25nIGl0ODE1Ml9iYXNlX2FkZHJlc3M7Cit2b2lkIF9faW9tZW0gKml0ODE1Ml9iYXNlX2FkZHJlc3M7CiBzdGF0aWMgaW50IGNteDJ4eF9pdDgxNTJfaXJxX2dwaW87CiAKIHN0YXRpYyB2b2lkIGNteDJ4eF9pdDgxNTJfaXJxX2RlbXV4KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHguYwppbmRleCAxM2NmNTE4Li5mMmU0MTkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC5jCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIENNWDJYWF9OUl9JUlFTCQkoSVJRX0JPQVJEX1NUQVJUICsgNDApCiAKIC8qIHZpcnR1YWwgYWRkcmVzc2VzIGZvciBzdGF0aWNhbGx5IG1hcHBlZCByZWdpb25zICovCi0jZGVmaW5lIENNWDJYWF9WSVJUX0JBU0UJKDB4ZTgwMDAwMDApCisjZGVmaW5lIENNWDJYWF9WSVJUX0JBU0UJKHZvaWQgX19pb21lbSAqKSgweGU4MDAwMDAwKQogI2RlZmluZSBDTVgyWFhfSVQ4MTUyX1ZJUlQJKENNWDJYWF9WSVJUX0JBU0UpCiAKIC8qIHBoeXNpY2FsIGFkZHJlc3MgaWYgbG9jYWwtYnVzIGF0dGFjaGVkIGRldmljZXMgKi8KQEAgLTQ4Miw3ICs0ODIsNyBAQAogLyogTWFwIFBDSSBjb21wYW5pb24gc3RhdGljYWxseSAqLwogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBjbXgyeHhfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJWzBdID0geyAvKiBQQ0kgYnJpZGdlICovCi0JCS52aXJ0dWFsCT0gQ01YMlhYX0lUODE1Ml9WSVJULAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKUNNWDJYWF9JVDgxNTJfVklSVCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBYQV9DUzRfUEhZUyksCiAJCS5sZW5ndGgJCT0gU1pfNjRNLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKQEAgLTUxMyw3ICs1MTMsNyBAQAogI2VuZGlmCiAKIE1BQ0hJTkVfU1RBUlQoQVJNQ09SRSwgIkNvbXB1bGFiIENNLVgyWFgiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBjbXgyeHhfbWFwX2lvLAogCS5ucl9pcnFzCT0gQ01YMlhYX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gY214Mnh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDMwMC5jCmluZGV4IGQ5NDBlOGEuLmUwOTZiYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14MzAwLmMKQEAgLTQyNCw4ICs0MjQsOSBAQAogc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIGNtX3gzMDBfbmFuZF9pbmZvID0gewogCS5lbmFibGVfYXJiaXRlcgk9IDEsCiAJLmtlZXBfY29uZmlnCT0gMSwKLQkucGFydHMJCT0gY21feDMwMF9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShjbV94MzAwX25hbmRfcGFydGl0aW9ucyksCisJLm51bV9jcwkJPSAxLAorCS5wYXJ0c1swXQk9IGNtX3gzMDBfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUoY21feDMwMF9uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF9uYW5kKHZvaWQpCkBAIC03NzUsNyArNzc2LDYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGNtX3gzMDBfaW5pdF93aTJ3aSh2b2lkKQogewotCWludCBidF9yZXNldCwgd2xhbl9lbjsKIAlpbnQgZXJyOwogCiAJaWYgKHN5c3RlbV9yZXYgPCAxMzApIHsKQEAgLTc5MSwxMiArNzkxLDExIEBACiAJfQogCiAJdWRlbGF5KDEwKTsKLQlncGlvX3NldF92YWx1ZShidF9yZXNldCwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoY21feDMwMF93aTJ3aV9ncGlvc1sxXS5ncGlvLCAwKTsKIAl1ZGVsYXkoMTApOwotCWdwaW9fc2V0X3ZhbHVlKGJ0X3Jlc2V0LCAxKTsKKwlncGlvX3NldF92YWx1ZShjbV94MzAwX3dpMndpX2dwaW9zWzFdLmdwaW8sIDEpOwogCi0JZ3Bpb19mcmVlKHdsYW5fZW4pOwotCWdwaW9fZnJlZShidF9yZXNldCk7CisJZ3Bpb19mcmVlX2FycmF5KEFSUkFZX0FORF9TSVpFKGNtX3gzMDBfd2kyd2lfZ3Bpb3MpKTsKIH0KIAogLyogTUZQICovCkBAIC04NTIsNyArODUxLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTV9YMzAwLCAiQ00tWDMwMCBtb2R1bGUiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTN4eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEyNzAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMjcwLmMKaW5kZXggODcwOTIwOS4uMDViZmExYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTI3MC5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTMwNiw3ICszMDcsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKENPTElCUkksICJUb3JhZGV4IENvbGlicmkgUFhBMjcwIikKLQkuYm9vdF9wYXJhbXMJPSBDT0xJQlJJX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gY29saWJyaV9weGEyNzBfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLApAQCAtMzE1LDcgKzMxNiw3IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKElOQ09NRSwgIkluY29tZSBzLnIuby4gU0gtRG1hc3RlciBQWEEyNzAgU0JDIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBjb2xpYnJpX3B4YTI3MF9pbmNvbWVfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzAwLmMKaW5kZXggNjBhNjc4MS4uYzgyNWU4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMwMC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDT0xJQlJJMzAwLCAiVG9yYWRleCBDb2xpYnJpIFBYQTMwMCIpCi0JLmJvb3RfcGFyYW1zCT0gQ09MSUJSSV9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IGNvbGlicmlfcHhhMzAwX2luaXQsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzIwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTMyMC5jCmluZGV4IGQyYzY2MzEuLjY5MmUxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhMzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzMjAuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ09MSUJSSTMyMCwgIlRvcmFkZXggQ29saWJyaSBQWEEzMjAiKQotCS5ib290X3BhcmFtcwk9IENPTElCUklfU0RSQU1fQkFTRSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X21hY2hpbmUJPSBjb2xpYnJpX3B4YTMyMF9pbml0LAogCS5tYXBfaW8JCT0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEzeHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTN4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29saWJyaS1weGEzeHguYwppbmRleCAzZjliZTQxLi4yYjhjYTBkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb2xpYnJpLXB4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvbGlicmktcHhhM3h4LmMKQEAgLTEzOSw4ICsxMzksOSBAQAogc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIGNvbGlicmlfbmFuZF9pbmZvID0gewogCS5lbmFibGVfYXJiaXRlcgk9IDEsCiAJLmtlZXBfY29uZmlnCT0gMSwKLQkucGFydHMJCT0gY29saWJyaV9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShjb2xpYnJpX25hbmRfcGFydGl0aW9ucyksCisJLm51bV9jcwkJPSAxLAorCS5wYXJ0c1swXQk9IGNvbGlicmlfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUoY29saWJyaV9uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogdm9pZCBfX2luaXQgY29saWJyaV9weGEzeHhfaW5pdF9uYW5kKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCAzZTk0ODNiLi41NDk0NjhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvcHhhMnh4X3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9zaGFycHNsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHZpZGVvL3cxMDBmYi5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jc2I3MjYuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NzYjcyNi5jCmluZGV4IGZlODEyZWEuLjVlMmNmMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NzYjcyNi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NzYjcyNi5jCkBAIC0yNzIsNyArMjcyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChDU0I3MjYsICJDb2dlbnQgQ1NCNzI2IikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxICAgICAgID0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9lbS14MjcwLmMKaW5kZXggMmUzN2VhNS4uOTRhY2MwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZW0teDI3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VtLXgyNzAuYwpAQCAtMTI5OSw3ICsxMjk5LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFTV9YMjcwLCAiQ29tcHVsYWIgRU0tWDI3MCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCkBAIC0xMzA4LDcgKzEzMDgsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChFWEVEQSwgIkNvbXB1bGFiIGVYZWRhIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjd4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEyN3hfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuYwppbmRleCBlNGExZjRkLi5kODJiN2FhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlJTklUX0NMS1JFRygmdG1pb19kdW1teV9jbGssIE5VTEwsICJDTEtfQ0szMksiKSwKIH07CiAKLXZvaWQgZXNlcmllc19yZWdpc3Rlcl9jbGtzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZXNlcmllc19yZWdpc3Rlcl9jbGtzKHZvaWQpCiB7CiAJY2xrZGV2X2FkZF90YWJsZShlc2VyaWVzX2Nsa3JlZ3MsIEFSUkFZX1NJWkUoZXNlcmllc19jbGtyZWdzKSk7CiB9CkBAIC0xODgsNyArMTg4LDcgQEAKIAogTUFDSElORV9TVEFSVChFMzMwLCAiVG9zaGliYSBlMzMwIikKIAkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVNFUklFU19OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiBNQUNISU5FX1NUQVJUKEUzNTAsICJUb3NoaWJhIGUzNTAiKQogCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFU0VSSUVTX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApAQCAtMzYxLDcgKzM2MSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRTQwMCwgIlRvc2hpYmEgZTQwMCIpCiAJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkubnJfaXJxcwk9IEVTRVJJRVNfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCkBAIC01NTAsNyArNTUwLDcgQEAKIAogTUFDSElORV9TVEFSVChFNzQwLCAiVG9zaGliYSBlNzQwIikKIAkvKiBNYWludGFpbmVyOiBJYW4gTW9sdG9uIChzcHlyb0BmMnMuY29tKSAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVNFUklFU19OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKQEAgLTc0Miw3ICs3NDIsNyBAQAogCiBNQUNISU5FX1NUQVJUKEU3NTAsICJUb3NoaWJhIGU3NTAiKQogCS8qIE1haW50YWluZXI6IElhbiBNb2x0b24gKHNweXJvQGYycy5jb20pICovCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFU0VSSUVTX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApAQCAtOTQ3LDcgKzk0Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoRTgwMCwgIlRvc2hpYmEgZTgwMCIpCiAJLyogTWFpbnRhaW5lcjogSWFuIE1vbHRvbiAoc3B5cm9AZjJzLmNvbSkgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkubnJfaXJxcwk9IEVTRVJJRVNfTlJfSVJRUywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmggYi9hcmNoL2FybS9tYWNoLXB4YS9lc2VyaWVzLmgKaW5kZXggYmU5MjE5Ni4uYjk2OTQ5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXNlcmllcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2VzZXJpZXMuaApAQCAtMTEsNSArMTEsNCBAQAogZXh0ZXJuIHZvaWQgZXNlcmllc19nZXRfdG1pb19ncGlvcyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgZXNlcmllc190bWlvX3Jlc291cmNlc1tdOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZTMwMF90YzYzODd4Yl9kZXZpY2U7Ci1leHRlcm4gdm9pZCBlc2VyaWVzX3JlZ2lzdGVyX2Nsa3Modm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2V6eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKaW5kZXggYjczZWFkYi4uODMwOGVlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZXp4LmMKQEAgLTc5Nyw3ICs3OTcsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEVaWF9BNzgwLCAiTW90b3JvbGEgRVpYIEE3ODAiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcwk9IEVaWF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTg2Myw3ICs4NjMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEVaWF9FNjgwLCAiTW90b3JvbGEgRVpYIEU2ODAiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcwk9IEVaWF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTkyOSw3ICs5MjksNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEVaWF9BMTIwMCwgIk1vdG9yb2xhIEVaWCBBMTIwMCIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVpYX05SX0lSUVMsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLApAQCAtMTEyMCw3ICsxMTIwLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfQTkxMCwgIk1vdG9yb2xhIEVaWCBBOTEwIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBFWlhfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEyN3hfaW5pdF9pcnEsCkBAIC0xMTg2LDcgKzExODYsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEVaWF9FNiwgIk1vdG9yb2xhIEVaWCBFNiIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5ucl9pcnFzCT0gRVpYX05SX0lSUVMsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLApAQCAtMTIyNiw3ICsxMjI2LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChFWlhfRTIsICJNb3Rvcm9sYSBFWlggRTIiKQotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcwk9IEVaWF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYwppbmRleCBmNWQ5MWVmLi41NDMyZWNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiBpbml0aWFsaXphdGlvbiBzdHVmZiBmb3IgUFhBIG1hY2hpbmVzIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGxhdGVyIGlmCiAgKiBuZWVkIGJlLgogICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI2LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvc21lbWMuaD4KICNpbmNsdWRlIDxtYWNoL3B4YTN4eC1yZWdzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYyBiL2FyY2gvYXJtL21hY2gtcHhhL2d1bXN0aXguYwppbmRleCBkZWFhMTExLi45YzgyMDhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9ndW1zdGl4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZ3Vtc3RpeC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChHVU1TVElYLCAiR3Vtc3RpeCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwgLyogbWF0Y2ggdS1ib290IGJpX2Jvb3RfcGFyYW1zICovCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsIC8qIG1hdGNoIHUtYm9vdCBiaV9ib290X3BhcmFtcyAqLwogCS5tYXBfaW8JCT0gcHhhMjV4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEyNXhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEyNXhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2g1MDAwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jCmluZGV4IDBhMjM1MTI4Li40YjVlMTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9oNTAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2g1MDAwLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEg1NDAwLCAiSFAgaVBBUSBINTAwMCIpCi0JLmJvb3RfcGFyYW1zID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gcHhhMjV4X21hcF9pbywKIAkuaW5pdF9pcnEgPSBweGEyNXhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEgPSBweGEyNXhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2hpbWFsYXlhLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9oaW1hbGF5YS5jCmluZGV4IGE5OTdkMGFiLi5mMmMzMjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9oaW1hbGF5YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2hpbWFsYXlhLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoSElNQUxBWUEsICJIVEMgSGltYWxheWEiKQotCS5ib290X3BhcmFtcyA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxID0gcHhhMjV4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxID0gcHhhMjV4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCmluZGV4IGM3NDhhNDcuLjZmNjM2OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCkBAIC04MzgsNyArODM4LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChINDcwMCwgIkhQIGlQQVEgSFg0NzAwIikKLQkuYm9vdF9wYXJhbXMgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLm5yX2lycXMgICAgICA9IEhYNDcwMF9OUl9JUlFTLAogCS5pbml0X2lycSAgICAgPSBweGEyN3hfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pY29udHJvbC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaWNvbnRyb2wuYwppbmRleCBkNDI3NDI5Li5mNzhkNWRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pY29udHJvbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2ljb250cm9sLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKElDT05UUk9MLCAiaUNvbnRyb2wvU2FmZVRjYW0gYm9hcmRzIHVzaW5nIEVtYmVkaWFuIE1YTS04eDEwIENvTSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhM3h4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhM3h4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvYWRkci1tYXAuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCmluZGV4IGY0YzAzNjUuLmJiZjlkZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9hZGRyLW1hcC5oCkBAIC0yMCw3ICsyMCw3IEBACiAgKiBQZXJpcGhlcmFsIEJ1cwogICovCiAjZGVmaW5lIFBFUklQSF9QSFlTCQkweDQwMDAwMDAwCi0jZGVmaW5lIFBFUklQSF9WSVJUCQkweGYyMDAwMDAwCisjZGVmaW5lIFBFUklQSF9WSVJUCQlJT01FTSgweGYyMDAwMDAwKQogI2RlZmluZSBQRVJJUEhfU0laRQkJMHgwMjAwMDAwMAogCiAvKgpAQCAtMjgsMjEgKzI4LDIxIEBACiAgKi8KICNkZWZpbmUgUFhBMlhYX1NNRU1DX1BIWVMJMHg0ODAwMDAwMAogI2RlZmluZSBQWEEzWFhfU01FTUNfUEhZUwkweDRhMDAwMDAwCi0jZGVmaW5lIFNNRU1DX1ZJUlQJCTB4ZjYwMDAwMDAKKyNkZWZpbmUgU01FTUNfVklSVAkJSU9NRU0oMHhmNjAwMDAwMCkKICNkZWZpbmUgU01FTUNfU0laRQkJMHgwMDEwMDAwMAogCiAvKgogICogRHluYW1pYyBNZW1vcnkgQ29udHJvbGxlciAob25seSBvbiBQWEEzeHgpCiAgKi8KICNkZWZpbmUgRE1FTUNfUEhZUwkJMHg0ODEwMDAwMAotI2RlZmluZSBETUVNQ19WSVJUCQkweGY2MTAwMDAwCisjZGVmaW5lIERNRU1DX1ZJUlQJCUlPTUVNKDB4ZjYxMDAwMDApCiAjZGVmaW5lIERNRU1DX1NJWkUJCTB4MDAxMDAwMDAKIAogLyoKICAqIEludGVybmFsIE1lbW9yeSBDb250cm9sbGVyIChQWEEyN3ggYW5kIGxhdGVyKQogICovCiAjZGVmaW5lIElNRU1DX1BIWVMJCTB4NTgwMDAwMDAKLSNkZWZpbmUgSU1FTUNfVklSVAkJMHhmZTAwMDAwMAorI2RlZmluZSBJTUVNQ19WSVJUCQlJT01FTSgweGZlMDAwMDAwKQogI2RlZmluZSBJTUVNQ19TSVpFCQkweDAwMTAwMDAwCiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0FERFJfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9iYWxsb29uMy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2JhbGxvb24zLmgKaW5kZXggNzA3NGU3Ni4uNmQ3ZWFiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2JhbGxvb24zLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2JhbGxvb24zLmgKQEAgLTIzLDcgKzIzLDcgQEAKIH07CiAKICNkZWZpbmUgQkFMTE9PTjNfRlBHQV9QSFlTCVBYQV9DUzRfUEhZUwotI2RlZmluZSBCQUxMT09OM19GUEdBX1ZJUlQJKDB4ZjEwMDAwMDApCS8qIGFzIHBlciBiYWxsb29uMiAqLworI2RlZmluZSBCQUxMT09OM19GUEdBX1ZJUlQJSU9NRU0oMHhmMTAwMDAwMCkJLyogYXMgcGVyIGJhbGxvb24yICovCiAjZGVmaW5lIEJBTExPT04zX0ZQR0FfTEVOR1RICTB4MDEwMDAwMDAKIAogI2RlZmluZQlCQUxMT09OM19GUEdBX1NFVG5DTFIJCSgweDEwMDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDdkNWM3NTEuLjcwYjExMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlICJoYXJkd2FyZS5oIgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4MDAxMDAwMDAKIAkJb3JyCVxydiwgXHJwLCAjaW9fcDJ2KDB4NDAwMDAwMDApCUAgdmlydHVhbAogCQlvcnIJXHJwLCBccnAsICMweDQwMDAwMDAwCQlAIHBoeXNpY2FsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby1weGEuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ncGlvLXB4YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjRjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby1weGEuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgUGhpbGlwcCBaYWJlbCA8cGhpbGlwcC56YWJlbEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworI2lmbmRlZiBfX01BQ0hfUFhBX0dQSU9fUFhBX0gKKyNkZWZpbmUgX19NQUNIX1BYQV9HUElPX1BYQV9ICisKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgR1BJT19SRUdTX1ZJUlQJaW9fcDJ2KDB4NDBFMDAwMDApCisKKyNkZWZpbmUgQkFOS19PRkYobikJKCgobikgPCAzKSA/IChuKSA8PCAyIDogMHgxMDAgKyAoKChuKSAtIDMpIDw8IDIpKQorI2RlZmluZSBHUElPX1JFRyh4KQkoKih2b2xhdGlsZSB1MzIgKikoR1BJT19SRUdTX1ZJUlQgKyAoeCkpKQorCisvKiBHUElPIFBpbiBMZXZlbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1BMUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgwMCkKKyNkZWZpbmUgR1BMUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgwMCkKKyNkZWZpbmUgR1BMUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgwMCkKKyNkZWZpbmUgR1BMUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgwMCkKKworLyogR1BJTyBQaW4gRGlyZWN0aW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBHUERSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDBjKQorI2RlZmluZSBHUERSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDBjKQorI2RlZmluZSBHUERSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDBjKQorI2RlZmluZSBHUERSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDBjKQorCisvKiBHUElPIFBpbiBPdXRwdXQgU2V0IFJlZ2lzdGVycyAqLworI2RlZmluZSBHUFNSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDE4KQorI2RlZmluZSBHUFNSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDE4KQorI2RlZmluZSBHUFNSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDE4KQorI2RlZmluZSBHUFNSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDE4KQorCisvKiBHUElPIFBpbiBPdXRwdXQgQ2xlYXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdQQ1IwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MjQpCisjZGVmaW5lIEdQQ1IxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MjQpCisjZGVmaW5lIEdQQ1IyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MjQpCisjZGVmaW5lIEdQQ1IzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MjQpCisKKy8qIEdQSU8gUmlzaW5nIEVkZ2UgRGV0ZWN0IFJlZ2lzdGVycyAqLworI2RlZmluZSBHUkVSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDMwKQorI2RlZmluZSBHUkVSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDMwKQorI2RlZmluZSBHUkVSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDMwKQorI2RlZmluZSBHUkVSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDMwKQorCisvKiBHUElPIEZhbGxpbmcgRWRnZSBEZXRlY3QgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdGRVIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4M2MpCisjZGVmaW5lIEdGRVIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4M2MpCisjZGVmaW5lIEdGRVIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4M2MpCisjZGVmaW5lIEdGRVIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4M2MpCisKKy8qIEdQSU8gRWRnZSBEZXRlY3QgU3RhdHVzIFJlZ2lzdGVycyAqLworI2RlZmluZSBHRURSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDQ4KQorI2RlZmluZSBHRURSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDQ4KQorI2RlZmluZSBHRURSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDQ4KQorI2RlZmluZSBHRURSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDQ4KQorCisvKiBHUElPIEFsdGVybmF0ZSBGdW5jdGlvbiBTZWxlY3QgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdBRlIwX0wJCUdQSU9fUkVHKDB4MDA1NCkKKyNkZWZpbmUgR0FGUjBfVQkJR1BJT19SRUcoMHgwMDU4KQorI2RlZmluZSBHQUZSMV9MCQlHUElPX1JFRygweDAwNUMpCisjZGVmaW5lIEdBRlIxX1UJCUdQSU9fUkVHKDB4MDA2MCkKKyNkZWZpbmUgR0FGUjJfTAkJR1BJT19SRUcoMHgwMDY0KQorI2RlZmluZSBHQUZSMl9VCQlHUElPX1JFRygweDAwNjgpCisjZGVmaW5lIEdBRlIzX0wJCUdQSU9fUkVHKDB4MDA2QykKKyNkZWZpbmUgR0FGUjNfVQkJR1BJT19SRUcoMHgwMDcwKQorCisvKiBNb3JlIGhhbmR5IG1hY3Jvcy4gIFRoZSBhcmd1bWVudCBpcyBhIGxpdGVyYWwgR1BJTyBudW1iZXIuICovCisKKyNkZWZpbmUgR1BJT19iaXQoeCkJKDEgPDwgKCh4KSAmIDB4MWYpKQorCisjZGVmaW5lIEdQTFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4MDApCisjZGVmaW5lIEdQRFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4MGMpCisjZGVmaW5lIEdQU1IoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4MTgpCisjZGVmaW5lIEdQQ1IoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4MjQpCisjZGVmaW5lIEdSRVIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4MzApCisjZGVmaW5lIEdGRVIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4M2MpCisjZGVmaW5lIEdFRFIoeCkJCUdQSU9fUkVHKEJBTktfT0ZGKCh4KSA+PiA1KSArIDB4NDgpCisjZGVmaW5lIEdBRlIoeCkJCUdQSU9fUkVHKDB4NTQgKyAoKCh4KSAmIDB4NzApID4+IDIpKQorCisKKyNkZWZpbmUgTlJfQlVJTFRJTl9HUElPCQlQWEFfR1BJT19JUlFfTlVNCisKKyNkZWZpbmUgZ3Bpb190b19iYW5rKGdwaW8pCSgoZ3BpbykgPj4gNSkKKworI2lmZGVmIENPTkZJR19DUFVfUFhBMjZ4CisvKiBHUElPODYvODcvODgvODkgb24gUFhBMjZ4IGhhdmUgdGhlaXIgZGlyZWN0aW9uIGJpdHMgaW4gR1BEUjIgaW52ZXJ0ZWQsCisgKiBhcyB3ZWxsIGFzIHRoZWlyIEFsdGVybmF0ZSBGdW5jdGlvbiB2YWx1ZSBiZWluZyAnMScgZm9yIEdQSU8gaW4gR0FGUnguCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fZ3Bpb19pc19pbnZlcnRlZCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBjcHVfaXNfcHhhMjV4KCkgJiYgZ3BpbyA+IDg1OworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IF9fZ3Bpb19pc19pbnZlcnRlZCh1bnNpZ25lZCBncGlvKSB7IHJldHVybiAwOyB9CisjZW5kaWYKKworLyoKKyAqIE9uIFBYQTI1eCBhbmQgUFhBMjd4LCBHQUZSeCBhbmQgR1BEUnggdG9nZXRoZXIgZGVjaWRlIHRoZSBhbHRlcm5hdGUKKyAqIGZ1bmN0aW9uIG9mIGEgR1BJTywgYW5kIEdQRFJ4IGNhbm5vdCBiZSBhbHRlcmVkIG9uY2UgY29uZmlndXJlZC4gSXQKKyAqIGlzIGF0dHJpYnV0ZWQgYXMgIm9jY3VwaWVkIiBoZXJlIChJIGtub3cgdGhpcyB0ZXJtaW5vbG9neSBpc24ndAorICogYWNjdXJhdGUsIHlvdSBhcmUgd2VsY29tZSB0byBwcm9wb3NlIGEgYmV0dGVyIG9uZSA6LSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19ncGlvX2lzX29jY3VwaWVkKHVuc2lnbmVkIGdwaW8pCit7CisJaWYgKGNwdV9pc19weGEyN3goKSB8fCBjcHVfaXNfcHhhMjV4KCkpIHsKKwkJaW50IGFmID0gKEdBRlIoZ3BpbykgPj4gKChncGlvICYgMHhmKSAqIDIpKSAmIDB4MzsKKwkJaW50IGRpciA9IEdQRFIoZ3BpbykgJiBHUElPX2JpdChncGlvKTsKKworCQlpZiAoX19ncGlvX2lzX2ludmVydGVkKGdwaW8pKQorCQkJcmV0dXJuIGFmICE9IDEgfHwgZGlyID09IDA7CisJCWVsc2UKKwkJCXJldHVybiBhZiAhPSAwIHx8IGRpciAhPSAwOworCX0gZWxzZQorCQlyZXR1cm4gR1BEUihncGlvKSAmIEdQSU9fYml0KGdwaW8pOworfQorCisjaW5jbHVkZSA8cGxhdC9ncGlvLXB4YS5oPgorI2VuZGlmIC8qIF9fTUFDSF9QWEFfR1BJT19QWEFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYzQ2Mzk1MC4uMDA0Y2FkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0yNCw4NCArMjQsMTAgQEAKICNpZm5kZWYgX19BU01fQVJDSF9QWEFfR1BJT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfUFhBX0dQSU9fSAogCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKy8qIFRoZSBkZWZpbmVzIGZvciB0aGUgZHJpdmVyIGFyZSBuZWVkZWQgZm9yIHRoZSBhY2NlbGVyYXRlZCBhY2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJncGlvLXB4YS5oIgogCi0jZGVmaW5lIEdQSU9fUkVHU19WSVJUCWlvX3AydigweDQwRTAwMDAwKQotCi0jZGVmaW5lIEJBTktfT0ZGKG4pCSgoKG4pIDwgMykgPyAobikgPDwgMiA6IDB4MTAwICsgKCgobikgLSAzKSA8PCAyKSkKLSNkZWZpbmUgR1BJT19SRUcoeCkJKCoodm9sYXRpbGUgdTMyICopKEdQSU9fUkVHU19WSVJUICsgKHgpKSkKLQotLyogR1BJTyBQaW4gTGV2ZWwgUmVnaXN0ZXJzICovCi0jZGVmaW5lIEdQTFIwCQlHUElPX1JFRyhCQU5LX09GRigwKSArIDB4MDApCi0jZGVmaW5lIEdQTFIxCQlHUElPX1JFRyhCQU5LX09GRigxKSArIDB4MDApCi0jZGVmaW5lIEdQTFIyCQlHUElPX1JFRyhCQU5LX09GRigyKSArIDB4MDApCi0jZGVmaW5lIEdQTFIzCQlHUElPX1JFRyhCQU5LX09GRigzKSArIDB4MDApCi0KLS8qIEdQSU8gUGluIERpcmVjdGlvbiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR1BEUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgwYykKLSNkZWZpbmUgR1BEUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgwYykKLSNkZWZpbmUgR1BEUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgwYykKLSNkZWZpbmUgR1BEUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgwYykKLQotLyogR1BJTyBQaW4gT3V0cHV0IFNldCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR1BTUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgxOCkKLSNkZWZpbmUgR1BTUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgxOCkKLSNkZWZpbmUgR1BTUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgxOCkKLSNkZWZpbmUgR1BTUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgxOCkKLQotLyogR1BJTyBQaW4gT3V0cHV0IENsZWFyIFJlZ2lzdGVycyAqLwotI2RlZmluZSBHUENSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDI0KQotI2RlZmluZSBHUENSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDI0KQotI2RlZmluZSBHUENSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDI0KQotI2RlZmluZSBHUENSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDI0KQotCi0vKiBHUElPIFJpc2luZyBFZGdlIERldGVjdCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR1JFUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHgzMCkKLSNkZWZpbmUgR1JFUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHgzMCkKLSNkZWZpbmUgR1JFUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHgzMCkKLSNkZWZpbmUgR1JFUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHgzMCkKLQotLyogR1BJTyBGYWxsaW5nIEVkZ2UgRGV0ZWN0IFJlZ2lzdGVycyAqLwotI2RlZmluZSBHRkVSMAkJR1BJT19SRUcoQkFOS19PRkYoMCkgKyAweDNjKQotI2RlZmluZSBHRkVSMQkJR1BJT19SRUcoQkFOS19PRkYoMSkgKyAweDNjKQotI2RlZmluZSBHRkVSMgkJR1BJT19SRUcoQkFOS19PRkYoMikgKyAweDNjKQotI2RlZmluZSBHRkVSMwkJR1BJT19SRUcoQkFOS19PRkYoMykgKyAweDNjKQotCi0vKiBHUElPIEVkZ2UgRGV0ZWN0IFN0YXR1cyBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgR0VEUjAJCUdQSU9fUkVHKEJBTktfT0ZGKDApICsgMHg0OCkKLSNkZWZpbmUgR0VEUjEJCUdQSU9fUkVHKEJBTktfT0ZGKDEpICsgMHg0OCkKLSNkZWZpbmUgR0VEUjIJCUdQSU9fUkVHKEJBTktfT0ZGKDIpICsgMHg0OCkKLSNkZWZpbmUgR0VEUjMJCUdQSU9fUkVHKEJBTktfT0ZGKDMpICsgMHg0OCkKLQotLyogR1BJTyBBbHRlcm5hdGUgRnVuY3Rpb24gU2VsZWN0IFJlZ2lzdGVycyAqLwotI2RlZmluZSBHQUZSMF9MCQlHUElPX1JFRygweDAwNTQpCi0jZGVmaW5lIEdBRlIwX1UJCUdQSU9fUkVHKDB4MDA1OCkKLSNkZWZpbmUgR0FGUjFfTAkJR1BJT19SRUcoMHgwMDVDKQotI2RlZmluZSBHQUZSMV9VCQlHUElPX1JFRygweDAwNjApCi0jZGVmaW5lIEdBRlIyX0wJCUdQSU9fUkVHKDB4MDA2NCkKLSNkZWZpbmUgR0FGUjJfVQkJR1BJT19SRUcoMHgwMDY4KQotI2RlZmluZSBHQUZSM19MCQlHUElPX1JFRygweDAwNkMpCi0jZGVmaW5lIEdBRlIzX1UJCUdQSU9fUkVHKDB4MDA3MCkKLQotLyogTW9yZSBoYW5keSBtYWNyb3MuICBUaGUgYXJndW1lbnQgaXMgYSBsaXRlcmFsIEdQSU8gbnVtYmVyLiAqLwotCi0jZGVmaW5lIEdQSU9fYml0KHgpCSgxIDw8ICgoeCkgJiAweDFmKSkKLQotI2RlZmluZSBHUExSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDAwKQotI2RlZmluZSBHUERSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDBjKQotI2RlZmluZSBHUFNSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDE4KQotI2RlZmluZSBHUENSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDI0KQotI2RlZmluZSBHUkVSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDMwKQotI2RlZmluZSBHRkVSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDNjKQotI2RlZmluZSBHRURSKHgpCQlHUElPX1JFRyhCQU5LX09GRigoeCkgPj4gNSkgKyAweDQ4KQotI2RlZmluZSBHQUZSKHgpCQlHUElPX1JFRygweDU0ICsgKCgoeCkgJiAweDcwKSA+PiAyKSkKLQotCi0jZGVmaW5lIE5SX0JVSUxUSU5fR1BJTwkJUFhBX0dQSU9fSVJRX05VTQotCi0jZGVmaW5lIGdwaW9fdG9fYmFuayhncGlvKQkoKGdwaW8pID4+IDUpCiAjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCUlSUV9HUElPKGdwaW8pCiAKIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xMTgsMzcgKzQ0LDUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ1BVX1BYQTI2eAotLyogR1BJTzg2Lzg3Lzg4Lzg5IG9uIFBYQTI2eCBoYXZlIHRoZWlyIGRpcmVjdGlvbiBiaXRzIGluIEdQRFIyIGludmVydGVkLAotICogYXMgd2VsbCBhcyB0aGVpciBBbHRlcm5hdGUgRnVuY3Rpb24gdmFsdWUgYmVpbmcgJzEnIGZvciBHUElPIGluIEdBRlJ4LgotICovCi1zdGF0aWMgaW5saW5lIGludCBfX2dwaW9faXNfaW52ZXJ0ZWQodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gY3B1X2lzX3B4YTI1eCgpICYmIGdwaW8gPiA4NTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBfX2dwaW9faXNfaW52ZXJ0ZWQodW5zaWduZWQgZ3BpbykgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLS8qCi0gKiBPbiBQWEEyNXggYW5kIFBYQTI3eCwgR0FGUnggYW5kIEdQRFJ4IHRvZ2V0aGVyIGRlY2lkZSB0aGUgYWx0ZXJuYXRlCi0gKiBmdW5jdGlvbiBvZiBhIEdQSU8sIGFuZCBHUERSeCBjYW5ub3QgYmUgYWx0ZXJlZCBvbmNlIGNvbmZpZ3VyZWQuIEl0Ci0gKiBpcyBhdHRyaWJ1dGVkIGFzICJvY2N1cGllZCIgaGVyZSAoSSBrbm93IHRoaXMgdGVybWlub2xvZ3kgaXNuJ3QKLSAqIGFjY3VyYXRlLCB5b3UgYXJlIHdlbGNvbWUgdG8gcHJvcG9zZSBhIGJldHRlciBvbmUgOi0pCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fZ3Bpb19pc19vY2N1cGllZCh1bnNpZ25lZCBncGlvKQotewotCWlmIChjcHVfaXNfcHhhMjd4KCkgfHwgY3B1X2lzX3B4YTI1eCgpKSB7Ci0JCWludCBhZiA9IChHQUZSKGdwaW8pID4+ICgoZ3BpbyAmIDB4ZikgKiAyKSkgJiAweDM7Ci0JCWludCBkaXIgPSBHUERSKGdwaW8pICYgR1BJT19iaXQoZ3Bpbyk7Ci0KLQkJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChncGlvKSkKLQkJCXJldHVybiBhZiAhPSAxIHx8IGRpciA9PSAwOwotCQllbHNlCi0JCQlyZXR1cm4gYWYgIT0gMCB8fCBkaXIgIT0gMDsKLQl9IGVsc2UKLQkJcmV0dXJuIEdQRFIoZ3BpbykgJiBHUElPX2JpdChncGlvKTsKLX0KLQogI2luY2x1ZGUgPHBsYXQvZ3Bpby5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IGRlNjNjYTMuLjgxODQ2NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0zNiwyMiArMzYsMjMgQEAKICAqIE5vdGUgdGhhdCBub3QgYWxsIFBYQTJ4eCBjaGlwcyBpbXBsZW1lbnQgYWxsIHRob3NlIGFkZHJlc3NlcywgYW5kIHRoZQogICoga2VybmVsIG9ubHkgbWFwcyB0aGUgbWluaW11bSBuZWVkZWQgcmFuZ2Ugb2YgdGhpcyBtYXBwaW5nLgogICovCi0jZGVmaW5lIGlvX3Aydih4KSAoMHhmMjAwMDAwMCArICgoeCkgJiAweDAxZmZmZmZmKSArICgoKHgpICYgMHgxYzAwMDAwMCkgPj4gMSkpCiAjZGVmaW5lIGlvX3YycCh4KSAoMHgzYzAwMDAwMCArICgoeCkgJiAweDAxZmZmZmZmKSArICgoKHgpICYgMHgwZTAwMDAwMCkgPDwgMSkpCisjZGVmaW5lIGlvX3Aydih4KSBJT01FTSgweGYyMDAwMDAwICsgKCh4KSAmIDB4MDFmZmZmZmYpICsgKCgoeCkgJiAweDFjMDAwMDAwKSA+PiAxKSkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotIyBkZWZpbmUgX19SRUcoeCkJKCooKHZvbGF0aWxlIHUzMiAqKWlvX3Aydih4KSkpCisjIGRlZmluZSBJT01FTSh4KSAoKHZvaWQgX19pb21lbSAqKSh4KSkKKyMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1MzIgX19pb21lbSAqKWlvX3Aydih4KSkpCiAKIC8qIFdpdGggaW5kZXhlZCByZWdzIHdlIGRvbid0IHdhbnQgdG8gZmVlZCB0aGUgaW5kZXggdGhyb3VnaCBpb19wMnYoKQogICAgZXNwZWNpYWxseSBpZiBpdCBpcyBhIHZhcmlhYmxlLCBvdGhlcndpc2UgaG9ycmlibGUgY29kZSB3aWxsIHJlc3VsdC4gKi8KICMgZGVmaW5lIF9fUkVHMih4LHkpCVwKLQkoKih2b2xhdGlsZSB1MzIgKikoKHUzMikmX19SRUcoeCkgKyAoeSkpKQorCSgqKHZvbGF0aWxlIHUzMiBfX2lvbWVtKikoKHUzMikmX19SRUcoeCkgKyAoeSkpKQogCiAjIGRlZmluZSBfX1BSRUcoeCkJKGlvX3YycCgodTMyKSYoeCkpKQogCiAjZWxzZQogCisjIGRlZmluZSBJT01FTSh4KQl4IAogIyBkZWZpbmUgX19SRUcoeCkJaW9fcDJ2KHgpCiAjIGRlZmluZSBfX1BSRUcoeCkJaW9fdjJwKHgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9saXR0bGV0b24uaAppbmRleCAyYTU3MjZjLi5iNjIzOGNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbGl0dGxldG9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xpdHRsZXRvbi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0xJVFRMRVRPTl9ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfTElUVExFVE9OX0gKIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby1weGEuaD4KIAogI2RlZmluZSBMSVRUTEVUT05fRVRIX1BIWVMJMHgzMDAwMDAwMAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbHBkMjcwLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbHBkMjcwLmgKaW5kZXggY2QwNzAwOS4uNGVkYzcxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL2xwZDI3MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9scGQyNzAuaApAQCAtMTMsMTMgKzEzLDEzIEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfTFBEMjcwX0gKIAogI2RlZmluZSBMUEQyNzBfQ1BMRF9QSFlTCVBYQV9DUzJfUEhZUwotI2RlZmluZSBMUEQyNzBfQ1BMRF9WSVJUCTB4ZjAwMDAwMDAKKyNkZWZpbmUgTFBEMjcwX0NQTERfVklSVAlJT01FTSgweGYwMDAwMDAwKQogI2RlZmluZSBMUEQyNzBfQ1BMRF9TSVpFCTB4MDAxMDAwMDAKIAogI2RlZmluZSBMUEQyNzBfRVRIX1BIWVMJCShQWEFfQ1MyX1BIWVMgKyAweDAxMDAwMDAwKQogCiAvKiBDUExEIHJlZ2lzdGVycyAgKi8KLSNkZWZpbmUgTFBEMjcwX0NQTERfUkVHKHgpCSgodW5zaWduZWQgbG9uZykoTFBEMjcwX0NQTERfVklSVCArICh4KSkpCisjZGVmaW5lIExQRDI3MF9DUExEX1JFRyh4KQkoTFBEMjcwX0NQTERfVklSVCArICh4KSkKICNkZWZpbmUgTFBEMjcwX0NPTlRST0wJCUxQRDI3MF9DUExEX1JFRygweDAwKQogI2RlZmluZSBMUEQyNzBfUEVSSVBIRVJBTDAJTFBEMjcwX0NQTERfUkVHKDB4MDQpCiAjZGVmaW5lIExQRDI3MF9QRVJJUEhFUkFMMQlMUEQyNzBfQ1BMRF9SRUcoMHgwOCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1YTU5Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQotICogQ29weXJpZ2h0OgkoQykgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLS8qCi0gKiBQaHlzaWNhbCBEUkFNIG9mZnNldC4KLSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4YTAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL210ZC14aXAuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9tdGQteGlwLmgKaW5kZXggMjk3Mzg3ZS4uOTkwZDJiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL210ZC14aXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvbXRkLXhpcC5oCkBAIC0xNiw3ICsxNiw2IEBACiAjZGVmaW5lIF9fQVJDSF9QWEFfTVREX1hJUF9IX18KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1vc3QuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtaW50Yy5oPgogCiAjZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbTI3eC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG0yN3guaAppbmRleCAwYTVlNWVhLi5mODBiYmUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbTI3eC5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtMjd4LmgKQEAgLTM0LDcgKzM0LDcgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBwYWxtMjd4X2xjZF9pbml0KGludCBwb3dlciwKIAkJCQkJc3RydWN0IHB4YWZiX21vZGVfaW5mbyAqbW9kZSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHBhbG0yN3hfbGNkX2luaXQoaW50IHBvd2VyLCBzdHJ1Y3QgcHhhZmJfbW9kZV9pbmZvICptb2RlKSB7fQorI2RlZmluZSBwYWxtMjd4X2xjZF9pbml0KHBvd2VyLCBtb2RlKQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCiAjaWYJZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9QWEEyN1gpIHx8IFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdHguaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9wYWxtdHguaAppbmRleCAxMGFiYzRmLi43MDc0YTZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcGFsbXR4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3BhbG10eC5oCkBAIC03MSw3ICs3MSw3IEBACiAKIC8qIFZhcmlvdXMgYWRkcmVzc2VzICAqLwogI2RlZmluZSBQQUxNVFhfUENNQ0lBX1BIWVMJMHgyODAwMDAwMAotI2RlZmluZSBQQUxNVFhfUENNQ0lBX1ZJUlQJMHhmMDAwMDAwMAorI2RlZmluZSBQQUxNVFhfUENNQ0lBX1ZJUlQJSU9NRU0oMHhmMDAwMDAwMCkKICNkZWZpbmUgUEFMTVRYX1BDTUNJQV9TSVpFCTB4MTAwMDAwCiAKICNkZWZpbmUgUEFMTVRYX1BIWVNfUkFNX1NUQVJUCTB4YTAwMDAwMDAKQEAgLTg0LDggKzg0LDggQEAKIAogI2RlZmluZSBQQUxNVFhfTkFORF9BTEVfUEhZUwkoUEFMTVRYX1BIWVNfTkFORF9TVEFSVCB8ICgxIDw8IDI0KSkKICNkZWZpbmUgUEFMTVRYX05BTkRfQ0xFX1BIWVMJKFBBTE1UWF9QSFlTX05BTkRfU1RBUlQgfCAoMSA8PCAyNSkpCi0jZGVmaW5lIFBBTE1UWF9OQU5EX0FMRV9WSVJUCTB4ZmYxMDAwMDAKLSNkZWZpbmUgUEFMTVRYX05BTkRfQ0xFX1ZJUlQJMHhmZjIwMDAwMAorI2RlZmluZSBQQUxNVFhfTkFORF9BTEVfVklSVAlJT01FTSgweGZmMTAwMDAwKQorI2RlZmluZSBQQUxNVFhfTkFORF9DTEVfVklSVAlJT01FTSgweGZmMjAwMDAwKQogCiAvKiBUT1VDSFNDUkVFTiAqLwogI2RlZmluZSBBQzk3X0xJTktfRlJBTUUJCQkyMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTI3eC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTI3eC5oCmluZGV4IGI5YjFiZGMuLjdjZmY2NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEyN3guaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhMjd4LmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fTUFDSF9QWEEyN3hfSAogI2RlZmluZSBfX01BQ0hfUFhBMjd4X0gKIAorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyeHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvbWZwLXB4YTI3eC5oPgpAQCAtMjEsNiArMjIsNyBAQAogZXh0ZXJuIHZvaWQgX19pbml0IHB4YTI3eF9tYXBfaW8odm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgcHhhMjd4X2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIGludCBfX2luaXQgcHhhMjd4X3NldF9wd3Jtb2RlKHVuc2lnbmVkIGludCBtb2RlKTsKK2V4dGVybiB2b2lkIHB4YTI3eF9jcHVfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAogI2RlZmluZSBweGEyN3hfaGFuZGxlX2lycQlpY2hwX2hhbmRsZV9pcnEKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTk1eC5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTk1eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjA5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTV4LmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fTUFDSF9QWEE5NVhfSAorI2RlZmluZSBfX01BQ0hfUFhBOTVYX0gKKworI2luY2x1ZGUgPG1hY2gvcHhhM3h4Lmg+CisjaW5jbHVkZSA8bWFjaC9tZnAtcHhhOTMwLmg+CisKKyNlbmRpZiAvKiBfX01BQ0hfUFhBOTVYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YWZiLmgKaW5kZXggMDFhNDVhYzQuLjQ4NmI0YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGFmYi5oCkBAIC0xNTgsNSArMTU4LDE4IEBACiB2b2lkIHB4YV9zZXRfZmJfaW5mbyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBweGFmYl9tYWNoX2luZm8gKik7CiB1bnNpZ25lZCBsb25nIHB4YWZiX2dldF9oc3luY190aW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKKyNpZmRlZiBDT05GSUdfRkJfUFhBX1NNQVJUUEFORUwKIGV4dGVybiBpbnQgcHhhZmJfc21hcnRfcXVldWUoc3RydWN0IGZiX2luZm8gKmluZm8sIHVpbnQxNl90ICpjbWRzLCBpbnQpOwogZXh0ZXJuIGludCBweGFmYl9zbWFydF9mbHVzaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcHhhZmJfc21hcnRfcXVldWUoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJICAgIHVpbnQxNl90ICpjbWRzLCBpbnQgbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHhhZmJfc21hcnRfZmx1c2goc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9zbWVtYy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3NtZW1jLmgKaW5kZXggNjU0YWRjOS4uYjdkZTQ3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3NtZW1jLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3NtZW1jLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2RlZmluZSBQWEEyWFhfU01FTUNfQkFTRQkweDQ4MDAwMDAwCiAjZGVmaW5lIFBYQTNYWF9TTUVNQ19CQVNFCTB4NGEwMDAwMDAKLSNkZWZpbmUgU01FTUNfVklSVAkJMHhmNjAwMDAwMAorI2RlZmluZSBTTUVNQ19WSVJUCQlJT01FTSgweGY2MDAwMDAwKQogCiAjZGVmaW5lIE1EQ05GRwkJKFNNRU1DX1ZJUlQgKyAweDAwKSAgLyogU0RSQU0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwICovCiAjZGVmaW5lIE1EUkVGUgkJKFNNRU1DX1ZJUlQgKyAweDA0KSAgLyogU0RSQU0gUmVmcmVzaCBDb250cm9sIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvemV1cy5oIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3pldXMuaAppbmRleCAwNjQxZjMxLi41NjAyNGY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvemV1cy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC96ZXVzLmgKQEAgLTY4LDcgKzY4LDcgQEAKICAqIEJlIGdlbnRsZSwgYW5kIHJlbWFwIHRoYXQgb3ZlciAzMmtCLi4uCiAgKi8KIAotI2RlZmluZSBaRVVTX0NQTEQJCSgweGYwMDAwMDAwKQorI2RlZmluZSBaRVVTX0NQTEQJCUlPTUVNKDB4ZjAwMDAwMDApCiAjZGVmaW5lIFpFVVNfQ1BMRF9WRVJTSU9OCShaRVVTX0NQTEQgKyAweDAwMDApCiAjZGVmaW5lIFpFVVNfQ1BMRF9JU0FfSVJRCShaRVVTX0NQTEQgKyAweDEwMDApCiAjZGVmaW5lIFpFVVNfQ1BMRF9DT05UUk9MCShaRVVTX0NQTEQgKyAweDIwMDApCkBAIC03Niw3ICs3Niw3IEBACiAvKiBDUExEIHJlZ2lzdGVyIGJpdHMgKi8KICNkZWZpbmUgWkVVU19DUExEX0NPTlRST0xfQ0ZfUlNUICAgICAgICAweDAxCiAKLSNkZWZpbmUgWkVVU19QQzEwNElPCQkoMHhmMTAwMDAwMCkKKyNkZWZpbmUgWkVVU19QQzEwNElPCQlJT01FTSgweGYxMDAwMDAwKQogCiAjZGVmaW5lIFpFVVNfU1JBTV9TSVpFCQkoMjU2ICogMTAyNCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3p5bG9uaXRlLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvenlsb25pdGUuaAppbmRleCBlYTI0OTk4Li5lY2NhOTc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvenlsb25pdGUuaAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvenlsb25pdGUuaApAQCAtMTksNyArMTksNyBAQAogZXh0ZXJuIGludCBsY2RfaWQ7CiBleHRlcm4gaW50IGxjZF9vcmllbnRhdGlvbjsKIAotI2lmZGVmIENPTkZJR19DUFVfUFhBMzAwCisjaWZkZWYgQ09ORklHX01BQ0hfWllMT05JVEUzMDAKIGV4dGVybiB2b2lkIHp5bG9uaXRlX3B4YTMwMF9pbml0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB6eWxvbml0ZV9weGEzMDBfaW5pdCh2b2lkKQpAQCAtMjksNyArMjksNyBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQ1BVX1BYQTMyMAorI2lmZGVmIENPTkZJR19NQUNIX1pZTE9OSVRFMzIwCiBleHRlcm4gdm9pZCB6eWxvbml0ZV9weGEzMjBfaW5pdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgenlsb25pdGVfcHhhMzIwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKaW5kZXggY2E2MDc1Ny4uNTMyYzVkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKQEAgLTExLDcgKzExLDYgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMywxMSArMjIsMTEgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKLSNkZWZpbmUgSVJRX0JBU0UJCSh2b2lkIF9faW9tZW0gKilpb19wMnYoMHg0MGQwMDAwMCkKKyNkZWZpbmUgSVJRX0JBU0UJCWlvX3AydigweDQwZDAwMDAwKQogCiAjZGVmaW5lIElDSVAJCQkoMHgwMDApCiAjZGVmaW5lIElDTVIJCQkoMHgwMDQpCkBAIC02NSw3ICs2NCw3IEBACiAJCTB4NDBkMDAxMzAsCiAJfTsKIAotCXJldHVybiAodm9pZCBfX2lvbWVtICopaW9fcDJ2KHBoeXNfYmFzZVtpXSk7CisJcmV0dXJuIGlvX3AydihwaHlzX2Jhc2VbaV0pOwogfQogCiB2b2lkIHB4YV9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9saXR0bGV0b24uYyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCmluZGV4IDhmOTdlMTUuLjdiMzI0ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2xpdHRsZXRvbi5jCkBAIC0zMjUsOCArMzI1LDkgQEAKIAogc3RhdGljIHN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhIGxpdHRsZXRvbl9uYW5kX2luZm8gPSB7CiAJLmVuYWJsZV9hcmJpdGVyCT0gMSwKLQkucGFydHMJCT0gbGl0dGxldG9uX25hbmRfcGFydGl0aW9ucywKLQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGxpdHRsZXRvbl9uYW5kX3BhcnRpdGlvbnMpLAorCS5udW1fY3MJCT0gMSwKKwkucGFydHNbMF0JPSBsaXR0bGV0b25fbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUobGl0dGxldG9uX25hbmRfcGFydGl0aW9ucyksCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgbGl0dGxldG9uX2luaXRfbmFuZCh2b2lkKQpAQCAtNDM3LDcgKzQzOCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTElUVExFVE9OLCAiTWFydmVsbCBGb3JtIEZhY3RvciBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIExpdHRsZXRvbikiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5ucl9pcnFzCT0gTElUVExFVE9OX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhM3h4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYwppbmRleCBjMTcxZDZlLi4xZGQ1MzAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYwpAQCAtMTIsNyArMTIsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KIAogI2luY2x1ZGUgPG1hY2gvcHhhMjd4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9scGQyNzAuaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGFmYi5oPgpAQCAtNDgwLDcgKzQ3OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgbHBkMjcwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsKLQkJLnZpcnR1YWwJPSBMUEQyNzBfQ1BMRF9WSVJULAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKUxQRDI3MF9DUExEX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihMUEQyNzBfQ1BMRF9QSFlTKSwKIAkJLmxlbmd0aAkJPSBMUEQyNzBfQ1BMRF9TSVpFLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCkBAIC00OTksNyArNDk4LDcgQEAKIAogTUFDSElORV9TVEFSVChMT0dJQ1BEX1BYQTI3MCwgIkxvZ2ljUEQgUFhBMjcwIENhcmQgRW5naW5lIikKIAkvKiBNYWludGFpbmVyOiBQZXRlciBCYXJhZGEgKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbHBkMjcwX21hcF9pbywKIAkubnJfaXJxcwk9IExQRDI3MF9OUl9JUlFTLAogCS5pbml0X2lycQk9IGxwZDI3MF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwppbmRleCBhOGM2OTZiLi5jNDhjZTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC00Miw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEyNXguaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9sdWJib2NrLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCmluZGV4IDVmZTViY2QuLjRiNzk2YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAKIAogTUFDSElORV9TVEFSVChNQUdJQ0lBTiwgIkhUQyBNYWdpY2lhbiIpCi0JLmJvb3RfcGFyYW1zID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgPSAweDEwMCwKIAkubWFwX2lvID0gcHhhMjd4X21hcF9pbywKIAkubnJfaXJxcyA9IE1BR0lDSUFOX05SX0lSUVMsCiAJLmluaXRfaXJxID0gcHhhMjd4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWFpbnN0b25lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwppbmRleCA0NjIyZWI3Li4wNTY3ZDM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYwpAQCAtMTIsNyArMTIsNyBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KQEAgLTQzLDcgKzQzLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogCiAjaW5jbHVkZSA8bWFjaC9weGEyN3guaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL21haW5zdG9uZS5oPgogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KICNpbmNsdWRlIDxtYWNoL3B4YWZiLmg+CkBAIC02MTYsNyArNjE1LDcgQEAKIAogTUFDSElORV9TVEFSVChNQUlOU1RPTkUsICJJbnRlbCBIQ0REQkJWQTAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0gKGFrYSBNYWluc3RvbmUpIikKIAkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAkvKiBCTE9CIGJvb3QgcGFyYW1ldGVyIHNldHRpbmcgKi8KKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwJLyogQkxPQiBib290IHBhcmFtZXRlciBzZXR0aW5nICovCiAJLm1hcF9pbwkJPSBtYWluc3RvbmVfbWFwX2lvLAogCS5ucl9pcnFzCT0gTUFJTlNUT05FX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gbWFpbnN0b25lX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbWZwLXB4YTJ4eC5jCmluZGV4IGIyNzU0NGIuLjQzYTVmNjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21mcC1weGEyeHguYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tZnAtcHhhMnh4LmMKQEAgLTEyLDE1ICsxMiwxNSBAQAogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMnh4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEyeHguaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21pb2E3MDEuYwppbmRleCA2NDgxMGY5Li5iOTM4ZmMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9taW9hNzAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWlvYTcwMS5jCkBAIC03NTEsNyArNzUxLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChNSU9BNzAxLCAiTUlPIEE3MDEiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSAmcHhhMjd4X21hcF9pbywKIAkuaW5pdF9pcnEJPSAmcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gJnB4YTI3eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbXA5MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21wOTAwLmMKaW5kZXggZmI0MDg4NjEuLjRhZjVkNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21wOTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbXA5MDAuYwpAQCAtOTIsNyArOTIsNyBAQAogCiAvKiBNYWludGFpbmVyIC0gTWljaGFlbCBQZXRjaGtvdnNreSA8bWtwZXRjaEBpbnRlcm5vZGUub24ubmV0PiAqLwogTUFDSElORV9TVEFSVChORUNfTVA5MDAsICJNb2JpbGVQcm85MDAvQyIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDIyMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDIyMDEwMCwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbXhtOHgxMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbXhtOHgxMC5jCmluZGV4IGI1YThmZDMuLjkwOTI4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL214bTh4MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9teG04eDEwLmMKQEAgLTM4OSwxMCArMzg5LDExIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgbXhtXzh4MTBfbmFuZF9pbmZvID0gewotCS5lbmFibGVfYXJiaXRlciA9IDEsCi0JLmtlZXBfY29uZmlnID0gMSwKLQkucGFydHMgPSBteG1fOHgxMF9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzID0gQVJSQVlfU0laRShteG1fOHgxMF9uYW5kX3BhcnRpdGlvbnMpCisJLmVuYWJsZV9hcmJpdGVyCT0gMSwKKwkua2VlcF9jb25maWcJPSAxLAorCS5udW1fY3MJCT0gMSwKKwkucGFydHNbMF0JPSBteG1fOHgxMF9uYW5kX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzWzBdCT0gQVJSQVlfU0laRShteG1fOHgxMF9uYW5kX3BhcnRpdGlvbnMpCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXhtXzh4MTBfbmFuZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtbGQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCmluZGV4IDZiNzczNjUuLjNkNGEyODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG1sZC5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChQQUxNTEQsICJQYWxtIExpZmVEcml2ZSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHBhbG1sZF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdDUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10NS5jCmluZGV4IDliZDNlNDcuLjk5ZDZiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10NS5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChQQUxNVDUsICJQYWxtIFR1bmdzdGVufFQ1IikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjd4X21hcF9pbywKIAkucmVzZXJ2ZQk9IHBhbG10NV9yZXNlcnZlLAogCS5pbml0X2lycQk9IHB4YTI3eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10Yy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRjLmMKaW5kZXggNmFkNGE2Yy4uNmVjN2NhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRjLmMKQEAgLTUzNyw3ICs1MzcsNyBAQAogfTsKIAogTUFDSElORV9TVEFSVChQQUxNVEMsICJQYWxtIFR1bmdzdGVufEMiKQotCS5ib290X3BhcmFtcyAJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjV4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGUyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdGUyLmMKaW5kZXggNjY0MjMyZi4uOTM3NmRhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRlMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10ZTIuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTVRFMiwgIlBhbG0gVHVuZ3N0ZW58RTIiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBweGEyNXhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTI1eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHB4YTI1eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG10cmVvLmMKaW5kZXggYmIyN2Q0Yi4uOTRlOTcwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXRyZW8uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHJlby5jCkBAIC00MjMsNiArNDIzLDcgQEAKIAlwYWxtdHJlb19sZWRzX2luaXQoKTsKIH0KIAorI2lmZGVmIENPTkZJR19NQUNIX1RSRU82ODAKIHN0YXRpYyB2b2lkIF9faW5pdCB0cmVvNjgwX2luaXQodm9pZCkKIHsKIAlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRSh0cmVvNjgwX3Bpbl9jb25maWcpKTsKQEAgLTQzMCw3ICs0MzEsOSBAQAogCXBhbG0yN3hfbW1jX2luaXQoR1BJT19OUl9UUkVPX1NEX0RFVEVDVF9OLCBHUElPX05SX1RSRU82ODBfU0RfUkVBRE9OTFksCiAJCQlHUElPX05SX1RSRU82ODBfU0RfUE9XRVIsIDApOwogfQorI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTUFDSF9DRU5UUk8KIHN0YXRpYyB2b2lkIF9faW5pdCBjZW50cm9faW5pdCh2b2lkKQogewogCXB4YTJ4eF9tZnBfY29uZmlnKEFSUkFZX0FORF9TSVpFKGNlbnRybzY4NV9waW5fY29uZmlnKSk7CkBAIC00MzgsOSArNDQxLDExIEBACiAJcGFsbTI3eF9tbWNfaW5pdChHUElPX05SX1RSRU9fU0RfREVURUNUX04sIC0xLAogCQkJR1BJT19OUl9DRU5UUk9fU0RfUE9XRVIsIDEpOwogfQorI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTUFDSF9UUkVPNjgwCiBNQUNISU5FX1NUQVJUKFRSRU82ODAsICJQYWxtIFRyZW8gNjgwIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHB4YTI3eF9tYXBfaW8sCiAJLnJlc2VydmUJPSB0cmVvX3Jlc2VydmUsCiAJLmluaXRfaXJxICAgICAgID0gcHhhMjd4X2luaXRfaXJxLApAQCAtNDQ4LDkgKzQ1MywxMSBAQAogCS50aW1lciAgICAgICAgICA9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZSAgID0gdHJlbzY4MF9pbml0LAogTUFDSElORV9FTkQKKyNlbmRpZgogCisjaWZkZWYgQ09ORklHX01BQ0hfQ0VOVFJPCiBNQUNISU5FX1NUQVJUKENFTlRSTywgIlBhbG0gQ2VudHJvIDY4NSIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEyN3hfbWFwX2lvLAogCS5yZXNlcnZlCT0gdHJlb19yZXNlcnZlLAogCS5pbml0X2lycSAgICAgICA9IHB4YTI3eF9pbml0X2lycSwKQEAgLTQ1OCwzICs0NjUsNCBAQAogCS50aW1lciAgICAgICAgICA9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGNlbnRyb19pbml0LAogTUFDSElORV9FTkQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtdHguYwppbmRleCBmYzQyODU1OC4uNGUzZTQ1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXR4LmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCQkJCSB1bnNpZ25lZCBpbnQgY3RybCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgbmFuZGFkZHIgPSAodW5zaWduZWQgbG9uZyl0aGlzLT5JT19BRERSX1c7CisJY2hhciBfX2lvbWVtICpuYW5kYWRkciA9IHRoaXMtPklPX0FERFJfVzsKIAogCWlmIChjbWQgPT0gTkFORF9DTURfTk9ORSkKIAkJcmV0dXJuOwpAQCAtMzE1LDE3ICszMTUsMTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHBhbG10eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIHsKLQkudmlydHVhbAk9IFBBTE1UWF9QQ01DSUFfVklSVCwKKwkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVBBTE1UWF9QQ01DSUFfVklSVCwKIAkucGZuCQk9IF9fcGh5c190b19wZm4oUEFMTVRYX1BDTUNJQV9QSFlTKSwKIAkubGVuZ3RoCQk9IFBBTE1UWF9QQ01DSUFfU0laRSwKIAkudHlwZQkJPSBNVF9ERVZJQ0UsCiB9LCB7Ci0JLnZpcnR1YWwJPSBQQUxNVFhfTkFORF9BTEVfVklSVCwKKwkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVBBTE1UWF9OQU5EX0FMRV9WSVJULAogCS5wZm4JCT0gX19waHlzX3RvX3BmbihQQUxNVFhfTkFORF9BTEVfUEhZUyksCiAJLmxlbmd0aAkJPSBTWl8xTSwKIAkudHlwZQkJPSBNVF9ERVZJQ0UsCiB9LCB7Ci0JLnZpcnR1YWwJPSBQQUxNVFhfTkFORF9DTEVfVklSVCwKKwkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVBBTE1UWF9OQU5EX0NMRV9WSVJULAogCS5wZm4JCT0gX19waHlzX3RvX3BmbihQQUxNVFhfTkFORF9DTEVfUEhZUyksCiAJLmxlbmd0aAkJPSBTWl8xTSwKIAkudHlwZQkJPSBNVF9ERVZJQ0UsCkBAIC0zNjQsNyArMzY0LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChQQUxNVFgsICJQYWxtIFR8WCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHBhbG10eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wYWxtejcyLmMKaW5kZXggZTYxYzFjYy4uNjhlMThiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGFsbXo3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3BhbG16NzIuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFMTVo3MiwgIlBhbG0gWmlyZTcyIikKLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gcHhhMjd4X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEyN3hfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTAyNy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtMDI3LmMKaW5kZXggZmZhNjVkZi4uMGI4MjVhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcGNtMDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtMDI3LmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiBNQUNISU5FX1NUQVJUKFBDTTAyNywgIlBoeXRlYyBNZXNzdGVjaG5payBHbWJIIHBoeUNPUkUtUFhBMjcwIikKIAkvKiBNYWludGFpbmVyOiBQZW5ndXRyb25peCAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBwY20wMjdfbWFwX2lvLAogCS5ucl9pcnFzCT0gUENNMDI3X05SX0lSUVMsCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcGNtOTkwLWJhc2Vib2FyZC5jCmluZGV4IDZkNWI3ZTAuLjZkMzhjNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BjbTk5MC1iYXNlYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wY205OTAtYmFzZWJvYXJkLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAKLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyN3guaD4KQEAgLTM5NSw5ICszOTQsOSBAQAogCX0KIAogCWlmIChmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF84KQotCQlncGlvX3NldF92YWx1ZShncGlvX2J1c19zd2l0Y2gsIDEpOworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChncGlvX2J1c19zd2l0Y2gsIDEpOwogCWVsc2UKLQkJZ3Bpb19zZXRfdmFsdWUoZ3Bpb19idXNfc3dpdGNoLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZ3Bpb19idXNfc3dpdGNoLCAwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwppbmRleCA5NDhjZTNlLi41MGM4MzMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9wb29kbGUuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI1eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKaW5kZXggOWM0MzRkMi4uZjA1Zjk0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjV4LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqIGluaXRpYWxpemF0aW9uIHN0dWZmIGZvciBQWEEgbWFjaGluZXMgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gbGF0ZXIgaWYKICAqIG5lZWQgYmUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjMsMTIgKzI0LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bWFjaC9wbS5oPgpAQCAtMzI0LDcgKzMyNSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcHhhMjV4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsJLyogTWVtIEN0bCAqLwotCQkudmlydHVhbAk9IFNNRU1DX1ZJUlQsCisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpU01FTUNfVklSVCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBYQTJYWF9TTUVNQ19CQVNFKSwKIAkJLmxlbmd0aAkJPSAweDAwMjAwMDAwLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKaW5kZXggOWQyNDAwYi4uYmM1YTk4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcHhhMjd4LmMKQEAgLTExLDYgKzExLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMCwxMyArMjEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhMjd4Lmg+CiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogI2luY2x1ZGUgPG1hY2gvb2hjaS5oPgpAQCAtMzkwLDcgKzM5MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcHhhMjd4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsJLyogTWVtIEN0bCAqLwotCQkudmlydHVhbAk9IFNNRU1DX1ZJUlQsCisJCS52aXJ0dWFsCT0gKHVuc2lnbmVkIGxvbmcpU01FTUNfVklSVCwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFBYQTJYWF9TTUVNQ19CQVNFKSwKIAkJLmxlbmd0aAkJPSAweDAwMjAwMDAwLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC11bHBpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHgtdWxwaS5jCmluZGV4IGNlNzE2OGIuLmUyOGRmYjg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHgtdWxwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC11bHBpLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHB4YTN4eF91MmRfc3RhcnRfaGMpOwogCiB2b2lkIHB4YTN4eF91MmRfc3RvcF9oYyhzdHJ1Y3QgdXNiX2J1cyAqaG9zdCkKIHsKQEAgLTI3Nyw2ICsyNzgsNyBAQAogCiAJY2xrX2Rpc2FibGUodTJkLT5jbGspOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHhhM3h4X3UyZF9zdG9wX2hjKTsKIAogc3RhdGljIGludCBweGEzeHhfdTJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEzeHguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCmluZGV4IGI1Y2Q5ZTUuLjA3MzdjNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTN4eC5jCkBAIC0xMiw3ICsxMiw2IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI2LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KICNpbmNsdWRlIDxtYWNoL29oY2kuaD4KQEAgLTM5NCw3ICszOTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHB4YTN4eF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7CS8qIE1lbSBDdGwgKi8KLQkJLnZpcnR1YWwJPSBTTUVNQ19WSVJULAorCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVNNRU1DX1ZJUlQsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihQWEEzWFhfU01FTUNfQkFTRSksCiAJCS5sZW5ndGgJCT0gMHgwMDIwMDAwMCwKIAkJLnR5cGUJCT0gTVRfREVWSUNFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGE5NXguYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTk1eC5jCmluZGV4IDBlZTE2NmIuLjUxMzcxYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTk1eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTk1eC5jCkBAIC05LDcgKzksNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMSw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEzeHgtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvcHhhOTMwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKaW5kZXggYmJjZDkwNS4uZjBjMDVmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCkBAIC0zNDYsOCArMzQ2LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSByYXVtZmVsZF9uYW5kX2luZm8gPSB7CiAJLmVuYWJsZV9hcmJpdGVyCT0gMSwKIAkua2VlcF9jb25maWcJPSAxLAotCS5wYXJ0cwkJPSByYXVtZmVsZF9uYW5kX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShyYXVtZmVsZF9uYW5kX3BhcnRpdGlvbnMpLAorCS5udW1fY3MJCT0gMSwKKwkucGFydHNbMF0JPSByYXVtZmVsZF9uYW5kX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzWzBdCT0gQVJSQVlfU0laRShyYXVtZmVsZF9uYW5kX3BhcnRpdGlvbnMpLAogfTsKIAogLyoqCkBAIC0xMDg2LDcgKzEwODcsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfUkFVTUZFTERfUkMKIE1BQ0hJTkVfU1RBUlQoUkFVTUZFTERfUkMsICJSYXVtZmVsZCBDb250cm9sbGVyIikKLQkuYm9vdF9wYXJhbXMJPSBSQVVNRkVMRF9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJhdW1mZWxkX2NvbnRyb2xsZXJfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhM3h4X2luaXRfaXJxLApAQCAtMTA5Nyw3ICsxMDk4LDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUNIX1JBVU1GRUxEX0NPTk5FQ1RPUgogTUFDSElORV9TVEFSVChSQVVNRkVMRF9DT05ORUNUT1IsICJSYXVtZmVsZCBDb25uZWN0b3IiKQotCS5ib290X3BhcmFtcwk9IFJBVU1GRUxEX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gcmF1bWZlbGRfY29ubmVjdG9yX2luaXQsCiAJLm1hcF9pbwkJPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKQEAgLTExMDgsNyArMTEwOSw3IEBACiAKICNpZmRlZiBDT05GSUdfTUFDSF9SQVVNRkVMRF9TUEVBS0VSCiBNQUNISU5FX1NUQVJUKFJBVU1GRUxEX1NQRUFLRVIsICJSYXVtZmVsZCBTcGVha2VyIikKLQkuYm9vdF9wYXJhbXMJPSBSQVVNRkVMRF9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHJhdW1mZWxkX3NwZWFrZXJfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhM3h4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc2Fhci5jCmluZGV4IDcyMDAxZWMuLmZjMmMxZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NhYXIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zYWFyLmMKQEAgLTU5Niw3ICs1OTYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNBQVIsICJQWEE5MzAgSGFuZGhlbGQgUGxhdGZvcm0gKGFrYSBTQUFSKSIpCiAJLyogTWFpbnRhaW5lcjogRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEzeHhfbWFwX2lvLAogCS5pbml0X2lycSAgICAgICA9IHB4YTN4eF9pbml0X2lycSwKIAkuaGFuZGxlX2lycSAgICAgICA9IHB4YTN4eF9oYW5kbGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvc2FhcmIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NhYXJiLmMKaW5kZXggZWJkNjM3OS4uM2U5OTllMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc2FhcmIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9zYWFyYi5jCkBAIC05LDEyICs5LDEzIEBACiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqICBwdWJsaXNoaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3B4YS1pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvODhwbTg2MHguaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTIzLDcgKzI0LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9tZnAuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGE5MzAuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTk1eC5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC0xMDMsNyArMTA0LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTQUFSQiwgIlBYQTk1NSBIYW5kaGVsZCBQbGF0Zm9ybSAoYWthIFNBQVJCKSIpCi0JLmJvb3RfcGFyYW1zICAgID0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQgICAgPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEzeHhfbWFwX2lvLAogCS5ucl9pcnFzCT0gU0FBUkJfTlJfSVJRUywKIAkuaW5pdF9pcnEgICAgICAgPSBweGE5NXhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwppbmRleCBkOGRlYzkxLi45NTNhOTE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3N0YXJnYXRlMi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvc3RhcmdhdGUyLmMKaW5kZXggM2Y4ZDBhZi4uNGM5YTQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvc3RhcmdhdGUyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc3RhcmdhdGUyLmMKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAJLmhhbmRsZV9pcnEJPSBweGEyN3hfaGFuZGxlX2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gaW1vdGUyX2luaXQsCi0JLmJvb3RfcGFyYW1zCT0gMHhBMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApAQCAtMTAxNiw2ICsxMDE2LDYgQEAKIAkuaGFuZGxlX2lycSA9IHB4YTI3eF9oYW5kbGVfaXJxLAogCS50aW1lciA9ICZweGFfdGltZXIsCiAJLmluaXRfbWFjaGluZSA9IHN0YXJnYXRlMl9pbml0LAotCS5ib290X3BhcmFtcyA9IDB4QTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiBNQUNISU5FX0VORAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIuYwppbmRleCAzMmZiNThlLi5hZDQ3YmI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90YXZvcmV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiLmMKQEAgLTQ4OSw3ICs0ODksNyBAQAogCiBNQUNISU5FX1NUQVJUKFRBVk9SRVZCLCAiUFhBOTMwIEV2YWx1YXRpb24gQm9hcmQgKGFrYSBUYXZvckVWQikiKQogCS8qIE1haW50YWluZXI6IEVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiAqLwotCS5ib290X3BhcmFtcyAgICA9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gcHhhM3h4X21hcF9pbywKIAkuaW5pdF9pcnEgICAgICAgPSBweGEzeHhfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEgICAgICAgPSBweGEzeHhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Rhdm9yZXZiMy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIzLmMKaW5kZXggZmQ1YThlYS4uZmQ1NjkxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdGF2b3JldmIzLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFRBVk9SRVZCMywgIlBYQTk1MCBFdmFsdWF0aW9uIEJvYXJkIChha2EgVGF2b3JFVkIzKSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvICAgICAgICAgPSBweGEzeHhfbWFwX2lvLAogCS5ucl9pcnFzCT0gVEFWT1JFVkIzX05SX0lSUVMsCiAJLmluaXRfaXJxICAgICAgID0gcHhhM3h4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKaW5kZXggYzA0MTc1MC4uMWFhZWQyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgpAQCAtNTU0LDcgKzU1NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoVFJJWkVQUzQsICJLZWl0aCB1bmQgS29lcCBUcml6ZXBzIElWIG1vZHVsZSIpCiAJLyogTUFJTlRBSU5FUigiSsO8cmdlbiBTY2hpbmRlbGUiKSAqLwotCS5ib290X3BhcmFtcwk9IFRSSVpFUFM0X1NEUkFNX0JBU0UgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9tYWNoaW5lCT0gdHJpemVwczRfaW5pdCwKIAkubWFwX2lvCQk9IHRyaXplcHM0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBweGEyN3hfaW5pdF9pcnEsCkBAIC01NjQsNyArNTY1LDcgQEAKIAogTUFDSElORV9TVEFSVChUUklaRVBTNFdMLCAiS2VpdGggdW5kIEtvZXAgVHJpemVwcyBJVi1XTCBtb2R1bGUiKQogCS8qIE1BSU5UQUlORVIoIkrDvHJnZW4gU2NoaW5kZWxlIikgKi8KLQkuYm9vdF9wYXJhbXMJPSBUUklaRVBTNF9TRFJBTV9CQVNFICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHRyaXplcHM0X2luaXQsCiAJLm1hcF9pbwkJPSB0cml6ZXBzNF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZpcGVyLmMKaW5kZXggZDRhM2RjNy4uMjQyZGRhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdmlwZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS92aXBlci5jCkBAIC05OTIsNyArOTkyLDcgQEAKIAogTUFDSElORV9TVEFSVChWSVBFUiwgIkFyY29tL0V1cm90ZWNoIFZJUEVSIFNCQyIpCiAJLyogTWFpbnRhaW5lcjogTWFyYyBaeW5naWVyIDxtYXpAbWlzdGVyam9uZXMub3JnPiAqLwotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB2aXBlcl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gdmlwZXJfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBweGEyNXhfaGFuZGxlX2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3ZwYWMyNzAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3ZwYWMyNzAuYwppbmRleCA1Zjg0OTBhLi5hNzUzOWE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS92cGFjMjcwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdnBhYzI3MC5jCkBAIC03MTYsNyArNzE2LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChWUEFDMjcwLCAiVm9pcGFjIFBYQTI3MCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMKaW5kZXggOTM3YzQyOC4uNzBlMTczMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoWENFUCwgIklza3JhdGVsIFhDRVAiKQotCS5ib290X3BhcmFtcwk9IDB4YTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfbWFjaGluZQk9IHhjZXBfaW5pdCwKIAkubWFwX2lvCQk9IHB4YTI1eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjV4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvejIuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3oyLmMKaW5kZXggNmM5Mjc1YS4uZWFkMzJjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvejIuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS96Mi5jCkBAIC02ODYsNyArNjg2LDggQEAKIAkgKi8KIAlQU1BSID0gMHgwOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcHhhMjd4X2NwdV9zdXNwZW5kKFBXUk1PREVfREVFUFNMRUVQLCBQTEFUX1BIWVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQpOworCXB4YTI3eF9zZXRfcHdybW9kZShQV1JNT0RFX0RFRVBTTEVFUCk7CisJcHhhMjd4X2NwdV9wbV9lbnRlcihQTV9TVVNQRU5EX01FTSk7CiB9CiAjZWxzZQogI2RlZmluZSB6Ml9wb3dlcl9vZmYgICBOVUxMCkBAIC03MTgsNyArNzE5LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChaSVBJVDIsICJaaXBpdCBaMiIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTI3eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhMjd4X2luaXRfaXJxLAogCS5oYW5kbGVfaXJxCT0gcHhhMjd4X2hhbmRsZV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMgYi9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMKaW5kZXggOTljNDliYy4uNDk4YjgzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3pldXMuYwpAQCAtODYwLDI1ICs4NjAsMjUgQEAKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB6ZXVzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewogCXsKLQkJLnZpcnR1YWwgPSBaRVVTX0NQTERfVkVSU0lPTiwKKwkJLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylaRVVTX0NQTERfVkVSU0lPTiwKIAkJLnBmbiAgICAgPSBfX3BoeXNfdG9fcGZuKFpFVVNfQ1BMRF9WRVJTSU9OX1BIWVMpLAogCQkubGVuZ3RoICA9IDB4MTAwMCwKIAkJLnR5cGUgICAgPSBNVF9ERVZJQ0UsCiAJfSwKIAl7Ci0JCS52aXJ0dWFsID0gWkVVU19DUExEX0lTQV9JUlEsCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpWkVVU19DUExEX0lTQV9JUlEsCiAJCS5wZm4gICAgID0gX19waHlzX3RvX3BmbihaRVVTX0NQTERfSVNBX0lSUV9QSFlTKSwKIAkJLmxlbmd0aCAgPSAweDEwMDAsCiAJCS50eXBlICAgID0gTVRfREVWSUNFLAogCX0sCiAJewotCQkudmlydHVhbCA9IFpFVVNfQ1BMRF9DT05UUk9MLAorCQkudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKVpFVVNfQ1BMRF9DT05UUk9MLAogCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oWkVVU19DUExEX0NPTlRST0xfUEhZUyksCiAJCS5sZW5ndGggID0gMHgxMDAwLAogCQkudHlwZSAgICA9IE1UX0RFVklDRSwKIAl9LAogCXsKLQkJLnZpcnR1YWwgPSBaRVVTX1BDMTA0SU8sCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpWkVVU19QQzEwNElPLAogCQkucGZuICAgICA9IF9fcGh5c190b19wZm4oWkVVU19QQzEwNElPX1BIWVMpLAogCQkubGVuZ3RoICA9IDB4MDA4MDAwMDAsCiAJCS50eXBlICAgID0gTVRfREVWSUNFLApAQCAtOTA0LDcgKzkwNCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQVJDT01fWkVVUywgIkFyY29tL0V1cm90ZWNoIFpFVVMiKQogCS8qIE1haW50YWluZXI6IE1hcmMgWnluZ2llciA8bWF6QG1pc3RlcmpvbmVzLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSAweGEwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gemV1c19tYXBfaW8sCiAJLm5yX2lycXMJPSBaRVVTX05SX0lSUVMsCiAJLmluaXRfaXJxCT0gemV1c19pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMgYi9hcmNoL2FybS9tYWNoLXB4YS96eWxvbml0ZS5jCmluZGV4IDE1ZWM2NmIuLjZjMzljMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3p5bG9uaXRlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvenlsb25pdGUuYwpAQCAtMzY2LDggKzM2Niw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHhhM3h4X25hbmRfcGxhdGZvcm1fZGF0YSB6eWxvbml0ZV9uYW5kX2luZm8gPSB7CiAJLmVuYWJsZV9hcmJpdGVyCT0gMSwKLQkucGFydHMJCT0genlsb25pdGVfbmFuZF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoenlsb25pdGVfbmFuZF9wYXJ0aXRpb25zKSwKKwkubnVtX2NzCQk9IDEsCisJLnBhcnRzWzBdCT0genlsb25pdGVfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0c1swXQk9IEFSUkFZX1NJWkUoenlsb25pdGVfbmFuZF9wYXJ0aXRpb25zKSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB6eWxvbml0ZV9pbml0X25hbmQodm9pZCkKQEAgLTQyMiw3ICs0MjMsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFpZTE9OSVRFLCAiUFhBM3h4IFBsYXRmb3JtIERldmVsb3BtZW50IEtpdCAoYWthIFp5bG9uaXRlKSIpCi0JLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHB4YTN4eF9tYXBfaW8sCiAJLm5yX2lycXMJPSBaWUxPTklURV9OUl9JUlFTLAogCS5pbml0X2lycQk9IHB4YTN4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ob3RwbHVnLmMKaW5kZXggYTg3NTIzZC4uYWMxYWVkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ob3RwbHVnLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ob3RwbHVnLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAkJICAgIDoKIAkJICAgIDogIm1lbW9yeSIsICJjYyIpOwogCi0JCWlmIChwZW5fcmVsZWFzZSA9PSBjcHUpIHsKKwkJaWYgKHBlbl9yZWxlYXNlID09IGNwdV9sb2dpY2FsX21hcChjcHUpKSB7CiAJCQkvKgogCQkJICogT0ssIHByb3BlciB3YWtldXAsIHdlJ3JlIGRvbmUKIAkJCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggOTBiNjg3Yy4uOGNjMzcyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMCwzMCArMTAsMTcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1JFQUxWSUVXX0VCKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTUFDSF9SRUFMVklFV19QQjExTVApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCQTgpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19NQUNIX1JFQUxWSUVXX1BCWCkKLSNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKKyNpZmRlZiBDT05GSUdfREVCVUdfUkVBTFZJRVdfU1REX1BPUlQKICNkZWZpbmUgREVCVUdfTExfVUFSVF9PRkZTRVQJMHgwMDAwOTAwMAotI2VsaWYgREVCVUdfTExfVUFSVF9PRkZTRVQgIT0gMHgwMDAwOTAwMAotI3dhcm5pbmcgIkRFQlVHX0xMX1VBUlRfT0ZGU0VUIGFscmVhZHkgZGVmaW5lZCB0byBhIGRpZmZlcmVudCB2YWx1ZSIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUFDSF9SRUFMVklFV19QQjExNzYKLSNpZm5kZWYgREVCVUdfTExfVUFSVF9PRkZTRVQKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RFQlVHX1JFQUxWSUVXX1BCMTE3Nl9QT1JUKQogI2RlZmluZSBERUJVR19MTF9VQVJUX09GRlNFVAkweDAwMTBjMDAwCi0jZWxpZiBERUJVR19MTF9VQVJUX09GRlNFVCAhPSAweDAwMTBjMDAwCi0jd2FybmluZyAiREVCVUdfTExfVUFSVF9PRkZTRVQgYWxyZWFkeSBkZWZpbmVkIHRvIGEgZGlmZmVyZW50IHZhbHVlIgotI2VuZGlmCiAjZW5kaWYKIAogI2lmbmRlZiBERUJVR19MTF9VQVJUX09GRlNFVAogI2Vycm9yICJVbmtub3duIFJlYWxWaWV3IHBsYXRmb3JtIgogI2VuZGlmCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjREVCVUdfTExfVUFSVF9PRkZTRVQKIAkJb3JyCVxydiwgXHJwLCAjMHhmYjAwMDAwMAlAIHZpcnR1YWwgYmFzZQogCQlvcnIJXHJwLCBccnAsICMweDEwMDAwMDAwCUAgcGh5c2ljYWwgYmFzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDk0ZmYyNzYuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsNiArMSBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQorLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwppbmRleCA3YTRlM2IxLi4wMjZjNjZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19FQiwgIkFSTS1SZWFsVmlldyBFQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSByZWFsdmlld19maXh1cCwKIAkubWFwX2lvCQk9IHJlYWx2aWV3X2ViX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHJlYWx2aWV3X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExNzYuYwppbmRleCA4NjVkNDQwLi5jMDU3NTQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKQEAgLTM4Niw3ICszODYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJFQUxWSUVXX1BCMTE3NiwgIkFSTS1SZWFsVmlldyBQQjExNzYiKQogCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gcmVhbHZpZXdfcGIxMTc2X2ZpeHVwLAogCS5tYXBfaW8JCT0gcmVhbHZpZXdfcGIxMTc2X21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHJlYWx2aWV3X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYwppbmRleCBiNDM2NDRiLi42NzFhZDZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTFtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKQEAgLTM2MCw3ICszNjAsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJFQUxWSUVXX1BCMTFNUCwgIkFSTS1SZWFsVmlldyBQQjExTVBDb3JlIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHJlYWx2aWV3X2ZpeHVwLAogCS5tYXBfaW8JCT0gcmVhbHZpZXdfcGIxMW1wX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHJlYWx2aWV3X2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCmluZGV4IDc2M2U4ZjMuLmNiZjIyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCkBAIC0zMTAsNyArMzEwLDcgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19QQkE4LCAiQVJNLVJlYWxWaWV3IFBCLUE4IikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHJlYWx2aWV3X2ZpeHVwLAogCS5tYXBfaW8JCT0gcmVhbHZpZXdfcGJhOF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKaW5kZXggM2UxZWIyZS4uNjNjNDExNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BieC5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAogTUFDSElORV9TVEFSVChSRUFMVklFV19QQlgsICJBUk0tUmVhbFZpZXcgUEJYIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gUExBVF9QSFlTX09GRlNFVCArIDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHJlYWx2aWV3X3BieF9maXh1cCwKIAkubWFwX2lvCQk9IHJlYWx2aWV3X3BieF9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA4NWVmZmZmLi42ZDI4Y2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAjMHgwMDAxMDAwMAogCQlvcnIJXHJwLCBccnAsICMweDAwMDAwZmUwCiAJCW9ycglccnYsIFxycCwgIzB4ZTAwMDAwMDAJQCB2aXJ0dWFsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9yaXNjcGMuYyBiL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jCmluZGV4IDFlMGU2MGQuLjg1NTk1OTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAogTUFDSElORV9TVEFSVChSSVNDUEMsICJBY29ybi1SaXNjUEMiKQogCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZyAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnJlc2VydmVfbHAwCT0gMSwKIAkucmVzZXJ2ZV9scDEJPSAxLAogCS5tYXBfaW8JCT0gcnBjX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMzNjcwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKiAgZnJvbSBhcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiAgQ29weXJpZ2h0IDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4IFJ1c3NlbGwgS2luZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCVVMKDB4MEMwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCA3MjQ1YTU1Li41MjYxYTdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtNiw5ICs2LDcgQEAKIAlib29sCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKIAlzZWxlY3QgQ1BVX0FSTTkyMFQKLQlzZWxlY3QgUzNDX0dQSU9fUFVMTF9VUAogCXNlbGVjdCBTM0MyNDEwX0NMT0NLCi0Jc2VsZWN0IFMzQzI0MTBfR1BJTwogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQxMAogCXNlbGVjdCBTM0MyNDEwX1BNIGlmIFBNCiAJc2VsZWN0IFMzQzI0MTBfQ1BVRlJFUSBpZiBDUFVfRlJFUV9TM0MyNFhYCkBAIC0yOCwxMSArMjYsNiBAQAogCWhlbHAKIAkgIFBvd2VyIE1hbmFnZW1lbnQgY29kZSBjb21tb24gdG8gUzNDMjQxMCBhbmQgYmV0dGVyCiAKLWNvbmZpZyBTM0MyNDEwX0dQSU8KLQlib29sCi0JaGVscAotCSAgR1BJTyBjb2RlIGZvciBTM0MyNDEwIGFuZCBzaW1pbGFyIHByb2Nlc3NvcnMKLQogY29uZmlnIFNJTVRFQ19OT1IKIAlib29sCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDgxNjk1MzUuLjc4MmZkODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDYgQEAKIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMF9ETUEpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTBfRE1BKQkrPSBkbWEubwogb2JqLSQoQ09ORklHX1MzQzI0MTBfUE0pCSs9IHBtLm8gc2xlZXAubwotb2JqLSQoQ09ORklHX1MzQzI0MTBfR1BJTykJKz0gZ3Bpby5vCiBvYmotJChDT05GSUdfUzNDMjQxMF9DUFVGUkVRKQkrPSBjcHUtZnJlcS5vCiBvYmotJChDT05GSUdfUzNDMjQxMF9QTExUQUJMRSkJKz0gcGxsLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCmluZGV4IDBkOGUwNDMuLmRiZTQzZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKQEAgLTQ3LDM4ICs0NywyNiBAQAogCQkuY2hhbm5lbHNbMF0JPSBTM0MyNDEwX0RDT05fQ0gwX1NESSB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9TREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfU0RJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfU1BJMF0gPSB7CiAJCS5uYW1lCQk9ICJzcGkwIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9TUEkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEwX1NQVERBVCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfU1BJMV0gPSB7CiAJCS5uYW1lCQk9ICJzcGkxIiwKIAkJLmNoYW5uZWxzWzNdCT0gUzNDMjQxMF9EQ09OX0NIM19TUEkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIDB4MjAgKyBTM0MyNDEwX1NQUkRBVCwKIAl9LAogCVtETUFDSF9VQVJUMF0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MCIsCiAJCS5jaGFubmVsc1swXQk9IFMzQzI0MTBfRENPTl9DSDBfVUFSVDAgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDFdID0gewogCQkubmFtZQkJPSAidWFydDEiLAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDEwX0RDT05fQ0gxX1VBUlQxIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VUlhILAogCX0sCiAgICAgICAJW0RNQUNIX1VBUlQyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQyIiwKIAkJLmNoYW5uZWxzWzNdCT0gUzNDMjQxMF9EQ09OX0NIM19VQVJUMiB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9USU1FUl0gPSB7CiAJCS5uYW1lCQk9ICJ0aW1lciIsCkBAIC05MCwxMiArNzgsMTAgQEAKIAkJLm5hbWUJCT0gImkycy1zZGkiLAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDEwX0RDT05fQ0gxX0kyU1NESSB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9JMlNTREkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKIAl9LAogCVtETUFDSF9JMlNfT1VUXSA9IHsKIAkJLm5hbWUJCT0gImkycy1zZG8iLAogCQkuY2hhbm5lbHNbMl0JPSBTM0MyNDEwX0RDT05fQ0gyX0kyU1NETyB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKIAl9LAogCVtETUFDSF9VU0JfRVAxXSA9IHsKIAkJLm5hbWUJCT0gInVzYi1lcDEiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NjRlMDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MyNDEwIEdQSU8gc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLWZucy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLWludCBzM2MyNDEwX2dwaW9faXJxZmlsdGVyKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBvbiwKLQkJCSAgIHVuc2lnbmVkIGludCBjb25maWcpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBTM0MyNFhYX0VJTkZMVDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWlmIChwaW4gPCBTM0MyNDEwX0dQRyg4KSB8fCBwaW4gPiBTM0MyNDEwX0dQRygxNSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY29uZmlnICY9IDB4ZmY7Ci0KLQlwaW4gLT0gUzNDMjQxMF9HUEcoOCk7Ci0JcmVnICs9IHBpbiAmIH4zOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogdXBkYXRlIGZpbHRlciB3aWR0aCBhbmQgY2xvY2sgc291cmNlICovCi0KLQl2YWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCXZhbCAmPSB+KDB4ZmYgPDwgKChwaW4gJiAzKSAqIDgpKTsKLQl2YWwgfD0gY29uZmlnIDw8ICgocGluICYgMykgKiA4KTsKLQlfX3Jhd193cml0ZWwodmFsLCByZWcpOwotCi0JLyogdXBkYXRlIGZpbHRlciBlbmFibGUgKi8KLQotCXZhbCA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRVhUSU5UMik7Ci0JdmFsICY9IH4oMSA8PCAoKHBpbiAqIDQpICsgMykpOwotCXZhbCB8PSBvbiA8PCAoKHBpbiAqIDQpICsgMyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgUzNDMjRYWF9FWFRJTlQyKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19pcnFmaWx0ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDU4ODJkZWEuLjQxMzVkZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgUzNDMjQxMF9VQVJUMV9PRkYgKDB4NDAwMCkKICNkZWZpbmUgU0hJRlRfMjQ0MFRYRiAoMTQtOSkKIAotCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9IFMzQzI0WFhfUEFfVUFSVAogCQlsZHIJXHJ2LCA9IFMzQzI0WFhfVkFfVUFSVAogI2lmIENPTkZJR19ERUJVR19TM0NfVUFSVCAhPSAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCBiMmIyYTViLi5hZThlNDgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9ETUFfSAogI2RlZmluZSBfX0FTTV9BUkNIX0RNQV9IIF9fRklMRV9fCiAKLSNpbmNsdWRlIDxwbGF0L2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogCiAjZGVmaW5lIE1BWF9ETUFfVFJBTlNGRVJfU0laRSAgIDB4MTAwMDAwIC8qIERhdGEgVW5pdCBpcyBoYWxmIHdvcmQgICovCkBAIC01MSw2ICs1MCwxOCBAQAogCURNQUNIX01BWCwJCS8qIHRoZSBlbmQgZW50cnkgKi8KIH07CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9pc19kbWFkZXYodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpbmNsdWRlIDxwbGF0L2RtYS5oPgorCiAjZGVmaW5lIERNQUNIX0xPV19MRVZFTAkoMTw8MjgpCS8qIHVzZSB0aGlzIHRvIHNwZWNpZml5IGhhcmR3YXJlIGNoIG5vICovCiAKIC8qIHdlIGhhdmUgNCBkbWEgY2hhbm5lbHMgKi8KQEAgLTE2Myw3ICsxNzQsNyBAQAogCXN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudDsKIAogCS8qIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwotCWVudW0gczNjMjQxMF9kbWFzcmMJIHNvdXJjZTsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgkgc291cmNlOwogCWVudW0gZG1hX2NoCQkgcmVxX2NoOwogCXVuc2lnbmVkIGxvbmcJCSBkZXZfYWRkcjsKIAl1bnNpZ25lZCBsb25nCQkgbG9hZF90aW1lb3V0OwpAQCAtMTk2LDkgKzIwNyw0IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBkbWFfZGV2aWNlX3Q7CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBzM2NfZG1hX2hhc19jaXJjdWxhcih2b2lkKQotewotCXJldHVybiBmYWxzZTsKLX0KLQogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZmIuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZmIuaAppbmRleCBlZWUwNjU0Li5hOTU3YmM4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9mYi5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZmIuaApAQCAtMSw3NCArMSBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9mYi5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+Ci0gKgotICogSW5zcGlyZWQgYnkgcHhhZmIuaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSTV9GQl9ICi0jZGVmaW5lIF9fQVNNX0FSTV9GQl9ICi0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtbGNkLmg+Ci0KLXN0cnVjdCBzM2MyNDEwZmJfaHcgewotCXVuc2lnbmVkIGxvbmcJbGNkY29uMTsKLQl1bnNpZ25lZCBsb25nCWxjZGNvbjI7Ci0JdW5zaWduZWQgbG9uZwlsY2Rjb24zOwotCXVuc2lnbmVkIGxvbmcJbGNkY29uNDsKLQl1bnNpZ25lZCBsb25nCWxjZGNvbjU7Ci19OwotCi0vKiBMQ0QgZGVzY3JpcHRpb24gKi8KLXN0cnVjdCBzM2MyNDEwZmJfZGlzcGxheSB7Ci0JLyogTENEIHR5cGUgKi8KLQl1bnNpZ25lZCB0eXBlOwotCi0JLyogU2NyZWVuIHNpemUgKi8KLQl1bnNpZ25lZCBzaG9ydCB3aWR0aDsKLQl1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0KLQkvKiBTY3JlZW4gaW5mbyAqLwotCXVuc2lnbmVkIHNob3J0IHhyZXM7Ci0JdW5zaWduZWQgc2hvcnQgeXJlczsKLQl1bnNpZ25lZCBzaG9ydCBicHA7Ci0KLQl1bnNpZ25lZCBwaXhjbG9jazsJCS8qIHBpeGNsb2NrIGluIHBpY29zZWNvbmRzICovCi0JdW5zaWduZWQgc2hvcnQgbGVmdF9tYXJnaW47ICAvKiB2YWx1ZSBpbiBwaXhlbHMgKFRGVCkgb3IgSENMS3MgKFNUTikgKi8KLQl1bnNpZ25lZCBzaG9ydCByaWdodF9tYXJnaW47IC8qIHZhbHVlIGluIHBpeGVscyAoVEZUKSBvciBIQ0xLcyAoU1ROKSAqLwotCXVuc2lnbmVkIHNob3J0IGhzeW5jX2xlbjsgICAgLyogdmFsdWUgaW4gcGl4ZWxzIChURlQpIG9yIEhDTEtzIChTVE4pICovCi0JdW5zaWduZWQgc2hvcnQgdXBwZXJfbWFyZ2luOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCi0JdW5zaWduZWQgc2hvcnQgbG93ZXJfbWFyZ2luOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCi0JdW5zaWduZWQgc2hvcnQgdnN5bmNfbGVuOwkvKiB2YWx1ZSBpbiBsaW5lcyAoVEZUKSBvciAwIChTVE4pICovCi0KLQkvKiBsY2QgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KLQl1bnNpZ25lZCBsb25nCWxjZGNvbjU7Ci19OwotCi1zdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyB7Ci0KLQlzdHJ1Y3QgczNjMjQxMGZiX2Rpc3BsYXkgKmRpc3BsYXlzOwkvKiBhdHRhY2hlZCBkaXBsYXlzIGluZm8gKi8KLQl1bnNpZ25lZCBudW1fZGlzcGxheXM7CQkJLyogbnVtYmVyIG9mIGRlZmluZWQgZGlzcGxheXMgKi8KLQl1bnNpZ25lZCBkZWZhdWx0X2Rpc3BsYXk7Ci0KLQkvKiBHUElPcyAqLwotCi0JdW5zaWduZWQgbG9uZwlncGN1cDsKLQl1bnNpZ25lZCBsb25nCWdwY3VwX21hc2s7Ci0JdW5zaWduZWQgbG9uZwlncGNjb247Ci0JdW5zaWduZWQgbG9uZwlncGNjb25fbWFzazsKLQl1bnNpZ25lZCBsb25nCWdwZHVwOwotCXVuc2lnbmVkIGxvbmcJZ3BkdXBfbWFzazsKLQl1bnNpZ25lZCBsb25nCWdwZGNvbjsKLQl1bnNpZ25lZCBsb25nCWdwZGNvbl9tYXNrOwotCi0JLyogbHBjMzYwMCBjb250cm9sIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZwlscGNzZWw7Ci19OwotCi1leHRlcm4gdm9pZCBfX2luaXQgczNjMjR4eF9mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9BUk1fRkJfSCAqLworI2luY2x1ZGUgPHBsYXQvZmItczNjMjQxMC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWZucy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLWZucy5oCmluZGV4IGJhYjEzOTIuLmM1M2FkMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tZm5zLmgKQEAgLTEsOTggKzEgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQzI0MTAgLSBoYXJkd2FyZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fTUFDSF9HUElPX0ZOU19ICi0jZGVmaW5lIF9fTUFDSF9HUElPX0ZOU19IIF9fRklMRV9fCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHRvLWJlLXJlbW92ZWQgY2F0ZWdvcnkgYW5kIGl0IGlzIHN0cm9uZ2x5Ci0gKiBlbmNvdXJhZ2VkIG5vdCB0byB1c2UgdGhlc2UgaW4gbmV3IGNvZGUuIFRoZXkgd2lsbCBiZSBtYXJrZWQgZGVwcmVjYXRlZAotICogdmVyeSBzb29uLgotICoKLSAqIE1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGVpdGhlciByZXBsYWNlZCBieSB0aGUgZ3Bpb2NmZyBjYWxscwotICogZm9yIHRoZSBzM2MgcGxhdGZvcm0gb3IgYnkgdGhlIGdlbmVyaWMgR1BJT2xpYiBBUEkuCi0gKgotICogQXMgb2YgMi42LjM1LXJjLCB0aGVzZSB3aWxsIGJlIHJlbW92ZWQsIHdpdGggdGhlIGZldyBkcml2ZXJzIHVzaW5nIHRoZW0KLSAqIGVpdGhlciByZXBsYWNlZCBvciBnaXZlbiBhIHdyYXBwZXIgdW50aWwgdGhlIGNhbGxzIGNhbiBiZSByZW1vdmVkLgotKi8KLQotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLQotc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfZ3Bpb19jZmdwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGNmZykKLXsKLQkvKiAxOjEgbWFwcGluZyBiZXR3ZWVuIGNmZ3BpbiBhbmQgc2V0Y2ZnIGNhbGxzIGF0IHRoZSBtb21lbnQgKi8KLQlzM2NfZ3Bpb19jZmdwaW4ocGluLCBjZmcpOwotfQotCi0vKiBleHRlcm5hbCBmdW5jdGlvbnMgZm9yIEdQSU8gc3VwcG9ydAotICoKLSAqIFRoZXNlIGFsbG93IHZhcmlvdXMgZGlmZmVyZW50IGNsaWVudHMgdG8gYWNjZXNzIHRoZSBzYW1lIEdQSU8KLSAqIHJlZ2lzdGVycyB3aXRob3V0IGNvbmZsaWN0aW5nLiBJZiB5b3VyIGRyaXZlciBvbmx5IG93bnMgdGhlIGVudGlyZQotICogR1BJTyByZWdpc3RlciwgdGhlbiBpdCBpcyBzYWZlIHRvIGlvcmVtYXAvX19yYXdfe3JlYWR8d3JpdGV9IHRvIGl0LgotKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0Y2ZnKHVuc2lnbmVkIGludCBwaW4pOwotCi0vKiBzM2MyNDEwX2dwaW9fZ2V0aXJxCi0gKgotICogdHVybiB0aGUgZ2l2ZW4gcGluIG51bWJlciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIElSUSBudW1iZXIKLSAqCi0gKiByZXR1cm5zOgotICoJPCAwID0gbm8gaW50ZXJydXB0IGZvciB0aGlzIHBpbgotICoJPj0wID0gaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIHBpbgotKi8KLQotZXh0ZXJuIGludCBzM2MyNDEwX2dwaW9fZ2V0aXJxKHVuc2lnbmVkIGludCBwaW4pOwotCi0vKiBzM2MyNDEwX2dwaW9faXJxZmlsdGVyCi0gKgotICogc2V0IHRoZSBpcnEgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwaW4KLSAqCi0gKiBvbiA9IDAgPT4gZGlzYWJsZSBmaWx0ZXJpbmcKLSAqICAgICAgMSA9PiBlbmFibGUgZmlsdGVyaW5nCi0gKgotICogY29uZmlnID0gUzNDMjQxMF9FSU5URkxUX1BDTEsgb3IgUzNDMjQxMF9FSU5URkxUX0VYVENMSyBvcnJlZCB3aXRoCi0gKiAgICAgICAgICB3aWR0aCBvZiBmaWx0ZXIgKDAgdGhyb3VnaCA2MykKLSAqCi0gKgotKi8KLQotZXh0ZXJuIGludCBzM2MyNDEwX2dwaW9faXJxZmlsdGVyKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBvbiwKLQkJCQkgIHVuc2lnbmVkIGludCBjb25maWcpOwotCi0vKiBzM2MyNDEwX2dwaW9fcHVsbHVwCi0gKgotICogVGhpcyBjYWxsIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHMzY19ncGlvX3NldHB1bGwoKS4KLSAqCi0gKiBBcyBhIG5vdGUsIHRoZXJlIGlzIGN1cnJlbnRseSBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHB1bGwtdXAgYW5kIHB1bGwtZG93bgotICogaW4gdGhlIHMzYzI0eHggc2VyaWVzIGRldmljZXMgd2l0aCBvbmx5IGFuIG9uL29mZiBjb25maWd1cmF0aW9uLgotICovCi0KLS8qIHMzYzI0MTBfZ3Bpb19wdWxsdXAKLSAqCi0gKiBjb25maWd1cmUgdGhlIHB1bGwtdXAgY29udHJvbCBvbiB0aGUgZ2l2ZW4gcGluCi0gKgotICogdG8gPSAxID0+IGRpc2FibGUgdGhlIHB1bGwtdXAKLSAqICAgICAgMCA9PiBlbmFibGUgdGhlIHB1bGwtdXAKLSAqCi0gKiBlZzsKLSAqCi0gKiAgIHMzYzI0MTBfZ3Bpb19wdWxsdXAoUzNDMjQxMF9HUEIoMCksIDApOwotICogICBzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFKDgpLCAwKTsKLSovCi0KLWV4dGVybiB2b2lkIHMzYzI0MTBfZ3Bpb19wdWxsdXAodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMF9ncGlvX3NldHBpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pOwotCi1leHRlcm4gdW5zaWduZWQgaW50IHMzYzI0MTBfZ3Bpb19nZXRwaW4odW5zaWduZWQgaW50IHBpbik7Ci0KLSNlbmRpZiAvKiBfX01BQ0hfR1BJT19GTlNfSCAqLworI2luY2x1ZGUgPHBsYXQvZ3Bpby1mbnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1ucnMuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1ucnMuaAppbmRleCA0ZjdiZjMyLi4wMTllYTg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tbnJzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLW5ycy5oCkBAIC01Myw3ICs1Myw3IEBACiAjZGVmaW5lIFMzQzI0MTBfR1BJT19NX05SCSgzMikJLyogdGVjaG5pY2FsbHkgMi4gKi8KIAogI2lmIENPTkZJR19TM0NfR1BJT19TUEFDRSAhPSAwCi0jZXJyb3IgQ09ORklHX1MzQ19HUElPX1NQQUNFIGNhbm5vdCBiZSB6ZXJvIGF0IHRoZSBtb21lbnQKKyNlcnJvciBDT05GSUdfUzNDX0dQSU9fU1BBQ0UgY2Fubm90IGJlIG5vbnplcm8gYXQgdGhlIG1vbWVudAogI2VuZGlmCiAKICNkZWZpbmUgUzNDMjQxMF9HUElPX05FWFQoX19ncGlvKSBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8tdHJhY2suaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby10cmFjay5oCmluZGV4IGQ2NzgxOWQuLmM0MTBhMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby10cmFjay5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby10cmFjay5oCkBAIC0xNywxMSArMTcsMTEgQEAKIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKLWV4dGVybiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW107CitleHRlcm4gc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHMzYzI0eHhfZ3Bpb3NbXTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9saWJfZ2V0Y2hpcCh1bnNpZ25lZCBpbnQgcGluKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKnNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHVuc2lnbmVkIGludCBwaW4pCiB7Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXA7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwOwogCiAJaWYgKHBpbiA+IFMzQ19HUElPX0VORCkKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGY3ZjZiMDcuLjZmYWM3MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xMSwxMSArMTEsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0KIC8qIHNvbWUgYm9hcmRzIHJlcXVpcmUgZXh0cmEgZ3BpbyBjYXBhY2l0eSB0byBzdXBwb3J0IGV4dGVybmFsCiAgKiBkZXZpY2VzIHRoYXQgbmVlZCBHUElPLgogICovCkBAIC0yOCw3ICsyMyw2IEBACiAjZGVmaW5lIEFSQ0hfTlJfR1BJT1MJKDI1NiArIENPTkZJR19TM0MyNFhYX0dQSU9fRVhUUkEpCiAjZW5kaWYKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8tbnJzLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLWZucy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2gxOTQwLWxhdGNoLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2gxOTQwLWxhdGNoLmgKaW5kZXggOTdlNDJiZi4uZmM4OTdkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9oMTk0MC1sYXRjaC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaDE5NDAtbGF0Y2guaApAQCAtMTQsNyArMTQsNyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0gxOTQwX0xBVENIX0gKICNkZWZpbmUgX19BU01fQVJDSF9IMTk0MF9MQVRDSF9ICiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAjZGVmaW5lIEgxOTQwX0xBVENIX0dQSU8oeCkJCShTM0NfR1BJT19FTkQgKyAoeCkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggZTVhNjhlYS4uZTUzYjIxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTE5MSw5ICsxOTEsOSBAQAogI2RlZmluZSBJUlFfTENEX1NZU1RFTQkJSVJRX1MzQzI0NDNfTENEMgogCiAjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCi0jZGVmaW5lIElSUV9TM0MyNDR4X0FDOTcgSVJRX1MzQzI0NDBfQUM5NworI2RlZmluZSBJUlFfUzNDMjQ0WF9BQzk3IElSUV9TM0MyNDQwX0FDOTcKICNlbHNlCi0jZGVmaW5lIElSUV9TM0MyNDR4X0FDOTcgSVJRX1MzQzI0NDNfQUM5NworI2RlZmluZSBJUlFfUzNDMjQ0WF9BQzk3IElSUV9TM0MyNDQzX0FDOTcKICNlbmRpZgogCiAvKiBPdXIgRklRcyBhcmUgcm91dGFibGUgZnJvbSBJUlFfRUlOVDAgdG8gSVJRX0FEQ1BBUkVOVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWFwLmgKaW5kZXggNDI1NTUyZC4uNzhhZTgwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC0xNCw5ICsxNCw1MyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX01BUF9ICiAKICNpbmNsdWRlIDxwbGF0L21hcC1iYXNlLmg+Ci0jaW5jbHVkZSA8cGxhdC9tYXAuaD4KIAotI2RlZmluZSBTM0MyNDEwX0FERFIoeCkJCVMzQ19BRERSKHgpCisvKgorICogUzNDMjQxMCBVQVJUIG9mZnNldCBpcyAweDQwMDAgYnV0IHRoZSBvdGhlciBTb0NzIGFyZSAweDQwMC4KKyAqIFNvIG5lZWQgdG8gZGVmaW5lIGl0LCBhbmQgaGVyZSBpcyB0byBhdm9pZCByZWRlZmluaXRpb24gd2FybmluZy4KKyAqLworI2RlZmluZSBTM0NfVUFSVF9PRkZTRVQJCSgweDQwMDApCisKKyNpbmNsdWRlIDxwbGF0L21hcC1zM2MuaD4KKworLyoKKyAqIGludGVycnVwdCBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCB0aGluZyB3ZSBwdXQgaW4sIHRvIG1ha2UKKyAqIHRoZSBhc3NlbWJseSBjb2RlIGZvciB0aGUgaXJxIGRldGVjdGlvbiBlYXNpZXIKKyAqLworI2RlZmluZSBTM0MyNDEwX1BBX0lSUQkJKDB4NEEwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfSVJRCQlTWl8xTQorCisvKiBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUzNDMjQxMF9QQV9NRU1DVFJMCSgweDQ4MDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1NaX01FTUNUUkwJU1pfMU0KKworLyogVUFSVHMgKi8KKyNkZWZpbmUgUzNDX1ZBX1VBUlR4KHVhcnQpCShTM0NfVkFfVUFSVCArICgodWFydCAqIFMzQ19VQVJUX09GRlNFVCkpKQorCisvKiBUaW1lcnMgKi8KKyNkZWZpbmUgUzNDMjQxMF9QQV9USU1FUgkoMHg1MTAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9TWl9USU1FUglTWl8xTQorCisvKiBDbG9jayBhbmQgUG93ZXIgbWFuYWdlbWVudCAqLworI2RlZmluZSBTM0MyNFhYX1NaX0NMS1BXUglTWl8xTQorCisvKiBVU0IgRGV2aWNlIHBvcnQgKi8KKyNkZWZpbmUgUzNDMjQxMF9QQV9VU0JERVYJKDB4NTIwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfVVNCREVWCVNaXzFNCisKKy8qIFdhdGNoZG9nICovCisjZGVmaW5lIFMzQzI0MTBfUEFfV0FUQ0hET0cJKDB4NTMwMDAwMDApCisjZGVmaW5lIFMzQzI0WFhfU1pfV0FUQ0hET0cJU1pfMU0KKworLyogU3RhbmRhcmQgc2l6ZSBkZWZpbml0aW9ucyBmb3IgcGVyaXBoZXJhbCBibG9ja3MuICovCisKKyNkZWZpbmUgUzNDMjRYWF9TWl9VQVJUCQlTWl8xTQorI2RlZmluZSBTM0MyNFhYX1NaX0lJUwkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9BREMJCVNaXzFNCisjZGVmaW5lIFMzQzI0WFhfU1pfU1BJCQlTWl8xTQorI2RlZmluZSBTM0MyNFhYX1NaX1NESQkJU1pfMU0KKyNkZWZpbmUgUzNDMjRYWF9TWl9OQU5ECQlTWl8xTQorI2RlZmluZSBTM0MyNFhYX1NaX0dQSU8JCVNaXzFNCiAKIC8qIFVTQiBob3N0IGNvbnRyb2xsZXIgKi8KICNkZWZpbmUgUzNDMjQxMF9QQV9VU0JIT1NUICgweDQ5MDAwMDAwKQpAQCAtNzUsMTAgKzExOSw4IEBACiAKIC8qIFMzQzI0MTIgbWVtb3J5IGFuZCBJTyBjb250cm9scyAqLwogI2RlZmluZSBTM0MyNDEyX1BBX1NTTUMJKDB4NEYwMDAwMDApCi0jZGVmaW5lIFMzQzI0MTJfVkFfU1NNQwlTM0NfQUREUl9DUFUoMHgwMDAwMDAwMCkKIAogI2RlZmluZSBTM0MyNDEyX1BBX0VCSQkoMHg0ODgwMDAwMCkKLSNkZWZpbmUgUzNDMjQxMl9WQV9FQkkJUzNDX0FERFJfQ1BVKDB4MDAwMTAwMDApCiAKIC8qIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhbGwgdGhlIGNoaXAtc2VsZWN0IGFyZWFzICovCiAKQEAgLTEwMCwxNSArMTQyLDE0IEBACiAjZGVmaW5lIFMzQzI0WFhfUEFfRE1BICAgICAgUzNDMjQxMF9QQV9ETUEKICNkZWZpbmUgUzNDMjRYWF9QQV9DTEtQV1IgICBTM0MyNDEwX1BBX0NMS1BXUgogI2RlZmluZSBTM0MyNFhYX1BBX0xDRCAgICAgIFMzQzI0MTBfUEFfTENECi0jZGVmaW5lIFMzQzI0WFhfUEFfVUFSVCAgICAgUzNDMjQxMF9QQV9VQVJUCiAjZGVmaW5lIFMzQzI0WFhfUEFfVElNRVIgICAgUzNDMjQxMF9QQV9USU1FUgogI2RlZmluZSBTM0MyNFhYX1BBX1VTQkRFViAgIFMzQzI0MTBfUEFfVVNCREVWCiAjZGVmaW5lIFMzQzI0WFhfUEFfV0FUQ0hET0cgUzNDMjQxMF9QQV9XQVRDSERPRwogI2RlZmluZSBTM0MyNFhYX1BBX0lJUyAgICAgIFMzQzI0MTBfUEFfSUlTCi0jZGVmaW5lIFMzQzI0WFhfUEFfR1BJTyAgICAgUzNDMjQxMF9QQV9HUElPCiAjZGVmaW5lIFMzQzI0WFhfUEFfUlRDICAgICAgUzNDMjQxMF9QQV9SVEMKICNkZWZpbmUgUzNDMjRYWF9QQV9BREMgICAgICBTM0MyNDEwX1BBX0FEQwogI2RlZmluZSBTM0MyNFhYX1BBX1NQSSAgICAgIFMzQzI0MTBfUEFfU1BJCisjZGVmaW5lIFMzQzI0WFhfUEFfU1BJMQkJKFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUEkxKQogI2RlZmluZSBTM0MyNFhYX1BBX1NESSAgICAgIFMzQzI0MTBfUEFfU0RJCiAjZGVmaW5lIFMzQzI0WFhfUEFfTkFORAkgICAgUzNDMjQxMF9QQV9OQU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJiOTdiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKiAgZnJvbSBhcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDMwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKaW5kZXggNDVlZWE1Mi4uMmVlZjdlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKQEAgLTY0LDQgKzY0LDQgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9yZXN0b3JlZF9ncGlvcyh2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fc2F2ZWRfZ3Bpb3Modm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2Ftc3VuZ19wbV9zYXZlZF9ncGlvcyh2b2lkKSB7IH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3MtczNjMjQ0My1jbG9jay5oCmluZGV4IDVlMDZjNzIuLmMzZmVmZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy1zM2MyNDQzLWNsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLXMzYzI0NDMtY2xvY2suaApAQCAtNjUsNiArNjUsNyBAQAogI2RlZmluZSBTM0MyNDQzX0NMS0RJVjBfUFJFRElWX01BU0sJKDM8PDQpCiAjZGVmaW5lIFMzQzI0NDNfQ0xLRElWMF9QUkVESVZfU0hJRlQJKDQpCiAKKyNkZWZpbmUgUzNDMjQxNl9DTEtESVYwX0FSTURJVl9NQVNLCSg3IDw8IDkpCiAjZGVmaW5lIFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfTUFTSwkoMTU8PDkpCiAjZGVmaW5lIFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfU0hJRlQJKDkpCiAjZGVmaW5lIFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfMQkoMDw8OSkKQEAgLTEwMiw2ICsxMDMsNyBAQAogI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fVUFSVDMJCSgxPDwzKQogI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fSUlDCQkoMTw8NCkKICNkZWZpbmUgUzNDMjQ0M19QQ0xLQ09OX1NESQkJKDE8PDUpCisjZGVmaW5lIFMzQzI0NDNfUENMS0NPTl9IU1NQSQkJKDE8PDYpCiAjZGVmaW5lIFMzQzI0NDNfUENMS0NPTl9BREMJCSgxPDw3KQogI2RlZmluZSBTM0MyNDQzX1BDTEtDT05fQUM5NwkJKDE8PDgpCiAjZGVmaW5lIFMzQzI0NDNfUENMS0NPTl9JSVMJCSgxPDw5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWFtbG01OTAwLmMKaW5kZXggZGFiYzE0MS4uNzk4Mzg5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYW1sbTU5MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1hbWxtNTkwMC5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChBTUxfTTU5MDAsICJBTUxfTTU5MDAiKQotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGFtbG01OTAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBhbWxtNTkwMF9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCmluZGV4IDFlMmQ1MzYuLmEyMGFlMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKQEAgLTY1Nyw3ICs2NTcsNyBAQAogCiBNQUNISU5FX1NUQVJUKEJBU1QsICJTaW10ZWMtQkFTVCIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGJhc3RfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGJhc3RfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCmluZGV4IDJhMmZhMDYuLjA1YTdkMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPHZpZGVvL3BsYXRmb3JtX2xjZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTY5Niw5ICs2OTcsOSBAQAogCQkJICAgICAgUzNDMjQxMF9NSVNDQ1JfVVNCU1VTUE5EMCB8CiAJCQkgICAgICBTM0MyNDEwX01JU0NDUl9VU0JTVVNQTkQxLCAweDApOwogCi0JdG1wID0gICAoMHg3OCA8PCBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQpCi0JICAgICAgfCAoMHgwMiA8PCBTM0MyNFhYX1BMTENPTl9QRElWU0hJRlQpCi0JICAgICAgfCAoMHgwMyA8PCBTM0MyNFhYX1BMTENPTl9TRElWU0hJRlQpOworCXRtcCA9ICAgKDB4NzggPDwgUzNDMjRYWF9QTExfTURJVl9TSElGVCkKKwkgICAgICB8ICgweDAyIDw8IFMzQzI0WFhfUExMX1BESVZfU0hJRlQpCisJICAgICAgfCAoMHgwMyA8PCBTM0MyNFhYX1BMTF9TRElWX1NISUZUKTsKIAl3cml0ZWwodG1wLCBTM0MyNDEwX1VQTExDT04pOwogCiAJZ3Bpb19yZXF1ZXN0KFMzQzI0MTBfR1BDKDApLCAiTENEIHBvd2VyIik7CkBAIC03NDQsNyArNzQ1LDcgQEAKIAogTUFDSElORV9TVEFSVChIMTk0MCwgIklQQVEtSDE5NDAiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBoMTk0MF9tYXBfaW8sCiAJLnJlc2VydmUJPSBoMTk0MF9yZXNlcnZlLAogCS5pbml0X2lycQk9IGgxOTQwX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYwppbmRleCAwNzlkY2FhLi4xZGMzZTMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uMzAuYwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJLyogTWFpbnRhaW5lcjogQ2hyaXN0ZXIgV2VpbmlnZWwgPGNocmlzdGVyQHdlaW5pZ2VsLnNlPiwKIAkJCQlCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+CiAJKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBuMzBfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApAQCAtNTk2LDcgKzU5Niw3IEBACiBNQUNISU5FX1NUQVJUKE4zNSwgIkFjZXItTjM1IikKIAkvKiBNYWludGFpbmVyOiBDaHJpc3RlciBXZWluaWdlbCA8Y2hyaXN0ZXJAd2VpbmlnZWwuc2U+CiAJKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBuMzBfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCmluZGV4IDBhYTE2Y2QuLmYwM2YzZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCiBNQUNISU5FX1NUQVJUKE9UT00sICJOZXggVmlzaW9uIC0gT3RvbSAxLjEiKQogCS8qIE1haW50YWluZXI6IEd1aWxsYXVtZSBHT1VSQVQgPGd1aWxsYXVtZS5nb3VyYXRAbmV4dmlzaW9uLnR2PiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG90b20xMV9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IG90b20xMV9pbml0LAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1xdDI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCmluZGV4IGY0NGY3NzUuLjQ1MTg1MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXF0MjQxMC5jCkBAIC00OSw2ICs0OSw3IEBACiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvbGVkcy1ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CkBAIC0zNDQsNyArMzQ1LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChRVDI0MTAsICJRVDI0MTAiKQotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHF0MjQxMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gcXQyNDEwX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCmluZGV4IGUxN2YwMzMuLjk5YzlkZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYwpAQCAtMTExLDcgKzExMSw3IEBACiBNQUNISU5FX1NUQVJUKFNNREsyNDEwLCAiU01ESzI0MTAiKSAvKiBAVE9ETzogcmVxdWVzdCBhIG5ldyBpZGVudGlmaWVyIGFuZCBzd2l0Y2gKIAkJCQkgICAgKiB0byBTTURLMjQxMCAqLwogCS8qIE1haW50YWluZXI6IEpvbmFzIERpZXRzY2hlICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gc21kazI0MTBfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHNtZGsyNDEwX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC10Y3RfaGFtbWVyLmMKaW5kZXggNDNjMmI4My4uZTBkMGI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdGN0X2hhbW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXRjdF9oYW1tZXIuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVENUX0hBTU1FUiwgIlRDVF9IQU1NRVIiKQotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHRjdF9oYW1tZXJfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IHRjdF9oYW1tZXJfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKaW5kZXggNmNjY2U1YS4uZGY0N2U4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiBNQUNISU5FX1NUQVJUKFZSMTAwMCwgIlRob3Jjb20tVlIxMDAwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdnIxMDAwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gdnIxMDAwX2luaXQsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCmluZGV4IDM0M2E1NDAuLjNkN2ViYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYwpAQCAtNzIsOCArNzIsOCBAQAogCiB2b2lkIF9faW5pdCBzM2MyNDEwX21hcF9pbyh2b2lkKQogewotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjX2dwaW9fc2V0cHVsbF8xdXA7Ci0JczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2NfZ3Bpb19nZXRwdWxsXzF1cDsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cDsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzF1cDsKIAogCWlvdGFibGVfaW5pdChzM2MyNDEwX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDEwX2lvZGVzYykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZwppbmRleCBjMmNmNGU1Li5iOGI5MDI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvS2NvbmZpZwpAQCAtOSw3ICs5LDYgQEAKIAlzZWxlY3QgQ1BVX0xMU0VSSUFMX1MzQzI0NDAKIAlzZWxlY3QgUzNDMjQxMl9QTSBpZiBQTQogCXNlbGVjdCBTM0MyNDEyX0RNQSBpZiBTM0MyNDEwX0RNQQotCXNlbGVjdCBTM0MyNDEwX0dQSU8KIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgUzNDMjQxMiBhbmQgUzNDMjQxMyBTb0NzIGZyb20gdGhlIFMzQzI0WFggbGluZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvTWFrZWZpbGUKaW5kZXggNmM0OGE5MS4uN2U0ZDk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEyKQkrPSBzM2MyNDEyLm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMikJKz0gaXJxLm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQxMikJKz0gY2xvY2subwotb2JqLSQoQ09ORklHX0NQVV9TM0MyNDEyKQkrPSBncGlvLm8KIG9iai0kKENPTkZJR19TM0MyNDEyX0RNQSkJKz0gZG1hLm8KIG9iai0kKENPTkZJR19TM0MyNDEyX1BNKQkrPSBwbS5vCiBvYmotJChDT05GSUdfUzNDMjQxMl9QTV9TTEVFUCkJKz0gc2xlZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jCmluZGV4IDdhYmVjZmMuLmQyYTdkNWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2RtYS5jCkBAIC01MCw2NCArNTAsNDYgQEAKIAkJLm5hbWUJCT0gInNkaSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9TREkpLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfU0RJKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1NESSArIFMzQzI0MTBfU0RJREFUQSwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU0RJICsgUzNDMjQxMF9TRElEQVRBLAogCX0sCiAJW0RNQUNIX1NQSTBdID0gewogCQkubmFtZQkJPSAic3BpMCIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9TUEkwVFgpLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfU1BJMFJYKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1NQSSArIFMzQzI0MTBfU1BUREFULAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEwX1NQUkRBVCwKIAl9LAogCVtETUFDSF9TUEkxXSA9IHsKIAkJLm5hbWUJCT0gInNwaTEiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfU1BJMVRYKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1NQSTFSWCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEyX1NQSTEgKyBTM0MyNDEwX1NQVERBVCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMl9TUEkxICArIFMzQzI0MTBfU1BSREFULAogCX0sCiAJW0RNQUNIX1VBUlQwXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQwIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzApLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDBfMCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDFdID0gewogCQkubmFtZQkJPSAidWFydDEiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMCksCiAJCS5jaGFubmVsc19yeAk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMV8wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8wKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQyXzApLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1VBUlQwX1NSQzJdID0gewogCQkubmFtZQkJPSAidWFydDAiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDBfMSksCiAJCS5jaGFubmVsc19yeAk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMF8xKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9VQVJUMV9TUkMyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQxIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzEpLAogCQkuY2hhbm5lbHNfcngJPSBNQVAoUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMSksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDJfU1JDMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8xKSwKIAkJLmNoYW5uZWxzX3J4CT0gTUFQKFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQyXzEpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDIgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1RJTUVSXSA9IHsKIAkJLm5hbWUJCT0gInRpbWVyIiwKQEAgLTE0OCwxMSArMTMwLDExIEBACiAKIHN0YXRpYyB2b2lkIHMzYzI0MTJfZG1hX2RpcmVjdGlvbihzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiwKIAkJCQkgIHN0cnVjdCBzM2MyNHh4X2RtYV9tYXAgKm1hcCwKLQkJCQkgIGVudW0gczNjMjQxMF9kbWFzcmMgZGlyKQorCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCXVuc2lnbmVkIGxvbmcgY2hzZWw7CiAKLQlpZiAoZGlyID09IFMzQzI0MTBfRE1BU1JDX0hXKQorCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQogCQljaHNlbCA9IG1hcC0+Y2hhbm5lbHNfcnhbMF07CiAJZWxzZQogCQljaHNlbCA9IG1hcC0+Y2hhbm5lbHNbMF07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL2dwaW8uYwppbmRleCAzNDA0YTg3Li40NTI2ZjZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9ncGlvLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogaW50IHMzYzI0MTJfZ3Bpb19zZXRfc2xlZXBjZmcodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHN0YXRlKQogewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CiAJdW5zaWduZWQgbG9uZyBvZmZzID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBzbHBjb247CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1qaXZlLmMKaW5kZXggNWVlYjQ3NS4uMjg2ZWYxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtaml2ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLWppdmUuYwpAQCAtNjU1LDcgKzY1NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSklWRSwgIkpJVkUiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5tYXBfaW8JCT0gaml2ZV9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtc21kazI0MTMuYwppbmRleCAzMzkxNzEzLi5mMWVlYzFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC1zbWRrMjQxMy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXNtZGsyNDEzLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiBNQUNISU5FX1NUQVJUKFMzQzI0MTMsICJTM0MyNDEzIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmZpeHVwCQk9IHNtZGsyNDEzX2ZpeHVwLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLMjQxMiwgIlNNREsyNDEyIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmZpeHVwCQk9IHNtZGsyNDEzX2ZpeHVwLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCkBAIC0xNDksNyArMTQ5LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLMjQxMywgIlNNREsyNDEzIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmZpeHVwCQk9IHNtZGsyNDEzX2ZpeHVwLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEyL21hY2gtdnN0bXMuYwppbmRleCBiNmVkNDU3Li4xYmJiMWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTIvbWFjaC12c3Rtcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMi9tYWNoLXZzdG1zLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFZTVE1TLCAiVlNUTVMiKQotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5maXh1cAkJPSB2c3Rtc19maXh1cCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvS2NvbmZpZwppbmRleCA2OWI0OGE3Li44NGM3YjAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvS2NvbmZpZwpAQCAtMTMsNyArMTMsNiBAQAogCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBTM0MyNDE2X0RNQSBpZiBTM0MyNDEwX0RNQQogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQ0MAotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQRE9XTgogCXNlbGVjdCBTQU1TVU5HX0NMS1NSQwogCXNlbGVjdCBTM0MyNDQzX0NMT0NLCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvY2xvY2suYwppbmRleCAyMWE1ZTgxLi5hZmJiZThiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTYvY2xvY2suYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+Ci0jaW5jbHVkZSA8cGxhdC9wbGw2NTUzeC5oPgogI2luY2x1ZGUgPHBsYXQvcGxsLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTI5LDYgKzI4LDE0IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXMzYzI0NDMtY2xvY2suaD4KIAorLyogYXJtZGl2CisgKgorICogdGhpcyBjbG9jayBpcyBzb3VyY2VkIGZyb20gbXN5c2NsayBhbmQgY2FuIGhhdmUgYSBudW1iZXIgb2YKKyAqIGRpdmlkZXIgdmFsdWVzIGFwcGxpZWQgdG8gaXQgdG8gdGhlbiBiZSBmZWQgaW50byBhcm1jbGsuCisgKiBUaGUgcmVhbCBjbG9jayBkZWZpbml0aW9uIGlzIGRvbmUgaW4gczNjMjQ0My1jbG9jay5jLAorICogb25seSB0aGUgYXJtZGl2IGRpdmlzb3IgdGFibGUgbXVzdCBiZSBkZWZpbmVkIGhlcmUuCisqLworCiBzdGF0aWMgdW5zaWduZWQgaW50IGFybWRpdls4XSA9IHsKIAlbMF0gPSAxLAogCVsxXSA9IDIsCkBAIC0zOCw2ICs0NSwzMiBAQAogCVs3XSA9IDgsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgaHNzcGlfZXBsbGRpdiA9IHsKKwkuY2xrID0geworCQkubmFtZQk9ICJoc3NwaS1lcGxsZGl2IiwKKwkJLnBhcmVudAk9ICZjbGtfZXN5c2Nsay5jbGssCisJCS5jdHJsYml0ID0gKDEgPDwgMTQpLAorCQkuZW5hYmxlID0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3MsCisJfSwKKwkucmVnX2RpdiA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLRElWMSwgLnNpemUgPSAyLCAuc2hpZnQgPSAyNCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKmhzc3BpX3NvdXJjZXNbXSA9IHsKKwlbMF0gPSAmaHNzcGlfZXBsbGRpdi5jbGssCisJWzFdID0gTlVMTCwgLyogdG8gZml4ICovCit9OworCitzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgaHNzcGlfbXV4ID0geworCS5jbGsJPSB7CisJCS5uYW1lCT0gImhzc3BpLWlmIiwKKwl9LAorCS5zb3VyY2VzID0gJihzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMpIHsKKwkJLnNvdXJjZXMgPSBoc3NwaV9zb3VyY2VzLAorCQkubnJfc291cmNlcyA9IEFSUkFZX1NJWkUoaHNzcGlfc291cmNlcyksCisJfSwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLU1JDLCAuc2l6ZSA9IDEsIC5zaGlmdCA9IDE4IH0sCit9OworCiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgaHNtbWNfZGl2W10gPSB7CiAJWzBdID0gewogCQkuY2xrID0gewpAQCAtMTAwLDIwICsxMzMsMTUgQEAKIAkuY3RybGJpdAk9IFMzQzI0MTZfSENMS0NPTl9IU01NQzAsCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzM2MyNDE2X2ZjbGtfZGl2KHVuc2lnbmVkIGxvbmcgY2xrY29uMCkKLXsKLQljbGtjb24wICY9IDcgPDwgUzNDMjQ0M19DTEtESVYwX0FSTURJVl9TSElGVDsKLQotCXJldHVybiBhcm1kaXZbY2xrY29uMCA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUXTsKLX0KLQogdm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBzM2MyNDE2X3NldHVwX2Nsb2Nrcyh2b2lkKQogewotCXMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhzM2MyNDE2X2dldF9wbGwsIHMzYzI0MTZfZmNsa19kaXYpOworCXMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhzM2MyNDE2X2dldF9wbGwpOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayAqY2xrc3Jjc1tdIF9faW5pdGRhdGEgPSB7CisJJmhzc3BpX2VwbGxkaXYsCisJJmhzc3BpX211eCwKIAkmaHNtbWNfZGl2WzBdLAogCSZoc21tY19kaXZbMV0sCiAJJmhzbW1jX211eFswXSwKQEAgLTEzMSw3ICsxNTksOSBAQAogCiAJY2xrX2VwbGwucGFyZW50ID0gJmNsa19lcGxscmVmLmNsazsKIAotCXMzYzI0NDNfY29tbW9uX2luaXRfY2xvY2tzKHh0YWwsIHMzYzI0MTZfZ2V0X3BsbCwgczNjMjQxNl9mY2xrX2Rpdik7CisJczNjMjQ0M19jb21tb25faW5pdF9jbG9ja3MoeHRhbCwgczNjMjQxNl9nZXRfcGxsLAorCQkJCSAgIGFybWRpdiwgQVJSQVlfU0laRShhcm1kaXYpLAorCQkJCSAgIFMzQzI0MTZfQ0xLRElWMF9BUk1ESVZfTUFTSyk7CiAKIAlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoY2xrc3Jjcyk7IHB0cisrKQogCQlzM2NfcmVnaXN0ZXJfY2xrc3JjKGNsa3NyY3NbcHRyXSwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvbWFjaC1zbWRrMjQxNi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L21hY2gtc21kazI0MTYuYwppbmRleCBhYzI3ZWJiLi5hOWVlZTUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTYvbWFjaC1zbWRrMjQxNi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9tYWNoLXNtZGsyNDE2LmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREsyNDE2LCAiU01ESzI0MTYiKQogCS8qIE1haW50YWluZXI6IFlhdWhlbiBLaGFydXpoeSA8amVraG9yQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazI0MTZfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3MzYzI0MTYuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zM2MyNDE2LmMKaW5kZXggMjBiM2ZkZmIuLmVlMjE0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zM2MyNDE2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3MzYzI0MTYuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPHBsYXQvaWljLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L2ZiLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQtY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzM2MyNDE2X2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJSU9ERVNDX0VOVChXQVRDSERPRyksCkBAIC05Nyw2ICs5OCw4IEBACiAKIAlzM2NfZmJfc2V0bmFtZSgiczNjMjQ0My1mYiIpOwogCisJczNjX2FkY19zZXRuYW1lKCJzM2MyNDE2LWFkYyIpOworCiAjaWZkZWYgQ09ORklHX1BNCiAJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnMzYzI0MTZfcG1fc3lzY29yZV9vcHMpOwogI2VuZGlmCkBAIC0xMjAsOCArMTIzLDggQEAKIAogdm9pZCBfX2luaXQgczNjMjQxNl9tYXBfaW8odm9pZCkKIHsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duOwotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd247CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuc2V0X3B1bGwgPSBzYW1zdW5nX2dwaW9fc2V0cHVsbF91cGRvd247CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd247CiAKIAkvKiBpbml0aWFsaXplIGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLwogCXMzYzI0MTZfZGVmYXVsdF9zZGhjaTAoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxNi9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3NldHVwLXNkaGNpLmMKaW5kZXggZWQzNGZhZC4uY2VlNTM5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3NldHVwLXNkaGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDE2L3NldHVwLXNkaGNpLmMKQEAgLTEyLDE3ICsxMiw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAKIC8qIGNsb2NrIHNvdXJjZXMgZm9yIHRoZSBtbWMgYnVzIGNsb2NrLCBvcmRlciBhcyBmb3IgdGhlIGN0cmwyWzUuLjRdICovCiAKQEAgLTMyLDMwICsyMiwzIEBACiAJWzJdID0gImhzbW1jLWlmIiwKIAkvKiBbM10gPSAiNDhtIiwgLSBub3RlIG5vdCBzdWNjZXNzZnVsbHkgdXNlZCB5ZXQgKi8KIH07Ci0KLXZvaWQgczNjMjQxNl9zZXR1cF9zZGhjaV9jZmdfY2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCSAgc3RydWN0IG1tY19jYXJkICpjYXJkKQotewotCXUzMiBjdHJsMiwgY3RybDM7Ci0KLQljdHJsMiA9IF9fcmF3X3JlYWRsKHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCWN0cmwyICY9IFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0s7Ci0JY3RybDIgfD0gKFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5TVEFBU1lOQ0NMUiB8Ci0JCSAgUzNDNjRYWF9TREhDSV9DVFJMMl9FTkNNRENORk1TSyB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWCB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0RGQ05UX05PTkUgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkNMS09VVEhPTEQpOwotCi0JaWYgKGlvcy0+Y2xvY2sgPCAyNSAqIDEwMDAwMDApCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDMgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDIgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCWVsc2UKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCi0JX19yYXdfd3JpdGVsKGN0cmwyLCByICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQlfX3Jhd193cml0ZWwoY3RybDMsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvS2NvbmZpZwppbmRleCA1MDgyNWEzLi45MTRlNjIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvS2NvbmZpZwpAQCAtNSwxMCArNSw4IEBACiBjb25maWcgQ1BVX1MzQzI0NDAKIAlib29sCiAJc2VsZWN0IENQVV9BUk05MjBUCi0Jc2VsZWN0IFMzQ19HUElPX1BVTExfVVAKIAlzZWxlY3QgUzNDMjQxMF9DTE9DSwogCXNlbGVjdCBTM0MyNDEwX1BNIGlmIFBNCi0Jc2VsZWN0IFMzQzI0MTBfR1BJTwogCXNlbGVjdCBTM0MyNDQwX0RNQSBpZiBTM0MyNDEwX0RNQQogCXNlbGVjdCBDUFVfUzNDMjQ0WAogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQ0MApAQCAtMTgsOSArMTYsNyBAQAogY29uZmlnIENQVV9TM0MyNDQyCiAJYm9vbAogCXNlbGVjdCBDUFVfQVJNOTIwVAotCXNlbGVjdCBTM0NfR1BJT19QVUxMX0RPV04KIAlzZWxlY3QgUzNDMjQxMF9DTE9DSwotCXNlbGVjdCBTM0MyNDEwX0dQSU8KIAlzZWxlY3QgUzNDMjQxMF9QTSBpZiBQTQogCXNlbGVjdCBDUFVfUzNDMjQ0WAogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQ0MApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL2RtYS5jCmluZGV4IDNiMDUyOWYuLjBlNzNmOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvZG1hLmMKQEAgLTQ4LDM4ICs0OCwyNiBAQAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDQwX0RDT05fQ0gxX1NESSB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9TREkgfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0MTBfRENPTl9DSDNfU0RJIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfU1BJMF0gPSB7CiAJCS5uYW1lCQk9ICJzcGkwIiwKIAkJLmNoYW5uZWxzWzFdCT0gUzNDMjQxMF9EQ09OX0NIMV9TUEkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEwX1NQVERBVCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfU1BJMV0gPSB7CiAJCS5uYW1lCQk9ICJzcGkxIiwKIAkJLmNoYW5uZWxzWzNdCT0gUzNDMjQxMF9EQ09OX0NIM19TUEkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIDB4MjAgKyBTM0MyNDEwX1NQUkRBVCwKIAl9LAogCVtETUFDSF9VQVJUMF0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MCIsCiAJCS5jaGFubmVsc1swXQk9IFMzQzI0MTBfRENPTl9DSDBfVUFSVDAgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VSWEgsCiAJfSwKIAlbRE1BQ0hfVUFSVDFdID0gewogCQkubmFtZQkJPSAidWFydDEiLAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDEwX0RDT05fQ0gxX1VBUlQxIHwgRE1BX0NIX1ZBTElELAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VUlhILAogCX0sCiAgICAgICAJW0RNQUNIX1VBUlQyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQyIiwKIAkJLmNoYW5uZWxzWzNdCT0gUzNDMjQxMF9EQ09OX0NIM19VQVJUMiB8IERNQV9DSF9WQUxJRCwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9USU1FUl0gPSB7CiAJCS5uYW1lCQk9ICJ0aW1lciIsCkBAIC05MSwzMSArNzksMjYgQEAKIAkJLm5hbWUJCT0gImkycy1zZGkiLAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDEwX0RDT05fQ0gxX0kyU1NESSB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9JMlNTREkgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKIAl9LAogCVtETUFDSF9JMlNfT1VUXSA9IHsKIAkJLm5hbWUJCT0gImkycy1zZG8iLAogCQkuY2hhbm5lbHNbMF0JPSBTM0MyNDQwX0RDT05fQ0gwX0kyU1NETyB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzJdCT0gUzNDMjQxMF9EQ09OX0NIMl9JMlNTRE8gfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfUENNX0lOXSA9IHsKIAkJLm5hbWUJCT0gInBjbS1pbiIsCiAJCS5jaGFubmVsc1swXQk9IFMzQzI0NDBfRENPTl9DSDBfUENNSU4gfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0NDBfRENPTl9DSDJfUENNSU4gfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDQwX1BBX0FDOTcgKyBTM0NfQUM5N19QQ01fREFUQSwKIAl9LAogCVtETUFDSF9QQ01fT1VUXSA9IHsKIAkJLm5hbWUJCT0gInBjbS1vdXQiLAogCQkuY2hhbm5lbHNbMV0JPSBTM0MyNDQwX0RDT05fQ0gxX1BDTU9VVCB8IERNQV9DSF9WQUxJRCwKIAkJLmNoYW5uZWxzWzNdCT0gUzNDMjQ0MF9EQ09OX0NIM19QQ01PVVQgfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLnRvCT0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDX0FDOTdfUENNX0RBVEEsCiAJfSwKIAlbRE1BQ0hfTUlDX0lOXSA9IHsKIAkJLm5hbWUJCT0gIm1pYy1pbiIsCiAJCS5jaGFubmVsc1syXQk9IFMzQzI0NDBfRENPTl9DSDJfTUlDSU4gfCBETUFfQ0hfVkFMSUQsCiAJCS5jaGFubmVsc1szXQk9IFMzQzI0NDBfRENPTl9DSDNfTUlDSU4gfCBETUFfQ0hfVkFMSUQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDQwX1BBX0FDOTcgKyBTM0NfQUM5N19NSUNfREFUQSwKIAl9LAogCVtETUFDSF9VU0JfRVAxXSA9IHsKIAkJLm5hbWUJCT0gInVzYi1lcDEiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYW51YmlzLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hbnViaXMuYwppbmRleCBkNzA4Njc4Li43NGY5MmZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hbnViaXMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hbnViaXMuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQU5VQklTLCAiU2ltdGVjLUFudWJpcyIpCiAJLyogTWFpbnRhaW5lcjogQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGFudWJpc19tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IGFudWJpc19pbml0LAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCmluZGV4IDZjOThiNzguLjM4ODg3ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAogCiBNQUNISU5FX1NUQVJUKEFUMjQ0MEVWQiwgIkFUMjQ0MEVWQiIpCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gYXQyNDQwZXZiX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gYXQyNDQwZXZiX2luaXQsCiAJLmluaXRfaXJxCT0gczNjMjR4eF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWd0YTAyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1ndGEwMi5jCmluZGV4IGMxMGRkZjQuLmRlMWUwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWd0YTAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtZ3RhMDIuYwpAQCAtNTk1LDcgKzU5NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTkVPMTk3M19HVEEwMiwgIkdUQTAyIikKIAkvKiBNYWludGFpbmVyOiBOZWxzb24gQ2FzdGlsbG8gPGFyaHVhY29AZnJlYWtzLXVuaWRvcy5uZXQ+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gZ3RhMDJfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGd0YTAyX21hY2hpbmVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1taW5pMjQ0MC5jCmluZGV4IGZjMmRjMGIuLjkxZmUwYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW1pbmkyNDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbWluaTI0NDAuYwpAQCAtNjc2LDcgKzY3Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTUlOSTI0NDAsICJNSU5JMjQ0MCIpCiAJLyogTWFpbnRhaW5lcjogTWljaGVsIFBvbGxldCA8YnVzZXJyb3JAZ21haWwuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IG1pbmkyNDQwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gbWluaTI0NDBfaW5pdCwKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbmV4Y29kZXIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW5leGNvZGVyLmMKaW5kZXggMzdkZDMwNi4uNjFjMGJmMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtbmV4Y29kZXIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1uZXhjb2Rlci5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogTUFDSElORV9TVEFSVChORVhDT0RFUl8yNDQwLCAiTmV4VmlzaW9uIC0gTmV4Y29kZXIgMjQ0MCIpCiAJLyogTWFpbnRhaW5lcjogR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gbmV4Y29kZXJfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBuZXhjb2Rlcl9pbml0LAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1vc2lyaXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCmluZGV4IGQ4ODUzNjMuLmRjMTQyZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLW9zaXJpcy5jCkBAIC00NDcsNyArNDQ3LDcgQEAKIAogTUFDSElORV9TVEFSVChPU0lSSVMsICJTaW10ZWMtT1NJUklTIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gb3NpcmlzX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBvc2lyaXNfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXJ4MTk1MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKaW5kZXggMjdlYTk1MC4uMGQzNDUzYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMKQEAgLTQzLDYgKzQzLDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW9qLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWxjZC5oPgogI2luY2x1ZGUgPG1hY2gvaDE5NDAuaD4KICNpbmNsdWRlIDxtYWNoL2ZiLmg+CiAKQEAgLTgyNSw3ICs4MjYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFJYMTk1MCwgIkhQIGlQQVEgUlgxOTUwIikKICAgICAvKiBNYWludGFpbmVyczogVmFzaWx5IEtob3J1emhpY2sgKi8KLQkuYm9vdF9wYXJhbXMgPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0ID0gMHgxMDAsCiAJLm1hcF9pbyA9IHJ4MTk1MF9tYXBfaW8sCiAJLnJlc2VydmUJPSByeDE5NTBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEgPSBzM2MyNHh4X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngzNzE1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYwppbmRleCAxNDcyYjFhLi5lMTk0OTljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDM3MTUuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUlgzNzE1LCAiSVBBUS1SWDM3MTUiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSByeDM3MTVfbWFwX2lvLAogCS5yZXNlcnZlCT0gcngzNzE1X3Jlc2VydmUsCiAJLmluaXRfaXJxCT0gcngzNzE1X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLXNtZGsyNDQwLmMKaW5kZXggZWVkZmUwZi4uMzZlZWI0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtc21kazI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1zbWRrMjQ0MC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAogTUFDSElORV9TVEFSVChTM0MyNDQwLCAiU01ESzI0NDAiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazI0NDBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQwLmMKaW5kZXggMjI3MGQzMy4uMzdmOGNjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0MC5jCkBAIC03MCw2ICs3MCw2IEBACiB7CiAJczNjMjQ0eF9tYXBfaW8oKTsKIAotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjX2dwaW9fc2V0cHVsbF8xdXA7Ci0JczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2NfZ3Bpb19nZXRwdWxsXzF1cDsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5zZXRfcHVsbCA9IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cDsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzF1cDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvczNjMjQ0Mi5jCmluZGV4IDZmMmI2NWUuLjJjODIyZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9zM2MyNDQyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL3MzYzI0NDIuYwpAQCAtMTgyLDYgKzE4Miw2IEBACiB7CiAJczNjMjQ0eF9tYXBfaW8oKTsKIAotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjX2dwaW9fc2V0cHVsbF8xZG93bjsKLQlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzY19ncGlvX2dldHB1bGxfMWRvd247CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuc2V0X3B1bGwgPSBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xZG93bjsKKwlzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdC5nZXRfcHVsbCA9IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzFkb3duOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZwppbmRleCBkOGViODY4Li44ODE0MDMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCXNlbGVjdCBDUFVfTExTRVJJQUxfUzNDMjQ0MAogCXNlbGVjdCBTQU1TVU5HX0NMS1NSQwogCXNlbGVjdCBTM0MyNDQzX0NMT0NLCi0Jc2VsZWN0IFMzQ19HUElPX1BVTExfUzNDMjQ0MwogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBTM0MyNDQzIFNvQyBmcm9tIHRoZSBTM0MyNFhYIGxpbmUKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYwppbmRleCAzODA1OGFmLi4xYzJjMDg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvY2xvY2suYwpAQCAtNTcsMTggKzU3LDE0IEBACiAKIC8qIGNsb2NrIHNlbGVjdGlvbnMgKi8KIAotc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyc19leHQgPSB7Ci0JLm5hbWUJCT0gImkycy1leHQiLAotfTsKLQogLyogYXJtZGl2CiAgKgogICogdGhpcyBjbG9jayBpcyBzb3VyY2VkIGZyb20gbXN5c2NsayBhbmQgY2FuIGhhdmUgYSBudW1iZXIgb2YKICAqIGRpdmlkZXIgdmFsdWVzIGFwcGxpZWQgdG8gaXQgdG8gdGhlbiBiZSBmZWQgaW50byBhcm1jbGsuCisgKiBUaGUgcmVhbCBjbG9jayBkZWZpbml0aW9uIGlzIGRvbmUgaW4gczNjMjQ0My1jbG9jay5jLAorICogb25seSB0aGUgYXJtZGl2IGRpdmlzb3IgdGFibGUgbXVzdCBiZSBkZWZpbmVkIGhlcmUuCiAqLwogCi0vKiBhcm1kaXYgZGl2aXNvciB0YWJsZSAqLwotCiBzdGF0aWMgdW5zaWduZWQgaW50IGFybWRpdlsxNl0gPSB7CiAJW1MzQzI0NDNfQ0xLRElWMF9BUk1ESVZfMSA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUXQk9IDEsCiAJW1MzQzI0NDNfQ0xLRElWMF9BUk1ESVZfMiA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUXQk9IDIsCkBAIC04MCw5MiArNzYsNiBAQAogCVtTM0MyNDQzX0NMS0RJVjBfQVJNRElWXzE2ID4+IFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfU0hJRlRdCT0gMTYsCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzM2MyNDQzX2ZjbGtfZGl2KHVuc2lnbmVkIGxvbmcgY2xrY29uMCkKLXsKLQljbGtjb24wICY9IFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfTUFTSzsKLQotCXJldHVybiBhcm1kaXZbY2xrY29uMCA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUXTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjQ0M19hcm1jbGtfcm91bmRyYXRlKHN0cnVjdCBjbGsgKmNsaywKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByYXRlKQotewotCXVuc2lnbmVkIGxvbmcgcGFyZW50ID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKLQl1bnNpZ25lZCBsb25nIGNhbGM7Ci0JdW5zaWduZWQgYmVzdCA9IDI1NjsgLyogYmlnZ2VyIHRoYW4gYW55IHZhbHVlICovCi0JdW5zaWduZWQgZGl2OwotCWludCBwdHI7Ci0KLQlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoYXJtZGl2KTsgcHRyKyspIHsKLQkJZGl2ID0gYXJtZGl2W3B0cl07Ci0JCWNhbGMgPSBwYXJlbnQgLyBkaXY7Ci0JCWlmIChjYWxjIDw9IHJhdGUgJiYgZGl2IDwgYmVzdCkKLQkJCWJlc3QgPSBkaXY7Ci0JfQotCi0JcmV0dXJuIHBhcmVudCAvIGJlc3Q7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjQ0M19hcm1jbGtfc2V0cmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBhcmVudCA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7Ci0JdW5zaWduZWQgbG9uZyBjYWxjOwotCXVuc2lnbmVkIGRpdjsKLQl1bnNpZ25lZCBiZXN0ID0gMjU2OyAvKiBiaWdnZXIgdGhhbiBhbnkgdmFsdWUgKi8KLQlpbnQgcHRyOwotCWludCB2YWwgPSAtMTsKLQotCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShhcm1kaXYpOyBwdHIrKykgewotCQlkaXYgPSBhcm1kaXZbcHRyXTsKLQkJY2FsYyA9IHBhcmVudCAvIGRpdjsKLQkJaWYgKGNhbGMgPD0gcmF0ZSAmJiBkaXYgPCBiZXN0KSB7Ci0JCQliZXN0ID0gZGl2OwotCQkJdmFsID0gcHRyOwotCQl9Ci0JfQotCi0JaWYgKHZhbCA+PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY2xrY29uMDsKLQotCQljbGtjb24wID0gX19yYXdfcmVhZGwoUzNDMjQ0M19DTEtESVYwKTsKLQkJY2xrY29uMCAmPSB+UzNDMjQ0M19DTEtESVYwX0FSTURJVl9NQVNLOwotCQljbGtjb24wIHw9IHZhbCA8PCBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUOwotCQlfX3Jhd193cml0ZWwoY2xrY29uMCwgUzNDMjQ0M19DTEtESVYwKTsKLQl9Ci0KLQlyZXR1cm4gKHZhbCA9PSAtMSkgPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGsgY2xrX2FybWRpdiA9IHsKLQkubmFtZQkJPSAiYXJtZGl2IiwKLQkucGFyZW50CQk9ICZjbGtfbXN5c2Nsay5jbGssCi0JLm9wcwkJPSAmKHN0cnVjdCBjbGtfb3BzKSB7Ci0JCS5yb3VuZF9yYXRlID0gczNjMjQ0M19hcm1jbGtfcm91bmRyYXRlLAotCQkuc2V0X3JhdGUgPSBzM2MyNDQzX2FybWNsa19zZXRyYXRlLAotCX0sCi19OwotCi0vKiBhcm1jbGsKLSAqCi0gKiB0aGlzIGlzIHRoZSBjbG9jayBmZWQgaW50byB0aGUgQVJNIGNvcmUgaXRzZWxmLCBmcm9tIGFybWRpdiBvciBmcm9tIGhjbGsuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBjbGsgKmNsa19hcm1fc291cmNlc1tdID0gewotCVswXSA9ICZjbGtfYXJtZGl2LAotCVsxXSA9ICZjbGtfaCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfYXJtID0gewotCS5jbGsJPSB7Ci0JCS5uYW1lCQk9ICJhcm1jbGsiLAotCX0sCi0JLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgewotCQkuc291cmNlcyA9IGNsa19hcm1fc291cmNlcywKLQkJLm5yX3NvdXJjZXMgPSBBUlJBWV9TSVpFKGNsa19hcm1fc291cmNlcyksCi0JfSwKLQkucmVnX3NyYyA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLRElWMCwgLnNpemUgPSAxLCAuc2hpZnQgPSAxMyB9LAotfTsKLQogLyogaHNzcGkKICAqCiAgKiBoaWdoLXNwZWVkIHNwaSBjbG9jaywgc291cmNlZCBmcm9tIGVzeXNjbGsKQEAgLTE3Myw3ICs4Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaHNzcGkgPSB7CiAJLmNsawk9IHsKLQkJLm5hbWUJCT0gImhzc3BpIiwKKwkJLm5hbWUJCT0gImhzc3BpLWlmIiwKIAkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfU0NMS0NPTl9IU1NQSUNMSywKIAkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcywKQEAgLTIzNSw0OCArMTQ1LDYgQEAKIAl9LAogfTsKIAotLyogaTJzX2VwbGxkaXYKLSAqCi0gKiBUaGlzIGNsb2NrIGlzIHRoZSBvdXRwdXQgZnJvbSB0aGUgSTJTIGRpdmlzb3Igb2YgRVNZU0NMSywgYW5kIGlzIHNlcGFyYXRlCi0gKiBmcm9tIHRoZSBtdXggdGhhdCBjb21lcyBhZnRlciBpdCAoY2Fubm90IG1lcmdlIGludG8gb25lIHNpbmdsZSBjbG9jaykKLSovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaTJzX2VwbGxkaXYgPSB7Ci0JLmNsawk9IHsKLQkJLm5hbWUJCT0gImkycy1lcGxsZGl2IiwKLQkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAotCX0sCi0JLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gNCwgLnNoaWZ0ID0gMTIsIH0sCi19OwotCi0vKiBpMnMtcmVmCi0gKgotICogaTJzIGJ1cyByZWZlcmVuY2UgY2xvY2ssIHNlbGVjdGFibGUgZnJvbSBleHRlcm5hbCwgZXN5c2NsayBvciBlcGxscmVmCi0gKgotICogTm90ZSwgdGhpcyB1c2VkIHRvIGJlIHR3byBjbG9ja3MsIGJ1dCB3YXMgY29tcHJlc3NlZCBpbnRvIG9uZS4KLSovCi0KLXN0cnVjdCBjbGsgKmNsa19pMnNfc3JjbGlzdFtdID0gewotCVswXSA9ICZjbGtfaTJzX2VwbGxkaXYuY2xrLAotCVsxXSA9ICZjbGtfaTJzX2V4dCwKLQlbMl0gPSAmY2xrX2VwbGxyZWYuY2xrLAotCVszXSA9ICZjbGtfZXBsbHJlZi5jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgY2xrX2kycyA9IHsKLQkuY2xrCT0gewotCQkubmFtZQkJPSAiaTJzLWlmIiwKLQkJLmN0cmxiaXQJPSBTM0MyNDQzX1NDTEtDT05fSTJTQ0xLLAotCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zLAotCi0JfSwKLQkuc291cmNlcyA9ICYoc3RydWN0IGNsa3NyY19zb3VyY2VzKSB7Ci0JCS5zb3VyY2VzID0gY2xrX2kyc19zcmNsaXN0LAotCQkubnJfc291cmNlcyA9IEFSUkFZX1NJWkUoY2xrX2kyc19zcmNsaXN0KSwKLQl9LAotCS5yZWdfc3JjID0geyAucmVnID0gUzNDMjQ0M19DTEtTUkMsIC5zaXplID0gMiwgLnNoaWZ0ID0gMTQgfSwKLX07Ci0KIC8qIHN0YW5kYXJkIGNsb2NrIGRlZmluaXRpb25zICovCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewpAQCAtMjg2LDExICsxNTQsNiBAQAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfUENMS0NPTl9TREksCiAJfSwgewotCQkubmFtZQkJPSAiaWlzIiwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCi0JCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX0lJUywKLQl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAogCQkuZGV2bmFtZQk9ICJzM2MyNDEwLXNwaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCkBAIC0zMDUsMjcgKzE2OCwyMCBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzW10gPSB7Ci19OwotCiAvKiBjbG9ja3MgdG8gYWRkIHN0cmFpZ2h0IGF3YXkgKi8KIAogc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrICpjbGtzcmNzW10gX19pbml0ZGF0YSA9IHsKLQkmY2xrX2FybSwKLQkmY2xrX2kyc19lcGxsZGl2LAotCSZjbGtfaTJzLAogCSZjbGtfaHNzcGksCiAJJmNsa19oc21tY19kaXYsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrc1tdIF9faW5pdGRhdGEgPSB7CiAJJmNsa19oc21tYywKLQkmY2xrX2FybWRpdiwKIH07CiAKIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQ0M19zZXR1cF9jbG9ja3Modm9pZCkKIHsKLQlzM2MyNDQzX2NvbW1vbl9zZXR1cF9jbG9ja3MoczNjMjQ0M19nZXRfbXBsbCwgczNjMjQ0M19mY2xrX2Rpdik7CisJczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKHMzYzI0NDNfZ2V0X21wbGwpOwogfQogCiB2b2lkIF9faW5pdCBzM2MyNDQzX2luaXRfY2xvY2tzKGludCB4dGFsKQpAQCAtMzM2LDcgKzE5Miw5IEBACiAJY2xrX2VwbGwucmF0ZSA9IHMzYzI0NDNfZ2V0X2VwbGwoZXBsbGNvbiwgeHRhbCk7CiAJY2xrX2VwbGwucGFyZW50ID0gJmNsa19lcGxscmVmLmNsazsKIAotCXMzYzI0NDNfY29tbW9uX2luaXRfY2xvY2tzKHh0YWwsIHMzYzI0NDNfZ2V0X21wbGwsIHMzYzI0NDNfZmNsa19kaXYpOworCXMzYzI0NDNfY29tbW9uX2luaXRfY2xvY2tzKHh0YWwsIHMzYzI0NDNfZ2V0X21wbGwsCisJCQkJICAgYXJtZGl2LCBBUlJBWV9TSVpFKGFybWRpdiksCisJCQkJICAgUzNDMjQ0M19DTEtESVYwX0FSTURJVl9NQVNLKTsKIAogCXMzYzI0NDNfc2V0dXBfY2xvY2tzKCk7CiAKQEAgLTM0NSwxMCArMjAzLDYgQEAKIAlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoY2xrc3Jjcyk7IHB0cisrKQogCQlzM2NfcmVnaXN0ZXJfY2xrc3JjKGNsa3NyY3NbcHRyXSwgMSk7CiAKLQkvKiByZWdpc3RlciBjbG9ja3MgZnJvbSBjbG9jayBhcnJheSAqLwotCi0JczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2NrcywgQVJSQVlfU0laRShpbml0X2Nsb2NrcykpOwotCiAJLyogV2UgbXVzdCBiZSBjYXJlZnVsIGRpc2FibGluZyB0aGUgY2xvY2tzIHdlIGFyZSBub3QgaW50ZW5kaW5nIHRvCiAJICogYmUgdXNpbmcgYXQgYm9vdCB0aW1lLCBhcyBzdWJzeXN0ZW1zIHN1Y2ggYXMgdGhlIExDRCB3aGljaCBkbwogCSAqIHRoZWlyIG93biBETUEgcmVxdWVzdHMgdG8gdGhlIGJ1cyBjYW4gY2F1c2UgdGhlIHN5c3RlbSB0byBsb2NrdXAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQ0My9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9kbWEuYwppbmRleCAzZjY1ODY4Li5mZTUyMTUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL2RtYS5jCkBAIC01NCw2OCArNTQsNDYgQEAKIAlbRE1BQ0hfU0RJXSA9IHsKIAkJLm5hbWUJCT0gInNkaSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9TREkpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfU1BJMF0gPSB7CiAJCS5uYW1lCQk9ICJzcGkwIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1NQSTBUWCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyBTM0MyNDEwX1NQVERBVCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfU1BJICsgUzNDMjQxMF9TUFJEQVQsCiAJfSwKIAlbRE1BQ0hfU1BJMV0gPSB7CiAJCS5uYW1lCQk9ICJzcGkxIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1NQSTFUWCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9TUEkgKyAweDIwICsgUzNDMjQxMF9TUFREQVQsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1NQSSArIDB4MjAgKyBTM0MyNDEwX1NQUkRBVCwKIAl9LAogCVtETUFDSF9VQVJUMF0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MCIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMF8wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMCArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9VQVJUMV0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MSIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMV8wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQxICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMl8wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUM10gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MyIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUM18wKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDQzX1BBX1VBUlQzICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQ0M19QQV9VQVJUMyArIFMzQzI0MTBfVVJYSCwKIAl9LAogCVtETUFDSF9VQVJUMF9TUkMyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQwIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQwXzEpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0MTBfUEFfVUFSVDAgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDEwX1BBX1VBUlQwICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1VBUlQxX1NSQzJdID0gewogCQkubmFtZQkJPSAidWFydDEiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDFfMSksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9VQVJUMSArIFMzQzI0MTBfVVRYSCwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfVUFSVDEgKyBTM0MyNDEwX1VSWEgsCiAJfSwKICAgICAgIAlbRE1BQ0hfVUFSVDJfU1JDMl0gPSB7CiAJCS5uYW1lCQk9ICJ1YXJ0MiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMl8xKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDEwX1BBX1VBUlQyICsgUzNDMjQxMF9VVFhILAotCQkuaHdfYWRkci5mcm9tCT0gUzNDMjQxMF9QQV9VQVJUMiArIFMzQzI0MTBfVVJYSCwKIAl9LAogICAgICAgCVtETUFDSF9VQVJUM19TUkMyXSA9IHsKIAkJLm5hbWUJCT0gInVhcnQzIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQzXzEpLAotCQkuaHdfYWRkci50bwk9IFMzQzI0NDNfUEFfVUFSVDMgKyBTM0MyNDEwX1VUWEgsCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDQzX1BBX1VBUlQzICsgUzNDMjQxMF9VUlhILAogCX0sCiAJW0RNQUNIX1RJTUVSXSA9IHsKIAkJLm5hbWUJCT0gInRpbWVyIiwKQEAgLTEyNCwyNyArMTAyLDIyIEBACiAJW0RNQUNIX0kyU19JTl0gPSB7CiAJCS5uYW1lCQk9ICJpMnMtc2RpIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX0kyU1JYKSwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAogCX0sCiAJW0RNQUNIX0kyU19PVVRdID0gewogCQkubmFtZQkJPSAiaTJzLXNkbyIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9JMlNUWCksCi0JCS5od19hZGRyLnRvCT0gUzNDMjQxMF9QQV9JSVMgKyBTM0MyNDEwX0lJU0ZJRk8sCiAJfSwKIAlbRE1BQ0hfUENNX0lOXSA9IHsKIAkJLm5hbWUJCT0gInBjbS1pbiIsCiAJCS5jaGFubmVscwk9IE1BUChTM0MyNDQzX0RNQVJFUVNFTF9QQ01JTiksCi0JCS5od19hZGRyLmZyb20JPSBTM0MyNDQwX1BBX0FDOTcgKyBTM0NfQUM5N19QQ01fREFUQSwKIAl9LAogCVtETUFDSF9QQ01fT1VUXSA9IHsKIAkJLm5hbWUJCT0gInBjbS1vdXQiLAogCQkuY2hhbm5lbHMJPSBNQVAoUzNDMjQ0M19ETUFSRVFTRUxfUENNT1VUKSwKLQkJLmh3X2FkZHIudG8JPSBTM0MyNDQwX1BBX0FDOTcgKyBTM0NfQUM5N19QQ01fREFUQSwKIAl9LAogCVtETUFDSF9NSUNfSU5dID0gewogCQkubmFtZQkJPSAibWljLWluIiwKIAkJLmNoYW5uZWxzCT0gTUFQKFMzQzI0NDNfRE1BUkVRU0VMX01JQ0lOKSwKLQkJLmh3X2FkZHIuZnJvbQk9IFMzQzI0NDBfUEFfQUM5NyArIFMzQ19BQzk3X01JQ19EQVRBLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL21hY2gtc21kazI0NDMuYwppbmRleCA1MTQyNzVlLi5iZWMxMDdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDMvbWFjaC1zbWRrMjQ0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9tYWNoLXNtZGsyNDQzLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREsyNDQzLCAiU01ESzI0NDMiKQogCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazI0NDNfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0My9zM2MyNDQzLmMKaW5kZXggZTZhMjhiYS4uYTIyYjc3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQzL3MzYzI0NDMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDMvczNjMjQ0My5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L2ZiLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQtY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzM2MyNDQzX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJSU9ERVNDX0VOVChXQVRDSERPRyksCkBAIC03MCw2ICs3MSw4IEBACiAJczNjX25hbmRfc2V0bmFtZSgiczNjMjQxMi1uYW5kIik7CiAJczNjX2ZiX3NldG5hbWUoInMzYzI0NDMtZmIiKTsKIAorCXMzY19hZGNfc2V0bmFtZSgiczNjMjQ0My1hZGMiKTsKKwogCS8qIGNoYW5nZSBXRFQgSVJRIG51bWJlciAqLwogCXMzY19kZXZpY2Vfd2R0LnJlc291cmNlWzFdLnN0YXJ0ID0gSVJRX1MzQzI0NDNfV0RUOwogCXMzY19kZXZpY2Vfd2R0LnJlc291cmNlWzFdLmVuZCAgID0gSVJRX1MzQzI0NDNfV0RUOwpAQCAtOTAsOCArOTMsOCBAQAogCiB2b2lkIF9faW5pdCBzM2MyNDQzX21hcF9pbyh2b2lkKQogewotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjX2dwaW9fc2V0cHVsbF9zM2MyNDQzOwotCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LmdldF9wdWxsID0gczNjX2dwaW9fZ2V0cHVsbF9zM2MyNDQzOworCXMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0LnNldF9wdWxsID0gczNjMjQ0M19ncGlvX3NldHB1bGw7CisJczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQuZ2V0X3B1bGwgPSBzM2MyNDQzX2dwaW9fZ2V0cHVsbDsKIAogCWlvdGFibGVfaW5pdChzM2MyNDQzX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDQzX2lvZGVzYykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZwppbmRleCBmMDU3YjZhLi41NTUyZTA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvS2NvbmZpZwpAQCAtMjg4LDUgKzI4OCw2IEBACiAJc2VsZWN0IFMzQ19ERVZfUlRDCiAJc2VsZWN0IFMzQzY0WFhfREVWX1NQSQogCXNlbGVjdCBTM0MyNFhYX0dQSU9fRVhUUkExMjgKKwlzZWxlY3QgSTJDCiAJaGVscAogCSAgTWFjaGluZSBzdXBwb3J0IGZvciB0aGUgV29sZnNvbiBDcmFnZ2FubW9yZSBTM0M2NDEwIHZhcmlhbnQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvTWFrZWZpbGUKaW5kZXggNjFiNDAzNC4uY2ZjMGI5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNiBAQAogIyBDb3JlIGZpbGVzCiBvYmoteQkJCQkrPSBjcHUubwogb2JqLXkJCQkJKz0gY2xvY2subwotb2JqLXkJCQkJKz0gZ3Bpb2xpYi5vCiAKICMgQ29yZSBzdXBwb3J0IGZvciBTM0M2NDAwIHN5c3RlbQogCkBAIC01NSwxMiArNTQsMTAgQEAKIG9iai0kKENPTkZJR19NQUNIX1NNQVJUUSkJKz0gbWFjaC1zbWFydHEubwogb2JqLSQoQ09ORklHX01BQ0hfU01BUlRRNSkJKz0gbWFjaC1zbWFydHE1Lm8KIG9iai0kKENPTkZJR19NQUNIX1NNQVJUUTcpCSs9IG1hY2gtc21hcnRxNy5vCi1vYmotJChDT05GSUdfTUFDSF9XTEZfQ1JBR0dfNjQxMCkgKz0gbWFjaC1jcmFnNjQxMC5vCitvYmotJChDT05GSUdfTUFDSF9XTEZfQ1JBR0dfNjQxMCkgKz0gbWFjaC1jcmFnNjQxMC5vIG1hY2gtY3JhZzY0MTAtbW9kdWxlLm8KIAogIyBkZXZpY2Ugc3VwcG9ydAogCiBvYmoteQkJCQkrPSBkZXYtdWFydC5vCiBvYmoteQkJCQkrPSBkZXYtYXVkaW8ubwogb2JqLSQoQ09ORklHX1MzQzY0WFhfREVWX1NQSSkJKz0gZGV2LXNwaS5vCi1vYmotJChDT05GSUdfUzNDNjRYWF9ERVZfVFMpCSs9IGRldi10cy5vCi1vYmotJChDT05GSUdfUzNDNjRYWF9ERVZfT05FTkFORDEpCSs9IGRldi1vbmVuYW5kMS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jbG9jay5jCmluZGV4IDhjZjM5ZTMuLjM5YzIzOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jbG9jay5jCkBAIC0yNSwxMyArMjUsMTMgQEAKIAogI2luY2x1ZGUgPG1hY2gvcmVncy1zeXMuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KLSNpbmNsdWRlIDxtYWNoL3BsbC5oPgogCiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS1mcmVxLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2stY2xrc3JjLmg+CisjaW5jbHVkZSA8cGxhdC9wbGwuaD4KIAogLyogZmluX2FwbGwsIGZpbl9tcGxsIGFuZCBmaW5fZXBsbCBhcmUgYWxsIHRoZSBzYW1lIGNsb2NrLCB3aGljaCB3ZSBjYWxsCiAgKiBleHRfeHRhbF9tdXggZm9yIHdhbnQgb2YgYW4gYWN0dWFsIG5hbWUgZnJvbSB0aGUgbWFudWFsLgpAQCAtNzM1LDcgKzczNSw4IEBACiAJLyogRm9yIG5vdyBhc3N1bWUgdGhlIG11eCBhbHdheXMgc2VsZWN0cyB0aGUgY3J5c3RhbCAqLwogCWNsa19leHRfeHRhbF9tdXgucGFyZW50ID0geHRhbF9jbGs7CiAKLQllcGxsID0gczNjNjQwMF9nZXRfZXBsbCh4dGFsKTsKKwllcGxsID0gczNjX2dldF9wbGw2NTUzeCh4dGFsLCBfX3Jhd19yZWFkbChTM0NfRVBMTF9DT04wKSwKKwkJCQlfX3Jhd19yZWFkbChTM0NfRVBMTF9DT04xKSk7CiAJbXBsbCA9IHMzYzY0MDBfZ2V0X3BsbCh4dGFsLCBfX3Jhd19yZWFkbChTM0NfTVBMTF9DT04pKTsKIAlhcGxsID0gczNjNjQwMF9nZXRfcGxsKHh0YWwsIF9fcmF3X3JlYWRsKFMzQ19BUExMX0NPTikpOwogCkBAIC03NDQsNyArNzQ1LDEzIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiUzNDNjRYWDogUExMIHNldHRpbmdzLCBBPSVsZCwgTT0lbGQsIEU9JWxkXG4iLAogCSAgICAgICBhcGxsLCBtcGxsLCBlcGxsKTsKIAotCWhjbGsyID0gbXBsbCAvIEdFVF9ESVYoY2xrZGl2MCwgUzNDNjQwMF9DTEtESVYwX0hDTEsyKTsKKwlpZihfX3Jhd19yZWFkbChTM0M2NFhYX09USEVSUykgJiBTM0M2NFhYX09USEVSU19TWU5DTVVYU0VMKQorCQkvKiBTeW5jaHJvbm91cyBtb2RlICovCisJCWhjbGsyID0gYXBsbCAvIEdFVF9ESVYoY2xrZGl2MCwgUzNDNjQwMF9DTEtESVYwX0hDTEsyKTsKKwllbHNlCisJCS8qIEFzeW5jaHJvbm91cyBtb2RlICovCisJCWhjbGsyID0gbXBsbCAvIEdFVF9ESVYoY2xrZGl2MCwgUzNDNjQwMF9DTEtESVYwX0hDTEsyKTsKKwogCWhjbGsgPSBoY2xrMiAvIEdFVF9ESVYoY2xrZGl2MCwgUzNDNjQwMF9DTEtESVYwX0hDTEspOwogCXBjbGsgPSBoY2xrMiAvIEdFVF9ESVYoY2xrZGl2MCwgUzNDNjQwMF9DTEtESVYwX1BDTEspOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1LmMKaW5kZXggMzc0ZTQ1ZS4uZGUwODViNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jcHUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CkBAIC0zMyw4ICszNCw4IEBACiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogCi0jaW5jbHVkZSA8bWFjaC9zM2M2NDAwLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDAwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAKIC8qIHRhYmxlIG9mIHN1cHBvcnRlZCBDUFVzICovCiAKQEAgLTQzLDE2ICs0NCwxNiBAQAogCiBzdGF0aWMgc3RydWN0IGNwdV90YWJsZSBjcHVfaWRzW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS5pZGNvZGUJCT0gMHgzNjQwMDAwMCwKLQkJLmlkbWFzawkJPSAweGZmZmZmMDAwLAorCQkuaWRjb2RlCQk9IFMzQzY0MDBfQ1BVX0lELAorCQkuaWRtYXNrCQk9IFMzQzY0WFhfQ1BVX01BU0ssCiAJCS5tYXBfaW8JCT0gczNjNjQwMF9tYXBfaW8sCiAJCS5pbml0X2Nsb2Nrcwk9IHMzYzY0MDBfaW5pdF9jbG9ja3MsCiAJCS5pbml0X3VhcnRzCT0gczNjNjQwMF9pbml0X3VhcnRzLAogCQkuaW5pdAkJPSBzM2M2NDAwX2luaXQsCiAJCS5uYW1lCQk9IG5hbWVfczNjNjQwMCwKIAl9LCB7Ci0JCS5pZGNvZGUJCT0gMHgzNjQxMDEwMCwKLQkJLmlkbWFzawkJPSAweGZmZmZmZjAwLAorCQkuaWRjb2RlCQk9IFMzQzY0MTBfQ1BVX0lELAorCQkuaWRtYXNrCQk9IFMzQzY0WFhfQ1BVX01BU0ssCiAJCS5tYXBfaW8JCT0gczNjNjQxMF9tYXBfaW8sCiAJCS5pbml0X2Nsb2Nrcwk9IHMzYzY0MTBfaW5pdF9jbG9ja3MsCiAJCS5pbml0X3VhcnRzCT0gczNjNjQxMF9pbml0X3VhcnRzLApAQCAtMTQwLDIyICsxNDEsMTUgQEAKIAogdm9pZCBfX2luaXQgczNjNjR4eF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGlkY29kZTsKLQogCS8qIGluaXRpYWxpc2UgdGhlIGlvIGRlc2NyaXB0b3JzIHdlIG5lZWQgZm9yIGluaXRpYWxpc2F0aW9uICovCiAJaW90YWJsZV9pbml0KHMzY19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjX2lvZGVzYykpOwogCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIHNpemUpOworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZShTWl84TSk7CiAKLQlpZGNvZGUgPSBfX3Jhd19yZWFkbChTM0NfVkFfU1lTICsgMHgxMTgpOwotCWlmICghaWRjb2RlKSB7Ci0JCS8qIFMzQzY0MDAgaGFzIHRoZSBJRCByZWdpc3RlciBpbiBhIGRpZmZlcmVudCBwbGFjZSwKLQkJICogYW5kIG5lZWRzIGEgd3JpdGUgYmVmb3JlIGl0IGNhbiBiZSByZWFkLiAqLworCS8qIGRldGVjdCBjcHUgaWQgKi8KKwlzM2M2NHh4X2luaXRfY3B1KCk7CiAKLQkJX19yYXdfd3JpdGVsKDB4MCwgUzNDX1ZBX1NZUyArIDB4QTFDKTsKLQkJaWRjb2RlID0gX19yYXdfcmVhZGwoUzNDX1ZBX1NZUyArIDB4QTFDKTsKLQl9Ci0KLQlzM2NfaW5pdF9jcHUoaWRjb2RlLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKKwlzM2NfaW5pdF9jcHUoc2Ftc3VuZ19jcHVfaWQsIGNwdV9pZHMsIEFSUkFZX1NJWkUoY3B1X2lkcykpOwogfQogCiBzdGF0aWMgX19pbml0IGludCBzM2M2NHh4X3N5c2Rldl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LWF1ZGlvLmMKaW5kZXggY2FkNjcwMi4uOTM0NzBiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1hdWRpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtYXVkaW8uYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtb25lbmFuZDEuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtb25lbmFuZDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5ZjllMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LW9uZW5hbmQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1vbmVuYW5kMS5jCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqICBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgotICoKLSAqIFMzQzY0WFggc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBPbmVOQU5EIGRldmljZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDNjRYWF9QQV9PTkVOQU5EMSwKLQkJLmVuZAk9IFMzQzY0WFhfUEFfT05FTkFORDEgKyAweDQwMCAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBTM0M2NFhYX1BBX09ORU5BTkQxX0JVRiwKLQkJLmVuZAk9IFMzQzY0WFhfUEFfT05FTkFORDFfQlVGICsgUzNDNjRYWF9TWl9PTkVOQU5EMV9CVUYgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX09ORU5BTkQxLAotCQkuZW5kCT0gSVJRX09ORU5BTkQxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9vbmVuYW5kMSA9IHsKLQkubmFtZQkJPSAic2Ftc3VuZy1vbmVuYW5kIiwKLQkuaWQJCT0gMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjNjR4eF9vbmVuYW5kMV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHMzYzY0eHhfb25lbmFuZDFfcmVzb3VyY2VzLAotfTsKLQotdm9pZCBzM2M2NHh4X29uZW5hbmQxX3NldF9wbGF0ZGF0YShzdHJ1Y3Qgb25lbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkYXRhLCBzaXplb2Yoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSksCi0JCQkgJnMzYzY0eHhfZGV2aWNlX29uZW5hbmQxKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYwppbmRleCAyMDRiZmFmLi4xN2Q2MmY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCkBAIC0xNDcsMTQgKzE0NywxNCBAQAogCXUzMiBjb250cm9sMCwgY29udHJvbDE7CiAKIAlzd2l0Y2ggKGNoYW4tPnNvdXJjZSkgewotCWNhc2UgUzNDMjQxMF9ETUFTUkNfSFc6CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CiAJCXNyYyA9IGNoYW4tPmRldl9hZGRyOwogCQlkc3QgPSBkYXRhOwogCQljb250cm9sMCA9IFBMMDgwX0NPTlRST0xfU1JDX0FIQjI7CiAJCWNvbnRyb2wwIHw9IFBMMDgwX0NPTlRST0xfRFNUX0lOQ1I7CiAJCWJyZWFrOwogCi0JY2FzZSBTM0MyNDEwX0RNQVNSQ19NRU06CisJY2FzZSBETUFfVE9fREVWSUNFOgogCQlzcmMgPSBkYXRhOwogCQlkc3QgPSBjaGFuLT5kZXZfYWRkcjsKIAkJY29udHJvbDAgPSBQTDA4MF9DT05UUk9MX0RTVF9BSEIyOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAKIAogaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAotCQkJICBlbnVtIHMzYzI0MTBfZG1hc3JjIHNvdXJjZSwKKwkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gc291cmNlLAogCQkJICB1bnNpZ25lZCBsb25nIGRldmFkZHIpCiB7CiAJc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4gPSBzM2NfZG1hX2xvb2t1cF9jaGFubmVsKGNoYW5uZWwpOwpAQCAtNDM3LDExICs0MzcsMTEgQEAKIAlwcl9kZWJ1ZygiJXM6IHBlcmlwaGVyYWwgJWRcbiIsIF9fZnVuY19fLCBwZXJpcGhlcmFsKTsKIAogCXN3aXRjaCAoc291cmNlKSB7Ci0JY2FzZSBTM0MyNDEwX0RNQVNSQ19IVzoKKwljYXNlIERNQV9GUk9NX0RFVklDRToKIAkJY29uZmlnID0gMiA8PCBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOwogCQljb25maWcgfD0gcGVyaXBoZXJhbCA8PCBQTDA4MF9DT05GSUdfU1JDX1NFTF9TSElGVDsKIAkJYnJlYWs7Ci0JY2FzZSBTM0MyNDEwX0RNQVNSQ19NRU06CisJY2FzZSBETUFfVE9fREVWSUNFOgogCQljb25maWcgPSAxIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7CiAJCWNvbmZpZyB8PSBwZXJpcGhlcmFsIDw8IFBMMDgwX0NPTkZJR19EU1RfU0VMX1NISUZUOwogCQlicmVhazsKQEAgLTc0MCw3ICs3NDAsNyBAQAogCX0KIAogCS8qIFNldCBhbGwgRE1BIGNvbmZpZ3VyYXRpb24gdG8gYmUgRE1BLCBub3QgU0RNQSAqLwotCXdyaXRlbCgweGZmZmZmZiwgUzNDX1NZU1JFRygweDExMCkpOworCXdyaXRlbCgweGZmZmZmZiwgUzNDNjRYWF9TRE1BX1NFTCk7CiAKIAkvKiBSZWdpc3RlciBzdGFuZGFyZCBETUEgY29udHJvbGxlcnMgKi8KIAlzM2M2NHh4X2RtYV9pbml0MSgwLCBETUFDSF9VQVJUMCwgSVJRX0RNQTAsIDB4NzUwMDAwMDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2dwaW9saWIuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9ncGlvbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjA5MDguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2dwaW9saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvZ3Bpb2xpYi5jCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDNjRYWCAtIEdQSU9saWIgc3VwcG9ydCAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi0vKiBHUElPIGJhbmsgc3VtbWFyeToKLSAqCi0gKiBCYW5rCUdQSU9zCVN0eWxlCVNscENvbglFeHRJbnQgR3JvdXAKLSAqIEEJOAk0Qml0CVllcwkxCi0gKiBCCTcJNEJpdAlZZXMJMQotICogQwk4CTRCaXQJWWVzCTIKLSAqIEQJNQk0Qml0CVllcwkzCi0gKiBFCTUJNEJpdAlZZXMJTm9uZQotICogRgkxNgkyQml0CVllcwk0IFsxXQotICogRwk3CTRCaXQJWWVzCTUKLSAqIEgJMTAJNEJpdFsyXQlZZXMJNgotICogSQkxNgkyQml0CVllcwlOb25lCi0gKiBKCTEyCTJCaXQJWWVzCU5vbmUKLSAqIEsJMTYJNEJpdFsyXQlObwlOb25lCi0gKiBMCTE1CTRCaXRbMl0gTm8JTm9uZQotICogTQk2CTRCaXQJTm8JSVJRX0VJTlQKLSAqIE4JMTYJMkJpdAlObwlJUlFfRUlOVAotICogTwkxNgkyQml0CVllcwk3Ci0gKiBQCTE1CTJCaXQJWWVzCTgKLSAqIFEJOQkyQml0CVllcwk5Ci0gKgotICogWzFdIEJBTktGIHBpbnMgMTQsMTUgZG8gbm90IGZvcm0gcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMKLSAqIFsyXSBCQU5LIGhhcyB0d28gY29udHJvbCByZWdpc3RlcnMsIEdQeENPTjAgYW5kIEdQeENPTjEKLSAqLwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzRiaXRfY2ZnX25vaW50ID0gewotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzRiaXRfY2ZnX2VpbnQwMTExID0gewotCS5jZmdfZWludAk9IDcsCi0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5nZXRfY29uZmlnCT0gczNjX2dwaW9fZ2V0Y2ZnX3MzYzY0eHhfNGJpdCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fNGJpdF9jZmdfZWludDAwMTEgPSB7Ci0JLmNmZ19laW50CT0gMywKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIGludCBzM2M2NHh4X2dwaW8yaW50X2dwbShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCi17Ci0JcmV0dXJuIHBpbiA8IDUgPyBJUlFfRUlOVCgyMykgKyBwaW4gOiAtRU5YSU87Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBncGlvXzRiaXRbXSA9IHsKLQl7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUEFfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEEoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fQV9OUiwKLQkJCS5sYWJlbAk9ICJHUEEiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQQl9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQQigwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19CX05SLAotCQkJLmxhYmVsCT0gIkdQQiIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BDX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BDKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0NfTlIsCi0JCQkubGFiZWwJPSAiR1BDIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUERfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMTExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEQoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fRF9OUiwKLQkJCS5sYWJlbAk9ICJHUEQiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQRV9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQRSgwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19FX05SLAotCQkJLmxhYmVsCT0gIkdQRSIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BHX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19laW50MDExMSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BHKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0dfTlIsCi0JCQkubGFiZWwJPSAiR1BHIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUE1fQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUE0oMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTV9OUiwKLQkJCS5sYWJlbAk9ICJHUE0iLAotCQkJLnRvX2lycSA9IHMzYzY0eHhfZ3BpbzJpbnRfZ3BtLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgaW50IHMzYzY0eHhfZ3BpbzJpbnRfZ3BsKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKLXsKLQlyZXR1cm4gcGluID49IDggPyBJUlFfRUlOVCgxNikgKyBwaW4gLSA4IDogLUVOWElPOwotfQotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZ3Bpb180Yml0MltdID0gewotCXsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQSF9CQVNFICsgMHg0LAotCQkuY29uZmlnCT0gJmdwaW9fNGJpdF9jZmdfZWludDAxMTEsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQSCgwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19IX05SLAotCQkJLmxhYmVsCT0gIkdQSCIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BLX0JBU0UgKyAweDQsCi0JCS5jb25maWcJPSAmZ3Bpb180Yml0X2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BLKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0tfTlIsCi0JCQkubGFiZWwJPSAiR1BLIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUExfQkFTRSArIDB4NCwKLQkJLmNvbmZpZwk9ICZncGlvXzRiaXRfY2ZnX2VpbnQwMDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEwoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTF9OUiwKLQkJCS5sYWJlbAk9ICJHUEwiLAotCQkJLnRvX2lycSA9IHMzYzY0eHhfZ3BpbzJpbnRfZ3BsLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvXzJiaXRfY2ZnX25vaW50ID0gewotCS5zZXRfY29uZmlnCT0gczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHgsCi0JLmdldF9jb25maWcJPSBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eCwKLQkuc2V0X3B1bGwJPSBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93biwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIGdwaW9fMmJpdF9jZmdfZWludDEwID0gewotCS5jZmdfZWludAk9IDIsCi0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eCwKLQkuZ2V0X2NvbmZpZwk9IHMzY19ncGlvX2dldGNmZ19zM2MyNHh4LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb18yYml0X2NmZ19laW50MTEgPSB7Ci0JLmNmZ19laW50CT0gMywKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4LAotCS5nZXRfY29uZmlnCT0gczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF91cGRvd24sCi0JLmdldF9wdWxsCT0gczNjX2dwaW9fZ2V0cHVsbF91cGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZ3Bpb18yYml0W10gPSB7Ci0JewotCQkuYmFzZQk9IFMzQzY0WFhfR1BGX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19laW50MTEsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTM0M2NFhYX0dQRigwKSwKLQkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19GX05SLAotCQkJLmxhYmVsCT0gIkdQRiIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzY0WFhfR1BJX0JBU0UsCi0JCS5jb25maWcJPSAmZ3Bpb18yYml0X2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BJKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0lfTlIsCi0JCQkubGFiZWwJPSAiR1BJIiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDNjRYWF9HUEpfQkFTRSwKLQkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUEooMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSl9OUiwKLQkJCS5sYWJlbAk9ICJHUEoiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQTl9CQVNFLAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKLQkJLmNvbmZpZwk9ICZncGlvXzJiaXRfY2ZnX2VpbnQxMCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFMzQzY0WFhfR1BOKDApLAotCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX05fTlIsCi0JCQkubGFiZWwJPSAiR1BOIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQT19CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUE8oMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fT19OUiwKLQkJCS5sYWJlbAk9ICJHUE8iLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQUF9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUFAoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUF9OUiwKLQkJCS5sYWJlbAk9ICJHUFAiLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0M2NFhYX0dQUV9CQVNFLAotCQkuY29uZmlnCT0gJmdwaW9fMmJpdF9jZmdfZWludDExLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzNDNjRYWF9HUFEoMCksCi0JCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUV9OUiwKLQkJCS5sYWJlbAk9ICJHUFEiLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgX19pbml0IHZvaWQgczNjNjR4eF9ncGlvbGliX2FkZF8yYml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQotewotCWNoaXAtPnBtID0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8yYml0KTsKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHMzYzY0eHhfZ3Bpb2xpYl9hZGQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXBzLAotCQkJCSAgICAgICBpbnQgbnJfY2hpcHMsCi0JCQkJICAgICAgIHZvaWQgKCpmbikoc3RydWN0IHMzY19ncGlvX2NoaXAgKikpCi17Ci0JZm9yICg7IG5yX2NoaXBzID4gMDsgbnJfY2hpcHMtLSwgY2hpcHMrKykgewotCQlpZiAoZm4pCi0JCQkoZm4pKGNoaXBzKTsKLQkJczNjX2dwaW9saWJfYWRkKGNoaXBzKTsKLQl9Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IHMzYzY0eHhfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0JczNjNjR4eF9ncGlvbGliX2FkZChncGlvXzRiaXQsIEFSUkFZX1NJWkUoZ3Bpb180Yml0KSwKLQkJCSAgICBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQpOwotCi0JczNjNjR4eF9ncGlvbGliX2FkZChncGlvXzRiaXQyLCBBUlJBWV9TSVpFKGdwaW9fNGJpdDIpLAotCQkJICAgIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDIpOwotCi0JczNjNjR4eF9ncGlvbGliX2FkZChncGlvXzJiaXQsIEFSUkFZX1NJWkUoZ3Bpb18yYml0KSwKLQkJCSAgICBzM2M2NHh4X2dwaW9saWJfYWRkXzJiaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWNvcmVfaW5pdGNhbGwoczNjNjR4eF9ncGlvbGliX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmZhODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9jbGtkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXwotI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXwotCi0jZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCi0jZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY3JhZzY0MTAuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvY3JhZzY0MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTkwNzRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9jcmFnNjQxMC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIENyYWdnYW5tb3JlIDY0MTAgc2hhcmVkIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoJTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIE1BQ0hfQ1JBRzY0MTBfSAorI2RlZmluZSBNQUNIX0NSQUc2NDEwX0gKKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2RlZmluZSBCQU5GRl9QTUlDX0lSUV9CQVNFCQlJUlFfQk9BUkRfU1RBUlQKKyNkZWZpbmUgR0xFTkZBUkNMQVNfUE1JQ19JUlFfQkFTRQkoSVJRX0JPQVJEX1NUQVJUICsgNjQpCisKKyNkZWZpbmUgUENBOTM1WF9HUElPX0JBU0UJCUdQSU9fQk9BUkRfU1RBUlQKKyNkZWZpbmUgQ09ERUNfR1BJT19CQVNFCQkoR1BJT19CT0FSRF9TVEFSVCArIDgpCisjZGVmaW5lIEdMRU5GQVJDTEFTX1BNSUNfR1BJT19CQVNFCShHUElPX0JPQVJEX1NUQVJUICsgMTYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGEyOWU3MDUuLmMwYzA3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTIxLDcgKzIxLDcgQEAKIAkgKiBhbGlnbmVkIGFuZCBhZGQgaW4gdGhlIG9mZnNldCB3aGVuIHdlIGxvYWQgdGhlIHZhbHVlIGhlcmUuCiAJICovCiAKLQkubWFjcm8gYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPSBTM0NfUEFfVUFSVAogCQlsZHIJXHJ2LCA9IChTM0NfVkFfVUFSVCArIFMzQ19QQV9VQVJUICYgMHhmZmZmZikKICNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggMGE1ZDkyNi4uZmUxYTk4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC01OCwxMSArNTgsMTUgQEAKIAlETUFDSF9NQVgJCS8qIHRoZSBlbmQgKi8KIH07CiAKLXN0YXRpYyBfX2lubGluZV9fIGJvb2wgczNjX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHNhbXN1bmdfZG1hX2lzX2RtYWRldih2b2lkKQoreworCXJldHVybiBmYWxzZTsKK30KICNkZWZpbmUgUzNDMjQxMF9ETUFGX0NJUkNVTEFSCQkoMSA8PCAwKQogCiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KQEAgLTk1LDcgKzk5LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQkgcGVyaXBoZXJhbDsKIAogCXVuc2lnbmVkIGludAkJIGZsYWdzOwotCWVudW0gczNjMjQxMF9kbWFzcmMJIHNvdXJjZTsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgkgc291cmNlOwogCiAKIAlkbWFfYWRkcl90CQlkZXZfYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMGQ0NmU5OS4uNmUzNGMyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEyLDExICsxMiw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLQogLyogR1BJTyBiYW5rIHNpemVzICovCiAjZGVmaW5lIFMzQzY0WFhfR1BJT19BX05SCSg4KQogI2RlZmluZSBTM0M2NFhYX0dQSU9fQl9OUgkoNykKQEAgLTk2LDUgKzkxLDMgQEAKICNkZWZpbmUgQk9BUkRfTlJfR1BJT1MgMTYKIAogI2RlZmluZSBBUkNIX05SX0dQSU9TCShHUElPX0JPQVJEX1NUQVJUICsgQk9BUkRfTlJfR1BJT1MpCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL21hcC5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tYXAuaAppbmRleCBhMWYxM2YwLi4yM2ExZDcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL21hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvbWFwLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9NQVBfSCBfX0ZJTEVfXwogCiAjaW5jbHVkZSA8cGxhdC9tYXAtYmFzZS5oPgorI2luY2x1ZGUgPHBsYXQvbWFwLXMzYy5oPgogCiAvKgogICogUG9zdC1tdXggQ2hpcCBTZWxlY3QgUmVnaW9ucyBYbTBDU25fCkBAIC04Myw3ICs4NCw2IEBACiAjZGVmaW5lIFMzQzY0WFhfUEFfSUlDMQkJKDB4N0YwMEYwMDApCiAKICNkZWZpbmUgUzNDNjRYWF9QQV9HUElPCQkoMHg3RjAwODAwMCkKLSNkZWZpbmUgUzNDNjRYWF9WQV9HUElPCQlTM0NfQUREUl9DUFUoMHgwMDAwMDAwMCkKICNkZWZpbmUgUzNDNjRYWF9TWl9HUElPCQlTWl80SwogCiAjZGVmaW5lIFMzQzY0WFhfUEFfU0RSQU0JKDB4NTAwMDAwMDApCkBAIC05NCwxNiArOTQsMTAgQEAKICNkZWZpbmUgUzNDNjRYWF9QQV9WSUMxCQkoMHg3MTMwMDAwMCkKIAogI2RlZmluZSBTM0M2NFhYX1BBX01PREVNCSgweDc0MTA4MDAwKQotI2RlZmluZSBTM0M2NFhYX1ZBX01PREVNCVMzQ19BRERSX0NQVSgweDAwMTAwMDAwKQogCiAjZGVmaW5lIFMzQzY0WFhfUEFfVVNCSE9TVAkoMHg3NDMwMDAwMCkKIAogI2RlZmluZSBTM0M2NFhYX1BBX1VTQl9IU1BIWQkoMHg3QzEwMDAwMCkKLSNkZWZpbmUgUzNDNjRYWF9WQV9VU0JfSFNQSFkJUzNDX0FERFJfQ1BVKDB4MDAyMDAwMDApCi0KLS8qIHBsYWNlIFZJQ3MgY2xvc2UgdG9nZXRoZXIgKi8KLSNkZWZpbmUgVkFfVklDMAkJCShTM0NfVkFfSVJRICsgMHgwMCkKLSNkZWZpbmUgVkFfVklDMQkJCShTM0NfVkFfSVJRICsgMHgxMDAwMCkKIAogLyogY29tcGF0aWJpbHRpeSBkZWZpbmVzLiAqLwogI2RlZmluZSBTM0NfUEFfVElNRVIJCVMzQzY0WFhfUEFfVElNRVIKQEAgLTExOSw3ICsxMTMsNiBAQAogI2RlZmluZSBTM0NfUEFfRkIJCVMzQzY0WFhfUEFfRkIKICNkZWZpbmUgUzNDX1BBX1VTQkhPU1QJCVMzQzY0WFhfUEFfVVNCSE9TVAogI2RlZmluZSBTM0NfUEFfVVNCX0hTT1RHCVMzQzY0WFhfUEFfVVNCX0hTT1RHCi0jZGVmaW5lIFMzQ19WQV9VU0JfSFNQSFkJUzNDNjRYWF9WQV9VU0JfSFNQSFkKICNkZWZpbmUgUzNDX1BBX1JUQwkJUzNDNjRYWF9QQV9SVEMKICNkZWZpbmUgUzNDX1BBX1dEVAkJUzNDNjRYWF9QQV9XQVRDSERPRwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2MGNkYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQgICAgIFVMKDB4NTAwMDAwMDApCi0KLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRQlTWl84TQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcGxsLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWYwYmI2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcGxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L3BsbC5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0M2NFhYIFBMTCBjb2RlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNkZWZpbmUgUzNDNjQwMF9QTExfTURJVl9NQVNLCSgoMSA8PCAoMjUtMTYrMSkpIC0gMSkKLSNkZWZpbmUgUzNDNjQwMF9QTExfUERJVl9NQVNLCSgoMSA8PCAoMTMtOCsxKSkgLSAxKQotI2RlZmluZSBTM0M2NDAwX1BMTF9TRElWX01BU0sJKCgxIDw8ICgyLTArMSkpIC0gMSkKLSNkZWZpbmUgUzNDNjQwMF9QTExfTURJVl9TSElGVAkoMTYpCi0jZGVmaW5lIFMzQzY0MDBfUExMX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFMzQzY0MDBfUExMX1NESVZfU0hJRlQJKDApCi0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlIDxwbGF0L3BsbDY1NTN4Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzM2M2NDAwX2dldF9wbGwodW5zaWduZWQgbG9uZyBiYXNlY2xrLAotCQkJCQkgICAgdTMyIHBsbGNvbikKLXsKLQl1MzIgbWRpdiwgcGRpdiwgc2RpdjsKLQl1NjQgZnZjbyA9IGJhc2VjbGs7Ci0KLQltZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9NRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX01ESVZfTUFTSzsKLQlwZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9QRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX1BESVZfTUFTSzsKLQlzZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9TRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX1NESVZfTUFTSzsKLQotCWZ2Y28gKj0gbWRpdjsKLQlkb19kaXYoZnZjbywgKHBkaXYgPDwgc2RpdikpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ2Y287Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzM2M2NDAwX2dldF9lcGxsKHVuc2lnbmVkIGxvbmcgYmFzZWNsaykKLXsKLQlyZXR1cm4gczNjX2dldF9wbGw2NTUzeChiYXNlY2xrLCBfX3Jhd19yZWFkbChTM0NfRVBMTF9DT04wKSwKLQkJCQlfX3Jhd19yZWFkbChTM0NfRVBMTF9DT04xKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCmluZGV4IDM4NjU5YmUuLmZjZjNkY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlfX3Jhd193cml0ZWwoMCwgUzNDNjRYWF9TTFBFTik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fc2F2ZWRfZ3Bpb3Modm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYW1zdW5nX3BtX3NhdmVkX2dwaW9zKHZvaWQpCiB7CiAJLyogdHVybiBvbiB0aGUgc2xlZXAgbW9kZSBhbmQga2VlcCBpdCB0aGVyZSwgYXMgaXQgc2VlbXMgdGhhdCBkdXJpbmcKIAkgKiBzdXNwZW5kIHRoZSB4Q09OIHJlZ2lzdGVycyBnZXQgcmUtc2V0IGFuZCB0aHVzIHlvdSBjYW4gZW5kIHVwIHdpdGgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjViZWRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDNjR4eCAtIHB3bSBjbG9jayBhbmQgdGltZXIgc3VwcG9ydAotICovCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIHRjZmcgPj0gUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSzsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8IHRjZmcxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLXN5cy5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9yZWdzLXN5cy5oCmluZGV4IDY5Yjc4ZDkuLmI5MWUwMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcmVncy1zeXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3JlZ3Mtc3lzLmgKQEAgLTIxLDggKzIxLDExIEBACiAjZGVmaW5lIFMzQzY0WFhfQUhCX0NPTjEJUzNDX1NZU1JFRygweDEwNCkKICNkZWZpbmUgUzNDNjRYWF9BSEJfQ09OMglTM0NfU1lTUkVHKDB4MTA4KQogCisjZGVmaW5lIFMzQzY0WFhfU0RNQV9TRUwJUzNDX1NZU1JFRygweDExMCkKKwogI2RlZmluZSBTM0M2NFhYX09USEVSUwkJUzNDX1NZU1JFRygweDkwMCkKIAogI2RlZmluZSBTM0M2NFhYX09USEVSU19VU0JNQVNLCSgxIDw8IDE2KQorI2RlZmluZSBTM0M2NFhYX09USEVSU19TWU5DTVVYU0VMCSgxIDw8IDYpCiAKICNlbmRpZiAvKiBfUExBVF9SRUdTX1NZU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MDAuaCBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvczNjNjQwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY5NThkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvczNjNjQwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaHQvczNjNjQwMC5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczNjNjQwMCBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBDb21tb24gaW5pdCBjb2RlIGZvciBTM0M2NDAwIHJlbGF0ZWQgU29DcyAqLwotCi1leHRlcm4gdm9pZCBzM2M2NDAwX2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLWV4dGVybiB2b2lkIHMzYzY0MDBfc2V0dXBfY2xvY2tzKHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2M2NHh4X3JlZ2lzdGVyX2Nsb2Nrcyh1bnNpZ25lZCBsb25nIHh0YWwsIHVuc2lnbmVkIGFybWNsa19saW1pdCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MDAKLQotZXh0ZXJuICBpbnQgczNjNjQwMF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgczNjNjQwMF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIHMzYzY0MDBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgczNjNjQwMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNkZWZpbmUgczNjNjQwMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKLQotI2Vsc2UKLSNkZWZpbmUgczNjNjQwMF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHMzYzY0MDBfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHMzYzY0MDBfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczNjNjQwMF9pbml0IE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9zM2M2NDEwLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMTE0MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvaW5jbHVkZS9tYWNoL3MzYzY0MTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvczNjNjQxMC5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sICBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHMzYzY0MTAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmZGVmIENPTkZJR19DUFVfUzNDNjQxMAotCi1leHRlcm4gIGludCBzM2M2NDEwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzM2M2NDEwX2luaXRfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgczNjNjQxMF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBzM2M2NDEwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKLQotI2RlZmluZSBzM2M2NDEwX2luaXRfdWFydHMgczNjNjQwMF9jb21tb25faW5pdF91YXJ0cwotCi0jZWxzZQotI2RlZmluZSBzM2M2NDEwX2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczNjNjQxMF9pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczNjNjQxMF9tYXBfaW8gTlVMTAotI2RlZmluZSBzM2M2NDEwX2luaXQgTlVMTAotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1hbnc2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1hbnc2NDEwLmMKaW5kZXggY2I4ODY0My4uOGViYTg4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtYW53NjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWFudzY0MTAuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPHBsYXQvZmIuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3MtZmItdjQuaD4KIAotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQU5XNjQxMCwgIkEmVzY0MTAiKQogCS8qIE1haW50YWluZXI6IEt3YW5nd29vIExlZSA8a3dhbmd3b28ubGVlQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2M2NDEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gYW53NjQxMF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC1tb2R1bGUuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWNyYWc2NDEwLW1vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjY4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC1tb2R1bGUuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogU3BleXNpZGUgbW9kdWxlcyBmb3IgQ3JhZ2dhbm1vcmUgLSBib2FyZCBkYXRhIHByb2JpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKglNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9ncGlvLmg+CisKKyNpbmNsdWRlIDxzb3VuZC93bTg5OTYuaD4KKyNpbmNsdWRlIDxzb3VuZC93bTg5NjIuaD4KKyNpbmNsdWRlIDxzb3VuZC93bTkwODEuaD4KKworI2luY2x1ZGUgPG1hY2gvY3JhZzY0MTAuaD4KKworc3RhdGljIHN0cnVjdCB3bTg5OTZfcmV0dW5lX21vYmlsZV9jb25maWcgd204OTk2X3JldHVuZVtdID0geworCXsKKwkJLm5hbWUgPSAiU3ViIExQRiIsCisJCS5yYXRlID0gNDgwMDAsCisJCS5yZWdzID0geworCQkJMHg2MzE4LCAweDYzMDAsIDB4MTAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLAorCQkJMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwgMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLAorCQkJMHhGMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgxMDAwLCAweDA4MDAsIDB4NDAwMAorCQl9LAorCX0sCisJeworCQkubmFtZSA9ICJTdWIgSFBGIiwKKwkJLnJhdGUgPSA0ODAwMCwKKwkJLnJlZ3MgPSB7CisJCQkweDAwMEEsIDB4NjMwMCwgMHgxMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsCisJCQkweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDIwMDAsCisJCQkweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDEwMDAsIDB4MDgwMCwgMHg0MDAwCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd204OTk2X3BkYXRhIHdtODk5Nl9wZGF0YSBfX2luaXRkYXRhID0geworCS5sZG9fZW5hID0gUzNDNjRYWF9HUE4oNyksCisJLmdwaW9fYmFzZSA9IENPREVDX0dQSU9fQkFTRSwKKwkubWljZGV0X2RlZiA9IDEsCisJLmlubF9tb2RlID0gV004OTk2X0RJRkZFUlJFTlRJQUxfMSwKKwkuaW5yX21vZGUgPSBXTTg5OTZfRElGRkVSUkVOVElBTF8xLAorCisJLmlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkcsCisKKwkuZ3Bpb19kZWZhdWx0ID0geworCQkweDgwMDEsIC8qIEdQSU8xID09IEFEQ0xSQ0xLMSAqLworCQkweDgwMDEsIC8qIEdQSU8yID09IEFEQ0xSQ0xLMiwgaW5wdXQgZHVlIHRvIENQVSAqLworCQkweDAxNDEsIC8qIEdQSU8zID09IEhQX1NFTCAqLworCQkweDAwMDIsIC8qIEdQSU80ID09IElSUSAqLworCQkweDAyMGUsIC8qIEdQSU81ID09IENMS09VVCAqLworCX0sCisKKwkucmV0dW5lX21vYmlsZV9jZmdzID0gd204OTk2X3JldHVuZSwKKwkubnVtX3JldHVuZV9tb2JpbGVfY2ZncyA9IEFSUkFZX1NJWkUod204OTk2X3JldHVuZSksCit9OworCitzdGF0aWMgc3RydWN0IHdtODk2Ml9wZGF0YSB3bTg5NjJfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuZ3Bpb19pbml0ID0geworCQkwLAorCQlXTTg5NjJfR1BJT19GTl9PUENMSywKKwkJV004OTYyX0dQSU9fRk5fRE1JQ0NMSywKKwkJMCwKKwkJMHg4MDAwIHwgV004OTYyX0dQSU9fRk5fRE1JQ0RBVCwKKwkJV004OTYyX0dQSU9fRk5fSVJRLCAgICAvKiBPcGVuIGRyYWluIG1vZGUgKi8KKwl9LAorCS5pcnFfYWN0aXZlX2xvdyA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHdtOTA4MV9wZGF0YSB3bTkwODFfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuaXJxX2hpZ2ggPSBmYWxzZSwKKwkuaXJxX2Ntb3MgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gd20xMjU0X2RldnNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg5OTYiLCAweDFhKSwKKwkgIC5wbGF0Zm9ybV9kYXRhID0gJndtODk5Nl9wZGF0YSwKKwkgIC5pcnEgPSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFICsgV004MzFYX0lSUV9HUElPXzIsCisJfSwKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTkwODEiLCAweDZjKSwKKwkgIC5wbGF0Zm9ybV9kYXRhID0gJndtOTA4MV9wZGF0YSwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gd20xMjU1X2RldnNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTUxMDAiLCAweDFhKSwKKwkgIC5pcnEgPSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFICsgV004MzFYX0lSUV9HUElPXzIsCisJfSwKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTkwODEiLCAweDZjKSwKKwkgIC5wbGF0Zm9ybV9kYXRhID0gJndtOTA4MV9wZGF0YSwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gd20xMjU5X2RldnNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg5NjIiLCAweDFhKSwKKwkgIC5wbGF0Zm9ybV9kYXRhID0gJndtODk2Ml9wZGF0YSwKKwkgIC5pcnEgPSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFICsgV004MzFYX0lSUV9HUElPXzIsCisJfSwKK307CisKKworc3RhdGljIF9fZGV2aW5pdGRhdGEgY29uc3Qgc3RydWN0IHsKKwl1OCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaTJjX2RldnM7CisJaW50IG51bV9pMmNfZGV2czsKK30gZ2ZfbW9kc1tdID0geworCXsgLmlkID0gMHgwMSwgLm5hbWUgPSAiMTI1MC1FVjEgU3ByaW5nYmFuayIgfSwKKwl7IC5pZCA9IDB4MDIsIC5uYW1lID0gIjEyNTEtRVYxIEp1cmEiIH0sCisJeyAuaWQgPSAweDAzLCAubmFtZSA9ICIxMjUyLUVWMSBHbGVubGl2ZXQiIH0sCisJeyAuaWQgPSAweDExLCAubmFtZSA9ICI2MjQ5LUVWMiBHbGVuZmFyY2xhcyIsIH0sCisJeyAuaWQgPSAweDIxLCAubmFtZSA9ICIxMjc1LUVWMSBNb3J0bGFjaCIgfSwKKwl7IC5pZCA9IDB4MjUsIC5uYW1lID0gIjEyNzQtRVYxIEdsZW5jYWRhbSIgfSwKKwl7IC5pZCA9IDB4MzEsIC5uYW1lID0gIjEyNTMtRVYxIFRvbWF0aW4iLCB9LAorCXsgLmlkID0gMHgzOSwgLm5hbWUgPSAiMTI1NC1FVjEgRGFsbGFzIERodSIsCisJICAuaTJjX2RldnMgPSB3bTEyNTRfZGV2cywgLm51bV9pMmNfZGV2cyA9IEFSUkFZX1NJWkUod20xMjU0X2RldnMpIH0sCisJeyAuaWQgPSAweDNhLCAubmFtZSA9ICIxMjU5LUVWMSBUb2Jlcm1vcnkiLAorCSAgLmkyY19kZXZzID0gd20xMjU5X2RldnMsIC5udW1faTJjX2RldnMgPSBBUlJBWV9TSVpFKHdtMTI1OV9kZXZzKSB9LAorCXsgLmlkID0gMHgzYiwgLm5hbWUgPSAiMTI1NS1FVjEgS2lsY2hvbWFuIiwKKwkgIC5pMmNfZGV2cyA9IHdtMTI1NV9kZXZzLCAubnVtX2kyY19kZXZzID0gQVJSQVlfU0laRSh3bTEyNTVfZGV2cykgfSwKKwl7IC5pZCA9IDB4M2MsIC5uYW1lID0gIjEyNzMtRVYxIExvbmdtb3JuIiB9LAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgd2xmX2dmX21vZHVsZV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK3sKKwlpbnQgcmV0LCBpLCBqLCBpZCwgcmV2OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGkyYywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBJRDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWQgPSAocmV0ICYgMHhmZSkgPj4gMjsKKwlyZXYgPSByZXQgJiAweDM7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2ZfbW9kcyk7IGkrKykKKwkJaWYgKGlkID09IGdmX21vZHNbaV0uaWQpCisJCQlicmVhazsKKworCWlmIChpIDwgQVJSQVlfU0laRShnZl9tb2RzKSkgeworCQlkZXZfaW5mbygmaTJjLT5kZXYsICIlcyByZXZpc2lvbiAlZFxuIiwKKwkJCSBnZl9tb2RzW2ldLm5hbWUsIHJldiArIDEpOworCQlmb3IgKGogPSAwOyBqIDwgZ2ZfbW9kc1tpXS5udW1faTJjX2RldnM7IGorKykgeworCQkJaWYgKCFpMmNfbmV3X2RldmljZShpMmMtPmFkYXB0ZXIsCisJCQkJCSAgICAmKGdmX21vZHNbaV0uaTJjX2RldnNbal0pKSkKKwkJCQlkZXZfZXJyKCZpMmMtPmRldiwKKwkJCQkJIkZhaWxlZCB0byByZWdpc3RlciBkZXY6ICVkXG4iLCByZXQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJmkyYy0+ZGV2LCAiVW5rbm93biBtb2R1bGUgSUQgJWQgcmV2aXNpb24gJWRcbiIsCisJCQkgaWQsIHJldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bGZfZ2ZfbW9kdWxlX2lkW10gPSB7CisJeyAid2xmLWdmLW1vZHVsZSIsIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bGZfZ2ZfbW9kdWxlX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bGYtZ2YtbW9kdWxlIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB3bGZfZ2ZfbW9kdWxlX3Byb2JlLAorCS5pZF90YWJsZSA9IHdsZl9nZl9tb2R1bGVfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bGZfZ2ZfbW9kdWxlX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3bGZfZ2ZfbW9kdWxlX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh3bGZfZ2ZfbW9kdWxlX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWNyYWc2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1jcmFnNjQxMC5jCmluZGV4IGFmMGMyZmUuLmQwNGI2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLWNyYWc2NDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtY3JhZzY0MTAuYwpAQCAtNDMsMTMgKzQzLDE0IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3lzLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KKyNpbmNsdWRlIDxtYWNoL2NyYWc2NDEwLmg+CiAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby1tZW1wb3J0Lmg+CiAKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgpAQCAtNjUsMTcgKzY2LDYgQEAKICNpbmNsdWRlIDxwbGF0L2lpYy5oPgogI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAotI2luY2x1ZGUgPHNvdW5kL3dtODk5Ni5oPgotI2luY2x1ZGUgPHNvdW5kL3dtODk2Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3dtOTA4MS5oPgotCi0jZGVmaW5lIEJBTkZGX1BNSUNfSVJRX0JBU0UJCUlSUV9CT0FSRF9TVEFSVAotI2RlZmluZSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFCShJUlFfQk9BUkRfU1RBUlQgKyA2NCkKLQotI2RlZmluZSBQQ0E5MzVYX0dQSU9fQkFTRQkJR1BJT19CT0FSRF9TVEFSVAotI2RlZmluZSBDT0RFQ19HUElPX0JBU0UJCShHUElPX0JPQVJEX1NUQVJUICsgOCkKLSNkZWZpbmUgR0xFTkZBUkNMQVNfUE1JQ19HUElPX0JBU0UJKEdQSU9fQk9BUkRfU1RBUlQgKyAxNikKLQogLyogc2VyaWFsIHBvcnQgc2V0dXAgKi8KIAogI2RlZmluZSBVQ09OIChTM0MyNDEwX1VDT05fREVGQVVMVCB8IFMzQzI0MTBfVUNPTl9VQ0xLKQpAQCAtMjg3LDYgKzI3NywxMSBAQAogCS5pZAkJPSAtMSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxvd2xhbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJsb3dsYW5kIiwKKwkuaWQJCT0gLTEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzcGV5c2lkZV93bTg5NjJfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzcGV5c2lkZS13bTg5NjIiLAogCS5pZAkJPSAtMSwKQEAgLTI5NSw2ICsyOTAsOCBAQAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHdhbGx2ZGRfY29uc3VtZXJzW10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgiU1BLVkREMSIsICIxLTAwMWEiKSwKIAlSRUdVTEFUT1JfU1VQUExZKCJTUEtWREQyIiwgIjEtMDAxYSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIlNQS1ZEREwiLCAiMS0wMDFhIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiU1BLVkREUiIsICIxLTAwMWEiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB3YWxsdmRkX2RhdGEgPSB7CkBAIC0zMjksOSArMzI2LDYgQEAKIAkmczNjX2RldmljZV9mYiwKIAkmczNjX2RldmljZV9vaGNpLAogCSZzM2NfZGV2aWNlX3VzYl9oc290ZywKLQkmczNjX2RldmljZV9hZGMsCi0JJnMzY19kZXZpY2VfcnRjLAotCSZzM2NfZGV2aWNlX3RzLAogCSZzM2NfZGV2aWNlX3RpbWVyWzBdLAogCSZzM2M2NHh4X2RldmljZV9paXMwLAogCSZzM2M2NHh4X2RldmljZV9paXMxLApAQCAtMzQ1LDYgKzMzOSw3IEBACiAJJmNyYWc2NDEwX2JhY2tsaWdodF9kZXZpY2UsCiAJJnNwZXlzaWRlX2RldmljZSwKIAkmc3BleXNpZGVfd204OTYyX2RldmljZSwKKwkmbG93bGFuZF9kZXZpY2UsCiAJJndhbGx2ZGRfZGV2aWNlLAogfTsKIApAQCAtMzUzLDYgKzM0OCwxMiBAQAogCS5pcnFfYmFzZQk9IDAsCiB9OwogCisvKiBWRERBUk0gaXMgY29udHJvbGxlZCBieSBEVlMxIGNvbm5lY3RlZCB0byBHUEsoMCkgKi8KK3N0YXRpYyBzdHJ1Y3Qgd204MzF4X2J1Y2t2X3BkYXRhIHZkZGFybV9wZGF0YSA9IHsKKwkuZHZzX2NvbnRyb2xfc3JjID0gMSwKKwkuZHZzX2dwaW8gPSBTM0M2NFhYX0dQSygwKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2ZGRhcm1fY29uc3VtZXJzW10gX19pbml0ZGF0YSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRhcm0iLCBOVUxMKSwKIH07CkBAIC0zNjgsNiArMzY5LDcgQEAKIAkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRSh2ZGRhcm1fY29uc3VtZXJzKSwKIAkuY29uc3VtZXJfc3VwcGxpZXMgPSB2ZGRhcm1fY29uc3VtZXJzLAogCS5zdXBwbHlfcmVndWxhdG9yID0gIldBTExWREQiLAorCS5kcml2ZXJfZGF0YSA9ICZ2ZGRhcm1fcGRhdGEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgdmRkaW50IF9faW5pdGRhdGEgPSB7CkBAIC01MDMsNiArNTA1LDggQEAKIAkuYmFja3VwID0gJmJhbmZmX2JhY2t1cF9wZGF0YSwKIAogCS5ncGlvX2RlZmF1bHRzID0geworCQkvKiBHUElPNTogRFZTMV9SRVEgLSBDTU9TLCBEQlZERCwgYWN0aXZlIGhpZ2ggKi8KKwkJWzRdID0gV004MzFYX0dQTl9ESVIgfCBXTTgzMVhfR1BOX1BPTCB8IFdNODMxWF9HUE5fRU5BIHwgMHg4LAogCQkvKiBHUElPMTE6IFRvdWNoc2NyZWVuIGRhdGEgLSBDTU9TLCBEQlZERCwgYWN0aXZlIGhpZ2gqLwogCQlbMTBdID0gV004MzFYX0dQTl9QT0wgfCBXTTgzMVhfR1BOX0VOQSB8IDB4NiwKIAkJLyogR1BJTzEyOiBUb3VjaHNjcmVlbiBwZW4gZG93biAtIENNT1MsIERCVkRELCBhY3RpdmUgaGlnaCovCkBAIC01NjAsOCArNTY0LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcHZkZF8xdjhfY29uc3VtZXJzW10gX19pbml0ZGF0YSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJMRE9WREQiLCAiMS0wMDFhIiksCiAJUkVHVUxBVE9SX1NVUFBMWSgiUExMVkREIiwgIjEtMDAxYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoIkRCVkREIiwgIjEtMDAxYSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoIkRCVkREMSIsICIxLTAwMWEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJEQlZERDIiLCAiMS0wMDFhIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiREJWREQzIiwgIjEtMDAxYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoIkNQVkREIiwgIjEtMDAxYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoIkFWREQyIiwgIjEtMDAxYSIpLAogCVJFR1VMQVRPUl9TVVBQTFkoIkRDVkREIiwgIjEtMDAxYSIpLApAQCAtNjE0LDgxICs2MjIsMTYgQEAKIAkuZGlzYWJsZV90b3VjaCA9IHRydWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHdtODk5Nl9yZXR1bmVfbW9iaWxlX2NvbmZpZyB3bTg5OTZfcmV0dW5lW10gPSB7Ci0JewotCQkubmFtZSA9ICJTdWIgTFBGIiwKLQkJLnJhdGUgPSA0ODAwMCwKLQkJLnJlZ3MgPSB7Ci0JCQkweDYzMTgsIDB4NjMwMCwgMHgxMDAwLCAweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsCi0JCQkweDAwMDAsIDB4MDAwNCwgMHgyMDAwLCAweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDIwMDAsCi0JCQkweEYwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDEwMDAsIDB4MDgwMCwgMHg0MDAwCi0JCX0sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlN1YiBIUEYiLAotCQkucmF0ZSA9IDQ4MDAwLAotCQkucmVncyA9IHsKLQkJCTB4MDAwQSwgMHg2MzAwLCAweDEwMDAsIDB4MDAwMCwgMHgwMDA0LCAweDIwMDAsIDB4RjAwMCwKLQkJCTB4MDAwMCwgMHgwMDA0LCAweDIwMDAsIDB4RjAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MjAwMCwKLQkJCTB4RjAwMCwgMHgwMDAwLCAweDAwMDQsIDB4MTAwMCwgMHgwODAwLCAweDQwMDAKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCB3bTg5OTZfcGRhdGEgd204OTk2X3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmxkb19lbmEgPSBTM0M2NFhYX0dQTig3KSwKLQkuZ3Bpb19iYXNlID0gQ09ERUNfR1BJT19CQVNFLAotCS5taWNkZXRfZGVmID0gMSwKLQkuaW5sX21vZGUgPSBXTTg5OTZfRElGRkVSUkVOVElBTF8xLAotCS5pbnJfbW9kZSA9IFdNODk5Nl9ESUZGRVJSRU5USUFMXzEsCi0KLQkuaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX1JJU0lORywKLQotCS5ncGlvX2RlZmF1bHQgPSB7Ci0JCTB4ODAwMSwgLyogR1BJTzEgPT0gQURDTFJDTEsxICovCi0JCTB4ODAwMSwgLyogR1BJTzIgPT0gQURDTFJDTEsyLCBpbnB1dCBkdWUgdG8gQ1BVICovCi0JCTB4MDE0MSwgLyogR1BJTzMgPT0gSFBfU0VMICovCi0JCTB4MDAwMiwgLyogR1BJTzQgPT0gSVJRICovCi0JCTB4MDIwZSwgLyogR1BJTzUgPT0gQ0xLT1VUICovCi0JfSwKLQotCS5yZXR1bmVfbW9iaWxlX2NmZ3MgPSB3bTg5OTZfcmV0dW5lLAotCS5udW1fcmV0dW5lX21vYmlsZV9jZmdzID0gQVJSQVlfU0laRSh3bTg5OTZfcmV0dW5lKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd204OTYyX3BkYXRhIHdtODk2Ml9wZGF0YSBfX2luaXRkYXRhID0gewotCS5ncGlvX2luaXQgPSB7Ci0JCTAsCi0JCVdNODk2Ml9HUElPX0ZOX09QQ0xLLAotCQlXTTg5NjJfR1BJT19GTl9ETUlDQ0xLLAotCQkwLAotCQkweDgwMDAgfCBXTTg5NjJfR1BJT19GTl9ETUlDREFULAotCQlXTTg5NjJfR1BJT19GTl9JUlEsICAgIC8qIE9wZW4gZHJhaW4gbW9kZSAqLwotCX0sCi0JLmlycV9hY3RpdmVfbG93ID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd205MDgxX3BkYXRhIHdtOTA4MV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5pcnFfaGlnaCA9IGZhbHNlLAotCS5pcnFfY21vcyA9IGZhbHNlLAotfTsKLQogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czFbXSBfX2luaXRkYXRhID0gewogCXsgSTJDX0JPQVJEX0lORk8oIndtODMxMSIsIDB4MzQpLAogCSAgLmlycSA9IFMzQ19FSU5UKDApLAogCSAgLnBsYXRmb3JtX2RhdGEgPSAmZ2xlbmZhcmNsYXNfcG1pY19wZGF0YSB9LAogCisJeyBJMkNfQk9BUkRfSU5GTygid2xmLWdmLW1vZHVsZSIsIDB4MjQpIH0sCisJeyBJMkNfQk9BUkRfSU5GTygid2xmLWdmLW1vZHVsZSIsIDB4MjUpIH0sCisJeyBJMkNfQk9BUkRfSU5GTygid2xmLWdmLW1vZHVsZSIsIDB4MjYpIH0sCisKIAl7IEkyQ19CT0FSRF9JTkZPKCJ3bTEyNTAtZXYxIiwgMHgyNykgfSwKLQl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg5OTYiLCAweDFhKSwKLQkgIC5wbGF0Zm9ybV9kYXRhID0gJndtODk5Nl9wZGF0YSwKLQkgIC5pcnEgPSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFICsgV004MzFYX0lSUV9HUElPXzIsCi0JfSwKLQl7IEkyQ19CT0FSRF9JTkZPKCJ3bTkwODEiLCAweDZjKSwKLQkgIC5wbGF0Zm9ybV9kYXRhID0gJndtOTA4MV9wZGF0YSwgfSwKLQl7IEkyQ19CT0FSRF9JTkZPKCJ3bTg5NjIiLCAweDFhKSwKLQkgIC5wbGF0Zm9ybV9kYXRhID0gJndtODk2Ml9wZGF0YSwKLQkgIC5pcnEgPSBHTEVORkFSQ0xBU19QTUlDX0lSUV9CQVNFICsgV004MzFYX0lSUV9HUElPXzIsCi0JfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjcmFnNjQxMF9tYXBfaW8odm9pZCkKQEAgLTc2Niw3ICs3MDksNyBAQAogCiBNQUNISU5FX1NUQVJUKFdMRl9DUkFHR182NDEwLCAiV29sZnNvbiBDcmFnZ2FubW9yZSA2NDEwIikKIAkvKiBNYWludGFpbmVyOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IGNyYWc2NDEwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gY3JhZzY0MTBfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtaG10LmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1obXQuYwppbmRleCBiM2Q5M2NjLi45NTJmNzVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1obXQuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1obXQuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPHBsYXQvZmIuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KIAotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSE1ULCAiQWlyZ29vLUhNVCIpCiAJLyogTWFpbnRhaW5lcjogUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IGhtdF9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IGhtdF9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1taW5pNjQxMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbWluaTY0MTAuYwppbmRleCA1MjdmNDliLi4xYmM4NWMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1taW5pNjQxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLW1pbmk2NDEwLmMKQEAgLTMyLDggKzMyLDggQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1tb2RlbS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1zcm9tLmg+Ci0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CiAKKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2FkYy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CkBAIC0yMDUsMTIgKzIwNSw2IEBACiAJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJm1pbmk2NDEwX2xjZF9wb3dlcl9kYXRhLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWluaTY0MTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJm1pbmk2NDEwX2RldmljZV9ldGgsCiAJJnMzY19kZXZpY2VfaHNtbWMwLApAQCAtMzE5LDcgKzMxMyw3IEBACiAKIAlzM2NfbmFuZF9zZXRfcGxhdGRhdGEoJm1pbmk2NDEwX25hbmRfaW5mbyk7CiAJczNjX2ZiX3NldF9wbGF0ZGF0YSgmbWluaTY0MTBfbGNkX3BkYXRhKTsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KIApAQCAtMzQ5LDcgKzM0Myw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTUlOSTY0MTAsICJNSU5JNjQxMCIpCiAJLyogTWFpbnRhaW5lcjogRGFyaXVzIEF1Z3VsaXMgPGF1Z3VsaXMuZGFyaXVzQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IG1pbmk2NDEwX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gbWluaTY0MTBfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtbmNwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYwppbmRleCAwMWM2ODU3Li5jYjEzY2JhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1uY3AuYwpAQCAtMzksNyArMzksNyBAQAogI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgogCi0jaW5jbHVkZSA8bWFjaC9zM2M2NDEwLmg+CisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CkBAIC05Nyw3ICs5Nyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoTkNQLCAiTkNQIikKIAkvKiBNYWludGFpbmVyOiBTYW1zdW5nIEVsZWN0cm9uaWNzICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHMzYzY0MTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBuY3BfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBuY3BfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtcmVhbDY0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXJlYWw2NDEwLmMKaW5kZXggOTViMDRiMS4uODcyODFlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtcmVhbDY0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1yZWFsNjQxMC5jCkBAIC0zMyw4ICszMyw4IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbW9kZW0uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3JvbS5oPgotI2luY2x1ZGUgPG1hY2gvczNjNjQxMC5oPgogCisjaW5jbHVkZSA8cGxhdC9zM2M2NDEwLmg+CiAjaW5jbHVkZSA8cGxhdC9hZGMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgpAQCAtMTk4LDEyICsxOTgsNiBAQAogCSZzM2NfZGV2aWNlX29oY2ksCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvIHMzY190c19wbGF0Zm9ybSBfX2luaXRkYXRhID0gewotCS5kZWxheQkJCT0gMTAwMDAsCi0JLnByZXNjCQkJPSA0OSwKLQkub3ZlcnNhbXBsaW5nX3NoaWZ0CT0gMiwKLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCByZWFsNjQxMF9tYXBfaW8odm9pZCkKIHsKIAl1MzIgdG1wOwpAQCAtMzAwLDcgKzI5NCw3IEBACiAKIAlzM2NfZmJfc2V0X3BsYXRkYXRhKCZyZWFsNjQxMF9sY2RfcGRhdGEpOwogCXMzY19uYW5kX3NldF9wbGF0ZGF0YSgmcmVhbDY0MTBfbmFuZF9pbmZvKTsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCS8qIGNvbmZpZ3VyZSBuQ1MxIHdpZHRoIHRvIDE2IGJpdHMgKi8KIApAQCAtMzI5LDcgKzMyMyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoUkVBTDY0MTAsICJSRUFMNjQxMCIpCiAJLyogTWFpbnRhaW5lcjogRGFyaXVzIEF1Z3VsaXMgPGF1Z3VsaXMuZGFyaXVzQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2M2NDEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gcmVhbDY0MTBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNS5jCmluZGV4IDM0MmU4ZGYuLjk0YzgzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTUuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE1LmMKQEAgLTIyLDggKzIyLDggQEAKIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KIAorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01BUlRRNSwgIlNtYXJ0USA1IikKIAkvKiBNYWludGFpbmVyOiBNYXVydXMgQ3VlbGVuYWVyZSA8bWN1ZWxlbmFlcmUgQVQgZ21haWwgRE9UIGNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtYXJ0cV9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IHNtYXJ0cTVfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNy5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21hcnRxNy5jCmluZGV4IDU3OTYzOTcuLmYxMTI1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtYXJ0cTcuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWFydHE3LmMKQEAgLTIyLDggKzIyLDggQEAKIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KIAorI2luY2x1ZGUgPHBsYXQvczNjNjQxMC5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9mYi5oPgpAQCAtMTYyLDcgKzE2Miw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoU01BUlRRNywgIlNtYXJ0USA3IikKIAkvKiBNYWludGFpbmVyOiBNYXVydXMgQ3VlbGVuYWVyZSA8bWN1ZWxlbmFlcmUgQVQgZ21haWwgRE9UIGNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTM0M2NFhYX1BBX1NEUkFNICsgMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtYXJ0cV9tYXBfaW8sCiAJLmluaXRfbWFjaGluZQk9IHNtYXJ0cTdfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MDAuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDAwLmMKaW5kZXggM2NjYTY0Mi4uNzM0NTBjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQwMC5jCkBAIC0zMSw3ICszMSw3IEBACiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3MzYzY0MDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MDAuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KQEAgLTg1LDcgKzg1LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLNjQwMCwgIlNNREs2NDAwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjNjQwMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGs2NDAwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQxMC5jCmluZGV4IGE5ZjMxODMuLjhiYzhlZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MTAuYwpAQCAtNjMsNyArNjMsNyBAQAogI2luY2x1ZGUgPHBsYXQvZmIuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CiAKLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KQEAgLTYxOSwxMiArNjE5LDYgQEAKIAl7IEkyQ19CT0FSRF9JTkZPKCIyNGMxMjgiLCAweDU3KSwgfSwJLyogU2Ftc3VuZyBTNTI0QUQwWEQxICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvIHMzY190c19wbGF0Zm9ybSBfX2luaXRkYXRhID0gewotCS5kZWxheQkJCT0gMTAwMDAsCi0JLnByZXNjCQkJPSA0OSwKLQkub3ZlcnNhbXBsaW5nX3NoaWZ0CT0gMiwKLX07Ci0KIC8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrNjQxMF9ibF9ncGlvX2luZm8gPSB7CiAJLm5vID0gUzNDNjRYWF9HUEYoMTUpLApAQCAtNjY2LDcgKzY2MCw3IEBACiAKIAlzYW1zdW5nX2tleXBhZF9zZXRfcGxhdGRhdGEoJnNtZGs2NDEwX2tleXBhZF9kYXRhKTsKIAotCXMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKCZzM2NfdHNfcGxhdGZvcm0pOworCXMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKE5VTEwpOwogCiAJLyogY29uZmlndXJlIG5DUzEgd2lkdGggdG8gMTYgYml0cyAqLwogCkBAIC03MDMsNyArNjk3LDcgQEAKIAogTUFDSElORV9TVEFSVChTTURLNjQxMCwgIlNNREs2NDEwIikKIAkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+ICovCi0JLmJvb3RfcGFyYW1zCT0gUzNDNjRYWF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCiAJLmluaXRfaXJxCT0gczNjNjQxMF9pbml0X2lycSwKIAkubWFwX2lvCQk9IHNtZGs2NDEwX21hcF9pbywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3BtLmMKaW5kZXggMDU1ZTI4NS4uYjM3NWNkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3BtLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3Mtc3lzY29uLXBvd2VyLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8tbWVtcG9ydC5oPgorI2luY2x1ZGUgPG1hY2gvcmVncy1tb2RlbS5oPgogCiAjaWZkZWYgQ09ORklHX1MzQ19QTV9ERUJVR19MRURfU01ESwogdm9pZCBzM2NfcG1fZGVidWdfc21ka2xlZCh1MzIgc2V0LCB1MzIgY2xlYXIpCkBAIC04NSw2ICs4Niw5IEBACiAJU0FWRV9JVEVNKFMzQzY0WFhfTUVNMENPTlNMUDApLAogCVNBVkVfSVRFTShTM0M2NFhYX01FTTBDT05TTFAxKSwKIAlTQVZFX0lURU0oUzNDNjRYWF9NRU0xQ09OU0xQKSwKKworCVNBVkVfSVRFTShTM0M2NFhYX1NETUFfU0VMKSwKKwlTQVZFX0lURU0oUzNDNjRYWF9NT0RFTV9NSUZQQ09OKSwKIH07CiAKIHZvaWQgczNjX3BtX2NvbmZpZ3VyZV9leHRpbnQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQwMC5jCmluZGV4IDVlOTNmZTMuLjdhM2JjMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MDAuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KICNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9vbmVuYW5kLWNvcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MDAuaD4KIAogdm9pZCBfX2luaXQgczNjNjQwMF9tYXBfaW8odm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQxMC5jCmluZGV4IDMxMmFhNmIuLjQxMTcwMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MTAuYwpAQCAtNDEsOCArNDEsOCBAQAogI2luY2x1ZGUgPHBsYXQvYWRjLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L2lpYy1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9vbmVuYW5kLWNvcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MDAuaD4KLSNpbmNsdWRlIDxtYWNoL3MzYzY0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MDAuaD4KKyNpbmNsdWRlIDxwbGF0L3MzYzY0MTAuaD4KIAogdm9pZCBfX2luaXQgczNjNjQxMF9tYXBfaW8odm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zZXR1cC1zZGhjaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLXNkaGNpLmMKaW5kZXggZjM0NGEyMi4uYzc1YTcxYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLXNkaGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLXNkaGNpLmMKQEAgLTEyLDE3ICsxMiw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+CiAKIC8qIGNsb2NrIHNvdXJjZXMgZm9yIHRoZSBtbWMgYnVzIGNsb2NrLCBvcmRlciBhcyBmb3IgdGhlIGN0cmwyWzUuLjRdICovCiAKQEAgLTMyLDQxICsyMiwzIEBACiAJWzJdID0gIm1tY19idXMiLAogCS8qIFszXSA9ICI0OG0iLCAtIG5vdGUgbm90IHN1Y2Nlc3NmdWxseSB1c2VkIHlldCAqLwogfTsKLQotdm9pZCBzM2M2NDAwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkgIHZvaWQgX19pb21lbSAqciwKLQkJCQkgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGN0cmwyLCBjdHJsMzsKLQotCWN0cmwyID0gcmVhZGwociArIFMzQ19TREhDSV9DT05UUk9MMik7Ci0JY3RybDIgJj0gUzNDX1NESENJX0NUUkwyX1NFTEJBU0VDTEtfTUFTSzsKLQljdHJsMiB8PSAoUzNDNjRYWF9TREhDSV9DVFJMMl9FTlNUQUFTWU5DQ0xSIHwKLQkJICBTM0M2NFhYX1NESENJX0NUUkwyX0VOQ01EQ05GTVNLIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5GQkNMS1JYIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfREZDTlRfTk9ORSB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VOQ0xLT1VUSE9MRCk7Ci0KLQlpZiAoaW9zLT5jbG9jayA8IDI1ICogMTAwMDAwMCkKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMyB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMiB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0JZWxzZQotCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IENUUkwgMj0lMDh4LCAzPSUwOHhcbiIsIF9fZnVuY19fLCBjdHJsMiwgY3RybDMpOwotCXdyaXRlbChjdHJsMiwgciArIFMzQ19TREhDSV9DT05UUk9MMik7Ci0Jd3JpdGVsKGN0cmwzLCByICsgUzNDX1NESENJX0NPTlRST0wzKTsKLX0KLQotdm9pZCBzM2M2NDEwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkgIHZvaWQgX19pb21lbSAqciwKLQkJCQkgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0Jd3JpdGVsKFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDRfRFJJVkVfOW1BLCByICsgUzNDNjRYWF9TREhDSV9DT05UUk9MNCk7Ci0KLQlzM2M2NDAwX3NldHVwX3NkaGNpX2NmZ19jYXJkKGRldiwgciwgaW9zLCBjYXJkKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL0tjb25maWcKaW5kZXggNjVjNzUxOC4uMTg2OTBjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL0tjb25maWcKQEAgLTksMTggKzksMjggQEAKIAogY29uZmlnIENQVV9TNVA2NDQwCiAJYm9vbAotCXNlbGVjdCBTM0NfUEwzMzBfRE1BCisJc2VsZWN0IFNBTVNVTkdfRE1BREVWCiAJc2VsZWN0IFM1UF9IUlQKKwlzZWxlY3QgUzVQX1NMRUVQIGlmIFBNCisJc2VsZWN0IFNBTVNVTkdfV0FLRU1BU0sgaWYgUE0KIAloZWxwCiAJICBFbmFibGUgUzVQNjQ0MCBDUFUgc3VwcG9ydAogCiBjb25maWcgQ1BVX1M1UDY0NTAKIAlib29sCi0Jc2VsZWN0IFMzQ19QTDMzMF9ETUEKKwlzZWxlY3QgU0FNU1VOR19ETUFERVYKIAlzZWxlY3QgUzVQX0hSVAorCXNlbGVjdCBTNVBfU0xFRVAgaWYgUE0KKwlzZWxlY3QgU0FNU1VOR19XQUtFTUFTSyBpZiBQTQogCWhlbHAKIAkgIEVuYWJsZSBTNVA2NDUwIENQVSBzdXBwb3J0CiAKK2NvbmZpZyBTNVA2NFgwX1NFVFVQX0ZCXzI0QlBQCisJYm9vbAorCWhlbHAKKwkgIENvbW1vbiBzZXR1cCBjb2RlIGZvciBTNVA2NFgwIGJhc2VkIGJvYXJkcyB3aXRoIGEgTENEIGRpc3BsYXkKKwkgIHRocm91Z2ggUkdCIGludGVyZmFjZS4KKwogY29uZmlnIFM1UDY0WDBfU0VUVVBfSTJDMQogCWJvb2wKIAloZWxwCkBAIC0zMSw2ICs0MSw3IEBACiBjb25maWcgTUFDSF9TTURLNjQ0MAogCWJvb2wgIlNNREs2NDQwIgogCXNlbGVjdCBDUFVfUzVQNjQ0MAorCXNlbGVjdCBTM0NfREVWX0ZCCiAJc2VsZWN0IFMzQ19ERVZfSTJDMQogCXNlbGVjdCBTM0NfREVWX1JUQwogCXNlbGVjdCBTM0NfREVWX1dEVApAQCAtMzksNiArNTAsNyBAQAogCXNlbGVjdCBTQU1TVU5HX0RFVl9CQUNLTElHSFQKIAlzZWxlY3QgU0FNU1VOR19ERVZfUFdNCiAJc2VsZWN0IFNBTVNVTkdfREVWX1RTCisJc2VsZWN0IFM1UDY0WDBfU0VUVVBfRkJfMjRCUFAKIAlzZWxlY3QgUzVQNjRYMF9TRVRVUF9JMkMxCiAJaGVscAogCSAgTWFjaGluZSBzdXBwb3J0IGZvciB0aGUgU2Ftc3VuZyBTTURLNjQ0MApAQCAtNDYsNiArNTgsNyBAQAogY29uZmlnIE1BQ0hfU01ESzY0NTAKIAlib29sICJTTURLNjQ1MCIKIAlzZWxlY3QgQ1BVX1M1UDY0NTAKKwlzZWxlY3QgUzNDX0RFVl9GQgogCXNlbGVjdCBTM0NfREVWX0kyQzEKIAlzZWxlY3QgUzNDX0RFVl9SVEMKIAlzZWxlY3QgUzNDX0RFVl9XRFQKQEAgLTU0LDYgKzY3LDcgQEAKIAlzZWxlY3QgU0FNU1VOR19ERVZfQkFDS0xJR0hUCiAJc2VsZWN0IFNBTVNVTkdfREVWX1BXTQogCXNlbGVjdCBTQU1TVU5HX0RFVl9UUworCXNlbGVjdCBTNVA2NFgwX1NFVFVQX0ZCXzI0QlBQCiAJc2VsZWN0IFM1UDY0WDBfU0VUVVBfSTJDMQogCWhlbHAKIAkgIE1hY2hpbmUgc3VwcG9ydCBmb3IgdGhlIFNhbXN1bmcgU01ESzY0NTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9NYWtlZmlsZQppbmRleCA1ZjZhZmRmLi5hMTMyNGQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL01ha2VmaWxlCkBAIC0xMiwxMCArMTIsMTEgQEAKIAogIyBDb3JlIHN1cHBvcnQgZm9yIFM1UDY0WDAgc3lzdGVtCiAKLW9iai0kKENPTkZJR19BUkNIX1M1UDY0WDApCSs9IGNwdS5vIGluaXQubyBjbG9jay5vIGRtYS5vIGdwaW9saWIubworb2JqLSQoQ09ORklHX0FSQ0hfUzVQNjRYMCkJKz0gY3B1Lm8gaW5pdC5vIGNsb2NrLm8gZG1hLm8KIG9iai0kKENPTkZJR19BUkNIX1M1UDY0WDApCSs9IHNldHVwLWkyYzAubyBpcnEtZWludC5vCiBvYmotJChDT05GSUdfQ1BVX1M1UDY0NDApCSs9IGNsb2NrLXM1cDY0NDAubwogb2JqLSQoQ09ORklHX0NQVV9TNVA2NDUwKQkrPSBjbG9jay1zNXA2NDUwLm8KK29iai0kKENPTkZJR19QTSkJCSs9IHBtLm8gaXJxLXBtLm8KIAogIyBtYWNoaW5lIHN1cHBvcnQKIApAQCAtMjgsMyArMjksNCBAQAogb2JqLSQoQ09ORklHX1MzQzY0WFhfREVWX1NQSSkJKz0gZGV2LXNwaS5vCiAKIG9iai0kKENPTkZJR19TNVA2NFgwX1NFVFVQX0kyQzEpCSs9IHNldHVwLWkyYzEubworb2JqLSQoQ09ORklHX1M1UDY0WDBfU0VUVVBfRkJfMjRCUFApCSs9IHNldHVwLWZiLTI0YnBwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDQwLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ0MC5jCmluZGV4IDBlOWNkMzAuLmM1NGM2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYwpAQCAtMTQ2LDcgKzE0Niw4IEBACiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDgpLAogCX0sIHsKLQkJLm5hbWUJCT0gInBkbWEiLAorCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTIpLApAQCAtNDk5LDYgKzUwMCwxMSBAQAogCSZjbGtfcGNsa19sb3csCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9hcGJfcGNsayA9IHsKKwkubmFtZQkJPSAiYXBiX3BjbGsiLAorCS5pZAkJPSAtMSwKK307CisKIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczVwNjQ0MF9zZXR1cF9jbG9ja3Modm9pZCkKIHsKIAlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKQEAgLTU4MSw1ICs1ODcsNyBAQAogCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZkdW1teV9hcGJfcGNsayk7CisKIAlzM2NfcHdtY2xrX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ1MC5jCmluZGV4IGQ5ZGMxNmMuLjJkMDRhYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NTAuYwpAQCAtMTc5LDcgKzE3OSw4IEBACiAJCS5lbmFibGUJCT0gczVwNjR4MF9oY2xrMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKLQkJLm5hbWUJCT0gInBkbWEiLAorCQkubmFtZQkJPSAiZG1hIiwKKwkJLmRldm5hbWUJPSAiZG1hLXBsMzMwIiwKIAkJLnBhcmVudAkJPSAmY2xrX2hjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX2hjbGswX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMTIpLApAQCAtNTUzLDYgKzU1NCwxMSBAQAogCSZjbGtfc2Nsa19hdWRpbzAsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9hcGJfcGNsayA9IHsKKwkubmFtZQkJPSAiYXBiX3BjbGsiLAorCS5pZAkJPSAtMSwKK307CisKIHZvaWQgX19pbml0X29yX2NwdWZyZXEgczVwNjQ1MF9zZXR1cF9jbG9ja3Modm9pZCkKIHsKIAlzdHJ1Y3QgY2xrICp4dGFsX2NsazsKQEAgLTYzMiw1ICs2MzgsNyBAQAogCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZkdW1teV9hcGJfcGNsayk7CisKIAlzM2NfcHdtY2xrX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jcHUuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jcHUuYwppbmRleCBhNWMwMDk1Li5lY2FiNDBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2NwdS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0zOCw2ICszOSw3IEBACiAjaW5jbHVkZSA8cGxhdC9zNXA2NDQwLmg+CiAjaW5jbHVkZSA8cGxhdC9zNXA2NDUwLmg+CiAjaW5jbHVkZSA8cGxhdC9hZGMtY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvZmItY29yZS5oPgogCiAvKiBJbml0aWFsIElPIG1hcHBpbmdzICovCiAKQEAgLTEwOCwxOCArMTEwLDIyIEBACiB7CiAJLyogaW5pdGlhbGl6ZSBhbnkgZGV2aWNlIGluZm9ybWF0aW9uIGVhcmx5ICovCiAJczNjX2FkY19zZXRuYW1lKCJzM2M2NHh4LWFkYyIpOworCXMzY19mYl9zZXRuYW1lKCJzNXA2NHgwLWZiIik7CiAKIAlpb3RhYmxlX2luaXQoczVwNjR4MF9pb2Rlc2MsIEFSUkFZX1NJWkUoczVwNjR4MF9pb2Rlc2MpKTsKIAlpb3RhYmxlX2luaXQoczVwNjQ0MF9pb2Rlc2MsIEFSUkFZX1NJWkUoczVwNjQ0MF9pb2Rlc2MpKTsKKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoU1pfOE0pOwogfQogCiB2b2lkIF9faW5pdCBzNXA2NDUwX21hcF9pbyh2b2lkKQogewogCS8qIGluaXRpYWxpemUgYW55IGRldmljZSBpbmZvcm1hdGlvbiBlYXJseSAqLwogCXMzY19hZGNfc2V0bmFtZSgiczNjNjR4eC1hZGMiKTsKKwlzM2NfZmJfc2V0bmFtZSgiczVwNjR4MC1mYiIpOwogCiAJaW90YWJsZV9pbml0KHM1cDY0eDBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cDY0eDBfaW9kZXNjKSk7CiAJaW90YWJsZV9pbml0KHM1cDY0NTBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cDY0NTBfaW9kZXNjKSk7CisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKFNaXzhNKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LXNwaS5jCmluZGV4IGFjODI1ZTguLjFmZDljNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kZXYtc3BpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1zcGkuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLWNsb2Nrcy5oPgogCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L3MzYzY0eHgtc3BpLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogCkBAIC0xODUsMTEgKzE4Niw4IEBACiAKIHZvaWQgX19pbml0IHM1cDY0eDBfc3BpX3NldF9pbmZvKGludCBjbnRybHIsIGludCBzcmNfY2xrX25yLCBpbnQgbnVtX2NzKQogewotCXVuc2lnbmVkIGludCBpZDsKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfaW5mbyAqcGQ7CiAKLQlpZCA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfU1lTX0lEKSAmIDB4RkYwMDA7Ci0KIAkvKiBSZWplY3QgaW52YWxpZCBjb25maWd1cmF0aW9uICovCiAJaWYgKCFudW1fY3MgfHwgc3JjX2Nsa19uciA8IDAKIAkJCXx8IHNyY19jbGtfbnIgPiBTNVA2NFgwX1NQSV9TUkNDTEtfU0NMSykgewpAQCAtMTk5LDcgKzE5Nyw3IEBACiAKIAlzd2l0Y2ggKGNudHJscikgewogCWNhc2UgMDoKLQkJaWYgKGlkID09IDB4NTAwMDApCisJCWlmIChzb2NfaXNfczVwNjQ1MCgpKQogCQkJcGQgPSAmczVwNjQ1MF9zcGkwX3BkYXRhOwogCQllbHNlCiAJCQlwZCA9ICZzNXA2NDQwX3NwaTBfcGRhdGE7CkBAIC0yMDcsNyArMjA1LDcgQEAKIAkJczVwNjR4MF9kZXZpY2Vfc3BpMC5kZXYucGxhdGZvcm1fZGF0YSA9IHBkOwogCQlicmVhazsKIAljYXNlIDE6Ci0JCWlmIChpZCA9PSAweDUwMDAwKQorCQlpZiAoc29jX2lzX3M1cDY0NTAoKSkKIAkJCXBkID0gJnM1cDY0NTBfc3BpMV9wZGF0YTsKIAkJZWxzZQogCQkJcGQgPSAmczVwNjQ0MF9zcGkxX3BkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2RtYS5jCmluZGV4IGQ3YWQ5NDQuLjQ0MmRkNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZG1hLmMKQEAgLTIxLDEyOCArMjEsMjE4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L3MzYy1wbDMzMC1wZGF0YS5oPgorI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgogCiBzdGF0aWMgdTY0IGRtYV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXA2NHgwX3BkbWFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFM1UDY0WDBfUEFfUERNQSwKLQkJLmVuZAk9IFM1UDY0WDBfUEFfUERNQSArIFNaXzRLLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0RNQTAsCi0JCS5lbmQJPSBJUlFfRE1BMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCitzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgczVwNjQ0MF9wZG1hX3BlcmlbMjJdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBzNXA2NDQwX3BkbWFfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1VBUlQwX1JYLAotCQlbMV0gPSBETUFDSF9VQVJUMF9UWCwKLQkJWzJdID0gRE1BQ0hfVUFSVDFfUlgsCi0JCVszXSA9IERNQUNIX1VBUlQxX1RYLAotCQlbNF0gPSBETUFDSF9VQVJUMl9SWCwKLQkJWzVdID0gRE1BQ0hfVUFSVDJfVFgsCi0JCVs2XSA9IERNQUNIX1VBUlQzX1JYLAotCQlbN10gPSBETUFDSF9VQVJUM19UWCwKLQkJWzhdID0gRE1BQ0hfTUFYLAotCQlbOV0gPSBETUFDSF9NQVgsCi0JCVsxMF0gPSBETUFDSF9QQ00wX1RYLAotCQlbMTFdID0gRE1BQ0hfUENNMF9SWCwKLQkJWzEyXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxM10gPSBETUFDSF9JMlMwX1JYLAotCQlbMTRdID0gRE1BQ0hfU1BJMF9UWCwKLQkJWzE1XSA9IERNQUNIX1NQSTBfUlgsCi0JCVsxNl0gPSBETUFDSF9NQVgsCi0JCVsxN10gPSBETUFDSF9NQVgsCi0JCVsxOF0gPSBETUFDSF9NQVgsCi0JCVsxOV0gPSBETUFDSF9NQVgsCi0JCVsyMF0gPSBETUFDSF9TUEkxX1RYLAotCQlbMjFdID0gRE1BQ0hfU1BJMV9SWCwKLQkJWzIyXSA9IERNQUNIX01BWCwKLQkJWzIzXSA9IERNQUNIX01BWCwKLQkJWzI0XSA9IERNQUNIX01BWCwKLQkJWzI1XSA9IERNQUNIX01BWCwKLQkJWzI2XSA9IERNQUNIX01BWCwKLQkJWzI3XSA9IERNQUNIX01BWCwKLQkJWzI4XSA9IERNQUNIX01BWCwKLQkJWzI5XSA9IERNQUNIX1BXTSwKLQkJWzMwXSA9IERNQUNIX01BWCwKLQkJWzMxXSA9IERNQUNIX01BWCwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwNjQ0MF9wZG1hX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShzNXA2NDQwX3BkbWFfcGVyaSksCisJLnBlcmkgPSBzNXA2NDQwX3BkbWFfcGVyaSwKK307CisKK3N0cnVjdCBkbWFfcGwzMzBfcGVyaSBzNXA2NDUwX3BkbWFfcGVyaVszMl0gPSB7CisJeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQ0X1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUNF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVVNJX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VU0lfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BXTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQ1X1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUNV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBzNXA2NDUwX3BkbWFfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1VBUlQwX1JYLAotCQlbMV0gPSBETUFDSF9VQVJUMF9UWCwKLQkJWzJdID0gRE1BQ0hfVUFSVDFfUlgsCi0JCVszXSA9IERNQUNIX1VBUlQxX1RYLAotCQlbNF0gPSBETUFDSF9VQVJUMl9SWCwKLQkJWzVdID0gRE1BQ0hfVUFSVDJfVFgsCi0JCVs2XSA9IERNQUNIX1VBUlQzX1JYLAotCQlbN10gPSBETUFDSF9VQVJUM19UWCwKLQkJWzhdID0gRE1BQ0hfVUFSVDRfUlgsCi0JCVs5XSA9IERNQUNIX1VBUlQ0X1RYLAotCQlbMTBdID0gRE1BQ0hfUENNMF9UWCwKLQkJWzExXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsxMl0gPSBETUFDSF9JMlMwX1RYLAotCQlbMTNdID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzE0XSA9IERNQUNIX1NQSTBfVFgsCi0JCVsxNV0gPSBETUFDSF9TUEkwX1JYLAotCQlbMTZdID0gRE1BQ0hfUENNMV9UWCwKLQkJWzE3XSA9IERNQUNIX1BDTTFfUlgsCi0JCVsxOF0gPSBETUFDSF9QQ00yX1RYLAotCQlbMTldID0gRE1BQ0hfUENNMl9SWCwKLQkJWzIwXSA9IERNQUNIX1NQSTFfVFgsCi0JCVsyMV0gPSBETUFDSF9TUEkxX1JYLAotCQlbMjJdID0gRE1BQ0hfVVNJX1RYLAotCQlbMjNdID0gRE1BQ0hfVVNJX1JYLAotCQlbMjRdID0gRE1BQ0hfTUFYLAotCQlbMjVdID0gRE1BQ0hfSTJTMV9UWCwKLQkJWzI2XSA9IERNQUNIX0kyUzFfUlgsCi0JCVsyN10gPSBETUFDSF9JMlMyX1RYLAotCQlbMjhdID0gRE1BQ0hfSTJTMl9SWCwKLQkJWzI5XSA9IERNQUNIX1BXTSwKLQkJWzMwXSA9IERNQUNIX1VBUlQ1X1JYLAotCQlbMzFdID0gRE1BQ0hfVUFSVDVfVFgsCi0JfSwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwNjQ1MF9wZG1hX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShzNXA2NDUwX3BkbWFfcGVyaSksCisJLnBlcmkgPSBzNXA2NDUwX3BkbWFfcGVyaSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3BkbWEgPSB7Ci0JLm5hbWUJCT0gInMzYy1wbDMzMCIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXA2NHgwX3BkbWFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cDY0eDBfcGRtYV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKK3N0cnVjdCBhbWJhX2RldmljZSBzNXA2NHgwX2RldmljZV9wZG1hID0geworCS5kZXYgPSB7CisJCS5pbml0X25hbWUgPSAiZG1hLXBsMzMwIiwKIAkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAogCX0sCisJLnJlcyA9IHsKKwkJLnN0YXJ0ID0gUzVQNjRYMF9QQV9QRE1BLAorCQkuZW5kID0gUzVQNjRYMF9QQV9QRE1BICsgU1pfNEssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJLmlycSA9IHtJUlFfRE1BMCwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczVwNjR4MF9kbWFfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpZDsKLQotCWlkID0gX19yYXdfcmVhZGwoUzVQNjRYMF9TWVNfSUQpICYgMHhGRjAwMDsKLQotCWlmIChpZCA9PSAweDUwMDAwKQorCWlmIChzb2NfaXNfczVwNjQ1MCgpKQogCQlzNXA2NHgwX2RldmljZV9wZG1hLmRldi5wbGF0Zm9ybV9kYXRhID0gJnM1cDY0NTBfcGRtYV9wZGF0YTsKIAllbHNlCiAJCXM1cDY0eDBfZGV2aWNlX3BkbWEuZGV2LnBsYXRmb3JtX2RhdGEgPSAmczVwNjQ0MF9wZG1hX3BkYXRhOwogCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzNXA2NHgwX2RldmljZV9wZG1hKTsKKwlhbWJhX2RldmljZV9yZWdpc3RlcigmczVwNjR4MF9kZXZpY2VfcGRtYSwgJmlvbWVtX3Jlc291cmNlKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2dwaW9saWIuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9ncGlvbGliLmMKaW5kZXggZTdmYjNiMC4uNzAwZGFjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2dwaW9saWIuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZ3Bpb2xpYi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KIAorI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+CkBAIC00NzMsMTQgKzQ3NCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzNXA2NHgwX2dwaW9saWJfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjaGlwaWQ7Ci0KLQljaGlwaWQgPSBfX3Jhd19yZWFkbChTNVA2NFgwX1NZU19JRCk7Ci0KIAlzNXA2NHgwX2dwaW9saWJfc2V0X2NmZyhzNXA2NHgwX2dwaW9fY2ZncywKIAkJCQlBUlJBWV9TSVpFKHM1cDY0eDBfZ3Bpb19jZmdzKSk7CiAKLQlpZiAoKGNoaXBpZCAmIDB4ZmYwMDApID09IDB4NTAwMDApIHsKKwlpZiAoc29jX2lzX3M1cDY0NTAoKSkgewogCQlzYW1zdW5nX2dwaW9saWJfYWRkXzJiaXRfY2hpcHMoczVwNjQ1MF9ncGlvXzJiaXQsCiAJCQkJCUFSUkFZX1NJWkUoczVwNjQ1MF9ncGlvXzJiaXQpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmZhODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXwotI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXwotCi0jZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCi0jZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA3OWIwNGU2Li5lODBiYTNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNSw3ICsxNSw3IEBACiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CiAKLQkubWFjcm8gYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbW92CVxycCwgIzB4RTAwMDAwMDAKIAkJb3JyCVxycCwgXHJwLCAjMHgwMDEwMDAwMAogCQlsZHIJXHJwLCBbXHJwLCAjMHgxMTggXQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggODEyMDllYi4uNWE2MjJhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9fTUFDSF9ETUFfSAogI2RlZmluZSBfX01BQ0hfRE1BX0gKIAotLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gUzNDIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLwotI2luY2x1ZGUgPHBsYXQvczNjLWRtYS1wbDMzMC5oPgorLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gY29tbW9uIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLworI2luY2x1ZGUgPHBsYXQvZG1hLXBsMzMwLmg+CiAKICNlbmRpZiAvKiBfX01BQ0hfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYWRiNWYyOS4uMDZjZDNjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEzLDExICsxMyw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfR1BJT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfR1BJT19IIF9fRklMRV9fCiAKLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLQogLyogR1BJTyBiYW5rIHNpemVzICovCiAKICNkZWZpbmUgUzVQNjQ0MF9HUElPX0FfTlIJKDYpCkBAIC0xMzQsNiArMTI5LDQgQEAKIAogI2RlZmluZSBBUkNIX05SX0dQSU9TCQkoUzVQNjRYMF9HUElPX0VORCArIENPTkZJR19TQU1TVU5HX0dQSU9fRVhUUkEpCiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KICNlbmRpZiAvKiBfX0FTTV9BUkNIX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA1ODM3YTM2Li41Mzk4MmRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtODcsNiArODcsMTAgQEAKIAogI2RlZmluZSBJUlFfSTJTMAkJSVJRX0kyU1Y0MAogCisjZGVmaW5lIElSUV9MQ0RfRklGTwkJSVJRX0RJU1BDT04wCisjZGVmaW5lIElSUV9MQ0RfVlNZTkMJCUlSUV9ESVNQQ09OMQorI2RlZmluZSBJUlFfTENEX1NZU1RFTQkJSVJRX0RJU1BDT04yCisKIC8qIFM1UDY0NTAgRUlOVCBmZWF0dXJlIHdpbGwgYmUgYWRkZWQgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL21hcC5oCmluZGV4IDk1YzkxMjUuLjRkM2FjOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtNDcsNiArNDcsOCBAQAogCiAjZGVmaW5lIFM1UDY0WDBfUEFfSFNNTUMoeCkJKDB4RUQ4MDAwMDAgKyAoKHgpICogMHgxMDAwMDApKQogCisjZGVmaW5lIFM1UDY0WDBfUEFfRkIJCTB4RUUwMDAwMDAKKwogI2RlZmluZSBTNVA2NFgwX1BBX0kyUwkJMHhGMjAwMDAwMAogI2RlZmluZSBTNVA2NDUwX1BBX0kyUzEJCTB4RjI4MDAwMDAKICNkZWZpbmUgUzVQNjQ1MF9QQV9JMlMyCQkweEYyOTAwMDAwCkBAIC02NCw2ICs2Niw3IEBACiAjZGVmaW5lIFMzQ19QQV9JSUMxCQlTNVA2NDQwX1BBX0lJQzEKICNkZWZpbmUgUzNDX1BBX1JUQwkJUzVQNjRYMF9QQV9SVEMKICNkZWZpbmUgUzNDX1BBX1dEVAkJUzVQNjRYMF9QQV9XRFQKKyNkZWZpbmUgUzNDX1BBX0ZCCQlTNVA2NFgwX1BBX0ZCCiAKICNkZWZpbmUgUzVQX1BBX0NISVBJRAkJUzVQNjRYMF9QQV9DSElQSUQKICNkZWZpbmUgUzVQX1BBX1NST01DCQlTNVA2NFgwX1BBX1NST01DCkBAIC04NSw1ICs4OCw2IEBACiAjZGVmaW5lIFM1UF9QQV9VQVJUNQkJUzVQNjQ1MF9QQV9VQVJUKDUpCiAKICNkZWZpbmUgUzVQX1NaX1VBUlQJCVNaXzI1NgorI2RlZmluZSBTM0NfVkFfVUFSVHgoeCkJCShTM0NfVkFfVUFSVCArICgoeCkgKiBTM0NfVUFSVF9PRkZTRVQpKQogCiAjZW5kaWYgLyogX19BU01fQVJDSF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWE2ZWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBTNVA2NFgwIC0gTWVtb3J5IGRlZmluaXRpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9IIF9fRklMRV9fCi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgyMDAwMDAwMCkKLSNkZWZpbmUgQ09OU0lTVEVOVF9ETUFfU0laRQlTWl84TQotCi0jZW5kaWYgLyogX19BU01fQVJDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJmNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wbS1jb3JlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFM1UDY0WDAgLSBQTSBjb3JlIHN1cHBvcnQgZm9yIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jCisgKgorICogQmFzZWQgb24gUE0gY29yZSBzdXBwb3J0IGZvciBTM0M2NFhYIGJ5IEJlbiBEb29rcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fZGVidWdfaW5pdF91YXJ0KHZvaWQpCit7CisJdTMyIHRtcCA9IF9fcmF3X3JlYWRsKFM1UDY0WDBfQ0xLX0dBVEVfUENMSyk7CisKKwkvKgorCSAqIEFzIGEgbm90ZSwgc2luY2UgdGhlIFM1UDY0WDAgVUFSVHMgZ2VuZXJhbGx5IGhhdmUgbXVsdGlwbGUKKwkgKiBjbG9jayBzb3VyY2VzLCB3ZSBzaW1wbHkgZW5hYmxlIFBDTEsgYXQgdGhlIG1vbWVudCBhbmQgaG9wZQorCSAqIHRoYXQgdGhlIHJlc3VtZSBzZXR0aW5ncyBmb3IgdGhlIFVBUlQgYXJlIHN1aXRhYmxlIGZvciB0aGUKKwkgKiB1c2Ugd2l0aCBQQ0xLLgorCSAqLworCXRtcCB8PSBTNVA2NFgwX0NMS19HQVRFX1BDTEtfVUFSVDA7CisJdG1wIHw9IFM1UDY0WDBfQ0xLX0dBVEVfUENMS19VQVJUMTsKKwl0bXAgfD0gUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQyOworCXRtcCB8PSBTNVA2NFgwX0NMS19HQVRFX1BDTEtfVUFSVDM7CisKKwlfX3Jhd193cml0ZWwodG1wLCBTNVA2NFgwX0NMS19HQVRFX1BDTEspOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9wcmVwYXJlX2lycXModm9pZCkKK3sKKwkvKiBWSUMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgKi8KKworCS8qIGNsZWFyIGFueSBwZW5kaW5nIEVJTlQwIGludGVycnVwdHMgKi8KKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoUzVQNjRYMF9FSU5UMFBFTkQpLCBTNVA2NFgwX0VJTlQwUEVORCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9zdG9wX2Nsb2Nrcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fYXJjaF9zaG93X3Jlc3VtZV9pcnFzKHZvaWQpIHsgfQorCisvKgorICogbWFrZSB0aGVzZSBkZWZpbmVzLCB3ZSBjdXJyZW50bHkgZG8gbm90IGhhdmUgYW55IG5lZWQgdG8gY2hhbmdlCisgKiB0aGUgSVJRIHdha2UgY29udHJvbHMgZGVwZW5kaW5nIG9uIHRoZSBDUFUgd2UgYXJlIHJ1bm5pbmcgb24KKyAqLworI2RlZmluZSBzM2NfaXJxd2FrZV9laW50YWxsb3cJKCgxIDw8IDE2KSAtIDEpCisjZGVmaW5lIHMzY19pcnF3YWtlX2ludGFsbG93CSh+MCkKKworc3RhdGljIGlubGluZSB2b2lkIHMzY19wbV9hcmNoX3VwZGF0ZV91YXJ0KHZvaWQgX19pb21lbSAqcmVncywKKwkJCQkJc3RydWN0IHBtX3VhcnRfc2F2ZSAqc2F2ZSkKK3sKKwl1MzIgdWNvbiA9IF9fcmF3X3JlYWRsKHJlZ3MgKyBTM0MyNDEwX1VDT04pOworCXUzMiB1Y29uX2NsayA9IHVjb24gJiBTM0M2NDAwX1VDT05fQ0xLTUFTSzsKKwl1MzIgc2F2ZV9jbGsgPSBzYXZlLT51Y29uICYgUzNDNjQwMF9VQ09OX0NMS01BU0s7CisJdTMyIG5ld191Y29uOworCXUzMiBkZWx0YTsKKworCS8qCisJICogUzVQNjRYMCBVQVJUIGJsb2NrcyBvbmx5IHN1cHBvcnQgbGV2ZWwgaW50ZXJydXB0cywgc28gZW5zdXJlIHRoYXQKKwkgKiB3aGVuIHdlIHJlc3RvcmUgdW51c2VkIFVBUlQgYmxvY2tzIHdlIGZvcmNlIHRoZSBsZXZlbCBpbnRlcnJ1cHQKKwkgKiBzZXR0aW5ncy4KKwkgKi8KKwlzYXZlLT51Y29uIHw9IFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8IFMzQzI0MTBfVUNPTl9SWElMRVZFTDsKKworCS8qCisJICogV2UgaGF2ZSBhIGNvbnN0cmFpbnQgb24gY2hhbmdpbmcgdGhlIGNsb2NrIHR5cGUgb2YgdGhlIFVBUlQKKwkgKiBiZXR3ZWVuIFVDTEt4IGFuZCBQQ0xLLCBzbyBlbnN1cmUgdGhhdCB3aGVuIHdlIHJlc3RvcmUgVUNPTgorCSAqIHRoYXQgdGhlIENMSyBmaWVsZCBpcyBjb3JyZWN0bHkgbW9kaWZpZWQgaWYgdGhlIGJvb3Rsb2FkZXIKKwkgKiBoYXMgY2hhbmdlZCBhbnl0aGluZy4KKwkgKi8KKwlpZiAodWNvbl9jbGsgIT0gc2F2ZV9jbGspIHsKKwkJbmV3X3Vjb24gPSBzYXZlLT51Y29uOworCQlkZWx0YSA9IHVjb25fY2xrIF4gc2F2ZV9jbGs7CisKKwkJLyoKKwkJICogY2hhbmdlIGZyb20gVUNMS3ggPT4gd3JvbmcgUENMSywKKwkJICogZWl0aGVyIFVDTEsgY2FuIGJlIHRlc3RlZCBmb3IgYnkgYSBiaXQtdGVzdAorCQkgKiB3aXRoIFVDTEswCisJCSAqLworCQlpZiAodWNvbl9jbGsgJiBTM0M2NDAwX1VDT05fVUNMSzAgJiYKKwkJIShzYXZlX2NsayAmIFMzQzY0MDBfVUNPTl9VQ0xLMCkgJiYKKwkJZGVsdGEgJiBTM0M2NDAwX1VDT05fUENMSzIpIHsKKwkJCW5ld191Y29uICY9IH5TM0M2NDAwX1VDT05fVUNMSzA7CisJCX0gZWxzZSBpZiAoZGVsdGEgPT0gUzNDNjQwMF9VQ09OX1BDTEsyKSB7CisJCQkvKgorCQkJICogYXMgYSBwcmVjYXV0aW9uLCBkb24ndCBjaGFuZ2UgZnJvbQorCQkJICogUENMSzIgPT4gUENMSyBvciB2aWNlLXZlcnNhCisJCQkgKi8KKwkJCW5ld191Y29uIF49IFMzQzY0MDBfVUNPTl9QQ0xLMjsKKwkJfQorCisJCVMzQ19QTURCRygidWNvbiBjaGFuZ2UgJTA0eCA9PiAlMDR4IChzYXZlPSUwNHgpXG4iLAorCQkJdWNvbiwgbmV3X3Vjb24sIHNhdmUtPnVjb24pOworCQlzYXZlLT51Y29uID0gbmV3X3Vjb247CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3Jlc3RvcmVkX2dwaW9zKHZvaWQpCit7CisJLyogZW5zdXJlIHNsZWVwIG1vZGUgaGFzIGJlZW4gY2xlYXJlZCBmcm9tIHRoZSBzeXN0ZW0gKi8KKwlfX3Jhd193cml0ZWwoMCwgUzVQNjRYMF9TTFBFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYW1zdW5nX3BtX3NhdmVkX2dwaW9zKHZvaWQpCit7CisJLyoKKwkgKiB0dXJuIG9uIHRoZSBzbGVlcCBtb2RlIGFuZCBrZWVwIGl0IHRoZXJlLCBhcyBpdCBzZWVtcyB0aGF0IGR1cmluZworCSAqIHN1c3BlbmQgdGhlIHhDT04gcmVnaXN0ZXJzIGdldCByZS1zZXQgYW5kIHRodXMgeW91IGNhbiBlbmQgdXAgd2l0aAorCSAqIHByb2JsZW1zIGJldHdlZW4gZ29pbmcgdG8gc2xlZXAgYW5kIHJlc3VtaW5nLgorCSAqLworCV9fcmF3X3dyaXRlbChTNVA2NFgwX1NMUEVOX1VTRV94U0xQLCBTNVA2NFgwX1NMUEVOKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcHdtLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZmZjhiNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFM1UDY0WDAgLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1BXTUNMS19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUFdNQ0xLX0ggX19GSUxFX18KLQotLyoqCi0gKiBwd21fY2ZnX3NyY19pc190Y2xrKCkgLSByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbXV4IGNvbmZpZyBpcyBhIHRjbGsKLSAqIEB0Y2ZnOiBUaGUgdGltZXIgVENGRzEgcmVnaXN0ZXIgYml0cyBzaGlmdGVkIGRvd24gdG8gMC4KLSAqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmcm9tIFRDRkcxIGlzIGEgVENMSyBpbnN0ZWFkCi0gKiBhbnkgb2YgdGhlIFRESVYgY2xvY2tzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBwd21fY2ZnX3NyY19pc190Y2xrKHVuc2lnbmVkIGxvbmcgdGNmZykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8IHRjZmcxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgMAotCi0jZW5kaWYgLyogX19BU01fQVJDSF9QV01DTEtfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWNsb2NrLmggYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAppbmRleCBhMTMzZjIyLi5iZDkxMTEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaApAQCAtNDEsMTcgKzQxLDUwIEBACiAjZGVmaW5lIFM1UDY0NTBfRFBMTF9DT04JCVM1UF9DTEtSRUcoMHg1MCkKICNkZWZpbmUgUzVQNjQ1MF9EUExMX0NPTl9LCQlTNVBfQ0xLUkVHKDB4NTQpCiAKKyNkZWZpbmUgUzVQNjRYMF9BSEJfQ09OMAkJUzVQX0NMS1JFRygweDEwMCkKICNkZWZpbmUgUzVQNjRYMF9DTEtfU1JDMQkJUzVQX0NMS1JFRygweDEwQykKIAogI2RlZmluZSBTNVA2NFgwX1NZU19JRAkJCVM1UF9DTEtSRUcoMHgxMTgpCiAjZGVmaW5lIFM1UDY0WDBfU1lTX09USEVSUwkJUzVQX0NMS1JFRygweDExQykKIAogI2RlZmluZSBTNVA2NFgwX1BXUl9DRkcJCQlTNVBfQ0xLUkVHKDB4ODA0KQorI2RlZmluZSBTNVA2NFgwX0VJTlRfV0FLRVVQX01BU0sJUzVQX0NMS1JFRygweDgwOCkKKyNkZWZpbmUgUzVQNjRYMF9TTEVFUF9DRkcJCVM1UF9DTEtSRUcoMHg4MTgpCisjZGVmaW5lIFM1UDY0WDBfUFdSX1NUQUJMRQkJUzVQX0NMS1JFRygweDgyOCkKKwogI2RlZmluZSBTNVA2NFgwX09USEVSUwkJCVM1UF9DTEtSRUcoMHg5MDApCisjZGVmaW5lIFM1UDY0WDBfV0FLRVVQX1NUQVQJCVM1UF9DTEtSRUcoMHg5MDgpCisKKyNkZWZpbmUgUzVQNjRYMF9JTkZPUk0wCQkJUzVQX0NMS1JFRygweEEwMCkKIAogI2RlZmluZSBTNVA2NFgwX0NMS0RJVjBfSENMS19TSElGVAkoOCkKICNkZWZpbmUgUzVQNjRYMF9DTEtESVYwX0hDTEtfTUFTSwkoMHhGIDw8IFM1UDY0WDBfQ0xLRElWMF9IQ0xLX1NISUZUKQogCisvKiBIQ0xLIEdBVEUgUmVnaXN0ZXJzICovCisjZGVmaW5lIFM1UDY0WDBfQ0xLX0dBVEVfSENMSzFfRklNR1ZHCSgxIDw8IDIpCisjZGVmaW5lIFM1UDY0WDBfQ0xLX0dBVEVfU0NMSzFfRklNR1ZHCSgxIDw8IDIpCisKKy8qIFBDTEsgR0FURSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQzCSgxIDw8IDQpCisjZGVmaW5lIFM1UDY0WDBfQ0xLX0dBVEVfUENMS19VQVJUMgkoMSA8PCAzKQorI2RlZmluZSBTNVA2NFgwX0NMS19HQVRFX1BDTEtfVUFSVDEJKDEgPDwgMikKKyNkZWZpbmUgUzVQNjRYMF9DTEtfR0FURV9QQ0xLX1VBUlQwCSgxIDw8IDEpCisKKyNkZWZpbmUgUzVQNjRYMF9QV1JfQ0ZHX01NQzFfRElTQUJMRQkJKDEgPDwgMTUpCisjZGVmaW5lIFM1UDY0WDBfUFdSX0NGR19NTUMwX0RJU0FCTEUJCSgxIDw8IDE0KQorI2RlZmluZSBTNVA2NFgwX1BXUl9DRkdfUlRDX1RJQ0tfRElTQUJMRQkoMSA8PCAxMSkKKyNkZWZpbmUgUzVQNjRYMF9QV1JfQ0ZHX1JUQ19BTFJNX0RJU0FCTEUJKDEgPDwgMTApCisjZGVmaW5lIFM1UDY0WDBfUFdSX0NGR19XRklfTUFTSwkJKDMgPDwgNSkKKyNkZWZpbmUgUzVQNjRYMF9QV1JfQ0ZHX1dGSV9TTEVFUAkJKDMgPDwgNSkKKworI2RlZmluZSBTNVA2NFgwX1NMRUVQX0NGR19PU0NfRU4JKDEgPDwgMCkKKworI2RlZmluZSBTNVA2NFgwX1BXUl9TVEFCTEVfUFdSX0NOVF9WQUw0CSg0IDw8IDApCisKKyNkZWZpbmUgUzVQNjQ1MF9PVEhFUlNfRElTQUJMRV9JTlQJKDEgPDwgMzEpCisjZGVmaW5lIFM1UDY0WDBfT1RIRVJTX1JFVF9VQVJUCQkoMSA8PCAyNikKKyNkZWZpbmUgUzVQNjRYMF9PVEhFUlNfUkVUX01NQzEJCSgxIDw8IDI1KQorI2RlZmluZSBTNVA2NFgwX09USEVSU19SRVRfTU1DMAkJKDEgPDwgMjQpCiAjZGVmaW5lIFM1UDY0WDBfT1RIRVJTX1VTQl9TSUdfTUFTSwkoMSA8PCAxNikKIAogLyogQ29tcGF0aWJpbGl0eSBkZWZpbmVzICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2luY2x1ZGUvbWFjaC9yZWdzLWdwaW8uaAppbmRleCA2Y2UyNTQ3Li5jZmRmYTRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaW5jbHVkZS9tYWNoL3JlZ3MtZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pbmNsdWRlL21hY2gvcmVncy1ncGlvLmgKQEAgLTM0LDE0ICszNCwzNSBAQAogI2RlZmluZSBTNVA2NDUwX0dQUV9CQVNFCQkoUzVQX1ZBX0dQSU8gKyAweDAxODApCiAjZGVmaW5lIFM1UDY0NTBfR1BTX0JBU0UJCShTNVBfVkFfR1BJTyArIDB4MDMwMCkKIAorI2RlZmluZSBTNVA2NFgwX1NQQ09OMAkJCShTNVBfVkFfR1BJTyArIDB4MUEwKQorI2RlZmluZSBTNVA2NFgwX1NQQ09OMF9MQ0RfU0VMX01BU0sJKDB4MyA8PCAwKQorI2RlZmluZSBTNVA2NFgwX1NQQ09OMF9MQ0RfU0VMX1JHQgkoMHgxIDw8IDApCisjZGVmaW5lIFM1UDY0WDBfU1BDT04xCQkJKFM1UF9WQV9HUElPICsgMHgyQjApCisKKyNkZWZpbmUgUzVQNjRYMF9NRU0wQ09OU0xQMAkJKFM1UF9WQV9HUElPICsgMHgxQzApCisjZGVmaW5lIFM1UDY0WDBfTUVNMENPTlNMUDEJCShTNVBfVkFfR1BJTyArIDB4MUM0KQorI2RlZmluZSBTNVA2NFgwX01FTTBEUlZDT04JCShTNVBfVkFfR1BJTyArIDB4MUQwKQorI2RlZmluZSBTNVA2NFgwX01FTTFEUlZDT04JCShTNVBfVkFfR1BJTyArIDB4MUQ0KQorCisjZGVmaW5lIFM1UDY0WDBfRUlOVDEyQ09OCQkoUzVQX1ZBX0dQSU8gKyAweDIwMCkKKyNkZWZpbmUgUzVQNjRYMF9FSU5UMTJGTFRDT04JCShTNVBfVkFfR1BJTyArIDB4MjIwKQorI2RlZmluZSBTNVA2NFgwX0VJTlQxMk1BU0sJCShTNVBfVkFfR1BJTyArIDB4MjQwKQorCiAvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlcnMgZm9yIGdyb3VwMCAqLwogCiAjZGVmaW5lIEVJTlQwQ09OMF9PRkZTRVQJCSgweDkwMCkKKyNkZWZpbmUgRUlOVDBGTFRDT04wX09GRlNFVAkJKDB4OTEwKQorI2RlZmluZSBFSU5UMEZMVENPTjFfT0ZGU0VUCQkoMHg5MTQpCiAjZGVmaW5lIEVJTlQwTUFTS19PRkZTRVQJCSgweDkyMCkKICNkZWZpbmUgRUlOVDBQRU5EX09GRlNFVAkJKDB4OTI0KQogCiAjZGVmaW5lIFM1UDY0WDBfRUlOVDBDT04wCQkoUzVQX1ZBX0dQSU8gKyBFSU5UMENPTjBfT0ZGU0VUKQorI2RlZmluZSBTNVA2NFgwX0VJTlQwRkxUQ09OMAkJKFM1UF9WQV9HUElPICsgRUlOVDBGTFRDT04wX09GRlNFVCkKKyNkZWZpbmUgUzVQNjRYMF9FSU5UMEZMVENPTjEJCShTNVBfVkFfR1BJTyArIEVJTlQwRkxUQ09OMV9PRkZTRVQpCiAjZGVmaW5lIFM1UDY0WDBfRUlOVDBNQVNLCQkoUzVQX1ZBX0dQSU8gKyBFSU5UME1BU0tfT0ZGU0VUKQogI2RlZmluZSBTNVA2NFgwX0VJTlQwUEVORAkJKFM1UF9WQV9HUElPICsgRUlOVDBQRU5EX09GRlNFVCkKIAorI2RlZmluZSBTNVA2NFgwX1NMUEVOCQkJKFM1UF9WQV9HUElPICsgMHg5MzApCisjZGVmaW5lIFM1UDY0WDBfU0xQRU5fVVNFX3hTTFAJCSgxIDw8IDApCisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaXJxLWVpbnQuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtZWludC5jCmluZGV4IGZlNzM4MGYuLjI3NWRjNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtZWludC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9pcnEtZWludC5jCkBAIC0xNyw4ICsxNywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy1pcnF0eXBlLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KIAogI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CkBAIC02Nyw3ICs2OSw3IEBACiAJX19yYXdfd3JpdGVsKGN0cmwsIFM1UDY0WDBfRUlOVDBDT04wKTsKIAogCS8qIENvbmZpZ3VyZSB0aGUgR1BJTyBwaW4gZm9yIDY0NTAgb3IgNjQ0MCBiYXNlZCBvbiBDUFUgSUQgKi8KLQlpZiAoMHg1MDAwMCA9PSAoX19yYXdfcmVhZGwoUzVQNjRYMF9TWVNfSUQpICYgMHhGRjAwMCkpCisJaWYgKHNvY19pc19zNXA2NDUwKCkpCiAJCXMzY19ncGlvX2NmZ3BpbihTNVA2NDUwX0dQTihvZmZzKSwgUzNDX0dQSU9fU0ZOKDIpKTsKIAllbHNlCiAJCXMzY19ncGlvX2NmZ3BpbihTNVA2NDQwX0dQTihvZmZzKSwgUzNDX0dQSU9fU0ZOKDIpKTsKQEAgLTEzMyw2ICsxMzUsNyBAQAogCWN0LT5jaGlwLmlycV9tYXNrID0gaXJxX2djX21hc2tfc2V0X2JpdDsKIAljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaXJxX2djX21hc2tfY2xyX2JpdDsKIAljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBzNXA2NHgwX2lycV9laW50X3NldF90eXBlOworCWN0LT5jaGlwLmlycV9zZXRfd2FrZSA9IHMzY19pcnFleHRfd2FrZTsKIAljdC0+cmVncy5hY2sgPSBFSU5UMFBFTkRfT0ZGU0VUOwogCWN0LT5yZWdzLm1hc2sgPSBFSU5UME1BU0tfT0ZGU0VUOwogCWlycV9zZXR1cF9nZW5lcmljX2NoaXAoZ2MsIElSUV9NU0soMTYpLCBJUlFfR0NfSU5JVF9NQVNLX0NBQ0hFLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2lycS1wbS5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2lycS1wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmYyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvaXJxLXBtLmMKQEAgLTAsMCArMSw5MiBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2lycS1wbS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFM1UDY0WDAgLSBJbnRlcnJ1cHQgaGFuZGxpbmcgUG93ZXIgTWFuYWdlbWVudAorICoKKyAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pcnEtcG0uYyBieSBCZW4gRG9va3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxwbGF0L3BtLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgaXJxX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQNjRYMF9FSU5UMENPTjApLAorCVNBVkVfSVRFTShTNVA2NFgwX0VJTlQwRkxUQ09OMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfRUlOVDBGTFRDT04xKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9FSU5UME1BU0spLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFfZ3JwX3NhdmUgeworCXUzMgljb247CisJdTMyCWZsdGNvbjsKKwl1MzIJbWFzazsKK30gZWludF9ncnBfc2F2ZVs0XTsKKworc3RhdGljIHUzMiBpcnFfdWFydF9tYXNrW0NPTkZJR19TRVJJQUxfU0FNU1VOR19VQVJUU107CisKK3N0YXRpYyBpbnQgczVwNjR4MF9pcnFfcG1fc3VzcGVuZCh2b2lkKQoreworCXN0cnVjdCBpcnFfZ3JwX3NhdmUgKmdycCA9IGVpbnRfZ3JwX3NhdmU7CisJaW50IGk7CisKKwlTM0NfUE1EQkcoIiVzOiBzdXNwZW5kaW5nIElSUXNcbiIsIF9fZnVuY19fKTsKKworCXMzY19wbV9kb19zYXZlKGlycV9zYXZlLCBBUlJBWV9TSVpFKGlycV9zYXZlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NFUklBTF9TQU1TVU5HX1VBUlRTOyBpKyspCisJCWlycV91YXJ0X21hc2tbaV0gPSBfX3Jhd19yZWFkbChTM0NfVkFfVUFSVHgoaSkgKyBTM0M2NFhYX1VJTlRNKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVpbnRfZ3JwX3NhdmUpOyBpKyssIGdycCsrKSB7CisJCWdycC0+Y29uID0gX19yYXdfcmVhZGwoUzVQNjRYMF9FSU5UMTJDT04gKyAoaSAqIDQpKTsKKwkJZ3JwLT5tYXNrID0gX19yYXdfcmVhZGwoUzVQNjRYMF9FSU5UMTJNQVNLICsgKGkgKiA0KSk7CisJCWdycC0+Zmx0Y29uID0gX19yYXdfcmVhZGwoUzVQNjRYMF9FSU5UMTJGTFRDT04gKyAoaSAqIDQpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwNjR4MF9pcnFfcG1fcmVzdW1lKHZvaWQpCit7CisJc3RydWN0IGlycV9ncnBfc2F2ZSAqZ3JwID0gZWludF9ncnBfc2F2ZTsKKwlpbnQgaTsKKworCVMzQ19QTURCRygiJXM6IHJlc3VtaW5nIElSUXNcbiIsIF9fZnVuY19fKTsKKworCXMzY19wbV9kb19yZXN0b3JlKGlycV9zYXZlLCBBUlJBWV9TSVpFKGlycV9zYXZlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NFUklBTF9TQU1TVU5HX1VBUlRTOyBpKyspCisJCV9fcmF3X3dyaXRlbChpcnFfdWFydF9tYXNrW2ldLCBTM0NfVkFfVUFSVHgoaSkgKyBTM0M2NFhYX1VJTlRNKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVpbnRfZ3JwX3NhdmUpOyBpKyssIGdycCsrKSB7CisJCV9fcmF3X3dyaXRlbChncnAtPmNvbiwgUzVQNjRYMF9FSU5UMTJDT04gKyAoaSAqIDQpKTsKKwkJX19yYXdfd3JpdGVsKGdycC0+bWFzaywgUzVQNjRYMF9FSU5UMTJNQVNLICsgKGkgKiA0KSk7CisJCV9fcmF3X3dyaXRlbChncnAtPmZsdGNvbiwgUzVQNjRYMF9FSU5UMTJGTFRDT04gKyAoaSAqIDQpKTsKKwl9CisKKwlTM0NfUE1EQkcoIiVzOiBJUlEgY29uZmlndXJhdGlvbiByZXN0b3JlZFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHM1cDY0eDBfaXJxX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kID0gczVwNjR4MF9pcnFfcG1fc3VzcGVuZCwKKwkucmVzdW1lICA9IHM1cDY0eDBfaXJxX3BtX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHM1cDY0eDBfc3lzY29yZV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJnM1cDY0eDBfaXJxX3N5c2NvcmVfb3BzKTsKKworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChzNXA2NHgwX3N5c2NvcmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NDAuYwppbmRleCAzNDZmOGRmLi40YTEyNTBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDQwLmMKQEAgLTIzLDYgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQ3LDYgKzUwLDggQEAKICNpbmNsdWRlIDxwbGF0L3RzLmg+CiAjaW5jbHVkZSA8cGxhdC9zNXAtdGltZS5oPgogI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9mYi5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi5oPgogCiAjZGVmaW5lIFNNREs2NDQwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAogCQkJCVMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CQlcCkBAIC05Miw2ICs5Nyw1OSBAQAogCX0sCiB9OwogCisvKiBGcmFtZSBCdWZmZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX3BkX3dpbiBzbWRrNjQ0MF9mYl93aW4wID0geworCS53aW5fbW9kZSA9IHsKKwkJLmxlZnRfbWFyZ2luCT0gOCwKKwkJLnJpZ2h0X21hcmdpbgk9IDEzLAorCQkudXBwZXJfbWFyZ2luCT0gNywKKwkJLmxvd2VyX21hcmdpbgk9IDUsCisJCS5oc3luY19sZW4JPSAzLAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnhyZXMJCT0gODAwLAorCQkueXJlcwkJPSA0ODAsCisJfSwKKwkubWF4X2JwcAk9IDMyLAorCS5kZWZhdWx0X2JwcAk9IDI0LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEgc21kazY0NDBfbGNkX3BkYXRhIF9faW5pdGRhdGEgPSB7CisJLndpblswXQkJPSAmc21kazY0NDBfZmJfd2luMCwKKwkudmlkY29uMAk9IFZJRENPTjBfVklET1VUX1JHQiB8IFZJRENPTjBfUE5STU9ERV9SR0IsCisJLnZpZGNvbjEJPSBWSURDT04xX0lOVl9IU1lOQyB8IFZJRENPTjFfSU5WX1ZTWU5DLAorCS5zZXR1cF9ncGlvCT0gczVwNjR4MF9mYl9ncGlvX3NldHVwXzI0YnBwLAorfTsKKworLyogTENEIHBvd2VyIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyB2b2lkIHNtZGs2NDQwX2x0ZTQ4MF9yZXNldF9wb3dlcihzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsCisJCQkJCSB1bnNpZ25lZCBpbnQgcG93ZXIpCit7CisJaW50IGVycjsKKworCWlmIChwb3dlcikgeworCQllcnIgPSBncGlvX3JlcXVlc3QoUzVQNjQ0MF9HUE4oNSksICJHUE4iKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVxdWVzdCBHUE4gZm9yIGxjZCByZXNldFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoUzVQNjQ0MF9HUE4oNSksIDEpOworCQlncGlvX3NldF92YWx1ZShTNVA2NDQwX0dQTig1KSwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKFM1UDY0NDBfR1BOKDUpLCAxKTsKKwkJZ3Bpb19mcmVlKFM1UDY0NDBfR1BOKDUpKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9sY2RfZGF0YSBzbWRrNjQ0MF9sY2RfcG93ZXJfZGF0YSA9IHsKKwkuc2V0X3Bvd2VyCT0gc21kazY0NDBfbHRlNDgwX3Jlc2V0X3Bvd2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21kazY0NDBfbGNkX2x0ZTQ4MHd2ID0geworCS5uYW1lCQkJPSAicGxhdGZvcm0tbGNkIiwKKwkuZGV2LnBhcmVudAkJPSAmczNjX2RldmljZV9mYi5kZXYsCisJLmRldi5wbGF0Zm9ybV9kYXRhCT0gJnNtZGs2NDQwX2xjZF9wb3dlcl9kYXRhLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGs2NDQwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzM2NfZGV2aWNlX2FkYywKIAkmczNjX2RldmljZV9ydGMsCkBAIC0xMDEsNiArMTU5LDggQEAKIAkmczNjX2RldmljZV93ZHQsCiAJJnNhbXN1bmdfYXNvY19kbWEsCiAJJnM1cDY0NDBfZGV2aWNlX2lpcywKKwkmczNjX2RldmljZV9mYiwKKwkmc21kazY0NDBfbGNkX2x0ZTQ4MHd2LAogfTsKIAogc3RhdGljIHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBzNXA2NDQwX2kyYzBfZGF0YSBfX2luaXRkYXRhID0gewpAQCAtMTI5LDEyICsxODksNiBAQAogCS8qIFRvIGJlIHBvcHVsYXRlZCAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiAvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazY0NDBfYmxfZ3Bpb19pbmZvID0gewogCS5ubyA9IFM1UDY0NDBfR1BGKDE1KSwKQEAgLTE1Myw5ICsyMDcsMjAgQEAKIAlzNXBfc2V0X3RpbWVyX3NvdXJjZShTNVBfUFdNMywgUzVQX1BXTTQpOwogfQogCitzdGF0aWMgdm9pZCBzNXA2NDQwX3NldF9sY2RfaW50ZXJmYWNlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNmZzsKKworCS8qIHNlbGVjdCBURlQgTENEIHR5cGUgKFJHQiBJL0YpICovCisJY2ZnID0gX19yYXdfcmVhZGwoUzVQNjRYMF9TUENPTjApOworCWNmZyAmPSB+UzVQNjRYMF9TUENPTjBfTENEX1NFTF9NQVNLOworCWNmZyB8PSBTNVA2NFgwX1NQQ09OMF9MQ0RfU0VMX1JHQjsKKwlfX3Jhd193cml0ZWwoY2ZnLCBTNVA2NFgwX1NQQ09OMCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzbWRrNjQ0MF9tYWNoaW5lX2luaXQodm9pZCkKIHsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCXMzY19pMmMwX3NldF9wbGF0ZGF0YSgmczVwNjQ0MF9pMmMwX2RhdGEpOwogCXMzY19pMmMxX3NldF9wbGF0ZGF0YSgmczVwNjQ0MF9pMmMxX2RhdGEpOwpAQCAtMTY2LDEyICsyMzEsMTUgQEAKIAogCXNhbXN1bmdfYmxfc2V0KCZzbWRrNjQ0MF9ibF9ncGlvX2luZm8sICZzbWRrNjQ0MF9ibF9kYXRhKTsKIAorCXM1cDY0NDBfc2V0X2xjZF9pbnRlcmZhY2UoKTsKKwlzM2NfZmJfc2V0X3BsYXRkYXRhKCZzbWRrNjQ0MF9sY2RfcGRhdGEpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc21kazY0NDBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrNjQ0MF9kZXZpY2VzKSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoU01ESzY0NDAsICJTTURLNjQ0MCIpCiAJLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UDY0WDBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5pbml0X2lycQk9IHM1cDY0NDBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWRrNjQ0MF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ1MC5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL21hY2gtc21kazY0NTAuYwppbmRleCAzM2YyYWRmLi4wYWIxMjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvbWFjaC1zbWRrNjQ1MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9tYWNoLXNtZGs2NDUwLmMKQEAgLTIzLDYgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQ3LDYgKzUwLDggQEAKICNpbmNsdWRlIDxwbGF0L3RzLmg+CiAjaW5jbHVkZSA8cGxhdC9zNXAtdGltZS5oPgogI2luY2x1ZGUgPHBsYXQvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8cGxhdC9mYi5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1mYi5oPgogCiAjZGVmaW5lIFNNREs2NDUwX1VDT05fREVGQVVMVAkoUzNDMjQxMF9VQ09OX1RYSUxFVkVMIHwJXAogCQkJCVMzQzI0MTBfVUNPTl9SWElMRVZFTCB8CQlcCkBAIC0xMTAsNiArMTE1LDU5IEBACiAjZW5kaWYKIH07CiAKKy8qIEZyYW1lIEJ1ZmZlciAqLworc3RhdGljIHN0cnVjdCBzM2NfZmJfcGRfd2luIHNtZGs2NDUwX2ZiX3dpbjAgPSB7CisJLndpbl9tb2RlCT0geworCQkubGVmdF9tYXJnaW4JPSA4LAorCQkucmlnaHRfbWFyZ2luCT0gMTMsCisJCS51cHBlcl9tYXJnaW4JPSA3LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDMsCisJCS52c3luY19sZW4JPSAxLAorCQkueHJlcwkJPSA4MDAsCisJCS55cmVzCQk9IDQ4MCwKKwl9LAorCS5tYXhfYnBwCT0gMzIsCisJLmRlZmF1bHRfYnBwCT0gMjQsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9wbGF0ZGF0YSBzbWRrNjQ1MF9sY2RfcGRhdGEgX19pbml0ZGF0YSA9IHsKKwkud2luWzBdCQk9ICZzbWRrNjQ1MF9mYl93aW4wLAorCS52aWRjb24wCT0gVklEQ09OMF9WSURPVVRfUkdCIHwgVklEQ09OMF9QTlJNT0RFX1JHQiwKKwkudmlkY29uMQk9IFZJRENPTjFfSU5WX0hTWU5DIHwgVklEQ09OMV9JTlZfVlNZTkMsCisJLnNldHVwX2dwaW8JPSBzNXA2NHgwX2ZiX2dwaW9fc2V0dXBfMjRicHAsCit9OworCisvKiBMQ0QgcG93ZXIgY29udHJvbGxlciAqLworc3RhdGljIHZvaWQgc21kazY0NTBfbHRlNDgwX3Jlc2V0X3Bvd2VyKHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwKKwkJCQkJIHVuc2lnbmVkIGludCBwb3dlcikKK3sKKwlpbnQgZXJyOworCisJaWYgKHBvd2VyKSB7CisJCWVyciA9IGdwaW9fcmVxdWVzdChTNVA2NDUwX0dQTig1KSwgIkdQTiIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZXF1ZXN0IEdQTiBmb3IgbGNkIHJlc2V0XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChTNVA2NDUwX0dQTig1KSwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKFM1UDY0NTBfR1BOKDUpLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoUzVQNjQ1MF9HUE4oNSksIDEpOworCQlncGlvX2ZyZWUoUzVQNjQ1MF9HUE4oNSkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwbGF0X2xjZF9kYXRhIHNtZGs2NDUwX2xjZF9wb3dlcl9kYXRhID0geworCS5zZXRfcG93ZXIJPSBzbWRrNjQ1MF9sdGU0ODBfcmVzZXRfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWRrNjQ1MF9sY2RfbHRlNDgwd3YgPSB7CisJLm5hbWUJCQk9ICJwbGF0Zm9ybS1sY2QiLAorCS5kZXYucGFyZW50CQk9ICZzM2NfZGV2aWNlX2ZiLmRldiwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmc21kazY0NTBfbGNkX3Bvd2VyX2RhdGEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21kazY0NTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnMzY19kZXZpY2VfYWRjLAogCSZzM2NfZGV2aWNlX3J0YywKQEAgLTExOSw2ICsxNzcsOSBAQAogCSZzM2NfZGV2aWNlX3dkdCwKIAkmc2Ftc3VuZ19hc29jX2RtYSwKIAkmczVwNjQ1MF9kZXZpY2VfaWlzMCwKKwkmczNjX2RldmljZV9mYiwKKwkmc21kazY0NTBfbGNkX2x0ZTQ4MHd2LAorCiAJLyogczVwNjQ1MF9kZXZpY2Vfc3BpMCB3aWxsIGJlIGFkZGVkICovCiB9OwogCkBAIC0xNDgsMTIgKzIwOSw2IEBACiAJeyBJMkNfQk9BUkRfSU5GTygiMjRjMTI4IiwgMHg1NyksIH0sLyogU2Ftc3VuZyBTNTI0QUQwWEQxIEVFUFJPTSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiAvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21kazY0NTBfYmxfZ3Bpb19pbmZvID0gewogCS5ubyA9IFM1UDY0NTBfR1BGKDE1KSwKQEAgLTE3Miw5ICsyMjcsMjAgQEAKIAlzNXBfc2V0X3RpbWVyX3NvdXJjZShTNVBfUFdNMywgUzVQX1BXTTQpOwogfQogCitzdGF0aWMgdm9pZCBzNXA2NDUwX3NldF9sY2RfaW50ZXJmYWNlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNmZzsKKworCS8qIHNlbGVjdCBURlQgTENEIHR5cGUgKFJHQiBJL0YpICovCisJY2ZnID0gX19yYXdfcmVhZGwoUzVQNjRYMF9TUENPTjApOworCWNmZyAmPSB+UzVQNjRYMF9TUENPTjBfTENEX1NFTF9NQVNLOworCWNmZyB8PSBTNVA2NFgwX1NQQ09OMF9MQ0RfU0VMX1JHQjsKKwlfX3Jhd193cml0ZWwoY2ZnLCBTNVA2NFgwX1NQQ09OMCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzbWRrNjQ1MF9tYWNoaW5lX2luaXQodm9pZCkKIHsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCXMzY19pMmMwX3NldF9wbGF0ZGF0YSgmczVwNjQ1MF9pMmMwX2RhdGEpOwogCXMzY19pMmMxX3NldF9wbGF0ZGF0YSgmczVwNjQ1MF9pMmMxX2RhdGEpOwpAQCAtMTg1LDEyICsyNTEsMTUgQEAKIAogCXNhbXN1bmdfYmxfc2V0KCZzbWRrNjQ1MF9ibF9ncGlvX2luZm8sICZzbWRrNjQ1MF9ibF9kYXRhKTsKIAorCXM1cDY0NTBfc2V0X2xjZF9pbnRlcmZhY2UoKTsKKwlzM2NfZmJfc2V0X3BsYXRkYXRhKCZzbWRrNjQ1MF9sY2RfcGRhdGEpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc21kazY0NTBfZGV2aWNlcywgQVJSQVlfU0laRShzbWRrNjQ1MF9kZXZpY2VzKSk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoU01ESzY0NTAsICJTTURLNjQ1MCIpCiAJLyogTWFpbnRhaW5lcjogS3VramluIEtpbSA8a2dlbmUua2ltQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UDY0WDBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAogCS5pbml0X2lycQk9IHM1cDY0NTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBzbWRrNjQ1MF9tYXBfaW8sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvcG0uYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTI3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvcG0uYwpAQCAtMCwwICsxLDIwNCBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3BtLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogUzVQNjRYMCBQb3dlciBNYW5hZ2VtZW50IFN1cHBvcnQKKyAqCisgKiBCYXNlZCBvbiBhcmNoL2FybS9tYWNoLXMzYzY0eHgvcG0uYyBieSBCZW4gRG9va3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvcG0uaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KKyNpbmNsdWRlIDxwbGF0L3dha2V1cC1tYXNrLmg+CisKKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgczVwNjR4MF9jb3JlX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQNjRYMF9BUExMX0NPTiksCisJU0FWRV9JVEVNKFM1UDY0WDBfTVBMTF9DT04pLAorCVNBVkVfSVRFTShTNVA2NFgwX0VQTExfQ09OKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9FUExMX0NPTl9LKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfU1JDMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX1NSQzEpLAorCVNBVkVfSVRFTShTNVA2NFgwX0NMS19ESVYwKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfRElWMSksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX0RJVjIpLAorCVNBVkVfSVRFTShTNVA2NFgwX0NMS19ESVYzKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfR0FURV9NRU0wKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9DTEtfR0FURV9IQ0xLMSksCisJU0FWRV9JVEVNKFM1UDY0WDBfQ0xLX0dBVEVfU0NMSzEpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIHM1cDY0eDBfbWlzY19zYXZlW10gPSB7CisJU0FWRV9JVEVNKFM1UDY0WDBfQUhCX0NPTjApLAorCVNBVkVfSVRFTShTNVA2NFgwX1NQQ09OMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfU1BDT04xKSwKKwlTQVZFX0lURU0oUzVQNjRYMF9NRU0wQ09OU0xQMCksCisJU0FWRV9JVEVNKFM1UDY0WDBfTUVNMENPTlNMUDEpLAorCVNBVkVfSVRFTShTNVA2NFgwX01FTTBEUlZDT04pLAorCVNBVkVfSVRFTShTNVA2NFgwX01FTTFEUlZDT04pLAorCisJU0FWRV9JVEVNKFMzQzY0WFhfVElOVF9DU1RBVCksCit9OworCisvKiBEUExMIGlzIHByZXNlbnQgb25seSBpbiBTNVA2NDUwICovCitzdGF0aWMgc3RydWN0IHNsZWVwX3NhdmUgczVwNjQ1MF9jb3JlX3NhdmVbXSA9IHsKKwlTQVZFX0lURU0oUzVQNjQ1MF9EUExMX0NPTiksCisJU0FWRV9JVEVNKFM1UDY0NTBfRFBMTF9DT05fSyksCit9OworCit2b2lkIHMzY19wbV9jb25maWd1cmVfZXh0aW50KHZvaWQpCit7CisJX19yYXdfd3JpdGVsKHMzY19pcnF3YWtlX2VpbnRtYXNrLCBTNVA2NFgwX0VJTlRfV0FLRVVQX01BU0spOworfQorCit2b2lkIHMzY19wbV9yZXN0b3JlX2NvcmUodm9pZCkKK3sKKwlfX3Jhd193cml0ZWwoMCwgUzVQNjRYMF9FSU5UX1dBS0VVUF9NQVNLKTsKKworCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoczVwNjR4MF9jb3JlX3NhdmUsCisJCQkJQVJSQVlfU0laRShzNXA2NHgwX2NvcmVfc2F2ZSkpOworCisJaWYgKHNvY19pc19zNXA2NDUwKCkpCisJCXMzY19wbV9kb19yZXN0b3JlX2NvcmUoczVwNjQ1MF9jb3JlX3NhdmUsCisJCQkJQVJSQVlfU0laRShzNXA2NDUwX2NvcmVfc2F2ZSkpOworCisJczNjX3BtX2RvX3Jlc3RvcmUoczVwNjR4MF9taXNjX3NhdmUsIEFSUkFZX1NJWkUoczVwNjR4MF9taXNjX3NhdmUpKTsKK30KKwordm9pZCBzM2NfcG1fc2F2ZV9jb3JlKHZvaWQpCit7CisJczNjX3BtX2RvX3NhdmUoczVwNjR4MF9taXNjX3NhdmUsIEFSUkFZX1NJWkUoczVwNjR4MF9taXNjX3NhdmUpKTsKKworCWlmIChzb2NfaXNfczVwNjQ1MCgpKQorCQlzM2NfcG1fZG9fc2F2ZShzNXA2NDUwX2NvcmVfc2F2ZSwKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NTBfY29yZV9zYXZlKSk7CisKKwlzM2NfcG1fZG9fc2F2ZShzNXA2NHgwX2NvcmVfc2F2ZSwgQVJSQVlfU0laRShzNXA2NHgwX2NvcmVfc2F2ZSkpOworfQorCitzdGF0aWMgaW50IHM1cDY0eDBfY3B1X3N1c3BlbmQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJLyoKKwkgKiBJc3N1ZSB0aGUgc3RhbmRieSBzaWduYWwgaW50byB0aGUgcG0gdW5pdC4gTm90ZSwgd2UKKwkgKiBpc3N1ZSBhIHdyaXRlLWJ1ZmZlciBkcmFpbiBqdXN0IGluIGNhc2UuCisJICovCisJYXNtKCJiIDFmXG5cdCIKKwkgICAgIi5hbGlnbiA1XG5cdCIKKwkgICAgIjE6XG5cdCIKKwkgICAgIm1jciBwMTUsIDAsICUwLCBjNywgYzEwLCA1XG5cdCIKKwkgICAgIm1jciBwMTUsIDAsICUwLCBjNywgYzEwLCA0XG5cdCIKKwkgICAgIm1jciBwMTUsIDAsICUwLCBjNywgYzAsIDQiIDogOiAiciIgKHRtcCkpOworCisJLyogd2Ugc2hvdWxkIG5ldmVyIGdldCBwYXN0IGhlcmUgKi8KKwlwYW5pYygic2xlZXAgcmVzdW1lZCB0byBvcmlnaW5hdG9yPyIpOworfQorCisvKiBtYXBwaW5nIG9mIGludGVycnVwdHMgdG8gcGFydHMgb2YgdGhlIHdha2V1cCBtYXNrICovCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfd2FrZXVwX21hc2sgczVwNjR4MF93YWtlX2lycXNbXSA9IHsKKwl7IC5pcnEgPSBJUlFfUlRDX0FMQVJNLAkuYml0ID0gUzVQNjRYMF9QV1JfQ0ZHX1JUQ19BTFJNX0RJU0FCTEUsIH0sCisJeyAuaXJxID0gSVJRX1JUQ19USUMsCS5iaXQgPSBTNVA2NFgwX1BXUl9DRkdfUlRDX1RJQ0tfRElTQUJMRSwgfSwKKwl7IC5pcnEgPSBJUlFfSFNNTUMwLAkuYml0ID0gUzVQNjRYMF9QV1JfQ0ZHX01NQzBfRElTQUJMRSwgfSwKKwl7IC5pcnEgPSBJUlFfSFNNTUMxLAkuYml0ID0gUzVQNjRYMF9QV1JfQ0ZHX01NQzFfRElTQUJMRSwgfSwKK307CisKK3N0YXRpYyB2b2lkIHM1cDY0eDBfcG1fcHJlcGFyZSh2b2lkKQoreworCXUzMiB0bXA7CisKKwlzYW1zdW5nX3N5bmNfd2FrZW1hc2soUzVQNjRYMF9QV1JfQ0ZHLAorCQkJczVwNjR4MF93YWtlX2lycXMsIEFSUkFZX1NJWkUoczVwNjR4MF93YWtlX2lycXMpKTsKKworCS8qIHN0b3JlIHRoZSByZXN1bWUgYWRkcmVzcyBpbiBJTkZPUk0wIHJlZ2lzdGVyICovCisJX19yYXdfd3JpdGVsKHZpcnRfdG9fcGh5cyhzM2NfY3B1X3Jlc3VtZSksIFM1UDY0WDBfSU5GT1JNMCk7CisKKwkvKiBzZXR1cCBjbG9jayBnYXRpbmcgZm9yIEZJTUdWRyBibG9jayAqLworCV9fcmF3X3dyaXRlbCgoX19yYXdfcmVhZGwoUzVQNjRYMF9DTEtfR0FURV9IQ0xLMSkgfCBcCisJCShTNVA2NFgwX0NMS19HQVRFX0hDTEsxX0ZJTUdWRykpLCBTNVA2NFgwX0NMS19HQVRFX0hDTEsxKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKFM1UDY0WDBfQ0xLX0dBVEVfU0NMSzEpIHwgXAorCQkoUzVQNjRYMF9DTEtfR0FURV9TQ0xLMV9GSU1HVkcpKSwgUzVQNjRYMF9DTEtfR0FURV9TQ0xLMSk7CisKKwkvKiBDb25maWd1cmUgdGhlIHN0YWJpbGl6YXRpb24gY291bnRlciB3aXRoIHdhaXQgdGltZSByZXF1aXJlZCAqLworCV9fcmF3X3dyaXRlbChTNVA2NFgwX1BXUl9TVEFCTEVfUFdSX0NOVF9WQUw0LCBTNVA2NFgwX1BXUl9TVEFCTEUpOworCisJLyogc2V0IFdGSSB0byBTTEVFUCBtb2RlIGNvbmZpZ3VyYXRpb24gKi8KKwl0bXAgPSBfX3Jhd19yZWFkbChTNVA2NFgwX1NMRUVQX0NGRyk7CisJdG1wICY9IH4oUzVQNjRYMF9TTEVFUF9DRkdfT1NDX0VOKTsKKwlfX3Jhd193cml0ZWwodG1wLCBTNVA2NFgwX1NMRUVQX0NGRyk7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChTNVA2NFgwX1BXUl9DRkcpOworCXRtcCAmPSB+KFM1UDY0WDBfUFdSX0NGR19XRklfTUFTSyk7CisJdG1wIHw9IFM1UDY0WDBfUFdSX0NGR19XRklfU0xFRVA7CisJX19yYXdfd3JpdGVsKHRtcCwgUzVQNjRYMF9QV1JfQ0ZHKTsKKworCS8qCisJICogc2V0IE9USEVSUyByZWdpc3RlciB0byBkaXNhYmxlIGludGVycnVwdCBiZWZvcmUgZ29pbmcgdG8KKwkgKiBzbGVlcC4gVGhpcyBiaXQgaXMgcHJlc2VudCBvbmx5IGluIFM1UDY0NTAsIGl0IGlzIHJlc2VydmVkCisJICogaW4gUzVQNjQ0MC4KKwkgKi8KKwlpZiAoc29jX2lzX3M1cDY0NTAoKSkgeworCQl0bXAgPSBfX3Jhd19yZWFkbChTNVA2NFgwX09USEVSUyk7CisJCXRtcCB8PSBTNVA2NDUwX09USEVSU19ESVNBQkxFX0lOVDsKKwkJX19yYXdfd3JpdGVsKHRtcCwgUzVQNjRYMF9PVEhFUlMpOworCX0KKworCS8qIGVuc3VyZSBwcmV2aW91cyB3YWtldXAgc3RhdGUgaXMgY2xlYXJlZCBiZWZvcmUgc2xlZXBpbmcgKi8KKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoUzVQNjRYMF9XQUtFVVBfU1RBVCksIFM1UDY0WDBfV0FLRVVQX1NUQVQpOworCit9CisKK3N0YXRpYyBpbnQgczVwNjR4MF9wbV9hZGQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlwbV9jcHVfcHJlcCA9IHM1cDY0eDBfcG1fcHJlcGFyZTsKKwlwbV9jcHVfc2xlZXAgPSBzNXA2NHgwX2NwdV9zdXNwZW5kOworCXBtX3VhcnRfdWRpdnNsb3QgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBzNXA2NHgwX3BtX2RyaXZlciA9IHsKKwkuYWRkCQk9IHM1cDY0eDBfcG1fYWRkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgczVwNjR4MF9wbV9kcnZpbml0KHZvaWQpCit7CisJczNjX3BtX2luaXQoKTsKKworCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZzNXA2NHgwX3N5c2NsYXNzLCAmczVwNjR4MF9wbV9kcml2ZXIpOworfQorYXJjaF9pbml0Y2FsbChzNXA2NHgwX3BtX2RydmluaXQpOworCitzdGF0aWMgdm9pZCBzNXA2NHgwX3BtX3Jlc3VtZSh2b2lkKQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChTNVA2NFgwX09USEVSUyk7CisJdG1wIHw9IChTNVA2NFgwX09USEVSU19SRVRfTU1DMCB8IFM1UDY0WDBfT1RIRVJTX1JFVF9NTUMxIHwgXAorCQkJUzVQNjRYMF9PVEhFUlNfUkVUX1VBUlQpOworCV9fcmF3X3dyaXRlbCh0bXAgLCBTNVA2NFgwX09USEVSUyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgczVwNjR4MF9wbV9zeXNjb3JlX29wcyA9IHsKKwkucmVzdW1lCQk9IHM1cDY0eDBfcG1fcmVzdW1lLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgczVwNjR4MF9wbV9zeXNjb3JlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmczVwNjR4MF9wbV9zeXNjb3JlX29wcyk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoczVwNjR4MF9wbV9zeXNjb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3NldHVwLWZiLTI0YnBwLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvc2V0dXAtZmItMjRicHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ2ZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3NldHVwLWZiLTI0YnBwLmMKQEAgLTAsMCArMSwyOSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL3NldHVwLWZiLTI0YnBwLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogQmFzZSBTNVA2NFgwIEdQSU8gc2V0dXAgaW5mb3JtYXRpb24gZm9yIExDRCBmcmFtZWJ1ZmZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CisKK3ZvaWQgczVwNjR4MF9mYl9ncGlvX3NldHVwXzI0YnBwKHZvaWQpCit7CisJaWYgKHNvY19pc19zNXA2NDQwKCkpIHsKKwkJczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKFM1UDY0NDBfR1BJKDApLCAxNiwgUzNDX0dQSU9fU0ZOKDIpKTsKKwkJczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKFM1UDY0NDBfR1BKKDApLCAxMiwgUzNDX0dQSU9fU0ZOKDIpKTsKKwl9IGVsc2UgaWYgKHNvY19pc19zNXA2NDUwKCkpIHsKKwkJczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKFM1UDY0NTBfR1BJKDApLCAxNiwgUzNDX0dQSU9fU0ZOKDIpKTsKKwkJczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKFM1UDY0NTBfR1BKKDApLCAxMiwgUzNDX0dQSU9fU0ZOKDIpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCmluZGV4IGU4YTMzYzQuLmU1MzhhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9LY29uZmlnCkBAIC0xMCw3ICsxMCw3IEBACiBjb25maWcgQ1BVX1M1UEMxMDAKIAlib29sCiAJc2VsZWN0IFM1UF9FWFRfSU5UCi0Jc2VsZWN0IFMzQ19QTDMzMF9ETUEKKwlzZWxlY3QgU0FNU1VOR19ETUFERVYKIAloZWxwCiAJICBFbmFibGUgUzVQQzEwMCBDUFUgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9jbG9jay5jCmluZGV4IGZmNWNiYjMuLjhkNDc3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9jbG9jay5jCkBAIC0zMyw2ICszMywxMSBAQAogCS5uYW1lCQk9ICJvdGdfcGh5IiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrIGR1bW15X2FwYl9wY2xrID0geworCS5uYW1lCQk9ICJhcGJfcGNsayIsCisJLmlkCQk9IC0xLAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgKmNsa19zcmNfbW91dF9ocmVmX2xpc3RbXSA9IHsKIAlbMF0gPSAmczVwX2Nsa18yN20sCiAJWzFdID0gJmNsa19maW5faHBsbCwKQEAgLTQ1NCwxNCArNDU5LDE0IEBACiAJCS5lbmFibGUJCT0gczVwYzEwMF9kMV8wX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMiksCiAJfSwgewotCQkubmFtZQkJPSAicGRtYSIsCi0JCS5kZXZuYW1lCT0gInMzYy1wbDMzMC4xIiwKKwkJLm5hbWUJCT0gImRtYSIsCisJCS5kZXZuYW1lCT0gImRtYS1wbDMzMC4xIiwKIAkJLnBhcmVudAkJPSAmY2xrX2Rpdl9kMV9idXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cGMxMDBfZDFfMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDEpLAogCX0sIHsKLQkJLm5hbWUJCT0gInBkbWEiLAotCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMCIsCisJCS5uYW1lCQk9ICJkbWEiLAorCQkuZGV2bmFtZQk9ICJkbWEtcGwzMzAuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19kaXZfZDFfYnVzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXBjMTAwX2QxXzBfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKQEAgLTEyNzYsNSArMTI4MSw3IEBACiAJczNjX3JlZ2lzdGVyX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAJczNjX2Rpc2FibGVfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAorCXMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmR1bW15X2FwYl9wY2xrKTsKKwogCXMzY19wd21jbGtfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2RtYS5jCmluZGV4IGJmNGNkMGYuLjA2NWEwODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZG1hLmMKQEAgLTEsNCArMSw4IEBACi0vKgorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2RtYS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKICAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCiAgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CiAgKgpAQCAtMTcsMTUwICsyMSwyNDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9wbDMzMC5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgorI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLQotI2luY2x1ZGUgPHBsYXQvczNjLXBsMzMwLXBkYXRhLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAogc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwYzEwMF9wZG1hMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICA9IFM1UEMxMDBfUEFfUERNQTAsCi0JCS5lbmQgICAgPSBTNVBDMTAwX1BBX1BETUEwICsgU1pfNEssCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTAsCi0JCS5lbmQJPSBJUlFfUERNQTAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorc3RydWN0IGRtYV9wbDMzMF9wZXJpIHBkbWEwX3BlcmlbMzBdID0geworCXsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQzX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9IERNQUNIX0lSREEsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMwU19UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BJMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19NSUNJTiwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19QQ01JTiwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfQUM5N19QQ01PVVQsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0VYVEVSTkFMLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUFdNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfU1BESUYsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0hTSV9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSFNJX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIHM1cGMxMDBfcGRtYTBfcGRhdGEgPSB7Ci0JLnBlcmkgPSB7Ci0JCVswXSA9IERNQUNIX1VBUlQwX1JYLAotCQlbMV0gPSBETUFDSF9VQVJUMF9UWCwKLQkJWzJdID0gRE1BQ0hfVUFSVDFfUlgsCi0JCVszXSA9IERNQUNIX1VBUlQxX1RYLAotCQlbNF0gPSBETUFDSF9VQVJUMl9SWCwKLQkJWzVdID0gRE1BQ0hfVUFSVDJfVFgsCi0JCVs2XSA9IERNQUNIX1VBUlQzX1JYLAotCQlbN10gPSBETUFDSF9VQVJUM19UWCwKLQkJWzhdID0gRE1BQ0hfSVJEQSwKLQkJWzldID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzEwXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxMV0gPSBETUFDSF9JMlMwU19UWCwKLQkJWzEyXSA9IERNQUNIX0kyUzFfUlgsCi0JCVsxM10gPSBETUFDSF9JMlMxX1RYLAotCQlbMTRdID0gRE1BQ0hfSTJTMl9SWCwKLQkJWzE1XSA9IERNQUNIX0kyUzJfVFgsCi0JCVsxNl0gPSBETUFDSF9TUEkwX1JYLAotCQlbMTddID0gRE1BQ0hfU1BJMF9UWCwKLQkJWzE4XSA9IERNQUNIX1NQSTFfUlgsCi0JCVsxOV0gPSBETUFDSF9TUEkxX1RYLAotCQlbMjBdID0gRE1BQ0hfU1BJMl9SWCwKLQkJWzIxXSA9IERNQUNIX1NQSTJfVFgsCi0JCVsyMl0gPSBETUFDSF9BQzk3X01JQ0lOLAotCQlbMjNdID0gRE1BQ0hfQUM5N19QQ01JTiwKLQkJWzI0XSA9IERNQUNIX0FDOTdfUENNT1VULAotCQlbMjVdID0gRE1BQ0hfRVhURVJOQUwsCi0JCVsyNl0gPSBETUFDSF9QV00sCi0JCVsyN10gPSBETUFDSF9TUERJRiwKLQkJWzI4XSA9IERNQUNIX0hTSV9SWCwKLQkJWzI5XSA9IERNQUNIX0hTSV9UWCwKLQkJWzMwXSA9IERNQUNIX01BWCwKLQkJWzMxXSA9IERNQUNIX01BWCwKLQl9LAorc3RydWN0IGRtYV9wbDMzMF9wbGF0ZGF0YSBzNXBjMTAwX3BkbWEwX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShwZG1hMF9wZXJpKSwKKwkucGVyaSA9IHBkbWEwX3BlcmksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9wZG1hMCA9IHsKLQkubmFtZQkJPSAiczNjLXBsMzMwIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwYzEwMF9wZG1hMF9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczVwYzEwMF9wZG1hMF9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKK3N0cnVjdCBhbWJhX2RldmljZSBzNXBjMTAwX2RldmljZV9wZG1hMCA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMC4wIiwKIAkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAogCQkucGxhdGZvcm1fZGF0YSA9ICZzNXBjMTAwX3BkbWEwX3BkYXRhLAogCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cGMxMDBfcGRtYTFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgPSBTNVBDMTAwX1BBX1BETUExLAotCQkuZW5kICAgID0gUzVQQzEwMF9QQV9QRE1BMSArIFNaXzRLLAorCS5yZXMgPSB7CisJCS5zdGFydCA9IFM1UEMxMDBfUEFfUERNQTAsCisJCS5lbmQgPSBTNVBDMTAwX1BBX1BETUEwICsgU1pfNEssCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTEsCi0JCS5lbmQJPSBJUlFfUERNQTEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCS5pcnEgPSB7SVJRX1BETUEwLCBOT19JUlF9LAorCS5wZXJpcGhpZCA9IDB4MDAwNDEzMzAsCit9OworCitzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgcGRtYTFfcGVyaVszMF0gPSB7CisJeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gRE1BQ0hfSVJEQSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzBTX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9JMlMyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkwX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkxX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkyX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUEkyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00wX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00xX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00xX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QQ00xX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVExLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTIsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMywKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfcGwzMzBfcGxhdGRhdGEgczVwYzEwMF9wZG1hMV9wZGF0YSA9IHsKLQkucGVyaSA9IHsKLQkJWzBdID0gRE1BQ0hfVUFSVDBfUlgsCi0JCVsxXSA9IERNQUNIX1VBUlQwX1RYLAotCQlbMl0gPSBETUFDSF9VQVJUMV9SWCwKLQkJWzNdID0gRE1BQ0hfVUFSVDFfVFgsCi0JCVs0XSA9IERNQUNIX1VBUlQyX1JYLAotCQlbNV0gPSBETUFDSF9VQVJUMl9UWCwKLQkJWzZdID0gRE1BQ0hfVUFSVDNfUlgsCi0JCVs3XSA9IERNQUNIX1VBUlQzX1RYLAotCQlbOF0gPSBETUFDSF9JUkRBLAotCQlbOV0gPSBETUFDSF9JMlMwX1JYLAotCQlbMTBdID0gRE1BQ0hfSTJTMF9UWCwKLQkJWzExXSA9IERNQUNIX0kyUzBTX1RYLAotCQlbMTJdID0gRE1BQ0hfSTJTMV9SWCwKLQkJWzEzXSA9IERNQUNIX0kyUzFfVFgsCi0JCVsxNF0gPSBETUFDSF9JMlMyX1JYLAotCQlbMTVdID0gRE1BQ0hfSTJTMl9UWCwKLQkJWzE2XSA9IERNQUNIX1NQSTBfUlgsCi0JCVsxN10gPSBETUFDSF9TUEkwX1RYLAotCQlbMThdID0gRE1BQ0hfU1BJMV9SWCwKLQkJWzE5XSA9IERNQUNIX1NQSTFfVFgsCi0JCVsyMF0gPSBETUFDSF9TUEkyX1JYLAotCQlbMjFdID0gRE1BQ0hfU1BJMl9UWCwKLQkJWzIyXSA9IERNQUNIX1BDTTBfUlgsCi0JCVsyM10gPSBETUFDSF9QQ00wX1RYLAotCQlbMjRdID0gRE1BQ0hfUENNMV9SWCwKLQkJWzI1XSA9IERNQUNIX1BDTTFfVFgsCi0JCVsyNl0gPSBETUFDSF9NU01fUkVRMCwKLQkJWzI3XSA9IERNQUNIX01TTV9SRVExLAotCQlbMjhdID0gRE1BQ0hfTVNNX1JFUTIsCi0JCVsyOV0gPSBETUFDSF9NU01fUkVRMywKLQkJWzMwXSA9IERNQUNIX01BWCwKLQkJWzMxXSA9IERNQUNIX01BWCwKLQl9LAorc3RydWN0IGRtYV9wbDMzMF9wbGF0ZGF0YSBzNXBjMTAwX3BkbWExX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShwZG1hMV9wZXJpKSwKKwkucGVyaSA9IHBkbWExX3BlcmksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9wZG1hMSA9IHsKLQkubmFtZQkJPSAiczNjLXBsMzMwIiwKLQkuaWQJCT0gMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwYzEwMF9wZG1hMV9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczVwYzEwMF9wZG1hMV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKK3N0cnVjdCBhbWJhX2RldmljZSBzNXBjMTAwX2RldmljZV9wZG1hMSA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMC4xIiwKIAkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAogCQkucGxhdGZvcm1fZGF0YSA9ICZzNXBjMTAwX3BkbWExX3BkYXRhLAogCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczVwYzEwMF9kbWFjc1tdIF9faW5pdGRhdGEgPSB7Ci0JJnM1cGMxMDBfZGV2aWNlX3BkbWEwLAotCSZzNXBjMTAwX2RldmljZV9wZG1hMSwKKwkucmVzID0geworCQkuc3RhcnQgPSBTNVBDMTAwX1BBX1BETUExLAorCQkuZW5kID0gUzVQQzEwMF9QQV9QRE1BMSArIFNaXzRLLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCS5pcnEgPSB7SVJRX1BETUExLCBOT19JUlF9LAorCS5wZXJpcGhpZCA9IDB4MDAwNDEzMzAsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzNXBjMTAwX2RtYV9pbml0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fYWRkX2RldmljZXMoczVwYzEwMF9kbWFjcywgQVJSQVlfU0laRShzNXBjMTAwX2RtYWNzKSk7CisJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoJnM1cGMxMDBfZGV2aWNlX3BkbWEwLCAmaW9tZW1fcmVzb3VyY2UpOworCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZzNXBjMTAwX2RldmljZV9wZG1hMSwgJmlvbWVtX3Jlc291cmNlKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaCBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmZhODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9jbGtkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfX01BQ0hfQ0xLREVWX0hfXwotI2RlZmluZSBfX01BQ0hfQ0xLREVWX0hfXwotCi0jZGVmaW5lIF9fY2xrX2dldChjbGspICh7IDE7IH0pCi0jZGVmaW5lIF9fY2xrX3B1dChjbGspIGRvIHt9IHdoaWxlICgwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBiMmJhOTVkLi42OTRmNzU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMiw3ICsyMiw3IEBACiAJICogYWxpZ25lZCBhbmQgYWRkIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSBsb2FkIHRoZSB2YWx1ZSBoZXJlLgogCSAqLwogCi0JLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8gYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCWxkcglccnAsID0gUzNDX1BBX1VBUlQKIAkJbGRyCVxydiwgPSBTM0NfVkFfVUFSVAogI2lmIENPTkZJR19ERUJVR19TM0NfVUFSVCAhPSAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCA4MTIwOWViLi4yMDE4NDJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX19NQUNIX0RNQV9ICiAjZGVmaW5lIF9fTUFDSF9ETUFfSAogCi0vKiBUaGlzIHBsYXRmb3JtIHVzZXMgdGhlIGNvbW1vbiBTM0MgRE1BIEFQSSBkcml2ZXIgZm9yIFBMMzMwICovCi0jaW5jbHVkZSA8cGxhdC9zM2MtZG1hLXBsMzMwLmg+CisvKiBUaGlzIHBsYXRmb3JtIHVzZXMgdGhlIGNvbW1vbiBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KKyNpbmNsdWRlIDxwbGF0L2RtYS1wbDMzMC5oPgogCiAjZW5kaWYgLyogX19NQUNIX0RNQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDI5YThhMTIuLjVlMWE5MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xNSwxMSArMTUsNiBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0dQSU9fSAogI2RlZmluZSBfX0FTTV9BUkNIX0dQSU9fSCBfX0ZJTEVfXwogCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCi0KIC8qIEdQSU8gYmFuayBzaXplcyAqLwogI2RlZmluZSBTNVBDMTAwX0dQSU9fQTBfTlIJKDgpCiAjZGVmaW5lIFM1UEMxMDBfR1BJT19BMV9OUgkoNSkKQEAgLTE0Niw2ICsxNDEsNCBAQAogLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgZ3Bpb3Mgd2UgbmVlZCB0byB0aGUgb25lIGFmdGVyIHRoZSBNUDA0KCkgcmFuZ2UgKi8KICNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKFM1UEMxMDBfR1BJT19FTkQgKyAxKQogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE0ZTc5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IDIwMDggU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4KLSAqICAgICAgQnl1bmdobyBNaW4gPGJobWluQHNhbXN1bmcuY29tPgotICoKLSAqIEJhc2VkIG9uIG1hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUICAgICAJVUwoMHgyMDAwMDAwMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0ZDJmNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uCi0gKiAgICAgIEJ5dW5naG8gTWluIDxiaG1pbkBzYW1zdW5nLmNvbT4KLSAqCi0gKiBTNVBDMTAwIC0gcHdtIGNsb2NrIGFuZCB0aW1lciBzdXBwb3J0Ci0gKgotICogQmFzZWQgb24gbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICovCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAdGNmZzogVGhlIHRpbWVyIFRDRkcxIHJlZ2lzdGVyIGJpdHMgc2hpZnRlZCBkb3duIHRvIDAuCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZnJvbSBUQ0ZHMSBpcyBhIFRDTEsgaW5zdGVhZAotICogYW55IG9mIHRoZSBURElWIGNsb2Nrcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHdtX2NmZ19zcmNfaXNfdGNsayh1bnNpZ25lZCBsb25nIHRjZmcpCi17Ci0JcmV0dXJuIHRjZmcgPj0gUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSzsKLX0KLQotLyoqCi0gKiB0Y2ZnX3RvX2Rpdmlzb3IoKSAtIGNvbnZlcnQgdGNmZzEgc2V0dGluZyB0byBhIGRpdmlzb3IKLSAqIEB0Y2ZnMTogVGhlIHRjZmcxIHNldHRpbmcsIHNoaWZ0ZWQgZG93bi4KLSAqCi0gKiBHZXQgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiB0Y2ZnMSBzZXR0aW5nLiBXZSBhc3N1bWUgdGhlCi0gKiBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0byBzZWUgaWYgdGhpcyBpcyBub3QgYSBUQ0xLIHNvdXJjZS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRjZmdfdG9fZGl2aXNvcih1bnNpZ25lZCBsb25nIHRjZmcxKQotewotCXJldHVybiAxIDw8IHRjZmcxOwotfQotCi0vKioKLSAqIHB3bV90ZGl2X2hhc19kaXYxKCkgLSBkb2VzIHRoZSB0ZGl2IHNldHRpbmcgaGF2ZSBhIC8xCi0gKgotICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhIC8xIGluIHRoZSB0ZGl2IHNldHRpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHB3bV90ZGl2X2hhc19kaXYxKHZvaWQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfZGl2X2JpdHMoKSAtIGNhbGN1bGF0ZSBUQ0ZHMSBkaXZpc29yIHZhbHVlLgotICogQGRpdjogVGhlIGRpdmlzb3IgdG8gY2FsY3VsYXRlIHRoZSBiaXQgaW5mb3JtYXRpb24gZm9yLgotICoKLSAqIFR1cm4gYSBkaXZpc29yIGludG8gdGhlIG5lY2Vzc2FyeSBiaXQgZmllbGQgZm9yIFRDRkcxLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX3RkaXZfZGl2X2JpdHModW5zaWduZWQgaW50IGRpdikKLXsKLQlyZXR1cm4gaWxvZzIoZGl2KTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL21hY2gtc21ka2MxMDAuYyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9tYWNoLXNtZGtjMTAwLmMKaW5kZXggMjI3ZDg5MC4uMjZmNWM5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL21hY2gtc21ka2MxMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jCkBAIC0yMDMsMTIgKzIwMyw2IEBACiAJJnM1cGMxMDBfZGV2aWNlX3NwZGlmLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBzM2NfdHNfcGxhdGZvcm0gX19pbml0ZGF0YSA9IHsKLQkuZGVsYXkJCQk9IDEwMDAwLAotCS5wcmVzYwkJCT0gNDksCi0JLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCi19OwotCiAvKiBMQ0QgQmFja2xpZ2h0IGRhdGEgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ibF9ncGlvX2luZm8gc21ka2MxMDBfYmxfZ3Bpb19pbmZvID0gewogCS5ubyA9IFM1UEMxMDBfR1BEKDApLApAQCAtMjI4LDcgKzIyMiw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbWRrYzEwMF9tYWNoaW5lX2luaXQodm9pZCkKIHsKLQlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YSgmczNjX3RzX3BsYXRmb3JtKTsKKwlzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShOVUxMKTsKIAogCS8qIEkyQyAqLwogCXMzY19pMmMwX3NldF9wbGF0ZGF0YShOVUxMKTsKQEAgLTI1NCw3ICsyNDgsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREtDMTAwLCAiU01ES0MxMDAiKQogCS8qIE1haW50YWluZXI6IEJ5dW5naG8gTWluIDxiaG1pbkBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXBjMTAwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21ka2MxMDBfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBzbWRrYzEwMF9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9zZXR1cC1zZGhjaS5jCmluZGV4IGJlMjU4NzkuLjY0MThjNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwYzEwMC9zZXR1cC1zZGhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9zZXR1cC1zZGhjaS5jCkBAIC0xMSwxNyArMTEsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogCiAvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLwogCkBAIC0zMSwzNSArMjEsMyBAQAogCVsyXSA9ICJzY2xrX21tYyIsCS8qIG1tY19idXMgKi8KIAkvKiBbM10gPSAiNDhtIiwJCS0gbm90ZSBub3Qgc3VjY2Vzc2Z1bGx5IHVzZWQgeWV0ICovCiB9OwotCi0KLXZvaWQgczVwYzEwMF9zZXR1cF9zZGhjaTBfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCSAgICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJICAgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJICAgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKLXsKLQl1MzIgY3RybDIsIGN0cmwzOwotCi0JLyogZG9uJ3QgbmVlZCB0byBhbHRlciBhbnl0aGluZyBhY2NvcmRpbmcgdG8gY2FyZC10eXBlICovCi0KLQl3cml0ZWwoUzNDNjRYWF9TREhDSV9DT05UUk9MNF9EUklWRV85bUEsIHIgKyBTM0M2NFhYX1NESENJX0NPTlRST0w0KTsKLQotCWN0cmwyID0gcmVhZGwociArIFMzQ19TREhDSV9DT05UUk9MMik7Ci0JY3RybDIgJj0gUzNDX1NESENJX0NUUkwyX1NFTEJBU0VDTEtfTUFTSzsKLQljdHJsMiB8PSAoUzNDNjRYWF9TREhDSV9DVFJMMl9FTlNUQUFTWU5DQ0xSIHwKLQkJICBTM0M2NFhYX1NESENJX0NUUkwyX0VOQ01EQ05GTVNLIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5GQkNMS1JYIHwKLQkJICBTM0NfU0RIQ0lfQ1RSTDJfREZDTlRfTk9ORSB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VOQ0xLT1VUSE9MRCk7Ci0KLQlpZiAoaW9zLT5jbG9jayA8IDI1ICogMTAwMDAwMCkKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMyB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMiB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8Ci0JCQkgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0JZWxzZQotCQljdHJsMyA9IChTM0NfU0RIQ0lfQ1RSTDNfRkNTRUwxIHwgUzNDX1NESENJX0NUUkwzX0ZDU0VMMCk7Ci0KLQl3cml0ZWwoY3RybDIsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCXdyaXRlbChjdHJsMywgciArIFMzQ19TREhDSV9DT05UUk9MMyk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnCmluZGV4IDY5ZGQ4N2MuLjY0NjA1N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9LY29uZmlnCkBAIC0xMSwxMCArMTEsMTEgQEAKIAogY29uZmlnIENQVV9TNVBWMjEwCiAJYm9vbAotCXNlbGVjdCBTM0NfUEwzMzBfRE1BCisJc2VsZWN0IFNBTVNVTkdfRE1BREVWCiAJc2VsZWN0IFM1UF9FWFRfSU5UCiAJc2VsZWN0IFM1UF9IUlQKLQlzZWxlY3QgUzVQVjIxMF9QTSBpZiBQTQorCXNlbGVjdCBTNVBfUE0gaWYgUE0KKwlzZWxlY3QgUzVQX1NMRUVQIGlmIFBNCiAJaGVscAogCSAgRW5hYmxlIFM1UFYyMTAgQ1BVIHN1cHBvcnQKIApAQCAtOTQsMTEgKzk1LDEzIEBACiAJc2VsZWN0IFMzQ19ERVZfVVNCX0hTT1RHCiAJc2VsZWN0IFM1UF9ERVZfT05FTkFORAogCXNlbGVjdCBTQU1TVU5HX0RFVl9LRVlQQUQKKwlzZWxlY3QgUzVQX0RFVl9UVgogCXNlbGVjdCBTNVBWMjEwX1NFVFVQX0ZCXzI0QlBQCiAJc2VsZWN0IFM1UFYyMTBfU0VUVVBfSTJDMQogCXNlbGVjdCBTNVBWMjEwX1NFVFVQX0kyQzIKIAlzZWxlY3QgUzVQVjIxMF9TRVRVUF9LRVlQQUQKIAlzZWxlY3QgUzVQVjIxMF9TRVRVUF9TREhDSQorCXNlbGVjdCBTNVBWMjEwX1NFVFVQX0ZJTUMKIAloZWxwCiAJICBNYWNoaW5lIHN1cHBvcnQgZm9yIFNhbXN1bmcgR09OSSBib2FyZAogCSAgUzVQQzExMChNQ1ApIGlzIG9uZSBvZiBwYWNrYWdlIG9wdGlvbiBvZiBTNVBWMjEwCkBAIC0xNjksOSArMTcyLDQgQEAKIAogZW5kbWVudQogCi1jb25maWcgUzVQVjIxMF9QTQotCWJvb2wKLQloZWxwCi0JICBQb3dlciBNYW5hZ2VtZW50IGNvZGUgY29tbW9uIHRvIFM1UFYyMTAKLQogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9NYWtlZmlsZQppbmRleCA1OTlhM2MwLi4wMDlmYmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiAKIG9iai0kKENPTkZJR19DUFVfUzVQVjIxMCkJKz0gY3B1Lm8gaW5pdC5vIGNsb2NrLm8gZG1hLm8KIG9iai0kKENPTkZJR19DUFVfUzVQVjIxMCkJKz0gc2V0dXAtaTJjMC5vCi1vYmotJChDT05GSUdfUzVQVjIxMF9QTSkJKz0gcG0ubyBzbGVlcC5vCitvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vCiAKICMgbWFjaGluZSBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Nsb2NrLmMKaW5kZXggZjVmOGZhOC4uNGM1YWM3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Nsb2NrLmMKQEAgLTE3NCw2ICsxNzQsMTYgQEAKIAlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9DTEtfU1JDX01BU0sxLCBjbGssIGVuYWJsZSk7CiB9CiAKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfaGRtaXBoeV9jdHJsKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gczVwX2dhdGVjdHJsKFM1UF9IRE1JX1BIWV9DT05UUk9MLCBjbGssIGVuYWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9jbGtfZGFjX2N0cmwoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBzNXBfZ2F0ZWN0cmwoUzVQX0RBQ19QSFlfQ09OVFJPTCwgY2xrLCBlbmFibGUpOworfQorCiBzdGF0aWMgc3RydWN0IGNsayBjbGtfc2Nsa19oZG1pMjdtID0gewogCS5uYW1lCQk9ICJzY2xrX2hkbWkyN20iLAogCS5yYXRlCQk9IDI3MDAwMDAwLApAQCAtMjAzLDYgKzIxMywxMSBAQAogCS5uYW1lCQk9ICJwY21jZGNsayIsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsayBkdW1teV9hcGJfcGNsayA9IHsKKwkubmFtZQkJPSAiYXBiX3BjbGsiLAorCS5pZAkJPSAtMSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfdnBsbHNyY19saXN0W10gPSB7CiAJWzBdID0gJmNsa19maW5fdnBsbCwKIAlbMV0gPSAmY2xrX3NjbGtfaGRtaTI3bSwKQEAgLTI4OSwxNCArMzA0LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGluaXRfY2xvY2tzX29mZltdID0gewogCXsKLQkJLm5hbWUJCT0gInBkbWEiLAotCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMCIsCisJCS5uYW1lCQk9ICJkbWEiLAorCQkuZGV2bmFtZQk9ICJkbWEtcGwzMzAuMCIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDMpLAogCX0sIHsKLQkJLm5hbWUJCT0gInBkbWEiLAotCQkuZGV2bmFtZQk9ICJzM2MtcGwzMzAuMSIsCisJCS5uYW1lCQk9ICJkbWEiLAorCQkuZGV2bmFtZQk9ICJkbWEtcGwzMzAuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oY2xrX3BzeXMuY2xrLAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDQpLApAQCAtMzMwLDYgKzM0NSw0MCBAQAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwMF9jdHJsLAogCQkuY3RybGJpdAk9ICgxIDw8IDE2KSwKIAl9LCB7CisJCS5uYW1lCQk9ICJkYWMiLAorCQkuZGV2bmFtZQk9ICJzNXAtc2RvIiwKKwkJLnBhcmVudAkJPSAmY2xrX2hjbGtfZHN5cy5jbGssCisJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTApLAorCX0sIHsKKwkJLm5hbWUJCT0gIm1peGVyIiwKKwkJLmRldm5hbWUJPSAiczVwLW1peGVyIiwKKwkJLnBhcmVudAkJPSAmY2xrX2hjbGtfZHN5cy5jbGssCisJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgOSksCisJfSwgeworCQkubmFtZQkJPSAidnAiLAorCQkuZGV2bmFtZQk9ICJzNXAtbWl4ZXIiLAorCQkucGFyZW50CQk9ICZjbGtfaGNsa19kc3lzLmNsaywKKwkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDFfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCA4KSwKKwl9LCB7CisJCS5uYW1lCQk9ICJoZG1pIiwKKwkJLmRldm5hbWUJPSAiczVwdjIxMC1oZG1pIiwKKwkJLnBhcmVudAkJPSAmY2xrX2hjbGtfZHN5cy5jbGssCisJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAxX2N0cmwsCisJCS5jdHJsYml0CT0gKDEgPDwgMTEpLAorCX0sIHsKKwkJLm5hbWUJCT0gImhkbWlwaHkiLAorCQkuZGV2bmFtZQk9ICJzNXB2MjEwLWhkbWkiLAorCQkuZW5hYmxlCQk9IGV4eW5vczRfY2xrX2hkbWlwaHlfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CisJCS5uYW1lCQk9ICJkYWNwaHkiLAorCQkuZGV2bmFtZQk9ICJzNXAtc2RvIiwKKwkJLmVuYWJsZQkJPSBleHlub3M0X2Nsa19kYWNfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAwKSwKKwl9LCB7CiAJCS5uYW1lCQk9ICJvdGciLAogCQkucGFyZW50CQk9ICZjbGtfaGNsa19wc3lzLmNsaywKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDFfY3RybCwKQEAgLTQwNyw2ICs0NTYsMTIgQEAKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMTw8OSksCiAJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmRldm5hbWUJPSAiczNjMjQ0MC1oZG1pcGh5LWkyYyIsCisJCS5wYXJlbnQJCT0gJmNsa19wY2xrX3BzeXMuY2xrLAorCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAorCQkuY3RybGJpdAk9ICgxIDw8IDExKSwKKwl9LCB7CiAJCS5uYW1lCQk9ICJzcGkiLAogCQkuZGV2bmFtZQk9ICJzM2M2NHh4LXNwaS4wIiwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfcHN5cy5jbGssCkBAIC01OTQsNiArNjQ5LDIzIEBACiAJLm5yX3NvdXJjZXMJPSBBUlJBWV9TSVpFKGNsa3NldF9zY2xrX21peGVyX2xpc3QpLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19zY2xrX21peGVyID0geworCS5jbGsJCT0geworCQkubmFtZQkJPSAic2Nsa19taXhlciIsCisJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKKwkJLmN0cmxiaXQJPSAoMSA8PCAxKSwKKwl9LAorCS5zb3VyY2VzID0gJmNsa3NldF9zY2xrX21peGVyLAorCS5yZWdfc3JjID0geyAucmVnID0gUzVQX0NMS19TUkMxLCAuc2hpZnQgPSA0LCAuc2l6ZSA9IDEgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayAqc2Nsa190dltdID0geworCSZjbGtfc2Nsa19kYWMsCisJJmNsa19zY2xrX3BpeGVsLAorCSZjbGtfc2Nsa19oZG1pLAorCSZjbGtfc2Nsa19taXhlciwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzZXRfc2Nsa19hdWRpbzBfbGlzdFtdID0gewogCVswXSA9ICZjbGtfZXh0X3h0YWxfbXV4LAogCVsxXSA9ICZjbGtfcGNtY2RjbGswLApAQCAtNzc3LDE0ICs4NDksNiBAQAogCQkucmVnX2RpdiA9IHsgLnJlZyA9IFM1UF9DTEtfRElWNCwgLnNoaWZ0ID0gMjgsIC5zaXplID0gNCB9LAogCX0sIHsKIAkJLmNsawk9IHsKLQkJCS5uYW1lCQk9ICJzY2xrX21peGVyIiwKLQkJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfbWFzazBfY3RybCwKLQkJCS5jdHJsYml0CT0gKDEgPDwgMSksCi0JCX0sCi0JCS5zb3VyY2VzID0gJmNsa3NldF9zY2xrX21peGVyLAotCQkucmVnX3NyYyA9IHsgLnJlZyA9IFM1UF9DTEtfU1JDMSwgLnNoaWZ0ID0gNCwgLnNpemUgPSAxIH0sCi0JfSwgewotCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gInNjbGtfZmltYyIsCiAJCQkuZGV2bmFtZQk9ICJzNXB2MjEwLWZpbWMuMCIsCiAJCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX21hc2sxX2N0cmwsCkBAIC05NzMsOSArMTAzNyw2IEBACiAJJmNsa19wY2xrX3BzeXMsCiAJJmNsa192cGxsc3JjLAogCSZjbGtfc2Nsa192cGxsLAotCSZjbGtfc2Nsa19kYWMsCi0JJmNsa19zY2xrX3BpeGVsLAotCSZjbGtfc2Nsa19oZG1pLAogCSZjbGtfbW91dF9kbWMwLAogCSZjbGtfc2Nsa19kbWMwLAogCSZjbGtfc2Nsa19hdWRpbzAsCkBAIC0xMDYwLDYgKzExMjEsNjEgQEAKIAkuZ2V0X3JhdGUgPSBzNXBfZXBsbF9nZXRfcmF0ZSwKIH07CiAKK3N0YXRpYyB1MzIgdnBsbF9kaXZbXVs1XSA9IHsKKwl7ICA1NDAwMDAwMCwgMywgNTMsIDMsIDAgfSwKKwl7IDEwODAwMDAwMCwgMywgNTMsIDIsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHM1cHYyMTBfdnBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KKworc3RhdGljIGludCBzNXB2MjEwX3ZwbGxfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IHZwbGxfY29uOworCXVuc2lnbmVkIGludCBpOworCisJLyogUmV0dXJuIGlmIG5vdGhpbmcgY2hhbmdlZCAqLworCWlmIChjbGstPnJhdGUgPT0gcmF0ZSkKKwkJcmV0dXJuIDA7CisKKwl2cGxsX2NvbiA9IF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTik7CisJdnBsbF9jb24gJj0gfigweDEgPDwgMjcgfAkJCQkJXAorCQkJUExMOTBYWF9NRElWX01BU0sgPDwgUExMOTBYWF9NRElWX1NISUZUIHwJXAorCQkJUExMOTBYWF9QRElWX01BU0sgPDwgUExMOTBYWF9QRElWX1NISUZUIHwJXAorCQkJUExMOTBYWF9TRElWX01BU0sgPDwgUExMOTBYWF9TRElWX1NISUZUKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZwbGxfZGl2KTsgaSsrKSB7CisJCWlmICh2cGxsX2RpdltpXVswXSA9PSByYXRlKSB7CisJCQl2cGxsX2NvbiB8PSB2cGxsX2RpdltpXVsxXSA8PCBQTEw5MFhYX1BESVZfU0hJRlQ7CisJCQl2cGxsX2NvbiB8PSB2cGxsX2RpdltpXVsyXSA8PCBQTEw5MFhYX01ESVZfU0hJRlQ7CisJCQl2cGxsX2NvbiB8PSB2cGxsX2RpdltpXVszXSA8PCBQTEw5MFhYX1NESVZfU0hJRlQ7CisJCQl2cGxsX2NvbiB8PSB2cGxsX2RpdltpXVs0XSA8PCAyNzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRSh2cGxsX2RpdikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBDbG9jayBWUExMIEZyZXF1ZW5jeVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCV9fcmF3X3dyaXRlbCh2cGxsX2NvbiwgUzVQX1ZQTExfQ09OKTsKKworCS8qIFdhaXQgZm9yIFZQTEwgbG9jayAqLworCXdoaWxlICghKF9fcmF3X3JlYWRsKFM1UF9WUExMX0NPTikgJiAoMSA8PCBQTEw5MFhYX0xPQ0tFRF9TSElGVCkpKQorCQljb250aW51ZTsKKworCWNsay0+cmF0ZSA9IHJhdGU7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgc3RydWN0IGNsa19vcHMgczVwdjIxMF92cGxsX29wcyA9IHsKKwkuZ2V0X3JhdGUgPSBzNXB2MjEwX3ZwbGxfZ2V0X3JhdGUsCisJLnNldF9yYXRlID0gczVwdjIxMF92cGxsX3NldF9yYXRlLAorfTsKKwogdm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBzNXB2MjEwX3NldHVwX2Nsb2Nrcyh2b2lkKQogewogCXN0cnVjdCBjbGsgKnh0YWxfY2xrOwpAQCAtMTEwOCw2ICsxMjI0LDcgQEAKIAljbGtfZm91dF9hcGxsLm9wcyA9ICZjbGtfZm91dF9hcGxsX29wczsKIAljbGtfZm91dF9tcGxsLnJhdGUgPSBtcGxsOwogCWNsa19mb3V0X2VwbGwucmF0ZSA9IGVwbGw7CisJY2xrX2ZvdXRfdnBsbC5vcHMgPSAmczVwdjIxMF92cGxsX29wczsKIAljbGtfZm91dF92cGxsLnJhdGUgPSB2cGxsOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiUzVQVjIxMDogUExMIHNldHRpbmdzLCBBPSVsZCwgTT0lbGQsIEU9JWxkIFY9JWxkIiwKQEAgLTExNTMsMTEgKzEyNzAsMTUgQEAKIAlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoc3lzY2xrcyk7IHB0cisrKQogCQlzM2NfcmVnaXN0ZXJfY2xrc3JjKHN5c2Nsa3NbcHRyXSwgMSk7CiAKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoc2Nsa190dik7IHB0cisrKQorCQlzM2NfcmVnaXN0ZXJfY2xrc3JjKHNjbGtfdHZbcHRyXSwgMSk7CisKIAlzM2NfcmVnaXN0ZXJfY2xrc3JjKGNsa3NyY3MsIEFSUkFZX1NJWkUoY2xrc3JjcykpOwogCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3MsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3MpKTsKIAogCXMzY19yZWdpc3Rlcl9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCXMzY19kaXNhYmxlX2Nsb2Nrcyhpbml0X2Nsb2Nrc19vZmYsIEFSUkFZX1NJWkUoaW5pdF9jbG9ja3Nfb2ZmKSk7CiAKKwlzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZkdW1teV9hcGJfcGNsayk7CiAJczNjX3B3bWNsa19pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY3B1LmMKaW5kZXggNzk5MDdlYy4uODRlYzc0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jcHUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTQxLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxwbGF0L2tleXBhZC1jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogI2luY2x1ZGUgPHBsYXQvcmVzZXQuaD4KKyNpbmNsdWRlIDxwbGF0L3R2LWNvcmUuaD4KIAogLyogSW5pdGlhbCBJTyBtYXBwaW5ncyAqLwogCkBAIC0xMTksNiArMTIxLDcgQEAKIHZvaWQgX19pbml0IHM1cHYyMTBfbWFwX2lvKHZvaWQpCiB7CiAJaW90YWJsZV9pbml0KHM1cHYyMTBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cHYyMTBfaW9kZXNjKSk7CisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKDE0IDw8IDIwKTsKIAogCS8qIGluaXRpYWxpc2UgZGV2aWNlIGluZm9ybWF0aW9uIGVhcmx5ICovCiAJczVwdjIxMF9kZWZhdWx0X3NkaGNpMCgpOwpAQCAtMTQzLDYgKzE0Niw5IEBACiAKIAkvKiBVc2UgczVwdjIxMC1rZXlwYWQgaW5zdGVhZCBvZiBzYW1zdW5nLWtleXBhZCAqLwogCXNhbXN1bmdfa2V5cGFkX3NldG5hbWUoInM1cHYyMTAta2V5cGFkIik7CisKKwkvKiBzZXR1cCBUViBkZXZpY2VzICovCisJczVwX2hkbWlfc2V0bmFtZSgiczVwdjIxMC1oZG1pIik7CiB9CiAKIHZvaWQgX19pbml0IHM1cHYyMTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZG1hLmMKaW5kZXggNDk3ZDM0My4uODZiNzQ5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kbWEuYwpAQCAtMSw0ICsxLDggQEAKLS8qCisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZG1hLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgogICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KICAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KICAqCkBAIC0xNywxNTEgKzIxLDI0MCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMzMwLmg+CiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CiAjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0jaW5jbHVkZSA8cGxhdC9zM2MtcGwzMzAtcGRhdGEuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCiBzdGF0aWMgdTY0IGRtYV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXB2MjEwX3BkbWEwX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgID0gUzVQVjIxMF9QQV9QRE1BMCwKLQkJLmVuZCAgICA9IFM1UFYyMTBfUEFfUERNQTAgKyBTWl80SywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9QRE1BMCwKLQkJLmVuZAk9IElSUV9QRE1BMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCitzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgcGRtYTBfcGVyaVsyOF0gPSB7CisJeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMFNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfTUlDSU4sCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfUENNSU4sCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0FDOTdfUENNT1VULAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NQVgsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9QV00sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9TUERJRiwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBzNXB2MjEwX3BkbWEwX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzFdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsyXSA9IERNQUNIX1VBUlQxX1JYLAotCQlbM10gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzRdID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVs1XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbNl0gPSBETUFDSF9VQVJUM19SWCwKLQkJWzddID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVs4XSA9IERNQUNIX01BWCwKLQkJWzldID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzEwXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxMV0gPSBETUFDSF9JMlMwU19UWCwKLQkJWzEyXSA9IERNQUNIX0kyUzFfUlgsCi0JCVsxM10gPSBETUFDSF9JMlMxX1RYLAotCQlbMTRdID0gRE1BQ0hfTUFYLAotCQlbMTVdID0gRE1BQ0hfTUFYLAotCQlbMTZdID0gRE1BQ0hfU1BJMF9SWCwKLQkJWzE3XSA9IERNQUNIX1NQSTBfVFgsCi0JCVsxOF0gPSBETUFDSF9TUEkxX1JYLAotCQlbMTldID0gRE1BQ0hfU1BJMV9UWCwKLQkJWzIwXSA9IERNQUNIX01BWCwKLQkJWzIxXSA9IERNQUNIX01BWCwKLQkJWzIyXSA9IERNQUNIX0FDOTdfTUlDSU4sCi0JCVsyM10gPSBETUFDSF9BQzk3X1BDTUlOLAotCQlbMjRdID0gRE1BQ0hfQUM5N19QQ01PVVQsCi0JCVsyNV0gPSBETUFDSF9NQVgsCi0JCVsyNl0gPSBETUFDSF9QV00sCi0JCVsyN10gPSBETUFDSF9TUERJRiwKLQkJWzI4XSA9IERNQUNIX01BWCwKLQkJWzI5XSA9IERNQUNIX01BWCwKLQkJWzMwXSA9IERNQUNIX01BWCwKLQkJWzMxXSA9IERNQUNIX01BWCwKLQl9LAorc3RydWN0IGRtYV9wbDMzMF9wbGF0ZGF0YSBzNXB2MjEwX3BkbWEwX3BkYXRhID0geworCS5ucl92YWxpZF9wZXJpID0gQVJSQVlfU0laRShwZG1hMF9wZXJpKSwKKwkucGVyaSA9IHBkbWEwX3BlcmksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9wZG1hMCA9IHsKLQkubmFtZQkJPSAiczNjLXBsMzMwIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwdjIxMF9wZG1hMF9yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczVwdjIxMF9wZG1hMF9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKK3N0cnVjdCBhbWJhX2RldmljZSBzNXB2MjEwX2RldmljZV9wZG1hMCA9IHsKKwkuZGV2ID0geworCQkuaW5pdF9uYW1lID0gImRtYS1wbDMzMC4wIiwKIAkJLmRtYV9tYXNrID0gJmRtYV9kbWFtYXNrLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAogCQkucGxhdGZvcm1fZGF0YSA9ICZzNXB2MjEwX3BkbWEwX3BkYXRhLAogCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYyMTBfcGRtYTFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgPSBTNVBWMjEwX1BBX1BETUExLAotCQkuZW5kICAgID0gUzVQVjIxMF9QQV9QRE1BMSArIFNaXzRLLAorCS5yZXMgPSB7CisJCS5zdGFydCA9IFM1UFYyMTBfUEFfUERNQTAsCisJCS5lbmQgPSBTNVBWMjEwX1BBX1BETUEwICsgU1pfNEssCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUERNQTEsCi0JCS5lbmQJPSBJUlFfUERNQTEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCS5pcnEgPSB7SVJRX1BETUEwLCBOT19JUlF9LAorCS5wZXJpcGhpZCA9IDB4MDAwNDEzMzAsCit9OworCitzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgcGRtYTFfcGVyaVszMl0gPSB7CisJeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQxX1JYLAorCQkucnF0eXBlID0gREVWVE9NRU0sCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUMV9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1VBUlQyX1RYLAorCQkucnF0eXBlID0gTUVNVE9ERVYsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9VQVJUM19SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfVUFSVDNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gRE1BQ0hfTUFYLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMF9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfSTJTMFNfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX0kyUzJfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1NQSTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01BWCwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTBfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfUlgsCisJCS5ycXR5cGUgPSBERVZUT01FTSwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX1BDTTFfVFgsCisJCS5ycXR5cGUgPSBNRU1UT0RFViwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVEwLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfTVNNX1JFUTEsCisJfSwgeworCQkucGVyaV9pZCA9ICh1OClETUFDSF9NU01fUkVRMiwKKwl9LCB7CisJCS5wZXJpX2lkID0gKHU4KURNQUNIX01TTV9SRVEzLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9SWCwKKwkJLnJxdHlwZSA9IERFVlRPTUVNLAorCX0sIHsKKwkJLnBlcmlfaWQgPSAodTgpRE1BQ0hfUENNMl9UWCwKKwkJLnJxdHlwZSA9IE1FTVRPREVWLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSBzNXB2MjEwX3BkbWExX3BkYXRhID0gewotCS5wZXJpID0gewotCQlbMF0gPSBETUFDSF9VQVJUMF9SWCwKLQkJWzFdID0gRE1BQ0hfVUFSVDBfVFgsCi0JCVsyXSA9IERNQUNIX1VBUlQxX1JYLAotCQlbM10gPSBETUFDSF9VQVJUMV9UWCwKLQkJWzRdID0gRE1BQ0hfVUFSVDJfUlgsCi0JCVs1XSA9IERNQUNIX1VBUlQyX1RYLAotCQlbNl0gPSBETUFDSF9VQVJUM19SWCwKLQkJWzddID0gRE1BQ0hfVUFSVDNfVFgsCi0JCVs4XSA9IERNQUNIX01BWCwKLQkJWzldID0gRE1BQ0hfSTJTMF9SWCwKLQkJWzEwXSA9IERNQUNIX0kyUzBfVFgsCi0JCVsxMV0gPSBETUFDSF9JMlMwU19UWCwKLQkJWzEyXSA9IERNQUNIX0kyUzFfUlgsCi0JCVsxM10gPSBETUFDSF9JMlMxX1RYLAotCQlbMTRdID0gRE1BQ0hfSTJTMl9SWCwKLQkJWzE1XSA9IERNQUNIX0kyUzJfVFgsCi0JCVsxNl0gPSBETUFDSF9TUEkwX1JYLAotCQlbMTddID0gRE1BQ0hfU1BJMF9UWCwKLQkJWzE4XSA9IERNQUNIX1NQSTFfUlgsCi0JCVsxOV0gPSBETUFDSF9TUEkxX1RYLAotCQlbMjBdID0gRE1BQ0hfTUFYLAotCQlbMjFdID0gRE1BQ0hfTUFYLAotCQlbMjJdID0gRE1BQ0hfUENNMF9SWCwKLQkJWzIzXSA9IERNQUNIX1BDTTBfVFgsCi0JCVsyNF0gPSBETUFDSF9QQ00xX1JYLAotCQlbMjVdID0gRE1BQ0hfUENNMV9UWCwKLQkJWzI2XSA9IERNQUNIX01TTV9SRVEwLAotCQlbMjddID0gRE1BQ0hfTVNNX1JFUTEsCi0JCVsyOF0gPSBETUFDSF9NU01fUkVRMiwKLQkJWzI5XSA9IERNQUNIX01TTV9SRVEzLAotCQlbMzBdID0gRE1BQ0hfUENNMl9SWCwKLQkJWzMxXSA9IERNQUNIX1BDTTJfVFgsCi0JfSwKK3N0cnVjdCBkbWFfcGwzMzBfcGxhdGRhdGEgczVwdjIxMF9wZG1hMV9wZGF0YSA9IHsKKwkubnJfdmFsaWRfcGVyaSA9IEFSUkFZX1NJWkUocGRtYTFfcGVyaSksCisJLnBlcmkgPSBwZG1hMV9wZXJpLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGRtYTEgPSB7Ci0JLm5hbWUJCT0gInMzYy1wbDMzMCIsCi0JLmlkCQk9IDEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cHYyMTBfcGRtYTFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cHYyMTBfcGRtYTFfcmVzb3VyY2UsCi0JLmRldgkJPSB7CitzdHJ1Y3QgYW1iYV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGRtYTEgPSB7CisJLmRldiA9IHsKKwkJLmluaXRfbmFtZSA9ICJkbWEtcGwzMzAuMSIsCiAJCS5kbWFfbWFzayA9ICZkbWFfZG1hbWFzaywKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmczVwdjIxMF9wZG1hMV9wZGF0YSwKIAl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnM1cHYyMTBfZG1hY3NbXSBfX2luaXRkYXRhID0gewotCSZzNXB2MjEwX2RldmljZV9wZG1hMCwKLQkmczVwdjIxMF9kZXZpY2VfcGRtYTEsCisJLnJlcyA9IHsKKwkJLnN0YXJ0ID0gUzVQVjIxMF9QQV9QRE1BMSwKKwkJLmVuZCA9IFM1UFYyMTBfUEFfUERNQTEgKyBTWl80SywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwkuaXJxID0ge0lSUV9QRE1BMSwgTk9fSVJRfSwKKwkucGVyaXBoaWQgPSAweDAwMDQxMzMwLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgczVwdjIxMF9kbWFfaW5pdCh2b2lkKQogewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHM1cHYyMTBfZG1hY3MsIEFSUkFZX1NJWkUoczVwdjIxMF9kbWFjcykpOworCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKCZzNXB2MjEwX2RldmljZV9wZG1hMCwgJmlvbWVtX3Jlc291cmNlKTsKKwlhbWJhX2RldmljZV9yZWdpc3RlcigmczVwdjIxMF9kZXZpY2VfcGRtYTEsICZpb21lbV9yZXNvdXJjZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMTY5ZmU2NS4uNzllNTU1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMjEsNyArMjEsNyBAQAogCSAqIGFsaWduZWQgYW5kIGFkZCBpbiB0aGUgb2Zmc2V0IHdoZW4gd2UgbG9hZCB0aGUgdmFsdWUgaGVyZS4KIAkgKi8KIAotCS5tYWNybyBhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvIGFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9IFMzQ19QQV9VQVJUCiAJCWxkcglccnYsID0gUzNDX1ZBX1VBUlQKICNpZiBDT05GSUdfREVCVUdfUzNDX1VBUlQgIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggODEyMDllYi4uMjAxODQyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9fTUFDSF9ETUFfSAogI2RlZmluZSBfX01BQ0hfRE1BX0gKIAotLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gUzNDIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMCAqLwotI2luY2x1ZGUgPHBsYXQvczNjLWRtYS1wbDMzMC5oPgorLyogVGhpcyBwbGF0Zm9ybSB1c2VzIHRoZSBjb21tb24gRE1BIEFQSSBkcml2ZXIgZm9yIFBMMzMwICovCisjaW5jbHVkZSA8cGxhdC9kbWEtcGwzMzAuaD4KIAogI2VuZGlmIC8qIF9fTUFDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBhNWExZTMzLi42YzhiOTAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTMsMTEgKzEzLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKICNkZWZpbmUgX19BU01fQVJDSF9HUElPX0ggX19GSUxFX18KIAotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKLSNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQotCiAvKiBQcmFjdGljYWxseSwgR1BJTyBiYW5rcyB1cCB0byBNUDAzIGFyZSB0aGUgY29uZmlndXJhYmxlIGdwaW8gYmFua3MgKi8KIAogLyogR1BJTyBiYW5rIHNpemVzICovCkBAIC0xNDIsNiArMTM3LDQgQEAKICNkZWZpbmUgQVJDSF9OUl9HUElPUwkJKFM1UFYyMTBfTVAwNShTNVBWMjEwX0dQSU9fTVAwNV9OUikgKwlcCiAJCQkJIENPTkZJR19TQU1TVU5HX0dQSU9fRVhUUkEgKyAxKQogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggYjlmOWVjMy4uNWUwZGUzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTU2LDcgKzU2LDcgQEAKICNkZWZpbmUgSVJRX1NQSTIJCVM1UF9JUlFfVklDMSgxNykKICNkZWZpbmUgSVJRX0lSREEJCVM1UF9JUlFfVklDMSgxOCkKICNkZWZpbmUgSVJRX0lJQzIJCVM1UF9JUlFfVklDMSgxOSkKLSNkZWZpbmUgSVJRX0lJQzMJCVM1UF9JUlFfVklDMSgyMCkKKyNkZWZpbmUgSVJRX0lJQ19IRE1JUEhZCQlTNVBfSVJRX1ZJQzEoMjApCiAjZGVmaW5lIElSUV9IU0lSWAkJUzVQX0lSUV9WSUMxKDIxKQogI2RlZmluZSBJUlFfSFNJVFgJCVM1UF9JUlFfVklDMSgyMikKICNkZWZpbmUgSVJRX1VIT1NUCQlTNVBfSVJRX1ZJQzEoMjMpCkBAIC04Niw3ICs4Niw3IEBACiAjZGVmaW5lIElSUV9IRE1JCQlTNVBfSVJRX1ZJQzIoMTIpCiAjZGVmaW5lIElSUV9JSUMxCQlTNVBfSVJRX1ZJQzIoMTMpCiAjZGVmaW5lIElSUV9NRkMJCQlTNVBfSVJRX1ZJQzIoMTQpCi0jZGVmaW5lIElSUV9UVkVOQwkJUzVQX0lSUV9WSUMyKDE1KQorI2RlZmluZSBJUlFfU0RPCQkJUzVQX0lSUV9WSUMyKDE1KQogI2RlZmluZSBJUlFfSTJTMAkJUzVQX0lSUV9WSUMyKDE2KQogI2RlZmluZSBJUlFfSTJTMQkJUzVQX0lSUV9WSUMyKDE3KQogI2RlZmluZSBJUlFfSTJTMgkJUzVQX0lSUV9WSUMyKDE4KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tYXAuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvbWFwLmgKaW5kZXggYWFjMzQzYy4uN2ZmNjA5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL21hcC5oCkBAIC05MCw2ICs5MCwxMiBAQAogI2RlZmluZSBTNVBWMjEwX1BBX0ZJTUMxCQkweEZCMzAwMDAwCiAjZGVmaW5lIFM1UFYyMTBfUEFfRklNQzIJCTB4RkI0MDAwMDAKIAorI2RlZmluZSBTNVBWMjEwX1BBX1NETwkJCTB4RjkwMDAwMDAKKyNkZWZpbmUgUzVQVjIxMF9QQV9WUAkJCTB4RjkxMDAwMDAKKyNkZWZpbmUgUzVQVjIxMF9QQV9NSVhFUgkJMHhGOTIwMDAwMAorI2RlZmluZSBTNVBWMjEwX1BBX0hETUkJCQkweEZBMTAwMDAwCisjZGVmaW5lIFM1UFYyMTBfUEFfSUlDX0hETUlQSFkJCTB4RkE5MDAwMDAKKwogLyogQ29tcGF0aWJpbHRpeSBEZWZpbmVzICovCiAKICNkZWZpbmUgUzNDX1BBX0ZCCQkJUzVQVjIxMF9QQV9GQgpAQCAtMTEwLDYgKzExNiwxMyBAQAogI2RlZmluZSBTNVBfUEFfRklNQzIJCQlTNVBWMjEwX1BBX0ZJTUMyCiAjZGVmaW5lIFM1UF9QQV9NSVBJX0NTSVMwCQlTNVBWMjEwX1BBX01JUElfQ1NJUwogI2RlZmluZSBTNVBfUEFfTUZDCQkJUzVQVjIxMF9QQV9NRkMKKyNkZWZpbmUgUzVQX1BBX0lJQ19IRE1JUEhZCQlTNVBWMjEwX1BBX0lJQ19IRE1JUEhZCisKKyNkZWZpbmUgUzVQX1BBX1NETwkJCVM1UFYyMTBfUEFfU0RPCisjZGVmaW5lIFM1UF9QQV9WUAkJCVM1UFYyMTBfUEFfVlAKKyNkZWZpbmUgUzVQX1BBX01JWEVSCQkJUzVQVjIxMF9QQV9NSVhFUgorI2RlZmluZSBTNVBfUEFfSERNSQkJCVM1UFYyMTBfUEFfSERNSQorCiAjZGVmaW5lIFM1UF9QQV9PTkVOQU5ECQkJUzVQQzExMF9QQV9PTkVOQU5ECiAjZGVmaW5lIFM1UF9QQV9PTkVOQU5EX0RNQQkJUzVQQzExMF9QQV9PTkVOQU5EX0RNQQogI2RlZmluZSBTNVBfUEFfU0RSQU0JCQlTNVBWMjEwX1BBX1NEUkFNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA3YjVmY2YwLi4yZDNjZmEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTE0LDcgKzE0LDYgQEAKICNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAogCiAjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MjAwMDAwMDApCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUJKFNaXzhNICsgU1pfNE0gKyBTWl8yTSkKIAogLyoKICAqIFNwYXJzZW1lbSBzdXBwb3J0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3BtLWNvcmUuaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCmluZGV4IDNlMjIxMDkuLmViYThhZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcG0tY29yZS5oCkBAIC00Myw0ICs0Myw0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2NfcG1fcmVzdG9yZWRfZ3Bpb3Modm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgczNjX3BtX3NhdmVkX2dwaW9zKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfcG1fc2F2ZWRfZ3Bpb3Modm9pZCkgeyB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhOWYxYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIFM1UFYyMTAgLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1BXTUNMS19ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUFdNQ0xLX0ggX19GSUxFX18KLQotLyoqCi0gKiBwd21fY2ZnX3NyY19pc190Y2xrKCkgLSByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbXV4IGNvbmZpZyBpcyBhIHRjbGsKLSAqIEB0Y2ZnOiBUaGUgdGltZXIgVENGRzEgcmVnaXN0ZXIgYml0cyBzaGlmdGVkIGRvd24gdG8gMC4KLSAqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmcm9tIFRDRkcxIGlzIGEgVENMSyBpbnN0ZWFkCi0gKiBhbnkgb2YgdGhlIFRESVYgY2xvY2tzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBwd21fY2ZnX3NyY19pc190Y2xrKHVuc2lnbmVkIGxvbmcgdGNmZykKLXsKLQlyZXR1cm4gdGNmZyA9PSBTM0M2NFhYX1RDRkcxX01VWF9UQ0xLOwotfQotCi0vKioKLSAqIHRjZmdfdG9fZGl2aXNvcigpIC0gY29udmVydCB0Y2ZnMSBzZXR0aW5nIHRvIGEgZGl2aXNvcgotICogQHRjZmcxOiBUaGUgdGNmZzEgc2V0dGluZywgc2hpZnRlZCBkb3duLgotICoKLSAqIEdldCB0aGUgZGl2aXNvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRjZmcxIHNldHRpbmcuIFdlIGFzc3VtZSB0aGUKLSAqIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRvIHNlZSBpZiB0aGlzIGlzIG5vdCBhIFRDTEsgc291cmNlLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGNmZ190b19kaXZpc29yKHVuc2lnbmVkIGxvbmcgdGNmZzEpCi17Ci0JcmV0dXJuIDEgPDwgdGNmZzE7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfaGFzX2RpdjEoKSAtIGRvZXMgdGhlIHRkaXYgc2V0dGluZyBoYXZlIGEgLzEKLSAqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGEgLzEgaW4gdGhlIHRkaXYgc2V0dGluZy4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcHdtX3RkaXZfaGFzX2RpdjEodm9pZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9kaXZfYml0cygpIC0gY2FsY3VsYXRlIFRDRkcxIGRpdmlzb3IgdmFsdWUuCi0gKiBAZGl2OiBUaGUgZGl2aXNvciB0byBjYWxjdWxhdGUgdGhlIGJpdCBpbmZvcm1hdGlvbiBmb3IuCi0gKgotICogVHVybiBhIGRpdmlzb3IgaW50byB0aGUgbmVjZXNzYXJ5IGJpdCBmaWVsZCBmb3IgVENGRzEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwd21fdGRpdl9kaXZfYml0cyh1bnNpZ25lZCBpbnQgZGl2KQotewotCXJldHVybiBpbG9nMihkaXYpOwotfQotCi0jZGVmaW5lIFMzQ19UQ0ZHMV9NVVhfVENMSyBTM0M2NFhYX1RDRkcxX01VWF9UQ0xLCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1BXTUNMS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvaW5jbHVkZS9tYWNoL3JlZ3MtY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCmluZGV4IDc4OTI1YzUuLjAzMmRlNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9pbmNsdWRlL21hY2gvcmVncy1jbG9jay5oCkBAIC0xNDQsOCArMTQ0LDkgQEAKIAogI2RlZmluZSBTNVBfT1RIRVJTCQlTNVBfQ0xLUkVHKDB4RTAwMCkKICNkZWZpbmUgUzVQX09NX1NUQVQJCVM1UF9DTEtSRUcoMHhFMTAwKQorI2RlZmluZSBTNVBfSERNSV9QSFlfQ09OVFJPTAlTNVBfQ0xLUkVHKDB4RTgwNCkKICNkZWZpbmUgUzVQX1VTQl9QSFlfQ09OVFJPTAlTNVBfQ0xLUkVHKDB4RTgwQykKLSNkZWZpbmUgUzVQX0RBQ19DT05UUk9MCQlTNVBfQ0xLUkVHKDB4RTgxMCkKKyNkZWZpbmUgUzVQX0RBQ19QSFlfQ09OVFJPTAlTNVBfQ0xLUkVHKDB4RTgxMCkKICNkZWZpbmUgUzVQX01JUElfRFBIWV9DT05UUk9MKHgpIFM1UF9DTEtSRUcoMHhFODE0KQogI2RlZmluZSBTNVBfTUlQSV9EUEhZX0VOQUJMRQkoMSA8PCAwKQogI2RlZmluZSBTNVBfTUlQSV9EUEhZX1NSRVNFVE4JKDEgPDwgMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWFxdWlsYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKaW5kZXggNTA5NjI3Zi4uNTgxMWE5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtYXF1aWxhLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCS8qIE1haW50YWluZXJzOgogCSAgIE1hcmVrIFN6eXByb3dza2kgPG0uc3p5cHJvd3NraUBzYW1zdW5nLmNvbT4KIAkgICBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHM1cHYyMTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBhcXVpbGFfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBhcXVpbGFfbWFjaGluZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtZ29uaS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtZ29uaS5jCmluZGV4IDg1YzJkNTEuLjE1ZWRjYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLWdvbmkuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1nb25pLmMKQEAgLTQ4LDYgKzQ4LDExIEBACiAjaW5jbHVkZSA8cGxhdC9zNXAtdGltZS5oPgogI2luY2x1ZGUgPHBsYXQvbWZjLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CisjaW5jbHVkZSA8cGxhdC9jYW1wb3J0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvczVwX2ZpbWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9ub29uMDEwcGMzMC5oPgogCiAvKiBGb2xsb3dpbmcgYXJlIGRlZmF1bHQgdmFsdWVzIGZvciBVQ09OLCBVTENPTiBhbmQgVUZDT04gVUFSVCByZWdpc3RlcnMgKi8KICNkZWZpbmUgR09OSV9VQ09OX0RFRkFVTFQJKFMzQzI0MTBfVUNPTl9UWElMRVZFTCB8CVwKQEAgLTI3Miw2ICsyNzcsMTQgQEAKIAlpMmMyX2RldnNbMF0uaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CiB9CiAKK3N0YXRpYyB2b2lkIGdvbmlfY2FtZXJhX2luaXQodm9pZCkKK3sKKwlzNXB2MjEwX2ZpbWNfc2V0dXBfZ3BpbyhTNVBfQ0FNUE9SVF9BKTsKKworCS8qIFNldCBtYXggZHJpdmVyIHN0cmVuZ3RoIG9uIENBTV9BX0NMS09VVCBwaW4uICovCisJczVwX2dwaW9fc2V0X2RydnN0cihTNVBWMjEwX0dQRTEoMyksIFM1UF9HUElPX0RSVlNUUl9MVjQpOworfQorCiAvKiBNQVg4OTk4IHJlZ3VsYXRvcnMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfTUFYODk5OCkgfHwgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SX01BWDg5OThfTU9EVUxFKQogCkBAIC0yODUsNiArMjk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGdvbmlfbGRvOF9jb25zdW1lcnNbXSA9IHsKIAlSRUdVTEFUT1JfU1VQUExZKCJ2dXNiX2QiLCAiczNjLWhzb3RnIiksCisJUkVHVUxBVE9SX1NVUFBMWSgidmRkMzNhX2RhYyIsICJzNXAtc2RvIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZ29uaV9sZG8xMV9jb25zdW1lcnNbXSA9IHsKQEAgLTQ3NSw2ICs0ODksMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBidWNrMl9jb25zdW1lciA9CiAJUkVHVUxBVE9SX1NVUFBMWSgidmRkaW50IiwgTlVMTCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBidWNrM19jb25zdW1lciA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRldCIsICJzNXAtc2RvIik7CisKKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGdvbmlfYnVjazFfZGF0YSA9IHsKIAkuY29uc3RyYWludHMJPSB7CiAJCS5uYW1lCQk9ICJWQVJNXzEuMlYiLApAQCAtNTExLDYgKzUyOSw4IEBACiAJCQkuZW5hYmxlZCA9IDEsCiAJCX0sCiAJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmYnVjazNfY29uc3VtZXIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZ29uaV9idWNrNF9kYXRhID0gewpAQCAtODAxLDYgKzgyMSwzNCBAQAogCXMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKCZnb25pX2hzbW1jMl9kYXRhKTsKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgbm9vbjAxMHBjMzBfcGxhdGZvcm1fZGF0YSBub29uMDEwcGMzMF9wbGRhdGEgPSB7CisJLmNsa19yYXRlCT0gMTYwMDAwMDBVTCwKKwkuZ3Bpb19ucmVzZXQJPSBTNVBWMjEwX0dQQigyKSwgLyogQ0FNX0NJRl9OUlNUICovCisJLmdwaW9fbnN0YnkJPSBTNVBWMjEwX0dQQigwKSwgLyogQ0FNX0NJRl9OU1RCWSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBub29uMDEwcGMzMF9ib2FyZF9pbmZvID0geworCUkyQ19CT0FSRF9JTkZPKCJOT09OMDEwUEMzMCIsIDB4NjAgPj4gMSksCisJLnBsYXRmb3JtX2RhdGEgPSAmbm9vbjAxMHBjMzBfcGxkYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyBnb25pX2NhbWVyYV9zZW5zb3JzW10gPSB7CisJeworCQkubXV4X2lkCQk9IDAsCisJCS5mbGFncwkJPSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8CisJCQkJICBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVywKKwkJLmJ1c190eXBlCT0gRklNQ19JVFVfNjAxLAorCQkuYm9hcmRfaW5mbwk9ICZub29uMDEwcGMzMF9ib2FyZF9pbmZvLAorCQkuaTJjX2J1c19udW0JPSAwLAorCQkuY2xrX2ZyZXF1ZW5jeQk9IDE2MDAwMDAwVUwsCisJfSwKK307CisKK3N0cnVjdCBzNXBfcGxhdGZvcm1fZmltYyBnb25pX2ZpbWNfbWRfcGxhdGRhdGEgX19pbml0ZGF0YSA9IHsKKwkuaXNwX2luZm8JPSBnb25pX2NhbWVyYV9zZW5zb3JzLAorCS5udW1fY2xpZW50cwk9IEFSUkFZX1NJWkUoZ29uaV9jYW1lcmFfc2Vuc29ycyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ29uaV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV9mYiwKIAkmczVwX2RldmljZV9vbmVuYW5kLApAQCAtODEyLDEwICs4NjAsMTMgQEAKIAkmczVwX2RldmljZV9tZmMsCiAJJnM1cF9kZXZpY2VfbWZjX2wsCiAJJnM1cF9kZXZpY2VfbWZjX3IsCisJJnM1cF9kZXZpY2VfbWl4ZXIsCisJJnM1cF9kZXZpY2Vfc2RvLAogCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnM1cF9kZXZpY2VfZmltYzAsCiAJJnM1cF9kZXZpY2VfZmltYzEsCiAJJnM1cF9kZXZpY2VfZmltYzIsCisJJnM1cF9kZXZpY2VfZmltY19tZCwKIAkmczNjX2RldmljZV9oc21tYzAsCiAJJnMzY19kZXZpY2VfaHNtbWMxLAogCSZzM2NfZGV2aWNlX2hzbW1jMiwKQEAgLTg4NCw2ICs5MzUsMTIgQEAKIAkvKiBGQiAqLwogCXMzY19mYl9zZXRfcGxhdGRhdGEoJmdvbmlfbGNkX3BkYXRhKTsKIAorCS8qIEZJTUMgKi8KKwlzM2Nfc2V0X3BsYXRkYXRhKCZnb25pX2ZpbWNfbWRfcGxhdGRhdGEsIHNpemVvZihnb25pX2ZpbWNfbWRfcGxhdGRhdGEpLAorCQkJICZzNXBfZGV2aWNlX2ZpbWNfbWQpOworCisJZ29uaV9jYW1lcmFfaW5pdCgpOworCiAJLyogU1BJICovCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpX2JvYXJkX2luZm8pKTsKIApAQCAtODk3LDcgKzk1NCw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoR09OSSwgIkdPTkkiKQogCS8qIE1haW50YWluZXJzOiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPiAqLwotCS5ib290X3BhcmFtcwk9IFM1UF9QQV9TRFJBTSArIDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5pbml0X2lycQk9IHM1cHYyMTBfaW5pdF9pcnEsCiAJLm1hcF9pbwkJPSBnb25pX21hcF9pbywKIAkuaW5pdF9tYWNoaW5lCT0gZ29uaV9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrYzExMC5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka2MxMTAuYwppbmRleCA2YzQxMmM4Li5mNzI2NmJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrYzExMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGtjMTEwLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREtDMTEwLCAiU01ES0MxMTAiKQogCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXB2MjEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21ka2MxMTBfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBzbWRrYzExMF9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYwppbmRleCA1ZTAxMWZjLi5hOTEwNmMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGt2MjEwLmMKQEAgLTI2NSwxMiArMjY1LDYgQEAKIAkvKiBUbyBCZSBVcGRhdGVkICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvIHMzY190c19wbGF0Zm9ybSBfX2luaXRkYXRhID0gewotCS5kZWxheQkJCT0gMTAwMDAsCi0JLnByZXNjCQkJPSA0OSwKLQkub3ZlcnNhbXBsaW5nX3NoaWZ0CT0gMiwKLX07Ci0KIC8qIExDRCBCYWNrbGlnaHQgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBzYW1zdW5nX2JsX2dwaW9faW5mbyBzbWRrdjIxMF9ibF9ncGlvX2luZm8gPSB7CiAJLm5vID0gUzVQVjIxMF9HUEQwKDMpLApAQCAtMjk2LDcgKzI5MCw3IEBACiAJc21ka3YyMTBfZG05MDAwX2luaXQoKTsKIAogCXNhbXN1bmdfa2V5cGFkX3NldF9wbGF0ZGF0YSgmc21ka3YyMTBfa2V5cGFkX2RhdGEpOwotCXMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKCZzM2NfdHNfcGxhdGZvcm0pOworCXMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKE5VTEwpOwogCiAJczNjX2kyYzBfc2V0X3BsYXRkYXRhKE5VTEwpOwogCXMzY19pMmMxX3NldF9wbGF0ZGF0YShOVUxMKTsKQEAgLTMxOSw3ICszMTMsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNNREtWMjEwLCAiU01ES1YyMTAiKQogCS8qIE1haW50YWluZXI6IEt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXB2MjEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21ka3YyMTBfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSBzbWRrdjIxMF9tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC10b3JicmVjay5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtdG9yYnJlY2suYwppbmRleCA5MjVmYzBkLi45N2NjMDY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC10b3JicmVjay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXRvcmJyZWNrLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiBNQUNISU5FX1NUQVJUKFRPUkJSRUNLLCAiVE9SQlJFQ0siKQogCS8qIE1haW50YWluZXI6IEh5dW5jaHVsIEtvIDxnaGNzdG9wQGdtYWlsLmNvbT4gKi8KLQkuYm9vdF9wYXJhbXMJPSBTNVBfUEFfU0RSQU0gKyAweDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuaW5pdF9pcnEJPSBzNXB2MjEwX2luaXRfaXJxLAogCS5tYXBfaW8JCT0gdG9yYnJlY2tfbWFwX2lvLAogCS5pbml0X21hY2hpbmUJPSB0b3JicmVja19tYWNoaW5lX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2V0dXAtc2RoY2kuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1zZGhjaS5jCmluZGV4IGE4M2I2YzkuLjZiOGNjYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1zZGhjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zZXR1cC1zZGhjaS5jCkBAIC0xMCwxNyArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogCiAvKiBjbG9jayBzb3VyY2VzIGZvciB0aGUgbW1jIGJ1cyBjbG9jaywgb3JkZXIgYXMgZm9yIHRoZSBjdHJsMls1Li40XSAqLwogCkBAIC0zMCwzNCArMjAsMyBAQAogCVsyXSA9ICJzY2xrX21tYyIsCS8qIG1tY19idXMgKi8KIAkvKiBbM10gPSBOVUxMLAkJLSByZXNlcnZlZCAqLwogfTsKLQotdm9pZCBzNXB2MjEwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCSAgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCSAgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGN0cmwyLCBjdHJsMzsKLQotCS8qIGRvbid0IG5lZWQgdG8gYWx0ZXIgYW55dGhpbmcgYWNjb3JkaW5nIHRvIGNhcmQtdHlwZSAqLwotCi0Jd3JpdGVsKFMzQzY0WFhfU0RIQ0lfQ09OVFJPTDRfRFJJVkVfOW1BLCByICsgUzNDNjRYWF9TREhDSV9DT05UUk9MNCk7Ci0KLQljdHJsMiA9IHJlYWRsKHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDIpOwotCWN0cmwyICY9IFMzQ19TREhDSV9DVFJMMl9TRUxCQVNFQ0xLX01BU0s7Ci0JY3RybDIgfD0gKFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5TVEFBU1lOQ0NMUiB8Ci0JCSAgUzNDNjRYWF9TREhDSV9DVFJMMl9FTkNNRENORk1TSyB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0VORkJDTEtSWCB8Ci0JCSAgUzNDX1NESENJX0NUUkwyX0RGQ05UX05PTkUgfAotCQkgIFMzQ19TREhDSV9DVFJMMl9FTkNMS09VVEhPTEQpOwotCi0JaWYgKGlvcy0+Y2xvY2sgPCAyNSAqIDEwMDAwMDApCi0JCWN0cmwzID0gKFMzQ19TREhDSV9DVFJMM19GQ1NFTDMgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDIgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDEgfAotCQkJIFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCWVsc2UKLQkJY3RybDMgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOwotCi0Jd3JpdGVsKGN0cmwyLCByICsgUzNDX1NESENJX0NPTlRST0wyKTsKLQl3cml0ZWwoY3RybDMsIHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2xlZXAuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NTJjYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2xlZXAuUworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL3NsZWVwLlMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogUzVQVjIxMCBwb3dlciBNYW5hZ2VyIChTdXNwZW5kLVRvLVJBTSkgc3VwcG9ydAotICogQmFzZWQgb24gUzNDMjQxMCBzbGVlcCBjb2RlIGJ5OgotICogCUJlbiBEb29rcywgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKgotICogQmFzZWQgb24gUFhBL1NBMTEwMCBzbGVlcCBjb2RlIGJ5OgotICoJTmljb2xhcyBQaXRyZSwgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUgSW5jCi0gKglDbGlmZiBCcmFrZSwgKGMpIDIwMDEKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+Ci0KLQkudGV4dAotCi0JLyogc2xlZXAgbWFnaWMsIHRvIGFsbG93IHRoZSBib290bG9hZGVyIHRvIGNoZWNrIGZvciBhbiB2YWxpZAotCSAqIGltYWdlIHRvIHJlc3VtZSB0by4gTXVzdCBiZSB0aGUgZmlyc3Qgd29yZCBiZWZvcmUgdGhlCi0JICogczNjX2NwdV9yZXN1bWUgZW50cnkuCi0JKi8KLQotCS53b3JkCTB4MmJlZGYwMGQKLQotCS8qIHMzY19jcHVfcmVzdW1lCi0JICoKLQkgKiByZXN1bWUgY29kZSBlbnRyeSBmb3IgYm9vdGxvYWRlciB0byBjYWxsCi0JICoKLQkgKiB3ZSBtdXN0IHB1dCB0aGlzIGNvZGUgaGVyZSBpbiB0aGUgZGF0YSBzZWdtZW50IGFzIHdlIGhhdmUgbm8KLQkgKiBvdGhlciB3YXkgb2YgcmVzdG9yaW5nIHRoZSBzdGFjayBwb2ludGVyIGFmdGVyIHNsZWVwLCBhbmQgd2UKLQkgKiBtdXN0IG5vdCB3cml0ZSB0byB0aGUgY29kZSBzZWdtZW50IChjb2RlIGlzIHJlYWQtb25seSkKLQkqLwotCi1FTlRSWShzM2NfY3B1X3Jlc3VtZSkKLQliCWNwdV9yZXN1bWUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKaW5kZXggMDA2MzE3OC4uZWQ3NDA4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjCiAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNsb2NrLm8gZ2VuZXJpYy5vIGdwaW8ubyBpcnEubyBkbWEubyB0aW1lLm8gI25taS1vb3BzZXIubworb2JqLXkgOj0gY2xvY2subyBnZW5lcmljLm8gaXJxLm8gZG1hLm8gdGltZS5vICNubWktb29wc2VyLm8KIG9iai1tIDo9CiBvYmotbiA6PQogb2JqLSAgOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwppbmRleCA2MjkwY2UyLi4zZGQxMzNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAogCiBNQUNISU5FX1NUQVJUKEFTU0FCRVQsICJJbnRlbC1Bc3NhYmV0IikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSBmaXh1cF9hc3NhYmV0LAogCS5tYXBfaW8JCT0gYXNzYWJldF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvYmFkZ2U0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwppbmRleCBiNDMxMWIwLi5iZGE4M2UxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYwpAQCAtMzAyLDcgKzMwMiw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQkFER0U0LCAiSGV3bGV0dC1QYWNrYXJkIExhYm9yYXRvcmllcyBCYWRnZVBBRCA0IikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gYmFkZ2U0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCmluZGV4IGJkM2UxYmYuLjI5NjVjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NvbGxpZS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8bWFjaC9jb2xsaWUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCmluZGV4IGUyMWYzNDcuLjVmYTVhZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKQEAgLTksNiArOSw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjQsNyArMjUsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzODI5YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ3Bpby5jCi0gKgotICogR2VuZXJpYyBTQS0xMTAwIEdQSU8gaGFuZGxpbmcKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlICJnZW5lcmljLmgiCi0KLXN0YXRpYyBpbnQgc2ExMTAwX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gR1BMUiAmIEdQSU9fR1BJTyhvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBzYTExMDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlKQotCQlHUFNSID0gR1BJT19HUElPKG9mZnNldCk7Ci0JZWxzZQotCQlHUENSID0gR1BJT19HUElPKG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2ExMTAwX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlHUERSICY9IH5HUElPX0dQSU8ob2Zmc2V0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2ExMTAwX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzYTExMDBfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Ci0JR1BEUiB8PSBHUElPX0dQSU8ob2Zmc2V0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHNhMTEwMF9ncGlvX2NoaXAgPSB7Ci0JLmxhYmVsCQkJPSAiZ3BpbyIsCi0JLmRpcmVjdGlvbl9pbnB1dAk9IHNhMTEwMF9kaXJlY3Rpb25faW5wdXQsCi0JLmRpcmVjdGlvbl9vdXRwdXQJPSBzYTExMDBfZGlyZWN0aW9uX291dHB1dCwKLQkuc2V0CQkJPSBzYTExMDBfZ3Bpb19zZXQsCi0JLmdldAkJCT0gc2ExMTAwX2dwaW9fZ2V0LAotCS5iYXNlCQkJPSAwLAotCS5uZ3BpbwkJCT0gR1BJT19NQVggKyAxLAotfTsKLQotdm9pZCBfX2luaXQgc2ExMTAwX2luaXRfZ3Bpbyh2b2lkKQotewotCWdwaW9jaGlwX2FkZCgmc2ExMTAwX2dwaW9fY2hpcCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzEwMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDMxMDAuYwppbmRleCAwM2Q3Mzc2Li5iMzA3MzNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzMTAwLmMKQEAgLTg0LDcgKzg0LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMzEwMCwgIkNvbXBhcSBpUEFRIEgzMTAwIikKLQkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gaDMxMDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCmluZGV4IDk2NWY2NGEuLjZmZDMyNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDM2MDAsICJDb21wYXEgaVBBUSBIMzYwMCIpCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGgzNjAwX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKaW5kZXggZGI1ZTQzNC4uMzBmNGE1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAgKi8KIAogTUFDSElORV9TVEFSVChIQUNLS0lULCAiSGFja0tpdCBDcHUgQm9hcmQiKQotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBoYWNra2l0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDBjZDBmYzkuLjUzMDc3MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMiw3ICsxMiw3IEBACiAqLwogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1yYwlwMTUsIDAsIFxycCwgYzEsIGMwCiAJCXRzdAlccnAsICMxCQkJQCBNTVUgZW5hYmxlZD8KIAkJbW92ZXEJXHJwLCAjMHg4MDAwMDAwMAlAIHBoeXNpY2FsIGJhc2UgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggN2JlZmMxMC4uNzAzNjMxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAorI2RlZmluZSBfX0FSTV9HUElPTElCX0NPTVBMRVgKKwogc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoZ3BpbykgJiYgKGdwaW8gPD0gR1BJT19NQVgpKQpAQCAtNTEsNyArNTMsNSBAQAogCiAjZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCSgoZ3BpbyA8IDExKSA/IChJUlFfR1BJTzAgKyBncGlvKSA6IFwKIAkJCQkJKElSUV9HUElPMTEgLSAxMSArIGdwaW8pKQotI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxIDwgSVJRX0dQSU8xMV8yNykgPyAoaXJxIC0gSVJRX0dQSU8wKSA6IFwKLQkJCQkJKGlycSAtIElSUV9HUElPMTEgKyAxMSkpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCmluZGV4IDE3NmMwNjYuLjc3MTk4ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzY0LDcgKzM2NSw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoSk9STkFEQTcyMCwgIkhQIEpvcm5hZGEgNzIwIikKIAkvKiBNYWludGFpbmVyOiBLcmlzdG9mZmVyIEVyaWNzb24gPEtyaXN0b2ZmZXIuRXJpY3NvbkBnbWFpbC5jb20+ICovCi0JLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IGpvcm5hZGE3MjBfbWFwX2lvLAogCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYwppbmRleCA3Yjk1NTZiLi41YmM1OWQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTEFSVCwgIkxBUlQiKQotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBsYXJ0X21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGxhcnRfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL25hbm9lbmdpbmUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL25hbm9lbmdpbmUuYwppbmRleCA3MjA4N2YwLi4wMzJmMzg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9uYW5vZW5naW5lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmFub2VuZ2luZS5jCkBAIC0xMTEsNyArMTExLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChOQU5PRU5HSU5FLCAiQlNFIG5hbm9FbmdpbmUiKQotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAwMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBuYW5vZW5naW5lX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKaW5kZXggNzkxN2IyNC4uMWNjY2JmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYwpAQCAtODIsNyArODIsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFNIQU5OT04sICJTaGFubm9uIChBS0E6IFR1eHNjcmVlbikiKQotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBzaGFubm9uX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCmluZGV4IDM0NjU5ZjMuLjQ3OTBmM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NpbXBhZC5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAogTUFDSElORV9TVEFSVChTSU1QQUQsICJTaW1wYWQiKQogCS8qIE1haW50YWluZXI6IEhvbGdlciBGcmV5dGhlciAqLwotCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSBzaW1wYWRfbWFwX2lvLAogCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggYWMyODczYy4uZmVkYTNjYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiBNQUNISU5FX1NUQVJUKFNIQVJLLCAiU2hhcmsiKQogCS8qIE1haW50YWluZXI6IEFsZXhhbmRlciBTY2h1bHogKi8KLQkuYm9vdF9wYXJhbXMJPSAweDA4MDAzMDAwLAorCS5hdGFnX29mZnNldAk9IDB4MzAwMCwKIAkubWFwX2lvCQk9IHNoYXJrX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzaGFya19pbml0X2lycSwKIAkudGltZXIJCT0gJnNoYXJrX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYTQ3M2Y1NS4uMjBlYjJiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICMweGUwMDAwMDAwCiAJCW9ycglccnAsIFxycCwgIzB4MDAwMDAzZjgKIAkJbW92CVxydiwgXHJwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKaW5kZXggMGM4ZjZjZi4uMDgyOGZhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQAogCXNlbGVjdCBTSF9DTEtfQ1BHCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IEFSTV9HSUMKKwlzZWxlY3QgSTJDCiAKIGNvbW1lbnQgIlNILU1vYmlsZSBCb2FyZCBUeXBlIgogCkBAIC02OSw2ICs3MCwxMSBAQAogCWRlcGVuZHMgb24gQVJDSF9TSDczNzIKIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAorY29uZmlnIE1BQ0hfS09UQTIKKwlib29sICJLT1RBMiBib2FyZCIKKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlkZXBlbmRzIG9uIEFSQ0hfU0g3M0EwCisKIGNvbW1lbnQgIlNILU1vYmlsZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiIKIAogbWVudSAiTWVtb3J5IGNvbmZpZ3VyYXRpb24iCkBAIC03OCw2ICs4NCw3IEBACiAJZGVmYXVsdCAiMHg1MDAwMDAwMCIgaWYgTUFDSF9HM0VWTQogCWRlZmF1bHQgIjB4NDAwMDAwMDAiIGlmIE1BQ0hfRzRFVk0gfHwgTUFDSF9BUDRFVkIgfHwgTUFDSF9BRzVFVk0gfHwgXAogCQkJCU1BQ0hfTUFDS0VSRUwKKwlkZWZhdWx0ICIweDQxMDAwMDAwIiBpZiBNQUNIX0tPVEEyCiAJZGVmYXVsdCAiMHgwMDAwMDAwMCIKIAktLS1oZWxwLS0tCiAJICBUd2VhayB0aGlzIG9ubHkgd2hlbiBwb3J0aW5nIHRvIGEgbmV3IG1hY2hpbmUgd2hpY2ggZG9lcyBub3QKQEAgLTg5LDYgKzk2LDcgQEAKIAlkZWZhdWx0ICIweDA4MDAwMDAwIiBpZiBNQUNIX0czRVZNCiAJZGVmYXVsdCAiMHgwODAwMDAwMCIgaWYgTUFDSF9HNEVWTQogCWRlZmF1bHQgIjB4MjAwMDAwMDAiIGlmIE1BQ0hfQUc1RVZNCisJZGVmYXVsdCAiMHgxZTAwMDAwMCIgaWYgTUFDSF9LT1RBMgogCWRlZmF1bHQgIjB4MTAwMDAwMDAiIGlmIE1BQ0hfQVA0RVZCIHx8IE1BQ0hfTUFDS0VSRUwKIAlkZWZhdWx0ICIweDA0MDAwMDAwIgogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL01ha2VmaWxlCmluZGV4IDYxMmIyNzAuLjczN2JkYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogIyBDb21tb24gb2JqZWN0cwotb2JqLXkJCQkJOj0gdGltZXIubyBjb25zb2xlLm8gY2xvY2subyBwbV9ydW50aW1lLm8KK29iai15CQkJCTo9IHRpbWVyLm8gY29uc29sZS5vIGNsb2NrLm8KIAogIyBDUFUgb2JqZWN0cwogb2JqLSQoQ09ORklHX0FSQ0hfU0g3MzY3KQkrPSBzZXR1cC1zaDczNjcubyBjbG9jay1zaDczNjcubyBpbnRjLXNoNzM2Ny5vCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfTUFDSF9BUDRFVkIpCSs9IGJvYXJkLWFwNGV2Yi5vCiBvYmotJChDT05GSUdfTUFDSF9BRzVFVk0pCSs9IGJvYXJkLWFnNWV2bS5vCiBvYmotJChDT05GSUdfTUFDSF9NQUNLRVJFTCkJKz0gYm9hcmQtbWFja2VyZWwubworb2JqLSQoQ09ORklHX01BQ0hfS09UQTIpCSs9IGJvYXJkLWtvdGEyLm8KIAogIyBGcmFtZXdvcmsgc3VwcG9ydAogb2JqLSQoQ09ORklHX1NNUCkJCSs9ICQoc21wLXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYwppbmRleCBjZGZkZDYyLi5iODYyZTlmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8dmlkZW8vc2hfbW9iaWxlX2xjZGMuaD4KICNpbmNsdWRlIDx2aWRlby9zaF9taXBpX2RzaS5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgpAQCAtNTgsNyArNTksNyBAQAogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydAkJPSBnaWNfc3BpKDMzKSwgLyogUElOVDEgKi8KKwkJLnN0YXJ0CQk9IFNINzNBMF9QSU5UMF9JUlEoMiksIC8qIFBJTlRBMiAqLwogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CkBAIC0zMzgsNiArMzM5LDE4IEBACiAJfSwKIH07CiAKKy8qIFNESEkwICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWc1ZXZtX3NkaGkwX2dwaW9fY2QoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFyZzsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyAqaW5mbyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBpbmZvLT5wZGF0YTsKKworCXRtaW9fbW1jX2NkX3dha2V1cChwZGF0YSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMF9pbmZvID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTBfUlgsCkBAIC0zNTQsMTQgKzM2NywxNyBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfQ0FSRF9ERVRFQ1QsCiAJCS5zdGFydAk9IGdpY19zcGkoODMpLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVsyXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfU0RDQVJELAogCQkuc3RhcnQJPSBnaWNfc3BpKDg0KSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbM10gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NESU8sCiAJCS5zdGFydAk9IGdpY19zcGkoODUpLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LApAQCAtMzk3LDE0ICs0MTMsMTcgQEAKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNULAogCQkuc3RhcnQJPSBnaWNfc3BpKDg3KSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbMl0gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRCwKIAkJLnN0YXJ0CT0gZ2ljX3NwaSg4OCksCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzNdID0geworCQkubmFtZQk9IFNIX01PQklMRV9TREhJX0lSUV9TRElPLAogCQkuc3RhcnQJPSBnaWNfc3BpKDg5KSwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKQEAgLTQ0NywyNSArNDY2LDE0IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgYWc1ZXZtX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChhZzVldm1faW9fZGVzYywgQVJSQVlfU0laRShhZzVldm1faW9fZGVzYykpOworCS8qIERNQSBtZW1vcnkgYXQgMHhmNjAwMDAwMCAtIDB4ZmZkZmZmZmYgKi8KKwlpbml0X2NvbnNpc3RlbnRfZG1hX3NpemUoMTU4IDw8IDIwKTsKIAogCS8qIHNldHVwIGVhcmx5IGRldmljZXMgYW5kIGNvbnNvbGUgaGVyZSBhcyB3ZWxsICovCiAJc2g3M2EwX2FkZF9lYXJseV9kZXZpY2VzKCk7CiAJc2htb2JpbGVfc2V0dXBfY29uc29sZSgpOwogfQogCi0jZGVmaW5lIFBJTlRDX0FERFIJMHhlNjkwMDAwMAotI2RlZmluZSBQSU5URVIwQQkoUElOVENfQUREUiArIDB4YTApCi0jZGVmaW5lIFBJTlRDUjBBCShQSU5UQ19BRERSICsgMHhiMCkKLQotdm9pZCBfX2luaXQgYWc1ZXZtX2luaXRfaXJxKHZvaWQpCi17Ci0Jc2g3M2EwX2luaXRfaXJxKCk7Ci0KLQkvKiBzZXR1cCBQSU5UOiBlbmFibGUgUElOVEEyIGFzIGFjdGl2ZSBsb3cgKi8KLQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoUElOVEVSMEEpIHwgKDE8PDI5KSwgUElOVEVSMEEpOwotCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhQSU5UQ1IwQSkgfCAoMjw8MTApLCBQSU5UQ1IwQSk7Ci19Ci0KICNkZWZpbmUgRFNJMFBIWUNSCTB4ZTYxNTAwNmMKIAogc3RhdGljIHZvaWQgX19pbml0IGFnNWV2bV9pbml0KHZvaWQpCkBAIC01MDcsMTQgKzUxNSwxNCBAQAogCS8qIGVuYWJsZSBNTUNJRiAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0NMSzAsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0NNRDBfUFUsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzAsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzEsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzIsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzMsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzQsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzUsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzYsIE5VTEwpOwotCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzcsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzBfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzFfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzJfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzNfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzRfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzVfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzZfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzdfUFUsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX1BPUlQyMDgsIE5VTEwpOyAvKiBSZXNldCAqLwogCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BPUlQyMDgsIDEpOwogCkBAIC01NjEsNiArNTY5LDEzIEBACiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQwXzEsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8wLCBOVUxMKTsKIAorCWlmICghcmVxdWVzdF9pcnEoaW50Y3NfZXZ0MmlycSgweDNjMCksIGFnNWV2bV9zZGhpMF9ncGlvX2NkLAorCQkJIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSAic2RoaTAgY2QiLCAmc2RoaTBfZGV2aWNlLmRldikpCisJCXNkaGkwX2luZm8udG1pb19mbGFncyB8PSBUTUlPX01NQ19IQVNfQ09MRF9DRDsKKwllbHNlCisJCXByX3dhcm4oIlVuYWJsZSB0byBzZXR1cCBTREhJMCBHUElPIElSUVxuIik7CisKIAkvKiBlbmFibGUgU0RISTEgb24gQ040IFtXTEFOIEkvRl0gKi8KIAlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJQ0xLMSwgTlVMTCk7CiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNNRDFfUFUsIE5VTEwpOwpAQCAtNTkyLDcgKzYwNyw3IEBACiAKIE1BQ0hJTkVfU1RBUlQoQUc1RVZNLCAiYWc1ZXZtIikKIAkubWFwX2lvCQk9IGFnNWV2bV9tYXBfaW8sCi0JLmluaXRfaXJxCT0gYWc1ZXZtX2luaXRfaXJxLAorCS5pbml0X2lycQk9IHNoNzNhMF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHNobW9iaWxlX2hhbmRsZV9pcnFfZ2ljLAogCS5pbml0X21hY2hpbmUJPSBhZzVldm1faW5pdCwKIAkudGltZXIJCT0gJmFnNWV2bV90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCmluZGV4IDdlOTBkMDYuLjRjODY1ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3I4YTY2NTk3Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jc2kyLmg+CkBAIC0xOTksOCArMjAwLDggQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBub3JfZmxhc2hfcmVzb3VyY2VzW10gPSB7CiAJWzBdCT0gewotCQkuc3RhcnQJPSAweDAwMDAwMDAwLAotCQkuZW5kCT0gMHgwODAwMDAwMCAtIDEsCisJCS5zdGFydAk9IDB4MjAwMDAwMDAsIC8qIENTMCBzaGFkb3cgaW5zdGVhZCBvZiByZWd1bGFyIENTMCAqLworCQkuZW5kCT0gMHgyODAwMDAwMCAtIDEsIC8qIG5lZWRlZCBieSBVU0IgTUFTSyBST00gYm9vdCAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9CiB9OwpAQCAtOTMyLDcgKzkzMyw3IEBACiBzdGF0aWMgc3RydWN0IHNoX2NzaTJfY2xpZW50X2NvbmZpZyBjc2kyX2NsaWVudHNbXSA9IHsKIAl7CiAJCS5waHkJCT0gU0hfQ1NJMl9QSFlfTUFJTiwKLQkJLmxhbmVzCQk9IDMsCisJCS5sYW5lcwkJPSAwLAkJLyogZGVmYXVsdDogMiBsYW5lcyAqLwogCQkuY2hhbm5lbAk9IDAsCiAJCS5wZGV2CQk9ICZhcDRldmJfY2FtZXJhLAogCX0sCkBAIC0xMTcxLDYgKzExNzIsOCBAQAogc3RhdGljIHZvaWQgX19pbml0IGFwNGV2Yl9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQoYXA0ZXZiX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXA0ZXZiX2lvX2Rlc2MpKTsKKwkvKiBETUEgbWVtb3J5IGF0IDB4ZjYwMDAwMDAgLSAweGZmZGZmZmZmICovCisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKDE1OCA8PCAyMCk7CiAKIAkvKiBzZXR1cCBlYXJseSBkZXZpY2VzIGFuZCBjb25zb2xlIGhlcmUgYXMgd2VsbCAqLwogCXNoNzM3Ml9hZGRfZWFybHlfZGV2aWNlcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nM2V2bS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nM2V2bS5jCmluZGV4IGVmNDYxM2IuLjhiNjIwYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzNldm0uYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWczZXZtLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWFjaC9zaDczNjcuaD4KICNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0yNjAsNiArMjYxLDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBnM2V2bV9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQoZzNldm1faW9fZGVzYywgQVJSQVlfU0laRShnM2V2bV9pb19kZXNjKSk7CisJLyogRE1BIG1lbW9yeSBhdCAweGY2MDAwMDAwIC0gMHhmZmRmZmZmZiAqLworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNTggPDwgMjApOwogCiAJLyogc2V0dXAgZWFybHkgZGV2aWNlcyBhbmQgY29uc29sZSBoZXJlIGFzIHdlbGwgKi8KIAlzaDczNjdfYWRkX2Vhcmx5X2RldmljZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzRldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzRldm0uYwppbmRleCA4ZTNjNTU1Li43NzE5ZGRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWc0ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nNGV2bS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxtYWNoL3NoNzM3Ny5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTI3NCw2ICsyNzUsOCBAQAogc3RhdGljIHZvaWQgX19pbml0IGc0ZXZtX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdChnNGV2bV9pb19kZXNjLCBBUlJBWV9TSVpFKGc0ZXZtX2lvX2Rlc2MpKTsKKwkvKiBETUEgbWVtb3J5IGF0IDB4ZjYwMDAwMDAgLSAweGZmZGZmZmZmICovCisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKDE1OCA8PCAyMCk7CiAKIAkvKiBzZXR1cCBlYXJseSBkZXZpY2VzIGFuZCBjb25zb2xlIGhlcmUgYXMgd2VsbCAqLwogCXNoNzM3N19hZGRfZWFybHlfZGV2aWNlcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rb3RhMi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rb3RhMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWE3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWtvdGEyLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBrb3RhMiBib2FyZCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDExICBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDExICBNYWdudXMgRGFtbQorICogQ29weXJpZ2h0IChDKSAyMDEwICBUYWthc2hpIFlvc2hpaSA8eW9zaGlpLnRha2FzaGkuempAcmVuZXNhcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFlvc2hpaGlybyBTaGltb2RhIDxzaGltb2RhLnlvc2hpaGlyb0ByZW5lc2FzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NoX21tY2lmLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RtaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9zaDczYTAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKworLyogU01TQyA5MjIwICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtc2M5MjIwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IDB4MTQwMDAwMDAsIC8qIENTNUEgKi8KKwkJLmVuZAkJPSAweDE0MDAwMGZmLCAvKiBBMS0+QTcgKi8KKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJCT0gZ2ljX3NwaSgzMyksIC8qIFBJTlRBMiBAIFBPUlQxNDQgKi8KKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyBzbXNjOTIyMF9wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gU01TQzkxMVhfVVNFXzMyQklULCAvKiAzMi1iaXQgU1cgb24gMTYtYml0IEhXIGJ1cyAqLworCS5waHlfaW50ZXJmYWNlCT0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSSwKKwkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9MT1csCisJLmlycV90eXBlCT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoX2RldmljZSA9IHsKKwkubmFtZQkJPSAic21zYzkxMXgiLAorCS5pZAkJPSAwLAorCS5kZXYgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzbXNjOTIyMF9wbGF0ZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHNtc2M5MjIwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21zYzkyMjBfcmVzb3VyY2VzKSwKK307CisKKy8qIEtFWVNDICovCitzdGF0aWMgc3RydWN0IHNoX2tleXNjX2luZm8ga2V5c2NfcGxhdGRhdGEgPSB7CisJLm1vZGUJCT0gU0hfS0VZU0NfTU9ERV82LAorCS5zY2FuX3RpbWluZwk9IDMsCisJLmRlbGF5CQk9IDEwMCwKKwkua2V5Y29kZXMJPSB7CisJCUtFWV9OVU1FUklDX1NUQVIsIEtFWV9OVU1FUklDXzAsIEtFWV9OVU1FUklDX1BPVU5ELAorCQkwLCAwLCAwLCAwLCAwLAorCQlLRVlfTlVNRVJJQ183LCBLRVlfTlVNRVJJQ184LCBLRVlfTlVNRVJJQ185LAorCQkwLCBLRVlfRE9XTiwgMCwgMCwgMCwKKwkJS0VZX05VTUVSSUNfNCwgS0VZX05VTUVSSUNfNSwgS0VZX05VTUVSSUNfNiwKKwkJS0VZX0xFRlQsIEtFWV9FTlRFUiwgS0VZX1JJR0hULCAwLCAwLAorCQlLRVlfTlVNRVJJQ18xLCBLRVlfTlVNRVJJQ18yLCBLRVlfTlVNRVJJQ18zLAorCQkwLCBLRVlfVVAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Uga2V5c2NfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJLRVlTQyIsCisJCS5zdGFydAk9IDB4ZTYxYjAwMDAsCisJCS5lbmQJPSAweGU2MWIwMDk4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IGdpY19zcGkoNzEpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2V5c2NfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9rZXlzYyIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGtleXNjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0ga2V5c2NfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZrZXlzY19wbGF0ZGF0YSwKKwl9LAorfTsKKworLyogR1BJTyBLRVkgKi8KKyNkZWZpbmUgR1BJT19LRVkoYywgZywgZCkgeyAuY29kZSA9IGMsIC5ncGlvID0gZywgLmRlc2MgPSBkLCAuYWN0aXZlX2xvdyA9IDEgfQorCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gZ3Bpb19idXR0b25zW10gPSB7CisJR1BJT19LRVkoS0VZX1ZPTFVNRVVQLCBHUElPX1BPUlQ1NiwgIisiKSwgLyogUzI6IFZPTCsgW0lSUTldICovCisJR1BJT19LRVkoS0VZX1ZPTFVNRURPV04sIEdQSU9fUE9SVDU0LCAiLSIpLCAvKiBTMzogVk9MLSBbSVJRMTBdICovCisJR1BJT19LRVkoS0VZX01FTlUsIEdQSU9fUE9SVDI3LCAiTWVudSIpLCAvKiBTNDogTUVOVSBbSVJRMzBdICovCisJR1BJT19LRVkoS0VZX0hPTUVQQUdFLCBHUElPX1BPUlQyNiwgIkhvbWUiKSwgLyogUzU6IEhPTUUgW0lSUTMxXSAqLworCUdQSU9fS0VZKEtFWV9CQUNLLCBHUElPX1BPUlQxMSwgIkJhY2siKSwgLyogUzY6IEJBQ0sgW0lSUTBdICovCisJR1BJT19LRVkoS0VZX1BIT05FLCBHUElPX1BPUlQyMzgsICJUZWwiKSwgLyogUzc6IFRFTCBbSVJRMTFdICovCisJR1BJT19LRVkoS0VZX1BPV0VSLCBHUElPX1BPUlQyMzksICJDMSIpLCAvKiBTODogQ0FNIFtJUlExM10gKi8KKwlHUElPX0tFWShLRVlfTUFJTCwgR1BJT19QT1JUMjI0LCAiTWFpbCIpLCAvKiBTOTogTUFJTCBbSVJRM10gKi8KKwkvKiBPbWl0dGVkIGJ1dHRvbiAiQzM/IjogR1BJT19QT1JUMjIzIC0gUzEwOiBDVVNUIFtJUlE4XSAqLworCUdQSU9fS0VZKEtFWV9DQU1FUkEsIEdQSU9fUE9SVDE2NCwgIkMyIiksIC8qIFMxMTogQ0FNX0hBTEYgW0lSUTI1XSAqLworCS8qIE9taXR0ZWQgYnV0dG9uICI/IjogR1BJT19QT1JUMTUyIC0gUzEyOiBDQU1fRlVMTCBbTm8gSVJRXSAqLworfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBncGlvX2tleV9pbmZvID0geworCS5idXR0b25zICAgICAgICA9IGdwaW9fYnV0dG9ucywKKwkubmJ1dHRvbnMgICAgICAgPSBBUlJBWV9TSVpFKGdwaW9fYnV0dG9ucyksCisJLnBvbGxfaW50ZXJ2YWwgID0gMjUwLCAvKiBwb2xsZWQgZm9yIG5vdyAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3Bpb19rZXlzX2RldmljZSA9IHsKKwkubmFtZSAgID0gImdwaW8ta2V5cy1wb2xsZWQiLCAvKiBwb2xsZWQgZm9yIG5vdyAqLworCS5pZCAgICAgPSAtMSwKKwkuZGV2ICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmZ3Bpb19rZXlfaW5mbywKKwl9LAorfTsKKworLyogR1BJTyBMRUQgKi8KKyNkZWZpbmUgR1BJT19MRUQobiwgZykgeyAubmFtZSA9IG4sIC5ncGlvID0gZyB9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW10gPSB7CisJR1BJT19MRUQoIlYyNTEzIiwgR1BJT19QT1JUMTUzKSwgLyogUE9SVDE1MyBbVFBVMVQwMl0gLT4gVjI1MTMgKi8KKwlHUElPX0xFRCgiVjI1MTQiLCBHUElPX1BPUlQxOTkpLCAvKiBQT1JUMTk5IFtUUFU0VE8xXSAtPiBWMjUxNCAqLworCUdQSU9fTEVEKCJWMjUxNSIsIEdQSU9fUE9SVDE5NyksIC8qIFBPUlQxOTcgW1RQVTJUTzFdIC0+IFYyNTE1ICovCisJR1BJT19MRUQoIktFWUxFRCIsIEdQSU9fUE9SVDE2MyksIC8qIFBPUlQxNjMgW1RQVTNUTzBdIC0+IEtFWUxFRCAqLworCUdQSU9fTEVEKCJHIiwgR1BJT19QT1JUMjApLCAvKiBQT1JUMjAgW0dQTzBdIC0+IExFRDcgLT4gIkciICovCisJR1BJT19MRUQoIkgiLCBHUElPX1BPUlQyMSksIC8qIFBPUlQyMSBbR1BPMV0gLT4gTEVEOCAtPiAiSCIgKi8KKwlHUElPX0xFRCgiSiIsIEdQSU9fUE9SVDIyKSwgLyogUE9SVDIyIFtHUE8yXSAtPiBMRUQ5IC0+ICJKIiAqLworfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZF9wbGF0Zm9ybV9kYXRhIGdwaW9fbGVkc19pbmZvID0geworCS5sZWRzCQk9IGdwaW9fbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGdwaW9fbGVkcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBncGlvX2xlZHNfZGV2aWNlID0geworCS5uYW1lICAgPSAibGVkcy1ncGlvIiwKKwkuaWQgICAgID0gLTEsCisJLmRldiAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmdwaW9fbGVkc19pbmZvLAorCX0sCit9OworCisvKiBNTUNJRiAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtbWNpZl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgPSAiTU1DSUYiLAorCQkuc3RhcnQgID0gMHhlNmJkMDAwMCwKKwkJLmVuZCAgICA9IDB4ZTZiZDAwZmYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IGdpY19zcGkoMTQwKSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgID0gZ2ljX3NwaSgxNDEpLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW1jaWZfcGxhdF9kYXRhIG1tY2lmX2luZm8gPSB7CisJLm9jciAgICAgICAgICAgID0gTU1DX1ZERF8xNjVfMTk1LAorCS5jYXBzICAgICAgICAgICA9IE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfTk9OUkVNT1ZBQkxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW1jaWZfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9tbWNpZiIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICAgICAgICAgID0gJm1tY2lmX2luZm8sCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKG1tY2lmX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gbW1jaWZfcmVzb3VyY2VzLAorfTsKKworLyogU0RISTAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMF9pbmZvID0geworCS50bWlvX2NhcHMgICAgICA9IE1NQ19DQVBfU0RfSElHSFNQRUVELAorCS50bWlvX2ZsYWdzICAgICA9IFRNSU9fTU1DX1dSUFJPVEVDVF9ESVNBQkxFIHwgVE1JT19NTUNfSEFTX0lETEVfV0FJVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZSAgID0gIlNESEkwIiwKKwkJLnN0YXJ0ICA9IDB4ZWUxMDAwMDAsCisJCS5lbmQgICAgPSAweGVlMTAwMGZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBnaWNfc3BpKDgzKSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgID0gZ2ljX3NwaSg4NCksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gZ2ljX3NwaSg4NSksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInNoX21vYmlsZV9zZGhpIiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc2RoaTBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzZGhpMF9yZXNvdXJjZXMsCisJLmRldiAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJnNkaGkwX2luZm8sCisJfSwKK307CisKKy8qIFNESEkxICovCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gc2RoaTFfaW5mbyA9IHsKKwkudG1pb19jYXBzICAgICAgPSBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8IE1NQ19DQVBfU0RJT19JUlEsCisJLnRtaW9fZmxhZ3MgICAgID0gVE1JT19NTUNfV1JQUk9URUNUX0RJU0FCTEUgfCBUTUlPX01NQ19IQVNfSURMRV9XQUlULAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZGhpMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgPSAiU0RISTEiLAorCQkuc3RhcnQgID0gMHhlZTEyMDAwMCwKKwkJLmVuZCAgICA9IDB4ZWUxMjAwZmYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IGdpY19zcGkoODcpLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCAgPSBnaWNfc3BpKDg4KSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBnaWNfc3BpKDg5KSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkaGkxX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAic2hfbW9iaWxlX3NkaGkiLAorCS5pZCAgICAgICAgICAgICA9IDEsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IHNkaGkxX3Jlc291cmNlcywKKwkuZGV2ICAgID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmc2RoaTFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmtvdGEyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZldGhfZGV2aWNlLAorCSZrZXlzY19kZXZpY2UsCisJJmdwaW9fa2V5c19kZXZpY2UsCisJJmdwaW9fbGVkc19kZXZpY2UsCisJJm1tY2lmX2RldmljZSwKKwkmc2RoaTBfZGV2aWNlLAorCSZzZGhpMV9kZXZpY2UsCit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGtvdGEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCS8qIGNyZWF0ZSBhIDE6MSBlbnRpdHkgbWFwIGZvciAweGU2eHh4eHh4CisJICogdXNlZCBieSBDUEdBLCBJTlRDIGFuZCBQRkMuCisJICovCisJeworCQkudmlydHVhbAk9IDB4ZTYwMDAwMDAsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbigweGU2MDAwMDAwKSwKKwkJLmxlbmd0aAkJPSAyNTYgPDwgMjAsCisJCS50eXBlCQk9IE1UX0RFVklDRV9OT05TSEFSRUQKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGtvdGEyX21hcF9pbyh2b2lkKQoreworCWlvdGFibGVfaW5pdChrb3RhMl9pb19kZXNjLCBBUlJBWV9TSVpFKGtvdGEyX2lvX2Rlc2MpKTsKKworCS8qIHNldHVwIGVhcmx5IGRldmljZXMgYW5kIGNvbnNvbGUgaGVyZSBhcyB3ZWxsICovCisJc2g3M2EwX2FkZF9lYXJseV9kZXZpY2VzKCk7CisJc2htb2JpbGVfc2V0dXBfY29uc29sZSgpOworfQorCisjZGVmaW5lIFBJTlRFUjBBCTB4ZTY5MDAwYTAKKyNkZWZpbmUgUElOVENSMEEJMHhlNjkwMDBiMAorCit2b2lkIF9faW5pdCBrb3RhMl9pbml0X2lycSh2b2lkKQoreworCXNoNzNhMF9pbml0X2lycSgpOworCisJLyogc2V0dXAgUElOVDogZW5hYmxlIFBJTlRBMiBhcyBhY3RpdmUgbG93ICovCisJX19yYXdfd3JpdGVsKDEgPDwgMjksIFBJTlRFUjBBKTsKKwlfX3Jhd193cml0ZXcoMiA8PCAxMCwgUElOVENSMEEpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQga290YTJfaW5pdCh2b2lkKQoreworCXNoNzNhMF9waW5tdXhfaW5pdCgpOworCisJLyogU0NJRkEyIChVQVJUMikgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TQ0lGQTJfVFhEMSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkEyX1JYRDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBMl9SVFMxXywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkEyX0NUUzFfLCBOVUxMKTsKKworCS8qIFNDSUZBNCAoVUFSVDEpICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkE0X1RYRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkE0X1JYRCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRkE0X1JUU18sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUZBNF9DVFNfLCBOVUxMKTsKKworCS8qIFNNU0M5MTFYICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDBfTkFGMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDFfTkFGMSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDJfTkFGMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDNfTkFGMywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDRfTkFGNCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDVfTkFGNSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDZfTkFGNiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDdfTkFGNywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDhfTkFGOCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDlfTkFGOSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDEwX05BRjEwLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9EMTFfTkFGMTEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QxMl9OQUYxMiwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fRDEzX05BRjEzLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9EMTRfTkFGMTQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0QxNV9OQUYxNSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fQ1M1QV8sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1dFMF9fRldFLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19QT1JUMTQ0LCBOVUxMKTsgLyogUElOVEEyICovCisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19QT1JUMTQ0KTsKKwlncGlvX3JlcXVlc3QoR1BJT19QT1JUMTQ1LCBOVUxMKTsgLyogUkVTRVQgKi8KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QT1JUMTQ1LCAxKTsKKworCS8qIEtFWVNDICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU4wX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjFfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlOMl9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU4zX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjRfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlONV9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU42X1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjdfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1BPUlQ1OV9LRVlPVVQ2LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUNThfS0VZT1VUNywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZT1VUOCwgTlVMTCk7CisKKwkvKiBNTUNJRiAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0NMSzAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzMsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzYsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzcsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0NNRDAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX1BPUlQyMDgsIE5VTEwpOyAvKiBSZXNldCAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BPUlQyMDgsIDEpOworCisJLyogU0RISTAgKG1pY3JvU0QpICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNEMF9QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNNRDBfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTEswLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDBfM19QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQwXzJfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMF8xX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDBfMF9QVSwgTlVMTCk7CisKKwkvKiBTQ0lGQiAoQlQpICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fUE9SVDE1OV9TQ0lGQl9TQ0ssIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1BPUlQxNjBfU0NJRkJfVFhELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUMTYxX1NDSUZCX0NUU18sIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1BPUlQxNjJfU0NJRkJfUlhELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9QT1JUMTYzX1NDSUZCX1JUU18sIE5VTEwpOworCisJLyogU0RISTEgKEJDTTQzMzApICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUNMSzEsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElDTUQxX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDFfM19QVSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQxXzJfUFUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMV8xX1BVLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TREhJRDFfMF9QVSwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAorCS8qIEVhcmx5IEJSRVNQIGVuYWJsZSwgU2hhcmVkIGF0dHJpYnV0ZSBvdmVycmlkZSBlbmFibGUsIDY0Syo4d2F5ICovCisJbDJ4MF9pbml0KF9faW8oMHhmMDEwMDAwMCksIDB4NDA0NjAwMDAsIDB4ODIwMDBmZmYpOworI2VuZGlmCisJc2g3M2EwX2FkZF9zdGFuZGFyZF9kZXZpY2VzKCk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoa290YTJfZGV2aWNlcywgQVJSQVlfU0laRShrb3RhMl9kZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBrb3RhMl90aW1lcl9pbml0KHZvaWQpCit7CisJc2g3M2EwX2Nsb2NrX2luaXQoKTsKKwlzaG1vYmlsZV90aW1lci5pbml0KCk7CisJcmV0dXJuOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIGtvdGEyX3RpbWVyID0geworCS5pbml0CT0ga290YTJfdGltZXJfaW5pdCwKK307CisKK01BQ0hJTkVfU1RBUlQoS09UQTIsICJrb3RhMiIpCisJLm1hcF9pbwkJPSBrb3RhMl9tYXBfaW8sCisJLmluaXRfaXJxCT0ga290YTJfaW5pdF9pcnEsCisJLmhhbmRsZV9pcnEJPSBzaG1vYmlsZV9oYW5kbGVfaXJxX2dpYywKKwkuaW5pdF9tYWNoaW5lCT0ga290YTJfaW5pdCwKKwkudGltZXIJCT0gJmtvdGEyX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwppbmRleCAwMDI3M2RhLi45YzVlNTk4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGNhNjQxNl9rZXlwYWQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcjhhNjY1OTcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcmVuZXNhc191c2Jocy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfaGRtaS5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CkBAIC0yNzIsOCArMjczLDggQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBub3JfZmxhc2hfcmVzb3VyY2VzW10gPSB7CiAJWzBdCT0gewotCQkuc3RhcnQJPSAweDAwMDAwMDAwLAotCQkuZW5kCT0gMHgwODAwMDAwMCAtIDEsCisJCS5zdGFydAk9IDB4MjAwMDAwMDAsIC8qIENTMCBzaGFkb3cgaW5zdGVhZCBvZiByZWd1bGFyIENTMCAqLworCQkuZW5kCT0gMHgyODAwMDAwMCAtIDEsIC8qIG5lZWRlZCBieSBVU0IgTUFTSyBST00gYm9vdCAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9CiB9OwpAQCAtMTA3MSwxNCArMTA3MiwxNyBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfQ0FSRF9ERVRFQ1QsCiAJCS5zdGFydAk9IGV2dDJpcnEoMHgwZTgwKSwgLyogU0RISTFfU0RISTFJMCAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVsyXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfU0RDQVJELAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MGVhMCksIC8qIFNESEkxX1NESEkxSTEgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbM10gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NESU8sCiAJCS5zdGFydAk9IGV2dDJpcnEoMHgwZWMwKSwgLyogU0RISTFfU0RISTFJMiAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LApAQCAtMTEyMiwxNCArMTEyNiwxNyBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfQ0FSRF9ERVRFQ1QsCiAJCS5zdGFydAk9IGV2dDJpcnEoMHgxMjAwKSwgLyogU0RISTJfU0RISTJJMCAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVsyXSA9IHsKKwkJLm5hbWUJPSBTSF9NT0JJTEVfU0RISV9JUlFfU0RDQVJELAogCQkuc3RhcnQJPSBldnQyaXJxKDB4MTIyMCksIC8qIFNESEkyX1NESEkySTEgKi8KIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAlbM10gPSB7CisJCS5uYW1lCT0gU0hfTU9CSUxFX1NESElfSVJRX1NESU8sCiAJCS5zdGFydAk9IGV2dDJpcnEoMHgxMjQwKSwgLyogU0RISTJfU0RISTJJMiAqLwogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LApAQCAtMTIxNiw5ICsxMjIzLDEwIEBACiAJCS53aWR0aCA9IDY0MCwKIAkJLmhlaWdodCA9IDQ4MCwKIAl9LAotCS5idXNfcGFyYW0gPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9NQVNURVIgfCBTT0NBTV9EQVRBV0lEVEhfOCB8Ci0JU09DQU1fREFUQV9BQ1RJVkVfSElHSCwKKwkubWJ1c19wYXJhbSA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdILAorCS5tYnVzX3R5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsCiAJLnNldF9jYXB0dXJlID0gY2FtZXJhX3NldF9jYXB0dXJlLAogfTsKIApAQCAtMTM4Miw2ICsxMzkwLDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBtYWNrZXJlbF9tYXBfaW8odm9pZCkKIHsKIAlpb3RhYmxlX2luaXQobWFja2VyZWxfaW9fZGVzYywgQVJSQVlfU0laRShtYWNrZXJlbF9pb19kZXNjKSk7CisJLyogRE1BIG1lbW9yeSBhdCAweGY2MDAwMDAwIC0gMHhmZmRmZmZmZiAqLworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSgxNTggPDwgMjApOwogCiAJLyogc2V0dXAgZWFybHkgZGV2aWNlcyBhbmQgY29uc29sZSBoZXJlIGFzIHdlbGwgKi8KIAlzaDczNzJfYWRkX2Vhcmx5X2RldmljZXMoKTsKQEAgLTE1ODgsNiArMTU5OCw3IEBACiAKIAlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNGxjLCAmbGNkY19kZXZpY2UpOwogCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2E0bGMsICZoZG1pX2xjZGNfZGV2aWNlKTsKKwlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNGxjLCAmbWVyYW1fZGV2aWNlKTsKIAlzaDczNzJfYWRkX2RldmljZV90b19kb21haW4oJnNoNzM3Ml9hNG1wLCAmZnNpX2RldmljZSk7CiAJc2g3MzcyX2FkZF9kZXZpY2VfdG9fZG9tYWluKCZzaDczNzJfYTNzcCwgJnVzYmhzMF9kZXZpY2UpOwogCXNoNzM3Ml9hZGRfZGV2aWNlX3RvX2RvbWFpbigmc2g3MzcyX2Ezc3AsICZ1c2JoczFfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCmluZGV4IDY2OTc1OTIuLjk5NWE5YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJLmRpc2FibGUJPSBmc2lkaXZfZGlzYWJsZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrX21hcHBpbmcgc2g3MzcyX2ZzaWRpdmFfY2xrX21hcHBpbmcgPSB7CitzdGF0aWMgc3RydWN0IGNsa19tYXBwaW5nIGZzaWRpdmFfY2xrX21hcHBpbmcgPSB7CiAJLnBoeXMJPSBGU0lESVZBLAogCS5sZW4JPSA4LAogfTsKQEAgLTQ4NCwxMCArNDg0LDEwIEBACiBzdHJ1Y3QgY2xrIHNoNzM3Ml9mc2lkaXZhX2NsayA9IHsKIAkub3BzCQk9ICZmc2lkaXZfY2xrX29wcywKIAkucGFyZW50CQk9ICZkaXY2X3JlcGFyZW50X2Nsa3NbRElWNl9GU0lBXSwgLyogbGF0ZSBpbnN0YWxsICovCi0JLm1hcHBpbmcJPSAmc2g3MzcyX2ZzaWRpdmFfY2xrX21hcHBpbmcsCisJLm1hcHBpbmcJPSAmZnNpZGl2YV9jbGtfbWFwcGluZywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrX21hcHBpbmcgc2g3MzcyX2ZzaWRpdmJfY2xrX21hcHBpbmcgPSB7CitzdGF0aWMgc3RydWN0IGNsa19tYXBwaW5nIGZzaWRpdmJfY2xrX21hcHBpbmcgPSB7CiAJLnBoeXMJPSBGU0lESVZCLAogCS5sZW4JPSA4LAogfTsKQEAgLTQ5NSw3ICs0OTUsNyBAQAogc3RydWN0IGNsayBzaDczNzJfZnNpZGl2Yl9jbGsgPSB7CiAJLm9wcwkJPSAmZnNpZGl2X2Nsa19vcHMsCiAJLnBhcmVudAkJPSAmZGl2Nl9yZXBhcmVudF9jbGtzW0RJVjZfRlNJQl0sICAvKiBsYXRlIGluc3RhbGwgKi8KLQkubWFwcGluZwk9ICZzaDczNzJfZnNpZGl2Yl9jbGtfbWFwcGluZywKKwkubWFwcGluZwk9ICZmc2lkaXZiX2Nsa19tYXBwaW5nLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmxhdGVfbWFpbl9jbGtzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLmMKaW5kZXggNmI3YzdjNC4uMzE2NTRkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2suYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zaF9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jcHVpZGxlLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2NwdWlkbGUuYwppbmRleCAyZTQ0ZjExLi4xYjIzMzQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2NwdWlkbGUuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2NwdWlkbGUuYwpAQCAtMjYsNjUgKzI2LDU5IEBACiB9OwogCiBzdGF0aWMgaW50IHNobW9iaWxlX2NwdWlkbGVfZW50ZXIoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJICBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQkgIGludCBpbmRleCkKIHsKIAlrdGltZV90IGJlZm9yZSwgYWZ0ZXI7Ci0JaW50IHJlcXVlc3RlZF9zdGF0ZSA9IHN0YXRlIC0gJmRldi0+c3RhdGVzWzBdOwogCi0JZGV2LT5sYXN0X3N0YXRlID0gJmRldi0+c3RhdGVzW3JlcXVlc3RlZF9zdGF0ZV07CiAJYmVmb3JlID0ga3RpbWVfZ2V0KCk7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWxvY2FsX2ZpcV9kaXNhYmxlKCk7CiAKLQlzaG1vYmlsZV9jcHVpZGxlX21vZGVzW3JlcXVlc3RlZF9zdGF0ZV0oKTsKKwlzaG1vYmlsZV9jcHVpZGxlX21vZGVzW2luZGV4XSgpOwogCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWxvY2FsX2ZpcV9lbmFibGUoKTsKIAogCWFmdGVyID0ga3RpbWVfZ2V0KCk7Ci0JcmV0dXJuIGt0aW1lX3RvX25zKGt0aW1lX3N1YihhZnRlciwgYmVmb3JlKSkgPj4gMTA7CisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihhZnRlciwgYmVmb3JlKSkgPj4gMTA7CisKKwlyZXR1cm4gaW5kZXg7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2Ugc2htb2JpbGVfY3B1aWRsZV9kZXY7CiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZHJpdmVyIHNobW9iaWxlX2NwdWlkbGVfZHJpdmVyID0gewogCS5uYW1lID0JCSJzaG1vYmlsZV9jcHVpZGxlIiwKIAkub3duZXIgPQlUSElTX01PRFVMRSwKKwkuc3RhdGVzWzBdID0geworCQkubmFtZSA9ICJDMSIsCisJCS5kZXNjID0gIldGSSIsCisJCS5leGl0X2xhdGVuY3kgPSAxLAorCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDEgKiAyLAorCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKKwl9LAorCS5zYWZlX3N0YXRlX2luZGV4ID0gMCwgLyogQzEgKi8KKwkuc3RhdGVfY291bnQgPSAxLAogfTsKIAotdm9pZCAoKnNobW9iaWxlX2NwdWlkbGVfc2V0dXApKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKK3ZvaWQgKCpzaG1vYmlsZV9jcHVpZGxlX3NldHVwKShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydik7CiAKIHN0YXRpYyBpbnQgc2htb2JpbGVfY3B1aWRsZV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSAmc2htb2JpbGVfY3B1aWRsZV9kZXY7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJnNobW9iaWxlX2NwdWlkbGVfZHJpdmVyOwogCWludCBpOwogCi0JY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJnNobW9iaWxlX2NwdWlkbGVfZHJpdmVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7Ci0JCWRldi0+c3RhdGVzW2ldLm5hbWVbMF0gPSAnXDAnOwotCQlkZXYtPnN0YXRlc1tpXS5kZXNjWzBdID0gJ1wwJzsKLQkJZGV2LT5zdGF0ZXNbaV0uZW50ZXIgPSBzaG1vYmlsZV9jcHVpZGxlX2VudGVyOwotCX0KLQotCWkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsKLQotCXN0YXRlID0gJmRldi0+c3RhdGVzW2krK107Ci0Jc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDMSIpOwotCXN0cm5jcHkoc3RhdGUtPmRlc2MsICJXRkkiLCBDUFVJRExFX0RFU0NfTEVOKTsKLQlzdGF0ZS0+ZXhpdF9sYXRlbmN5ID0gMTsKLQlzdGF0ZS0+dGFyZ2V0X3Jlc2lkZW5jeSA9IDEgKiAyOwotCXN0YXRlLT5wb3dlcl91c2FnZSA9IDM7Ci0Jc3RhdGUtPmZsYWdzID0gMDsKLQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0KLQlkZXYtPnNhZmVfc3RhdGUgPSBzdGF0ZTsKLQlkZXYtPnN0YXRlX2NvdW50ID0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgQ1BVSURMRV9TVEFURV9NQVg7IGkrKykKKwkJZHJ2LT5zdGF0ZXNbaV0uZW50ZXIgPSBzaG1vYmlsZV9jcHVpZGxlX2VudGVyOwogCiAJaWYgKHNobW9iaWxlX2NwdWlkbGVfc2V0dXApCi0JCXNobW9iaWxlX2NwdWlkbGVfc2V0dXAoZGV2KTsKKwkJc2htb2JpbGVfY3B1aWRsZV9zZXR1cChkcnYpOwogCisJY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoZHJ2KTsKKworCWRldi0+c3RhdGVfY291bnQgPSBkcnYtPnN0YXRlX2NvdW50OwogCWNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvZW50cnktaW50Yy5TIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9lbnRyeS1pbnRjLlMKaW5kZXggY2FjMGE3YS4uMWExYzAwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9lbnRyeS1pbnRjLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9lbnRyeS1pbnRjLlMKQEAgLTUxLDcgKzUxLDQgQEAKIAkubWFjcm8gIHRlc3RfZm9yX2lwaSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAogCS5lbmRtCiAKLQkubWFjcm8gIHRlc3RfZm9yX2x0aXJxLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCi0JLmVuZG0KLQogCWFyY2hfaXJxX2hhbmRsZXIgc2htb2JpbGVfaGFuZGxlX2lycV9pbnRjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCmluZGV4IGMwY2RiZjkuLjgzNGJkNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCkBAIC05LDkgKzksOSBAQAogZXh0ZXJuIHZvaWQgc2htb2JpbGVfaGFuZGxlX2lycV9pbnRjKHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgc2htb2JpbGVfaGFuZGxlX2lycV9naWMoc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHNobW9iaWxlX3N1c3BlbmRfb3BzOwotc3RydWN0IGNwdWlkbGVfZGV2aWNlOworc3RydWN0IGNwdWlkbGVfZHJpdmVyOwogZXh0ZXJuIHZvaWQgKCpzaG1vYmlsZV9jcHVpZGxlX21vZGVzW10pKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCpzaG1vYmlsZV9jcHVpZGxlX3NldHVwKShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCAoKnNobW9iaWxlX2NwdWlkbGVfc2V0dXApKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KTsKIAogZXh0ZXJuIHZvaWQgc2g3MzY3X2luaXRfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2g3MzY3X2FkZF9lYXJseV9kZXZpY2VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggZDc5MWYxMC4uOGQ0YTQxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0yNyw4ICsyNyw1IEBACiAJLm1hY3JvICB0ZXN0X2Zvcl9pcGksIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKIAkuZW5kbQogCi0JLm1hY3JvICB0ZXN0X2Zvcl9sdGlycSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotCS5lbmRtCi0KIAkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDJiMWJiOWUuLjdiZjA4OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTE4LDMxICsxOCwxNSBAQAogCiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKIAotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQlfX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKKyNlbHNlCisKKyNkZWZpbmUgX19BUk1fR1BJT0xJQl9DT01QTEVYCisKICNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQiAqLwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2ludGMuaCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2ludGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIyMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvaW50Yy5oCkBAIC0wLDAgKzEsMjQ2IEBACisjaWZuZGVmIF9fQVNNX01BQ0hfSU5UQ19ICisjZGVmaW5lIF9fQVNNX01BQ0hfSU5UQ19ICisjaW5jbHVkZSA8bGludXgvc2hfaW50Yy5oPgorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfRU5VTV8xNkwocCkJCQkJXAorCXAgIyMgX0lSUTAsIHAgIyMgX0lSUTEsIHAgIyMgX0lSUTIsIHAgIyMgX0lSUTMsCQlcCisJcCAjIyBfSVJRNCwgcCAjIyBfSVJRNSwgcCAjIyBfSVJRNiwgcCAjIyBfSVJRNywJCVwKKwlwICMjIF9JUlE4LCBwICMjIF9JUlE5LCBwICMjIF9JUlExMCwgcCAjIyBfSVJRMTEsCVwKKwlwICMjIF9JUlExMiwgcCAjIyBfSVJRMTMsIHAgIyMgX0lSUTE0LCBwICMjIF9JUlExNQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfRU5VTV8xNkgocCkJCQkJXAorCXAgIyMgX0lSUTE2LCBwICMjIF9JUlExNywgcCAjIyBfSVJRMTgsIHAgIyMgX0lSUTE5LAlcCisJcCAjIyBfSVJRMjAsIHAgIyMgX0lSUTIxLCBwICMjIF9JUlEyMiwgcCAjIyBfSVJRMjMsCVwKKwlwICMjIF9JUlEyNCwgcCAjIyBfSVJRMjUsIHAgIyMgX0lSUTI2LCBwICMjIF9JUlEyNywJXAorCXAgIyMgX0lSUTI4LCBwICMjIF9JUlEyOSwgcCAjIyBfSVJRMzAsIHAgIyMgX0lSUTMxCisKKyNkZWZpbmUgSU5UQ19JUlFfUElOU19WRUNUXzE2TChwLCB2ZWN0KQkJCQlcCisJdmVjdChwICMjIF9JUlEwLCAweDAyMDApLCB2ZWN0KHAgIyMgX0lSUTEsIDB4MDIyMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTIsIDB4MDI0MCksIHZlY3QocCAjIyBfSVJRMywgMHgwMjYwKSwJXAorCXZlY3QocCAjIyBfSVJRNCwgMHgwMjgwKSwgdmVjdChwICMjIF9JUlE1LCAweDAyYTApLAlcCisJdmVjdChwICMjIF9JUlE2LCAweDAyYzApLCB2ZWN0KHAgIyMgX0lSUTcsIDB4MDJlMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTgsIDB4MDMwMCksIHZlY3QocCAjIyBfSVJROSwgMHgwMzIwKSwJXAorCXZlY3QocCAjIyBfSVJRMTAsIDB4MDM0MCksIHZlY3QocCAjIyBfSVJRMTEsIDB4MDM2MCksCVwKKwl2ZWN0KHAgIyMgX0lSUTEyLCAweDAzODApLCB2ZWN0KHAgIyMgX0lSUTEzLCAweDAzYTApLAlcCisJdmVjdChwICMjIF9JUlExNCwgMHgwM2MwKSwgdmVjdChwICMjIF9JUlExNSwgMHgwM2UwKQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfVkVDVF8xNkgocCwgdmVjdCkJCQkJXAorCXZlY3QocCAjIyBfSVJRMTYsIDB4MzIwMCksIHZlY3QocCAjIyBfSVJRMTcsIDB4MzIyMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTE4LCAweDMyNDApLCB2ZWN0KHAgIyMgX0lSUTE5LCAweDMyNjApLAlcCisJdmVjdChwICMjIF9JUlEyMCwgMHgzMjgwKSwgdmVjdChwICMjIF9JUlEyMSwgMHgzMmEwKSwJXAorCXZlY3QocCAjIyBfSVJRMjIsIDB4MzJjMCksIHZlY3QocCAjIyBfSVJRMjMsIDB4MzJlMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTI0LCAweDMzMDApLCB2ZWN0KHAgIyMgX0lSUTI1LCAweDMzMjApLAlcCisJdmVjdChwICMjIF9JUlEyNiwgMHgzMzQwKSwgdmVjdChwICMjIF9JUlEyNywgMHgzMzYwKSwJXAorCXZlY3QocCAjIyBfSVJRMjgsIDB4MzM4MCksIHZlY3QocCAjIyBfSVJRMjksIDB4MzNhMCksCVwKKwl2ZWN0KHAgIyMgX0lSUTMwLCAweDMzYzApLCB2ZWN0KHAgIyMgX0lSUTMxLCAweDMzZTApCisKKyNkZWZpbmUgSU5UQ19JUlFfUElOU19NQVNLXzE2TChwLCBiYXNlKQkJCQkJXAorCXsgYmFzZSArIDB4NDAsIGJhc2UgKyAweDYwLCA4LCAvKiBJTlRNU0swMEEgLyBJTlRNU0tDTFIwMEEgKi8JXAorCSAgeyBwICMjIF9JUlEwLCBwICMjIF9JUlExLCBwICMjIF9JUlEyLCBwICMjIF9JUlEzLAkJXAorCSAgICBwICMjIF9JUlE0LCBwICMjIF9JUlE1LCBwICMjIF9JUlE2LCBwICMjIF9JUlE3IH0gfSwJCVwKKwl7IGJhc2UgKyAweDQ0LCBiYXNlICsgMHg2NCwgOCwgLyogSU5UTVNLMTBBIC8gSU5UTVNLQ0xSMTBBICovCVwKKwkgIHsgcCAjIyBfSVJROCwgcCAjIyBfSVJROSwgcCAjIyBfSVJRMTAsIHAgIyMgX0lSUTExLAkJXAorCSAgICBwICMjIF9JUlExMiwgcCAjIyBfSVJRMTMsIHAgIyMgX0lSUTE0LCBwICMjIF9JUlExNSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TX01BU0tfMTZIKHAsIGJhc2UpCQkJCQlcCisJeyBiYXNlICsgMHg0OCwgYmFzZSArIDB4NjgsIDgsIC8qIElOVE1TSzIwQSAvIElOVE1TS0NMUjIwQSAqLwlcCisJICB7IHAgIyMgX0lSUTE2LCBwICMjIF9JUlExNywgcCAjIyBfSVJRMTgsIHAgIyMgX0lSUTE5LAkJXAorCSAgICBwICMjIF9JUlEyMCwgcCAjIyBfSVJRMjEsIHAgIyMgX0lSUTIyLCBwICMjIF9JUlEyMyB9IH0sCVwKKwl7IGJhc2UgKyAweDRjLCBiYXNlICsgMHg2YywgOCwgLyogSU5UTVNLMzBBIC8gSU5UTVNLQ0xSMzBBICovCVwKKwkgIHsgcCAjIyBfSVJRMjQsIHAgIyMgX0lSUTI1LCBwICMjIF9JUlEyNiwgcCAjIyBfSVJRMjcsCQlcCisJICAgIHAgIyMgX0lSUTI4LCBwICMjIF9JUlEyOSwgcCAjIyBfSVJRMzAsIHAgIyMgX0lSUTMxIH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfUFJJT18xNkwocCwgYmFzZSkJCQkJCVwKKwl7IGJhc2UgKyAweDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJMDBBICovCQkJXAorCSAgeyBwICMjIF9JUlEwLCBwICMjIF9JUlExLCBwICMjIF9JUlEyLCBwICMjIF9JUlEzLAkJXAorCSAgICBwICMjIF9JUlE0LCBwICMjIF9JUlE1LCBwICMjIF9JUlE2LCBwICMjIF9JUlE3IH0gfSwJCVwKKwl7IGJhc2UgKyAweDE0LCAwLCAzMiwgNCwgLyogSU5UUFJJMTBBICovCQkJXAorCSAgeyBwICMjIF9JUlE4LCBwICMjIF9JUlE5LCBwICMjIF9JUlExMCwgcCAjIyBfSVJRMTEsCQlcCisJICAgIHAgIyMgX0lSUTEyLCBwICMjIF9JUlExMywgcCAjIyBfSVJRMTQsIHAgIyMgX0lSUTE1IH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfUFJJT18xNkgocCwgYmFzZSkJCQkJCVwKKwl7IGJhc2UgKyAweDE4LCAwLCAzMiwgNCwgLyogSU5UUFJJMjBBICovCQkJXAorCSAgeyBwICMjIF9JUlExNiwgcCAjIyBfSVJRMTcsIHAgIyMgX0lSUTE4LCBwICMjIF9JUlExOSwJCVwKKwkgICAgcCAjIyBfSVJRMjAsIHAgIyMgX0lSUTIxLCBwICMjIF9JUlEyMiwgcCAjIyBfSVJRMjMgfSB9LAlcCisJeyBiYXNlICsgMHgxYywgMCwgMzIsIDQsIC8qIElOVFBSSTMwQSAqLwkJCVwKKwkgIHsgcCAjIyBfSVJRMjQsIHAgIyMgX0lSUTI1LCBwICMjIF9JUlEyNiwgcCAjIyBfSVJRMjcsCQlcCisJICAgIHAgIyMgX0lSUTI4LCBwICMjIF9JUlEyOSwgcCAjIyBfSVJRMzAsIHAgIyMgX0lSUTMxIH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfU0VOU0VfMTZMKHAsIGJhc2UpCQkJCVwKKwl7IGJhc2UgKyAweDAwLCAzMiwgNCwgLyogSUNSMUEgKi8JCQkJXAorCSAgeyBwICMjIF9JUlEwLCBwICMjIF9JUlExLCBwICMjIF9JUlEyLCBwICMjIF9JUlEzLAkJXAorCSAgICBwICMjIF9JUlE0LCBwICMjIF9JUlE1LCBwICMjIF9JUlE2LCBwICMjIF9JUlE3IH0gfSwJCVwKKwl7IGJhc2UgKyAweDA0LCAzMiwgNCwgLyogSUNSMkEgKi8JCQkJXAorCSAgeyBwICMjIF9JUlE4LCBwICMjIF9JUlE5LCBwICMjIF9JUlExMCwgcCAjIyBfSVJRMTEsCQlcCisJICAgIHAgIyMgX0lSUTEyLCBwICMjIF9JUlExMywgcCAjIyBfSVJRMTQsIHAgIyMgX0lSUTE1IH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfU0VOU0VfMTZIKHAsIGJhc2UpCQkJCVwKKwl7IGJhc2UgKyAweDA4LCAzMiwgNCwgLyogSUNSM0EgKi8JCQkJXAorCSAgeyBwICMjIF9JUlExNiwgcCAjIyBfSVJRMTcsIHAgIyMgX0lSUTE4LCBwICMjIF9JUlExOSwJCVwKKwkgICAgcCAjIyBfSVJRMjAsIHAgIyMgX0lSUTIxLCBwICMjIF9JUlEyMiwgcCAjIyBfSVJRMjMgfSB9LAlcCisJeyBiYXNlICsgMHgwYywgMzIsIDQsIC8qIElDUjRBICovCQkJCVwKKwkgIHsgcCAjIyBfSVJRMjQsIHAgIyMgX0lSUTI1LCBwICMjIF9JUlEyNiwgcCAjIyBfSVJRMjcsCQlcCisJICAgIHAgIyMgX0lSUTI4LCBwICMjIF9JUlEyOSwgcCAjIyBfSVJRMzAsIHAgIyMgX0lSUTMxIH0gfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfQUNLXzE2TChwLCBiYXNlKQkJCQkJXAorCXsgYmFzZSArIDB4MjAsIDAsIDgsIC8qIElOVFJFUTAwQSAqLwkJCQlcCisJICB7IHAgIyMgX0lSUTAsIHAgIyMgX0lSUTEsIHAgIyMgX0lSUTIsIHAgIyMgX0lSUTMsCQlcCisJICAgIHAgIyMgX0lSUTQsIHAgIyMgX0lSUTUsIHAgIyMgX0lSUTYsIHAgIyMgX0lSUTcgfSB9LAkJXAorCXsgYmFzZSArIDB4MjQsIDAsIDgsIC8qIElOVFJFUTEwQSAqLwkJCQlcCisJICB7IHAgIyMgX0lSUTgsIHAgIyMgX0lSUTksIHAgIyMgX0lSUTEwLCBwICMjIF9JUlExMSwJCVwKKwkgICAgcCAjIyBfSVJRMTIsIHAgIyMgX0lSUTEzLCBwICMjIF9JUlExNCwgcCAjIyBfSVJRMTUgfSB9CisKKyNkZWZpbmUgSU5UQ19JUlFfUElOU19BQ0tfMTZIKHAsIGJhc2UpCQkJCQlcCisJeyBiYXNlICsgMHgyOCwgMCwgOCwgLyogSU5UUkVRMjBBICovCQkJCVwKKwkgIHsgcCAjIyBfSVJRMTYsIHAgIyMgX0lSUTE3LCBwICMjIF9JUlExOCwgcCAjIyBfSVJRMTksCQlcCisJICAgIHAgIyMgX0lSUTIwLCBwICMjIF9JUlEyMSwgcCAjIyBfSVJRMjIsIHAgIyMgX0lSUTIzIH0gfSwJXAorCXsgYmFzZSArIDB4MmMsIDAsIDgsIC8qIElOVFJFUTMwQSAqLwkJCQlcCisJICB7IHAgIyMgX0lSUTI0LCBwICMjIF9JUlEyNSwgcCAjIyBfSVJRMjYsIHAgIyMgX0lSUTI3LAkJXAorCSAgICBwICMjIF9JUlEyOCwgcCAjIyBfSVJRMjksIHAgIyMgX0lSUTMwLCBwICMjIF9JUlEzMSB9IH0KKworI2RlZmluZSBJTlRDX0lSUV9QSU5TXzE2KHAsIGJhc2UsIHZlY3QsIHN0cikJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwICMjIF9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0gewkJCVwKKwlbMF0gPSB7CQkJCQkJCQlcCisJCS5zdGFydAk9IGJhc2UsCQkJCQkJXAorCQkuZW5kCT0gYmFzZSArIDB4NjQsCQkJCQlcCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAkJCQlcCisJfSwJCQkJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorZW51bSB7CQkJCQkJCQkJXAorCXAgIyMgX1VOVVNFRCA9IDAsCQkJCQkJXAorCUlOVENfSVJRX1BJTlNfRU5VTV8xNkwocCksCQkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHAgIyMgX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0gewkJCVwKKwlJTlRDX0lSUV9QSU5TX1ZFQ1RfMTZMKHAsIHZlY3QpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBwICMjIF9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX01BU0tfMTZMKHAsIGJhc2UpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBwICMjIF9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX1BSSU9fMTZMKHAsIGJhc2UpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgcCAjIyBfc2Vuc2VfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCUlOVENfSVJRX1BJTlNfU0VOU0VfMTZMKHAsIGJhc2UpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBwICMjIF9hY2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCUlOVENfSVJRX1BJTlNfQUNLXzE2TChwLCBiYXNlKSwJCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX2Rlc2MgcCAjIyBfZGVzYyBfX2luaXRkYXRhID0gewkJCVwKKwkubmFtZSA9IHN0ciwJCQkJCQkJXAorCS5yZXNvdXJjZSA9IHAgIyMgX3Jlc291cmNlcywJCQkJCVwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocCAjIyBfcmVzb3VyY2VzKSwJCQlcCisJLmh3ID0gSU5UQ19IV19ERVNDKHAgIyMgX3ZlY3RvcnMsIE5VTEwsCQkJCVwKKwkJCSAgICAgcCAjIyBfbWFza19yZWdpc3RlcnMsIHAgIyMgX3ByaW9fcmVnaXN0ZXJzLCBcCisJCQkgICAgIHAgIyMgX3NlbnNlX3JlZ2lzdGVycywgcCAjIyBfYWNrX3JlZ2lzdGVycykgXAorfQorCisjZGVmaW5lIElOVENfSVJRX1BJTlNfMzIocCwgYmFzZSwgdmVjdCwgc3RyKQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHAgIyMgX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7CQkJXAorCVswXSA9IHsJCQkJCQkJCVwKKwkJLnN0YXJ0CT0gYmFzZSwJCQkJCQlcCisJCS5lbmQJPSBiYXNlICsgMHg2YywJCQkJCVwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCQkJCVwKKwl9LAkJCQkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitlbnVtIHsJCQkJCQkJCQlcCisJcCAjIyBfVU5VU0VEID0gMCwJCQkJCQlcCisJSU5UQ19JUlFfUElOU19FTlVNXzE2TChwKSwJCQkJCVwKKwlJTlRDX0lSUV9QSU5TX0VOVU1fMTZIKHApLAkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfdmVjdCBwICMjIF92ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsJCQlcCisJSU5UQ19JUlFfUElOU19WRUNUXzE2TChwLCB2ZWN0KSwJCQkJXAorCUlOVENfSVJRX1BJTlNfVkVDVF8xNkgocCwgdmVjdCksCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIHAgIyMgX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCUlOVENfSVJRX1BJTlNfTUFTS18xNkwocCwgYmFzZSksCQkJCVwKKwlJTlRDX0lSUV9QSU5TX01BU0tfMTZIKHAsIGJhc2UpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBwICMjIF9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX1BSSU9fMTZMKHAsIGJhc2UpLAkJCQlcCisJSU5UQ19JUlFfUElOU19QUklPXzE2SChwLCBiYXNlKSwJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfc2Vuc2VfcmVnIHAgIyMgX3NlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CVwKKwlJTlRDX0lSUV9QSU5TX1NFTlNFXzE2TChwLCBiYXNlKSwJCQkJXAorCUlOVENfSVJRX1BJTlNfU0VOU0VfMTZIKHAsIGJhc2UpLAkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBwICMjIF9hY2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsJXAorCUlOVENfSVJRX1BJTlNfQUNLXzE2TChwLCBiYXNlKSwJCQkJCVwKKwlJTlRDX0lSUV9QSU5TX0FDS18xNkgocCwgYmFzZSksCQkJCQlcCit9OwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgaW50Y19kZXNjIHAgIyMgX2Rlc2MgX19pbml0ZGF0YSA9IHsJCQlcCisJLm5hbWUgPSBzdHIsCQkJCQkJCVwKKwkucmVzb3VyY2UgPSBwICMjIF9yZXNvdXJjZXMsCQkJCQlcCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHAgIyMgX3Jlc291cmNlcyksCQkJXAorCS5odyA9IElOVENfSFdfREVTQyhwICMjIF92ZWN0b3JzLCBOVUxMLAkJCQlcCisJCQkgICAgIHAgIyMgX21hc2tfcmVnaXN0ZXJzLCBwICMjIF9wcmlvX3JlZ2lzdGVycywgXAorCQkJICAgICBwICMjIF9zZW5zZV9yZWdpc3RlcnMsIHAgIyMgX2Fja19yZWdpc3RlcnMpIFwKK30KKworI2RlZmluZSBJTlRDX1BJTlRfRV9FTVBUWQorI2RlZmluZSBJTlRDX1BJTlRfRV9OT05FIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisjZGVmaW5lIElOVENfUElOVF9FKHApCQkJCQkJCVwKKwlQSU5UICMjIHAgIyMgMCwgUElOVCAjIyBwICMjIDEsIFBJTlQgIyMgcCAjIyAyLCBQSU5UICMjIHAgIyMgMywJXAorCVBJTlQgIyMgcCAjIyA0LCBQSU5UICMjIHAgIyMgNSwgUElOVCAjIyBwICMjIDYsIFBJTlQgIyMgcCAjIyA3LAorCisjZGVmaW5lIElOVENfUElOVF9WX05PTkUKKyNkZWZpbmUgSU5UQ19QSU5UX1YocCwgdmVjdCkJCQkJCVwKKwl2ZWN0KFBJTlQgIyMgcCAjIyAwLCAwKSwgdmVjdChQSU5UICMjIHAgIyMgMSwgMSksCVwKKwl2ZWN0KFBJTlQgIyMgcCAjIyAyLCAyKSwgdmVjdChQSU5UICMjIHAgIyMgMywgMyksCVwKKwl2ZWN0KFBJTlQgIyMgcCAjIyA0LCA0KSwgdmVjdChQSU5UICMjIHAgIyMgNSwgNSksCVwKKwl2ZWN0KFBJTlQgIyMgcCAjIyA2LCA2KSwgdmVjdChQSU5UICMjIHAgIyMgNywgNyksCisKKyNkZWZpbmUgSU5UQ19QSU5UKHAsIG1hc2tfcmVnLCBzZW5zZV9iYXNlLCBzdHIsCQkJCVwKKwllbnVtc18xLCBlbnVtc18yLCBlbnVtc18zLCBlbnVtc180LAkJCQlcCisJdmVjdF8xLCB2ZWN0XzIsIHZlY3RfMywgdmVjdF80LAkJCQkJXAorCW1hc2tfYSwgbWFza19iLCBtYXNrX2MsIG1hc2tfZCwJCQkJCVwKKwlzZW5zZV9hLCBzZW5zZV9iLCBzZW5zZV9jLCBzZW5zZV9kKQkJCQlcCisJCQkJCQkJCQlcCitlbnVtIHsJCQkJCQkJCQlcCisJUElOVCAjIyBwICMjIF9VTlVTRUQgPSAwLAkJCQkJXAorCWVudW1zXzEgZW51bXNfMiBlbnVtc18zIGVudW1zXzQgCQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgcCAjIyBfdmVjdG9yc1tdIF9faW5pdGRhdGEgPSB7CQkJXAorCXZlY3RfMSB2ZWN0XzIgdmVjdF8zIHZlY3RfNAkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgcCAjIyBfbWFza19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJeyBtYXNrX3JlZywgMCwgMzIsIC8qIFBJTlRFUiAqLwkJCQkJXAorCSAgeyBtYXNrX2EgbWFza19iIG1hc2tfYyBtYXNrX2QgfSB9CQkJCVwKK307CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBpbnRjX3NlbnNlX3JlZyBwICMjIF9zZW5zZV9yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewlcCisJeyBzZW5zZV9iYXNlICsgMHgwMCwgMTYsIDIsIC8qIFBJTlRDUiAqLwkJCVwKKwkgIHsgc2Vuc2VfYSB9IH0sCQkJCQkJXAorCXsgc2Vuc2VfYmFzZSArIDB4MDQsIDE2LCAyLCAvKiBQSU5UQ1IgKi8JCQlcCisJICB7IHNlbnNlX2IgfSB9LAkJCQkJCVwKKwl7IHNlbnNlX2Jhc2UgKyAweDA4LCAxNiwgMiwgLyogUElOVENSICovCQkJXAorCSAgeyBzZW5zZV9jIH0gfSwJCQkJCQlcCisJeyBzZW5zZV9iYXNlICsgMHgwYywgMTYsIDIsIC8qIFBJTlRDUiAqLwkJCVwKKwkgIHsgc2Vuc2VfZCB9IH0sCQkJCQkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGludGNfZGVzYyBwICMjIF9kZXNjIF9faW5pdGRhdGEgPSB7CQkJXAorCS5uYW1lID0gc3RyLAkJCQkJCQlcCisJLmh3ID0gSU5UQ19IV19ERVNDKHAgIyMgX3ZlY3RvcnMsIE5VTEwsCQkJCVwKKwkJCSAgICAgcCAjIyBfbWFza19yZWdpc3RlcnMsIE5VTEwsCQlcCisJCQkgICAgIHAgIyMgX3NlbnNlX3JlZ2lzdGVycywgTlVMTCksCQlcCit9CisKKyNlbmRpZiAgLyogX19BU01fTUFDSF9JTlRDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggYWQwMGMzYy4uMGZmYmU4MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTQsNyArNCw0IEBACiAjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoQ09ORklHX01FTU9SWV9TVEFSVCkKICNkZWZpbmUgTUVNX1NJWkUJVUwoQ09ORklHX01FTU9SWV9TSVpFKQogCi0vKiBETUEgbWVtb3J5IGF0IDB4ZjYwMDAwMDAgLSAweGZmZGZmZmZmICovCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgKDE1OCA8PCAyMCkKLQogI2VuZGlmIC8qIF9fQVNNX01BQ0hfTUVNT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL3NoNzNhMC5oIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3M2EwLmgKaW5kZXggMjE2YzNkNi4uODgxZDUxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3M2EwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvc2g3M2EwLmgKQEAgLTQ1MSwxOCArNDUxLDM5IEBACiAJR1BJT19GTl9LRVlJTjVfUFUsCiAJR1BJT19GTl9LRVlJTjZfUFUsCiAJR1BJT19GTl9LRVlJTjdfUFUsCisJR1BJT19GTl9TREhJQ0QwX1BVLAorCUdQSU9fRk5fU0RISUQwXzBfUFUsCisJR1BJT19GTl9TREhJRDBfMV9QVSwKKwlHUElPX0ZOX1NESElEMF8yX1BVLAorCUdQSU9fRk5fU0RISUQwXzNfUFUsCisJR1BJT19GTl9TREhJQ01EMF9QVSwKKwlHUElPX0ZOX1NESElXUDBfUFUsCiAJR1BJT19GTl9TREhJRDFfMF9QVSwKIAlHUElPX0ZOX1NESElEMV8xX1BVLAogCUdQSU9fRk5fU0RISUQxXzJfUFUsCiAJR1BJT19GTl9TREhJRDFfM19QVSwKIAlHUElPX0ZOX1NESElDTUQxX1BVLAorCUdQSU9fRk5fU0RISUQyXzBfUFUsCisJR1BJT19GTl9TREhJRDJfMV9QVSwKKwlHUElPX0ZOX1NESElEMl8yX1BVLAorCUdQSU9fRk5fU0RISUQyXzNfUFUsCisJR1BJT19GTl9TREhJQ01EMl9QVSwKIAlHUElPX0ZOX01NQ0NNRDBfUFUsCiAJR1BJT19GTl9NTUNDTUQxX1BVLAorCUdQSU9fRk5fTU1DRDBfMF9QVSwKKwlHUElPX0ZOX01NQ0QwXzFfUFUsCisJR1BJT19GTl9NTUNEMF8yX1BVLAorCUdQSU9fRk5fTU1DRDBfM19QVSwKKwlHUElPX0ZOX01NQ0QwXzRfUFUsCisJR1BJT19GTl9NTUNEMF81X1BVLAorCUdQSU9fRk5fTU1DRDBfNl9QVSwKKwlHUElPX0ZOX01NQ0QwXzdfUFUsCiAJR1BJT19GTl9GU0lBQ0tfUFUsCiAJR1BJT19GTl9GU0lBSUxSX1BVLAogCUdQSU9fRk5fRlNJQUlCVF9QVSwKIAlHUElPX0ZOX0ZTSUFJU0xEX1BVLAogfTsKKwogLyogRE1BIHNsYXZlIElEcyAqLwogZW51bSB7CiAJU0hETUFfU0xBVkVfSU5WQUxJRCwKQEAgLTQ5NCw0ICs1MTUsOCBAQAogCVNIRE1BX1NMQVZFX01NQ0lGX1JYLAogfTsKIAorLyogUElOVCBpbnRlcnJ1cHRzIGFyZSBsb2NhdGVkIGF0IExpbnV4IElSUSA3NjggYW5kIHVwICovCisjZGVmaW5lIFNINzNBMF9QSU5UMF9JUlEoaXJxKSAoKGlycSkgKyA3NjgpCisjZGVmaW5lIFNINzNBMF9QSU5UMV9JUlEoaXJxKSAoKGlycSkgKyA4MDApCisKICNlbmRpZiAvKiBfX0FTTV9TSDczQTBfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzY3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzY3LmMKaW5kZXggY2M0NDJkMS4uY2ZkZTliZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM2Ny5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNjcuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfaW50Yy5oPgorI2luY2x1ZGUgPG1hY2gvaW50Yy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCkBAIC0zMSw4ICszMiw2IEBACiAJRElTQUJMRUQsCiAKIAkvKiBpbnRlcnJ1cHQgc291cmNlcyBJTlRDQSAqLwotCUlSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSwKLQlJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEsCiAJRElSQywKIAlDUllQVDFfRVJSLCBDUllQVDJfU1RELAogCUlJQzFfQUxJMSwgSUlDMV9UQUNLSTEsIElJQzFfV0FJVEkxLCBJSUMxX0RURUkxLApAQCAtNzYsMTQgKzc1LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IGludGNhX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUlEwQSwgMHgwMjAwKSwgSU5UQ19WRUNUKElSUTFBLCAweDAyMjApLAotCUlOVENfVkVDVChJUlEyQSwgMHgwMjQwKSwgSU5UQ19WRUNUKElSUTNBLCAweDAyNjApLAotCUlOVENfVkVDVChJUlE0QSwgMHgwMjgwKSwgSU5UQ19WRUNUKElSUTVBLCAweDAyYTApLAotCUlOVENfVkVDVChJUlE2QSwgMHgwMmMwKSwgSU5UQ19WRUNUKElSUTdBLCAweDAyZTApLAotCUlOVENfVkVDVChJUlE4QSwgMHgwMzAwKSwgSU5UQ19WRUNUKElSUTlBLCAweDAzMjApLAotCUlOVENfVkVDVChJUlExMEEsIDB4MDM0MCksIElOVENfVkVDVChJUlExMUEsIDB4MDM2MCksCi0JSU5UQ19WRUNUKElSUTEyQSwgMHgwMzgwKSwgSU5UQ19WRUNUKElSUTEzQSwgMHgwM2EwKSwKLQlJTlRDX1ZFQ1QoSVJRMTRBLCAweDAzYzApLCBJTlRDX1ZFQ1QoSVJRMTVBLCAweDAzZTApLAogCUlOVENfVkVDVChESVJDLCAweDA1NjApLAogCUlOVENfVkVDVChDUllQVDFfRVJSLCAweDA1ZTApLAogCUlOVENfVkVDVChDUllQVDJfU1RELCAweDA3MDApLApAQCAtMTYzLDEwICsxNTQsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGludGNhX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwNDAsIDB4ZTY5MDAwNjAsIDgsIC8qIElOVE1TSzAwQSAvIElOVE1TS0NMUjAwQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDA0NCwgMHhlNjkwMDA2NCwgOCwgLyogSU5UTVNLMTBBIC8gSU5UTVNLQ0xSMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCiAJeyAweGU2OTQwMDgwLCAweGU2OTQwMGMwLCA4LCAvKiBJTVIwQSAvIElNQ1IwQSAqLwogCSAgeyBETUFDMl8xX0RFSTMsIERNQUMyXzFfREVJMiwgRE1BQzJfMV9ERUkxLCBETUFDMl8xX0RFSTAsCiAJICAgIEFSTTExX0lSUVBNVSwgMCwgQVJNMTFfQ09NTVRYLCBBUk0xMV9DT01NUlggfSB9LApAQCAtMjEyLDExICsxOTksNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX3ByaW9fcmVnIGludGNhX3ByaW9fcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwMTAsIDAsIDMyLCA0LCAvKiBJTlRQUkkwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMTQsIDAsIDMyLCA0LCAvKiBJTlRQUkkxMEEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQogCXsgMHhlNjk0MDAwMCwgMCwgMTYsIDQsIC8qIElQUkFBICovIHsgRE1BQzNfMSwgRE1BQzNfMiwgQ01UMiwgTENSQyB9IH0sCiAJeyAweGU2OTQwMDA0LCAwLCAxNiwgNCwgLyogSVBSQkEgKi8geyBJUkRBLCBFVE0xMSwgQkJJRjEsIEJCSUYyIH0gfSwKIAl7IDB4ZTY5NDAwMDgsIDAsIDE2LCA0LCAvKiBJUFJDQSAqLyB7IENSWVBUMV9FUlIsIENSWVBUMl9TVEQsCkBAIC0yNDAsMjkgKzIyMiwxOCBAQAogCXsgMHhlNjk0MDAzOCwgMCwgMTYsIDQsIC8qIElQUk9BICovIHsgMCwgMCwgRElSQywgU0RISTIgfSB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpbnRjX3NlbnNlX3JlZyBpbnRjYV9zZW5zZV9yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAwMCwgMTYsIDIsIC8qIElDUjFBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDA0LCAxNiwgMiwgLyogSUNSMkEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBpbnRjYV9hY2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwMjAsIDAsIDgsIC8qIElOVFJFUTAwQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDAyNCwgMCwgOCwgLyogSU5UUkVRMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi19OwotCiBzdGF0aWMgc3RydWN0IGludGNfZGVzYyBpbnRjYV9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAic2g3MzY3LWludGNhIiwKIAkuZm9yY2VfZW5hYmxlID0gRU5BQkxFRCwKIAkuZm9yY2VfZGlzYWJsZSA9IERJU0FCTEVELAogCS5odyA9IElOVENfSFdfREVTQyhpbnRjYV92ZWN0b3JzLCBpbnRjYV9ncm91cHMsCiAJCQkgICBpbnRjYV9tYXNrX3JlZ2lzdGVycywgaW50Y2FfcHJpb19yZWdpc3RlcnMsCi0JCQkgICBpbnRjYV9zZW5zZV9yZWdpc3RlcnMsIGludGNhX2Fja19yZWdpc3RlcnMpLAorCQkJICAgTlVMTCwgTlVMTCksCiB9OwogCitJTlRDX0lSUV9QSU5TXzE2KGludGNhX2lycV9waW5zLCAweGU2OTAwMDAwLAorCQkgSU5UQ19WRUNULCAic2g3MzY3LWludGNhLWlycS1waW5zIik7CisKIGVudW0gewogCVVOVVNFRF9JTlRDUyA9IDAsCiAKQEAgLTQzMiw2ICs0MDMsNyBAQAogCXZvaWQgX19pb21lbSAqaW50ZXZ0c2EgPSBpb3JlbWFwX25vY2FjaGUoMHhmZmQyMDEwMCwgUEFHRV9TSVpFKTsKIAogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y2FfZGVzYyk7CisJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjYV9pcnFfcGluc19kZXNjKTsKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNzX2Rlc2MpOwogCiAJLyogZGVtdXggdXNpbmcgSU5URVZUU0EgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzIuYwppbmRleCAyOWNkYzA1Li4yZDg4NTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Mi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zaF9pbnRjLmg+CisjaW5jbHVkZSA8bWFjaC9pbnRjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKQEAgLTI5LDEwICszMCw2IEBACiAJVU5VU0VEX0lOVENBID0gMCwKIAogCS8qIGludGVycnVwdCBzb3VyY2VzIElOVENBICovCi0JSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBLAotCUlSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSwKLQlJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSwKLQlJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSwKIAlESVJDLAogCUNSWVBUX1NURCwKIAlJSUMxX0FMSTEsIElJQzFfVEFDS0kxLCBJSUMxX1dBSVRJMSwgSUlDMV9EVEVJMSwKQEAgLTg2LDIyICs4Myw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCBpbnRjYV92ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKLQlJTlRDX1ZFQ1QoSVJRMEEsIDB4MDIwMCksIElOVENfVkVDVChJUlExQSwgMHgwMjIwKSwKLQlJTlRDX1ZFQ1QoSVJRMkEsIDB4MDI0MCksIElOVENfVkVDVChJUlEzQSwgMHgwMjYwKSwKLQlJTlRDX1ZFQ1QoSVJRNEEsIDB4MDI4MCksIElOVENfVkVDVChJUlE1QSwgMHgwMmEwKSwKLQlJTlRDX1ZFQ1QoSVJRNkEsIDB4MDJjMCksIElOVENfVkVDVChJUlE3QSwgMHgwMmUwKSwKLQlJTlRDX1ZFQ1QoSVJROEEsIDB4MDMwMCksIElOVENfVkVDVChJUlE5QSwgMHgwMzIwKSwKLQlJTlRDX1ZFQ1QoSVJRMTBBLCAweDAzNDApLCBJTlRDX1ZFQ1QoSVJRMTFBLCAweDAzNjApLAotCUlOVENfVkVDVChJUlExMkEsIDB4MDM4MCksIElOVENfVkVDVChJUlExM0EsIDB4MDNhMCksCi0JSU5UQ19WRUNUKElSUTE0QSwgMHgwM2MwKSwgSU5UQ19WRUNUKElSUTE1QSwgMHgwM2UwKSwKLQlJTlRDX1ZFQ1QoSVJRMTZBLCAweDMyMDApLCBJTlRDX1ZFQ1QoSVJRMTdBLCAweDMyMjApLAotCUlOVENfVkVDVChJUlExOEEsIDB4MzI0MCksIElOVENfVkVDVChJUlExOUEsIDB4MzI2MCksCi0JSU5UQ19WRUNUKElSUTIwQSwgMHgzMjgwKSwgSU5UQ19WRUNUKElSUTIxQSwgMHgzMmEwKSwKLQlJTlRDX1ZFQ1QoSVJRMjJBLCAweDMyYzApLCBJTlRDX1ZFQ1QoSVJRMjNBLCAweDMyZTApLAotCUlOVENfVkVDVChJUlEyNEEsIDB4MzMwMCksIElOVENfVkVDVChJUlEyNUEsIDB4MzMyMCksCi0JSU5UQ19WRUNUKElSUTI2QSwgMHgzMzQwKSwgSU5UQ19WRUNUKElSUTI3QSwgMHgzMzYwKSwKLQlJTlRDX1ZFQ1QoSVJRMjhBLCAweDMzODApLCBJTlRDX1ZFQ1QoSVJRMjlBLCAweDMzYTApLAotCUlOVENfVkVDVChJUlEzMEEsIDB4MzNjMCksIElOVENfVkVDVChJUlEzMUEsIDB4MzNlMCksCiAJSU5UQ19WRUNUKERJUkMsIDB4MDU2MCksCiAJSU5UQ19WRUNUKENSWVBUX1NURCwgMHgwNzAwKSwKIAlJTlRDX1ZFQ1QoSUlDMV9BTEkxLCAweDA3ODApLCBJTlRDX1ZFQ1QoSUlDMV9UQUNLSTEsIDB4MDdhMCksCkBAIC0yMDMsMTUgKzE4NCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgaW50Y2FfbWFza19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDA0MCwgMHhlNjkwMDA2MCwgOCwgLyogSU5UTVNLMDBBIC8gSU5UTVNLQ0xSMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDQ0LCAweGU2OTAwMDY0LCA4LCAvKiBJTlRNU0sxMEEgLyBJTlRNU0tDTFIxMEEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwNDgsIDB4ZTY5MDAwNjgsIDgsIC8qIElOVE1TSzIwQSAvIElOVE1TS0NMUjIwQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDRjLCAweGU2OTAwMDZjLCA4LCAvKiBJTlRNU0szMEEgLyBJTlRNU0tDTFIzMEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotCiAJeyAweGU2OTQwMDgwLCAweGU2OTQwMGMwLCA4LCAvKiBJTVIwQSAvIElNQ1IwQSAqLwogCSAgeyBETUFDMl8xX0RFSTMsIERNQUMyXzFfREVJMiwgRE1BQzJfMV9ERUkxLCBETUFDMl8xX0RFSTAsCiAJICAgIEFQX0FSTV9JUlFQTVUsIDAsIEFQX0FSTV9DT01NVFgsIEFQX0FSTV9DT01NUlggfSB9LApAQCAtMjgyLDE1ICsyNTQsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX3ByaW9fcmVnIGludGNhX3ByaW9fcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwMTAsIDAsIDMyLCA0LCAvKiBJTlRQUkkwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMTQsIDAsIDMyLCA0LCAvKiBJTlRQUkkxMEEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwMTgsIDAsIDMyLCA0LCAvKiBJTlRQUkkyMEEgKi8KLQkgIHsgSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EgfSB9LAotCXsgMHhlNjkwMDAxYywgMCwgMzIsIDQsIC8qIElOVFBSSTMwQSAqLwotCSAgeyBJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSB9IH0sCi0KIAl7IDB4ZTY5NDAwMDAsIDAsIDE2LCA0LCAvKiBJUFJBQSAqLyB7IERNQUMzXzEsIERNQUMzXzIsIENNVDIsIDAgfSB9LAogCXsgMHhlNjk0MDAwNCwgMCwgMTYsIDQsIC8qIElQUkJBICovIHsgSVJEQSwgMCwgQkJJRjEsIEJCSUYyIH0gfSwKIAl7IDB4ZTY5NDAwMDgsIDAsIDE2LCA0LCAvKiBJUFJDQSAqLyB7IDAsIENSWVBUX1NURCwKQEAgLTMzNiwzMyArMjk5LDEzIEBACiAJeyAweGU2OTUwMDUwLCAwLCAxNiwgNCwgLyogSVBSVUEzICovIHsgVVNCSFNETUFDMV9VU0hETUksIDAsIDAsIDAgfSB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBpbnRjX3NlbnNlX3JlZyBpbnRjYV9zZW5zZV9yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0gewotCXsgMHhlNjkwMDAwMCwgMzIsIDQsIC8qIElDUjFBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDA0LCAzMiwgNCwgLyogSUNSMkEgKi8KLQkgIHsgSVJROEEsIElSUTlBLCBJUlExMEEsIElSUTExQSwgSVJRMTJBLCBJUlExM0EsIElSUTE0QSwgSVJRMTVBIH0gfSwKLQl7IDB4ZTY5MDAwMDgsIDMyLCA0LCAvKiBJQ1IzQSAqLwotCSAgeyBJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSB9IH0sCi0JeyAweGU2OTAwMDBjLCAzMiwgNCwgLyogSUNSNEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotfTsKK3N0YXRpYyBERUNMQVJFX0lOVENfREVTQyhpbnRjYV9kZXNjLCAic2g3MzcyLWludGNhIiwKKwkJCSBpbnRjYV92ZWN0b3JzLCBpbnRjYV9ncm91cHMsCisJCQkgaW50Y2FfbWFza19yZWdpc3RlcnMsIGludGNhX3ByaW9fcmVnaXN0ZXJzLAorCQkJIE5VTEwpOwogCi1zdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgaW50Y2FfYWNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDIwLCAwLCA4LCAvKiBJTlRSRVEwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMjQsIDAsIDgsIC8qIElOVFJFUTEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotCXsgMHhlNjkwMDAyOCwgMCwgOCwgLyogSU5UUkVRMjBBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwMmMsIDAsIDgsIC8qIElOVFJFUTMwQSAqLwotCSAgeyBJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSB9IH0sCi19OwotCi1zdGF0aWMgREVDTEFSRV9JTlRDX0RFU0NfQUNLKGludGNhX2Rlc2MsICJzaDczNzItaW50Y2EiLAotCQkJICAgICBpbnRjYV92ZWN0b3JzLCBpbnRjYV9ncm91cHMsCi0JCQkgICAgIGludGNhX21hc2tfcmVnaXN0ZXJzLCBpbnRjYV9wcmlvX3JlZ2lzdGVycywKLQkJCSAgICAgaW50Y2Ffc2Vuc2VfcmVnaXN0ZXJzLCBpbnRjYV9hY2tfcmVnaXN0ZXJzKTsKLQorSU5UQ19JUlFfUElOU18zMihpbnRjYV9pcnFfcGlucywgMHhlNjkwMDAwMCwKKwkJIElOVENfVkVDVCwgInNoNzM3Mi1pbnRjYS1pcnEtcGlucyIpOwogZW51bSB7CiAJVU5VU0VEX0lOVENTID0gMCwKIAlFTkFCTEVEX0lOVENTLApAQCAtNjE4LDYgKzU2MSw3IEBACiAJaW50Y3NfZmZkNSA9IGlvcmVtYXBfbm9jYWNoZSgweGZmZDUwMDAwLCBQQUdFX1NJWkUpOwogCiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjYV9kZXNjKTsKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNhX2lycV9waW5zX2Rlc2MpOwogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y3NfZGVzYyk7CiAKIAkvKiBkZW11eCB1c2luZyBJTlRFVlRTQSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Ny5jCmluZGV4IGZlNDUxNTQuLjJhZjRlNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3Mzc3LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2ludGMuaD4KKyNpbmNsdWRlIDxtYWNoL2ludGMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIApAQCAtMzEsMTAgKzMyLDYgQEAKIAlESVNBQkxFRCwKIAogCS8qIGludGVycnVwdCBzb3VyY2VzIElOVENBICovCi0JSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBLAotCUlSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSwKLQlJUlExNkEsIElSUTE3QSwgSVJRMThBLCBJUlExOUEsIElSUTIwQSwgSVJRMjFBLCBJUlEyMkEsIElSUTIzQSwKLQlJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSwKIAlESVJDLAogCV8yREcsCiAJQ1JZUFRfU1RELApAQCAtOTEsMjIgKzg4LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IGludGNhX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0gewotCUlOVENfVkVDVChJUlEwQSwgMHgwMjAwKSwgSU5UQ19WRUNUKElSUTFBLCAweDAyMjApLAotCUlOVENfVkVDVChJUlEyQSwgMHgwMjQwKSwgSU5UQ19WRUNUKElSUTNBLCAweDAyNjApLAotCUlOVENfVkVDVChJUlE0QSwgMHgwMjgwKSwgSU5UQ19WRUNUKElSUTVBLCAweDAyYTApLAotCUlOVENfVkVDVChJUlE2QSwgMHgwMmMwKSwgSU5UQ19WRUNUKElSUTdBLCAweDAyZTApLAotCUlOVENfVkVDVChJUlE4QSwgMHgwMzAwKSwgSU5UQ19WRUNUKElSUTlBLCAweDAzMjApLAotCUlOVENfVkVDVChJUlExMEEsIDB4MDM0MCksIElOVENfVkVDVChJUlExMUEsIDB4MDM2MCksCi0JSU5UQ19WRUNUKElSUTEyQSwgMHgwMzgwKSwgSU5UQ19WRUNUKElSUTEzQSwgMHgwM2EwKSwKLQlJTlRDX1ZFQ1QoSVJRMTRBLCAweDAzYzApLCBJTlRDX1ZFQ1QoSVJRMTVBLCAweDAzZTApLAotCUlOVENfVkVDVChJUlExNkEsIDB4MzIwMCksIElOVENfVkVDVChJUlExN0EsIDB4MzIyMCksCi0JSU5UQ19WRUNUKElSUTE4QSwgMHgzMjQwKSwgSU5UQ19WRUNUKElSUTE5QSwgMHgzMjYwKSwKLQlJTlRDX1ZFQ1QoSVJRMjBBLCAweDMyODApLCBJTlRDX1ZFQ1QoSVJRMzFBLCAweDMyYTApLAotCUlOVENfVkVDVChJUlEyMkEsIDB4MzJjMCksIElOVENfVkVDVChJUlEyM0EsIDB4MzJlMCksCi0JSU5UQ19WRUNUKElSUTI0QSwgMHgzMzAwKSwgSU5UQ19WRUNUKElSUTI1QSwgMHgzMzIwKSwKLQlJTlRDX1ZFQ1QoSVJRMjZBLCAweDMzNDApLCBJTlRDX1ZFQ1QoSVJRMjdBLCAweDMzNjApLAotCUlOVENfVkVDVChJUlEyOEEsIDB4MzM4MCksIElOVENfVkVDVChJUlEyOUEsIDB4MzNhMCksCi0JSU5UQ19WRUNUKElSUTMwQSwgMHgzM2MwKSwgSU5UQ19WRUNUKElSUTMxQSwgMHgzM2UwKSwKIAlJTlRDX1ZFQ1QoRElSQywgMHgwNTYwKSwKIAlJTlRDX1ZFQ1QoXzJERywgMHgwNWUwKSwKIAlJTlRDX1ZFQ1QoQ1JZUFRfU1RELCAweDA3MDApLApAQCAtMjAzLDE1ICsxODQsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGludGNhX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4ZTY5MDAwNDAsIDB4ZTY5MDAwNjAsIDgsIC8qIElOVE1TSzAwQSAvIElOVE1TS0NMUjAwQSAqLwotCSAgeyBJUlEwQSwgSVJRMUEsIElSUTJBLCBJUlEzQSwgSVJRNEEsIElSUTVBLCBJUlE2QSwgSVJRN0EgfSB9LAotCXsgMHhlNjkwMDA0NCwgMHhlNjkwMDA2NCwgOCwgLyogSU5UTVNLMTBBIC8gSU5UTVNLQ0xSMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0JeyAweGU2OTAwMDQ4LCAweGU2OTAwMDY4LCA4LCAvKiBJTlRNU0syMEEgLyBJTlRNU0tDTFIyMEEgKi8KLQkgIHsgSVJRMTZBLCBJUlExN0EsIElSUTE4QSwgSVJRMTlBLCBJUlEyMEEsIElSUTIxQSwgSVJRMjJBLCBJUlEyM0EgfSB9LAotCXsgMHhlNjkwMDA0YywgMHhlNjkwMDA2YywgOCwgLyogSU5UTVNLMzBBIC8gSU5UTVNLQ0xSMzBBICovCi0JICB7IElSUTI0QSwgSVJRMjVBLCBJUlEyNkEsIElSUTI3QSwgSVJRMjhBLCBJUlEyOUEsIElSUTMwQSwgSVJRMzFBIH0gfSwKLQogCXsgMHhlNjk0MDA4MCwgMHhlNjk0MDBjMCwgOCwgLyogSU1SMEEgLyBJTUNSMEEgKi8KIAkgIHsgRE1BQzJfMV9ERUkzLCBETUFDMl8xX0RFSTIsIERNQUMyXzFfREVJMSwgRE1BQzJfMV9ERUkwLAogCSAgICBBUF9BUk1fSVJRUE1VLCAwLCBBUF9BUk1fQ09NTVRYLCBBUF9BUk1fQ09NTVJYIH0gfSwKQEAgLTI3MywxNSArMjQ1LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBpbnRjYV9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJMDBBICovCi0JICB7IElSUTBBLCBJUlExQSwgSVJRMkEsIElSUTNBLCBJUlE0QSwgSVJRNUEsIElSUTZBLCBJUlE3QSB9IH0sCi0JeyAweGU2OTAwMDE0LCAwLCAzMiwgNCwgLyogSU5UUFJJMTBBICovCi0JICB7IElSUThBLCBJUlE5QSwgSVJRMTBBLCBJUlExMUEsIElSUTEyQSwgSVJRMTNBLCBJUlExNEEsIElSUTE1QSB9IH0sCi0JeyAweGU2OTAwMDE4LCAwLCAzMiwgNCwgLyogSU5UUFJJMTBBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwMWMsIDAsIDMyLCA0LCAvKiBJTlRQUkkzMEEgKi8KLQkgIHsgSVJRMjRBLCBJUlEyNUEsIElSUTI2QSwgSVJRMjdBLCBJUlEyOEEsIElSUTI5QSwgSVJRMzBBLCBJUlEzMUEgfSB9LAotCiAJeyAweGU2OTQwMDAwLCAwLCAxNiwgNCwgLyogSVBSQUEgKi8geyBETUFDM18xLCBETUFDM18yLCBDTVQyLCBMQ1JDIH0gfSwKIAl7IDB4ZTY5NDAwMDQsIDAsIDE2LCA0LCAvKiBJUFJCQSAqLyB7IElSREEsIDAsIEJCSUYxLCBCQklGMiB9IH0sCiAJeyAweGU2OTQwMDA4LCAwLCAxNiwgNCwgLyogSVBSQ0EgKi8geyBfMkRHLCBDUllQVF9TVEQsCkBAIC0zMTUsMzcgKzI3OCwxOCBAQAogCXsgMHhlNjk0MDAzYywgMCwgMTYsIDQsIC8qIElQUlBBMyAqLyB7IFNDSUZBNiwgMCwgMCwgMCB9IH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGludGNfc2Vuc2VfcmVnIGludGNhX3NlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDAwLCAxNiwgMiwgLyogSUNSMUEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMDQsIDE2LCAyLCAvKiBJQ1IyQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotCXsgMHhlNjkwMDAwOCwgMTYsIDIsIC8qIElDUjNBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwMGMsIDE2LCAyLCAvKiBJQ1I0QSAqLwotCSAgeyBJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSB9IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgaW50Y2FfYWNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGU2OTAwMDIwLCAwLCA4LCAvKiBJTlRSRVEwMEEgKi8KLQkgIHsgSVJRMEEsIElSUTFBLCBJUlEyQSwgSVJRM0EsIElSUTRBLCBJUlE1QSwgSVJRNkEsIElSUTdBIH0gfSwKLQl7IDB4ZTY5MDAwMjQsIDAsIDgsIC8qIElOVFJFUTEwQSAqLwotCSAgeyBJUlE4QSwgSVJROUEsIElSUTEwQSwgSVJRMTFBLCBJUlExMkEsIElSUTEzQSwgSVJRMTRBLCBJUlExNUEgfSB9LAotCXsgMHhlNjkwMDAyOCwgMCwgOCwgLyogSU5UUkVRMjBBICovCi0JICB7IElSUTE2QSwgSVJRMTdBLCBJUlExOEEsIElSUTE5QSwgSVJRMjBBLCBJUlEyMUEsIElSUTIyQSwgSVJRMjNBIH0gfSwKLQl7IDB4ZTY5MDAwMmMsIDAsIDgsIC8qIElOVFJFUTMwQSAqLwotCSAgeyBJUlEyNEEsIElSUTI1QSwgSVJRMjZBLCBJUlEyN0EsIElSUTI4QSwgSVJRMjlBLCBJUlEzMEEsIElSUTMxQSB9IH0sCi19OwotCiBzdGF0aWMgc3RydWN0IGludGNfZGVzYyBpbnRjYV9kZXNjIF9faW5pdGRhdGEgPSB7CiAJLm5hbWUgPSAic2g3Mzc3LWludGNhIiwKIAkuZm9yY2VfZW5hYmxlID0gRU5BQkxFRCwKIAkuZm9yY2VfZGlzYWJsZSA9IERJU0FCTEVELAogCS5odyA9IElOVENfSFdfREVTQyhpbnRjYV92ZWN0b3JzLCBpbnRjYV9ncm91cHMsCiAJCQkgICBpbnRjYV9tYXNrX3JlZ2lzdGVycywgaW50Y2FfcHJpb19yZWdpc3RlcnMsCi0JCQkgICBpbnRjYV9zZW5zZV9yZWdpc3RlcnMsIGludGNhX2Fja19yZWdpc3RlcnMpLAorCQkJICAgTlVMTCwgTlVMTCksCiB9OwogCitJTlRDX0lSUV9QSU5TXzMyKGludGNhX2lycV9waW5zLCAweGU2OTAwMDAwLAorCQkgSU5UQ19WRUNULCAic2g3Mzc3LWludGNhLWlycS1waW5zIik7CisKIC8qIHRoaXMgbWFjcm8gaWdub3JlIGVudHJ5IHdoaWNoIGlzIGFsc28gaW4gSU5UQ0EgKi8KICNkZWZpbmUgX19JR05PUkUoYS4uLikKICNkZWZpbmUgX19JR05PUkUwKGEuLi4pIDAKQEAgLTYzOCw2ICs1ODIsNyBAQAogCXZvaWQgX19pb21lbSAqaW50ZXZ0c2EgPSBpb3JlbWFwX25vY2FjaGUoSU5URVZUU0EsIFBBR0VfU0laRSk7CiAKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNhX2Rlc2MpOworCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y2FfaXJxX3BpbnNfZGVzYyk7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjc19kZXNjKTsKIAogCS8qIGRlbXV4IHVzaW5nIElOVEVWVFNBICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKaW5kZXggYTkxMWE2MC4uMWVkYTZiMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYwpAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfaW50Yy5oPgorI2luY2x1ZGUgPG1hY2gvaW50Yy5oPgorI2luY2x1ZGUgPG1hY2gvc2g3M2EwLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMjU1LDIwICsyNTcsMjA1IEBACiAJcmV0dXJuIDA7IC8qIGFsd2F5cyBhbGxvdyB3YWtldXAgKi8KIH0KIAorI2RlZmluZSBSRUxPQ19CQVNFIDB4MTAwMAorCisvKiBJTlRDQSBJUlEgcGlucyBhdCBJTlRDUyArIDB4MTAwMCB0byBtYWtlIHNwYWNlIGZvciBHSUMrSU5UQyBoYW5kbGluZyAqLworI2RlZmluZSBJTlRDU19WRUNUX1JFTE9DKG4sIHZlY3QpIElOVENTX1ZFQ1QoKG4pLCAodmVjdCkgKyBSRUxPQ19CQVNFKQorCitJTlRDX0lSUV9QSU5TXzMyKGludGNhX2lycV9waW5zLCAweGU2OTAwMDAwLAorCQkgSU5UQ1NfVkVDVF9SRUxPQywgInNoNzNhMC1pbnRjYS1pcnEtcGlucyIpOworCitzdGF0aWMgaW50IHRvX2dpY19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCB2ZWN0ID0gaXJxMmV2dChkYXRhLT5pcnEpIC0gSU5UQ1NfVkVDVF9CQVNFOworCisJaWYgKHZlY3QgPj0gMHgzMjAwKQorCQl2ZWN0IC09IDB4MzAwMDsKKwllbHNlCisJCXZlY3QgLT0gMHgwMjAwOworCisJcmV0dXJuIGdpY19zcGkoKHZlY3QgPj4gNSkgKyAxKTsKK30KKworc3RhdGljIGludCB0b19pbnRjYV9yZWxvY19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5pcnEgKyAoUkVMT0NfQkFTRSA+PiA1KTsKK30KKworI2RlZmluZSBpcnFfY2IoY2IsIGlycSkgaXJxX2dldF9jaGlwKGlycSktPmNiKGlycV9nZXRfaXJxX2RhdGEoaXJxKSkKKyNkZWZpbmUgaXJxX2NicChjYiwgaXJxLCBwLi4uKSBpcnFfZ2V0X2NoaXAoaXJxKS0+Y2IoaXJxX2dldF9pcnFfZGF0YShpcnEpLCBwKQorCitzdGF0aWMgdm9pZCBpbnRjYV9naWNfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpcnFfY2IoaXJxX3VubWFzaywgdG9faW50Y2FfcmVsb2NfaXJxKGRhdGEpKTsKKwlpcnFfY2IoaXJxX3VubWFzaywgdG9fZ2ljX2lycShkYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkIGludGNhX2dpY19kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpcnFfY2IoaXJxX21hc2ssIHRvX2dpY19pcnEoZGF0YSkpOworCWlycV9jYihpcnFfbWFzaywgdG9faW50Y2FfcmVsb2NfaXJxKGRhdGEpKTsKK30KKworc3RhdGljIHZvaWQgaW50Y2FfZ2ljX21hc2tfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpcnFfY2IoaXJxX21hc2ssIHRvX2dpY19pcnEoZGF0YSkpOworCWlycV9jYihpcnFfbWFza19hY2ssIHRvX2ludGNhX3JlbG9jX2lycShkYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkIGludGNhX2dpY19lb2koc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWlycV9jYihpcnFfZW9pLCB0b19naWNfaXJxKGRhdGEpKTsKK30KKworc3RhdGljIGludCBpbnRjYV9naWNfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gaXJxX2NicChpcnFfc2V0X3R5cGUsIHRvX2ludGNhX3JlbG9jX2lycShkYXRhKSwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgaW50Y2FfZ2ljX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQoreworCXJldHVybiBpcnFfY2JwKGlycV9zZXRfd2FrZSwgdG9faW50Y2FfcmVsb2NfaXJxKGRhdGEpLCBvbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgaW50IGludGNhX2dpY19zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkYXRhLAorCQkJCSAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCisJCQkJICBib29sIGZvcmNlKQoreworCXJldHVybiBpcnFfY2JwKGlycV9zZXRfYWZmaW5pdHksIHRvX2dpY19pcnEoZGF0YSksIGNwdW1hc2ssIGZvcmNlKTsKK30KKyNlbmRpZgorCitzdHJ1Y3QgaXJxX2NoaXAgaW50Y2FfZ2ljX2lycV9jaGlwID0geworCS5uYW1lCQkJPSAiSU5UQ0EtR0lDIiwKKwkuaXJxX21hc2sJCT0gaW50Y2FfZ2ljX2Rpc2FibGUsCisJLmlycV91bm1hc2sJCT0gaW50Y2FfZ2ljX2VuYWJsZSwKKwkuaXJxX21hc2tfYWNrCQk9IGludGNhX2dpY19tYXNrX2FjaywKKwkuaXJxX2VvaQkJPSBpbnRjYV9naWNfZW9pLAorCS5pcnFfZW5hYmxlCQk9IGludGNhX2dpY19lbmFibGUsCisJLmlycV9kaXNhYmxlCQk9IGludGNhX2dpY19kaXNhYmxlLAorCS5pcnFfc2h1dGRvd24JCT0gaW50Y2FfZ2ljX2Rpc2FibGUsCisJLmlycV9zZXRfdHlwZQkJPSBpbnRjYV9naWNfc2V0X3R5cGUsCisJLmlycV9zZXRfd2FrZQkJPSBpbnRjYV9naWNfc2V0X3dha2UsCisjaWZkZWYgQ09ORklHX1NNUAorCS5pcnFfc2V0X2FmZmluaXR5CT0gaW50Y2FfZ2ljX3NldF9hZmZpbml0eSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCB0b19pbnRjX3ZlY3QoaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxX3BpbiA9IGlycSAtIGdpY19zcGkoMSk7CisJdW5zaWduZWQgaW50IG9mZnM7CisKKwlpZiAoaXJxX3BpbiA8IDE2KQorCQlvZmZzID0gMHgwMjAwOworCWVsc2UKKwkJb2ZmcyA9IDB4MzAwMDsKKworCXJldHVybiBvZmZzICsgKGlycV9waW4gPDwgNSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaDczYTBfaXJxX3Bpbl9kZW11eChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJZ2VuZXJpY19oYW5kbGVfaXJxKGludGNzX2V2dDJpcnEodG9faW50Y192ZWN0KGlycSkpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHNoNzNhMF9pcnFfcGluX2Nhc2NhZGVbMzJdOworCisjZGVmaW5lIFBJTlRFUjAgMHhlNjkwMDBhMAorI2RlZmluZSBQSU5URVIxIDB4ZTY5MDAwYTQKKyNkZWZpbmUgUElOVFJSMCAweGU2OTAwMGQwCisjZGVmaW5lIFBJTlRSUjEgMHhlNjkwMDBkNAorCisjZGVmaW5lIFBJTlQwQV9JUlEobiwgaXJxKSBJTlRDX0lSUSgobiksIFNINzNBMF9QSU5UMF9JUlEoaXJxKSkKKyNkZWZpbmUgUElOVDBCX0lSUShuLCBpcnEpIElOVENfSVJRKChuKSwgU0g3M0EwX1BJTlQwX0lSUShpcnEgKyA4KSkKKyNkZWZpbmUgUElOVDBDX0lSUShuLCBpcnEpIElOVENfSVJRKChuKSwgU0g3M0EwX1BJTlQwX0lSUShpcnEgKyAxNikpCisjZGVmaW5lIFBJTlQwRF9JUlEobiwgaXJxKSBJTlRDX0lSUSgobiksIFNINzNBMF9QSU5UMF9JUlEoaXJxICsgMjQpKQorI2RlZmluZSBQSU5UMUVfSVJRKG4sIGlycSkgSU5UQ19JUlEoKG4pLCBTSDczQTBfUElOVDFfSVJRKGlycSkpCisKK0lOVENfUElOVChpbnRjX3BpbnQwLCBQSU5URVIwLCAweGU2OTAwMGIwLCAic2g3M2EwLXBpbnQwIiwJCVwKKyAgSU5UQ19QSU5UX0UoQSksIElOVENfUElOVF9FKEIpLCBJTlRDX1BJTlRfRShDKSwgSU5UQ19QSU5UX0UoRCksCVwKKyAgSU5UQ19QSU5UX1YoQSwgUElOVDBBX0lSUSksIElOVENfUElOVF9WKEIsIFBJTlQwQl9JUlEpLAkJXAorICBJTlRDX1BJTlRfVihDLCBQSU5UMENfSVJRKSwgSU5UQ19QSU5UX1YoRCwgUElOVDBEX0lSUSksCQlcCisgIElOVENfUElOVF9FKEEpLCBJTlRDX1BJTlRfRShCKSwgSU5UQ19QSU5UX0UoQyksIElOVENfUElOVF9FKEQpLAlcCisgIElOVENfUElOVF9FKEEpLCBJTlRDX1BJTlRfRShCKSwgSU5UQ19QSU5UX0UoQyksIElOVENfUElOVF9FKEQpKTsKKworSU5UQ19QSU5UKGludGNfcGludDEsIFBJTlRFUjEsIDB4ZTY5MDAwYzAsICJzaDczYTAtcGludDEiLAkJXAorICBJTlRDX1BJTlRfRShFKSwgSU5UQ19QSU5UX0VfRU1QVFksIElOVENfUElOVF9FX0VNUFRZLCBJTlRDX1BJTlRfRV9FTVBUWSwgXAorICBJTlRDX1BJTlRfVihFLCBQSU5UMUVfSVJRKSwgSU5UQ19QSU5UX1ZfTk9ORSwJCQkJXAorICBJTlRDX1BJTlRfVl9OT05FLCBJTlRDX1BJTlRfVl9OT05FLAkJCQkJXAorICBJTlRDX1BJTlRfRV9OT05FLCBJTlRDX1BJTlRfRV9OT05FLCBJTlRDX1BJTlRfRV9OT05FLCBJTlRDX1BJTlRfRShFKSwgXAorICBJTlRDX1BJTlRfRShFKSwgSU5UQ19QSU5UX0VfTk9ORSwgSU5UQ19QSU5UX0VfTk9ORSwgSU5UQ19QSU5UX0VfTk9ORSk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHNoNzNhMF9waW50MF9jYXNjYWRlOworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc2g3M2EwX3BpbnQxX2Nhc2NhZGU7CisKK3N0YXRpYyB2b2lkIHBpbnRfZGVtdXgodW5zaWduZWQgbG9uZyByciwgdW5zaWduZWQgbG9uZyBlciwgaW50IGJhc2VfaXJxKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAgaW9yZWFkMzIocnIpICYgaW9yZWFkMzIoZXIpOworCWludCBrOworCisJZm9yIChrID0gMDsgayA8IDMyOyBrKyspIHsKKwkJaWYgKHZhbHVlICYgKDEgPDwgKDMxIC0gaykpKSB7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoYmFzZV9pcnEgKyBrKTsKKwkJCWlvd3JpdGUzMih+KDEgPDwgKDMxIC0gaykpLCBycik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaDczYTBfcGludDBfZGVtdXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXBpbnRfZGVtdXgoUElOVFJSMCwgUElOVEVSMCwgU0g3M0EwX1BJTlQwX0lSUSgwKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2g3M2EwX3BpbnQxX2RlbXV4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlwaW50X2RlbXV4KFBJTlRSUjEsIFBJTlRFUjEsIFNINzNBMF9QSU5UMV9JUlEoMCkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogdm9pZCBfX2luaXQgc2g3M2EwX2luaXRfaXJxKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpnaWNfZGlzdF9iYXNlID0gX19pbygweGYwMDAxMDAwKTsKIAl2b2lkIF9faW9tZW0gKmdpY19jcHVfYmFzZSA9IF9faW8oMHhmMDAwMDEwMCk7CiAJdm9pZCBfX2lvbWVtICppbnRldnRzYSA9IGlvcmVtYXBfbm9jYWNoZSgweGZmZDIwMTAwLCBQQUdFX1NJWkUpOworCWludCBrLCBuOwogCiAJZ2ljX2luaXQoMCwgMjksIGdpY19kaXN0X2Jhc2UsIGdpY19jcHVfYmFzZSk7CiAJZ2ljX2FyY2hfZXh0bi5pcnFfc2V0X3dha2UgPSBzaDczYTBfc2V0X3dha2U7CiAKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNzX2Rlc2MpOworCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y2FfaXJxX3BpbnNfZGVzYyk7CisJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX3BpbnQwX2Rlc2MpOworCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y19waW50MV9kZXNjKTsKIAogCS8qIGRlbXV4IHVzaW5nIElOVEVWVFNBICovCiAJc2g3M2EwX2ludGNzX2Nhc2NhZGUubmFtZSA9ICJJTlRDUyBjYXNjYWRlIjsKIAlzaDczYTBfaW50Y3NfY2FzY2FkZS5oYW5kbGVyID0gc2g3M2EwX2ludGNzX2RlbXV4OwogCXNoNzNhMF9pbnRjc19jYXNjYWRlLmRldl9pZCA9IGludGV2dHNhOwogCXNldHVwX2lycShnaWNfc3BpKDUwKSwgJnNoNzNhMF9pbnRjc19jYXNjYWRlKTsKKworCS8qIElSUSBwaW5zIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZyB0aHJvdWdoIElOVENBIGFuZCBHSUMgKi8KKwlmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykgeworCQlzaDczYTBfaXJxX3Bpbl9jYXNjYWRlW2tdLm5hbWUgPSAiSU5UQ0EtR0lDIGNhc2NhZGUiOworCQlzaDczYTBfaXJxX3Bpbl9jYXNjYWRlW2tdLmhhbmRsZXIgPSBzaDczYTBfaXJxX3Bpbl9kZW11eDsKKwkJc2V0dXBfaXJxKGdpY19zcGkoMSArIGspLCAmc2g3M2EwX2lycV9waW5fY2FzY2FkZVtrXSk7CisKKwkJbiA9IGludGNzX2V2dDJpcnEodG9faW50Y192ZWN0KGdpY19zcGkoMSArIGspKSk7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKG4sICZpbnRjYV9naWNfaXJxX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOworCQlzZXRfaXJxX2ZsYWdzKG4sIElSUUZfVkFMSUQpOyAvKiB5dWNrICovCisJfQorCisJLyogUElOVCBwaW5zIGFyZSBzYW5lbHkgdGllZCB0byB0aGUgR0lDIGFzIFNQSSAqLworCXNoNzNhMF9waW50MF9jYXNjYWRlLm5hbWUgPSAiUElOVDAgY2FzY2FkZSI7CisJc2g3M2EwX3BpbnQwX2Nhc2NhZGUuaGFuZGxlciA9IHNoNzNhMF9waW50MF9kZW11eDsKKwlzZXR1cF9pcnEoZ2ljX3NwaSgzMyksICZzaDczYTBfcGludDBfY2FzY2FkZSk7CisKKwlzaDczYTBfcGludDFfY2FzY2FkZS5uYW1lID0gIlBJTlQxIGNhc2NhZGUiOworCXNoNzNhMF9waW50MV9jYXNjYWRlLmhhbmRsZXIgPSBzaDczYTBfcGludDFfZGVtdXg7CisJc2V0dXBfaXJxKGdpY19zcGkoMzQpLCAmc2g3M2EwX3BpbnQxX2Nhc2NhZGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzY3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNjcuYwppbmRleCAxMjg1NTVlLi5lNmU1MjQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNjcuYwpAQCAtMjEsNjggKzIxLDQ5IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvc2g3MzY3Lmg+CiAKLSNkZWZpbmUgXzEoZm4sIHBmeCwgc2Z4KSBmbihwZngsIHNmeCkKLQotI2RlZmluZSBfMTAoZm4sIHBmeCwgc2Z4KQkJCQlcCi0JXzEoZm4sIHBmeCMjMCwgc2Z4KSwgXzEoZm4sIHBmeCMjMSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzIsIHNmeCksIF8xKGZuLCBwZngjIzMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM0LCBzZngpLCBfMShmbiwgcGZ4IyM1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNiwgc2Z4KSwgXzEoZm4sIHBmeCMjNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzgsIHNmeCksIF8xKGZuLCBwZngjIzksIHNmeCkKLQotI2RlZmluZSBfOTAoZm4sIHBmeCwgc2Z4KQkJCQlcCi0JXzEwKGZuLCBwZngjIzEsIHNmeCksIF8xMChmbiwgcGZ4IyMyLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzMsIHNmeCksIF8xMChmbiwgcGZ4IyM0LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzUsIHNmeCksIF8xMChmbiwgcGZ4IyM2LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzcsIHNmeCksIF8xMChmbiwgcGZ4IyM4LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzksIHNmeCkKLQotI2RlZmluZSBfMjczKGZuLCBwZngsIHNmeCkJCVwKLQlfMTAoZm4sIHBmeCwgc2Z4KSwgXzkwKGZuLCBwZngsIHNmeCksCQlcCi0JXzEwKGZuLCBwZngjIzEwLCBzZngpLCBfOTAoZm4sIHBmeCMjMSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyMCwgc2Z4KSwgXzEwKGZuLCBwZngjIzIxLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzIyLCBzZngpLCBfMTAoZm4sIHBmeCMjMjMsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjQsIHNmeCksIF8xMChmbiwgcGZ4IyMyNSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyNiwgc2Z4KSwgXzEoZm4sIHBmeCMjMjcwLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMjcxLCBzZngpLCBfMShmbiwgcGZ4IyMyNzIsIHNmeCkKLQotI2RlZmluZSBfUE9SVChwZngsIHNmeCkgcGZ4IyNfIyNzZngKLSNkZWZpbmUgUE9SVF8yNzMoc3RyKSBfMjczKF9QT1JULCBQT1JULCBzdHIpCisjZGVmaW5lIENQVV9BTExfUE9SVChmbiwgcGZ4LCBzZngpCQkJCVwKKwlQT1JUXzEwKGZuLCBwZngsIHNmeCksIFBPUlRfOTAoZm4sIHBmeCwgc2Z4KSwJCVwKKwlQT1JUXzEwKGZuLCBwZngjIzEwLCBzZngpLCBQT1JUXzkwKGZuLCBwZngjIzEsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzIwLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzIxLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyMywgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjQsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzI2LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMjcwLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzI3MSwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzI3Miwgc2Z4KQogCiBlbnVtIHsKIAlQSU5NVVhfUkVTRVJWRUQgPSAwLAogCiAJUElOTVVYX0RBVEFfQkVHSU4sCi0JUE9SVF8yNzMoREFUQSksIC8qIFBPUlQwX0RBVEEgLT4gUE9SVDI3Ml9EQVRBICovCisJUE9SVF9BTEwoREFUQSksIC8qIFBPUlQwX0RBVEEgLT4gUE9SVDI3Ml9EQVRBICovCiAJUElOTVVYX0RBVEFfRU5ELAogCiAJUElOTVVYX0lOUFVUX0JFR0lOLAotCVBPUlRfMjczKElOKSwgLyogUE9SVDBfSU4gLT4gUE9SVDI3Ml9JTiAqLworCVBPUlRfQUxMKElOKSwgLyogUE9SVDBfSU4gLT4gUE9SVDI3Ml9JTiAqLwogCVBJTk1VWF9JTlBVVF9FTkQsCiAKIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0JFR0lOLAotCVBPUlRfMjczKElOX1BVKSwgLyogUE9SVDBfSU5fUFUgLT4gUE9SVDI3Ml9JTl9QVSAqLworCVBPUlRfQUxMKElOX1BVKSwgLyogUE9SVDBfSU5fUFUgLT4gUE9SVDI3Ml9JTl9QVSAqLwogCVBJTk1VWF9JTlBVVF9QVUxMVVBfRU5ELAogCiAJUElOTVVYX0lOUFVUX1BVTExET1dOX0JFR0lOLAotCVBPUlRfMjczKElOX1BEKSwgLyogUE9SVDBfSU5fUEQgLT4gUE9SVDI3Ml9JTl9QRCAqLworCVBPUlRfQUxMKElOX1BEKSwgLyogUE9SVDBfSU5fUEQgLT4gUE9SVDI3Ml9JTl9QRCAqLwogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9FTkQsCiAKIAlQSU5NVVhfT1VUUFVUX0JFR0lOLAotCVBPUlRfMjczKE9VVCksIC8qIFBPUlQwX09VVCAtPiBQT1JUMjcyX09VVCAqLworCVBPUlRfQUxMKE9VVCksIC8qIFBPUlQwX09VVCAtPiBQT1JUMjcyX09VVCAqLwogCVBJTk1VWF9PVVRQVVRfRU5ELAogCiAJUElOTVVYX0ZVTkNUSU9OX0JFR0lOLAotCVBPUlRfMjczKEZOX0lOKSwgLyogUE9SVDBfRk5fSU4gLT4gUE9SVDI3Ml9GTl9JTiAqLwotCVBPUlRfMjczKEZOX09VVCksIC8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMjcyX0ZOX09VVCAqLwotCVBPUlRfMjczKEZOMCksIC8qIFBPUlQwX0ZOMCAtPiBQT1JUMjcyX0ZOMCAqLwotCVBPUlRfMjczKEZOMSksIC8qIFBPUlQwX0ZOMSAtPiBQT1JUMjcyX0ZOMSAqLwotCVBPUlRfMjczKEZOMiksIC8qIFBPUlQwX0ZOMiAtPiBQT1JUMjcyX0ZOMiAqLwotCVBPUlRfMjczKEZOMyksIC8qIFBPUlQwX0ZOMyAtPiBQT1JUMjcyX0ZOMyAqLwotCVBPUlRfMjczKEZONCksIC8qIFBPUlQwX0ZONCAtPiBQT1JUMjcyX0ZONCAqLwotCVBPUlRfMjczKEZONSksIC8qIFBPUlQwX0ZONSAtPiBQT1JUMjcyX0ZONSAqLwotCVBPUlRfMjczKEZONiksIC8qIFBPUlQwX0ZONiAtPiBQT1JUMjcyX0ZONiAqLwotCVBPUlRfMjczKEZONyksIC8qIFBPUlQwX0ZONyAtPiBQT1JUMjcyX0ZONyAqLworCVBPUlRfQUxMKEZOX0lOKSwgLyogUE9SVDBfRk5fSU4gLT4gUE9SVDI3Ml9GTl9JTiAqLworCVBPUlRfQUxMKEZOX09VVCksIC8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMjcyX0ZOX09VVCAqLworCVBPUlRfQUxMKEZOMCksIC8qIFBPUlQwX0ZOMCAtPiBQT1JUMjcyX0ZOMCAqLworCVBPUlRfQUxMKEZOMSksIC8qIFBPUlQwX0ZOMSAtPiBQT1JUMjcyX0ZOMSAqLworCVBPUlRfQUxMKEZOMiksIC8qIFBPUlQwX0ZOMiAtPiBQT1JUMjcyX0ZOMiAqLworCVBPUlRfQUxMKEZOMyksIC8qIFBPUlQwX0ZOMyAtPiBQT1JUMjcyX0ZOMyAqLworCVBPUlRfQUxMKEZONCksIC8qIFBPUlQwX0ZONCAtPiBQT1JUMjcyX0ZONCAqLworCVBPUlRfQUxMKEZONSksIC8qIFBPUlQwX0ZONSAtPiBQT1JUMjcyX0ZONSAqLworCVBPUlRfQUxMKEZONiksIC8qIFBPUlQwX0ZONiAtPiBQT1JUMjcyX0ZONiAqLworCVBPUlRfQUxMKEZONyksIC8qIFBPUlQwX0ZONyAtPiBQT1JUMjcyX0ZONyAqLwogCiAJTVNFTEJDUl9NU0VMMl8xLCBNU0VMQkNSX01TRUwyXzAsCiAJUElOTVVYX0ZVTkNUSU9OX0VORCwKQEAgLTMyNyw0MSArMzA4LDYgQEAKIAlQSU5NVVhfTUFSS19FTkQsCiB9OwogCi0jZGVmaW5lIFBPUlRfREFUQV9JKG5yKSBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19JTikKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QRChucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUFUobnIpIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BVKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BVX1BEKG5yKSBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwgUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfTyhucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VUKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JTyhucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QRChucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVShucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BVKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JT19QVV9QRChucikgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VULCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELCBQT1JUIyNuciMjX0lOX1BVKQotCi0KIHN0YXRpYyBwaW5tdXhfZW51bV90IHBpbm11eF9kYXRhW10gPSB7CiAKIAkvKiBzcGVjaWZ5IHZhbGlkIHBpbiBzdGF0ZXMgZm9yIGVhY2ggcGluIGluIEdQSU8gbW9kZSAqLwpAQCAtMTA5OCwxMyArMTA0NCw5IEBACiAJUElOTVVYX0RBVEEoRElWTE9DS19NQVJLLCBQT1JUMjcyX0ZOMSksCiB9OwogCi0jZGVmaW5lIF9HUElPX1BPUlQocGZ4LCBzZngpIFBJTk1VWF9HUElPKEdQSU9fUE9SVCMjcGZ4LCBQT1JUIyNwZngjI19EQVRBKQotI2RlZmluZSBHUElPX1BPUlRfMjczKCkgXzI3MyhfR1BJT19QT1JULCAsIHVudXNlZCkKLSNkZWZpbmUgR1BJT19GTihzdHIpIFBJTk1VWF9HUElPKEdQSU9fRk5fIyNzdHIsIHN0ciMjX01BUkspCi0KIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2dwaW8gcGlubXV4X2dwaW9zW10gPSB7CiAJLyogNDktMSAtPiA0OS02IChHUElPKSAqLwotCUdQSU9fUE9SVF8yNzMoKSwKKwlHUElPX1BPUlRfQUxMKCksCiAKIAkvKiBTcGVjaWFsIFB1bGwtdXAgLyBQdWxsLWRvd24gRnVuY3Rpb25zICovCiAJR1BJT19GTihQT1JUNDhfS0VZSU4wX1BVKSwgR1BJT19GTihQT1JUNDlfS0VZSU4xX1BVKSwKQEAgLTEzNDUsMjIgKzEyODcsNiBAQAogCUdQSU9fRk4oRElWTE9DSyksCiB9OwogCi0vKiBoZWxwZXIgZm9yIHRvcCA0IGJpdHMgaW4gUE9SVG5DUiAqLwotI2RlZmluZSBQQ1JIKGluLCBpbl9wZCwgaW5fcHUsIG91dCkJCVwKLQkwLCAob3V0KSwgKGluKSwgMCwJCQlcCi0JMCwgMCwgMCwgMCwJCQkJXAotCTAsIDAsIChpbl9wZCksIDAsCQkJXAotCTAsIDAsIChpbl9wdSksIDAKLQotI2RlZmluZSBQT1JUQ1IobnIsIHJlZykJCQkJCQlcCi0JeyBQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CQlcCi0JCVBDUkgoUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwJCVwKLQkJICAgICBQT1JUIyNuciMjX0lOX1BVLCBQT1JUIyNuciMjX09VVCksCQlcCi0JCVBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0ZOMSwgUE9SVCMjbnIjI19GTjIsCVwKLQkJUE9SVCMjbnIjI19GTjMsCVBPUlQjI25yIyNfRk40LCBQT1JUIyNuciMjX0ZONSwJXAotCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcgfQkJXAotCX0KLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyBwaW5tdXhfY29uZmlnX3JlZ3NbXSA9IHsKIAlQT1JUQ1IoMCwgMHhlNjA1MDAwMCksIC8qIFBPUlQwQ1IgKi8KIAlQT1JUQ1IoMSwgMHhlNjA1MDAwMSksIC8qIFBPUlQxQ1IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGZjLXNoNzM3Mi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzcyLmMKaW5kZXggOWMyNjVkYS4uMWJkNjU4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3MzcyLmMKQEAgLTI1LDI3ICsyNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3NoNzM3Mi5oPgogCi0jZGVmaW5lIF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCi0KLSNkZWZpbmUgXzEwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xKGZuLCBwZngjIzAsIHNmeCksIF8xKGZuLCBwZngjIzEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyLCBzZngpLCBfMShmbiwgcGZ4IyMzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNCwgc2Z4KSwgXzEoZm4sIHBmeCMjNSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzYsIHNmeCksIF8xKGZuLCBwZngjIzcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM4LCBzZngpLCBfMShmbiwgcGZ4IyM5LCBzZngpCi0KLSNkZWZpbmUgXzgwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xMChmbiwgcGZ4IyMxLCBzZngpLAlfMTAoZm4sIHBmeCMjMiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMzLCBzZngpLAlfMTAoZm4sIHBmeCMjNCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM1LCBzZngpLAlfMTAoZm4sIHBmeCMjNiwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM3LCBzZngpLAlfMTAoZm4sIHBmeCMjOCwgc2Z4KQotCi0jZGVmaW5lIF8xOTAoZm4sIHBmeCwgc2Z4KSBcCi0JXzEwKGZuLCBwZngsIHNmeCksIF84MChmbiwgcGZ4LCBzZngpLCBfMTAoZm4sIHBmeCMjOSwgc2Z4KSwgXAotCV8xMChmbiwgcGZ4IyMxMCwgc2Z4KSwgXzgwKGZuLCBwZngjIzEsIHNmeCksIF8xKGZuLCBwZngjIzE5MCwgc2Z4KQotCi0jZGVmaW5lIF9QT1JUKHBmeCwgc2Z4KSBwZngjI18jI3NmeAotI2RlZmluZSBQT1JUX0FMTChzdHIpIF8xOTAoX1BPUlQsIFBPUlQsIHN0cikKKyNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBwZngsIHNmeCkgXAorCVBPUlRfMTAoZm4sIHBmeCwgc2Z4KSwJCVBPUlRfOTAoZm4sIHBmeCwgc2Z4KSwgXAorCVBPUlRfMTAoZm4sIHBmeCMjMTAsIHNmeCksCVBPUlRfMTAoZm4sIHBmeCMjMTEsIHNmeCksIFwKKwlQT1JUXzEwKGZuLCBwZngjIzEyLCBzZngpLAlQT1JUXzEwKGZuLCBwZngjIzEzLCBzZngpLCBcCisJUE9SVF8xMChmbiwgcGZ4IyMxNCwgc2Z4KSwJUE9SVF8xMChmbiwgcGZ4IyMxNSwgc2Z4KSwgXAorCVBPUlRfMTAoZm4sIHBmeCMjMTYsIHNmeCksCVBPUlRfMTAoZm4sIHBmeCMjMTcsIHNmeCksIFwKKwlQT1JUXzEwKGZuLCBwZngjIzE4LCBzZngpLAlQT1JUXzEoZm4sIHBmeCMjMTkwLCBzZngpCiAKIGVudW0gewogCVBJTk1VWF9SRVNFUlZFRCA9IDAsCkBAIC0zODEsMTA4ICszNjcsMTI0IEBACiAJUElOTVVYX01BUktfRU5ELAogfTsKIAotLyogUE9SVF9EQVRBX0lfUEQobnIpICovCi0jZGVmaW5lIF9JX19fRChucikJCQkgICAgIFwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBcCi0JCSAgICBQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BEKQotCi0vKiBQT1JUX0RBVEFfSV9QVShucikgKi8KLSNkZWZpbmUgX0lfX1VfKG5yKQkJCSAgICAgXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCi0KLS8qIFBPUlRfREFUQV9JX1BVX1BEKG5yKSAqLwotI2RlZmluZSBfSV9fVUQobnIpCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgXAotCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwgUE9SVCMjbnIjI19JTl9QVSkKLQotLyogUE9SVF9EQVRBX08obnIpICovCi0jZGVmaW5lIF9fT19fXyhucikJCQkJCQkJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfT1VUKQotCi0vKiBQT1JUX0RBVEFfSU8obnIpICovCi0jZGVmaW5lIF9JT19fXyhucikJCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4pCi0KLS8qIFBPUlRfREFUQV9JT19QRChucikgKi8KLSNkZWZpbmUgX0lPX19EKG5yKQkJCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCi0KLS8qIFBPUlRfREFUQV9JT19QVShucikgKi8KLSNkZWZpbmUgX0lPX1VfKG5yKQkJCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCi0KLS8qIFBPUlRfREFUQV9JT19QVV9QRChucikgKi8KLSNkZWZpbmUgX0lPX1VEKG5yKQkJCQkJICAgICBcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsIFwKLQkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCi0KLQogc3RhdGljIHBpbm11eF9lbnVtX3QgcGlubXV4X2RhdGFbXSA9IHsKIAogCS8qIHNwZWNpZnkgdmFsaWQgcGluIHN0YXRlcyBmb3IgZWFjaCBwaW4gaW4gR1BJTyBtb2RlICovCisJUE9SVF9EQVRBX0lPX1BEKDApLAkJUE9SVF9EQVRBX0lPX1BEKDEpLAorCVBPUlRfREFUQV9PKDIpLAkJCVBPUlRfREFUQV9JX1BEKDMpLAorCVBPUlRfREFUQV9JX1BEKDQpLAkJUE9SVF9EQVRBX0lfUEQoNSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDYpLAkJUE9SVF9EQVRBX0lfUEQoNyksCisJUE9SVF9EQVRBX0lPX1BEKDgpLAkJUE9SVF9EQVRBX08oOSksCiAKLQlfSU9fX0QoMCksIF9JT19fRCgxKSwgX19PX19fKDIpLCBfSV9fX0QoMyksIF9JX19fRCg0KSwKLQlfSV9fX0QoNSksIF9JT19VRCg2KSwgX0lfX19EKDcpLCBfSU9fX0QoOCksIF9fT19fXyg5KSwKKwlQT1JUX0RBVEFfTygxMCksCQlQT1JUX0RBVEFfTygxMSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDEyKSwJCVBPUlRfREFUQV9JT19QRCgxMyksCisJUE9SVF9EQVRBX0lPX1BEKDE0KSwJCVBPUlRfREFUQV9PKDE1KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTYpLAkJUE9SVF9EQVRBX0lPX1BEKDE3KSwKKwlQT1JUX0RBVEFfSV9QRCgxOCksCQlQT1JUX0RBVEFfSU8oMTkpLAogCi0JX19PX19fKDEwKSwgX19PX19fKDExKSwgX0lPX1VEKDEyKSwgX0lPX19EKDEzKSwgX0lPX19EKDE0KSwKLQlfX09fX18oMTUpLCBfSU9fX0QoMTYpLCBfSU9fX0QoMTcpLCBfSV9fX0QoMTgpLCBfSU9fX18oMTkpLAorCVBPUlRfREFUQV9JTygyMCksCQlQT1JUX0RBVEFfSU8oMjEpLAorCVBPUlRfREFUQV9JTygyMiksCQlQT1JUX0RBVEFfSU8oMjMpLAorCVBPUlRfREFUQV9JTygyNCksCQlQT1JUX0RBVEFfSU8oMjUpLAorCVBPUlRfREFUQV9JTygyNiksCQlQT1JUX0RBVEFfSU8oMjcpLAorCVBPUlRfREFUQV9JTygyOCksCQlQT1JUX0RBVEFfSU8oMjkpLAogCi0JX0lPX19fKDIwKSwgX0lPX19fKDIxKSwgX0lPX19fKDIyKSwgX0lPX19fKDIzKSwgX0lPX19fKDI0KSwKLQlfSU9fX18oMjUpLCBfSU9fX18oMjYpLCBfSU9fX18oMjcpLCBfSU9fX18oMjgpLCBfSU9fX18oMjkpLAorCVBPUlRfREFUQV9JTygzMCksCQlQT1JUX0RBVEFfSU8oMzEpLAorCVBPUlRfREFUQV9JTygzMiksCQlQT1JUX0RBVEFfSU8oMzMpLAorCVBPUlRfREFUQV9JTygzNCksCQlQT1JUX0RBVEFfSU8oMzUpLAorCVBPUlRfREFUQV9JTygzNiksCQlQT1JUX0RBVEFfSU8oMzcpLAorCVBPUlRfREFUQV9JTygzOCksCQlQT1JUX0RBVEFfSU8oMzkpLAogCi0JX0lPX19fKDMwKSwgX0lPX19fKDMxKSwgX0lPX19fKDMyKSwgX0lPX19fKDMzKSwgX0lPX19fKDM0KSwKLQlfSU9fX18oMzUpLCBfSU9fX18oMzYpLCBfSU9fX18oMzcpLCBfSU9fX18oMzgpLCBfSU9fX18oMzkpLAorCVBPUlRfREFUQV9JTyg0MCksCQlQT1JUX0RBVEFfSU8oNDEpLAorCVBPUlRfREFUQV9JTyg0MiksCQlQT1JUX0RBVEFfSU8oNDMpLAorCVBPUlRfREFUQV9JTyg0NCksCQlQT1JUX0RBVEFfSU8oNDUpLAorCVBPUlRfREFUQV9JT19QVSg0NiksCQlQT1JUX0RBVEFfSU9fUFUoNDcpLAorCVBPUlRfREFUQV9JT19QVSg0OCksCQlQT1JUX0RBVEFfSU9fUFUoNDkpLAogCi0JX0lPX19fKDQwKSwgX0lPX19fKDQxKSwgX0lPX19fKDQyKSwgX0lPX19fKDQzKSwgX0lPX19fKDQ0KSwKLQlfSU9fX18oNDUpLCBfSU9fVV8oNDYpLCBfSU9fVV8oNDcpLCBfSU9fVV8oNDgpLCBfSU9fVV8oNDkpLAorCVBPUlRfREFUQV9JT19QVSg1MCksCQlQT1JUX0RBVEFfSU9fUFUoNTEpLAorCVBPUlRfREFUQV9JT19QVSg1MiksCQlQT1JUX0RBVEFfSU9fUFUoNTMpLAorCVBPUlRfREFUQV9JT19QVSg1NCksCQlQT1JUX0RBVEFfSU9fUFUoNTUpLAorCVBPUlRfREFUQV9JT19QVSg1NiksCQlQT1JUX0RBVEFfSU9fUFUoNTcpLAorCVBPUlRfREFUQV9JT19QVSg1OCksCQlQT1JUX0RBVEFfSU9fUFUoNTkpLAogCi0JX0lPX1VfKDUwKSwgX0lPX1VfKDUxKSwgX0lPX1VfKDUyKSwgX0lPX1VfKDUzKSwgX0lPX1VfKDU0KSwKLQlfSU9fVV8oNTUpLCBfSU9fVV8oNTYpLCBfSU9fVV8oNTcpLCBfSU9fVV8oNTgpLCBfSU9fVV8oNTkpLAorCVBPUlRfREFUQV9JT19QVSg2MCksCQlQT1JUX0RBVEFfSU9fUFUoNjEpLAorCVBPUlRfREFUQV9JTyg2MiksCQlQT1JUX0RBVEFfTyg2MyksCisJUE9SVF9EQVRBX08oNjQpLAkJUE9SVF9EQVRBX0lPX1BVKDY1KSwKKwlQT1JUX0RBVEFfTyg2NiksCQlQT1JUX0RBVEFfSU9fUFUoNjcpLCAgLyo2Nj8qLworCVBPUlRfREFUQV9PKDY4KSwJCVBPUlRfREFUQV9JTyg2OSksCiAKLQlfSU9fVV8oNjApLCBfSU9fVV8oNjEpLCBfSU9fX18oNjIpLCBfX09fX18oNjMpLCBfX09fX18oNjQpLAotCV9JT19VXyg2NSksIF9fT19fXyg2NiksIF9JT19VXyg2NyksIF9fT19fXyg2OCksIF9JT19fXyg2OSksIC8qNjY/Ki8KKwlQT1JUX0RBVEFfSU8oNzApLAkJUE9SVF9EQVRBX0lPKDcxKSwKKwlQT1JUX0RBVEFfTyg3MiksCQlQT1JUX0RBVEFfSV9QVSg3MyksCisJUE9SVF9EQVRBX0lfUFVfUEQoNzQpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDc1KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoNzYpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDc3KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoNzgpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDc5KSwKIAotCV9JT19fXyg3MCksIF9JT19fXyg3MSksIF9fT19fXyg3MiksIF9JX19VXyg3MyksIF9JX19VRCg3NCksCi0JX0lPX1VEKDc1KSwgX0lPX1VEKDc2KSwgX0lPX1VEKDc3KSwgX0lPX1VEKDc4KSwgX0lPX1VEKDc5KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoODApLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDgxKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoODIpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDgzKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoODQpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDg1KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoODYpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDg3KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoODgpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDg5KSwKIAotCV9JT19VRCg4MCksIF9JT19VRCg4MSksIF9JT19VRCg4MiksIF9JT19VRCg4MyksIF9JT19VRCg4NCksCi0JX0lPX1VEKDg1KSwgX0lPX1VEKDg2KSwgX0lPX1VEKDg3KSwgX0lPX1VEKDg4KSwgX0lPX1VEKDg5KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoOTApLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDkxKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoOTIpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDkzKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoOTQpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDk1KSwKKwlQT1JUX0RBVEFfSU9fUFUoOTYpLAkJUE9SVF9EQVRBX0lPX1BVX1BEKDk3KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoOTgpLAkJUE9SVF9EQVRBX08oOTkpLCAvKjk5PyovCiAKLQlfSU9fVUQoOTApLCBfSU9fVUQoOTEpLCBfSU9fVUQoOTIpLCBfSU9fVUQoOTMpLCBfSU9fVUQoOTQpLAotCV9JT19VRCg5NSksIF9JT19VXyg5NiksIF9JT19VRCg5NyksIF9JT19VRCg5OCksIF9fT19fXyg5OSksIC8qOTk/Ki8KKwlQT1JUX0RBVEFfSU9fUEQoMTAwKSwJCVBPUlRfREFUQV9JT19QRCgxMDEpLAorCVBPUlRfREFUQV9JT19QRCgxMDIpLAkJUE9SVF9EQVRBX0lPX1BEKDEwMyksCisJUE9SVF9EQVRBX0lPX1BEKDEwNCksCQlQT1JUX0RBVEFfSU9fUEQoMTA1KSwKKwlQT1JUX0RBVEFfSU9fUFUoMTA2KSwJCVBPUlRfREFUQV9JT19QVSgxMDcpLAorCVBPUlRfREFUQV9JT19QVSgxMDgpLAkJUE9SVF9EQVRBX0lPX1BVKDEwOSksCiAKLQlfSU9fX0QoMTAwKSwgX0lPX19EKDEwMSksIF9JT19fRCgxMDIpLCBfSU9fX0QoMTAzKSwgX0lPX19EKDEwNCksCi0JX0lPX19EKDEwNSksIF9JT19VXygxMDYpLCBfSU9fVV8oMTA3KSwgX0lPX1VfKDEwOCksIF9JT19VXygxMDkpLAorCVBPUlRfREFUQV9JT19QVSgxMTApLAkJUE9SVF9EQVRBX0lPX1BVKDExMSksCisJUE9SVF9EQVRBX0lPX1BEKDExMiksCQlQT1JUX0RBVEFfSU9fUEQoMTEzKSwKKwlQT1JUX0RBVEFfSU9fUFUoMTE0KSwJCVBPUlRfREFUQV9JT19QVSgxMTUpLAorCVBPUlRfREFUQV9JT19QVSgxMTYpLAkJUE9SVF9EQVRBX0lPX1BVKDExNyksCisJUE9SVF9EQVRBX0lPX1BVKDExOCksCQlQT1JUX0RBVEFfSU9fUFUoMTE5KSwKIAotCV9JT19VXygxMTApLCBfSU9fVV8oMTExKSwgX0lPX19EKDExMiksIF9JT19fRCgxMTMpLCBfSU9fVV8oMTE0KSwKLQlfSU9fVV8oMTE1KSwgX0lPX1VfKDExNiksIF9JT19VXygxMTcpLCBfSU9fVV8oMTE4KSwgX0lPX1VfKDExOSksCisJUE9SVF9EQVRBX0lPX1BVKDEyMCksCQlQT1JUX0RBVEFfSU9fUEQoMTIxKSwKKwlQT1JUX0RBVEFfSU9fUEQoMTIyKSwJCVBPUlRfREFUQV9JT19QRCgxMjMpLAorCVBPUlRfREFUQV9JT19QRCgxMjQpLAkJUE9SVF9EQVRBX0lPX1BEKDEyNSksCisJUE9SVF9EQVRBX0lPX1BEKDEyNiksCQlQT1JUX0RBVEFfSU9fUEQoMTI3KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTI4KSwJCVBPUlRfREFUQV9JT19QVV9QRCgxMjkpLAogCi0JX0lPX1VfKDEyMCksIF9JT19fRCgxMjEpLCBfSU9fX0QoMTIyKSwgX0lPX19EKDEyMyksIF9JT19fRCgxMjQpLAotCV9JT19fRCgxMjUpLCBfSU9fX0QoMTI2KSwgX0lPX19EKDEyNyksIF9JT19fRCgxMjgpLCBfSU9fVUQoMTI5KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTMwKSwJUE9SVF9EQVRBX0lPX1BVX1BEKDEzMSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDEzMiksCVBPUlRfREFUQV9JT19QVV9QRCgxMzMpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxMzQpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTM1KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTM2KSwJCVBPUlRfREFUQV9JT19QRCgxMzcpLAorCVBPUlRfREFUQV9JT19QRCgxMzgpLAkJUE9SVF9EQVRBX0lPX1BEKDEzOSksCiAKLQlfSU9fVUQoMTMwKSwgX0lPX1VEKDEzMSksIF9JT19VRCgxMzIpLCBfSU9fVUQoMTMzKSwgX0lPX1VEKDEzNCksCi0JX0lPX1VEKDEzNSksIF9JT19fRCgxMzYpLCBfSU9fX0QoMTM3KSwgX0lPX19EKDEzOCksIF9JT19fRCgxMzkpLAorCVBPUlRfREFUQV9JT19QRCgxNDApLAkJUE9SVF9EQVRBX0lPX1BEKDE0MSksCisJUE9SVF9EQVRBX0lPX1BEKDE0MiksCQlQT1JUX0RBVEFfSU9fUFVfUEQoMTQzKSwKKwlQT1JUX0RBVEFfSU9fUEQoMTQ0KSwJCVBPUlRfREFUQV9JT19QRCgxNDUpLAorCVBPUlRfREFUQV9JT19QRCgxNDYpLAkJUE9SVF9EQVRBX0lPX1BEKDE0NyksCisJUE9SVF9EQVRBX0lPX1BEKDE0OCksCQlQT1JUX0RBVEFfSU9fUEQoMTQ5KSwKIAotCV9JT19fRCgxNDApLCBfSU9fX0QoMTQxKSwgX0lPX19EKDE0MiksIF9JT19VRCgxNDMpLCBfSU9fX0QoMTQ0KSwKLQlfSU9fX0QoMTQ1KSwgX0lPX19EKDE0NiksIF9JT19fRCgxNDcpLCBfSU9fX0QoMTQ4KSwgX0lPX19EKDE0OSksCisJUE9SVF9EQVRBX0lPX1BEKDE1MCksCQlQT1JUX0RBVEFfSU9fUEQoMTUxKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTUyKSwJUE9SVF9EQVRBX0lfUEQoMTUzKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTU0KSwJUE9SVF9EQVRBX0lfUEQoMTU1KSwKKwlQT1JUX0RBVEFfSU9fUEQoMTU2KSwJCVBPUlRfREFUQV9JT19QRCgxNTcpLAorCVBPUlRfREFUQV9JX1BEKDE1OCksCQlQT1JUX0RBVEFfSU9fUEQoMTU5KSwKIAotCV9JT19fRCgxNTApLCBfSU9fX0QoMTUxKSwgX0lPX1VEKDE1MiksIF9JX19fRCgxNTMpLCBfSU9fVUQoMTU0KSwKLQlfSV9fX0QoMTU1KSwgX0lPX19EKDE1NiksIF9JT19fRCgxNTcpLCBfSV9fX0QoMTU4KSwgX0lPX19EKDE1OSksCisJUE9SVF9EQVRBX08oMTYwKSwJCVBPUlRfREFUQV9JT19QRCgxNjEpLAorCVBPUlRfREFUQV9JT19QRCgxNjIpLAkJUE9SVF9EQVRBX0lPX1BEKDE2MyksCisJUE9SVF9EQVRBX0lfUEQoMTY0KSwJCVBPUlRfREFUQV9JT19QRCgxNjUpLAorCVBPUlRfREFUQV9JX1BEKDE2NiksCQlQT1JUX0RBVEFfSV9QRCgxNjcpLAorCVBPUlRfREFUQV9JX1BEKDE2OCksCQlQT1JUX0RBVEFfSV9QRCgxNjkpLAogCi0JX19PX19fKDE2MCksIF9JT19fRCgxNjEpLCBfSU9fX0QoMTYyKSwgX0lPX19EKDE2MyksIF9JX19fRCgxNjQpLAotCV9JT19fRCgxNjUpLCBfSV9fX0QoMTY2KSwgX0lfX19EKDE2NyksIF9JX19fRCgxNjgpLCBfSV9fX0QoMTY5KSwKKwlQT1JUX0RBVEFfSV9QRCgxNzApLAkJUE9SVF9EQVRBX08oMTcxKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTcyKSwJUE9SVF9EQVRBX0lPX1BVX1BEKDE3MyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE3NCksCVBPUlRfREFUQV9JT19QVV9QRCgxNzUpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxNzYpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTc3KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTc4KSwJUE9SVF9EQVRBX08oMTc5KSwKIAotCV9JX19fRCgxNzApLCBfX09fX18oMTcxKSwgX0lPX1VEKDE3MiksIF9JT19VRCgxNzMpLCBfSU9fVUQoMTc0KSwKLQlfSU9fVUQoMTc1KSwgX0lPX1VEKDE3NiksIF9JT19VRCgxNzcpLCBfSU9fVUQoMTc4KSwgX19PX19fKDE3OSksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE4MCksCVBPUlRfREFUQV9JT19QVV9QRCgxODEpLAorCVBPUlRfREFUQV9JT19QVV9QRCgxODIpLAlQT1JUX0RBVEFfSU9fUFVfUEQoMTgzKSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTg0KSwJUE9SVF9EQVRBX08oMTg1KSwKKwlQT1JUX0RBVEFfSU9fUFVfUEQoMTg2KSwJUE9SVF9EQVRBX0lPX1BVX1BEKDE4NyksCisJUE9SVF9EQVRBX0lPX1BVX1BEKDE4OCksCVBPUlRfREFUQV9JT19QVV9QRCgxODkpLAogCi0JX0lPX1VEKDE4MCksIF9JT19VRCgxODEpLCBfSU9fVUQoMTgyKSwgX0lPX1VEKDE4MyksIF9JT19VRCgxODQpLAotCV9fT19fXygxODUpLCBfSU9fVUQoMTg2KSwgX0lPX1VEKDE4NyksIF9JT19VRCgxODgpLCBfSU9fVUQoMTg5KSwKLQotCV9JT19VRCgxOTApLAorCVBPUlRfREFUQV9JT19QVV9QRCgxOTApLAogCiAJLyogSVJRICovCiAJUElOTVVYX0RBVEEoSVJRMF82X01BUkssCVBPUlQ2X0ZOMCwgCU1TRUwxQ1JfMF8wKSwKQEAgLTkyNiwxMCArOTI4LDYgQEAKIAlQSU5NVVhfREFUQShNRkl2NF9NQVJLLAkJTVNFTDRDUl82XzEpLAogfTsKIAotI2RlZmluZSBfR1BJT19QT1JUKHBmeCwgc2Z4KSBQSU5NVVhfR1BJTyhHUElPX1BPUlQjI3BmeCwgUE9SVCMjcGZ4IyNfREFUQSkKLSNkZWZpbmUgR1BJT19QT1JUX0FMTCgpIF8xOTAoX0dQSU9fUE9SVCwgLCB1bnVzZWQpCi0jZGVmaW5lIEdQSU9fRk4oc3RyKSBQSU5NVVhfR1BJTyhHUElPX0ZOXyMjc3RyLCBzdHIjI19NQVJLKQotCiBzdGF0aWMgc3RydWN0IHBpbm11eF9ncGlvIHBpbm11eF9ncGlvc1tdID0gewogCiAJLyogUE9SVCAqLwpAQCAtMTIwMSwyMiArMTE5OSw2IEBACiAJR1BJT19GTihTREVOQ19EVl9DTEtJKSwKIH07CiAKLS8qIGhlbHBlciBmb3IgdG9wIDQgYml0cyBpbiBQT1JUbkNSICovCi0jZGVmaW5lIFBDUkgoaW4sIGluX3BkLCBpbl9wdSwgb3V0KQkJXAotCTAsIChvdXQpLCAoaW4pLCAwLAkJCVwKLQkwLCAwLCAwLCAwLAkJCQlcCi0JMCwgMCwgKGluX3BkKSwgMCwJCQlcCi0JMCwgMCwgKGluX3B1KSwgMAotCi0jZGVmaW5lIFBPUlRDUihuciwgcmVnKQkJCQkJCVwKLQl7IFBJTk1VWF9DRkdfUkVHKCJQT1JUIiBuciAiQ1IiLCByZWcsIDgsIDQpIHsJCVwKLQkJUENSSChQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELAkJXAotCQkgICAgIFBPUlQjI25yIyNfSU5fUFUsIFBPUlQjI25yIyNfT1VUKSwJCVwKLQkJUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfRk4xLCBQT1JUIyNuciMjX0ZOMiwJXAotCQlQT1JUIyNuciMjX0ZOMywJUE9SVCMjbnIjI19GTjQsIFBPUlQjI25yIyNfRk41LAlcCi0JCVBPUlQjI25yIyNfRk42LCBQT1JUIyNuciMjX0ZONyB9CQlcCi0JfQotCiBzdGF0aWMgc3RydWN0IHBpbm11eF9jZmdfcmVnIHBpbm11eF9jb25maWdfcmVnc1tdID0gewogCVBPUlRDUigwLAkweEU2MDUxMDAwKSwgLyogUE9SVDBDUiAqLwogCVBPUlRDUigxLAkweEU2MDUxMDAxKSwgLyogUE9SVDFDUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3Mzc3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNzcuYwppbmRleCA2MTNlNjg0Li4yZjEwNTExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNzcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczNzcuYwpAQCAtMjIsODQgKzIyLDY1IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvc2g3Mzc3Lmg+CiAKLSNkZWZpbmUgXzEoZm4sIHBmeCwgc2Z4KSBmbihwZngsIHNmeCkKLQotI2RlZmluZSBfMTAoZm4sIHBmeCwgc2Z4KQkJCQlcCi0JXzEoZm4sIHBmeCMjMCwgc2Z4KSwgXzEoZm4sIHBmeCMjMSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzIsIHNmeCksIF8xKGZuLCBwZngjIzMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM0LCBzZngpLCBfMShmbiwgcGZ4IyM1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNiwgc2Z4KSwgXzEoZm4sIHBmeCMjNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzgsIHNmeCksIF8xKGZuLCBwZngjIzksIHNmeCkKLQotI2RlZmluZSBfOTAoZm4sIHBmeCwgc2Z4KQkJCQlcCi0JXzEwKGZuLCBwZngjIzEsIHNmeCksIF8xMChmbiwgcGZ4IyMyLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzMsIHNmeCksIF8xMChmbiwgcGZ4IyM0LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzUsIHNmeCksIF8xMChmbiwgcGZ4IyM2LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzcsIHNmeCksIF8xMChmbiwgcGZ4IyM4LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzksIHNmeCkKLQotI2RlZmluZSBfMjY1KGZuLCBwZngsIHNmeCkJCQkJXAotCV8xMChmbiwgcGZ4LCBzZngpLCBfOTAoZm4sIHBmeCwgc2Z4KSwJCVwKLQlfMTAoZm4sIHBmeCMjMTAsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxMTAsIHNmeCksIF8xKGZuLCBwZngjIzExMSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExMiwgc2Z4KSwgXzEoZm4sIHBmeCMjMTEzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTE0LCBzZngpLCBfMShmbiwgcGZ4IyMxMTUsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxMTYsIHNmeCksIF8xKGZuLCBwZngjIzExNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExOCwgc2Z4KSwJCQkJXAotCV8xKGZuLCBwZngjIzEyOCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTI5LCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzEzLCBzZngpLCBfMTAoZm4sIHBmeCMjMTQsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMTUsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxNjAsIHNmeCksIF8xKGZuLCBwZngjIzE2MSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE2Miwgc2Z4KSwgXzEoZm4sIHBmeCMjMTYzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTY0LCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMTkyLCBzZngpLCBfMShmbiwgcGZ4IyMxOTMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxOTQsIHNmeCksIF8xKGZuLCBwZngjIzE5NSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE5Niwgc2Z4KSwgXzEoZm4sIHBmeCMjMTk3LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTk4LCBzZngpLCBfMShmbiwgcGZ4IyMxOTksIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjAsIHNmeCksIF8xMChmbiwgcGZ4IyMyMSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgXzEwKGZuLCBwZngjIzIzLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzI0LCBzZngpLCBfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyNjAsIHNmeCksIF8xKGZuLCBwZngjIzI2MSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzI2Miwgc2Z4KSwgXzEoZm4sIHBmeCMjMjYzLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMjY0LCBzZngpCi0KLSNkZWZpbmUgX1BPUlQocGZ4LCBzZngpIHBmeCMjXyMjc2Z4Ci0jZGVmaW5lIFBPUlRfMjY1KHN0cikgXzI2NShfUE9SVCwgUE9SVCwgc3RyKQorI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHBmeCwgc2Z4KQkJCQlcCisJUE9SVF8xMChmbiwgcGZ4LCBzZngpLCBQT1JUXzkwKGZuLCBwZngsIHNmeCksCQlcCisJUE9SVF8xMChmbiwgcGZ4IyMxMCwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTAsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMTEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTEyLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTEzLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExNCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzExNSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTYsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMTcsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTE4LCBzZngpLAkJCQlcCisJUE9SVF8xKGZuLCBwZngjIzEyOCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzEyOSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMTMsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMTQsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzE1LCBzZngpLAkJCQlcCisJUE9SVF8xKGZuLCBwZngjIzE2MCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE2MSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxNjIsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxNjMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTY0LCBzZngpLAkJCQlcCisJUE9SVF8xKGZuLCBwZngjIzE5Miwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE5Mywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTQsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTk2LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTk3LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE5OCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE5OSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjAsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjEsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzIyLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzIzLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyNCwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyNSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMyNjAsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMyNjEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMjYyLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMjYzLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzI2NCwgc2Z4KQogCiBlbnVtIHsKIAlQSU5NVVhfUkVTRVJWRUQgPSAwLAogCiAJUElOTVVYX0RBVEFfQkVHSU4sCi0JUE9SVF8yNjUoREFUQSksIC8qIFBPUlQwX0RBVEEgLT4gUE9SVDI2NF9EQVRBICovCisJUE9SVF9BTEwoREFUQSksIC8qIFBPUlQwX0RBVEEgLT4gUE9SVDI2NF9EQVRBICovCiAJUElOTVVYX0RBVEFfRU5ELAogCiAJUElOTVVYX0lOUFVUX0JFR0lOLAotCVBPUlRfMjY1KElOKSwgLyogUE9SVDBfSU4gLT4gUE9SVDI2NF9JTiAqLworCVBPUlRfQUxMKElOKSwgLyogUE9SVDBfSU4gLT4gUE9SVDI2NF9JTiAqLwogCVBJTk1VWF9JTlBVVF9FTkQsCiAKIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0JFR0lOLAotCVBPUlRfMjY1KElOX1BVKSwgLyogUE9SVDBfSU5fUFUgLT4gUE9SVDI2NF9JTl9QVSAqLworCVBPUlRfQUxMKElOX1BVKSwgLyogUE9SVDBfSU5fUFUgLT4gUE9SVDI2NF9JTl9QVSAqLwogCVBJTk1VWF9JTlBVVF9QVUxMVVBfRU5ELAogCiAJUElOTVVYX0lOUFVUX1BVTExET1dOX0JFR0lOLAotCVBPUlRfMjY1KElOX1BEKSwgLyogUE9SVDBfSU5fUEQgLT4gUE9SVDI2NF9JTl9QRCAqLworCVBPUlRfQUxMKElOX1BEKSwgLyogUE9SVDBfSU5fUEQgLT4gUE9SVDI2NF9JTl9QRCAqLwogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9FTkQsCiAKIAlQSU5NVVhfT1VUUFVUX0JFR0lOLAotCVBPUlRfMjY1KE9VVCksIC8qIFBPUlQwX09VVCAtPiBQT1JUMjY0X09VVCAqLworCVBPUlRfQUxMKE9VVCksIC8qIFBPUlQwX09VVCAtPiBQT1JUMjY0X09VVCAqLwogCVBJTk1VWF9PVVRQVVRfRU5ELAogCiAJUElOTVVYX0ZVTkNUSU9OX0JFR0lOLAotCVBPUlRfMjY1KEZOX0lOKSwgLyogUE9SVDBfRk5fSU4gLT4gUE9SVDI2NF9GTl9JTiAqLwotCVBPUlRfMjY1KEZOX09VVCksIC8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMjY0X0ZOX09VVCAqLwotCVBPUlRfMjY1KEZOMCksIC8qIFBPUlQwX0ZOMCAtPiBQT1JUMjY0X0ZOMCAqLwotCVBPUlRfMjY1KEZOMSksIC8qIFBPUlQwX0ZOMSAtPiBQT1JUMjY0X0ZOMSAqLwotCVBPUlRfMjY1KEZOMiksIC8qIFBPUlQwX0ZOMiAtPiBQT1JUMjY0X0ZOMiAqLwotCVBPUlRfMjY1KEZOMyksIC8qIFBPUlQwX0ZOMyAtPiBQT1JUMjY0X0ZOMyAqLwotCVBPUlRfMjY1KEZONCksIC8qIFBPUlQwX0ZONCAtPiBQT1JUMjY0X0ZONCAqLwotCVBPUlRfMjY1KEZONSksIC8qIFBPUlQwX0ZONSAtPiBQT1JUMjY0X0ZONSAqLwotCVBPUlRfMjY1KEZONiksIC8qIFBPUlQwX0ZONiAtPiBQT1JUMjY0X0ZONiAqLwotCVBPUlRfMjY1KEZONyksIC8qIFBPUlQwX0ZONyAtPiBQT1JUMjY0X0ZONyAqLworCVBPUlRfQUxMKEZOX0lOKSwgLyogUE9SVDBfRk5fSU4gLT4gUE9SVDI2NF9GTl9JTiAqLworCVBPUlRfQUxMKEZOX09VVCksIC8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMjY0X0ZOX09VVCAqLworCVBPUlRfQUxMKEZOMCksIC8qIFBPUlQwX0ZOMCAtPiBQT1JUMjY0X0ZOMCAqLworCVBPUlRfQUxMKEZOMSksIC8qIFBPUlQwX0ZOMSAtPiBQT1JUMjY0X0ZOMSAqLworCVBPUlRfQUxMKEZOMiksIC8qIFBPUlQwX0ZOMiAtPiBQT1JUMjY0X0ZOMiAqLworCVBPUlRfQUxMKEZOMyksIC8qIFBPUlQwX0ZOMyAtPiBQT1JUMjY0X0ZOMyAqLworCVBPUlRfQUxMKEZONCksIC8qIFBPUlQwX0ZONCAtPiBQT1JUMjY0X0ZONCAqLworCVBPUlRfQUxMKEZONSksIC8qIFBPUlQwX0ZONSAtPiBQT1JUMjY0X0ZONSAqLworCVBPUlRfQUxMKEZONiksIC8qIFBPUlQwX0ZONiAtPiBQT1JUMjY0X0ZONiAqLworCVBPUlRfQUxMKEZONyksIC8qIFBPUlQwX0ZONyAtPiBQT1JUMjY0X0ZONyAqLwogCiAJTVNFTEJDUl9NU0VMMTdfMSwgTVNFTEJDUl9NU0VMMTdfMCwKIAlNU0VMQkNSX01TRUwxNl8xLCBNU0VMQkNSX01TRUwxNl8wLApAQCAtMzYwLDQ1ICszNDEsNiBAQAogCVBJTk1VWF9NQVJLX0VORCwKIH07CiAKLSNkZWZpbmUgUE9SVF9EQVRBX0kobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0lOKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUFUobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QVV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELAlcCi0JCQkJUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfTyhucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCkKLQotI2RlZmluZSBQT1JUX0RBVEFfSU8obnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19PVVQsIFBPUlQjI25yIyNfSU4pCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUEQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCi0KIHN0YXRpYyBwaW5tdXhfZW51bV90IHBpbm11eF9kYXRhW10gPSB7CiAJLyogc3BlY2lmeSB2YWxpZCBwaW4gc3RhdGVzIGZvciBlYWNoIHBpbiBpbiBHUElPIG1vZGUgKi8KIAkvKiA1NS0xIChHUElPKSAqLwpAQCAtMTA3OCwxMyArMTAyMCw5IEBACiAJUElOTVVYX0RBVEEoUkVTRVRPVVRTX01BUkssIFBPUlQyNjRfRk4xKSwKIH07CiAKLSNkZWZpbmUgX0dQSU9fUE9SVChwZngsIHNmeCkgUElOTVVYX0dQSU8oR1BJT19QT1JUIyNwZngsIFBPUlQjI3BmeCMjX0RBVEEpCi0jZGVmaW5lIEdQSU9fUE9SVF8yNjUoKSBfMjY1KF9HUElPX1BPUlQsICwgdW51c2VkKQotI2RlZmluZSBHUElPX0ZOKHN0cikgUElOTVVYX0dQSU8oR1BJT19GTl8jI3N0ciwgc3RyIyNfTUFSSykKLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfZ3BpbyBwaW5tdXhfZ3Bpb3NbXSA9IHsKIAkvKiA1NS0xIC0+IDU1LTUgKEdQSU8pICovCi0JR1BJT19QT1JUXzI2NSgpLAorCUdQSU9fUE9SVF9BTEwoKSwKIAogCS8qIFNwZWNpYWwgUHVsbC11cCAvIFB1bGwtZG93biBGdW5jdGlvbnMgKi8KIAlHUElPX0ZOKFBPUlQ2Nl9LRVlJTjBfUFUpLCBHUElPX0ZOKFBPUlQ2N19LRVlJTjFfUFUpLApAQCAtMTM2MiwyMyArMTMwMCw2IEBACiAJR1BJT19GTihSRVNFVE9VVFMpLAogfTsKIAotLyogaGVscGVyIGZvciB0b3AgNCBiaXRzIGluIFBPUlRuQ1IgKi8KLSNkZWZpbmUgUENSSChpbiwgaW5fcGQsIGluX3B1LCBvdXQpCVwKLQkwLCAob3V0KSwgKGluKSwgMCwJXAotCQkwLCAwLCAwLCAwLAlcCi0JCTAsIDAsIChpbl9wZCksIDAsCVwKLQkJMCwgMCwgKGluX3B1KSwgMAotCi0jZGVmaW5lIFBPUlRDUihuciwgcmVnKQlcCi0JeyBQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CVwKLQkJCVBDUkgoUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCwJXAotCQkJCSBQT1JUIyNuciMjX0lOX1BVLCBQT1JUIyNuciMjX09VVCksCVwKLQkJCQlQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19GTjEsCVwKLQkJCQlQT1JUIyNuciMjX0ZOMiwgUE9SVCMjbnIjI19GTjMsCVwKLQkJCQlQT1JUIyNuciMjX0ZONCwgUE9SVCMjbnIjI19GTjUsCVwKLQkJCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcgfQlcCi0JfQotCiBzdGF0aWMgc3RydWN0IHBpbm11eF9jZmdfcmVnIHBpbm11eF9jb25maWdfcmVnc1tdID0gewogCVBPUlRDUigwLCAweGU2MDUwMDAwKSwgLyogUE9SVDBDUiAqLwogCVBPUlRDUigxLCAweGU2MDUwMDAxKSwgLyogUE9SVDFDUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wZmMtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczYTAuYwppbmRleCAzZWVkNDRlLi5lMDU2MzRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczYTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BmYy1zaDczYTAuYwpAQCAtMjIsODQgKzIyLDczIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvc2g3M2EwLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKLSNkZWZpbmUgXzEoZm4sIHBmeCwgc2Z4KSBmbihwZngsIHNmeCkKLQotI2RlZmluZSBfMTAoZm4sIHBmeCwgc2Z4KQkJCQlcCi0JXzEoZm4sIHBmeCMjMCwgc2Z4KSwgXzEoZm4sIHBmeCMjMSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzIsIHNmeCksIF8xKGZuLCBwZngjIzMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyM0LCBzZngpLCBfMShmbiwgcGZ4IyM1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjNiwgc2Z4KSwgXzEoZm4sIHBmeCMjNywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzgsIHNmeCksIF8xKGZuLCBwZngjIzksIHNmeCkKLQotI2RlZmluZSBfMzEwKGZuLCBwZngsIHNmeCkJCQkJXAotCV8xMChmbiwgcGZ4LCAgICBzZngpLCBfMTAoZm4sIHBmeCMjMSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyLCBzZngpLCBfMTAoZm4sIHBmeCMjMywgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM0LCBzZngpLCBfMTAoZm4sIHBmeCMjNSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM2LCBzZngpLCBfMTAoZm4sIHBmeCMjNywgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyM4LCBzZngpLCBfMTAoZm4sIHBmeCMjOSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMxMCwgc2Z4KSwJCQkJXAotCV8xKGZuLCBwZngjIzExMCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTExLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTEyLCBzZngpLCBfMShmbiwgcGZ4IyMxMTMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxMTQsIHNmeCksIF8xKGZuLCBwZngjIzExNSwgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzExNiwgc2Z4KSwgXzEoZm4sIHBmeCMjMTE3LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTE4LCBzZngpLAkJCQlcCi0JXzEoZm4sIHBmeCMjMTI4LCBzZngpLCBfMShmbiwgcGZ4IyMxMjksIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMTMsIHNmeCksIF8xMChmbiwgcGZ4IyMxNCwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMxNSwgc2Z4KSwJCQkJXAotCV8xKGZuLCBwZngjIzE2MCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTYxLCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTYyLCBzZngpLCBfMShmbiwgcGZ4IyMxNjMsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxNjQsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMxOTIsIHNmeCksIF8xKGZuLCBwZngjIzE5Mywgc2Z4KSwJXAotCV8xKGZuLCBwZngjIzE5NCwgc2Z4KSwgXzEoZm4sIHBmeCMjMTk1LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMTk2LCBzZngpLCBfMShmbiwgcGZ4IyMxOTcsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMxOTgsIHNmeCksIF8xKGZuLCBwZngjIzE5OSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyMCwgc2Z4KSwgXzEwKGZuLCBwZngjIzIxLCBzZngpLAlcCi0JXzEwKGZuLCBwZngjIzIyLCBzZngpLCBfMTAoZm4sIHBmeCMjMjMsIHNmeCksCVwKLQlfMTAoZm4sIHBmeCMjMjQsIHNmeCksIF8xMChmbiwgcGZ4IyMyNSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyNiwgc2Z4KSwgXzEwKGZuLCBwZngjIzI3LCBzZngpLAlcCi0JXzEoZm4sIHBmeCMjMjgwLCBzZngpLCBfMShmbiwgcGZ4IyMyODEsIHNmeCksCVwKLQlfMShmbiwgcGZ4IyMyODIsIHNmeCksCQkJCVwKLQlfMShmbiwgcGZ4IyMyODgsIHNmeCksIF8xKGZuLCBwZngjIzI4OSwgc2Z4KSwJXAotCV8xMChmbiwgcGZ4IyMyOSwgc2Z4KSwgXzEwKGZuLCBwZngjIzMwLCBzZngpCi0KLSNkZWZpbmUgX1BPUlQocGZ4LCBzZngpIHBmeCMjXyMjc2Z4Ci0jZGVmaW5lIFBPUlRfMzEwKHN0cikgXzMxMChfUE9SVCwgUE9SVCwgc3RyKQorI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHBmeCwgc2Z4KQkJCQlcCisJUE9SVF8xMChmbiwgcGZ4LCAgICBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzEsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzIsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMywgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjNCwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyM1LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyM2LCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzcsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzgsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjOSwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMTAsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTEwLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTExLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExMiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzExMywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxMTQsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMTUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTE2LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTE3LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzExOCwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxMjgsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxMjksIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzEzLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzE0LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMxNSwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxNjAsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxNjEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTYyLCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTYzLCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE2NCwgc2Z4KSwJCQkJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTIsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMTk0LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMTk1LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzE5Niwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzE5Nywgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMxOTgsIHNmeCksIFBPUlRfMShmbiwgcGZ4IyMxOTksIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzIwLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzIxLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyMiwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyMywgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjMjQsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjMjUsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzI2LCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzI3LCBzZngpLAlcCisJUE9SVF8xKGZuLCBwZngjIzI4MCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzI4MSwgc2Z4KSwJXAorCVBPUlRfMShmbiwgcGZ4IyMyODIsIHNmeCksCQkJCVwKKwlQT1JUXzEoZm4sIHBmeCMjMjg4LCBzZngpLCBQT1JUXzEoZm4sIHBmeCMjMjg5LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMyOSwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMzMCwgc2Z4KQogCiBlbnVtIHsKIAlQSU5NVVhfUkVTRVJWRUQgPSAwLAogCiAJUElOTVVYX0RBVEFfQkVHSU4sCi0JUE9SVF8zMTAoREFUQSksCQkJLyogUE9SVDBfREFUQSAtPiBQT1JUMzA5X0RBVEEgKi8KKwlQT1JUX0FMTChEQVRBKSwJCQkvKiBQT1JUMF9EQVRBIC0+IFBPUlQzMDlfREFUQSAqLwogCVBJTk1VWF9EQVRBX0VORCwKIAogCVBJTk1VWF9JTlBVVF9CRUdJTiwKLQlQT1JUXzMxMChJTiksCQkJLyogUE9SVDBfSU4gLT4gUE9SVDMwOV9JTiAqLworCVBPUlRfQUxMKElOKSwJCQkvKiBQT1JUMF9JTiAtPiBQT1JUMzA5X0lOICovCiAJUElOTVVYX0lOUFVUX0VORCwKIAogCVBJTk1VWF9JTlBVVF9QVUxMVVBfQkVHSU4sCi0JUE9SVF8zMTAoSU5fUFUpLAkJLyogUE9SVDBfSU5fUFUgLT4gUE9SVDMwOV9JTl9QVSAqLworCVBPUlRfQUxMKElOX1BVKSwJCS8qIFBPUlQwX0lOX1BVIC0+IFBPUlQzMDlfSU5fUFUgKi8KIAlQSU5NVVhfSU5QVVRfUFVMTFVQX0VORCwKIAogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9CRUdJTiwKLQlQT1JUXzMxMChJTl9QRCksCQkvKiBQT1JUMF9JTl9QRCAtPiBQT1JUMzA5X0lOX1BEICovCisJUE9SVF9BTEwoSU5fUEQpLAkJLyogUE9SVDBfSU5fUEQgLT4gUE9SVDMwOV9JTl9QRCAqLwogCVBJTk1VWF9JTlBVVF9QVUxMRE9XTl9FTkQsCiAKIAlQSU5NVVhfT1VUUFVUX0JFR0lOLAotCVBPUlRfMzEwKE9VVCksCQkJLyogUE9SVDBfT1VUIC0+IFBPUlQzMDlfT1VUICovCisJUE9SVF9BTEwoT1VUKSwJCQkvKiBQT1JUMF9PVVQgLT4gUE9SVDMwOV9PVVQgKi8KIAlQSU5NVVhfT1VUUFVUX0VORCwKIAogCVBJTk1VWF9GVU5DVElPTl9CRUdJTiwKLQlQT1JUXzMxMChGTl9JTiksCQkvKiBQT1JUMF9GTl9JTiAtPiBQT1JUMzA5X0ZOX0lOICovCi0JUE9SVF8zMTAoRk5fT1VUKSwJCS8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMzA5X0ZOX09VVCAqLwotCVBPUlRfMzEwKEZOMCksCQkJLyogUE9SVDBfRk4wIC0+IFBPUlQzMDlfRk4wICovCi0JUE9SVF8zMTAoRk4xKSwJCQkvKiBQT1JUMF9GTjEgLT4gUE9SVDMwOV9GTjEgKi8KLQlQT1JUXzMxMChGTjIpLAkJCS8qIFBPUlQwX0ZOMiAtPiBQT1JUMzA5X0ZOMiAqLwotCVBPUlRfMzEwKEZOMyksCQkJLyogUE9SVDBfRk4zIC0+IFBPUlQzMDlfRk4zICovCi0JUE9SVF8zMTAoRk40KSwJCQkvKiBQT1JUMF9GTjQgLT4gUE9SVDMwOV9GTjQgKi8KLQlQT1JUXzMxMChGTjUpLAkJCS8qIFBPUlQwX0ZONSAtPiBQT1JUMzA5X0ZONSAqLwotCVBPUlRfMzEwKEZONiksCQkJLyogUE9SVDBfRk42IC0+IFBPUlQzMDlfRk42ICovCi0JUE9SVF8zMTAoRk43KSwJCQkvKiBQT1JUMF9GTjcgLT4gUE9SVDMwOV9GTjcgKi8KKwlQT1JUX0FMTChGTl9JTiksCQkvKiBQT1JUMF9GTl9JTiAtPiBQT1JUMzA5X0ZOX0lOICovCisJUE9SVF9BTEwoRk5fT1VUKSwJCS8qIFBPUlQwX0ZOX09VVCAtPiBQT1JUMzA5X0ZOX09VVCAqLworCVBPUlRfQUxMKEZOMCksCQkJLyogUE9SVDBfRk4wIC0+IFBPUlQzMDlfRk4wICovCisJUE9SVF9BTEwoRk4xKSwJCQkvKiBQT1JUMF9GTjEgLT4gUE9SVDMwOV9GTjEgKi8KKwlQT1JUX0FMTChGTjIpLAkJCS8qIFBPUlQwX0ZOMiAtPiBQT1JUMzA5X0ZOMiAqLworCVBPUlRfQUxMKEZOMyksCQkJLyogUE9SVDBfRk4zIC0+IFBPUlQzMDlfRk4zICovCisJUE9SVF9BTEwoRk40KSwJCQkvKiBQT1JUMF9GTjQgLT4gUE9SVDMwOV9GTjQgKi8KKwlQT1JUX0FMTChGTjUpLAkJCS8qIFBPUlQwX0ZONSAtPiBQT1JUMzA5X0ZONSAqLworCVBPUlRfQUxMKEZONiksCQkJLyogUE9SVDBfRk42IC0+IFBPUlQzMDlfRk42ICovCisJUE9SVF9BTEwoRk43KSwJCQkvKiBQT1JUMF9GTjcgLT4gUE9SVDMwOV9GTjcgKi8KIAogCU1TRUwyQ1JfTVNFTDE5XzAsIE1TRUwyQ1JfTVNFTDE5XzEsCiAJTVNFTDJDUl9NU0VMMThfMCwgTVNFTDJDUl9NU0VMMThfMSwKQEAgLTQ4OCwxMyArNDc3LDM0IEBACiAJS0VZSU41X1BVX01BUkssCiAJS0VZSU42X1BVX01BUkssCiAJS0VZSU43X1BVX01BUkssCisJU0RISUNEMF9QVV9NQVJLLAorCVNESElEMF8wX1BVX01BUkssCisJU0RISUQwXzFfUFVfTUFSSywKKwlTREhJRDBfMl9QVV9NQVJLLAorCVNESElEMF8zX1BVX01BUkssCisJU0RISUNNRDBfUFVfTUFSSywKKwlTREhJV1AwX1BVX01BUkssCiAJU0RISUQxXzBfUFVfTUFSSywKIAlTREhJRDFfMV9QVV9NQVJLLAogCVNESElEMV8yX1BVX01BUkssCiAJU0RISUQxXzNfUFVfTUFSSywKIAlTREhJQ01EMV9QVV9NQVJLLAorCVNESElEMl8wX1BVX01BUkssCisJU0RISUQyXzFfUFVfTUFSSywKKwlTREhJRDJfMl9QVV9NQVJLLAorCVNESElEMl8zX1BVX01BUkssCisJU0RISUNNRDJfUFVfTUFSSywKIAlNTUNDTUQwX1BVX01BUkssCiAJTU1DQ01EMV9QVV9NQVJLLAorCU1NQ0QwXzBfUFVfTUFSSywKKwlNTUNEMF8xX1BVX01BUkssCisJTU1DRDBfMl9QVV9NQVJLLAorCU1NQ0QwXzNfUFVfTUFSSywKKwlNTUNEMF80X1BVX01BUkssCisJTU1DRDBfNV9QVV9NQVJLLAorCU1NQ0QwXzZfUFVfTUFSSywKKwlNTUNEMF83X1BVX01BUkssCisJRlNJQklTTERfUFVfTUFSSywKIAlGU0lBQ0tfUFVfTUFSSywKIAlGU0lBSUxSX1BVX01BUkssCiAJRlNJQUlCVF9QVV9NQVJLLApAQCAtNTAzLDQ1ICs1MTMsNiBAQAogCVBJTk1VWF9NQVJLX0VORCwKIH07CiAKLSNkZWZpbmUgUE9SVF9EQVRBX0kobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0lOKQotCi0jZGVmaW5lIFBPUlRfREFUQV9JX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lfUFUobnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfSV9QVV9QRChucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELAlcCi0JCQkJUE9SVCMjbnIjI19JTl9QVSkKLQotI2RlZmluZSBQT1JUX0RBVEFfTyhucikJXAotCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKLQkJCQlQT1JUIyNuciMjX09VVCkKLQotI2RlZmluZSBQT1JUX0RBVEFfSU8obnIpCVwKLQlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAlcCi0JCQkJUE9SVCMjbnIjI19PVVQsIFBPUlQjI25yIyNfSU4pCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUEQpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUFUpCi0KLSNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVX1BEKG5yKQlcCi0JUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAotCQkJCVBPUlQjI25yIyNfT1VULCBQT1JUIyNuciMjX0lOLAkJXAotCQkJCVBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCi0KIHN0YXRpYyBwaW5tdXhfZW51bV90IHBpbm11eF9kYXRhW10gPSB7CiAJLyogc3BlY2lmeSB2YWxpZCBwaW4gc3RhdGVzIGZvciBlYWNoIHBpbiBpbiBHUElPIG1vZGUgKi8KIApAQCAtMTM4NywxOSArMTM1OCwyOCBAQAogCVBJTk1VWF9EQVRBKFRTX1NDSzRfTUFSSywgUE9SVDI2OF9GTjMpLAogCVBJTk1VWF9EQVRBKFNESElDTUQyX01BUkssIFBPUlQyNjlfRk4xKSwKIAlQSU5NVVhfREFUQShNTUNDTEswX01BUkssIFBPUlQyNzBfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKLQlQSU5NVVhfREFUQShNTUNEMF8wX01BUkssIFBPUlQyNzFfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKLQlQSU5NVVhfREFUQShNTUNEMF8xX01BUkssIFBPUlQyNzJfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKLQlQSU5NVVhfREFUQShNTUNEMF8yX01BUkssIFBPUlQyNzNfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKLQlQSU5NVVhfREFUQShNTUNEMF8zX01BUkssIFBPUlQyNzRfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKLQlQSU5NVVhfREFUQShNTUNEMF80X01BUkssIFBPUlQyNzVfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwgXAorCVBJTk1VWF9EQVRBKE1NQ0QwXzBfTUFSSywgUE9SVDI3MV9GTjEsIFBPUlQyNzFfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzFfTUFSSywgUE9SVDI3Ml9GTjEsIFBPUlQyNzJfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzJfTUFSSywgUE9SVDI3M19GTjEsIFBPUlQyNzNfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzNfTUFSSywgUE9SVDI3NF9GTjEsIFBPUlQyNzRfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzRfTUFSSywgUE9SVDI3NV9GTjEsIFBPUlQyNzVfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLCBcCiAJUElOTVVYX0RBVEEoVFNfU1BTWU5DNV9NQVJLLCBQT1JUMjc1X0ZOMyksCi0JUElOTVVYX0RBVEEoTU1DRDBfNV9NQVJLLCBQT1JUMjc2X0ZOMSwgTVNFTDRDUl9NU0VMMTVfMCksIFwKKwlQSU5NVVhfREFUQShNTUNEMF81X01BUkssIFBPUlQyNzZfRk4xLCBQT1JUMjc2X0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwgXAogCVBJTk1VWF9EQVRBKFRTX1NEQVQ1X01BUkssIFBPUlQyNzZfRk4zKSwKLQlQSU5NVVhfREFUQShNTUNEMF82X01BUkssIFBPUlQyNzdfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwgXAorCVBJTk1VWF9EQVRBKE1NQ0QwXzZfTUFSSywgUE9SVDI3N19GTjEsIFBPUlQyNzdfSU5fUFUsCisJCU1TRUw0Q1JfTVNFTDE1XzApLCBcCiAJUElOTVVYX0RBVEEoVFNfU0RFTjVfTUFSSywgUE9SVDI3N19GTjMpLAotCVBJTk1VWF9EQVRBKE1NQ0QwXzdfTUFSSywgUE9SVDI3OF9GTjEsIE1TRUw0Q1JfTVNFTDE1XzApLCBcCisJUElOTVVYX0RBVEEoTU1DRDBfN19NQVJLLCBQT1JUMjc4X0ZOMSwgUE9SVDI3OF9JTl9QVSwKKwkJTVNFTDRDUl9NU0VMMTVfMCksIFwKIAlQSU5NVVhfREFUQShUU19TQ0s1X01BUkssIFBPUlQyNzhfRk4zKSwKLQlQSU5NVVhfREFUQShNTUNDTUQwX01BUkssIFBPUlQyNzlfRk4xLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNDTUQwX01BUkssIFBPUlQyNzlfRk4xLCBQT1JUMjc5X0lOX1BVLAorCQlNU0VMNENSX01TRUwxNV8wKSwKIAlQSU5NVVhfREFUQShSRVNFVE9VVFNfX01BUkssIFBPUlQyODFfRk4xKSwgXAogCVBJTk1VWF9EQVRBKEVYVEFMMk9VVF9NQVJLLCBQT1JUMjgxX0ZOMiksCiAJUElOTVVYX0RBVEEoTUNQX1dBSVRfX01DUF9GUkJfTUFSSywgUE9SVDI4OF9GTjEpLApAQCAtMTUxNiwyOCArMTQ5Niw1NSBAQAogCVBJTk1VWF9EQVRBKEtFWUlONl9QVV9NQVJLLCBQT1JUNzJfRk4yLCBQT1JUNzJfSU5fUFUpLAogCVBJTk1VWF9EQVRBKEtFWUlON19QVV9NQVJLLCBQT1JUNzNfRk4yLCBQT1JUNzNfSU5fUFUpLAogCi0JUElOTVVYX0RBVEEoU0RISUQxXzBfUFVfTUFSSywgUE9SVDI1OV9JTl9QVSwgUE9SVDI1OV9GTjEpLAotCVBJTk1VWF9EQVRBKFNESElEMV8xX1BVX01BUkssIFBPUlQyNjBfSU5fUFUsIFBPUlQyNjBfRk4xKSwKLQlQSU5NVVhfREFUQShTREhJRDFfMl9QVV9NQVJLLCBQT1JUMjYxX0lOX1BVLCBQT1JUMjYxX0ZOMSksCi0JUElOTVVYX0RBVEEoU0RISUQxXzNfUFVfTUFSSywgUE9SVDI2Ml9JTl9QVSwgUE9SVDI2Ml9GTjEpLAotCVBJTk1VWF9EQVRBKFNESElDTUQxX1BVX01BUkssIFBPUlQyNjNfSU5fUFUsIFBPUlQyNjNfRk4xKSwKKwlQSU5NVVhfREFUQShTREhJQ0QwX1BVX01BUkssICBQT1JUMjUxX0ZOMSwgUE9SVDI1MV9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQwXzBfUFVfTUFSSywgUE9SVDI1Ml9GTjEsIFBPUlQyNTJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMF8xX1BVX01BUkssIFBPUlQyNTNfRk4xLCBQT1JUMjUzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDBfMl9QVV9NQVJLLCBQT1JUMjU0X0ZOMSwgUE9SVDI1NF9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQwXzNfUFVfTUFSSywgUE9SVDI1NV9GTjEsIFBPUlQyNTVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElDTUQwX1BVX01BUkssIFBPUlQyNTZfRk4xLCBQT1JUMjU2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJV1AwX1BVX01BUkssICBQT1JUMjU3X0ZOMSwgUE9SVDI1Nl9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQxXzBfUFVfTUFSSywgUE9SVDI1OV9GTjEsIFBPUlQyNTlfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMV8xX1BVX01BUkssIFBPUlQyNjBfRk4xLCBQT1JUMjYwX0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDFfMl9QVV9NQVJLLCBQT1JUMjYxX0ZOMSwgUE9SVDI2MV9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQxXzNfUFVfTUFSSywgUE9SVDI2Ml9GTjEsIFBPUlQyNjJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElDTUQxX1BVX01BUkssIFBPUlQyNjNfRk4xLCBQT1JUMjYzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDJfMF9QVV9NQVJLLCBQT1JUMjY1X0ZOMSwgUE9SVDI2NV9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUQyXzFfUFVfTUFSSywgUE9SVDI2Nl9GTjEsIFBPUlQyNjZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFNESElEMl8yX1BVX01BUkssIFBPUlQyNjdfRk4xLCBQT1JUMjY3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShTREhJRDJfM19QVV9NQVJLLCBQT1JUMjY4X0ZOMSwgUE9SVDI2OF9JTl9QVSksCisJUElOTVVYX0RBVEEoU0RISUNNRDJfUFVfTUFSSywgUE9SVDI2OV9GTjEsIFBPUlQyNjlfSU5fUFUpLAogCiAJUElOTVVYX0RBVEEoTU1DQ01EMF9QVV9NQVJLLCBQT1JUMjc5X0ZOMSwgUE9SVDI3OV9JTl9QVSwKIAkJTVNFTDRDUl9NU0VMMTVfMCksCi0JUElOTVVYX0RBVEEoTU1DQ01EMV9QVV9NQVJLLCBQT1JUMjk3X0ZOMiwgUE9SVDI3OV9JTl9QVSwKKwlQSU5NVVhfREFUQShNTUNDTUQxX1BVX01BUkssIFBPUlQyOTdfRk4yLCBQT1JUMjk3X0lOX1BVLAogCQlNU0VMNENSX01TRUwxNV8xKSwKKworCVBJTk1VWF9EQVRBKE1NQ0QwXzBfUFVfTUFSSywKKwkJICAgIFBPUlQyNzFfRk4xLCBQT1JUMjcxX0lOX1BVLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF8xX1BVX01BUkssCisJCSAgICBQT1JUMjcyX0ZOMSwgUE9SVDI3Ml9JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DRDBfMl9QVV9NQVJLLAorCQkgICAgUE9SVDI3M19GTjEsIFBPUlQyNzNfSU5fUFUsIE1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzNfUFVfTUFSSywKKwkJICAgIFBPUlQyNzRfRk4xLCBQT1JUMjc0X0lOX1BVLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF80X1BVX01BUkssCisJCSAgICBQT1JUMjc1X0ZOMSwgUE9SVDI3NV9JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisJUElOTVVYX0RBVEEoTU1DRDBfNV9QVV9NQVJLLAorCQkgICAgUE9SVDI3Nl9GTjEsIFBPUlQyNzZfSU5fUFUsIE1TRUw0Q1JfTVNFTDE1XzApLAorCVBJTk1VWF9EQVRBKE1NQ0QwXzZfUFVfTUFSSywKKwkJICAgIFBPUlQyNzdfRk4xLCBQT1JUMjc3X0lOX1BVLCBNU0VMNENSX01TRUwxNV8wKSwKKwlQSU5NVVhfREFUQShNTUNEMF83X1BVX01BUkssCisJCSAgICBQT1JUMjc4X0ZOMSwgUE9SVDI3OF9JTl9QVSwgTVNFTDRDUl9NU0VMMTVfMCksCisKKwlQSU5NVVhfREFUQShGU0lCSVNMRF9QVV9NQVJLLCBQT1JUMzlfRk4xLCBQT1JUMzlfSU5fUFUpLAogCVBJTk1VWF9EQVRBKEZTSUFDS19QVV9NQVJLLCBQT1JUNDlfRk4xLCBQT1JUNDlfSU5fUFUpLAogCVBJTk1VWF9EQVRBKEZTSUFJTFJfUFVfTUFSSywgUE9SVDUwX0ZONSwgUE9SVDUwX0lOX1BVKSwKIAlQSU5NVVhfREFUQShGU0lBSUJUX1BVX01BUkssIFBPUlQ1MV9GTjUsIFBPUlQ1MV9JTl9QVSksCiAJUElOTVVYX0RBVEEoRlNJQUlTTERfUFVfTUFSSywgUE9SVDU1X0ZOMSwgUE9SVDU1X0lOX1BVKSwKIH07CiAKLSNkZWZpbmUgX0dQSU9fUE9SVChwZngsIHNmeCkgUElOTVVYX0dQSU8oR1BJT19QT1JUIyNwZngsIFBPUlQjI3BmeCMjX0RBVEEpCi0jZGVmaW5lIEdQSU9fUE9SVF8zMTAoKSBfMzEwKF9HUElPX1BPUlQsICwgdW51c2VkKQotI2RlZmluZSBHUElPX0ZOKHN0cikgUElOTVVYX0dQSU8oR1BJT19GTl8jI3N0ciwgc3RyIyNfTUFSSykKLQogc3RhdGljIHN0cnVjdCBwaW5tdXhfZ3BpbyBwaW5tdXhfZ3Bpb3NbXSA9IHsKLQlHUElPX1BPUlRfMzEwKCksCisJR1BJT19QT1JUX0FMTCgpLAogCiAJLyogVGFibGUgMjUtMSAoRnVuY3Rpb25zIDAtNykgKi8KIAlHUElPX0ZOKFZCVVNfMCksCkBAIC0yMTgxLDMxICsyMTg4LDM5IEBACiAJR1BJT19GTihLRVlJTjVfUFUpLAogCUdQSU9fRk4oS0VZSU42X1BVKSwKIAlHUElPX0ZOKEtFWUlON19QVSksCisJR1BJT19GTihTREhJQ0QwX1BVKSwKKwlHUElPX0ZOKFNESElEMF8wX1BVKSwKKwlHUElPX0ZOKFNESElEMF8xX1BVKSwKKwlHUElPX0ZOKFNESElEMF8yX1BVKSwKKwlHUElPX0ZOKFNESElEMF8zX1BVKSwKKwlHUElPX0ZOKFNESElDTUQwX1BVKSwKKwlHUElPX0ZOKFNESElXUDBfUFUpLAogCUdQSU9fRk4oU0RISUQxXzBfUFUpLAogCUdQSU9fRk4oU0RISUQxXzFfUFUpLAogCUdQSU9fRk4oU0RISUQxXzJfUFUpLAogCUdQSU9fRk4oU0RISUQxXzNfUFUpLAogCUdQSU9fRk4oU0RISUNNRDFfUFUpLAorCUdQSU9fRk4oU0RISUQyXzBfUFUpLAorCUdQSU9fRk4oU0RISUQyXzFfUFUpLAorCUdQSU9fRk4oU0RISUQyXzJfUFUpLAorCUdQSU9fRk4oU0RISUQyXzNfUFUpLAorCUdQSU9fRk4oU0RISUNNRDJfUFUpLAogCUdQSU9fRk4oTU1DQ01EMF9QVSksCiAJR1BJT19GTihNTUNDTUQxX1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzBfUFUpLAorCUdQSU9fRk4oTU1DRDBfMV9QVSksCisJR1BJT19GTihNTUNEMF8yX1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzNfUFUpLAorCUdQSU9fRk4oTU1DRDBfNF9QVSksCisJR1BJT19GTihNTUNEMF81X1BVKSwKKwlHUElPX0ZOKE1NQ0QwXzZfUFUpLAorCUdQSU9fRk4oTU1DRDBfN19QVSksCiAJR1BJT19GTihGU0lBQ0tfUFUpLAogCUdQSU9fRk4oRlNJQUlMUl9QVSksCiAJR1BJT19GTihGU0lBSUJUX1BVKSwKIAlHUElPX0ZOKEZTSUFJU0xEX1BVKSwKIH07CiAKLSNkZWZpbmUgUE9SVENSKG5yLCByZWcpCVwKLQl7IFBJTk1VWF9DRkdfUkVHKCJQT1JUIiBuciAiQ1IiLCByZWcsIDgsIDQpIHsgXAotCQkwLCBcCi0JCS8qMDAwMSovIFBPUlQjI25yIyNfT1VUICwgXAotCQkvKjAwMTAqLyBQT1JUIyNuciMjX0lOICwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXAotCQkvKjEwMTAqLyBQT1JUIyNuciMjX0lOX1BELCAwLCAwLCAwLCBcCi0JCS8qMTExMCovIFBPUlQjI25yIyNfSU5fUFUsIDAsIFwKLQkJUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfRk4xLAlQT1JUIyNuciMjX0ZOMiwgXAotCQlQT1JUIyNuciMjX0ZOMywJUE9SVCMjbnIjI19GTjQsIFBPUlQjI25yIyNfRk41LCBcCi0JCVBPUlQjI25yIyNfRk42LCBQT1JUIyNuciMjX0ZONywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9IFwKLQl9Ci0KIHN0YXRpYyBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgcGlubXV4X2NvbmZpZ19yZWdzW10gPSB7CiAJUE9SVENSKDAsIDB4ZTYwNTAwMDApLCAvKiBQT1JUMENSICovCiAJUE9SVENSKDEsIDB4ZTYwNTAwMDEpLCAvKiBQT1JUMUNSICovCkBAIC0yNzE4LDYgKzI3MzMsNDUgQEAKIAl7IH0sCiB9OwogCisvKiBJUlEgcGlucyB0aHJvdWdoIElOVENTIHdpdGggSVJRMC0+MTUgZnJvbSAweDIwMCBhbmQgSVJRMTYtMzEgZnJvbSAweDMyMDAgKi8KKyNkZWZpbmUgRVhUX0lSUTE2TChuKSBpbnRjc19ldnQyaXJxKDB4MjAwICsgKChuKSA8PCA1KSkKKyNkZWZpbmUgRVhUX0lSUTE2SChuKSBpbnRjc19ldnQyaXJxKDB4MzIwMCArICgobiAtIDE2KSA8PCA1KSkKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfaXJxIHBpbm11eF9pcnFzW10gPSB7CisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDE5KSwgUE9SVDlfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoMSksIFBPUlQxMF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgwKSwgUE9SVDExX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDE4KSwgUE9SVDEzX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDIwKSwgUE9SVDE0X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDIxKSwgUE9SVDE1X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDMxKSwgUE9SVDI2X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDMwKSwgUE9SVDI3X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDI5KSwgUE9SVDI4X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDIyKSwgUE9SVDQwX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDIzKSwgUE9SVDUzX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDEwKSwgUE9SVDU0X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDkpLCBQT1JUNTZfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMjYpLCBQT1JUMTE1X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZIKDI3KSwgUE9SVDExNl9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyOCksIFBPUlQxMTdfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMjQpLCBQT1JUMTE4X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDYpLCBQT1JUMTQ3X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDIpLCBQT1JUMTQ5X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDcpLCBQT1JUMTUwX0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDEyKSwgUE9SVDE1Nl9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCg0KSwgUE9SVDE1OV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2SCgyNSksIFBPUlQxNjRfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoOCksIFBPUlQyMjNfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoMyksIFBPUlQyMjRfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkwoNSksIFBPUlQyMjdfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMTcpLCBQT1JUMjM0X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDExKSwgUE9SVDIzOF9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCgxMyksIFBPUlQyMzlfRk4wKSwKKwlQSU5NVVhfSVJRKEVYVF9JUlExNkgoMTYpLCBQT1JUMjQ5X0ZOMCksCisJUElOTVVYX0lSUShFWFRfSVJRMTZMKDE0KSwgUE9SVDI1MV9GTjApLAorCVBJTk1VWF9JUlEoRVhUX0lSUTE2TCg5KSwgUE9SVDMwOF9GTjApLAorfTsKKwogc3RhdGljIHN0cnVjdCBwaW5tdXhfaW5mbyBzaDczYTBfcGlubXV4X2luZm8gPSB7CiAJLm5hbWUgPSAic2g3M2EwX3BmYyIsCiAJLnJlc2VydmVkX2lkID0gUElOTVVYX1JFU0VSVkVELApAQCAtMjczOCw2ICsyNzkyLDkgQEAKIAogCS5ncGlvX2RhdGEgPSBwaW5tdXhfZGF0YSwKIAkuZ3Bpb19kYXRhX3NpemUgPSBBUlJBWV9TSVpFKHBpbm11eF9kYXRhKSwKKworCS5ncGlvX2lycSA9IHBpbm11eF9pcnFzLAorCS5ncGlvX2lycV9zaXplID0gQVJSQVlfU0laRShwaW5tdXhfaXJxcyksCiB9OwogCiB2b2lkIHNoNzNhMF9waW5tdXhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYwppbmRleCBlNGU0ODVmLi5jNDlhODMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAuYwpAQCAtMjEsOSArMjEsMTEgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAKKyNkZWZpbmUgaXNfc2g3M2EwKCkgKG1hY2hpbmVfaXNfYWc1ZXZtKCkgfHwgbWFjaGluZV9pc19rb3RhMigpKQorCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBzaG1vYmlsZV9zbXBfZ2V0X2NvcmVfY291bnQodm9pZCkKIHsKLQlpZiAobWFjaGluZV9pc19hZzVldm0oKSkKKwlpZiAoaXNfc2g3M2EwKCkpCiAJCXJldHVybiBzaDczYTBfZ2V0X2NvcmVfY291bnQoKTsKIAogCXJldHVybiAxOwpAQCAtMzEsNyArMzMsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2htb2JpbGVfc21wX3ByZXBhcmVfY3B1cyh2b2lkKQogewotCWlmIChtYWNoaW5lX2lzX2FnNWV2bSgpKQorCWlmIChpc19zaDczYTAoKSkKIAkJc2g3M2EwX3NtcF9wcmVwYXJlX2NwdXMoKTsKIH0KIApAQCAtMzksMTMgKzQxLDEzIEBACiB7CiAJdHJhY2VfaGFyZGlycXNfb2ZmKCk7CiAKLQlpZiAobWFjaGluZV9pc19hZzVldm0oKSkKKwlpZiAoaXNfc2g3M2EwKCkpCiAJCXNoNzNhMF9zZWNvbmRhcnlfaW5pdChjcHUpOwogfQogCiBpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKIHsKLQlpZiAobWFjaGluZV9pc19hZzVldm0oKSkKKwlpZiAoaXNfc2g3M2EwKCkpCiAJCXJldHVybiBzaDczYTBfYm9vdF9zZWNvbmRhcnkoY3B1KTsKIAogCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbS1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcG0tc2g3MzcyLmMKaW5kZXggNzk2MTI3My4uMGE1YjIyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbS1zaDczNzIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtLXNoNzM3Mi5jCkBAIC00MDIsMjIgKzQwMiwxOCBAQAogCiAjaWZkZWYgQ09ORklHX0NQVV9JRExFCiAKLXN0YXRpYyB2b2lkIHNoNzM3Ml9jcHVpZGxlX3NldHVwKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgc2g3MzcyX2NwdWlkbGVfc2V0dXAoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpCiB7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlOwotCWludCBpID0gZGV2LT5zdGF0ZV9jb3VudDsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbZHJ2LT5zdGF0ZV9jb3VudF07CiAKLQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpXTsKIAlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIkMyIik7CiAJc3RybmNweShzdGF0ZS0+ZGVzYywgIkNvcmUgU3RhbmRieSBNb2RlIiwgQ1BVSURMRV9ERVNDX0xFTik7CiAJc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IDEwOwogCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gMjAgKyAxMDsKLQlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAxOyAvKiBwZXJoYXBzIG5vdCAqLwotCXN0YXRlLT5mbGFncyA9IDA7Ci0Jc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwotCXNobW9iaWxlX2NwdWlkbGVfbW9kZXNbaV0gPSBzaDczNzJfZW50ZXJfY29yZV9zdGFuZGJ5OworCXN0YXRlLT5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXNobW9iaWxlX2NwdWlkbGVfbW9kZXNbZHJ2LT5zdGF0ZV9jb3VudF0gPSBzaDczNzJfZW50ZXJfY29yZV9zdGFuZGJ5OwogCi0JZGV2LT5zdGF0ZV9jb3VudCA9IGkgKyAxOworCWRydi0+c3RhdGVfY291bnQrKzsKIH0KIAogc3RhdGljIHZvaWQgc2g3MzcyX2NwdWlkbGVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbV9ydW50aW1lLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YzZhMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXNobW9iaWxlL3BtX3J1bnRpbWUuYwotICoKLSAqIFJ1bnRpbWUgUE0gc3VwcG9ydCBjb2RlIGZvciBTdXBlckggTW9iaWxlIEFSTQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYWdudXMgRGFtbQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fZG9tYWluLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fY2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9zaF9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQotCi1zdGF0aWMgaW50IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQkvKiBzdXNwZW5kIHN5bmNocm9ub3VzbHkgdG8gZGlzYWJsZSBjbG9ja3MgaW1tZWRpYXRlbHkgKi8KLQlyZXR1cm4gcG1fcnVudGltZV9zdXNwZW5kKGRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X3BtX2RvbWFpbiBkZWZhdWx0X3BtX2RvbWFpbiA9IHsKLQkub3BzID0gewotCQkucnVudGltZV9zdXNwZW5kID0gcG1fY2xrX3N1c3BlbmQsCi0JCS5ydW50aW1lX3Jlc3VtZSA9IHBtX2Nsa19yZXN1bWUsCi0JCS5ydW50aW1lX2lkbGUgPSBkZWZhdWx0X3BsYXRmb3JtX3J1bnRpbWVfaWRsZSwKLQkJVVNFX1BMQVRGT1JNX1BNX1NMRUVQX09QUwotCX0sCi19OwotCi0jZGVmaW5lIERFRkFVTFRfUE1fRE9NQUlOX1BUUgkoJmRlZmF1bHRfcG1fZG9tYWluKQotCi0jZWxzZQotCi0jZGVmaW5lIERFRkFVTFRfUE1fRE9NQUlOX1BUUglOVUxMCi0KLSNlbmRpZiAvKiBDT05GSUdfUE1fUlVOVElNRSAqLwotCi1zdGF0aWMgc3RydWN0IHBtX2Nsa19ub3RpZmllcl9ibG9jayBwbGF0Zm9ybV9idXNfbm90aWZpZXIgPSB7Ci0JLnBtX2RvbWFpbiA9IERFRkFVTFRfUE1fRE9NQUlOX1BUUiwKLQkuY29uX2lkcyA9IHsgTlVMTCwgfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNoX3BtX3J1bnRpbWVfaW5pdCh2b2lkKQotewotCXBtX2Nsa19hZGRfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmcGxhdGZvcm1fYnVzX25vdGlmaWVyKTsKLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoc2hfcG1fcnVudGltZV9pbml0KTsKLQotc3RhdGljIGludCBfX2luaXQgc2hfcG1fcnVudGltZV9sYXRlX2luaXQodm9pZCkKLXsKLQlwbV9nZW5wZF9wb3dlcm9mZl91bnVzZWQoKTsKLQlyZXR1cm4gMDsKLX0KLWxhdGVfaW5pdGNhbGwoc2hfcG1fcnVudGltZV9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zbXAtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NtcC1zaDczYTAuYwppbmRleCAzZmZkYmM5Li5iZTFhZGU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NtcC1zaDczYTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NtcC1zaDczYTAuYwpAQCAtNzQsNiArNzQsOCBAQAogCiBpbnQgX19jcHVpbml0IHNoNzNhMF9ib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1KQogeworCWNwdSA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCiAJLyogZW5hYmxlIGNhY2hlIGNvaGVyZW5jeSAqLwogCW1vZGlmeV9zY3VfY3B1X3BzcigwLCAzIDw8IChjcHUgKiA4KSk7CiAKQEAgLTg3LDYgKzg5LDggQEAKIAogdm9pZCBfX2luaXQgc2g3M2EwX3NtcF9wcmVwYXJlX2NwdXModm9pZCkKIHsKKwlpbnQgY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKDApOworCiAJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwogCiAJLyogTWFwIHRoZSByZXNldCB2ZWN0b3IgKGluIGhlYWRzbXAuUykgKi8KQEAgLTk0LDUgKzk4LDUgQEAKIAlfX3Jhd193cml0ZWwoX19wYShzaG1vYmlsZV9zZWNvbmRhcnlfdmVjdG9yKSwgX19pbyhTQkFSKSk7CiAKIAkvKiBlbmFibGUgY2FjaGUgY29oZXJlbmN5IG9uIENQVTAgKi8KLQltb2RpZnlfc2N1X2NwdV9wc3IoMCwgMyA8PCAoMCAqIDgpKTsKKwltb2RpZnlfc2N1X2NwdV9wc3IoMCwgMyA8PCAoY3B1ICogOCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3MzUyMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXNwZWFyM3h4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIE1lbW9yeSBtYXAgZm9yIFNQRUFyM3h4IG1hY2hpbmUgZmFtaWx5Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFNUIE1pY3JvZWxlY3Ryb25pY3MKLSAqIFZpcmVzaCBLdW1hcjx2aXJlc2gua3VtYXJAc3QuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19NQUNIX01FTU9SWV9ICi0KLSNpbmNsdWRlIDxwbGF0L21lbW9yeS5oPgotCi0jZW5kaWYgLyogX19NQUNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzAwX2V2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMwMF9ldmIuYwppbmRleCA2OTAwNmY2Li5hNWZmOThlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzAwX2V2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMDBfZXZiLmMKQEAgLTY0LDcgKzY0LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTUEVBUjMwMCwgIlNULVNQRUFSMzAwLUVWQiIpCi0JLmJvb3RfcGFyYW1zCT0JMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPQkweDEwMCwKIAkubWFwX2lvCQk9CXNwZWFyM3h4X21hcF9pbywKIAkuaW5pdF9pcnEJPQlzcGVhcjN4eF9pbml0X2lycSwKIAkudGltZXIJCT0JJnNwZWFyM3h4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMxMF9ldmIuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMTBfZXZiLmMKaW5kZXggYzg2ODRjZS4uNDVkMTgwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMxMF9ldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzEwX2V2Yi5jCkBAIC03MCw3ICs3MCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoU1BFQVIzMTAsICJTVC1TUEVBUjMxMC1FVkIiKQotCS5ib290X3BhcmFtcwk9CTB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0JMHgxMDAsCiAJLm1hcF9pbwkJPQlzcGVhcjN4eF9tYXBfaW8sCiAJLmluaXRfaXJxCT0Jc3BlYXIzeHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9CSZzcGVhcjN4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjBfZXZiLmMgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzIwX2V2Yi5jCmluZGV4IGExMmIzNTMuLjIyODc5ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjBfZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMyMF9ldmIuYwpAQCAtNjgsNyArNjgsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKFNQRUFSMzIwLCAiU1QtU1BFQVIzMjAtRVZCIikKLQkuYm9vdF9wYXJhbXMJPQkweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9CTB4MTAwLAogCS5tYXBfaW8JCT0Jc3BlYXIzeHhfbWFwX2lvLAogCS5pbml0X2lycQk9CXNwZWFyM3h4X2luaXRfaXJxLAogCS50aW1lcgkJPQkmc3BlYXIzeHhfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFmMDg4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtc3BlYXI2eHgvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogTWVtb3J5IG1hcCBmb3IgU1BFQXI2eHggbWFjaGluZSBmYW1pbHkKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1QgTWljcm9lbGVjdHJvbmljcwotICogUmFqZWV2IEt1bWFyPHJhamVldi1kbGgua3VtYXJAc3QuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19NQUNIX01FTU9SWV9ICi0KLSNpbmNsdWRlIDxwbGF0L21lbW9yeS5oPgotCi0jZW5kaWYJLyogX19NQUNIX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L3NwZWFyNjAwX2V2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9zcGVhcjYwMF9ldmIuYwppbmRleCBmMTljZWZlLi44MjM4ZmUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L3NwZWFyNjAwX2V2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvc3BlYXI2MDBfZXZiLmMKQEAgLTQzLDcgKzQzLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChTUEVBUjYwMCwgIlNULVNQRUFSNjAwLUVWQiIpCi0JLmJvb3RfcGFyYW1zCT0JMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPQkweDEwMCwKIAkubWFwX2lvCQk9CXNwZWFyNnh4X21hcF9pbywKIAkuaW5pdF9pcnEJPQlzcGVhcjZ4eF9pbml0X2lycSwKIAkudGltZXIJCT0JJnNwZWFyNnh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10Y2M4ay9ib2FyZC10Y2M4MDAwLXNkay5jIGIvYXJjaC9hcm0vbWFjaC10Y2M4ay9ib2FyZC10Y2M4MDAwLXNkay5jCmluZGV4IDRjYjNjMmQuLjc3N2E1YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGNjOGsvYm9hcmQtdGNjODAwMC1zZGsuYworKysgYi9hcmNoL2FybS9tYWNoLXRjYzhrL2JvYXJkLXRjYzgwMDAtc2RrLmMKQEAgLTczLDcgKzczLDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChUQ0M4MDAwX1NESywgIlRlbGVjaGlwcyBUQ0M4MDAwLVNESyBEZW1vIEJvYXJkIikKLQkuYm9vdF9wYXJhbXMJPSBQTEFUX1BIWVNfT0ZGU0VUICsgMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHRjYzhrX21hcF9pbywKIAkuaW5pdF9pcnEJPSB0Y2M4a19pbml0X2lycSwKIAkuaW5pdF9tYWNoaW5lCT0gdGNjOGtfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwppbmRleCBkODJlYmFiLi45MWFmZjdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCkBAIC02OSw2ICs2OSwxMiBAQAogICAgICAgIGhlbHAKICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBXYXJpbyB2ZXJzaW9uIG9mIFNlYWJvYXJkCiAKK2NvbmZpZyBNQUNIX1ZFTlRBTkEKKyAgICAgICBib29sICJWZW50YW5hIGJvYXJkIgorICAgICAgIHNlbGVjdCBNQUNIX1RFR1JBX0RUCisgICAgICAgaGVscAorICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIG5WaWRpYSBWZW50YW5hIGRldmVsb3BtZW50IHBsYXRmb3JtCisKIGNob2ljZQogICAgICAgICBwcm9tcHQgIkxvdy1sZXZlbCBkZWJ1ZyBjb25zb2xlIFVBUlQiCiAgICAgICAgIGRlZmF1bHQgVEVHUkFfREVCVUdfVUFSVF9OT05FCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQppbmRleCBmMTFiOTEwLi45MWEwN2UxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIAogb2JqLSR7Q09ORklHX01BQ0hfVEVHUkFfRFR9ICAgICAgICAgICAgICs9IGJvYXJkLWR0Lm8KIG9iai0ke0NPTkZJR19NQUNIX1RFR1JBX0RUfSAgICAgICAgICAgICArPSBib2FyZC1oYXJtb255LXBpbm11eC5vCitvYmotJHtDT05GSUdfTUFDSF9URUdSQV9EVH0gICAgICAgICAgICAgKz0gYm9hcmQtc2VhYm9hcmQtcGlubXV4Lm8KIAogb2JqLSR7Q09ORklHX01BQ0hfVFJJTVNMSUNFfSAgICAgICAgICAgICs9IGJvYXJkLXRyaW1zbGljZS5vCiBvYmotJHtDT05GSUdfTUFDSF9UUklNU0xJQ0V9ICAgICAgICAgICAgKz0gYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QKaW5kZXggNWU4NzBkMi4uYmQxMmM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUuYm9vdApAQCAtNCwzICs0LDQgQEAKIAogZHRiLSQoQ09ORklHX01BQ0hfSEFSTU9OWSkgKz0gdGVncmEtaGFybW9ueS5kdGIKIGR0Yi0kKENPTkZJR19NQUNIX1NFQUJPQVJEKSArPSB0ZWdyYS1zZWFib2FyZC5kdGIKK2R0Yi0kKENPTkZJR19NQUNIX1ZFTlRBTkEpICs9IHRlZ3JhLXZlbnRhbmEuZHRiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMKaW5kZXggOWY0N2UwNC4uNzQ3NDNhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1kdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYwpAQCAtNDcsNyArNDcsNyBAQAogCiB2b2lkIGhhcm1vbnlfcGlubXV4X2luaXQodm9pZCk7CiB2b2lkIHNlYWJvYXJkX3Bpbm11eF9pbml0KHZvaWQpOwotCit2b2lkIHZlbnRhbmFfcGlubXV4X2luaXQodm9pZCk7CiAKIHN0cnVjdCBvZl9kZXZfYXV4ZGF0YSB0ZWdyYTIwX2F1eGRhdGFfbG9va3VwW10gX19pbml0ZGF0YSA9IHsKIAlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtc2RoY2kiLCBURUdSQV9TRE1NQzFfQkFTRSwgInNkaGNpLXRlZ3JhLjAiLCBOVUxMKSwKQEAgLTgwLDkgKzgwLDE5IEBACiAJe30KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm1hY2hpbmU7CisJdm9pZCAoKmluaXQpKHZvaWQpOworfSBwaW5tdXhfY29uZmlnc1tdID0geworCXsgIm52aWRpYSxoYXJtb255IiwgaGFybW9ueV9waW5tdXhfaW5pdCB9LAorCXsgIm52aWRpYSxzZWFib2FyZCIsIHNlYWJvYXJkX3Bpbm11eF9pbml0IH0sCisJeyAibnZpZGlhLHZlbnRhbmEiLCB2ZW50YW5hX3Bpbm11eF9pbml0IH0sCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgdGVncmFfZHRfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlpbnQgaTsKIAogCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhOVUxMLCB0ZWdyYV9kdF9naWNfbWF0Y2gsCiAJCQkJCQlURUdSQV9BUk1fSU5UX0RJU1RfQkFTRSk7CkBAIC05MSwyMSArMTAxLDI4IEBACiAKIAl0ZWdyYV9jbGtfaW5pdF9mcm9tX3RhYmxlKHRlZ3JhX2R0X2Nsa19pbml0X3RhYmxlKTsKIAotCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSxoYXJtb255IikpCi0JCWhhcm1vbnlfcGlubXV4X2luaXQoKTsKLQllbHNlIGlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSxzZWFib2FyZCIpKQotCQlzZWFib2FyZF9waW5tdXhfaW5pdCgpOwotCiAJLyoKIAkgKiBGaW5pc2hlZCB3aXRoIHRoZSBzdGF0aWMgcmVnaXN0cmF0aW9ucyBub3c7IGZpbGwgaW4gdGhlIG1pc3NpbmcKIAkgKiBkZXZpY2VzCiAJICovCi0Jb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgdGVncmFfZHRfbWF0Y2hfdGFibGUsIHRlZ3JhMjBfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIHRlZ3JhX2R0X21hdGNoX3RhYmxlLAorCQkJCXRlZ3JhMjBfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGlubXV4X2NvbmZpZ3MpOyBpKyspIHsKKwkJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZShwaW5tdXhfY29uZmlnc1tpXS5tYWNoaW5lKSkgeworCQkJcGlubXV4X2NvbmZpZ3NbaV0uaW5pdCgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlXQVJOKGkgPT0gQVJSQVlfU0laRShwaW5tdXhfY29uZmlncyksCisJCSJVbmtub3duIHBsYXRmb3JtISBQaW5tdXhpbmcgbm90IGluaXRpYWxpemVkXG4iKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKiB0ZWdyYV9kdF9ib2FyZF9jb21wYXRbXSA9IHsKIAkibnZpZGlhLGhhcm1vbnkiLAogCSJudmlkaWEsc2VhYm9hcmQiLAorCSJudmlkaWEsdmVudGFuYSIsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBjaWUuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wY2llLmMKaW5kZXggOWMyN2I5NS4uNmRiN2Q2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcGNpZS5jCkBAIC0yNCwxMiArMjQsMTAgQEAKIAogI2luY2x1ZGUgPG1hY2gvcGlubXV4Lmg+CiAjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJib2FyZC1oYXJtb255LmgiCiAKICNpZmRlZiBDT05GSUdfVEVHUkFfUENJCiAKLS8qIEdQSU8gMyBvZiB0aGUgUE1JQyAqLwotI2RlZmluZSBFTl9WRERfMVYwNV9HUElPCShURUdSQV9OUl9HUElPUyArIDIpCi0KIHN0YXRpYyBpbnQgX19pbml0IGhhcm1vbnlfcGNpZV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yID0gTlVMTDsKQEAgLTM4LDExICszNiwxMSBAQAogCWlmICghbWFjaGluZV9pc19oYXJtb255KCkpCiAJCXJldHVybiAwOwogCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KEVOX1ZERF8xVjA1X0dQSU8sICJFTl9WRERfMVYwNSIpOworCWVyciA9IGdwaW9fcmVxdWVzdChURUdSQV9HUElPX0VOX1ZERF8xVjA1X0dQSU8sICJFTl9WRERfMVYwNSIpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoRU5fVkREXzFWMDVfR1BJTywgMSk7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFRFR1JBX0dQSU9fRU5fVkREXzFWMDVfR1BJTywgMSk7CiAKIAlyZWd1bGF0b3IgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICJwZXhfY2xrIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKHJlZ3VsYXRvcikpCkBAIC02OCw3ICs2Niw3IEBACiAJcmVndWxhdG9yX2Rpc2FibGUocmVndWxhdG9yKTsKIAlyZWd1bGF0b3JfcHV0KHJlZ3VsYXRvcik7CiBlcnJfcmVnOgotCWdwaW9fZnJlZShFTl9WRERfMVYwNV9HUElPKTsKKwlncGlvX2ZyZWUoVEVHUkFfR1BJT19FTl9WRERfMVYwNV9HUElPKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcGlubXV4LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcGlubXV4LmMKaW5kZXggNGQ2M2UyZS4uN2E0YTI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LXBpbm11eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1waW5tdXguYwpAQCAtMTYsMTAgKzE2LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKwogI2luY2x1ZGUgPG1hY2gvcGlubXV4Lmg+CiAKICNpbmNsdWRlICJncGlvLW5hbWVzLmgiCiAjaW5jbHVkZSAiYm9hcmQtaGFybW9ueS5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIHN0cnVjdCB0ZWdyYV9waW5ncm91cF9jb25maWcgaGFybW9ueV9waW5tdXhbXSA9IHsKIAl7VEVHUkFfUElOR1JPVVBfQVRBLCAgIFRFR1JBX01VWF9JREUsICAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCkBAIC0xNDAsNiArMTQzLDExIEBACiAJe1RFR1JBX1BJTkdST1VQX1hNMkQsICBURUdSQV9NVVhfTk9ORSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBpbm11eF9kZXZpY2VzW10gPSB7CisJJnRlZ3JhX2dwaW9fZGV2aWNlLAorCSZ0ZWdyYV9waW5tdXhfZGV2aWNlLAorfTsKKwogc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIGdwaW9fdGFibGVbXSA9IHsKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDJfQ0QsCQkuZW5hYmxlID0gdHJ1ZQl9LAogCXsgLmdwaW8gPSBURUdSQV9HUElPX1NEMl9XUCwJCS5lbmFibGUgPSB0cnVlCX0sCkBAIC0xNTUsNiArMTYzLDEwIEBACiAKIHZvaWQgaGFybW9ueV9waW5tdXhfaW5pdCh2b2lkKQogeworCWlmICghb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsdGVncmEyMCIpKQorCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhwaW5tdXhfZGV2aWNlcywKKwkJCQkJQVJSQVlfU0laRShwaW5tdXhfZGV2aWNlcykpOworCiAJdGVncmFfcGlubXV4X2NvbmZpZ190YWJsZShoYXJtb255X3Bpbm11eCwgQVJSQVlfU0laRShoYXJtb255X3Bpbm11eCkpOwogCiAJdGVncmFfZ3Bpb19jb25maWcoZ3Bpb190YWJsZSwgQVJSQVlfU0laRShncGlvX3RhYmxlKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnktcG93ZXIuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wb3dlci5jCmluZGV4IDVhZDhiMmYuLjIxZDEyODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wb3dlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS1wb3dlci5jCkBAIC0xOCwxMCArMTgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1ODZ4Lmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKICNpbmNsdWRlICJib2FyZC1oYXJtb255LmgiCkBAIC0xMTMsNiArMTE0LDE2IEBACiAKIGludCBfX2luaXQgaGFybW9ueV9yZWd1bGF0b3JfaW5pdCh2b2lkKQogeworCXZvaWQgX19pb21lbSAqcG1jID0gSU9fQUREUkVTUyhURUdSQV9QTUNfQkFTRSk7CisJdTMyIHBtY19jdHJsOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIHBvd2VyIG1hbmFnZW1lbnQgY29udHJvbGxlciB0byB0cmlnZ2VyIFBNVQorCSAqIGludGVycnVwdHMgd2hlbiBsb3cKKwkgKi8KKwlwbWNfY3RybCA9IHJlYWRsKHBtYyArIFBNQ19DVFJMKTsKKwl3cml0ZWwocG1jX2N0cmwgfCBQTUNfQ1RSTF9JTlRSX0xPVywgcG1jICsgUE1DX0NUUkwpOworCiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMywgaGFybW9ueV9yZWd1bGF0b3JzLCAxKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuYwppbmRleCBjNzhjZTQxLi5mMGJkYzVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWhhcm1vbnkuYwpAQCAtNDksNyArNDksOCBAQAogCQkubWVtYmFzZQk9IElPX0FERFJFU1MoVEVHUkFfVUFSVERfQkFTRSksCiAJCS5tYXBiYXNlCT0gVEVHUkFfVUFSVERfQkFTRSwKIAkJLmlycQkJPSBJTlRfVUFSVEQsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZJWEVEX1RZUEUsCisJCS50eXBlCQk9IFBPUlRfVEVHUkEsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCiAJCS51YXJ0Y2xrCT0gMjE2MDAwMDAwLApAQCAtMTE3LDYgKzExOCw3IEBACiAJJnRlZ3JhX3NkaGNpX2RldmljZTEsCiAJJnRlZ3JhX3NkaGNpX2RldmljZTIsCiAJJnRlZ3JhX3NkaGNpX2RldmljZTQsCisJJnRlZ3JhX2VoY2kzX2RldmljZSwKIAkmdGVncmFfaTJzX2RldmljZTEsCiAJJnRlZ3JhX2Rhc19kZXZpY2UsCiAJJnRlZ3JhX3BjbV9kZXZpY2UsCkBAIC0xNDAsNiArMTQyLDcgQEAKIAl7ICJwbGxfYV9vdXQwIiwJInBsbF9hIiwJMTEyODk2MDAsCXRydWUgfSwKIAl7ICJjZGV2MSIsCU5VTEwsCQkwLAkJdHJ1ZSB9LAogCXsgImkyczEiLAkicGxsX2Ffb3V0MCIsCTExMjg5NjAwLAlmYWxzZX0sCisJeyAidXNiMyIsCSJjbGtfbSIsCTEyMDAwMDAwLAl0cnVlIH0sCiAJeyBOVUxMLAkJTlVMTCwJCTAsCQkwfSwKIH07CiAKQEAgLTE3OSw3ICsxODIsNyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEhBUk1PTlksICJoYXJtb255IikKLQkuYm9vdF9wYXJhbXMgID0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkuZml4dXAJCT0gdGVncmFfaGFybW9ueV9maXh1cCwKIAkubWFwX2lvICAgICAgICAgPSB0ZWdyYV9tYXBfY29tbW9uX2lvLAogCS5pbml0X2Vhcmx5CT0gdGVncmFfaW5pdF9lYXJseSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtaGFybW9ueS5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmgKaW5kZXggZDg1MTQyZS4uMTM5ZDk2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1oYXJtb255LmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgX01BQ0hfVEVHUkFfQk9BUkRfSEFSTU9OWV9ICiAjZGVmaW5lIF9NQUNIX1RFR1JBX0JPQVJEX0hBUk1PTllfSAogCisjaW5jbHVkZSA8bWFjaC9ncGlvLXRlZ3JhLmg+CisKICNkZWZpbmUgSEFSTU9OWV9HUElPX1RQUzY1ODZYKF94XykJKFRFR1JBX05SX0dQSU9TICsgKF94XykpCiAjZGVmaW5lIEhBUk1PTllfR1BJT19XTTg5MDMoX3hfKQkoSEFSTU9OWV9HUElPX1RQUzY1ODZYKDQpICsgKF94XykpCiAKQEAgLTMxLDYgKzMzLDcgQEAKICNkZWZpbmUgVEVHUkFfR1BJT19IUF9ERVQJCVRFR1JBX0dQSU9fUFcyCiAjZGVmaW5lIFRFR1JBX0dQSU9fSU5UX01JQ19FTgkJVEVHUkFfR1BJT19QWDAKICNkZWZpbmUgVEVHUkFfR1BJT19FWFRfTUlDX0VOCQlURUdSQV9HUElPX1BYMQorI2RlZmluZSBURUdSQV9HUElPX0VOX1ZERF8xVjA1X0dQSU8JSEFSTU9OWV9HUElPX1RQUzY1ODZYKDIpCiAKIHZvaWQgaGFybW9ueV9waW5tdXhfaW5pdCh2b2lkKTsKIGludCBoYXJtb255X3JlZ3VsYXRvcl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC1waW5tdXguYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAtcGlubXV4LmMKaW5kZXggYmRkMjYyNy4uYmUzMGUyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC1waW5tdXguYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLXBpbm11eC5jCkBAIC0xNiwxMCArMTYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCiAjaW5jbHVkZSA8bWFjaC9waW5tdXguaD4KIAogI2luY2x1ZGUgImdwaW8tbmFtZXMuaCIKICNpbmNsdWRlICJib2FyZC1wYXowMC5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKIAogc3RhdGljIHN0cnVjdCB0ZWdyYV9waW5ncm91cF9jb25maWcgcGF6MDBfcGlubXV4W10gPSB7CiAJe1RFR1JBX1BJTkdST1VQX0FUQSwgICBURUdSQV9NVVhfR01JLCAgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LApAQCAtMTQwLDE1ICsxNDMsMjcgQEAKIAl7VEVHUkFfUElOR1JPVVBfWE0yRCwgIFRFR1JBX01VWF9OT05FLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGlubXV4X2RldmljZXNbXSA9IHsKKwkmdGVncmFfZ3Bpb19kZXZpY2UsCisJJnRlZ3JhX3Bpbm11eF9kZXZpY2UsCit9OworCiBzdGF0aWMgc3RydWN0IHRlZ3JhX2dwaW9fdGFibGUgZ3Bpb190YWJsZVtdID0gewogCXsgLmdwaW8gPSBURUdSQV9HUElPX1NEMV9DRCwJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDFfV1AsCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fU0QxX1BPV0VSLAkuZW5hYmxlID0gdHJ1ZSB9LAogCXsgLmdwaW8gPSBURUdSQV9VTFBJX1JTVCwJLmVuYWJsZSA9IHRydWUgfSwKKwl7IC5ncGlvID0gVEVHUkFfV0lGSV9QV1JOLAkuZW5hYmxlID0gdHJ1ZSB9LAorCXsgLmdwaW8gPSBURUdSQV9XSUZJX1JTVCwJLmVuYWJsZSA9IHRydWUgfSwKKwl7IC5ncGlvID0gVEVHUkFfV0lGSV9MRUQsCS5lbmFibGUgPSB0cnVlIH0sCiB9OwogCiB2b2lkIHBhejAwX3Bpbm11eF9pbml0KHZvaWQpCiB7CisJaWYgKCFvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSx0ZWdyYTIwIikpCisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHBpbm11eF9kZXZpY2VzLAorCQkJCQlBUlJBWV9TSVpFKHBpbm11eF9kZXZpY2VzKSk7CisKIAl0ZWdyYV9waW5tdXhfY29uZmlnX3RhYmxlKHBhejAwX3Bpbm11eCwgQVJSQVlfU0laRShwYXowMF9waW5tdXgpKTsKIAogCXRlZ3JhX2dwaW9fY29uZmlnKGdwaW9fdGFibGUsIEFSUkFZX1NJWkUoZ3Bpb190YWJsZSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5jCmluZGV4IDVlNmJjNzcuLjU1YzU1YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwtZ3Bpby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CkBAIC0zNSw3ICszNyw2IEBACiAjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvc2RoY2kuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2luY2x1ZGUgImJvYXJkLmgiCiAjaW5jbHVkZSAiYm9hcmQtcGF6MDAuaCIKQEAgLTQ1LDEwICs0NiwyMiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGRlYnVnX3VhcnRfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKKwkJLyogc2VyaWFsIHBvcnQgb24gSlAxICovCisJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhURUdSQV9VQVJUQV9CQVNFKSwKKwkJLm1hcGJhc2UJPSBURUdSQV9VQVJUQV9CQVNFLAorCQkuaXJxCQk9IElOVF9VQVJUQSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZJWEVEX1RZUEUsCisJCS50eXBlCQk9IFBPUlRfVEVHUkEsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDIsCisJCS51YXJ0Y2xrCT0gMjE2MDAwMDAwLAorCX0sIHsKKwkJLyogc2VyaWFsIHBvcnQgb24gbWluaS1wY2llICovCiAJCS5tZW1iYXNlCT0gSU9fQUREUkVTUyhURUdSQV9VQVJURF9CQVNFKSwKIAkJLm1hcGJhc2UJPSBURUdSQV9VQVJURF9CQVNFLAogCQkuaXJxCQk9IElOVF9VQVJURCwKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfRklYRURfVFlQRSwKKwkJLnR5cGUJCT0gUE9SVF9URUdSQSwKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKIAkJLnJlZ3NoaWZ0CT0gMiwKIAkJLnVhcnRjbGsJPSAyMTYwMDAwMDAsCkBAIC02NSwxMCArNzgsNDggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCByZmtpbGxfZ3Bpb19wbGF0Zm9ybV9kYXRhIHdpZmlfcmZraWxsX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUJCT0gIndpZmlfcmZraWxsIiwKKwkucmVzZXRfZ3Bpbwk9IFRFR1JBX1dJRklfUlNULAorCS5zaHV0ZG93bl9ncGlvCT0gVEVHUkFfV0lGSV9QV1JOLAorCS50eXBlCT0gUkZLSUxMX1RZUEVfV0xBTiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHdpZmlfcmZraWxsX2RldmljZSA9IHsKKwkubmFtZQk9ICJyZmtpbGxfZ3BpbyIsCisJLmlkCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmd2lmaV9yZmtpbGxfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2xlZCBncGlvX2xlZHNbXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAid2lmaS1sZWQiLAorCQkuZGVmYXVsdF90cmlnZ2VyCT0gInJma2lsbDAiLAorCQkuZ3BpbwkJCT0gVEVHUkFfV0lGSV9MRUQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBncGlvX2xlZF9pbmZvID0geworCS5sZWRzCQk9IGdwaW9fbGVkcywKKwkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGdwaW9fbGVkcyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZWRzX2dwaW8gPSB7CisJLm5hbWUJPSAibGVkcy1ncGlvIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZncGlvX2xlZF9pbmZvLAorICAgICAgICB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBhejAwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZkZWJ1Z191YXJ0LAotCSZ0ZWdyYV9zZGhjaV9kZXZpY2UxLAogCSZ0ZWdyYV9zZGhjaV9kZXZpY2U0LAorCSZ0ZWdyYV9zZGhjaV9kZXZpY2UxLAorCSZ3aWZpX3Jma2lsbF9kZXZpY2UsCisJJmxlZHNfZ3BpbywKIH07CiAKIHN0YXRpYyB2b2lkIHBhejAwX2kyY19pbml0KHZvaWQpCkBAIC05NCw3ICsxNDUsMTQgQEAKIAogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IHRlZ3JhX2Nsa19pbml0X3RhYmxlIHBhejAwX2Nsa19pbml0X3RhYmxlW10gPSB7CiAJLyogbmFtZQkJcGFyZW50CQlyYXRlCQllbmFibGVkICovCisJeyAidWFydGEiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWUgfSwKIAl7ICJ1YXJ0ZCIsCSJwbGxfcCIsCTIxNjAwMDAwMCwJdHJ1ZSB9LAorCisJeyAicGxsX3Bfb3V0NCIsCSJwbGxfcCIsCTI0MDAwMDAwLAl0cnVlIH0sCisJeyAidXNiZCIsCSJjbGtfbSIsCTEyMDAwMDAwLAlmYWxzZSB9LAorCXsgInVzYjIiLAkiY2xrX20iLAkxMjAwMDAwMCwJZmFsc2UgfSwKKwl7ICJ1c2IzIiwJImNsa19tIiwJMTIwMDAwMDAsCWZhbHNlIH0sCisKIAl7IE5VTEwsCQlOVUxMLAkJMCwJCTB9LAogfTsKIApAQCAtMTI3LDcgKzE4NSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUEFaMDAsICJUb3NoaWJhIEFDMTAwIC8gRHluYWJvb2sgQVoiKQotCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLmZpeHVwCQk9IHRlZ3JhX3BhejAwX2ZpeHVwLAogCS5tYXBfaW8gICAgICAgICA9IHRlZ3JhX21hcF9jb21tb25faW8sCiAJLmluaXRfZWFybHkJPSB0ZWdyYV9pbml0X2Vhcmx5LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1wYXowMC5oCmluZGV4IGQ0ZmYzOWQuLjhhZmYwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtcGF6MDAuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmgKQEAgLTE3LDExICsxNywyMSBAQAogI2lmbmRlZiBfTUFDSF9URUdSQV9CT0FSRF9QQVowMF9ICiAjZGVmaW5lIF9NQUNIX1RFR1JBX0JPQVJEX1BBWjAwX0gKIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgorCisvKiBTRENBUkQgKi8KICNkZWZpbmUgVEVHUkFfR1BJT19TRDFfQ0QJCVRFR1JBX0dQSU9fUFY1CiAjZGVmaW5lIFRFR1JBX0dQSU9fU0QxX1dQCQlURUdSQV9HUElPX1BIMQogI2RlZmluZSBURUdSQV9HUElPX1NEMV9QT1dFUgkJVEVHUkFfR1BJT19QVDMKKworLyogVUxQSSAqLwogI2RlZmluZSBURUdSQV9VTFBJX1JTVAkJCVRFR1JBX0dQSU9fUFYwCiAKKy8qIFdJRkkgKi8KKyNkZWZpbmUgVEVHUkFfV0lGSV9QV1JOCQkJVEVHUkFfR1BJT19QSzUKKyNkZWZpbmUgVEVHUkFfV0lGSV9SU1QJCQlURUdSQV9HUElPX1BEMQorI2RlZmluZSBURUdSQV9XSUZJX0xFRAkJCVRFR1JBX0dQSU9fUEQwCisKIHZvaWQgcGF6MDBfcGlubXV4X2luaXQodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC1waW5tdXguYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQtcGlubXV4LmMKaW5kZXggMGJkYTQ5NS4uYjFjMjk3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC1waW5tdXguYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLXBpbm11eC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOVklESUEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMCwyMDExIE5WSURJQSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCkBAIC0xNSwxMiArMTYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxtYWNoL3Bpbm11eC5oPgogI2luY2x1ZGUgPG1hY2gvcGlubXV4LXQyLmg+CiAKICNpbmNsdWRlICJncGlvLW5hbWVzLmgiCiAjaW5jbHVkZSAiYm9hcmQtc2VhYm9hcmQuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCiAKICNkZWZpbmUgREVGQVVMVF9EUklWRShfbmFtZSkJCQkJCVwKIAl7CQkJCQkJCVwKQEAgLTQ5LDcgKzUyLDcgQEAKIAl7VEVHUkFfUElOR1JPVVBfQ1JUUCwgIFRFR1JBX01VWF9DUlQsICAgICAgICAgICBURUdSQV9QVVBEX1BVTExfVVAsICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfQ1NVUywgIFRFR1JBX01VWF9WSV9TRU5TT1JfQ0xLLCBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfREFQMSwgIFRFR1JBX01VWF9EQVAxLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCi0Je1RFR1JBX1BJTkdST1VQX0RBUDIsICBURUdSQV9NVVhfREFQMiwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCisJe1RFR1JBX1BJTkdST1VQX0RBUDIsICBURUdSQV9NVVhfREFQMiwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAogCXtURUdSQV9QSU5HUk9VUF9EQVAzLCAgVEVHUkFfTVVYX0RBUDMsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAogCXtURUdSQV9QSU5HUk9VUF9EQVA0LCAgVEVHUkFfTVVYX0RBUDQsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKIAl7VEVHUkFfUElOR1JPVVBfRERDLCAgIFRFR1JBX01VWF9SU1ZEMiwgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKQEAgLTEzMyw3ICsxMzYsNyBAQAogCXtURUdSQV9QSU5HUk9VUF9TUERPLCAgVEVHUkFfTVVYX1JTVkQyLCAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKIAl7VEVHUkFfUElOR1JPVVBfU1BJQSwgIFRFR1JBX01VWF9HTUksICAgICAgICAgICBURUdSQV9QVVBEX1BVTExfVVAsICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKIAl7VEVHUkFfUElOR1JPVVBfU1BJQiwgIFRFR1JBX01VWF9HTUksICAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKLQl7VEVHUkFfUElOR1JPVVBfU1BJQywgIFRFR1JBX01VWF9HTUksICAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfU1BJQywgIFRFR1JBX01VWF9HTUksICAgICAgICAgICBURUdSQV9QVVBEX1BVTExfVVAsICAgVEVHUkFfVFJJX05PUk1BTH0sCiAJe1RFR1JBX1BJTkdST1VQX1NQSUQsICBURUdSQV9NVVhfU1BJMSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX1NQSUUsICBURUdSQV9NVVhfU1BJMSwgICAgICAgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9UUklTVEFURX0sCiAJe1RFR1JBX1BJTkdST1VQX1NQSUYsICBURUdSQV9NVVhfU1BJMSwgICAgICAgICAgVEVHUkFfUFVQRF9QVUxMX0RPV04sIFRFR1JBX1RSSV9UUklTVEFURX0sCkBAIC0xNTcsMjQgKzE2MCw4NiBAQAogCXtURUdSQV9QSU5HUk9VUF9YTTJELCAgVEVHUkFfTVVYX05PTkUsICAgICAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKIH07CiAKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCB0ZWdyYV9waW5ncm91cF9jb25maWcgdmVudGFuYV9waW5tdXhbXSA9IHsKKwl7VEVHUkFfUElOR1JPVVBfREFQMywgVEVHUkFfTVVYX0RBUDMsICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX1RSSVNUQVRFfSwKKwl7VEVHUkFfUElOR1JPVVBfRERDLCAgVEVHUkFfTVVYX1JTVkQyLCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX0RUQSwgIFRFR1JBX01VWF9WSSwgICAgICAgVEVHUkFfUFVQRF9QVUxMX0RPV04sIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9EVEIsICBURUdSQV9NVVhfVkksICAgICAgIFRFR1JBX1BVUERfUFVMTF9ET1dOLCBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfRFRDLCAgVEVHUkFfTVVYX1ZJLCAgICAgICBURUdSQV9QVVBEX1BVTExfRE9XTiwgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX0RURCwgIFRFR1JBX01VWF9WSSwgICAgICAgVEVHUkFfUFVQRF9QVUxMX0RPV04sIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9HTUQsICBURUdSQV9NVVhfU0ZMQVNILCAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9MUFcwLCBURUdSQV9NVVhfUlNWRDQsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfTFBXMiwgVEVHUkFfTVVYX1JTVkQ0LCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX0xTQzEsIFRFR1JBX01VWF9SU1ZENCwgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9MU0NLLCBURUdSQV9NVVhfUlNWRDQsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9MU0RBLCBURUdSQV9NVVhfUlNWRDQsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9QVEEsICBURUdSQV9NVVhfUlNWRDIsICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfTk9STUFMfSwKKwl7VEVHUkFfUElOR1JPVVBfU0xYQywgVEVHUkFfTVVYX1NESU8zLCAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgVEVHUkFfVFJJX05PUk1BTH0sCisJe1RFR1JBX1BJTkdST1VQX1NMWEssIFRFR1JBX01VWF9TRElPMywgICAgVEVHUkFfUFVQRF9OT1JNQUwsICAgIFRFR1JBX1RSSV9OT1JNQUx9LAorCXtURUdSQV9QSU5HUk9VUF9TUElBLCBURUdSQV9NVVhfR01JLCAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9TUElDLCBURUdSQV9NVVhfR01JLCAgICAgIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorCXtURUdSQV9QSU5HUk9VUF9TUElHLCBURUdSQV9NVVhfU1BJMl9BTFQsIFRFR1JBX1BVUERfTk9STUFMLCAgICBURUdSQV9UUklfVFJJU1RBVEV9LAorfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBpbm11eF9kZXZpY2VzW10gPSB7CisJJnRlZ3JhX2dwaW9fZGV2aWNlLAorCSZ0ZWdyYV9waW5tdXhfZGV2aWNlLAorfTsKIAotCi1zdGF0aWMgc3RydWN0IHRlZ3JhX2dwaW9fdGFibGUgZ3Bpb190YWJsZVtdID0geworc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIGNvbW1vbl9ncGlvX3RhYmxlW10gPSB7CiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fU0QyX0NELAkJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19TRDJfV1AsCQkuZW5hYmxlID0gdHJ1ZSB9LAogCXsgLmdwaW8gPSBURUdSQV9HUElPX1NEMl9QT1dFUiwJCS5lbmFibGUgPSB0cnVlIH0sCiAJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fTElEU1dJVENILAkJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19QT1dFUktFWSwJCS5lbmFibGUgPSB0cnVlIH0sCisJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fSFBfREVULAkJLmVuYWJsZSA9IHRydWUgfSwKIAl7IC5ncGlvID0gVEVHUkFfR1BJT19JU0wyOTAxOF9JUlEsCS5lbmFibGUgPSB0cnVlIH0sCisJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fQ0RDX0lSUSwJCS5lbmFibGUgPSB0cnVlIH0sCisJeyAuZ3BpbyA9IFRFR1JBX0dQSU9fVVNCMSwJCS5lbmFibGUgPSB0cnVlIH0sCiB9OwogCi12b2lkIF9faW5pdCBzZWFib2FyZF9waW5tdXhfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHVwZGF0ZV9waW5tdXgoc3RydWN0IHRlZ3JhX3Bpbmdyb3VwX2NvbmZpZyAqbmV3dGJsLCBpbnQgc2l6ZSkKIHsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnICpuZXdfcGluZ3JvdXAsICpiYXNlX3Bpbmdyb3VwOworCisJLyogVXBkYXRlIGJhc2Ugc2VhYm9hcmQgcGlubXV4IHRhYmxlIHdpdGggc2Vjb25kYXJ5IGJvYXJkCisJICogc3BlY2lmaWMgcGlubXV4IHRhYmxlIHRhYmxlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbmV3X3Bpbmdyb3VwID0gJm5ld3RibFtpXTsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc2VhYm9hcmRfcGlubXV4KTsgaisrKSB7CisJCQliYXNlX3Bpbmdyb3VwID0gJnNlYWJvYXJkX3Bpbm11eFtqXTsKKwkJCWlmIChuZXdfcGluZ3JvdXAtPnBpbmdyb3VwID09IGJhc2VfcGluZ3JvdXAtPnBpbmdyb3VwKSB7CisJCQkJKmJhc2VfcGluZ3JvdXAgPSAqbmV3X3Bpbmdyb3VwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIF9faW5pdCBzZWFib2FyZF9jb21tb25fcGlubXV4X2luaXQodm9pZCkKK3sKKwlpZiAoIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgibnZpZGlhLHRlZ3JhMjAiKSkKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMocGlubXV4X2RldmljZXMsCisJCQkJCUFSUkFZX1NJWkUocGlubXV4X2RldmljZXMpKTsKKwogCXRlZ3JhX3Bpbm11eF9jb25maWdfdGFibGUoc2VhYm9hcmRfcGlubXV4LCBBUlJBWV9TSVpFKHNlYWJvYXJkX3Bpbm11eCkpOwogCiAJdGVncmFfZHJpdmVfcGlubXV4X2NvbmZpZ190YWJsZShzZWFib2FyZF9kcml2ZV9waW5tdXgsCiAJCQkJCUFSUkFZX1NJWkUoc2VhYm9hcmRfZHJpdmVfcGlubXV4KSk7CiAKLQl0ZWdyYV9ncGlvX2NvbmZpZyhncGlvX3RhYmxlLCBBUlJBWV9TSVpFKGdwaW9fdGFibGUpKTsKKwl0ZWdyYV9ncGlvX2NvbmZpZyhjb21tb25fZ3Bpb190YWJsZSwgQVJSQVlfU0laRShjb21tb25fZ3Bpb190YWJsZSkpOwogfQorCit2b2lkIF9faW5pdCBzZWFib2FyZF9waW5tdXhfaW5pdCh2b2lkKQoreworCXNlYWJvYXJkX2NvbW1vbl9waW5tdXhfaW5pdCgpOworfQorCit2b2lkIF9faW5pdCB2ZW50YW5hX3Bpbm11eF9pbml0KHZvaWQpCit7CisJdXBkYXRlX3Bpbm11eCh2ZW50YW5hX3Bpbm11eCwgQVJSQVlfU0laRSh2ZW50YW5hX3Bpbm11eCkpOworCXNlYWJvYXJkX2NvbW1vbl9waW5tdXhfaW5pdCgpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmMKaW5kZXggNTZjYmFiZi4uYmYxM2VhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuYwpAQCAtMjUsOSArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CiAKKyNpbmNsdWRlIDxzb3VuZC93bTg5MDMuaD4KKwogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL3NkaGNpLmg+CisjaW5jbHVkZSA8bWFjaC90ZWdyYV93bTg5MDNfcGRhdGEuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtNDEsNyArNDQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBkZWJ1Z191YXJ0X3BsYXRmb3JtX2RhdGFbXSA9IHsKIAl7CiAJCS8qIE1lbW9yeSBhbmQgSVJRIGZpbGxlZCBpbiBiZWZvcmUgcmVnaXN0cmF0aW9uICovCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZJWEVEX1RZUEUsCisJCS50eXBlCQk9IFBPUlRfVEVHUkEsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCiAJCS51YXJ0Y2xrCT0gMjE2MDAwMDAwLApAQCAtNjIsNiArNjYsMTIgQEAKIAkvKiBuYW1lCQlwYXJlbnQJCXJhdGUJCWVuYWJsZWQgKi8KIAl7ICJ1YXJ0YiIsCSJwbGxfcCIsCTIxNjAwMDAwMCwJdHJ1ZX0sCiAJeyAidWFydGQiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWV9LAorCXsgInBsbF9hIiwJInBsbF9wX291dDEiLAk1NjQ0ODAwMCwJdHJ1ZSB9LAorCXsgInBsbF9hX291dDAiLAkicGxsX2EiLAkxMTI4OTYwMCwJdHJ1ZSB9LAorCXsgImNkZXYxIiwJTlVMTCwJCTAsCQl0cnVlIH0sCisJeyAiaTJzMSIsCSJwbGxfYV9vdXQwIiwJMTEyODk2MDAsCWZhbHNlfSwKKwl7ICJ1c2JkIiwJImNsa19tIiwJMTIwMDAwMDAsCXRydWV9LAorCXsgInVzYjMiLAkiY2xrX20iLAkxMjAwMDAwMCwJdHJ1ZX0sCiAJeyBOVUxMLAkJTlVMTCwJCTAsCQkwfSwKIH07CiAKQEAgLTExNyw2ICsxMjcsMjIgQEAKIAkuaXNfOGJpdAk9IDEsCiB9OwogCitzdGF0aWMgc3RydWN0IHRlZ3JhX3dtODkwM19wbGF0Zm9ybV9kYXRhIHNlYWJvYXJkX2F1ZGlvX3BkYXRhID0geworCS5ncGlvX3Nwa3JfZW4JCT0gVEVHUkFfR1BJT19TUEtSX0VOLAorCS5ncGlvX2hwX2RldAkJPSBURUdSQV9HUElPX0hQX0RFVCwKKwkuZ3Bpb19ocF9tdXRlCQk9IC0xLAorCS5ncGlvX2ludF9taWNfZW4JPSAtMSwKKwkuZ3Bpb19leHRfbWljX2VuCT0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZWFib2FyZF9hdWRpb19kZXZpY2UgPSB7CisJLm5hbWUJPSAidGVncmEtc25kLXdtODkwMyIsCisJLmlkCT0gMCwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmc2VhYm9hcmRfYXVkaW9fcGRhdGEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZWFib2FyZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmZGVidWdfdWFydCwKIAkmdGVncmFfcG11X2RldmljZSwKQEAgLTEyNCw2ICsxNTAsMTAgQEAKIAkmdGVncmFfc2RoY2lfZGV2aWNlMywKIAkmdGVncmFfc2RoY2lfZGV2aWNlMSwKIAkmc2VhYm9hcmRfZ3Bpb19rZXlzX2RldmljZSwKKwkmdGVncmFfaTJzX2RldmljZTEsCisJJnRlZ3JhX2Rhc19kZXZpY2UsCisJJnRlZ3JhX3BjbV9kZXZpY2UsCisJJnNlYWJvYXJkX2F1ZGlvX2RldmljZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBpc2wyOTAxOF9kZXZpY2UgPSB7CkBAIC0xMzUsMTIgKzE2NSw1NiBAQAogCUkyQ19CT0FSRF9JTkZPKCJhZHQ3NDYxIiwgMHg0YyksCiB9OwogCitzdGF0aWMgc3RydWN0IHdtODkwM19wbGF0Zm9ybV9kYXRhIHdtODkwM19wZGF0YSA9IHsKKwkuaXJxX2FjdGl2ZV9sb3cgPSAwLAorCS5taWNkZXRfY2ZnID0gMCwKKwkubWljZGV0X2RlbGF5ID0gMTAwLAorCS5ncGlvX2Jhc2UgPSBTRUFCT0FSRF9HUElPX1dNODkwMygwKSwKKwkuZ3Bpb19jZmcgPSB7CisJCVdNODkwM19HUElPX05PX0NPTkZJRywKKwkJV004OTAzX0dQSU9fTk9fQ09ORklHLAorCQkwLAorCQlXTTg5MDNfR1BJT19OT19DT05GSUcsCisJCVdNODkwM19HUElPX05PX0NPTkZJRywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIHdtODkwM19kZXZpY2UgPSB7CisJSTJDX0JPQVJEX0lORk8oIndtODkwMyIsIDB4MWEpLAorCS5wbGF0Zm9ybV9kYXRhID0gJndtODkwM19wZGF0YSwKKwkuaXJxID0gVEVHUkFfR1BJT19UT19JUlEoVEVHUkFfR1BJT19DRENfSVJRKSwKK307CisKK3N0YXRpYyBpbnQgc2VhYm9hcmRfZWhjaV9pbml0KHZvaWQpCit7CisJaW50IGdwaW9fc3RhdHVzOworCisJZ3Bpb19zdGF0dXMgPSBncGlvX3JlcXVlc3QoVEVHUkFfR1BJT19VU0IxLCAiVkJVU19VU0IxIik7CisJaWYgKGdwaW9fc3RhdHVzIDwgMCkgeworCQlwcl9lcnIoIlZCVVNfVVNCMSByZXF1ZXN0IEdQSU8gRkFJTEVEXG4iKTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwlncGlvX3N0YXR1cyA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChURUdSQV9HUElPX1VTQjEsIDEpOworCWlmIChncGlvX3N0YXR1cyA8IDApIHsKKwkJcHJfZXJyKCJWQlVTX1VTQjEgcmVxdWVzdCBHUElPIERJUkVDVElPTiBGQUlMRURcbiIpOworCQlXQVJOX09OKDEpOworCX0KKwlncGlvX3NldF92YWx1ZShURUdSQV9HUElPX1VTQjEsIDEpOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ0ZWdyYV9laGNpMV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdGVncmFfZWhjaTNfZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc2VhYm9hcmRfaTJjX2luaXQodm9pZCkKIHsKIAlncGlvX3JlcXVlc3QoVEVHUkFfR1BJT19JU0wyOTAxOF9JUlEsICJpc2wyOTAxOCIpOwogCWdwaW9fZGlyZWN0aW9uX2lucHV0KFRFR1JBX0dQSU9fSVNMMjkwMThfSVJRKTsKIAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsICZpc2wyOTAxOF9kZXZpY2UsIDEpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsICZ3bTg5MDNfZGV2aWNlLCAxKTsKIAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDMsICZhZHQ3NDYxX2RldmljZSwgMSk7CiAKQEAgLTE2MSw2ICsyMzUsOCBAQAogCXRlZ3JhX3NkaGNpX2RldmljZTQuZGV2LnBsYXRmb3JtX2RhdGEgPSAmc2RoY2lfcGRhdGE0OwogCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoc2VhYm9hcmRfZGV2aWNlcywgQVJSQVlfU0laRShzZWFib2FyZF9kZXZpY2VzKSk7CisKKwlzZWFib2FyZF9laGNpX2luaXQoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHRlZ3JhX3NlYWJvYXJkX2luaXQodm9pZCkKQEAgLTE4Miw2ICsyNTgsOSBAQAogCWRlYnVnX3VhcnRfcGxhdGZvcm1fZGF0YVswXS5tYXBiYXNlID0gVEVHUkFfVUFSVEJfQkFTRTsKIAlkZWJ1Z191YXJ0X3BsYXRmb3JtX2RhdGFbMF0uaXJxID0gSU5UX1VBUlRCOwogCisJc2VhYm9hcmRfYXVkaW9fcGRhdGEuZ3Bpb19ocF9tdXRlID0gVEVHUkFfR1BJT19LQUVOX0hQX01VVEU7CisJdGVncmFfZ3Bpb19lbmFibGUoVEVHUkFfR1BJT19LQUVOX0hQX01VVEUpOworCiAJc2VhYm9hcmRfY29tbW9uX2luaXQoKTsKIAogCXNlYWJvYXJkX2kyY19pbml0KCk7CkBAIC0yMDEsNyArMjgwLDcgQEAKIAogCiBNQUNISU5FX1NUQVJUKFNFQUJPQVJELCAic2VhYm9hcmQiKQotCS5ib290X3BhcmFtcyAgICA9IDB4MDAwMDAxMDAsCisJLmF0YWdfb2Zmc2V0ICAgID0gMHgxMDAsCiAJLm1hcF9pbyAgICAgICAgID0gdGVncmFfbWFwX2NvbW1vbl9pbywKIAkuaW5pdF9lYXJseSAgICAgPSB0ZWdyYV9pbml0X2Vhcmx5LAogCS5pbml0X2lycSAgICAgICA9IHRlZ3JhX2luaXRfaXJxLApAQCAtMjEwLDcgKzI4OSw3IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKEtBRU4sICJrYWVuIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHRlZ3JhX21hcF9jb21tb25faW8sCiAJLmluaXRfZWFybHkgICAgID0gdGVncmFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgICAgICAgPSB0ZWdyYV9pbml0X2lycSwKQEAgLTIxOSw3ICsyOTgsNyBAQAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChXQVJJTywgIndhcmlvIikKLQkuYm9vdF9wYXJhbXMgICAgPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldCAgICA9IDB4MTAwLAogCS5tYXBfaW8gICAgICAgICA9IHRlZ3JhX21hcF9jb21tb25faW8sCiAJLmluaXRfZWFybHkgICAgID0gdGVncmFfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEgICAgICAgPSB0ZWdyYV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtc2VhYm9hcmQuaAppbmRleCBkODQxNWUxLi40YzQ1ZDRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXNlYWJvYXJkLmgKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1zZWFib2FyZC5oCkBAIC0xNyw2ICsxNywxMSBAQAogI2lmbmRlZiBfTUFDSF9URUdSQV9CT0FSRF9TRUFCT0FSRF9ICiAjZGVmaW5lIF9NQUNIX1RFR1JBX0JPQVJEX1NFQUJPQVJEX0gKIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgorCisjZGVmaW5lIFNFQUJPQVJEX0dQSU9fVFBTNjU4NlgoX3hfKQkoVEVHUkFfTlJfR1BJT1MgKyAoX3hfKSkKKyNkZWZpbmUgU0VBQk9BUkRfR1BJT19XTTg5MDMoX3hfKQkoU0VBQk9BUkRfR1BJT19UUFM2NTg2WCg0KSArIChfeF8pKQorCiAjZGVmaW5lIFRFR1JBX0dQSU9fU0QyX0NECQlURUdSQV9HUElPX1BJNQogI2RlZmluZSBURUdSQV9HUElPX1NEMl9XUAkJVEVHUkFfR1BJT19QSDEKICNkZWZpbmUgVEVHUkFfR1BJT19TRDJfUE9XRVIJCVRFR1JBX0dQSU9fUEk2CkBAIC0zMSwxMCArMzYsMTEgQEAKICNkZWZpbmUgVEVHUkFfR1BJT19NQUdORVRPTUVURVIJCVRFR1JBX0dQSU9fUE41CiAjZGVmaW5lIFRFR1JBX0dQSU9fSVNMMjkwMThfSVJRCQlURUdSQV9HUElPX1BaMgogI2RlZmluZSBURUdSQV9HUElPX0FDX09OTElORQkJVEVHUkFfR1BJT19QVjMKLQotI2RlZmluZSBUUFNfR1BJT19CQVNFCQkJVEVHUkFfTlJfR1BJT1MKLQotI2RlZmluZSBUUFNfR1BJT19XV0FOX1BXUgkJKFRQU19HUElPX0JBU0UgKyAyKQorI2RlZmluZSBURUdSQV9HUElPX1dXQU5fUFdSCQlTRUFCT0FSRF9HUElPX1RQUzY1ODZYKDIpCisjZGVmaW5lIFRFR1JBX0dQSU9fQ0RDX0lSUQkJVEVHUkFfR1BJT19QWDMKKyNkZWZpbmUgVEVHUkFfR1BJT19TUEtSX0VOCQlTRUFCT0FSRF9HUElPX1dNODkwMygyKQorI2RlZmluZSBURUdSQV9HUElPX0hQX0RFVAkJVEVHUkFfR1BJT19QWDEKKyNkZWZpbmUgVEVHUkFfR1BJT19LQUVOX0hQX01VVEUJCVRFR1JBX0dQSU9fUEE1CiAKIHZvaWQgc2VhYm9hcmRfcGlubXV4X2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UtcGlubXV4LmMKaW5kZXggNDdjNTk2Yy4uN2FiNzE5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UtcGlubXV4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UtcGlubXV4LmMKQEAgLTEzLDE1ICsxMywxNiBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPG1hY2gvcGlubXV4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CiAKICNpbmNsdWRlICJncGlvLW5hbWVzLmgiCiAjaW5jbHVkZSAiYm9hcmQtdHJpbXNsaWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlcy5oIgogCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgdGVncmFfcGluZ3JvdXBfY29uZmlnIHRyaW1zbGljZV9waW5tdXhbXSA9IHsKIAl7VEVHUkFfUElOR1JPVVBfQVRBLCAgIFRFR1JBX01VWF9JREUsICAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwJVEVHUkFfVFJJX1RSSVNUQVRFfSwKQEAgLTE0Miw2ICsxNDMsMTEgQEAKIAl7VEVHUkFfUElOR1JPVVBfWE0yRCwgIFRFR1JBX01VWF9OT05FLCAgICAgICAgICBURUdSQV9QVVBEX05PUk1BTCwgICAgICBURUdSQV9UUklfTk9STUFMfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwaW5tdXhfZGV2aWNlc1tdID0geworCSZ0ZWdyYV9ncGlvX2RldmljZSwKKwkmdGVncmFfcGlubXV4X2RldmljZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdGVncmFfZ3Bpb190YWJsZSBncGlvX3RhYmxlW10gPSB7CiAJeyAuZ3BpbyA9IFRSSU1TTElDRV9HUElPX1NENF9DRCwgLmVuYWJsZSA9IHRydWUJfSwgLyogbW1jNCBjZCAqLwogCXsgLmdwaW8gPSBUUklNU0xJQ0VfR1BJT19TRDRfV1AsIC5lbmFibGUgPSB0cnVlCX0sIC8qIG1tYzQgd3AgKi8KQEAgLTE1Miw2ICsxNTgsOSBAQAogCiB2b2lkIF9faW5pdCB0cmltc2xpY2VfcGlubXV4X2luaXQodm9pZCkKIHsKKwlpZiAoIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgibnZpZGlhLHRlZ3JhMjAiKSkKKwkJcGxhdGZvcm1fYWRkX2RldmljZXMocGlubXV4X2RldmljZXMsCisJCQkJCUFSUkFZX1NJWkUocGlubXV4X2RldmljZXMpKTsKIAl0ZWdyYV9waW5tdXhfY29uZmlnX3RhYmxlKHRyaW1zbGljZV9waW5tdXgsIEFSUkFZX1NJWkUodHJpbXNsaWNlX3Bpbm11eCkpOwogCXRlZ3JhX2dwaW9fY29uZmlnKGdwaW9fdGFibGUsIEFSUkFZX1NJWkUoZ3Bpb190YWJsZSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLmMKaW5kZXggNjUyYzM0MC4uMWE2NjE3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS5jCkBAIC0zMiw3ICszMiw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9zZGhjaS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiYm9hcmQuaCIKICNpbmNsdWRlICJjbG9jay5oIgpAQCAtNDYsNyArNDUsOCBAQAogCQkubWVtYmFzZQk9IElPX0FERFJFU1MoVEVHUkFfVUFSVEFfQkFTRSksCiAJCS5tYXBiYXNlCT0gVEVHUkFfVUFSVEFfQkFTRSwKIAkJLmlycQkJPSBJTlRfVUFSVEEsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0ZJWEVEX1RZUEUsCisJCS50eXBlCQk9IFBPUlRfVEVHUkEsCiAJCS5pb3R5cGUJCT0gVVBJT19NRU0sCiAJCS5yZWdzaGlmdAk9IDIsCiAJCS51YXJ0Y2xrCT0gMjE2MDAwMDAwLApAQCAtMTcxLDcgKzE3MSw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVFJJTVNMSUNFLCAidHJpbXNsaWNlIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5maXh1cAkJPSB0ZWdyYV90cmltc2xpY2VfZml4dXAsCiAJLm1hcF9pbyAgICAgICAgID0gdGVncmFfbWFwX2NvbW1vbl9pbywKIAkuaW5pdF9lYXJseQk9IHRlZ3JhX2luaXRfZWFybHksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC10cmltc2xpY2UuaAppbmRleCA3YTdkZWU4Li41MGYxMjhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXRyaW1zbGljZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtdHJpbXNsaWNlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgX01BQ0hfVEVHUkFfQk9BUkRfVFJJTVNMSUNFX0gKICNkZWZpbmUgX01BQ0hfVEVHUkFfQk9BUkRfVFJJTVNMSUNFX0gKIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgorCiAjZGVmaW5lIFRSSU1TTElDRV9HUElPX1NENF9DRAlURUdSQV9HUElPX1BQMQkvKiBtbWM0IGNkICovCiAjZGVmaW5lIFRSSU1TTElDRV9HUElPX1NENF9XUAlURUdSQV9HUElPX1BQMgkvKiBtbWM0IHdwICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2NvbW1vbi5jCmluZGV4IGQ1ZTNmODkuLjY5MGI4ODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9jb21tb24uYwpAQCAtNjEsNyArNjEsNyBAQAogCXsgTlVMTCwJCU5VTEwsCQkwLAkJMH0sCiB9OwogCi12b2lkIF9faW5pdCB0ZWdyYV9pbml0X2NhY2hlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgdGVncmFfaW5pdF9jYWNoZSh2b2lkKQogewogI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCiAJdm9pZCBfX2lvbWVtICpwID0gSU9fQUREUkVTUyhURUdSQV9BUk1fUEVSSUZfQkFTRSkgKyAweDMwMDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdS10ZWdyYS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHUtdGVncmEuYwppbmRleCAwZTBmZDRkLi5iYjVjZTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdS10ZWdyYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvY3B1LXRlZ3JhLmMKQEAgLTU2LDEyICs1NiwxMiBAQAogc3RhdGljIERFRklORV9NVVRFWCh0ZWdyYV9jcHVfbG9jayk7CiBzdGF0aWMgYm9vbCBpc19zdXNwZW5kZWQ7CiAKLWludCB0ZWdyYV92ZXJpZnlfc3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IHRlZ3JhX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgZnJlcV90YWJsZSk7CiB9CiAKLXVuc2lnbmVkIGludCB0ZWdyYV9nZXRzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV9nZXRzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgcmF0ZTsKIApAQCAtMTI5LDcgKzEyOSw3IEBACiAJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCiB7Ci0JaW50IGlkeDsKKwl1bnNpZ25lZCBpbnQgaWR4OwogCXVuc2lnbmVkIGludCBmcmVxOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvZGV2aWNlcy5jCmluZGV4IDU3ZTM1ZDIuLjdhMmEwMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvZGV2aWNlcy5jCkBAIC0yOSw3ICsyOSw5MyBAQAogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvdXNiX3BoeS5oPgorCiAjaW5jbHVkZSAiZ3Bpby1uYW1lcy5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBncGlvX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBURUdSQV9HUElPX0JBU0UsCisJCS5lbmQJPSBURUdSQV9HUElPX0JBU0UgKyBURUdSQV9HUElPX1NJWkUtMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElOVF9HUElPMSwKKwkJLmVuZAk9IElOVF9HUElPMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IElOVF9HUElPMiwKKwkJLmVuZAk9IElOVF9HUElPMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IElOVF9HUElPMywKKwkJLmVuZAk9IElOVF9HUElPMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbNF0gPSB7CisJCS5zdGFydAk9IElOVF9HUElPNCwKKwkJLmVuZAk9IElOVF9HUElPNCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbNV0gPSB7CisJCS5zdGFydAk9IElOVF9HUElPNSwKKwkJLmVuZAk9IElOVF9HUElPNSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbNl0gPSB7CisJCS5zdGFydAk9IElOVF9HUElPNiwKKwkJLmVuZAk9IElOVF9HUElPNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbN10gPSB7CisJCS5zdGFydAk9IElOVF9HUElPNywKKwkJLmVuZAk9IElOVF9HUElPNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGVncmFfZ3Bpb19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInRlZ3JhLWdwaW8iLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSBncGlvX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShncGlvX3Jlc291cmNlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGlubXV4X3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkvKiBUcmktc3RhdGUgcmVnaXN0ZXJzICovCisJCS5zdGFydAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweDE0LAorCQkuZW5kCT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4MjAgKyAzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLyogTXV4IHJlZ2lzdGVycyAqLworCQkuc3RhcnQJPSBURUdSQV9BUEJfTUlTQ19CQVNFICsgMHg4MCwKKwkJLmVuZAk9IFRFR1JBX0FQQl9NSVNDX0JBU0UgKyAweDljICsgMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMl0gPSB7CisJCS8qIFB1bGwtdXAvZG93biByZWdpc3RlcnMgKi8KKwkJLnN0YXJ0CT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4YTAsCisJCS5lbmQJPSBURUdSQV9BUEJfTUlTQ19CQVNFICsgMHhiMCArIDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzNdID0geworCQkvKiBQYWQgY29udHJvbCByZWdpc3RlcnMgKi8KKwkJLnN0YXJ0CT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4ODY4LAorCQkuZW5kCT0gVEVHUkFfQVBCX01JU0NfQkFTRSArIDB4OTBjICsgMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGVncmFfcGlubXV4X2RldmljZSA9IHsKKwkubmFtZQkJPSAidGVncmEtcGlubXV4IiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gcGlubXV4X3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwaW5tdXhfcmVzb3VyY2UpLAorfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpMmNfcmVzb3VyY2UxW10gPSB7CiAJWzBdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuaAppbmRleCA0YTdkYzBhLi44NzNlY2IyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2RldmljZXMuaApAQCAtMjEsNiArMjEsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX2dwaW9fZGV2aWNlOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGVncmFfcGlubXV4X2RldmljZTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRlZ3JhX3NkaGNpX2RldmljZTE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSB0ZWdyYV9zZGhjaV9kZXZpY2UyOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGVncmFfc2RoY2lfZGV2aWNlMzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2RtYS5jCmluZGV4IGY0ZWY1ZWIuLmMwY2Y5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9kbWEuYwpAQCAtMTA1LDEzICsxMDUsMTcgQEAKIAogI2RlZmluZSBOVl9ETUFfTUFYX1RSQVNGRVJfU0laRSAweDEwMDAwCiAKLWNvbnN0IHVuc2lnbmVkIGludCBhaGJfYWRkcl93cmFwX3RhYmxlWzhdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhaGJfYWRkcl93cmFwX3RhYmxlWzhdID0gewogCTAsIDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OAogfTsKIAotY29uc3QgdW5zaWduZWQgaW50IGFwYl9hZGRyX3dyYXBfdGFibGVbOF0gPSB7MCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFwYl9hZGRyX3dyYXBfdGFibGVbOF0gPSB7CisJMCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NAorfTsKIAotY29uc3QgdW5zaWduZWQgaW50IGJ1c193aWR0aF90YWJsZVs1XSA9IHs4LCAxNiwgMzIsIDY0LCAxMjh9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBidXNfd2lkdGhfdGFibGVbNV0gPSB7CisJOCwgMTYsIDMyLCA2NCwgMTI4Cit9OwogCiAjZGVmaW5lIFRFR1JBX0RNQV9OQU1FX1NJWkUgMTYKIHN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCB7CkBAIC0xNTcsNyArMTYxLDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgdGVncmFfZG1hX3N0b3Aoc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICpjaCkKK3N0YXRpYyB2b2lkIHRlZ3JhX2RtYV9zdG9wKHN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqY2gpCiB7CiAJdTMyIGNzcjsKIAl1MzIgc3RhdHVzOwpAQCAtMTc0LDcgKzE3OCw3IEBACiAJCXdyaXRlbChzdGF0dXMsIGNoLT5hZGRyICsgQVBCX0RNQV9DSEFOX1NUQSk7CiB9CiAKLWludCB0ZWdyYV9kbWFfY2FuY2VsKHN0cnVjdCB0ZWdyYV9kbWFfY2hhbm5lbCAqY2gpCitzdGF0aWMgaW50IHRlZ3JhX2RtYV9jYW5jZWwoc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICpjaCkKIHsKIAl1MzIgY3NyOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZTBlYmU2NS4uNjE5YWJjNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bWFjaC9pby5oPgogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KIAotCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybyAgYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAgICAgICAgIGxkciAgICAgXHJwLCA9SU9fQVBCX1BIWVMgICAgICAgQCBwaHlzaWNhbAogICAgICAgICBsZHIgICAgIFxydiwgPUlPX0FQQl9WSVJUICAgICAgICBAIHZpcnR1YWwKIAlvcnIJXHJwLCBccnAsICMoVEVHUkFfREVCVUdfVUFSVF9CQVNFICYgMHhGRikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8tdGVncmEuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8tdGVncmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2QzN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZ3Bpby10ZWdyYS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCisgKgorICogQXV0aG9yOgorICoJRXJpayBHaWxsaW5nIDxrb25rZXJzQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX01BQ0hfVEVHUkFfR1BJT19URUdSQV9ICisjZGVmaW5lIF9fTUFDSF9URUdSQV9HUElPX1RFR1JBX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNkZWZpbmUgVEVHUkFfTlJfR1BJT1MJCUlOVF9HUElPX05SCisKKyNkZWZpbmUgVEVHUkFfR1BJT19UT19JUlEoZ3BpbykgKElOVF9HUElPX0JBU0UgKyAoZ3BpbykpCisKK3N0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIHsKKwlpbnQJZ3BpbzsJLyogR1BJTyBudW1iZXIgKi8KKwlib29sCWVuYWJsZTsJLyogRW5hYmxlIGZvciBHUElPIGF0IGluaXQ/ICovCit9OworCit2b2lkIHRlZ3JhX2dwaW9fY29uZmlnKHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlICp0YWJsZSwgaW50IG51bSk7Cit2b2lkIHRlZ3JhX2dwaW9fZW5hYmxlKGludCBncGlvKTsKK3ZvaWQgdGVncmFfZ3Bpb19kaXNhYmxlKGludCBncGlvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggMTk2ZjExNC4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw2MCArMSBAQAotLyoKLSAqIGFyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2dwaW8uaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUsIEluYy4KLSAqCi0gKiBBdXRob3I6Ci0gKglFcmlrIEdpbGxpbmcgPGtvbmtlcnNAZ29vZ2xlLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9URUdSQV9HUElPX0gKLSNkZWZpbmUgX19NQUNIX1RFR1JBX0dQSU9fSAotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi0jZGVmaW5lIFRFR1JBX05SX0dQSU9TCQlJTlRfR1BJT19OUgotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJCV9fZ3Bpb19jYW5zbGVlcAotCi0jZGVmaW5lIFRFR1JBX0dQSU9fVE9fSVJRKGdwaW8pIChJTlRfR1BJT19CQVNFICsgKGdwaW8pKQotI2RlZmluZSBURUdSQV9JUlFfVE9fR1BJTyhpcnEpICgoaXJxKSAtIElOVF9HUElPX0JBU0UpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGludCBncGlvKQotewotCWlmIChncGlvIDwgVEVHUkFfTlJfR1BJT1MpCi0JCXJldHVybiBJTlRfR1BJT19CQVNFICsgZ3BpbzsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoKGlycSA+PSBJTlRfR1BJT19CQVNFKSAmJiAoaXJxIDwgSU5UX0dQSU9fQkFTRSArIElOVF9HUElPX05SKSkKLQkJcmV0dXJuIGlycSAtIElOVF9HUElPX0JBU0U7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlIHsKLQlpbnQJZ3BpbzsJLyogR1BJTyBudW1iZXIgKi8KLQlib29sCWVuYWJsZTsJLyogRW5hYmxlIGZvciBHUElPIGF0IGluaXQ/ICovCi19OwotCi12b2lkIHRlZ3JhX2dwaW9fY29uZmlnKHN0cnVjdCB0ZWdyYV9ncGlvX3RhYmxlICp0YWJsZSwgaW50IG51bSk7Ci12b2lkIHRlZ3JhX2dwaW9fZW5hYmxlKGludCBncGlvKTsKLXZvaWQgdGVncmFfZ3Bpb19kaXNhYmxlKGludCBncGlvKTsKLQotI2VuZGlmCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggNGNlYTIyMy4uMzVhMDExZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0zMywyMCArMzMsMjYgQEAKICAqCiAgKi8KIAorI2lmZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBJT01FTSh4KQkoeCkKKyNlbHNlCisjZGVmaW5lIElPTUVNKHgpCSgodm9pZCBfX2ZvcmNlIF9faW9tZW0gKikoeCkpCisjZW5kaWYKKwogI2RlZmluZSBJT19JUkFNX1BIWVMJMHg0MDAwMDAwMAotI2RlZmluZSBJT19JUkFNX1ZJUlQJMHhGRTQwMDAwMAorI2RlZmluZSBJT19JUkFNX1ZJUlQJSU9NRU0oMHhGRTQwMDAwMCkKICNkZWZpbmUgSU9fSVJBTV9TSVpFCVNaXzI1NksKIAogI2RlZmluZSBJT19DUFVfUEhZUyAgICAgMHg1MDA0MDAwMAotI2RlZmluZSBJT19DUFVfVklSVCAgICAgMHhGRTAwMDAwMAorI2RlZmluZSBJT19DUFVfVklSVCAgICAgSU9NRU0oMHhGRTAwMDAwMCkKICNkZWZpbmUgSU9fQ1BVX1NJWkUJU1pfMTZLCiAKICNkZWZpbmUgSU9fUFBTQl9QSFlTCTB4NjAwMDAwMDAKLSNkZWZpbmUgSU9fUFBTQl9WSVJUCTB4RkUyMDAwMDAKKyNkZWZpbmUgSU9fUFBTQl9WSVJUCUlPTUVNKDB4RkUyMDAwMDApCiAjZGVmaW5lIElPX1BQU0JfU0laRQlTWl8xTQogCiAjZGVmaW5lIElPX0FQQl9QSFlTCTB4NzAwMDAwMDAKLSNkZWZpbmUgSU9fQVBCX1ZJUlQJMHhGRTMwMDAwMAorI2RlZmluZSBJT19BUEJfVklSVAlJT01FTSgweEZFMzAwMDAwKQogI2RlZmluZSBJT19BUEJfU0laRQlTWl8xTQogCiAjZGVmaW5lIElPX1RPX1ZJUlRfQkVUV0VFTihwLCBzdCwgc3opCSgocCkgPj0gKHN0KSAmJiAocCkgPCAoKHN0KSArIChzeikpKQpAQCAtNjEsNyArNjcsNyBAQAogCQlJT19UT19WSVJUX1hMQVRFKChuKSwgSU9fQ1BVX1BIWVMsIElPX0NQVV9WSVJUKSA6CVwKIAlJT19UT19WSVJUX0JFVFdFRU4oKG4pLCBJT19JUkFNX1BIWVMsIElPX0lSQU1fU0laRSkgPwkJXAogCQlJT19UT19WSVJUX1hMQVRFKChuKSwgSU9fSVJBTV9QSFlTLCBJT19JUkFNX1ZJUlQpIDoJXAotCTApCisJTlVMTCkKIAogI2lmbmRlZiBfX0FTU0VNQkxFUl9fCiAKQEAgLTcxLDcgKzc3LDcgQEAKIHZvaWQgX19pb21lbSAqdGVncmFfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSk7CiB2b2lkIHRlZ3JhX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKIAotI2RlZmluZSBJT19BRERSRVNTKG4pICgodm9pZCBfX2lvbWVtICopIElPX1RPX1ZJUlQobikpCisjZGVmaW5lIElPX0FERFJFU1MobikgKElPX1RPX1ZJUlQobikpCiAKICNpZmRlZiBDT05GSUdfVEVHUkFfUENJCiBleHRlcm4gdm9pZCBfX2lvbWVtICp0ZWdyYV9wY2llX2lvX2Jhc2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzdkYjNhYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUsIEluYy4KLSAqCi0gKiBBdXRob3I6Ci0gKglDb2xpbiBDcm9zcyA8Y2Nyb3NzQGdvb2dsZS5jb20+Ci0gKglFcmlrIEdpbGxpbmcgPGtvbmtlcnNAZ29vZ2xlLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9URUdSQV9NRU1PUllfSAotI2RlZmluZSBfX01BQ0hfVEVHUkFfTUVNT1JZX0gKLQotLyogcGh5c2ljYWwgb2Zmc2V0IG9mIFJBTSAqLwotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgwKQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcGlubXV4LmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9waW5tdXguaAppbmRleCBkZWZkODc3Li5iYjdkZmRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9waW5tdXguaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9waW5tdXguaApAQCAtMTk5LDYgKzE5OSw3IEBACiAKIHN0cnVjdCB0ZWdyYV9kcml2ZV9waW5ncm91cF9kZXNjIHsKIAljb25zdCBjaGFyICpuYW1lOworCXMxNiByZWdfYmFuazsKIAlzMTYgcmVnOwogfTsKIApAQCAtMjA3LDYgKzIwOCw5IEBACiAJaW50IGZ1bmNzWzRdOwogCWludCBmdW5jX3NhZmU7CiAJaW50IHZkZGlvOworCXMxNiB0cmlfYmFuazsJLyogUmVnaXN0ZXIgYmFuayB0aGUgdHJpX3JlZyBleGlzdHMgd2l0aGluICovCisJczE2IG11eF9iYW5rOwkvKiBSZWdpc3RlciBiYW5rIHRoZSBtdXhfcmVnIGV4aXN0cyB3aXRoaW4gKi8KKwlzMTYgcHVwZF9iYW5rOwkvKiBSZWdpc3RlciBiYW5rIHRoZSBwdXBkX3JlZyBleGlzdHMgd2l0aGluICovCiAJczE2IHRyaV9yZWc7IAkvKiBvZmZzZXQgaW50byB0aGUgVFJJU1RBVEVfUkVHXyogcmVnaXN0ZXIgYmFuayAqLwogCXMxNiBtdXhfcmVnOwkvKiBvZmZzZXQgaW50byB0aGUgUElOX01VWF9DVExfKiByZWdpc3RlciBiYW5rICovCiAJczE2IHB1cGRfcmVnOwkvKiBvZmZzZXQgaW50byB0aGUgUFVMTF9VUERPV05fUkVHXyogcmVnaXN0ZXIgYmFuayAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvcG93ZXJnYXRlLmggYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9wb3dlcmdhdGUuaAppbmRleCA0MDFkMWI3Li4zOWMzOTZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9wb3dlcmdhdGUuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9wb3dlcmdhdGUuaApAQCAtMzEsNyArMzEsNiBAQAogCiBpbnQgdGVncmFfcG93ZXJnYXRlX3Bvd2VyX29uKGludCBpZCk7CiBpbnQgdGVncmFfcG93ZXJnYXRlX3Bvd2VyX29mZihpbnQgaWQpOwotYm9vbCB0ZWdyYV9wb3dlcmdhdGVfaXNfcG93ZXJlZChpbnQgaWQpOwogaW50IHRlZ3JhX3Bvd2VyZ2F0ZV9yZW1vdmVfY2xhbXBpbmcoaW50IGlkKTsKIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBjbGsgZGlzYWJsZWQsIGFuZCByZXR1cm5zIHdpdGggY2xrIGVuYWJsZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW8uYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaW8uYwppbmRleCBlYTUwZmUyLi41NDg5ZjhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pby5jCkBAIC0zMSwyNSArMzEsMjUgQEAKIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB0ZWdyYV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS52aXJ0dWFsID0gSU9fUFBTQl9WSVJULAorCQkudmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKUlPX1BQU0JfVklSVCwKIAkJLnBmbiA9IF9fcGh5c190b19wZm4oSU9fUFBTQl9QSFlTKSwKIAkJLmxlbmd0aCA9IElPX1BQU0JfU0laRSwKIAkJLnR5cGUgPSBNVF9ERVZJQ0UsCiAJfSwKIAl7Ci0JCS52aXJ0dWFsID0gSU9fQVBCX1ZJUlQsCisJCS52aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpSU9fQVBCX1ZJUlQsCiAJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKElPX0FQQl9QSFlTKSwKIAkJLmxlbmd0aCA9IElPX0FQQl9TSVpFLAogCQkudHlwZSA9IE1UX0RFVklDRSwKIAl9LAogCXsKLQkJLnZpcnR1YWwgPSBJT19DUFVfVklSVCwKKwkJLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylJT19DUFVfVklSVCwKIAkJLnBmbiA9IF9fcGh5c190b19wZm4oSU9fQ1BVX1BIWVMpLAogCQkubGVuZ3RoID0gSU9fQ1BVX1NJWkUsCiAJCS50eXBlID0gTVRfREVWSUNFLAogCX0sCiAJewotCQkudmlydHVhbCA9IElPX0lSQU1fVklSVCwKKwkJLnZpcnR1YWwgPSAodW5zaWduZWQgbG9uZylJT19JUkFNX1ZJUlQsCiAJCS5wZm4gPSBfX3BoeXNfdG9fcGZuKElPX0lSQU1fUEhZUyksCiAJCS5sZW5ndGggPSBJT19JUkFNX1NJWkUsCiAJCS50eXBlID0gTVRfREVWSUNFLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYwppbmRleCBmMWY2OTlkLi45N2VmM2U1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KQEAgLTQxLDYgKzQyLDggQEAKICNpbmNsdWRlIDxtYWNoL2Nsay5oPgogI2luY2x1ZGUgPG1hY2gvcG93ZXJnYXRlLmg+CiAKKyNpbmNsdWRlICJib2FyZC5oIgorCiAvKiByZWdpc3RlciBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBBRklfT0ZGU0VUCTB4MzgwMAogI2RlZmluZSBQQURTX09GRlNFVAkweDMwMDAKQEAgLTE1MCw5ICsxNTMsOSBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqcmVnX3BtY19iYXNlID0gSU9fQUREUkVTUyhURUdSQV9QTUNfQkFTRSk7CiAKICNkZWZpbmUgcG1jX3dyaXRlbCh2YWx1ZSwgcmVnKSBcCi0JX19yYXdfd3JpdGVsKHZhbHVlLCAodTMyKXJlZ19wbWNfYmFzZSArIChyZWcpKQorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgcmVnX3BtY19iYXNlICsgKHJlZykpCiAjZGVmaW5lIHBtY19yZWFkbChyZWcpIFwKLQlfX3Jhd19yZWFkbCgodTMyKXJlZ19wbWNfYmFzZSArIChyZWcpKQorCV9fcmF3X3JlYWRsKHJlZ19wbWNfYmFzZSArIChyZWcpKQogCiAvKgogICogVGVncmEyIGRlZmluZXMgMUdCIGluIHRoZSBBWEkgYWRkcmVzcyBtYXAgZm9yIFBDSWUuCkBAIC00NjAsNyArNDYzLDcgQEAKIAlzdHJ1Y3QgdGVncmFfcGNpZV9wb3J0ICpwcDsKIAogCWlmIChuciA+PSB0ZWdyYV9wY2llLm51bV9wb3J0cykKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCiAJcHAgPSB0ZWdyYV9wY2llLnBvcnQgKyBucjsKIAlwcC0+cm9vdF9idXNfbnIgPSBzeXMtPmJ1c25yOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXgtdDItdGFibGVzLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC10Mi10YWJsZXMuYwppbmRleCBhNDc1MzY3Li5hMGRjMmJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC10Mi10YWJsZXMuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC10Mi10YWJsZXMuYwpAQCAtMzEsMTAgKzMxLDE2IEBACiAjaW5jbHVkZSA8bWFjaC9waW5tdXguaD4KICNpbmNsdWRlIDxtYWNoL3N1c3BlbmQuaD4KIAorI2RlZmluZSBUUklTVEFURV9SRUdfQQkJMHgxNAorI2RlZmluZSBQSU5fTVVYX0NUTF9SRUdfQQkweDgwCisjZGVmaW5lIFBVTExVUERPV05fUkVHX0EJMHhhMAorI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJMHg4NjgKKwogI2RlZmluZSBEUklWRV9QSU5HUk9VUChwZ19uYW1lLCByKQkJCQlcCiAJW1RFR1JBX0RSSVZFX1BJTkdST1VQXyAjIyBwZ19uYW1lXSA9IHsJCQlcCiAJCS5uYW1lID0gI3BnX25hbWUsCQkJCVwKLQkJLnJlZyA9IHIJCQkJCVwKKwkJLnJlZ19iYW5rID0gMywJCQkJCVwKKwkJLnJlZyA9ICgocikgLSBQSU5HUk9VUF9SRUdfQSkJCQlcCiAJfQogCiBjb25zdCBzdHJ1Y3QgdGVncmFfZHJpdmVfcGluZ3JvdXBfZGVzYyB0ZWdyYV9zb2NfZHJpdmVfcGluZ3JvdXBzW1RFR1JBX01BWF9EUklWRV9QSU5HUk9VUF0gPSB7CkBAIC05MCwxMSArOTYsMTQgQEAKIAkJCVRFR1JBX01VWF8gIyMgZjMsCQkJXAogCQl9LAkJCQkJCVwKIAkJLmZ1bmNfc2FmZSA9IFRFR1JBX01VWF8gIyMgZl9zYWZlLAkJXAotCQkudHJpX3JlZyA9IHRyaV9yLAkJCQlcCisJCS50cmlfYmFuayA9IDAsCQkJCQlcCisJCS50cmlfcmVnID0gKCh0cmlfcikgLSBUUklTVEFURV9SRUdfQSksCQlcCiAJCS50cmlfYml0ID0gdHJpX2IsCQkJCVwKLQkJLm11eF9yZWcgPSBtdXhfciwJCQkJXAorCQkubXV4X2JhbmsgPSAxLAkJCQkJXAorCQkubXV4X3JlZyA9ICgobXV4X3IpIC0gUElOX01VWF9DVExfUkVHX0EpLAlcCiAJCS5tdXhfYml0ID0gbXV4X2IsCQkJCVwKLQkJLnB1cGRfcmVnID0gcHVwZF9yLAkJCQlcCisJCS5wdXBkX2JhbmsgPSAyLAkJCQlcCisJCS5wdXBkX3JlZyA9ICgocHVwZF9yKSAtIFBVTExVUERPV05fUkVHX0EpLAlcCiAJCS5wdXBkX2JpdCA9IHB1cGRfYiwJCQkJXAogCX0KIApAQCAtMjE3LDYyICsyMjYsMyBAQAogCVBJTkdST1VQKFhNMkMsICBERFIsICAgUlNWRCwgICAgICBSU1ZELCAgICAgIFJTVkQsICAgICAgUlNWRCwgICAgICAgICAgUlNWRCwgICAgICAtMSwgICAtMSwgLTEsICAgLTEsIDB4QTgsIDMwKSwKIAlQSU5HUk9VUChYTTJELCAgRERSLCAgIFJTVkQsICAgICAgUlNWRCwgICAgICBSU1ZELCAgICAgIFJTVkQsICAgICAgICAgIFJTVkQsICAgICAgLTEsICAgLTEsIC0xLCAgIC0xLCAweEE4LCAyOCksCiB9OwotCi0jaWZkZWYgQ09ORklHX1BNCi0jZGVmaW5lIFRSSVNUQVRFX1JFR19BICAgICAgICAgMHgxNAotI2RlZmluZSBUUklTVEFURV9SRUdfTlVNICAgICAgIDQKLSNkZWZpbmUgUElOX01VWF9DVExfUkVHX0EgICAgICAweDgwCi0jZGVmaW5lIFBJTl9NVVhfQ1RMX1JFR19OVU0gICAgOAotI2RlZmluZSBQVUxMVVBET1dOX1JFR19BICAgICAgIDB4YTAKLSNkZWZpbmUgUFVMTFVQRE9XTl9SRUdfTlVNICAgICA1Ci0KLXN0YXRpYyB1MzIgcGlubXV4X3JlZ1tUUklTVEFURV9SRUdfTlVNICsgUElOX01VWF9DVExfUkVHX05VTSArCi0JCSAgICAgIFBVTExVUERPV05fUkVHX05VTSArCi0JCSAgICAgIEFSUkFZX1NJWkUodGVncmFfc29jX2RyaXZlX3Bpbmdyb3VwcyldOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdfcmVhZGwodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIHJlYWRsKElPX1RPX1ZJUlQoVEVHUkFfQVBCX01JU0NfQkFTRSArIG9mZnNldCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGdfd3JpdGVsKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXdyaXRlbCh2YWx1ZSwgSU9fVE9fVklSVChURUdSQV9BUEJfTUlTQ19CQVNFICsgb2Zmc2V0KSk7Ci19Ci0KLXZvaWQgdGVncmFfcGlubXV4X3N1c3BlbmQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgKmN0eCA9IHBpbm11eF9yZWc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUElOX01VWF9DVExfUkVHX05VTTsgaSsrKQotCQkqY3R4KysgPSBwZ19yZWFkbChQSU5fTVVYX0NUTF9SRUdfQSArIGkqNCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFVMTFVQRE9XTl9SRUdfTlVNOyBpKyspCi0JCSpjdHgrKyA9IHBnX3JlYWRsKFBVTExVUERPV05fUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IFRSSVNUQVRFX1JFR19OVU07IGkrKykKLQkJKmN0eCsrID0gcGdfcmVhZGwoVFJJU1RBVEVfUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmFfc29jX2RyaXZlX3Bpbmdyb3Vwcyk7IGkrKykKLQkJKmN0eCsrID0gcGdfcmVhZGwodGVncmFfc29jX2RyaXZlX3Bpbmdyb3Vwc1tpXS5yZWcpOwotfQotCi12b2lkIHRlZ3JhX3Bpbm11eF9yZXN1bWUodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgKmN0eCA9IHBpbm11eF9yZWc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUElOX01VWF9DVExfUkVHX05VTTsgaSsrKQotCQlwZ193cml0ZWwoKmN0eCsrLCBQSU5fTVVYX0NUTF9SRUdfQSArIGkqNCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUFVMTFVQRE9XTl9SRUdfTlVNOyBpKyspCi0JCXBnX3dyaXRlbCgqY3R4KyssIFBVTExVUERPV05fUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IFRSSVNUQVRFX1JFR19OVU07IGkrKykKLQkJcGdfd3JpdGVsKCpjdHgrKywgVFJJU1RBVEVfUkVHX0EgKyBpKjQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmFfc29jX2RyaXZlX3Bpbmdyb3Vwcyk7IGkrKykKLQkJcGdfd3JpdGVsKCpjdHgrKywgdGVncmFfc29jX2RyaXZlX3Bpbmdyb3Vwc1tpXS5yZWcpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9waW5tdXguYwppbmRleCBmODBkNTA3Li4xZDIwMTY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bpbm11eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvcGlubXV4LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL3Bpbm11eC5oPgpAQCAtMTY5LDE1ICsxNzAsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgbmJhbmtzOworc3RhdGljIHZvaWQgX19pb21lbSAqKnJlZ3M7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ19yZWFkbCh1bnNpZ25lZCBsb25nIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIHBnX3JlYWRsKHUzMiBiYW5rLCB1MzIgcmVnKQogewotCXJldHVybiByZWFkbChJT19UT19WSVJUKFRFR1JBX0FQQl9NSVNDX0JBU0UgKyBvZmZzZXQpKTsKKwlyZXR1cm4gcmVhZGwocmVnc1tiYW5rXSArIHJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwZ193cml0ZWwodW5zaWduZWQgbG9uZyB2YWx1ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgcGdfd3JpdGVsKHUzMiB2YWwsIHUzMiBiYW5rLCB1MzIgcmVnKQogewotCXdyaXRlbCh2YWx1ZSwgSU9fVE9fVklSVChURUdSQV9BUEJfTUlTQ19CQVNFICsgb2Zmc2V0KSk7CisJd3JpdGVsKHZhbCwgcmVnc1tiYW5rXSArIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgdGVncmFfcGlubXV4X3NldF9mdW5jKGNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cF9jb25maWcgKmNvbmZpZykKQEAgLTIxNywxMCArMjIwLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X2xvY2ssIGZsYWdzKTsKIAotCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1twZ10ubXV4X3JlZyk7CisJcmVnID0gcGdfcmVhZGwocGluZ3JvdXBzW3BnXS5tdXhfYmFuaywgcGluZ3JvdXBzW3BnXS5tdXhfcmVnKTsKIAlyZWcgJj0gfigweDMgPDwgcGluZ3JvdXBzW3BnXS5tdXhfYml0KTsKIAlyZWcgfD0gbXV4IDw8IHBpbmdyb3Vwc1twZ10ubXV4X2JpdDsKLQlwZ193cml0ZWwocmVnLCBwaW5ncm91cHNbcGddLm11eF9yZWcpOworCXBnX3dyaXRlbChyZWcsIHBpbmdyb3Vwc1twZ10ubXV4X2JhbmssIHBpbmdyb3Vwc1twZ10ubXV4X3JlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC0yNDEsMTEgKzI0NCwxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChwaW5ncm91cHNbcGddLnRyaV9yZWcpOworCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1twZ10udHJpX2JhbmssIHBpbmdyb3Vwc1twZ10udHJpX3JlZyk7CiAJcmVnICY9IH4oMHgxIDw8IHBpbmdyb3Vwc1twZ10udHJpX2JpdCk7CiAJaWYgKHRyaXN0YXRlKQogCQlyZWcgfD0gMSA8PCBwaW5ncm91cHNbcGddLnRyaV9iaXQ7Ci0JcGdfd3JpdGVsKHJlZywgcGluZ3JvdXBzW3BnXS50cmlfcmVnKTsKKwlwZ193cml0ZWwocmVnLCBwaW5ncm91cHNbcGddLnRyaV9iYW5rLCBwaW5ncm91cHNbcGddLnRyaV9yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtMjcyLDEwICsyNzUsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwocGluZ3JvdXBzW3BnXS5wdXBkX3JlZyk7CisJcmVnID0gcGdfcmVhZGwocGluZ3JvdXBzW3BnXS5wdXBkX2JhbmssIHBpbmdyb3Vwc1twZ10ucHVwZF9yZWcpOwogCXJlZyAmPSB+KDB4MyA8PCBwaW5ncm91cHNbcGddLnB1cGRfYml0KTsKIAlyZWcgfD0gcHVwZCA8PCBwaW5ncm91cHNbcGddLnB1cGRfYml0OwotCXBnX3dyaXRlbChyZWcsIHBpbmdyb3Vwc1twZ10ucHVwZF9yZWcpOworCXBnX3dyaXRlbChyZWcsIHBpbmdyb3Vwc1twZ10ucHVwZF9iYW5rLCBwaW5ncm91cHNbcGddLnB1cGRfcmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9sb2NrLCBmbGFncyk7CiAKQEAgLTM2MiwxMiArMzY1LDEyIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X2xvY2ssIGZsYWdzKTsKIAotCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAJaWYgKGhzbSA9PSBURUdSQV9IU01fRU5BQkxFKQogCQlyZWcgfD0gKDEgPDwgMik7CiAJZWxzZQogCQlyZWcgJj0gfigxIDw8IDIpOwotCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC0zODcsMTIgKzM5MCwxMiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCWlmIChzY2htaXR0ID09IFRFR1JBX1NDSE1JVFRfRU5BQkxFKQogCQlyZWcgfD0gKDEgPDwgMyk7CiAJZWxzZQogCQlyZWcgJj0gfigxIDw8IDMpOwotCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC00MTIsMTAgKzQxNSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCXJlZyAmPSB+KDB4MyA8PCA0KTsKIAlyZWcgfD0gZHJpdmUgPDwgNDsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNDM1LDEwICs0MzgsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfbG9jaywgZmxhZ3MpOwogCi0JcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOworCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnX2JhbmssIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKIAlyZWcgJj0gfigweDFmIDw8IDEyKTsKIAlyZWcgfD0gcHVsbF9kb3duIDw8IDEyOwotCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC00NTgsMTAgKzQ2MSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCXJlZyAmPSB+KDB4MWYgPDwgMTIpOwogCXJlZyB8PSBwdWxsX3VwIDw8IDEyOwotCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC00ODEsMTAgKzQ4NCwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCXJlZyAmPSB+KDB4MyA8PCAyOCk7CiAJcmVnIHw9IHNsZXdfcmlzaW5nIDw8IDI4OwotCXBnX3dyaXRlbChyZWcsIGRyaXZlX3Bpbmdyb3Vwc1twZ10ucmVnKTsKKwlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZ19iYW5rLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfbG9jaywgZmxhZ3MpOwogCkBAIC01MDQsMTAgKzUwNywxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9sb2NrLCBmbGFncyk7CiAKLQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcmVnID0gcGdfcmVhZGwoZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCXJlZyAmPSB+KDB4MyA8PCAzMCk7CiAJcmVnIHw9IHNsZXdfZmFsbGluZyA8PCAzMDsKLQlwZ193cml0ZWwocmVnLCBkcml2ZV9waW5ncm91cHNbcGddLnJlZyk7CisJcGdfd3JpdGVsKHJlZywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWdfYmFuaywgZHJpdmVfcGluZ3JvdXBzW3BnXS5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXV4X2xvY2ssIGZsYWdzKTsKIApAQCAtNjY1LDYgKzY2OCw5OSBAQAogCX0KIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgdGVncmFfcGlubXV4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGk7CisJaW50IGNvbmZpZ19iYWQgPSAwOworCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJaWYgKCFyZXMpCisJCQlicmVhazsKKwl9CisJbmJhbmtzID0gaTsKKworCWZvciAoaSA9IDA7IGkgPCBURUdSQV9NQVhfUElOR1JPVVA7IGkrKykgeworCQlpZiAocGluZ3JvdXBzW2ldLnRyaV9iYW5rID49IG5iYW5rcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGluZ3JvdXAgJWQ6IGJhZCB0cmlfYmFua1xuIiwgaSk7CisJCQljb25maWdfYmFkID0gMTsKKwkJfQorCisJCWlmIChwaW5ncm91cHNbaV0ubXV4X2JhbmsgPj0gbmJhbmtzKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwaW5ncm91cCAlZDogYmFkIG11eF9iYW5rXG4iLCBpKTsKKwkJCWNvbmZpZ19iYWQgPSAxOworCQl9CisKKwkJaWYgKHBpbmdyb3Vwc1tpXS5wdXBkX2JhbmsgPj0gbmJhbmtzKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwaW5ncm91cCAlZDogYmFkIHB1cGRfYmFua1xuIiwgaSk7CisJCQljb25maWdfYmFkID0gMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBURUdSQV9NQVhfRFJJVkVfUElOR1JPVVA7IGkrKykgeworCQlpZiAoZHJpdmVfcGluZ3JvdXBzW2ldLnJlZ19iYW5rID49IG5iYW5rcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJkcml2ZSBwaW5ncm91cCAlZDogYmFkIHJlZ19iYW5rXG4iLCBpKTsKKwkJCWNvbmZpZ19iYWQgPSAxOworCQl9CisJfQorCisJaWYgKGNvbmZpZ19iYWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmVncyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBuYmFua3MgKiBzaXplb2YoKnJlZ3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2MgcmVncyBwb2ludGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5iYW5rczsgaSsrKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgaSk7CisJCWlmICghcmVzKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIE1FTSByZXNvdXJjZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkJICAgIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkJICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJDb3VsZG4ndCByZXF1ZXN0IE1FTSByZXNvdXJjZSAlZFxuIiwgaSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXJlZ3NbaV0gPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkJcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwkJaWYgKCFyZWdzKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBpb3JlbWFwIHJlZ3MgJWRcbiIsIGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfcGlubXV4X29mX21hdGNoW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXBpbm11eCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfcGlubXV4X2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidGVncmEtcGlubXV4IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRlZ3JhX3Bpbm11eF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZQkJPSB0ZWdyYV9waW5tdXhfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWdyYV9waW5tdXhfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRlZ3JhX3Bpbm11eF9kcml2ZXIpOworfQorcG9zdGNvcmVfaW5pdGNhbGwodGVncmFfcGlubXV4X2luaXQpOworCiAjaWZkZWYJQ09ORklHX0RFQlVHX0ZTCiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CkBAIC02ODQsNiArNzgwLDcgQEAKIAlpbnQgbGVuOwogCiAJZm9yIChpID0gMDsgaSA8IFRFR1JBX01BWF9QSU5HUk9VUDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcmVnOwogCQl1bnNpZ25lZCBsb25nIHRyaTsKIAkJdW5zaWduZWQgbG9uZyBtdXg7CiAJCXVuc2lnbmVkIGxvbmcgcHVwZDsKQEAgLTY5Niw4ICs3OTMsOSBAQAogCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfTVVYX05PTkUiKTsKIAkJCWxlbiA9IHN0cmxlbigiTk9ORSIpOwogCQl9IGVsc2UgewotCQkJbXV4ID0gKHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS5tdXhfcmVnKSA+PgotCQkJICAgICAgIHBpbmdyb3Vwc1tpXS5tdXhfYml0KSAmIDB4MzsKKwkJCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS5tdXhfYmFuaywKKwkJCQkJcGluZ3JvdXBzW2ldLm11eF9yZWcpOworCQkJbXV4ID0gKHJlZyA+PiBwaW5ncm91cHNbaV0ubXV4X2JpdCkgJiAweDM7CiAJCQlpZiAocGluZ3JvdXBzW2ldLmZ1bmNzW211eF0gPT0gVEVHUkFfTVVYX1JTVkQpIHsKIAkJCQlzZXFfcHJpbnRmKHMsICJURUdSQV9NVVhfUlNWRCUxbHUiLCBtdXgrMSk7CiAJCQkJbGVuID0gNTsKQEAgLTcxMyw4ICs4MTEsOSBAQAogCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfUFVQRF9OT1JNQUwiKTsKIAkJCWxlbiA9IHN0cmxlbigiTk9STUFMIik7CiAJCX0gZWxzZSB7Ci0JCQlwdXBkID0gKHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS5wdXBkX3JlZykgPj4KLQkJCQlwaW5ncm91cHNbaV0ucHVwZF9iaXQpICYgMHgzOworCQkJcmVnID0gcGdfcmVhZGwocGluZ3JvdXBzW2ldLnB1cGRfYmFuaywKKwkJCQkJcGluZ3JvdXBzW2ldLnB1cGRfcmVnKTsKKwkJCXB1cGQgPSAocmVnID4+IHBpbmdyb3Vwc1tpXS5wdXBkX2JpdCkgJiAweDM7CiAJCQlzZXFfcHJpbnRmKHMsICJURUdSQV9QVVBEXyVzIiwgcHVwZF9uYW1lKHB1cGQpKTsKIAkJCWxlbiA9IHN0cmxlbihwdXBkX25hbWUocHVwZCkpOwogCQl9CkBAIC03MjMsOCArODIyLDkgQEAKIAkJaWYgKHBpbmdyb3Vwc1tpXS50cmlfcmVnIDwgMCkgewogCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfVFJJX05PUk1BTCIpOwogCQl9IGVsc2UgewotCQkJdHJpID0gKHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS50cmlfcmVnKSA+PgotCQkJICAgICAgIHBpbmdyb3Vwc1tpXS50cmlfYml0KSAmIDB4MTsKKwkJCXJlZyA9IHBnX3JlYWRsKHBpbmdyb3Vwc1tpXS50cmlfYmFuaywKKwkJCQkJcGluZ3JvdXBzW2ldLnRyaV9yZWcpOworCQkJdHJpID0gKHJlZyA+PiBwaW5ncm91cHNbaV0udHJpX2JpdCkgJiAweDE7CiAKIAkJCXNlcV9wcmludGYocywgIlRFR1JBX1RSSV8lcyIsIHRyaV9uYW1lKHRyaSkpOwogCQl9CkBAIC03NTksNyArODU5LDggQEAKIAkJZGJnX3BhZF9maWVsZChzLCA3IC0gbGVuKTsKIAogCi0JCXJlZyA9IHBnX3JlYWRsKGRyaXZlX3Bpbmdyb3Vwc1tpXS5yZWcpOworCQlyZWcgPSBwZ19yZWFkbChkcml2ZV9waW5ncm91cHNbaV0ucmVnX2JhbmssCisJCQkJZHJpdmVfcGluZ3JvdXBzW2ldLnJlZyk7CiAJCWlmIChIU01fRU4ocmVnKSkgewogCQkJc2VxX3ByaW50ZihzLCAiVEVHUkFfSFNNX0VOQUJMRSIpOwogCQkJbGVuID0gMTY7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bvd2VyZ2F0ZS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wb3dlcmdhdGUuYwppbmRleCAzY2VlOWFhLi45NDgzMDY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3Bvd2VyZ2F0ZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvcG93ZXJnYXRlLmMKQEAgLTg5LDEyICs4OSwxMSBAQAogCXJldHVybiB0ZWdyYV9wb3dlcmdhdGVfc2V0KGlkLCBmYWxzZSk7CiB9CiAKLWJvb2wgdGVncmFfcG93ZXJnYXRlX2lzX3Bvd2VyZWQoaW50IGlkKQorc3RhdGljIGJvb2wgdGVncmFfcG93ZXJnYXRlX2lzX3Bvd2VyZWQoaW50IGlkKQogewogCXUzMiBzdGF0dXM7CiAKLQlpZiAoaWQgPCAwIHx8IGlkID49IFRFR1JBX05VTV9QT1dFUkdBVEUpCi0JCXJldHVybiAtRUlOVkFMOworCVdBUk5fT04oaWQgPCAwIHx8IGlkID49IFRFR1JBX05VTV9QT1dFUkdBVEUpOwogCiAJc3RhdHVzID0gcG1jX3JlYWQoUFdSR0FURV9TVEFUVVMpICYgKDEgPDwgaWQpOwogCXJldHVybiAhIXN0YXR1czsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvdGVncmEyX2Nsb2Nrcy5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS90ZWdyYTJfY2xvY2tzLmMKaW5kZXggMGZlOWIzZS4uMzcxODY5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS90ZWdyYTJfY2xvY2tzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS90ZWdyYTJfY2xvY2tzLmMKQEAgLTE2NiwxMyArMTY2LDEzIEBACiBzdGF0aWMgaW50IHRlZ3JhX3BlcmlwaF9jbGtfZW5hYmxlX3JlZmNvdW50WzMgKiAzMl07CiAKICNkZWZpbmUgY2xrX3dyaXRlbCh2YWx1ZSwgcmVnKSBcCi0JX19yYXdfd3JpdGVsKHZhbHVlLCAodTMyKXJlZ19jbGtfYmFzZSArIChyZWcpKQorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgcmVnX2Nsa19iYXNlICsgKHJlZykpCiAjZGVmaW5lIGNsa19yZWFkbChyZWcpIFwKLQlfX3Jhd19yZWFkbCgodTMyKXJlZ19jbGtfYmFzZSArIChyZWcpKQorCV9fcmF3X3JlYWRsKHJlZ19jbGtfYmFzZSArIChyZWcpKQogI2RlZmluZSBwbWNfd3JpdGVsKHZhbHVlLCByZWcpIFwKLQlfX3Jhd193cml0ZWwodmFsdWUsICh1MzIpcmVnX3BtY19iYXNlICsgKHJlZykpCisJX19yYXdfd3JpdGVsKHZhbHVlLCByZWdfcG1jX2Jhc2UgKyAocmVnKSkKICNkZWZpbmUgcG1jX3JlYWRsKHJlZykgXAotCV9fcmF3X3JlYWRsKCh1MzIpcmVnX3BtY19iYXNlICsgKHJlZykpCisJX19yYXdfcmVhZGwocmVnX3BtY19iYXNlICsgKHJlZykpCiAKIHVuc2lnbmVkIGxvbmcgY2xrX21lYXN1cmVfaW5wdXRfZnJlcSh2b2lkKQogewpAQCAtOTE4LDcgKzkxOCw3IEBACiBzdGF0aWMgdm9pZCB0ZWdyYTJfcGVyaXBoX2Nsa19pbml0KHN0cnVjdCBjbGsgKmMpCiB7CiAJdTMyIHZhbCA9IGNsa19yZWFkbChjLT5yZWcpOwotCWNvbnN0IHN0cnVjdCBjbGtfbXV4X3NlbCAqbXV4ID0gMDsKKwljb25zdCBzdHJ1Y3QgY2xrX211eF9zZWwgKm11eCA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGNsa19tdXhfc2VsICpzZWw7CiAJaWYgKGMtPmZsYWdzICYgTVVYKSB7CiAJCWZvciAoc2VsID0gYy0+aW5wdXRzOyBzZWwtPmlucHV0ICE9IE5VTEw7IHNlbCsrKSB7CkBAIC0xNDU5LDcgKzE0NTksNyBAQAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCB0ZWdyYV9jbGtfbV9zZWxbXSA9IHsKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfMzJrLCAudmFsdWUgPSAwfSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfcywgIC52YWx1ZSA9IDF9LAotCXsgMCwgMH0sCisJeyBOVUxMICwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB0ZWdyYV9jbGtfbSA9IHsKQEAgLTE4NjEsNyArMTg2MSw3IEBACiAJeyAubmFtZSA9ICJleHRfYXVkaW9fY2xrMSIsIC52YWx1ZSA9IDYgfSwKIAl7IC5uYW1lID0gImV4dF92aW1jbGsiLCAudmFsdWUgPSA3IH0sCiAjZW5kaWYKLQl7IDAsIDAgfQorCXsgTlVMTCwgMCB9CiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB0ZWdyYV9jbGtfYXVkaW8gPSB7CkBAIC0xODg1LDcgKzE4ODUsNyBAQAogCX0sCiB9OwogCi1zdHJ1Y3QgY2xrX2xvb2t1cCB0ZWdyYV9hdWRpb19jbGtfbG9va3Vwc1tdID0geworc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIHRlZ3JhX2F1ZGlvX2Nsa19sb29rdXBzW10gPSB7CiAJeyAuY29uX2lkID0gImF1ZGlvIiwgLmNsayA9ICZ0ZWdyYV9jbGtfYXVkaW8gfSwKIAl7IC5jb25faWQgPSAiYXVkaW9fMngiLCAuY2xrID0gJnRlZ3JhX2Nsa19hdWRpb18yeCB9CiB9OwpAQCAtMTkyNiw3ICsxOTI2LDcgQEAKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfcF9vdXQzLAkudmFsdWUgPSA2fSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfZCwJLnZhbHVlID0gN30sCiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX3gsCS52YWx1ZSA9IDh9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3NjbGtbXSA9IHsKQEAgLTE5MzgsNyArMTkzOCw3IEBACiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrX2QsCS52YWx1ZSA9IDV9LAogCXsgLmlucHV0ID0gJnRlZ3JhX2Nsa18zMmssCS52YWx1ZSA9IDZ9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9tX291dDEsCS52YWx1ZSA9IDd9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHRlZ3JhX2Nsa19jY2xrID0gewpAQCAtMjAwOSw3ICsyMDA5LDcgQEAKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfYywgLnZhbHVlID0gMX0sCiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX3AsIC52YWx1ZSA9IDJ9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9hX291dDAsIC52YWx1ZSA9IDN9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbG1fcGxsY19wbGxwX2Nsa21bXSA9IHsKQEAgLTIwMTcsNyArMjAxNyw3IEBACiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX2MsIC52YWx1ZSA9IDF9LAogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9wLCAudmFsdWUgPSAyfSwKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfbSwgLnZhbHVlID0gM30sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGxscF9wbGxjX3BsbG1fY2xrbVtdID0gewpAQCAtMjAyNSw3ICsyMDI1LDcgQEAKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9wbGxfYywgLnZhbHVlID0gMX0sCiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX20sIC52YWx1ZSA9IDJ9LAogCXsgLmlucHV0ID0gJnRlZ3JhX2Nsa19tLCAudmFsdWUgPSAzfSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9wbGxhb3V0MF9hdWRpbzJ4X3BsbHBfY2xrbVtdID0gewpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKIAl7LmlucHV0ID0gJnRlZ3JhX2Nsa19hdWRpb18yeCwgLnZhbHVlID0gMX0sCiAJey5pbnB1dCA9ICZ0ZWdyYV9wbGxfcCwgLnZhbHVlID0gMn0sCiAJey5pbnB1dCA9ICZ0ZWdyYV9jbGtfbSwgLnZhbHVlID0gM30sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGxscF9wbGxkX3BsbGNfY2xrbVtdID0gewpAQCAtMjA0MSw3ICsyMDQxLDcgQEAKIAl7LmlucHV0ID0gJnRlZ3JhX3BsbF9kX291dDAsIC52YWx1ZSA9IDF9LAogCXsuaW5wdXQgPSAmdGVncmFfcGxsX2MsIC52YWx1ZSA9IDJ9LAogCXsuaW5wdXQgPSAmdGVncmFfY2xrX20sIC52YWx1ZSA9IDN9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbHBfcGxsY19hdWRpb19jbGttX2NsazMyW10gPSB7CkBAIC0yMDUwLDM5ICsyMDUwLDM5IEBACiAJey5pbnB1dCA9ICZ0ZWdyYV9jbGtfYXVkaW8sICAgICAudmFsdWUgPSAyfSwKIAl7LmlucHV0ID0gJnRlZ3JhX2Nsa19tLCAgICAgLnZhbHVlID0gM30sCiAJey5pbnB1dCA9ICZ0ZWdyYV9jbGtfMzJrLCAgIC52YWx1ZSA9IDR9LAotCXsgMCwgMH0sCisJeyBOVUxMLCAwfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX211eF9zZWwgbXV4X3BsbHBfcGxsY19wbGxtW10gPSB7CiAJey5pbnB1dCA9ICZ0ZWdyYV9wbGxfcCwgICAgIC52YWx1ZSA9IDB9LAogCXsuaW5wdXQgPSAmdGVncmFfcGxsX2MsICAgICAudmFsdWUgPSAxfSwKIAl7LmlucHV0ID0gJnRlZ3JhX3BsbF9tLCAgICAgLnZhbHVlID0gMn0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfY2xrX21bXSA9IHsKIAl7IC5pbnB1dCA9ICZ0ZWdyYV9jbGtfbSwgLnZhbHVlID0gMH0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGxscF9vdXQzW10gPSB7CiAJeyAuaW5wdXQgPSAmdGVncmFfcGxsX3Bfb3V0MywgLnZhbHVlID0gMH0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGxsZFtdID0gewogCXsgLmlucHV0ID0gJnRlZ3JhX3BsbF9kLCAudmFsdWUgPSAwfSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19tdXhfc2VsIG11eF9jbGtfMzJrW10gPSB7CiAJeyAuaW5wdXQgPSAmdGVncmFfY2xrXzMyaywgLnZhbHVlID0gMH0sCi0JeyAwLCAwfSwKKwl7IE5VTEwsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfbXV4X3NlbCBtdXhfcGNsa1tdID0gewogCXsgLmlucHV0ID0gJnRlZ3JhX2Nsa19wY2xrLCAudmFsdWUgPSAwfSwKLQl7IDAsIDB9LAorCXsgTlVMTCwgMH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayB0ZWdyYV9jbGtfZW1jID0gewpAQCAtMjEyNSw3ICsyMTI1LDcgQEAKIAkJLnBhcmVudCA9IF9wYXJlbnQsCQkJXAogCX0KIAotc3RydWN0IGNsayB0ZWdyYV9saXN0X2Nsa3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRlZ3JhX2xpc3RfY2xrc1tdID0gewogCVBFUklQSF9DTEsoImFwYmRtYSIsCSJ0ZWdyYS1kbWEiLAkJTlVMTCwJMzQsCTAsCTEwODAwMDAwMCwgbXV4X3BjbGssCQkJMCksCiAJUEVSSVBIX0NMSygicnRjIiwJInJ0Yy10ZWdyYSIsCQlOVUxMLAk0LAkwLAkzMjc2OCwgICAgIG11eF9jbGtfMzJrLAkJCVBFUklQSF9OT19SRVNFVCksCiAJUEVSSVBIX0NMSygidGltZXIiLAkidGltZXIiLAkJTlVMTCwJNSwJMCwJMjYwMDAwMDAsICBtdXhfY2xrX20sCQkJMCksCkBAIC0yMjIxLDcgKzIyMjEsNyBAQAogICogY29uZmlndXJhdGlvbi4gIExpc3QgdGhvc2UgaGVyZSB0byByZWdpc3RlciB0aGVtIHR3aWNlIGluIHRoZSBjbG9jayBsb29rdXAKICAqIHRhYmxlIHVuZGVyIHR3byBuYW1lcy4KICAqLwotc3RydWN0IGNsa19kdXBsaWNhdGUgdGVncmFfY2xrX2R1cGxpY2F0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2R1cGxpY2F0ZSB0ZWdyYV9jbGtfZHVwbGljYXRlc1tdID0gewogCUNMS19EVVBMSUNBVEUoInVhcnRhIiwJInRlZ3JhX3VhcnQuMCIsCU5VTEwpLAogCUNMS19EVVBMSUNBVEUoInVhcnRiIiwJInRlZ3JhX3VhcnQuMSIsCU5VTEwpLAogCUNMS19EVVBMSUNBVEUoInVhcnRjIiwJInRlZ3JhX3VhcnQuMiIsCU5VTEwpLApAQCAtMjI1Miw3ICsyMjUyLDcgQEAKIAkJLmNsayA9IGNrLAlcCiAJfQogCi1zdHJ1Y3QgY2xrICp0ZWdyYV9wdHJfY2xrc1tdID0geworc3RhdGljIHN0cnVjdCBjbGsgKnRlZ3JhX3B0cl9jbGtzW10gPSB7CiAJJnRlZ3JhX2Nsa18zMmssCiAJJnRlZ3JhX3BsbF9zLAogCSZ0ZWdyYV9jbGtfbSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvdGltZXIuYwppbmRleCA5MDM1MDQyLi5lMjI3MmQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS90aW1lci5jCkBAIC02Miw5ICs2Miw5IEBACiBzdGF0aWMgdTY0IHBlcnNpc3RlbnRfbXMsIGxhc3RfcGVyc2lzdGVudF9tczsKIAogI2RlZmluZSB0aW1lcl93cml0ZWwodmFsdWUsIHJlZykgXAotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgKHUzMil0aW1lcl9yZWdfYmFzZSArIChyZWcpKQorCV9fcmF3X3dyaXRlbCh2YWx1ZSwgdGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKICNkZWZpbmUgdGltZXJfcmVhZGwocmVnKSBcCi0JX19yYXdfcmVhZGwoKHUzMil0aW1lcl9yZWdfYmFzZSArIChyZWcpKQorCV9fcmF3X3JlYWRsKHRpbWVyX3JlZ19iYXNlICsgKHJlZykpCiAKIHN0YXRpYyBpbnQgdGVncmFfdGltZXJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCiAJCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCkBAIC0xMzMsNyArMTMzLDcgQEAKICAqIHRlZ3JhX3J0YyBkcml2ZXIgY291bGQgYmUgZXhlY3V0aW5nIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucwogICogb24gdGhlIFJUQyBzaGFkb3cgcmVnaXN0ZXIKICAqLwotdTY0IHRlZ3JhX3J0Y19yZWFkX21zKHZvaWQpCitzdGF0aWMgdTY0IHRlZ3JhX3J0Y19yZWFkX21zKHZvaWQpCiB7CiAJdTMyIG1zID0gcmVhZGwocnRjX2Jhc2UgKyBSVENfTUlMTElTRUNPTkRTKTsKIAl1MzIgcyA9IHJlYWRsKHJ0Y19iYXNlICsgUlRDX1NIQURPV19TRUNPTkRTKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvdXNiX3BoeS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS91c2JfcGh5LmMKaW5kZXggODgwODFiYi4uMzc1NzZhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS91c2JfcGh5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS91c2JfcGh5LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgogI2luY2x1ZGUgPG1hY2gvdXNiX3BoeS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXUzMDAvS2NvbmZpZwppbmRleCA0NDlmZDZhLi4xY2JjZDRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvS2NvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIAlib29sICJVMzAwIgogCXNlbGVjdCBQSU5DVFJMCiAJc2VsZWN0IFBJTk1VWF9VMzAwCisJc2VsZWN0IEdQSU9fVTMwMAogCiBjb21tZW50ICJTVC1Fcmljc3NvbiBVMzAwL1UzMzAvVTMzNS9VMzY1IEZlYXR1cmUgU2VsZWN0aW9ucyIKIApAQCAtNTAsMzkgKzUxLDEyIEBACiAKIGVuZGNob2ljZQogCi1jaG9pY2UKLQlwcm9tcHQgIk1lbW9yeSBjb25maWd1cmF0aW9uIgotCWRlZmF1bHQgTUFDSF9VMzAwX1NJTkdMRV9SQU0KLQktLS1oZWxwLS0tCi0JWW91IGhhdmUgdG8gY29uZmlnIHRoZSBrZXJuZWwgYWNjb3JkaW5nIHRvIHRoZSBwaHlzaWNhbCBtZW1vcnkKLQljb25maWd1cmF0aW9uLgotCi1jb25maWcgTUFDSF9VMzAwX1NJTkdMRV9SQU0KLQlib29sICJTaW5nbGUgUkFNIgotCWhlbHAKLQkJU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgU2luZ2xlIFJBTSBwaG9uZXMuCi0KLWNvbmZpZyBNQUNIX1UzMDBfRFVBTF9SQU0KLQlib29sICJEdWFsIFJBTSIKLQloZWxwCi0JCVNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIER1YWwgUkFNIHBob25lcy4KLQkJVGhpcyBpcyB0d28gUkFNIG1lbW9yaWVzIG9uIGRpZmZlcmVudCBFTUlGcy4KLWVuZGNob2ljZQotCiBjb25maWcgVTMwMF9ERUJVRwogCWJvb2wgIkRlYnVnIHN1cHBvcnQgZm9yIFUzMDAiCiAJZGVwZW5kcyBvbiBQTQogCWhlbHAKIAkJRGVidWcgc3VwcG9ydCBmb3IgVTMwMCBpbiBzeXNmcywgcHJvY2ZzIGV0Yy4KIAotY29uZmlnIE1BQ0hfVTMwMF9TRU1JX0lTX1NIQVJFRAotCWJvb2wgIlRoZSBTRU1JIGlzIHVzZWQgYnkgYm90aCB0aGUgYWNjZXNzIGFuZCBhcHBsaWNhdGlvbiBzaWRlIgotCWRlcGVuZHMgb24gTUFDSF9VMzAwCi0JaGVscAotCQlUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgU0VNSSAoU2hhcmVkIEV4dGVybmFsCi0JCU1lbW9yeSBJbnRlcmZhY2UpIGZyb20gYm90aCBmcm9tIGFjY2VzcyBhbmQgYXBwbGljYXRpb24KLQkJc2lkZS4KLQogY29uZmlnIE1BQ0hfVTMwMF9TUElEVU1NWQogCWJvb2wgIlNTUC9TUEkgZHVtbXkgY2hpcCIKIAlzZWxlY3QgU1BJCkBAIC05NSwyNSArNjksNiBAQAogCQl5b3UgZG9uJ3QgbmVlZCBpdC4gU2VsZWN0aW5nIHRoaXMgd2lsbCBhY3RpdmF0ZSB0aGUKIAkJU1BJIGZyYW1ld29yayBhbmQgQVJNIFBMMDIyIHN1cHBvcnQuCiAKLWNvbW1lbnQgIkFsbCB0aGUgc2V0dGluZ3MgYmVsb3cgbXVzdCBtYXRjaCB0aGUgYm9vdGxvYWRlcidzIHNldHRpbmdzIgotCi1jb25maWcgTUFDSF9VMzAwX0FDQ0VTU19NRU1fU0laRQotICAgICAgIGludCAiQWNjZXNzIENQVSBtZW1vcnkgYWxsb2NhdGlvbiIKLSAgICAgICByYW5nZSA3IDI1Ci0gICAgICAgZGVwZW5kcyBvbiBNQUNIX1UzMDBfU0lOR0xFX1JBTQotICAgICAgIGRlZmF1bHQgMTMKLSAgICAgICBoZWxwCi0JCUhvdyBtdWNoIG1lbW9yeSBpbiBNaUIgdGhhdCB0aGUgQWNjZXNzIHNpZGUgQ1BVIGhhcyBhbGxvY2F0ZWQKLQotY29uZmlnIE1BQ0hfVTMwMF8yTUJfQUxJR05NRU5UX0ZJWAotICAgICAgIGJvb2wgIjJNaUIgYWxpZ25tZW50IGZpeCIKLSAgICAgICBkZXBlbmRzIG9uIE1BQ0hfVTMwMF9TSU5HTEVfUkFNCi0gICAgICAgZGVmYXVsdCB5Ci0gICAgICAgaGVscAotCQlJZiB5ZXMgYW5kIHRoZSBBY2Nlc3Mgc2lkZSBDUFUgaGFzIGFsbG9jYXRlZCBhbiBvZGQgc2l6ZSBpbgotCQlNaUIsIHRoaXMgZml4IGdpdmVzIHlvdSBvbmUgTWlCIGV4dHJhIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlCi0JCWxvc3QgZHVlIHRvIExpbnV4IDIgTWlCIGFsaWdubWVudCBwb2xpY3kuCi0KIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlLmJvb3QKaW5kZXggNjkzNTdhZi4uODc4MTFkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlLmJvb3QKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL01ha2VmaWxlLmJvb3QKQEAgLTEsMTUgKzEsNCBAQAotIyBOb3RlOiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdCBhbHdheXMgYmUgdHJ1ZToKLSMgICBaUkVMQUREUiA9PSB2aXJ0X3RvX3BoeXMoVEVYVEFERFIpCi0jICAgUEFSQU1TX1BIWVMgbXVzdCBiZSB3aXRoaW4gNE1CIG9mIFpSRUxBRERSCi0jICAgSU5JVFJEX1BIWVMgbXVzdCBiZSBpbiBSQU0KLQotaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9TSU5HTEVfUkFNCi0gICAgIHpyZWxhZGRyLXkJKz0gMHgyOEUwODAwMAotICBwYXJhbXNfcGh5cy15CTo9IDB4MjhFMDAxMDAKLWVsc2UKLSAgICAgenJlbGFkZHIteQkrPSAweDQ4MDA4MDAwCi0gIHBhcmFtc19waHlzLXkJOj0gMHg0ODAwMDEwMAotZW5kaWYKLQorICAgenJlbGFkZHIteQkrPSAweDQ4MDA4MDAwCitwYXJhbXNfcGh5cy15CTo9IDB4NDgwMDAxMDAKICMgVGhpcyBpc24ndCB1c2VkLgotI2luaXRyZF9waHlzLXkJOj0gMHgyOTgwMDAwMAorI2luaXRyZF9waHlzLXkJOj0gMHg0ODgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9jb3JlLmMKaW5kZXggMmY1OTI5Yi4uYWMwNzkxZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvY29yZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL2ZzbWMuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTM5LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9zeXNjb24uaD4KICNpbmNsdWRlIDxtYWNoL2RtYV9jaGFubmVscy5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby11MzAwLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgIm1tYy5oIgpAQCAtNzAsMzAgKzcyLDEzIEBACiAJCS5sZW5ndGgJCT0gU1pfMzJLLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwKLQl7Ci0JCS52aXJ0dWFsCT0gMHhmZmZmMjAwMCwgLyogVENNIG1lbW9yeSAqLwotCQkucGZuCQk9IF9fcGh5c190b19wZm4oMHhmZmZmMjAwMCksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLQotCS8qCi0JICogVGhpcyBvdmVybGFwcyB3aXRoIHRoZSBJUlEgdmVjdG9ycyBldGMgYXQgMHhmZmZmMDAwMCwgc28gdGhlc2UKLQkgKiBtYXkgaGF2ZSB0byBiZSBtb3ZlZCB0byAweDAwMDAwMDAwIGluIG9yZGVyIHRvIHVzZSB0aGUgUk9NLgotCSAqLwotCS8qCi0JewotCQkudmlydHVhbAk9IFUzMDBfQk9PVFJPTV9WSVJUX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihVMzAwX0JPT1RST01fUEhZU19CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl82NEssCi0JCS50eXBlCQk9IE1UX1JPTSwKLQl9LAotCSovCiB9OwogCiB2b2lkIF9faW5pdCB1MzAwX21hcF9pbyh2b2lkKQogewogCWlvdGFibGVfaW5pdCh1MzAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUodTMwMF9pb19kZXNjKSk7CisJLyogV2UgZW5hYmxlIGEgcmVhbCBiaWcgRE1BIGJ1ZmZlciBpZiBuZWVkIGJlLiAqLworCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZShTWl80TSk7CiB9CiAKIC8qCkBAIC0yNDEsNyArMjI2LDcgQEAKIAkJLmVuZCAgID0gSVJRX1UzMDBfR1BJT19QT1JUMiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKLSNpZmRlZiBVMzAwX0NPSDkwMTU3MV8zCisjaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzY1KSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzUpCiAJewogCQkubmFtZSAgPSAiZ3BpbzMiLAogCQkuc3RhcnQgPSBJUlFfVTMwMF9HUElPX1BPUlQzLApAQCAtMjU0LDYgKzIzOSw3IEBACiAJCS5lbmQgICA9IElSUV9VMzAwX0dQSU9fUE9SVDQsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCisjZW5kaWYKICNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzM1CiAJewogCQkubmFtZSAgPSAiZ3BpbzUiLApAQCAtMjY4LDcgKzI1NCw2IEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAjZW5kaWYgLyogQ09ORklHX01BQ0hfVTMwMF9CUzMzNSAqLwotI2VuZGlmIC8qIFUzMDBfQ09IOTAxNTcxXzMgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Uga2V5cGFkX3Jlc291cmNlc1tdID0gewpAQCAtMzYzLDUxICszNDgsNiBAQAogCX0KIH07CiAKLS8qIFRPRE86IFRoZXNlIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgc3VpdGFibGUgI2lmZGVmJ3MgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXZlX3Jlc291cmNlc1tdID0gewotCXsKLQkJLm5hbWUgID0gIkFWRTNlIEkvTyBBcmVhIiwKLQkJLnN0YXJ0ID0gVTMwMF9WSURFT0VOQ19CQVNFLAotCQkuZW5kICAgPSBVMzAwX1ZJREVPRU5DX0JBU0UgKyBTWl81MTJLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5uYW1lICA9ICJBVkUzZSBJUlEwIiwKLQkJLnN0YXJ0ID0gSVJRX1UzMDBfVklERU9fRU5DXzAsCi0JCS5lbmQgICA9IElSUV9VMzAwX1ZJREVPX0VOQ18wLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCXsKLQkJLm5hbWUgID0gIkFWRTNlIElSUTEiLAotCQkuc3RhcnQgPSBJUlFfVTMwMF9WSURFT19FTkNfMSwKLQkJLmVuZCAgID0gSVJRX1UzMDBfVklERU9fRU5DXzEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JewotCQkubmFtZSAgPSAiQVZFM2UgUGh5c21lbSBBcmVhIiwKLQkJLnN0YXJ0ID0gMCwgLyogMCB3aWxsIGJlIHJlbWFwcGVkIHRvIHJlc2VydmVkIG1lbW9yeSAqLwotCQkuZW5kICAgPSBTWl8xTSAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JLyoKLQkgKiBUaGUgQVZFM2UgcmVxdWlyZXMgdHdvIHJlZ2lvbnMgb2YgMjU2TUIgdGhhdCBpdCBjb25zaWRlcnMKLQkgKiAiaW52aXNpYmxlIi4gVGhlIGhhcmR3YXJlIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzIHRoZXNlCi0JICogYWRkcmVzc2VzLCBzbyB0aGV5IHNob3VsZCBuZXZlciBwb2ludCB0byBzeXN0ZW0gUkFNLgotCSAqLwotCXsKLQkJLm5hbWUgID0gIkFWRTNlIFJlc2VydmVkIDAiLAotCQkuc3RhcnQgPSAweGQwMDAwMDAwLAotCQkuZW5kICAgPSAweGQwMDAwMDAwICsgU1pfMjU2TSAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JewotCQkubmFtZSAgPSAiQVZFM2UgUmVzZXJ2ZWQgMSIsCi0JCS5zdGFydCA9IDB4ZTAwMDAwMDAsCi0JCS5lbmQgICA9IDB4ZTAwMDAwMDAgKyBTWl8yNTZNIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG1hX3Jlc291cmNlW10gPSB7CiAJewogCQkuc3RhcnQgPSBVMzAwX0RNQUNfQkFTRSwKQEAgLTE1NjYsMTEgKzE1MDYsMzUgQEAKIAkucmVzb3VyY2UgPSBpMmMxX3Jlc291cmNlcywKIH07CiAKKy8qCisgKiBUaGUgZGlmZmVyZW50IHZhcmlhbnRzIGhhdmUgYSBmZXcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZQorICogR1BJTyBibG9jaywgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvcnRzLgorICovCitzdGF0aWMgc3RydWN0IHUzMDBfZ3Bpb19wbGF0Zm9ybSB1MzAwX2dwaW9fcGxhdCA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMyWCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzMwKQorCS52YXJpYW50ID0gVTMwMF9HUElPX0NPSDkwMTMzNSwKKwkucG9ydHMgPSAzLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzMzNQorCS52YXJpYW50ID0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzM1LAorCS5wb3J0cyA9IDcsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzY1CisJLnZhcmlhbnQgPSBVMzAwX0dQSU9fQ09IOTAxNTcxXzNfQlMzNjUsCisJLnBvcnRzID0gNSwKKyNlbmRpZgorCS5ncGlvX2Jhc2UgPSAwLAorCS5ncGlvX2lycV9iYXNlID0gSVJRX1UzMDBfR1BJT19CQVNFLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZ3Bpb19kZXZpY2UgPSB7CiAJLm5hbWUgPSAidTMwMC1ncGlvIiwKIAkuaWQgPSAtMSwKIAkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoZ3Bpb19yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSA9IGdwaW9fcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnUzMDBfZ3Bpb19wbGF0LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBrZXlwYWRfZGV2aWNlID0gewpAQCAtMTYyMiwxMyArMTU4Niw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF2ZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAidmlkZW9fZW5jIiwKLQkuaWQgPSAtMSwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYXZlX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYXZlX3Jlc291cmNlcywKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtYV9kZXZpY2UgPSB7CiAJLm5hbWUJCT0gImNvaDkwMTMxOCIsCiAJLmlkCQk9IC0xLApAQCAtMTcxOSw3ICsxNjc2LDYgQEAKIAkmZ3Bpb19kZXZpY2UsCiAJJm5hbmRfZGV2aWNlLAogCSZ3ZG9nX2RldmljZSwKLQkmYXZlX2RldmljZSwKIAkmcGlubXV4X2RldmljZSwKIH07CiAKQEAgLTE3NDIsNyArMTY5OCw3IEBACiAJQlVHX09OKElTX0VSUihjbGspKTsKIAljbGtfZW5hYmxlKGNsayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBVMzAwX1ZJQ19JUlFTX0VORDsgaSsrKQogCQlzZXRfYml0KGksICh1bnNpZ25lZCBsb25nICopICZtYXNrWzBdKTsKIAl2aWNfaW5pdCgodm9pZCBfX2lvbWVtICopIFUzMDBfSU5UQ09OMF9WQkFTRSwgMCwgbWFza1swXSwgbWFza1swXSk7CiAJdmljX2luaXQoKHZvaWQgX19pb21lbSAqKSBVMzAwX0lOVENPTjFfVkJBU0UsIDMyLCBtYXNrWzFdLCBtYXNrWzFdKTsKQEAgLTE5MTcsMTcgKzE4NzMsMTAgQEAKIAkvKiBSZWdpc3RlciBzdWJkZXZpY2VzIG9uIHRoZSBTUEkgYnVzICovCiAJdTMwMF9zcGlfcmVnaXN0ZXJfYm9hcmRfZGV2aWNlcygpOwogCi0jaWZuZGVmIENPTkZJR19NQUNIX1UzMDBfU0VNSV9JU19TSEFSRUQKLQkvKgotCSAqIEVuYWJsZSBTRU1JIHNlbGYgcmVmcmVzaC4gU2VsZi1yZWZyZXNoIG9mIHRoZSBTRFJBTSBpcyBlbnRlcmVkIHdoZW4KLQkgKiBib3RoIHN1YnN5c3RlbXMgYXJlIHJlcXVlc3RpbmcgdGhpcyBtb2RlLgotCSAqIElmIHdlIG5vdCBzaGFyZSB0aGUgQWNjIFNEUkFNLCB0aGlzIGlzIG5ldmVyIHRoZSBjYXNlLiBUaGVyZWZvcmUKLQkgKiBlbmFibGUgaXQgaGVyZSBmcm9tIHRoZSBBcHAgc2lkZS4KLQkgKi8KKwkvKiBFbmFibGUgU0VNSSBzZWxmIHJlZnJlc2ggKi8KIAl2YWwgPSByZWFkdyhVMzAwX1NZU0NPTl9WQkFTRSArIFUzMDBfU1lTQ09OX1NNQ1IpIHwKIAkJVTMwMF9TWVNDT05fU01DUl9TRU1JX1NSRUZSRVFfRU5BQkxFOwogCXdyaXRldyh2YWwsIFUzMDBfU1lTQ09OX1ZCQVNFICsgVTMwMF9TWVNDT05fU01DUik7Ci0jZW5kaWYgLyogQ09ORklHX01BQ0hfVTMwMF9TRU1JX0lTX1NIQVJFRCAqLwogfQogCiBzdGF0aWMgaW50IGNvcmVfbW9kdWxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuYyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pMmMuYwppbmRleCBmMDM5NGJhLi41MTQwZGVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaTJjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL2kyYy5jCkBAIC0yNTYsNTcgKzI1Niw4IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQUIzNTUwX0NPUkUKLXN0YXRpYyBzdHJ1Y3QgYWJ4NTAwX2luaXRfc2V0dGluZ3MgYWIzNTUwX2luaXRfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5iYW5rID0gMCwKLQkJLnJlZyA9IEFCMzU1MF9JTVIxLAotCQkuc2V0dGluZyA9IDB4ZmYKLQl9LAotCXsKLQkJLmJhbmsgPSAwLAotCQkucmVnID0gQUIzNTUwX0lNUjIsCi0JCS5zZXR0aW5nID0gMHhmZgotCX0sCi0JewotCQkuYmFuayA9IDAsCi0JCS5yZWcgPSBBQjM1NTBfSU1SMywKLQkJLnNldHRpbmcgPSAweGZmCi0JfSwKLQl7Ci0JCS5iYW5rID0gMCwKLQkJLnJlZyA9IEFCMzU1MF9JTVI0LAotCQkuc2V0dGluZyA9IDB4ZmYKLQl9LAotCXsKLQkJLmJhbmsgPSAwLAotCQkucmVnID0gQUIzNTUwX0lNUjUsCi0JCS8qIFRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSBub3QgdXNlZCAqLwotCQkuc2V0dGluZyA9IDB4M2YKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSBhYjM1NTBfcGxmX2RhdGEgPSB7Ci0JLmlycSA9IHsKLQkJLmJhc2UgPSBJUlFfQUIzNTUwX0JBU0UsCi0JCS5jb3VudCA9IChJUlFfQUIzNTUwX0VORCAtIElSUV9BQjM1NTBfQkFTRSArIDEpLAotCX0sCi0JLmRldl9kYXRhID0gewotCX0sCi0JLmluaXRfc2V0dGluZ3MgPSBhYjM1NTBfaW5pdF9zZXR0aW5ncywKLQkuaW5pdF9zZXR0aW5nc19zeiA9IEFSUkFZX1NJWkUoYWIzNTUwX2luaXRfc2V0dGluZ3MpLAotfTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYnVzMF9pMmNfYm9hcmRfaW5mb1tdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0FCMzU1MF9DT1JFKQotCXsKLQkJLnR5cGUgPSAiYWIzNTUwIiwKLQkJLmFkZHIgPSAweDRBLAotCQkuaXJxID0gSVJRX1UzMDBfSVJRMF9FWFQsCi0JCS5wbGF0Zm9ybV9kYXRhID0gJmFiMzU1MF9wbGZfZGF0YSwKLQl9LAotI2VsaWYgZGVmaW5lZChDT05GSUdfQUIzMTAwX0NPUkUpCisjaWZkZWYgQ09ORklHX0FCMzEwMF9DT1JFCiAJewogCQkudHlwZSA9ICJhYjMxMDAiLAogCQkuYWRkciA9IDB4NDgsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggZGY3MTU3MC4uOGFlOGU0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTAsNyArMTAsNyBAQAogICovCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0JLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJLyogSWYgd2UgbW92ZSB0aGUgYWRkcmVzcyB1c2luZyBNTVUsIHVzZSB0aGlzLiAqLwogCWxkcglccnAsCSAgPSBVMzAwX1NMT1dfUEVSX1BIWVNfQkFTRSBAIE1NVSBvZmYsIHBoeXNpY2FsIGFkZHJlc3MKIAlsZHIJXHJ2LAkgID0gVTMwMF9TTE9XX1BFUl9WSVJUX0JBU0UgQCBNTVUgb24sIHZpcnR1YWwgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9ncGlvLXUzMDAuaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby11MzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyYjIwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby11MzAwLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBTVC1Fcmljc3NvbiBBQgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBHUElPIGJsb2NrIHJlc2dpc3RlciBkZWZpbml0aW9ucyBhbmQgaW5saW5lIG1hY3JvcyBmb3IKKyAqIFUzMDAgR1BJTyBDT0ggOTAxIDMzNSBvciBDT0ggOTAxIDU3MS8zCisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKi8KKworI2lmbmRlZiBfX01BQ0hfVTMwMF9HUElPX1UzMDBfSAorI2RlZmluZSBfX01BQ0hfVTMwMF9HUElPX1UzMDBfSAorCisvKgorICogSW5kaXZpZHVhbCBwaW4gYXNzaWdubWVudHMgZm9yIHRoZSBCMjYvUzI2LiBOb3RpY2UgdGhhdCB0aGUKKyAqIGFjdHVhbCB1c2FnZSBvZiB0aGVzZSBwaW5zIGRlcGVuZHMgb24gdGhlIFBBRCBNVVggc2V0dGluZ3MsIHRoYXQKKyAqIGlzIHdoeSB0aGUgc2FtZSBudW1iZXIgY2FuIHBvdGVudGlhbGx5IGFwcGVhciBzZXZlcmFsIHRpbWVzLgorICogSW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24gZWFjaCBwaW4gaXMgb25seSB1c2VkIGZvciBvbmUgcHVycG9zZS4KKyAqIFRoZXNlIHdlcmUgZGV0ZXJtaW5lZCBieSBpbnNwZWN0aW5nIHRoZSBCMjYvUzI2IHNjaGVtYXRpYzoKKyAqIDIvMTkxMS1ST0EgMTI4IDE2MDMKKyAqLworI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMyWAorI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfUlgJCTAKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1RYCQkxCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzAyCQkyICAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wMwkJMyAgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fU0xFRVAJCTQKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fUkVHX0VOCTUKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDYJCTYgIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA3CQk3ICAvKiBVbnJvdXRlZCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA4CQk4ICAvKiBTZXJ2aWNlIHBvaW50IFNQMjMyMSAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wOQkJOSAgLyogU2VydmljZSBwb2ludCBTUDIzMjIgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9QSEZTRU5TRQkJMTAgLyogSGVhZHBob25lIGphY2sgc2Vuc2luZyAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DTEtSRVQJMTEgLyogQ2xvY2sgcmV0dXJuIGZyb20gTU1DL1NEIGNhcmQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0QJCTEyIC8qIE1NQyBDYXJkIGluc2VydGlvbiBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9GTElQU0VOU0UJCTEzIC8qIE1lY2hhbmljYWwgZmxpcCBzZW5zaW5nICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE0CQkxNCAvKiBEU1AgSlRBRyBQb3J0IFJUQ0sgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTUJCTE1IC8qIFVucm91dGVkICovCisKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTYJCTE2IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE3CQkxNyAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOAkJMTggLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTkJCTE5IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIwCQkyMCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMQkJMjEgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjIJCTIyIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIzCQkyMyAvKiBVbnJvdXRlZCAqLworI2VuZGlmCisKKy8qCisgKiBJbmRpdmlkdWFsIHBpbiBhc3NpZ25tZW50cyBmb3IgdGhlIEIzMzAvUzMzMCBhbmQgQjM2NS9TMzY1LgorICogTm90aWNlIHRoYXQgdGhlIGFjdHVhbCB1c2FnZSBvZiB0aGVzZSBwaW5zIGRlcGVuZHMgb24gdGhlCisgKiBQQUQgTVVYIHNldHRpbmdzLCB0aGF0IGlzIHdoeSB0aGUgc2FtZSBudW1iZXIgY2FuIHBvdGVudGlhbGx5CisgKiBhcHBlYXIgc2V2ZXJhbCB0aW1lcy4gSW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24gZWFjaCBwaW4gaXMgb25seQorICogdXNlZCBmb3Igb25lIHB1cnBvc2UuIFRoZXNlIHdlcmUgZGV0ZXJtaW5lZCBieSBpbnNwZWN0aW5nIHRoZQorICogUzM2NSBzY2hlbWF0aWMuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzApIHx8IGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzM2NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzMzNSkKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1JYCQkwCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9UWAkJMQorI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfQ1RTCQkyCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9SVFMJCTMKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fTUFJTl9TVEFOREJZCTQgLyogQ2FtZXJhIE1BSU4gc3RhbmRieSAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNQkJNSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX01TX0NECQk2IC8qIE1lbW9yeSBTdGljayBDYXJkIGluc2VydGlvbiAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNwkJNyAvKiBUZXN0IHBvaW50IFRQMjQzMCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA4CQk4IC8qIFRlc3QgcG9pbnQgVFAyNDM3ICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA5CQk5IC8qIFRlc3QgcG9pbnQgVFAyNDMxICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzEwCQkxMCAvKiBUZXN0IHBvaW50IFRQMjQzMiAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DTEtSRVQJMTEgLyogQ2xvY2sgcmV0dXJuIGZyb20gTU1DL1NEIGNhcmQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9NTUNfQ0QJCTEyIC8qIE1NQyBDYXJkIGluc2VydGlvbiBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9DQU1fU1VCX1NUQU5EQlkJMTMgLyogQ2FtZXJhIFNVQiBzdGFuZGJ5ICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE0CQkxNCAvKiBUZXN0IHBvaW50IFRQMjQzNiAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNQkJMTUgLyogVW5yb3V0ZWQgKi8KKworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNgkJMTYgLyogVGVzdCBwb2ludCBUUDI0MzggKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9QSEZTRU5TRQkJMTcgLyogSGVhZHBob25lIGphY2sgc2Vuc2luZyAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOAkJMTggLyogVGVzdCBwb2ludCBUUDI0MzkgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTkJCTE5IC8qIFJvdXRlZCBzb21ld2hlcmUgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjAJCTIwIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIxCQkyMSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMgkJMjIgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjMJCTIzIC8qIFVucm91dGVkICovCisKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjQJCTI0IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI1CQkyNSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yNgkJMjYgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjcJCTI3IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI4CQkyOCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yOQkJMjkgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzAJCTMwIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMxCQkzMSAvKiBVbnJvdXRlZCAqLworCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMyCQkzMiAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zMwkJMzMgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzQJCTM0IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM1CQkzNSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zNgkJMzYgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzcJCTM3IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM4CQkzOCAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zOQkJMzkgLyogVW5yb3V0ZWQgKi8KKworI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKKworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MAkJNDAgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDEJCTQxIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQyCQk0MiAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MwkJNDMgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDQJCTQ0IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ1CQk0NSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80NgkJNDYgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDcJCTQ3IC8qIFVucm91dGVkICovCisKKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDgJCTQ4IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ5CQk0OSAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MAkJNTAgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTEJCTUxIC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzUyCQk1MiAvKiBVbnJvdXRlZCAqLworI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MwkJNTMgLyogVW5yb3V0ZWQgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTQJCTU0IC8qIFVucm91dGVkICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzU1CQk1NSAvKiBVbnJvdXRlZCAqLworI2VuZGlmCisKKyNlbmRpZgorCisvKioKKyAqIGVudW0gdTMwMF9ncGlvX3ZhcmlhbnQgLSB0aGUgdHlwZSBvZiBVMzAwIEdQSU8gZW1wbG95ZWQKKyAqLworZW51bSB1MzAwX2dwaW9fdmFyaWFudCB7CisJVTMwMF9HUElPX0NPSDkwMTMzNSwKKwlVMzAwX0dQSU9fQ09IOTAxNTcxXzNfQlMzMzUsCisJVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzY1LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdTMwMF9ncGlvX3BsYXRmb3JtIC0gVTMwMCBHUElPIHBsYXRmb3JtIGRhdGEKKyAqIEB2YXJpYW50OiBJUCBibG9jayB2YXJpYW50CisgKiBAcG9ydHM6IG51bWJlciBvZiBHUElPIGJsb2NrIHBvcnRzCisgKiBAZ3Bpb19iYXNlOiBmaXJzdCBHUElPIG51bWJlciBmb3IgdGhpcyBibG9jayAodXNlIGEgZnJlZSByYW5nZSkKKyAqIEBncGlvX2lycV9iYXNlOiBmaXJzdCBHUElPIElSUSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKHVzZSBhIGZyZWUgcmFuZ2UpCisgKi8KK3N0cnVjdCB1MzAwX2dwaW9fcGxhdGZvcm0geworCWVudW0gdTMwMF9ncGlvX3ZhcmlhbnQgdmFyaWFudDsKKwl1OCBwb3J0czsKKwlpbnQgZ3Bpb19iYXNlOworCWludCBncGlvX2lycV9iYXNlOworfTsKKworI2VuZGlmIC8qIF9fTUFDSF9VMzAwX0dQSU9fVTMwMF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGQ1YTcxYWIuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDI5NCArMSBAQAotLyoKLSAqCi0gKiBhcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2dwaW8uaAotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTVC1Fcmljc3NvbiBBQgotICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCi0gKiBHUElPIGJsb2NrIHJlc2dpc3RlciBkZWZpbml0aW9ucyBhbmQgaW5saW5lIG1hY3JvcyBmb3IKLSAqIFUzMDAgR1BJTyBDT0ggOTAxIDMzNSBvciBDT0ggOTAxIDU3MS8zCi0gKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+Ci0gKi8KLQotI2lmbmRlZiBfX01BQ0hfVTMwMF9HUElPX0gKLSNkZWZpbmUgX19NQUNIX1UzMDBfR1BJT19ICi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLS8qIFN3aXRjaCB0eXBlIGRlcGVuZGluZyBvbiBwbGF0Zm9ybS9jaGlwIHZhcmlhbnQgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMyWCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzMwKQotI2RlZmluZSBVMzAwX0NPSDkwMTMzNQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzY1KSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzUpCi0jZGVmaW5lIFUzMDBfQ09IOTAxNTcxXzMKLSNlbmRpZgotCi0vKiBHZXQgYmFzZSBhZGRyZXNzIGZvciByZWdzIGhlcmUgKi8KLSNpbmNsdWRlICJ1MzAwLXJlZ3MuaCIKLS8qIElSUSBudW1iZXJzICovCi0jaW5jbHVkZSAiaXJxcy5oIgotCi0vKgotICogVGhpcyBpcyB0aGUgR1BJTyBibG9jayBkZWZpbml0aW9ucy4gR1BJTyAoR2VuZXJhbCBQdXJwb3NlIEkvTykgY2FuIGJlCi0gKiB1c2VkIGZvciBhbnl0aGluZywgYW5kIG9mdGVuIGlzLiBUaGUgZXZlbnQvZW5hYmxlIGV0YyBmaWd1cmVzIGFyZSBmb3IKLSAqIHRoZSBsb3dlcm1vc3QgcGluIChwaW4gMCBvbiBlYWNoIHBvcnQpLCBzaGlmdCB0aGlzIGxlZnQgdG8gbWF0Y2ggeW91cgotICogcGluIGlmIHlvdSdyZSBnb25uYSB1c2UgdGhlc2UgdmFsdWVzLgotICovCi0jaWZkZWYgVTMwMF9DT0g5MDEzMzUKLSNkZWZpbmUgVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcJCQkJKDB4MUMpCi0vKiBQb3J0IFggUGluIERhdGEgUmVnaXN0ZXIgMzJiaXQsIHRoaXMgaXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBESVIJCQkJKDB4MDApCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBET1IJCQkJKDB4MDApCi0vKiBQb3J0IFggUGluIENvbmZpZyBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1IJCQkJCSgweDA0KQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfQUxMX1BJTlNfTU9ERV9NQVNLCQkoMHgwMDAwRkZGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSwkJCSgweDAwMDAwMDAzVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9TSElGVAkJCSgweDAwMDAwMDAyVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9JTlBVVAkJCSgweDAwMDAwMDAwVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfUFVTSF9QVUxMCSgweDAwMDAwMDAxVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9EUkFJTgkoMHgwMDAwMDAwMlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fU09VUkNFCSgweDAwMDAwMDAzVUwpCi0vKiBQb3J0IFggSW50ZXJydXB0IEV2ZW50IFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFVgkJCQkJKDB4MDgpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFVl9BTExfSVJRX0VWRU5UX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFVl9JUlFfRVZFTlQJCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVOCQkJCQkoMHgwQykKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUVOX0FMTF9JUlFfRU5BQkxFX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFTl9JUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDFVTCkKLS8qIFBvcnQgWCBJbnRlcnJ1cHQgRm9yY2UgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYSUZSCQkJCQkoMHgxMCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUZSX0FMTF9JUlFfRk9SQ0VfTUFTSwkJKDB4MDAwMDAwRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUZSX0lSUV9GT1JDRQkJCSgweDAwMDAwMDAxVUwpCi0vKiBQb3J0IFggSW50ZXJydXB0IENvbmZpZyBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1IJCQkJCSgweDE0KQotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfQUxMX0lSUV9DT05GSUdfTUFTSwkJKDB4MDAwMDAwRkZVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfTUFTSwkJCSgweDAwMDAwMDAxVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX0ZBTExJTkdfRURHRQkJKDB4MDAwMDAwMDBVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfUklTSU5HX0VER0UJCSgweDAwMDAwMDAxVUwpCi0vKiBQb3J0IFggUHVsbC11cCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYUEVSCQkJCQkoMHgxOCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUEVSX0FMTF9QVUxMX1VQX0RJU0FCTEVfTUFTSwkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQRVJfUFVMTF9VUF9ESVNBQkxFCQkJKDB4MDAwMDAwMDFVTCkKLS8qIENvbnRyb2wgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX0NSCQkJCQkoMHg1NCkKLSNkZWZpbmUgVTMwMF9HUElPX0NSX0JMT0NLX0NMT0NLX0VOQUJMRQkJCSgweDAwMDAwMDAxVUwpCi0vKiB0aHJlZSBwb3J0cyBvZiA4IGJpdHMgZWFjaCA9IEdQSU8gcGlucyAwLi4yMyAqLwotI2RlZmluZSBVMzAwX0dQSU9fTlVNX1BPUlRTIDMKLSNkZWZpbmUgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgOAotI2RlZmluZSBVMzAwX0dQSU9fTUFYCShVMzAwX0dQSU9fUElOU19QRVJfUE9SVCAqIFUzMDBfR1BJT19OVU1fUE9SVFMgLSAxKQotI2VuZGlmCi0KLSNpZmRlZiBVMzAwX0NPSDkwMTU3MV8zCi0vKgotICogQ29udHJvbCBSZWdpc3RlciAzMmJpdCAoUi9XKQotICogYml0IDE1LTkgKG1hc2sgMHgwMDAwRkUwMCkgY29udGFpbnMgdGhlIG51bWJlciBvZiBjb3Jlcy4gOCpjb3JlcwotICogZ2l2ZXMgdGhlIG51bWJlciBvZiBHUElPIHBpbnMuCi0gKiBiaXQgOC0yICAobWFzayAweDAwMDAwMUZDKSBjb250YWlucyB0aGUgY29yZSB2ZXJzaW9uIElELgotICovCi0jZGVmaW5lIFUzMDBfR1BJT19DUgkJCQkJKDB4MDApCi0jZGVmaW5lIFUzMDBfR1BJT19DUl9TWU5DX1NFTF9FTkFCTEUJCQkoMHgwMDAwMDAwMlVMKQotI2RlZmluZSBVMzAwX0dQSU9fQ1JfQkxPQ0tfQ0xLUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDFVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcJCQkJKDB4MzApCi0vKiBQb3J0IFggUGluIERhdGEgSU5QVVQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYUERJUgkJCQkoMHgwNCkKLS8qIFBvcnQgWCBQaW4gRGF0YSBPVVRQVVQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYUERPUgkJCQkoMHgwOCkKLS8qIFBvcnQgWCBQaW4gQ29uZmlnIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUgkJCQkJKDB4MEMpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9BTExfUElOU19NT0RFX01BU0sJCSgweDAwMDBGRkZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLCQkJKDB4MDAwMDAwMDNVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX1NISUZUCQkJKDB4MDAwMDAwMDJVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX0lOUFVUCQkJKDB4MDAwMDAwMDBVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwJKDB4MDAwMDAwMDFVTCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9PUEVOX0RSQUlOCSgweDAwMDAwMDAyVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9TT1VSQ0UJKDB4MDAwMDAwMDNVTCkKLS8qIFBvcnQgWCBQdWxsLXVwIEVuYWJsZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhQRVIJCQkJCSgweDEwKQotI2RlZmluZSBVMzAwX0dQSU9fUFhQRVJfQUxMX1BVTExfVVBfRElTQUJMRV9NQVNLCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWFBFUl9QVUxMX1VQX0RJU0FCTEUJCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVYJCQkJCSgweDE0KQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVZfQUxMX0lSUV9FVkVOVF9NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRVZfSVJRX0VWRU5UCQkJKDB4MDAwMDAwMDFVTCkKLS8qIFBvcnQgWCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFTgkJCQkJKDB4MTgpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElFTl9BTExfSVJRX0VOQUJMRV9NQVNLCQkoMHgwMDAwMDBGRlVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJRU5fSVJRX0VOQUJMRQkJCSgweDAwMDAwMDAxVUwpCi0vKiBQb3J0IFggSW50ZXJydXB0IEZvcmNlIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUgkJCQkJKDB4MUMpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUl9BTExfSVJRX0ZPUkNFX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElGUl9JUlFfRk9SQ0UJCQkoMHgwMDAwMDAwMVVMKQotLyogUG9ydCBYIEludGVycnVwdCBDb25maWcgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSCQkJCQkoMHgyMCkKLSNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0FMTF9JUlFfQ09ORklHX01BU0sJCSgweDAwMDAwMEZGVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX01BU0sJCQkoMHgwMDAwMDAwMVVMKQotI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfSVJRX0NPTkZJR19GQUxMSU5HX0VER0UJCSgweDAwMDAwMDAwVUwpCi0jZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX1JJU0lOR19FREdFCQkoMHgwMDAwMDAwMVVMKQotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzMzUKLS8qIHNldmVuIHBvcnRzIG9mIDggYml0cyBlYWNoID0gR1BJTyBwaW5zIDAuLjU1ICovCi0jZGVmaW5lIFUzMDBfR1BJT19OVU1fUE9SVFMgNwotI2Vsc2UKLS8qIGZpdmUgcG9ydHMgb2YgOCBiaXRzIGVhY2ggPSBHUElPIHBpbnMgMC4uMzkgKi8KLSNkZWZpbmUgVTMwMF9HUElPX05VTV9QT1JUUyA1Ci0jZW5kaWYKLSNkZWZpbmUgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgOAotI2RlZmluZSBVMzAwX0dQSU9fTUFYIChVMzAwX0dQSU9fUElOU19QRVJfUE9SVCAqIFUzMDBfR1BJT19OVU1fUE9SVFMgLSAxKQotI2VuZGlmCi0KLS8qCi0gKiBJbmRpdmlkdWFsIHBpbiBhc3NpZ25tZW50cyBmb3IgdGhlIEIyNi9TMjYuIE5vdGljZSB0aGF0IHRoZQotICogYWN0dWFsIHVzYWdlIG9mIHRoZXNlIHBpbnMgZGVwZW5kcyBvbiB0aGUgUEFEIE1VWCBzZXR0aW5ncywgdGhhdAotICogaXMgd2h5IHRoZSBzYW1lIG51bWJlciBjYW4gcG90ZW50aWFsbHkgYXBwZWFyIHNldmVyYWwgdGltZXMuCi0gKiBJbiB0aGUgcmVmZXJlbmNlIGRlc2lnbiBlYWNoIHBpbiBpcyBvbmx5IHVzZWQgZm9yIG9uZSBwdXJwb3NlLgotICogVGhlc2Ugd2VyZSBkZXRlcm1pbmVkIGJ5IGluc3BlY3RpbmcgdGhlIEIyNi9TMjYgc2NoZW1hdGljOgotICogMi8xOTExLVJPQSAxMjggMTYwMwotICovCi0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzJYCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9SWAkJMAotI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfVFgJCTEKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDIJCTIgIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzAzCQkzICAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0NBTV9TTEVFUAkJNAotI2RlZmluZSBVMzAwX0dQSU9fUElOX0NBTV9SRUdfRU4JNQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8wNgkJNiAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDcJCTcgIC8qIFVucm91dGVkICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDgJCTggIC8qIFNlcnZpY2UgcG9pbnQgU1AyMzIxICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA5CQk5ICAvKiBTZXJ2aWNlIHBvaW50IFNQMjMyMiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX1BIRlNFTlNFCQkxMCAvKiBIZWFkcGhvbmUgamFjayBzZW5zaW5nICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fTU1DX0NMS1JFVAkxMSAvKiBDbG9jayByZXR1cm4gZnJvbSBNTUMvU0QgY2FyZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DRAkJMTIgLyogTU1DIENhcmQgaW5zZXJ0aW9uIGRldGVjdGlvbiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0ZMSVBTRU5TRQkJMTMgLyogTWVjaGFuaWNhbCBmbGlwIHNlbnNpbmcgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTQJCTE0IC8qIERTUCBKVEFHIFBvcnQgUlRDSyAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNQkJMTUgLyogVW5yb3V0ZWQgKi8KLQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xNgkJMTYgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTcJCTE3IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE4CQkxOCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOQkJMTkgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjAJCTIwIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIxCQkyMSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMgkJMjIgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjMJCTIzIC8qIFVucm91dGVkICovCi0jZW5kaWYKLQotLyoKLSAqIEluZGl2aWR1YWwgcGluIGFzc2lnbm1lbnRzIGZvciB0aGUgQjMzMC9TMzMwIGFuZCBCMzY1L1MzNjUuCi0gKiBOb3RpY2UgdGhhdCB0aGUgYWN0dWFsIHVzYWdlIG9mIHRoZXNlIHBpbnMgZGVwZW5kcyBvbiB0aGUKLSAqIFBBRCBNVVggc2V0dGluZ3MsIHRoYXQgaXMgd2h5IHRoZSBzYW1lIG51bWJlciBjYW4gcG90ZW50aWFsbHkKLSAqIGFwcGVhciBzZXZlcmFsIHRpbWVzLiBJbiB0aGUgcmVmZXJlbmNlIGRlc2lnbiBlYWNoIHBpbiBpcyBvbmx5Ci0gKiB1c2VkIGZvciBvbmUgcHVycG9zZS4gVGhlc2Ugd2VyZSBkZXRlcm1pbmVkIGJ5IGluc3BlY3RpbmcgdGhlCi0gKiBTMzY1IHNjaGVtYXRpYy4KLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzMzMCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzY1KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTUFDSF9VMzAwX0JTMzM1KQotI2RlZmluZSBVMzAwX0dQSU9fUElOX1VBUlRfUlgJCTAKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1RYCQkxCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fVUFSVF9DVFMJCTIKLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9VQVJUX1JUUwkJMwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0NBTV9NQUlOX1NUQU5EQlkJNCAvKiBDYW1lcmEgTUFJTiBzdGFuZGJ5ICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA1CQk1IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fTVNfQ0QJCTYgLyogTWVtb3J5IFN0aWNrIENhcmQgaW5zZXJ0aW9uICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzA3CQk3IC8qIFRlc3QgcG9pbnQgVFAyNDMwICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDgJCTggLyogVGVzdCBwb2ludCBUUDI0MzcgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMDkJCTkgLyogVGVzdCBwb2ludCBUUDI0MzEgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTAJCTEwIC8qIFRlc3QgcG9pbnQgVFAyNDMyICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fTU1DX0NMS1JFVAkxMSAvKiBDbG9jayByZXR1cm4gZnJvbSBNTUMvU0QgY2FyZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX01NQ19DRAkJMTIgLyogTU1DIENhcmQgaW5zZXJ0aW9uIGRldGVjdGlvbiAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0NBTV9TVUJfU1RBTkRCWQkxMyAvKiBDYW1lcmEgU1VCIHN0YW5kYnkgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMTQJCTE0IC8qIFRlc3QgcG9pbnQgVFAyNDM2ICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE1CQkxNSAvKiBVbnJvdXRlZCAqLwotCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE2CQkxNiAvKiBUZXN0IHBvaW50IFRQMjQzOCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX1BIRlNFTlNFCQkxNyAvKiBIZWFkcGhvbmUgamFjayBzZW5zaW5nICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzE4CQkxOCAvKiBUZXN0IHBvaW50IFRQMjQzOSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8xOQkJMTkgLyogUm91dGVkIHNvbWV3aGVyZSAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMAkJMjAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjEJCTIxIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzIyCQkyMiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yMwkJMjMgLyogVW5yb3V0ZWQgKi8KLQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yNAkJMjQgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjUJCTI1IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI2CQkyNiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8yNwkJMjcgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMjgJCTI4IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzI5CQkyOSAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zMAkJMzAgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzEJCTMxIC8qIFVucm91dGVkICovCi0KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzIJCTMyIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzMzCQkzMyAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zNAkJMzQgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzUJCTM1IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM2CQkzNiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU8zNwkJMzcgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPMzgJCTM4IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzM5CQkzOSAvKiBVbnJvdXRlZCAqLwotCi0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzMzNQotCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQwCQk0MCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80MQkJNDEgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDIJCTQyIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQzCQk0MyAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80NAkJNDQgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDUJCTQ1IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzQ2CQk0NiAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80NwkJNDcgLyogVW5yb3V0ZWQgKi8KLQotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU80OAkJNDggLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNDkJCTQ5IC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzUwCQk1MCAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81MQkJNTEgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTIJCTUyIC8qIFVucm91dGVkICovCi0jZGVmaW5lIFUzMDBfR1BJT19QSU5fR1BJTzUzCQk1MyAvKiBVbnJvdXRlZCAqLwotI2RlZmluZSBVMzAwX0dQSU9fUElOX0dQSU81NAkJNTQgLyogVW5yb3V0ZWQgKi8KLSNkZWZpbmUgVTMwMF9HUElPX1BJTl9HUElPNTUJCTU1IC8qIFVucm91dGVkICovCi0jZW5kaWYKLQotI2VuZGlmCi0KLS8qIHRyYW5zbGF0ZXMgYSBwaW4gbnVtYmVyIHRvIGEgcG9ydCBudW1iZXIgKi8KLSNkZWZpbmUgUElOX1RPX1BPUlQodmFsKSAodmFsID4+IDMpCi0KLS8qIFRoZXNlIGNhbiBiZSBmb3VuZCBpbiBhcmNoL2FybS9tYWNoLXUzMDAvZ3Bpby5jICovCi1leHRlcm4gaW50IGdwaW9faXNfdmFsaWQoaW50IG51bWJlcik7Ci1leHRlcm4gaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Ci1leHRlcm4gdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pOwotZXh0ZXJuIGludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgZ3Bpb19yZWdpc3Rlcl9jYWxsYmFjayh1bnNpZ25lZCBncGlvLAotCQkJCSAgaW50ICgqZnVuYykodm9pZCAqYXJnKSwKLQkJCQkgIHZvaWQgKik7Ci1leHRlcm4gaW50IGdwaW9fdW5yZWdpc3Rlcl9jYWxsYmFjayh1bnNpZ25lZCBncGlvKTsKLWV4dGVybiB2b2lkIGVuYWJsZV9pcnFfb25fZ3Bpb19waW4odW5zaWduZWQgZ3BpbywgaW50IGVkZ2UpOwotZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnFfb25fZ3Bpb19waW4odW5zaWduZWQgZ3Bpbyk7Ci1leHRlcm4gdm9pZCBncGlvX3B1bGx1cCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKLWV4dGVybiB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAgZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAgZ3Bpb19zZXRfdmFsdWUKLQotLyogd3JhcHBlcnMgdG8gc2xlZXAtZW5hYmxlIHRoZSBwcmV2aW91cyB0d28gZnVuY3Rpb25zICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIFBJTl9UT19QT1JUKGdwaW8pICsgSVJRX1UzMDBfR1BJT19QT1JUMDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpcnEpCi17Ci0JLyoKLQkgKiBGSVhNRTogVGhpcyBpcyBubyAxLTEgbWFwcGluZyBhdCBhbGwsIGl0IHBvaW50cyB0byB0aGUKLQkgKiB3aG9sZSBibG9jayBvZiA4IHBpbnMuCi0JICovCi0JcmV0dXJuIChpcnEgLSBJUlFfVTMwMF9HUElPX1BPUlQwKSA8PCAzOwotfQotCi0jZW5kaWYKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvaXJxcy5oCmluZGV4IDA5YjFiMjhmLi5kYjNmYmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtNzIsNyArNzIsNyBAQAogCiAvKiBEQjMxNTAgYW5kIERCMzIwMCBoYXZlIG9ubHkgNDUgSVJRcyAqLwogI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfVTMwMF9CUzJYKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX1UzMDBfQlMzMzApCi0jZGVmaW5lIFUzMDBfTlJfSVJRUwkJCTQ1CisjZGVmaW5lIFUzMDBfVklDX0lSUVNfRU5ECQk0NQogI2VuZGlmCiAKIC8qIFRoZSBEQjMzNTAtc3BlY2lmaWMgaW50ZXJydXB0IGxpbmVzICovCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIElSUV9VMzAwX0dQSU9fUE9SVDQJCTUzCiAjZGVmaW5lIElSUV9VMzAwX0dQSU9fUE9SVDUJCTU0CiAjZGVmaW5lIElSUV9VMzAwX0dQSU9fUE9SVDYJCTU1Ci0jZGVmaW5lIFUzMDBfTlJfSVJRUwkJCTU2CisjZGVmaW5lIFUzMDBfVklDX0lSUVNfRU5ECQk1NgogI2VuZGlmCiAKIC8qIFRoZSBEQjMyMTAtc3BlY2lmaWMgaW50ZXJydXB0IGxpbmVzICovCkBAIC0xMDYsMTYgKzEwNiwxNyBAQAogI2RlZmluZSBJUlFfVTMwMF9ORklGCQkJNDUKICNkZWZpbmUgSVJRX1UzMDBfTkZJRjIJCQk0NgogI2RlZmluZSBJUlFfVTMwMF9TWVNDT05fUExMX0xPQ0sJNDcKLSNkZWZpbmUgVTMwMF9OUl9JUlFTCQkJNDgKKyNkZWZpbmUgVTMwMF9WSUNfSVJRU19FTkQJCTQ4CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19BQjM1NTBfQ09SRQotI2RlZmluZSBJUlFfQUIzNTUwX0JBU0UJCQkoVTMwMF9OUl9JUlFTKQotI2RlZmluZSBJUlFfQUIzNTUwX0VORAkJCShJUlFfQUIzNTUwX0JBU0UgKyAzNykKLQotI2RlZmluZSBOUl9JUlFTCQkJCShJUlFfQUIzNTUwX0VORCArIDEpCisvKiBNYXhpbXVtIDgqNyBHUElPIGxpbmVzICovCisjaWZkZWYgQ09ORklHX0dQSU9fVTMwMAorI2RlZmluZSBJUlFfVTMwMF9HUElPX0JBU0UJCShVMzAwX1ZJQ19JUlFTX0VORCkKKyNkZWZpbmUgSVJRX1UzMDBfR1BJT19FTkQJCShJUlFfVTMwMF9HUElPX0JBU0UgKyA1NikKICNlbHNlCi0jZGVmaW5lIE5SX0lSUVMgVTMwMF9OUl9JUlFTCisjZGVmaW5lIElSUV9VMzAwX0dQSU9fRU5ECQkoVTMwMF9WSUNfSVJRU19FTkQpCiAjZW5kaWYKIAorI2RlZmluZSBOUl9JUlFTCQkJCShJUlFfVTMwMF9HUElPX0VORCkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCA4ODhlMmUzLi5jODA4ZjM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTEzLDMwICsxMyw3IEBACiAjaWZuZGVmIF9fTUFDSF9NRU1PUllfSAogI2RlZmluZSBfX01BQ0hfTUVNT1JZX0gKIAotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfRFVBTF9SQU0KLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDQ4MDAwMDAwKQotI2RlZmluZSBCT09UX1BBUkFNU19PRkZTRVQJKFBIWVNfT0ZGU0VUICsgMHgxMDApCi0KLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwXzJNQl9BTElHTk1FTlRfRklYCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQgKDB4MjgwMDAwMDAgKyBcCi0JICAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgLSBcCi0JICAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgJiAxKSkqMTAyNCoxMDI0KQotI2Vsc2UKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVCAoMHgyODAwMDAwMCArIFwKLQkgICAgIChDT05GSUdfTUFDSF9VMzAwX0FDQ0VTU19NRU1fU0laRSArCVwKLQkgICAgIChDT05GSUdfTUFDSF9VMzAwX0FDQ0VTU19NRU1fU0laRSAmIDEpKSoxMDI0KjEwMjQpCi0jZW5kaWYKLSNkZWZpbmUgQk9PVF9QQVJBTVNfT0ZGU0VUICgweDI4MDAwMDAwICsgXAotCSAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgKwkJXAotCSAgICAoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgJiAxKSkqMTAyNCoxMDI0ICsgMHgxMDApCi0jZW5kaWYKLQotLyoKLSAqIFdlIGVuYWJsZSBhIHJlYWwgYmlnIERNQSBidWZmZXIgaWYgbmVlZCBiZS4KLSAqLwotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzRNCisjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHg0ODAwMDAwMCkKKyNkZWZpbmUgQk9PVF9QQVJBTVNfT0ZGU0VUCTB4MTAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL21tYy5jIGIvYXJjaC9hcm0vbWFjaC11MzAwL21tYy5jCmluZGV4IGQ1ZTRhOTguLjRkNDgyYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvbW1jLmMKQEAgLTEzLDEyICsxMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG1hY2gvY29oOTAxMzE4Lmg+CiAjaW5jbHVkZSA8bWFjaC9kbWFfY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tdTMwMC5oPgogCiAjaW5jbHVkZSAibW1jLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdTMwMC91MzAwLmMgYi9hcmNoL2FybS9tYWNoLXUzMDAvdTMwMC5jCmluZGV4IDQ4YjNiN2YuLjg5NDIyZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC91MzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11MzAwL3UzMDAuYwpAQCAtMjMsMjEgKzIzLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCi1zdGF0aWMgdm9pZCBfX2luaXQgdTMwMF9yZXNlcnZlKHZvaWQpCi17Ci0JLyoKLQkgKiBVMzAwIC0gVGhpcyBwbGF0Zm9ybSBmYW1pbHkgY2FuIHNoYXJlIHBoeXNpY2FsIG1lbW9yeQotCSAqIGJldHdlZW4gdHdvIEFSTSBjcHVzLCBvbmUgcnVubmluZyBMaW51eCBhbmQgdGhlIG90aGVyCi0JICogcnVubmluZyBhbm90aGVyIE9TLgotCSAqLwotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfU0lOR0xFX1JBTQotI2lmICgoQ09ORklHX01BQ0hfVTMwMF9BQ0NFU1NfTUVNX1NJWkUgJiAxKSA9PSAxKSAmJiBcCi0JQ09ORklHX01BQ0hfVTMwMF8yTUJfQUxJR05NRU5UX0ZJWAotICAgICAgICBtZW1ibG9ja19yZXNlcnZlKFBIWVNfT0ZGU0VULCAweDAwMTAwMDAwKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCB1MzAwX2luaXRfbWFjaGluZSh2b2lkKQogewogCXUzMDBfaW5pdF9kZXZpY2VzKCk7CkBAIC02MSw5ICs0Niw4IEBACiAKIE1BQ0hJTkVfU1RBUlQoVTMwMCwgTUFDSF9VMzAwX1NUUklORykKIAkvKiBNYWludGFpbmVyOiBMaW51cyBXYWxsZWlqIDxsaW51cy53YWxsZWlqQHN0ZXJpY3Nzb24uY29tPiAqLwotCS5ib290X3BhcmFtcwk9IEJPT1RfUEFSQU1TX09GRlNFVCwKKwkuYXRhZ19vZmZzZXQJPSBCT09UX1BBUkFNU19PRkZTRVQsCiAJLm1hcF9pbwkJPSB1MzAwX21hcF9pbywKLQkucmVzZXJ2ZQk9IHUzMDBfcmVzZXJ2ZSwKIAkuaW5pdF9pcnEJPSB1MzAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmdTMwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lCT0gdTMwMF9pbml0X21hY2hpbmUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZQppbmRleCAxNjk0OTE2Li42YmQyZjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUKQEAgLTMsNyArMyw4IEBACiAjCiAKIG9iai15CQkJCTo9IGNsb2NrLm8gY3B1Lm8gZGV2aWNlcy5vIGRldmljZXMtY29tbW9uLm8gXAotCQkJCSAgIGlkLm8gdXNiLm8KKwkJCQkgICBpZC5vIHVzYi5vIHRpbWVyLm8KK29iai0kKENPTkZJR19DQUNIRV9MMlgwKQkrPSBjYWNoZS1sMngwLm8KIG9iai0kKENPTkZJR19VWDUwMF9TT0NfREI1NTAwKQkrPSBjcHUtZGI1NTAwLm8gZG1hLWRiNTUwMC5vCiBvYmotJChDT05GSUdfVVg1MDBfU09DX0RCODUwMCkJKz0gY3B1LWRiODUwMC5vIGRldmljZXMtZGI4NTAwLm8KIG9iai0kKENPTkZJR19NQUNIX1U4NTAwKQkrPSBib2FyZC1tb3A1MDAubyBib2FyZC1tb3A1MDAtc2RpLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcGlucy5jCmluZGV4IGYyNmZkNzYuLjc0YmZjZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXBpbnMuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1waW5zLmMKQEAgLTYsMTAgKzYsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPHBsYXQvcGluY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlICJwaW5zLWRiODUwMC5oIgpAQCAtMTUzLDcgKzE1Myw3IEBACiAJR1BJTzdfVTFfUlRTbgl8IFBJTl9PVVRQVVRfSElHSCwKIH07CiAKLXN0YXRpYyBwaW5fY2ZnX3QgbW9wNTAwX3BpbnNfaHJlZnY2MFtdID0geworc3RhdGljIHBpbl9jZmdfdCBocmVmdjYwX3BpbnNbXSA9IHsKIAkvKiBXTEFOICovCiAJR1BJTzRfR1BJTwkJfCBQSU5fSU5QVVRfUFVMTFVQLC8qIFdMQU5fSVJRICovCiAJR1BJTzg1X0dQSU8JCXwgUElOX09VVFBVVF9MT1csLyogV0xBTl9FTkEgKi8KQEAgLTI3OSwxNCArMjc5LDI2IEBACiB2b2lkIF9faW5pdCBtb3A1MDBfcGluc19pbml0KHZvaWQpCiB7CiAJbm1rX2NvbmZpZ19waW5zKG1vcDUwMF9waW5zX2NvbW1vbiwKLQkJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX2NvbW1vbikpOwotCWlmIChtYWNoaW5lX2lzX2hyZWZ2NjAoKSkKLQkJbm1rX2NvbmZpZ19waW5zKG1vcDUwMF9waW5zX2hyZWZ2NjAsCi0JCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19ocmVmdjYwKSk7Ci0JZWxzZSBpZiAobWFjaGluZV9pc19zbm93YmFsbCgpKQotCQlubWtfY29uZmlnX3BpbnMoc25vd2JhbGxfcGlucywKLQkJCQlBUlJBWV9TSVpFKHNub3diYWxsX3BpbnMpKTsKLQllbHNlCi0JCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc19kZWZhdWx0LAotCQkJCUFSUkFZX1NJWkUobW9wNTAwX3BpbnNfZGVmYXVsdCkpOworCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19jb21tb24pKTsKKworCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc19kZWZhdWx0LAorCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19kZWZhdWx0KSk7Cit9CisKK3ZvaWQgX19pbml0IHNub3diYWxsX3BpbnNfaW5pdCh2b2lkKQoreworCW5ta19jb25maWdfcGlucyhtb3A1MDBfcGluc19jb21tb24sCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9waW5zX2NvbW1vbikpOworCisJbm1rX2NvbmZpZ19waW5zKHNub3diYWxsX3BpbnMsCisJCQlBUlJBWV9TSVpFKHNub3diYWxsX3BpbnMpKTsKK30KKwordm9pZCBfX2luaXQgaHJlZnY2MF9waW5zX2luaXQodm9pZCkKK3sKKwlubWtfY29uZmlnX3BpbnMobW9wNTAwX3BpbnNfY29tbW9uLAorCQkJQVJSQVlfU0laRShtb3A1MDBfcGluc19jb21tb24pKTsKKworCW5ta19jb25maWdfcGlucyhocmVmdjYwX3BpbnMsCisJCQlBUlJBWV9TSVpFKGhyZWZ2NjBfcGlucykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtc2RpLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1zZGkuYwppbmRleCBkMGNiOWU1Li42ODI2ZmFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1zZGkuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1zZGkuYwpAQCAtMjE2LDMwICsyMTYsNDggQEAKIAkvKiBQb1A6ZWQgZU1NQyBvbiB0b3Agb2YgREI4NTAwIHYxLjAgaGFzIHByb2JsZW1zIHdpdGggaGlnaCBzcGVlZCAqLwogCWlmICghY3B1X2lzX3U4NTAwdjEwKCkpCiAJCW1vcDUwMF9zZGkyX2RhdGEuY2FwYWJpbGl0aWVzIHw9IE1NQ19DQVBfTU1DX0hJR0hTUEVFRDsKLQkvKiBzZGkyIG9uIHNub3diYWxsIGlzIGluIEFUTF9CIG1vZGUgZm9yIEZTTUMgKExBTikgKi8KLQlpZiAoIW1hY2hpbmVfaXNfc25vd2JhbGwoKSkKLQkJZGI4NTAwX2FkZF9zZGkyKCZtb3A1MDBfc2RpMl9kYXRhLCBwZXJpcGhpZCk7CisKKwlkYjg1MDBfYWRkX3NkaTIoJm1vcDUwMF9zZGkyX2RhdGEsIHBlcmlwaGlkKTsKIAogCS8qIE9uLWJvYXJkIGVNTUMgKi8KIAlkYjg1MDBfYWRkX3NkaTQoJm1vcDUwMF9zZGk0X2RhdGEsIHBlcmlwaGlkKTsKIAotCWlmIChtYWNoaW5lX2lzX2hyZWZ2NjAoKSB8fCBtYWNoaW5lX2lzX3Nub3diYWxsKCkpIHsKLQkJaWYgKG1hY2hpbmVfaXNfaHJlZnY2MCgpKSB7Ci0JCQltb3A1MDBfc2RpMF9kYXRhLmdwaW9fY2QgPSBIUkVGVjYwX1NETU1DX0NEX0dQSU87Ci0JCQlzZGkwX2VuID0gSFJFRlY2MF9TRE1NQ19FTl9HUElPOwotCQkJc2RpMF92c2VsID0gSFJFRlY2MF9TRE1NQ18xVjhfM1ZfR1BJTzsKLQkJfSBlbHNlIGlmIChtYWNoaW5lX2lzX3Nub3diYWxsKCkpIHsKLQkJCW1vcDUwMF9zZGkwX2RhdGEuZ3Bpb19jZCA9IFNOT1dCQUxMX1NETU1DX0NEX0dQSU87Ci0JCQltb3A1MDBfc2RpMF9kYXRhLmNkX2ludmVydCA9IHRydWU7Ci0JCQlzZGkwX2VuID0gU05PV0JBTExfU0RNTUNfRU5fR1BJTzsKLQkJCXNkaTBfdnNlbCA9IFNOT1dCQUxMX1NETU1DXzFWOF8zVl9HUElPOwotCQl9Ci0JCXNkaTBfY29uZmlndXJlKCk7Ci0JfQotCiAJLyoKIAkgKiBPbiBib2FyZHMgd2l0aCB0aGUgVEMzNTg5MiBHUElPIGV4cGFuZGVyLCBzZGkwIHdpbGwgZmluYWxseQogCSAqIGJlIGFkZGVkIHdoZW4gdGhlIFRDMzU4OTIgaW5pdGlhbGl6ZXMgYW5kIGNhbGxzCiAJICogbW9wNTAwX3NkaV90YzM1ODkyX2luaXQoKSBhYm92ZS4KIAkgKi8KIH0KKwordm9pZCBfX2luaXQgc25vd2JhbGxfc2RpX2luaXQodm9pZCkKK3sKKwl1MzIgcGVyaXBoaWQgPSAweDEwNDgwMTgwOworCisJbW9wNTAwX3NkaTJfZGF0YS5jYXBhYmlsaXRpZXMgfD0gTU1DX0NBUF9NTUNfSElHSFNQRUVEOworCisJLyogT24tYm9hcmQgZU1NQyAqLworCWRiODUwMF9hZGRfc2RpNCgmbW9wNTAwX3NkaTRfZGF0YSwgcGVyaXBoaWQpOworCisJbW9wNTAwX3NkaTBfZGF0YS5ncGlvX2NkID0gU05PV0JBTExfU0RNTUNfQ0RfR1BJTzsKKwltb3A1MDBfc2RpMF9kYXRhLmNkX2ludmVydCA9IHRydWU7CisJc2RpMF9lbiA9IFNOT1dCQUxMX1NETU1DX0VOX0dQSU87CisJc2RpMF92c2VsID0gU05PV0JBTExfU0RNTUNfMVY4XzNWX0dQSU87CisJc2RpMF9jb25maWd1cmUoKTsKK30KKwordm9pZCBfX2luaXQgaHJlZnY2MF9zZGlfaW5pdCh2b2lkKQoreworCXUzMiBwZXJpcGhpZCA9IDB4MTA0ODAxODA7CisKKwltb3A1MDBfc2RpMl9kYXRhLmNhcGFiaWxpdGllcyB8PSBNTUNfQ0FQX01NQ19ISUdIU1BFRUQ7CisKKwlkYjg1MDBfYWRkX3NkaTIoJm1vcDUwMF9zZGkyX2RhdGEsIHBlcmlwaGlkKTsKKworCS8qIE9uLWJvYXJkIGVNTUMgKi8KKwlkYjg1MDBfYWRkX3NkaTQoJm1vcDUwMF9zZGk0X2RhdGEsIHBlcmlwaGlkKTsKKworCW1vcDUwMF9zZGkwX2RhdGEuZ3Bpb19jZCA9IEhSRUZWNjBfU0RNTUNfQ0RfR1BJTzsKKwlzZGkwX2VuID0gSFJFRlY2MF9TRE1NQ19FTl9HUElPOworCXNkaTBfdnNlbCA9IEhSRUZWNjBfU0RNTUNfMVY4XzNWX0dQSU87CisJc2RpMF9jb25maWd1cmUoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXU4NTAwdWliLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC11ODUwMHVpYi5jCmluZGV4IDhjZTQ2YzAuLmZlYjU3NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXU4NTAwdWliLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtdTg1MDB1aWIuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEJvYXJkIGRhdGEgZm9yIHRoZSBVODUwMCBVSUIsIGFsc28ga25vd24gYXMgdGhlIE5ldyBVSUIKICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvdGMzNTg5eC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiYm9hcmQtbW9wNTAwLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYwppbmRleCBjZDU0YWJhLi5iZGQ3YjgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxwbGF0L2kyYy5oPgogI2luY2x1ZGUgPHBsYXQvc3RlX2RtYTQwLmg+CiAjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KQEAgLTYwMywyOCArNjA0LDE0IEBACiB7CiAJaW50IGkyYzBfZGV2czsKIAotCS8qCi0JICogVGhlIEhSRUZ2NjAgYm9hcmQgcmVtb3ZlZCBhIEdQSU8gZXhwYW5kZXIgYW5kIHJvdXRlZAotCSAqIGFsbCB0aGVzZSBHUElPIHBpbnMgdG8gdGhlIGludGVybmFsIEdQSU8gY29udHJvbGxlcgotCSAqIGluc3RlYWQuCi0JICovCi0JaWYgKCFtYWNoaW5lX2lzX3Nub3diYWxsKCkpIHsKLQkJaWYgKG1hY2hpbmVfaXNfaHJlZnY2MCgpKQotCQkJbW9wNTAwX2dwaW9fa2V5c1swXS5ncGlvID0gSFJFRlY2MF9QUk9YX1NFTlNFX0dQSU87Ci0JCWVsc2UKLQkJCW1vcDUwMF9ncGlvX2tleXNbMF0uZ3BpbyA9IEdQSU9fUFJPWF9TRU5TT1I7Ci0JfQorCW1vcDUwMF9ncGlvX2tleXNbMF0uZ3BpbyA9IEdQSU9fUFJPWF9TRU5TT1I7CiAKIAl1ODUwMF9pbml0X2RldmljZXMoKTsKIAogCW1vcDUwMF9waW5zX2luaXQoKTsKIAotCWlmIChtYWNoaW5lX2lzX3Nub3diYWxsKCkpCi0JCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHNub3diYWxsX3BsYXRmb3JtX2RldnMsCi0JCQkJCUFSUkFZX1NJWkUoc25vd2JhbGxfcGxhdGZvcm1fZGV2cykpOwotCWVsc2UKLQkJcGxhdGZvcm1fYWRkX2RldmljZXMobW9wNTAwX3BsYXRmb3JtX2RldnMsCi0JCQkJCUFSUkFZX1NJWkUobW9wNTAwX3BsYXRmb3JtX2RldnMpKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtb3A1MDBfcGxhdGZvcm1fZGV2cywKKwkJCUFSUkFZX1NJWkUobW9wNTAwX3BsYXRmb3JtX2RldnMpKTsKIAogCW1vcDUwMF9pMmNfaW5pdCgpOwogCW1vcDUwMF9zZGlfaW5pdCgpOwpAQCAtNjMyLDggKzYxOSw2NiBAQAogCW1vcDUwMF91YXJ0X2luaXQoKTsKIAogCWkyYzBfZGV2cyA9IEFSUkFZX1NJWkUobW9wNTAwX2kyYzBfZGV2aWNlcyk7Ci0JaWYgKG1hY2hpbmVfaXNfaHJlZnY2MCgpKQotCQlpMmMwX2RldnMgLT0gTlVNX1BSRV9WNjBfSTJDMF9ERVZJQ0VTOworCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbW9wNTAwX2kyYzBfZGV2aWNlcywgaTJjMF9kZXZzKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygyLCBtb3A1MDBfaTJjMl9kZXZpY2VzLAorCQkJCUFSUkFZX1NJWkUobW9wNTAwX2kyYzJfZGV2aWNlcykpOworCisJLyogVGhpcyBib2FyZCBoYXMgZnVsbCByZWd1bGF0b3IgY29uc3RyYWludHMgKi8KKwlyZWd1bGF0b3JfaGFzX2Z1bGxfY29uc3RyYWludHMoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNub3diYWxsX2luaXRfbWFjaGluZSh2b2lkKQoreworCWludCBpMmMwX2RldnM7CisKKwl1ODUwMF9pbml0X2RldmljZXMoKTsKKworCXNub3diYWxsX3BpbnNfaW5pdCgpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoc25vd2JhbGxfcGxhdGZvcm1fZGV2cywKKwkJCUFSUkFZX1NJWkUoc25vd2JhbGxfcGxhdGZvcm1fZGV2cykpOworCisJbW9wNTAwX2kyY19pbml0KCk7CisJc25vd2JhbGxfc2RpX2luaXQoKTsKKwltb3A1MDBfc3BpX2luaXQoKTsKKwltb3A1MDBfdWFydF9pbml0KCk7CisKKwlpMmMwX2RldnMgPSBBUlJBWV9TSVpFKG1vcDUwMF9pMmMwX2RldmljZXMpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG1vcDUwMF9pMmMwX2RldmljZXMsIGkyYzBfZGV2cyk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMiwgbW9wNTAwX2kyYzJfZGV2aWNlcywKKwkJCQlBUlJBWV9TSVpFKG1vcDUwMF9pMmMyX2RldmljZXMpKTsKKworCS8qIFRoaXMgYm9hcmQgaGFzIGZ1bGwgcmVndWxhdG9yIGNvbnN0cmFpbnRzICovCisJcmVndWxhdG9yX2hhc19mdWxsX2NvbnN0cmFpbnRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBocmVmdjYwX2luaXRfbWFjaGluZSh2b2lkKQoreworCWludCBpMmMwX2RldnM7CisKKwkvKgorCSAqIFRoZSBIUkVGdjYwIGJvYXJkIHJlbW92ZWQgYSBHUElPIGV4cGFuZGVyIGFuZCByb3V0ZWQKKwkgKiBhbGwgdGhlc2UgR1BJTyBwaW5zIHRvIHRoZSBpbnRlcm5hbCBHUElPIGNvbnRyb2xsZXIKKwkgKiBpbnN0ZWFkLgorCSAqLworCW1vcDUwMF9ncGlvX2tleXNbMF0uZ3BpbyA9IEhSRUZWNjBfUFJPWF9TRU5TRV9HUElPOworCisJdTg1MDBfaW5pdF9kZXZpY2VzKCk7CisKKwlocmVmdjYwX3BpbnNfaW5pdCgpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMobW9wNTAwX3BsYXRmb3JtX2RldnMsCisJCQlBUlJBWV9TSVpFKG1vcDUwMF9wbGF0Zm9ybV9kZXZzKSk7CisKKwltb3A1MDBfaTJjX2luaXQoKTsKKwltb3A1MDBfc2RpX2luaXQoKTsKKwltb3A1MDBfc3BpX2luaXQoKTsKKwltb3A1MDBfdWFydF9pbml0KCk7CisKKwlpMmMwX2RldnMgPSBBUlJBWV9TSVpFKG1vcDUwMF9pMmMwX2RldmljZXMpOworCisJaTJjMF9kZXZzIC09IE5VTV9QUkVfVjYwX0kyQzBfREVWSUNFUzsKIAogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG1vcDUwMF9pMmMwX2RldmljZXMsIGkyYzBfZGV2cyk7CiAJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMiwgbW9wNTAwX2kyYzJfZGV2aWNlcywKQEAgLTY0NSw3ICs2OTAsNyBAQAogCiBNQUNISU5FX1NUQVJUKFU4NTAwLCAiU1QtRXJpY3Nzb24gTU9QNTAwIHBsYXRmb3JtIikKIAkvKiBNYWludGFpbmVyOiBTcmluaWRoaSBLYXNhZ2FyIDxzcmluaWRoaS5rYXNhZ2FyQHN0ZXJpY3Nzb24uY29tPiAqLwotCS5ib290X3BhcmFtcwk9IDB4MTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdTg1MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHV4NTAwX2luaXRfaXJxLAogCS8qIHdlIHJlLXVzZSBub21hZGlrIHRpbWVyIGhlcmUgKi8KQEAgLTY1NCwxOCArNjk5LDE4IEBACiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKEhSRUZWNjAsICJTVC1Fcmljc3NvbiBVODUwMCBQbGF0Zm9ybSBIUkVGdjYwKyIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB1ODUwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gdXg1MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZ1eDUwMF90aW1lciwKLQkuaW5pdF9tYWNoaW5lCT0gbW9wNTAwX2luaXRfbWFjaGluZSwKKwkuaW5pdF9tYWNoaW5lCT0gaHJlZnY2MF9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKFNOT1dCQUxMLCAiQ2FsYW8gU3lzdGVtcyBTbm93YmFsbCBwbGF0Zm9ybSIpCi0JLmJvb3RfcGFyYW1zCT0gMHgxMDAsCisJLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCiAJLm1hcF9pbwkJPSB1ODUwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gdXg1MDBfaW5pdF9pcnEsCiAJLyogd2UgcmUtdXNlIG5vbWFkaWsgdGltZXIgaGVyZSAqLwogCS50aW1lcgkJPSAmdXg1MDBfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IG1vcDUwMF9pbml0X21hY2hpbmUsCisJLmluaXRfbWFjaGluZQk9IHNub3diYWxsX2luaXRfbWFjaGluZSwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuaAppbmRleCBlZTc3YTg5Li5kZTE4YTJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmgKQEAgLTQwLDEwICs0MCwxMyBAQAogc3RydWN0IGkyY19ib2FyZF9pbmZvOwogCiBleHRlcm4gdm9pZCBtb3A1MDBfc2RpX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzbm93YmFsbF9zZGlfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG1vcDUwMF9zZGlfdGMzNTg5Ml9pbml0KHZvaWQpOwogdm9pZCBfX2luaXQgbW9wNTAwX3U4NTAwdWliX2luaXQodm9pZCk7CiB2b2lkIF9faW5pdCBtb3A1MDBfc3R1aWJfaW5pdCh2b2lkKTsKIHZvaWQgX19pbml0IG1vcDUwMF9waW5zX2luaXQodm9pZCk7Cit2b2lkIF9faW5pdCBocmVmdjYwX3BpbnNfaW5pdCh2b2lkKTsKK3ZvaWQgX19pbml0IHNub3diYWxsX3BpbnNfaW5pdCh2b2lkKTsKIAogdm9pZCBtb3A1MDBfdWliX2kyY19hZGQoaW50IGJ1c251bSwgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvLAogCQl1bnNpZ25lZCBuKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAtc2RpLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLXNkaS5jCmluZGV4IDczOWZiNGMuLjYzYzNmODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAtc2RpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC1zZGkuYwpAQCAtNyw5ICs3LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8cGxhdC9waW5jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogI2luY2x1ZGUgPG1hY2gvZGI1NTAwLXJlZ3MuaD4KICNpbmNsdWRlIDxwbGF0L3N0ZV9kbWE0MC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLXU1NTAwLmMKaW5kZXggZTU4ZjBmNS4uODIwMjViYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC11NTUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtdTU1MDAuYwpAQCAtOCwxNSArOCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxwbGF0L3BpbmNmZy5oPgogI2luY2x1ZGUgPHBsYXQvaTJjLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KQEAgLTg3LDcgKzg4LDYgQEAKIAkuYnJ0X3ZhbCA9IDB4N0YsCS8qIE1heCBicmlnaHRuZXNzICovCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB1NTUwMF9pMmMyX2RldmljZXNbXSA9IHsKIAl7CiAJCS8qIEJhY2tsaWdodCAqLwpAQCAtMTAxLDYgKzEwMSwzMCBAQAogCWRiNTUwMF9hZGRfaTJjMigmdTU1MDBfaTJjMl9kYXRhKTsKIAlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygyLCBBUlJBWV9BTkRfU0laRSh1NTUwMF9pMmMyX2RldmljZXMpKTsKIH0KKworc3RhdGljIHN0cnVjdCBhYjU1MDBfcGxhdGZvcm1fZGF0YSBhYjU1MDBfcGxmX2RhdGEgPSB7CisJLmlycSA9IHsKKwkJLmJhc2UgPSAwLAorCQkuY291bnQgPSAwLAorCX0sCisJLmluaXRfc2V0dGluZ3MgPSBOVUxMLAorCS5pbml0X3NldHRpbmdzX3N6ID0gMCwKKwkucG1fcG93ZXJfb2ZmID0gZmFsc2UsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhYjU1MDBfZGV2aWNlID0geworCS5uYW1lID0gImFiNTUwMC1jb3JlIiwKKwkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmFiNTUwMF9wbGZfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1NTUwMF9wbGF0Zm9ybV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmYWI1NTAwX2RldmljZSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCB1NTUwMF91YXJ0X2luaXQodm9pZCkKIHsKIAlkYjU1MDBfYWRkX3VhcnQwKE5VTEwpOwpAQCAtMTE1LDEwICsxMzksMTMgQEAKIAl1NTUwMF9pMmNfaW5pdCgpOwogCXU1NTAwX3NkaV9pbml0KCk7CiAJdTU1MDBfdWFydF9pbml0KCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyh1NTUwMF9wbGF0Zm9ybV9kZXZpY2VzLAorCQlBUlJBWV9TSVpFKHU1NTAwX3BsYXRmb3JtX2RldmljZXMpKTsKIH0KIAogTUFDSElORV9TVEFSVChVNTUwMCwgIlNULUVyaWNzc29uIFU1NTAwIFBsYXRmb3JtIikKLQkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdTU1MDBfbWFwX2lvLAogCS5pbml0X2lycQk9IHV4NTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmdXg1MDBfdGltZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NhY2hlLWwyeDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY2FjaGUtbDJ4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmRkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NhY2hlLWwyeDAuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDExCisgKgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lkLmg+CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmwyeDBfYmFzZTsKKworc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3dhaXQodm9pZCBfX2lvbWVtICpyZWcsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwkvKiB3YWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKHJlYWRsX3JlbGF4ZWQocmVnKSAmIG1hc2spCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXg1MDBfY2FjaGVfc3luYyh2b2lkKQoreworCXdyaXRlbF9yZWxheGVkKDAsIGwyeDBfYmFzZSArIEwyWDBfQ0FDSEVfU1lOQyk7CisJdXg1MDBfY2FjaGVfd2FpdChsMngwX2Jhc2UgKyBMMlgwX0NBQ0hFX1NZTkMsIDEpOworfQorCisvKgorICogVGhlIEwyIGNhY2hlIGNhbm5vdCBiZSB0dXJuZWQgb2ZmIGluIHRoZSBub24tc2VjdXJlIHdvcmxkLgorICogRHVtbXkgdW50aWwgYSBzZWN1cmUgc2VydmljZSBpcyBpbiBwbGFjZS4KKyAqLworc3RhdGljIHZvaWQgdXg1MDBfbDJ4MF9kaXNhYmxlKHZvaWQpCit7Cit9CisKKy8qCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gZG9pbmcgYSBrZXhlYywganVzdCBhZnRlciB0dXJuaW5nIG9mZiB0aGUgTDIKKyAqIGFuZCBMMSBjYWNoZSwgYW5kIGl0IGlzIHN1cnJvdW5kZWQgYnkgYSBzcGlubG9jayBpbiB0aGUgZ2VuZXJpYyB2ZXJzaW9uLgorICogSG93ZXZlciwgd2UncmUgbm90IHJlYWxseSB0dXJuaW5nIG9mZiB0aGUgTDIgY2FjaGUgcmlnaHQgbm93IGFuZCB0aGUKKyAqIFBMMzEwIGRvZXMgbm90IHN1cHBvcnQgZXhjbHVzaXZlIGFjY2Vzc2VzICh1c2VkIHRvIGltcGxlbWVudCB0aGUgc3BpbmxvY2spLgorICogU28sIHRoZSBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgZG9uZSB3aXRob3V0IHRoZSBzcGlubG9jay4KKyAqLworc3RhdGljIHZvaWQgdXg1MDBfbDJ4MF9pbnZfYWxsKHZvaWQpCit7CisJdWludDMyX3QgbDJ4MF93YXlfbWFzayA9ICgxPDwxNikgLSAxOwkvKiBCaXRtYXNrIG9mIGFjdGl2ZSB3YXlzICovCisKKwkvKiBpbnZhbGlkYXRlIGFsbCB3YXlzICovCisJd3JpdGVsX3JlbGF4ZWQobDJ4MF93YXlfbWFzaywgbDJ4MF9iYXNlICsgTDJYMF9JTlZfV0FZKTsKKwl1eDUwMF9jYWNoZV93YWl0KGwyeDBfYmFzZSArIEwyWDBfSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CisJdXg1MDBfY2FjaGVfc3luYygpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1eDUwMF9sMngwX3VubG9jayh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBVbmxvY2sgRGF0YSBhbmQgSW5zdHJ1Y3Rpb24gTG9jayBpZiBsb2NrZWQuIFV4NTAwIFUtQm9vdCB2ZXJzaW9ucworCSAqIGFwcGFyZW50bHkgbG9ja3MgYm90aCBjYWNoZXMgYmVmb3JlIGp1bXBpbmcgdG8gdGhlIGtlcm5lbC4gVGhlCisJICogbDJ4MCBjb3JlIHdpbGwgbm90IHRvdWNoIHRoZSB1bmxvY2sgcmVnaXN0ZXJzIGlmIHRoZSBsMngwIGlzCisJICogYWxyZWFkeSBlbmFibGVkLCBzbyB3ZSBkbyBpdCByaWdodCBoZXJlIGluc3RlYWQuIFRoZSBQTDMxMCBoYXMKKwkgKiA4IHNldHMgb2YgcmVnaXN0ZXJzLCBvbmUgcGVyIHBvc3NpYmxlIENQVS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXdyaXRlbF9yZWxheGVkKDB4MCwgbDJ4MF9iYXNlICsgTDJYMF9MT0NLRE9XTl9XQVlfRF9CQVNFICsKKwkJCSAgICAgICBpICogTDJYMF9MT0NLRE9XTl9TVFJJREUpOworCQl3cml0ZWxfcmVsYXhlZCgweDAsIGwyeDBfYmFzZSArIEwyWDBfTE9DS0RPV05fV0FZX0lfQkFTRSArCisJCQkgICAgICAgaSAqIEwyWDBfTE9DS0RPV05fU1RSSURFKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHV4NTAwX2wyeDBfaW5pdCh2b2lkKQoreworCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX0wyQ0NfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCWwyeDBfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9MMkNDX0JBU0UpOworCWVsc2UKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKworCS8qIFVubG9jayBiZWZvcmUgaW5pdCAqLworCXV4NTAwX2wyeDBfdW5sb2NrKCk7CisKKwkvKiA2NEtCIHdheSBzaXplLCA4IHdheSBhc3NvY2lhdGl2aXR5LCBmb3JjZSBXQSAqLworCWwyeDBfaW5pdChsMngwX2Jhc2UsIDB4M2UwNjAwMDAsIDB4YzAwMDBmZmYpOworCisJLyogT3ZlcnJpZGUgaW52YWxpZGF0ZSBmdW5jdGlvbiAqLworCW91dGVyX2NhY2hlLmRpc2FibGUgPSB1eDUwMF9sMngwX2Rpc2FibGU7CisJb3V0ZXJfY2FjaGUuaW52X2FsbCA9IHV4NTAwX2wyeDBfaW52X2FsbDsKKworCXJldHVybiAwOworfQorCitlYXJseV9pbml0Y2FsbCh1eDUwMF9sMngwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYwppbmRleCAyMjcwNWQyLi45ZGUxYWYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9wbXUuaD4KIAotI2luY2x1ZGUgPHBsYXQvZ3Bpby5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCmluZGV4IDQ1OThiMDYuLjEzZTg4OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCkBAIC0xNCwxMiArMTQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3BtdS5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1ub21hZGlrLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KICNpbmNsdWRlIDxtYWNoL2RldmljZXMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCmluZGV4IDFkYTIzYmIuLmY0MTg1NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYwpAQCAtMTAsMTQgKzEwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2RiODUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYjU1MDAtcHJjbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGtzcmMtZGJ4NTAwLXByY211Lmg+CiAKLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CiAKLSNpbmNsdWRlIDxwbGF0L210dS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLmg+CkBAIC0yNiwxMCArMjQsNiBAQAogCiB2b2lkIF9faW9tZW0gKl9QUkNNVV9CQVNFOwogCi0jaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmwyeDBfYmFzZTsKLSNlbmRpZgotCiB2b2lkIF9faW5pdCB1eDUwMF9pbml0X2lycSh2b2lkKQogewogCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOwpAQCAtNTMsOTYgKzQ3LDYgQEAKIAlpZiAoY3B1X2lzX3U1NTAwKCkpCiAJCWRiNTUwMF9wcmNtdV9lYXJseV9pbml0KCk7CiAJaWYgKGNwdV9pc191ODUwMCgpKQotCQlwcmNtdV9lYXJseV9pbml0KCk7CisJCWRiODUwMF9wcmNtdV9lYXJseV9pbml0KCk7CiAJY2xrX2luaXQoKTsKIH0KLQotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi1zdGF0aWMgaW5saW5lIHZvaWQgdXg1MDBfY2FjaGVfd2FpdCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBtYXNrKQotewotCS8qIHdhaXQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KLQl3aGlsZSAocmVhZGxfcmVsYXhlZChyZWcpICYgbWFzaykKLQkJOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXg1MDBfY2FjaGVfc3luYyh2b2lkKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKLQotCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMpOwotCXV4NTAwX2NhY2hlX3dhaXQoYmFzZSArIEwyWDBfQ0FDSEVfU1lOQywgMSk7Ci19Ci0KLS8qCi0gKiBUaGUgTDIgY2FjaGUgY2Fubm90IGJlIHR1cm5lZCBvZmYgaW4gdGhlIG5vbi1zZWN1cmUgd29ybGQuCi0gKiBEdW1teSB1bnRpbCBhIHNlY3VyZSBzZXJ2aWNlIGlzIGluIHBsYWNlLgotICovCi1zdGF0aWMgdm9pZCB1eDUwMF9sMngwX2Rpc2FibGUodm9pZCkKLXsKLX0KLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBkb2luZyBhIGtleGVjLCBqdXN0IGFmdGVyIHR1cm5pbmcgb2ZmIHRoZSBMMgotICogYW5kIEwxIGNhY2hlLCBhbmQgaXQgaXMgc3Vycm91bmRlZCBieSBhIHNwaW5sb2NrIGluIHRoZSBnZW5lcmljIHZlcnNpb24uCi0gKiBIb3dldmVyLCB3ZSdyZSBub3QgcmVhbGx5IHR1cm5pbmcgb2ZmIHRoZSBMMiBjYWNoZSByaWdodCBub3cgYW5kIHRoZQotICogUEwzMTAgZG9lcyBub3Qgc3VwcG9ydCBleGNsdXNpdmUgYWNjZXNzZXMgKHVzZWQgdG8gaW1wbGVtZW50IHRoZSBzcGlubG9jaykuCi0gKiBTbywgdGhlIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSBkb25lIHdpdGhvdXQgdGhlIHNwaW5sb2NrLgotICovCi1zdGF0aWMgdm9pZCB1eDUwMF9sMngwX2ludl9hbGwodm9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7Ci0JdWludDMyX3QgbDJ4MF93YXlfbWFzayA9ICgxPDwxNikgLSAxOwkvKiBCaXRtYXNrIG9mIGFjdGl2ZSB3YXlzICovCi0KLQkvKiBpbnZhbGlkYXRlIGFsbCB3YXlzICovCi0Jd3JpdGVsX3JlbGF4ZWQobDJ4MF93YXlfbWFzaywgYmFzZSArIEwyWDBfSU5WX1dBWSk7Ci0JdXg1MDBfY2FjaGVfd2FpdChiYXNlICsgTDJYMF9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKLQl1eDUwMF9jYWNoZV9zeW5jKCk7Ci19Ci0KLXN0YXRpYyBpbnQgdXg1MDBfbDJ4MF9pbml0KHZvaWQpCi17Ci0JaWYgKGNwdV9pc191NTUwMCgpKQotCQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTDJDQ19CQVNFKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKLQkJbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0wyQ0NfQkFTRSk7Ci0JZWxzZQotCQl1eDUwMF91bmtub3duX3NvYygpOwotCi0JLyogNjRLQiB3YXkgc2l6ZSwgOCB3YXkgYXNzb2NpYXRpdml0eSwgZm9yY2UgV0EgKi8KLQlsMngwX2luaXQobDJ4MF9iYXNlLCAweDNlMDYwMDAwLCAweGMwMDAwZmZmKTsKLQotCS8qIE92ZXJyaWRlIGludmFsaWRhdGUgZnVuY3Rpb24gKi8KLQlvdXRlcl9jYWNoZS5kaXNhYmxlID0gdXg1MDBfbDJ4MF9kaXNhYmxlOwotCW91dGVyX2NhY2hlLmludl9hbGwgPSB1eDUwMF9sMngwX2ludl9hbGw7Ci0KLQlyZXR1cm4gMDsKLX0KLWVhcmx5X2luaXRjYWxsKHV4NTAwX2wyeDBfaW5pdCk7Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgX19pbml0IHV4NTAwX3RpbWVyX2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCi0JLyogU2V0dXAgdGhlIGxvY2FsIHRpbWVyIGJhc2UgKi8KLQlpZiAoY3B1X2lzX3U1NTAwKCkpCi0JCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX1RXRF9CQVNFKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKLQkJdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfVFdEX0JBU0UpOwotCWVsc2UKLQkJdXg1MDBfdW5rbm93bl9zb2MoKTsKLSNlbmRpZgotCWlmIChjcHVfaXNfdTU1MDAoKSkKLQkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTVRVMF9CQVNFKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDBlZCgpKQotCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9NVFUwX0JBU0VfRUQpOwotCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQotCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9NVFUwX0JBU0UpOwotCWVsc2UKLQkJdXg1MDBfdW5rbm93bl9zb2MoKTsKLQotCW5tZGtfdGltZXJfaW5pdCgpOwotfQotCi1zdHJ1Y3Qgc3lzX3RpbWVyIHV4NTAwX3RpbWVyID0gewotCS5pbml0CT0gdXg1MDBfdGltZXJfaW5pdCwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2RldmljZXMtY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2RldmljZXMtY29tbW9uLmMKaW5kZXggMTNhNGNlMC4uYzU2M2U1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9kZXZpY2VzLWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvZGV2aWNlcy1jb21tb24uYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKLSNpbmNsdWRlIDxwbGF0L2dwaW8uaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tbm9tYWRpay5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaG90cGx1Zy5jCmluZGV4IGRkODAzN2UuLjU3MjAxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaG90cGx1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaG90cGx1Zy5jCkBAIC0yNCw3ICsyNCw3IEBACiAJZm9yICg7OykgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZHNiXG5cdCIgIndmaVxuXHQiCiAJCQkJOiA6IDogIm1lbW9yeSIpOwotCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7CisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHVfbG9naWNhbF9tYXAoY3B1KSkgewogCQkJLyoKIAkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiNTUwMC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjU1MDAtcmVncy5oCmluZGV4IDZhZDk4MzIuLjk5NGI1ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiNTUwMC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGI1NTAwLXJlZ3MuaApAQCAtNjEsNiArNjEsOCBAQAogI2RlZmluZSBVNTUwMF9TQ1JfQkFTRQkJKFU1NTAwX1BFUjRfQkFTRSArIDB4NTAwMCkKICNkZWZpbmUgVTU1MDBfRE1DX0JBU0UJCShVNTUwMF9QRVI0X0JBU0UgKyAweDYwMDApCiAjZGVmaW5lIFU1NTAwX1BSQ01VX0JBU0UJKFU1NTAwX1BFUjRfQkFTRSArIDB4NzAwMCkKKyNkZWZpbmUgVTU1MDBfUFJDTVVfVElNRVJfM19CQVNFIChVNTUwMF9QRVI0X0JBU0UgKyAweDA3MzM4KQorI2RlZmluZSBVNTUwMF9QUkNNVV9USU1FUl80X0JBU0UgKFU1NTAwX1BFUjRfQkFTRSArIDB4MDc0NTApCiAjZGVmaW5lIFU1NTAwX01TUDFfQkFTRQkJKFU1NTAwX1BFUjRfQkFTRSArIDB4OTAwMCkKICNkZWZpbmUgVTU1MDBfR1BJTzJfQkFTRQkoVTU1MDBfUEVSNF9CQVNFICsgMHhBMDAwKQogI2RlZmluZSBVNTUwMF9DREVURUNUX0JBU0UJKFU1NTAwX1BFUjRfQkFTRSArIDB4RjAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiODUwMC1yZWdzLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kYjg1MDAtcmVncy5oCmluZGV4IDA0OTk5NzEuLjc1MWIwZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RiODUwMC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGI4NTAwLXJlZ3MuaApAQCAtMTAyLDEwICsxMDIsMTMgQEAKICNkZWZpbmUgVTg1MDBfU0NSX0JBU0UJCShVODUwMF9QRVI0X0JBU0UgKyAweDA1MDAwKQogI2RlZmluZSBVODUwMF9ETUNfQkFTRQkJKFU4NTAwX1BFUjRfQkFTRSArIDB4MDYwMDApCiAjZGVmaW5lIFU4NTAwX1BSQ01VX0JBU0UJKFU4NTAwX1BFUjRfQkFTRSArIDB4MDcwMDApCisjZGVmaW5lIFU4NTAwX1BSQ01VX1RJTUVSXzNfQkFTRSAoVTg1MDBfUEVSNF9CQVNFICsgMHgwNzMzOCkKKyNkZWZpbmUgVTg1MDBfUFJDTVVfVElNRVJfNF9CQVNFIChVODUwMF9QRVI0X0JBU0UgKyAweDA3NDUwKQogI2RlZmluZSBVODUwMF9QUkNNVV9UQ0RNX0JBU0VfVjEgKFU4NTAwX1BFUjRfQkFTRSArIDB4MGYwMDApCiAjZGVmaW5lIFU4NTAwX1BSQ01VX1RDRE1fQkFTRQkoVTg1MDBfUEVSNF9CQVNFICsgMHg2ODAwMCkKICNkZWZpbmUgVTg1MDBfUFJDTVVfVENQTV9CQVNFICAgKFU4NTAwX1BFUjRfQkFTRSArIDB4NjAwMDApCiAKKwogLyogcGVyMyBiYXNlIGFkZHJlc3NlcyAqLwogI2RlZmluZSBVODUwMF9GU01DX0JBU0UJCShVODUwMF9QRVIzX0JBU0UgKyAweDAwMDApCiAjZGVmaW5lIFU4NTAwX1NTUDBfQkFTRQkJKFU4NTAwX1BFUjNfQkFTRSArIDB4MjAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDcwMGZiMDUuLjhkNzRkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBVWDUwMF9VQVJUKG4pCV9fVVg1MDBfVUFSVChuKQogI2RlZmluZSBVQVJUX0JBU0UJVVg1MDBfVUFSVChDT05GSUdfVVg1MDBfREVCVUdfVUFSVCkKIAotCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCWxkcglccnAsID1VQVJUX0JBU0UJCQkJQCBubywgcGh5c2ljYWwgYWRkcmVzcwogCWxkcglccnYsID1JT19BRERSRVNTKFVBUlRfQkFTRSkJCUAgeWVzLCB2aXJ0dWFsIGFkZHJlc3MKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDNjNGNkMzEuLjczODlkZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTcsNiArNyw0IEBACiAgKi8KICNkZWZpbmUgQVJDSF9OUl9HUElPUwkzNTAKIAotI2luY2x1ZGUgPHBsYXQvZ3Bpby5oPgotCiAjZW5kaWYgLyogX19BU01fQVJDSF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjY5N2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFNULUVyaWNzc29uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwMDAwMDAwMCkKLSNkZWZpbmUgQlVTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaAppbmRleCA3ZGQwODA3Li42ZmIzYzRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCkBAIC01MSwxNSArNTEsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZGVjb21wX3NldHVwKHZvaWQpCiB7CiAJLyogQ2hlY2sgaW4gcnVuIHRpbWUgaWYgd2UgcnVuIG9uIGFuIFU4NTAwIG9yIFU1NTAwICovCi0JaWYgKG1hY2hpbmVfaXNfdTg1MDAoKSB8fAotCSAgICBtYWNoaW5lX2lzX3N2cDg1MDB2MSgpIHx8Ci0JICAgIG1hY2hpbmVfaXNfc3ZwODUwMHYyKCkgfHwKLQkgICAgbWFjaGluZV9pc19ocmVmdjYwKCkgICB8fAotCSAgICBtYWNoaW5lX2lzX3Nub3diYWxsKCkpCi0JCXV4NTAwX3VhcnRfYmFzZSA9IFU4NTAwX1VBUlQyX0JBU0U7Ci0JZWxzZSBpZiAobWFjaGluZV9pc191NTUwMCgpKQorCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCiAJCXV4NTAwX3VhcnRfYmFzZSA9IFU1NTAwX1VBUlQwX0JBU0U7Ci0JZWxzZSAvKiBub3QgbXVjaCBjYW4gYmUgZG9uZSB0byBoZWxwIGhlcmUgKi8KKwllbHNlCiAJCXV4NTAwX3VhcnRfYmFzZSA9IFU4NTAwX1VBUlQyX0JBU0U7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvcGlucy1kYjg1MDAuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGlucy1kYjg1MDAuaAppbmRleCBmOTIzNzY0Li44YjFkMWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BpbnMtZGI4NTAwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9waW5zLWRiODUwMC5oCkBAIC0zNSw0MCArMzUsNDAgQEAKIAogI2RlZmluZSBHUElPNF9HUElPCQlQSU5fQ0ZHKDQsIEdQSU8pCiAjZGVmaW5lIEdQSU80X1UxX1JYRAkJUElOX0NGRyg0LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzRfSTJDNF9TQ0wJCVBJTl9DRkdfUFVMTCg0LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU80X0kyQzRfU0NMCQlQSU5fQ0ZHX0lOUFVUKDQsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU80X0lQX1RSU1RuCQlQSU5fQ0ZHKDQsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU81X0dQSU8JCVBJTl9DRkcoNSwgR1BJTykKICNkZWZpbmUgR1BJTzVfVTFfVFhECQlQSU5fQ0ZHKDUsIEFMVF9BKQotI2RlZmluZSBHUElPNV9JMkM0X1NEQQkJUElOX0NGR19QVUxMKDUsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzVfSTJDNF9TREEJCVBJTl9DRkdfSU5QVVQoNSwgQUxUX0IsIFBVTExVUCkKICNkZWZpbmUgR1BJTzVfSVBfR1BJTzYJCVBJTl9DRkcoNSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzZfR1BJTwkJUElOX0NGRyg2LCBHUElPKQogI2RlZmluZSBHUElPNl9VMV9DVFNuCQlQSU5fQ0ZHKDYsIEFMVF9BKQotI2RlZmluZSBHUElPNl9JMkMxX1NDTAkJUElOX0NGR19QVUxMKDYsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzZfSTJDMV9TQ0wJCVBJTl9DRkdfSU5QVVQoNiwgQUxUX0IsIFBVTExVUCkKICNkZWZpbmUgR1BJTzZfSVBfR1BJTzAJCVBJTl9DRkcoNiwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzdfR1BJTwkJUElOX0NGRyg3LCBHUElPKQogI2RlZmluZSBHUElPN19VMV9SVFNuCQlQSU5fQ0ZHKDcsIEFMVF9BKQotI2RlZmluZSBHUElPN19JMkMxX1NEQQkJUElOX0NGR19QVUxMKDcsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzdfSTJDMV9TREEJCVBJTl9DRkdfSU5QVVQoNywgQUxUX0IsIFBVTExVUCkKICNkZWZpbmUgR1BJTzdfSVBfR1BJTzEJCVBJTl9DRkcoNywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzhfR1BJTwkJUElOX0NGRyg4LCBHUElPKQotI2RlZmluZSBHUElPOF9JUEkyQ19TREEJCVBJTl9DRkdfUFVMTCg4LCBBTFRfQSwgVVApCi0jZGVmaW5lIEdQSU84X0kyQzJfU0RBCQlQSU5fQ0ZHX1BVTEwoOCwgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPOF9JUEkyQ19TREEJCVBJTl9DRkdfSU5QVVQoOCwgQUxUX0EsIFBVTExVUCkKKyNkZWZpbmUgR1BJTzhfSTJDMl9TREEJCVBJTl9DRkdfSU5QVVQoOCwgQUxUX0IsIFBVTExVUCkKIAogI2RlZmluZSBHUElPOV9HUElPCQlQSU5fQ0ZHKDksIEdQSU8pCi0jZGVmaW5lIEdQSU85X0lQSTJDX1NDTAkJUElOX0NGR19QVUxMKDksIEFMVF9BLCBVUCkKLSNkZWZpbmUgR1BJTzlfSTJDMl9TQ0wJCVBJTl9DRkdfUFVMTCg5LCBBTFRfQiwgVVApCisjZGVmaW5lIEdQSU85X0lQSTJDX1NDTAkJUElOX0NGR19JTlBVVCg5LCBBTFRfQSwgUFVMTFVQKQorI2RlZmluZSBHUElPOV9JMkMyX1NDTAkJUElOX0NGR19JTlBVVCg5LCBBTFRfQiwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8xMF9HUElPCQlQSU5fQ0ZHKDEwLCBHUElPKQotI2RlZmluZSBHUElPMTBfSVBJMkNfU0RBCVBJTl9DRkdfUFVMTCgxMCwgQUxUX0EsIFVQKQotI2RlZmluZSBHUElPMTBfSTJDMl9TREEJCVBJTl9DRkdfUFVMTCgxMCwgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPMTBfSVBJMkNfU0RBCVBJTl9DRkdfSU5QVVQoMTAsIEFMVF9BLCBQVUxMVVApCisjZGVmaW5lIEdQSU8xMF9JMkMyX1NEQQkJUElOX0NGR19JTlBVVCgxMCwgQUxUX0IsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEwX0lQX0dQSU8zCQlQSU5fQ0ZHKDEwLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTFfR1BJTwkJUElOX0NGRygxMSwgR1BJTykKLSNkZWZpbmUgR1BJTzExX0lQSTJDX1NDTAlQSU5fQ0ZHX1BVTEwoMTEsIEFMVF9BLCBVUCkKLSNkZWZpbmUgR1BJTzExX0kyQzJfU0NMCQlQSU5fQ0ZHX1BVTEwoMTEsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzExX0lQSTJDX1NDTAlQSU5fQ0ZHX0lOUFVUKDExLCBBTFRfQSwgUFVMTFVQKQorI2RlZmluZSBHUElPMTFfSTJDMl9TQ0wJCVBJTl9DRkdfSU5QVVQoMTEsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMV9JUF9HUElPMgkJUElOX0NGRygxMSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzEyX0dQSU8JCVBJTl9DRkcoMTIsIEdQSU8pCkBAIC04Nyw2NiArODcsNjYgQEAKIAogI2RlZmluZSBHUElPMTZfR1BJTwkJUElOX0NGRygxNiwgR1BJTykKICNkZWZpbmUgR1BJTzE2X01TUDBfUkZTCQlQSU5fQ0ZHKDE2LCBBTFRfQSkKLSNkZWZpbmUgR1BJTzE2X0kyQzFfU0NMCQlQSU5fQ0ZHX1BVTEwoMTYsIEFMVF9CLCBVUCkKKyNkZWZpbmUgR1BJTzE2X0kyQzFfU0NMCQlQSU5fQ0ZHX0lOUFVUKDE2LCBBTFRfQiwgUFVMTFVQKQogI2RlZmluZSBHUElPMTZfU0xJTTBfREFUCVBJTl9DRkcoMTYsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xN19HUElPCQlQSU5fQ0ZHKDE3LCBHUElPKQogI2RlZmluZSBHUElPMTdfTVNQMF9SQ0sJCVBJTl9DRkcoMTcsIEFMVF9BKQotI2RlZmluZSBHUElPMTdfSTJDMV9TREEJCVBJTl9DRkdfUFVMTCgxNywgQUxUX0IsIFVQKQorI2RlZmluZSBHUElPMTdfSTJDMV9TREEJCVBJTl9DRkdfSU5QVVQoMTcsIEFMVF9CLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xN19TTElNMF9DTEsJUElOX0NGRygxNywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE4X0dQSU8JCVBJTl9DRkcoMTgsIEdQSU8pCi0jZGVmaW5lIEdQSU8xOF9NQzBfQ01ERElSCVBJTl9DRkdfUFVMTCgxOCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMThfTUMwX0NNRERJUglQSU5fQ0ZHX0lOUFVUKDE4LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMThfVTJfUlhECQlQSU5fQ0ZHKDE4LCBBTFRfQikKICNkZWZpbmUgR1BJTzE4X01TX0lFUAkJUElOX0NGRygxOCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE5X0dQSU8JCVBJTl9DRkcoMTksIEdQSU8pCi0jZGVmaW5lIEdQSU8xOV9NQzBfREFUMERJUglQSU5fQ0ZHX1BVTEwoMTksIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE5X01DMF9EQVQwRElSCVBJTl9DRkdfSU5QVVQoMTksIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xOV9VMl9UWEQJCVBJTl9DRkcoMTksIEFMVF9CKQogI2RlZmluZSBHUElPMTlfTVNfREFUMERJUglQSU5fQ0ZHKDE5LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjBfR1BJTwkJUElOX0NGRygyMCwgR1BJTykKLSNkZWZpbmUgR1BJTzIwX01DMF9EQVQyRElSCVBJTl9DRkdfUFVMTCgyMCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjBfTUMwX0RBVDJESVIJUElOX0NGR19JTlBVVCgyMCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzIwX1VBUlRNT0RfVFhECVBJTl9DRkcoMjAsIEFMVF9CKQogI2RlZmluZSBHUElPMjBfSVBfVFJJR09VVAlQSU5fQ0ZHKDIwLCBBTFRfQykKIAogI2RlZmluZSBHUElPMjFfR1BJTwkJUElOX0NGRygyMSwgR1BJTykKLSNkZWZpbmUgR1BJTzIxX01DMF9EQVQzMURJUglQSU5fQ0ZHX1BVTEwoMjEsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIxX01DMF9EQVQzMURJUglQSU5fQ0ZHX0lOUFVUKDIxLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjFfTVNQMF9TQ0sJCVBJTl9DRkcoMjEsIEFMVF9CKQogI2RlZmluZSBHUElPMjFfTVNfREFUMzFESVIJUElOX0NGRygyMSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIyX0dQSU8JCVBJTl9DRkcoMjIsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMl9NQzBfRkJDTEsJUElOX0NGR19QVUxMKDIyLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yMl9NQzBfRkJDTEsJUElOX0NGR19JTlBVVCgyMiwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzIyX1VBUlRNT0RfUlhECVBJTl9DRkcoMjIsIEFMVF9CKQogI2RlZmluZSBHUElPMjJfTVNfRkJDTEsJCVBJTl9DRkcoMjIsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yM19HUElPCQlQSU5fQ0ZHKDIzLCBHUElPKQotI2RlZmluZSBHUElPMjNfTUMwX0NMSwkJUElOX0NGR19QVUxMKDIzLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8yM19NQzBfQ0xLCQlQSU5fQ0ZHX0lOUFVUKDIzLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjNfU1RNTU9EX0NMSwlQSU5fQ0ZHKDIzLCBBTFRfQikKICNkZWZpbmUgR1BJTzIzX01TX0NMSwkJUElOX0NGRygyMywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzI0X0dQSU8JCVBJTl9DRkcoMjQsIEdQSU8pCi0jZGVmaW5lIEdQSU8yNF9NQzBfQ01ECQlQSU5fQ0ZHX1BVTEwoMjQsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzI0X01DMF9DTUQJCVBJTl9DRkdfSU5QVVQoMjQsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8yNF9VQVJUTU9EX1JYRAlQSU5fQ0ZHKDI0LCBBTFRfQikKICNkZWZpbmUgR1BJTzI0X01TX0JTCQlQSU5fQ0ZHKDI0LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjVfR1BJTwkJUElOX0NGRygyNSwgR1BJTykKLSNkZWZpbmUgR1BJTzI1X01DMF9EQVQwCQlQSU5fQ0ZHX1BVTEwoMjUsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzI1X01DMF9EQVQwCQlQSU5fQ0ZHX0lOUFVUKDI1LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjVfU1RNTU9EX0RBVDAJUElOX0NGRygyNSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yNV9NU19EQVQwCQlQSU5fQ0ZHKDI1LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjZfR1BJTwkJUElOX0NGRygyNiwgR1BJTykKLSNkZWZpbmUgR1BJTzI2X01DMF9EQVQxCQlQSU5fQ0ZHX1BVTEwoMjYsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzI2X01DMF9EQVQxCQlQSU5fQ0ZHX0lOUFVUKDI2LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjZfU1RNTU9EX0RBVDEJUElOX0NGRygyNiwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yNl9NU19EQVQxCQlQSU5fQ0ZHKDI2LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjdfR1BJTwkJUElOX0NGRygyNywgR1BJTykKLSNkZWZpbmUgR1BJTzI3X01DMF9EQVQyCQlQSU5fQ0ZHX1BVTEwoMjcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzI3X01DMF9EQVQyCQlQSU5fQ0ZHX0lOUFVUKDI3LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjdfU1RNTU9EX0RBVDIJUElOX0NGRygyNywgQUxUX0IpCiAjZGVmaW5lIEdQSU8yN19NU19EQVQyCQlQSU5fQ0ZHKDI3LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjhfR1BJTwkJUElOX0NGRygyOCwgR1BJTykKLSNkZWZpbmUgR1BJTzI4X01DMF9EQVQzCQlQSU5fQ0ZHX1BVTEwoMjgsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzI4X01DMF9EQVQzCQlQSU5fQ0ZHX0lOUFVUKDI4LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMjhfU1RNTU9EX0RBVDMJUElOX0NGRygyOCwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yOF9NU19EQVQzCQlQSU5fQ0ZHKDI4LCBBTFRfQykKIApAQCAtMzU3LDQ4ICszNTcsNDggQEAKICNkZWZpbmUgR1BJTzk3X01DNV9EQVQ3CQlQSU5fQ0ZHKDk3LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTI4X0dQSU8JCVBJTl9DRkcoMTI4LCBHUElPKQotI2RlZmluZSBHUElPMTI4X01DMl9DTEsJCVBJTl9DRkdfUFVMTCgxMjgsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEyOF9NQzJfQ0xLCQlQSU5fQ0ZHX0lOUFVUKDEyOCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEyOF9TTV9DS08JCVBJTl9DRkcoMTI4LCBBTFRfQikKIAogI2RlZmluZSBHUElPMTI5X0dQSU8JCVBJTl9DRkcoMTI5LCBHUElPKQotI2RlZmluZSBHUElPMTI5X01DMl9DTUQJCVBJTl9DRkdfUFVMTCgxMjksIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEyOV9NQzJfQ01ECQlQSU5fQ0ZHX0lOUFVUKDEyOSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEyOV9TTV9XQUlUMG4JUElOX0NGRygxMjksIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzBfR1BJTwkJUElOX0NGRygxMzAsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzBfTUMyX0ZCQ0xLCVBJTl9DRkdfUFVMTCgxMzAsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzMF9NQzJfRkJDTEsJUElOX0NGR19JTlBVVCgxMzAsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzBfU01fRkJDTEsJUElOX0NGRygxMzAsIEFMVF9CKQogI2RlZmluZSBHUElPMTMwX01DMl9SU1ROCVBJTl9DRkcoMTMwLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTMxX0dQSU8JCVBJTl9DRkcoMTMxLCBHUElPKQotI2RlZmluZSBHUElPMTMxX01DMl9EQVQwCVBJTl9DRkdfUFVMTCgxMzEsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzMV9NQzJfREFUMAlQSU5fQ0ZHX0lOUFVUKDEzMSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEzMV9TTV9BRFE4CQlQSU5fQ0ZHKDEzMSwgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEzMl9HUElPCQlQSU5fQ0ZHKDEzMiwgR1BJTykKLSNkZWZpbmUgR1BJTzEzMl9NQzJfREFUMQlQSU5fQ0ZHX1BVTEwoMTMyLCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzJfTUMyX0RBVDEJUElOX0NGR19JTlBVVCgxMzIsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzJfU01fQURROQkJUElOX0NGRygxMzIsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzNfR1BJTwkJUElOX0NGRygxMzMsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzNfTUMyX0RBVDIJUElOX0NGR19QVUxMKDEzMywgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTMzX01DMl9EQVQyCVBJTl9DRkdfSU5QVVQoMTMzLCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTMzX1NNX0FEUTEwCVBJTl9DRkcoMTMzLCBBTFRfQikKIAogI2RlZmluZSBHUElPMTM0X0dQSU8JCVBJTl9DRkcoMTM0LCBHUElPKQotI2RlZmluZSBHUElPMTM0X01DMl9EQVQzCVBJTl9DRkdfUFVMTCgxMzQsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzNF9NQzJfREFUMwlQSU5fQ0ZHX0lOUFVUKDEzNCwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEzNF9TTV9BRFExMQlQSU5fQ0ZHKDEzNCwgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEzNV9HUElPCQlQSU5fQ0ZHKDEzNSwgR1BJTykKLSNkZWZpbmUgR1BJTzEzNV9NQzJfREFUNAlQSU5fQ0ZHX1BVTEwoMTM1LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzVfTUMyX0RBVDQJUElOX0NGR19JTlBVVCgxMzUsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzVfU01fQURRMTIJUElOX0NGRygxMzUsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzZfR1BJTwkJUElOX0NGRygxMzYsIEdQSU8pCi0jZGVmaW5lIEdQSU8xMzZfTUMyX0RBVDUJUElOX0NGR19QVUxMKDEzNiwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTM2X01DMl9EQVQ1CVBJTl9DRkdfSU5QVVQoMTM2LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTM2X1NNX0FEUTEzCVBJTl9DRkcoMTM2LCBBTFRfQikKIAogI2RlZmluZSBHUElPMTM3X0dQSU8JCVBJTl9DRkcoMTM3LCBHUElPKQotI2RlZmluZSBHUElPMTM3X01DMl9EQVQ2CVBJTl9DRkdfUFVMTCgxMzcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzEzN19NQzJfREFUNglQSU5fQ0ZHX0lOUFVUKDEzNywgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzEzN19TTV9BRFExNAlQSU5fQ0ZHKDEzNywgQUxUX0IpCiAKICNkZWZpbmUgR1BJTzEzOF9HUElPCQlQSU5fQ0ZHKDEzOCwgR1BJTykKLSNkZWZpbmUgR1BJTzEzOF9NQzJfREFUNwlQSU5fQ0ZHX1BVTEwoMTM4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xMzhfTUMyX0RBVDcJUElOX0NGR19JTlBVVCgxMzgsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xMzhfU01fQURRMTUJUElOX0NGRygxMzgsIEFMVF9CKQogCiAjZGVmaW5lIEdQSU8xMzlfR1BJTwkJUElOX0NGRygxMzksIEdQSU8pCkBAIC00MzQsMTAgKzQzNCwxMCBAQAogI2RlZmluZSBHUElPMTQ2X1NTUDBfVFhECVBJTl9DRkcoMTQ2LCBBTFRfQSkKIAogI2RlZmluZSBHUElPMTQ3X0dQSU8JCVBJTl9DRkcoMTQ3LCBHUElPKQotI2RlZmluZSBHUElPMTQ3X0kyQzBfU0NMCVBJTl9DRkdfUFVMTCgxNDcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE0N19JMkMwX1NDTAlQSU5fQ0ZHX0lOUFVUKDE0NywgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMTQ4X0dQSU8JCVBJTl9DRkcoMTQ4LCBHUElPKQotI2RlZmluZSBHUElPMTQ4X0kyQzBfU0RBCVBJTl9DRkdfUFVMTCgxNDgsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE0OF9JMkMwX1NEQQlQSU5fQ0ZHX0lOUFVUKDE0OCwgQUxUX0EsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMTQ5X0dQSU8JCVBJTl9DRkcoMTQ5LCBHUElPKQogI2RlZmluZSBHUElPMTQ5X0lQX0dQSU8wCVBJTl9DRkcoMTQ5LCBBTFRfQSkKQEAgLTQ1OSw4MiArNDU5LDgyIEBACiAjZGVmaW5lIEdQSU8xNTJfS1BfTzkJCVBJTl9DRkcoMTUyLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTUzX0dQSU8JCVBJTl9DRkcoMTUzLCBHUElPKQotI2RlZmluZSBHUElPMTUzX0tQX0k3CQlQSU5fQ0ZHX1BVTEwoMTUzLCBBTFRfQSwgRE9XTikKKyNkZWZpbmUgR1BJTzE1M19LUF9JNwkJUElOX0NGR19JTlBVVCgxNTMsIEFMVF9BLCBQVUxMRE9XTikKICNkZWZpbmUgR1BJTzE1M19MQ0RfRDI0CQlQSU5fQ0ZHKDE1MywgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNTNfVTJfUlhECQlQSU5fQ0ZHKDE1MywgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE1NF9HUElPCQlQSU5fQ0ZHKDE1NCwgR1BJTykKLSNkZWZpbmUgR1BJTzE1NF9LUF9JNgkJUElOX0NGR19QVUxMKDE1NCwgQUxUX0EsIERPV04pCisjZGVmaW5lIEdQSU8xNTRfS1BfSTYJCVBJTl9DRkdfSU5QVVQoMTU0LCBBTFRfQSwgUFVMTERPV04pCiAjZGVmaW5lIEdQSU8xNTRfTENEX0QyNQkJUElOX0NGRygxNTQsIEFMVF9CKQogI2RlZmluZSBHUElPMTU0X1UyX1RYRAkJUElOX0NGRygxNTQsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNTVfR1BJTwkJUElOX0NGRygxNTUsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNTVfS1BfSTUJCVBJTl9DRkdfUFVMTCgxNTUsIEFMVF9BLCBET1dOKQorI2RlZmluZSBHUElPMTU1X0tQX0k1CQlQSU5fQ0ZHX0lOUFVUKDE1NSwgQUxUX0EsIFBVTExET1dOKQogI2RlZmluZSBHUElPMTU1X0xDRF9EMjYJCVBJTl9DRkcoMTU1LCBBTFRfQikKICNkZWZpbmUgR1BJTzE1NV9TVE1BUEVfQ0xLCVBJTl9DRkcoMTU1LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTU2X0dQSU8JCVBJTl9DRkcoMTU2LCBHUElPKQotI2RlZmluZSBHUElPMTU2X0tQX0k0CQlQSU5fQ0ZHX1BVTEwoMTU2LCBBTFRfQSwgRE9XTikKKyNkZWZpbmUgR1BJTzE1Nl9LUF9JNAkJUElOX0NGR19JTlBVVCgxNTYsIEFMVF9BLCBQVUxMRE9XTikKICNkZWZpbmUgR1BJTzE1Nl9MQ0RfRDI3CQlQSU5fQ0ZHKDE1NiwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNTZfU1RNQVBFX0RBVDMJUElOX0NGRygxNTYsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNTdfR1BJTwkJUElOX0NGRygxNTcsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNTdfS1BfTzcJCVBJTl9DRkdfUFVMTCgxNTcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE1N19LUF9PNwkJUElOX0NGR19JTlBVVCgxNTcsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNTdfTENEX0QyOAkJUElOX0NGRygxNTcsIEFMVF9CKQogI2RlZmluZSBHUElPMTU3X1NUTUFQRV9EQVQyCVBJTl9DRkcoMTU3LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTU4X0dQSU8JCVBJTl9DRkcoMTU4LCBHUElPKQotI2RlZmluZSBHUElPMTU4X0tQX082CQlQSU5fQ0ZHX1BVTEwoMTU4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNThfS1BfTzYJCVBJTl9DRkdfSU5QVVQoMTU4LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTU4X0xDRF9EMjkJCVBJTl9DRkcoMTU4LCBBTFRfQikKICNkZWZpbmUgR1BJTzE1OF9TVE1BUEVfREFUMQlQSU5fQ0ZHKDE1OCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE1OV9HUElPCQlQSU5fQ0ZHKDE1OSwgR1BJTykKLSNkZWZpbmUgR1BJTzE1OV9LUF9PNQkJUElOX0NGR19QVUxMKDE1OSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTU5X0tQX081CQlQSU5fQ0ZHX0lOUFVUKDE1OSwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE1OV9MQ0RfRDMwCQlQSU5fQ0ZHKDE1OSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNTlfU1RNQVBFX0RBVDAJUElOX0NGRygxNTksIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjBfR1BJTwkJUElOX0NGRygxNjAsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjBfS1BfTzQJCVBJTl9DRkdfUFVMTCgxNjAsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE2MF9LUF9PNAkJUElOX0NGR19JTlBVVCgxNjAsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNjBfTENEX0QzMQkJUElOX0NGRygxNjAsIEFMVF9CKQogI2RlZmluZSBHUElPMTYwX05PTkUJCVBJTl9DRkcoMTYwLCBBTFRfQykKIAogI2RlZmluZSBHUElPMTYxX0dQSU8JCVBJTl9DRkcoMTYxLCBHUElPKQotI2RlZmluZSBHUElPMTYxX0tQX0kzCQlQSU5fQ0ZHX1BVTEwoMTYxLCBBTFRfQSwgRE9XTikKKyNkZWZpbmUgR1BJTzE2MV9LUF9JMwkJUElOX0NGR19JTlBVVCgxNjEsIEFMVF9BLCBQVUxMRE9XTikKICNkZWZpbmUgR1BJTzE2MV9MQ0RfRDMyCQlQSU5fQ0ZHKDE2MSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNjFfVUFSVE1PRF9SWEQJUElOX0NGRygxNjEsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjJfR1BJTwkJUElOX0NGRygxNjIsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjJfS1BfSTIJCVBJTl9DRkdfUFVMTCgxNjIsIEFMVF9BLCBET1dOKQorI2RlZmluZSBHUElPMTYyX0tQX0kyCQlQSU5fQ0ZHX0lOUFVUKDE2MiwgQUxUX0EsIFBVTExET1dOKQogI2RlZmluZSBHUElPMTYyX0xDRF9EMzMJCVBJTl9DRkcoMTYyLCBBTFRfQikKICNkZWZpbmUgR1BJTzE2Ml9VQVJUTU9EX1RYRAlQSU5fQ0ZHKDE2MiwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE2M19HUElPCQlQSU5fQ0ZHKDE2MywgR1BJTykKLSNkZWZpbmUgR1BJTzE2M19LUF9JMQkJUElOX0NGR19QVUxMKDE2MywgQUxUX0EsIERPV04pCisjZGVmaW5lIEdQSU8xNjNfS1BfSTEJCVBJTl9DRkdfSU5QVVQoMTYzLCBBTFRfQSwgUFVMTERPV04pCiAjZGVmaW5lIEdQSU8xNjNfTENEX0QzNAkJUElOX0NGRygxNjMsIEFMVF9CKQogI2RlZmluZSBHUElPMTYzX1NUTU1PRF9DTEsJUElOX0NGRygxNjMsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjRfR1BJTwkJUElOX0NGRygxNjQsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjRfS1BfSTAJCVBJTl9DRkdfUFVMTCgxNjQsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE2NF9LUF9JMAkJUElOX0NGR19JTlBVVCgxNjQsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNjRfTENEX0QzNQkJUElOX0NGRygxNjQsIEFMVF9CKQogI2RlZmluZSBHUElPMTY0X1NUTU1PRF9EQVQzCVBJTl9DRkcoMTY0LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTY1X0dQSU8JCVBJTl9DRkcoMTY1LCBHUElPKQotI2RlZmluZSBHUElPMTY1X0tQX08zCQlQSU5fQ0ZHX1BVTEwoMTY1LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNjVfS1BfTzMJCVBJTl9DRkdfSU5QVVQoMTY1LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTY1X0xDRF9EMzYJCVBJTl9DRkcoMTY1LCBBTFRfQikKICNkZWZpbmUgR1BJTzE2NV9TVE1NT0RfREFUMglQSU5fQ0ZHKDE2NSwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzE2Nl9HUElPCQlQSU5fQ0ZHKDE2NiwgR1BJTykKLSNkZWZpbmUgR1BJTzE2Nl9LUF9PMgkJUElOX0NGR19QVUxMKDE2NiwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTY2X0tQX08yCQlQSU5fQ0ZHX0lOUFVUKDE2NiwgQUxUX0EsIFBVTExVUCkKICNkZWZpbmUgR1BJTzE2Nl9MQ0RfRDM3CQlQSU5fQ0ZHKDE2NiwgQUxUX0IpCiAjZGVmaW5lIEdQSU8xNjZfU1RNTU9EX0RBVDEJUElOX0NGRygxNjYsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8xNjdfR1BJTwkJUElOX0NGRygxNjcsIEdQSU8pCi0jZGVmaW5lIEdQSU8xNjdfS1BfTzEJCVBJTl9DRkdfUFVMTCgxNjcsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzE2N19LUF9PMQkJUElOX0NGR19JTlBVVCgxNjcsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8xNjdfTENEX0QzOAkJUElOX0NGRygxNjcsIEFMVF9CKQogI2RlZmluZSBHUElPMTY3X1NUTU1PRF9EQVQwCVBJTl9DRkcoMTY3LCBBTFRfQykKIAogI2RlZmluZSBHUElPMTY4X0dQSU8JCVBJTl9DRkcoMTY4LCBHUElPKQotI2RlZmluZSBHUElPMTY4X0tQX08wCQlQSU5fQ0ZHX1BVTEwoMTY4LCBBTFRfQSwgVVApCisjZGVmaW5lIEdQSU8xNjhfS1BfTzAJCVBJTl9DRkdfSU5QVVQoMTY4LCBBTFRfQSwgUFVMTFVQKQogI2RlZmluZSBHUElPMTY4X0xDRF9EMzkJCVBJTl9DRkcoMTY4LCBBTFRfQikKICNkZWZpbmUgR1BJTzE2OF9OT05FCQlQSU5fQ0ZHKDE2OCwgQUxUX0MpCiAKQEAgLTU2OSwzOSArNTY5LDM5IEBACiAjZGVmaW5lIEdQSU8xOTZfTVNQMl9SWEQJUElOX0NGRygxOTYsIEFMVF9BKQogCiAjZGVmaW5lIEdQSU8xOTdfR1BJTwkJUElOX0NGRygxOTcsIEdQSU8pCi0jZGVmaW5lIEdQSU8xOTdfTUM0X0RBVDMJUElOX0NGR19QVUxMKDE5NywgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTk3X01DNF9EQVQzCVBJTl9DRkdfSU5QVVQoMTk3LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8xOThfR1BJTwkJUElOX0NGRygxOTgsIEdQSU8pCi0jZGVmaW5lIEdQSU8xOThfTUM0X0RBVDIJUElOX0NGR19QVUxMKDE5OCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTk4X01DNF9EQVQyCVBJTl9DRkdfSU5QVVQoMTk4LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8xOTlfR1BJTwkJUElOX0NGRygxOTksIEdQSU8pCi0jZGVmaW5lIEdQSU8xOTlfTUM0X0RBVDEJUElOX0NGR19QVUxMKDE5OSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMTk5X01DNF9EQVQxCVBJTl9DRkdfSU5QVVQoMTk5LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDBfR1BJTwkJUElOX0NGRygyMDAsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDBfTUM0X0RBVDAJUElOX0NGR19QVUxMKDIwMCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjAwX01DNF9EQVQwCVBJTl9DRkdfSU5QVVQoMjAwLCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDFfR1BJTwkJUElOX0NGRygyMDEsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDFfTUM0X0NNRAkJUElOX0NGR19QVUxMKDIwMSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjAxX01DNF9DTUQJCVBJTl9DRkdfSU5QVVQoMjAxLCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDJfR1BJTwkJUElOX0NGRygyMDIsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDJfTUM0X0ZCQ0xLCVBJTl9DRkdfUFVMTCgyMDIsIEFMVF9BLCBVUCkKKyNkZWZpbmUgR1BJTzIwMl9NQzRfRkJDTEsJUElOX0NGR19JTlBVVCgyMDIsIEFMVF9BLCBQVUxMVVApCiAjZGVmaW5lIEdQSU8yMDJfUFdMCQlQSU5fQ0ZHKDIwMiwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yMDJfTUM0X1JTVE4JUElOX0NGRygyMDIsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yMDNfR1BJTwkJUElOX0NGRygyMDMsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDNfTUM0X0NMSwkJUElOX0NGR19QVUxMKDIwMywgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjAzX01DNF9DTEsJCVBJTl9DRkdfSU5QVVQoMjAzLCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDRfR1BJTwkJUElOX0NGRygyMDQsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDRfTUM0X0RBVDcJUElOX0NGR19QVUxMKDIwNCwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjA0X01DNF9EQVQ3CVBJTl9DRkdfSU5QVVQoMjA0LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDVfR1BJTwkJUElOX0NGRygyMDUsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDVfTUM0X0RBVDYJUElOX0NGR19QVUxMKDIwNSwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjA1X01DNF9EQVQ2CVBJTl9DRkdfSU5QVVQoMjA1LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDZfR1BJTwkJUElOX0NGRygyMDYsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDZfTUM0X0RBVDUJUElOX0NGR19QVUxMKDIwNiwgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjA2X01DNF9EQVQ1CVBJTl9DRkdfSU5QVVQoMjA2LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDdfR1BJTwkJUElOX0NGRygyMDcsIEdQSU8pCi0jZGVmaW5lIEdQSU8yMDdfTUM0X0RBVDQJUElOX0NGR19QVUxMKDIwNywgQUxUX0EsIFVQKQorI2RlZmluZSBHUElPMjA3X01DNF9EQVQ0CVBJTl9DRkdfSU5QVVQoMjA3LCBBTFRfQSwgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMDhfR1BJTwkJUElOX0NGRygyMDgsIEdQSU8pCiAjZGVmaW5lIEdQSU8yMDhfTUMxX0NMSwkJUElOX0NGRygyMDgsIEFMVF9BKQpAQCAtNjMyLDIxICs2MzIsMjUgQEAKICNkZWZpbmUgR1BJTzIxNV9NQzFfQ01ERElSCVBJTl9DRkcoMjE1LCBBTFRfQSkKICNkZWZpbmUgR1BJTzIxNV9NQzNfREFUMkRJUglQSU5fQ0ZHKDIxNSwgQUxUX0IpCiAjZGVmaW5lIEdQSU8yMTVfQ0xLT1VUMQkJUElOX0NGRygyMTUsIEFMVF9DKQorI2RlZmluZSBHUElPMjE1X1NQSTJfVFhECVBJTl9DRkcoMjE1LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjE2X0dQSU8JCVBJTl9DRkcoMjE2LCBHUElPKQogI2RlZmluZSBHUElPMjE2X01DMV9EQVQyRElSCVBJTl9DRkcoMjE2LCBBTFRfQSkKICNkZWZpbmUgR1BJTzIxNl9NQzNfQ01ERElSCVBJTl9DRkcoMjE2LCBBTFRfQikKLSNkZWZpbmUgR1BJTzIxNl9JMkMzX1NEQQlQSU5fQ0ZHX1BVTEwoMjE2LCBBTFRfQywgVVApCisjZGVmaW5lIEdQSU8yMTZfSTJDM19TREEJUElOX0NGR19JTlBVVCgyMTYsIEFMVF9DLCBQVUxMVVApCisjZGVmaW5lIEdQSU8yMTZfU1BJMl9GUk0JUElOX0NGRygyMTYsIEFMVF9DKQogCiAjZGVmaW5lIEdQSU8yMTdfR1BJTwkJUElOX0NGRygyMTcsIEdQSU8pCiAjZGVmaW5lIEdQSU8yMTdfTUMxX0RBVDBESVIJUElOX0NGRygyMTcsIEFMVF9BKQogI2RlZmluZSBHUElPMjE3X01DM19EQVQzMURJUglQSU5fQ0ZHKDIxNywgQUxUX0IpCiAjZGVmaW5lIEdQSU8yMTdfQ0xLT1VUMgkJUElOX0NGRygyMTcsIEFMVF9DKQorI2RlZmluZSBHUElPMjE3X1NQSTJfQ0xLCVBJTl9DRkcoMjE3LCBBTFRfQykKIAogI2RlZmluZSBHUElPMjE4X0dQSU8JCVBJTl9DRkcoMjE4LCBHUElPKQogI2RlZmluZSBHUElPMjE4X01DMV9EQVQzMURJUglQSU5fQ0ZHKDIxOCwgQUxUX0EpCiAjZGVmaW5lIEdQSU8yMThfTUMzX0RBVDBESVIJUElOX0NGRygyMTgsIEFMVF9CKQotI2RlZmluZSBHUElPMjE4X0kyQzNfU0NMCVBJTl9DRkdfUFVMTCgyMTgsIEFMVF9DLCBVUCkKKyNkZWZpbmUgR1BJTzIxOF9JMkMzX1NDTAlQSU5fQ0ZHX0lOUFVUKDIxOCwgQUxUX0MsIFBVTExVUCkKKyNkZWZpbmUgR1BJTzIxOF9TUEkyX1JYRAlQSU5fQ0ZHKDIxOCwgQUxUX0MpCiAKICNkZWZpbmUgR1BJTzIxOV9HUElPCQlQSU5fQ0ZHKDIxOSwgR1BJTykKICNkZWZpbmUgR1BJTzIxOV9IU0lSX0ZMQTAJUElOX0NGRygyMTksIEFMVF9BKQpAQCAtNjk0LDEyICs2OTgsMTIgQEAKICNkZWZpbmUgR1BJTzIyOV9HUElPCQlQSU5fQ0ZHKDIyOSwgR1BJTykKICNkZWZpbmUgR1BJTzIyOV9DTEtPVVQxCQlQSU5fQ0ZHKDIyOSwgQUxUX0EpCiAjZGVmaW5lIEdQSU8yMjlfUFdMCQlQSU5fQ0ZHKDIyOSwgQUxUX0IpCi0jZGVmaW5lIEdQSU8yMjlfSTJDM19TREEJUElOX0NGR19QVUxMKDIyOSwgQUxUX0MsIFVQKQorI2RlZmluZSBHUElPMjI5X0kyQzNfU0RBCVBJTl9DRkdfSU5QVVQoMjI5LCBBTFRfQywgUFVMTFVQKQogCiAjZGVmaW5lIEdQSU8yMzBfR1BJTwkJUElOX0NGRygyMzAsIEdQSU8pCiAjZGVmaW5lIEdQSU8yMzBfQ0xLT1VUMgkJUElOX0NGRygyMzAsIEFMVF9BKQogI2RlZmluZSBHUElPMjMwX1BXTAkJUElOX0NGRygyMzAsIEFMVF9CKQotI2RlZmluZSBHUElPMjMwX0kyQzNfU0NMCVBJTl9DRkdfUFVMTCgyMzAsIEFMVF9DLCBVUCkKKyNkZWZpbmUgR1BJTzIzMF9JMkMzX1NDTAlQSU5fQ0ZHX0lOUFVUKDIzMCwgQUxUX0MsIFBVTExVUCkKIAogI2RlZmluZSBHUElPMjU2X0dQSU8JCVBJTl9DRkcoMjU2LCBHUElPKQogI2RlZmluZSBHUElPMjU2X1VTQl9OWFQJCVBJTl9DRkcoMjU2LCBBTFRfQSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMKaW5kZXggZWI1MTk5MS4uYTE5ZTM5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMKQEAgLTk2LDcgKzk2LDcgQEAKIAkgKiB0aGUgaG9sZGluZyBwZW4gLSByZWxlYXNlIGl0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZsYWcKIAkgKiB0aGF0IGl0IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHJlc2V0dGluZyBwZW5fcmVsZWFzZS4KIAkgKi8KLQl3cml0ZV9wZW5fcmVsZWFzZShjcHUpOworCXdyaXRlX3Blbl9yZWxlYXNlKGNwdV9sb2dpY2FsX21hcChjcHUpKTsKIAogCWdpY19yYWlzZV9zb2Z0aXJxKGNwdW1hc2tfb2YoY3B1KSwgMSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE0NjdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC90aW1lci5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTEKKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICogQXV0aG9yOiBNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa3NyYy1kYng1MDAtcHJjbXUuaD4KKworI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CisKKyNpbmNsdWRlIDxwbGF0L210dS5oPgorCisjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHZvaWQgX19pbml0IHV4NTAwX3RpbWVyX2luaXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnByY211X3RpbWVyX2Jhc2U7CisKKwlpZiAoY3B1X2lzX3U1NTAwKCkpIHsKKyNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCisJCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX1RXRF9CQVNFKTsKKyNlbmRpZgorCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9NVFUwX0JBU0UpOworCQlwcmNtdV90aW1lcl9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX1BSQ01VX1RJTUVSXzNfQkFTRSk7CisJfSBlbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkgeworI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKKwkJdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfVFdEX0JBU0UpOworI2VuZGlmCisJCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX01UVTBfQkFTRSk7CisJCXByY211X3RpbWVyX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfUFJDTVVfVElNRVJfNF9CQVNFKTsKKwl9IGVsc2UgeworCQl1eDUwMF91bmtub3duX3NvYygpOworCX0KKworCS8qCisJICogSGVyZSB3ZSByZWdpc3RlciB0aGUgdGltZXJibG9ja3MgYWN0aXZlIGluIHRoZSBzeXN0ZW0uCisJICogTG9jYWx0aW1lcnMgKHR3ZCkgaXMgc3RhcnRlZCB3aGVuIGJvdGggY3B1IGlzIHVwIGFuZCBydW5uaW5nLgorCSAqIE1UVSByZWdpc3RlciBhIGNsb2Nrc291cmNlLCBjbG9ja2V2ZW50IGFuZCBzY2hlZF9jbG9jay4KKwkgKiBTaW5jZSB0aGUgTVRVIGlzIGxvY2F0ZWQgaW4gdGhlIFZBUEUgcG93ZXIgZG9tYWluCisJICogaXQgd2lsbCBiZSBjbGVhcmVkIGluIHNsZWVwIHdoaWNoIG1ha2VzIGl0IHVuc3VpdGFibGUuCisJICogV2UgaG93ZXZlciBuZWVkIGl0IGFzIGEgdGltZXIgdGljayAoY2xvY2tldmVudCkKKwkgKiBkdXJpbmcgYm9vdCB0byBjYWxpYnJhdGUgZGVsYXkgdW50aWwgdHdkIGlzIHN0YXJ0ZWQuCisJICogUlRDLVJUVCBoYXZlIHByb2JsZW1zIGFzIHRpbWVyIHRpY2sgZHVyaW5nIGJvb3Qgc2luY2UgaXQgaXMKKwkgKiBkZXBlbmRpbmcgb24gZGVsYXkgd2hpY2ggaXMgbm90IHlldCBjYWxpYnJhdGVkLiBSVEMtUlRUIGlzIGluIHRoZQorCSAqIGFsd2F5cy1vbiBwb3dlcmRvbWFpbiBhbmQgaXMgdXNlZCBhcyBjbG9ja2V2ZW50IGluc3RlYWQgb2YgdHdkIHdoZW4KKwkgKiBzbGVlcGluZy4KKwkgKiBUaGUgUFJDTVUgdGltZXIgNCgzIGZvciBEQjU1MDApIHJlZ2lzdGVyIGEgY2xvY2tzb3VyY2UgYW5kCisJICogc2NoZWRfY2xvY2sgd2l0aCBoaWdoZXIgcmF0aW5nIHRoZW4gTVRVIHNpbmNlIGlzIGFsd2F5cy1vbi4KKwkgKgorCSAqLworCisJbm1ka190aW1lcl9pbml0KCk7CisJY2xrc3JjX2RieDUwMF9wcmNtdV9pbml0KHByY211X3RpbWVyX2Jhc2UpOworfQorCitzdGF0aWMgdm9pZCB1eDUwMF90aW1lcl9yZXNldCh2b2lkKQoreworCW5tZGtfY2xrZXZ0X3Jlc2V0KCk7CisJbm1ka19jbGtzcmNfcmVzZXQoKTsKK30KKworc3RydWN0IHN5c190aW1lciB1eDUwMF90aW1lciA9IHsKKwkuaW5pdAkJPSB1eDUwMF90aW1lcl9pbml0LAorCS5yZXN1bWUJCT0gdXg1MDBfdGltZXJfcmVzZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBlYjJjZjdkLi5kMGZiZDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQltb3YJXHJwLCAgICAgICMweDAwMUYwMDAwCiAJCW9ycglccnAsIFxycCwgIzB4MDAwMDEwMDAKIAkJb3JyCVxydiwgXHJwLCAjMHhmMTAwMDAwMAlAIHZpcnR1YWwgYmFzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggOTRmZjI3Ni4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0xLDYgKzEgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhY2M5ZDguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqICBhcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKaW5kZXggZjhhZTY0Yi4uZmRhNDg2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2FiLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogTUFDSElORV9TVEFSVChWRVJTQVRJTEVfQUIsICJBUk0tVmVyc2F0aWxlIEFCIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHZlcnNhdGlsZV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSB2ZXJzYXRpbGVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSB2ZXJzYXRpbGVfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCmluZGV4IDM3YzIzZGYuLmZlYWY5Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogTUFDSElORV9TVEFSVChWRVJTQVRJTEVfUEIsICJBUk0tVmVyc2F0aWxlIFBCIikKIAkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkubWFwX2lvCQk9IHZlcnNhdGlsZV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSB2ZXJzYXRpbGVfaW5pdF9lYXJseSwKIAkuaW5pdF9pcnEJPSB2ZXJzYXRpbGVfaW5pdF9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaG90cGx1Zy5jCmluZGV4IDM2NjhjZjkuLjgxM2VlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaG90cGx1Zy5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaG90cGx1Zy5jCkBAIC02NSw3ICs2NSw3IEBACiAJZm9yICg7OykgewogCQl3ZmkoKTsKIAotCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7CisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHVfbG9naWNhbF9tYXAoY3B1KSkgewogCQkJLyoKIAkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDA1MGQ2NWUuLmZkOWU2YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTIsNyArMTIsNyBAQAogCiAjZGVmaW5lIERFQlVHX0xMX1VBUlRfT0ZGU0VUCTB4MDAwMDkwMDAKIAotCQkubWFjcm8JYWRkcnVhcnQscnAscnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LHJwLHJ2LHRtcAogCQltb3YJXHJwLCAjREVCVUdfTExfVUFSVF9PRkZTRVQKIAkJb3JyCVxydiwgXHJwLCAjMHhmODAwMDAwMAlAIHZpcnR1YWwgYmFzZQogCQlvcnIJXHJwLCBccnAsICMweDEwMDAwMDAwCUAgcGh5c2ljYWwgYmFzZQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL2dwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZnRyYWNlLmgKY29weSB0byBhcmNoL2FybS9tYWNoLXZleHByZXNzL2luY2x1ZGUvbWFjaC9ncGlvLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2ZjZDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL21hY2gtdmV4cHJlc3MvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDYwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMgYi9hcmNoL2FybS9tYWNoLXZleHByZXNzL3YybS5jCmluZGV4IGQwZDI2N2EuLjFmYWZjMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvdjJtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy92Mm0uYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoVkVYUFJFU1MsICJBUk0tVmVyc2F0aWxlIEV4cHJlc3MiKQotCS5ib290X3BhcmFtcwk9IFBMQVRfUEhZU19PRkZTRVQgKyAweDAwMDAwMTAwLAorCS5hdGFnX29mZnNldAk9IDB4MTAwLAogCS5tYXBfaW8JCT0gdjJtX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHYybV9pbml0X2Vhcmx5LAogCS5pbml0X2lycQk9IHYybV9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2J2MDcuYyBiL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2J2MDcuYwppbmRleCA5NGEyNjFkLi5hNDY0Yzc1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9idjA3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvYnYwNy5jCkBAIC02OCw3ICs2OCw3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQlYwNywgIkJlbmlnbiBCVjA3IE1pbmkgTmV0Ym9vayIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IHZ0ODUwMF9yZXNlcnZlX21lbSwKIAkubWFwX2lvCQk9IHZ0ODUwMF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gdnQ4NTAwX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCBmMTE5MTYyLi5jYTI5MmYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTEsNyArMTEsNyBAQAogICoKICovCiAKLQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAltb3YJXHJwLCAgICAgICMweDAwMjAwMDAwCiAJb3JyCVxydiwgXHJwLCAjMHhmODAwMDAwMAogCW9ycglccnAsIFxycCwgIzB4ZDgwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDk0ZmYyNzYuLjQwYThjMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMSw2ICsxIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCV9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUJX19ncGlvX3NldF92YWx1ZQotI2RlZmluZSBncGlvX2NhbnNsZWVwCV9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycQlfX2dwaW9fdG9faXJxCisvKiBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVmOTE0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiAgYXJjaC9hcm0vbWFjaC12dDg1MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12dDg1MDAvd204NTA1Xzdpbi5jIGIvYXJjaC9hcm0vbWFjaC12dDg1MDAvd204NTA1Xzdpbi5jCmluZGV4IGU3M2FhZGIuLmNmOTEwYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdnQ4NTAwL3dtODUwNV83aW4uYworKysgYi9hcmNoL2FybS9tYWNoLXZ0ODUwMC93bTg1MDVfN2luLmMKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChXTTg1MDVfN0lOX05FVEJPT0ssICJXTTg1MDUgNy1pbmNoIGdlbmVyaWMgbmV0Ym9vayIpCi0JLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuYXRhZ19vZmZzZXQJPSAweDEwMCwKIAkucmVzZXJ2ZQk9IHdtODUwNV9yZXNlcnZlX21lbSwKIAkubWFwX2lvCQk9IHdtODUwNV9tYXBfaW8sCiAJLmluaXRfaXJxCT0gd204NTA1X2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAwMzRkYTNlLi41Mzg1YTQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTUsMTYgKzE1LDEyIEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKIAogc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKIHsKIAlyZXR1cm4gZ3BpbzsKIH0KKyNkZWZpbmUgZ3Bpb190b19pcnEgZ3Bpb190b19pcnEKIAogc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjkwNWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9tYWNoLXc5MHg5MDAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE51dm90b24gdGVjaG5vbG9neSBjb3Jwb3JhdGlvbgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBXYW4gWm9uZ1NodW4gPG1jdW9zLmNvbUBnbWFpbC5jb20+Ci0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9NRU1PUllfSAotI2RlZmluZSBfX0FTTV9BUkNIX01FTU9SWV9ICi0KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAlVTCgweDAwMDAwMDAwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51YzkxMGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTEwZXZiLmMKaW5kZXggMzBmY2NkZS4uMzFjMTA5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTEwZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTEwZXZiLmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogTUFDSElORV9TVEFSVChXOTBQOTEwRVZCLCAiVzkwUDkxMEVWQiIpCiAJLyogTWFpbnRhaW5lcjogV2FuIFpvbmdTaHVuICovCi0JLmJvb3RfcGFyYW1zCT0gMCwKIAkubWFwX2lvCQk9IG51YzkxMGV2Yl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbnVjOTAwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBudWM5MTBldmJfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk1MGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTUwZXZiLmMKaW5kZXggNTkwYzk5Yi4uNDA2MmU1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTUwZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTUwZXZiLmMKQEAgLTM3LDcgKzM3LDYgQEAKIAogTUFDSElORV9TVEFSVChXOTBQOTUwRVZCLCAiVzkwUDk1MEVWQiIpCiAJLyogTWFpbnRhaW5lcjogV2FuIFpvbmdTaHVuICovCi0JLmJvb3RfcGFyYW1zCT0gMCwKIAkubWFwX2lvCQk9IG51Yzk1MGV2Yl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbnVjOTAwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBudWM5NTBldmJfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLW51Yzk2MGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTYwZXZiLmMKaW5kZXggZTA5YzY0NS4uMGFiOTk5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTYwZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtbnVjOTYwZXZiLmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogTUFDSElORV9TVEFSVChXOTBOOTYwRVZCLCAiVzkwTjk2MEVWQiIpCiAJLyogTWFpbnRhaW5lcjogV2FuIFpvbmdTaHVuICovCi0JLmJvb3RfcGFyYW1zCT0gMCwKIAkubWFwX2lvCQk9IG51Yzk2MGV2Yl9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbnVjOTAwX2luaXRfaXJxLAogCS5pbml0X21hY2hpbmUJPSBudWM5NjBldmJfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtenlucS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA5ZjY2NGQ1Li4zYWIwYmUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC16eW5xL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bWFjaC96eW5xX3NvYy5oPgogI2luY2x1ZGUgPG1hY2gvdWFydC5oPgogCi0JCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2CisJCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2LCB0bXAKIAkJbGRyCVxycCwgPUxMX1VBUlRfUEFERFIJQCBwaHlzaWNhbAogCQlsZHIJXHJ2LCA9TExfVUFSVF9WQUREUglAIHZpcnR1YWwKIAkJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE5MjYzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXp5bnEvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMSBYaWxpbngKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NQUNIX01FTU9SWV9IX18KLSNkZWZpbmUgX19NQUNIX01FTU9SWV9IX18KLQotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJVUwoMHgwKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDg4NjMzZmUuLjY3Zjc1YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtODE5LDEwICs4MTksMTAgQEAKIGNvbmZpZyBDQUNIRV9MMlgwCiAJYm9vbCAiRW5hYmxlIHRoZSBMMngwIG91dGVyIGNhY2hlIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBSRUFMVklFV19FQl9BUk0xMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEIxMTc2IHx8IFwKLQkJICAgUkVBTFZJRVdfRUJfQTlNUCB8fCBTT0NfSU1YMzUgfHwgU09DX0lNWDMxIHx8IE1BQ0hfUkVBTFZJRVdfUEJYIHx8IFwKKwkJICAgUkVBTFZJRVdfRUJfQTlNUCB8fCBBUkNIX0lNWF9WNl9WNyB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBcCiAJCSAgIEFSQ0hfTk9NQURJSyB8fCBBUkNIX09NQVA0IHx8IEFSQ0hfRVhZTk9TNCB8fCBBUkNIX1RFR1JBIHx8IFwKIAkJICAgQVJDSF9VODUwMCB8fCBBUkNIX1ZFWFBSRVNTX0NBOVg0IHx8IEFSQ0hfU0hNT0JJTEUgfHwgXAotCQkgICBBUkNIX1BSSU1BMiB8fCBBUkNIX1pZTlEgfHwgQVJDSF9DTlMzWFhYCisJCSAgIEFSQ0hfUFJJTUEyIHx8IEFSQ0hfWllOUSB8fCBBUkNIX0NOUzNYWFggfHwgQVJDSF9ISUdIQkFOSwogCWRlZmF1bHQgeQogCXNlbGVjdCBPVVRFUl9DQUNIRQogCXNlbGVjdCBPVVRFUl9DQUNIRV9TWU5DCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwppbmRleCAyMzVlYjc3Li5lNGU3ZjZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKQEAgLTE4LDEyICsxOCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vaGlnaG1lbS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCiAjaW5jbHVkZSAibW0uaCIKIApAQCAtMTE3LDI2ICsxMTksMzYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NTVUKLS8qIFNhbml0eSBjaGVjayBzaXplICovCi0jaWYgKENPTlNJU1RFTlRfRE1BX1NJWkUgJSBTWl8yTSkKLSNlcnJvciAiQ09OU0lTVEVOVF9ETUFfU0laRSBtdXN0IGJlIG11bHRpcGxlIG9mIDJNaUIiCi0jZW5kaWYKIAotI2RlZmluZSBDT05TSVNURU5UX09GRlNFVCh4KQkoKCh1bnNpZ25lZCBsb25nKSh4KSAtIENPTlNJU1RFTlRfQkFTRSkgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgQ09OU0lTVEVOVF9QVEVfSU5ERVgoeCkgKCgodW5zaWduZWQgbG9uZykoeCkgLSBDT05TSVNURU5UX0JBU0UpID4+IFBNRF9TSElGVCkKLSNkZWZpbmUgTlVNX0NPTlNJU1RFTlRfUFRFUyAoQ09OU0lTVEVOVF9ETUFfU0laRSA+PiBQTURfU0hJRlQpCisjZGVmaW5lIENPTlNJU1RFTlRfT0ZGU0VUKHgpCSgoKHVuc2lnbmVkIGxvbmcpKHgpIC0gY29uc2lzdGVudF9iYXNlKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBDT05TSVNURU5UX1BURV9JTkRFWCh4KSAoKCh1bnNpZ25lZCBsb25nKSh4KSAtIGNvbnNpc3RlbnRfYmFzZSkgPj4gUE1EX1NISUZUKQogCiAvKgogICogVGhlc2UgYXJlIHRoZSBwYWdlIHRhYmxlcyAoMk1CIGVhY2gpIGNvdmVyaW5nIHVuY2FjaGVkLCBETUEgY29uc2lzdGVudCBhbGxvY2F0aW9ucwogICovCi1zdGF0aWMgcHRlX3QgKmNvbnNpc3RlbnRfcHRlW05VTV9DT05TSVNURU5UX1BURVNdOworc3RhdGljIHB0ZV90ICoqY29uc2lzdGVudF9wdGU7CisKKyNkZWZpbmUgREVGQVVMVF9DT05TSVNURU5UX0RNQV9TSVpFIFNaXzJNCisKK3Vuc2lnbmVkIGxvbmcgY29uc2lzdGVudF9iYXNlID0gQ09OU0lTVEVOVF9FTkQgLSBERUZBVUxUX0NPTlNJU1RFTlRfRE1BX1NJWkU7CisKK3ZvaWQgX19pbml0IGluaXRfY29uc2lzdGVudF9kbWFfc2l6ZSh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gQ09OU0lTVEVOVF9FTkQgLSBBTElHTihzaXplLCBTWl8yTSk7CisKKwlCVUdfT04oY29uc2lzdGVudF9wdGUpOyAvKiBDaGVjayB3ZSdyZSBjYWxsZWQgYmVmb3JlIERNQSByZWdpb24gaW5pdCAqLworCUJVR19PTihiYXNlIDwgVk1BTExPQ19FTkQpOworCisJLyogR3JvdyByZWdpb24gdG8gYWNjb21tb2RhdGUgc3BlY2lmaWVkIHNpemUgICovCisJaWYgKGJhc2UgPCBjb25zaXN0ZW50X2Jhc2UpCisJCWNvbnNpc3RlbnRfYmFzZSA9IGJhc2U7Cit9CiAKICNpbmNsdWRlICJ2bXJlZ2lvbi5oIgogCiBzdGF0aWMgc3RydWN0IGFybV92bXJlZ2lvbl9oZWFkIGNvbnNpc3RlbnRfaGVhZCA9IHsKIAkudm1fbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKCZjb25zaXN0ZW50X2hlYWQudm1fbG9jayksCiAJLnZtX2xpc3QJPSBMSVNUX0hFQURfSU5JVChjb25zaXN0ZW50X2hlYWQudm1fbGlzdCksCi0JLnZtX3N0YXJ0CT0gQ09OU0lTVEVOVF9CQVNFLAogCS52bV9lbmQJCT0gQ09OU0lTVEVOVF9FTkQsCiB9OwogCkBAIC0xNTUsNyArMTY3LDE3IEBACiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlOwogCWludCBpID0gMDsKLQl1MzIgYmFzZSA9IENPTlNJU1RFTlRfQkFTRTsKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBjb25zaXN0ZW50X2Jhc2U7CisJdW5zaWduZWQgbG9uZyBudW1fcHRlcyA9IChDT05TSVNURU5UX0VORCAtIGJhc2UpID4+IFBHRElSX1NISUZUOworCisJY29uc2lzdGVudF9wdGUgPSBrbWFsbG9jKG51bV9wdGVzICogc2l6ZW9mKHB0ZV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb25zaXN0ZW50X3B0ZSkgeworCQlwcl9lcnIoIiVzOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJfZGVidWcoIkRNQSBtZW1vcnk6IDB4JTA4bHggLSAweCUwOGx4OlxuIiwgYmFzZSwgQ09OU0lTVEVOVF9FTkQpOworCWNvbnNpc3RlbnRfaGVhZC52bV9zdGFydCA9IGJhc2U7CiAKIAlkbyB7CiAJCXBnZCA9IHBnZF9vZmZzZXQoJmluaXRfbW0sIGJhc2UpOwpAQCAtMTk4LDcgKzIyMCw3IEBACiAJc2l6ZV90IGFsaWduOwogCWludCBiaXQ7CiAKLQlpZiAoIWNvbnNpc3RlbnRfcHRlWzBdKSB7CisJaWYgKCFjb25zaXN0ZW50X3B0ZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgaW5pdGlhbGlzZWRcbiIsIF9fZnVuY19fKTsKIAkJZHVtcF9zdGFjaygpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYwppbmRleCA3Y2FiNzkxLi43NTk5ZTI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKKysrIGIvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCkBAIC04LDcgKzgsNiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW5pdC5jIGIvYXJjaC9hcm0vbW0vaW5pdC5jCmluZGV4IGY4MDM3YmEuLmZiZGQxMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2luaXQuYworKysgYi9hcmNoL2FybS9tbS9pbml0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgpAQCAtNjYwLDkgKzY2MSw2IEBACiAJCQkiICAgIElUQ00gICAgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIGtCKVxuIgogI2VuZGlmCiAJCQkiICAgIGZpeG1hcCAgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIGtCKVxuIgotI2lmZGVmIENPTkZJR19NTVUKLQkJCSIgICAgRE1BICAgICA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTUIpXG4iCi0jZW5kaWYKIAkJCSIgICAgdm1hbGxvYyA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTUIpXG4iCiAJCQkiICAgIGxvd21lbSAgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIE1CKVxuIgogI2lmZGVmIENPTkZJR19ISUdITUVNCkBAIC02ODEsOSArNjc5LDYgQEAKIAkJCU1MSyhJVENNX09GRlNFVCwgKHVuc2lnbmVkIGxvbmcpIGl0Y21fZW5kKSwKICNlbmRpZgogCQkJTUxLKEZJWEFERFJfU1RBUlQsIEZJWEFERFJfVE9QKSwKLSNpZmRlZiBDT05GSUdfTU1VCi0JCQlNTE0oQ09OU0lTVEVOVF9CQVNFLCBDT05TSVNURU5UX0VORCksCi0jZW5kaWYKIAkJCU1MTShWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCksCiAJCQlNTE0oUEFHRV9PRkZTRVQsICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KSwKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtNzA2LDkgKzcwMSw2IEBACiAJICogYmUgZGV0ZWN0ZWQgYXQgYnVpbGQgdGltZSBhbHJlYWR5LgogCSAqLwogI2lmZGVmIENPTkZJR19NTVUKLQlCVUlMRF9CVUdfT04oVk1BTExPQ19FTkQJCQk+IENPTlNJU1RFTlRfQkFTRSk7Ci0JQlVHX09OKFZNQUxMT0NfRU5ECQkJCT4gQ09OU0lTVEVOVF9CQVNFKTsKLQogCUJVSUxEX0JVR19PTihUQVNLX1NJWkUJCQkJPiBNT0RVTEVTX1ZBRERSKTsKIAlCVUdfT04oVEFTS19TSVpFIAkJCQk+IE1PRFVMRVNfVkFERFIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDIyNmYxODAuLmRjOGM1NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0yNzMsNiArMjczLDE0IEBACiAJCS5wcm90X2wxICAgPSBQTURfVFlQRV9UQUJMRSwKIAkJLmRvbWFpbiAgICA9IERPTUFJTl9LRVJORUwsCiAJfSwKKwlbTVRfTUVNT1JZX1NPXSA9IHsKKwkJLnByb3RfcHRlICA9IExfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX0RJUlRZIHwKKwkJCQlMX1BURV9NVF9VTkNBQ0hFRCwKKwkJLnByb3RfbDEgICA9IFBNRF9UWVBFX1RBQkxFLAorCQkucHJvdF9zZWN0ID0gUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX1NFQ1RfUyB8CisJCQkJUE1EX1NFQ1RfVU5DQUNIRUQgfCBQTURfU0VDVF9YTiwKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9LRVJORUwsCisJfSwKIH07CiAKIGNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqZ2V0X21lbV90eXBlKHVuc2lnbmVkIGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggMmU2ODQ5Yi4uODhmYjNkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC0zNzksMzEgKzM3OSwyNiBAQAogCiAvKiBTdXNwZW5kL3Jlc3VtZSBzdXBwb3J0OiB0YWtlbiBmcm9tIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9zbGVlcC5TICovCiAuZ2xvYmwJY3B1X2FybTkyMF9zdXNwZW5kX3NpemUKLS5lcXUJY3B1X2FybTkyMF9zdXNwZW5kX3NpemUsIDQgKiA0CisuZXF1CWNwdV9hcm05MjBfc3VzcGVuZF9zaXplLCA0ICogMwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X2FybTkyMF9kb19zdXNwZW5kKQotCXN0bWZkCXNwISwge3I0IC0gcjcsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgUElECiAJbXJjCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1yYwlwMTUsIDAsIHI2LCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcwotCW1yYwlwMTUsIDAsIHI3LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCi0Jc3RtaWEJcjAsIHtyNCAtIHI3fQotCWxkbWZkCXNwISwge3I0IC0gcjcsIHBjfQorCW1yYwlwMTUsIDAsIHI2LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCisJc3RtaWEJcjAsIHtyNCAtIHI2fQorCWxkbWZkCXNwISwge3I0IC0gcjYsIHBjfQogRU5EUFJPQyhjcHVfYXJtOTIwX2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV9hcm05MjBfZG9fcmVzdW1lKQogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSBJK0QgVExCcwogCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJQCBpbnZhbGlkYXRlIEkrRCBjYWNoZXMKLQlsZG1pYQlyMCwge3I0IC0gcjd9CisJbGRtaWEJcjAsIHtyNCAtIHI2fQogCW1jcglwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgUElECiAJbWNyCXAxNSwgMCwgcjUsIGMzLCBjMCwgMAlAIERvbWFpbiBJRAotCW1jcglwMTUsIDAsIHI2LCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcwotCW1vdglyMCwgcjcJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI2LCBsc3IgIzE0CQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCA9UE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX0JJVDQgfCBQTURfU0VDVF9BUF9XUklURQorCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCBUVEIgYWRkcmVzcworCW1vdglyMCwgcjYJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKIAliCWNwdV9yZXN1bWVfbW11CiBFTkRQUk9DKGNwdV9hcm05MjBfZG9fcmVzdW1lKQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwppbmRleCBjZDhmNzljLi45ZjhmZDkxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKQEAgLTM5NCwzMSArMzk0LDI2IEBACiAKIC8qIFN1c3BlbmQvcmVzdW1lIHN1cHBvcnQ6IHRha2VuIGZyb20gYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3NsZWVwLlMgKi8KIC5nbG9ibAljcHVfYXJtOTI2X3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfYXJtOTI2X3N1c3BlbmRfc2l6ZSwgNCAqIDQKKy5lcXUJY3B1X2FybTkyNl9zdXNwZW5kX3NpemUsIDQgKiAzCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBFTlRSWShjcHVfYXJtOTI2X2RvX3N1c3BlbmQpCi0Jc3RtZmQJc3AhLCB7cjQgLSByNywgbHJ9CisJc3RtZmQJc3AhLCB7cjQgLSByNiwgbHJ9CiAJbXJjCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBQSUQKIAltcmMJcDE1LCAwLCByNSwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbXJjCXAxNSwgMCwgcjYsIGMyLCBjMCwgMAlAIFRUQiBhZGRyZXNzCi0JbXJjCXAxNSwgMCwgcjcsIGMxLCBjMCwgMAlAIENvbnRyb2wgcmVnaXN0ZXIKLQlzdG1pYQlyMCwge3I0IC0gcjd9Ci0JbGRtZmQJc3AhLCB7cjQgLSByNywgcGN9CisJbXJjCXAxNSwgMCwgcjYsIGMxLCBjMCwgMAlAIENvbnRyb2wgcmVnaXN0ZXIKKwlzdG1pYQlyMCwge3I0IC0gcjZ9CisJbGRtZmQJc3AhLCB7cjQgLSByNiwgcGN9CiBFTkRQUk9DKGNwdV9hcm05MjZfZG9fc3VzcGVuZCkKIAogRU5UUlkoY3B1X2FybTkyNl9kb19yZXN1bWUpCiAJbW92CWlwLCAjMAogCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJQCBpbnZhbGlkYXRlIEkrRCBUTEJzCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAlAIGludmFsaWRhdGUgSStEIGNhY2hlcwotCWxkbWlhCXIwLCB7cjQgLSByN30KKwlsZG1pYQlyMCwge3I0IC0gcjZ9CiAJbWNyCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBQSUQKIAltY3IJcDE1LCAwLCByNSwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjYsIGMyLCBjMCwgMAlAIFRUQiBhZGRyZXNzCi0JbW92CXIwLCByNwkJCUAgY29udHJvbCByZWdpc3RlcgotCW1vdglyMiwgcjYsIGxzciAjMTQJCUAgZ2V0IFRUQjAgYmFzZQotCW1vdglyMiwgcjIsIGxzbCAjMTQKLQlsZHIJcjMsID1QTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSB8IFwKLQkJICAgICBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfQklUNCB8IFBNRF9TRUNUX0FQX1dSSVRFCisJbWNyCXAxNSwgMCwgcjEsIGMyLCBjMCwgMAlAIFRUQiBhZGRyZXNzCisJbW92CXIwLCByNgkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X2FybTkyNl9kb19yZXN1bWUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCmluZGV4IDY5ZTdmMmUuLjdkOTE1NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtMTY4LDIwICsxNjgsMTkgQEAKIAltb3YJcGMsIGxyCiAKIC5nbG9ibAljcHVfc2ExMTAwX3N1c3BlbmRfc2l6ZQotLmVxdQljcHVfc2ExMTAwX3N1c3BlbmRfc2l6ZSwgNCo0CisuZXF1CWNwdV9zYTExMDBfc3VzcGVuZF9zaXplLCA0ICogMwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogRU5UUlkoY3B1X3NhMTEwMF9kb19zdXNwZW5kKQotCXN0bWZkCXNwISwge3I0IC0gcjcsIGxyfQorCXN0bWZkCXNwISwge3I0IC0gcjYsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMywgYzAsIDAJCUAgZG9tYWluIElECi0JbXJjCXAxNSwgMCwgcjUsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKLQltcmMJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAkJQCBQSUQKLQltcmMJcDE1LCAwLCByNywgYzEsIGMwLCAwCQlAIGNvbnRyb2wgcmVnCi0Jc3RtaWEJcjAsIHtyNCAtIHI3fQkJCUAgc3RvcmUgY3AgcmVncwotCWxkbWZkCXNwISwge3I0IC0gcjcsIHBjfQorCW1yYwlwMTUsIDAsIHI1LCBjMTMsIGMwLCAwCQlAIFBJRAorCW1yYwlwMTUsIDAsIHI2LCBjMSwgYzAsIDAJCUAgY29udHJvbCByZWcKKwlzdG1pYQlyMCwge3I0IC0gcjZ9CQkJQCBzdG9yZSBjcCByZWdzCisJbGRtZmQJc3AhLCB7cjQgLSByNiwgcGN9CiBFTkRQUk9DKGNwdV9zYTExMDBfZG9fc3VzcGVuZCkKIAogRU5UUlkoY3B1X3NhMTEwMF9kb19yZXN1bWUpCi0JbGRtaWEJcjAsIHtyNCAtIHI3fQkJCUAgbG9hZCBjcCByZWdzCisJbGRtaWEJcjAsIHtyNCAtIHI2fQkJCUAgbG9hZCBjcCByZWdzCiAJbW92CWlwLCAjMAogCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgZmx1c2ggSStEIFRMQnMKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCQlAIGZsdXNoIEkmRCBjYWNoZQpAQCAtMTg5LDEzICsxODgsOSBAQAogCW1jcglwMTUsIDAsIGlwLCBjOSwgYzAsIDUJCUAgYWxsb3cgdXNlciBzcGFjZSB0byB1c2UgUkIKIAogCW1jcglwMTUsIDAsIHI0LCBjMywgYzAsIDAJCUAgZG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjUsIGMyLCBjMCwgMAkJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKLQltY3IJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAkJQCBQSUQKLQltb3YJcjAsIHI3CQkJCUAgY29udHJvbCByZWdpc3RlcgotCW1vdglyMiwgcjUsIGxzciAjMTQJCQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCA9UE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfCBcCi0JCSAgICAgUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQVBfV1JJVEUKKwltY3IJcDE1LCAwLCByMSwgYzIsIGMwLCAwCQlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgorCW1jcglwMTUsIDAsIHI1LCBjMTMsIGMwLCAwCQlAIFBJRAorCW1vdglyMCwgcjYJCQkJQCBjb250cm9sIHJlZ2lzdGVyCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfc2ExMTAwX2RvX3Jlc3VtZSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IGE5MjNhYTAuLmQwNjFkMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTEyOCwyMCArMTI4LDE4IEBACiAKIC8qIFN1c3BlbmQvcmVzdW1lIHN1cHBvcnQ6IHRha2VuIGZyb20gYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NsZWVwLlMgKi8KIC5nbG9ibAljcHVfdjZfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV92Nl9zdXNwZW5kX3NpemUsIDQgKiA4CisuZXF1CWNwdV92Nl9zdXNwZW5kX3NpemUsIDQgKiA2CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBFTlRSWShjcHVfdjZfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CisJc3RtZmQJc3AhLCB7cjQgLSByOSwgbHJ9CiAJbXJjCXAxNSwgMCwgcjQsIGMxMywgYzAsIDAJQCBGQ1NFL1BJRAotCW1yYwlwMTUsIDAsIHI1LCBjMTMsIGMwLCAxCUAgQ29udGV4dCBJRAotCW1yYwlwMTUsIDAsIHI2LCBjMywgYzAsIDAJQCBEb21haW4gSUQKLQltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAwCUAgVHJhbnNsYXRpb24gdGFibGUgYmFzZSAwCi0JbXJjCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgMQotCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzAsIDEJQCBhdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgotCW1yYwlwMTUsIDAsIHIxMCwgYzEsIGMwLCAyCUAgY28tcHJvY2Vzc29yIGFjY2VzcyBjb250cm9sCi0JbXJjCXAxNSwgMCwgcjExLCBjMSwgYzAsIDAJQCBjb250cm9sIHJlZ2lzdGVyCi0Jc3RtaWEJcjAsIHtyNCAtIHIxMX0KLQlsZG1mZAlzcCEsIHtyNC0gcjExLCBwY30KKwltcmMJcDE1LCAwLCByNSwgYzMsIGMwLCAwCUAgRG9tYWluIElECisJbXJjCXAxNSwgMCwgcjYsIGMyLCBjMCwgMQlAIFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgMQorCW1yYwlwMTUsIDAsIHI3LCBjMSwgYzAsIDEJQCBhdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgorCW1yYwlwMTUsIDAsIHI4LCBjMSwgYzAsIDIJQCBjby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKKwltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAwCUAgY29udHJvbCByZWdpc3RlcgorCXN0bWlhCXIwLCB7cjQgLSByOX0KKwlsZG1mZAlzcCEsIHtyNC0gcjksIHBjfQogRU5EUFJPQyhjcHVfdjZfZG9fc3VzcGVuZCkKIAogRU5UUlkoY3B1X3Y2X2RvX3Jlc3VtZSkKQEAgLTE1MCwyNSArMTQ4LDIxIEBACiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNSwgMAlAIGludmFsaWRhdGUgSSBjYWNoZQogCW1jcglwMTUsIDAsIGlwLCBjNywgYzE1LCAwCUAgY2xlYW4raW52YWxpZGF0ZSBjYWNoZQogCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CUAgZHJhaW4gd3JpdGUgYnVmZmVyCi0JbGRtaWEJcjAsIHtyNCAtIHIxMX0KKwltY3IJcDE1LCAwLCBpcCwgYzEzLCBjMCwgMQlAIHNldCByZXNlcnZlZCBjb250ZXh0IElECisJbGRtaWEJcjAsIHtyNCAtIHI5fQogCW1jcglwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgRkNTRS9QSUQKLQltY3IJcDE1LCAwLCByNSwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKLQltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgMAotCW1jcglwMTUsIDAsIHI4LCBjMiwgYzAsIDEJQCBUcmFuc2xhdGlvbiB0YWJsZSBiYXNlIDEKLQltY3IJcDE1LCAwLCByOSwgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIKLQltY3IJcDE1LCAwLCByMTAsIGMxLCBjMCwgMglAIGNvLXByb2Nlc3NvciBhY2Nlc3MgY29udHJvbAorCW1jcglwMTUsIDAsIHI1LCBjMywgYzAsIDAJQCBEb21haW4gSUQKKwlBTFRfU01QKG9ycglyMSwgcjEsICNUVEJfRkxBR1NfU01QKQorCUFMVF9VUChvcnIJcjEsIHIxLCAjVFRCX0ZMQUdTX1VQKQorCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCBUcmFuc2xhdGlvbiB0YWJsZSBiYXNlIDAKKwltY3IJcDE1LCAwLCByNiwgYzIsIGMwLCAxCUAgVHJhbnNsYXRpb24gdGFibGUgYmFzZSAxCisJbWNyCXAxNSwgMCwgcjcsIGMxLCBjMCwgMQlAIGF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCisJbWNyCXAxNSwgMCwgcjgsIGMxLCBjMCwgMglAIGNvLXByb2Nlc3NvciBhY2Nlc3MgY29udHJvbAogCW1jcglwMTUsIDAsIGlwLCBjMiwgYzAsIDIJQCBUVEIgY29udHJvbCByZWdpc3RlcgogCW1jcglwMTUsIDAsIGlwLCBjNywgYzUsIDQJQCBJU0IKLQltb3YJcjAsIHIxMQkJCUAgY29udHJvbCByZWdpc3RlcgotCW1vdglyMiwgcjcsIGxzciAjMTQJCUAgZ2V0IFRUQjAgYmFzZQotCW1vdglyMiwgcjIsIGxzbCAjMTQKLQlsZHIJcjMsIGNwdV9yZXN1bWVfbDFfZmxhZ3MKKwltb3YJcjAsIHI5CQkJQCBjb250cm9sIHJlZ2lzdGVyCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfdjZfZG9fcmVzdW1lKQotY3B1X3Jlc3VtZV9sMV9mbGFnczoKLQlBTFRfU01QKC5sb25nIFBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9GTEFHU19TTVApCi0JQUxUX1VQKC5sb25nICBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRkxBR1NfVVApCiAjZW5kaWYKIAogCXN0cmluZwljcHVfdjZfbmFtZSwgIkFSTXY2LWNvbXBhdGlibGUgcHJvY2Vzc29yIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCmluZGV4IDk1OTFjOGUuLjJjNTU5YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKQEAgLTIxNyw1NiArMjE3LDUwIEBACiAKIC8qIFN1c3BlbmQvcmVzdW1lIHN1cHBvcnQ6IGRlcml2ZWQgZnJvbSBhcmNoL2FybS9tYWNoLXM1cHYyMTAvc2xlZXAuUyAqLwogLmdsb2JsCWNwdV92N19zdXNwZW5kX3NpemUKLS5lcXUJY3B1X3Y3X3N1c3BlbmRfc2l6ZSwgNCAqIDkKKy5lcXUJY3B1X3Y3X3N1c3BlbmRfc2l6ZSwgNCAqIDcKICNpZmRlZiBDT05GSUdfQVJNX0NQVV9TVVNQRU5ECiBFTlRSWShjcHVfdjdfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHIxMSwgbHJ9CisJc3RtZmQJc3AhLCB7cjQgLSByMTAsIGxyfQogCW1yYwlwMTUsIDAsIHI0LCBjMTMsIGMwLCAwCUAgRkNTRS9QSUQKLQltcmMJcDE1LCAwLCByNSwgYzEzLCBjMCwgMQlAIENvbnRleHQgSUQKLQltcmMJcDE1LCAwLCByNiwgYzEzLCBjMCwgMwlAIFVzZXIgci9vIHRocmVhZCBJRAotCXN0bWlhCXIwISwge3I0IC0gcjZ9CisJbXJjCXAxNSwgMCwgcjUsIGMxMywgYzAsIDMJQCBVc2VyIHIvbyB0aHJlYWQgSUQKKwlzdG1pYQlyMCEsIHtyNCAtIHI1fQogCW1yYwlwMTUsIDAsIHI2LCBjMywgYzAsIDAJQCBEb21haW4gSUQKLQltcmMJcDE1LCAwLCByNywgYzIsIGMwLCAwCUAgVFRCIDAKLQltcmMJcDE1LCAwLCByOCwgYzIsIGMwLCAxCUAgVFRCIDEKLQltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAwCUAgQ29udHJvbCByZWdpc3RlcgotCW1yYwlwMTUsIDAsIHIxMCwgYzEsIGMwLCAxCUAgQXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIKLQltcmMJcDE1LCAwLCByMTEsIGMxLCBjMCwgMglAIENvLXByb2Nlc3NvciBhY2Nlc3MgY29udHJvbAotCXN0bWlhCXIwLCB7cjYgLSByMTF9Ci0JbGRtZmQJc3AhLCB7cjQgLSByMTEsIHBjfQorCW1yYwlwMTUsIDAsIHI3LCBjMiwgYzAsIDEJQCBUVEIgMQorCW1yYwlwMTUsIDAsIHI4LCBjMSwgYzAsIDAJQCBDb250cm9sIHJlZ2lzdGVyCisJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMQlAIEF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyCisJbXJjCXAxNSwgMCwgcjEwLCBjMSwgYzAsIDIJQCBDby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKKwlzdG1pYQlyMCwge3I2IC0gcjEwfQorCWxkbWZkCXNwISwge3I0IC0gcjEwLCBwY30KIEVORFBST0MoY3B1X3Y3X2RvX3N1c3BlbmQpCiAKIEVOVFJZKGNwdV92N19kb19yZXN1bWUpCiAJbW92CWlwLCAjMAogCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJQCBpbnZhbGlkYXRlIFRMQnMKIAltY3IJcDE1LCAwLCBpcCwgYzcsIGM1LCAwCUAgaW52YWxpZGF0ZSBJIGNhY2hlCi0JbGRtaWEJcjAhLCB7cjQgLSByNn0KKwltY3IJcDE1LCAwLCBpcCwgYzEzLCBjMCwgMQlAIHNldCByZXNlcnZlZCBjb250ZXh0IElECisJbGRtaWEJcjAhLCB7cjQgLSByNX0KIAltY3IJcDE1LCAwLCByNCwgYzEzLCBjMCwgMAlAIEZDU0UvUElECi0JbWNyCXAxNSwgMCwgcjUsIGMxMywgYzAsIDEJQCBDb250ZXh0IElECi0JbWNyCXAxNSwgMCwgcjYsIGMxMywgYzAsIDMJQCBVc2VyIHIvbyB0aHJlYWQgSUQKLQlsZG1pYQlyMCwge3I2IC0gcjExfQorCW1jcglwMTUsIDAsIHI1LCBjMTMsIGMwLCAzCUAgVXNlciByL28gdGhyZWFkIElECisJbGRtaWEJcjAsIHtyNiAtIHIxMH0KIAltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCUAgRG9tYWluIElECi0JbWNyCXAxNSwgMCwgcjcsIGMyLCBjMCwgMAlAIFRUQiAwCi0JbWNyCXAxNSwgMCwgcjgsIGMyLCBjMCwgMQlAIFRUQiAxCisJQUxUX1NNUChvcnIJcjEsIHIxLCAjVFRCX0ZMQUdTX1NNUCkKKwlBTFRfVVAob3JyCXIxLCByMSwgI1RUQl9GTEFHU19VUCkKKwltY3IJcDE1LCAwLCByMSwgYzIsIGMwLCAwCUAgVFRCIDAKKwltY3IJcDE1LCAwLCByNywgYzIsIGMwLCAxCUAgVFRCIDEKIAltY3IJcDE1LCAwLCBpcCwgYzIsIGMwLCAyCUAgVFRCIGNvbnRyb2wgcmVnaXN0ZXIKIAltcmMJcDE1LCAwLCByNCwgYzEsIGMwLCAxCUAgUmVhZCBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgotCXRlcQlyNCwgcjEwCQkJQCBJcyBpdCBhbHJlYWR5IHNldD8KLQltY3JuZQlwMTUsIDAsIHIxMCwgYzEsIGMwLCAxCUAgTm8sIHNvIHdyaXRlIGl0Ci0JbWNyCXAxNSwgMCwgcjExLCBjMSwgYzAsIDIJQCBDby1wcm9jZXNzb3IgYWNjZXNzIGNvbnRyb2wKKwl0ZXEJcjQsIHI5CQkJQCBJcyBpdCBhbHJlYWR5IHNldD8KKwltY3JuZQlwMTUsIDAsIHI5LCBjMSwgYzAsIDEJQCBObywgc28gd3JpdGUgaXQKKwltY3IJcDE1LCAwLCByMTAsIGMxLCBjMCwgMglAIENvLXByb2Nlc3NvciBhY2Nlc3MgY29udHJvbAogCWxkcglyNCwgPVBSUlIJCUAgUFJSUgogCWxkcglyNSwgPU5NUlIJCUAgTk1SUgogCW1jcglwMTUsIDAsIHI0LCBjMTAsIGMyLCAwCUAgd3JpdGUgUFJSUgogCW1jcglwMTUsIDAsIHI1LCBjMTAsIGMyLCAxCUAgd3JpdGUgTk1SUgogCWlzYgogCWRzYgotCW1vdglyMCwgcjkJCQlAIGNvbnRyb2wgcmVnaXN0ZXIKLQltb3YJcjIsIHI3LCBsc3IgIzE0CQlAIGdldCBUVEIwIGJhc2UKLQltb3YJcjIsIHIyLCBsc2wgIzE0Ci0JbGRyCXIzLCBjcHVfcmVzdW1lX2wxX2ZsYWdzCisJbW92CXIwLCByOAkJCUAgY29udHJvbCByZWdpc3RlcgogCWIJY3B1X3Jlc3VtZV9tbXUKIEVORFBST0MoY3B1X3Y3X2RvX3Jlc3VtZSkKLWNwdV9yZXN1bWVfbDFfZmxhZ3M6Ci0JQUxUX1NNUCgubG9uZyBQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfRkxBR1NfU01QKQotCUFMVF9VUCgubG9uZyAgUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgUE1EX0ZMQUdTX1VQKQogI2VuZGlmCiAKIAlfX0NQVUlOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKaW5kZXggNzU1ZTFiZi4uYWJmMDUwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKQEAgLTQwNiwyNCArNDA2LDIzIEBACiAJLmFsaWduCiAKIC5nbG9ibAljcHVfeHNjM19zdXNwZW5kX3NpemUKLS5lcXUJY3B1X3hzYzNfc3VzcGVuZF9zaXplLCA0ICogNworLmVxdQljcHVfeHNjM19zdXNwZW5kX3NpemUsIDQgKiA2CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBFTlRSWShjcHVfeHNjM19kb19zdXNwZW5kKQotCXN0bWZkCXNwISwge3I0IC0gcjEwLCBscn0KKwlzdG1mZAlzcCEsIHtyNCAtIHI5LCBscn0KIAltcmMJcDE0LCAwLCByNCwgYzYsIGMwLCAwCUAgY2xvY2sgY29uZmlndXJhdGlvbiwgZm9yIHR1cmJvIG1vZGUKIAltcmMJcDE1LCAwLCByNSwgYzE1LCBjMSwgMAlAIENQIGFjY2VzcyByZWcKIAltcmMJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAlAIFBJRAogCW1yYyAJcDE1LCAwLCByNywgYzMsIGMwLCAwCUAgZG9tYWluIElECi0JbXJjIAlwMTUsIDAsIHI4LCBjMiwgYzAsIDAJQCB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIGFkZHIKLQltcmMJcDE1LCAwLCByOSwgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnCi0JbXJjIAlwMTUsIDAsIHIxMCwgYzEsIGMwLCAwCUAgY29udHJvbCByZWcKKwltcmMJcDE1LCAwLCByOCwgYzEsIGMwLCAxCUAgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnCisJbXJjIAlwMTUsIDAsIHI5LCBjMSwgYzAsIDAJQCBjb250cm9sIHJlZwogCWJpYwlyNCwgcjQsICMyCQlAIGNsZWFyIGZyZXF1ZW5jeSBjaGFuZ2UgYml0Ci0Jc3RtaWEJcjAsIHtyNCAtIHIxMH0JCUAgc3RvcmUgY3AgcmVncwotCWxkbWlhCXNwISwge3I0IC0gcjEwLCBwY30KKwlzdG1pYQlyMCwge3I0IC0gcjl9CQlAIHN0b3JlIGNwIHJlZ3MKKwlsZG1pYQlzcCEsIHtyNCAtIHI5LCBwY30KIEVORFBST0MoY3B1X3hzYzNfZG9fc3VzcGVuZCkKIAogRU5UUlkoY3B1X3hzYzNfZG9fcmVzdW1lKQotCWxkbWlhCXIwLCB7cjQgLSByMTB9CQlAIGxvYWQgY3AgcmVncworCWxkbWlhCXIwLCB7cjQgLSByOX0JCUAgbG9hZCBjcCByZWdzCiAJbW92CWlwLCAjMAogCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJQCBpbnZhbGlkYXRlIEkgJiBEIGNhY2hlcywgQlRCCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjMTAsIDQJQCBkcmFpbiB3cml0ZSAoJmZpbGwpIGJ1ZmZlcgpAQCAtNDMzLDE1ICs0MzIsMTAgQEAKIAltY3IJcDE1LCAwLCByNSwgYzE1LCBjMSwgMAlAIENQIGFjY2VzcyByZWcKIAltY3IJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAlAIFBJRAogCW1jcglwMTUsIDAsIHI3LCBjMywgYzAsIDAJQCBkb21haW4gSUQKLQltY3IJcDE1LCAwLCByOCwgYzIsIGMwLCAwCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyCi0JbWNyCXAxNSwgMCwgcjksIGMxLCBjMCwgMQlAIGF1eGlsaWFyeSBjb250cm9sIHJlZwotCi0JQCB0ZW1wb3JhcmlseSBtYXAgcmVzdW1lX3R1cm5fb25fbW11IGludG8gdGhlIHBhZ2UgdGFibGUsCi0JQCBvdGhlcndpc2UgcHJlZmV0Y2ggYWJvcnQgb2NjdXJzIGFmdGVyIE1NVSBpcyB0dXJuZWQgb24KLQltb3YJcjAsIHIxMAkJCUAgY29udHJvbCByZWdpc3RlcgotCW1vdglyMiwgcjgsIGxzciAjMTQJCUAgZ2V0IFRUQjAgYmFzZQotCW1vdglyMiwgcjIsIGxzbCAjMTQKLQlsZHIJcjMsID0weDU0MmUJCUAgc2VjdGlvbiBmbGFncworCW9ycglyMSwgcjEsICMweDE4CQlAIGNhY2hlIHRoZSBwYWdlIHRhYmxlIGluIEwyCisJbWNyCXAxNSwgMCwgcjEsIGMyLCBjMCwgMAlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgorCW1jcglwMTUsIDAsIHI4LCBjMSwgYzAsIDEJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKKwltb3YJcjAsIHI5CQkJQCBjb250cm9sIHJlZ2lzdGVyCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfeHNjM19kb19yZXN1bWUpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCmluZGV4IGZiYzA2ZTUuLjMyNzc5MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwpAQCAtNTIwLDI0ICs1MjAsMjMgQEAKIAkuYWxpZ24KIAogLmdsb2JsCWNwdV94c2NhbGVfc3VzcGVuZF9zaXplCi0uZXF1CWNwdV94c2NhbGVfc3VzcGVuZF9zaXplLCA0ICogNworLmVxdQljcHVfeHNjYWxlX3N1c3BlbmRfc2l6ZSwgNCAqIDYKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIEVOVFJZKGNwdV94c2NhbGVfZG9fc3VzcGVuZCkKLQlzdG1mZAlzcCEsIHtyNCAtIHIxMCwgbHJ9CisJc3RtZmQJc3AhLCB7cjQgLSByOSwgbHJ9CiAJbXJjCXAxNCwgMCwgcjQsIGM2LCBjMCwgMAlAIGNsb2NrIGNvbmZpZ3VyYXRpb24sIGZvciB0dXJibyBtb2RlCiAJbXJjCXAxNSwgMCwgcjUsIGMxNSwgYzEsIDAJQCBDUCBhY2Nlc3MgcmVnCiAJbXJjCXAxNSwgMCwgcjYsIGMxMywgYzAsIDAJQCBQSUQKIAltcmMJcDE1LCAwLCByNywgYzMsIGMwLCAwCUAgZG9tYWluIElECi0JbXJjCXAxNSwgMCwgcjgsIGMyLCBjMCwgMAlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgotCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzEsIDAJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKLQltcmMJcDE1LCAwLCByMTAsIGMxLCBjMCwgMAlAIGNvbnRyb2wgcmVnCisJbXJjCXAxNSwgMCwgcjgsIGMxLCBjMSwgMAlAIGF1eGlsaWFyeSBjb250cm9sIHJlZworCW1yYwlwMTUsIDAsIHI5LCBjMSwgYzAsIDAJQCBjb250cm9sIHJlZwogCWJpYwlyNCwgcjQsICMyCQlAIGNsZWFyIGZyZXF1ZW5jeSBjaGFuZ2UgYml0Ci0Jc3RtaWEJcjAsIHtyNCAtIHIxMH0JCUAgc3RvcmUgY3AgcmVncwotCWxkbWZkCXNwISwge3I0IC0gcjEwLCBwY30KKwlzdG1pYQlyMCwge3I0IC0gcjl9CQlAIHN0b3JlIGNwIHJlZ3MKKwlsZG1mZAlzcCEsIHtyNCAtIHI5LCBwY30KIEVORFBST0MoY3B1X3hzY2FsZV9kb19zdXNwZW5kKQogCiBFTlRSWShjcHVfeHNjYWxlX2RvX3Jlc3VtZSkKLQlsZG1pYQlyMCwge3I0IC0gcjEwfQkJQCBsb2FkIGNwIHJlZ3MKKwlsZG1pYQlyMCwge3I0IC0gcjl9CQlAIGxvYWQgY3AgcmVncwogCW1vdglpcCwgIzAKIAltY3IJcDE1LCAwLCBpcCwgYzgsIGM3LCAwCUAgaW52YWxpZGF0ZSBJICYgRCBUTEJzCiAJbWNyCXAxNSwgMCwgaXAsIGM3LCBjNywgMAlAIGludmFsaWRhdGUgSSAmIEQgY2FjaGVzLCBCVEIKQEAgLTU0NSwxMyArNTQ0LDkgQEAKIAltY3IJcDE1LCAwLCByNSwgYzE1LCBjMSwgMAlAIENQIGFjY2VzcyByZWcKIAltY3IJcDE1LCAwLCByNiwgYzEzLCBjMCwgMAlAIFBJRAogCW1jcglwMTUsIDAsIHI3LCBjMywgYzAsIDAJQCBkb21haW4gSUQKLQltY3IJcDE1LCAwLCByOCwgYzIsIGMwLCAwCUAgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBhZGRyCi0JbWNyCXAxNSwgMCwgcjksIGMxLCBjMSwgMAlAIGF1eGlsaWFyeSBjb250cm9sIHJlZwotCW1vdglyMCwgcjEwCQkJQCBjb250cm9sIHJlZ2lzdGVyCi0JbW92CXIyLCByOCwgbHNyICMxNAkJQCBnZXQgVFRCMCBiYXNlCi0JbW92CXIyLCByMiwgbHNsICMxNAotCWxkcglyMywgPVBNRF9UWVBFX1NFQ1QgfCBQTURfU0VDVF9CVUZGRVJBQkxFIHwgXAotCQkgICAgIFBNRF9TRUNUX0NBQ0hFQUJMRSB8IFBNRF9TRUNUX0FQX1dSSVRFCisJbWNyCXAxNSwgMCwgcjEsIGMyLCBjMCwgMAlAIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2UgYWRkcgorCW1jcglwMTUsIDAsIHI4LCBjMSwgYzEsIDAJQCBhdXhpbGlhcnkgY29udHJvbCByZWcKKwltb3YJcjAsIHI5CQkJQCBjb250cm9sIHJlZ2lzdGVyCiAJYgljcHVfcmVzdW1lX21tdQogRU5EUFJPQyhjcHVfeHNjYWxlX2RvX3Jlc3VtZSkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvZ3Bpby5jCmluZGV4IDY0MGU0OTguLmU0ZGU5YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtaW9wL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC9ncGlvLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb3AzeHguaD4KIAogdm9pZCBncGlvX2xpbmVfY29uZmlnKGludCBsaW5lLCBpbnQgZGlyZWN0aW9uKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jIGIvYXJjaC9hcm0vcGxhdC1pb3AvdGltZS5jCmluZGV4IDdjZGM1MTYuLjU2OGRkMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtaW9wL3RpbWUuYworKysgYi9hcmNoL2FybS9wbGF0LWlvcC90aW1lLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NjaGVkX2Nsb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZwppbmRleCA0YzhmZGJjLi5iM2ExZjJiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9LY29uZmlnCkBAIC00LDUwICs0LDM0IEBACiAKIG1lbnUgIkZyZWVzY2FsZSBNWEMgSW1wbGVtZW50YXRpb25zIgogCi1jb25maWcgQVJDSF9NWDUwX1NVUFBPUlRFRAotCWJvb2wKLQotY29uZmlnIEFSQ0hfTVg1M19TVVBQT1JURUQKLQlib29sCi0KIGNob2ljZQogCXByb21wdCAiRnJlZXNjYWxlIENQVSBmYW1pbHk6IgotCWRlZmF1bHQgQVJDSF9NWDMKKwlkZWZhdWx0IEFSQ0hfSU1YX1Y2X1Y3CiAKLWNvbmZpZyBBUkNIX01YMQotCWJvb2wgIk1YMS1iYXNlZCIKK2NvbmZpZyBBUkNIX0lNWF9WNF9WNQorCWJvb2wgImkuTVgxLCBpLk1YMjEsIGkuTVgyNSwgaS5NWDI3IgorCXNlbGVjdCBBVVRPX1pSRUxBRERSIGlmICFaQk9PVF9ST00KKwlzZWxlY3QgQVJNX1BBVENIX1BIWVNfVklSVAogCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDEgZmFtaWx5CisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVggQVJNdjQKKwkgIGFuZCBBUk12NSBTb0NzCiAKLWNvbmZpZyBBUkNIX01YMgotCWJvb2wgIk1YMi1iYXNlZCIKK2NvbmZpZyBBUkNIX0lNWF9WNl9WNworCWJvb2wgImkuTVgzLCBpLk1YNiIKKwlzZWxlY3QgQVVUT19aUkVMQUREUiBpZiAhWkJPT1RfUk9NCisJc2VsZWN0IEFSTV9QQVRDSF9QSFlTX1ZJUlQKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVgyIGZhbWlseQorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMyBhbmQgaS5NWDYKKwkgIGZhbWlseS4KIAotY29uZmlnIEFSQ0hfTVgyNQotCWJvb2wgIk1YMjUtYmFzZWQiCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgYmFzZWQgb24gdGhlIEZyZWVzY2FsZSBpLk1YMjUgZmFtaWx5Ci0KLWNvbmZpZyBBUkNIX01YMwotCWJvb2wgIk1YMy1iYXNlZCIKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyBiYXNlZCBvbiB0aGUgRnJlZXNjYWxlIGkuTVgzIGZhbWlseQotCi1jb25maWcgQVJDSF9NWDUwMwotCWJvb2wgImkuTVg1MCArIGkuTVg1MyIKLQlzZWxlY3QgQVJDSF9NWDUwX1NVUFBPUlRFRAotCXNlbGVjdCBBUkNIX01YNTNfU1VQUE9SVEVECitjb25maWcgQVJDSF9NWDUKKwlib29sICJpLk1YNTAsIGkuTVg1MSwgaS5NWDUzIgorCXNlbGVjdCBBVVRPX1pSRUxBRERSIGlmICFaQk9PVF9ST00KKwlzZWxlY3QgQVJNX1BBVENIX1BIWVNfVklSVAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBtYWNoaW5lcyB1c2luZyBGcmVlc2NhbGUncyBpLk1YNTAgYW5kIGkuTVg1MwogCSAgcHJvY2Vzc29ycy4KIAotY29uZmlnIEFSQ0hfTVg1MQotCWJvb2wgImkuTVg1MSIKLQlzZWxlY3QgQVJDSF9NWDUxX1NVUFBPUlRFRAotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIGJhc2VkIG9uIHRoZSBGcmVlc2NhbGUgaS5NWDUxIGZhbWlseQotCiBlbmRjaG9pY2UKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWlteC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQppbmRleCBkNTNjMzVmLi5iOWYwZjVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKICMgQ29tbW9uIHN1cHBvcnQKIG9iai15IDo9IGNsb2NrLm8gdGltZS5vIGRldmljZXMubyBjcHUubyBzeXN0ZW0ubyBpcnEtY29tbW9uLm8KIAotIyBNWDUxIHVzZXMgdGhlIFRaSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIsIG9sZGVyIHBsYXRmb3JtcyB1c2UgQVZJQworb2JqLSQoQ09ORklHX0FSTV9HSUMpICs9IGdpYy5vCiBvYmotJChDT05GSUdfTVhDX1RaSUMpICs9IHR6aWMubwogb2JqLSQoQ09ORklHX01YQ19BVklDKSArPSBhdmljLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvYXVkbXV4LXYyLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYwppbmRleCAxNzVlMzY0Li44Y2NlZDM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9hdWRtdXgtdjIuYwpAQCAtMTg3LDE4ICsxODcsMTEgQEAKIHN0YXRpYyBpbnQgbXhjX2F1ZG11eF92Ml9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01YNSkKIAlpZiAoY3B1X2lzX214NTEoKSkgewogCQlhdWRtdXhfYmFzZSA9IE1YNTFfSU9fQUREUkVTUyhNWDUxX0FVRE1VWF9CQVNFX0FERFIpOwotCQlyZXQgPSAwOwotCQlyZXR1cm4gcmV0OwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVgzKQotCWlmIChjcHVfaXNfbXgzMSgpKQorCX0gZWxzZSBpZiAoY3B1X2lzX214MzEoKSkgewogCQlhdWRtdXhfYmFzZSA9IE1YMzFfSU9fQUREUkVTUyhNWDMxX0FVRE1VWF9CQVNFX0FERFIpOwotCi0JZWxzZSBpZiAoY3B1X2lzX214MzUoKSkgeworCX0gZWxzZSBpZiAoY3B1X2lzX214MzUoKSkgewogCQlhdWRtdXhfY2xrID0gY2xrX2dldChOVUxMLCAiYXVkbXV4Iik7CiAJCWlmIChJU19FUlIoYXVkbXV4X2NsaykpIHsKIAkJCXJldCA9IFBUUl9FUlIoYXVkbXV4X2Nsayk7CkBAIC0yMDcsMTAgKzIwMCw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCWF1ZG11eF9iYXNlID0gTVgzNV9JT19BRERSRVNTKE1YMzVfQVVETVVYX0JBU0VfQUREUik7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0lNWDI1KQotCWlmIChjcHVfaXNfbXgyNSgpKSB7CisJfSBlbHNlIGlmIChjcHVfaXNfbXgyNSgpKSB7CiAJCWF1ZG11eF9jbGsgPSBjbGtfZ2V0KE5VTEwsICJhdWRtdXgiKTsKIAkJaWYgKElTX0VSUihhdWRtdXhfY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihhdWRtdXhfY2xrKTsKQEAgLTIyMCw3ICsyMTAsNyBAQAogCQl9CiAJCWF1ZG11eF9iYXNlID0gTVgyNV9JT19BRERSRVNTKE1YMjVfQVVETVVYX0JBU0VfQUREUik7CiAJfQotI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX1NPQ19JTVgyNSkgKi8KKwogCWF1ZG11eF9kZWJ1Z2ZzX2luaXQoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvYXZpYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvYXZpYy5jCmluZGV4IDU1ZDI1MzQuLjU1ZjE1NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2F2aWMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9hdmljLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogI2luY2x1ZGUgImlycS1jb21tb24uaCIKQEAgLTUwLDYgKzUxLDggQEAKIAogdm9pZCBfX2lvbWVtICphdmljX2Jhc2U7CiAKK3N0YXRpYyB1MzIgYXZpY19zYXZlZF9tYXNrX3JlZ1syXTsKKwogI2lmZGVmIENPTkZJR19NWENfSVJRX1BSSU9SCiBzdGF0aWMgaW50IGF2aWNfaXJxX3NldF9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGlycSwgdW5zaWduZWQgY2hhciBwcmlvKQogewpAQCAtOTAsMjQgKzkzLDggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfRklRICovCiAKLS8qIERpc2FibGUgaW50ZXJydXB0IG51bWJlciAiaXJxIiBpbiB0aGUgQVZJQyAqLwotc3RhdGljIHZvaWQgbXhjX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlfX3Jhd193cml0ZWwoZC0+aXJxLCBhdmljX2Jhc2UgKyBBVklDX0lOVERJU05VTSk7Ci19CiAKLS8qIEVuYWJsZSBpbnRlcnJ1cHQgbnVtYmVyICJpcnEiIGluIHRoZSBBVklDICovCi1zdGF0aWMgdm9pZCBteGNfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JX19yYXdfd3JpdGVsKGQtPmlycSwgYXZpY19iYXNlICsgQVZJQ19JTlRFTk5VTSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhjX2lycV9jaGlwIG14Y19hdmljX2NoaXAgPSB7Ci0JLmJhc2UgPSB7Ci0JCS5pcnFfYWNrID0gbXhjX21hc2tfaXJxLAotCQkuaXJxX21hc2sgPSBteGNfbWFza19pcnEsCi0JCS5pcnFfdW5tYXNrID0gbXhjX3VubWFza19pcnEsCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgbXhjX2V4dHJhX2lycSBhdmljX2V4dHJhX2lycSA9IHsKICNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgogCS5zZXRfcHJpb3JpdHkgPSBhdmljX2lycV9zZXRfcHJpb3JpdHksCiAjZW5kaWYKQEAgLTExNiw2ICsxMDMsNjggQEAKICNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgYXZpY19pcnFfc3VzcGVuZChzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJaW50IGlkeCA9IGdjLT5pcnFfYmFzZSA+PiA1OworCisJYXZpY19zYXZlZF9tYXNrX3JlZ1tpZHhdID0gX19yYXdfcmVhZGwoYXZpY19iYXNlICsgY3QtPnJlZ3MubWFzayk7CisJX19yYXdfd3JpdGVsKGdjLT53YWtlX2FjdGl2ZSwgYXZpY19iYXNlICsgY3QtPnJlZ3MubWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGF2aWNfaXJxX3Jlc3VtZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJaW50IGlkeCA9IGdjLT5pcnFfYmFzZSA+PiA1OworCisJX19yYXdfd3JpdGVsKGF2aWNfc2F2ZWRfbWFza19yZWdbaWR4XSwgYXZpY19iYXNlICsgY3QtPnJlZ3MubWFzayk7Cit9CisKKyNlbHNlCisjZGVmaW5lIGF2aWNfaXJxX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhdmljX2lycV9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBfX2luaXQgdm9pZCBhdmljX2luaXRfZ2ModW5zaWduZWQgaW50IGlycV9zdGFydCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJc3RydWN0IGlycV9jaGlwX3R5cGUgKmN0OworCWludCBpZHggPSBpcnFfc3RhcnQgPj4gNTsKKworCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgibXhjLWF2aWMiLCAxLCBpcnFfc3RhcnQsIGF2aWNfYmFzZSwKKwkJCQkgICAgaGFuZGxlX2xldmVsX2lycSk7CisJZ2MtPnByaXZhdGUgPSAmYXZpY19leHRyYV9pcnE7CisJZ2MtPndha2VfZW5hYmxlZCA9IElSUV9NU0soMzIpOworCisJY3QgPSBnYy0+Y2hpcF90eXBlczsKKwljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY19tYXNrX3NldF9iaXQ7CisJY3QtPmNoaXAuaXJxX2FjayA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJY3QtPmNoaXAuaXJxX3NldF93YWtlID0gaXJxX2djX3NldF93YWtlOworCWN0LT5jaGlwLmlycV9zdXNwZW5kID0gYXZpY19pcnFfc3VzcGVuZDsKKwljdC0+Y2hpcC5pcnFfcmVzdW1lID0gYXZpY19pcnFfcmVzdW1lOworCWN0LT5yZWdzLm1hc2sgPSAhaWR4ID8gQVZJQ19JTlRFTkFCTEVMIDogQVZJQ19JTlRFTkFCTEVIOworCWN0LT5yZWdzLmFjayA9IGN0LT5yZWdzLm1hc2s7CisKKwlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKDMyKSwgMCwgSVJRX05PUkVRVUVTVCwgMCk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgYXZpY19oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBuaXZlY3RvcjsKKworCWRvIHsKKwkJbml2ZWN0b3IgPSBfX3Jhd19yZWFkbChhdmljX2Jhc2UgKyBBVklDX05JVkVDU1IpID4+IDE2OworCQlpZiAobml2ZWN0b3IgPT0gMHhmZmZmKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlX0lSUShuaXZlY3RvciwgcmVncyk7CisJfSB3aGlsZSAoMSk7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBBVklDIGhhcmR3YXJlIGFuZCBkaXNhYmxlcyBhbGwgdGhlCiAgKiBpbnRlcnJ1cHRzLiBJdCByZWdpc3RlcnMgdGhlIGludGVycnVwdCBlbmFibGUgYW5kIGRpc2FibGUgZnVuY3Rpb25zCkBAIC0xNDAsMTEgKzE4OSw5IEBACiAJLyogYWxsIElSUSBubyBGSVEgKi8KIAlfX3Jhd193cml0ZWwoMCwgYXZpY19iYXNlICsgQVZJQ19JTlRUWVBFSCk7CiAJX19yYXdfd3JpdGVsKDAsIGF2aWNfYmFzZSArIEFWSUNfSU5UVFlQRUwpOwotCWZvciAoaSA9IDA7IGkgPCBBVklDX05VTV9JUlFTOyBpKyspIHsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZteGNfYXZpY19jaGlwLmJhc2UsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKLQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVZJQ19OVU1fSVJRUzsgaSArPSAzMikKKwkJYXZpY19pbml0X2djKGkpOwogCiAJLyogU2V0IGRlZmF1bHQgcHJpb3JpdHkgdmFsdWUgKDApIGZvciBhbGwgSVJRJ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQpAQCAtMTU3LDQgKzIwNCwzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJNWEMgSVJRIGluaXRpYWxpemVkXG4iKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvY3B1LmMgYi9hcmNoL2FybS9wbGF0LW14Yy9jcHUuYwppbmRleCAzODZlMGQ1Li5mNWI3ZTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9jcHUuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9jcHUuYwpAQCAtMSw1ICsxLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogdW5zaWduZWQgaW50IF9fbXhjX2NwdV90eXBlOwogRVhQT1JUX1NZTUJPTChfX214Y19jcHVfdHlwZSk7CkBAIC05LDMgKzEwLDExIEBACiAJX19teGNfY3B1X3R5cGUgPSB0eXBlOwogfQogCit2b2lkIGlteF9wcmludF9zaWxpY29uX3Jldihjb25zdCBjaGFyICpjcHUsIGludCBzcmV2KQoreworCWlmIChzcmV2ID09IElNWF9DSElQX1JFVklTSU9OX1VOS05PV04pCisJCXByX2luZm8oIkNQVSBpZGVudGlmaWVkIGFzICVzLCB1bmtub3duIHJldmlzaW9uXG4iLCBjcHUpOworCWVsc2UKKwkJcHJfaW5mbygiQ1BVIGlkZW50aWZpZWQgYXMgJXMsIHNpbGljb24gcmV2ICVkLiVkXG4iLAorCQkJCWNwdSwgKHNyZXYgPj4gNCkgJiAweGYsIHNyZXYgJiAweGYpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy5jCmluZGV4IGEzNGIyYWUuLjRkNTVhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzLmMKQEAgLTIzLDIwICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KIAotaW50IF9faW5pdCBteGNfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldDsKLQotCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gZGF0YTsKLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihwZGV2KTsKLQlpZiAocmV0KQotCQlwcl9kZWJ1ZygiVW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZSAnJXMnOiAlZFxuIiwKLQkJCSBwZGV2LT5uYW1lLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RydWN0IGRldmljZSBteGNfYWlwc19idXMgPSB7CiAJLmluaXRfbmFtZQk9ICJteGNfYWlwcyIsCiAJLnBhcmVudAkJPSAmcGxhdGZvcm1fYnVzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9LY29uZmlnCmluZGV4IGJkMjk0YWQuLmNiM2UzZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvS2NvbmZpZworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fRkVDCiAJYm9vbAotCWRlZmF1bHQgeSBpZiBBUkNIX01YMjUgfHwgU09DX0lNWDI3IHx8IFNPQ19JTVgzNSB8fCBTT0NfSU1YNTEgfHwgU09DX0lNWDUzCisJZGVmYXVsdCB5IGlmIEFSQ0hfTVgyNSB8fCBTT0NfSU1YMjcgfHwgU09DX0lNWDM1IHx8IFNPQ19JTVg1MCB8fCBTT0NfSU1YNTEgfHwgU09DX0lNWDUzCiAKIGNvbmZpZyBJTVhfSEFWRV9QTEFURk9STV9GTEVYQ0FOCiAJc2VsZWN0IEhBVkVfQ0FOX0ZMRVhDQU4gaWYgQ0FOCkBAIC0zMSw2ICszMSw5IEBACiBjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0tFWVBBRAogCWJvb2wKIAorY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX1BBVEFfSU1YCisJYm9vbAorCiBjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1NTSQogCWJvb2wKIApAQCAtNzYsMyArNzksNyBAQAogCiBjb25maWcgSU1YX0hBVkVfUExBVEZPUk1fU1BJX0lNWAogCWJvb2wKKworY29uZmlnIElNWF9IQVZFX1BMQVRGT1JNX0FIQ0kKKwlib29sCisJZGVmYXVsdCB5IGlmIEFSQ0hfTVg1MwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvTWFrZWZpbGUKaW5kZXggYjQxYmY5Ny4uYzExYWM4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fSU1YX0ZCKSArPSBwbGF0Zm9ybS1pbXgtZmIubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWF9JMkMpICs9IHBsYXRmb3JtLWlteC1pMmMubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX0lNWF9LRVlQQUQpICs9IHBsYXRmb3JtLWlteC1rZXlwYWQubworb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX1BBVEFfSU1YKSArPSBwbGF0Zm9ybS1wYXRhX2lteC5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fSU1YX1NTSSkgKz0gcGxhdGZvcm0taW14LXNzaS5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQpICs9IHBsYXRmb3JtLWlteC11YXJ0Lm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9JTVhfVURDKSArPSBwbGF0Zm9ybS1pbXhfdWRjLm8KQEAgLTI1LDMgKzI2LDQgQEAKIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9NWENfVzEpICs9IHBsYXRmb3JtLW14Y193MS5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fU0RIQ0lfRVNESENfSU1YKSArPSBwbGF0Zm9ybS1zZGhjaS1lc2RoYy1pbXgubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX1NQSV9JTVgpICs9ICBwbGF0Zm9ybS1zcGlfaW14Lm8KK29iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9BSENJKSArPSAgcGxhdGZvcm0tYWhjaS1pbXgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1haGNpLWlteC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1haGNpLWlteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTU2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWFoY2ktaW14LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KKworI2RlZmluZSBpbXhfYWhjaV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfZGV2aWQpCQlcCisJewkJCQkJCQkJXAorCQkuZGV2aWQgPSBfZGV2aWQsCQkJCQlcCisJCS5pb2Jhc2UgPSBzb2MgIyMgX1NBVEFfQkFTRV9BRERSLAkJCVwKKwkJLmlycSA9IHNvYyAjIyBfSU5UX1NBVEEsCQkJCVwKKwl9CisKKyNpZmRlZiBDT05GSUdfU09DX0lNWDUzCitjb25zdCBzdHJ1Y3QgaW14X2FoY2lfaW14X2RhdGEgaW14NTNfYWhjaV9pbXhfZGF0YSBfX2luaXRjb25zdCA9CisJaW14X2FoY2lfaW14X2RhdGFfZW50cnlfc2luZ2xlKE1YNTMsICJpbXg1My1haGNpIik7CisjZW5kaWYKKworZW51bSB7CisJSE9TVF9DQVAgPSAweDAwLAorCUhPU1RfQ0FQX1NTUyA9ICgxIDw8IDI3KSwgLyogU3RhZ2dlcmVkIFNwaW4tdXAgKi8KKwlIT1NUX1BPUlRTX0lNUEwJPSAweDBjLAorCUhPU1RfVElNRVIxTVMgPSAweGUwLCAvKiBUaW1lciAxLW1zICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqc2F0YV9jbGssICpzYXRhX3JlZl9jbGs7CisKKy8qIEFIQ0kgbW9kdWxlIEluaXRpYWxpemF0aW9uLCBpZiByZXR1cm4gMCwgaW5pdGlhbGl6YXRpb24gaXMgc3VjY2Vzc2Z1bC4gKi8KK3N0YXRpYyBpbnQgaW14X3NhdGFfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgdG1wZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwlzYXRhX2NsayA9IGNsa19nZXQoZGV2LCAiYWhjaSIpOworCWlmIChJU19FUlIoc2F0YV9jbGspKSB7CisJCWRldl9lcnIoZGV2LCAibm8gc2F0YSBjbG9jay5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihzYXRhX2Nsayk7CisJfQorCXJldCA9IGNsa19lbmFibGUoc2F0YV9jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBlbmFibGUgc2F0YSBjbG9jay5cbiIpOworCQlnb3RvIHB1dF9zYXRhX2NsazsKKwl9CisKKwkvKiBHZXQgdGhlIEFIQ0kgU0FUQSBQSFkgQ0xLICovCisJc2F0YV9yZWZfY2xrID0gY2xrX2dldChkZXYsICJhaGNpX3BoeSIpOworCWlmIChJU19FUlIoc2F0YV9yZWZfY2xrKSkgeworCQlkZXZfZXJyKGRldiwgIm5vIHNhdGEgcmVmIGNsb2NrLlxuIik7CisJCXJldCA9IFBUUl9FUlIoc2F0YV9yZWZfY2xrKTsKKwkJZ290byByZWxlYXNlX3NhdGFfY2xrOworCX0KKwlyZXQgPSBjbGtfZW5hYmxlKHNhdGFfcmVmX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImNhbid0IGVuYWJsZSBzYXRhIHJlZiBjbG9jay5cbiIpOworCQlnb3RvIHB1dF9zYXRhX3JlZl9jbGs7CisJfQorCisJLyogR2V0IHRoZSBBSEIgY2xvY2sgcmF0ZSwgYW5kIGNvbmZpZ3VyZSB0aGUgVElNRVIxTVMgcmVnIGxhdGVyICovCisJY2xrID0gY2xrX2dldChkZXYsICJhaGNpX2RtYSIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlkZXZfZXJyKGRldiwgIm5vIGRtYSBjbG9jay5cbiIpOworCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJCWdvdG8gcmVsZWFzZV9zYXRhX3JlZl9jbGs7CisJfQorCXRtcGRhdGEgPSBjbGtfZ2V0X3JhdGUoY2xrKSAvIDEwMDA7CisJY2xrX3B1dChjbGspOworCisJd3JpdGVsKHRtcGRhdGEsIGFkZHIgKyBIT1NUX1RJTUVSMU1TKTsKKworCXRtcGRhdGEgPSByZWFkbChhZGRyICsgSE9TVF9DQVApOworCWlmICghKHRtcGRhdGEgJiBIT1NUX0NBUF9TU1MpKSB7CisJCXRtcGRhdGEgfD0gSE9TVF9DQVBfU1NTOworCQl3cml0ZWwodG1wZGF0YSwgYWRkciArIEhPU1RfQ0FQKTsKKwl9CisKKwlpZiAoIShyZWFkbChhZGRyICsgSE9TVF9QT1JUU19JTVBMKSAmIDB4MSkpCisJCXdyaXRlbCgocmVhZGwoYWRkciArIEhPU1RfUE9SVFNfSU1QTCkgfCAweDEpLAorCQkJYWRkciArIEhPU1RfUE9SVFNfSU1QTCk7CisKKwlyZXR1cm4gMDsKKworcmVsZWFzZV9zYXRhX3JlZl9jbGs6CisJY2xrX2Rpc2FibGUoc2F0YV9yZWZfY2xrKTsKK3B1dF9zYXRhX3JlZl9jbGs6CisJY2xrX3B1dChzYXRhX3JlZl9jbGspOworcmVsZWFzZV9zYXRhX2NsazoKKwljbGtfZGlzYWJsZShzYXRhX2Nsayk7CitwdXRfc2F0YV9jbGs6CisJY2xrX3B1dChzYXRhX2Nsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbXhfc2F0YV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljbGtfZGlzYWJsZShzYXRhX3JlZl9jbGspOworCWNsa19wdXQoc2F0YV9yZWZfY2xrKTsKKworCWNsa19kaXNhYmxlKHNhdGFfY2xrKTsKKwljbGtfcHV0KHNhdGFfY2xrKTsKKworfQorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfYWhjaV9pbXgoCisJCWNvbnN0IHN0cnVjdCBpbXhfYWhjaV9pbXhfZGF0YSAqZGF0YSwKKwkJY29uc3Qgc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHJlc291cmNlIHJlc1tdID0geworCQl7CisJCQkuc3RhcnQgPSBkYXRhLT5pb2Jhc2UsCisJCQkuZW5kID0gZGF0YS0+aW9iYXNlICsgU1pfNEsgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sIHsKKwkJCS5zdGFydCA9IGRhdGEtPmlycSwKKwkJCS5lbmQgPSBkYXRhLT5pcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soZGF0YS0+ZGV2aWQsIDAsCisJCQlyZXMsIEFSUkFZX1NJWkUocmVzKSwKKwkJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSwgIERNQV9CSVRfTUFTSygzMikpOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14NTNfYWRkX2FoY2lfaW14KHZvaWQpCit7CisJc3RydWN0IGFoY2lfcGxhdGZvcm1fZGF0YSBwZGF0YSA9IHsKKwkJLmluaXQgPSBpbXhfc2F0YV9pbml0LAorCQkuZXhpdCA9IGlteF9zYXRhX2V4aXQsCisJfTsKKworCXJldHVybiBpbXhfYWRkX2FoY2lfaW14KCZpbXg1M19haGNpX2lteF9kYXRhLCAmcGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mc2wtdXNiMi11ZGMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZnNsLXVzYjItdWRjLmMKaW5kZXggMjNjZTA4ZS4uODQ4MDM4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mc2wtdXNiMi11ZGMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZzbC11c2IyLXVkYy5jCkBAIC0zNiw2ICszNiwxMSBAQAogCWlteF9mc2xfdXNiMl91ZGNfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSk7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgzNSAqLwogCisjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQorY29uc3Qgc3RydWN0IGlteF9mc2xfdXNiMl91ZGNfZGF0YSBpbXg1MV9mc2xfdXNiMl91ZGNfZGF0YSBfX2luaXRjb25zdCA9CisJaW14X2ZzbF91c2IyX3VkY19kYXRhX2VudHJ5X3NpbmdsZShNWDUxKTsKKyNlbmRpZgorCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9mc2xfdXNiMl91ZGMoCiAJCWNvbnN0IHN0cnVjdCBpbXhfZnNsX3VzYjJfdWRjX2RhdGEgKmRhdGEsCiAJCWNvbnN0IHN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWkyYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtaTJjLmMKaW5kZXggYWZlNjBmNy4uMTlhZDU4MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtaTJjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtaTJjLmMKQEAgLTg1LDYgKzg1LDEyIEBACiAJaW14X2lteF9pMmNfZGF0YV9lbnRyeShNWDUxLCBfaWQsIF9od2lkLCBTWl80SykKIAlpbXg1MV9pbXhfaTJjX2RhdGFfZW50cnkoMCwgMSksCiAJaW14NTFfaW14X2kyY19kYXRhX2VudHJ5KDEsIDIpLAorCXsKKwkJLmlkID0gMiwKKwkJLmlvYmFzZSA9IE1YNTFfSFNJMkNfRE1BX0JBU0VfQUREUiwKKwkJLmlvc2l6ZSA9IFNaXzE2SywKKwkJLmlycSA9IE1YNTFfSU5UX0hTX0kyQywKKwl9LAogfTsKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDUxICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tbXhjLWVoY2kuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tbXhjLWVoY2kuYwppbmRleCBlMTc2M2UwLi4zNTg1MWQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLW14Yy1laGNpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1teGMtZWhjaS5jCkBAIC00OSw2ICs0OSwxNSBAQAogCWlteF9teGNfZWhjaV9kYXRhX2VudHJ5X3NpbmdsZShNWDM1LCAxLCBIUyk7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgzNSAqLwogCisjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQorY29uc3Qgc3RydWN0IGlteF9teGNfZWhjaV9kYXRhIGlteDUxX214Y19laGNpX290Z19kYXRhIF9faW5pdGNvbnN0ID0KKwlpbXhfbXhjX2VoY2lfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MSwgMCwgT1RHKTsKK2NvbnN0IHN0cnVjdCBpbXhfbXhjX2VoY2lfZGF0YSBpbXg1MV9teGNfZWhjaV9oc19kYXRhW10gX19pbml0Y29uc3QgPSB7CisJaW14X214Y19laGNpX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIDEsIEhTMSksCisJaW14X214Y19laGNpX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIDIsIEhTMiksCit9OworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTEgKi8KKwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfbXhjX2VoY2koCiAJCWNvbnN0IHN0cnVjdCBpbXhfbXhjX2VoY2lfZGF0YSAqZGF0YSwKIAkJY29uc3Qgc3RydWN0IG14Y191c2JoX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1wYXRhX2lteC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1wYXRhX2lteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTJmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLXBhdGFfaW14LmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgorCisjZGVmaW5lIGlteF9wYXRhX2lteF9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9zaXplKQkJCVwKKwl7CQkJCQkJCQlcCisJCS5pb2Jhc2UgPSBzb2MgIyMgX0FUQV9CQVNFX0FERFIsCQkJXAorCQkuaW9zaXplID0gX3NpemUsCQkJCQlcCisJCS5pcnEgPSBzb2MgIyMgX0lOVF9BVEEsCQkJCQlcCisJfQorCisjaWZkZWYgQ09ORklHX1NPQ19JTVgyNworY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDI3X3BhdGFfaW14X2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9wYXRhX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDI3LCBTWl80Syk7CisjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgyNyAqLworCisjaWZkZWYgQ09ORklHX1NPQ19JTVgzMQorY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDMxX3BhdGFfaW14X2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9wYXRhX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDMxLCBTWl8xNkspOworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMzEgKi8KKworI2lmZGVmIENPTkZJR19TT0NfSU1YMzUKK2NvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSBpbXgzNV9wYXRhX2lteF9kYXRhIF9faW5pdGNvbnN0ID0KKwlpbXhfcGF0YV9pbXhfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSwgU1pfMTZLKTsKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDM1ICovCisKKyNpZmRlZiBDT05GSUdfU09DX0lNWDUxCitjb25zdCBzdHJ1Y3QgaW14X3BhdGFfaW14X2RhdGEgaW14NTFfcGF0YV9pbXhfZGF0YSBfX2luaXRjb25zdCA9CisJaW14X3BhdGFfaW14X2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsIFNaXzE2Syk7CisjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVg1MSAqLworCisjaWZkZWYgQ09ORklHX1NPQ19JTVg1MworY29uc3Qgc3RydWN0IGlteF9wYXRhX2lteF9kYXRhIGlteDUzX3BhdGFfaW14X2RhdGEgX19pbml0Y29uc3QgPQorCWlteF9wYXRhX2lteF9kYXRhX2VudHJ5X3NpbmdsZShNWDUzLCBTWl8xNkspOworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTMgKi8KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfcGF0YV9pbXgoCisJCWNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzW10gPSB7CisJCXsKKwkJCS5zdGFydCA9IGRhdGEtPmlvYmFzZSwKKwkJCS5lbmQgPSBkYXRhLT5pb2Jhc2UgKyBkYXRhLT5pb3NpemUgLSAxLAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJCXsKKwkJCS5zdGFydCA9IGRhdGEtPmlycSwKKwkJCS5lbmQgPSBkYXRhLT5pcnEsCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJfSwKKwl9OworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgicGF0YV9pbXgiLCAtMSwKKwkJCXJlcywgQVJSQVlfU0laRShyZXMpLCBOVUxMLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZ2ljLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmY4ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZ2ljLmMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2lmZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjZW5kaWYKKworYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSBnaWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgaXJxc3RhdCwgaXJxbnI7CisKKwlkbyB7CisJCWlycXN0YXQgPSByZWFkbF9yZWxheGVkKGdpY19jcHVfYmFzZV9hZGRyICsgR0lDX0NQVV9JTlRBQ0spOworCQlpcnFuciA9IGlycXN0YXQgJiAweDNmZjsKKwkJaWYgKGlycW5yID09IDEwMjMpCisJCQlicmVhazsKKworCQlpZiAoaXJxbnIgPiAxNSAmJiBpcnFuciA8IDEwMjEpCisJCQloYW5kbGVfSVJRKGlycW5yLCByZWdzKTsKKyNpZmRlZiBDT05GSUdfU01QCisJCWVsc2UgeworCQkJd3JpdGVsX3JlbGF4ZWQoaXJxc3RhdCwgZ2ljX2NwdV9iYXNlX2FkZHIgKworCQkJCQkJR0lDX0NQVV9FT0kpOworCQkJaGFuZGxlX0lQSShpcnFuciwgcmVncyk7CisJCX0KKyNlbmRpZgorCX0gd2hpbGUgKDEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2NvbW1vbi5oCmluZGV4IDRlM2Q5NzguLjgzYjc0NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvY29tbW9uLmgKQEAgLTEzLDYgKzEzLDcgQEAKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIHN0cnVjdCBjbGs7CitlbnVtIG14Y19jcHVfcHdyX21vZGU7CiAKIGV4dGVybiB2b2lkIG14MV9tYXBfaW8odm9pZCk7CiBleHRlcm4gdm9pZCBteDIxX21hcF9pbyh2b2lkKTsKQEAgLTY0LDEyICs2NSw3MiBAQAogCQkJdW5zaWduZWQgbG9uZyBja2loMSwgdW5zaWduZWQgbG9uZyBja2loMik7CiBleHRlcm4gaW50IG14NTNfY2xvY2tzX2luaXQodW5zaWduZWQgbG9uZyBja2lsLCB1bnNpZ25lZCBsb25nIG9zYywKIAkJCXVuc2lnbmVkIGxvbmcgY2tpaDEsIHVuc2lnbmVkIGxvbmcgY2tpaDIpOworZXh0ZXJuIGludCBteDUxX2Nsb2Nrc19pbml0X2R0KHZvaWQpOworZXh0ZXJuIGludCBteDUzX2Nsb2Nrc19pbml0X2R0KHZvaWQpOworZXh0ZXJuIGludCBteDZxX2Nsb2Nrc19pbml0KHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm14Y19yZWdpc3Rlcl9ncGlvKGNoYXIgKm5hbWUsIGludCBpZCwKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlLCByZXNvdXJjZV9zaXplX3QgaW9zaXplLCBpbnQgaXJxLCBpbnQgaXJxX2hpZ2gpOwotZXh0ZXJuIGludCBteGNfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmRhdGEpOwogZXh0ZXJuIHZvaWQgbXhjX3NldF9jcHVfdHlwZSh1bnNpZ25lZCBpbnQgdHlwZSk7CiBleHRlcm4gdm9pZCBteGNfYXJjaF9yZXNldF9pbml0KHZvaWQgX19pb21lbSAqKTsKIGV4dGVybiB2b2lkIG14NTFfZWZpa2FteF9yZXNldCh2b2lkKTsKIGV4dGVybiBpbnQgbXg1M19yZXZpc2lvbih2b2lkKTsKIGV4dGVybiBpbnQgbXg1M19kaXNwbGF5X3JldmlzaW9uKHZvaWQpOworCitlbnVtIG14Y19jcHVfcHdyX21vZGUgeworCVdBSVRfQ0xPQ0tFRCwJCS8qIHdmaSBvbmx5ICovCisJV0FJVF9VTkNMT0NLRUQsCQkvKiBXQUlUICovCisJV0FJVF9VTkNMT0NLRURfUE9XRVJfT0ZGLAkvKiBXQUlUICsgU1JQRyAqLworCVNUT1BfUE9XRVJfT04sCQkvKiBqdXN0IFNUT1AgKi8KKwlTVE9QX1BPV0VSX09GRiwJCS8qIFNUT1AgKyBTUlBHICovCit9OworCitleHRlcm4gdm9pZCBteDVfY3B1X2xwX3NldChlbnVtIG14Y19jcHVfcHdyX21vZGUgbW9kZSk7CitleHRlcm4gdm9pZCAoKmlteF9pZGxlKSh2b2lkKTsKK2V4dGVybiB2b2lkIGlteF9wcmludF9zaWxpY29uX3Jldihjb25zdCBjaGFyICpjcHUsIGludCBzcmV2KTsKKwordm9pZCBhdmljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKik7Cit2b2lkIHR6aWNfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqKTsKK3ZvaWQgZ2ljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKik7CisKKyNkZWZpbmUgaW14MV9oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXgyMV9oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXgyNV9oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXgyN19oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXgzMV9oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXgzNV9oYW5kbGVfaXJxIGF2aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXg1MF9oYW5kbGVfaXJxIHR6aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXg1MV9oYW5kbGVfaXJxIHR6aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXg1M19oYW5kbGVfaXJxIHR6aWNfaGFuZGxlX2lycQorI2RlZmluZSBpbXg2cV9oYW5kbGVfaXJxIGdpY19oYW5kbGVfaXJxCisKK2V4dGVybiB2b2lkIGlteF9lbmFibGVfY3B1KGludCBjcHUsIGJvb2wgZW5hYmxlKTsKK2V4dGVybiB2b2lkIGlteF9zZXRfY3B1X2p1bXAoaW50IGNwdSwgdm9pZCAqanVtcF9hZGRyKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfTEwKK2V4dGVybiB2b2lkIGlteF9sbHVhcnRfbWFwX2lvKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbXhfbGx1YXJ0X21hcF9pbyh2b2lkKSB7fQorI2VuZGlmCitleHRlcm4gdm9pZCB2N19jcHVfcmVzdW1lKHZvaWQpOworZXh0ZXJuIHUzMiAqcGwzMTBfZ2V0X3NhdmVfcHRyKHZvaWQpOworI2lmZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIHY3X3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOworZXh0ZXJuIHZvaWQgaW14X3NjdV9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBpbXhfc21wX3ByZXBhcmUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGlteF9zY3VfbWFwX2lvKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgaW14X3NtcF9wcmVwYXJlKHZvaWQpIHt9CisjZW5kaWYKK2V4dGVybiB2b2lkIGlteF9lbmFibGVfY3B1KGludCBjcHUsIGJvb2wgZW5hYmxlKTsKK2V4dGVybiB2b2lkIGlteF9zZXRfY3B1X2p1bXAoaW50IGNwdSwgdm9pZCAqanVtcF9hZGRyKTsKK2V4dGVybiB2b2lkIGlteF9zcmNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteF9ncGNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteF9ncGNfcHJlX3N1c3BlbmQodm9pZCk7CitleHRlcm4gdm9pZCBpbXhfZ3BjX3Bvc3RfcmVzdW1lKHZvaWQpOworZXh0ZXJuIHZvaWQgaW14NTFfYmFiYmFnZV9jb21tb25faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUzX2FyZF9jb21tb25faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUzX2V2a19jb21tb25faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUzX3FzYl9jb21tb25faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGlteDUzX3NtZF9jb21tb25faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgaW14NnFfc2V0X2xwbShlbnVtIG14Y19jcHVfcHdyX21vZGUgbW9kZSk7CitleHRlcm4gdm9pZCBpbXg2cV9wbV9pbml0KHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGU0ZGRlOTEuLjZlMTkyYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xMiw0OSArMTIsMjUgQEAKICAqLwogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2lmZGVmIENPTkZJR19TT0NfSU1YMQorI2lmZGVmIENPTkZJR19ERUJVR19JTVgxX1VBUlQKICNkZWZpbmUgVUFSVF9QQUREUglNWDFfVUFSVDFfQkFTRV9BRERSCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TT0NfSU1YMjUKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0RFQlVHX0lNWDI1X1VBUlQpCiAjZGVmaW5lIFVBUlRfUEFERFIJTVgyNV9VQVJUMV9CQVNFX0FERFIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0lNWDIxKSB8fCBkZWZpbmVkIChDT05GSUdfU09DX0lNWDI3KQotI2lmZGVmIFVBUlRfUEFERFIKLSNlcnJvciAiQ09ORklHX0RFQlVHX0xMIGlzIGluY29tcGF0aWJsZSB3aXRoIG11bHRpcGxlIGFyY2hzIgotI2VuZGlmCisjZWxpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfSU1YMjFfSU1YMjdfVUFSVCkKICNkZWZpbmUgVUFSVF9QQUREUglNWDJ4X1VBUlQxX0JBU0VfQUREUgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YMzEpIHx8IGRlZmluZWQoQ09ORklHX1NPQ19JTVgzNSkKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0RFQlVHX0lNWDMxX0lNWDM1X1VBUlQpCiAjZGVmaW5lIFVBUlRfUEFERFIJTVgzeF9VQVJUMV9CQVNFX0FERFIKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NPQ19JTVg1MQotI2lmZGVmIFVBUlRfUEFERFIKLSNlcnJvciAiQ09ORklHX0RFQlVHX0xMIGlzIGluY29tcGF0aWJsZSB3aXRoIG11bHRpcGxlIGFyY2hzIgotI2VuZGlmCisjZWxpZiBkZWZpbmVkIChDT05GSUdfREVCVUdfSU1YNTFfVUFSVCkKICNkZWZpbmUgVUFSVF9QQUREUglNWDUxX1VBUlQxX0JBU0VfQUREUgotI2VuZGlmCi0KLS8qIGlNWDUwLzUzIGhhdmUgc2FtZSBhZGRyZXNzZXMsIGJ1dCBub3QgaU1YNTEgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfSU1YNTApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19JTVg1MykKLSNpZmRlZiBVQVJUX1BBRERSCi0jZXJyb3IgIkNPTkZJR19ERUJVR19MTCBpcyBpbmNvbXBhdGlibGUgd2l0aCBtdWx0aXBsZSBhcmNocyIKLSNlbmRpZgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0RFQlVHX0lNWDUwX0lNWDUzX1VBUlQpCiAjZGVmaW5lIFVBUlRfUEFERFIJTVg1M19VQVJUMV9CQVNFX0FERFIKKyNlbGlmIGRlZmluZWQgKENPTkZJR19ERUJVR19JTVg2UV9VQVJUKQorI2RlZmluZSBVQVJUX1BBRERSCU1YNlFfVUFSVDRfQkFTRV9BRERSCiAjZW5kaWYKIAogI2RlZmluZSBVQVJUX1ZBRERSCUlNWF9JT19BRERSRVNTKFVBUlRfUEFERFIpCiAKLQkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKKwkJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYsIHRtcAogCQlsZHIJXHJwLCA9VUFSVF9QQUREUglAIHBoeXNpY2FsCiAJCWxkcglccnYsID1VQVJUX1ZBRERSCUAgdmlydHVhbAogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAppbmRleCA1NDM1MjVkLi5kZWY5YmE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApAQCAtMjYzLDYgKzI2MywxNCBAQAogCQljb25zdCBzdHJ1Y3QgaW14X214Y19uYW5kX2RhdGEgKmRhdGEsCiAJCWNvbnN0IHN0cnVjdCBteGNfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CiAKK3N0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSB7CisJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QgaW9zaXplOworCXJlc291cmNlX3NpemVfdCBpcnE7Cit9Oworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfcGF0YV9pbXgoCisJCWNvbnN0IHN0cnVjdCBpbXhfcGF0YV9pbXhfZGF0YSAqZGF0YSk7CisKIHN0cnVjdCBpbXhfbXhjX3B3bV9kYXRhIHsKIAlpbnQgaWQ7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKQEAgLTMxMywzICszMjEsMTMgQEAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfaW14X2RtYSh2b2lkKTsKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfaW14X3NkbWEoY2hhciAqbmFtZSwKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlLCBpbnQgaXJxLCBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CitzdHJ1Y3QgaW14X2FoY2lfaW14X2RhdGEgeworCWNvbnN0IGNoYXIgKmRldmlkOworCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CisJcmVzb3VyY2Vfc2l6ZV90IGlycTsKK307CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9haGNpX2lteCgKKwkJY29uc3Qgc3RydWN0IGlteF9haGNpX2lteF9kYXRhICpkYXRhLAorCQljb25zdCBzdHJ1Y3QgYWhjaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IDA2NmQ0NjQuLmNhNWNmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC05LDcyICs5LDE5IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorLyogVW51c2VkLCB3ZSB1c2UgQ09ORklHX01VTFRJX0lSUV9IQU5ETEVSICovCiAKLSNkZWZpbmUgQVZJQ19OSU1BU0sJMHgwNAotCi0JQCB0aGlzIG1hY3JvIGRpc2FibGVzIGZhc3QgaXJxIChub3QgaW1wbGVtZW50ZWQpCiAJLm1hY3JvCWRpc2FibGVfZmlxCiAJLmVuZG0KIAogCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLSNpZm5kZWYgQ09ORklHX01YQ19UWklDCi0JbGRyCVxiYXNlLCA9YXZpY19iYXNlCi0JbGRyCVxiYXNlLCBbXGJhc2VdCi0jaWZkZWYgQ09ORklHX01YQ19JUlFfUFJJT1IKLQlsZHIJcjQsIFtcYmFzZSwgI0FWSUNfTklNQVNLXQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkIENPTkZJR19NWENfVFpJQwotCWxkcglcYmFzZSwgPXR6aWNfYmFzZQotCWxkcglcYmFzZSwgW1xiYXNlXQotI2VuZGlmIC8qIENPTkZJR19NWENfVFpJQyAqLwogCS5lbmRtCiAKIAkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKIAkuZW5kbQogCi0JQCB0aGlzIG1hY3JvIGNoZWNrcyB3aGljaCBpbnRlcnJ1cHQgb2NjdXJyZWQKLQlAIGFuZCByZXR1cm5zIGl0cyBudW1iZXIgaW4gaXJxbnIKLQlAIGFuZCByZXR1cm5zIGlmIGFuIGludGVycnVwdCBvY2N1cnJlZCBpbiBpcnFzdGF0CiAJLm1hY3JvCWdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAotI2lmbmRlZiBDT05GSUdfTVhDX1RaSUMKLQlAIExvYWQgb2Zmc2V0ICYgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkKLQlAIGludGVycnVwdCBwZW5kaW5nIGZyb20gQVZJQ19OSVZFQ1NSCi0JbGRyCVxpcnFzdGF0LCBbXGJhc2UsICMweDQwXQotCUAgU2hpZnQgdG8gZ2V0IHRoZSBkZWNvZGVkIElSUSBudW1iZXIsIHVzaW5nIEFTUiBzbwotCUAgJ25vIGludGVycnVwdCBwZW5kaW5nJyBiZWNvbWVzIDB4ZmZmZmZmZmYKLQltb3YJXGlycW5yLCBcaXJxc3RhdCwgYXNyICMxNgotCUAgc2V0IHplcm8gZmxhZyBpZiBJUlEgKyAxID09IDAKLQlhZGRzCVx0bXAsIFxpcnFuciwgIzEKLSNpZmRlZiBDT05GSUdfTVhDX0lSUV9QUklPUgotCWJpY25lCVx0bXAsIFxpcnFzdGF0LCAjMHhGRkZGRkZFMAotCXN0cm5lCVx0bXAsIFtcYmFzZSwgI0FWSUNfTklNQVNLXQotCXN0cmVxCXI0LCBbXGJhc2UsICNBVklDX05JTUFTS10KLSNlbmRpZgotI2VsaWYgZGVmaW5lZCBDT05GSUdfTVhDX1RaSUMKLQlAIExvYWQgb2Zmc2V0ICYgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkKLQlAIGludGVycnVwdCBwZW5kaW5nLgotCUAgMHgwODAgaXMgSU5UU0VDMCByZWdpc3RlcgotCUAgMHhEODAgaXMgSElQTkQwIHJlZ2lzdGVyCi0JbW92ICAgICBcaXJxbnIsICMwCi0xMDAwOglhZGQJXGlycXN0YXQsIFxiYXNlLCBcaXJxbnIsIGxzciAjMwotCWxkcglcdG1wLCBbXGlycXN0YXQsICMweGQ4MF0KLQlsZHIJXGlycXN0YXQsIFtcaXJxc3RhdCwgIzB4MDgwXQotCWFuZHMJXHRtcCwgXHRtcCwgXGlycXN0YXQKLQlibmUJMTAwMWYKLQlhZGQJXGlycW5yLCBcaXJxbnIsICMzMgotCWNtcCAgICAgXGlycW5yLCAjMTI4Ci0JYmxvICAgICAxMDAwYgotCWIgICAgICAgMjAwMWYKLTEwMDE6CW1vdiAgICAgXGlycXN0YXQsICMxCi0xMDAyOgl0c3QgICAgIFx0bXAsIFxpcnFzdGF0Ci0JYm5lICAgICAyMDAyZgotCW1vdnMgICAgXHRtcCwgXHRtcCwgbHNyICMxCi0JYWRkbmUgICBcaXJxbnIsIFxpcnFuciwgIzEKLQlibmUgICAgIDEwMDJiCi0yMDAxOgotCW1vdiAgXGlycW5yLCAjMAotMjAwMjoKLQltb3ZzIFxpcnFuciwgXGlycW5yCi0jZW5kaWYKKwkuZW5kbQorCisJLm1hY3JvIHRlc3RfZm9yX2lwaSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHRtcAogCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAzMWM4MjBjLi40MGE4YzE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTEsMzkgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX0dQSU9fSF9fCi0jZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX0dQSU9fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLQotLyogVGhlcmUncyBhIG9mZi1ieS1vbmUgYmV0d2VlbSB0aGUgZ3BpbyBiYW5rIG51bWJlciBhbmQgdGhlIGdwaW9jaGlwICovCi0vKiByYW5nZSBlLmcuIEdQSU9fMV81IGlzIGdwaW8gNSB1bmRlciBsaW51eCAqLwotI2RlZmluZSBJTVhfR1BJT19OUihiYW5rLCBucikJCSgoKGJhbmspIC0gMSkgKiAzMiArIChucikpCi0KLS8qIHVzZSBncGlvbGliIGRpc3BhdGNoZXJzICovCi0jZGVmaW5lIGdwaW9fZ2V0X3ZhbHVlCQlfX2dwaW9fZ2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJCV9fZ3Bpb19jYW5zbGVlcAotCi0jZGVmaW5lIGdwaW9fdG9faXJxKGdwaW8pCShNWENfR1BJT19JUlFfU1RBUlQgKyAoZ3BpbykpCi0jZGVmaW5lIGlycV90b19ncGlvKGlycSkJKChpcnEpIC0gTVhDX0dQSU9fSVJRX1NUQVJUKQotCi0jZW5kaWYKKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IGE4YmZkNTYuLmE1OTlmMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC04MSwxMSArODEsMjEgQEAKICAqCUFJUFMxCTB4NTNmMDAwMDArMHgxMDAwMDAJLT4JMHhmNTcwMDAwMCsweDEwMDAwMAogICoJQUlQUzIJMHg2M2YwMDAwMCsweDEwMDAwMAktPgkweGY1MzAwMDAwKzB4MTAwMDAwCiAgKiBteDUxOgorICoJVFpJQwkweGUwMDAwMDAwKzB4MDA0MDAwCS0+CTB4ZjUwMDAwMDArMHgwMDQwMDAKICAqCUlSQU0JMHgxZmZlMDAwMCsweDAyMDAwMAktPgkweGY0ZmUwMDAwKzB4MDIwMDAwCi0gKglERUJVRwkweDYwMDAwMDAwKzB4MTAwMDAwCS0+CTB4ZjUwMDAwMDArMHgxMDAwMDAKICAqCVNQQkEwCTB4NzAwMDAwMDArMHgxMDAwMDAJLT4JMHhmNTQwMDAwMCsweDEwMDAwMAogICoJQUlQUzEJMHg3M2YwMDAwMCsweDEwMDAwMAktPgkweGY1NzAwMDAwKzB4MTAwMDAwCiAgKglBSVBTMgkweDgzZjAwMDAwKzB4MTAwMDAwCS0+CTB4ZjQzMDAwMDArMHgxMDAwMDAKKyAqIG14NTM6CisgKglUWklDCTB4MGZmZmMwMDArMHgwMDQwMDAJLT4JMHhmNGJmYzAwMCsweDAwNDAwMAorICoJU1BCQTAJMHg1MDAwMDAwMCsweDEwMDAwMAktPgkweGY1NDAwMDAwKzB4MTAwMDAwCisgKglBSVBTMQkweDUzZjAwMDAwKzB4MTAwMDAwCS0+CTB4ZjU3MDAwMDArMHgxMDAwMDAKKyAqCUFJUFMyCTB4NjNmMDAwMDArMHgxMDAwMDAJLT4JMHhmNTMwMDAwMCsweDEwMDAwMAorICogbXg2cToKKyAqCVNDVQkweDAwYTAwMDAwKzB4MDAxMDAwCS0+CTB4ZjQwMDAwMDArMHgwMDEwMDAKKyAqCUNDTQkweDAyMGM0MDAwKzB4MDA0MDAwCS0+CTB4ZjQyYzQwMDArMHgwMDQwMDAKKyAqCUFOQVRPUAkweDAyMGM4MDAwKzB4MDAxMDAwCS0+CTB4ZjQyYzgwMDArMHgwMDEwMDAKKyAqCVVBUlQ0CTB4MDIxZjAwMDArMHgwMDQwMDAJLT4JMHhmNDJmMDAwMCsweDAwNDAwMAogICovCiAjZGVmaW5lIElNWF9JT19QMlYoeCkJKAkJCQkJCVwKIAkJCTB4ZjQwMDAwMDAgKwkJCQkJXApAQCAtOTcsNiArMTA3LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvbXhjLmg+CiAKKyNpbmNsdWRlIDxtYWNoL214NnEuaD4KICNpbmNsdWRlIDxtYWNoL214NTAuaD4KICNpbmNsdWRlIDxtYWNoL214NTEuaD4KICNpbmNsdWRlIDxtYWNoL214NTMuaD4KQEAgLTExNiw0ICsxMjcsMTAgQEAKIAkudHlwZSA9IF90eXBlLAkJCQkJCQlcCiB9CiAKKy8qIFRoZXJlJ3MgYSBvZmYtYnktb25lIGJldHdlZW0gdGhlIGdwaW8gYmFuayBudW1iZXIgYW5kIHRoZSBncGlvY2hpcCAqLworLyogcmFuZ2UgZS5nLiBHUElPXzFfNSBpcyBncGlvIDUgdW5kZXIgbGludXggKi8KKyNkZWZpbmUgSU1YX0dQSU9fTlIoYmFuaywgbnIpCQkoKChiYW5rKSAtIDEpICogMzIgKyAobnIpKQorCisjZGVmaW5lIElNWF9HUElPX1RPX0lSUShncGlvKQkoTVhDX0dQSU9fSVJRX1NUQVJUICsgKGdwaW8pKQorCiAjZW5kaWYgLyogX19BU01fQVJDSF9NWENfSEFSRFdBUkVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaTJjLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaTJjLmgKaW5kZXggNGE1ZGM1Yy4uMzc1Y2RkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2kyYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pMmMuaApAQCAtMTEsMTQgKzExLDEwIEBACiAKIC8qKgogICogc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhIC0gc3RydWN0dXJlIG9mIHBsYXRmb3JtIGRhdGEgZm9yIE1YQyBJMkMgZHJpdmVyCi0gKiBAaW5pdDoJSW5pdGlhbGlzZSBncGlvJ3MgYW5kIG90aGVyIGJvYXJkIHNwZWNpZmljIHRoaW5ncwotICogQGV4aXQ6CUZyZWUgZXZlcnl0aGluZyBpbml0aWFsaXNlZCBieSBAaW5pdAogICogQGJpdHJhdGU6CUJ1cyBzcGVlZCBtZWFzdXJlZCBpbiBIegogICoKICAqKi8KIHN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGRldmljZSAqZGV2KTsKLQl2b2lkICgqZXhpdCkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgYml0cmF0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggNDM0N2E4Ny4uMzM4MzAwYjE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW8uaApAQCAtMTQsMzIgKzE0LDIyIEBACiAvKiBBbGxvdyBJTyBzcGFjZSB0byBiZSBhbnl3aGVyZSBpbiB0aGUgbWVtb3J5ICovCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVgzMSkgfHwgZGVmaW5lZChDT05GSUdfU09DX0lNWDM1KQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQogI2RlZmluZSBfX2FyY2hfaW9yZW1hcCBfX2lteF9pb3JlbWFwCiAjZGVmaW5lIF9fYXJjaF9pb3VubWFwIF9faW91bm1hcAogCiAjZGVmaW5lIGFkZHJfaW5fbW9kdWxlKGFkZHIsIG1vZCkgXAogCSgodW5zaWduZWQgbG9uZykoYWRkcikgLSBtb2QgIyMgX0JBU0VfQUREUiA8IG1vZCAjIyBfU0laRSkKIAorZXh0ZXJuIHZvaWQgX19pb21lbSAqKCppbXhfaW9yZW1hcCkodW5zaWduZWQgbG9uZywgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCiBfX2lteF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IG10eXBlKQogewotCWlmIChtdHlwZSA9PSBNVF9ERVZJQ0UgJiYgKGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MzUoKSkpIHsKLQkJLyoKLQkJICogQWNjZXNzIGFsbCBwZXJpcGhlcmFscyBiZWxvdyAweDgwMDAwMDAwIGFzIG5vbnNoYXJlZCBkZXZpY2UKLQkJICogb24gbXgzLCBidXQgbGVhdmUgbDJjYyBhbG9uZS4gIE90aGVyd2lzZSBjYWNoZSBjb3JydXB0aW9ucwotCQkgKiBjYW4gb2NjdXIuCi0JCSAqLwotCQlpZiAocGh5c19hZGRyIDwgMHg4MDAwMDAwMCAmJgotCQkJCSFhZGRyX2luX21vZHVsZShwaHlzX2FkZHIsIE1YM3hfTDJDQykpCi0JCQltdHlwZSA9IE1UX0RFVklDRV9OT05TSEFSRUQ7Ci0JfQotCi0JcmV0dXJuIF9fYXJtX2lvcmVtYXAocGh5c19hZGRyLCBzaXplLCBtdHlwZSk7CisJaWYgKGlteF9pb3JlbWFwICE9IE5VTEwpCisJCXJldHVybiBpbXhfaW9yZW1hcChwaHlzX2FkZHIsIHNpemUsIG10eXBlKTsKKwllbHNlCisJCXJldHVybiBfX2FybV9pb3JlbWFwKHBoeXNfYWRkciwgc2l6ZSwgbXR5cGUpOwogfQotI2VuZGlmCiAKIC8qIGlvIGFkZHJlc3MgbWFwcGluZyBtYWNybyAqLwogI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXgzLmgKaW5kZXggYzkyZjBiMS4uNjNmMjJhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14My5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDMuaApAQCAtNzM1LDYgKzczNSw3IEBACiAjZGVmaW5lIE1YMzFfUElOX0tFWV9DT0w1X0tFWV9DT0w1CUlPTVVYX01PREUoTVgzMV9QSU5fS0VZX0NPTDUsIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9LRVlfQ09MNl9LRVlfQ09MNglJT01VWF9NT0RFKE1YMzFfUElOX0tFWV9DT0w2LCBJT01VWF9DT05GSUdfRlVOQykKICNkZWZpbmUgTVgzMV9QSU5fS0VZX0NPTDdfS0VZX0NPTDcJSU9NVVhfTU9ERShNWDMxX1BJTl9LRVlfQ09MNywgSU9NVVhfQ09ORklHX0ZVTkMpCisjZGVmaW5lIE1YMzFfUElOX1dBVENIRE9HX1JTVF9fV0FUQ0hET0dfUlNUCUlPTVVYX01PREUoTVgzMV9QSU5fV0FUQ0hET0dfUlNULCBJT01VWF9DT05GSUdfRlVOQykKIAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUxLmgKaW5kZXggZGY2YWNjMC4uYzdmNTE2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUxLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTEuaApAQCAtMTQsNiArMTQsOCBAQAogI2RlZmluZSBfX01BQ0hfSU9NVVhfTVg1MV9IX18KIAogI2luY2x1ZGUgPG1hY2gvaW9tdXgtdjMuaD4KKyNkZWZpbmUgX19OQV8JMHgwMDAKKwogCiAvKiBQYWQgY29udHJvbCBncm91cGluZ3MgKi8KICNkZWZpbmUgTVg1MV9VQVJUX1BBRF9DVFJMCShQQURfQ1RMX1BLRSB8IFBBRF9DVExfUFVFIHwgUEFEX0NUTF9EU0VfSElHSCB8IFwKQEAgLTQ3LDE1MjEgKzQ5LDc2NSBAQAogCiAvKiBSYXcgcGluIG1vZGVzIHdpdGhvdXQgcGFkIGNvbnRyb2wgKi8KIC8qCQkJCQkJCSAgUEFEICAgIE1VWCBBTFQgSU5QU0UgUEFUSCBQQURDVFJMICovCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE2X19BVUQ0X1JYRlMJCUlPTVVYX1BBRCgweDNmMCwgMHg1YywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxNl9fQVVENV9UWEQJCUlPTVVYX1BBRCgweDNmMCwgMHg1YywgNywgMHgwOGQ4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxNl9fRUlNX0QxNgkJSU9NVVhfUEFEKDB4M2YwLCAweDVjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE2X19HUElPMl8wCQlJT01VWF9QQUQoMHgzZjAsIDB4NWMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHgzZjAsIDB4NWMsIDB4MTQsIDB4MDliNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTZfX1VBUlQyX0NUUwkJSU9NVVhfUEFEKDB4M2YwLCAweDVjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE2X19VU0JIMl9EQVRBMAkJSU9NVVhfUEFEKDB4M2YwLCAweDVjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE3X19BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4M2Y0LCAweDYwLCA3LCAweDA4ZDQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE3X19FSU1fRDE3CQlJT01VWF9QQUQoMHgzZjQsIDB4NjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTdfX0dQSU8yXzEJCUlPTVVYX1BBRCgweDNmNCwgMHg2MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxN19fVUFSVDJfUlhECQlJT01VWF9QQUQoMHgzZjQsIDB4NjAsIDMsIDB4MDllYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTdfX1VBUlQzX0NUUwkJSU9NVVhfUEFEKDB4M2Y0LCAweDYwLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE3X19VU0JIMl9EQVRBMQkJSU9NVVhfUEFEKDB4M2Y0LCAweDYwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE4X19BVUQ1X1RYQwkJSU9NVVhfUEFEKDB4M2Y4LCAweDY0LCA3LCAweDA4ZTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE4X19FSU1fRDE4CQlJT01VWF9QQUQoMHgzZjgsIDB4NjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMThfX0dQSU8yXzIJCUlPTVVYX1BBRCgweDNmOCwgMHg2NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOF9fVUFSVDJfVFhECQlJT01VWF9QQUQoMHgzZjgsIDB4NjQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMThfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4M2Y4LCAweDY0LCA0LCAweDA5ZjAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE4X19VU0JIMl9EQVRBMgkJSU9NVVhfUEFEKDB4M2Y4LCAweDY0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19BVUQ0X1JYQwkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19BVUQ1X1RYRlMJCUlPTVVYX1BBRCgweDNmYywgMHg2OCwgNywgMHgwOGU4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QxOV9fRUlNX0QxOQkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19HUElPMl8zCQlJT01VWF9QQUQoMHgzZmMsIDB4NjgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTlfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHgzZmMsIDB4NjgsIDB4MTQsIDB4MDliMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMTlfX1VBUlQyX1JUUwkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCAzLCAweDA5ZTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDE5X19VU0JIMl9EQVRBMwkJSU9NVVhfUEFEKDB4M2ZjLCAweDY4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIwX19BVUQ0X1RYRAkJSU9NVVhfUEFEKDB4NDAwLCAweDZjLCA1LCAweDA4YzgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIwX19FSU1fRDIwCQlJT01VWF9QQUQoMHg0MDAsIDB4NmMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjBfX0dQSU8yXzQJCUlPTVVYX1BBRCgweDQwMCwgMHg2YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMF9fU1JUQ19BTEFSTV9ERUIJSU9NVVhfUEFEKDB4NDAwLCAweDZjLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIwX19VU0JIMl9EQVRBNAkJSU9NVVhfUEFEKDB4NDAwLCAweDZjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIxX19BVUQ0X1JYRAkJSU9NVVhfUEFEKDB4NDA0LCAweDcwLCA1LCAweDA4YzQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIxX19FSU1fRDIxCQlJT01VWF9QQUQoMHg0MDQsIDB4NzAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjFfX0dQSU8yXzUJCUlPTVVYX1BBRCgweDQwNCwgMHg3MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMV9fU1JUQ19BTEFSTV9ERUIJSU9NVVhfUEFEKDB4NDA0LCAweDcwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIxX19VU0JIMl9EQVRBNQkJSU9NVVhfUEFEKDB4NDA0LCAweDcwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIyX19BVUQ0X1RYQwkJSU9NVVhfUEFEKDB4NDA4LCAweDc0LCA1LCAweDA4Y2MsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIyX19FSU1fRDIyCQlJT01VWF9QQUQoMHg0MDgsIDB4NzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjJfX0dQSU8yXzYJCUlPTVVYX1BBRCgweDQwOCwgMHg3NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyMl9fVVNCSDJfREFUQTYJCUlPTVVYX1BBRCgweDQwOCwgMHg3NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyM19fQVVENF9UWEZTCQlJT01VWF9QQUQoMHg0MGMsIDB4NzgsIDUsIDB4MDhkMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjNfX0VJTV9EMjMJCUlPTVVYX1BBRCgweDQwYywgMHg3OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyM19fR1BJTzJfNwkJSU9NVVhfUEFEKDB4NDBjLCAweDc4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDIzX19TUERJRl9PVVQxCQlJT01VWF9QQUQoMHg0MGMsIDB4NzgsIDQsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjNfX1VTQkgyX0RBVEE3CQlJT01VWF9QQUQoMHg0MGMsIDB4NzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjRfX0FVRDZfUlhGUwkJSU9NVVhfUEFEKDB4NDEwLCAweDdjLCA1LCAweDA4ZjgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI0X19FSU1fRDI0CQlJT01VWF9QQUQoMHg0MTAsIDB4N2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjRfX0dQSU8yXzgJCUlPTVVYX1BBRCgweDQxMCwgMHg3YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNF9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDQxMCwgMHg3YywgMHgxNCwgMHgwOWJjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNF9fVUFSVDNfQ1RTCQlJT01VWF9QQUQoMHg0MTAsIDB4N2MsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjRfX1VTQk9UR19EQVRBMAkJSU9NVVhfUEFEKDB4NDEwLCAweDdjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI1X19FSU1fRDI1CQlJT01VWF9QQUQoMHg0MTQsIDB4ODAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjVfX0tFWV9DT0w2CQlJT01VWF9QQUQoMHg0MTQsIDB4ODAsIDEsIDB4MDljOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjVfX1VBUlQyX0NUUwkJSU9NVVhfUEFEKDB4NDE0LCAweDgwLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI1X19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDQxNCwgMHg4MCwgMywgMHgwOWY0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNV9fVVNCT1RHX0RBVEExCQlJT01VWF9QQUQoMHg0MTQsIDB4ODAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjZfX0VJTV9EMjYJCUlPTVVYX1BBRCgweDQxOCwgMHg4NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNl9fS0VZX0NPTDcJCUlPTVVYX1BBRCgweDQxOCwgMHg4NCwgMSwgMHgwOWNjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyNl9fVUFSVDJfUlRTCQlJT01VWF9QQUQoMHg0MTgsIDB4ODQsIDQsIDB4MDllOCwgMywgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjZfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NDE4LCAweDg0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI2X19VU0JPVEdfREFUQTIJCUlPTVVYX1BBRCgweDQxOCwgMHg4NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyN19fQVVENl9SWEMJCUlPTVVYX1BBRCgweDQxYywgMHg4OCwgNSwgMHgwOGY0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyN19fRUlNX0QyNwkJSU9NVVhfUEFEKDB4NDFjLCAweDg4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI3X19HUElPMl85CQlJT01VWF9QQUQoMHg0MWMsIDB4ODgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjdfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg0MWMsIDB4ODgsIDB4MTQsIDB4MDliOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMjdfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4NDFjLCAweDg4LCAzLCAweDA5ZjAsIDMsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI3X19VU0JPVEdfREFUQTMJCUlPTVVYX1BBRCgweDQxYywgMHg4OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOF9fQVVENl9UWEQJCUlPTVVYX1BBRCgweDQyMCwgMHg4YywgNSwgMHgwOGYwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOF9fRUlNX0QyOAkJSU9NVVhfUEFEKDB4NDIwLCAweDhjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI4X19LRVlfUk9XNAkJSU9NVVhfUEFEKDB4NDIwLCAweDhjLCAxLCAweDA5ZDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI4X19VU0JPVEdfREFUQTQJCUlPTVVYX1BBRCgweDQyMCwgMHg4YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOV9fQVVENl9SWEQJCUlPTVVYX1BBRCgweDQyNCwgMHg5MCwgNSwgMHgwOGVjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QyOV9fRUlNX0QyOQkJSU9NVVhfUEFEKDB4NDI0LCAweDkwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI5X19LRVlfUk9XNQkJSU9NVVhfUEFEKDB4NDI0LCAweDkwLCAxLCAweDA5ZDQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDI5X19VU0JPVEdfREFUQTUJCUlPTVVYX1BBRCgweDQyNCwgMHg5MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMF9fQVVENl9UWEMJCUlPTVVYX1BBRCgweDQyOCwgMHg5NCwgNSwgMHgwOGZjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMF9fRUlNX0QzMAkJSU9NVVhfUEFEKDB4NDI4LCAweDk0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDMwX19LRVlfUk9XNgkJSU9NVVhfUEFEKDB4NDI4LCAweDk0LCAxLCAweDA5ZDgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRDMwX19VU0JPVEdfREFUQTYJCUlPTVVYX1BBRCgweDQyOCwgMHg5NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMV9fQVVENl9UWEZTCQlJT01VWF9QQUQoMHg0MmMsIDB4OTgsIDUsIDB4MDkwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EMzFfX0VJTV9EMzEJCUlPTVVYX1BBRCgweDQyYywgMHg5OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMV9fS0VZX1JPVzcJCUlPTVVYX1BBRCgweDQyYywgMHg5OCwgMSwgMHgwOWRjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0QzMV9fVVNCT1RHX0RBVEE3CQlJT01VWF9QQUQoMHg0MmMsIDB4OTgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTZfX0VJTV9BMTYJCUlPTVVYX1BBRCgweDQzMCwgMHg5YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExNl9fR1BJTzJfMTAJCUlPTVVYX1BBRCgweDQzMCwgMHg5YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExNl9fT1NDX0ZSRVFfU0VMMAlJT01VWF9QQUQoMHg0MzAsIDB4OWMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTdfX0VJTV9BMTcJCUlPTVVYX1BBRCgweDQzNCwgMHhhMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExN19fR1BJTzJfMTEJCUlPTVVYX1BBRCgweDQzNCwgMHhhMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0ExN19fT1NDX0ZSRVFfU0VMMQlJT01VWF9QQUQoMHg0MzQsIDB4YTAsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMThfX0JPT1RfTFBCMAkJSU9NVVhfUEFEKDB4NDM4LCAweGE0LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE4X19FSU1fQTE4CQlJT01VWF9QQUQoMHg0MzgsIDB4YTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMThfX0dQSU8yXzEyCQlJT01VWF9QQUQoMHg0MzgsIDB4YTQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTlfX0JPT1RfTFBCMQkJSU9NVVhfUEFEKDB4NDNjLCAweGE4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTE5X19FSU1fQTE5CQlJT01VWF9QQUQoMHg0M2MsIDB4YTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMTlfX0dQSU8yXzEzCQlJT01VWF9QQUQoMHg0M2MsIDB4YTgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjBfX0JPT1RfVUFSVF9TUkMwCUlPTVVYX1BBRCgweDQ0MCwgMHhhYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMF9fRUlNX0EyMAkJSU9NVVhfUEFEKDB4NDQwLCAweGFjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIwX19HUElPMl8xNAkJSU9NVVhfUEFEKDB4NDQwLCAweGFjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIxX19CT09UX1VBUlRfU1JDMQlJT01VWF9QQUQoMHg0NDQsIDB4YjAsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjFfX0VJTV9BMjEJCUlPTVVYX1BBRCgweDQ0NCwgMHhiMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMV9fR1BJTzJfMTUJCUlPTVVYX1BBRCgweDQ0NCwgMHhiMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyMl9fRUlNX0EyMgkJSU9NVVhfUEFEKDB4NDQ4LCAweGI0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIyX19HUElPMl8xNgkJSU9NVVhfUEFEKDB4NDQ4LCAweGI0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIzX19CT09UX0hQTl9FTgkJSU9NVVhfUEFEKDB4NDRjLCAweGI4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTIzX19FSU1fQTIzCQlJT01VWF9QQUQoMHg0NGMsIDB4YjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjNfX0dQSU8yXzE3CQlJT01VWF9QQUQoMHg0NGMsIDB4YjgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjRfX0VJTV9BMjQJCUlPTVVYX1BBRCgweDQ1MCwgMHhiYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNF9fR1BJTzJfMTgJCUlPTVVYX1BBRCgweDQ1MCwgMHhiYywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNF9fVVNCSDJfQ0xLCQlJT01VWF9QQUQoMHg0NTAsIDB4YmMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjVfX0RJU1AxX1BJTjQJCUlPTVVYX1BBRCgweDQ1NCwgMHhjMCwgNiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNV9fRUlNX0EyNQkJSU9NVVhfUEFEKDB4NDU0LCAweGMwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI1X19HUElPMl8xOQkJSU9NVVhfUEFEKDB4NDU0LCAweGMwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI1X19VU0JIMl9ESVIJCUlPTVVYX1BBRCgweDQ1NCwgMHhjMCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyNl9fQ1NJMV9EQVRBX0VOCQlJT01VWF9QQUQoMHg0NTgsIDB4YzQsIDUsIDB4MDlhMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjZfX0RJU1AyX0VYVF9DTEsJSU9NVVhfUEFEKDB4NDU4LCAweGM0LCA2LCAweDA5MDgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI2X19FSU1fQTI2CQlJT01VWF9QQUQoMHg0NTgsIDB4YzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjZfX0dQSU8yXzIwCQlJT01VWF9QQUQoMHg0NTgsIDB4YzQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjZfX1VTQkgyX1NUUAkJSU9NVVhfUEFEKDB4NDU4LCAweGM0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI3X19DU0kyX0RBVEFfRU4JCUlPTVVYX1BBRCgweDQ1YywgMHhjOCwgNSwgMHgwOTljLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0EyN19fRElTUDFfUElOMQkJSU9NVVhfUEFEKDB4NDVjLCAweGM4LCA2LCAweDA5YTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQTI3X19FSU1fQTI3CQlJT01VWF9QQUQoMHg0NWMsIDB4YzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxCQlJT01VWF9QQUQoMHg0NWMsIDB4YzgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9BMjdfX1VTQkgyX05YVAkJSU9NVVhfUEFEKDB4NDVjLCAweGM4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIwX19FSU1fRUIwCQlJT01VWF9QQUQoMHg0NjAsIDB4Y2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjFfX0VJTV9FQjEJCUlPTVVYX1BBRCgweDQ2NCwgMHhkMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMl9fQVVENV9SWEZTCQlJT01VWF9QQUQoMHg0NjgsIDB4ZDQsIDYsIDB4MDhlMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjJfX0NTSTFfRDIJCUlPTVVYX1BBRCgweDQ2OCwgMHhkNCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCMl9fRUlNX0VCMgkJSU9NVVhfUEFEKDB4NDY4LCAweGQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIyX19GRUNfTURJTwkJSU9NVVhfUEFEKDB4NDY4LCAweGQ0LCAzLCAweDA5NTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIyX19HUElPMl8yMgkJSU9NVVhfUEFEKDB4NDY4LCAweGQ0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIyX19HUFRfQ01QT1VUMQkJSU9NVVhfUEFEKDB4NDY4LCAweGQ0LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIzX19BVUQ1X1JYQwkJSU9NVVhfUEFEKDB4NDZjLCAweGQ4LCA2LCAweDA4ZGMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIzX19DU0kxX0QzCQlJT01VWF9QQUQoMHg0NmMsIDB4ZDgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9FQjNfX0VJTV9FQjMJCUlPTVVYX1BBRCgweDQ2YywgMHhkOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0VCM19fRkVDX1JEQVRBMQkJSU9NVVhfUEFEKDB4NDZjLCAweGQ4LCAzLCAweDA5NWMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIzX19HUElPMl8yMwkJSU9NVVhfUEFEKDB4NDZjLCAweGQ4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRUIzX19HUFRfQ01QT1VUMgkJSU9NVVhfUEFEKDB4NDZjLCAweGQ4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fT0VfX0VJTV9PRQkJSU9NVVhfUEFEKDB4NDcwLCAweGRjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fT0VfX0dQSU8yXzI0CQlJT01VWF9QQUQoMHg0NzAsIDB4ZGMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzBfX0VJTV9DUzAJCUlPTVVYX1BBRCgweDQ3NCwgMHhlMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMF9fR1BJTzJfMjUJCUlPTVVYX1BBRCgweDQ3NCwgMHhlMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMV9fRUlNX0NTMQkJSU9NVVhfUEFEKDB4NDc4LCAweGU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MxX19HUElPMl8yNgkJSU9NVVhfUEFEKDB4NDc4LCAweGU0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MyX19BVUQ1X1RYRAkJSU9NVVhfUEFEKDB4NDdjLCAweGU4LCA2LCAweDA4ZDgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MyX19DU0kxX0Q0CQlJT01VWF9QQUQoMHg0N2MsIDB4ZTgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzJfX0VJTV9DUzIJCUlPTVVYX1BBRCgweDQ3YywgMHhlOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTMl9fRkVDX1JEQVRBMgkJSU9NVVhfUEFEKDB4NDdjLCAweGU4LCAzLCAweDA5NjAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MyX19HUElPMl8yNwkJSU9NVVhfUEFEKDB4NDdjLCAweGU4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MyX19VU0JPVEdfU1RQCQlJT01VWF9QQUQoMHg0N2MsIDB4ZTgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzNfX0FVRDVfUlhECQlJT01VWF9QQUQoMHg0ODAsIDB4ZWMsIDYsIDB4MDhkNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzNfX0NTSTFfRDUJCUlPTVVYX1BBRCgweDQ4MCwgMHhlYywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTM19fRUlNX0NTMwkJSU9NVVhfUEFEKDB4NDgwLCAweGVjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1MzX19GRUNfUkRBVEEzCQlJT01VWF9QQUQoMHg0ODAsIDB4ZWMsIDMsIDB4MDk2NCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzNfX0dQSU8yXzI4CQlJT01VWF9QQUQoMHg0ODAsIDB4ZWMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzNfX1VTQk9UR19OWFQJCUlPTVVYX1BBRCgweDQ4MCwgMHhlYywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNF9fQVVENV9UWEMJCUlPTVVYX1BBRCgweDQ4NCwgMHhmMCwgNiwgMHgwOGU0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNF9fQ1NJMV9ENgkJSU9NVVhfUEFEKDB4NDg0LCAweGYwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M0X19FSU1fQ1M0CQlJT01VWF9QQUQoMHg0ODQsIDB4ZjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzRfX0ZFQ19SWF9FUgkJSU9NVVhfUEFEKDB4NDg0LCAweGYwLCAzLCAweDA5NzAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M0X19HUElPMl8yOQkJSU9NVVhfUEFEKDB4NDg0LCAweGYwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M0X19VU0JPVEdfQ0xLCQlJT01VWF9QQUQoMHg0ODQsIDB4ZjAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzVfX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4NDg4LCAweGY0LCA2LCAweDA4ZTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M1X19DU0kxX0Q3CQlJT01VWF9QQUQoMHg0ODgsIDB4ZjQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzVfX0RJU1AxX0VYVF9DTEsJSU9NVVhfUEFEKDB4NDg4LCAweGY0LCA0LCAweDA5MDQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1M1X19FSU1fQ1M1CQlJT01VWF9QQUQoMHg0ODgsIDB4ZjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9DUzVfX0ZFQ19DUlMJCUlPTVVYX1BBRCgweDQ4OCwgMHhmNCwgMywgMHgwOTUwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNV9fR1BJTzJfMzAJCUlPTVVYX1BBRCgweDQ4OCwgMHhmNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0NTNV9fVVNCT1RHX0RJUgkJSU9NVVhfUEFEKDB4NDg4LCAweGY0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRFRBQ0tfX0VJTV9EVEFDSwkJSU9NVVhfUEFEKDB4NDhjLCAweGY4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fRFRBQ0tfX0dQSU8yXzMxCQlJT01VWF9QQUQoMHg0OGMsIDB4ZjgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9MQkFfX0VJTV9MQkEJCUlPTVVYX1BBRCgweDQ5NCwgMHhmYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0xCQV9fR1BJTzNfMQkJSU9NVVhfUEFEKDB4NDk0LCAweGZjLCAxLCAweDA5NzgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1JFX19FSU1fQ1JFCQlJT01VWF9QQUQoMHg0YTAsIDB4MTAwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fQ1JFX19HUElPM18yCQlJT01VWF9QQUQoMHg0YTAsIDB4MTAwLCAxLCAweDA5N2MsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9EUkFNX0NTMV9fRFJBTV9DUzEJCUlPTVVYX1BBRCgweDRkMCwgMHgxMDQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dFX0JfX0dQSU8zXzMJCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDMsIDB4MDk4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dFX0JfX05BTkRGX1dFX0IJSU9NVVhfUEFEKDB4NGU0LCAweDEwOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfV0VfQl9fUEFUQV9ESU9XCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9XRV9CX19TRDNfREFUQTAJCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDIsIDB4MDkzYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JFX0JfX0dQSU8zXzQJCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDMsIDB4MDk4NCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JFX0JfX05BTkRGX1JFX0IJSU9NVVhfUEFEKDB4NGU4LCAweDEwYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkVfQl9fUEFUQV9ESU9SCQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRV9CX19TRDNfREFUQTEJCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDIsIDB4MDk0MCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0FMRV9fR1BJTzNfNQkJSU9NVVhfUEFEKDB4NGVjLCAweDExMCwgMywgMHgwOTg4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQUxFX19OQU5ERl9BTEUJCUlPTVVYX1BBRCgweDRlYywgMHgxMTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0FMRV9fUEFUQV9CVUZGRVJfRU4JSU9NVVhfUEFEKDB4NGVjLCAweDExMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ0xFX19HUElPM182CQlJT01VWF9QQUQoMHg0ZjAsIDB4MTE0LCAzLCAweDA5OGMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DTEVfX05BTkRGX0NMRQkJSU9NVVhfUEFEKDB4NGYwLCAweDExNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ0xFX19QQVRBX1JFU0VUX0IJSU9NVVhfUEFEKDB4NGYwLCAweDExNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfV1BfQl9fR1BJTzNfNwkJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMywgMHgwOTkwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfV1BfQl9fTkFOREZfV1BfQglJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9XUF9CX19QQVRBX0RNQUNLCUlPTVVYX1BBRCgweDRmNCwgMHgxMTgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1dQX0JfX1NEM19EQVRBMgkJSU9NVVhfUEFEKDB4NGY0LCAweDExOCwgMiwgMHgwOTQ0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIwX19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCA1LCAweDA5MzAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjBfX0dQSU8zXzgJCUlPTVVYX1BBRCgweDRmOCwgMHgxMWMsIDMsIDB4MDk5NCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMF9fTkFOREZfUkIwCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjBfX1BBVEFfRE1BUlEJCUlPTVVYX1BBRCgweDRmOCwgMHgxMWMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMF9fU0QzX0RBVEEzCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAyLCAweDA5NDgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjFfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgNiwgMHgwOTFjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIxX19FQ1NQSTJfUkRZCQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjFfX0dQSU8zXzkJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMV9fTkFOREZfUkIxCQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjFfX1BBVEFfSU9SRFkJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMV9fU0Q0X0NNRAkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIyX19ESVNQMl9XQUlUCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCA1LCAweDA5YTgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjJfX0VDU1BJMl9TQ0xLCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fRkVDX0NPTAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMSwgMHgwOTRjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIyX19HUElPM18xMAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIyX19OQU5ERl9SQjIJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfSDNfRFAJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIyX19VU0JIM19OWFQJCUlPTVVYX1BBRCgweDUwMCwgMHgxMjQsIDYsIDB4MGEyMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCM19fRElTUDFfV0FJVAkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIzX19FQ1NQSTJfTUlTTwlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjNfX0ZFQ19SWF9DTEsJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDEsIDB4MDk2OCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCM19fR1BJTzNfMTEJCUlPTVVYX1BBRCgweDUwNCwgMHgxMjgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JCM19fTkFOREZfUkIzCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0NMSwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNiwgMHgwOWY4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19IM19ETQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPX05BTkRfX0dQSU9fTkFORAkJSU9NVVhfUEFEKDB4NTE0LCAweDEyYywgMCwgMHgwOTk4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJT19OQU5EX19QQVRBX0lOVFJRCQlJT01VWF9QQUQoMHg1MTQsIDB4MTJjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzBfX0dQSU8zXzE2CQlJT01VWF9QQUQoMHg1MTgsIDB4MTMwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzBfX05BTkRGX0NTMAkJSU9NVVhfUEFEKDB4NTE4LCAweDEzMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MxX19HUElPM18xNwkJSU9NVVhfUEFEKDB4NTFjLCAweDEzNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MxX19OQU5ERl9DUzEJCUlPTVVYX1BBRCgweDUxYywgMHgxMzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMl9fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCA2LCAweDA5MTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzJfX0ZFQ19UWF9FUgkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MyX19HUElPM18xOAkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MyX19OQU5ERl9DUzIJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMl9fUEFUQV9DU18wCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzJfX1NENF9DTEsJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTMl9fVVNCSDNfSDFfRFAJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MzX19GRUNfTURDCQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzNfX0dQSU8zXzE5CQlJT01VWF9QQUQoMHg1MjQsIDB4MTNjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzNfX05BTkRGX0NTMwkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1MzX19QQVRBX0NTXzEJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTM19fU0Q0X0RBVDAJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTM19fVVNCSDNfSDFfRE0JSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M0X19GRUNfVERBVEExCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzRfX0dQSU8zXzIwCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzRfX05BTkRGX0NTNAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M0X19QQVRBX0RBXzAJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNF9fU0Q0X0RBVDEJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNF9fVVNCSDNfU1RQCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCA3LCAweDBhMjQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzVfX0ZFQ19UREFUQTIJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNV9fR1BJTzNfMjEJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNV9fTkFOREZfQ1M1CQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzVfX1BBVEFfREFfMQkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M1X19TRDRfREFUMgkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M1X19VU0JIM19ESVIJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDcsIDB4MGExYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNl9fQ1NQSV9TUzMJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDcsIDB4MDkyOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNl9fRkVDX1REQVRBMwkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M2X19HUElPM18yMgkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M2X19OQU5ERl9DUzYJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTNl9fUEFUQV9EQV8yCQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzZfX1NENF9EQVQzCQlJT01VWF9QQUQoMHg1MzAsIDB4MTQ4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9DUzdfX0ZFQ19UWF9FTgkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M3X19HUElPM18yMwkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfQ1M3X19OQU5ERl9DUzcJCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0NTN19fU0QzX0NMSwkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fRUNTUEkyX1NTMAlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19GRUNfVFhfQ0xLCUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDEsIDB4MDk3NCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0dQSU8zXzI0CUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX05BTkRGX1JEWV9JTlQJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMCwgMHgwOTM4LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fU0QzX0NNRAlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTVfX0VDU1BJMl9NT1NJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNV9fR1BJTzNfMjUJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNV9fTkFOREZfRDE1CQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTVfX1BBVEFfREFUQTE1CUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNV9fU0QzX0RBVDcJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNF9fRUNTUEkyX1NTMwkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgMiwgMHgwOTM0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDE0X19HUElPM18yNgkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDE0X19OQU5ERl9EMTQJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxNF9fUEFUQV9EQVRBMTQJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDE0X19TRDNfREFUNgkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEzX19FQ1NQSTJfU1MyCQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTNfX0dQSU8zXzI3CQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTNfX05BTkRGX0QxMwkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEzX19QQVRBX0RBVEExMwlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTNfX1NEM19EQVQ1CQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTJfX0VDU1BJMl9TUzEJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDIsIDB4MDkzMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMl9fR1BJTzNfMjgJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMl9fTkFOREZfRDEyCQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTJfX1BBVEFfREFUQTEyCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMl9fU0QzX0RBVDQJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMV9fRkVDX1JYX0RWCQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAyLCAweDA5NmMsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTFfX0dQSU8zXzI5CQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTFfX05BTkRGX0QxMQkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDExX19QQVRBX0RBVEExMQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMTFfX1NEM19EQVRBMwkJSU9NVVhfUEFEKDB4NTRjLCAweDE2NCwgNSwgMHgwOTQ4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEwX19HUElPM18zMAkJSU9NVVhfUEFEKDB4NTUwLCAweDE2OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEwX19OQU5ERl9EMTAJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxMF9fUEFUQV9EQVRBMTAJSU9NVVhfUEFEKDB4NTUwLCAweDE2OCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDEwX19TRDNfREFUQTIJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDUsIDB4MDk0NCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q5X19GRUNfUkRBVEEwCQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAweDEyLCAweDA5NTgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOV9fR1BJTzNfMzEJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q5X19OQU5ERl9EOQkJSU9NVVhfUEFEKDB4NTU0LCAweDE2YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDlfX1BBVEFfREFUQTkJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q5X19TRDNfREFUQTEJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDUsIDB4MDk0MCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q4X19GRUNfVERBVEEwCQlJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOF9fR1BJTzRfMAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDhfX05BTkRGX0Q4CQlJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EOF9fUEFUQV9EQVRBOAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDhfX1NEM19EQVRBMAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgNSwgMHgwOTNjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDdfX0dQSU80XzEJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q3X19OQU5ERl9ENwkJSU9NVVhfUEFEKDB4NTVjLCAweDE3NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDdfX1BBVEFfREFUQTcJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q3X19VU0JIM19EQVRBMAkJSU9NVVhfUEFEKDB4NTVjLCAweDE3NCwgNSwgMHgwOWZjLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDZfX0dQSU80XzIJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q2X19OQU5ERl9ENgkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDZfX1BBVEFfREFUQTYJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0Q2X19TRDRfTENUTAkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDZfX1VTQkgzX0RBVEExCQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCA1LCAweDBhMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENV9fR1BJTzRfMwkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDVfX05BTkRGX0Q1CQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENV9fUEFUQV9EQVRBNQkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDVfX1NENF9XUAkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDVfX1VTQkgzX0RBVEEyCQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCA1LCAweDBhMDQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENF9fR1BJTzRfNAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDRfX05BTkRGX0Q0CQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9ENF9fUEFUQV9EQVRBNAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDRfX1NENF9DRAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDRfX1VTQkgzX0RBVEEzCQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCA1LCAweDBhMDgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EM19fR1BJTzRfNQkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDNfX05BTkRGX0QzCQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EM19fUEFUQV9EQVRBMwkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDNfX1NENF9EQVQ0CQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EM19fVVNCSDNfREFUQTQJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDUsIDB4MGEwYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QyX19HUElPNF82CQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMl9fTkFOREZfRDIJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QyX19QQVRBX0RBVEEyCQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMl9fU0Q0X0RBVDUJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QyX19VU0JIM19EQVRBNQkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgNSwgMHgwYTEwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDFfX0dQSU80XzcJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxX19OQU5ERl9EMQkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDFfX1BBVEFfREFUQTEJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX05BTkRGX0QxX19TRDRfREFUNgkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDFfX1VTQkgzX0RBVEE2CQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCA1LCAweDBhMTQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMF9fR1BJTzRfOAkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDBfX05BTkRGX0QwCQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMF9fUEFUQV9EQVRBMAkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfTkFOREZfRDBfX1NENF9EQVQ3CQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9OQU5ERl9EMF9fVVNCSDNfREFUQTcJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDUsIDB4MGExOCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDhfX0NTSTFfRDgJCUlPTVVYX1BBRCgweDU3YywgMHgxOTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDhfX0dQSU8zXzEyCQlJT01VWF9QQUQoMHg1N2MsIDB4MTk0LCAzLCAweDA5OTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0Q5X19DU0kxX0Q5CQlJT01VWF9QQUQoMHg1ODAsIDB4MTk4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0Q5X19HUElPM18xMwkJSU9NVVhfUEFEKDB4NTgwLCAweDE5OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTBfX0NTSTFfRDEwCQlJT01VWF9QQUQoMHg1ODQsIDB4MTljLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxMV9fQ1NJMV9EMTEJCUlPTVVYX1BBRCgweDU4OCwgMHgxYTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDEyX19DU0kxX0QxMgkJSU9NVVhfUEFEKDB4NThjLCAweDFhNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTNfX0NTSTFfRDEzCQlJT01VWF9QQUQoMHg1OTAsIDB4MWE4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxNF9fQ1NJMV9EMTQJCUlPTVVYX1BBRCgweDU5NCwgMHgxYWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDE1X19DU0kxX0QxNQkJSU9NVVhfUEFEKDB4NTk4LCAweDFiMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTZfX0NTSTFfRDE2CQlJT01VWF9QQUQoMHg1OWMsIDB4MWI0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0QxN19fQ1NJMV9EMTcJCUlPTVVYX1BBRCgweDVhMCwgMHgxYjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfRDE4X19DU0kxX0QxOAkJSU9NVVhfUEFEKDB4NWE0LCAweDFiYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9EMTlfX0NTSTFfRDE5CQlJT01VWF9QQUQoMHg1YTgsIDB4MWMwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX1ZTWU5DX19DU0kxX1ZTWU5DCUlPTVVYX1BBRCgweDVhYywgMHgxYzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfVlNZTkNfX0dQSU8zXzE0CQlJT01VWF9QQUQoMHg1YWMsIDB4MWM0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX0hTWU5DX19DU0kxX0hTWU5DCUlPTVVYX1BBRCgweDViMCwgMHgxYzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTFfSFNZTkNfX0dQSU8zXzE1CQlJT01VWF9QQUQoMHg1YjAsIDB4MWM4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kxX1BJWENMS19fQ1NJMV9QSVhDTEsJSU9NVVhfUEFEKDB4NWI0LCAweDAwMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMV9NQ0xLX19DU0kxX01DTEsJCUlPTVVYX1BBRCgweDViOCwgMHgwMDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDEyX19DU0kyX0QxMgkJSU9NVVhfUEFEKDB4NWJjLCAweDFjYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTJfX0dQSU80XzkJCUlPTVVYX1BBRCgweDViYywgMHgxY2MsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDEzX19DU0kyX0QxMwkJSU9NVVhfUEFEKDB4NWMwLCAweDFkMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTNfX0dQSU80XzEwCQlJT01VWF9QQUQoMHg1YzAsIDB4MWQwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxNF9fQ1NJMl9EMTQJCUlPTVVYX1BBRCgweDVjNCwgMHgxZDQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDE1X19DU0kyX0QxNQkJSU9NVVhfUEFEKDB4NWM4LCAweDFkOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMTZfX0NTSTJfRDE2CQlJT01VWF9QQUQoMHg1Y2MsIDB4MWRjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxN19fQ1NJMl9EMTcJCUlPTVVYX1BBRCgweDVkMCwgMHgxZTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDE4X19DU0kyX0QxOAkJSU9NVVhfUEFEKDB4NWQ0LCAweDFlNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9EMThfX0dQSU80XzExCQlJT01VWF9QQUQoMHg1ZDQsIDB4MWU0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0QxOV9fQ1NJMl9EMTkJCUlPTVVYX1BBRCgweDVkOCwgMHgxZTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfRDE5X19HUElPNF8xMgkJSU9NVVhfUEFEKDB4NWQ4LCAweDFlOCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9WU1lOQ19fQ1NJMl9WU1lOQwlJT01VWF9QQUQoMHg1ZGMsIDB4MWVjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX1ZTWU5DX19HUElPNF8xMwkJSU9NVVhfUEFEKDB4NWRjLCAweDFlYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9IU1lOQ19fQ1NJMl9IU1lOQwlJT01VWF9QQUQoMHg1ZTAsIDB4MWYwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU0kyX0hTWU5DX19HUElPNF8xNAkJSU9NVVhfUEFEKDB4NWUwLCAweDFmMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0NTSTJfUElYQ0xLCUlPTVVYX1BBRCgweDVlNCwgMHgxZjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTSTJfUElYQ0xLX19HUElPNF8xNQkJSU9NVVhfUEFEKDB4NWU0LCAweDFmNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfSTJDMV9DTEtfX0dQSU80XzE2CQlJT01VWF9QQUQoMHg1ZTgsIDB4MWY4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9JMkMxX0NMS19fSTJDMV9DTEsJCUlPTVVYX1BBRCgweDVlOCwgMHgxZjgsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0kyQzFfREFUX19HUElPNF8xNwkJSU9NVVhfUEFEKDB4NWVjLCAweDFmYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfSTJDMV9EQVRfX0kyQzFfREFUCQlJT01VWF9QQUQoMHg1ZWMsIDB4MWZjLCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX1RYRF9fQVVEM19UWEQJCUlPTVVYX1BBRCgweDVmMCwgMHgyMDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfVFhEX19HUElPNF8xOAkJSU9NVVhfUEFEKDB4NWYwLCAweDIwMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9SWERfX0FVRDNfUlhECQlJT01VWF9QQUQoMHg1ZjQsIDB4MjA0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX1JYRF9fR1BJTzRfMTkJCUlPTVVYX1BBRCgweDVmNCwgMHgyMDQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfUlhEX19VQVJUM19SWEQJSU9NVVhfUEFEKDB4NWY0LCAweDIwNCwgMSwgMHgwOWY0LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQVVEM19CQl9DS19fQVVEM19UWEMJCUlPTVVYX1BBRCgweDVmOCwgMHgyMDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfQ0tfX0dQSU80XzIwCQlJT01VWF9QQUQoMHg1ZjgsIDB4MjA4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX0ZTX19BVUQzX1RYRlMJCUlPTVVYX1BBRCgweDVmYywgMHgyMGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0FVRDNfQkJfRlNfX0dQSU80XzIxCQlJT01VWF9QQUQoMHg1ZmMsIDB4MjBjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9BVUQzX0JCX0ZTX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDVmYywgMHgyMGMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX01PU0lfX0VDU1BJMV9NT1NJCUlPTVVYX1BBRCgweDYwMCwgMHgyMTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX01PU0lfX0dQSU80XzIyCQlJT01VWF9QQUQoMHg2MDAsIDB4MjEwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9NT1NJX19JMkMxX1NEQQkJSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMHgxMSwgMHgwOWI0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfTUlTT19fQVVENF9SWEQJCUlPTVVYX1BBRCgweDYwNCwgMHgyMTQsIDEsIDB4MDhjNCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX01JU09fX0VDU1BJMV9NSVNPCUlPTVVYX1BBRCgweDYwNCwgMHgyMTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX01JU09fX0dQSU80XzIzCQlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TUzBfX0FVRDRfVFhDCQlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAxLCAweDA4Y2MsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9DU1BJMV9TUzBfX0VDU1BJMV9TUzAJCUlPTVVYX1BBRCgweDYwOCwgMHgyMTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NTMF9fR1BJTzRfMjQJCUlPTVVYX1BBRCgweDYwOCwgMHgyMTgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NTMV9fQVVENF9UWEQJCUlPTVVYX1BBRCgweDYwYywgMHgyMWMsIDEsIDB4MDhjOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NTMV9fRUNTUEkxX1NTMQkJSU9NVVhfUEFEKDB4NjBjLCAweDIxYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfU1MxX19HUElPNF8yNQkJSU9NVVhfUEFEKDB4NjBjLCAweDIxYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfUkRZX19BVUQ0X1RYRlMJCUlPTVVYX1BBRCgweDYxMCwgMHgyMjAsIDEsIDB4MDhkMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1JEWV9fRUNTUEkxX1JEWQkJSU9NVVhfUEFEKDB4NjEwLCAweDIyMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfUkRZX19HUElPNF8yNgkJSU9NVVhfUEFEKDB4NjEwLCAweDIyMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfU0NMS19fRUNTUEkxX1NDTEsJSU9NVVhfUEFEKDB4NjE0LCAweDIyNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfQ1NQSTFfU0NMS19fR1BJTzRfMjcJCUlPTVVYX1BBRCgweDYxNCwgMHgyMjQsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0NTUEkxX1NDTEtfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHg2MTQsIDB4MjI0LCAweDExLCAweDA5YjAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMV9SWERfX0dQSU80XzI4CQlJT01VWF9QQUQoMHg2MTgsIDB4MjI4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMV9SWERfX1VBUlQxX1JYRAkJSU9NVVhfUEFEKDB4NjE4LCAweDIyOCwgMCwgMHgwOWU0LCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfVFhEX19HUElPNF8yOQkJSU9NVVhfUEFEKDB4NjFjLCAweDIyYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfVFhEX19QV00yX1BXTU8JCUlPTVVYX1BBRCgweDYxYywgMHgyMmMsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQxX1RYRF9fVUFSVDFfVFhECQlJT01VWF9QQUQoMHg2MWMsIDB4MjJjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMV9SVFNfX0dQSU80XzMwCQlJT01VWF9QQUQoMHg2MjAsIDB4MjMwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMV9SVFNfX1VBUlQxX1JUUwkJSU9NVVhfUEFEKDB4NjIwLCAweDIzMCwgMCwgMHgwOWUwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfQ1RTX19HUElPNF8zMQkJSU9NVVhfUEFEKDB4NjI0LCAweDIzNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDFfQ1RTX19VQVJUMV9DVFMJCUlPTVVYX1BBRCgweDYyNCwgMHgyMzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQyX1JYRF9fRklSSV9UWEQJCUlPTVVYX1BBRCgweDYyOCwgMHgyMzgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQyX1JYRF9fR1BJTzFfMjAJCUlPTVVYX1BBRCgweDYyOCwgMHgyMzgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhECQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAwLCAweDA5ZWMsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9UWERfX0ZJUklfUlhECQlJT01VWF9QQUQoMHg2MmMsIDB4MjNjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9UWERfX0dQSU8xXzIxCQlJT01VWF9QQUQoMHg2MmMsIDB4MjNjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRAkJSU9NVVhfUEFEKDB4NjJjLCAweDIzYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfUlhEX19DU0kxX0QwCQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUM19SWERfX0dQSU8xXzIyCQlJT01VWF9QQUQoMHg2MzAsIDB4MjQwLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VQVJUM19SWERfX1VBUlQxX0RUUgkJSU9NVVhfUEFEKDB4NjMwLCAweDI0MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDEsIDB4MDlmNCwgNCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1RYRF9fQ1NJMV9EMQkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfVFhEX19HUElPMV8yMwkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUMV9EU1IJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VBUlQzX1RYRF9fVUFSVDNfVFhECQlJT01VWF9QQUQoMHg2MzQsIDB4MjQ0LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9PV0lSRV9MSU5FX19HUElPMV8yNAkJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfT1dJUkVfTElORV9fT1dJUkVfTElORQlJT01VWF9QQUQoMHg2MzgsIDB4MjQ4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9PV0lSRV9MSU5FX19TUERJRl9PVVQJCUlPTVVYX1BBRCgweDYzOCwgMHgyNDgsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9ST1cwX19LRVlfUk9XMAkJSU9NVVhfUEFEKDB4NjNjLCAweDI0YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX1JPVzFfX0tFWV9ST1cxCQlJT01VWF9QQUQoMHg2NDAsIDB4MjUwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIJCUlPTVVYX1BBRCgweDY0NCwgMHgyNTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9ST1czX19LRVlfUk9XMwkJSU9NVVhfUEFEKDB4NjQ4LCAweDI1OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDBfX0tFWV9DT0wwCQlJT01VWF9QQUQoMHg2NGMsIDB4MjVjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MMF9fUExMMV9CWVAJCUlPTVVYX1BBRCgweDY0YywgMHgyNWMsIDcsIDB4MDkwYywgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0wxX19LRVlfQ09MMQkJSU9NVVhfUEFEKDB4NjUwLCAweDI2MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDFfX1BMTDJfQllQCQlJT01VWF9QQUQoMHg2NTAsIDB4MjYwLCA3LCAweDA5MTAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MMl9fS0VZX0NPTDIJCUlPTVVYX1BBRCgweDY1NCwgMHgyNjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0wyX19QTEwzX0JZUAkJSU9NVVhfUEFEKDB4NjU0LCAweDI2NCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDNfX0tFWV9DT0wzCQlJT01VWF9QQUQoMHg2NTgsIDB4MjY4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNF9fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDB4MTMsIDB4MDliOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w0X19LRVlfQ09MNAkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDRfX1NQRElGX09VVDEJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w0X19VQVJUMV9SSQkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDRfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMiwgMHgwOWYwLCA0LCAwKQotI2RlZmluZSBfTVg1MV9QQURfS0VZX0NPTDVfX0kyQzJfU0RBCQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAweDEzLCAweDA5YmMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9LRVlfQ09MNV9fS0VZX0NPTDUJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w1X19VQVJUMV9EQ0QJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0tFWV9DT0w1X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0NMS19fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg2NzgsIDB4Mjc4LCAxLCAweDA5MTQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9DTEtfX0dQSU8xXzI1CQlJT01VWF9QQUQoMHg2NzgsIDB4Mjc4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9DTEtfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHg2NzgsIDB4Mjc4LCAweDE1LCAweDA5YjgsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9DTEtfX1VTQkgxX0NMSwkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfRElSX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDEsIDB4MDkxYywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RJUl9fR1BJTzFfMjYJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RJUl9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDY3YywgMHgyN2MsIDB4MTUsIDB4MDliYywgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RJUl9fVVNCSDFfRElSCQlJT01VWF9QQUQoMHg2N2MsIDB4MjdjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9TVFBfX0NTUElfUkRZCQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9TVFBfX0dQSU8xXzI3CQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9TVFBfX1VBUlQzX1JYRAkJSU9NVVhfUEFEKDB4NjgwLCAweDI4MCwgNSwgMHgwOWY0LCA2LCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfU1RQX19VU0JIMV9TVFAJCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX05YVF9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg2ODQsIDB4Mjg0LCAxLCAweDA5MTgsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9OWFRfX0dQSU8xXzI4CQlJT01VWF9QQUQoMHg2ODQsIDB4Mjg0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9OWFRfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfTlhUX19VU0JIMV9OWFQJCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEwX19HUElPMV8xMQkJSU9NVVhfUEFEKDB4Njg4LCAweDI4OCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTBfX1VBUlQyX0NUUwlJT01VWF9QQUQoMHg2ODgsIDB4Mjg4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMF9fVVNCSDFfREFUQTAJSU9NVVhfUEFEKDB4Njg4LCAweDI4OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTFfX0dQSU8xXzEyCQlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMV9fVUFSVDJfUlhECUlPTVVYX1BBRCgweDY4YywgMHgyOGMsIDEsIDB4MDllYywgNCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEExX19VU0JIMV9EQVRBMQlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBMl9fR1BJTzFfMTMJCUlPTVVYX1BBRCgweDY5MCwgMHgyOTAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEyX19VQVJUMl9UWEQJSU9NVVhfUEFEKDB4NjkwLCAweDI5MCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyCUlPTVVYX1BBRCgweDY5MCwgMHgyOTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEEzX19HUElPMV8xNAkJSU9NVVhfUEFEKDB4Njk0LCAweDI5NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTNfX1VBUlQyX1JUUwlJT01VWF9QQUQoMHg2OTQsIDB4Mjk0LCAxLCAweDA5ZTgsIDUsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBM19fVVNCSDFfREFUQTMJSU9NVVhfUEFEKDB4Njk0LCAweDI5NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTRfX0NTUElfU1MwCQlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNF9fR1BJTzFfMTUJCUlPTVVYX1BBRCgweDY5OCwgMHgyOTgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE0X19VU0JIMV9EQVRBNAlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNV9fQ1NQSV9TUzEJCUlPTVVYX1BBRCgweDY5YywgMHgyOWMsIDEsIDB4MDkyMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE1X19HUElPMV8xNgkJSU9NVVhfUEFEKDB4NjljLCAweDI5YywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTVfX1VTQkgxX0RBVEE1CUlPTVVYX1BBRCgweDY5YywgMHgyOWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1VTQkgxX0RBVEE2X19DU1BJX1NTMwkJSU9NVVhfUEFEKDB4NmEwLCAweDJhMCwgMSwgMHgwOTI4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTZfX0dQSU8xXzE3CQlJT01VWF9QQUQoMHg2YTAsIDB4MmEwLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBNl9fVVNCSDFfREFUQTYJSU9NVVhfUEFEKDB4NmEwLCAweDJhMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMV9TUzMJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMl9TUzMJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgNSwgMHgwOTM0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfVVNCSDFfREFUQTdfX0dQSU8xXzE4CQlJT01VWF9QQUQoMHg2YTQsIDB4MmE0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9VU0JIMV9EQVRBN19fVVNCSDFfREFUQTcJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjExX19ESTFfUElOMTEJCUlPTVVYX1BBRCgweDZhOCwgMHgyYTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9QSU4xMV9fRUNTUEkxX1NTMgkJSU9NVVhfUEFEKDB4NmE4LCAweDJhOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjExX19HUElPM18wCQlJT01VWF9QQUQoMHg2YTgsIDB4MmE4LCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfUElOMTJfX0RJMV9QSU4xMgkJSU9NVVhfUEFEKDB4NmFjLCAweDJhYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjEyX19HUElPM18xCQlJT01VWF9QQUQoMHg2YWMsIDB4MmFjLCA0LCAweDA5NzgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfUElOMTNfX0RJMV9QSU4xMwkJSU9NVVhfUEFEKDB4NmIwLCAweDJiMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjEzX19HUElPM18yCQlJT01VWF9QQUQoMHg2YjAsIDB4MmIwLCA0LCAweDA5N2MsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfRDBfQ1NfX0RJMV9EMF9DUwkJSU9NVVhfUEFEKDB4NmI0LCAweDJiNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX0QwX0NTX19HUElPM18zCQlJT01VWF9QQUQoMHg2YjQsIDB4MmI0LCA0LCAweDA5ODAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfRDFfQ1NfX0RJMV9EMV9DUwkJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU4xNAlJT01VWF9QQUQoMHg2YjgsIDB4MmI4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfRDFfQ1NfX0RJU1AxX1BJTjUJCUlPTVVYX1BBRCgweDZiOCwgMHgyYjgsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMV9EMV9DU19fR1BJTzNfNAkJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgNCwgMHgwOTg0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1AxX1BJTjEJSU9NVVhfUEFEKDB4NmJjLCAweDJiYywgMiwgMHgwOWE0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1BCMl9TRVJfRElOCUlPTVVYX1BBRCgweDZiYywgMHgyYmMsIDAsIDB4MDljNCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19HUElPM181CUlPTVVYX1BBRCgweDZiYywgMHgyYmMsIDQsIDB4MDk4OCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQMV9QSU42CUlPTVVYX1BBRCgweDZjMCwgMHgyYzAsIDMsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQQjJfU0VSX0RJTwlJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCAwLCAweDA5YzQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fR1BJTzNfNglJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCA0LCAweDA5OGMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElOMTcJSU9NVVhfUEFEKDB4NmM0LCAweDJjNCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1AxX1BJTjcJSU9NVVhfUEFEKDB4NmM0LCAweDJjNCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1BCMl9TRVJfQ0xLCUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19HUElPM183CUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDQsIDB4MDk5MCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX0VYVF9DTEsJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOMTYJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOOAlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1BCMl9TRVJfUlMJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fR1BJTzNfOAlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCA0LCAweDA5OTQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQwX19ESVNQMV9EQVQwCUlPTVVYX1BBRCgweDZjYywgMHgyY2MsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDFfX0RJU1AxX0RBVDEJSU9NVVhfUEFEKDB4NmQwLCAweDJkMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMl9fRElTUDFfREFUMglJT01VWF9QQUQoMHg2ZDQsIDB4MmQ0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQzX19ESVNQMV9EQVQzCUlPTVVYX1BBRCgweDZkOCwgMHgyZDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDRfX0RJU1AxX0RBVDQJSU9NVVhfUEFEKDB4NmRjLCAweDJkYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUNV9fRElTUDFfREFUNQlJT01VWF9QQUQoMHg2ZTAsIDB4MmUwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ2X19CT09UX1VTQl9TUkMJSU9NVVhfUEFEKDB4NmU0LCAweDJlNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUNl9fRElTUDFfREFUNglJT01VWF9QQUQoMHg2ZTQsIDB4MmU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ3X19CT09UX0VFUFJPTV9DRkcJSU9NVVhfUEFEKDB4NmU4LCAweDJlOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUN19fRElTUDFfREFUNwlJT01VWF9QQUQoMHg2ZTgsIDB4MmU4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ4X19CT09UX1NSQzAJCUlPTVVYX1BBRCgweDZlYywgMHgyZWMsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDhfX0RJU1AxX0RBVDgJSU9NVVhfUEFEKDB4NmVjLCAweDJlYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUOV9fQk9PVF9TUkMxCQlJT01VWF9QQUQoMHg2ZjAsIDB4MmYwLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQ5X19ESVNQMV9EQVQ5CUlPTVVYX1BBRCgweDZmMCwgMHgyZjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDEwX19CT09UX1NQQVJFX1NJWkUJSU9NVVhfUEFEKDB4NmY0LCAweDJmNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTBfX0RJU1AxX0RBVDEwCUlPTVVYX1BBRCgweDZmNCwgMHgyZjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDExX19CT09UX0xQQl9GUkVRMglJT01VWF9QQUQoMHg2ZjgsIDB4MmY4LCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxMV9fRElTUDFfREFUMTEJSU9NVVhfUEFEKDB4NmY4LCAweDJmOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTJfX0JPT1RfTUxDX1NFTAlJT01VWF9QQUQoMHg2ZmMsIDB4MmZjLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxMl9fRElTUDFfREFUMTIJSU9NVVhfUEFEKDB4NmZjLCAweDJmYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTNfX0JPT1RfTUVNX0NUTDAJSU9NVVhfUEFEKDB4NzAwLCAweDMwMCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTNfX0RJU1AxX0RBVDEzCUlPTVVYX1BBRCgweDcwMCwgMHgzMDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE0X19CT09UX01FTV9DVEwxCUlPTVVYX1BBRCgweDcwNCwgMHgzMDQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE0X19ESVNQMV9EQVQxNAlJT01VWF9QQUQoMHg3MDQsIDB4MzA0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxNV9fQk9PVF9CVVNfV0lEVEgJSU9NVVhfUEFEKDB4NzA4LCAweDMwOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTVfX0RJU1AxX0RBVDE1CUlPTVVYX1BBRCgweDcwOCwgMHgzMDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE2X19CT09UX1BBR0VfU0laRTAJSU9NVVhfUEFEKDB4NzBjLCAweDMwYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTZfX0RJU1AxX0RBVDE2CUlPTVVYX1BBRCgweDcwYywgMHgzMGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE3X19CT09UX1BBR0VfU0laRTEJSU9NVVhfUEFEKDB4NzEwLCAweDMxMCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTdfX0RJU1AxX0RBVDE3CUlPTVVYX1BBRCgweDcxMCwgMHgzMTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE4X19CT09UX1dFSU1fTVVYRUQwCUlPTVVYX1BBRCgweDcxNCwgMHgzMTQsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMV9EQVQxOAlJT01VWF9QQUQoMHg3MTQsIDB4MzE0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElOMTEJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AyX1BJTjUJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTlfX0JPT1RfV0VJTV9NVVhFRDEJSU9NVVhfUEFEKDB4NzE4LCAweDMxOCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AxX0RBVDE5CUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDE5X19ESVNQMl9QSU4xMglJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQxOV9fRElTUDJfUElONglJT01VWF9QQUQoMHg3MTgsIDB4MzE4LCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fQk9PVF9NRU1fVFlQRTAJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AxX0RBVDIwCUlPTVVYX1BBRCgweDcxYywgMHgzMWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMl9QSU4xMwlJT01VWF9QQUQoMHg3MWMsIDB4MzFjLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElONwlJT01VWF9QQUQoMHg3MWMsIDB4MzFjLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fQk9PVF9NRU1fVFlQRTEJSU9NVVhfUEFEKDB4NzIwLCAweDMyMCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjFfX0RJU1AxX0RBVDIxCUlPTVVYX1BBRCgweDcyMCwgMHgzMjAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMl9QSU4xNAlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOOAlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMl9fQk9PVF9MUEJfRlJFUTAJSU9NVVhfUEFEKDB4NzI0LCAweDMyNCwgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AxX0RBVDIyCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIyX19ESVNQMl9EMF9DUwlJT01VWF9QQUQoMHg3MjQsIDB4MzI0LCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyMl9fRElTUDJfREFUMTYJSU9NVVhfUEFEKDB4NzI0LCAweDMyNCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjNfX0JPT1RfTFBCX0ZSRVExCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDcsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMV9EQVQyMwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMV9EQVQyM19fRElTUDJfRDFfQ1MJSU9NVVhfUEFEKDB4NzI4LCAweDMyOCwgNiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0RBVDE3CUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9TRVJfQ1MJSU9NVVhfUEFEKDB4NzI4LCAweDMyOCwgNCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkxX1BJTjNfX0RJMV9QSU4zCQlJT01VWF9QQUQoMHg3MmMsIDB4MzJjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTFfUElOMl9fREkxX1BJTjIJCUlPTVVYX1BBRCgweDczNCwgMHgzMzAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQMl9fRElTUDFfU0VSX0NMSwkJSU9NVVhfUEFEKDB4NzQwLCAweDMzOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1AyX19ESVNQMl9XQUlUCQlJT01VWF9QQUQoMHg3NDAsIDB4MzM4LCAyLCAweDA5YTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDNfX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NzQ0LCAweDMzYywgMywgMHgwOWEwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1AzX19ESVNQMV9TRVJfRElPCQlJT01VWF9QQUQoMHg3NDQsIDB4MzNjLCAwLCAweDA5YzAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDNfX0ZFQ19UWF9FUgkJSU9NVVhfUEFEKDB4NzQ0LCAweDMzYywgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX1BJTjRfX0NTSTJfREFUQV9FTglJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAzLCAweDA5OWMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElONF9fREkyX1BJTjQJCUlPTVVYX1BBRCgweDc0OCwgMHgzNDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9QSU40X19GRUNfQ1JTCQlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAyLCAweDA5NTAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElOMl9fREkyX1BJTjIJCUlPTVVYX1BBRCgweDc0YywgMHgzNDQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9QSU4yX19GRUNfTURDCQlJT01VWF9QQUQoMHg3NGMsIDB4MzQ0LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESTJfUElOM19fREkyX1BJTjMJCUlPTVVYX1BBRCgweDc1MCwgMHgzNDgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJMl9QSU4zX19GRUNfTURJTwkJSU9NVVhfUEFEKDB4NzUwLCAweDM0OCwgMiwgMHgwOTU0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX0RJU1BfQ0xLX19ESTJfRElTUF9DTEsJSU9NVVhfUEFEKDB4NzU0LCAweDM0YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfREkyX0RJU1BfQ0xLX19GRUNfUkRBVEExCUlPTVVYX1BBRCgweDc1NCwgMHgzNGMsIDIsIDB4MDk1YywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQNF9fREkyX1BJTjE1CQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESV9HUDRfX0RJU1AxX1NFUl9ESU4JCUlPTVVYX1BBRCgweDc1OCwgMHgzNTAsIDAsIDB4MDljMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJX0dQNF9fRElTUDJfUElOMQkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElfR1A0X19GRUNfUkRBVEEyCQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCAyLCAweDA5NjAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQwX19ESVNQMl9EQVQwCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDBfX0ZFQ19SREFUQTMJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgMiwgMHgwOTY0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMF9fS0VZX0NPTDYJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDQsIDB4MDljOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDBfX1VBUlQzX1JYRAkJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgNSwgMHgwOWY0LCA4LCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMF9fVVNCSDNfQ0xLCQlJT01VWF9QQUQoMHg3NWMsIDB4MzU0LCAzLCAweDA5ZjgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxX19ESVNQMl9EQVQxCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDFfX0ZFQ19SWF9FUgkJSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgMiwgMHgwOTcwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMV9fS0VZX0NPTDcJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDQsIDB4MDljYywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDFfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMV9fVVNCSDNfRElSCQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCAzLCAweDBhMWMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQyX19ESVNQMl9EQVQyCUlPTVVYX1BBRCgweDc2NCwgMHgzNWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDNfX0RJU1AyX0RBVDMJSU9NVVhfUEFEKDB4NzY4LCAweDM2MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUNF9fRElTUDJfREFUNAlJT01VWF9QQUQoMHg3NmMsIDB4MzY0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ1X19ESVNQMl9EQVQ1CUlPTVVYX1BBRCgweDc3MCwgMHgzNjgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDZfX0RJU1AyX0RBVDYJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUNl9fRkVDX1REQVRBMQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19HUElPMV8xOQkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUNl9fS0VZX1JPVzQJCUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDQsIDB4MDlkMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDZfX1VTQkgzX1NUUAkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgMywgMHgwYTI0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUN19fRElTUDJfREFUNwlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19GRUNfVERBVEEyCUlPTVVYX1BBRCgweDc3OCwgMHgzNzAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDdfX0dQSU8xXzI5CQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19LRVlfUk9XNQkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgNCwgMHgwOWQ0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUN19fVVNCSDNfTlhUCQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCAzLCAweDBhMjAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19ESVNQMl9EQVQ4CUlPTVVYX1BBRCgweDc3YywgMHgzNzQsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDhfX0ZFQ19UREFUQTMJSU9NVVhfUEFEKDB4NzdjLCAweDM3NCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOF9fR1BJTzFfMzAJCUlPTVVYX1BBRCgweDc3YywgMHgzNzQsIDUsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDhfX0tFWV9ST1c2CQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCA0LCAweDA5ZDgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19VU0JIM19EQVRBMAlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCAzLCAweDA5ZmMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19BVUQ2X1JYQwkJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgNCwgMHgwOGY0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUOV9fRElTUDJfREFUOQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19GRUNfVFhfRU4JCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDlfX0dQSU8xXzMxCQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19VU0JIM19EQVRBMQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCAzLCAweDBhMDAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfREFUMTAJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTBfX0RJU1AyX1NFUl9DUwlJT01VWF9QQUQoMHg3ODQsIDB4MzdjLCA1LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMF9fRkVDX0NPTAkJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgMiwgMHgwOTRjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTBfX0tFWV9ST1c3CQlJT01VWF9QQUQoMHg3ODQsIDB4MzdjLCA0LCAweDA5ZGMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMF9fVVNCSDNfREFUQTIJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgMywgMHgwYTA0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTFfX0FVRDZfVFhECQlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCA0LCAweDA4ZjAsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMV9fRElTUDJfREFUMTEJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTFfX0ZFQ19SWF9DTEsJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgMiwgMHgwOTY4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTFfX0dQSU8xXzEwCQlJT01VWF9QQUQoMHg3ODgsIDB4MzgwLCA3LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMV9fVVNCSDNfREFUQTMJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgMywgMHgwYTA4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTJfX0FVRDZfUlhECQlJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCA0LCAweDA4ZWMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMl9fRElTUDJfREFUMTIJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTJfX0ZFQ19SWF9EVglJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCAyLCAweDA5NmMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxMl9fVVNCSDNfREFUQTQJSU9NVVhfUEFEKDB4NzhjLCAweDM4NCwgMywgMHgwYTBjLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTNfX0FVRDZfVFhDCQlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCA0LCAweDA4ZmMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTNfX0ZFQ19UWF9DTEsJSU9NVVhfUEFEKDB4NzkwLCAweDM4OCwgMiwgMHgwOTc0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTNfX1VTQkgzX0RBVEE1CUlPTVVYX1BBRCgweDc5MCwgMHgzODgsIDMsIDB4MGExMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE0X19BVUQ2X1RYRlMJSU9NVVhfUEFEKDB4Nzk0LCAweDM4YywgNCwgMHgwOTAwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTRfX0RJU1AyX0RBVDE0CUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE0X19GRUNfUkRBVEEwCUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDIsIDB4MDk1OCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE0X19VU0JIM19EQVRBNglJT01VWF9QQUQoMHg3OTQsIDB4MzhjLCAzLCAweDBhMTQsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fQVVENl9SWEZTCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDQsIDB4MDhmOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMV9TRVJfQ1MJSU9NVVhfUEFEKDB4Nzk4LCAweDM5MCwgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AyX0RBVDE1CUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE1X19GRUNfVERBVEEwCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0RJU1AyX0RBVDE1X19VU0JIM19EQVRBNwlJT01VWF9QQUQoMHg3OTgsIDB4MzkwLCAzLCAweDBhMTgsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfQ01EX19BVUQ1X1JYRlMJCUlPTVVYX1BBRCgweDc5YywgMHgzOTQsIDEsIDB4MDhlMCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9DTURfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4NzljLCAweDM5NCwgMiwgMHgwOTFjLCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0NNRF9fU0QxX0NNRAkJSU9NVVhfUEFEKDB4NzljLCAweDM5NCwgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0NMS19fQVVENV9SWEMJCUlPTVVYX1BBRCgweDdhMCwgMHgzOTgsIDEsIDB4MDhkYywgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4N2EwLCAweDM5OCwgMiwgMHgwOTE0LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0NMS19fU0QxX0NMSwkJSU9NVVhfUEFEKDB4N2EwLCAweDM5OCwgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEwX19BVUQ1X1RYRAkJSU9NVVhfUEFEKDB4N2E0LCAweDM5YywgMSwgMHgwOGQ4LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEwX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDdhNCwgMHgzOWMsIDIsIDB4MDkxOCwgMSwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMV9EQVRBMF9fU0QxX0RBVEEwCQlJT01VWF9QQUQoMHg3YTQsIDB4MzljLCAweDEwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREEwX19FSU1fREEwCQlJT01VWF9QQUQoMHgwMDAsIDB4MDFjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREExX19FSU1fREExCQlJT01VWF9QQUQoMHgwMDAsIDB4MDIwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREEyX19FSU1fREEyCQlJT01VWF9QQUQoMHgwMDAsIDB4MDI0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREEzX19FSU1fREEzCQlJT01VWF9QQUQoMHgwMDAsIDB4MDI4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfREFUQTFfX0FVRDVfUlhECQlJT01VWF9QQUQoMHg3YTgsIDB4M2EwLCAxLCAweDA4ZDQsIDIsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMQkJSU9NVVhfUEFEKDB4N2E4LCAweDNhMCwgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBNF9fRUlNX0RBNAkJSU9NVVhfUEFEKDB4MDAwLCAweDAyYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBNV9fRUlNX0RBNQkJSU9NVVhfUEFEKDB4MDAwLCAweDAzMCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBNl9fRUlNX0RBNgkJSU9NVVhfUEFEKDB4MDAwLCAweDAzNCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBN19fRUlNX0RBNwkJSU9NVVhfUEFEKDB4MDAwLCAweDAzOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEyX19BVUQ1X1RYQwkJSU9NVVhfUEFEKDB4N2FjLCAweDNhNCwgMSwgMHgwOGU0LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIJCUlPTVVYX1BBRCgweDdhYywgMHgzYTQsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTEwX19FSU1fREExMAkJSU9NVVhfUEFEKDB4MDAwLCAweDA0NCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMTFfX0VJTV9EQTExCQlJT01VWF9QQUQoMHgwMDAsIDB4MDQ4LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREE4X19FSU1fREE4CQlJT01VWF9QQUQoMHgwMDAsIDB4MDNjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREE5X19FSU1fREE5CQlJT01VWF9QQUQoMHgwMDAsIDB4MDQwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDFfREFUQTNfX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4N2IwLCAweDNhOCwgMSwgMHgwOGU4LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEzX19DU1BJX1NTMQkJSU9NVVhfUEFEKDB4N2IwLCAweDNhOCwgMiwgMHgwOTIwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QxX0RBVEEzX19TRDFfREFUQTMJCUlPTVVYX1BBRCgweDdiMCwgMHgzYTgsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzBfX0NTUElfU1MyCQlJT01VWF9QQUQoMHg3YjQsIDB4M2FjLCAyLCAweDA5MjQsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8wX19HUElPMV8wCQlJT01VWF9QQUQoMHg3YjQsIDB4M2FjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QJCUlPTVVYX1BBRCgweDdiNCwgMHgzYWMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzFfX0NTUElfTUlTTwkJSU9NVVhfUEFEKDB4N2I4LCAweDNiMCwgMiwgMHgwOTE4LCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMQkJSU9NVVhfUEFEKDB4N2I4LCAweDNiMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMV9fU0QxX1dQCQlJT01VWF9QQUQoMHg3YjgsIDB4M2IwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREExMl9fRUlNX0RBMTIJCUlPTVVYX1BBRCgweDAwMCwgMHgwNGMsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0VJTV9EQTEzX19FSU1fREExMwkJSU9NVVhfUEFEKDB4MDAwLCAweDA1MCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfRUlNX0RBMTRfX0VJTV9EQTE0CQlJT01VWF9QQUQoMHgwMDAsIDB4MDU0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9FSU1fREExNV9fRUlNX0RBMTUJCUlPTVVYX1BBRCgweDAwMCwgMHgwNTgsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTURfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4MDAwLCAweDNiNCwgMiwgMHgwOTFjLCAzLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0NNRF9fSTJDMV9TQ0wJCUlPTVVYX1BBRCgweDdiYywgMHgzYjQsIDB4MTEsIDB4MDliMCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTURfX1NEMl9DTUQJCUlPTVVYX1BBRCgweDdiYywgMHgzYjQsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4N2MwLCAweDNiOCwgMiwgMHgwOTE0LCAzLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0NMS19fSTJDMV9TREEJCUlPTVVYX1BBRCgweDdjMCwgMHgzYjgsIDB4MTEsIDB4MDliNCwgMiwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9DTEtfX1NEMl9DTEsJCUlPTVVYX1BBRCgweDdjMCwgMHgzYjgsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMF9fQ1NQSV9NSVNPCQlJT01VWF9QQUQoMHg3YzQsIDB4M2JjLCAyLCAweDA5MTgsIDMsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfREFUQTBfX1NEMV9EQVQ0CQlJT01VWF9QQUQoMHg3YzQsIDB4M2JjLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9TRDJfREFUQTBfX1NEMl9EQVRBMAkJSU9NVVhfUEFEKDB4N2M0LCAweDNiYywgMHgxMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEExX19TRDFfREFUNQkJSU9NVVhfUEFEKDB4N2M4LCAweDNjMCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEExX19TRDJfREFUQTEJCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMV9fVVNCSDNfSDJfRFAJSU9NVVhfUEFEKDB4N2M4LCAweDNjMCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEyX19TRDFfREFUNgkJSU9NVVhfUEFEKDB4N2NjLCAweDNjNCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEyX19TRDJfREFUQTIJCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX1NEMl9EQVRBMl9fVVNCSDNfSDJfRE0JSU9NVVhfUEFEKDB4N2NjLCAweDNjNCwgMiwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEzX19DU1BJX1NTMgkJSU9NVVhfUEFEKDB4N2QwLCAweDNjOCwgMiwgMHgwOTI0LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEzX19TRDFfREFUNwkJSU9NVVhfUEFEKDB4N2QwLCAweDNjOCwgMSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfU0QyX0RBVEEzX19TRDJfREFUQTMJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDB4MTAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzJfX0NDTV9PVVRfMgkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgNSwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMl9fR1BJTzFfMgkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfMl9fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDB4MTIsIDB4MDliOCwgMywgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzJfX1BMTDFfQllQCQlJT01VWF9QQUQoMHg3ZDQsIDB4M2NjLCA3LCAweDA5MGMsIDEsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8yX19QV00xX1BXTU8JCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzNfX0dQSU8xXzMJCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDAsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzNfX0kyQzJfU0RBCQlJT01VWF9QQUQoMHg3ZDgsIDB4M2QwLCAweDEyLCAweDA5YmMsIDMsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV8zX19QTEwyX0JZUAkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgNywgMHgwOTEwLCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfM19fUFdNMl9QV01PCQlJT01VWF9QQUQoMHg3ZDgsIDB4M2QwLCAxLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfSU5UX1JFUQlJT01VWF9QQUQoMHg3ZmMsIDB4M2Q0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfUE1VX0lSUV9CCUlPTVVYX1BBRCgweDdmYywgMHgzZDQsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzRfX0RJU1AyX0VYVF9DTEsJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgNCwgMHgwOTA4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNF9fRUlNX1JEWQkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgMywgMHgwOTM4LCAxLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNF9fR1BJTzFfNAkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfNF9fV0RPRzFfV0RPR19CCQlJT01VWF9QQUQoMHg4MDQsIDB4M2Q4LCAyLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV81X19DU0kyX01DTEsJCUlPTVVYX1BBRCgweDgwOCwgMHgzZGMsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzVfX0RJU1AyX1BJTjE2CQlJT01VWF9QQUQoMHg4MDgsIDB4M2RjLCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV81X19HUElPMV81CQlJT01VWF9QQUQoMHg4MDgsIDB4M2RjLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV81X19XRE9HMl9XRE9HX0IJCUlPTVVYX1BBRCgweDgwOCwgMHgzZGMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzZfX0RJU1AyX1BJTjE3CQlJT01VWF9QQUQoMHg4MGMsIDB4M2UwLCA0LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV82X19HUElPMV82CQlJT01VWF9QQUQoMHg4MGMsIDB4M2UwLCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV82X19SRUZfRU5fQgkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfN19fQ0NNX09VVF8wCQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCAzLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV83X19HUElPMV83CQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCAwLCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV83X19TRDJfV1AJCUlPTVVYX1BBRCgweDgxMCwgMHgzZTQsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzdfX1NQRElGX09VVDEJCUlPTVVYX1BBRCgweDgxMCwgMHgzZTQsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzhfX0NTSTJfREFUQV9FTgkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgMiwgMHgwOTljLCAyLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOF9fR1BJTzFfOAkJSU9NVVhfUEFEKDB4ODE0LCAweDNlOCwgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOF9fU0QyX0NECQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCA2LCAweDAwMDAsIDAsIDApCi0jZGVmaW5lIF9NWDUxX1BBRF9HUElPMV84X19VU0JIM19QV1IJCUlPTVVYX1BBRCgweDgxNCwgMHgzZTgsIDEsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX0NDTV9PVVRfMQkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfRDFfQ1MJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDIsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX0RJU1AyX1NFUl9DUwkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgNywgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOV9fR1BJTzFfOQkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMCwgMHgwMDAwLCAwLCAwKQotI2RlZmluZSBfTVg1MV9QQURfR1BJTzFfOV9fU0QyX0xDVEwJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDYsIDB4MDAwMCwgMCwgMCkKLSNkZWZpbmUgX01YNTFfUEFEX0dQSU8xXzlfX1VTQkgzX09DCQlJT01VWF9QQUQoMHg4MTgsIDB4M2VjLCAxLCAweDAwMDAsIDAsIDApCiAKIC8qIFRoZSBzYW1lIHBpbnMgYXMgYWJvdmUgYnV0IHdpdGggdGhlIGRlZmF1bHQgcGFkIGNvbnRyb2wgdmFsdWVzIGFwcGxpZWQgKi8KLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fQVVENF9SWEZTCQkoX01YNTFfUEFEX0VJTV9EMTZfX0FVRDRfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0FVRDVfVFhECQkoX01YNTFfUEFEX0VJTV9EMTZfX0FVRDVfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fRUlNX0QxNgkJKF9NWDUxX1BBRF9FSU1fRDE2X19FSU1fRDE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fR1BJTzJfMAkJKF9NWDUxX1BBRF9FSU1fRDE2X19HUElPMl8wIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBCQkoX01YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fVUFSVDJfQ1RTCQkoX01YNTFfUEFEX0VJTV9EMTZfX1VBUlQyX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19VU0JIMl9EQVRBMAkJKF9NWDUxX1BBRF9FSU1fRDE2X19VU0JIMl9EQVRBMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX0FVRDVfUlhECQkoX01YNTFfUEFEX0VJTV9EMTdfX0FVRDVfUlhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fRUlNX0QxNwkJKF9NWDUxX1BBRF9FSU1fRDE3X19FSU1fRDE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fR1BJTzJfMQkJKF9NWDUxX1BBRF9FSU1fRDE3X19HUElPMl8xIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX1VBUlQyX1JYRAkJKF9NWDUxX1BBRF9FSU1fRDE3X19VQVJUMl9SWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fVUFSVDNfQ1RTCQkoX01YNTFfUEFEX0VJTV9EMTdfX1VBUlQzX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19VU0JIMl9EQVRBMQkJKF9NWDUxX1BBRF9FSU1fRDE3X19VU0JIMl9EQVRBMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX0FVRDVfVFhDCQkoX01YNTFfUEFEX0VJTV9EMThfX0FVRDVfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fRUlNX0QxOAkJKF9NWDUxX1BBRF9FSU1fRDE4X19FSU1fRDE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fR1BJTzJfMgkJKF9NWDUxX1BBRF9FSU1fRDE4X19HUElPMl8yIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX1VBUlQyX1RYRAkJKF9NWDUxX1BBRF9FSU1fRDE4X19VQVJUMl9UWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fVUFSVDNfUlRTCQkoX01YNTFfUEFEX0VJTV9EMThfX1VBUlQzX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19VU0JIMl9EQVRBMgkJKF9NWDUxX1BBRF9FSU1fRDE4X19VU0JIMl9EQVRBMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0FVRDRfUlhDCQkoX01YNTFfUEFEX0VJTV9EMTlfX0FVRDRfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fQVVENV9UWEZTCQkoX01YNTFfUEFEX0VJTV9EMTlfX0FVRDVfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0VJTV9EMTkJCShfTVg1MV9QQURfRUlNX0QxOV9fRUlNX0QxOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0dQSU8yXzMJCShfTVg1MV9QQURfRUlNX0QxOV9fR1BJTzJfMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19JMkMxX1NDTAkJKF9NWDUxX1BBRF9FSU1fRDE5X19JMkMxX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX1VBUlQyX1JUUwkJKF9NWDUxX1BBRF9FSU1fRDE5X19VQVJUMl9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fVVNCSDJfREFUQTMJCShfTVg1MV9QQURfRUlNX0QxOV9fVVNCSDJfREFUQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19BVUQ0X1RYRAkJKF9NWDUxX1BBRF9FSU1fRDIwX19BVUQ0X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX0VJTV9EMjAJCShfTVg1MV9QQURfRUlNX0QyMF9fRUlNX0QyMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX0dQSU8yXzQJCShfTVg1MV9QQURfRUlNX0QyMF9fR1BJTzJfNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19TUlRDX0FMQVJNX0RFQgkoX01YNTFfUEFEX0VJTV9EMjBfX1NSVENfQUxBUk1fREVCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fVVNCSDJfREFUQTQJCShfTVg1MV9QQURfRUlNX0QyMF9fVVNCSDJfREFUQTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19BVUQ0X1JYRAkJKF9NWDUxX1BBRF9FSU1fRDIxX19BVUQ0X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX0VJTV9EMjEJCShfTVg1MV9QQURfRUlNX0QyMV9fRUlNX0QyMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX0dQSU8yXzUJCShfTVg1MV9QQURfRUlNX0QyMV9fR1BJTzJfNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19TUlRDX0FMQVJNX0RFQgkoX01YNTFfUEFEX0VJTV9EMjFfX1NSVENfQUxBUk1fREVCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fVVNCSDJfREFUQTUJCShfTVg1MV9QQURfRUlNX0QyMV9fVVNCSDJfREFUQTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19BVUQ0X1RYQwkJKF9NWDUxX1BBRF9FSU1fRDIyX19BVUQ0X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX0VJTV9EMjIJCShfTVg1MV9QQURfRUlNX0QyMl9fRUlNX0QyMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX0dQSU8yXzYJCShfTVg1MV9QQURfRUlNX0QyMl9fR1BJTzJfNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIyX19VU0JIMl9EQVRBNgkJKF9NWDUxX1BBRF9FSU1fRDIyX19VU0JIMl9EQVRBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX0FVRDRfVFhGUwkJKF9NWDUxX1BBRF9FSU1fRDIzX19BVUQ0X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19FSU1fRDIzCQkoX01YNTFfUEFEX0VJTV9EMjNfX0VJTV9EMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19HUElPMl83CQkoX01YNTFfUEFEX0VJTV9EMjNfX0dQSU8yXzcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fU1BESUZfT1VUMQkJKF9NWDUxX1BBRF9FSU1fRDIzX19TUERJRl9PVVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fVVNCSDJfREFUQTcJCShfTVg1MV9QQURfRUlNX0QyM19fVVNCSDJfREFUQTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19BVUQ2X1JYRlMJCShfTVg1MV9QQURfRUlNX0QyNF9fQVVENl9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fRUlNX0QyNAkJKF9NWDUxX1BBRF9FSU1fRDI0X19FSU1fRDI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fR1BJTzJfOAkJKF9NWDUxX1BBRF9FSU1fRDI0X19HUElPMl84IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX0kyQzJfU0RBCQkoX01YNTFfUEFEX0VJTV9EMjRfX0kyQzJfU0RBIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fVUFSVDNfQ1RTCQkoX01YNTFfUEFEX0VJTV9EMjRfX1VBUlQzX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19VU0JPVEdfREFUQTAJCShfTVg1MV9QQURfRUlNX0QyNF9fVVNCT1RHX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fRUlNX0QyNQkJKF9NWDUxX1BBRF9FSU1fRDI1X19FSU1fRDI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fS0VZX0NPTDYJCShfTVg1MV9QQURfRUlNX0QyNV9fS0VZX0NPTDYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19VQVJUMl9DVFMJCShfTVg1MV9QQURfRUlNX0QyNV9fVUFSVDJfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRAkJKF9NWDUxX1BBRF9FSU1fRDI1X19VQVJUM19SWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fVVNCT1RHX0RBVEExCQkoX01YNTFfUEFEX0VJTV9EMjVfX1VTQk9UR19EQVRBMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX0VJTV9EMjYJCShfTVg1MV9QQURfRUlNX0QyNl9fRUlNX0QyNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX0tFWV9DT0w3CQkoX01YNTFfUEFEX0VJTV9EMjZfX0tFWV9DT0w3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fVUFSVDJfUlRTCQkoX01YNTFfUEFEX0VJTV9EMjZfX1VBUlQyX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19VQVJUM19UWEQJCShfTVg1MV9QQURfRUlNX0QyNl9fVUFSVDNfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX1VTQk9UR19EQVRBMgkJKF9NWDUxX1BBRF9FSU1fRDI2X19VU0JPVEdfREFUQTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19BVUQ2X1JYQwkJKF9NWDUxX1BBRF9FSU1fRDI3X19BVUQ2X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0VJTV9EMjcJCShfTVg1MV9QQURfRUlNX0QyN19fRUlNX0QyNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0dQSU8yXzkJCShfTVg1MV9QQURfRUlNX0QyN19fR1BJTzJfOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19JMkMyX1NDTAkJKF9NWDUxX1BBRF9FSU1fRDI3X19JMkMyX1NDTCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX1VBUlQzX1JUUwkJKF9NWDUxX1BBRF9FSU1fRDI3X19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fVVNCT1RHX0RBVEEzCQkoX01YNTFfUEFEX0VJTV9EMjdfX1VTQk9UR19EQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjhfX0FVRDZfVFhECQkoX01YNTFfUEFEX0VJTV9EMjhfX0FVRDZfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fRUlNX0QyOAkJKF9NWDUxX1BBRF9FSU1fRDI4X19FSU1fRDI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fS0VZX1JPVzQJCShfTVg1MV9QQURfRUlNX0QyOF9fS0VZX1JPVzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI4X19VU0JPVEdfREFUQTQJCShfTVg1MV9QQURfRUlNX0QyOF9fVVNCT1RHX0RBVEE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fQVVENl9SWEQJCShfTVg1MV9QQURfRUlNX0QyOV9fQVVENl9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19FSU1fRDI5CQkoX01YNTFfUEFEX0VJTV9EMjlfX0VJTV9EMjkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19LRVlfUk9XNQkJKF9NWDUxX1BBRF9FSU1fRDI5X19LRVlfUk9XNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjlfX1VTQk9UR19EQVRBNQkJKF9NWDUxX1BBRF9FSU1fRDI5X19VU0JPVEdfREFUQTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMwX19BVUQ2X1RYQwkJKF9NWDUxX1BBRF9FSU1fRDMwX19BVUQ2X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX0VJTV9EMzAJCShfTVg1MV9QQURfRUlNX0QzMF9fRUlNX0QzMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzBfX0tFWV9ST1c2CQkoX01YNTFfUEFEX0VJTV9EMzBfX0tFWV9ST1c2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fVVNCT1RHX0RBVEE2CQkoX01YNTFfUEFEX0VJTV9EMzBfX1VTQk9UR19EQVRBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0FVRDZfVFhGUwkJKF9NWDUxX1BBRF9FSU1fRDMxX19BVUQ2X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMxX19FSU1fRDMxCQkoX01YNTFfUEFEX0VJTV9EMzFfX0VJTV9EMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMxX19LRVlfUk9XNwkJKF9NWDUxX1BBRF9FSU1fRDMxX19LRVlfUk9XNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX1VTQk9UR19EQVRBNwkJKF9NWDUxX1BBRF9FSU1fRDMxX19VU0JPVEdfREFUQTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE2X19FSU1fQTE2CQkoX01YNTFfUEFEX0VJTV9BMTZfX0VJTV9BMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE2X19HUElPMl8xMAkJKF9NWDUxX1BBRF9FSU1fQTE2X19HUElPMl8xMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE2X19PU0NfRlJFUV9TRUwwCQkoX01YNTFfUEFEX0VJTV9BMTZfX09TQ19GUkVRX1NFTDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE3X19FSU1fQTE3CQkoX01YNTFfUEFEX0VJTV9BMTdfX0VJTV9BMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE3X19HUElPMl8xMQkJKF9NWDUxX1BBRF9FSU1fQTE3X19HUElPMl8xMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE3X19PU0NfRlJFUV9TRUwxCQkoX01YNTFfUEFEX0VJTV9BMTdfX09TQ19GUkVRX1NFTDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE4X19CT09UX0xQQjAJCShfTVg1MV9QQURfRUlNX0ExOF9fQk9PVF9MUEIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fRUlNX0ExOAkJKF9NWDUxX1BBRF9FSU1fQTE4X19FSU1fQTE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fR1BJTzJfMTIJCShfTVg1MV9QQURfRUlNX0ExOF9fR1BJTzJfMTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOV9fQk9PVF9MUEIxCQkoX01YNTFfUEFEX0VJTV9BMTlfX0JPT1RfTFBCMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0VJTV9BMTkJCShfTVg1MV9QQURfRUlNX0ExOV9fRUlNX0ExOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0dQSU8yXzEzCQkoX01YNTFfUEFEX0VJTV9BMTlfX0dQSU8yXzEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjBfX0JPT1RfVUFSVF9TUkMwCShfTVg1MV9QQURfRUlNX0EyMF9fQk9PVF9VQVJUX1NSQzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIwX19FSU1fQTIwCQkoX01YNTFfUEFEX0VJTV9BMjBfX0VJTV9BMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIwX19HUElPMl8xNAkJKF9NWDUxX1BBRF9FSU1fQTIwX19HUElPMl8xNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIxX19CT09UX1VBUlRfU1JDMQkoX01YNTFfUEFEX0VJTV9BMjFfX0JPT1RfVUFSVF9TUkMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMV9fRUlNX0EyMQkJKF9NWDUxX1BBRF9FSU1fQTIxX19FSU1fQTIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMV9fR1BJTzJfMTUJCShfTVg1MV9QQURfRUlNX0EyMV9fR1BJTzJfMTUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMl9fRUlNX0EyMgkJKF9NWDUxX1BBRF9FSU1fQTIyX19FSU1fQTIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMl9fR1BJTzJfMTYJCShfTVg1MV9QQURfRUlNX0EyMl9fR1BJTzJfMTYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyM19fQk9PVF9IUE5fRU4JCShfTVg1MV9QQURfRUlNX0EyM19fQk9PVF9IUE5fRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIzX19FSU1fQTIzCQkoX01YNTFfUEFEX0VJTV9BMjNfX0VJTV9BMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIzX19HUElPMl8xNwkJKF9NWDUxX1BBRF9FSU1fQTIzX19HUElPMl8xNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19FSU1fQTI0CQkoX01YNTFfUEFEX0VJTV9BMjRfX0VJTV9BMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19HUElPMl8xOAkJKF9NWDUxX1BBRF9FSU1fQTI0X19HUElPMl8xOCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19VU0JIMl9DTEsJCShfTVg1MV9QQURfRUlNX0EyNF9fVVNCSDJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fRElTUDFfUElONAkJKF9NWDUxX1BBRF9FSU1fQTI1X19ESVNQMV9QSU40IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fRUlNX0EyNQkJKF9NWDUxX1BBRF9FSU1fQTI1X19FSU1fQTI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fR1BJTzJfMTkJCShfTVg1MV9QQURfRUlNX0EyNV9fR1BJTzJfMTkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fVVNCSDJfRElSCQkoX01YNTFfUEFEX0VJTV9BMjVfX1VTQkgyX0RJUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX0NTSTFfREFUQV9FTgkJKF9NWDUxX1BBRF9FSU1fQTI2X19DU0kxX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19ESVNQMl9FWFRfQ0xLCQkoX01YNTFfUEFEX0VJTV9BMjZfX0RJU1AyX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19FSU1fQTI2CQkoX01YNTFfUEFEX0VJTV9BMjZfX0VJTV9BMjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19HUElPMl8yMAkJKF9NWDUxX1BBRF9FSU1fQTI2X19HUElPMl8yMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19VU0JIMl9TVFAJCShfTVg1MV9QQURfRUlNX0EyNl9fVVNCSDJfU1RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0EyN19fQ1NJMl9EQVRBX0VOCQkoX01YNTFfUEFEX0VJTV9BMjdfX0NTSTJfREFUQV9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0RJU1AxX1BJTjEJCShfTVg1MV9QQURfRUlNX0EyN19fRElTUDFfUElOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0VJTV9BMjcJCShfTVg1MV9QQURfRUlNX0EyN19fRUlNX0EyNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxCQkoX01YNTFfUEFEX0VJTV9BMjdfX0dQSU8yXzIxIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX1VTQkgyX05YVAkJKF9NWDUxX1BBRF9FSU1fQTI3X19VU0JIMl9OWFQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIwX19FSU1fRUIwCQkoX01YNTFfUEFEX0VJTV9FQjBfX0VJTV9FQjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIxX19FSU1fRUIxCQkoX01YNTFfUEFEX0VJTV9FQjFfX0VJTV9FQjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19BVUQ1X1JYRlMJCShfTVg1MV9QQURfRUlNX0VCMl9fQVVENV9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fQ1NJMV9EMgkJKF9NWDUxX1BBRF9FSU1fRUIyX19DU0kxX0QyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fRUlNX0VCMgkJKF9NWDUxX1BBRF9FSU1fRUIyX19FSU1fRUIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fRkVDX01ESU8JCShfTVg1MV9QQURfRUlNX0VCMl9fRkVDX01ESU8gfCBcCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0FVRDRfUlhGUwkJSU9NVVhfUEFEKDB4M2YwLCAweDA1YywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19BVUQ1X1RYRAkJSU9NVVhfUEFEKDB4M2YwLCAweDA1YywgNywgMHg4ZDgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE2X19FSU1fRDE2CQlJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0dQSU8yXzAJCUlPTVVYX1BBRCgweDNmMCwgMHgwNWMsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX0kyQzFfU0RBCQlJT01VWF9QQUQoMHgzZjAsIDB4MDVjLCAweDE0LCAweDliNCwgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTZfX1VBUlQyX0NUUwkJSU9NVVhfUEFEKDB4M2YwLCAweDA1YywgMywgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxNl9fVVNCSDJfREFUQTAJCUlPTVVYX1BBRCgweDNmMCwgMHgwNWMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fQVVENV9SWEQJCUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDcsIDB4OGQ0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fRUlNX0QxNwkJSU9NVVhfUEFEKDB4M2Y0LCAweDA2MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19HUElPMl8xCQlJT01VWF9QQUQoMHgzZjQsIDB4MDYwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE3X19VQVJUMl9SWEQJCUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDMsIDB4OWVjLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTdfX1VBUlQzX0NUUwkJSU9NVVhfUEFEKDB4M2Y0LCAweDA2MCwgNCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxN19fVVNCSDJfREFUQTEJCUlPTVVYX1BBRCgweDNmNCwgMHgwNjAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fQVVENV9UWEMJCUlPTVVYX1BBRCgweDNmOCwgMHgwNjQsIDcsIDB4OGU0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fRUlNX0QxOAkJSU9NVVhfUEFEKDB4M2Y4LCAweDA2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19HUElPMl8yCQlJT01VWF9QQUQoMHgzZjgsIDB4MDY0LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE4X19VQVJUMl9UWEQJCUlPTVVYX1BBRCgweDNmOCwgMHgwNjQsIDMsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMThfX1VBUlQzX1JUUwkJSU9NVVhfUEFEKDB4M2Y4LCAweDA2NCwgNCwgMHg5ZjAsIDEsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOF9fVVNCSDJfREFUQTIJCUlPTVVYX1BBRCgweDNmOCwgMHgwNjQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fQVVENF9SWEMJCUlPTVVYX1BBRCgweDNmYywgMHgwNjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fQVVENV9UWEZTCQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCA3LCAweDhlOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMTlfX0VJTV9EMTkJCUlPTVVYX1BBRCgweDNmYywgMHgwNjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fR1BJTzJfMwkJSU9NVVhfUEFEKDB4M2ZjLCAweDA2OCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fSTJDMV9TQ0wJCUlPTVVYX1BBRCgweDNmYywgMHgwNjgsIDB4MTQsIDB4OWIwLCAwLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QxOV9fVUFSVDJfUlRTCQlJT01VWF9QQUQoMHgzZmMsIDB4MDY4LCAzLCAweDllOCwgMSwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDE5X19VU0JIMl9EQVRBMwkJSU9NVVhfUEFEKDB4M2ZjLCAweDA2OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19BVUQ0X1RYRAkJSU9NVVhfUEFEKDB4NDAwLCAweDA2YywgNSwgMHg4YzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIwX19FSU1fRDIwCQlJT01VWF9QQUQoMHg0MDAsIDB4MDZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX0dQSU8yXzQJCUlPTVVYX1BBRCgweDQwMCwgMHgwNmMsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjBfX1NSVENfQUxBUk1fREVCCUlPTVVYX1BBRCgweDQwMCwgMHgwNmMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMF9fVVNCSDJfREFUQTQJCUlPTVVYX1BBRCgweDQwMCwgMHgwNmMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fQVVENF9SWEQJCUlPTVVYX1BBRCgweDQwNCwgMHgwNzAsIDUsIDB4OGM0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMV9fRUlNX0QyMQkJSU9NVVhfUEFEKDB4NDA0LCAweDA3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19HUElPMl81CQlJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIxX19TUlRDX0FMQVJNX0RFQglJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjFfX1VTQkgyX0RBVEE1CQlJT01VWF9QQUQoMHg0MDQsIDB4MDcwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX0FVRDRfVFhDCQlJT01VWF9QQUQoMHg0MDgsIDB4MDc0LCA1LCAweDhjYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjJfX0VJTV9EMjIJCUlPTVVYX1BBRCgweDQwOCwgMHgwNzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMl9fR1BJTzJfNgkJSU9NVVhfUEFEKDB4NDA4LCAweDA3NCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyMl9fVVNCSDJfREFUQTYJCUlPTVVYX1BBRCgweDQwOCwgMHgwNzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fQVVENF9UWEZTCQlJT01VWF9QQUQoMHg0MGMsIDB4MDc4LCA1LCAweDhkMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjNfX0VJTV9EMjMJCUlPTVVYX1BBRCgweDQwYywgMHgwNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fR1BJTzJfNwkJSU9NVVhfUEFEKDB4NDBjLCAweDA3OCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyM19fU1BESUZfT1VUMQkJSU9NVVhfUEFEKDB4NDBjLCAweDA3OCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDIzX19VU0JIMl9EQVRBNwkJSU9NVVhfUEFEKDB4NDBjLCAweDA3OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19BVUQ2X1JYRlMJCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIDUsIDB4OGY4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNF9fRUlNX0QyNAkJSU9NVVhfUEFEKDB4NDEwLCAweDA3YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19HUElPMl84CQlJT01VWF9QQUQoMHg0MTAsIDB4MDdjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19JMkMyX1NEQQkJSU9NVVhfUEFEKDB4NDEwLCAweDA3YywgMHgxNCwgMHg5YmMsIDAsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI0X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDQxMCwgMHgwN2MsIDMsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjRfX1VTQk9UR19EQVRBMAkJSU9NVVhfUEFEKDB4NDEwLCAweDA3YywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19FSU1fRDI1CQlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX0tFWV9DT0w2CQlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCAxLCAweDljOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjVfX1VBUlQyX0NUUwkJSU9NVVhfUEFEKDB4NDE0LCAweDA4MCwgNCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNV9fVUFSVDNfUlhECQlJT01VWF9QQUQoMHg0MTQsIDB4MDgwLCAzLCAweDlmNCwgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI1X19VU0JPVEdfREFUQTEJCUlPTVVYX1BBRCgweDQxNCwgMHgwODAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fRUlNX0QyNgkJSU9NVVhfUEFEKDB4NDE4LCAweDA4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19LRVlfQ09MNwkJSU9NVVhfUEFEKDB4NDE4LCAweDA4NCwgMSwgMHg5Y2MsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI2X19VQVJUMl9SVFMJCUlPTVVYX1BBRCgweDQxOCwgMHgwODQsIDQsIDB4OWU4LCAzLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjZfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NDE4LCAweDA4NCwgMywgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyNl9fVVNCT1RHX0RBVEEyCQlJT01VWF9QQUQoMHg0MTgsIDB4MDg0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0FVRDZfUlhDCQlJT01VWF9QQUQoMHg0MWMsIDB4MDg4LCA1LCAweDhmNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMjdfX0VJTV9EMjcJCUlPTVVYX1BBRCgweDQxYywgMHgwODgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fR1BJTzJfOQkJSU9NVVhfUEFEKDB4NDFjLCAweDA4OCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fSTJDMl9TQ0wJCUlPTVVYX1BBRCgweDQxYywgMHgwODgsIDB4MTQsIDB4OWI4LCAwLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyN19fVUFSVDNfUlRTCQlJT01VWF9QQUQoMHg0MWMsIDB4MDg4LCAzLCAweDlmMCwgMywgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI3X19VU0JPVEdfREFUQTMJCUlPTVVYX1BBRCgweDQxYywgMHgwODgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fQVVENl9UWEQJCUlPTVVYX1BBRCgweDQyMCwgMHgwOGMsIDUsIDB4OGYwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOF9fRUlNX0QyOAkJSU9NVVhfUEFEKDB4NDIwLCAweDA4YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI4X19LRVlfUk9XNAkJSU9NVVhfUEFEKDB4NDIwLCAweDA4YywgMSwgMHg5ZDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI4X19VU0JPVEdfREFUQTQJCUlPTVVYX1BBRCgweDQyMCwgMHgwOGMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fQVVENl9SWEQJCUlPTVVYX1BBRCgweDQyNCwgMHgwOTAsIDUsIDB4OGVjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QyOV9fRUlNX0QyOQkJSU9NVVhfUEFEKDB4NDI0LCAweDA5MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19LRVlfUk9XNQkJSU9NVVhfUEFEKDB4NDI0LCAweDA5MCwgMSwgMHg5ZDQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDI5X19VU0JPVEdfREFUQTUJCUlPTVVYX1BBRCgweDQyNCwgMHgwOTAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fQVVENl9UWEMJCUlPTVVYX1BBRCgweDQyOCwgMHgwOTQsIDUsIDB4OGZjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMF9fRUlNX0QzMAkJSU9NVVhfUEFEKDB4NDI4LCAweDA5NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMwX19LRVlfUk9XNgkJSU9NVVhfUEFEKDB4NDI4LCAweDA5NCwgMSwgMHg5ZDgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRDMwX19VU0JPVEdfREFUQTYJCUlPTVVYX1BBRCgweDQyOCwgMHgwOTQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMV9fQVVENl9UWEZTCQlJT01VWF9QQUQoMHg0MmMsIDB4MDk4LCA1LCAweDkwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EMzFfX0VJTV9EMzEJCUlPTVVYX1BBRCgweDQyYywgMHgwOTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMV9fS0VZX1JPVzcJCUlPTVVYX1BBRCgweDQyYywgMHgwOTgsIDEsIDB4OWRjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0QzMV9fVVNCT1RHX0RBVEE3CQlJT01VWF9QQUQoMHg0MmMsIDB4MDk4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTZfX0VJTV9BMTYJCUlPTVVYX1BBRCgweDQzMCwgMHgwOWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExNl9fR1BJTzJfMTAJCUlPTVVYX1BBRCgweDQzMCwgMHgwOWMsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTZfX09TQ19GUkVRX1NFTDAJCUlPTVVYX1BBRCgweDQzMCwgMHgwOWMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fRUlNX0ExNwkJSU9NVVhfUEFEKDB4NDM0LCAweDBhMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE3X19HUElPMl8xMQkJSU9NVVhfUEFEKDB4NDM0LCAweDBhMCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExN19fT1NDX0ZSRVFfU0VMMQkJSU9NVVhfUEFEKDB4NDM0LCAweDBhMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE4X19CT09UX0xQQjAJCUlPTVVYX1BBRCgweDQzOCwgMHgwYTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOF9fRUlNX0ExOAkJSU9NVVhfUEFEKDB4NDM4LCAweDBhNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTE4X19HUElPMl8xMgkJSU9NVVhfUEFEKDB4NDM4LCAweDBhNCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOV9fQk9PVF9MUEIxCQlJT01VWF9QQUQoMHg0M2MsIDB4MGE4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMTlfX0VJTV9BMTkJCUlPTVVYX1BBRCgweDQzYywgMHgwYTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0ExOV9fR1BJTzJfMTMJCUlPTVVYX1BBRCgweDQzYywgMHgwYTgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjBfX0JPT1RfVUFSVF9TUkMwCUlPTVVYX1BBRCgweDQ0MCwgMHgwYWMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMF9fRUlNX0EyMAkJSU9NVVhfUEFEKDB4NDQwLCAweDBhYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIwX19HUElPMl8xNAkJSU9NVVhfUEFEKDB4NDQwLCAweDBhYywgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyMV9fQk9PVF9VQVJUX1NSQzEJSU9NVVhfUEFEKDB4NDQ0LCAweDBiMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIxX19FSU1fQTIxCQlJT01VWF9QQUQoMHg0NDQsIDB4MGIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjFfX0dQSU8yXzE1CQlJT01VWF9QQUQoMHg0NDQsIDB4MGIwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIyX19FSU1fQTIyCQlJT01VWF9QQUQoMHg0NDgsIDB4MGI0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjJfX0dQSU8yXzE2CQlJT01VWF9QQUQoMHg0NDgsIDB4MGI0LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIzX19CT09UX0hQTl9FTgkJSU9NVVhfUEFEKDB4NDRjLCAweDBiOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTIzX19FSU1fQTIzCQlJT01VWF9QQUQoMHg0NGMsIDB4MGI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjNfX0dQSU8yXzE3CQlJT01VWF9QQUQoMHg0NGMsIDB4MGI4LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19FSU1fQTI0CQlJT01VWF9QQUQoMHg0NTAsIDB4MGJjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjRfX0dQSU8yXzE4CQlJT01VWF9QQUQoMHg0NTAsIDB4MGJjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI0X19VU0JIMl9DTEsJCUlPTVVYX1BBRCgweDQ1MCwgMHgwYmMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNV9fRElTUDFfUElONAkJSU9NVVhfUEFEKDB4NDU0LCAweDBjMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI1X19FSU1fQTI1CQlJT01VWF9QQUQoMHg0NTQsIDB4MGMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjVfX0dQSU8yXzE5CQlJT01VWF9QQUQoMHg0NTQsIDB4MGMwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI1X19VU0JIMl9ESVIJCUlPTVVYX1BBRCgweDQ1NCwgMHgwYzAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fQ1NJMV9EQVRBX0VOCQlJT01VWF9QQUQoMHg0NTgsIDB4MGM0LCA1LCAweDlhMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjZfX0RJU1AyX0VYVF9DTEsJCUlPTVVYX1BBRCgweDQ1OCwgMHgwYzQsIDYsIDB4OTA4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fRUlNX0EyNgkJSU9NVVhfUEFEKDB4NDU4LCAweDBjNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI2X19HUElPMl8yMAkJSU9NVVhfUEFEKDB4NDU4LCAweDBjNCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyNl9fVVNCSDJfU1RQCQlJT01VWF9QQUQoMHg0NTgsIDB4MGM0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0NTSTJfREFUQV9FTgkJSU9NVVhfUEFEKDB4NDVjLCAweDBjOCwgNSwgMHg5OWMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQTI3X19ESVNQMV9QSU4xCQlJT01VWF9QQUQoMHg0NWMsIDB4MGM4LCA2LCAweDlhNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX0VJTV9BMjcJCUlPTVVYX1BBRCgweDQ1YywgMHgwYzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0EyN19fR1BJTzJfMjEJCUlPTVVYX1BBRCgweDQ1YywgMHgwYzgsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9BMjdfX1VTQkgyX05YVAkJSU9NVVhfUEFEKDB4NDVjLCAweDBjOCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIwX19FSU1fRUIwCQlJT01VWF9QQUQoMHg0NjAsIDB4MGNjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjFfX0VJTV9FQjEJCUlPTVVYX1BBRCgweDQ2NCwgMHgwZDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fQVVENV9SWEZTCQlJT01VWF9QQUQoMHg0NjgsIDB4MGQ0LCA2LCAweDhlMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0NTSTFfRDIJCUlPTVVYX1BBRCgweDQ2OCwgMHgwZDQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCMl9fRUlNX0VCMgkJSU9NVVhfUEFEKDB4NDY4LCAweDBkNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19GRUNfTURJTwkJKElPTVVYX1BBRCgweDQ2OCwgMHgwZDQsIDMsIDB4OTU0LCAwLCAwKSB8IFwKIAkJTVVYX1BBRF9DVFJMKFBBRF9DVExfUFVTXzIyS19VUCB8IFBBRF9DVExfUEtFIHwgUEFEX0NUTF9TUkVfRkFTVCB8IFwKIAkJUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVFIHwgUEFEX0NUTF9IWVMpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19HUElPMl8yMgkJKF9NWDUxX1BBRF9FSU1fRUIyX19HUElPMl8yMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19HUFRfQ01QT1VUMQkJKF9NWDUxX1BBRF9FSU1fRUIyX19HUFRfQ01QT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0FVRDVfUlhDCQkoX01YNTFfUEFEX0VJTV9FQjNfX0FVRDVfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fQ1NJMV9EMwkJKF9NWDUxX1BBRF9FSU1fRUIzX19DU0kxX0QzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fRUlNX0VCMwkJKF9NWDUxX1BBRF9FSU1fRUIzX19FSU1fRUIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fRkVDX1JEQVRBMQkJKF9NWDUxX1BBRF9FSU1fRUIzX19GRUNfUkRBVEExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fR1BJTzJfMjMJCShfTVg1MV9QQURfRUlNX0VCM19fR1BJTzJfMjMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fR1BUX0NNUE9VVDIJCShfTVg1MV9QQURfRUlNX0VCM19fR1BUX0NNUE9VVDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fT0VfX0VJTV9PRQkJCShfTVg1MV9QQURfRUlNX09FX19FSU1fT0UgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fT0VfX0dQSU8yXzI0CQkoX01YNTFfUEFEX0VJTV9PRV9fR1BJTzJfMjQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMF9fRUlNX0NTMAkJKF9NWDUxX1BBRF9FSU1fQ1MwX19FSU1fQ1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMF9fR1BJTzJfMjUJCShfTVg1MV9QQURfRUlNX0NTMF9fR1BJTzJfMjUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMV9fRUlNX0NTMQkJKF9NWDUxX1BBRF9FSU1fQ1MxX19FSU1fQ1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMV9fR1BJTzJfMjYJCShfTVg1MV9QQURfRUlNX0NTMV9fR1BJTzJfMjYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fQVVENV9UWEQJCShfTVg1MV9QQURfRUlNX0NTMl9fQVVENV9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19DU0kxX0Q0CQkoX01YNTFfUEFEX0VJTV9DUzJfX0NTSTFfRDQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19FSU1fQ1MyCQkoX01YNTFfUEFEX0VJTV9DUzJfX0VJTV9DUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19GRUNfUkRBVEEyCQkoX01YNTFfUEFEX0VJTV9DUzJfX0ZFQ19SREFUQTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19HUElPMl8yNwkJKF9NWDUxX1BBRF9FSU1fQ1MyX19HUElPMl8yNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19VU0JPVEdfU1RQCQkoX01YNTFfUEFEX0VJTV9DUzJfX1VTQk9UR19TVFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19BVUQ1X1JYRAkJKF9NWDUxX1BBRF9FSU1fQ1MzX19BVUQ1X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0NTSTFfRDUJCShfTVg1MV9QQURfRUlNX0NTM19fQ1NJMV9ENSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0VJTV9DUzMJCShfTVg1MV9QQURfRUlNX0NTM19fRUlNX0NTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0ZFQ19SREFUQTMJCShfTVg1MV9QQURfRUlNX0NTM19fRkVDX1JEQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0dQSU8yXzI4CQkoX01YNTFfUEFEX0VJTV9DUzNfX0dQSU8yXzI4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX1VTQk9UR19OWFQJCShfTVg1MV9QQURfRUlNX0NTM19fVVNCT1RHX05YVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0FVRDVfVFhDCQkoX01YNTFfUEFEX0VJTV9DUzRfX0FVRDVfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fQ1NJMV9ENgkJKF9NWDUxX1BBRF9FSU1fQ1M0X19DU0kxX0Q2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fRUlNX0NTNAkJKF9NWDUxX1BBRF9FSU1fQ1M0X19FSU1fQ1M0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fRkVDX1JYX0VSCQkoX01YNTFfUEFEX0VJTV9DUzRfX0ZFQ19SWF9FUiB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzIpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19HUElPMl8yOQkJKF9NWDUxX1BBRF9FSU1fQ1M0X19HUElPMl8yOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19VU0JPVEdfQ0xLCQkoX01YNTFfUEFEX0VJTV9DUzRfX1VTQk9UR19DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19BVUQ1X1RYRlMJCShfTVg1MV9QQURfRUlNX0NTNV9fQVVENV9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fQ1NJMV9ENwkJKF9NWDUxX1BBRF9FSU1fQ1M1X19DU0kxX0Q3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fRElTUDFfRVhUX0NMSwkJKF9NWDUxX1BBRF9FSU1fQ1M1X19ESVNQMV9FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fRUlNX0NTNQkJKF9NWDUxX1BBRF9FSU1fQ1M1X19FSU1fQ1M1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fRkVDX0NSUwkJKF9NWDUxX1BBRF9FSU1fQ1M1X19GRUNfQ1JTIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfMikpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0dQSU8yXzMwCQkoX01YNTFfUEFEX0VJTV9DUzVfX0dQSU8yXzMwIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX1VTQk9UR19ESVIJCShfTVg1MV9QQURfRUlNX0NTNV9fVVNCT1RHX0RJUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EVEFDS19fRUlNX0RUQUNLCQkoX01YNTFfUEFEX0VJTV9EVEFDS19fRUlNX0RUQUNLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RUQUNLX19HUElPMl8zMQkJKF9NWDUxX1BBRF9FSU1fRFRBQ0tfX0dQSU8yXzMxIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9MQkFfX0VJTV9MQkEJCShfTVg1MV9QQURfRUlNX0xCQV9fRUlNX0xCQSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9MQkFfX0dQSU8zXzEJCShfTVg1MV9QQURfRUlNX0xCQV9fR1BJTzNfMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1JFX19FSU1fQ1JFCQkoX01YNTFfUEFEX0VJTV9DUkVfX0VJTV9DUkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1JFX19HUElPM18yCQkoX01YNTFfUEFEX0VJTV9DUkVfX0dQSU8zXzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRFJBTV9DUzFfX0RSQU1fQ1MxCQkoX01YNTFfUEFEX0RSQU1fQ1MxX19EUkFNX0NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX0dQSU8zXzMJCShfTVg1MV9QQURfTkFOREZfV0VfQl9fR1BJTzNfMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19OQU5ERl9XRV9CCQkoX01YNTFfUEFEX05BTkRGX1dFX0JfX05BTkRGX1dFX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XRV9CX19QQVRBX0RJT1cJCShfTVg1MV9QQURfTkFOREZfV0VfQl9fUEFUQV9ESU9XIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfV0VfQl9fU0QzX0RBVEEwCQkoX01YNTFfUEFEX05BTkRGX1dFX0JfX1NEM19EQVRBMCB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkVfQl9fR1BJTzNfNAkJKF9NWDUxX1BBRF9OQU5ERl9SRV9CX19HUElPM180IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX05BTkRGX1JFX0IJCShfTVg1MV9QQURfTkFOREZfUkVfQl9fTkFOREZfUkVfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX1BBVEFfRElPUgkJKF9NWDUxX1BBRF9OQU5ERl9SRV9CX19QQVRBX0RJT1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRV9CX19TRDNfREFUQTEJCShfTVg1MV9QQURfTkFOREZfUkVfQl9fU0QzX0RBVEExIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9BTEVfX0dQSU8zXzUJCShfTVg1MV9QQURfTkFOREZfQUxFX19HUElPM181IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fTkFOREZfQUxFCQkoX01YNTFfUEFEX05BTkRGX0FMRV9fTkFOREZfQUxFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQUxFX19QQVRBX0JVRkZFUl9FTgkoX01YNTFfUEFEX05BTkRGX0FMRV9fUEFUQV9CVUZGRVJfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DTEVfX0dQSU8zXzYJCShfTVg1MV9QQURfTkFOREZfQ0xFX19HUElPM182IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fTkFOREZfQ0xFCQkoX01YNTFfUEFEX05BTkRGX0NMRV9fTkFOREZfQ0xFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ0xFX19QQVRBX1JFU0VUX0IJKF9NWDUxX1BBRF9OQU5ERl9DTEVfX1BBVEFfUkVTRVRfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dQX0JfX0dQSU8zXzcJCShfTVg1MV9QQURfTkFOREZfV1BfQl9fR1BJTzNfNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19OQU5ERl9XUF9CCQkoX01YNTFfUEFEX05BTkRGX1dQX0JfX05BTkRGX1dQX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19QQVRBX0RNQUNLCQkoX01YNTFfUEFEX05BTkRGX1dQX0JfX1BBVEFfRE1BQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19TRDNfREFUQTIJCShfTVg1MV9QQURfTkFOREZfV1BfQl9fU0QzX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX0VDU1BJMl9TUzEJCShfTVg1MV9QQURfTkFOREZfUkIwX19FQ1NQSTJfU1MxIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX0dQSU8zXzgJCShfTVg1MV9QQURfTkFOREZfUkIwX19HUElPM184IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fTkFOREZfUkIwCQkoX01YNTFfUEFEX05BTkRGX1JCMF9fTkFOREZfUkIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19QQVRBX0RNQVJRCQkoX01YNTFfUEFEX05BTkRGX1JCMF9fUEFUQV9ETUFSUSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMF9fU0QzX0RBVEEzCQkoX01YNTFfUEFEX05BTkRGX1JCMF9fU0QzX0RBVEEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX0NTUElfTU9TSQkJKF9NWDUxX1BBRF9OQU5ERl9SQjFfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19FQ1NQSTJfUkRZCQkoX01YNTFfUEFEX05BTkRGX1JCMV9fRUNTUEkyX1JEWSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19HUElPM185CQkoX01YNTFfUEFEX05BTkRGX1JCMV9fR1BJTzNfOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX05BTkRGX1JCMQkJKF9NWDUxX1BBRF9OQU5ERl9SQjFfX05BTkRGX1JCMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fUEFUQV9JT1JEWQkJKF9NWDUxX1BBRF9OQU5ERl9SQjFfX1BBVEFfSU9SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX1NENF9DTUQJCShfTVg1MV9QQURfTkFOREZfUkIxX19TRDRfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0RJU1AyX1dBSVQJCShfTVg1MV9QQURfTkFOREZfUkIyX19ESVNQMl9XQUlUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19FQ1NQSTJfU0NMSwkJKF9NWDUxX1BBRF9OQU5ERl9SQjJfX0VDU1BJMl9TQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0ZFQ19DT0wJCShfTVg1MV9QQURfTkFOREZfUkIyX19GRUNfQ09MIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfMikpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fR1BJTzNfMTAJCShfTVg1MV9QQURfTkFOREZfUkIyX19HUElPM18xMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX05BTkRGX1JCMgkJKF9NWDUxX1BBRF9OQU5ERl9SQjJfX05BTkRGX1JCMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfSDNfRFAJCShfTVg1MV9QQURfTkFOREZfUkIyX19VU0JIM19IM19EUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfTlhUCQkoX01YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfTlhUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19ESVNQMV9XQUlUCQkoX01YNTFfUEFEX05BTkRGX1JCM19fRElTUDFfV0FJVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fRUNTUEkyX01JU08JCShfTVg1MV9QQURfTkFOREZfUkIzX19FQ1NQSTJfTUlTTyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19GRUNfUlhfQ0xLCQkoX01YNTFfUEFEX05BTkRGX1JCM19fRkVDX1JYX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzIpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX0dQSU8zXzExCQkoX01YNTFfUEFEX05BTkRGX1JCM19fR1BJTzNfMTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19OQU5ERl9SQjMJCShfTVg1MV9QQURfTkFOREZfUkIzX19OQU5ERl9SQjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0NMSwkJKF9NWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fVVNCSDNfSDNfRE0JCShfTVg1MV9QQURfTkFOREZfUkIzX19VU0JIM19IM19ETSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fTkFORF9fR1BJT19OQU5ECQkoX01YNTFfUEFEX0dQSU9fTkFORF9fR1BJT19OQU5EIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU9fTkFORF9fUEFUQV9JTlRSUQkJKF9NWDUxX1BBRF9HUElPX05BTkRfX1BBVEFfSU5UUlEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzBfX0dQSU8zXzE2CQkoX01YNTFfUEFEX05BTkRGX0NTMF9fR1BJTzNfMTYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MwX19OQU5ERl9DUzAJCShfTVg1MV9QQURfTkFOREZfQ1MwX19OQU5ERl9DUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzFfX0dQSU8zXzE3CQkoX01YNTFfUEFEX05BTkRGX0NTMV9fR1BJTzNfMTcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MxX19OQU5ERl9DUzEJCShfTVg1MV9QQURfTkFOREZfQ1MxX19OQU5ERl9DUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX0NTUElfU0NMSwkJKF9NWDUxX1BBRF9OQU5ERl9DUzJfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19GRUNfVFhfRVIJCShfTVg1MV9QQURfTkFOREZfQ1MyX19GRUNfVFhfRVIgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19HUElPM18xOAkJKF9NWDUxX1BBRF9OQU5ERl9DUzJfX0dQSU8zXzE4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fTkFOREZfQ1MyCQkoX01YNTFfUEFEX05BTkRGX0NTMl9fTkFOREZfQ1MyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19QQVRBX0NTXzAJCShfTVg1MV9QQURfTkFOREZfQ1MyX19QQVRBX0NTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX1NENF9DTEsJCShfTVg1MV9QQURfTkFOREZfQ1MyX19TRDRfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwgfCBQQURfQ1RMX0hZUykpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTMl9fVVNCSDNfSDFfRFAJCShfTVg1MV9QQURfTkFOREZfQ1MyX19VU0JIM19IMV9EUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fRkVDX01EQwkJKF9NWDUxX1BBRF9OQU5ERl9DUzNfX0ZFQ19NREMgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19HUElPM18xOQkJKF9NWDUxX1BBRF9OQU5ERl9DUzNfX0dQSU8zXzE5IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fTkFOREZfQ1MzCQkoX01YNTFfUEFEX05BTkRGX0NTM19fTkFOREZfQ1MzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19QQVRBX0NTXzEJCShfTVg1MV9QQURfTkFOREZfQ1MzX19QQVRBX0NTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzNfX1NENF9EQVQwCQkoX01YNTFfUEFEX05BTkRGX0NTM19fU0Q0X0RBVDAgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fVVNCSDNfSDFfRE0JCShfTVg1MV9QQURfTkFOREZfQ1MzX19VU0JIM19IMV9ETSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fRkVDX1REQVRBMQkJKF9NWDUxX1BBRF9OQU5ERl9DUzRfX0ZFQ19UREFUQTEgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19HUElPM18yMAkJKF9NWDUxX1BBRF9OQU5ERl9DUzRfX0dQSU8zXzIwIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fTkFOREZfQ1M0CQkoX01YNTFfUEFEX05BTkRGX0NTNF9fTkFOREZfQ1M0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19QQVRBX0RBXzAJCShfTVg1MV9QQURfTkFOREZfQ1M0X19QQVRBX0RBXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX1NENF9EQVQxCQkoX01YNTFfUEFEX05BTkRGX0NTNF9fU0Q0X0RBVDEgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNF9fVVNCSDNfU1RQCQkoX01YNTFfUEFEX05BTkRGX0NTNF9fVVNCSDNfU1RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19GRUNfVERBVEEyCQkoX01YNTFfUEFEX05BTkRGX0NTNV9fRkVDX1REQVRBMiB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX0dQSU8zXzIxCQkoX01YNTFfUEFEX05BTkRGX0NTNV9fR1BJTzNfMjEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19OQU5ERl9DUzUJCShfTVg1MV9QQURfTkFOREZfQ1M1X19OQU5ERl9DUzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX1BBVEFfREFfMQkJKF9NWDUxX1BBRF9OQU5ERl9DUzVfX1BBVEFfREFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNV9fU0Q0X0RBVDIJCShfTVg1MV9QQURfTkFOREZfQ1M1X19TRDRfREFUMiB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19VU0JIM19ESVIJCShfTVg1MV9QQURfTkFOREZfQ1M1X19VU0JIM19ESVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzZfX0NTUElfU1MzCQkoX01YNTFfUEFEX05BTkRGX0NTNl9fQ1NQSV9TUzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fRkVDX1REQVRBMwkJKF9NWDUxX1BBRF9OQU5ERl9DUzZfX0ZFQ19UREFUQTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19HUElPM18yMgkJKF9NWDUxX1BBRF9OQU5ERl9DUzZfX0dQSU8zXzIyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fTkFOREZfQ1M2CQkoX01YNTFfUEFEX05BTkRGX0NTNl9fTkFOREZfQ1M2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19QQVRBX0RBXzIJCShfTVg1MV9QQURfTkFOREZfQ1M2X19QQVRBX0RBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzZfX1NENF9EQVQzCQkoX01YNTFfUEFEX05BTkRGX0NTNl9fU0Q0X0RBVDMgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTN19fRkVDX1RYX0VOCQkoX01YNTFfUEFEX05BTkRGX0NTN19fRkVDX1RYX0VOIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTN19fR1BJTzNfMjMJCShfTVg1MV9QQURfTkFOREZfQ1M3X19HUElPM18yMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX05BTkRGX0NTNwkJKF9NWDUxX1BBRF9OQU5ERl9DUzdfX05BTkRGX0NTNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTN19fU0QzX0NMSwkJKF9NWDUxX1BBRF9OQU5ERl9DUzdfX1NEM19DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fRUNTUEkyX1NTMAkoX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0VDU1BJMl9TUzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0ZFQ19UWF9DTEsJKF9NWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19GRUNfVFhfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0dQSU8zXzI0CShfTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fR1BJTzNfMjQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fTkFOREZfUkRZX0lOVAkoX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX05BTkRGX1JEWV9JTlQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SRFlfSU5UX19TRDNfQ01ECQkoX01YNTFfUEFEX05BTkRGX1JEWV9JTlRfX1NEM19DTUQgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fRUNTUEkyX01PU0kJCShfTVg1MV9QQURfTkFOREZfRDE1X19FQ1NQSTJfTU9TSSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19HUElPM18yNQkJKF9NWDUxX1BBRF9OQU5ERl9EMTVfX0dQSU8zXzI1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNV9fTkFOREZfRDE1CQkoX01YNTFfUEFEX05BTkRGX0QxNV9fTkFOREZfRDE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19QQVRBX0RBVEExNQkJKF9NWDUxX1BBRF9OQU5ERl9EMTVfX1BBVEFfREFUQTE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19TRDNfREFUNwkJKF9NWDUxX1BBRF9OQU5ERl9EMTVfX1NEM19EQVQ3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE0X19FQ1NQSTJfU1MzCQkoX01YNTFfUEFEX05BTkRGX0QxNF9fRUNTUEkyX1NTMyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE0X19HUElPM18yNgkJKF9NWDUxX1BBRF9OQU5ERl9EMTRfX0dQSU8zXzI2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fTkFOREZfRDE0CQkoX01YNTFfUEFEX05BTkRGX0QxNF9fTkFOREZfRDE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE0X19QQVRBX0RBVEExNAkJKF9NWDUxX1BBRF9OQU5ERl9EMTRfX1BBVEFfREFUQTE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE0X19TRDNfREFUNgkJKF9NWDUxX1BBRF9OQU5ERl9EMTRfX1NEM19EQVQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19FQ1NQSTJfU1MyCQkoX01YNTFfUEFEX05BTkRGX0QxM19fRUNTUEkyX1NTMiB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19HUElPM18yNwkJKF9NWDUxX1BBRF9OQU5ERl9EMTNfX0dQSU8zXzI3IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fTkFOREZfRDEzCQkoX01YNTFfUEFEX05BTkRGX0QxM19fTkFOREZfRDEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19QQVRBX0RBVEExMwkJKF9NWDUxX1BBRF9OQU5ERl9EMTNfX1BBVEFfREFUQTEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEzX19TRDNfREFUNQkJKF9NWDUxX1BBRF9OQU5ERl9EMTNfX1NEM19EQVQ1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19FQ1NQSTJfU1MxCQkoX01YNTFfUEFEX05BTkRGX0QxMl9fRUNTUEkyX1NTMSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19HUElPM18yOAkJKF9NWDUxX1BBRF9OQU5ERl9EMTJfX0dQSU8zXzI4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMl9fTkFOREZfRDEyCQkoX01YNTFfUEFEX05BTkRGX0QxMl9fTkFOREZfRDEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19QQVRBX0RBVEExMgkJKF9NWDUxX1BBRF9OQU5ERl9EMTJfX1BBVEFfREFUQTEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19TRDNfREFUNAkJKF9NWDUxX1BBRF9OQU5ERl9EMTJfX1NEM19EQVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19GRUNfUlhfRFYJCShfTVg1MV9QQURfTkFOREZfRDExX19GRUNfUlhfRFYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX0dQSU8zXzI5CQkoX01YNTFfUEFEX05BTkRGX0QxMV9fR1BJTzNfMjkgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19OQU5ERl9EMTEJCShfTVg1MV9QQURfTkFOREZfRDExX19OQU5ERl9EMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX1BBVEFfREFUQTExCQkoX01YNTFfUEFEX05BTkRGX0QxMV9fUEFUQV9EQVRBMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTFfX1NEM19EQVRBMwkJKF9NWDUxX1BBRF9OQU5ERl9EMTFfX1NEM19EQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fR1BJTzNfMzAJCShfTVg1MV9QQURfTkFOREZfRDEwX19HUElPM18zMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTBfX05BTkRGX0QxMAkJKF9NWDUxX1BBRF9OQU5ERl9EMTBfX05BTkRGX0QxMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fUEFUQV9EQVRBMTAJCShfTVg1MV9QQURfTkFOREZfRDEwX19QQVRBX0RBVEExMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMF9fU0QzX0RBVEEyCQkoX01YNTFfUEFEX05BTkRGX0QxMF9fU0QzX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX0ZFQ19SREFUQTAJCShfTVg1MV9QQURfTkFOREZfRDlfX0ZFQ19SREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF80KSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX0dQSU8zXzMxCQkoX01YNTFfUEFEX05BTkRGX0Q5X19HUElPM18zMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOV9fTkFOREZfRDkJCShfTVg1MV9QQURfTkFOREZfRDlfX05BTkRGX0Q5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX1BBVEFfREFUQTkJCShfTVg1MV9QQURfTkFOREZfRDlfX1BBVEFfREFUQTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOV9fU0QzX0RBVEExCQkoX01YNTFfUEFEX05BTkRGX0Q5X19TRDNfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fRkVDX1REQVRBMAkJKF9NWDUxX1BBRF9OQU5ERl9EOF9fRkVDX1REQVRBMCB8IE1VWF9QQURfQ1RSTChNWDUxX1BBRF9DVFJMXzUpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fR1BJTzRfMAkJKF9NWDUxX1BBRF9OQU5ERl9EOF9fR1BJTzRfMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fTkFOREZfRDgJCShfTVg1MV9QQURfTkFOREZfRDhfX05BTkRGX0Q4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX1BBVEFfREFUQTgJCShfTVg1MV9QQURfTkFOREZfRDhfX1BBVEFfREFUQTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fU0QzX0RBVEEwCQkoX01YNTFfUEFEX05BTkRGX0Q4X19TRDNfREFUQTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EN19fR1BJTzRfMQkJKF9NWDUxX1BBRF9OQU5ERl9EN19fR1BJTzRfMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EN19fTkFOREZfRDcJCShfTVg1MV9QQURfTkFOREZfRDdfX05BTkRGX0Q3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX1BBVEFfREFUQTcJCShfTVg1MV9QQURfTkFOREZfRDdfX1BBVEFfREFUQTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EN19fVVNCSDNfREFUQTAJCShfTVg1MV9QQURfTkFOREZfRDdfX1VTQkgzX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX0dQSU80XzIJCShfTVg1MV9QQURfTkFOREZfRDZfX0dQSU80XzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX05BTkRGX0Q2CQkoX01YNTFfUEFEX05BTkRGX0Q2X19OQU5ERl9ENiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19QQVRBX0RBVEE2CQkoX01YNTFfUEFEX05BTkRGX0Q2X19QQVRBX0RBVEE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX1NENF9MQ1RMCQkoX01YNTFfUEFEX05BTkRGX0Q2X19TRDRfTENUTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19VU0JIM19EQVRBMQkJKF9NWDUxX1BBRF9OQU5ERl9ENl9fVVNCSDNfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fR1BJTzRfMwkJKF9NWDUxX1BBRF9OQU5ERl9ENV9fR1BJTzRfMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fTkFOREZfRDUJCShfTVg1MV9QQURfTkFOREZfRDVfX05BTkRGX0Q1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX1BBVEFfREFUQTUJCShfTVg1MV9QQURfTkFOREZfRDVfX1BBVEFfREFUQTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fU0Q0X1dQCQkoX01YNTFfUEFEX05BTkRGX0Q1X19TRDRfV1AgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fVVNCSDNfREFUQTIJCShfTVg1MV9QQURfTkFOREZfRDVfX1VTQkgzX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX0dQSU80XzQJCShfTVg1MV9QQURfTkFOREZfRDRfX0dQSU80XzQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX05BTkRGX0Q0CQkoX01YNTFfUEFEX05BTkRGX0Q0X19OQU5ERl9ENCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19QQVRBX0RBVEE0CQkoX01YNTFfUEFEX05BTkRGX0Q0X19QQVRBX0RBVEE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX1NENF9DRAkJKF9NWDUxX1BBRF9OQU5ERl9ENF9fU0Q0X0NEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX1VTQkgzX0RBVEEzCQkoX01YNTFfUEFEX05BTkRGX0Q0X19VU0JIM19EQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19HUElPNF81CQkoX01YNTFfUEFEX05BTkRGX0QzX19HUElPNF81IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19OQU5ERl9EMwkJKF9NWDUxX1BBRF9OQU5ERl9EM19fTkFOREZfRDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fUEFUQV9EQVRBMwkJKF9NWDUxX1BBRF9OQU5ERl9EM19fUEFUQV9EQVRBMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19TRDRfREFUNAkJKF9NWDUxX1BBRF9OQU5ERl9EM19fU0Q0X0RBVDQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fVVNCSDNfREFUQTQJCShfTVg1MV9QQURfTkFOREZfRDNfX1VTQkgzX0RBVEE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX0dQSU80XzYJCShfTVg1MV9QQURfTkFOREZfRDJfX0dQSU80XzYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX05BTkRGX0QyCQkoX01YNTFfUEFEX05BTkRGX0QyX19OQU5ERl9EMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19QQVRBX0RBVEEyCQkoX01YNTFfUEFEX05BTkRGX0QyX19QQVRBX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX1NENF9EQVQ1CQkoX01YNTFfUEFEX05BTkRGX0QyX19TRDRfREFUNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19VU0JIM19EQVRBNQkJKF9NWDUxX1BBRF9OQU5ERl9EMl9fVVNCSDNfREFUQTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fR1BJTzRfNwkJKF9NWDUxX1BBRF9OQU5ERl9EMV9fR1BJTzRfNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fTkFOREZfRDEJCShfTVg1MV9QQURfTkFOREZfRDFfX05BTkRGX0QxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX1BBVEFfREFUQTEJCShfTVg1MV9QQURfTkFOREZfRDFfX1BBVEFfREFUQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fU0Q0X0RBVDYJCShfTVg1MV9QQURfTkFOREZfRDFfX1NENF9EQVQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX1VTQkgzX0RBVEE2CQkoX01YNTFfUEFEX05BTkRGX0QxX19VU0JIM19EQVRBNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19HUElPNF84CQkoX01YNTFfUEFEX05BTkRGX0QwX19HUElPNF84IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19OQU5ERl9EMAkJKF9NWDUxX1BBRF9OQU5ERl9EMF9fTkFOREZfRDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fUEFUQV9EQVRBMAkJKF9NWDUxX1BBRF9OQU5ERl9EMF9fUEFUQV9EQVRBMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19TRDRfREFUNwkJKF9NWDUxX1BBRF9OQU5ERl9EMF9fU0Q0X0RBVDcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fVVNCSDNfREFUQTcJCShfTVg1MV9QQURfTkFOREZfRDBfX1VTQkgzX0RBVEE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOF9fQ1NJMV9EOAkJKF9NWDUxX1BBRF9DU0kxX0Q4X19DU0kxX0Q4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOF9fR1BJTzNfMTIJCShfTVg1MV9QQURfQ1NJMV9EOF9fR1BJTzNfMTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOV9fQ1NJMV9EOQkJKF9NWDUxX1BBRF9DU0kxX0Q5X19DU0kxX0Q5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOV9fR1BJTzNfMTMJCShfTVg1MV9QQURfQ1NJMV9EOV9fR1BJTzNfMTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTBfX0NTSTFfRDEwCQkoX01YNTFfUEFEX0NTSTFfRDEwX19DU0kxX0QxMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDExX19DU0kxX0QxMQkJKF9NWDUxX1BBRF9DU0kxX0QxMV9fQ1NJMV9EMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxMl9fQ1NJMV9EMTIJCShfTVg1MV9QQURfQ1NJMV9EMTJfX0NTSTFfRDEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTNfX0NTSTFfRDEzCQkoX01YNTFfUEFEX0NTSTFfRDEzX19DU0kxX0QxMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE0X19DU0kxX0QxNAkJKF9NWDUxX1BBRF9DU0kxX0QxNF9fQ1NJMV9EMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxNV9fQ1NJMV9EMTUJCShfTVg1MV9QQURfQ1NJMV9EMTVfX0NTSTFfRDE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTZfX0NTSTFfRDE2CQkoX01YNTFfUEFEX0NTSTFfRDE2X19DU0kxX0QxNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE3X19DU0kxX0QxNwkJKF9NWDUxX1BBRF9DU0kxX0QxN19fQ1NJMV9EMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxOF9fQ1NJMV9EMTgJCShfTVg1MV9QQURfQ1NJMV9EMThfX0NTSTFfRDE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTlfX0NTSTFfRDE5CQkoX01YNTFfUEFEX0NTSTFfRDE5X19DU0kxX0QxOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfVlNZTkNfX0NTSTFfVlNZTkMJCShfTVg1MV9QQURfQ1NJMV9WU1lOQ19fQ1NJMV9WU1lOQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfVlNZTkNfX0dQSU8zXzE0CQkoX01YNTFfUEFEX0NTSTFfVlNZTkNfX0dQSU8zXzE0IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfSFNZTkNfX0NTSTFfSFNZTkMJCShfTVg1MV9QQURfQ1NJMV9IU1lOQ19fQ1NJMV9IU1lOQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfSFNZTkNfX0dQSU8zXzE1CQkoX01YNTFfUEFEX0NTSTFfSFNZTkNfX0dQSU8zXzE1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfUElYQ0xLX19DU0kxX1BJWENMSwkoX01YNTFfUEFEX0NTSTFfUElYQ0xLX19DU0kxX1BJWENMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTFfTUNMS19fQ1NJMV9NQ0xLCQkoX01YNTFfUEFEX0NTSTFfTUNMS19fQ1NJMV9NQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTJfX0NTSTJfRDEyCQkoX01YNTFfUEFEX0NTSTJfRDEyX19DU0kyX0QxMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEyX19HUElPNF85CQkoX01YNTFfUEFEX0NTSTJfRDEyX19HUElPNF85IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEzX19DU0kyX0QxMwkJKF9NWDUxX1BBRF9DU0kyX0QxM19fQ1NJMl9EMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxM19fR1BJTzRfMTAJCShfTVg1MV9QQURfQ1NJMl9EMTNfX0dQSU80XzEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE0X19DU0kyX0QxNAkJKF9NWDUxX1BBRF9DU0kyX0QxNF9fQ1NJMl9EMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxNV9fQ1NJMl9EMTUJCShfTVg1MV9QQURfQ1NJMl9EMTVfX0NTSTJfRDE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTZfX0NTSTJfRDE2CQkoX01YNTFfUEFEX0NTSTJfRDE2X19DU0kyX0QxNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE3X19DU0kyX0QxNwkJKF9NWDUxX1BBRF9DU0kyX0QxN19fQ1NJMl9EMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxOF9fQ1NJMl9EMTgJCShfTVg1MV9QQURfQ1NJMl9EMThfX0NTSTJfRDE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMThfX0dQSU80XzExCQkoX01YNTFfUEFEX0NTSTJfRDE4X19HUElPNF8xMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxOV9fQ1NJMl9EMTkJCShfTVg1MV9QQURfQ1NJMl9EMTlfX0NTSTJfRDE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTlfX0dQSU80XzEyCQkoX01YNTFfUEFEX0NTSTJfRDE5X19HUElPNF8xMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX1ZTWU5DX19DU0kyX1ZTWU5DCQkoX01YNTFfUEFEX0NTSTJfVlNZTkNfX0NTSTJfVlNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX1ZTWU5DX19HUElPNF8xMwkJKF9NWDUxX1BBRF9DU0kyX1ZTWU5DX19HUElPNF8xMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0hTWU5DX19DU0kyX0hTWU5DCQkoX01YNTFfUEFEX0NTSTJfSFNZTkNfX0NTSTJfSFNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX0hTWU5DX19HUElPNF8xNAkJKF9NWDUxX1BBRF9DU0kyX0hTWU5DX19HUElPNF8xNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX1BJWENMS19fQ1NJMl9QSVhDTEsJKF9NWDUxX1BBRF9DU0kyX1BJWENMS19fQ1NJMl9QSVhDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU0kyX1BJWENMS19fR1BJTzRfMTUJCShfTVg1MV9QQURfQ1NJMl9QSVhDTEtfX0dQSU80XzE1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19HUElPNF8xNgkJKF9NWDUxX1BBRF9JMkMxX0NMS19fR1BJTzRfMTYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfSTJDMV9DTEtfX0kyQzFfQ0xLCQkoX01YNTFfUEFEX0kyQzFfQ0xLX19JMkMxX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0kyQzFfREFUX19HUElPNF8xNwkJKF9NWDUxX1BBRF9JMkMxX0RBVF9fR1BJTzRfMTcgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfSTJDMV9EQVRfX0kyQzFfREFUCQkoX01YNTFfUEFEX0kyQzFfREFUX19JMkMxX0RBVCB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfVFhEX19BVUQzX1RYRAkJKF9NWDUxX1BBRF9BVUQzX0JCX1RYRF9fQVVEM19UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1RYRF9fR1BJTzRfMTgJCShfTVg1MV9QQURfQVVEM19CQl9UWERfX0dQSU80XzE4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfUlhEX19BVUQzX1JYRAkJKF9NWDUxX1BBRF9BVUQzX0JCX1JYRF9fQVVEM19SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fR1BJTzRfMTkJCShfTVg1MV9QQURfQVVEM19CQl9SWERfX0dQSU80XzE5IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfUlhEX19VQVJUM19SWEQJCShfTVg1MV9QQURfQVVEM19CQl9SWERfX1VBUlQzX1JYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0NLX19BVUQzX1RYQwkJKF9NWDUxX1BBRF9BVUQzX0JCX0NLX19BVUQzX1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfQ0tfX0dQSU80XzIwCQkoX01YNTFfUEFEX0FVRDNfQkJfQ0tfX0dQSU80XzIwIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfRlNfX0FVRDNfVFhGUwkJKF9NWDUxX1BBRF9BVUQzX0JCX0ZTX19BVUQzX1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19HUElPNF8yMQkJKF9NWDUxX1BBRF9BVUQzX0JCX0ZTX19HUElPNF8yMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19VQVJUM19UWEQJCShfTVg1MV9QQURfQVVEM19CQl9GU19fVUFSVDNfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01PU0lfX0VDU1BJMV9NT1NJCShfTVg1MV9QQURfQ1NQSTFfTU9TSV9fRUNTUEkxX01PU0kgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01PU0lfX0dQSU80XzIyCQkoX01YNTFfUEFEX0NTUEkxX01PU0lfX0dQSU80XzIyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01PU0lfX0kyQzFfU0RBCQkoX01YNTFfUEFEX0NTUEkxX01PU0lfX0kyQzFfU0RBIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fQVVENF9SWEQJCShfTVg1MV9QQURfQ1NQSTFfTUlTT19fQVVENF9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NSVNPX19FQ1NQSTFfTUlTTwkoX01YNTFfUEFEX0NTUEkxX01JU09fX0VDU1BJMV9NSVNPIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NSVNPX19HUElPNF8yMwkJKF9NWDUxX1BBRF9DU1BJMV9NSVNPX19HUElPNF8yMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzBfX0FVRDRfVFhDCQkoX01YNTFfUEFEX0NTUEkxX1NTMF9fQVVENF9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzBfX0VDU1BJMV9TUzAJCShfTVg1MV9QQURfQ1NQSTFfU1MwX19FQ1NQSTFfU1MwIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzBfX0dQSU80XzI0CQkoX01YNTFfUEFEX0NTUEkxX1NTMF9fR1BJTzRfMjQgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19BVUQ0X1RYRAkJKF9NWDUxX1BBRF9DU1BJMV9TUzFfX0FVRDRfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19FQ1NQSTFfU1MxCQkoX01YNTFfUEFEX0NTUEkxX1NTMV9fRUNTUEkxX1NTMSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19HUElPNF8yNQkJKF9NWDUxX1BBRF9DU1BJMV9TUzFfX0dQSU80XzI1IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1JEWV9fQVVENF9UWEZTCQkoX01YNTFfUEFEX0NTUEkxX1JEWV9fQVVENF9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfUkRZX19FQ1NQSTFfUkRZCQkoX01YNTFfUEFEX0NTUEkxX1JEWV9fRUNTUEkxX1JEWSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfUkRZX19HUElPNF8yNgkJKF9NWDUxX1BBRF9DU1BJMV9SRFlfX0dQSU80XzI2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NDTEtfX0VDU1BJMV9TQ0xLCShfTVg1MV9QQURfQ1NQSTFfU0NMS19fRUNTUEkxX1NDTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NDTEtfX0dQSU80XzI3CQkoX01YNTFfUEFEX0NTUEkxX1NDTEtfX0dQSU80XzI3IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NDTEtfX0kyQzFfU0NMCQkoX01YNTFfUEFEX0NTUEkxX1NDTEtfX0kyQzFfU0NMIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfUlhEX19HUElPNF8yOAkJKF9NWDUxX1BBRF9VQVJUMV9SWERfX0dQSU80XzI4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JYRF9fVUFSVDFfUlhECQkoX01YNTFfUEFEX1VBUlQxX1JYRF9fVUFSVDFfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1RYRF9fR1BJTzRfMjkJCShfTVg1MV9QQURfVUFSVDFfVFhEX19HUElPNF8yOSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1BXTTJfUFdNTwkJKF9NWDUxX1BBRF9VQVJUMV9UWERfX1BXTTJfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1RYRF9fVUFSVDFfVFhECQkoX01YNTFfUEFEX1VBUlQxX1RYRF9fVUFSVDFfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JUU19fR1BJTzRfMzAJCShfTVg1MV9QQURfVUFSVDFfUlRTX19HUElPNF8zMCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9SVFNfX1VBUlQxX1JUUwkJKF9NWDUxX1BBRF9VQVJUMV9SVFNfX1VBUlQxX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9DVFNfX0dQSU80XzMxCQkoX01YNTFfUEFEX1VBUlQxX0NUU19fR1BJTzRfMzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDFfQ1RTX19VQVJUMV9DVFMJCShfTVg1MV9QQURfVUFSVDFfQ1RTX19VQVJUMV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDJfUlhEX19GSVJJX1RYRAkJKF9NWDUxX1BBRF9VQVJUMl9SWERfX0ZJUklfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDJfUlhEX19HUElPMV8yMAkJKF9NWDUxX1BBRF9VQVJUMl9SWERfX0dQSU8xXzIwIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhECQkoX01YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1RYRF9fRklSSV9SWEQJCShfTVg1MV9QQURfVUFSVDJfVFhEX19GSVJJX1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1RYRF9fR1BJTzFfMjEJCShfTVg1MV9QQURfVUFSVDJfVFhEX19HUElPMV8yMSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRAkJKF9NWDUxX1BBRF9VQVJUMl9UWERfX1VBUlQyX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUM19SWERfX0NTSTFfRDAJCShfTVg1MV9QQURfVUFSVDNfUlhEX19DU0kxX0QwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19HUElPMV8yMgkJKF9NWDUxX1BBRF9VQVJUM19SWERfX0dQSU8xXzIyIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDFfRFRSCQkoX01YNTFfUEFEX1VBUlQzX1JYRF9fVUFSVDFfRFRSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUM19SWEQJCShfTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUM19SWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19DU0kxX0QxCQkoX01YNTFfUEFEX1VBUlQzX1RYRF9fQ1NJMV9EMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1RYRF9fR1BJTzFfMjMJCShfTVg1MV9QQURfVUFSVDNfVFhEX19HUElPMV8yMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX1VBUlQxX0RTUgkJKF9NWDUxX1BBRF9VQVJUM19UWERfX1VBUlQxX0RTUiB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX1VBUlQzX1RYRAkJKF9NWDUxX1BBRF9VQVJUM19UWERfX1VBUlQzX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19HUElPMV8yNAkJKF9NWDUxX1BBRF9PV0lSRV9MSU5FX19HUElPMV8yNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19PV0lSRV9MSU5FCQkoX01YNTFfUEFEX09XSVJFX0xJTkVfX09XSVJFX0xJTkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19TUERJRl9PVVQJCShfTVg1MV9QQURfT1dJUkVfTElORV9fU1BESUZfT1VUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzBfX0tFWV9ST1cwCQkoX01YNTFfUEFEX0tFWV9ST1cwX19LRVlfUk9XMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1cxX19LRVlfUk9XMQkJKF9NWDUxX1BBRF9LRVlfUk9XMV9fS0VZX1JPVzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMl9fS0VZX1JPVzIJCShfTVg1MV9QQURfS0VZX1JPVzJfX0tFWV9ST1cyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzNfX0tFWV9ST1czCQkoX01YNTFfUEFEX0tFWV9ST1czX19LRVlfUk9XMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wwX19LRVlfQ09MMAkJKF9NWDUxX1BBRF9LRVlfQ09MMF9fS0VZX0NPTDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMF9fUExMMV9CWVAJCShfTVg1MV9QQURfS0VZX0NPTDBfX1BMTDFfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDFfX0tFWV9DT0wxCQkoX01YNTFfUEFEX0tFWV9DT0wxX19LRVlfQ09MMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wxX19QTEwyX0JZUAkJKF9NWDUxX1BBRF9LRVlfQ09MMV9fUExMMl9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMl9fS0VZX0NPTDIJCShfTVg1MV9QQURfS0VZX0NPTDJfX0tFWV9DT0wyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDJfX1BMTDNfQllQCQkoX01YNTFfUEFEX0tFWV9DT0wyX19QTEwzX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wzX19LRVlfQ09MMwkJKF9NWDUxX1BBRF9LRVlfQ09MM19fS0VZX0NPTDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fSTJDMl9TQ0wJCShfTVg1MV9QQURfS0VZX0NPTDRfX0kyQzJfU0NMIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX0tFWV9DT0w0CQkoX01YNTFfUEFEX0tFWV9DT0w0X19LRVlfQ09MNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19TUERJRl9PVVQxCQkoX01YNTFfUEFEX0tFWV9DT0w0X19TUERJRl9PVVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX1VBUlQxX1JJCQkoX01YNTFfUEFEX0tFWV9DT0w0X19VQVJUMV9SSSB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDNfUlRTCQkoX01YNTFfUEFEX0tFWV9DT0w0X19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX0kyQzJfU0RBCQkoX01YNTFfUEFEX0tFWV9DT0w1X19JMkMyX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19LRVlfQ09MNQkJKF9NWDUxX1BBRF9LRVlfQ09MNV9fS0VZX0NPTDUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDFfRENECQkoX01YNTFfUEFEX0tFWV9DT0w1X19VQVJUMV9EQ0QgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX1VBUlQzX0NUUwkJKF9NWDUxX1BBRF9LRVlfQ09MNV9fVUFSVDNfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fQ1NQSV9TQ0xLCQkoX01YNTFfUEFEX1VTQkgxX0NMS19fQ1NQSV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9DTEtfX0dQSU8xXzI1CQkoX01YNTFfUEFEX1VTQkgxX0NMS19fR1BJTzFfMjUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19JMkMyX1NDTAkJKF9NWDUxX1BBRF9VU0JIMV9DTEtfX0kyQzJfU0NMIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19VU0JIMV9DTEsJCShfTVg1MV9QQURfVVNCSDFfQ0xLX19VU0JIMV9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fQ1NQSV9NT1NJCQkoX01YNTFfUEFEX1VTQkgxX0RJUl9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9ESVJfX0dQSU8xXzI2CQkoX01YNTFfUEFEX1VTQkgxX0RJUl9fR1BJTzFfMjYgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19JMkMyX1NEQQkJKF9NWDUxX1BBRF9VU0JIMV9ESVJfX0kyQzJfU0RBIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19VU0JIMV9ESVIJCShfTVg1MV9QQURfVVNCSDFfRElSX19VU0JIMV9ESVIgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fQ1NQSV9SRFkJCShfTVg1MV9QQURfVVNCSDFfU1RQX19DU1BJX1JEWSB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfU1RQX19HUElPMV8yNwkJKF9NWDUxX1BBRF9VU0JIMV9TVFBfX0dQSU8xXzI3IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fVUFSVDNfUlhECQkoX01YNTFfUEFEX1VTQkgxX1NUUF9fVUFSVDNfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQCQkoX01YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX0NTUElfTUlTTwkJKF9NWDUxX1BBRF9VU0JIMV9OWFRfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfTlhUX19HUElPMV8yOAkJKF9NWDUxX1BBRF9VU0JIMV9OWFRfX0dQSU8xXzI4IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fVUFSVDNfVFhECQkoX01YNTFfUEFEX1VTQkgxX05YVF9fVUFSVDNfVFhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fVVNCSDFfTlhUCQkoX01YNTFfUEFEX1VTQkgxX05YVF9fVVNCSDFfTlhUIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMF9fR1BJTzFfMTEJCShfTVg1MV9QQURfVVNCSDFfREFUQTBfX0dQSU8xXzExIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19VQVJUMl9DVFMJCShfTVg1MV9QQURfVVNCSDFfREFUQTBfX1VBUlQyX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMF9fVVNCSDFfREFUQTAJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMF9fVVNCSDFfREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEExX19HUElPMV8xMgkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMV9fR1BJTzFfMTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTFfX1VBUlQyX1JYRAkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBMV9fVUFSVDJfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEExX19VU0JIMV9EQVRBMQkoX01YNTFfUEFEX1VTQkgxX0RBVEExX19VU0JIMV9EQVRBMSB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX0dQSU8xXzEzCQkoX01YNTFfUEFEX1VTQkgxX0RBVEEyX19HUElPMV8xMyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMl9fVUFSVDJfVFhECQkoX01YNTFfUEFEX1VTQkgxX0RBVEEyX19VQVJUMl9UWEQgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyCShfTVg1MV9QQURfVVNCSDFfREFUQTJfX1VTQkgxX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBM19fR1BJTzFfMTQJCShfTVg1MV9QQURfVVNCSDFfREFUQTNfX0dQSU8xXzE0IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19VQVJUMl9SVFMJCShfTVg1MV9QQURfVVNCSDFfREFUQTNfX1VBUlQyX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBM19fVVNCSDFfREFUQTMJKF9NWDUxX1BBRF9VU0JIMV9EQVRBM19fVVNCSDFfREFUQTMgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE0X19DU1BJX1NTMAkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNF9fQ1NQSV9TUzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE0X19HUElPMV8xNQkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNF9fR1BJTzFfMTUgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTRfX1VTQkgxX0RBVEE0CShfTVg1MV9QQURfVVNCSDFfREFUQTRfX1VTQkgxX0RBVEE0IHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNV9fQ1NQSV9TUzEJCShfTVg1MV9QQURfVVNCSDFfREFUQTVfX0NTUElfU1MxIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNV9fR1BJTzFfMTYJCShfTVg1MV9QQURfVVNCSDFfREFUQTVfX0dQSU8xXzE2IHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE1X19VU0JIMV9EQVRBNQkoX01YNTFfUEFEX1VTQkgxX0RBVEE1X19VU0JIMV9EQVRBNSB8IE1VWF9QQURfQ1RSTChNWDUxX1VTQkgxX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTZfX0NTUElfU1MzCQkoX01YNTFfUEFEX1VTQkgxX0RBVEE2X19DU1BJX1NTMyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTZfX0dQSU8xXzE3CQkoX01YNTFfUEFEX1VTQkgxX0RBVEE2X19HUElPMV8xNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNl9fVVNCSDFfREFUQTYJKF9NWDUxX1BBRF9VU0JIMV9EQVRBNl9fVVNCSDFfREFUQTYgfCBNVVhfUEFEX0NUUkwoTVg1MV9VU0JIMV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTFfU1MzCShfTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMV9TUzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19FQ1NQSTJfU1MzCShfTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMl9TUzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19HUElPMV8xOAkJKF9NWDUxX1BBRF9VU0JIMV9EQVRBN19fR1BJTzFfMTggfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTdfX1VTQkgxX0RBVEE3CShfTVg1MV9QQURfVVNCSDFfREFUQTdfX1VTQkgxX0RBVEE3IHwgTVVYX1BBRF9DVFJMKE1YNTFfVVNCSDFfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0RJMV9QSU4xMQkJKF9NWDUxX1BBRF9ESTFfUElOMTFfX0RJMV9QSU4xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xMV9fRUNTUEkxX1NTMgkJKF9NWDUxX1BBRF9ESTFfUElOMTFfX0VDU1BJMV9TUzIgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xMV9fR1BJTzNfMAkJKF9NWDUxX1BBRF9ESTFfUElOMTFfX0dQSU8zXzAgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjEyX19ESTFfUElOMTIJCShfTVg1MV9QQURfREkxX1BJTjEyX19ESTFfUElOMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTJfX0dQSU8zXzEJCShfTVg1MV9QQURfREkxX1BJTjEyX19HUElPM18xIHwgTVVYX1BBRF9DVFJMKE1YNTFfR1BJT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xM19fREkxX1BJTjEzCQkoX01YNTFfUEFEX0RJMV9QSU4xM19fREkxX1BJTjEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjEzX19HUElPM18yCQkoX01YNTFfUEFEX0RJMV9QSU4xM19fR1BJTzNfMiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfRDBfQ1NfX0RJMV9EMF9DUwkJKF9NWDUxX1BBRF9ESTFfRDBfQ1NfX0RJMV9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMV9EMF9DU19fR1BJTzNfMwkJKF9NWDUxX1BBRF9ESTFfRDBfQ1NfX0dQSU8zXzMgfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX0QxX0NTX19ESTFfRDFfQ1MJCShfTVg1MV9QQURfREkxX0QxX0NTX19ESTFfRDFfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0RJU1AxX1BJTjE0CQkoX01YNTFfUEFEX0RJMV9EMV9DU19fRElTUDFfUElOMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfRDFfQ1NfX0RJU1AxX1BJTjUJCShfTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU41IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX0QxX0NTX19HUElPM180CQkoX01YNTFfUEFEX0RJMV9EMV9DU19fR1BJTzNfNCB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fRElTUDFfUElOMQkoX01YNTFfUEFEX0RJU1BCMl9TRVJfRElOX19ESVNQMV9QSU4xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1BCMl9TRVJfRElOCShfTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1BCMl9TRVJfRElOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0dQSU8zXzUJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fR1BJTzNfNSB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUDFfUElONgkoX01YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQMV9QSU42IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0RJU1BCMl9TRVJfRElPCShfTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0RJU1BCMl9TRVJfRElPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU9fX0dQSU8zXzYJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fR1BJTzNfNiB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElOMTcJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElOMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fRElTUDFfUElONwkoX01YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQMV9QSU43IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1BCMl9TRVJfQ0xLCShfTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1BCMl9TRVJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0dQSU8zXzcJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX0NMS19fR1BJTzNfNyB8IE1VWF9QQURfQ1RSTChNWDUxX0dQSU9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQMV9FWFRfQ0xLCShfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfRVhUX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjE2CShfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQMV9QSU44CShfTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1BCMl9TRVJfUlMJKF9NWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUEIyX1NFUl9SUwkoX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1BCMl9TRVJfUlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19HUElPM184CQkoX01YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0dQSU8zXzggfCBNVVhfUEFEX0NUUkwoTVg1MV9HUElPX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMF9fRElTUDFfREFUMAkJKF9NWDUxX1BBRF9ESVNQMV9EQVQwX19ESVNQMV9EQVQwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMV9fRElTUDFfREFUMQkJKF9NWDUxX1BBRF9ESVNQMV9EQVQxX19ESVNQMV9EQVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMl9fRElTUDFfREFUMgkJKF9NWDUxX1BBRF9ESVNQMV9EQVQyX19ESVNQMV9EQVQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUM19fRElTUDFfREFUMwkJKF9NWDUxX1BBRF9ESVNQMV9EQVQzX19ESVNQMV9EQVQzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNF9fRElTUDFfREFUNAkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ0X19ESVNQMV9EQVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNV9fRElTUDFfREFUNQkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ1X19ESVNQMV9EQVQ1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNl9fQk9PVF9VU0JfU1JDCShfTVg1MV9QQURfRElTUDFfREFUNl9fQk9PVF9VU0JfU1JDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNl9fRElTUDFfREFUNgkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ2X19ESVNQMV9EQVQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUN19fQk9PVF9FRVBST01fQ0ZHCShfTVg1MV9QQURfRElTUDFfREFUN19fQk9PVF9FRVBST01fQ0ZHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUN19fRElTUDFfREFUNwkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ3X19ESVNQMV9EQVQ3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUOF9fQk9PVF9TUkMwCQkoX01YNTFfUEFEX0RJU1AxX0RBVDhfX0JPT1RfU1JDMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDhfX0RJU1AxX0RBVDgJCShfTVg1MV9QQURfRElTUDFfREFUOF9fRElTUDFfREFUOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDlfX0JPT1RfU1JDMQkJKF9NWDUxX1BBRF9ESVNQMV9EQVQ5X19CT09UX1NSQzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ5X19ESVNQMV9EQVQ5CQkoX01YNTFfUEFEX0RJU1AxX0RBVDlfX0RJU1AxX0RBVDkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMF9fQk9PVF9TUEFSRV9TSVpFCShfTVg1MV9QQURfRElTUDFfREFUMTBfX0JPT1RfU1BBUkVfU0laRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEwX19ESVNQMV9EQVQxMAkoX01YNTFfUEFEX0RJU1AxX0RBVDEwX19ESVNQMV9EQVQxMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDExX19CT09UX0xQQl9GUkVRMgkoX01YNTFfUEFEX0RJU1AxX0RBVDExX19CT09UX0xQQl9GUkVRMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDExX19ESVNQMV9EQVQxMQkoX01YNTFfUEFEX0RJU1AxX0RBVDExX19ESVNQMV9EQVQxMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEyX19CT09UX01MQ19TRUwJKF9NWDUxX1BBRF9ESVNQMV9EQVQxMl9fQk9PVF9NTENfU0VMIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTJfX0RJU1AxX0RBVDEyCShfTVg1MV9QQURfRElTUDFfREFUMTJfX0RJU1AxX0RBVDEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTNfX0JPT1RfTUVNX0NUTDAJKF9NWDUxX1BBRF9ESVNQMV9EQVQxM19fQk9PVF9NRU1fQ1RMMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEzX19ESVNQMV9EQVQxMwkoX01YNTFfUEFEX0RJU1AxX0RBVDEzX19ESVNQMV9EQVQxMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE0X19CT09UX01FTV9DVEwxCShfTVg1MV9QQURfRElTUDFfREFUMTRfX0JPT1RfTUVNX0NUTDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNF9fRElTUDFfREFUMTQJKF9NWDUxX1BBRF9ESVNQMV9EQVQxNF9fRElTUDFfREFUMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fQk9PVF9CVVNfV0lEVEgJKF9NWDUxX1BBRF9ESVNQMV9EQVQxNV9fQk9PVF9CVVNfV0lEVEggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNV9fRElTUDFfREFUMTUJKF9NWDUxX1BBRF9ESVNQMV9EQVQxNV9fRElTUDFfREFUMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNl9fQk9PVF9QQUdFX1NJWkUwCShfTVg1MV9QQURfRElTUDFfREFUMTZfX0JPT1RfUEFHRV9TSVpFMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE2X19ESVNQMV9EQVQxNgkoX01YNTFfUEFEX0RJU1AxX0RBVDE2X19ESVNQMV9EQVQxNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE3X19CT09UX1BBR0VfU0laRTEJKF9NWDUxX1BBRF9ESVNQMV9EQVQxN19fQk9PVF9QQUdFX1NJWkUxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTdfX0RJU1AxX0RBVDE3CShfTVg1MV9QQURfRElTUDFfREFUMTdfX0RJU1AxX0RBVDE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMThfX0JPT1RfV0VJTV9NVVhFRDAJKF9NWDUxX1BBRF9ESVNQMV9EQVQxOF9fQk9PVF9XRUlNX01VWEVEMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMV9EQVQxOAkoX01YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMV9EQVQxOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMl9QSU4xMQkoX01YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMl9QSU4xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE4X19ESVNQMl9QSU41CShfTVg1MV9QQURfRElTUDFfREFUMThfX0RJU1AyX1BJTjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOV9fQk9PVF9XRUlNX01VWEVEMQkoX01YNTFfUEFEX0RJU1AxX0RBVDE5X19CT09UX1dFSU1fTVVYRUQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AxX0RBVDE5CShfTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AxX0RBVDE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjEyCShfTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjYJKF9NWDUxX1BBRF9ESVNQMV9EQVQxOV9fRElTUDJfUElONiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIwX19CT09UX01FTV9UWVBFMAkoX01YNTFfUEFEX0RJU1AxX0RBVDIwX19CT09UX01FTV9UWVBFMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMV9EQVQyMAkoX01YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMV9EQVQyMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMl9QSU4xMwkoX01YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMl9QSU4xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIwX19ESVNQMl9QSU43CShfTVg1MV9QQURfRElTUDFfREFUMjBfX0RJU1AyX1BJTjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fQk9PVF9NRU1fVFlQRTEJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fQk9PVF9NRU1fVFlQRTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDFfREFUMjEJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDFfREFUMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOMTQJKF9NWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMV9fRElTUDJfUElOOAkoX01YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMl9QSU44IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0JPT1RfTFBCX0ZSRVEwCShfTVg1MV9QQURfRElTUDFfREFUMjJfX0JPT1RfTFBCX0ZSRVEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AxX0RBVDIyCShfTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AxX0RBVDIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0QwX0NTCShfTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0QwX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0RBVDE2CShfTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0RBVDE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0JPT1RfTFBCX0ZSRVExCShfTVg1MV9QQURfRElTUDFfREFUMjNfX0JPT1RfTFBCX0ZSRVExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AxX0RBVDIzCShfTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AxX0RBVDIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0QxX0NTCShfTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0QxX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0RBVDE3CShfTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0RBVDE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX1NFUl9DUwkoX01YNTFfUEFEX0RJU1AxX0RBVDIzX19ESVNQMl9TRVJfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOM19fREkxX1BJTjMJCShfTVg1MV9QQURfREkxX1BJTjNfX0RJMV9QSU4zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjJfX0RJMV9QSU4yCQkoX01YNTFfUEFEX0RJMV9QSU4yX19ESTFfUElOMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQMl9fRElTUDFfU0VSX0NMSwkJKF9NWDUxX1BBRF9ESV9HUDJfX0RJU1AxX1NFUl9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDJfX0RJU1AyX1dBSVQJCShfTVg1MV9QQURfRElfR1AyX19ESVNQMl9XQUlUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19DU0kxX0RBVEFfRU4JCShfTVg1MV9QQURfRElfR1AzX19DU0kxX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDNfX0RJU1AxX1NFUl9ESU8JCShfTVg1MV9QQURfRElfR1AzX19ESVNQMV9TRVJfRElPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19GRUNfVFhfRVIJCShfTVg1MV9QQURfRElfR1AzX19GRUNfVFhfRVIgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF81KSkKLSNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjRfX0NTSTJfREFUQV9FTgkJKF9NWDUxX1BBRF9ESTJfUElONF9fQ1NJMl9EQVRBX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjRfX0RJMl9QSU40CQkoX01YNTFfUEFEX0RJMl9QSU40X19ESTJfUElONCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19GRUNfQ1JTCQkoX01YNTFfUEFEX0RJMl9QSU40X19GRUNfQ1JTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjJfX0RJMl9QSU4yCQkoX01YNTFfUEFEX0RJMl9QSU4yX19ESTJfUElOMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4yX19GRUNfTURDCQkoX01YNTFfUEFEX0RJMl9QSU4yX19GRUNfTURDIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4zX19ESTJfUElOMwkJKF9NWDUxX1BBRF9ESTJfUElOM19fREkyX1BJTjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOM19fRkVDX01ESU8JCShfTVg1MV9QQURfREkyX1BJTjNfX0ZFQ19NRElPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfREkyX0RJU1BfQ0xLX19ESTJfRElTUF9DTEsJKF9NWDUxX1BBRF9ESTJfRElTUF9DTEtfX0RJMl9ESVNQX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJMl9ESVNQX0NMS19fRkVDX1JEQVRBMQkoX01YNTFfUEFEX0RJMl9ESVNQX0NMS19fRkVDX1JEQVRBMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fREkyX1BJTjE1CQkoX01YNTFfUEFEX0RJX0dQNF9fREkyX1BJTjE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElfR1A0X19ESVNQMV9TRVJfRElOCQkoX01YNTFfUEFEX0RJX0dQNF9fRElTUDFfU0VSX0RJTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fRElTUDJfUElOMQkJKF9NWDUxX1BBRF9ESV9HUDRfX0RJU1AyX1BJTjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0ZFQ19SREFUQTIJCShfTVg1MV9QQURfRElfR1A0X19GRUNfUkRBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fRElTUDJfREFUMAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQwX19ESVNQMl9EQVQwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fRkVDX1JEQVRBMwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQwX19GRUNfUkRBVEEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fS0VZX0NPTDYJCShfTVg1MV9QQURfRElTUDJfREFUMF9fS0VZX0NPTDYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19VQVJUM19SWEQJCShfTVg1MV9QQURfRElTUDJfREFUMF9fVUFSVDNfUlhEIHwgTVVYX1BBRF9DVFJMKE1YNTFfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX1VTQkgzX0NMSwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQwX19VU0JIM19DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fRElTUDJfREFUMQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxX19ESVNQMl9EQVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fRkVDX1JYX0VSCQkoX01YNTFfUEFEX0RJU1AyX0RBVDFfX0ZFQ19SWF9FUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDFfX0tFWV9DT0w3CQkoX01YNTFfUEFEX0RJU1AyX0RBVDFfX0tFWV9DT0w3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fVUFSVDNfVFhECQkoX01YNTFfUEFEX0RJU1AyX0RBVDFfX1VBUlQzX1RYRCB8IE1VWF9QQURfQ1RSTChNWDUxX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxX19VU0JIM19ESVIJCShfTVg1MV9QQURfRElTUDJfREFUMV9fVVNCSDNfRElSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMl9fRElTUDJfREFUMgkJKF9NWDUxX1BBRF9ESVNQMl9EQVQyX19ESVNQMl9EQVQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUM19fRElTUDJfREFUMwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQzX19ESVNQMl9EQVQzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNF9fRElTUDJfREFUNAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ0X19ESVNQMl9EQVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNV9fRElTUDJfREFUNQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ1X19ESVNQMl9EQVQ1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNl9fRElTUDJfREFUNgkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19ESVNQMl9EQVQ2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNl9fRkVDX1REQVRBMQkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ2X19GRUNfVERBVEExIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0dQSU8xXzE5CQkoX01YNTFfUEFEX0RJU1AyX0RBVDZfX0dQSU8xXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNl9fS0VZX1JPVzQJCShfTVg1MV9QQURfRElTUDJfREFUNl9fS0VZX1JPVzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19VU0JIM19TVFAJCShfTVg1MV9QQURfRElTUDJfREFUNl9fVVNCSDNfU1RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUN19fRElTUDJfREFUNwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19ESVNQMl9EQVQ3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUN19fRkVDX1REQVRBMgkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ3X19GRUNfVERBVEEyIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0dQSU8xXzI5CQkoX01YNTFfUEFEX0RJU1AyX0RBVDdfX0dQSU8xXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUN19fS0VZX1JPVzUJCShfTVg1MV9QQURfRElTUDJfREFUN19fS0VZX1JPVzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19VU0JIM19OWFQJCShfTVg1MV9QQURfRElTUDJfREFUN19fVVNCSDNfTlhUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOF9fRElTUDJfREFUOAkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19ESVNQMl9EQVQ4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOF9fRkVDX1REQVRBMwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQ4X19GRUNfVERBVEEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0dQSU8xXzMwCQkoX01YNTFfUEFEX0RJU1AyX0RBVDhfX0dQSU8xXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOF9fS0VZX1JPVzYJCShfTVg1MV9QQURfRElTUDJfREFUOF9fS0VZX1JPVzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19VU0JIM19EQVRBMAkoX01YNTFfUEFEX0RJU1AyX0RBVDhfX1VTQkgzX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fQVVENl9SWEMJCShfTVg1MV9QQURfRElTUDJfREFUOV9fQVVENl9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19ESVNQMl9EQVQ5CQkoX01YNTFfUEFEX0RJU1AyX0RBVDlfX0RJU1AyX0RBVDkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19GRUNfVFhfRU4JCShfTVg1MV9QQURfRElTUDJfREFUOV9fRkVDX1RYX0VOIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX0dQSU8xXzMxCQkoX01YNTFfUEFEX0RJU1AyX0RBVDlfX0dQSU8xXzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fVVNCSDNfREFUQTEJKF9NWDUxX1BBRF9ESVNQMl9EQVQ5X19VU0JIM19EQVRBMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9EQVQxMAkoX01YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9EQVQxMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19ESVNQMl9TRVJfQ1MJKF9NWDUxX1BBRF9ESVNQMl9EQVQxMF9fRElTUDJfU0VSX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX0ZFQ19DT0wJCShfTVg1MV9QQURfRElTUDJfREFUMTBfX0ZFQ19DT0wgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fS0VZX1JPVzcJCShfTVg1MV9QQURfRElTUDJfREFUMTBfX0tFWV9ST1c3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX1VTQkgzX0RBVEEyCShfTVg1MV9QQURfRElTUDJfREFUMTBfX1VTQkgzX0RBVEEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0FVRDZfVFhECQkoX01YNTFfUEFEX0RJU1AyX0RBVDExX19BVUQ2X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19ESVNQMl9EQVQxMQkoX01YNTFfUEFEX0RJU1AyX0RBVDExX19ESVNQMl9EQVQxMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDExX19GRUNfUlhfQ0xLCShfTVg1MV9QQURfRElTUDJfREFUMTFfX0ZFQ19SWF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fR1BJTzFfMTAJCShfTVg1MV9QQURfRElTUDJfREFUMTFfX0dQSU8xXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX1VTQkgzX0RBVEEzCShfTVg1MV9QQURfRElTUDJfREFUMTFfX1VTQkgzX0RBVEEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTJfX0FVRDZfUlhECQkoX01YNTFfUEFEX0RJU1AyX0RBVDEyX19BVUQ2X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19ESVNQMl9EQVQxMgkoX01YNTFfUEFEX0RJU1AyX0RBVDEyX19ESVNQMl9EQVQxMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19GRUNfUlhfRFYJCShfTVg1MV9QQURfRElTUDJfREFUMTJfX0ZFQ19SWF9EViB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19VU0JIM19EQVRBNAkoX01YNTFfUEFEX0RJU1AyX0RBVDEyX19VU0JIM19EQVRBNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19BVUQ2X1RYQwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxM19fQVVENl9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMJKF9NWDUxX1BBRF9ESVNQMl9EQVQxM19fRElTUDJfREFUMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxM19fRkVDX1RYX0NMSwkoX01YNTFfUEFEX0RJU1AyX0RBVDEzX19GRUNfVFhfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19VU0JIM19EQVRBNQkoX01YNTFfUEFEX0RJU1AyX0RBVDEzX19VU0JIM19EQVRBNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19BVUQ2X1RYRlMJCShfTVg1MV9QQURfRElTUDJfREFUMTRfX0FVRDZfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19ESVNQMl9EQVQxNAkoX01YNTFfUEFEX0RJU1AyX0RBVDE0X19ESVNQMl9EQVQxNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19GRUNfUkRBVEEwCShfTVg1MV9QQURfRElTUDJfREFUMTRfX0ZFQ19SREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9QQURfQ1RSTF80KSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTRfX1VTQkgzX0RBVEE2CShfTVg1MV9QQURfRElTUDJfREFUMTRfX1VTQkgzX0RBVEE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0FVRDZfUlhGUwkJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fQVVENl9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AxX1NFUl9DUwkoX01YNTFfUEFEX0RJU1AyX0RBVDE1X19ESVNQMV9TRVJfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDJfREFUMTUJKF9NWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDJfREFUMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNV9fRkVDX1REQVRBMAkoX01YNTFfUEFEX0RJU1AyX0RBVDE1X19GRUNfVERBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfUEFEX0NUUkxfNSkpCi0jZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE1X19VU0JIM19EQVRBNwkoX01YNTFfUEFEX0RJU1AyX0RBVDE1X19VU0JIM19EQVRBNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9DTURfX0FVRDVfUlhGUwkJKF9NWDUxX1BBRF9TRDFfQ01EX19BVUQ1X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19DU1BJX01PU0kJCShfTVg1MV9QQURfU0QxX0NNRF9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0NNRF9fU0QxX0NNRAkJKF9NWDUxX1BBRF9TRDFfQ01EX19TRDFfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0xLX19BVUQ1X1JYQwkJKF9NWDUxX1BBRF9TRDFfQ0xLX19BVUQ1X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJKF9NWDUxX1BBRF9TRDFfQ0xLX19DU1BJX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfQ0xLX19TRDFfQ0xLCQkoX01YNTFfUEFEX1NEMV9DTEtfX1NEMV9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEwX19BVUQ1X1RYRAkJKF9NWDUxX1BBRF9TRDFfREFUQTBfX0FVRDVfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEwX19DU1BJX01JU08JCShfTVg1MV9QQURfU0QxX0RBVEEwX19DU1BJX01JU08gfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMF9fU0QxX0RBVEEwCQkoX01YNTFfUEFEX1NEMV9EQVRBMF9fU0QxX0RBVEEwIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREEwX19FSU1fREEwCQkoX01YNTFfUEFEX0VJTV9EQTBfX0VJTV9EQTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExX19FSU1fREExCQkoX01YNTFfUEFEX0VJTV9EQTFfX0VJTV9EQTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREEyX19FSU1fREEyCQkoX01YNTFfUEFEX0VJTV9EQTJfX0VJTV9EQTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREEzX19FSU1fREEzCQkoX01YNTFfUEFEX0VJTV9EQTNfX0VJTV9EQTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTFfX0FVRDVfUlhECQkoX01YNTFfUEFEX1NEMV9EQVRBMV9fQVVENV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMQkJKF9NWDUxX1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMSB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNF9fRUlNX0RBNAkJKF9NWDUxX1BBRF9FSU1fREE0X19FSU1fREE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNV9fRUlNX0RBNQkJKF9NWDUxX1BBRF9FSU1fREE1X19FSU1fREE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNl9fRUlNX0RBNgkJKF9NWDUxX1BBRF9FSU1fREE2X19FSU1fREE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBN19fRUlNX0RBNwkJKF9NWDUxX1BBRF9FSU1fREE3X19FSU1fREE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEyX19BVUQ1X1RYQwkJKF9NWDUxX1BBRF9TRDFfREFUQTJfX0FVRDVfVFhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIJCShfTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEwX19FSU1fREExMAkJKF9NWDUxX1BBRF9FSU1fREExMF9fRUlNX0RBMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMV9fRUlNX0RBMTEJCShfTVg1MV9QQURfRUlNX0RBMTFfX0VJTV9EQTExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOAkJKF9NWDUxX1BBRF9FSU1fREE4X19FSU1fREE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOV9fRUlNX0RBOQkJKF9NWDUxX1BBRF9FSU1fREE5X19FSU1fREE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEzX19BVUQ1X1RYRlMJCShfTVg1MV9QQURfU0QxX0RBVEEzX19BVUQ1X1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX0NTUElfU1MxCQkoX01YNTFfUEFEX1NEMV9EQVRBM19fQ1NQSV9TUzEgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzCQkoX01YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8wX19DU1BJX1NTMgkJKF9NWDUxX1BBRF9HUElPMV8wX19DU1BJX1NTMiB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMF9fR1BJTzFfMAkJKF9NWDUxX1BBRF9HUElPMV8wX19HUElPMV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMF9fU0QxX0NECQkoX01YNTFfUEFEX0dQSU8xXzBfX1NEMV9DRCB8IE1VWF9QQURfQ1RSTChNWDUxX0VTREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMV9fQ1NQSV9NSVNPCQkoX01YNTFfUEFEX0dQSU8xXzFfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMQkJKF9NWDUxX1BBRF9HUElPMV8xX19HUElPMV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMV9fU0QxX1dQCQkoX01YNTFfUEFEX0dQSU8xXzFfX1NEMV9XUCB8IE1VWF9QQURfQ1RSTChNWDUxX0VTREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTJfX0VJTV9EQTEyCQkoX01YNTFfUEFEX0VJTV9EQTEyX19FSU1fREExMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEzX19FSU1fREExMwkJKF9NWDUxX1BBRF9FSU1fREExM19fRUlNX0RBMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9FSU1fREExNF9fRUlNX0RBMTQJCShfTVg1MV9QQURfRUlNX0RBMTRfX0VJTV9EQTE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTVfX0VJTV9EQTE1CQkoX01YNTFfUEFEX0VJTV9EQTE1X19FSU1fREExNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9DTURfX0NTUElfTU9TSQkJKF9NWDUxX1BBRF9TRDJfQ01EX19DU1BJX01PU0kgfCBNVVhfUEFEX0NUUkwoTVg1MV9FQ1NQSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9DTURfX0kyQzFfU0NMCQkoX01YNTFfUEFEX1NEMl9DTURfX0kyQzFfU0NMIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0NNRF9fU0QyX0NNRAkJKF9NWDUxX1BBRF9TRDJfQ01EX19TRDJfQ01EIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ0xLX19DU1BJX1NDTEsJCShfTVg1MV9QQURfU0QyX0NMS19fQ1NQSV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfQ0xLX19JMkMxX1NEQQkJKF9NWDUxX1BBRF9TRDJfQ0xLX19JMkMxX1NEQSB8IE1VWF9QQURfQ1RSTChNWDUxX0kyQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9DTEtfX1NEMl9DTEsJCShfTVg1MV9QQURfU0QyX0NMS19fU0QyX0NMSyB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMIHwgUEFEX0NUTF9IWVMpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTBfX0NTUElfTUlTTwkJKF9NWDUxX1BBRF9TRDJfREFUQTBfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChNWDUxX0VDU1BJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEwX19TRDFfREFUNAkJKF9NWDUxX1BBRF9TRDJfREFUQTBfX1NEMV9EQVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEwX19TRDJfREFUQTAJCShfTVg1MV9QQURfU0QyX0RBVEEwX19TRDJfREFUQTAgfCBNVVhfUEFEX0NUUkwoTVg1MV9TREhDSV9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fU0QxX0RBVDUJCShfTVg1MV9QQURfU0QyX0RBVEExX19TRDFfREFUNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExCQkoX01YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExIHwgTVVYX1BBRF9DVFJMKE1YNTFfU0RIQ0lfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTFfX1VTQkgzX0gyX0RQCQkoX01YNTFfUEFEX1NEMl9EQVRBMV9fVVNCSDNfSDJfRFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTJfX1NEMV9EQVQ2CQkoX01YNTFfUEFEX1NEMl9EQVRBMl9fU0QxX0RBVDYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTJfX1NEMl9EQVRBMgkJKF9NWDUxX1BBRF9TRDJfREFUQTJfX1NEMl9EQVRBMiB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEyX19VU0JIM19IMl9ETQkJKF9NWDUxX1BBRF9TRDJfREFUQTJfX1VTQkgzX0gyX0RNIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEzX19DU1BJX1NTMgkJKF9NWDUxX1BBRF9TRDJfREFUQTNfX0NTUElfU1MyIHwgTVVYX1BBRF9DVFJMKE1YNTFfRUNTUElfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTNfX1NEMV9EQVQ3CQkoX01YNTFfUEFEX1NEMl9EQVRBM19fU0QxX0RBVDcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTNfX1NEMl9EQVRBMwkJKF9NWDUxX1BBRF9TRDJfREFUQTNfX1NEMl9EQVRBMyB8IE1VWF9QQURfQ1RSTChNWDUxX1NESENJX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fQ0NNX09VVF8yCQkoX01YNTFfUEFEX0dQSU8xXzJfX0NDTV9PVVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzJfX0dQSU8xXzIJCShfTVg1MV9QQURfR1BJTzFfMl9fR1BJTzFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzJfX0kyQzJfU0NMCQkoX01YNTFfUEFEX0dQSU8xXzJfX0kyQzJfU0NMIHwgTVVYX1BBRF9DVFJMKE1YNTFfSTJDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fUExMMV9CWVAJCShfTVg1MV9QQURfR1BJTzFfMl9fUExMMV9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19QV00xX1BXTU8JCShfTVg1MV9QQURfR1BJTzFfMl9fUFdNMV9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fR1BJTzFfMwkJKF9NWDUxX1BBRF9HUElPMV8zX19HUElPMV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fSTJDMl9TREEJCShfTVg1MV9QQURfR1BJTzFfM19fSTJDMl9TREEgfCBNVVhfUEFEX0NUUkwoTVg1MV9JMkNfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV8zX19QTEwyX0JZUAkJKF9NWDUxX1BBRF9HUElPMV8zX19QTEwyX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzNfX1BXTTJfUFdNTwkJKF9NWDUxX1BBRF9HUElPMV8zX19QV00yX1BXTU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfSU5UX1JFUQkoX01YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19JTlRfUkVRIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX1BNVV9JUlFfQgkoX01YNTFfUEFEX1BNSUNfSU5UX1JFUV9fUE1JQ19QTVVfSVJRX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19ESVNQMl9FWFRfQ0xLCQkoX01YNTFfUEFEX0dQSU8xXzRfX0RJU1AyX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19FSU1fUkRZCQkoX01YNTFfUEFEX0dQSU8xXzRfX0VJTV9SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19HUElPMV80CQkoX01YNTFfUEFEX0dQSU8xXzRfX0dQSU8xXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19XRE9HMV9XRE9HX0IJCShfTVg1MV9QQURfR1BJTzFfNF9fV0RPRzFfV0RPR19CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNV9fQ1NJMl9NQ0xLCQkoX01YNTFfUEFEX0dQSU8xXzVfX0NTSTJfTUNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX0RJU1AyX1BJTjE2CQkoX01YNTFfUEFEX0dQSU8xXzVfX0RJU1AyX1BJTjE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNV9fR1BJTzFfNQkJKF9NWDUxX1BBRF9HUElPMV81X19HUElPMV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNV9fV0RPRzJfV0RPR19CCQkoX01YNTFfUEFEX0dQSU8xXzVfX1dET0cyX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzZfX0RJU1AyX1BJTjE3CQkoX01YNTFfUEFEX0dQSU8xXzZfX0RJU1AyX1BJTjE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNgkJKF9NWDUxX1BBRF9HUElPMV82X19HUElPMV82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNl9fUkVGX0VOX0IJCShfTVg1MV9QQURfR1BJTzFfNl9fUkVGX0VOX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV83X19DQ01fT1VUXzAJCShfTVg1MV9QQURfR1BJTzFfN19fQ0NNX09VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfN19fR1BJTzFfNwkJKF9NWDUxX1BBRF9HUElPMV83X19HUElPMV83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfN19fU0QyX1dQCQkoX01YNTFfUEFEX0dQSU8xXzdfX1NEMl9XUCB8IE1VWF9QQURfQ1RSTChNWDUxX0VTREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfN19fU1BESUZfT1VUMQkJKF9NWDUxX1BBRF9HUElPMV83X19TUERJRl9PVVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOF9fQ1NJMl9EQVRBX0VOCQkoX01YNTFfUEFEX0dQSU8xXzhfX0NTSTJfREFUQV9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX0dQSU8xXzgJCShfTVg1MV9QQURfR1BJTzFfOF9fR1BJTzFfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX1NEMl9DRAkJKF9NWDUxX1BBRF9HUElPMV84X19TRDJfQ0QgfCBNVVhfUEFEX0NUUkwoTVg1MV9FU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX1VTQkgzX1BXUgkJKF9NWDUxX1BBRF9HUElPMV84X19VU0JIM19QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19DQ01fT1VUXzEJCShfTVg1MV9QQURfR1BJTzFfOV9fQ0NNX09VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfRDFfQ1MJCShfTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfRDFfQ1MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19ESVNQMl9TRVJfQ1MJCShfTVg1MV9QQURfR1BJTzFfOV9fRElTUDJfU0VSX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fR1BJTzFfOQkJKF9NWDUxX1BBRF9HUElPMV85X19HUElPMV85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fU0QyX0xDVEwJCShfTVg1MV9QQURfR1BJTzFfOV9fU0QyX0xDVEwgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19VU0JIM19PQwkJKF9NWDUxX1BBRF9HUElPMV85X19VU0JIM19PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjJfX0dQSU8yXzIyCQlJT01VWF9QQUQoMHg0NjgsIDB4MGQ0LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIyX19HUFRfQ01QT1VUMQkJSU9NVVhfUEFEKDB4NDY4LCAweDBkNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIzX19BVUQ1X1JYQwkJSU9NVVhfUEFEKDB4NDZjLCAweDBkOCwgNiwgMHg4ZGMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIzX19DU0kxX0QzCQlJT01VWF9QQUQoMHg0NmMsIDB4MGQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9FQjNfX0VJTV9FQjMJCUlPTVVYX1BBRCgweDQ2YywgMHgwZDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fRkVDX1JEQVRBMQkJSU9NVVhfUEFEKDB4NDZjLCAweDBkOCwgMywgMHg5NWMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRUIzX19HUElPMl8yMwkJSU9NVVhfUEFEKDB4NDZjLCAweDBkOCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0VCM19fR1BUX0NNUE9VVDIJCUlPTVVYX1BBRCgweDQ2YywgMHgwZDgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX09FX19FSU1fT0UJCQlJT01VWF9QQUQoMHg0NzAsIDB4MGRjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9PRV9fR1BJTzJfMjQJCUlPTVVYX1BBRCgweDQ3MCwgMHgwZGMsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzBfX0VJTV9DUzAJCUlPTVVYX1BBRCgweDQ3NCwgMHgwZTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMF9fR1BJTzJfMjUJCUlPTVVYX1BBRCgweDQ3NCwgMHgwZTAsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzFfX0VJTV9DUzEJCUlPTVVYX1BBRCgweDQ3OCwgMHgwZTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMV9fR1BJTzJfMjYJCUlPTVVYX1BBRCgweDQ3OCwgMHgwZTQsIDEsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0FVRDVfVFhECQlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCA2LCAweDhkOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0NTSTFfRDQJCUlPTVVYX1BBRCgweDQ3YywgMHgwZTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTMl9fRUlNX0NTMgkJSU9NVVhfUEFEKDB4NDdjLCAweDBlOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19GRUNfUkRBVEEyCQlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCAzLCAweDk2MCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzJfX0dQSU8yXzI3CQlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MyX19VU0JPVEdfU1RQCQlJT01VWF9QQUQoMHg0N2MsIDB4MGU4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0FVRDVfUlhECQlJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCA2LCAweDhkNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0NTSTFfRDUJCUlPTVVYX1BBRCgweDQ4MCwgMHgwZWMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTM19fRUlNX0NTMwkJSU9NVVhfUEFEKDB4NDgwLCAweDBlYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19GRUNfUkRBVEEzCQlJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCAzLCAweDk2NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzNfX0dQSU8yXzI4CQlJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1MzX19VU0JPVEdfTlhUCQlJT01VWF9QQUQoMHg0ODAsIDB4MGVjLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0FVRDVfVFhDCQlJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCA2LCAweDhlNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0NTSTFfRDYJCUlPTVVYX1BBRCgweDQ4NCwgMHgwZjAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNF9fRUlNX0NTNAkJSU9NVVhfUEFEKDB4NDg0LCAweDBmMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19GRUNfUlhfRVIJCUlPTVVYX1BBRCgweDQ4NCwgMHgwZjAsIDMsIDB4OTcwLCAwLCBNWDUxX1BBRF9DVFJMXzIpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzRfX0dQSU8yXzI5CQlJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M0X19VU0JPVEdfQ0xLCQlJT01VWF9QQUQoMHg0ODQsIDB4MGYwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0FVRDVfVFhGUwkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgNiwgMHg4ZTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19DU0kxX0Q3CQlJT01VWF9QQUQoMHg0ODgsIDB4MGY0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUzVfX0RJU1AxX0VYVF9DTEsJCUlPTVVYX1BBRCgweDQ4OCwgMHgwZjQsIDQsIDB4OTA0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fRUlNX0NTNQkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19GRUNfQ1JTCQlJT01VWF9QQUQoMHg0ODgsIDB4MGY0LCAzLCAweDk1MCwgMCwgTVg1MV9QQURfQ1RSTF8yKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fQ1M1X19HUElPMl8zMAkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgMSwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NTNV9fVVNCT1RHX0RJUgkJSU9NVVhfUEFEKDB4NDg4LCAweDBmNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRFRBQ0tfX0VJTV9EVEFDSwkJSU9NVVhfUEFEKDB4NDhjLCAweDBmOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fRFRBQ0tfX0dQSU8yXzMxCQlJT01VWF9QQUQoMHg0OGMsIDB4MGY4LCAxLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fTEJBX19FSU1fTEJBCQlJT01VWF9QQUQoMHg0OTQsIDB4MGZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9MQkFfX0dQSU8zXzEJCUlPTVVYX1BBRCgweDQ5NCwgMHgwZmMsIDEsIDB4OTc4LCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9DUkVfX0VJTV9DUkUJCUlPTVVYX1BBRCgweDRhMCwgMHgxMDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0NSRV9fR1BJTzNfMgkJSU9NVVhfUEFEKDB4NGEwLCAweDEwMCwgMSwgMHg5N2MsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRFJBTV9DUzFfX0RSQU1fQ1MxCQlJT01VWF9QQUQoMHg0ZDAsIDB4MTA0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX0dQSU8zXzMJCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDMsIDB4OTgwLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX05BTkRGX1dFX0IJCUlPTVVYX1BBRCgweDRlNCwgMHgxMDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfV0VfQl9fUEFUQV9ESU9XCQlJT01VWF9QQUQoMHg0ZTQsIDB4MTA4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dFX0JfX1NEM19EQVRBMAkJSU9NVVhfUEFEKDB4NGU0LCAweDEwOCwgMiwgMHg5M2MsIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX0dQSU8zXzQJCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDMsIDB4OTg0LCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX05BTkRGX1JFX0IJCUlPTVVYX1BBRCgweDRlOCwgMHgxMGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkVfQl9fUEFUQV9ESU9SCQlJT01VWF9QQUQoMHg0ZTgsIDB4MTBjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JFX0JfX1NEM19EQVRBMQkJSU9NVVhfUEFEKDB4NGU4LCAweDEwYywgMiwgMHg5NDAsIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0FMRV9fR1BJTzNfNQkJSU9NVVhfUEFEKDB4NGVjLCAweDExMCwgMywgMHg5ODgsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQUxFX19OQU5ERl9BTEUJCUlPTVVYX1BBRCgweDRlYywgMHgxMTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQUxFX19QQVRBX0JVRkZFUl9FTglJT01VWF9QQUQoMHg0ZWMsIDB4MTEwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NMRV9fR1BJTzNfNgkJSU9NVVhfUEFEKDB4NGYwLCAweDExNCwgMywgMHg5OGMsIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ0xFX19OQU5ERl9DTEUJCUlPTVVYX1BBRCgweDRmMCwgMHgxMTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ0xFX19QQVRBX1JFU0VUX0IJSU9NVVhfUEFEKDB4NGYwLCAweDExNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19HUElPM183CQlJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAzLCAweDk5MCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9XUF9CX19OQU5ERl9XUF9CCQlJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1dQX0JfX1BBVEFfRE1BQ0sJCUlPTVVYX1BBRCgweDRmNCwgMHgxMTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfV1BfQl9fU0QzX0RBVEEyCQlJT01VWF9QQUQoMHg0ZjQsIDB4MTE4LCAyLCAweDk0NCwgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCA1LCAweDkzMCwgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19HUElPM184CQlJT01VWF9QQUQoMHg0ZjgsIDB4MTFjLCAzLCAweDk5NCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX05BTkRGX1JCMAkJSU9NVVhfUEFEKDB4NGY4LCAweDExYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjBfX1BBVEFfRE1BUlEJCUlPTVVYX1BBRCgweDRmOCwgMHgxMWMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIwX19TRDNfREFUQTMJCUlPTVVYX1BBRCgweDRmOCwgMHgxMWMsIDIsIDB4OTQ4LCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjFfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgNiwgMHg5MWMsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fRUNTUEkyX1JEWQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgMiwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fR1BJTzNfOQkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19OQU5ERl9SQjEJCUlPTVVYX1BBRCgweDRmYywgMHgxMjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIxX19QQVRBX0lPUkRZCQlJT01VWF9QQUQoMHg0ZmMsIDB4MTIwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMV9fU0Q0X0NNRAkJSU9NVVhfUEFEKDB4NGZjLCAweDEyMCwgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fRElTUDJfV0FJVAkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgNSwgMHg5YTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0VDU1BJMl9TQ0xLCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAyLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIyX19GRUNfQ09MCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAxLCAweDk0YywgMCwgTVg1MV9QQURfQ1RSTF8yKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX0dQSU8zXzEwCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX05BTkRGX1JCMgkJSU9NVVhfUEFEKDB4NTAwLCAweDEyNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjJfX1VTQkgzX0gzX0RQCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCMl9fVVNCSDNfTlhUCQlJT01VWF9QQUQoMHg1MDAsIDB4MTI0LCA2LCAweGEyMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JCM19fRElTUDFfV0FJVAkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAyLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkIzX19GRUNfUlhfQ0xLCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAxLCAweDk2OCwgMCwgTVg1MV9QQURfQ1RSTF8yKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX0dQSU8zXzExCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX05BTkRGX1JCMwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0NMSwkJSU9NVVhfUEFEKDB4NTA0LCAweDEyOCwgNiwgMHg5ZjgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9SQjNfX1VTQkgzX0gzX0RNCQlJT01VWF9QQUQoMHg1MDQsIDB4MTI4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU9fTkFORF9fR1BJT19OQU5ECQlJT01VWF9QQUQoMHg1MTQsIDB4MTJjLCAwLCAweDk5OCwgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPX05BTkRfX1BBVEFfSU5UUlEJCUlPTVVYX1BBRCgweDUxNCwgMHgxMmMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MwX19HUElPM18xNgkJSU9NVVhfUEFEKDB4NTE4LCAweDEzMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MwX19OQU5ERl9DUzAJCUlPTVVYX1BBRCgweDUxOCwgMHgxMzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MxX19HUElPM18xNwkJSU9NVVhfUEFEKDB4NTFjLCAweDEzNCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MxX19OQU5ERl9DUzEJCUlPTVVYX1BBRCgweDUxYywgMHgxMzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19DU1BJX1NDTEsJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDYsIDB4OTE0LCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX0ZFQ19UWF9FUgkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19HUElPM18xOAkJSU9NVVhfUEFEKDB4NTIwLCAweDEzOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19OQU5ERl9DUzIJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19QQVRBX0NTXzAJCUlPTVVYX1BBRCgweDUyMCwgMHgxMzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MyX19TRDRfQ0xLCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCA1LCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCB8IFBBRF9DVExfSFlTKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzJfX1VTQkgzX0gxX0RQCQlJT01VWF9QQUQoMHg1MjAsIDB4MTM4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fRkVDX01EQwkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19HUElPM18xOQkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19OQU5ERl9DUzMJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19QQVRBX0NTXzEJCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1MzX19TRDRfREFUMAkJSU9NVVhfUEFEKDB4NTI0LCAweDEzYywgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTM19fVVNCSDNfSDFfRE0JCUlPTVVYX1BBRCgweDUyNCwgMHgxM2MsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19GRUNfVERBVEExCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX0dQSU8zXzIwCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX05BTkRGX0NTNAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX1BBVEFfREFfMAkJSU9NVVhfUEFEKDB4NTI4LCAweDE0MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzRfX1NENF9EQVQxCQlJT01VWF9QQUQoMHg1MjgsIDB4MTQwLCA1LCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M0X19VU0JIM19TVFAJCUlPTVVYX1BBRCgweDUyOCwgMHgxNDAsIDcsIDB4YTI0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19GRUNfVERBVEEyCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCAyLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX0dQSU8zXzIxCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX05BTkRGX0NTNQkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX1BBVEFfREFfMQkJSU9NVVhfUEFEKDB4NTJjLCAweDE0NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzVfX1NENF9EQVQyCQlJT01VWF9QQUQoMHg1MmMsIDB4MTQ0LCA1LCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M1X19VU0JIM19ESVIJCUlPTVVYX1BBRCgweDUyYywgMHgxNDQsIDcsIDB4YTFjLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19DU1BJX1NTMwkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgNywgMHg5MjgsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTNl9fRkVDX1REQVRBMwkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19HUElPM18yMgkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19OQU5ERl9DUzYJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19QQVRBX0RBXzIJCUlPTVVYX1BBRCgweDUzMCwgMHgxNDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfQ1M2X19TRDRfREFUMwkJSU9NVVhfUEFEKDB4NTMwLCAweDE0OCwgNSwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0NTN19fRkVDX1RYX0VOCQlJT01VWF9QQUQoMHg1MzQsIDB4MTRjLCAxLCBfX05BXywgMCwgTVg1MV9QQURfQ1RSTF81KQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX0dQSU8zXzIzCQlJT01VWF9QQUQoMHg1MzQsIDB4MTRjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX05BTkRGX0NTNwkJSU9NVVhfUEFEKDB4NTM0LCAweDE0YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9DUzdfX1NEM19DTEsJCUlPTVVYX1BBRCgweDUzNCwgMHgxNGMsIDUsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMIHwgUEFEX0NUTF9IWVMpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0VDU1BJMl9TUzAJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMiwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX0ZFQ19UWF9DTEsJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMSwgMHg5NzQsIDAsIE1YNTFfUEFEX0NUUkxfNCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fR1BJTzNfMjQJSU9NVVhfUEFEKDB4NTM4LCAweDE1MCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfUkRZX0lOVF9fTkFOREZfUkRZX0lOVAlJT01VWF9QQUQoMHg1MzgsIDB4MTUwLCAwLCAweDkzOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX1JEWV9JTlRfX1NEM19DTUQJCUlPTVVYX1BBRCgweDUzOCwgMHgxNTAsIDUsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTVfX0VDU1BJMl9NT1NJCQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCAyLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19HUElPM18yNQkJSU9NVVhfUEFEKDB4NTNjLCAweDE1NCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19OQU5ERl9EMTUJCUlPTVVYX1BBRCgweDUzYywgMHgxNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE1X19QQVRBX0RBVEExNQkJSU9NVVhfUEFEKDB4NTNjLCAweDE1NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTVfX1NEM19EQVQ3CQlJT01VWF9QQUQoMHg1M2MsIDB4MTU0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fRUNTUEkyX1NTMwkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgMiwgMHg5MzQsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fR1BJTzNfMjYJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fTkFOREZfRDE0CQlJT01VWF9QQUQoMHg1NDAsIDB4MTU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxNF9fUEFUQV9EQVRBMTQJCUlPTVVYX1BBRCgweDU0MCwgMHgxNTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDE0X19TRDNfREFUNgkJSU9NVVhfUEFEKDB4NTQwLCAweDE1OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX0VDU1BJMl9TUzIJCUlPTVVYX1BBRCgweDU0NCwgMHgxNWMsIDIsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX0dQSU8zXzI3CQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX05BTkRGX0QxMwkJSU9NVVhfUEFEKDB4NTQ0LCAweDE1YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTNfX1BBVEFfREFUQTEzCQlJT01VWF9QQUQoMHg1NDQsIDB4MTVjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxM19fU0QzX0RBVDUJCUlPTVVYX1BBRCgweDU0NCwgMHgxNWMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCAyLCAweDkzMCwgMSwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19HUElPM18yOAkJSU9NVVhfUEFEKDB4NTQ4LCAweDE2MCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19OQU5ERl9EMTIJCUlPTVVYX1BBRCgweDU0OCwgMHgxNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEyX19QQVRBX0RBVEExMgkJSU9NVVhfUEFEKDB4NTQ4LCAweDE2MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTJfX1NEM19EQVQ0CQlJT01VWF9QQUQoMHg1NDgsIDB4MTYwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fRkVDX1JYX0RWCQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAyLCAweDk2YywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fR1BJTzNfMjkJCUlPTVVYX1BBRCgweDU0YywgMHgxNjQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fTkFOREZfRDExCQlJT01VWF9QQUQoMHg1NGMsIDB4MTY0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxMV9fUEFUQV9EQVRBMTEJCUlPTVVYX1BBRCgweDU0YywgMHgxNjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDExX19TRDNfREFUQTMJCUlPTVVYX1BBRCgweDU0YywgMHgxNjQsIDUsIDB4OTQ4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEwX19HUElPM18zMAkJSU9NVVhfUEFEKDB4NTUwLCAweDE2OCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEwX19OQU5ERl9EMTAJCUlPTVVYX1BBRCgweDU1MCwgMHgxNjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDEwX19QQVRBX0RBVEExMAkJSU9NVVhfUEFEKDB4NTUwLCAweDE2OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMTBfX1NEM19EQVRBMgkJSU9NVVhfUEFEKDB4NTUwLCAweDE2OCwgNSwgMHg5NDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOV9fRkVDX1JEQVRBMAkJSU9NVVhfUEFEKDB4NTU0LCAweDE2YywgMHgxMiwgMHg5NTgsIDAsIE1YNTFfUEFEX0NUUkxfNCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX0dQSU8zXzMxCQlJT01VWF9QQUQoMHg1NTQsIDB4MTZjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOV9fTkFOREZfRDkJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX1BBVEFfREFUQTkJCUlPTVVYX1BBRCgweDU1NCwgMHgxNmMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDlfX1NEM19EQVRBMQkJSU9NVVhfUEFEKDB4NTU0LCAweDE2YywgNSwgMHg5NDAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fRkVDX1REQVRBMAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDhfX0dQSU80XzAJCUlPTVVYX1BBRCgweDU1OCwgMHgxNzAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q4X19OQU5ERl9EOAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fUEFUQV9EQVRBOAkJSU9NVVhfUEFEKDB4NTU4LCAweDE3MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EOF9fU0QzX0RBVEEwCQlJT01VWF9QQUQoMHg1NTgsIDB4MTcwLCA1LCAweDkzYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q3X19HUElPNF8xCQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EN19fTkFOREZfRDcJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX1BBVEFfREFUQTcJCUlPTVVYX1BBRCgweDU1YywgMHgxNzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDdfX1VTQkgzX0RBVEEwCQlJT01VWF9QQUQoMHg1NWMsIDB4MTc0LCA1LCAweDlmYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19HUElPNF8yCQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENl9fTkFOREZfRDYJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX1BBVEFfREFUQTYJCUlPTVVYX1BBRCgweDU2MCwgMHgxNzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDZfX1NENF9MQ1RMCQlJT01VWF9QQUQoMHg1NjAsIDB4MTc4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q2X19VU0JIM19EQVRBMQkJSU9NVVhfUEFEKDB4NTYwLCAweDE3OCwgNSwgMHhhMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENV9fR1BJTzRfMwkJSU9NVVhfUEFEKDB4NTY0LCAweDE3YywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX05BTkRGX0Q1CQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19QQVRBX0RBVEE1CQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q1X19TRDRfV1AJCUlPTVVYX1BBRCgweDU2NCwgMHgxN2MsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDVfX1VTQkgzX0RBVEEyCQlJT01VWF9QQUQoMHg1NjQsIDB4MTdjLCA1LCAweGEwNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0Q0X19HUElPNF80CQlJT01VWF9QQUQoMHg1NjgsIDB4MTgwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENF9fTkFOREZfRDQJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX1BBVEFfREFUQTQJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDRfX1NENF9DRAkJSU9NVVhfUEFEKDB4NTY4LCAweDE4MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9ENF9fVVNCSDNfREFUQTMJCUlPTVVYX1BBRCgweDU2OCwgMHgxODAsIDUsIDB4YTA4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX0dQSU80XzUJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QzX19OQU5ERl9EMwkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fUEFUQV9EQVRBMwkJSU9NVVhfUEFEKDB4NTZjLCAweDE4NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EM19fU0Q0X0RBVDQJCUlPTVVYX1BBRCgweDU2YywgMHgxODQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDNfX1VTQkgzX0RBVEE0CQlJT01VWF9QQUQoMHg1NmMsIDB4MTg0LCA1LCAweGEwYywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19HUElPNF82CQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMl9fTkFOREZfRDIJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX1BBVEFfREFUQTIJCUlPTVVYX1BBRCgweDU3MCwgMHgxODgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDJfX1NENF9EQVQ1CQlJT01VWF9QQUQoMHg1NzAsIDB4MTg4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QyX19VU0JIM19EQVRBNQkJSU9NVVhfUEFEKDB4NTcwLCAweDE4OCwgNSwgMHhhMTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fR1BJTzRfNwkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDFfX05BTkRGX0QxCQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19QQVRBX0RBVEExCQlJT01VWF9QQUQoMHg1NzQsIDB4MThjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QxX19TRDRfREFUNgkJSU9NVVhfUEFEKDB4NTc0LCAweDE4YywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMV9fVVNCSDNfREFUQTYJCUlPTVVYX1BBRCgweDU3NCwgMHgxOGMsIDUsIDB4YTE0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX0dQSU80XzgJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX05BTkRGX0QwX19OQU5ERl9EMAkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fUEFUQV9EQVRBMAkJSU9NVVhfUEFEKDB4NTc4LCAweDE5MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9OQU5ERl9EMF9fU0Q0X0RBVDcJCUlPTVVYX1BBRCgweDU3OCwgMHgxOTAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfTkFOREZfRDBfX1VTQkgzX0RBVEE3CQlJT01VWF9QQUQoMHg1NzgsIDB4MTkwLCA1LCAweGExOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDhfX0NTSTFfRDgJCUlPTVVYX1BBRCgweDU3YywgMHgxOTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOF9fR1BJTzNfMTIJCUlPTVVYX1BBRCgweDU3YywgMHgxOTQsIDMsIDB4OTk4LCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDlfX0NTSTFfRDkJCUlPTVVYX1BBRCgweDU4MCwgMHgxOTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EOV9fR1BJTzNfMTMJCUlPTVVYX1BBRCgweDU4MCwgMHgxOTgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEwX19DU0kxX0QxMAkJSU9NVVhfUEFEKDB4NTg0LCAweDE5YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxMV9fQ1NJMV9EMTEJCUlPTVVYX1BBRCgweDU4OCwgMHgxYTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTJfX0NTSTFfRDEyCQlJT01VWF9QQUQoMHg1OGMsIDB4MWE0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDEzX19DU0kxX0QxMwkJSU9NVVhfUEFEKDB4NTkwLCAweDFhOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxNF9fQ1NJMV9EMTQJCUlPTVVYX1BBRCgweDU5NCwgMHgxYWMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMTVfX0NTSTFfRDE1CQlJT01VWF9QQUQoMHg1OTgsIDB4MWIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE2X19DU0kxX0QxNgkJSU9NVVhfUEFEKDB4NTljLCAweDFiNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0QxN19fQ1NJMV9EMTcJCUlPTVVYX1BBRCgweDVhMCwgMHgxYjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMV9EMThfX0NTSTFfRDE4CQlJT01VWF9QQUQoMHg1YTQsIDB4MWJjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfRDE5X19DU0kxX0QxOQkJSU9NVVhfUEFEKDB4NWE4LCAweDFjMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX1ZTWU5DX19DU0kxX1ZTWU5DCQlJT01VWF9QQUQoMHg1YWMsIDB4MWM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfVlNZTkNfX0dQSU8zXzE0CQlJT01VWF9QQUQoMHg1YWMsIDB4MWM0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX0hTWU5DX19DU0kxX0hTWU5DCQlJT01VWF9QQUQoMHg1YjAsIDB4MWM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTFfSFNZTkNfX0dQSU8zXzE1CQlJT01VWF9QQUQoMHg1YjAsIDB4MWM4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX1BJWENMS19fQ1NJMV9QSVhDTEsJSU9NVVhfUEFEKDB4NWI0LCBfX05BXywgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kxX01DTEtfX0NTSTFfTUNMSwkJSU9NVVhfUEFEKDB4NWI4LCBfX05BXywgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxMl9fQ1NJMl9EMTIJCUlPTVVYX1BBRCgweDViYywgMHgxY2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTJfX0dQSU80XzkJCUlPTVVYX1BBRCgweDViYywgMHgxY2MsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDEzX19DU0kyX0QxMwkJSU9NVVhfUEFEKDB4NWMwLCAweDFkMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxM19fR1BJTzRfMTAJCUlPTVVYX1BBRCgweDVjMCwgMHgxZDAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE0X19DU0kyX0QxNAkJSU9NVVhfUEFEKDB4NWM0LCAweDFkNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxNV9fQ1NJMl9EMTUJCUlPTVVYX1BBRCgweDVjOCwgMHgxZDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTZfX0NTSTJfRDE2CQlJT01VWF9QQUQoMHg1Y2MsIDB4MWRjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfRDE3X19DU0kyX0QxNwkJSU9NVVhfUEFEKDB4NWQwLCAweDFlMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxOF9fQ1NJMl9EMTgJCUlPTVVYX1BBRCgweDVkNCwgMHgxZTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMThfX0dQSU80XzExCQlJT01VWF9QQUQoMHg1ZDQsIDB4MWU0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0QxOV9fQ1NJMl9EMTkJCUlPTVVYX1BBRCgweDVkOCwgMHgxZTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NJMl9EMTlfX0dQSU80XzEyCQlJT01VWF9QQUQoMHg1ZDgsIDB4MWU4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX1ZTWU5DX19DU0kyX1ZTWU5DCQlJT01VWF9QQUQoMHg1ZGMsIDB4MWVjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfVlNZTkNfX0dQSU80XzEzCQlJT01VWF9QQUQoMHg1ZGMsIDB4MWVjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX0hTWU5DX19DU0kyX0hTWU5DCQlJT01VWF9QQUQoMHg1ZTAsIDB4MWYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTSTJfSFNZTkNfX0dQSU80XzE0CQlJT01VWF9QQUQoMHg1ZTAsIDB4MWYwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX1BJWENMS19fQ1NJMl9QSVhDTEsJSU9NVVhfUEFEKDB4NWU0LCAweDFmNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU0kyX1BJWENMS19fR1BJTzRfMTUJCUlPTVVYX1BBRCgweDVlNCwgMHgxZjQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfQ0xLX19HUElPNF8xNgkJSU9NVVhfUEFEKDB4NWU4LCAweDFmOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfSTJDMV9DTEtfX0kyQzFfQ0xLCQlJT01VWF9QQUQoMHg1ZTgsIDB4MWY4LCAweDEwLCBfX05BXywgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0kyQzFfREFUX19HUElPNF8xNwkJSU9NVVhfUEFEKDB4NWVjLCAweDFmYywgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfSTJDMV9EQVRfX0kyQzFfREFUCQlJT01VWF9QQUQoMHg1ZWMsIDB4MWZjLCAweDEwLCBfX05BXywgMCwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfVFhEX19BVUQzX1RYRAkJSU9NVVhfUEFEKDB4NWYwLCAweDIwMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1RYRF9fR1BJTzRfMTgJCUlPTVVYX1BBRCgweDVmMCwgMHgyMDAsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfUlhEX19BVUQzX1JYRAkJSU9NVVhfUEFEKDB4NWY0LCAweDIwNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX1JYRF9fR1BJTzRfMTkJCUlPTVVYX1BBRCgweDVmNCwgMHgyMDQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfUlhEX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDVmNCwgMHgyMDQsIDEsIDB4OWY0LCAyLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfQ0tfX0FVRDNfVFhDCQlJT01VWF9QQUQoMHg1ZjgsIDB4MjA4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfQ0tfX0dQSU80XzIwCQlJT01VWF9QQUQoMHg1ZjgsIDB4MjA4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9BVUQzX0JCX0ZTX19BVUQzX1RYRlMJCUlPTVVYX1BBRCgweDVmYywgMHgyMGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQVVEM19CQl9GU19fR1BJTzRfMjEJCUlPTVVYX1BBRCgweDVmYywgMHgyMGMsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0FVRDNfQkJfRlNfX1VBUlQzX1RYRAkJSU9NVVhfUEFEKDB4NWZjLCAweDIwYywgMSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTU9TSV9fRUNTUEkxX01PU0kJSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMCwgX19OQV8sIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX01PU0lfX0dQSU80XzIyCQlJT01VWF9QQUQoMHg2MDAsIDB4MjEwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NT1NJX19JMkMxX1NEQQkJSU9NVVhfUEFEKDB4NjAwLCAweDIxMCwgMHgxMSwgMHg5YjQsIDEsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NSVNPX19BVUQ0X1JYRAkJSU9NVVhfUEFEKDB4NjA0LCAweDIxNCwgMSwgMHg4YzQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9NSVNPX19FQ1NQSTFfTUlTTwlJT01VWF9QQUQoMHg2MDQsIDB4MjE0LCAwLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfTUlTT19fR1BJTzRfMjMJCUlPTVVYX1BBRCgweDYwNCwgMHgyMTQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NTMF9fQVVENF9UWEMJCUlPTVVYX1BBRCgweDYwOCwgMHgyMTgsIDEsIDB4OGNjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MwX19FQ1NQSTFfU1MwCQlJT01VWF9QQUQoMHg2MDgsIDB4MjE4LCAwLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MwX19HUElPNF8yNAkJSU9NVVhfUEFEKDB4NjA4LCAweDIxOCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU1MxX19BVUQ0X1RYRAkJSU9NVVhfUEFEKDB4NjBjLCAweDIxYywgMSwgMHg4YzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzFfX0VDU1BJMV9TUzEJCUlPTVVYX1BBRCgweDYwYywgMHgyMWMsIDAsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TUzFfX0dQSU80XzI1CQlJT01VWF9QQUQoMHg2MGMsIDB4MjFjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9SRFlfX0FVRDRfVFhGUwkJSU9NVVhfUEFEKDB4NjEwLCAweDIyMCwgMSwgMHg4ZDAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9SRFlfX0VDU1BJMV9SRFkJCUlPTVVYX1BBRCgweDYxMCwgMHgyMjAsIDAsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9SRFlfX0dQSU80XzI2CQlJT01VWF9QQUQoMHg2MTAsIDB4MjIwLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9DU1BJMV9TQ0xLX19FQ1NQSTFfU0NMSwlJT01VWF9QQUQoMHg2MTQsIDB4MjI0LCAwLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfQ1NQSTFfU0NMS19fR1BJTzRfMjcJCUlPTVVYX1BBRCgweDYxNCwgMHgyMjQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0NTUEkxX1NDTEtfX0kyQzFfU0NMCQlJT01VWF9QQUQoMHg2MTQsIDB4MjI0LCAweDExLCAweDliMCwgMSwgTVg1MV9JMkNfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JYRF9fR1BJTzRfMjgJCUlPTVVYX1BBRCgweDYxOCwgMHgyMjgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX1JYRF9fVUFSVDFfUlhECQlJT01VWF9QQUQoMHg2MTgsIDB4MjI4LCAwLCAweDllNCwgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX0dQSU80XzI5CQlJT01VWF9QQUQoMHg2MWMsIDB4MjJjLCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1BXTTJfUFdNTwkJSU9NVVhfUEFEKDB4NjFjLCAweDIyYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMV9UWERfX1VBUlQxX1RYRAkJSU9NVVhfUEFEKDB4NjFjLCAweDIyYywgMCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDFfUlRTX19HUElPNF8zMAkJSU9NVVhfUEFEKDB4NjIwLCAweDIzMCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDFfUlRTX19VQVJUMV9SVFMJCUlPTVVYX1BBRCgweDYyMCwgMHgyMzAsIDAsIDB4OWUwLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX0NUU19fR1BJTzRfMzEJCUlPTVVYX1BBRCgweDYyNCwgMHgyMzQsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQxX0NUU19fVUFSVDFfQ1RTCQlJT01VWF9QQUQoMHg2MjQsIDB4MjM0LCAwLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9SWERfX0ZJUklfVFhECQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fR1BJTzFfMjAJCUlPTVVYX1BBRCgweDYyOCwgMHgyMzgsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1JYRF9fVUFSVDJfUlhECQlJT01VWF9QQUQoMHg2MjgsIDB4MjM4LCAwLCAweDllYywgMiwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUMl9UWERfX0ZJUklfUlhECQlJT01VWF9QQUQoMHg2MmMsIDB4MjNjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1RYRF9fR1BJTzFfMjEJCUlPTVVYX1BBRCgweDYyYywgMHgyM2MsIDMsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQyX1RYRF9fVUFSVDJfVFhECQlJT01VWF9QQUQoMHg2MmMsIDB4MjNjLCAwLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUM19SWERfX0NTSTFfRDAJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19HUElPMV8yMgkJSU9NVVhfUEFEKDB4NjMwLCAweDI0MCwgMywgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUMV9EVFIJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfUlhEX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDYzMCwgMHgyNDAsIDEsIDB4OWY0LCA0LCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VBUlQzX1RYRF9fQ1NJMV9EMQkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX0dQSU8xXzIzCQlJT01VWF9QQUQoMHg2MzQsIDB4MjQ0LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VQVJUM19UWERfX1VBUlQxX0RTUgkJSU9NVVhfUEFEKDB4NjM0LCAweDI0NCwgMCwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVUFSVDNfVFhEX19VQVJUM19UWEQJCUlPTVVYX1BBRCgweDYzNCwgMHgyNDQsIDEsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX09XSVJFX0xJTkVfX0dQSU8xXzI0CQlJT01VWF9QQUQoMHg2MzgsIDB4MjQ4LCAzLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9PV0lSRV9MSU5FX19PV0lSRV9MSU5FCQlJT01VWF9QQUQoMHg2MzgsIDB4MjQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX09XSVJFX0xJTkVfX1NQRElGX09VVAkJSU9NVVhfUEFEKDB4NjM4LCAweDI0OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XMF9fS0VZX1JPVzAJCUlPTVVYX1BBRCgweDYzYywgMHgyNGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX1JPVzFfX0tFWV9ST1cxCQlJT01VWF9QQUQoMHg2NDAsIDB4MjUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9ST1cyX19LRVlfUk9XMgkJSU9NVVhfUEFEKDB4NjQ0LCAweDI1NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfUk9XM19fS0VZX1JPVzMJCUlPTVVYX1BBRCgweDY0OCwgMHgyNTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDBfX0tFWV9DT0wwCQlJT01VWF9QQUQoMHg2NGMsIDB4MjVjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wwX19QTEwxX0JZUAkJSU9NVVhfUEFEKDB4NjRjLCAweDI1YywgNywgMHg5MGMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMV9fS0VZX0NPTDEJCUlPTVVYX1BBRCgweDY1MCwgMHgyNjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDFfX1BMTDJfQllQCQlJT01VWF9QQUQoMHg2NTAsIDB4MjYwLCA3LCAweDkxMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0wyX19LRVlfQ09MMgkJSU9NVVhfUEFEKDB4NjU0LCAweDI2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MMl9fUExMM19CWVAJCUlPTVVYX1BBRCgweDY1NCwgMHgyNjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDNfX0tFWV9DT0wzCQlJT01VWF9QQUQoMHg2NTgsIDB4MjY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w0X19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4NjVjLCAweDI2YywgMHgxMywgMHg5YjgsIDEsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fS0VZX0NPTDQJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX1NQRElGX09VVDEJCUlPTVVYX1BBRCgweDY1YywgMHgyNmMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDRfX1VBUlQxX1JJCQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCAxLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNF9fVUFSVDNfUlRTCQlJT01VWF9QQUQoMHg2NWMsIDB4MjZjLCAyLCAweDlmMCwgNCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9LRVlfQ09MNV9fSTJDMl9TREEJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDB4MTMsIDB4OWJjLCAxLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfS0VZX0NPTDVfX0tFWV9DT0w1CQlJT01VWF9QQUQoMHg2NjAsIDB4MjcwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19VQVJUMV9EQ0QJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDEsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0tFWV9DT0w1X19VQVJUM19DVFMJCUlPTVVYX1BBRCgweDY2MCwgMHgyNzAsIDIsIF9fTkFfLCAwLCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0NMS19fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg2NzgsIDB4Mjc4LCAxLCAweDkxNCwgMSwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19HUElPMV8yNQkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfQ0xLX19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMHgxNSwgMHg5YjgsIDIsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9DTEtfX1VTQkgxX0NMSwkJSU9NVVhfUEFEKDB4Njc4LCAweDI3OCwgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RJUl9fQ1NQSV9NT1NJCQlJT01VWF9QQUQoMHg2N2MsIDB4MjdjLCAxLCAweDkxYywgMSwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19HUElPMV8yNgkJSU9NVVhfUEFEKDB4NjdjLCAweDI3YywgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfRElSX19JMkMyX1NEQQkJSU9NVVhfUEFEKDB4NjdjLCAweDI3YywgMHgxNSwgMHg5YmMsIDIsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9ESVJfX1VTQkgxX0RJUgkJSU9NVVhfUEFEKDB4NjdjLCAweDI3YywgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX1NUUF9fQ1NQSV9SRFkJCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIDEsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX0dQSU8xXzI3CQlJT01VWF9QQUQoMHg2ODAsIDB4MjgwLCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9TVFBfX1VBUlQzX1JYRAkJSU9NVVhfUEFEKDB4NjgwLCAweDI4MCwgNSwgMHg5ZjQsIDYsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfU1RQX19VU0JIMV9TVFAJCUlPTVVYX1BBRCgweDY4MCwgMHgyODAsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX0NTUElfTUlTTwkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgMSwgMHg5MTgsIDAsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fR1BJTzFfMjgJCUlPTVVYX1BBRCgweDY4NCwgMHgyODQsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX05YVF9fVUFSVDNfVFhECQlJT01VWF9QQUQoMHg2ODQsIDB4Mjg0LCA1LCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9OWFRfX1VTQkgxX05YVAkJSU9NVVhfUEFEKDB4Njg0LCAweDI4NCwgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEwX19HUElPMV8xMQkJSU9NVVhfUEFEKDB4Njg4LCAweDI4OCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTBfX1VBUlQyX0NUUwkJSU9NVVhfUEFEKDB4Njg4LCAweDI4OCwgMSwgX19OQV8sIDAsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTBfX1VTQkgxX0RBVEEwCUlPTVVYX1BBRCgweDY4OCwgMHgyODgsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMV9fR1BJTzFfMTIJCUlPTVVYX1BBRCgweDY4YywgMHgyOGMsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEExX19VQVJUMl9SWEQJCUlPTVVYX1BBRCgweDY4YywgMHgyOGMsIDEsIDB4OWVjLCA0LCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEExX19VU0JIMV9EQVRBMQlJT01VWF9QQUQoMHg2OGMsIDB4MjhjLCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTJfX0dQSU8xXzEzCQlJT01VWF9QQUQoMHg2OTAsIDB4MjkwLCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMl9fVUFSVDJfVFhECQlJT01VWF9QQUQoMHg2OTAsIDB4MjkwLCAxLCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBMl9fVVNCSDFfREFUQTIJSU9NVVhfUEFEKDB4NjkwLCAweDI5MCwgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEEzX19HUElPMV8xNAkJSU9NVVhfUEFEKDB4Njk0LCAweDI5NCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTNfX1VBUlQyX1JUUwkJSU9NVVhfUEFEKDB4Njk0LCAweDI5NCwgMSwgMHg5ZTgsIDUsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTNfX1VTQkgxX0RBVEEzCUlPTVVYX1BBRCgweDY5NCwgMHgyOTQsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fQ1NQSV9TUzAJCUlPTVVYX1BBRCgweDY5OCwgMHgyOTgsIDEsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNF9fR1BJTzFfMTUJCUlPTVVYX1BBRCgweDY5OCwgMHgyOTgsIDIsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE0X19VU0JIMV9EQVRBNAlJT01VWF9QQUQoMHg2OTgsIDB4Mjk4LCAwLCBfX05BXywgMCwgTVg1MV9VU0JIMV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX0NTUElfU1MxCQlJT01VWF9QQUQoMHg2OWMsIDB4MjljLCAxLCAweDkyMCwgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTVfX0dQSU8xXzE2CQlJT01VWF9QQUQoMHg2OWMsIDB4MjljLCAyLCBfX05BXywgMCwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBNV9fVVNCSDFfREFUQTUJSU9NVVhfUEFEKDB4NjljLCAweDI5YywgMCwgX19OQV8sIDAsIE1YNTFfVVNCSDFfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19DU1BJX1NTMwkJSU9NVVhfUEFEKDB4NmEwLCAweDJhMCwgMSwgMHg5MjgsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE2X19HUElPMV8xNwkJSU9NVVhfUEFEKDB4NmEwLCAweDJhMCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTZfX1VTQkgxX0RBVEE2CUlPTVVYX1BBRCgweDZhMCwgMHgyYTAsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9VU0JIMV9EQVRBN19fRUNTUEkxX1NTMwlJT01VWF9QQUQoMHg2YTQsIDB4MmE0LCAxLCBfX05BXywgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTdfX0VDU1BJMl9TUzMJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgNSwgMHg5MzQsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1VTQkgxX0RBVEE3X19HUElPMV8xOAkJSU9NVVhfUEFEKDB4NmE0LCAweDJhNCwgMiwgX19OQV8sIDAsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfVVNCSDFfREFUQTdfX1VTQkgxX0RBVEE3CUlPTVVYX1BBRCgweDZhNCwgMHgyYTQsIDAsIF9fTkFfLCAwLCBNWDUxX1VTQkgxX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0RJMV9QSU4xMQkJSU9NVVhfUEFEKDB4NmE4LCAweDJhOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0VDU1BJMV9TUzIJCUlPTVVYX1BBRCgweDZhOCwgMHgyYTgsIDcsIF9fTkFfLCAwLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMTFfX0dQSU8zXzAJCUlPTVVYX1BBRCgweDZhOCwgMHgyYTgsIDQsIF9fTkFfLCAwLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xMl9fREkxX1BJTjEyCQlJT01VWF9QQUQoMHg2YWMsIDB4MmFjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4xMl9fR1BJTzNfMQkJSU9NVVhfUEFEKDB4NmFjLCAweDJhYywgNCwgMHg5NzgsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjEzX19ESTFfUElOMTMJCUlPTVVYX1BBRCgweDZiMCwgMHgyYjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX1BJTjEzX19HUElPM18yCQlJT01VWF9QQUQoMHg2YjAsIDB4MmIwLCA0LCAweDk3YywgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDBfQ1NfX0RJMV9EMF9DUwkJSU9NVVhfUEFEKDB4NmI0LCAweDJiNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfRDBfQ1NfX0dQSU8zXzMJCUlPTVVYX1BBRCgweDZiNCwgMHgyYjQsIDQsIDB4OTgwLCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fREkxX0QxX0NTCQlJT01VWF9QQUQoMHg2YjgsIDB4MmI4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fRElTUDFfUElOMTQJCUlPTVVYX1BBRCgweDZiOCwgMHgyYjgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkxX0QxX0NTX19ESVNQMV9QSU41CQlJT01VWF9QQUQoMHg2YjgsIDB4MmI4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9EMV9DU19fR1BJTzNfNAkJSU9NVVhfUEFEKDB4NmI4LCAweDJiOCwgNCwgMHg5ODQsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9ESU5fX0RJU1AxX1BJTjEJSU9NVVhfUEFEKDB4NmJjLCAweDJiYywgMiwgMHg5YTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fRElTUEIyX1NFUl9ESU4JSU9NVVhfUEFEKDB4NmJjLCAweDJiYywgMCwgMHg5YzQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJTl9fR1BJTzNfNQlJT01VWF9QQUQoMHg2YmMsIDB4MmJjLCA0LCAweDk4OCwgMSwgTVg1MV9HUElPX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX0RJT19fRElTUDFfUElONglJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19ESVNQQjJfU0VSX0RJTwlJT01VWF9QQUQoMHg2YzAsIDB4MmMwLCAwLCAweDljNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfRElPX19HUElPM182CUlPTVVYX1BBRCgweDZjMCwgMHgyYzAsIDQsIDB4OThjLCAxLCBNWDUxX0dQSU9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQMV9QSU4xNwlJT01VWF9QQUQoMHg2YzQsIDB4MmM0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfQ0xLX19ESVNQMV9QSU43CUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0RJU1BCMl9TRVJfQ0xLCUlPTVVYX1BBRCgweDZjNCwgMHgyYzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9DTEtfX0dQSU8zXzcJSU9NVVhfUEFEKDB4NmM0LCAweDJjNCwgNCwgMHg5OTAsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfRVhUX0NMSwlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1AxX1BJTjE2CUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fRElTUDFfUElOOAlJT01VWF9QQUQoMHg2YzgsIDB4MmM4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1BCMl9TRVJfUlNfX0RJU1BCMl9TRVJfUlMJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQQjJfU0VSX1JTX19ESVNQQjJfU0VSX1JTCUlPTVVYX1BBRCgweDZjOCwgMHgyYzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUEIyX1NFUl9SU19fR1BJTzNfOAkJSU9NVVhfUEFEKDB4NmM4LCAweDJjOCwgNCwgMHg5OTQsIDEsIE1YNTFfR1BJT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMF9fRElTUDFfREFUMAkJSU9NVVhfUEFEKDB4NmNjLCAweDJjYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxX19ESVNQMV9EQVQxCQlJT01VWF9QQUQoMHg2ZDAsIDB4MmQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDJfX0RJU1AxX0RBVDIJCUlPTVVYX1BBRCgweDZkNCwgMHgyZDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUM19fRElTUDFfREFUMwkJSU9NVVhfUEFEKDB4NmQ4LCAweDJkOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ0X19ESVNQMV9EQVQ0CQlJT01VWF9QQUQoMHg2ZGMsIDB4MmRjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDVfX0RJU1AxX0RBVDUJCUlPTVVYX1BBRCgweDZlMCwgMHgyZTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNl9fQk9PVF9VU0JfU1JDCUlPTVVYX1BBRCgweDZlNCwgMHgyZTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUNl9fRElTUDFfREFUNgkJSU9NVVhfUEFEKDB4NmU0LCAweDJlNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ3X19CT09UX0VFUFJPTV9DRkcJSU9NVVhfUEFEKDB4NmU4LCAweDJlOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ3X19ESVNQMV9EQVQ3CQlJT01VWF9QQUQoMHg2ZTgsIDB4MmU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDhfX0JPT1RfU1JDMAkJSU9NVVhfUEFEKDB4NmVjLCAweDJlYywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ4X19ESVNQMV9EQVQ4CQlJT01VWF9QQUQoMHg2ZWMsIDB4MmVjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDlfX0JPT1RfU1JDMQkJSU9NVVhfUEFEKDB4NmYwLCAweDJmMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQ5X19ESVNQMV9EQVQ5CQlJT01VWF9QQUQoMHg2ZjAsIDB4MmYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDEwX19CT09UX1NQQVJFX1NJWkUJSU9NVVhfUEFEKDB4NmY0LCAweDJmNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMF9fRElTUDFfREFUMTAJSU9NVVhfUEFEKDB4NmY0LCAweDJmNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMV9fQk9PVF9MUEJfRlJFUTIJSU9NVVhfUEFEKDB4NmY4LCAweDJmOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMV9fRElTUDFfREFUMTEJSU9NVVhfUEFEKDB4NmY4LCAweDJmOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxMl9fQk9PVF9NTENfU0VMCUlPTVVYX1BBRCgweDZmYywgMHgyZmMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTJfX0RJU1AxX0RBVDEyCUlPTVVYX1BBRCgweDZmYywgMHgyZmMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTNfX0JPT1RfTUVNX0NUTDAJSU9NVVhfUEFEKDB4NzAwLCAweDMwMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxM19fRElTUDFfREFUMTMJSU9NVVhfUEFEKDB4NzAwLCAweDMwMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNF9fQk9PVF9NRU1fQ1RMMQlJT01VWF9QQUQoMHg3MDQsIDB4MzA0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE0X19ESVNQMV9EQVQxNAlJT01VWF9QQUQoMHg3MDQsIDB4MzA0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE1X19CT09UX0JVU19XSURUSAlJT01VWF9QQUQoMHg3MDgsIDB4MzA4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE1X19ESVNQMV9EQVQxNQlJT01VWF9QQUQoMHg3MDgsIDB4MzA4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE2X19CT09UX1BBR0VfU0laRTAJSU9NVVhfUEFEKDB4NzBjLCAweDMwYywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxNl9fRElTUDFfREFUMTYJSU9NVVhfUEFEKDB4NzBjLCAweDMwYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxN19fQk9PVF9QQUdFX1NJWkUxCUlPTVVYX1BBRCgweDcxMCwgMHgzMTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTdfX0RJU1AxX0RBVDE3CUlPTVVYX1BBRCgweDcxMCwgMHgzMTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMThfX0JPT1RfV0VJTV9NVVhFRDAJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDFfREFUMTgJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElOMTEJSU9NVVhfUEFEKDB4NzE0LCAweDMxNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQxOF9fRElTUDJfUElONQlJT01VWF9QQUQoMHg3MTQsIDB4MzE0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDE5X19CT09UX1dFSU1fTVVYRUQxCUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AxX0RBVDE5CUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjEyCUlPTVVYX1BBRCgweDcxOCwgMHgzMTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMTlfX0RJU1AyX1BJTjYJSU9NVVhfUEFEKDB4NzE4LCAweDMxOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fQk9PVF9NRU1fVFlQRTAJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDFfREFUMjAJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElOMTMJSU9NVVhfUEFEKDB4NzFjLCAweDMxYywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMV9EQVQyMF9fRElTUDJfUElONwlJT01VWF9QQUQoMHg3MWMsIDB4MzFjLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIxX19CT09UX01FTV9UWVBFMQlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMV9EQVQyMQlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMl9QSU4xNAlJT01VWF9QQUQoMHg3MjAsIDB4MzIwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AxX0RBVDIxX19ESVNQMl9QSU44CUlPTVVYX1BBRCgweDcyMCwgMHgzMjAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0JPT1RfTFBCX0ZSRVEwCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AxX0RBVDIyCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0QwX0NTCUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjJfX0RJU1AyX0RBVDE2CUlPTVVYX1BBRCgweDcyNCwgMHgzMjQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0JPT1RfTFBCX0ZSRVExCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AxX0RBVDIzCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0QxX0NTCUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX0RBVDE3CUlPTVVYX1BBRCgweDcyOCwgMHgzMjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDFfREFUMjNfX0RJU1AyX1NFUl9DUwlJT01VWF9QQUQoMHg3MjgsIDB4MzI4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMV9QSU4zX19ESTFfUElOMwkJSU9NVVhfUEFEKDB4NzJjLCAweDMyYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTFfUElOMl9fREkxX1BJTjIJCUlPTVVYX1BBRCgweDczNCwgMHgzMzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1AyX19ESVNQMV9TRVJfQ0xLCQlJT01VWF9QQUQoMHg3NDAsIDB4MzM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQMl9fRElTUDJfV0FJVAkJSU9NVVhfUEFEKDB4NzQwLCAweDMzOCwgMiwgMHg5YTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDNfX0NTSTFfREFUQV9FTgkJSU9NVVhfUEFEKDB4NzQ0LCAweDMzYywgMywgMHg5YTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDNfX0RJU1AxX1NFUl9ESU8JCUlPTVVYX1BBRCgweDc0NCwgMHgzM2MsIDAsIDB4OWMwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1AzX19GRUNfVFhfRVIJCUlPTVVYX1BBRCgweDc0NCwgMHgzM2MsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19DU0kyX0RBVEFfRU4JCUlPTVVYX1BBRCgweDc0OCwgMHgzNDAsIDMsIDB4OTljLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjRfX0RJMl9QSU40CQlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU40X19GRUNfQ1JTCQlJT01VWF9QQUQoMHg3NDgsIDB4MzQwLCAyLCAweDk1MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4yX19ESTJfUElOMgkJSU9NVVhfUEFEKDB4NzRjLCAweDM0NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfUElOMl9fRkVDX01EQwkJSU9NVVhfUEFEKDB4NzRjLCAweDM0NCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfREkyX1BJTjNfX0RJMl9QSU4zCQlJT01VWF9QQUQoMHg3NTAsIDB4MzQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9QSU4zX19GRUNfTURJTwkJSU9NVVhfUEFEKDB4NzUwLCAweDM0OCwgMiwgMHg5NTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESTJfRElTUF9DTEtfX0RJMl9ESVNQX0NMSwlJT01VWF9QQUQoMHg3NTQsIDB4MzRjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJMl9ESVNQX0NMS19fRkVDX1JEQVRBMQlJT01VWF9QQUQoMHg3NTQsIDB4MzRjLCAyLCAweDk1YywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fREkyX1BJTjE1CQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJX0dQNF9fRElTUDFfU0VSX0RJTgkJSU9NVVhfUEFEKDB4NzU4LCAweDM1MCwgMCwgMHg5YzAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESV9HUDRfX0RJU1AyX1BJTjEJCUlPTVVYX1BBRCgweDc1OCwgMHgzNTAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElfR1A0X19GRUNfUkRBVEEyCQlJT01VWF9QQUQoMHg3NTgsIDB4MzUwLCAyLCAweDk2MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX0RJU1AyX0RBVDAJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMF9fRkVDX1JEQVRBMwkJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgMiwgMHg5NjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19LRVlfQ09MNgkJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgNCwgMHg5YzgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQwX19VQVJUM19SWEQJCUlPTVVYX1BBRCgweDc1YywgMHgzNTQsIDUsIDB4OWY0LCA4LCBNWDUxX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDBfX1VTQkgzX0NMSwkJSU9NVVhfUEFEKDB4NzVjLCAweDM1NCwgMywgMHg5ZjgsIDEsIE1YNTFfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fRElTUDJfREFUMQkJSU9NVVhfUEFEKDB4NzYwLCAweDM1OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxX19GRUNfUlhfRVIJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDIsIDB4OTcwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fS0VZX0NPTDcJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDQsIDB4OWNjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMV9fVUFSVDNfVFhECQlJT01VWF9QQUQoMHg3NjAsIDB4MzU4LCA1LCBfX05BXywgMCwgTVg1MV9VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxX19VU0JIM19ESVIJCUlPTVVYX1BBRCgweDc2MCwgMHgzNTgsIDMsIDB4YTFjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMl9fRElTUDJfREFUMgkJSU9NVVhfUEFEKDB4NzY0LCAweDM1YywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQzX19ESVNQMl9EQVQzCQlJT01VWF9QQUQoMHg3NjgsIDB4MzYwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDRfX0RJU1AyX0RBVDQJCUlPTVVYX1BBRCgweDc2YywgMHgzNjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUNV9fRElTUDJfREFUNQkJSU9NVVhfUEFEKDB4NzcwLCAweDM2OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ2X19ESVNQMl9EQVQ2CQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0ZFQ19UREFUQTEJCUlPTVVYX1BBRCgweDc3NCwgMHgzNmMsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0dQSU8xXzE5CQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX0tFWV9ST1c0CQlJT01VWF9QQUQoMHg3NzQsIDB4MzZjLCA0LCAweDlkMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDZfX1VTQkgzX1NUUAkJSU9NVVhfUEFEKDB4Nzc0LCAweDM2YywgMywgMHhhMjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ3X19ESVNQMl9EQVQ3CQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0ZFQ19UREFUQTIJCUlPTVVYX1BBRCgweDc3OCwgMHgzNzAsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0dQSU8xXzI5CQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX0tFWV9ST1c1CQlJT01VWF9QQUQoMHg3NzgsIDB4MzcwLCA0LCAweDlkNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDdfX1VTQkgzX05YVAkJSU9NVVhfUEFEKDB4Nzc4LCAweDM3MCwgMywgMHhhMjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ4X19ESVNQMl9EQVQ4CQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0ZFQ19UREFUQTMJCUlPTVVYX1BBRCgweDc3YywgMHgzNzQsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0dQSU8xXzMwCQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX0tFWV9ST1c2CQlJT01VWF9QQUQoMHg3N2MsIDB4Mzc0LCA0LCAweDlkOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDhfX1VTQkgzX0RBVEEwCUlPTVVYX1BBRCgweDc3YywgMHgzNzQsIDMsIDB4OWZjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fQVVENl9SWEMJCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDQsIDB4OGY0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUOV9fRElTUDJfREFUOQkJSU9NVVhfUEFEKDB4NzgwLCAweDM3OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQ5X19GRUNfVFhfRU4JCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDIsIF9fTkFfLCAwLCBNWDUxX1BBRF9DVFJMXzUpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX0dQSU8xXzMxCQlJT01VWF9QQUQoMHg3ODAsIDB4Mzc4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDlfX1VTQkgzX0RBVEExCUlPTVVYX1BBRCgweDc4MCwgMHgzNzgsIDMsIDB4YTAwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX0RJU1AyX0RBVDEwCUlPTVVYX1BBRCgweDc4NCwgMHgzN2MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTBfX0RJU1AyX1NFUl9DUwlJT01VWF9QQUQoMHg3ODQsIDB4MzdjLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19GRUNfQ09MCQlJT01VWF9QQUQoMHg3ODQsIDB4MzdjLCAyLCAweDk0YywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEwX19LRVlfUk9XNwkJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgNCwgMHg5ZGMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMF9fVVNCSDNfREFUQTIJSU9NVVhfUEFEKDB4Nzg0LCAweDM3YywgMywgMHhhMDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fQVVENl9UWEQJCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDQsIDB4OGYwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0RJU1AyX0RBVDExCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX0ZFQ19SWF9DTEsJSU9NVVhfUEFEKDB4Nzg4LCAweDM4MCwgMiwgMHg5NjgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxMV9fR1BJTzFfMTAJCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTFfX1VTQkgzX0RBVEEzCUlPTVVYX1BBRCgweDc4OCwgMHgzODAsIDMsIDB4YTA4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTJfX0FVRDZfUlhECQlJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCA0LCAweDhlYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19ESVNQMl9EQVQxMglJT01VWF9QQUQoMHg3OGMsIDB4Mzg0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEyX19GRUNfUlhfRFYJCUlPTVVYX1BBRCgweDc4YywgMHgzODQsIDIsIDB4OTZjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTJfX1VTQkgzX0RBVEE0CUlPTVVYX1BBRCgweDc4YywgMHgzODQsIDMsIDB4YTBjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTNfX0FVRDZfVFhDCQlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCA0LCAweDhmYywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19ESVNQMl9EQVQxMwlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19GRUNfVFhfQ0xLCUlPTVVYX1BBRCgweDc5MCwgMHgzODgsIDIsIDB4OTc0LCAxLCBNWDUxX1BBRF9DVFJMXzQpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDEzX19VU0JIM19EQVRBNQlJT01VWF9QQUQoMHg3OTAsIDB4Mzg4LCAzLCAweGExMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0RJU1AyX0RBVDE0X19BVUQ2X1RYRlMJCUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDQsIDB4OTAwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTRfX0RJU1AyX0RBVDE0CUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTRfX0ZFQ19SREFUQTAJSU9NVVhfUEFEKDB4Nzk0LCAweDM4YywgMiwgMHg5NTgsIDEsIE1YNTFfUEFEX0NUUkxfNCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTRfX1VTQkgzX0RBVEE2CUlPTVVYX1BBRCgweDc5NCwgMHgzOGMsIDMsIDB4YTE0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0FVRDZfUlhGUwkJSU9NVVhfUEFEKDB4Nzk4LCAweDM5MCwgNCwgMHg4ZjgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9ESVNQMl9EQVQxNV9fRElTUDFfU0VSX0NTCUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0RJU1AyX0RBVDE1CUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX0ZFQ19UREFUQTAJSU9NVVhfUEFEKDB4Nzk4LCAweDM5MCwgMiwgX19OQV8sIDAsIE1YNTFfUEFEX0NUUkxfNSkKKyNkZWZpbmUgTVg1MV9QQURfRElTUDJfREFUMTVfX1VTQkgzX0RBVEE3CUlPTVVYX1BBRCgweDc5OCwgMHgzOTAsIDMsIDB4YTE4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0NNRF9fQVVENV9SWEZTCQlJT01VWF9QQUQoMHg3OWMsIDB4Mzk0LCAxLCAweDhlMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DTURfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4NzljLCAweDM5NCwgMiwgMHg5MWMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfQ01EX19TRDFfQ01ECQlJT01VWF9QQUQoMHg3OWMsIDB4Mzk0LCAweDEwLCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0NMS19fQVVENV9SWEMJCUlPTVVYX1BBRCgweDdhMCwgMHgzOTgsIDEsIDB4OGRjLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0NMS19fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg3YTAsIDB4Mzk4LCAyLCAweDkxNCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9DTEtfX1NEMV9DTEsJCUlPTVVYX1BBRCgweDdhMCwgMHgzOTgsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMIHwgUEFEX0NUTF9IWVMpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBMF9fQVVENV9UWEQJCUlPTVVYX1BBRCgweDdhNCwgMHgzOWMsIDEsIDB4OGQ4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEwX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDdhNCwgMHgzOWMsIDIsIDB4OTE4LCAxLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTBfX1NEMV9EQVRBMAkJSU9NVVhfUEFEKDB4N2E0LCAweDM5YywgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTBfX0VJTV9EQTAJCUlPTVVYX1BBRChfX05BXywgMHgwMWMsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMV9fRUlNX0RBMQkJSU9NVVhfUEFEKF9fTkFfLCAweDAyMCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREEyX19FSU1fREEyCQlJT01VWF9QQUQoX19OQV8sIDB4MDI0LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTNfX0VJTV9EQTMJCUlPTVVYX1BBRChfX05BXywgMHgwMjgsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEExX19BVUQ1X1JYRAkJSU9NVVhfUEFEKDB4N2E4LCAweDNhMCwgMSwgMHg4ZDQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTFfX1NEMV9EQVRBMQkJSU9NVVhfUEFEKDB4N2E4LCAweDNhMCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTRfX0VJTV9EQTQJCUlPTVVYX1BBRChfX05BXywgMHgwMmMsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBNV9fRUlNX0RBNQkJSU9NVVhfUEFEKF9fTkFfLCAweDAzMCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE2X19FSU1fREE2CQlJT01VWF9QQUQoX19OQV8sIDB4MDM0LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTdfX0VJTV9EQTcJCUlPTVVYX1BBRChfX05BXywgMHgwMzgsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QxX0RBVEEyX19BVUQ1X1RYQwkJSU9NVVhfUEFEKDB4N2FjLCAweDNhNCwgMSwgMHg4ZTQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTJfX1NEMV9EQVRBMgkJSU9NVVhfUEFEKDB4N2FjLCAweDNhNCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEwX19FSU1fREExMAkJSU9NVVhfUEFEKF9fTkFfLCAweDA0NCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExMV9fRUlNX0RBMTEJCUlPTVVYX1BBRChfX05BXywgMHgwNDgsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBOF9fRUlNX0RBOAkJSU9NVVhfUEFEKF9fTkFfLCAweDAzYywgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREE5X19FSU1fREE5CQlJT01VWF9QQUQoX19OQV8sIDB4MDQwLCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBM19fQVVENV9UWEZTCQlJT01VWF9QQUQoMHg3YjAsIDB4M2E4LCAxLCAweDhlOCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMV9EQVRBM19fQ1NQSV9TUzEJCUlPTVVYX1BBRCgweDdiMCwgMHgzYTgsIDIsIDB4OTIwLCAxLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDFfREFUQTNfX1NEMV9EQVRBMwkJSU9NVVhfUEFEKDB4N2IwLCAweDNhOCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzBfX0NTUElfU1MyCQlJT01VWF9QQUQoMHg3YjQsIDB4M2FjLCAyLCAweDkyNCwgMCwgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMF9fR1BJTzFfMAkJSU9NVVhfUEFEKDB4N2I0LCAweDNhYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QJCUlPTVVYX1BBRCgweDdiNCwgMHgzYWMsIDAsIF9fTkFfLCAwLCBNWDUxX0VTREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8xX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDdiOCwgMHgzYjAsIDIsIDB4OTE4LCAyLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8xX19HUElPMV8xCQlJT01VWF9QQUQoMHg3YjgsIDB4M2IwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzFfX1NEMV9XUAkJSU9NVVhfUEFEKDB4N2I4LCAweDNiMCwgMCwgX19OQV8sIDAsIE1YNTFfRVNESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTEyX19FSU1fREExMgkJSU9NVVhfUEFEKF9fTkFfLCAweDA0YywgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9FSU1fREExM19fRUlNX0RBMTMJCUlPTVVYX1BBRChfX05BXywgMHgwNTAsIDAsIDB4MDAwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfRUlNX0RBMTRfX0VJTV9EQTE0CQlJT01VWF9QQUQoX19OQV8sIDB4MDU0LCAwLCAweDAwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0VJTV9EQTE1X19FSU1fREExNQkJSU9NVVhfUEFEKF9fTkFfLCAweDA1OCwgMCwgMHgwMDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRChfX05BXywgMHgzYjQsIDIsIDB4OTFjLCAzLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfQ01EX19JMkMxX1NDTAkJSU9NVVhfUEFEKDB4N2JjLCAweDNiNCwgMHgxMSwgMHg5YjAsIDIsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfQ01EX19TRDJfQ01ECQlJT01VWF9QQUQoMHg3YmMsIDB4M2I0LCAweDEwLCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NMS19fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg3YzAsIDB4M2I4LCAyLCAweDkxNCwgMywgTVg1MV9FQ1NQSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NMS19fSTJDMV9TREEJCUlPTVVYX1BBRCgweDdjMCwgMHgzYjgsIDB4MTEsIDB4OWI0LCAyLCBNWDUxX0kyQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0NMS19fU0QyX0NMSwkJSU9NVVhfUEFEKDB4N2MwLCAweDNiOCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwgfCBQQURfQ1RMX0hZUykKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEwX19DU1BJX01JU08JCUlPTVVYX1BBRCgweDdjNCwgMHgzYmMsIDIsIDB4OTE4LCAzLCBNWDUxX0VDU1BJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTBfX1NEMV9EQVQ0CQlJT01VWF9QQUQoMHg3YzQsIDB4M2JjLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMF9fU0QyX0RBVEEwCQlJT01VWF9QQUQoMHg3YzQsIDB4M2JjLCAweDEwLCBfX05BXywgMCwgTVg1MV9TREhDSV9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEExX19TRDFfREFUNQkJSU9NVVhfUEFEKDB4N2M4LCAweDNjMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTFfX1NEMl9EQVRBMQkJSU9NVVhfUEFEKDB4N2M4LCAweDNjMCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMV9fVVNCSDNfSDJfRFAJCUlPTVVYX1BBRCgweDdjOCwgMHgzYzAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEyX19TRDFfREFUNgkJSU9NVVhfUEFEKDB4N2NjLCAweDNjNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9TRDJfREFUQTJfX1NEMl9EQVRBMgkJSU9NVVhfUEFEKDB4N2NjLCAweDNjNCwgMHgxMCwgX19OQV8sIDAsIE1YNTFfU0RIQ0lfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBMl9fVVNCSDNfSDJfRE0JCUlPTVVYX1BBRCgweDdjYywgMHgzYzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEzX19DU1BJX1NTMgkJSU9NVVhfUEFEKDB4N2QwLCAweDNjOCwgMiwgMHg5MjQsIDEsIE1YNTFfRUNTUElfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX1NEMl9EQVRBM19fU0QxX0RBVDcJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfU0QyX0RBVEEzX19TRDJfREFUQTMJCUlPTVVYX1BBRCgweDdkMCwgMHgzYzgsIDB4MTAsIF9fTkFfLCAwLCBNWDUxX1NESENJX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19DQ01fT1VUXzIJCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfMl9fR1BJTzFfMgkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19JMkMyX1NDTAkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgMHgxMiwgMHg5YjgsIDMsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19QTEwxX0JZUAkJSU9NVVhfUEFEKDB4N2Q0LCAweDNjYywgNywgMHg5MGMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8yX19QV00xX1BXTU8JCUlPTVVYX1BBRCgweDdkNCwgMHgzY2MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfM19fR1BJTzFfMwkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8zX19JMkMyX1NEQQkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgMHgxMiwgMHg5YmMsIDMsIE1YNTFfSTJDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8zX19QTEwyX0JZUAkJSU9NVVhfUEFEKDB4N2Q4LCAweDNkMCwgNywgMHg5MTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV8zX19QV00yX1BXTU8JCUlPTVVYX1BBRCgweDdkOCwgMHgzZDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfUE1JQ19JTlRfUkVRX19QTUlDX0lOVF9SRVEJSU9NVVhfUEFEKDB4N2ZjLCAweDNkNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9QTUlDX0lOVF9SRVFfX1BNSUNfUE1VX0lSUV9CCUlPTVVYX1BBRCgweDdmYywgMHgzZDQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fRElTUDJfRVhUX0NMSwkJSU9NVVhfUEFEKDB4ODA0LCAweDNkOCwgNCwgMHg5MDgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV80X19FSU1fUkRZCQlJT01VWF9QQUQoMHg4MDQsIDB4M2Q4LCAzLCAweDkzOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzRfX0dQSU8xXzQJCUlPTVVYX1BBRCgweDgwNCwgMHgzZDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfNF9fV0RPRzFfV0RPR19CCQlJT01VWF9QQUQoMHg4MDQsIDB4M2Q4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX0NTSTJfTUNMSwkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV81X19ESVNQMl9QSU4xNgkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV81X19HUElPMV81CQlJT01VWF9QQUQoMHg4MDgsIDB4M2RjLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzVfX1dET0cyX1dET0dfQgkJSU9NVVhfUEFEKDB4ODA4LCAweDNkYywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV82X19ESVNQMl9QSU4xNwkJSU9NVVhfUEFEKDB4ODBjLCAweDNlMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV82X19HUElPMV82CQlJT01VWF9QQUQoMHg4MGMsIDB4M2UwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzZfX1JFRl9FTl9CCQlJT01VWF9QQUQoMHg4MGMsIDB4M2UwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX0NDTV9PVVRfMAkJSU9NVVhfUEFEKDB4ODEwLCAweDNlNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV83X19HUElPMV83CQlJT01VWF9QQUQoMHg4MTAsIDB4M2U0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX1NEMl9XUAkJSU9NVVhfUEFEKDB4ODEwLCAweDNlNCwgNiwgX19OQV8sIDAsIE1YNTFfRVNESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzdfX1NQRElGX09VVDEJCUlPTVVYX1BBRCgweDgxMCwgMHgzZTQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOF9fQ1NJMl9EQVRBX0VOCQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCAyLCAweDk5YywgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzhfX0dQSU8xXzgJCUlPTVVYX1BBRCgweDgxNCwgMHgzZTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOF9fU0QyX0NECQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCA2LCBfX05BXywgMCwgTVg1MV9FU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOF9fVVNCSDNfUFdSCQlJT01VWF9QQUQoMHg4MTQsIDB4M2U4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTFfUEFEX0dQSU8xXzlfX0NDTV9PVVRfMQkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19ESVNQMl9EMV9DUwkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19ESVNQMl9TRVJfQ1MJCUlPTVVYX1BBRCgweDgxOCwgMHgzZWMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1MV9QQURfR1BJTzFfOV9fR1BJTzFfOQkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19TRDJfTENUTAkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUxX1BBRF9HUElPMV85X19VU0JIM19PQwkJSU9NVVhfUEFEKDB4ODE4LCAweDNlYywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQogCiAjZW5kaWYgLyogX19NQUNIX0lPTVVYX01YNTFfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1My5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LW14NTMuaAppbmRleCA1NDA4ZmQxLi41MjdmOGZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtbXg1My5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pb211eC1teDUzLmgKQEAgLTIzLDIzNTkgKzIzLDExOTcgQEAKIAogLyogVGhlc2UgMiBkZWZpbmVzIGFyZSBmb3IgcGlucyB0aGF0IG1heSBub3QgaGF2ZSBhIG11eCByZWdpc3RlciwgYnV0IGNvdWxkCiAgKiBoYXZlIGEgcGFkIHNldHRpbmcgcmVnaXN0ZXIsIGFuZCB2aWNlLXZlcnNhLiAqLwotI2RlZmluZSBOT05fUEFEX0kJMHgwMAorI2RlZmluZSBfX05BXwkweDAwCiAKICNkZWZpbmUgTVg1M19VQVJUX1BBRF9DVFJMCQkoUEFEX0NUTF9QS0UgfCBQQURfQ1RMX1BVRSB8CVwKIAkJUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfU1JFX0ZBU1QgfCBQQURfQ1RMX0hZUykKICNkZWZpbmUgTVg1M19TREhDX1BBRF9DVFJMIAkoUEFEX0NUTF9IWVMgfCBQQURfQ1RMX1BLRSB8IFBBRF9DVExfUFVFIHwgXAogCQkJCVBBRF9DVExfUFVTXzQ3S19VUCB8IFBBRF9DVExfRFNFX0hJR0ggfCBcCiAJCQkJUEFEX0NUTF9TUkVfRkFTVCkKLSNkZWZpbmUgUEFEX0NUUkxfSTJDCShQQURfQ1RMX1NSRV9GQVNUIHwgUEFEX0NUTF9PREUgfCBQQURfQ1RMX1BLRSB8IFwKLQkJCVBBRF9DVExfUFVFIHwgUEFEX0NUTF9EU0VfSElHSCB8IFBBRF9DVExfUFVTXzEwMEtfVVAgXAotCQkJfCBQQURfQ1RMX0hZUykKIAotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fS1BQX0NPTF81CQlJT01VWF9QQUQoMHgzNDgsIDB4MjAsIDAsIDB4ODQwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fR1BJTzRfNQkJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19DQ01fQ0xLTwkJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19TUERJRl9PVVQxCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fUlRDX0NFX1JUQ19FWFRfVFJJRzIJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19FQ1NQSTFfUkRZCUlPTVVYX1BBRCgweDM0OCwgMHgyMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOV9fRkVDX1REQVRBXzMJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE5X19TUkNfSU5UX0JPT1QJSU9NVVhfUEFEKDB4MzQ4LCAweDIwLDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19LUFBfQ09MXzAJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fR1BJTzRfNgkJSU9NVVhfUEFEKDB4MzRDLCAweDI0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fQVVETVVYX0FVRDVfVFhDCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgMiwgMHg3NTgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMF9fVUFSVDRfVFhEX01VWAlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wwX19FQ1NQSTFfU0NMSwlJT01VWF9QQUQoMHgzNEMsIDB4MjQsIDUsIDB4NzlDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX0ZFQ19SREFUQV8zCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDBfX1NSQ19BTllfUFVfUlNUCUlPTVVYX1BBRCgweDM0QywgMHgyNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzBfX0tQUF9ST1dfMAlJT01VWF9QQUQoMHgzNTAsIDB4MjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cwX19HUElPNF83CQlJT01VWF9QQUQoMHgzNTAsIDB4MjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cwX19BVURNVVhfQVVENV9UWEQJSU9NVVhfUEFEKDB4MzUwLCAweDI4LCAyLCAweDc0QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYCUlPTVVYX1BBRCgweDM1MCwgMHgyOCwgNCwgMHg4OTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMF9fRUNTUEkxX01PU0kJSU9NVVhfUEFEKDB4MzUwLCAweDI4LCA1LCAweDdBNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cwX19GRUNfVFhfRVIJSU9NVVhfUEFEKDB4MzUwLCAweDI4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMV9fS1BQX0NPTF8xCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0dQSU80XzgJCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0FVRE1VWF9BVUQ1X1RYRlMJSU9NVVhfUEFEKDB4MzU0LCAweDJDLCAyLCAweDc1QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wxX19VQVJUNV9UWERfTVVYCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX0VDU1BJMV9NSVNPCUlPTVVYX1BBRCgweDM1NCwgMHgyQywgNSwgMHg3QTAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMV9fRkVDX1JYX0NMSwlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDYsIDB4ODA4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDFfX1VTQlBIWTFfVFhSRUFEWQlJT01VWF9QQUQoMHgzNTQsIDB4MkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cxX19LUFBfUk9XXzEJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMV9fR1BJTzRfOQkJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMV9fQVVETVVYX0FVRDVfUlhECUlPTVVYX1BBRCgweDM1OCwgMHgzMCwgMiwgMHg3NDgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMV9fVUFSVDVfUlhEX01VWAlJT01VWF9QQUQoMHgzNTgsIDB4MzAsIDQsIDB4ODk4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzFfX0VDU1BJMV9TUzAJSU9NVVhfUEFEKDB4MzU4LCAweDMwLCA1LCAweDdBOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cxX19GRUNfQ09MCQlJT01VWF9QQUQoMHgzNTgsIDB4MzAsIDYsIDB4ODAwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzFfX1VTQlBIWTFfUlhWQUxJRAlJT01VWF9QQUQoMHgzNTgsIDB4MzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wyX19LUFBfQ09MXzIJSU9NVVhfUEFEKDB4MzVDLCAweDM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMl9fR1BJTzRfMTAJCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX0NBTjFfVFhDQU4JSU9NVVhfUEFEKDB4MzVDLCAweDM0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMl9fRkVDX01ESU8JCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgNCwgMHg4MDQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MMl9fRUNTUEkxX1NTMQlJT01VWF9QQUQoMHgzNUMsIDB4MzQsIDUsIDB4N0FDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19SREFUQV8yCUlPTVVYX1BBRCgweDM1QywgMHgzNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDJfX1VTQlBIWTFfUlhBQ1RJVkUJSU9NVVhfUEFEKDB4MzVDLCAweDM0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMl9fS1BQX1JPV18yCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzJfX0dQSU80XzExCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzJfX0NBTjFfUlhDQU4JSU9NVVhfUEFEKDB4MzYwLCAweDM4LCAyLCAweDc2MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cyX19GRUNfTURDCQlJT01VWF9QQUQoMHgzNjAsIDB4MzgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1cyX19FQ1NQSTFfU1MyCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgNSwgMHg3QjAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMl9fRkVDX1REQVRBXzIJSU9NVVhfUEFEKDB4MzYwLCAweDM4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XMl9fVVNCUEhZMV9SWEVSUk9SCUlPTVVYX1BBRCgweDM2MCwgMHgzOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX0tQUF9DT0xfMwlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0wzX19HUElPNF8xMgkJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MM19fVVNCT0gzX0gyX0RQCUlPTVVYX1BBRCgweDM2NCwgMHgzQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX1NQRElGX0lOMQlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDMsIDB4ODcwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX0kyQzJfU0NMCQlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDQgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MUMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MM19fRUNTUEkxX1NTMwlJT01VWF9QQUQoMHgzNjQsIDB4M0MsIDUsIDB4N0I0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX0ZFQ19DUlMJCUlPTVVYX1BBRCgweDM2NCwgMHgzQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDNfX1VTQlBIWTFfU0lFQ0xPQ0sJSU9NVVhfUEFEKDB4MzY0LCAweDNDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XM19fS1BQX1JPV18zCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX0dQSU80XzEzCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX1VTQk9IM19IMl9ETQlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1czX19DQ01fQVNSQ19FWFRfQ0xLCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgMywgMHg3NjgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XM19fSTJDMl9TREEJSU9NVVhfUEFEKDB4MzY4LCAweDQwLCA0IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODIwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX09TQzMyS18zMktfT1VUCUlPTVVYX1BBRCgweDM2OCwgMHg0MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX0NDTV9QTEw0X0JZUAlJT01VWF9QQUQoMHgzNjgsIDB4NDAsIDYsIDB4NzdDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzNfX1VTQlBIWTFfTElORVNUQVRFXzAJSU9NVVhfUEFEKDB4MzY4LCAweDQwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MNF9fS1BQX0NPTF80CUlPTVVYX1BBRCgweDM2QywgMHg0NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX0dQSU80XzE0CQlJT01VWF9QQUQoMHgzNkMsIDB4NDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9DT0w0X19DQU4yX1RYQ0FOCUlPTVVYX1BBRCgweDM2QywgMHg0NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX0lQVV9TSVNHXzQJSU9NVVhfUEFEKDB4MzZDLCAweDQ0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MNF9fVUFSVDVfUlRTCUlPTVVYX1BBRCgweDM2QywgMHg0NCwgNCwgMHg4OTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfQ09MNF9fVVNCT0gzX1VTQk9UR19PQwlJT01VWF9QQUQoMHgzNkMsIDB4NDQsIDUsIDB4ODlDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX0NPTDRfX1VTQlBIWTFfTElORVNUQVRFXzEJSU9NVVhfUEFEKDB4MzZDLCAweDQ0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9LRVlfUk9XNF9fS1BQX1JPV180CUlPTVVYX1BBRCgweDM3MCwgMHg0OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzRfX0dQSU80XzE1CUlPTVVYX1BBRCgweDM3MCwgMHg0OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4JSU9NVVhfUEFEKDB4MzcwLCAweDQ4LCAyLCAweDc2NCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19JUFVfU0lTR181CUlPTVVYX1BBRCgweDM3MCwgMHg0OCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfS0VZX1JPVzRfX1VBUlQ1X0NUUwlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19VU0JPSDNfVVNCT1RHX1BXUglJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0tFWV9ST1c0X19VU0JQSFkxX1ZCVVNWQUxJRAlJT01VWF9QQUQoMHgzNzAsIDB4NDgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fSVBVX0RJMF9ESVNQX0NMSwlJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fR1BJTzRfMTYJCUlPTVVYX1BBRCgweDM3OCwgMHg0QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JPSDNfVVNCSDJfRElSCUlPTVVYX1BBRCgweDM3OCwgMHg0QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX0RJU1BfQ0xLX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMAlJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fRU1JX0VNSV9ERUJVR18wCUlPTVVYX1BBRCgweDM3OCwgMHg0QywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JQSFkxX0FWQUxJRAlJT01VWF9QQUQoMHgzNzgsIDB4NEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4xNV9fSVBVX0RJMF9QSU4xNQkJSU9NVVhfUEFEKDB4MzdDLCAweDUwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMTVfX0dQSU80XzE3CQlJT01VWF9QQUQoMHgzN0MsIDB4NTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4xNV9fQVVETVVYX0FVRDZfVFhDCUlPTVVYX1BBRCgweDM3QywgMHg1MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjE1X19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMQlJT01VWF9QQUQoMHgzN0MsIDB4NTAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4xNV9fRU1JX0VNSV9ERUJVR18xCUlPTVVYX1BBRCgweDM3QywgMHg1MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjE1X19VU0JQSFkxX0JWQUxJRAkJSU9NVVhfUEFEKDB4MzdDLCAweDUwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOMl9fSVBVX0RJMF9QSU4yCQlJT01VWF9QQUQoMHgzODAsIDB4NTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4yX19HUElPNF8xOAkJCUlPTVVYX1BBRCgweDM4MCwgMHg1NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjJfX0FVRE1VWF9BVUQ2X1RYRAlJT01VWF9QQUQoMHgzODAsIDB4NTQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4yX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMglJT01VWF9QQUQoMHgzODAsIDB4NTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4yX19FTUlfRU1JX0RFQlVHXzIJCUlPTVVYX1BBRCgweDM4MCwgMHg1NCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjJfX1VTQlBIWTFfRU5EU0VTU0lPTglJT01VWF9QQUQoMHgzODAsIDB4NTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4zX19JUFVfREkwX1BJTjMJCUlPTVVYX1BBRCgweDM4NCwgMHg1OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjNfX0dQSU80XzE5CQkJSU9NVVhfUEFEKDB4Mzg0LCAweDU4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElOM19fQVVETVVYX0FVRDZfVFhGUwlJT01VWF9QQUQoMHgzODQsIDB4NTgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4zX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMwlJT01VWF9QQUQoMHgzODQsIDB4NTgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU4zX19FTUlfRU1JX0RFQlVHXzMJCUlPTVVYX1BBRCgweDM4NCwgMHg1OCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjNfX1VTQlBIWTFfSURESUcJCUlPTVVYX1BBRCgweDM4NCwgMHg1OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjRfX0lQVV9ESTBfUElONAkJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElONF9fR1BJTzRfMjAJCQlJT01VWF9QQUQoMHgzODgsIDB4NUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU40X19BVURNVVhfQVVENl9SWEQJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElONF9fRVNESEMxX1dQCQlJT01VWF9QQUQoMHgzODgsIDB4NUMsIDMsIDB4N0ZDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfREkwX1BJTjRfX1NETUFfREVCVUdfWUlFTEQJSU9NVVhfUEFEKDB4Mzg4LCAweDVDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESTBfUElONF9fRU1JX0VNSV9ERUJVR180CQlJT01VWF9QQUQoMHgzODgsIDB4NUMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJMF9QSU40X19VU0JQSFkxX0hPU1RESVNDT05ORUNUCUlPTVVYX1BBRCgweDM4OCwgMHg1QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fSVBVX0RJU1AwX0RBVF8wCUlPTVVYX1BBRCgweDM4QywgMHg2MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fR1BJTzRfMjEJCUlPTVVYX1BBRCgweDM4QywgMHg2MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHgzOEMsIDB4NjAsIDIsIDB4NzgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMF9fVVNCT0gzX1VTQkgyX0RBVEFfMAlJT01VWF9QQUQoMHgzOEMsIDB4NjAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDBfX1NETUFfREVCVUdfQ09SRV9SVU4JSU9NVVhfUEFEKDB4MzhDLCAweDYwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQwX19FTUlfRU1JX0RFQlVHXzUJSU9NVVhfUEFEKDB4MzhDLCAweDYwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JQSFkyX1RYUkVBRFkJSU9NVVhfUEFEKDB4MzhDLCAweDYwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19JUFVfRElTUDBfREFUXzEJSU9NVVhfUEFEKDB4MzkwLCAweDY0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19HUElPNF8yMgkJSU9NVVhfUEFEKDB4MzkwLCAweDY0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDM5MCwgMHg2NCwgMiwgMHg3ODgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JPSDNfVVNCSDJfREFUQV8xCUlPTVVYX1BBRCgweDM5MCwgMHg2NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMX1NFTAlJT01VWF9QQUQoMHgzOTAsIDB4NjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDFfX0VNSV9FTUlfREVCVUdfNglJT01VWF9QQUQoMHgzOTAsIDB4NjQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDFfX1VTQlBIWTJfUlhWQUxJRAlJT01VWF9QQUQoMHgzOTAsIDB4NjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDJfX0lQVV9ESVNQMF9EQVRfMglJT01VWF9QQUQoMHgzOTQsIDB4NjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDJfX0dQSU80XzIzCQlJT01VWF9QQUQoMHgzOTQsIDB4NjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDJfX0NTUElfTUlTTwkJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCAyLCAweDc4NCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDJfX1VTQk9IM19VU0JIMl9EQVRBXzIJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19TRE1BX0RFQlVHX01PREUJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19FTUlfRU1JX0RFQlVHXzcJSU9NVVhfUEFEKDB4Mzk0LCAweDY4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JQSFkyX1JYQUNUSVZFCUlPTVVYX1BBRCgweDM5NCwgMHg2OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fSVBVX0RJU1AwX0RBVF8zCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fR1BJTzRfMjQJCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fQ1NQSV9TUzAJCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgMiwgMHg3OEMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JPSDNfVVNCSDJfREFUQV8zCUlPTVVYX1BBRCgweDM5OCwgMHg2QywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUM19fU0RNQV9ERUJVR19CVVNfRVJST1IJSU9NVVhfUEFEKDB4Mzk4LCAweDZDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQzX19FTUlfRU1JX0RFQlVHXzgJSU9NVVhfUEFEKDB4Mzk4LCAweDZDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JQSFkyX1JYRVJST1IJSU9NVVhfUEFEKDB4Mzk4LCAweDZDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19JUFVfRElTUDBfREFUXzQJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19HUElPNF8yNQkJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19DU1BJX1NTMQkJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCAyLCAweDc5MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDRfX1VTQk9IM19VU0JIMl9EQVRBXzQJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19TRE1BX0RFQlVHX0JVU19SV0IJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzkJSU9NVVhfUEFEKDB4MzlDLCAweDcwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JQSFkyX1NJRUNMT0NLCUlPTVVYX1BBRCgweDM5QywgMHg3MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fSVBVX0RJU1AwX0RBVF81CUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fR1BJTzRfMjYJCUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fQ1NQSV9TUzIJCUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgMiwgMHg3OTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JPSDNfVVNCSDJfREFUQV81CUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fU0RNQV9ERUJVR19NQVRDSEVEX0RNQlVTCUlPTVVYX1BBRCgweDNBMCwgMHg3NCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNV9fRU1JX0VNSV9ERUJVR18xMAlJT01VWF9QQUQoMHgzQTAsIDB4NzQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDVfX1VTQlBIWTJfTElORVNUQVRFXzAJSU9NVVhfUEFEKDB4M0EwLCAweDc0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19JUFVfRElTUDBfREFUXzYJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19HUElPNF8yNwkJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19DU1BJX1NTMwkJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCAyLCAweDc5OCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDZfX1VTQk9IM19VU0JIMl9EQVRBXzYJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ2X19TRE1BX0RFQlVHX1JUQlVGRkVSX1dSSVRFCUlPTVVYX1BBRCgweDNBNCwgMHg3OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUNl9fRU1JX0VNSV9ERUJVR18xMQlJT01VWF9QQUQoMHgzQTQsIDB4NzgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDZfX1VTQlBIWTJfTElORVNUQVRFXzEJSU9NVVhfUEFEKDB4M0E0LCAweDc4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19JUFVfRElTUDBfREFUXzcJSU9NVVhfUEFEKDB4M0E4LCAweDdDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19HUElPNF8yOAkJSU9NVVhfUEFEKDB4M0E4LCAweDdDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19DU1BJX1JEWQkJSU9NVVhfUEFEKDB4M0E4LCAweDdDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19VU0JPSDNfVVNCSDJfREFUQV83CUlPTVVYX1BBRCgweDNBOCwgMHg3QywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzAJSU9NVVhfUEFEKDB4M0E4LCAweDdDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzEyCUlPTVVYX1BBRCgweDNBOCwgMHg3QywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUN19fVVNCUEhZMl9WQlVTVkFMSUQJSU9NVVhfUEFEKDB4M0E4LCAweDdDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19JUFVfRElTUDBfREFUXzgJSU9NVVhfUEFEKDB4M0FDLCAweDgwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19HUElPNF8yOQkJSU9NVVhfUEFEKDB4M0FDLCAweDgwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19QV00xX1BXTU8JCUlPTVVYX1BBRCgweDNBQywgMHg4MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fV0RPRzFfV0RPR19CCUlPTVVYX1BBRCgweDNBQywgMHg4MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzEJSU9NVVhfUEFEKDB4M0FDLCAweDgwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19FTUlfRU1JX0RFQlVHXzEzCUlPTVVYX1BBRCgweDNBQywgMHg4MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOF9fVVNCUEhZMl9BVkFMSUQJSU9NVVhfUEFEKDB4M0FDLCAweDgwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19JUFVfRElTUDBfREFUXzkJSU9NVVhfUEFEKDB4M0IwLCAweDg0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19HUElPNF8zMAkJSU9NVVhfUEFEKDB4M0IwLCAweDg0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19QV00yX1BXTU8JCUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fV0RPRzJfV0RPR19CCUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzIJCUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUOV9fRU1JX0VNSV9ERUJVR18xNAlJT01VWF9QQUQoMHgzQjAsIDB4ODQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDlfX1VTQlBIWTJfVlNUQVRVU18wCUlPTVVYX1BBRCgweDNCMCwgMHg4NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTBfX0lQVV9ESVNQMF9EQVRfMTAJSU9NVVhfUEFEKDB4M0I0LCAweDg4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fR1BJTzRfMzEJCUlPTVVYX1BBRCgweDNCNCwgMHg4OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTBfX1VTQk9IM19VU0JIMl9TVFAJSU9NVVhfUEFEKDB4M0I0LCAweDg4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzMJSU9NVVhfUEFEKDB4M0I0LCAweDg4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18xNQlJT01VWF9QQUQoMHgzQjQsIDB4ODgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEwX19VU0JQSFkyX1ZTVEFUVVNfMQlJT01VWF9QQUQoMHgzQjQsIDB4ODgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDExX19JUFVfRElTUDBfREFUXzExCUlPTVVYX1BBRCgweDNCOCwgMHg4QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTFfX0dQSU81XzUJCUlPTVVYX1BBRCgweDNCOCwgMHg4QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTFfX1VTQk9IM19VU0JIMl9OWFQJSU9NVVhfUEFEKDB4M0I4LCAweDhDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzQJSU9NVVhfUEFEKDB4M0I4LCAweDhDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fRU1JX0VNSV9ERUJVR18xNglJT01VWF9QQUQoMHgzQjgsIDB4OEMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDExX19VU0JQSFkyX1ZTVEFUVVNfMglJT01VWF9QQUQoMHgzQjgsIDB4OEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEyX19JUFVfRElTUDBfREFUXzEyCUlPTVVYX1BBRCgweDNCQywgMHg5MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTJfX0dQSU81XzYJCUlPTVVYX1BBRCgweDNCQywgMHg5MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTJfX1VTQk9IM19VU0JIMl9DTEsJSU9NVVhfUEFEKDB4M0JDLCAweDkwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzUJSU9NVVhfUEFEKDB4M0JDLCAweDkwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fRU1JX0VNSV9ERUJVR18xNwlJT01VWF9QQUQoMHgzQkMsIDB4OTAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JQSFkyX1ZTVEFUVVNfMwlJT01VWF9QQUQoMHgzQkMsIDB4OTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19JUFVfRElTUDBfREFUXzEzCUlPTVVYX1BBRCgweDNDMCwgMHg5NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTNfX0dQSU81XzcJCUlPTVVYX1BBRCgweDNDMCwgMHg5NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTNfX0FVRE1VWF9BVUQ1X1JYRlMJSU9NVVhfUEFEKDB4M0MwLCAweDk0LCAzLCAweDc1NCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMAlJT01VWF9QQUQoMHgzQzAsIDB4OTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzE4CUlPTVVYX1BBRCgweDNDMCwgMHg5NCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTNfX1VTQlBIWTJfVlNUQVRVU180CUlPTVVYX1BBRCgweDNDMCwgMHg5NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTRfX0lQVV9ESVNQMF9EQVRfMTQJSU9NVVhfUEFEKDB4M0M0LCAweDk4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fR1BJTzVfOAkJSU9NVVhfUEFEKDB4M0M0LCAweDk4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fQVVETVVYX0FVRDVfUlhDCUlPTVVYX1BBRCgweDNDNCwgMHg5OCwgMywgMHg3NTAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzEJSU9NVVhfUEFEKDB4M0M0LCAweDk4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fRU1JX0VNSV9ERUJVR18xOQlJT01VWF9QQUQoMHgzQzQsIDB4OTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE0X19VU0JQSFkyX1ZTVEFUVVNfNQlJT01VWF9QQUQoMHgzQzQsIDB4OTgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19JUFVfRElTUDBfREFUXzE1CUlPTVVYX1BBRCgweDNDOCwgMHg5QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTVfX0dQSU81XzkJCUlPTVVYX1BBRCgweDNDOCwgMHg5QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTVfX0VDU1BJMV9TUzEJCUlPTVVYX1BBRCgweDNDOCwgMHg5QywgMiwgMHg3QUMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkyX1NTMQkJSU9NVVhfUEFEKDB4M0M4LCAweDlDLCAzLCAweDdDOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMglJT01VWF9QQUQoMHgzQzgsIDB4OUMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE1X19FTUlfRU1JX0RFQlVHXzIwCUlPTVVYX1BBRCgweDNDOCwgMHg5QywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTVfX1VTQlBIWTJfVlNUQVRVU182CUlPTVVYX1BBRCgweDNDOCwgMHg5QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX0lQVV9ESVNQMF9EQVRfMTYJSU9NVVhfUEFEKDB4M0NDLCAweEEwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fR1BJTzVfMTAJCUlPTVVYX1BBRCgweDNDQywgMHhBMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX0VDU1BJMl9NT1NJCQlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDIsIDB4N0MwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX0FVRE1VWF9BVUQ1X1RYQwlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDMsIDB4NzU4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX1NETUFfRVhUX0VWRU5UXzAJSU9NVVhfUEFEKDB4M0NDLCAweEEwLCA0LCAweDg2OCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMwlJT01VWF9QQUQoMHgzQ0MsIDB4QTAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE2X19FTUlfRU1JX0RFQlVHXzIxCUlPTVVYX1BBRCgweDNDQywgMHhBMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTZfX1VTQlBIWTJfVlNUQVRVU183CUlPTVVYX1BBRCgweDNDQywgMHhBMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTdfX0lQVV9ESVNQMF9EQVRfMTcJSU9NVVhfUEFEKDB4M0QwLCAweEE0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fR1BJTzVfMTEJCUlPTVVYX1BBRCgweDNEMCwgMHhBNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTdfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHgzRDAsIDB4QTQsIDIsIDB4N0JDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTdfX0FVRE1VWF9BVUQ1X1RYRAlJT01VWF9QQUQoMHgzRDAsIDB4QTQsIDMsIDB4NzRDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfRVhUX0VWRU5UXzEJSU9NVVhfUEFEKDB4M0QwLCAweEE0LCA0LCAweDg2QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNAlJT01VWF9QQUQoMHgzRDAsIDB4QTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzIyCUlPTVVYX1BBRCgweDNEMCwgMHhBNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0lQVV9ESVNQMF9EQVRfMTgJSU9NVVhfUEFEKDB4M0Q0LCAweEE4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fR1BJTzVfMTIJCUlPTVVYX1BBRCgweDNENCwgMHhBOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0VDU1BJMl9TUzAJCUlPTVVYX1BBRCgweDNENCwgMHhBOCwgMiwgMHg3QzQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fQVVETVVYX0FVRDVfVFhGUwlJT01VWF9QQUQoMHgzRDQsIDB4QTgsIDMsIDB4NzVDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ0X1JYRlMJSU9NVVhfUEFEKDB4M0Q0LCAweEE4LCA0LCAweDczQywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfNQlJT01VWF9QQUQoMHgzRDQsIDB4QTgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzIzCUlPTVVYX1BBRCgweDNENCwgMHhBOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMThfX0VNSV9XRUlNX0NTXzIJSU9NVVhfUEFEKDB4M0Q0LCAweEE4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fSVBVX0RJU1AwX0RBVF8xOQlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE5X19HUElPNV8xMwkJSU9NVVhfUEFEKDB4M0Q4LCAweEFDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fRUNTUEkyX1NDTEsJCUlPTVVYX1BBRCgweDNEOCwgMHhBQywgMiwgMHg3QjgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDVfUlhECUlPTVVYX1BBRCgweDNEOCwgMHhBQywgMywgMHg3NDgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDRfUlhDCUlPTVVYX1BBRCgweDNEOCwgMHhBQywgNCwgMHg3MzgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzYJSU9NVVhfUEFEKDB4M0Q4LCAweEFDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fRU1JX0VNSV9ERUJVR18yNAlJT01VWF9QQUQoMHgzRDgsIDB4QUMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDE5X19FTUlfV0VJTV9DU18zCUlPTVVYX1BBRCgweDNEOCwgMHhBQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX0lQVV9ESVNQMF9EQVRfMjAJSU9NVVhfUEFEKDB4M0RDLCAweEIwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fR1BJTzVfMTQJCUlPTVVYX1BBRCgweDNEQywgMHhCMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX0VDU1BJMV9TQ0xLCQlJT01VWF9QQUQoMHgzREMsIDB4QjAsIDIsIDB4NzlDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX0FVRE1VWF9BVUQ0X1RYQwlJT01VWF9QQUQoMHgzREMsIDB4QjAsIDMsIDB4NzQwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU183CUlPTVVYX1BBRCgweDNEQywgMHhCMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjBfX0VNSV9FTUlfREVCVUdfMjUJSU9NVVhfUEFEKDB4M0RDLCAweEIwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fU0FUQV9QSFlfVERJCQlJT01VWF9QQUQoMHgzREMsIDB4QjAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19JUFVfRElTUDBfREFUXzIxCUlPTVVYX1BBRCgweDNFMCwgMHhCNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjFfX0dQSU81XzE1CQlJT01VWF9QQUQoMHgzRTAsIDB4QjQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19FQ1NQSTFfTU9TSQkJSU9NVVhfUEFEKDB4M0UwLCAweEI0LCAyLCAweDdBNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19BVURNVVhfQVVENF9UWEQJSU9NVVhfUEFEKDB4M0UwLCAweEI0LCAzLCAweDczNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMAlJT01VWF9QQUQoMHgzRTAsIDB4QjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIxX19FTUlfRU1JX0RFQlVHXzI2CUlPTVVYX1BBRCgweDNFMCwgMHhCNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjFfX1NBVEFfUEhZX1RETwlJT01VWF9QQUQoMHgzRTAsIDB4QjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIyX19JUFVfRElTUDBfREFUXzIyCUlPTVVYX1BBRCgweDNFNCwgMHhCOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjJfX0dQSU81XzE2CQlJT01VWF9QQUQoMHgzRTQsIDB4QjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIyX19FQ1NQSTFfTUlTTwkJSU9NVVhfUEFEKDB4M0U0LCAweEI4LCAyLCAweDdBMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIyX19BVURNVVhfQVVENF9UWEZTCUlPTVVYX1BBRCgweDNFNCwgMHhCOCwgMywgMHg3NDQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fU0RNQV9ERUJVR19CVVNfREVWSUNFXzEJSU9NVVhfUEFEKDB4M0U0LCAweEI4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fRU1JX0VNSV9ERUJVR18yNwlJT01VWF9QQUQoMHgzRTQsIDB4QjgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIyX19TQVRBX1BIWV9UQ0sJSU9NVVhfUEFEKDB4M0U0LCAweEI4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fSVBVX0RJU1AwX0RBVF8yMwlJT01VWF9QQUQoMHgzRTgsIDB4QkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIzX19HUElPNV8xNwkJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9ESVNQMF9EQVQyM19fRUNTUEkxX1NTMAkJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCAyLCAweDdBOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIzX19BVURNVVhfQVVENF9SWEQJSU9NVVhfUEFEKDB4M0U4LCAweEJDLCAzLCAweDczMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIzX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMglJT01VWF9QQUQoMHgzRTgsIDB4QkMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0RJU1AwX0RBVDIzX19FTUlfRU1JX0RFQlVHXzI4CUlPTVVYX1BBRCgweDNFOCwgMHhCQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRElTUDBfREFUMjNfX1NBVEFfUEhZX1RNUwlJT01VWF9QQUQoMHgzRTgsIDB4QkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfUElYQ0xLX19JUFVfQ1NJMF9QSVhDTEsJSU9NVVhfUEFEKDB4M0VDLCAweEMwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX1BJWENMS19fR1BJTzVfMTgJCUlPTVVYX1BBRCgweDNFQywgMHhDMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9QSVhDTEtfX1NETUFfREVCVUdfUENfMAlJT01VWF9QQUQoMHgzRUMsIDB4QzAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfUElYQ0xLX19FTUlfRU1JX0RFQlVHXzI5CUlPTVVYX1BBRCgweDNFQywgMHhDMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9NQ0xLX19JUFVfQ1NJMF9IU1lOQwkJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX01DTEtfX0dQSU81XzE5CQlJT01VWF9QQUQoMHgzRjAsIDB4QzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfTUNMS19fQ0NNX0NTSTBfTUNMSwkJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX01DTEtfX1NETUFfREVCVUdfUENfMQlJT01VWF9QQUQoMHgzRjAsIDB4QzQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfTUNMS19fRU1JX0VNSV9ERUJVR18zMAlJT01VWF9QQUQoMHgzRjAsIDB4QzQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfTUNMS19fVFBJVV9UUkNUTAkJSU9NVVhfUEFEKDB4M0YwLCAweEM0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0lQVV9DU0kwX0RBVEFfRU4JSU9NVVhfUEFEKDB4M0Y0LCAweEM4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0dQSU81XzIwCQlJT01VWF9QQUQoMHgzRjQsIDB4QzgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUQV9FTl9fU0RNQV9ERUJVR19QQ18yCUlPTVVYX1BBRCgweDNGNCwgMHhDOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19FTUlfRU1JX0RFQlVHXzMxCUlPTVVYX1BBRCgweDNGNCwgMHhDOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19UUElVX1RSQ0xLCQlJT01VWF9QQUQoMHgzRjQsIDB4QzgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfVlNZTkNfX0lQVV9DU0kwX1ZTWU5DCUlPTVVYX1BBRCgweDNGOCwgMHhDQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9WU1lOQ19fR1BJTzVfMjEJCUlPTVVYX1BBRCgweDNGOCwgMHhDQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9WU1lOQ19fU0RNQV9ERUJVR19QQ18zCUlPTVVYX1BBRCgweDNGOCwgMHhDQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9WU1lOQ19fRU1JX0VNSV9ERUJVR18zMglJT01VWF9QQUQoMHgzRjgsIDB4Q0MsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfVlNZTkNfX1RQSVVfVFJBQ0VfMAkJSU9NVVhfUEFEKDB4M0Y4LCAweENDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDRfX0lQVV9DU0kwX0RfNAkJSU9NVVhfUEFEKDB4M0ZDLCAweEQwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDRfX0dQSU81XzIyCQlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fS1BQX0NPTF81CQlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDIsIDB4ODQwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ0X19FQ1NQSTFfU0NMSwkJSU9NVVhfUEFEKDB4M0ZDLCAweEQwLCAzLCAweDc5QywgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fVVNCT0gzX1VTQkgzX1NUUAlJT01VWF9QQUQoMHgzRkMsIDB4RDAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNF9fQVVETVVYX0FVRDNfVFhDCUlPTVVYX1BBRCgweDNGQywgMHhEMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzMzCUlPTVVYX1BBRCgweDNGQywgMHhEMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ0X19UUElVX1RSQUNFXzEJCUlPTVVYX1BBRCgweDNGQywgMHhEMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ1X19JUFVfQ1NJMF9EXzUJCUlPTVVYX1BBRCgweDQwMCwgMHhENCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ1X19HUElPNV8yMwkJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX0tQUF9ST1dfNQkJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCAyLCAweDg0QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNV9fRUNTUEkxX01PU0kJCUlPTVVYX1BBRCgweDQwMCwgMHhENCwgMywgMHg3QTQsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX1VTQk9IM19VU0JIM19OWFQJSU9NVVhfUEFEKDB4NDAwLCAweEQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDVfX0FVRE1VWF9BVUQzX1RYRAlJT01VWF9QQUQoMHg0MDAsIDB4RDQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNV9fRU1JX0VNSV9ERUJVR18zNAlJT01VWF9QQUQoMHg0MDAsIDB4RDQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNV9fVFBJVV9UUkFDRV8yCQlJT01VWF9QQUQoMHg0MDAsIDB4RDQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fSVBVX0NTSTBfRF82CQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUNl9fR1BJTzVfMjQJCUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19LUFBfQ09MXzYJCUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgMiwgMHg4NDQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDZfX0VDU1BJMV9NSVNPCQlJT01VWF9QQUQoMHg0MDQsIDB4RDgsIDMsIDB4N0EwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19VU0JPSDNfVVNCSDNfQ0xLCUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19BVURNVVhfQVVEM19UWEZTCUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzM1CUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ2X19UUElVX1RSQUNFXzMJCUlPTVVYX1BBRCgweDQwNCwgMHhEOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ3X19JUFVfQ1NJMF9EXzcJCUlPTVVYX1BBRCgweDQwOCwgMHhEQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ3X19HUElPNV8yNQkJSU9NVVhfUEFEKDB4NDA4LCAweERDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDdfX0tQUF9ST1dfNgkJSU9NVVhfUEFEKDB4NDA4LCAweERDLCAyLCAweDg1MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fRUNTUEkxX1NTMAkJSU9NVVhfUEFEKDB4NDA4LCAweERDLCAzLCAweDdBOCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fVVNCT0gzX1VTQkgzX0RJUglJT01VWF9QQUQoMHg0MDgsIDB4REMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUN19fQVVETVVYX0FVRDNfUlhECUlPTVVYX1BBRCgweDQwOCwgMHhEQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzM2CUlPTVVYX1BBRCgweDQwOCwgMHhEQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ3X19UUElVX1RSQUNFXzQJCUlPTVVYX1BBRCgweDQwOCwgMHhEQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ4X19JUFVfQ1NJMF9EXzgJCUlPTVVYX1BBRCgweDQwQywgMHhFMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ4X19HUElPNV8yNgkJSU9NVVhfUEFEKDB4NDBDLCAweEUwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX0tQUF9DT0xfNwkJSU9NVVhfUEFEKDB4NDBDLCAweEUwLCAyLCAweDg0OCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fRUNTUEkyX1NDTEsJCUlPTVVYX1BBRCgweDQwQywgMHhFMCwgMywgMHg3QjgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDhfX1VTQk9IM19VU0JIM19PQwlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fSTJDMV9TREEJCUlPTVVYX1BBRCgweDQwQywgMHhFMCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fRU1JX0VNSV9ERUJVR18zNwlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOF9fVFBJVV9UUkFDRV81CQlJT01VWF9QQUQoMHg0MEMsIDB4RTAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fSVBVX0NTSTBfRF85CQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUOV9fR1BJTzVfMjcJCUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19LUFBfUk9XXzcJCUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgMiwgMHg4NTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDlfX0VDU1BJMl9NT1NJCQlJT01VWF9QQUQoMHg0MTAsIDB4RTQsIDMsIDB4N0MwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19VU0JPSDNfVVNCSDNfUFdSCUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19JMkMxX1NDTAkJSU9NVVhfUEFEKDB4NDEwLCAweEU0LCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODE0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzM4CUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQ5X19UUElVX1RSQUNFXzYJCUlPTVVYX1BBRCgweDQxMCwgMHhFNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fSVBVX0NTSTBfRF8xMAkJSU9NVVhfUEFEKDB4NDE0LCAweEU4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEwX19HUElPNV8yOAkJSU9NVVhfUEFEKDB4NDE0LCAweEU4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEwX19VQVJUMV9UWERfTVVYCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fRUNTUEkyX01JU08JCUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgMywgMHg3QkMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEwX19BVURNVVhfQVVEM19SWEMJSU9NVVhfUEFEKDB4NDE0LCAweEU4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEwX19TRE1BX0RFQlVHX1BDXzQJSU9NVVhfUEFEKDB4NDE0LCAweEU4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEwX19FTUlfRU1JX0RFQlVHXzM5CUlPTVVYX1BBRCgweDQxNCwgMHhFOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMF9fVFBJVV9UUkFDRV83CQlJT01VWF9QQUQoMHg0MTQsIDB4RTgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX0lQVV9DU0kwX0RfMTEJCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fR1BJTzVfMjkJCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fVUFSVDFfUlhEX01VWAlJT01VWF9QQUQoMHg0MTgsIDB4RUMsIDIsIDB4ODc4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fRUNTUEkyX1NTMAkJSU9NVVhfUEFEKDB4NDE4LCAweEVDLCAzLCAweDdDNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTFfX0FVRE1VWF9BVUQzX1JYRlMJSU9NVVhfUEFEKDB4NDE4LCAweEVDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDExX19TRE1BX0RFQlVHX1BDXzUJSU9NVVhfUEFEKDB4NDE4LCAweEVDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDExX19FTUlfRU1JX0RFQlVHXzQwCUlPTVVYX1BBRCgweDQxOCwgMHhFQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMV9fVFBJVV9UUkFDRV84CQlJT01VWF9QQUQoMHg0MTgsIDB4RUMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX0lQVV9DU0kwX0RfMTIJCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAJCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fVUFSVDRfVFhEX01VWAlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTJfX1VTQk9IM19VU0JIM19EQVRBXzAJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19TRE1BX0RFQlVHX1BDXzYJSU9NVVhfUEFEKDB4NDFDLCAweEYwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzQxCUlPTVVYX1BBRCgweDQxQywgMHhGMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxMl9fVFBJVV9UUkFDRV85CQlJT01VWF9QQUQoMHg0MUMsIDB4RjAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX0lQVV9DU0kwX0RfMTMJCUlPTVVYX1BBRCgweDQyMCwgMHhGNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxM19fR1BJTzVfMzEJCUlPTVVYX1BBRCgweDQyMCwgMHhGNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxM19fVUFSVDRfUlhEX01VWAlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDIsIDB4ODkwLCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxM19fVVNCT0gzX1VTQkgzX0RBVEFfMQlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX1NETUFfREVCVUdfUENfNwlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTNfX0VNSV9FTUlfREVCVUdfNDIJSU9NVVhfUEFEKDB4NDIwLCAweEY0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDEzX19UUElVX1RSQUNFXzEwCQlJT01VWF9QQUQoMHg0MjAsIDB4RjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX0lQVV9DU0kwX0RfMTQJCUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fR1BJTzZfMAkJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19VQVJUNV9UWERfTVVYCUlPTVVYX1BBRCgweDQyNCwgMHhGOCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNF9fVVNCT0gzX1VTQkgzX0RBVEFfMglJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX1NETUFfREVCVUdfUENfOAlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTRfX0VNSV9FTUlfREVCVUdfNDMJSU9NVVhfUEFEKDB4NDI0LCAweEY4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE0X19UUElVX1RSQUNFXzExCQlJT01VWF9QQUQoMHg0MjQsIDB4RjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTVfX0lQVV9DU0kwX0RfMTUJCUlPTVVYX1BBRCgweDQyOCwgMHhGQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNV9fR1BJTzZfMQkJSU9NVVhfUEFEKDB4NDI4LCAweEZDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE1X19VQVJUNV9SWERfTVVYCUlPTVVYX1BBRCgweDQyOCwgMHhGQywgMiwgMHg4OTgsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE1X19VU0JPSDNfVVNCSDNfREFUQV8zCUlPTVVYX1BBRCgweDQyOCwgMHhGQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNV9fU0RNQV9ERUJVR19QQ185CUlPTVVYX1BBRCgweDQyOCwgMHhGQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNV9fRU1JX0VNSV9ERUJVR180NAlJT01VWF9QQUQoMHg0MjgsIDB4RkMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTVfX1RQSVVfVFJBQ0VfMTIJCUlPTVVYX1BBRCgweDQyOCwgMHhGQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fSVBVX0NTSTBfRF8xNgkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fR1BJTzZfMgkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fVUFSVDRfUlRTCQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCAyLCAweDg4QywgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX1VTQk9IM19VU0JIM19EQVRBXzQJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxNl9fU0RNQV9ERUJVR19QQ18xMAlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE2X19FTUlfRU1JX0RFQlVHXzQ1CUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTZfX1RQSVVfVFJBQ0VfMTMJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX0lQVV9DU0kwX0RfMTcJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX0dQSU82XzMJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX1VBUlQ0X0NUUwkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fVVNCT0gzX1VTQkgzX0RBVEFfNQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE3X19TRE1BX0RFQlVHX1BDXzExCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTdfX0VNSV9FTUlfREVCVUdfNDYJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxN19fVFBJVV9UUkFDRV8xNAkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOF9fSVBVX0NTSTBfRF8xOAkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOF9fR1BJTzZfNAkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOF9fVUFSVDVfUlRTCQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCAyLCAweDg5NCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX1VTQk9IM19VU0JIM19EQVRBXzYJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOF9fU0RNQV9ERUJVR19QQ18xMglJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzQ3CUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMThfX1RQSVVfVFJBQ0VfMTUJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX0lQVV9DU0kwX0RfMTkJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX0dQSU82XzUJCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX1VBUlQ1X0NUUwkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCT0gzX1VTQkgzX0RBVEFfNwlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9DU0kwX0RBVDE5X19TRE1BX0RFQlVHX1BDXzEzCUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0NTSTBfREFUMTlfX0VNSV9FTUlfREVCVUdfNDgJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCUEhZMl9CSVNUT0sJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNV9fRU1JX1dFSU1fQV8yNQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNV9fR1BJTzVfMgkJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjVfX0VDU1BJMl9SRFkJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjVfX0lQVV9ESTFfUElOMTIJCUlPTVVYX1BBRCgweDQ1OCwgMHgxMTAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjVfX0NTUElfU1MxCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNCwgMHg3OTAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI1X19JUFVfREkwX0QxX0NTCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTI1X19VU0JQSFkxX0JJU1RPSwkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fRU1JX1dFSU1fRUJfMgkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fR1BJTzJfMzAJCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIyX19DQ01fREkxX0VYVF9DTEsJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDIsIDB4NzZDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fSVBVX1NFUl9ESVNQMV9DUwkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMl9fRUNTUEkxX1NTMAkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgNCwgMHg3QTgsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIyX19JMkMyX1NDTAkJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MUMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19FTUlfV0VJTV9EXzE2CQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE2X19HUElPM18xNgkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESTBfUElONQkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJU1BCMV9TRVJfQ0xLCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTZfX0VDU1BJMV9TQ0xLCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCA0LCAweDc5QywgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTZfX0kyQzJfU0RBCQkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTdfX0VNSV9XRUlNX0RfMTcJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTdfX0dQSU8zXzE3CQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxN19fSVBVX0RJMF9QSU42CQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19JUFVfRElTUEIxX1NFUl9ESU4JSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMywgMHg4MzAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19FQ1NQSTFfTUlTTwkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgNCwgMHg3QTAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE3X19JMkMzX1NDTAkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19FTUlfV0VJTV9EXzE4CQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE4X19HUElPM18xOAkJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESTBfUElONwkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJU1BCMV9TRVJfRElPCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDMsIDB4ODMwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fRUNTUEkxX01PU0kJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDQsIDB4N0E0LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fSTJDM19TREEJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMV9EMF9DUwkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fRU1JX1dFSU1fRF8xOQkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fR1BJTzNfMTkJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDE5X19JUFVfREkwX1BJTjgJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESVNQQjFfU0VSX1JTCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX0VDU1BJMV9TUzEJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDQsIDB4N0FDLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QxOV9fRVBJVDFfRVBJVE8JCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX1VBUlQxX0NUUwkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMTlfX1VTQk9IM19VU0JIMl9PQwkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNywgMHg4QTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19FTUlfV0VJTV9EXzIwCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19HUElPM18yMAkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjBfX0lQVV9ESTBfUElOMTYJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjBfX0lQVV9TRVJfRElTUDBfQ1MJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjBfX0NTUElfU1MwCQkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgNCwgMHg3OEMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19FUElUMl9FUElUTwkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMF9fVUFSVDFfUlRTCQkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgNiwgMHg4NzQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIwX19VU0JPSDNfVVNCSDJfUFdSCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0VNSV9XRUlNX0RfMjEJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0dQSU8zXzIxCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMV9fSVBVX0RJMF9QSU4xNwkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMV9fSVBVX0RJU1BCMF9TRVJfQ0xLCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjFfX0NTUElfU0NMSwkJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDQsIDB4NzgwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMV9fSTJDMV9TQ0wJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODE0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMV9fVVNCT0gzX1VTQk9UR19PQwlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA2LCAweDg5QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjJfX0VNSV9XRUlNX0RfMjIJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjJfX0dQSU8zXzIyCQkJSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyMl9fSVBVX0RJMF9QSU4xCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIyX19JUFVfRElTUEIwX1NFUl9ESU4JSU9NVVhfUEFEKDB4NDc4LCAweDEzMCwgMywgMHg4MkMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIyX19DU1BJX01JU08JCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCA0LCAweDc4NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjJfX1VTQk9IM19VU0JPVEdfUFdSCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0VNSV9XRUlNX0RfMjMJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0dQSU8zXzIzCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fVUFSVDNfQ1RTCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fVUFSVDFfRENECQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfREkwX0QwX0NTCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjIJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9DU0kxX0RBVEFfRU4JCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDYsIDB4ODM0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMV9QSU4xNAkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fRU1JX1dFSU1fRUJfMwkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fR1BJTzJfMzEJCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMJCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCAyLCAweDg4NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9FQjNfX1VBUlQxX1JJCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4zCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIzX19JUFVfQ1NJMV9IU1lOQwkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNiwgMHg4MzgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2CQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0CQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19HUElPM18yNAkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVgJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMV9TUzIJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDMsIDB4N0IwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNF9fQ1NQSV9TUzIJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA0LCAweDc5NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjRfX0FVRE1VWF9BVUQ1X1JYRlMJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNSwgMHg3NTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTJfU1MyCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI0X19VQVJUMV9EVFIJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX0VNSV9XRUlNX0RfMjUJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX0dQSU8zXzI1CQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fVUFSVDNfUlhEX01VWAkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMiwgMHg4ODgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTFfU1MzCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCAzLCAweDdCNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjVfX0NTUElfU1MzCQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgNCwgMHg3OTgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI1X19BVURNVVhfQVVENV9SWEMJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDUsIDB4NzUwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fRUNTUEkyX1NTMwkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyNV9fVUFSVDFfRFNSCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19FTUlfV0VJTV9EXzI2CQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19HUElPM18yNgkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVgJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX0ZJUklfUlhECQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgMywgMHg4MEMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfQ1NJMF9EXzEJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX0lQVV9ESTFfUElOMTEJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX0lQVV9TSVNHXzIJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjZfX0lQVV9ESVNQMV9EQVRfMjIJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0VNSV9XRUlNX0RfMjcJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3CQkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyN19fVUFSVDJfUlhEX01VWAkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMiwgMHg4ODAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI3X19GSVJJX1RYRAkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjdfX0lQVV9DU0kwX0RfMAkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyN19fSVBVX0RJMV9QSU4xMwkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyN19fSVBVX1NJU0dfMwkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyN19fSVBVX0RJU1AxX0RBVF8yMwkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fRU1JX1dFSU1fRF8yOAkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fR1BJTzNfMjgJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19VQVJUMl9DVFMJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRElTUEIwX1NFUl9ESU8JSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMywgMHg4MkMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI4X19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA0LCAweDc4OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0kyQzFfU0RBCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjhfX0lQVV9FWFRfVFJJRwkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJMF9QSU4xMwkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fRU1JX1dFSU1fRF8yOQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QyOV9fR1BJTzNfMjkJCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19VQVJUMl9SVFMJCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAyLCAweDg3QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjlfX0lQVV9ESVNQQjBfU0VSX1JTCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwCQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNCwgMHg3OEMsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfREkxX1BJTjE1CQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfQ1NJMV9WU1lOQwkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNiwgMHg4M0MsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfREkwX1BJTjE0CQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19FTUlfV0VJTV9EXzMwCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMwX19HUElPM18zMAkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUwkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMwkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJMF9QSU4xMQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJU1AxX0RBVF8yMQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgxX09DCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCA2LCAweDhBMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzBfX1VTQk9IM19VU0JIMl9PQwkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNywgMHg4QTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19FTUlfV0VJTV9EXzMxCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19HUElPM18zMQkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzFfX1VBUlQzX1JUUwkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDIsIDB4ODg0LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0QzMV9fSVBVX0NTSTBfRF8yCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfREkwX1BJTjEyCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfRElTUDFfREFUXzIwCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDFfUFdSCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EMzFfX1VTQk9IM19VU0JIMl9QV1IJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNF9fRU1JX1dFSU1fQV8yNAkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyNF9fR1BJTzVfNAkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9ESVNQMV9EQVRfMTkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9DU0kxX0RfMTkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9TSVNHXzIJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjRfX1VTQlBIWTJfQlZBTElECQlJT01VWF9QQUQoMHg0QTgsIDB4MTVDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIzX19FTUlfV0VJTV9BXzIzCQlJT01VWF9QQUQoMHg0QUMsIDB4MTYwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIzX19HUElPNl82CQkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fSVBVX0RJU1AxX0RBVF8xOAkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fSVBVX0NTSTFfRF8xOAkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fSVBVX1NJU0dfMwkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyM19fVVNCUEhZMl9FTkRTRVNTSU9OCUlPTVVYX1BBRCgweDRBQywgMHgxNjAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjJfX0VNSV9XRUlNX0FfMjIJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjJfX0dQSU8yXzE2CQkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMl9fSVBVX0RJU1AxX0RBVF8xNwkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMl9fSVBVX0NTSTFfRF8xNwkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMl9fU1JDX0JUX0NGRzFfNwkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMV9fRU1JX1dFSU1fQV8yMQkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0EyMV9fR1BJTzJfMTcJCQlJT01VWF9QQUQoMHg0QjQsIDB4MTY4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIxX19JUFVfRElTUDFfREFUXzE2CQlJT01VWF9QQUQoMHg0QjQsIDB4MTY4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIxX19JUFVfQ1NJMV9EXzE2CQlJT01VWF9QQUQoMHg0QjQsIDB4MTY4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIxX19TUkNfQlRfQ0ZHMV82CQlJT01VWF9QQUQoMHg0QjQsIDB4MTY4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIwX19FTUlfV0VJTV9BXzIwCQlJT01VWF9QQUQoMHg0QjgsIDB4MTZDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTIwX19HUElPMl8xOAkJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjBfX0lQVV9ESVNQMV9EQVRfMTUJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjBfX0lQVV9DU0kxX0RfMTUJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMjBfX1NSQ19CVF9DRkcxXzUJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTlfX0VNSV9XRUlNX0FfMTkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTlfX0dQSU8yXzE5CQkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOV9fSVBVX0RJU1AxX0RBVF8xNAkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOV9fSVBVX0NTSTFfRF8xNAkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOV9fU1JDX0JUX0NGRzFfNAkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOF9fRU1JX1dFSU1fQV8xOAkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExOF9fR1BJTzJfMjAJCQlJT01VWF9QQUQoMHg0QzAsIDB4MTc0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE4X19JUFVfRElTUDFfREFUXzEzCQlJT01VWF9QQUQoMHg0QzAsIDB4MTc0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE4X19JUFVfQ1NJMV9EXzEzCQlJT01VWF9QQUQoMHg0QzAsIDB4MTc0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE4X19TUkNfQlRfQ0ZHMV8zCQlJT01VWF9QQUQoMHg0QzAsIDB4MTc0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE3X19FTUlfV0VJTV9BXzE3CQlJT01VWF9QQUQoMHg0QzQsIDB4MTc4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE3X19HUElPMl8yMQkJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTdfX0lQVV9ESVNQMV9EQVRfMTIJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTdfX0lQVV9DU0kxX0RfMTIJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTdfX1NSQ19CVF9DRkcxXzIJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTZfX0VNSV9XRUlNX0FfMTYJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9BMTZfX0dQSU8yXzIyCQkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExNl9fSVBVX0RJMV9ESVNQX0NMSwkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0ExNl9fSVBVX0NTSTFfUElYQ0xLCQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQTE2X19TUkNfQlRfQ0ZHMV8xCQlJT01VWF9QQUQoMHg0QzgsIDB4MTdDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MwX19FTUlfV0VJTV9DU18wCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MwX19HUElPMl8yMwkJCUlPTVVYX1BBRCgweDRDQywgMHgxODAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9DUzBfX0VDU1BJMl9TQ0xLCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAyLCAweDdCOCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9DUzBfX0lQVV9ESTFfUElONQkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMV9fRU1JX1dFSU1fQ1NfMQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0NTMV9fR1BJTzJfMjQJCQlJT01VWF9QQUQoMHg0RDAsIDB4MTg0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MxX19FQ1NQSTJfTU9TSQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMiwgMHg3QzAsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fQ1MxX19JUFVfREkxX1BJTjYJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9PRV9fRU1JX1dFSU1fT0UJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9PRV9fR1BJTzJfMjUJCQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fT0VfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCAyLCAweDdCQywgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9PRV9fSVBVX0RJMV9QSU43CQlJT01VWF9QQUQoMHg0RDQsIDB4MTg4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fT0VfX1VTQlBIWTJfSURESUcJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9SV19fRU1JX1dFSU1fUlcJCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9SV19fR1BJTzJfMjYJCQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fUldfX0VDU1BJMl9TUzAJCQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCAyLCAweDdDNCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9SV19fSVBVX0RJMV9QSU44CQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fUldfX1VTQlBIWTJfSE9TVERJU0NPTk5FQ1QJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0xCQV9fRU1JX1dFSU1fTEJBCQlJT01VWF9QQUQoMHg0REMsIDB4MTkwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fTEJBX19HUElPMl8yNwkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9MQkFfX0VDU1BJMl9TUzEJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDIsIDB4N0M4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0xCQV9fSVBVX0RJMV9QSU4xNwkJSU9NVVhfUEFEKDB4NERDLCAweDE5MCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0xCQV9fU1JDX0JUX0NGRzFfMAkJSU9NVVhfUEFEKDB4NERDLCAweDE5MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fRU1JX1dFSU1fRUJfMAkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fR1BJTzJfMjgJCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIwX19JUFVfRElTUDFfREFUXzExCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIwX19JUFVfQ1NJMV9EXzExCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIwX19HUENfUE1JQ19SRFkJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDUsIDB4ODEwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMF9fU1JDX0JUX0NGRzJfNwkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMV9fRU1JX1dFSU1fRUJfMQkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0VCMV9fR1BJTzJfMjkJCQlJT01VWF9QQUQoMHg0RTgsIDB4MTk4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIxX19JUFVfRElTUDFfREFUXzEwCQlJT01VWF9QQUQoMHg0RTgsIDB4MTk4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIxX19JUFVfQ1NJMV9EXzEwCQlJT01VWF9QQUQoMHg0RTgsIDB4MTk4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fRUIxX19TUkNfQlRfQ0ZHMl82CQlJT01VWF9QQUQoMHg0RTgsIDB4MTk4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEwX19FTUlfTkFORF9XRUlNX0RBXzAJSU9NVVhfUEFEKDB4NEVDLCAweDE5QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMF9fR1BJTzNfMAkJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTBfX0lQVV9ESVNQMV9EQVRfOQkJSU9NVVhfUEFEKDB4NEVDLCAweDE5QywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMF9fSVBVX0NTSTFfRF85CQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEwX19TUkNfQlRfQ0ZHMl81CQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExX19FTUlfTkFORF9XRUlNX0RBXzEJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMV9fR1BJTzNfMQkJCUlPTVVYX1BBRCgweDRGMCwgMHgxQTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTFfX0lQVV9ESVNQMV9EQVRfOAkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMV9fSVBVX0NTSTFfRF84CQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExX19TUkNfQlRfQ0ZHMl80CQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEyX19FTUlfTkFORF9XRUlNX0RBXzIJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMl9fR1BJTzNfMgkJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTJfX0lQVV9ESVNQMV9EQVRfNwkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMl9fSVBVX0NTSTFfRF83CQlJT01VWF9QQUQoMHg0RjQsIDB4MUE0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEyX19TUkNfQlRfQ0ZHMl8zCQlJT01VWF9QQUQoMHg0RjQsIDB4MUE0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEzX19FTUlfTkFORF9XRUlNX0RBXzMJSU9NVVhfUEFEKDB4NEY4LCAweDFBOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBM19fR1BJTzNfMwkJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTNfX0lQVV9ESVNQMV9EQVRfNgkJSU9NVVhfUEFEKDB4NEY4LCAweDFBOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBM19fSVBVX0NTSTFfRF82CQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREEzX19TUkNfQlRfQ0ZHMl8yCQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE0X19FTUlfTkFORF9XRUlNX0RBXzQJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNF9fR1BJTzNfNAkJCUlPTVVYX1BBRCgweDRGQywgMHgxQUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTRfX0lQVV9ESVNQMV9EQVRfNQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNF9fSVBVX0NTSTFfRF81CQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE0X19TUkNfQlRfQ0ZHM183CQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19FTUlfTkFORF9XRUlNX0RBXzUJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNV9fR1BJTzNfNQkJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTVfX0lQVV9ESVNQMV9EQVRfNAkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNV9fSVBVX0NTSTFfRF80CQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE1X19TUkNfQlRfQ0ZHM182CQlJT01VWF9QQUQoMHg1MDAsIDB4MUIwLCA3IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTZfX0VNSV9OQU5EX1dFSU1fREFfNglJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE2X19HUElPM182CQkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBNl9fSVBVX0RJU1AxX0RBVF8zCQlJT01VWF9QQUQoMHg1MDQsIDB4MUI0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE2X19JUFVfQ1NJMV9EXzMJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTZfX1NSQ19CVF9DRkczXzUJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTdfX0VNSV9OQU5EX1dFSU1fREFfNwlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE3X19HUElPM183CQkJSU9NVVhfUEFEKDB4NTA4LCAweDFCOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBN19fSVBVX0RJU1AxX0RBVF8yCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE3X19JUFVfQ1NJMV9EXzIJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTdfX1NSQ19CVF9DRkczXzQJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQThfX0VNSV9OQU5EX1dFSU1fREFfOAlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE4X19HUElPM184CQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOF9fSVBVX0RJU1AxX0RBVF8xCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE4X19JUFVfQ1NJMV9EXzEJCUlPTVVYX1BBRCgweDUwQywgMHgxQkMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQThfX1NSQ19CVF9DRkczXzMJCUlPTVVYX1BBRCgweDUwQywgMHgxQkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTlfX0VNSV9OQU5EX1dFSU1fREFfOQlJT01VWF9QQUQoMHg1MTAsIDB4MUMwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE5X19HUElPM185CQkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBOV9fSVBVX0RJU1AxX0RBVF8wCQlJT01VWF9QQUQoMHg1MTAsIDB4MUMwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREE5X19JUFVfQ1NJMV9EXzAJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTlfX1NSQ19CVF9DRkczXzIJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEwX19FTUlfTkFORF9XRUlNX0RBXzEwCUlPTVVYX1BBRCgweDUxNCwgMHgxQzQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEwX19HUElPM18xMAkJCUlPTVVYX1BBRCgweDUxNCwgMHgxQzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEwX19JUFVfREkxX1BJTjE1CQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMF9fSVBVX0NTSTFfREFUQV9FTglJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCA0LCAweDgzNCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEwX19TUkNfQlRfQ0ZHM18xCQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMV9fRU1JX05BTkRfV0VJTV9EQV8xMQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMV9fR1BJTzNfMTEJCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMV9fSVBVX0RJMV9QSU4yCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExMV9fSVBVX0NTSTFfSFNZTkMJCUlPTVVYX1BBRCgweDUxOCwgMHgxQzgsIDQsIDB4ODM4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTJfX0VNSV9OQU5EX1dFSU1fREFfMTIJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTJfX0dQSU8zXzEyCQkJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTJfX0lQVV9ESTFfUElOMwkJSU9NVVhfUEFEKDB4NTFDLCAweDFDQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRUlNX0RBMTJfX0lQVV9DU0kxX1ZTWU5DCQlJT01VWF9QQUQoMHg1MUMsIDB4MUNDLCA0LCAweDgzQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEzX19FTUlfTkFORF9XRUlNX0RBXzEzCUlPTVVYX1BBRCgweDUyMCwgMHgxRDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEzX19HUElPM18xMwkJCUlPTVVYX1BBRCgweDUyMCwgMHgxRDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTEzX19JUFVfREkxX0QwX0NTCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExM19fQ0NNX0RJMV9FWFRfQ0xLCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCA0LCAweDc2QywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTE0X19FTUlfTkFORF9XRUlNX0RBXzE0CUlPTVVYX1BBRCgweDUyNCwgMHgxRDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTE0X19HUElPM18xNAkJCUlPTVVYX1BBRCgweDUyNCwgMHgxRDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9EQTE0X19JUFVfREkxX0QxX0NTCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNF9fQ0NNX0RJMF9FWFRfQ0xLCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNV9fRU1JX05BTkRfV0VJTV9EQV8xNQlJT01VWF9QQUQoMHg1MjgsIDB4MUQ4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNV9fR1BJTzNfMTUJCQlJT01VWF9QQUQoMHg1MjgsIDB4MUQ4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU4xCQlJT01VWF9QQUQoMHg1MjgsIDB4MUQ4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU40CQlJT01VWF9QQUQoMHg1MjgsIDB4MUQ4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9XRV9CX19FTUlfTkFOREZfV0VfQglJT01VWF9QQUQoMHg1MkMsIDB4MURDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9XRV9CX19HUElPNl8xMgkJSU9NVVhfUEFEKDB4NTJDLCAweDFEQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfUkVfQl9fRU1JX05BTkRGX1JFX0IJSU9NVVhfUEFEKDB4NTMwLCAweDFFMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfUkVfQl9fR1BJTzZfMTMJCUlPTVVYX1BBRCgweDUzMCwgMHgxRTAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9XQUlUX19FTUlfV0VJTV9XQUlUCQlJT01VWF9QQUQoMHg1MzQsIDB4MUU0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9FSU1fV0FJVF9fR1BJTzVfMAkJCUlPTVVYX1BBRCgweDUzNCwgMHgxRTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0VJTV9XQUlUX19FTUlfV0VJTV9EVEFDS19CCUlPTVVYX1BBRCgweDUzNCwgMHgxRTQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX1RYM19QX19HUElPNl8yMgkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX1RYM19QX19MREJfTFZEUzFfVFgzCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUVDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDJfUF9fR1BJTzZfMjQJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUYwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDJfUF9fTERCX0xWRFMxX1RYMglJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfQ0xLX1BfX0dQSU82XzI2CQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzFfQ0xLX1BfX0xEQl9MVkRTMV9DTEsJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRjQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX1RYMV9QX19HUElPNl8yOAkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgxRjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMxX1RYMV9QX19MREJfTFZEUzFfVFgxCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUY4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDBfUF9fR1BJTzZfMzAJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MUZDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMV9UWDBfUF9fTERCX0xWRFMxX1RYMAlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDFGQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgzX1BfX0dQSU83XzIyCQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIwMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgzX1BfX0xEQl9MVkRTMF9UWDMJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX0NMS19QX19HUElPN18yNAkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX0NMS19QX19MREJfTFZEUzBfQ0xLCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjA0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9UWDJfUF9fR1BJTzdfMjYJCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjA4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9MVkRTMF9UWDJfUF9fTERCX0xWRFMwX1RYMglJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIwOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgxX1BfX0dQSU83XzI4CQlJT01VWF9QQUQoTk9OX1BBRF9JLCAweDIwQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTFZEUzBfVFgxX1BfX0xEQl9MVkRTMF9UWDEJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYMF9QX19HUElPN18zMAkJSU9NVVhfUEFEKE5PTl9QQURfSSwgMHgyMTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0xWRFMwX1RYMF9QX19MREJfTFZEUzBfVFgwCUlPTVVYX1BBRChOT05fUEFEX0ksIDB4MjEwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzEwX19HUElPNF8wCQkJSU9NVVhfUEFEKDB4NTQwLCAweDIxNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xMF9fT1NDMzJrXzMyS19PVVQJCUlPTVVYX1BBRCgweDU0MCwgMHgyMTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTFfX0dQSU80XzEJCQlJT01VWF9QQUQoMHg1NDQsIDB4MjE4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzEyX19HUElPNF8yCQkJSU9NVVhfUEFEKDB4NTQ4LCAweDIxQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xM19fR1BJTzRfMwkJCUlPTVVYX1BBRCgweDU0QywgMHgyMjAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTRfX0dQSU80XzQJCQlJT01VWF9QQUQoMHg1NTAsIDB4MjI0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DTEVfX0VNSV9OQU5ERl9DTEUJCUlPTVVYX1BBRCgweDVBMCwgMHgyMjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NMRV9fR1BJTzZfNwkJCUlPTVVYX1BBRCgweDVBMCwgMHgyMjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NMRV9fVVNCUEhZMV9WU1RBVFVTXzAJSU9NVVhfUEFEKDB4NUEwLCAweDIyOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQUxFX19FTUlfTkFOREZfQUxFCQlJT01VWF9QQUQoMHg1QTQsIDB4MjJDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9BTEVfX0dQSU82XzgJCUlPTVVYX1BBRCgweDVBNCwgMHgyMkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0FMRV9fVVNCUEhZMV9WU1RBVFVTXzEJSU9NVVhfUEFEKDB4NUE0LCAweDIyQywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfV1BfQl9fRU1JX05BTkRGX1dQX0IJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfV1BfQl9fR1BJTzZfOQkJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfV1BfQl9fVVNCUEhZMV9WU1RBVFVTXzIJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfUkIwX19FTUlfTkFOREZfUkJfMAlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9SQjBfX0dQSU82XzEwCQlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9SQjBfX1VTQlBIWTFfVlNUQVRVU18zCUlPTVVYX1BBRCgweDVBQywgMHgyMzQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMF9fRU1JX05BTkRGX0NTXzAJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MwX19HUElPNl8xMQkJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MwX19VU0JQSFkxX1ZTVEFUVVNfNAlJT01VWF9QQUQoMHg1QjAsIDB4MjM4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzFfX0VNSV9OQU5ERl9DU18xCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMV9fR1BJTzZfMTQJCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMV9fTUxCX01MQkNMSwkJSU9NVVhfUEFEKDB4NUI0LCAweDIzQywgNiwgMHg4NTgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzFfX1VTQlBIWTFfVlNUQVRVU181CUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTMl9fRU1JX05BTkRGX0NTXzIJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19HUElPNl8xNQkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19JUFVfU0lTR18wCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzJfX0VTQUkxX1RYMAkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgMywgMHg3RTQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzJfX0VNSV9XRUlNX0NSRQkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19DQ01fQ1NJMF9NQ0xLCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzJfX01MQl9NTEJTSUcJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDYsIDB4ODYwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MyX19VU0JQSFkxX1ZTVEFUVVNfNglJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9OQU5ERl9DU18zCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTM19fR1BJTzZfMTYJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX05BTkRGX0NTM19fSVBVX1NJU0dfMQkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MzX19FU0FJMV9UWDEJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDMsIDB4N0U4LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MzX19FTUlfV0VJTV9BXzI2CQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9OQU5ERl9DUzNfX01MQl9NTEJEQVQJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDYsIDB4ODVDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfTkFOREZfQ1MzX19VU0JQSFkxX1ZTVEFUVVNfNwlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURJT19fRkVDX01ESU8JCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDAsIDB4ODA0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01ESU9fX0dQSU8xXzIyCQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01ESU9fX0VTQUkxX1NDS1IJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDIsIDB4N0RDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01ESU9fX0ZFQ19DT0wJCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCAzLCAweDgwMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19SVENfQ0VfUlRDX1BTMgkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01ESU9fX1NETUFfREVCVUdfQlVTX0RFVklDRV8zCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRElPX19FTUlfRU1JX0RFQlVHXzQ5CUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19GRUNfVFhfQ0xLCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fR1BJTzFfMjMJCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FU0FJMV9GU1IJCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDIsIDB4N0NDLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JFRl9DTEtfX1NETUFfREVCVUdfQlVTX0RFVklDRV80CUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FTUlfRU1JX0RFQlVHXzUwCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWF9FUl9fRkVDX1JYX0VSCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhfRVJfX0dQSU8xXzI0CQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhfRVJfX0VTQUkxX0hDS1IJCUlPTVVYX1BBRCgweDVDQywgMHgyNTAsIDIsIDB4N0Q0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfQ0xLCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAzLCAweDgwOCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWF9FUl9fUlRDX0NFX1JUQ19QUzMJCUlPTVVYX1BBRCgweDVDQywgMHgyNTAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19DUlNfRFZfX0ZFQ19SWF9EVgkJSU9NVVhfUEFEKDB4NUQwLCAweDI1NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX0NSU19EVl9fR1BJTzFfMjUJCUlPTVVYX1BBRCgweDVEMCwgMHgyNTQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19DUlNfRFZfX0VTQUkxX1NDS1QJCUlPTVVYX1BBRCgweDVEMCwgMHgyNTQsIDIsIDB4N0UwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDFfX0ZFQ19SREFUQV8xCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMV9fR1BJTzFfMjYJCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMV9fRVNBSTFfRlNUCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAyLCAweDdEMCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWEQxX19NTEJfTUxCU0lHCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCAzLCAweDg2MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19SWEQxX19SVENfQ0VfUlRDX1BTMQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1JYRDBfX0ZFQ19SREFUQV8wCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMF9fR1BJTzFfMjcJCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMF9fRVNBSTFfSENLVAkJSU9NVVhfUEFEKDB4NUQ4LCAweDI1QywgMiwgMHg3RDgsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfUlhEMF9fT1NDMzJrXzMyS19PVVQJCUlPTVVYX1BBRCgweDVEOCwgMHgyNUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOCQlJT01VWF9QQUQoMHg1REMsIDB4MjYwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhfRU5fX0dQSU8xXzI4CQlJT01VWF9QQUQoMHg1REMsIDB4MjYwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhfRU5fX0VTQUkxX1RYM19SWDIJCUlPTVVYX1BBRCgweDVEQywgMHgyNjAsIDIsIDB4N0YwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX1RYRDFfX0ZFQ19UREFUQV8xCQlJT01VWF9QQUQoMHg1RTAsIDB4MjY0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMV9fR1BJTzFfMjkJCQlJT01VWF9QQUQoMHg1RTAsIDB4MjY0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMV9fRVNBSTFfVFgyX1JYMwkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMiwgMHg3RUMsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMV9fTUxCX01MQkNMSwkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMywgMHg4NTgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMV9fUlRDX0NFX1JUQ19QUlNDX0NMSwlJT01VWF9QQUQoMHg1RTAsIDB4MjY0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfVFhEMF9fRkVDX1REQVRBXzAJCUlPTVVYX1BBRCgweDVFNCwgMHgyNjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19UWEQwX19HUElPMV8zMAkJCUlPTVVYX1BBRCgweDVFNCwgMHgyNjgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19UWEQwX19FU0FJMV9UWDRfUlgxCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAyLCAweDdGNCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19UWEQwX19VU0JQSFkyX0RBVEFPVVRfMAlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURDX19GRUNfTURDCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01EQ19fR1BJTzFfMzEJCQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURDX19FU0FJMV9UWDVfUlgwCQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCAyLCAweDdGOCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0ZFQ19NRENfX01MQl9NTEJEQVQJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDMsIDB4ODVDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfRkVDX01EQ19fUlRDX0NFX1JUQ19BTEFSTTFfVFJJRwlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9GRUNfTURDX19VU0JQSFkyX0RBVEFPVVRfMQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1dfX1BBVEFfRElPVwkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9XX19HUElPNl8xNwkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9XX19VQVJUMV9UWERfTVVYCUlPTVVYX1BBRCgweDVGMCwgMHgyNzAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPV19fVVNCUEhZMl9EQVRBT1VUXzIJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFDS19fUEFUQV9ETUFDSwkJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFDS19fR1BJTzZfMTgJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BQ0tfX1VBUlQxX1JYRF9NVVgJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgMywgMHg4NzgsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQUNLX19VU0JQSFkyX0RBVEFPVVRfMwlJT01VWF9QQUQoMHg1RjQsIDB4Mjc0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19QQVRBX0RNQVJRCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19HUElPN18wCQlJT01VWF9QQUQoMHg1RjgsIDB4Mjc4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RNQVJRX19VQVJUMl9UWERfTVVYCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRE1BUlFfX0NDTV9DQ01fT1VUXzAJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ETUFSUV9fVVNCUEhZMl9EQVRBT1VUXzQJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1BBVEFfQlVGRkVSX0VOCUlPTVVYX1BBRCgweDVGQywgMHgyN0MsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19HUElPN18xCQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fVUFSVDJfUlhEX01VWAlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCAzLCAweDg4MCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19DQ01fQ0NNX09VVF8xCUlPTVVYX1BBRCgweDVGQywgMHgyN0MsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VU0JQSFkyX0RBVEFPVVRfNQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19QQVRBX0lOVFJRCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19HUElPN18yCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0lOVFJRX19VQVJUMl9DVFMJCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU5UUlFfX0NBTjFfVFhDQU4JCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU5UUlFfX0NDTV9DQ01fT1VUXzIJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JTlRSUV9fVVNCUEhZMl9EQVRBT1VUXzYJSU9NVVhfUEFEKDB4NjAwLCAweDI4MCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9ESU9SX19QQVRBX0RJT1IJCUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPUl9fR1BJTzdfMwkJCUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPUl9fVUFSVDJfUlRTCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAzLCAweDg3QywgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfRElPUl9fQ0FOMV9SWENBTgkJSU9NVVhfUEFEKDB4NjA0LCAweDI4NCwgNCwgMHg3NjAsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RJT1JfX1VTQlBIWTJfREFUQU9VVF83CUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fUEFUQV9QQVRBX1JFU0VUX0IJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9SRVNFVF9CX19HUElPN180CQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0VTREhDM19DTUQJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fVUFSVDFfQ1RTCQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0NBTjJfVFhDQU4JCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fVVNCUEhZMV9EQVRBT1VUXzAJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JT1JEWV9fUEFUQV9JT1JEWQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JT1JEWV9fR1BJTzdfNQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JT1JEWV9fRVNESEMzX0NMSwkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JT1JEWV9fVUFSVDFfUlRTCQlJT01VWF9QQUQoMHg2MEMsIDB4MjhDLCAzLCAweDg3NCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfSU9SRFlfX0NBTjJfUlhDQU4JCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDQsIDB4NzY0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9JT1JEWV9fVVNCUEhZMV9EQVRBT1VUXzEJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMF9fR1BJTzdfNgkJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8wX19FU0RIQzNfUlNUCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzBfX09XSVJFX0xJTkUJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDQsIDB4ODY0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8wX19VU0JQSFkxX0RBVEFPVVRfMglJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzFfX1BBVEFfREFfMQkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8xX19HUElPN183CQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzFfX0VTREhDNF9DTUQJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMV9fVUFSVDNfQ1RTCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzFfX1VTQlBIWTFfREFUQU9VVF8zCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMl9fUEFUQV9EQV8yCQlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBXzJfX0dQSU83XzgJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFfMl9fRVNESEM0X0NMSwkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8yX19VQVJUM19SVFMJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDQsIDB4ODg0LCA1LCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQV8yX19VU0JQSFkxX0RBVEFPVVRfNAlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzBfX1BBVEFfQ1NfMAkJSU9NVVhfUEFEKDB4NjFDLCAweDI5QywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18wX19HUElPN185CQkJSU9NVVhfUEFEKDB4NjFDLCAweDI5QywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18wX19VQVJUM19UWERfTVVYCQlJT01VWF9QQUQoMHg2MUMsIDB4MjlDLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzBfX1VTQlBIWTFfREFUQU9VVF81CUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfQ1NfMV9fUEFUQV9DU18xCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzFfX0dQSU83XzEwCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0NTXzFfX1VBUlQzX1JYRF9NVVgJCUlPTVVYX1BBRCgweDYyMCwgMHgyQTAsIDQsIDB4ODg4LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9DU18xX19VU0JQSFkxX0RBVEFPVVRfNglJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEwX19QQVRBX0RBVEFfMAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMF9fR1BJTzJfMAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMF9fRU1JX05BTkRGX0RfMAlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEwX19FU0RIQzNfREFUNAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMF9fR1BVM2RfR1BVX0RFQlVHX09VVF8wCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTBfX0lQVV9ESUFHX0JVU18wCUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTBfX1VTQlBIWTFfREFUQU9VVF83CUlPTVVYX1BBRCgweDYyOCwgMHgyQTQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTFfX1BBVEFfREFUQV8xCQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExX19HUElPMl8xCQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExX19FTUlfTkFOREZfRF8xCUlPTVVYX1BBRCgweDYyQywgMHgyQTgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTFfX0VTREhDM19EQVQ1CQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExX19HUFUzZF9HUFVfREVCVUdfT1VUXzEJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMV9fSVBVX0RJQUdfQlVTXzEJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMl9fUEFUQV9EQVRBXzIJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTJfX0dQSU8yXzIJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTJfX0VNSV9OQU5ERl9EXzIJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMl9fRVNESEMzX0RBVDYJCUlPTVVYX1BBRCgweDYzMCwgMHgyQUMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTJfX0dQVTNkX0dQVV9ERUJVR19PVVRfMglJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEyX19JUFVfRElBR19CVVNfMglJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEzX19QQVRBX0RBVEFfMwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBM19fR1BJTzJfMwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBM19fRU1JX05BTkRGX0RfMwlJT01VWF9QQUQoMHg2MzQsIDB4MkIwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEEzX19FU0RIQzNfREFUNwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBM19fR1BVM2RfR1BVX0RFQlVHX09VVF8zCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTNfX0lQVV9ESUFHX0JVU18zCUlPTVVYX1BBRCgweDYzNCwgMHgyQjAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTRfX1BBVEFfREFUQV80CQlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE0X19HUElPMl80CQlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE0X19FTUlfTkFOREZfRF80CUlPTVVYX1BBRCgweDYzOCwgMHgyQjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTRfX0VTREhDNF9EQVQ0CQlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE0X19HUFUzZF9HUFVfREVCVUdfT1VUXzQJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNF9fSVBVX0RJQUdfQlVTXzQJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fUEFUQV9EQVRBXzUJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fR1BJTzJfNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fRU1JX05BTkRGX0RfNQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE1X19FU0RIQzRfREFUNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNV9fR1BVM2RfR1BVX0RFQlVHX09VVF81CUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTVfX0lQVV9ESUFHX0JVU181CUlPTVVYX1BBRCgweDYzQywgMHgyQjgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX1BBVEFfREFUQV82CUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0dQSU8yXzYJCUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0VNSV9OQU5ERl9EXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBNl9fRVNESEM0X0RBVDYJCUlPTVVYX1BBRCgweDY0MCwgMHgyQkMsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTZfX0dQVTNkX0dQVV9ERUJVR19PVVRfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE2X19JUFVfRElBR19CVVNfNglJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE3X19QQVRBX0RBVEFfNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBN19fR1BJTzJfNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBN19fRU1JX05BTkRGX0RfNwlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE3X19FU0RIQzRfREFUNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBN19fR1BVM2RfR1BVX0RFQlVHX09VVF83CUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTdfX0lQVV9ESUFHX0JVU183CUlPTVVYX1BBRCgweDY0NCwgMHgyQzAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQThfX1BBVEFfREFUQV84CQlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE4X19HUElPMl84CQlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzFfREFUNAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOF9fRU1JX05BTkRGX0RfOAlJT01VWF9QQUQoMHg2NDgsIDB4MkM0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzNfREFUMAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOF9fR1BVM2RfR1BVX0RFQlVHX09VVF84CUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQThfX0lQVV9ESUFHX0JVU184CUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTlfX1BBVEFfREFUQV85CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE5X19HUElPMl85CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE5X19FU0RIQzFfREFUNQkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOV9fRU1JX05BTkRGX0RfOQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEE5X19FU0RIQzNfREFUMQkJSU9NVVhfUEFEKDB4NjRDLCAweDJDOCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBOV9fR1BVM2RfR1BVX0RFQlVHX09VVF85CUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTlfX0lQVV9ESUFHX0JVU185CUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEwX19QQVRBX0RBVEFfMTAJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTBfX0dQSU8yXzEwCQlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMxX0RBVDYJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEwX19FTUlfTkFOREZfRF8xMAlJT01VWF9QQUQoMHg2NTAsIDB4MkNDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMzX0RBVDIJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzEwCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEwX19JUFVfRElBR19CVVNfMTAJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTFfX1BBVEFfREFUQV8xMQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BJTzJfMTEJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzFfREFUNwkJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTFfX0VNSV9OQU5ERl9EXzExCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzNfREFUMwkJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTEJSU9NVVhfUEFEKDB4NjU0LCAweDJEMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTFfX0lQVV9ESUFHX0JVU18xMQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fUEFUQV9EQVRBXzEyCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEyX19HUElPMl8xMgkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDMl9EQVQ0CQlJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fRU1JX05BTkRGX0RfMTIJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDNF9EQVQwCQlJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMglJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fSVBVX0RJQUdfQlVTXzEyCUlPTVVYX1BBRCgweDY1OCwgMHgyRDQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEzX19QQVRBX0RBVEFfMTMJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTNfX0dQSU8yXzEzCQlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEMyX0RBVDUJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEzX19FTUlfTkFOREZfRF8xMwlJT01VWF9QQUQoMHg2NUMsIDB4MkQ4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEM0X0RBVDEJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzEzCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTEzX19JUFVfRElBR19CVVNfMTMJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTRfX1BBVEFfREFUQV8xNAlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BJTzJfMTQJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzJfREFUNgkJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTRfX0VNSV9OQU5ERl9EXzE0CUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzRfREFUMgkJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTQJSU9NVVhfUEFEKDB4NjYwLCAweDJEQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTRfX0lQVV9ESUFHX0JVU18xNAlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fUEFUQV9EQVRBXzE1CUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1BBVEFfREFUQTE1X19HUElPMl8xNQkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDMl9EQVQ3CQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fRU1JX05BTkRGX0RfMTUJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDNF9EQVQzCQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fSVBVX0RJQUdfQlVTXzE1CUlPTVVYX1BBRCgweDY2NCwgMHgyRTAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMF9fRVNESEMxX0RBVDAJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEwX19HUElPMV8xNglJT01VWF9QQUQoMHg2NkMsIDB4MkU0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTBfX0dQVF9DQVBJTjEJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEwX19DU1BJX01JU08JSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgNSwgMHg3ODQsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTBfX0NDTV9QTEwzX0JZUAlJT01VWF9QQUQoMHg2NkMsIDB4MkU0LCA3LCAweDc3OCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMV9fRVNESEMxX0RBVDEJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEExX19HUElPMV8xNwlJT01VWF9QQUQoMHg2NzAsIDB4MkU4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTFfX0dQVF9DQVBJTjIJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEExX19DU1BJX1NTMAlJT01VWF9QQUQoMHg2NzAsIDB4MkU4LCA1LCAweDc4QywgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMV9fQ0NNX1BMTDRfQllQCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDcsIDB4NzdDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NNRF9fRVNESEMxX0NNRAlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCBJT01VWF9DT05GSUdfU0lPTiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0NNRF9fR1BJTzFfMTgJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTURfX0dQVF9DTVBPVVQxCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTURfX0NTUElfTU9TSQkJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgNSwgMHg3ODgsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ01EX19DQ01fUExMMV9CWVAJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgNywgMHg3NzAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX0VTREhDMV9EQVQyCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX0dQSU8xXzE5CQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX0dQVF9DTVBPVVQyCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX1BXTTJfUFdNTwkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19XRE9HMV9XRE9HX0IJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBMl9fQ1NQSV9TUzEJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDUsIDB4NzkwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEyX19XRE9HMV9XRE9HX1JTVF9CX0RFQglJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTJfX0NDTV9QTEwyX0JZUAkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNywgMHg3NzQsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19FU0RIQzFfQ0xLCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTEtfX0dQSU8xXzIwCQlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19PU0MzMmtfMzJLX09VVAlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19HUFRfQ0xLSU4JCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9DTEtfX0NTUElfU0NMSwkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgNSwgMHg3ODAsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfQ0xLX19TQVRBX1BIWV9EVEJfMAlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX0VTREhDMV9EQVQzCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMV9EQVRBM19fR1BJTzFfMjEJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19HUFRfQ01QT1VUMwlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAyLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX1BXTTFfUFdNTwlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX1dET0cyX1dET0dfQglJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX0NTUElfU1MyCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDUsIDB4Nzk0LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QxX0RBVEEzX19XRE9HMl9XRE9HX1JTVF9CX0RFQglJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDFfREFUQTNfX1NBVEFfUEhZX0RUQl8xCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTEtfX0VTREhDMl9DTEsJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NMS19fR1BJTzFfMTAJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTEtfX0tQUF9DT0xfNQkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgMiwgMHg4NDAsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ0xLX19BVURNVVhfQVVENF9SWEZTCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDMsIDB4NzNDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NMS19fQ1NQSV9TQ0xLCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCA1LCAweDc4MCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTEtfX1NDQ19SQU5ET01fVglJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ01EX19FU0RIQzJfQ01ECUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9DTURfX0dQSU8xXzExCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ01EX19LUFBfUk9XXzUJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMiwgMHg4NEMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ01EX19BVURNVVhfQVVENF9SWEMJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMywgMHg3MzgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfQ01EX19DU1BJX01PU0kJCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDUsIDB4Nzg4LCAzLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0NNRF9fU0NDX1JBTkRPTQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTNfX0VTREhDMl9EQVQzCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDAsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBM19fR1BJTzFfMTIJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEzX19LUFBfQ09MXzYJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMiwgMHg4NDQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTNfX0FVRE1VWF9BVUQ0X1RYQwlJT01VWF9QQUQoMHg2OTAsIDB4MzA0LCAzLCAweDc0MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgNSwgMHg3OTQsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTNfX1NKQ19ET05FCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMl9fRVNESEMyX0RBVDIJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEyX19HUElPMV8xMwlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTJfX0tQUF9ST1dfNglJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAyLCAweDg1MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMl9fQVVETVVYX0FVRDRfVFhECUlPTVVYX1BBRCgweDY5NCwgMHgzMDgsIDMsIDB4NzM0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEyX19DU1BJX1NTMQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCA1LCAweDc5MCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMl9fU0pDX0ZBSUwJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEExX19FU0RIQzJfREFUMQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAwLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTFfX0dQSU8xXzE0CUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMV9fS1BQX0NPTF83CUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDIsIDB4ODQ4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEExX19BVURNVVhfQVVENF9UWEZTCUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDMsIDB4NzQ0LCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEExX19DU1BJX1NTMAlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCA1LCAweDc4QywgNCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMV9fUlRJQ19TRUNfVklPCUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMF9fRVNESEMyX0RBVDAJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEwX19HUElPMV8xNQlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTBfX0tQUF9ST1dfNwlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAyLCAweDg1NCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX1NEMl9EQVRBMF9fQVVETVVYX0FVRDRfUlhECUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDMsIDB4NzMwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfU0QyX0RBVEEwX19DU1BJX01JU08JSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgNSwgMHg3ODQsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9TRDJfREFUQTBfX1JUSUNfRE9ORV9JTlQJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19DQ01fQ0xLTwkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19HUElPMV8wCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzBfX0tQUF9DT0xfNQkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMiwgMHg4NDAsIDMsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzBfX0NDTV9TU0lfRVhUMV9DTEsJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18wX19FUElUMV9FUElUTwlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzBfX1NSVENfQUxBUk1fREVCCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMF9fVVNCT0gzX1VTQkgxX1BXUglJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzBfX0NTVV9URAkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgNywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xX19FU0FJMV9TQ0tSCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCAwLCAweDdEQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fR1BJTzFfMQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xX19LUFBfUk9XXzUJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDIsIDB4ODRDLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xX19DQ01fU1NJX0VYVDJfQ0xLCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fUFdNMl9QV01PCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fV0RPRzJfV0RPR19CCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMV9fRVNESEMxX0NECQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzFfX1NSQ19URVNURVJfQUNLCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fRVNBSTFfRlNSCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCAwLCAweDdDQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOV9fR1BJTzFfOQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19LUFBfQ09MXzYJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDIsIDB4ODQ0LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19DQ01fUkVGX0VOX0IJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19QV00xX1BXTU8JSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19XRE9HMV9XRE9HX0IJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19FU0RIQzFfV1AJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDYsIDB4N0ZDLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT185X19TQ0NfRkFJTF9TVEFURQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzNfX0VTQUkxX0hDS1IJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDAsIDB4N0Q0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19HUElPMV8zCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzNfX0kyQzNfU0NMCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAyIHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19EUExMSVAxX1RPR19FTglJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzNfX0NDTV9DTEtPMgkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18zX19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMAlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzNfX1VTQk9IM19VU0JIMV9PQwlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA2LCAweDhBMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fM19fTUxCX01MQkNMSwkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgNywgMHg4NTgsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzZfX0VTQUkxX1NDS1QJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDAsIDB4N0UwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19HUElPMV82CQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzZfX0kyQzNfU0RBCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAyIHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19DQ01fQ0NNX09VVF8wCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDMsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNl9fQ1NVX0NTVV9JTlRfREVCCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDEJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT182X19FU0RIQzJfTENUTAlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCA2LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzZfX01MQl9NTEJTSUcJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDcsIDB4ODYwLCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19FU0FJMV9GU1QJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDAsIDB4N0QwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19HUElPMV8yCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzJfX0tQUF9ST1dfNgkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgMiwgMHg4NTAsIDIsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzJfX0NDTV9DQ01fT1VUXzEJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19DU1VfQ1NVX0FMQVJNX0FVVF8wCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDIJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18yX19FU0RIQzJfV1AJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMl9fTUxCX01MQkRBVAlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA3LCAweDg1QywgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNF9fRVNBSTFfSENLVAkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgMCwgMHg3RDgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0dQSU8xXzQJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNF9fS1BQX0NPTF83CQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCAyLCAweDg0OCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNF9fQ0NNX0NDTV9PVVRfMglJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0NTVV9DU1VfQUxBUk1fQVVUXzEJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT180X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMwlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzRfX0VTREhDMl9DRAkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT180X19TQ0NfU0VDX1NUQVRFCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fRVNBSTFfVFgyX1JYMwlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCAwLCAweDdFQywgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fR1BJTzFfNQkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT181X19LUFBfUk9XXzcJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDIsIDB4ODU0LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT181X19DQ01fQ0xLTwkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgMywgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT181X19DU1VfQ1NVX0FMQVJNX0FVVF8yCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDQsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDQJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT181X19JMkMzX1NDTAkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyNCwgMiwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fNV9fQ0NNX1BMTDFfQllQCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDcsIDB4NzcwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19FU0FJMV9UWDRfUlgxCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDAsIDB4N0Y0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19HUElPMV83CQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX0VQSVQxX0VQSVRPCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fQ0FOMV9UWENBTglJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAzLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVgJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT183X19GSVJJX1JYRAkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNSwgMHg4MEMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fN19fQ0NNX1BMTDJfQllQCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDcsIDB4Nzc0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT184X19FU0FJMV9UWDVfUlgwCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDAsIDB4N0Y4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT184X19HUElPMV84CQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAxLCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzhfX0VQSVQyX0VQSVRPCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDIsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fQ0FOMV9SWENBTglJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAzLCAweDc2MCwgMywgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fVUFSVDJfUlhEX01VWAlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCA0LCAweDg4MCwgNSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fRklSSV9UWEQJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDUsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fOF9fU1BESUZfU1JDTEsJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT184X19DQ01fUExMM19CWVAJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgNywgMHg3NzgsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE2X19FU0FJMV9UWDNfUlgyCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDAsIDB4N0YwLCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xNl9fR1BJTzdfMTEJCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX1RaSUNfUFdSRkFJTF9JTlQJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgMiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xNl9fUlRDX0NFX1JUQ19FWFRfVFJJRzEJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xNl9fU1BESUZfSU4xCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA1LCAweDg3MCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTZfX0kyQzNfU0RBCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA2IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAyLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xNl9fU0pDX0RFX0IJCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDcsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX0VTQUkxX1RYMAkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMCwgMHg3RTQsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19HUElPN18xMgkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMSwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xN19fU0RNQV9FWFRfRVZFTlRfMAlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCAyLCAweDg2OCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX0dQQ19QTUlDX1JEWQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCAzLCAweDgxMCwgMSwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX1JUQ19DRV9SVENfRlNWX1RSSUcJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgNCwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xN19fU1BESUZfT1VUMQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA1LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE3X19JUFVfU05PT1AyCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDYsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMTdfX1NKQ19KVEFHX0FDVAlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA3LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE4X19FU0FJMV9UWDEJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDAsIDB4N0U4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fR1BJTzdfMTMJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDEsIDB4MCwgMCwgMCkKLSNkZWZpbmUgX01YNTNfUEFEX0dQSU9fMThfX1NETUFfRVhUX0VWRU5UXzEJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgMiwgMHg4NkMsIDEsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE4X19PV0lSRV9MSU5FCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDMsIDB4ODY0LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fUlRDX0NFX1JUQ19BTEFSTTJfVFJJRwlJT01VWF9QQUQoMHg2RDQsIDB4MzQ0LCA0LCAweDAsIDAsIDApCi0jZGVmaW5lIF9NWDUzX1BBRF9HUElPXzE4X19DQ01fQVNSQ19FWFRfQ0xLCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDUsIDB4NzY4LCAxLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fRVNESEMxX0xDVEwJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgNiwgMHgwLCAwLCAwKQotI2RlZmluZSBfTVg1M19QQURfR1BJT18xOF9fU1JDX1NZU1RFTV9SU1QJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgNywgMHgwLCAwLCAwKQogCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX0tQUF9DT0xfNQkJKF9NWDUzX1BBRF9HUElPXzE5X19LUFBfQ09MXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19HUElPNF81CQkoX01YNTNfUEFEX0dQSU9fMTlfX0dQSU80XzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19DQ01fQ0xLTwkJKF9NWDUzX1BBRF9HUElPXzE5X19DQ01fQ0xLTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX1NQRElGX09VVDEJCShfTVg1M19QQURfR1BJT18xOV9fU1BESUZfT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX1JUQ19DRV9SVENfRVhUX1RSSUcyCQkoX01YNTNfUEFEX0dQSU9fMTlfX1JUQ19DRV9SVENfRVhUX1RSSUcyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fRUNTUEkxX1JEWQkJKF9NWDUzX1BBRF9HUElPXzE5X19FQ1NQSTFfUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fRkVDX1REQVRBXzMJCShfTVg1M19QQURfR1BJT18xOV9fRkVDX1REQVRBXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19TUkNfSU5UX0JPT1QJCShfTVg1M19QQURfR1BJT18xOV9fU1JDX0lOVF9CT09UIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0tQUF9DT0xfMAkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fS1BQX0NPTF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0dQSU80XzYJCShfTVg1M19QQURfS0VZX0NPTDBfX0dQSU80XzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fQVVETVVYX0FVRDVfVFhDCQkoX01YNTNfUEFEX0tFWV9DT0wwX19BVURNVVhfQVVENV9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fVUFSVDRfVFhEX01VWAkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fVUFSVDRfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fRUNTUEkxX1NDTEsJCShfTVg1M19QQURfS0VZX0NPTDBfX0VDU1BJMV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0ZFQ19SREFUQV8zCQkoX01YNTNfUEFEX0tFWV9DT0wwX19GRUNfUkRBVEFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19TUkNfQU5ZX1BVX1JTVAkJKF9NWDUzX1BBRF9LRVlfQ09MMF9fU1JDX0FOWV9QVV9SU1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fS1BQX1JPV18wCQkoX01YNTNfUEFEX0tFWV9ST1cwX19LUFBfUk9XXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fR1BJTzRfNwkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fR1BJTzRfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19BVURNVVhfQVVENV9UWEQJCShfTVg1M19QQURfS0VZX1JPVzBfX0FVRE1VWF9BVUQ1X1RYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYCQkoX01YNTNfUEFEX0tFWV9ST1cwX19VQVJUNF9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19FQ1NQSTFfTU9TSQkJKF9NWDUzX1BBRF9LRVlfUk9XMF9fRUNTUEkxX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMF9fRkVDX1RYX0VSCQkoX01YNTNfUEFEX0tFWV9ST1cwX19GRUNfVFhfRVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fS1BQX0NPTF8xCQkoX01YNTNfUEFEX0tFWV9DT0wxX19LUFBfQ09MXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fR1BJTzRfOAkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fR1BJTzRfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTCQkoX01YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX1VBUlQ1X1RYRF9NVVgJCShfTVg1M19QQURfS0VZX0NPTDFfX1VBUlQ1X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0VDU1BJMV9NSVNPCQkoX01YNTNfUEFEX0tFWV9DT0wxX19FQ1NQSTFfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19GRUNfUlhfQ0xLCQkoX01YNTNfUEFEX0tFWV9DT0wxX19GRUNfUlhfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX1VTQlBIWTFfVFhSRUFEWQkJKF9NWDUzX1BBRF9LRVlfQ09MMV9fVVNCUEhZMV9UWFJFQURZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0tQUF9ST1dfMQkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fS1BQX1JPV18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0dQSU80XzkJCShfTVg1M19QQURfS0VZX1JPVzFfX0dQSU80XzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fQVVETVVYX0FVRDVfUlhECQkoX01YNTNfUEFEX0tFWV9ST1cxX19BVURNVVhfQVVENV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fVUFSVDVfUlhEX01VWAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fVUFSVDVfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fRUNTUEkxX1NTMAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fRUNTUEkxX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19GRUNfQ09MCQkoX01YNTNfUEFEX0tFWV9ST1cxX19GRUNfQ09MIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX1VTQlBIWTFfUlhWQUxJRAkJKF9NWDUzX1BBRF9LRVlfUk9XMV9fVVNCUEhZMV9SWFZBTElEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0tQUF9DT0xfMgkJKF9NWDUzX1BBRF9LRVlfQ09MMl9fS1BQX0NPTF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0dQSU80XzEwCQkoX01YNTNfUEFEX0tFWV9DT0wyX19HUElPNF8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19DQU4xX1RYQ0FOCQkoX01YNTNfUEFEX0tFWV9DT0wyX19DQU4xX1RYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19NRElPCQkoX01YNTNfUEFEX0tFWV9DT0wyX19GRUNfTURJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19FQ1NQSTFfU1MxCQkoX01YNTNfUEFEX0tFWV9DT0wyX19FQ1NQSTFfU1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19SREFUQV8yCQkoX01YNTNfUEFEX0tFWV9DT0wyX19GRUNfUkRBVEFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wyX19VU0JQSFkxX1JYQUNUSVZFCQkoX01YNTNfUEFEX0tFWV9DT0wyX19VU0JQSFkxX1JYQUNUSVZFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0tQUF9ST1dfMgkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fS1BQX1JPV18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0dQSU80XzExCQkoX01YNTNfUEFEX0tFWV9ST1cyX19HUElPNF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19DQU4xX1JYQ0FOCQkoX01YNTNfUEFEX0tFWV9ST1cyX19DQU4xX1JYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0ZFQ19NREMJCShfTVg1M19QQURfS0VZX1JPVzJfX0ZFQ19NREMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fRUNTUEkxX1NTMgkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fRUNTUEkxX1NTMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19GRUNfVERBVEFfMgkJKF9NWDUzX1BBRF9LRVlfUk9XMl9fRkVDX1REQVRBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fVVNCUEhZMV9SWEVSUk9SCQkoX01YNTNfUEFEX0tFWV9ST1cyX19VU0JQSFkxX1JYRVJST1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fS1BQX0NPTF8zCQkoX01YNTNfUEFEX0tFWV9DT0wzX19LUFBfQ09MXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fR1BJTzRfMTIJCShfTVg1M19QQURfS0VZX0NPTDNfX0dQSU80XzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX1VTQk9IM19IMl9EUAkJKF9NWDUzX1BBRF9LRVlfQ09MM19fVVNCT0gzX0gyX0RQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX1NQRElGX0lOMQkJKF9NWDUzX1BBRF9LRVlfQ09MM19fU1BESUZfSU4xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0kyQzJfU0NMCQkoX01YNTNfUEFEX0tFWV9DT0wzX19JMkMyX1NDTCB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fRUNTUEkxX1NTMwkJKF9NWDUzX1BBRF9LRVlfQ09MM19fRUNTUEkxX1NTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19GRUNfQ1JTCQkoX01YNTNfUEFEX0tFWV9DT0wzX19GRUNfQ1JTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX1VTQlBIWTFfU0lFQ0xPQ0sJCShfTVg1M19QQURfS0VZX0NPTDNfX1VTQlBIWTFfU0lFQ0xPQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fS1BQX1JPV18zCQkoX01YNTNfUEFEX0tFWV9ST1czX19LUFBfUk9XXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fR1BJTzRfMTMJCShfTVg1M19QQURfS0VZX1JPVzNfX0dQSU80XzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX1VTQk9IM19IMl9ETQkJKF9NWDUzX1BBRF9LRVlfUk9XM19fVVNCT0gzX0gyX0RNIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0NDTV9BU1JDX0VYVF9DTEsJCShfTVg1M19QQURfS0VZX1JPVzNfX0NDTV9BU1JDX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fSTJDMl9TREEJCShfTVg1M19QQURfS0VZX1JPVzNfX0kyQzJfU0RBIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19PU0MzMktfMzJLX09VVAkJKF9NWDUzX1BBRF9LRVlfUk9XM19fT1NDMzJLXzMyS19PVVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fQ0NNX1BMTDRfQllQCQkoX01YNTNfUEFEX0tFWV9ST1czX19DQ01fUExMNF9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fVVNCUEhZMV9MSU5FU1RBVEVfMAkJKF9NWDUzX1BBRF9LRVlfUk9XM19fVVNCUEhZMV9MSU5FU1RBVEVfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19LUFBfQ09MXzQJCShfTVg1M19QQURfS0VZX0NPTDRfX0tQUF9DT0xfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19HUElPNF8xNAkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fR1BJTzRfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTgkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fQ0FOMl9UWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19JUFVfU0lTR180CQkoX01YNTNfUEFEX0tFWV9DT0w0X19JUFVfU0lTR180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUwkJKF9NWDUzX1BBRF9LRVlfQ09MNF9fVUFSVDVfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VU0JPSDNfVVNCT1RHX09DCQkoX01YNTNfUEFEX0tFWV9DT0w0X19VU0JPSDNfVVNCT1RHX09DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VTQlBIWTFfTElORVNUQVRFXzEJCShfTVg1M19QQURfS0VZX0NPTDRfX1VTQlBIWTFfTElORVNUQVRFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fS1BQX1JPV180CQkoX01YNTNfUEFEX0tFWV9ST1c0X19LUFBfUk9XXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fR1BJTzRfMTUJCShfTVg1M19QQURfS0VZX1JPVzRfX0dQSU80XzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4JCShfTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNQkJKF9NWDUzX1BBRF9LRVlfUk9XNF9fSVBVX1NJU0dfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VQVJUNV9DVFMJCShfTVg1M19QQURfS0VZX1JPVzRfX1VBUlQ1X0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fVVNCT0gzX1VTQk9UR19QV1IJCShfTVg1M19QQURfS0VZX1JPVzRfX1VTQk9IM19VU0JPVEdfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX1VTQlBIWTFfVkJVU1ZBTElECQkoX01YNTNfUEFEX0tFWV9ST1c0X19VU0JQSFkxX1ZCVVNWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fSVBVX0RJMF9ESVNQX0NMSwkJKF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX0dQSU80XzE2CQkoX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fR1BJTzRfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX1VTQk9IM19VU0JIMl9ESVIJCShfTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JPSDNfVVNCSDJfRElSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMAkJKF9NWDUzX1BBRF9ESTBfRElTUF9DTEtfX1NETUFfREVCVUdfQ09SRV9TVEFURV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19FTUlfRU1JX0RFQlVHXzAJCShfTVg1M19QQURfREkwX0RJU1BfQ0xLX19FTUlfRU1JX0RFQlVHXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX1VTQlBIWTFfQVZBTElECQkoX01YNTNfUEFEX0RJMF9ESVNQX0NMS19fVVNCUEhZMV9BVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX0lQVV9ESTBfUElOMTUJCShfTVg1M19QQURfREkwX1BJTjE1X19JUFVfREkwX1BJTjE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19HUElPNF8xNwkJKF9NWDUzX1BBRF9ESTBfUElOMTVfX0dQSU80XzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19BVURNVVhfQVVENl9UWEMJCShfTVg1M19QQURfREkwX1BJTjE1X19BVURNVVhfQVVENl9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX1NETUFfREVCVUdfQ09SRV9TVEFURV8xCQkoX01YNTNfUEFEX0RJMF9QSU4xNV9fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX0VNSV9FTUlfREVCVUdfMQkJKF9NWDUzX1BBRF9ESTBfUElOMTVfX0VNSV9FTUlfREVCVUdfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fVVNCUEhZMV9CVkFMSUQJCShfTVg1M19QQURfREkwX1BJTjE1X19VU0JQSFkxX0JWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19JUFVfREkwX1BJTjIJCShfTVg1M19QQURfREkwX1BJTjJfX0lQVV9ESTBfUElOMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19HUElPNF8xOAkJKF9NWDUzX1BBRF9ESTBfUElOMl9fR1BJTzRfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fQVVETVVYX0FVRDZfVFhECQkoX01YNTNfUEFEX0RJMF9QSU4yX19BVURNVVhfQVVENl9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzIJCShfTVg1M19QQURfREkwX1BJTjJfX1NETUFfREVCVUdfQ09SRV9TVEFURV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX0VNSV9FTUlfREVCVUdfMgkJKF9NWDUzX1BBRF9ESTBfUElOMl9fRU1JX0VNSV9ERUJVR18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX1VTQlBIWTFfRU5EU0VTU0lPTgkJKF9NWDUzX1BBRF9ESTBfUElOMl9fVVNCUEhZMV9FTkRTRVNTSU9OIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX0lQVV9ESTBfUElOMwkJKF9NWDUzX1BBRF9ESTBfUElOM19fSVBVX0RJMF9QSU4zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX0dQSU80XzE5CQkoX01YNTNfUEFEX0RJMF9QSU4zX19HUElPNF8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19BVURNVVhfQVVENl9UWEZTCQkoX01YNTNfUEFEX0RJMF9QSU4zX19BVURNVVhfQVVENl9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX1NETUFfREVCVUdfQ09SRV9TVEFURV8zCQkoX01YNTNfUEFEX0RJMF9QSU4zX19TRE1BX0RFQlVHX0NPUkVfU1RBVEVfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19FTUlfRU1JX0RFQlVHXzMJCShfTVg1M19QQURfREkwX1BJTjNfX0VNSV9FTUlfREVCVUdfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19VU0JQSFkxX0lERElHCQkoX01YNTNfUEFEX0RJMF9QSU4zX19VU0JQSFkxX0lERElHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0lQVV9ESTBfUElONAkJKF9NWDUzX1BBRF9ESTBfUElONF9fSVBVX0RJMF9QSU40IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0dQSU80XzIwCQkoX01YNTNfUEFEX0RJMF9QSU40X19HUElPNF8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19BVURNVVhfQVVENl9SWEQJCShfTVg1M19QQURfREkwX1BJTjRfX0FVRE1VWF9BVUQ2X1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19FU0RIQzFfV1AJCShfTVg1M19QQURfREkwX1BJTjRfX0VTREhDMV9XUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19TRE1BX0RFQlVHX1lJRUxECQkoX01YNTNfUEFEX0RJMF9QSU40X19TRE1BX0RFQlVHX1lJRUxEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0VNSV9FTUlfREVCVUdfNAkJKF9NWDUzX1BBRF9ESTBfUElONF9fRU1JX0VNSV9ERUJVR180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX1VTQlBIWTFfSE9TVERJU0NPTk5FQ1QJCShfTVg1M19QQURfREkwX1BJTjRfX1VTQlBIWTFfSE9TVERJU0NPTk5FQ1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19JUFVfRElTUDBfREFUXzAJCShfTVg1M19QQURfRElTUDBfREFUMF9fSVBVX0RJU1AwX0RBVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fR1BJTzRfMjEJCShfTVg1M19QQURfRElTUDBfREFUMF9fR1BJTzRfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19DU1BJX1NDTEsJCShfTVg1M19QQURfRElTUDBfREFUMF9fQ1NQSV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fVVNCT0gzX1VTQkgyX0RBVEFfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JPSDNfVVNCSDJfREFUQV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fU0RNQV9ERUJVR19DT1JFX1JVTgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQwX19TRE1BX0RFQlVHX0NPUkVfUlVOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fRU1JX0VNSV9ERUJVR181CQkoX01YNTNfUEFEX0RJU1AwX0RBVDBfX0VNSV9FTUlfREVCVUdfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX1VTQlBIWTJfVFhSRUFEWQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JQSFkyX1RYUkVBRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19JUFVfRElTUDBfREFUXzEJCShfTVg1M19QQURfRElTUDBfREFUMV9fSVBVX0RJU1AwX0RBVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fR1BJTzRfMjIJCShfTVg1M19QQURfRElTUDBfREFUMV9fR1BJTzRfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19DU1BJX01PU0kJCShfTVg1M19QQURfRElTUDBfREFUMV9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fVVNCT0gzX1VTQkgyX0RBVEFfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JPSDNfVVNCSDJfREFUQV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMX1NFTAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfU0VMIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fRU1JX0VNSV9ERUJVR182CQkoX01YNTNfUEFEX0RJU1AwX0RBVDFfX0VNSV9FTUlfREVCVUdfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX1VTQlBIWTJfUlhWQUxJRAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JQSFkyX1JYVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19JUFVfRElTUDBfREFUXzIJCShfTVg1M19QQURfRElTUDBfREFUMl9fSVBVX0RJU1AwX0RBVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fR1BJTzRfMjMJCShfTVg1M19QQURfRElTUDBfREFUMl9fR1BJTzRfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19DU1BJX01JU08JCShfTVg1M19QQURfRElTUDBfREFUMl9fQ1NQSV9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fVVNCT0gzX1VTQkgyX0RBVEFfMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JPSDNfVVNCSDJfREFUQV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fU0RNQV9ERUJVR19NT0RFCQkoX01YNTNfUEFEX0RJU1AwX0RBVDJfX1NETUFfREVCVUdfTU9ERSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX0VNSV9FTUlfREVCVUdfNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyX19FTUlfRU1JX0RFQlVHXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19VU0JQSFkyX1JYQUNUSVZFCQkoX01YNTNfUEFEX0RJU1AwX0RBVDJfX1VTQlBIWTJfUlhBQ1RJVkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19JUFVfRElTUDBfREFUXzMJCShfTVg1M19QQURfRElTUDBfREFUM19fSVBVX0RJU1AwX0RBVF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fR1BJTzRfMjQJCShfTVg1M19QQURfRElTUDBfREFUM19fR1BJTzRfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19DU1BJX1NTMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQzX19DU1BJX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1VTQk9IM19VU0JIMl9EQVRBXzMJCShfTVg1M19QQURfRElTUDBfREFUM19fVVNCT0gzX1VTQkgyX0RBVEFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1NETUFfREVCVUdfQlVTX0VSUk9SCQkoX01YNTNfUEFEX0RJU1AwX0RBVDNfX1NETUFfREVCVUdfQlVTX0VSUk9SIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fRU1JX0VNSV9ERUJVR184CQkoX01YNTNfUEFEX0RJU1AwX0RBVDNfX0VNSV9FTUlfREVCVUdfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1VTQlBIWTJfUlhFUlJPUgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQzX19VU0JQSFkyX1JYRVJST1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19JUFVfRElTUDBfREFUXzQJCShfTVg1M19QQURfRElTUDBfREFUNF9fSVBVX0RJU1AwX0RBVF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fR1BJTzRfMjUJCShfTVg1M19QQURfRElTUDBfREFUNF9fR1BJTzRfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19DU1BJX1NTMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19DU1BJX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX1VTQk9IM19VU0JIMl9EQVRBXzQJCShfTVg1M19QQURfRElTUDBfREFUNF9fVVNCT0gzX1VTQkgyX0RBVEFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX1NETUFfREVCVUdfQlVTX1JXQgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19TRE1BX0RFQlVHX0JVU19SV0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzkJCShfTVg1M19QQURfRElTUDBfREFUNF9fRU1JX0VNSV9ERUJVR185IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fVVNCUEhZMl9TSUVDTE9DSwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JQSFkyX1NJRUNMT0NLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fSVBVX0RJU1AwX0RBVF81CQkoX01YNTNfUEFEX0RJU1AwX0RBVDVfX0lQVV9ESVNQMF9EQVRfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0dQSU80XzI2CQkoX01YNTNfUEFEX0RJU1AwX0RBVDVfX0dQSU80XzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fQ1NQSV9TUzIJCShfTVg1M19QQURfRElTUDBfREFUNV9fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JPSDNfVVNCSDJfREFUQV81CQkoX01YNTNfUEFEX0RJU1AwX0RBVDVfX1VTQk9IM19VU0JIMl9EQVRBXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19TRE1BX0RFQlVHX01BVENIRURfRE1CVVMJCShfTVg1M19QQURfRElTUDBfREFUNV9fU0RNQV9ERUJVR19NQVRDSEVEX0RNQlVTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fRU1JX0VNSV9ERUJVR18xMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19FTUlfRU1JX0RFQlVHXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fVVNCUEhZMl9MSU5FU1RBVEVfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ1X19VU0JQSFkyX0xJTkVTVEFURV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fSVBVX0RJU1AwX0RBVF82CQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX0lQVV9ESVNQMF9EQVRfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0dQSU80XzI3CQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX0dQSU80XzI3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fQ1NQSV9TUzMJCShfTVg1M19QQURfRElTUDBfREFUNl9fQ1NQSV9TUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JPSDNfVVNCSDJfREFUQV82CQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX1VTQk9IM19VU0JIMl9EQVRBXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19TRE1BX0RFQlVHX1JUQlVGRkVSX1dSSVRFCQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX1NETUFfREVCVUdfUlRCVUZGRVJfV1JJVEUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzExCQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX0VNSV9FTUlfREVCVUdfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JQSFkyX0xJTkVTVEFURV8xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDZfX1VTQlBIWTJfTElORVNUQVRFXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19JUFVfRElTUDBfREFUXzcJCShfTVg1M19QQURfRElTUDBfREFUN19fSVBVX0RJU1AwX0RBVF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fR1BJTzRfMjgJCShfTVg1M19QQURfRElTUDBfREFUN19fR1BJTzRfMjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19DU1BJX1JEWQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19DU1BJX1JEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQk9IM19VU0JIMl9EQVRBXzcJCShfTVg1M19QQURfRElTUDBfREFUN19fVVNCT0gzX1VTQkgyX0RBVEFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8wCQkoX01YNTNfUEFEX0RJU1AwX0RBVDdfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fRU1JX0VNSV9ERUJVR18xMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fVVNCUEhZMl9WQlVTVkFMSUQJCShfTVg1M19QQURfRElTUDBfREFUN19fVVNCUEhZMl9WQlVTVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19JUFVfRElTUDBfREFUXzgJCShfTVg1M19QQURfRElTUDBfREFUOF9fSVBVX0RJU1AwX0RBVF84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fR1BJTzRfMjkJCShfTVg1M19QQURfRElTUDBfREFUOF9fR1BJTzRfMjkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19QV00xX1BXTU8JCShfTVg1M19QQURfRElTUDBfREFUOF9fUFdNMV9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fV0RPRzFfV0RPR19CCQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX1dET0cxX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDhfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fRU1JX0VNSV9ERUJVR18xMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ4X19FTUlfRU1JX0RFQlVHXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fVVNCUEhZMl9BVkFMSUQJCShfTVg1M19QQURfRElTUDBfREFUOF9fVVNCUEhZMl9BVkFMSUQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19JUFVfRElTUDBfREFUXzkJCShfTVg1M19QQURfRElTUDBfREFUOV9fSVBVX0RJU1AwX0RBVF85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fR1BJTzRfMzAJCShfTVg1M19QQURfRElTUDBfREFUOV9fR1BJTzRfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19QV00yX1BXTU8JCShfTVg1M19QQURfRElTUDBfREFUOV9fUFdNMl9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fV0RPRzJfV0RPR19CCQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX1dET0cyX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8yCQkoX01YNTNfUEFEX0RJU1AwX0RBVDlfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fRU1JX0VNSV9ERUJVR18xNAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fVVNCUEhZMl9WU1RBVFVTXzAJCShfTVg1M19QQURfRElTUDBfREFUOV9fVVNCUEhZMl9WU1RBVFVTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fSVBVX0RJU1AwX0RBVF8xMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fSVBVX0RJU1AwX0RBVF8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19HUElPNF8zMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fR1BJTzRfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCT0gzX1VTQkgyX1NUUAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCT0gzX1VTQkgyX1NUUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18xNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEwX19VU0JQSFkyX1ZTVEFUVVNfMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCUEhZMl9WU1RBVFVTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fSVBVX0RJU1AwX0RBVF8xMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMV9fSVBVX0RJU1AwX0RBVF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19HUElPNV81CQkoX01YNTNfUEFEX0RJU1AwX0RBVDExX19HUElPNV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1VTQk9IM19VU0JIMl9OWFQJCShfTVg1M19QQURfRElTUDBfREFUMTFfX1VTQk9IM19VU0JIMl9OWFQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzQJCShfTVg1M19QQURfRElTUDBfREFUMTFfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX0VNSV9FTUlfREVCVUdfMTYJCShfTVg1M19QQURfRElTUDBfREFUMTFfX0VNSV9FTUlfREVCVUdfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fVVNCUEhZMl9WU1RBVFVTXzIJCShfTVg1M19QQURfRElTUDBfREFUMTFfX1VTQlBIWTJfVlNUQVRVU18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX0lQVV9ESVNQMF9EQVRfMTIJCShfTVg1M19QQURfRElTUDBfREFUMTJfX0lQVV9ESVNQMF9EQVRfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fR1BJTzVfNgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxMl9fR1BJTzVfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JPSDNfVVNCSDJfQ0xLCQkoX01YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JPSDNfVVNCSDJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX1NETUFfREVCVUdfRVZFTlRfQ0hBTk5FTF81CQkoX01YNTNfUEFEX0RJU1AwX0RBVDEyX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzE3CQkoX01YNTNfUEFEX0RJU1AwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX1VTQlBIWTJfVlNUQVRVU18zCQkoX01YNTNfUEFEX0RJU1AwX0RBVDEyX19VU0JQSFkyX1ZTVEFUVVNfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19JUFVfRElTUDBfREFUXzEzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDEzX19JUFVfRElTUDBfREFUXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX0dQSU81XzcJCShfTVg1M19QQURfRElTUDBfREFUMTNfX0dQSU81XzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fQVVETVVYX0FVRDVfUlhGUwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fQVVETVVYX0FVRDVfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fRU1JX0VNSV9ERUJVR18xOAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fRU1JX0VNSV9ERUJVR18xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19VU0JQSFkyX1ZTVEFUVVNfNAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxM19fVVNCUEhZMl9WU1RBVFVTXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fSVBVX0RJU1AwX0RBVF8xNAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fSVBVX0RJU1AwX0RBVF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19HUElPNV84CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE0X19HUElPNV84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX0FVRE1VWF9BVUQ1X1JYQwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNF9fQVVETVVYX0FVRDVfUlhDIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE0X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzE5CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTRfX1VTQlBIWTJfVlNUQVRVU181CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE0X19VU0JQSFkyX1ZTVEFUVVNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19JUFVfRElTUDBfREFUXzE1CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19JUFVfRElTUDBfREFUXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX0dQSU81XzkJCShfTVg1M19QQURfRElTUDBfREFUMTVfX0dQSU81XzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkxX1NTMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNV9fRUNTUEkxX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19FQ1NQSTJfU1MxCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19FQ1NQSTJfU1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU18yCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19FTUlfRU1JX0RFQlVHXzIwCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19FTUlfRU1JX0RFQlVHXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX1VTQlBIWTJfVlNUQVRVU182CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE1X19VU0JQSFkyX1ZTVEFUVVNfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19JUFVfRElTUDBfREFUXzE2CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE2X19JUFVfRElTUDBfREFUXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0dQSU81XzEwCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE2X19HUElPNV8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19FQ1NQSTJfTU9TSQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fRUNTUEkyX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fQVVETVVYX0FVRDVfVFhDCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE2X19BVURNVVhfQVVENV9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9FWFRfRVZFTlRfMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9FWFRfRVZFTlRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fRU1JX0VNSV9ERUJVR18yMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fRU1JX0VNSV9ERUJVR18yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE2X19VU0JQSFkyX1ZTVEFUVVNfNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxNl9fVVNCUEhZMl9WU1RBVFVTXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fSVBVX0RJU1AwX0RBVF8xNwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fSVBVX0RJU1AwX0RBVF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19HUElPNV8xMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fR1BJTzVfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fRUNTUEkyX01JU08JCShfTVg1M19QQURfRElTUDBfREFUMTdfX0VDU1BJMl9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX0FVRE1VWF9BVUQ1X1RYRAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxN19fQVVETVVYX0FVRDVfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfRVhUX0VWRU5UXzEJCShfTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfRVhUX0VWRU5UXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxN19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzQJCShfTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX0VNSV9FTUlfREVCVUdfMjIJCShfTVg1M19QQURfRElTUDBfREFUMTdfX0VNSV9FTUlfREVCVUdfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fSVBVX0RJU1AwX0RBVF8xOAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fSVBVX0RJU1AwX0RBVF8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19HUElPNV8xMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fR1BJTzVfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fRUNTUEkyX1NTMAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fRUNTUEkyX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENV9UWEZTCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE4X19BVURNVVhfQVVENV9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ0X1JYRlMJCShfTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ0X1JYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzUJCShfTVg1M19QQURfRElTUDBfREFUMThfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0VNSV9FTUlfREVCVUdfMjMJCShfTVg1M19QQURfRElTUDBfREFUMThfX0VNSV9FTUlfREVCVUdfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOF9fRU1JX1dFSU1fQ1NfMgkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOF9fRU1JX1dFSU1fQ1NfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19JUFVfRElTUDBfREFUXzE5CQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19JUFVfRElTUDBfREFUXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0dQSU81XzEzCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19HUElPNV8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19FQ1NQSTJfU0NMSwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fRUNTUEkyX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDVfUlhECQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19BVURNVVhfQVVENV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fQVVETVVYX0FVRDRfUlhDCQkoX01YNTNfUEFEX0RJU1AwX0RBVDE5X19BVURNVVhfQVVENF9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzYJCShfTVg1M19QQURfRElTUDBfREFUMTlfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9FTUlfREVCVUdfMjQJCShfTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9FTUlfREVCVUdfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fRU1JX1dFSU1fQ1NfMwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQxOV9fRU1JX1dFSU1fQ1NfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19JUFVfRElTUDBfREFUXzIwCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19JUFVfRElTUDBfREFUXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0dQSU81XzE0CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19HUElPNV8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIwX19FQ1NQSTFfU0NMSwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMF9fRUNTUEkxX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fQVVETVVYX0FVRDRfVFhDCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19BVURNVVhfQVVENF9UWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzcJCShfTVg1M19QQURfRElTUDBfREFUMjBfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0VNSV9FTUlfREVCVUdfMjUJCShfTVg1M19QQURfRElTUDBfREFUMjBfX0VNSV9FTUlfREVCVUdfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fU0FUQV9QSFlfVERJCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIwX19TQVRBX1BIWV9UREkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fSVBVX0RJU1AwX0RBVF8yMQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fSVBVX0RJU1AwX0RBVF8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19HUElPNV8xNQkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fR1BJTzVfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fRUNTUEkxX01PU0kJCShfTVg1M19QQURfRElTUDBfREFUMjFfX0VDU1BJMV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX0FVRE1VWF9BVUQ0X1RYRAkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fQVVETVVYX0FVRDRfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX1NETUFfREVCVUdfQlVTX0RFVklDRV8wCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIxX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19FTUlfRU1JX0RFQlVHXzI2CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIxX19FTUlfRU1JX0RFQlVHXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjFfX1NBVEFfUEhZX1RETwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMV9fU0FUQV9QSFlfVERPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0lQVV9ESVNQMF9EQVRfMjIJCShfTVg1M19QQURfRElTUDBfREFUMjJfX0lQVV9ESVNQMF9EQVRfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMl9fR1BJTzVfMTYJCShfTVg1M19QQURfRElTUDBfREFUMjJfX0dQSU81XzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0VDU1BJMV9NSVNPCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19FQ1NQSTFfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19BVURNVVhfQVVENF9UWEZTCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19BVURNVVhfQVVENF9UWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX1NETUFfREVCVUdfQlVTX0RFVklDRV8xCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIyX19FTUlfRU1JX0RFQlVHXzI3CQkoX01YNTNfUEFEX0RJU1AwX0RBVDIyX19FTUlfRU1JX0RFQlVHXzI3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX1NBVEFfUEhZX1RDSwkJKF9NWDUzX1BBRF9ESVNQMF9EQVQyMl9fU0FUQV9QSFlfVENLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0lQVV9ESVNQMF9EQVRfMjMJCShfTVg1M19QQURfRElTUDBfREFUMjNfX0lQVV9ESVNQMF9EQVRfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fR1BJTzVfMTcJCShfTVg1M19QQURfRElTUDBfREFUMjNfX0dQSU81XzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0VDU1BJMV9TUzAJCShfTVg1M19QQURfRElTUDBfREFUMjNfX0VDU1BJMV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fQVVETVVYX0FVRDRfUlhECQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19BVURNVVhfQVVENF9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fU0RNQV9ERUJVR19CVVNfREVWSUNFXzIJCShfTVg1M19QQURfRElTUDBfREFUMjNfX1NETUFfREVCVUdfQlVTX0RFVklDRV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0VNSV9FTUlfREVCVUdfMjgJCShfTVg1M19QQURfRElTUDBfREFUMjNfX0VNSV9FTUlfREVCVUdfMjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fU0FUQV9QSFlfVE1TCQkoX01YNTNfUEFEX0RJU1AwX0RBVDIzX19TQVRBX1BIWV9UTVMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1BJWENMS19fSVBVX0NTSTBfUElYQ0xLCQkoX01YNTNfUEFEX0NTSTBfUElYQ0xLX19JUFVfQ1NJMF9QSVhDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1BJWENMS19fR1BJTzVfMTgJCShfTVg1M19QQURfQ1NJMF9QSVhDTEtfX0dQSU81XzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX1NETUFfREVCVUdfUENfMAkJKF9NWDUzX1BBRF9DU0kwX1BJWENMS19fU0RNQV9ERUJVR19QQ18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX0VNSV9FTUlfREVCVUdfMjkJCShfTVg1M19QQURfQ1NJMF9QSVhDTEtfX0VNSV9FTUlfREVCVUdfMjkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0lQVV9DU0kwX0hTWU5DCQkoX01YNTNfUEFEX0NTSTBfTUNMS19fSVBVX0NTSTBfSFNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0dQSU81XzE5CQkoX01YNTNfUEFEX0NTSTBfTUNMS19fR1BJTzVfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0NDTV9DU0kwX01DTEsJCShfTVg1M19QQURfQ1NJMF9NQ0xLX19DQ01fQ1NJMF9NQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19TRE1BX0RFQlVHX1BDXzEJCShfTVg1M19QQURfQ1NJMF9NQ0xLX19TRE1BX0RFQlVHX1BDXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0VNSV9FTUlfREVCVUdfMzAJCShfTVg1M19QQURfQ1NJMF9NQ0xLX19FTUlfRU1JX0RFQlVHXzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19UUElVX1RSQ1RMCQkoX01YNTNfUEFEX0NTSTBfTUNMS19fVFBJVV9UUkNUTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fSVBVX0NTSTBfREFUQV9FTgkJKF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0lQVV9DU0kwX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0dQSU81XzIwCQkoX01YNTNfUEFEX0NTSTBfREFUQV9FTl9fR1BJTzVfMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX1NETUFfREVCVUdfUENfMgkJKF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX1NETUFfREVCVUdfUENfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fRU1JX0VNSV9ERUJVR18zMQkJKF9NWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0VNSV9FTUlfREVCVUdfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX1RQSVVfVFJDTEsJCShfTVg1M19QQURfQ1NJMF9EQVRBX0VOX19UUElVX1RSQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fSVBVX0NTSTBfVlNZTkMJCShfTVg1M19QQURfQ1NJMF9WU1lOQ19fSVBVX0NTSTBfVlNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19HUElPNV8yMQkJKF9NWDUzX1BBRF9DU0kwX1ZTWU5DX19HUElPNV8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfVlNZTkNfX1NETUFfREVCVUdfUENfMwkJKF9NWDUzX1BBRF9DU0kwX1ZTWU5DX19TRE1BX0RFQlVHX1BDXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19FTUlfRU1JX0RFQlVHXzMyCQkoX01YNTNfUEFEX0NTSTBfVlNZTkNfX0VNSV9FTUlfREVCVUdfMzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19UUElVX1RSQUNFXzAJCShfTVg1M19QQURfQ1NJMF9WU1lOQ19fVFBJVV9UUkFDRV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19JUFVfQ1NJMF9EXzQJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19JUFVfQ1NJMF9EXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0dQSU81XzIyCQkoX01YNTNfUEFEX0NTSTBfREFUNF9fR1BJTzVfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0tQUF9DT0xfNQkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX0tQUF9DT0xfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fRUNTUEkxX1NDTEsJCShfTVg1M19QQURfQ1NJMF9EQVQ0X19FQ1NQSTFfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fVVNCT0gzX1VTQkgzX1NUUAkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX1VTQk9IM19VU0JIM19TVFAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0FVRE1VWF9BVUQzX1RYQwkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX0FVRE1VWF9BVUQzX1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fRU1JX0VNSV9ERUJVR18zMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX0VNSV9FTUlfREVCVUdfMzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX1RQSVVfVFJBQ0VfMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDRfX1RQSVVfVFJBQ0VfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fSVBVX0NTSTBfRF81CQkoX01YNTNfUEFEX0NTSTBfREFUNV9fSVBVX0NTSTBfRF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19HUElPNV8yMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDVfX0dQSU81XzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19LUFBfUk9XXzUJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19LUFBfUk9XXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0VDU1BJMV9NT1NJCQkoX01YNTNfUEFEX0NTSTBfREFUNV9fRUNTUEkxX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX1VTQk9IM19VU0JIM19OWFQJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19VU0JPSDNfVVNCSDNfTlhUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19BVURNVVhfQVVEM19UWEQJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19BVURNVVhfQVVEM19UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0VNSV9FTUlfREVCVUdfMzQJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19FTUlfRU1JX0RFQlVHXzM0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19UUElVX1RSQUNFXzIJCShfTVg1M19QQURfQ1NJMF9EQVQ1X19UUElVX1RSQUNFXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0lQVV9DU0kwX0RfNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDZfX0lQVV9DU0kwX0RfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fR1BJTzVfMjQJCShfTVg1M19QQURfQ1NJMF9EQVQ2X19HUElPNV8yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fS1BQX0NPTF82CQkoX01YNTNfUEFEX0NTSTBfREFUNl9fS1BQX0NPTF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19FQ1NQSTFfTUlTTwkJKF9NWDUzX1BBRF9DU0kwX0RBVDZfX0VDU1BJMV9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19VU0JPSDNfVVNCSDNfQ0xLCQkoX01YNTNfUEFEX0NTSTBfREFUNl9fVVNCT0gzX1VTQkgzX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fQVVETVVYX0FVRDNfVFhGUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDZfX0FVRE1VWF9BVUQzX1RYRlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0VNSV9FTUlfREVCVUdfMzUJCShfTVg1M19QQURfQ1NJMF9EQVQ2X19FTUlfRU1JX0RFQlVHXzM1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19UUElVX1RSQUNFXzMJCShfTVg1M19QQURfQ1NJMF9EQVQ2X19UUElVX1RSQUNFXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0lQVV9DU0kwX0RfNwkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX0lQVV9DU0kwX0RfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fR1BJTzVfMjUJCShfTVg1M19QQURfQ1NJMF9EQVQ3X19HUElPNV8yNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fS1BQX1JPV182CQkoX01YNTNfUEFEX0NTSTBfREFUN19fS1BQX1JPV182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19FQ1NQSTFfU1MwCQkoX01YNTNfUEFEX0NTSTBfREFUN19fRUNTUEkxX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fVVNCT0gzX1VTQkgzX0RJUgkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX1VTQk9IM19VU0JIM19ESVIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0FVRE1VWF9BVUQzX1JYRAkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX0FVRE1VWF9BVUQzX1JYRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fRU1JX0VNSV9ERUJVR18zNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX0VNSV9FTUlfREVCVUdfMzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX1RQSVVfVFJBQ0VfNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDdfX1RQSVVfVFJBQ0VfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fSVBVX0NTSTBfRF84CQkoX01YNTNfUEFEX0NTSTBfREFUOF9fSVBVX0NTSTBfRF84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19HUElPNV8yNgkJKF9NWDUzX1BBRF9DU0kwX0RBVDhfX0dQSU81XzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19LUFBfQ09MXzcJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19LUFBfQ09MXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0VDU1BJMl9TQ0xLCQkoX01YNTNfUEFEX0NTSTBfREFUOF9fRUNTUEkyX1NDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX1VTQk9IM19VU0JIM19PQwkJKF9NWDUzX1BBRF9DU0kwX0RBVDhfX1VTQk9IM19VU0JIM19PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fSTJDMV9TREEJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19JMkMxX1NEQSB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0VNSV9FTUlfREVCVUdfMzcJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19FTUlfRU1JX0RFQlVHXzM3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ4X19UUElVX1RSQUNFXzUJCShfTVg1M19QQURfQ1NJMF9EQVQ4X19UUElVX1RSQUNFXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0lQVV9DU0kwX0RfOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDlfX0lQVV9DU0kwX0RfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fR1BJTzVfMjcJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19HUElPNV8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fS1BQX1JPV183CQkoX01YNTNfUEFEX0NTSTBfREFUOV9fS1BQX1JPV183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19FQ1NQSTJfTU9TSQkJKF9NWDUzX1BBRF9DU0kwX0RBVDlfX0VDU1BJMl9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19VU0JPSDNfVVNCSDNfUFdSCQkoX01YNTNfUEFEX0NTSTBfREFUOV9fVVNCT0gzX1VTQkgzX1BXUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fSTJDMV9TQ0wJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19JMkMxX1NDTCB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0VNSV9FTUlfREVCVUdfMzgJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzM4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19UUElVX1RSQUNFXzYJCShfTVg1M19QQURfQ1NJMF9EQVQ5X19UUElVX1RSQUNFXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19JUFVfQ1NJMF9EXzEwCQkoX01YNTNfUEFEX0NTSTBfREFUMTBfX0lQVV9DU0kwX0RfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19HUElPNV8yOAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19HUElPNV8yOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX1VBUlQxX1RYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fVUFSVDFfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19FQ1NQSTJfTUlTTwkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19FQ1NQSTJfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0FVRE1VWF9BVUQzX1JYQwkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19BVURNVVhfQVVEM19SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19TRE1BX0RFQlVHX1BDXzQJCShfTVg1M19QQURfQ1NJMF9EQVQxMF9fU0RNQV9ERUJVR19QQ180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18zOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEwX19FTUlfRU1JX0RFQlVHXzM5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fVFBJVV9UUkFDRV83CQkoX01YNTNfUEFEX0NTSTBfREFUMTBfX1RQSVVfVFJBQ0VfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0lQVV9DU0kwX0RfMTEJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fSVBVX0NTSTBfRF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0dQSU81XzI5CQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX0dQSU81XzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fVUFSVDFfUlhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDExX19VQVJUMV9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0VDU1BJMl9TUzAJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fRUNTUEkyX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX0FVRE1VWF9BVUQzX1JYRlMJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fQVVETVVYX0FVRDNfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTFfX1NETUFfREVCVUdfUENfNQkJKF9NWDUzX1BBRF9DU0kwX0RBVDExX19TRE1BX0RFQlVHX1BDXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19FTUlfRU1JX0RFQlVHXzQwCQkoX01YNTNfUEFEX0NTSTBfREFUMTFfX0VNSV9FTUlfREVCVUdfNDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19UUElVX1RSQUNFXzgJCShfTVg1M19QQURfQ1NJMF9EQVQxMV9fVFBJVV9UUkFDRV84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fSVBVX0NTSTBfRF8xMgkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19JUFVfQ1NJMF9EXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fR1BJTzVfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19VQVJUNF9UWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX1VBUlQ0X1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fVVNCT0gzX1VTQkgzX0RBVEFfMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19VU0JPSDNfVVNCSDNfREFUQV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fU0RNQV9ERUJVR19QQ182CQkoX01YNTNfUEFEX0NTSTBfREFUMTJfX1NETUFfREVCVUdfUENfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX0VNSV9FTUlfREVCVUdfNDEJCShfTVg1M19QQURfQ1NJMF9EQVQxMl9fRU1JX0VNSV9ERUJVR180MSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1RQSVVfVFJBQ0VfOQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEyX19UUElVX1RSQUNFXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19JUFVfQ1NJMF9EXzEzCQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX0lQVV9DU0kwX0RfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19HUElPNV8zMQkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19HUElPNV8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX1VBUlQ0X1JYRF9NVVgJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fVUFSVDRfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19VU0JPSDNfVVNCSDNfREFUQV8xCQkoX01YNTNfUEFEX0NTSTBfREFUMTNfX1VTQk9IM19VU0JIM19EQVRBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19TRE1BX0RFQlVHX1BDXzcJCShfTVg1M19QQURfQ1NJMF9EQVQxM19fU0RNQV9ERUJVR19QQ183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fRU1JX0VNSV9ERUJVR180MgkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19FTUlfRU1JX0RFQlVHXzQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVFBJVV9UUkFDRV8xMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDEzX19UUElVX1RSQUNFXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fSVBVX0NTSTBfRF8xNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19JUFVfQ1NJMF9EXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fR1BJTzZfMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19HUElPNl8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fVUFSVDVfVFhEX01VWAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19VQVJUNV9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1VTQk9IM19VU0JIM19EQVRBXzIJCShfTVg1M19QQURfQ1NJMF9EQVQxNF9fVVNCT0gzX1VTQkgzX0RBVEFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1NETUFfREVCVUdfUENfOAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE0X19TRE1BX0RFQlVHX1BDXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19FTUlfRU1JX0RFQlVHXzQzCQkoX01YNTNfUEFEX0NTSTBfREFUMTRfX0VNSV9FTUlfREVCVUdfNDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19UUElVX1RSQUNFXzExCQkoX01YNTNfUEFEX0NTSTBfREFUMTRfX1RQSVVfVFJBQ0VfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19JUFVfQ1NJMF9EXzE1CQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX0lQVV9DU0kwX0RfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19HUElPNl8xCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX0dQSU82XzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19VQVJUNV9SWERfTVVYCQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1VBUlQ1X1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fVVNCT0gzX1VTQkgzX0RBVEFfMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE1X19VU0JPSDNfVVNCSDNfREFUQV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fU0RNQV9ERUJVR19QQ185CQkoX01YNTNfUEFEX0NTSTBfREFUMTVfX1NETUFfREVCVUdfUENfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX0VNSV9FTUlfREVCVUdfNDQJCShfTVg1M19QQURfQ1NJMF9EQVQxNV9fRU1JX0VNSV9ERUJVR180NCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1RQSVVfVFJBQ0VfMTIJCShfTVg1M19QQURfQ1NJMF9EQVQxNV9fVFBJVV9UUkFDRV8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0lQVV9DU0kwX0RfMTYJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fSVBVX0NTSTBfRF8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX0dQSU82XzIJCShfTVg1M19QQURfQ1NJMF9EQVQxNl9fR1BJTzZfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1VBUlQ0X1JUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19VQVJUNF9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fVVNCT0gzX1VTQkgzX0RBVEFfNAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19VU0JPSDNfVVNCSDNfREFUQV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fU0RNQV9ERUJVR19QQ18xMAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19TRE1BX0RFQlVHX1BDXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fRU1JX0VNSV9ERUJVR180NQkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19FTUlfRU1JX0RFQlVHXzQ1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fVFBJVV9UUkFDRV8xMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE2X19UUElVX1RSQUNFXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fSVBVX0NTSTBfRF8xNwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19JUFVfQ1NJMF9EXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fR1BJTzZfMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE3X19HUElPNl8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fVUFSVDRfQ1RTCQkoX01YNTNfUEFEX0NTSTBfREFUMTdfX1VBUlQ0X0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19VU0JPSDNfVVNCSDNfREFUQV81CQkoX01YNTNfUEFEX0NTSTBfREFUMTdfX1VTQk9IM19VU0JIM19EQVRBXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19TRE1BX0RFQlVHX1BDXzExCQkoX01YNTNfUEFEX0NTSTBfREFUMTdfX1NETUFfREVCVUdfUENfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzQ2CQkoX01YNTNfUEFEX0NTSTBfREFUMTdfX0VNSV9FTUlfREVCVUdfNDYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19UUElVX1RSQUNFXzE0CQkoX01YNTNfUEFEX0NTSTBfREFUMTdfX1RQSVVfVFJBQ0VfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19JUFVfQ1NJMF9EXzE4CQkoX01YNTNfUEFEX0NTSTBfREFUMThfX0lQVV9DU0kwX0RfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19HUElPNl80CQkoX01YNTNfUEFEX0NTSTBfREFUMThfX0dQSU82XzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19VQVJUNV9SVFMJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVUFSVDVfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1VTQk9IM19VU0JIM19EQVRBXzYJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVVNCT0gzX1VTQkgzX0RBVEFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1NETUFfREVCVUdfUENfMTIJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fU0RNQV9ERUJVR19QQ18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX0VNSV9FTUlfREVCVUdfNDcJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fRU1JX0VNSV9ERUJVR180NyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1RQSVVfVFJBQ0VfMTUJCShfTVg1M19QQURfQ1NJMF9EQVQxOF9fVFBJVV9UUkFDRV8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0lQVV9DU0kwX0RfMTkJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fSVBVX0NTSTBfRF8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX0dQSU82XzUJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fR1BJTzZfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VBUlQ1X0NUUwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCT0gzX1VTQkgzX0RBVEFfNwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE5X19VU0JPSDNfVVNCSDNfREFUQV83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fU0RNQV9ERUJVR19QQ18xMwkJKF9NWDUzX1BBRF9DU0kwX0RBVDE5X19TRE1BX0RFQlVHX1BDXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fRU1JX0VNSV9ERUJVR180OAkJKF9NWDUzX1BBRF9DU0kwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzQ4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCUEhZMl9CSVNUT0sJCShfTVg1M19QQURfQ1NJMF9EQVQxOV9fVVNCUEhZMl9CSVNUT0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19FTUlfV0VJTV9BXzI1CQkoX01YNTNfUEFEX0VJTV9BMjVfX0VNSV9XRUlNX0FfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19HUElPNV8yCQkoX01YNTNfUEFEX0VJTV9BMjVfX0dQSU81XzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19FQ1NQSTJfUkRZCQkoX01YNTNfUEFEX0VJTV9BMjVfX0VDU1BJMl9SRFkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19JUFVfREkxX1BJTjEyCQkoX01YNTNfUEFEX0VJTV9BMjVfX0lQVV9ESTFfUElOMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19DU1BJX1NTMQkJKF9NWDUzX1BBRF9FSU1fQTI1X19DU1BJX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0lQVV9ESTBfRDFfQ1MJCShfTVg1M19QQURfRUlNX0EyNV9fSVBVX0RJMF9EMV9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX1VTQlBIWTFfQklTVE9LCQkoX01YNTNfUEFEX0VJTV9BMjVfX1VTQlBIWTFfQklTVE9LIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fRU1JX1dFSU1fRUJfMgkJKF9NWDUzX1BBRF9FSU1fRUIyX19FTUlfV0VJTV9FQl8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fR1BJTzJfMzAJCShfTVg1M19QQURfRUlNX0VCMl9fR1BJTzJfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIyX19DQ01fREkxX0VYVF9DTEsJCShfTVg1M19QQURfRUlNX0VCMl9fQ0NNX0RJMV9FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fSVBVX1NFUl9ESVNQMV9DUwkJKF9NWDUzX1BBRF9FSU1fRUIyX19JUFVfU0VSX0RJU1AxX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fRUNTUEkxX1NTMAkJKF9NWDUzX1BBRF9FSU1fRUIyX19FQ1NQSTFfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fSTJDMl9TQ0wJCShfTVg1M19QQURfRUlNX0VCMl9fSTJDMl9TQ0wgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fRU1JX1dFSU1fRF8xNgkJKF9NWDUzX1BBRF9FSU1fRDE2X19FTUlfV0VJTV9EXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fR1BJTzNfMTYJCShfTVg1M19QQURfRUlNX0QxNl9fR1BJTzNfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE2X19JUFVfREkwX1BJTjUJCShfTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJMF9QSU41IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJU1BCMV9TRVJfQ0xLCQkoX01YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESVNQQjFfU0VSX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0VDU1BJMV9TQ0xLCQkoX01YNTNfUEFEX0VJTV9EMTZfX0VDU1BJMV9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fSTJDMl9TREEJCShfTVg1M19QQURfRUlNX0QxNl9fSTJDMl9TREEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fRU1JX1dFSU1fRF8xNwkJKF9NWDUzX1BBRF9FSU1fRDE3X19FTUlfV0VJTV9EXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fR1BJTzNfMTcJCShfTVg1M19QQURfRUlNX0QxN19fR1BJTzNfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19JUFVfREkwX1BJTjYJCShfTVg1M19QQURfRUlNX0QxN19fSVBVX0RJMF9QSU42IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fSVBVX0RJU1BCMV9TRVJfRElOCQkoX01YNTNfUEFEX0VJTV9EMTdfX0lQVV9ESVNQQjFfU0VSX0RJTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0VDU1BJMV9NSVNPCQkoX01YNTNfUEFEX0VJTV9EMTdfX0VDU1BJMV9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fSTJDM19TQ0wJCShfTVg1M19QQURfRUlNX0QxN19fSTJDM19TQ0wgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fRU1JX1dFSU1fRF8xOAkJKF9NWDUzX1BBRF9FSU1fRDE4X19FTUlfV0VJTV9EXzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fR1BJTzNfMTgJCShfTVg1M19QQURfRUlNX0QxOF9fR1BJTzNfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19JUFVfREkwX1BJTjcJCShfTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMF9QSU43IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJU1BCMV9TRVJfRElPCQkoX01YNTNfUEFEX0VJTV9EMThfX0lQVV9ESVNQQjFfU0VSX0RJTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0VDU1BJMV9NT1NJCQkoX01YNTNfUEFEX0VJTV9EMThfX0VDU1BJMV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSTJDM19TREEJCShfTVg1M19QQURfRUlNX0QxOF9fSTJDM19TREEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMV9EMF9DUwkJKF9NWDUzX1BBRF9FSU1fRDE4X19JUFVfREkxX0QwX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRU1JX1dFSU1fRF8xOQkJKF9NWDUzX1BBRF9FSU1fRDE5X19FTUlfV0VJTV9EXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fR1BJTzNfMTkJCShfTVg1M19QQURfRUlNX0QxOV9fR1BJTzNfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19JUFVfREkwX1BJTjgJCShfTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJMF9QSU44IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJU1BCMV9TRVJfUlMJCShfTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJU1BCMV9TRVJfUlMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19FQ1NQSTFfU1MxCQkoX01YNTNfUEFEX0VJTV9EMTlfX0VDU1BJMV9TUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE5X19FUElUMV9FUElUTwkJKF9NWDUzX1BBRF9FSU1fRDE5X19FUElUMV9FUElUTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX1VBUlQxX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDE5X19VQVJUMV9DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fVVNCT0gzX1VTQkgyX09DCQkoX01YNTNfUEFEX0VJTV9EMTlfX1VTQk9IM19VU0JIMl9PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0VNSV9XRUlNX0RfMjAJCShfTVg1M19QQURfRUlNX0QyMF9fRU1JX1dFSU1fRF8yMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX0dQSU8zXzIwCQkoX01YNTNfUEFEX0VJTV9EMjBfX0dQSU8zXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fSVBVX0RJMF9QSU4xNgkJKF9NWDUzX1BBRF9FSU1fRDIwX19JUFVfREkwX1BJTjE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fSVBVX1NFUl9ESVNQMF9DUwkJKF9NWDUzX1BBRF9FSU1fRDIwX19JUFVfU0VSX0RJU1AwX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fQ1NQSV9TUzAJCShfTVg1M19QQURfRUlNX0QyMF9fQ1NQSV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19FUElUMl9FUElUTwkJKF9NWDUzX1BBRF9FSU1fRDIwX19FUElUMl9FUElUTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX1VBUlQxX1JUUwkJKF9NWDUzX1BBRF9FSU1fRDIwX19VQVJUMV9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fVVNCT0gzX1VTQkgyX1BXUgkJKF9NWDUzX1BBRF9FSU1fRDIwX19VU0JPSDNfVVNCSDJfUFdSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fRU1JX1dFSU1fRF8yMQkJKF9NWDUzX1BBRF9FSU1fRDIxX19FTUlfV0VJTV9EXzIxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fR1BJTzNfMjEJCShfTVg1M19QQURfRUlNX0QyMV9fR1BJTzNfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JUFVfREkwX1BJTjE3CQkoX01YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESTBfUElOMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19JUFVfRElTUEIwX1NFUl9DTEsJCShfTVg1M19QQURfRUlNX0QyMV9fSVBVX0RJU1BCMF9TRVJfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fQ1NQSV9TQ0xLCQkoX01YNTNfUEFEX0VJTV9EMjFfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0kyQzFfU0NMCQkoX01YNTNfUEFEX0VJTV9EMjFfX0kyQzFfU0NMIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX1VTQk9IM19VU0JPVEdfT0MJCShfTVg1M19QQURfRUlNX0QyMV9fVVNCT0gzX1VTQk9UR19PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0VNSV9XRUlNX0RfMjIJCShfTVg1M19QQURfRUlNX0QyMl9fRU1JX1dFSU1fRF8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0dQSU8zXzIyCQkoX01YNTNfUEFEX0VJTV9EMjJfX0dQSU8zXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fSVBVX0RJMF9QSU4xCQkoX01YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESTBfUElOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESVNQQjBfU0VSX0RJTgkJKF9NWDUzX1BBRF9FSU1fRDIyX19JUFVfRElTUEIwX1NFUl9ESU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIyX19DU1BJX01JU08JCShfTVg1M19QQURfRUlNX0QyMl9fQ1NQSV9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fVVNCT0gzX1VTQk9UR19QV1IJCShfTVg1M19QQURfRUlNX0QyMl9fVVNCT0gzX1VTQk9UR19QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19FTUlfV0VJTV9EXzIzCQkoX01YNTNfUEFEX0VJTV9EMjNfX0VNSV9XRUlNX0RfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19HUElPM18yMwkJKF9NWDUzX1BBRF9FSU1fRDIzX19HUElPM18yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX1VBUlQzX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDIzX19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fVUFSVDFfRENECQkoX01YNTNfUEFEX0VJTV9EMjNfX1VBUlQxX0RDRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTBfRDBfQ1MJCShfTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMF9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMgkJKF9NWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfQ1NJMV9EQVRBX0VOCQkoX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9DU0kxX0RBVEFfRU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfREkxX1BJTjE0CQkoX01YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19FTUlfV0VJTV9FQl8zCQkoX01YNTNfUEFEX0VJTV9FQjNfX0VNSV9XRUlNX0VCXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19HUElPMl8zMQkJKF9NWDUzX1BBRF9FSU1fRUIzX19HUElPMl8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX1VBUlQzX1JUUwkJKF9NWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fVUFSVDFfUkkJCShfTVg1M19QQURfRUlNX0VCM19fVUFSVDFfUkkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjMJCShfTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0NTSTFfSFNZTkMJCShfTVg1M19QQURfRUlNX0VCM19fSVBVX0NTSTFfSFNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2CQkoX01YNTNfUEFEX0VJTV9FQjNfX0lQVV9ESTFfUElOMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0CQkoX01YNTNfUEFEX0VJTV9EMjRfX0VNSV9XRUlNX0RfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19HUElPM18yNAkJKF9NWDUzX1BBRF9FSU1fRDI0X19HUElPM18yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX1VBUlQzX1RYRF9NVVgJCShfTVg1M19QQURfRUlNX0QyNF9fVUFSVDNfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FQ1NQSTFfU1MyCQkoX01YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19DU1BJX1NTMgkJKF9NWDUzX1BBRF9FSU1fRDI0X19DU1BJX1NTMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX0FVRE1VWF9BVUQ1X1JYRlMJCShfTVg1M19QQURfRUlNX0QyNF9fQVVETVVYX0FVRDVfUlhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMl9TUzIJCShfTVg1M19QQURfRUlNX0QyNF9fRUNTUEkyX1NTMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX1VBUlQxX0RUUgkJKF9NWDUzX1BBRF9FSU1fRDI0X19VQVJUMV9EVFIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19FTUlfV0VJTV9EXzI1CQkoX01YNTNfUEFEX0VJTV9EMjVfX0VNSV9XRUlNX0RfMjUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19HUElPM18yNQkJKF9NWDUzX1BBRF9FSU1fRDI1X19HUElPM18yNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRF9NVVgJCShfTVg1M19QQURfRUlNX0QyNV9fVUFSVDNfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTFfU1MzCQkoX01YNTNfUEFEX0VJTV9EMjVfX0VDU1BJMV9TUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19DU1BJX1NTMwkJKF9NWDUzX1BBRF9FSU1fRDI1X19DU1BJX1NTMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0FVRE1VWF9BVUQ1X1JYQwkJKF9NWDUzX1BBRF9FSU1fRDI1X19BVURNVVhfQVVENV9SWEMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTJfU1MzCQkoX01YNTNfUEFEX0VJTV9EMjVfX0VDU1BJMl9TUzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19VQVJUMV9EU1IJCShfTVg1M19QQURfRUlNX0QyNV9fVUFSVDFfRFNSIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRU1JX1dFSU1fRF8yNgkJKF9NWDUzX1BBRF9FSU1fRDI2X19FTUlfV0VJTV9EXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYJCShfTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19VQVJUMl9UWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQJCShfTVg1M19QQURfRUlNX0QyNl9fRklSSV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19JUFVfQ1NJMF9EXzEJCShfTVg1M19QQURfRUlNX0QyNl9fSVBVX0NTSTBfRF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJMV9QSU4xMQkJKF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfREkxX1BJTjExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX1NJU0dfMgkJKF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfU0lTR18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0RJU1AxX0RBVF8yMgkJKF9NWDUzX1BBRF9FSU1fRDI2X19JUFVfRElTUDFfREFUXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fRU1JX1dFSU1fRF8yNwkJKF9NWDUzX1BBRF9FSU1fRDI3X19FTUlfV0VJTV9EXzI3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fR1BJTzNfMjcJCShfTVg1M19QQURfRUlNX0QyN19fR1BJTzNfMjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19VQVJUMl9SWERfTVVYCQkoX01YNTNfUEFEX0VJTV9EMjdfX1VBUlQyX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fRklSSV9UWEQJCShfTVg1M19QQURfRUlNX0QyN19fRklSSV9UWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19JUFVfQ1NJMF9EXzAJCShfTVg1M19QQURfRUlNX0QyN19fSVBVX0NTSTBfRF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0RJMV9QSU4xMwkJKF9NWDUzX1BBRF9FSU1fRDI3X19JUFVfREkxX1BJTjEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX1NJU0dfMwkJKF9NWDUzX1BBRF9FSU1fRDI3X19JUFVfU0lTR18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0RJU1AxX0RBVF8yMwkJKF9NWDUzX1BBRF9FSU1fRDI3X19JUFVfRElTUDFfREFUXzIzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fRU1JX1dFSU1fRF8yOAkJKF9NWDUzX1BBRF9FSU1fRDI4X19FTUlfV0VJTV9EXzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fR1BJTzNfMjgJCShfTVg1M19QQURfRUlNX0QyOF9fR1BJTzNfMjggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19VQVJUMl9DVFMJCShfTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESVNQQjBfU0VSX0RJTwkJKF9NWDUzX1BBRF9FSU1fRDI4X19JUFVfRElTUEIwX1NFUl9ESU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19DU1BJX01PU0kJCShfTVg1M19QQURfRUlNX0QyOF9fQ1NQSV9NT1NJIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSTJDMV9TREEJCShfTVg1M19QQURfRUlNX0QyOF9fSTJDMV9TREEgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSVBVX0VYVF9UUklHCQkoX01YNTNfUEFEX0VJTV9EMjhfX0lQVV9FWFRfVFJJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9ESTBfUElOMTMJCShfTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJMF9QSU4xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0VNSV9XRUlNX0RfMjkJCShfTVg1M19QQURfRUlNX0QyOV9fRU1JX1dFSU1fRF8yOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0dQSU8zXzI5CQkoX01YNTNfUEFEX0VJTV9EMjlfX0dQSU8zXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fVUFSVDJfUlRTCQkoX01YNTNfUEFEX0VJTV9EMjlfX1VBUlQyX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUwkJKF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfRElTUEIwX1NFUl9SUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwCQkoX01YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0RJMV9QSU4xNQkJKF9NWDUzX1BBRF9FSU1fRDI5X19JUFVfREkxX1BJTjE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fSVBVX0NTSTFfVlNZTkMJCShfTVg1M19QQURfRUlNX0QyOV9fSVBVX0NTSTFfVlNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfREkwX1BJTjE0CQkoX01YNTNfUEFEX0VJTV9EMjlfX0lQVV9ESTBfUElOMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19FTUlfV0VJTV9EXzMwCQkoX01YNTNfUEFEX0VJTV9EMzBfX0VNSV9XRUlNX0RfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19HUElPM18zMAkJKF9NWDUzX1BBRF9FSU1fRDMwX19HUElPM18zMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX1VBUlQzX0NUUwkJKF9NWDUzX1BBRF9FSU1fRDMwX19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fSVBVX0NTSTBfRF8zCQkoX01YNTNfUEFEX0VJTV9EMzBfX0lQVV9DU0kwX0RfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESTBfUElOMTEJCShfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJMF9QSU4xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX0lQVV9ESVNQMV9EQVRfMjEJCShfTVg1M19QQURfRUlNX0QzMF9fSVBVX0RJU1AxX0RBVF8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX1VTQk9IM19VU0JIMV9PQwkJKF9NWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDFfT0MgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDJfT0MJCShfTVg1M19QQURfRUlNX0QzMF9fVVNCT0gzX1VTQkgyX09DIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fRU1JX1dFSU1fRF8zMQkJKF9NWDUzX1BBRF9FSU1fRDMxX19FTUlfV0VJTV9EXzMxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEJCShfTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VQVJUM19SVFMJCShfTVg1M19QQURfRUlNX0QzMV9fVUFSVDNfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0lQVV9DU0kwX0RfMgkJKF9NWDUzX1BBRF9FSU1fRDMxX19JUFVfQ1NJMF9EXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19JUFVfREkwX1BJTjEyCQkoX01YNTNfUEFEX0VJTV9EMzFfX0lQVV9ESTBfUElOMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19JUFVfRElTUDFfREFUXzIwCQkoX01YNTNfUEFEX0VJTV9EMzFfX0lQVV9ESVNQMV9EQVRfMjAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDFfUFdSCQkoX01YNTNfUEFEX0VJTV9EMzFfX1VTQk9IM19VU0JIMV9QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDJfUFdSCQkoX01YNTNfUEFEX0VJTV9EMzFfX1VTQk9IM19VU0JIMl9QV1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19FTUlfV0VJTV9BXzI0CQkoX01YNTNfUEFEX0VJTV9BMjRfX0VNSV9XRUlNX0FfMjQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19HUElPNV80CQkoX01YNTNfUEFEX0VJTV9BMjRfX0dQSU81XzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19JUFVfRElTUDFfREFUXzE5CQkoX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9ESVNQMV9EQVRfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19JUFVfQ1NJMV9EXzE5CQkoX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9DU0kxX0RfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19JUFVfU0lTR18yCQkoX01YNTNfUEFEX0VJTV9BMjRfX0lQVV9TSVNHXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19VU0JQSFkyX0JWQUxJRAkJKF9NWDUzX1BBRF9FSU1fQTI0X19VU0JQSFkyX0JWQUxJRCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0VNSV9XRUlNX0FfMjMJCShfTVg1M19QQURfRUlNX0EyM19fRU1JX1dFSU1fQV8yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0dQSU82XzYJCShfTVg1M19QQURfRUlNX0EyM19fR1BJTzZfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0lQVV9ESVNQMV9EQVRfMTgJCShfTVg1M19QQURfRUlNX0EyM19fSVBVX0RJU1AxX0RBVF8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0lQVV9DU0kxX0RfMTgJCShfTVg1M19QQURfRUlNX0EyM19fSVBVX0NTSTFfRF8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0lQVV9TSVNHXzMJCShfTVg1M19QQURfRUlNX0EyM19fSVBVX1NJU0dfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX1VTQlBIWTJfRU5EU0VTU0lPTgkJKF9NWDUzX1BBRF9FSU1fQTIzX19VU0JQSFkyX0VORFNFU1NJT04gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19FTUlfV0VJTV9BXzIyCQkoX01YNTNfUEFEX0VJTV9BMjJfX0VNSV9XRUlNX0FfMjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19HUElPMl8xNgkJKF9NWDUzX1BBRF9FSU1fQTIyX19HUElPMl8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjJfX0lQVV9ESVNQMV9EQVRfMTcJCShfTVg1M19QQURfRUlNX0EyMl9fSVBVX0RJU1AxX0RBVF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjJfX0lQVV9DU0kxX0RfMTcJCShfTVg1M19QQURfRUlNX0EyMl9fSVBVX0NTSTFfRF8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjJfX1NSQ19CVF9DRkcxXzcJCShfTVg1M19QQURfRUlNX0EyMl9fU1JDX0JUX0NGRzFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX0VNSV9XRUlNX0FfMjEJCShfTVg1M19QQURfRUlNX0EyMV9fRU1JX1dFSU1fQV8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjFfX0dQSU8yXzE3CQkoX01YNTNfUEFEX0VJTV9BMjFfX0dQSU8yXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fSVBVX0RJU1AxX0RBVF8xNgkJKF9NWDUzX1BBRF9FSU1fQTIxX19JUFVfRElTUDFfREFUXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fSVBVX0NTSTFfRF8xNgkJKF9NWDUzX1BBRF9FSU1fQTIxX19JUFVfQ1NJMV9EXzE2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fU1JDX0JUX0NGRzFfNgkJKF9NWDUzX1BBRF9FSU1fQTIxX19TUkNfQlRfQ0ZHMV82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fRU1JX1dFSU1fQV8yMAkJKF9NWDUzX1BBRF9FSU1fQTIwX19FTUlfV0VJTV9BXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fR1BJTzJfMTgJCShfTVg1M19QQURfRUlNX0EyMF9fR1BJTzJfMTggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19JUFVfRElTUDFfREFUXzE1CQkoX01YNTNfUEFEX0VJTV9BMjBfX0lQVV9ESVNQMV9EQVRfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19JUFVfQ1NJMV9EXzE1CQkoX01YNTNfUEFEX0VJTV9BMjBfX0lQVV9DU0kxX0RfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19TUkNfQlRfQ0ZHMV81CQkoX01YNTNfUEFEX0VJTV9BMjBfX1NSQ19CVF9DRkcxXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19FTUlfV0VJTV9BXzE5CQkoX01YNTNfUEFEX0VJTV9BMTlfX0VNSV9XRUlNX0FfMTkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19HUElPMl8xOQkJKF9NWDUzX1BBRF9FSU1fQTE5X19HUElPMl8xOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTlfX0lQVV9ESVNQMV9EQVRfMTQJCShfTVg1M19QQURfRUlNX0ExOV9fSVBVX0RJU1AxX0RBVF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTlfX0lQVV9DU0kxX0RfMTQJCShfTVg1M19QQURfRUlNX0ExOV9fSVBVX0NTSTFfRF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTlfX1NSQ19CVF9DRkcxXzQJCShfTVg1M19QQURfRUlNX0ExOV9fU1JDX0JUX0NGRzFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX0VNSV9XRUlNX0FfMTgJCShfTVg1M19QQURfRUlNX0ExOF9fRU1JX1dFSU1fQV8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMThfX0dQSU8yXzIwCQkoX01YNTNfUEFEX0VJTV9BMThfX0dQSU8yXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fSVBVX0RJU1AxX0RBVF8xMwkJKF9NWDUzX1BBRF9FSU1fQTE4X19JUFVfRElTUDFfREFUXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fSVBVX0NTSTFfRF8xMwkJKF9NWDUzX1BBRF9FSU1fQTE4X19JUFVfQ1NJMV9EXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fU1JDX0JUX0NGRzFfMwkJKF9NWDUzX1BBRF9FSU1fQTE4X19TUkNfQlRfQ0ZHMV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fRU1JX1dFSU1fQV8xNwkJKF9NWDUzX1BBRF9FSU1fQTE3X19FTUlfV0VJTV9BXzE3IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fR1BJTzJfMjEJCShfTVg1M19QQURfRUlNX0ExN19fR1BJTzJfMjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19JUFVfRElTUDFfREFUXzEyCQkoX01YNTNfUEFEX0VJTV9BMTdfX0lQVV9ESVNQMV9EQVRfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19JUFVfQ1NJMV9EXzEyCQkoX01YNTNfUEFEX0VJTV9BMTdfX0lQVV9DU0kxX0RfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19TUkNfQlRfQ0ZHMV8yCQkoX01YNTNfUEFEX0VJTV9BMTdfX1NSQ19CVF9DRkcxXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19FTUlfV0VJTV9BXzE2CQkoX01YNTNfUEFEX0VJTV9BMTZfX0VNSV9XRUlNX0FfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19HUElPMl8yMgkJKF9NWDUzX1BBRF9FSU1fQTE2X19HUElPMl8yMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTZfX0lQVV9ESTFfRElTUF9DTEsJCShfTVg1M19QQURfRUlNX0ExNl9fSVBVX0RJMV9ESVNQX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9BMTZfX0lQVV9DU0kxX1BJWENMSwkJKF9NWDUzX1BBRF9FSU1fQTE2X19JUFVfQ1NJMV9QSVhDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19TUkNfQlRfQ0ZHMV8xCQkoX01YNTNfUEFEX0VJTV9BMTZfX1NSQ19CVF9DRkcxXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MwX19FTUlfV0VJTV9DU18wCQkoX01YNTNfUEFEX0VJTV9DUzBfX0VNSV9XRUlNX0NTXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MwX19HUElPMl8yMwkJKF9NWDUzX1BBRF9FSU1fQ1MwX19HUElPMl8yMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzBfX0VDU1BJMl9TQ0xLCQkoX01YNTNfUEFEX0VJTV9DUzBfX0VDU1BJMl9TQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fSVBVX0RJMV9QSU41CQkoX01YNTNfUEFEX0VJTV9DUzBfX0lQVV9ESTFfUElONSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0VNSV9XRUlNX0NTXzEJCShfTVg1M19QQURfRUlNX0NTMV9fRU1JX1dFSU1fQ1NfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0dQSU8yXzI0CQkoX01YNTNfUEFEX0VJTV9DUzFfX0dQSU8yXzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0NTMV9fRUNTUEkyX01PU0kJCShfTVg1M19QQURfRUlNX0NTMV9fRUNTUEkyX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19JUFVfREkxX1BJTjYJCShfTVg1M19QQURfRUlNX0NTMV9fSVBVX0RJMV9QSU42IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX09FX19FTUlfV0VJTV9PRQkJKF9NWDUzX1BBRF9FSU1fT0VfX0VNSV9XRUlNX09FIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX09FX19HUElPMl8yNQkJKF9NWDUzX1BBRF9FSU1fT0VfX0dQSU8yXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX09FX19FQ1NQSTJfTUlTTwkJKF9NWDUzX1BBRF9FSU1fT0VfX0VDU1BJMl9NSVNPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX09FX19JUFVfREkxX1BJTjcJCShfTVg1M19QQURfRUlNX09FX19JUFVfREkxX1BJTjcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fT0VfX1VTQlBIWTJfSURESUcJCShfTVg1M19QQURfRUlNX09FX19VU0JQSFkyX0lERElHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19FTUlfV0VJTV9SVwkJKF9NWDUzX1BBRF9FSU1fUldfX0VNSV9XRUlNX1JXIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19HUElPMl8yNgkJKF9NWDUzX1BBRF9FSU1fUldfX0dQSU8yXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19FQ1NQSTJfU1MwCQkoX01YNTNfUEFEX0VJTV9SV19fRUNTUEkyX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fSVBVX0RJMV9QSU44CQkoX01YNTNfUEFEX0VJTV9SV19fSVBVX0RJMV9QSU44IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1JXX19VU0JQSFkyX0hPU1RESVNDT05ORUNUCQkoX01YNTNfUEFEX0VJTV9SV19fVVNCUEhZMl9IT1NURElTQ09OTkVDVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0VNSV9XRUlNX0xCQQkJKF9NWDUzX1BBRF9FSU1fTEJBX19FTUlfV0VJTV9MQkEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19HUElPMl8yNwkJKF9NWDUzX1BBRF9FSU1fTEJBX19HUElPMl8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0VDU1BJMl9TUzEJCShfTVg1M19QQURfRUlNX0xCQV9fRUNTUEkyX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX0lQVV9ESTFfUElOMTcJCShfTVg1M19QQURfRUlNX0xCQV9fSVBVX0RJMV9QSU4xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9MQkFfX1NSQ19CVF9DRkcxXzAJCShfTVg1M19QQURfRUlNX0xCQV9fU1JDX0JUX0NGRzFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0VNSV9XRUlNX0VCXzAJCShfTVg1M19QQURfRUlNX0VCMF9fRU1JX1dFSU1fRUJfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0dQSU8yXzI4CQkoX01YNTNfUEFEX0VJTV9FQjBfX0dQSU8yXzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fSVBVX0RJU1AxX0RBVF8xMQkJKF9NWDUzX1BBRF9FSU1fRUIwX19JUFVfRElTUDFfREFUXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fSVBVX0NTSTFfRF8xMQkJKF9NWDUzX1BBRF9FSU1fRUIwX19JUFVfQ1NJMV9EXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fR1BDX1BNSUNfUkRZCQkoX01YNTNfUEFEX0VJTV9FQjBfX0dQQ19QTUlDX1JEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX1NSQ19CVF9DRkcyXzcJCShfTVg1M19QQURfRUlNX0VCMF9fU1JDX0JUX0NGRzJfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX0VNSV9XRUlNX0VCXzEJCShfTVg1M19QQURfRUlNX0VCMV9fRU1JX1dFSU1fRUJfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjFfX0dQSU8yXzI5CQkoX01YNTNfUEFEX0VJTV9FQjFfX0dQSU8yXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fSVBVX0RJU1AxX0RBVF8xMAkJKF9NWDUzX1BBRF9FSU1fRUIxX19JUFVfRElTUDFfREFUXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fSVBVX0NTSTFfRF8xMAkJKF9NWDUzX1BBRF9FSU1fRUIxX19JUFVfQ1NJMV9EXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fU1JDX0JUX0NGRzJfNgkJKF9NWDUzX1BBRF9FSU1fRUIxX19TUkNfQlRfQ0ZHMl82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fRU1JX05BTkRfV0VJTV9EQV8wCQkoX01YNTNfUEFEX0VJTV9EQTBfX0VNSV9OQU5EX1dFSU1fREFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0dQSU8zXzAJCShfTVg1M19QQURfRUlNX0RBMF9fR1BJTzNfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0lQVV9ESVNQMV9EQVRfOQkJKF9NWDUzX1BBRF9FSU1fREEwX19JUFVfRElTUDFfREFUXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEwX19JUFVfQ1NJMV9EXzkJCShfTVg1M19QQURfRUlNX0RBMF9fSVBVX0NTSTFfRF85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fU1JDX0JUX0NGRzJfNQkJKF9NWDUzX1BBRF9FSU1fREEwX19TUkNfQlRfQ0ZHMl81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMV9fRU1JX05BTkRfV0VJTV9EQV8xCQkoX01YNTNfUEFEX0VJTV9EQTFfX0VNSV9OQU5EX1dFSU1fREFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0dQSU8zXzEJCShfTVg1M19QQURfRUlNX0RBMV9fR1BJTzNfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0lQVV9ESVNQMV9EQVRfOAkJKF9NWDUzX1BBRF9FSU1fREExX19JUFVfRElTUDFfREFUXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19JUFVfQ1NJMV9EXzgJCShfTVg1M19QQURfRUlNX0RBMV9fSVBVX0NTSTFfRF84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMV9fU1JDX0JUX0NGRzJfNAkJKF9NWDUzX1BBRF9FSU1fREExX19TUkNfQlRfQ0ZHMl80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fRU1JX05BTkRfV0VJTV9EQV8yCQkoX01YNTNfUEFEX0VJTV9EQTJfX0VNSV9OQU5EX1dFSU1fREFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX0dQSU8zXzIJCShfTVg1M19QQURfRUlNX0RBMl9fR1BJTzNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX0lQVV9ESVNQMV9EQVRfNwkJKF9NWDUzX1BBRF9FSU1fREEyX19JUFVfRElTUDFfREFUXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19JUFVfQ1NJMV9EXzcJCShfTVg1M19QQURfRUlNX0RBMl9fSVBVX0NTSTFfRF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fU1JDX0JUX0NGRzJfMwkJKF9NWDUzX1BBRF9FSU1fREEyX19TUkNfQlRfQ0ZHMl8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fRU1JX05BTkRfV0VJTV9EQV8zCQkoX01YNTNfUEFEX0VJTV9EQTNfX0VNSV9OQU5EX1dFSU1fREFfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0dQSU8zXzMJCShfTVg1M19QQURfRUlNX0RBM19fR1BJTzNfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0lQVV9ESVNQMV9EQVRfNgkJKF9NWDUzX1BBRF9FSU1fREEzX19JUFVfRElTUDFfREFUXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREEzX19JUFVfQ1NJMV9EXzYJCShfTVg1M19QQURfRUlNX0RBM19fSVBVX0NTSTFfRF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fU1JDX0JUX0NGRzJfMgkJKF9NWDUzX1BBRF9FSU1fREEzX19TUkNfQlRfQ0ZHMl8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNF9fRU1JX05BTkRfV0VJTV9EQV80CQkoX01YNTNfUEFEX0VJTV9EQTRfX0VNSV9OQU5EX1dFSU1fREFfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0dQSU8zXzQJCShfTVg1M19QQURfRUlNX0RBNF9fR1BJTzNfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0lQVV9ESVNQMV9EQVRfNQkJKF9NWDUzX1BBRF9FSU1fREE0X19JUFVfRElTUDFfREFUXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19JUFVfQ1NJMV9EXzUJCShfTVg1M19QQURfRUlNX0RBNF9fSVBVX0NTSTFfRF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNF9fU1JDX0JUX0NGRzNfNwkJKF9NWDUzX1BBRF9FSU1fREE0X19TUkNfQlRfQ0ZHM183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fRU1JX05BTkRfV0VJTV9EQV81CQkoX01YNTNfUEFEX0VJTV9EQTVfX0VNSV9OQU5EX1dFSU1fREFfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX0dQSU8zXzUJCShfTVg1M19QQURfRUlNX0RBNV9fR1BJTzNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX0lQVV9ESVNQMV9EQVRfNAkJKF9NWDUzX1BBRF9FSU1fREE1X19JUFVfRElTUDFfREFUXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19JUFVfQ1NJMV9EXzQJCShfTVg1M19QQURfRUlNX0RBNV9fSVBVX0NTSTFfRF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fU1JDX0JUX0NGRzNfNgkJKF9NWDUzX1BBRF9FSU1fREE1X19TUkNfQlRfQ0ZHM182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fRU1JX05BTkRfV0VJTV9EQV82CQkoX01YNTNfUEFEX0VJTV9EQTZfX0VNSV9OQU5EX1dFSU1fREFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX0dQSU8zXzYJCShfTVg1M19QQURfRUlNX0RBNl9fR1BJTzNfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX0lQVV9ESVNQMV9EQVRfMwkJKF9NWDUzX1BBRF9FSU1fREE2X19JUFVfRElTUDFfREFUXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19JUFVfQ1NJMV9EXzMJCShfTVg1M19QQURfRUlNX0RBNl9fSVBVX0NTSTFfRF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fU1JDX0JUX0NGRzNfNQkJKF9NWDUzX1BBRF9FSU1fREE2X19TUkNfQlRfQ0ZHM181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fRU1JX05BTkRfV0VJTV9EQV83CQkoX01YNTNfUEFEX0VJTV9EQTdfX0VNSV9OQU5EX1dFSU1fREFfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0dQSU8zXzcJCShfTVg1M19QQURfRUlNX0RBN19fR1BJTzNfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0lQVV9ESVNQMV9EQVRfMgkJKF9NWDUzX1BBRF9FSU1fREE3X19JUFVfRElTUDFfREFUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE3X19JUFVfQ1NJMV9EXzIJCShfTVg1M19QQURfRUlNX0RBN19fSVBVX0NTSTFfRF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fU1JDX0JUX0NGRzNfNAkJKF9NWDUzX1BBRF9FSU1fREE3X19TUkNfQlRfQ0ZHM180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOF9fRU1JX05BTkRfV0VJTV9EQV84CQkoX01YNTNfUEFEX0VJTV9EQThfX0VNSV9OQU5EX1dFSU1fREFfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0dQSU8zXzgJCShfTVg1M19QQURfRUlNX0RBOF9fR1BJTzNfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0lQVV9ESVNQMV9EQVRfMQkJKF9NWDUzX1BBRF9FSU1fREE4X19JUFVfRElTUDFfREFUXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19JUFVfQ1NJMV9EXzEJCShfTVg1M19QQURfRUlNX0RBOF9fSVBVX0NTSTFfRF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOF9fU1JDX0JUX0NGRzNfMwkJKF9NWDUzX1BBRF9FSU1fREE4X19TUkNfQlRfQ0ZHM18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fRU1JX05BTkRfV0VJTV9EQV85CQkoX01YNTNfUEFEX0VJTV9EQTlfX0VNSV9OQU5EX1dFSU1fREFfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX0dQSU8zXzkJCShfTVg1M19QQURfRUlNX0RBOV9fR1BJTzNfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX0lQVV9ESVNQMV9EQVRfMAkJKF9NWDUzX1BBRF9FSU1fREE5X19JUFVfRElTUDFfREFUXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19JUFVfQ1NJMV9EXzAJCShfTVg1M19QQURfRUlNX0RBOV9fSVBVX0NTSTFfRF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fU1JDX0JUX0NGRzNfMgkJKF9NWDUzX1BBRF9FSU1fREE5X19TUkNfQlRfQ0ZHM18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0VNSV9OQU5EX1dFSU1fREFfMTAJCShfTVg1M19QQURfRUlNX0RBMTBfX0VNSV9OQU5EX1dFSU1fREFfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fR1BJTzNfMTAJCShfTVg1M19QQURfRUlNX0RBMTBfX0dQSU8zXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTBfX0lQVV9ESTFfUElOMTUJCShfTVg1M19QQURfRUlNX0RBMTBfX0lQVV9ESTFfUElOMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fSVBVX0NTSTFfREFUQV9FTgkJKF9NWDUzX1BBRF9FSU1fREExMF9fSVBVX0NTSTFfREFUQV9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19TUkNfQlRfQ0ZHM18xCQkoX01YNTNfUEFEX0VJTV9EQTEwX19TUkNfQlRfQ0ZHM18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0VNSV9OQU5EX1dFSU1fREFfMTEJCShfTVg1M19QQURfRUlNX0RBMTFfX0VNSV9OQU5EX1dFSU1fREFfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMV9fR1BJTzNfMTEJCShfTVg1M19QQURfRUlNX0RBMTFfX0dQSU8zXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0lQVV9ESTFfUElOMgkJKF9NWDUzX1BBRF9FSU1fREExMV9fSVBVX0RJMV9QSU4yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0lQVV9DU0kxX0hTWU5DCQkoX01YNTNfUEFEX0VJTV9EQTExX19JUFVfQ1NJMV9IU1lOQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19FTUlfTkFORF9XRUlNX0RBXzEyCQkoX01YNTNfUEFEX0VJTV9EQTEyX19FTUlfTkFORF9XRUlNX0RBXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTJfX0dQSU8zXzEyCQkoX01YNTNfUEFEX0VJTV9EQTEyX19HUElPM18xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19JUFVfREkxX1BJTjMJCShfTVg1M19QQURfRUlNX0RBMTJfX0lQVV9ESTFfUElOMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19JUFVfQ1NJMV9WU1lOQwkJKF9NWDUzX1BBRF9FSU1fREExMl9fSVBVX0NTSTFfVlNZTkMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fRU1JX05BTkRfV0VJTV9EQV8xMwkJKF9NWDUzX1BBRF9FSU1fREExM19fRU1JX05BTkRfV0VJTV9EQV8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19HUElPM18xMwkJKF9NWDUzX1BBRF9FSU1fREExM19fR1BJTzNfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExM19fSVBVX0RJMV9EMF9DUwkJKF9NWDUzX1BBRF9FSU1fREExM19fSVBVX0RJMV9EMF9DUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19DQ01fREkxX0VYVF9DTEsJCShfTVg1M19QQURfRUlNX0RBMTNfX0NDTV9ESTFfRVhUX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19FTUlfTkFORF9XRUlNX0RBXzE0CQkoX01YNTNfUEFEX0VJTV9EQTE0X19FTUlfTkFORF9XRUlNX0RBXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTRfX0dQSU8zXzE0CQkoX01YNTNfUEFEX0VJTV9EQTE0X19HUElPM18xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19JUFVfREkxX0QxX0NTCQkoX01YNTNfUEFEX0VJTV9EQTE0X19JUFVfREkxX0QxX0NTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTRfX0NDTV9ESTBfRVhUX0NMSwkJKF9NWDUzX1BBRF9FSU1fREExNF9fQ0NNX0RJMF9FWFRfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0VNSV9OQU5EX1dFSU1fREFfMTUJCShfTVg1M19QQURfRUlNX0RBMTVfX0VNSV9OQU5EX1dFSU1fREFfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNV9fR1BJTzNfMTUJCShfTVg1M19QQURfRUlNX0RBMTVfX0dQSU8zXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElOMQkJKF9NWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU4xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0lQVV9ESTFfUElONAkJKF9NWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU40IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfV0VfQl9fRU1JX05BTkRGX1dFX0IJCShfTVg1M19QQURfTkFOREZfV0VfQl9fRU1JX05BTkRGX1dFX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XRV9CX19HUElPNl8xMgkJKF9NWDUzX1BBRF9OQU5ERl9XRV9CX19HUElPNl8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JFX0JfX0VNSV9OQU5ERl9SRV9CCQkoX01YNTNfUEFEX05BTkRGX1JFX0JfX0VNSV9OQU5ERl9SRV9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfUkVfQl9fR1BJTzZfMTMJCShfTVg1M19QQURfTkFOREZfUkVfQl9fR1BJTzZfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fV0FJVAkJKF9NWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fV0FJVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0VJTV9XQUlUX19HUElPNV8wCQkoX01YNTNfUEFEX0VJTV9XQUlUX19HUElPNV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRUlNX1dBSVRfX0VNSV9XRUlNX0RUQUNLX0IJCShfTVg1M19QQURfRUlNX1dBSVRfX0VNSV9XRUlNX0RUQUNLX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDNfUF9fR1BJTzZfMjIJCShfTVg1M19QQURfTFZEUzFfVFgzX1BfX0dQSU82XzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgzX1BfX0xEQl9MVkRTMV9UWDMJCShfTVg1M19QQURfTFZEUzFfVFgzX1BfX0xEQl9MVkRTMV9UWDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDJfUF9fR1BJTzZfMjQJCShfTVg1M19QQURfTFZEUzFfVFgyX1BfX0dQSU82XzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgyX1BfX0xEQl9MVkRTMV9UWDIJCShfTVg1M19QQURfTFZEUzFfVFgyX1BfX0xEQl9MVkRTMV9UWDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9DTEtfUF9fR1BJTzZfMjYJCShfTVg1M19QQURfTFZEUzFfQ0xLX1BfX0dQSU82XzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfQ0xLX1BfX0xEQl9MVkRTMV9DTEsJCShfTVg1M19QQURfTFZEUzFfQ0xLX1BfX0xEQl9MVkRTMV9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDFfUF9fR1BJTzZfMjgJCShfTVg1M19QQURfTFZEUzFfVFgxX1BfX0dQSU82XzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgxX1BfX0xEQl9MVkRTMV9UWDEJCShfTVg1M19QQURfTFZEUzFfVFgxX1BfX0xEQl9MVkRTMV9UWDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDBfUF9fR1BJTzZfMzAJCShfTVg1M19QQURfTFZEUzFfVFgwX1BfX0dQSU82XzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgwX1BfX0xEQl9MVkRTMV9UWDAJCShfTVg1M19QQURfTFZEUzFfVFgwX1BfX0xEQl9MVkRTMV9UWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDNfUF9fR1BJTzdfMjIJCShfTVg1M19QQURfTFZEUzBfVFgzX1BfX0dQSU83XzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgzX1BfX0xEQl9MVkRTMF9UWDMJCShfTVg1M19QQURfTFZEUzBfVFgzX1BfX0xEQl9MVkRTMF9UWDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9DTEtfUF9fR1BJTzdfMjQJCShfTVg1M19QQURfTFZEUzBfQ0xLX1BfX0dQSU83XzI0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfQ0xLX1BfX0xEQl9MVkRTMF9DTEsJCShfTVg1M19QQURfTFZEUzBfQ0xLX1BfX0xEQl9MVkRTMF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDJfUF9fR1BJTzdfMjYJCShfTVg1M19QQURfTFZEUzBfVFgyX1BfX0dQSU83XzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgyX1BfX0xEQl9MVkRTMF9UWDIJCShfTVg1M19QQURfTFZEUzBfVFgyX1BfX0xEQl9MVkRTMF9UWDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDFfUF9fR1BJTzdfMjgJCShfTVg1M19QQURfTFZEUzBfVFgxX1BfX0dQSU83XzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgxX1BfX0xEQl9MVkRTMF9UWDEJCShfTVg1M19QQURfTFZEUzBfVFgxX1BfX0xEQl9MVkRTMF9UWDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDBfUF9fR1BJTzdfMzAJCShfTVg1M19QQURfTFZEUzBfVFgwX1BfX0dQSU83XzMwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgwX1BfX0xEQl9MVkRTMF9UWDAJCShfTVg1M19QQURfTFZEUzBfVFgwX1BfX0xEQl9MVkRTMF9UWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzEwX19HUElPNF8wCQkoX01YNTNfUEFEX0dQSU9fMTBfX0dQSU80XzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzEwX19PU0MzMmtfMzJLX09VVAkJKF9NWDUzX1BBRF9HUElPXzEwX19PU0MzMmtfMzJLX09VVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTFfX0dQSU80XzEJCShfTVg1M19QQURfR1BJT18xMV9fR1BJTzRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTJfX0dQSU80XzIJCShfTVg1M19QQURfR1BJT18xMl9fR1BJTzRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTNfX0dQSU80XzMJCShfTVg1M19QQURfR1BJT18xM19fR1BJTzRfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTRfX0dQSU80XzQJCShfTVg1M19QQURfR1BJT18xNF9fR1BJTzRfNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NMRV9fRU1JX05BTkRGX0NMRQkJKF9NWDUzX1BBRF9OQU5ERl9DTEVfX0VNSV9OQU5ERl9DTEUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DTEVfX0dQSU82XzcJCShfTVg1M19QQURfTkFOREZfQ0xFX19HUElPNl83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ0xFX19VU0JQSFkxX1ZTVEFUVVNfMAkJKF9NWDUzX1BBRF9OQU5ERl9DTEVfX1VTQlBIWTFfVlNUQVRVU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQUxFX19FTUlfTkFOREZfQUxFCQkoX01YNTNfUEFEX05BTkRGX0FMRV9fRU1JX05BTkRGX0FMRSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0FMRV9fR1BJTzZfOAkJKF9NWDUzX1BBRF9OQU5ERl9BTEVfX0dQSU82XzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9BTEVfX1VTQlBIWTFfVlNUQVRVU18xCQkoX01YNTNfUEFEX05BTkRGX0FMRV9fVVNCUEhZMV9WU1RBVFVTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19FTUlfTkFOREZfV1BfQgkJKF9NWDUzX1BBRF9OQU5ERl9XUF9CX19FTUlfTkFOREZfV1BfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1dQX0JfX0dQSU82XzkJCShfTVg1M19QQURfTkFOREZfV1BfQl9fR1BJTzZfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX1dQX0JfX1VTQlBIWTFfVlNUQVRVU18yCQkoX01YNTNfUEFEX05BTkRGX1dQX0JfX1VTQlBIWTFfVlNUQVRVU18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfUkIwX19FTUlfTkFOREZfUkJfMAkJKF9NWDUzX1BBRF9OQU5ERl9SQjBfX0VNSV9OQU5ERl9SQl8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfUkIwX19HUElPNl8xMAkJKF9NWDUzX1BBRF9OQU5ERl9SQjBfX0dQSU82XzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfUkIwX19VU0JQSFkxX1ZTVEFUVVNfMwkJKF9NWDUzX1BBRF9OQU5ERl9SQjBfX1VTQlBIWTFfVlNUQVRVU18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19FTUlfTkFOREZfQ1NfMAkJKF9NWDUzX1BBRF9OQU5ERl9DUzBfX0VNSV9OQU5ERl9DU18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19HUElPNl8xMQkJKF9NWDUzX1BBRF9OQU5ERl9DUzBfX0dQSU82XzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19VU0JQSFkxX1ZTVEFUVVNfNAkJKF9NWDUzX1BBRF9OQU5ERl9DUzBfX1VTQlBIWTFfVlNUQVRVU180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19FTUlfTkFOREZfQ1NfMQkJKF9NWDUzX1BBRF9OQU5ERl9DUzFfX0VNSV9OQU5ERl9DU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19HUElPNl8xNAkJKF9NWDUzX1BBRF9OQU5ERl9DUzFfX0dQSU82XzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19NTEJfTUxCQ0xLCQkoX01YNTNfUEFEX05BTkRGX0NTMV9fTUxCX01MQkNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fVVNCUEhZMV9WU1RBVFVTXzUJCShfTVg1M19QQURfTkFOREZfQ1MxX19VU0JQSFkxX1ZTVEFUVVNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fRU1JX05BTkRGX0NTXzIJCShfTVg1M19QQURfTkFOREZfQ1MyX19FTUlfTkFOREZfQ1NfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fR1BJTzZfMTUJCShfTVg1M19QQURfTkFOREZfQ1MyX19HUElPNl8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fSVBVX1NJU0dfMAkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX0lQVV9TSVNHXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0VTQUkxX1RYMAkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX0VTQUkxX1RYMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fRU1JX1dFSU1fQ1JFCQkoX01YNTNfUEFEX05BTkRGX0NTMl9fRU1JX1dFSU1fQ1JFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19DQ01fQ1NJMF9NQ0xLCQkoX01YNTNfUEFEX05BTkRGX0NTMl9fQ0NNX0NTSTBfTUNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fTUxCX01MQlNJRwkJKF9NWDUzX1BBRF9OQU5ERl9DUzJfX01MQl9NTEJTSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX1VTQlBIWTFfVlNUQVRVU182CQkoX01YNTNfUEFEX05BTkRGX0NTMl9fVVNCUEhZMV9WU1RBVFVTXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9OQU5ERl9DU18zCQkoX01YNTNfUEFEX05BTkRGX0NTM19fRU1JX05BTkRGX0NTXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0dQSU82XzE2CQkoX01YNTNfUEFEX05BTkRGX0NTM19fR1BJTzZfMTYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0lQVV9TSVNHXzEJCShfTVg1M19QQURfTkFOREZfQ1MzX19JUFVfU0lTR18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19FU0FJMV9UWDEJCShfTVg1M19QQURfTkFOREZfQ1MzX19FU0FJMV9UWDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9XRUlNX0FfMjYJCShfTVg1M19QQURfTkFOREZfQ1MzX19FTUlfV0VJTV9BXzI2IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19NTEJfTUxCREFUCQkoX01YNTNfUEFEX05BTkRGX0NTM19fTUxCX01MQkRBVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fVVNCUEhZMV9WU1RBVFVTXzcJCShfTVg1M19QQURfTkFOREZfQ1MzX19VU0JQSFkxX1ZTVEFUVVNfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19GRUNfTURJTwkJKF9NWDUzX1BBRF9GRUNfTURJT19fRkVDX01ESU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fR1BJTzFfMjIJCShfTVg1M19QQURfRkVDX01ESU9fX0dQSU8xXzIyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0VTQUkxX1NDS1IJCShfTVg1M19QQURfRkVDX01ESU9fX0VTQUkxX1NDS1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fRkVDX0NPTAkJKF9NWDUzX1BBRF9GRUNfTURJT19fRkVDX0NPTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19SVENfQ0VfUlRDX1BTMgkJKF9NWDUzX1BBRF9GRUNfTURJT19fUlRDX0NFX1JUQ19QUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fU0RNQV9ERUJVR19CVVNfREVWSUNFXzMJCShfTVg1M19QQURfRkVDX01ESU9fX1NETUFfREVCVUdfQlVTX0RFVklDRV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0VNSV9FTUlfREVCVUdfNDkJCShfTVg1M19QQURfRkVDX01ESU9fX0VNSV9FTUlfREVCVUdfNDkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fRkVDX1RYX0NMSwkJKF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fRkVDX1RYX0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19HUElPMV8yMwkJKF9NWDUzX1BBRF9GRUNfUkVGX0NMS19fR1BJTzFfMjMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fRVNBSTFfRlNSCQkoX01YNTNfUEFEX0ZFQ19SRUZfQ0xLX19FU0FJMV9GU1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUkVGX0NMS19fU0RNQV9ERUJVR19CVVNfREVWSUNFXzQJCShfTVg1M19QQURfRkVDX1JFRl9DTEtfX1NETUFfREVCVUdfQlVTX0RFVklDRV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX0VNSV9FTUlfREVCVUdfNTAJCShfTVg1M19QQURfRkVDX1JFRl9DTEtfX0VNSV9FTUlfREVCVUdfNTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0ZFQ19SWF9FUgkJKF9NWDUzX1BBRF9GRUNfUlhfRVJfX0ZFQ19SWF9FUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fR1BJTzFfMjQJCShfTVg1M19QQURfRkVDX1JYX0VSX19HUElPMV8yNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fRVNBSTFfSENLUgkJKF9NWDUzX1BBRF9GRUNfUlhfRVJfX0VTQUkxX0hDS1IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX0ZFQ19SWF9DTEsJCShfTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19SVENfQ0VfUlRDX1BTMwkJKF9NWDUzX1BBRF9GRUNfUlhfRVJfX1JUQ19DRV9SVENfUFMzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX0NSU19EVl9fRkVDX1JYX0RWCQkoX01YNTNfUEFEX0ZFQ19DUlNfRFZfX0ZFQ19SWF9EViB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0dQSU8xXzI1CQkoX01YNTNfUEFEX0ZFQ19DUlNfRFZfX0dQSU8xXzI1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX0NSU19EVl9fRVNBSTFfU0NLVAkJKF9NWDUzX1BBRF9GRUNfQ1JTX0RWX19FU0FJMV9TQ0tUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX0ZFQ19SREFUQV8xCQkoX01YNTNfUEFEX0ZFQ19SWEQxX19GRUNfUkRBVEFfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19HUElPMV8yNgkJKF9NWDUzX1BBRF9GRUNfUlhEMV9fR1BJTzFfMjYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fRVNBSTFfRlNUCQkoX01YNTNfUEFEX0ZFQ19SWEQxX19FU0FJMV9GU1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fTUxCX01MQlNJRwkJKF9NWDUzX1BBRF9GRUNfUlhEMV9fTUxCX01MQlNJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19SVENfQ0VfUlRDX1BTMQkJKF9NWDUzX1BBRF9GRUNfUlhEMV9fUlRDX0NFX1JUQ19QUzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMF9fRkVDX1JEQVRBXzAJCShfTVg1M19QQURfRkVDX1JYRDBfX0ZFQ19SREFUQV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX0dQSU8xXzI3CQkoX01YNTNfUEFEX0ZFQ19SWEQwX19HUElPMV8yNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19FU0FJMV9IQ0tUCQkoX01YNTNfUEFEX0ZFQ19SWEQwX19FU0FJMV9IQ0tUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX09TQzMya18zMktfT1VUCQkoX01YNTNfUEFEX0ZFQ19SWEQwX19PU0MzMmtfMzJLX09VVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOCQkoX01YNTNfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYX0VOX19HUElPMV8yOAkJKF9NWDUzX1BBRF9GRUNfVFhfRU5fX0dQSU8xXzI4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYX0VOX19FU0FJMV9UWDNfUlgyCQkoX01YNTNfUEFEX0ZFQ19UWF9FTl9fRVNBSTFfVFgzX1JYMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19GRUNfVERBVEFfMQkJKF9NWDUzX1BBRF9GRUNfVFhEMV9fRkVDX1REQVRBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fR1BJTzFfMjkJCShfTVg1M19QQURfRkVDX1RYRDFfX0dQSU8xXzI5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX0VTQUkxX1RYMl9SWDMJCShfTVg1M19QQURfRkVDX1RYRDFfX0VTQUkxX1RYMl9SWDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fTUxCX01MQkNMSwkJKF9NWDUzX1BBRF9GRUNfVFhEMV9fTUxCX01MQkNMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19SVENfQ0VfUlRDX1BSU0NfQ0xLCQkoX01YNTNfUEFEX0ZFQ19UWEQxX19SVENfQ0VfUlRDX1BSU0NfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDBfX0ZFQ19UREFUQV8wCQkoX01YNTNfUEFEX0ZFQ19UWEQwX19GRUNfVERBVEFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19HUElPMV8zMAkJKF9NWDUzX1BBRF9GRUNfVFhEMF9fR1BJTzFfMzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMF9fRVNBSTFfVFg0X1JYMQkJKF9NWDUzX1BBRF9GRUNfVFhEMF9fRVNBSTFfVFg0X1JYMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19VU0JQSFkyX0RBVEFPVVRfMAkJKF9NWDUzX1BBRF9GRUNfVFhEMF9fVVNCUEhZMl9EQVRBT1VUXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19GRUNfTURDCQkoX01YNTNfUEFEX0ZFQ19NRENfX0ZFQ19NREMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19HUElPMV8zMQkJKF9NWDUzX1BBRF9GRUNfTURDX19HUElPMV8zMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX0VTQUkxX1RYNV9SWDAJCShfTVg1M19QQURfRkVDX01EQ19fRVNBSTFfVFg1X1JYMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX01MQl9NTEJEQVQJCShfTVg1M19QQURfRkVDX01EQ19fTUxCX01MQkRBVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX1JUQ19DRV9SVENfQUxBUk0xX1RSSUcJCShfTVg1M19QQURfRkVDX01EQ19fUlRDX0NFX1JUQ19BTEFSTTFfVFJJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX1VTQlBIWTJfREFUQU9VVF8xCQkoX01YNTNfUEFEX0ZFQ19NRENfX1VTQlBIWTJfREFUQU9VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9XX19QQVRBX0RJT1cJCShfTVg1M19QQURfUEFUQV9ESU9XX19QQVRBX0RJT1cgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1dfX0dQSU82XzE3CQkoX01YNTNfUEFEX1BBVEFfRElPV19fR1BJTzZfMTcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1dfX1VBUlQxX1RYRF9NVVgJCShfTVg1M19QQURfUEFUQV9ESU9XX19VQVJUMV9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fVVNCUEhZMl9EQVRBT1VUXzIJCShfTVg1M19QQURfUEFUQV9ESU9XX19VU0JQSFkyX0RBVEFPVVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX1BBVEFfRE1BQ0sJCShfTVg1M19QQURfUEFUQV9ETUFDS19fUEFUQV9ETUFDSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX0dQSU82XzE4CQkoX01YNTNfUEFEX1BBVEFfRE1BQ0tfX0dQSU82XzE4IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFDS19fVUFSVDFfUlhEX01VWAkJKF9NWDUzX1BBRF9QQVRBX0RNQUNLX19VQVJUMV9SWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BQ0tfX1VTQlBIWTJfREFUQU9VVF8zCQkoX01YNTNfUEFEX1BBVEFfRE1BQ0tfX1VTQlBIWTJfREFUQU9VVF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fUEFUQV9ETUFSUQkJKF9NWDUzX1BBRF9QQVRBX0RNQVJRX19QQVRBX0RNQVJRIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fR1BJTzdfMAkJKF9NWDUzX1BBRF9QQVRBX0RNQVJRX19HUElPN18wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fVUFSVDJfVFhEX01VWAkJKF9NWDUzX1BBRF9QQVRBX0RNQVJRX19VQVJUMl9UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX0NDTV9DQ01fT1VUXzAJCShfTVg1M19QQURfUEFUQV9ETUFSUV9fQ0NNX0NDTV9PVVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRE1BUlFfX1VTQlBIWTJfREFUQU9VVF80CQkoX01YNTNfUEFEX1BBVEFfRE1BUlFfX1VTQlBIWTJfREFUQU9VVF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1BBVEFfQlVGRkVSX0VOCQkoX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19QQVRBX0JVRkZFUl9FTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19HUElPN18xCQkoX01YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19HUElPN18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VBUlQyX1JYRF9NVVgJCShfTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VBUlQyX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX0NDTV9DQ01fT1VUXzEJCShfTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX0NDTV9DQ01fT1VUXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fVVNCUEhZMl9EQVRBT1VUXzUJCShfTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VTQlBIWTJfREFUQU9VVF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fUEFUQV9JTlRSUQkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19QQVRBX0lOVFJRIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fR1BJTzdfMgkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19HUElPN18yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fVUFSVDJfQ1RTCQkoX01YNTNfUEFEX1BBVEFfSU5UUlFfX1VBUlQyX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19DQU4xX1RYQ0FOCQkoX01YNTNfUEFEX1BBVEFfSU5UUlFfX0NBTjFfVFhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19DQ01fQ0NNX09VVF8yCQkoX01YNTNfUEFEX1BBVEFfSU5UUlFfX0NDTV9DQ01fT1VUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lOVFJRX19VU0JQSFkyX0RBVEFPVVRfNgkJKF9NWDUzX1BBRF9QQVRBX0lOVFJRX19VU0JQSFkyX0RBVEFPVVRfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fUEFUQV9ESU9SCQkoX01YNTNfUEFEX1BBVEFfRElPUl9fUEFUQV9ESU9SIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9SX19HUElPN18zCQkoX01YNTNfUEFEX1BBVEFfRElPUl9fR1BJTzdfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fVUFSVDJfUlRTCQkoX01YNTNfUEFEX1BBVEFfRElPUl9fVUFSVDJfUlRTIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fQ0FOMV9SWENBTgkJKF9NWDUzX1BBRF9QQVRBX0RJT1JfX0NBTjFfUlhDQU4gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX1VTQlBIWTJfREFUQU9VVF83CQkoX01YNTNfUEFEX1BBVEFfRElPUl9fVVNCUEhZMl9EQVRBT1VUXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1BBVEFfUEFUQV9SRVNFVF9CCQkoX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fUEFUQV9QQVRBX1JFU0VUX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0dQSU83XzQJCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19HUElPN180IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19FU0RIQzNfQ01ECQkoX01YNTNfUEFEX1BBVEFfUkVTRVRfQl9fRVNESEMzX0NNRCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUwkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX0NBTjJfVFhDQU4JCShfTVg1M19QQURfUEFUQV9SRVNFVF9CX19DQU4yX1RYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19VU0JQSFkxX0RBVEFPVVRfMAkJKF9NWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VTQlBIWTFfREFUQU9VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fUEFUQV9JT1JEWQkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19QQVRBX0lPUkRZIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fR1BJTzdfNQkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19HUElPN181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fRVNESEMzX0NMSwkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19FU0RIQzNfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU9SRFlfX1VBUlQxX1JUUwkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19VQVJUMV9SVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fQ0FOMl9SWENBTgkJKF9NWDUzX1BBRF9QQVRBX0lPUkRZX19DQU4yX1JYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fVVNCUEhZMV9EQVRBT1VUXzEJCShfTVg1M19QQURfUEFUQV9JT1JEWV9fVVNCUEhZMV9EQVRBT1VUXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX1BBVEFfREFfMAkJKF9NWDUzX1BBRF9QQVRBX0RBXzBfX1BBVEFfREFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fR1BJTzdfNgkJKF9NWDUzX1BBRF9QQVRBX0RBXzBfX0dQSU83XzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX0VTREhDM19SU1QJCShfTVg1M19QQURfUEFUQV9EQV8wX19FU0RIQzNfUlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19PV0lSRV9MSU5FCQkoX01YNTNfUEFEX1BBVEFfREFfMF9fT1dJUkVfTElORSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fVVNCUEhZMV9EQVRBT1VUXzIJCShfTVg1M19QQURfUEFUQV9EQV8wX19VU0JQSFkxX0RBVEFPVVRfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fUEFUQV9EQV8xCQkoX01YNTNfUEFEX1BBVEFfREFfMV9fUEFUQV9EQV8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19HUElPN183CQkoX01YNTNfUEFEX1BBVEFfREFfMV9fR1BJTzdfNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fRVNESEM0X0NNRAkJKF9NWDUzX1BBRF9QQVRBX0RBXzFfX0VTREhDNF9DTUQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19VQVJUM19DVFMJCShfTVg1M19QQURfUEFUQV9EQV8xX19VQVJUM19DVFMgfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19VU0JQSFkxX0RBVEFPVVRfMwkJKF9NWDUzX1BBRF9QQVRBX0RBXzFfX1VTQlBIWTFfREFUQU9VVF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19QQVRBX0RBXzIJCShfTVg1M19QQURfUEFUQV9EQV8yX19QQVRBX0RBXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX0dQSU83XzgJCShfTVg1M19QQURfUEFUQV9EQV8yX19HUElPN184IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19FU0RIQzRfQ0xLCQkoX01YNTNfUEFEX1BBVEFfREFfMl9fRVNESEM0X0NMSyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX1VBUlQzX1JUUwkJKF9NWDUzX1BBRF9QQVRBX0RBXzJfX1VBUlQzX1JUUyB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX1VTQlBIWTFfREFUQU9VVF80CQkoX01YNTNfUEFEX1BBVEFfREFfMl9fVVNCUEhZMV9EQVRBT1VUXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1BBVEFfQ1NfMAkJKF9NWDUzX1BBRF9QQVRBX0NTXzBfX1BBVEFfQ1NfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMF9fR1BJTzdfOQkJKF9NWDUzX1BBRF9QQVRBX0NTXzBfX0dQSU83XzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1VBUlQzX1RYRF9NVVgJCShfTVg1M19QQURfUEFUQV9DU18wX19VQVJUM19UWERfTVVYIHwgTVVYX1BBRF9DVFJMKE1YNTNfVUFSVF9QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMF9fVVNCUEhZMV9EQVRBT1VUXzUJCShfTVg1M19QQURfUEFUQV9DU18wX19VU0JQSFkxX0RBVEFPVVRfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fUEFUQV9DU18xCQkoX01YNTNfUEFEX1BBVEFfQ1NfMV9fUEFUQV9DU18xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18xX19HUElPN18xMAkJKF9NWDUzX1BBRF9QQVRBX0NTXzFfX0dQSU83XzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18xX19VQVJUM19SWERfTVVYCQkoX01YNTNfUEFEX1BBVEFfQ1NfMV9fVUFSVDNfUlhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzFfX1VTQlBIWTFfREFUQU9VVF82CQkoX01YNTNfUEFEX1BBVEFfQ1NfMV9fVVNCUEhZMV9EQVRBT1VUXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19QQVRBX0RBVEFfMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEEwX19QQVRBX0RBVEFfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX0dQSU8yXzAJCShfTVg1M19QQURfUEFUQV9EQVRBMF9fR1BJTzJfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX0VNSV9OQU5ERl9EXzAJCShfTVg1M19QQURfUEFUQV9EQVRBMF9fRU1JX05BTkRGX0RfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX0VTREhDM19EQVQ0CQkoX01YNTNfUEFEX1BBVEFfREFUQTBfX0VTREhDM19EQVQ0IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX0dQVTNkX0dQVV9ERUJVR19PVVRfMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19JUFVfRElBR19CVVNfMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEEwX19JUFVfRElBR19CVVNfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX1VTQlBIWTFfREFUQU9VVF83CQkoX01YNTNfUEFEX1BBVEFfREFUQTBfX1VTQlBIWTFfREFUQU9VVF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fUEFUQV9EQVRBXzEJCShfTVg1M19QQURfUEFUQV9EQVRBMV9fUEFUQV9EQVRBXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19HUElPMl8xCQkoX01YNTNfUEFEX1BBVEFfREFUQTFfX0dQSU8yXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19FTUlfTkFOREZfRF8xCQkoX01YNTNfUEFEX1BBVEFfREFUQTFfX0VNSV9OQU5ERl9EXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19FU0RIQzNfREFUNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExX19FU0RIQzNfREFUNSB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19HUFUzZF9HUFVfREVCVUdfT1VUXzEJCShfTVg1M19QQURfUEFUQV9EQVRBMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMV9fSVBVX0RJQUdfQlVTXzEJCShfTVg1M19QQURfUEFUQV9EQVRBMV9fSVBVX0RJQUdfQlVTXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19QQVRBX0RBVEFfMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEEyX19QQVRBX0RBVEFfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTJfX0dQSU8yXzIJCShfTVg1M19QQURfUEFUQV9EQVRBMl9fR1BJTzJfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTJfX0VNSV9OQU5ERl9EXzIJCShfTVg1M19QQURfUEFUQV9EQVRBMl9fRU1JX05BTkRGX0RfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTJfX0VTREhDM19EQVQ2CQkoX01YNTNfUEFEX1BBVEFfREFUQTJfX0VTREhDM19EQVQ2IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTJfX0dQVTNkX0dQVV9ERUJVR19PVVRfMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19JUFVfRElBR19CVVNfMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEEyX19JUFVfRElBR19CVVNfMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX1BBVEFfREFUQV8zCQkoX01YNTNfUEFEX1BBVEFfREFUQTNfX1BBVEFfREFUQV8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fR1BJTzJfMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEzX19HUElPMl8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fRU1JX05BTkRGX0RfMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEEzX19FTUlfTkFOREZfRF8zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fRVNESEMzX0RBVDcJCShfTVg1M19QQURfUEFUQV9EQVRBM19fRVNESEMzX0RBVDcgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBM19fR1BVM2RfR1BVX0RFQlVHX09VVF8zCQkoX01YNTNfUEFEX1BBVEFfREFUQTNfX0dQVTNkX0dQVV9ERUJVR19PVVRfMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0lQVV9ESUFHX0JVU18zCQkoX01YNTNfUEFEX1BBVEFfREFUQTNfX0lQVV9ESUFHX0JVU18zIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fUEFUQV9EQVRBXzQJCShfTVg1M19QQURfUEFUQV9EQVRBNF9fUEFUQV9EQVRBXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19HUElPMl80CQkoX01YNTNfUEFEX1BBVEFfREFUQTRfX0dQSU8yXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19FTUlfTkFOREZfRF80CQkoX01YNTNfUEFEX1BBVEFfREFUQTRfX0VNSV9OQU5ERl9EXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19FU0RIQzRfREFUNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE0X19FU0RIQzRfREFUNCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19HUFUzZF9HUFVfREVCVUdfT1VUXzQJCShfTVg1M19QQURfUEFUQV9EQVRBNF9fR1BVM2RfR1BVX0RFQlVHX09VVF80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNF9fSVBVX0RJQUdfQlVTXzQJCShfTVg1M19QQURfUEFUQV9EQVRBNF9fSVBVX0RJQUdfQlVTXzQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19QQVRBX0RBVEFfNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE1X19QQVRBX0RBVEFfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTVfX0dQSU8yXzUJCShfTVg1M19QQURfUEFUQV9EQVRBNV9fR1BJTzJfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTVfX0VNSV9OQU5ERl9EXzUJCShfTVg1M19QQURfUEFUQV9EQVRBNV9fRU1JX05BTkRGX0RfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTVfX0VTREhDNF9EQVQ1CQkoX01YNTNfUEFEX1BBVEFfREFUQTVfX0VTREhDNF9EQVQ1IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTVfX0dQVTNkX0dQVV9ERUJVR19PVVRfNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19JUFVfRElBR19CVVNfNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE1X19JUFVfRElBR19CVVNfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX1BBVEFfREFUQV82CQkoX01YNTNfUEFEX1BBVEFfREFUQTZfX1BBVEFfREFUQV82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fR1BJTzJfNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEE2X19HUElPMl82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fRU1JX05BTkRGX0RfNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEE2X19FTUlfTkFOREZfRF82IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fRVNESEM0X0RBVDYJCShfTVg1M19QQURfUEFUQV9EQVRBNl9fRVNESEM0X0RBVDYgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBNl9fR1BVM2RfR1BVX0RFQlVHX09VVF82CQkoX01YNTNfUEFEX1BBVEFfREFUQTZfX0dQVTNkX0dQVV9ERUJVR19PVVRfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0lQVV9ESUFHX0JVU182CQkoX01YNTNfUEFEX1BBVEFfREFUQTZfX0lQVV9ESUFHX0JVU182IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fUEFUQV9EQVRBXzcJCShfTVg1M19QQURfUEFUQV9EQVRBN19fUEFUQV9EQVRBXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19HUElPMl83CQkoX01YNTNfUEFEX1BBVEFfREFUQTdfX0dQSU8yXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19FTUlfTkFOREZfRF83CQkoX01YNTNfUEFEX1BBVEFfREFUQTdfX0VNSV9OQU5ERl9EXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19FU0RIQzRfREFUNwkJKF9NWDUzX1BBRF9QQVRBX0RBVEE3X19FU0RIQzRfREFUNyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19HUFUzZF9HUFVfREVCVUdfT1VUXzcJCShfTVg1M19QQURfUEFUQV9EQVRBN19fR1BVM2RfR1BVX0RFQlVHX09VVF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBN19fSVBVX0RJQUdfQlVTXzcJCShfTVg1M19QQURfUEFUQV9EQVRBN19fSVBVX0RJQUdfQlVTXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19QQVRBX0RBVEFfOAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE4X19QQVRBX0RBVEFfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0dQSU8yXzgJCShfTVg1M19QQURfUEFUQV9EQVRBOF9fR1BJTzJfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0VTREhDMV9EQVQ0CQkoX01YNTNfUEFEX1BBVEFfREFUQThfX0VTREhDMV9EQVQ0IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0VNSV9OQU5ERl9EXzgJCShfTVg1M19QQURfUEFUQV9EQVRBOF9fRU1JX05BTkRGX0RfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0VTREhDM19EQVQwCQkoX01YNTNfUEFEX1BBVEFfREFUQThfX0VTREhDM19EQVQwIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQThfX0dQVTNkX0dQVV9ERUJVR19PVVRfOAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE4X19HUFUzZF9HUFVfREVCVUdfT1VUXzggfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19JUFVfRElBR19CVVNfOAkJKF9NWDUzX1BBRF9QQVRBX0RBVEE4X19JUFVfRElBR19CVVNfOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX1BBVEFfREFUQV85CQkoX01YNTNfUEFEX1BBVEFfREFUQTlfX1BBVEFfREFUQV85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fR1BJTzJfOQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE5X19HUElPMl85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMxX0RBVDUJCShfTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMxX0RBVDUgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fRU1JX05BTkRGX0RfOQkJKF9NWDUzX1BBRF9QQVRBX0RBVEE5X19FTUlfTkFOREZfRF85IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMzX0RBVDEJCShfTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMzX0RBVDEgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fR1BVM2RfR1BVX0RFQlVHX09VVF85CQkoX01YNTNfUEFEX1BBVEFfREFUQTlfX0dQVTNkX0dQVV9ERUJVR19PVVRfOSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0lQVV9ESUFHX0JVU185CQkoX01YNTNfUEFEX1BBVEFfREFUQTlfX0lQVV9ESUFHX0JVU185IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX1BBVEFfREFUQV8xMAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fUEFUQV9EQVRBXzEwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0dQSU8yXzEwCQkoX01YNTNfUEFEX1BBVEFfREFUQTEwX19HUElPMl8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19FU0RIQzFfREFUNgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMxX0RBVDYgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0VNSV9OQU5ERl9EXzEwCQkoX01YNTNfUEFEX1BBVEFfREFUQTEwX19FTUlfTkFOREZfRF8xMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19FU0RIQzNfREFUMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMzX0RBVDIgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTAJCShfTVg1M19QQURfUEFUQV9EQVRBMTBfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fSVBVX0RJQUdfQlVTXzEwCQkoX01YNTNfUEFEX1BBVEFfREFUQTEwX19JUFVfRElBR19CVVNfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fUEFUQV9EQVRBXzExCQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19QQVRBX0RBVEFfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BJTzJfMTEJCShfTVg1M19QQURfUEFUQV9EQVRBMTFfX0dQSU8yXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VTREhDMV9EQVQ3CQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzFfREFUNyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fRU1JX05BTkRGX0RfMTEJCShfTVg1M19QQURfUEFUQV9EQVRBMTFfX0VNSV9OQU5ERl9EXzExIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VTREhDM19EQVQzCQkoX01YNTNfUEFEX1BBVEFfREFUQTExX19FU0RIQzNfREFUMyB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19JUFVfRElBR19CVVNfMTEJCShfTVg1M19QQURfUEFUQV9EQVRBMTFfX0lQVV9ESUFHX0JVU18xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19QQVRBX0RBVEFfMTIJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX1BBVEFfREFUQV8xMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19HUElPMl8xMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BJTzJfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fRVNESEMyX0RBVDQJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDMl9EQVQ0IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19FTUlfTkFOREZfRF8xMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fRU1JX05BTkRGX0RfMTIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fRVNESEM0X0RBVDAJCShfTVg1M19QQURfUEFUQV9EQVRBMTJfX0VTREhDNF9EQVQwIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzEyCQkoX01YNTNfUEFEX1BBVEFfREFUQTEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0lQVV9ESUFHX0JVU18xMgkJKF9NWDUzX1BBRF9QQVRBX0RBVEExMl9fSVBVX0RJQUdfQlVTXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX1BBVEFfREFUQV8xMwkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fUEFUQV9EQVRBXzEzIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0dQSU8yXzEzCQkoX01YNTNfUEFEX1BBVEFfREFUQTEzX19HUElPMl8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19FU0RIQzJfREFUNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEMyX0RBVDUgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0VNSV9OQU5ERl9EXzEzCQkoX01YNTNfUEFEX1BBVEFfREFUQTEzX19FTUlfTkFOREZfRF8xMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19FU0RIQzRfREFUMQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEM0X0RBVDEgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTMJCShfTVg1M19QQURfUEFUQV9EQVRBMTNfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fSVBVX0RJQUdfQlVTXzEzCQkoX01YNTNfUEFEX1BBVEFfREFUQTEzX19JUFVfRElBR19CVVNfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fUEFUQV9EQVRBXzE0CQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19QQVRBX0RBVEFfMTQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BJTzJfMTQJCShfTVg1M19QQURfUEFUQV9EQVRBMTRfX0dQSU8yXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VTREhDMl9EQVQ2CQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzJfREFUNiB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fRU1JX05BTkRGX0RfMTQJCShfTVg1M19QQURfUEFUQV9EQVRBMTRfX0VNSV9OQU5ERl9EXzE0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VTREhDNF9EQVQyCQkoX01YNTNfUEFEX1BBVEFfREFUQTE0X19FU0RIQzRfREFUMiB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNAkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19JUFVfRElBR19CVVNfMTQJCShfTVg1M19QQURfUEFUQV9EQVRBMTRfX0lQVV9ESUFHX0JVU18xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19QQVRBX0RBVEFfMTUJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX1BBVEFfREFUQV8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19HUElPMl8xNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BJTzJfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fRVNESEMyX0RBVDcJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDMl9EQVQ3IHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19FTUlfTkFOREZfRF8xNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fRU1JX05BTkRGX0RfMTUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fRVNESEM0X0RBVDMJCShfTVg1M19QQURfUEFUQV9EQVRBMTVfX0VTREhDNF9EQVQzIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzE1CQkoX01YNTNfUEFEX1BBVEFfREFUQTE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0lQVV9ESUFHX0JVU18xNQkJKF9NWDUzX1BBRF9QQVRBX0RBVEExNV9fSVBVX0RJQUdfQlVTXzE1IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEwX19FU0RIQzFfREFUMAkJKF9NWDUzX1BBRF9TRDFfREFUQTBfX0VTREhDMV9EQVQwIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fR1BJTzFfMTYJCShfTVg1M19QQURfU0QxX0RBVEEwX19HUElPMV8xNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fR1BUX0NBUElOMQkJKF9NWDUzX1BBRF9TRDFfREFUQTBfX0dQVF9DQVBJTjEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0NTUElfTUlTTwkJKF9NWDUzX1BBRF9TRDFfREFUQTBfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fQ0NNX1BMTDNfQllQCQkoX01YNTNfUEFEX1NEMV9EQVRBMF9fQ0NNX1BMTDNfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19FU0RIQzFfREFUMQkJKF9NWDUzX1BBRF9TRDFfREFUQTFfX0VTREhDMV9EQVQxIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMV9fR1BJTzFfMTcJCShfTVg1M19QQURfU0QxX0RBVEExX19HUElPMV8xNyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMV9fR1BUX0NBUElOMgkJKF9NWDUzX1BBRF9TRDFfREFUQTFfX0dQVF9DQVBJTjIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0NTUElfU1MwCQkoX01YNTNfUEFEX1NEMV9EQVRBMV9fQ1NQSV9TUzAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0NDTV9QTEw0X0JZUAkJKF9NWDUzX1BBRF9TRDFfREFUQTFfX0NDTV9QTEw0X0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0VTREhDMV9DTUQJCShfTVg1M19QQURfU0QxX0NNRF9fRVNESEMxX0NNRCB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19HUElPMV8xOAkJKF9NWDUzX1BBRF9TRDFfQ01EX19HUElPMV8xOCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0dQVF9DTVBPVVQxCQkoX01YNTNfUEFEX1NEMV9DTURfX0dQVF9DTVBPVVQxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fQ1NQSV9NT1NJCQkoX01YNTNfUEFEX1NEMV9DTURfX0NTUElfTU9TSSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0NDTV9QTEwxX0JZUAkJKF9NWDUzX1BBRF9TRDFfQ01EX19DQ01fUExMMV9CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0VTREhDMV9EQVQyCQkoX01YNTNfUEFEX1NEMV9EQVRBMl9fRVNESEMxX0RBVDIgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19HUElPMV8xOQkJKF9NWDUzX1BBRF9TRDFfREFUQTJfX0dQSU8xXzE5IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19HUFRfQ01QT1VUMgkJKF9NWDUzX1BBRF9TRDFfREFUQTJfX0dQVF9DTVBPVVQyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19QV00yX1BXTU8JCShfTVg1M19QQURfU0QxX0RBVEEyX19QV00yX1BXTU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX1dET0cxX1dET0dfQgkJKF9NWDUzX1BBRF9TRDFfREFUQTJfX1dET0cxX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fQ1NQSV9TUzEJCShfTVg1M19QQURfU0QxX0RBVEEyX19DU1BJX1NTMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19SU1RfQl9ERUIJCShfTVg1M19QQURfU0QxX0RBVEEyX19XRE9HMV9XRE9HX1JTVF9CX0RFQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fQ0NNX1BMTDJfQllQCQkoX01YNTNfUEFEX1NEMV9EQVRBMl9fQ0NNX1BMTDJfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fRVNESEMxX0NMSwkJKF9NWDUzX1BBRF9TRDFfQ0xLX19FU0RIQzFfQ0xLIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0dQSU8xXzIwCQkoX01YNTNfUEFEX1NEMV9DTEtfX0dQSU8xXzIwIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fT1NDMzJrXzMyS19PVVQJCShfTVg1M19QQURfU0QxX0NMS19fT1NDMzJrXzMyS19PVVQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19HUFRfQ0xLSU4JCShfTVg1M19QQURfU0QxX0NMS19fR1BUX0NMS0lOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fQ1NQSV9TQ0xLCQkoX01YNTNfUEFEX1NEMV9DTEtfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX1NBVEFfUEhZX0RUQl8wCQkoX01YNTNfUEFEX1NEMV9DTEtfX1NBVEFfUEhZX0RUQl8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19FU0RIQzFfREFUMwkJKF9NWDUzX1BBRF9TRDFfREFUQTNfX0VTREhDMV9EQVQzIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fR1BJTzFfMjEJCShfTVg1M19QQURfU0QxX0RBVEEzX19HUElPMV8yMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fR1BUX0NNUE9VVDMJCShfTVg1M19QQURfU0QxX0RBVEEzX19HUFRfQ01QT1VUMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fUFdNMV9QV01PCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fUFdNMV9QV01PIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19XRE9HMl9XRE9HX0IJCShfTVg1M19QQURfU0QxX0RBVEEzX19XRE9HMl9XRE9HX0IgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX0NTUElfU1MyCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fQ1NQSV9TUzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1dET0cyX1dET0dfUlNUX0JfREVCCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19SU1RfQl9ERUIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1NBVEFfUEhZX0RUQl8xCQkoX01YNTNfUEFEX1NEMV9EQVRBM19fU0FUQV9QSFlfRFRCXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19FU0RIQzJfQ0xLCQkoX01YNTNfUEFEX1NEMl9DTEtfX0VTREhDMl9DTEsgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fR1BJTzFfMTAJCShfTVg1M19QQURfU0QyX0NMS19fR1BJTzFfMTAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19LUFBfQ09MXzUJCShfTVg1M19QQURfU0QyX0NMS19fS1BQX0NPTF81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fQVVETVVYX0FVRDRfUlhGUwkJKF9NWDUzX1BBRF9TRDJfQ0xLX19BVURNVVhfQVVENF9SWEZTIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fQ1NQSV9TQ0xLCQkoX01YNTNfUEFEX1NEMl9DTEtfX0NTUElfU0NMSyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX1NDQ19SQU5ET01fVgkJKF9NWDUzX1BBRF9TRDJfQ0xLX19TQ0NfUkFORE9NX1YgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19FU0RIQzJfQ01ECQkoX01YNTNfUEFEX1NEMl9DTURfX0VTREhDMl9DTUQgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fR1BJTzFfMTEJCShfTVg1M19QQURfU0QyX0NNRF9fR1BJTzFfMTEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19LUFBfUk9XXzUJCShfTVg1M19QQURfU0QyX0NNRF9fS1BQX1JPV181IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fQVVETVVYX0FVRDRfUlhDCQkoX01YNTNfUEFEX1NEMl9DTURfX0FVRE1VWF9BVUQ0X1JYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0NTUElfTU9TSQkJKF9NWDUzX1BBRF9TRDJfQ01EX19DU1BJX01PU0kgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19TQ0NfUkFORE9NCQkoX01YNTNfUEFEX1NEMl9DTURfX1NDQ19SQU5ET00gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0VTREhDMl9EQVQzCQkoX01YNTNfUEFEX1NEMl9EQVRBM19fRVNESEMyX0RBVDMgfCBNVVhfUEFEX0NUUkwoTVg1M19TREhDX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19HUElPMV8xMgkJKF9NWDUzX1BBRF9TRDJfREFUQTNfX0dQSU8xXzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19LUFBfQ09MXzYJCShfTVg1M19QQURfU0QyX0RBVEEzX19LUFBfQ09MXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0FVRE1VWF9BVUQ0X1RYQwkJKF9NWDUzX1BBRF9TRDJfREFUQTNfX0FVRE1VWF9BVUQ0X1RYQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fQ1NQSV9TUzIJCShfTVg1M19QQURfU0QyX0RBVEEzX19DU1BJX1NTMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fU0pDX0RPTkUJCShfTVg1M19QQURfU0QyX0RBVEEzX19TSkNfRE9ORSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fRVNESEMyX0RBVDIJCShfTVg1M19QQURfU0QyX0RBVEEyX19FU0RIQzJfREFUMiB8IE1VWF9QQURfQ1RSTChNWDUzX1NESENfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0dQSU8xXzEzCQkoX01YNTNfUEFEX1NEMl9EQVRBMl9fR1BJTzFfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0tQUF9ST1dfNgkJKF9NWDUzX1BBRF9TRDJfREFUQTJfX0tQUF9ST1dfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fQVVETVVYX0FVRDRfVFhECQkoX01YNTNfUEFEX1NEMl9EQVRBMl9fQVVETVVYX0FVRDRfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19DU1BJX1NTMQkJKF9NWDUzX1BBRF9TRDJfREFUQTJfX0NTUElfU1MxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19TSkNfRkFJTAkJKF9NWDUzX1BBRF9TRDJfREFUQTJfX1NKQ19GQUlMIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEExX19FU0RIQzJfREFUMQkJKF9NWDUzX1BBRF9TRDJfREFUQTFfX0VTREhDMl9EQVQxIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fR1BJTzFfMTQJCShfTVg1M19QQURfU0QyX0RBVEExX19HUElPMV8xNCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fS1BQX0NPTF83CQkoX01YNTNfUEFEX1NEMl9EQVRBMV9fS1BQX0NPTF83IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEExX19BVURNVVhfQVVENF9UWEZTCQkoX01YNTNfUEFEX1NEMl9EQVRBMV9fQVVETVVYX0FVRDRfVFhGUyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fQ1NQSV9TUzAJCShfTVg1M19QQURfU0QyX0RBVEExX19DU1BJX1NTMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fUlRJQ19TRUNfVklPCQkoX01YNTNfUEFEX1NEMl9EQVRBMV9fUlRJQ19TRUNfVklPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19FU0RIQzJfREFUMAkJKF9NWDUzX1BBRF9TRDJfREFUQTBfX0VTREhDMl9EQVQwIHwgTVVYX1BBRF9DVFJMKE1YNTNfU0RIQ19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fR1BJTzFfMTUJCShfTVg1M19QQURfU0QyX0RBVEEwX19HUElPMV8xNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fS1BQX1JPV183CQkoX01YNTNfUEFEX1NEMl9EQVRBMF9fS1BQX1JPV183IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19BVURNVVhfQVVENF9SWEQJCShfTVg1M19QQURfU0QyX0RBVEEwX19BVURNVVhfQVVENF9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0NTUElfTUlTTwkJKF9NWDUzX1BBRF9TRDJfREFUQTBfX0NTUElfTUlTTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fUlRJQ19ET05FX0lOVAkJKF9NWDUzX1BBRF9TRDJfREFUQTBfX1JUSUNfRE9ORV9JTlQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NDTV9DTEtPCQkoX01YNTNfUEFEX0dQSU9fMF9fQ0NNX0NMS08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0dQSU8xXzAJCShfTVg1M19QQURfR1BJT18wX19HUElPMV8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19LUFBfQ09MXzUJCShfTVg1M19QQURfR1BJT18wX19LUFBfQ09MXzUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NDTV9TU0lfRVhUMV9DTEsJCShfTVg1M19QQURfR1BJT18wX19DQ01fU1NJX0VYVDFfQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19FUElUMV9FUElUTwkJKF9NWDUzX1BBRF9HUElPXzBfX0VQSVQxX0VQSVRPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19TUlRDX0FMQVJNX0RFQgkJKF9NWDUzX1BBRF9HUElPXzBfX1NSVENfQUxBUk1fREVCIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18wX19VU0JPSDNfVVNCSDFfUFdSCQkoX01YNTNfUEFEX0dQSU9fMF9fVVNCT0gzX1VTQkgxX1BXUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fQ1NVX1RECQkoX01YNTNfUEFEX0dQSU9fMF9fQ1NVX1REIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xX19FU0FJMV9TQ0tSCQkoX01YNTNfUEFEX0dQSU9fMV9fRVNBSTFfU0NLUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fR1BJTzFfMQkJKF9NWDUzX1BBRF9HUElPXzFfX0dQSU8xXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0tQUF9ST1dfNQkJKF9NWDUzX1BBRF9HUElPXzFfX0tQUF9ST1dfNSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fQ0NNX1NTSV9FWFQyX0NMSwkJKF9NWDUzX1BBRF9HUElPXzFfX0NDTV9TU0lfRVhUMl9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX1BXTTJfUFdNTwkJKF9NWDUzX1BBRF9HUElPXzFfX1BXTTJfUFdNTyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fV0RPRzJfV0RPR19CCQkoX01YNTNfUEFEX0dQSU9fMV9fV0RPRzJfV0RPR19CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xX19FU0RIQzFfQ0QJCShfTVg1M19QQURfR1BJT18xX19FU0RIQzFfQ0QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX1NSQ19URVNURVJfQUNLCQkoX01YNTNfUEFEX0dQSU9fMV9fU1JDX1RFU1RFUl9BQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0VTQUkxX0ZTUgkJKF9NWDUzX1BBRF9HUElPXzlfX0VTQUkxX0ZTUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fR1BJTzFfOQkJKF9NWDUzX1BBRF9HUElPXzlfX0dQSU8xXzkgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX0tQUF9DT0xfNgkJKF9NWDUzX1BBRF9HUElPXzlfX0tQUF9DT0xfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fQ0NNX1JFRl9FTl9CCQkoX01YNTNfUEFEX0dQSU9fOV9fQ0NNX1JFRl9FTl9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT185X19QV00xX1BXTU8JCShfTVg1M19QQURfR1BJT185X19QV00xX1BXTU8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX1dET0cxX1dET0dfQgkJKF9NWDUzX1BBRF9HUElPXzlfX1dET0cxX1dET0dfQiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fRVNESEMxX1dQCQkoX01YNTNfUEFEX0dQSU9fOV9fRVNESEMxX1dQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT185X19TQ0NfRkFJTF9TVEFURQkJKF9NWDUzX1BBRF9HUElPXzlfX1NDQ19GQUlMX1NUQVRFIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19FU0FJMV9IQ0tSCQkoX01YNTNfUEFEX0dQSU9fM19fRVNBSTFfSENLUiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fR1BJTzFfMwkJKF9NWDUzX1BBRF9HUElPXzNfX0dQSU8xXzMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0kyQzNfU0NMCQkoX01YNTNfUEFEX0dQSU9fM19fSTJDM19TQ0wgfCBNVVhfUEFEX0NUUkwoUEFEX0NUUkxfSTJDKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19EUExMSVAxX1RPR19FTgkJKF9NWDUzX1BBRF9HUElPXzNfX0RQTExJUDFfVE9HX0VOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18zX19DQ01fQ0xLTzIJCShfTVg1M19QQURfR1BJT18zX19DQ01fQ0xLTzIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQwCQkoX01YNTNfUEFEX0dQSU9fM19fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX1VTQk9IM19VU0JIMV9PQwkJKF9NWDUzX1BBRF9HUElPXzNfX1VTQk9IM19VU0JIMV9PQyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fTUxCX01MQkNMSwkJKF9NWDUzX1BBRF9HUElPXzNfX01MQl9NTEJDTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0VTQUkxX1NDS1QJCShfTVg1M19QQURfR1BJT182X19FU0FJMV9TQ0tUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19HUElPMV82CQkoX01YNTNfUEFEX0dQSU9fNl9fR1BJTzFfNiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fSTJDM19TREEJCShfTVg1M19QQURfR1BJT182X19JMkMzX1NEQSB8IE1VWF9QQURfQ1RSTChQQURfQ1RSTF9JMkMpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0NDTV9DQ01fT1VUXzAJCShfTVg1M19QQURfR1BJT182X19DQ01fQ0NNX09VVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT182X19DU1VfQ1NVX0lOVF9ERUIJCShfTVg1M19QQURfR1BJT182X19DU1VfQ1NVX0lOVF9ERUIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQxCQkoX01YNTNfUEFEX0dQSU9fNl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0VTREhDMl9MQ1RMCQkoX01YNTNfUEFEX0dQSU9fNl9fRVNESEMyX0xDVEwgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX01MQl9NTEJTSUcJCShfTVg1M19QQURfR1BJT182X19NTEJfTUxCU0lHIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19FU0FJMV9GU1QJCShfTVg1M19QQURfR1BJT18yX19FU0FJMV9GU1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0dQSU8xXzIJCShfTVg1M19QQURfR1BJT18yX19HUElPMV8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19LUFBfUk9XXzYJCShfTVg1M19QQURfR1BJT18yX19LUFBfUk9XXzYgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0NDTV9DQ01fT1VUXzEJCShfTVg1M19QQURfR1BJT18yX19DQ01fQ0NNX09VVF8xIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19DU1VfQ1NVX0FMQVJNX0FVVF8wCQkoX01YNTNfUEFEX0dQSU9fMl9fQ1NVX0NTVV9BTEFSTV9BVVRfMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDIJCShfTVg1M19QQURfR1BJT18yX19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fRVNESEMyX1dQCQkoX01YNTNfUEFEX0dQSU9fMl9fRVNESEMyX1dQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18yX19NTEJfTUxCREFUCQkoX01YNTNfUEFEX0dQSU9fMl9fTUxCX01MQkRBVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fRVNBSTFfSENLVAkJKF9NWDUzX1BBRF9HUElPXzRfX0VTQUkxX0hDS1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0dQSU8xXzQJCShfTVg1M19QQURfR1BJT180X19HUElPMV80IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT180X19LUFBfQ09MXzcJCShfTVg1M19QQURfR1BJT180X19LUFBfQ09MXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0NDTV9DQ01fT1VUXzIJCShfTVg1M19QQURfR1BJT180X19DQ01fQ0NNX09VVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT180X19DU1VfQ1NVX0FMQVJNX0FVVF8xCQkoX01YNTNfUEFEX0dQSU9fNF9fQ1NVX0NTVV9BTEFSTV9BVVRfMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDMJCShfTVg1M19QQURfR1BJT180X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fRVNESEMyX0NECQkoX01YNTNfUEFEX0dQSU9fNF9fRVNESEMyX0NEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT180X19TQ0NfU0VDX1NUQVRFCQkoX01YNTNfUEFEX0dQSU9fNF9fU0NDX1NFQ19TVEFURSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fRVNBSTFfVFgyX1JYMwkJKF9NWDUzX1BBRF9HUElPXzVfX0VTQUkxX1RYMl9SWDMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0dQSU8xXzUJCShfTVg1M19QQURfR1BJT181X19HUElPMV81IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19LUFBfUk9XXzcJCShfTVg1M19QQURfR1BJT181X19LUFBfUk9XXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0NDTV9DTEtPCQkoX01YNTNfUEFEX0dQSU9fNV9fQ0NNX0NMS08gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0NTVV9DU1VfQUxBUk1fQVVUXzIJCShfTVg1M19QQURfR1BJT181X19DU1VfQ1NVX0FMQVJNX0FVVF8yIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUNAkJKF9NWDUzX1BBRF9HUElPXzVfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQ0IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT181X19JMkMzX1NDTAkJKF9NWDUzX1BBRF9HUElPXzVfX0kyQzNfU0NMIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fQ0NNX1BMTDFfQllQCQkoX01YNTNfUEFEX0dQSU9fNV9fQ0NNX1BMTDFfQllQIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19FU0FJMV9UWDRfUlgxCQkoX01YNTNfUEFEX0dQSU9fN19fRVNBSTFfVFg0X1JYMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fR1BJTzFfNwkJKF9NWDUzX1BBRF9HUElPXzdfX0dQSU8xXzcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0VQSVQxX0VQSVRPCQkoX01YNTNfUEFEX0dQSU9fN19fRVBJVDFfRVBJVE8gfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0NBTjFfVFhDQU4JCShfTVg1M19QQURfR1BJT183X19DQU4xX1RYQ0FOIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT183X19VQVJUMl9UWERfTVVYCQkoX01YNTNfUEFEX0dQSU9fN19fVUFSVDJfVFhEX01VWCB8IE1VWF9QQURfQ1RSTChNWDUzX1VBUlRfUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0ZJUklfUlhECQkoX01YNTNfUEFEX0dQSU9fN19fRklSSV9SWEQgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLCQkoX01YNTNfUEFEX0dQSU9fN19fU1BESUZfUExPQ0sgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUAkJKF9NWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRVNBSTFfVFg1X1JYMAkJKF9NWDUzX1BBRF9HUElPXzhfX0VTQUkxX1RYNV9SWDAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0dQSU8xXzgJCShfTVg1M19QQURfR1BJT184X19HUElPMV84IHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19FUElUMl9FUElUTwkJKF9NWDUzX1BBRF9HUElPXzhfX0VQSVQyX0VQSVRPIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19DQU4xX1JYQ0FOCQkoX01YNTNfUEFEX0dQSU9fOF9fQ0FOMV9SWENBTiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fVUFSVDJfUlhEX01VWAkJKF9NWDUzX1BBRF9HUElPXzhfX1VBUlQyX1JYRF9NVVggfCBNVVhfUEFEX0NUUkwoTVg1M19VQVJUX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19GSVJJX1RYRAkJKF9NWDUzX1BBRF9HUElPXzhfX0ZJUklfVFhEIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19TUERJRl9TUkNMSwkJKF9NWDUzX1BBRF9HUElPXzhfX1NQRElGX1NSQ0xLIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT184X19DQ01fUExMM19CWVAJCShfTVg1M19QQURfR1BJT184X19DQ01fUExMM19CWVAgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19FU0FJMV9UWDNfUlgyCQkoX01YNTNfUEFEX0dQSU9fMTZfX0VTQUkxX1RYM19SWDIgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19HUElPN18xMQkJKF9NWDUzX1BBRF9HUElPXzE2X19HUElPN18xMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1RaSUNfUFdSRkFJTF9JTlQJCShfTVg1M19QQURfR1BJT18xNl9fVFpJQ19QV1JGQUlMX0lOVCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1JUQ19DRV9SVENfRVhUX1RSSUcxCQkoX01YNTNfUEFEX0dQSU9fMTZfX1JUQ19DRV9SVENfRVhUX1RSSUcxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fU1BESUZfSU4xCQkoX01YNTNfUEFEX0dQSU9fMTZfX1NQRElGX0lOMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX0kyQzNfU0RBCQkoX01YNTNfUEFEX0dQSU9fMTZfX0kyQzNfU0RBIHwgTVVYX1BBRF9DVFJMKFBBRF9DVFJMX0kyQykpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1NKQ19ERV9CCQkoX01YNTNfUEFEX0dQSU9fMTZfX1NKQ19ERV9CIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fRVNBSTFfVFgwCQkoX01YNTNfUEFEX0dQSU9fMTdfX0VTQUkxX1RYMCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0dQSU83XzEyCQkoX01YNTNfUEFEX0dQSU9fMTdfX0dQSU83XzEyIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fU0RNQV9FWFRfRVZFTlRfMAkJKF9NWDUzX1BBRF9HUElPXzE3X19TRE1BX0VYVF9FVkVOVF8wIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fR1BDX1BNSUNfUkRZCQkoX01YNTNfUEFEX0dQSU9fMTdfX0dQQ19QTUlDX1JEWSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1JUQ19DRV9SVENfRlNWX1RSSUcJCShfTVg1M19QQURfR1BJT18xN19fUlRDX0NFX1JUQ19GU1ZfVFJJRyB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NQRElGX09VVDEJCShfTVg1M19QQURfR1BJT18xN19fU1BESUZfT1VUMSB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0lQVV9TTk9PUDIJCShfTVg1M19QQURfR1BJT18xN19fSVBVX1NOT09QMiB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NKQ19KVEFHX0FDVAkJKF9NWDUzX1BBRF9HUElPXzE3X19TSkNfSlRBR19BQ1QgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19FU0FJMV9UWDEJCShfTVg1M19QQURfR1BJT18xOF9fRVNBSTFfVFgxIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKLSNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fR1BJTzdfMTMJCShfTVg1M19QQURfR1BJT18xOF9fR1BJTzdfMTMgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19TRE1BX0VYVF9FVkVOVF8xCQkoX01YNTNfUEFEX0dQSU9fMThfX1NETUFfRVhUX0VWRU5UXzEgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19PV0lSRV9MSU5FCQkoX01YNTNfUEFEX0dQSU9fMThfX09XSVJFX0xJTkUgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19SVENfQ0VfUlRDX0FMQVJNMl9UUklHCQkoX01YNTNfUEFEX0dQSU9fMThfX1JUQ19DRV9SVENfQUxBUk0yX1RSSUcgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19DQ01fQVNSQ19FWFRfQ0xLCQkoX01YNTNfUEFEX0dQSU9fMThfX0NDTV9BU1JDX0VYVF9DTEsgfCBNVVhfUEFEX0NUUkwoTk9fUEFEX0NUUkwpKQotI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19FU0RIQzFfTENUTAkJKF9NWDUzX1BBRF9HUElPXzE4X19FU0RIQzFfTENUTCB8IE1VWF9QQURfQ1RSTChOT19QQURfQ1RSTCkpCi0jZGVmaW5lIE1YNTNfUEFEX0dQSU9fMThfX1NSQ19TWVNURU1fUlNUCQkoX01YNTNfUEFEX0dQSU9fMThfX1NSQ19TWVNURU1fUlNUIHwgTVVYX1BBRF9DVFJMKE5PX1BBRF9DVFJMKSkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fS1BQX0NPTF81CQkJSU9NVVhfUEFEKDB4MzQ4LCAweDAyMCwgMCwgMHg4NDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19HUElPNF81CQkJSU9NVVhfUEFEKDB4MzQ4LCAweDAyMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE5X19DQ01fQ0xLTwkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fU1BESUZfT1VUMQkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fUlRDX0NFX1JUQ19FWFRfVFJJRzIJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fRUNTUEkxX1JEWQkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOV9fRkVDX1REQVRBXzMJCQlJT01VWF9QQUQoMHgzNDgsIDB4MDIwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTlfX1NSQ19JTlRfQk9PVAkJCUlPTVVYX1BBRCgweDM0OCwgMHgwMjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0tQUF9DT0xfMAkJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0dQSU80XzYJCQlJT01VWF9QQUQoMHgzNEMsIDB4MDI0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19BVURNVVhfQVVENV9UWEMJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDIsIDB4NzU4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX1VBUlQ0X1RYRF9NVVgJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDQsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wwX19FQ1NQSTFfU0NMSwkJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDUsIDB4NzlDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDBfX0ZFQ19SREFUQV8zCQkJSU9NVVhfUEFEKDB4MzRDLCAweDAyNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMF9fU1JDX0FOWV9QVV9SU1QJCUlPTVVYX1BBRCgweDM0QywgMHgwMjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0tQUF9ST1dfMAkJCUlPTVVYX1BBRCgweDM1MCwgMHgwMjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0dQSU80XzcJCQlJT01VWF9QQUQoMHgzNTAsIDB4MDI4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19BVURNVVhfQVVENV9UWEQJCUlPTVVYX1BBRCgweDM1MCwgMHgwMjgsIDIsIDB4NzRDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX1VBUlQ0X1JYRF9NVVgJCUlPTVVYX1BBRCgweDM1MCwgMHgwMjgsIDQsIDB4ODkwLCAxLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cwX19FQ1NQSTFfTU9TSQkJCUlPTVVYX1BBRCgweDM1MCwgMHgwMjgsIDUsIDB4N0E0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzBfX0ZFQ19UWF9FUgkJCUlPTVVYX1BBRCgweDM1MCwgMHgwMjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0tQUF9DT0xfMQkJCUlPTVVYX1BBRCgweDM1NCwgMHgwMkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDFfX0dQSU80XzgJCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19BVURNVVhfQVVENV9UWEZTCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCAyLCAweDc1QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19VQVJUNV9UWERfTVVYCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCA0LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fRUNTUEkxX01JU08JCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCA1LCAweDdBMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wxX19GRUNfUlhfQ0xLCQkJSU9NVVhfUEFEKDB4MzU0LCAweDAyQywgNiwgMHg4MDgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMV9fVVNCUEhZMV9UWFJFQURZCQlJT01VWF9QQUQoMHgzNTQsIDB4MDJDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19LUFBfUk9XXzEJCQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19HUElPNF85CQkJSU9NVVhfUEFEKDB4MzU4LCAweDAzMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fQVVETVVYX0FVRDVfUlhECQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCAyLCAweDc0OCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19VQVJUNV9SWERfTVVYCQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCA0LCAweDg5OCwgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMV9fRUNTUEkxX1NTMAkJCUlPTVVYX1BBRCgweDM1OCwgMHgwMzAsIDUsIDB4N0E4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzFfX0ZFQ19DT0wJCQlJT01VWF9QQUQoMHgzNTgsIDB4MDMwLCA2LCAweDgwMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cxX19VU0JQSFkxX1JYVkFMSUQJCUlPTVVYX1BBRCgweDM1OCwgMHgwMzAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0tQUF9DT0xfMgkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0dQSU80XzEwCQkJSU9NVVhfUEFEKDB4MzVDLCAweDAzNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fQ0FOMV9UWENBTgkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19NRElPCQkJSU9NVVhfUEFEKDB4MzVDLCAweDAzNCwgNCwgMHg4MDQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fRUNTUEkxX1NTMQkJCUlPTVVYX1BBRCgweDM1QywgMHgwMzQsIDUsIDB4N0FDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDJfX0ZFQ19SREFUQV8yCQkJSU9NVVhfUEFEKDB4MzVDLCAweDAzNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MMl9fVVNCUEhZMV9SWEFDVElWRQkJSU9NVVhfUEFEKDB4MzVDLCAweDAzNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fS1BQX1JPV18yCQkJSU9NVVhfUEFEKDB4MzYwLCAweDAzOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fR1BJTzRfMTEJCQlJT01VWF9QQUQoMHgzNjAsIDB4MDM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19DQU4xX1JYQ0FOCQkJSU9NVVhfUEFEKDB4MzYwLCAweDAzOCwgMiwgMHg3NjAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XMl9fRkVDX01EQwkJCUlPTVVYX1BBRCgweDM2MCwgMHgwMzgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX0VDU1BJMV9TUzIJCQlJT01VWF9QQUQoMHgzNjAsIDB4MDM4LCA1LCAweDdCMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1cyX19GRUNfVERBVEFfMgkJCUlPTVVYX1BBRCgweDM2MCwgMHgwMzgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzJfX1VTQlBIWTFfUlhFUlJPUgkJSU9NVVhfUEFEKDB4MzYwLCAweDAzOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fS1BQX0NPTF8zCQkJSU9NVVhfUEFEKDB4MzY0LCAweDAzQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fR1BJTzRfMTIJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19VU0JPSDNfSDJfRFAJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19TUERJRl9JTjEJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCAzLCAweDg3MCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19JMkMyX1NDTAkJCUlPTVVYX1BBRCgweDM2NCwgMHgwM0MsIDQgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MUMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MM19fRUNTUEkxX1NTMwkJCUlPTVVYX1BBRCgweDM2NCwgMHgwM0MsIDUsIDB4N0I0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDNfX0ZFQ19DUlMJCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0wzX19VU0JQSFkxX1NJRUNMT0NLCQlJT01VWF9QQUQoMHgzNjQsIDB4MDNDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19LUFBfUk9XXzMJCQlJT01VWF9QQUQoMHgzNjgsIDB4MDQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19HUElPNF8xMwkJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX1VTQk9IM19IMl9ETQkJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0NDTV9BU1JDX0VYVF9DTEsJCUlPTVVYX1BBRCgweDM2OCwgMHgwNDAsIDMsIDB4NzY4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzNfX0kyQzJfU0RBCQkJSU9NVVhfUEFEKDB4MzY4LCAweDA0MCwgNCB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1czX19PU0MzMktfMzJLX09VVAkJSU9NVVhfUEFEKDB4MzY4LCAweDA0MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fQ0NNX1BMTDRfQllQCQkJSU9NVVhfUEFEKDB4MzY4LCAweDA0MCwgNiwgMHg3N0MsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XM19fVVNCUEhZMV9MSU5FU1RBVEVfMAkJSU9NVVhfUEFEKDB4MzY4LCAweDA0MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fS1BQX0NPTF80CQkJSU9NVVhfUEFEKDB4MzZDLCAweDA0NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fR1BJTzRfMTQJCQlJT01VWF9QQUQoMHgzNkMsIDB4MDQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19DQU4yX1RYQ0FOCQkJSU9NVVhfUEFEKDB4MzZDLCAweDA0NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfQ09MNF9fSVBVX1NJU0dfNAkJCUlPTVVYX1BBRCgweDM2QywgMHgwNDQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX0NPTDRfX1VBUlQ1X1JUUwkJCUlPTVVYX1BBRCgweDM2QywgMHgwNDQsIDQsIDB4ODk0LCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VU0JPSDNfVVNCT1RHX09DCQlJT01VWF9QQUQoMHgzNkMsIDB4MDQ0LCA1LCAweDg5QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9DT0w0X19VU0JQSFkxX0xJTkVTVEFURV8xCQlJT01VWF9QQUQoMHgzNkMsIDB4MDQ0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19LUFBfUk9XXzQJCQlJT01VWF9QQUQoMHgzNzAsIDB4MDQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19HUElPNF8xNQkJCUlPTVVYX1BBRCgweDM3MCwgMHgwNDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX0NBTjJfUlhDQU4JCQlJT01VWF9QQUQoMHgzNzAsIDB4MDQ4LCAyLCAweDc2NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19JUFVfU0lTR181CQkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9LRVlfUk9XNF9fVUFSVDVfQ1RTCQkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgNCwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfS0VZX1JPVzRfX1VTQk9IM19VU0JPVEdfUFdSCQlJT01VWF9QQUQoMHgzNzAsIDB4MDQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0tFWV9ST1c0X19VU0JQSFkxX1ZCVVNWQUxJRAkJSU9NVVhfUEFEKDB4MzcwLCAweDA0OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX0lQVV9ESTBfRElTUF9DTEsJCUlPTVVYX1BBRCgweDM3OCwgMHgwNEMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19HUElPNF8xNgkJCUlPTVVYX1BBRCgweDM3OCwgMHgwNEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX0RJU1BfQ0xLX19VU0JPSDNfVVNCSDJfRElSCQlJT01VWF9QQUQoMHgzNzgsIDB4MDRDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9ESVNQX0NMS19fU0RNQV9ERUJVR19DT1JFX1NUQVRFXzAJSU9NVVhfUEFEKDB4Mzc4LCAweDA0QywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX0VNSV9FTUlfREVCVUdfMAkJSU9NVVhfUEFEKDB4Mzc4LCAweDA0QywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfRElTUF9DTEtfX1VTQlBIWTFfQVZBTElECQlJT01VWF9QQUQoMHgzNzgsIDB4MDRDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4xNV9fSVBVX0RJMF9QSU4xNQkJSU9NVVhfUEFEKDB4MzdDLCAweDA1MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX0dQSU80XzE3CQkJSU9NVVhfUEFEKDB4MzdDLCAweDA1MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX0FVRE1VWF9BVUQ2X1RYQwkJSU9NVVhfUEFEKDB4MzdDLCAweDA1MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMTVfX1NETUFfREVCVUdfQ09SRV9TVEFURV8xCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19FTUlfRU1JX0RFQlVHXzEJCUlPTVVYX1BBRCgweDM3QywgMHgwNTAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjE1X19VU0JQSFkxX0JWQUxJRAkJSU9NVVhfUEFEKDB4MzdDLCAweDA1MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fSVBVX0RJMF9QSU4yCQkJSU9NVVhfUEFEKDB4MzgwLCAweDA1NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fR1BJTzRfMTgJCQlJT01VWF9QQUQoMHgzODAsIDB4MDU0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4yX19BVURNVVhfQVVENl9UWEQJCUlPTVVYX1BBRCgweDM4MCwgMHgwNTQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX1NETUFfREVCVUdfQ09SRV9TVEFURV8yCUlPTVVYX1BBRCgweDM4MCwgMHgwNTQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjJfX0VNSV9FTUlfREVCVUdfMgkJSU9NVVhfUEFEKDB4MzgwLCAweDA1NCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOMl9fVVNCUEhZMV9FTkRTRVNTSU9OCQlJT01VWF9QQUQoMHgzODAsIDB4MDU0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19JUFVfREkwX1BJTjMJCQlJT01VWF9QQUQoMHgzODQsIDB4MDU4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU4zX19HUElPNF8xOQkJCUlPTVVYX1BBRCgweDM4NCwgMHgwNTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX0FVRE1VWF9BVUQ2X1RYRlMJCUlPTVVYX1BBRCgweDM4NCwgMHgwNTgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX1NETUFfREVCVUdfQ09SRV9TVEFURV8zCUlPTVVYX1BBRCgweDM4NCwgMHgwNTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjNfX0VNSV9FTUlfREVCVUdfMwkJSU9NVVhfUEFEKDB4Mzg0LCAweDA1OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElOM19fVVNCUEhZMV9JRERJRwkJSU9NVVhfUEFEKDB4Mzg0LCAweDA1OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fSVBVX0RJMF9QSU40CQkJSU9NVVhfUEFEKDB4Mzg4LCAweDA1QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fR1BJTzRfMjAJCQlJT01VWF9QQUQoMHgzODgsIDB4MDVDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJMF9QSU40X19BVURNVVhfQVVENl9SWEQJCUlPTVVYX1BBRCgweDM4OCwgMHgwNUMsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0VTREhDMV9XUAkJCUlPTVVYX1BBRCgweDM4OCwgMHgwNUMsIDMsIDB4N0ZDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX1NETUFfREVCVUdfWUlFTEQJCUlPTVVYX1BBRCgweDM4OCwgMHgwNUMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfREkwX1BJTjRfX0VNSV9FTUlfREVCVUdfNAkJSU9NVVhfUEFEKDB4Mzg4LCAweDA1QywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESTBfUElONF9fVVNCUEhZMV9IT1NURElTQ09OTkVDVAlJT01VWF9QQUQoMHgzODgsIDB4MDVDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX0lQVV9ESVNQMF9EQVRfMAkJSU9NVVhfUEFEKDB4MzhDLCAweDA2MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19HUElPNF8yMQkJCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fQ1NQSV9TQ0xLCQkJSU9NVVhfUEFEKDB4MzhDLCAweDA2MCwgMiwgMHg3ODAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JPSDNfVVNCSDJfREFUQV8wCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMF9fU0RNQV9ERUJVR19DT1JFX1JVTglJT01VWF9QQUQoMHgzOEMsIDB4MDYwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDBfX0VNSV9FTUlfREVCVUdfNQkJSU9NVVhfUEFEKDB4MzhDLCAweDA2MCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQwX19VU0JQSFkyX1RYUkVBRFkJCUlPTVVYX1BBRCgweDM4QywgMHgwNjAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMV9fSVBVX0RJU1AwX0RBVF8xCQlJT01VWF9QQUQoMHgzOTAsIDB4MDY0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX0dQSU80XzIyCQkJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19DU1BJX01PU0kJCQlJT01VWF9QQUQoMHgzOTAsIDB4MDY0LCAyLCAweDc4OCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX1VTQk9IM19VU0JIMl9EQVRBXzEJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfU0VMCVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzOTAsIDB4MDY0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDFfX0VNSV9FTUlfREVCVUdfNgkJSU9NVVhfUEFEKDB4MzkwLCAweDA2NCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxX19VU0JQSFkyX1JYVkFMSUQJCUlPTVVYX1BBRCgweDM5MCwgMHgwNjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fSVBVX0RJU1AwX0RBVF8yCQlJT01VWF9QQUQoMHgzOTQsIDB4MDY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX0dQSU80XzIzCQkJSU9NVVhfUEFEKDB4Mzk0LCAweDA2OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19DU1BJX01JU08JCQlJT01VWF9QQUQoMHgzOTQsIDB4MDY4LCAyLCAweDc4NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX1VTQk9IM19VU0JIMl9EQVRBXzIJSU9NVVhfUEFEKDB4Mzk0LCAweDA2OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyX19TRE1BX0RFQlVHX01PREUJCUlPTVVYX1BBRCgweDM5NCwgMHgwNjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMl9fRU1JX0VNSV9ERUJVR183CQlJT01VWF9QQUQoMHgzOTQsIDB4MDY4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDJfX1VTQlBIWTJfUlhBQ1RJVkUJCUlPTVVYX1BBRCgweDM5NCwgMHgwNjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fSVBVX0RJU1AwX0RBVF8zCQlJT01VWF9QQUQoMHgzOTgsIDB4MDZDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX0dQSU80XzI0CQkJSU9NVVhfUEFEKDB4Mzk4LCAweDA2QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQzX19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDM5OCwgMHgwNkMsIDIsIDB4NzhDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fVVNCT0gzX1VTQkgyX0RBVEFfMwlJT01VWF9QQUQoMHgzOTgsIDB4MDZDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1NETUFfREVCVUdfQlVTX0VSUk9SCUlPTVVYX1BBRCgweDM5OCwgMHgwNkMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUM19fRU1JX0VNSV9ERUJVR184CQlJT01VWF9QQUQoMHgzOTgsIDB4MDZDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDNfX1VTQlBIWTJfUlhFUlJPUgkJSU9NVVhfUEFEKDB4Mzk4LCAweDA2QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19JUFVfRElTUDBfREFUXzQJCUlPTVVYX1BBRCgweDM5QywgMHgwNzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fR1BJTzRfMjUJCQlJT01VWF9QQUQoMHgzOUMsIDB4MDcwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX0NTUElfU1MxCQkJSU9NVVhfUEFEKDB4MzlDLCAweDA3MCwgMiwgMHg3OTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JPSDNfVVNCSDJfREFUQV80CUlPTVVYX1BBRCgweDM5QywgMHgwNzAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNF9fU0RNQV9ERUJVR19CVVNfUldCCQlJT01VWF9QQUQoMHgzOUMsIDB4MDcwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDRfX0VNSV9FTUlfREVCVUdfOQkJSU9NVVhfUEFEKDB4MzlDLCAweDA3MCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ0X19VU0JQSFkyX1NJRUNMT0NLCQlJT01VWF9QQUQoMHgzOUMsIDB4MDcwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX0lQVV9ESVNQMF9EQVRfNQkJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19HUElPNF8yNgkJCUlPTVVYX1BBRCgweDNBMCwgMHgwNzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNV9fQ1NQSV9TUzIJCQlJT01VWF9QQUQoMHgzQTAsIDB4MDc0LCAyLCAweDc5NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX1VTQk9IM19VU0JIMl9EQVRBXzUJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19TRE1BX0RFQlVHX01BVENIRURfRE1CVVMJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ1X19FTUlfRU1JX0RFQlVHXzEwCQlJT01VWF9QQUQoMHgzQTAsIDB4MDc0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDVfX1VTQlBIWTJfTElORVNUQVRFXzAJSU9NVVhfUEFEKDB4M0EwLCAweDA3NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19JUFVfRElTUDBfREFUXzYJCUlPTVVYX1BBRCgweDNBNCwgMHgwNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fR1BJTzRfMjcJCQlJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0NTUElfU1MzCQkJSU9NVVhfUEFEKDB4M0E0LCAweDA3OCwgMiwgMHg3OTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ2X19VU0JPSDNfVVNCSDJfREFUQV82CUlPTVVYX1BBRCgweDNBNCwgMHgwNzgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fU0RNQV9ERUJVR19SVEJVRkZFUl9XUklURQlJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDZfX0VNSV9FTUlfREVCVUdfMTEJCUlPTVVYX1BBRCgweDNBNCwgMHgwNzgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUNl9fVVNCUEhZMl9MSU5FU1RBVEVfMQlJT01VWF9QQUQoMHgzQTQsIDB4MDc4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX0lQVV9ESVNQMF9EQVRfNwkJSU9NVVhfUEFEKDB4M0E4LCAweDA3QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19HUElPNF8yOAkJCUlPTVVYX1BBRCgweDNBOCwgMHgwN0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fQ1NQSV9SRFkJCQlJT01VWF9QQUQoMHgzQTgsIDB4MDdDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX1VTQk9IM19VU0JIMl9EQVRBXzcJSU9NVVhfUEFEKDB4M0E4LCAweDA3QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ3X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMAlJT01VWF9QQUQoMHgzQTgsIDB4MDdDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDdfX0VNSV9FTUlfREVCVUdfMTIJCUlPTVVYX1BBRCgweDNBOCwgMHgwN0MsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUN19fVVNCUEhZMl9WQlVTVkFMSUQJCUlPTVVYX1BBRCgweDNBOCwgMHgwN0MsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fSVBVX0RJU1AwX0RBVF84CQlJT01VWF9QQUQoMHgzQUMsIDB4MDgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX0dQSU80XzI5CQkJSU9NVVhfUEFEKDB4M0FDLCAweDA4MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19QV00xX1BXTU8JCQlJT01VWF9QQUQoMHgzQUMsIDB4MDgwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX1dET0cxX1dET0dfQgkJSU9NVVhfUEFEKDB4M0FDLCAweDA4MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ4X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMQlJT01VWF9QQUQoMHgzQUMsIDB4MDgwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDhfX0VNSV9FTUlfREVCVUdfMTMJCUlPTVVYX1BBRCgweDNBQywgMHgwODAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOF9fVVNCUEhZMl9BVkFMSUQJCUlPTVVYX1BBRCgweDNBQywgMHgwODAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fSVBVX0RJU1AwX0RBVF85CQlJT01VWF9QQUQoMHgzQjAsIDB4MDg0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX0dQSU80XzMwCQkJSU9NVVhfUEFEKDB4M0IwLCAweDA4NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19QV00yX1BXTU8JCQlJT01VWF9QQUQoMHgzQjAsIDB4MDg0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX1dET0cyX1dET0dfQgkJSU9NVVhfUEFEKDB4M0IwLCAweDA4NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQ5X19TRE1BX0RFQlVHX0VWRU5UX0NIQU5ORUxfMglJT01VWF9QQUQoMHgzQjAsIDB4MDg0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDlfX0VNSV9FTUlfREVCVUdfMTQJCUlPTVVYX1BBRCgweDNCMCwgMHgwODQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUOV9fVVNCUEhZMl9WU1RBVFVTXzAJCUlPTVVYX1BBRCgweDNCMCwgMHgwODQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX0lQVV9ESVNQMF9EQVRfMTAJCUlPTVVYX1BBRCgweDNCNCwgMHgwODgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX0dQSU80XzMxCQkJSU9NVVhfUEFEKDB4M0I0LCAweDA4OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fVVNCT0gzX1VTQkgyX1NUUAkJSU9NVVhfUEFEKDB4M0I0LCAweDA4OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMF9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzMJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNCNCwgMHgwODgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX0VNSV9FTUlfREVCVUdfMTUJCUlPTVVYX1BBRCgweDNCNCwgMHgwODgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTBfX1VTQlBIWTJfVlNUQVRVU18xCQlJT01VWF9QQUQoMHgzQjQsIDB4MDg4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19JUFVfRElTUDBfREFUXzExCQlJT01VWF9QQUQoMHgzQjgsIDB4MDhDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDExX19HUElPNV81CQkJSU9NVVhfUEFEKDB4M0I4LCAweDA4QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fVVNCT0gzX1VTQkgyX05YVAkJSU9NVVhfUEFEKDB4M0I4LCAweDA4QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMV9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzQJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNCOCwgMHgwOEMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX0VNSV9FTUlfREVCVUdfMTYJCUlPTVVYX1BBRCgweDNCOCwgMHgwOEMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTFfX1VTQlBIWTJfVlNUQVRVU18yCQlJT01VWF9QQUQoMHgzQjgsIDB4MDhDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19JUFVfRElTUDBfREFUXzEyCQlJT01VWF9QQUQoMHgzQkMsIDB4MDkwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEyX19HUElPNV82CQkJSU9NVVhfUEFEKDB4M0JDLCAweDA5MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fVVNCT0gzX1VTQkgyX0NMSwkJSU9NVVhfUEFEKDB4M0JDLCAweDA5MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxMl9fU0RNQV9ERUJVR19FVkVOVF9DSEFOTkVMXzUJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNCQywgMHgwOTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX0VNSV9FTUlfREVCVUdfMTcJCUlPTVVYX1BBRCgweDNCQywgMHgwOTAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTJfX1VTQlBIWTJfVlNUQVRVU18zCQlJT01VWF9QQUQoMHgzQkMsIDB4MDkwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19JUFVfRElTUDBfREFUXzEzCQlJT01VWF9QQUQoMHgzQzAsIDB4MDk0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDEzX19HUElPNV83CQkJSU9NVVhfUEFEKDB4M0MwLCAweDA5NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fQVVETVVYX0FVRDVfUlhGUwkJSU9NVVhfUEFEKDB4M0MwLCAweDA5NCwgMywgMHg3NTQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxM19fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzAJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNDMCwgMHgwOTQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX0VNSV9FTUlfREVCVUdfMTgJCUlPTVVYX1BBRCgweDNDMCwgMHgwOTQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTNfX1VTQlBIWTJfVlNUQVRVU180CQlJT01VWF9QQUQoMHgzQzAsIDB4MDk0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19JUFVfRElTUDBfREFUXzE0CQlJT01VWF9QQUQoMHgzQzQsIDB4MDk4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19HUElPNV84CQkJSU9NVVhfUEFEKDB4M0M0LCAweDA5OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fQVVETVVYX0FVRDVfUlhDCQlJT01VWF9QQUQoMHgzQzQsIDB4MDk4LCAzLCAweDc1MCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE0X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMQlcCisJCQkJCQkJSU9NVVhfUEFEKDB4M0M0LCAweDA5OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fRU1JX0VNSV9ERUJVR18xOQkJSU9NVVhfUEFEKDB4M0M0LCAweDA5OCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNF9fVVNCUEhZMl9WU1RBVFVTXzUJCUlPTVVYX1BBRCgweDNDNCwgMHgwOTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX0lQVV9ESVNQMF9EQVRfMTUJCUlPTVVYX1BBRCgweDNDOCwgMHgwOUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTVfX0dQSU81XzkJCQlJT01VWF9QQUQoMHgzQzgsIDB4MDlDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19FQ1NQSTFfU1MxCQlJT01VWF9QQUQoMHgzQzgsIDB4MDlDLCAyLCAweDdBQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19FQ1NQSTJfU1MxCQlJT01VWF9QQUQoMHgzQzgsIDB4MDlDLCAzLCAweDdDOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE1X19TRE1BX0RFQlVHX0VWVF9DSE5fTElORVNfMglcCisJCQkJCQkJSU9NVVhfUEFEKDB4M0M4LCAweDA5QywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fRU1JX0VNSV9ERUJVR18yMAkJSU9NVVhfUEFEKDB4M0M4LCAweDA5QywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNV9fVVNCUEhZMl9WU1RBVFVTXzYJCUlPTVVYX1BBRCgweDNDOCwgMHgwOUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0lQVV9ESVNQMF9EQVRfMTYJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0dQSU81XzEwCQkJSU9NVVhfUEFEKDB4M0NDLCAweDBBMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fRUNTUEkyX01PU0kJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDIsIDB4N0MwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0FVRE1VWF9BVUQ1X1RYQwkJSU9NVVhfUEFEKDB4M0NDLCAweDBBMCwgMywgMHg3NTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9FWFRfRVZFTlRfMAkJSU9NVVhfUEFEKDB4M0NDLCAweDBBMCwgNCwgMHg4NjgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxNl9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzMJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX0VNSV9FTUlfREVCVUdfMjEJCUlPTVVYX1BBRCgweDNDQywgMHgwQTAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTZfX1VTQlBIWTJfVlNUQVRVU183CQlJT01VWF9QQUQoMHgzQ0MsIDB4MEEwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19JUFVfRElTUDBfREFUXzE3CQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19HUElPNV8xMQkJCUlPTVVYX1BBRCgweDNEMCwgMHgwQTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCAyLCAweDdCQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19BVURNVVhfQVVENV9UWEQJCUlPTVVYX1BBRCgweDNEMCwgMHgwQTQsIDMsIDB4NzRDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfRVhUX0VWRU5UXzEJCUlPTVVYX1BBRCgweDNEMCwgMHgwQTQsIDQsIDB4ODZDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTdfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU180CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzIyCQlJT01VWF9QQUQoMHgzRDAsIDB4MEE0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19JUFVfRElTUDBfREFUXzE4CQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19HUElPNV8xMgkJCUlPTVVYX1BBRCgweDNENCwgMHgwQTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0VDU1BJMl9TUzAJCUlPTVVYX1BBRCgweDNENCwgMHgwQTgsIDIsIDB4N0M0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ1X1RYRlMJCUlPTVVYX1BBRCgweDNENCwgMHgwQTgsIDMsIDB4NzVDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX0FVRE1VWF9BVUQ0X1JYRlMJCUlPTVVYX1BBRCgweDNENCwgMHgwQTgsIDQsIDB4NzNDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMThfX1NETUFfREVCVUdfRVZUX0NITl9MSU5FU181CVwKKwkJCQkJCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzIzCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE4X19FTUlfV0VJTV9DU18yCQlJT01VWF9QQUQoMHgzRDQsIDB4MEE4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19JUFVfRElTUDBfREFUXzE5CQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19HUElPNV8xMwkJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0VDU1BJMl9TQ0xLCQlJT01VWF9QQUQoMHgzRDgsIDB4MEFDLCAyLCAweDdCOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDE5X19BVURNVVhfQVVENV9SWEQJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDMsIDB4NzQ4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0FVRE1VWF9BVUQ0X1JYQwkJSU9NVVhfUEFEKDB4M0Q4LCAweDBBQywgNCwgMHg3MzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQxOV9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzYJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9FTUlfREVCVUdfMjQJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMTlfX0VNSV9XRUlNX0NTXzMJCUlPTVVYX1BBRCgweDNEOCwgMHgwQUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0lQVV9ESVNQMF9EQVRfMjAJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0dQSU81XzE0CQkJSU9NVVhfUEFEKDB4M0RDLCAweDBCMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fRUNTUEkxX1NDTEsJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDIsIDB4NzlDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0FVRE1VWF9BVUQ0X1RYQwkJSU9NVVhfUEFEKDB4M0RDLCAweDBCMCwgMywgMHg3NDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMF9fU0RNQV9ERUJVR19FVlRfQ0hOX0xJTkVTXzcJXAorCQkJCQkJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX0VNSV9FTUlfREVCVUdfMjUJCUlPTVVYX1BBRCgweDNEQywgMHgwQjAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjBfX1NBVEFfUEhZX1RESQkJSU9NVVhfUEFEKDB4M0RDLCAweDBCMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fSVBVX0RJU1AwX0RBVF8yMQkJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fR1BJTzVfMTUJCQlJT01VWF9QQUQoMHgzRTAsIDB4MEI0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19FQ1NQSTFfTU9TSQkJSU9NVVhfUEFEKDB4M0UwLCAweDBCNCwgMiwgMHg3QTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMV9fQVVETVVYX0FVRDRfVFhECQlJT01VWF9QQUQoMHgzRTAsIDB4MEI0LCAzLCAweDczNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMAlJT01VWF9QQUQoMHgzRTAsIDB4MEI0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19FTUlfRU1JX0RFQlVHXzI2CQlJT01VWF9QQUQoMHgzRTAsIDB4MEI0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIxX19TQVRBX1BIWV9URE8JCUlPTVVYX1BBRCgweDNFMCwgMHgwQjQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0lQVV9ESVNQMF9EQVRfMjIJCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0dQSU81XzE2CQkJSU9NVVhfUEFEKDB4M0U0LCAweDBCOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyMl9fRUNTUEkxX01JU08JCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDIsIDB4N0EwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0FVRE1VWF9BVUQ0X1RYRlMJCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDMsIDB4NzQ0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX1NETUFfREVCVUdfQlVTX0RFVklDRV8xCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX0VNSV9FTUlfREVCVUdfMjcJCUlPTVVYX1BBRCgweDNFNCwgMHgwQjgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjJfX1NBVEFfUEhZX1RDSwkJSU9NVVhfUEFEKDB4M0U0LCAweDBCOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fSVBVX0RJU1AwX0RBVF8yMwkJSU9NVVhfUEFEKDB4M0U4LCAweDBCQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9ESVNQMF9EQVQyM19fR1BJTzVfMTcJCQlJT01VWF9QQUQoMHgzRTgsIDB4MEJDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19FQ1NQSTFfU1MwCQlJT01VWF9QQUQoMHgzRTgsIDB4MEJDLCAyLCAweDdBOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0RJU1AwX0RBVDIzX19BVURNVVhfQVVENF9SWEQJCUlPTVVYX1BBRCgweDNFOCwgMHgwQkMsIDMsIDB4NzMwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX1NETUFfREVCVUdfQlVTX0RFVklDRV8yCUlPTVVYX1BBRCgweDNFOCwgMHgwQkMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX0VNSV9FTUlfREVCVUdfMjgJCUlPTVVYX1BBRCgweDNFOCwgMHgwQkMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRElTUDBfREFUMjNfX1NBVEFfUEhZX1RNUwkJSU9NVVhfUEFEKDB4M0U4LCAweDBCQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1BJWENMS19fSVBVX0NTSTBfUElYQ0xLCQlJT01VWF9QQUQoMHgzRUMsIDB4MEMwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfUElYQ0xLX19HUElPNV8xOAkJCUlPTVVYX1BBRCgweDNFQywgMHgwQzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9QSVhDTEtfX1NETUFfREVCVUdfUENfMAkJSU9NVVhfUEFEKDB4M0VDLCAweDBDMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1BJWENMS19fRU1JX0VNSV9ERUJVR18yOQkJSU9NVVhfUEFEKDB4M0VDLCAweDBDMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0lQVV9DU0kwX0hTWU5DCQlJT01VWF9QQUQoMHgzRjAsIDB4MEM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfTUNMS19fR1BJTzVfMTkJCQlJT01VWF9QQUQoMHgzRjAsIDB4MEM0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfTUNMS19fQ0NNX0NTSTBfTUNMSwkJSU9NVVhfUEFEKDB4M0YwLCAweDBDNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX1NETUFfREVCVUdfUENfMQkJSU9NVVhfUEFEKDB4M0YwLCAweDBDNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX01DTEtfX0VNSV9FTUlfREVCVUdfMzAJCUlPTVVYX1BBRCgweDNGMCwgMHgwQzQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9NQ0xLX19UUElVX1RSQ1RMCQkJSU9NVVhfUEFEKDB4M0YwLCAweDBDNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVEFfRU5fX0lQVV9DU0kwX0RBVEFfRU4JCUlPTVVYX1BBRCgweDNGNCwgMHgwQzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19HUElPNV8yMAkJCUlPTVVYX1BBRCgweDNGNCwgMHgwQzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19TRE1BX0RFQlVHX1BDXzIJCUlPTVVYX1BBRCgweDNGNCwgMHgwQzgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVRBX0VOX19FTUlfRU1JX0RFQlVHXzMxCQlJT01VWF9QQUQoMHgzRjQsIDB4MEM4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUQV9FTl9fVFBJVV9UUkNMSwkJSU9NVVhfUEFEKDB4M0Y0LCAweDBDOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19JUFVfQ1NJMF9WU1lOQwkJSU9NVVhfUEFEKDB4M0Y4LCAweDBDQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX1ZTWU5DX19HUElPNV8yMQkJCUlPTVVYX1BBRCgweDNGOCwgMHgwQ0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fU0RNQV9ERUJVR19QQ18zCQlJT01VWF9QQUQoMHgzRjgsIDB4MENDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfVlNZTkNfX0VNSV9FTUlfREVCVUdfMzIJCUlPTVVYX1BBRCgweDNGOCwgMHgwQ0MsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9WU1lOQ19fVFBJVV9UUkFDRV8wCQlJT01VWF9QQUQoMHgzRjgsIDB4MENDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fSVBVX0NTSTBfRF80CQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fR1BJTzVfMjIJCQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fS1BQX0NPTF81CQkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgMiwgMHg4NDAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX0VDU1BJMV9TQ0xLCQkJSU9NVVhfUEFEKDB4M0ZDLCAweDBEMCwgMywgMHg3OUMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDRfX1VTQk9IM19VU0JIM19TVFAJCUlPTVVYX1BBRCgweDNGQywgMHgwRDAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19BVURNVVhfQVVEM19UWEMJCUlPTVVYX1BBRCgweDNGQywgMHgwRDAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ0X19FTUlfRU1JX0RFQlVHXzMzCQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNF9fVFBJVV9UUkFDRV8xCQlJT01VWF9QQUQoMHgzRkMsIDB4MEQwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fSVBVX0NTSTBfRF81CQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fR1BJTzVfMjMJCQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fS1BQX1JPV181CQkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgMiwgMHg4NEMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX0VDU1BJMV9NT1NJCQkJSU9NVVhfUEFEKDB4NDAwLCAweDBENCwgMywgMHg3QTQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDVfX1VTQk9IM19VU0JIM19OWFQJCUlPTVVYX1BBRCgweDQwMCwgMHgwRDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19BVURNVVhfQVVEM19UWEQJCUlPTVVYX1BBRCgweDQwMCwgMHgwRDQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ1X19FTUlfRU1JX0RFQlVHXzM0CQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNV9fVFBJVV9UUkFDRV8yCQlJT01VWF9QQUQoMHg0MDAsIDB4MEQ0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fSVBVX0NTSTBfRF82CQlJT01VWF9QQUQoMHg0MDQsIDB4MEQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fR1BJTzVfMjQJCQlJT01VWF9QQUQoMHg0MDQsIDB4MEQ4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fS1BQX0NPTF82CQkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgMiwgMHg4NDQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX0VDU1BJMV9NSVNPCQkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgMywgMHg3QTAsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX1VTQk9IM19VU0JIM19DTEsJCUlPTVVYX1BBRCgweDQwNCwgMHgwRDgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ2X19BVURNVVhfQVVEM19UWEZTCQlJT01VWF9QQUQoMHg0MDQsIDB4MEQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUNl9fRU1JX0VNSV9ERUJVR18zNQkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDZfX1RQSVVfVFJBQ0VfMwkJSU9NVVhfUEFEKDB4NDA0LCAweDBEOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0lQVV9DU0kwX0RfNwkJSU9NVVhfUEFEKDB4NDA4LCAweDBEQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0dQSU81XzI1CQkJSU9NVVhfUEFEKDB4NDA4LCAweDBEQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX0tQUF9ST1dfNgkJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDIsIDB4ODUwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19FQ1NQSTFfU1MwCQkJSU9NVVhfUEFEKDB4NDA4LCAweDBEQywgMywgMHg3QTgsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDdfX1VTQk9IM19VU0JIM19ESVIJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19BVURNVVhfQVVEM19SWEQJCUlPTVVYX1BBRCgweDQwOCwgMHgwREMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ3X19FTUlfRU1JX0RFQlVHXzM2CQlJT01VWF9QQUQoMHg0MDgsIDB4MERDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUN19fVFBJVV9UUkFDRV80CQlJT01VWF9QQUQoMHg0MDgsIDB4MERDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fSVBVX0NTSTBfRF84CQlJT01VWF9QQUQoMHg0MEMsIDB4MEUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fR1BJTzVfMjYJCQlJT01VWF9QQUQoMHg0MEMsIDB4MEUwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fS1BQX0NPTF83CQkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgMiwgMHg4NDgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0VDU1BJMl9TQ0xLCQkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgMywgMHg3QjgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX1VTQk9IM19VU0JIM19PQwkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX0kyQzFfU0RBCQkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOF9fRU1JX0VNSV9ERUJVR18zNwkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDhfX1RQSVVfVFJBQ0VfNQkJSU9NVVhfUEFEKDB4NDBDLCAweDBFMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0lQVV9DU0kwX0RfOQkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0dQSU81XzI3CQkJSU9NVVhfUEFEKDB4NDEwLCAweDBFNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDlfX0tQUF9ST1dfNwkJCUlPTVVYX1BBRCgweDQxMCwgMHgwRTQsIDIsIDB4ODU0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19FQ1NQSTJfTU9TSQkJCUlPTVVYX1BBRCgweDQxMCwgMHgwRTQsIDMsIDB4N0MwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19VU0JPSDNfVVNCSDNfUFdSCQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fSTJDMV9TQ0wJCQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODE0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQ5X19FTUlfRU1JX0RFQlVHXzM4CQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUOV9fVFBJVV9UUkFDRV82CQlJT01VWF9QQUQoMHg0MTAsIDB4MEU0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0lQVV9DU0kwX0RfMTAJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fR1BJTzVfMjgJCQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX1VBUlQxX1RYRF9NVVgJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0VDU1BJMl9NSVNPCQlJT01VWF9QQUQoMHg0MTQsIDB4MEU4LCAzLCAweDdCQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTBfX0FVRE1VWF9BVUQzX1JYQwkJSU9NVVhfUEFEKDB4NDE0LCAweDBFOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19TRE1BX0RFQlVHX1BDXzQJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMF9fRU1JX0VNSV9ERUJVR18zOQkJSU9NVVhfUEFEKDB4NDE0LCAweDBFOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEwX19UUElVX1RSQUNFXzcJCUlPTVVYX1BBRCgweDQxNCwgMHgwRTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fSVBVX0NTSTBfRF8xMQkJSU9NVVhfUEFEKDB4NDE4LCAweDBFQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19HUElPNV8yOQkJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fVUFSVDFfUlhEX01VWAkJSU9NVVhfUEFEKDB4NDE4LCAweDBFQywgMiwgMHg4NzgsIDEsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fRUNTUEkyX1NTMAkJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDMsIDB4N0M0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fQVVETVVYX0FVRDNfUlhGUwkJSU9NVVhfUEFEKDB4NDE4LCAweDBFQywgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19TRE1BX0RFQlVHX1BDXzUJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMV9fRU1JX0VNSV9ERUJVR180MAkJSU9NVVhfUEFEKDB4NDE4LCAweDBFQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDExX19UUElVX1RSQUNFXzgJCUlPTVVYX1BBRCgweDQxOCwgMHgwRUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fSVBVX0NTSTBfRF8xMgkJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19HUElPNV8zMAkJCUlPTVVYX1BBRCgweDQxQywgMHgwRjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fVUFSVDRfVFhEX01VWAkJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxMl9fVVNCT0gzX1VTQkgzX0RBVEFfMAlJT01VWF9QQUQoMHg0MUMsIDB4MEYwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1NETUFfREVCVUdfUENfNgkJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEyX19FTUlfRU1JX0RFQlVHXzQxCQlJT01VWF9QQUQoMHg0MUMsIDB4MEYwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTJfX1RQSVVfVFJBQ0VfOQkJSU9NVVhfUEFEKDB4NDFDLCAweDBGMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19JUFVfQ1NJMF9EXzEzCQlJT01VWF9QQUQoMHg0MjAsIDB4MEY0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX0dQSU81XzMxCQkJSU9NVVhfUEFEKDB4NDIwLCAweDBGNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19VQVJUNF9SWERfTVVYCQlJT01VWF9QQUQoMHg0MjAsIDB4MEY0LCAyLCAweDg5MCwgMywgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDEzX19VU0JPSDNfVVNCSDNfREFUQV8xCUlPTVVYX1BBRCgweDQyMCwgMHgwRjQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fU0RNQV9ERUJVR19QQ183CQlJT01VWF9QQUQoMHg0MjAsIDB4MEY0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTNfX0VNSV9FTUlfREVCVUdfNDIJCUlPTVVYX1BBRCgweDQyMCwgMHgwRjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxM19fVFBJVV9UUkFDRV8xMAkJSU9NVVhfUEFEKDB4NDIwLCAweDBGNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19JUFVfQ1NJMF9EXzE0CQlJT01VWF9QQUQoMHg0MjQsIDB4MEY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX0dQSU82XzAJCQlJT01VWF9QQUQoMHg0MjQsIDB4MEY4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1VBUlQ1X1RYRF9NVVgJCUlPTVVYX1BBRCgweDQyNCwgMHgwRjgsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTRfX1VTQk9IM19VU0JIM19EQVRBXzIJSU9NVVhfUEFEKDB4NDI0LCAweDBGOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19TRE1BX0RFQlVHX1BDXzgJCUlPTVVYX1BBRCgweDQyNCwgMHgwRjgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNF9fRU1JX0VNSV9ERUJVR180MwkJSU9NVVhfUEFEKDB4NDI0LCAweDBGOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE0X19UUElVX1RSQUNFXzExCQlJT01VWF9QQUQoMHg0MjQsIDB4MEY4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX0lQVV9DU0kwX0RfMTUJCUlPTVVYX1BBRCgweDQyOCwgMHgwRkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fR1BJTzZfMQkJCUlPTVVYX1BBRCgweDQyOCwgMHgwRkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fVUFSVDVfUlhEX01VWAkJSU9NVVhfUEFEKDB4NDI4LCAweDBGQywgMiwgMHg4OTgsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNV9fVVNCT0gzX1VTQkgzX0RBVEFfMwlJT01VWF9QQUQoMHg0MjgsIDB4MEZDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1NETUFfREVCVUdfUENfOQkJSU9NVVhfUEFEKDB4NDI4LCAweDBGQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE1X19FTUlfRU1JX0RFQlVHXzQ0CQlJT01VWF9QQUQoMHg0MjgsIDB4MEZDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTVfX1RQSVVfVFJBQ0VfMTIJCUlPTVVYX1BBRCgweDQyOCwgMHgwRkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fSVBVX0NTSTBfRF8xNgkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19HUElPNl8yCQkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19VQVJUNF9SVFMJCQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCAyLCAweDg4QywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19VU0JPSDNfVVNCSDNfREFUQV80CUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxNl9fU0RNQV9ERUJVR19QQ18xMAkJSU9NVVhfUEFEKDB4NDJDLCAweDEwMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE2X19FTUlfRU1JX0RFQlVHXzQ1CQlJT01VWF9QQUQoMHg0MkMsIDB4MTAwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTZfX1RQSVVfVFJBQ0VfMTMJCUlPTVVYX1BBRCgweDQyQywgMHgxMDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fSVBVX0NTSTBfRF8xNwkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19HUElPNl8zCQkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19VQVJUNF9DVFMJCQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19VU0JPSDNfVVNCSDNfREFUQV81CUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxN19fU0RNQV9ERUJVR19QQ18xMQkJSU9NVVhfUEFEKDB4NDMwLCAweDEwNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE3X19FTUlfRU1JX0RFQlVHXzQ2CQlJT01VWF9QQUQoMHg0MzAsIDB4MTA0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTdfX1RQSVVfVFJBQ0VfMTQJCUlPTVVYX1BBRCgweDQzMCwgMHgxMDQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fSVBVX0NTSTBfRF8xOAkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19HUElPNl80CQkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19VQVJUNV9SVFMJCQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCAyLCAweDg5NCwgMiwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19VU0JPSDNfVVNCSDNfREFUQV82CUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOF9fU0RNQV9ERUJVR19QQ18xMgkJSU9NVVhfUEFEKDB4NDM0LCAweDEwOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE4X19FTUlfRU1JX0RFQlVHXzQ3CQlJT01VWF9QQUQoMHg0MzQsIDB4MTA4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMThfX1RQSVVfVFJBQ0VfMTUJCUlPTVVYX1BBRCgweDQzNCwgMHgxMDgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fSVBVX0NTSTBfRF8xOQkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19HUElPNl81CQkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19VQVJUNV9DVFMJCQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19VU0JPSDNfVVNCSDNfREFUQV83CUlPTVVYX1BBRCgweDQzOCwgMHgxMEMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfQ1NJMF9EQVQxOV9fU0RNQV9ERUJVR19QQ18xMwkJSU9NVVhfUEFEKDB4NDM4LCAweDEwQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9DU0kwX0RBVDE5X19FTUlfRU1JX0RFQlVHXzQ4CQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0NTSTBfREFUMTlfX1VTQlBIWTJfQklTVE9LCQlJT01VWF9QQUQoMHg0MzgsIDB4MTBDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0VNSV9XRUlNX0FfMjUJCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0dQSU81XzIJCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0VDU1BJMl9SRFkJCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0lQVV9ESTFfUElOMTIJCQlJT01VWF9QQUQoMHg0NTgsIDB4MTEwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjVfX0NTUElfU1MxCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNCwgMHg3OTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19JUFVfREkwX0QxX0NTCQkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI1X19VU0JQSFkxX0JJU1RPSwkJSU9NVVhfUEFEKDB4NDU4LCAweDExMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIyX19FTUlfV0VJTV9FQl8yCQkJSU9NVVhfUEFEKDB4NDVDLCAweDExNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIyX19HUElPMl8zMAkJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fQ0NNX0RJMV9FWFRfQ0xLCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCAyLCAweDc2QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjJfX0lQVV9TRVJfRElTUDFfQ1MJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fRUNTUEkxX1NTMAkJCUlPTVVYX1BBRCgweDQ1QywgMHgxMTQsIDQsIDB4N0E4LCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMl9fSTJDMl9TQ0wJCQlJT01VWF9QQUQoMHg0NUMsIDB4MTE0LCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODFDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fRU1JX1dFSU1fRF8xNgkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fR1BJTzNfMTYJCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0lQVV9ESTBfUElONQkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxNl9fSVBVX0RJU1BCMV9TRVJfQ0xLCQlJT01VWF9QQUQoMHg0NjAsIDB4MTE4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTZfX0VDU1BJMV9TQ0xLCQkJSU9NVVhfUEFEKDB4NDYwLCAweDExOCwgNCwgMHg3OUMsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE2X19JMkMyX1NEQQkJCUlPTVVYX1BBRCgweDQ2MCwgMHgxMTgsIDUgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19FTUlfV0VJTV9EXzE3CQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19HUElPM18xNwkJCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fSVBVX0RJMF9QSU42CQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE3X19JUFVfRElTUEIxX1NFUl9ESU4JCUlPTVVYX1BBRCgweDQ2NCwgMHgxMUMsIDMsIDB4ODMwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxN19fRUNTUEkxX01JU08JCQlJT01VWF9QQUQoMHg0NjQsIDB4MTFDLCA0LCAweDdBMCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTdfX0kyQzNfU0NMCQkJSU9NVVhfUEFEKDB4NDY0LCAweDExQywgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0VNSV9XRUlNX0RfMTgJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0dQSU8zXzE4CQkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19JUFVfREkwX1BJTjcJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMThfX0lQVV9ESVNQQjFfU0VSX0RJTwkJSU9NVVhfUEFEKDB4NDY4LCAweDEyMCwgMywgMHg4MzAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDE4X19FQ1NQSTFfTU9TSQkJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDQsIDB4N0E0LCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSTJDM19TREEJCQlJT01VWF9QQUQoMHg0NjgsIDB4MTIwLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOF9fSVBVX0RJMV9EMF9DUwkJCUlPTVVYX1BBRCgweDQ2OCwgMHgxMjAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRU1JX1dFSU1fRF8xOQkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fR1BJTzNfMTkJCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX0lQVV9ESTBfUElOOAkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fSVBVX0RJU1BCMV9TRVJfUlMJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRUNTUEkxX1NTMQkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDQsIDB4N0FDLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QxOV9fRVBJVDFfRVBJVE8JCQlJT01VWF9QQUQoMHg0NkMsIDB4MTI0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX1VBUlQxX0NUUwkJCUlPTVVYX1BBRCgweDQ2QywgMHgxMjQsIDYsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMTlfX1VTQk9IM19VU0JIMl9PQwkJSU9NVVhfUEFEKDB4NDZDLCAweDEyNCwgNywgMHg4QTQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19FTUlfV0VJTV9EXzIwCQkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19HUElPM18yMAkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fSVBVX0RJMF9QSU4xNgkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fSVBVX1NFUl9ESVNQMF9DUwkJSU9NVVhfUEFEKDB4NDcwLCAweDEyOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIwX19DU1BJX1NTMAkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDQsIDB4NzhDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMF9fRVBJVDJfRVBJVE8JCQlJT01VWF9QQUQoMHg0NzAsIDB4MTI4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX1VBUlQxX1JUUwkJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDYsIDB4ODc0LCAxLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjBfX1VTQk9IM19VU0JIMl9QV1IJCUlPTVVYX1BBRCgweDQ3MCwgMHgxMjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fRU1JX1dFSU1fRF8yMQkJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMV9fR1BJTzNfMjEJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESTBfUElOMTcJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0lQVV9ESVNQQjBfU0VSX0NMSwkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIxX19DU1BJX1NDTEsJCQlJT01VWF9QQUQoMHg0NzQsIDB4MTJDLCA0LCAweDc4MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX0kyQzFfU0NMCQkJSU9NVVhfUEFEKDB4NDc0LCAweDEyQywgNSB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgxNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjFfX1VTQk9IM19VU0JPVEdfT0MJCUlPTVVYX1BBRCgweDQ3NCwgMHgxMkMsIDYsIDB4ODlDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fRU1JX1dFSU1fRF8yMgkJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fR1BJTzNfMjIJCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0lQVV9ESTBfUElOMQkJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fSVBVX0RJU1BCMF9TRVJfRElOCQlJT01VWF9QQUQoMHg0NzgsIDB4MTMwLCAzLCAweDgyQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjJfX0NTUElfTUlTTwkJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDQsIDB4Nzg0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyMl9fVVNCT0gzX1VTQk9UR19QV1IJCUlPTVVYX1BBRCgweDQ3OCwgMHgxMzAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fRU1JX1dFSU1fRF8yMwkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fR1BJTzNfMjMJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX1VBUlQzX0NUUwkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX1VBUlQxX0RDRAkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMF9EMF9DUwkJCUlPTVVYX1BBRCgweDQ3QywgMHgxMzQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyM19fSVBVX0RJMV9QSU4yCQkJSU9NVVhfUEFEKDB4NDdDLCAweDEzNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDIzX19JUFVfQ1NJMV9EQVRBX0VOCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA2LCAweDgzNCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjNfX0lQVV9ESTFfUElOMTQJCQlJT01VWF9QQUQoMHg0N0MsIDB4MTM0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX0VNSV9XRUlNX0VCXzMJCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjNfX0dQSU8yXzMxCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19VQVJUM19SVFMJCQlJT01VWF9QQUQoMHg0ODAsIDB4MTM4LCAyLCAweDg4NCwgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19VQVJUMV9SSQkJCUlPTVVYX1BBRCgweDQ4MCwgMHgxMzgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCM19fSVBVX0RJMV9QSU4zCQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19JUFVfQ1NJMV9IU1lOQwkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNiwgMHg4MzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIzX19JUFVfREkxX1BJTjE2CQkJSU9NVVhfUEFEKDB4NDgwLCAweDEzOCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19FTUlfV0VJTV9EXzI0CQkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19HUElPM18yNAkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNF9fVUFSVDNfVFhEX01VWAkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDIsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMV9TUzIJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCAzLCAweDdCMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX0NTUElfU1MyCQkJSU9NVVhfUEFEKDB4NDg0LCAweDEzQywgNCwgMHg3OTQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI0X19BVURNVVhfQVVENV9SWEZTCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA1LCAweDc1NCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX0VDU1BJMl9TUzIJCQlJT01VWF9QQUQoMHg0ODQsIDB4MTNDLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjRfX1VBUlQxX0RUUgkJCUlPTVVYX1BBRCgweDQ4NCwgMHgxM0MsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fRU1JX1dFSU1fRF8yNQkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fR1BJTzNfMjUJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX1VBUlQzX1JYRF9NVVgJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCAyLCAweDg4OCwgMSwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19FQ1NQSTFfU1MzCQkJSU9NVVhfUEFEKDB4NDg4LCAweDE0MCwgMywgMHg3QjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI1X19DU1BJX1NTMwkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDQsIDB4Nzk4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNV9fQVVETVVYX0FVRDVfUlhDCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA1LCAweDc1MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX0VDU1BJMl9TUzMJCQlJT01VWF9QQUQoMHg0ODgsIDB4MTQwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjVfX1VBUlQxX0RTUgkJCUlPTVVYX1BBRCgweDQ4OCwgMHgxNDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fRU1JX1dFSU1fRF8yNgkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fR1BJTzNfMjYJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjZfX1VBUlQyX1RYRF9NVVgJCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCAyLCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19GSVJJX1JYRAkJCUlPTVVYX1BBRCgweDQ4QywgMHgxNDQsIDMsIDB4ODBDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyNl9fSVBVX0NTSTBfRF8xCQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19JUFVfREkxX1BJTjExCQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19JUFVfU0lTR18yCQkJSU9NVVhfUEFEKDB4NDhDLCAweDE0NCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI2X19JUFVfRElTUDFfREFUXzIyCQlJT01VWF9QQUQoMHg0OEMsIDB4MTQ0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0VNSV9XRUlNX0RfMjcJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0dQSU8zXzI3CQkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI3X19VQVJUMl9SWERfTVVYCQkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgMiwgMHg4ODAsIDEsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fRklSSV9UWEQJCQlJT01VWF9QQUQoMHg0OTAsIDB4MTQ4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjdfX0lQVV9DU0kwX0RfMAkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0RJMV9QSU4xMwkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX1NJU0dfMwkJCUlPTVVYX1BBRCgweDQ5MCwgMHgxNDgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyN19fSVBVX0RJU1AxX0RBVF8yMwkJSU9NVVhfUEFEKDB4NDkwLCAweDE0OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19FTUlfV0VJTV9EXzI4CQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI4X19HUElPM18yOAkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fVUFSVDJfQ1RTCQkJSU9NVVhfUEFEKDB4NDk0LCAweDE0QywgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJU1BCMF9TRVJfRElPCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCAzLCAweDgyQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0NTUElfTU9TSQkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDQsIDB4Nzg4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSTJDMV9TREEJCQlJT01VWF9QQUQoMHg0OTQsIDB4MTRDLCA1IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODE4LCAxLCBQQURfQ1RSTF9JMkMpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjhfX0lQVV9FWFRfVFJJRwkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOF9fSVBVX0RJMF9QSU4xMwkJCUlPTVVYX1BBRCgweDQ5NCwgMHgxNEMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fRU1JX1dFSU1fRF8yOQkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QyOV9fR1BJTzNfMjkJCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX1VBUlQyX1JUUwkJCUlPTVVYX1BBRCgweDQ5OCwgMHgxNTAsIDIsIDB4ODdDLCAxLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0lQVV9ESVNQQjBfU0VSX1JTCQlJT01VWF9QQUQoMHg0OTgsIDB4MTUwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMjlfX0NTUElfU1MwCQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNCwgMHg3OEMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfREkxX1BJTjE1CQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfQ1NJMV9WU1lOQwkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNiwgMHg4M0MsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDI5X19JUFVfREkwX1BJTjE0CQkJSU9NVVhfUEFEKDB4NDk4LCAweDE1MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19FTUlfV0VJTV9EXzMwCQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19HUElPM18zMAkJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fVUFSVDNfQ1RTCQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMiwgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMF9fSVBVX0NTSTBfRF8zCQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19JUFVfREkwX1BJTjExCQkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19JUFVfRElTUDFfREFUXzIxCQlJT01VWF9QQUQoMHg0OUMsIDB4MTU0LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzBfX1VTQk9IM19VU0JIMV9PQwkJSU9NVVhfUEFEKDB4NDlDLCAweDE1NCwgNiwgMHg4QTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMwX19VU0JPSDNfVVNCSDJfT0MJCUlPTVVYX1BBRCgweDQ5QywgMHgxNTQsIDcsIDB4OEE0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fRU1JX1dFSU1fRF8zMQkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fR1BJTzNfMzEJCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX1VBUlQzX1JUUwkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDIsIDB4ODg0LCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX0lQVV9DU0kwX0RfMgkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJMF9QSU4xMgkJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0QzMV9fSVBVX0RJU1AxX0RBVF8yMAkJSU9NVVhfUEFEKDB4NEEwLCAweDE1OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRDMxX19VU0JPSDNfVVNCSDFfUFdSCQlJT01VWF9QQUQoMHg0QTAsIDB4MTU4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EMzFfX1VTQk9IM19VU0JIMl9QV1IJCUlPTVVYX1BBRCgweDRBMCwgMHgxNTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fRU1JX1dFSU1fQV8yNAkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fR1BJTzVfNAkJCUlPTVVYX1BBRCgweDRBOCwgMHgxNUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyNF9fSVBVX0RJU1AxX0RBVF8xOQkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19JUFVfQ1NJMV9EXzE5CQkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19JUFVfU0lTR18yCQkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTI0X19VU0JQSFkyX0JWQUxJRAkJSU9NVVhfUEFEKDB4NEE4LCAweDE1QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19FTUlfV0VJTV9BXzIzCQkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19HUElPNl82CQkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIzX19JUFVfRElTUDFfREFUXzE4CQlJT01VWF9QQUQoMHg0QUMsIDB4MTYwLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0lQVV9DU0kxX0RfMTgJCQlJT01VWF9QQUQoMHg0QUMsIDB4MTYwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX0lQVV9TSVNHXzMJCQlJT01VWF9QQUQoMHg0QUMsIDB4MTYwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9BMjNfX1VTQlBIWTJfRU5EU0VTU0lPTgkJSU9NVVhfUEFEKDB4NEFDLCAweDE2MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19FTUlfV0VJTV9BXzIyCQkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19HUElPMl8xNgkJCUlPTVVYX1BBRCgweDRCMCwgMHgxNjQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMl9fSVBVX0RJU1AxX0RBVF8xNwkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19JUFVfQ1NJMV9EXzE3CQkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIyX19TUkNfQlRfQ0ZHMV83CQkJSU9NVVhfUEFEKDB4NEIwLCAweDE2NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19FTUlfV0VJTV9BXzIxCQkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19HUElPMl8xNwkJCUlPTVVYX1BBRCgweDRCNCwgMHgxNjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMV9fSVBVX0RJU1AxX0RBVF8xNgkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19JUFVfQ1NJMV9EXzE2CQkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIxX19TUkNfQlRfQ0ZHMV82CQkJSU9NVVhfUEFEKDB4NEI0LCAweDE2OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19FTUlfV0VJTV9BXzIwCQkJSU9NVVhfUEFEKDB4NEI4LCAweDE2QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19HUElPMl8xOAkJCUlPTVVYX1BBRCgweDRCOCwgMHgxNkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0EyMF9fSVBVX0RJU1AxX0RBVF8xNQkJSU9NVVhfUEFEKDB4NEI4LCAweDE2QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19JUFVfQ1NJMV9EXzE1CQkJSU9NVVhfUEFEKDB4NEI4LCAweDE2QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTIwX19TUkNfQlRfQ0ZHMV81CQkJSU9NVVhfUEFEKDB4NEI4LCAweDE2QywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19FTUlfV0VJTV9BXzE5CQkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19HUElPMl8xOQkJCUlPTVVYX1BBRCgweDRCQywgMHgxNzAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOV9fSVBVX0RJU1AxX0RBVF8xNAkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19JUFVfQ1NJMV9EXzE0CQkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE5X19TUkNfQlRfQ0ZHMV80CQkJSU9NVVhfUEFEKDB4NEJDLCAweDE3MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19FTUlfV0VJTV9BXzE4CQkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19HUElPMl8yMAkJCUlPTVVYX1BBRCgweDRDMCwgMHgxNzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExOF9fSVBVX0RJU1AxX0RBVF8xMwkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19JUFVfQ1NJMV9EXzEzCQkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE4X19TUkNfQlRfQ0ZHMV8zCQkJSU9NVVhfUEFEKDB4NEMwLCAweDE3NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19FTUlfV0VJTV9BXzE3CQkJSU9NVVhfUEFEKDB4NEM0LCAweDE3OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19HUElPMl8yMQkJCUlPTVVYX1BBRCgweDRDNCwgMHgxNzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExN19fSVBVX0RJU1AxX0RBVF8xMgkJSU9NVVhfUEFEKDB4NEM0LCAweDE3OCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19JUFVfQ1NJMV9EXzEyCQkJSU9NVVhfUEFEKDB4NEM0LCAweDE3OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE3X19TUkNfQlRfQ0ZHMV8yCQkJSU9NVVhfUEFEKDB4NEM0LCAweDE3OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19FTUlfV0VJTV9BXzE2CQkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19HUElPMl8yMgkJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fSVBVX0RJMV9ESVNQX0NMSwkJSU9NVVhfUEFEKDB4NEM4LCAweDE3QywgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQTE2X19JUFVfQ1NJMV9QSVhDTEsJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0ExNl9fU1JDX0JUX0NGRzFfMQkJCUlPTVVYX1BBRCgweDRDOCwgMHgxN0MsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fRU1JX1dFSU1fQ1NfMAkJCUlPTVVYX1BBRCgweDRDQywgMHgxODAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0NTMF9fR1BJTzJfMjMJCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzBfX0VDU1BJMl9TQ0xLCQkJSU9NVVhfUEFEKDB4NENDLCAweDE4MCwgMiwgMHg3QjgsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MwX19JUFVfREkxX1BJTjUJCQlJT01VWF9QQUQoMHg0Q0MsIDB4MTgwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0VNSV9XRUlNX0NTXzEJCQlJT01VWF9QQUQoMHg0RDAsIDB4MTg0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9DUzFfX0dQSU8yXzI0CQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fQ1MxX19FQ1NQSTJfTU9TSQkJCUlPTVVYX1BBRCgweDREMCwgMHgxODQsIDIsIDB4N0MwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0NTMV9fSVBVX0RJMV9QSU42CQkJSU9NVVhfUEFEKDB4NEQwLCAweDE4NCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fT0VfX0VNSV9XRUlNX09FCQkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fT0VfX0dQSU8yXzI1CQkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fT0VfX0VDU1BJMl9NSVNPCQkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgMiwgMHg3QkMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fT0VfX0lQVV9ESTFfUElONwkJCUlPTVVYX1BBRCgweDRENCwgMHgxODgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX09FX19VU0JQSFkyX0lERElHCQkJSU9NVVhfUEFEKDB4NEQ0LCAweDE4OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX0VNSV9XRUlNX1JXCQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX0dQSU8yXzI2CQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX0VDU1BJMl9TUzAJCQlJT01VWF9QQUQoMHg0RDgsIDB4MThDLCAyLCAweDdDNCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9SV19fSVBVX0RJMV9QSU44CQkJSU9NVVhfUEFEKDB4NEQ4LCAweDE4QywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fUldfX1VTQlBIWTJfSE9TVERJU0NPTk5FQ1QJCUlPTVVYX1BBRCgweDREOCwgMHgxOEMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fRU1JX1dFSU1fTEJBCQkJSU9NVVhfUEFEKDB4NERDLCAweDE5MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fTEJBX19HUElPMl8yNwkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fRUNTUEkyX1NTMQkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDIsIDB4N0M4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fSVBVX0RJMV9QSU4xNwkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0xCQV9fU1JDX0JUX0NGRzFfMAkJCUlPTVVYX1BBRCgweDREQywgMHgxOTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fRU1JX1dFSU1fRUJfMAkJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fR1BJTzJfMjgJCQlJT01VWF9QQUQoMHg0RTQsIDB4MTk0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9FQjBfX0lQVV9ESVNQMV9EQVRfMTEJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fSVBVX0NTSTFfRF8xMQkJCUlPTVVYX1BBRCgweDRFNCwgMHgxOTQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMF9fR1BDX1BNSUNfUkRZCQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgNSwgMHg4MTAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIwX19TUkNfQlRfQ0ZHMl83CQkJSU9NVVhfUEFEKDB4NEU0LCAweDE5NCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19FTUlfV0VJTV9FQl8xCQkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19HUElPMl8yOQkJCUlPTVVYX1BBRCgweDRFOCwgMHgxOTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0VCMV9fSVBVX0RJU1AxX0RBVF8xMAkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19JUFVfQ1NJMV9EXzEwCQkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fRUIxX19TUkNfQlRfQ0ZHMl82CQkJSU9NVVhfUEFEKDB4NEU4LCAweDE5OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEwX19FTUlfTkFORF9XRUlNX0RBXzAJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fR1BJTzNfMAkJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fSVBVX0RJU1AxX0RBVF85CQlJT01VWF9QQUQoMHg0RUMsIDB4MTlDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTBfX0lQVV9DU0kxX0RfOQkJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMF9fU1JDX0JUX0NGRzJfNQkJCUlPTVVYX1BBRCgweDRFQywgMHgxOUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMV9fRU1JX05BTkRfV0VJTV9EQV8xCQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0dQSU8zXzEJCQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX0lQVV9ESVNQMV9EQVRfOAkJSU9NVVhfUEFEKDB4NEYwLCAweDFBMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExX19JUFVfQ1NJMV9EXzgJCQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTFfX1NSQ19CVF9DRkcyXzQJCQlJT01VWF9QQUQoMHg0RjAsIDB4MUEwLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTJfX0VNSV9OQU5EX1dFSU1fREFfMgkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19HUElPM18yCQkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19JUFVfRElTUDFfREFUXzcJCUlPTVVYX1BBRCgweDRGNCwgMHgxQTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMl9fSVBVX0NTSTFfRF83CQkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEyX19TUkNfQlRfQ0ZHMl8zCQkJSU9NVVhfUEFEKDB4NEY0LCAweDFBNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREEzX19FTUlfTkFORF9XRUlNX0RBXzMJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fR1BJTzNfMwkJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fSVBVX0RJU1AxX0RBVF82CQlJT01VWF9QQUQoMHg0RjgsIDB4MUE4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTNfX0lQVV9DU0kxX0RfNgkJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBM19fU1JDX0JUX0NGRzJfMgkJCUlPTVVYX1BBRCgweDRGOCwgMHgxQTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNF9fRU1JX05BTkRfV0VJTV9EQV80CQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0dQSU8zXzQJCQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX0lQVV9ESVNQMV9EQVRfNQkJSU9NVVhfUEFEKDB4NEZDLCAweDFBQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE0X19JUFVfQ1NJMV9EXzUJCQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTRfX1NSQ19CVF9DRkczXzcJCQlJT01VWF9QQUQoMHg0RkMsIDB4MUFDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTVfX0VNSV9OQU5EX1dFSU1fREFfNQkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19HUElPM181CQkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19JUFVfRElTUDFfREFUXzQJCUlPTVVYX1BBRCgweDUwMCwgMHgxQjAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNV9fSVBVX0NTSTFfRF80CQkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE1X19TUkNfQlRfQ0ZHM182CQkJSU9NVVhfUEFEKDB4NTAwLCAweDFCMCwgNyB8IElPTVVYX0NPTkZJR19TSU9OLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTZfX0VNSV9OQU5EX1dFSU1fREFfNgkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19HUElPM182CQkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19JUFVfRElTUDFfREFUXzMJCUlPTVVYX1BBRCgweDUwNCwgMHgxQjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBNl9fSVBVX0NTSTFfRF8zCQkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE2X19TUkNfQlRfQ0ZHM181CQkJSU9NVVhfUEFEKDB4NTA0LCAweDFCNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE3X19FTUlfTkFORF9XRUlNX0RBXzcJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fR1BJTzNfNwkJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fSVBVX0RJU1AxX0RBVF8yCQlJT01VWF9QQUQoMHg1MDgsIDB4MUI4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTdfX0lQVV9DU0kxX0RfMgkJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBN19fU1JDX0JUX0NGRzNfNAkJCUlPTVVYX1BBRCgweDUwOCwgMHgxQjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOF9fRU1JX05BTkRfV0VJTV9EQV84CQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0dQSU8zXzgJCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX0lQVV9ESVNQMV9EQVRfMQkJSU9NVVhfUEFEKDB4NTBDLCAweDFCQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE4X19JUFVfQ1NJMV9EXzEJCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQThfX1NSQ19CVF9DRkczXzMJCQlJT01VWF9QQUQoMHg1MEMsIDB4MUJDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTlfX0VNSV9OQU5EX1dFSU1fREFfOQkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19HUElPM185CQkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19JUFVfRElTUDFfREFUXzAJCUlPTVVYX1BBRCgweDUxMCwgMHgxQzAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBOV9fSVBVX0NTSTFfRF8wCQkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREE5X19TUkNfQlRfQ0ZHM18yCQkJSU9NVVhfUEFEKDB4NTEwLCAweDFDMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fRU1JX05BTkRfV0VJTV9EQV8xMAkJSU9NVVhfUEFEKDB4NTE0LCAweDFDNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExMF9fR1BJTzNfMTAJCQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19JUFVfREkxX1BJTjE1CQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19JUFVfQ1NJMV9EQVRBX0VOCQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCA0LCAweDgzNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEwX19TUkNfQlRfQ0ZHM18xCQlJT01VWF9QQUQoMHg1MTQsIDB4MUM0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19FTUlfTkFORF9XRUlNX0RBXzExCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTExX19HUElPM18xMQkJCUlPTVVYX1BBRCgweDUxOCwgMHgxQzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0lQVV9ESTFfUElOMgkJCUlPTVVYX1BBRCgweDUxOCwgMHgxQzgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTFfX0lQVV9DU0kxX0hTWU5DCQlJT01VWF9QQUQoMHg1MTgsIDB4MUM4LCA0LCAweDgzOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19FTUlfTkFORF9XRUlNX0RBXzEyCQlJT01VWF9QQUQoMHg1MUMsIDB4MUNDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEyX19HUElPM18xMgkJCUlPTVVYX1BBRCgweDUxQywgMHgxQ0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTJfX0lQVV9ESTFfUElOMwkJCUlPTVVYX1BBRCgweDUxQywgMHgxQ0MsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTJfX0lQVV9DU0kxX1ZTWU5DCQlJT01VWF9QQUQoMHg1MUMsIDB4MUNDLCA0LCAweDgzQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19FTUlfTkFORF9XRUlNX0RBXzEzCQlJT01VWF9QQUQoMHg1MjAsIDB4MUQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTEzX19HUElPM18xMwkJCUlPTVVYX1BBRCgweDUyMCwgMHgxRDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTNfX0lQVV9ESTFfRDBfQ1MJCUlPTVVYX1BBRCgweDUyMCwgMHgxRDAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTNfX0NDTV9ESTFfRVhUX0NMSwkJSU9NVVhfUEFEKDB4NTIwLCAweDFEMCwgNCwgMHg3NkMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fRU1JX05BTkRfV0VJTV9EQV8xNAkJSU9NVVhfUEFEKDB4NTI0LCAweDFENCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNF9fR1BJTzNfMTQJCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19JUFVfREkxX0QxX0NTCQlJT01VWF9QQUQoMHg1MjQsIDB4MUQ0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9EQTE0X19DQ01fREkwX0VYVF9DTEsJCUlPTVVYX1BBRCgweDUyNCwgMHgxRDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0VNSV9OQU5EX1dFSU1fREFfMTUJCUlPTVVYX1BBRCgweDUyOCwgMHgxRDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRUlNX0RBMTVfX0dQSU8zXzE1CQkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU4xCQkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fREExNV9fSVBVX0RJMV9QSU40CQkJSU9NVVhfUEFEKDB4NTI4LCAweDFEOCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XRV9CX19FTUlfTkFOREZfV0VfQgkJSU9NVVhfUEFEKDB4NTJDLCAweDFEQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XRV9CX19HUElPNl8xMgkJCUlPTVVYX1BBRCgweDUyQywgMHgxREMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfUkVfQl9fRU1JX05BTkRGX1JFX0IJCUlPTVVYX1BBRCgweDUzMCwgMHgxRTAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfUkVfQl9fR1BJTzZfMTMJCQlJT01VWF9QQUQoMHg1MzAsIDB4MUUwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9XQUlUX19FTUlfV0VJTV9XQUlUCQlJT01VWF9QQUQoMHg1MzQsIDB4MUU0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0VJTV9XQUlUX19HUElPNV8wCQkJSU9NVVhfUEFEKDB4NTM0LCAweDFFNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9FSU1fV0FJVF9fRU1JX1dFSU1fRFRBQ0tfQgkJSU9NVVhfUEFEKDB4NTM0LCAweDFFNCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDNfUF9fR1BJTzZfMjIJCQlJT01VWF9QQUQoX19OQV8sIDB4MUVDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYM19QX19MREJfTFZEUzFfVFgzCQlJT01VWF9QQUQoX19OQV8sIDB4MUVDLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMl9QX19HUElPNl8yNAkJCUlPTVVYX1BBRChfX05BXywgMHgxRjAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgyX1BfX0xEQl9MVkRTMV9UWDIJCUlPTVVYX1BBRChfX05BXywgMHgxRjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfQ0xLX1BfX0dQSU82XzI2CQkJSU9NVVhfUEFEKF9fTkFfLCAweDFGNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9DTEtfUF9fTERCX0xWRFMxX0NMSwkJSU9NVVhfUEFEKF9fTkFfLCAweDFGNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMV9UWDFfUF9fR1BJTzZfMjgJCQlJT01VWF9QQUQoX19OQV8sIDB4MUY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMV9QX19MREJfTFZEUzFfVFgxCQlJT01VWF9QQUQoX19OQV8sIDB4MUY4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMxX1RYMF9QX19HUElPNl8zMAkJCUlPTVVYX1BBRChfX05BXywgMHgxRkMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzFfVFgwX1BfX0xEQl9MVkRTMV9UWDAJCUlPTVVYX1BBRChfX05BXywgMHgxRkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgzX1BfX0dQSU83XzIyCQkJSU9NVVhfUEFEKF9fTkFfLCAweDIwMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDNfUF9fTERCX0xWRFMwX1RYMwkJSU9NVVhfUEFEKF9fTkFfLCAweDIwMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9DTEtfUF9fR1BJTzdfMjQJCQlJT01VWF9QQUQoX19OQV8sIDB4MjA0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX0NMS19QX19MREJfTFZEUzBfQ0xLCQlJT01VWF9QQUQoX19OQV8sIDB4MjA0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMl9QX19HUElPN18yNgkJCUlPTVVYX1BBRChfX05BXywgMHgyMDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgyX1BfX0xEQl9MVkRTMF9UWDIJCUlPTVVYX1BBRChfX05BXywgMHgyMDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTFZEUzBfVFgxX1BfX0dQSU83XzI4CQkJSU9NVVhfUEFEKF9fTkFfLCAweDIwQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDFfUF9fTERCX0xWRFMwX1RYMQkJSU9NVVhfUEFEKF9fTkFfLCAweDIwQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9MVkRTMF9UWDBfUF9fR1BJTzdfMzAJCQlJT01VWF9QQUQoX19OQV8sIDB4MjEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0xWRFMwX1RYMF9QX19MREJfTFZEUzBfVFgwCQlJT01VWF9QQUQoX19OQV8sIDB4MjEwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTBfX0dQSU80XzAJCQlJT01VWF9QQUQoMHg1NDAsIDB4MjE0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTBfX09TQzMya18zMktfT1VUCQlJT01VWF9QQUQoMHg1NDAsIDB4MjE0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTFfX0dQSU80XzEJCQlJT01VWF9QQUQoMHg1NDQsIDB4MjE4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTJfX0dQSU80XzIJCQlJT01VWF9QQUQoMHg1NDgsIDB4MjFDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTNfX0dQSU80XzMJCQlJT01VWF9QQUQoMHg1NEMsIDB4MjIwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTRfX0dQSU80XzQJCQlJT01VWF9QQUQoMHg1NTAsIDB4MjI0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NMRV9fRU1JX05BTkRGX0NMRQkJSU9NVVhfUEFEKDB4NUEwLCAweDIyOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DTEVfX0dQSU82XzcJCQlJT01VWF9QQUQoMHg1QTAsIDB4MjI4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NMRV9fVVNCUEhZMV9WU1RBVFVTXzAJCUlPTVVYX1BBRCgweDVBMCwgMHgyMjgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQUxFX19FTUlfTkFOREZfQUxFCQlJT01VWF9QQUQoMHg1QTQsIDB4MjJDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0FMRV9fR1BJTzZfOAkJCUlPTVVYX1BBRCgweDVBNCwgMHgyMkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQUxFX19VU0JQSFkxX1ZTVEFUVVNfMQkJSU9NVVhfUEFEKDB4NUE0LCAweDIyQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19FTUlfTkFOREZfV1BfQgkJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19HUElPNl85CQkJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9XUF9CX19VU0JQSFkxX1ZTVEFUVVNfMgkJSU9NVVhfUEFEKDB4NUE4LCAweDIzMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9SQjBfX0VNSV9OQU5ERl9SQl8wCQlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JCMF9fR1BJTzZfMTAJCQlJT01VWF9QQUQoMHg1QUMsIDB4MjM0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX1JCMF9fVVNCUEhZMV9WU1RBVFVTXzMJCUlPTVVYX1BBRCgweDVBQywgMHgyMzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MwX19FTUlfTkFOREZfQ1NfMAkJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzBfX0dQSU82XzExCQkJSU9NVVhfUEFEKDB4NUIwLCAweDIzOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzBfX1VTQlBIWTFfVlNUQVRVU180CQlJT01VWF9QQUQoMHg1QjAsIDB4MjM4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMV9fRU1JX05BTkRGX0NTXzEJCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19HUElPNl8xNAkJCUlPTVVYX1BBRCgweDVCNCwgMHgyM0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MxX19NTEJfTUxCQ0xLCQkJSU9NVVhfUEFEKDB4NUI0LCAweDIzQywgNiwgMHg4NTgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzFfX1VTQlBIWTFfVlNUQVRVU181CQlJT01VWF9QQUQoMHg1QjQsIDB4MjNDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fRU1JX05BTkRGX0NTXzIJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19HUElPNl8xNQkJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19JUFVfU0lTR18wCQkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzJfX0VTQUkxX1RYMAkJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDMsIDB4N0U0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19FTUlfV0VJTV9DUkUJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19DQ01fQ1NJMF9NQ0xLCQlJT01VWF9QQUQoMHg1QjgsIDB4MjQwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTMl9fTUxCX01MQlNJRwkJCUlPTVVYX1BBRCgweDVCOCwgMHgyNDAsIDYsIDB4ODYwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MyX19VU0JQSFkxX1ZTVEFUVVNfNgkJSU9NVVhfUEFEKDB4NUI4LCAweDI0MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX0VNSV9OQU5ERl9DU18zCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fR1BJTzZfMTYJCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fSVBVX1NJU0dfMQkJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfTkFOREZfQ1MzX19FU0FJMV9UWDEJCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCAzLCAweDdFOCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fRU1JX1dFSU1fQV8yNgkJSU9NVVhfUEFEKDB4NUJDLCAweDI0NCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9OQU5ERl9DUzNfX01MQl9NTEJEQVQJCQlJT01VWF9QQUQoMHg1QkMsIDB4MjQ0LCA2LCAweDg1QywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX05BTkRGX0NTM19fVVNCUEhZMV9WU1RBVFVTXzcJCUlPTVVYX1BBRCgweDVCQywgMHgyNDQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX0ZFQ19NRElPCQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgMCwgMHg4MDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fR1BJTzFfMjIJCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19FU0FJMV9TQ0tSCQkJSU9NVVhfUEFEKDB4NUM0LCAweDI0OCwgMiwgMHg3REMsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURJT19fRkVDX0NPTAkJCUlPTVVYX1BBRCgweDVDNCwgMHgyNDgsIDMsIDB4ODAwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01ESU9fX1JUQ19DRV9SVENfUFMyCQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19TRE1BX0RFQlVHX0JVU19ERVZJQ0VfMwlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRElPX19FTUlfRU1JX0RFQlVHXzQ5CQlJT01VWF9QQUQoMHg1QzQsIDB4MjQ4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19GRUNfVFhfQ0xLCQlJT01VWF9QQUQoMHg1QzgsIDB4MjRDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SRUZfQ0xLX19HUElPMV8yMwkJCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX0VTQUkxX0ZTUgkJCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDIsIDB4N0NDLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX1NETUFfREVCVUdfQlVTX0RFVklDRV80CUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JFRl9DTEtfX0VNSV9FTUlfREVCVUdfNTAJCUlPTVVYX1BBRCgweDVDOCwgMHgyNEMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfRVIJCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fR1BJTzFfMjQJCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWF9FUl9fRVNBSTFfSENLUgkJCUlPTVVYX1BBRCgweDVDQywgMHgyNTAsIDIsIDB4N0Q0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYX0VSX19GRUNfUlhfQ0xLCQkJSU9NVVhfUEFEKDB4NUNDLCAweDI1MCwgMywgMHg4MDgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhfRVJfX1JUQ19DRV9SVENfUFMzCQlJT01VWF9QQUQoMHg1Q0MsIDB4MjUwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0ZFQ19SWF9EVgkJCUlPTVVYX1BBRCgweDVEMCwgMHgyNTQsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX0NSU19EVl9fR1BJTzFfMjUJCQlJT01VWF9QQUQoMHg1RDAsIDB4MjU0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19DUlNfRFZfX0VTQUkxX1NDS1QJCQlJT01VWF9QQUQoMHg1RDAsIDB4MjU0LCAyLCAweDdFMCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQxX19GRUNfUkRBVEFfMQkJCUlPTVVYX1BBRCgweDVENCwgMHgyNTgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX0dQSU8xXzI2CQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fRVNBSTFfRlNUCQkJSU9NVVhfUEFEKDB4NUQ0LCAweDI1OCwgMiwgMHg3RDAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMV9fTUxCX01MQlNJRwkJCUlPTVVYX1BBRCgweDVENCwgMHgyNTgsIDMsIDB4ODYwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDFfX1JUQ19DRV9SVENfUFMxCQlJT01VWF9QQUQoMHg1RDQsIDB4MjU4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19SWEQwX19GRUNfUkRBVEFfMAkJCUlPTVVYX1BBRCgweDVEOCwgMHgyNUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX0dQSU8xXzI3CQkJSU9NVVhfUEFEKDB4NUQ4LCAweDI1QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfUlhEMF9fRVNBSTFfSENLVAkJCUlPTVVYX1BBRCgweDVEOCwgMHgyNUMsIDIsIDB4N0Q4LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1JYRDBfX09TQzMya18zMktfT1VUCQlJT01VWF9QQUQoMHg1RDgsIDB4MjVDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWF9FTl9fRkVDX1RYX0VOCQkJSU9NVVhfUEFEKDB4NURDLCAweDI2MCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhfRU5fX0dQSU8xXzI4CQkJSU9NVVhfUEFEKDB4NURDLCAweDI2MCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhfRU5fX0VTQUkxX1RYM19SWDIJCUlPTVVYX1BBRCgweDVEQywgMHgyNjAsIDIsIDB4N0YwLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDFfX0ZFQ19UREFUQV8xCQkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fR1BJTzFfMjkJCQlJT01VWF9QQUQoMHg1RTAsIDB4MjY0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19FU0FJMV9UWDJfUlgzCQlJT01VWF9QQUQoMHg1RTAsIDB4MjY0LCAyLCAweDdFQywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQxX19NTEJfTUxCQ0xLCQkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgMywgMHg4NTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMV9fUlRDX0NFX1JUQ19QUlNDX0NMSwkJSU9NVVhfUEFEKDB4NUUwLCAweDI2NCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfVFhEMF9fRkVDX1REQVRBXzAJCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19UWEQwX19HUElPMV8zMAkJCUlPTVVYX1BBRCgweDVFNCwgMHgyNjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDBfX0VTQUkxX1RYNF9SWDEJCUlPTVVYX1BBRCgweDVFNCwgMHgyNjgsIDIsIDB4N0Y0LCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX1RYRDBfX1VTQlBIWTJfREFUQU9VVF8wCQlJT01VWF9QQUQoMHg1RTQsIDB4MjY4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX0ZFQ19NREMJCQlJT01VWF9QQUQoMHg1RTgsIDB4MjZDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0ZFQ19NRENfX0dQSU8xXzMxCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19FU0FJMV9UWDVfUlgwCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMiwgMHg3RjgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19NTEJfTUxCREFUCQkJSU9NVVhfUEFEKDB4NUU4LCAweDI2QywgMywgMHg4NUMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9GRUNfTURDX19SVENfQ0VfUlRDX0FMQVJNMV9UUklHCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfRkVDX01EQ19fVVNCUEhZMl9EQVRBT1VUXzEJCUlPTVVYX1BBRCgweDVFOCwgMHgyNkMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9XX19QQVRBX0RJT1cJCQlJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fR1BJTzZfMTcJCQlJT01VWF9QQUQoMHg1RjAsIDB4MjcwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPV19fVUFSVDFfVFhEX01VWAkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgMywgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9XX19VU0JQSFkyX0RBVEFPVVRfMgkJSU9NVVhfUEFEKDB4NUYwLCAweDI3MCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQUNLX19QQVRBX0RNQUNLCQkJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQUNLX19HUElPNl8xOAkJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFDS19fVUFSVDFfUlhEX01VWAkJSU9NVVhfUEFEKDB4NUY0LCAweDI3NCwgMywgMHg4NzgsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFDS19fVVNCUEhZMl9EQVRBT1VUXzMJCUlPTVVYX1BBRCgweDVGNCwgMHgyNzQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fUEFUQV9ETUFSUQkJCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fR1BJTzdfMAkJCUlPTVVYX1BBRCgweDVGOCwgMHgyNzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fVUFSVDJfVFhEX01VWAkJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgMywgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ETUFSUV9fQ0NNX0NDTV9PVVRfMAkJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RNQVJRX19VU0JQSFkyX0RBVEFPVVRfNAkJSU9NVVhfUEFEKDB4NUY4LCAweDI3OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0JVRkZFUl9FTl9fUEFUQV9CVUZGRVJfRU4JCUlPTVVYX1BBRCgweDVGQywgMHgyN0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX0dQSU83XzEJCUlPTVVYX1BBRCgweDVGQywgMHgyN0MsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9CVUZGRVJfRU5fX1VBUlQyX1JYRF9NVVgJCUlPTVVYX1BBRCgweDVGQywgMHgyN0MsIDMsIDB4ODgwLCAzLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19DQ01fQ0NNX09VVF8xCQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQlVGRkVSX0VOX19VU0JQSFkyX0RBVEFPVVRfNQlJT01VWF9QQUQoMHg1RkMsIDB4MjdDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX1BBVEFfSU5UUlEJCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX0dQSU83XzIJCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX1VBUlQyX0NUUwkJCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDMsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX0NBTjFfVFhDQU4JCQlJT01VWF9QQUQoMHg2MDAsIDB4MjgwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfSU5UUlFfX0NDTV9DQ01fT1VUXzIJCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JTlRSUV9fVVNCUEhZMl9EQVRBT1VUXzYJCUlPTVVYX1BBRCgweDYwMCwgMHgyODAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9SX19QQVRBX0RJT1IJCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fR1BJTzdfMwkJCUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9ESU9SX19VQVJUMl9SVFMJCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCAzLCAweDg3QywgMywgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RJT1JfX0NBTjFfUlhDQU4JCQlJT01VWF9QQUQoMHg2MDQsIDB4Mjg0LCA0LCAweDc2MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfRElPUl9fVVNCUEhZMl9EQVRBT1VUXzcJCUlPTVVYX1BBRCgweDYwNCwgMHgyODQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19QQVRBX1BBVEFfUkVTRVRfQglJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fR1BJTzdfNAkJCUlPTVVYX1BBRCgweDYwOCwgMHgyODgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19FU0RIQzNfQ01ECQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX1JFU0VUX0JfX1VBUlQxX0NUUwkJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgMywgX19OQV8sIDAsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9SRVNFVF9CX19DQU4yX1RYQ0FOCQlJT01VWF9QQUQoMHg2MDgsIDB4Mjg4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfUkVTRVRfQl9fVVNCUEhZMV9EQVRBT1VUXzAJSU9NVVhfUEFEKDB4NjA4LCAweDI4OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lPUkRZX19QQVRBX0lPUkRZCQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lPUkRZX19HUElPN181CQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0lPUkRZX19FU0RIQzNfQ0xLCQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fVUFSVDFfUlRTCQkJSU9NVVhfUEFEKDB4NjBDLCAweDI4QywgMywgMHg4NzQsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fQ0FOMl9SWENBTgkJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDQsIDB4NzY0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9JT1JEWV9fVVNCUEhZMV9EQVRBT1VUXzEJCUlPTVVYX1BBRCgweDYwQywgMHgyOEMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19QQVRBX0RBXzAJCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fR1BJTzdfNgkJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8wX19FU0RIQzNfUlNUCQkJSU9NVVhfUEFEKDB4NjEwLCAweDI5MCwgMiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzBfX09XSVJFX0xJTkUJCQlJT01VWF9QQUQoMHg2MTAsIDB4MjkwLCA0LCAweDg2NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMF9fVVNCUEhZMV9EQVRBT1VUXzIJCUlPTVVYX1BBRCgweDYxMCwgMHgyOTAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19QQVRBX0RBXzEJCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMV9fR1BJTzdfNwkJCUlPTVVYX1BBRCgweDYxNCwgMHgyOTQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19FU0RIQzRfQ01ECQkJSU9NVVhfUEFEKDB4NjE0LCAweDI5NCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8xX19VQVJUM19DVFMJCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCA0LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzFfX1VTQlBIWTFfREFUQU9VVF8zCQlJT01VWF9QQUQoMHg2MTQsIDB4Mjk0LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fUEFUQV9EQV8yCQkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBXzJfX0dQSU83XzgJCQlJT01VWF9QQUQoMHg2MTgsIDB4Mjk4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fRVNESEM0X0NMSwkJCUlPTVVYX1BBRCgweDYxOCwgMHgyOTgsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFfMl9fVUFSVDNfUlRTCQkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgNCwgMHg4ODQsIDUsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQV8yX19VU0JQSFkxX0RBVEFPVVRfNAkJSU9NVVhfUEFEKDB4NjE4LCAweDI5OCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1BBVEFfQ1NfMAkJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18wX19HUElPN185CQkJSU9NVVhfUEFEKDB4NjFDLCAweDI5QywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0NTXzBfX1VBUlQzX1RYRF9NVVgJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDQsIF9fTkFfLCAwLCBNWDUzX1VBUlRfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMF9fVVNCUEhZMV9EQVRBT1VUXzUJCUlPTVVYX1BBRCgweDYxQywgMHgyOUMsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18xX19QQVRBX0NTXzEJCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fR1BJTzdfMTAJCQlJT01VWF9QQUQoMHg2MjAsIDB4MkEwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfQ1NfMV9fVUFSVDNfUlhEX01VWAkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgNCwgMHg4ODgsIDMsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9DU18xX19VU0JQSFkxX0RBVEFPVVRfNgkJSU9NVVhfUEFEKDB4NjIwLCAweDJBMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19QQVRBX0RBVEFfMAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19HUElPMl8wCQkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19FTUlfTkFOREZfRF8wCQlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTBfX0VTREhDM19EQVQ0CQlJT01VWF9QQUQoMHg2MjgsIDB4MkE0LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzAJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19JUFVfRElBR19CVVNfMAkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEwX19VU0JQSFkxX0RBVEFPVVRfNwkJSU9NVVhfUEFEKDB4NjI4LCAweDJBNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19QQVRBX0RBVEFfMQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19HUElPMl8xCQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19FTUlfTkFOREZfRF8xCQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTFfX0VTREhDM19EQVQ1CQlJT01VWF9QQUQoMHg2MkMsIDB4MkE4LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19HUFUzZF9HUFVfREVCVUdfT1VUXzEJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExX19JUFVfRElBR19CVVNfMQkJSU9NVVhfUEFEKDB4NjJDLCAweDJBOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19QQVRBX0RBVEFfMgkJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19HUElPMl8yCQkJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19FTUlfTkFOREZfRF8yCQlJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTJfX0VTREhDM19EQVQ2CQlJT01VWF9QQUQoMHg2MzAsIDB4MkFDLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19HUFUzZF9HUFVfREVCVUdfT1VUXzIJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEyX19JUFVfRElBR19CVVNfMgkJSU9NVVhfUEFEKDB4NjMwLCAweDJBQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19QQVRBX0RBVEFfMwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19HUElPMl8zCQkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19FTUlfTkFOREZfRF8zCQlJT01VWF9QQUQoMHg2MzQsIDB4MkIwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTNfX0VTREhDM19EQVQ3CQlJT01VWF9QQUQoMHg2MzQsIDB4MkIwLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzMJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEEzX19JUFVfRElBR19CVVNfMwkJSU9NVVhfUEFEKDB4NjM0LCAweDJCMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19QQVRBX0RBVEFfNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19HUElPMl80CQkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19FTUlfTkFOREZfRF80CQlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTRfX0VTREhDNF9EQVQ0CQlJT01VWF9QQUQoMHg2MzgsIDB4MkI0LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19HUFUzZF9HUFVfREVCVUdfT1VUXzQJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE0X19JUFVfRElBR19CVVNfNAkJSU9NVVhfUEFEKDB4NjM4LCAweDJCNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19QQVRBX0RBVEFfNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19HUElPMl81CQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19FTUlfTkFOREZfRF81CQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTVfX0VTREhDNF9EQVQ1CQlJT01VWF9QQUQoMHg2M0MsIDB4MkI4LCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19HUFUzZF9HUFVfREVCVUdfT1VUXzUJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE1X19JUFVfRElBR19CVVNfNQkJSU9NVVhfUEFEKDB4NjNDLCAweDJCOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19QQVRBX0RBVEFfNgkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19HUElPMl82CQkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19FTUlfTkFOREZfRF82CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTZfX0VTREhDNF9EQVQ2CQlJT01VWF9QQUQoMHg2NDAsIDB4MkJDLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19HUFUzZF9HUFVfREVCVUdfT1VUXzYJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE2X19JUFVfRElBR19CVVNfNgkJSU9NVVhfUEFEKDB4NjQwLCAweDJCQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19QQVRBX0RBVEFfNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19HUElPMl83CQkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19FTUlfTkFOREZfRF83CQlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTdfX0VTREhDNF9EQVQ3CQlJT01VWF9QQUQoMHg2NDQsIDB4MkMwLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19HUFUzZF9HUFVfREVCVUdfT1VUXzcJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE3X19JUFVfRElBR19CVVNfNwkJSU9NVVhfUEFEKDB4NjQ0LCAweDJDMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19QQVRBX0RBVEFfOAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19HUElPMl84CQkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzFfREFUNAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fRU1JX05BTkRGX0RfOAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEE4X19FU0RIQzNfREFUMAkJSU9NVVhfUEFEKDB4NjQ4LCAweDJDNCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fR1BVM2RfR1BVX0RFQlVHX09VVF84CUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOF9fSVBVX0RJQUdfQlVTXzgJCUlPTVVYX1BBRCgweDY0OCwgMHgyQzQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fUEFUQV9EQVRBXzkJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fR1BJTzJfOQkJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMxX0RBVDUJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0VNSV9OQU5ERl9EXzkJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBOV9fRVNESEMzX0RBVDEJCUlPTVVYX1BBRCgweDY0QywgMHgyQzgsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0dQVTNkX0dQVV9ERUJVR19PVVRfOQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTlfX0lQVV9ESUFHX0JVU185CQlJT01VWF9QQUQoMHg2NEMsIDB4MkM4LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19QQVRBX0RBVEFfMTAJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0dQSU8yXzEwCQkJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMxX0RBVDYJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19FTUlfTkFOREZfRF8xMAkJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMF9fRVNESEMzX0RBVDIJCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEwX19HUFUzZF9HUFVfREVCVUdfT1VUXzEwCUlPTVVYX1BBRCgweDY1MCwgMHgyQ0MsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTBfX0lQVV9ESUFHX0JVU18xMAkJSU9NVVhfUEFEKDB4NjUwLCAweDJDQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fUEFUQV9EQVRBXzExCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19HUElPMl8xMQkJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VTREhDMV9EQVQ3CQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fRU1JX05BTkRGX0RfMTEJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTFfX0VTREhDM19EQVQzCQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMV9fR1BVM2RfR1BVX0RFQlVHX09VVF8xMQlJT01VWF9QQUQoMHg2NTQsIDB4MkQwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTExX19JUFVfRElBR19CVVNfMTEJCUlPTVVYX1BBRCgweDY1NCwgMHgyRDAsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX1BBVEFfREFUQV8xMgkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fR1BJTzJfMTIJCQlJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzJfREFUNAkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0VNSV9OQU5ERl9EXzEyCQlJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEyX19FU0RIQzRfREFUMAkJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTJfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTIJSU9NVVhfUEFEKDB4NjU4LCAweDJENCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExMl9fSVBVX0RJQUdfQlVTXzEyCQlJT01VWF9QQUQoMHg2NTgsIDB4MkQ0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19QQVRBX0RBVEFfMTMJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDAsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0dQSU8yXzEzCQkJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEMyX0RBVDUJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDIsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19FTUlfTkFOREZfRF8xMwkJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExM19fRVNESEM0X0RBVDEJCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDQsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTEzX19HUFUzZF9HUFVfREVCVUdfT1VUXzEzCUlPTVVYX1BBRCgweDY1QywgMHgyRDgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTNfX0lQVV9ESUFHX0JVU18xMwkJSU9NVVhfUEFEKDB4NjVDLCAweDJEOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fUEFUQV9EQVRBXzE0CQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAwLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19HUElPMl8xNAkJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VTREhDMl9EQVQ2CQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCAyLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fRU1JX05BTkRGX0RfMTQJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTRfX0VTREhDNF9EQVQyCQlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCA0LCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNF9fR1BVM2RfR1BVX0RFQlVHX09VVF8xNAlJT01VWF9QQUQoMHg2NjAsIDB4MkRDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE0X19JUFVfRElBR19CVVNfMTQJCUlPTVVYX1BBRCgweDY2MCwgMHgyREMsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX1BBVEFfREFUQV8xNQkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fR1BJTzJfMTUJCQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzJfREFUNwkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgMiwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0VNSV9OQU5ERl9EXzE1CQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1BBVEFfREFUQTE1X19FU0RIQzRfREFUMwkJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgNCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfUEFUQV9EQVRBMTVfX0dQVTNkX0dQVV9ERUJVR19PVVRfMTUJSU9NVVhfUEFEKDB4NjY0LCAweDJFMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9QQVRBX0RBVEExNV9fSVBVX0RJQUdfQlVTXzE1CQlJT01VWF9QQUQoMHg2NjQsIDB4MkUwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fRVNESEMxX0RBVDAJCQlJT01VWF9QQUQoMHg2NkMsIDB4MkU0LCAwLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0dQSU8xXzE2CQkJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0dQVF9DQVBJTjEJCQlJT01VWF9QQUQoMHg2NkMsIDB4MkU0LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMF9fQ1NQSV9NSVNPCQkJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgNSwgMHg3ODQsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTBfX0NDTV9QTEwzX0JZUAkJSU9NVVhfUEFEKDB4NjZDLCAweDJFNCwgNywgMHg3NzgsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0VTREhDMV9EQVQxCQkJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19HUElPMV8xNwkJCUlPTVVYX1BBRCgweDY3MCwgMHgyRTgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEExX19HUFRfQ0FQSU4yCQkJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0NTUElfU1MwCQkJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgNSwgMHg3OEMsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTFfX0NDTV9QTEw0X0JZUAkJSU9NVVhfUEFEKDB4NjcwLCAweDJFOCwgNywgMHg3N0MsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19FU0RIQzFfQ01ECQkJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgMCB8IElPTVVYX0NPTkZJR19TSU9OLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ01EX19HUElPMV8xOAkJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fR1BUX0NNUE9VVDEJCQlJT01VWF9QQUQoMHg2NzQsIDB4MkVDLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTURfX0NTUElfTU9TSQkJCUlPTVVYX1BBRCgweDY3NCwgMHgyRUMsIDUsIDB4Nzg4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NNRF9fQ0NNX1BMTDFfQllQCQkJSU9NVVhfUEFEKDB4Njc0LCAweDJFQywgNywgMHg3NzAsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0VTREhDMV9EQVQyCQkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19HUElPMV8xOQkJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19HUFRfQ01QT1VUMgkJCUlPTVVYX1BBRCgweDY3OCwgMHgyRjAsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEyX19QV00yX1BXTU8JCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19CCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fQ1NQSV9TUzEJCQlJT01VWF9QQUQoMHg2NzgsIDB4MkYwLCA1LCAweDc5MCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBMl9fV0RPRzFfV0RPR19SU1RfQl9ERUIJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTJfX0NDTV9QTEwyX0JZUAkJSU9NVVhfUEFEKDB4Njc4LCAweDJGMCwgNywgMHg3NzQsIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19FU0RIQzFfQ0xLCQkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fR1BJTzFfMjAJCQlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX09TQzMya18zMktfT1VUCQlJT01VWF9QQUQoMHg2N0MsIDB4MkY0LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9DTEtfX0dQVF9DTEtJTgkJCUlPTVVYX1BBRCgweDY3QywgMHgyRjQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0NMS19fQ1NQSV9TQ0xLCQkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgNSwgMHg3ODAsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfQ0xLX19TQVRBX1BIWV9EVEJfMAkJSU9NVVhfUEFEKDB4NjdDLCAweDJGNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX0VTREhDMV9EQVQzCQkJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19HUElPMV8yMQkJCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19HUFRfQ01QT1VUMwkJCUlPTVVYX1BBRCgweDY4MCwgMHgyRjgsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QxX0RBVEEzX19QV00xX1BXTU8JCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCAzLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19CCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fQ1NQSV9TUzIJCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA1LCAweDc5NCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMV9EQVRBM19fV0RPRzJfV0RPR19SU1RfQl9ERUIJSU9NVVhfUEFEKDB4NjgwLCAweDJGOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDFfREFUQTNfX1NBVEFfUEhZX0RUQl8xCQlJT01VWF9QQUQoMHg2ODAsIDB4MkY4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0VTREhDMl9DTEsJCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCAwLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19HUElPMV8xMAkJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fS1BQX0NPTF81CQkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgMiwgMHg4NDAsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ0xLX19BVURNVVhfQVVENF9SWEZTCQlJT01VWF9QQUQoMHg2ODgsIDB4MkZDLCAzLCAweDczQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTEtfX0NTUElfU0NMSwkJCUlPTVVYX1BBRCgweDY4OCwgMHgyRkMsIDUsIDB4NzgwLCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NMS19fU0NDX1JBTkRPTV9WCQkJSU9NVVhfUEFEKDB4Njg4LCAweDJGQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfQ01EX19FU0RIQzJfQ01ECQkJSU9NVVhfUEFEKDB4NjhDLCAweDMwMCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fR1BJTzFfMTEJCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0tQUF9ST1dfNQkJCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDIsIDB4ODRDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fQVVETVVYX0FVRDRfUlhDCQlJT01VWF9QQUQoMHg2OEMsIDB4MzAwLCAzLCAweDczOCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9DTURfX0NTUElfTU9TSQkJCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDUsIDB4Nzg4LCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0NNRF9fU0NDX1JBTkRPTQkJCUlPTVVYX1BBRCgweDY4QywgMHgzMDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEzX19FU0RIQzJfREFUMwkJCUlPTVVYX1BBRCgweDY5MCwgMHgzMDQsIDAsIF9fTkFfLCAwLCBNWDUzX1NESENfUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fR1BJTzFfMTIJCQlJT01VWF9QQUQoMHg2OTAsIDB4MzA0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBM19fS1BQX0NPTF82CQkJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMiwgMHg4NDQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0FVRE1VWF9BVUQ0X1RYQwkJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgMywgMHg3NDAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX0NTUElfU1MyCQkJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgNSwgMHg3OTQsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTNfX1NKQ19ET05FCQkJSU9NVVhfUEFEKDB4NjkwLCAweDMwNCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTJfX0VTREhDMl9EQVQyCQkJSU9NVVhfUEFEKDB4Njk0LCAweDMwOCwgMCwgX19OQV8sIDAsIE1YNTNfU0RIQ19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19HUElPMV8xMwkJCUlPTVVYX1BBRCgweDY5NCwgMHgzMDgsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEyX19LUFBfUk9XXzYJCQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAyLCAweDg1MCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fQVVETVVYX0FVRDRfVFhECQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCAzLCAweDczNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fQ1NQSV9TUzEJCQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCA1LCAweDc5MCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMl9fU0pDX0ZBSUwJCQlJT01VWF9QQUQoMHg2OTQsIDB4MzA4LCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fRVNESEMyX0RBVDEJCQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAwLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0dQSU8xXzE0CQkJSU9NVVhfUEFEKDB4Njk4LCAweDMwQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTFfX0tQUF9DT0xfNwkJCUlPTVVYX1BBRCgweDY5OCwgMHgzMEMsIDIsIDB4ODQ4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEExX19BVURNVVhfQVVENF9UWEZTCQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCAzLCAweDc0NCwgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fQ1NQSV9TUzAJCQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCA1LCAweDc4QywgNCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMV9fUlRJQ19TRUNfVklPCQlJT01VWF9QQUQoMHg2OTgsIDB4MzBDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fRVNESEMyX0RBVDAJCQlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCAwLCBfX05BXywgMCwgTVg1M19TREhDX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0dQSU8xXzE1CQkJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9TRDJfREFUQTBfX0tQUF9ST1dfNwkJCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDIsIDB4ODU0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19BVURNVVhfQVVENF9SWEQJCUlPTVVYX1BBRCgweDY5QywgMHgzMTAsIDMsIDB4NzMwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfU0QyX0RBVEEwX19DU1BJX01JU08JCQlJT01VWF9QQUQoMHg2OUMsIDB4MzEwLCA1LCAweDc4NCwgMywgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX1NEMl9EQVRBMF9fUlRJQ19ET05FX0lOVAkJSU9NVVhfUEFEKDB4NjlDLCAweDMxMCwgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NDTV9DTEtPCQkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0dQSU8xXzAJCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fS1BQX0NPTF81CQkJSU9NVVhfUEFEKDB4NkE0LCAweDMxNCwgMiwgMHg4NDAsIDMsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzBfX0NDTV9TU0lfRVhUMV9DTEsJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19FUElUMV9FUElUTwkJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19TUlRDX0FMQVJNX0RFQgkJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18wX19VU0JPSDNfVVNCSDFfUFdSCQlJT01VWF9QQUQoMHg2QTQsIDB4MzE0LCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMF9fQ1NVX1RECQkJCUlPTVVYX1BBRCgweDZBNCwgMHgzMTQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19FU0FJMV9TQ0tSCQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgMCwgMHg3REMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0dQSU8xXzEJCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fS1BQX1JPV181CQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgMiwgMHg4NEMsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0NDTV9TU0lfRVhUMl9DTEsJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19QV00yX1BXTU8JCQlJT01VWF9QQUQoMHg2QTgsIDB4MzE4LCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMV9fV0RPRzJfV0RPR19CCQkJSU9NVVhfUEFEKDB4NkE4LCAweDMxOCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzFfX0VTREhDMV9DRAkJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xX19TUkNfVEVTVEVSX0FDSwkJCUlPTVVYX1BBRCgweDZBOCwgMHgzMTgsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT185X19FU0FJMV9GU1IJCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCAwLCAweDdDQywgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fR1BJTzFfOQkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT185X19LUFBfQ09MXzYJCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCAyLCAweDg0NCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fQ0NNX1JFRl9FTl9CCQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX1BXTTFfUFdNTwkJCUlPTVVYX1BBRCgweDZBQywgMHgzMUMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT185X19XRE9HMV9XRE9HX0IJCQlJT01VWF9QQUQoMHg2QUMsIDB4MzFDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOV9fRVNESEMxX1dQCQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNiwgMHg3RkMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzlfX1NDQ19GQUlMX1NUQVRFCQkJSU9NVVhfUEFEKDB4NkFDLCAweDMxQywgNywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0VTQUkxX0hDS1IJCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCAwLCAweDdENCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fR1BJTzFfMwkJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18zX19JMkMzX1NDTAkJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDIgfCBJT01VWF9DT05GSUdfU0lPTiwgMHg4MjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0RQTExJUDFfVE9HX0VOCQkJSU9NVVhfUEFEKDB4NkIwLCAweDMyMCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzNfX0NDTV9DTEtPMgkJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18zX19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMAlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fVVNCT0gzX1VTQkgxX09DCQlJT01VWF9QQUQoMHg2QjAsIDB4MzIwLCA2LCAweDhBMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fM19fTUxCX01MQkNMSwkJCUlPTVVYX1BBRCgweDZCMCwgMHgzMjAsIDcsIDB4ODU4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19FU0FJMV9TQ0tUCQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMCwgMHg3RTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0dQSU8xXzYJCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNl9fSTJDM19TREEJCQlJT01VWF9QQUQoMHg2QjQsIDB4MzI0LCAyIHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19DQ01fQ0NNX09VVF8wCQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX0NTVV9DU1VfSU5UX0RFQgkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgNCwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzZfX09CU0VSVkVfTVVYX09CU1JWX0lOVF9PVVQxCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19FU0RIQzJfTENUTAkJCUlPTVVYX1BBRCgweDZCNCwgMHgzMjQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT182X19NTEJfTUxCU0lHCQkJSU9NVVhfUEFEKDB4NkI0LCAweDMyNCwgNywgMHg4NjAsIDIsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0VTQUkxX0ZTVAkJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDAsIDB4N0QwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19HUElPMV8yCQkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0tQUF9ST1dfNgkJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDIsIDB4ODUwLCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19DQ01fQ0NNX09VVF8xCQkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX0NTVV9DU1VfQUxBUk1fQVVUXzAJCUlPTVVYX1BBRCgweDZCOCwgMHgzMjgsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18yX19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMglJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMl9fRVNESEMyX1dQCQkJSU9NVVhfUEFEKDB4NkI4LCAweDMyOCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzJfX01MQl9NTEJEQVQJCQlJT01VWF9QQUQoMHg2QjgsIDB4MzI4LCA3LCAweDg1QywgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fRVNBSTFfSENLVAkJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDAsIDB4N0Q4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19HUElPMV80CQkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0tQUF9DT0xfNwkJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDIsIDB4ODQ4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19DQ01fQ0NNX09VVF8yCQkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX0NTVV9DU1VfQUxBUk1fQVVUXzEJCUlPTVVYX1BBRCgweDZCQywgMHgzMkMsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT180X19PQlNFUlZFX01VWF9PQlNSVl9JTlRfT1VUMwlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNF9fRVNESEMyX0NECQkJSU9NVVhfUEFEKDB4NkJDLCAweDMyQywgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzRfX1NDQ19TRUNfU1RBVEUJCQlJT01VWF9QQUQoMHg2QkMsIDB4MzJDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fRVNBSTFfVFgyX1JYMwkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDAsIDB4N0VDLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT181X19HUElPMV81CQkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0tQUF9ST1dfNwkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDIsIDB4ODU0LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT181X19DQ01fQ0xLTwkJCUlPTVVYX1BBRCgweDZDMCwgMHgzMzAsIDMsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT181X19DU1VfQ1NVX0FMQVJNX0FVVF8yCQlJT01VWF9QQUQoMHg2QzAsIDB4MzMwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fT0JTRVJWRV9NVVhfT0JTUlZfSU5UX09VVDQJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzVfX0kyQzNfU0NMCQkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNiB8IElPTVVYX0NPTkZJR19TSU9OLCAweDgyNCwgMiwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fNV9fQ0NNX1BMTDFfQllQCQkJSU9NVVhfUEFEKDB4NkMwLCAweDMzMCwgNywgMHg3NzAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0VTQUkxX1RYNF9SWDEJCQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCAwLCAweDdGNCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fN19fR1BJTzFfNwkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19FUElUMV9FUElUTwkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDIsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT183X19DQU4xX1RYQ0FOCQkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgMywgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX1VBUlQyX1RYRF9NVVgJCQlJT01VWF9QQUQoMHg2QzQsIDB4MzM0LCA0LCBfX05BXywgMCwgTVg1M19VQVJUX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0ZJUklfUlhECQkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNSwgMHg4MEMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX1NQRElGX1BMT0NLCQkJSU9NVVhfUEFEKDB4NkM0LCAweDMzNCwgNiwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzdfX0NDTV9QTEwyX0JZUAkJCUlPTVVYX1BBRCgweDZDNCwgMHgzMzQsIDcsIDB4Nzc0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19FU0FJMV9UWDVfUlgwCQkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgMCwgMHg3RjgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzhfX0dQSU8xXzgJCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fRVBJVDJfRVBJVE8JCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fOF9fQ0FOMV9SWENBTgkJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDMsIDB4NzYwLCAzLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19VQVJUMl9SWERfTVVYCQkJSU9NVVhfUEFEKDB4NkM4LCAweDMzOCwgNCwgMHg4ODAsIDUsIE1YNTNfVUFSVF9QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19GSVJJX1RYRAkJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDUsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19TUERJRl9TUkNMSwkJCUlPTVVYX1BBRCgweDZDOCwgMHgzMzgsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT184X19DQ01fUExMM19CWVAJCQlJT01VWF9QQUQoMHg2QzgsIDB4MzM4LCA3LCAweDc3OCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX0VTQUkxX1RYM19SWDIJCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCAwLCAweDdGMCwgMSwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX0dQSU83XzExCQkJSU9NVVhfUEFEKDB4NkNDLCAweDMzQywgMSwgX19OQV8sIDAsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE2X19UWklDX1BXUkZBSUxfSU5UCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCAyLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1JUQ19DRV9SVENfRVhUX1RSSUcxCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTZfX1NQRElGX0lOMQkJCUlPTVVYX1BBRCgweDZDQywgMHgzM0MsIDUsIDB4ODcwLCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fSTJDM19TREEJCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA2IHwgSU9NVVhfQ09ORklHX1NJT04sIDB4ODI4LCAyLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xNl9fU0pDX0RFX0IJCQlJT01VWF9QQUQoMHg2Q0MsIDB4MzNDLCA3LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0VTQUkxX1RYMAkJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDAsIDB4N0U0LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fR1BJTzdfMTIJCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCAxLCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NETUFfRVhUX0VWRU5UXzAJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDIsIDB4ODY4LCAxLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xN19fR1BDX1BNSUNfUkRZCQkJSU9NVVhfUEFEKDB4NkQwLCAweDM0MCwgMywgMHg4MTAsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE3X19SVENfQ0VfUlRDX0ZTVl9UUklHCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA0LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NQRElGX09VVDEJCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA1LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX0lQVV9TTk9PUDIJCQlJT01VWF9QQUQoMHg2RDAsIDB4MzQwLCA2LCBfX05BXywgMCwgTk9fUEFEX0NUUkwpCisjZGVmaW5lIE1YNTNfUEFEX0dQSU9fMTdfX1NKQ19KVEFHX0FDVAkJCUlPTVVYX1BBRCgweDZEMCwgMHgzNDAsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fRVNBSTFfVFgxCQkJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgMCwgMHg3RTgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19HUElPN18xMwkJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDEsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fU0RNQV9FWFRfRVZFTlRfMQkJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgMiwgMHg4NkMsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19PV0lSRV9MSU5FCQkJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgMywgMHg4NjQsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19SVENfQ0VfUlRDX0FMQVJNMl9UUklHCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDQsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fQ0NNX0FTUkNfRVhUX0NMSwkJSU9NVVhfUEFEKDB4NkQ0LCAweDM0NCwgNSwgMHg3NjgsIDEsIE5PX1BBRF9DVFJMKQorI2RlZmluZSBNWDUzX1BBRF9HUElPXzE4X19FU0RIQzFfTENUTAkJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDYsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKKyNkZWZpbmUgTVg1M19QQURfR1BJT18xOF9fU1JDX1NZU1RFTV9SU1QJCUlPTVVYX1BBRCgweDZENCwgMHgzNDQsIDcsIF9fTkFfLCAwLCBOT19QQURfQ1RSTCkKIAogI2VuZGlmCS8qIF9fTUFDSF9JT01VWF9NWDUzX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lvbXV4LXYzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaAppbmRleCBlYmJjZTMzLi4yZmEzYjU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW9tdXgtdjMuaApAQCAtODAsNiArODAsNyBAQAogCQkoKGlvbXV4X3YzX2NmZ190KShfc2VsX2lucHV0X29mcykgPDwgTVVYX1NFTF9JTlBVVF9PRlNfU0hJRlQpIHwgXAogCQkoKGlvbXV4X3YzX2NmZ190KShfc2VsX2lucHV0KSA8PCBNVVhfU0VMX0lOUFVUX1NISUZUKSkKIAorI2RlZmluZSBORVdfUEFEX0NUUkwoY2ZnLCBwYWQpCSgoKGNmZykgJiB+TVVYX1BBRF9DVFJMX01BU0spIHwgTVVYX1BBRF9DVFJMKHBhZCkpCiAvKgogICogVXNlIHRvIHNldCBQQUQgY29udHJvbAogICovCkBAIC04OSwxMSArOTAsMTEgQEAKICNkZWZpbmUgUEFEX0NUTF9IWVMJCQkoMSA8PCA4KQogCiAjZGVmaW5lIFBBRF9DVExfUEtFCQkJKDEgPDwgNykKLSNkZWZpbmUgUEFEX0NUTF9QVUUJCQkoMSA8PCA2KQotI2RlZmluZSBQQURfQ1RMX1BVU18xMDBLX0RPV04JCSgwIDw8IDQpCi0jZGVmaW5lIFBBRF9DVExfUFVTXzQ3S19VUAkJKDEgPDwgNCkKLSNkZWZpbmUgUEFEX0NUTF9QVVNfMTAwS19VUAkJKDIgPDwgNCkKLSNkZWZpbmUgUEFEX0NUTF9QVVNfMjJLX1VQCQkoMyA8PCA0KQorI2RlZmluZSBQQURfQ1RMX1BVRQkJCSgxIDw8IDYgfCBQQURfQ1RMX1BLRSkKKyNkZWZpbmUgUEFEX0NUTF9QVVNfMTAwS19ET1dOCQkoMCA8PCA0IHwgUEFEX0NUTF9QVUUpCisjZGVmaW5lIFBBRF9DVExfUFVTXzQ3S19VUAkJKDEgPDwgNCB8IFBBRF9DVExfUFVFKQorI2RlZmluZSBQQURfQ1RMX1BVU18xMDBLX1VQCQkoMiA8PCA0IHwgUEFEX0NUTF9QVUUpCisjZGVmaW5lIFBBRF9DVExfUFVTXzIyS19VUAkJKDMgPDwgNCB8IFBBRF9DVExfUFVFKQogCiAjZGVmaW5lIFBBRF9DVExfT0RFCQkJKDEgPDwgMykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggMDBlODEyYi4uZmQ5ZWZiMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0xNCw5ICsxNCwxNSBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KIAogLyoKLSAqIFNvQ3Mgd2l0aCBUWklDIGludGVycnVwdCBjb250cm9sbGVyIGhhdmUgMTI4IElSUXMsIHRob3NlIHdpdGggQVZJQyBoYXZlIDY0CisgKiBTb0NzIHdpdGggR0lDIGludGVycnVwdCBjb250cm9sbGVyIGhhdmUgMTYwIElSUXMsIHRob3NlIHdpdGggVFpJQworICogaGF2ZSAxMjggSVJRcywgYW5kIHRob3NlIHdpdGggQVZJQyBoYXZlIDY0LgorICoKKyAqIFRvIHN1cHBvcnQgc2luZ2xlIGltYWdlLCB0aGUgYmlnZ2VzdCBudW1iZXIgc2hvdWxkIGJlIGRlZmluZWQgb24KKyAqIHRvcCBvZiB0aGUgbGlzdC4KICAqLwotI2lmZGVmIENPTkZJR19NWENfVFpJQworI2lmIGRlZmluZWQgQ09ORklHX0FSTV9HSUMKKyNkZWZpbmUgTVhDX0lOVEVSTkFMX0lSUVMJMTYwCisjZWxpZiBkZWZpbmVkIENPTkZJR19NWENfVFpJQwogI2RlZmluZSBNWENfSU5URVJOQUxfSVJRUwkxMjgKICNlbHNlCiAjZGVmaW5lIE1YQ19JTlRFUk5BTF9JUlFTCTY0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmU1Y2QuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX01FTU9SWV9IX18KLSNkZWZpbmUgX19BU01fQVJDSF9NWENfTUVNT1JZX0hfXwotCi0jZGVmaW5lIE1YMV9QSFlTX09GRlNFVAkJVUwoMHgwODAwMDAwMCkKLSNkZWZpbmUgTVgyMV9QSFlTX09GRlNFVAlVTCgweGMwMDAwMDAwKQotI2RlZmluZSBNWDI1X1BIWVNfT0ZGU0VUCVVMKDB4ODAwMDAwMDApCi0jZGVmaW5lIE1YMjdfUEhZU19PRkZTRVQJVUwoMHhhMDAwMDAwMCkKLSNkZWZpbmUgTVgzeF9QSFlTX09GRlNFVAlVTCgweDgwMDAwMDAwKQotI2RlZmluZSBNWDUwX1BIWVNfT0ZGU0VUCVVMKDB4NzAwMDAwMDApCi0jZGVmaW5lIE1YNTFfUEhZU19PRkZTRVQJVUwoMHg5MDAwMDAwMCkKLSNkZWZpbmUgTVg1M19QSFlTX09GRlNFVAlVTCgweDcwMDAwMDAwKQotCi0jaWYgIWRlZmluZWQoQ09ORklHX1JVTlRJTUVfUEhZU19PRkZTRVQpCi0jIGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgxCi0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVgxX1BIWVNfT0ZGU0VUCi0jIGVsaWYgZGVmaW5lZCBDT05GSUdfTUFDSF9NWDIxCi0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVgyMV9QSFlTX09GRlNFVAotIyBlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVgyNQotIyAgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCU1YMjVfUEhZU19PRkZTRVQKLSMgZWxpZiBkZWZpbmVkIENPTkZJR19NQUNIX01YMjcKLSMgIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlNWDI3X1BIWVNfT0ZGU0VUCi0jIGVsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDMKLSMgIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlNWDN4X1BIWVNfT0ZGU0VUCi0jIGVsaWYgZGVmaW5lZCBDT05GSUdfQVJDSF9NWDUwCi0jICBkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJTVg1MF9QSFlTX09GRlNFVAotIyBlbGlmIGRlZmluZWQgQ09ORklHX0FSQ0hfTVg1MQotIyAgZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCU1YNTFfUEhZU19PRkZTRVQKLSMgZWxpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YNTMKLSMgIGRlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlNWDUzX1BIWVNfT0ZGU0VUCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX01YM19WSURFTykKLS8qCi0gKiBJbmNyZWFzZSBzaXplIG9mIERNQS1jb25zaXN0ZW50IG1lbW9yeSByZWdpb24uCi0gKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBteDMgY2FtZXJhIGRyaXZlciB0byBjYXB0dXJlIGF0IGxlYXN0IHR3byBRWEdBIGZyYW1lcy4KLSAqLwotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzhNCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX01YMV9WSURFTykgfHwgZGVmaW5lZChDT05GSUdfVklERU9fTVgyX0hPU1RTVVBQT1JUKQotLyoKLSAqIEluY3JlYXNlIHNpemUgb2YgRE1BLWNvbnNpc3RlbnQgbWVtb3J5IHJlZ2lvbi4KLSAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGkuTVggY2FtZXJhIGRyaXZlciB0byBjYXB0dXJlIGF0IGxlYXN0IGZvdXIgVkdBIGZyYW1lcy4KLSAqLwotI2RlZmluZSBDT05TSVNURU5UX0RNQV9TSVpFIFNaXzRNCi0jZW5kaWYgLyogQ09ORklHX01YMV9WSURFTyB8fCBDT05GSUdfVklERU9fTVgyX0hPU1RTVVBQT1JUICovCi0KLSNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19NRU1PUllfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjUuaAppbmRleCAwODdjZDdhLi5jY2ViZjViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI1LmgKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgTVgyNV9TU0kyX0JBU0VfQUREUgkJMHg1MDAxNDAwMAogI2RlZmluZSBNWDI1X1NTSTFfQkFTRV9BRERSCQkweDUwMDM0MDAwCiAjZGVmaW5lIE1YMjVfTkZDX0JBU0VfQUREUgkJMHhiYjAwMDAwMAorI2RlZmluZSBNWDI1X0lJTV9CQVNFX0FERFIJCTB4NTNmZjAwMDAKICNkZWZpbmUgTVgyNV9EUllJQ0VfQkFTRV9BRERSCQkweDUzZmZjMDAwCiAjZGVmaW5lIE1YMjVfRVNESEMxX0JBU0VfQUREUgkJMHg1M2ZiNDAwMAogI2RlZmluZSBNWDI1X0VTREhDMl9CQVNFX0FERFIJCTB4NTNmYjgwMDAKQEAgLTEwNCw0ICsxMDUsOCBAQAogI2RlZmluZSBNWDI1X0RNQV9SRVFfU1NJMV9SWDAJMjgKICNkZWZpbmUgTVgyNV9ETUFfUkVRX1NTSTFfVFgwCTI5CiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gaW50IG14MjVfcmV2aXNpb24odm9pZCk7CisjZW5kaWYKKwogI2VuZGlmIC8qIGlmbmRlZiBfX01BQ0hfTVgyNV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgyNy5oCmluZGV4IDFkYzFjNTIuLjYyNjUzNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDI3LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MjcuaApAQCAtMjQsMTAgKzI0LDYgQEAKICNpZm5kZWYgX19NQUNIX01YMjdfSF9fCiAjZGVmaW5lIF9fTUFDSF9NWDI3X0hfXwogCi0jaWZuZGVmIF9fQVNTRU1CTEVSX18KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2VuZGlmCi0KICNkZWZpbmUgTVgyN19BSVBJX0JBU0VfQUREUgkJMHgxMDAwMDAwMAogI2RlZmluZSBNWDI3X0FJUElfU0laRQkJCVNaXzFNCiAjZGVmaW5lIE1YMjdfRE1BX0JBU0VfQUREUgkJCShNWDI3X0FJUElfQkFTRV9BRERSICsgMHgwMTAwMCkKQEAgLTEzMSwxNiArMTI3LDYgQEAKICNkZWZpbmUgTVgyN19JT19QMlYoeCkJCQlJTVhfSU9fUDJWKHgpCiAjZGVmaW5lIE1YMjdfSU9fQUREUkVTUyh4KQkJSU9NRU0oTVgyN19JT19QMlYoeCkpCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXwotc3RhdGljIGlubGluZSB2b2lkIG14Mjdfc2V0dXBfd2VpbWNzKHNpemVfdCBjcywKLQkJdW5zaWduZWQgdXBwZXIsIHVuc2lnbmVkIGxvd2VyLCB1bnNpZ25lZCBhZGRpb25hbCkKLXsKLQlfX3Jhd193cml0ZWwodXBwZXIsIE1YMjdfSU9fQUREUkVTUyhNWDI3X1dFSU1fQ1NDUnhVKGNzKSkpOwotCV9fcmF3X3dyaXRlbChsb3dlciwgTVgyN19JT19BRERSRVNTKE1YMjdfV0VJTV9DU0NSeEwoY3MpKSk7Ci0JX19yYXdfd3JpdGVsKGFkZGlvbmFsLCBNWDI3X0lPX0FERFJFU1MoTVgyN19XRUlNX0NTQ1J4QShjcykpKTsKLX0KLSNlbmRpZgotCiAvKiBmaXhlZCBpbnRlcnJ1cHQgbnVtYmVycyAqLwogI2RlZmluZSBNWDI3X0lOVF9JMkMyCQkxCiAjZGVmaW5lIE1YMjdfSU5UX0dQVDYJCTIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzMS5oCmluZGV4IDc5ZTdmYzAuLmUyNzYxOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDMxLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzEuaApAQCAtMSwxMCArMSw2IEBACiAjaWZuZGVmIF9fTUFDSF9NWDMxX0hfXwogI2RlZmluZSBfX01BQ0hfTVgzMV9IX18KIAotI2lmbmRlZiBfX0FTU0VNQkxFUl9fCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNlbmRpZgotCiAvKgogICogSVJBTQogICovCkBAIC0xMjIsMTYgKzExOCw2IEBACiAjZGVmaW5lIE1YMzFfSU9fUDJWKHgpCQkJSU1YX0lPX1AyVih4KQogI2RlZmluZSBNWDMxX0lPX0FERFJFU1MoeCkJCUlPTUVNKE1YMzFfSU9fUDJWKHgpKQogCi0jaWZuZGVmIF9fQVNTRU1CTEVSX18KLXN0YXRpYyBpbmxpbmUgdm9pZCBteDMxX3NldHVwX3dlaW1jcyhzaXplX3QgY3MsCi0JCXVuc2lnbmVkIHVwcGVyLCB1bnNpZ25lZCBsb3dlciwgdW5zaWduZWQgYWRkaW9uYWwpCi17Ci0JX19yYXdfd3JpdGVsKHVwcGVyLCBNWDMxX0lPX0FERFJFU1MoTVgzMV9XRUlNX0NTQ1J4VShjcykpKTsKLQlfX3Jhd193cml0ZWwobG93ZXIsIE1YMzFfSU9fQUREUkVTUyhNWDMxX1dFSU1fQ1NDUnhMKGNzKSkpOwotCV9fcmF3X3dyaXRlbChhZGRpb25hbCwgTVgzMV9JT19BRERSRVNTKE1YMzFfV0VJTV9DU0NSeEEoY3MpKSk7Ci19Ci0jZW5kaWYKLQogI2RlZmluZSBNWDMxX0lOVF9JMkMzCQkzCiAjZGVmaW5lIE1YMzFfSU5UX0kyQzIJCTQKICNkZWZpbmUgTVgzMV9JTlRfTVBFRzRfRU5DT0RFUgk1CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzNS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214MzUuaAppbmRleCBkMTNkYmZlLi44MDk2NWE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzNS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDM1LmgKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgTVgzNV9VQVJUM19CQVNFX0FERFIJCQkoTVgzNV9TUEJBMF9CQVNFX0FERFIgKyAweDBjMDAwKQogI2RlZmluZSBNWDM1X0NTUEkyX0JBU0VfQUREUgkJCShNWDM1X1NQQkEwX0JBU0VfQUREUiArIDB4MTAwMDApCiAjZGVmaW5lIE1YMzVfU1NJMl9CQVNFX0FERFIJCQkoTVgzNV9TUEJBMF9CQVNFX0FERFIgKyAweDE0MDAwKQotI2RlZmluZSBNWDM1X0FUQV9ETUFfQkFTRV9BRERSCQkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgyMDAwMCkKKyNkZWZpbmUgTVgzNV9BVEFfQkFTRV9BRERSCQkJKE1YMzVfU1BCQTBfQkFTRV9BRERSICsgMHgyMDAwMCkKICNkZWZpbmUgTVgzNV9NU0hDMV9CQVNFX0FERFIJCQkoTVgzNV9TUEJBMF9CQVNFX0FERFIgKyAweDI0MDAwKQogI2RlZmluZSBNWDM1X0ZFQ19CQVNFX0FERFIJCTB4NTAwMzgwMDAKICNkZWZpbmUgTVgzNV9TUEJBX0NUUkxfQkFTRV9BRERSCQkoTVgzNV9TUEJBMF9CQVNFX0FERFIgKyAweDNjMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214M3guaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDN4LmgKaW5kZXggMzg4YTQwNy4uMzBkYmY0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214M3guaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXgzeC5oCkBAIC0xODcsMjIgKzE4Nyw4IEBACiAvKiBNYW5kYXRvcnkgZGVmaW5lcyB1c2VkIGdsb2JhbGx5ICovCiAKICNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pICYmICFkZWZpbmVkKF9fTVhDX0JPT1RfVU5DT01QUkVTUykKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBteDMxX2NwdV9yZXY7Ci1leHRlcm4gdm9pZCBteDMxX3JlYWRfY3B1X3Jldih2b2lkKTsKLQotc3RhdGljIGlubGluZSBpbnQgbXgzMV9yZXZpc2lvbih2b2lkKQotewotCXJldHVybiBteDMxX2NwdV9yZXY7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgbXgzNV9jcHVfcmV2OwotZXh0ZXJuIHZvaWQgbXgzNV9yZWFkX2NwdV9yZXYodm9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG14MzVfcmV2aXNpb24odm9pZCkKLXsKLQlyZXR1cm4gbXgzNV9jcHVfcmV2OwotfQorZXh0ZXJuIGludCBteDM1X3JldmlzaW9uKHZvaWQpOworZXh0ZXJuIGludCBteDMxX3JldmlzaW9uKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZiAvKiBpZm5kZWYgX19NQUNIX01YM3hfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1MS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTEuaAppbmRleCBkZWRlMTlhLi5jZGYwN2M2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1MS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUxLmgKQEAgLTE4LDE4ICsxOCw2IEBACiAjZGVmaW5lIE1YNTFfR1BVX0NUUkxfQkFTRV9BRERSCQkweDMwMDAwMDAwCiAjZGVmaW5lIE1YNTFfSVBVX0NUUkxfQkFTRV9BRERSCQkweDQwMDAwMDAwCiAKLSNkZWZpbmUgTVg1MV9ERUJVR19CQVNFX0FERFIJCTB4NjAwMDAwMDAKLSNkZWZpbmUgTVg1MV9ERUJVR19TSVpFCQkJU1pfMU0KLQotI2RlZmluZSBNWDUxX0VUQl9CQVNFX0FERFIJCShNWDUxX0RFQlVHX0JBU0VfQUREUiArIDB4MDEwMDApCi0jZGVmaW5lIE1YNTFfRVRNX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwMjAwMCkKLSNkZWZpbmUgTVg1MV9UUElVX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwMzAwMCkKLSNkZWZpbmUgTVg1MV9DVEkwX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwNDAwMCkKLSNkZWZpbmUgTVg1MV9DVEkxX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwNTAwMCkKLSNkZWZpbmUgTVg1MV9DVEkyX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwNjAwMCkKLSNkZWZpbmUgTVg1MV9DVEkzX0JBU0VfQUREUgkJKE1YNTFfREVCVUdfQkFTRV9BRERSICsgMHgwNzAwMCkKLSNkZWZpbmUgTVg1MV9DT1JURVhfREJHX0JBU0VfQUREUgkoTVg1MV9ERUJVR19CQVNFX0FERFIgKyAweDA4MDAwKQotCiAvKgogICogU1BCQSBnbG9iYWwgbW9kdWxlIGVuYWJsZWQgIzAKICAqLwpAQCAtNTUsNyArNDMsMTAgQEAKICNkZWZpbmUgTVg1MV9BSVBTMV9CQVNFX0FERFIJCTB4NzNmMDAwMDAKICNkZWZpbmUgTVg1MV9BSVBTMV9TSVpFCQkJU1pfMU0KIAotI2RlZmluZSBNWDUxX09UR19CQVNFX0FERFIJCShNWDUxX0FJUFMxX0JBU0VfQUREUiArIDB4ODAwMDApCisjZGVmaW5lIE1YNTFfVVNCX0JBU0VfQUREUgkJKE1YNTFfQUlQUzFfQkFTRV9BRERSICsgMHg4MDAwMCkKKyNkZWZpbmUgTVg1MV9VU0JfT1RHX0JBU0VfQUREUgkJKE1YNTFfVVNCX0JBU0VfQUREUiArIDB4MDAwMCkKKyNkZWZpbmUgTVg1MV9VU0JfSFMxX0JBU0VfQUREUgkJKE1YNTFfVVNCX0JBU0VfQUREUiArIDB4MDIwMCkKKyNkZWZpbmUgTVg1MV9VU0JfSFMyX0JBU0VfQUREUgkJKE1YNTFfVVNCX0JBU0VfQUREUiArIDB4MDQwMCkKICNkZWZpbmUgTVg1MV9HUElPMV9CQVNFX0FERFIJCShNWDUxX0FJUFMxX0JBU0VfQUREUiArIDB4ODQwMDApCiAjZGVmaW5lIE1YNTFfR1BJTzJfQkFTRV9BRERSCQkoTVg1MV9BSVBTMV9CQVNFX0FERFIgKyAweDg4MDAwKQogI2RlZmluZSBNWDUxX0dQSU8zX0JBU0VfQUREUgkJKE1YNTFfQUlQUzFfQkFTRV9BRERSICsgMHg4YzAwMCkKQEAgLTEzMiw2ICsxMjMsNyBAQAogCiAjZGVmaW5lIE1YNTFfR1BVMkRfQkFTRV9BRERSCQkweGQwMDAwMDAwCiAjZGVmaW5lIE1YNTFfVFpJQ19CQVNFX0FERFIJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgTVg1MV9UWklDX1NJWkUJCQlTWl8xNksKIAogI2RlZmluZSBNWDUxX0lPX1AyVih4KQkJCUlNWF9JT19QMlYoeCkKICNkZWZpbmUgTVg1MV9JT19BRERSRVNTKHgpCQlJT01FTShNWDUxX0lPX1AyVih4KSkKQEAgLTI0MCwxMTcgKzIzMiwxMTQgQEAKIC8qCiAgKiBJbnRlcnJ1cHQgbnVtYmVycwogICovCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9CQVNFCQkwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SRVNWMAkJMAorI2RlZmluZSBNWDUxX0lOVF9CQVNFCQkJMAorI2RlZmluZSBNWDUxX0lOVF9SRVNWMAkJCTAKICNkZWZpbmUgTVg1MV9JTlRfRVNESEMxCQkJMQogI2RlZmluZSBNWDUxX0lOVF9FU0RIQzIJCQkyCiAjZGVmaW5lIE1YNTFfSU5UX0VTREhDMwkJCTMKICNkZWZpbmUgTVg1MV9JTlRfRVNESEM0CQkJNAotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjUJCTUKKyNkZWZpbmUgTVg1MV9JTlRfUkVTVjUJCQk1CiAjZGVmaW5lIE1YNTFfSU5UX1NETUEJCQk2Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9JT01VWAkJNworI2RlZmluZSBNWDUxX0lOVF9JT01VWAkJCTcKICNkZWZpbmUgTVg1MV9JTlRfTkZDCQkJOAotI2RlZmluZSBNWDUxX01YQ19JTlRfVlBVCQk5CisjZGVmaW5lIE1YNTFfSU5UX1ZQVQkJCTkKICNkZWZpbmUgTVg1MV9JTlRfSVBVX0VSUgkJMTAKICNkZWZpbmUgTVg1MV9JTlRfSVBVX1NZTgkJMTEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQVQkJMTIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1JFU1YxMwkJMTMKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1VTQl9IMQkJMTQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0VNSQkJMTUKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1VTQl9IMgkJMTYKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1VTQl9IMwkJMTcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1VTQl9PVEcJCTE4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TQUhBUkFfSDAJCTE5Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TQUhBUkFfSDEJCTIwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TQ0NfU01OCQkyMQotI2RlZmluZSBNWDUxX01YQ19JTlRfU0NDX1NUWgkJMjIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NDQ19TQ00JCTIzCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TUlRDX05UWgkJMjQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NSVENfVFoJCTI1Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SVElDCQkyNgotI2RlZmluZSBNWDUxX01YQ19JTlRfQ1NVCQkyNwotI2RlZmluZSBNWDUxX01YQ19JTlRfU0xJTV9CCQkyOAorI2RlZmluZSBNWDUxX0lOVF9HUFUJCQkxMgorI2RlZmluZSBNWDUxX0lOVF9SRVNWMTMJCQkxMworI2RlZmluZSBNWDUxX0lOVF9VU0JfSFMxCQkxNAorI2RlZmluZSBNWDUxX0lOVF9FTUkJCQkxNQorI2RlZmluZSBNWDUxX0lOVF9VU0JfSFMyCQkxNgorI2RlZmluZSBNWDUxX0lOVF9VU0JfSFMzCQkxNworI2RlZmluZSBNWDUxX0lOVF9VU0JfT1RHCQkxOAorI2RlZmluZSBNWDUxX0lOVF9TQUhBUkFfSDAJCTE5CisjZGVmaW5lIE1YNTFfSU5UX1NBSEFSQV9IMQkJMjAKKyNkZWZpbmUgTVg1MV9JTlRfU0NDX1NNTgkJMjEKKyNkZWZpbmUgTVg1MV9JTlRfU0NDX1NUWgkJMjIKKyNkZWZpbmUgTVg1MV9JTlRfU0NDX1NDTQkJMjMKKyNkZWZpbmUgTVg1MV9JTlRfU1JUQ19OVFoJCTI0CisjZGVmaW5lIE1YNTFfSU5UX1NSVENfVFoJCTI1CisjZGVmaW5lIE1YNTFfSU5UX1JUSUMJCQkyNgorI2RlZmluZSBNWDUxX0lOVF9DU1UJCQkyNworI2RlZmluZSBNWDUxX0lOVF9TTElNX0IJCQkyOAogI2RlZmluZSBNWDUxX0lOVF9TU0kxCQkJMjkKICNkZWZpbmUgTVg1MV9JTlRfU1NJMgkJCTMwCiAjZGVmaW5lIE1YNTFfSU5UX1VBUlQxCQkJMzEKICNkZWZpbmUgTVg1MV9JTlRfVUFSVDIJCQkzMgogI2RlZmluZSBNWDUxX0lOVF9VQVJUMwkJCTMzCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SRVNWMzQJCTM0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SRVNWMzUJCTM1CisjZGVmaW5lIE1YNTFfSU5UX1JFU1YzNAkJCTM0CisjZGVmaW5lIE1YNTFfSU5UX1JFU1YzNQkJCTM1CiAjZGVmaW5lIE1YNTFfSU5UX0VDU1BJMQkJCTM2CiAjZGVmaW5lIE1YNTFfSU5UX0VDU1BJMgkJCTM3CiAjZGVmaW5lIE1YNTFfSU5UX0NTUEkJCQkzOAotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BUCQkzOQotI2RlZmluZSBNWDUxX01YQ19JTlRfRVBJVDEJCTQwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9FUElUMgkJNDEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0lOVDcJCTQyCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQ2CQk0MwotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSU5UNQkJNDQKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0lOVDQJCTQ1Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQzCQk0NgotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSU5UMgkJNDcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8xX0lOVDEJCTQ4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPMV9JTlQwCQk0OQotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfTE9XCQk1MAotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzFfSElHSAkJNTEKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8yX0xPVwkJNTIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQSU8yX0hJR0gJCTUzCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPM19MT1cJCTU0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUElPM19ISUdICQk1NQotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzRfTE9XCQk1NgotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BJTzRfSElHSAkJNTcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1dET0cxCQk1OAotI2RlZmluZSBNWDUxX01YQ19JTlRfV0RPRzIJCTU5CisjZGVmaW5lIE1YNTFfSU5UX0dQVAkJCTM5CisjZGVmaW5lIE1YNTFfSU5UX0VQSVQxCQkJNDAKKyNkZWZpbmUgTVg1MV9JTlRfRVBJVDIJCQk0MQorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQ3CQk0MgorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQ2CQk0MworI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQ1CQk0NAorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQ0CQk0NQorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQzCQk0NgorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQyCQk0NworI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQxCQk0OAorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9JTlQwCQk0OQorI2RlZmluZSBNWDUxX0lOVF9HUElPMV9MT1cJCTUwCisjZGVmaW5lIE1YNTFfSU5UX0dQSU8xX0hJR0gJCTUxCisjZGVmaW5lIE1YNTFfSU5UX0dQSU8yX0xPVwkJNTIKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzJfSElHSAkJNTMKKyNkZWZpbmUgTVg1MV9JTlRfR1BJTzNfTE9XCQk1NAorI2RlZmluZSBNWDUxX0lOVF9HUElPM19ISUdICQk1NQorI2RlZmluZSBNWDUxX0lOVF9HUElPNF9MT1cJCTU2CisjZGVmaW5lIE1YNTFfSU5UX0dQSU80X0hJR0gJCTU3CisjZGVmaW5lIE1YNTFfSU5UX1dET0cxCQkJNTgKKyNkZWZpbmUgTVg1MV9JTlRfV0RPRzIJCQk1OQogI2RlZmluZSBNWDUxX0lOVF9LUFAJCQk2MAogI2RlZmluZSBNWDUxX0lOVF9QV00xCQkJNjEKICNkZWZpbmUgTVg1MV9JTlRfSTJDMQkJCTYyCiAjZGVmaW5lIE1YNTFfSU5UX0kyQzIJCQk2MwotI2RlZmluZSBNWDUxX01YQ19JTlRfSFNfSTJDCQk2NAotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjY1CQk2NQotI2RlZmluZSBNWDUxX01YQ19JTlRfUkVTVjY2CQk2NgotI2RlZmluZSBNWDUxX01YQ19JTlRfU0lNX0lQQgkJNjcKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NJTV9EQVQJCTY4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9JSU0JCTY5Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9BVEEJCTcwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9DQ00xCQk3MQotI2RlZmluZSBNWDUxX01YQ19JTlRfQ0NNMgkJNzIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0dQQzEJCTczCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUEMyCQk3NAotI2RlZmluZSBNWDUxX01YQ19JTlRfU1JDCQk3NQotI2RlZmluZSBNWDUxX01YQ19JTlRfTk0JCQk3NgotI2RlZmluZSBNWDUxX01YQ19JTlRfUE1VCQk3NwotI2RlZmluZSBNWDUxX01YQ19JTlRfQ1RJX0lSUQkJNzgKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0NUSTFfVEcwCQk3OQotI2RlZmluZSBNWDUxX01YQ19JTlRfQ1RJMV9URzEJCTgwCi0jZGVmaW5lIE1YNTFfTVhDX0lOVF9NQ0dfRVJSCQk4MQotI2RlZmluZSBNWDUxX01YQ19JTlRfTUNHX1RNUgkJODIKLSNkZWZpbmUgTVg1MV9NWENfSU5UX01DR19GVU5DCQk4MwotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BVMl9JUlEJCTg0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9HUFUyX0JVU1kJCTg1Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9SRVNWODYJCTg2CisjZGVmaW5lIE1YNTFfSU5UX0hTX0kyQwkJCTY0CisjZGVmaW5lIE1YNTFfSU5UX1JFU1Y2NQkJCTY1CisjZGVmaW5lIE1YNTFfSU5UX1JFU1Y2NgkJCTY2CisjZGVmaW5lIE1YNTFfSU5UX1NJTV9JUEIJCTY3CisjZGVmaW5lIE1YNTFfSU5UX1NJTV9EQVQJCTY4CisjZGVmaW5lIE1YNTFfSU5UX0lJTQkJCTY5CisjZGVmaW5lIE1YNTFfSU5UX0FUQQkJCTcwCisjZGVmaW5lIE1YNTFfSU5UX0NDTTEJCQk3MQorI2RlZmluZSBNWDUxX0lOVF9DQ00yCQkJNzIKKyNkZWZpbmUgTVg1MV9JTlRfR1BDMQkJCQk3MworI2RlZmluZSBNWDUxX0lOVF9HUEMyCQkJNzQKKyNkZWZpbmUgTVg1MV9JTlRfU1JDCQkJNzUKKyNkZWZpbmUgTVg1MV9JTlRfTk0JCQk3NgorI2RlZmluZSBNWDUxX0lOVF9QTVUJCQk3NworI2RlZmluZSBNWDUxX0lOVF9DVElfSVJRCQk3OAorI2RlZmluZSBNWDUxX0lOVF9DVEkxX1RHMAkJNzkKKyNkZWZpbmUgTVg1MV9JTlRfQ1RJMV9URzEJCTgwCisjZGVmaW5lIE1YNTFfSU5UX01DR19FUlIJCTgxCisjZGVmaW5lIE1YNTFfSU5UX01DR19UTVIJCTgyCisjZGVmaW5lIE1YNTFfSU5UX01DR19GVU5DCQk4MworI2RlZmluZSBNWDUxX0lOVF9HUFUyX0lSUQkJODQKKyNkZWZpbmUgTVg1MV9JTlRfR1BVMl9CVVNZCQk4NQorI2RlZmluZSBNWDUxX0lOVF9SRVNWODYJCQk4NgogI2RlZmluZSBNWDUxX0lOVF9GRUMJCQk4NwotI2RlZmluZSBNWDUxX01YQ19JTlRfT1dJUkUJCTg4Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9DVEkxX1RHMgkJODkKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NKQwkJOTAKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NQRElGCQk5MQotI2RlZmluZSBNWDUxX01YQ19JTlRfVFZFCQk5MgotI2RlZmluZSBNWDUxX01YQ19JTlRfRklSSQkJOTMKKyNkZWZpbmUgTVg1MV9JTlRfT1dJUkUJCQk4OAorI2RlZmluZSBNWDUxX0lOVF9DVEkxX1RHMgkJODkKKyNkZWZpbmUgTVg1MV9JTlRfU0pDCQkJOTAKKyNkZWZpbmUgTVg1MV9JTlRfU1BESUYJCQk5MQorI2RlZmluZSBNWDUxX0lOVF9UVkUJCQk5MgorI2RlZmluZSBNWDUxX0lOVF9GSVJJCQkJOTMKICNkZWZpbmUgTVg1MV9JTlRfUFdNMgkJCTk0Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9TTElNX0VYUAkJOTUKKyNkZWZpbmUgTVg1MV9JTlRfU0xJTV9FWFAJCTk1CiAjZGVmaW5lIE1YNTFfSU5UX1NTSTMJCQk5NgotI2RlZmluZSBNWDUxX01YQ19JTlRfRU1JX0JPT1QJCTk3Ci0jZGVmaW5lIE1YNTFfTVhDX0lOVF9DVEkxX1RHMwkJOTgKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1NNQ19SWAkJOTkKLSNkZWZpbmUgTVg1MV9NWENfSU5UX1ZQVV9JRExFCQkxMDAKLSNkZWZpbmUgTVg1MV9NWENfSU5UX0VNSV9ORkMJCTEwMQotI2RlZmluZSBNWDUxX01YQ19JTlRfR1BVX0lETEUJCTEwMgorI2RlZmluZSBNWDUxX0lOVF9FTUlfQk9PVAkJOTcKKyNkZWZpbmUgTVg1MV9JTlRfQ1RJMV9URzMJCTk4CisjZGVmaW5lIE1YNTFfSU5UX1NNQ19SWAkJCTk5CisjZGVmaW5lIE1YNTFfSU5UX1ZQVV9JRExFCQkxMDAKKyNkZWZpbmUgTVg1MV9JTlRfRU1JX05GQwkJMTAxCisjZGVmaW5lIE1YNTFfSU5UX0dQVV9JRExFCQkxMDIKIAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykgJiYgIWRlZmluZWQoX19NWENfQk9PVF9VTkNPTVBSRVNTKQogZXh0ZXJuIGludCBteDUxX3JldmlzaW9uKHZvaWQpOwogZXh0ZXJuIHZvaWQgbXg1MV9kaXNwbGF5X3JldmlzaW9uKHZvaWQpOwogI2VuZGlmCiAKLS8qIHRhcGUtb3V0IDEgZGVmaW5lcyAqLwotI2RlZmluZSBNWDUxX1RaSUNfQkFTRV9BRERSX1RPMQkJMHg4ZmZmYzAwMAotCiAjZW5kaWYJLyogaWZuZGVmIF9fTUFDSF9NWDUxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDUzLmgKaW5kZXggNWUzYzMyMy4uYTM3ZThjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NTMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXg1My5oCkBAIC05LDYgKzksNyBAQAogCiAvKiBUWklDICovCiAjZGVmaW5lIE1YNTNfVFpJQ19CQVNFX0FERFIJCTB4MEZGRkMwMDAKKyNkZWZpbmUgTVg1M19UWklDX1NJWkUJCQlTWl8xNksKIAogLyoKICAqIEFIQ0kgU0FUQQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214NnEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDZxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0YTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teDZxLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMSBMaW5hcm8gTHRkLgorICoKKyAqIFRoZSBjb2RlIGNvbnRhaW5lZCBoZXJlaW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIG9yIGxhdGVyIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICoKKyAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UuaHRtbAorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2lmbmRlZiBfX01BQ0hfTVg2UV9IX18KKyNkZWZpbmUgX19NQUNIX01YNlFfSF9fCisKKyNkZWZpbmUgTVg2UV9JT19QMlYoeCkJCQlJTVhfSU9fUDJWKHgpCisjZGVmaW5lIE1YNlFfSU9fQUREUkVTUyh4KQkJSU9NRU0oTVg2UV9JT19QMlYoeCkpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgYmxvY2tzIHRoYXQgbmVlZCB0byBiZSBzdGF0aWNhbGx5IG1hcHBlZC4KKyAqIEZvciBvdGhlciBibG9ja3MsIHRoZSBiYXNlIGFkZHJlc3MgcmVhbGx5IHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbQorICogZGV2aWNlIHRyZWUuCisgKi8KKyNkZWZpbmUgTVg2UV9TQ1VfQkFTRV9BRERSCQkweDAwYTAwMDAwCisjZGVmaW5lIE1YNlFfU0NVX1NJWkUJCQkweDEwMDAKKyNkZWZpbmUgTVg2UV9DQ01fQkFTRV9BRERSCQkweDAyMGM0MDAwCisjZGVmaW5lIE1YNlFfQ0NNX1NJWkUJCQkweDQwMDAKKyNkZWZpbmUgTVg2UV9BTkFUT1BfQkFTRV9BRERSCQkweDAyMGM4MDAwCisjZGVmaW5lIE1YNlFfQU5BVE9QX1NJWkUJCTB4MTAwMAorI2RlZmluZSBNWDZRX1VBUlQ0X0JBU0VfQUREUgkJMHgwMjFmMDAwMAorI2RlZmluZSBNWDZRX1VBUlQ0X1NJWkUJCQkweDQwMDAKKworI2VuZGlmCS8qIF9fTUFDSF9NWDZRX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL214Yy5oCmluZGV4IDA5ODc5MjMuLjAwYTc4MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9teGMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvbXhjLmgKQEAgLTE4MywxMyArMTgzLDYgQEAKIH07CiAKIGludCB0emljX2VuYWJsZV93YWtlKGludCBpc19pZGxlKTsKLWVudW0gbXhjX2NwdV9wd3JfbW9kZSB7Ci0JV0FJVF9DTE9DS0VELAkJLyogd2ZpIG9ubHkgKi8KLQlXQUlUX1VOQ0xPQ0tFRCwJCS8qIFdBSVQgKi8KLQlXQUlUX1VOQ0xPQ0tFRF9QT1dFUl9PRkYsCS8qIFdBSVQgKyBTUlBHICovCi0JU1RPUF9QT1dFUl9PTiwJCS8qIGp1c3QgU1RPUCAqLwotCVNUT1BfUE9XRVJfT0ZGLAkJLyogU1RPUCArIFNSUEcgKi8KLX07CiAKIGV4dGVybiBzdHJ1Y3QgY3B1X29wICooKmdldF9jcHVfb3ApKGludCAqb3ApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc3lzdGVtLmgKaW5kZXggNTFmMDJhOS4uY2Y4OGIzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApAQCAtMTcsNDEgKzE3LDEyIEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfTVhDX1NZU1RFTV9IX18KICNkZWZpbmUgX19BU01fQVJDSF9NWENfU1lTVEVNX0hfXwogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+Ci0KLWV4dGVybiB2b2lkIG14NV9jcHVfbHBfc2V0KGVudW0gbXhjX2NwdV9wd3JfbW9kZSBtb2RlKTsKK2V4dGVybiB2b2lkICgqaW14X2lkbGUpKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9pZGxlKHZvaWQpCiB7Ci0JLyogZml4IGkuTVgzMSBlcnJhdGEgVExTYm82NTk1MyBhbmQgaS5NWDM1IGVycmF0YSBFTkdjbTA5NDcyICovCi0JaWYgKGNwdV9pc19teDMxKCkgfHwgY3B1X2lzX214MzUoKSkgewotCQl1bnNpZ25lZCBsb25nIHJlZyA9IDA7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQkJLyogZGlzYWJsZSBJIGFuZCBEIGNhY2hlICovCi0JCQkibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCQkJImJpYyAlMCwgJTAsICMweDAwMDAxMDAwXG4iCi0JCQkiYmljICUwLCAlMCwgIzB4MDAwMDAwMDRcbiIKLQkJCSJtY3IgcDE1LCAwLCAlMCwgYzEsIGMwLCAwXG4iCi0JCQkvKiBpbnZhbGlkYXRlIEkgY2FjaGUgKi8KLQkJCSJtb3YgJTAsICMwXG4iCi0JCQkibWNyIHAxNSwgMCwgJTAsIGM3LCBjNSwgMFxuIgotCQkJLyogY2xlYXIgYW5kIGludmFsaWRhdGUgRCBjYWNoZSAqLwotCQkJIm1vdiAlMCwgIzBcbiIKLQkJCSJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxNCwgMFxuIgotCQkJLyogV0ZJICovCi0JCQkibW92ICUwLCAjMFxuIgotCQkJIm1jciBwMTUsIDAsICUwLCBjNywgYzAsIDRcbiIKLQkJCSJub3BcbiIgIm5vcFxuIiAibm9wXG4iICJub3BcbiIKLQkJCSJub3BcbiIgIm5vcFxuIiAibm9wXG4iCi0JCQkvKiBlbmFibGUgSSBhbmQgRCBjYWNoZSAqLwotCQkJIm1yYyBwMTUsIDAsICUwLCBjMSwgYzAsIDBcbiIKLQkJCSJvcnIgJTAsICUwLCAjMHgwMDAwMTAwMFxuIgotCQkJIm9yciAlMCwgJTAsICMweDAwMDAwMDA0XG4iCi0JCQkibWNyIHAxNSwgMCwgJTAsIGMxLCBjMCwgMFxuIgotCQkJOiAiPXIiIChyZWcpKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19teDUxKCkpCi0JCW14NV9jcHVfbHBfc2V0KFdBSVRfVU5DTE9DS0VEX1BPV0VSX09GRik7CisJaWYgKGlteF9pZGxlICE9IE5VTEwpCisJCShpbXhfaWRsZSkoKTsKIAllbHNlCiAJCWNwdV9kb19pZGxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pcnEtY29tbW9uLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9pcnEtY29tbW9uLmMKaW5kZXggOTY5NTNlMi4uYjZlMTE0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2lycS1jb21tb24uYwpAQCAtMjMsMTcgKzIzLDE3IEBACiAKIGludCBpbXhfaXJxX3NldF9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGlycSwgdW5zaWduZWQgY2hhciBwcmlvKQogewotCXN0cnVjdCBteGNfaXJxX2NoaXAgKmNoaXA7Ci0Jc3RydWN0IGlycV9jaGlwICpiYXNlOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgbXhjX2V4dHJhX2lycSAqZXhpcnE7CiAJaW50IHJldDsKIAogCXJldCA9IC1FTk9TWVM7CiAKLQliYXNlID0gaXJxX2dldF9jaGlwKGlycSk7Ci0JaWYgKGJhc2UpIHsKLQkJY2hpcCA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3QgbXhjX2lycV9jaGlwLCBiYXNlKTsKLQkJaWYgKGNoaXAtPnNldF9wcmlvcml0eSkKLQkJCXJldCA9IGNoaXAtPnNldF9wcmlvcml0eShpcnEsIHByaW8pOworCWdjID0gaXJxX2dldF9jaGlwX2RhdGEoaXJxKTsKKwlpZiAoZ2MgJiYgZ2MtPnByaXZhdGUpIHsKKwkJZXhpcnEgPSBnYy0+cHJpdmF0ZTsKKwkJaWYgKGV4aXJxLT5zZXRfcHJpb3JpdHkpCisJCQlyZXQgPSBleGlycS0+c2V0X3ByaW9yaXR5KGlycSwgcHJpbyk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTQzLDE1ICs0MywxNiBAQAogaW50IG14Y19zZXRfaXJxX2ZpcSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7Ci0JaW50ICgqc2V0X2lycV9maXEpKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKwlzdHJ1Y3QgbXhjX2V4dHJhX2lycSAqZXhpcnE7CiAJaW50IHJldDsKIAogCXJldCA9IC1FTk9TWVM7CiAKIAlnYyA9IGlycV9nZXRfY2hpcF9kYXRhKGlycSk7CiAJaWYgKGdjICYmIGdjLT5wcml2YXRlKSB7Ci0JCXNldF9pcnFfZmlxID0gZ2MtPnByaXZhdGU7Ci0JCXJldCA9IHNldF9pcnFfZmlxKGlycSwgdHlwZSk7CisJCWV4aXJxID0gZ2MtPnByaXZhdGU7CisJCWlmIChleGlycS0+c2V0X2lycV9maXEpCisJCQlyZXQgPSBleGlycS0+c2V0X2lycV9maXEoaXJxLCB0eXBlKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaXJxLWNvbW1vbi5oCmluZGV4IDcyMDM1NDMuLjZjY2IzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2lycS1jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pcnEtY29tbW9uLmgKQEAgLTE5LDkgKzE5LDggQEAKICNpZm5kZWYgX19QTEFUX01YQ19JUlFfQ09NTU9OX0hfXwogI2RlZmluZSBfX1BMQVRfTVhDX0lSUV9DT01NT05fSF9fCiAKLXN0cnVjdCBteGNfaXJxX2NoaXAKK3N0cnVjdCBteGNfZXh0cmFfaXJxCiB7Ci0Jc3RydWN0IGlycV9jaGlwCWJhc2U7CiAJaW50ICgqc2V0X3ByaW9yaXR5KSh1bnNpZ25lZCBjaGFyIGlycSwgdW5zaWduZWQgY2hhciBwcmlvKTsKIAlpbnQgKCpzZXRfaXJxX2ZpcSkodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvcHdtLmMKaW5kZXggNzYxYzNjOS4uNDJkNzRlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvcHdtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvcHdtLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAlpZiAocHdtID09IE5VTEwgfHwgcGVyaW9kX25zID09IDAgfHwgZHV0eV9ucyA+IHBlcmlvZF9ucykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY3B1X2lzX214MjcoKSB8fCBjcHVfaXNfbXgzKCkgfHwgY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXg1MSgpKSB7CisJaWYgKCEoY3B1X2lzX214MSgpIHx8IGNwdV9pc19teDIxKCkpKSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBjOwogCQl1bnNpZ25lZCBsb25nIHBlcmlvZF9jeWNsZXMsIGR1dHlfY3ljbGVzLCBwcmVzY2FsZTsKIAkJdTMyIGNyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvc3lzdGVtLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYwppbmRleCA4MDI0ZjJhLi45ZGFkOGRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9zeXN0ZW0uYwpAQCAtMjgsNiArMjgsOSBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCit2b2lkICgqaW14X2lkbGUpKHZvaWQpID0gTlVMTDsKK3ZvaWQgX19pb21lbSAqKCppbXhfaW9yZW1hcCkodW5zaWduZWQgbG9uZywgc2l6ZV90LCB1bnNpZ25lZCBpbnQpID0gTlVMTDsKKwogc3RhdGljIHZvaWQgX19pb21lbSAqd2RvZ19iYXNlOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvdHppYy5jIGIvYXJjaC9hcm0vcGxhdC1teGMvdHppYy5jCmluZGV4IGYyNTdmY2MuLmEzYzE2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL3R6aWMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy90emljLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvY29tbW9uLmg+CkBAIC00Miw3ICs0Myw3IEBACiAjZGVmaW5lIFRaSUNfU1JDQ0xBUjAJMHgwMjgwCS8qIFNvdXJjZSBDbGVhciBSZWdpc3RlciAwICovCiAjZGVmaW5lIFRaSUNfUFJJT1JJVFkwCTB4MDQwMAkvKiBQcmlvcml0eSBSZWdpc3RlciAwICovCiAjZGVmaW5lIFRaSUNfUE5EMAkweDBEMDAJLyogUGVuZGluZyBSZWdpc3RlciAwICovCi0jZGVmaW5lIFRaSUNfSElQTkQwCTB4MEQ4MAkvKiBIaWdoIFByaW9yaXR5IFBlbmRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFpJQ19ISVBORChpKQkoMHgwRDgwKyAoKGkpIDw8IDIpKQkvKiBIaWdoIFByaW9yaXR5IFBlbmRpbmcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgVFpJQ19XQUtFVVAwKGkpCSgweDBFMDAgKyAoKGkpIDw8IDIpKQkvKiBXYWtldXAgQ29uZmlnIFJlZ2lzdGVyICovCiAjZGVmaW5lIFRaSUNfU1dJTlQJMHgwRjAwCS8qIFNvZnR3YXJlIEludGVycnVwdCBSaWdnZXIgUmVnaXN0ZXIgKi8KICNkZWZpbmUgVFpJQ19JRDAJMHgwRkQwCS8qIEluZGVudGlmaWNhdGlvbiBSZWdpc3RlciAwICovCkBAIC03NCw2ICs3NSwxMiBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50ICp3YWtldXBfaW50cls0XTsKIAorc3RhdGljIHN0cnVjdCBteGNfZXh0cmFfaXJxIHR6aWNfZXh0cmFfaXJxID0geworI2lmZGVmIENPTkZJR19GSVEKKwkuc2V0X2lycV9maXEgPSB0emljX3NldF9pcnFfZmlxLAorI2VuZGlmCit9OworCiBzdGF0aWMgX19pbml0IHZvaWQgdHppY19pbml0X2djKHVuc2lnbmVkIGludCBpcnFfc3RhcnQpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOwpAQCAtODIsNyArODksNyBAQAogCiAJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJ0emljIiwgMSwgaXJxX3N0YXJ0LCB0emljX2Jhc2UsCiAJCQkJICAgIGhhbmRsZV9sZXZlbF9pcnEpOwotCWdjLT5wcml2YXRlID0gdHppY19zZXRfaXJxX2ZpcTsKKwlnYy0+cHJpdmF0ZSA9ICZ0emljX2V4dHJhX2lycTsKIAlnYy0+d2FrZV9lbmFibGVkID0gSVJRX01TSygzMik7CiAJd2FrZXVwX2ludHJbaWR4XSA9ICZnYy0+d2FrZV9hY3RpdmU7CiAKQEAgLTk2LDYgKzEwMywyOCBAQAogCWlycV9zZXR1cF9nZW5lcmljX2NoaXAoZ2MsIElSUV9NU0soMzIpLCAwLCBJUlFfTk9SRVFVRVNULCAwKTsKIH0KIAorYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uX2lycV9lbnRyeSB0emljX2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHN0YXQ7CisJaW50IGksIGlycW9mcywgaGFuZGxlZDsKKworCWRvIHsKKwkJaGFuZGxlZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJc3RhdCA9IF9fcmF3X3JlYWRsKHR6aWNfYmFzZSArIFRaSUNfSElQTkQoaSkpICYKKwkJCQlfX3Jhd19yZWFkbCh0emljX2Jhc2UgKyBUWklDX0lOVFNFQzAoaSkpOworCisJCQl3aGlsZSAoc3RhdCkgeworCQkJCWhhbmRsZWQgPSAxOworCQkJCWlycW9mcyA9IGZscyhzdGF0KSAtIDE7CisJCQkJaGFuZGxlX0lSUShpcnFvZnMgKyBpICogMzIsIHJlZ3MpOworCQkJCXN0YXQgJj0gfigxIDw8IGlycW9mcyk7CisJCQl9CisJCX0KKwl9IHdoaWxlIChoYW5kbGVkKTsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFRaSUMgaGFyZHdhcmUgYW5kIGRpc2FibGVzIGFsbCB0aGUKICAqIGludGVycnVwdHMuIEl0IHJlZ2lzdGVycyB0aGUgaW50ZXJydXB0IGVuYWJsZSBhbmQgZGlzYWJsZSBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL0tjb25maWcKaW5kZXggY2U2NTkwMS4uYmNhNDkxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL0tjb25maWcKQEAgLTE1LDEwICsxNSwxNiBAQAogCiBjb25maWcgSEFTX01UVQogCWJvb2wKLQlzZWxlY3QgSEFWRV9TQ0hFRF9DTE9DSwogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE11bHRpIFRpbWVyIFVuaXQuIE1UVSBwcm92aWRlcyBhY2Nlc3MKIAkgIHRvIG11bHRpcGxlIGludGVycnVwdCBnZW5lcmF0aW5nIHByb2dyYW1tYWJsZQogCSAgMzItYml0IGZyZWUgcnVubmluZyBkZWNyZW1lbnRpbmcgY291bnRlcnMuCiAKK2NvbmZpZyBOT01BRElLX01UVV9TQ0hFRF9DTE9DSworCWJvb2wKKwlkZXBlbmRzIG9uIEhBU19NVFUKKwlzZWxlY3QgSEFWRV9TQ0hFRF9DTE9DSworCWhlbHAKKwkgIFVzZSB0aGUgTXVsdGkgVGltZXIgVW5pdCBhcyB0aGUgc2NoZWRfY2xvY2suCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8tbm9tYWRpay5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLW5vbWFkaWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA1YmYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLW5vbWFkaWsuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogU3RydWN0dXJlcyBhbmQgcmVnaXN0ZXJzIGZvciBHUElPIGFjY2VzcyBpbiB0aGUgTm9tYWRpayBTb0MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU1RNaWNyb2VsZWN0cm9uaWNzCisgKiAgICAgQXV0aG9yOiBQcmFmdWxsYSBXQURBU0tBUiA8cHJhZnVsbGEud2FkYXNrYXJAc3QuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFsZXNzYW5kcm8gUnViaW5pIDxydWJpbmlAdW5pcHYuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9OT01BRElLX0dQSU8KKyNkZWZpbmUgX19QTEFUX05PTUFESUtfR1BJTworCisvKgorICogIm5ta19ncGlvIiBhbmQgIk5NS19HUElPIiBzdGFuZCBmb3IgIk5vbWFkaWsgR1BJTyIsIGxlYXZpbmcKKyAqIHRoZSAiZ3BpbyIgbmFtZXNwYWNlIGZvciBnZW5lcmljIGFuZCBjcm9zcy1tYWNoaW5lIGZ1bmN0aW9ucworICovCisKKy8qIFJlZ2lzdGVyIGluIHRoZSBsb2dpYyBibG9jayAqLworI2RlZmluZSBOTUtfR1BJT19EQVQJMHgwMAorI2RlZmluZSBOTUtfR1BJT19EQVRTCTB4MDQKKyNkZWZpbmUgTk1LX0dQSU9fREFUQwkweDA4CisjZGVmaW5lIE5NS19HUElPX1BESVMJMHgwYworI2RlZmluZSBOTUtfR1BJT19ESVIJMHgxMAorI2RlZmluZSBOTUtfR1BJT19ESVJTCTB4MTQKKyNkZWZpbmUgTk1LX0dQSU9fRElSQwkweDE4CisjZGVmaW5lIE5NS19HUElPX1NMUEMJMHgxYworI2RlZmluZSBOTUtfR1BJT19BRlNMQQkweDIwCisjZGVmaW5lIE5NS19HUElPX0FGU0xCCTB4MjQKKworI2RlZmluZSBOTUtfR1BJT19SSU1TQwkweDQwCisjZGVmaW5lIE5NS19HUElPX0ZJTVNDCTB4NDQKKyNkZWZpbmUgTk1LX0dQSU9fSVMJMHg0OAorI2RlZmluZSBOTUtfR1BJT19JQwkweDRjCisjZGVmaW5lIE5NS19HUElPX1JXSU1TQwkweDUwCisjZGVmaW5lIE5NS19HUElPX0ZXSU1TQwkweDU0CisjZGVmaW5lIE5NS19HUElPX1dLUwkweDU4CisKKy8qIEFsdGVybmF0ZSBmdW5jdGlvbnM6IGZ1bmN0aW9uIEMgaXMgc2V0IGluIGh3IGJ5IHNldHRpbmcgYm90aCBBIGFuZCBCICovCisjZGVmaW5lIE5NS19HUElPX0FMVF9HUElPCTAKKyNkZWZpbmUgTk1LX0dQSU9fQUxUX0EJMQorI2RlZmluZSBOTUtfR1BJT19BTFRfQgkyCisjZGVmaW5lIE5NS19HUElPX0FMVF9DCShOTUtfR1BJT19BTFRfQSB8IE5NS19HUElPX0FMVF9CKQorCisvKiBQdWxsIHVwL2Rvd24gdmFsdWVzICovCitlbnVtIG5ta19ncGlvX3B1bGwgeworCU5NS19HUElPX1BVTExfTk9ORSwKKwlOTUtfR1BJT19QVUxMX1VQLAorCU5NS19HUElPX1BVTExfRE9XTiwKK307CisKKy8qIFNsZWVwIG1vZGUgKi8KK2VudW0gbm1rX2dwaW9fc2xwbSB7CisJTk1LX0dQSU9fU0xQTV9JTlBVVCwKKwlOTUtfR1BJT19TTFBNX1dBS0VVUF9FTkFCTEUgPSBOTUtfR1BJT19TTFBNX0lOUFVULAorCU5NS19HUElPX1NMUE1fTk9DSEFOR0UsCisJTk1LX0dQSU9fU0xQTV9XQUtFVVBfRElTQUJMRSA9IE5NS19HUElPX1NMUE1fTk9DSEFOR0UsCit9OworCitleHRlcm4gaW50IG5ta19ncGlvX3NldF9zbHBtKGludCBncGlvLCBlbnVtIG5ta19ncGlvX3NscG0gbW9kZSk7CitleHRlcm4gaW50IG5ta19ncGlvX3NldF9wdWxsKGludCBncGlvLCBlbnVtIG5ta19ncGlvX3B1bGwgcHVsbCk7CitleHRlcm4gaW50IG5ta19ncGlvX3NldF9tb2RlKGludCBncGlvLCBpbnQgZ3Bpb19tb2RlKTsKK2V4dGVybiBpbnQgbm1rX2dwaW9fZ2V0X21vZGUoaW50IGdwaW8pOworCitleHRlcm4gdm9pZCBubWtfZ3Bpb193YWtldXBzX3N1c3BlbmQodm9pZCk7CitleHRlcm4gdm9pZCBubWtfZ3Bpb193YWtldXBzX3Jlc3VtZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgbm1rX2dwaW9fY2xvY2tzX2VuYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIG5ta19ncGlvX2Nsb2Nrc19kaXNhYmxlKHZvaWQpOworCitleHRlcm4gdm9pZCBubWtfZ3Bpb19yZWFkX3B1bGwoaW50IGdwaW9fYmFuaywgdTMyICpwdWxsX3VwKTsKKworLyoKKyAqIFBsYXRmb3JtIGRhdGEgdG8gcmVnaXN0ZXIgYSBibG9jazogb25seSB0aGUgaW5pdGlhbCBncGlvL2lycSBudW1iZXIuCisgKi8KK3N0cnVjdCBubWtfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKKwljaGFyICpuYW1lOworCWludCBmaXJzdF9ncGlvOworCWludCBmaXJzdF9pcnE7CisJaW50IG51bV9ncGlvOworCXUzMiAoKmdldF9zZWNvbmRhcnlfc3RhdHVzKSh1bnNpZ25lZCBpbnQgYmFuayk7CisJdm9pZCAoKnNldF9pb2ZvcmNlKShib29sIGVuYWJsZSk7CisJYm9vbCBzdXBwb3J0c19zbGVlcG1vZGU7Cit9OworCisjZW5kaWYgLyogX19QTEFUX05PTUFESUtfR1BJTyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkN2U2NS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBTdHJ1Y3R1cmVzIGFuZCByZWdpc3RlcnMgZm9yIEdQSU8gYWNjZXNzIGluIHRoZSBOb21hZGlrIFNvQwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MKLSAqICAgICBBdXRob3I6IFByYWZ1bGxhIFdBREFTS0FSIDxwcmFmdWxsYS53YWRhc2thckBzdC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQWxlc3NhbmRybyBSdWJpbmkgPHJ1YmluaUB1bmlwdi5pdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaWZuZGVmIF9fQVNNX1BMQVRfR1BJT19ICi0jZGVmaW5lIF9fQVNNX1BMQVRfR1BJT19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLS8qCi0gKiBUaGVzZSBjdXJyZW50bHkgY2F1c2UgYSBmdW5jdGlvbiBjYWxsIHRvIGhhcHBlbiwgdGhleSBtYXkgYmUgb3B0aW1pemVkCi0gKiBpZiBuZWVkZWQgYnkgYWRkaW5nIGNwdS1zcGVjaWZpYyBkZWZpbmVzIHRvIGlkZW50aWZ5IGJsb2NrcwotICogKHNlZSBtYWNoLXB4YS9pbmNsdWRlL21hY2gvZ3Bpby5oIGFzIGFuIGV4YW1wbGUgdXNpbmcgR1BMUiBldGMpCi0gKi8KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUgIF9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUgIF9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcCAgIF9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycSAgICAgX19ncGlvX3RvX2lycQotCi0vKgotICogIm5ta19ncGlvIiBhbmQgIk5NS19HUElPIiBzdGFuZCBmb3IgIk5vbWFkaWsgR1BJTyIsIGxlYXZpbmcKLSAqIHRoZSAiZ3BpbyIgbmFtZXNwYWNlIGZvciBnZW5lcmljIGFuZCBjcm9zcy1tYWNoaW5lIGZ1bmN0aW9ucwotICovCi0KLS8qIFJlZ2lzdGVyIGluIHRoZSBsb2dpYyBibG9jayAqLwotI2RlZmluZSBOTUtfR1BJT19EQVQJMHgwMAotI2RlZmluZSBOTUtfR1BJT19EQVRTCTB4MDQKLSNkZWZpbmUgTk1LX0dQSU9fREFUQwkweDA4Ci0jZGVmaW5lIE5NS19HUElPX1BESVMJMHgwYwotI2RlZmluZSBOTUtfR1BJT19ESVIJMHgxMAotI2RlZmluZSBOTUtfR1BJT19ESVJTCTB4MTQKLSNkZWZpbmUgTk1LX0dQSU9fRElSQwkweDE4Ci0jZGVmaW5lIE5NS19HUElPX1NMUEMJMHgxYwotI2RlZmluZSBOTUtfR1BJT19BRlNMQQkweDIwCi0jZGVmaW5lIE5NS19HUElPX0FGU0xCCTB4MjQKLQotI2RlZmluZSBOTUtfR1BJT19SSU1TQwkweDQwCi0jZGVmaW5lIE5NS19HUElPX0ZJTVNDCTB4NDQKLSNkZWZpbmUgTk1LX0dQSU9fSVMJMHg0OAotI2RlZmluZSBOTUtfR1BJT19JQwkweDRjCi0jZGVmaW5lIE5NS19HUElPX1JXSU1TQwkweDUwCi0jZGVmaW5lIE5NS19HUElPX0ZXSU1TQwkweDU0Ci0jZGVmaW5lIE5NS19HUElPX1dLUwkweDU4Ci0KLS8qIEFsdGVybmF0ZSBmdW5jdGlvbnM6IGZ1bmN0aW9uIEMgaXMgc2V0IGluIGh3IGJ5IHNldHRpbmcgYm90aCBBIGFuZCBCICovCi0jZGVmaW5lIE5NS19HUElPX0FMVF9HUElPCTAKLSNkZWZpbmUgTk1LX0dQSU9fQUxUX0EJMQotI2RlZmluZSBOTUtfR1BJT19BTFRfQgkyCi0jZGVmaW5lIE5NS19HUElPX0FMVF9DCShOTUtfR1BJT19BTFRfQSB8IE5NS19HUElPX0FMVF9CKQotCi0vKiBQdWxsIHVwL2Rvd24gdmFsdWVzICovCi1lbnVtIG5ta19ncGlvX3B1bGwgewotCU5NS19HUElPX1BVTExfTk9ORSwKLQlOTUtfR1BJT19QVUxMX1VQLAotCU5NS19HUElPX1BVTExfRE9XTiwKLX07Ci0KLS8qIFNsZWVwIG1vZGUgKi8KLWVudW0gbm1rX2dwaW9fc2xwbSB7Ci0JTk1LX0dQSU9fU0xQTV9JTlBVVCwKLQlOTUtfR1BJT19TTFBNX1dBS0VVUF9FTkFCTEUgPSBOTUtfR1BJT19TTFBNX0lOUFVULAotCU5NS19HUElPX1NMUE1fTk9DSEFOR0UsCi0JTk1LX0dQSU9fU0xQTV9XQUtFVVBfRElTQUJMRSA9IE5NS19HUElPX1NMUE1fTk9DSEFOR0UsCi19OwotCi1leHRlcm4gaW50IG5ta19ncGlvX3NldF9zbHBtKGludCBncGlvLCBlbnVtIG5ta19ncGlvX3NscG0gbW9kZSk7Ci1leHRlcm4gaW50IG5ta19ncGlvX3NldF9wdWxsKGludCBncGlvLCBlbnVtIG5ta19ncGlvX3B1bGwgcHVsbCk7Ci1leHRlcm4gaW50IG5ta19ncGlvX3NldF9tb2RlKGludCBncGlvLCBpbnQgZ3Bpb19tb2RlKTsKLWV4dGVybiBpbnQgbm1rX2dwaW9fZ2V0X21vZGUoaW50IGdwaW8pOwotCi1leHRlcm4gdm9pZCBubWtfZ3Bpb193YWtldXBzX3N1c3BlbmQodm9pZCk7Ci1leHRlcm4gdm9pZCBubWtfZ3Bpb193YWtldXBzX3Jlc3VtZSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgbm1rX2dwaW9fcmVhZF9wdWxsKGludCBncGlvX2JhbmssIHUzMiAqcHVsbF91cCk7Ci0KLS8qCi0gKiBQbGF0Zm9ybSBkYXRhIHRvIHJlZ2lzdGVyIGEgYmxvY2s6IG9ubHkgdGhlIGluaXRpYWwgZ3Bpby9pcnEgbnVtYmVyLgotICovCi1zdHJ1Y3Qgbm1rX2dwaW9fcGxhdGZvcm1fZGF0YSB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgZmlyc3RfZ3BpbzsKLQlpbnQgZmlyc3RfaXJxOwotCWludCBudW1fZ3BpbzsKLQl1MzIgKCpnZXRfc2Vjb25kYXJ5X3N0YXR1cykodW5zaWduZWQgaW50IGJhbmspOwotCXZvaWQgKCpzZXRfaW9mb3JjZSkoYm9vbCBlbmFibGUpOwotCWJvb2wgc3VwcG9ydHNfc2xlZXBtb2RlOwotfTsKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L210dS5oIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9tdHUuaAppbmRleCA2NTcwNGEzLi42NTA4ZTc2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L210dS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvbXR1LmgKQEAgLTEsNTQgKzEsMTEgQEAKICNpZm5kZWYgX19QTEFUX01UVV9ICiAjZGVmaW5lIF9fUExBVF9NVFVfSAogCi0vKgotICogR3VhcmFudGVlZCBydW50aW1lIGNvbnZlcnNpb24gcmFuZ2UgaW4gc2Vjb25kcyBmb3IKLSAqIHRoZSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudC4KLSAqLwotI2RlZmluZSBNVFVfTUlOX1JBTkdFIDQKLQogLyogc2hvdWxkIGJlIHNldCBieSB0aGUgcGxhdGZvcm0gY29kZSAqLwogZXh0ZXJuIHZvaWQgX19pb21lbSAqbXR1X2Jhc2U7CiAKLS8qCi0gKiBUaGUgTVRVIGRldmljZSBob3N0cyBmb3VyIGRpZmZlcmVudCBjb3VudGVycywgd2l0aCA0IHNldCBvZgotICogcmVnaXN0ZXJzLiBUaGVzZSBhcmUgcmVnaXN0ZXIgbmFtZXMuCi0gKi8KLQotI2RlZmluZSBNVFVfSU1TQwkweDAwCS8qIEludGVycnVwdCBtYXNrIHNldC9jbGVhciAqLwotI2RlZmluZSBNVFVfUklTCQkweDA0CS8qIFJhdyBpbnRlcnJ1cHQgc3RhdHVzICovCi0jZGVmaW5lIE1UVV9NSVMJCTB4MDgJLyogTWFza2VkIGludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUgTVRVX0lDUgkJMHgwQwkvKiBJbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIgKi8KLQotLyogcGVyLXRpbWVyIHJlZ2lzdGVycyB0YWtlIDAuLjMgYXMgYXJndW1lbnQgKi8KLSNkZWZpbmUgTVRVX0xSKHgpCSgweDEwICsgMHgxMCAqICh4KSArIDB4MDApCS8qIExvYWQgdmFsdWUgKi8KLSNkZWZpbmUgTVRVX1ZBTCh4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDA0KQkvKiBDdXJyZW50IHZhbHVlICovCi0jZGVmaW5lIE1UVV9DUih4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDA4KQkvKiBDb250cm9sIHJlZyAqLwotI2RlZmluZSBNVFVfQkdMUih4KQkoMHgxMCArIDB4MTAgKiAoeCkgKyAweDBjKQkvKiBBdCBuZXh0IG92ZXJmbG93ICovCi0KLS8qIGJpdHMgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1UVV9DUm5fRU5BCQkweDgwCi0jZGVmaW5lIE1UVV9DUm5fUEVSSU9ESUMJMHg0MAkvKiBpZiAwID0gZnJlZS1ydW5uaW5nICovCi0jZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfTUFTSwkweDBjCi0jZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfMQkJMHgwMAotI2RlZmluZSBNVFVfQ1JuX1BSRVNDQUxFXzE2CQkweDA0Ci0jZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfMjU2CQkweDA4Ci0jZGVmaW5lIE1UVV9DUm5fMzJCSVRTCQkweDAyCi0jZGVmaW5lIE1UVV9DUm5fT05FU0hPVAkJMHgwMQkvKiBpZiAwID0gd3JhcHMgcmVsb2FkaW5nIGZyb20gQkdMUiovCi0KLS8qIE90aGVyIHJlZ2lzdGVycyBhcmUgdXN1YWwgYW1iYS9wcmltZWNlbGwgcmVnaXN0ZXJzLCBjdXJyZW50bHkgbm90IHVzZWQgKi8KLSNkZWZpbmUgTVRVX0lUQ1IJMHhmZjAKLSNkZWZpbmUgTVRVX0lUT1AJMHhmZjQKLQotI2RlZmluZSBNVFVfUEVSSVBIX0lEMAkweGZlMAotI2RlZmluZSBNVFVfUEVSSVBIX0lEMQkweGZlNAotI2RlZmluZSBNVFVfUEVSSVBIX0lEMgkweGZlOAotI2RlZmluZSBNVFVfUEVSSVBIX0lEMwkweGZlQwotCi0jZGVmaW5lIE1UVV9QQ0VMTDAJMHhmZjAKLSNkZWZpbmUgTVRVX1BDRUxMMQkweGZmNAotI2RlZmluZSBNVFVfUENFTEwyCTB4ZmY4Ci0jZGVmaW5lIE1UVV9QQ0VMTDMJMHhmZkMKK3ZvaWQgbm1ka19jbGtldnRfcmVzZXQodm9pZCk7Cit2b2lkIG5tZGtfY2xrc3JjX3Jlc2V0KHZvaWQpOwogCiAjZW5kaWYgLyogX19QTEFUX01UVV9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvcGluY2ZnLmggYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvaW5jbHVkZS9wbGF0L3BpbmNmZy5oCmluZGV4IDA1YTM5MzYuLjIyY2I5N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbm9tYWRpay9pbmNsdWRlL3BsYXQvcGluY2ZnLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL2luY2x1ZGUvcGxhdC9waW5jZmcuaApAQCAtMzcsNyArMzcsNiBAQAogICoJCSAgICAgU0xQTSB2YWx1ZSA9IHNhbWUgYXMgbm9ybWFsCiAgKgogICogUElOX0NGRwkgICAtIGRlZmF1bHQgY29uZmlnIHdpdGggYWx0ZXJuYXRlIGZ1bmN0aW9uCi0gKiBQSU5fQ0ZHX1BVTEwJICAgLSBkZWZhdWx0IGNvbmZpZyB3aXRoIGFsdGVybmF0ZSBmdW5jdGlvbiBhbmQgcHVsbCB1cC9kb3duCiAgKi8KIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHBpbl9jZmdfdDsKQEAgLTEzMywxMCArMTMyLDYgQEAKIAkoUElOX0NGR19ERUZBVUxUIHxcCiAJIChQSU5fTlVNKG51bSkgfCBQSU5fIyNhbHQgfCBQSU5fT1VUUFVUXyMjdmFsKSkKIAotI2RlZmluZSBQSU5fQ0ZHX1BVTEwobnVtLCBhbHQsIHB1bGwpCVwKLQkoKFBJTl9DRkdfREVGQVVMVCAmIH5QSU5fUFVMTF9NQVNLKSB8XAotCSAoUElOX05VTShudW0pIHwgUElOXyMjYWx0IHwgUElOX1BVTExfIyNwdWxsKSkKLQogZXh0ZXJuIGludCBubWtfY29uZmlnX3BpbihwaW5fY2ZnX3QgY2ZnLCBib29sIHNsZWVwKTsKIGV4dGVybiBpbnQgbm1rX2NvbmZpZ19waW5zKHBpbl9jZmdfdCAqY2ZncywgaW50IG51bSk7CiBleHRlcm4gaW50IG5ta19jb25maWdfcGluc19zbGVlcChwaW5fY2ZnX3QgKmNmZ3MsIGludCBudW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL3RpbWVyLmMgYi9hcmNoL2FybS9wbGF0LW5vbWFkaWsvdGltZXIuYwppbmRleCBlZjc0ZTE1Ny4uMzBiNjQzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1ub21hZGlrL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1ub21hZGlrL3RpbWVyLmMKQEAgLTIxLDEwICsyMSw1OSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vc2NoZWRfY2xvY2suaD4KIAotI2luY2x1ZGUgPHBsYXQvbXR1Lmg+CisvKgorICogR3VhcmFudGVlZCBydW50aW1lIGNvbnZlcnNpb24gcmFuZ2UgaW4gc2Vjb25kcyBmb3IKKyAqIHRoZSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudC4KKyAqLworI2RlZmluZSBNVFVfTUlOX1JBTkdFIDQKKworLyoKKyAqIFRoZSBNVFUgZGV2aWNlIGhvc3RzIGZvdXIgZGlmZmVyZW50IGNvdW50ZXJzLCB3aXRoIDQgc2V0IG9mCisgKiByZWdpc3RlcnMuIFRoZXNlIGFyZSByZWdpc3RlciBuYW1lcy4KKyAqLworCisjZGVmaW5lIE1UVV9JTVNDCTB4MDAJLyogSW50ZXJydXB0IG1hc2sgc2V0L2NsZWFyICovCisjZGVmaW5lIE1UVV9SSVMJCTB4MDQJLyogUmF3IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgTVRVX01JUwkJMHgwOAkvKiBNYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBNVFVfSUNSCQkweDBDCS8qIEludGVycnVwdCBjbGVhciByZWdpc3RlciAqLworCisvKiBwZXItdGltZXIgcmVnaXN0ZXJzIHRha2UgMC4uMyBhcyBhcmd1bWVudCAqLworI2RlZmluZSBNVFVfTFIoeCkJKDB4MTAgKyAweDEwICogKHgpICsgMHgwMCkJLyogTG9hZCB2YWx1ZSAqLworI2RlZmluZSBNVFVfVkFMKHgpCSgweDEwICsgMHgxMCAqICh4KSArIDB4MDQpCS8qIEN1cnJlbnQgdmFsdWUgKi8KKyNkZWZpbmUgTVRVX0NSKHgpCSgweDEwICsgMHgxMCAqICh4KSArIDB4MDgpCS8qIENvbnRyb2wgcmVnICovCisjZGVmaW5lIE1UVV9CR0xSKHgpCSgweDEwICsgMHgxMCAqICh4KSArIDB4MGMpCS8qIEF0IG5leHQgb3ZlcmZsb3cgKi8KKworLyogYml0cyBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRVX0NSbl9FTkEJCTB4ODAKKyNkZWZpbmUgTVRVX0NSbl9QRVJJT0RJQwkweDQwCS8qIGlmIDAgPSBmcmVlLXJ1bm5pbmcgKi8KKyNkZWZpbmUgTVRVX0NSbl9QUkVTQ0FMRV9NQVNLCTB4MGMKKyNkZWZpbmUgTVRVX0NSbl9QUkVTQ0FMRV8xCQkweDAwCisjZGVmaW5lIE1UVV9DUm5fUFJFU0NBTEVfMTYJCTB4MDQKKyNkZWZpbmUgTVRVX0NSbl9QUkVTQ0FMRV8yNTYJCTB4MDgKKyNkZWZpbmUgTVRVX0NSbl8zMkJJVFMJCTB4MDIKKyNkZWZpbmUgTVRVX0NSbl9PTkVTSE9UCQkweDAxCS8qIGlmIDAgPSB3cmFwcyByZWxvYWRpbmcgZnJvbSBCR0xSKi8KKworLyogT3RoZXIgcmVnaXN0ZXJzIGFyZSB1c3VhbCBhbWJhL3ByaW1lY2VsbCByZWdpc3RlcnMsIGN1cnJlbnRseSBub3QgdXNlZCAqLworI2RlZmluZSBNVFVfSVRDUgkweGZmMAorI2RlZmluZSBNVFVfSVRPUAkweGZmNAorCisjZGVmaW5lIE1UVV9QRVJJUEhfSUQwCTB4ZmUwCisjZGVmaW5lIE1UVV9QRVJJUEhfSUQxCTB4ZmU0CisjZGVmaW5lIE1UVV9QRVJJUEhfSUQyCTB4ZmU4CisjZGVmaW5lIE1UVV9QRVJJUEhfSUQzCTB4ZmVDCisKKyNkZWZpbmUgTVRVX1BDRUxMMAkweGZmMAorI2RlZmluZSBNVFVfUENFTEwxCTB4ZmY0CisjZGVmaW5lIE1UVV9QQ0VMTDIJMHhmZjgKKyNkZWZpbmUgTVRVX1BDRUxMMwkweGZmQworCitzdGF0aWMgYm9vbCBjbGtldnRfcGVyaW9kaWM7CitzdGF0aWMgdTMyIGNsa19wcmVzY2FsZTsKK3N0YXRpYyB1MzIgbm1ka19jeWNsZTsJCS8qIHdyaXRlLW9uY2UgKi8KIAogdm9pZCBfX2lvbWVtICptdHVfYmFzZTsgLyogQXNzaWduZWQgYnkgbWFjaGluZSBjb2RlICovCiAKKyNpZmRlZiBDT05GSUdfTk9NQURJS19NVFVfU0NIRURfQ0xPQ0sKIC8qCiAgKiBPdmVycmlkZSB0aGUgZ2xvYmFsIHdlYWsgc2NoZWRfY2xvY2sgc3ltYm9sIHdpdGggdGhpcwogICogbG9jYWwgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyB0aGUgY2xvY2tzb3VyY2UgdG8gZ2V0IHNvbWUKQEAgLTQ4LDMyICs5Nyw1NiBAQAogCXUzMiBjeWMgPSAtcmVhZGwobXR1X2Jhc2UgKyBNVFVfVkFMKDApKTsKIAl1cGRhdGVfc2NoZWRfY2xvY2soJmNkLCBjeWMsICh1MzIpfjApOwogfQorI2VuZGlmCiAKIC8qIENsb2NrZXZlbnQgZGV2aWNlOiB1c2Ugb25lLXNob3QgbW9kZSAqLworc3RhdGljIGludCBubWRrX2Nsa2V2dF9uZXh0KHVuc2lnbmVkIGxvbmcgZXZ0LCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldikKK3sKKwl3cml0ZWwoMSA8PCAxLCBtdHVfYmFzZSArIE1UVV9JTVNDKTsKKwl3cml0ZWwoZXZ0LCBtdHVfYmFzZSArIE1UVV9MUigxKSk7CisJLyogTG9hZCBoaWdoZXN0IHZhbHVlLCBlbmFibGUgZGV2aWNlLCBlbmFibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbChNVFVfQ1JuX09ORVNIT1QgfCBjbGtfcHJlc2NhbGUgfAorCSAgICAgICBNVFVfQ1JuXzMyQklUUyB8IE1UVV9DUm5fRU5BLAorCSAgICAgICBtdHVfYmFzZSArIE1UVV9DUigxKSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBubWRrX2Nsa2V2dF9yZXNldCh2b2lkKQoreworCWlmIChjbGtldnRfcGVyaW9kaWMpIHsKKworCQkvKiBUaW1lcjogY29uZmlndXJlIGxvYWQgYW5kIGJhY2tncm91bmQtbG9hZCwgYW5kIGZpcmUgaXQgdXAgKi8KKwkJd3JpdGVsKG5tZGtfY3ljbGUsIG10dV9iYXNlICsgTVRVX0xSKDEpKTsKKwkJd3JpdGVsKG5tZGtfY3ljbGUsIG10dV9iYXNlICsgTVRVX0JHTFIoMSkpOworCisJCXdyaXRlbChNVFVfQ1JuX1BFUklPRElDIHwgY2xrX3ByZXNjYWxlIHwKKwkJICAgICAgIE1UVV9DUm5fMzJCSVRTIHwgTVRVX0NSbl9FTkEsCisJCSAgICAgICBtdHVfYmFzZSArIE1UVV9DUigxKSk7CisJCXdyaXRlbCgxIDw8IDEsIG10dV9iYXNlICsgTVRVX0lNU0MpOworCX0gZWxzZSB7CisJCS8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byBzdGFydCB0aGUgY2xvY2tldmVudCBhZ2FpbiAqLworCQkodm9pZCkgbm1ka19jbGtldnRfbmV4dChubWRrX2N5Y2xlLCBOVUxMKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIG5tZGtfY2xrZXZ0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJCQkgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKIHsKLQl1MzIgY3I7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgotCQlwcl9lcnIoIiVzOiBwZXJpb2RpYyBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKKwkJY2xrZXZ0X3BlcmlvZGljID0gdHJ1ZTsKKwkJbm1ka19jbGtldnRfcmVzZXQoKTsKIAkJYnJlYWs7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQkvKiBMb2FkIGhpZ2hlc3QgdmFsdWUsIGVuYWJsZSBkZXZpY2UsIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JCWNyID0gcmVhZGwobXR1X2Jhc2UgKyBNVFVfQ1IoMSkpOwotCQl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfTFIoMSkpOwotCQl3cml0ZWwoY3IgfCBNVFVfQ1JuX0VOQSwgbXR1X2Jhc2UgKyBNVFVfQ1IoMSkpOwotCQl3cml0ZWwoMSA8PCAxLCBtdHVfYmFzZSArIE1UVV9JTVNDKTsKKwkJY2xrZXZ0X3BlcmlvZGljID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6Ci0JCS8qIGRpc2FibGUgaXJxICovCiAJCXdyaXRlbCgwLCBtdHVfYmFzZSArIE1UVV9JTVNDKTsKIAkJLyogZGlzYWJsZSB0aW1lciAqLwotCQljciA9IHJlYWRsKG10dV9iYXNlICsgTVRVX0NSKDEpKTsKLQkJY3IgJj0gfk1UVV9DUm5fRU5BOwotCQl3cml0ZWwoY3IsIG10dV9iYXNlICsgTVRVX0NSKDEpKTsKKwkJd3JpdGVsKDAsIG10dV9iYXNlICsgTVRVX0NSKDEpKTsKIAkJLyogbG9hZCBzb21lIGhpZ2ggZGVmYXVsdCB2YWx1ZSAqLwogCQl3cml0ZWwoMHhmZmZmZmZmZiwgbXR1X2Jhc2UgKyBNVFVfTFIoMSkpOwogCQlicmVhazsKQEAgLTgyLDE2ICsxNTUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBubWRrX2Nsa2V2dF9uZXh0KHVuc2lnbmVkIGxvbmcgZXZ0LCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldikKLXsKLQkvKiB3cml0aW5nIHRoZSB2YWx1ZSBoYXMgaW1tZWRpYXRlIGVmZmVjdCAqLwotCXdyaXRlbChldnQsIG10dV9iYXNlICsgTVRVX0xSKDEpKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2Ugbm1ka19jbGtldnQgPSB7CiAJLm5hbWUJCT0gIm10dV8xIiwKLQkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QgfCBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQywKIAkucmF0aW5nCQk9IDIwMCwKIAkuc2V0X21vZGUJPSBubWRrX2Nsa2V2dF9tb2RlLAogCS5zZXRfbmV4dF9ldmVudAk9IG5tZGtfY2xrZXZ0X25leHQsCkBAIC0xMTYsMTEgKzE4MiwyMyBAQAogCS5kZXZfaWQJCT0gJm5tZGtfY2xrZXZ0LAogfTsKIAordm9pZCBubWRrX2Nsa3NyY19yZXNldCh2b2lkKQoreworCS8qIERpc2FibGUgKi8KKwl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfQ1IoMCkpOworCisJLyogQ2xvY2tTb3VyY2U6IGNvbmZpZ3VyZSBsb2FkIGFuZCBiYWNrZ3JvdW5kLWxvYWQsIGFuZCBmaXJlIGl0IHVwICovCisJd3JpdGVsKG5tZGtfY3ljbGUsIG10dV9iYXNlICsgTVRVX0xSKDApKTsKKwl3cml0ZWwobm1ka19jeWNsZSwgbXR1X2Jhc2UgKyBNVFVfQkdMUigwKSk7CisKKwl3cml0ZWwoY2xrX3ByZXNjYWxlIHwgTVRVX0NSbl8zMkJJVFMgfCBNVFVfQ1JuX0VOQSwKKwkgICAgICAgbXR1X2Jhc2UgKyBNVFVfQ1IoMCkpOworfQorCiB2b2lkIF9faW5pdCBubWRrX3RpbWVyX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAJc3RydWN0IGNsayAqY2xrMDsKLQl1MzIgY3IgPSBNVFVfQ1JuXzMyQklUUzsKIAogCWNsazAgPSBjbGtfZ2V0X3N5cygibXR1MCIsIE5VTEwpOwogCUJVR19PTihJU19FUlIoY2xrMCkpOwpAQCAtMTM4LDMwICsyMTYsMjggQEAKIAlyYXRlID0gY2xrX2dldF9yYXRlKGNsazApOwogCWlmIChyYXRlID4gMzIwMDAwMDApIHsKIAkJcmF0ZSAvPSAxNjsKLQkJY3IgfD0gTVRVX0NSbl9QUkVTQ0FMRV8xNjsKKwkJY2xrX3ByZXNjYWxlID0gTVRVX0NSbl9QUkVTQ0FMRV8xNjsKIAl9IGVsc2UgewotCQljciB8PSBNVFVfQ1JuX1BSRVNDQUxFXzE7CisJCWNsa19wcmVzY2FsZSA9IE1UVV9DUm5fUFJFU0NBTEVfMTsKIAl9CiAKKwlubWRrX2N5Y2xlID0gKHJhdGUgKyBIWi8yKSAvIEhaOworCisKIAkvKiBUaW1lciAwIGlzIHRoZSBmcmVlIHJ1bm5pbmcgY2xvY2tzb3VyY2UgKi8KLQl3cml0ZWwoY3IsIG10dV9iYXNlICsgTVRVX0NSKDApKTsKLQl3cml0ZWwoMCwgbXR1X2Jhc2UgKyBNVFVfTFIoMCkpOwotCXdyaXRlbCgwLCBtdHVfYmFzZSArIE1UVV9CR0xSKDApKTsKLQl3cml0ZWwoY3IgfCBNVFVfQ1JuX0VOQSwgbXR1X2Jhc2UgKyBNVFVfQ1IoMCkpOworCW5tZGtfY2xrc3JjX3Jlc2V0KCk7CiAKIAlpZiAoY2xvY2tzb3VyY2VfbW1pb19pbml0KG10dV9iYXNlICsgTVRVX1ZBTCgwKSwgIm10dV8wIiwKIAkJCXJhdGUsIDIwMCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfZG93bikpCiAJCXByX2VycigidGltZXI6IGZhaWxlZCB0byBpbml0aWFsaXplIGNsb2NrIHNvdXJjZSAlc1xuIiwKIAkJICAgICAgICJtdHVfMCIpOwotCisjaWZkZWYgQ09ORklHX05PTUFESUtfTVRVX1NDSEVEX0NMT0NLCiAJaW5pdF9zY2hlZF9jbG9jaygmY2QsIG5vbWFkaWtfdXBkYXRlX3NjaGVkX2Nsb2NrLCAzMiwgcmF0ZSk7Ci0KKyNlbmRpZgogCS8qIFRpbWVyIDEgaXMgdXNlZCBmb3IgZXZlbnRzICovCiAKIAljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoJm5tZGtfY2xrZXZ0LCByYXRlLCBNVFVfTUlOX1JBTkdFKTsKIAotCXdyaXRlbChjciB8IE1UVV9DUm5fT05FU0hPVCwgbXR1X2Jhc2UgKyBNVFVfQ1IoMSkpOyAvKiBvZmYsIGN1cnJlbnRseSAqLwotCiAJbm1ka19jbGtldnQubWF4X2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucygweGZmZmZmZmZmLCAmbm1ka19jbGtldnQpOwogCW5tZGtfY2xrZXZ0Lm1pbl9kZWx0YV9ucyA9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCmluZGV4IDViNjA1YTkuLmFhNTlmNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnCkBAIC0xNSw2ICsxNSw3IEBACiAJc2VsZWN0IENMS1NSQ19NTUlPCiAJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAlzZWxlY3QgSEFWRV9JREUKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICiAJaGVscAogCSAgIlN5c3RlbXMgYmFzZWQgb24gb21hcDd4eCwgb21hcDE1eHggb3Igb21hcDE2eHgiCiAKQEAgLTEzMywxOCArMTM0LDYgQEAKIAkgIFRoaXMgY2FuIGFsc28gYmUgY2hhbmdlZCBhdCBydW50aW1lICh2aWEgdGhlIG1ib3hfa2ZpZm9fc2l6ZQogCSAgbW9kdWxlIHBhcmFtZXRlcikuCiAKLWNvbmZpZyBPTUFQX0lPTU1VCi0JdHJpc3RhdGUKLQotY29uZmlnIE9NQVBfSU9NTVVfREVCVUcKLSAgICAgICB0cmlzdGF0ZSAiRXhwb3J0IE9NQVAgSU9NTVUgaW50ZXJuYWxzIGluIERlYnVnRlMiCi0gICAgICAgZGVwZW5kcyBvbiBPTUFQX0lPTU1VICYmIERFQlVHX0ZTCi0gICAgICAgaGVscAotICAgICAgICAgU2VsZWN0IHRoaXMgdG8gc2VlIGV4dGVuc2l2ZSBpbmZvcm1hdGlvbiBhYm91dAotICAgICAgICAgdGhlIGludGVybmFsIHN0YXRlIG9mIE9NQVAgSU9NTVUgaW4gZGVidWdmcy4KLQotICAgICAgICAgU2F5IE4gdW5sZXNzIHlvdSBrbm93IHlvdSBuZWVkIHRoaXMuCi0KIGNvbmZpZyBPTUFQX0lPTU1VX0lWQTIKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQppbmRleCBmMDIzM2U2Li45ODUyNjIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCkBAIC0xOCw4ICsxOCw2IEBACiBvYmotJChDT05GSUdfQVJDSF9PTUFQNCkgKz0gb21hcF9kZXZpY2UubwogCiBvYmotJChDT05GSUdfT01BUF9NQ0JTUCkgKz0gbWNic3Aubwotb2JqLSQoQ09ORklHX09NQVBfSU9NTVUpICs9IGlvbW11Lm8gaW92bW0ubwotb2JqLSQoQ09ORklHX09NQVBfSU9NTVVfREVCVUcpICs9IGlvbW11LWRlYnVnLm8KIAogb2JqLSQoQ09ORklHX0NQVV9GUkVRKSArPSBjcHUtb21hcC5vCiBvYmotJChDT05GSUdfT01BUF9ETV9USU1FUikgKz0gZG10aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IDNiYTRkMTEuLjU2N2U0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1kZXZpY2VzLmMKaW5kZXggOTIzYzk2Mi4uY2FhMWY3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWRldmljZXMuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctZGV2aWNlcy5jCkBAIC04LDcgKzgsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogCiAvKiBNYW55IE9NQVAgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHJldXNlIHRoZSBzYW1lICJkZWJ1ZyBib2FyZCI7IHRoZXNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctbGVkcy5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RlYnVnLWxlZHMuYwppbmRleCBmYzA1YjEwLi42MWExZWMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZGVidWctbGVkcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZWJ1Zy1sZWRzLmMKQEAgLTcsNyArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLQorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxwbGF0L2ZwZ2EuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogCiAvKiBNYW55IE9NQVAgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHJldXNlIHRoZSBzYW1lICJkZWJ1ZyBib2FyZCI7IHRoZXNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RldmljZXMuYwppbmRleCBlYTI4Zjk4Li4xOTcxOTMyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kZXZpY2VzLmMKQEAgLTgsNyArOCw3IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI0LDkxICsyNCw5IEBACiAjaW5jbHVkZSA8cGxhdC90Yy5oPgogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L21tYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbWVuZWxhdXMuaD4KLSNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwNDR4eC5oPgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUF9NQ0JTUCkgfHwgZGVmaW5lZChDT05GSUdfT01BUF9NQ0JTUF9NT0RVTEUpCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqb21hcF9tY2JzcF9kZXZpY2VzOwotCi12b2lkIG9tYXBfbWNic3BfcmVnaXN0ZXJfYm9hcmRfY2ZnKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzX2NvdW50LAotCQkJc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSAqY29uZmlnLCBpbnQgc2l6ZSkKLXsKLQlpbnQgaTsKLQotCW9tYXBfbWNic3BfZGV2aWNlcyA9IGt6YWxsb2Moc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvbWFwX21jYnNwX2RldmljZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgTWNCU1AgZGV2aWNlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm5ld19tY2JzcDsKLQkJaW50IHJldDsKLQotCQluZXdfbWNic3AgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIm9tYXAtbWNic3AiLCBpICsgMSk7Ci0JCWlmICghbmV3X21jYnNwKQotCQkJY29udGludWU7Ci0JCXBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKG5ld19tY2JzcCwgJnJlc1tpICogcmVzX2NvdW50XSwKLQkJCQkJcmVzX2NvdW50KTsKLQkJbmV3X21jYnNwLT5kZXYucGxhdGZvcm1fZGF0YSA9ICZjb25maWdbaV07Ci0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobmV3X21jYnNwKTsKLQkJaWYgKHJldCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChuZXdfbWNic3ApOwotCQkJY29udGludWU7Ci0JCX0KLQkJb21hcF9tY2JzcF9kZXZpY2VzW2ldID0gbmV3X21jYnNwOwotCX0KLX0KLQotI2Vsc2UKLXZvaWQgb21hcF9tY2JzcF9yZWdpc3Rlcl9ib2FyZF9jZmcoc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNfY291bnQsCi0JCQlzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhICpjb25maWcsIGludCBzaXplKQoteyAgfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfTUNQRE0pIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX01DUERNX01PRFVMRSkKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtY3BkbV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCQk9ICJtY3BkbV9tZW0iLAotCQkuc3RhcnQJCT0gT01BUDQ0WFhfTUNQRE1fQkFTRSwKLQkJLmVuZAkJPSBPTUFQNDRYWF9NQ1BETV9CQVNFICsgU1pfNEssCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIm1jcGRtX2lycSIsCi0JCS5zdGFydAkJPSBPTUFQNDRYWF9JUlFfTUNQRE0sCi0JCS5lbmQJCT0gT01BUDQ0WFhfSVJRX01DUERNLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9tYXBfbWNwZG1fZGV2aWNlID0gewotCS5uYW1lCQk9ICJvbWFwLW1jcGRtIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1jcGRtX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gbWNwZG1fcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHZvaWQgb21hcF9pbml0X21jcGRtKHZvaWQpCi17Ci0JKHZvaWQpIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb21hcF9tY3BkbV9kZXZpY2UpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfbWNwZG0odm9pZCkge30KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAjaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkgfHwgXAogCWRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IU19NT0RVTEUpCiAKQEAgLTI5MSw3ICsyMDksNiBAQAogCSAqIGluIGFscGhhYmV0aWNhbCBvcmRlciBzbyB0aGV5J3JlIGVhc2llciB0byBzb3J0IHRocm91Z2guCiAJICovCiAJb21hcF9pbml0X3JuZygpOwotCW9tYXBfaW5pdF9tY3BkbSgpOwogCW9tYXBfaW5pdF91d2lyZSgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKaW5kZXggNzVhODQ3ZC4uYWYzYjkyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCkBAIC0zLDYgKzMsMTIgQEAKICAqCiAgKiBPTUFQIER1YWwtTW9kZSBUaW1lcnMKICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKiBUYXJ1biBLYW50aSBEZWJCYXJtYSA8dGFydW4ua2FudGlAdGkuY29tPgorICogVGhhcmEgR29waW5hdGggPHRoYXJhQHRpLmNvbT4KKyAqCisgKiBkbXRpbWVyIGFkYXB0YXRpb24gdG8gcGxhdGZvcm1fZHJpdmVyLgorICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogICogT01BUDIgc3VwcG9ydCBieSBKdWhhIFlyam9sYQogICogQVBJIGltcHJvdmVtZW50cyBhbmQgT01BUDIgY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQgYnkgVGltbyBUZXJhcwpAQCAtMjksMTY4ICszNSw4MSBAQAogICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCiAjaW5jbHVkZSA8cGxhdC9kbXRpbWVyLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKLXN0YXRpYyBpbnQgZG1fdGltZXJfY291bnQ7CitzdGF0aWMgTElTVF9IRUFEKG9tYXBfdGltZXJfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRtX3RpbWVyX2xvY2spOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciBvbWFwMV9kbV90aW1lcnNbXSA9IHsKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIxNDAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIxYzAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjIgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIyNDAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjMgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIyYzAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjQgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIzNDAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjUgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmIzYzAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjYgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmI3NDAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjcgfSwKLQl7IC5waHlzX2Jhc2UgPSAweGZmZmJkNDAwLCAuaXJxID0gSU5UXzE2MTBfR1BUSU1FUjggfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgb21hcDFfZG1fdGltZXJfY291bnQgPSBBUlJBWV9TSVpFKG9tYXAxX2RtX3RpbWVycyk7Ci0KLSNlbHNlCi0jZGVmaW5lIG9tYXAxX2RtX3RpbWVycwkJCU5VTEwKLSNkZWZpbmUgb21hcDFfZG1fdGltZXJfY291bnQJCTAKLSNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMSAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDIKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciBvbWFwMl9kbV90aW1lcnNbXSA9IHsKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDI4MDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDJhMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjIgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDc4MDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjMgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDdhMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjQgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDdjMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjUgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDdlMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjYgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDgwMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjcgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDgyMDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjggfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDg0MDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjkgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDg2MDAwLCAuaXJxID0gSU5UXzI0WFhfR1BUSU1FUjEwIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4ODAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIxMSB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDgwOGEwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMTIgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpvbWFwMl9kbV9zb3VyY2VfbmFtZXNbXSBfX2luaXRkYXRhID0gewotCSJzeXNfY2siLAotCSJmdW5jXzMya19jayIsCi0JImFsdF9jayIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKm9tYXAyX2RtX3NvdXJjZV9jbG9ja3NbM107Ci1zdGF0aWMgY29uc3QgaW50IG9tYXAyX2RtX3RpbWVyX2NvdW50ID0gQVJSQVlfU0laRShvbWFwMl9kbV90aW1lcnMpOwotCi0jZWxzZQotI2RlZmluZSBvbWFwMl9kbV90aW1lcnMJCQlOVUxMCi0jZGVmaW5lIG9tYXAyX2RtX3RpbWVyX2NvdW50CQkwCi0jZGVmaW5lIG9tYXAyX2RtX3NvdXJjZV9uYW1lcwkJTlVMTAotI2RlZmluZSBvbWFwMl9kbV9zb3VyY2VfY2xvY2tzCQlOVUxMCi0jZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDIgKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCi1zdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgb21hcDNfZG1fdGltZXJzW10gPSB7Ci0JeyAucGh5c19iYXNlID0gMHg0ODMxODAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIxIH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzMjAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIyIH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzNDAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIzIH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzNjAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI0IH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzODAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI1IH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzQTAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI2IH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzQzAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI3IH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTAzRTAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI4IH0sCi0JeyAucGh5c19iYXNlID0gMHg0OTA0MDAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVI5IH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4NjAwMCwgLmlycSA9IElOVF8yNFhYX0dQVElNRVIxMCB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NDgwODgwMDAsIC5pcnEgPSBJTlRfMjRYWF9HUFRJTUVSMTEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MzA0MDAwLCAuaXJxID0gSU5UXzM0WFhfR1BUMTJfSVJRIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqb21hcDNfZG1fc291cmNlX25hbWVzW10gX19pbml0ZGF0YSA9IHsKLQkic3lzX2NrIiwKLQkib21hcF8zMmtfZmNrIiwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqb21hcDNfZG1fc291cmNlX2Nsb2Nrc1syXTsKLXN0YXRpYyBjb25zdCBpbnQgb21hcDNfZG1fdGltZXJfY291bnQgPSBBUlJBWV9TSVpFKG9tYXAzX2RtX3RpbWVycyk7Ci0KLSNlbHNlCi0jZGVmaW5lIG9tYXAzX2RtX3RpbWVycwkJCU5VTEwKLSNkZWZpbmUgb21hcDNfZG1fdGltZXJfY291bnQJCTAKLSNkZWZpbmUgb21hcDNfZG1fc291cmNlX25hbWVzCQlOVUxMCi0jZGVmaW5lIG9tYXAzX2RtX3NvdXJjZV9jbG9ja3MJCU5VTEwKLSNlbmRpZgkvKiBDT05GSUdfQVJDSF9PTUFQMyAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDQKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciBvbWFwNF9kbV90aW1lcnNbXSA9IHsKLQl7IC5waHlzX2Jhc2UgPSAweDRhMzE4MDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDEgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDMyMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDIgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDM0MDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDMgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDM2MDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDQgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQwMTM4MDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDUgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQwMTNhMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDYgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQwMTNhMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDcgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQwMTNlMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDggfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDNlMDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDkgfSwKLQl7IC5waHlzX2Jhc2UgPSAweDQ4MDg2MDAwLCAuaXJxID0gT01BUDQ0WFhfSVJRX0dQVDEwIH0sCi0JeyAucGh5c19iYXNlID0gMHg0ODA4ODAwMCwgLmlycSA9IE9NQVA0NFhYX0lSUV9HUFQxMSB9LAotCXsgLnBoeXNfYmFzZSA9IDB4NGEzMjAwMDAsIC5pcnEgPSBPTUFQNDRYWF9JUlFfR1BUMTIgfSwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqb21hcDRfZG1fc291cmNlX25hbWVzW10gX19pbml0ZGF0YSA9IHsKLQkic3lzX2Nsa2luX2NrIiwKLQkic3lzXzMya19jayIsCi0JTlVMTAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpvbWFwNF9kbV9zb3VyY2VfY2xvY2tzWzJdOwotc3RhdGljIGNvbnN0IGludCBvbWFwNF9kbV90aW1lcl9jb3VudCA9IEFSUkFZX1NJWkUob21hcDRfZG1fdGltZXJzKTsKLQotI2Vsc2UKLSNkZWZpbmUgb21hcDRfZG1fdGltZXJzCQkJTlVMTAotI2RlZmluZSBvbWFwNF9kbV90aW1lcl9jb3VudAkJMAotI2RlZmluZSBvbWFwNF9kbV9zb3VyY2VfbmFtZXMJCU5VTEwKLSNkZWZpbmUgb21hcDRfZG1fc291cmNlX2Nsb2NrcwkJTlVMTAotI2VuZGlmCS8qIENPTkZJR19BUkNIX09NQVA0ICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqZG1fdGltZXJzOwotc3RhdGljIGNvbnN0IGNoYXIgKipkbV9zb3VyY2VfbmFtZXM7Ci1zdGF0aWMgc3RydWN0IGNsayAqKmRtX3NvdXJjZV9jbG9ja3M7Ci0KLXN0YXRpYyBzcGlubG9ja190IGRtX3RpbWVyX2xvY2s7Ci0KLS8qCi0gKiBSZWFkcyB0aW1lciByZWdpc3RlcnMgaW4gcG9zdGVkIGFuZCBub24tcG9zdGVkIG1vZGUuIFRoZSBwb3N0ZWQgbW9kZSBiaXQKLSAqIGlzIGVuY29kZWQgaW4gcmVnLiBOb3RlIHRoYXQgaW4gcG9zdGVkIG1vZGUgd3JpdGUgcGVuZGluZyBiaXQgbXVzdCBiZQotICogY2hlY2tlZC4gT3RoZXJ3aXNlIGEgcmVhZCBvZiBhIG5vbiBjb21wbGV0ZWQgd3JpdGUgd2lsbCBwcm9kdWNlIGFuIGVycm9yLgorLyoqCisgKiBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnIC0gcmVhZCB0aW1lciByZWdpc3RlcnMgaW4gcG9zdGVkIGFuZCBub24tcG9zdGVkIG1vZGUKKyAqIEB0aW1lcjogICAgICB0aW1lciBwb2ludGVyIG92ZXIgd2hpY2ggcmVhZCBvcGVyYXRpb24gdG8gcGVyZm9ybQorICogQHJlZzogICAgICAgIGxvd2VzdCBieXRlIGhvbGRzIHRoZSByZWdpc3RlciBvZmZzZXQKKyAqCisgKiBUaGUgcG9zdGVkIG1vZGUgYml0IGlzIGVuY29kZWQgaW4gcmVnLiBOb3RlIHRoYXQgaW4gcG9zdGVkIG1vZGUgd3JpdGUKKyAqIHBlbmRpbmcgYml0IG11c3QgYmUgY2hlY2tlZC4gT3RoZXJ3aXNlIGEgcmVhZCBvZiBhIG5vbiBjb21wbGV0ZWQgd3JpdGUKKyAqIHdpbGwgcHJvZHVjZSBhbiBlcnJvci4KICAqLwogc3RhdGljIGlubGluZSB1MzIgb21hcF9kbV90aW1lcl9yZWFkX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHUzMiByZWcpCiB7Ci0JcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLT5pb19iYXNlLCByZWcsIHRpbWVyLT5wb3N0ZWQpOworCVdBUk5fT04oKHJlZyAmIDB4ZmYpIDwgX09NQVBfVElNRVJfV0FLRVVQX0VOX09GRlNFVCk7CisJcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLCByZWcsIHRpbWVyLT5wb3N0ZWQpOwogfQogCi0vKgotICogV3JpdGVzIHRpbWVyIHJlZ2lzdGVycyBpbiBwb3N0ZWQgYW5kIG5vbi1wb3N0ZWQgbW9kZS4gVGhlIHBvc3RlZCBtb2RlIGJpdAotICogaXMgZW5jb2RlZCBpbiByZWcuIE5vdGUgdGhhdCBpbiBwb3N0ZWQgbW9kZSB0aGUgd3JpdGUgcGVuZGluZyBiaXQgbXVzdCBiZQotICogY2hlY2tlZC4gT3RoZXJ3aXNlIGEgd3JpdGUgb24gYSByZWdpc3RlciB3aGljaCBoYXMgYSBwZW5kaW5nIHdyaXRlIHdpbGwgYmUKLSAqIGxvc3QuCisvKioKKyAqIG9tYXBfZG1fdGltZXJfd3JpdGVfcmVnIC0gd3JpdGUgdGltZXIgcmVnaXN0ZXJzIGluIHBvc3RlZCBhbmQgbm9uLXBvc3RlZCBtb2RlCisgKiBAdGltZXI6ICAgICAgdGltZXIgcG9pbnRlciBvdmVyIHdoaWNoIHdyaXRlIG9wZXJhdGlvbiBpcyB0byBwZXJmb3JtCisgKiBAcmVnOiAgICAgICAgbG93ZXN0IGJ5dGUgaG9sZHMgdGhlIHJlZ2lzdGVyIG9mZnNldAorICogQHZhbHVlOiAgICAgIGRhdGEgdG8gd3JpdGUgaW50byB0aGUgcmVnaXN0ZXIKKyAqCisgKiBUaGUgcG9zdGVkIG1vZGUgYml0IGlzIGVuY29kZWQgaW4gcmVnLiBOb3RlIHRoYXQgaW4gcG9zdGVkIG1vZGUgdGhlIHdyaXRlCisgKiBwZW5kaW5nIGJpdCBtdXN0IGJlIGNoZWNrZWQuIE90aGVyd2lzZSBhIHdyaXRlIG9uIGEgcmVnaXN0ZXIgd2hpY2ggaGFzIGEKKyAqIHBlbmRpbmcgd3JpdGUgd2lsbCBiZSBsb3N0LgogICovCiBzdGF0aWMgdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHUzMiByZWcsCiAJCQkJCQl1MzIgdmFsdWUpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKHRpbWVyLT5pb19iYXNlLCByZWcsIHZhbHVlLCB0aW1lci0+cG9zdGVkKTsKKwlXQVJOX09OKChyZWcgJiAweGZmKSA8IF9PTUFQX1RJTUVSX1dBS0VVUF9FTl9PRkZTRVQpOworCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lciwgcmVnLCB2YWx1ZSwgdGltZXItPnBvc3RlZCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfdGltZXJfcmVzdG9yZV9jb250ZXh0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVCwKKwkJCQl0aW1lci0+Y29udGV4dC50aW9jcF9jZmcpOworCWlmICh0aW1lci0+cmV2aXNpb24gPiAxKQorCQlfX3Jhd193cml0ZWwodGltZXItPmNvbnRleHQudGlzdGF0LCB0aW1lci0+c3lzX3N0YXQpOworCisJX19yYXdfd3JpdGVsKHRpbWVyLT5jb250ZXh0LnRpc3IsIHRpbWVyLT5pcnFfc3RhdCk7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfV0FLRVVQX0VOX1JFRywKKwkJCQl0aW1lci0+Y29udGV4dC50d2VyKTsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywKKwkJCQl0aW1lci0+Y29udGV4dC50Y3JyKTsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9MT0FEX1JFRywKKwkJCQl0aW1lci0+Y29udGV4dC50bGRyKTsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9NQVRDSF9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudG1hcik7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfSUZfQ1RSTF9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudHNpY3IpOworCV9fcmF3X3dyaXRlbCh0aW1lci0+Y29udGV4dC50aWVyLCB0aW1lci0+aXJxX2VuYSk7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsCisJCQkJdGltZXItPmNvbnRleHQudGNscik7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfd2FpdF9mb3JfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewogCWludCBjOwogCisJaWYgKCF0aW1lci0+c3lzX3N0YXQpCisJCXJldHVybjsKKwogCWMgPSAwOwotCXdoaWxlICghKG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfU1lTX1NUQVRfUkVHKSAmIDEpKSB7CisJd2hpbGUgKCEoX19yYXdfcmVhZGwodGltZXItPnN5c19zdGF0KSAmIDEpKSB7CiAJCWMrKzsKIAkJaWYgKGMgPiAxMDAwMDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiVGltZXIgZmFpbGVkIHRvIHJlc2V0XG4iKTsKQEAgLTIwMSw1MyArMTIwLDY1IEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1fdGltZXJfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCWludCBhdXRvaWRsZSA9IDAsIHdha2V1cCA9IDA7Ci0KLQlpZiAoIWNwdV9jbGFzc19pc19vbWFwMigpIHx8IHRpbWVyICE9ICZkbV90aW1lcnNbMF0pIHsKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CisJaWYgKHRpbWVyLT5wZGV2LT5pZCAhPSAxKSB7CiAJCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHLCAweDA2KTsKIAkJb21hcF9kbV90aW1lcl93YWl0X2Zvcl9yZXNldCh0aW1lcik7CiAJfQotCW9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSh0aW1lciwgT01BUF9USU1FUl9TUkNfMzJfS0haKTsKIAotCS8qIEVuYWJsZSBhdXRvaWRsZSBvbiBPTUFQMisgKi8KLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpCi0JCWF1dG9pZGxlID0gMTsKLQotCS8qCi0JICogRW5hYmxlIHdha2UtdXAgb24gT01BUDIgQ1BVcy4KLQkgKi8KLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpCi0JCXdha2V1cCA9IDE7Ci0KLQlfX29tYXBfZG1fdGltZXJfcmVzZXQodGltZXItPmlvX2Jhc2UsIGF1dG9pZGxlLCB3YWtldXApOworCV9fb21hcF9kbV90aW1lcl9yZXNldCh0aW1lciwgMCwgMCk7CisJb21hcF9kbV90aW1lcl9kaXNhYmxlKHRpbWVyKTsKIAl0aW1lci0+cG9zdGVkID0gMTsKIH0KIAotdm9pZCBvbWFwX2RtX3RpbWVyX3ByZXBhcmUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoraW50IG9tYXBfZG1fdGltZXJfcHJlcGFyZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7Ci0Jb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOwotCW9tYXBfZG1fdGltZXJfcmVzZXQodGltZXIpOworCXN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdGltZXItPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwl0aW1lci0+ZmNsayA9IGNsa19nZXQoJnRpbWVyLT5wZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoV0FSTl9PTl9PTkNFKElTX0VSUl9PUl9OVUxMKHRpbWVyLT5mY2xrKSkpIHsKKwkJdGltZXItPmZjbGsgPSBOVUxMOworCQlkZXZfZXJyKCZ0aW1lci0+cGRldi0+ZGV2LCAiOiBObyBmY2xrIGhhbmRsZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGRhdGEtPm5lZWRzX21hbnVhbF9yZXNldCkKKwkJb21hcF9kbV90aW1lcl9yZXNldCh0aW1lcik7CisKKwlyZXQgPSBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UodGltZXIsIE9NQVBfVElNRVJfU1JDXzMyX0tIWik7CisKKwl0aW1lci0+cG9zdGVkID0gMTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqb21hcF9kbV90aW1lcl9yZXF1ZXN0KHZvaWQpCiB7Ci0Jc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyID0gTlVMTDsKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIgPSBOVUxMLCAqdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOworCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgZG1fdGltZXJfY291bnQ7IGkrKykgewotCQlpZiAoZG1fdGltZXJzW2ldLnJlc2VydmVkKQorCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm9tYXBfdGltZXJfbGlzdCwgbm9kZSkgeworCQlpZiAodC0+cmVzZXJ2ZWQpCiAJCQljb250aW51ZTsKIAotCQl0aW1lciA9ICZkbV90aW1lcnNbaV07CisJCXRpbWVyID0gdDsKIAkJdGltZXItPnJlc2VydmVkID0gMTsKIAkJYnJlYWs7CiAJfQorCisJaWYgKHRpbWVyKSB7CisJCXJldCA9IG9tYXBfZG1fdGltZXJfcHJlcGFyZSh0aW1lcik7CisJCWlmIChyZXQpIHsKKwkJCXRpbWVyLT5yZXNlcnZlZCA9IDA7CisJCQl0aW1lciA9IE5VTEw7CisJCX0KKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKHRpbWVyICE9IE5VTEwpCi0JCW9tYXBfZG1fdGltZXJfcHJlcGFyZSh0aW1lcik7CisJaWYgKCF0aW1lcikKKwkJcHJfZGVidWcoIiVzOiB0aW1lciByZXF1ZXN0IGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiB0aW1lcjsKIH0KQEAgLTI1NSw3NCArMTg2LDY1IEBACiAKIHN0cnVjdCBvbWFwX2RtX3RpbWVyICpvbWFwX2RtX3RpbWVyX3JlcXVlc3Rfc3BlY2lmaWMoaW50IGlkKQogewotCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIgPSBOVUxMLCAqdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKLQlpZiAoaWQgPD0gMCB8fCBpZCA+IGRtX3RpbWVyX2NvdW50IHx8IGRtX3RpbWVyc1tpZC0xXS5yZXNlcnZlZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7Ci0JCXByaW50aygiQlVHOiB3YXJuaW5nIGF0ICVzOiVkLyVzKCk6IHVuYWJsZSB0byBnZXQgdGltZXIgJWRcbiIsCi0JCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fLCBpZCk7Ci0JCWR1bXBfc3RhY2soKTsKLQkJcmV0dXJuIE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmb21hcF90aW1lcl9saXN0LCBub2RlKSB7CisJCWlmICh0LT5wZGV2LT5pZCA9PSBpZCAmJiAhdC0+cmVzZXJ2ZWQpIHsKKwkJCXRpbWVyID0gdDsKKwkJCXRpbWVyLT5yZXNlcnZlZCA9IDE7CisJCQlicmVhazsKKwkJfQogCX0KIAotCXRpbWVyID0gJmRtX3RpbWVyc1tpZC0xXTsKLQl0aW1lci0+cmVzZXJ2ZWQgPSAxOworCWlmICh0aW1lcikgeworCQlyZXQgPSBvbWFwX2RtX3RpbWVyX3ByZXBhcmUodGltZXIpOworCQlpZiAocmV0KSB7CisJCQl0aW1lci0+cmVzZXJ2ZWQgPSAwOworCQkJdGltZXIgPSBOVUxMOworCQl9CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKIAotCW9tYXBfZG1fdGltZXJfcHJlcGFyZSh0aW1lcik7CisJaWYgKCF0aW1lcikKKwkJcHJfZGVidWcoIiVzOiB0aW1lciVkIHJlcXVlc3QgZmFpbGVkIVxuIiwgX19mdW5jX18sIGlkKTsKIAogCXJldHVybiB0aW1lcjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyk7CiAKLXZvaWQgb21hcF9kbV90aW1lcl9mcmVlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK2ludCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKLQlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKLQlvbWFwX2RtX3RpbWVyX2Rpc2FibGUodGltZXIpOworCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsa19wdXQodGltZXItPmZjbGspOwogCiAJV0FSTl9PTighdGltZXItPnJlc2VydmVkKTsKIAl0aW1lci0+cmVzZXJ2ZWQgPSAwOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9mcmVlKTsKIAogdm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7Ci0JaWYgKHRpbWVyLT5lbmFibGVkKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKLQkJY2xrX2VuYWJsZSh0aW1lci0+ZmNsayk7Ci0JCWNsa19lbmFibGUodGltZXItPmljbGspOwotCX0KLSNlbmRpZgotCi0JdGltZXItPmVuYWJsZWQgPSAxOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnRpbWVyLT5wZGV2LT5kZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9lbmFibGUpOwogCiB2b2lkIG9tYXBfZG1fdGltZXJfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7Ci0JaWYgKCF0aW1lci0+ZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKSB7Ci0JCWNsa19kaXNhYmxlKHRpbWVyLT5pY2xrKTsKLQkJY2xrX2Rpc2FibGUodGltZXItPmZjbGspOwotCX0KLSNlbmRpZgotCi0JdGltZXItPmVuYWJsZWQgPSAwOworCXBtX3J1bnRpbWVfcHV0KCZ0aW1lci0+cGRldi0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfZGlzYWJsZSk7CiAKIGludCBvbWFwX2RtX3RpbWVyX2dldF9pcnEoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCXJldHVybiB0aW1lci0+aXJxOworCWlmICh0aW1lcikKKwkJcmV0dXJuIHRpbWVyLT5pcnE7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX2dldF9pcnEpOwogCkBAIC0zMzQsMjQgKzI1NiwyOSBAQAogICovCiBfX3UzMiBvbWFwX2RtX3RpbWVyX21vZGlmeV9pZGxlY3RfbWFzayhfX3UzMiBpbnB1dG1hc2spCiB7Ci0JaW50IGk7CisJaW50IGkgPSAwOworCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIElmIEFSTVhPUiBjYW5ub3QgYmUgaWRsZWQgdGhpcyBmdW5jdGlvbiBjYWxsIGlzIHVubmVjZXNzYXJ5ICovCiAJaWYgKCEoaW5wdXRtYXNrICYgKDEgPDwgMSkpKQogCQlyZXR1cm4gaW5wdXRtYXNrOwogCiAJLyogSWYgYW55IGFjdGl2ZSB0aW1lciBpcyB1c2luZyBBUk1YT1IgcmV0dXJuIG1vZGlmaWVkIG1hc2sgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZG1fdGltZXJfY291bnQ7IGkrKykgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJm9tYXBfdGltZXJfbGlzdCwgbm9kZSkgewogCQl1MzIgbDsKIAotCQlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZygmZG1fdGltZXJzW2ldLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwkJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOwogCQlpZiAobCAmIE9NQVBfVElNRVJfQ1RSTF9TVCkgewogCQkJaWYgKCgob21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpID4+IChpICogMikpICYgMHgwMykgPT0gMCkKIAkJCQlpbnB1dG1hc2sgJj0gfigxIDw8IDEpOwogCQkJZWxzZQogCQkJCWlucHV0bWFzayAmPSB+KDEgPDwgMik7CiAJCX0KKwkJaSsrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gaW5wdXRtYXNrOwogfQpAQCAtMzYxLDcgKzI4OCw5IEBACiAKIHN0cnVjdCBjbGsgKm9tYXBfZG1fdGltZXJfZ2V0X2ZjbGsoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewotCXJldHVybiB0aW1lci0+ZmNsazsKKwlpZiAodGltZXIpCisJCXJldHVybiB0aW1lci0+ZmNsazsKKwlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfZ2V0X2ZjbGspOwogCkBAIC0zNzUsNzAgKzMwNCw5MSBAQAogCiAjZW5kaWYKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoraW50IG9tYXBfZG1fdGltZXJfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCiB7CisJaWYgKHVubGlrZWx5KCF0aW1lciB8fCBwbV9ydW50aW1lX3N1c3BlbmRlZCgmdGltZXItPnBkZXYtPmRldikpKSB7CisJCXByX2VycigiJXM6IHRpbWVyIG5vdCBhdmFpbGFibGUgb3IgZW5hYmxlZC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfVFJJR0dFUl9SRUcsIDApOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl90cmlnZ2VyKTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK2ludCBvbWFwX2RtX3RpbWVyX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKIAl1MzIgbDsKIAorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKKworCWlmICh0aW1lci0+bG9zZXNfY29udGV4dCkgeworCQl1MzIgY3R4X2xvc3NfY250X2FmdGVyID0KKwkJCXRpbWVyLT5nZXRfY29udGV4dF9sb3NzX2NvdW50KCZ0aW1lci0+cGRldi0+ZGV2KTsKKwkJaWYgKGN0eF9sb3NzX2NudF9hZnRlciAhPSB0aW1lci0+Y3R4X2xvc3NfY291bnQpCisJCQlvbWFwX3RpbWVyX3Jlc3RvcmVfY29udGV4dCh0aW1lcik7CisJfQorCiAJbCA9IG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpOwogCWlmICghKGwgJiBPTUFQX1RJTUVSX0NUUkxfU1QpKSB7CiAJCWwgfD0gT01BUF9USU1FUl9DVFJMX1NUOwogCQlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7CiAJfQorCisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjbHIgPSBsOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zdGFydCk7CiAKLXZvaWQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK2ludCBvbWFwX2RtX3RpbWVyX3N0b3Aoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQogewogCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IDA7CisJc3RydWN0IGRtdGltZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB0aW1lci0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKLQlyYXRlID0gY2xrX2dldF9yYXRlKHRpbWVyLT5mY2xrKTsKLSNlbmRpZgorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCV9fb21hcF9kbV90aW1lcl9zdG9wKHRpbWVyLT5pb19iYXNlLCB0aW1lci0+cG9zdGVkLCByYXRlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc3RvcCk7CisJaWYgKCFwZGF0YS0+bmVlZHNfbWFudWFsX3Jlc2V0KQorCQlyYXRlID0gY2xrX2dldF9yYXRlKHRpbWVyLT5mY2xrKTsKIAotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCi0KLWludCBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2Uoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgc291cmNlKQotewotCWludCBuID0gKHRpbWVyIC0gZG1fdGltZXJzKSA8PCAxOwotCXUzMiBsOwotCi0JbCA9IG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8xKSAmIH4oMHgwMyA8PCBuKTsKLQlsIHw9IHNvdXJjZSA8PCBuOwotCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisJX19vbWFwX2RtX3RpbWVyX3N0b3AodGltZXIsIHRpbWVyLT5wb3N0ZWQsIHJhdGUpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UpOwotCi0jZWxzZQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zdG9wKTsKIAogaW50IG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBzb3VyY2UpCiB7CisJaW50IHJldDsKKwlzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBkYXRhID0gdGltZXItPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCiAJaWYgKHNvdXJjZSA8IDAgfHwgc291cmNlID49IDMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIF9fb21hcF9kbV90aW1lcl9zZXRfc291cmNlKHRpbWVyLT5mY2xrLAotCQkJCQkJZG1fc291cmNlX2Nsb2Nrc1tzb3VyY2VdKTsKKwlyZXQgPSBwZGF0YS0+c2V0X3RpbWVyX3NyYyh0aW1lci0+cGRldiwgc291cmNlKTsKKworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UpOwogCi0jZW5kaWYKLQotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGF1dG9yZWxvYWQsCitpbnQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLAogCQkJICAgIHVuc2lnbmVkIGludCBsb2FkKQogewogCXUzMiBsOwogCisJaWYgKHVubGlrZWx5KCF0aW1lcikpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOwogCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKIAlpZiAoYXV0b3JlbG9hZCkKIAkJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQVI7CkBAIC00NDgsMTUgKzM5OCwzMiBAQAogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0xPQURfUkVHLCBsb2FkKTsKIAogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1RSSUdHRVJfUkVHLCAwKTsKKwkvKiBTYXZlIHRoZSBjb250ZXh0ICovCisJdGltZXItPmNvbnRleHQudGNsciA9IGw7CisJdGltZXItPmNvbnRleHQudGxkciA9IGxvYWQ7CisJb21hcF9kbV90aW1lcl9kaXNhYmxlKHRpbWVyKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc2V0X2xvYWQpOwogCiAvKiBPcHRpbWl6ZWQgc2V0X2xvYWQgd2hpY2ggcmVtb3ZlcyBjb3N0bHkgc3BpbiB3YWl0IGluIHRpbWVyX3N0YXJ0ICovCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X2xvYWRfc3RhcnQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgYXV0b3JlbG9hZCwKK2ludCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGF1dG9yZWxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYWQpCiB7CiAJdTMyIGw7CiAKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CisKKwlpZiAodGltZXItPmxvc2VzX2NvbnRleHQpIHsKKwkJdTMyIGN0eF9sb3NzX2NudF9hZnRlciA9CisJCQl0aW1lci0+Z2V0X2NvbnRleHRfbG9zc19jb3VudCgmdGltZXItPnBkZXYtPmRldik7CisJCWlmIChjdHhfbG9zc19jbnRfYWZ0ZXIgIT0gdGltZXItPmN0eF9sb3NzX2NvdW50KQorCQkJb21hcF90aW1lcl9yZXN0b3JlX2NvbnRleHQodGltZXIpOworCX0KKwogCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKIAlpZiAoYXV0b3JlbG9hZCkgewogCQlsIHw9IE9NQVBfVElNRVJfQ1RSTF9BUjsKQEAgLTQ2NiwxNSArNDMzLDI1IEBACiAJfQogCWwgfD0gT01BUF9USU1FUl9DVFJMX1NUOwogCi0JX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQodGltZXItPmlvX2Jhc2UsIGwsIGxvYWQsIHRpbWVyLT5wb3N0ZWQpOworCV9fb21hcF9kbV90aW1lcl9sb2FkX3N0YXJ0KHRpbWVyLCBsLCBsb2FkLCB0aW1lci0+cG9zdGVkKTsKKworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50Y2xyID0gbDsKKwl0aW1lci0+Y29udGV4dC50bGRyID0gbG9hZDsKKwl0aW1lci0+Y29udGV4dC50Y3JyID0gbG9hZDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc2V0X2xvYWRfc3RhcnQpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGVuYWJsZSwKK2ludCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBlbmFibGUsCiAJCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaCkKIHsKIAl1MzIgbDsKIAorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CiAJaWYgKGVuYWJsZSkKIAkJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQ0U7CkBAIC00ODIsMTQgKzQ1OSwyNCBAQAogCQlsICY9IH5PTUFQX1RJTUVSX0NUUkxfQ0U7CiAJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOwogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX01BVENIX1JFRywgbWF0Y2gpOworCisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjbHIgPSBsOworCXRpbWVyLT5jb250ZXh0LnRtYXIgPSBtYXRjaDsKKwlvbWFwX2RtX3RpbWVyX2Rpc2FibGUodGltZXIpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9zZXRfbWF0Y2gpOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X3B3bShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBkZWZfb24sCitpbnQgb21hcF9kbV90aW1lcl9zZXRfcHdtKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGRlZl9vbiwKIAkJCSAgIGludCB0b2dnbGUsIGludCB0cmlnZ2VyKQogewogCXUzMiBsOwogCisJaWYgKHVubGlrZWx5KCF0aW1lcikpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcF9kbV90aW1lcl9lbmFibGUodGltZXIpOwogCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKIAlsICY9IH4oT01BUF9USU1FUl9DVFJMX0dQT0NGRyB8IE9NQVBfVElNRVJfQ1RSTF9TQ1BXTSB8CiAJICAgICAgIE9NQVBfVElNRVJfQ1RSTF9QVCB8ICgweDAzIDw8IDEwKSk7CkBAIC00OTksMTMgKzQ4NiwyMiBAQAogCQlsIHw9IE9NQVBfVElNRVJfQ1RSTF9QVDsKIAlsIHw9IHRyaWdnZXIgPDwgMTA7CiAJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworCisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRjbHIgPSBsOworCW9tYXBfZG1fdGltZXJfZGlzYWJsZSh0aW1lcik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9wd20pOwogCi12b2lkIG9tYXBfZG1fdGltZXJfc2V0X3ByZXNjYWxlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBwcmVzY2FsZXIpCitpbnQgb21hcF9kbV90aW1lcl9zZXRfcHJlc2NhbGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHByZXNjYWxlcikKIHsKIAl1MzIgbDsKIAorCWlmICh1bmxpa2VseSghdGltZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfZG1fdGltZXJfZW5hYmxlKHRpbWVyKTsKIAlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CiAJbCAmPSB+KE9NQVBfVElNRVJfQ1RSTF9QUkUgfCAoMHgwNyA8PCAyKSk7CiAJaWYgKHByZXNjYWxlciA+PSAweDAwICYmIHByZXNjYWxlciA8PSAweDA3KSB7CkBAIC01MTMsMTMgKzUwOSwyOCBAQAogCQlsIHw9IHByZXNjYWxlciA8PCAyOwogCX0KIAlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7CisKKwkvKiBTYXZlIHRoZSBjb250ZXh0ICovCisJdGltZXItPmNvbnRleHQudGNsciA9IGw7CisJb21hcF9kbV90aW1lcl9kaXNhYmxlKHRpbWVyKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfc2V0X3ByZXNjYWxlcik7CiAKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCitpbnQgb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCiAJCQkJICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUodGltZXItPmlvX2Jhc2UsIHZhbHVlKTsKKwlpZiAodW5saWtlbHkoIXRpbWVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwX2RtX3RpbWVyX2VuYWJsZSh0aW1lcik7CisJX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUodGltZXIsIHZhbHVlKTsKKworCS8qIFNhdmUgdGhlIGNvbnRleHQgKi8KKwl0aW1lci0+Y29udGV4dC50aWVyID0gdmFsdWU7CisJdGltZXItPmNvbnRleHQudHdlciA9IHZhbHVlOworCW9tYXBfZG1fdGltZXJfZGlzYWJsZSh0aW1lcik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2RtX3RpbWVyX3NldF9pbnRfZW5hYmxlKTsKIApAQCAtNTI3LDQwICs1MzgsNjEgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbDsKIAotCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1NUQVRfUkVHKTsKKwlpZiAodW5saWtlbHkoIXRpbWVyIHx8IHBtX3J1bnRpbWVfc3VzcGVuZGVkKCZ0aW1lci0+cGRldi0+ZGV2KSkpIHsKKwkJcHJfZXJyKCIlczogdGltZXIgbm90IGF2YWlsYWJsZSBvciBlbmFibGVkLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlsID0gX19yYXdfcmVhZGwodGltZXItPmlycV9zdGF0KTsKIAogCXJldHVybiBsOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl9yZWFkX3N0YXR1cyk7CiAKLXZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCitpbnQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyh0aW1lci0+aW9fYmFzZSwgdmFsdWUpOworCWlmICh1bmxpa2VseSghdGltZXIgfHwgcG1fcnVudGltZV9zdXNwZW5kZWQoJnRpbWVyLT5wZGV2LT5kZXYpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX29tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKHRpbWVyLCB2YWx1ZSk7CisJLyogU2F2ZSB0aGUgY29udGV4dCAqLworCXRpbWVyLT5jb250ZXh0LnRpc3IgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKTsKIAogdW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKIHsKLQlyZXR1cm4gX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcih0aW1lci0+aW9fYmFzZSwgdGltZXItPnBvc3RlZCk7CisJaWYgKHVubGlrZWx5KCF0aW1lciB8fCBwbV9ydW50aW1lX3N1c3BlbmRlZCgmdGltZXItPnBkZXYtPmRldikpKSB7CisJCXByX2VycigiJXM6IHRpbWVyIG5vdCBpYXZhaWxhYmxlIG9yIGVuYWJsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBfX29tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHRpbWVyLCB0aW1lci0+cG9zdGVkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCitpbnQgb21hcF9kbV90aW1lcl93cml0ZV9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKQogeworCWlmICh1bmxpa2VseSghdGltZXIgfHwgcG1fcnVudGltZV9zdXNwZW5kZWQoJnRpbWVyLT5wZGV2LT5kZXYpKSkgeworCQlwcl9lcnIoIiVzOiB0aW1lciBub3QgYXZhaWxhYmxlIG9yIGVuYWJsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCB2YWx1ZSk7CisKKwkvKiBTYXZlIHRoZSBjb250ZXh0ICovCisJdGltZXItPmNvbnRleHQudGNyciA9IHZhbHVlOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcl93cml0ZV9jb3VudGVyKTsKIAogaW50IG9tYXBfZG1fdGltZXJzX2FjdGl2ZSh2b2lkKQogewotCWludCBpOworCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKIAotCWZvciAoaSA9IDA7IGkgPCBkbV90aW1lcl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKLQotCQl0aW1lciA9ICZkbV90aW1lcnNbaV07Ci0KLQkJaWYgKCF0aW1lci0+ZW5hYmxlZCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVyLCAmb21hcF90aW1lcl9saXN0LCBub2RlKSB7CisJCWlmICghdGltZXItPnJlc2VydmVkKQogCQkJY29udGludWU7CiAKIAkJaWYgKG9tYXBfZG1fdGltZXJfcmVhZF9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcpICYKQEAgLTU3Miw2OSArNjA0LDE0NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwob21hcF9kbV90aW1lcnNfYWN0aXZlKTsKIAotc3RhdGljIGludCBfX2luaXQgb21hcF9kbV90aW1lcl9pbml0KHZvaWQpCisvKioKKyAqIG9tYXBfZG1fdGltZXJfcHJvYmUgLSBwcm9iZSBmdW5jdGlvbiBjYWxsZWQgZm9yIGV2ZXJ5IHJlZ2lzdGVyZWQgZGV2aWNlCisgKiBAcGRldjoJcG9pbnRlciB0byBjdXJyZW50IHRpbWVyIHBsYXRmb3JtIGRldmljZQorICoKKyAqIENhbGxlZCBieSBkcml2ZXIgZnJhbWV3b3JrIGF0IHRoZSBlbmQgb2YgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmb3IgYWxsCisgKiB0aW1lciBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwX2RtX3RpbWVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKLQlpbnQgaSwgbWFwX3NpemUgPSBTWl84SzsJLyogTW9kdWxlIDRLQiArIEw0IDRLQiBleGNlcHQgb24gb21hcDEgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlycSwgKmlvYXJlYTsKKwlzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKCEoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2NsYXNzX2lzX29tYXAyKCkpKQorCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIHBsYXRmb3JtIGRhdGEuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRtX3RpbWVyX2xvY2spOwotCi0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7Ci0JCWRtX3RpbWVycyA9IG9tYXAxX2RtX3RpbWVyczsKLQkJZG1fdGltZXJfY291bnQgPSBvbWFwMV9kbV90aW1lcl9jb3VudDsKLQkJbWFwX3NpemUgPSBTWl8ySzsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMjR4eCgpKSB7Ci0JCWRtX3RpbWVycyA9IG9tYXAyX2RtX3RpbWVyczsKLQkJZG1fdGltZXJfY291bnQgPSBvbWFwMl9kbV90aW1lcl9jb3VudDsKLQkJZG1fc291cmNlX25hbWVzID0gb21hcDJfZG1fc291cmNlX25hbWVzOwotCQlkbV9zb3VyY2VfY2xvY2tzID0gb21hcDJfZG1fc291cmNlX2Nsb2NrczsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCWRtX3RpbWVycyA9IG9tYXAzX2RtX3RpbWVyczsKLQkJZG1fdGltZXJfY291bnQgPSBvbWFwM19kbV90aW1lcl9jb3VudDsKLQkJZG1fc291cmNlX25hbWVzID0gb21hcDNfZG1fc291cmNlX25hbWVzOwotCQlkbV9zb3VyY2VfY2xvY2tzID0gb21hcDNfZG1fc291cmNlX2Nsb2NrczsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCWRtX3RpbWVycyA9IG9tYXA0X2RtX3RpbWVyczsKLQkJZG1fdGltZXJfY291bnQgPSBvbWFwNF9kbV90aW1lcl9jb3VudDsKLQkJZG1fc291cmNlX25hbWVzID0gb21hcDRfZG1fc291cmNlX25hbWVzOwotCQlkbV9zb3VyY2VfY2xvY2tzID0gb21hcDRfZG1fc291cmNlX2Nsb2NrczsKIAl9CiAKLQlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpCi0JCWZvciAoaSA9IDA7IGRtX3NvdXJjZV9uYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JCQlkbV9zb3VyY2VfY2xvY2tzW2ldID0gY2xrX2dldChOVUxMLCBkbV9zb3VyY2VfbmFtZXNbaV0pOwotCi0JaWYgKGNwdV9pc19vbWFwMjQzeCgpKQotCQlkbV90aW1lcnNbMF0ucGh5c19iYXNlID0gMHg0OTAxODAwMDsKLQotCWZvciAoaSA9IDA7IGkgPCBkbV90aW1lcl9jb3VudDsgaSsrKSB7Ci0JCXRpbWVyID0gJmRtX3RpbWVyc1tpXTsKLQotCQkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KLQkJdGltZXItPmlvX2Jhc2UgPSBpb3JlbWFwKHRpbWVyLT5waHlzX2Jhc2UsIG1hcF9zaXplKTsKLQkJQlVHX09OKCF0aW1lci0+aW9fYmFzZSk7Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKLQkJaWYgKGNwdV9jbGFzc19pc19vbWFwMigpKSB7Ci0JCQljaGFyIGNsa19uYW1lWzE2XTsKLQkJCXNwcmludGYoY2xrX25hbWUsICJncHQlZF9pY2siLCBpICsgMSk7Ci0JCQl0aW1lci0+aWNsayA9IGNsa19nZXQoTlVMTCwgY2xrX25hbWUpOwotCQkJc3ByaW50ZihjbGtfbmFtZSwgImdwdCVkX2ZjayIsIGkgKyAxKTsKLQkJCXRpbWVyLT5mY2xrID0gY2xrX2dldChOVUxMLCBjbGtfbmFtZSk7Ci0JCX0KLQotCQkvKiBPbmUgb3IgdHdvIHRpbWVycyBtYXkgYmUgc2V0IHVwIGVhcmx5IGZvciBzeXNfdGltZXIgKi8KLQkJaWYgKHN5c190aW1lcl9yZXNlcnZlZCAmICgxICA8PCBpKSkgewotCQkJdGltZXItPnJlc2VydmVkID0gMTsKLQkJCXRpbWVyLT5wb3N0ZWQgPSAxOwotCQl9Ci0jZW5kaWYKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICh1bmxpa2VseSghaXJxKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbm8gSVJRIHJlc291cmNlLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICh1bmxpa2VseSghbWVtKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbm8gbWVtb3J5IHJlc291cmNlLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpb2FyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pLAorCQkJcGRldi0+bmFtZSk7CisJaWYgKCFpb2FyZWEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHJlZ2lvbiBhbHJlYWR5IGNsYWltZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdGltZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9kbV90aW1lciksIEdGUF9LRVJORUwpOworCWlmICghdGltZXIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3Igb21hcF9kbV90aW1lci5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfaW9yZWdpb247CisJfQorCisJdGltZXItPmlvX2Jhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJaWYgKCF0aW1lci0+aW9fYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogaW9yZW1hcCBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCXRpbWVyLT5pZCA9IHBkZXYtPmlkOworCXRpbWVyLT5pcnEgPSBpcnEtPnN0YXJ0OworCXRpbWVyLT5yZXNlcnZlZCA9IHBkYXRhLT5yZXNlcnZlZDsKKwl0aW1lci0+cGRldiA9IHBkZXY7CisJdGltZXItPmxvc2VzX2NvbnRleHQgPSBwZGF0YS0+bG9zZXNfY29udGV4dDsKKwl0aW1lci0+Z2V0X2NvbnRleHRfbG9zc19jb3VudCA9IHBkYXRhLT5nZXRfY29udGV4dF9sb3NzX2NvdW50OworCisJLyogU2tpcCBwbV9ydW50aW1lX2VuYWJsZSBmb3IgT01BUDEgKi8KKwlpZiAoIXBkYXRhLT5uZWVkc19tYW51YWxfcmVzZXQpIHsKKwkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfaXJxX3NhZmUoJnBkZXYtPmRldik7CisJfQorCisJaWYgKCF0aW1lci0+cmVzZXJ2ZWQpIHsKKwkJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwkJX19vbWFwX2RtX3RpbWVyX2luaXRfcmVncyh0aW1lcik7CisJCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCX0KKworCS8qIGFkZCB0aGUgdGltZXIgZWxlbWVudCB0byB0aGUgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmdGltZXItPm5vZGUsICZvbWFwX3RpbWVyX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIkRldmljZSBQcm9iZWQuXG4iKTsKKwogCXJldHVybiAwOworCitlcnJfZnJlZV9tZW06CisJa2ZyZWUodGltZXIpOworCitlcnJfZnJlZV9pb3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKworCXJldHVybiByZXQ7CiB9CiAKLWFyY2hfaW5pdGNhbGwob21hcF9kbV90aW1lcl9pbml0KTsKKy8qKgorICogb21hcF9kbV90aW1lcl9yZW1vdmUgLSBjbGVhbnVwIGEgcmVnaXN0ZXJlZCB0aW1lciBkZXZpY2UKKyAqIEBwZGV2Oglwb2ludGVyIHRvIGN1cnJlbnQgdGltZXIgcGxhdGZvcm0gZGV2aWNlCisgKgorICogQ2FsbGVkIGJ5IGRyaXZlciBmcmFtZXdvcmsgd2hlbmV2ZXIgYSB0aW1lciBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkLgorICogSW4gYWRkaXRpb24gdG8gZnJlZWluZyBwbGF0Zm9ybSByZXNvdXJjZXMgaXQgYWxzbyBkZWxldGVzIHRoZSB0aW1lcgorICogZW50cnkgZnJvbSB0aGUgbG9jYWwgbGlzdC4KKyAqLworc3RhdGljIGludCBfX2RldmV4aXQgb21hcF9kbV90aW1lcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lciwgJm9tYXBfdGltZXJfbGlzdCwgbm9kZSkKKwkJaWYgKHRpbWVyLT5wZGV2LT5pZCA9PSBwZGV2LT5pZCkgeworCQkJbGlzdF9kZWwoJnRpbWVyLT5ub2RlKTsKKwkJCWtmcmVlKHRpbWVyKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfZG1fdGltZXJfZHJpdmVyID0geworCS5wcm9iZSAgPSBvbWFwX2RtX3RpbWVyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChvbWFwX2RtX3RpbWVyX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9ICJvbWFwX3RpbWVyIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9kbV90aW1lcl9kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfZG1fdGltZXJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfZG1fdGltZXJfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9kbV90aW1lcl9kcml2ZXIpOworfQorCitlYXJseV9wbGF0Zm9ybV9pbml0KCJlYXJseXRpbWVyIiwgJm9tYXBfZG1fdGltZXJfZHJpdmVyKTsKK21vZHVsZV9pbml0KG9tYXBfZG1fdGltZXJfZHJpdmVyX2luaXQpOworbW9kdWxlX2V4aXQob21hcF9kbV90aW1lcl9kcml2ZXJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT01BUCBEdWFsLU1vZGUgVGltZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKaW5kZXggMzM0MWNhNC4uZGIwNzFiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYwpAQCAtMTA4LDYgKzEwOCwyMiBAQAogCXJlc1sxXS5zdGFydCA9IElOVF9JMkM7CiAJcGRhdGEgPSAmaTJjX3BkYXRhW2J1c19pZCAtIDFdOwogCisJLyogYWxsIE9NQVAxIGhhdmUgSVAgdmVyc2lvbiAxIHJlZ2lzdGVyIHNldCAqLworCXBkYXRhLT5yZXYgPSBPTUFQX0kyQ19JUF9WRVJTSU9OXzE7CisKKwkvKiBhbGwgT01BUDEgSTJDIGFyZSBpbXBsZW1lbnRlZCBsaWtlIHRoaXMgKi8KKwlwZGF0YS0+ZmxhZ3MgPSBPTUFQX0kyQ19GTEFHX05PX0ZJRk8gfAorCQkgICAgICAgT01BUF9JMkNfRkxBR19TSU1QTEVfQ0xPQ0sgfAorCQkgICAgICAgT01BUF9JMkNfRkxBR18xNkJJVF9EQVRBX1JFRyB8CisJCSAgICAgICBPTUFQX0kyQ19GTEFHX0FMV0FZU19BUk1YT1JfQ0xLOworCisJLyogaG93IHRoZSBjcHUgYnVzIGlzIHdpcmVkIHVwIGRpZmZlcnMgZm9yIDd4eCBvbmx5ICovCisKKwlpZiAoY3B1X2lzX29tYXA3eHgoKSkKKwkJcGRhdGEtPmZsYWdzIHw9IE9NQVBfSTJDX0ZMQUdfQlVTX1NISUZUXzE7CisJZWxzZQorCQlwZGF0YS0+ZmxhZ3MgfD0gT01BUF9JMkNfRkxBR19CVVNfU0hJRlRfMjsKKwogCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldik7CiB9CiAKQEAgLTEyMywyMSArMTM5LDE0IEBACiAJb21hcF9wbV9zZXRfbWF4X21wdV93YWtldXBfbGF0KGRldiwgdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX2kyY19sYXRlbmN5W10gPSB7Ci0JWzBdID0gewotCQkuZGVhY3RpdmF0ZV9mdW5jCT0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCi0JCS5hY3RpdmF0ZV9mdW5jCQk9IG9tYXBfZGV2aWNlX2VuYWJsZV9od21vZHMsCi0JCS5mbGFncwkJCT0gT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCwKLQl9LAotfTsKLQogc3RhdGljIGlubGluZSBpbnQgb21hcDJfaTJjX2FkZF9idXMoaW50IGJ1c19pZCkKIHsKIAlpbnQgbDsKIAlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7Ci0Jc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWNoYXIgb2hfbmFtZVtNQVhfT01BUF9JMkNfSFdNT0RfTkFNRV9MRU5dOwogCXN0cnVjdCBvbWFwX2kyY19idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG9tYXBfaTJjX2Rldl9hdHRyICpkZXZfYXR0cjsKIAogCW9tYXAyX2kyY19tdXhfcGlucyhidXNfaWQpOwogCkBAIC0xNTIsNiArMTYxLDE2IEBACiAKIAlwZGF0YSA9ICZpMmNfcGRhdGFbYnVzX2lkIC0gMV07CiAJLyoKKwkgKiBwYXNzIHRoZSBod21vZCBjbGFzcydzIENQVS1zcGVjaWZpYyBrbm93bGVkZ2Ugb2YgSTJDIElQIHJldmlzaW9uIGluCisJICogdXNlLCBhbmQgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRhdGlvbiBmbGFncywgdXAgdG8gdGhlIE9NQVAgSTJDCisJICogZHJpdmVyIHZpYSBwbGF0Zm9ybSBkYXRhCisJICovCisJcGRhdGEtPnJldiA9IG9oLT5jbGFzcy0+cmV2OworCisJZGV2X2F0dHIgPSAoc3RydWN0IG9tYXBfaTJjX2Rldl9hdHRyICopb2gtPmRldl9hdHRyOworCXBkYXRhLT5mbGFncyA9IGRldl9hdHRyLT5mbGFnczsKKworCS8qCiAJICogV2hlbiB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIGEgaTJjIHRyYW5zZmVyLCB3ZSBuZWVkIHRvCiAJICogc2V0IGEgd2FrZSB1cCBsYXRlbmN5IGNvbnN0cmFpbnQgZm9yIHRoZSBNUFUuIFRoaXMgaXMgdG8KIAkgKiBlbnN1cmUgcXVpY2sgZW5vdWdoIHdha2V1cCBmcm9tIGlkbGUsIHdoZW4gdHJhbnNmZXIKQEAgLTE2MCwxMiArMTc5LDEyIEBACiAJICovCiAJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQogCQlwZGF0YS0+c2V0X21wdV93a3VwX2xhdCA9IG9tYXBfcG1fc2V0X21heF9tcHVfd2FrZXVwX2xhdF9jb21wYXQ7Ci0Jb2QgPSBvbWFwX2RldmljZV9idWlsZChuYW1lLCBidXNfaWQsIG9oLCBwZGF0YSwKKwlwZGV2ID0gb21hcF9kZXZpY2VfYnVpbGQobmFtZSwgYnVzX2lkLCBvaCwgcGRhdGEsCiAJCQlzaXplb2Yoc3RydWN0IG9tYXBfaTJjX2J1c19wbGF0Zm9ybV9kYXRhKSwKLQkJCW9tYXBfaTJjX2xhdGVuY3ksIEFSUkFZX1NJWkUob21hcF9pMmNfbGF0ZW5jeSksIDApOwotCVdBUk4oSVNfRVJSKG9kKSwgIkNvdWxkIG5vdCBidWlsZCBvbWFwX2RldmljZSBmb3IgJXNcbiIsIG5hbWUpOworCQkJTlVMTCwgMCwgMCk7CisJV0FSTihJU19FUlIocGRldiksICJDb3VsZCBub3QgYnVpbGQgb21hcF9kZXZpY2UgZm9yICVzXG4iLCBuYW1lKTsKIAotCXJldHVybiBQVFJfRVJSKG9kKTsKKwlyZXR1cm4gUFRSX1JFVChwZGV2KTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBvbWFwMl9pMmNfYWRkX2J1cyhpbnQgYnVzX2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jbG9jay5oCmluZGV4IGRmNGI5NjguLjE5N2NhMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY2xvY2suaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2Nsb2NrLmgKQEAgLTgwLDggKzgwLDYgQEAKICAqCiAgKiBAZGl2IGlzIHRoZSBkaXZpc29yIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHBhcmVudCBjbG9jaydzIHJhdGUKICAqIHRvIHByb2R1Y2UgdGhlIGN1cnJlbnQgY2xvY2sncyByYXRlLgotICoKLSAqIFhYWCBAZmxhZ3MgcHJvYmFibHkgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYW4gc3RydWN0IG9tYXBfY2hpcC4KICAqLwogc3RydWN0IGNsa3NlbF9yYXRlIHsKIAl1MzIJCQl2YWw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jb21tb24uaAppbmRleCA0NTY0Y2M2Li5jNTBkZjQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY29tbW9uLmgKQEAgLTQ1LDYgKzQ1LDE4IEBACiAKIGV4dGVybiB2b2lkIG9tYXBfcmVzZXJ2ZSh2b2lkKTsKIAordm9pZCBvbWFwMjQyMF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCBvbWFwMjQzMF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCBvbWFwMzQzMF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCBvbWFwMzV4eF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCBvbWFwMzYzMF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCBvbWFwM19pbml0X2Vhcmx5KHZvaWQpOwkvKiBEbyBub3QgdXNlIHRoaXMgb25lICovCit2b2lkIGFtMzV4eF9pbml0X2Vhcmx5KHZvaWQpOwordm9pZCB0aTgxNnhfaW5pdF9lYXJseSh2b2lkKTsKK3ZvaWQgb21hcDQ0MzBfaW5pdF9lYXJseSh2b2lkKTsKKwordm9pZCBvbWFwX3NyYW1faW5pdCh2b2lkKTsKKwogLyoKICAqIElPIGJhc2VzIGZvciB2YXJpb3VzIE9NQVAgcHJvY2Vzc29ycwogICogRXhjZXB0IHRoZSB0YXAgYmFzZSwgcmVzdCBhbGwgdGhlIGlvIGJhc2VzCkBAIC01MywxMyArNjUsMTMgQEAKIHN0cnVjdCBvbWFwX2dsb2JhbHMgewogCXUzMgkJY2xhc3M7CQkvKiBPTUFQIGNsYXNzIHRvIGRldGVjdCAqLwogCXZvaWQgX19pb21lbQkqdGFwOwkJLyogQ29udHJvbCBtb2R1bGUgSUQgY29kZSAqLwotCXVuc2lnbmVkIGxvbmcgICBzZHJjOyAgICAgICAgICAgLyogU0RSQU0gQ29udHJvbGxlciAqLwotCXVuc2lnbmVkIGxvbmcgICBzbXM7ICAgICAgICAgICAgLyogU0RSQU0gTWVtb3J5IFNjaGVkdWxlciAqLwotCXVuc2lnbmVkIGxvbmcgICBjdHJsOyAgICAgICAgICAgLyogU3lzdGVtIENvbnRyb2wgTW9kdWxlICovCi0JdW5zaWduZWQgbG9uZyAgIGN0cmxfcGFkOwkvKiBQQUQgQ29udHJvbCBNb2R1bGUgKi8KLQl1bnNpZ25lZCBsb25nICAgcHJtOyAgICAgICAgICAgIC8qIFBvd2VyIGFuZCBSZXNldCBNYW5hZ2VtZW50ICovCi0JdW5zaWduZWQgbG9uZyAgIGNtOyAgICAgICAgICAgICAvKiBDbG9jayBNYW5hZ2VtZW50ICovCi0JdW5zaWduZWQgbG9uZyAgIGNtMjsKKwl2b2lkIF9faW9tZW0JKnNkcmM7ICAgICAgICAgICAvKiBTRFJBTSBDb250cm9sbGVyICovCisJdm9pZCBfX2lvbWVtCSpzbXM7ICAgICAgICAgICAgLyogU0RSQU0gTWVtb3J5IFNjaGVkdWxlciAqLworCXZvaWQgX19pb21lbQkqY3RybDsgICAgICAgICAgIC8qIFN5c3RlbSBDb250cm9sIE1vZHVsZSAqLworCXZvaWQgX19pb21lbQkqY3RybF9wYWQ7CS8qIFBBRCBDb250cm9sIE1vZHVsZSAqLworCXZvaWQgX19pb21lbQkqcHJtOyAgICAgICAgICAgIC8qIFBvd2VyIGFuZCBSZXNldCBNYW5hZ2VtZW50ICovCisJdm9pZCBfX2lvbWVtCSpjbTsgICAgICAgICAgICAgLyogQ2xvY2sgTWFuYWdlbWVudCAqLworCXZvaWQgX19pb21lbQkqY20yOwogfTsKIAogdm9pZCBvbWFwMl9zZXRfZ2xvYmFsc18yNDJ4KHZvaWQpOwpAQCAtNzQsNyArODYsMTEgQEAKIHZvaWQgb21hcDJfc2V0X2dsb2JhbHNfY29udHJvbChzdHJ1Y3Qgb21hcF9nbG9iYWxzICopOwogdm9pZCBvbWFwMl9zZXRfZ2xvYmFsc19wcmNtKHN0cnVjdCBvbWFwX2dsb2JhbHMgKik7CiAKK3ZvaWQgb21hcDI0MnhfbWFwX2lvKHZvaWQpOwordm9pZCBvbWFwMjQzeF9tYXBfaW8odm9pZCk7CiB2b2lkIG9tYXAzX21hcF9pbyh2b2lkKTsKK3ZvaWQgb21hcDRfbWFwX2lvKHZvaWQpOworCiAKIC8qKgogICogb21hcF90ZXN0X3RpbWVvdXQgLSBidXN5LWxvb3AsIHRlc3RpbmcgYSBjb25kaXRpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY3B1LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2NwdS5oCmluZGV4IDY3YjNkNzUuLjQwOGExMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvY3B1LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9jcHUuaApAQCAtNDQsMTMgKzQ0LDYgQEAKIAogaW50IG9tYXBfdHlwZSh2b2lkKTsKIAotc3RydWN0IG9tYXBfY2hpcF9pZCB7Ci0JdTE2IG9jOwotCXU4IHR5cGU7Ci19OwotCi0jZGVmaW5lIE9NQVBfQ0hJUF9JTklUKHgpCXsgLm9jID0geCB9Ci0KIC8qCiAgKiBvbWFwX3JldiBiaXRzOgogICogQ1BVIGlkIGJpdHMJKDA3MzAsIDE1MTAsIDE3MTAsIDI0MjIuLi4pCVszMToxNl0KQEAgLTYwLDE5ICs1Myw2IEBACiB1bnNpZ25lZCBpbnQgb21hcF9yZXYodm9pZCk7CiAKIC8qCi0gKiBEZWZpbmUgQ1BVIHJldmlzaW9uIGJpdHMKLSAqCi0gKiBWZXJib3NlIG1lYW5pbmcgb2YgdGhlIHJldmlzaW9uIGJpdHMgbWF5IGJlIGRpZmZlcmVudCBmb3IgYSBzaWxpY29uCi0gKiBmYW1pbHkuIFRoaXMgZGlmZmVyZW5jZSBjYW4gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICovCi0jZGVmaW5lIE9NQVBfUkVWQklUU18wMAkJMHgwMAotI2RlZmluZSBPTUFQX1JFVkJJVFNfMDEJCTB4MDEKLSNkZWZpbmUgT01BUF9SRVZCSVRTXzAyCQkweDAyCi0jZGVmaW5lIE9NQVBfUkVWQklUU18wMwkJMHgwMwotI2RlZmluZSBPTUFQX1JFVkJJVFNfMDQJCTB4MDQKLSNkZWZpbmUgT01BUF9SRVZCSVRTXzA1CQkweDA1Ci0KLS8qCiAgKiBHZXQgdGhlIENQVSByZXZpc2lvbiBmb3IgT01BUCBkZXZpY2VzCiAgKi8KICNkZWZpbmUgR0VUX09NQVBfUkVWSVNJT04oKQkoKG9tYXBfcmV2KCkgPj4gOCkgJiAweGZmKQpAQCAtMjYyLDcgKzI0Miw3IEBACiBJU19PTUFQX1RZUEUoMjQyMywgMHgyNDIzKQogSVNfT01BUF9UWVBFKDI0MzAsIDB4MjQzMCkKIElTX09NQVBfVFlQRSgzNDMwLCAweDM0MzApCi1JU19PTUFQX1RZUEUoMzUwNSwgMHgzNTA1KQorSVNfT01BUF9UWVBFKDM1MDUsIDB4MzUxNykKIElTX09NQVBfVFlQRSgzNTE3LCAweDM1MTcpCiAKICNkZWZpbmUgY3B1X2lzX29tYXAzMTAoKQkJMApAQCAtMzU0LDggKzMzNCw5IEBACiAJCQkJCQkoIW9tYXAzX2hhc19zZ3goKSkgJiYJXAogCQkJCQkJKG9tYXAzX2hhc19pdmEoKSkpCiAjIGRlZmluZSBjcHVfaXNfb21hcDM1MzAoKQkJKGNwdV9pc19vbWFwMzQzMCgpKQotIyBkZWZpbmUgY3B1X2lzX29tYXAzNTA1KCkJCWlzX29tYXAzNTA1KCkKICMgZGVmaW5lIGNwdV9pc19vbWFwMzUxNygpCQlpc19vbWFwMzUxNygpCisjIGRlZmluZSBjcHVfaXNfb21hcDM1MDUoKQkJKGNwdV9pc19vbWFwMzUxNygpICYmCQlcCisJCQkJCQkhb21hcDNfaGFzX3NneCgpKQogIyB1bmRlZiBjcHVfaXNfb21hcDM2MzAKICMgZGVmaW5lIGNwdV9pc19vbWFwMzYzMCgpCQlpc19vbWFwMzYzeCgpCiAjIGRlZmluZSBjcHVfaXNfdGk4MTZ4KCkJCWlzX3RpODE2eCgpCkBAIC0zNzksMzUgKzM2MCwzMSBAQAogLyogVmFyaW91cyBzaWxpY29uIHJldmlzaW9ucyBmb3Igb21hcDIgKi8KICNkZWZpbmUgT01BUDI0MlhfQ0xBU1MJCTB4MjQyMDAwMjQKICNkZWZpbmUgT01BUDI0MjBfUkVWX0VTMV8wCU9NQVAyNDJYX0NMQVNTCi0jZGVmaW5lIE9NQVAyNDIwX1JFVl9FUzJfMAkoT01BUDI0MlhfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzAxIDw8IDgpKQorI2RlZmluZSBPTUFQMjQyMF9SRVZfRVMyXzAJKE9NQVAyNDJYX0NMQVNTIHwgKDB4MSA8PCA4KSkKIAogI2RlZmluZSBPTUFQMjQzWF9DTEFTUwkJMHgyNDMwMDAyNAogI2RlZmluZSBPTUFQMjQzMF9SRVZfRVMxXzAJT01BUDI0M1hfQ0xBU1MKIAogI2RlZmluZSBPTUFQMzQzWF9DTEFTUwkJMHgzNDMwMDAzNAogI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMxXzAJT01BUDM0M1hfQ0xBU1MKLSNkZWZpbmUgT01BUDM0MzBfUkVWX0VTMl8wCShPTUFQMzQzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDEgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzJfMQkoT01BUDM0M1hfQ0xBU1MgfCAoT01BUF9SRVZCSVRTXzAyIDw8IDgpKQotI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMzXzAJKE9NQVAzNDNYX0NMQVNTIHwgKE9NQVBfUkVWQklUU18wMyA8PCA4KSkKLSNkZWZpbmUgT01BUDM0MzBfUkVWX0VTM18xCShPTUFQMzQzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDQgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzNfMV8yCShPTUFQMzQzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDUgPDwgOCkpCisjZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzJfMAkoT01BUDM0M1hfQ0xBU1MgfCAoMHgxIDw8IDgpKQorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMyXzEJKE9NQVAzNDNYX0NMQVNTIHwgKDB4MiA8PCA4KSkKKyNkZWZpbmUgT01BUDM0MzBfUkVWX0VTM18wCShPTUFQMzQzWF9DTEFTUyB8ICgweDMgPDwgOCkpCisjZGVmaW5lIE9NQVAzNDMwX1JFVl9FUzNfMQkoT01BUDM0M1hfQ0xBU1MgfCAoMHg0IDw8IDgpKQorI2RlZmluZSBPTUFQMzQzMF9SRVZfRVMzXzFfMgkoT01BUDM0M1hfQ0xBU1MgfCAoMHg1IDw8IDgpKQogCiAjZGVmaW5lIE9NQVAzNjNYX0NMQVNTCQkweDM2MzAwMDM0CiAjZGVmaW5lIE9NQVAzNjMwX1JFVl9FUzFfMAlPTUFQMzYzWF9DTEFTUwotI2RlZmluZSBPTUFQMzYzMF9SRVZfRVMxXzEJKE9NQVAzNjNYX0NMQVNTIHwgKE9NQVBfUkVWQklUU18wMSA8PCA4KSkKLSNkZWZpbmUgT01BUDM2MzBfUkVWX0VTMV8yCShPTUFQMzYzWF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDIgPDwgOCkpCisjZGVmaW5lIE9NQVAzNjMwX1JFVl9FUzFfMQkoT01BUDM2M1hfQ0xBU1MgfCAoMHgxIDw8IDgpKQorI2RlZmluZSBPTUFQMzYzMF9SRVZfRVMxXzIJKE9NQVAzNjNYX0NMQVNTIHwgKDB4MiA8PCA4KSkKIAotI2RlZmluZSBPTUFQMzVYWF9DTEFTUwkJMHgzNTAwMDAzNAotI2RlZmluZSBPTUFQMzUwM19SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MDMgPDwgMTYpIHwgKHYgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNTE1X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUxNSA8PCAxNikgfCAodiA8PCA4KSkKLSNkZWZpbmUgT01BUDM1MjVfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTI1IDw8IDE2KSB8ICh2IDw8IDgpKQotI2RlZmluZSBPTUFQMzUzMF9SRVYodikJCShPTUFQMzVYWF9DTEFTUyB8ICgweDM1MzAgPDwgMTYpIHwgKHYgPDwgOCkpCi0jZGVmaW5lIE9NQVAzNTA1X1JFVih2KQkJKE9NQVAzNVhYX0NMQVNTIHwgKDB4MzUwNSA8PCAxNikgfCAodiA8PCA4KSkKLSNkZWZpbmUgT01BUDM1MTdfUkVWKHYpCQkoT01BUDM1WFhfQ0xBU1MgfCAoMHgzNTE3IDw8IDE2KSB8ICh2IDw8IDgpKQorI2RlZmluZSBPTUFQMzUxN19DTEFTUwkJMHgzNTE3MDAzNAorI2RlZmluZSBPTUFQMzUxN19SRVZfRVMxXzAJT01BUDM1MTdfQ0xBU1MKKyNkZWZpbmUgT01BUDM1MTdfUkVWX0VTMV8xCShPTUFQMzUxN19DTEFTUyB8ICgweDEgPDwgOCkpCiAKICNkZWZpbmUgVEk4MTZYX0NMQVNTCQkweDgxNjAwMDM0CiAjZGVmaW5lIFRJODE2OF9SRVZfRVMxXzAJVEk4MTZYX0NMQVNTCi0jZGVmaW5lIFRJODE2OF9SRVZfRVMxXzEJKFRJODE2WF9DTEFTUyB8IChPTUFQX1JFVkJJVFNfMDEgPDwgOCkpCisjZGVmaW5lIFRJODE2OF9SRVZfRVMxXzEJKFRJODE2WF9DTEFTUyB8ICgweDEgPDwgOCkpCiAKICNkZWZpbmUgT01BUDQ0M1hfQ0xBU1MJCTB4NDQzMDAwNDQKICNkZWZpbmUgT01BUDQ0MzBfUkVWX0VTMV8wCShPTUFQNDQzWF9DTEFTUyB8ICgweDEwIDw8IDgpKQpAQCAtNDE4LDY1ICszOTUsMTcgQEAKICNkZWZpbmUgT01BUDQ0NlhfQ0xBU1MJCTB4NDQ2MDAwNDQKICNkZWZpbmUgT01BUDQ0NjBfUkVWX0VTMV8wCShPTUFQNDQ2WF9DTEFTUyB8ICgweDEwIDw8IDgpKQogCi0vKgotICogb21hcF9jaGlwIGJpdHMKLSAqCi0gKiBDSElQX0lTX09NQVB7MjQyMCwyNDMwLDM0MzB9IGluZGljYXRlIHRoYXQgYSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBpcwotICogdmFsaWQgb24gYWxsIGNoaXBzIG9mIHRoYXQgdHlwZS4gIENISVBfSVNfT01BUDM0MzBFU3sxLDJ9IGluZGljYXRlcwotICogc29tZXRoaW5nIHRoYXQgaXMgb25seSB2YWxpZCBvbiB0aGF0IHBhcnRpY3VsYXIgRVMgcmV2aXNpb24uCi0gKgotICogVGhlc2UgYml0cyBtYXkgYmUgT1JlZCB0b2dldGhlciB0byBpbmRpY2F0ZSBzdHJ1Y3R1cmVzIHRoYXQgYXJlCi0gKiBhdmFpbGFibGUgb24gbXVsdGlwbGUgY2hpcCB0eXBlcy4KLSAqCi0gKiBUbyB0ZXN0IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBtYXRjaGVzIHRoZSBjdXJyZW50IE9NQVAgY2hpcCB0eXBlLAotICogdXNlIG9tYXBfY2hpcF9pcygpLgotICoKLSAqLwotI2RlZmluZSBDSElQX0lTX09NQVAyNDIwCQkoMSA8PCAwKQotI2RlZmluZSBDSElQX0lTX09NQVAyNDMwCQkoMSA8PCAxKQotI2RlZmluZSBDSElQX0lTX09NQVAzNDMwCQkoMSA8PCAyKQotI2RlZmluZSBDSElQX0lTX09NQVAzNDMwRVMxCQkoMSA8PCAzKQotI2RlZmluZSBDSElQX0lTX09NQVAzNDMwRVMyCQkoMSA8PCA0KQotI2RlZmluZSBDSElQX0lTX09NQVAzNDMwRVMzXzAJCSgxIDw8IDUpCi0jZGVmaW5lIENISVBfSVNfT01BUDM0MzBFUzNfMQkJKDEgPDwgNikKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzYzMEVTMQkJKDEgPDwgNykKLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQzMEVTMQkJKDEgPDwgOCkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQMzYzMEVTMV8xICAgICAgICAgICAoMSA8PCA5KQotI2RlZmluZSBDSElQX0lTX09NQVAzNjMwRVMxXzIgICAgICAgICAgICgxIDw8IDEwKQotI2RlZmluZSBDSElQX0lTX09NQVA0NDMwRVMyCQkoMSA8PCAxMSkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQzMEVTMl8xCQkoMSA8PCAxMikKLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQzMEVTMl8yCQkoMSA8PCAxMykKLSNkZWZpbmUgQ0hJUF9JU19USTgxNlgJCQkoMSA8PCAxNCkKLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQ2MEVTMV8wCQkoMSA8PCAxNSkKLQotI2RlZmluZSBDSElQX0lTX09NQVAyNFhYCQkoQ0hJUF9JU19PTUFQMjQyMCB8IENISVBfSVNfT01BUDI0MzApCi0KLSNkZWZpbmUgQ0hJUF9JU19PTUFQNDQzMAkJKENISVBfSVNfT01BUDQ0MzBFUzEgfAkJXAotCQkJCQkgQ0hJUF9JU19PTUFQNDQzMEVTMiB8CQlcCi0JCQkJCSBDSElQX0lTX09NQVA0NDMwRVMyXzEgfAlcCi0JCQkJCSBDSElQX0lTX09NQVA0NDMwRVMyXzIgfAlcCi0JCQkJCSBDSElQX0lTX09NQVA0NDYwRVMxXzApCi0KLS8qCi0gKiAiR0UiIGhlcmUgcmVwcmVzZW50cyAiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIiBpbiB0ZXJtcyBvZiBFUwotICogbGV2ZWxzLiAgU28gQ0hJUF9HRV9PTUFQMzQzMEVTMiBpcyBpbnRlbmRlZCB0byBtYXRjaCBhbGwgT01BUDM0MzAKLSAqIGNoaXBzIGF0IEVTMiBhbmQgYmV5b25kLCBidXQgbm90LCBmb3IgZXhhbXBsZSwgYW55IE9NQVAgbGluZXMgYWZ0ZXIKLSAqIE9NQVAzLgotICovCi0jZGVmaW5lIENISVBfR0VfT01BUDM0MzBFUzIJCShDSElQX0lTX09NQVAzNDMwRVMyIHwgXAotCQkJCQkgQ0hJUF9JU19PTUFQMzQzMEVTM18wIHwgXAotCQkJCQkgQ0hJUF9HRV9PTUFQMzQzMEVTM18xKQotI2RlZmluZSBDSElQX0dFX09NQVAzNDMwRVMzXzEJCShDSElQX0lTX09NQVAzNDMwRVMzXzEgfCBcCi0JCQkJCSBDSElQX0lTX09NQVAzNjMwRVMxIHwgXAotCQkJCQkgQ0hJUF9HRV9PTUFQMzYzMEVTMV8xKQotI2RlZmluZSBDSElQX0dFX09NQVAzNjMwRVMxXzEJCShDSElQX0lTX09NQVAzNjMwRVMxXzEgfCBcCi0JCQkJCSBDSElQX0lTX09NQVAzNjMwRVMxXzIpCi0KLWludCBvbWFwX2NoaXBfaXMoc3RydWN0IG9tYXBfY2hpcF9pZCBvY2kpOwogdm9pZCBvbWFwMl9jaGVja19yZXZpc2lvbih2b2lkKTsKIAogLyoKICAqIFJ1bnRpbWUgZGV0ZWN0aW9uIG9mIE9NQVAzIGZlYXR1cmVzCisgKgorICogT01BUDNfSEFTX0lPX0NIQUlOX0NUUkw6IFNvbWUgbGF0ZXIgbWVtYmVycyBvZiB0aGUgT01BUDMgY2hpcAorICogICAgZmFtaWx5IGhhdmUgT1MtbGV2ZWwgY29udHJvbCBvdmVyIHRoZSBJL08gY2hhaW4gY2xvY2suICBUaGlzIGlzCisgKiAgICB0byBhdm9pZCBhIHdpbmRvdyBkdXJpbmcgd2hpY2ggd2FrZXVwcyBjb3VsZCBwb3RlbnRpYWxseSBiZSBsb3N0CisgKiAgICBkdXJpbmcgcG93ZXJkb21haW4gdHJhbnNpdGlvbnMuICBJZiB0aGlzIGJpdCBpcyBzZXQsIGl0CisgKiAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpcCBkb2VzIHN1cHBvcnQgT1MtbGV2ZWwgY29udHJvbCBvZiB0aGlzCisgKiAgICBmZWF0dXJlLgogICovCiBleHRlcm4gdTMyIG9tYXBfZmVhdHVyZXM7CiAKQEAgLTQ4OCw5ICs0MTcsMTAgQEAKICNkZWZpbmUgT01BUDNfSEFTXzE5Mk1IWl9DTEsJCUJJVCg1KQogI2RlZmluZSBPTUFQM19IQVNfSU9fV0FLRVVQCQlCSVQoNikKICNkZWZpbmUgT01BUDNfSEFTX1NEUkMJCQlCSVQoNykKLSNkZWZpbmUgT01BUDRfSEFTX01QVV8xR0haCQlCSVQoOCkKLSNkZWZpbmUgT01BUDRfSEFTX01QVV8xXzJHSFoJCUJJVCg5KQotI2RlZmluZSBPTUFQNF9IQVNfTVBVXzFfNUdIWgkJQklUKDEwKQorI2RlZmluZSBPTUFQM19IQVNfSU9fQ0hBSU5fQ1RSTAkJQklUKDgpCisjZGVmaW5lIE9NQVA0X0hBU19NUFVfMUdIWgkJQklUKDkpCisjZGVmaW5lIE9NQVA0X0hBU19NUFVfMV8yR0haCQlCSVQoMTApCisjZGVmaW5lIE9NQVA0X0hBU19NUFVfMV81R0haCQlCSVQoMTEpCiAKIAogI2RlZmluZSBPTUFQM19IQVNfRkVBVFVSRShmZWF0LGZsYWcpCQkJXApAQCAtNTA3LDEyICs0MzcsMTEgQEAKIE9NQVAzX0hBU19GRUFUVVJFKDE5Mm1oel9jbGssIDE5Mk1IWl9DTEspCiBPTUFQM19IQVNfRkVBVFVSRShpb193YWtldXAsIElPX1dBS0VVUCkKIE9NQVAzX0hBU19GRUFUVVJFKHNkcmMsIFNEUkMpCitPTUFQM19IQVNfRkVBVFVSRShpb19jaGFpbl9jdHJsLCBJT19DSEFJTl9DVFJMKQogCiAvKgogICogUnVudGltZSBkZXRlY3Rpb24gb2YgT01BUDQgZmVhdHVyZXMKICAqLwotZXh0ZXJuIHUzMiBvbWFwX2ZlYXR1cmVzOwotCiAjZGVmaW5lIE9NQVA0X0hBU19GRUFUVVJFKGZlYXQsIGZsYWcpCQkJXAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb21hcDRfaGFzXyAjI2ZlYXQodm9pZCkJXAogewkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtdGltZXIuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZG10aW1lci5oCmluZGV4IGViNWQxNmMuLjk0MThmMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZG10aW1lci5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZG10aW1lci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvZG10aW1lci5oCisgKiBhcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2RtdGltZXIuaAogICoKICAqIE9NQVAgRHVhbC1Nb2RlIFRpbWVycwogICoKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpZm5kZWYgX19BU01fQVJDSF9ETVRJTUVSX0gKICNkZWZpbmUgX19BU01fQVJDSF9ETVRJTUVSX0gKQEAgLTU5LDEyICs2MCw1NiBAQAogICogaW4gT01BUDQgY2FuIGJlIGRpc3Rpbmd1aXNoZWQuCiAgKi8KICNkZWZpbmUgT01BUF9USU1FUl9JUF9WRVJTSU9OXzEgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogdGltZXIgY2FwYWJpbGl0aWVzIHVzZWQgaW4gaHdtb2QgZGF0YWJhc2UgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9TRUNVUkUJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBPTUFQX1RJTUVSX0FMV09OCQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgT01BUF9USU1FUl9IQVNfUFdNCQkJCTB4MjAwMDAwMDAKKworc3RydWN0IG9tYXBfdGltZXJfY2FwYWJpbGl0eV9kZXZfYXR0ciB7CisJdTMyIHRpbWVyX2NhcGFiaWxpdHk7Cit9OworCiBzdHJ1Y3Qgb21hcF9kbV90aW1lcjsKIHN0cnVjdCBjbGs7CiAKK3N0cnVjdCB0aW1lcl9yZWdzIHsKKwl1MzIgdGlkcjsKKwl1MzIgdGlvY3BfY2ZnOworCXUzMiB0aXN0YXQ7CisJdTMyIHRpc3I7CisJdTMyIHRpZXI7CisJdTMyIHR3ZXI7CisJdTMyIHRjbHI7CisJdTMyIHRjcnI7CisJdTMyIHRsZHI7CisJdTMyIHR0cmc7CisJdTMyIHR3cHM7CisJdTMyIHRtYXI7CisJdTMyIHRjYXIxOworCXUzMiB0c2ljcjsKKwl1MzIgdGNhcjI7CisJdTMyIHRwaXI7CisJdTMyIHRuaXI7CisJdTMyIHRjdnI7CisJdTMyIHRvY3I7CisJdTMyIHRvd3I7Cit9OworCitzdHJ1Y3QgZG10aW1lcl9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCpzZXRfdGltZXJfc3JjKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgc291cmNlKTsKKwlpbnQgdGltZXJfaXBfdmVyc2lvbjsKKwl1MzIgbmVlZHNfbWFudWFsX3Jlc2V0OjE7CisJYm9vbCByZXNlcnZlZDsKKworCWJvb2wgbG9zZXNfY29udGV4dDsKKworCWludCAoKmdldF9jb250ZXh0X2xvc3NfY291bnQpKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9OworCiBzdHJ1Y3Qgb21hcF9kbV90aW1lciAqb21hcF9kbV90aW1lcl9yZXF1ZXN0KHZvaWQpOwogc3RydWN0IG9tYXBfZG1fdGltZXIgKm9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyhpbnQgdGltZXJfaWQpOwotdm9pZCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK2ludCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKIHZvaWQgb21hcF9kbV90aW1lcl9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKIHZvaWQgb21hcF9kbV90aW1lcl9kaXNhYmxlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiAKQEAgLTczLDIzICsxMTgsMjMgQEAKIHUzMiBvbWFwX2RtX3RpbWVyX21vZGlmeV9pZGxlY3RfbWFzayh1MzIgaW5wdXRtYXNrKTsKIHN0cnVjdCBjbGsgKm9tYXBfZG1fdGltZXJfZ2V0X2ZjbGsoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKIAotdm9pZCBvbWFwX2RtX3RpbWVyX3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpOwotdm9pZCBvbWFwX2RtX3RpbWVyX3N0b3Aoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK2ludCBvbWFwX2RtX3RpbWVyX3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKK2ludCBvbWFwX2RtX3RpbWVyX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CitpbnQgb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiAKIGludCBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2Uoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgc291cmNlKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkX3N0YXJ0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGF1dG9yZWxvYWQsIHVuc2lnbmVkIGludCB2YWx1ZSk7Ci12b2lkIG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGVuYWJsZSwgdW5zaWduZWQgaW50IG1hdGNoKTsKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfcHdtKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGRlZl9vbiwgaW50IHRvZ2dsZSwgaW50IHRyaWdnZXIpOwotdm9pZCBvbWFwX2RtX3RpbWVyX3NldF9wcmVzY2FsZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgcHJlc2NhbGVyKTsKK2ludCBvbWFwX2RtX3RpbWVyX3NldF9sb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGF1dG9yZWxvYWQsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitpbnQgb21hcF9kbV90aW1lcl9zZXRfbG9hZF9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBhdXRvcmVsb2FkLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworaW50IG9tYXBfZG1fdGltZXJfc2V0X21hdGNoKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IGVuYWJsZSwgdW5zaWduZWQgaW50IG1hdGNoKTsKK2ludCBvbWFwX2RtX3RpbWVyX3NldF9wd20oc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCBpbnQgZGVmX29uLCBpbnQgdG9nZ2xlLCBpbnQgdHJpZ2dlcik7CitpbnQgb21hcF9kbV90aW1lcl9zZXRfcHJlc2NhbGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgaW50IHByZXNjYWxlcik7CiAKLXZvaWQgb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitpbnQgb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CiAKIHVuc2lnbmVkIGludCBvbWFwX2RtX3RpbWVyX3JlYWRfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7Ci12b2lkIG9tYXBfZG1fdGltZXJfd3JpdGVfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKTsKK2ludCBvbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCB2YWx1ZSk7CiB1bnNpZ25lZCBpbnQgb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKTsKLXZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdW5zaWduZWQgaW50IHZhbHVlKTsKK2ludCBvbWFwX2RtX3RpbWVyX3dyaXRlX2NvdW50ZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpOwogCiBpbnQgb21hcF9kbV90aW1lcnNfYWN0aXZlKHZvaWQpOwogCkBAIC05OCwxMiArMTQzLDMwIEBACiAgKiB1c2VkIGJ5IGRtdGltZXIuYyBhbmQgc3lzX3RpbWVyIHJlbGF0ZWQgY29kZS4KICAqLwogCi0vKiByZWdpc3RlciBvZmZzZXRzICovCi0jZGVmaW5lIF9PTUFQX1RJTUVSX0lEX09GRlNFVAkJMHgwMAotI2RlZmluZSBfT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVAkweDEwCi0jZGVmaW5lIF9PTUFQX1RJTUVSX1NZU19TVEFUX09GRlNFVAkweDE0Ci0jZGVmaW5lIF9PTUFQX1RJTUVSX1NUQVRfT0ZGU0VUCQkweDE4Ci0jZGVmaW5lIF9PTUFQX1RJTUVSX0lOVF9FTl9PRkZTRVQJMHgxYworLyoKKyAqIFRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB2MSBhbmQgdjIgaXAuCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIG9mZnNldHMgZnJvbSB0aW1lci0+aW9iYXNlLgorICovCisjZGVmaW5lIE9NQVBfVElNRVJfSURfT0ZGU0VUCQkweDAwCisjZGVmaW5lIE9NQVBfVElNRVJfT0NQX0NGR19PRkZTRVQJMHgxMAorCisjZGVmaW5lIE9NQVBfVElNRVJfVjFfU1lTX1NUQVRfT0ZGU0VUCTB4MTQKKyNkZWZpbmUgT01BUF9USU1FUl9WMV9TVEFUX09GRlNFVAkweDE4CisjZGVmaW5lIE9NQVBfVElNRVJfVjFfSU5UX0VOX09GRlNFVAkweDFjCisKKyNkZWZpbmUgT01BUF9USU1FUl9WMl9JUlFTVEFUVVNfUkFXCTB4MjQKKyNkZWZpbmUgT01BUF9USU1FUl9WMl9JUlFTVEFUVVMJCTB4MjgKKyNkZWZpbmUgT01BUF9USU1FUl9WMl9JUlFFTkFCTEVfU0VUCTB4MmMKKyNkZWZpbmUgT01BUF9USU1FUl9WMl9JUlFFTkFCTEVfQ0xSCTB4MzAKKworLyoKKyAqIFRoZSBmdW5jdGlvbmFsIHJlZ2lzdGVycyBoYXZlIGEgZGlmZmVyZW50IGJhc2Ugb24gdjEgYW5kIHYyIGlwLgorICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBvZmZzZXRzIGZyb20gdGltZXItPmZ1bmNfYmFzZS4gVGhlIGZ1bmNfYmFzZQorICogaXMgc2FtYWUgYXMgaW9fYmFzZSBmb3IgdjEgYW5kIGlvX2Jhc2UgKyAweDE0IGZvciB2MiBpcC4KKyAqCisgKi8KKyNkZWZpbmUgT01BUF9USU1FUl9WMl9GVU5DX09GRlNFVAkJMHgxNAorCiAjZGVmaW5lIF9PTUFQX1RJTUVSX1dBS0VVUF9FTl9PRkZTRVQJMHgyMAogI2RlZmluZSBfT01BUF9USU1FUl9DVFJMX09GRlNFVAkJMHgyNAogI2RlZmluZQkJT01BUF9USU1FUl9DVFJMX0dQT0NGRwkJKDEgPDwgMTQpCkBAIC0xNDcsMjEgKzIxMCw2IEBACiAvKiByZWdpc3RlciBvZmZzZXRzIHdpdGggdGhlIHdyaXRlIHBlbmRpbmcgYml0IGVuY29kZWQgKi8KICNkZWZpbmUJV1BTSElGVAkJCQkJMTYKIAotI2RlZmluZSBPTUFQX1RJTUVSX0lEX1JFRwkJCShfT01BUF9USU1FUl9JRF9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9PQ1BfQ0ZHX1JFRwkJCShfT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX1NZU19TVEFUX1JFRwkJCShfT01BUF9USU1FUl9TWVNfU1RBVF9PRkZTRVQgXAotCQkJCQkJCXwgKFdQX05PTkUgPDwgV1BTSElGVCkpCi0KLSNkZWZpbmUgT01BUF9USU1FUl9TVEFUX1JFRwkJCShfT01BUF9USU1FUl9TVEFUX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQotI2RlZmluZSBPTUFQX1RJTUVSX0lOVF9FTl9SRUcJCQkoX09NQVBfVElNRVJfSU5UX0VOX09GRlNFVCBcCi0JCQkJCQkJfCAoV1BfTk9ORSA8PCBXUFNISUZUKSkKLQogI2RlZmluZSBPTUFQX1RJTUVSX1dBS0VVUF9FTl9SRUcJCShfT01BUF9USU1FUl9XQUtFVVBfRU5fT0ZGU0VUIFwKIAkJCQkJCQl8IChXUF9OT05FIDw8IFdQU0hJRlQpKQogCkBAIC0yMDksNDkgKzI1Nyw4OCBAQAogCiBzdHJ1Y3Qgb21hcF9kbV90aW1lciB7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CisJaW50IGlkOwogCWludCBpcnE7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCiAJc3RydWN0IGNsayAqaWNsaywgKmZjbGs7Ci0jZW5kaWYKLQl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CisKKwl2b2lkIF9faW9tZW0JKmlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtCSpzeXNfc3RhdDsJLyogVElTVEFUIHRpbWVyIHN0YXR1cyAqLworCXZvaWQgX19pb21lbQkqaXJxX3N0YXQ7CS8qIFRJU1IvSVJRU1RBVFVTIGludGVycnVwdCBzdGF0dXMgKi8KKwl2b2lkIF9faW9tZW0JKmlycV9lbmE7CS8qIGlycSBlbmFibGUgKi8KKwl2b2lkIF9faW9tZW0JKmlycV9kaXM7CS8qIGlycSBkaXNhYmxlLCBvbmx5IG9uIHYyIGlwICovCisJdm9pZCBfX2lvbWVtCSpwZW5kOwkJLyogd3JpdGUgcGVuZGluZyAqLworCXZvaWQgX19pb21lbQkqZnVuY19iYXNlOwkvKiBmdW5jdGlvbiByZWdpc3RlciBiYXNlICovCisKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAJdW5zaWduZWQgcmVzZXJ2ZWQ6MTsKLQl1bnNpZ25lZCBlbmFibGVkOjE7CiAJdW5zaWduZWQgcG9zdGVkOjE7CisJc3RydWN0IHRpbWVyX3JlZ3MgY29udGV4dDsKKwlib29sIGxvc2VzX2NvbnRleHQ7CisJaW50IGN0eF9sb3NzX2NvdW50OworCWludCByZXZpc2lvbjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKworCWludCAoKmdldF9jb250ZXh0X2xvc3NfY291bnQpKHN0cnVjdCBkZXZpY2UgKmRldik7CiB9OwogCi1leHRlcm4gdTMyIHN5c190aW1lcl9yZXNlcnZlZDsKLXZvaWQgb21hcF9kbV90aW1lcl9wcmVwYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CitpbnQgb21hcF9kbV90aW1lcl9wcmVwYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcik7CiAKLXN0YXRpYyBpbmxpbmUgdTMyIF9fb21hcF9kbV90aW1lcl9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywKK3N0YXRpYyBpbmxpbmUgdTMyIF9fb21hcF9kbV90aW1lcl9yZWFkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwgdTMyIHJlZywKIAkJCQkJCWludCBwb3N0ZWQpCiB7CiAJaWYgKHBvc3RlZCkKLQkJd2hpbGUgKF9fcmF3X3JlYWRsKGJhc2UgKyAoT01BUF9USU1FUl9XUklURV9QRU5EX1JFRyAmIDB4ZmYpKQotCQkJCSYgKHJlZyA+PiBXUFNISUZUKSkKKwkJd2hpbGUgKF9fcmF3X3JlYWRsKHRpbWVyLT5wZW5kKSAmIChyZWcgPj4gV1BTSElGVCkpCiAJCQljcHVfcmVsYXgoKTsKIAotCXJldHVybiBfX3Jhd19yZWFkbChiYXNlICsgKHJlZyAmIDB4ZmYpKTsKKwlyZXR1cm4gX19yYXdfcmVhZGwodGltZXItPmZ1bmNfYmFzZSArIChyZWcgJiAweGZmKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfd3JpdGUodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcmVnLCB1MzIgdmFsLAotCQkJCQkJaW50IHBvc3RlZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfd3JpdGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCQl1MzIgcmVnLCB1MzIgdmFsLCBpbnQgcG9zdGVkKQogewogCWlmIChwb3N0ZWQpCi0JCXdoaWxlIChfX3Jhd19yZWFkbChiYXNlICsgKE9NQVBfVElNRVJfV1JJVEVfUEVORF9SRUcgJiAweGZmKSkKLQkJCQkmIChyZWcgPj4gV1BTSElGVCkpCisJCXdoaWxlIChfX3Jhd19yZWFkbCh0aW1lci0+cGVuZCkgJiAocmVnID4+IFdQU0hJRlQpKQogCQkJY3B1X3JlbGF4KCk7CiAKLQlfX3Jhd193cml0ZWwodmFsLCBiYXNlICsgKHJlZyAmIDB4ZmYpKTsKKwlfX3Jhd193cml0ZWwodmFsLCB0aW1lci0+ZnVuY19iYXNlICsgKHJlZyAmIDB4ZmYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9pbml0X3JlZ3Moc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXUzMiB0aWRyOworCisJLyogQXNzdW1lIHYxIGlwIGlmIGJpdHMgWzMxOjE2XSBhcmUgemVybyAqLworCXRpZHIgPSBfX3Jhd19yZWFkbCh0aW1lci0+aW9fYmFzZSk7CisJaWYgKCEodGlkciA+PiAxNikpIHsKKwkJdGltZXItPnJldmlzaW9uID0gMTsKKwkJdGltZXItPnN5c19zdGF0ID0gdGltZXItPmlvX2Jhc2UgKworCQkJCU9NQVBfVElNRVJfVjFfU1lTX1NUQVRfT0ZGU0VUOworCQl0aW1lci0+aXJxX3N0YXQgPSB0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfVjFfU1RBVF9PRkZTRVQ7CisJCXRpbWVyLT5pcnFfZW5hID0gdGltZXItPmlvX2Jhc2UgKyBPTUFQX1RJTUVSX1YxX0lOVF9FTl9PRkZTRVQ7CisJCXRpbWVyLT5pcnFfZGlzID0gMDsKKwkJdGltZXItPnBlbmQgPSB0aW1lci0+aW9fYmFzZSArIF9PTUFQX1RJTUVSX1dSSVRFX1BFTkRfT0ZGU0VUOworCQl0aW1lci0+ZnVuY19iYXNlID0gdGltZXItPmlvX2Jhc2U7CisJfSBlbHNlIHsKKwkJdGltZXItPnJldmlzaW9uID0gMjsKKwkJdGltZXItPnN5c19zdGF0ID0gMDsKKwkJdGltZXItPmlycV9zdGF0ID0gdGltZXItPmlvX2Jhc2UgKyBPTUFQX1RJTUVSX1YyX0lSUVNUQVRVUzsKKwkJdGltZXItPmlycV9lbmEgPSB0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfVjJfSVJRRU5BQkxFX1NFVDsKKwkJdGltZXItPmlycV9kaXMgPSB0aW1lci0+aW9fYmFzZSArIE9NQVBfVElNRVJfVjJfSVJRRU5BQkxFX0NMUjsKKwkJdGltZXItPnBlbmQgPSB0aW1lci0+aW9fYmFzZSArCisJCQlfT01BUF9USU1FUl9XUklURV9QRU5EX09GRlNFVCArCisJCQkJT01BUF9USU1FUl9WMl9GVU5DX09GRlNFVDsKKwkJdGltZXItPmZ1bmNfYmFzZSA9IHRpbWVyLT5pb19iYXNlICsgT01BUF9USU1FUl9WMl9GVU5DX09GRlNFVDsKKwl9CiB9CiAKIC8qIEFzc3VtZXMgdGhlIHNvdXJjZSBjbG9jayBoYXMgYmVlbiBzZXQgYnkgY2FsbGVyICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3Jlc2V0KHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGF1dG9pZGxlLAotCQkJCQkJaW50IHdha2V1cCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfcmVzZXQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCQlpbnQgYXV0b2lkbGUsIGludCB3YWtldXApCiB7CiAJdTMyIGw7CiAKLQlsID0gX19vbWFwX2RtX3RpbWVyX3JlYWQoYmFzZSwgT01BUF9USU1FUl9PQ1BfQ0ZHX1JFRywgMCk7CisJbCA9IF9fcmF3X3JlYWRsKHRpbWVyLT5pb19iYXNlICsgT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVCk7CiAJbCB8PSAweDAyIDw8IDM7ICAvKiBTZXQgdG8gc21hcnQtaWRsZSBtb2RlICovCiAJbCB8PSAweDIgPDwgODsgICAvKiBTZXQgY2xvY2sgYWN0aXZpdHkgdG8gcGVyc2VydmUgZi1jbG9jayBvbiBpZGxlICovCiAKQEAgLTI2MSwxMCArMzQ4LDEwIEBACiAJaWYgKHdha2V1cCkKIAkJbCB8PSAxIDw8IDI7CiAKLQlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9PQ1BfQ0ZHX1JFRywgbCwgMCk7CisJX19yYXdfd3JpdGVsKGwsIHRpbWVyLT5pb19iYXNlICsgT01BUF9USU1FUl9PQ1BfQ0ZHX09GRlNFVCk7CiAKIAkvKiBNYXRjaCBoYXJkd2FyZSByZXNldCBkZWZhdWx0IG9mIHBvc3RlZCBtb2RlICovCi0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfSUZfQ1RSTF9SRUcsCisJX19vbWFwX2RtX3RpbWVyX3dyaXRlKHRpbWVyLCBPTUFQX1RJTUVSX0lGX0NUUkxfUkVHLAogCQkJCQlPTUFQX1RJTUVSX0NUUkxfUE9TVEVELCAwKTsKIH0KIApAQCAtMjg2LDE4ICszNzMsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3N0b3Aodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgcG9zdGVkLAotCQkJCQkJdW5zaWduZWQgbG9uZyByYXRlKQorc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9zdG9wKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKKwkJCQkJaW50IHBvc3RlZCwgdW5zaWduZWQgbG9uZyByYXRlKQogewogCXUzMiBsOwogCi0JbCA9IF9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIHBvc3RlZCk7CisJbCA9IF9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBwb3N0ZWQpOwogCWlmIChsICYgT01BUF9USU1FUl9DVFJMX1NUKSB7CiAJCWwgJj0gfjB4MTsKLQkJX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwsIHBvc3RlZCk7CisJCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCwgcG9zdGVkKTsKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKIAkJLyogUmVhZGJhY2sgdG8gbWFrZSBzdXJlIHdyaXRlIGhhcyBjb21wbGV0ZWQgKi8KLQkJX19vbWFwX2RtX3RpbWVyX3JlYWQoYmFzZSwgT01BUF9USU1FUl9DVFJMX1JFRywgcG9zdGVkKTsKKwkJX19vbWFwX2RtX3RpbWVyX3JlYWQodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIHBvc3RlZCk7CiAJCS8qCiAJCSAqIFdhaXQgZm9yIGZ1bmN0aW9uYWwgY2xvY2sgcGVyaW9kIHggMy41IHRvIG1ha2Ugc3VyZSB0aGF0CiAJCSAqIHRpbWVyIGlzIHN0b3BwZWQKQEAgLTMwNywzNCArMzk0LDM0IEBACiAJfQogCiAJLyogQWNrIHBvc3NpYmx5IHBlbmRpbmcgaW50ZXJydXB0ICovCi0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfU1RBVF9SRUcsCi0JCQkJCU9NQVBfVElNRVJfSU5UX09WRVJGTE9XLCAwKTsKKwlfX3Jhd193cml0ZWwoT01BUF9USU1FUl9JTlRfT1ZFUkZMT1csIHRpbWVyLT5pcnFfc3RhdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX29tYXBfZG1fdGltZXJfbG9hZF9zdGFydCh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBjdHJsLAotCQkJCQkJdW5zaWduZWQgaW50IGxvYWQsIGludCBwb3N0ZWQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX2xvYWRfc3RhcnQoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCQkJdTMyIGN0cmwsIHVuc2lnbmVkIGludCBsb2FkLAorCQkJCQkJaW50IHBvc3RlZCkKIHsKLQlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywgbG9hZCwgcG9zdGVkKTsKLQlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9DVFJMX1JFRywgY3RybCwgcG9zdGVkKTsKKwlfX29tYXBfZG1fdGltZXJfd3JpdGUodGltZXIsIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcsIGxvYWQsIHBvc3RlZCk7CisJX19vbWFwX2RtX3RpbWVyX3dyaXRlKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBjdHJsLCBwb3N0ZWQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX2ludF9lbmFibGUodm9pZCBfX2lvbWVtICpiYXNlLAorc3RhdGljIGlubGluZSB2b2lkIF9fb21hcF9kbV90aW1lcl9pbnRfZW5hYmxlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lciwKIAkJCQkJCXVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQlfX29tYXBfZG1fdGltZXJfd3JpdGUoYmFzZSwgT01BUF9USU1FUl9JTlRfRU5fUkVHLCB2YWx1ZSwgMCk7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfV0FLRVVQX0VOX1JFRywgdmFsdWUsIDApOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgdGltZXItPmlycV9lbmEpOworCV9fb21hcF9kbV90aW1lcl93cml0ZSh0aW1lciwgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHLCB2YWx1ZSwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIodm9pZCBfX2lvbWVtICpiYXNlLAotCQkJCQkJCWludCBwb3N0ZWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorX19vbWFwX2RtX3RpbWVyX3JlYWRfY291bnRlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBwb3N0ZWQpCiB7Ci0JcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKGJhc2UsIE9NQVBfVElNRVJfQ09VTlRFUl9SRUcsIHBvc3RlZCk7CisJcmV0dXJuIF9fb21hcF9kbV90aW1lcl9yZWFkKHRpbWVyLCBPTUFQX1RJTUVSX0NPVU5URVJfUkVHLCBwb3N0ZWQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyh2b2lkIF9faW9tZW0gKmJhc2UsCitzdGF0aWMgaW5saW5lIHZvaWQgX19vbWFwX2RtX3RpbWVyX3dyaXRlX3N0YXR1cyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsCiAJCQkJCQl1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JX19vbWFwX2RtX3RpbWVyX3dyaXRlKGJhc2UsIE9NQVBfVElNRVJfU1RBVF9SRUcsIHZhbHVlLCAwKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIHRpbWVyLT5pcnFfc3RhdCk7CiB9CiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0RNVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwaW8uaAppbmRleCA5MWU4ZGUzLi45ZTg2ZWUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwaW8uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2dwaW8uaApAQCAtMjIyLDI2ICsyMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgogCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBfX2dwaW9fZ2V0X3ZhbHVlKGdwaW8pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCV9fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX2NhbnNsZWVwKHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gX19ncGlvX3RvX2lycShncGlvKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQogewogCWludCB0bXA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvLmgKaW5kZXggZDcyZWM4NS4uN2YyOTY5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW8uaApAQCAtMjI4LDEzICsyMjgsMTMgQEAKIAogI2RlZmluZSBPTUFQNDRYWF9FTUlGMl9QSFlTCU9NQVA0NFhYX0VNSUYyX0JBU0UKIAkJCQkJCS8qIDB4NGQwMDAwMDAgLS0+IDB4ZmQyMDAwMDAgKi8KLSNkZWZpbmUgT01BUDQ0WFhfRU1JRjJfVklSVAkoT01BUDQ0WFhfRU1JRjJfUEhZUyArIE9NQVA0X0wzX1BFUl9JT19PRkZTRVQpCiAjZGVmaW5lIE9NQVA0NFhYX0VNSUYyX1NJWkUJU1pfMU0KKyNkZWZpbmUgT01BUDQ0WFhfRU1JRjJfVklSVAkoT01BUDQ0WFhfRU1JRjFfVklSVCArIE9NQVA0NFhYX0VNSUYxX1NJWkUpCiAKICNkZWZpbmUgT01BUDQ0WFhfRE1NX1BIWVMJT01BUDQ0WFhfRE1NX0JBU0UKIAkJCQkJCS8qIDB4NGUwMDAwMDAgLS0+IDB4ZmQzMDAwMDAgKi8KLSNkZWZpbmUgT01BUDQ0WFhfRE1NX1ZJUlQJKE9NQVA0NFhYX0RNTV9QSFlTICsgT01BUDRfTDNfUEVSX0lPX09GRlNFVCkKICNkZWZpbmUgT01BUDQ0WFhfRE1NX1NJWkUJU1pfMU0KKyNkZWZpbmUgT01BUDQ0WFhfRE1NX1ZJUlQJKE9NQVA0NFhYX0VNSUYyX1ZJUlQgKyBPTUFQNDRYWF9FTUlGMl9TSVpFKQogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE9tYXAgc3BlY2lmaWMgcmVnaXN0ZXIgYWNjZXNzCkBAIC0yNDcsNiArMjQ3LDggQEAKICAqIE5PVEU6IFBsZWFzZSB1c2UgaW9yZW1hcCArIF9fcmF3X3JlYWQvd3JpdGUgd2hlcmUgcG9zc2libGUgaW5zdGVhZCBvZiB0aGVzZQogICovCiAKK3ZvaWQgb21hcF9pb3JlbWFwX2luaXQodm9pZCk7CisKIGV4dGVybiB1OCBvbWFwX3JlYWRiKHUzMiBwYSk7CiBleHRlcm4gdTE2IG9tYXBfcmVhZHcodTMyIHBhKTsKIGV4dGVybiB1MzIgb21hcF9yZWFkbCh1MzIgcGEpOwpAQCAtMjU2LDggKzI1OCwzMSBAQAogCiBzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtczsKIAotZXh0ZXJuIHZvaWQgb21hcDFfbWFwX2NvbW1vbl9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXAxX2luaXRfY29tbW9uX2h3KHZvaWQpOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQODUwKQordm9pZCBvbWFwN3h4X21hcF9pbyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9tYXBfaW8odm9pZCkKK3sKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKK3ZvaWQgb21hcDE1eHhfbWFwX2lvKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMTV4eF9tYXBfaW8odm9pZCkKK3sKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKK3ZvaWQgb21hcDE2eHhfbWFwX2lvKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMTZ4eF9tYXBfaW8odm9pZCkKK3sKK30KKyNlbmRpZgorCit2b2lkIG9tYXAxX2luaXRfZWFybHkodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfU09DX09NQVAyNDIwCiBleHRlcm4gdm9pZCBvbWFwMjQyeF9tYXBfY29tbW9uX2lvKHZvaWQpOwpAQCAtMzAwLDcgKzMyNSw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUodm9pZCk7Ci1leHRlcm4gdm9pZCBvbWFwMl9pbml0X2NvbW1vbl9kZXZpY2VzKHN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX2NzMCwKK2V4dGVybiB2b2lkIG9tYXBfc2RyY19pbml0KHN0cnVjdCBvbWFwX3NkcmNfcGFyYW1zICpzZHJjX2NzMCwKIAkJCQkgICAgICBzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19jczEpOwogCiAjZGVmaW5lIF9fYXJjaF9pb3JlbWFwCW9tYXBfaW9yZW1hcApAQCAtMzA5LDYgKzMzNCw4IEBACiB2b2lkIF9faW9tZW0gKm9tYXBfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSk7CiB2b2lkIG9tYXBfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwogCitleHRlcm4gdm9pZCBfX2luaXQgb21hcF9pbml0X2NvbnNpc3RlbnRfZG1hX3NpemUodm9pZCk7CisKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9tbXUuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9tbXUuaAppbmRleCAxNzRmMWI5Li5hMWQ3OWVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11LmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb21tdS5oCkBAIC0yNSwxNiArMjUsMTcgQEAKIAl9OwogfTsKIAotc3RydWN0IGlvbW11IHsKK3N0cnVjdCBvbWFwX2lvbW11IHsKIAljb25zdCBjaGFyCSpuYW1lOwogCXN0cnVjdCBtb2R1bGUJKm93bmVyOwogCXN0cnVjdCBjbGsJKmNsazsKIAl2b2lkIF9faW9tZW0JKnJlZ2Jhc2U7CiAJc3RydWN0IGRldmljZQkqZGV2OwogCXZvaWQJCSppc3JfcHJpdjsKKwlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47CiAKIAl1bnNpZ25lZCBpbnQJcmVmY291bnQ7Ci0Jc3RydWN0IG11dGV4CWlvbW11X2xvY2s7CS8qIGdsb2JhbCBmb3IgdGhpcyB3aG9sZSBvYmplY3QgKi8KKwlzcGlubG9ja190CWlvbW11X2xvY2s7CS8qIGdsb2JhbCBmb3IgdGhpcyB3aG9sZSBvYmplY3QgKi8KIAogCS8qCiAJICogV2UgZG9uJ3QgY2hhbmdlIGlvcGdkIGZvciBhIHNpdHVhdGlvbiBsaWtlIHBnZCBmb3IgYSB0YXNrLApAQCAtNDgsOCArNDksNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbW1hcDsKIAlzdHJ1Y3QgbXV0ZXgJCW1tYXBfbG9jazsgLyogcHJvdGVjdCBtbWFwICovCiAKLQlpbnQgKCppc3IpKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBpb21tdV9lcnJzLCB2b2lkICpwcml2KTsKLQogCXZvaWQgKmN0eDsgLyogaW9tbXUgY29udGV4dDogcmVnaXN0cmVzIHNhdmVkIGFyZWEgKi8KIAl1MzIgZGFfc3RhcnQ7CiAJdTMyIGRhX2VuZDsKQEAgLTgxLDI1ICs4MCwyNyBAQAogc3RydWN0IGlvbW11X2Z1bmN0aW9ucyB7CiAJdW5zaWduZWQgbG9uZwl2ZXJzaW9uOwogCi0JaW50ICgqZW5hYmxlKShzdHJ1Y3QgaW9tbXUgKm9iaik7Ci0Jdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBpb21tdSAqb2JqKTsKLQl2b2lkICgqc2V0X3R3bCkoc3RydWN0IGlvbW11ICpvYmosIGJvb2wgb24pOwotCXUzMiAoKmZhdWx0X2lzcikoc3RydWN0IGlvbW11ICpvYmosIHUzMiAqcmEpOworCWludCAoKmVuYWJsZSkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaik7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopOworCXZvaWQgKCpzZXRfdHdsKShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBib29sIG9uKTsKKwl1MzIgKCpmYXVsdF9pc3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiAqcmEpOwogCi0Jdm9pZCAoKnRsYl9yZWFkX2NyKShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKTsKLQl2b2lkICgqdGxiX2xvYWRfY3IpKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IpOworCXZvaWQgKCp0bGJfcmVhZF9jcikoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKTsKKwl2b2lkICgqdGxiX2xvYWRfY3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcik7CiAKLQlzdHJ1Y3QgY3JfcmVncyAqKCphbGxvY19jcikoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7CisJc3RydWN0IGNyX3JlZ3MgKigqYWxsb2NfY3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosCisJCQkJCQkJc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKIAlpbnQgKCpjcl92YWxpZCkoc3RydWN0IGNyX3JlZ3MgKmNyKTsKIAl1MzIgKCpjcl90b192aXJ0KShzdHJ1Y3QgY3JfcmVncyAqY3IpOwogCXZvaWQgKCpjcl90b19lKShzdHJ1Y3QgY3JfcmVncyAqY3IsIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7Ci0Jc3NpemVfdCAoKmR1bXBfY3IpKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsIGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKmR1bXBfY3IpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjciwKKwkJCQkJCQljaGFyICpidWYpOwogCiAJdTMyICgqZ2V0X3B0ZV9hdHRyKShzdHJ1Y3QgaW90bGJfZW50cnkgKmUpOwogCi0Jdm9pZCAoKnNhdmVfY3R4KShzdHJ1Y3QgaW9tbXUgKm9iaik7Ci0Jdm9pZCAoKnJlc3RvcmVfY3R4KShzdHJ1Y3QgaW9tbXUgKm9iaik7Ci0Jc3NpemVfdCAoKmR1bXBfY3R4KShzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbik7CisJdm9pZCAoKnNhdmVfY3R4KShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKTsKKwl2b2lkICgqcmVzdG9yZV9jdHgpKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopOworCXNzaXplX3QgKCpkdW1wX2N0eCkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbik7CiB9OwogCiBzdHJ1Y3QgaW9tbXVfcGxhdGZvcm1fZGF0YSB7CkBAIC0xNTAsNDAgKzE1MSwzMSBAQAogLyoKICAqIGdsb2JhbCBmdW5jdGlvbnMKICAqLwotZXh0ZXJuIHUzMiBpb21tdV9hcmNoX3ZlcnNpb24odm9pZCk7CitleHRlcm4gdTMyIG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uKHZvaWQpOwogCi1leHRlcm4gdm9pZCBpb3RsYl9jcl90b19lKHN0cnVjdCBjcl9yZWdzICpjciwgc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKLWV4dGVybiB1MzIgaW90bGJfY3JfdG9fdmlydChzdHJ1Y3QgY3JfcmVncyAqY3IpOworZXh0ZXJuIHZvaWQgb21hcF9pb3RsYl9jcl90b19lKHN0cnVjdCBjcl9yZWdzICpjciwgc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKIAotZXh0ZXJuIGludCBsb2FkX2lvdGxiX2VudHJ5KHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpOwotZXh0ZXJuIHZvaWQgaW9tbXVfc2V0X3R3bChzdHJ1Y3QgaW9tbXUgKm9iaiwgYm9vbCBvbik7Ci1leHRlcm4gdm9pZCBmbHVzaF9pb3RsYl9wYWdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOwotZXh0ZXJuIHZvaWQgZmx1c2hfaW90bGJfcmFuZ2Uoc3RydWN0IGlvbW11ICpvYmosIHUzMiBzdGFydCwgdTMyIGVuZCk7Ci1leHRlcm4gdm9pZCBmbHVzaF9pb3RsYl9hbGwoc3RydWN0IGlvbW11ICpvYmopOworZXh0ZXJuIGludAorb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKTsKIAotZXh0ZXJuIGludCBpb3BndGFibGVfc3RvcmVfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSk7Ci1leHRlcm4gdm9pZCBpb3BndGFibGVfbG9va3VwX2VudHJ5KHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiAqKnBwZ2QsCi0JCQkJICAgdTMyICoqcHB0ZSk7Ci1leHRlcm4gc2l6ZV90IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGlvdmEpOwotCi1leHRlcm4gaW50IGlvbW11X3NldF9kYV9yYW5nZShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIHN0YXJ0LCB1MzIgZW5kKTsKLWV4dGVybiBzdHJ1Y3QgaW9tbXUgKmlvbW11X2dldChjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIGlvbW11X3B1dChzdHJ1Y3QgaW9tbXUgKm9iaik7Ci1leHRlcm4gaW50IGlvbW11X3NldF9pc3IoY29uc3QgY2hhciAqbmFtZSwKLQkJCSBpbnQgKCppc3IpKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBpb21tdV9lcnJzLAorZXh0ZXJuIGludCBvbWFwX2lvbW11X3NldF9pc3IoY29uc3QgY2hhciAqbmFtZSwKKwkJIGludCAoKmlzcikoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgaW9tbXVfZXJycywKIAkJCQkgICAgdm9pZCAqcHJpdiksCiAJCQkgdm9pZCAqaXNyX3ByaXYpOwogCi1leHRlcm4gdm9pZCBpb21tdV9zYXZlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaik7Ci1leHRlcm4gdm9pZCBpb21tdV9yZXN0b3JlX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaik7CitleHRlcm4gdm9pZCBvbWFwX2lvbW11X3NhdmVfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmopOworZXh0ZXJuIHZvaWQgb21hcF9pb21tdV9yZXN0b3JlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKTsKIAotZXh0ZXJuIGludCBpbnN0YWxsX2lvbW11X2FyY2goY29uc3Qgc3RydWN0IGlvbW11X2Z1bmN0aW9ucyAqb3BzKTsKLWV4dGVybiB2b2lkIHVuaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcyk7CitleHRlcm4gaW50IG9tYXBfaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcyk7CitleHRlcm4gdm9pZCBvbWFwX3VuaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcyk7CiAKLWV4dGVybiBpbnQgZm9yZWFjaF9pb21tdV9kZXZpY2Uodm9pZCAqZGF0YSwKK2V4dGVybiBpbnQgb21hcF9mb3JlYWNoX2lvbW11X2RldmljZSh2b2lkICpkYXRhLAogCQkJCWludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogCi1leHRlcm4gc3NpemVfdCBpb21tdV9kdW1wX2N0eChzdHJ1Y3QgaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbik7Ci1leHRlcm4gc2l6ZV90IGR1bXBfdGxiX2VudHJpZXMoc3RydWN0IGlvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pOworZXh0ZXJuIHNzaXplX3QKK29tYXBfaW9tbXVfZHVtcF9jdHgoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbik7CitleHRlcm4gc2l6ZV90CitvbWFwX2R1bXBfdGxiX2VudHJpZXMoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgY2hhciAqYnVmLCBzc2l6ZV90IGxlbik7CitzdHJ1Y3QgZGV2aWNlICpvbWFwX2ZpbmRfaW9tbXVfZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAjZW5kaWYgLyogX19NQUNIX0lPTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9tbXUyLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11Mi5oCmluZGV4IDEwYWQwNWYuLmQ0MTE2YjU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvbW11Mi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9tbXUyLmgKQEAgLTgzLDEyICs4MywxMiBAQAogLyoKICAqIHJlZ2lzdGVyIGFjY2Vzc29ycwogICovCi1zdGF0aWMgaW5saW5lIHUzMiBpb21tdV9yZWFkX3JlZyhzdHJ1Y3QgaW9tbXUgKm9iaiwgc2l6ZV90IG9mZnMpCitzdGF0aWMgaW5saW5lIHUzMiBpb21tdV9yZWFkX3JlZyhzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzaXplX3Qgb2ZmcykKIHsKIAlyZXR1cm4gX19yYXdfcmVhZGwob2JqLT5yZWdiYXNlICsgb2Zmcyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV93cml0ZV9yZWcoc3RydWN0IGlvbW11ICpvYmosIHUzMiB2YWwsIHNpemVfdCBvZmZzKQorc3RhdGljIGlubGluZSB2b2lkIGlvbW11X3dyaXRlX3JlZyhzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgdmFsLCBzaXplX3Qgb2ZmcykKIHsKIAlfX3Jhd193cml0ZWwodmFsLCBvYmotPnJlZ2Jhc2UgKyBvZmZzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW9wZ3RhYmxlLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvcGd0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTgxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvcGd0YWJsZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogb21hcCBpb21tdTogcGFnZXRhYmxlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IEhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19QTEFUX09NQVBfSU9NTVVfSAorI2RlZmluZSBfX1BMQVRfT01BUF9JT01NVV9ICisKKy8qCisgKiAiTDIgdGFibGUiIGFkZHJlc3MgbWFzayBhbmQgc2l6ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBJT1BHRF9TSElGVAkJMjAKKyNkZWZpbmUgSU9QR0RfU0laRQkJKDFVTCA8PCBJT1BHRF9TSElGVCkKKyNkZWZpbmUgSU9QR0RfTUFTSwkJKH4oSU9QR0RfU0laRSAtIDEpKQorCisvKgorICogInNlY3Rpb24iIGFkZHJlc3MgbWFzayBhbmQgc2l6ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBJT1NFQ1RJT05fU0hJRlQJCTIwCisjZGVmaW5lIElPU0VDVElPTl9TSVpFCQkoMVVMIDw8IElPU0VDVElPTl9TSElGVCkKKyNkZWZpbmUgSU9TRUNUSU9OX01BU0sJCSh+KElPU0VDVElPTl9TSVpFIC0gMSkpCisKKy8qCisgKiAic3VwZXJzZWN0aW9uIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgSU9TVVBFUl9TSElGVAkJMjQKKyNkZWZpbmUgSU9TVVBFUl9TSVpFCQkoMVVMIDw8IElPU1VQRVJfU0hJRlQpCisjZGVmaW5lIElPU1VQRVJfTUFTSwkJKH4oSU9TVVBFUl9TSVpFIC0gMSkpCisKKyNkZWZpbmUgUFRSU19QRVJfSU9QR0QJCSgxVUwgPDwgKDMyIC0gSU9QR0RfU0hJRlQpKQorI2RlZmluZSBJT1BHRF9UQUJMRV9TSVpFCShQVFJTX1BFUl9JT1BHRCAqIHNpemVvZih1MzIpKQorCisvKgorICogInNtYWxsIHBhZ2UiIGFkZHJlc3MgbWFzayBhbmQgc2l6ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBJT1BURV9TSElGVAkJMTIKKyNkZWZpbmUgSU9QVEVfU0laRQkJKDFVTCA8PCBJT1BURV9TSElGVCkKKyNkZWZpbmUgSU9QVEVfTUFTSwkJKH4oSU9QVEVfU0laRSAtIDEpKQorCisvKgorICogImxhcmdlIHBhZ2UiIGFkZHJlc3MgbWFzayBhbmQgc2l6ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBJT0xBUkdFX1NISUZUCQkxNgorI2RlZmluZSBJT0xBUkdFX1NJWkUJCSgxVUwgPDwgSU9MQVJHRV9TSElGVCkKKyNkZWZpbmUgSU9MQVJHRV9NQVNLCQkofihJT0xBUkdFX1NJWkUgLSAxKSkKKworI2RlZmluZSBQVFJTX1BFUl9JT1BURQkJKDFVTCA8PCAoSU9QR0RfU0hJRlQgLSBJT1BURV9TSElGVCkpCisjZGVmaW5lIElPUFRFX1RBQkxFX1NJWkUJKFBUUlNfUEVSX0lPUFRFICogc2l6ZW9mKHUzMikpCisKKyNkZWZpbmUgSU9QQUdFX01BU0sJCUlPUFRFX01BU0sKKworLyoqCisgKiBvbWFwX2lvbW11X3RyYW5zbGF0ZSgpIC0gdmEgdG8gcGEgdHJhbnNsYXRpb24KKyAqIEBkOgkJb21hcCBpb21tdSBkZXNjcmlwdG9yCisgKiBAdmE6CQl2aXJ0dWFsIGFkZHJlc3MKKyAqIEBtYXNrOglvbWFwIGlvbW11IGRlc2NyaXB0b3IgbWFzaworICoKKyAqIHZhIHRvIHBhIHRyYW5zbGF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3Qgb21hcF9pb21tdV90cmFuc2xhdGUodTMyIGQsIHUzMiB2YSwgdTMyIG1hc2spCit7CisJcmV0dXJuIChkICYgbWFzaykgfCAodmEgJiAofm1hc2spKTsKK30KKworLyoKKyAqIHNvbWUgZGVzY3JpcHRvciBhdHRyaWJ1dGVzLgorICovCisjZGVmaW5lIElPUEdEX1RBQkxFCQkoMSA8PCAwKQorI2RlZmluZSBJT1BHRF9TRUNUSU9OCQkoMiA8PCAwKQorI2RlZmluZSBJT1BHRF9TVVBFUgkJKDEgPDwgMTggfCAyIDw8IDApCisKKyNkZWZpbmUgaW9wZ2RfaXNfdGFibGUoeCkJKCgoeCkgJiAzKSA9PSBJT1BHRF9UQUJMRSkKKyNkZWZpbmUgaW9wZ2RfaXNfc2VjdGlvbih4KQkoKCh4KSAmICgxIDw8IDE4IHwgMykpID09IElPUEdEX1NFQ1RJT04pCisjZGVmaW5lIGlvcGdkX2lzX3N1cGVyKHgpCSgoKHgpICYgKDEgPDwgMTggfCAzKSkgPT0gSU9QR0RfU1VQRVIpCisKKyNkZWZpbmUgSU9QVEVfU01BTEwJCSgyIDw8IDApCisjZGVmaW5lIElPUFRFX0xBUkdFCQkoMSA8PCAwKQorCisjZGVmaW5lIGlvcHRlX2lzX3NtYWxsKHgpCSgoKHgpICYgMikgPT0gSU9QVEVfU01BTEwpCisjZGVmaW5lIGlvcHRlX2lzX2xhcmdlKHgpCSgoKHgpICYgMykgPT0gSU9QVEVfTEFSR0UpCisKKy8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLworI2RlZmluZSBpb3BnZF9pbmRleChkYSkJCSgoKGRhKSA+PiBJT1BHRF9TSElGVCkgJiAoUFRSU19QRVJfSU9QR0QgLSAxKSkKKyNkZWZpbmUgaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpCSgob2JqKS0+aW9wZ2QgKyBpb3BnZF9pbmRleChkYSkpCisKKyNkZWZpbmUgaW9wZ2RfcGFnZV9wYWRkcihpb3BnZCkJKCppb3BnZCAmIH4oKDEgPDwgMTApIC0gMSkpCisjZGVmaW5lIGlvcGdkX3BhZ2VfdmFkZHIoaW9wZ2QpCSgodTMyICopcGh5c190b192aXJ0KGlvcGdkX3BhZ2VfcGFkZHIoaW9wZ2QpKSkKKworLyogdG8gZmluZCBhbiBlbnRyeSBpbiB0aGUgc2Vjb25kLWxldmVsIHBhZ2UgdGFibGUuICovCisjZGVmaW5lIGlvcHRlX2luZGV4KGRhKQkJKCgoZGEpID4+IElPUFRFX1NISUZUKSAmIChQVFJTX1BFUl9JT1BURSAtIDEpKQorI2RlZmluZSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKQkoaW9wZ2RfcGFnZV92YWRkcihpb3BnZCkgKyBpb3B0ZV9pbmRleChkYSkpCisKK3N0YXRpYyBpbmxpbmUgdTMyIGlvdGxiX2luaXRfZW50cnkoc3RydWN0IGlvdGxiX2VudHJ5ICplLCB1MzIgZGEsIHUzMiBwYSwKKwkJCQkgICB1MzIgZmxhZ3MpCit7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCisJZS0+ZGEJCT0gZGE7CisJZS0+cGEJCT0gcGE7CisJZS0+dmFsaWQJPSAxOworCS8qIEZJWE1FOiBhZGQgT01BUDEgc3VwcG9ydCAqLworCWUtPnBnc3oJCT0gZmxhZ3MgJiBNTVVfQ0FNX1BHU1pfTUFTSzsKKwllLT5lbmRpYW4JPSBmbGFncyAmIE1NVV9SQU1fRU5ESUFOX01BU0s7CisJZS0+ZWxzegkJPSBmbGFncyAmIE1NVV9SQU1fRUxTWl9NQVNLOworCWUtPm1peGVkCT0gZmxhZ3MgJiBNTVVfUkFNX01JWEVEX01BU0s7CisKKwlyZXR1cm4gaW9wZ3N6X3RvX2J5dGVzKGUtPnBnc3opOworfQorCisjZGVmaW5lIHRvX2lvbW11KGRldikJCQkJCQkJXAorCShzdHJ1Y3Qgb21hcF9pb21tdSAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKQorCisjZW5kaWYgLyogX19QTEFUX09NQVBfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9pb3ZtbS5oCmluZGV4IGU5OTJiOTYuLjZhZjFhOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvaW92bW0uaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2lvdm1tLmgKQEAgLTEzLDggKzEzLDEwIEBACiAjaWZuZGVmIF9fSU9NTVVfTU1BUF9ICiAjZGVmaW5lIF9fSU9NTVVfTU1BUF9ICiAKKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgorCiBzdHJ1Y3QgaW92bV9zdHJ1Y3QgewotCXN0cnVjdCBpb21tdQkJKmlvbW11OwkvKiBpb21tdSBvYmplY3Qgd2hpY2ggdGhpcyBiZWxvbmdzIHRvICovCisJc3RydWN0IG9tYXBfaW9tbXUJKmlvbW11OwkvKiBpb21tdSBvYmplY3Qgd2hpY2ggdGhpcyBiZWxvbmdzIHRvICovCiAJdTMyCQkJZGFfc3RhcnQ7IC8qIGFyZWEgZGVmaW5pdGlvbiAqLwogCXUzMgkJCWRhX2VuZDsKIAl1MzIJCQlmbGFnczsgLyogSU9WTUZfOiBzZWUgYmVsb3cgKi8KQEAgLTcwLDIwICs3MiwxOCBAQAogI2RlZmluZSBJT1ZNRl9EQV9GSVhFRAkJKDEgPDwgKDQgKyBJT1ZNRl9TV19TSElGVCkpCiAKIAotZXh0ZXJuIHN0cnVjdCBpb3ZtX3N0cnVjdCAqZmluZF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSk7Ci1leHRlcm4gdTMyIGlvbW11X3ZtYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwKK2V4dGVybiBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm9tYXBfZmluZF9pb3ZtX2FyZWEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKTsKK2V4dGVybiB1MzIKK29tYXBfaW9tbXVfdm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwKIAkJCWNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LCB1MzIgZmxhZ3MpOwotZXh0ZXJuIHN0cnVjdCBzZ190YWJsZSAqaW9tbXVfdnVubWFwKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOwotZXh0ZXJuIHUzMiBpb21tdV92bWFsbG9jKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHNpemVfdCBieXRlcywKLQkJCSAgIHUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBpb21tdV92ZnJlZShzdHJ1Y3QgaW9tbXUgKm9iaiwgY29uc3QgdTMyIGRhKTsKLWV4dGVybiB1MzIgaW9tbXVfa21hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHNpemVfdCBieXRlcywKLQkJCXUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBpb21tdV9rdW5tYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSk7Ci1leHRlcm4gdTMyIGlvbW11X2ttYWxsb2Moc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgc2l6ZV90IGJ5dGVzLAotCQkJICAgdTMyIGZsYWdzKTsKLWV4dGVybiB2b2lkIGlvbW11X2tmcmVlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpOwotCi1leHRlcm4gdm9pZCAqZGFfdG9fdmEoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSk7CitleHRlcm4gc3RydWN0IHNnX3RhYmxlICpvbWFwX2lvbW11X3Z1bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKTsKK2V4dGVybiB1MzIKK29tYXBfaW9tbXVfdm1hbGxvYyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosCisJCQkJdTMyIGRhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncyk7CitleHRlcm4gdm9pZAorb21hcF9pb21tdV92ZnJlZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosCisJCQkJY29uc3QgdTMyIGRhKTsKK2V4dGVybiB2b2lkICpvbWFwX2RhX3RvX3ZhKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSk7CiAKICNlbmRpZiAvKiBfX0lPTU1VX01NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tY2JzcC5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tY2JzcC5oCmluZGV4IDk4ODJjNjUuLjhmYTc0ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWNic3AuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21jYnNwLmgKQEAgLTI1LDkgKzI1LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9PTUFQX01DQlNQX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8cGxhdC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAvKiBtYWNybyBmb3IgYnVpbGRpbmcgcGxhdGZvcm1fZGV2aWNlIGZvciBNY0JTUCBwb3J0cyAqLwogI2RlZmluZSBPTUFQX01DQlNQX1BMQVRGT1JNX0RFVklDRShwb3J0X25yKQkJXApAQCAtNDAsMTA0ICszOCw2MCBAQAogI2RlZmluZSBNQ0JTUF9DT05GSUdfVFlQRTMJMHgzCiAjZGVmaW5lIE1DQlNQX0NPTkZJR19UWVBFNAkweDQKIAotI2RlZmluZSBPTUFQN1hYX01DQlNQMV9CQVNFCTB4ZmZmYjEwMDAKLSNkZWZpbmUgT01BUDdYWF9NQ0JTUDJfQkFTRQkweGZmZmIxODAwCisvKiBNY0JTUCByZWdpc3RlciBudW1iZXJzLiBSZWdpc3RlciBhZGRyZXNzIG9mZnNldCA9IG51bSAqIHJlZ19zdGVwICovCitlbnVtIHsKKwkvKiBDb21tb24gcmVnaXN0ZXJzICovCisJT01BUF9NQ0JTUF9SRUdfU1BDUjIgPSA0LAorCU9NQVBfTUNCU1BfUkVHX1NQQ1IxLAorCU9NQVBfTUNCU1BfUkVHX1JDUjIsCisJT01BUF9NQ0JTUF9SRUdfUkNSMSwKKwlPTUFQX01DQlNQX1JFR19YQ1IyLAorCU9NQVBfTUNCU1BfUkVHX1hDUjEsCisJT01BUF9NQ0JTUF9SRUdfU1JHUjIsCisJT01BUF9NQ0JTUF9SRUdfU1JHUjEsCisJT01BUF9NQ0JTUF9SRUdfTUNSMiwKKwlPTUFQX01DQlNQX1JFR19NQ1IxLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJBLAorCU9NQVBfTUNCU1BfUkVHX1JDRVJCLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJBLAorCU9NQVBfTUNCU1BfUkVHX1hDRVJCLAorCU9NQVBfTUNCU1BfUkVHX1BDUjAsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkMsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkQsCisJT01BUF9NQ0JTUF9SRUdfWENFUkMsCisJT01BUF9NQ0JTUF9SRUdfWENFUkQsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkUsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkYsCisJT01BUF9NQ0JTUF9SRUdfWENFUkUsCisJT01BUF9NQ0JTUF9SRUdfWENFUkYsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkcsCisJT01BUF9NQ0JTUF9SRUdfUkNFUkgsCisJT01BUF9NQ0JTUF9SRUdfWENFUkcsCisJT01BUF9NQ0JTUF9SRUdfWENFUkgsCiAKLSNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX0JBU0UJMHhlMTAxMTgwMAotI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDJfQkFTRQkweGZmZmIxMDAwCi0jZGVmaW5lIE9NQVAxNTEwX01DQlNQM19CQVNFCTB4ZTEwMTcwMDAKKwkvKiBPTUFQMS1PTUFQMjQyMCByZWdpc3RlcnMgKi8KKwlPTUFQX01DQlNQX1JFR19EUlIyID0gMCwKKwlPTUFQX01DQlNQX1JFR19EUlIxLAorCU9NQVBfTUNCU1BfUkVHX0RYUjIsCisJT01BUF9NQ0JTUF9SRUdfRFhSMSwKIAotI2RlZmluZSBPTUFQMTYxMF9NQ0JTUDFfQkFTRQkweGUxMDExODAwCi0jZGVmaW5lIE9NQVAxNjEwX01DQlNQMl9CQVNFCTB4ZmZmYjEwMDAKLSNkZWZpbmUgT01BUDE2MTBfTUNCU1AzX0JBU0UJMHhlMTAxNzAwMAorCS8qIE9NQVAyNDMwIGFuZCBvbndhcmRzICovCisJT01BUF9NQ0JTUF9SRUdfRFJSID0gMCwKKwlPTUFQX01DQlNQX1JFR19EWFIgPSAyLAorCU9NQVBfTUNCU1BfUkVHX1NZU0NPTiA9CTM1LAorCU9NQVBfTUNCU1BfUkVHX1RIUlNIMiwKKwlPTUFQX01DQlNQX1JFR19USFJTSDEsCisJT01BUF9NQ0JTUF9SRUdfSVJRU1QgPSA0MCwKKwlPTUFQX01DQlNQX1JFR19JUlFFTiwKKwlPTUFQX01DQlNQX1JFR19XQUtFVVBFTiwKKwlPTUFQX01DQlNQX1JFR19YQ0NSLAorCU9NQVBfTUNCU1BfUkVHX1JDQ1IsCisJT01BUF9NQ0JTUF9SRUdfWEJVRkZTVEFULAorCU9NQVBfTUNCU1BfUkVHX1JCVUZGU1RBVCwKKwlPTUFQX01DQlNQX1JFR19TU0VMQ1IsCit9OwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKLQotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EUlIyCTB4MDAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSMQkweDAyCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RYUjIJMHgwNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EWFIxCTB4MDYKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSCTB4MDIKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFhSCTB4MDYKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1BDUjIJMHgwOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUENSMQkweDBhCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDUjIJMHgwYwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ1IxCTB4MGUKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENSMgkweDEwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDUjEJMHgxMgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUkdSMgkweDE0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NSR1IxCTB4MTYKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfTUNSMgkweDE4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX01DUjEJMHgxYQotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSQQkweDFjCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJCCTB4MWUKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkEJMHgyMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSQgkweDIyCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1BDUjAJMHgyNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSQwkweDI2Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJECTB4MjgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkMJMHgyQQotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRAkweDJDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJFCTB4MkUKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkYJMHgzMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRQkweDMyCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJGCTB4MzQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkcJMHgzNgotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSSAkweDM4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJHCTB4M0EKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkgJMHgzQwotCi0vKiBEdW1teSBkZWZpbmVzLCB0aGVzZSBhcmUgbm90IGF2YWlsYWJsZSBvbiBvbWFwMSAqLwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0NSCTB4MDAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNDUgkweDAwCi0KLSNlbHNlCi0KLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFJSMgkweDAwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RSUjEJMHgwNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19EWFIyCTB4MDgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfRFhSMQkweDBDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RSUgkweDAwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX0RYUgkweDA4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1NQQ1IyCTB4MTAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1BDUjEJMHgxNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ1IyCTB4MTgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNSMQkweDFDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDUjIJMHgyMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ1IxCTB4MjQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1JHUjIJMHgyOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TUkdSMQkweDJDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX01DUjIJMHgzMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19NQ1IxCTB4MzQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkEJMHgzOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSQgkweDNDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJBCTB4NDAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkIJMHg0NAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19QQ1IwCTB4NDgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkMJMHg0QwotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRAkweDUwCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJDCTB4NTQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkQJMHg1OAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQ0VSRQkweDVDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJGCTB4NjAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENFUkUJMHg2NAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRgkweDY4Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDRVJHCTB4NkMKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfUkNFUkgJMHg3MAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQ0VSRwkweDc0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1hDRVJICTB4NzgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfU1lTQ09OCTB4OEMKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfVEhSU0gyCTB4OTAKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfVEhSU0gxCTB4OTQKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfSVJRU1QJMHhBMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19JUlFFTgkweEE0Ci0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1dBS0VVUEVOCTB4QTgKLSNkZWZpbmUgT01BUF9NQ0JTUF9SRUdfWENDUgkweEFDCi0jZGVmaW5lIE9NQVBfTUNCU1BfUkVHX1JDQ1IJMHhCMAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19YQlVGRlNUQVQJMHhCNAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19SQlVGRlNUQVQJMHhCOAotI2RlZmluZSBPTUFQX01DQlNQX1JFR19TU0VMQ1IJMHhCQwotCisvKiBPTUFQMyBzaWRldG9uZSBjb250cm9sIHJlZ2lzdGVycyAqLwogI2RlZmluZSBPTUFQX1NUX1JFR19SRVYJCTB4MDAKICNkZWZpbmUgT01BUF9TVF9SRUdfU1lTQ09ORklHCTB4MTAKICNkZWZpbmUgT01BUF9TVF9SRUdfSVJRU1RBVFVTCTB4MTgKQEAgLTE0Niw4ICsxMDAsNiBAQAogI2RlZmluZSBPTUFQX1NUX1JFR19TRklSQ1IJMHgyOAogI2RlZmluZSBPTUFQX1NUX1JFR19TU0VMQ1IJMHgyQwogCi0jZW5kaWYKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1jQlNQIFNQQ1IxIGJpdCBkZWZpbml0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgUlJTVAkJCTB4MDAwMQogI2RlZmluZSBSUkRZCQkJMHgwMDAyCkBAIC0zNDQsMjAgKzI5NiwyMCBAQAogc3RydWN0IG9tYXBfbWNic3Bfb3BzIHsKIAl2b2lkICgqcmVxdWVzdCkodW5zaWduZWQgaW50KTsKIAl2b2lkICgqZnJlZSkodW5zaWduZWQgaW50KTsKLQlpbnQgKCpzZXRfY2xrc19zcmMpKHU4LCB1OCk7CiB9OwogCiBzdHJ1Y3Qgb21hcF9tY2JzcF9wbGF0Zm9ybV9kYXRhIHsKLQl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKLQl1OCBkbWFfcnhfc3luYywgZG1hX3R4X3N5bmM7Ci0JdTE2IHJ4X2lycSwgdHhfaXJxOwogCXN0cnVjdCBvbWFwX21jYnNwX29wcyAqb3BzOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAzCi0JLyogU2lkZXRvbmUgYmxvY2sgZm9yIE1jQlNQIDIgYW5kIDMgKi8KLQl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZV9zdDsKLSNlbmRpZgogCXUxNiBidWZmZXJfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgbWNic3BfY29uZmlnX3R5cGU7CisJdTggcmVnX3NpemU7CisJdTggcmVnX3N0ZXA7CisKKwkvKiBNY0JTUCBwbGF0Zm9ybSBhbmQgaW5zdGFuY2Ugc3BlY2lmaWMgZmVhdHVyZXMgKi8KKwlib29sIGhhc193YWtldXA7IC8qIFdha2V1cCBjYXBhYmlsaXR5ICovCisJYm9vbCBoYXNfY2NyOyAvKiBUcmFuc2NlaXZlciBoYXMgY29uZmlndXJhdGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworCWludCAoKmVuYWJsZV9zdF9jbG9jaykodW5zaWduZWQgaW50LCBib29sKTsKKwlpbnQgKCpzZXRfY2xrX3NyYykoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY2xrICpjbGssIGNvbnN0IGNoYXIgKnNyYyk7CisJaW50ICgqbXV4X3NpZ25hbCkoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpzaWduYWwsIGNvbnN0IGNoYXIgKnNyYyk7CiB9OwogCiBzdHJ1Y3Qgb21hcF9tY2JzcF9zdF9kYXRhIHsKQEAgLTM4OSwxNCArMzQxLDEyIEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBvbWFwX21jYnNwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBjbGsgKmZjbGs7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9zdF9kYXRhICpzdF9kYXRhOwogCWludCBkbWFfb3BfbW9kZTsKIAl1MTYgbWF4X3R4X3RocmVzOwogCXUxNiBtYXhfcnhfdGhyZXM7Ci0jZW5kaWYKIAl2b2lkICpyZWdfY2FjaGU7Ci0JdW5zaWduZWQgaW50IG1jYnNwX2NvbmZpZ190eXBlOworCWludCByZWdfY2FjaGVfc2l6ZTsKIH07CiAKIC8qKgpAQCAtNDA4LDE2ICszNTgsMTAgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgb21hcF9tY2JzcCAqKm1jYnNwX3B0cjsKLWV4dGVybiBpbnQgb21hcF9tY2JzcF9jb3VudCwgb21hcF9tY2JzcF9jYWNoZV9zaXplOwotCi0jZGVmaW5lIG9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpCShpZCA8IG9tYXBfbWNic3BfY291bnQpCi0jZGVmaW5lIGlkX3RvX21jYnNwX3B0cihpZCkJCW1jYnNwX3B0cltpZF07CitleHRlcm4gaW50IG9tYXBfbWNic3BfY291bnQ7CiAKIGludCBvbWFwX21jYnNwX2luaXQodm9pZCk7Ci12b2lkIG9tYXBfbWNic3BfcmVnaXN0ZXJfYm9hcmRfY2ZnKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzX2NvdW50LAotCQkJc3RydWN0IG9tYXBfbWNic3BfcGxhdGZvcm1fZGF0YSAqY29uZmlnLCBpbnQgc2l6ZSk7CiB2b2lkIG9tYXBfbWNic3BfY29uZmlnKHVuc2lnbmVkIGludCBpZCwgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfcmVnX2NmZyAqIGNvbmZpZyk7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKIHZvaWQgb21hcF9tY2JzcF9zZXRfdHhfdGhyZXNob2xkKHVuc2lnbmVkIGludCBpZCwgdTE2IHRocmVzaG9sZCk7CiB2b2lkIG9tYXBfbWNic3Bfc2V0X3J4X3RocmVzaG9sZCh1bnNpZ25lZCBpbnQgaWQsIHUxNiB0aHJlc2hvbGQpOwogdTE2IG9tYXBfbWNic3BfZ2V0X21heF90eF90aHJlc2hvbGQodW5zaWduZWQgaW50IGlkKTsKQEAgLTQyNiwxOCArMzcwLDYgQEAKIHUxNiBvbWFwX21jYnNwX2dldF90eF9kZWxheSh1bnNpZ25lZCBpbnQgaWQpOwogdTE2IG9tYXBfbWNic3BfZ2V0X3J4X2RlbGF5KHVuc2lnbmVkIGludCBpZCk7CiBpbnQgb21hcF9tY2JzcF9nZXRfZG1hX29wX21vZGUodW5zaWduZWQgaW50IGlkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9tY2JzcF9zZXRfdHhfdGhyZXNob2xkKHVuc2lnbmVkIGludCBpZCwgdTE2IHRocmVzaG9sZCkKLXsgfQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfbWNic3Bfc2V0X3J4X3RocmVzaG9sZCh1bnNpZ25lZCBpbnQgaWQsIHUxNiB0aHJlc2hvbGQpCi17IH0KLXN0YXRpYyBpbmxpbmUgdTE2IG9tYXBfbWNic3BfZ2V0X21heF90eF90aHJlc2hvbGQodW5zaWduZWQgaW50IGlkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHUxNiBvbWFwX21jYnNwX2dldF9tYXhfcnhfdGhyZXNob2xkKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB1MTYgb21hcF9tY2JzcF9nZXRfZmlmb19zaXplKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB1MTYgb21hcF9tY2JzcF9nZXRfdHhfZGVsYXkodW5zaWduZWQgaW50IGlkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHUxNiBvbWFwX21jYnNwX2dldF9yeF9kZWxheSh1bnNpZ25lZCBpbnQgaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfbWNic3BfZ2V0X2RtYV9vcF9tb2RlKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCiBpbnQgb21hcF9tY2JzcF9yZXF1ZXN0KHVuc2lnbmVkIGludCBpZCk7CiB2b2lkIG9tYXBfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpOwogdm9pZCBvbWFwX21jYnNwX3N0YXJ0KHVuc2lnbmVkIGludCBpZCwgaW50IHR4LCBpbnQgcngpOwpAQCAtNDUzLDIxICszODUsMTEgQEAKIGludCBvbWFwX21jYnNwX2RtYV9jaF9wYXJhbXModW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgc3RyZWFtKTsKIGludCBvbWFwX21jYnNwX2RtYV9yZWdfcGFyYW1zKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHN0cmVhbSk7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwogLyogU2lkZXRvbmUgc3BlY2lmaWMgQVBJICovCiBpbnQgb21hcF9zdF9zZXRfY2hnYWluKHVuc2lnbmVkIGludCBpZCwgaW50IGNoYW5uZWwsIHMxNiBjaGdhaW4pOwogaW50IG9tYXBfc3RfZ2V0X2NoZ2Fpbih1bnNpZ25lZCBpbnQgaWQsIGludCBjaGFubmVsLCBzMTYgKmNoZ2Fpbik7CiBpbnQgb21hcF9zdF9lbmFibGUodW5zaWduZWQgaW50IGlkKTsKIGludCBvbWFwX3N0X2Rpc2FibGUodW5zaWduZWQgaW50IGlkKTsKIGludCBvbWFwX3N0X2lzX2VuYWJsZWQodW5zaWduZWQgaW50IGlkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBvbWFwX3N0X3NldF9jaGdhaW4odW5zaWduZWQgaW50IGlkLCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHMxNiBjaGdhaW4pIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfc3RfZ2V0X2NoZ2Fpbih1bnNpZ25lZCBpbnQgaWQsIGludCBjaGFubmVsLAotCQkJCSAgICAgczE2ICpjaGdhaW4pIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IG9tYXBfc3RfZW5hYmxlKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgb21hcF9zdF9kaXNhYmxlKHVuc2lnbmVkIGludCBpZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgb21hcF9zdF9pc19lbmFibGVkKHVuc2lnbmVkIGludCBpZCkgeyAgcmV0dXJuIDA7IH0KLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWVtb3J5LmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjcyMGFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKLSAqCi0gKiBNZW1vcnkgbWFwIGZvciBPTUFQLTE1MTAgYW5kIDE2MTAKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KLSAqIEF1dGhvcjogR3JlZyBMb25ub24gPGdsb25ub25AcmlkZ2VydW4uY29tPgotICoKLSAqIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIGFyY2gvYXJtL21hY2gtaW50ZXJncmF0b3IvaW5jbHVkZS9tYWNoL21lbW9yeS5oCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KLSAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLSNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAotCi0vKgotICogUGh5c2ljYWwgRFJBTSBvZmZzZXQuCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxKQotI2RlZmluZSBQTEFUX1BIWVNfT0ZGU0VUCQlVTCgweDEwMDAwMDAwKQotI2Vsc2UKLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHg4MDAwMDAwMCkKLSNlbmRpZgotCi0vKgotICogQnVzIGFkZHJlc3MgaXMgcGh5c2ljYWwgYWRkcmVzcywgZXhjZXB0IGZvciBPTUFQLTE1MTAgTG9jYWwgQnVzLgotICogT01BUC0xNTEwIGJ1cyBhZGRyZXNzIGlzIHRyYW5zbGF0ZWQgaW50byBhIExvY2FsIEJ1cyBhZGRyZXNzIGlmIHRoZQotICogT01BUCBidXMgdHlwZSBpcyBsYnVzLiBXZSBkbyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUKLSAqIGRldmljZSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cyB1c2VkIGluIHRoZSBkbWEtbWFwcGluZyBBUEkuCi0gKiBOb3RlIHRoYXQgdGhlIGlzX2xidXNfZGV2aWNlKCkgdGVzdCBpcyBub3QgdmVyeSBlZmZpY2llbnQgb24gMTUxMAotICogYmVjYXVzZSBvZiB0aGUgc3RybmNtcCgpLgotICovCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKLQotLyoKLSAqIE9NQVAtMTUxMCBMb2NhbCBCdXMgYWRkcmVzcyBvZmZzZXQKLSAqLwotI2RlZmluZSBPTUFQMTUxMF9MQl9PRkZTRVQJVUwoMHgzMDAwMDAwMCkKLQotI2RlZmluZSB2aXJ0X3RvX2xidXMoeCkJCSgoeCkgLSBQQUdFX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVCkKLSNkZWZpbmUgbGJ1c190b192aXJ0KHgpCQkoKHgpIC0gT01BUDE1MTBfTEJfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCi0jZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXZfbmFtZShkZXYpLCAib2hjaSIsIDQpID09IDApKQotCi0jZGVmaW5lIF9fYXJjaF9wZm5fdG9fZG1hKGRldiwgcGZuKQlcCi0JKHsgZG1hX2FkZHJfdCBfX2RtYSA9IF9fcGZuX3RvX3BoeXMocGZuKTsgXAotCSAgIGlmIChpc19sYnVzX2RldmljZShkZXYpKSBcCi0JCV9fZG1hID0gX19kbWEgLSBQSFlTX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVDsgXAotCSAgIF9fZG1hOyB9KQotCi0jZGVmaW5lIF9fYXJjaF9kbWFfdG9fcGZuKGRldiwgYWRkcikJXAotCSh7IGRtYV9hZGRyX3QgX19kbWEgPSBhZGRyOwkJCQlcCi0JICAgaWYgKGlzX2xidXNfZGV2aWNlKGRldikpCQkJCVwKLQkJX19kbWEgKz0gUEhZU19PRkZTRVQgLSBPTUFQMTUxMF9MQl9PRkZTRVQ7CVwKLQkgICBfX3BoeXNfdG9fcGZuKF9fZG1hKTsJCQkJXAotCX0pCi0KLSNkZWZpbmUgX19hcmNoX2RtYV90b192aXJ0KGRldiwgYWRkcikJKHsgKHZvaWQgKikgKGlzX2xidXNfZGV2aWNlKGRldikgPyBcCi0JCQkJCQlsYnVzX3RvX3ZpcnQoYWRkcikgOiBcCi0JCQkJCQlfX3BoeXNfdG9fdmlydChhZGRyKSk7IH0pCi0KLSNkZWZpbmUgX19hcmNoX3ZpcnRfdG9fZG1hKGRldiwgYWRkcikJKHsgdW5zaWduZWQgbG9uZyBfX2FkZHIgPSAodW5zaWduZWQgbG9uZykoYWRkcik7IFwKLQkJCQkJICAgKGRtYV9hZGRyX3QpIChpc19sYnVzX2RldmljZShkZXYpID8gXAotCQkJCQkJdmlydF90b19sYnVzKF9fYWRkcikgOiBcCi0JCQkJCQlfX3ZpcnRfdG9fcGh5cyhfX2FkZHIpKTsgfSkKLQotI2VuZGlmCS8qIENPTkZJR19BUkNIX09NQVAxNVhYICovCi0KLS8qIE92ZXJyaWRlIHRoZSBBUk0gZGVmYXVsdCAqLwotI2lmZGVmIENPTkZJR19GQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUKLQotI2lmIChDT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFID09IDApCi0jdW5kZWYgQ09ORklHX0ZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRQotI2RlZmluZSBDT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFIDIKLSNlbmRpZgotCi0jZGVmaW5lIENPTlNJU1RFTlRfRE1BX1NJWkUgXAotCSgoKENPTkZJR19GQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUgKyAxKSAmIH4xKSAqIDEwMjQgKiAxMDI0KQotCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L21tYy5oCmluZGV4IGM3Yjg3NDEuLjk0Y2Y3MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvbW1jLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9tbWMuaApAQCAtMzEsNyArMzEsMjQgQEAKIAogI2RlZmluZSBPTUFQX01NQ19NQVhfU0xPVFMJMgogCi0jZGVmaW5lIE9NQVBfSFNNTUNfU1VQUE9SVFNfRFVBTF9WT0xUCUJJVCgxKQorLyoKKyAqIHN0cnVjdCBvbWFwX21tY19kZXZfYXR0ci5mbGFncyBwb3NzaWJpbGl0aWVzCisgKgorICogT01BUF9IU01NQ19TVVBQT1JUU19EVUFMX1ZPTFQ6IFNvbWUgSFNNTUMgY29udHJvbGxlciBpbnN0YW5jZXMgY2FuCisgKiAgICBvcGVyYXRlIHdpdGggZWl0aGVyIDEuOFZkYyBvciAzLjBWZGMgY2FyZCB2b2x0YWdlczsgdGhpcyBmbGFnCisgKiAgICBzaG91bGQgYmUgc2V0IGlmIHRoaXMgaXMgdGhlIGNhc2UuICBTZWUgZm9yIGV4YW1wbGUgU2VjdGlvbiAyMi41LjMKKyAqICAgICJNTUMvU0QvU0RJTzEgQnVzIFZvbHRhZ2UgU2VsZWN0aW9uIiBvZiB0aGUgT01BUDM0eHggTXVsdGltZWRpYQorICogICAgRGV2aWNlIFNpbGljb24gUmV2aXNpb24gMy4xLnggUmV2aXNpb24gWlIgKEp1bHkgMjAxMSkgKFNXUFUyMjNSKS4KKyAqCisgKiBPTUFQX0hTTU1DX0JST0tFTl9NVUxUSUJMT0NLX1JFQUQ6IE11bHRpcGxlLWJsb2NrIHJlYWQgdHJhbnNmZXJzCisgKiAgICBkb24ndCB3b3JrIGNvcnJlY3RseSBvbiBzb21lIE1NQyBjb250cm9sbGVyIGluc3RhbmNlcyBvbiBzb21lCisgKiAgICBPTUFQMyBTb0NzOyB0aGlzIGZsYWcgc2hvdWxkIGJlIHNldCBpZiB0aGlzIGlzIHRoZSBjYXNlLiAgU2VlCisgKiAgICBmb3IgZXhhbXBsZSBBZHZpc29yeSAyLjEuMS4xMjggIk1NQzogTXVsdGlwbGUgQmxvY2sgUmVhZAorICogICAgT3BlcmF0aW9uIElzc3VlIiBpbiBfT01BUDM1MzAvMzUyNS8zNTE1LzM1MDMgU2lsaWNvbiBFcnJhdGFfCisgKiAgICBSZXZpc2lvbiBGIChPY3RvYmVyIDIwMTApIChTUFJaMjc4RikuCisgKi8KKyNkZWZpbmUgT01BUF9IU01NQ19TVVBQT1JUU19EVUFMX1ZPTFQJCUJJVCgwKQorI2RlZmluZSBPTUFQX0hTTU1DX0JST0tFTl9NVUxUSUJMT0NLX1JFQUQJQklUKDEpCiAKIHN0cnVjdCBvbWFwX21tY19kZXZfYXR0ciB7CiAJdTggZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtYWxzYS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwLWFsc2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMDU1Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtYWxzYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBhcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL29tYXAtYWxzYS5oCi0gKgotICogQWxzYSBEcml2ZXIgZm9yIEFJQzIzIGFuZCBUU0MyMTAxIGNvZGVjcyBvbiBPTUFQIHBsYXRmb3JtIGJvYXJkcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWlrYSBMYWl0aW8gPGxhbWlrckBjYy5qeXUuZmk+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cyBCcmF6aWwKLSAqIFdyaXR0ZW4gYnkgRGFuaWVsIFBldHJpbmksIERhdmlkIENvaGVuLCBBbmRlcnNvbiBCcmlnbGlhCi0gKiAgICAgICAgICAgIHtkYW5pZWwucGV0cmluaSwgZGF2aWQuY29oZW4sIGFuZGVyc29uLmJyaWdsaWF9QGluZHQub3JnLmJyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCi0gKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgSGlzdG9yeQotICogIC0tLS0tLS0KLSAqCi0gKiAgMjAwNS8wNy8yNSBJTmRULTEwTEUgS2VybmVsIFRlYW0gLSAJQWxzYSBkcml2ZXIgZm9yIG9tYXAgb3NrLAotICogIAkJCQkJb3JpZ2luYWwgdmVyc2lvbiBiYXNlZCBpbiBzYTExMDAgZHJpdmVyCi0gKiAgCQkJCQlhbmQgb21hcCBvc3MgZHJpdmVyLgotICovCi0KLSNpZm5kZWYgX19PTUFQX0FMU0FfSAotI2RlZmluZSBfX09NQVBfQUxTQV9ICi0KLSNpbmNsdWRlIDxwbGF0L2RtYS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxwbGF0L21jYnNwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNkZWZpbmUgRE1BX0JVRl9TSVpFCSgxMDI0ICogOCkKLQotLyoKLSAqIEJ1ZmZlciBtYW5hZ2VtZW50IGZvciBhbHNhIGFuZCBkbWEKLSAqLwotc3RydWN0IGF1ZGlvX3N0cmVhbSB7Ci0JY2hhciAqaWQ7CQkvKiBpZGVudGlmaWNhdGlvbiBzdHJpbmcgKi8KLQlpbnQgc3RyZWFtX2lkOwkJLyogbnVtZXJpYyBpZGVudGlmaWNhdGlvbiAqLwotCWludCBkbWFfZGV2OwkJLyogZG1hIG51bWJlciBvZiB0aGF0IGRldmljZSAqLwotCWludCAqbGNoOwkJLyogQ2hhaW4gb2YgY2hhbm5lbHMgdGhpcyBzdHJlYW0gaXMgbGlua2VkIHRvICovCi0JY2hhciBzdGFydGVkOwkJLyogdG8gc3RvcmUgaWYgdGhlIGNoYWluIHdhcyBzdGFydGVkIG9yIG5vdCAqLwotCWludCBkbWFfcV9oZWFkOwkJLyogRE1BIENoYW5uZWwgUSBIZWFkICovCi0JaW50IGRtYV9xX3RhaWw7CQkvKiBETUEgQ2hhbm5lbCBRIFRhaWwgKi8KLQljaGFyIGRtYV9xX2NvdW50OwkvKiBETUEgQ2hhbm5lbCBRIENvdW50ICovCi0JaW50IGFjdGl2ZToxOwkJLyogd2UgYXJlIHVzaW5nIHRoaXMgc3RyZWFtIGZvciB0cmFuc2ZlciBub3cgKi8KLQlpbnQgcGVyaW9kOwkJLyogY3VycmVudCB0cmFuc2ZlciBwZXJpb2QgKi8KLQlpbnQgcGVyaW9kczsJCS8qIGN1cnJlbnQgY291bnQgb2YgcGVyaW9kcyByZWdpc3RlcmQgaW4gdGhlIERNQSBlbmdpbmUgKi8KLQlzcGlubG9ja190IGRtYV9sb2NrOwkvKiBmb3IgbG9ja2luZyBpbiBETUEgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3RyZWFtOwkvKiB0aGUgcGNtIHN0cmVhbSAqLwotCXVuc2lnbmVkIGxpbmtlZDoxOwkvKiBkbWEgY2hhbm5lbHMgbGlua2VkICovCi0JaW50IG9mZnNldDsJCS8qIHN0b3JlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IHBlcmlvZCBpbiB0aGUgYWxzYSBidWZmZXIgKi8KLQlpbnQgKCpod19zdGFydCkodm9pZCk7ICAvKiBpbnRlcmZhY2UgdG8gc3RhcnQgSFcgaW50ZXJmYWNlLCBlLmcuIE1jQlNQICovCi0JaW50ICgqaHdfc3RvcCkodm9pZCk7ICAgLyogaW50ZXJmYWNlIHRvIHN0b3AgSFcgaW50ZXJmYWNlLCBlLmcuIE1jQlNQICovCi19OwotCi0vKgotICogQWxzYSBjYXJkIHN0cnVjdHVyZSBmb3IgYWljMjMKLSAqLwotc3RydWN0IHNuZF9jYXJkX29tYXBfY29kZWMgewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWxvbmcgc2FtcGxlcmF0ZTsKLQlzdHJ1Y3QgYXVkaW9fc3RyZWFtIHNbMl07CS8qIHBsYXliYWNrICYgY2FwdHVyZSAqLwotfTsKLQotLyogQ29kZWMgc3BlY2lmaWMgaW5mb3JtYXRpb24gYW5kIGZ1bmN0aW9uIHBvaW50ZXJzLgotICogQ29kZWMgKG9tYXAtYWxzYS1haWMyMy5jIGFuZCBvbWFwLWFsc2EtdHNjMjEwMS5jKQotICogYXJlIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZyB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuCi0gKi8KLXN0cnVjdCBvbWFwX2Fsc2FfY29kZWNfY29uZmlnIHsKLQljaGFyIAkqbmFtZTsKLQlzdHJ1Y3QJb21hcF9tY2JzcF9yZWdfY2ZnICptY2JzcF9yZWdzX2Fsc2E7Ci0Jc3RydWN0CXNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpod19jb25zdHJhaW50c19yYXRlczsKLQlzdHJ1Y3QJc25kX3BjbV9oYXJkd2FyZSAqc25kX29tYXBfYWxzYV9wbGF5YmFjazsKLQlzdHJ1Y3QJc25kX3BjbV9oYXJkd2FyZSAqc25kX29tYXBfYWxzYV9jYXB0dXJlOwotCXZvaWQJKCpjb2RlY19jb25maWd1cmVfZGV2KSh2b2lkKTsKLQl2b2lkCSgqY29kZWNfc2V0X3NhbXBsZXJhdGUpKGxvbmcpOwotCXZvaWQJKCpjb2RlY19jbG9ja19zZXR1cCkodm9pZCk7Ci0JaW50CSgqY29kZWNfY2xvY2tfb24pKHZvaWQpOwotCWludCAJKCpjb2RlY19jbG9ja19vZmYpKHZvaWQpOwotCWludAkoKmdldF9kZWZhdWx0X3NhbXBsZXJhdGUpKHZvaWQpOwotfTsKLQotLyoqKioqKioqKioqIE1peGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBzbmRfb21hcF9taXhlcihzdHJ1Y3Qgc25kX2NhcmRfb21hcF9jb2RlYyAqKTsKLXZvaWQgc25kX29tYXBfaW5pdF9taXhlcih2b2lkKTsKLQotI2lmZGVmIENPTkZJR19QTQotdm9pZCBzbmRfb21hcF9zdXNwZW5kX21peGVyKHZvaWQpOwotdm9pZCBzbmRfb21hcF9yZXN1bWVfbWl4ZXIodm9pZCk7Ci0jZW5kaWYKLQotaW50IHNuZF9vbWFwX2Fsc2FfcG9zdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgb21hcF9hbHNhX2NvZGVjX2NvbmZpZyAqY29uZmlnKTsKLWludCBzbmRfb21hcF9hbHNhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLSNpZmRlZiBDT05GSUdfUE0KLWludCBzbmRfb21hcF9hbHNhX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLWludCBzbmRfb21hcF9hbHNhX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLSNlbHNlCi0jZGVmaW5lIHNuZF9vbWFwX2Fsc2Ffc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHNuZF9vbWFwX2Fsc2FfcmVzdW1lCU5VTEwKLSNlbmRpZgotCi12b2lkIGNhbGxiYWNrX29tYXBfYWxzYV9zb3VuZF9kbWEodm9pZCAqKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXAtcG0uaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCmluZGV4IDA4NDBkZjguLjY3ZmFhN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcC1wbS5oCkBAIC0zNDIsOSArMzQyLDkgQEAKICAqIGRyaXZlciBtdXN0IHJlc3RvcmUgZGV2aWNlIGNvbnRleHQuICAgSWYgdGhlIG51bWJlciBvZiBjb250ZXh0IGxvc3NlcwogICogZXhjZWVkcyB0aGUgbWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgZnVuY3Rpb24gd2lsbCB3cmFwIHRvIDAgYW5kCiAgKiBjb250aW51ZSBjb3VudGluZy4gIFJldHVybnMgdGhlIG51bWJlciBvZiBjb250ZXh0IGxvc3NlcyBmb3IgdGhpcyBkZXZpY2UsCi0gKiBvciB6ZXJvIHVwb24gZXJyb3IuCisgKiBvciBuZWdhdGl2ZSB2YWx1ZSB1cG9uIGVycm9yLgogICovCi11MzIgb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IG9tYXBfcG1fZ2V0X2Rldl9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IGRldmljZSAqZGV2KTsKIAogdm9pZCBvbWFwX3BtX2VuYWJsZV9vZmZfbW9kZSh2b2lkKTsKIHZvaWQgb21hcF9wbV9kaXNhYmxlX29mZl9tb2RlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2RldmljZS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2RldmljZS5oCmluZGV4IGVlNDA1YjM2Li41MTQyM2QyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfZGV2aWNlLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2RldmljZS5oCkBAIC02OCw3ICs2OCw3IEBACiAgKgogICovCiBzdHJ1Y3Qgb21hcF9kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCXBkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAJc3RydWN0IG9tYXBfaHdtb2QJCSoqaHdtb2RzOwogCXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5CSpwbV9sYXRzOwogCXUzMgkJCQlkZXZfd2FrZXVwX2xhdDsKQEAgLTg4LDMxICs4OCwyNiBAQAogCiAvKiBDb3JlIGNvZGUgaW50ZXJmYWNlICovCiAKLWludCBvbWFwX2RldmljZV9jb3VudF9yZXNvdXJjZXMoc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7Ci1pbnQgb21hcF9kZXZpY2VfZmlsbF9yZXNvdXJjZXMoc3RydWN0IG9tYXBfZGV2aWNlICpvZCwgc3RydWN0IHJlc291cmNlICpyZXMpOwotCi1zdHJ1Y3Qgb21hcF9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RldmljZV9idWlsZChjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAogCQkJCSAgICAgIHN0cnVjdCBvbWFwX2h3bW9kICpvaCwgdm9pZCAqcGRhdGEsCiAJCQkJICAgICAgaW50IHBkYXRhX2xlbiwKIAkJCQkgICAgICBzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSAqcG1fbGF0cywKIAkJCQkgICAgICBpbnQgcG1fbGF0c19jbnQsIGludCBpc19lYXJseV9kZXZpY2UpOwogCi1zdHJ1Y3Qgb21hcF9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkX3NzKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvbWFwX2RldmljZV9idWlsZF9zcyhjb25zdCBjaGFyICpwZGV2X25hbWUsIGludCBwZGV2X2lkLAogCQkJCQkgc3RydWN0IG9tYXBfaHdtb2QgKipvaCwgaW50IG9oX2NudCwKIAkJCQkJIHZvaWQgKnBkYXRhLCBpbnQgcGRhdGFfbGVuLAogCQkJCQkgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgKnBtX2xhdHMsCiAJCQkJCSBpbnQgcG1fbGF0c19jbnQsIGludCBpc19lYXJseV9kZXZpY2UpOwogCi1pbnQgb21hcF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7Ci1pbnQgb21hcF9lYXJseV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7Ci0KIHZvaWQgX19pb21lbSAqb21hcF9kZXZpY2VfZ2V0X3J0X3ZhKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOworc3RydWN0IGRldmljZSAqb21hcF9kZXZpY2VfZ2V0X2J5X2h3bW9kX25hbWUoY29uc3QgY2hhciAqb2hfbmFtZSk7CiAKIC8qIE9NQVAgUE0gaW50ZXJmYWNlICovCiBpbnQgb21hcF9kZXZpY2VfYWxpZ25fcG1fbGF0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkgICAgIHUzMiBuZXdfd2FrZXVwX2xhdF9saW1pdCk7CiBzdHJ1Y3QgcG93ZXJkb21haW4gKm9tYXBfZGV2aWNlX2dldF9wd3JkbShzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKTsKLXUzMiBvbWFwX2RldmljZV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworaW50IG9tYXBfZGV2aWNlX2dldF9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAKIC8qIE90aGVyICovCiAKQEAgLTEyMiwxMSArMTE3LDYgQEAKIGludCBvbWFwX2RldmljZV9kaXNhYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKTsKIGludCBvbWFwX2RldmljZV9lbmFibGVfY2xvY2tzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF9kZXZpY2VfZGlzYWJsZV9pZGxlX29uX3N1c3BlbmQoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKLXsKLQlvZC0+ZmxhZ3MgfD0gT01BUF9ERVZJQ0VfTk9fSURMRV9PTl9TVVNQRU5EOwotfQotCiAvKgogICogRW50cmllcyBzaG91bGQgYmUga2VwdCBpbiBsYXRlbmN5IG9yZGVyIGFzY2VuZGluZwogICoKQEAgLTE1Nyw2ICsxNDcsMTcgQEAKICNkZWZpbmUgT01BUF9ERVZJQ0VfTEFURU5DWV9BVVRPX0FESlVTVCBCSVQoMSkKIAogLyogR2V0IG9tYXBfZGV2aWNlIHBvaW50ZXIgZnJvbSBwbGF0Zm9ybV9kZXZpY2UgcG9pbnRlciAqLwotI2RlZmluZSB0b19vbWFwX2RldmljZSh4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3Qgb21hcF9kZXZpY2UsIHBkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvbWFwX2RldmljZSAqdG9fb21hcF9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gcGRldiA/IHBkZXYtPmFyY2hkYXRhLm9kIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZQordm9pZCBvbWFwX2RldmljZV9kaXNhYmxlX2lkbGVfb25fc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwX2RldmljZSAqb2QgPSB0b19vbWFwX2RldmljZShwZGV2KTsKKworCW9kLT5mbGFncyB8PSBPTUFQX0RFVklDRV9OT19JRExFX09OX1NVU1BFTkQ7Cit9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9vbWFwX2h3bW9kLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaAppbmRleCAwZTMyOWNhLi44YjM3MmVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaApAQCAtNDk2LDcgKzQ5Niw2IEBACiAgKiBAX3N0YXRlOiBpbnRlcm5hbC11c2UgaHdtb2Qgc3RhdGUKICAqIEBfcG9zdHNldHVwX3N0YXRlOiBpbnRlcm5hbC11c2Ugc3RhdGUgdG8gbGVhdmUgdGhlIGh3bW9kIGluIGFmdGVyIF9zZXR1cCgpCiAgKiBAZmxhZ3M6IGh3bW9kIGZsYWdzIChkb2N1bWVudGVkIGJlbG93KQotICogQG9tYXBfY2hpcDogT01BUCBjaGlwcyB0aGlzIGh3bW9kIGlzIHByZXNlbnQgb24KICAqIEBfbG9jazogc3BpbmxvY2sgc2VyaWFsaXppbmcgb3BlcmF0aW9ucyBvbiB0aGlzIGh3bW9kCiAgKiBAbm9kZTogbGlzdCBub2RlIGZvciBod21vZCBsaXN0IChpbnRlcm5hbCB1c2UpCiAgKgpAQCAtNTI2LDcgKzUyNSw2IEBACiAJY2hhcgkJCQkqY2xrZG1fbmFtZTsKIAlzdHJ1Y3QgY2xvY2tkb21haW4JCSpjbGtkbTsKIAljaGFyCQkJCSp2ZGRfbmFtZTsKLQlzdHJ1Y3Qgdm9sdGFnZWRvbWFpbgkJKnZvbHRkbTsKIAlzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYJKiptYXN0ZXJzOyAvKiBjb25uZWN0IHRvICpfSUEgKi8KIAlzdHJ1Y3Qgb21hcF9od21vZF9vY3BfaWYJKipzbGF2ZXM7ICAvKiBjb25uZWN0IHRvICpfVEEgKi8KIAl2b2lkCQkJCSpkZXZfYXR0cjsKQEAgLTU0NSw3ICs1NDMsNiBAQAogCXU4CQkJCV9pbnRfZmxhZ3M7CiAJdTgJCQkJX3N0YXRlOwogCXU4CQkJCV9wb3N0c2V0dXBfc3RhdGU7Ci0JY29uc3Qgc3RydWN0IG9tYXBfY2hpcF9pZAlvbWFwX2NoaXA7CiB9OwogCiBpbnQgb21hcF9od21vZF9yZWdpc3RlcihzdHJ1Y3Qgb21hcF9od21vZCAqKm9ocyk7CkBAIC02MDMsNyArNjAwLDcgQEAKIAkJCQkgdm9pZCAqdXNlcik7CiAKIGludCBvbWFwX2h3bW9kX3NldF9wb3N0c2V0dXBfc3RhdGUoc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB1OCBzdGF0ZSk7Ci11MzIgb21hcF9od21vZF9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBvbWFwX2h3bW9kICpvaCk7CitpbnQgb21hcF9od21vZF9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBvbWFwX2h3bW9kICpvaCk7CiAKIGludCBvbWFwX2h3bW9kX25vX3NldHVwX3Jlc2V0KHN0cnVjdCBvbWFwX2h3bW9kICpvaCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc2VyaWFsLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3NlcmlhbC5oCmluZGV4IGRlM2IxMGMuLjFhYjlmZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvc2VyaWFsLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9zZXJpYWwuaApAQCAtMTYsOCArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogLyoKLSAqIE1lbW9yeSBlbnRyeSB1c2VkIGZvciB0aGUgREVCVUdfTEwgVUFSVCBjb25maWd1cmF0aW9uLiBTZWUgYWxzbwotICogdW5jb21wcmVzcy5oIGFuZCBkZWJ1Zy1tYWNyby5TLgorICogTWVtb3J5IGVudHJ5IHVzZWQgZm9yIHRoZSBERUJVR19MTCBVQVJUIGNvbmZpZ3VyYXRpb24sIHJlbGF0aXZlIHRvCisgKiBzdGFydCBvZiBSQU0uIFNlZSBhbHNvIHVuY29tcHJlc3MuaCBhbmQgZGVidWctbWFjcm8uUy4KICAqCiAgKiBOb3RlIHRoYXQgdXNpbmcgYSBtZW1vcnkgbG9jYXRpb24gZm9yIHN0b3JpbmcgdGhlIFVBUlQgY29uZmlndXJhdGlvbgogICogaGFzIGF0IGxlYXN0IHR3byBsaW1pdGF0aW9uczoKQEAgLTI3LDcgKzI3LDcgQEAKICAqIDIuIFdlIGFzc3VtZSBwcmludGFzY2lpIGlzIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBwYWdpbmdfaW5pdCwKICAqICAgIGFuZCBhZGRydWFydCBoYXMgYSBjaGFuY2UgdG8gcmVhZCBPTUFQX1VBUlRfSU5GTwogICovCi0jZGVmaW5lIE9NQVBfVUFSVF9JTkZPCQkoUExBVF9QSFlTX09GRlNFVCArIDB4M2ZmYykKKyNkZWZpbmUgT01BUF9VQVJUX0lORk9fT0ZTCTB4M2ZmYwogCiAvKiBPTUFQMSBzZXJpYWwgcG9ydHMgKi8KICNkZWZpbmUgT01BUDFfVUFSVDFfQkFTRQkweGZmZmIwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3VuY29tcHJlc3MuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCmluZGV4IGEwNjc0ODQuLjJmNDcyZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdW5jb21wcmVzcy5oCkBAIC0zNiw3ICszNiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBzZXRfb21hcF91YXJ0X2luZm8odW5zaWduZWQgY2hhciBwb3J0KQogewotCSoodm9sYXRpbGUgdTMyICopT01BUF9VQVJUX0lORk8gPSBwb3J0OworCS8qCisJICogR2V0IGFkZHJlc3Mgb2Ygc29tZS5ic3MgdmFyaWFibGUgYW5kIHJvdW5kIGl0IGRvd24KKwkgKiBhIGxhIENPTkZJR19BVVRPX1pSRUxBRERSLgorCSAqLworCXUzMiByYW1fc3RhcnQgPSAodTMyKSZ1YXJ0X3NoaWZ0ICYgMHhmODAwMDAwMDsKKwl1MzIgKnVhcnRfaW5mbyA9ICh1MzIgKikocmFtX3N0YXJ0ICsgT01BUF9VQVJUX0lORk9fT0ZTKTsKKwkqdWFydF9pbmZvID0gcG9ydDsKIH0KIAogc3RhdGljIHZvaWQgcHV0YyhpbnQgYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdm9sdGFnZS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC92b2x0YWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2YTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvdm9sdGFnZS5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBPTUFQIFZvbHRhZ2UgTWFuYWdlbWVudCBSb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9PTUFQX1ZPTFRBR0VfSAorI2RlZmluZSBfX0FSQ0hfQVJNX09NQVBfVk9MVEFHRV9ICisKK3N0cnVjdCB2b2x0YWdlZG9tYWluOworCitzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK2ludCB2b2x0ZG1fc2NhbGUoc3RydWN0IHZvbHRhZ2Vkb21haW4gKnZvbHRkbSwgdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCk7Cit1bnNpZ25lZCBsb25nIHZvbHRkbV9nZXRfdm9sdGFnZShzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW8uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pby5jCmluZGV4IGYxZWNmYTkuLjMzMzg3MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pby5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXA3eHguaD4KICNpbmNsdWRlIDxwbGF0L29tYXAxNTEwLmg+CkBAIC0yMywxMSArMjQsMTYgQEAKICNkZWZpbmUgQkVUV0VFTihwLHN0LHN6KQkoKHApID49IChzdCkgJiYgKHApIDwgKChzdCkgKyAoc3opKSkKICNkZWZpbmUgWExBVEUocCxwc3QsdnN0KQkoKHZvaWQgX19pb21lbSAqKSgocCkgLSAocHN0KSArICh2c3QpKSkKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKKwogLyoKICAqIEludGVyY2VwdCBpb3JlbWFwKCkgcmVxdWVzdHMgZm9yIGFkZHJlc3NlcyBpbiBvdXIgZml4ZWQgbWFwcGluZyByZWdpb25zLgogICovCiB2b2lkIF9faW9tZW0gKm9tYXBfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHAsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKKworCVdBUk4oIWluaXRpYWxpemVkLCAiRG8gbm90IHVzZSBpb3JlbWFwIGJlZm9yZSBpbml0X2Vhcmx5XG4iKTsKKwogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxCiAJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CiAJCWlmIChCRVRXRUVOKHAsIE9NQVAxX0lPX1BIWVMsIE9NQVAxX0lPX1NJWkUpKQpAQCAtMTM5LDMgKzE0NSwxNSBAQAogCQlfX2lvdW5tYXAoYWRkcik7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfaW91bm1hcCk7CisKK3ZvaWQgX19pbml0IG9tYXBfaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0ZCX09NQVBfQ09OU0lTVEVOVF9ETUFfU0laRQorCWluaXRfY29uc2lzdGVudF9kbWFfc2l6ZShDT05GSUdfRkJfT01BUF9DT05TSVNURU5UX0RNQV9TSVpFIDw8IDIwKTsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdCBvbWFwX2lvcmVtYXBfaW5pdCh2b2lkKQoreworCWluaXRpYWxpemVkKys7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUtZGVidWcuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS1kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdjZjJmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb21tdS1kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qCi0gKiBvbWFwIGlvbW11OiBkZWJ1Z2ZzIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IE5va2lhIENvcnBvcmF0aW9uCi0gKgotICogV3JpdHRlbiBieSBIaXJvc2hpIERPWVUgPEhpcm9zaGkuRE9ZVUBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLQotI2luY2x1ZGUgPHBsYXQvaW9tbXUuaD4KLSNpbmNsdWRlIDxwbGF0L2lvdm1tLmg+Ci0KLSNpbmNsdWRlICJpb3BndGFibGUuaCIKLQotI2RlZmluZSBNQVhDT0xVTU4gMTAwIC8qIGZvciBzaG9ydCBtZXNzYWdlcyAqLwotCi1zdGF0aWMgREVGSU5FX01VVEVYKGlvbW11X2RlYnVnX2xvY2spOwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqaW9tbXVfZGVidWdfcm9vdDsKLQotc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF92ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JdTMyIHZlciA9IGlvbW11X2FyY2hfdmVyc2lvbigpOwotCWNoYXIgYnVmW01BWENPTFVNTl0sICpwID0gYnVmOwotCi0JcCArPSBzcHJpbnRmKHAsICJIL1cgdmVyc2lvbjogJWQuJWRcbiIsICh2ZXIgPj4gNCkgJiAweGYgLCB2ZXIgJiAweGYpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX3JlZ3Moc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKnAsICpidWY7Ci0Jc3NpemVfdCBieXRlczsKLQotCWJ1ZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwID0gYnVmOwotCi0JbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0KLQlieXRlcyA9IGlvbW11X2R1bXBfY3R4KG9iaiwgcCwgY291bnQpOwotCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgYnl0ZXMpOwotCi0JbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlrZnJlZShidWYpOwotCi0JcmV0dXJuIGJ5dGVzOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX3RsYihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpwLCAqYnVmOwotCXNzaXplX3QgYnl0ZXMsIHJlc3Q7Ci0KLQlidWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCi0JcCArPSBzcHJpbnRmKHAsICIlOHMgJThzXG4iLCAiY2FtOiIsICJyYW06Iik7Ci0JcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcmVzdCA9IGNvdW50IC0gKHAgLSBidWYpOwotCXAgKz0gZHVtcF90bGJfZW50cmllcyhvYmosIHAsIHJlc3QpOwotCi0JYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKLQotCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfd3JpdGVfcGFnZXRhYmxlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaW90bGJfZW50cnkgZTsKLQlzdHJ1Y3QgY3JfcmVncyBjcjsKLQlpbnQgZXJyOwotCXN0cnVjdCBpb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmW01BWENPTFVNTl0sICpwID0gYnVmOwotCi0JY291bnQgPSBtaW4oY291bnQsIHNpemVvZihidWYpKTsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCWlmIChjb3B5X2Zyb21fdXNlcihwLCB1c2VyYnVmLCBjb3VudCkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc3NjYW5mKHAsICIleCAleCIsICZjci5jYW0sICZjci5yYW0pOwotCWlmICghY3IuY2FtIHx8ICFjci5yYW0pIHsKLQkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW90bGJfY3JfdG9fZSgmY3IsICZlKTsKLQllcnIgPSBpb3BndGFibGVfc3RvcmVfZW50cnkob2JqLCAmZSk7Ci0JaWYgKGVycikKLQkJZGV2X2VycihvYmotPmRldiwgIiVzOiBmYWlsIHRvIHN0b3JlIGNyXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotI2RlZmluZSBkdW1wX2lvcHRhYmxlX2VudHJ5X29uZShsdiwgZGEsIHZhbCkJCQlcCi0JKHsJCQkJCQkJXAotCQlpbnQgX19lcnIgPSAwOwkJCQkJXAotCQlzc2l6ZV90IGJ5dGVzOwkJCQkJXAotCQljb25zdCBpbnQgbWF4Y29sID0gMjI7CQkJCVwKLQkJY29uc3QgY2hhciAqc3RyID0gIiVkOiAlMDh4ICUwOHhcbiI7CQlcCi0JCWJ5dGVzID0gc25wcmludGYocCwgbWF4Y29sLCBzdHIsIGx2LCBkYSwgdmFsKTsJXAotCQlwICs9IGJ5dGVzOwkJCQkJXAotCQlsZW4gLT0gYnl0ZXM7CQkJCQlcCi0JCWlmIChsZW4gPCBtYXhjb2wpCQkJCVwKLQkJCV9fZXJyID0gLUVOT01FTTsJCQlcCi0JCV9fZXJyOwkJCQkJCVwKLQl9KQotCi1zdGF0aWMgc3NpemVfdCBkdW1wX2lvcHRhYmxlKHN0cnVjdCBpb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgbGVuKQotewotCWludCBpOwotCXUzMiAqaW9wZ2Q7Ci0JY2hhciAqcCA9IGJ1ZjsKLQotCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCAwKTsKLQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QR0Q7IGkrKywgaW9wZ2QrKykgewotCQlpbnQgaiwgZXJyOwotCQl1MzIgKmlvcHRlOwotCQl1MzIgZGE7Ci0KLQkJaWYgKCEqaW9wZ2QpCi0JCQljb250aW51ZTsKLQotCQlpZiAoISgqaW9wZ2QgJiBJT1BHRF9UQUJMRSkpIHsKLQkJCWRhID0gaSA8PCBJT1BHRF9TSElGVDsKLQotCQkJZXJyID0gZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUoMSwgZGEsICppb3BnZCk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gb3V0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgMCk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IFBUUlNfUEVSX0lPUFRFOyBqKyssIGlvcHRlKyspIHsKLQkJCWlmICghKmlvcHRlKQotCQkJCWNvbnRpbnVlOwotCi0JCQlkYSA9IChpIDw8IElPUEdEX1NISUZUKSArIChqIDw8IElPUFRFX1NISUZUKTsKLQkJCWVyciA9IGR1bXBfaW9wdGFibGVfZW50cnlfb25lKDIsIGRhLCAqaW9wZ2QpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dDsKLQkJfQotCX0KLW91dDoKLQlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JcmV0dXJuIHAgLSBidWY7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfcGFnZXRhYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqcCwgKmJ1ZjsKLQlzaXplX3QgYnl0ZXM7Ci0KLQlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCXAgKz0gc3ByaW50ZihwLCAiTDogJThzICU4c1xuIiwgImRhOiIsICJwYToiKTsKLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCi0JYnl0ZXMgPSBQQUdFX1NJWkUgLSAocCAtIGJ1Zik7Ci0JcCArPSBkdW1wX2lvcHRhYmxlKG9iaiwgcCwgYnl0ZXMpOwotCi0JYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKLQotCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7Ci0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqcCwgKmJ1ZjsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKnRtcDsKLQlpbnQgdW5pbml0aWFsaXplZF92YXIoaSk7Ci0Jc3NpemVfdCBieXRlczsKLQotCWJ1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwID0gYnVmOwotCi0JcCArPSBzcHJpbnRmKHAsICIlLTNzICUtOHMgJS04cyAlNnMgJThzXG4iLAotCQkgICAgICJObyIsICJzdGFydCIsICJlbmQiLCAic2l6ZSIsICJmbGFncyIpOwotCXAgKz0gc3ByaW50ZihwLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0KLQltdXRleF9sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmb2JqLT5tbWFwLCBsaXN0KSB7Ci0JCXNpemVfdCBsZW47Ci0JCWNvbnN0IGNoYXIgKnN0ciA9ICIlM2QgJTA4eC0lMDh4ICU2eCAlOHhcbiI7Ci0JCWNvbnN0IGludCBtYXhjb2wgPSAzOTsKLQotCQlsZW4gPSB0bXAtPmRhX2VuZCAtIHRtcC0+ZGFfc3RhcnQ7Ci0JCXAgKz0gc25wcmludGYocCwgbWF4Y29sLCBzdHIsCi0JCQkgICAgICBpLCB0bXAtPmRhX3N0YXJ0LCB0bXAtPmRhX2VuZCwgbGVuLCB0bXAtPmZsYWdzKTsKLQotCQlpZiAoUEFHRV9TSVpFIC0gKHAgLSBidWYpIDwgbWF4Y29sKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0KLQlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOwotCi0JbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKLQotCXJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF9tZW0oc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqcCwgKmJ1ZjsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7Ci0Jc3NpemVfdCBieXRlczsKLQotCWNvdW50ID0gbWluX3Qoc3NpemVfdCwgY291bnQsIFBBR0VfU0laRSk7Ci0KLQlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcCA9IGJ1ZjsKLQotCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCi0JYXJlYSA9IGZpbmRfaW92bV9hcmVhKG9iaiwgKHUzMilwcG9zKTsKLQlpZiAoSVNfRVJSKGFyZWEpKSB7Ci0JCWJ5dGVzID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQltZW1jcHkocCwgYXJlYS0+dmEsIGNvdW50KTsKLQlwICs9IGNvdW50OwotCi0JYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKLWVycl9vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKLQotCXJldHVybiBieXRlczsKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfd3JpdGVfbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7Ci0JY2hhciAqcCwgKmJ1ZjsKLQotCWNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKLQotCWJ1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwID0gYnVmOwotCi0JbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIocCwgdXNlcmJ1ZiwgY291bnQpKSB7Ci0JCWNvdW50ID0gIC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlhcmVhID0gZmluZF9pb3ZtX2FyZWEob2JqLCAodTMyKXBwb3MpOwotCWlmIChJU19FUlIoYXJlYSkpIHsKLQkJY291bnQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCW1lbWNweShhcmVhLT52YSwgcCwgY291bnQpOwotZXJyX291dDoKLQltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IGRlYnVnX29wZW5fZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIERFQlVHX0ZPUFMobmFtZSkJCQkJCQlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfIyNuYW1lIyNfZm9wcyA9IHsJXAotCQkub3BlbiA9IGRlYnVnX29wZW5fZ2VuZXJpYywJCQkJXAotCQkucmVhZCA9IGRlYnVnX3JlYWRfIyNuYW1lLAkJCQlcCi0JCS53cml0ZSA9IGRlYnVnX3dyaXRlXyMjbmFtZSwJCQkJXAotCQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywJCQkJXAotCX07Ci0KLSNkZWZpbmUgREVCVUdfRk9QU19STyhuYW1lKQkJCQkJCVwKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z18jI25hbWUjI19mb3BzID0gewlcCi0JCS5vcGVuID0gZGVidWdfb3Blbl9nZW5lcmljLAkJCQlcCi0JCS5yZWFkID0gZGVidWdfcmVhZF8jI25hbWUsCQkJCVwKLQkJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKLQl9OwotCi1ERUJVR19GT1BTX1JPKHZlcik7Ci1ERUJVR19GT1BTX1JPKHJlZ3MpOwotREVCVUdfRk9QU19STyh0bGIpOwotREVCVUdfRk9QUyhwYWdldGFibGUpOwotREVCVUdfRk9QU19STyhtbWFwKTsKLURFQlVHX0ZPUFMobWVtKTsKLQotI2RlZmluZSBfX0RFQlVHX0FERF9GSUxFKGF0dHIsIG1vZGUpCQkJCQlcCi0JewkJCQkJCQkJXAotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OwkJCQkJXAotCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgjYXR0ciwgbW9kZSwgcGFyZW50LAkJXAotCQkJCQkgICBvYmosICZkZWJ1Z18jI2F0dHIjI19mb3BzKTsJXAotCQlpZiAoIWRlbnQpCQkJCQkJXAotCQkJcmV0dXJuIC1FTk9NRU07CQkJCQlcCi0JfQotCi0jZGVmaW5lIERFQlVHX0FERF9GSUxFKG5hbWUpIF9fREVCVUdfQUREX0ZJTEUobmFtZSwgNjAwKQotI2RlZmluZSBERUJVR19BRERfRklMRV9STyhuYW1lKSBfX0RFQlVHX0FERF9GSUxFKG5hbWUsIDQwMCkKLQotc3RhdGljIGludCBpb21tdV9kZWJ1Z19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBpb21tdSAqb2JqID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGRlbnRyeSAqZCwgKnBhcmVudDsKLQotCWlmICghb2JqIHx8ICFvYmotPmRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkID0gZGVidWdmc19jcmVhdGVfZGlyKG9iai0+bmFtZSwgaW9tbXVfZGVidWdfcm9vdCk7Ci0JaWYgKCFkKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwYXJlbnQgPSBkOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX3U4KCJucl90bGJfZW50cmllcyIsIDQwMCwgcGFyZW50LAotCQkJICAgICAgKHU4ICopJm9iai0+bnJfdGxiX2VudHJpZXMpOwotCWlmICghZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlERUJVR19BRERfRklMRV9STyh2ZXIpOwotCURFQlVHX0FERF9GSUxFX1JPKHJlZ3MpOwotCURFQlVHX0FERF9GSUxFX1JPKHRsYik7Ci0JREVCVUdfQUREX0ZJTEUocGFnZXRhYmxlKTsKLQlERUJVR19BRERfRklMRV9STyhtbWFwKTsKLQlERUJVR19BRERfRklMRShtZW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlvbW11X2RlYnVnX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkOwotCWludCBlcnI7Ci0KLQlkID0gZGVidWdmc19jcmVhdGVfZGlyKCJpb21tdSIsIE5VTEwpOwotCWlmICghZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaW9tbXVfZGVidWdfcm9vdCA9IGQ7Ci0KLQllcnIgPSBmb3JlYWNoX2lvbW11X2RldmljZShkLCBpb21tdV9kZWJ1Z19yZWdpc3Rlcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0OwotCXJldHVybiAwOwotCi1lcnJfb3V0OgotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpb21tdV9kZWJ1Z19yb290KTsKLQlyZXR1cm4gZXJyOwotfQotbW9kdWxlX2luaXQoaW9tbXVfZGVidWdfaW5pdCkKLQotc3RhdGljIHZvaWQgX19leGl0IGlvbW11X2RlYnVnZnNfZXhpdCh2b2lkKQotewotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpb21tdV9kZWJ1Z19yb290KTsKLX0KLW1vZHVsZV9leGl0KGlvbW11X2RlYnVnZnNfZXhpdCkKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJvbWFwIGlvbW11OiBkZWJ1Z2ZzIGludGVyZmFjZSIpOwotTU9EVUxFX0FVVEhPUigiSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2lvbW11LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYzMxZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9tbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDExMDIgKzAsMCBAQAotLyoKLSAqIG9tYXAgaW9tbXU6IHRsYiBhbmQgcGFnZXRhYmxlIHByaW1pdGl2ZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPiwKLSAqCQlQYXVsIE11bmR0IGFuZCBUb3NoaWhpcm8gS29iYXlhc2hpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotI2luY2x1ZGUgPHBsYXQvaW9tbXUuaD4KLQotI2luY2x1ZGUgImlvcGd0YWJsZS5oIgotCi0jZGVmaW5lIGZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgbiwgX19pLCBjcikJCQkJXAotCWZvciAoX19pID0gMDsJCQkJCQkJXAotCSAgICAgKF9faSA8IChuKSkgJiYgKGNyID0gX19pb3RsYl9yZWFkX2NyKChvYmopLCBfX2kpLCB0cnVlKTsJXAotCSAgICAgX19pKyspCi0KLS8qIGFjY29tbW9kYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb21hcDEgYW5kIG9tYXAyLzMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICphcmNoX2lvbW11OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2lvbW11X2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9wdGVfY2FjaGVwOwotCi0vKioKLSAqIGluc3RhbGxfaW9tbXVfYXJjaCAtIEluc3RhbGwgYXJjaHRlY3VyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKLSAqIEBvcHM6CWEgcG9pbnRlciB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW9tbXUgZnVuY3Rpb25zCi0gKgotICogVGhlcmUgYXJlIHNldmVyYWwga2luZCBvZiBpb21tdSBhbGdvcml0aG0odGxiLCBwYWdldGFibGUpIGFtb25nCi0gKiBvbWFwIHNlcmllcy4gVGhpcyBpbnRlcmZhY2UgaW5zdGFsbHMgc3VjaCBhbiBpb21tdSBhbGdvcmlnaG0uCi0gKiovCi1pbnQgaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcykKLXsKLQlpZiAoYXJjaF9pb21tdSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWFyY2hfaW9tbXUgPSBvcHM7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbnN0YWxsX2lvbW11X2FyY2gpOwotCi0vKioKLSAqIHVuaW5zdGFsbF9pb21tdV9hcmNoIC0gVW5pbnN0YWxsIGFyY2h0ZWN1cmUgc3BlY2lmaWMgaW9tbXUgZnVuY3Rpb25zCi0gKiBAb3BzOglhIHBvaW50ZXIgdG8gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGlvbW11IGZ1bmN0aW9ucwotICoKLSAqIFRoaXMgaW50ZXJmYWNlIHVuaW5zdGFsbHMgdGhlIGlvbW11IGFsZ29yaWdobSBpbnN0YWxsZWQgcHJldmlvdXNseS4KLSAqKi8KLXZvaWQgdW5pbnN0YWxsX2lvbW11X2FyY2goY29uc3Qgc3RydWN0IGlvbW11X2Z1bmN0aW9ucyAqb3BzKQotewotCWlmIChhcmNoX2lvbW11ICE9IG9wcykKLQkJcHJfZXJyKCIlczogbm90IHlvdXIgYXJjaFxuIiwgX19mdW5jX18pOwotCi0JYXJjaF9pb21tdSA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bmluc3RhbGxfaW9tbXVfYXJjaCk7Ci0KLS8qKgotICogaW9tbXVfc2F2ZV9jdHggLSBTYXZlIHJlZ2lzdGVycyBmb3IgcG0gb2ZmLW1vZGUgc3VwcG9ydAotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiovCi12b2lkIGlvbW11X3NhdmVfY3R4KHN0cnVjdCBpb21tdSAqb2JqKQotewotCWFyY2hfaW9tbXUtPnNhdmVfY3R4KG9iaik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9zYXZlX2N0eCk7Ci0KLS8qKgotICogaW9tbXVfcmVzdG9yZV9jdHggLSBSZXN0b3JlIHJlZ2lzdGVycyBmb3IgcG0gb2ZmLW1vZGUgc3VwcG9ydAotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiovCi12b2lkIGlvbW11X3Jlc3RvcmVfY3R4KHN0cnVjdCBpb21tdSAqb2JqKQotewotCWFyY2hfaW9tbXUtPnJlc3RvcmVfY3R4KG9iaik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9yZXN0b3JlX2N0eCk7Ci0KLS8qKgotICogaW9tbXVfYXJjaF92ZXJzaW9uIC0gUmV0dXJuIHJ1bm5pbmcgaW9tbXUgYXJjaCB2ZXJzaW9uCi0gKiovCi11MzIgaW9tbXVfYXJjaF92ZXJzaW9uKHZvaWQpCi17Ci0JcmV0dXJuIGFyY2hfaW9tbXUtPnZlcnNpb247Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9hcmNoX3ZlcnNpb24pOwotCi1zdGF0aWMgaW50IGlvbW11X2VuYWJsZShzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFvYmopCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFhcmNoX2lvbW11KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNsa19lbmFibGUob2JqLT5jbGspOwotCi0JZXJyID0gYXJjaF9pb21tdS0+ZW5hYmxlKG9iaik7Ci0KLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZShzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlpZiAoIW9iaikKLQkJcmV0dXJuOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0KLQlhcmNoX2lvbW11LT5kaXNhYmxlKG9iaik7Ci0KLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci19Ci0KLS8qCi0gKglUTEIgb3BlcmF0aW9ucwotICovCi12b2lkIGlvdGxiX2NyX3RvX2Uoc3RydWN0IGNyX3JlZ3MgKmNyLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCi17Ci0JQlVHX09OKCFjciB8fCAhZSk7Ci0KLQlhcmNoX2lvbW11LT5jcl90b19lKGNyLCBlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvdGxiX2NyX3RvX2UpOwotCi1zdGF0aWMgaW5saW5lIGludCBpb3RsYl9jcl92YWxpZChzdHJ1Y3QgY3JfcmVncyAqY3IpCi17Ci0JaWYgKCFjcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gYXJjaF9pb21tdS0+Y3JfdmFsaWQoY3IpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjcl9yZWdzICppb3RsYl9hbGxvY19jcihzdHJ1Y3QgaW9tbXUgKm9iaiwKLQkJCQkJICAgICBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCi17Ci0JaWYgKCFlKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBhcmNoX2lvbW11LT5hbGxvY19jcihvYmosIGUpOwotfQotCi11MzIgaW90bGJfY3JfdG9fdmlydChzdHJ1Y3QgY3JfcmVncyAqY3IpCi17Ci0JcmV0dXJuIGFyY2hfaW9tbXUtPmNyX3RvX3ZpcnQoY3IpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW90bGJfY3JfdG9fdmlydCk7Ci0KLXN0YXRpYyB1MzIgZ2V0X2lvcHRlX2F0dHIoc3RydWN0IGlvdGxiX2VudHJ5ICplKQotewotCXJldHVybiBhcmNoX2lvbW11LT5nZXRfcHRlX2F0dHIoZSk7Ci19Ci0KLXN0YXRpYyB1MzIgaW9tbXVfcmVwb3J0X2ZhdWx0KHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgKmRhKQotewotCXJldHVybiBhcmNoX2lvbW11LT5mYXVsdF9pc3Iob2JqLCBkYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvdGxiX2xvY2tfZ2V0KHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfbG9jayAqbCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gaW9tbXVfcmVhZF9yZWcob2JqLCBNTVVfTE9DSyk7Ci0KLQlsLT5iYXNlID0gTU1VX0xPQ0tfQkFTRSh2YWwpOwotCWwtPnZpY3QgPSBNTVVfTE9DS19WSUNUKHZhbCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgaW90bGJfbG9ja19zZXQoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9sb2NrICpsKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSAobC0+YmFzZSA8PCBNTVVfTE9DS19CQVNFX1NISUZUKTsKLQl2YWwgfD0gKGwtPnZpY3QgPDwgTU1VX0xPQ0tfVklDVF9TSElGVCk7Ci0KLQlpb21tdV93cml0ZV9yZWcob2JqLCB2YWwsIE1NVV9MT0NLKTsKLX0KLQotc3RhdGljIHZvaWQgaW90bGJfcmVhZF9jcihzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQotewotCWFyY2hfaW9tbXUtPnRsYl9yZWFkX2NyKG9iaiwgY3IpOwotfQotCi1zdGF0aWMgdm9pZCBpb3RsYl9sb2FkX2NyKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IpCi17Ci0JYXJjaF9pb21tdS0+dGxiX2xvYWRfY3Iob2JqLCBjcik7Ci0KLQlpb21tdV93cml0ZV9yZWcob2JqLCAxLCBNTVVfRkxVU0hfRU5UUlkpOwotCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9MRF9UTEIpOwotfQotCi0vKioKLSAqIGlvdGxiX2R1bXBfY3IgLSBEdW1wIGFuIGlvbW11IHRsYiBlbnRyeSBpbnRvIGJ1ZgotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAY3I6CQljb250ZW50cyBvZiBjYW0gYW5kIHJhbSByZWdpc3RlcgotICogQGJ1ZjoJb3V0cHV0IGJ1ZmZlcgotICoqLwotc3RhdGljIGlubGluZSBzc2l6ZV90IGlvdGxiX2R1bXBfY3Ioc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjciwKLQkJCQkgICAgY2hhciAqYnVmKQotewotCUJVR19PTighY3IgfHwgIWJ1Zik7Ci0KLQlyZXR1cm4gYXJjaF9pb21tdS0+ZHVtcF9jcihvYmosIGNyLCBidWYpOwotfQotCi0vKiBvbmx5IHVzZWQgaW4gaW90bGIgaXRlcmF0aW9uIGZvci1sb29wICovCi1zdGF0aWMgc3RydWN0IGNyX3JlZ3MgX19pb3RsYl9yZWFkX2NyKHN0cnVjdCBpb21tdSAqb2JqLCBpbnQgbikKLXsKLQlzdHJ1Y3QgY3JfcmVncyBjcjsKLQlzdHJ1Y3QgaW90bGJfbG9jayBsOwotCi0JaW90bGJfbG9ja19nZXQob2JqLCAmbCk7Ci0JbC52aWN0ID0gbjsKLQlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKLQlpb3RsYl9yZWFkX2NyKG9iaiwgJmNyKTsKLQotCXJldHVybiBjcjsKLX0KLQotLyoqCi0gKiBsb2FkX2lvdGxiX2VudHJ5IC0gU2V0IGFuIGlvbW11IHRsYiBlbnRyeQotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCi0gKiovCi1pbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3QgaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCBpb3RsYl9sb2NrIGw7Ci0Jc3RydWN0IGNyX3JlZ3MgKmNyOwotCi0JaWYgKCFvYmogfHwgIW9iai0+bnJfdGxiX2VudHJpZXMgfHwgIWUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0KLQlpb3RsYl9sb2NrX2dldChvYmosICZsKTsKLQlpZiAobC5iYXNlID09IG9iai0+bnJfdGxiX2VudHJpZXMpIHsKLQkJZGV2X3dhcm4ob2JqLT5kZXYsICIlczogcHJlc2VydmUgZW50cmllcyBmdWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghZS0+cHJzdmQpIHsKLQkJaW50IGk7Ci0JCXN0cnVjdCBjcl9yZWdzIHRtcDsKLQotCQlmb3JfZWFjaF9pb3RsYl9jcihvYmosIG9iai0+bnJfdGxiX2VudHJpZXMsIGksIHRtcCkKLQkJCWlmICghaW90bGJfY3JfdmFsaWQoJnRtcCkpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPT0gb2JqLT5ucl90bGJfZW50cmllcykgewotCQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBmdWxsOiBubyBlbnRyeVxuIiwgX19mdW5jX18pOwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpb3RsYl9sb2NrX2dldChvYmosICZsKTsKLQl9IGVsc2UgewotCQlsLnZpY3QgPSBsLmJhc2U7Ci0JCWlvdGxiX2xvY2tfc2V0KG9iaiwgJmwpOwotCX0KLQotCWNyID0gaW90bGJfYWxsb2NfY3Iob2JqLCBlKTsKLQlpZiAoSVNfRVJSKGNyKSkgewotCQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0JCXJldHVybiBQVFJfRVJSKGNyKTsKLQl9Ci0KLQlpb3RsYl9sb2FkX2NyKG9iaiwgY3IpOwotCWtmcmVlKGNyKTsKLQotCWlmIChlLT5wcnN2ZCkKLQkJbC5iYXNlKys7Ci0JLyogaW5jcmVtZW50IHZpY3RpbSBmb3IgbmV4dCB0bGIgbG9hZCAqLwotCWlmICgrK2wudmljdCA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKQotCQlsLnZpY3QgPSBsLmJhc2U7Ci0JaW90bGJfbG9ja19zZXQob2JqLCAmbCk7Ci1vdXQ6Ci0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChsb2FkX2lvdGxiX2VudHJ5KTsKLQotLyoqCi0gKiBmbHVzaF9pb3RsYl9wYWdlIC0gQ2xlYXIgYW4gaW9tbXUgdGxiIGVudHJ5Ci0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBDbGVhciBhbiBpb21tdSB0bGIgZW50cnkgd2hpY2ggaW5jbHVkZXMgJ2RhJyBhZGRyZXNzLgotICoqLwotdm9pZCBmbHVzaF9pb3RsYl9wYWdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGNyX3JlZ3MgY3I7Ci0KLQljbGtfZW5hYmxlKG9iai0+Y2xrKTsKLQotCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgb2JqLT5ucl90bGJfZW50cmllcywgaSwgY3IpIHsKLQkJdTMyIHN0YXJ0OwotCQlzaXplX3QgYnl0ZXM7Ci0KLQkJaWYgKCFpb3RsYl9jcl92YWxpZCgmY3IpKQotCQkJY29udGludWU7Ci0KLQkJc3RhcnQgPSBpb3RsYl9jcl90b192aXJ0KCZjcik7Ci0JCWJ5dGVzID0gaW9wZ3N6X3RvX2J5dGVzKGNyLmNhbSAmIDMpOwotCi0JCWlmICgoc3RhcnQgPD0gZGEpICYmIChkYSA8IHN0YXJ0ICsgYnl0ZXMpKSB7Ci0JCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHg8PSUwOHgoJXgpXG4iLAotCQkJCV9fZnVuY19fLCBzdGFydCwgZGEsIGJ5dGVzKTsKLQkJCWlvdGxiX2xvYWRfY3Iob2JqLCAmY3IpOwotCQkJaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0ZMVVNIX0VOVFJZKTsKLQkJfQotCX0KLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0KLQlpZiAoaSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKQotCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIHBhZ2UgZm9yICUwOHhcbiIsIF9fZnVuY19fLCBkYSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmbHVzaF9pb3RsYl9wYWdlKTsKLQotLyoqCi0gKiBmbHVzaF9pb3RsYl9yYW5nZSAtIENsZWFyIGFuIGlvbW11IHRsYiBlbnRyaWVzCi0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBzdGFydDoJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcyhzdGFydCkKLSAqIEBlbmQ6CWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MoZW5kKQotICoKLSAqIENsZWFyIGFuIGlvbW11IHRsYiBlbnRyeSB3aGljaCBpbmNsdWRlcyAnZGEnIGFkZHJlc3MuCi0gKiovCi12b2lkIGZsdXNoX2lvdGxiX3JhbmdlKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgc3RhcnQsIHUzMiBlbmQpCi17Ci0JdTMyIGRhID0gc3RhcnQ7Ci0KLQl3aGlsZSAoZGEgPCBlbmQpIHsKLQkJZmx1c2hfaW90bGJfcGFnZShvYmosIGRhKTsKLQkJLyogRklYTUU6IE9wdGltaXplIGZvciBtdWx0aXBsZSBwYWdlIHNpemUgKi8KLQkJZGEgKz0gSU9QVEVfU0laRTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmbHVzaF9pb3RsYl9yYW5nZSk7Ci0KLS8qKgotICogZmx1c2hfaW90bGJfYWxsIC0gQ2xlYXIgYWxsIGlvbW11IHRsYiBlbnRyaWVzCi0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqKi8KLXZvaWQgZmx1c2hfaW90bGJfYWxsKHN0cnVjdCBpb21tdSAqb2JqKQotewotCXN0cnVjdCBpb3RsYl9sb2NrIGw7Ci0KLQljbGtfZW5hYmxlKG9iai0+Y2xrKTsKLQotCWwuYmFzZSA9IDA7Ci0JbC52aWN0ID0gMDsKLQlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKLQotCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9HRkxVU0gpOwotCi0JY2xrX2Rpc2FibGUob2JqLT5jbGspOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZmx1c2hfaW90bGJfYWxsKTsKLQotLyoqCi0gKiBpb21tdV9zZXRfdHdsIC0gZW5hYmxlL2Rpc2FibGUgdGFibGUgd2Fsa2luZyBsb2dpYwotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiBAb246CQllbmFibGUvZGlzYWJsZQotICoKLSAqIEZ1bmN0aW9uIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgVFdMLiBJZiBvbmUgd2FudHMgdG8gd29yawotICogZXhjbHVzaXZlbHkgd2l0aCBsb2NrZWQgVExCIGVudHJpZXMgYW5kIHJlY2VpdmUgbm90aWZpY2F0aW9ucwotICogZm9yIFRMQiBtaXNzIHRoZW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRpc2FibGUgVFdMLgotICovCi12b2lkIGlvbW11X3NldF90d2woc3RydWN0IGlvbW11ICpvYmosIGJvb2wgb24pCi17Ci0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0JYXJjaF9pb21tdS0+c2V0X3R3bChvYmosIG9uKTsKLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9zZXRfdHdsKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfSU9NTVVfREVCVUdfTU9EVUxFKQotCi1zc2l6ZV90IGlvbW11X2R1bXBfY3R4KHN0cnVjdCBpb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgYnl0ZXMpCi17Ci0JaWYgKCFvYmogfHwgIWJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljbGtfZW5hYmxlKG9iai0+Y2xrKTsKLQotCWJ5dGVzID0gYXJjaF9pb21tdS0+ZHVtcF9jdHgob2JqLCBidWYsIGJ5dGVzKTsKLQotCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKLQotCXJldHVybiBieXRlczsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2R1bXBfY3R4KTsKLQotc3RhdGljIGludCBfX2R1bXBfdGxiX2VudHJpZXMoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcnMsIGludCBudW0pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlvdGxiX2xvY2sgc2F2ZWQ7Ci0Jc3RydWN0IGNyX3JlZ3MgdG1wOwotCXN0cnVjdCBjcl9yZWdzICpwID0gY3JzOwotCi0JY2xrX2VuYWJsZShvYmotPmNsayk7Ci0JaW90bGJfbG9ja19nZXQob2JqLCAmc2F2ZWQpOwotCi0JZm9yX2VhY2hfaW90bGJfY3Iob2JqLCBudW0sIGksIHRtcCkgewotCQlpZiAoIWlvdGxiX2NyX3ZhbGlkKCZ0bXApKQotCQkJY29udGludWU7Ci0JCSpwKysgPSB0bXA7Ci0JfQotCi0JaW90bGJfbG9ja19zZXQob2JqLCAmc2F2ZWQpOwotCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKLQotCXJldHVybiAgcCAtIGNyczsKLX0KLQotLyoqCi0gKiBkdW1wX3RsYl9lbnRyaWVzIC0gZHVtcCBjciBhcnJheXMgdG8gZ2l2ZW4gYnVmZmVyCi0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBidWY6CW91dHB1dCBidWZmZXIKLSAqKi8KLXNpemVfdCBkdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBpb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgYnl0ZXMpCi17Ci0JaW50IGksIG51bTsKLQlzdHJ1Y3QgY3JfcmVncyAqY3I7Ci0JY2hhciAqcCA9IGJ1ZjsKLQotCW51bSA9IGJ5dGVzIC8gc2l6ZW9mKCpjcik7Ci0JbnVtID0gbWluKG9iai0+bnJfdGxiX2VudHJpZXMsIG51bSk7Ci0KLQljciA9IGtjYWxsb2MobnVtLCBzaXplb2YoKmNyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjcikKLQkJcmV0dXJuIDA7Ci0KLQludW0gPSBfX2R1bXBfdGxiX2VudHJpZXMob2JqLCBjciwgbnVtKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0JCXAgKz0gaW90bGJfZHVtcF9jcihvYmosIGNyICsgaSwgcCk7Ci0Ja2ZyZWUoY3IpOwotCi0JcmV0dXJuIHAgLSBidWY7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkdW1wX3RsYl9lbnRyaWVzKTsKLQotaW50IGZvcmVhY2hfaW9tbXVfZGV2aWNlKHZvaWQgKmRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCi17Ci0JcmV0dXJuIGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJm9tYXBfaW9tbXVfZHJpdmVyLmRyaXZlciwKLQkJCQkgICAgICBOVUxMLCBkYXRhLCBmbik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmb3JlYWNoX2lvbW11X2RldmljZSk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfT01BUF9JT01NVV9ERUJVR19NT0RVTEUgKi8KLQotLyoKLSAqCUgvVyBwYWdldGFibGUgb3BlcmF0aW9ucwotICovCi1zdGF0aWMgdm9pZCBmbHVzaF9pb3BnZF9yYW5nZSh1MzIgKmZpcnN0LCB1MzIgKmxhc3QpCi17Ci0JLyogRklYTUU6IEwyIGNhY2hlIHNob3VsZCBiZSB0YWtlbiBjYXJlIG9mIGlmIGl0IGV4aXN0cyAqLwotCWRvIHsKLQkJYXNtKCJtY3IJcDE1LCAwLCAlMCwgYzcsIGMxMCwgMSBAIGZsdXNoX3BnZCIKLQkJICAgIDogOiAiciIgKGZpcnN0KSk7Ci0JCWZpcnN0ICs9IEwxX0NBQ0hFX0JZVEVTIC8gc2l6ZW9mKCpmaXJzdCk7Ci0JfSB3aGlsZSAoZmlyc3QgPD0gbGFzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsdXNoX2lvcHRlX3JhbmdlKHUzMiAqZmlyc3QsIHUzMiAqbGFzdCkKLXsKLQkvKiBGSVhNRTogTDIgY2FjaGUgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgaWYgaXQgZXhpc3RzICovCi0JZG8gewotCQlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzEwLCAxIEAgZmx1c2hfcHRlIgotCQkgICAgOiA6ICJyIiAoZmlyc3QpKTsKLQkJZmlyc3QgKz0gTDFfQ0FDSEVfQllURVMgLyBzaXplb2YoKmZpcnN0KTsKLQl9IHdoaWxlIChmaXJzdCA8PSBsYXN0KTsKLX0KLQotc3RhdGljIHZvaWQgaW9wdGVfZnJlZSh1MzIgKmlvcHRlKQotewotCS8qIE5vdGU6IGZyZWVkIGlvcHRlJ3MgbXVzdCBiZSBjbGVhbiByZWFkeSBmb3IgcmUtdXNlICovCi0Ja21lbV9jYWNoZV9mcmVlKGlvcHRlX2NhY2hlcCwgaW9wdGUpOwotfQotCi1zdGF0aWMgdTMyICppb3B0ZV9hbGxvYyhzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyICppb3BnZCwgdTMyIGRhKQotewotCXUzMiAqaW9wdGU7Ci0KLQkvKiBhIHRhYmxlIGhhcyBhbHJlYWR5IGV4aXN0ZWQgKi8KLQlpZiAoKmlvcGdkKQotCQlnb3RvIHB0ZV9yZWFkeTsKLQotCS8qCi0JICogZG8gdGhlIGFsbG9jYXRpb24gb3V0c2lkZSB0aGUgcGFnZSB0YWJsZSBsb2NrCi0JICovCi0Jc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQlpb3B0ZSA9IGttZW1fY2FjaGVfemFsbG9jKGlvcHRlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0Jc3Bpbl9sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0KLQlpZiAoISppb3BnZCkgewotCQlpZiAoIWlvcHRlKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQkJKmlvcGdkID0gdmlydF90b19waHlzKGlvcHRlKSB8IElPUEdEX1RBQkxFOwotCQlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QpOwotCi0JCWRldl92ZGJnKG9iai0+ZGV2LCAiJXM6IGEgbmV3IHB0ZTolcFxuIiwgX19mdW5jX18sIGlvcHRlKTsKLQl9IGVsc2UgewotCQkvKiBXZSByYWNlZCwgZnJlZSB0aGUgcmVkdW5pb3ZhbnQgdGFibGUgKi8KLQkJaW9wdGVfZnJlZShpb3B0ZSk7Ci0JfQotCi1wdGVfcmVhZHk6Ci0JaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKTsKLQotCWRldl92ZGJnKG9iai0+ZGV2LAotCQkgIiVzOiBkYTolMDh4IHBnZDolcCAqcGdkOiUwOHggcHRlOiVwICpwdGU6JTA4eFxuIiwKLQkJIF9fZnVuY19fLCBkYSwgaW9wZ2QsICppb3BnZCwgaW9wdGUsICppb3B0ZSk7Ci0KLQlyZXR1cm4gaW9wdGU7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wZ2RfYWxsb2Nfc2VjdGlvbihzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHUzMiBwcm90KQotewotCXUzMiAqaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7Ci0KLQlpZiAoKGRhIHwgcGEpICYgfklPU0VDVElPTl9NQVNLKSB7Ci0JCWRldl9lcnIob2JqLT5kZXYsICIlczogJTA4eDolMDh4IHNob3VsZCBhbGlnbmVkIG9uICUwOGx4XG4iLAotCQkJX19mdW5jX18sIGRhLCBwYSwgSU9TRUNUSU9OX1NJWkUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqaW9wZ2QgPSAocGEgJiBJT1NFQ1RJT05fTUFTSykgfCBwcm90IHwgSU9QR0RfU0VDVElPTjsKLQlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcGdkX2FsbG9jX3N1cGVyKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdTMyIHByb3QpCi17Ci0JdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQlpbnQgaTsKLQotCWlmICgoZGEgfCBwYSkgJiB+SU9TVVBFUl9NQVNLKSB7Ci0JCWRldl9lcnIob2JqLT5kZXYsICIlczogJTA4eDolMDh4IHNob3VsZCBhbGlnbmVkIG9uICUwOGx4XG4iLAotCQkJX19mdW5jX18sIGRhLCBwYSwgSU9TVVBFUl9TSVpFKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCSooaW9wZ2QgKyBpKSA9IChwYSAmIElPU1VQRVJfTUFTSykgfCBwcm90IHwgSU9QR0RfU1VQRVI7Ci0JZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkICsgMTUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcHRlX2FsbG9jX3BhZ2Uoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKLXsKLQl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOwotCXUzMiAqaW9wdGUgPSBpb3B0ZV9hbGxvYyhvYmosIGlvcGdkLCBkYSk7Ci0KLQlpZiAoSVNfRVJSKGlvcHRlKSkKLQkJcmV0dXJuIFBUUl9FUlIoaW9wdGUpOwotCi0JKmlvcHRlID0gKHBhICYgSU9QQUdFX01BU0spIHwgcHJvdCB8IElPUFRFX1NNQUxMOwotCWZsdXNoX2lvcHRlX3JhbmdlKGlvcHRlLCBpb3B0ZSk7Ci0KLQlkZXZfdmRiZyhvYmotPmRldiwgIiVzOiBkYTolMDh4IHBhOiUwOHggcHRlOiVwICpwdGU6JTA4eFxuIiwKLQkJIF9fZnVuY19fLCBkYSwgcGEsIGlvcHRlLCAqaW9wdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wdGVfYWxsb2NfbGFyZ2Uoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKLXsKLQl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOwotCXUzMiAqaW9wdGUgPSBpb3B0ZV9hbGxvYyhvYmosIGlvcGdkLCBkYSk7Ci0JaW50IGk7Ci0KLQlpZiAoKGRhIHwgcGEpICYgfklPTEFSR0VfTUFTSykgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6ICUwOHg6JTA4eCBzaG91bGQgYWxpZ25lZCBvbiAlMDhseFxuIiwKLQkJCV9fZnVuY19fLCBkYSwgcGEsIElPTEFSR0VfU0laRSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChJU19FUlIoaW9wdGUpKQotCQlyZXR1cm4gUFRSX0VSUihpb3B0ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJKihpb3B0ZSArIGkpID0gKHBhICYgSU9MQVJHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9MQVJHRTsKLQlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUgKyAxNSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW9wZ3RhYmxlX3N0b3JlX2VudHJ5X2NvcmUoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKLXsKLQlpbnQgKCpmbikoc3RydWN0IGlvbW11ICosIHUzMiwgdTMyLCB1MzIpOwotCXUzMiBwcm90OwotCWludCBlcnI7Ci0KLQlpZiAoIW9iaiB8fCAhZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGUtPnBnc3opIHsKLQljYXNlIE1NVV9DQU1fUEdTWl8xNk06Ci0JCWZuID0gaW9wZ2RfYWxsb2Nfc3VwZXI7Ci0JCWJyZWFrOwotCWNhc2UgTU1VX0NBTV9QR1NaXzFNOgotCQlmbiA9IGlvcGdkX2FsbG9jX3NlY3Rpb247Ci0JCWJyZWFrOwotCWNhc2UgTU1VX0NBTV9QR1NaXzY0SzoKLQkJZm4gPSBpb3B0ZV9hbGxvY19sYXJnZTsKLQkJYnJlYWs7Ci0JY2FzZSBNTVVfQ0FNX1BHU1pfNEs6Ci0JCWZuID0gaW9wdGVfYWxsb2NfcGFnZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZm4gPSBOVUxMOwotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0JcHJvdCA9IGdldF9pb3B0ZV9hdHRyKGUpOwotCi0Jc3Bpbl9sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0JZXJyID0gZm4ob2JqLCBlLT5kYSwgZS0+cGEsIHByb3QpOwotCXNwaW5fdW5sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioKLSAqIGlvcGd0YWJsZV9zdG9yZV9lbnRyeSAtIE1ha2UgYW4gaW9tbXUgcHRlIGVudHJ5Ci0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBlOgkJYW4gaW9tbXUgdGxiIGVudHJ5IGluZm8KLSAqKi8KLWludCBpb3BndGFibGVfc3RvcmVfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKLXsKLQlpbnQgZXJyOwotCi0JZmx1c2hfaW90bGJfcGFnZShvYmosIGUtPmRhKTsKLQllcnIgPSBpb3BndGFibGVfc3RvcmVfZW50cnlfY29yZShvYmosIGUpOwotI2lmZGVmIFBSRUZFVENIX0lPVExCCi0JaWYgKCFlcnIpCi0JCWxvYWRfaW90bGJfZW50cnkob2JqLCBlKTsKLSNlbmRpZgotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb3BndGFibGVfc3RvcmVfZW50cnkpOwotCi0vKioKLSAqIGlvcGd0YWJsZV9sb29rdXBfZW50cnkgLSBMb29rdXAgYW4gaW9tbXUgcHRlIGVudHJ5Ci0gKiBAb2JqOgl0YXJnZXQgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqIEBwcGdkOglpb21tdSBwZ2QgZW50cnkgcG9pbnRlciB0byBiZSByZXR1cm5lZAotICogQHBwdGU6CWlvbW11IHB0ZSBlbnRyeSBwb2ludGVyIHRvIGJlIHJldHVybmVkCi0gKiovCi12b2lkIGlvcGd0YWJsZV9sb29rdXBfZW50cnkoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyICoqcHBnZCwgdTMyICoqcHB0ZSkKLXsKLQl1MzIgKmlvcGdkLCAqaW9wdGUgPSBOVUxMOwotCi0JaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7Ci0JaWYgKCEqaW9wZ2QpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGlvcGdkX2lzX3RhYmxlKCppb3BnZCkpCi0JCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7Ci1vdXQ6Ci0JKnBwZ2QgPSBpb3BnZDsKLQkqcHB0ZSA9IGlvcHRlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9wZ3RhYmxlX2xvb2t1cF9lbnRyeSk7Ci0KLXN0YXRpYyBzaXplX3QgaW9wZ3RhYmxlX2NsZWFyX2VudHJ5X2NvcmUoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzaXplX3QgYnl0ZXM7Ci0JdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQlpbnQgbmVudCA9IDE7Ci0KLQlpZiAoISppb3BnZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaW9wZ2RfaXNfdGFibGUoKmlvcGdkKSkgewotCQlpbnQgaTsKLQkJdTMyICppb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgZGEpOwotCi0JCWJ5dGVzID0gSU9QVEVfU0laRTsKLQkJaWYgKCppb3B0ZSAmIElPUFRFX0xBUkdFKSB7Ci0JCQluZW50ICo9IDE2OwotCQkJLyogcmV3aW5kIHRvIHRoZSAxc3QgZW50cnkgKi8KLQkJCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCAoZGEgJiBJT0xBUkdFX01BU0spKTsKLQkJfQotCQlieXRlcyAqPSBuZW50OwotCQltZW1zZXQoaW9wdGUsIDAsIG5lbnQgKiBzaXplb2YoKmlvcHRlKSk7Ci0JCWZsdXNoX2lvcHRlX3JhbmdlKGlvcHRlLCBpb3B0ZSArIChuZW50IC0gMSkgKiBzaXplb2YoKmlvcHRlKSk7Ci0KLQkJLyoKLQkJICogZG8gdGFibGUgd2FsayB0byBjaGVjayBpZiB0aGlzIHRhYmxlIGlzIG5lY2Vzc2FyeSBvciBub3QKLQkJICovCi0JCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCAwKTsKLQkJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX0lPUFRFOyBpKyspCi0JCQlpZiAoaW9wdGVbaV0pCi0JCQkJZ290byBvdXQ7Ci0KLQkJaW9wdGVfZnJlZShpb3B0ZSk7Ci0JCW5lbnQgPSAxOyAvKiBmb3IgdGhlIG5leHQgTDEgZW50cnkgKi8KLQl9IGVsc2UgewotCQlieXRlcyA9IElPUEdEX1NJWkU7Ci0JCWlmICgoKmlvcGdkICYgSU9QR0RfU1VQRVIpID09IElPUEdEX1NVUEVSKSB7Ci0JCQluZW50ICo9IDE2OwotCQkJLyogcmV3aW5kIHRvIHRoZSAxc3QgZW50cnkgKi8KLQkJCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgKGRhICYgSU9TVVBFUl9NQVNLKSk7Ci0JCX0KLQkJYnl0ZXMgKj0gbmVudDsKLQl9Ci0JbWVtc2V0KGlvcGdkLCAwLCBuZW50ICogc2l6ZW9mKCppb3BnZCkpOwotCWZsdXNoX2lvcGdkX3JhbmdlKGlvcGdkLCBpb3BnZCArIChuZW50IC0gMSkgKiBzaXplb2YoKmlvcGdkKSk7Ci1vdXQ6Ci0JcmV0dXJuIGJ5dGVzOwotfQotCi0vKioKLSAqIGlvcGd0YWJsZV9jbGVhcl9lbnRyeSAtIFJlbW92ZSBhbiBpb21tdSBwdGUgZW50cnkKLSAqIEBvYmo6CXRhcmdldCBpb21tdQotICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcwotICoqLwotc2l6ZV90IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKQotewotCXNpemVfdCBieXRlczsKLQotCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JYnl0ZXMgPSBpb3BndGFibGVfY2xlYXJfZW50cnlfY29yZShvYmosIGRhKTsKLQlmbHVzaF9pb3RsYl9wYWdlKG9iaiwgZGEpOwotCi0Jc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQotCXJldHVybiBieXRlczsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvcGd0YWJsZV9jbGVhcl9lbnRyeSk7Ci0KLXN0YXRpYyB2b2lkIGlvcGd0YWJsZV9jbGVhcl9lbnRyeV9hbGwoc3RydWN0IGlvbW11ICpvYmopCi17Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9JT1BHRDsgaSsrKSB7Ci0JCXUzMiBkYTsKLQkJdTMyICppb3BnZDsKLQotCQlkYSA9IGkgPDwgSU9QR0RfU0hJRlQ7Ci0JCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOwotCi0JCWlmICghKmlvcGdkKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGlvcGdkX2lzX3RhYmxlKCppb3BnZCkpCi0JCQlpb3B0ZV9mcmVlKGlvcHRlX29mZnNldChpb3BnZCwgMCkpOwotCi0JCSppb3BnZCA9IDA7Ci0JCWZsdXNoX2lvcGdkX3JhbmdlKGlvcGdkLCBpb3BnZCk7Ci0JfQotCi0JZmx1c2hfaW90bGJfYWxsKG9iaik7Ci0KLQlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotfQotCi0vKgotICoJRGV2aWNlIElPTU1VIGdlbmVyaWMgb3BlcmF0aW9ucwotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW9tbXVfZmF1bHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXUzMiBkYSwgZXJyczsKLQl1MzIgKmlvcGdkLCAqaW9wdGU7Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBkYXRhOwotCi0JaWYgKCFvYmotPnJlZmNvdW50KQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQljbGtfZW5hYmxlKG9iai0+Y2xrKTsKLQllcnJzID0gaW9tbXVfcmVwb3J0X2ZhdWx0KG9iaiwgJmRhKTsKLQljbGtfZGlzYWJsZShvYmotPmNsayk7Ci0JaWYgKGVycnMgPT0gMCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JLyogRmF1bHQgY2FsbGJhY2sgb3IgVExCL1BURSBEeW5hbWljIGxvYWRpbmcgKi8KLQlpZiAob2JqLT5pc3IgJiYgIW9iai0+aXNyKG9iaiwgZGEsIGVycnMsIG9iai0+aXNyX3ByaXYpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlpb21tdV9kaXNhYmxlKG9iaik7Ci0KLQlpb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKLQotCWlmICghaW9wZ2RfaXNfdGFibGUoKmlvcGdkKSkgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IGVycnM6MHglMDh4IGRhOjB4JTA4eCBwZ2Q6MHglcCAiCi0JCQkiKnBnZDpweCUwOHhcbiIsIG9iai0+bmFtZSwgZXJycywgZGEsIGlvcGdkLCAqaW9wZ2QpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKTsKLQotCWRldl9lcnIob2JqLT5kZXYsICIlczogZXJyczoweCUwOHggZGE6MHglMDh4IHBnZDoweCVwICpwZ2Q6MHglMDh4ICIKLQkJInB0ZToweCVwICpwdGU6MHglMDh4XG4iLCBvYmotPm5hbWUsIGVycnMsIGRhLCBpb3BnZCwgKmlvcGdkLAotCQlpb3B0ZSwgKmlvcHRlKTsKLQotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIGludCBkZXZpY2VfbWF0Y2hfYnlfYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpb21tdSAqb2JqID0gdG9faW9tbXUoZGV2KTsKLQljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKLQotCXByX2RlYnVnKCIlczogJXMgJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUsIG5hbWUpOwotCi0JcmV0dXJuIHN0cmNtcChvYmotPm5hbWUsIG5hbWUpID09IDA7Ci19Ci0KLS8qKgotICogaW9tbXVfc2V0X2RhX3JhbmdlIC0gU2V0IGEgdmFsaWQgZGV2aWNlIGFkZHJlc3MgcmFuZ2UKLSAqIEBvYmo6CQl0YXJnZXQgaW9tbXUKLSAqIEBzdGFydAkJU3RhcnQgb2YgdmFsaWQgcmFuZ2UKLSAqIEBlbmQJCQlFbmQgb2YgdmFsaWQgcmFuZ2UKLSAqKi8KLWludCBpb21tdV9zZXRfZGFfcmFuZ2Uoc3RydWN0IGlvbW11ICpvYmosIHUzMiBzdGFydCwgdTMyIGVuZCkKLXsKLQotCWlmICghb2JqKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChlbmQgPCBzdGFydCB8fCAhUEFHRV9BTElHTihzdGFydCB8IGVuZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2JqLT5kYV9zdGFydCA9IHN0YXJ0OwotCW9iai0+ZGFfZW5kID0gZW5kOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV9zZXRfZGFfcmFuZ2UpOwotCi0vKioKLSAqIGlvbW11X2dldCAtIEdldCBpb21tdSBoYW5kbGVyCi0gKiBAbmFtZToJdGFyZ2V0IGlvbW11IG5hbWUKLSAqKi8KLXN0cnVjdCBpb21tdSAqaW9tbXVfZ2V0KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBpb21tdSAqb2JqOwotCi0JZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKCZvbWFwX2lvbW11X2RyaXZlci5kcml2ZXIsIE5VTEwsICh2b2lkICopbmFtZSwKLQkJCQkgZGV2aWNlX21hdGNoX2J5X2FsaWFzKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0KLQlvYmogPSB0b19pb21tdShkZXYpOwotCi0JbXV0ZXhfbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQotCWlmIChvYmotPnJlZmNvdW50KysgPT0gMCkgewotCQllcnIgPSBpb21tdV9lbmFibGUob2JqKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX2VuYWJsZTsKLQkJZmx1c2hfaW90bGJfYWxsKG9iaik7Ci0JfQotCi0JaWYgKCF0cnlfbW9kdWxlX2dldChvYmotPm93bmVyKSkKLQkJZ290byBlcnJfbW9kdWxlOwotCi0JbXV0ZXhfdW5sb2NrKCZvYmotPmlvbW11X2xvY2spOwotCi0JZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlc1xuIiwgX19mdW5jX18sIG9iai0+bmFtZSk7Ci0JcmV0dXJuIG9iajsKLQotZXJyX21vZHVsZToKLQlpZiAob2JqLT5yZWZjb3VudCA9PSAxKQotCQlpb21tdV9kaXNhYmxlKG9iaik7Ci1lcnJfZW5hYmxlOgotCW9iai0+cmVmY291bnQtLTsKLQltdXRleF91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2dldCk7Ci0KLS8qKgotICogaW9tbXVfcHV0IC0gUHV0IGJhY2sgaW9tbXUgaGFuZGxlcgotICogQG9iajoJdGFyZ2V0IGlvbW11Ci0gKiovCi12b2lkIGlvbW11X3B1dChzdHJ1Y3QgaW9tbXUgKm9iaikKLXsKLQlpZiAoIW9iaiB8fCBJU19FUlIob2JqKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQotCWlmICgtLW9iai0+cmVmY291bnQgPT0gMCkKLQkJaW9tbXVfZGlzYWJsZShvYmopOwotCi0JbW9kdWxlX3B1dChvYmotPm93bmVyKTsKLQotCW11dGV4X3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfcHV0KTsKLQotaW50IGlvbW11X3NldF9pc3IoY29uc3QgY2hhciAqbmFtZSwKLQkJICBpbnQgKCppc3IpKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBpb21tdV9lcnJzLAotCQkJICAgICB2b2lkICpwcml2KSwKLQkJICB2b2lkICppc3JfcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGlvbW11ICpvYmo7Ci0KLQlkZXYgPSBkcml2ZXJfZmluZF9kZXZpY2UoJm9tYXBfaW9tbXVfZHJpdmVyLmRyaXZlciwgTlVMTCwgKHZvaWQgKiluYW1lLAotCQkJCSBkZXZpY2VfbWF0Y2hfYnlfYWxpYXMpOwotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9iaiA9IHRvX2lvbW11KGRldik7Ci0JbXV0ZXhfbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQlpZiAob2JqLT5yZWZjb3VudCAhPSAwKSB7Ci0JCW11dGV4X3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0Jb2JqLT5pc3IgPSBpc3I7Ci0Jb2JqLT5pc3JfcHJpdiA9IGlzcl9wcml2OwotCW11dGV4X3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2V0X2lzcik7Ci0KLS8qCi0gKglPTUFQIERldmljZSBNTVUoSU9NTVUpIGRldGVjdGlvbgotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwX2lvbW11X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGVyciA9IC1FTk9ERVY7Ci0Jdm9pZCAqcDsKLQlpbnQgaXJxOwotCXN0cnVjdCBpb21tdSAqb2JqOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBpb21tdV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlvYmogPSBremFsbG9jKHNpemVvZigqb2JqKSArIE1NVV9SRUdfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvYmopCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jb2JqLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIHBkYXRhLT5jbGtfbmFtZSk7Ci0JaWYgKElTX0VSUihvYmotPmNsaykpCi0JCWdvdG8gZXJyX2NsazsKLQotCW9iai0+bnJfdGxiX2VudHJpZXMgPSBwZGF0YS0+bnJfdGxiX2VudHJpZXM7Ci0Jb2JqLT5uYW1lID0gcGRhdGEtPm5hbWU7Ci0Jb2JqLT5kZXYgPSAmcGRldi0+ZGV2OwotCW9iai0+Y3R4ID0gKHZvaWQgKilvYmogKyBzaXplb2YoKm9iaik7Ci0Jb2JqLT5kYV9zdGFydCA9IHBkYXRhLT5kYV9zdGFydDsKLQlvYmotPmRhX2VuZCA9IHBkYXRhLT5kYV9lbmQ7Ci0KLQltdXRleF9pbml0KCZvYmotPmlvbW11X2xvY2spOwotCW11dGV4X2luaXQoJm9iai0+bW1hcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmb2JqLT5wYWdlX3RhYmxlX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZvYmotPm1tYXApOwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9tZW07Ci0JfQotCi0JcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCWlmICghcmVzKSB7Ci0JCWVyciA9IC1FSU87Ci0JCWdvdG8gZXJyX21lbTsKLQl9Ci0KLQlvYmotPnJlZ2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFvYmotPnJlZ2Jhc2UpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfaW9yZW1hcDsKLQl9Ci0KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0JZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBpb21tdV9mYXVsdF9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIG9iaik7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyX2lycTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvYmopOwotCi0JcCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoSU9QR0RfVEFCTEVfU0laRSkpOwotCWlmICghcCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wZ2Q7Ci0JfQotCW1lbXNldChwLCAwLCBJT1BHRF9UQUJMRV9TSVpFKTsKLQljbGVhbl9kY2FjaGVfYXJlYShwLCBJT1BHRF9UQUJMRV9TSVpFKTsKLQlvYmotPmlvcGdkID0gcDsKLQotCUJVR19PTighSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZylvYmotPmlvcGdkLCBJT1BHRF9UQUJMRV9TSVpFKSk7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgcmVnaXN0ZXJlZFxuIiwgb2JqLT5uYW1lKTsKLQlyZXR1cm4gMDsKLQotZXJyX3BnZDoKLQlmcmVlX2lycShpcnEsIG9iaik7Ci1lcnJfaXJxOgotCWlvdW5tYXAob2JqLT5yZWdiYXNlKTsKLWVycl9pb3JlbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotZXJyX21lbToKLQljbGtfcHV0KG9iai0+Y2xrKTsKLWVycl9jbGs6Ci0Ja2ZyZWUob2JqKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwX2lvbW11X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBpcnE7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0Jc3RydWN0IGlvbW11ICpvYmogPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0JaW9wZ3RhYmxlX2NsZWFyX2VudHJ5X2FsbChvYmopOwotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpb2JqLT5pb3BnZCwgZ2V0X29yZGVyKElPUEdEX1RBQkxFX1NJWkUpKTsKLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JZnJlZV9pcnEoaXJxLCBvYmopOwotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaW91bm1hcChvYmotPnJlZ2Jhc2UpOwotCi0JY2xrX3B1dChvYmotPmNsayk7Ci0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlbW92ZWRcbiIsIG9iai0+bmFtZSk7Ci0Ja2ZyZWUob2JqKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9pb21tdV9kcml2ZXIgPSB7Ci0JLnByb2JlCT0gb21hcF9pb21tdV9wcm9iZSwKLQkucmVtb3ZlCT0gX19kZXZleGl0X3Aob21hcF9pb21tdV9yZW1vdmUpLAotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gIm9tYXAtaW9tbXUiLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBpb3B0ZV9jYWNoZXBfY3Rvcih2b2lkICppb3B0ZSkKLXsKLQljbGVhbl9kY2FjaGVfYXJlYShpb3B0ZSwgSU9QVEVfVEFCTEVfU0laRSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfaW9tbXVfaW5pdCh2b2lkKQotewotCXN0cnVjdCBrbWVtX2NhY2hlICpwOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTTEFCX0hXQ0FDSEVfQUxJR047Ci0Jc2l6ZV90IGFsaWduID0gMSA8PCAxMDsgLyogTDIgcGFnZXRhYmxlIGFsaWduZW1lbnQgKi8KLQotCXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW9wdGVfY2FjaGUiLCBJT1BURV9UQUJMRV9TSVpFLCBhbGlnbiwgZmxhZ3MsCi0JCQkgICAgICBpb3B0ZV9jYWNoZXBfY3Rvcik7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpb3B0ZV9jYWNoZXAgPSBwOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9pb21tdV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQob21hcF9pb21tdV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG9tYXBfaW9tbXVfZXhpdCh2b2lkKQotewotCWttZW1fY2FjaGVfZGVzdHJveShpb3B0ZV9jYWNoZXApOwotCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfaW9tbXVfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG9tYXBfaW9tbXVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogdGxiIGFuZCBwYWdldGFibGUgcHJpbWl0aXZlcyIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvbWFwLWlvbW11Iik7Ci1NT0RVTEVfQVVUSE9SKCJIaXJvc2hpIERPWVUsIFBhdWwgTXVuZHQgYW5kIFRvc2hpaGlybyBLb2JheWFzaGkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb3BndGFibGUuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb3BndGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlOTNiYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW9wZ3RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIG9tYXAgaW9tbXU6IHBhZ2V0YWJsZSBkZWZpbml0aW9ucwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIE5va2lhIENvcnBvcmF0aW9uCi0gKgotICogV3JpdHRlbiBieSBIaXJvc2hpIERPWVUgPEhpcm9zaGkuRE9ZVUBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fUExBVF9PTUFQX0lPTU1VX0gKLSNkZWZpbmUgX19QTEFUX09NQVBfSU9NTVVfSAotCi0vKgotICogIkwyIHRhYmxlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgSU9QR0RfU0hJRlQJCTIwCi0jZGVmaW5lIElPUEdEX1NJWkUJCSgxVUwgPDwgSU9QR0RfU0hJRlQpCi0jZGVmaW5lIElPUEdEX01BU0sJCSh+KElPUEdEX1NJWkUgLSAxKSkKLQotLyoKLSAqICJzZWN0aW9uIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgSU9TRUNUSU9OX1NISUZUCQkyMAotI2RlZmluZSBJT1NFQ1RJT05fU0laRQkJKDFVTCA8PCBJT1NFQ1RJT05fU0hJRlQpCi0jZGVmaW5lIElPU0VDVElPTl9NQVNLCQkofihJT1NFQ1RJT05fU0laRSAtIDEpKQotCi0vKgotICogInN1cGVyc2VjdGlvbiIgYWRkcmVzcyBtYXNrIGFuZCBzaXplIGRlZmluaXRpb25zLgotICovCi0jZGVmaW5lIElPU1VQRVJfU0hJRlQJCTI0Ci0jZGVmaW5lIElPU1VQRVJfU0laRQkJKDFVTCA8PCBJT1NVUEVSX1NISUZUKQotI2RlZmluZSBJT1NVUEVSX01BU0sJCSh+KElPU1VQRVJfU0laRSAtIDEpKQotCi0jZGVmaW5lIFBUUlNfUEVSX0lPUEdECQkoMVVMIDw8ICgzMiAtIElPUEdEX1NISUZUKSkKLSNkZWZpbmUgSU9QR0RfVEFCTEVfU0laRQkoUFRSU19QRVJfSU9QR0QgKiBzaXplb2YodTMyKSkKLQotLyoKLSAqICJzbWFsbCBwYWdlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgSU9QVEVfU0hJRlQJCTEyCi0jZGVmaW5lIElPUFRFX1NJWkUJCSgxVUwgPDwgSU9QVEVfU0hJRlQpCi0jZGVmaW5lIElPUFRFX01BU0sJCSh+KElPUFRFX1NJWkUgLSAxKSkKLQotLyoKLSAqICJsYXJnZSBwYWdlIiBhZGRyZXNzIG1hc2sgYW5kIHNpemUgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgSU9MQVJHRV9TSElGVAkJMTYKLSNkZWZpbmUgSU9MQVJHRV9TSVpFCQkoMVVMIDw8IElPTEFSR0VfU0hJRlQpCi0jZGVmaW5lIElPTEFSR0VfTUFTSwkJKH4oSU9MQVJHRV9TSVpFIC0gMSkpCi0KLSNkZWZpbmUgUFRSU19QRVJfSU9QVEUJCSgxVUwgPDwgKElPUEdEX1NISUZUIC0gSU9QVEVfU0hJRlQpKQotI2RlZmluZSBJT1BURV9UQUJMRV9TSVpFCShQVFJTX1BFUl9JT1BURSAqIHNpemVvZih1MzIpKQotCi0jZGVmaW5lIElPUEFHRV9NQVNLCQlJT1BURV9NQVNLCi0KLS8qCi0gKiBzb21lIGRlc2NyaXB0b3IgYXR0cmlidXRlcy4KLSAqLwotI2RlZmluZSBJT1BHRF9UQUJMRQkJKDEgPDwgMCkKLSNkZWZpbmUgSU9QR0RfU0VDVElPTgkJKDIgPDwgMCkKLSNkZWZpbmUgSU9QR0RfU1VQRVIJCSgxIDw8IDE4IHwgMiA8PCAwKQotCi0jZGVmaW5lIGlvcGdkX2lzX3RhYmxlKHgpCSgoKHgpICYgMykgPT0gSU9QR0RfVEFCTEUpCi0KLSNkZWZpbmUgSU9QVEVfU01BTEwJCSgyIDw8IDApCi0jZGVmaW5lIElPUFRFX0xBUkdFCQkoMSA8PCAwKQotCi0vKiB0byBmaW5kIGFuIGVudHJ5IGluIGEgcGFnZS10YWJsZS1kaXJlY3RvcnkgKi8KLSNkZWZpbmUgaW9wZ2RfaW5kZXgoZGEpCQkoKChkYSkgPj4gSU9QR0RfU0hJRlQpICYgKFBUUlNfUEVSX0lPUEdEIC0gMSkpCi0jZGVmaW5lIGlvcGdkX29mZnNldChvYmosIGRhKQkoKG9iaiktPmlvcGdkICsgaW9wZ2RfaW5kZXgoZGEpKQotCi0jZGVmaW5lIGlvcGdkX3BhZ2VfcGFkZHIoaW9wZ2QpCSgqaW9wZ2QgJiB+KCgxIDw8IDEwKSAtIDEpKQotI2RlZmluZSBpb3BnZF9wYWdlX3ZhZGRyKGlvcGdkKQkoKHUzMiAqKXBoeXNfdG9fdmlydChpb3BnZF9wYWdlX3BhZGRyKGlvcGdkKSkpCi0KLS8qIHRvIGZpbmQgYW4gZW50cnkgaW4gdGhlIHNlY29uZC1sZXZlbCBwYWdlIHRhYmxlLiAqLwotI2RlZmluZSBpb3B0ZV9pbmRleChkYSkJCSgoKGRhKSA+PiBJT1BURV9TSElGVCkgJiAoUFRSU19QRVJfSU9QVEUgLSAxKSkKLSNkZWZpbmUgaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSkJKGlvcGdkX3BhZ2VfdmFkZHIoaW9wZ2QpICsgaW9wdGVfaW5kZXgoZGEpKQotCi1zdGF0aWMgaW5saW5lIHUzMiBpb3RsYl9pbml0X2VudHJ5KHN0cnVjdCBpb3RsYl9lbnRyeSAqZSwgdTMyIGRhLCB1MzIgcGEsCi0JCQkJICAgdTMyIGZsYWdzKQotewotCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKLQotCWUtPmRhCQk9IGRhOwotCWUtPnBhCQk9IHBhOwotCWUtPnZhbGlkCT0gMTsKLQkvKiBGSVhNRTogYWRkIE9NQVAxIHN1cHBvcnQgKi8KLQllLT5wZ3N6CQk9IGZsYWdzICYgTU1VX0NBTV9QR1NaX01BU0s7Ci0JZS0+ZW5kaWFuCT0gZmxhZ3MgJiBNTVVfUkFNX0VORElBTl9NQVNLOwotCWUtPmVsc3oJCT0gZmxhZ3MgJiBNTVVfUkFNX0VMU1pfTUFTSzsKLQllLT5taXhlZAk9IGZsYWdzICYgTU1VX1JBTV9NSVhFRF9NQVNLOwotCi0JcmV0dXJuIGlvcGdzel90b19ieXRlcyhlLT5wZ3N6KTsKLX0KLQotI2RlZmluZSB0b19pb21tdShkZXYpCQkJCQkJCVwKLQkoc3RydWN0IGlvbW11ICopcGxhdGZvcm1fZ2V0X2RydmRhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpCi0KLSNlbmRpZiAvKiBfX1BMQVRfT01BUF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW92bW0uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU3ZmVkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pb3ZtbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLS8qCi0gKiBvbWFwIGlvbW11OiBzaW1wbGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLQotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+Ci0jaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgotCi0jaW5jbHVkZSAiaW9wZ3RhYmxlLmgiCi0KLS8qCi0gKiBBIGRldmljZSBkcml2ZXIgbmVlZHMgdG8gY3JlYXRlIGFkZHJlc3MgbWFwcGluZ3MgYmV0d2VlbjoKLSAqCi0gKiAtIGlvbW11L2RldmljZSBhZGRyZXNzCi0gKiAtIHBoeXNpY2FsIGFkZHJlc3MKLSAqIC0gbXB1IHZpcnR1YWwgYWRkcmVzcwotICoKLSAqIFRoZXJlIGFyZSA0IHBvc3NpYmxlIHBhdHRlcm5zIGZvciB0aGVtOgotICoKLSAqICAgIHxpb3ZhLwkJCSAgbWFwcGluZwkJaW9tbXVfCQlwYWdlCi0gKiAgICB8IGRhCXBhCXZhCShkKS0ocCktKHYpCQlmdW5jdGlvbgl0eXBlCi0gKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgMSB8IGMJYwljCSAxIC0gMSAtIDEJICBfa21hcCgpIC8gX2t1bm1hcCgpCXMKLSAqICAyIHwgYwljLGEJYwkgMSAtIDEgLSAxCV9rbWFsbG9jKCkvIF9rZnJlZSgpCXMKLSAqICAzIHwgYwlkCWMJIDEgLSBuIC0gMQkgIF92bWFwKCkgLyBfdnVubWFwKCkJcwotICogIDQgfCBjCWQsYQljCSAxIC0gbiAtIDEJX3ZtYWxsb2MoKS8gX3ZmcmVlKCkJbioKLSAqCi0gKgotICoJJ2lvdmEnOglkZXZpY2UgaW9tbXUgdmlydHVhbCBhZGRyZXNzCi0gKgknZGEnOglhbGlhcyBvZiAnaW92YScKLSAqCSdwYSc6CXBoeXNpY2FsIGFkZHJlc3MKLSAqCSd2YSc6CW1wdSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKgknYyc6CWNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEKLSAqCSdkJzoJZGlzY29udGlndW91cyBtZW1vcnkgYXJlYQotICoJJ2EnOglhbm9ueW1vdXMgbWVtb3J5IGFsbG9jYXRpb24KLSAqCScoKSc6CW9wdGlvbmFsIGZlYXR1cmUKLSAqCi0gKgknbic6CWEgbm9ybWFsIHBhZ2UoNEtCKSBzaXplIGlzIHVzZWQuCi0gKgkncyc6CW11bHRpcGxlIGlvbW11IHN1cGVycGFnZSgxNk1CLCAxTUIsIDY0S0IsIDRLQikgc2l6ZSBpcyB1c2VkLgotICoKLSAqCScqJzoJbm90IHlldCwgYnV0IGZlYXNpYmxlLgotICovCi0KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW92bV9hcmVhX2NhY2hlcDsKLQotLyogcmV0dXJuIHRvdGFsIGJ5dGVzIG9mIHNnIGJ1ZmZlcnMgKi8KLXN0YXRpYyBzaXplX3Qgc2d0YWJsZV9sZW4oY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QpCi17Ci0JdW5zaWduZWQgaW50IGksIHRvdGFsID0gMDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCi0JaWYgKCFzZ3QpCi0JCXJldHVybiAwOwotCi0JZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7Ci0JCXNpemVfdCBieXRlczsKLQotCQlieXRlcyA9IHNnLT5sZW5ndGg7Ci0KLQkJaWYgKCFpb3Bnc3pfb2soYnl0ZXMpKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZ1slZF0gbm90IGlvbW11IHBhZ2VzaXplKCV4KVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaSwgYnl0ZXMpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQl0b3RhbCArPSBieXRlczsKLQl9Ci0KLQlyZXR1cm4gdG90YWw7Ci19Ci0jZGVmaW5lIHNndGFibGVfb2soeCkJKCEhc2d0YWJsZV9sZW4oeCkpCi0KLXN0YXRpYyB1bnNpZ25lZCBtYXhfYWxpZ25tZW50KHUzMiBhZGRyKQotewotCWludCBpOwotCXVuc2lnbmVkIHBhZ2VzaXplW10gPSB7IFNaXzE2TSwgU1pfMU0sIFNaXzY0SywgU1pfNEssIH07Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGFnZXNpemUpICYmIGFkZHIgJiAocGFnZXNpemVbaV0gLSAxKTsgaSsrKQotCQk7Ci0JcmV0dXJuIChpIDwgQVJSQVlfU0laRShwYWdlc2l6ZSkpID8gcGFnZXNpemVbaV0gOiAwOwotfQotCi0vKgotICogY2FsY3VsYXRlIHRoZSBvcHRpbWFsIG51bWJlciBzZyBlbGVtZW50cyBmcm9tIHRvdGFsIGJ5dGVzIGJhc2VkIG9uCi0gKiBpb21tdSBzdXBlcnBhZ2VzCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBzZ3RhYmxlX25lbnRzKHNpemVfdCBieXRlcywgdTMyIGRhLCB1MzIgcGEpCi17Ci0JdW5zaWduZWQgbnJfZW50cmllcyA9IDAsIGVudF9zejsKLQotCWlmICghSVNfQUxJR05FRChieXRlcywgUEFHRV9TSVpFKSkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBzaXplICUwOHhcbiIsIF9fZnVuY19fLCBieXRlcyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXdoaWxlIChieXRlcykgewotCQllbnRfc3ogPSBtYXhfYWxpZ25tZW50KGRhIHwgcGEpOwotCQllbnRfc3ogPSBtaW5fdCh1bnNpZ25lZCwgZW50X3N6LCBpb3Bnc3pfbWF4KGJ5dGVzKSk7Ci0JCW5yX2VudHJpZXMrKzsKLQkJZGEgKz0gZW50X3N6OwotCQlwYSArPSBlbnRfc3o7Ci0JCWJ5dGVzIC09IGVudF9zejsKLQl9Ci0KLQlyZXR1cm4gbnJfZW50cmllczsKLX0KLQotLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc2dfdGFibGUgaGVhZGVyKGEga2luZCBvZiAnc3VwZXJibG9jaycpICovCi1zdGF0aWMgc3RydWN0IHNnX3RhYmxlICpzZ3RhYmxlX2FsbG9jKGNvbnN0IHNpemVfdCBieXRlcywgdTMyIGZsYWdzLAotCQkJCQkJCXUzMiBkYSwgdTMyIHBhKQotewotCXVuc2lnbmVkIGludCBucl9lbnRyaWVzOwotCWludCBlcnI7Ci0Jc3RydWN0IHNnX3RhYmxlICpzZ3Q7Ci0KLQlpZiAoIWJ5dGVzKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCWlmICghSVNfQUxJR05FRChieXRlcywgUEFHRV9TSVpFKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlpZiAoZmxhZ3MgJiBJT1ZNRl9MSU5FQVIpIHsKLQkJbnJfZW50cmllcyA9IHNndGFibGVfbmVudHMoYnl0ZXMsIGRhLCBwYSk7Ci0JCWlmICghbnJfZW50cmllcykKLQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0gZWxzZQotCQlucl9lbnRyaWVzID0gIGJ5dGVzIC8gUEFHRV9TSVpFOwotCi0Jc2d0ID0ga3phbGxvYyhzaXplb2YoKnNndCksIEdGUF9LRVJORUwpOwotCWlmICghc2d0KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWVyciA9IHNnX2FsbG9jX3RhYmxlKHNndCwgbnJfZW50cmllcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVycikgewotCQlrZnJlZShzZ3QpOwotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCX0KLQotCXByX2RlYnVnKCIlczogc2d0OiVwKCVkIGVudHJpZXMpXG4iLCBfX2Z1bmNfXywgc2d0LCBucl9lbnRyaWVzKTsKLQotCXJldHVybiBzZ3Q7Ci19Ci0KLS8qIGZyZWUgc2dfdGFibGUgaGVhZGVyKGEga2luZCBvZiBzdXBlcmJsb2NrKSAqLwotc3RhdGljIHZvaWQgc2d0YWJsZV9mcmVlKHN0cnVjdCBzZ190YWJsZSAqc2d0KQotewotCWlmICghc2d0KQotCQlyZXR1cm47Ci0KLQlzZ19mcmVlX3RhYmxlKHNndCk7Ci0Ja2ZyZWUoc2d0KTsKLQotCXByX2RlYnVnKCIlczogc2d0OiVwXG4iLCBfX2Z1bmNfXywgc2d0KTsKLX0KLQotLyogbWFwICdzZ2xpc3QnIHRvIGEgY29udGlndW91cyBtcHUgdmlydHVhbCBhcmVhIGFuZCByZXR1cm4gJ3ZhJyAqLwotc3RhdGljIHZvaWQgKnZtYXBfc2coY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QpCi17Ci0JdTMyIHZhOwotCXNpemVfdCB0b3RhbDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKm5ldzsKLQljb25zdCBzdHJ1Y3QgbWVtX3R5cGUgKm10eXBlOwotCi0JbXR5cGUgPSBnZXRfbWVtX3R5cGUoTVRfREVWSUNFKTsKLQlpZiAoIW10eXBlKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCXRvdGFsID0gc2d0YWJsZV9sZW4oc2d0KTsKLQlpZiAoIXRvdGFsKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCW5ldyA9IF9fZ2V0X3ZtX2FyZWEodG90YWwsIFZNX0lPUkVNQVAsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5EKTsKLQlpZiAoIW5ldykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JdmEgPSAodTMyKW5ldy0+YWRkcjsKLQotCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgewotCQlzaXplX3QgYnl0ZXM7Ci0JCXUzMiBwYTsKLQkJaW50IGVycjsKLQotCQlwYSA9IHNnX3BoeXMoc2cpOwotCQlieXRlcyA9IHNnLT5sZW5ndGg7Ci0KLQkJQlVHX09OKGJ5dGVzICE9IFBBR0VfU0laRSk7Ci0KLQkJZXJyID0gaW9yZW1hcF9wYWdlKHZhLCAgcGEsIG10eXBlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQotCQl2YSArPSBieXRlczsKLQl9Ci0KLQlmbHVzaF9jYWNoZV92bWFwKCh1bnNpZ25lZCBsb25nKW5ldy0+YWRkciwKLQkJCQkodW5zaWduZWQgbG9uZykobmV3LT5hZGRyICsgdG90YWwpKTsKLQlyZXR1cm4gbmV3LT5hZGRyOwotCi1lcnJfb3V0OgotCVdBUk5fT04oMSk7IC8qIEZJWE1FOiBjbGVhbnVwIHNvbWUgbXB1IG1hcHBpbmdzICovCi0JdnVubWFwKG5ldy0+YWRkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2dW5tYXBfc2coY29uc3Qgdm9pZCAqdmEpCi17Ci0JdnVubWFwKHZhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpb3ZtX3N0cnVjdCAqX19maW5kX2lvdm1fYXJlYShzdHJ1Y3QgaW9tbXUgKm9iaiwgY29uc3QgdTMyIGRhKQotewotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZvYmotPm1tYXAsIGxpc3QpIHsKLQkJaWYgKChkYSA+PSB0bXAtPmRhX3N0YXJ0KSAmJiAoZGEgPCB0bXAtPmRhX2VuZCkpIHsKLQkJCXNpemVfdCBsZW47Ci0KLQkJCWxlbiA9IHRtcC0+ZGFfZW5kIC0gdG1wLT5kYV9zdGFydDsKLQotCQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwKLQkJCQlfX2Z1bmNfXywgdG1wLT5kYV9zdGFydCwgZGEsIHRtcC0+ZGFfZW5kLCBsZW4sCi0JCQkJdG1wLT5mbGFncyk7Ci0KLQkJCXJldHVybiB0bXA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiBmaW5kX2lvdm1fYXJlYSAgLSAgZmluZCBpb3ZtYSB3aGljaCBpbmNsdWRlcyBAZGEKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBGaW5kIHRoZSBleGlzdGluZyBpb3ZtYSBzdGFydGluZyBhdCBAZGEKLSAqLwotc3RydWN0IGlvdm1fc3RydWN0ICpmaW5kX2lvdm1fYXJlYShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKQotewotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYTsKLQotCW11dGV4X2xvY2soJm9iai0+bW1hcF9sb2NrKTsKLQlhcmVhID0gX19maW5kX2lvdm1fYXJlYShvYmosIGRhKTsKLQltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKLQotCXJldHVybiBhcmVhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZmluZF9pb3ZtX2FyZWEpOwotCi0vKgotICogVGhpcyBmaW5kcyB0aGUgaG9sZShhcmVhKSB3aGljaCBmaXRzIHRoZSByZXF1ZXN0ZWQgYWRkcmVzcyBhbmQgbGVuCi0gKiBpbiBpb3ZtYXMgbW1hcCwgYW5kIHJldHVybnMgdGhlIG5ldyBhbGxvY2F0ZWQgaW92bWEuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFsbG9jX2lvdm1fYXJlYShzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLAotCQkJCQkgICBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm5ldywgKnRtcDsKLQl1MzIgc3RhcnQsIHByZXZfZW5kLCBhbGlnbm1lbnQ7Ci0KLQlpZiAoIW9iaiB8fCAhYnl0ZXMpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jc3RhcnQgPSBkYTsKLQlhbGlnbm1lbnQgPSBQQUdFX1NJWkU7Ci0KLQlpZiAofmZsYWdzICYgSU9WTUZfREFfRklYRUQpIHsKLQkJLyogRG9uJ3QgbWFwIGFkZHJlc3MgMCAqLwotCQlzdGFydCA9IG9iai0+ZGFfc3RhcnQgPyBvYmotPmRhX3N0YXJ0IDogYWxpZ25tZW50OwotCi0JCWlmIChmbGFncyAmIElPVk1GX0xJTkVBUikKLQkJCWFsaWdubWVudCA9IGlvcGdzel9tYXgoYnl0ZXMpOwotCQlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIGFsaWdubWVudCk7Ci0JfSBlbHNlIGlmIChzdGFydCA8IG9iai0+ZGFfc3RhcnQgfHwgc3RhcnQgPiBvYmotPmRhX2VuZCB8fAotCQkJCQlvYmotPmRhX2VuZCAtIHN0YXJ0IDwgYnl0ZXMpIHsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0JdG1wID0gTlVMTDsKLQlpZiAobGlzdF9lbXB0eSgmb2JqLT5tbWFwKSkKLQkJZ290byBmb3VuZDsKLQotCXByZXZfZW5kID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgewotCi0JCWlmIChwcmV2X2VuZCA+IHN0YXJ0KQotCQkJYnJlYWs7Ci0KLQkJaWYgKHRtcC0+ZGFfc3RhcnQgPiBzdGFydCAmJiAodG1wLT5kYV9zdGFydCAtIHN0YXJ0KSA+PSBieXRlcykKLQkJCWdvdG8gZm91bmQ7Ci0KLQkJaWYgKHRtcC0+ZGFfZW5kID49IHN0YXJ0ICYmIH5mbGFncyAmIElPVk1GX0RBX0ZJWEVEKQotCQkJc3RhcnQgPSByb3VuZHVwKHRtcC0+ZGFfZW5kICsgMSwgYWxpZ25tZW50KTsKLQotCQlwcmV2X2VuZCA9IHRtcC0+ZGFfZW5kOwotCX0KLQotCWlmICgoc3RhcnQgPj0gcHJldl9lbmQpICYmIChvYmotPmRhX2VuZCAtIHN0YXJ0ID49IGJ5dGVzKSkKLQkJZ290byBmb3VuZDsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gc3BhY2UgdG8gZml0ICUwOHgoJXgpIGZsYWdzOiAlMDh4XG4iLAotCQlfX2Z1bmNfXywgZGEsIGJ5dGVzLCBmbGFncyk7Ci0KLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotZm91bmQ6Ci0JbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoaW92bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXcpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JbmV3LT5pb21tdSA9IG9iajsKLQluZXctPmRhX3N0YXJ0ID0gc3RhcnQ7Ci0JbmV3LT5kYV9lbmQgPSBzdGFydCArIGJ5dGVzOwotCW5ldy0+ZmxhZ3MgPSBmbGFnczsKLQotCS8qCi0JICoga2VlcCBhc2NlbmRpbmcgb3JkZXIgb2YgaW92bWFzCi0JICovCi0JaWYgKHRtcCkKLQkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmdG1wLT5saXN0KTsKLQllbHNlCi0JCWxpc3RfYWRkKCZuZXctPmxpc3QsICZvYmotPm1tYXApOwotCi0JZGV2X2RiZyhvYmotPmRldiwgIiVzOiBmb3VuZCAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwKLQkJX19mdW5jX18sIG5ldy0+ZGFfc3RhcnQsIHN0YXJ0LCBuZXctPmRhX2VuZCwgYnl0ZXMsIGZsYWdzKTsKLQotCXJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfaW92bV9hcmVhKHN0cnVjdCBpb21tdSAqb2JqLCBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWEpCi17Ci0Jc2l6ZV90IGJ5dGVzOwotCi0JQlVHX09OKCFvYmogfHwgIWFyZWEpOwotCi0JYnl0ZXMgPSBhcmVhLT5kYV9lbmQgLSBhcmVhLT5kYV9zdGFydDsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogJTA4eC0lMDh4KCV4KSAlMDh4XG4iLAotCQlfX2Z1bmNfXywgYXJlYS0+ZGFfc3RhcnQsIGFyZWEtPmRhX2VuZCwgYnl0ZXMsIGFyZWEtPmZsYWdzKTsKLQotCWxpc3RfZGVsKCZhcmVhLT5saXN0KTsKLQlrbWVtX2NhY2hlX2ZyZWUoaW92bV9hcmVhX2NhY2hlcCwgYXJlYSk7Ci19Ci0KLS8qKgotICogZGFfdG9fdmEgLSBjb252ZXJ0IChkKSB0byAodikKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcwotICogQHZhOgkJbXB1IHZpcnR1YWwgYWRkcmVzcwotICoKLSAqIFJldHVybnMgbXB1IHZpcnR1YWwgYWRkciB3aGljaCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIGRldmljZSB2aXJ0dWFsIGFkZHIKLSAqLwotdm9pZCAqZGFfdG9fdmEoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQl2b2lkICp2YSA9IE5VTEw7Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOwotCi0JbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOwotCi0JYXJlYSA9IF9fZmluZF9pb3ZtX2FyZWEob2JqLCBkYSk7Ci0JaWYgKCFhcmVhKSB7Ci0JCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gZGEgYXJlYSglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKLQkJZ290byBvdXQ7Ci0JfQotCXZhID0gYXJlYS0+dmE7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0KLQlyZXR1cm4gdmE7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkYV90b192YSk7Ci0KLXN0YXRpYyB2b2lkIHNndGFibGVfZmlsbF92bWFsbG9jKHN0cnVjdCBzZ190YWJsZSAqc2d0LCB2b2lkICpfdmEpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl2b2lkICp2YSA9IF92YTsKLQl2b2lkICp2YV9lbmQ7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIHNndC0+bmVudHMsIGkpIHsKLQkJc3RydWN0IHBhZ2UgKnBnOwotCQljb25zdCBzaXplX3QgYnl0ZXMgPSBQQUdFX1NJWkU7Ci0KLQkJLyoKLQkJICogaW9tbXUgJ3N1cGVycGFnZScgaXNuJ3Qgc3VwcG9ydGVkIHdpdGggJ2lvbW11X3ZtYWxsb2MoKScKLQkJICovCi0JCXBnID0gdm1hbGxvY190b19wYWdlKHZhKTsKLQkJQlVHX09OKCFwZyk7Ci0JCXNnX3NldF9wYWdlKHNnLCBwZywgYnl0ZXMsIDApOwotCi0JCXZhICs9IGJ5dGVzOwotCX0KLQotCXZhX2VuZCA9IF92YSArIFBBR0VfU0laRSAqIGk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZ3RhYmxlX2RyYWluX3ZtYWxsb2Moc3RydWN0IHNnX3RhYmxlICpzZ3QpCi17Ci0JLyoKLQkgKiBBY3R1YWxseSB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYXQgYWxsLCBqdXN0IGV4aXN0cyBmb3IKLQkgKiBjb25zaXN0ZW5jeSBvZiB0aGUgY29kZSByZWFkYWJpbGl0eS4KLQkgKi8KLQlCVUdfT04oIXNndCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNndGFibGVfZmlsbF9rbWFsbG9jKHN0cnVjdCBzZ190YWJsZSAqc2d0LCB1MzIgcGEsIHUzMiBkYSwKLQkJCQkJCQkJc2l6ZV90IGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCi0JZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7Ci0JCXVuc2lnbmVkIGJ5dGVzOwotCi0JCWJ5dGVzID0gbWF4X2FsaWdubWVudChkYSB8IHBhKTsKLQkJYnl0ZXMgPSBtaW5fdCh1bnNpZ25lZCwgYnl0ZXMsIGlvcGdzel9tYXgobGVuKSk7Ci0KLQkJQlVHX09OKCFpb3Bnc3pfb2soYnl0ZXMpKTsKLQotCQlzZ19zZXRfYnVmKHNnLCBwaHlzX3RvX3ZpcnQocGEpLCBieXRlcyk7Ci0JCS8qCi0JCSAqICdwYScgaXMgY290aW51b3VzKGxpbmVhcikuCi0JCSAqLwotCQlwYSArPSBieXRlczsKLQkJZGEgKz0gYnl0ZXM7Ci0JCWxlbiAtPSBieXRlczsKLQl9Ci0JQlVHX09OKGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZ3RhYmxlX2RyYWluX2ttYWxsb2Moc3RydWN0IHNnX3RhYmxlICpzZ3QpCi17Ci0JLyoKLQkgKiBBY3R1YWxseSB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYXQgYWxsLCBqdXN0IGV4aXN0cyBmb3IKLQkgKiBjb25zaXN0ZW5jeSBvZiB0aGUgY29kZSByZWFkYWJpbGl0eQotCSAqLwotCUJVR19PTighc2d0KTsKLX0KLQotLyogY3JlYXRlICdkYScgPC0+ICdwYScgbWFwcGluZyBmcm9tICdzZ3QnICovCi1zdGF0aWMgaW50IG1hcF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3ZtX3N0cnVjdCAqbmV3LAotCQkJIGNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LCB1MzIgZmxhZ3MpCi17Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXUzMiBkYSA9IG5ldy0+ZGFfc3RhcnQ7Ci0KLQlpZiAoIW9iaiB8fCAhc2d0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCUJVR19PTighc2d0YWJsZV9vayhzZ3QpKTsKLQotCWZvcl9lYWNoX3NnKHNndC0+c2dsLCBzZywgc2d0LT5uZW50cywgaSkgewotCQl1MzIgcGE7Ci0JCWludCBwZ3N6OwotCQlzaXplX3QgYnl0ZXM7Ci0JCXN0cnVjdCBpb3RsYl9lbnRyeSBlOwotCi0JCXBhID0gc2dfcGh5cyhzZyk7Ci0JCWJ5dGVzID0gc2ctPmxlbmd0aDsKLQotCQlmbGFncyAmPSB+SU9WTUZfUEdTWl9NQVNLOwotCQlwZ3N6ID0gYnl0ZXNfdG9faW9wZ3N6KGJ5dGVzKTsKLQkJaWYgKHBnc3ogPCAwKQotCQkJZ290byBlcnJfb3V0OwotCQlmbGFncyB8PSBwZ3N6OwotCi0JCXByX2RlYnVnKCIlczogWyVkXSAlMDh4ICUwOHgoJXgpXG4iLCBfX2Z1bmNfXywKLQkJCSBpLCBkYSwgcGEsIGJ5dGVzKTsKLQotCQlpb3RsYl9pbml0X2VudHJ5KCZlLCBkYSwgcGEsIGZsYWdzKTsKLQkJZXJyID0gaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KG9iaiwgJmUpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0OwotCi0JCWRhICs9IGJ5dGVzOwotCX0KLQlyZXR1cm4gMDsKLQotZXJyX291dDoKLQlkYSA9IG5ldy0+ZGFfc3RhcnQ7Ci0KLQlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIGksIGopIHsKLQkJc2l6ZV90IGJ5dGVzOwotCi0JCWJ5dGVzID0gaW9wZ3RhYmxlX2NsZWFyX2VudHJ5KG9iaiwgZGEpOwotCi0JCUJVR19PTighaW9wZ3N6X29rKGJ5dGVzKSk7Ci0KLQkJZGEgKz0gYnl0ZXM7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLS8qIHJlbGVhc2UgJ2RhJyA8LT4gJ3BhJyBtYXBwaW5nICovCi1zdGF0aWMgdm9pZCB1bm1hcF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIHN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYSkKLXsKLQl1MzIgc3RhcnQ7Ci0Jc2l6ZV90IHRvdGFsID0gYXJlYS0+ZGFfZW5kIC0gYXJlYS0+ZGFfc3RhcnQ7Ci0KLQlCVUdfT04oKCF0b3RhbCkgfHwgIUlTX0FMSUdORUQodG90YWwsIFBBR0VfU0laRSkpOwotCi0Jc3RhcnQgPSBhcmVhLT5kYV9zdGFydDsKLQl3aGlsZSAodG90YWwgPiAwKSB7Ci0JCXNpemVfdCBieXRlczsKLQotCQlieXRlcyA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShvYmosIHN0YXJ0KTsKLQkJaWYgKGJ5dGVzID09IDApCi0JCQlieXRlcyA9IFBBR0VfU0laRTsKLQkJZWxzZQotCQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiB1bm1hcCAlMDh4KCV4KSAlMDh4XG4iLAotCQkJCV9fZnVuY19fLCBzdGFydCwgYnl0ZXMsIGFyZWEtPmZsYWdzKTsKLQotCQlCVUdfT04oIUlTX0FMSUdORUQoYnl0ZXMsIFBBR0VfU0laRSkpOwotCi0JCXRvdGFsIC09IGJ5dGVzOwotCQlzdGFydCArPSBieXRlczsKLQl9Ci0JQlVHX09OKHRvdGFsKTsKLX0KLQotLyogdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGFsbCB1bm1hcHBpbmcgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnVubWFwX3ZtX2FyZWEoc3RydWN0IGlvbW11ICpvYmosIGNvbnN0IHUzMiBkYSwKLQkJCQkgICAgICB2b2lkICgqZm4pKGNvbnN0IHZvaWQgKiksIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IE5VTEw7Ci0Jc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOwotCi0JaWYgKCFJU19BTElHTkVEKGRhLCBQQUdFX1NJWkUpKSB7Ci0JCWRldl9lcnIob2JqLT5kZXYsICIlczogYWxpZ25tZW50IGVyciglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOwotCi0JYXJlYSA9IF9fZmluZF9pb3ZtX2FyZWEob2JqLCBkYSk7Ci0JaWYgKCFhcmVhKSB7Ci0JCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gZGEgYXJlYSglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKChhcmVhLT5mbGFncyAmIGZsYWdzKSAhPSBmbGFncykgewotCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IHdyb25nIGZsYWdzKCUwOHgpXG4iLCBfX2Z1bmNfXywKLQkJCWFyZWEtPmZsYWdzKTsKLQkJZ290byBvdXQ7Ci0JfQotCXNndCA9IChzdHJ1Y3Qgc2dfdGFibGUgKilhcmVhLT5zZ3Q7Ci0KLQl1bm1hcF9pb3ZtX2FyZWEob2JqLCBhcmVhKTsKLQotCWZuKGFyZWEtPnZhKTsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogJTA4eC0lMDh4LSUwOHgoJXgpICUwOHhcbiIsIF9fZnVuY19fLAotCQlhcmVhLT5kYV9zdGFydCwgZGEsIGFyZWEtPmRhX2VuZCwKLQkJYXJlYS0+ZGFfZW5kIC0gYXJlYS0+ZGFfc3RhcnQsIGFyZWEtPmZsYWdzKTsKLQotCWZyZWVfaW92bV9hcmVhKG9iaiwgYXJlYSk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0KLQlyZXR1cm4gc2d0OwotfQotCi1zdGF0aWMgdTMyIG1hcF9pb21tdV9yZWdpb24oc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwKLQkgICAgICBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqdmEsIHNpemVfdCBieXRlcywgdTMyIGZsYWdzKQotewotCWludCBlcnIgPSAtRU5PTUVNOwotCXN0cnVjdCBpb3ZtX3N0cnVjdCAqbmV3OwotCi0JbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOwotCi0JbmV3ID0gYWxsb2NfaW92bV9hcmVhKG9iaiwgZGEsIGJ5dGVzLCBmbGFncyk7Ci0JaWYgKElTX0VSUihuZXcpKSB7Ci0JCWVyciA9IFBUUl9FUlIobmV3KTsKLQkJZ290byBlcnJfYWxsb2NfaW92bWE7Ci0JfQotCW5ldy0+dmEgPSB2YTsKLQluZXctPnNndCA9IHNndDsKLQotCWlmIChtYXBfaW92bV9hcmVhKG9iaiwgbmV3LCBzZ3QsIG5ldy0+ZmxhZ3MpKQotCQlnb3RvIGVycl9tYXA7Ci0KLQltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKLQotCWRldl9kYmcob2JqLT5kZXYsICIlczogZGE6JTA4eCgleCkgZmxhZ3M6JTA4eCB2YTolcFxuIiwKLQkJX19mdW5jX18sIG5ldy0+ZGFfc3RhcnQsIGJ5dGVzLCBuZXctPmZsYWdzLCB2YSk7Ci0KLQlyZXR1cm4gbmV3LT5kYV9zdGFydDsKLQotZXJyX21hcDoKLQlmcmVlX2lvdm1fYXJlYShvYmosIG5ldyk7Ci1lcnJfYWxsb2NfaW92bWE6Ci0JbXV0ZXhfdW5sb2NrKCZvYmotPm1tYXBfbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgX19pb21tdV92bWFwKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsCi0JCSBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqdmEsIHNpemVfdCBieXRlcywgdTMyIGZsYWdzKQotewotCXJldHVybiBtYXBfaW9tbXVfcmVnaW9uKG9iaiwgZGEsIHNndCwgdmEsIGJ5dGVzLCBmbGFncyk7Ci19Ci0KLS8qKgotICogaW9tbXVfdm1hcCAgLSAgKGQpLShwKS0odikgYWRkcmVzcyBtYXBwZXIKLSAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQotICogQHNndDoJYWRkcmVzcyBvZiBzY2F0dGVyIGdhdGhlciB0YWJsZQotICogQGZsYWdzOglpb3ZtYSBhbmQgcGFnZSBwcm9wZXJ0eQotICoKLSAqIENyZWF0ZXMgMS1uLTEgbWFwcGluZyB3aXRoIGdpdmVuIEBzZ3QgYW5kIHJldHVybnMgQGRhLgotICogQWxsIEBzZ3QgZWxlbWVudCBtdXN0IGJlIGlvIHBhZ2Ugc2l6ZSBhbGlnbmVkLgotICovCi11MzIgaW9tbXVfdm1hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwKLQkJIHUzMiBmbGFncykKLXsKLQlzaXplX3QgYnl0ZXM7Ci0Jdm9pZCAqdmEgPSBOVUxMOwotCi0JaWYgKCFvYmogfHwgIW9iai0+ZGV2IHx8ICFzZ3QpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYnl0ZXMgPSBzZ3RhYmxlX2xlbihzZ3QpOwotCWlmICghYnl0ZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCWJ5dGVzID0gUEFHRV9BTElHTihieXRlcyk7Ci0KLQlpZiAoZmxhZ3MgJiBJT1ZNRl9NTUlPKSB7Ci0JCXZhID0gdm1hcF9zZyhzZ3QpOwotCQlpZiAoSVNfRVJSKHZhKSkKLQkJCXJldHVybiBQVFJfRVJSKHZhKTsKLQl9Ci0KLQlmbGFncyB8PSBJT1ZNRl9ESVNDT05UOwotCWZsYWdzIHw9IElPVk1GX01NSU87Ci0KLQlkYSA9IF9faW9tbXVfdm1hcChvYmosIGRhLCBzZ3QsIHZhLCBieXRlcywgZmxhZ3MpOwotCWlmIChJU19FUlJfVkFMVUUoZGEpKQotCQl2dW5tYXBfc2codmEpOwotCi0JcmV0dXJuIGRhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfdm1hcCk7Ci0KLS8qKgotICogaW9tbXVfdnVubWFwICAtICByZWxlYXNlIHZpcnR1YWwgbWFwcGluZyBvYnRhaW5lZCBieSAnaW9tbXVfdm1hcCgpJwotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogRnJlZSB0aGUgaW9tbXUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQKLSAqIEBkYSwgd2hpY2ggd2FzIHJldHVybmVkIGJ5ICdpb21tdV92bWFwKCknLgotICovCi1zdHJ1Y3Qgc2dfdGFibGUgKmlvbW11X3Z1bm1hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKQotewotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCS8qCi0JICogJ3NndCcgaXMgYWxsb2NhdGVkIGJlZm9yZSAnaW9tbXVfdm1hbGxvYygpJyBpcyBjYWxsZWQuCi0JICogSnVzdCByZXR1cm5zICdzZ3QnIHRvIHRoZSBjYWxsZXIgdG8gZnJlZQotCSAqLwotCXNndCA9IHVubWFwX3ZtX2FyZWEob2JqLCBkYSwgdnVubWFwX3NnLCBJT1ZNRl9ESVNDT05UIHwgSU9WTUZfTU1JTyk7Ci0JaWYgKCFzZ3QpCi0JCWRldl9kYmcob2JqLT5kZXYsICIlczogTm8gc2d0XG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHNndDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3Z1bm1hcCk7Ci0KLS8qKgotICogaW9tbXVfdm1hbGxvYyAgLSAgKGQpLShwKS0odikgYWRkcmVzcyBhbGxvY2F0b3IgYW5kIG1hcHBlcgotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQljb250aWd1b3VzIGlvbW11IHZpcnR1YWwgbWVtb3J5Ci0gKiBAYnl0ZXM6CWFsbG9jYXRpb24gc2l6ZQotICogQGZsYWdzOglpb3ZtYSBhbmQgcGFnZSBwcm9wZXJ0eQotICoKLSAqIEFsbG9jYXRlIEBieXRlcyBsaW5lYXJseSBhbmQgY3JlYXRlcyAxLW4tMSBtYXBwaW5nIGFuZCByZXR1cm5zCi0gKiBAZGEgYWdhaW4sIHdoaWNoIG1pZ2h0IGJlIGFkanVzdGVkIGlmICdJT1ZNRl9EQV9GSVhFRCcgaXMgbm90IHNldC4KLSAqLwotdTMyIGlvbW11X3ZtYWxsb2Moc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpCi17Ci0Jdm9pZCAqdmE7Ci0Jc3RydWN0IHNnX3RhYmxlICpzZ3Q7Ci0KLQlpZiAoIW9iaiB8fCAhb2JqLT5kZXYgfHwgIWJ5dGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ5dGVzID0gUEFHRV9BTElHTihieXRlcyk7Ci0KLQl2YSA9IHZtYWxsb2MoYnl0ZXMpOwotCWlmICghdmEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKLQlmbGFncyB8PSBJT1ZNRl9BTExPQzsKLQotCXNndCA9IHNndGFibGVfYWxsb2MoYnl0ZXMsIGZsYWdzLCBkYSwgMCk7Ci0JaWYgKElTX0VSUihzZ3QpKSB7Ci0JCWRhID0gUFRSX0VSUihzZ3QpOwotCQlnb3RvIGVycl9zZ3RfYWxsb2M7Ci0JfQotCXNndGFibGVfZmlsbF92bWFsbG9jKHNndCwgdmEpOwotCi0JZGEgPSBfX2lvbW11X3ZtYXAob2JqLCBkYSwgc2d0LCB2YSwgYnl0ZXMsIGZsYWdzKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKLQkJZ290byBlcnJfaW9tbXVfdm1hcDsKLQotCXJldHVybiBkYTsKLQotZXJyX2lvbW11X3ZtYXA6Ci0Jc2d0YWJsZV9kcmFpbl92bWFsbG9jKHNndCk7Ci0Jc2d0YWJsZV9mcmVlKHNndCk7Ci1lcnJfc2d0X2FsbG9jOgotCXZmcmVlKHZhKTsKLQlyZXR1cm4gZGE7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpb21tdV92bWFsbG9jKTsKLQotLyoqCi0gKiBpb21tdV92ZnJlZSAgLSAgcmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGJ5ICdpb21tdV92bWFsbG9jKCknCi0gKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBGcmVlcyB0aGUgaW9tbXUgdmlydHVhbGx5IGNvbnRpbnVvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQKLSAqIEBkYSwgYXMgb2J0YWluZWQgZnJvbSAnaW9tbXVfdm1hbGxvYygpJy4KLSAqLwotdm9pZCBpb21tdV92ZnJlZShzdHJ1Y3QgaW9tbXUgKm9iaiwgY29uc3QgdTMyIGRhKQotewotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCi0Jc2d0ID0gdW5tYXBfdm1fYXJlYShvYmosIGRhLCB2ZnJlZSwgSU9WTUZfRElTQ09OVCB8IElPVk1GX0FMTE9DKTsKLQlpZiAoIXNndCkKLQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBObyBzZ3RcbiIsIF9fZnVuY19fKTsKLQlzZ3RhYmxlX2ZyZWUoc2d0KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3ZmcmVlKTsKLQotc3RhdGljIHUzMiBfX2lvbW11X2ttYXAoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB2b2lkICp2YSwKLQkJCSAgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IHNnX3RhYmxlICpzZ3Q7Ci0KLQlzZ3QgPSBzZ3RhYmxlX2FsbG9jKGJ5dGVzLCBmbGFncywgZGEsIHBhKTsKLQlpZiAoSVNfRVJSKHNndCkpCi0JCXJldHVybiBQVFJfRVJSKHNndCk7Ci0KLQlzZ3RhYmxlX2ZpbGxfa21hbGxvYyhzZ3QsIHBhLCBkYSwgYnl0ZXMpOwotCi0JZGEgPSBtYXBfaW9tbXVfcmVnaW9uKG9iaiwgZGEsIHNndCwgdmEsIGJ5dGVzLCBmbGFncyk7Ci0JaWYgKElTX0VSUl9WQUxVRShkYSkpIHsKLQkJc2d0YWJsZV9kcmFpbl9rbWFsbG9jKHNndCk7Ci0JCXNndGFibGVfZnJlZShzZ3QpOwotCX0KLQotCXJldHVybiBkYTsKLX0KLQotLyoqCi0gKiBpb21tdV9rbWFwICAtICAoZCktKHApLSh2KSBhZGRyZXNzIG1hcHBlcgotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQljb250aWd1b3VzIGlvbW11IHZpcnR1YWwgbWVtb3J5Ci0gKiBAcGE6CQljb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQotICogQGZsYWdzOglpb3ZtYSBhbmQgcGFnZSBwcm9wZXJ0eQotICoKLSAqIENyZWF0ZXMgMS0xLTEgbWFwcGluZyBhbmQgcmV0dXJucyBAZGEgYWdhaW4sIHdoaWNoIGNhbiBiZQotICogYWRqdXN0ZWQgaWYgJ0lPVk1GX0RBX0ZJWEVEJyBpcyBub3Qgc2V0LgotICovCi11MzIgaW9tbXVfa21hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHNpemVfdCBieXRlcywKLQkJIHUzMiBmbGFncykKLXsKLQl2b2lkICp2YTsKLQotCWlmICghb2JqIHx8ICFvYmotPmRldiB8fCAhYnl0ZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYnl0ZXMgPSBQQUdFX0FMSUdOKGJ5dGVzKTsKLQotCXZhID0gaW9yZW1hcChwYSwgYnl0ZXMpOwotCWlmICghdmEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZmxhZ3MgfD0gSU9WTUZfTElORUFSOwotCWZsYWdzIHw9IElPVk1GX01NSU87Ci0KLQlkYSA9IF9faW9tbXVfa21hcChvYmosIGRhLCBwYSwgdmEsIGJ5dGVzLCBmbGFncyk7Ci0JaWYgKElTX0VSUl9WQUxVRShkYSkpCi0JCWlvdW5tYXAodmEpOwotCi0JcmV0dXJuIGRhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfa21hcCk7Ci0KLS8qKgotICogaW9tbXVfa3VubWFwICAtICByZWxlYXNlIHZpcnR1YWwgbWFwcGluZyBvYnRhaW5lZCBieSAnaW9tbXVfa21hcCgpJwotICogQG9iajoJb2JqZWN0aXZlIGlvbW11Ci0gKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCi0gKgotICogRnJlZXMgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0Ci0gKiBAZGEsIHdoaWNoIHdhcyBwYXNzZWQgdG8gYW5kIHdhcyByZXR1cm5lZCBieSdpb21tdV9rbWFwKCknLgotICovCi12b2lkIGlvbW11X2t1bm1hcChzdHJ1Y3QgaW9tbXUgKm9iaiwgdTMyIGRhKQotewotCXN0cnVjdCBzZ190YWJsZSAqc2d0OwotCXR5cGVkZWYgdm9pZCAoKmZ1bmNfdCkoY29uc3Qgdm9pZCAqKTsKLQotCXNndCA9IHVubWFwX3ZtX2FyZWEob2JqLCBkYSwgKGZ1bmNfdClpb3VubWFwLAotCQkJICAgIElPVk1GX0xJTkVBUiB8IElPVk1GX01NSU8pOwotCWlmICghc2d0KQotCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOwotCXNndGFibGVfZnJlZShzZ3QpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfa3VubWFwKTsKLQotLyoqCi0gKiBpb21tdV9rbWFsbG9jICAtICAoZCktKHApLSh2KSBhZGRyZXNzIGFsbG9jYXRvciBhbmQgbWFwcGVyCi0gKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKLSAqIEBkYToJCWNvbnRpZ3VvdXMgaW9tbXUgdmlydHVhbCBtZW1vcnkKLSAqIEBieXRlczoJYnl0ZXMgZm9yIGFsbG9jYXRpb24KLSAqIEBmbGFnczoJaW92bWEgYW5kIHBhZ2UgcHJvcGVydHkKLSAqCi0gKiBBbGxvY2F0ZSBAYnl0ZXMgbGluZWFybHkgYW5kIGNyZWF0ZXMgMS0xLTEgbWFwcGluZyBhbmQgcmV0dXJucwotICogQGRhIGFnYWluLCB3aGljaCBtaWdodCBiZSBhZGp1c3RlZCBpZiAnSU9WTUZfREFfRklYRUQnIGlzIG5vdCBzZXQuCi0gKi8KLXUzMiBpb21tdV9rbWFsbG9jKHN0cnVjdCBpb21tdSAqb2JqLCB1MzIgZGEsIHNpemVfdCBieXRlcywgdTMyIGZsYWdzKQotewotCXZvaWQgKnZhOwotCXUzMiBwYTsKLQotCWlmICghb2JqIHx8ICFvYmotPmRldiB8fCAhYnl0ZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYnl0ZXMgPSBQQUdFX0FMSUdOKGJ5dGVzKTsKLQotCXZhID0ga21hbGxvYyhieXRlcywgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCWlmICghdmEpCi0JCXJldHVybiAtRU5PTUVNOwotCXBhID0gdmlydF90b19waHlzKHZhKTsKLQotCWZsYWdzIHw9IElPVk1GX0xJTkVBUjsKLQlmbGFncyB8PSBJT1ZNRl9BTExPQzsKLQotCWRhID0gX19pb21tdV9rbWFwKG9iaiwgZGEsIHBhLCB2YSwgYnl0ZXMsIGZsYWdzKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKLQkJa2ZyZWUodmEpOwotCi0JcmV0dXJuIGRhOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfa21hbGxvYyk7Ci0KLS8qKgotICogaW9tbXVfa2ZyZWUgIC0gIHJlbGVhc2UgdmlydHVhbCBtYXBwaW5nIG9idGFpbmVkIGJ5ICdpb21tdV9rbWFsbG9jKCknCi0gKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKLSAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKLSAqCi0gKiBGcmVlcyB0aGUgaW9tbXUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQKLSAqIEBkYSwgd2hpY2ggd2FzIHBhc3NlZCB0byBhbmQgd2FzIHJldHVybmVkIGJ5J2lvbW11X2ttYWxsb2MoKScuCi0gKi8KLXZvaWQgaW9tbXVfa2ZyZWUoc3RydWN0IGlvbW11ICpvYmosIHUzMiBkYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKLQotCXNndCA9IHVubWFwX3ZtX2FyZWEob2JqLCBkYSwga2ZyZWUsIElPVk1GX0xJTkVBUiB8IElPVk1GX0FMTE9DKTsKLQlpZiAoIXNndCkKLQkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBObyBzZ3RcbiIsIF9fZnVuY19fKTsKLQlzZ3RhYmxlX2ZyZWUoc2d0KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2tmcmVlKTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpb3ZtbV9pbml0KHZvaWQpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBmbGFncyA9IFNMQUJfSFdDQUNIRV9BTElHTjsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqcDsKLQotCXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW92bV9hcmVhX2NhY2hlIiwgc2l6ZW9mKHN0cnVjdCBpb3ZtX3N0cnVjdCksIDAsCi0JCQkgICAgICBmbGFncywgTlVMTCk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpb3ZtX2FyZWFfY2FjaGVwID0gcDsKLQotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQoaW92bW1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpb3ZtbV9leGl0KHZvaWQpCi17Ci0Ja21lbV9jYWNoZV9kZXN0cm95KGlvdm1fYXJlYV9jYWNoZXApOwotfQotbW9kdWxlX2V4aXQoaW92bW1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogc2ltcGxlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50Iik7Ci1NT0RVTEVfQVVUSE9SKCJIaXJvc2hpIERPWVUgPEhpcm9zaGkuRE9ZVUBub2tpYS5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYwppbmRleCA2OWRkYzlmLi5hZDgwMTEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwbGF0L21haWxib3guaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL21jYnNwLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwppbmRleCA2YzYyYWYxLi40YjE1Y2Q3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwpAQCAtMjQsNDUgKzI0LDQwIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgotI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKLS8qIFhYWCBUaGVzZSAic2lkZXdheXMiIGluY2x1ZGVzIGFyZSBhIHNpZ24gdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcgKi8KLSNpbmNsdWRlICIuLi9tYWNoLW9tYXAyL2NtMnh4eF8zeHh4LmgiCi0jaW5jbHVkZSAiLi4vbWFjaC1vbWFwMi9jbS1yZWdiaXRzLTM0eHguaCIKLQogc3RydWN0IG9tYXBfbWNic3AgKiptY2JzcF9wdHI7Ci1pbnQgb21hcF9tY2JzcF9jb3VudCwgb21hcF9tY2JzcF9jYWNoZV9zaXplOworaW50IG9tYXBfbWNic3BfY291bnQ7CisKKyNkZWZpbmUgb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkJKGlkIDwgb21hcF9tY2JzcF9jb3VudCkKKyNkZWZpbmUgaWRfdG9fbWNic3BfcHRyKGlkKQkJbWNic3BfcHRyW2lkXTsKIAogc3RhdGljIHZvaWQgb21hcF9tY2JzcF93cml0ZShzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3AsIHUxNiByZWcsIHUzMiB2YWwpCiB7Ci0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7Ci0JCSgodTE2ICopbWNic3AtPnJlZ19jYWNoZSlbcmVnIC8gc2l6ZW9mKHUxNildID0gKHUxNil2YWw7Ci0JCV9fcmF3X3dyaXRldygodTE2KXZhbCwgbWNic3AtPmlvX2Jhc2UgKyByZWcpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAyNDIwKCkpIHsKLQkJKCh1MTYgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWcgLyBzaXplb2YodTMyKV0gPSAodTE2KXZhbDsKLQkJX19yYXdfd3JpdGV3KCh1MTYpdmFsLCBtY2JzcC0+aW9fYmFzZSArIHJlZyk7CisJdm9pZCBfX2lvbWVtICphZGRyID0gbWNic3AtPmlvX2Jhc2UgKyByZWcgKiBtY2JzcC0+cGRhdGEtPnJlZ19zdGVwOworCisJaWYgKG1jYnNwLT5wZGF0YS0+cmVnX3NpemUgPT0gMikgeworCQkoKHUxNiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZ10gPSAodTE2KXZhbDsKKwkJX19yYXdfd3JpdGV3KCh1MTYpdmFsLCBhZGRyKTsKIAl9IGVsc2UgewotCQkoKHUzMiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZyAvIHNpemVvZih1MzIpXSA9IHZhbDsKLQkJX19yYXdfd3JpdGVsKHZhbCwgbWNic3AtPmlvX2Jhc2UgKyByZWcpOworCQkoKHUzMiAqKW1jYnNwLT5yZWdfY2FjaGUpW3JlZ10gPSB2YWw7CisJCV9fcmF3X3dyaXRlbCh2YWwsIGFkZHIpOwogCX0KIH0KIAogc3RhdGljIGludCBvbWFwX21jYnNwX3JlYWQoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwLCB1MTYgcmVnLCBib29sIGZyb21fY2FjaGUpCiB7Ci0JaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7Ci0JCXJldHVybiAhZnJvbV9jYWNoZSA/IF9fcmF3X3JlYWR3KG1jYnNwLT5pb19iYXNlICsgcmVnKSA6Ci0JCQkJKCh1MTYgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWcgLyBzaXplb2YodTE2KV07Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDI0MjAoKSkgewotCQlyZXR1cm4gIWZyb21fY2FjaGUgPyBfX3Jhd19yZWFkdyhtY2JzcC0+aW9fYmFzZSArIHJlZykgOgotCQkJCSgodTE2ICopbWNic3AtPnJlZ19jYWNoZSlbcmVnIC8gc2l6ZW9mKHUzMildOworCXZvaWQgX19pb21lbSAqYWRkciA9IG1jYnNwLT5pb19iYXNlICsgcmVnICogbWNic3AtPnBkYXRhLT5yZWdfc3RlcDsKKworCWlmIChtY2JzcC0+cGRhdGEtPnJlZ19zaXplID09IDIpIHsKKwkJcmV0dXJuICFmcm9tX2NhY2hlID8gX19yYXdfcmVhZHcoYWRkcikgOgorCQkJCSAgICAgKCh1MTYgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWddOwogCX0gZWxzZSB7Ci0JCXJldHVybiAhZnJvbV9jYWNoZSA/IF9fcmF3X3JlYWRsKG1jYnNwLT5pb19iYXNlICsgcmVnKSA6Ci0JCQkJKCh1MzIgKiltY2JzcC0+cmVnX2NhY2hlKVtyZWcgLyBzaXplb2YodTMyKV07CisJCXJldHVybiAhZnJvbV9jYWNoZSA/IF9fcmF3X3JlYWRsKGFkZHIpIDoKKwkJCQkgICAgICgodTMyICopbWNic3AtPnJlZ19jYWNoZSlbcmVnXTsKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMwogc3RhdGljIHZvaWQgb21hcF9tY2JzcF9zdF93cml0ZShzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3AsIHUxNiByZWcsIHUzMiB2YWwpCiB7CiAJX19yYXdfd3JpdGVsKHZhbCwgbWNic3AtPnN0X2RhdGEtPmlvX2Jhc2Vfc3QgKyByZWcpOwpAQCAtNzIsNyArNjcsNiBAQAogewogCXJldHVybiBfX3Jhd19yZWFkbChtY2JzcC0+c3RfZGF0YS0+aW9fYmFzZV9zdCArIHJlZyk7CiB9Ci0jZW5kaWYKIAogI2RlZmluZSBNQ0JTUF9SRUFEKG1jYnNwLCByZWcpIFwKIAkJb21hcF9tY2JzcF9yZWFkKG1jYnNwLCBPTUFQX01DQlNQX1JFR18jI3JlZywgMCkKQEAgLTE4Nyw3ICsxODEsNyBAQAogCU1DQlNQX1dSSVRFKG1jYnNwLCBNQ1IyLCBjb25maWctPm1jcjIpOwogCU1DQlNQX1dSSVRFKG1jYnNwLCBNQ1IxLCBjb25maWctPm1jcjEpOwogCU1DQlNQX1dSSVRFKG1jYnNwLCBQQ1IwLCBjb25maWctPnBjcjApOwotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgeworCWlmIChtY2JzcC0+cGRhdGEtPmhhc19jY3IpIHsKIAkJTUNCU1BfV1JJVEUobWNic3AsIFhDQ1IsIGNvbmZpZy0+eGNjcik7CiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBSQ0NSLCBjb25maWctPnJjY3IpOwogCX0KQEAgLTIzOSw0NiArMjMzLDI4IEBACiAJfQogCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKIAotCWRhdGFfcmVnID0gbWNic3AtPnBoeXNfZG1hX2Jhc2U7Ci0KLQlpZiAobWNic3AtPm1jYnNwX2NvbmZpZ190eXBlIDwgTUNCU1BfQ09ORklHX1RZUEUyKSB7CisJaWYgKG1jYnNwLT5wZGF0YS0+cmVnX3NpemUgPT0gMikgewogCQlpZiAoc3RyZWFtKQotCQkJZGF0YV9yZWcgKz0gT01BUF9NQ0JTUF9SRUdfRFJSMTsKKwkJCWRhdGFfcmVnID0gT01BUF9NQ0JTUF9SRUdfRFJSMTsKIAkJZWxzZQotCQkJZGF0YV9yZWcgKz0gT01BUF9NQ0JTUF9SRUdfRFhSMTsKKwkJCWRhdGFfcmVnID0gT01BUF9NQ0JTUF9SRUdfRFhSMTsKIAl9IGVsc2UgewogCQlpZiAoc3RyZWFtKQotCQkJZGF0YV9yZWcgKz0gT01BUF9NQ0JTUF9SRUdfRFJSOworCQkJZGF0YV9yZWcgPSBPTUFQX01DQlNQX1JFR19EUlI7CiAJCWVsc2UKLQkJCWRhdGFfcmVnICs9IE9NQVBfTUNCU1BfUkVHX0RYUjsKKwkJCWRhdGFfcmVnID0gT01BUF9NQ0JTUF9SRUdfRFhSOwogCX0KIAotCXJldHVybiBkYXRhX3JlZzsKKwlyZXR1cm4gbWNic3AtPnBoeXNfZG1hX2Jhc2UgKyBkYXRhX3JlZyAqIG1jYnNwLT5wZGF0YS0+cmVnX3N0ZXA7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfZG1hX3JlZ19wYXJhbXMpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDMKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kZXZpY2UgKmZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwKLQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKLQlyZXR1cm4gY29udGFpbmVyX29mKHBkZXYsIHN0cnVjdCBvbWFwX2RldmljZSwgcGRldik7Ci19Ci0KIHN0YXRpYyB2b2lkIG9tYXBfc3Rfb24oc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQogewogCXVuc2lnbmVkIGludCB3OwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CiAKLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwotCi0JLyoKLQkgKiBTaWRldG9uZSB1c2VzIE1jQlNQIElDTEsgLSB3aGljaCBtdXN0IG5vdCBpZGxlIHdoZW4gc2lkZXRvbmVzCi0JICogYXJlIGVuYWJsZWQgb3Igc2lkZXRvbmVzIHN0YXJ0IHNvdW5kaW5nIHVnbHkuCi0JICovCi0JdyA9IG9tYXAyX2NtX3JlYWRfbW9kX3JlZyhPTUFQMzQzMF9QRVJfTU9ELCBDTV9BVVRPSURMRSk7Ci0JdyAmPSB+KDEgPDwgKG1jYnNwLT5pZCAtIDIpKTsKLQlvbWFwMl9jbV93cml0ZV9tb2RfcmVnKHcsIE9NQVAzNDMwX1BFUl9NT0QsIENNX0FVVE9JRExFKTsKKwlpZiAobWNic3AtPnBkYXRhLT5lbmFibGVfc3RfY2xvY2spCisJCW1jYnNwLT5wZGF0YS0+ZW5hYmxlX3N0X2Nsb2NrKG1jYnNwLT5pZCwgMSk7CiAKIAkvKiBFbmFibGUgTWNCU1AgU2lkZXRvbmUgKi8KIAl3ID0gTUNCU1BfUkVBRChtY2JzcCwgU1NFTENSKTsKQEAgLTI5Miw5ICsyNjgsNiBAQAogc3RhdGljIHZvaWQgb21hcF9zdF9vZmYoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQogewogCXVuc2lnbmVkIGludCB3OwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7Ci0KLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwogCiAJdyA9IE1DQlNQX1NUX1JFQUQobWNic3AsIFNTRUxDUik7CiAJTUNCU1BfU1RfV1JJVEUobWNic3AsIFNTRUxDUiwgdyAmIH4oU1RfU0lERVRPTkVFTikpOwpAQCAtMzAyLDE3ICsyNzUsMTMgQEAKIAl3ID0gTUNCU1BfUkVBRChtY2JzcCwgU1NFTENSKTsKIAlNQ0JTUF9XUklURShtY2JzcCwgU1NFTENSLCB3ICYgfihTSURFVE9ORUVOKSk7CiAKLQl3ID0gb21hcDJfY21fcmVhZF9tb2RfcmVnKE9NQVAzNDMwX1BFUl9NT0QsIENNX0FVVE9JRExFKTsKLQl3IHw9IDEgPDwgKG1jYnNwLT5pZCAtIDIpOwotCW9tYXAyX2NtX3dyaXRlX21vZF9yZWcodywgT01BUDM0MzBfUEVSX01PRCwgQ01fQVVUT0lETEUpOworCWlmIChtY2JzcC0+cGRhdGEtPmVuYWJsZV9zdF9jbG9jaykKKwkJbWNic3AtPnBkYXRhLT5lbmFibGVfc3RfY2xvY2sobWNic3AtPmlkLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9zdF9maXJfd3JpdGUoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwLCBzMTYgKmZpcikKIHsKIAl1MTYgdmFsLCBpOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7Ci0KLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwogCiAJdmFsID0gTUNCU1BfU1RfUkVBRChtY2JzcCwgU1NFTENSKTsKIApAQCAtMzQwLDkgKzMwOSw2IEBACiB7CiAJdTE2IHc7CiAJc3RydWN0IG9tYXBfbWNic3Bfc3RfZGF0YSAqc3RfZGF0YSA9IG1jYnNwLT5zdF9kYXRhOwotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7Ci0KLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwogCiAJdyA9IE1DQlNQX1NUX1JFQUQobWNic3AsIFNTRUxDUik7CiAKQEAgLTUyNSwxNCArNDkxLDEzIEBACiB7CiAJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOwogCi0JaWYgKCFjcHVfaXNfb21hcDM0eHgoKSAmJiAhY3B1X2lzX29tYXA0NHh4KCkpCi0JCXJldHVybjsKLQogCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKIAkJcmV0dXJuOwogCX0KIAltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisJaWYgKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUgPT0gMCkKKwkJcmV0dXJuOwogCiAJaWYgKHRocmVzaG9sZCAmJiB0aHJlc2hvbGQgPD0gbWNic3AtPm1heF90eF90aHJlcykKIAkJTUNCU1BfV1JJVEUobWNic3AsIFRIUlNIMiwgdGhyZXNob2xkIC0gMSk7CkBAIC01NDgsMTQgKzUxMywxMyBAQAogewogCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKIAotCWlmICghY3B1X2lzX29tYXAzNHh4KCkgJiYgIWNwdV9pc19vbWFwNDR4eCgpKQotCQlyZXR1cm47Ci0KIAlpZiAoIW9tYXBfbWNic3BfY2hlY2tfdmFsaWRfaWQoaWQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgaWQgKCVkKVxuIiwgX19mdW5jX18sIGlkICsgMSk7CiAJCXJldHVybjsKIAl9CiAJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOworCWlmIChtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplID09IDApCisJCXJldHVybjsKIAogCWlmICh0aHJlc2hvbGQgJiYgdGhyZXNob2xkIDw9IG1jYnNwLT5tYXhfcnhfdGhyZXMpCiAJCU1DQlNQX1dSSVRFKG1jYnNwLCBUSFJTSDEsIHRocmVzaG9sZCAtIDEpOwpAQCAtNjI1LDYgKzU4OSw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CisJaWYgKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUgPT0gMCkKKwkJcmV0dXJuIDA7CiAKIAkvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSBsb2NhdGlvbnMgaW4gdGhlIGJ1ZmZlciAqLwogCWJ1ZmZzdGF0ID0gTUNCU1BfUkVBRChtY2JzcCwgWEJVRkZTVEFUKTsKQEAgLTY0OCw2ICs2MTQsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJbWNic3AgPSBpZF90b19tY2JzcF9wdHIoaWQpOworCWlmIChtY2JzcC0+cGRhdGEtPmJ1ZmZlcl9zaXplID09IDApCisJCXJldHVybiAwOwogCiAJLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVzZWQgbG9jYXRpb25zIGluIHRoZSBidWZmZXIgKi8KIAlidWZmc3RhdCA9IE1DQlNQX1JFQUQobWNic3AsIFJCVUZGU1RBVCk7CkBAIC02ODMsNDYgKzY1MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfZ2V0X2RtYV9vcF9tb2RlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG9tYXAzNHh4X21jYnNwX3JlcXVlc3Qoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQotewotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7Ci0KLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwotCS8qCi0JICogRW5hYmxlIHdha3VwIGJlaGF2aW9yLCBzbWFydCBpZGxlIGFuZCBhbGwgd2FrZXVwcwotCSAqIFJFVklTSVQ6IHNvbWUgd2FrZXVwcyBtYXkgYmUgdW5uZWNlc3NhcnkKLQkgKi8KLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJTUNCU1BfV1JJVEUobWNic3AsIFdBS0VVUEVOLCBYUkRZRU4gfCBSUkRZRU4pOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXAzNHh4X21jYnNwX2ZyZWUoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQotewotCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7Ci0KLQlvZCA9IGZpbmRfb21hcF9kZXZpY2VfYnlfZGV2KG1jYnNwLT5kZXYpOwotCi0JLyoKLQkgKiBEaXNhYmxlIHdha3VwIGJlaGF2aW9yLCBzbWFydCBpZGxlIGFuZCBhbGwgd2FrZXVwcwotCSAqLwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgewotCQkvKgotCQkgKiBIVyBidWcgd29ya2Fyb3VuZCAtIElmIG5vX2lkbGUgbW9kZSBpcyB0YWtlbiwgd2UgbmVlZCB0bwotCQkgKiBnbyB0byBzbWFydF9pZGxlIGJlZm9yZSBnb2luZyB0byBhbHdheXNfaWRsZSwgb3IgdGhlCi0JCSAqIGRldmljZSB3aWxsIG5vdCBoaXQgcmV0ZW50aW9uIGFueW1vcmUuCi0JCSAqLwotCi0JCU1DQlNQX1dSSVRFKG1jYnNwLCBXQUtFVVBFTiwgMCk7Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMzR4eF9tY2JzcF9yZXF1ZXN0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwMzR4eF9tY2JzcF9mcmVlKHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3N0X3N0YXJ0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3N0X3N0b3Aoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKSB7fQotI2VuZGlmCi0KIGludCBvbWFwX21jYnNwX3JlcXVlc3QodW5zaWduZWQgaW50IGlkKQogewogCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKQEAgLTczNSw3ICs2NjMsNyBAQAogCX0KIAltY2JzcCA9IGlkX3RvX21jYnNwX3B0cihpZCk7CiAKLQlyZWdfY2FjaGUgPSBremFsbG9jKG9tYXBfbWNic3BfY2FjaGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcmVnX2NhY2hlID0ga3phbGxvYyhtY2JzcC0+cmVnX2NhY2hlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghcmVnX2NhY2hlKSB7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTc1Nyw4ICs2ODUsOSBAQAogCiAJcG1fcnVudGltZV9nZXRfc3luYyhtY2JzcC0+ZGV2KTsKIAotCS8qIERvIHByb2NlZHVyZSBzcGVjaWZpYyB0byBvbWFwMzR4eCBhcmNoLCBpZiBhcHBsaWNhYmxlICovCi0Jb21hcDM0eHhfbWNic3BfcmVxdWVzdChtY2JzcCk7CisJLyogRW5hYmxlIHdha2V1cCBiZWhhdmlvciAqLworCWlmIChtY2JzcC0+cGRhdGEtPmhhc193YWtldXApCisJCU1DQlNQX1dSSVRFKG1jYnNwLCBXQUtFVVBFTiwgWFJEWUVOIHwgUlJEWUVOKTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdHJhbnNtaXR0ZXIsIHJlY2VpdmVyIGFuZCBzYW1wbGUtcmF0ZSBnZW5lcmF0b3IgYXJlCkBAIC03OTUsOCArNzI0LDkgQEAKIAlpZiAobWNic3AtPnBkYXRhICYmIG1jYnNwLT5wZGF0YS0+b3BzICYmIG1jYnNwLT5wZGF0YS0+b3BzLT5mcmVlKQogCQltY2JzcC0+cGRhdGEtPm9wcy0+ZnJlZShpZCk7CiAKLQkvKiBEbyBwcm9jZWR1cmUgc3BlY2lmaWMgdG8gb21hcDM0eHggYXJjaCwgaWYgYXBwbGljYWJsZSAqLwotCW9tYXAzNHh4X21jYnNwX2ZyZWUobWNic3ApOworCS8qIERpc2FibGUgd2FrZXVwIGJlaGF2aW9yICovCisJaWYgKG1jYnNwLT5wZGF0YS0+aGFzX3dha2V1cCkKKwkJTUNCU1BfV1JJVEUobWNic3AsIFdBS0VVUEVOLCAwKTsKIAogCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNic3AtPmRldik7CiAKQEAgLTgyNSw4ICs3NTUsOSBAQAogCWlmIChtY2JzcC0+cGRhdGEgJiYgbWNic3AtPnBkYXRhLT5vcHMgJiYgbWNic3AtPnBkYXRhLT5vcHMtPmZyZWUpCiAJCW1jYnNwLT5wZGF0YS0+b3BzLT5mcmVlKGlkKTsKIAotCS8qIERvIHByb2NlZHVyZSBzcGVjaWZpYyB0byBvbWFwMzR4eCBhcmNoLCBpZiBhcHBsaWNhYmxlICovCi0Jb21hcDM0eHhfbWNic3BfZnJlZShtY2JzcCk7CisJLyogRGlzYWJsZSB3YWtldXAgYmVoYXZpb3IgKi8KKwlpZiAobWNic3AtPnBkYXRhLT5oYXNfd2FrZXVwKQorCQlNQ0JTUF9XUklURShtY2JzcCwgV0FLRVVQRU4sIDApOwogCiAJcG1fcnVudGltZV9wdXRfc3luYyhtY2JzcC0+ZGV2KTsKIApAQCAtODY2LDcgKzc5Nyw3IEBACiAJfQogCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKIAotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKKwlpZiAobWNic3AtPnN0X2RhdGEpCiAJCW9tYXBfc3Rfc3RhcnQobWNic3ApOwogCiAJLyogT25seSBlbmFibGUgU1JHLCBpZiBNY0JTUCBpcyBtYXN0ZXIgKi8KQEAgLTkwNCw3ICs4MzUsNyBAQAogCQlNQ0JTUF9XUklURShtY2JzcCwgU1BDUjIsIHcgfCAoMSA8PCA3KSk7CiAJfQogCi0JaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7CisJaWYgKG1jYnNwLT5wZGF0YS0+aGFzX2NjcikgewogCQkvKiBSZWxlYXNlIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgKi8KIAkJdyA9IE1DQlNQX1JFQURfQ0FDSEUobWNic3AsIFhDQ1IpOwogCQl3ICY9IH4odHggPyBYRElTQUJMRSA6IDApOwpAQCAtOTM0LDcgKzg2NSw3IEBACiAKIAkvKiBSZXNldCB0cmFuc21pdHRlciAqLwogCXR4ICY9IDE7Ci0JaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7CisJaWYgKG1jYnNwLT5wZGF0YS0+aGFzX2NjcikgewogCQl3ID0gTUNCU1BfUkVBRF9DQUNIRShtY2JzcCwgWENDUik7CiAJCXcgfD0gKHR4ID8gWERJU0FCTEUgOiAwKTsKIAkJTUNCU1BfV1JJVEUobWNic3AsIFhDQ1IsIHcpOwpAQCAtOTQ0LDcgKzg3NSw3IEBACiAKIAkvKiBSZXNldCByZWNlaXZlciAqLwogCXJ4ICY9IDE7Ci0JaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7CisJaWYgKG1jYnNwLT5wZGF0YS0+aGFzX2NjcikgewogCQl3ID0gTUNCU1BfUkVBRF9DQUNIRShtY2JzcCwgUkNDUik7CiAJCXcgfD0gKHJ4ID8gUkRJU0FCTEUgOiAwKTsKIAkJTUNCU1BfV1JJVEUobWNic3AsIFJDQ1IsIHcpOwpAQCAtOTYxLDM5ICs4OTIsNzIgQEAKIAkJTUNCU1BfV1JJVEUobWNic3AsIFNQQ1IyLCB3ICYgfigxIDw8IDYpKTsKIAl9CiAKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCisJaWYgKG1jYnNwLT5zdF9kYXRhKQogCQlvbWFwX3N0X3N0b3AobWNic3ApOwogfQogRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3N0b3ApOwogCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9ubHkgcmVxdWlyZWQgb24gYW4gT01BUDEtb25seSBidWlsZC4KLSAqIG1hY2gtb21hcDIvbWNic3AuYyBjb250YWlucyB0aGUgcmVhbCBmdW5jdGlvbnMKLSAqLwotI2lmbmRlZiBDT05GSUdfQVJDSF9PTUFQMlBMVVMKIGludCBvbWFwMl9tY2JzcF9zZXRfY2xrc19zcmModTggaWQsIHU4IGZja19zcmNfaWQpCiB7Ci0JV0FSTigxLCAiJXM6IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgb24gYW4gT01BUDEtb25seSBrZXJuZWxcbiIsCi0JICAgICBfX2Z1bmNfXyk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCWNvbnN0IGNoYXIgKnNyYzsKKworCWlmICghb21hcF9tY2JzcF9jaGVja192YWxpZF9pZChpZCkpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBpZCAoJWQpXG4iLCBfX2Z1bmNfXywgaWQgKyAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1jYnNwID0gaWRfdG9fbWNic3BfcHRyKGlkKTsKKworCWlmIChmY2tfc3JjX2lkID09IE1DQlNQX0NMS1NfUEFEX1NSQykKKwkJc3JjID0gImNsa3NfZXh0IjsKKwllbHNlIGlmIChmY2tfc3JjX2lkID09IE1DQlNQX0NMS1NfUFJDTV9TUkMpCisJCXNyYyA9ICJjbGtzX2ZjbGsiOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobWNic3AtPnBkYXRhLT5zZXRfY2xrX3NyYykKKwkJcmV0dXJuIG1jYnNwLT5wZGF0YS0+c2V0X2Nsa19zcmMobWNic3AtPmRldiwgbWNic3AtPmZjbGssIHNyYyk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIH0KK0VYUE9SVF9TWU1CT0wob21hcDJfbWNic3Bfc2V0X2Nsa3Nfc3JjKTsKIAogdm9pZCBvbWFwMl9tY2JzcDFfbXV4X2Nsa3Jfc3JjKHU4IG11eCkKIHsKLQlXQVJOKDEsICIlczogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBvbiBhbiBPTUFQMS1vbmx5IGtlcm5lbFxuIiwKLQkgICAgIF9fZnVuY19fKTsKLQlyZXR1cm47CisJc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwOworCWNvbnN0IGNoYXIgKnNyYzsKKworCWlmIChtdXggPT0gQ0xLUl9TUkNfQ0xLUikKKwkJc3JjID0gImNsa3IiOworCWVsc2UgaWYgKG11eCA9PSBDTEtSX1NSQ19DTEtYKQorCQlzcmMgPSAiY2xreCI7CisJZWxzZQorCQlyZXR1cm47CisKKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cigwKTsKKwlpZiAobWNic3AtPnBkYXRhLT5tdXhfc2lnbmFsKQorCQltY2JzcC0+cGRhdGEtPm11eF9zaWduYWwobWNic3AtPmRldiwgImNsa3IiLCBzcmMpOwogfQorRVhQT1JUX1NZTUJPTChvbWFwMl9tY2JzcDFfbXV4X2Nsa3Jfc3JjKTsKIAogdm9pZCBvbWFwMl9tY2JzcDFfbXV4X2Zzcl9zcmModTggbXV4KQogewotCVdBUk4oMSwgIiVzOiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIG9uIGFuIE9NQVAxLW9ubHkga2VybmVsXG4iLAotCSAgICAgX19mdW5jX18pOwotCXJldHVybjsKLX0KLSNlbmRpZgorCXN0cnVjdCBvbWFwX21jYnNwICptY2JzcDsKKwljb25zdCBjaGFyICpzcmM7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMworCWlmIChtdXggPT0gRlNSX1NSQ19GU1IpCisJCXNyYyA9ICJmc3IiOworCWVsc2UgaWYgKG11eCA9PSBGU1JfU1JDX0ZTWCkKKwkJc3JjID0gImZzeCI7CisJZWxzZQorCQlyZXR1cm47CisKKwltY2JzcCA9IGlkX3RvX21jYnNwX3B0cigwKTsKKwlpZiAobWNic3AtPnBkYXRhLT5tdXhfc2lnbmFsKQorCQltY2JzcC0+cGRhdGEtPm11eF9zaWduYWwobWNic3AtPmRldiwgImZzciIsIHNyYyk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXAyX21jYnNwMV9tdXhfZnNyX3NyYyk7CisKICNkZWZpbmUgbWF4X3RocmVzKG0pCQkJKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUpCiAjZGVmaW5lIHZhbGlkX3RocmVzaG9sZChtLCB2YWwpCQkoKHZhbCkgPD0gbWF4X3RocmVzKG0pKQogI2RlZmluZSBUSFJFU0hPTERfUFJPUF9CVUlMREVSKHByb3ApCQkJCQlcCkBAIC0xMDg0LDYgKzEwNDgsMTcgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGRtYV9vcF9tb2RlLCAwNjQ0LCBkbWFfb3BfbW9kZV9zaG93LCBkbWFfb3BfbW9kZV9zdG9yZSk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphZGRpdGlvbmFsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX21heF90eF90aHJlcy5hdHRyLAorCSZkZXZfYXR0cl9tYXhfcnhfdGhyZXMuYXR0ciwKKwkmZGV2X2F0dHJfZG1hX29wX21vZGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRkaXRpb25hbF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IChzdHJ1Y3QgYXR0cmlidXRlICoqKWFkZGl0aW9uYWxfYXR0cnMsCit9OworCiBzdGF0aWMgc3NpemVfdCBzdF90YXBzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0xMTQyLDI3ICsxMTE3LDYgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHN0X3RhcHMsIDA2NDQsIHN0X3RhcHNfc2hvdywgc3RfdGFwc19zdG9yZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICphZGRpdGlvbmFsX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX21heF90eF90aHJlcy5hdHRyLAotCSZkZXZfYXR0cl9tYXhfcnhfdGhyZXMuYXR0ciwKLQkmZGV2X2F0dHJfZG1hX29wX21vZGUuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRkaXRpb25hbF9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IChzdHJ1Y3QgYXR0cmlidXRlICoqKWFkZGl0aW9uYWxfYXR0cnMsCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBfX2RldmluaXQgb21hcF9hZGRpdGlvbmFsX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmYWRkaXRpb25hbF9hdHRyX2dyb3VwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZGV2ZXhpdCBvbWFwX2FkZGl0aW9uYWxfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmFkZGl0aW9uYWxfYXR0cl9ncm91cCk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpzaWRldG9uZV9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9zdF90YXBzLmF0dHIsCiAJTlVMTCwKQEAgLTExNzIsMTAgKzExMjYsOSBAQAogCS5hdHRycyA9IChzdHJ1Y3QgYXR0cmlidXRlICoqKXNpZGV0b25lX2F0dHJzLAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgb21hcF9zdF9hZGQoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQorc3RhdGljIGludCBfX2RldmluaXQgb21hcF9zdF9hZGQoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwLAorCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBvbWFwX21jYnNwX3N0X2RhdGEgKnN0X2RhdGE7CiAJaW50IGVycjsKIApAQCAtMTE4NSw5ICsxMTM4LDYgQEAKIAkJZ290byBlcnIxOwogCX0KIAotCXBkZXYgPSBjb250YWluZXJfb2YobWNic3AtPmRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzaWRldG9uZSIpOwogCXN0X2RhdGEtPmlvX2Jhc2Vfc3QgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFzdF9kYXRhLT5pb19iYXNlX3N0KSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC0xMjE0LDYwICsxMTY0LDExIEBACiB7CiAJc3RydWN0IG9tYXBfbWNic3Bfc3RfZGF0YSAqc3RfZGF0YSA9IG1jYnNwLT5zdF9kYXRhOwogCi0JaWYgKHN0X2RhdGEpIHsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtY2JzcC0+ZGV2LT5rb2JqLCAmc2lkZXRvbmVfYXR0cl9ncm91cCk7Ci0JCWlvdW5tYXAoc3RfZGF0YS0+aW9fYmFzZV9zdCk7Ci0JCWtmcmVlKHN0X2RhdGEpOwotCX0KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm1jYnNwLT5kZXYtPmtvYmosICZzaWRldG9uZV9hdHRyX2dyb3VwKTsKKwlpb3VubWFwKHN0X2RhdGEtPmlvX2Jhc2Vfc3QpOworCWtmcmVlKHN0X2RhdGEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZXZpbml0IG9tYXAzNHh4X2RldmljZV9pbml0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkKLXsKLQltY2JzcC0+ZG1hX29wX21vZGUgPSBNQ0JTUF9ETUFfTU9ERV9FTEVNRU5UOwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQkvKgotCQkgKiBJbml0aWFsbHkgY29uZmlndXJlIHRoZSBtYXhpbXVtIHRocmVzaG9sZHMgdG8gYSBzYWZlIHZhbHVlLgotCQkgKiBUaGUgTWNCU1AgRklGTyB1c2FnZSB3aXRoIHRoZXNlIHZhbHVlcyBzaG91bGQgbm90IGdvIHVuZGVyCi0JCSAqIDE2IGxvY2F0aW9ucy4KLQkJICogSWYgdGhlIHdob2xlIEZJRk8gd2l0aG91dCBzYWZldHkgYnVmZmVyIGlzIHVzZWQsIHRoYW4gdGhlcmUKLQkJICogaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBETUEgd2lsbCBiZSBub3QgYWJsZSB0byBwdXNoIHRoZQotCQkgKiBuZXcgZGF0YSBvbiB0aW1lLCBjYXVzaW5nIGNoYW5uZWwgc2hpZnRzIGluIHJ1bnRpbWUuCi0JCSAqLwotCQltY2JzcC0+bWF4X3R4X3RocmVzID0gbWF4X3RocmVzKG1jYnNwKSAtIDB4MTA7Ci0JCW1jYnNwLT5tYXhfcnhfdGhyZXMgPSBtYXhfdGhyZXMobWNic3ApIC0gMHgxMDsKLQkJLyoKLQkJICogUkVWSVNJVDogU2V0IGRtYXBfb3BfbW9kZSB0byBUSFJFU0hPTEQgYXMgZGVmYXVsdAotCQkgKiBmb3IgbWNic3AyIGluc3RhbmNlcy4KLQkJICovCi0JCWlmIChvbWFwX2FkZGl0aW9uYWxfYWRkKG1jYnNwLT5kZXYpKQotCQkJZGV2X3dhcm4obWNic3AtPmRldiwKLQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGNvbnRyb2xzXG4iKTsKLQotCQlpZiAobWNic3AtPmlkID09IDIgfHwgbWNic3AtPmlkID09IDMpCi0JCQlpZiAob21hcF9zdF9hZGQobWNic3ApKQotCQkJCWRldl93YXJuKG1jYnNwLT5kZXYsCi0JCQkJICJVbmFibGUgdG8gY3JlYXRlIHNpZGV0b25lIGNvbnRyb2xzXG4iKTsKLQotCX0gZWxzZSB7Ci0JCW1jYnNwLT5tYXhfdHhfdGhyZXMgPSAtRUlOVkFMOwotCQltY2JzcC0+bWF4X3J4X3RocmVzID0gLUVJTlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmV4aXQgb21hcDM0eHhfZGV2aWNlX2V4aXQoc3RydWN0IG9tYXBfbWNic3AgKm1jYnNwKQotewotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQlvbWFwX2FkZGl0aW9uYWxfcmVtb3ZlKG1jYnNwLT5kZXYpOwotCi0JCWlmIChtY2JzcC0+aWQgPT0gMiB8fCBtY2JzcC0+aWQgPT0gMykKLQkJCW9tYXBfc3RfcmVtb3ZlKG1jYnNwKTsKLQl9Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIF9fZGV2aW5pdCBvbWFwMzR4eF9kZXZpY2VfaW5pdChzdHJ1Y3Qgb21hcF9tY2JzcCAqbWNic3ApIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19kZXZleGl0IG9tYXAzNHh4X2RldmljZV9leGl0KHN0cnVjdCBvbWFwX21jYnNwICptY2JzcCkge30KLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMyAqLwotCiAvKgogICogTWNCU1AxIGFuZCBNY0JTUDMgYXJlIGRpcmVjdGx5IG1hcHBlZCBvbiAxNjEwIGFuZCAxNTEwLgogICogNzMwIGhhcyBvbmx5IDIgTWNCU1AsIGFuZCBib3RoIG9mIHRoZW0gYXJlIE1QVSBwZXJpcGhlcmFscy4KQEAgLTEzMTYsNyArMTIxNyw3IEBACiAJCX0KIAl9CiAJbWNic3AtPnBoeXNfYmFzZSA9IHJlcy0+c3RhcnQ7Ci0Jb21hcF9tY2JzcF9jYWNoZV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCW1jYnNwLT5yZWdfY2FjaGVfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAltY2JzcC0+aW9fYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIW1jYnNwLT5pb19iYXNlKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMzY0LDE1ICsxMjY1LDUyIEBACiAJbWNic3AtPnBkYXRhID0gcGRhdGE7CiAJbWNic3AtPmRldiA9ICZwZGV2LT5kZXY7CiAJbWNic3BfcHRyW2lkXSA9IG1jYnNwOwotCW1jYnNwLT5tY2JzcF9jb25maWdfdHlwZSA9IHBkYXRhLT5tY2JzcF9jb25maWdfdHlwZTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2JzcCk7CiAJcG1fcnVudGltZV9lbmFibGUobWNic3AtPmRldik7CiAKLQkvKiBJbml0aWFsaXplIG1jYnNwIHByb3BlcnRpZXMgZm9yIE9NQVAzNFhYIGlmIG5lZWRlZCAvIGFwcGxpY2FibGUgKi8KLQlvbWFwMzR4eF9kZXZpY2VfaW5pdChtY2JzcCk7CisJbWNic3AtPmRtYV9vcF9tb2RlID0gTUNCU1BfRE1BX01PREVfRUxFTUVOVDsKKwlpZiAobWNic3AtPnBkYXRhLT5idWZmZXJfc2l6ZSkgeworCQkvKgorCQkgKiBJbml0aWFsbHkgY29uZmlndXJlIHRoZSBtYXhpbXVtIHRocmVzaG9sZHMgdG8gYSBzYWZlIHZhbHVlLgorCQkgKiBUaGUgTWNCU1AgRklGTyB1c2FnZSB3aXRoIHRoZXNlIHZhbHVlcyBzaG91bGQgbm90IGdvIHVuZGVyCisJCSAqIDE2IGxvY2F0aW9ucy4KKwkJICogSWYgdGhlIHdob2xlIEZJRk8gd2l0aG91dCBzYWZldHkgYnVmZmVyIGlzIHVzZWQsIHRoYW4gdGhlcmUKKwkJICogaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBETUEgd2lsbCBiZSBub3QgYWJsZSB0byBwdXNoIHRoZQorCQkgKiBuZXcgZGF0YSBvbiB0aW1lLCBjYXVzaW5nIGNoYW5uZWwgc2hpZnRzIGluIHJ1bnRpbWUuCisJCSAqLworCQltY2JzcC0+bWF4X3R4X3RocmVzID0gbWF4X3RocmVzKG1jYnNwKSAtIDB4MTA7CisJCW1jYnNwLT5tYXhfcnhfdGhyZXMgPSBtYXhfdGhyZXMobWNic3ApIC0gMHgxMDsKKworCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm1jYnNwLT5kZXYtPmtvYmosCisJCQkJCSAmYWRkaXRpb25hbF9hdHRyX2dyb3VwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihtY2JzcC0+ZGV2LAorCQkJCSJVbmFibGUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgY29udHJvbHNcbiIpOworCQkJZ290byBlcnJfdGhyZXM7CisJCX0KKwl9IGVsc2UgeworCQltY2JzcC0+bWF4X3R4X3RocmVzID0gLUVJTlZBTDsKKwkJbWNic3AtPm1heF9yeF90aHJlcyA9IC1FSU5WQUw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNpZGV0b25lIik7CisJaWYgKHJlcykgeworCQlyZXQgPSBvbWFwX3N0X2FkZChtY2JzcCwgcmVzKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihtY2JzcC0+ZGV2LAorCQkJCSJVbmFibGUgdG8gY3JlYXRlIHNpZGV0b25lIGNvbnRyb2xzXG4iKTsKKwkJCWdvdG8gZXJyX3N0OworCQl9CisJfQogCiAJcmV0dXJuIDA7CiAKK2Vycl9zdDoKKwlpZiAobWNic3AtPnBkYXRhLT5idWZmZXJfc2l6ZSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtY2JzcC0+ZGV2LT5rb2JqLAorCQkJCSAgICZhZGRpdGlvbmFsX2F0dHJfZ3JvdXApOworZXJyX3RocmVzOgorCWNsa19wdXQobWNic3AtPmZjbGspOwogZXJyX3JlczoKIAlpb3VubWFwKG1jYnNwLT5pb19iYXNlKTsKIGVycl9pb3JlbWFwOgpAQCAtMTM5Miw3ICsxMzMwLDEyIEBACiAJCQkJbWNic3AtPnBkYXRhLT5vcHMtPmZyZWUpCiAJCQltY2JzcC0+cGRhdGEtPm9wcy0+ZnJlZShtY2JzcC0+aWQpOwogCi0JCW9tYXAzNHh4X2RldmljZV9leGl0KG1jYnNwKTsKKwkJaWYgKG1jYnNwLT5wZGF0YS0+YnVmZmVyX3NpemUpCisJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJm1jYnNwLT5kZXYtPmtvYmosCisJCQkJCSAgICZhZGRpdGlvbmFsX2F0dHJfZ3JvdXApOworCisJCWlmIChtY2JzcC0+c3RfZGF0YSkKKwkJCW9tYXBfc3RfcmVtb3ZlKG1jYnNwKTsKIAogCQljbGtfcHV0KG1jYnNwLT5mY2xrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXAtcG0tbm9vcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXAtcG0tbm9vcC5jCmluZGV4IGIwNDcxYmIyLi4zZGMzODAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvb21hcC1wbS1ub29wLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXAtcG0tbm9vcC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgogCiBzdGF0aWMgYm9vbCBvZmZfbW9kZV9lbmFibGVkOwotc3RhdGljIHUzMiBkdW1teV9jb250ZXh0X2xvc3NfY291bnRlcjsKK3N0YXRpYyBpbnQgZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXI7CiAKIC8qCiAgKiBEZXZpY2UtZHJpdmVyLW9yaWdpbmF0ZWQgY29uc3RyYWludHMgKHZpYSBib2FyZC0qLmMgZmlsZXMpCkBAIC0zMTEsMjIgKzMxMSwzMiBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDJQTFVTCiAKLXUzMiBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0JdTMyIGNvdW50OworCWludCBjb3VudDsKIAogCWlmIChXQVJOX09OKCFkZXYpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoZGV2LT5wYXJlbnQgPT0gJm9tYXBfZGV2aWNlX3BhcmVudCkgewogCQljb3VudCA9IG9tYXBfZGV2aWNlX2dldF9jb250ZXh0X2xvc3NfY291bnQocGRldik7CiAJfSBlbHNlIHsKIAkJV0FSTl9PTkNFKG9mZl9tb2RlX2VuYWJsZWQsICJvbWFwX3BtOiB1c2luZyBkdW1teSBjb250ZXh0IGxvc3MgY291bnRlcjsgZGV2aWNlICVzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gb21hcF9kZXZpY2UiLAogCQkJICBkZXZfbmFtZShkZXYpKTsKLQkJaWYgKG9mZl9tb2RlX2VuYWJsZWQpCi0JCQlkdW1teV9jb250ZXh0X2xvc3NfY291bnRlcisrOworCiAJCWNvdW50ID0gZHVtbXlfY29udGV4dF9sb3NzX2NvdW50ZXI7CisKKwkJaWYgKG9mZl9tb2RlX2VuYWJsZWQpIHsKKwkJCWNvdW50Kys7CisJCQkvKgorCQkJICogQ29udGV4dCBsb3NzIGNvdW50IGhhcyB0byBiZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZS4KKwkJCSAqIENsZWFyIHRoZSBzaWduIGJpdCB0byBnZXQgYSB2YWx1ZSByYW5nZSBmcm9tIDAgdG8KKwkJCSAqIElOVF9NQVguCisJCQkgKi8KKwkJCWNvdW50ICY9IElOVF9NQVg7CisJCQlkdW1teV9jb250ZXh0X2xvc3NfY291bnRlciA9IGNvdW50OworCQl9CiAJfQogCiAJcHJfZGVidWcoIk9NQVAgUE06IGNvbnRleHQgbG9zcyBjb3VudCBmb3IgZGV2ICVzID0gJWRcbiIsCkBAIC0zMzcsNyArMzQ3LDcgQEAKIAogI2Vsc2UKIAotdTMyIG9tYXBfcG1fZ2V0X2Rldl9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IGRldmljZSAqZGV2KQoraW50IG9tYXBfcG1fZ2V0X2Rldl9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBkdW1teV9jb250ZXh0X2xvc3NfY291bnRlcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vbWFwX2RldmljZS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKaW5kZXggMDI2MDllZS4uZThkOTg2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29tYXBfZGV2aWNlLmMKQEAgLTc4LDYgKzc4LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtODUsNiArODYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxwbGF0L29tYXBfZGV2aWNlLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CkBAIC05NCw2ICs5NywyMyBAQAogI2RlZmluZSBVU0VfV0FLRVVQX0xBVAkJCTAKICNkZWZpbmUgSUdOT1JFX1dBS0VVUF9MQVQJCTEKIAorc3RhdGljIGludCBvbWFwX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKK3N0YXRpYyBpbnQgb21hcF9lYXJseV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitzdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlICpvbWFwX2RldmljZV9hbGxvYyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICAgIHN0cnVjdCBvbWFwX2h3bW9kICoqb2hzLCBpbnQgb2hfY250LAorCQkJCSAgICAgIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzLAorCQkJCSAgICAgIGludCBwbV9sYXRzX2NudCk7CitzdGF0aWMgdm9pZCBvbWFwX2RldmljZV9kZWxldGUoc3RydWN0IG9tYXBfZGV2aWNlICpvZCk7CisKKworc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5IG9tYXBfZGVmYXVsdF9sYXRlbmN5W10gPSB7CisJeworCQkuZGVhY3RpdmF0ZV9mdW5jID0gb21hcF9kZXZpY2VfaWRsZV9od21vZHMsCisJCS5hY3RpdmF0ZV9mdW5jICAgPSBvbWFwX2RldmljZV9lbmFibGVfaHdtb2RzLAorCQkuZmxhZ3MgPSBPTUFQX0RFVklDRV9MQVRFTkNZX0FVVE9fQURKVVNULAorCX0KK307CisKIC8qIFByaXZhdGUgZnVuY3Rpb25zICovCiAKIC8qKgpAQCAtMTE0LDcgKzEzNCw3IEBACiB7CiAJc3RydWN0IHRpbWVzcGVjIGEsIGIsIGM7CiAKLQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBhY3RpdmF0aW5nXG4iLCBvZC0+cGRldi5uYW1lKTsKKwlkZXZfZGJnKCZvZC0+cGRldi0+ZGV2LCAib21hcF9kZXZpY2U6IGFjdGl2YXRpbmdcbiIpOwogCiAJd2hpbGUgKG9kLT5wbV9sYXRfbGV2ZWwgPiAwKSB7CiAJCXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpvZHBsOwpAQCAtMTM4LDI1ICsxNTgsMjQgQEAKIAkJYyA9IHRpbWVzcGVjX3N1YihiLCBhKTsKIAkJYWN0X2xhdCA9IHRpbWVzcGVjX3RvX25zKCZjKTsKIAotCQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBwbV9sYXQgJWQ6IGFjdGl2YXRlOiBlbGFwc2VkIHRpbWUgIgotCQkJICIlbGx1IG5zZWNcbiIsIG9kLT5wZGV2Lm5hbWUsIG9kLT5wbV9sYXRfbGV2ZWwsCi0JCQkgYWN0X2xhdCk7CisJCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsCisJCQkib21hcF9kZXZpY2U6IHBtX2xhdCAlZDogYWN0aXZhdGU6IGVsYXBzZWQgdGltZSAiCisJCQkiJWxsdSBuc2VjXG4iLCBvZC0+cG1fbGF0X2xldmVsLCBhY3RfbGF0KTsKIAogCQlpZiAoYWN0X2xhdCA+IG9kcGwtPmFjdGl2YXRlX2xhdCkgewogCQkJb2RwbC0+YWN0aXZhdGVfbGF0X3dvcnN0ID0gYWN0X2xhdDsKIAkJCWlmIChvZHBsLT5mbGFncyAmIE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QpIHsKIAkJCQlvZHBsLT5hY3RpdmF0ZV9sYXQgPSBhY3RfbGF0OwotCQkJCXByX3dhcm5pbmcoIm9tYXBfZGV2aWNlOiAlcy4lZDogbmV3IHdvcnN0IGNhc2UgIgotCQkJCQkgICAiYWN0aXZhdGUgbGF0ZW5jeSAlZDogJWxsdVxuIiwKLQkJCQkJICAgb2QtPnBkZXYubmFtZSwgb2QtPnBkZXYuaWQsCi0JCQkJCSAgIG9kLT5wbV9sYXRfbGV2ZWwsIGFjdF9sYXQpOworCQkJCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsCisJCQkJCSJuZXcgd29yc3QgY2FzZSBhY3RpdmF0ZSBsYXRlbmN5ICIKKwkJCQkJIiVkOiAlbGx1XG4iLAorCQkJCQlvZC0+cG1fbGF0X2xldmVsLCBhY3RfbGF0KTsKIAkJCX0gZWxzZQotCQkJCXByX3dhcm5pbmcoIm9tYXBfZGV2aWNlOiAlcy4lZDogYWN0aXZhdGUgIgotCQkJCQkgICAibGF0ZW5jeSAlZCBoaWdoZXIgdGhhbiBleHB0ZWN0ZWQuICIKLQkJCQkJICAgIiglbGx1ID4gJWQpXG4iLAotCQkJCQkgICBvZC0+cGRldi5uYW1lLCBvZC0+cGRldi5pZCwKLQkJCQkJICAgb2QtPnBtX2xhdF9sZXZlbCwgYWN0X2xhdCwKLQkJCQkJICAgb2RwbC0+YWN0aXZhdGVfbGF0KTsKKwkJCQlkZXZfd2Fybigmb2QtPnBkZXYtPmRldiwKKwkJCQkJICJhY3RpdmF0ZSBsYXRlbmN5ICVkICIKKwkJCQkJICJoaWdoZXIgdGhhbiBleHB0ZWN0ZWQuICglbGx1ID4gJWQpXG4iLAorCQkJCQkgb2QtPnBtX2xhdF9sZXZlbCwgYWN0X2xhdCwKKwkJCQkJIG9kcGwtPmFjdGl2YXRlX2xhdCk7CiAJCX0KIAogCQlvZC0+ZGV2X3dha2V1cF9sYXQgLT0gb2RwbC0+YWN0aXZhdGVfbGF0OwpAQCAtMTgzLDcgKzIwMiw3IEBACiB7CiAJc3RydWN0IHRpbWVzcGVjIGEsIGIsIGM7CiAKLQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiBkZWFjdGl2YXRpbmdcbiIsIG9kLT5wZGV2Lm5hbWUpOworCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsICJvbWFwX2RldmljZTogZGVhY3RpdmF0aW5nXG4iKTsKIAogCXdoaWxlIChvZC0+cG1fbGF0X2xldmVsIDwgb2QtPnBtX2xhdHNfY250KSB7CiAJCXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpvZHBsOwpAQCAtMjA2LDI4ICsyMjUsMjYgQEAKIAkJYyA9IHRpbWVzcGVjX3N1YihiLCBhKTsKIAkJZGVhY3RfbGF0ID0gdGltZXNwZWNfdG9fbnMoJmMpOwogCi0JCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IHBtX2xhdCAlZDogZGVhY3RpdmF0ZTogZWxhcHNlZCB0aW1lICIKLQkJCSAiJWxsdSBuc2VjXG4iLCBvZC0+cGRldi5uYW1lLCBvZC0+cG1fbGF0X2xldmVsLAotCQkJIGRlYWN0X2xhdCk7CisJCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsCisJCQkib21hcF9kZXZpY2U6IHBtX2xhdCAlZDogZGVhY3RpdmF0ZTogZWxhcHNlZCB0aW1lICIKKwkJCSIlbGx1IG5zZWNcbiIsIG9kLT5wbV9sYXRfbGV2ZWwsIGRlYWN0X2xhdCk7CiAKIAkJaWYgKGRlYWN0X2xhdCA+IG9kcGwtPmRlYWN0aXZhdGVfbGF0KSB7CiAJCQlvZHBsLT5kZWFjdGl2YXRlX2xhdF93b3JzdCA9IGRlYWN0X2xhdDsKIAkJCWlmIChvZHBsLT5mbGFncyAmIE9NQVBfREVWSUNFX0xBVEVOQ1lfQVVUT19BREpVU1QpIHsKIAkJCQlvZHBsLT5kZWFjdGl2YXRlX2xhdCA9IGRlYWN0X2xhdDsKLQkJCQlwcl93YXJuaW5nKCJvbWFwX2RldmljZTogJXMuJWQ6IG5ldyB3b3JzdCBjYXNlICIKLQkJCQkJICAgImRlYWN0aXZhdGUgbGF0ZW5jeSAlZDogJWxsdVxuIiwKLQkJCQkJICAgb2QtPnBkZXYubmFtZSwgb2QtPnBkZXYuaWQsCi0JCQkJCSAgIG9kLT5wbV9sYXRfbGV2ZWwsIGRlYWN0X2xhdCk7CisJCQkJZGV2X2RiZygmb2QtPnBkZXYtPmRldiwKKwkJCQkJIm5ldyB3b3JzdCBjYXNlIGRlYWN0aXZhdGUgbGF0ZW5jeSAiCisJCQkJCSIlZDogJWxsdVxuIiwKKwkJCQkJb2QtPnBtX2xhdF9sZXZlbCwgZGVhY3RfbGF0KTsKIAkJCX0gZWxzZQotCQkJCXByX3dhcm5pbmcoIm9tYXBfZGV2aWNlOiAlcy4lZDogZGVhY3RpdmF0ZSAiCi0JCQkJCSAgICJsYXRlbmN5ICVkIGhpZ2hlciB0aGFuIGV4cHRlY3RlZC4gIgotCQkJCQkgICAiKCVsbHUgPiAlZClcbiIsCi0JCQkJCSAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLAotCQkJCQkgICBvZC0+cG1fbGF0X2xldmVsLCBkZWFjdF9sYXQsCi0JCQkJCSAgIG9kcGwtPmRlYWN0aXZhdGVfbGF0KTsKKwkJCQlkZXZfd2Fybigmb2QtPnBkZXYtPmRldiwKKwkJCQkJICJkZWFjdGl2YXRlIGxhdGVuY3kgJWQgIgorCQkJCQkgImhpZ2hlciB0aGFuIGV4cHRlY3RlZC4gKCVsbHUgPiAlZClcbiIsCisJCQkJCSBvZC0+cG1fbGF0X2xldmVsLCBkZWFjdF9sYXQsCisJCQkJCSBvZHBsLT5kZWFjdGl2YXRlX2xhdCk7CiAJCX0KIAotCiAJCW9kLT5kZXZfd2FrZXVwX2xhdCArPSBvZHBsLT5hY3RpdmF0ZV9sYXQ7CiAKIAkJb2QtPnBtX2xhdF9sZXZlbCsrOwpAQCAtMjQ1LDI4ICsyNjIsMjcgQEAKIAlpZiAoIWNsa19hbGlhcyB8fCAhY2xrX25hbWUpCiAJCXJldHVybjsKIAotCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IENyZWF0aW5nICVzIC0+ICVzXG4iLAotCQkgZGV2X25hbWUoJm9kLT5wZGV2LmRldiksIGNsa19hbGlhcywgY2xrX25hbWUpOworCWRldl9kYmcoJm9kLT5wZGV2LT5kZXYsICJDcmVhdGluZyAlcyAtPiAlc1xuIiwgY2xrX2FsaWFzLCBjbGtfbmFtZSk7CiAKLQlyID0gY2xrX2dldF9zeXMoZGV2X25hbWUoJm9kLT5wZGV2LmRldiksIGNsa19hbGlhcyk7CisJciA9IGNsa19nZXRfc3lzKGRldl9uYW1lKCZvZC0+cGRldi0+ZGV2KSwgY2xrX2FsaWFzKTsKIAlpZiAoIUlTX0VSUihyKSkgewotCQlwcl93YXJuaW5nKCJvbWFwX2RldmljZTogJXM6IGFsaWFzICVzIGFscmVhZHkgZXhpc3RzXG4iLAotCQkJICAgZGV2X25hbWUoJm9kLT5wZGV2LmRldiksIGNsa19hbGlhcyk7CisJCWRldl93YXJuKCZvZC0+cGRldi0+ZGV2LAorCQkJICJhbGlhcyAlcyBhbHJlYWR5IGV4aXN0c1xuIiwgY2xrX2FsaWFzKTsKIAkJY2xrX3B1dChyKTsKIAkJcmV0dXJuOwogCX0KIAogCXIgPSBvbWFwX2Nsa19nZXRfYnlfbmFtZShjbGtfbmFtZSk7CiAJaWYgKElTX0VSUihyKSkgewotCQlwcl9lcnIoIm9tYXBfZGV2aWNlOiAlczogb21hcF9jbGtfZ2V0X2J5X25hbWUgZm9yICVzIGZhaWxlZFxuIiwKLQkJICAgICAgIGRldl9uYW1lKCZvZC0+cGRldi5kZXYpLCBjbGtfbmFtZSk7CisJCWRldl9lcnIoJm9kLT5wZGV2LT5kZXYsCisJCQkib21hcF9jbGtfZ2V0X2J5X25hbWUgZm9yICVzIGZhaWxlZFxuIiwgY2xrX25hbWUpOwogCQlyZXR1cm47CiAJfQogCi0JbCA9IGNsa2Rldl9hbGxvYyhyLCBjbGtfYWxpYXMsIGRldl9uYW1lKCZvZC0+cGRldi5kZXYpKTsKKwlsID0gY2xrZGV2X2FsbG9jKHIsIGNsa19hbGlhcywgZGV2X25hbWUoJm9kLT5wZGV2LT5kZXYpKTsKIAlpZiAoIWwpIHsKLQkJcHJfZXJyKCJvbWFwX2RldmljZTogJXM6IGNsa2Rldl9hbGxvYyBmb3IgJXMgZmFpbGVkXG4iLAotCQkgICAgICAgZGV2X25hbWUoJm9kLT5wZGV2LmRldiksIGNsa19hbGlhcyk7CisJCWRldl9lcnIoJm9kLT5wZGV2LT5kZXYsCisJCQkiY2xrZGV2X2FsbG9jIGZvciAlcyBmYWlsZWRcbiIsIGNsa19hbGlhcyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMwNCw2ICszMjAsOTYgQEAKIH0KIAogCitzdGF0aWMgc3RydWN0IGRldl9wbV9kb21haW4gb21hcF9kZXZpY2VfcG1fZG9tYWluOworCisvKioKKyAqIG9tYXBfZGV2aWNlX2J1aWxkX2Zyb21fZHQgLSBidWlsZCBhbiBvbWFwX2RldmljZSB3aXRoIG11bHRpcGxlIGh3bW9kcworICogQHBkZXZfbmFtZTogbmFtZSBvZiB0aGUgcGxhdGZvcm1fZGV2aWNlIGRyaXZlciB0byB1c2UKKyAqIEBwZGV2X2lkOiB0aGlzIHBsYXRmb3JtX2RldmljZSdzIGNvbm5lY3Rpb24gSUQKKyAqIEBvaDogcHRyIHRvIHRoZSBzaW5nbGUgb21hcF9od21vZCB0aGF0IGJhY2tzIHRoaXMgb21hcF9kZXZpY2UKKyAqIEBwZGF0YTogcGxhdGZvcm1fZGF0YSBwdHIgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBsYXRmb3JtX2RldmljZQorICogQHBkYXRhX2xlbjogYW1vdW50IG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IEBwZGF0YQorICogQHBtX2xhdHM6IHBvaW50ZXIgdG8gYSBvbWFwX2RldmljZV9wbV9sYXRlbmN5IGFycmF5IGZvciB0aGlzIGRldmljZQorICogQHBtX2xhdHNfY250OiBBUlJBWV9TSVpFKCkgb2YgQHBtX2xhdHMKKyAqIEBpc19lYXJseV9kZXZpY2U6IHNob3VsZCB0aGUgZGV2aWNlIGJlIHJlZ2lzdGVyZWQgYXMgYW4gZWFybHkgZGV2aWNlIG9yIG5vdAorICoKKyAqIEZ1bmN0aW9uIGZvciBidWlsZGluZyBhbiBvbWFwX2RldmljZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZnJvbSBkZXZpY2UtdHJlZQorICoKKyAqIFJldHVybnMgMCBvciBQVFJfRVJSKCkgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgb21hcF9kZXZpY2VfYnVpbGRfZnJvbV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwX2h3bW9kICoqaHdtb2RzOworCXN0cnVjdCBvbWFwX2RldmljZSAqb2Q7CisJc3RydWN0IG9tYXBfaHdtb2QgKm9oOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IGNoYXIgKm9oX25hbWU7CisJaW50IG9oX2NudCwgaSwgcmV0ID0gMDsKKworCW9oX2NudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3Mobm9kZSwgInRpLGh3bW9kcyIpOworCWlmICghb2hfY250IHx8IElTX0VSUl9WQUxVRShvaF9jbnQpKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJObyAnaHdtb2RzJyB0byBidWlsZCBvbWFwX2RldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWh3bW9kcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwX2h3bW9kICopICogb2hfY250LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh3bW9kcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG9kYmZkX2V4aXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9oX2NudDsgaSsrKSB7CisJCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5vZGUsICJ0aSxod21vZHMiLCBpLCAmb2hfbmFtZSk7CisJCW9oID0gb21hcF9od21vZF9sb29rdXAob2hfbmFtZSk7CisJCWlmICghb2gpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBsb29rdXAgaHdtb2QgJyVzJ1xuIiwKKwkJCQlvaF9uYW1lKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG9kYmZkX2V4aXQxOworCQl9CisJCWh3bW9kc1tpXSA9IG9oOworCX0KKworCW9kID0gb21hcF9kZXZpY2VfYWxsb2MocGRldiwgaHdtb2RzLCBvaF9jbnQsIE5VTEwsIDApOworCWlmICghb2QpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG9tYXBfZGV2aWNlIGZvciA6JXNcbiIsCisJCQlvaF9uYW1lKTsKKwkJcmV0ID0gUFRSX0VSUihvZCk7CisJCWdvdG8gb2RiZmRfZXhpdDE7CisJfQorCisJaWYgKG9mX2dldF9wcm9wZXJ0eShub2RlLCAidGksbm9faWRsZV9vbl9zdXNwZW5kIiwgTlVMTCkpCisJCW9tYXBfZGV2aWNlX2Rpc2FibGVfaWRsZV9vbl9zdXNwZW5kKHBkZXYpOworCisJcGRldi0+ZGV2LnBtX2RvbWFpbiA9ICZvbWFwX2RldmljZV9wbV9kb21haW47CisKK29kYmZkX2V4aXQxOgorCWtmcmVlKGh3bW9kcyk7CitvZGJmZF9leGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX29tYXBfZGV2aWNlX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQlVTX05PVElGWV9BRERfREVWSUNFOgorCQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCQlvbWFwX2RldmljZV9idWlsZF9mcm9tX2R0KHBkZXYpOworCQlicmVhazsKKworCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCQlpZiAocGRldi0+YXJjaGRhdGEub2QpCisJCQlvbWFwX2RldmljZV9kZWxldGUocGRldi0+YXJjaGRhdGEub2QpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKwogLyogUHVibGljIGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IGNvcmUgY29kZSAqLwogCiAvKioKQEAgLTMyMSw3ICs0MjcsNyBAQAogICogcmV0dXJuIHRoZSBjb250ZXh0IGxvc3MgY291bnRlciBmb3IgdGhhdCBod21vZCwgb3RoZXJ3aXNlIHJldHVybgogICogemVyby4KICAqLwotdTMyIG9tYXBfZGV2aWNlX2dldF9jb250ZXh0X2xvc3NfY291bnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK2ludCBvbWFwX2RldmljZV9nZXRfY29udGV4dF9sb3NzX2NvdW50KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKIAl1MzIgcmV0ID0gMDsKQEAgLTM0Myw3ICs0NDksNyBAQAogICogbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgYmVmb3JlIGNhbGxpbmcKICAqIG9tYXBfZGV2aWNlX2ZpbGxfcmVzb3VyY2VzKCkuICBSZXR1cm5zIHRoZSBjb3VudC4KICAqLwotaW50IG9tYXBfZGV2aWNlX2NvdW50X3Jlc291cmNlcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKQorc3RhdGljIGludCBvbWFwX2RldmljZV9jb3VudF9yZXNvdXJjZXMoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKIHsKIAlpbnQgYyA9IDA7CiAJaW50IGk7CkBAIC0zNTIsNyArNDU4LDcgQEAKIAkJYyArPSBvbWFwX2h3bW9kX2NvdW50X3Jlc291cmNlcyhvZC0+aHdtb2RzW2ldKTsKIAogCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IGNvdW50ZWQgJWQgdG90YWwgcmVzb3VyY2VzIGFjcm9zcyAlZCAiCi0JCSAiaHdtb2RzXG4iLCBvZC0+cGRldi5uYW1lLCBjLCBvZC0+aHdtb2RzX2NudCk7CisJCSAiaHdtb2RzXG4iLCBvZC0+cGRldi0+bmFtZSwgYywgb2QtPmh3bW9kc19jbnQpOwogCiAJcmV0dXJuIGM7CiB9CkBAIC0zNzQsNyArNDgwLDggQEAKICAqIGZ1bmN0aW9ucyB0byBnZXQgZGV2aWNlIHJlc291cmNlcy4gIEhhY2tpbmcgYXJvdW5kIHRoZSBleGlzdGluZwogICogcGxhdGZvcm1fZGV2aWNlIGNvZGUgd2FzdGVzIG1lbW9yeS4gIFJldHVybnMgMC4KICAqLwotaW50IG9tYXBfZGV2aWNlX2ZpbGxfcmVzb3VyY2VzKHN0cnVjdCBvbWFwX2RldmljZSAqb2QsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQorc3RhdGljIGludCBvbWFwX2RldmljZV9maWxsX3Jlc291cmNlcyhzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kLAorCQkJCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCWludCBjID0gMDsKIAlpbnQgaSwgcjsKQEAgLTM4OSw2ICs0OTYsMTEzIEBACiB9CiAKIC8qKgorICogb21hcF9kZXZpY2VfYWxsb2MgLSBhbGxvY2F0ZSBhbiBvbWFwX2RldmljZQorICogQHBkZXY6IHBsYXRmb3JtX2RldmljZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhpcyBvbWFwX2RldmljZQorICogQG9oOiBwdHIgdG8gdGhlIHNpbmdsZSBvbWFwX2h3bW9kIHRoYXQgYmFja3MgdGhpcyBvbWFwX2RldmljZQorICogQHBkYXRhOiBwbGF0Zm9ybV9kYXRhIHB0ciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcGxhdGZvcm1fZGV2aWNlCisgKiBAcGRhdGFfbGVuOiBhbW91bnQgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgQHBkYXRhCisgKiBAcG1fbGF0czogcG9pbnRlciB0byBhIG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgYXJyYXkgZm9yIHRoaXMgZGV2aWNlCisgKiBAcG1fbGF0c19jbnQ6IEFSUkFZX1NJWkUoKSBvZiBAcG1fbGF0cworICoKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIGFuIG9tYXBfZGV2aWNlIHN0cnVjdHVyZSBhbmQgZmlsbGluZworICogaHdtb2RzLCByZXNvdXJjZXMgYW5kIHBtX2xhdGVuY3kgYXR0cmlidXRlcy4KKyAqCisgKiBSZXR1cm5zIGFuIHN0cnVjdCBvbWFwX2RldmljZSBwb2ludGVyIG9yIEVSUl9QVFIoKSBvbiBlcnJvcjsKKyAqLworc3RhdGljIHN0cnVjdCBvbWFwX2RldmljZSAqb21hcF9kZXZpY2VfYWxsb2Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IG9tYXBfaHdtb2QgKipvaHMsIGludCBvaF9jbnQsCisJCQkJCXN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzLAorCQkJCQlpbnQgcG1fbGF0c19jbnQpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJc3RydWN0IG9tYXBfZGV2aWNlICpvZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7CisJaW50IGksIHJlc19jb3VudDsKKwlzdHJ1Y3Qgb21hcF9od21vZCAqKmh3bW9kczsKKworCW9kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG9kYV9leGl0MTsKKwl9CisJb2QtPmh3bW9kc19jbnQgPSBvaF9jbnQ7CisKKwlod21vZHMgPSBrbWVtZHVwKG9ocywgc2l6ZW9mKHN0cnVjdCBvbWFwX2h3bW9kICopICogb2hfY250LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh3bW9kcykKKwkJZ290byBvZGFfZXhpdDI7CisKKwlvZC0+aHdtb2RzID0gaHdtb2RzOworCW9kLT5wZGV2ID0gcGRldjsKKworCS8qCisJICogSEFDSzogSWRlYWxseSB0aGUgcmVzb3VyY2VzIGZyb20gRFQgc2hvdWxkIG1hdGNoLCBhbmQgaHdtb2QKKwkgKiBzaG91bGQganVzdCBhZGQgdGhlIG1pc3Npbmcgb25lcy4gU2luY2UgdGhlIG5hbWUgaXMgbm90CisJICogcHJvcGVybHkgcG9wdWxhdGVkIGJ5IERULCBzdGljayB0byBod21vZCByZXNvdXJjZXMgb25seS4KKwkgKi8KKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAmJiBwZGV2LT5yZXNvdXJjZSkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIiVzKCk6IHJlc291cmNlcyBhbHJlYWR5IGFsbG9jYXRlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBwZGV2LT5udW1fcmVzb3VyY2VzKTsKKworCXJlc19jb3VudCA9IG9tYXBfZGV2aWNlX2NvdW50X3Jlc291cmNlcyhvZCk7CisJaWYgKHJlc19jb3VudCA+IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoKTogcmVzb3VyY2VzIGFsbG9jYXRlZCBmcm9tIGh3bW9kICVkXG4iLAorCQkJX19mdW5jX18sIHJlc19jb3VudCk7CisJCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiByZXNfY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIXJlcykKKwkJCWdvdG8gb2RhX2V4aXQzOworCisJCW9tYXBfZGV2aWNlX2ZpbGxfcmVzb3VyY2VzKG9kLCByZXMpOworCisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHJlcywgcmVzX2NvdW50KTsKKwkJa2ZyZWUocmVzKTsKKworCQlpZiAocmV0KQorCQkJZ290byBvZGFfZXhpdDM7CisJfQorCisJaWYgKCFwbV9sYXRzKSB7CisJCXBtX2xhdHMgPSBvbWFwX2RlZmF1bHRfbGF0ZW5jeTsKKwkJcG1fbGF0c19jbnQgPSBBUlJBWV9TSVpFKG9tYXBfZGVmYXVsdF9sYXRlbmN5KTsKKwl9CisKKwlvZC0+cG1fbGF0c19jbnQgPSBwbV9sYXRzX2NudDsKKwlvZC0+cG1fbGF0cyA9IGttZW1kdXAocG1fbGF0cywKKwkJCXNpemVvZihzdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSkgKiBwbV9sYXRzX2NudCwKKwkJCUdGUF9LRVJORUwpOworCWlmICghb2QtPnBtX2xhdHMpCisJCWdvdG8gb2RhX2V4aXQzOworCisJcGRldi0+YXJjaGRhdGEub2QgPSBvZDsKKworCWZvciAoaSA9IDA7IGkgPCBvaF9jbnQ7IGkrKykgeworCQlod21vZHNbaV0tPm9kID0gb2Q7CisJCV9hZGRfaHdtb2RfY2xvY2tzX2Nsa2RldihvZCwgaHdtb2RzW2ldKTsKKwl9CisKKwlyZXR1cm4gb2Q7CisKK29kYV9leGl0MzoKKwlrZnJlZShod21vZHMpOworb2RhX2V4aXQyOgorCWtmcmVlKG9kKTsKK29kYV9leGl0MToKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJvbWFwX2RldmljZTogYnVpbGQgZmFpbGVkICglZClcbiIsIHJldCk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2RldmljZV9kZWxldGUoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKK3sKKwlpZiAoIW9kKQorCQlyZXR1cm47CisKKwlvZC0+cGRldi0+YXJjaGRhdGEub2QgPSBOVUxMOworCWtmcmVlKG9kLT5wbV9sYXRzKTsKKwlrZnJlZShvZC0+aHdtb2RzKTsKKwlrZnJlZShvZCk7Cit9CisKKy8qKgogICogb21hcF9kZXZpY2VfYnVpbGQgLSBidWlsZCBhbmQgcmVnaXN0ZXIgYW4gb21hcF9kZXZpY2Ugd2l0aCBvbmUgb21hcF9od21vZAogICogQHBkZXZfbmFtZTogbmFtZSBvZiB0aGUgcGxhdGZvcm1fZGV2aWNlIGRyaXZlciB0byB1c2UKICAqIEBwZGV2X2lkOiB0aGlzIHBsYXRmb3JtX2RldmljZSdzIGNvbm5lY3Rpb24gSUQKQEAgLTQwNSw3ICs2MTksNyBAQAogICogaW5mb3JtYXRpb24uICBSZXR1cm5zIEVSUl9QVFIoLUVJTlZBTCkgaWYgQG9oIGlzIE5VTEw7IG90aGVyd2lzZSwKICAqIHBhc3NlcyBhbG9uZyB0aGUgcmV0dXJuIHZhbHVlIG9mIG9tYXBfZGV2aWNlX2J1aWxkX3NzKCkuCiAgKi8KLXN0cnVjdCBvbWFwX2RldmljZSAqb21hcF9kZXZpY2VfYnVpbGQoY29uc3QgY2hhciAqcGRldl9uYW1lLCBpbnQgcGRldl9pZCwKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCiAJCQkJICAgICAgc3RydWN0IG9tYXBfaHdtb2QgKm9oLCB2b2lkICpwZGF0YSwKIAkJCQkgICAgICBpbnQgcGRhdGFfbGVuLAogCQkJCSAgICAgIHN0cnVjdCBvbWFwX2RldmljZV9wbV9sYXRlbmN5ICpwbV9sYXRzLApAQCAtNDM4LDE4ICs2NTIsMTUgQEAKICAqIHBsYXRmb3JtX2RldmljZSByZWNvcmQuICBSZXR1cm5zIGFuIEVSUl9QVFIoKSBvbiBlcnJvciwgb3IgcGFzc2VzCiAgKiBhbG9uZyB0aGUgcmV0dXJuIHZhbHVlIG9mIG9tYXBfZGV2aWNlX3JlZ2lzdGVyKCkuCiAgKi8KLXN0cnVjdCBvbWFwX2RldmljZSAqb21hcF9kZXZpY2VfYnVpbGRfc3MoY29uc3QgY2hhciAqcGRldl9uYW1lLCBpbnQgcGRldl9pZCwKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9tYXBfZGV2aWNlX2J1aWxkX3NzKGNvbnN0IGNoYXIgKnBkZXZfbmFtZSwgaW50IHBkZXZfaWQsCiAJCQkJCSBzdHJ1Y3Qgb21hcF9od21vZCAqKm9ocywgaW50IG9oX2NudCwKIAkJCQkJIHZvaWQgKnBkYXRhLCBpbnQgcGRhdGFfbGVuLAogCQkJCQkgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgKnBtX2xhdHMsCiAJCQkJCSBpbnQgcG1fbGF0c19jbnQsIGludCBpc19lYXJseV9kZXZpY2UpCiB7CiAJaW50IHJldCA9IC1FTk9NRU07CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kOwotCWNoYXIgKnBkZXZfbmFtZTI7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOwotCWludCBpLCByZXNfY291bnQ7Ci0Jc3RydWN0IG9tYXBfaHdtb2QgKipod21vZHM7CiAKIAlpZiAoIW9ocyB8fCBvaF9jbnQgPT0gMCB8fCAhcGRldl9uYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTQ1Nyw3MiArNjY4LDQwIEBACiAJaWYgKCFwZGF0YSAmJiBwZGF0YV9sZW4gPiAwKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCXByX2RlYnVnKCJvbWFwX2RldmljZTogJXM6IGJ1aWxkaW5nIHdpdGggJWQgaHdtb2RzXG4iLCBwZGV2X25hbWUsCi0JCSBvaF9jbnQpOworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MocGRldl9uYW1lLCBwZGV2X2lkKTsKKwlpZiAoIXBkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvZGJzX2V4aXQ7CisJfQogCi0Jb2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkvKiBTZXQgdGhlIGRldl9uYW1lIGVhcmx5IHRvIGFsbG93IGRldl94eHggaW4gb21hcF9kZXZpY2VfYWxsb2MgKi8KKwlpZiAocGRldi0+aWQgIT0gLTEpCisJCWRldl9zZXRfbmFtZSgmcGRldi0+ZGV2LCAiJXMuJWQiLCBwZGV2LT5uYW1lLCAgcGRldi0+aWQpOworCWVsc2UKKwkJZGV2X3NldF9uYW1lKCZwZGV2LT5kZXYsICIlcyIsIHBkZXYtPm5hbWUpOworCisJb2QgPSBvbWFwX2RldmljZV9hbGxvYyhwZGV2LCBvaHMsIG9oX2NudCwgcG1fbGF0cywgcG1fbGF0c19jbnQpOwogCWlmICghb2QpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0Jb2QtPmh3bW9kc19jbnQgPSBvaF9jbnQ7Ci0KLQlod21vZHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9od21vZCAqKSAqIG9oX2NudCwKLQkJCSBHRlBfS0VSTkVMKTsKLQlpZiAoIWh3bW9kcykKIAkJZ290byBvZGJzX2V4aXQxOwogCi0JbWVtY3B5KGh3bW9kcywgb2hzLCBzaXplb2Yoc3RydWN0IG9tYXBfaHdtb2QgKikgKiBvaF9jbnQpOwotCW9kLT5od21vZHMgPSBod21vZHM7Ci0KLQlwZGV2X25hbWUyID0ga3phbGxvYyhzdHJsZW4ocGRldl9uYW1lKSArIDEsIEdGUF9LRVJORUwpOwotCWlmICghcGRldl9uYW1lMikKLQkJZ290byBvZGJzX2V4aXQyOwotCXN0cmNweShwZGV2X25hbWUyLCBwZGV2X25hbWUpOwotCi0Jb2QtPnBkZXYubmFtZSA9IHBkZXZfbmFtZTI7Ci0Jb2QtPnBkZXYuaWQgPSBwZGV2X2lkOwotCi0JcmVzX2NvdW50ID0gb21hcF9kZXZpY2VfY291bnRfcmVzb3VyY2VzKG9kKTsKLQlpZiAocmVzX2NvdW50ID4gMCkgewotCQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogcmVzX2NvdW50LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyZXMpCi0JCQlnb3RvIG9kYnNfZXhpdDM7Ci0JfQotCW9tYXBfZGV2aWNlX2ZpbGxfcmVzb3VyY2VzKG9kLCByZXMpOwotCi0Jb2QtPnBkZXYubnVtX3Jlc291cmNlcyA9IHJlc19jb3VudDsKLQlvZC0+cGRldi5yZXNvdXJjZSA9IHJlczsKLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSgmb2QtPnBkZXYsIHBkYXRhLCBwZGF0YV9sZW4pOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKIAlpZiAocmV0KQotCQlnb3RvIG9kYnNfZXhpdDQ7Ci0KLQlvZC0+cG1fbGF0cyA9IHBtX2xhdHM7Ci0Jb2QtPnBtX2xhdHNfY250ID0gcG1fbGF0c19jbnQ7CisJCWdvdG8gb2Ric19leGl0MjsKIAogCWlmIChpc19lYXJseV9kZXZpY2UpCi0JCXJldCA9IG9tYXBfZWFybHlfZGV2aWNlX3JlZ2lzdGVyKG9kKTsKKwkJcmV0ID0gb21hcF9lYXJseV9kZXZpY2VfcmVnaXN0ZXIocGRldik7CiAJZWxzZQotCQlyZXQgPSBvbWFwX2RldmljZV9yZWdpc3RlcihvZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb2hfY250OyBpKyspIHsKLQkJaHdtb2RzW2ldLT5vZCA9IG9kOwotCQlfYWRkX2h3bW9kX2Nsb2Nrc19jbGtkZXYob2QsIGh3bW9kc1tpXSk7Ci0JfQotCisJCXJldCA9IG9tYXBfZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gb2Ric19leGl0NDsKKwkJZ290byBvZGJzX2V4aXQyOwogCi0JcmV0dXJuIG9kOworCXJldHVybiBwZGV2OwogCi1vZGJzX2V4aXQ0OgotCWtmcmVlKHJlcyk7Ci1vZGJzX2V4aXQzOgotCWtmcmVlKHBkZXZfbmFtZTIpOwogb2Ric19leGl0MjoKLQlrZnJlZShod21vZHMpOworCW9tYXBfZGV2aWNlX2RlbGV0ZShvZCk7CiBvZGJzX2V4aXQxOgotCWtmcmVlKG9kKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworb2Ric19leGl0OgogCiAJcHJfZXJyKCJvbWFwX2RldmljZTogJXM6IGJ1aWxkIGZhaWxlZCAoJWQpXG4iLCBwZGV2X25hbWUsIHJldCk7CiAKQEAgLTUzOCwxMSArNzE3LDExIEBACiAgKiBwbGF0Zm9ybV9lYXJseV9hZGRfZGV2aWNlKCkgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm1fZGV2aWNlLgogICogUmV0dXJucyAwIGJ5IGRlZmF1bHQuCiAgKi8KLWludCBvbWFwX2Vhcmx5X2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgb21hcF9kZXZpY2UgKm9kKQorc3RhdGljIGludCBvbWFwX2Vhcmx5X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbMV07CiAKLQlkZXZpY2VzWzBdID0gJihvZC0+cGRldik7CisJZGV2aWNlc1swXSA9IHBkZXY7CiAJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MzgsMTMgKzgxNywxMyBAQAogICogcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCkgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm1fZGV2aWNlLgogICogUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIG9mIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigpLgogICovCi1pbnQgb21hcF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG9tYXBfZGV2aWNlICpvZCkKK3N0YXRpYyBpbnQgb21hcF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlwcl9kZWJ1Zygib21hcF9kZXZpY2U6ICVzOiByZWdpc3RlcmluZ1xuIiwgb2QtPnBkZXYubmFtZSk7CisJcHJfZGVidWcoIm9tYXBfZGV2aWNlOiAlczogcmVnaXN0ZXJpbmdcbiIsIHBkZXYtPm5hbWUpOwogCi0Jb2QtPnBkZXYuZGV2LnBhcmVudCA9ICZvbWFwX2RldmljZV9wYXJlbnQ7Ci0Jb2QtPnBkZXYuZGV2LnBtX2RvbWFpbiA9ICZvbWFwX2RldmljZV9wbV9kb21haW47Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb2QtPnBkZXYpOworCXBkZXYtPmRldi5wYXJlbnQgPSAmb21hcF9kZXZpY2VfcGFyZW50OworCXBkZXYtPmRldi5wbV9kb21haW4gPSAmb21hcF9kZXZpY2VfcG1fZG9tYWluOworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogfQogCiAKQEAgLTY3MSw4ICs4NTAsOSBAQAogCW9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CiAKIAlpZiAob2QtPl9zdGF0ZSA9PSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEKSB7Ci0JCVdBUk4oMSwgIm9tYXBfZGV2aWNlOiAlcy4lZDogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkgICAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLCBfX2Z1bmNfXywgb2QtPl9zdGF0ZSk7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIm9tYXBfZGV2aWNlOiAlcygpIGNhbGxlZCBmcm9tIGludmFsaWQgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIG9kLT5fc3RhdGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTcxMCw4ICs4OTAsOSBAQAogCW9kID0gdG9fb21hcF9kZXZpY2UocGRldik7CiAKIAlpZiAob2QtPl9zdGF0ZSAhPSBPTUFQX0RFVklDRV9TVEFURV9FTkFCTEVEKSB7Ci0JCVdBUk4oMSwgIm9tYXBfZGV2aWNlOiAlcy4lZDogJXMoKSBjYWxsZWQgZnJvbSBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkgICAgIG9kLT5wZGV2Lm5hbWUsIG9kLT5wZGV2LmlkLCBfX2Z1bmNfXywgb2QtPl9zdGF0ZSk7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIm9tYXBfZGV2aWNlOiAlcygpIGNhbGxlZCBmcm9tIGludmFsaWQgc3RhdGUgJWRcbiIsCisJCQkgX19mdW5jX18sIG9kLT5fc3RhdGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc0Miw4ICs5MjMsOSBAQAogCiAJaWYgKG9kLT5fc3RhdGUgIT0gT01BUF9ERVZJQ0VfU1RBVEVfRU5BQkxFRCAmJgogCSAgICBvZC0+X3N0YXRlICE9IE9NQVBfREVWSUNFX1NUQVRFX0lETEUpIHsKLQkJV0FSTigxLCAib21hcF9kZXZpY2U6ICVzLiVkOiAlcygpIGNhbGxlZCBmcm9tIGludmFsaWQgc3RhdGUgJWRcbiIsCi0JCSAgICAgb2QtPnBkZXYubmFtZSwgb2QtPnBkZXYuaWQsIF9fZnVuY19fLCBvZC0+X3N0YXRlKTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAib21hcF9kZXZpY2U6ICVzKCkgY2FsbGVkIGZyb20gaW52YWxpZCBzdGF0ZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgb2QtPl9zdGF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODM3LDYgKzEwMTksNDIgQEAKIAlyZXR1cm4gb21hcF9od21vZF9nZXRfbXB1X3J0X3ZhKG9kLT5od21vZHNbMF0pOwogfQogCisvKioKKyAqIG9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKCkgLSBjb252ZXJ0IGEgaHdtb2QgbmFtZSB0bworICogZGV2aWNlIHBvaW50ZXIuCisgKiBAb2hfbmFtZTogbmFtZSBvZiB0aGUgaHdtb2QgZGV2aWNlCisgKgorICogUmV0dXJucyBiYWNrIGEgc3RydWN0IGRldmljZSAqIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgaHdtb2QKKyAqIGRldmljZSByZXByZXNlbnRlZCBieSBhIGh3bW9kX25hbWUKKyAqLworc3RydWN0IGRldmljZSAqb21hcF9kZXZpY2VfZ2V0X2J5X2h3bW9kX25hbWUoY29uc3QgY2hhciAqb2hfbmFtZSkKK3sKKwlzdHJ1Y3Qgb21hcF9od21vZCAqb2g7CisKKwlpZiAoIW9oX25hbWUpIHsKKwkJV0FSTigxLCAiJXM6IG5vIGh3bW9kIG5hbWUhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCW9oID0gb21hcF9od21vZF9sb29rdXAob2hfbmFtZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKG9oKSkgeworCQlXQVJOKDEsICIlczogbm8gaHdtb2QgZm9yICVzXG4iLCBfX2Z1bmNfXywKKwkJCW9oX25hbWUpOworCQlyZXR1cm4gRVJSX1BUUihvaCA/IFBUUl9FUlIob2gpIDogLUVOT0RFVik7CisJfQorCWlmIChJU19FUlJfT1JfTlVMTChvaC0+b2QpKSB7CisJCVdBUk4oMSwgIiVzOiBubyBvbWFwX2RldmljZSBmb3IgJXNcbiIsIF9fZnVuY19fLAorCQkJb2hfbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKG9oLT5vZCA/IFBUUl9FUlIob2gtPm9kKSA6IC1FTk9ERVYpOworCX0KKworCWlmIChJU19FUlJfT1JfTlVMTChvaC0+b2QtPnBkZXYpKQorCQlyZXR1cm4gRVJSX1BUUihvaC0+b2QtPnBkZXYgPyBQVFJfRVJSKG9oLT5vZC0+cGRldikgOiAtRU5PREVWKTsKKworCXJldHVybiAmb2gtPm9kLT5wZGV2LT5kZXY7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGV2aWNlX2dldF9ieV9od21vZF9uYW1lKTsKKwogLyoKICAqIFB1YmxpYyBmdW5jdGlvbnMgaW50ZW5kZWQgZm9yIHVzZSBpbiBvbWFwX2RldmljZV9wbV9sYXRlbmN5CiAgKiAuYWN0aXZhdGVfZnVuYyBhbmQgLmRlYWN0aXZhdGVfZnVuYyBmdW5jdGlvbiBwb2ludGVycwpAQCAtOTE3LDggKzExMzUsMTMgQEAKIAkucGFyZW50ICAgICAgICAgPSAmcGxhdGZvcm1fYnVzLAogfTsKIAorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwbGF0Zm9ybV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IF9vbWFwX2RldmljZV9ub3RpZmllcl9jYWxsLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgb21hcF9kZXZpY2VfaW5pdCh2b2lkKQogeworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZwbGF0Zm9ybV9uYik7CiAJcmV0dXJuIGRldmljZV9yZWdpc3Rlcigmb21hcF9kZXZpY2VfcGFyZW50KTsKIH0KIGNvcmVfaW5pdGNhbGwob21hcF9kZXZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYwppbmRleCAzNjNjOTFlLi44YjI4NjY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vbWFwZmIuaD4KIAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjksMTAgKzI4LDggQEAKICNpbmNsdWRlIDxwbGF0L3NyYW0uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLmg+CiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KLSNpbmNsdWRlIDxwbGF0L3ZyYW0uaD4KIAogI2luY2x1ZGUgInNyYW0uaCIKLSNpbmNsdWRlICJmYi5oIgogCiAvKiBYWFggVGhlc2UgInNpZGV3YXlzIiBpbmNsdWRlcyBhcmUgYSBzaWduIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nICovCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKQEAgLTQxLDE2ICszOCw5IEBACiAjZW5kaWYKIAogI2RlZmluZSBPTUFQMV9TUkFNX1BBCQkweDIwMDAwMDAwCi0jZGVmaW5lIE9NQVAxX1NSQU1fVkEJCVZNQUxMT0NfRU5ECiAjZGVmaW5lIE9NQVAyX1NSQU1fUFVCX1BBCShPTUFQMl9TUkFNX1BBICsgMHhmODAwKQotI2RlZmluZSBPTUFQMl9TUkFNX1ZBCQkweGZlNDAwMDAwCi0jZGVmaW5lIE9NQVAyX1NSQU1fUFVCX1ZBCShPTUFQMl9TUkFNX1ZBICsgMHg4MDApCi0jZGVmaW5lIE9NQVAzX1NSQU1fVkEgICAgICAgICAgIDB4ZmU0MDAwMDAKICNkZWZpbmUgT01BUDNfU1JBTV9QVUJfUEEgICAgICAgKE9NQVAzX1NSQU1fUEEgKyAweDgwMDApCi0jZGVmaW5lIE9NQVAzX1NSQU1fUFVCX1ZBICAgICAgIChPTUFQM19TUkFNX1ZBICsgMHg4MDAwKQotI2RlZmluZSBPTUFQNF9TUkFNX1ZBCQkweGZlNDAwMDAwCiAjZGVmaW5lIE9NQVA0X1NSQU1fUFVCX1BBCShPTUFQNF9TUkFNX1BBICsgMHg0MDAwKQotI2RlZmluZSBPTUFQNF9TUkFNX1BVQl9WQQkoT01BUDRfU1JBTV9WQSArIDB4NDAwMCkKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDJQTFVTKQogI2RlZmluZSBTUkFNX0JPT1RMT0FERVJfU1oJMHgwMApAQCAtNzMsOSArNjMsOSBAQAogI2RlZmluZSBST1VORF9ET1dOKHZhbHVlLGJvdW5kYXJ5KQkoKHZhbHVlKSAmICh+KChib3VuZGFyeSktMSkpKQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm9tYXBfc3JhbV9iYXNlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX3NpemU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fY2VpbDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm9tYXBfc3JhbV9jZWlsOwogCiAvKgogICogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgUkFNRlMgZmlyZXdhbGwgc2V0dXAsIHRoZSBwdWJsaWMgdXNhYmxlIGFtb3VudCBvZgpAQCAtMTEyLDEyICsxMDIsOSBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9kZXRlY3Rfc3JhbSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Ci0KIAlpZiAoY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKIAkJaWYgKGlzX3NyYW1fbG9ja2VkKCkpIHsKIAkJCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQkJCW9tYXBfc3JhbV9iYXNlID0gT01BUDNfU1JBTV9QVUJfVkE7CiAJCQkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDNfU1JBTV9QVUJfUEE7CiAJCQkJaWYgKChvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9FTVUpIHx8CiAJCQkJICAgIChvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9TRUMpKSB7CkBAIC0xMjYsMjUgKzExMywyMCBAQAogCQkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4ODAwMDsgLyogMzJLICovCiAJCQkJfQogCQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQkJCW9tYXBfc3JhbV9iYXNlID0gT01BUDRfU1JBTV9QVUJfVkE7CiAJCQkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDRfU1JBTV9QVUJfUEE7CiAJCQkJb21hcF9zcmFtX3NpemUgPSAweGEwMDA7IC8qIDQwSyAqLwogCQkJfSBlbHNlIHsKLQkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVAyX1NSQU1fUFVCX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAyX1NSQU1fUFVCX1BBOwogCQkJCW9tYXBfc3JhbV9zaXplID0gMHg4MDA7IC8qIDJLICovCiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJCQlvbWFwX3NyYW1fYmFzZSA9IE9NQVAzX1NSQU1fVkE7CiAJCQkJb21hcF9zcmFtX3N0YXJ0ID0gT01BUDNfU1JBTV9QQTsKIAkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4MTAwMDA7IC8qIDY0SyAqLwogCQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDQ0eHgoKSkgewotCQkJCW9tYXBfc3JhbV9iYXNlID0gT01BUDRfU1JBTV9WQTsKIAkJCQlvbWFwX3NyYW1fc3RhcnQgPSBPTUFQNF9TUkFNX1BBOwogCQkJCW9tYXBfc3JhbV9zaXplID0gMHhlMDAwOyAvKiA1NksgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQMl9TUkFNX1ZBOwogCQkJCW9tYXBfc3JhbV9zdGFydCA9IE9NQVAyX1NSQU1fUEE7CiAJCQkJaWYgKGNwdV9pc19vbWFwMjQyeCgpKQogCQkJCQlvbWFwX3NyYW1fc2l6ZSA9IDB4YTAwMDA7IC8qIDY0MEsgKi8KQEAgLTE1Myw3ICsxMzUsNiBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJb21hcF9zcmFtX2Jhc2UgPSBPTUFQMV9TUkFNX1ZBOwogCQlvbWFwX3NyYW1fc3RhcnQgPSBPTUFQMV9TUkFNX1BBOwogCiAJCWlmIChjcHVfaXNfb21hcDd4eCgpKQpAQCAtMTcwLDM1ICsxNTEsMTQgQEAKIAkJCW9tYXBfc3JhbV9zaXplID0gMHg0MDAwOwogCQl9CiAJfQotCXJlc2VydmVkID0gb21hcGZiX3Jlc2VydmVfc3JhbShvbWFwX3NyYW1fc3RhcnQsIG9tYXBfc3JhbV9iYXNlLAotCQkJCSAgICAgICBvbWFwX3NyYW1fc2l6ZSwKLQkJCQkgICAgICAgb21hcF9zcmFtX3N0YXJ0ICsgU1JBTV9CT09UTE9BREVSX1NaLAotCQkJCSAgICAgICBvbWFwX3NyYW1fc2l6ZSAtIFNSQU1fQk9PVExPQURFUl9TWik7Ci0Jb21hcF9zcmFtX3NpemUgLT0gcmVzZXJ2ZWQ7Ci0KLQlyZXNlcnZlZCA9IG9tYXBfdnJhbV9yZXNlcnZlX3NyYW0ob21hcF9zcmFtX3N0YXJ0LCBvbWFwX3NyYW1fYmFzZSwKLQkJCW9tYXBfc3JhbV9zaXplLAotCQkJb21hcF9zcmFtX3N0YXJ0ICsgU1JBTV9CT09UTE9BREVSX1NaLAotCQkJb21hcF9zcmFtX3NpemUgLSBTUkFNX0JPT1RMT0FERVJfU1opOwotCW9tYXBfc3JhbV9zaXplIC09IHJlc2VydmVkOwotCi0Jb21hcF9zcmFtX2NlaWwgPSBvbWFwX3NyYW1fYmFzZSArIG9tYXBfc3JhbV9zaXplOwogfQogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfc3JhbV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7CS8qIC5sZW5ndGggZ2V0cyBmaWxsZWQgaW4gYXQgcnVudGltZSAqLwotCQkudmlydHVhbAk9IE9NQVAxX1NSQU1fVkEsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihPTUFQMV9TUkFNX1BBKSwKLQkJLnR5cGUJCT0gTVRfTUVNT1JZCi0JfQotfTsKLQogLyoKICAqIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIGlvcmVtYXAgZm9yIFNSQU0sIGFzIGNsb2NrIGluaXQgbmVlZHMgU1JBTSBlYXJseS4KICAqLwogc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbWFwX3NyYW0odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGJhc2U7CisJaW50IGNhY2hlZCA9IDE7CiAKIAlpZiAob21hcF9zcmFtX3NpemUgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMjExLDI4ICsxNzEsMTggQEAKIAkJICogdGhlIEFSTSBtYXkgYXR0ZW1wdCB0byB3cml0ZSBjYWNoZSBsaW5lcyBiYWNrIHRvIFNEUkFNCiAJCSAqIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHN5c3RlbSB0byBoYW5nLgogCQkgKi8KLQkJb21hcF9zcmFtX2lvX2Rlc2NbMF0udHlwZSA9IE1UX01FTU9SWV9OT05DQUNIRUQ7CisJCWNhY2hlZCA9IDA7CiAJfQogCi0Jb21hcF9zcmFtX2lvX2Rlc2NbMF0udmlydHVhbCA9IG9tYXBfc3JhbV9iYXNlOwotCWJhc2UgPSBvbWFwX3NyYW1fc3RhcnQ7Ci0JYmFzZSA9IFJPVU5EX0RPV04oYmFzZSwgUEFHRV9TSVpFKTsKLQlvbWFwX3NyYW1faW9fZGVzY1swXS5wZm4gPSBfX3BoeXNfdG9fcGZuKGJhc2UpOwotCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCA9IFJPVU5EX0RPV04ob21hcF9zcmFtX3NpemUsIFBBR0VfU0laRSk7Ci0JaW90YWJsZV9pbml0KG9tYXBfc3JhbV9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfc3JhbV9pb19kZXNjKSk7CisJb21hcF9zcmFtX3N0YXJ0ID0gUk9VTkRfRE9XTihvbWFwX3NyYW1fc3RhcnQsIFBBR0VfU0laRSk7CisJb21hcF9zcmFtX2Jhc2UgPSBfX2FybV9pb3JlbWFwX2V4ZWMob21hcF9zcmFtX3N0YXJ0LCBvbWFwX3NyYW1fc2l6ZSwKKwkJCQkJCWNhY2hlZCk7CisJaWYgKCFvbWFwX3NyYW1fYmFzZSkgeworCQlwcl9lcnIoIlNSQU06IENvdWxkIG5vdCBtYXBcbiIpOworCQlyZXR1cm47CisJfQogCi0JcHJfaW5mbygiU1JBTTogTWFwcGVkIHBhIDB4JTA4bGx4IHRvIHZhIDB4JTA4bHggc2l6ZTogMHglbHhcbiIsCi0JCShsb25nIGxvbmcpIF9fcGZuX3RvX3BoeXMob21hcF9zcmFtX2lvX2Rlc2NbMF0ucGZuKSwKLQkJb21hcF9zcmFtX2lvX2Rlc2NbMF0udmlydHVhbCwKLQkJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoKTsKLQotCS8qCi0JICogTm9ybWFsbHkgZGV2aWNlbWFwc19pbml0KCkgd291bGQgZmx1c2ggY2FjaGVzIGFuZCB0bGIgYWZ0ZXIKLQkgKiBtZGVzYy0+bWFwX2lvKCksIGJ1dCBzaW5jZSB3ZSdyZSBjYWxsZWQgZnJvbSBtYXBfaW8oKSwgd2UKLQkgKiBtdXN0IGRvIGl0IGhlcmUuCi0JICovCi0JbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwotCWZsdXNoX2NhY2hlX2FsbCgpOworCW9tYXBfc3JhbV9jZWlsID0gb21hcF9zcmFtX2Jhc2UgKyBvbWFwX3NyYW1fc2l6ZTsKIAogCS8qCiAJICogTG9va3MgbGlrZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHNvbWUgYm9vdGxvYWRlciBjb2RlIGF0IHRoZQpAQCAtMjUxLDEzICsyMDEsMTggQEAKICAqLwogdm9pZCAqb21hcF9zcmFtX3B1c2hfYWRkcmVzcyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JaWYgKHNpemUgPiAob21hcF9zcmFtX2NlaWwgLSAob21hcF9zcmFtX2Jhc2UgKyBTUkFNX0JPT1RMT0FERVJfU1opKSkgeworCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlLCBuZXdfY2VpbCA9ICh1bnNpZ25lZCBsb25nKW9tYXBfc3JhbV9jZWlsOworCisJYXZhaWxhYmxlID0gb21hcF9zcmFtX2NlaWwgLSAob21hcF9zcmFtX2Jhc2UgKyBTUkFNX0JPT1RMT0FERVJfU1opOworCisJaWYgKHNpemUgPiBhdmFpbGFibGUpIHsKIAkJcHJfZXJyKCJOb3QgZW5vdWdoIHNwYWNlIGluIFNSQU1cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlvbWFwX3NyYW1fY2VpbCAtPSBzaXplOwotCW9tYXBfc3JhbV9jZWlsID0gUk9VTkRfRE9XTihvbWFwX3NyYW1fY2VpbCwgRk5DUFlfQUxJR04pOworCW5ld19jZWlsIC09IHNpemU7CisJbmV3X2NlaWwgPSBST1VORF9ET1dOKG5ld19jZWlsLCBGTkNQWV9BTElHTik7CisJb21hcF9zcmFtX2NlaWwgPSBJT01FTShuZXdfY2VpbCk7CiAKIAlyZXR1cm4gKHZvaWQgKilvbWFwX3NyYW1fY2VpbDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2dwaW8uaCBiL2FyY2gvYXJtL3BsYXQtb3Jpb24vaW5jbHVkZS9wbGF0L2dwaW8uaAppbmRleCAzMDc1YjlmLi4zYWJmMzA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9yaW9uL2luY2x1ZGUvcGxhdC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9pbmNsdWRlL3BsYXQvZ3Bpby5oCkBAIC0xMiwxNSArMTIsNyBAQAogI2RlZmluZSBfX1BMQVRfR1BJT19ICiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgotCi0vKgotICogR0VORVJJQ19HUElPIHByaW1pdGl2ZXMuCi0gKi8KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUgIF9fZ3Bpb19nZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19zZXRfdmFsdWUgIF9fZ3Bpb19zZXRfdmFsdWUKLSNkZWZpbmUgZ3Bpb19jYW5zbGVlcCAgIF9fZ3Bpb19jYW5zbGVlcAotI2RlZmluZSBncGlvX3RvX2lycSAgICAgX19ncGlvX3RvX2lycQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qCiAgKiBPcmlvbi1zcGVjaWZpYyBHUElPIEFQSSBleHRlbnNpb25zLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXB4YS9NYWtlZmlsZQppbmRleCAzYWNhNWJhLi5mMzAyZDA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LXB4YS9NYWtlZmlsZQpAQCAtNCw3ICs0LDYgQEAKIAogb2JqLXkJOj0gZG1hLm8KIAotb2JqLSQoQ09ORklHX0dFTkVSSUNfR1BJTykJKz0gZ3Bpby5vCiBvYmotJChDT05GSUdfUFhBM3h4KQkJKz0gbWZwLm8KIG9iai0kKENPTkZJR19QWEE5NXgpCQkrPSBtZnAubwogb2JqLSQoQ09ORklHX0FSQ0hfTU1QKQkJKz0gbWZwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtcHhhL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExZGMzNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKLSAqCi0gKiAgR2VuZXJpYyBQWEEgR1BJTyBoYW5kbGluZwotICoKLSAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKLSAqICBDcmVhdGVkOglKdW4gMTUsIDIwMDEKLSAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0KLWludCBweGFfbGFzdF9ncGlvOwotCi1zdHJ1Y3QgcHhhX2dwaW9fY2hpcCB7Ci0Jc3RydWN0IGdwaW9fY2hpcCBjaGlwOwotCXZvaWQgX19pb21lbQkqcmVnYmFzZTsKLQljaGFyIGxhYmVsWzEwXTsKLQotCXVuc2lnbmVkIGxvbmcJaXJxX21hc2s7Ci0JdW5zaWduZWQgbG9uZwlpcnFfZWRnZV9yaXNlOwotCXVuc2lnbmVkIGxvbmcJaXJxX2VkZ2VfZmFsbDsKLQotI2lmZGVmIENPTkZJR19QTQotCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ3BscjsKLQl1bnNpZ25lZCBsb25nCXNhdmVkX2dwZHI7Ci0JdW5zaWduZWQgbG9uZwlzYXZlZF9ncmVyOwotCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ2ZlcjsKLSNlbmRpZgotfTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhncGlvX2xvY2spOwotc3RhdGljIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpweGFfZ3Bpb19jaGlwczsKLQotI2RlZmluZSBmb3JfZWFjaF9ncGlvX2NoaXAoaSwgYykJCQlcCi0JZm9yIChpID0gMCwgYyA9ICZweGFfZ3Bpb19jaGlwc1swXTsgaSA8PSBweGFfbGFzdF9ncGlvOyBpICs9IDMyLCBjKyspCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpncGlvX2NoaXBfYmFzZShzdHJ1Y3QgZ3Bpb19jaGlwICpjKQotewotCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IHB4YV9ncGlvX2NoaXAsIGNoaXApLT5yZWdiYXNlOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpncGlvX3RvX3B4YWNoaXAodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gJnB4YV9ncGlvX2NoaXBzW2dwaW9fdG9fYmFuayhncGlvKV07Ci19Ci0KLXN0YXRpYyBpbnQgcHhhX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBncGlvX2NoaXBfYmFzZShjaGlwKTsKLQl1aW50MzJfdCB2YWx1ZSwgbWFzayA9IDEgPDwgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0KLQl2YWx1ZSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUERSX09GRlNFVCk7Ci0JaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChjaGlwLT5iYXNlICsgb2Zmc2V0KSkKLQkJdmFsdWUgfD0gbWFzazsKLQllbHNlCi0JCXZhbHVlICY9IH5tYXNrOwotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYmFzZSArIEdQRFJfT0ZGU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB4YV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9IGdwaW9fY2hpcF9iYXNlKGNoaXApOwotCXVpbnQzMl90IHRtcCwgbWFzayA9IDEgPDwgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlfX3Jhd193cml0ZWwobWFzaywgYmFzZSArICh2YWx1ZSA/IEdQU1JfT0ZGU0VUIDogR1BDUl9PRkZTRVQpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQotCXRtcCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUERSX09GRlNFVCk7Ci0JaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChjaGlwLT5iYXNlICsgb2Zmc2V0KSkKLQkJdG1wICY9IH5tYXNrOwotCWVsc2UKLQkJdG1wIHw9IG1hc2s7Ci0JX19yYXdfd3JpdGVsKHRtcCwgYmFzZSArIEdQRFJfT0ZGU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB4YV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIF9fcmF3X3JlYWRsKGdwaW9fY2hpcF9iYXNlKGNoaXApICsgR1BMUl9PRkZTRVQpICYgKDEgPDwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgcHhhX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCV9fcmF3X3dyaXRlbCgxIDw8IG9mZnNldCwgZ3Bpb19jaGlwX2Jhc2UoY2hpcCkgKwotCQkJCSh2YWx1ZSA/IEdQU1JfT0ZGU0VUIDogR1BDUl9PRkZTRVQpKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHhhX2luaXRfZ3Bpb19jaGlwKGludCBncGlvX2VuZCkKLXsKLQlpbnQgaSwgZ3BpbywgbmJhbmtzID0gZ3Bpb190b19iYW5rKGdwaW9fZW5kKSArIDE7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmNoaXBzOwotCi0JY2hpcHMgPSBremFsbG9jKG5iYW5rcyAqIHNpemVvZihzdHJ1Y3QgcHhhX2dwaW9fY2hpcCksIEdGUF9LRVJORUwpOwotCWlmIChjaGlwcyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBHUElPIGNoaXBzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZvciAoaSA9IDAsIGdwaW8gPSAwOyBpIDwgbmJhbmtzOyBpKyssIGdwaW8gKz0gMzIpIHsKLQkJc3RydWN0IGdwaW9fY2hpcCAqYyA9ICZjaGlwc1tpXS5jaGlwOwotCi0JCXNwcmludGYoY2hpcHNbaV0ubGFiZWwsICJncGlvLSVkIiwgaSk7Ci0JCWNoaXBzW2ldLnJlZ2Jhc2UgPSAodm9pZCBfX2lvbWVtICopR1BJT19CQU5LKGkpOwotCi0JCWMtPmJhc2UgID0gZ3BpbzsKLQkJYy0+bGFiZWwgPSBjaGlwc1tpXS5sYWJlbDsKLQotCQljLT5kaXJlY3Rpb25faW5wdXQgID0gcHhhX2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCQljLT5kaXJlY3Rpb25fb3V0cHV0ID0gcHhhX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQkJYy0+Z2V0ID0gcHhhX2dwaW9fZ2V0OwotCQljLT5zZXQgPSBweGFfZ3Bpb19zZXQ7Ci0KLQkJLyogbnVtYmVyIG9mIEdQSU9zIG9uIGxhc3QgYmFuayBtYXkgYmUgbGVzcyB0aGFuIDMyICovCi0JCWMtPm5ncGlvID0gKGdwaW8gKyAzMSA+IGdwaW9fZW5kKSA/IChncGlvX2VuZCAtIGdwaW8gKyAxKSA6IDMyOwotCQlncGlvY2hpcF9hZGQoYyk7Ci0JfQotCXB4YV9ncGlvX2NoaXBzID0gY2hpcHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFVwZGF0ZSBvbmx5IHRob3NlIEdSRVJ4IGFuZCBHRkVSeCBlZGdlIGRldGVjdGlvbiByZWdpc3RlciBiaXRzIGlmIHRob3NlCi0gKiBiaXRzIGFyZSBzZXQgaW4gYy0+aXJxX21hc2sKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9lZGdlX2RldGVjdChzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYykKLXsKLQl1aW50MzJfdCBncmVyLCBnZmVyOwotCi0JZ3JlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCkgJiB+Yy0+aXJxX21hc2s7Ci0JZ2ZlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCkgJiB+Yy0+aXJxX21hc2s7Ci0JZ3JlciB8PSBjLT5pcnFfZWRnZV9yaXNlICYgYy0+aXJxX21hc2s7Ci0JZ2ZlciB8PSBjLT5pcnFfZWRnZV9mYWxsICYgYy0+aXJxX21hc2s7Ci0JX19yYXdfd3JpdGVsKGdyZXIsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7Ci0JX19yYXdfd3JpdGVsKGdmZXIsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyBpbnQgcHhhX2dwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKLQlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBncGRyLCBtYXNrID0gR1BJT19iaXQoZ3Bpbyk7Ci0KLQljID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwotCi0JaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKLQkJLyogRG9uJ3QgbWVzcyB3aXRoIGVuYWJsZWQgR1BJT3MgdXNpbmcgcHJlY29uZmlndXJlZCBlZGdlcyBvcgotCQkgKiBHUElPcyBzZXQgdG8gYWx0ZXJuYXRlIGZ1bmN0aW9uIG9yIHRvIG91dHB1dCBkdXJpbmcgcHJvYmUKLQkJICovCi0JCWlmICgoYy0+aXJxX2VkZ2VfcmlzZSB8IGMtPmlycV9lZGdlX2ZhbGwpICYgR1BJT19iaXQoZ3BpbykpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoX19ncGlvX2lzX29jY3VwaWVkKGdwaW8pKQotCQkJcmV0dXJuIDA7Ci0KLQkJdHlwZSA9IElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HOwotCX0KLQotCWdwZHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOwotCi0JaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChncGlvKSkKLQkJX19yYXdfd3JpdGVsKGdwZHIgfCBtYXNrLCAgYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKLQllbHNlCi0JCV9fcmF3X3dyaXRlbChncGRyICYgfm1hc2ssIGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7Ci0KLQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQljLT5pcnFfZWRnZV9yaXNlIHw9IG1hc2s7Ci0JZWxzZQotCQljLT5pcnFfZWRnZV9yaXNlICY9IH5tYXNrOwotCi0JaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCi0JCWMtPmlycV9lZGdlX2ZhbGwgfD0gbWFzazsKLQllbHNlCi0JCWMtPmlycV9lZGdlX2ZhbGwgJj0gfm1hc2s7Ci0KLQl1cGRhdGVfZWRnZV9kZXRlY3QoYyk7Ci0KLQlwcl9kZWJ1ZygiJXM6IElSUSVkIChHUElPJWQpIC0gZWRnZSVzJXNcbiIsIF9fZnVuY19fLCBkLT5pcnEsIGdwaW8sCi0JCSgodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKSAgPyAiIHJpc2luZyIgIDogIiIpLAotCQkoKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpID8gIiBmYWxsaW5nIiA6ICIiKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB4YV9ncGlvX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOwotCWludCBsb29wLCBncGlvLCBncGlvX2Jhc2UsIG47Ci0JdW5zaWduZWQgbG9uZyBnZWRyOwotCi0JZG8gewotCQlsb29wID0gMDsKLQkJZm9yX2VhY2hfZ3Bpb19jaGlwKGdwaW8sIGMpIHsKLQkJCWdwaW9fYmFzZSA9IGMtPmNoaXAuYmFzZTsKLQotCQkJZ2VkciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Ci0JCQlnZWRyID0gZ2VkciAmIGMtPmlycV9tYXNrOwotCQkJX19yYXdfd3JpdGVsKGdlZHIsIGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Ci0KLQkJCW4gPSBmaW5kX2ZpcnN0X2JpdCgmZ2VkciwgQklUU19QRVJfTE9ORyk7Ci0JCQl3aGlsZSAobiA8IEJJVFNfUEVSX0xPTkcpIHsKLQkJCQlsb29wID0gMTsKLQotCQkJCWdlbmVyaWNfaGFuZGxlX2lycShncGlvX3RvX2lycShncGlvX2Jhc2UgKyBuKSk7Ci0JCQkJbiA9IGZpbmRfbmV4dF9iaXQoJmdlZHIsIEJJVFNfUEVSX0xPTkcsIG4gKyAxKTsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKGxvb3ApOwotfQotCi1zdGF0aWMgdm9pZCBweGFfYWNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQotewotCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKLQotCV9fcmF3X3dyaXRlbChHUElPX2JpdChncGlvKSwgYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgcHhhX21hc2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOwotCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOwotCXVpbnQzMl90IGdyZXIsIGdmZXI7Ci0KLQljLT5pcnFfbWFzayAmPSB+R1BJT19iaXQoZ3Bpbyk7Ci0KLQlncmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKSAmIH5HUElPX2JpdChncGlvKTsKLQlnZmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKSAmIH5HUElPX2JpdChncGlvKTsKLQlfX3Jhd193cml0ZWwoZ3JlciwgYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKLQlfX3Jhd193cml0ZWwoZ2ZlciwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgcHhhX3VubWFza19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7Ci0KLQljLT5pcnFfbWFzayB8PSBHUElPX2JpdChncGlvKTsKLQl1cGRhdGVfZWRnZV9kZXRlY3QoYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcHhhX211eGVkX2dwaW9fY2hpcCA9IHsKLQkubmFtZQkJPSAiR1BJTyIsCi0JLmlycV9hY2sJPSBweGFfYWNrX211eGVkX2dwaW8sCi0JLmlycV9tYXNrCT0gcHhhX21hc2tfbXV4ZWRfZ3BpbywKLQkuaXJxX3VubWFzawk9IHB4YV91bm1hc2tfbXV4ZWRfZ3BpbywKLQkuaXJxX3NldF90eXBlCT0gcHhhX2dwaW9faXJxX3R5cGUsCi19OwotCi12b2lkIF9faW5pdCBweGFfaW5pdF9ncGlvKGludCBtdXhfaXJxLCBpbnQgc3RhcnQsIGludCBlbmQsIHNldF93YWtlX3QgZm4pCi17Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7Ci0JaW50IGdwaW8sIGlycTsKLQotCXB4YV9sYXN0X2dwaW8gPSBlbmQ7Ci0KLQkvKiBJbml0aWFsaXplIEdQSU8gY2hpcHMgKi8KLQlweGFfaW5pdF9ncGlvX2NoaXAoZW5kKTsKLQotCS8qIGNsZWFyIGFsbCBHUElPIGVkZ2UgZGV0ZWN0cyAqLwotCWZvcl9lYWNoX2dwaW9fY2hpcChncGlvLCBjKSB7Ci0JCV9fcmF3X3dyaXRlbCgwLCBjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOwotCQlfX3Jhd193cml0ZWwoMCwgYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKLQkJX19yYXdfd3JpdGVsKH4wLGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Ci0JfQotCi0JZm9yIChpcnEgID0gZ3Bpb190b19pcnEoc3RhcnQpOyBpcnEgPD0gZ3Bpb190b19pcnEoZW5kKTsgaXJxKyspIHsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJnB4YV9tdXhlZF9ncGlvX2NoaXAsCi0JCQkJCSBoYW5kbGVfZWRnZV9pcnEpOwotCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwotCX0KLQotCS8qIEluc3RhbGwgaGFuZGxlciBmb3IgR1BJTz49MiBlZGdlIGRldGVjdCBpbnRlcnJ1cHRzICovCi0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIobXV4X2lycSwgcHhhX2dwaW9fZGVtdXhfaGFuZGxlcik7Ci0JcHhhX211eGVkX2dwaW9fY2hpcC5pcnFfc2V0X3dha2UgPSBmbjsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBweGFfZ3Bpb19zdXNwZW5kKHZvaWQpCi17Ci0Jc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7Ci0JaW50IGdwaW87Ci0KLQlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgewotCQljLT5zYXZlZF9ncGxyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdQTFJfT0ZGU0VUKTsKLQkJYy0+c2F2ZWRfZ3BkciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7Ci0JCWMtPnNhdmVkX2dyZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOwotCQljLT5zYXZlZF9nZmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKLQotCQkvKiBDbGVhciBHUElPIHRyYW5zaXRpb24gZGV0ZWN0IGJpdHMgKi8KLQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGMtPnJlZ2Jhc2UgKyBHRURSX09GRlNFVCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBweGFfZ3Bpb19yZXN1bWUodm9pZCkKLXsKLQlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKLQlpbnQgZ3BpbzsKLQotCWZvcl9lYWNoX2dwaW9fY2hpcChncGlvLCBjKSB7Ci0JCS8qIHJlc3RvcmUgbGV2ZWwgd2l0aCBzZXQvY2xlYXIgKi8KLQkJX19yYXdfd3JpdGVsKCBjLT5zYXZlZF9ncGxyLCBjLT5yZWdiYXNlICsgR1BTUl9PRkZTRVQpOwotCQlfX3Jhd193cml0ZWwofmMtPnNhdmVkX2dwbHIsIGMtPnJlZ2Jhc2UgKyBHUENSX09GRlNFVCk7Ci0KLQkJX19yYXdfd3JpdGVsKGMtPnNhdmVkX2dyZXIsIGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7Ci0JCV9fcmF3X3dyaXRlbChjLT5zYXZlZF9nZmVyLCBjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOwotCQlfX3Jhd193cml0ZWwoYy0+c2F2ZWRfZ3BkciwgYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKLQl9Ci19Ci0jZWxzZQotI2RlZmluZSBweGFfZ3Bpb19zdXNwZW5kCU5VTEwKLSNkZWZpbmUgcHhhX2dwaW9fcmVzdW1lCQlOVUxMCi0jZW5kaWYKLQotc3RydWN0IHN5c2NvcmVfb3BzIHB4YV9ncGlvX3N5c2NvcmVfb3BzID0gewotCS5zdXNwZW5kCT0gcHhhX2dwaW9fc3VzcGVuZCwKLQkucmVzdW1lCQk9IHB4YV9ncGlvX3Jlc3VtZSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby1weGEuaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9ncGlvLXB4YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzkwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby1weGEuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fUExBVF9QWEFfR1BJT19ICisjZGVmaW5lIF9fUExBVF9QWEFfR1BJT19ICisKK3N0cnVjdCBpcnFfZGF0YTsKKworLyoKKyAqIFdlIGhhbmRsZSB0aGUgR1BJT3MgYnkgYmFua3MsIGVhY2ggYmFuayBjb3ZlcnMgdXAgdG8gMzIgR1BJT3Mgd2l0aAorICogb25lIHNldCBvZiByZWdpc3RlcnMuIFRoZSByZWdpc3RlciBvZmZzZXRzIGFyZSBvcmdhbml6ZWQgYmVsb3c6CisgKgorICogICAgICAgICAgIEdQTFIgICAgR1BEUiAgICBHUFNSICAgIEdQQ1IgICAgR1JFUiAgICBHRkVSICAgIEdFRFIKKyAqIEJBTksgMCAtIDB4MDAwMCAgMHgwMDBDICAweDAwMTggIDB4MDAyNCAgMHgwMDMwICAweDAwM0MgIDB4MDA0OAorICogQkFOSyAxIC0gMHgwMDA0ICAweDAwMTAgIDB4MDAxQyAgMHgwMDI4ICAweDAwMzQgIDB4MDA0MCAgMHgwMDRDCisgKiBCQU5LIDIgLSAweDAwMDggIDB4MDAxNCAgMHgwMDIwICAweDAwMkMgIDB4MDAzOCAgMHgwMDQ0ICAweDAwNTAKKyAqCisgKiBCQU5LIDMgLSAweDAxMDAgIDB4MDEwQyAgMHgwMTE4ICAweDAxMjQgIDB4MDEzMCAgMHgwMTNDICAweDAxNDgKKyAqIEJBTksgNCAtIDB4MDEwNCAgMHgwMTEwICAweDAxMUMgIDB4MDEyOCAgMHgwMTM0ICAweDAxNDAgIDB4MDE0QworICogQkFOSyA1IC0gMHgwMTA4ICAweDAxMTQgIDB4MDEyMCAgMHgwMTJDICAweDAxMzggIDB4MDE0NCAgMHgwMTUwCisgKgorICogTk9URToKKyAqICAgQkFOSyAzIGlzIG9ubHkgYXZhaWxhYmxlIG9uIFBYQTI3eCBhbmQgbGF0ZXIgcHJvY2Vzc29ycy4KKyAqICAgQkFOSyA0IGFuZCA1IGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBQWEE5MzUKKyAqLworCisjZGVmaW5lIEdQSU9fQkFOSyhuKQkoR1BJT19SRUdTX1ZJUlQgKyBCQU5LX09GRihuKSkKKworI2RlZmluZSBHUExSX09GRlNFVAkweDAwCisjZGVmaW5lIEdQRFJfT0ZGU0VUCTB4MEMKKyNkZWZpbmUgR1BTUl9PRkZTRVQJMHgxOAorI2RlZmluZSBHUENSX09GRlNFVAkweDI0CisjZGVmaW5lIEdSRVJfT0ZGU0VUCTB4MzAKKyNkZWZpbmUgR0ZFUl9PRkZTRVQJMHgzQworI2RlZmluZSBHRURSX09GRlNFVAkweDQ4CisKKy8qIE5PVEU6IHNvbWUgUFhBcyBoYXZlIGZld2VyIG9uLWNoaXAgR1BJT3MgKGxpa2UgUFhBMjU1LCB3aXRoIDg1KS4KKyAqIFRob3NlIGNhc2VzIGN1cnJlbnRseSBjYXVzZSBob2xlcyBpbiB0aGUgR1BJTyBudW1iZXIgc3BhY2UsIHRoZQorICogYWN0dWFsIG51bWJlciBvZiB0aGUgbGFzdCBHUElPIGlzIHJlY29yZGVkIGJ5ICdweGFfbGFzdF9ncGlvJy4KKyAqLworZXh0ZXJuIGludCBweGFfbGFzdF9ncGlvOworCit0eXBlZGVmIGludCAoKnNldF93YWtlX3QpKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKTsKKworZXh0ZXJuIHZvaWQgcHhhX2luaXRfZ3BpbyhpbnQgbXV4X2lycSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBzZXRfd2FrZV90IGZuKTsKKworI2VuZGlmIC8qIF9fUExBVF9QWEFfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby5oIGIvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L2dwaW8uaAppbmRleCAxZGRkMmI5Li4yNThmNzcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9ncGlvLmgKQEAgLTEsMzUgKzEsMTAgQEAKICNpZm5kZWYgX19QTEFUX0dQSU9fSAogI2RlZmluZSBfX1BMQVRfR1BJT19ICiAKLXN0cnVjdCBpcnFfZGF0YTsKKyNkZWZpbmUgX19BUk1fR1BJT0xJQl9DT01QTEVYCiAKLS8qCi0gKiBXZSBoYW5kbGUgdGhlIEdQSU9zIGJ5IGJhbmtzLCBlYWNoIGJhbmsgY292ZXJzIHVwIHRvIDMyIEdQSU9zIHdpdGgKLSAqIG9uZSBzZXQgb2YgcmVnaXN0ZXJzLiBUaGUgcmVnaXN0ZXIgb2Zmc2V0cyBhcmUgb3JnYW5pemVkIGJlbG93OgotICoKLSAqICAgICAgICAgICBHUExSICAgIEdQRFIgICAgR1BTUiAgICBHUENSICAgIEdSRVIgICAgR0ZFUiAgICBHRURSCi0gKiBCQU5LIDAgLSAweDAwMDAgIDB4MDAwQyAgMHgwMDE4ICAweDAwMjQgIDB4MDAzMCAgMHgwMDNDICAweDAwNDgKLSAqIEJBTksgMSAtIDB4MDAwNCAgMHgwMDEwICAweDAwMUMgIDB4MDAyOCAgMHgwMDM0ICAweDAwNDAgIDB4MDA0QwotICogQkFOSyAyIC0gMHgwMDA4ICAweDAwMTQgIDB4MDAyMCAgMHgwMDJDICAweDAwMzggIDB4MDA0NCAgMHgwMDUwCi0gKgotICogQkFOSyAzIC0gMHgwMTAwICAweDAxMEMgIDB4MDExOCAgMHgwMTI0ICAweDAxMzAgIDB4MDEzQyAgMHgwMTQ4Ci0gKiBCQU5LIDQgLSAweDAxMDQgIDB4MDExMCAgMHgwMTFDICAweDAxMjggIDB4MDEzNCAgMHgwMTQwICAweDAxNEMKLSAqIEJBTksgNSAtIDB4MDEwOCAgMHgwMTE0ICAweDAxMjAgIDB4MDEyQyAgMHgwMTM4ICAweDAxNDQgIDB4MDE1MAotICoKLSAqIE5PVEU6Ci0gKiAgIEJBTksgMyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBQWEEyN3ggYW5kIGxhdGVyIHByb2Nlc3NvcnMuCi0gKiAgIEJBTksgNCBhbmQgNSBhcmUgb25seSBhdmFpbGFibGUgb24gUFhBOTM1Ci0gKi8KLQotI2RlZmluZSBHUElPX0JBTksobikJKEdQSU9fUkVHU19WSVJUICsgQkFOS19PRkYobikpCi0KLSNkZWZpbmUgR1BMUl9PRkZTRVQJMHgwMAotI2RlZmluZSBHUERSX09GRlNFVAkweDBDCi0jZGVmaW5lIEdQU1JfT0ZGU0VUCTB4MTgKLSNkZWZpbmUgR1BDUl9PRkZTRVQJMHgyNAotI2RlZmluZSBHUkVSX09GRlNFVAkweDMwCi0jZGVmaW5lIEdGRVJfT0ZGU0VUCTB4M0MKLSNkZWZpbmUgR0VEUl9PRkZTRVQJMHg0OAorLyogVGhlIGluZGl2aWR1YWwgbWFjaGluZSBwcm92aWRlcyByZWdpc3RlciBvZmZzZXRzIGFuZCBOUl9CVUlMVElOX0dQSU8gKi8KKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCiB7CkBAIC01MiwxMyArMjcsNCBAQAogCiAjZGVmaW5lIGdwaW9fY2Fuc2xlZXAJCV9fZ3Bpb19jYW5zbGVlcAogCi0vKiBOT1RFOiBzb21lIFBYQXMgaGF2ZSBmZXdlciBvbi1jaGlwIEdQSU9zIChsaWtlIFBYQTI1NSwgd2l0aCA4NSkuCi0gKiBUaG9zZSBjYXNlcyBjdXJyZW50bHkgY2F1c2UgaG9sZXMgaW4gdGhlIEdQSU8gbnVtYmVyIHNwYWNlLCB0aGUKLSAqIGFjdHVhbCBudW1iZXIgb2YgdGhlIGxhc3QgR1BJTyBpcyByZWNvcmRlZCBieSAncHhhX2xhc3RfZ3BpbycuCi0gKi8KLWV4dGVybiBpbnQgcHhhX2xhc3RfZ3BpbzsKLQotdHlwZWRlZiBpbnQgKCpzZXRfd2FrZV90KShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbik7Ci0KLWV4dGVybiB2b2lkIHB4YV9pbml0X2dwaW8oaW50IG11eF9pcnEsIGludCBzdGFydCwgaW50IGVuZCwgc2V0X3dha2VfdCBmbik7CiAjZW5kaWYgLyogX19QTEFUX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L21mcC5oIGIvYXJjaC9hcm0vcGxhdC1weGEvaW5jbHVkZS9wbGF0L21mcC5oCmluZGV4IDg5ZTY4ZTAuLjVjNzljMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9tZnAuaAorKysgYi9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvbWZwLmgKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiAjZGVmaW5lIE1GUF9BRERSX0VORAl7IE1GUF9QSU5fSU5WQUxJRCwgMCB9CiAKLXZvaWQgX19pbml0IG1mcF9pbml0X2Jhc2UodW5zaWduZWQgbG9uZyBtZnByX2Jhc2UpOwordm9pZCBfX2luaXQgbWZwX2luaXRfYmFzZSh2b2lkIF9faW9tZW0gKm1mcHJfYmFzZSk7CiB2b2lkIF9faW5pdCBtZnBfaW5pdF9hZGRyKHN0cnVjdCBtZnBfYWRkcl9tYXAgKm1hcCk7CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXB4YS9pbmNsdWRlL3BsYXQvcHhhM3h4X25hbmQuaCBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9weGEzeHhfbmFuZC5oCmluZGV4IDQ0MjMwMWYuLmM0MmYzOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9weGEzeHhfbmFuZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtcHhhL2luY2x1ZGUvcGxhdC9weGEzeHhfbmFuZC5oCkBAIC00MSw2ICs0MSwxOSBAQAogCXN0cnVjdCBweGEzeHhfbmFuZF90aW1pbmcgKnRpbWluZzsJLyogTkFORCBGbGFzaCB0aW1pbmcgKi8KIH07CiAKKy8qCisgKiBDdXJyZW50IHB4YTN4eF9uYW5kIGNvbnRyb2xsZXIgaGFzIHR3byBjaGlwIHNlbGVjdCB3aGljaAorICogYm90aCBiZSB3b3JrYWJsZS4KKyAqCisgKiBOb3RpY2Ugc2hvdWxkIGJlIHRha2VuIHRoYXQ6CisgKiBXaGVuIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBzaG91bGQgbm90IGVuYWJsZSB0aGUKKyAqIGtlZXAgY29uZmlndXJhdGlvbiBmZWF0dXJlLCBmb3IgdHdvIGNoaXAgc2VsZWN0IGNvdWxkIGJlCisgKiBhdHRhY2hlZCB3aXRoIGRpZmZlcmVudCBuYW5kIGNoaXAuIFRoZSBkaWZmZXJlbnQgcGFnZSBzaXplCisgKiBhbmQgdGltaW5nIHJlcXVpcmVtZW50IG1ha2UgdGhlIGtlZXAgY29uZmlndXJhdGlvbiBpbXBvc3NpYmxlLgorICovCisKKy8qIFRoZSBtYXggbnVtIG9mIGNoaXAgc2VsZWN0IGN1cnJlbnQgc3VwcG9ydCAqLworI2RlZmluZSBOVU1fQ0hJUF9TRUxFQ1QJCSgyKQogc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgewogCiAJLyogdGhlIGRhdGEgZmxhc2ggYnVzIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBTdGF0aWMgTWVtb3J5CkBAIC01Miw4ICs2NSwxMSBAQAogCS8qIGFsbG93IHBsYXRmb3JtIGNvZGUgdG8ga2VlcCBPQk0vYm9vdGxvYWRlciBkZWZpbmVkIE5GQyBjb25maWcgKi8KIAlpbnQJa2VlcF9jb25maWc7CiAKLQljb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkJKnBhcnRzOwotCXVuc2lnbmVkIGludAkJCQlucl9wYXJ0czsKKwkvKiBpbmRpY2F0ZSBob3cgbWFueSBjaGlwIHNlbGVjdHMgd2lsbCBiZSB1c2VkICovCisJaW50CW51bV9jczsKKworCWNvbnN0IHN0cnVjdCBtdGRfcGFydGl0aW9uCQkqcGFydHNbTlVNX0NISVBfU0VMRUNUXTsKKwl1bnNpZ25lZCBpbnQJCQkJbnJfcGFydHNbTlVNX0NISVBfU0VMRUNUXTsKIAogCWNvbnN0IHN0cnVjdCBweGEzeHhfbmFuZF9mbGFzaCAqIAlmbGFzaDsKIAlzaXplX3QJCQkJCW51bV9mbGFzaDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL21mcC5jIGIvYXJjaC9hcm0vcGxhdC1weGEvbWZwLmMKaW5kZXggYmUxMmVhZC4uMmM0ZGJiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvbWZwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvbWZwLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1mcF9zcGluX2xvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBfX2luaXQgbWZwX2luaXRfYmFzZSh1bnNpZ25lZCBsb25nIG1mcHJfYmFzZSkKK3ZvaWQgX19pbml0IG1mcF9pbml0X2Jhc2Uodm9pZCBfX2lvbWVtICptZnByX2Jhc2UpCiB7CiAJaW50IGk7CiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1mcF90YWJsZSk7IGkrKykKIAkJbWZwX3RhYmxlW2ldLmNvbmZpZyA9IC0xOwogCi0JbWZwcl9tbWlvX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopbWZwcl9iYXNlOworCW1mcHJfbW1pb19iYXNlID0gbWZwcl9iYXNlOwogfQogCiB2b2lkIF9faW5pdCBtZnBfaW5pdF9hZGRyKHN0cnVjdCBtZnBfYWRkcl9tYXAgKm1hcCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L0tjb25maWcKaW5kZXggOGM1YjMwMi4uZDg5NzNhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L0tjb25maWcKQEAgLTksNyArOSw2IEBACiAJc2VsZWN0IE5PX0lPUE9SVAogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBTM0NfREVWX05BTkQKLQlzZWxlY3QgUzNDX0dQSU9fQ0ZHX1MzQzI0WFgKIAloZWxwCiAJICBCYXNlIHBsYXRmb3JtIGNvZGUgZm9yIGFueSBTYW1zdW5nIFMzQzI0WFggZGV2aWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9NYWtlZmlsZQppbmRleCAwMjkxYmQ2Li5iMmIwMTEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L01ha2VmaWxlCkBAIC0xNCw5ICsxNCw3IEBACiAKIG9iai15CQkJCSs9IGNwdS5vCiBvYmoteQkJCQkrPSBpcnEubwotb2JqLXkJCQkJKz0gZGV2cy5vCi1vYmoteQkJCQkrPSBncGlvLm8KLW9iai15CQkJCSs9IGdwaW9saWIubworb2JqLXkJCQkJKz0gZGV2LXVhcnQubwogb2JqLXkJCQkJKz0gY2xvY2subwogb2JqLSQoQ09ORklHX1MzQzI0WFhfRENMSykJKz0gY2xvY2stZGNsay5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUuYwppbmRleCBjMWZjNmM2Li4zYzYzMzUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS5jCkBAIC0yMTUsMTkgKzIxNSwxOCBAQAogCiB2b2lkIF9faW5pdCBzM2MyNHh4X2luaXRfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgaWRjb2RlID0gMHgwOwotCiAJLyogaW5pdGlhbGlzZSB0aGUgaW8gZGVzY3JpcHRvcnMgd2UgbmVlZCBmb3IgaW5pdGlhbGlzYXRpb24gKi8KIAlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBzaXplKTsKIAlpb3RhYmxlX2luaXQoczNjX2lvZGVzYywgQVJSQVlfU0laRShzM2NfaW9kZXNjKSk7CiAKIAlpZiAoY3B1X2FyY2hpdGVjdHVyZSgpID49IENQVV9BUkNIX0FSTXY1KSB7Ci0JCWlkY29kZSA9IHMzYzI0eHhfcmVhZF9pZGNvZGVfdjUoKTsKKwkJc2Ftc3VuZ19jcHVfaWQgPSBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y1KCk7CiAJfSBlbHNlIHsKLQkJaWRjb2RlID0gczNjMjR4eF9yZWFkX2lkY29kZV92NCgpOworCQlzYW1zdW5nX2NwdV9pZCA9IHMzYzI0eHhfcmVhZF9pZGNvZGVfdjQoKTsKIAl9CisJczNjMjR4eF9pbml0X2NwdSgpOwogCiAJYXJtX3BtX3Jlc3RhcnQgPSBzM2MyNHh4X3BtX3Jlc3RhcnQ7CiAKLQlzM2NfaW5pdF9jcHUoaWRjb2RlLCBjcHVfaWRzLCBBUlJBWV9TSVpFKGNwdV9pZHMpKTsKKwlzM2NfaW5pdF9jcHUoc2Ftc3VuZ19jcHVfaWQsIGNwdV9pZHMsIEFSUkFZX1NJWkUoY3B1X2lkcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Rldi11YXJ0LmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2LXVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWIyMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2Rldi11YXJ0LmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXYtdWFydC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEJhc2UgUzNDMjRYWCBVQVJUIHJlc291cmNlIGFuZCBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2RldnMuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3Mtc2VyaWFsLmg+CisKKy8qIFNlcmlhbCBwb3J0IHJlZ2lzdHJhdGlvbnMgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQwLAorCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQwICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgwLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzI0MTBfdWFydDFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDEsCisJCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDEgKyAweDNmZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDEsCisJCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjMjQxMF91YXJ0Ml9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VQVJUMiwKKwkJLmVuZCAgID0gUzNDMjQxMF9QQV9VQVJUMiArIDB4M2ZmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMiwKKwkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQzX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTM0MyNDQzX1BBX1VBUlQzLAorCQkuZW5kICAgPSBTM0MyNDQzX1BBX1VBUlQzICsgMHgzZmZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgzLAorCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIzLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RydWN0IHMzYzI0eHhfdWFydF9yZXNvdXJjZXMgczNjMjQxMF91YXJ0X3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7CisJWzBdID0geworCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0MF9yZXNvdXJjZSwKKwkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0MF9yZXNvdXJjZSksCisJfSwKKwlbMV0gPSB7CisJCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQxX3Jlc291cmNlLAorCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQxX3Jlc291cmNlKSwKKwl9LAorCVsyXSA9IHsKKwkJLnJlc291cmNlcwk9IHMzYzI0MTBfdWFydDJfcmVzb3VyY2UsCisJCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzI0MTBfdWFydDJfcmVzb3VyY2UpLAorCX0sCisJWzNdID0geworCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0M19yZXNvdXJjZSwKKwkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0M19yZXNvdXJjZSksCisJfSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2YmYyZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogQmFzZSBTM0MyNFhYIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2ZiLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvZG1hLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgotI2luY2x1ZGUgPHBsYXQvdWRjLmg+Ci0jaW5jbHVkZSA8cGxhdC9tY2kuaD4KLQotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgotI2luY2x1ZGUgPHBsYXQvdHMuaD4KLQotLyogU2VyaWFsIHBvcnQgcmVnaXN0cmF0aW9ucyAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzI0MTBfdWFydDBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0MTBfUEFfVUFSVDAsCi0JCS5lbmQgICA9IFMzQzI0MTBfUEFfVUFSVDAgKyAweDNmZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDAsCi0JCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjAsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjMjQxMF91YXJ0MV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjQxMF9QQV9VQVJUMSwKLQkJLmVuZCAgID0gUzNDMjQxMF9QQV9VQVJUMSArIDB4M2ZmZiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9TM0NVQVJUX1JYMSwKLQkJLmVuZCAgID0gSVJRX1MzQ1VBUlRfRVJSMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2MyNDEwX3VhcnQyX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNDEwX1BBX1VBUlQyLAotCQkuZW5kICAgPSBTM0MyNDEwX1BBX1VBUlQyICsgMHgzZmZmLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1MzQ1VBUlRfUlgyLAotCQkuZW5kICAgPSBJUlFfUzNDVUFSVF9FUlIyLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzI0MTBfdWFydDNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0NDNfUEFfVUFSVDMsCi0JCS5lbmQgICA9IFMzQzI0NDNfUEFfVUFSVDMgKyAweDNmZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfUzNDVUFSVF9SWDMsCi0JCS5lbmQgICA9IElSUV9TM0NVQVJUX0VSUjMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgczNjMjR4eF91YXJ0X3Jlc291cmNlcyBzM2MyNDEwX3VhcnRfcmVzb3VyY2VzW10gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7Ci0JCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQwX3Jlc291cmNlLAotCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQwX3Jlc291cmNlKSwKLQl9LAotCVsxXSA9IHsKLQkJLnJlc291cmNlcwk9IHMzYzI0MTBfdWFydDFfcmVzb3VyY2UsCi0JCS5ucl9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzI0MTBfdWFydDFfcmVzb3VyY2UpLAotCX0sCi0JWzJdID0gewotCQkucmVzb3VyY2VzCT0gczNjMjQxMF91YXJ0Ml9yZXNvdXJjZSwKLQkJLm5yX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjMjQxMF91YXJ0Ml9yZXNvdXJjZSksCi0JfSwKLQlbM10gPSB7Ci0JCS5yZXNvdXJjZXMJPSBzM2MyNDEwX3VhcnQzX3Jlc291cmNlLAotCQkubnJfcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2MyNDEwX3VhcnQzX3Jlc291cmNlKSwKLQl9LAotfTsKLQotLyogTENEIENvbnRyb2xsZXIgKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfbGNkX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX0xDRCwKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9MQ0QgKyBTM0MyNFhYX1NaX0xDRCAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfTENELAotCQkuZW5kICAgPSBJUlFfTENELAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9sY2RfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2xjZCA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLWxjZCIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2xjZF9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfbGNkX3Jlc291cmNlLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sJCT0gJnMzY19kZXZpY2VfbGNkX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmZVTAotCX0KLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9sY2QpOwotCi12b2lkIF9faW5pdCBzM2MyNHh4X2ZiX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gKm5wZDsKLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqbnBkKSwgJnMzY19kZXZpY2VfbGNkKTsKLQlpZiAobnBkKSB7Ci0JCW5wZC0+ZGlzcGxheXMgPSBrbWVtZHVwKHBkLT5kaXNwbGF5cywKLQkJCXNpemVvZihzdHJ1Y3QgczNjMjQxMGZiX2Rpc3BsYXkpICogbnBkLT5udW1fZGlzcGxheXMsCi0JCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFucGQtPmRpc3BsYXlzKQotCQkJcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yIExDRCBkaXNwbGF5IGRhdGFcbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm8gbWVtb3J5IGZvciBMQ0QgcGxhdGZvcm0gZGF0YVxuIik7Ci0JfQotfQotCi0vKiBUb3VjaHNjcmVlbiAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY190c19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9BREMsCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfQURDICsgUzNDMjRYWF9TWl9BREMgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1RDLAotCQkuZW5kICAgPSBJUlFfVEMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90cyA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLXRzIiwKLQkuaWQJCSAgPSAtMSwKLQkuZGV2LnBhcmVudAk9ICZzM2NfZGV2aWNlX2FkYy5kZXYsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3RzX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY190c19yZXNvdXJjZSwKLX07Ci1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfdHMpOwotCi12b2lkIF9faW5pdCBzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKmhhcmRfczNjMjQxMHRzX2luZm8pCi17Ci0JczNjX3NldF9wbGF0ZGF0YShoYXJkX3MzYzI0MTB0c19pbmZvLAotCQkJIHNpemVvZihzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8pLCAmczNjX2RldmljZV90cyk7Ci19Ci0KLS8qIFVTQiBEZXZpY2UgKEdhZGdldCkqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191c2JnYWRnZXRfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfVVNCREVWLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX1VTQkRFViArIFMzQzI0WFhfU1pfVVNCREVWIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9VU0JELAotCQkuZW5kICAgPSBJUlFfVVNCRCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiZ2FkZ2V0ID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtdXNiZ2FkZ2V0IiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfdXNiZ2FkZ2V0X3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY191c2JnYWRnZXRfcmVzb3VyY2UsCi19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfdXNiZ2FkZ2V0KTsKLQotdm9pZCBfX2luaXQgczNjMjR4eF91ZGNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3VkY19tYWNoX2luZm8gKnBkKQotewotCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZigqcGQpLCAmczNjX2RldmljZV91c2JnYWRnZXQpOwotfQotCi0vKiBVU0IgSGlnaCBTcGVlZCAyLjAgRGV2aWNlIChHYWRnZXQpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc3VkY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDMjQxNl9QQV9IU1VEQywKLQkJLmVuZAk9IFMzQzI0MTZfUEFfSFNVREMgKyBTM0MyNDE2X1NaX0hTVURDIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9VU0JELAotCQkuZW5kCT0gSVJRX1VTQkQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2hzdWRjX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiX2hzdWRjID0gewotCS5uYW1lCQk9ICJzM2MtaHN1ZGMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzdWRjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaHN1ZGNfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmczNjX2hzdWRjX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07Ci0KLXZvaWQgX19pbml0IHMzYzI0eHhfaHN1ZGNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhICpwZCkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2YoKnBkKSwgJnMzY19kZXZpY2VfdXNiX2hzdWRjKTsKLX0KLQotLyogSUlTICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2lpc19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9JSVMsCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfSUlTICsgUzNDMjRYWF9TWl9JSVMgLTEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9paXNfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2lpcyA9IHsKLQkubmFtZQkJICA9ICJzM2MyNHh4LWlpcyIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2lpc19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfaWlzX3Jlc291cmNlLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9paXNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX2lpcyk7Ci0KLS8qIFJUQyAqLwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19ydGNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfUlRDLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX1JUQyArIDB4ZmYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfUlRDLAotCQkuZW5kICAgPSBJUlFfUlRDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1RJQ0ssCi0JCS5lbmQgICA9IElSUV9USUNLLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9ydGMgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1ydGMiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19ydGNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX3J0Y19yZXNvdXJjZSwKLX07Ci0KLUVYUE9SVF9TWU1CT0woczNjX2RldmljZV9ydGMpOwotCi0vKiBBREMgKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfYWRjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0MyNFhYX1BBX0FEQywKLQkJLmVuZCAgID0gUzNDMjRYWF9QQV9BREMgKyBTM0MyNFhYX1NaX0FEQyAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfVEMsCi0JCS5lbmQgICA9IElSUV9UQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydCA9IElSUV9BREMsCi0JCS5lbmQgICA9IElSUV9BREMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2FkYyA9IHsKLQkubmFtZQkJICA9ICJzM2MyNHh4LWFkYyIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2FkY19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfYWRjX3Jlc291cmNlLAotfTsKLQotLyogU0RJICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3NkaV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDMjRYWF9QQV9TREksCi0JCS5lbmQgICA9IFMzQzI0WFhfUEFfU0RJICsgUzNDMjRYWF9TWl9TREkgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1NESSwKLQkJLmVuZCAgID0gSVJRX1NESSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc2RpID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtc2RpIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2Nfc2RpX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19zZGlfcmVzb3VyY2UsCi19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2Vfc2RpKTsKLQotdm9pZCBfX2luaXQgczNjMjR4eF9tY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSAqcGRhdGEpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZGF0YSwgc2l6ZW9mKHN0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSksCi0JCQkgJnMzY19kZXZpY2Vfc2RpKTsKLX0KLQotCi0vKiBTUEkgKDApICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3NwaTBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfU1BJLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX1NQSSArIDB4MWYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfU1BJMCwKLQkJLmVuZCAgID0gSVJRX1NQSTAsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX3NwaTBfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NwaTAgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1zcGkiLAotCS5pZAkJICA9IDAsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3NwaTBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX3NwaTBfcmVzb3VyY2UsCi0gICAgICAgIC5kZXYgICAgICAgICAgICAgID0gewotICAgICAgICAgICAgICAgIC5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX3NwaTBfZG1hbWFzaywKLSAgICAgICAgICAgICAgICAuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLSAgICAgICAgfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3NwaTApOwotCi0vKiBTUEkgKDEpICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3NwaTFfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0WFhfUEFfU1BJICsgUzNDMjQxMF9TUEkxLAotCQkuZW5kICAgPSBTM0MyNFhYX1BBX1NQSSArIFMzQzI0MTBfU1BJMSArIDB4MWYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfU1BJMSwKLQkJLmVuZCAgID0gSVJRX1NQSTEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX3NwaTFfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NwaTEgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1zcGkiLAotCS5pZAkJICA9IDEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX3NwaTFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX3NwaTFfcmVzb3VyY2UsCi0gICAgICAgIC5kZXYgICAgICAgICAgICAgID0gewotICAgICAgICAgICAgICAgIC5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX3NwaTFfZG1hbWFzaywKLSAgICAgICAgICAgICAgICAuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLSAgICAgICAgfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3NwaTEpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCi0KLS8qIENhbWlmIENvbnRyb2xsZXIgKi8KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfY2FtaWZfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0NDBfUEFfQ0FNSUYsCi0JCS5lbmQgICA9IFMzQzI0NDBfUEFfQ0FNSUYgKyBTM0MyNDQwX1NaX0NBTUlGIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9DQU0sCi0JCS5lbmQgICA9IElSUV9DQU0sCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLQotfTsKLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX2NhbWlmX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9jYW1pZiA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDQwLWNhbWlmIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfY2FtaWZfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2NhbWlmX3Jlc291cmNlLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9jYW1pZl9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfY2FtaWYpOwotCi0vKiBBQzk3ICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FjOTdfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQzI0NDBfUEFfQUM5NywKLQkJLmVuZCAgID0gUzNDMjQ0MF9QQV9BQzk3ICsgUzNDMjQ0MF9TWl9BQzk3IC0xLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX1MzQzI0NHhfQUM5NywKLQkJLmVuZCAgID0gSVJRX1MzQzI0NHhfQUM5NywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5uYW1lICA9ICJQQ00gb3V0IiwKLQkJLnN0YXJ0ID0gRE1BQ0hfUENNX09VVCwKLQkJLmVuZCAgID0gRE1BQ0hfUENNX09VVCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCi0JfSwKLQlbM10gPSB7Ci0JCS5uYW1lICA9ICJQQ00gaW4iLAotCQkuc3RhcnQgPSBETUFDSF9QQ01fSU4sCi0JCS5lbmQgICA9IERNQUNIX1BDTV9JTiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCi0JfSwKLQlbNF0gPSB7Ci0JCS5uYW1lICA9ICJNaWMgaW4iLAotCQkuc3RhcnQgPSBETUFDSF9NSUNfSU4sCi0JCS5lbmQgICA9IERNQUNIX01JQ19JTiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9hdWRpb19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWM5NyA9IHsKLQkubmFtZQkJICA9ICJzYW1zdW5nLWFjOTciLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19hYzk3X3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19hYzk3X3Jlc291cmNlLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9hdWRpb19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfYWM5Nyk7Ci0KLS8qIEFTb0MgSTJTICovCi0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjMjQxMl9kZXZpY2VfaWlzID0gewotCS5uYW1lCQkgID0gInMzYzI0MTItaWlzIiwKLQkuaWQJCSAgPSAtMSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJnMzY19kZXZpY2VfYXVkaW9fZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCi0JfQotfTsKLQotRVhQT1JUX1NZTUJPTChzM2MyNDEyX2RldmljZV9paXMpOwotCi0jZW5kaWYgLy8gQ09ORklHX0NQVV9TMzI0NDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwppbmRleCA1MzliZDBlLi41Mzc1NGJjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kbWEuYwpAQCAtMTA5NCwxNCArMTA5NCwxNCBAQAogICoKICAqIGNvbmZpZ3VyZSB0aGUgZG1hIHNvdXJjZS9kZXN0aW5hdGlvbiBoYXJkd2FyZSB0eXBlIGFuZCBhZGRyZXNzCiAgKgotICogc291cmNlOiAgICBTM0MyNDEwX0RNQVNSQ19IVzogc291cmNlIGlzIGhhcmR3YXJlCi0gKiAgICAgICAgICAgIFMzQzI0MTBfRE1BU1JDX01FTTogc291cmNlIGlzIG1lbW9yeQorICogc291cmNlOiAgICBETUFfRlJPTV9ERVZJQ0U6IHNvdXJjZSBpcyBoYXJkd2FyZQorICogICAgICAgICAgICBETUFfVE9fREVWSUNFOiBzb3VyY2UgaXMgbWVtb3J5CiAgKgogICogZGV2YWRkcjogICBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzb3VyY2UKICovCiAKIGludCBzM2MyNDEwX2RtYV9kZXZjb25maWcoZW51bSBkbWFfY2ggY2hhbm5lbCwKLQkJCSAgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCisJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHNvdXJjZSwKIAkJCSAgdW5zaWduZWQgbG9uZyBkZXZhZGRyKQogewogCXN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFuID0gczNjX2RtYV9sb29rdXBfY2hhbm5lbChjaGFubmVsKTsKQEAgLTExMzEsNyArMTEzMSw3IEBACiAJIGh3Y2ZnIHw9IFMzQzI0MTBfRElTUkNDX0lOQzsKIAogCXN3aXRjaCAoc291cmNlKSB7Ci0JY2FzZSBTM0MyNDEwX0RNQVNSQ19IVzoKKwljYXNlIERNQV9GUk9NX0RFVklDRToKIAkJLyogc291cmNlIGlzIGhhcmR3YXJlICovCiAJCXByX2RlYnVnKCIlczogaHcgc291cmNlLCBkZXZhZGRyPSUwOGx4LCBod2NmZz0lZFxuIiwKIAkJCSBfX2Z1bmNfXywgZGV2YWRkciwgaHdjZmcpOwpAQCAtMTE0Miw3ICsxMTQyLDcgQEAKIAkJY2hhbi0+YWRkcl9yZWcgPSBkbWFfcmVnYWRkcihjaGFuLCBTM0MyNDEwX0RNQV9ESURTVCk7CiAJCWJyZWFrOwogCi0JY2FzZSBTM0MyNDEwX0RNQVNSQ19NRU06CisJY2FzZSBETUFfVE9fREVWSUNFOgogCQkvKiBzb3VyY2UgaXMgbWVtb3J5ICovCiAJCXByX2RlYnVnKCIlczogbWVtIHNvdXJjZSwgZGV2YWRkcj0lMDhseCwgaHdjZmc9JWRcbiIsCiAJCQkgX19mdW5jX18sIGRldmFkZHIsIGh3Y2ZnKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjNkN2MwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpby5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMTAgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDMjRYWCBHUElPIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby1mbnMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLQotLyogZ3Bpb2xpYiB3cmFwcGVycyB1bnRpbCB0aGVzZSBhcmUgdG90YWxseSBlbGltaW5hdGVkICovCi0KLXZvaWQgczNjMjQxMF9ncGlvX3B1bGx1cCh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pCi17Ci0JaW50IHJldDsKLQotCVdBUk5fT04odG8pOwkvKiBzaG91bGQgYmUgbm9uZSBvZiB0aGVzZSBsZWZ0ICovCi0KLQlpZiAoIXRvKSB7Ci0JCS8qIGlmIHB1bGwgaXMgZW5hYmxlZCwgdHJ5IGZpcnN0IHdpdGggdXAsIGFuZCBpZiB0aGF0Ci0JCSAqIGZhaWxzLCB0cnkgdXNpbmcgZG93biAqLwotCi0JCXJldCA9IHMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX1VQKTsKLQkJaWYgKHJldCkKLQkJCXMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX0RPV04pOwotCX0gZWxzZSB7Ci0JCXMzY19ncGlvX3NldHB1bGwocGluLCBTM0NfR1BJT19QVUxMX05PTkUpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX3B1bGx1cCk7Ci0KLXZvaWQgczNjMjQxMF9ncGlvX3NldHBpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pCi17Ci0JLyogZG8gdGhpcyB2aWEgZ3Bpb2xpYiB1bnRpbCBhbGwgdXNlcnMgcmVtb3ZlZCAqLwotCi0JZ3Bpb19yZXF1ZXN0KHBpbiwgInRlbXBvcmFyeSIpOwotCWdwaW9fc2V0X3ZhbHVlKHBpbiwgdG8pOwotCWdwaW9fZnJlZShwaW4pOwotfQotCi1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19zZXRwaW4pOwotCi11bnNpZ25lZCBpbnQgczNjMjQxMF9ncGlvX2dldHBpbih1bnNpZ25lZCBpbnQgcGluKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGxvbmcgb2ZmcyA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKLQotCXJldHVybiBfX3Jhd19yZWFkbChjaGlwLT5iYXNlICsgMHgwNCkgJiAoMTw8IG9mZnMpOwotfQotCi1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19nZXRwaW4pOwotCi11bnNpZ25lZCBpbnQgczNjMjQxMF9tb2RpZnlfbWlzY2NyKHVuc2lnbmVkIGludCBjbGVhciwgdW5zaWduZWQgaW50IGNoYW5nZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbWlzY2NyOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW1pc2NjciA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfTUlTQ0NSKTsKLQltaXNjY3IgJj0gfmNsZWFyOwotCW1pc2NjciBePSBjaGFuZ2U7Ci0JX19yYXdfd3JpdGVsKG1pc2NjciwgUzNDMjRYWF9NSVNDQ1IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiBtaXNjY3I7Ci19Ci0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9tb2RpZnlfbWlzY2NyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNiNjQxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFNpbXRlYyBFbGVjdHJvbmljcwotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBTM0MyNFhYIEdQSU9saWIgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPHBsYXQvcG0uaD4KLQotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmthX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfYmFua2Ffb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCXVuc2lnbmVkIGxvbmcgY29uOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JY29uID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOwotCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDA0KTsKLQotCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKLQlpZiAodmFsdWUpCi0JCWRhdCB8PSAxIDw8IG9mZnNldDsKLQotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKLQotCWNvbiAmPSB+KDEgPDwgb2Zmc2V0KTsKLQotCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmtmX3RvaXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlpZiAob2Zmc2V0IDwgNCkKLQkJcmV0dXJuIElSUV9FSU5UMCArIG9mZnNldDsKLQkKLQlpZiAob2Zmc2V0IDwgOCkKLQkJcmV0dXJuIElSUV9FSU5UNCArIG9mZnNldCAtIDQ7Ci0JCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2ZnIHMzYzI0eHhfZ3Bpb2NmZ19iYW5rYSA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4X2EsCi0JLmdldF9jb25maWcJPSBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eF9hLAotfTsKLQotc3RydWN0IHMzY19ncGlvX2NmZyBzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4LAotCS5nZXRfY29uZmlnCT0gczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgsCi19OwotCi1zdHJ1Y3QgczNjX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW10gPSB7Ci0JWzBdID0gewotCQkuYmFzZQk9IFMzQzI0MTBfR1BBQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzFiaXQpLAotCQkuY29uZmlnCT0gJnMzYzI0eHhfZ3Bpb2NmZ19iYW5rYSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQkJCT0gUzNDMjQxMF9HUEEoMCksCi0JCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCQkJLmxhYmVsCQkJPSAiR1BJT0EiLAotCQkJLm5ncGlvCQkJPSAyNCwKLQkJCS5kaXJlY3Rpb25faW5wdXQJPSBzM2MyNHh4X2dwaW9saWJfYmFua2FfaW5wdXQsCi0JCQkuZGlyZWN0aW9uX291dHB1dAk9IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rYV9vdXRwdXQsCi0JCX0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUEJDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BCKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9CIiwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwKLQlbMl0gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUENDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BDKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9DIiwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwKLQlbM10gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUERDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BEKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9EIiwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwKLQlbNF0gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUEVDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BFKDApLAotCQkJLmxhYmVsCQkJPSAiR1BJT0UiLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwKLQlbNV0gPSB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUEZDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BGKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9GIiwKLQkJCS5uZ3BpbwkJCT0gOCwKLQkJCS50b19pcnEJCQk9IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rZl90b2lycSwKLQkJfSwKLQl9LAotCVs2XSA9IHsKLQkJLmJhc2UJPSBTM0MyNDEwX0dQR0NPTiwKLQkJLnBtCT0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8yYml0KSwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQ4LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQRygwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPRyIsCi0JCQkubmdwaW8JCQk9IDE2LAotCQkJLnRvX2lycQkJCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDMjQxMF9HUEhDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BIKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9IIiwKLQkJCS5uZ3BpbwkJCT0gMTEsCi0JCX0sCi0JfSwKLQkJLyogR1BJT1MgZm9yIHRoZSBTM0MyNDQzIGFuZCBsYXRlciBkZXZpY2VzLiAqLwotCXsKLQkJLmJhc2UJPSBTM0MyNDQwX0dQSkNPTiwKLQkJLnBtCT0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8yYml0KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQkJCT0gUzNDMjQxMF9HUEooMCksCi0JCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCQkJLmxhYmVsCQkJPSAiR1BJT0oiLAotCQkJLm5ncGlvCQkJPSAxNiwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gUzNDMjQ0M19HUEtDT04sCi0JCS5wbQk9IF9fZ3Bpb19wbSgmczNjX2dwaW9fcG1fMmJpdCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BLKDApLAotCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkJCS5sYWJlbAkJCT0gIkdQSU9LIiwKLQkJCS5uZ3BpbwkJCT0gMTYsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IFMzQzI0NDNfR1BMQ09OLAotCQkucG0JPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzJiaXQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCQkJPSBTM0MyNDEwX0dQTCgwKSwKLQkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCQkubGFiZWwJCQk9ICJHUElPTCIsCi0JCQkubmdwaW8JCQk9IDE1LAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSBTM0MyNDQzX0dQTUNPTiwKLQkJLnBtCT0gX19ncGlvX3BtKCZzM2NfZ3Bpb19wbV8yYml0KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQkJCT0gUzNDMjQxMF9HUE0oMCksCi0JCQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCQkJLmxhYmVsCQkJPSAiR1BJT00iLAotCQkJLm5ncGlvCQkJPSAyLAotCQl9LAotCX0sCi19OwotCi0KLXN0YXRpYyBfX2luaXQgaW50IHMzYzI0eHhfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzM2MyNHh4X2dwaW9zOwotCWludCBncG47Ci0KLQlmb3IgKGdwbiA9IDA7IGdwbiA8IEFSUkFZX1NJWkUoczNjMjR4eF9ncGlvcyk7IGdwbisrLCBjaGlwKyspIHsKLQkJaWYgKCFjaGlwLT5jb25maWcpCi0JCQljaGlwLT5jb25maWcgPSAmczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQ7Ci0KLQkJczNjX2dwaW9saWJfYWRkKGNoaXApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1jb3JlX2luaXRjYWxsKHMzYzI0eHhfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL2Nsa2Rldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZmYTgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL21hY2gvY2xrZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX0NMS0RFVl9IX18KLSNkZWZpbmUgX19NQUNIX0NMS0RFVl9IX18KLQotI2RlZmluZSBfX2Nsa19nZXQoY2xrKSAoeyAxOyB9KQotI2RlZmluZSBfX2Nsa19wdXQoY2xrKSBkbyB7fSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4N2RlMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9tYWNoL3B3bS1jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvbWFjaC9wd20tY2xvY2suaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDMjR4eCAtIHB3bSBjbG9jayBhbmQgdGltZXIgc3VwcG9ydAotICovCi0KLS8qKgotICogcHdtX2NmZ19zcmNfaXNfdGNsaygpIC0gcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG11eCBjb25maWcgaXMgYSB0Y2xrCi0gKiBAY2ZnOiBUaGUgdGltZXIgVENGRzEgcmVnaXN0ZXIgYml0cyBzaGlmdGVkIGRvd24gdG8gMC4KLSAqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmcm9tIFRDRkcxIGlzIGEgVENMSyBpbnN0ZWFkCi0gKiBhbnkgb2YgdGhlIFRESVYgY2xvY2tzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBwd21fY2ZnX3NyY19pc190Y2xrKHVuc2lnbmVkIGxvbmcgdGNmZykKLXsKLQlyZXR1cm4gdGNmZyA9PSBTM0MyNDEwX1RDRkcxX01VWF9UQ0xLOwotfQotCi0vKioKLSAqIHRjZmdfdG9fZGl2aXNvcigpIC0gY29udmVydCB0Y2ZnMSBzZXR0aW5nIHRvIGEgZGl2aXNvcgotICogQHRjZmcxOiBUaGUgdGNmZzEgc2V0dGluZywgc2hpZnRlZCBkb3duLgotICoKLSAqIEdldCB0aGUgZGl2aXNvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRjZmcxIHNldHRpbmcuIFdlIGFzc3VtZSB0aGUKLSAqIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRvIHNlZSBpZiB0aGlzIGlzIG5vdCBhIFRDTEsgc291cmNlLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGNmZ190b19kaXZpc29yKHVuc2lnbmVkIGxvbmcgdGNmZzEpCi17Ci0JcmV0dXJuIDEgPDwgKDEgKyB0Y2ZnMSk7Ci19Ci0KLS8qKgotICogcHdtX3RkaXZfaGFzX2RpdjEoKSAtIGRvZXMgdGhlIHRkaXYgc2V0dGluZyBoYXZlIGEgLzEKLSAqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIGEgLzEgaW4gdGhlIHRkaXYgc2V0dGluZy4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcHdtX3RkaXZfaGFzX2RpdjEodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBwd21fdGRpdl9kaXZfYml0cygpIC0gY2FsY3VsYXRlIFRDRkcxIGRpdmlzb3IgdmFsdWUuCi0gKiBAZGl2OiBUaGUgZGl2aXNvciB0byBjYWxjdWxhdGUgdGhlIGJpdCBpbmZvcm1hdGlvbiBmb3IuCi0gKgotICogVHVybiBhIGRpdmlzb3IgaW50byB0aGUgbmVjZXNzYXJ5IGJpdCBmaWVsZCBmb3IgVENGRzEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwd21fdGRpdl9kaXZfYml0cyh1bnNpZ25lZCBpbnQgZGl2KQotewotCXJldHVybiBpbG9nMihkaXYpIC0gMTsKLX0KLQotI2RlZmluZSBTM0NfVENGRzFfTVVYX1RDTEsgUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9hdWRpby1zaW10ZWMuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNWU4OGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9hdWRpby1zaW10ZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIGFyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBTaW10ZWMgQXVkaW8gc3VwcG9ydC4KLSovCi0KLS8qKgotICogc3RydWN0IHMzYzI0eHhfYXVkaW9fc2ltdGVjX3BkYXRhIC0gcGxhdGZvcm0gZGF0YSBmb3Igc2ltdGVjIGF1ZGlvCi0gKiBAdXNlX21wbGxpbjogU2VsZWN0IGNvZGVjIGNsb2NrIGZyb20gTVBMTGluCi0gKiBAb3V0cHV0X2NkY2xrOiBOZWVkIHRvIG91dHB1dCBDRENMSyB0byB0aGUgY29kZWMKLSAqIEBoYXZlX21pYzogU2V0IGlmIHdlIGhhdmUgYSBNSUMgc29ja2V0Ci0gKiBAaGF2ZV9sb3V0OiBTZXQgaWYgd2UgaGF2ZSBhIExpbmVPdXQgc29ja2V0Ci0gKiBAYW1wX2dwaW86IEdQSU8gcGluIHRvIGVuYWJsZSB0aGUgQU1QCi0gKiBAYW1wX2dhaW46IE9wdGlvbiBHUElPIHRvIGNvbnRyb2wgQU1QIGdhaW4KLSAqLwotc3RydWN0IHMzYzI0eHhfYXVkaW9fc2ltdGVjX3BkYXRhIHsKLQl1bnNpZ25lZCBpbnQJdXNlX21wbGxpbjoxOwotCXVuc2lnbmVkIGludAlvdXRwdXRfY2RjbGs6MTsKLQotCXVuc2lnbmVkIGludAloYXZlX21pYzoxOwotCXVuc2lnbmVkIGludAloYXZlX2xvdXQ6MTsKLQotCWludAkJYW1wX2dwaW87Ci0JaW50CQlhbXBfZ2FpblsyXTsKLQotCXZvaWQJKCpzdGFydHVwKSh2b2lkKTsKLX07Ci0KLWV4dGVybiBpbnQgc2ltdGVjX2F1ZGlvX2FkZChjb25zdCBjaGFyICpjb2RlY19uYW1lLCBib29sIGhhc19scl9yb3V0aW5nLAotCQkJICAgIHN0cnVjdCBzM2MyNHh4X2F1ZGlvX3NpbXRlY19wZGF0YSAqcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ5MDk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY29tbW9uLXNtZGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvY29tbW9uLXNtZGsuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBDb21tb24gY29kZSBmb3IgU01ESzI0MTAgYW5kIFNNREsyNDQwIGJvYXJkcwotICoKLSAqIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi9zbWRrMjQ0MC8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotZXh0ZXJuIHZvaWQgc21ka19tYWNoaW5lX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjIzMjM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qIGFyY2gvYXJtL3BsYXQtczNjL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIFMzQyBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgc3VwcG9ydCAtIGNvcmUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8cGxhdC9jcHUtZnJlcS5oPgotCi1zdHJ1Y3Qgc2VxX2ZpbGU7Ci0KLSNkZWZpbmUgTUFYX0JBTktTICg4KQotI2RlZmluZSBTM0MyNDEyX01BWF9JTwkoOCkKLQotLyoqCi0gKiBzdHJ1Y3QgczNjMjQxMF9pb2JhbmtfdGltaW5nIC0gSU8gYmFuayB0aW1pbmdzIGZvciBTM0MyNDEwIHN0eWxlIHRpbWluZ3MKLSAqIEBiYW5rY29uOiBUaGUgY2FjaGVkIHZlcnNpb24gb2Ygc2V0dGluZ3MgaW4gdGhpcyBzdHJ1Y3R1cmUuCi0gKiBAdGFjcDoKLSAqIEB0YWNzOiBUaW1lIGZyb20gYWRkcmVzcyB2YWxpZCB0byBuQ1MgYXNzZXJ0ZWQuCi0gKiBAdGNvczogVGltZSBmcm9tIG5DUyBhc3NlcnRlZCB0byBuT0Ugb3IgbldFIGFzc2VydGVkLgotICogQHRhY2M6IFRpbWUgdGhhdCBuT0Ugb3IgbldFIGlzIGFzc2VydGVkLgotICogQHRjb2g6IFRpbWUgbkNTIGlzIGhlbGQgYWZ0ZXIgbk9FIG9yIG5XRSBhcmUgcmVsZWFzZWQuCi0gKiBAdGNhaDogVGltZSBhZGRyZXNzIGlzIGhlbGQgZm9yIGFmdGVyCi0gKiBAbndhaXRfZW46IFdoZXRoZXIgbldBSVQgaXMgZW5hYmxlZCBmb3IgdGhpcyBiYW5rLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIElPIHRpbWluZ3MgZm9yIGEgUzNDMjQxMCBzdHlsZSBJTyBiYW5rCi0gKiB1c2VkIGJ5IHRoZSBDUFUgZnJlcXVlbmN5IHN1cHBvcnQgaWYgaXQgbmVlZHMgdG8gY2hhbmdlIHRoZSBzZXR0aW5ncwotICogb2YgdGhlIElPLgotICovCi1zdHJ1Y3QgczNjMjQxMF9pb2JhbmtfdGltaW5nIHsKLQl1bnNpZ25lZCBsb25nCWJhbmtjb247Ci0JdW5zaWduZWQgaW50CXRhY3A7Ci0JdW5zaWduZWQgaW50CXRhY3M7Ci0JdW5zaWduZWQgaW50CXRjb3M7Ci0JdW5zaWduZWQgaW50CXRhY2M7Ci0JdW5zaWduZWQgaW50CXRjb2g7CQkvKiBuQ1MgaG9sZCBhZnJlciBuT0UvbldFICovCi0JdW5zaWduZWQgaW50CXRjYWg7CQkvKiBBZGRyZXNzIGhvbGQgYWZ0ZXIgbkNTICovCi0JdW5zaWduZWQgY2hhcglud2FpdF9lbjsJLyogbldhaXQgZW5hYmxlZCBmb3IgYmFuay4gKi8KLX07Ci0KLS8qKgotICogc3RydWN0IHMzYzI0MTJfaW9iYW5rX3RpbWluZyAtIGlvIHRpbWluZ3MgZm9yIFBMMDkyIChTM0MyNDEyKSBzdHlsZSBJTwotICogQGlkY3k6IFRoZSBpZGxlIGN5Y2xlIHRpbWUgYmV0d2VlbiB0cmFuc2FjdGlvbnMuCi0gKiBAd3N0cmQ6IG5DUyByZWxlYXNlIHRvIGVuZCBvZiByZWFkIGN5Y2xlLgotICogQHdzdHdyOiBuQ1MgcmVsZWFzZSB0byBlbmQgb2Ygd3JpdGUgY3ljbGUuCi0gKiBAd3N0b2VuOiBuQ1MgYXNzZXJ0aW9uIHRvIG5PRSBhc3NlcnRpb24gdGltZS4KLSAqIEB3c3R3ZW46IG5DUyBhc3NlcnRpb24gdG8gbldFIGFzc2VydGlvbiB0aW1lLgotICogQHdzdGJyZDogQnVyc3QgcmVhZHkgZGVsYXkuCi0gKiBAc21iaWRjeXI6IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJpZGN5ciB2YWx1ZS4KLSAqIEBzbWJ3c3RyZDogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdHJkIHZhbHVlLgotICogQHNtYndzdHdyOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0d3IgdmFsdWUuCi0gKiBAc21id3N0b2VuOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0b2VuIHZhbHVlLgotICogQHNtYndzdHdlbjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdHdlbiB2YWx1ZS4KLSAqIEBzbWJ3c3RicmQ6IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3RicmQgdmFsdWUuCi0gKgotICogVGltaW5nIGluZm9ybWF0aW9uIGZvciBhIElPIGJhbmsgb24gYW4gUzNDMjQxMiBvciBzaW1pbGFyIHN5c3RlbSB3aGljaAotICogdXNlcyBhIFBMMDkzIGJsb2NrLgotICovCi1zdHJ1Y3QgczNjMjQxMl9pb2JhbmtfdGltaW5nIHsKLQl1bnNpZ25lZCBpbnQJaWRjeTsKLQl1bnNpZ25lZCBpbnQJd3N0cmQ7Ci0JdW5zaWduZWQgaW50CXdzdHdyOwotCXVuc2lnbmVkIGludAl3c3RvZW47Ci0JdW5zaWduZWQgaW50CXdzdHdlbjsKLQl1bnNpZ25lZCBpbnQJd3N0YnJkOwotCi0JLyogcmVnaXN0ZXIgY2FjaGUgKi8KLQl1bnNpZ25lZCBjaGFyCXNtYmlkY3lyOwotCXVuc2lnbmVkIGNoYXIJc21id3N0cmQ7Ci0JdW5zaWduZWQgY2hhcglzbWJ3c3R3cjsKLQl1bnNpZ25lZCBjaGFyCXNtYndzdG9lbjsKLQl1bnNpZ25lZCBjaGFyCXNtYndzdHdlbjsKLQl1bnNpZ25lZCBjaGFyCXNtYndzdGJyZDsKLX07Ci0KLXVuaW9uIHMzY19pb2JhbmsgewotCXN0cnVjdCBzM2MyNDEwX2lvYmFua190aW1pbmcJKmlvXzI0MTA7Ci0Jc3RydWN0IHMzYzI0MTJfaW9iYW5rX3RpbWluZwkqaW9fMjQxMjsKLX07Ci0KLS8qKgotICogc3RydWN0IHMzY19pb3RpbWluZ3MgLSBDaGlwIElPIHRpbWluZ3MgaG9sZGVyCi0gKiBAYmFuazogVGhlIHRpbWluZ3MgZm9yIGVhY2ggSU8gYmFuay4KLSAqLwotc3RydWN0IHMzY19pb3RpbWluZ3MgewotCXVuaW9uIHMzY19pb2JhbmsJYmFua1tNQVhfQkFOS1NdOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgczNjX3BsbHRhYiAtIFBMTCB0YWJsZSBpbmZvcm1hdGlvbi4KLSAqIEB2YWxzOiBMaXN0IG9mIFBMTCB2YWx1ZXMuCi0gKiBAc2l6ZTogU2l6ZSBvZiB0aGUgUExMIHRhYmxlIEB2YWxzLgotICovCi1zdHJ1Y3QgczNjX3BsbHRhYiB7Ci0Jc3RydWN0IHMzY19wbGx2YWwJKnZhbHM7Ci0JaW50CQkJIHNpemU7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgLSBjdXJyZW50IGNwdSBmcmVxdWVuY3kgY29uZmlndXJhdGlvbgotICogQGZyZXE6IFRoZSBjdXJyZW50IHNldHRpbmdzIGZvciB0aGUgY29yZSBjbG9ja3MuCi0gKiBAbWF4OiBNYXhpdW0gc2V0dGluZ3MsIGRlcml2ZWQgZnJvbSBjb3JlLCBib2FyZCBhbmQgdXNlciBzZXR0aW5ncy4KLSAqIEBwbGw6IFRoZSBQTEwgdGFibGUgZW50cnkgZm9yIHRoZSBjdXJyZW50IFBMTCBzZXR0aW5ncy4KLSAqIEBkaXZzOiBUaGUgZGl2aXNvciBzZXR0aW5ncyBmb3IgdGhlIGNvcmUgY2xvY2tzLgotICogQGluZm86IFRoZSBjdXJyZW50IGNvcmUgZHJpdmVyIGluZm9ybWF0aW9uLgotICogQGJvYXJkOiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBib2FyZCB3ZSBhcmUgcnVubmluZyBvbi4KLSAqIEBsb2NrX3BsbDogU2V0IGlmIHRoZSBQTEwgc2V0dGluZ3MgY2Fubm90IGJlIGNoYW5nZWQuCi0gKgotICogVGhpcyBpcyBmb3IgdGhlIGNvcmUgZHJpdmVycyB0aGF0IG5lZWQgdG8ga25vdyBpbmZvcm1hdGlvbiBhYm91dAotICogdGhlIGN1cnJlbnQgc2V0dGluZ3MgYW5kIHZhbHVlcy4gSXQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYnkgYW55Ci0gKiBkZXZpY2UgZHJpdmVycy4KLSovCi1zdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnIHsKLQlzdHJ1Y3QgczNjX2ZyZXEJCWZyZXE7Ci0Jc3RydWN0IHMzY19mcmVxCQltYXg7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHBsbDsKLQlzdHJ1Y3QgczNjX2Nsa2RpdnMJZGl2czsKLQlzdHJ1Y3QgczNjX2NwdWZyZXFfaW5mbyAqaW5mbzsJLyogZm9yIGNvcmUsIG5vdCBkcml2ZXJzICovCi0Jc3RydWN0IHMzY19jcHVmcmVxX2JvYXJkICpib2FyZDsKLQotCXVuc2lnbmVkIGludAlsb2NrX3BsbDoxOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgczNjX2NwdWZyZXFfaW5mbyAtIEluZm9ybWF0aW9uIGZvciB0aGUgQ1BVIGZyZXF1ZW5jeSBkcml2ZXIuCi0gKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBtYXg6IFRoZSBtYXhpbXVtIGZyZXF1ZW5jaWVzIGZvciB0aGUgc3lzdGVtLgotICogQGxhdGVuY3k6IFRyYW5zaXRpb24gbGF0ZW5jeSB0byBnaXZlIHRvIGNwdWZyZXEuCi0gKiBAbG9ja3RpbWVfbTogVGhlIGxvY2stdGltZSBpbiB1UyBmb3IgdGhlIE1QTEwuCi0gKiBAbG9ja3RpbWVfdTogVGhlIGxvY2stdGltZSBpbiB1UyBmb3IgdGhlIFVQTEwuCi0gKiBAbG9jdHRpbWVfYml0czogVGhlIG51bWJlciBvZiBiaXRzIGVhY2ggTE9DS1RJTUUgZmllbGQuCi0gKiBAbmVlZF9wbGw6IFNldCBpZiB0aGlzIGRyaXZlciBuZWVkcyB0byBjaGFuZ2UgdGhlIFBMTCB2YWx1ZXMgdG8gYWNoaWV2ZQotICoJYW55IGZyZXF1ZW5jeSBjaGFuZ2VzLiBUaGlzIGlzIHJlYWxseSBvbmx5IG5lZWQgYnkgZGV2aWNlcyBsaWtlIHRoZQotICoJUzNDMjQxMCB3aGVyZSB0aGVyZSBpcyBubyBvciBsaW1pdGVkIGRpdmlkZXIgYmV0d2VlbiB0aGUgUExMIGFuZCB0aGUKLSAqCUFSTUNMSy4KLSAqIEByZXN1bWVfY2xvY2tzOiBVcGRhdGUgdGhlIGNsb2NrcyBvbiByZXN1bWUuCi0gKiBAZ2V0X2lvdGltaW5nOiBHZXQgdGhlIGN1cnJlbnQgSU8gdGltaW5nIGRhdGEsIG1haW5seSBmb3IgdXNlIGF0IHN0YXJ0LgotICogQHNldF9pb3RpbWluZzogVXBkYXRlIHRoZSBJTyB0aW1pbmdzIGZyb20gdGhlIGNhY2hlZCBjb3BpZXMgY2FsY3VsYXRlZAotICoJZnJvbSB0aGUgQGNhbGNfaW90aW1pbmcgZW50cnkgd2hlbiBjaGFuZ2luZyB0aGUgZnJlcXVlbmN5LgotICogQGNhbGNfaW90aW1pbmc6IENhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSBjYWNoZWQgY29waWVzIG9mIHRoZSBJTyB0aW1pbmdzCi0gKglmcm9tIHRoZSBuZXdseSBjYWxjdWxhdGVkIGZyZXF1ZW5jaWVzLgotICogQGNhbGNfZnJlcXRhYmxlOiBDYWxjdWxhdGUgKGZpbGwgaW4pIHRoZSBnaXZlbiBmcmVxdWVuY3kgdGFibGUgZnJvbSB0aGUKLSAqCWN1cnJlbnQgZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24uIElmIHRoZSB0YWJsZSBwYXNzZWQgaW4gaXMgTlVMTCwKLSAqCXRoZW4gdGhlIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGZpbGxlZCBmb3IgYWxsb2NhdGlvbgotICoJb2YgdGhlIHRhYmxlLgotICogQHNldF9yZWZyZXNoOiBTZXQgdGhlIG1lbW9yeSByZWZyZXNoIGNvbmZpZ3VyYXRpb24uCi0gKiBAc2V0X2Z2Y286IFNldCB0aGUgUExMIGZyZXF1ZW5jaWVzLgotICogQHNldF9kaXZzOiBVcGRhdGUgdGhlIGNsb2NrIGRpdmlzb3JzLgotICogQGNhbGNfZGl2czogQ2FsY3VsYXRlIHRoZSBjbG9jayBkaXZpc29ycy4KLSAqLwotc3RydWN0IHMzY19jcHVmcmVxX2luZm8gewotCWNvbnN0IGNoYXIJCSpuYW1lOwotCXN0cnVjdCBzM2NfZnJlcQkJbWF4OwotCi0JdW5zaWduZWQgaW50CQlsYXRlbmN5OwotCi0JdW5zaWduZWQgaW50CQlsb2NrdGltZV9tOwotCXVuc2lnbmVkIGludAkJbG9ja3RpbWVfdTsKLQl1bnNpZ25lZCBjaGFyCQlsb2NrdGltZV9iaXRzOwotCi0JdW5zaWduZWQgaW50CQluZWVkX3BsbDoxOwotCi0JLyogZHJpdmVyIHJvdXRpbmVzICovCi0KLQl2b2lkCQkoKnJlc3VtZV9jbG9ja3MpKHZvaWQpOwotCi0JaW50CQkoKmdldF9pb3RpbWluZykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7Ci0KLQl2b2lkCQkoKnNldF9pb3RpbWluZykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7Ci0KLQlpbnQJCSgqY2FsY19pb3RpbWluZykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAotCQkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi0JaW50CQkoKmNhbGNfZnJlcXRhYmxlKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJCSAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICp0LAotCQkJCQkgIHNpemVfdCB0YWJsZV9zaXplKTsKLQotCXZvaWQJCSgqZGVidWdfaW9fc2hvdykoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJCSBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJCSB1bmlvbiBzM2NfaW9iYW5rICppb2IpOwotCi0Jdm9pZAkJKCpzZXRfcmVmcmVzaCkoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKLQl2b2lkCQkoKnNldF9mdmNvKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOwotCXZvaWQJCSgqc2V0X2RpdnMpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Ci0JaW50CQkoKmNhbGNfZGl2cykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKLX07Ci0KLWV4dGVybiBpbnQgczNjX2NwdWZyZXFfcmVnaXN0ZXIoc3RydWN0IHMzY19jcHVmcmVxX2luZm8gKmluZm8pOwotCi1leHRlcm4gaW50IHMzY19wbGx0YWJfcmVnaXN0ZXIoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwbGxzLCB1bnNpZ25lZCBpbnQgcGxsc19ubyk7Ci0KLS8qIGV4cG9ydHMgYW5kIHV0aWxpdGllcyBmb3IgZGVidWdmcyAqLwotZXh0ZXJuIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKnMzY19jcHVmcmVxX2dldGNvbmZpZyh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqczNjX2NwdWZyZXFfZ2V0aW90aW1pbmdzKHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX2lvdGltaW5nX2RlYnVnZnMoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJICAgICBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJICAgICB1bmlvbiBzM2NfaW9iYW5rICppb2IpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEyX2lvdGltaW5nX2RlYnVnZnMoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJICAgICBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJICAgICB1bmlvbiBzM2NfaW9iYW5rICppb2IpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUdGUwotI2RlZmluZSBzM2NfY3B1ZnJlcV9kZWJ1Z2ZzX2NhbGwoeCkgeAotI2Vsc2UKLSNkZWZpbmUgczNjX2NwdWZyZXFfZGVidWdmc19jYWxsKHgpIE5VTEwKLSNlbmRpZgotCi0vKiBVc2VmdWwgdXRpbGl0eSBmdW5jdGlvbnMuICovCi0KLWV4dGVybiBzdHJ1Y3QgY2xrICpzM2NfY3B1ZnJlcV9jbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqKTsKLQotLyogUzNDMjQxMCBhbmQgY29tcGF0aWJsZSBleHBvcnRlZCBmdW5jdGlvbnMgKi8KLQotZXh0ZXJuIHZvaWQgczNjMjQxMF9jcHVmcmVxX3NldHJlZnJlc2goc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKLWV4dGVybiB2b2lkIHMzYzI0MTBfc2V0X2Z2Y28oc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKLQotI2lmZGVmIENPTkZJR19TM0MyNDEwX0lPVElNSU5HCi1leHRlcm4gaW50IHMzYzI0MTBfaW90aW1pbmdfY2FsYyhzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOwotCi1leHRlcm4gaW50IHMzYzI0MTBfaW90aW1pbmdfZ2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTBfaW90aW1pbmdfc2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7Ci0jZWxzZQotI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2NhbGMgTlVMTAotI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2dldCBOVUxMCi0jZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfc2V0IE5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORyAqLwotCi0vKiBTM0MyNDEyIGNvbXBhdGlibGUgcm91dGluZXMgKi8KLQotZXh0ZXJuIGludCBzM2MyNDEyX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOwotCi1leHRlcm4gaW50IHMzYzI0MTJfaW90aW1pbmdfZ2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7Ci0KLWV4dGVybiBpbnQgczNjMjQxMl9pb3RpbWluZ19jYWxjKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTJfaW90aW1pbmdfc2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfUzNDMjRYWF9ERUJVRwotI2RlZmluZSBzM2NfZnJlcV9kYmcoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQotI2Vsc2UKLSNkZWZpbmUgczNjX2ZyZXFfZGJnKHguLi4pIGRvIHsgaWYgKDApIHByaW50ayh4KTsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVFfUzNDMjRYWF9ERUJVRyAqLwotCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfSU9ERUJVRwotI2RlZmluZSBzM2NfZnJlcV9pb2RiZyh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCi0jZWxzZQotI2RlZmluZSBzM2NfZnJlcV9pb2RiZyh4Li4uKSBkbyB7IGlmICgwKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfSU9ERUJVRyAqLwotCi1zdGF0aWMgaW5saW5lIGludCBzM2NfY3B1ZnJlcV9hZGRmcmVxKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUsCi0JCQkJICAgICAgaW50IGluZGV4LCBzaXplX3QgdGFibGVfc2l6ZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZnJlcSkKLXsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gaW5kZXg7Ci0KLQlpZiAodGFibGUpIHsKLQkJaWYgKGluZGV4ID49IHRhYmxlX3NpemUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlzM2NfZnJlcV9kYmcoIiVzOiB7ICVkID0gJXUga0h6IH1cbiIsCi0JCQkgICAgIF9fZnVuY19fLCBpbmRleCwgZnJlcSk7Ci0KLQkJdGFibGVbaW5kZXhdLmluZGV4ID0gaW5kZXg7Ci0JCXRhYmxlW2luZGV4XS5mcmVxdWVuY3kgPSBmcmVxOwotCX0KLQotCXJldHVybiBpbmRleCArIDE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2ZpcS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9maXEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyMWI4My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2ZpcS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9maXEuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjRYWCBDUFUgRklRIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotZXh0ZXJuIGludCBzM2MyNHh4X3NldF9maXEodW5zaWduZWQgaW50IGlycSwgYm9vbCBvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2lycS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwODdkNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvaXJxLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjRYWCBDUFUgSVJRIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9yZWdzLWlycS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+Ci0KLSNkZWZpbmUgaXJxZGJmKHguLi4pCi0jZGVmaW5lIGlycWRiZjIoeC4uLikKLQotI2RlZmluZSBFWFRJTlRfT0ZGIChJUlFfRUlOVDQgLSA0KQotCi0vKiB0aGVzZSBhcmUgZXhwb3J0ZWQgZm9yIGFyY2gvYXJtL21hY2gtKiB1c2FnZSAqLwotZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxX2xldmVsX2NoaXA7Ci1leHRlcm4gc3RydWN0IGlycV9jaGlwIHMzY19pcnFfY2hpcDsKLQotc3RhdGljIGlubGluZSB2b2lkCi1zM2NfaXJxc3ViX21hc2sodW5zaWduZWQgaW50IGlycW5vLCB1bnNpZ25lZCBpbnQgcGFyZW50Yml0LAotCQlpbnQgc3ViY2hlY2spCi17Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCXVuc2lnbmVkIGxvbmcgc3VibWFzazsKLQotCXN1Ym1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVFNVQk1TSyk7Ci0JbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UTVNLKTsKLQotCXN1Ym1hc2sgfD0gKDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApKTsKLQotCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG1hc2sgdGhlIHBhcmVudCBJUlEgKi8KLQotCWlmICgoc3VibWFzayAgJiBzdWJjaGVjaykgPT0gc3ViY2hlY2spIHsKLQkJX19yYXdfd3JpdGVsKG1hc2sgfCBwYXJlbnRiaXQsIFMzQzI0MTBfSU5UTVNLKTsKLQl9Ci0KLQkvKiB3cml0ZSBiYWNrIG1hc2tzICovCi0JX19yYXdfd3JpdGVsKHN1Ym1hc2ssIFMzQzI0MTBfSU5UU1VCTVNLKTsKLQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXMzY19pcnFzdWJfdW5tYXNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudGJpdCkKLXsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBzdWJtYXNrOwotCi0Jc3VibWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UU1VCTVNLKTsKLQltYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRNU0spOwotCi0Jc3VibWFzayAmPSB+KDFVTCA8PCAoaXJxbm8gLSBJUlFfUzNDVUFSVF9SWDApKTsKLQltYXNrICY9IH5wYXJlbnRiaXQ7Ci0KLQkvKiB3cml0ZSBiYWNrIG1hc2tzICovCi0JX19yYXdfd3JpdGVsKHN1Ym1hc2ssIFMzQzI0MTBfSU5UU1VCTVNLKTsKLQlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9JTlRNU0spOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotczNjX2lycXN1Yl9tYXNrYWNrKHVuc2lnbmVkIGludCBpcnFubywgdW5zaWduZWQgaW50IHBhcmVudG1hc2ssIHVuc2lnbmVkIGludCBncm91cCkKLXsKLQl1bnNpZ25lZCBpbnQgYml0ID0gMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCk7Ci0KLQlzM2NfaXJxc3ViX21hc2soaXJxbm8sIHBhcmVudG1hc2ssIGdyb3VwKTsKLQotCV9fcmF3X3dyaXRlbChiaXQsIFMzQzI0MTBfU1VCU1JDUE5EKTsKLQotCS8qIG9ubHkgYWNrIHBhcmVudCBpZiB3ZSd2ZSBnb3QgYWxsIHRoZSBpcnFzIChzZWVtcyB3ZSBtdXN0Ci0JICogYWNrLCBhbGwgYW5kIGhvcGUgdGhhdCB0aGUgaXJxIHN5c3RlbSByZXRyaWdnZXJzIG9rIHdoZW4KLQkgKiB0aGUgaW50ZXJydXB0IGdvZXMgb2ZmIGFnYWluKQotCSAqLwotCi0JaWYgKDEpIHsKLQkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfU1JDUE5EKTsKLQkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfSU5UUE5EKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotczNjX2lycXN1Yl9hY2sodW5zaWduZWQgaW50IGlycW5vLCB1bnNpZ25lZCBpbnQgcGFyZW50bWFzaywgdW5zaWduZWQgaW50IGdyb3VwKQotewotCXVuc2lnbmVkIGludCBiaXQgPSAxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKTsKLQotCV9fcmF3X3dyaXRlbChiaXQsIFMzQzI0MTBfU1VCU1JDUE5EKTsKLQotCS8qIG9ubHkgYWNrIHBhcmVudCBpZiB3ZSd2ZSBnb3QgYWxsIHRoZSBpcnFzIChzZWVtcyB3ZSBtdXN0Ci0JICogYWNrLCBhbGwgYW5kIGhvcGUgdGhhdCB0aGUgaXJxIHN5c3RlbSByZXRyaWdnZXJzIG9rIHdoZW4KLQkgKiB0aGUgaW50ZXJydXB0IGdvZXMgb2ZmIGFnYWluKQotCSAqLwotCi0JaWYgKDEpIHsKLQkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfU1JDUE5EKTsKLQkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfSU5UUE5EKTsKLQl9Ci19Ci0KLS8qIGV4cG9ydGVkIGZvciB1c2UgaW4gYXJjaC9hcm0vbWFjaC1zM2MyNDEwICovCi0KLSNpZmRlZiBDT05GSUdfUE0KLWV4dGVybiBpbnQgczNjX2lycV93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHN0YXRlKTsKLSNlbHNlCi0jZGVmaW5lIHMzY19pcnFfd2FrZSBOVUxMCi0jZW5kaWYKLQotZXh0ZXJuIGludCBzM2NfaXJxZXh0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1MzRkMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvbWFwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDMjRYWCAtIE1lbW9yeSBtYXAgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1MzQzI0WFhfTUFQX0gKLSNkZWZpbmUgX19BU01fUExBVF9TM0MyNFhYX01BUF9ICi0KLS8qIGludGVycnVwdCBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCB0aGluZyB3ZSBwdXQgaW4sIHRvIG1ha2UKLSAqIHRoZSBhc3NlbWJseSBjb2RlIGZvciB0aGUgaXJxIGRldGVjdGlvbiBlYXNpZXIKLSAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX0lSUQkgICBTM0NfVkFfSVJRCi0jZGVmaW5lIFMzQzI0MTBfUEFfSVJRCSAgICgweDRBMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX0lSUQkgICBTWl8xTQotCi0vKiBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9NRU1DVFJMIFMzQ19WQV9NRU0KLSNkZWZpbmUgUzNDMjQxMF9QQV9NRU1DVFJMICgweDQ4MDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX01FTUNUUkwgU1pfMU0KLQotLyogVUFSVHMgKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9VQVJUCSAgIFMzQ19WQV9VQVJUCi0jZGVmaW5lIFMzQzI0MTBfUEFfVUFSVAkgICAoMHg1MDAwMDAwMCkKLSNkZWZpbmUgUzNDMjRYWF9TWl9VQVJUCSAgIFNaXzFNCi0jZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkgICAoMHg0MDAwKQotCi0jZGVmaW5lIFMzQ19WQV9VQVJUeCh1YXJ0KSAoUzNDX1ZBX1VBUlQgKyAoKHVhcnQgKiBTM0NfVUFSVF9PRkZTRVQpKSkKLQotLyogVGltZXJzICovCi0jZGVmaW5lIFMzQzI0WFhfVkFfVElNRVIgICBTM0NfVkFfVElNRVIKLSNkZWZpbmUgUzNDMjQxMF9QQV9USU1FUiAgICgweDUxMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX1RJTUVSICAgU1pfMU0KLQotLyogQ2xvY2sgYW5kIFBvd2VyIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgUzNDMjRYWF9WQV9DTEtQV1IgIFMzQ19WQV9TWVMKLSNkZWZpbmUgUzNDMjRYWF9TWl9DTEtQV1IgIFNaXzFNCi0KLS8qIFVTQiBEZXZpY2UgcG9ydCAqLwotI2RlZmluZSBTM0MyNDEwX1BBX1VTQkRFViAgKDB4NTIwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfU1pfVVNCREVWICBTWl8xTQotCi0vKiBXYXRjaGRvZyAqLwotI2RlZmluZSBTM0MyNFhYX1ZBX1dBVENIRE9HIFMzQ19WQV9XQVRDSERPRwotI2RlZmluZSBTM0MyNDEwX1BBX1dBVENIRE9HICgweDUzMDAwMDAwKQotI2RlZmluZSBTM0MyNFhYX1NaX1dBVENIRE9HIFNaXzFNCi0KLS8qIFN0YW5kYXJkIHNpemUgZGVmaW5pdGlvbnMgZm9yIHBlcmlwaGVyYWwgYmxvY2tzLiAqLwotCi0jZGVmaW5lIFMzQzI0WFhfU1pfSUlTCQlTWl8xTQotI2RlZmluZSBTM0MyNFhYX1NaX0FEQwkJU1pfMU0KLSNkZWZpbmUgUzNDMjRYWF9TWl9TUEkJCVNaXzFNCi0jZGVmaW5lIFMzQzI0WFhfU1pfU0RJCQlTWl8xTQotI2RlZmluZSBTM0MyNFhYX1NaX05BTkQJCVNaXzFNCi0KLS8qIEdQSU8gcG9ydHMgKi8KLQotLyogdGhlIGNhbGN1bGF0aW9uIGZvciB0aGUgVkEgb2YgdGhpcyBtdXN0IGVuc3VyZSB0aGF0Ci0gKiBpdCBpcyB0aGUgc2FtZSBkaXN0YW5jZSBhcGFydCBmcm9tIHRoZSBVQVJUIGluIHRoZQotICogcGhzeWljYWwgYWRkcmVzcyBzcGFjZSwgYXMgdGhlIGluaXRpYWwgbWFwcGluZyBmb3IgdGhlIElPCi0gKiBpcyBkb25lIGFzIGEgMToxIG1hcHBpbmcuIFRoaXMgcHV0cyBpdCAoY3VycmVudGx5KSBhdAotICogMHhGQTgwMDAwMCwgd2hpY2ggaXMgbm90IGluIHRoZSB3YXkgb2YgYW55IGN1cnJlbnQgbWFwcGluZwotICogYnkgdGhlIGJhc2Ugc3lzdGVtLgotKi8KLQotI2RlZmluZSBTM0MyNDEwX1BBX0dQSU8JICAgKDB4NTYwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfVkFfR1BJTwkgICAoKFMzQzI0WFhfUEFfR1BJTyAtIFMzQzI0WFhfUEFfVUFSVCkgKyBTM0MyNFhYX1ZBX1VBUlQpCi0jZGVmaW5lIFMzQzI0WFhfU1pfR1BJTwkgICBTWl8xTQotCi0KLS8qIElTQSBzdHlsZSBJTywgZm9yIGVhY2ggbWFjaGluZSB0byBzb3J0IG91dCBtYXBwaW5ncyBmb3IsIGlmIGl0Ci0gKiBpbXBsZW1lbnRzIGl0LiBXZSByZXNlcnZlIHR3byAxNk0gcmVnaW9ucyBmb3IgSVNBLgotICovCi0KLSNkZWZpbmUgUzNDMjRYWF9WQV9JU0FfV09SRCAgUzNDMjQxMF9BRERSKDB4MDIwMDAwMDApCi0jZGVmaW5lIFMzQzI0WFhfVkFfSVNBX0JZVEUgIFMzQzI0MTBfQUREUigweDAzMDAwMDAwKQotCi0vKiBkZWFsIHdpdGggdGhlIHJlZ2lzdGVycyB0aGF0IG1vdmUgdW5kZXIgdGhlIDI0MTIvMjQxMyAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEzKQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLWV4dGVybiB2b2lkIF9faW9tZW0gKnMzYzI0eHhfdmFfZ3BpbzI7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTJfT05MWQotI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIChTM0MyNFhYX1ZBX0dQSU8gKyAweDEwKQotI2Vsc2UKLSNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiBzM2MyNHh4X3ZhX2dwaW8yCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIHMzYzI0eHhfdmFfZ3BpbzIgUzNDMjRYWF9WQV9HUElPCi0jZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgUzNDMjRYWF9WQV9HUElPCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzNDMjRYWF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvbWNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzJiMjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9tY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSNpZm5kZWYgX0FSQ0hfTUNJX0gKLSNkZWZpbmUgX0FSQ0hfTUNJX0gKLQotLyoqCi0gKiBzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgLSBzZC9tbWMgY29udHJvbGxlciBwbGF0Zm9ybSBkYXRhCi0gKiBAbm9fd3Byb3RlY3Q6IFNldCB0aGlzIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIHdyaXRlLXByb3RlY3Qgc3dpdGNoLgotICogQG5vX2RldGVjdDogU2V0IHRoaXMgaWYgdGhlcmUgaXMgbm8gZGV0ZWN0IHN3aXRjaC4KLSAqIEB3cHJvdGVjdF9pbnZlcnQ6IEludmVydCB0aGUgZGVmYXVsdCBzZW5zZSBvZiB0aGUgd3JpdGUgcHJvdGVjdCBzd2l0Y2guCi0gKiBAZGV0ZWN0X2ludmVydDogSW52ZXJ0IHRoZSBkZWZhdWx0IHNlbnNlIG9mIHRoZSB3cml0ZSBwcm90ZWN0IHN3aXRjaC4KLSAqIEB1c2VfZG1hOiBTZXQgdG8gYWxsb3cgdGhlIHVzZSBvZiBETUEuCi0gKiBAZ3Bpb19kZXRlY3Q6IEdQSU8gbnVtYmVyIGZvciB0aGUgY2FyZCBkZXRlY3QgbGluZS4KLSAqIEBncGlvX3dwcm90ZWN0OiBHUElPIG51bWJlciBmb3IgdGhlIHdyaXRlIHByb3RlY3QgbGluZS4KLSAqIEBvY3JfYXZhaWw6IFRoZSBtYXNrIG9mIHRoZSBhdmFpbGFibGUgcG93ZXIgc3RhdGVzLCBub24temVybyB0byB1c2UuCi0gKiBAc2V0X3Bvd2VyOiBDYWxsYmFjayB0byBjb250cm9sIHRoZSBwb3dlciBtb2RlLgotICoKLSAqIFRoZSBAZ3Bpb19kZXRlY3QgaXMgdXNlZCBmb3IgY2FyZCBkZXRlY3Rpb24gd2hlbiBAbm9fd3Byb3RlY3QgaXMgdW5zZXQsCi0gKiBhbmQgdGhlIGRlZmF1bHQgc2Vuc2UgaXMgdGhhdCAwIHJldHVybmVkIGZyb20gZ3Bpb19nZXRfdmFsdWUoKSBtZWFucwotICogdGhhdCBhIGNhcmQgaXMgaW5zZXJ0ZWQuIElmIEBkZXRlY3RfaW52ZXJ0IGlzIHNldCwgdGhlbiB0aGUgdmFsdWUgZnJvbQotICogZ3Bpb19nZXRfdmFsdWUoKSBpcyBpbnZlcnRlZCwgd2hpY2ggbWFrZXMgMSBtZWFuIGNhcmQgaW5zZXJ0ZWQuCi0gKgotICogVGhlIGRyaXZlciB3aWxsIHVzZSBAZ3Bpb193cHJvdGVjdCB0byBzaWduYWwgd2hldGhlciB0aGUgY2FyZCBpcyB3cml0ZQotICogcHJvdGVjdGVkIGlmIEBub193cHJvdGVjdCBpcyBub3Qgc2V0LiBBIDAgcmV0dXJuZWQgZnJvbSBncGlvX2dldF92YWx1ZSgpCi0gKiBtZWFucyB0aGUgY2FyZCBpcyByZWFkL3dyaXRlLCBhbmQgMSBtZWFucyByZWFkLW9ubHkuIFRoZSBAd3Byb3RlY3RfaW52ZXJ0Ci0gKiB3aWxsIGludmVydCB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBncGlvX2dldF92YWx1ZSgpLgotICoKLSAqIENhcmQgcG93ZXIgaXMgc2V0IGJ5IEBvY3JfYXZhaWxhLCB1c2luZyBNQ0NfVkREXyBjb25zdGFudHMgaWYgaXQgaXMgc2V0Ci0gKiB0byBhIG5vbi16ZXJvIHZhbHVlLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgb2YgMy4yLTMuNFYgaXMgdXNlZC4KLSAqLwotc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIHsKLQl1bnNpZ25lZCBpbnQJbm9fd3Byb3RlY3QgOiAxOwotCXVuc2lnbmVkIGludAlub19kZXRlY3QgOiAxOwotCXVuc2lnbmVkIGludAl3cHJvdGVjdF9pbnZlcnQgOiAxOwotCXVuc2lnbmVkIGludAlkZXRlY3RfaW52ZXJ0IDogMTsgICAvKiBzZXQgPT4gZGV0ZWN0IGFjdGl2ZSBoaWdoLiAqLwotCXVuc2lnbmVkIGludAl1c2VfZG1hIDogMTsKLQotCXVuc2lnbmVkIGludAlncGlvX2RldGVjdDsKLQl1bnNpZ25lZCBpbnQJZ3Bpb193cHJvdGVjdDsKLQl1bnNpZ25lZCBsb25nCW9jcl9hdmFpbDsKLQl2b2lkCQkoKnNldF9wb3dlcikodW5zaWduZWQgY2hhciBwb3dlcl9tb2RlLAotCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdmRkKTsKLX07Ci0KLS8qKgotICogczNjMjR4eF9tY2lfc2V0X3BsYXRkYXRhIC0gc2V0IHBsYXRmb3JtIGRhdGEgZm9yIG1tYy9zZGkgZGV2aWNlCi0gKiBAcGRhdGE6IFRoZSBwbGF0Zm9ybSBkYXRhCi0gKgotICogQ29weSB0aGUgcGxhdGZvcm0gZGF0YSBzdXBwbGllZCBieSBAcGRhdGEgc28gdGhhdCB0aGlzIGNhbiBiZSBtYXJrZWQKLSAqIF9faW5pdGRhdGEuCi0gKi8KLWV4dGVybiB2b2lkIHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKnBkYXRhKTsKLQotI2VuZGlmIC8qIF9BUkNIX05DSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3BsbC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1NzI5YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3BsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9wbGwuaAotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDMjR4eCAtIGNvbW1vbiBwbGwgcmVnaXN0ZXJzIGFuZCBjb2RlCi0gKi8KLQotI2RlZmluZSBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQJMTIKLSNkZWZpbmUgUzNDMjRYWF9QTExDT05fUERJVlNISUZUCTQKLSNkZWZpbmUgUzNDMjRYWF9QTExDT05fU0RJVlNISUZUCTAKLSNkZWZpbmUgUzNDMjRYWF9QTExDT05fTURJVk1BU0sJCSgoMTw8KDErKDE5LTEyKSkpLTEpCi0jZGVmaW5lIFMzQzI0WFhfUExMQ09OX1BESVZNQVNLCQkoKDE8PDUpLTEpCi0jZGVmaW5lIFMzQzI0WFhfUExMQ09OX1NESVZNQVNLCQkzCi0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLXMzYzI0eHhfZ2V0X3BsbCh1bnNpZ25lZCBpbnQgcGxsdmFsLCB1bnNpZ25lZCBpbnQgYmFzZWNsaykKLXsKLQl1bnNpZ25lZCBpbnQgbWRpdiwgcGRpdiwgc2RpdjsKLQl1aW50NjRfdCBmdmNvOwotCi0JbWRpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9NRElWU0hJRlQ7Ci0JcGRpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9QRElWU0hJRlQ7Ci0Jc2RpdiA9IHBsbHZhbCA+PiBTM0MyNFhYX1BMTENPTl9TRElWU0hJRlQ7Ci0KLQltZGl2ICY9IFMzQzI0WFhfUExMQ09OX01ESVZNQVNLOwotCXBkaXYgJj0gUzNDMjRYWF9QTExDT05fUERJVk1BU0s7Ci0Jc2RpdiAmPSBTM0MyNFhYX1BMTENPTl9TRElWTUFTSzsKLQotCWZ2Y28gPSAodWludDY0X3QpYmFzZWNsayAqIChtZGl2ICsgOCk7Ci0JZG9fZGl2KGZ2Y28sIChwZGl2ICsgMikgPDwgc2Rpdik7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGludClmdmNvOwotfQotCi0jZGVmaW5lIFMzQzI0MTZfUExMX01fU0hJRlQJKDE0KQotI2RlZmluZSBTM0MyNDE2X1BMTF9QX1NISUZUCSg1KQotI2RlZmluZSBTM0MyNDE2X1BMTF9TX01BU0sJKDcpCi0jZGVmaW5lIFMzQzI0MTZfUExMX01fTUFTSwkoKDEgPDwgMTApIC0gMSkKLSNkZWZpbmUgUzNDMjQxNl9QTExfUF9NQVNLCSg2MykKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLXMzYzI0MTZfZ2V0X3BsbCh1bnNpZ25lZCBpbnQgcGxsdmFsLCB1bnNpZ25lZCBpbnQgYmFzZWNsaykKLXsKLQl1bnNpZ25lZCBpbnQgbSwgcCwgczsKLQl1aW50NjRfdCBmdmNvOwotCi0JbSA9IHBsbHZhbCA+PiBTM0MyNDE2X1BMTF9NX1NISUZUOwotCXAgPSBwbGx2YWwgPj4gUzNDMjQxNl9QTExfUF9TSElGVDsKLQotCXMgPSBwbGx2YWwgJiBTM0MyNDE2X1BMTF9TX01BU0s7Ci0JbSAmPSBTM0MyNDE2X1BMTF9NX01BU0s7Ci0JcCAmPSBTM0MyNDE2X1BMTF9QX01BU0s7Ci0KLQlmdmNvID0gKHVpbnQ2NF90KWJhc2VjbGsgKiBtOwotCWRvX2RpdihmdmNvLCAocCA8PCBzKSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGludClmdmNvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWRtYS5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWRtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBmNGMzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2RtYS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogU2Ftc3VuZyBTM0MyNFhYIERNQSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIERNQSBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RJU1JDCQkoMHgwMCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRElTUkNDCQkoMHgwNCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRElEU1QJCSgweDA4KQotI2RlZmluZSBTM0MyNDEwX0RNQV9ESURTVEMJCSgweDBDKQotI2RlZmluZSBTM0MyNDEwX0RNQV9EQ09OCQkoMHgxMCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRFNUQVQJCSgweDE0KQotI2RlZmluZSBTM0MyNDEwX0RNQV9EQ1NSQwkJKDB4MTgpCi0jZGVmaW5lIFMzQzI0MTBfRE1BX0RDRFNUCQkoMHgxQykKLSNkZWZpbmUgUzNDMjQxMF9ETUFfRE1BU0tUUklHCQkoMHgyMCkKLSNkZWZpbmUgUzNDMjQxMl9ETUFfRE1BUkVRU0VMCQkoMHgyNCkKLSNkZWZpbmUgUzNDMjQ0M19ETUFfRE1BUkVRU0VMCQkoMHgyNCkKLQotI2RlZmluZSBTM0MyNDEwX0RJU1JDQ19JTkMJCSgxPDwwKQotI2RlZmluZSBTM0MyNDEwX0RJU1JDQ19BUEIJCSgxPDwxKQotCi0jZGVmaW5lIFMzQzI0MTBfRE1BU0tUUklHX1NUT1AJCSgxPDwyKQotI2RlZmluZSBTM0MyNDEwX0RNQVNLVFJJR19PTgkJKDE8PDEpCi0jZGVmaW5lIFMzQzI0MTBfRE1BU0tUUklHX1NXVFJJRwkoMTw8MCkKLQotI2RlZmluZSBTM0MyNDEwX0RDT05fREVNQU5ECQkoMDw8MzEpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9IQU5EU0hBS0UJCSgxPDwzMSkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX1NZTkNfUENMSwkJKDA8PDMwKQotI2RlZmluZSBTM0MyNDEwX0RDT05fU1lOQ19IQ0xLCQkoMTw8MzApCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0lOVFJFUQkJKDE8PDI5KQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfWERSRVEwCQkoMDw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfVUFSVDAJCSgxPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMF9TREkJCSgyPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMF9USU1FUgkJKDM8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gwX1VTQkVQMQkJKDQ8PDI0KQotCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfWERSRVExCQkoMDw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfVUFSVDEJCSgxPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9JMlNTREkJCSgyPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9TUEkJCSgzPDwyNCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9VU0JFUDIJCSg0PDwyNCkKLQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX0kyU1NETwkJKDA8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX0kyU1NESQkJKDE8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1NESQkJKDI8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1RJTUVSCQkoMzw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDJfVVNCRVAzCQkoNDw8MjQpCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19VQVJUMgkJKDA8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1NESQkJKDE8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1NQSQkJKDI8PDI0KQotI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1RJTUVSCQkoMzw8MjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfVVNCRVA0CQkoNDw8MjQpCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX1NSQ1NISUZUCQkoMjQpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9TUkNNQVNLCQkoNzw8MjQpCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0JZVEUJCSgwPDwyMCkKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0hBTEZXT1JECQkoMTw8MjApCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9XT1JECQkoMjw8MjApCi0KLSNkZWZpbmUgUzNDMjQxMF9EQ09OX0FVVE9SRUxPQUQJCSgwPDwyMikKLSNkZWZpbmUgUzNDMjQxMF9EQ09OX05PUkVMT0FECQkoMTw8MjIpCi0jZGVmaW5lIFMzQzI0MTBfRENPTl9IV1RSSUcJCSgxPDwyMykKLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAotI2RlZmluZSBTM0MyNDQwX0RJRFNUQ19DSEtJTlQJCSgxPDwyKQotCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDBfSTJTU0RPCQkoNTw8MjQpCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDBfUENNSU4JCSg2PDwyNCkKLQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gxX1BDTU9VVAkJKDU8PDI0KQotI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gxX1NESQkJKDY8PDI0KQotCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDJfUENNSU4JCSg1PDwyNCkKLSNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMl9NSUNJTgkJKDY8PDI0KQotCi0jZGVmaW5lIFMzQzI0NDBfRENPTl9DSDNfTUlDSU4JCSg1PDwyNCkKLSNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIM19QQ01PVVQJCSg2PDwyNCkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyCi0KLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1JDKHgpCSgoeCk8PDEpCi0KLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfSFcJCSgxKQotCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTBUWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMCkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1BJMFJYCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TUEkxVFgJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTFSWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMykKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfSTJTVFgJCVMzQzI0MTJfRE1BUkVRU0VMX1NSQyg0KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9JMlNSWAkJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDUpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1RJTUVSCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoOSkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU0RJCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTApCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTMpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMglTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTQpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQMwlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTUpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VTQkVQNAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTYpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1hEUkVRMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTcpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1hEUkVRMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTgpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzAJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDE5KQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMF8xCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMCkKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjEpCi0jZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQxXzEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIyKQotI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8wCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMykKLSNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDJfMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjQpCi0KLSNlbmRpZgotCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NSQyh4KQkoKHgpPDwxKQotCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX0hXCQkoMSkKLQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkwVFgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDApCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NQSTBSWAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMSkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU1BJMVRYCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkxUlgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDMpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX0kyU1RYCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoNCkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfSTJTUlgJCVMzQzI0NDNfRE1BUkVRU0VMX1NSQyg1KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9USU1FUgkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDkpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NESQkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDEwKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9YRFJFUTAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDE3KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9YRFJFUTEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDE4KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMF8wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxOSkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDBfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjApCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQxXzAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIxKQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMV8xCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyMikKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDJfMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjMpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQyXzEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI0KQotI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUM18wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyNSkKLSNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDNfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjYpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1BDTU9VVAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjcpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1BDTUlOIAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjgpCi0jZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX01JQ0lOCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtaWlzLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtaWlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNDRlMGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9yZWdzLWlpcy5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgotICoJCSAgICAgIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBTM0MyNDEwIElJUyByZWdpc3RlciBkZWZpbml0aW9uCi0qLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19JSVNfSAotI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfSUlTX0gKLQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTgkgKDB4MDApCi0KLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fTFJJTkRFWAkgICgxPDw4KQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9UWEZJRk9SRFkgICgxPDw3KQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9SWEZJRk9SRFkgICgxPDw2KQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9UWERNQUVOCSAgKDE8PDUpCi0jZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1JYRE1BRU4JICAoMTw8NCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNDT05fVFhJRExFCSAgKDE8PDMpCi0jZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1JYSURMRQkgICgxPDwyKQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9QU0NFTgkgICgxPDwxKQotI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9JSVNFTgkgICgxPDwwKQotCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9ECSAoMHgwNCkKLQotI2RlZmluZSBTM0MyNDQwX0lJU01PRF9NUExMCSAgKDE8PDkpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1NMQVZFCSAgKDE8PDgpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX05PWEZFUgkgICgwPDw2KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9SWE1PREUJICAoMTw8NikKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfVFhNT0RFCSAgKDI8PDYpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1RYUlhNT0RFCSAgKDM8PDYpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0xSX0xMT1cJICAoMDw8NSkKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTFJfUkxPVwkgICgxPDw1KQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9JSVMJICAoMDw8NCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTVNCCSAgKDE8PDQpCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzhCSVQJICAoMDw8MykKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMTZCSVQJICAoMTw8MykKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfQklUTUFTSwkgICgxPDwzKQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF8yNTZGUwkgICgwPDwyKQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF8zODRGUwkgICgxPDwyKQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF8xNkZTCSAgKDA8PDApCi0jZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzMyRlMJICAoMTw8MCkKLSNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfNDhGUwkgICgyPDwwKQotI2RlZmluZSBTM0MyNDEwX0lJU01PRF9GU19NQVNLCSAgKDM8PDApCi0KLSNkZWZpbmUgUzNDMjQxMF9JSVNQU1IJCSgweDA4KQotI2RlZmluZSBTM0MyNDEwX0lJU1BTUl9JTlRNQVNLCSgzMTw8NSkKLSNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfSU5UU0hJRlQJKDUpCi0jZGVmaW5lIFMzQzI0MTBfSUlTUFNSX0VYVE1BU0sJKDMxPDwwKQotI2RlZmluZSBTM0MyNDEwX0lJU1BTUl9FWFRTSEZJVAkoMCkKLQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT04gICgweDBjKQotCi0jZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9UWERNQQkgICgxPDwxNSkKLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1JYRE1BCSAgKDE8PDE0KQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhFTkFCTEUgICgxPDwxMykKLSNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1JYRU5BQkxFICAoMTw8MTIpCi0jZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9UWE1BU0sJICAoMHgzZiA8PCA2KQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhTSElGVAkgICg2KQotI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhNQVNLCSAgKDB4M2YpCi0jZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWFNISUZUCSAgKDApCi0KLSNkZWZpbmUgUzNDMjQxMF9JSVNGSUZPICAoMHgxMCkKLSNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfSUlTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyZTJmNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3Mtc3BpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3JlZ3Mtc3BpLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRmV0cm9uIEdtYkgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFMzQzI0MTAgU1BJIHJlZ2lzdGVyIGRlZmluaXRpb24KLSovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9SRUdTX1NQSV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfUkVHU19TUElfSAotCi0jZGVmaW5lIFMzQzI0MTBfU1BJMQkoMHgyMCkKLSNkZWZpbmUgUzNDMjQxMl9TUEkxCSgweDEwMCkKLQotI2RlZmluZSBTM0MyNDEwX1NQQ09OCSgweDAwKQotCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fUlhGSUZPX1JCMgkoMDw8MTQpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fUlhGSUZPX1JCNAkoMTw8MTQpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fUlhGSUZPX1JCMTIJKDI8PDE0KQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19SQjE0CSgzPDwxNCkKLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9UWEZJRk9fUkIyCSgwPDwxMikKLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9UWEZJRk9fUkI0CSgxPDwxMikKLSNkZWZpbmUgUzNDMjQxMl9TUENPTl9UWEZJRk9fUkIxMgkoMjw8MTIpCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fVFhGSUZPX1JCMTQJKDM8PDEyKQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19SRVNFVAkoMTw8MTEpIC8qIFJ4RklGTyByZXNldCAqLwotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1RYRklGT19SRVNFVAkoMTw8MTApIC8qIFR4RklGTyByZXNldCAqLwotI2RlZmluZSBTM0MyNDEyX1NQQ09OX1JYRklGT19FTgkJKDE8PDkpICAvKiBSeEZJRk8gRW5hYmxlICovCi0jZGVmaW5lIFMzQzI0MTJfU1BDT05fVFhGSUZPX0VOCQkoMTw8OCkgIC8qIFR4RklGTyBFbmFibGUgKi8KLQotI2RlZmluZSBTM0MyNDEyX1NQQ09OX0RJUkNfUlgJICAoMTw8NykKLQotI2RlZmluZSBTM0MyNDEwX1NQQ09OX1NNT0RfRE1BCSAgKDI8PDUpCS8qIERNQSBtb2RlICovCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fU01PRF9JTlQJICAoMTw8NSkJLyogaW50ZXJydXB0IG1vZGUgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9TTU9EX1BPTEwgICAoMDw8NSkJLyogcG9sbGluZyBtb2RlICovCi0jZGVmaW5lIFMzQzI0MTBfU1BDT05fRU5TQ0sJICAoMTw8NCkJLyogRW5hYmxlIFNDSyAqLwotI2RlZmluZSBTM0MyNDEwX1NQQ09OX01TVFIJICAoMTw8MykJLyogTWFzdGVyL1NsYXZlIHNlbGVjdAotCQkJCQkJICAgMDogc2xhdmUsIDE6IG1hc3RlciAqLwotI2RlZmluZSBTM0MyNDEwX1NQQ09OX0NQT0xfSElHSAkgICgxPDwyKQkvKiBDbG9jayBwb2xhcml0eSBzZWxlY3QgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUE9MX0xPVwkgICgwPDwyKQkvKiBDbG9jayBwb2xhcml0eSBzZWxlY3QgKi8KLQotI2RlZmluZSBTM0MyNDEwX1NQQ09OX0NQSEFfRk1UQgkgICgxPDwxKQkvKiBDbG9jayBQaGFzZSBTZWxlY3QgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUEhBX0ZNVEEJICAoMDw8MSkJLyogQ2xvY2sgUGhhc2UgU2VsZWN0ICovCi0KLSNkZWZpbmUgUzNDMjQxMF9TUENPTl9UQUdECSAgKDE8PDApCS8qIFR4IGF1dG8gZ2FyYmFnZSBkYXRhIG1vZGUgKi8KLQotCi0jZGVmaW5lIFMzQzI0MTBfU1BTVEEJICgweDA0KQotCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfUlhGSUZPX0FFCQkoMTw8MTEpCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfVFhGSUZPX0FFCQkoMTw8MTApCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfUlhGSUZPX0VSUk9SCSgxPDw5KQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1RYRklGT19FUlJPUgkoMTw8OCkKLSNkZWZpbmUgUzNDMjQxMl9TUFNUQV9SWEZJRk9fRklGTwkoMTw8NykKLSNkZWZpbmUgUzNDMjQxMl9TUFNUQV9SWEZJRk9fRU1QVFkJKDE8PDYpCi0jZGVmaW5lIFMzQzI0MTJfU1BTVEFfVFhGSUZPX05GVUxMCSgxPDw1KQotI2RlZmluZSBTM0MyNDEyX1NQU1RBX1RYRklGT19FTVBUWQkoMTw8NCkKLQotI2RlZmluZSBTM0MyNDEwX1NQU1RBX0RDT0wJICAoMTw8MikJLyogRGF0YSBDb2xsaXNpb24gRXJyb3IgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUFNUQV9NVUxECSAgKDE8PDEpCS8qIE11bHRpIE1hc3RlciBFcnJvciAqLwotI2RlZmluZSBTM0MyNDEwX1NQU1RBX1JFQURZCSAgKDE8PDApCS8qIERhdGEgVHgvUnggcmVhZHkgKi8KLSNkZWZpbmUgUzNDMjQxMl9TUFNUQV9SRUFEWV9PUkcJICAoMTw8MykKLQotI2RlZmluZSBTM0MyNDEwX1NQUElOCSAoMHgwOCkKLQotI2RlZmluZSBTM0MyNDEwX1NQUElOX0VOTVVMCSAgKDE8PDIpCS8qIE11bHRpIE1hc3RlciBFcnJvciBkZXRlY3QgKi8KLSNkZWZpbmUgUzNDMjQxMF9TUFBJTl9SRVNFUlZFRAkgICgxPDwxKQotI2RlZmluZSBTM0MyNDEwX1NQUElOX0tFRVAJICAoMTw8MCkJLyogTWFzdGVyIE91dCBrZWVwICovCi0KLSNkZWZpbmUgUzNDMjQxMF9TUFBSRQkgKDB4MEMpCi0jZGVmaW5lIFMzQzI0MTBfU1BUREFUCSAoMHgxMCkKLSNkZWZpbmUgUzNDMjQxMF9TUFJEQVQJICgweDE0KQotCi0jZGVmaW5lIFMzQzI0MTJfVFhGSUZPCSAoMHgxOCkKLSNkZWZpbmUgUzNDMjQxMl9SWEZJRk8JICgweDE4KQotI2RlZmluZSBTM0MyNDEyX1NQRklDCSAoMHgyNCkKLQotCi0jZW5kaWYgLyogX19BU01fQVJDSF9SRUdTX1NQSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtdWRjLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3JlZ3MtdWRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGQ0YTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvcmVncy11ZGMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBIZXJiZXJ0IFBvZXR6bCA8aGVyYmVydEAxM3RoZmxvb3IuYXQ+Ci0gKgotICogVGhpcyBpbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfVURDX0gKLSNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1VEQ19ICi0KLSNkZWZpbmUgUzNDMjQxMF9VU0JEUkVHKHgpICh4KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0ZVTkNfQUREUl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE0MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE0NCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVBfSU5UX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE0OCkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JfSU5UX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE1OCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVBfSU5UX0VOX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTVjKQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX1VTQl9JTlRfRU5fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNmMpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRlJBTUVfTlVNMV9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE3MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRlJBTUVfTlVNMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE3NCkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjMCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxYzQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWM4KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjYykKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxZDApCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyMDApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjA0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDIwOCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjBjKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyMTApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDIxNCkKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX0NPTgkJUzNDMjQxMF9VU0JEUkVHKDB4MDIxOCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9VTklUCVMzQzI0MTBfVVNCRFJFRygweDAyMWMpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfRklGTwlTM0MyNDEwX1VTQkRSRUcoMHgwMjIwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX1RUQ19MCVMzQzI0MTBfVVNCRFJFRygweDAyMjQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfVFRDX00JUzNDMjQxMF9VU0JEUkVHKDB4MDIyOCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9UVENfSAlTM0MyNDEwX1VTQkRSRUcoMHgwMjJjKQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfQ09OCQlTM0MyNDEwX1VTQkRSRUcoMHgwMjQwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1VOSVQJUzNDMjQxMF9VU0JEUkVHKDB4MDI0NCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9GSUZPCVMzQzI0MTBfVVNCRFJFRygweDAyNDgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfVFRDX0wJUzNDMjQxMF9VU0JEUkVHKDB4MDI0YykKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9UVENfTQlTM0MyNDEwX1VTQkRSRUcoMHgwMjUwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1RUQ19ICVMzQzI0MTBfVVNCRFJFRygweDAyNTQpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyNTgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjVjKQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDI2MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjY0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyNjgpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDI2YykKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTkRFWF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNzgpCi0KLS8qIGluZGV4ZWQgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODApCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODQpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5fQ1NSMV9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODQpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOX0NTUjJfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTg4KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX09VVF9DU1IxX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTkwKQotI2RlZmluZSBTM0MyNDEwX1VEQ19PVVRfQ1NSMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5NCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMV9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5OCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0ZJRk9fQ05UMl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE5YykKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19GVU5DQUREUl9VUERBVEUJKDE8PDcpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX0lTT1VQCQkoMTw8NykgLy8gUi9XCi0jZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRVNFVAkJKDE8PDMpIC8vIFIKLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX1JFU1VNRQkJKDE8PDIpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfU1VTUEVORAkJKDE8PDEpIC8vIFIKLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX0VOU1VTUEVORAkoMTw8MCkgLy8gUi9XCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX0RFRkFVTFQJCTB4MDAKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVA0CQkoMTw8NCkgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAzCQkoMTw8MykgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAyCQkoMTw8MikgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAxCQkoMTw8MSkgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAwCQkoMTw8MCkgLy8gUi9XIChjbGVhciBvbmx5KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVAkoMTw8MikgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfUkVTVU1FCSgxPDwxKSAvLyBSL1cgKGNsZWFyIG9ubHkpCi0jZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVF9TVVNQRU5ECSgxPDwwKSAvLyBSL1cgKGNsZWFyIG9ubHkpCi0KLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDQJCSgxPDw0KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDMJCSgxPDwzKSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDIJCSgxPDwyKSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDEJCSgxPDwxKSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDAJCSgxPDwwKSAvLyBSL1cKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRFX1JFU0VUCSgxPDwyKSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5URV9TVVNQRU5ECSgxPDwwKSAvLyBSL1cKLQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMAkJKDB4MDApCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMQkJKDB4MDEpIC8vID8/Ci0jZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMgkJKDB4MDIpIC8vID8/Ci0jZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMwkJKDB4MDMpIC8vID8/Ci0jZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQNAkJKDB4MDQpIC8vID8/Ci0KLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfQ0xSRFQJCSgxPDw2KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfU0VOVFNUTAkoMTw8NSkgLy8gUi9XIChjbGVhciBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMV9TRU5EU1RMCSgxPDw0KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfRkZMVVNICSgxPDwzKSAvLyBXICAgKHNldCBvbmx5KQotI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMV9VTkRSVU4JKDE8PDIpIC8vIFIvVyAoY2xlYXIgb25seSkKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfUEtUUkRZCSgxPDwwKSAvLyBSL1cgKHNldCBvbmx5KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX0FVVE9TRVQJKDE8PDcpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMl9JU08JCSgxPDw2KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjJfTU9ERUlOCSgxPDw1KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjJfRE1BSUVOCSgxPDw0KSAvLyBSL1cKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9DTFJEVAkJKDE8PDcpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9TRU5UU1RMCSgxPDw2KSAvLyBSL1cgKGNsZWFyIG9ubHkpCi0jZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX1NFTkRTVEwJKDE8PDUpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9GRkxVU0gJKDE8PDQpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9ERVJST1IJKDE8PDMpIC8vIFIKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfT1ZSUlVOCSgxPDwyKSAvLyBSL1cgKGNsZWFyIG9ubHkpCi0jZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX1BLVFJEWQkoMTw8MCkgLy8gUi9XIChjbGVhciBvbmx5KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0FVVE9DTFIJKDE8PDcpIC8vIFIvVwotI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMl9JU08JCSgxPDw2KSAvLyBSL1cKLSNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjJfRE1BSUVOCSgxPDw1KSAvLyBSL1cKLQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX09QS1JEWQkoMTw8MCkKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9JUEtSRFkJKDE8PDEpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU0VOVFNUTAkoMTw8MikKLSNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9ERQkJKDE8PDMpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU0UJCSgxPDw0KQotI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTkRTVEwJKDE8PDUpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU09QS1RSRFkJKDE8PDYpCi0jZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU1NFCSgxPDw3KQotCi0jZGVmaW5lIFMzQzI0MTBfVURDX01BWFBfOAkJKDE8PDApCi0jZGVmaW5lIFMzQzI0MTBfVURDX01BWFBfMTYJCSgxPDwxKQotI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzMyCQkoMTw8MikKLSNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF82NAkJKDE8PDMpCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmFiNGFhZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQxMC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDEwIG1hY2hpbmUgZGlyZWN0b3J5Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0qLwotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEwCi0KLWV4dGVybiAgaW50IHMzYzI0MTBfaW5pdCh2b2lkKTsKLWV4dGVybiAgaW50IHMzYzI0MTBhX2luaXQodm9pZCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTBfbWFwX2lvKHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotCi1leHRlcm4gdm9pZCBzM2MyNDEwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKLQotI2Vsc2UKLSNkZWZpbmUgczNjMjQxMF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHMzYzI0MTBfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHMzYzI0MTBfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczNjMjQxMF9pbml0IE5VTEwKLSNkZWZpbmUgczNjMjQxMGFfaW5pdCBOVUxMCi0jZW5kaWYKLQotZXh0ZXJuIGludCBzM2MyNDEwX2Jhc2VjbGtfYWRkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDEyLmggYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxNWQzYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wbGF0LXMzYzI0eHgvczNjMjQxMi5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDEyIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTIKLQotZXh0ZXJuICBpbnQgczNjMjQxMl9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDEyX21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxMl9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLWV4dGVybiAgaW50IHMzYzI0MTJfYmFzZWNsa19hZGQodm9pZCk7Ci0jZWxzZQotI2RlZmluZSBzM2MyNDEyX2luaXRfY2xvY2tzIE5VTEwKLSNkZWZpbmUgczNjMjQxMl9pbml0X3VhcnRzIE5VTEwKLSNkZWZpbmUgczNjMjQxMl9tYXBfaW8gTlVMTAotI2RlZmluZSBzM2MyNDEyX2luaXQgTlVMTAotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0MTYuaCBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNjMDkwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQxNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogbGludXgvaW5jbHVkZS9hc20tYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgWWF1aGVuIEtoYXJ1emh5IDxqZWtob3JAZ21haWwuY29tPgotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDE2IGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTYKLQotc3RydWN0IHMzYzI0MTBfdWFydGNmZzsKLQotZXh0ZXJuICBpbnQgczNjMjQxNl9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDE2X21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxNl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQxNl9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLWV4dGVybiAgaW50IHMzYzI0MTZfYmFzZWNsa19hZGQodm9pZCk7Ci0KLSNlbHNlCi0jZGVmaW5lIHMzYzI0MTZfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2MyNDE2X2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzM2MyNDE2X21hcF9pbyBOVUxMCi0jZGVmaW5lIHMzYzI0MTZfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0My5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDQzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTcxNWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDQzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDMuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDQzIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDMKLQotc3RydWN0IHMzYzI0MTBfdWFydGNmZzsKLQotZXh0ZXJuICBpbnQgczNjMjQ0M19pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDQzX21hcF9pbyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0M19pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotZXh0ZXJuIHZvaWQgczNjMjQ0M19pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLWV4dGVybiAgaW50IHMzYzI0NDNfYmFzZWNsa19hZGQodm9pZCk7Ci0KLSNlbHNlCi0jZGVmaW5lIHMzYzI0NDNfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzM2MyNDQzX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzM2MyNDQzX21hcF9pbyBOVUxMCi0jZGVmaW5lIHMzYzI0NDNfaW5pdCBOVUxMCi0jZW5kaWYKLQotLyogY29tbW9uIGNvZGUgdXNlZCBieSBzM2MyNDQzIGFuZCBvdGhlcnMuCi0gKiBub3RlLCBub3QgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIGFyY2gvYXJtL21hY2gtczNjKiAqLwotCi1zdHJ1Y3QgY2xrOwkvKiBzb21lIGZpbGVzIGRvbid0IG5lZWQgY2xrLmggb3RoZXJ3aXNlICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50ICgqcGxsX2ZuKSh1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgYmFzZSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAoKmZkaXZfZm4pKHVuc2lnbmVkIGxvbmcgY2xrY29uMCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0NDNfY29tbW9uX3NldHVwX2Nsb2NrcyhwbGxfZm4gZ2V0X21wbGwsIGZkaXZfZm4gZmRpdik7Ci1leHRlcm4gdm9pZCBzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2NrcyhpbnQgeHRhbCwgcGxsX2ZuIGdldF9tcGxsLCBmZGl2X2ZuIGZkaXYpOwotCi1leHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7Ci1leHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7Ci1leHRlcm4gaW50IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9zKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7Ci0KLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZXBsbHJlZjsKLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfZXN5c2NsazsKLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfbXN5c2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9pbmNsdWRlL3BsYXQvczNjMjQ0eC5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZThkMGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3MzYzI0NHguaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoKLSAqIEhlYWRlciBmaWxlIGZvciBTM0MyNDQwIGFuZCBTM0MyNDQyIGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQ0MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDIpCi0KLWV4dGVybiB2b2lkIHMzYzI0NHhfbWFwX2lvKHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDR4X2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotCi1leHRlcm4gdm9pZCBzM2MyNDR4X2luaXRfY2xvY2tzKGludCB4dGFsKTsKLQotI2Vsc2UKLSNkZWZpbmUgczNjMjQ0eF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHMzYzI0NHhfaW5pdF91YXJ0cyBOVUxMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAotZXh0ZXJuICBpbnQgczNjMjQ0MF9pbml0KHZvaWQpOwotCi1leHRlcm4gdm9pZCBzM2MyNDQwX21hcF9pbyh2b2lkKTsKLSNlbHNlCi0jZGVmaW5lIHMzYzI0NDBfaW5pdCBOVUxMCi0jZGVmaW5lIHMzYzI0NDBfbWFwX2lvIE5VTEwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQyCi1leHRlcm4gIGludCBzM2MyNDQyX2luaXQodm9pZCk7Ci0KLWV4dGVybiB2b2lkIHMzYzI0NDJfbWFwX2lvKHZvaWQpOwotI2Vsc2UKLSNkZWZpbmUgczNjMjQ0Ml9pbml0IE5VTEwKLSNkZWZpbmUgczNjMjQ0Ml9tYXBfaW8gTlVMTAotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvaW5jbHVkZS9wbGF0L3VkYy5oIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC91ZGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzODg0MjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2luY2x1ZGUvcGxhdC91ZGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvdWRjLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KLSAqCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKgotICogIENoYW5nZWxvZzoKLSAqCTE0LU1hci0yMDA1CVJUUAlDcmVhdGVkIGZpbGUKLSAqCTAyLUF1Zy0yMDA1CVJUUAlGaWxlIHJlbmFtZQotICoJMDctU2VwLTIwMDUJQkpECU1pbm9yIGNsZWFudXBzLCBjaGFuZ2VkIGNtZCB0byBlbnVtCi0gKgkxOC1KYW4tMjAwNwlITVcJQWRkIHBlci1wbGF0Zm9ybSB2YnVzX2RyYXcgZnVuY3Rpb24KLSovCi0KLSNpZm5kZWYgX19BU01fQVJNX0FSQ0hfVURDX0gKLSNkZWZpbmUgX19BU01fQVJNX0FSQ0hfVURDX0gKLQotZW51bSBzM2MyNDEwX3VkY19jbWRfZSB7Ci0JUzNDMjQxMF9VRENfUF9FTkFCTEUJPSAxLAkvKiBQdWxsLXVwIGVuYWJsZSAgICAgICAgKi8KLQlTM0MyNDEwX1VEQ19QX0RJU0FCTEUJPSAyLAkvKiBQdWxsLXVwIGRpc2FibGUgICAgICAgKi8KLQlTM0MyNDEwX1VEQ19QX1JFU0VUCT0gMywJLyogVURDIHJlc2V0LCBpbiBjYXNlIG9mICovCi19OwotCi1zdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvIHsKLQl2b2lkCSgqdWRjX2NvbW1hbmQpKGVudW0gczNjMjQxMF91ZGNfY21kX2UpOwotIAl2b2lkCSgqdmJ1c19kcmF3KSh1bnNpZ25lZCBpbnQgbWEpOwotCi0JdW5zaWduZWQgaW50IHB1bGx1cF9waW47Ci0JdW5zaWduZWQgaW50IHB1bGx1cF9waW5faW52ZXJ0ZWQ7Ci0KLQl1bnNpZ25lZCBpbnQgdmJ1c19waW47Ci0JdW5zaWduZWQgY2hhciB2YnVzX3Bpbl9pbnZlcnRlZDsKLX07Ci0KLWV4dGVybiB2b2lkIF9faW5pdCBzM2MyNHh4X3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyAqKTsKLQotLyoqCi0gKiBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhIC0gUGxhdGZvcm0gZGF0YSBmb3IgVVNCIEhpZ2gtU3BlZWQgZ2FkZ2V0IGNvbnRyb2xsZXIuCi0gKiBAZXBudW06IE51bWJlciBvZiBlbmRwb2ludHMgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBjb250cm9sbGVyIGRyaXZlci4KLSAqIEBncGlvX2luaXQ6IFBsYXRmb3JtIHNwZWNpZmljIFVTQiByZWxhdGVkIEdQSU8gaW5pdGlhbGl6YXRpb24uCi0gKiBAZ3Bpb191bmluaXQ6IFBsYXRmb3JtIHNwZWNpZmljIFVTQiByZWxldGVkIEdQSU8gdW5pbml0aWFsemF0aW9uLgotICoKLSAqIFJlcHJlc2VudGF0aW9uIG9mIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBTM0MyNFhYIFVTQiAyLjAgSGlnaCBTcGVlZCBnYWRnZXQKLSAqIGNvbnRyb2xsZXJzLgotICovCi1zdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSB7Ci0JdW5zaWduZWQgaW50CWVwbnVtOwotCXZvaWQJCSgqZ3Bpb19pbml0KSh2b2lkKTsKLQl2b2lkCQkoKmdwaW9fdW5pbml0KSh2b2lkKTsKLX07Ci0KLWV4dGVybiB2b2lkIF9faW5pdCBzM2MyNHh4X2hzdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSAqcGQpOwotCi0jZW5kaWYgLyogX19BU01fQVJNX0FSQ0hfVURDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLWNsb2NrLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvczNjMjQ0My1jbG9jay5jCmluZGV4IDU5NTUyYzAuLjVhMjFiMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9zM2MyNDQzLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3MzYzI0NDMtY2xvY2suYwpAQCAtMTYwLDYgKzE2MCwxMjQgQEAKIAl9LAogfTsKIAorLyogYXJtZGl2CisgKgorICogdGhpcyBjbG9jayBpcyBzb3VyY2VkIGZyb20gbXN5c2NsayBhbmQgY2FuIGhhdmUgYSBudW1iZXIgb2YKKyAqIGRpdmlkZXIgdmFsdWVzIGFwcGxpZWQgdG8gaXQgdG8gdGhlbiBiZSBmZWQgaW50byBhcm1jbGsuCisqLworCitzdGF0aWMgdW5zaWduZWQgaW50ICphcm1kaXY7CitzdGF0aWMgaW50IG5yX2FybWRpdjsKK3N0YXRpYyBpbnQgYXJtZGl2bWFzazsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjQ0M19hcm1jbGtfcm91bmRyYXRlKHN0cnVjdCBjbGsgKmNsaywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50ID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGNhbGM7CisJdW5zaWduZWQgYmVzdCA9IDI1NjsgLyogYmlnZ2VyIHRoYW4gYW55IHZhbHVlICovCisJdW5zaWduZWQgZGl2OworCWludCBwdHI7CisKKwlpZiAoIW5yX2FybWRpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IG5yX2FybWRpdjsgcHRyKyspIHsKKwkJZGl2ID0gYXJtZGl2W3B0cl07CisJCWlmIChkaXYpIHsKKwkJCS8qIGNwdWZyZXEgcHJvdmlkZXMgMjY2bWh6IGFzIDI2NjY2NjAwMCBub3QgMjY2NjY2NjY2ICovCisJCQljYWxjID0gKHBhcmVudCAvIGRpdiAvIDEwMDApICogMTAwMDsKKwkJCWlmIChjYWxjIDw9IHJhdGUgJiYgZGl2IDwgYmVzdCkKKwkJCQliZXN0ID0gZGl2OworCQl9CisJfQorCisJcmV0dXJuIHBhcmVudCAvIGJlc3Q7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0NDNfYXJtY2xrX2dldHJhdGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBjbGtjb24wOworCWludCB2YWw7CisKKwlpZiAoIW5yX2FybWRpdiB8fCAhYXJtZGl2bWFzaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtjb24wID0gX19yYXdfcmVhZGwoUzNDMjQ0M19DTEtESVYwKTsKKwljbGtjb24wICY9IGFybWRpdm1hc2s7CisJdmFsID0gY2xrY29uMCA+PiBTM0MyNDQzX0NMS0RJVjBfQVJNRElWX1NISUZUOworCisJcmV0dXJuIHJhdGUgLyBhcm1kaXZbdmFsXTsKK30KKworc3RhdGljIGludCBzM2MyNDQzX2FybWNsa19zZXRyYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50ID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGNhbGM7CisJdW5zaWduZWQgZGl2OworCXVuc2lnbmVkIGJlc3QgPSAyNTY7IC8qIGJpZ2dlciB0aGFuIGFueSB2YWx1ZSAqLworCWludCBwdHI7CisJaW50IHZhbCA9IC0xOworCisJaWYgKCFucl9hcm1kaXYgfHwgIWFybWRpdm1hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBucl9hcm1kaXY7IHB0cisrKSB7CisJCWRpdiA9IGFybWRpdltwdHJdOworCQlpZiAoZGl2KSB7CisJCQkvKiBjcHVmcmVxIHByb3ZpZGVzIDI2Nm1oeiBhcyAyNjY2NjYwMDAgbm90IDI2NjY2NjY2NiAqLworCQkJY2FsYyA9IChwYXJlbnQgLyBkaXYgLyAxMDAwKSAqIDEwMDA7CisJCQlpZiAoY2FsYyA8PSByYXRlICYmIGRpdiA8IGJlc3QpIHsKKwkJCQliZXN0ID0gZGl2OworCQkJCXZhbCA9IHB0cjsKKwkJCX0KKwkJfQorCX0KKworCWlmICh2YWwgPj0gMCkgeworCQl1bnNpZ25lZCBsb25nIGNsa2NvbjA7CisKKwkJY2xrY29uMCA9IF9fcmF3X3JlYWRsKFMzQzI0NDNfQ0xLRElWMCk7CisJCWNsa2NvbjAgJj0gfmFybWRpdm1hc2s7CisJCWNsa2NvbjAgfD0gdmFsIDw8IFMzQzI0NDNfQ0xLRElWMF9BUk1ESVZfU0hJRlQ7CisJCV9fcmF3X3dyaXRlbChjbGtjb24wLCBTM0MyNDQzX0NMS0RJVjApOworCX0KKworCXJldHVybiAodmFsID09IC0xKSA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtfYXJtZGl2ID0geworCS5uYW1lCQk9ICJhcm1kaXYiLAorCS5wYXJlbnQJCT0gJmNsa19tc3lzY2xrLmNsaywKKwkub3BzCQk9ICYoc3RydWN0IGNsa19vcHMpIHsKKwkJLnJvdW5kX3JhdGUgPSBzM2MyNDQzX2FybWNsa19yb3VuZHJhdGUsCisJCS5nZXRfcmF0ZSA9IHMzYzI0NDNfYXJtY2xrX2dldHJhdGUsCisJCS5zZXRfcmF0ZSA9IHMzYzI0NDNfYXJtY2xrX3NldHJhdGUsCisJfSwKK307CisKKy8qIGFybWNsaworICoKKyAqIHRoaXMgaXMgdGhlIGNsb2NrIGZlZCBpbnRvIHRoZSBBUk0gY29yZSBpdHNlbGYsIGZyb20gYXJtZGl2IG9yIGZyb20gaGNsay4KKyAqLworCitzdGF0aWMgc3RydWN0IGNsayAqY2xrX2FybV9zb3VyY2VzW10gPSB7CisJWzBdID0gJmNsa19hcm1kaXYsCisJWzFdID0gJmNsa19oLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19hcm0gPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImFybWNsayIsCisJfSwKKwkuc291cmNlcyA9ICYoc3RydWN0IGNsa3NyY19zb3VyY2VzKSB7CisJCS5zb3VyY2VzID0gY2xrX2FybV9zb3VyY2VzLAorCQkubnJfc291cmNlcyA9IEFSUkFZX1NJWkUoY2xrX2FybV9zb3VyY2VzKSwKKwl9LAorCS5yZWdfc3JjID0geyAucmVnID0gUzNDMjQ0M19DTEtESVYwLCAuc2l6ZSA9IDEsIC5zaGlmdCA9IDEzIH0sCit9OworCiAvKiB1c2Job3N0CiAgKgogICogdXNiIGhvc3QgYnVzLWNsb2NrLCB1c3VhbGx5IDQ4TUh6IHRvIHByb3ZpZGUgVVNCIGJ1cyBjbG9jayB0aW1pbmcKQEAgLTIwNSw5ICszMjMsNjQgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kyc19leHQgPSB7CisJLm5hbWUJCT0gImkycy1leHQiLAorfTsKKworLyogaTJzX2VwbGxkaXYKKyAqCisgKiBUaGlzIGNsb2NrIGlzIHRoZSBvdXRwdXQgZnJvbSB0aGUgSTJTIGRpdmlzb3Igb2YgRVNZU0NMSywgYW5kIGlzIHNlcGFyYXRlCisgKiBmcm9tIHRoZSBtdXggdGhhdCBjb21lcyBhZnRlciBpdCAoY2Fubm90IG1lcmdlIGludG8gb25lIHNpbmdsZSBjbG9jaykKKyovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrc3JjX2NsayBjbGtfaTJzX2VwbGxkaXYgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImkycy1lcGxsZGl2IiwKKwkJLnBhcmVudAkJPSAmY2xrX2VzeXNjbGsuY2xrLAorCX0sCisJLnJlZ19kaXYgPSB7IC5yZWcgPSBTM0MyNDQzX0NMS0RJVjEsIC5zaXplID0gNCwgLnNoaWZ0ID0gMTIsIH0sCit9OworCisvKiBpMnMtcmVmCisgKgorICogaTJzIGJ1cyByZWZlcmVuY2UgY2xvY2ssIHNlbGVjdGFibGUgZnJvbSBleHRlcm5hbCwgZXN5c2NsayBvciBlcGxscmVmCisgKgorICogTm90ZSwgdGhpcyB1c2VkIHRvIGJlIHR3byBjbG9ja3MsIGJ1dCB3YXMgY29tcHJlc3NlZCBpbnRvIG9uZS4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfaTJzX3NyY2xpc3RbXSA9IHsKKwlbMF0gPSAmY2xrX2kyc19lcGxsZGl2LmNsaywKKwlbMV0gPSAmY2xrX2kyc19leHQsCisJWzJdID0gJmNsa19lcGxscmVmLmNsaywKKwlbM10gPSAmY2xrX2VwbGxyZWYuY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19pMnMgPSB7CisJLmNsawk9IHsKKwkJLm5hbWUJCT0gImkycy1pZiIsCisJCS5jdHJsYml0CT0gUzNDMjQ0M19TQ0xLQ09OX0kyU0NMSywKKwkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcywKKworCX0sCisJLnNvdXJjZXMgPSAmKHN0cnVjdCBjbGtzcmNfc291cmNlcykgeworCQkuc291cmNlcyA9IGNsa19pMnNfc3JjbGlzdCwKKwkJLm5yX3NvdXJjZXMgPSBBUlJBWV9TSVpFKGNsa19pMnNfc3JjbGlzdCksCisJfSwKKwkucmVnX3NyYyA9IHsgLnJlZyA9IFMzQzI0NDNfQ0xLU1JDLCAuc2l6ZSA9IDIsIC5zaGlmdCA9IDE0IH0sCit9OwogCiBzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19vZmZbXSA9IHsKIAl7CisJCS5uYW1lCQk9ICJpaXMiLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDQzX2Nsa2Nvbl9lbmFibGVfcCwKKwkJLmN0cmxiaXQJPSBTM0MyNDQzX1BDTEtDT05fSUlTLAorCX0sIHsKKwkJLm5hbWUJCT0gImhzc3BpIiwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQ0M19jbGtjb25fZW5hYmxlX3AsCisJCS5jdHJsYml0CT0gUzNDMjQ0M19QQ0xLQ09OX0hTU1BJLAorCX0sIHsKIAkJLm5hbWUJCT0gImFkYyIsCiAJCS5wYXJlbnQJCT0gJmNsa19wLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9wLApAQCAtMjUzLDYgKzQyNiw3IEBACiAJCS5jdHJsYml0CT0gUzNDMjQ0M19IQ0xLQ09OX0RNQTUsCiAJfSwgewogCQkubmFtZQkJPSAiaHNtbWMiLAorCQkuZGV2bmFtZQk9ICJzM2Mtc2RoY2kuMSIsCiAJCS5wYXJlbnQJCT0gJmNsa19oLAogCQkuZW5hYmxlCQk9IHMzYzI0NDNfY2xrY29uX2VuYWJsZV9oLAogCQkuY3RybGJpdAk9IFMzQzI0NDNfSENMS0NPTl9IU01NQywKQEAgLTM0Nyw4ICs1MjEsNyBAQAogCiAvKiBFUExMQ09OIGNvbXBhdGlibGUgZW5vdWdoIHRvIGdldCBvbi9vZmYgaW5mb3JtYXRpb24gKi8KIAotdm9pZCBfX2luaXRfb3JfY3B1ZnJlcSBzM2MyNDQzX2NvbW1vbl9zZXR1cF9jbG9ja3MocGxsX2ZuIGdldF9tcGxsLAotCQkJCQkJICAgZmRpdl9mbiBnZXRfZmRpdikKK3ZvaWQgX19pbml0X29yX2NwdWZyZXEgczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKHBsbF9mbiBnZXRfbXBsbCkKIHsKIAl1bnNpZ25lZCBsb25nIGVwbGxjb24gPSBfX3Jhd19yZWFkbChTM0MyNDQzX0VQTExDT04pOwogCXVuc2lnbmVkIGxvbmcgbXBsbGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0NDNfTVBMTENPTik7CkBAIC0zNjgsNyArNTQxLDcgQEAKIAlwbGwgPSBnZXRfbXBsbChtcGxsY29uLCB4dGFsKTsKIAljbGtfbXN5c2Nsay5jbGsucmF0ZSA9IHBsbDsKIAotCWZjbGsgPSBwbGwgLyBnZXRfZmRpdihjbGtkaXYwKTsKKwlmY2xrID0gY2xrX2dldF9yYXRlKCZjbGtfYXJtZGl2KTsKIAloY2xrID0gczNjMjQ0M19wcmVkaXZfZ2V0cmF0ZSgmY2xrX3ByZWRpdik7CiAJaGNsayAvPSBzM2MyNDQzX2dldF9oZGl2KGNsa2RpdjApOwogCXBjbGsgPSBoY2xrIC8gKChjbGtkaXYwICYgUzNDMjQ0M19DTEtESVYwX0hBTEZfUENMSykgPyAyIDogMSk7CkBAIC00MDMsMjAgKzU3NiwyOSBAQAogCSZjbGtfZXh0LAogCSZjbGtfZXBsbCwKIAkmY2xrX3VzYl9idXMsCisJJmNsa19hcm1kaXYsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa3NyY19jbGsgKmNsa3NyY3NbXSBfX2luaXRkYXRhID0geworCSZjbGtfaTJzX2VwbGxkaXYsCisJJmNsa19pMnMsCiAJJmNsa191c2JfYnVzX2hvc3QsCiAJJmNsa19lcGxscmVmLAogCSZjbGtfZXN5c2NsaywKIAkmY2xrX21zeXNjbGssCisJJmNsa19hcm0sCiB9OwogCiB2b2lkIF9faW5pdCBzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2NrcyhpbnQgeHRhbCwgcGxsX2ZuIGdldF9tcGxsLAotCQkJCSAgICAgICBmZGl2X2ZuIGdldF9mZGl2KQorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRpdnMsIGludCBucl9kaXZzLAorCQkJCSAgICAgICBpbnQgZGl2bWFzaykKIHsKIAlpbnQgcHRyOwogCisJYXJtZGl2ID0gZGl2czsKKwlucl9hcm1kaXYgPSBucl9kaXZzOworCWFybWRpdm1hc2sgPSBkaXZtYXNrOworCiAJLyogczNjMjQ0MyBwYXJlbnRzIGggYW5kIHAgY2xvY2tzIGZyb20gcHJlZGl2ICovCiAJY2xrX2gucGFyZW50ID0gJmNsa19wcmVkaXY7CiAJY2xrX3AucGFyZW50ID0gJmNsa19wcmVkaXY7CkBAIC00MzcsNSArNjE5LDUgQEAKIAlzM2NfcmVnaXN0ZXJfY2xvY2tzKGluaXRfY2xvY2tzX29mZiwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19vZmYpKTsKIAlzM2NfZGlzYWJsZV9jbG9ja3MoaW5pdF9jbG9ja3Nfb2ZmLCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzX29mZikpOwogCi0JczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKGdldF9tcGxsLCBnZXRfZmRpdik7CisJczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKGdldF9tcGxsKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LXM1cC9LY29uZmlnCmluZGV4IDlhMTk3ZTUuLjliOTk2OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvS2NvbmZpZwpAQCAtNyw3ICs3LDcgQEAKIAogY29uZmlnIFBMQVRfUzVQCiAJYm9vbAotCWRlcGVuZHMgb24gKEFSQ0hfUzVQNjRYMCB8fCBBUkNIX1M1UEMxMDAgfHwgQVJDSF9TNVBWMjEwIHx8IEFSQ0hfRVhZTk9TNCkKKwlkZXBlbmRzIG9uIChBUkNIX1M1UDY0WDAgfHwgQVJDSF9TNVBDMTAwIHx8IEFSQ0hfUzVQVjIxMCB8fCBBUkNIX0VYWU5PUykKIAlkZWZhdWx0IHkKIAlzZWxlY3QgQVJNX1ZJQyBpZiAhQVJDSF9FWFlOT1M0CiAJc2VsZWN0IEFSTV9HSUMgaWYgQVJDSF9FWFlOT1M0CkBAIC0xNiw5ICsxNiw2IEBACiAJc2VsZWN0IFMzQ19HUElPX1RSQUNLCiAJc2VsZWN0IFM1UF9HUElPX0RSVlNUUgogCXNlbGVjdCBTQU1TVU5HX0dQSU9MSUJfNEJJVAotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDNjRYWAotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQRE9XTgotCXNlbGVjdCBTM0NfR1BJT19DRkdfUzNDMjRYWAogCXNlbGVjdCBQTEFUX1NBTVNVTkcKIAlzZWxlY3QgU0FNU1VOR19DTEtTUkMKIAlzZWxlY3QgU0FNU1VOR19JUlFfVklDX1RJTUVSCkBAIC00Miw2ICszOSwxMiBAQAogCWhlbHAKIAkgIFVzZSB0aGUgSGlnaCBSZXNvbHV0aW9uIHRpbWVyIHN1cHBvcnQKIAorY29uZmlnIFM1UF9QTQorCWJvb2wKKwloZWxwCisJICBDb21tb24gY29kZSBmb3IgcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0IG9uIFM1UCBhbmQgbmV3ZXIgU29DcworCSAgTm90ZTogRG8gbm90IHNlbGVjdCB0aGlzIGZvciBTNVA2NDQwIGFuZCBTNVA2NDUwLgorCiBjb21tZW50ICJTeXN0ZW0gTU1VIgogCiBjb25maWcgUzVQX1NZU1RFTV9NTVUKQEAgLTUwLDYgKzUzLDEyIEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgU3lzdGVtIE1NVQogCitjb25maWcgUzVQX1NMRUVQCisJYm9vbAorCWhlbHAKKwkgIEludGVybmFsIGNvbmZpZyBub2RlIHRvIGFwcGx5IGNvbW1vbiBTNVAgc2xlZXAgbWFuYWdlbWVudCBjb2RlLgorCSAgQ2FuIGJlIHNlbGVjdGVkIGJ5IFM1UCBhbmQgbmV3ZXIgU29DcyB3aXRoIHNpbWlsYXIgc2xlZXAgcHJvY2VkdXJlLgorCiBjb25maWcgUzVQX0RFVl9GSU1DMAogCWJvb2wKIAloZWxwCkBAIC03NSw2ICs4NCwxMSBAQAogCWhlbHAKIAkgIENvbXBpbGUgaW4gcGxhdGZvcm0gZGV2aWNlIGRlZmluaXRpb25zIGZvciBGSU1EIGNvbnRyb2xsZXIgMAogCitjb25maWcgUzVQX0RFVl9JMkNfSERNSVBIWQorCWJvb2wKKwloZWxwCisJICBDb21waWxlIGluIHBsYXRmb3JtIGRldmljZSBkZWZpbml0aW9ucyBmb3IgSTJDIEhETUlQSFkgY29udHJvbGxlcgorCiBjb25maWcgUzVQX0RFVl9NRkMKIAlib29sCiAJaGVscApAQCAtOTUsNiArMTA5LDExIEBACiAJaGVscAogCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMgZm9yIE1JUEktQ1NJUyBjaGFubmVsIDEKIAorY29uZmlnIFM1UF9ERVZfVFYKKwlib29sCisJaGVscAorCSAgQ29tcGlsZSBpbiBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgVFYgaW50ZXJmYWNlCisKIGNvbmZpZyBTNVBfREVWX1VTQl9FSENJCiAJYm9vbAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL01ha2VmaWxlIGIvYXJjaC9hcm0vcGxhdC1zNXAvTWFrZWZpbGUKaW5kZXggNGI1M2UwNC4uODc2MzQ0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1zNXAvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDYgQEAKIAogIyBDb3JlIGZpbGVzCiAKLW9iai15CQkJCSs9IGRldi1wbXUubwogb2JqLXkJCQkJKz0gZGV2LXVhcnQubwogb2JqLXkJCQkJKz0gY3B1Lm8KIG9iai15CQkJCSs9IGNsb2NrLm8KQEAgLTIwLDE5ICsxOSwxMCBAQAogb2JqLSQoQ09ORklHX1M1UF9FWFRfSU5UKQkrPSBpcnEtZWludC5vCiBvYmotJChDT05GSUdfUzVQX0dQSU9fSU5UKQkrPSBpcnEtZ3Bpb2ludC5vCiBvYmotJChDT05GSUdfUzVQX1NZU1RFTV9NTVUpCSs9IHN5c21tdS5vCi1vYmotJChDT05GSUdfUE0pCQkrPSBwbS5vCi1vYmotJChDT05GSUdfUE0pCQkrPSBpcnEtcG0ubworb2JqLSQoQ09ORklHX1M1UF9QTSkJCSs9IHBtLm8gaXJxLXBtLm8KK29iai0kKENPTkZJR19TNVBfU0xFRVApCQkrPSBzbGVlcC5vCiBvYmotJChDT05GSUdfUzVQX0hSVCkgCQkrPSBzNXAtdGltZS5vCiAKICMgZGV2aWNlcwogb2JqLSQoQ09ORklHX1M1UF9ERVZfTUZDKQkrPSBkZXYtbWZjLm8KLW9iai0kKENPTkZJR19TNVBfREVWX0ZJTUMwKQkrPSBkZXYtZmltYzAubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfRklNQzEpCSs9IGRldi1maW1jMS5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9GSU1DMikJKz0gZGV2LWZpbWMyLm8KLW9iai0kKENPTkZJR19TNVBfREVWX0ZJTUMzKQkrPSBkZXYtZmltYzMubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfRklNRDApCSs9IGRldi1maW1kMC5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9PTkVOQU5EKQkrPSBkZXYtb25lbmFuZC5vCi1vYmotJChDT05GSUdfUzVQX0RFVl9DU0lTMCkJKz0gZGV2LWNzaXMwLm8KLW9iai0kKENPTkZJR19TNVBfREVWX0NTSVMxKQkrPSBkZXYtY3NpczEubwotb2JqLSQoQ09ORklHX1M1UF9ERVZfVVNCX0VIQ0kpCSs9IGRldi1laGNpLm8KIG9iai0kKENPTkZJR19TNVBfU0VUVVBfTUlQSVBIWSkJKz0gc2V0dXAtbWlwaXBoeS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9jcHUuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2NwdS5jCmluZGV4IGJiYzJhYTcuLmE1Njk1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2NwdS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2NwdS5jCkBAIC0zMyw0OCArMzMsNjYgQEAKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczVwYzEwMFtdID0gIlM1UEMxMDAiOwogc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9zNXB2MjEwW10gPSAiUzVQVjIxMC9TNVBDMTEwIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfZXh5bm9zNDIxMFtdID0gIkVYWU5PUzQyMTAiOworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9leHlub3M0MjEyW10gPSAiRVhZTk9TNDIxMiI7CitzdGF0aWMgY29uc3QgY2hhciBuYW1lX2V4eW5vczQ0MTJbXSA9ICJFWFlOT1M0NDEyIjsKIAogc3RhdGljIHN0cnVjdCBjcHVfdGFibGUgY3B1X2lkc1tdIF9faW5pdGRhdGEgPSB7CiAJewotCQkuaWRjb2RlCQk9IDB4NTY0NDAxMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLmlkY29kZQkJPSBTNVA2NDQwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTNVA2NFhYX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHM1cDY0NDBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzNXA2NDQwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHM1cDY0NDBfaW5pdF91YXJ0cywKIAkJLmluaXQJCT0gczVwNjR4MF9pbml0LAogCQkubmFtZQkJPSBuYW1lX3M1cDY0NDAsCiAJfSwgewotCQkuaWRjb2RlCQk9IDB4MzY0NTAwMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLmlkY29kZQkJPSBTNVA2NDUwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTNVA2NFhYX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHM1cDY0NTBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzNXA2NDUwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHM1cDY0NTBfaW5pdF91YXJ0cywKIAkJLmluaXQJCT0gczVwNjR4MF9pbml0LAogCQkubmFtZQkJPSBuYW1lX3M1cDY0NTAsCiAJfSwgewotCQkuaWRjb2RlCQk9IDB4NDMxMDAwMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLmlkY29kZQkJPSBTNVBDMTAwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTNVBDMTAwX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHM1cGMxMDBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzNXBjMTAwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHM1cGMxMDBfaW5pdF91YXJ0cywKIAkJLmluaXQJCT0gczVwYzEwMF9pbml0LAogCQkubmFtZQkJPSBuYW1lX3M1cGMxMDAsCiAJfSwgewotCQkuaWRjb2RlCQk9IDB4NDMxMTAwMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZmZjAwMCwKKwkJLmlkY29kZQkJPSBTNVBWMjEwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBTNVBWMjEwX0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IHM1cHYyMTBfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBzNXB2MjEwX2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IHM1cHYyMTBfaW5pdF91YXJ0cywKIAkJLmluaXQJCT0gczVwdjIxMF9pbml0LAogCQkubmFtZQkJPSBuYW1lX3M1cHYyMTAsCiAJfSwgewotCQkuaWRjb2RlCQk9IDB4NDMyMTAwMDAsCi0JCS5pZG1hc2sJCT0gMHhmZmZlMDAwMCwKKwkJLmlkY29kZQkJPSBFWFlOT1M0MjEwX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBFWFlOT1M0X0NQVV9NQVNLLAogCQkubWFwX2lvCQk9IGV4eW5vczRfbWFwX2lvLAogCQkuaW5pdF9jbG9ja3MJPSBleHlub3M0X2luaXRfY2xvY2tzLAogCQkuaW5pdF91YXJ0cwk9IGV4eW5vczRfaW5pdF91YXJ0cywKLQkJLmluaXQJCT0gZXh5bm9zNF9pbml0LAorCQkuaW5pdAkJPSBleHlub3NfaW5pdCwKIAkJLm5hbWUJCT0gbmFtZV9leHlub3M0MjEwLAorCX0sIHsKKwkJLmlkY29kZQkJPSBFWFlOT1M0MjEyX0NQVV9JRCwKKwkJLmlkbWFzawkJPSBFWFlOT1M0X0NQVV9NQVNLLAorCQkubWFwX2lvCQk9IGV4eW5vczRfbWFwX2lvLAorCQkuaW5pdF9jbG9ja3MJPSBleHlub3M0X2luaXRfY2xvY2tzLAorCQkuaW5pdF91YXJ0cwk9IGV4eW5vczRfaW5pdF91YXJ0cywKKwkJLmluaXQJCT0gZXh5bm9zX2luaXQsCisJCS5uYW1lCQk9IG5hbWVfZXh5bm9zNDIxMiwKKwl9LCB7CisJCS5pZGNvZGUJCT0gRVhZTk9TNDQxMl9DUFVfSUQsCisJCS5pZG1hc2sJCT0gRVhZTk9TNF9DUFVfTUFTSywKKwkJLm1hcF9pbwkJPSBleHlub3M0X21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gZXh5bm9zNF9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBleHlub3M0X2luaXRfdWFydHMsCisJCS5pbml0CQk9IGV4eW5vc19pbml0LAorCQkubmFtZQkJPSBuYW1lX2V4eW5vczQ0MTIsCiAJfSwKIH07CiAKQEAgLTExNCwxMyArMTMyLDEzIEBACiB2b2lkIF9faW5pdCBzNXBfaW5pdF9pbyhzdHJ1Y3QgbWFwX2Rlc2MgKm1hY2hfZGVzYywKIAkJCWludCBzaXplLCB2b2lkIF9faW9tZW0gKmNwdWlkX2FkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBpZGNvZGU7Ci0KIAkvKiBpbml0aWFsaXplIHRoZSBpbyBkZXNjcmlwdG9ycyB3ZSBuZWVkIGZvciBpbml0aWFsaXphdGlvbiAqLwogCWlvdGFibGVfaW5pdChzNXBfaW9kZXNjLCBBUlJBWV9TSVpFKHM1cF9pb2Rlc2MpKTsKIAlpZiAobWFjaF9kZXNjKQogCQlpb3RhYmxlX2luaXQobWFjaF9kZXNjLCBzaXplKTsKIAotCWlkY29kZSA9IF9fcmF3X3JlYWRsKGNwdWlkX2FkZHIpOwotCXMzY19pbml0X2NwdShpZGNvZGUsIGNwdV9pZHMsIEFSUkFZX1NJWkUoY3B1X2lkcykpOworCS8qIGRldGVjdCBjcHUgaWQgYW5kIHJldi4gKi8KKwlzNXBfaW5pdF9jcHUoY3B1aWRfYWRkcik7CisKKwlzM2NfaW5pdF9jcHUoc2Ftc3VuZ19jcHVfaWQsIGNwdV9pZHMsIEFSUkFZX1NJWkUoY3B1X2lkcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWNzaXMwLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtY3NpczAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhYWJlZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtY3NpczAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIE1JUEktQ1NJUyBjaGFubmVsIDAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX21pcGlfY3NpczBfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFM1UF9QQV9NSVBJX0NTSVMwLAotCQkuZW5kICAgPSBTNVBfUEFfTUlQSV9DU0lTMCArIFNaXzRLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9NSVBJX0NTSVMwLAotCQkuZW5kICAgPSBJUlFfTUlQSV9DU0lTMCwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczAgPSB7Ci0JLm5hbWUJCSAgPSAiczVwLW1pcGktY3NpcyIsCi0JLmlkCQkgID0gMCwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzNXBfbWlwaV9jc2lzMF9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzNXBfbWlwaV9jc2lzMF9yZXNvdXJjZSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtY3NpczEuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1jc2lzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGI5MWI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1jc2lzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogUzVQIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgTUlQSS1DU0lTIGNoYW5uZWwgMQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzVQX1BBX01JUElfQ1NJUzEsCi0JCS5lbmQgICA9IFM1UF9QQV9NSVBJX0NTSVMxICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX01JUElfQ1NJUzEsCi0JCS5lbmQgICA9IElSUV9NSVBJX0NTSVMxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21pcGlfY3NpczEgPSB7Ci0JLm5hbWUJCSAgPSAiczVwLW1pcGktY3NpcyIsCi0JLmlkCQkgID0gMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZWhjaS5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWVoY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwODBmZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZWhjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvZWhjaS5oPgotI2luY2x1ZGUgPHBsYXQvdXNiLXBoeS5oPgotCi0vKiBVU0IgRUhDSSBIb3N0IENvbnRyb2xsZXIgcmVnaXN0cmF0aW9uICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9laGNpX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfRUhDSSwKLQkJLmVuZAk9IFM1UF9QQV9FSENJICsgU1pfMjU2IC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9VU0JfSE9TVCwKLQkJLmVuZAk9IElSUV9VU0JfSE9TVCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfQotfTsKLQotc3RhdGljIHU2NCBzNXBfZGV2aWNlX2VoY2lfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2VoY2kgPSB7Ci0JLm5hbWUJCT0gInM1cC1laGNpIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9laGNpX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZWhjaV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrID0gJnM1cF9kZXZpY2VfZWhjaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi12b2lkIF9faW5pdCBzNXBfZWhjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpwZCkKLXsKLQlzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKm5wZDsKLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEpLAotCQkJJnM1cF9kZXZpY2VfZWhjaSk7Ci0KLQlpZiAoIW5wZC0+cGh5X2luaXQpCi0JCW5wZC0+cGh5X2luaXQgPSBzNXBfdXNiX3BoeV9pbml0OwotCWlmICghbnBkLT5waHlfZXhpdCkKLQkJbnBkLT5waHlfZXhpdCA9IHM1cF91c2JfcGh5X2V4aXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzAuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDg3NzBmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICoKLSAqIEJhc2UgUzVQIEZJTUMwIHJlc291cmNlIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2ZpbWMwX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfRklNQzAsCi0JCS5lbmQJPSBTNVBfUEFfRklNQzAgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRklNQzAsCi0JCS5lbmQJPSBJUlFfRklNQzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHM1cF9maW1jMF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMCA9IHsKLQkubmFtZQkJPSAiczVwLWZpbWMiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZmltYzBfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cF9maW1jMF9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzNXBfZmltYzBfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzEuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUzYTk3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICoKLSAqIEJhc2UgUzVQIEZJTUMxIHJlc291cmNlIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2ZpbWMxX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfRklNQzEsCi0JCS5lbmQJPSBTNVBfUEFfRklNQzEgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRklNQzEsCi0JCS5lbmQJPSBJUlFfRklNQzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHM1cF9maW1jMV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMSA9IHsKLQkubmFtZQkJPSAiczVwLWZpbWMiLAotCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZmltYzFfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cF9maW1jMV9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzNXBfZmltYzFfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzIuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQyOTgxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICoKLSAqIEJhc2UgUzVQIEZJTUMyIHJlc291cmNlIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2ZpbWMyX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfRklNQzIsCi0JCS5lbmQJPSBTNVBfUEFfRklNQzIgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRklNQzIsCi0JCS5lbmQJPSBJUlFfRklNQzIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHM1cF9maW1jMl9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMiA9IHsKLQkubmFtZQkJPSAiczVwLWZpbWMiLAotCS5pZAkJPSAyLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZmltYzJfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cF9maW1jMl9yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzNXBfZmltYzJfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltYzMuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMxYmVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1jMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWMzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcwotICoKLSAqIEJhc2UgUzVQIEZJTUMzIHJlc291cmNlIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2ZpbWMzX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfRklNQzMsCi0JCS5lbmQJPSBTNVBfUEFfRklNQzMgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfRklNQzMsCi0JCS5lbmQJPSBJUlFfRklNQzMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHM1cF9maW1jM19kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMyA9IHsKLQkubmFtZQkJPSAiczVwLWZpbWMiLAotCS5pZAkJPSAzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZmltYzNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cF9maW1jM19yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzNXBfZmltYzNfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtZmltZDAuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1kMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI4YmI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1maW1kMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LWZpbWQwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIENvcmUgZmlsZSBmb3IgU2Ftc3VuZyBEaXNwbGF5IENvbnRyb2xsZXIgKEZJTUQpIGRyaXZlcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZmIuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1kMF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzVQX1BBX0ZJTUQwLAotCQkuZW5kCT0gUzVQX1BBX0ZJTUQwICsgU1pfMzJLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9GSU1EMF9WU1lOQywKLQkJLmVuZAk9IElSUV9GSU1EMF9WU1lOQywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IElSUV9GSU1EMF9GSUZPLAotCQkuZW5kCT0gSVJRX0ZJTUQwX0ZJRk8sCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzNdID0gewotCQkuc3RhcnQJPSBJUlFfRklNRDBfU1lTVEVNLAotCQkuZW5kCT0gSVJRX0ZJTUQwX1NZU1RFTSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1NjQgZmltZDBfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1kMCA9IHsKLQkubmFtZQkJPSAiczVwLWZiIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWQwX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzNXBfZmltZDBfcmVzb3VyY2UsCi0JLmRldgkJPSB7Ci0JCS5kbWFfbWFzawkJPSAmZmltZDBfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKLQotdm9pZCBfX2luaXQgczVwX2ZpbWQwX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhICpwZCkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSksCi0JCQkmczVwX2RldmljZV9maW1kMCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtbWZjLmMgYi9hcmNoL2FybS9wbGF0LXM1cC9kZXYtbWZjLmMKaW5kZXggOTQyMjZhMC4uYTMwZDM2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW1mYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1tZmMuYwpAQCAtMjIsNTYgKzIyLDYgQEAKICNpbmNsdWRlIDxwbGF0L2lycXMuaD4KICNpbmNsdWRlIDxwbGF0L21mYy5oPgogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9tZmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFM1UF9QQV9NRkMsCi0JCS5lbmQJPSBTNVBfUEFfTUZDICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9NRkMsCi0JCS5lbmQJPSBJUlFfTUZDLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjID0gewotCS5uYW1lCQk9ICJzNXAtbWZjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9tZmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHM1cF9tZmNfcmVzb3VyY2UsCi19OwotCi0vKgotICogTUZDIGhhcmR3YXJlIGhhcyAyIG1lbW9yeSBpbnRlcmZhY2VzIHdoaWNoIGFyZSBtb2RlbGxlZCBhcyB0d28gc2VwYXJhdGUKLSAqIHBsYXRmb3JtIGRldmljZXMgdG8gbGV0IGRtYS1tYXBwaW5nIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlbS4KLSAqCi0gKiBNRkMgcGFyZW50IGRldmljZSAoczVwX2RldmljZV9tZmMpIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgbWVtb3J5Ci0gKiBpbnRlcmZhY2Ugc3BlY2lmaWMgZGV2aWNlcyAoczVwX2RldmljZV9tZmNfbCBhbmQgczVwX2RldmljZV9tZmNfcikuCi0gKi8KLQotc3RhdGljIHU2NCBzNXBfbWZjX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19sID0gewotCS5uYW1lCQk9ICJzNXAtbWZjLWwiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBhcmVudAkJCT0gJnM1cF9kZXZpY2VfbWZjLmRldiwKLQkJLmRtYV9tYXNrCQk9ICZzNXBfbWZjX2RtYV9tYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjX3IgPSB7Ci0JLm5hbWUJCT0gInM1cC1tZmMtciIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkucGFyZW50CQkJPSAmczVwX2RldmljZV9tZmMuZGV2LAotCQkuZG1hX21hc2sJCT0gJnM1cF9tZmNfZG1hX21hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLX07Ci0KIHN0cnVjdCBzNXBfbWZjX3Jlc2VydmVkX21lbSB7CiAJcGh5c19hZGRyX3QJYmFzZTsKIAl1bnNpZ25lZCBsb25nCXNpemU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzMzZjOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9kZXYtb25lbmFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LW9uZW5hbmQuYwotICoKLSAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiAgS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KLSAqCi0gKiBTNVAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBPbmVOQU5EIGRldmljZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX29uZW5hbmRfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfT05FTkFORCwKLQkJLmVuZAk9IFM1UF9QQV9PTkVOQU5EICsgU1pfMTI4SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBTNVBfUEFfT05FTkFORF9ETUEsCi0JCS5lbmQJPSBTNVBfUEFfT05FTkFORF9ETUEgKyBTWl84SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJPSBJUlFfT05FTkFORF9BVURJLAotCQkuZW5kCT0gSVJRX09ORU5BTkRfQVVESSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9vbmVuYW5kID0gewotCS5uYW1lCQk9ICJzNXBjMTEwLW9uZW5hbmQiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX29uZW5hbmRfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzNXBfb25lbmFuZF9yZXNvdXJjZXMsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LXBtdS5jIGIvYXJjaC9hcm0vcGxhdC1zNXAvZGV2LXBtdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1NzZkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2Rldi1wbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9kZXYtcG11LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKLSAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BtdS5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9wbXVfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gSVJRX1BNVSwKLQkuZW5kCT0gSVJRX1BNVSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9wbXUgPSB7Ci0JLm5hbWUJCT0gImFybS1wbXUiLAotCS5pZAkJPSBBUk1fUE1VX0RFVklDRV9DUFUsCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZzNXBfcG11X3Jlc291cmNlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgczVwX3BtdV9pbml0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzNXBfZGV2aWNlX3BtdSk7Ci0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKHM1cF9wbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvY2FtcG9ydC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ODhjOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvY2FtcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoKLSAqIFM1UCBzZXJpZXMgY2FtZXJhIGludGVyZmFjZSBoZWxwZXIgZnVuY3Rpb25zCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIFBMQVRfUzVQX0NBTVBPUlRfSF8KLSNkZWZpbmUgUExBVF9TNVBfQ0FNUE9SVF9IXyBfX0ZJTEVfXwotCi1lbnVtIHM1cF9jYW1wb3J0X2lkIHsKLQlTNVBfQ0FNUE9SVF9BLAotCVM1UF9DQU1QT1JUX0IsCi19OwotCi0vKgotICogVGhlIGhlbHBlciBmdW5jdGlvbnMgdG8gY29uZmlndXJlIEdQSU8gZm9yIHRoZSBjYW1lcmEgcGFyYWxsZWwgYnVzLgotICogVGhlIGNhbWVyYSBwb3J0IGNhbiBiZSBtdWx0aXBsZXhlZCB3aXRoIGFueSBGSU1DIGVudGl0eSwgZXZlbiBtdWx0aXBsZQotICogRklNQyBlbnRpdGllcyBhcmUgYWxsb3dlZCB0byBiZSBhdHRhY2hlZCB0byBhIHNpbmdsZSBwb3J0IHNpbXVsdGFuZW91c2x5LgotICogVGhlc2UgZnVuY3Rpb25zIGFyZSB0byBiZSB1c2VkIGluIHRoZSBib2FyZCBzZXR1cCBjb2RlLgotICovCi1pbnQgczVwdjIxMF9maW1jX3NldHVwX2dwaW8oZW51bSBzNXBfY2FtcG9ydF9pZCBpZCk7Ci1pbnQgZXh5bm9zNF9maW1jX3NldHVwX2dwaW8oZW51bSBzNXBfY2FtcG9ydF9pZCBpZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2VoY2kuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9laGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTY4MTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2VoY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKLSAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX1BMQVRfUzVQX0VIQ0lfSAotI2RlZmluZSBfX1BMQVRfUzVQX0VIQ0lfSAotCi1zdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgewotCWludCAoKnBoeV9pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdHlwZSk7Ci0JaW50ICgqcGh5X2V4aXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB0eXBlKTsKLX07Ci0KLWV4dGVybiB2b2lkIHM1cF9laGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczVwX2VoY2lfcGxhdGRhdGEgKnBkKTsKLQotI2VuZGlmIC8qIF9fUExBVF9TNVBfRUhDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvZXh5bm9zNC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2V4eW5vczQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3Y2FhYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvZXh5bm9zNC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2V4eW5vczQuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIEhlYWRlciBmaWxlIGZvciBleHlub3M0IGNwdSBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLS8qIENvbW1vbiBpbml0IGNvZGUgZm9yIEVYWU5PUzQgcmVsYXRlZCBTb0NzICovCi0KLWV4dGVybiB2b2lkIGV4eW5vczRfY29tbW9uX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOwotZXh0ZXJuIHZvaWQgZXh5bm9zNF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7Ci1leHRlcm4gdm9pZCBleHlub3M0X3NldHVwX2Nsb2Nrcyh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19DUFVfRVhZTk9TNDIxMAotCi1leHRlcm4gIGludCBleHlub3M0X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBleHlub3M0X2luaXRfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgZXh5bm9zNF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBleHlub3M0X2luaXRfY2xvY2tzKGludCB4dGFsKTsKLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGV4eW5vczRfdGltZXI7Ci0KLSNkZWZpbmUgZXh5bm9zNF9pbml0X3VhcnRzIGV4eW5vczRfY29tbW9uX2luaXRfdWFydHMKLQotI2Vsc2UKLSNkZWZpbmUgZXh5bm9zNF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIGV4eW5vczRfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIGV4eW5vczRfbWFwX2lvIE5VTEwKLSNkZWZpbmUgZXh5bm9zNF9pbml0IE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9pcnFzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGRiZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L2lycXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9pcnFzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBDb21tb24gSVJRIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9JUlFTX0gKLSNkZWZpbmUgX19BU01fUExBVF9TNVBfSVJRU19IIF9fRklMRV9fCi0KLS8qIHdlIGtlZXAgdGhlIGZpcnN0IHNldCBvZiBDUFUgSVJRcyBvdXQgb2YgdGhlIHJhbmdlIG9mCi0gKiB0aGUgSVNBIHNwYWNlLCBzbyB0aGF0IHRoZSBQQzEwNCBoYXMgdGhlbSB0byBpdHNlbGYKLSAqIGFuZCB3ZSBkb24ndCBlbmQgdXAgaGF2aW5nIHRvIGRvIGhvcnJpYmxlIHRoaW5ncyB0byB0aGUKLSAqIHN0YW5kYXJkIElTQSBkcml2ZXJzLi4uLgotICoKLSAqIG5vdGUsIHNpbmNlIHdlJ3JlIHVzaW5nIHRoZSBWSUNzLCBvdXIgc3RhcnQgbXVzdCBiZSBhCi0gKiBtdWxpdHBsZSBvZiAzMiB0byBhbGxvdyB0aGUgY29tbW9uIGNvZGUgdG8gd29yawotICovCi0KLSNkZWZpbmUgUzVQX0lSUV9PRkZTRVQJCSgzMikKLQotI2RlZmluZSBTNVBfSVJRKHgpCQkoKHgpICsgUzVQX0lSUV9PRkZTRVQpCi0KLSNkZWZpbmUgUzVQX1ZJQzBfQkFTRQkJUzVQX0lSUSgwKQotI2RlZmluZSBTNVBfVklDMV9CQVNFCQlTNVBfSVJRKDMyKQotI2RlZmluZSBTNVBfVklDMl9CQVNFCQlTNVBfSVJRKDY0KQotI2RlZmluZSBTNVBfVklDM19CQVNFCQlTNVBfSVJRKDk2KQotCi0jZGVmaW5lIFZJQ19CQVNFKHgpCQkoUzVQX1ZJQzBfQkFTRSArICgoeCkqMzIpKQotCi0jZGVmaW5lIElSUV9WSUMwX0JBU0UJCVM1UF9WSUMwX0JBU0UKLSNkZWZpbmUgSVJRX1ZJQzFfQkFTRQkJUzVQX1ZJQzFfQkFTRQotI2RlZmluZSBJUlFfVklDMl9CQVNFCQlTNVBfVklDMl9CQVNFCi0KLS8qIFZJQyBiYXNlZCBJUlFzICovCi0KLSNkZWZpbmUgUzVQX0lSUV9WSUMwKHgpCQkoUzVQX1ZJQzBfQkFTRSArICh4KSkKLSNkZWZpbmUgUzVQX0lSUV9WSUMxKHgpCQkoUzVQX1ZJQzFfQkFTRSArICh4KSkKLSNkZWZpbmUgUzVQX0lSUV9WSUMyKHgpCQkoUzVQX1ZJQzJfQkFTRSArICh4KSkKLSNkZWZpbmUgUzVQX0lSUV9WSUMzKHgpCQkoUzVQX1ZJQzNfQkFTRSArICh4KSkKLQotI2RlZmluZSBTNVBfVElNRVJfSVJRKHgpCSgxMSArICh4KSkKLQotI2RlZmluZSBJUlFfVElNRVIwCQlTNVBfVElNRVJfSVJRKDApCi0jZGVmaW5lIElSUV9USU1FUjEJCVM1UF9USU1FUl9JUlEoMSkKLSNkZWZpbmUgSVJRX1RJTUVSMgkJUzVQX1RJTUVSX0lSUSgyKQotI2RlZmluZSBJUlFfVElNRVIzCQlTNVBfVElNRVJfSVJRKDMpCi0jZGVmaW5lIElSUV9USU1FUjQJCVM1UF9USU1FUl9JUlEoNCkKLQotI2RlZmluZSBJUlFfRUlOVCh4KQkJKCh4KSA8IDE2ID8gKCh4KSArIFM1UF9FSU5UX0JBU0UxKSBcCi0JCQkJCTogKCh4KSAtIDE2ICsgUzVQX0VJTlRfQkFTRTIpKQotCi0jZGVmaW5lIEVJTlRfT0ZGU0VUKGlycSkJKChpcnEpIDwgUzVQX0VJTlRfQkFTRTIgPyBcCi0JCQkJCQkoKGlycSkgLSBTNVBfRUlOVF9CQVNFMSkgOiBcCi0JCQkJCQkoKGlycSkgKyAxNiAtIFM1UF9FSU5UX0JBU0UyKSkKLQotI2RlZmluZSBJUlFfRUlOVF9CSVQoeCkJCUVJTlRfT0ZGU0VUKHgpCi0KLS8qIFR5cGljYWxseSBvbmx5IGEgZmV3IGdwaW8gY2hpcHMgcmVxdWlyZSBncGlvIGludGVycnVwdCBzdXBwb3J0LgotICAgVG8gYXZvaWQgbWVtb3J5IHdhc3RlIGlycSBkZXNjcmlwdG9ycyBhcmUgYWxsb2NhdGVkIG9ubHkgZm9yCi0gICBTNVBfR1BJT0lOVF9HUk9VUF9DT1VOVCBjaGlwcywgZWFjaCB3aXRoIHRvdGFsIG51bWJlciBvZgotICAgUzVQX0dQSU9JTlRfR1JPVVBfU0laRSBwaW5zL2lycXMuIEVhY2ggR1BJT0lOVCBncm91cCBjYW4gYmUgYXNzaWdlZAotICAgdG8gYW55IGdwaW8gY2hpcCB3aXRoIHRoZSBzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoKSBmdW5jdGlvbiAqLwotI2RlZmluZSBTNVBfR1BJT0lOVF9HUk9VUF9DT1VOVCA0Ci0jZGVmaW5lIFM1UF9HUElPSU5UX0dST1VQX1NJWkUJOAotI2RlZmluZSBTNVBfR1BJT0lOVF9DT1VOVAkoUzVQX0dQSU9JTlRfR1JPVVBfQ09VTlQgKiBTNVBfR1BJT0lOVF9HUk9VUF9TSVpFKQotCi0vKiBJUlEgdHlwZXMgY29tbW9uIGZvciBhbGwgczVwIHBsYXRmb3JtcyAqLwotI2RlZmluZSBTNVBfSVJRX1RZUEVfTEVWRUxfTE9XCQkoMHgwMCkKLSNkZWZpbmUgUzVQX0lSUV9UWVBFX0xFVkVMX0hJR0gJCSgweDAxKQotI2RlZmluZSBTNVBfSVJRX1RZUEVfRURHRV9GQUxMSU5HCSgweDAyKQotI2RlZmluZSBTNVBfSVJRX1RZUEVfRURHRV9SSVNJTkcJKDB4MDMpCi0jZGVmaW5lIFM1UF9JUlFfVFlQRV9FREdFX0JPVEgJCSgweDA0KQotCi0jZW5kaWYgLyogX19BU01fUExBVF9TNVBfSVJRU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMzU1MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21hcC1zNXAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogUzVQIC0gTWVtb3J5IG1hcCBkZWZpbml0aW9ucwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX1BMQVRfTUFQX1M1UF9ICi0jZGVmaW5lIF9fQVNNX1BMQVRfTUFQX1M1UF9IIF9fRklMRV9fCi0KLSNkZWZpbmUgUzVQX1ZBX0NISVBJRAkJUzNDX0FERFIoMHgwMjAwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0NNVQkJUzNDX0FERFIoMHgwMjEwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX1BNVQkJUzNDX0FERFIoMHgwMjE4MDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0dQSU8JCVMzQ19BRERSKDB4MDIyMDAwMDApCi0jZGVmaW5lIFM1UF9WQV9HUElPMQkJUzVQX1ZBX0dQSU8KLSNkZWZpbmUgUzVQX1ZBX0dQSU8yCQlTM0NfQUREUigweDAyMjQwMDAwKQotI2RlZmluZSBTNVBfVkFfR1BJTzMJCVMzQ19BRERSKDB4MDIyODAwMDApCi0KLSNkZWZpbmUgUzVQX1ZBX1NZU1JBTQkJUzNDX0FERFIoMHgwMjQwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0RNQzAJCVMzQ19BRERSKDB4MDI0NDAwMDApCi0jZGVmaW5lIFM1UF9WQV9ETUMxCQlTM0NfQUREUigweDAyNDgwMDAwKQotI2RlZmluZSBTNVBfVkFfU1JPTUMJCVMzQ19BRERSKDB4MDI0QzAwMDApCi0KLSNkZWZpbmUgUzVQX1ZBX1NZU1RJTUVSCQlTM0NfQUREUigweDAyNTAwMDAwKQotI2RlZmluZSBTNVBfVkFfTDJDQwkJUzNDX0FERFIoMHgwMjYwMDAwMCkKLQotI2RlZmluZSBTNVBfVkFfQ09NQklORVJfQkFTRQlTM0NfQUREUigweDAyNzAwMDAwKQotI2RlZmluZSBTNVBfVkFfQ09NQklORVIoeCkJKFM1UF9WQV9DT01CSU5FUl9CQVNFICsgKCh4KSA+PiAyKSAqIDB4MTApCi0KLSNkZWZpbmUgUzVQX1ZBX0NPUkVQRVJJX0JBU0UJUzNDX0FERFIoMHgwMjgwMDAwMCkKLSNkZWZpbmUgUzVQX1ZBX0NPUkVQRVJJKHgpCShTNVBfVkFfQ09SRVBFUklfQkFTRSArICh4KSkKLSNkZWZpbmUgUzVQX1ZBX1NDVQkJUzVQX1ZBX0NPUkVQRVJJKDB4MCkKLSNkZWZpbmUgUzVQX1ZBX1RXRAkJUzVQX1ZBX0NPUkVQRVJJKDB4NjAwKQotCi0jZGVmaW5lIFM1UF9WQV9HSUNfQ1BVCQlTM0NfQUREUigweDAyODEwMDAwKQotI2RlZmluZSBTNVBfVkFfR0lDX0RJU1QJCVMzQ19BRERSKDB4MDI4MjAwMDApCi0KLSNkZWZpbmUgUzNDX1ZBX1VTQl9IU1BIWQlTM0NfQUREUigweDAyOTAwMDAwKQotCi0jZGVmaW5lIFZBX1ZJQyh4KQkJKFMzQ19WQV9JUlEgKyAoKHgpICogMHgxMDAwMCkpCi0jZGVmaW5lIFZBX1ZJQzAJCQlWQV9WSUMoMCkKLSNkZWZpbmUgVkFfVklDMQkJCVZBX1ZJQygxKQotI2RlZmluZSBWQV9WSUMyCQkJVkFfVklDKDIpCi0jZGVmaW5lIFZBX1ZJQzMJCQlWQV9WSUMoMykKLQotI2RlZmluZSBTNVBfVkFfVUFSVCh4KQkJKFMzQ19WQV9VQVJUICsgKCh4KSAqIFMzQ19VQVJUX09GRlNFVCkpCi0jZGVmaW5lIFM1UF9WQV9VQVJUMAkJUzVQX1ZBX1VBUlQoMCkKLSNkZWZpbmUgUzVQX1ZBX1VBUlQxCQlTNVBfVkFfVUFSVCgxKQotI2RlZmluZSBTNVBfVkFfVUFSVDIJCVM1UF9WQV9VQVJUKDIpCi0jZGVmaW5lIFM1UF9WQV9VQVJUMwkJUzVQX1ZBX1VBUlQoMykKLQotI2lmbmRlZiBTM0NfVUFSVF9PRkZTRVQKLSNkZWZpbmUgUzNDX1VBUlRfT0ZGU0VUCQkoMHg0MDApCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfTUFQX1M1UF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWZjLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWZjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OTdmOGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21mYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX1BMQVRfUzVQX01GQ19ICi0jZGVmaW5lIF9fUExBVF9TNVBfTUZDX0gKLQotLyoqCi0gKiBzNXBfbWZjX3Jlc2VydmVfbWVtIC0gZnVuY3Rpb24gdG8gZWFybHkgcmVzZXJ2ZSBtZW1vcnkgZm9yIE1GQyBkcml2ZXIKLSAqIEByYmFzZToJYmFzZSBhZGRyZXNzIGZvciBNRkMgJ3JpZ2h0JyBtZW1vcnkgaW50ZXJmYWNlCi0gKiBAcnNpemU6CXNpemUgb2YgdGhlIG1lbW9yeSByZXNlcnZlZCBmb3IgTUZDICdyaWdodCcgaW50ZXJmYWNlCi0gKiBAbGJhc2U6CWJhc2UgYWRkcmVzcyBmb3IgTUZDICdsZWZ0JyBtZW1vcnkgaW50ZXJmYWNlCi0gKiBAbHNpemU6CXNpemUgb2YgdGhlIG1lbW9yeSByZXNlcnZlZCBmb3IgTUZDICdsZWZ0JyBpbnRlcmZhY2UKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc2VydmVzIHN5c3RlbSBtZW1vcnkgZm9yIGJvdGggTUZDIGRldmljZSBtZW1vcnkKLSAqIGludGVyZmFjZXMgYW5kIHJlZ2lzdGVycyBpdCB0byByZXNwZWN0aXZlIHN0cnVjdCBkZXZpY2UgZW50cmllcyBhcwotICogY29oZXJlbnQgbWVtb3J5LgotICovCi12b2lkIF9faW5pdCBzNXBfbWZjX3Jlc2VydmVfbWVtKHBoeXNfYWRkcl90IHJiYXNlLCB1bnNpZ25lZCBpbnQgcnNpemUsCi0JCQkJcGh5c19hZGRyX3QgbGJhc2UsIHVuc2lnbmVkIGludCBsc2l6ZSk7Ci0KLSNlbmRpZiAvKiBfX1BMQVRfUzVQX01GQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWlwaV9jc2lzLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvbWlwaV9jc2lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDI1NGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgotICogUzVQIHNlcmllcyBNSVBJIENTSSBzbGF2ZSBkZXZpY2Ugc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBQTEFUX1M1UF9NSVBJX0NTSVNfSF8KLSNkZWZpbmUgUExBVF9TNVBfTUlQSV9DU0lTX0hfIF9fRklMRV9fCi0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7Ci0KLS8qKgotICogc3RydWN0IHM1cF9wbGF0Zm9ybV9taXBpX2NzaXMgLSBwbGF0Zm9ybSBkYXRhIGZvciBTNVAgTUlQSS1DU0lTIGRyaXZlcgotICogQGNsa19yYXRlOiBidXMgY2xvY2sgZnJlcXVlbmN5Ci0gKiBAbGFuZXM6IG51bWJlciBvZiBkYXRhIGxhbmVzIHVzZWQKLSAqIEBhbGlnbm1lbnQ6IGRhdGEgYWxpZ25tZW50IGluIGJpdHMKLSAqIEBoc19zZXR0bGU6IEhTLVJYIHNldHRsZSB0aW1lCi0gKiBAZml4ZWRfcGh5X3ZkZDogZmFsc2UgdG8gZW5hYmxlIGV4dGVybmFsIEQtUEhZIHJlZ3VsYXRvciBtYW5hZ2VtZW50IGluIHRoZQotICoJCSAgIGRyaXZlciBvciB0cnVlIGluIGNhc2UgdGhpcyByZWd1bGF0b3IgaGFzIG5vIGVuYWJsZSBmdW5jdGlvbgotICogQHBoeV9lbmFibGU6IHBvaW50ZXIgdG8gYSBjYWxsYmFjayBjb250cm9sbGluZyBELVBIWSBlbmFibGUvcmVzZXQKLSAqLwotc3RydWN0IHM1cF9wbGF0Zm9ybV9taXBpX2NzaXMgewotCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7Ci0JdTggbGFuZXM7Ci0JdTggYWxpZ25tZW50OwotCXU4IGhzX3NldHRsZTsKLQlib29sIGZpeGVkX3BoeV92ZGQ7Ci0JaW50ICgqcGh5X2VuYWJsZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgYm9vbCBvbik7Ci19OwotCi0vKioKLSAqIHM1cF9jc2lzX3BoeV9lbmFibGUgLSBnbG9iYWwgTUlQSS1DU0kgcmVjZWl2ZXIgRC1QSFkgY29udHJvbAotICogQHBkZXY6IE1JUEktQ1NJUyBwbGF0Zm9ybSBkZXZpY2UKLSAqIEBvbjogdHJ1ZSB0byBlbmFibGUgRC1QSFkgYW5kIGRlYXNzZXJ0IGl0cyByZXNldAotICoJZmFsc2UgdG8gZGlzYWJsZSBELVBIWQotICovCi1pbnQgczVwX2NzaXNfcGh5X2VuYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBib29sIG9uKTsKLQotI2VuZGlmIC8qIFBMQVRfUzVQX01JUElfQ1NJU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3BsbC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3BsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI4ZmFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9wbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcGxsLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBQTEwgY29kZQotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvcGxsLmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2RlZmluZSBQTEw0NVhYX01ESVZfTUFTSwkoMHgzRkYpCi0jZGVmaW5lIFBMTDQ1WFhfUERJVl9NQVNLCSgweDNGKQotI2RlZmluZSBQTEw0NVhYX1NESVZfTUFTSwkoMHg3KQotI2RlZmluZSBQTEw0NVhYX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBQTEw0NVhYX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFBMTDQ1WFhfU0RJVl9TSElGVAkoMCkKLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi1lbnVtIHBsbDQ1eHhfdHlwZV90IHsKLQlwbGxfNDUwMCwKLQlwbGxfNDUwMiwKLQlwbGxfNDUwOAotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsNDV4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssIHUzMiBwbGxfY29uLAotCQkJCQkgICAgZW51bSBwbGw0NXh4X3R5cGVfdCBwbGxfdHlwZSkKLXsKLQl1MzIgbWRpdiwgcGRpdiwgc2RpdjsKLQl1NjQgZnZjbyA9IGJhc2VjbGs7Ci0KLQltZGl2ID0gKHBsbF9jb24gPj4gUExMNDVYWF9NRElWX1NISUZUKSAmIFBMTDQ1WFhfTURJVl9NQVNLOwotCXBkaXYgPSAocGxsX2NvbiA+PiBQTEw0NVhYX1BESVZfU0hJRlQpICYgUExMNDVYWF9QRElWX01BU0s7Ci0Jc2RpdiA9IChwbGxfY29uID4+IFBMTDQ1WFhfU0RJVl9TSElGVCkgJiBQTEw0NVhYX1NESVZfTUFTSzsKLQotCWlmIChwbGxfdHlwZSA9PSBwbGxfNDUwOCkKLQkJc2RpdiA9IHNkaXYgLSAxOwotCi0JZnZjbyAqPSBtZGl2OwotCWRvX2RpdihmdmNvLCAocGRpdiA8PCBzZGl2KSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnZjbzsKLX0KLQotI2RlZmluZSBQTEw0NlhYX0tESVZfTUFTSwkoMHhGRkZGKQotI2RlZmluZSBQTEw0NjUwQ19LRElWX01BU0sJKDB4RkZGKQotI2RlZmluZSBQTEw0NlhYX01ESVZfTUFTSwkoMHgxRkYpCi0jZGVmaW5lIFBMTDQ2WFhfUERJVl9NQVNLCSgweDNGKQotI2RlZmluZSBQTEw0NlhYX1NESVZfTUFTSwkoMHg3KQotI2RlZmluZSBQTEw0NlhYX01ESVZfU0hJRlQJKDE2KQotI2RlZmluZSBQTEw0NlhYX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFBMTDQ2WFhfU0RJVl9TSElGVAkoMCkKLQotZW51bSBwbGw0Nnh4X3R5cGVfdCB7Ci0JcGxsXzQ2MDAsCi0JcGxsXzQ2NTAsCi0JcGxsXzQ2NTBjLAotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsNDZ4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCi0JCQkJCSAgICB1MzIgcGxsX2NvbjAsIHUzMiBwbGxfY29uMSwKLQkJCQkJICAgIGVudW0gcGxsNDZ4eF90eXBlX3QgcGxsX3R5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0JdTMyIG1kaXYsIHBkaXYsIHNkaXYsIGtkaXY7Ci0JdTY0IHRtcDsKLQotCW1kaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9NRElWX1NISUZUKSAmIFBMTDQ2WFhfTURJVl9NQVNLOwotCXBkaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9QRElWX1NISUZUKSAmIFBMTDQ2WFhfUERJVl9NQVNLOwotCXNkaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9TRElWX1NISUZUKSAmIFBMTDQ2WFhfU0RJVl9NQVNLOwotCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2WFhfS0RJVl9NQVNLOwotCi0JaWYgKHBsbF90eXBlID09IHBsbF80NjUwYykKLQkJa2RpdiA9IHBsbF9jb24xICYgUExMNDY1MENfS0RJVl9NQVNLOwotCWVsc2UKLQkJa2RpdiA9IHBsbF9jb24xICYgUExMNDZYWF9LRElWX01BU0s7Ci0KLQl0bXAgPSBiYXNlY2xrOwotCi0JaWYgKHBsbF90eXBlID09IHBsbF80NjAwKSB7Ci0JCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OwotCQlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7Ci0JCXJlc3VsdCA9IHRtcCA+PiAxNjsKLQl9IGVsc2UgewotCQl0bXAgKj0gKG1kaXYgPDwgMTApICsga2RpdjsKLQkJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOwotCQlyZXN1bHQgPSB0bXAgPj4gMTA7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2RlZmluZSBQTEw5MFhYX01ESVZfTUFTSwkoMHhGRikKLSNkZWZpbmUgUExMOTBYWF9QRElWX01BU0sJKDB4M0YpCi0jZGVmaW5lIFBMTDkwWFhfU0RJVl9NQVNLCSgweDcpCi0jZGVmaW5lIFBMTDkwWFhfS0RJVl9NQVNLCSgweGZmZmYpCi0jZGVmaW5lIFBMTDkwWFhfTURJVl9TSElGVAkoMTYpCi0jZGVmaW5lIFBMTDkwWFhfUERJVl9TSElGVAkoOCkKLSNkZWZpbmUgUExMOTBYWF9TRElWX1NISUZUCSgwKQotI2RlZmluZSBQTEw5MFhYX0tESVZfU0hJRlQJKDApCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDkweHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLAotCQkJCQkgICAgdTMyIHBsbF9jb24sIHUzMiBwbGxfY29uaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdDsKLQl1MzIgbWRpdiwgcGRpdiwgc2Rpdiwga2RpdjsKLQl1NjQgdG1wOwotCi0JbWRpdiA9IChwbGxfY29uID4+IFBMTDkwWFhfTURJVl9TSElGVCkgJiBQTEw5MFhYX01ESVZfTUFTSzsKLQlwZGl2ID0gKHBsbF9jb24gPj4gUExMOTBYWF9QRElWX1NISUZUKSAmIFBMTDkwWFhfUERJVl9NQVNLOwotCXNkaXYgPSAocGxsX2NvbiA+PiBQTEw5MFhYX1NESVZfU0hJRlQpICYgUExMOTBYWF9TRElWX01BU0s7Ci0Ja2RpdiA9IHBsbF9jb25rICYgUExMOTBYWF9LRElWX01BU0s7Ci0KLQkvKiBXZSBuZWVkIHRvIG11bHRpcGxlIGJhc2VjbGsgYnkgbWRpdiAodGhlIGludGVnZXIgcGFydCkgYW5kIGtkaXYKLQkgKiB3aGljaCBpcyBpbiAyXjE2dGhzLCBzbyBzaGlmdCBtZGl2IHVwIChkb2VzIG5vdCBvdmVyZmxvdykgYW5kCi0JICogYWRkIGtkaXYgYmVmb3JlIG11bHRpcGx5aW5nLiBUaGUgdXNlIG9mIHRtcCBpcyB0byBhdm9pZCBhbnkKLQkgKiBvdmVyZmxvd3MgYmVmb3JlIHNoaWZ0aW5nIGJhYyBkb3duIGludG8gcmVzdWx0IHdoZW4gbXVsdGlwbGluZwotCSAqIGJ5IHRoZSBtZGl2IGFuZCBrZGl2IHBhaXIuCi0JICovCi0KLQl0bXAgPSBiYXNlY2xrOwotCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OwotCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKLQlyZXN1bHQgPSB0bXAgPj4gMTY7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0jZGVmaW5lIFBMTDY1WFhfTURJVl9NQVNLCSgweDNGRikKLSNkZWZpbmUgUExMNjVYWF9QRElWX01BU0sJKDB4M0YpCi0jZGVmaW5lIFBMTDY1WFhfU0RJVl9NQVNLCSgweDcpCi0jZGVmaW5lIFBMTDY1WFhfTURJVl9TSElGVAkoMTYpCi0jZGVmaW5lIFBMTDY1WFhfUERJVl9TSElGVAkoOCkKLSNkZWZpbmUgUExMNjVYWF9TRElWX1NISUZUCSgwKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczVwX2dldF9wbGw2NXh4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywgdTMyIHBsbF9jb24pCi17Ci0JdTMyIG1kaXYsIHBkaXYsIHNkaXY7Ci0JdTY0IGZ2Y28gPSBiYXNlY2xrOwotCi0JbWRpdiA9IChwbGxfY29uID4+IFBMTDY1WFhfTURJVl9TSElGVCkgJiBQTEw2NVhYX01ESVZfTUFTSzsKLQlwZGl2ID0gKHBsbF9jb24gPj4gUExMNjVYWF9QRElWX1NISUZUKSAmIFBMTDY1WFhfUERJVl9NQVNLOwotCXNkaXYgPSAocGxsX2NvbiA+PiBQTEw2NVhYX1NESVZfU0hJRlQpICYgUExMNjVYWF9TRElWX01BU0s7Ci0KLQlmdmNvICo9IG1kaXY7Ci0JZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKLQotCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3JlZ3Mtc3JvbS5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3JlZ3Mtc3JvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIxYWI1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBTNVAgU1JPTUMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9SRUdTX1NST01fSAotI2RlZmluZSBfX0FTTV9QTEFUX1M1UF9SRUdTX1NST01fSCBfX0ZJTEVfXwotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2RlZmluZSBTNVBfU1JPTVJFRyh4KQkJKFM1UF9WQV9TUk9NQyArICh4KSkKLQotI2RlZmluZSBTNVBfU1JPTV9CVwkJUzVQX1NST01SRUcoMHgwKQotI2RlZmluZSBTNVBfU1JPTV9CQzAJCVM1UF9TUk9NUkVHKDB4NCkKLSNkZWZpbmUgUzVQX1NST01fQkMxCQlTNVBfU1JPTVJFRygweDgpCi0jZGVmaW5lIFM1UF9TUk9NX0JDMgkJUzVQX1NST01SRUcoMHhjKQotI2RlZmluZSBTNVBfU1JPTV9CQzMJCVM1UF9TUk9NUkVHKDB4MTApCi0jZGVmaW5lIFM1UF9TUk9NX0JDNAkJUzVQX1NST01SRUcoMHgxNCkKLSNkZWZpbmUgUzVQX1NST01fQkM1CQlTNVBfU1JPTVJFRygweDE4KQotCi0vKiBvbmUgcmVnaXN0ZXIgQlcgaG9sZHMgNCB4IDQtYml0IHBhY2tlZCBzZXR0aW5ncyBmb3IgTkNTMCAtIE5DUzMgKi8KLQotI2RlZmluZSBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVAkJMAotI2RlZmluZSBTNVBfU1JPTV9CV19fQUREUk1PREVfX1NISUZUCQkxCi0jZGVmaW5lIFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVAkJMgotI2RlZmluZSBTNVBfU1JPTV9CV19fQllURUVOQUJMRV9fU0hJRlQJCTMKLQotI2RlZmluZSBTNVBfU1JPTV9CV19fQ1NfTUFTSwkJCTB4ZgotCi0jZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MwX19TSElGVAkJMAotI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQJCTQKLSNkZWZpbmUgUzVQX1NST01fQldfX05DUzJfX1NISUZUCQk4Ci0jZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MzX19TSElGVAkJMTIKLSNkZWZpbmUgUzVQX1NST01fQldfX05DUzRfX1NISUZUCQkxNgotI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTNV9fU0hJRlQJCTIwCi0KLS8qIGFwcGxpZXMgdG8gc2FtZSB0byBCQ1MwIC0gQkNTMyAqLwotCi0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fUE1DX19TSElGVAkJMAotI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1RBQ1BfX1NISUZUCQk0Ci0jZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQJCTgKLSNkZWZpbmUgUzVQX1NST01fQkNYX19UQ09IX19TSElGVAkJMTIKLSNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNDX19TSElGVAkJMTYKLSNkZWZpbmUgUzVQX1NST01fQkNYX19UQ09TX19TSElGVAkJMjQKLSNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNTX19TSElGVAkJMjgKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzVQX1JFR1NfU1JPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvcmVzZXQuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZXNldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzVlOTc4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9yZXNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3Jlc2V0LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX1BMQVRfUzVQX1JFU0VUX0gKLSNkZWZpbmUgX19BU01fUExBVF9TNVBfUkVTRVRfSCBfX0ZJTEVfXwotCi1leHRlcm4gdm9pZCAoKnM1cF9yZXNldF9ob29rKSh2b2lkKTsKLQotI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzVQX1JFU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtY2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5YjViZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczVwIGNsb2NrIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9DTE9DS19ICi0jZGVmaW5lIF9fQVNNX1BMQVRfUzVQX0NMT0NLX0ggX19GSUxFX18KLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotCi0jZGVmaW5lIEdFVF9ESVYoY2xrLCBmaWVsZCkgKCgoKGNsaykgJiBmaWVsZCMjX01BU0spID4+IGZpZWxkIyNfU0hJRlQpICsgMSkKLQotI2RlZmluZSBjbGtfZmluX2FwbGwgY2xrX2V4dF94dGFsX211eAotI2RlZmluZSBjbGtfZmluX21wbGwgY2xrX2V4dF94dGFsX211eAotI2RlZmluZSBjbGtfZmluX2VwbGwgY2xrX2V4dF94dGFsX211eAotI2RlZmluZSBjbGtfZmluX2RwbGwgY2xrX2V4dF94dGFsX211eAotI2RlZmluZSBjbGtfZmluX3ZwbGwgY2xrX2V4dF94dGFsX211eAotI2RlZmluZSBjbGtfZmluX2hwbGwgY2xrX2V4dF94dGFsX211eAotCi1leHRlcm4gc3RydWN0IGNsayBjbGtfZXh0X3h0YWxfbXV4OwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3h1c2J4dGk7Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfNDhtOwotZXh0ZXJuIHN0cnVjdCBjbGsgczVwX2Nsa18yN207Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9hcGxsOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfbXBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X2VwbGw7Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9kcGxsOwotZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfdnBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrIGNsa19hcm07Ci1leHRlcm4gc3RydWN0IGNsayBjbGtfdnBsbDsKLQotZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX2FwbGw7Ci1leHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfbXBsbDsKLWV4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrX3NyY19lcGxsOwotZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX2RwbGw7Ci0KLWV4dGVybiBpbnQgczVwX2dhdGVjdHJsKHZvaWQgX19pb21lbSAqcmVnLCBzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOwotCi0vKiBDb21tb24gRVBMTCBvcGVyYXRpb25zIGZvciBTNVAgcGxhdGZvcm0gKi8KLWV4dGVybiBpbnQgczVwX2VwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfZXBsbF9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOwotCi0vKiBTUERJRiBjbGsgb3BlcmF0aW9ucyBjb21tb24gZm9yIFM1UEMxMDAvVjIxMC9DMTEwIGFuZCBFeHlub3M0ICovCi1leHRlcm4gaW50IHM1cF9zcGRpZl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBzNXBfc3BkaWZfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKTsKLQotZXh0ZXJuIHN0cnVjdCBjbGtfb3BzIHM1cF9zY2xrX3NwZGlmX29wczsKLSNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtdGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVlODgxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXAtdGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cC10aW1lLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cCB0aW1lIHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2lmbmRlZiBfX0FTTV9QTEFUX1M1UF9USU1FX0gKLSNkZWZpbmUgX19BU01fUExBVF9TNVBfVElNRV9IIF9fRklMRV9fCi0KLS8qIFM1UCBIUi1UaW1lciBDbG9jayBtb2RlICovCi1lbnVtIHM1cF90aW1lcl9tb2RlIHsKLQlTNVBfUFdNMCwKLQlTNVBfUFdNMSwKLQlTNVBfUFdNMiwKLQlTNVBfUFdNMywKLQlTNVBfUFdNNCwKLX07Ci0KLXN0cnVjdCBzNXBfdGltZXJfc291cmNlIHsKLQl1bnNpZ25lZCBpbnQgZXZlbnRfaWQ7Ci0JdW5zaWduZWQgaW50IHNvdXJjZV9pZDsKLX07Ci0KLS8qIEJlIGFibGUgdG8gc2xlZXAgZm9yIGF0bGVhc3QgNCBzZWNvbmRzICh1c3VhbGx5IG1vcmUpICovCi0jZGVmaW5lIFM1UFRJTUVSX01JTl9SQU5HRQk0Ci0KLSNkZWZpbmUgVENOVF9NQVgJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgTk9OX1BFUklPRElDCQkwCi0jZGVmaW5lIFBFUklPRElDCQkxCi0KLWV4dGVybiB2b2lkIF9faW5pdCBzNXBfc2V0X3RpbWVyX3NvdXJjZShlbnVtIHM1cF90aW1lcl9tb2RlIGV2ZW50LAotCQkJCQllbnVtIHM1cF90aW1lcl9tb2RlIHNvdXJjZSk7Ci1leHRlcm4Jc3RydWN0IHN5c190aW1lciBzNXBfdGltZXI7Ci0jZW5kaWYgLyogX19BU01fUExBVF9TNVBfVElNRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4NTg1ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NDAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cDY0NDAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotIC8qIENvbW1vbiBpbml0IGNvZGUgZm9yIFM1UDY0NDAgcmVsYXRlZCBTb0NzICovCi0KLWV4dGVybiB2b2lkIHM1cDY0NDBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ0MF9zZXR1cF9jbG9ja3Modm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NDAKLQotZXh0ZXJuICBpbnQgczVwNjR4MF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ0MF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cDY0NDBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ0MF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLWV4dGVybiB2b2lkIHM1cDY0NDBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci0KLSNlbHNlCi0jZGVmaW5lIHM1cDY0NDBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzNXA2NDQwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzNXA2NDQwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHM1cDY0eDBfaW5pdCBOVUxMCi0jZW5kaWYKLQotLyogUzVQNjQ0MCB0aW1lciAqLwotCi1leHRlcm4gc3RydWN0IHN5c190aW1lciBzNXA2NDQwX3RpbWVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MGE0MWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIGFyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXA2NDUwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cDY0NTAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQNjQ1MCByZWxhdGVkIFNvQ3MgKi8KLQotZXh0ZXJuIHZvaWQgczVwNjQ1MF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7Ci1leHRlcm4gdm9pZCBzNXA2NDUwX3NldHVwX2Nsb2Nrcyh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ1MAotCi1leHRlcm4gIGludCBzNXA2NHgwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBzNXA2NDUwX2luaXRfaXJxKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwNjQ1MF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBzNXA2NDUwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKLQotZXh0ZXJuIHZvaWQgczVwNjQ1MF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLQotI2Vsc2UKLSNkZWZpbmUgczVwNjQ1MF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHM1cDY0NTBfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHM1cDY0NTBfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczVwNjR4MF9pbml0IE5VTEwKLSNlbmRpZgotCi0vKiBTNVA2NDUwIHRpbWVyICovCi0KLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHM1cDY0NTBfdGltZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwYzEwMC5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2MDk5ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwYzEwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3M1cGMxMDAuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogSGVhZGVyIGZpbGUgZm9yIHM1cGMxMDAgY3B1IHN1cHBvcnQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQQzEwMCByZWxhdGVkIFNvQ3MgKi8KLQotZXh0ZXJuIHZvaWQgczVwYzEwMF9jb21tb25faW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7Ci1leHRlcm4gdm9pZCBzNXBjMTAwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cGMxMDBfc2V0dXBfY2xvY2tzKHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TNVBDMTAwCi0KLWV4dGVybiAgaW50IHM1cGMxMDBfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cGMxMDBfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBzNXBjMTAwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cGMxMDBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwotCi0jZGVmaW5lIHM1cGMxMDBfaW5pdF91YXJ0cyBzNXBjMTAwX2NvbW1vbl9pbml0X3VhcnRzCi0KLSNlbHNlCi0jZGVmaW5lIHM1cGMxMDBfaW5pdF9jbG9ja3MgTlVMTAotI2RlZmluZSBzNXBjMTAwX2luaXRfdWFydHMgTlVMTAotI2RlZmluZSBzNXBjMTAwX21hcF9pbyBOVUxMCi0jZGVmaW5lIHM1cGMxMDBfaW5pdCBOVUxMCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXB2MjEwLmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwdjIxMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzkzYTBjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zNXB2MjEwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvczVwdjIxMC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBIZWFkZXIgZmlsZSBmb3IgczVwdjIxMCBjcHUgc3VwcG9ydAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0vKiBDb21tb24gaW5pdCBjb2RlIGZvciBTNVBWMjEwIHJlbGF0ZWQgU29DcyAqLwotCi1leHRlcm4gdm9pZCBzNXB2MjEwX2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKLWV4dGVybiB2b2lkIHM1cHYyMTBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwdjIxMF9zZXR1cF9jbG9ja3Modm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1M1UFYyMTAKLQotZXh0ZXJuICBpbnQgczVwdjIxMF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwdjIxMF9pbml0X2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIHM1cHYyMTBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgczVwdjIxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7Ci0KLSNkZWZpbmUgczVwdjIxMF9pbml0X3VhcnRzIHM1cHYyMTBfY29tbW9uX2luaXRfdWFydHMKLQotI2Vsc2UKLSNkZWZpbmUgczVwdjIxMF9pbml0X2Nsb2NrcyBOVUxMCi0jZGVmaW5lIHM1cHYyMTBfaW5pdF91YXJ0cyBOVUxMCi0jZGVmaW5lIHM1cHYyMTBfbWFwX2lvIE5VTEwKLSNkZWZpbmUgczVwdjIxMF9pbml0IE5VTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3N5c21tdS5oIGIvYXJjaC9hcm0vcGxhdC1zNXAvaW5jbHVkZS9wbGF0L3N5c21tdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjUyODNjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXNtbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXNtbXUuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQotICoKLSAqIFNhbXN1bmcgU3lzdGVtIE1NVSBkcml2ZXIgZm9yIFM1UCBwbGF0Zm9ybQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9fQVNNX19QTEFUX1NZU01NVV9ICi0jZGVmaW5lIF9fQVNNX19QTEFUX1NZU01NVV9IIF9fRklMRV9fCi0KLWVudW0gUzVQX1NZU01NVV9JTlRFUlJVUFRfVFlQRSB7Ci0JU1lTTU1VX1BBR0VGQVVMVCwKLQlTWVNNTVVfQVJfTVVMVElISVQsCi0JU1lTTU1VX0FXX01VTFRJSElULAotCVNZU01NVV9CVVNFUlJPUiwKLQlTWVNNTVVfQVJfU0VDVVJJVFksCi0JU1lTTU1VX0FSX0FDQ0VTUywKLQlTWVNNTVVfQVdfU0VDVVJJVFksCi0JU1lTTU1VX0FXX1BST1RFQ1RJT04sIC8qIDcgKi8KLQlTWVNNTVVfRkFVTFRTX05VTQotfTsKLQotI2lmZGVmIENPTkZJR19TNVBfU1lTVEVNX01NVQotCi0jaW5jbHVkZSA8bWFjaC9zeXNtbXUuaD4KLQotLyoqCi0gKiBzNXBfc3lzbW11X2VuYWJsZSgpIC0gZW5hYmxlIHN5c3RlbSBtbXUgb2YgaXAKLSAqIEBpcHM6IFRoZSBpcCBjb25uZWN0ZWQgc3lzdGVtIG1tdS4KLSAqICNwZ2Q6IEJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgMXN0IGxldmVsIHBhZ2UgdGFibGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZSBzeXN0ZW0gbW11IHRvIHRyYW5zZmVyIGFkZHJlc3MKLSAqIGZyb20gdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKLSAqLwotdm9pZCBzNXBfc3lzbW11X2VuYWJsZShzeXNtbXVfaXBzIGlwcywgdW5zaWduZWQgbG9uZyBwZ2QpOwotCi0vKioKLSAqIHM1cF9zeXNtbXVfZGlzYWJsZSgpIC0gZGlzYWJsZSBzeXNtbXUgbW11IG9mIGlwCi0gKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlIHN5c3RlbSBtbXUgdG8gdHJhbnNmZXIgYWRkcmVzcwotICogZnJvbSB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcwotICovCi12b2lkIHM1cF9zeXNtbXVfZGlzYWJsZShzeXNtbXVfaXBzIGlwcyk7Ci0KLS8qKgotICogczVwX3N5c21tdV9zZXRfdGFibGViYXNlX3BnZCgpIC0gc2V0IHBhZ2UgdGFibGUgYmFzZSBhZGRyZXNzIHRvIHJlZmVyIHBhZ2UgdGFibGUKLSAqIEBpcHM6IFRoZSBpcCBjb25uZWN0ZWQgc3lzdGVtIG1tdS4KLSAqIEBwZ2Q6IFRoZSBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNldCBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcwotICogV2hlbiBzeXN0ZW0gbW11IHRyYW5zZmVyIGFkZHJlc3MgZnJvbSB2aXJ0YXVsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcywKLSAqIHN5c3RlbSBtbXUgcmVmZXIgYWRkcmVzcyBpbmZvcm1hdGlvbiBmcm9tIHBhZ2UgdGFibGUKLSAqLwotdm9pZCBzNXBfc3lzbW11X3NldF90YWJsZWJhc2VfcGdkKHN5c21tdV9pcHMgaXBzLCB1bnNpZ25lZCBsb25nIHBnZCk7Ci0KLS8qKgotICogczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZSgpIC0gZmx1c2ggYWxsIFRMQiBlbnRyeSBpbiBzeXN0ZW0gbW11Ci0gKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCi0gKgotICogVGhpcyBmdW5jdGlvbiBmbHVzaCBhbGwgVExCIGVudHJ5IGluIHN5c3RlbSBtbXUKLSAqLwotdm9pZCBzNXBfc3lzbW11X3RsYl9pbnZhbGlkYXRlKHN5c21tdV9pcHMgaXBzKTsKLQotLyoqIHM1cF9zeXNtbXVfc2V0X2ZhdWx0X2hhbmRsZXIoKSAtIEZhdWx0IGhhbmRsZXIgZm9yIFN5c3RlbSBNTVVzCi0gKiBAaXR5cGU6IHR5cGUgb2YgZmF1bHQuCi0gKiBAcGd0YWJsZV9iYXNlOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBwYWdlIHRhYmxlIGJhc2UuIFRoaXMgaXMgMCBpZiBAaXBzIGlzCi0gKiAgICAgICAgICAgICAgIFNZU01NVV9CVVNFUlJPUi4KLSAqIEBmYXVsdF9hZGRyOiB0aGUgZGV2aWNlICh2aXJ0dWFsKSBhZGRyZXNzIHRoYXQgdGhlIFN5c3RlbSBNTVUgdHJpZWQgdG8KLSAqICAgICAgICAgICAgIHRyYW5zbGF0ZWQuIFRoaXMgaXMgMCBpZiBAaXBzIGlzIFNZU01NVV9CVVNFUlJPUi4KLSAqIENhbGxlZCB3aGVuIGludGVycnVwdCBvY2N1cnJlZCBieSB0aGUgU3lzdGVtIE1NVXMKLSAqIFRoZSBkZXZpY2UgZHJpdmVycyBvZiBwZXJpcGhlcmFsIGRldmljZXMgdGhhdCBoYXMgYSBTeXN0ZW0gTU1VIGNhbiBpbXBsZW1lbnQKLSAqIGEgZmF1bHQgaGFuZGxlciB0byByZXNvbHZlIGFkZHJlc3MgdHJhbnNsYXRpb24gZmF1bHQgYnkgU3lzdGVtIE1NVS4KLSAqIFRoZSBtZWFuaW5ncyBvZiByZXR1cm4gdmFsdWUgYW5kIHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KLQotICogcmV0dXJuIHZhbHVlOiBub24temVybyBpZiB0aGUgZmF1bHQgaXMgY29ycmVjdGx5IHJlc29sdmVkLgotICogICAgICAgICB6ZXJvIGlmIHRoZSBmYXVsdCBpcyBub3QgaGFuZGxlZC4KLSAqLwotdm9pZCBzNXBfc3lzbW11X3NldF9mYXVsdF9oYW5kbGVyKHN5c21tdV9pcHMgaXBzLAotCQkJaW50ICgqaGFuZGxlcikoZW51bSBTNVBfU1lTTU1VX0lOVEVSUlVQVF9UWVBFIGl0eXBlLAotCQkJCQl1bnNpZ25lZCBsb25nIHBndGFibGVfYmFzZSwKLQkJCQkJdW5zaWduZWQgbG9uZyBmYXVsdF9hZGRyKSk7Ci0jZWxzZQotI2RlZmluZSBzNXBfc3lzbW11X2VuYWJsZShpcHMsIHBnZCkgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzNXBfc3lzbW11X2Rpc2FibGUoaXBzKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHM1cF9zeXNtbXVfc2V0X3RhYmxlYmFzZV9wZ2QoaXBzLCBwZ2QpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZShpcHMpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgczVwX3N5c21tdV9zZXRfZmF1bHRfaGFuZGxlcihpcHMsIGhhbmRsZXIpIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotI2VuZGlmIC8qIF9fQVNNX1BMQVRfU1lTTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXN0ZW0tcmVzZXQuaCBiL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC9zeXN0ZW0tcmVzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwN2YzNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogQmFzZWQgb24gYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zeXN0ZW0tcmVzZXQuaAotICoKLSAqIFM1UCAtIFN5c3RlbSBkZWZpbmUgZm9yIGFyY2hfcmVzZXQoKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8cGxhdC93YXRjaGRvZy1yZXNldC5oPgotCi12b2lkICgqczVwX3Jlc2V0X2hvb2spKHZvaWQpOwotCi1zdGF0aWMgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCS8qIFNXUkVTRVQgc3VwcG9ydCBpbiBzNXBfcmVzZXRfaG9vaygpICovCi0KLQlpZiAoczVwX3Jlc2V0X2hvb2spCi0JCXM1cF9yZXNldF9ob29rKCk7Ci0KLQkvKiBQZXJmb3JtIHJlc2V0IHVzaW5nIFdhdGNoZG9nIHJlc2V0Ci0JICogaWYgdGhlcmUgaXMgbm8gczVwX3Jlc2V0X2hvb2soKQotCSAqLwotCi0JYXJjaF93ZHRfcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC91c2ItcGh5LmggYi9hcmNoL2FybS9wbGF0LXM1cC9pbmNsdWRlL3BsYXQvdXNiLXBoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ2YmNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtczVwL2luY2x1ZGUvcGxhdC91c2ItcGh5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCi0gKiBBdXRob3I6IEpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX19QTEFUX1M1UF9VU0JfUEhZX0gKLSNkZWZpbmUgX19QTEFUX1M1UF9VU0JfUEhZX0gKLQotZW51bSBzNXBfdXNiX3BoeV90eXBlIHsKLQlTNVBfVVNCX1BIWV9ERVZJQ0UsCi0JUzVQX1VTQl9QSFlfSE9TVCwKLX07Ci0KLWV4dGVybiBpbnQgczVwX3VzYl9waHlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdHlwZSk7Ci1leHRlcm4gaW50IHM1cF91c2JfcGh5X2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOwotCi0jZW5kaWYgLyogX19QTEFUX1M1UF9SRUdTX1VTQl9QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYyBiL2FyY2gvYXJtL3BsYXQtczVwL2lycS1ncGlvaW50LmMKaW5kZXggYzY1ZWI3OS4uMWZkZmFhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zNXAvaXJxLWdwaW9pbnQuYworKysgYi9hcmNoL2FybS9wbGF0LXM1cC9pcnEtZ3Bpb2ludC5jCkBAIC0zNyw3ICszNyw3IEBACiAJaW50CQkJc3RhcnQ7CiAJaW50CQkJbnJfZ3JvdXBzOwogCWludAkJCWlycTsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcAkqKmNoaXBzOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcAkqKmNoaXBzOwogCXZvaWQJCQkoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IGlycV9kZXNjICopOwogfTsKIApAQCAtODcsNyArODcsNyBAQAogCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOwogCiAJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgYmFuay0+bnJfZ3JvdXBzOyBncm91cCsrKSB7Ci0JCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gYmFuay0+Y2hpcHNbZ3JvdXBdOworCQlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBiYW5rLT5jaGlwc1tncm91cF07CiAJCWlmICghY2hpcCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKIAljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOwogfQogCi1zdGF0aWMgX19pbml0IGludCBzNXBfZ3Bpb2ludF9hZGQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCitzdGF0aWMgX19pbml0IGludCBzNXBfZ3Bpb2ludF9hZGQoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQogewogCXN0YXRpYyBpbnQgdXNlZF9ncGlvaW50X2dyb3VwcyA9IDA7CiAJaW50IGdyb3VwID0gY2hpcC0+Z3JvdXA7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWJhbmstPmhhbmRsZXIpIHsKLQkJYmFuay0+Y2hpcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqKSAqCisJCWJhbmstPmNoaXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICopICoKIAkJCQkgICAgICBiYW5rLT5ucl9ncm91cHMsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJhbmstPmNoaXBzKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNzQsNyArMTc0LDcgQEAKIAogaW50IF9faW5pdCBzNXBfcmVnaXN0ZXJfZ3Bpb19pbnRlcnJ1cHQoaW50IHBpbikKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqbXlfY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm15X2NoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwogCWludCBvZmZzZXQsIGdyb3VwOwogCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczVwL3NsZWVwLlMgYi9hcmNoL2FybS9wbGF0LXM1cC9zbGVlcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDU5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXM1cC9zbGVlcC5TCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczVwL3NsZWVwLlMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQ29tbW9uIFM1UCBTbGVlcCBDb2RlCisgKiBCYXNlZCBvbiBTM0M2NFhYIHNsZWVwIGNvZGUgYnk6CisgKglCZW4gRG9va3MsIChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJLnRleHQKKworCS8qCisJICogc2xlZXAgbWFnaWMsIHRvIGFsbG93IHRoZSBib290bG9hZGVyIHRvIGNoZWNrIGZvciBhbiB2YWxpZAorCSAqIGltYWdlIHRvIHJlc3VtZSB0by4gTXVzdCBiZSB0aGUgZmlyc3Qgd29yZCBiZWZvcmUgdGhlCisJICogczNjX2NwdV9yZXN1bWUgZW50cnkuCisJICovCisKKwkud29yZAkweDJiZWRmMDBkCisKKwkvKgorCSAqIHMzY19jcHVfcmVzdW1lCisJICoKKwkgKiByZXN1bWUgY29kZSBlbnRyeSBmb3IgYm9vdGxvYWRlciB0byBjYWxsCisJICoKKwkgKiB3ZSBtdXN0IHB1dCB0aGlzIGNvZGUgaGVyZSBpbiB0aGUgZGF0YSBzZWdtZW50IGFzIHdlIGhhdmUgbm8KKwkgKiBvdGhlciB3YXkgb2YgcmVzdG9yaW5nIHRoZSBzdGFjayBwb2ludGVyIGFmdGVyIHNsZWVwLCBhbmQgd2UKKwkgKiBtdXN0IG5vdCB3cml0ZSB0byB0aGUgY29kZSBzZWdtZW50IChjb2RlIGlzIHJlYWQtb25seSkKKwkgKi8KKworRU5UUlkoczNjX2NwdV9yZXN1bWUpCisJYgljcHVfcmVzdW1lCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9LY29uZmlnCmluZGV4IGRmZmEzN2IuLjMxM2ViMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9LY29uZmlnCkBAIC03NCwzOSArNzQsMTIgQEAKIAkgIGNvbmZpZ3VyYXRpb24uIEdQSU9saWIgc2hhbGwgYmUgY29tcGlsZWQgb25seSBmb3IgUzNDNjRYWCBhbmQgUzVQCiAJICBzZXJpZXMgb2YgcHJvY2Vzc29ycy4KIAotY29uZmlnIFMzQ19HUElPX0NGR19TM0MyNFhYCi0JYm9vbAotCWhlbHAKLQkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIFMzQzI0WFggc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uCi0JICBmdW5jdGlvbnMuCi0KIGNvbmZpZyBTM0NfR1BJT19DRkdfUzNDNjRYWAogCWJvb2wKIAloZWxwCiAJICBJbnRlcm5hbCBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBTM0M2NFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbgogCSAgZnVuY3Rpb25zLgogCi1jb25maWcgUzNDX0dQSU9fUFVMTF9VUERPV04KLQlib29sCi0JaGVscAotCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGNvcnJlY3QgR1BJTyBwdWxsIGhlbHBlcgotCi1jb25maWcgUzNDX0dQSU9fUFVMTF9TM0MyNDQzCi0JYm9vbAotCXNlbGVjdCBTM0NfR1BJT19QVUxMX1VQRE9XTgotCWhlbHAKLQkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBjb3JyZWN0IEdQSU8gcHVsbCBoZWxwZXIgZm9yIFMzQzI0NDMtc3R5bGUgR1BJTwotCi1jb25maWcgUzNDX0dQSU9fUFVMTF9ET1dOCi0JYm9vbAotCWhlbHAKLQkgIEludGVybmFsIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSBjb3JyZWN0IEdQSU8gcHVsbCBoZWxwZXIKLQotY29uZmlnIFMzQ19HUElPX1BVTExfVVAKLQlib29sCi0JaGVscAotCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIGNvcnJlY3QgR1BJTyBwdWxsIGhlbHBlcgotCiBjb25maWcgUzVQX0dQSU9fRFJWU1RSCiAJYm9vbAogCWhlbHAKQEAgLTI5NSwxMSArMjY4LDE0IEBACiAJaGVscAogCSAgSW50ZXJuYWwgY29uZmlndXJhdGlvbiBmb3IgUzNDIERNQSBjb3JlCiAKLWNvbmZpZyBTM0NfUEwzMzBfRE1BCitjb25maWcgU0FNU1VOR19ETUFERVYKIAlib29sCi0Jc2VsZWN0IFBMMzMwCisJc2VsZWN0IERNQURFVklDRVMKKwlzZWxlY3QgUEwzMzBfRE1BIGlmIChDUFVfRVhZTk9TNDIxMCB8fCBDUFVfUzVQVjIxMCB8fCBDUFVfUzVQQzEwMCB8fCBcCisJCQkJCUNQVV9TNVA2NDUwIHx8IENQVV9TNVA2NDQwKQorCXNlbGVjdCBBUk1fQU1CQQogCWhlbHAKLQkgIFMzQyBETUEgQVBJIERyaXZlciBmb3IgUEwzMzAgRE1BQy4KKwkgIFVzZSBETUEgZGV2aWNlIGVuZ2luZSBmb3IgUEwzMzAgRE1BQy4KIAogY29tbWVudCAiUG93ZXIgbWFuYWdlbWVudCIKIApAQCAtMzYyLDQgKzMzOCwxMSBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCBQb3dlciBEb21haW4gYnkgUnVudGltZSBQTS4KIAorY29uZmlnIERFQlVHX1MzQ19VQVJUCisJZGVwZW5kcyBvbiBQTEFUX1NBTVNVTkcKKwlpbnQKKwlkZWZhdWx0ICIwIiBpZiBERUJVR19TM0NfVUFSVDAKKwlkZWZhdWx0ICIxIiBpZiBERUJVR19TM0NfVUFSVDEKKwlkZWZhdWx0ICIyIiBpZiBERUJVR19TM0NfVUFSVDIKKwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQppbmRleCAxMTA1OTIyMy4uNjAxMjM2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLSMgYXJjaC9hcm0vcGxhdC1zM2M2NHh4L01ha2VmaWxlCisjIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQogIwogIyBDb3B5cmlnaHQgMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKICMKQEAgLTExLDEzICsxMSwxMCBAQAogCiAjIE9iamVjdHMgd2UgYWx3YXlzIGJ1aWxkIGluZGVwZW5kZW50IG9mIFNvQyBjaG9pY2UKIAotb2JqLXkJCQkJKz0gaW5pdC5vCitvYmoteQkJCQkrPSBpbml0Lm8gY3B1Lm8KIG9iai0kKENPTkZJR19BUkNIX1VTRVNfR0VUVElNRU9GRlNFVCkgICArPSB0aW1lLm8KIG9iai15CQkJCSs9IGNsb2NrLm8KIG9iai15CQkJCSs9IHB3bS1jbG9jay5vCi1vYmoteQkJCQkrPSBncGlvLm8KLW9iai15CQkJCSs9IGdwaW8tY29uZmlnLm8KLW9iai15CQkJCSs9IGRldi1hc29jZG1hLm8KIAogb2JqLSQoQ09ORklHX1NBTVNVTkdfQ0xLU1JDKQkrPSBjbG9jay1jbGtzcmMubwogCkBAIC0zMSw0MCArMjgsMTYgQEAKIAogb2JqLXkJCQkJKz0gcGxhdGZvcm1kYXRhLm8KIAotb2JqLSQoQ09ORklHX1MzQ19ERVZfSFNNTUMpCSs9IGRldi1oc21tYy5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9IU01NQzEpCSs9IGRldi1oc21tYzEubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfSFNNTUMyKQkrPSBkZXYtaHNtbWMyLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0hTTU1DMykJKz0gZGV2LWhzbW1jMy5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9IV01PTikJKz0gZGV2LWh3bW9uLm8KLW9iai15CQkJCSs9IGRldi1pMmMwLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzEpCSs9IGRldi1pMmMxLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzIpCSs9IGRldi1pMmMyLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzMpCSs9IGRldi1pMmMzLm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzQpCSs9IGRldi1pMmM0Lm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzUpCSs9IGRldi1pMmM1Lm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzYpCSs9IGRldi1pMmM2Lm8KLW9iai0kKENPTkZJR19TM0NfREVWX0kyQzcpCSs9IGRldi1pMmM3Lm8KLW9iai0kKENPTkZJR19TM0NfREVWX0ZCKQkrPSBkZXYtZmIubworb2JqLXkJCQkJKz0gZGV2cy5vCiBvYmoteQkJCQkrPSBkZXYtdWFydC5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9VU0JfSE9TVCkJKz0gZGV2LXVzYi5vCi1vYmotJChDT05GSUdfUzNDX0RFVl9VU0JfSFNPVEcpCSs9IGRldi11c2ItaHNvdGcubwotb2JqLSQoQ09ORklHX1MzQ19ERVZfV0RUKQkrPSBkZXYtd2R0Lm8KLW9iai0kKENPTkZJR19TM0NfREVWX05BTkQpCSs9IGRldi1uYW5kLm8KLW9iai0kKENPTkZJR19TM0NfREVWX09ORU5BTkQpCSs9IGRldi1vbmVuYW5kLm8KLW9iai0kKENPTkZJR19TM0NfREVWX1JUQykJKz0gZGV2LXJ0Yy5vCiAKLW9iai0kKENPTkZJR19TQU1TVU5HX0RFVl9BREMpCSs9IGRldi1hZGMubwotb2JqLSQoQ09ORklHX1NBTVNVTkdfREVWX0lERSkJKz0gZGV2LWlkZS5vCi1vYmotJChDT05GSUdfU0FNU1VOR19ERVZfVFMpCSs9IGRldi10cy5vCi1vYmotJChDT05GSUdfU0FNU1VOR19ERVZfS0VZUEFEKQkrPSBkZXYta2V5cGFkLm8KLW9iai0kKENPTkZJR19TQU1TVU5HX0RFVl9QV00pCSs9IGRldi1wd20ubwogb2JqLSQoQ09ORklHX1NBTVNVTkdfREVWX0JBQ0tMSUdIVCkJKz0gZGV2LWJhY2tsaWdodC5vCiAKICMgRE1BIHN1cHBvcnQKIAotb2JqLSQoQ09ORklHX1MzQ19ETUEpCQkrPSBkbWEubworb2JqLSQoQ09ORklHX1MzQ19ETUEpCQkrPSBkbWEubyBzM2MtZG1hLW9wcy5vCiAKLW9iai0kKENPTkZJR19TM0NfUEwzMzBfRE1BKQkrPSBzM2MtcGwzMzAubworb2JqLSQoQ09ORklHX1NBTVNVTkdfRE1BREVWKQkrPSBkbWEtb3BzLm8KIAogIyBQTSBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9hZGMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9hZGMuYwppbmRleCBlZThkZWVmLi4zM2VjZDBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvYWRjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2FkYy5jCkBAIC00MSw2ICs0MSw4IEBACiAKIGVudW0gczNjX2NwdV90eXBlIHsKIAlUWVBFX0FEQ1YxLCAvKiBTM0MyNFhYICovCisJVFlQRV9BRENWMTEsIC8qIFMzQzI0NDMgKi8KKwlUWVBFX0FEQ1YxMiwgLyogUzNDMjQxNiwgUzNDMjQ1MCAqLwogCVRZUEVfQURDVjIsIC8qIFMzQzY0WFgsIFM1UDY0WDAsIFM1UEMxMDAgKi8KIAlUWVBFX0FEQ1YzLCAvKiBTNVBWMjEwLCBTNVBDMTEwLCBFWFlOT1M0MjEwICovCiB9OwpAQCAtOTgsMTMgKzEwMCwxNyBAQAogCiAJY2xpZW50LT5zZWxlY3RfY2IoY2xpZW50LCAxKTsKIAotCWNvbiAmPSB+UzNDMjQxMF9BRENDT05fTVVYTUFTSzsKKwlpZiAoY3B1ID09IFRZUEVfQURDVjEgfHwgY3B1ID09IFRZUEVfQURDVjIpCisJCWNvbiAmPSB+UzNDMjQxMF9BRENDT05fTVVYTUFTSzsKIAljb24gJj0gflMzQzI0MTBfQURDQ09OX1NUREJNOwogCWNvbiAmPSB+UzNDMjQxMF9BRENDT05fU1RBUlRNQVNLOwogCiAJaWYgKCFjbGllbnQtPmlzX3RzKSB7CiAJCWlmIChjcHUgPT0gVFlQRV9BRENWMykKIAkJCXdyaXRlbChjbGllbnQtPmNoYW5uZWwgJiAweGYsIGFkYy0+cmVncyArIFM1UF9BRENNVVgpOworCQllbHNlIGlmIChjcHUgPT0gVFlQRV9BRENWMTEgfHwgY3B1ID09IFRZUEVfQURDVjEyKQorCQkJd3JpdGVsKGNsaWVudC0+Y2hhbm5lbCAmIDB4ZiwKKwkJCQkJCWFkYy0+cmVncyArIFMzQzI0NDNfQURDTVVYKTsKIAkJZWxzZQogCQkJY29uIHw9IFMzQzI0MTBfQURDQ09OX1NFTE1VWChjbGllbnQtPmNoYW5uZWwpOwogCX0KQEAgLTI5MywxMyArMjk5LDEzIEBACiAKIAljbGllbnQtPm5yX3NhbXBsZXMtLTsKIAotCWlmIChjcHUgIT0gVFlQRV9BRENWMSkgewotCQkvKiBTM0M2NFhYL1M1UCBBREMgcmVzb2x1dGlvbiBpcyAxMi1iaXQgKi8KLQkJZGF0YTAgJj0gMHhmZmY7Ci0JCWRhdGExICY9IDB4ZmZmOwotCX0gZWxzZSB7CisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YxIHx8IGNwdSA9PSBUWVBFX0FEQ1YxMSkgewogCQlkYXRhMCAmPSAweDNmZjsKIAkJZGF0YTEgJj0gMHgzZmY7CisJfSBlbHNlIHsKKwkJLyogUzNDMjQxNi9TM0M2NFhYL1M1UCBBREMgcmVzb2x1dGlvbiBpcyAxMi1iaXQgKi8KKwkJZGF0YTAgJj0gMHhmZmY7CisJCWRhdGExICY9IDB4ZmZmOwogCX0KIAogCWlmIChjbGllbnQtPmNvbnZlcnRfY2IpCkBAIC0zMjAsNyArMzI2LDcgQEAKIAl9CiAKIGV4aXQ6Ci0JaWYgKGNwdSAhPSBUWVBFX0FEQ1YxKSB7CisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YyIHx8IGNwdSA9PSBUWVBFX0FEQ1YzKSB7CiAJCS8qIENsZWFyIEFEQyBpbnRlcnJ1cHQgKi8KIAkJd3JpdGVsKDAsIGFkYy0+cmVncyArIFMzQzY0WFhfQURDQ0xSSU5UKTsKIAl9CkBAIC0zMzIsNiArMzM4LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBhZGNfZGV2aWNlICphZGM7CiAJc3RydWN0IHJlc291cmNlICpyZWdzOworCWVudW0gczNjX2NwdV90eXBlIGNwdSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCWludCByZXQ7CiAJdW5zaWduZWQgdG1wOwogCkBAIC0zOTQsMTAgKzQwMSwxMyBAQAogCWNsa19lbmFibGUoYWRjLT5jbGspOwogCiAJdG1wID0gYWRjLT5wcmVzY2FsZSB8IFMzQzI0MTBfQURDQ09OX1BSU0NFTjsKLQlpZiAocGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KS0+ZHJpdmVyX2RhdGEgIT0gVFlQRV9BRENWMSkgewotCQkvKiBFbmFibGUgMTItYml0IEFEQyByZXNvbHV0aW9uICovCisKKwkvKiBFbmFibGUgMTItYml0IEFEQyByZXNvbHV0aW9uICovCisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YxMikKKwkJdG1wIHw9IFMzQzI0MTZfQURDQ09OX1JFU1NFTDsKKwlpZiAoY3B1ID09IFRZUEVfQURDVjIgfHwgY3B1ID09IFRZUEVfQURDVjMpCiAJCXRtcCB8PSBTM0M2NFhYX0FEQ0NPTl9SRVNTRUw7Ci0JfQorCiAJd3JpdGVsKHRtcCwgYWRjLT5yZWdzICsgUzNDMjQxMF9BRENDT04pOwogCiAJZGV2X2luZm8oZGV2LCAiYXR0YWNoZWQgYWRjIGRyaXZlclxuIik7CkBAIC00NjQsNiArNDc0LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwKIAkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7CiAJc3RydWN0IGFkY19kZXZpY2UgKmFkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWVudW0gczNjX2NwdV90eXBlIGNwdSA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKQEAgLTQ3NCw5ICs0ODUsMTMgQEAKIAllbmFibGVfaXJxKGFkYy0+aXJxKTsKIAogCXRtcCA9IGFkYy0+cHJlc2NhbGUgfCBTM0MyNDEwX0FEQ0NPTl9QUlNDRU47CisKIAkvKiBFbmFibGUgMTItYml0IEFEQyByZXNvbHV0aW9uICovCi0JaWYgKHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhICE9IFRZUEVfQURDVjEpCisJaWYgKGNwdSA9PSBUWVBFX0FEQ1YxMikKKwkJdG1wIHw9IFMzQzI0MTZfQURDQ09OX1JFU1NFTDsKKwlpZiAoY3B1ID09IFRZUEVfQURDVjIgfHwgY3B1ID09IFRZUEVfQURDVjMpCiAJCXRtcCB8PSBTM0M2NFhYX0FEQ0NPTl9SRVNTRUw7CisKIAl3cml0ZWwodG1wLCBhZGMtPnJlZ3MgKyBTM0MyNDEwX0FEQ0NPTik7CiAKIAlyZXR1cm4gMDsKQEAgLTQ5Miw2ICs1MDcsMTIgQEAKIAkJLm5hbWUgICAgICAgICAgID0gInMzYzI0eHgtYWRjIiwKIAkJLmRyaXZlcl9kYXRhICAgID0gVFlQRV9BRENWMSwKIAl9LCB7CisJCS5uYW1lCQk9ICJzM2MyNDQzLWFkYyIsCisJCS5kcml2ZXJfZGF0YQk9IFRZUEVfQURDVjExLAorCX0sIHsKKwkJLm5hbWUJCT0gInMzYzI0MTYtYWRjIiwKKwkJLmRyaXZlcl9kYXRhCT0gVFlQRV9BRENWMTIsCisJfSwgewogCQkubmFtZSAgICAgICAgICAgPSAiczNjNjR4eC1hZGMiLAogCQkuZHJpdmVyX2RhdGEgICAgPSBUWVBFX0FEQ1YyLAogCX0sIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9jcHUuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMwNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2NwdS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9jcHUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFNhbXN1bmcgQ1BVIFN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxwbGF0L2NwdS5oPgorCit1bnNpZ25lZCBsb25nIHNhbXN1bmdfY3B1X2lkOworc3RhdGljIHVuc2lnbmVkIGludCBzYW1zdW5nX2NwdV9yZXY7CisKK3Vuc2lnbmVkIGludCBzYW1zdW5nX3Jldih2b2lkKQoreworCXJldHVybiBzYW1zdW5nX2NwdV9yZXY7Cit9CitFWFBPUlRfU1lNQk9MKHNhbXN1bmdfcmV2KTsKKwordm9pZCBfX2luaXQgczNjMjR4eF9pbml0X2NwdSh2b2lkKQoreworCS8qIG5vdGhpbmcgaGVyZSB5ZXQgKi8KKworCXNhbXN1bmdfY3B1X3JldiA9IDA7Cit9CisKK3ZvaWQgX19pbml0IHMzYzY0eHhfaW5pdF9jcHUodm9pZCkKK3sKKwlzYW1zdW5nX2NwdV9pZCA9IF9fcmF3X3JlYWRsKFMzQ19WQV9TWVMgKyAweDExOCk7CisJaWYgKCFzYW1zdW5nX2NwdV9pZCkgeworCQkvKgorCQkgKiBTM0M2NDAwIGhhcyB0aGUgSUQgcmVnaXN0ZXIgaW4gYSBkaWZmZXJlbnQgcGxhY2UsCisJCSAqIGFuZCBuZWVkcyBhIHdyaXRlIGJlZm9yZSBpdCBjYW4gYmUgcmVhZC4KKwkJICovCisJCV9fcmF3X3dyaXRlbCgweDAsIFMzQ19WQV9TWVMgKyAweEExQyk7CisJCXNhbXN1bmdfY3B1X2lkID0gX19yYXdfcmVhZGwoUzNDX1ZBX1NZUyArIDB4QTFDKTsKKwl9CisKKwlzYW1zdW5nX2NwdV9yZXYgPSAwOworfQorCit2b2lkIF9faW5pdCBzNXBfaW5pdF9jcHUodm9pZCBfX2lvbWVtICpjcHVpZF9hZGRyKQoreworCXNhbXN1bmdfY3B1X2lkID0gX19yYXdfcmVhZGwoY3B1aWRfYWRkcik7CisJc2Ftc3VuZ19jcHVfcmV2ID0gc2Ftc3VuZ19jcHVfaWQgJiAweEZGOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hZGMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYWRjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTAzZDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hZGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYWRjLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBNYXVydXMgQ3VlbGVuYWVyZQotICoKLSAqIFMzQzY0eHggc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBBREMgZGV2aWNlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2FkYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FkY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gU0FNU1VOR19QQV9BREMsCi0JCS5lbmQgICA9IFNBTVNVTkdfUEFfQURDICsgU1pfMjU2IC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9UQywKLQkJLmVuZCAgID0gSVJRX1RDLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0FEQywKLQkJLmVuZCAgID0gSVJRX0FEQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7Ci0JLm5hbWUJCT0gInNhbXN1bmctYWRjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19hZGNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19hZGNfcmVzb3VyY2UsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hc29jZG1hLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWFzb2NkbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlMzVkMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWFzb2NkbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYXNvY2RtYS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZAotICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0KLXN0YXRpYyB1NjQgYXVkaW9fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYSA9IHsKLQkubmFtZQkJICA9ICJzYW1zdW5nLWF1ZGlvIiwKLQkuaWQJCSAgPSAtMSwKLQkuZGV2ICAgICAgICAgICAgICA9IHsKLQkJLmRtYV9tYXNrID0gJmF1ZGlvX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCi0JfQotfTsKLUVYUE9SVF9TWU1CT0woc2Ftc3VuZ19hc29jX2RtYSk7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2lkbWEgPSB7Ci0JLm5hbWUJCT0gInNhbXN1bmctaWRtYSIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJmF1ZGlvX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfQotfTsKLUVYUE9SVF9TWU1CT0woc2Ftc3VuZ19hc29jX2lkbWEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYmFja2xpZ2h0LmMKaW5kZXggM2NlZGQ0Yy4uZTY1NzMwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWJhY2tsaWdodC5jCkBAIC0xMiw4ICsxMiwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWZiLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTEzNjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1mYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgZnJhbWVidWZmZXIgZGV2aWNlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZmIuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19mYl9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0ZCLAotCQkuZW5kICAgPSBTM0NfUEFfRkIgKyBTWl8xNksgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0xDRF9WU1lOQywKLQkJLmVuZCAgID0gSVJRX0xDRF9WU1lOQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydCA9IElSUV9MQ0RfRklGTywKLQkJLmVuZCAgID0gSVJRX0xDRF9GSUZPLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVszXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0xDRF9TWVNURU0sCi0JCS5lbmQgICA9IElSUV9MQ0RfU1lTVEVNLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2ZiID0gewotCS5uYW1lCQkgID0gInMzYy1mYiIsCi0JLmlkCQkgID0gLTEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2ZiX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19mYl9yZXNvdXJjZSwKLQkuZGV2LmRtYV9tYXNrCSAgPSAmczNjX2RldmljZV9mYi5kZXYuY29oZXJlbnRfZG1hX21hc2ssCi0JLmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTCwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19mYl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqcGQpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEpLAotCQkJICZzM2NfZGV2aWNlX2ZiKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YTY1Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaHNtbWMgZGV2aWNlcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLSNkZWZpbmUgUzNDX1NaX0hTTU1DCSgweDEwMDApCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzbW1jX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfSFNNTUMwLAotCQkuZW5kICAgPSBTM0NfUEFfSFNNTUMwICsgUzNDX1NaX0hTTU1DIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9IU01NQzAsCi0JCS5lbmQgICA9IElSUV9IU01NQzAsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9oc21tY19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzBfZGVmX3BsYXRkYXRhID0gewotCS5tYXhfd2lkdGgJPSA0LAotCS5ob3N0X2NhcHMJPSAoTU1DX0NBUF80X0JJVF9EQVRBIHwKLQkJCSAgIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEKSwKLQkuY2xrX3R5cGUJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9JTlRFUk5BTCwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzAgPSB7Ci0JLm5hbWUJCT0gInMzYy1zZGhjaSIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc21tY19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2hzbW1jX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnMzY19kZXZpY2VfaHNtbWNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZlVMLAotCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEsCi0JfSwKLX07Ci0KLXZvaWQgczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCi17Ci0Jc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqc2V0ID0gJnMzY19oc21tYzBfZGVmX3BsYXRkYXRhOwotCi0Jc2V0LT5jZF90eXBlID0gcGQtPmNkX3R5cGU7Ci0Jc2V0LT5leHRfY2RfaW5pdCA9IHBkLT5leHRfY2RfaW5pdDsKLQlzZXQtPmV4dF9jZF9jbGVhbnVwID0gcGQtPmV4dF9jZF9jbGVhbnVwOwotCXNldC0+ZXh0X2NkX2dwaW8gPSBwZC0+ZXh0X2NkX2dwaW87Ci0Jc2V0LT5leHRfY2RfZ3Bpb19pbnZlcnQgPSBwZC0+ZXh0X2NkX2dwaW9faW52ZXJ0OwotCi0JaWYgKHBkLT5tYXhfd2lkdGgpCi0JCXNldC0+bWF4X3dpZHRoID0gcGQtPm1heF93aWR0aDsKLQlpZiAocGQtPmNmZ19ncGlvKQotCQlzZXQtPmNmZ19ncGlvID0gcGQtPmNmZ19ncGlvOwotCWlmIChwZC0+Y2ZnX2NhcmQpCi0JCXNldC0+Y2ZnX2NhcmQgPSBwZC0+Y2ZnX2NhcmQ7Ci0JaWYgKHBkLT5ob3N0X2NhcHMpCi0JCXNldC0+aG9zdF9jYXBzIHw9IHBkLT5ob3N0X2NhcHM7Ci0JaWYgKHBkLT5jbGtfdHlwZSkKLQkJc2V0LT5jbGtfdHlwZSA9IHBkLT5jbGtfdHlwZTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMxLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk3MzIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaHNtbWMxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGhzbW1jIGRldmljZSAxCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxwbGF0L3NkaGNpLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotI2RlZmluZSBTM0NfU1pfSFNNTUMJKDB4MTAwMCkKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMxX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfSFNNTUMxLAotCQkuZW5kICAgPSBTM0NfUEFfSFNNTUMxICsgUzNDX1NaX0hTTU1DIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9IU01NQzEsCi0JCS5lbmQgICA9IElSUV9IU01NQzEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9oc21tYzFfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCT0gNCwKLQkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCi0JLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMxID0gewotCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAotCS5pZAkJPSAxLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWMxX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaHNtbWMxX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnMzY19kZXZpY2VfaHNtbWMxX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmZVTCwKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzFfZGVmX3BsYXRkYXRhLAotCX0sCi19OwotCi12b2lkIHMzY19zZGhjaTFfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQotewotCXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnNldCA9ICZzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YTsKLQotCXNldC0+Y2RfdHlwZSA9IHBkLT5jZF90eXBlOwotCXNldC0+ZXh0X2NkX2luaXQgPSBwZC0+ZXh0X2NkX2luaXQ7Ci0Jc2V0LT5leHRfY2RfY2xlYW51cCA9IHBkLT5leHRfY2RfY2xlYW51cDsKLQlzZXQtPmV4dF9jZF9ncGlvID0gcGQtPmV4dF9jZF9ncGlvOwotCXNldC0+ZXh0X2NkX2dwaW9faW52ZXJ0ID0gcGQtPmV4dF9jZF9ncGlvX2ludmVydDsKLQotCWlmIChwZC0+bWF4X3dpZHRoKQotCQlzZXQtPm1heF93aWR0aCA9IHBkLT5tYXhfd2lkdGg7Ci0JaWYgKHBkLT5jZmdfZ3BpbykKLQkJc2V0LT5jZmdfZ3BpbyA9IHBkLT5jZmdfZ3BpbzsKLQlpZiAocGQtPmNmZ19jYXJkKQotCQlzZXQtPmNmZ19jYXJkID0gcGQtPmNmZ19jYXJkOwotCWlmIChwZC0+aG9zdF9jYXBzKQotCQlzZXQtPmhvc3RfY2FwcyB8PSBwZC0+aG9zdF9jYXBzOwotCWlmIChwZC0+Y2xrX3R5cGUpCi0JCXNldC0+Y2xrX3R5cGUgPSBwZC0+Y2xrX3R5cGU7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYWVkYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMi5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWhzbW1jMi5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIENvcHlyaWdodCAoYykgMjAwOSBNYXVydXMgQ3VlbGVuYWVyZQotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL3BsYXQtczNjL2Rldi1oc21tYzEuYwotICogb3JpZ2luYWwgZmlsZSBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaHNtbWMgZGV2aWNlIDIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvc2RoY2kuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotI2RlZmluZSBTM0NfU1pfSFNNTUMJKDB4MTAwMCkKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMyX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfSFNNTUMyLAotCQkuZW5kICAgPSBTM0NfUEFfSFNNTUMyICsgUzNDX1NaX0hTTU1DIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9IU01NQzIsCi0JCS5lbmQgICA9IElSUV9IU01NQzIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV9oc21tYzJfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YSA9IHsKLQkubWF4X3dpZHRoCT0gNCwKLQkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8Ci0JCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCi0JLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMyID0gewotCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAotCS5pZAkJPSAyLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWMyX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaHNtbWMyX3Jlc291cmNlLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnMzY19kZXZpY2VfaHNtbWMyX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmZVTCwKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJnMzY19oc21tYzJfZGVmX3BsYXRkYXRhLAotCX0sCi19OwotCi12b2lkIHMzY19zZGhjaTJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnBkKQotewotCXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgKnNldCA9ICZzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YTsKLQotCXNldC0+Y2RfdHlwZSA9IHBkLT5jZF90eXBlOwotCXNldC0+ZXh0X2NkX2luaXQgPSBwZC0+ZXh0X2NkX2luaXQ7Ci0Jc2V0LT5leHRfY2RfY2xlYW51cCA9IHBkLT5leHRfY2RfY2xlYW51cDsKLQlzZXQtPmV4dF9jZF9ncGlvID0gcGQtPmV4dF9jZF9ncGlvOwotCXNldC0+ZXh0X2NkX2dwaW9faW52ZXJ0ID0gcGQtPmV4dF9jZF9ncGlvX2ludmVydDsKLQotCWlmIChwZC0+bWF4X3dpZHRoKQotCQlzZXQtPm1heF93aWR0aCA9IHBkLT5tYXhfd2lkdGg7Ci0JaWYgKHBkLT5jZmdfZ3BpbykKLQkJc2V0LT5jZmdfZ3BpbyA9IHBkLT5jZmdfZ3BpbzsKLQlpZiAocGQtPmNmZ19jYXJkKQotCQlzZXQtPmNmZ19jYXJkID0gcGQtPmNmZ19jYXJkOwotCWlmIChwZC0+aG9zdF9jYXBzKQotCQlzZXQtPmhvc3RfY2FwcyB8PSBwZC0+aG9zdF9jYXBzOwotCWlmIChwZC0+Y2xrX3R5cGUpCi0JCXNldC0+Y2xrX3R5cGUgPSBwZC0+Y2xrX3R5cGU7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNzc2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWhzbW1jMy5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1oc21tYzMuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIEJhc2VkIG9uIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHNtbWMxLmMKLSAqCi0gKiBTYW1zdW5nIGRldmljZSBkZWZpbml0aW9uIGZvciBoc21tYyBkZXZpY2UgMwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotCi0jZGVmaW5lIFMzQ19TWl9IU01NQwkoMHgxMDAwKQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc21tYzNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQ19QQV9IU01NQzMsCi0JCS5lbmQJPSBTM0NfUEFfSFNNTUMzICsgUzNDX1NaX0hTTU1DIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9IU01NQzMsCi0JCS5lbmQJPSBJUlFfSFNNTUMzLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9Ci19OwotCi1zdGF0aWMgdTY0IHMzY19kZXZpY2VfaHNtbWMzX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBzM2Nfc2RoY2lfcGxhdGRhdGEgczNjX2hzbW1jM19kZWZfcGxhdGRhdGEgPSB7Ci0JLm1heF93aWR0aAk9IDQsCi0JLmhvc3RfY2Fwcwk9IChNTUNfQ0FQXzRfQklUX0RBVEEgfAotCQkJICAgTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQpLAotCS5jbGtfdHlwZQk9IFMzQ19TREhDSV9DTEtfRElWX0lOVEVSTkFMLAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMyA9IHsKLQkubmFtZQkJPSAiczNjLXNkaGNpIiwKLQkuaWQJCT0gMywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2hzbW1jM19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2hzbW1jM19yZXNvdXJjZSwKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfZGV2aWNlX2hzbW1jM19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmVUwsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YSwKLQl9LAotfTsKLQotdm9pZCBzM2Nfc2RoY2kzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCkKLXsKLQlzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpzZXQgPSAmczNjX2hzbW1jM19kZWZfcGxhdGRhdGE7Ci0KLQlzZXQtPmNkX3R5cGUgPSBwZC0+Y2RfdHlwZTsKLQlzZXQtPmV4dF9jZF9pbml0ID0gcGQtPmV4dF9jZF9pbml0OwotCXNldC0+ZXh0X2NkX2NsZWFudXAgPSBwZC0+ZXh0X2NkX2NsZWFudXA7Ci0Jc2V0LT5leHRfY2RfZ3BpbyA9IHBkLT5leHRfY2RfZ3BpbzsKLQlzZXQtPmV4dF9jZF9ncGlvX2ludmVydCA9IHBkLT5leHRfY2RfZ3Bpb19pbnZlcnQ7Ci0KLQlpZiAocGQtPm1heF93aWR0aCkKLQkJc2V0LT5tYXhfd2lkdGggPSBwZC0+bWF4X3dpZHRoOwotCWlmIChwZC0+Y2ZnX2dwaW8pCi0JCXNldC0+Y2ZnX2dwaW8gPSBwZC0+Y2ZnX2dwaW87Ci0JaWYgKHBkLT5jZmdfY2FyZCkKLQkJc2V0LT5jZmdfY2FyZCA9IHBkLT5jZmdfY2FyZDsKLQlpZiAocGQtPmhvc3RfY2FwcykKLQkJc2V0LT5ob3N0X2NhcHMgfD0gcGQtPmhvc3RfY2FwczsKLQlpZiAocGQtPmNsa190eXBlKQotCQlzZXQtPmNsa190eXBlID0gcGQtPmNsa190eXBlOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1od21vbi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1od21vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFhNzljLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHdtb24uYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaHdtb24uYwotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBBZGFwdGVkIGZvciBIV01PTiBieSBNYXVydXMgQ3VlbGVuYWVyZQotICoKLSAqIFNhbXN1bmcgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBIV01PTgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2h3bW9uLmg+Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9od21vbiA9IHsKLQkubmFtZQkJPSAiczNjLWh3bW9uIiwKLQkuaWQJCT0gLTEsCi0JLmRldi5wYXJlbnQJPSAmczNjX2RldmljZV9hZGMuZGV2LAotfTsKLQotdm9pZCBfX2luaXQgczNjX2h3bW9uX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2h3bW9uX3BkYXRhICpwZCkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzY19od21vbl9wZGF0YSksCi0JCQkgJnMzY19kZXZpY2VfaHdtb24pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMwLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyNTFmNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMwLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0lJQywKLQkJLmVuZCAgID0gUzNDX1BBX0lJQyArIFNaXzRLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9JSUMsCi0JCS5lbmQgICA9IElSUV9JSUMsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMCA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLWkyYyIsCi0jaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDMQotCS5pZAkJICA9IDAsCi0jZWxzZQotCS5pZAkJICA9IC0xLAotI2VuZGlmCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2kyY19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjIGRlZmF1bHRfaTJjX2RhdGEgX19pbml0ZGF0YSA9IHsKLQkuZmxhZ3MJCT0gMCwKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmZyZXF1ZW5jeQk9IDEwMCoxMDAwLAotCS5zZGFfZGVsYXkJPSAxMDAsCi19OwotCi12b2lkIF9faW5pdCBzM2NfaTJjMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKLQotCWlmICghcGQpCi0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmMwKTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMwX2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMxLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3YzdiZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzEuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMxLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDEKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ID0gUzNDX1BBX0lJQzEsCi0JCS5lbmQgICA9IFMzQ19QQV9JSUMxICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ID0gSVJRX0lJQzEsCi0JCS5lbmQgICA9IElSUV9JSUMxLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzEgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1pMmMiLAotCS5pZAkJICA9IDEsCi0JLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2kyY19yZXNvdXJjZSksCi0JLnJlc291cmNlCSAgPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzFfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0JCXBkLT5idXNfbnVtID0gMTsKLQl9Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmMxKTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMxX2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMyLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlOWZkMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzIuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFMzQyBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgMgotICoKLSAqIEJhc2VkIG9uIHBsYXQtc2Ftc3VuZy9kZXYtaTJjMC5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQ19QQV9JSUMyLAotCQkuZW5kICAgPSBTM0NfUEFfSUlDMiArIFNaXzRLIC0gMSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCA9IElSUV9JSUMyLAotCQkuZW5kICAgPSBJUlFfSUlDMiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMyID0gewotCS5uYW1lCQkgID0gInMzYzI0MTAtaTJjIiwKLQkuaWQJCSAgPSAyLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQkgID0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19pMmMyX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQotewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwotCi0JaWYgKCFwZCkgewotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCQlwZC0+YnVzX251bSA9IDI7Ci0JfQotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMik7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMl9jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGVmYTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmMzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzMuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogUzVQIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaTJjIGRldmljZSAzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfSUlDMywKLQkJLmVuZAk9IFMzQ19QQV9JSUMzICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0lJQzMsCi0JCS5lbmQJPSBJUlFfSUlDMywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMzID0gewotCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCi0JLmlkCQk9IDMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19pMmNfcmVzb3VyY2UsCi19OwotCi12b2lkIF9faW5pdCBzM2NfaTJjM19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKLQkJcGQtPmJ1c19udW0gPSAzOwotCX0KLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAotCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzMpOwotCi0JaWYgKCFucGQtPmNmZ19ncGlvKQotCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzNfY2ZnX2dwaW87Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UyNjQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgMwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX0lJQzQsCi0JCS5lbmQJPSBTM0NfUEFfSUlDNCArIFNaXzRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9JSUM0LAotCQkuZW5kCT0gSVJRX0lJQzQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjNCA9IHsKLQkubmFtZQkJPSAiczNjMjQ0MC1pMmMiLAotCS5pZAkJPSA0LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzRfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0JCXBkLT5idXNfbnVtID0gNDsKLQl9Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmM0KTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM0X2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM1LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5NjU1Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzUuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjMy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTNVAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBpMmMgZGV2aWNlIDMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFMzQ19QQV9JSUM1LAotCQkuZW5kCT0gUzNDX1BBX0lJQzUgKyBTWl80SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfSUlDNSwKLQkJLmVuZAk9IElSUV9JSUM1LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzUgPSB7Ci0JLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKLQkuaWQJCT0gNSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyY19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX2kyY19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzY19pMmM1X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQotewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOwotCi0JaWYgKCFwZCkgewotCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOwotCQlwZC0+YnVzX251bSA9IDU7Ci0JfQotCi0JbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCi0JCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNSk7Ci0KLQlpZiAoIW5wZC0+Y2ZnX2dwaW8pCi0JCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjNV9jZmdfZ3BpbzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNi5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWQ3OTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzYuYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogUzVQIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgaTJjIGRldmljZSA2Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgotI2luY2x1ZGUgPHBsYXQvaWljLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfSUlDNiwKLQkJLmVuZAk9IFMzQ19QQV9JSUM2ICsgU1pfNEsgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX0lJQzYsCi0JCS5lbmQJPSBJUlFfSUlDNiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM2ID0gewotCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCi0JLmlkCQk9IDYsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY19pMmNfcmVzb3VyY2UsCi19OwotCi12b2lkIF9faW5pdCBzM2NfaTJjNl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKLQotCWlmICghcGQpIHsKLQkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKLQkJcGQtPmJ1c19udW0gPSA2OwotCX0KLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAotCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzYpOwotCi0JaWYgKCFucGQtPmNmZ19ncGlvKQotCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzZfY2ZnX2dwaW87Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWkyYzcuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGRkY2QxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaTJjNy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pMmM3LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLwotICoKLSAqIFM1UCBzZXJpZXMgZGV2aWNlIGRlZmluaXRpb24gZm9yIGkyYyBkZXZpY2UgNwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KLSNpbmNsdWRlIDxwbGF0L2lpYy5oPgotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyY19yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX0lJQzcsCi0JCS5lbmQJPSBTM0NfUEFfSUlDNyArIFNaXzRLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9JSUM3LAotCQkuZW5kCT0gSVJRX0lJQzcsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjNyA9IHsKLQkubmFtZQkJPSAiczNjMjQ0MC1pMmMiLAotCS5pZAkJPSA3LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfaTJjX3Jlc291cmNlLAotfTsKLQotdm9pZCBfX2luaXQgczNjX2kyYzdfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCi17Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7Ci0KLQlpZiAoIXBkKSB7Ci0JCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7Ci0JCXBkLT5idXNfbnVtID0gNzsKLQl9Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKLQkJCSAgICAgICAmczNjX2RldmljZV9pMmM3KTsKLQotCWlmICghbnBkLT5jZmdfZ3BpbykKLQkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM3X2NmZ19ncGlvOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pZGUuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaWRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTc5ODIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1pZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtaWRlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogU2Ftc3VuZyBDRi1BVEEgZGV2aWNlIGRlZmluaXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8cGxhdC9hdGEuaD4KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfY2Zjb25fcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFNBTVNVTkdfUEFfQ0ZDT04sCi0JCS5lbmQJPSBTQU1TVU5HX1BBX0NGQ09OICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9DRkNPTiwKLQkJLmVuZAk9IElSUV9DRkNPTiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9jZmNvbiA9IHsKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2NmY29uX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJPSBzM2NfY2Zjb25fcmVzb3VyY2UsCi19OwotCi12b2lkIHMzY19pZGVfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2NfaWRlX3BsYXRkYXRhICpwZGF0YSkKLXsKLQlzM2Nfc2V0X3BsYXRkYXRhKHBkYXRhLCBzaXplb2Yoc3RydWN0IHMzY19pZGVfcGxhdGRhdGEpLAotCQkJICZzM2NfZGV2aWNlX2NmY29uKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYta2V5cGFkLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWtleXBhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzdjMmQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYta2V5cGFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1rZXlwYWQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9rZXlwYWQuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYW1zdW5nX2tleXBhZF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IFNBTVNVTkdfUEFfS0VZUEFELAotCQkuZW5kCT0gU0FNU1VOR19QQV9LRVlQQUQgKyAweDIwIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElSUV9LRVlQQUQsCi0JCS5lbmQJPSBJUlFfS0VZUEFELAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2RldmljZV9rZXlwYWQgPSB7Ci0JLm5hbWUJCT0gInNhbXN1bmcta2V5cGFkIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNhbXN1bmdfa2V5cGFkX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gc2Ftc3VuZ19rZXlwYWRfcmVzb3VyY2VzLAotfTsKLQotdm9pZCBfX2luaXQgc2Ftc3VuZ19rZXlwYWRfc2V0X3BsYXRkYXRhKHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSAqcGQpCi17Ci0Jc3RydWN0IHNhbXN1bmdfa2V5cGFkX3BsYXRkYXRhICpucGQ7Ci0KLQlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHNhbXN1bmdfa2V5cGFkX3BsYXRkYXRhKSwKLQkJCSZzYW1zdW5nX2RldmljZV9rZXlwYWQpOwotCi0JaWYgKCFucGQtPmNmZ19ncGlvKQotCQlucGQtPmNmZ19ncGlvID0gc2Ftc3VuZ19rZXlwYWRfY2ZnX2dwaW87Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW5hbmQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtbmFuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUzMGVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtbmFuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBuYW5kIGRldmljZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8cGxhdC9kZXZzLmg+Ci0jaW5jbHVkZSA8cGxhdC9uYW5kLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX25hbmRfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFMzQ19QQV9OQU5ELAotCQkuZW5kICAgPSBTM0NfUEFfTkFORCArIFNaXzFNLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9Ci19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbmFuZCA9IHsKLQkubmFtZQkJICA9ICJzM2MyNDEwLW5hbmQiLAotCS5pZAkJICA9IC0xLAotCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHMzY19uYW5kX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY19uYW5kX3Jlc291cmNlLAotfTsKLQotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX25hbmQpOwotCi0vKioKLSAqIHMzY19uYW5kX2NvcHlfc2V0KCkgLSBjb3B5IG5hbmQgc2V0IGRhdGEKLSAqIEBzZXQ6IFRoZSBuZXcgc3RydWN0dXJlLCBkaXJlY3RseSBjb3BpZWQgZnJvbSB0aGUgb2xkLgotICoKLSAqIENvcHkgYWxsIHRoZSBmaWVsZHMgZnJvbSB0aGUgTkFORCBzZXQgZmllbGQgZnJvbSB3aGF0IGlzIHByb2JhYmx5IF9faW5pdGRhdGEKLSAqIHRvIG5ldyBrZXJuZWwgbWVtb3J5LiBUaGUgY29kZSByZXR1cm5zIDAgaWYgdGhlIGNvcHkgaGFwcGVuZWQgY29ycmVjdGx5IG9yCi0gKiBhbiBlcnJvciBjb2RlIGZvciB0aGUgY2FsbGluZyBmdW5jdGlvbiB0byBkaXNwbGF5LgotICoKLSAqIE5vdGUsIHdlIGN1cnJlbnRseSBkbyBub3QgdHJ5IGFuZCBsb29rIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IGNvcGllZCB0aGUKLSAqIGRhdGEgaW4gYSBwcmV2aW91cyBzZXQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHMzY19uYW5kX2NvcHlfc2V0KHN0cnVjdCBzM2MyNDEwX25hbmRfc2V0ICpzZXQpCi17Ci0Jdm9pZCAqcHRyOwotCWludCBzaXplOwotCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbXRkX3BhcnRpdGlvbikgKiBzZXQtPm5yX3BhcnRpdGlvbnM7Ci0JaWYgKHNpemUpIHsKLQkJcHRyID0ga21lbWR1cChzZXQtPnBhcnRpdGlvbnMsIHNpemUsIEdGUF9LRVJORUwpOwotCQlzZXQtPnBhcnRpdGlvbnMgPSBwdHI7Ci0KLQkJaWYgKCFwdHIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JCi0JaWYgKHNldC0+bnJfbWFwICYmIHNldC0+bnJfY2hpcHMpIHsKLQkJc2l6ZSA9IHNpemVvZihpbnQpICogc2V0LT5ucl9jaGlwczsKLQkJcHRyID0ga21lbWR1cChzZXQtPm5yX21hcCwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCXNldC0+bnJfbWFwID0gcHRyOwotCi0JCWlmICghcHRyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKHNldC0+ZWNjX2xheW91dCkgewotCQlwdHIgPSBrbWVtZHVwKHNldC0+ZWNjX2xheW91dCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQpLCBHRlBfS0VSTkVMKTsKLQkJc2V0LT5lY2NfbGF5b3V0ID0gcHRyOwotCi0JCWlmICghcHRyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCQotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBzM2NfbmFuZF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCAqbmFuZCkKLXsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kICpucGQ7Ci0JaW50IHNpemU7Ci0JaW50IHJldDsKLQotCS8qIG5vdGUsIGlmIHdlIGdldCBhIGZhaWx1cmUgaW4gYWxsb2NhdGlvbiwgd2Ugc2ltcGx5IGRyb3Agb3V0IG9mIHRoZQotCSAqIGZ1bmN0aW9uLiBJZiB0aGVyZSBpcyBzbyBsaXR0bGUgbWVtb3J5IGF2YWlsYWJsZSBhdCBpbml0aWFsaXNhdGlvbgotCSAqIHRpbWUgdGhlbiB0aGVyZSBpcyBsaXR0bGUgY2hhbmNlIHRoZSBzeXN0ZW0gaXMgZ29pbmcgdG8gcnVuLgotCSAqLyAKLQotCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEobmFuZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQpLAotCQkJCSZzM2NfZGV2aWNlX25hbmQpOwotCWlmICghbnBkKQotCQlyZXR1cm47Ci0KLQkvKiBub3cgc2VlIGlmIHdlIG5lZWQgdG8gY29weSBhbnkgb2YgdGhlIG5hbmQgc2V0IGRhdGEgKi8KLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQpICogbnBkLT5ucl9zZXRzOwotCWlmIChzaXplKSB7Ci0JCXN0cnVjdCBzM2MyNDEwX25hbmRfc2V0ICpmcm9tID0gbnBkLT5zZXRzOwotCQlzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqdG87Ci0JCWludCBpOwotCi0JCXRvID0ga21lbWR1cChmcm9tLCBzaXplLCBHRlBfS0VSTkVMKTsKLQkJbnBkLT5zZXRzID0gdG87CS8qIHNldCwgZXZlbiBpZiB3ZSBmYWlsZWQgKi8KLQotCQlpZiAoIXRvKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZW1vcnkgZm9yIHNldHNcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChpID0gMDsgaSA8IG5wZC0+bnJfc2V0czsgaSsrKSB7Ci0JCQlyZXQgPSBzM2NfbmFuZF9jb3B5X3NldCh0byk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGNvcHkgc2V0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0bysrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1vbmVuYW5kLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0YWU3MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LW9uZW5hbmQuYwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiAgS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KLSAqCi0gKiBTM0M2NFhYL1M1UEMxMDAgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBPbmVOQU5EIGRldmljZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX29uZW5hbmRfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfT05FTkFORCwKLQkJLmVuZAk9IFMzQ19QQV9PTkVOQU5EICsgMHg0MDAgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gUzNDX1BBX09ORU5BTkRfQlVGLAotCQkuZW5kCT0gUzNDX1BBX09ORU5BTkRfQlVGICsgUzNDX1NaX09ORU5BTkRfQlVGIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IElSUV9PTkVOQU5ELAotCQkuZW5kCT0gSVJRX09ORU5BTkQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfb25lbmFuZCA9IHsKLQkubmFtZQkJPSAic2Ftc3VuZy1vbmVuYW5kIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX29uZW5hbmRfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzM2Nfb25lbmFuZF9yZXNvdXJjZXMsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1wd20uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcHdtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjQ3YjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1wd20uYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcHdtLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEJlbiBEb29rcwotICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiwgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgdGhlIFBXTSB0aW1lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotI2RlZmluZSBUSU1FUl9SRVNPVVJDRV9TSVpFICgxKQotCi0jZGVmaW5lIFRJTUVSX1JFU09VUkNFKF90bXIsIF9pcnEpCQkJXAotCShzdHJ1Y3QgcmVzb3VyY2UgW1RJTUVSX1JFU09VUkNFX1NJWkVdKSB7CVwKLQkJWzBdID0gewkJCQkJXAotCQkJLnN0YXJ0CT0gX2lycSwJCQlcCi0JCQkuZW5kCT0gX2lycSwJCQlcCi0JCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQlcCi0JCX0JCQkJCVwKLQl9Ci0KLSNkZWZpbmUgREVGSU5FX1MzQ19USU1FUihfdG1yX25vLCBfaXJxKQkJCVwKLQkubmFtZQkJPSAiczNjMjR4eC1wd20iLAkJXAotCS5pZAkJPSBfdG1yX25vLAkJCVwKLQkubnVtX3Jlc291cmNlcwk9IFRJTUVSX1JFU09VUkNFX1NJWkUsCQlcCi0JLnJlc291cmNlCT0gVElNRVJfUkVTT1VSQ0UoX3Rtcl9ubywgX2lycSksCVwKLQotLyoKLSAqIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhbiBzdGF0aWMgbWFwcGluZyBmb3IgdGhlIHRpbWVyLAotICogd2UgZG8gbm90IGJvdGhlciBzZXR0aW5nIGFueSBJTyByZXNvdXJjZSBmb3IgdGhlIGJhc2UuCi0gKi8KLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyW10gPSB7Ci0JWzBdID0geyBERUZJTkVfUzNDX1RJTUVSKDAsIElSUV9USU1FUjApIH0sCi0JWzFdID0geyBERUZJTkVfUzNDX1RJTUVSKDEsIElSUV9USU1FUjEpIH0sCi0JWzJdID0geyBERUZJTkVfUzNDX1RJTUVSKDIsIElSUV9USU1FUjIpIH0sCi0JWzNdID0geyBERUZJTkVfUzNDX1RJTUVSKDMsIElSUV9USU1FUjMpIH0sCi0JWzRdID0geyBERUZJTkVfUzNDX1RJTUVSKDQsIElSUV9USU1FUjQpIH0sCi19OwotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcnRjLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXJ0Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjRlMjI2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtcnRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXJ0Yy5jCi0gKgotICogQ29weXJpZ2h0IDIwMDkgYnkgTWF1cnVzIEN1ZWxlbmFlcmUgPG1jdWVsZW5hZXJlQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfcnRjX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfUlRDLAotCQkuZW5kCT0gUzNDX1BBX1JUQyArIDB4ZmYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBJUlFfUlRDX0FMQVJNLAotCQkuZW5kCT0gSVJRX1JUQ19BTEFSTSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS5zdGFydAk9IElSUV9SVENfVElDLAotCQkuZW5kCT0gSVJRX1JUQ19USUMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCi0JfQotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3J0YyA9IHsKLQkubmFtZQkJPSAiczNjNjR4eC1ydGMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3J0Y19yZXNvdXJjZSksCi0JLnJlc291cmNlCT0gczNjX3J0Y19yZXNvdXJjZSwKLX07Ci1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfcnRjKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdHMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1NDNmMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXRzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiwgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci0gKgotICogQWRhcHRlZCBieSBNYXVydXMgQ3VlbGVuYWVyZSBmb3IgczNjNjR4eAotICoKLSAqIFMzQzY0WFggc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciB0b3VjaHNjcmVlbiBkZXZpY2UKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvdHMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdHNfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCA9IFNBTVNVTkdfUEFfQURDLAotCQkuZW5kICAgPSBTQU1TVU5HX1BBX0FEQyArIFNaXzI1NiAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfVEMsCi0JCS5lbmQgICA9IElSUV9UQywKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90cyA9IHsKLQkubmFtZQkJPSAiczNjNjR4eC10cyIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdHNfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY190c19yZXNvdXJjZSwKLX07Ci0KLXZvaWQgX19pbml0IHMzYzI0eHhfdHNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyAqcGQpCi17Ci0JczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyksCi0JCQkgJnMzY19kZXZpY2VfdHMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi11c2ItaHNvdGcuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLWhzb3RnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTg0NGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi11c2ItaHNvdGcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2Rldi11c2ItaHNvdGcuYwotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIGRldmljZSBkZWZpbml0aW9uIGZvciBVU0IgaGlnaC1zcGVlZCBVREMvT3RHIGJsb2NrCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191c2JfaHNvdGdfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfVVNCX0hTT1RHLAotCQkuZW5kCT0gUzNDX1BBX1VTQl9IU09URyArIDB4MTAwMDAgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX09URywKLQkJLmVuZAk9IElSUV9PVEcsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHMzY19oc290Z19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYl9oc290ZyA9IHsKLQkubmFtZQkJPSAiczNjLWhzb3RnIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY191c2JfaHNvdGdfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBzM2NfdXNiX2hzb3RnX3Jlc291cmNlcywKLQkuZGV2CQk9IHsKLQkJLmRtYV9tYXNrCQk9ICZzM2NfaHNvdGdfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LXVzYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZiYWE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtdXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXMzYy9kZXYtdXNiLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgVVNCIGhvc3QKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgotI2luY2x1ZGUgPHBsYXQvdXNiLWNvbnRyb2wuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiX3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgPSBTM0NfUEFfVVNCSE9TVCwKLQkJLmVuZCAgID0gUzNDX1BBX1VTQkhPU1QgKyAweDEwMCAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgPSBJUlFfVVNCSCwKLQkJLmVuZCAgID0gSVJRX1VTQkgsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0YXRpYyB1NjQgczNjX2RldmljZV91c2JfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX29oY2kgPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjQxMC1vaGNpIiwKLQkuaWQJCSAgPSAtMSwKLQkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2NfdXNiX3Jlc291cmNlKSwKLQkucmVzb3VyY2UJICA9IHMzY191c2JfcmVzb3VyY2UsCi0JLmRldiAgICAgICAgICAgICAgPSB7Ci0JCS5kbWFfbWFzayA9ICZzM2NfZGV2aWNlX3VzYl9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2Vfb2hjaSk7Ci0KLS8qKgotICogczNjX29oY2lfc2V0X3BsYXRkYXRhIC0gaW5pdGlhbGlzZSBPSENJIGRldmljZSBwbGF0Zm9ybSBkYXRhCi0gKiBAaW5mbzogVGhlIHBsYXRmb3JtIGRhdGEuCi0gKgotICogVGhpcyBjYWxsIGNvcGllcyB0aGUgQGluZm8gcGFzc2VkIGluIGFuZCBzZXRzIHRoZSBkZXZpY2UgLnBsYXRmb3JtX2RhdGEKLSAqIGZpZWxkIHRvIHRoYXQgY29weS4gVGhlIEBpbmZvIGlzIGNvcGllZCBzbyB0aGF0IHRoZSBvcmlnaW5hbCBjYW4gYmUgbWFya2VkCi0gKiBfX2luaXRkYXRhLgotICovCi12b2lkIF9faW5pdCBzM2Nfb2hjaV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfaGNkX2luZm8gKmluZm8pCi17Ci0JczNjX3NldF9wbGF0ZGF0YShpbmZvLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfaGNkX2luZm8pLAotCQkJICZzM2NfZGV2aWNlX29oY2kpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi13ZHQuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtd2R0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOWI1YjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi13ZHQuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtd2R0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKgotICogUzNDIHNlcmllcyBkZXZpY2UgZGVmaW5pdGlvbiBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RldnMuaD4KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfd2R0X3Jlc291cmNlW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBTM0NfUEFfV0RULAotCQkuZW5kCT0gUzNDX1BBX1dEVCArIFNaXzFLLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gSVJRX1dEVCwKLQkJLmVuZAk9IElSUV9XRFQsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV93ZHQgPSB7Ci0JLm5hbWUJCT0gInMzYzI0MTAtd2R0IiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY193ZHRfcmVzb3VyY2UpLAotCS5yZXNvdXJjZQk9IHMzY193ZHRfcmVzb3VyY2UsCi19OwotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3dkdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2cy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RldnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E4YjU3MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXZzLmMKQEAgLTAsMCArMSwxNDYzIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2cy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEJhc2UgU0FNU1VORyBwbGF0Zm9ybSBkZXZpY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvb25lbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcG11Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9hZGMuaD4KKyNpbmNsdWRlIDxwbGF0L2F0YS5oPgorI2luY2x1ZGUgPHBsYXQvZWhjaS5oPgorI2luY2x1ZGUgPHBsYXQvZmIuaD4KKyNpbmNsdWRlIDxwbGF0L2ZiLXMzYzI0MTAuaD4KKyNpbmNsdWRlIDxwbGF0L2h3bW9uLmg+CisjaW5jbHVkZSA8cGxhdC9paWMuaD4KKyNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgorI2luY2x1ZGUgPHBsYXQvbWNpLmg+CisjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgorI2luY2x1ZGUgPHBsYXQvdHMuaD4KKyNpbmNsdWRlIDxwbGF0L3VkYy5oPgorI2luY2x1ZGUgPHBsYXQvdXNiLWNvbnRyb2wuaD4KKyNpbmNsdWRlIDxwbGF0L3VzYi1waHkuaD4KKyNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXQvcmVncy1zcGkuaD4KKworc3RhdGljIHU2NCBzYW1zdW5nX2RldmljZV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKKy8qIEFDOTcgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2FjOTdfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNDQwX1BBX0FDOTcsIFMzQzI0NDBfU1pfQUM5NyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1MzQzI0NFhfQUM5NyksCisJWzJdID0gREVGSU5FX1JFU19ETUFfTkFNRUQoRE1BQ0hfUENNX09VVCwgIlBDTSBvdXQiKSwKKwlbM10gPSBERUZJTkVfUkVTX0RNQV9OQU1FRChETUFDSF9QQ01fSU4sICJQQ00gaW4iKSwKKwlbNF0gPSBERUZJTkVfUkVTX0RNQV9OQU1FRChETUFDSF9NSUNfSU4sICJNaWMgaW4iKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hYzk3ID0geworCS5uYW1lCQk9ICJzYW1zdW5nLWFjOTciLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2FjOTdfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19hYzk3X3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCisKKy8qIEFEQyAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfYWRjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9BREMsIFMzQzI0WFhfU1pfQURDKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfVEMpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9BREMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2FkYyA9IHsKKwkubmFtZQkJPSAiczNjMjR4eC1hZGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2FkY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2FkY19yZXNvdXJjZSwKK307CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0FNU1VOR19ERVZfQURDKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfYWRjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oU0FNU1VOR19QQV9BREMsIFNaXzI1NiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1RDKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfQURDKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGMgPSB7CisJLm5hbWUJCT0gInNhbXN1bmctYWRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19hZGNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19hZGNfcmVzb3VyY2UsCit9OworI2VuZGlmIC8qIENPTkZJR19TQU1TVU5HX0RFVl9BREMgKi8KKworLyogQ2FtaWYgQ29udHJvbGxlciAqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19jYW1pZl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0NDBfUEFfQ0FNSUYsIFMzQzI0NDBfU1pfQ0FNSUYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9DQU0pLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2NhbWlmID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWNhbWlmIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19jYW1pZl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2NhbWlmX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCisKKy8qIEFTT0MgRE1BICovCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYSA9IHsKKwkubmFtZQkJPSAic2Ftc3VuZy1hdWRpbyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2lkbWEgPSB7CisJLm5hbWUJCT0gInNhbXN1bmctaWRtYSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisKKy8qIEZCICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9GQgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfZmJfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfRkIsIFNaXzE2SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0xDRF9WU1lOQyksCisJWzJdID0gREVGSU5FX1JFU19JUlEoSVJRX0xDRF9GSUZPKSwKKwlbM10gPSBERUZJTkVfUkVTX0lSUShJUlFfTENEX1NZU1RFTSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfZmIgPSB7CisJLm5hbWUJCT0gInMzYy1mYiIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfZmJfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19mYl9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgczNjX2ZiX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2ZiX3BsYXRkYXRhICpwZCkKK3sKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSksCisJCQkgJnMzY19kZXZpY2VfZmIpOworfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0ZCICovCisKKy8qIEZJTUMgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0ZJTUMwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9GSU1DMCwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9GSU1DMCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzAgPSB7CisJLm5hbWUJCT0gInM1cC1maW1jIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfZmltYzBfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jX21kID0geworCS5uYW1lCT0gInM1cC1maW1jLW1kIiwKKwkuaWQJPSAtMSwKK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfRklNQzAgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0ZJTUMxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMV9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9GSU1DMSwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9GSU1DMSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzEgPSB7CisJLm5hbWUJCT0gInM1cC1maW1jIiwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfZmltYzFfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfRklNQzEgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0ZJTUMyCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jMl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9GSU1DMiwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9GSU1DMiksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzIgPSB7CisJLm5hbWUJCT0gInM1cC1maW1jIiwKKwkuaWQJCT0gMiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfZmltYzJfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfRklNQzIgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0ZJTUMzCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1jM19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9GSU1DMywgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9GSU1DMyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzMgPSB7CisJLm5hbWUJCT0gInM1cC1maW1jIiwKKwkuaWQJCT0gMywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWMzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfZmltYzNfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfRklNQzMgKi8KKworLyogRklNRDAgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0ZJTUQwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9maW1kMF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9GSU1EMCwgU1pfMzJLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNRDBfVlNZTkMpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9GSU1EMF9GSUZPKSwKKwlbM10gPSBERUZJTkVfUkVTX0lSUShJUlFfRklNRDBfU1lTVEVNKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1kMCA9IHsKKwkubmFtZQkJPSAiczVwLWZiIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2ZpbWQwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfZmltZDBfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisKK3ZvaWQgX19pbml0IHM1cF9maW1kMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19mYl9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2NfZmJfcGxhdGRhdGEpLAorCQkJICZzNXBfZGV2aWNlX2ZpbWQwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzVQX0RFVl9GSU1EMCAqLworCisvKiBIV01PTiAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFdNT04KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9od21vbiA9IHsKKwkubmFtZQkJPSAiczNjLWh3bW9uIiwKKwkuaWQJCT0gLTEsCisJLmRldi5wYXJlbnQJPSAmczNjX2RldmljZV9hZGMuZGV2LAorfTsKKwordm9pZCBfX2luaXQgczNjX2h3bW9uX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2h3bW9uX3BkYXRhICpwZCkKK3sKKwlzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzY19od21vbl9wZGF0YSksCisJCQkgJnMzY19kZXZpY2VfaHdtb24pOworfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0hXTU9OICovCisKKy8qIEhTTU1DICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSFNNTUMwLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0hTTU1DMCksCit9OworCitzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzBfZGVmX3BsYXRkYXRhID0geworCS5tYXhfd2lkdGgJPSA0LAorCS5ob3N0X2NhcHMJPSAoTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCSAgIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEKSwKKwkuY2xrX3R5cGUJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9JTlRFUk5BTCwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzAgPSB7CisJLm5hbWUJCT0gInMzYy1zZGhjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc21tY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzbW1jX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEsCisJfSwKK307CisKK3ZvaWQgczNjX3NkaGNpMF9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NkaGNpX3NldF9wbGF0ZGF0YShwZCwgJnMzY19oc21tYzBfZGVmX3BsYXRkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IU01NQyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19oc21tYzFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSFNNTUMxLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0hTTU1DMSksCit9OworCitzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhIHMzY19oc21tYzFfZGVmX3BsYXRkYXRhID0geworCS5tYXhfd2lkdGgJPSA0LAorCS5ob3N0X2NhcHMJPSAoTU1DX0NBUF80X0JJVF9EQVRBIHwKKwkJCSAgIE1NQ19DQVBfTU1DX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RfSElHSFNQRUVEKSwKKwkuY2xrX3R5cGUJPSBTM0NfU0RIQ0lfQ0xLX0RJVl9JTlRFUk5BTCwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzEgPSB7CisJLm5hbWUJCT0gInMzYy1zZGhjaSIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc21tYzFfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19oc21tYzFfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YSwKKwl9LAorfTsKKwordm9pZCBzM2Nfc2RoY2kxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCkKK3sKKwlzM2Nfc2RoY2lfc2V0X3BsYXRkYXRhKHBkLCAmczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEpOworfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0hTTU1DMSAqLworCisvKiBIU01NQzIgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMyX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0hTTU1DMiwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9IU01NQzIpLAorfTsKKworc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCT0gNCwKKwkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCisJLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMyID0geworCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAorCS5pZAkJPSAyLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWMyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaHNtbWMyX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEsCisJfSwKK307CisKK3ZvaWQgczNjX3NkaGNpMl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NkaGNpX3NldF9wbGF0ZGF0YShwZCwgJnMzY19oc21tYzJfZGVmX3BsYXRkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IU01NQzIgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaHNtbWMzX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0hTTU1DMywgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9IU01NQzMpLAorfTsKKworc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSBzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YSA9IHsKKwkubWF4X3dpZHRoCT0gNCwKKwkuaG9zdF9jYXBzCT0gKE1NQ19DQVBfNF9CSVRfREFUQSB8CisJCQkgICBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCksCisJLmNsa190eXBlCT0gUzNDX1NESENJX0NMS19ESVZfSU5URVJOQUwsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMzID0geworCS5uYW1lCQk9ICJzM2Mtc2RoY2kiLAorCS5pZAkJPSAzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaHNtbWMzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaHNtbWMzX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmczNjX2hzbW1jM19kZWZfcGxhdGRhdGEsCisJfSwKK307CisKK3ZvaWQgczNjX3NkaGNpM19zZXRfcGxhdGRhdGEoc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NkaGNpX3NldF9wbGF0ZGF0YShwZCwgJnMzY19oc21tYzNfZGVmX3BsYXRkYXRhKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9IU01NQzMgKi8KKworLyogSTJDICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMCA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1pMmMiLAorI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzEKKwkuaWQJCT0gMCwKKyNlbHNlCisJLmlkCQk9IC0xLAorI2VuZGlmCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmMwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjMF9yZXNvdXJjZSwKK307CisKK3N0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyBkZWZhdWx0X2kyY19kYXRhIF9faW5pdGRhdGEgPSB7CisJLmZsYWdzCQk9IDAsCisJLnNsYXZlX2FkZHIJPSAweDEwLAorCS5mcmVxdWVuY3kJPSAxMDAqMTAwMCwKKwkuc2RhX2RlbGF5CT0gMTAwLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzBfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKQorCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMCk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMF9jZmdfZ3BpbzsKK30KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDMSwgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUMxKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMxID0geworCS5uYW1lCQk9ICJzM2MyNDEwLWkyYyIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmMxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjMV9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmMxX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDE7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjMSk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjMV9jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9JMkMxICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9JMkMyCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19pMmMyX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX0lJQzIsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSUlDMiksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaTJjMiA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1pMmMiLAorCS5pZAkJPSAyLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfaTJjMl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2kyYzJfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2NfaTJjMl9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKm5wZDsKKworCWlmICghcGQpIHsKKwkJcGQgPSAmZGVmYXVsdF9pMmNfZGF0YTsKKwkJcGQtPmJ1c19udW0gPSAyOworCX0KKworCW5wZCA9IHMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMpLAorCQkJICAgICAgICZzM2NfZGV2aWNlX2kyYzIpOworCisJaWYgKCFucGQtPmNmZ19ncGlvKQorCQlucGQtPmNmZ19ncGlvID0gczNjX2kyYzJfY2ZnX2dwaW87Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSTJDMiAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDMworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjM19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9JSUMzLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQzMpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzMgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKKwkuaWQJCT0gMywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyYzNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19pMmMzX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gMzsKKwl9CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmMzKTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmMzX2NmZ19ncGlvOworfQorI2VuZGlmIC8qQ09ORklHX1MzQ19ERVZfSTJDMyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDNAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjNF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9JSUM0LCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQzQpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzQgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKKwkuaWQJCT0gNCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyYzRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19pMmM0X3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzRfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gNDsKKwl9CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmM0KTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM0X2NmZ19ncGlvOworfQorI2VuZGlmIC8qQ09ORklHX1MzQ19ERVZfSTJDNCAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDNQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjNV9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9JSUM1LCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQzUpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzUgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKKwkuaWQJCT0gNSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyYzVfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19pMmM1X3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzVfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gNTsKKwl9CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmM1KTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM1X2NmZ19ncGlvOworfQorI2VuZGlmIC8qQ09ORklHX1MzQ19ERVZfSTJDNSAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfSTJDNgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaTJjNl9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9JSUM2LCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQzYpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzYgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtaTJjIiwKKwkuaWQJCT0gNiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX2kyYzZfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19pMmM2X3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjX2kyYzZfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGQpCit7CisJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpucGQ7CisKKwlpZiAoIXBkKSB7CisJCXBkID0gJmRlZmF1bHRfaTJjX2RhdGE7CisJCXBkLT5idXNfbnVtID0gNjsKKwl9CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjKSwKKwkJCSAgICAgICAmczNjX2RldmljZV9pMmM2KTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHMzY19pMmM2X2NmZ19ncGlvOworfQorI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0kyQzYgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX0kyQzcKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2kyYzdfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0NfUEFfSUlDNywgU1pfNEspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9JSUM3KSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmM3ID0geworCS5uYW1lCQk9ICJzM2MyNDQwLWkyYyIsCisJLmlkCQk9IDcsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19pMmM3X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfaTJjN19yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzY19pMmM3X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCQlwZC0+YnVzX251bSA9IDc7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnMzY19kZXZpY2VfaTJjNyk7CisKKwlpZiAoIW5wZC0+Y2ZnX2dwaW8pCisJCW5wZC0+Y2ZnX2dwaW8gPSBzM2NfaTJjN19jZmdfZ3BpbzsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9JMkM3ICovCisKKy8qIEkyQyBIRE1JUEhZICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9JMkNfSERNSVBIWQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfaTJjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX0lJQ19IRE1JUEhZLCBTWl80SyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0lJQ19IRE1JUEhZKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9pMmNfaGRtaXBoeSA9IHsKKwkubmFtZQkJPSAiczNjMjQ0MC1oZG1pcGh5LWkyYyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfaTJjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfaTJjX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczVwX2kyY19oZG1pcGh5X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqbnBkOworCisJaWYgKCFwZCkgeworCQlwZCA9ICZkZWZhdWx0X2kyY19kYXRhOworCisJCWlmIChzb2NfaXNfZXh5bm9zNDIxMCgpKQorCQkJcGQtPmJ1c19udW0gPSA4OworCQllbHNlIGlmIChzb2NfaXNfczVwdjIxMCgpKQorCQkJcGQtPmJ1c19udW0gPSAzOworCQllbHNlCisJCQlwZC0+YnVzX251bSA9IDA7CisJfQorCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyksCisJCQkgICAgICAgJnM1cF9kZXZpY2VfaTJjX2hkbWlwaHkpOworfQorI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX0kyQ19IRE1JUEhZICovCisKKy8qIEkyUyAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfaWlzX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9JSVMsIFMzQzI0WFhfU1pfSUlTKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9paXMgPSB7CisJLm5hbWUJCT0gInMzYzI0eHgtaWlzIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19paXNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19paXNfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfUExBVF9TM0MyNFhYICovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjMjQxMl9kZXZpY2VfaWlzID0geworCS5uYW1lCQk9ICJzM2MyNDEyLWlpcyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCisKKy8qIElERSBDRkNPTiAqLworCisjaWZkZWYgQ09ORklHX1NBTVNVTkdfREVWX0lERQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfY2Zjb25fcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTQU1TVU5HX1BBX0NGQ09OLCBTWl8xNkspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9DRkNPTiksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfY2Zjb24gPSB7CisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19jZmNvbl9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2NmY29uX3Jlc291cmNlLAorfTsKKwordm9pZCBzM2NfaWRlX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX2lkZV9wbGF0ZGF0YSAqcGRhdGEpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZGF0YSwgc2l6ZW9mKHN0cnVjdCBzM2NfaWRlX3BsYXRkYXRhKSwKKwkJCSAmczNjX2RldmljZV9jZmNvbik7Cit9CisjZW5kaWYgLyogQ09ORklHX1NBTVNVTkdfREVWX0lERSAqLworCisvKiBLRVlQQUQgKi8KKworI2lmZGVmIENPTkZJR19TQU1TVU5HX0RFVl9LRVlQQUQKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2Ftc3VuZ19rZXlwYWRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oU0FNU1VOR19QQV9LRVlQQUQsIFNaXzMyKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfS0VZUEFEKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkID0geworCS5uYW1lCQk9ICJzYW1zdW5nLWtleXBhZCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzYW1zdW5nX2tleXBhZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNhbXN1bmdfa2V5cGFkX3Jlc291cmNlcywKK307CisKK3ZvaWQgX19pbml0IHNhbXN1bmdfa2V5cGFkX3NldF9wbGF0ZGF0YShzdHJ1Y3Qgc2Ftc3VuZ19rZXlwYWRfcGxhdGRhdGEgKnBkKQoreworCXN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSAqbnBkOworCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKHN0cnVjdCBzYW1zdW5nX2tleXBhZF9wbGF0ZGF0YSksCisJCQkmc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkKTsKKworCWlmICghbnBkLT5jZmdfZ3BpbykKKwkJbnBkLT5jZmdfZ3BpbyA9IHNhbXN1bmdfa2V5cGFkX2NmZ19ncGlvOworfQorI2VuZGlmIC8qIENPTkZJR19TQU1TVU5HX0RFVl9LRVlQQUQgKi8KKworLyogTENEIENvbnRyb2xsZXIgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2xjZF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0WFhfUEFfTENELCBTM0MyNFhYX1NaX0xDRCksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX0xDRCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbGNkID0geworCS5uYW1lCQk9ICJzM2MyNDEwLWxjZCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfbGNkX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfbGNkX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisKK3ZvaWQgX19pbml0IHMzYzI0eHhfZmJfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvICpwZCkKK3sKKwlzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyAqbnBkOworCisJbnBkID0gczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpucGQpLCAmczNjX2RldmljZV9sY2QpOworCWlmIChucGQpIHsKKwkJbnBkLT5kaXNwbGF5cyA9IGttZW1kdXAocGQtPmRpc3BsYXlzLAorCQkJc2l6ZW9mKHN0cnVjdCBzM2MyNDEwZmJfZGlzcGxheSkgKiBucGQtPm51bV9kaXNwbGF5cywKKwkJCUdGUF9LRVJORUwpOworCQlpZiAoIW5wZC0+ZGlzcGxheXMpCisJCQlwcmludGsoS0VSTl9FUlIgIm5vIG1lbW9yeSBmb3IgTENEIGRpc3BsYXkgZGF0YVxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJubyBtZW1vcnkgZm9yIExDRCBwbGF0Zm9ybSBkYXRhXG4iKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisvKiBNRkMgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX01GQworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWZjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX01GQywgU1pfNjRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfTUZDKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmMgPSB7CisJLm5hbWUJCT0gInM1cC1tZmMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX21mY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX21mY19yZXNvdXJjZSwKK307CisKKy8qCisgKiBNRkMgaGFyZHdhcmUgaGFzIDIgbWVtb3J5IGludGVyZmFjZXMgd2hpY2ggYXJlIG1vZGVsbGVkIGFzIHR3byBzZXBhcmF0ZQorICogcGxhdGZvcm0gZGV2aWNlcyB0byBsZXQgZG1hLW1hcHBpbmcgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLgorICoKKyAqIE1GQyBwYXJlbnQgZGV2aWNlIChzNXBfZGV2aWNlX21mYykgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBtZW1vcnkKKyAqIGludGVyZmFjZSBzcGVjaWZpYyBkZXZpY2VzIChzNXBfZGV2aWNlX21mY19sIGFuZCBzNXBfZGV2aWNlX21mY19yKS4KKyAqLworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjX2wgPSB7CisJLm5hbWUJCT0gInM1cC1tZmMtbCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGFyZW50CQkJPSAmczVwX2RldmljZV9tZmMuZGV2LAorCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjX3IgPSB7CisJLm5hbWUJCT0gInM1cC1tZmMtciIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGFyZW50CQkJPSAmczVwX2RldmljZV9tZmMuZGV2LAorCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX01GQyAqLworCisvKiBNSVBJIENTSVMgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0NTSVMwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9taXBpX2NzaXMwX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX01JUElfQ1NJUzAsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfTUlQSV9DU0lTMCksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMCA9IHsKKwkubmFtZQkJPSAiczVwLW1pcGktY3NpcyIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9taXBpX2NzaXMwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfbWlwaV9jc2lzMF9yZXNvdXJjZSwKK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfQ1NJUzAgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX0NTSVMxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9taXBpX2NzaXMxX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX01JUElfQ1NJUzEsIFNaXzRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfTUlQSV9DU0lTMSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMSA9IHsKKwkubmFtZQkJPSAiczVwLW1pcGktY3NpcyIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHM1cF9taXBpX2NzaXMxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfbWlwaV9jc2lzMV9yZXNvdXJjZSwKK307CisjZW5kaWYKKworLyogTkFORCAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfTkFORAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfbmFuZF9yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9OQU5ELCBTWl8xTSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbmFuZCA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1uYW5kIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19uYW5kX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfbmFuZF9yZXNvdXJjZSwKK307CisKKy8qCisgKiBzM2NfbmFuZF9jb3B5X3NldCgpIC0gY29weSBuYW5kIHNldCBkYXRhCisgKiBAc2V0OiBUaGUgbmV3IHN0cnVjdHVyZSwgZGlyZWN0bHkgY29waWVkIGZyb20gdGhlIG9sZC4KKyAqCisgKiBDb3B5IGFsbCB0aGUgZmllbGRzIGZyb20gdGhlIE5BTkQgc2V0IGZpZWxkIGZyb20gd2hhdCBpcyBwcm9iYWJseSBfX2luaXRkYXRhCisgKiB0byBuZXcga2VybmVsIG1lbW9yeS4gVGhlIGNvZGUgcmV0dXJucyAwIGlmIHRoZSBjb3B5IGhhcHBlbmVkIGNvcnJlY3RseSBvcgorICogYW4gZXJyb3IgY29kZSBmb3IgdGhlIGNhbGxpbmcgZnVuY3Rpb24gdG8gZGlzcGxheS4KKyAqCisgKiBOb3RlLCB3ZSBjdXJyZW50bHkgZG8gbm90IHRyeSBhbmQgbG9vayB0byBzZWUgaWYgd2UndmUgYWxyZWFkeSBjb3BpZWQgdGhlCisgKiBkYXRhIGluIGEgcHJldmlvdXMgc2V0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBzM2NfbmFuZF9jb3B5X3NldChzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqc2V0KQoreworCXZvaWQgKnB0cjsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pICogc2V0LT5ucl9wYXJ0aXRpb25zOworCWlmIChzaXplKSB7CisJCXB0ciA9IGttZW1kdXAoc2V0LT5wYXJ0aXRpb25zLCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJc2V0LT5wYXJ0aXRpb25zID0gcHRyOworCisJCWlmICghcHRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHNldC0+bnJfbWFwICYmIHNldC0+bnJfY2hpcHMpIHsKKwkJc2l6ZSA9IHNpemVvZihpbnQpICogc2V0LT5ucl9jaGlwczsKKwkJcHRyID0ga21lbWR1cChzZXQtPm5yX21hcCwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCXNldC0+bnJfbWFwID0gcHRyOworCisJCWlmICghcHRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHNldC0+ZWNjX2xheW91dCkgeworCQlwdHIgPSBrbWVtZHVwKHNldC0+ZWNjX2xheW91dCwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKwkJc2V0LT5lY2NfbGF5b3V0ID0gcHRyOworCisJCWlmICghcHRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHMzY19uYW5kX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kICpuYW5kKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX25hbmQgKm5wZDsKKwlpbnQgc2l6ZTsKKwlpbnQgcmV0OworCisJLyogbm90ZSwgaWYgd2UgZ2V0IGEgZmFpbHVyZSBpbiBhbGxvY2F0aW9uLCB3ZSBzaW1wbHkgZHJvcCBvdXQgb2YgdGhlCisJICogZnVuY3Rpb24uIElmIHRoZXJlIGlzIHNvIGxpdHRsZSBtZW1vcnkgYXZhaWxhYmxlIGF0IGluaXRpYWxpc2F0aW9uCisJICogdGltZSB0aGVuIHRoZXJlIGlzIGxpdHRsZSBjaGFuY2UgdGhlIHN5c3RlbSBpcyBnb2luZyB0byBydW4uCisJICovCisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKG5hbmQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9uYW5kKSwKKwkJCQkmczNjX2RldmljZV9uYW5kKTsKKwlpZiAoIW5wZCkKKwkJcmV0dXJuOworCisJLyogbm93IHNlZSBpZiB3ZSBuZWVkIHRvIGNvcHkgYW55IG9mIHRoZSBuYW5kIHNldCBkYXRhICovCisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX25hbmRfc2V0KSAqIG5wZC0+bnJfc2V0czsKKwlpZiAoc2l6ZSkgeworCQlzdHJ1Y3QgczNjMjQxMF9uYW5kX3NldCAqZnJvbSA9IG5wZC0+c2V0czsKKwkJc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnRvOworCQlpbnQgaTsKKworCQl0byA9IGttZW1kdXAoZnJvbSwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCW5wZC0+c2V0cyA9IHRvOwkvKiBzZXQsIGV2ZW4gaWYgd2UgZmFpbGVkICovCisKKwkJaWYgKCF0bykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gbWVtb3J5IGZvciBzZXRzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbnBkLT5ucl9zZXRzOyBpKyspIHsKKwkJCXJldCA9IHMzY19uYW5kX2NvcHlfc2V0KHRvKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gY29weSBzZXQgJWRcbiIsCisJCQkJX19mdW5jX18sIGkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRvKys7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfTkFORCAqLworCisvKiBPTkVOQU5EICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9PTkVOQU5ECitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19vbmVuYW5kX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQ19QQV9PTkVOQU5ELCBTWl8xSyksCisJWzFdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX09ORU5BTkRfQlVGLCBTM0NfU1pfT05FTkFORF9CVUYpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9PTkVOQU5EKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vbmVuYW5kID0geworCS5uYW1lCQk9ICJzYW1zdW5nLW9uZW5hbmQiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2Nfb25lbmFuZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHMzY19vbmVuYW5kX3Jlc291cmNlcywKK307CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfT05FTkFORCAqLworCisjaWZkZWYgQ09ORklHX1MzQzY0WFhfREVWX09ORU5BTkQxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzY0eHhfb25lbmFuZDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDNjRYWF9QQV9PTkVOQU5EMSwgU1pfMUspLAorCVsxXSA9IERFRklORV9SRVNfTUVNKFMzQzY0WFhfUEFfT05FTkFORDFfQlVGLCBTM0M2NFhYX1NaX09ORU5BTkQxX0JVRiksCisJWzJdID0gREVGSU5FX1JFU19JUlEoSVJRX09ORU5BTkQxKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfb25lbmFuZDEgPSB7CisJLm5hbWUJCT0gInNhbXN1bmctb25lbmFuZCIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzYzY0eHhfb25lbmFuZDFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzM2M2NHh4X29uZW5hbmQxX3Jlc291cmNlcywKK307CisKK3ZvaWQgczNjNjR4eF9vbmVuYW5kMV9zZXRfcGxhdGRhdGEoc3RydWN0IG9uZW5hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZGF0YSwgc2l6ZW9mKHN0cnVjdCBvbmVuYW5kX3BsYXRmb3JtX2RhdGEpLAorCQkJICZzM2M2NHh4X2RldmljZV9vbmVuYW5kMSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1MzQzY0WFhfREVWX09ORU5BTkQxICovCisKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9PTkVOQU5ECitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9vbmVuYW5kX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFM1UF9QQV9PTkVOQU5ELCBTWl8xMjhLKSwKKwlbMV0gPSBERUZJTkVfUkVTX01FTShTNVBfUEFfT05FTkFORF9ETUEsIFNaXzhLKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfT05FTkFORF9BVURJKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9vbmVuYW5kID0geworCS5uYW1lCQk9ICJzNXBjMTEwLW9uZW5hbmQiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX29uZW5hbmRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzNXBfb25lbmFuZF9yZXNvdXJjZXMsCit9OworI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX09ORU5BTkQgKi8KKworLyogUE1VICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TNVAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX3BtdV9yZXNvdXJjZVtdID0geworCURFRklORV9SRVNfSVJRKElSUV9QTVUpCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfcG11ID0geworCS5uYW1lCQk9ICJhcm0tcG11IiwKKwkuaWQJCT0gQVJNX1BNVV9ERVZJQ0VfQ1BVLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfcG11X3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXBfcG11X3Jlc291cmNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgczVwX3BtdV9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzNXBfZGV2aWNlX3BtdSk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHM1cF9wbXVfaW5pdCk7CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzVQICovCisKKy8qIFBXTSBUaW1lciAqLworCisjaWZkZWYgQ09ORklHX1NBTVNVTkdfREVWX1BXTQorCisjZGVmaW5lIFRJTUVSX1JFU09VUkNFX1NJWkUgKDEpCisKKyNkZWZpbmUgVElNRVJfUkVTT1VSQ0UoX3RtciwgX2lycSkJCQlcCisJKHN0cnVjdCByZXNvdXJjZSBbVElNRVJfUkVTT1VSQ0VfU0laRV0pIHsJXAorCQlbMF0gPSB7CQkJCQlcCisJCQkuc3RhcnQJPSBfaXJxLAkJCVwKKwkJCS5lbmQJPSBfaXJxLAkJCVwKKwkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCVwKKwkJfQkJCQkJXAorCX0KKworI2RlZmluZSBERUZJTkVfUzNDX1RJTUVSKF90bXJfbm8sIF9pcnEpCQkJXAorCS5uYW1lCQk9ICJzM2MyNHh4LXB3bSIsCQlcCisJLmlkCQk9IF90bXJfbm8sCQkJXAorCS5udW1fcmVzb3VyY2VzCT0gVElNRVJfUkVTT1VSQ0VfU0laRSwJCVwKKwkucmVzb3VyY2UJPSBUSU1FUl9SRVNPVVJDRShfdG1yX25vLCBfaXJxKSwJXAorCisvKgorICogc2luY2Ugd2UgYWxyZWFkeSBoYXZlIGFuIHN0YXRpYyBtYXBwaW5nIGZvciB0aGUgdGltZXIsCisgKiB3ZSBkbyBub3QgYm90aGVyIHNldHRpbmcgYW55IElPIHJlc291cmNlIGZvciB0aGUgYmFzZS4KKyAqLworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdGltZXJbXSA9IHsKKwlbMF0gPSB7IERFRklORV9TM0NfVElNRVIoMCwgSVJRX1RJTUVSMCkgfSwKKwlbMV0gPSB7IERFRklORV9TM0NfVElNRVIoMSwgSVJRX1RJTUVSMSkgfSwKKwlbMl0gPSB7IERFRklORV9TM0NfVElNRVIoMiwgSVJRX1RJTUVSMikgfSwKKwlbM10gPSB7IERFRklORV9TM0NfVElNRVIoMywgSVJRX1RJTUVSMykgfSwKKwlbNF0gPSB7IERFRklORV9TM0NfVElNRVIoNCwgSVJRX1RJTUVSNCkgfSwKK307CisjZW5kaWYgLyogQ09ORklHX1NBTVNVTkdfREVWX1BXTSAqLworCisvKiBSVEMgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3J0Y19yZXNvdXJjZVtdID0geworCVswXSA9IERFRklORV9SRVNfTUVNKFMzQzI0WFhfUEFfUlRDLCBTWl8yNTYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9SVEMpLAorCVsyXSA9IERFRklORV9SRVNfSVJRKElSUV9USUNLKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9ydGMgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtcnRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19ydGNfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19ydGNfcmVzb3VyY2UsCit9OworI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX1JUQworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfcnRjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX1JUQywgU1pfMjU2KSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfUlRDX0FMQVJNKSwKKwlbMl0gPSBERUZJTkVfUkVTX0lSUShJUlFfUlRDX1RJQyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcnRjID0geworCS5uYW1lCQk9ICJzM2M2NHh4LXJ0YyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfcnRjX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfcnRjX3Jlc291cmNlLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9SVEMgKi8KKworLyogU0RJICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zZGlfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX1NESSwgUzNDMjRYWF9TWl9TREkpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9TREkpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NkaSA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC1zZGkiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3NkaV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3NkaV9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKnBkYXRhKQoreworCXMzY19zZXRfcGxhdGRhdGEocGRhdGEsIHNpemVvZihzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEpLAorCQkJICZzM2NfZGV2aWNlX3NkaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisvKiBTUEkgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3NwaTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX1NQSSwgU1pfMzIpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9TUEkwKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zcGkwID0geworCS5uYW1lCQk9ICJzM2MyNDEwLXNwaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19zcGkwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2Nfc3BpMF9yZXNvdXJjZSwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrCQk9ICZzYW1zdW5nX2RldmljZV9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY19zcGkxX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjRYWF9QQV9TUEkxLCBTWl8zMiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1NQSTEpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NwaTEgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtc3BpIiwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3NwaTFfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY19zcGkxX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisvKiBUb3VjaHNjcmVlbiAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdHNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX0FEQywgUzNDMjRYWF9TWl9BREMpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9UQyksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHMgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtdHMiLAorCS5pZAkJPSAtMSwKKwkuZGV2LnBhcmVudAk9ICZzM2NfZGV2aWNlX2FkYy5kZXYsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY190c19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3RzX3Jlc291cmNlLAorfTsKKwordm9pZCBfX2luaXQgczNjMjR4eF90c19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvICpoYXJkX3MzYzI0MTB0c19pbmZvKQoreworCXMzY19zZXRfcGxhdGRhdGEoaGFyZF9zM2MyNDEwdHNfaW5mbywKKwkJCSBzaXplb2Yoc3RydWN0IHMzYzI0MTBfdHNfbWFjaF9pbmZvKSwgJnMzY19kZXZpY2VfdHMpOworfQorI2VuZGlmIC8qIENPTkZJR19QTEFUX1MzQzI0WFggKi8KKworI2lmZGVmIENPTkZJR19TQU1TVU5HX0RFVl9UUworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdHNfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTQU1TVU5HX1BBX0FEQywgU1pfMjU2KSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfVEMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3RzX21hY2hfaW5mbyBkZWZhdWx0X3RzX2RhdGEgX19pbml0ZGF0YSA9IHsKKwkuZGVsYXkJCQk9IDEwMDAwLAorCS5wcmVzYwkJCT0gNDksCisJLm92ZXJzYW1wbGluZ19zaGlmdAk9IDIsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHMgPSB7CisJLm5hbWUJCT0gInMzYzY0eHgtdHMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3RzX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfdHNfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2MyNHh4X3RzX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8gKnBkKQoreworCWlmICghcGQpCisJCXBkID0gJmRlZmF1bHRfdHNfZGF0YTsKKworCXMzY19zZXRfcGxhdGRhdGEocGQsIHNpemVvZihzdHJ1Y3QgczNjMjQxMF90c19tYWNoX2luZm8pLAorCQkJICZzM2NfZGV2aWNlX3RzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0FNU1VOR19ERVZfVFMgKi8KKworLyogVFYgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX1RWCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwX2hkbWlfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX0hETUksIFNaXzFNKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfSERNSSksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfaGRtaSA9IHsKKwkubmFtZQkJPSAiczVwLWhkbWkiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX2hkbWlfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzNXBfaGRtaV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9zZG9fcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX1NETywgU1pfNjRLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfU0RPKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9zZG8gPSB7CisJLm5hbWUJCT0gInM1cC1zZG8iLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwX3Nkb19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHM1cF9zZG9fcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBfbWl4ZXJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU1fTkFNRUQoUzVQX1BBX01JWEVSLCBTWl82NEssICJteHIiKSwKKwlbMV0gPSBERUZJTkVfUkVTX01FTV9OQU1FRChTNVBfUEFfVlAsIFNaXzY0SywgInZwIiksCisJWzJdID0gREVGSU5FX1JFU19JUlFfTkFNRUQoSVJRX01JWEVSLCAiaXJxIiksCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWl4ZXIgPSB7CisJLm5hbWUJCT0gInM1cC1taXhlciIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfbWl4ZXJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzNXBfbWl4ZXJfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisjZW5kaWYgLyogQ09ORklHX1M1UF9ERVZfVFYgKi8KKworLyogVVNCICovCisKKyNpZmRlZiBDT05GSUdfUzNDX0RFVl9VU0JfSE9TVAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2NfdXNiX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX1VTQkhPU1QsIFNaXzI1NiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1VTQkgpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX29oY2kgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtb2hjaSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdXNiX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzM2NfdXNiX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0KK307CisKKy8qCisgKiBzM2Nfb2hjaV9zZXRfcGxhdGRhdGEgLSBpbml0aWFsaXNlIE9IQ0kgZGV2aWNlIHBsYXRmb3JtIGRhdGEKKyAqIEBpbmZvOiBUaGUgcGxhdGZvcm0gZGF0YS4KKyAqCisgKiBUaGlzIGNhbGwgY29waWVzIHRoZSBAaW5mbyBwYXNzZWQgaW4gYW5kIHNldHMgdGhlIGRldmljZSAucGxhdGZvcm1fZGF0YQorICogZmllbGQgdG8gdGhhdCBjb3B5LiBUaGUgQGluZm8gaXMgY29waWVkIHNvIHRoYXQgdGhlIG9yaWdpbmFsIGNhbiBiZSBtYXJrZWQKKyAqIF9faW5pdGRhdGEuCisgKi8KKwordm9pZCBfX2luaXQgczNjX29oY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvICppbmZvKQoreworCXMzY19zZXRfcGxhdGRhdGEoaW5mbywgc2l6ZW9mKHN0cnVjdCBzM2MyNDEwX2hjZF9pbmZvKSwKKwkJCSAmczNjX2RldmljZV9vaGNpKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUzNDX0RFVl9VU0JfSE9TVCAqLworCisvKiBVU0IgRGV2aWNlIChHYWRnZXQpICovCisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191c2JnYWRnZXRfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSBERUZJTkVfUkVTX01FTShTM0MyNFhYX1BBX1VTQkRFViwgUzNDMjRYWF9TWl9VU0JERVYpLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9VU0JEKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JnYWRnZXQgPSB7CisJLm5hbWUJCT0gInMzYzI0MTAtdXNiZ2FkZ2V0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY191c2JnYWRnZXRfcmVzb3VyY2UpLAorCS5yZXNvdXJjZQk9IHMzY191c2JnYWRnZXRfcmVzb3VyY2UsCit9OworCit2b2lkIF9faW5pdCBzM2MyNHh4X3VkY19zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfdWRjX21hY2hfaW5mbyAqcGQpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpwZCksICZzM2NfZGV2aWNlX3VzYmdhZGdldCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisvKiBVU0IgRUhDSSBIb3N0IENvbnRyb2xsZXIgKi8KKworI2lmZGVmIENPTkZJR19TNVBfREVWX1VTQl9FSENJCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cF9laGNpX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzVQX1BBX0VIQ0ksIFNaXzI1NiksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1VTQl9IT1NUKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9laGNpID0geworCS5uYW1lCQk9ICJzNXAtZWhjaSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXBfZWhjaV9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczVwX2VoY2lfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfQorfTsKKwordm9pZCBfX2luaXQgczVwX2VoY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGQpCit7CisJc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhICpucGQ7CisKKwlucGQgPSBzM2Nfc2V0X3BsYXRkYXRhKHBkLCBzaXplb2Yoc3RydWN0IHM1cF9laGNpX3BsYXRkYXRhKSwKKwkJCSZzNXBfZGV2aWNlX2VoY2kpOworCisJaWYgKCFucGQtPnBoeV9pbml0KQorCQlucGQtPnBoeV9pbml0ID0gczVwX3VzYl9waHlfaW5pdDsKKwlpZiAoIW5wZC0+cGh5X2V4aXQpCisJCW5wZC0+cGh5X2V4aXQgPSBzNXBfdXNiX3BoeV9leGl0OworfQorI2VuZGlmIC8qIENPTkZJR19TNVBfREVWX1VTQl9FSENJICovCisKKy8qIFVTQiBIU09URyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19ERVZfVVNCX0hTT1RHCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzY191c2JfaHNvdGdfcmVzb3VyY2VzW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX1VTQl9IU09URywgU1pfMTZLKSwKKwlbMV0gPSBERUZJTkVfUkVTX0lSUShJUlFfT1RHKSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JfaHNvdGcgPSB7CisJLm5hbWUJCT0gInMzYy1oc290ZyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzM2NfdXNiX2hzb3RnX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczNjX3VzYl9oc290Z19yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAmc2Ftc3VuZ19kZXZpY2VfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfVVNCX0hTT1RHICovCisKKy8qIFVTQiBIaWdoIFNwcGVkIDIuMCBEZXZpY2UgKEdhZGdldCkgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX2hzdWRjX3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDMjQxNl9QQV9IU1VEQywgUzNDMjQxNl9TWl9IU1VEQyksCisJWzFdID0gREVGSU5FX1JFU19JUlEoSVJRX1VTQkQpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYl9oc3VkYyA9IHsKKwkubmFtZQkJPSAiczNjLWhzdWRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHMzY19oc3VkY19yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX2hzdWRjX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sJCT0gJnNhbXN1bmdfZGV2aWNlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworCit2b2lkIF9faW5pdCBzM2MyNHh4X2hzdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9oc3VkY19wbGF0ZGF0YSAqcGQpCit7CisJczNjX3NldF9wbGF0ZGF0YShwZCwgc2l6ZW9mKCpwZCksICZzM2NfZGV2aWNlX3VzYl9oc3VkYyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BMQVRfUzNDMjRYWCAqLworCisvKiBXRFQgKi8KKworI2lmZGVmIENPTkZJR19TM0NfREVWX1dEVAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzM2Nfd2R0X3Jlc291cmNlW10gPSB7CisJWzBdID0gREVGSU5FX1JFU19NRU0oUzNDX1BBX1dEVCwgU1pfMUspLAorCVsxXSA9IERFRklORV9SRVNfSVJRKElSUV9XRFQpLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3dkdCA9IHsKKwkubmFtZQkJPSAiczNjMjQxMC13ZHQiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczNjX3dkdF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gczNjX3dkdF9yZXNvdXJjZSwKK307CisjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfV0RUICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZG1hLW9wcy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E5OTRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS1vcHMuYwpAQCAtMCwwICsxLDEzMiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2RtYS1vcHMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTYW1zdW5nIERNQSBPcGVyYXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMzMwLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwbDMzMF9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgKnBlcmkgPSBjaGFuLT5wcml2YXRlOworCXJldHVybiBwZXJpLT5wZXJpX2lkID09ICh1bnNpZ25lZClwYXJhbTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNhbXN1bmdfZG1hZGV2X3JlcXVlc3QoZW51bSBkbWFfY2ggZG1hX2NoLAorCQkJCXN0cnVjdCBzYW1zdW5nX2RtYV9pbmZvICppbmZvKQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHNsYXZlX2NvbmZpZzsKKworCWRtYV9jYXBfemVybyhtYXNrKTsKKwlkbWFfY2FwX3NldChpbmZvLT5jYXAsIG1hc2spOworCisJY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgcGwzMzBfZmlsdGVyLCAodm9pZCAqKWRtYV9jaCk7CisKKwlpZiAoaW5mby0+ZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQltZW1zZXQoJnNsYXZlX2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnKSk7CisJCXNsYXZlX2NvbmZpZy5kaXJlY3Rpb24gPSBpbmZvLT5kaXJlY3Rpb247CisJCXNsYXZlX2NvbmZpZy5zcmNfYWRkciA9IGluZm8tPmZpZm87CisJCXNsYXZlX2NvbmZpZy5zcmNfYWRkcl93aWR0aCA9IGluZm8tPndpZHRoOworCQlzbGF2ZV9jb25maWcuc3JjX21heGJ1cnN0ID0gMTsKKwkJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhjaGFuLCAmc2xhdmVfY29uZmlnKTsKKwl9IGVsc2UgaWYgKGluZm8tPmRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCW1lbXNldCgmc2xhdmVfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcpKTsKKwkJc2xhdmVfY29uZmlnLmRpcmVjdGlvbiA9IGluZm8tPmRpcmVjdGlvbjsKKwkJc2xhdmVfY29uZmlnLmRzdF9hZGRyID0gaW5mby0+ZmlmbzsKKwkJc2xhdmVfY29uZmlnLmRzdF9hZGRyX3dpZHRoID0gaW5mby0+d2lkdGg7CisJCXNsYXZlX2NvbmZpZy5kc3RfbWF4YnVyc3QgPSAxOworCQlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGNoYW4sICZzbGF2ZV9jb25maWcpOworCX0KKworCXJldHVybiAodW5zaWduZWQpY2hhbjsKK30KKworc3RhdGljIGludCBzYW1zdW5nX2RtYWRldl9yZWxlYXNlKHVuc2lnbmVkIGNoLAorCQkJc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqY2xpZW50KQoreworCWRtYV9yZWxlYXNlX2NoYW5uZWwoKHN0cnVjdCBkbWFfY2hhbiAqKWNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhbXN1bmdfZG1hZGV2X3ByZXBhcmUodW5zaWduZWQgY2gsCisJCQlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcF9pbmZvICppbmZvKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSAoc3RydWN0IGRtYV9jaGFuICopY2g7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCisJc3dpdGNoIChpbmZvLT5jYXApIHsKKwljYXNlIERNQV9TTEFWRToKKwkJc2dfaW5pdF90YWJsZSgmc2csIDEpOworCQlzZ19kbWFfbGVuKCZzZykgPSBpbmZvLT5sZW47CisJCXNnX3NldF9wYWdlKCZzZywgcGZuX3RvX3BhZ2UoUEZOX0RPV04oaW5mby0+YnVmKSksCisJCQkgICAgaW5mby0+bGVuLCBvZmZzZXRfaW5fcGFnZShpbmZvLT5idWYpKTsKKwkJc2dfZG1hX2FkZHJlc3MoJnNnKSA9IGluZm8tPmJ1ZjsKKworCQlkZXNjID0gY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFuLAorCQkJJnNnLCAxLCBpbmZvLT5kaXJlY3Rpb24sIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJCWJyZWFrOworCWNhc2UgRE1BX0NZQ0xJQzoKKwkJZGVzYyA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX2N5Y2xpYyhjaGFuLAorCQkJaW5mby0+YnVmLCBpbmZvLT5sZW4sIGluZm8tPnBlcmlvZCwgaW5mby0+ZGlyZWN0aW9uKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2hhbi0+ZGV2LT5kZXZpY2UsICJ1bnN1cHBvcnRlZCBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2VycigmY2hhbi0+ZGV2LT5kZXZpY2UsICJjYW5ub3QgcHJlcGFyZSBjeWNsaWMgZG1hXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZGVzYy0+Y2FsbGJhY2sgPSBpbmZvLT5mcDsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGluZm8tPmZwX3BhcmFtOworCisJZG1hZW5naW5lX3N1Ym1pdCgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopZGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2Ftc3VuZ19kbWFkZXZfdHJpZ2dlcih1bnNpZ25lZCBjaCkKK3sKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZygoc3RydWN0IGRtYV9jaGFuICopY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNhbXN1bmdfZG1hZGV2X2ZsdXNoKHVuc2lnbmVkIGNoKQoreworCXJldHVybiBkbWFlbmdpbmVfdGVybWluYXRlX2FsbCgoc3RydWN0IGRtYV9jaGFuICopY2gpOworfQorCitzdHJ1Y3Qgc2Ftc3VuZ19kbWFfb3BzIGRtYWRldl9vcHMgPSB7CisJLnJlcXVlc3QJPSBzYW1zdW5nX2RtYWRldl9yZXF1ZXN0LAorCS5yZWxlYXNlCT0gc2Ftc3VuZ19kbWFkZXZfcmVsZWFzZSwKKwkucHJlcGFyZQk9IHNhbXN1bmdfZG1hZGV2X3ByZXBhcmUsCisJLnRyaWdnZXIJPSBzYW1zdW5nX2RtYWRldl90cmlnZ2VyLAorCS5zdGFydGVkCT0gTlVMTCwKKwkuZmx1c2gJCT0gc2Ftc3VuZ19kbWFkZXZfZmx1c2gsCisJLnN0b3AJCT0gc2Ftc3VuZ19kbWFkZXZfZmx1c2gsCit9OworCit2b2lkICpzYW1zdW5nX2RtYWRldl9nZXRfb3BzKHZvaWQpCit7CisJcmV0dXJuICZkbWFkZXZfb3BzOworfQorRVhQT1JUX1NZTUJPTChzYW1zdW5nX2RtYWRldl9nZXRfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9ncGlvLWNvbmZpZy5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2dwaW8tY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGIwNDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2dwaW8tY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvZ3Bpby1jb25maWcuYwotICoKLSAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDEwIFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIEdQSU8gY29uZmlndXJhdGlvbiBjb3JlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgotCi1pbnQgczNjX2dwaW9fY2ZncGluKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBjb25maWcpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgb2Zmc2V0OwotCWludCByZXQ7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCi0JczNjX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7Ci0JcmV0ID0gczNjX2dwaW9fZG9fc2V0Y2ZnKGNoaXAsIG9mZnNldCwgY29uZmlnKTsKLQlzM2NfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjX2dwaW9fY2ZncGluKTsKLQotaW50IHMzY19ncGlvX2NmZ3Bpbl9yYW5nZSh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuciwKLQkJCSAgdW5zaWduZWQgaW50IGNmZykKLXsKLQlpbnQgcmV0OwotCi0JZm9yICg7IG5yID4gMDsgbnItLSwgc3RhcnQrKykgewotCQlyZXQgPSBzM2NfZ3Bpb19jZmdwaW4oc3RhcnQsIGNmZyk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UpOwotCi1pbnQgczNjX2dwaW9fY2ZnYWxsX3JhbmdlKHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IG5yLAotCQkJICB1bnNpZ25lZCBpbnQgY2ZnLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCkKLXsKLQlpbnQgcmV0OwotCi0JZm9yICg7IG5yID4gMDsgbnItLSwgc3RhcnQrKykgewotCQlzM2NfZ3Bpb19zZXRwdWxsKHN0YXJ0LCBwdWxsKTsKLQkJcmV0ID0gczNjX2dwaW9fY2ZncGluKHN0YXJ0LCBjZmcpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoczNjX2dwaW9fY2ZnYWxsX3JhbmdlKTsKLQotdW5zaWduZWQgczNjX2dwaW9fZ2V0Y2ZnKHVuc2lnbmVkIGludCBwaW4pCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCByZXQgPSAwOwotCWludCBvZmZzZXQ7Ci0KLQlpZiAoY2hpcCkgewotCQlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7Ci0KLQkJczNjX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7Ci0JCXJldCA9IHMzY19ncGlvX2RvX2dldGNmZyhjaGlwLCBvZmZzZXQpOwotCQlzM2NfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzY19ncGlvX2dldGNmZyk7Ci0KLQotaW50IHMzY19ncGlvX3NldHB1bGwodW5zaWduZWQgaW50IHBpbiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgb2Zmc2V0LCByZXQ7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCi0JczNjX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7Ci0JcmV0ID0gczNjX2dwaW9fZG9fc2V0cHVsbChjaGlwLCBvZmZzZXQsIHB1bGwpOwotCXMzY19ncGlvX3VubG9jayhjaGlwLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2NfZ3Bpb19zZXRwdWxsKTsKLQotczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGwodW5zaWduZWQgaW50IHBpbikKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCA9IHMzY19ncGlvbGliX2dldGNoaXAocGluKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBvZmZzZXQ7Ci0JdTMyIHB1cCA9IDA7Ci0KLQlpZiAoY2hpcCkgewotCQlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7Ci0KLQkJczNjX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7Ci0JCXB1cCA9IHMzY19ncGlvX2RvX2dldHB1bGwoY2hpcCwgb2Zmc2V0KTsKLQkJczNjX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KXB1cDsKLX0KLUVYUE9SVF9TWU1CT0woczNjX2dwaW9fZ2V0cHVsbCk7Ci0KLSNpZmRlZiBDT05GSUdfUzNDX0dQSU9fQ0ZHX1MzQzI0WFgKLWludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJICAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZykKLXsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgaW50IHNoaWZ0ID0gb2ZmOwotCXUzMiBjb247Ci0KLQlpZiAoczNjX2dwaW9faXNfY2ZnX3NwZWNpYWwoY2ZnKSkgewotCQljZmcgJj0gMHhmOwotCi0JCS8qIE1hcCBvdXRwdXQgdG8gMCwgYW5kIFNGTjIgdG8gMSAqLwotCQljZmcgLT0gMTsKLQkJaWYgKGNmZyA+IDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQljZmcgPDw9IHNoaWZ0OwotCX0KLQotCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JY29uICY9IH4oMHgxIDw8IHNoaWZ0KTsKLQljb24gfD0gY2ZnOwotCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHhfYShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgb2ZmKQotewotCXUzMiBjb247Ci0KLQljb24gPSBfX3Jhd19yZWFkbChjaGlwLT5iYXNlKTsKLQljb24gPj49IG9mZjsKLQljb24gJj0gMTsKLQljb24rKzsKLQotCXJldHVybiBTM0NfR1BJT19TRk4oY29uKTsKLX0KLQotaW50IHMzY19ncGlvX3NldGNmZ19zM2MyNHh4KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IG9mZiAqIDI7Ci0JdTMyIGNvbjsKLQotCWlmIChzM2NfZ3Bpb19pc19jZmdfc3BlY2lhbChjZmcpKSB7Ci0JCWNmZyAmPSAweGY7Ci0JCWlmIChjZmcgPiAzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2ZnIDw8PSBzaGlmdDsKLQl9Ci0KLQljb24gPSBfX3Jhd19yZWFkbChyZWcpOwotCWNvbiAmPSB+KDB4MyA8PCBzaGlmdCk7Ci0JY29uIHw9IGNmZzsKLQlfX3Jhd193cml0ZWwoY29uLCByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGludCBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCi17Ci0JdTMyIGNvbjsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UpOwotCWNvbiA+Pj0gb2ZmICogMjsKLQljb24gJj0gMzsKLQotCS8qIHRoaXMgY29udmVyc2lvbiB3b3JrcyBmb3IgSU4gYW5kIE9VVCBhcyB3ZWxsIGFzIHNwZWNpYWwgbW9kZSAqLwotCXJldHVybiBTM0NfR1BJT19TUEVDSUFMKGNvbik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TM0NfR1BJT19DRkdfUzNDNjRYWAotaW50IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjZmcpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IChvZmYgJiA3KSAqIDQ7Ci0JdTMyIGNvbjsKLQotCWlmIChvZmYgPCA4ICYmIGNoaXAtPmNoaXAubmdwaW8gPiA4KQotCQlyZWcgLT0gNDsKLQotCWlmIChzM2NfZ3Bpb19pc19jZmdfc3BlY2lhbChjZmcpKSB7Ci0JCWNmZyAmPSAweGY7Ci0JCWNmZyA8PD0gc2hpZnQ7Ci0JfQotCi0JY29uID0gX19yYXdfcmVhZGwocmVnKTsKLQljb24gJj0gfigweGYgPDwgc2hpZnQpOwotCWNvbiB8PSBjZmc7Ci0JX19yYXdfd3JpdGVsKGNvbiwgcmVnKTsKLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IChvZmYgJiA3KSAqIDQ7Ci0JdTMyIGNvbjsKLQotCWlmIChvZmYgPCA4ICYmIGNoaXAtPmNoaXAubmdwaW8gPiA4KQotCQlyZWcgLT0gNDsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JY29uID4+PSBzaGlmdDsKLQljb24gJj0gMHhmOwotCi0JLyogdGhpcyBjb252ZXJzaW9uIHdvcmtzIGZvciBJTiBhbmQgT1VUIGFzIHdlbGwgYXMgc3BlY2lhbCBtb2RlICovCi0JcmV0dXJuIFMzQ19HUElPX1NQRUNJQUwoY29uKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19TM0NfR1BJT19DRkdfUzNDNjRYWCAqLwotCi0jaWZkZWYgQ09ORklHX1MzQ19HUElPX1BVTExfVVBET1dOCi1pbnQgczNjX2dwaW9fc2V0cHVsbF91cGRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkgICAgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlICsgMHgwODsKLQlpbnQgc2hpZnQgPSBvZmYgKiAyOwotCXUzMiBwdXA7Ci0KLQlwdXAgPSBfX3Jhd19yZWFkbChyZWcpOwotCXB1cCAmPSB+KDMgPDwgc2hpZnQpOwotCXB1cCB8PSBwdWxsIDw8IHNoaWZ0OwotCV9fcmF3X3dyaXRlbChwdXAsIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfdXBkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7Ci0JaW50IHNoaWZ0ID0gb2ZmICogMjsKLQl1MzIgcHVwID0gX19yYXdfcmVhZGwocmVnKTsKLQotCXB1cCA+Pj0gc2hpZnQ7Ci0JcHVwICY9IDB4MzsKLQlyZXR1cm4gKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KXB1cDsKLX0KLQotI2lmZGVmIENPTkZJR19TM0NfR1BJT19QVUxMX1MzQzI0NDMKLWludCBzM2NfZ3Bpb19zZXRwdWxsX3MzYzI0NDMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0Jc3dpdGNoIChwdWxsKSB7Ci0JY2FzZSBTM0NfR1BJT19QVUxMX05PTkU6Ci0JCXB1bGwgPSAweDAxOwotCQlicmVhazsKLQljYXNlIFMzQ19HUElPX1BVTExfVVA6Ci0JCXB1bGwgPSAweDAwOwotCQlicmVhazsKLQljYXNlIFMzQ19HUElPX1BVTExfRE9XTjoKLQkJcHVsbCA9IDB4MDI7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gczNjX2dwaW9fc2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmLCBwdWxsKTsKLX0KLQotczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfczNjMjQ0MyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgaW50IG9mZikKLXsKLQlzM2NfZ3Bpb19wdWxsX3QgcHVsbDsKLQotCXB1bGwgPSBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93bihjaGlwLCBvZmYpOwotCi0Jc3dpdGNoIChwdWxsKSB7Ci0JY2FzZSAweDAwOgotCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9VUDsKLQkJYnJlYWs7Ci0JY2FzZSAweDAxOgotCWNhc2UgMHgwMzoKLQkJcHVsbCA9IFMzQ19HUElPX1BVTExfTk9ORTsKLQkJYnJlYWs7Ci0JY2FzZSAweDAyOgotCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9ET1dOOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcHVsbDsKLX0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TM0NfR1BJT19QVUxMX1VQKSB8fCBkZWZpbmVkKENPTkZJR19TM0NfR1BJT19QVUxMX0RPV04pCi1zdGF0aWMgaW50IHMzY19ncGlvX3NldHB1bGxfMShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCSB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCwKLQkJCSBzM2NfZ3Bpb19wdWxsX3QgdXBkb3duKQotewotCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7Ci0JdTMyIHB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0KLQlpZiAocHVsbCA9PSB1cGRvd24pCi0JCXB1cCAmPSB+KDEgPDwgb2ZmKTsKLQllbHNlIGlmIChwdWxsID09IFMzQ19HUElPX1BVTExfTk9ORSkKLQkJcHVwIHw9ICgxIDw8IG9mZik7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCV9fcmF3X3dyaXRlbChwdXAsIHJlZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF8xKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHVwZG93bikKLXsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OwotCXUzMiBwdXAgPSBfX3Jhd19yZWFkbChyZWcpOwotCi0JcHVwICY9ICgxIDw8IG9mZik7Ci0JcmV0dXJuIHB1cCA/IFMzQ19HUElPX1BVTExfTk9ORSA6IHVwZG93bjsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUzNDX0dQSU9fUFVMTF9VUCB8fCBDT05GSUdfUzNDX0dQSU9fUFVMTF9ET1dOICovCi0KLSNpZmRlZiBDT05GSUdfUzNDX0dQSU9fUFVMTF9VUAotczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfMXVwKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZikKLXsKLQlyZXR1cm4gczNjX2dwaW9fZ2V0cHVsbF8xKGNoaXAsIG9mZiwgUzNDX0dQSU9fUFVMTF9VUCk7Ci19Ci0KLWludCBzM2NfZ3Bpb19zZXRwdWxsXzF1cChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCSB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCkKLXsKLQlyZXR1cm4gczNjX2dwaW9fc2V0cHVsbF8xKGNoaXAsIG9mZiwgcHVsbCwgUzNDX0dQSU9fUFVMTF9VUCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX1BVTExfVVAgKi8KLQotI2lmZGVmIENPTkZJR19TM0NfR1BJT19QVUxMX0RPV04KLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsXzFkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZikKLXsKLQlyZXR1cm4gczNjX2dwaW9fZ2V0cHVsbF8xKGNoaXAsIG9mZiwgUzNDX0dQSU9fUFVMTF9ET1dOKTsKLX0KLQotaW50IHMzY19ncGlvX3NldHB1bGxfMWRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCi17Ci0JcmV0dXJuIHMzY19ncGlvX3NldHB1bGxfMShjaGlwLCBvZmYsIHB1bGwsIFMzQ19HUElPX1BVTExfRE9XTik7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1MzQ19HUElPX1BVTExfRE9XTiAqLwotCi0jaWZkZWYgQ09ORklHX1M1UF9HUElPX0RSVlNUUgotczVwX2dwaW9fZHJ2c3RyX3QgczVwX2dwaW9fZ2V0X2RydnN0cih1bnNpZ25lZCBpbnQgcGluKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGludCBvZmY7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JaW50IHNoaWZ0OwotCXUzMiBkcnZzdHI7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2ZmID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCXNoaWZ0ID0gb2ZmICogMjsKLQlyZWcgPSBjaGlwLT5iYXNlICsgMHgwQzsKLQotCWRydnN0ciA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JZHJ2c3RyID0gZHJ2c3RyID4+IHNoaWZ0OwotCWRydnN0ciAmPSAweDM7Ci0KLQlyZXR1cm4gKF9fZm9yY2UgczVwX2dwaW9fZHJ2c3RyX3QpZHJ2c3RyOwotfQotRVhQT1JUX1NZTUJPTChzNXBfZ3Bpb19nZXRfZHJ2c3RyKTsKLQotaW50IHM1cF9ncGlvX3NldF9kcnZzdHIodW5zaWduZWQgaW50IHBpbiwgczVwX2dwaW9fZHJ2c3RyX3QgZHJ2c3RyKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChwaW4pOwotCXVuc2lnbmVkIGludCBvZmY7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JaW50IHNoaWZ0OwotCXUzMiB0bXA7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2ZmID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOwotCXNoaWZ0ID0gb2ZmICogMjsKLQlyZWcgPSBjaGlwLT5iYXNlICsgMHgwQzsKLQotCXRtcCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JdG1wICY9IH4oMHgzIDw8IHNoaWZ0KTsKLQl0bXAgfD0gZHJ2c3RyIDw8IHNoaWZ0OwotCi0JX19yYXdfd3JpdGVsKHRtcCwgcmVnKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzNXBfZ3Bpb19zZXRfZHJ2c3RyKTsKLSNlbmRpZgkvKiBDT05GSUdfUzVQX0dQSU9fRFJWU1RSICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0M2M0Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtczNjL2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgotICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBTM0Mgc2VyaWVzIEdQSU8gY29yZQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgotCi0jaWZkZWYgQ09ORklHX1MzQ19HUElPX1RSQUNLCi1zdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2dwaW9zW1MzQ19HUElPX0VORF07Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBzM2NfZ3Bpb2xpYl90cmFjayhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBpbnQgZ3BuOwotCWludCBpOwotCi0JZ3BuID0gY2hpcC0+Y2hpcC5iYXNlOwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5jaGlwLm5ncGlvOyBpKyssIGdwbisrKSB7Ci0JCUJVR19PTihncG4gPj0gQVJSQVlfU0laRShzM2NfZ3Bpb3MpKTsKLQkJczNjX2dwaW9zW2dwbl0gPSBjaGlwOwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfUzNDX0dQSU9fVFJBQ0sgKi8KLQotLyogRGVmYXVsdCByb3V0aW5lcyBmb3IgY29udHJvbGxpbmcgR1BJTywgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFMzQzI0WFgKLSAqIEdQSU8gZnVuY3Rpb25zIHdoaWNoIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBlYWNoIGdwaW8gYmFuayBvZiB0aGUKLSAqIGNoaXAgaXMgYXMgZm9sbG93aW5nOgotICoKLSAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCAyIGJpdHMgcGVyIGdwaW8KLSAqCSAgICAgICAgZ3BpbyBuOiAyIGJpdHMgc3RhcnRpbmcgYXQgKDIqbikKLSAqCQkwMCA9IGlucHV0LCAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgotICogYmFzZSArIDB4MDQ6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCi0gKgkJYml0IG46IGRhdGEgYml0IG4KLSovCi0KLXN0YXRpYyBpbnQgczNjX2dwaW9saWJfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgY29uOwotCi0JczNjX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7Ci0KLQljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7Ci0JY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOwotCi0JX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOwotCi0JczNjX2dwaW9fdW5sb2NrKG91cmNoaXAsIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzM2NfZ3Bpb2xpYl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCSAgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCXVuc2lnbmVkIGxvbmcgY29uOwotCi0JczNjX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7Ci0KLQlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7Ci0JZGF0ICY9IH4oMSA8PCBvZmZzZXQpOwotCWlmICh2YWx1ZSkKLQkJZGF0IHw9IDEgPDwgb2Zmc2V0OwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDAwKTsKLQljb24gJj0gfigzIDw8IChvZmZzZXQgKiAyKSk7Ci0JY29uIHw9IDEgPDwgKG9mZnNldCAqIDIpOwotCi0JX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIDB4MDApOwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKLQotCXMzY19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHMzY19ncGlvbGliX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGF0OwotCi0JczNjX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7Ci0KLQlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7Ci0JZGF0ICY9IH4oMSA8PCBvZmZzZXQpOwotCWlmICh2YWx1ZSkKLQkJZGF0IHw9IDEgPDwgb2Zmc2V0OwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKLQotCXMzY19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgczNjX2dwaW9saWJfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwob3VyY2hpcC0+YmFzZSArIDB4MDQpOwotCXZhbCA+Pj0gb2Zmc2V0OwotCXZhbCAmPSAxOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotX19pbml0IHZvaWQgczNjX2dwaW9saWJfYWRkKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQotewotCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJmNoaXAtPmNoaXA7Ci0JaW50IHJldDsKLQotCUJVR19PTighY2hpcC0+YmFzZSk7Ci0JQlVHX09OKCFnYy0+bGFiZWwpOwotCUJVR19PTighZ2MtPm5ncGlvKTsKLQotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKLQotCWlmICghZ2MtPmRpcmVjdGlvbl9pbnB1dCkKLQkJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IHMzY19ncGlvbGliX2lucHV0OwotCWlmICghZ2MtPmRpcmVjdGlvbl9vdXRwdXQpCi0JCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gczNjX2dwaW9saWJfb3V0cHV0OwotCWlmICghZ2MtPnNldCkKLQkJZ2MtPnNldCA9IHMzY19ncGlvbGliX3NldDsKLQlpZiAoIWdjLT5nZXQpCi0JCWdjLT5nZXQgPSBzM2NfZ3Bpb2xpYl9nZXQ7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQlpZiAoY2hpcC0+cG0gIT0gTlVMTCkgewotCQlpZiAoIWNoaXAtPnBtLT5zYXZlIHx8ICFjaGlwLT5wbS0+cmVzdW1lKQotCQkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiAlcyBoYXMgbWlzc2luZyBQTSBmdW5jdGlvbnNcbiIsCi0JCQkgICAgICAgZ2MtPmxhYmVsKTsKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiAlcyBoYXMgbm8gUE0gZnVuY3Rpb25cbiIsIGdjLT5sYWJlbCk7Ci0jZW5kaWYKLQotCS8qIGdwaW9jaGlwX2FkZCgpIHByaW50cyBvd24gZmFpbHVyZSBtZXNzYWdlIG9uIGVycm9yLiAqLwotCXJldCA9IGdwaW9jaGlwX2FkZChnYyk7Ci0JaWYgKHJldCA+PSAwKQotCQlzM2NfZ3Bpb2xpYl90cmFjayhjaGlwKTsKLX0KLQotaW50IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqczNjX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwKLQkJCXN0cnVjdCBzM2NfZ3Bpb19jaGlwLCBjaGlwKTsKLQotCXJldHVybiBzM2NfY2hpcC0+aXJxX2Jhc2UgKyBvZmZzZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2FkYy1jb3JlLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2FkYy1jb3JlLmgKaW5kZXggYTI4MTU2OC4uYTkyN2JlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hZGMtY29yZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYWRjLWNvcmUuaApAQCAtMjAsNyArMjAsNyBAQAogLyogcmUtZGVmaW5lIGRldmljZSBuYW1lIGRlcGVuZGluZyBvbiBzdXBwb3J0LiAqLwogc3RhdGljIGlubGluZSB2b2lkIHMzY19hZGNfc2V0bmFtZShjaGFyICpuYW1lKQogewotI2lmZGVmIENPTkZJR19TQU1TVU5HX0RFVl9BREMKKyNpZiBkZWZpbmVkKENPTkZJR19TQU1TVU5HX0RFVl9BREMpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfUzNDMjRYWCkKIAlzM2NfZGV2aWNlX2FkYy5uYW1lID0gbmFtZTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hdWRpby1zaW10ZWMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0NTM2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8tc2ltdGVjLmgKQEAgLTAsMCArMSwzNyBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hdWRpby1zaW10ZWMuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNpbXRlYyBBdWRpbyBzdXBwb3J0LgorKi8KKworLyoqCisgKiBzdHJ1Y3QgczNjMjR4eF9hdWRpb19zaW10ZWNfcGRhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBzaW10ZWMgYXVkaW8KKyAqIEB1c2VfbXBsbGluOiBTZWxlY3QgY29kZWMgY2xvY2sgZnJvbSBNUExMaW4KKyAqIEBvdXRwdXRfY2RjbGs6IE5lZWQgdG8gb3V0cHV0IENEQ0xLIHRvIHRoZSBjb2RlYworICogQGhhdmVfbWljOiBTZXQgaWYgd2UgaGF2ZSBhIE1JQyBzb2NrZXQKKyAqIEBoYXZlX2xvdXQ6IFNldCBpZiB3ZSBoYXZlIGEgTGluZU91dCBzb2NrZXQKKyAqIEBhbXBfZ3BpbzogR1BJTyBwaW4gdG8gZW5hYmxlIHRoZSBBTVAKKyAqIEBhbXBfZ2FpbjogT3B0aW9uIEdQSU8gdG8gY29udHJvbCBBTVAgZ2FpbgorICovCitzdHJ1Y3QgczNjMjR4eF9hdWRpb19zaW10ZWNfcGRhdGEgeworCXVuc2lnbmVkIGludAl1c2VfbXBsbGluOjE7CisJdW5zaWduZWQgaW50CW91dHB1dF9jZGNsazoxOworCisJdW5zaWduZWQgaW50CWhhdmVfbWljOjE7CisJdW5zaWduZWQgaW50CWhhdmVfbG91dDoxOworCisJaW50CQlhbXBfZ3BpbzsKKwlpbnQJCWFtcF9nYWluWzJdOworCisJdm9pZAkoKnN0YXJ0dXApKHZvaWQpOworfTsKKworZXh0ZXJuIGludCBzaW10ZWNfYXVkaW9fYWRkKGNvbnN0IGNoYXIgKmNvZGVjX25hbWUsIGJvb2wgaGFzX2xyX3JvdXRpbmcsCisJCQkgICAgc3RydWN0IHMzYzI0eHhfYXVkaW9fc2ltdGVjX3BkYXRhICpwZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY2FtcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzA4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NhbXBvcnQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogUzVQIHNlcmllcyBjYW1lcmEgaW50ZXJmYWNlIGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19QTEFUX1NBTVNVTkdfQ0FNUE9SVF9IXworI2RlZmluZSBfX1BMQVRfU0FNU1VOR19DQU1QT1JUX0hfIF9fRklMRV9fCisKK2VudW0gczVwX2NhbXBvcnRfaWQgeworCVM1UF9DQU1QT1JUX0EsCisJUzVQX0NBTVBPUlRfQiwKK307CisKKy8qCisgKiBUaGUgaGVscGVyIGZ1bmN0aW9ucyB0byBjb25maWd1cmUgR1BJTyBmb3IgdGhlIGNhbWVyYSBwYXJhbGxlbCBidXMuCisgKiBUaGUgY2FtZXJhIHBvcnQgY2FuIGJlIG11bHRpcGxleGVkIHdpdGggYW55IEZJTUMgZW50aXR5LCBldmVuIG11bHRpcGxlCisgKiBGSU1DIGVudGl0aWVzIGFyZSBhbGxvd2VkIHRvIGJlIGF0dGFjaGVkIHRvIGEgc2luZ2xlIHBvcnQgc2ltdWx0YW5lb3VzbHkuCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRvIGJlIHVzZWQgaW4gdGhlIGJvYXJkIHNldHVwIGNvZGUuCisgKi8KK2ludCBzNXB2MjEwX2ZpbWNfc2V0dXBfZ3BpbyhlbnVtIHM1cF9jYW1wb3J0X2lkIGlkKTsKK2ludCBleHlub3M0X2ZpbWNfc2V0dXBfZ3BpbyhlbnVtIHM1cF9jYW1wb3J0X2lkIGlkKTsKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX0NBTVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDI4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NvbW1vbi1zbWRrLmgKQEAgLTAsMCArMSwxNSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jb21tb24tc21kay5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIENvbW1vbiBjb2RlIGZvciBTTURLMjQxMCBhbmQgU01ESzI0NDAgYm9hcmRzCisgKgorICogaHR0cDovL3d3dy5mbHVmZi5vcmcvYmVuL3NtZGsyNDQwLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCitleHRlcm4gdm9pZCBzbWRrX21hY2hpbmVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUtZnJlcS1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNDc2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCkBAIC0wLDAgKzEsMjg4IEBACisvKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIHN1cHBvcnQgLSBjb3JlIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPHBsYXQvY3B1LWZyZXEuaD4KKworc3RydWN0IHNlcV9maWxlOworCisjZGVmaW5lIE1BWF9CQU5LUyAoOCkKKyNkZWZpbmUgUzNDMjQxMl9NQVhfSU8JKDgpCisKKy8qKgorICogc3RydWN0IHMzYzI0MTBfaW9iYW5rX3RpbWluZyAtIElPIGJhbmsgdGltaW5ncyBmb3IgUzNDMjQxMCBzdHlsZSB0aW1pbmdzCisgKiBAYmFua2NvbjogVGhlIGNhY2hlZCB2ZXJzaW9uIG9mIHNldHRpbmdzIGluIHRoaXMgc3RydWN0dXJlLgorICogQHRhY3A6CisgKiBAdGFjczogVGltZSBmcm9tIGFkZHJlc3MgdmFsaWQgdG8gbkNTIGFzc2VydGVkLgorICogQHRjb3M6IFRpbWUgZnJvbSBuQ1MgYXNzZXJ0ZWQgdG8gbk9FIG9yIG5XRSBhc3NlcnRlZC4KKyAqIEB0YWNjOiBUaW1lIHRoYXQgbk9FIG9yIG5XRSBpcyBhc3NlcnRlZC4KKyAqIEB0Y29oOiBUaW1lIG5DUyBpcyBoZWxkIGFmdGVyIG5PRSBvciBuV0UgYXJlIHJlbGVhc2VkLgorICogQHRjYWg6IFRpbWUgYWRkcmVzcyBpcyBoZWxkIGZvciBhZnRlcgorICogQG53YWl0X2VuOiBXaGV0aGVyIG5XQUlUIGlzIGVuYWJsZWQgZm9yIHRoaXMgYmFuay4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBJTyB0aW1pbmdzIGZvciBhIFMzQzI0MTAgc3R5bGUgSU8gYmFuaworICogdXNlZCBieSB0aGUgQ1BVIGZyZXF1ZW5jeSBzdXBwb3J0IGlmIGl0IG5lZWRzIHRvIGNoYW5nZSB0aGUgc2V0dGluZ3MKKyAqIG9mIHRoZSBJTy4KKyAqLworc3RydWN0IHMzYzI0MTBfaW9iYW5rX3RpbWluZyB7CisJdW5zaWduZWQgbG9uZwliYW5rY29uOworCXVuc2lnbmVkIGludAl0YWNwOworCXVuc2lnbmVkIGludAl0YWNzOworCXVuc2lnbmVkIGludAl0Y29zOworCXVuc2lnbmVkIGludAl0YWNjOworCXVuc2lnbmVkIGludAl0Y29oOwkJLyogbkNTIGhvbGQgYWZyZXIgbk9FL25XRSAqLworCXVuc2lnbmVkIGludAl0Y2FoOwkJLyogQWRkcmVzcyBob2xkIGFmdGVyIG5DUyAqLworCXVuc2lnbmVkIGNoYXIJbndhaXRfZW47CS8qIG5XYWl0IGVuYWJsZWQgZm9yIGJhbmsuICovCit9OworCisvKioKKyAqIHN0cnVjdCBzM2MyNDEyX2lvYmFua190aW1pbmcgLSBpbyB0aW1pbmdzIGZvciBQTDA5MiAoUzNDMjQxMikgc3R5bGUgSU8KKyAqIEBpZGN5OiBUaGUgaWRsZSBjeWNsZSB0aW1lIGJldHdlZW4gdHJhbnNhY3Rpb25zLgorICogQHdzdHJkOiBuQ1MgcmVsZWFzZSB0byBlbmQgb2YgcmVhZCBjeWNsZS4KKyAqIEB3c3R3cjogbkNTIHJlbGVhc2UgdG8gZW5kIG9mIHdyaXRlIGN5Y2xlLgorICogQHdzdG9lbjogbkNTIGFzc2VydGlvbiB0byBuT0UgYXNzZXJ0aW9uIHRpbWUuCisgKiBAd3N0d2VuOiBuQ1MgYXNzZXJ0aW9uIHRvIG5XRSBhc3NlcnRpb24gdGltZS4KKyAqIEB3c3RicmQ6IEJ1cnN0IHJlYWR5IGRlbGF5LgorICogQHNtYmlkY3lyOiBSZWdpc3RlciBjYWNoZSBmb3Igc21iaWRjeXIgdmFsdWUuCisgKiBAc21id3N0cmQ6IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3RyZCB2YWx1ZS4KKyAqIEBzbWJ3c3R3cjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdHdyIHZhbHVlLgorICogQHNtYndzdG9lbjogUmVnaXN0ZXIgY2FjaGUgZm9yIHNtYndzdG9lbiB2YWx1ZS4KKyAqIEBzbWJ3c3R3ZW46IFJlZ2lzdGVyIGNhY2hlIGZvciBzbWJ3c3R3ZW4gdmFsdWUuCisgKiBAc21id3N0YnJkOiBSZWdpc3RlciBjYWNoZSBmb3Igc21id3N0YnJkIHZhbHVlLgorICoKKyAqIFRpbWluZyBpbmZvcm1hdGlvbiBmb3IgYSBJTyBiYW5rIG9uIGFuIFMzQzI0MTIgb3Igc2ltaWxhciBzeXN0ZW0gd2hpY2gKKyAqIHVzZXMgYSBQTDA5MyBibG9jay4KKyAqLworc3RydWN0IHMzYzI0MTJfaW9iYW5rX3RpbWluZyB7CisJdW5zaWduZWQgaW50CWlkY3k7CisJdW5zaWduZWQgaW50CXdzdHJkOworCXVuc2lnbmVkIGludAl3c3R3cjsKKwl1bnNpZ25lZCBpbnQJd3N0b2VuOworCXVuc2lnbmVkIGludAl3c3R3ZW47CisJdW5zaWduZWQgaW50CXdzdGJyZDsKKworCS8qIHJlZ2lzdGVyIGNhY2hlICovCisJdW5zaWduZWQgY2hhcglzbWJpZGN5cjsKKwl1bnNpZ25lZCBjaGFyCXNtYndzdHJkOworCXVuc2lnbmVkIGNoYXIJc21id3N0d3I7CisJdW5zaWduZWQgY2hhcglzbWJ3c3RvZW47CisJdW5zaWduZWQgY2hhcglzbWJ3c3R3ZW47CisJdW5zaWduZWQgY2hhcglzbWJ3c3RicmQ7Cit9OworCit1bmlvbiBzM2NfaW9iYW5rIHsKKwlzdHJ1Y3QgczNjMjQxMF9pb2JhbmtfdGltaW5nCSppb18yNDEwOworCXN0cnVjdCBzM2MyNDEyX2lvYmFua190aW1pbmcJKmlvXzI0MTI7Cit9OworCisvKioKKyAqIHN0cnVjdCBzM2NfaW90aW1pbmdzIC0gQ2hpcCBJTyB0aW1pbmdzIGhvbGRlcgorICogQGJhbms6IFRoZSB0aW1pbmdzIGZvciBlYWNoIElPIGJhbmsuCisgKi8KK3N0cnVjdCBzM2NfaW90aW1pbmdzIHsKKwl1bmlvbiBzM2NfaW9iYW5rCWJhbmtbTUFYX0JBTktTXTsKK307CisKKy8qKgorICogc3RydWN0IHMzY19wbGx0YWIgLSBQTEwgdGFibGUgaW5mb3JtYXRpb24uCisgKiBAdmFsczogTGlzdCBvZiBQTEwgdmFsdWVzLgorICogQHNpemU6IFNpemUgb2YgdGhlIFBMTCB0YWJsZSBAdmFscy4KKyAqLworc3RydWN0IHMzY19wbGx0YWIgeworCXN0cnVjdCBzM2NfcGxsdmFsCSp2YWxzOworCWludAkJCSBzaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnIC0gY3VycmVudCBjcHUgZnJlcXVlbmN5IGNvbmZpZ3VyYXRpb24KKyAqIEBmcmVxOiBUaGUgY3VycmVudCBzZXR0aW5ncyBmb3IgdGhlIGNvcmUgY2xvY2tzLgorICogQG1heDogTWF4aXVtIHNldHRpbmdzLCBkZXJpdmVkIGZyb20gY29yZSwgYm9hcmQgYW5kIHVzZXIgc2V0dGluZ3MuCisgKiBAcGxsOiBUaGUgUExMIHRhYmxlIGVudHJ5IGZvciB0aGUgY3VycmVudCBQTEwgc2V0dGluZ3MuCisgKiBAZGl2czogVGhlIGRpdmlzb3Igc2V0dGluZ3MgZm9yIHRoZSBjb3JlIGNsb2Nrcy4KKyAqIEBpbmZvOiBUaGUgY3VycmVudCBjb3JlIGRyaXZlciBpbmZvcm1hdGlvbi4KKyAqIEBib2FyZDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYm9hcmQgd2UgYXJlIHJ1bm5pbmcgb24uCisgKiBAbG9ja19wbGw6IFNldCBpZiB0aGUgUExMIHNldHRpbmdzIGNhbm5vdCBiZSBjaGFuZ2VkLgorICoKKyAqIFRoaXMgaXMgZm9yIHRoZSBjb3JlIGRyaXZlcnMgdGhhdCBuZWVkIHRvIGtub3cgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBjdXJyZW50IHNldHRpbmdzIGFuZCB2YWx1ZXMuIEl0IHNob3VsZCBub3QgYmUgbmVlZGVkIGJ5IGFueQorICogZGV2aWNlIGRyaXZlcnMuCisqLworc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyB7CisJc3RydWN0IHMzY19mcmVxCQlmcmVxOworCXN0cnVjdCBzM2NfZnJlcQkJbWF4OworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBwbGw7CisJc3RydWN0IHMzY19jbGtkaXZzCWRpdnM7CisJc3RydWN0IHMzY19jcHVmcmVxX2luZm8gKmluZm87CS8qIGZvciBjb3JlLCBub3QgZHJpdmVycyAqLworCXN0cnVjdCBzM2NfY3B1ZnJlcV9ib2FyZCAqYm9hcmQ7CisKKwl1bnNpZ25lZCBpbnQJbG9ja19wbGw6MTsKK307CisKKy8qKgorICogc3RydWN0IHMzY19jcHVmcmVxX2luZm8gLSBJbmZvcm1hdGlvbiBmb3IgdGhlIENQVSBmcmVxdWVuY3kgZHJpdmVyLgorICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uCisgKiBAbWF4OiBUaGUgbWF4aW11bSBmcmVxdWVuY2llcyBmb3IgdGhlIHN5c3RlbS4KKyAqIEBsYXRlbmN5OiBUcmFuc2l0aW9uIGxhdGVuY3kgdG8gZ2l2ZSB0byBjcHVmcmVxLgorICogQGxvY2t0aW1lX206IFRoZSBsb2NrLXRpbWUgaW4gdVMgZm9yIHRoZSBNUExMLgorICogQGxvY2t0aW1lX3U6IFRoZSBsb2NrLXRpbWUgaW4gdVMgZm9yIHRoZSBVUExMLgorICogQGxvY3R0aW1lX2JpdHM6IFRoZSBudW1iZXIgb2YgYml0cyBlYWNoIExPQ0tUSU1FIGZpZWxkLgorICogQG5lZWRfcGxsOiBTZXQgaWYgdGhpcyBkcml2ZXIgbmVlZHMgdG8gY2hhbmdlIHRoZSBQTEwgdmFsdWVzIHRvIGFjaGlldmUKKyAqCWFueSBmcmVxdWVuY3kgY2hhbmdlcy4gVGhpcyBpcyByZWFsbHkgb25seSBuZWVkIGJ5IGRldmljZXMgbGlrZSB0aGUKKyAqCVMzQzI0MTAgd2hlcmUgdGhlcmUgaXMgbm8gb3IgbGltaXRlZCBkaXZpZGVyIGJldHdlZW4gdGhlIFBMTCBhbmQgdGhlCisgKglBUk1DTEsuCisgKiBAcmVzdW1lX2Nsb2NrczogVXBkYXRlIHRoZSBjbG9ja3Mgb24gcmVzdW1lLgorICogQGdldF9pb3RpbWluZzogR2V0IHRoZSBjdXJyZW50IElPIHRpbWluZyBkYXRhLCBtYWlubHkgZm9yIHVzZSBhdCBzdGFydC4KKyAqIEBzZXRfaW90aW1pbmc6IFVwZGF0ZSB0aGUgSU8gdGltaW5ncyBmcm9tIHRoZSBjYWNoZWQgY29waWVzIGNhbGN1bGF0ZWQKKyAqCWZyb20gdGhlIEBjYWxjX2lvdGltaW5nIGVudHJ5IHdoZW4gY2hhbmdpbmcgdGhlIGZyZXF1ZW5jeS4KKyAqIEBjYWxjX2lvdGltaW5nOiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgY2FjaGVkIGNvcGllcyBvZiB0aGUgSU8gdGltaW5ncworICoJZnJvbSB0aGUgbmV3bHkgY2FsY3VsYXRlZCBmcmVxdWVuY2llcy4KKyAqIEBjYWxjX2ZyZXF0YWJsZTogQ2FsY3VsYXRlIChmaWxsIGluKSB0aGUgZ2l2ZW4gZnJlcXVlbmN5IHRhYmxlIGZyb20gdGhlCisgKgljdXJyZW50IGZyZXF1ZW5jeSBjb25maWd1cmF0aW9uLiBJZiB0aGUgdGFibGUgcGFzc2VkIGluIGlzIE5VTEwsCisgKgl0aGVuIHRoZSByZXR1cm4gaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBmaWxsZWQgZm9yIGFsbG9jYXRpb24KKyAqCW9mIHRoZSB0YWJsZS4KKyAqIEBzZXRfcmVmcmVzaDogU2V0IHRoZSBtZW1vcnkgcmVmcmVzaCBjb25maWd1cmF0aW9uLgorICogQHNldF9mdmNvOiBTZXQgdGhlIFBMTCBmcmVxdWVuY2llcy4KKyAqIEBzZXRfZGl2czogVXBkYXRlIHRoZSBjbG9jayBkaXZpc29ycy4KKyAqIEBjYWxjX2RpdnM6IENhbGN1bGF0ZSB0aGUgY2xvY2sgZGl2aXNvcnMuCisgKi8KK3N0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvIHsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwlzdHJ1Y3QgczNjX2ZyZXEJCW1heDsKKworCXVuc2lnbmVkIGludAkJbGF0ZW5jeTsKKworCXVuc2lnbmVkIGludAkJbG9ja3RpbWVfbTsKKwl1bnNpZ25lZCBpbnQJCWxvY2t0aW1lX3U7CisJdW5zaWduZWQgY2hhcgkJbG9ja3RpbWVfYml0czsKKworCXVuc2lnbmVkIGludAkJbmVlZF9wbGw6MTsKKworCS8qIGRyaXZlciByb3V0aW5lcyAqLworCisJdm9pZAkJKCpyZXN1bWVfY2xvY2tzKSh2b2lkKTsKKworCWludAkJKCpnZXRfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworCisJdm9pZAkJKCpzZXRfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworCisJaW50CQkoKmNhbGNfaW90aW1pbmcpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICp0aW1pbmdzKTsKKworCWludAkJKCpjYWxjX2ZyZXF0YWJsZSkoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCQkgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdCwKKwkJCQkJICBzaXplX3QgdGFibGVfc2l6ZSk7CisKKwl2b2lkCQkoKmRlYnVnX2lvX3Nob3cpKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJCQkgc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAorCQkJCQkgdW5pb24gczNjX2lvYmFuayAqaW9iKTsKKworCXZvaWQJCSgqc2V0X3JlZnJlc2gpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7CisJdm9pZAkJKCpzZXRfZnZjbykoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKKwl2b2lkCQkoKnNldF9kaXZzKShzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOworCWludAkJKCpjYWxjX2RpdnMpKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZyk7Cit9OworCitleHRlcm4gaW50IHMzY19jcHVmcmVxX3JlZ2lzdGVyKHN0cnVjdCBzM2NfY3B1ZnJlcV9pbmZvICppbmZvKTsKKworZXh0ZXJuIGludCBzM2NfcGxsdGFiX3JlZ2lzdGVyKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcGxscywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGxsc19ubyk7CisKKy8qIGV4cG9ydHMgYW5kIHV0aWxpdGllcyBmb3IgZGVidWdmcyAqLworZXh0ZXJuIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKnMzY19jcHVmcmVxX2dldGNvbmZpZyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqczNjX2NwdWZyZXFfZ2V0aW90aW1pbmdzKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDEwX2lvdGltaW5nX2RlYnVnZnMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgICBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJICAgICB1bmlvbiBzM2NfaW9iYW5rICppb2IpOworCitleHRlcm4gdm9pZCBzM2MyNDEyX2lvdGltaW5nX2RlYnVnZnMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgICBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJICAgICB1bmlvbiBzM2NfaW9iYW5rICppb2IpOworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUdGUworI2RlZmluZSBzM2NfY3B1ZnJlcV9kZWJ1Z2ZzX2NhbGwoeCkgeAorI2Vsc2UKKyNkZWZpbmUgczNjX2NwdWZyZXFfZGVidWdmc19jYWxsKHgpIE5VTEwKKyNlbmRpZgorCisvKiBVc2VmdWwgdXRpbGl0eSBmdW5jdGlvbnMuICovCisKK2V4dGVybiBzdHJ1Y3QgY2xrICpzM2NfY3B1ZnJlcV9jbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqKTsKKworLyogUzNDMjQxMCBhbmQgY29tcGF0aWJsZSBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQgczNjMjQxMF9jcHVmcmVxX3NldHJlZnJlc2goc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKK2V4dGVybiB2b2lkIHMzYzI0MTBfc2V0X2Z2Y28oc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnKTsKKworI2lmZGVmIENPTkZJR19TM0MyNDEwX0lPVElNSU5HCitleHRlcm4gaW50IHMzYzI0MTBfaW90aW1pbmdfY2FsYyhzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJIHN0cnVjdCBzM2NfaW90aW1pbmdzICppb3QpOworCitleHRlcm4gaW50IHMzYzI0MTBfaW90aW1pbmdfZ2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfaW90aW1pbmdfc2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7CisjZWxzZQorI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2NhbGMgTlVMTAorI2RlZmluZSBzM2MyNDEwX2lvdGltaW5nX2dldCBOVUxMCisjZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfc2V0IE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUzNDMjQxMF9JT1RJTUlORyAqLworCisvKiBTM0MyNDEyIGNvbXBhdGlibGUgcm91dGluZXMgKi8KKworZXh0ZXJuIGludCBzM2MyNDEyX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworCitleHRlcm4gaW50IHMzYzI0MTJfaW90aW1pbmdfZ2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7CisKK2V4dGVybiBpbnQgczNjMjQxMl9pb3RpbWluZ19jYWxjKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfaW90aW1pbmdfc2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfUzNDMjRYWF9ERUJVRworI2RlZmluZSBzM2NfZnJlcV9kYmcoeC4uLikgcHJpbnRrKEtFUk5fSU5GTyB4KQorI2Vsc2UKKyNkZWZpbmUgczNjX2ZyZXFfZGJnKHguLi4pIGRvIHsgaWYgKDApIHByaW50ayh4KTsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVFfUzNDMjRYWF9ERUJVRyAqLworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfSU9ERUJVRworI2RlZmluZSBzM2NfZnJlcV9pb2RiZyh4Li4uKSBwcmludGsoS0VSTl9JTkZPIHgpCisjZWxzZQorI2RlZmluZSBzM2NfZnJlcV9pb2RiZyh4Li4uKSBkbyB7IGlmICgwKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfSU9ERUJVRyAqLworCitzdGF0aWMgaW5saW5lIGludCBzM2NfY3B1ZnJlcV9hZGRmcmVxKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGUsCisJCQkJICAgICAgaW50IGluZGV4LCBzaXplX3QgdGFibGVfc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlpZiAodGFibGUpIHsKKwkJaWYgKGluZGV4ID49IHRhYmxlX3NpemUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzM2NfZnJlcV9kYmcoIiVzOiB7ICVkID0gJXUga0h6IH1cbiIsCisJCQkgICAgIF9fZnVuY19fLCBpbmRleCwgZnJlcSk7CisKKwkJdGFibGVbaW5kZXhdLmluZGV4ID0gaW5kZXg7CisJCXRhYmxlW2luZGV4XS5mcmVxdWVuY3kgPSBmcmVxOworCX0KKworCXJldHVybiBpbmRleCArIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUuaAppbmRleCBjMGE1NzQxLi40MGZkN2I2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LmgKQEAgLTEsOSArMSwxMiBAQAogLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9jcHUuaAogICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogSGVhZGVyIGZpbGUgZm9yIFMzQzI0WFggQ1BVIHN1cHBvcnQKKyAqIEhlYWRlciBmaWxlIGZvciBTYW1zdW5nIENQVSBzdXBwb3J0CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNSw2ICsxOCwxMDggQEAKICNpZm5kZWYgX19TQU1TVU5HX1BMQVRfQ1BVX0gKICNkZWZpbmUgX19TQU1TVU5HX1BMQVRfQ1BVX0gKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2Ftc3VuZ19jcHVfaWQ7CisKKyNkZWZpbmUgUzNDMjRYWF9DUFVfSUQJCTB4MzI0MDAwMDAKKyNkZWZpbmUgUzNDMjRYWF9DUFVfTUFTSwkweEZGRjAwMDAwCisKKyNkZWZpbmUgUzNDNjQwMF9DUFVfSUQJCTB4MzY0MDAwMDAKKyNkZWZpbmUgUzNDNjQxMF9DUFVfSUQJCTB4MzY0MTAwMDAKKyNkZWZpbmUgUzNDNjRYWF9DUFVfTUFTSwkweEZGRkZGMDAwCisKKyNkZWZpbmUgUzVQNjQ0MF9DUFVfSUQJCTB4NTY0NDAwMDAKKyNkZWZpbmUgUzVQNjQ1MF9DUFVfSUQJCTB4MzY0NTAwMDAKKyNkZWZpbmUgUzVQNjRYWF9DUFVfTUFTSwkweEZGRkZGMDAwCisKKyNkZWZpbmUgUzVQQzEwMF9DUFVfSUQJCTB4NDMxMDAwMDAKKyNkZWZpbmUgUzVQQzEwMF9DUFVfTUFTSwkweEZGRkZGMDAwCisKKyNkZWZpbmUgUzVQVjIxMF9DUFVfSUQJCTB4NDMxMTAwMDAKKyNkZWZpbmUgUzVQVjIxMF9DUFVfTUFTSwkweEZGRkZGMDAwCisKKyNkZWZpbmUgRVhZTk9TNDIxMF9DUFVfSUQJMHg0MzIxMDAwMAorI2RlZmluZSBFWFlOT1M0MjEyX0NQVV9JRAkweDQzMjIwMDAwCisjZGVmaW5lIEVYWU5PUzQ0MTJfQ1BVX0lECTB4RTQ0MTIyMDAKKyNkZWZpbmUgRVhZTk9TNF9DUFVfTUFTSwkweEZGRkUwMDAwCisKKyNkZWZpbmUgSVNfU0FNU1VOR19DUFUobmFtZSwgaWQsIG1hc2spCQlcCitzdGF0aWMgaW5saW5lIGludCBpc19zYW1zdW5nXyMjbmFtZSh2b2lkKQlcCit7CQkJCQkJXAorCXJldHVybiAoKHNhbXN1bmdfY3B1X2lkICYgbWFzaykgPT0gKGlkICYgbWFzaykpOwlcCit9CisKK0lTX1NBTVNVTkdfQ1BVKHMzYzI0eHgsIFMzQzI0WFhfQ1BVX0lELCBTM0MyNFhYX0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoczNjNjQwMCwgUzNDNjQwMF9DUFVfSUQsIFMzQzY0WFhfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShzM2M2NDEwLCBTM0M2NDEwX0NQVV9JRCwgUzNDNjRYWF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKHM1cDY0NDAsIFM1UDY0NDBfQ1BVX0lELCBTNVA2NFhYX0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoczVwNjQ1MCwgUzVQNjQ1MF9DUFVfSUQsIFM1UDY0WFhfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShzNXBjMTAwLCBTNVBDMTAwX0NQVV9JRCwgUzVQQzEwMF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKHM1cHYyMTAsIFM1UFYyMTBfQ1BVX0lELCBTNVBWMjEwX0NQVV9NQVNLKQorSVNfU0FNU1VOR19DUFUoZXh5bm9zNDIxMCwgRVhZTk9TNDIxMF9DUFVfSUQsIEVYWU5PUzRfQ1BVX01BU0spCitJU19TQU1TVU5HX0NQVShleHlub3M0MjEyLCBFWFlOT1M0MjEyX0NQVV9JRCwgRVhZTk9TNF9DUFVfTUFTSykKK0lTX1NBTVNVTkdfQ1BVKGV4eW5vczQ0MTIsIEVYWU5PUzQ0MTJfQ1BVX0lELCBFWFlOT1M0X0NQVV9NQVNLKQorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEyKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTYpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDRYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDMpCisjIGRlZmluZSBzb2NfaXNfczNjMjR4eCgpCWlzX3NhbXN1bmdfczNjMjR4eCgpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX3MzYzI0eHgoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0M2NDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDNjQxMCkKKyMgZGVmaW5lIHNvY19pc19zM2M2NHh4KCkJKGlzX3NhbXN1bmdfczNjNjQwMCgpIHx8IGlzX3NhbXN1bmdfczNjNjQxMCgpKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19zM2M2NHh4KCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQNjQ0MCkKKyMgZGVmaW5lIHNvY19pc19zNXA2NDQwKCkJaXNfc2Ftc3VuZ19zNXA2NDQwKCkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfczVwNjQ0MCgpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1M1UDY0NTApCisjIGRlZmluZSBzb2NfaXNfczVwNjQ1MCgpCWlzX3NhbXN1bmdfczVwNjQ1MCgpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX3M1cDY0NTAoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TNVBDMTAwKQorIyBkZWZpbmUgc29jX2lzX3M1cGMxMDAoKQlpc19zYW1zdW5nX3M1cGMxMDAoKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19zNXBjMTAwKCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQVjIxMCkKKyMgZGVmaW5lIHNvY19pc19zNXB2MjEwKCkJaXNfc2Ftc3VuZ19zNXB2MjEwKCkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfczVwdjIxMCgpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0VYWU5PUzQyMTApCisjIGRlZmluZSBzb2NfaXNfZXh5bm9zNDIxMCgpCWlzX3NhbXN1bmdfZXh5bm9zNDIxMCgpCisjZWxzZQorIyBkZWZpbmUgc29jX2lzX2V4eW5vczQyMTAoKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NPQ19FWFlOT1M0MjEyKQorIyBkZWZpbmUgc29jX2lzX2V4eW5vczQyMTIoKQlpc19zYW1zdW5nX2V4eW5vczQyMTIoKQorI2Vsc2UKKyMgZGVmaW5lIHNvY19pc19leHlub3M0MjEyKCkJMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfRVhZTk9TNDQxMikKKyMgZGVmaW5lIHNvY19pc19leHlub3M0NDEyKCkJaXNfc2Ftc3VuZ19leHlub3M0NDEyKCkKKyNlbHNlCisjIGRlZmluZSBzb2NfaXNfZXh5bm9zNDQxMigpCTAKKyNlbmRpZgorCisjZGVmaW5lIEVYWU5PUzQyMTBfUkVWXzAJKDB4MCkKKyNkZWZpbmUgRVhZTk9TNDIxMF9SRVZfMV8wCSgweDEwKQorI2RlZmluZSBFWFlOT1M0MjEwX1JFVl8xXzEJKDB4MTEpCisKICNkZWZpbmUgSU9ERVNDX0VOVCh4KSB7ICh1bnNpZ25lZCBsb25nKVMzQzI0WFhfVkFfIyN4LCBfX3BoeXNfdG9fcGZuKFMzQzI0WFhfUEFfIyN4KSwgUzNDMjRYWF9TWl8jI3gsIE1UX0RFVklDRSB9CiAKICNpZm5kZWYgTUhaCkBAIC01NSw2ICsxNjAsMTIgQEAKIGV4dGVybiB2b2lkIHM1cF9pbml0X2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLAogCQkJaW50IHNpemUsIHZvaWQgX19pb21lbSAqY3B1aWRfYWRkcik7CiAKK2V4dGVybiB2b2lkIHMzYzI0eHhfaW5pdF9jcHUodm9pZCk7CitleHRlcm4gdm9pZCBzM2M2NHh4X2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIHZvaWQgczVwX2luaXRfY3B1KHZvaWQgX19pb21lbSAqY3B1aWRfYWRkcik7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgc2Ftc3VuZ19yZXYodm9pZCk7CisKIGV4dGVybiB2b2lkIHMzYzI0eHhfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CiAKIGV4dGVybiB2b2lkIHMzYzI0eHhfaW5pdF9jbG9ja3MoaW50IHh0YWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaAppbmRleCAyNGViYjFlLi5hYjYzM2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaApAQCAtMzAsMzAgKzMwLDI0IEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91YXJ0X2RldnNbXTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3VhcnRfc3JjW107CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdGltZXJbXTsKLQorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfYWM5NzsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX2lpczA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9paXMxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfaWlzdjQ7Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX29uZW5hbmQxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfcGNtMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3BjbTE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9zcGkwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfc3BpMTsKIAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNhbXN1bmdfYXNvY19pZG1hOwotCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9wY20wOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfcGNtMTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfYWM5NzsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV90czsKLQorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9hZGM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2NmY29uOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9mYjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltZDA7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX29oY2k7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2xjZDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfd2R0OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9od21vbjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMzOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9pMmMyOwpAQCAtNjIsOTMgKzU2LDkwIEBACiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzU7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzY7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2kyYzc7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3J0YzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfYWRjOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9zZGk7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2lpczsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHdtb247Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfaHNtbWMxOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9oc21tYzI7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2hzbW1jMzsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfY2Zjb247Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfbGNkOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9uYW5kOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vaGNpOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vbmVuYW5kOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9ydGM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3NkaTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfc3BpMTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwaTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BpMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwaTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9zcGkwOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjR4MF9kZXZpY2Vfc3BpMTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9od21vbjsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9uYW5kOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9vbmVuYW5kOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfb25lbmFuZDE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX29uZW5hbmQ7Ci0KK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdHM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3RpbWVyW107CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYmdhZGdldDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfdXNiX2hzdWRjOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV91c2JfaHNvdGc7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX3VzYl9oc3VkYzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2Vfd2R0OwogCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9hYzk3OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGNtMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BjbTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9wY20yOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfaWlzMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9paXMyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BkaWY7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2VoY2k7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMzOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jX21kOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1kMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfaGRtaTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfaTJjX2hkbWlwaHk7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mYzsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWZjX2w7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19yOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9taXBpX2NzaXMwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9taXBpX2NzaXMxOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9taXhlcjsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2Vfb25lbmFuZDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2Vfc2RvOwogCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9hYzk3OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGNtMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BjbTE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wY20yOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfaTJzMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2kyczE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9pMnMyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2Vfc3BkaWY7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wZFtdOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfYWhjaTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2R3bWNpOwotCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQwX2RldmljZV9wY207CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQwX2RldmljZV9paXM7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQwX2RldmljZV9wY207CiAKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NTBfZGV2aWNlX2lpczA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDUwX2RldmljZV9paXMxOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ1MF9kZXZpY2VfaWlzMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NTBfZGV2aWNlX3BjbTA7CiAKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0eDBfZGV2aWNlX3NwaTA7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NHgwX2RldmljZV9zcGkxOworCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9hYzk3OwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGNtMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3BjbTE7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9paXMwOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfaWlzMTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX2lpczI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9wY20wOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfcGNtMTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwZGlmOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2Vfc3BpMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cGMxMDBfZGV2aWNlX3NwaTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9zcGkyOwogCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2RldmljZV9rZXlwYWQ7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9hYzk3OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfaWlzMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9paXMyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfcGNtMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3BjbTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9wY20yOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BkaWY7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9zcGkwOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2Vfc3BpMTsKIAotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfZmltYzE7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX2ZpbWMyOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9maW1jMzsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmM7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBfZGV2aWNlX21mY19sOwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9tZmNfcjsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMDsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cF9kZXZpY2VfbWlwaV9jc2lzMTsKLQotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwX2RldmljZV9laGNpOwotCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9hYzk3OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfYWhjaTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2R3bWNpOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfaTJzMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX2kyczE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9pMnMyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGNtMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3BjbTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBleHlub3M0X2RldmljZV9wY20yOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2VfcGRbXTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV4eW5vczRfZGV2aWNlX3NwZGlmOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXh5bm9zNF9kZXZpY2Vfc3lzbW11OwogCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2Fzb2NfZG1hOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2lkbWE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzYW1zdW5nX2RldmljZV9rZXlwYWQ7CisKIC8qIHMzYzI0NDAgc3BlY2lmaWMgZGV2aWNlcyAqLwogCiAjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDQwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1vcHMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWEzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1vcHMuaApAQCAtMCwwICsxLDYzIEBACisvKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1vcHMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTYW1zdW5nIERNQSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fU0FNU1VOR19ETUFfT1BTX0hfCisjZGVmaW5lIF9fU0FNU1VOR19ETUFfT1BTX0hfIF9fRklMRV9fCisKKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKworc3RydWN0IHNhbXN1bmdfZG1hX3ByZXBfaW5mbyB7CisJZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSBjYXA7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCWRtYV9hZGRyX3QgYnVmOworCXVuc2lnbmVkIGxvbmcgcGVyaW9kOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXZvaWQgKCpmcCkodm9pZCAqZGF0YSk7CisJdm9pZCAqZnBfcGFyYW07Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ19kbWFfaW5mbyB7CisJZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSBjYXA7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHdpZHRoOworCWRtYV9hZGRyX3QgZmlmbzsKKwlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQ7Cit9OworCitzdHJ1Y3Qgc2Ftc3VuZ19kbWFfb3BzIHsKKwl1bnNpZ25lZCAoKnJlcXVlc3QpKGVudW0gZG1hX2NoIGNoLCBzdHJ1Y3Qgc2Ftc3VuZ19kbWFfaW5mbyAqaW5mbyk7CisJaW50ICgqcmVsZWFzZSkodW5zaWduZWQgY2gsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCk7CisJaW50ICgqcHJlcGFyZSkodW5zaWduZWQgY2gsIHN0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8gKmluZm8pOworCWludCAoKnRyaWdnZXIpKHVuc2lnbmVkIGNoKTsKKwlpbnQgKCpzdGFydGVkKSh1bnNpZ25lZCBjaCk7CisJaW50ICgqZmx1c2gpKHVuc2lnbmVkIGNoKTsKKwlpbnQgKCpzdG9wKSh1bnNpZ25lZCBjaCk7Cit9OworCitleHRlcm4gdm9pZCAqc2Ftc3VuZ19kbWFkZXZfZ2V0X29wcyh2b2lkKTsKK2V4dGVybiB2b2lkICpzM2NfZG1hX2dldF9vcHModm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19zYW1zdW5nX2RtYV9nZXRfb3BzKHZvaWQpCit7CisJaWYgKHNhbXN1bmdfZG1hX2lzX2RtYWRldigpKQorCQlyZXR1cm4gc2Ftc3VuZ19kbWFkZXZfZ2V0X29wcygpOworCWVsc2UKKwkJcmV0dXJuIHMzY19kbWFfZ2V0X29wcygpOworfQorCisvKgorICogc2Ftc3VuZ19kbWFfZ2V0X29wcworICogZ2V0IHRoZSBzZXQgb2Ygc2Ftc3VuZyBkbWEgb3BlcmF0aW9ucworICovCisjZGVmaW5lIHNhbXN1bmdfZG1hX2dldF9vcHMoKSBfX3NhbXN1bmdfZG1hX2dldF9vcHMoKQorCisjZW5kaWYgLyogX19TQU1TVU5HX0RNQV9PUFNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLXBsMzMwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1wbDMzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTVlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1wbDMzMC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KKyAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19ETUFfUEwzMzBfSF8KKyNkZWZpbmUgX19ETUFfUEwzMzBfSF8gX19GSUxFX18KKworLyoKKyAqIFBMMzMwIGNhbiBhc3NpZ24gYW55IGNoYW5uZWwgdG8gY29tbXVuaWNhdGUgd2l0aAorICogYW55IG9mIHRoZSBwZXJpcGhlcmFscyBhdHRjaGVkIHRvIHRoZSBETUFDLgorICogRm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbmN5IGFjcm9zcyBjbGllbnQgZHJpdmVycywKKyAqIFdlIGtlZXAgdGhlIGNoYW5uZWwgbmFtZXMgdW5jaGFuZ2VkIGFuZCBvbmx5IGFkZAorICogbWlzc2luZyBwZXJpcGhlcmFscyBhcmUgYWRkZWQuCisgKiBPcmRlciBpcyBub3QgaW1wb3J0YW50IHNpbmNlIERNQSBQTDMzMCBBUEkgZHJpdmVyCisgKiB1c2UgdGhlc2UganVzdCBhcyBJRHMuCisgKi8KK2VudW0gZG1hX2NoIHsKKwlETUFDSF9VQVJUMF9SWCwKKwlETUFDSF9VQVJUMF9UWCwKKwlETUFDSF9VQVJUMV9SWCwKKwlETUFDSF9VQVJUMV9UWCwKKwlETUFDSF9VQVJUMl9SWCwKKwlETUFDSF9VQVJUMl9UWCwKKwlETUFDSF9VQVJUM19SWCwKKwlETUFDSF9VQVJUM19UWCwKKwlETUFDSF9VQVJUNF9SWCwKKwlETUFDSF9VQVJUNF9UWCwKKwlETUFDSF9VQVJUNV9SWCwKKwlETUFDSF9VQVJUNV9UWCwKKwlETUFDSF9VU0lfUlgsCisJRE1BQ0hfVVNJX1RYLAorCURNQUNIX0lSREEsCisJRE1BQ0hfSTJTMF9SWCwKKwlETUFDSF9JMlMwX1RYLAorCURNQUNIX0kyUzBTX1RYLAorCURNQUNIX0kyUzFfUlgsCisJRE1BQ0hfSTJTMV9UWCwKKwlETUFDSF9JMlMyX1JYLAorCURNQUNIX0kyUzJfVFgsCisJRE1BQ0hfU1BJMF9SWCwKKwlETUFDSF9TUEkwX1RYLAorCURNQUNIX1NQSTFfUlgsCisJRE1BQ0hfU1BJMV9UWCwKKwlETUFDSF9TUEkyX1JYLAorCURNQUNIX1NQSTJfVFgsCisJRE1BQ0hfQUM5N19NSUNJTiwKKwlETUFDSF9BQzk3X1BDTUlOLAorCURNQUNIX0FDOTdfUENNT1VULAorCURNQUNIX0VYVEVSTkFMLAorCURNQUNIX1BXTSwKKwlETUFDSF9TUERJRiwKKwlETUFDSF9IU0lfUlgsCisJRE1BQ0hfSFNJX1RYLAorCURNQUNIX1BDTTBfVFgsCisJRE1BQ0hfUENNMF9SWCwKKwlETUFDSF9QQ00xX1RYLAorCURNQUNIX1BDTTFfUlgsCisJRE1BQ0hfUENNMl9UWCwKKwlETUFDSF9QQ00yX1JYLAorCURNQUNIX01TTV9SRVEzLAorCURNQUNIX01TTV9SRVEyLAorCURNQUNIX01TTV9SRVExLAorCURNQUNIX01TTV9SRVEwLAorCURNQUNIX1NMSU1CVVMwX1JYLAorCURNQUNIX1NMSU1CVVMwX1RYLAorCURNQUNIX1NMSU1CVVMwQVVYX1JYLAorCURNQUNIX1NMSU1CVVMwQVVYX1RYLAorCURNQUNIX1NMSU1CVVMxX1JYLAorCURNQUNIX1NMSU1CVVMxX1RYLAorCURNQUNIX1NMSU1CVVMyX1JYLAorCURNQUNIX1NMSU1CVVMyX1RYLAorCURNQUNIX1NMSU1CVVMzX1JYLAorCURNQUNIX1NMSU1CVVMzX1RYLAorCURNQUNIX1NMSU1CVVM0X1JYLAorCURNQUNIX1NMSU1CVVM0X1RYLAorCURNQUNIX1NMSU1CVVM1X1JYLAorCURNQUNIX1NMSU1CVVM1X1RYLAorCS8qIEVORCBNYXJrZXIsIGFsc28gdXNlZCB0byBkZW5vdGUgYSByZXNlcnZlZCBjaGFubmVsICovCisJRE1BQ0hfTUFYLAorfTsKKworc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCB7CisJY2hhcgkqbmFtZTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzYW1zdW5nX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHNhbXN1bmdfZG1hX2lzX2RtYWRldih2b2lkKQoreworCXJldHVybiB0cnVlOworfQorCisjaW5jbHVkZSA8cGxhdC9kbWEtb3BzLmg+CisKKyNlbmRpZgkvKiBfX0RNQV9QTDMzMF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtczNjMjR4eC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEtczNjMjR4eC5oCmluZGV4IDMzNmQ1YWMuLjFjMWVkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLXMzYzI0eHguaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS1zM2MyNHh4LmgKQEAgLTE4LDExICsxOCw2IEBACiAjZGVmaW5lIERNQV9DSF9WQUxJRAkJKDE8PDMxKQogI2RlZmluZSBETUFfQ0hfTkVWRVIJCSgxPDwzMCkKIAotc3RydWN0IHMzYzI0eHhfZG1hX2FkZHIgewotCXVuc2lnbmVkIGxvbmcJCWZyb207Ci0JdW5zaWduZWQgbG9uZwkJdG87Ci19OwotCiAvKiBzdHJ1Y3QgczNjMjR4eF9kbWFfbWFwCiAgKgogICogdGhpcyBob2xkcyB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNoYW5uZWwgc2VsZWN0ZWQKQEAgLTMxLDcgKzI2LDYgQEAKIAogc3RydWN0IHMzYzI0eHhfZG1hX21hcCB7CiAJY29uc3QgY2hhcgkJKm5hbWU7Ci0Jc3RydWN0IHMzYzI0eHhfZG1hX2FkZHIgIGh3X2FkZHI7CiAKIAl1bnNpZ25lZCBsb25nCQkgY2hhbm5lbHNbUzNDX0RNQV9DSEFOTkVMU107CiAJdW5zaWduZWQgbG9uZwkJIGNoYW5uZWxzX3J4W1MzQ19ETUFfQ0hBTk5FTFNdOwpAQCAtNDcsNyArNDEsNyBAQAogCiAJdm9pZAkoKmRpcmVjdGlvbikoc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW4sCiAJCQkgICAgIHN0cnVjdCBzM2MyNHh4X2RtYV9tYXAgKm1hcCwKLQkJCSAgICAgZW51bSBzM2MyNDEwX2RtYXNyYyBkaXIpOworCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOwogfTsKIAogZXh0ZXJuIGludCBzM2MyNHh4X2RtYV9pbml0X21hcChzdHJ1Y3QgczNjMjR4eF9kbWFfc2VsZWN0aW9uICpzZWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZG1hLmgKaW5kZXggOGMyNzNiNy4uYjkwNjExMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kbWEuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RtYS5oCkBAIC0xMCwxNyArMTAsMTQgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKIGVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCB7CiAJUzNDMjQxMF9SRVNfT0ssCiAJUzNDMjQxMF9SRVNfRVJSLAogCVMzQzI0MTBfUkVTX0FCT1JUCiB9OwogCi1lbnVtIHMzYzI0MTBfZG1hc3JjIHsKLQlTM0MyNDEwX0RNQVNSQ19IVywJCS8qIHNvdXJjZSBpcyBtZW1vcnkgKi8KLQlTM0MyNDEwX0RNQVNSQ19NRU0JCS8qIHNvdXJjZSBpcyBoYXJkd2FyZSAqLwotfTsKLQogLyogZW51bSBzM2MyNDEwX2NoYW5fb3AKICAqCiAgKiBvcGVyYXRpb24gY29kZXMgcGFzc2VkIHRvIHRoZSBETUEgY29kZSBieSB0aGUgdXNlciwgYW5kIGFsc28gdXNlZApAQCAtMTEyLDcgKzEwOSw3IEBACiAqLwogCiBleHRlcm4gaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhlbnVtIGRtYV9jaCBjaGFubmVsLAotCQllbnVtIHMzYzI0MTBfZG1hc3JjIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXZhZGRyKTsKKwkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gc291cmNlLCB1bnNpZ25lZCBsb25nIGRldmFkZHIpOwogCiAvKiBzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbgogICoKQEAgLTEyNiwzICsxMjMsNCBAQAogZXh0ZXJuIGludCBzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4oZW51bSBkbWFfY2gsIHMzYzI0MTBfZG1hX2NiZm5fdCBydG4pOwogCiAKKyNpbmNsdWRlIDxwbGF0L2RtYS1vcHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZWhjaS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9laGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZWhjaS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcjogSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19FSENJX0gKKyNkZWZpbmUgX19QTEFUX1NBTVNVTkdfRUhDSV9IIF9fRklMRV9fCisKK3N0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSB7CisJaW50ICgqcGh5X2luaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB0eXBlKTsKKwlpbnQgKCpwaHlfZXhpdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOworfTsKKworZXh0ZXJuIHZvaWQgczVwX2VoY2lfc2V0X3BsYXRkYXRhKHN0cnVjdCBzNXBfZWhjaV9wbGF0ZGF0YSAqcGQpOworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfRUhDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2V4eW5vczQuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZXh5bm9zNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NDZlODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2V4eW5vczQuaApAQCAtMCwwICsxLDM1IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2V4eW5vczQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEhlYWRlciBmaWxlIGZvciBleHlub3M0IGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIENvbW1vbiBpbml0IGNvZGUgZm9yIEVYWU5PUzQgcmVsYXRlZCBTb0NzICovCisKK2V4dGVybiB2b2lkIGV4eW5vczRfY29tbW9uX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworZXh0ZXJuIHZvaWQgZXh5bm9zNF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBleHlub3M0MjEwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIGV4eW5vczQyMTJfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgZXh5bm9zNF9zZXR1cF9jbG9ja3Modm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9FWFlOT1MKK2V4dGVybiAgaW50IGV4eW5vc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZXh5bm9zNF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIGV4eW5vczRfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgZXh5bm9zNF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBleHlub3M0X3RpbWVyOworCisjZGVmaW5lIGV4eW5vczRfaW5pdF91YXJ0cyBleHlub3M0X2NvbW1vbl9pbml0X3VhcnRzCisKKyNlbHNlCisjZGVmaW5lIGV4eW5vczRfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBleHlub3M0X2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBleHlub3M0X21hcF9pbyBOVUxMCisjZGVmaW5lIGV4eW5vc19pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi1zM2MyNDEwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZiLXMzYzI0MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVkOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi1zM2MyNDEwLmgKQEAgLTAsMCArMSw3MiBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi1zM2MyNDEwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCisgKiBJbnNwaXJlZCBieSBweGFmYi5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fUExBVF9GQl9TM0MyNDEwX0gKKyNkZWZpbmUgX19BU01fUExBVF9GQl9TM0MyNDEwX0ggX19GSUxFX18KKworc3RydWN0IHMzYzI0MTBmYl9odyB7CisJdW5zaWduZWQgbG9uZwlsY2Rjb24xOworCXVuc2lnbmVkIGxvbmcJbGNkY29uMjsKKwl1bnNpZ25lZCBsb25nCWxjZGNvbjM7CisJdW5zaWduZWQgbG9uZwlsY2Rjb240OworCXVuc2lnbmVkIGxvbmcJbGNkY29uNTsKK307CisKKy8qIExDRCBkZXNjcmlwdGlvbiAqLworc3RydWN0IHMzYzI0MTBmYl9kaXNwbGF5IHsKKwkvKiBMQ0QgdHlwZSAqLworCXVuc2lnbmVkIHR5cGU7CisKKwkvKiBTY3JlZW4gc2l6ZSAqLworCXVuc2lnbmVkIHNob3J0IHdpZHRoOworCXVuc2lnbmVkIHNob3J0IGhlaWdodDsKKworCS8qIFNjcmVlbiBpbmZvICovCisJdW5zaWduZWQgc2hvcnQgeHJlczsKKwl1bnNpZ25lZCBzaG9ydCB5cmVzOworCXVuc2lnbmVkIHNob3J0IGJwcDsKKworCXVuc2lnbmVkIHBpeGNsb2NrOwkJLyogcGl4Y2xvY2sgaW4gcGljb3NlY29uZHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBsZWZ0X21hcmdpbjsgIC8qIHZhbHVlIGluIHBpeGVscyAoVEZUKSBvciBIQ0xLcyAoU1ROKSAqLworCXVuc2lnbmVkIHNob3J0IHJpZ2h0X21hcmdpbjsgLyogdmFsdWUgaW4gcGl4ZWxzIChURlQpIG9yIEhDTEtzIChTVE4pICovCisJdW5zaWduZWQgc2hvcnQgaHN5bmNfbGVuOyAgICAvKiB2YWx1ZSBpbiBwaXhlbHMgKFRGVCkgb3IgSENMS3MgKFNUTikgKi8KKwl1bnNpZ25lZCBzaG9ydCB1cHBlcl9tYXJnaW47CS8qIHZhbHVlIGluIGxpbmVzIChURlQpIG9yIDAgKFNUTikgKi8KKwl1bnNpZ25lZCBzaG9ydCBsb3dlcl9tYXJnaW47CS8qIHZhbHVlIGluIGxpbmVzIChURlQpIG9yIDAgKFNUTikgKi8KKwl1bnNpZ25lZCBzaG9ydCB2c3luY19sZW47CS8qIHZhbHVlIGluIGxpbmVzIChURlQpIG9yIDAgKFNUTikgKi8KKworCS8qIGxjZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcJbGNkY29uNTsKK307CisKK3N0cnVjdCBzM2MyNDEwZmJfbWFjaF9pbmZvIHsKKworCXN0cnVjdCBzM2MyNDEwZmJfZGlzcGxheSAqZGlzcGxheXM7CS8qIGF0dGFjaGVkIGRpcGxheXMgaW5mbyAqLworCXVuc2lnbmVkIG51bV9kaXNwbGF5czsJCQkvKiBudW1iZXIgb2YgZGVmaW5lZCBkaXNwbGF5cyAqLworCXVuc2lnbmVkIGRlZmF1bHRfZGlzcGxheTsKKworCS8qIEdQSU9zICovCisKKwl1bnNpZ25lZCBsb25nCWdwY3VwOworCXVuc2lnbmVkIGxvbmcJZ3BjdXBfbWFzazsKKwl1bnNpZ25lZCBsb25nCWdwY2NvbjsKKwl1bnNpZ25lZCBsb25nCWdwY2Nvbl9tYXNrOworCXVuc2lnbmVkIGxvbmcJZ3BkdXA7CisJdW5zaWduZWQgbG9uZwlncGR1cF9tYXNrOworCXVuc2lnbmVkIGxvbmcJZ3BkY29uOworCXVuc2lnbmVkIGxvbmcJZ3BkY29uX21hc2s7CisKKwkvKiBscGMzNjAwIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nCWxwY3NlbDsKK307CisKK2V4dGVybiB2b2lkIF9faW5pdCBzM2MyNHh4X2ZiX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMGZiX21hY2hfaW5mbyAqKTsKKworI2VuZGlmIC8qIF9fQVNNX1BMQVRfRkJfUzNDMjQxMF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZiLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZiLmgKaW5kZXggMDFmMTBlNC4uMGZlZGY0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9mYi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmIuaApAQCAtMTA5LDQgKzEwOSwxMSBAQAogICovCiBleHRlcm4gdm9pZCBleHlub3M0X2ZpbWQwX2dwaW9fc2V0dXBfMjRicHAodm9pZCk7CiAKKy8qKgorICogczVwNjR4MF9mYl9ncGlvX3NldHVwXzI0YnBwKCkgLSBTNVA2NDQwL1M1UDY0NTAgc2V0dXAgZnVuY3Rpb24gZm9yIDI0YnBwIExDRAorICoKKyAqIEluaXRpYWxpc2UgdGhlIEdQSU8gZm9yIGFuIDI0YnBwIExDRCBkaXNwbGF5IG9uIHRoZSBSR0IgaW50ZXJmYWNlLgorICovCitleHRlcm4gdm9pZCBzNXA2NHgwX2ZiX2dwaW9fc2V0dXBfMjRicHAodm9pZCk7CisKICNlbmRpZiAvKiBfX1BMQVRfUzNDX0ZCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmlxLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZpcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWQwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2ZpcS5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZmlxLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIFMzQzI0WFggQ1BVIEZJUSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKK2V4dGVybiBpbnQgczNjMjR4eF9zZXRfZmlxKHVuc2lnbmVkIGludCBpcnEsIGJvb2wgb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy1oZWxwZXJzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaAppbmRleCA5YTRlNTNkLi5hMTgxZDdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaApAQCAtMSwxMSArMSwxMSBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zM2MvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLWhlbHBlci5oCisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLWhlbHBlci5oCiAgKgogICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KICAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwogICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KICAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCi0gKiBTM0MgUGxhdGZvcm0gLSBHUElPIHBpbiBjb25maWd1cmF0aW9uIGhlbHBlciBkZWZpbml0aW9ucworICogU2Ftc3VuZyBQbGF0Zm9ybSAtIEdQSU8gcGluIGNvbmZpZ3VyYXRpb24gaGVscGVyIGRlZmluaXRpb25zCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0yNCwxMjAgKzI0LDMwIEBACiAgKiBieSBkaXNhYmxpbmcgaW50ZXJydXB0cy4KICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHMzY19ncGlvX2RvX3NldGNmZyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjb25maWcpCitzdGF0aWMgaW5saW5lIGludCBzYW1zdW5nX2dwaW9fZG9fc2V0Y2ZnKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBjb25maWcpCiB7CiAJcmV0dXJuIChjaGlwLT5jb25maWctPnNldF9jb25maWcpKGNoaXAsIG9mZiwgY29uZmlnKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzM2NfZ3Bpb19kb19nZXRjZmcoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgdW5zaWduZWQgaW50IG9mZikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2Ftc3VuZ19ncGlvX2RvX2dldGNmZyhzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYpCiB7CiAJcmV0dXJuIChjaGlwLT5jb25maWctPmdldF9jb25maWcpKGNoaXAsIG9mZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHMzY19ncGlvX2RvX3NldHB1bGwoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IG9mZiwgczNjX2dwaW9fcHVsbF90IHB1bGwpCitzdGF0aWMgaW5saW5lIGludCBzYW1zdW5nX2dwaW9fZG9fc2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSAgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQogewogCXJldHVybiAoY2hpcC0+Y29uZmlnLT5zZXRfcHVsbCkoY2hpcCwgb2ZmLCBwdWxsKTsKIH0KIAotc3RhdGljIGlubGluZSBzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZG9fZ2V0cHVsbChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJCSAgdW5zaWduZWQgaW50IG9mZikKK3N0YXRpYyBpbmxpbmUgc2Ftc3VuZ19ncGlvX3B1bGxfdCBzYW1zdW5nX2dwaW9fZG9fZ2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQgb2ZmKQogewogCXJldHVybiBjaGlwLT5jb25maWctPmdldF9wdWxsKGNoaXAsIG9mZik7CiB9CiAKLS8qKgotICogczNjX2dwaW9fc2V0Y2ZnX3MzYzI0eHggLSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbi4KLSAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KLSAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCi0gKgotICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyCi0gKiBoYXMgdHdvIGJpdHMgb2YgY29uZmlndXJhdGlvbiBwZXIgZ3Bpbywgd2hpY2ggaGF2ZSB0aGUgZm9sbG93aW5nCi0gKiBmdW5jdGlvbnM6Ci0gKgkwMCA9IGlucHV0Ci0gKgkwMSA9IG91dHB1dAotICoJMXggPSBzcGVjaWFsIGZ1bmN0aW9uCi0qLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKTsKLQotLyoqCi0gKiBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eCAtIFMzQzI0WFggc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uIHJlYWQuCi0gKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgotICoKLSAqIFRoZSByZXZlcnNlIG9mIHMzY19ncGlvX3NldGNmZ19zM2MyNHh4KCkuIFdpbGwgcmV0dXJuIGEgdmFsdWUgd2hpY2cKLSAqIGNvdWxkIGJlIGRpcmVjdGx5IHBhc3NlZCBiYWNrIHRvIHMzY19ncGlvX3NldGNmZ19zM2MyNHh4KCksIGZyb20gdGhlCi0gKiBTM0NfR1BJT19TUEVDSUFMKCkgbWFjcm8uCi0gKi8KLXVuc2lnbmVkIGludCBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpOwotCi0vKioKLSAqIHMzY19ncGlvX3NldGNmZ19zM2MyNHh4X2EgLSBTM0MyNFhYIHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbiAoQmFuayBBKQotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KLSAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KLSAqCi0gKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIKLSAqIGhhcyBvbmUgYml0IG9mIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBncGlvLCB3aGVyZSBzZXR0aW5nIHRoZSBiaXQKLSAqIG1lYW5zIHRoZSBwaW4gaXMgaW4gc3BlY2lhbCBmdW5jdGlvbiBtb2RlIGFuZCB1bnNldCBtZWFucyBvdXRwdXQuCi0qLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZyk7Ci0KLQotLyoqCi0gKiBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eF9hIC0gUzNDMjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24gcmVhZCAoQmFuayBBKQotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KLSAqCi0gKiBUaGUgcmV2ZXJzZSBvZiBzM2NfZ3Bpb19zZXRjZmdfczNjMjR4eF9hKCkgdHVybmluZyBhbiBHUElPIGludG8gYSB1c2FibGUKLSAqIEdQSU8gY29uZmlndXJhdGlvbiB2YWx1ZS4KLSAqCi0gKiBAc2EgczNjX2dwaW9fZ2V0Y2ZnX3MzYzI0eHgKLSAqIEBzYSBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0Ci0gKi8KLWV4dGVybiB1bnNpZ25lZCBzM2NfZ3Bpb19nZXRjZmdfczNjMjR4eF9hKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgIHVuc2lnbmVkIGludCBvZmYpOwotCi0vKioKLSAqIHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQgLSBTM0M2NFhYIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnLgotICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgotICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KLSAqIEBjZmc6IFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHRvIHNldC4KLSAqCi0gKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIDQgYml0cwotICogb2YgY29udHJvbCBwZXIgR1BJTywgZ2VuZXJhbGx5IGluIHRoZSBmb3JtIG9mOgotICoJMDAwMCA9IElucHV0Ci0gKgkwMDAxID0gT3V0cHV0Ci0gKglvdGhlcnMgPSBTcGVjaWFsIGZ1bmN0aW9ucyAoZGVwZW5kZW50IG9uIGJhbmspCi0gKgotICogTm90ZSwgc2luY2UgdGhlIGNvZGUgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSB0d28gY29udHJvbAotICogcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb25lLCB3ZSBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHNldCBvZiBmdW5jdGlvbnMgZm9yCi0gKiBlYWNoIGNhc2UuCi0qLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQl1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKTsKLQotCi0vKioKLSAqIHMzY19ncGlvX2dldGNmZ19zM2M2NHh4XzRiaXQgLSBTM0M2NFhYIDRiaXQgc2luZ2xlIHJlZ2lzdGVyIEdQSU8gY29uZmlnIHJlYWQuCi0gKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgotICoKLSAqIFRoZSByZXZlcnNlIG9mIHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQoKSwgdHVybmluZyBhIGdwaW8gY29uZmlndXJhdGlvbgotICogcmVnaXN0ZXIgc2V0dGluZyBpbnRvIGEgdmFsdWUgdGhlIHNvZnR3YXJlIGNhbiB1c2UsIHN1Y2ggYXMgY291bGQgYmUgcGFzc2VkCi0gKiB0byBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0KCkuCi0gKgotICogQHNhIHMzY19ncGlvX2dldGNmZ19zM2MyNHh4Ci0gKi8KLWV4dGVybiB1bnNpZ25lZCBzM2NfZ3Bpb19nZXRjZmdfczNjNjR4eF80Yml0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpOwotCiAvKiBQdWxsLXt1cCxkb3dufSByZXNpc3RvciBjb250cm9scy4KICAqCiAgKiBTM0MyNDEwLFMzQzI0NDAgPSBQdWxsLVVQLApAQCAtMTQ3LDcgKzU3LDcgQEAKICAqLwogCiAvKioKLSAqIHMzY19ncGlvX3NldHB1bGxfMXVwKCkgLSBQdWxsIGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCBvciBub25lLgorICogczNjMjR4eF9ncGlvX3NldHB1bGxfMXVwKCkgLSBQdWxsIGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCBvciBub25lLgogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgogICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KICAqIEBwYXJhbTogcHVsbDogVGhlIHB1bGwgbW9kZSBiZWluZyByZXF1ZXN0ZWQuCkBAIC0xNTUsMTEgKzY1LDExIEBACiAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIEdQSU9zIHdpdGggb25lCiAgKiBiaXQgY29uZmlndXJpbmcgdGhlIHByZXNlbmNlIG9mIGEgcHVsbC11cCByZXNpc3Rvci4KICAqLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRwdWxsXzF1cChzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQl1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CitleHRlcm4gaW50IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCk7CiAKIC8qKgotICogczNjX2dwaW9fc2V0cHVsbF8xZG93bigpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgZG93biBvciBub25lCisgKiBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xZG93bigpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgZG93biBvciBub25lCiAgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQKICAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQKICAqIEBwYXJhbTogcHVsbDogVGhlIHB1bGwgbW9kZSBiZWluZyByZXF1ZXN0ZWQKQEAgLTE2NywxMSArNzcsMTMgQEAKICAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgR1BJT3Mgd2l0aCBvbmUKICAqIGJpdCBjb25maWd1cmluZyB0aGUgcHJlc2VuY2Ugb2YgYSBwdWxsLWRvd24gcmVzaXN0b3IuCiAgKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbF8xZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgIHVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKK2V4dGVybiBpbnQgczNjMjR4eF9ncGlvX3NldHB1bGxfMWRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCk7CiAKIC8qKgotICogczNjX2dwaW9fc2V0cHVsbF91cG93bigpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAsIGRvd24gb3Igbm9uZQorICogc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBvd24oKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwLAorICogZG93biBvciBub25lCisgKgogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgogICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KICAqIEBwYXJhbTogcHVsbDogVGhlIHB1bGwgbW9kZSBiZWluZyByZXF1ZXN0ZWQuCkBAIC0xODMsNDUgKzk1LDQ2IEBACiAgKgkwMSA9IFB1bGwtdXAgcmVzaXN0b3IgY29ubmVjdGVkCiAgKgkxMCA9IFB1bGwtZG93biByZXNpc3RvciBjb25uZWN0ZWQKICAqLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRwdWxsX3VwZG93bihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7Ci0KK2V4dGVybiBpbnQgc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKTsKIAogLyoqCi0gKiBzM2NfZ3Bpb19nZXRwdWxsX3VwZG93bigpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCwgZG93biBvciBub25lCisgKiBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd24oKSAtIEdldCBjb25maWd1cmF0aW9uIGZvciBjaG9pY2Ugb2YgdXAsCisgKiBkb3duIG9yIG5vbmUKKyAqCiAgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IHRoZSBHUElPIHBpbiBiZWxvbmdzIHRvCiAgKiBAb2ZmOiBUaGUgb2Zmc2V0IHRvIHRoZSBwaW4gdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uIG9mLgogICoKLSAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlYWRzIHRoZSBzdGF0ZSBvZiB0aGUgcHVsbC17dXAsZG93bn0gcmVzaXN0b3IgZm9yIHRoZQotICogZ2l2ZW4gR1BJTyBpbiB0aGUgc2FtZSBjYXNlIGFzIHMzY19ncGlvX3NldHB1bGxfdXBvd24uCisgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWFkcyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwte3VwLGRvd259IHJlc2lzdG9yCisgKiBmb3IgdGhlIGdpdmVuIEdQSU8gaW4gdGhlIHNhbWUgY2FzZSBhcyBzYW1zdW5nX2dwaW9fc2V0cHVsbF91cG93bi4KICovCi1leHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfdXBkb3duKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZik7CitleHRlcm4gc2Ftc3VuZ19ncGlvX3B1bGxfdCBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYpOwogCiAvKioKLSAqIHMzY19ncGlvX2dldHB1bGxfMXVwKCkgLSBHZXQgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIHVwIG9yIG5vbmUKKyAqIHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzF1cCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiB1cCBvciBub25lCiAgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IHRoZSBHUElPIHBpbiBiZWxvbmdzIHRvCiAgKiBAb2ZmOiBUaGUgb2Zmc2V0IHRvIHRoZSBwaW4gdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uIG9mLgogICoKICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlYWRzIHRoZSBzdGF0ZSBvZiB0aGUgcHVsbC11cCByZXNpc3RvciBmb3IgdGhlCi0gKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjX2dwaW9fc2V0cHVsbF8xdXAuCisgKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjMjR4eF9ncGlvX3NldHB1bGxfMXVwLgogKi8KLWV4dGVybiBzM2NfZ3Bpb19wdWxsX3QgczNjX2dwaW9fZ2V0cHVsbF8xdXAoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKK2V4dGVybiBzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzF1cChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IG9mZik7CiAKIC8qKgotICogczNjX2dwaW9fZ2V0cHVsbF8xZG93bigpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIGNob2ljZSBvZiBkb3duIG9yIG5vbmUKKyAqIHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzFkb3duKCkgLSBHZXQgY29uZmlndXJhdGlvbiBmb3IgY2hvaWNlIG9mIGRvd24gb3Igbm9uZQogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCB0aGUgR1BJTyBwaW4gYmVsb25ncyB0bwogICogQG9mZjogVGhlIG9mZnNldCB0byB0aGUgcGluIHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiBvZi4KICAqCiAgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWFkcyB0aGUgc3RhdGUgb2YgdGhlIHB1bGwtZG93biByZXNpc3RvciBmb3IgdGhlCi0gKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjX2dwaW9fc2V0cHVsbF8xZG93bi4KKyAqIGdpdmVuIEdQSU8gaW4gdGhlIHNhbWUgY2FzZSBhcyBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xZG93bi4KICovCi1leHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfMWRvd24oc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmKTsKK2V4dGVybiBzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzFkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmYpOwogCiAvKioKLSAqIHMzY19ncGlvX3NldHB1bGxfczNjMjQ0MygpIC0gUHVsbCBjb25maWd1cmF0aW9uIGZvciBzM2MyNDQzLgorICogczNjMjQ0M19ncGlvX3NldHB1bGwoKSAtIFB1bGwgY29uZmlndXJhdGlvbiBmb3IgczNjMjQ0My4KICAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KICAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCiAgKiBAcGFyYW06IHB1bGw6IFRoZSBwdWxsIG1vZGUgYmVpbmcgcmVxdWVzdGVkLgpAQCAtMjMzLDE5ICsxNDYsMTggQEAKICAqCTEwID0gUHVsbC1kb3duIHJlc2lzdG9yIGNvbm5lY3RlZAogICoJeDEgPSBObyBwdWxsIHVwIHJlc2lzdG9yCiAgKi8KLWV4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbF9zM2MyNDQzKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CitleHRlcm4gaW50IHMzYzI0NDNfZ3Bpb19zZXRwdWxsKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBpbnQgb2ZmLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCiAvKioKLSAqIHMzY19ncGlvX2dldHB1bGxfczNjMjQ0MygpIC0gR2V0IGNvbmZpZ3VyYXRpb24gZm9yIHMzYzI0NDMgcHVsbCByZXNpc3RvcnMKKyAqIHMzYzI0NDNfZ3Bpb19nZXRwdWxsKCkgLSBHZXQgY29uZmlndXJhdGlvbiBmb3IgczNjMjQ0MyBwdWxsIHJlc2lzdG9ycwogICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCB0aGUgR1BJTyBwaW4gYmVsb25ncyB0by4KICAqIEBvZmY6IFRoZSBvZmZzZXQgdG8gdGhlIHBpbiB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YuCiAgKgogICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVhZHMgdGhlIHN0YXRlIG9mIHRoZSBwdWxsLXt1cCxkb3dufSByZXNpc3RvciBmb3IgdGhlCi0gKiBnaXZlbiBHUElPIGluIHRoZSBzYW1lIGNhc2UgYXMgczNjX2dwaW9fc2V0cHVsbF91cG93bi4KKyAqIGdpdmVuIEdQSU8gaW4gdGhlIHNhbWUgY2FzZSBhcyBzYW1zdW5nX2dwaW9fc2V0cHVsbF91cG93bi4KICovCi1leHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGxfczNjMjQ0MyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKK2V4dGVybiBzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0NDNfZ3Bpb19nZXRwdWxsKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKIAkJCQkJCXVuc2lnbmVkIGludCBvZmYpOwogCiAjZW5kaWYgLyogX19QTEFUX0dQSU9fQ0ZHX0hFTFBFUlNfSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY2ZnLmgKaW5kZXggMTc2MmRjYi4uZDQ4MjQ1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNmZy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jZmcuaApAQCAtMjQsMTQgKzI0LDE0IEBACiAjaWZuZGVmIF9fUExBVF9HUElPX0NGR19ICiAjZGVmaW5lIF9fUExBVF9HUElPX0NGR19IIF9fRklMRV9fCiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IF9fYml0d2lzZV9fIHMzY19ncGlvX3B1bGxfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fYml0d2lzZV9fIHNhbXN1bmdfZ3Bpb19wdWxsX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBfX2JpdHdpc2VfXyBzNXBfZ3Bpb19kcnZzdHJfdDsKIAogLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBpZiBncGlvLWNvcmUuaCBoYXNuJ3QgYmVlbiBpbmNsdWRlZCAqLwotc3RydWN0IHMzY19ncGlvX2NoaXA7CitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXA7CiAKIC8qKgotICogc3RydWN0IHMzY19ncGlvX2NmZyBHUElPIGNvbmZpZ3VyYXRpb24KKyAqIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2ZnIEdQSU8gY29uZmlndXJhdGlvbgogICogQGNmZ19laW50OiBDb25maWd1cmF0aW9uIHNldHRpbmcgd2hlbiB1c2VkIGZvciBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlCiAgKiBAZ2V0X3B1bGw6IFJlYWQgdGhlIGN1cnJlbnQgcHVsbCBjb25maWd1cmF0aW9uIGZvciB0aGUgR1BJTwogICogQHNldF9wdWxsOiBTZXQgdGhlIGN1cnJlbnQgcHVsbCBjb25maWd1cmFpdG9uIGZvciB0aGUgR1BJTwpAQCAtNDQsMjAgKzQ0LDIwIEBACiAgKiBwZXItYmFuayBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRoYXQgb3RoZXIgc3lzdGVtcyBzdWNoIGFzIHRoZQogICogZXh0ZXJuYWwgaW50ZXJydXB0IGNvZGUgd2lsbCBuZWVkLgogICoKLSAqIEBzYSBzM2NfZ3Bpb19jZmdwaW4KKyAqIEBzYSBzYW1zdW5nX2dwaW9fY2ZncGluCiAgKiBAc2EgczNjX2dwaW9fZ2V0Y2ZnCiAgKiBAc2EgczNjX2dwaW9fc2V0cHVsbAogICogQHNhIHMzY19ncGlvX2dldHB1bGwKICAqLwotc3RydWN0IHMzY19ncGlvX2NmZyB7CitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyB7CiAJdW5zaWduZWQgaW50CWNmZ19laW50OwogCi0JczNjX2dwaW9fcHVsbF90CSgqZ2V0X3B1bGwpKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzKTsKLQlpbnQJCSgqc2V0X3B1bGwpKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzLAotCQkJCSAgICBzM2NfZ3Bpb19wdWxsX3QgcHVsbCk7CisJc2Ftc3VuZ19ncGlvX3B1bGxfdAkoKmdldF9wdWxsKShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnMpOworCWludAkJKCpzZXRfcHVsbCkoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzLAorCQkJCSAgICBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCi0JdW5zaWduZWQgKCpnZXRfY29uZmlnKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmcyk7Ci0JaW50CSAoKnNldF9jb25maWcpKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzLAorCXVuc2lnbmVkICgqZ2V0X2NvbmZpZykoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzKTsKKwlpbnQJICgqc2V0X2NvbmZpZykoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzLAogCQkJICAgICAgIHVuc2lnbmVkIGNvbmZpZyk7CiB9OwogCkBAIC02OSw3ICs2OSw3IEBACiAjZGVmaW5lIFMzQ19HUElPX09VVFBVVAkoUzNDX0dQSU9fU1BFQ0lBTCgxKSkKICNkZWZpbmUgUzNDX0dQSU9fU0ZOKHgpCShTM0NfR1BJT19TUEVDSUFMKHgpKQogCi0jZGVmaW5lIHMzY19ncGlvX2lzX2NmZ19zcGVjaWFsKF9jZmcpIFwKKyNkZWZpbmUgc2Ftc3VuZ19ncGlvX2lzX2NmZ19zcGVjaWFsKF9jZmcpIFwKIAkoKChfY2ZnKSAmIFMzQ19HUElPX1NQRUNJQUxfTUFSSykgPT0gUzNDX0dQSU9fU1BFQ0lBTF9NQVJLKQogCiAvKioKQEAgLTEyOCw5ICsxMjgsOSBAQAogICogdXAgb3IgZG93biBzZXR0aW5ncywgYW5kIGl0IG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIGNoaXAgdGhhdCBpcyBiZWluZwogICogdXNlZCB0byB3aGV0aGVyIHRoZSBwYXJ0aWN1bGFyIG1vZGUgaXMgYXZhaWxhYmxlLgogICovCi0jZGVmaW5lIFMzQ19HUElPX1BVTExfTk9ORQkoKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KTB4MDApCi0jZGVmaW5lIFMzQ19HUElPX1BVTExfRE9XTgkoKF9fZm9yY2UgczNjX2dwaW9fcHVsbF90KTB4MDEpCi0jZGVmaW5lIFMzQ19HUElPX1BVTExfVVAJKChfX2ZvcmNlIHMzY19ncGlvX3B1bGxfdCkweDAyKQorI2RlZmluZSBTM0NfR1BJT19QVUxMX05PTkUJKChfX2ZvcmNlIHNhbXN1bmdfZ3Bpb19wdWxsX3QpMHgwMCkKKyNkZWZpbmUgUzNDX0dQSU9fUFVMTF9ET1dOCSgoX19mb3JjZSBzYW1zdW5nX2dwaW9fcHVsbF90KTB4MDEpCisjZGVmaW5lIFMzQ19HUElPX1BVTExfVVAJKChfX2ZvcmNlIHNhbXN1bmdfZ3Bpb19wdWxsX3QpMHgwMikKIAogLyoqCiAgKiBzM2NfZ3Bpb19zZXRwdWxsKCkgLSBzZXQgdGhlIHN0YXRlIG9mIGEgZ3BpbyBwaW4gcHVsbCByZXNpc3RvcgpAQCAtMTQzLDcgKzE0Myw3IEBACiAgKgogICogQHB1bGwgaXMgb25lIG9mIFMzQ19HUElPX1BVTExfTk9ORSwgUzNDX0dQSU9fUFVMTF9ET1dOIG9yIFMzQ19HUElPX1BVTExfVVAuCiAqLwotZXh0ZXJuIGludCBzM2NfZ3Bpb19zZXRwdWxsKHVuc2lnbmVkIGludCBwaW4sIHMzY19ncGlvX3B1bGxfdCBwdWxsKTsKK2V4dGVybiBpbnQgczNjX2dwaW9fc2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCiAvKioKICAqIHMzY19ncGlvX2dldHB1bGwoKSAtIGdldCB0aGUgcHVsbCByZXNpc3RvciBzdGF0ZSBvZiBhIGdwaW8gcGluCkBAIC0xNTEsNyArMTUxLDcgQEAKICAqCiAgKiBSZWFkIHRoZSBwdWxsIHJlc2lzdG9yIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHBpbi4KICovCi1leHRlcm4gczNjX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGwodW5zaWduZWQgaW50IHBpbik7CitleHRlcm4gc2Ftc3VuZ19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsKHVuc2lnbmVkIGludCBwaW4pOwogCiAvKiBjb25maWd1cmUgYGFsbGAgYXNwZWN0cyBvZiBhbiBncGlvICovCiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogICogQHNhIHMzY19ncGlvX2NmZ3Bpbl9yYW5nZQogICovCiBleHRlcm4gaW50IHMzY19ncGlvX2NmZ2FsbF9yYW5nZSh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuciwKLQkJCQkgdW5zaWduZWQgaW50IGNmZywgczNjX2dwaW9fcHVsbF90IHB1bGwpOworCQkJCSB1bnNpZ25lZCBpbnQgY2ZnLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpOwogCiBzdGF0aWMgaW5saW5lIGludCBzM2NfZ3Bpb19jZmdyYW5nZV9ub3B1bGwodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHNpemUsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBjZmcpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY29yZS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWNvcmUuaAppbmRleCA4Y2FkNGNmLi4xZmU2OTE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2dwaW8tY29yZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1jb3JlLmgKQEAgLTI1LDIyICsyNSwyMiBAQAogICogc3BlY2lmaWMgY29kZS4KICovCiAKLXN0cnVjdCBzM2NfZ3Bpb19jaGlwOworc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwOwogCiAvKioKLSAqIHN0cnVjdCBzM2NfZ3Bpb19wbSAtIHBvd2VyIG1hbmFnZW1lbnQgKHN1c3BlbmQvcmVzdW1lKSBpbmZvcm1hdGlvbgorICogc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSAtIHBvd2VyIG1hbmFnZW1lbnQgKHN1c3BlbmQvcmVzdW1lKSBpbmZvcm1hdGlvbgogICogQHNhdmU6IFJvdXRpbmUgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIEdQSU8gYmxvY2sKICAqIEByZXN1bWU6IFJvdXRpbmUgdG8gcmVzdW1lIHRoZSBHUElPIGJsb2NrLgogICovCi1zdHJ1Y3QgczNjX2dwaW9fcG0gewotCXZvaWQgKCpzYXZlKShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCk7Ci0Jdm9pZCAoKnJlc3VtZSkoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApOworc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSB7CisJdm9pZCAoKnNhdmUpKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCk7CisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKTsKIH07CiAKLXN0cnVjdCBzM2NfZ3Bpb19jZmc7CitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZzsKIAogLyoqCi0gKiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAtIHdyYXBwZXIgZm9yIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGdwaW8KKyAqIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAtIHdyYXBwZXIgZm9yIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGdwaW8KICAqIEBjaGlwOiBUaGUgY2hpcCBzdHJ1Y3R1cmUgdG8gYmUgZXhwb3J0ZWQgdmlhIGdwaW9saWIuCiAgKiBAYmFzZTogVGhlIGJhc2UgcG9pbnRlciB0byB0aGUgZ3BpbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KICAqIEBncm91cDogVGhlIGdyb3VwIHJlZ2lzdGVyIG51bWJlciBmb3IgZ3BpbyBpbnRlcnJ1cHQgc3VwcG9ydC4KQEAgLTYwLDEwICs2MCwxMCBAQAogICogQ1BVIGNvcmVzIHRyeWluZyB0byBnZXQgb25lIGxvY2sgZm9yIGRpZmZlcmVudCBHUElPIGJhbmtzLCB3aGVyZSBlYWNoCiAgKiBiYW5rIG9mIEdQSU8gaGFzIGl0cyBvd24gcmVnaXN0ZXIgc3BhY2UgYW5kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgogICovCi1zdHJ1Y3QgczNjX2dwaW9fY2hpcCB7CitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgewogCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKLQlzdHJ1Y3QgczNjX2dwaW9fY2ZnCSpjb25maWc7Ci0Jc3RydWN0IHMzY19ncGlvX3BtCSpwbTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZwkqY29uZmlnOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fcG0JKnBtOwogCXZvaWQgX19pb21lbQkJKmJhc2U7CiAJaW50CQkJaXJxX2Jhc2U7CiAJaW50CQkJZ3JvdXA7CkBAIC03Myw1OCArNzMsMTEgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqdG9fczNjX2dwaW8oc3RydWN0IGdwaW9fY2hpcCAqZ3BjKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKnRvX3NhbXN1bmdfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpncGMpCiB7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihncGMsIHN0cnVjdCBzM2NfZ3Bpb19jaGlwLCBjaGlwKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKGdwYywgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwLCBjaGlwKTsKIH0KIAotLyoqIHMzY19ncGlvbGliX2FkZCgpIC0gYWRkIHRoZSBzM2Mgc3BlY2lmaWMgdmVyc2lvbiBvZiBhIGdwaW9fY2hpcC4KLSAqIEBjaGlwOiBUaGUgY2hpcCB0byByZWdpc3RlcgotICoKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGdwaW9jaGlwX2FkZCgpIHRoYXQgdGFrZXMgb3VyIHNwZWNpZmljIGdwaW8gY2hpcAotICogaW5mb3JtYXRpb24gYW5kIG1ha2VzIHRoZSBuZWNlc3NhcnkgYWx0ZXJhdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSBhbmQKLSAqIG5vdGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgdXNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtcyBhbmQgYW55Ci0gKiBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtLgotICovCi1leHRlcm4gdm9pZCBzM2NfZ3Bpb2xpYl9hZGQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApOwotCi0vKiBDT05GSUdfUzNDX0dQSU9fVFJBQ0sgZW5hYmxlcyB0aGUgdHJhY2tpbmcgb2YgdGhlIHMzYyBzcGVjaWZpYyBncGlvcwotICogZm9yIHVzZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGNhbGxzLCBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHMzYyBncGlvbGliCi0gKiBzdXBwb3J0IGNvZGUuCi0gKgotICogTm90IGFsbCBzM2Mgc3VwcG9ydCBjb2RlIHdpbGwgbmVlZCB0aGlzLCBhcyBzb21lIGNvbmZpZ3VyYXRpb25zIG9mIGNwdQotICogbWF5IG9ubHkgc3VwcG9ydCBvbmUgb3IgdHdvIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGhhdmUgYW4KLSAqIGVhc3kgZ3BpbyB0byBzM2NfZ3Bpb19jaGlwIG1hcHBpbmcgZnVuY3Rpb24uIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4KLSAqIHRoZSBtYWNoaW5lIHN1cHBvcnQgZmlsZSBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHMzY19ncGlvbGliX2dldGNoaXAoKQotICogYW5kIGFueSBvdGhlciBuZWNlc3NhcnkgZnVuY3Rpb25zLgotICovCi0KLS8qKgotICogc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzIC0gNGJpdCBzaW5nbGUgcmVnaXN0ZXIgR1BJTyBjb25maWcuCi0gKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKiBAbnJfY2hpcHM6IFRoZSBubyBvZiBjaGlwcyAoZ3BpbyBwb3J0cykgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCi0gKgotICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyA0IGJpdHMKLSAqIG9mIGNvbnRyb2wgcGVyIEdQSU8sIGdlbmVyYWxseSBpbiB0aGUgZm9ybSBvZjoKLSAqIDAwMDAgPSBJbnB1dAotICogMDAwMSA9IE91dHB1dAotICogb3RoZXJzID0gU3BlY2lhbCBmdW5jdGlvbnMgKGRlcGVuZGVudCBvbiBiYW5rKQotICoKLSAqIE5vdGUsIHNpbmNlIHRoZSBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgdHdvIGNvbnRyb2wKLSAqIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIG9uZSwgd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSBzZXQgb2YgZnVuY3Rpb24KLSAqIChzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKWZvciBlYWNoIGNhc2UuCi0gKi8KLWV4dGVybiB2b2lkIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwKLQkJCQkJICAgaW50IG5yX2NoaXBzKTsKLWV4dGVybiB2b2lkIHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDJfY2hpcHMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgICBpbnQgbnJfY2hpcHMpOwotZXh0ZXJuIHZvaWQgc2Ftc3VuZ19ncGlvbGliX2FkZF8yYml0X2NoaXBzKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICBpbnQgbnJfY2hpcHMpOwotCi1leHRlcm4gdm9pZCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApOwotZXh0ZXJuIHZvaWQgc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0MihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCk7Ci0KLQogLyoqCiAgKiBzYW1zdW5nX2dwaW9saWJfdG9faXJxIC0gY29udmVydCBncGlvIHBpbiB0byBpcnEgbnVtYmVyCiAgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IHRoZSBwaW4gYmVsb25ncyB0by4KQEAgLTEzNiwzNiArODksMzYgQEAKIGV4dGVybiBpbnQgc2Ftc3VuZ19ncGlvbGliX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKIAogLyogZXhwb3J0ZWQgZm9yIGNvcmUgU29DIHN1cHBvcnQgdG8gY2hhbmdlICovCi1leHRlcm4gc3RydWN0IHMzY19ncGlvX2NmZyBzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdDsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBzM2MyNHh4X2dwaW9jZmdfZGVmYXVsdDsKIAogI2lmZGVmIENPTkZJR19TM0NfR1BJT19UUkFDSwotZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpzM2NfZ3Bpb3NbUzNDX0dQSU9fRU5EXTsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKnMzY19ncGlvc1tTM0NfR1BJT19FTkRdOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpzM2NfZ3Bpb2xpYl9nZXRjaGlwKHVuc2lnbmVkIGludCBjaGlwKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKnNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHVuc2lnbmVkIGludCBjaGlwKQogewogCXJldHVybiAoY2hpcCA8IFMzQ19HUElPX0VORCkgPyBzM2NfZ3Bpb3NbY2hpcF0gOiBOVUxMOwogfQogI2Vsc2UKLS8qIG1hY2hpbmUgc3BlY2lmaWMgY29kZSBzaG91bGQgcHJvdmlkZSBzM2NfZ3Bpb2xpYl9nZXRjaGlwICovCisvKiBtYWNoaW5lIHNwZWNpZmljIGNvZGUgc2hvdWxkIHByb3ZpZGUgc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAgKi8KIAogI2luY2x1ZGUgPG1hY2gvZ3Bpby10cmFjay5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgczNjX2dwaW9saWJfdHJhY2soc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHMzY19ncGlvbGliX3RyYWNrKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkgeyB9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QTQotZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19wbSBzM2NfZ3Bpb19wbV8xYml0OwotZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19wbSBzM2NfZ3Bpb19wbV8yYml0OwotZXh0ZXJuIHN0cnVjdCBzM2NfZ3Bpb19wbSBzM2NfZ3Bpb19wbV80Yml0OworZXh0ZXJuIHN0cnVjdCBzYW1zdW5nX2dwaW9fcG0gc2Ftc3VuZ19ncGlvX3BtXzFiaXQ7CitleHRlcm4gc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSBzYW1zdW5nX2dwaW9fcG1fMmJpdDsKK2V4dGVybiBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtIHNhbXN1bmdfZ3Bpb19wbV80Yml0OwogI2RlZmluZSBfX2dwaW9fcG0oeCkgeAogI2Vsc2UKLSNkZWZpbmUgczNjX2dwaW9fcG1fMWJpdCBOVUxMCi0jZGVmaW5lIHMzY19ncGlvX3BtXzJiaXQgTlVMTAotI2RlZmluZSBzM2NfZ3Bpb19wbV80Yml0IE5VTEwKKyNkZWZpbmUgc2Ftc3VuZ19ncGlvX3BtXzFiaXQgTlVMTAorI2RlZmluZSBzYW1zdW5nX2dwaW9fcG1fMmJpdCBOVUxMCisjZGVmaW5lIHNhbXN1bmdfZ3Bpb19wbV80Yml0IE5VTEwKICNkZWZpbmUgX19ncGlvX3BtKHgpIE5VTEwKIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAvKiBsb2NraW5nIHdyYXBwZXJzIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBhY2Nlc3MgdG8gdGhlIHNhbWUgZ3BpbyBiYW5rICovCi0jZGVmaW5lIHMzY19ncGlvX2xvY2soX29jLCBfZmwpIHNwaW5fbG9ja19pcnFzYXZlKCYoX29jKS0+bG9jaywgX2ZsKQotI2RlZmluZSBzM2NfZ3Bpb191bmxvY2soX29jLCBfZmwpIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihfb2MpLT5sb2NrLCBfZmwpCisjZGVmaW5lIHNhbXN1bmdfZ3Bpb19sb2NrKF9vYywgX2ZsKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF9vYyktPmxvY2ssIF9mbCkKKyNkZWZpbmUgc2Ftc3VuZ19ncGlvX3VubG9jayhfb2MsIF9mbCkgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKF9vYyktPmxvY2ssIF9mbCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1mbnMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvZ3Bpby1mbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIxMzkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9ncGlvLWZucy5oCkBAIC0wLDAgKzEsOTggQEAKKy8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvZ3Bpby1mbnMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA5IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0MTAgLSBoYXJkd2FyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fTUFDSF9HUElPX0ZOU19ICisjZGVmaW5lIF9fTUFDSF9HUElPX0ZOU19IIF9fRklMRV9fCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHRvLWJlLXJlbW92ZWQgY2F0ZWdvcnkgYW5kIGl0IGlzIHN0cm9uZ2x5CisgKiBlbmNvdXJhZ2VkIG5vdCB0byB1c2UgdGhlc2UgaW4gbmV3IGNvZGUuIFRoZXkgd2lsbCBiZSBtYXJrZWQgZGVwcmVjYXRlZAorICogdmVyeSBzb29uLgorICoKKyAqIE1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGVpdGhlciByZXBsYWNlZCBieSB0aGUgZ3Bpb2NmZyBjYWxscworICogZm9yIHRoZSBzM2MgcGxhdGZvcm0gb3IgYnkgdGhlIGdlbmVyaWMgR1BJT2xpYiBBUEkuCisgKgorICogQXMgb2YgMi42LjM1LXJjLCB0aGVzZSB3aWxsIGJlIHJlbW92ZWQsIHdpdGggdGhlIGZldyBkcml2ZXJzIHVzaW5nIHRoZW0KKyAqIGVpdGhlciByZXBsYWNlZCBvciBnaXZlbiBhIHdyYXBwZXIgdW50aWwgdGhlIGNhbGxzIGNhbiBiZSByZW1vdmVkLgorKi8KKworI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTBfZ3Bpb19jZmdwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGNmZykKK3sKKwkvKiAxOjEgbWFwcGluZyBiZXR3ZWVuIGNmZ3BpbiBhbmQgc2V0Y2ZnIGNhbGxzIGF0IHRoZSBtb21lbnQgKi8KKwlzM2NfZ3Bpb19jZmdwaW4ocGluLCBjZmcpOworfQorCisvKiBleHRlcm5hbCBmdW5jdGlvbnMgZm9yIEdQSU8gc3VwcG9ydAorICoKKyAqIFRoZXNlIGFsbG93IHZhcmlvdXMgZGlmZmVyZW50IGNsaWVudHMgdG8gYWNjZXNzIHRoZSBzYW1lIEdQSU8KKyAqIHJlZ2lzdGVycyB3aXRob3V0IGNvbmZsaWN0aW5nLiBJZiB5b3VyIGRyaXZlciBvbmx5IG93bnMgdGhlIGVudGlyZQorICogR1BJTyByZWdpc3RlciwgdGhlbiBpdCBpcyBzYWZlIHRvIGlvcmVtYXAvX19yYXdfe3JlYWR8d3JpdGV9IHRvIGl0LgorKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0Y2ZnKHVuc2lnbmVkIGludCBwaW4pOworCisvKiBzM2MyNDEwX2dwaW9fZ2V0aXJxCisgKgorICogdHVybiB0aGUgZ2l2ZW4gcGluIG51bWJlciBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIElSUSBudW1iZXIKKyAqCisgKiByZXR1cm5zOgorICoJPCAwID0gbm8gaW50ZXJydXB0IGZvciB0aGlzIHBpbgorICoJPj0wID0gaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIHBpbgorKi8KKworZXh0ZXJuIGludCBzM2MyNDEwX2dwaW9fZ2V0aXJxKHVuc2lnbmVkIGludCBwaW4pOworCisvKiBzM2MyNDEwX2dwaW9faXJxZmlsdGVyCisgKgorICogc2V0IHRoZSBpcnEgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwaW4KKyAqCisgKiBvbiA9IDAgPT4gZGlzYWJsZSBmaWx0ZXJpbmcKKyAqICAgICAgMSA9PiBlbmFibGUgZmlsdGVyaW5nCisgKgorICogY29uZmlnID0gUzNDMjQxMF9FSU5URkxUX1BDTEsgb3IgUzNDMjQxMF9FSU5URkxUX0VYVENMSyBvcnJlZCB3aXRoCisgKiAgICAgICAgICB3aWR0aCBvZiBmaWx0ZXIgKDAgdGhyb3VnaCA2MykKKyAqCisgKgorKi8KKworZXh0ZXJuIGludCBzM2MyNDEwX2dwaW9faXJxZmlsdGVyKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGludCBvbiwKKwkJCQkgIHVuc2lnbmVkIGludCBjb25maWcpOworCisvKiBzM2MyNDEwX2dwaW9fcHVsbHVwCisgKgorICogVGhpcyBjYWxsIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHMzY19ncGlvX3NldHB1bGwoKS4KKyAqCisgKiBBcyBhIG5vdGUsIHRoZXJlIGlzIGN1cnJlbnRseSBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHB1bGwtdXAgYW5kIHB1bGwtZG93bgorICogaW4gdGhlIHMzYzI0eHggc2VyaWVzIGRldmljZXMgd2l0aCBvbmx5IGFuIG9uL29mZiBjb25maWd1cmF0aW9uLgorICovCisKKy8qIHMzYzI0MTBfZ3Bpb19wdWxsdXAKKyAqCisgKiBjb25maWd1cmUgdGhlIHB1bGwtdXAgY29udHJvbCBvbiB0aGUgZ2l2ZW4gcGluCisgKgorICogdG8gPSAxID0+IGRpc2FibGUgdGhlIHB1bGwtdXAKKyAqICAgICAgMCA9PiBlbmFibGUgdGhlIHB1bGwtdXAKKyAqCisgKiBlZzsKKyAqCisgKiAgIHMzYzI0MTBfZ3Bpb19wdWxsdXAoUzNDMjQxMF9HUEIoMCksIDApOworICogICBzM2MyNDEwX2dwaW9fcHVsbHVwKFMzQzI0MTBfR1BFKDgpLCAwKTsKKyovCisKK2V4dGVybiB2b2lkIHMzYzI0MTBfZ3Bpb19wdWxsdXAodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9ncGlvX3NldHBpbih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgdG8pOworCitleHRlcm4gdW5zaWduZWQgaW50IHMzYzI0MTBfZ3Bpb19nZXRwaW4odW5zaWduZWQgaW50IHBpbik7CisKKyNlbmRpZiAvKiBfX01BQ0hfR1BJT19GTlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9paWMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaWljLmgKaW5kZXggNTZiMDA1OS4uNTFkNTJlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9paWMuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lpYy5oCkBAIC02MCw2ICs2MCw3IEBACiBleHRlcm4gdm9pZCBzM2NfaTJjNV9zZXRfcGxhdGRhdGEoc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICppMmMpOwogZXh0ZXJuIHZvaWQgczNjX2kyYzZfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqaTJjKTsKIGV4dGVybiB2b2lkIHMzY19pMmM3X3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKmkyYyk7CitleHRlcm4gdm9pZCBzNXBfaTJjX2hkbWlwaHlfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqaTJjKTsKIAogLyogZGVmaW5lZCBieSBhcmNoaXRlY3R1cmUgdG8gY29uZmlndXJlIGdwaW8gKi8KIGV4dGVybiB2b2lkIHMzY19pMmMwX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lycS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFhODliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnEuaApAQCAtMCwwICsxLDExNiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9pcnEuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBTM0MyNFhYIENQVSBJUlEgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtaXJxLmg+CisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKworI2RlZmluZSBpcnFkYmYoeC4uLikKKyNkZWZpbmUgaXJxZGJmMih4Li4uKQorCisjZGVmaW5lIEVYVElOVF9PRkYgKElSUV9FSU5UNCAtIDQpCisKKy8qIHRoZXNlIGFyZSBleHBvcnRlZCBmb3IgYXJjaC9hcm0vbWFjaC0qIHVzYWdlICovCitleHRlcm4gc3RydWN0IGlycV9jaGlwIHMzY19pcnFfbGV2ZWxfY2hpcDsKK2V4dGVybiBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9jaGlwOworCitzdGF0aWMgaW5saW5lIHZvaWQgczNjX2lycXN1Yl9tYXNrKHVuc2lnbmVkIGludCBpcnFubywKKwkJCQkgICB1bnNpZ25lZCBpbnQgcGFyZW50Yml0LAorCQkJCSAgIGludCBzdWJjaGVjaykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBzdWJtYXNrOworCisJc3VibWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfSU5UU1VCTVNLKTsKKwltYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRNU0spOworCisJc3VibWFzayB8PSAoMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCkpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFzayB0aGUgcGFyZW50IElSUSAqLworCisJaWYgKChzdWJtYXNrICAmIHN1YmNoZWNrKSA9PSBzdWJjaGVjaykKKwkJX19yYXdfd3JpdGVsKG1hc2sgfCBwYXJlbnRiaXQsIFMzQzI0MTBfSU5UTVNLKTsKKworCS8qIHdyaXRlIGJhY2sgbWFza3MgKi8KKwlfX3Jhd193cml0ZWwoc3VibWFzaywgUzNDMjQxMF9JTlRTVUJNU0spOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2NfaXJxc3ViX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxbm8sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcGFyZW50Yml0KQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIHN1Ym1hc2s7CisKKwlzdWJtYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9JTlRTVUJNU0spOworCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0lOVE1TSyk7CisKKwlzdWJtYXNrICY9IH4oMVVMIDw8IChpcnFubyAtIElSUV9TM0NVQVJUX1JYMCkpOworCW1hc2sgJj0gfnBhcmVudGJpdDsKKworCS8qIHdyaXRlIGJhY2sgbWFza3MgKi8KKwlfX3Jhd193cml0ZWwoc3VibWFzaywgUzNDMjQxMF9JTlRTVUJNU0spOworCV9fcmF3X3dyaXRlbChtYXNrLCBTM0MyNDEwX0lOVE1TSyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHMzY19pcnFzdWJfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8sCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBhcmVudG1hc2ssCisJCQkJICAgICAgdW5zaWduZWQgaW50IGdyb3VwKQoreworCXVuc2lnbmVkIGludCBiaXQgPSAxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKTsKKworCXMzY19pcnFzdWJfbWFzayhpcnFubywgcGFyZW50bWFzaywgZ3JvdXApOworCisJX19yYXdfd3JpdGVsKGJpdCwgUzNDMjQxMF9TVUJTUkNQTkQpOworCisJLyogb25seSBhY2sgcGFyZW50IGlmIHdlJ3ZlIGdvdCBhbGwgdGhlIGlycXMgKHNlZW1zIHdlIG11c3QKKwkgKiBhY2ssIGFsbCBhbmQgaG9wZSB0aGF0IHRoZSBpcnEgc3lzdGVtIHJldHJpZ2dlcnMgb2sgd2hlbgorCSAqIHRoZSBpbnRlcnJ1cHQgZ29lcyBvZmYgYWdhaW4pCisJICovCisKKwlpZiAoMSkgeworCQlfX3Jhd193cml0ZWwocGFyZW50bWFzaywgUzNDMjQxMF9TUkNQTkQpOworCQlfX3Jhd193cml0ZWwocGFyZW50bWFzaywgUzNDMjQxMF9JTlRQTkQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzY19pcnFzdWJfYWNrKHVuc2lnbmVkIGludCBpcnFubywKKwkJCQkgIHVuc2lnbmVkIGludCBwYXJlbnRtYXNrLAorCQkJCSAgdW5zaWduZWQgaW50IGdyb3VwKQoreworCXVuc2lnbmVkIGludCBiaXQgPSAxVUwgPDwgKGlycW5vIC0gSVJRX1MzQ1VBUlRfUlgwKTsKKworCV9fcmF3X3dyaXRlbChiaXQsIFMzQzI0MTBfU1VCU1JDUE5EKTsKKworCS8qIG9ubHkgYWNrIHBhcmVudCBpZiB3ZSd2ZSBnb3QgYWxsIHRoZSBpcnFzIChzZWVtcyB3ZSBtdXN0CisJICogYWNrLCBhbGwgYW5kIGhvcGUgdGhhdCB0aGUgaXJxIHN5c3RlbSByZXRyaWdnZXJzIG9rIHdoZW4KKwkgKiB0aGUgaW50ZXJydXB0IGdvZXMgb2ZmIGFnYWluKQorCSAqLworCisJaWYgKDEpIHsKKwkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfU1JDUE5EKTsKKwkJX19yYXdfd3JpdGVsKHBhcmVudG1hc2ssIFMzQzI0MTBfSU5UUE5EKTsKKwl9Cit9CisKKy8qIGV4cG9ydGVkIGZvciB1c2UgaW4gYXJjaC9hcm0vbWFjaC1zM2MyNDEwICovCisKKyNpZmRlZiBDT05GSUdfUE0KK2V4dGVybiBpbnQgczNjX2lycV93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHN0YXRlKTsKKyNlbHNlCisjZGVmaW5lIHMzY19pcnFfd2FrZSBOVUxMCisjZW5kaWYKKworZXh0ZXJuIGludCBzM2NfaXJxZXh0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvaXJxcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDFhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lycXMuaApAQCAtMCwwICsxLDgwIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2lycXMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogUzVQIENvbW1vbiBJUlEgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX0lSUVNfSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19JUlFTX0ggX19GSUxFX18KKworLyogd2Uga2VlcCB0aGUgZmlyc3Qgc2V0IG9mIENQVSBJUlFzIG91dCBvZiB0aGUgcmFuZ2Ugb2YKKyAqIHRoZSBJU0Egc3BhY2UsIHNvIHRoYXQgdGhlIFBDMTA0IGhhcyB0aGVtIHRvIGl0c2VsZgorICogYW5kIHdlIGRvbid0IGVuZCB1cCBoYXZpbmcgdG8gZG8gaG9ycmlibGUgdGhpbmdzIHRvIHRoZQorICogc3RhbmRhcmQgSVNBIGRyaXZlcnMuLi4uCisgKgorICogbm90ZSwgc2luY2Ugd2UncmUgdXNpbmcgdGhlIFZJQ3MsIG91ciBzdGFydCBtdXN0IGJlIGEKKyAqIG11bGl0cGxlIG9mIDMyIHRvIGFsbG93IHRoZSBjb21tb24gY29kZSB0byB3b3JrCisgKi8KKworI2RlZmluZSBTNVBfSVJRX09GRlNFVAkJKDMyKQorCisjZGVmaW5lIFM1UF9JUlEoeCkJCSgoeCkgKyBTNVBfSVJRX09GRlNFVCkKKworI2RlZmluZSBTNVBfVklDMF9CQVNFCQlTNVBfSVJRKDApCisjZGVmaW5lIFM1UF9WSUMxX0JBU0UJCVM1UF9JUlEoMzIpCisjZGVmaW5lIFM1UF9WSUMyX0JBU0UJCVM1UF9JUlEoNjQpCisjZGVmaW5lIFM1UF9WSUMzX0JBU0UJCVM1UF9JUlEoOTYpCisKKyNkZWZpbmUgVklDX0JBU0UoeCkJCShTNVBfVklDMF9CQVNFICsgKCh4KSozMikpCisKKyNkZWZpbmUgSVJRX1ZJQzBfQkFTRQkJUzVQX1ZJQzBfQkFTRQorI2RlZmluZSBJUlFfVklDMV9CQVNFCQlTNVBfVklDMV9CQVNFCisjZGVmaW5lIElSUV9WSUMyX0JBU0UJCVM1UF9WSUMyX0JBU0UKKworLyogVklDIGJhc2VkIElSUXMgKi8KKworI2RlZmluZSBTNVBfSVJRX1ZJQzAoeCkJCShTNVBfVklDMF9CQVNFICsgKHgpKQorI2RlZmluZSBTNVBfSVJRX1ZJQzEoeCkJCShTNVBfVklDMV9CQVNFICsgKHgpKQorI2RlZmluZSBTNVBfSVJRX1ZJQzIoeCkJCShTNVBfVklDMl9CQVNFICsgKHgpKQorI2RlZmluZSBTNVBfSVJRX1ZJQzMoeCkJCShTNVBfVklDM19CQVNFICsgKHgpKQorCisjZGVmaW5lIFM1UF9USU1FUl9JUlEoeCkJKDExICsgKHgpKQorCisjZGVmaW5lIElSUV9USU1FUjAJCVM1UF9USU1FUl9JUlEoMCkKKyNkZWZpbmUgSVJRX1RJTUVSMQkJUzVQX1RJTUVSX0lSUSgxKQorI2RlZmluZSBJUlFfVElNRVIyCQlTNVBfVElNRVJfSVJRKDIpCisjZGVmaW5lIElSUV9USU1FUjMJCVM1UF9USU1FUl9JUlEoMykKKyNkZWZpbmUgSVJRX1RJTUVSNAkJUzVQX1RJTUVSX0lSUSg0KQorCisjZGVmaW5lIElSUV9FSU5UKHgpCQkoKHgpIDwgMTYgPyAoKHgpICsgUzVQX0VJTlRfQkFTRTEpIFwKKwkJCQkJOiAoKHgpIC0gMTYgKyBTNVBfRUlOVF9CQVNFMikpCisKKyNkZWZpbmUgRUlOVF9PRkZTRVQoaXJxKQkoKGlycSkgPCBTNVBfRUlOVF9CQVNFMiA/IFwKKwkJCQkJCSgoaXJxKSAtIFM1UF9FSU5UX0JBU0UxKSA6IFwKKwkJCQkJCSgoaXJxKSArIDE2IC0gUzVQX0VJTlRfQkFTRTIpKQorCisjZGVmaW5lIElSUV9FSU5UX0JJVCh4KQkJRUlOVF9PRkZTRVQoeCkKKworLyogVHlwaWNhbGx5IG9ubHkgYSBmZXcgZ3BpbyBjaGlwcyByZXF1aXJlIGdwaW8gaW50ZXJydXB0IHN1cHBvcnQuCisgICBUbyBhdm9pZCBtZW1vcnkgd2FzdGUgaXJxIGRlc2NyaXB0b3JzIGFyZSBhbGxvY2F0ZWQgb25seSBmb3IKKyAgIFM1UF9HUElPSU5UX0dST1VQX0NPVU5UIGNoaXBzLCBlYWNoIHdpdGggdG90YWwgbnVtYmVyIG9mCisgICBTNVBfR1BJT0lOVF9HUk9VUF9TSVpFIHBpbnMvaXJxcy4gRWFjaCBHUElPSU5UIGdyb3VwIGNhbiBiZSBhc3NpZ2VkCisgICB0byBhbnkgZ3BpbyBjaGlwIHdpdGggdGhlIHM1cF9yZWdpc3Rlcl9ncGlvX2ludGVycnVwdCgpIGZ1bmN0aW9uICovCisjZGVmaW5lIFM1UF9HUElPSU5UX0dST1VQX0NPVU5UIDQKKyNkZWZpbmUgUzVQX0dQSU9JTlRfR1JPVVBfU0laRQk4CisjZGVmaW5lIFM1UF9HUElPSU5UX0NPVU5UCShTNVBfR1BJT0lOVF9HUk9VUF9DT1VOVCAqIFM1UF9HUElPSU5UX0dST1VQX1NJWkUpCisKKy8qIElSUSB0eXBlcyBjb21tb24gZm9yIGFsbCBzNXAgcGxhdGZvcm1zICovCisjZGVmaW5lIFM1UF9JUlFfVFlQRV9MRVZFTF9MT1cJCSgweDAwKQorI2RlZmluZSBTNVBfSVJRX1RZUEVfTEVWRUxfSElHSAkJKDB4MDEpCisjZGVmaW5lIFM1UF9JUlFfVFlQRV9FREdFX0ZBTExJTkcJKDB4MDIpCisjZGVmaW5lIFM1UF9JUlFfVFlQRV9FREdFX1JJU0lORwkoMHgwMykKKyNkZWZpbmUgUzVQX0lSUV9UWVBFX0VER0VfQk9USAkJKDB4MDQpCisKKyNlbmRpZiAvKiBfX1BMQVRfU0FNU1VOR19JUlFTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXMzYy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tYXAtczNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwNDg3NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXMzYy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXMzYy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0WFggLSBNZW1vcnkgbWFwIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fUExBVF9NQVBfUzNDX0gKKyNkZWZpbmUgX19BU01fUExBVF9NQVBfUzNDX0ggX19GSUxFX18KKworI2RlZmluZSBTM0MyNFhYX1ZBX0lSUQkJUzNDX1ZBX0lSUQorI2RlZmluZSBTM0MyNFhYX1ZBX01FTUNUUkwJUzNDX1ZBX01FTQorI2RlZmluZSBTM0MyNFhYX1ZBX1VBUlQJCVMzQ19WQV9VQVJUCisKKyNkZWZpbmUgUzNDMjRYWF9WQV9USU1FUglTM0NfVkFfVElNRVIKKyNkZWZpbmUgUzNDMjRYWF9WQV9DTEtQV1IJUzNDX1ZBX1NZUworI2RlZmluZSBTM0MyNFhYX1ZBX1dBVENIRE9HCVMzQ19WQV9XQVRDSERPRworCisjZGVmaW5lIFMzQzI0MTJfVkFfU1NNQwkJUzNDX0FERFJfQ1BVKDB4MDAwMDAwMDApCisjZGVmaW5lIFMzQzI0MTJfVkFfRUJJCQlTM0NfQUREUl9DUFUoMHgwMDAxMDAwMCkKKworI2RlZmluZSBTM0MyNDEwX1BBX1VBUlQJCSgweDUwMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1BBX1VBUlQJCVMzQzI0MTBfUEFfVUFSVAorCisjaWZuZGVmIFMzQ19VQVJUX09GRlNFVAorI2RlZmluZSBTM0NfVUFSVF9PRkZTRVQJCSgweDQwMCkKKyNlbmRpZgorCisvKgorICogR1BJTyBwb3J0cworICoKKyAqIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIFZBIG9mIHRoaXMgbXVzdCBlbnN1cmUgdGhhdAorICogaXQgaXMgdGhlIHNhbWUgZGlzdGFuY2UgYXBhcnQgZnJvbSB0aGUgVUFSVCBpbiB0aGUKKyAqIHBoc3lpY2FsIGFkZHJlc3Mgc3BhY2UsIGFzIHRoZSBpbml0aWFsIG1hcHBpbmcgZm9yIHRoZSBJTworICogaXMgZG9uZSBhcyBhIDE6MSBtYXBwaW5nLiBUaGlzIHB1dHMgaXQgKGN1cnJlbnRseSkgYXQKKyAqIDB4RkE4MDAwMDAsIHdoaWNoIGlzIG5vdCBpbiB0aGUgd2F5IG9mIGFueSBjdXJyZW50IG1hcHBpbmcKKyAqIGJ5IHRoZSBiYXNlIHN5c3RlbS4KKyovCisKKyNkZWZpbmUgUzNDMjQxMF9QQV9HUElPCQkoMHg1NjAwMDAwMCkKKyNkZWZpbmUgUzNDMjRYWF9QQV9HUElPCQlTM0MyNDEwX1BBX0dQSU8KKworI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8JCSgoUzNDMjRYWF9QQV9HUElPIC0gUzNDMjRYWF9QQV9VQVJUKSArIFMzQzI0WFhfVkFfVUFSVCkKKyNkZWZpbmUgUzNDNjRYWF9WQV9HUElPCQlTM0NfQUREUl9DUFUoMHgwMDAwMDAwMCkKKworI2RlZmluZSBTM0M2NFhYX1ZBX01PREVNCVMzQ19BRERSX0NQVSgweDAwMTAwMDAwKQorI2RlZmluZSBTM0M2NFhYX1ZBX1VTQl9IU1BIWQlTM0NfQUREUl9DUFUoMHgwMDIwMDAwMCkKKworI2RlZmluZSBTM0NfVkFfVVNCX0hTUEhZCVMzQzY0WFhfVkFfVVNCX0hTUEhZCisKKy8qCisgKiBJU0Egc3R5bGUgSU8sIGZvciBlYWNoIG1hY2hpbmUgdG8gc29ydCBvdXQgbWFwcGluZ3MgZm9yLAorICogaWYgaXQgaW1wbGVtZW50cyBpdC4gV2UgcmVzZXJ2ZSB0d28gMTZNIHJlZ2lvbnMgZm9yIElTQS4KKyAqLworCisjZGVmaW5lIFMzQzI0MTBfQUREUih4KQkJUzNDX0FERFIoeCkKKworI2RlZmluZSBTM0MyNFhYX1ZBX0lTQV9XT1JECVMzQzI0MTBfQUREUigweDAyMDAwMDAwKQorI2RlZmluZSBTM0MyNFhYX1ZBX0lTQV9CWVRFCVMzQzI0MTBfQUREUigweDAzMDAwMDAwKQorCisvKiBkZWFsIHdpdGggdGhlIHJlZ2lzdGVycyB0aGF0IG1vdmUgdW5kZXIgdGhlIDI0MTIvMjQxMyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEzKQorI2lmbmRlZiBfX0FTU0VNQkxZX18KK2V4dGVybiB2b2lkIF9faW9tZW0gKnMzYzI0eHhfdmFfZ3BpbzI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTJfT05MWQorI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yCShTM0MyNFhYX1ZBX0dQSU8gKyAweDEwKQorI2Vsc2UKKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiBzM2MyNHh4X3ZhX2dwaW8yCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIHMzYzI0eHhfdmFfZ3BpbzIgUzNDMjRYWF9WQV9HUElPCisjZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgUzNDMjRYWF9WQV9HUElPCisjZW5kaWYKKworI2luY2x1ZGUgPHBsYXQvbWFwLXM1cC5oPgorCisjZW5kaWYgLyogX19BU01fUExBVF9NQVBfUzNDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tYXAtczVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkN2JkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWFwLXM1cC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBTNVAgLSBNZW1vcnkgbWFwIGRlZmluaXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19BU01fUExBVF9NQVBfUzVQX0gKKyNkZWZpbmUgX19BU01fUExBVF9NQVBfUzVQX0ggX19GSUxFX18KKworI2RlZmluZSBTNVBfVkFfQ0hJUElECQlTM0NfQUREUigweDAyMDAwMDAwKQorI2RlZmluZSBTNVBfVkFfQ01VCQlTM0NfQUREUigweDAyMTAwMDAwKQorI2RlZmluZSBTNVBfVkFfUE1VCQlTM0NfQUREUigweDAyMTgwMDAwKQorI2RlZmluZSBTNVBfVkFfR1BJTwkJUzNDX0FERFIoMHgwMjIwMDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0dQSU8xCQlTNVBfVkFfR1BJTworI2RlZmluZSBTNVBfVkFfR1BJTzIJCVMzQ19BRERSKDB4MDIyNDAwMDApCisjZGVmaW5lIFM1UF9WQV9HUElPMwkJUzNDX0FERFIoMHgwMjI4MDAwMCkKKworI2RlZmluZSBTNVBfVkFfU1lTUkFNCQlTM0NfQUREUigweDAyNDAwMDAwKQorI2RlZmluZSBTNVBfVkFfRE1DMAkJUzNDX0FERFIoMHgwMjQ0MDAwMCkKKyNkZWZpbmUgUzVQX1ZBX0RNQzEJCVMzQ19BRERSKDB4MDI0ODAwMDApCisjZGVmaW5lIFM1UF9WQV9TUk9NQwkJUzNDX0FERFIoMHgwMjRDMDAwMCkKKworI2RlZmluZSBTNVBfVkFfU1lTVElNRVIJCVMzQ19BRERSKDB4MDI1MDAwMDApCisjZGVmaW5lIFM1UF9WQV9MMkNDCQlTM0NfQUREUigweDAyNjAwMDAwKQorCisjZGVmaW5lIFM1UF9WQV9DT01CSU5FUl9CQVNFCVMzQ19BRERSKDB4MDI3MDAwMDApCisjZGVmaW5lIFM1UF9WQV9DT01CSU5FUih4KQkoUzVQX1ZBX0NPTUJJTkVSX0JBU0UgKyAoKHgpID4+IDIpICogMHgxMCkKKworI2RlZmluZSBTNVBfVkFfQ09SRVBFUklfQkFTRQlTM0NfQUREUigweDAyODAwMDAwKQorI2RlZmluZSBTNVBfVkFfQ09SRVBFUkkoeCkJKFM1UF9WQV9DT1JFUEVSSV9CQVNFICsgKHgpKQorI2RlZmluZSBTNVBfVkFfU0NVCQlTNVBfVkFfQ09SRVBFUkkoMHgwKQorI2RlZmluZSBTNVBfVkFfVFdECQlTNVBfVkFfQ09SRVBFUkkoMHg2MDApCisKKyNkZWZpbmUgUzVQX1ZBX0dJQ19DUFUJCVMzQ19BRERSKDB4MDI4MTAwMDApCisjZGVmaW5lIFM1UF9WQV9HSUNfRElTVAkJUzNDX0FERFIoMHgwMjgyMDAwMCkKKworI2RlZmluZSBWQV9WSUMoeCkJCShTM0NfVkFfSVJRICsgKCh4KSAqIDB4MTAwMDApKQorI2RlZmluZSBWQV9WSUMwCQkJVkFfVklDKDApCisjZGVmaW5lIFZBX1ZJQzEJCQlWQV9WSUMoMSkKKyNkZWZpbmUgVkFfVklDMgkJCVZBX1ZJQygyKQorI2RlZmluZSBWQV9WSUMzCQkJVkFfVklDKDMpCisKKyNkZWZpbmUgUzVQX1ZBX1VBUlQoeCkJCShTM0NfVkFfVUFSVCArICgoeCkgKiBTM0NfVUFSVF9PRkZTRVQpKQorI2RlZmluZSBTNVBfVkFfVUFSVDAJCVM1UF9WQV9VQVJUKDApCisjZGVmaW5lIFM1UF9WQV9VQVJUMQkJUzVQX1ZBX1VBUlQoMSkKKyNkZWZpbmUgUzVQX1ZBX1VBUlQyCQlTNVBfVkFfVUFSVCgyKQorI2RlZmluZSBTNVBfVkFfVUFSVDMJCVM1UF9WQV9VQVJUKDMpCisKKyNpZm5kZWYgUzNDX1VBUlRfT0ZGU0VUCisjZGVmaW5lIFMzQ19VQVJUX09GRlNFVAkJKDB4NDAwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxwbGF0L21hcC1zM2MuaD4KKworI2VuZGlmIC8qIF9fQVNNX1BMQVRfTUFQX1M1UF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21jaS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDJkMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tY2kuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9BUkNIX01DSV9ICisjZGVmaW5lIF9BUkNIX01DSV9ICisKKy8qKgorICogc3RydWN0IHMzYzI0eHhfbWNpX3BkYXRhIC0gc2QvbW1jIGNvbnRyb2xsZXIgcGxhdGZvcm0gZGF0YQorICogQG5vX3dwcm90ZWN0OiBTZXQgdGhpcyB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyB3cml0ZS1wcm90ZWN0IHN3aXRjaC4KKyAqIEBub19kZXRlY3Q6IFNldCB0aGlzIGlmIHRoZXJlIGlzIG5vIGRldGVjdCBzd2l0Y2guCisgKiBAd3Byb3RlY3RfaW52ZXJ0OiBJbnZlcnQgdGhlIGRlZmF1bHQgc2Vuc2Ugb2YgdGhlIHdyaXRlIHByb3RlY3Qgc3dpdGNoLgorICogQGRldGVjdF9pbnZlcnQ6IEludmVydCB0aGUgZGVmYXVsdCBzZW5zZSBvZiB0aGUgd3JpdGUgcHJvdGVjdCBzd2l0Y2guCisgKiBAdXNlX2RtYTogU2V0IHRvIGFsbG93IHRoZSB1c2Ugb2YgRE1BLgorICogQGdwaW9fZGV0ZWN0OiBHUElPIG51bWJlciBmb3IgdGhlIGNhcmQgZGV0ZWN0IGxpbmUuCisgKiBAZ3Bpb193cHJvdGVjdDogR1BJTyBudW1iZXIgZm9yIHRoZSB3cml0ZSBwcm90ZWN0IGxpbmUuCisgKiBAb2NyX2F2YWlsOiBUaGUgbWFzayBvZiB0aGUgYXZhaWxhYmxlIHBvd2VyIHN0YXRlcywgbm9uLXplcm8gdG8gdXNlLgorICogQHNldF9wb3dlcjogQ2FsbGJhY2sgdG8gY29udHJvbCB0aGUgcG93ZXIgbW9kZS4KKyAqCisgKiBUaGUgQGdwaW9fZGV0ZWN0IGlzIHVzZWQgZm9yIGNhcmQgZGV0ZWN0aW9uIHdoZW4gQG5vX3dwcm90ZWN0IGlzIHVuc2V0LAorICogYW5kIHRoZSBkZWZhdWx0IHNlbnNlIGlzIHRoYXQgMCByZXR1cm5lZCBmcm9tIGdwaW9fZ2V0X3ZhbHVlKCkgbWVhbnMKKyAqIHRoYXQgYSBjYXJkIGlzIGluc2VydGVkLiBJZiBAZGV0ZWN0X2ludmVydCBpcyBzZXQsIHRoZW4gdGhlIHZhbHVlIGZyb20KKyAqIGdwaW9fZ2V0X3ZhbHVlKCkgaXMgaW52ZXJ0ZWQsIHdoaWNoIG1ha2VzIDEgbWVhbiBjYXJkIGluc2VydGVkLgorICoKKyAqIFRoZSBkcml2ZXIgd2lsbCB1c2UgQGdwaW9fd3Byb3RlY3QgdG8gc2lnbmFsIHdoZXRoZXIgdGhlIGNhcmQgaXMgd3JpdGUKKyAqIHByb3RlY3RlZCBpZiBAbm9fd3Byb3RlY3QgaXMgbm90IHNldC4gQSAwIHJldHVybmVkIGZyb20gZ3Bpb19nZXRfdmFsdWUoKQorICogbWVhbnMgdGhlIGNhcmQgaXMgcmVhZC93cml0ZSwgYW5kIDEgbWVhbnMgcmVhZC1vbmx5LiBUaGUgQHdwcm90ZWN0X2ludmVydAorICogd2lsbCBpbnZlcnQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZ3Bpb19nZXRfdmFsdWUoKS4KKyAqCisgKiBDYXJkIHBvd2VyIGlzIHNldCBieSBAb2NyX2F2YWlsYSwgdXNpbmcgTUNDX1ZERF8gY29uc3RhbnRzIGlmIGl0IGlzIHNldAorICogdG8gYSBub24temVybyB2YWx1ZSwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG9mIDMuMi0zLjRWIGlzIHVzZWQuCisgKi8KK3N0cnVjdCBzM2MyNHh4X21jaV9wZGF0YSB7CisJdW5zaWduZWQgaW50CW5vX3dwcm90ZWN0OjE7CisJdW5zaWduZWQgaW50CW5vX2RldGVjdDoxOworCXVuc2lnbmVkIGludAl3cHJvdGVjdF9pbnZlcnQ6MTsKKwl1bnNpZ25lZCBpbnQJZGV0ZWN0X2ludmVydDoxOwkvKiBzZXQgPT4gZGV0ZWN0IGFjdGl2ZSBoaWdoICovCisJdW5zaWduZWQgaW50CXVzZV9kbWE6MTsKKworCXVuc2lnbmVkIGludAlncGlvX2RldGVjdDsKKwl1bnNpZ25lZCBpbnQJZ3Bpb193cHJvdGVjdDsKKwl1bnNpZ25lZCBsb25nCW9jcl9hdmFpbDsKKwl2b2lkCQkoKnNldF9wb3dlcikodW5zaWduZWQgY2hhciBwb3dlcl9tb2RlLAorCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdmRkKTsKK307CisKKy8qKgorICogczNjMjR4eF9tY2lfc2V0X3BsYXRkYXRhIC0gc2V0IHBsYXRmb3JtIGRhdGEgZm9yIG1tYy9zZGkgZGV2aWNlCisgKiBAcGRhdGE6IFRoZSBwbGF0Zm9ybSBkYXRhCisgKgorICogQ29weSB0aGUgcGxhdGZvcm0gZGF0YSBzdXBwbGllZCBieSBAcGRhdGEgc28gdGhhdCB0aGlzIGNhbiBiZSBtYXJrZWQKKyAqIF9faW5pdGRhdGEuCisgKi8KK2V4dGVybiB2b2lkIHMzYzI0eHhfbWNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjR4eF9tY2lfcGRhdGEgKnBkYXRhKTsKKworI2VuZGlmIC8qIF9BUkNIX05DSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21mYy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzEzMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9tZmMuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX01GQ19ICisjZGVmaW5lIF9fUExBVF9TQU1TVU5HX01GQ19IIF9fRklMRV9fCisKKy8qKgorICogczVwX21mY19yZXNlcnZlX21lbSAtIGZ1bmN0aW9uIHRvIGVhcmx5IHJlc2VydmUgbWVtb3J5IGZvciBNRkMgZHJpdmVyCisgKiBAcmJhc2U6CWJhc2UgYWRkcmVzcyBmb3IgTUZDICdyaWdodCcgbWVtb3J5IGludGVyZmFjZQorICogQHJzaXplOglzaXplIG9mIHRoZSBtZW1vcnkgcmVzZXJ2ZWQgZm9yIE1GQyAncmlnaHQnIGludGVyZmFjZQorICogQGxiYXNlOgliYXNlIGFkZHJlc3MgZm9yIE1GQyAnbGVmdCcgbWVtb3J5IGludGVyZmFjZQorICogQGxzaXplOglzaXplIG9mIHRoZSBtZW1vcnkgcmVzZXJ2ZWQgZm9yIE1GQyAnbGVmdCcgaW50ZXJmYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBzeXN0ZW0gbWVtb3J5IGZvciBib3RoIE1GQyBkZXZpY2UgbWVtb3J5CisgKiBpbnRlcmZhY2VzIGFuZCByZWdpc3RlcnMgaXQgdG8gcmVzcGVjdGl2ZSBzdHJ1Y3QgZGV2aWNlIGVudHJpZXMgYXMKKyAqIGNvaGVyZW50IG1lbW9yeS4KKyAqLwordm9pZCBfX2luaXQgczVwX21mY19yZXNlcnZlX21lbShwaHlzX2FkZHJfdCByYmFzZSwgdW5zaWduZWQgaW50IHJzaXplLAorCQkJCXBoeXNfYWRkcl90IGxiYXNlLCB1bnNpZ25lZCBpbnQgbHNpemUpOworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfTUZDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvbWlwaV9jc2lzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWIxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L21pcGlfY3Npcy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFM1UCBzZXJpZXMgTUlQSSBDU0kgc2xhdmUgZGV2aWNlIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19QTEFUX1NBTVNVTkdfTUlQSV9DU0lTX0hfCisjZGVmaW5lIF9fUExBVF9TQU1TVU5HX01JUElfQ1NJU19IXyBfX0ZJTEVfXworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworCisvKioKKyAqIHN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIC0gcGxhdGZvcm0gZGF0YSBmb3IgUzVQIE1JUEktQ1NJUyBkcml2ZXIKKyAqIEBjbGtfcmF0ZTogYnVzIGNsb2NrIGZyZXF1ZW5jeQorICogQGxhbmVzOiBudW1iZXIgb2YgZGF0YSBsYW5lcyB1c2VkCisgKiBAYWxpZ25tZW50OiBkYXRhIGFsaWdubWVudCBpbiBiaXRzCisgKiBAaHNfc2V0dGxlOiBIUy1SWCBzZXR0bGUgdGltZQorICogQGZpeGVkX3BoeV92ZGQ6IGZhbHNlIHRvIGVuYWJsZSBleHRlcm5hbCBELVBIWSByZWd1bGF0b3IgbWFuYWdlbWVudCBpbiB0aGUKKyAqCQkgICBkcml2ZXIgb3IgdHJ1ZSBpbiBjYXNlIHRoaXMgcmVndWxhdG9yIGhhcyBubyBlbmFibGUgZnVuY3Rpb24KKyAqIEBwaHlfZW5hYmxlOiBwb2ludGVyIHRvIGEgY2FsbGJhY2sgY29udHJvbGxpbmcgRC1QSFkgZW5hYmxlL3Jlc2V0CisgKi8KK3N0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzIHsKKwl1bnNpZ25lZCBsb25nIGNsa19yYXRlOworCXU4IGxhbmVzOworCXU4IGFsaWdubWVudDsKKwl1OCBoc19zZXR0bGU7CisJYm9vbCBmaXhlZF9waHlfdmRkOworCWludCAoKnBoeV9lbmFibGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGJvb2wgb24pOworfTsKKworLyoqCisgKiBzNXBfY3Npc19waHlfZW5hYmxlIC0gZ2xvYmFsIE1JUEktQ1NJIHJlY2VpdmVyIEQtUEhZIGNvbnRyb2wKKyAqIEBwZGV2OiBNSVBJLUNTSVMgcGxhdGZvcm0gZGV2aWNlCisgKiBAb246IHRydWUgdG8gZW5hYmxlIEQtUEhZIGFuZCBkZWFzc2VydCBpdHMgcmVzZXQKKyAqCWZhbHNlIHRvIGRpc2FibGUgRC1QSFkKKyAqLworaW50IHM1cF9jc2lzX3BoeV9lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgYm9vbCBvbik7CisKKyNlbmRpZiAvKiBfX1BMQVRfU0FNU1VOR19NSVBJX0NTSVNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcGxsLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1N2FmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbC5oCkBAIC0wLDAgKzEsMzIzIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKgorICogU2Ftc3VuZyBQTEwgY29kZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjZGVmaW5lIFMzQzI0WFhfUExMX01ESVZfTUFTSwkJKDB4RkYpCisjZGVmaW5lIFMzQzI0WFhfUExMX1BESVZfTUFTSwkJKDB4MUYpCisjZGVmaW5lIFMzQzI0WFhfUExMX1NESVZfTUFTSwkJKDB4MykKKyNkZWZpbmUgUzNDMjRYWF9QTExfTURJVl9TSElGVAkJKDEyKQorI2RlZmluZSBTM0MyNFhYX1BMTF9QRElWX1NISUZUCQkoNCkKKyNkZWZpbmUgUzNDMjRYWF9QTExfU0RJVl9TSElGVAkJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHMzYzI0eHhfZ2V0X3BsbCh1bnNpZ25lZCBpbnQgcGxsdmFsLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgYmFzZWNsaykKK3sKKwl1bnNpZ25lZCBpbnQgbWRpdiwgcGRpdiwgc2RpdjsKKwl1aW50NjRfdCBmdmNvOworCisJbWRpdiA9IChwbGx2YWwgPj4gUzNDMjRYWF9QTExfTURJVl9TSElGVCkgJiBTM0MyNFhYX1BMTF9NRElWX01BU0s7CisJcGRpdiA9IChwbGx2YWwgPj4gUzNDMjRYWF9QTExfUERJVl9TSElGVCkgJiBTM0MyNFhYX1BMTF9QRElWX01BU0s7CisJc2RpdiA9IChwbGx2YWwgPj4gUzNDMjRYWF9QTExfU0RJVl9TSElGVCkgJiBTM0MyNFhYX1BMTF9TRElWX01BU0s7CisKKwlmdmNvID0gKHVpbnQ2NF90KWJhc2VjbGsgKiAobWRpdiArIDgpOworCWRvX2RpdihmdmNvLCAocGRpdiArIDIpIDw8IHNkaXYpOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpZnZjbzsKK30KKworI2RlZmluZSBTM0MyNDE2X1BMTF9NRElWX01BU0sJCSgweDNGRikKKyNkZWZpbmUgUzNDMjQxNl9QTExfUERJVl9NQVNLCQkoMHgzRikKKyNkZWZpbmUgUzNDMjQxNl9QTExfU0RJVl9NQVNLCQkoMHg3KQorI2RlZmluZSBTM0MyNDE2X1BMTF9NRElWX1NISUZUCQkoMTQpCisjZGVmaW5lIFMzQzI0MTZfUExMX1BESVZfU0hJRlQJCSg1KQorI2RlZmluZSBTM0MyNDE2X1BMTF9TRElWX1NISUZUCQkoMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgczNjMjQxNl9nZXRfcGxsKHVuc2lnbmVkIGludCBwbGx2YWwsCisJCQkJCSAgIHVuc2lnbmVkIGludCBiYXNlY2xrKQoreworCXVuc2lnbmVkIGludCBtZGl2LCBwZGl2LCBzZGl2OworCXVpbnQ2NF90IGZ2Y287CisKKwltZGl2ID0gKHBsbHZhbCA+PiBTM0MyNDE2X1BMTF9NRElWX1NISUZUKSAmIFMzQzI0MTZfUExMX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbHZhbCA+PiBTM0MyNDE2X1BMTF9QRElWX1NISUZUKSAmIFMzQzI0MTZfUExMX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbHZhbCA+PiBTM0MyNDE2X1BMTF9TRElWX1NISUZUKSAmIFMzQzI0MTZfUExMX1NESVZfTUFTSzsKKworCWZ2Y28gPSAodWludDY0X3QpYmFzZWNsayAqIG1kaXY7CisJZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKKworCXJldHVybiAodW5zaWduZWQgaW50KWZ2Y287Cit9CisKKyNkZWZpbmUgUzNDNjQwMF9QTExfTURJVl9NQVNLCQkoMHgzRkYpCisjZGVmaW5lIFMzQzY0MDBfUExMX1BESVZfTUFTSwkJKDB4M0YpCisjZGVmaW5lIFMzQzY0MDBfUExMX1NESVZfTUFTSwkJKDB4NykKKyNkZWZpbmUgUzNDNjQwMF9QTExfTURJVl9TSElGVAkJKDE2KQorI2RlZmluZSBTM0M2NDAwX1BMTF9QRElWX1NISUZUCQkoOCkKKyNkZWZpbmUgUzNDNjQwMF9QTExfU0RJVl9TSElGVAkJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzM2M2NDAwX2dldF9wbGwodW5zaWduZWQgbG9uZyBiYXNlY2xrLAorCQkJCQkgICAgdTMyIHBsbGNvbikKK3sKKwl1MzIgbWRpdiwgcGRpdiwgc2RpdjsKKwl1NjQgZnZjbyA9IGJhc2VjbGs7CisKKwltZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9NRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9QRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbGNvbiA+PiBTM0M2NDAwX1BMTF9TRElWX1NISUZUKSAmIFMzQzY0MDBfUExMX1NESVZfTUFTSzsKKworCWZ2Y28gKj0gbWRpdjsKKwlkb19kaXYoZnZjbywgKHBkaXYgPDwgc2RpdikpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ2Y287Cit9CisKKyNkZWZpbmUgUExMNjU1M1hfTURJVl9NQVNLCSgweDdGKQorI2RlZmluZSBQTEw2NTUzWF9QRElWX01BU0sJKDB4MUYpCisjZGVmaW5lIFBMTDY1NTNYX1NESVZfTUFTSwkoMHgzKQorI2RlZmluZSBQTEw2NTUzWF9LRElWX01BU0sJKDB4RkZGRikKKyNkZWZpbmUgUExMNjU1M1hfTURJVl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDY1NTNYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDY1NTNYX1NESVZfU0hJRlQJKDApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzM2NfZ2V0X3BsbDY1NTN4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKKwkJCQkJICAgICB1MzIgcGxsX2NvbjAsIHUzMiBwbGxfY29uMSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwl1MzIgbWRpdiwgcGRpdiwgc2Rpdiwga2RpdjsKKwl1NjQgdG1wOworCisJbWRpdiA9IChwbGxfY29uMCA+PiBQTEw2NTUzWF9NRElWX1NISUZUKSAmIFBMTDY1NTNYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24wID4+IFBMTDY1NTNYX1BESVZfU0hJRlQpICYgUExMNjU1M1hfUERJVl9NQVNLOworCXNkaXYgPSAocGxsX2NvbjAgPj4gUExMNjU1M1hfU0RJVl9TSElGVCkgJiBQTEw2NTUzWF9TRElWX01BU0s7CisJa2RpdiA9IHBsbF9jb24xICYgUExMNjU1M1hfS0RJVl9NQVNLOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIG11bHRpcGxlIGJhc2VjbGsgYnkgbWRpdiAodGhlIGludGVnZXIgcGFydCkgYW5kIGtkaXYKKwkgKiB3aGljaCBpcyBpbiAyXjE2dGhzLCBzbyBzaGlmdCBtZGl2IHVwIChkb2VzIG5vdCBvdmVyZmxvdykgYW5kCisJICogYWRkIGtkaXYgYmVmb3JlIG11bHRpcGx5aW5nLiBUaGUgdXNlIG9mIHRtcCBpcyB0byBhdm9pZCBhbnkKKwkgKiBvdmVyZmxvd3MgYmVmb3JlIHNoaWZ0aW5nIGJhYyBkb3duIGludG8gcmVzdWx0IHdoZW4gbXVsdGlwbGluZworCSAqIGJ5IHRoZSBtZGl2IGFuZCBrZGl2IHBhaXIuCisJICovCisKKwl0bXAgPSBiYXNlY2xrOworCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OworCWRvX2Rpdih0bXAsIChwZGl2IDw8IHNkaXYpKTsKKwlyZXN1bHQgPSB0bXAgPj4gMTY7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIFBMTDM1WFhfTURJVl9NQVNLCSgweDNGRikKKyNkZWZpbmUgUExMMzVYWF9QRElWX01BU0sJKDB4M0YpCisjZGVmaW5lIFBMTDM1WFhfU0RJVl9NQVNLCSgweDcpCisjZGVmaW5lIFBMTDM1WFhfTURJVl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDM1WFhfUERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUExMMzVYWF9TRElWX1NISUZUCSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczVwX2dldF9wbGwzNXh4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywgdTMyIHBsbF9jb24pCit7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXY7CisJdTY0IGZ2Y28gPSBiYXNlY2xrOworCisJbWRpdiA9IChwbGxfY29uID4+IFBMTDM1WFhfTURJVl9TSElGVCkgJiBQTEwzNVhYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24gPj4gUExMMzVYWF9QRElWX1NISUZUKSAmIFBMTDM1WFhfUERJVl9NQVNLOworCXNkaXYgPSAocGxsX2NvbiA+PiBQTEwzNVhYX1NESVZfU0hJRlQpICYgUExMMzVYWF9TRElWX01BU0s7CisKKwlmdmNvICo9IG1kaXY7CisJZG9fZGl2KGZ2Y28sIChwZGl2IDw8IHNkaXYpKTsKKworCXJldHVybiAodW5zaWduZWQgbG9uZylmdmNvOworfQorCisjZGVmaW5lIFBMTDM2WFhfS0RJVl9NQVNLCSgweEZGRkYpCisjZGVmaW5lIFBMTDM2WFhfTURJVl9NQVNLCSgweDFGRikKKyNkZWZpbmUgUExMMzZYWF9QRElWX01BU0sJKDB4M0YpCisjZGVmaW5lIFBMTDM2WFhfU0RJVl9NQVNLCSgweDcpCisjZGVmaW5lIFBMTDM2WFhfTURJVl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDM2WFhfUERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUExMMzZYWF9TRElWX1NISUZUCSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczVwX2dldF9wbGwzNnh4KHVuc2lnbmVkIGxvbmcgYmFzZWNsaywKKwkJCQkJICAgIHUzMiBwbGxfY29uMCwgdTMyIHBsbF9jb24xKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBrZGl2OworCXU2NCB0bXA7CisKKwltZGl2ID0gKHBsbF9jb24wID4+IFBMTDM2WFhfTURJVl9TSElGVCkgJiBQTEwzNlhYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24wID4+IFBMTDM2WFhfUERJVl9TSElGVCkgJiBQTEwzNlhYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24wID4+IFBMTDM2WFhfU0RJVl9TSElGVCkgJiBQTEwzNlhYX1NESVZfTUFTSzsKKwlrZGl2ID0gcGxsX2NvbjEgJiBQTEwzNlhYX0tESVZfTUFTSzsKKworCXRtcCA9IGJhc2VjbGs7CisKKwl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKKwlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7CisJcmVzdWx0ID0gdG1wID4+IDE2OworCisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBQTEw0NVhYX01ESVZfTUFTSwkoMHgzRkYpCisjZGVmaW5lIFBMTDQ1WFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEw0NVhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEw0NVhYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEw0NVhYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDQ1WFhfU0RJVl9TSElGVAkoMCkKKworZW51bSBwbGw0NXh4X3R5cGVfdCB7CisJcGxsXzQ1MDAsCisJcGxsXzQ1MDIsCisJcGxsXzQ1MDgKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzNXBfZ2V0X3BsbDQ1eHgodW5zaWduZWQgbG9uZyBiYXNlY2xrLCB1MzIgcGxsX2NvbiwKKwkJCQkJICAgIGVudW0gcGxsNDV4eF90eXBlX3QgcGxsX3R5cGUpCit7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXY7CisJdTY0IGZ2Y28gPSBiYXNlY2xrOworCisJbWRpdiA9IChwbGxfY29uID4+IFBMTDQ1WFhfTURJVl9TSElGVCkgJiBQTEw0NVhYX01ESVZfTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24gPj4gUExMNDVYWF9QRElWX1NISUZUKSAmIFBMTDQ1WFhfUERJVl9NQVNLOworCXNkaXYgPSAocGxsX2NvbiA+PiBQTEw0NVhYX1NESVZfU0hJRlQpICYgUExMNDVYWF9TRElWX01BU0s7CisKKwlpZiAocGxsX3R5cGUgPT0gcGxsXzQ1MDgpCisJCXNkaXYgPSBzZGl2IC0gMTsKKworCWZ2Y28gKj0gbWRpdjsKKwlkb19kaXYoZnZjbywgKHBkaXYgPDwgc2RpdikpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ2Y287Cit9CisKKy8qIENPTjAgYml0LWZpZWxkcyAqLworI2RlZmluZSBQTEw0NlhYX01ESVZfTUFTSwkoMHgxRkYpCisjZGVmaW5lIFBMTDQ2WFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEw0NlhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEw0NlhYX0xPQ0tFRF9TSElGVAkoMjkpCisjZGVmaW5lIFBMTDQ2WFhfTURJVl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDQ2WFhfUERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUExMNDZYWF9TRElWX1NISUZUCSgwKQorCisvKiBDT04xIGJpdC1maWVsZHMgKi8KKyNkZWZpbmUgUExMNDZYWF9NUlJfTUFTSwkoMHgxRikKKyNkZWZpbmUgUExMNDZYWF9NRlJfTUFTSwkoMHgzRikKKyNkZWZpbmUgUExMNDZYWF9LRElWX01BU0sJKDB4RkZGRikKKyNkZWZpbmUgUExMNDY1MENfS0RJVl9NQVNLCSgweEZGRikKKyNkZWZpbmUgUExMNDZYWF9NUlJfU0hJRlQJKDI0KQorI2RlZmluZSBQTEw0NlhYX01GUl9TSElGVAkoMTYpCisjZGVmaW5lIFBMTDQ2WFhfS0RJVl9TSElGVAkoMCkKKworZW51bSBwbGw0Nnh4X3R5cGVfdCB7CisJcGxsXzQ2MDAsCisJcGxsXzQ2NTAsCisJcGxsXzQ2NTBjLAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsNDZ4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCisJCQkJCSAgICB1MzIgcGxsX2NvbjAsIHUzMiBwbGxfY29uMSwKKwkJCQkJICAgIGVudW0gcGxsNDZ4eF90eXBlX3QgcGxsX3R5cGUpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJdTMyIG1kaXYsIHBkaXYsIHNkaXYsIGtkaXY7CisJdTY0IHRtcDsKKworCW1kaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9NRElWX1NISUZUKSAmIFBMTDQ2WFhfTURJVl9NQVNLOworCXBkaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9QRElWX1NISUZUKSAmIFBMTDQ2WFhfUERJVl9NQVNLOworCXNkaXYgPSAocGxsX2NvbjAgPj4gUExMNDZYWF9TRElWX1NISUZUKSAmIFBMTDQ2WFhfU0RJVl9NQVNLOworCWtkaXYgPSBwbGxfY29uMSAmIFBMTDQ2WFhfS0RJVl9NQVNLOworCisJaWYgKHBsbF90eXBlID09IHBsbF80NjUwYykKKwkJa2RpdiA9IHBsbF9jb24xICYgUExMNDY1MENfS0RJVl9NQVNLOworCWVsc2UKKwkJa2RpdiA9IHBsbF9jb24xICYgUExMNDZYWF9LRElWX01BU0s7CisKKwl0bXAgPSBiYXNlY2xrOworCisJaWYgKHBsbF90eXBlID09IHBsbF80NjAwKSB7CisJCXRtcCAqPSAobWRpdiA8PCAxNikgKyBrZGl2OworCQlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7CisJCXJlc3VsdCA9IHRtcCA+PiAxNjsKKwl9IGVsc2UgeworCQl0bXAgKj0gKG1kaXYgPDwgMTApICsga2RpdjsKKwkJZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOworCQlyZXN1bHQgPSB0bXAgPj4gMTA7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBQTEw5MFhYX01ESVZfTUFTSwkoMHhGRikKKyNkZWZpbmUgUExMOTBYWF9QRElWX01BU0sJKDB4M0YpCisjZGVmaW5lIFBMTDkwWFhfU0RJVl9NQVNLCSgweDcpCisjZGVmaW5lIFBMTDkwWFhfS0RJVl9NQVNLCSgweGZmZmYpCisjZGVmaW5lIFBMTDkwWFhfTE9DS0VEX1NISUZUCSgyOSkKKyNkZWZpbmUgUExMOTBYWF9NRElWX1NISUZUCSgxNikKKyNkZWZpbmUgUExMOTBYWF9QRElWX1NISUZUCSg4KQorI2RlZmluZSBQTEw5MFhYX1NESVZfU0hJRlQJKDApCisjZGVmaW5lIFBMTDkwWFhfS0RJVl9TSElGVAkoMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsOTB4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCisJCQkJCSAgICB1MzIgcGxsX2NvbiwgdTMyIHBsbF9jb25rKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBrZGl2OworCXU2NCB0bXA7CisKKwltZGl2ID0gKHBsbF9jb24gPj4gUExMOTBYWF9NRElWX1NISUZUKSAmIFBMTDkwWFhfTURJVl9NQVNLOworCXBkaXYgPSAocGxsX2NvbiA+PiBQTEw5MFhYX1BESVZfU0hJRlQpICYgUExMOTBYWF9QRElWX01BU0s7CisJc2RpdiA9IChwbGxfY29uID4+IFBMTDkwWFhfU0RJVl9TSElGVCkgJiBQTEw5MFhYX1NESVZfTUFTSzsKKwlrZGl2ID0gcGxsX2NvbmsgJiBQTEw5MFhYX0tESVZfTUFTSzsKKworCS8qCisJICogV2UgbmVlZCB0byBtdWx0aXBsZSBiYXNlY2xrIGJ5IG1kaXYgKHRoZSBpbnRlZ2VyIHBhcnQpIGFuZCBrZGl2CisJICogd2hpY2ggaXMgaW4gMl4xNnRocywgc28gc2hpZnQgbWRpdiB1cCAoZG9lcyBub3Qgb3ZlcmZsb3cpIGFuZAorCSAqIGFkZCBrZGl2IGJlZm9yZSBtdWx0aXBseWluZy4gVGhlIHVzZSBvZiB0bXAgaXMgdG8gYXZvaWQgYW55CisJICogb3ZlcmZsb3dzIGJlZm9yZSBzaGlmdGluZyBiYWMgZG93biBpbnRvIHJlc3VsdCB3aGVuIG11bHRpcGxpbmcKKwkgKiBieSB0aGUgbWRpdiBhbmQga2RpdiBwYWlyLgorCSAqLworCisJdG1wID0gYmFzZWNsazsKKwl0bXAgKj0gKG1kaXYgPDwgMTYpICsga2RpdjsKKwlkb19kaXYodG1wLCAocGRpdiA8PCBzZGl2KSk7CisJcmVzdWx0ID0gdG1wID4+IDE2OworCisJcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBQTEw2NVhYX01ESVZfTUFTSwkoMHgzRkYpCisjZGVmaW5lIFBMTDY1WFhfUERJVl9NQVNLCSgweDNGKQorI2RlZmluZSBQTEw2NVhYX1NESVZfTUFTSwkoMHg3KQorI2RlZmluZSBQTEw2NVhYX01ESVZfU0hJRlQJKDE2KQorI2RlZmluZSBQTEw2NVhYX1BESVZfU0hJRlQJKDgpCisjZGVmaW5lIFBMTDY1WFhfU0RJVl9TSElGVAkoMCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHM1cF9nZXRfcGxsNjV4eCh1bnNpZ25lZCBsb25nIGJhc2VjbGssIHUzMiBwbGxfY29uKQoreworCXUzMiBtZGl2LCBwZGl2LCBzZGl2OworCXU2NCBmdmNvID0gYmFzZWNsazsKKworCW1kaXYgPSAocGxsX2NvbiA+PiBQTEw2NVhYX01ESVZfU0hJRlQpICYgUExMNjVYWF9NRElWX01BU0s7CisJcGRpdiA9IChwbGxfY29uID4+IFBMTDY1WFhfUERJVl9TSElGVCkgJiBQTEw2NVhYX1BESVZfTUFTSzsKKwlzZGl2ID0gKHBsbF9jb24gPj4gUExMNjVYWF9TRElWX1NISUZUKSAmIFBMTDY1WFhfU0RJVl9NQVNLOworCisJZnZjbyAqPSBtZGl2OworCWRvX2RpdihmdmNvLCAocGRpdiA8PCBzZGl2KSk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnZjbzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcGxsNjU1M3guaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcGxsNjU1M3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhiN2UxZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbDY1NTN4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBhcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BsbDY1NTN4LmgKLSAqCXBhcnRpYWxseSBmcm9tIGFyY2gvYXJtL21hY2gtczNjNjR4eC9pbmNsdWRlL21hY2gvcGxsLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLwotICoKLSAqIFNhbXN1bmcgUExMNjU1M3ggUExMIGNvZGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotLyogUzNDNjQwMCBhbmQgY29tcGF0aWJsZSAoUzNDMjQxNiwgZXRjLikgRVBMTCBjb2RlICovCi0KLSNkZWZpbmUgUExMNjU1M1hfTURJVl9NQVNLCSgoMSA8PCAoMjMtMTYpKSAtIDEpCi0jZGVmaW5lIFBMTDY1NTNYX1BESVZfTUFTSwkoKDEgPDwgKDEzLTgpKSAtIDEpCi0jZGVmaW5lIFBMTDY1NTNYX1NESVZfTUFTSwkoKDEgPDwgKDItMCkpIC0gMSkKLSNkZWZpbmUgUExMNjU1M1hfTURJVl9TSElGVAkoMTYpCi0jZGVmaW5lIFBMTDY1NTNYX1BESVZfU0hJRlQJKDgpCi0jZGVmaW5lIFBMTDY1NTNYX1NESVZfU0hJRlQJKDApCi0jZGVmaW5lIFBMTDY1NTNYX0tESVZfTUFTSwkoMHhmZmZmKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgczNjX2dldF9wbGw2NTUzeCh1bnNpZ25lZCBsb25nIGJhc2VjbGssCi0JCQkJCSAgICAgdTMyIHBsbDAsIHUzMiBwbGwxKQotewotCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwotCXUzMiBtZGl2LCBwZGl2LCBzZGl2LCBrZGl2OwotCXU2NCB0bXA7Ci0KLQltZGl2ID0gKHBsbDAgPj4gUExMNjU1M1hfTURJVl9TSElGVCkgJiBQTEw2NTUzWF9NRElWX01BU0s7Ci0JcGRpdiA9IChwbGwwID4+IFBMTDY1NTNYX1BESVZfU0hJRlQpICYgUExMNjU1M1hfUERJVl9NQVNLOwotCXNkaXYgPSAocGxsMCA+PiBQTEw2NTUzWF9TRElWX1NISUZUKSAmIFBMTDY1NTNYX1NESVZfTUFTSzsKLQlrZGl2ID0gcGxsMSAmIFBMTDY1NTNYX0tESVZfTUFTSzsKLQotCS8qIFdlIG5lZWQgdG8gbXVsdGlwbGUgYmFzZWNsayBieSBtZGl2ICh0aGUgaW50ZWdlciBwYXJ0KSBhbmQga2RpdgotCSAqIHdoaWNoIGlzIGluIDJeMTZ0aHMsIHNvIHNoaWZ0IG1kaXYgdXAgKGRvZXMgbm90IG92ZXJmbG93KSBhbmQKLQkgKiBhZGQga2RpdiBiZWZvcmUgbXVsdGlwbHlpbmcuIFRoZSB1c2Ugb2YgdG1wIGlzIHRvIGF2b2lkIGFueQotCSAqIG92ZXJmbG93cyBiZWZvcmUgc2hpZnRpbmcgYmFjIGRvd24gaW50byByZXN1bHQgd2hlbiBtdWx0aXBsaW5nCi0JICogYnkgdGhlIG1kaXYgYW5kIGtkaXYgcGFpci4KLQkgKi8KLQotCXRtcCA9IGJhc2VjbGs7Ci0JdG1wICo9IChtZGl2IDw8IDE2KSArIGtkaXY7Ci0JZG9fZGl2KHRtcCwgKHBkaXYgPDwgc2RpdikpOwotCXJlc3VsdCA9IHRtcCA+PiAxNjsKLQotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3BtLmgKaW5kZXggZjY3NDk5MS4uZGNmNjg3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wbS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcG0uaApAQCAtMTY1LDIwICsxNjUsMjAgQEAKIGV4dGVybiB2b2lkIHMzY19wbV9jb25maWd1cmVfZXh0aW50KHZvaWQpOwogCiAvKioKLSAqIHMzY19wbV9yZXN0b3JlX2dwaW9zKCkgLSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ3Bpb3MgYWZ0ZXIgc2xlZXAuCisgKiBzYW1zdW5nX3BtX3Jlc3RvcmVfZ3Bpb3MoKSAtIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBncGlvcyBhZnRlciBzbGVlcC4KICAqCiAgKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgR1BJTyBwaW5zIGFmdGVyIHNsZWVwLCB3aGljaCBtYXkgaW52b2x2ZSBlbnN1cmluZwogICogdGhhdCB3ZSBkbyBub3QgZ2xpdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGlucyBmcm9tIHRoYXQgdGhlIGJvb3Rsb2FkZXIncwogICogcmVzdW1lIGNvZGUgaGFzIGRvbmUuCiAqLwotZXh0ZXJuIHZvaWQgczNjX3BtX3Jlc3RvcmVfZ3Bpb3Modm9pZCk7CitleHRlcm4gdm9pZCBzYW1zdW5nX3BtX3Jlc3RvcmVfZ3Bpb3Modm9pZCk7CiAKIC8qKgotICogczNjX3BtX3NhdmVfZ3Bpb3MoKSAtIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBHUElPcyBmb3IgcmVzdG9yaW5nIGFmdGVyIHNsZWVwLgorICogc2Ftc3VuZ19wbV9zYXZlX2dwaW9zKCkgLSBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgR1BJT3MgZm9yIHJlc3RvcmluZyBhZnRlciBzbGVlcC4KICAqCi0gKiBTYXZlIHRoZSBHUElPIHN0YXRlcyBmb3IgcmVzb3RyYXRpb24gb24gcmVzdW1lLiBTZWUgczNjX3BtX3Jlc3RvcmVfZ3Bpb3MoKS4KKyAqIFNhdmUgdGhlIEdQSU8gc3RhdGVzIGZvciByZXNvdHJhdGlvbiBvbiByZXN1bWUuIFNlZSBzYW1zdW5nX3BtX3Jlc3RvcmVfZ3Bpb3MoKS4KICAqLwotZXh0ZXJuIHZvaWQgczNjX3BtX3NhdmVfZ3Bpb3Modm9pZCk7CitleHRlcm4gdm9pZCBzYW1zdW5nX3BtX3NhdmVfZ3Bpb3Modm9pZCk7CiAKIGV4dGVybiB2b2lkIHMzY19wbV9zYXZlX2NvcmUodm9pZCk7CiBleHRlcm4gdm9pZCBzM2NfcG1fcmVzdG9yZV9jb3JlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wd20tY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcHdtLWNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2YTYwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcHdtLWNsb2NrLmgKQEAgLTAsMCArMSw4MSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9wd20tY2xvY2suaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqICAgICAgQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICogICAgICBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFNBTVNVTkcgLSBwd20gY2xvY2sgYW5kIHRpbWVyIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX0FTTV9QTEFUX1BXTV9DTE9DS19ICisjZGVmaW5lIF9fQVNNX1BMQVRfUFdNX0NMT0NLX0ggX19GSUxFX18KKworLyoqCisgKiBwd21fY2ZnX3NyY19pc190Y2xrKCkgLSByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbXV4IGNvbmZpZyBpcyBhIHRjbGsKKyAqIEB0Y2ZnOiBUaGUgdGltZXIgVENGRzEgcmVnaXN0ZXIgYml0cyBzaGlmdGVkIGRvd24gdG8gMC4KKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmcm9tIFRDRkcxIGlzIGEgVENMSyBpbnN0ZWFkCisgKiBhbnkgb2YgdGhlIFRESVYgY2xvY2tzLgorICovCitzdGF0aWMgaW5saW5lIGludCBwd21fY2ZnX3NyY19pc190Y2xrKHVuc2lnbmVkIGxvbmcgdGNmZykKK3sKKwlpZiAoc29jX2lzX3MzYzI0eHgoKSkKKwkJcmV0dXJuIHRjZmcgPT0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSzsKKwllbHNlIGlmIChzb2NfaXNfczNjNjR4eCgpIHx8IHNvY19pc19zNXBjMTAwKCkpCisJCXJldHVybiB0Y2ZnID49IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7CisJZWxzZSBpZiAoc29jX2lzX3M1cDY0NDAoKSB8fCBzb2NfaXNfczVwNjQ1MCgpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiB0Y2ZnID09IFMzQzY0WFhfVENGRzFfTVVYX1RDTEs7Cit9CisKKy8qKgorICogdGNmZ190b19kaXZpc29yKCkgLSBjb252ZXJ0IHRjZmcxIHNldHRpbmcgdG8gYSBkaXZpc29yCisgKiBAdGNmZzE6IFRoZSB0Y2ZnMSBzZXR0aW5nLCBzaGlmdGVkIGRvd24uCisgKgorICogR2V0IHRoZSBkaXZpc29yIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdGNmZzEgc2V0dGluZy4gV2UgYXNzdW1lIHRoZQorICogY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdG8gc2VlIGlmIHRoaXMgaXMgbm90IGEgVENMSyBzb3VyY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Y2ZnX3RvX2Rpdmlzb3IodW5zaWduZWQgbG9uZyB0Y2ZnMSkKK3sKKwlpZiAoc29jX2lzX3MzYzI0eHgoKSkKKwkJcmV0dXJuIDEgPDwgKHRjZmcxICsgMSk7CisJZWxzZQorCQlyZXR1cm4gMSA8PCB0Y2ZnMTsKK30KKworLyoqCisgKiBwd21fdGRpdl9oYXNfZGl2MSgpIC0gZG9lcyB0aGUgdGRpdiBzZXR0aW5nIGhhdmUgYSAvMQorICoKKyAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYSAvMSBpbiB0aGUgdGRpdiBzZXR0aW5nLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwd21fdGRpdl9oYXNfZGl2MSh2b2lkKQoreworCWlmIChzb2NfaXNfczNjMjR4eCgpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisvKioKKyAqIHB3bV90ZGl2X2Rpdl9iaXRzKCkgLSBjYWxjdWxhdGUgVENGRzEgZGl2aXNvciB2YWx1ZS4KKyAqIEBkaXY6IFRoZSBkaXZpc29yIHRvIGNhbGN1bGF0ZSB0aGUgYml0IGluZm9ybWF0aW9uIGZvci4KKyAqCisgKiBUdXJuIGEgZGl2aXNvciBpbnRvIHRoZSBuZWNlc3NhcnkgYml0IGZpZWxkIGZvciBUQ0ZHMS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB3bV90ZGl2X2Rpdl9iaXRzKHVuc2lnbmVkIGludCBkaXYpCit7CisJaWYgKHNvY19pc19zM2MyNHh4KCkpCisJCXJldHVybiBpbG9nMihkaXYpIC0gMTsKKwllbHNlCisJCXJldHVybiBpbG9nMihkaXYpOworfQorI2VuZGlmIC8qIF9fQVNNX1BMQVRfUFdNX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1hZGMuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1hZGMuaAppbmRleCAwMzVlOGMzLi43MDYxMjEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtYWRjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWFkYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIFMzQzI0MTBfQURDREFUMAkgICBTM0MyNDEwX0FEQ1JFRygweDBDKQogI2RlZmluZSBTM0MyNDEwX0FEQ0RBVDEJICAgUzNDMjQxMF9BRENSRUcoMHgxMCkKICNkZWZpbmUgUzNDNjRYWF9BRENVUEROCQlTM0MyNDEwX0FEQ1JFRygweDE0KQorI2RlZmluZSBTM0MyNDQzX0FEQ01VWAkJUzNDMjQxMF9BRENSRUcoMHgxOCkKICNkZWZpbmUgUzNDNjRYWF9BRENDTFJJTlQJUzNDMjQxMF9BRENSRUcoMHgxOCkKICNkZWZpbmUgUzVQX0FEQ01VWAkJUzNDMjQxMF9BRENSRUcoMHgxQykKICNkZWZpbmUgUzNDNjRYWF9BRENDTFJJTlRQTkROVVAJUzNDMjQxMF9BRENSRUcoMHgyMCkKQEAgLTMzLDYgKzM0LDcgQEAKICNkZWZpbmUgUzNDMjQxMF9BRENDT05fUFJTQ1ZMTUFTSwkoMHhGRjw8NikKICNkZWZpbmUgUzNDMjQxMF9BRENDT05fU0VMTVVYKHgpCSgoKHgpJjB4Nyk8PDMpCiAjZGVmaW5lIFMzQzI0MTBfQURDQ09OX01VWE1BU0sJCSgweDc8PDMpCisjZGVmaW5lIFMzQzI0MTZfQURDQ09OX1JFU1NFTAkJKDEgPDwgMykKICNkZWZpbmUgUzNDMjQxMF9BRENDT05fU1REQk0JCSgxPDwyKQogI2RlZmluZSBTM0MyNDEwX0FEQ0NPTl9SRUFEX1NUQVJUCSgxPDwxKQogI2RlZmluZSBTM0MyNDEwX0FEQ0NPTl9FTkFCTEVfU1RBUlQJKDE8PDApCkBAIC00MCw2ICs0Miw3IEBACiAKIAogLyogQURDVFNDIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgUzNDMjQ0M19BRENUU0NfVURfU0VOCQkoMSA8PCA4KQogI2RlZmluZSBTM0MyNDEwX0FEQ1RTQ19ZTV9TRU4JCSgxPDw3KQogI2RlZmluZSBTM0MyNDEwX0FEQ1RTQ19ZUF9TRU4JCSgxPDw2KQogI2RlZmluZSBTM0MyNDEwX0FEQ1RTQ19YTV9TRU4JCSgxPDw1KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWRtYS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWRtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGJjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtZG1hLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1kbWEuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFNhbXN1bmcgUzNDMjRYWCBETUEgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfUkVHU19ETUFfSAorI2RlZmluZSBfX0FTTV9QTEFUX1JFR1NfRE1BX0ggX19GSUxFX18KKworI2RlZmluZSBTM0MyNDEwX0RNQV9ESVNSQwkJKDB4MDApCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RJU1JDQwkJKDB4MDQpCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RJRFNUCQkoMHgwOCkKKyNkZWZpbmUgUzNDMjQxMF9ETUFfRElEU1RDCQkoMHgwQykKKyNkZWZpbmUgUzNDMjQxMF9ETUFfRENPTgkJKDB4MTApCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RTVEFUCQkoMHgxNCkKKyNkZWZpbmUgUzNDMjQxMF9ETUFfRENTUkMJCSgweDE4KQorI2RlZmluZSBTM0MyNDEwX0RNQV9EQ0RTVAkJKDB4MUMpCisjZGVmaW5lIFMzQzI0MTBfRE1BX0RNQVNLVFJJRwkJKDB4MjApCisjZGVmaW5lIFMzQzI0MTJfRE1BX0RNQVJFUVNFTAkJKDB4MjQpCisjZGVmaW5lIFMzQzI0NDNfRE1BX0RNQVJFUVNFTAkJKDB4MjQpCisKKyNkZWZpbmUgUzNDMjQxMF9ESVNSQ0NfSU5DCQkoMSA8PCAwKQorI2RlZmluZSBTM0MyNDEwX0RJU1JDQ19BUEIJCSgxIDw8IDEpCisKKyNkZWZpbmUgUzNDMjQxMF9ETUFTS1RSSUdfU1RPUAkJKDEgPDwgMikKKyNkZWZpbmUgUzNDMjQxMF9ETUFTS1RSSUdfT04JCSgxIDw8IDEpCisjZGVmaW5lIFMzQzI0MTBfRE1BU0tUUklHX1NXVFJJRwkoMSA8PCAwKQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9ERU1BTkQJCSgwIDw8IDMxKQorI2RlZmluZSBTM0MyNDEwX0RDT05fSEFORFNIQUtFCQkoMSA8PCAzMSkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX1NZTkNfUENMSwkJKDAgPDwgMzApCisjZGVmaW5lIFMzQzI0MTBfRENPTl9TWU5DX0hDTEsJCSgxIDw8IDMwKQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9JTlRSRVEJCSgxIDw8IDI5KQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfWERSRVEwCQkoMCA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMF9VQVJUMAkJKDEgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfU0RJCQkoMiA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMF9USU1FUgkJKDMgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDBfVVNCRVAxCQkoNCA8PCAyNCkKKworI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX1hEUkVRMQkJKDAgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfVUFSVDEJCSgxIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gxX0kyU1NESQkJKDIgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDFfU1BJCQkoMyA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMV9VU0JFUDIJCSg0IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDJfSTJTU0RPCQkoMCA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIMl9JMlNTREkJCSgxIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1NESQkJKDIgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDJfVElNRVIJCSgzIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gyX1VTQkVQMwkJKDQgPDwgMjQpCisKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19VQVJUMgkJKDAgPDwgMjQpCisjZGVmaW5lIFMzQzI0MTBfRENPTl9DSDNfU0RJCQkoMSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19TUEkJCSgyIDw8IDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fQ0gzX1RJTUVSCQkoMyA8PCAyNCkKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0NIM19VU0JFUDQJCSg0IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0MTBfRENPTl9TUkNTSElGVAkJKDI0KQorI2RlZmluZSBTM0MyNDEwX0RDT05fU1JDTUFTSwkJKDcgPDwgMjQpCisKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0JZVEUJCSgwIDw8IDIwKQorI2RlZmluZSBTM0MyNDEwX0RDT05fSEFMRldPUkQJCSgxIDw8IDIwKQorI2RlZmluZSBTM0MyNDEwX0RDT05fV09SRAkJKDIgPDwgMjApCisKKyNkZWZpbmUgUzNDMjQxMF9EQ09OX0FVVE9SRUxPQUQJCSgwIDw8IDIyKQorI2RlZmluZSBTM0MyNDEwX0RDT05fTk9SRUxPQUQJCSgxIDw8IDIyKQorI2RlZmluZSBTM0MyNDEwX0RDT05fSFdUUklHCQkoMSA8PCAyMykKKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MAorCisjZGVmaW5lIFMzQzI0NDBfRElEU1RDX0NIS0lOVAkJKDEgPDwgMikKKworI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gwX0kyU1NETwkJKDUgPDwgMjQpCisjZGVmaW5lIFMzQzI0NDBfRENPTl9DSDBfUENNSU4JCSg2IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0NDBfRENPTl9DSDFfUENNT1VUCQkoNSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIMV9TREkJCSg2IDw8IDI0KQorCisjZGVmaW5lIFMzQzI0NDBfRENPTl9DSDJfUENNSU4JCSg1IDw8IDI0KQorI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gyX01JQ0lOCQkoNiA8PCAyNCkKKworI2RlZmluZSBTM0MyNDQwX0RDT05fQ0gzX01JQ0lOCQkoNSA8PCAyNCkKKyNkZWZpbmUgUzNDMjQ0MF9EQ09OX0NIM19QQ01PVVQJCSg2IDw8IDI0KQorI2VuZGlmIC8qIENPTkZJR19DUFVfUzNDMjQ0MCAqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyCisKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1JDKHgpCSgoeCkgPDwgMSkKKworI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9IVwkJKDEpCisKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1BJMFRYCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygwKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TUEkwUlgJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDEpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1NQSTFUWAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMikKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfU1BJMVJYCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygzKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9JMlNUWAkJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDQpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX0kyU1JYCQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoNSkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVElNRVIJCVMzQzI0MTJfRE1BUkVRU0VMX1NSQyg5KQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9TREkJCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxMCkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVVNCRVAxCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxMykKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVVNCRVAyCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxNCkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVVNCRVAzCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxNSkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVVNCRVA0CVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxNikKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfWERSRVEwCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxNykKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfWERSRVExCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygxOCkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDBfMAlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMTkpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQwXzEJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIwKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMV8wCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyMSkKKyNkZWZpbmUgUzNDMjQxMl9ETUFSRVFTRUxfVUFSVDFfMQlTM0MyNDEyX0RNQVJFUVNFTF9TUkMoMjIpCisjZGVmaW5lIFMzQzI0MTJfRE1BUkVRU0VMX1VBUlQyXzAJUzNDMjQxMl9ETUFSRVFTRUxfU1JDKDIzKQorI2RlZmluZSBTM0MyNDEyX0RNQVJFUVNFTF9VQVJUMl8xCVMzQzI0MTJfRE1BUkVRU0VMX1NSQygyNCkKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0MTIgKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MworCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NSQyh4KQkoKHgpIDw8IDEpCisKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfSFcJCSgxKQorCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NQSTBUWAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMCkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU1BJMFJYCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygxKQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9TUEkxVFgJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1NQSTFSWAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMykKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfSTJTVFgJCVMzQzI0NDNfRE1BUkVRU0VMX1NSQyg0KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9JMlNSWAkJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDUpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1RJTUVSCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoOSkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfU0RJCQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMTApCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1hEUkVRMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMTcpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1hEUkVRMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMTgpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQwXzAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDE5KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMF8xCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyMCkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDFfMAlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjEpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQxXzEJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDIyKQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUMl8wCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyMykKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfVUFSVDJfMQlTM0MyNDQzX0RNQVJFUVNFTF9TUkMoMjQpCisjZGVmaW5lIFMzQzI0NDNfRE1BUkVRU0VMX1VBUlQzXzAJUzNDMjQ0M19ETUFSRVFTRUxfU1JDKDI1KQorI2RlZmluZSBTM0MyNDQzX0RNQVJFUVNFTF9VQVJUM18xCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyNikKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfUENNT1VUCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyNykKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfUENNSU4JCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyOCkKKyNkZWZpbmUgUzNDMjQ0M19ETUFSRVFTRUxfTUlDSU4JCVMzQzI0NDNfRE1BUkVRU0VMX1NSQygyOSkKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0NDMgKi8KKworI2VuZGlmIC8qIF9fQVNNX1BMQVRfUkVHU19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtaWlzLmgKQEAgLTAsMCArMSw3MCBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLWlpcy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFNpbXRlYyBFbGVjdHJvbmljcyA8bGludXhAc2ltdGVjLmNvLnVrPgorICoJCSAgICAgIGh0dHA6Ly93d3cuc2ltdGVjLmNvLnVrL3Byb2R1Y3RzL1NXTElOVVgvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTM0MyNDEwIElJUyByZWdpc3RlciBkZWZpbml0aW9uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19JSVNfSAorI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfSUlTX0gKKworI2RlZmluZSBTM0MyNDEwX0lJU0NPTgkJCSgweDAwKQorCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX0xSSU5ERVgJCSgxIDw8IDgpCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1RYRklGT1JEWQkoMSA8PCA3KQorI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9SWEZJRk9SRFkJKDEgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fVFhETUFFTgkJKDEgPDwgNSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fUlhETUFFTgkJKDEgPDwgNCkKKyNkZWZpbmUgUzNDMjQxMF9JSVNDT05fVFhJRExFCQkoMSA8PCAzKQorI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9SWElETEUJCSgxIDw8IDIpCisjZGVmaW5lIFMzQzI0MTBfSUlTQ09OX1BTQ0VOCQkoMSA8PCAxKQorI2RlZmluZSBTM0MyNDEwX0lJU0NPTl9JSVNFTgkJKDEgPDwgMCkKKworI2RlZmluZSBTM0MyNDEwX0lJU01PRAkJCSgweDA0KQorCisjZGVmaW5lIFMzQzI0NDBfSUlTTU9EX01QTEwJCSgxIDw8IDkpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1NMQVZFCQkoMSA8PCA4KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9OT1hGRVIJCSgwIDw8IDYpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX1JYTU9ERQkJKDEgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfVFhNT0RFCQkoMiA8PCA2KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9UWFJYTU9ERQkJKDMgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTFJfTExPVwkJKDAgPDwgNSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfTFJfUkxPVwkJKDEgPDwgNSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfSUlTCQkoMCA8PCA0KQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9NU0IJCSgxIDw8IDQpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzhCSVQJCSgwIDw8IDMpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzE2QklUCQkoMSA8PCAzKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF9CSVRNQVNLCQkoMSA8PCAzKQorI2RlZmluZSBTM0MyNDEwX0lJU01PRF8yNTZGUwkJKDAgPDwgMikKKyNkZWZpbmUgUzNDMjQxMF9JSVNNT0RfMzg0RlMJCSgxIDw8IDIpCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzE2RlMJCSgwIDw8IDApCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzMyRlMJCSgxIDw8IDApCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EXzQ4RlMJCSgyIDw8IDApCisjZGVmaW5lIFMzQzI0MTBfSUlTTU9EX0ZTX01BU0sJCSgzIDw8IDApCisKKyNkZWZpbmUgUzNDMjQxMF9JSVNQU1IJCQkoMHgwOCkKKworI2RlZmluZSBTM0MyNDEwX0lJU1BTUl9JTlRNQVNLCQkoMzEgPDwgNSkKKyNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfSU5UU0hJRlQJCSg1KQorI2RlZmluZSBTM0MyNDEwX0lJU1BTUl9FWFRNQVNLCQkoMzEgPDwgMCkKKyNkZWZpbmUgUzNDMjQxMF9JSVNQU1JfRVhUU0hGSVQJCSgwKQorCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTgkJCSgweDBjKQorCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9UWERNQQkJKDEgPDwgMTUpCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWERNQQkJKDEgPDwgMTQpCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9UWEVOQUJMRQkoMSA8PCAxMykKKyNkZWZpbmUgUzNDMjQxMF9JSVNGQ09OX1JYRU5BQkxFCSgxIDw8IDEyKQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhNQVNLCQkoMHgzZiA8PCA2KQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fVFhTSElGVAkJKDYpCisjZGVmaW5lIFMzQzI0MTBfSUlTRkNPTl9SWE1BU0sJCSgweDNmKQorI2RlZmluZSBTM0MyNDEwX0lJU0ZDT05fUlhTSElGVAkJKDApCisKKyNkZWZpbmUgUzNDMjQxMF9JSVNGSUZPCQkJKDB4MTApCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1JFR1NfSUlTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTJmZTdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNwaS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcGkuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBGZXRyb24gR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogUzNDMjQxMCBTUEkgcmVnaXN0ZXIgZGVmaW5pdGlvbgorKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1JFR1NfU1BJX0gKKyNkZWZpbmUgX19BU01fQVJDSF9SRUdTX1NQSV9ICisKKyNkZWZpbmUgUzNDMjQxMF9TUEkxCQkoMHgyMCkKKyNkZWZpbmUgUzNDMjQxMl9TUEkxCQkoMHgxMDApCisKKyNkZWZpbmUgUzNDMjQxMF9TUENPTgkJKDB4MDApCisKKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9TTU9EX0RNQQkoMiA8PCA1KQkvKiBETUEgbW9kZSAqLworI2RlZmluZSBTM0MyNDEwX1NQQ09OX1NNT0RfSU5UCSgxIDw8IDUpCS8qIGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIFMzQzI0MTBfU1BDT05fU01PRF9QT0xMCSgwIDw8IDUpCS8qIHBvbGxpbmcgbW9kZSAqLworI2RlZmluZSBTM0MyNDEwX1NQQ09OX0VOU0NLCSgxIDw8IDQpCS8qIEVuYWJsZSBTQ0sgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9NU1RSCSgxIDw8IDMpCS8qIE1hc3RlcjoxLCBTbGF2ZTowIHNlbGVjdCAqLworI2RlZmluZSBTM0MyNDEwX1NQQ09OX0NQT0xfSElHSAkoMSA8PCAyKQkvKiBDbG9jayBwb2xhcml0eSBzZWxlY3QgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUE9MX0xPVwkoMCA8PCAyKQkvKiBDbG9jayBwb2xhcml0eSBzZWxlY3QgKi8KKworI2RlZmluZSBTM0MyNDEwX1NQQ09OX0NQSEFfRk1UQgkoMSA8PCAxKQkvKiBDbG9jayBQaGFzZSBTZWxlY3QgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUENPTl9DUEhBX0ZNVEEJKDAgPDwgMSkJLyogQ2xvY2sgUGhhc2UgU2VsZWN0ICovCisKKyNkZWZpbmUgUzNDMjQxMF9TUFNUQQkJKDB4MDQpCisKKyNkZWZpbmUgUzNDMjQxMF9TUFNUQV9EQ09MCSgxIDw8IDIpCS8qIERhdGEgQ29sbGlzaW9uIEVycm9yICovCisjZGVmaW5lIFMzQzI0MTBfU1BTVEFfTVVMRAkoMSA8PCAxKQkvKiBNdWx0aSBNYXN0ZXIgRXJyb3IgKi8KKyNkZWZpbmUgUzNDMjQxMF9TUFNUQV9SRUFEWQkoMSA8PCAwKQkvKiBEYXRhIFR4L1J4IHJlYWR5ICovCisjZGVmaW5lIFMzQzI0MTJfU1BTVEFfUkVBRFlfT1JHCSgxIDw8IDMpCisKKyNkZWZpbmUgUzNDMjQxMF9TUFBJTgkJKDB4MDgpCisKKyNkZWZpbmUgUzNDMjQxMF9TUFBJTl9FTk1VTAkoMSA8PCAyKQkvKiBNdWx0aSBNYXN0ZXIgRXJyb3IgZGV0ZWN0ICovCisjZGVmaW5lIFMzQzI0MTBfU1BQSU5fUkVTRVJWRUQJKDEgPDwgMSkKKyNkZWZpbmUgUzNDMjQxMF9TUFBJTl9LRUVQCSgxIDw8IDApCS8qIE1hc3RlciBPdXQga2VlcCAqLworCisjZGVmaW5lIFMzQzI0MTBfU1BQUkUJCSgweDBDKQorI2RlZmluZSBTM0MyNDEwX1NQVERBVAkJKDB4MTApCisjZGVmaW5lIFMzQzI0MTBfU1BSREFUCQkoMHgxNCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUkVHU19TUElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NzI5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy1zcm9tLmgKQEAgLTAsMCArMSw1NCBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXNyb20uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBTNVAgU1JPTUMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmbmRlZiBfX1BMQVRfU0FNU1VOR19SRUdTX1NST01fSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19SRUdTX1NST01fSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKworI2RlZmluZSBTNVBfU1JPTVJFRyh4KQkJKFM1UF9WQV9TUk9NQyArICh4KSkKKworI2RlZmluZSBTNVBfU1JPTV9CVwkJUzVQX1NST01SRUcoMHgwKQorI2RlZmluZSBTNVBfU1JPTV9CQzAJCVM1UF9TUk9NUkVHKDB4NCkKKyNkZWZpbmUgUzVQX1NST01fQkMxCQlTNVBfU1JPTVJFRygweDgpCisjZGVmaW5lIFM1UF9TUk9NX0JDMgkJUzVQX1NST01SRUcoMHhjKQorI2RlZmluZSBTNVBfU1JPTV9CQzMJCVM1UF9TUk9NUkVHKDB4MTApCisjZGVmaW5lIFM1UF9TUk9NX0JDNAkJUzVQX1NST01SRUcoMHgxNCkKKyNkZWZpbmUgUzVQX1NST01fQkM1CQlTNVBfU1JPTVJFRygweDE4KQorCisvKiBvbmUgcmVnaXN0ZXIgQlcgaG9sZHMgNCB4IDQtYml0IHBhY2tlZCBzZXR0aW5ncyBmb3IgTkNTMCAtIE5DUzMgKi8KKworI2RlZmluZSBTNVBfU1JPTV9CV19fREFUQVdJRFRIX19TSElGVAkJMAorI2RlZmluZSBTNVBfU1JPTV9CV19fQUREUk1PREVfX1NISUZUCQkxCisjZGVmaW5lIFM1UF9TUk9NX0JXX19XQUlURU5BQkxFX19TSElGVAkJMgorI2RlZmluZSBTNVBfU1JPTV9CV19fQllURUVOQUJMRV9fU0hJRlQJCTMKKworI2RlZmluZSBTNVBfU1JPTV9CV19fQ1NfTUFTSwkJCTB4ZgorCisjZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MwX19TSElGVAkJMAorI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTMV9fU0hJRlQJCTQKKyNkZWZpbmUgUzVQX1NST01fQldfX05DUzJfX1NISUZUCQk4CisjZGVmaW5lIFM1UF9TUk9NX0JXX19OQ1MzX19TSElGVAkJMTIKKyNkZWZpbmUgUzVQX1NST01fQldfX05DUzRfX1NISUZUCQkxNgorI2RlZmluZSBTNVBfU1JPTV9CV19fTkNTNV9fU0hJRlQJCTIwCisKKy8qIGFwcGxpZXMgdG8gc2FtZSB0byBCQ1MwIC0gQkNTMyAqLworCisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fUE1DX19TSElGVAkJMAorI2RlZmluZSBTNVBfU1JPTV9CQ1hfX1RBQ1BfX1NISUZUCQk0CisjZGVmaW5lIFM1UF9TUk9NX0JDWF9fVENBSF9fU0hJRlQJCTgKKyNkZWZpbmUgUzVQX1NST01fQkNYX19UQ09IX19TSElGVAkJMTIKKyNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNDX19TSElGVAkJMTYKKyNkZWZpbmUgUzVQX1NST01fQkNYX19UQ09TX19TSElGVAkJMjQKKyNkZWZpbmUgUzVQX1NST01fQkNYX19UQUNTX19TSElGVAkJMjgKKworI2VuZGlmIC8qIF9fUExBVF9TQU1TVU5HX1JFR1NfU1JPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtdWRjLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3JlZ3MtdWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwM2QzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVncy11ZGMuaApAQCAtMCwwICsxLDE1MSBAQAorLyogYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZWdzLXVkYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEhlcmJlcnQgUG9ldHpsIDxoZXJiZXJ0QDEzdGhmbG9vci5hdD4KKyAqCisgKiBUaGlzIGluY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19VRENfSAorI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfVURDX0gKKworI2RlZmluZSBTM0MyNDEwX1VTQkRSRUcoeCkgKHgpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRlVOQ19BRERSX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTQwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTQ0KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUF9JTlRfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTQ4KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQl9JTlRfUkVHCQlTM0MyNDEwX1VTQkRSRUcoMHgwMTU4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUF9JTlRfRU5fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNWMpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfVVNCX0lOVF9FTl9SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDE2YykKKworI2RlZmluZSBTM0MyNDEwX1VEQ19GUkFNRV9OVU0xX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTcwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19GUkFNRV9OVU0yX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTc0KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWMwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFjNCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0ZJRk9fUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxYzgpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQM19GSUZPX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMWNjKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRklGT19SRUcJUzNDMjQxMF9VU0JEUkVHKDB4MDFkMCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX0NPTgkJUzNDMjQxMF9VU0JEUkVHKDB4MDIwMCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9VTklUCVMzQzI0MTBfVVNCRFJFRygweDAyMDQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfRklGTwlTM0MyNDEwX1VTQkRSRUcoMHgwMjA4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDFfRE1BX1RUQ19MCVMzQzI0MTBfVVNCRFJFRygweDAyMGMpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMV9ETUFfVFRDX00JUzNDMjQxMF9VU0JEUkVHKDB4MDIxMCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAxX0RNQV9UVENfSAlTM0MyNDEwX1VTQkRSRUcoMHgwMjE0KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfQ09OCQlTM0MyNDEwX1VTQkRSRUcoMHgwMjE4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX1VOSVQJUzNDMjQxMF9VU0JEUkVHKDB4MDIxYykKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9GSUZPCVMzQzI0MTBfVVNCRFJFRygweDAyMjApCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMl9ETUFfVFRDX0wJUzNDMjQxMF9VU0JEUkVHKDB4MDIyNCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAyX0RNQV9UVENfTQlTM0MyNDEwX1VTQkRSRUcoMHgwMjI4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDJfRE1BX1RUQ19ICVMzQzI0MTBfVVNCRFJFRygweDAyMmMpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9DT04JCVMzQzI0MTBfVVNCRFJFRygweDAyNDApCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfVU5JVAlTM0MyNDEwX1VTQkRSRUcoMHgwMjQ0KQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX0ZJRk8JUzNDMjQxMF9VU0JEUkVHKDB4MDI0OCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAzX0RNQV9UVENfTAlTM0MyNDEwX1VTQkRSRUcoMHgwMjRjKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDNfRE1BX1RUQ19NCVMzQzI0MTBfVVNCRFJFRygweDAyNTApCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQM19ETUFfVFRDX0gJUzNDMjQxMF9VU0JEUkVHKDB4MDI1NCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX0NPTgkJUzNDMjQxMF9VU0JEUkVHKDB4MDI1OCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9VTklUCVMzQzI0MTBfVVNCRFJFRygweDAyNWMpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfRklGTwlTM0MyNDEwX1VTQkRSRUcoMHgwMjYwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDRfRE1BX1RUQ19MCVMzQzI0MTBfVVNCRFJFRygweDAyNjQpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQNF9ETUFfVFRDX00JUzNDMjQxMF9VU0JEUkVHKDB4MDI2OCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVA0X0RNQV9UVENfSAlTM0MyNDEwX1VTQkRSRUcoMHgwMjZjKQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE3OCkKKworLyogaW5kZXhlZCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE4MCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE4NCkKKworI2RlZmluZSBTM0MyNDEwX1VEQ19JTl9DU1IxX1JFRwkJUzNDMjQxMF9VU0JEUkVHKDB4MDE4NCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5fQ1NSMl9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxODgpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfT1VUX0NTUjFfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxOTApCisjZGVmaW5lIFMzQzI0MTBfVURDX09VVF9DU1IyX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTk0KQorI2RlZmluZSBTM0MyNDEwX1VEQ19PVVRfRklGT19DTlQxX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTk4KQorI2RlZmluZSBTM0MyNDEwX1VEQ19PVVRfRklGT19DTlQyX1JFRwlTM0MyNDEwX1VTQkRSRUcoMHgwMTljKQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0ZVTkNBRERSX1VQREFURQkoMSA8PCA3KQorCisjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9JU09VUAkJKDEgPDwgNykgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRVNFVAkJKDEgPDwgMykgLyogUiAgICovCisjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRVNVTUUJCSgxIDw8IDIpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19QV1JfU1VTUEVORAkJKDEgPDwgMSkgLyogUiAgICovCisjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9FTlNVU1BFTkQJKDEgPDwgMCkgLyogUi9XICovCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfUFdSX0RFRkFVTFQJCSgweDAwKQorCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVF9FUDQJCSgxIDw8IDQpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMwkJKDEgPDwgMykgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRfRVAyCQkoMSA8PCAyKSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVF9FUDEJCSgxIDw8IDEpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5UX0VQMAkJKDEgPDwgMCkgLyogUi9XIChjbGVhciBvbmx5KSAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVF9SRVNFVAkoMSA8PCAyKSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX1VTQklOVF9SRVNVTUUJKDEgPDwgMSkgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19VU0JJTlRfU1VTUEVORAkoMSA8PCAwKSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDQJCSgxIDw8IDQpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRFX0VQMwkJKDEgPDwgMykgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOVEVfRVAyCQkoMSA8PCAyKSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSU5URV9FUDEJCSgxIDw8IDEpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JTlRFX0VQMAkJKDEgPDwgMCkgLyogUi9XICovCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5URV9SRVNFVAkoMSA8PCAyKSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfVVNCSU5URV9TVVNQRU5ECSgxIDw8IDApIC8qIFIvVyAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMAkJKDB4MDApCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMQkJKDB4MDEpCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMgkJKDB4MDIpCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQMwkJKDB4MDMpCisjZGVmaW5lIFMzQzI0MTBfVURDX0lOREVYX0VQNAkJKDB4MDQpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfQ0xSRFQJCSgxIDw8IDYpIC8qIFIvVyAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19JQ1NSMV9TRU5UU1RMCSgxIDw8IDUpIC8qIFIvVyAoY2xlYXIgb25seSkgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfU0VORFNUTAkoMSA8PCA0KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjFfRkZMVVNICSgxIDw8IDMpIC8qIFcgICAoc2V0IG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX1VORFJVTgkoMSA8PCAyKSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IxX1BLVFJEWQkoMSA8PCAwKSAvKiBSL1cgKHNldCBvbmx5KSAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX0FVVE9TRVQJKDEgPDwgNykgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX0lTTwkJKDEgPDwgNikgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX0lDU1IyX01PREVJTgkoMSA8PCA1KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfSUNTUjJfRE1BSUVOCSgxIDw8IDQpIC8qIFIvVyAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX0NMUkRUCQkoMSA8PCA3KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfU0VOVFNUTAkoMSA8PCA2KSAvKiBSL1cgKGNsZWFyIG9ubHkpICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX1NFTkRTVEwJKDEgPDwgNSkgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IxX0ZGTFVTSAkoMSA8PCA0KSAvKiBSL1cgKi8KKyNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjFfREVSUk9SCSgxIDw8IDMpIC8qIFIgICAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9PVlJSVU4JKDEgPDwgMikgLyogUi9XIChjbGVhciBvbmx5KSAqLworI2RlZmluZSBTM0MyNDEwX1VEQ19PQ1NSMV9QS1RSRFkJKDEgPDwgMCkgLyogUi9XIChjbGVhciBvbmx5KSAqLworCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0FVVE9DTFIJKDEgPDwgNykgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0lTTwkJKDEgPDwgNikgLyogUi9XICovCisjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0RNQUlFTgkoMSA8PCA1KSAvKiBSL1cgKi8KKworI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX09QS1JEWQkoMSA8PCAwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX0lQS1JEWQkoMSA8PCAxKQorI2RlZmluZSBTM0MyNDEwX1VEQ19FUDBfQ1NSX1NFTlRTVEwJKDEgPDwgMikKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9ERQkJKDEgPDwgMykKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9TRQkJKDEgPDwgNCkKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9TRU5EU1RMCSgxIDw8IDUpCisjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfU09QS1RSRFkJKDEgPDwgNikKKyNkZWZpbmUgUzNDMjQxMF9VRENfRVAwX0NTUl9TU0UJCSgxIDw8IDcpCisKKyNkZWZpbmUgUzNDMjQxMF9VRENfTUFYUF84CQkoMSA8PCAwKQorI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzE2CQkoMSA8PCAxKQorI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzMyCQkoMSA8PCAyKQorI2RlZmluZSBTM0MyNDEwX1VEQ19NQVhQXzY0CQkoMSA8PCAzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVzZXQuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9yZXNldC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvcmVzZXQuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX19QTEFUX1NBTVNVTkdfUkVTRVRfSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19SRVNFVF9IIF9fRklMRV9fCisKK2V4dGVybiB2b2lkICgqczVwX3Jlc2V0X2hvb2spKHZvaWQpOworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfUkVTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MtZG1hLXBsMzMwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1kbWEtcGwzMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwNzQ0Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1kbWEtcGwzMzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgotICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZglfX1MzQ19ETUFfUEwzMzBfSF8KLSNkZWZpbmUJX19TM0NfRE1BX1BMMzMwX0hfCi0KLSNkZWZpbmUgUzNDMjQxMF9ETUFGX0FVVE9TVEFSVAkJKDEgPDwgMCkKLSNkZWZpbmUgUzNDMjQxMF9ETUFGX0NJUkNVTEFSCQkoMSA8PCAxKQotCi0vKgotICogUEwzMzAgY2FuIGFzc2lnbiBhbnkgY2hhbm5lbCB0byBjb21tdW5pY2F0ZSB3aXRoCi0gKiBhbnkgb2YgdGhlIHBlcmlwaGVyYWxzIGF0dGNoZWQgdG8gdGhlIERNQUMuCi0gKiBGb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kgYWNyb3NzIGNsaWVudCBkcml2ZXJzLAotICogV2Uga2VlcCB0aGUgY2hhbm5lbCBuYW1lcyB1bmNoYW5nZWQgYW5kIG9ubHkgYWRkCi0gKiBtaXNzaW5nIHBlcmlwaGVyYWxzIGFyZSBhZGRlZC4KLSAqIE9yZGVyIGlzIG5vdCBpbXBvcnRhbnQgc2luY2UgUzNDIFBMMzMwIEFQSSBkcml2ZXIKLSAqIHVzZSB0aGVzZSBqdXN0IGFzIElEcy4KLSAqLwotZW51bSBkbWFfY2ggewotCURNQUNIX1VBUlQwX1JYLAotCURNQUNIX1VBUlQwX1RYLAotCURNQUNIX1VBUlQxX1JYLAotCURNQUNIX1VBUlQxX1RYLAotCURNQUNIX1VBUlQyX1JYLAotCURNQUNIX1VBUlQyX1RYLAotCURNQUNIX1VBUlQzX1JYLAotCURNQUNIX1VBUlQzX1RYLAotCURNQUNIX1VBUlQ0X1JYLAotCURNQUNIX1VBUlQ0X1RYLAotCURNQUNIX1VBUlQ1X1JYLAotCURNQUNIX1VBUlQ1X1RYLAotCURNQUNIX1VTSV9SWCwKLQlETUFDSF9VU0lfVFgsCi0JRE1BQ0hfSVJEQSwKLQlETUFDSF9JMlMwX1JYLAotCURNQUNIX0kyUzBfVFgsCi0JRE1BQ0hfSTJTMFNfVFgsCi0JRE1BQ0hfSTJTMV9SWCwKLQlETUFDSF9JMlMxX1RYLAotCURNQUNIX0kyUzJfUlgsCi0JRE1BQ0hfSTJTMl9UWCwKLQlETUFDSF9TUEkwX1JYLAotCURNQUNIX1NQSTBfVFgsCi0JRE1BQ0hfU1BJMV9SWCwKLQlETUFDSF9TUEkxX1RYLAotCURNQUNIX1NQSTJfUlgsCi0JRE1BQ0hfU1BJMl9UWCwKLQlETUFDSF9BQzk3X01JQ0lOLAotCURNQUNIX0FDOTdfUENNSU4sCi0JRE1BQ0hfQUM5N19QQ01PVVQsCi0JRE1BQ0hfRVhURVJOQUwsCi0JRE1BQ0hfUFdNLAotCURNQUNIX1NQRElGLAotCURNQUNIX0hTSV9SWCwKLQlETUFDSF9IU0lfVFgsCi0JRE1BQ0hfUENNMF9UWCwKLQlETUFDSF9QQ00wX1JYLAotCURNQUNIX1BDTTFfVFgsCi0JRE1BQ0hfUENNMV9SWCwKLQlETUFDSF9QQ00yX1RYLAotCURNQUNIX1BDTTJfUlgsCi0JRE1BQ0hfTVNNX1JFUTMsCi0JRE1BQ0hfTVNNX1JFUTIsCi0JRE1BQ0hfTVNNX1JFUTEsCi0JRE1BQ0hfTVNNX1JFUTAsCi0JRE1BQ0hfU0xJTUJVUzBfUlgsCi0JRE1BQ0hfU0xJTUJVUzBfVFgsCi0JRE1BQ0hfU0xJTUJVUzBBVVhfUlgsCi0JRE1BQ0hfU0xJTUJVUzBBVVhfVFgsCi0JRE1BQ0hfU0xJTUJVUzFfUlgsCi0JRE1BQ0hfU0xJTUJVUzFfVFgsCi0JRE1BQ0hfU0xJTUJVUzJfUlgsCi0JRE1BQ0hfU0xJTUJVUzJfVFgsCi0JRE1BQ0hfU0xJTUJVUzNfUlgsCi0JRE1BQ0hfU0xJTUJVUzNfVFgsCi0JRE1BQ0hfU0xJTUJVUzRfUlgsCi0JRE1BQ0hfU0xJTUJVUzRfVFgsCi0JRE1BQ0hfU0xJTUJVUzVfUlgsCi0JRE1BQ0hfU0xJTUJVUzVfVFgsCi0JLyogRU5EIE1hcmtlciwgYWxzbyB1c2VkIHRvIGRlbm90ZSBhIHJlc2VydmVkIGNoYW5uZWwgKi8KLQlETUFDSF9NQVgsCi19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgczNjX2RtYV9oYXNfY2lyY3VsYXIodm9pZCkKLXsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0KLSNlbmRpZgkvKiBfX1MzQ19ETUFfUEwzMzBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjLXBsMzMwLXBkYXRhLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1wbDMzMC1wZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjVlMmE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjLXBsMzMwLXBkYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYy1wbDMzMC1wZGF0YS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX19TM0NfUEwzMzBfUERBVEFfSAotI2RlZmluZSBfX1MzQ19QTDMzMF9QREFUQV9ICi0KLSNpbmNsdWRlIDxwbGF0L3MzYy1kbWEtcGwzMzAuaD4KLQotLyoKLSAqIEV2ZXJ5IFBMMzMwIERNQUMgaGFzIG1heCAzMiBwZXJpcGhlcmFsIGludGVyZmFjZXMsCi0gKiBvZiB3aGljaCBzb21lIG1heSBiZSBub3QgYmUgcmVhbGx5IHVzZWQgaW4geW91cgotICogRE1BQydzIGNvbmZpZ3VyYXRpb24uCi0gKiBQb3B1bGF0ZSB0aGlzIGFycmF5IG9mIDMyIHBlcmkgaS9mcyB3aXRoIHJlbGV2YW50Ci0gKiBjaGFubmVsIElEcyBmb3IgdXNlZCBwZXJpIGkvZiBhbmQgRE1BQ0hfTUFYIGZvcgotICogdGhvc2UgdW51c2VkLgotICoKLSAqIFRoZSBwbGF0Zm9ybXMganVzdCBuZWVkIHRvIHByb3ZpZGUgdGhpcyBpbmZvCi0gKiB0byB0aGUgUzNDIERNQSBBUEkgZHJpdmVyIGZvciBQTDMzMC4KLSAqLwotc3RydWN0IHMzY19wbDMzMF9wbGF0ZGF0YSB7Ci0JZW51bSBkbWFfY2ggcGVyaVszMl07Ci19OwotCi0jZW5kaWYgLyogX19TM0NfUEwzMzBfUERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTg2NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKQEAgLTAsMCArMSwzMyBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDEwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzI0MTAgbWFjaGluZSBkaXJlY3RvcnkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTAKKworZXh0ZXJuICBpbnQgczNjMjQxMF9pbml0KHZvaWQpOworZXh0ZXJuICBpbnQgczNjMjQxMGFfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMF9tYXBfaW8odm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCisjZWxzZQorI2RlZmluZSBzM2MyNDEwX2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczNjMjQxMF9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgczNjMjQxMF9tYXBfaW8gTlVMTAorI2RlZmluZSBzM2MyNDEwX2luaXQgTlVMTAorI2RlZmluZSBzM2MyNDEwYV9pbml0IE5VTEwKKyNlbmRpZgorCitleHRlcm4gaW50IHMzYzI0MTBfYmFzZWNsa19hZGQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2ZkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaApAQCAtMCwwICsxLDI5IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTIuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczNjMjQxMiBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyCisKK2V4dGVybiAgaW50IHMzYzI0MTJfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxMl9tYXBfaW8odm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCitleHRlcm4gIGludCBzM2MyNDEyX2Jhc2VjbGtfYWRkKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgczNjMjQxMl9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzI0MTJfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzI0MTJfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjMjQxMl9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDE2LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0MTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzY0Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDE2LmgKQEAgLTAsMCArMSwzMSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDE2LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgWWF1aGVuIEtoYXJ1emh5IDxqZWtob3JAZ21haWwuY29tPgorICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2MyNDE2IGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0MTYKKworc3RydWN0IHMzYzI0MTBfdWFydGNmZzsKKworZXh0ZXJuICBpbnQgczNjMjQxNl9pbml0KHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDE2X21hcF9pbyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxNl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworZXh0ZXJuIHZvaWQgczNjMjQxNl9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKK2V4dGVybiAgaW50IHMzYzI0MTZfYmFzZWNsa19hZGQodm9pZCk7CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0MTZfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2MyNDE2X2luaXRfdWFydHMgTlVMTAorI2RlZmluZSBzM2MyNDE2X21hcF9pbyBOVUxMCisjZGVmaW5lIHMzYzI0MTZfaW5pdCBOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0My5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDQzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhZTFhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0My5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjMjQ0My5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzI0NDMgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MworCitzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnOworCitleHRlcm4gIGludCBzM2MyNDQzX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0NDNfbWFwX2lvKHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDQzX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworCitleHRlcm4gdm9pZCBzM2MyNDQzX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworZXh0ZXJuICBpbnQgczNjMjQ0M19iYXNlY2xrX2FkZCh2b2lkKTsKKworI2Vsc2UKKyNkZWZpbmUgczNjMjQ0M19pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzI0NDNfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzI0NDNfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjMjQ0M19pbml0IE5VTEwKKyNlbmRpZgorCisvKiBjb21tb24gY29kZSB1c2VkIGJ5IHMzYzI0NDMgYW5kIG90aGVycy4KKyAqIG5vdGUsIG5vdCB0byBiZSB1c2VkIG91dHNpZGUgb2YgYXJjaC9hcm0vbWFjaC1zM2MqICovCisKK3N0cnVjdCBjbGs7CS8qIHNvbWUgZmlsZXMgZG9uJ3QgbmVlZCBjbGsuaCBvdGhlcndpc2UgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpwbGxfZm4pKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBiYXNlKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0M19jb21tb25fc2V0dXBfY2xvY2tzKHBsbF9mbiBnZXRfbXBsbCk7CitleHRlcm4gdm9pZCBzM2MyNDQzX2NvbW1vbl9pbml0X2Nsb2NrcyhpbnQgeHRhbCwgcGxsX2ZuIGdldF9tcGxsLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRpdnMsIGludCBucl9kaXZzLAorCQkJCSAgICAgICBpbnQgZGl2bWFzayk7CisKK2V4dGVybiBpbnQgczNjMjQ0M19jbGtjb25fZW5hYmxlX2goc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKK2V4dGVybiBpbnQgczNjMjQ0M19jbGtjb25fZW5hYmxlX3Aoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKK2V4dGVybiBpbnQgczNjMjQ0M19jbGtjb25fZW5hYmxlX3Moc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKKworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19lcGxscmVmOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19lc3lzY2xrOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfY2xrIGNsa19tc3lzY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDR4LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzI0NHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBjOTYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKQEAgLTAsMCArMSw0MiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2MyNDR4LmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgUzNDMjQ0MCBhbmQgUzNDMjQ0MiBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0NDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDQyKQorCitleHRlcm4gdm9pZCBzM2MyNDR4X21hcF9pbyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0eF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0eF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0NHhfaW5pdF9jbG9ja3MgTlVMTAorI2RlZmluZSBzM2MyNDR4X2luaXRfdWFydHMgTlVMTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzI0NDAKK2V4dGVybiAgaW50IHMzYzI0NDBfaW5pdCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgczNjMjQ0MF9tYXBfaW8odm9pZCk7CisjZWxzZQorI2RlZmluZSBzM2MyNDQwX2luaXQgTlVMTAorI2RlZmluZSBzM2MyNDQwX21hcF9pbyBOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQ0MgorZXh0ZXJuICBpbnQgczNjMjQ0Ml9pbml0KHZvaWQpOworCitleHRlcm4gdm9pZCBzM2MyNDQyX21hcF9pbyh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHMzYzI0NDJfaW5pdCBOVUxMCisjZGVmaW5lIHMzYzI0NDJfbWFwX2lvIE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDAwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q0MjhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDAwLmgKQEAgLTAsMCArMSwzNiBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zM2M2NDAwLmgKKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2M2NDAwIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qIENvbW1vbiBpbml0IGNvZGUgZm9yIFMzQzY0MDAgcmVsYXRlZCBTb0NzICovCisKK2V4dGVybiB2b2lkIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworZXh0ZXJuIHZvaWQgczNjNjQwMF9zZXR1cF9jbG9ja3Modm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzY0eHhfcmVnaXN0ZXJfY2xvY2tzKHVuc2lnbmVkIGxvbmcgeHRhbCwgdW5zaWduZWQgYXJtY2xrX2xpbWl0KTsKKworI2lmZGVmIENPTkZJR19DUFVfUzNDNjQwMAorCitleHRlcm4gIGludCBzM2M2NDAwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzM2M2NDAwX2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQwMF9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBzM2M2NDAwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworI2RlZmluZSBzM2M2NDAwX2luaXRfdWFydHMgczNjNjQwMF9jb21tb25faW5pdF91YXJ0cworCisjZWxzZQorI2RlZmluZSBzM2M2NDAwX2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczNjNjQwMF9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgczNjNjQwMF9tYXBfaW8gTlVMTAorI2RlZmluZSBzM2M2NDAwX2luaXQgTlVMTAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczNjNjQxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTY2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaApAQCAtMCwwICsxLDI5IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3MzYzY0MTAuaAorICoKKyAqIENvcHlyaWdodCAyMDA4IE9wZW5tb2tvLCAgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKglodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIEhlYWRlciBmaWxlIGZvciBzM2M2NDEwIGNwdSBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZmRlZiBDT05GSUdfQ1BVX1MzQzY0MTAKKworZXh0ZXJuICBpbnQgczNjNjQxMF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHMzYzY0MTBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczNjNjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczNjNjQxMF9pbml0X3VhcnRzIHMzYzY0MDBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczNjNjQxMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzY0MTBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzY0MTBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjNjQxMF9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXAtY2xvY2suaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0YmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLWNsb2NrLmgKQEAgLTAsMCArMSw1NSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXAtY2xvY2suaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEhlYWRlciBmaWxlIGZvciBzNXAgY2xvY2sgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfUzVQX0NMT0NLX0gKKyNkZWZpbmUgX19BU01fUExBVF9TNVBfQ0xPQ0tfSCBfX0ZJTEVfXworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNkZWZpbmUgR0VUX0RJVihjbGssIGZpZWxkKSAoKCgoY2xrKSAmIGZpZWxkIyNfTUFTSykgPj4gZmllbGQjI19TSElGVCkgKyAxKQorCisjZGVmaW5lIGNsa19maW5fYXBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fbXBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fZXBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fZHBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5fdnBsbCBjbGtfZXh0X3h0YWxfbXV4CisjZGVmaW5lIGNsa19maW5faHBsbCBjbGtfZXh0X3h0YWxfbXV4CisKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19leHRfeHRhbF9tdXg7CitleHRlcm4gc3RydWN0IGNsayBjbGtfeHVzYnh0aTsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa180OG07CitleHRlcm4gc3RydWN0IGNsayBzNXBfY2xrXzI3bTsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X2FwbGw7CitleHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF9tcGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2ZvdXRfZXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19mb3V0X2RwbGw7CitleHRlcm4gc3RydWN0IGNsayBjbGtfZm91dF92cGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2FybTsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa192cGxsOworCitleHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfYXBsbDsKK2V4dGVybiBzdHJ1Y3QgY2xrc3JjX3NvdXJjZXMgY2xrX3NyY19tcGxsOworZXh0ZXJuIHN0cnVjdCBjbGtzcmNfc291cmNlcyBjbGtfc3JjX2VwbGw7CitleHRlcm4gc3RydWN0IGNsa3NyY19zb3VyY2VzIGNsa19zcmNfZHBsbDsKKworZXh0ZXJuIGludCBzNXBfZ2F0ZWN0cmwodm9pZCBfX2lvbWVtICpyZWcsIHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CisKKy8qIENvbW1vbiBFUExMIG9wZXJhdGlvbnMgZm9yIFM1UCBwbGF0Zm9ybSAqLworZXh0ZXJuIGludCBzNXBfZXBsbF9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHM1cF9lcGxsX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsayk7CisKKy8qIFNQRElGIGNsayBvcGVyYXRpb25zIGNvbW1vbiBmb3IgUzVQQzEwMC9WMjEwL0MxMTAgYW5kIEV4eW5vczQgKi8KK2V4dGVybiBpbnQgczVwX3NwZGlmX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHM1cF9zcGRpZl9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOworCitleHRlcm4gc3RydWN0IGNsa19vcHMgczVwX3NjbGtfc3BkaWZfb3BzOworI2VuZGlmIC8qIF9fQVNNX1BMQVRfUzVQX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTcwYWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXAtdGltZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwLXRpbWUuaAorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwIHRpbWUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX1BMQVRfUzVQX1RJTUVfSAorI2RlZmluZSBfX0FTTV9QTEFUX1M1UF9USU1FX0ggX19GSUxFX18KKworLyogUzVQIEhSLVRpbWVyIENsb2NrIG1vZGUgKi8KK2VudW0gczVwX3RpbWVyX21vZGUgeworCVM1UF9QV00wLAorCVM1UF9QV00xLAorCVM1UF9QV00yLAorCVM1UF9QV00zLAorCVM1UF9QV000LAorfTsKKworc3RydWN0IHM1cF90aW1lcl9zb3VyY2UgeworCXVuc2lnbmVkIGludCBldmVudF9pZDsKKwl1bnNpZ25lZCBpbnQgc291cmNlX2lkOworfTsKKworLyogQmUgYWJsZSB0byBzbGVlcCBmb3IgYXRsZWFzdCA0IHNlY29uZHMgKHVzdWFsbHkgbW9yZSkgKi8KKyNkZWZpbmUgUzVQVElNRVJfTUlOX1JBTkdFCTQKKworI2RlZmluZSBUQ05UX01BWAkJMHhmZmZmZmZmZgorI2RlZmluZSBOT05fUEVSSU9ESUMJCTAKKyNkZWZpbmUgUEVSSU9ESUMJCTEKKworZXh0ZXJuIHZvaWQgX19pbml0IHM1cF9zZXRfdGltZXJfc291cmNlKGVudW0gczVwX3RpbWVyX21vZGUgZXZlbnQsCisJCQkJCWVudW0gczVwX3RpbWVyX21vZGUgc291cmNlKTsKK2V4dGVybglzdHJ1Y3Qgc3lzX3RpbWVyIHM1cF90aW1lcjsKKyNlbmRpZiAvKiBfX0FTTV9QTEFUX1M1UF9USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXA2NDQwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NWViYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwNjQ0MC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwNjQ0MCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisgLyogQ29tbW9uIGluaXQgY29kZSBmb3IgUzVQNjQ0MCByZWxhdGVkIFNvQ3MgKi8KKworZXh0ZXJuIHZvaWQgczVwNjQ0MF9yZWdpc3Rlcl9jbG9ja3Modm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDQwX3NldHVwX2Nsb2Nrcyh2b2lkKTsKKworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ0MAorCitleHRlcm4gIGludCBzNXA2NHgwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDQwX2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwNjQ0MF9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDQwX2luaXRfY2xvY2tzKGludCB4dGFsKTsKKworZXh0ZXJuIHZvaWQgczVwNjQ0MF9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKKworI2Vsc2UKKyNkZWZpbmUgczVwNjQ0MF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHM1cDY0NDBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHM1cDY0NDBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczVwNjR4MF9pbml0IE5VTEwKKyNlbmRpZgorCisvKiBTNVA2NDQwIHRpbWVyICovCisKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHM1cDY0NDBfdGltZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwNjQ1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjVmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaApAQCAtMCwwICsxLDM2IEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cDY0NTAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwNjQ1MCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBDb21tb24gaW5pdCBjb2RlIGZvciBTNVA2NDUwIHJlbGF0ZWQgU29DcyAqLworCitleHRlcm4gdm9pZCBzNXA2NDUwX3JlZ2lzdGVyX2Nsb2Nrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cDY0NTBfc2V0dXBfY2xvY2tzKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDUwCisKK2V4dGVybiAgaW50IHM1cDY0eDBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cDY0NTBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdm9pZCBzNXA2NDUwX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cDY0NTBfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCitleHRlcm4gdm9pZCBzNXA2NDUwX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pOworCisjZWxzZQorI2RlZmluZSBzNXA2NDUwX2luaXRfY2xvY2tzIE5VTEwKKyNkZWZpbmUgczVwNjQ1MF9pbml0X3VhcnRzIE5VTEwKKyNkZWZpbmUgczVwNjQ1MF9tYXBfaW8gTlVMTAorI2RlZmluZSBzNXA2NHgwX2luaXQgTlVMTAorI2VuZGlmCisKKy8qIFM1UDY0NTAgdGltZXIgKi8KKworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgczVwNjQ1MF90aW1lcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwYzEwMC5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXBjMTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyMWFlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwYzEwMC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwYzEwMC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwYzEwMCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBDb21tb24gaW5pdCBjb2RlIGZvciBTNVBDMTAwIHJlbGF0ZWQgU29DcyAqLworCitleHRlcm4gdm9pZCBzNXBjMTAwX2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKK2V4dGVybiB2b2lkIHM1cGMxMDBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwYzEwMF9zZXR1cF9jbG9ja3Modm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UEMxMDAKKworZXh0ZXJuICBpbnQgczVwYzEwMF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczVwYzEwMF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cGMxMDBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwYzEwMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczVwYzEwMF9pbml0X3VhcnRzIHM1cGMxMDBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczVwYzEwMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHM1cGMxMDBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHM1cGMxMDBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczVwYzEwMF9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zNXB2MjEwLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3M1cHYyMTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJjNmJlNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwdjIxMC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvczVwdjIxMC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgczVwdjIxMCBjcHUgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisvKiBDb21tb24gaW5pdCBjb2RlIGZvciBTNVBWMjEwIHJlbGF0ZWQgU29DcyAqLworCitleHRlcm4gdm9pZCBzNXB2MjEwX2NvbW1vbl9pbml0X3VhcnRzKHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgKmNmZywgaW50IG5vKTsKK2V4dGVybiB2b2lkIHM1cHYyMTBfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwdjIxMF9zZXR1cF9jbG9ja3Modm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UFYyMTAKKworZXh0ZXJuICBpbnQgczVwdjIxMF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczVwdjIxMF9pbml0X2lycSh2b2lkKTsKK2V4dGVybiB2b2lkIHM1cHYyMTBfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgczVwdjIxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CisKKyNkZWZpbmUgczVwdjIxMF9pbml0X3VhcnRzIHM1cHYyMTBfY29tbW9uX2luaXRfdWFydHMKKworI2Vsc2UKKyNkZWZpbmUgczVwdjIxMF9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHM1cHYyMTBfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHM1cHYyMTBfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczVwdjIxMF9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zZGhjaS5oIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zZGhjaS5oCmluZGV4IDA1OGUwOTYuLmU3YjNjNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc2RoY2kuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3NkaGNpLmgKQEAgLTU1LDEwICs1NSw2IEBACiAgKgkJIGNkX3R5cGUgPT0gUzNDX1NESENJX0NEX0dQSU8KICAqIEBleHRfY2RfZ3Bpb19pbnZlcnQ6IGludmVydCB2YWx1ZXMgZm9yIGV4dGVybmFsIENEIGdwaW8gbGluZQogICogQGNmZ19ncGlvOiBDb25maWd1cmUgdGhlIEdQSU8gZm9yIGEgc3BlY2lmaWMgY2FyZCBiaXQtd2lkdGgKLSAqIEBjZmdfY2FyZDogQ29uZmlndXJlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3BlY2lmaWMgY2FyZCBhbmQgc3BlZWQuIFRoaXMKLSAqICAgICAgICAgICAgaXMgbmVjZXNzYXJ5IHRoZSBjb250cm9sbGVycyBhbmQvb3IgR1BJTyBibG9ja3MgcmVxdWlyZSB0aGUKLSAqCSAgICAgIGNoYW5naW5nIG9mIGRyaXZlci1zdHJlbmd0aCBhbmQgb3RoZXIgY29udHJvbHMgZGVwZW5kZW50IG9uCi0gKgkgICAgICB0aGUgY2FyZCBhbmQgc3BlZWQgb2Ygb3BlcmF0aW9uLgogICoKICAqIEluaXRpYWxpc2F0aW9uIGRhdGEgc3BlY2lmaWMgdG8gZWl0aGVyIHRoZSBtYWNoaW5lIG9yIHRoZSBwbGF0Zm9ybQogICogZm9yIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHVzZSBvciBjYWxsLWJhY2sgd2hlbiBjb25maWd1cmluZyBncGlvIG9yCkBAIC04MCwxMiArNzYsMTUgQEAKIAkJCQkJCSAgICAgIGludCBzdGF0ZSkpOwogCiAJdm9pZAkoKmNmZ19ncGlvKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIGludCB3aWR0aCk7Ci0Jdm9pZAkoKmNmZ19jYXJkKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgdm9pZCBfX2lvbWVtICpyZWdiYXNlLAotCQkJICAgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkgICAgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIH07CiAKKy8qIHMzY19zZGhjaV9zZXRfcGxhdGRhdGEoKSAtIGNvbW1vbiBoZWxwZXIgZm9yIHNldHRpbmcgU0RIQ0kgcGxhdGZvcm0gZGF0YQorICogQHBkOiBUaGUgZGVmYXVsdCBwbGF0Zm9ybSBkYXRhIGZvciB0aGlzIGRldmljZS4KKyAqIEBzZXQ6IFBvaW50ZXIgdG8gdGhlIHBsYXRmb3JtIGRhdGEgdG8gZmlsbCBpbi4KKyAqLworZXh0ZXJuIHZvaWQgczNjX3NkaGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCwKKwkJCQkgICAgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqc2V0KTsKKwogLyoqCiAgKiBzM2Nfc2RoY2kwX3NldF9wbGF0ZGF0YSAtIFNldCBwbGF0Zm9ybSBkYXRhIGZvciBTM0MgU0RIQ0kgZGV2aWNlLgogICogQHBkOiBQbGF0Zm9ybSBkYXRhIHRvIHJlZ2lzdGVyIHRvIGRldmljZS4KQEAgLTEzMiwxNyArMTMxLDExIEBACiAjaWZkZWYgQ09ORklHX1MzQzI0MTZfU0VUVVBfU0RIQ0kKIGV4dGVybiBjaGFyICpzM2MyNDE2X2hzbW1jX2Nsa3NyY3NbNF07CiAKLWV4dGVybiB2b2lkIHMzYzI0MTZfc2V0dXBfc2RoY2lfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCQkgICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJCSAgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJCSAgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDE2X2RlZmF1bHRfc2RoY2kwKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2MyNDE2X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2MyNDE2X3NldHVwX3NkaGNpMF9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzI0MTZfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYgLyogQ09ORklHX1MzQ19ERVZfSFNNTUMgKi8KIH0KIApAQCAtMTUxLDcgKzE0NCw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMxCiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczNjMjQxNl9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczNjMjQxNl9zZXR1cF9zZGhjaTFfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzM2MyNDE2X3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmIC8qIENPTkZJR19TM0NfREVWX0hTTU1DMSAqLwogfQogCkBAIC0xNjUsMTcgKzE1NywxMSBAQAogI2lmZGVmIENPTkZJR19TM0M2NFhYX1NFVFVQX1NESENJCiBleHRlcm4gY2hhciAqczNjNjR4eF9oc21tY19jbGtzcmNzWzRdOwogCi1leHRlcm4gdm9pZCBzM2M2NDAwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJIHZvaWQgX19pb21lbSAqciwKLQkJCQkJIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJCSBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgczNjNjQwMF9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczNjNjR4eF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczNjNjR4eF9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzM2M2NDAwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTE4NCw3ICsxNzAsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0eHhfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0eHhfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0xOTMsMjEgKzE3OCwxNCBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMgogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0eHhfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0eHhfc2V0dXBfc2RoY2kyX2NmZ19ncGlvOwotCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQwMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCi1leHRlcm4gdm9pZCBzM2M2NDEwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJIHZvaWQgX19pb21lbSAqciwKLQkJCQkJIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJCSBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgczNjNjQxMF9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczNjNjR4eF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczNjNjR4eF9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzM2M2NDEwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTIxNiw3ICsxOTQsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHMzYzY0eHhfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHMzYzY0eHhfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczNjNjQxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0yMjUsNyArMjAyLDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzIKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzM2M2NHh4X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzM2M2NHh4X3NldHVwX3NkaGNpMl9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHMzYzY0MTBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMjQ0LDE3ICsyMjAsMTEgQEAKICNpZmRlZiBDT05GSUdfUzVQQzEwMF9TRVRVUF9TREhDSQogZXh0ZXJuIGNoYXIgKnM1cGMxMDBfaHNtbWNfY2xrc3Jjc1s0XTsKIAotZXh0ZXJuIHZvaWQgczVwYzEwMF9zZXR1cF9zZGhjaTBfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCQkgICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJCSAgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJCSAgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzNXBjMTAwX2RlZmF1bHRfc2RoY2kwKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzNXBjMTAwX2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzNXBjMTAwX3NldHVwX3NkaGNpMF9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHM1cGMxMDBfc2V0dXBfc2RoY2kwX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTI2Myw3ICsyMzMsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHM1cGMxMDBfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHM1cGMxMDBfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczVwYzEwMF9zZXR1cF9zZGhjaTBfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMjcyLDcgKzI0MSw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMyCiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczVwYzEwMF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczVwYzEwMF9zZXR1cF9zZGhjaTJfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzNXBjMTAwX3NldHVwX3NkaGNpMF9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0yODgsMTcgKzI1NiwxMSBAQAogI2lmZGVmIENPTkZJR19TNVBWMjEwX1NFVFVQX1NESENJCiBleHRlcm4gY2hhciAqczVwdjIxMF9oc21tY19jbGtzcmNzWzRdOwogCi1leHRlcm4gdm9pZCBzNXB2MjEwX3NldHVwX3NkaGNpX2NmZ19jYXJkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkJICAgdm9pZCBfX2lvbWVtICpyLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLAotCQkJCQkgICBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgczVwdjIxMF9kZWZhdWx0X3NkaGNpMCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DCiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2xvY2tzID0gczVwdjIxMF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzBfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczVwdjIxMF9zZXR1cF9zZGhjaTBfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzNXB2MjEwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTMwNyw3ICsyNjksNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMQogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IHM1cHYyMTBfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMxX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IHM1cHYyMTBfc2V0dXBfc2RoY2kxX2NmZ19ncGlvOwotCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gczVwdjIxMF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0zMTYsNyArMjc3LDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzIKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBzNXB2MjEwX2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMl9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBzNXB2MjEwX3NldHVwX3NkaGNpMl9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IHM1cHYyMTBfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMzI1LDcgKzI4NSw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMzCiAJczNjX2hzbW1jM19kZWZfcGxhdGRhdGEuY2xvY2tzID0gczVwdjIxMF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzNfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gczVwdjIxMF9zZXR1cF9zZGhjaTNfY2ZnX2dwaW87Ci0JczNjX2hzbW1jM19kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBzNXB2MjEwX3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTM0MSwxNyArMzAwLDExIEBACiAjaWZkZWYgQ09ORklHX0VYWU5PUzRfU0VUVVBfU0RIQ0kKIGV4dGVybiBjaGFyICpleHlub3M0X2hzbW1jX2Nsa3NyY3NbNF07CiAKLWV4dGVybiB2b2lkIGV4eW5vczRfc2V0dXBfc2RoY2lfY2ZnX2NhcmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQkJCQkgICB2b2lkIF9faW9tZW0gKnIsCi0JCQkJCSAgIHN0cnVjdCBtbWNfaW9zICppb3MsCi0JCQkJCSAgIHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBleHlub3M0X2RlZmF1bHRfc2RoY2kwKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMKIAlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBleHlub3M0X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jMF9kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBleHlub3M0X3NldHVwX3NkaGNpMF9jZmdfZ3BpbzsKLQlzM2NfaHNtbWMwX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IGV4eW5vczRfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApAQCAtMzYwLDcgKzMxMyw2IEBACiAjaWZkZWYgQ09ORklHX1MzQ19ERVZfSFNNTUMxCiAJczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2xvY2tzID0gZXh5bm9zNF9oc21tY19jbGtzcmNzOwogCXMzY19oc21tYzFfZGVmX3BsYXRkYXRhLmNmZ19ncGlvID0gZXh5bm9zNF9zZXR1cF9zZGhjaTFfY2ZnX2dwaW87Ci0JczNjX2hzbW1jMV9kZWZfcGxhdGRhdGEuY2ZnX2NhcmQgPSBleHlub3M0X3NldHVwX3NkaGNpX2NmZ19jYXJkOwogI2VuZGlmCiB9CiAKQEAgLTM2OSw3ICszMjEsNiBAQAogI2lmZGVmIENPTkZJR19TM0NfREVWX0hTTU1DMgogCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNsb2NrcyA9IGV4eW5vczRfaHNtbWNfY2xrc3JjczsKIAlzM2NfaHNtbWMyX2RlZl9wbGF0ZGF0YS5jZmdfZ3BpbyA9IGV4eW5vczRfc2V0dXBfc2RoY2kyX2NmZ19ncGlvOwotCXMzY19oc21tYzJfZGVmX3BsYXRkYXRhLmNmZ19jYXJkID0gZXh5bm9zNF9zZXR1cF9zZGhjaV9jZmdfY2FyZDsKICNlbmRpZgogfQogCkBAIC0zNzgsNyArMzI5LDYgQEAKICNpZmRlZiBDT05GSUdfUzNDX0RFVl9IU01NQzMKIAlzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YS5jbG9ja3MgPSBleHlub3M0X2hzbW1jX2Nsa3NyY3M7CiAJczNjX2hzbW1jM19kZWZfcGxhdGRhdGEuY2ZnX2dwaW8gPSBleHlub3M0X3NldHVwX3NkaGNpM19jZmdfZ3BpbzsKLQlzM2NfaHNtbWMzX2RlZl9wbGF0ZGF0YS5jZmdfY2FyZCA9IGV4eW5vczRfc2V0dXBfc2RoY2lfY2ZnX2NhcmQ7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zeXNtbXUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlOGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzbW11LmgKQEAgLTAsMCArMSw5NSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zeXNtbXUuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIFNhbXN1bmcgU3lzdGVtIE1NVSBkcml2ZXIgZm9yIFM1UCBwbGF0Zm9ybQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX1NZU01NVV9ICisjZGVmaW5lIF9fUExBVF9TQU1TVU5HX1NZU01NVV9IIF9fRklMRV9fCisKK2VudW0gUzVQX1NZU01NVV9JTlRFUlJVUFRfVFlQRSB7CisJU1lTTU1VX1BBR0VGQVVMVCwKKwlTWVNNTVVfQVJfTVVMVElISVQsCisJU1lTTU1VX0FXX01VTFRJSElULAorCVNZU01NVV9CVVNFUlJPUiwKKwlTWVNNTVVfQVJfU0VDVVJJVFksCisJU1lTTU1VX0FSX0FDQ0VTUywKKwlTWVNNTVVfQVdfU0VDVVJJVFksCisJU1lTTU1VX0FXX1BST1RFQ1RJT04sIC8qIDcgKi8KKwlTWVNNTVVfRkFVTFRTX05VTQorfTsKKworI2lmZGVmIENPTkZJR19TNVBfU1lTVEVNX01NVQorCisjaW5jbHVkZSA8bWFjaC9zeXNtbXUuaD4KKworLyoqCisgKiBzNXBfc3lzbW11X2VuYWJsZSgpIC0gZW5hYmxlIHN5c3RlbSBtbXUgb2YgaXAKKyAqIEBpcHM6IFRoZSBpcCBjb25uZWN0ZWQgc3lzdGVtIG1tdS4KKyAqICNwZ2Q6IEJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgMXN0IGxldmVsIHBhZ2UgdGFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZSBzeXN0ZW0gbW11IHRvIHRyYW5zZmVyIGFkZHJlc3MKKyAqIGZyb20gdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKKyAqLwordm9pZCBzNXBfc3lzbW11X2VuYWJsZShzeXNtbXVfaXBzIGlwcywgdW5zaWduZWQgbG9uZyBwZ2QpOworCisvKioKKyAqIHM1cF9zeXNtbXVfZGlzYWJsZSgpIC0gZGlzYWJsZSBzeXNtbXUgbW11IG9mIGlwCisgKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCisgKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlIHN5c3RlbSBtbXUgdG8gdHJhbnNmZXIgYWRkcmVzcworICogZnJvbSB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcworICovCit2b2lkIHM1cF9zeXNtbXVfZGlzYWJsZShzeXNtbXVfaXBzIGlwcyk7CisKKy8qKgorICogczVwX3N5c21tdV9zZXRfdGFibGViYXNlX3BnZCgpIC0gc2V0IHBhZ2UgdGFibGUgYmFzZSBhZGRyZXNzIHRvIHJlZmVyIHBhZ2UgdGFibGUKKyAqIEBpcHM6IFRoZSBpcCBjb25uZWN0ZWQgc3lzdGVtIG1tdS4KKyAqIEBwZ2Q6IFRoZSBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldCBwYWdlIHRhYmxlIGJhc2UgYWRkcmVzcworICogV2hlbiBzeXN0ZW0gbW11IHRyYW5zZmVyIGFkZHJlc3MgZnJvbSB2aXJ0YXVsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcywKKyAqIHN5c3RlbSBtbXUgcmVmZXIgYWRkcmVzcyBpbmZvcm1hdGlvbiBmcm9tIHBhZ2UgdGFibGUKKyAqLwordm9pZCBzNXBfc3lzbW11X3NldF90YWJsZWJhc2VfcGdkKHN5c21tdV9pcHMgaXBzLCB1bnNpZ25lZCBsb25nIHBnZCk7CisKKy8qKgorICogczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZSgpIC0gZmx1c2ggYWxsIFRMQiBlbnRyeSBpbiBzeXN0ZW0gbW11CisgKiBAaXBzOiBUaGUgaXAgY29ubmVjdGVkIHN5c3RlbSBtbXUuCisgKgorICogVGhpcyBmdW5jdGlvbiBmbHVzaCBhbGwgVExCIGVudHJ5IGluIHN5c3RlbSBtbXUKKyAqLwordm9pZCBzNXBfc3lzbW11X3RsYl9pbnZhbGlkYXRlKHN5c21tdV9pcHMgaXBzKTsKKworLyoqIHM1cF9zeXNtbXVfc2V0X2ZhdWx0X2hhbmRsZXIoKSAtIEZhdWx0IGhhbmRsZXIgZm9yIFN5c3RlbSBNTVVzCisgKiBAaXR5cGU6IHR5cGUgb2YgZmF1bHQuCisgKiBAcGd0YWJsZV9iYXNlOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBwYWdlIHRhYmxlIGJhc2UuIFRoaXMgaXMgMCBpZiBAaXBzIGlzCisgKiAgICAgICAgICAgICAgIFNZU01NVV9CVVNFUlJPUi4KKyAqIEBmYXVsdF9hZGRyOiB0aGUgZGV2aWNlICh2aXJ0dWFsKSBhZGRyZXNzIHRoYXQgdGhlIFN5c3RlbSBNTVUgdHJpZWQgdG8KKyAqICAgICAgICAgICAgIHRyYW5zbGF0ZWQuIFRoaXMgaXMgMCBpZiBAaXBzIGlzIFNZU01NVV9CVVNFUlJPUi4KKyAqIENhbGxlZCB3aGVuIGludGVycnVwdCBvY2N1cnJlZCBieSB0aGUgU3lzdGVtIE1NVXMKKyAqIFRoZSBkZXZpY2UgZHJpdmVycyBvZiBwZXJpcGhlcmFsIGRldmljZXMgdGhhdCBoYXMgYSBTeXN0ZW0gTU1VIGNhbiBpbXBsZW1lbnQKKyAqIGEgZmF1bHQgaGFuZGxlciB0byByZXNvbHZlIGFkZHJlc3MgdHJhbnNsYXRpb24gZmF1bHQgYnkgU3lzdGVtIE1NVS4KKyAqIFRoZSBtZWFuaW5ncyBvZiByZXR1cm4gdmFsdWUgYW5kIHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKworICogcmV0dXJuIHZhbHVlOiBub24temVybyBpZiB0aGUgZmF1bHQgaXMgY29ycmVjdGx5IHJlc29sdmVkLgorICogICAgICAgICB6ZXJvIGlmIHRoZSBmYXVsdCBpcyBub3QgaGFuZGxlZC4KKyAqLwordm9pZCBzNXBfc3lzbW11X3NldF9mYXVsdF9oYW5kbGVyKHN5c21tdV9pcHMgaXBzLAorCQkJaW50ICgqaGFuZGxlcikoZW51bSBTNVBfU1lTTU1VX0lOVEVSUlVQVF9UWVBFIGl0eXBlLAorCQkJCQl1bnNpZ25lZCBsb25nIHBndGFibGVfYmFzZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBmYXVsdF9hZGRyKSk7CisjZWxzZQorI2RlZmluZSBzNXBfc3lzbW11X2VuYWJsZShpcHMsIHBnZCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzNXBfc3lzbW11X2Rpc2FibGUoaXBzKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHM1cF9zeXNtbXVfc2V0X3RhYmxlYmFzZV9wZ2QoaXBzLCBwZ2QpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgczVwX3N5c21tdV90bGJfaW52YWxpZGF0ZShpcHMpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgczVwX3N5c21tdV9zZXRfZmF1bHRfaGFuZGxlcihpcHMsIGhhbmRsZXIpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmIC8qIF9fQVNNX1BMQVRfU1lTTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvc3lzdGVtLXJlc2V0LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3N5c3RlbS1yZXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDhlOTkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9zeXN0ZW0tcmVzZXQuaApAQCAtMCwwICsxLDMxIEBACisvKiBsaW51eC9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3N5c3RlbS1yZXNldC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbQorICoKKyAqIEJhc2VkIG9uIGFyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3lzdGVtLXJlc2V0LmgKKyAqCisgKiBTNVAgLSBTeXN0ZW0gZGVmaW5lIGZvciBhcmNoX3Jlc2V0KCkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPHBsYXQvd2F0Y2hkb2ctcmVzZXQuaD4KKwordm9pZCAoKnM1cF9yZXNldF9ob29rKSh2b2lkKTsKKworc3RhdGljIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKwkvKiBTV1JFU0VUIHN1cHBvcnQgaW4gczVwX3Jlc2V0X2hvb2soKSAqLworCisJaWYgKHM1cF9yZXNldF9ob29rKQorCQlzNXBfcmVzZXRfaG9vaygpOworCisJLyogUGVyZm9ybSByZXNldCB1c2luZyBXYXRjaGRvZyByZXNldAorCSAqIGlmIHRoZXJlIGlzIG5vIHM1cF9yZXNldF9ob29rKCkKKwkgKi8KKworCWFyY2hfd2R0X3Jlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3R2LWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdHYtY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzM0ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC90di1jb3JlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdHYuaAorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKglUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogU2Ftc3VuZyBUViBkcml2ZXIgY29yZSBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19TQU1TVU5HX1BMQVRfVFZfSAorI2RlZmluZSBfX1NBTVNVTkdfUExBVF9UVl9IIF9fRklMRV9fCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgZm9yIHVzZSB3aXRoIHRoZSBjb3JlIHN1cHBvcnQgY29kZSwgc3VjaCBhcworICogdGhlIENQVS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLgorICovCisKKy8qIFJlLWRlZmluZSBkZXZpY2UgbmFtZSB0byBkaWZmZXJlbnRpYXRlIHRoZSBzdWJzeXN0ZW0gaW4gdmFyaW91cyBTb0NzLiAqLworc3RhdGljIGlubGluZSB2b2lkIHM1cF9oZG1pX3NldG5hbWUoY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9UVgorCXM1cF9kZXZpY2VfaGRtaS5uYW1lID0gbmFtZTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX21peGVyX3NldG5hbWUoY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBDT05GSUdfUzVQX0RFVl9UVgorCXM1cF9kZXZpY2VfbWl4ZXIubmFtZSA9IG5hbWU7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHM1cF9zZG9fc2V0bmFtZShjaGFyICpuYW1lKQoreworI2lmZGVmIENPTkZJR19TNVBfREVWX1RWCisJczVwX2RldmljZV9zZG8ubmFtZSA9IG5hbWU7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIF9fU0FNU1VOR19QTEFUX1RWX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdWRjLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjJkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3VkYy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIGFyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvdWRjLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogIENoYW5nZWxvZzoKKyAqCTE0LU1hci0yMDA1CVJUUAlDcmVhdGVkIGZpbGUKKyAqCTAyLUF1Zy0yMDA1CVJUUAlGaWxlIHJlbmFtZQorICoJMDctU2VwLTIwMDUJQkpECU1pbm9yIGNsZWFudXBzLCBjaGFuZ2VkIGNtZCB0byBlbnVtCisgKgkxOC1KYW4tMjAwNwlITVcJQWRkIHBlci1wbGF0Zm9ybSB2YnVzX2RyYXcgZnVuY3Rpb24KKyovCisKKyNpZm5kZWYgX19BU01fQVJNX0FSQ0hfVURDX0gKKyNkZWZpbmUgX19BU01fQVJNX0FSQ0hfVURDX0gKKworZW51bSBzM2MyNDEwX3VkY19jbWRfZSB7CisJUzNDMjQxMF9VRENfUF9FTkFCTEUJPSAxLAkvKiBQdWxsLXVwIGVuYWJsZSAgICAgICAgKi8KKwlTM0MyNDEwX1VEQ19QX0RJU0FCTEUJPSAyLAkvKiBQdWxsLXVwIGRpc2FibGUgICAgICAgKi8KKwlTM0MyNDEwX1VEQ19QX1JFU0VUCT0gMywJLyogVURDIHJlc2V0LCBpbiBjYXNlIG9mICovCit9OworCitzdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvIHsKKwl2b2lkCSgqdWRjX2NvbW1hbmQpKGVudW0gczNjMjQxMF91ZGNfY21kX2UpOworCXZvaWQJKCp2YnVzX2RyYXcpKHVuc2lnbmVkIGludCBtYSk7CisKKwl1bnNpZ25lZCBpbnQgcHVsbHVwX3BpbjsKKwl1bnNpZ25lZCBpbnQgcHVsbHVwX3Bpbl9pbnZlcnRlZDsKKworCXVuc2lnbmVkIGludCB2YnVzX3BpbjsKKwl1bnNpZ25lZCBjaGFyIHZidXNfcGluX2ludmVydGVkOworfTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHMzYzI0eHhfdWRjX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjMjQxMF91ZGNfbWFjaF9pbmZvICopOworCisvKioKKyAqIHMzYzI0eHhfaHN1ZGNfcGxhdGRhdGEgLSBQbGF0Zm9ybSBkYXRhIGZvciBVU0IgSGlnaC1TcGVlZCBnYWRnZXQgY29udHJvbGxlci4KKyAqIEBlcG51bTogTnVtYmVyIG9mIGVuZHBvaW50cyB0byBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGNvbnRyb2xsZXIgZHJpdmVyLgorICogQGdwaW9faW5pdDogUGxhdGZvcm0gc3BlY2lmaWMgVVNCIHJlbGF0ZWQgR1BJTyBpbml0aWFsaXphdGlvbi4KKyAqIEBncGlvX3VuaW5pdDogUGxhdGZvcm0gc3BlY2lmaWMgVVNCIHJlbGV0ZWQgR1BJTyB1bmluaXRpYWx6YXRpb24uCisgKgorICogUmVwcmVzZW50YXRpb24gb2YgcGxhdGZvcm0gZGF0YSBmb3IgdGhlIFMzQzI0WFggVVNCIDIuMCBIaWdoIFNwZWVkIGdhZGdldAorICogY29udHJvbGxlcnMuCisgKi8KK3N0cnVjdCBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhIHsKKwl1bnNpZ25lZCBpbnQJZXBudW07CisJdm9pZAkJKCpncGlvX2luaXQpKHZvaWQpOworCXZvaWQJCSgqZ3Bpb191bmluaXQpKHZvaWQpOworfTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHMzYzI0eHhfaHN1ZGNfc2V0X3BsYXRkYXRhKHN0cnVjdCBzM2MyNHh4X2hzdWRjX3BsYXRkYXRhICpwZCk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUk1fQVJDSF9VRENfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC91c2ItcGh5LmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L3VzYi1waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTliY2RiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC91c2ItcGh5LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yOiBKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fUExBVF9TQU1TVU5HX1VTQl9QSFlfSAorI2RlZmluZSBfX1BMQVRfU0FNU1VOR19VU0JfUEhZX0ggX19GSUxFX18KKworZW51bSBzNXBfdXNiX3BoeV90eXBlIHsKKwlTNVBfVVNCX1BIWV9ERVZJQ0UsCisJUzVQX1VTQl9QSFlfSE9TVCwKK307CisKK2V4dGVybiBpbnQgczVwX3VzYl9waHlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdHlwZSk7CitleHRlcm4gaW50IHM1cF91c2JfcGh5X2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHR5cGUpOworCisjZW5kaWYgLyogX19QTEFUX1NBTVNVTkdfVVNCX1BIWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcGxhdGZvcm1kYXRhLmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcGxhdGZvcm1kYXRhLmMKaW5kZXggN2NmMmUxZS4uY2ViOWZhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BsYXRmb3JtZGF0YS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbGF0Zm9ybWRhdGEuYwpAQCAtMTAsMTAgKzEwLDEyIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9zZGhjaS5oPgogCiB2b2lkIF9faW5pdCAqczNjX3NldF9wbGF0ZGF0YSh2b2lkICpwZCwgc2l6ZV90IHBkc2l6ZSwKIAkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zNSwzICszNywyMiBAQAogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gbnBkOwogCXJldHVybiBucGQ7CiB9CisKK3ZvaWQgczNjX3NkaGNpX3NldF9wbGF0ZGF0YShzdHJ1Y3QgczNjX3NkaGNpX3BsYXRkYXRhICpwZCwKKwkJCSAgICAgc3RydWN0IHMzY19zZGhjaV9wbGF0ZGF0YSAqc2V0KQoreworCXNldC0+Y2RfdHlwZSA9IHBkLT5jZF90eXBlOworCXNldC0+ZXh0X2NkX2luaXQgPSBwZC0+ZXh0X2NkX2luaXQ7CisJc2V0LT5leHRfY2RfY2xlYW51cCA9IHBkLT5leHRfY2RfY2xlYW51cDsKKwlzZXQtPmV4dF9jZF9ncGlvID0gcGQtPmV4dF9jZF9ncGlvOworCXNldC0+ZXh0X2NkX2dwaW9faW52ZXJ0ID0gcGQtPmV4dF9jZF9ncGlvX2ludmVydDsKKworCWlmIChwZC0+bWF4X3dpZHRoKQorCQlzZXQtPm1heF93aWR0aCA9IHBkLT5tYXhfd2lkdGg7CisJaWYgKHBkLT5jZmdfZ3BpbykKKwkJc2V0LT5jZmdfZ3BpbyA9IHBkLT5jZmdfZ3BpbzsKKwlpZiAocGQtPmhvc3RfY2FwcykKKwkJc2V0LT5ob3N0X2NhcHMgfD0gcGQtPmhvc3RfY2FwczsKKwlpZiAocGQtPmNsa190eXBlKQorCQlzZXQtPmNsa190eXBlID0gcGQtPmNsa190eXBlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWdwaW8uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS1ncGlvLmMKaW5kZXggOTY1MjgyMC4uNGJlMDE2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWdwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tZ3Bpby5jCkBAIC0yOCwxMyArMjgsMTMgQEAKICNkZWZpbmUgT0ZGU19EQVQJKDB4MDQpCiAjZGVmaW5lIE9GRlNfVVAJCSgweDA4KQogCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb19wbV8xYml0X3NhdmUoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX2dwaW9fcG1fMWJpdF9zYXZlKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKIHsKIAljaGlwLT5wbV9zYXZlWzBdID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIE9GRlNfQ09OKTsKIAljaGlwLT5wbV9zYXZlWzFdID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIE9GRlNfREFUKTsKIH0KIAotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fMWJpdF9yZXN1bWUoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX2dwaW9fcG1fMWJpdF9yZXN1bWUoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGNoaXAtPmJhc2U7CiAJdTMyIG9sZF9ncGNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyBPRkZTX0NPTik7CkBAIC02MCwxMiArNjAsMTIgQEAKIAkJICBjaGlwLT5jaGlwLmxhYmVsLCBvbGRfZ3Bjb24sIGdwc19ncGNvbiwgb2xkX2dwZGF0LCBncHNfZ3BkYXQpOwogfQogCi1zdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fMWJpdCA9IHsKLQkuc2F2ZQk9IHMzY19ncGlvX3BtXzFiaXRfc2F2ZSwKLQkucmVzdW1lID0gczNjX2dwaW9fcG1fMWJpdF9yZXN1bWUsCitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtIHNhbXN1bmdfZ3Bpb19wbV8xYml0ID0geworCS5zYXZlCT0gc2Ftc3VuZ19ncGlvX3BtXzFiaXRfc2F2ZSwKKwkucmVzdW1lID0gc2Ftc3VuZ19ncGlvX3BtXzFiaXRfcmVzdW1lLAogfTsKIAotc3RhdGljIHZvaWQgczNjX2dwaW9fcG1fMmJpdF9zYXZlKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzJiaXRfc2F2ZShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCiB7CiAJY2hpcC0+cG1fc2F2ZVswXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0NPTik7CiAJY2hpcC0+cG1fc2F2ZVsxXSA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UgKyBPRkZTX0RBVCk7CkBAIC05NSw3ICs5NSw3IEBACiB9CiAKIC8qKgotICogczNjX2dwaW9fcG1fMmJpdF9yZXN1bWUoKSAtIHJlc3RvcmUgdGhlIGdpdmVuIEdQSU8gYmFuaworICogc2Ftc3VuZ19ncGlvX3BtXzJiaXRfcmVzdW1lKCkgLSByZXN0b3JlIHRoZSBnaXZlbiBHUElPIGJhbmsKICAqIEBjaGlwOiBUaGUgY2hpcCBpbmZvcm1hdGlvbiB0byByZXN1bWUuCiAgKgogICogUmVzdG9yZSBvbmUgb2YgdGhlIEdQSU8gYmFua3MgdGhhdCB3YXMgc2F2ZWQgZHVyaW5nIHN1c3BlbmQuIFRoaXMgaXMKQEAgLTEyMSw3ICsxMjEsNyBAQAogICogWzFdIHRoaXMgYXNzdW1lcyB0aGF0IHdyaXRpbmcgdG8gYSBwaW4gREFUIHdoaWxzdCBpbiBTRk4gd2lsbCBzZXQgdGhlCiAgKiAgICAgc3RhdGUgZm9yIHdoZW4gaXQgaXMgbmV4dCBvdXRwdXQuCiAgKi8KLXN0YXRpYyB2b2lkIHMzY19ncGlvX3BtXzJiaXRfcmVzdW1lKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzJiaXRfcmVzdW1lKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBjaGlwLT5iYXNlOwogCXUzMiBvbGRfZ3Bjb24gPSBfX3Jhd19yZWFkbChiYXNlICsgT0ZGU19DT04pOwpAQCAtMTg3LDEzICsxODcsMTMgQEAKIAkJICBjaGlwLT5jaGlwLmxhYmVsLCBvbGRfZ3Bjb24sIGdwc19ncGNvbiwgb2xkX2dwZGF0LCBncHNfZ3BkYXQpOwogfQogCi1zdHJ1Y3QgczNjX2dwaW9fcG0gczNjX2dwaW9fcG1fMmJpdCA9IHsKLQkuc2F2ZQk9IHMzY19ncGlvX3BtXzJiaXRfc2F2ZSwKLQkucmVzdW1lID0gczNjX2dwaW9fcG1fMmJpdF9yZXN1bWUsCitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX3BtIHNhbXN1bmdfZ3Bpb19wbV8yYml0ID0geworCS5zYXZlCT0gc2Ftc3VuZ19ncGlvX3BtXzJiaXRfc2F2ZSwKKwkucmVzdW1lID0gc2Ftc3VuZ19ncGlvX3BtXzJiaXRfcmVzdW1lLAogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUzNDNjRYWCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9TNVApCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb19wbV80Yml0X3NhdmUoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX2dwaW9fcG1fNGJpdF9zYXZlKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKIHsKIAljaGlwLT5wbV9zYXZlWzFdID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIE9GRlNfQ09OKTsKIAljaGlwLT5wbV9zYXZlWzJdID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIE9GRlNfREFUKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQljaGlwLT5wbV9zYXZlWzBdID0gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSAtIDQpOwogfQogCi1zdGF0aWMgdTMyIHMzY19ncGlvX3BtXzRiaXRfbWFzayh1MzIgb2xkX2dwY29uLCB1MzIgZ3BzX2dwY29uKQorc3RhdGljIHUzMiBzYW1zdW5nX2dwaW9fcG1fNGJpdF9tYXNrKHUzMiBvbGRfZ3Bjb24sIHUzMiBncHNfZ3Bjb24pCiB7CiAJdTMyIG9sZCwgbmV3LCBtYXNrOwogCXUzMiBjaGFuZ2VfbWFzayA9IDB4MDsKQEAgLTI0MiwxNCArMjQyLDE0IEBACiAJcmV0dXJuIGNoYW5nZV9tYXNrOwogfQogCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb19wbV80Yml0X2NvbihzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCwgaW50IGluZGV4KQorc3RhdGljIHZvaWQgc2Ftc3VuZ19ncGlvX3BtXzRiaXRfY29uKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwgaW50IGluZGV4KQogewogCXZvaWQgX19pb21lbSAqY29uID0gY2hpcC0+YmFzZSArIChpbmRleCAqIDQpOwogCXUzMiBvbGRfZ3Bjb24gPSBfX3Jhd19yZWFkbChjb24pOwogCXUzMiBncHNfZ3Bjb24gPSBjaGlwLT5wbV9zYXZlW2luZGV4ICsgMV07CiAJdTMyIGdwY29uLCBtYXNrOwogCi0JbWFzayA9IHMzY19ncGlvX3BtXzRiaXRfbWFzayhvbGRfZ3Bjb24sIGdwc19ncGNvbik7CisJbWFzayA9IHNhbXN1bmdfZ3Bpb19wbV80Yml0X21hc2sob2xkX2dwY29uLCBncHNfZ3Bjb24pOwogCiAJZ3Bjb24gPSBvbGRfZ3Bjb24gJiB+bWFzazsKIAlncGNvbiB8PSBncHNfZ3Bjb24gJiBtYXNrOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJX19yYXdfd3JpdGVsKGdwY29uLCBjb24pOwogfQogCi1zdGF0aWMgdm9pZCBzM2NfZ3Bpb19wbV80Yml0X3Jlc3VtZShzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqY2hpcCkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfZ3Bpb19wbV80Yml0X3Jlc3VtZShzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXApCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gY2hpcC0+YmFzZTsKIAl1MzIgb2xkX2dwY29uWzJdOwpAQCAtMjY5LDEwICsyNjksMTAgQEAKIAlvbGRfZ3Bjb25bMF0gPSAwOwogCW9sZF9ncGNvblsxXSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBPRkZTX0NPTik7CiAKLQlzM2NfZ3Bpb19wbV80Yml0X2NvbihjaGlwLCAwKTsKKwlzYW1zdW5nX2dwaW9fcG1fNGJpdF9jb24oY2hpcCwgMCk7CiAJaWYgKGNoaXAtPmNoaXAubmdwaW8gPiA4KSB7CiAJCW9sZF9ncGNvblswXSA9IF9fcmF3X3JlYWRsKGJhc2UgLSA0KTsKLQkJczNjX2dwaW9fcG1fNGJpdF9jb24oY2hpcCwgLTEpOworCQlzYW1zdW5nX2dwaW9fcG1fNGJpdF9jb24oY2hpcCwgLTEpOwogCX0KIAogCS8qIE5vdyBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgcmVxdWlyZSBEQVQsQ09OICovCkBAIC0yOTgsMTkgKzI5OCwxOSBAQAogCQkJICBvbGRfZ3BkYXQsIGdwc19ncGRhdCk7CiB9CiAKLXN0cnVjdCBzM2NfZ3Bpb19wbSBzM2NfZ3Bpb19wbV80Yml0ID0gewotCS5zYXZlCT0gczNjX2dwaW9fcG1fNGJpdF9zYXZlLAotCS5yZXN1bWUgPSBzM2NfZ3Bpb19wbV80Yml0X3Jlc3VtZSwKK3N0cnVjdCBzYW1zdW5nX2dwaW9fcG0gc2Ftc3VuZ19ncGlvX3BtXzRiaXQgPSB7CisJLnNhdmUJPSBzYW1zdW5nX2dwaW9fcG1fNGJpdF9zYXZlLAorCS5yZXN1bWUgPSBzYW1zdW5nX2dwaW9fcG1fNGJpdF9yZXN1bWUsCiB9OwogI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzQzY0WFggfHwgQ09ORklHX1BMQVRfUzVQICovCiAKIC8qKgotICogczNjX3BtX3NhdmVfZ3BpbygpIC0gc2F2ZSBncGlvIGNoaXAgZGF0YSBmb3Igc3VzcGVuZAorICogc2Ftc3VuZ19wbV9zYXZlX2dwaW8oKSAtIHNhdmUgZ3BpbyBjaGlwIGRhdGEgZm9yIHN1c3BlbmQKICAqIEBvdXJjaGlwOiBUaGUgY2hpcCBmb3Igc3VzcGVuZC4KICAqLwotc3RhdGljIHZvaWQgczNjX3BtX3NhdmVfZ3BpbyhzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCkKK3N0YXRpYyB2b2lkIHNhbXN1bmdfcG1fc2F2ZV9ncGlvKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCkKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fcG0gKnBtID0gb3VyY2hpcC0+cG07CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSAqcG0gPSBvdXJjaGlwLT5wbTsKIAogCWlmIChwbSA9PSBOVUxMIHx8IHBtLT5zYXZlID09IE5VTEwpCiAJCVMzQ19QTURCRygiJXM6IG5vIHBtIGZvciAlc1xuIiwgX19mdW5jX18sIG91cmNoaXAtPmNoaXAubGFiZWwpOwpAQCAtMzE5LDI0ICszMTksMjQgQEAKIH0KIAogLyoqCi0gKiBzM2NfcG1fc2F2ZV9ncGlvcygpIC0gU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIEdQSU8gYmFua3MuCisgKiBzYW1zdW5nX3BtX3NhdmVfZ3Bpb3MoKSAtIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBHUElPIGJhbmtzLgogICoKICAqIEZvciBhbGwgdGhlIEdQSU8gYmFua3MsIHNhdmUgdGhlIHN0YXRlIG9mIGVhY2ggb25lIHJlYWR5IGZvciBnb2luZwogICogaW50byBhIHN1c3BlbmQgbW9kZS4KICAqLwotdm9pZCBzM2NfcG1fc2F2ZV9ncGlvcyh2b2lkKQordm9pZCBzYW1zdW5nX3BtX3NhdmVfZ3Bpb3Modm9pZCkKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcDsKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXA7CiAJdW5zaWduZWQgaW50IGdwaW9fbnI7CiAKIAlmb3IgKGdwaW9fbnIgPSAwOyBncGlvX25yIDwgUzNDX0dQSU9fRU5EOykgewotCQlvdXJjaGlwID0gczNjX2dwaW9saWJfZ2V0Y2hpcChncGlvX25yKTsKKwkJb3VyY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKGdwaW9fbnIpOwogCQlpZiAoIW91cmNoaXApIHsKIAkJCWdwaW9fbnIrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJczNjX3BtX3NhdmVfZ3BpbyhvdXJjaGlwKTsKKwkJc2Ftc3VuZ19wbV9zYXZlX2dwaW8ob3VyY2hpcCk7CiAKIAkJUzNDX1BNREJHKCIlczogc2F2ZSAlMDh4LCUwOHgsJTA4eCwlMDh4XG4iLAogCQkJICBvdXJjaGlwLT5jaGlwLmxhYmVsLApAQCAtMzUxLDEyICszNTEsMTIgQEAKIH0KIAogLyoqCi0gKiBzM2NfcG1fcmVzdW1lX2dwaW8oKSAtIHJlc3RvcmUgZ3BpbyBjaGlwIGRhdGEgYWZ0ZXIgc3VzcGVuZAorICogc2Ftc3VuZ19wbV9yZXN1bWVfZ3BpbygpIC0gcmVzdG9yZSBncGlvIGNoaXAgZGF0YSBhZnRlciBzdXNwZW5kCiAgKiBAb3VyY2hpcDogVGhlIHN1c3BlbmRlZCBjaGlwLgogICovCi1zdGF0aWMgdm9pZCBzM2NfcG1fcmVzdW1lX2dwaW8oc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXApCitzdGF0aWMgdm9pZCBzYW1zdW5nX3BtX3Jlc3VtZV9ncGlvKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcCkKIHsKLQlzdHJ1Y3QgczNjX2dwaW9fcG0gKnBtID0gb3VyY2hpcC0+cG07CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19wbSAqcG0gPSBvdXJjaGlwLT5wbTsKIAogCWlmIChwbSA9PSBOVUxMIHx8IHBtLT5yZXN1bWUgPT0gTlVMTCkKIAkJUzNDX1BNREJHKCIlczogbm8gcG0gZm9yICVzXG4iLCBfX2Z1bmNfXywgb3VyY2hpcC0+Y2hpcC5sYWJlbCk7CkBAIC0zNjQsMTkgKzM2NCwxOSBAQAogCQlwbS0+cmVzdW1lKG91cmNoaXApOwogfQogCi12b2lkIHMzY19wbV9yZXN0b3JlX2dwaW9zKHZvaWQpCit2b2lkIHNhbXN1bmdfcG1fcmVzdG9yZV9ncGlvcyh2b2lkKQogewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwOworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqb3VyY2hpcDsKIAl1bnNpZ25lZCBpbnQgZ3Bpb19ucjsKIAogCWZvciAoZ3Bpb19uciA9IDA7IGdwaW9fbnIgPCBTM0NfR1BJT19FTkQ7KSB7Ci0JCW91cmNoaXAgPSBzM2NfZ3Bpb2xpYl9nZXRjaGlwKGdwaW9fbnIpOworCQlvdXJjaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAoZ3Bpb19ucik7CiAJCWlmICghb3VyY2hpcCkgewogCQkJZ3Bpb19ucisrOwogCQkJY29udGludWU7CiAJCX0KIAotCQlzM2NfcG1fcmVzdW1lX2dwaW8ob3VyY2hpcCk7CisJCXNhbXN1bmdfcG1fcmVzdW1lX2dwaW8ob3VyY2hpcCk7CiAKIAkJZ3Bpb19uciArPSBvdXJjaGlwLT5jaGlwLm5ncGlvOwogCQlncGlvX25yICs9IENPTkZJR19TM0NfR1BJT19TUEFDRTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKaW5kZXggYWU2Zjk5OC4uNjRhYjY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKQEAgLTI2OCw4ICsyNjgsOCBAQAogCiAJLyogc2F2ZSBhbGwgbmVjZXNzYXJ5IGNvcmUgcmVnaXN0ZXJzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBkcml2ZXJzICovCiAKLQlzM2NfcG1fc2F2ZV9ncGlvcygpOwotCXMzY19wbV9zYXZlZF9ncGlvcygpOworCXNhbXN1bmdfcG1fc2F2ZV9ncGlvcygpOworCXNhbXN1bmdfcG1fc2F2ZWRfZ3Bpb3MoKTsKIAlzM2NfcG1fc2F2ZV91YXJ0cygpOwogCXMzY19wbV9zYXZlX2NvcmUoKTsKIApAQCAtMzA2LDcgKzMwNiw3IEBACiAKIAlzM2NfcG1fcmVzdG9yZV9jb3JlKCk7CiAJczNjX3BtX3Jlc3RvcmVfdWFydHMoKTsKLQlzM2NfcG1fcmVzdG9yZV9ncGlvcygpOworCXNhbXN1bmdfcG1fcmVzdG9yZV9ncGlvcygpOwogCXMzY19wbV9yZXN0b3JlZF9ncGlvcygpOwogCiAJczNjX3BtX2RlYnVnX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20tY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20tY2xvY2suYwppbmRleCBmMWJiYTg4Li5hMzVmZjNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3B3bS1jbG9jay5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy10aW1lci5oPgotI2luY2x1ZGUgPG1hY2gvcHdtLWNsb2NrLmg+CisjaW5jbHVkZSA8cGxhdC9wd20tY2xvY2suaD4KIAogLyogRWFjaCBvZiB0aGUgdGltZXJzIDAgdGhyb3VnaCA1IGdvIHRocm91Z2ggdGhlIGZvbGxvd2luZwogICogY2xvY2sgdHJlZSwgd2l0aCB0aGUgaW5wdXRzIGRlcGVuZGluZyBvbiB0aGUgdGltZXJzLgpAQCAtMzM5LDggKzMzOSwxNyBAQAogCXVuc2lnbmVkIGxvbmcgYml0czsKIAl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gUzNDMjQxMF9UQ0ZHMV9TSElGVChpZCk7CiAKKwl1bnNpZ25lZCBsb25nIG11eF90Y2xrOworCisJaWYgKHNvY19pc19zM2MyNHh4KCkpCisJCW11eF90Y2xrID0gUzNDMjQxMF9UQ0ZHMV9NVVhfVENMSzsKKwllbHNlIGlmIChzb2NfaXNfczVwNjQ0MCgpIHx8IHNvY19pc19zNXA2NDUwKCkpCisJCW11eF90Y2xrID0gMDsKKwllbHNlCisJCW11eF90Y2xrID0gUzNDNjRYWF9UQ0ZHMV9NVVhfVENMSzsKKwogCWlmIChwYXJlbnQgPT0gczNjMjR4eF9wd21jbGtfdGNsayhpZCkpCi0JCWJpdHMgPSBTM0NfVENGRzFfTVVYX1RDTEsgPDwgc2hpZnQ7CisJCWJpdHMgPSBtdXhfdGNsayA8PCBzaGlmdDsKIAllbHNlIGlmIChwYXJlbnQgPT0gczNjMjR4eF9wd21jbGtfdGRpdihpZCkpCiAJCWJpdHMgPSBjbGtfcHdtX3RkaXZfYml0cyh0b190ZGl2KHBhcmVudCkpIDw8IHNoaWZ0OwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20uYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wd20uYwppbmRleCBmMzc0NTdjLi5kYzExODVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcHdtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3B3bS5jCkBAIC0yOTksNiArMjk5LDkgQEAKIAkJZ290byBlcnJfY2xrX3RpbjsKIAl9CiAKKwljbGtfZW5hYmxlKHB3bS0+Y2xrKTsKKwljbGtfZW5hYmxlKHB3bS0+Y2xrX2Rpdik7CisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAl0Y29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9UQ09OKTsKQEAgLTMyNiw2ICszMjksOCBAQAogCXJldHVybiAwOwogCiAgZXJyX2Nsa190ZGl2OgorCWNsa19kaXNhYmxlKHB3bS0+Y2xrX2Rpdik7CisJY2xrX2Rpc2FibGUocHdtLT5jbGspOwogCWNsa19wdXQocHdtLT5jbGtfZGl2KTsKIAogIGVycl9jbGtfdGluOgpAQCAtMzQwLDYgKzM0NSw4IEBACiB7CiAJc3RydWN0IHB3bV9kZXZpY2UgKnB3bSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJY2xrX2Rpc2FibGUocHdtLT5jbGtfZGl2KTsKKwljbGtfZGlzYWJsZShwd20tPmNsayk7CiAJY2xrX3B1dChwd20tPmNsa19kaXYpOwogCWNsa19wdXQocHdtLT5jbGspOwogCWtmcmVlKHB3bSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvczNjLWRtYS1vcHMuYyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtZG1hLW9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTQ5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvczNjLWRtYS1vcHMuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1kbWEtb3BzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogU2Ftc3VuZyBTM0MtRE1BIE9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKworc3RydWN0IGNiX2RhdGEgeworCXZvaWQgKCpmcCkgKHZvaWQgKik7CisJdm9pZCAqZnBfcGFyYW07CisJdW5zaWduZWQgY2g7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworfTsKKworc3RhdGljIExJU1RfSEVBRChkbWFfbGlzdCk7CisKK3N0YXRpYyB2b2lkIHMzY19kbWFfY2Ioc3RydWN0IHMzYzI0MTBfZG1hX2NoYW4gKmNoYW5uZWwsIHZvaWQgKnBhcmFtLAorCQkgICAgICAgaW50IHNpemUsIGVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXMpCit7CisJc3RydWN0IGNiX2RhdGEgKmRhdGEgPSBwYXJhbTsKKworCWRhdGEtPmZwKGRhdGEtPmZwX3BhcmFtKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHMzY19kbWFfcmVxdWVzdChlbnVtIGRtYV9jaCBkbWFfY2gsCisJCQkJIHN0cnVjdCBzYW1zdW5nX2RtYV9pbmZvICppbmZvKQoreworCXN0cnVjdCBjYl9kYXRhICpkYXRhOworCisJaWYgKHMzYzI0MTBfZG1hX3JlcXVlc3QoZG1hX2NoLCBpbmZvLT5jbGllbnQsIE5VTEwpIDwgMCkgeworCQlzM2MyNDEwX2RtYV9mcmVlKGRtYV9jaCwgaW5mby0+Y2xpZW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YS0+Y2ggPSBkbWFfY2g7CisJbGlzdF9hZGRfdGFpbCgmZGF0YS0+bm9kZSwgJmRtYV9saXN0KTsKKworCXMzYzI0MTBfZG1hX2RldmNvbmZpZyhkbWFfY2gsIGluZm8tPmRpcmVjdGlvbiwgaW5mby0+Zmlmbyk7CisKKwlpZiAoaW5mby0+Y2FwID09IERNQV9DWUNMSUMpCisJCXMzYzI0MTBfZG1hX3NldGZsYWdzKGRtYV9jaCwgUzNDMjQxMF9ETUFGX0NJUkNVTEFSKTsKKworCXMzYzI0MTBfZG1hX2NvbmZpZyhkbWFfY2gsIGluZm8tPndpZHRoKTsKKworCXJldHVybiAodW5zaWduZWQpZG1hX2NoOworfQorCitzdGF0aWMgaW50IHMzY19kbWFfcmVsZWFzZSh1bnNpZ25lZCBjaCwgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjYl9kYXRhICpkYXRhOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCAmZG1hX2xpc3QsIG5vZGUpCisJCWlmIChkYXRhLT5jaCA9PSBjaCkKKwkJCWJyZWFrOworCWxpc3RfZGVsKCZkYXRhLT5ub2RlKTsKKworCXMzYzI0MTBfZG1hX2ZyZWUoY2gsIGNsaWVudCk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2NfZG1hX3ByZXBhcmUodW5zaWduZWQgY2gsIHN0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNiX2RhdGEgKmRhdGE7CisJaW50IGxlbiA9IChpbmZvLT5jYXAgPT0gRE1BX0NZQ0xJQykgPyBpbmZvLT5wZXJpb2QgOiBpbmZvLT5sZW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsICZkbWFfbGlzdCwgbm9kZSkKKwkJaWYgKGRhdGEtPmNoID09IGNoKQorCQkJYnJlYWs7CisKKwlpZiAoIWRhdGEtPmZwKSB7CisJCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihjaCwgczNjX2RtYV9jYik7CisJCWRhdGEtPmZwID0gaW5mby0+ZnA7CisJCWRhdGEtPmZwX3BhcmFtID0gaW5mby0+ZnBfcGFyYW07CisJfQorCisJczNjMjQxMF9kbWFfZW5xdWV1ZShjaCwgKHZvaWQgKilkYXRhLCBpbmZvLT5idWYsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgczNjX2RtYV90cmlnZ2VyKHVuc2lnbmVkIGNoKQoreworCXJldHVybiBzM2MyNDEwX2RtYV9jdHJsKGNoLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgczNjX2RtYV9zdGFydGVkKHVuc2lnbmVkIGNoKQoreworCXJldHVybiBzM2MyNDEwX2RtYV9jdHJsKGNoLCBTM0MyNDEwX0RNQU9QX1NUQVJURUQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzM2NfZG1hX2ZsdXNoKHVuc2lnbmVkIGNoKQoreworCXJldHVybiBzM2MyNDEwX2RtYV9jdHJsKGNoLCBTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgczNjX2RtYV9zdG9wKHVuc2lnbmVkIGNoKQoreworCXJldHVybiBzM2MyNDEwX2RtYV9jdHJsKGNoLCBTM0MyNDEwX0RNQU9QX1NUT1ApOworfQorCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZG1hX29wcyBzM2NfZG1hX29wcyA9IHsKKwkucmVxdWVzdAk9IHMzY19kbWFfcmVxdWVzdCwKKwkucmVsZWFzZQk9IHMzY19kbWFfcmVsZWFzZSwKKwkucHJlcGFyZQk9IHMzY19kbWFfcHJlcGFyZSwKKwkudHJpZ2dlcgk9IHMzY19kbWFfdHJpZ2dlciwKKwkuc3RhcnRlZAk9IHMzY19kbWFfc3RhcnRlZCwKKwkuZmx1c2gJCT0gczNjX2RtYV9mbHVzaCwKKwkuc3RvcAkJPSBzM2NfZG1hX3N0b3AsCit9OworCit2b2lkICpzM2NfZG1hX2dldF9vcHModm9pZCkKK3sKKwlyZXR1cm4gJnMzY19kbWFfb3BzOworfQorRVhQT1JUX1NZTUJPTChzM2NfZG1hX2dldF9vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1wbDMzMC5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1wbDMzMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODU2MzhjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9zM2MtcGwzMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNDQgKzAsMCBAQAotLyogbGludXgvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3MzYy1wbDMzMC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZC4KLSAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvcGwzMzAuaD4KLQotI2luY2x1ZGUgPHBsYXQvczNjLXBsMzMwLXBkYXRhLmg+Ci0KLS8qKgotICogc3RydWN0IHMzY19wbDMzMF9kbWFjIC0gTG9naWNhbCByZXByZXNlbnRhdGlvbiBvZiBhIFBMMzMwIERNQUMuCi0gKiBAYnVzeV9jaGFuOiBOdW1iZXIgb2YgY2hhbm5lbHMgY3VycmVudGx5IGJ1c3kuCi0gKiBAcGVyaTogTGlzdCBvZiBJRHMgb2YgcGVyaXBoZXJhbHMgdGhpcyBETUFDIGNhbiB3b3JrIHdpdGguCi0gKiBAbm9kZTogVG8gYXR0YWNoIHRvIHRoZSBnbG9iYWwgbGlzdCBvZiBETUFDcy4KLSAqIEBwaTogUEwzMzAgY29uZmlndXJhdGlvbiBpbmZvIGZvciB0aGUgRE1BQy4KLSAqIEBrbWNhY2hlOiBQb29sIHRvIHF1aWNrbHkgYWxsb2NhdGUgeGZlcnMgZm9yIGFsbCBjaGFubmVscyBpbiB0aGUgZG1hYy4KLSAqIEBjbGs6IFBvaW50ZXIgb2YgRE1BQyBvcGVyYXRpb24gY2xvY2suCi0gKi8KLXN0cnVjdCBzM2NfcGwzMzBfZG1hYyB7Ci0JdW5zaWduZWQJCWJ1c3lfY2hhbjsKLQllbnVtIGRtYV9jaAkJKnBlcmk7Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOwotCXN0cnVjdCBwbDMzMF9pbmZvCSpwaTsKLQlzdHJ1Y3Qga21lbV9jYWNoZQkqa21jYWNoZTsKLQlzdHJ1Y3QgY2xrCQkqY2xrOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgLSBBIHJlcXVlc3Qgc3VibWl0dGVkIGJ5IFMzQyBETUEgY2xpZW50cy4KLSAqIEB0b2tlbjogWGZlciBJRCBwcm92aWRlZCBieSB0aGUgY2xpZW50LgotICogQG5vZGU6IFRvIGF0dGFjaCB0byB0aGUgbGlzdCBvZiB4ZmVycyBvbiBhIGNoYW5uZWwuCi0gKiBAcHg6IFhmZXIgZm9yIFBMMzMwIGNvcmUuCi0gKiBAY2hhbjogT3duZXIgY2hhbm5lbCBvZiB0aGlzIHhmZXIuCi0gKi8KLXN0cnVjdCBzM2NfcGwzMzBfeGZlciB7Ci0Jdm9pZAkJCSp0b2tlbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0Jc3RydWN0IHBsMzMwX3hmZXIJcHg7Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuCSpjaGFuOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gLSBMb2dpY2FsIGNoYW5uZWwgdG8gY29tbXVuaWNhdGUgd2l0aAotICogCWEgUGh5c2ljYWwgcGVyaXBoZXJhbC4KLSAqIEBwbDMzMF9jaGFuX2lkOiBUb2tlbiBvZiBhIGhhcmR3YXJlIGNoYW5uZWwgdGhyZWFkIG9mIFBMMzMwIERNQUMuCi0gKiAJTlVMTCBpZiB0aGUgY2hhbm5lbCBpcyBhdmFpbGFibGUgdG8gYmUgYWNxdWlyZWQuCi0gKiBAaWQ6IElEIG9mIHRoZSBwZXJpcGhlcmFsIHRoYXQgdGhpcyBjaGFubmVsIGNhbiBjb21tdW5pY2F0ZSB3aXRoLgotICogQG9wdGlvbnM6IE9wdGlvbnMgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuCi0gKiBAc2RhZGRyOiBBZGRyZXNzIHByb3ZpZGVkIHZpYSBzM2MyNDEwX2RtYV9kZXZjb25maWcuCi0gKiBAbm9kZTogVG8gYXR0YWNoIHRvIHRoZSBnbG9iYWwgbGlzdCBvZiBjaGFubmVscy4KLSAqIEBscnE6IFBvaW50ZXIgdG8gdGhlIGxhc3Qgc3VibWl0dGVkIHBsMzMwX3JlcSB0byBQTDMzMCBjb3JlLgotICogQHhmZXJfbGlzdDogVG8gbWFuYWdlIGxpc3Qgb2YgeGZlcnMgZW5xdWV1ZWQuCi0gKiBAcmVxOiBUd28gcmVxdWVzdHMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUEwzMzAgZW5naW5lLgotICogQGNhbGxiYWNrX2ZuOiBDYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgY2xpZW50LgotICogQHJxY2ZnOiBDaGFubmVsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB4ZmVycy4KLSAqIEB4ZmVyX2hlYWQ6IFBvaW50ZXIgdG8gdGhlIHhmZXIgdG8gYmUgbmV4dCBleGVjdXRlZC4KLSAqIEBkbWFjOiBQb2ludGVyIHRvIHRoZSBETUFDIHRoYXQgbWFuYWdlcyB0aGlzIGNoYW5uZWwsIE5VTEwgaWYgdGhlCi0gKiAJY2hhbm5lbCBpcyBhdmFpbGFibGUgdG8gYmUgYWNxdWlyZWQuCi0gKiBAY2xpZW50OiBDbGllbnQgb2YgdGhpcyBjaGFubmVsLiBOVUxMIGlmIHRoZQotICogCWNoYW5uZWwgaXMgYXZhaWxhYmxlIHRvIGJlIGFjcXVpcmVkLgotICovCi1zdHJ1Y3QgczNjX3BsMzMwX2NoYW4gewotCXZvaWQJCQkJKnBsMzMwX2NoYW5faWQ7Ci0JZW51bSBkbWFfY2gJCQlpZDsKLQl1bnNpZ25lZCBpbnQJCQlvcHRpb25zOwotCXVuc2lnbmVkIGxvbmcJCQlzZGFkZHI7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbm9kZTsKLQlzdHJ1Y3QgcGwzMzBfcmVxCQkqbHJxOwotCXN0cnVjdCBsaXN0X2hlYWQJCXhmZXJfbGlzdDsKLQlzdHJ1Y3QgcGwzMzBfcmVxCQlyZXFbMl07Ci0JczNjMjQxMF9kbWFfY2Jmbl90CQljYWxsYmFja19mbjsKLQlzdHJ1Y3QgcGwzMzBfcmVxY2ZnCQlycWNmZzsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIJCSp4ZmVyX2hlYWQ7Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjCQkqZG1hYzsKLQlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50CSpjbGllbnQ7Ci19OwotCi0vKiBBbGwgRE1BQ3MgaW4gdGhlIHBsYXRmb3JtICovCi1zdGF0aWMgTElTVF9IRUFEKGRtYWNfbGlzdCk7Ci0KLS8qIEFsbCBjaGFubmVscyB0byBwZXJpcGhlcmFscyBpbiB0aGUgcGxhdGZvcm0gKi8KLXN0YXRpYyBMSVNUX0hFQUQoY2hhbl9saXN0KTsKLQotLyoKLSAqIFNpbmNlIHdlIGFkZCByZXNvdXJjZXMoRE1BQ3MgYW5kIENoYW5uZWxzKSB0byB0aGUgZ2xvYmFsIHBvb2wsCi0gKiB3ZSBuZWVkIHRvIGd1YXJkIGFjY2VzcyB0byB0aGUgcmVzb3VyY2VzIHVzaW5nIGEgZ2xvYmFsIGxvY2sKLSAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhyZXNfbG9jayk7Ci0KLS8qIFJldHVybnMgdGhlIGNoYW5uZWwgd2l0aCBJRCAnaWQnIGluIHRoZSBjaGFuX2xpc3QgKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmlkX3RvX2NoYW4oY29uc3QgZW51bSBkbWFfY2ggaWQpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZjaGFuX2xpc3QsIG5vZGUpCi0JCWlmIChjaC0+aWQgPT0gaWQpCi0JCQlyZXR1cm4gY2g7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgY2hhbm5lbCB3aXRoIElEICdpZCcgYW5kIGFkZCB0byBjaGFuX2xpc3QgKi8KLXN0YXRpYyB2b2lkIGNoYW5fYWRkKGNvbnN0IGVudW0gZG1hX2NoIGlkKQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2ggPSBpZF90b19jaGFuKGlkKTsKLQotCS8qIFJldHVybiBpZiB0aGUgY2hhbm5lbCBhbHJlYWR5IGV4aXN0cyAqLwotCWlmIChjaCkKLQkJcmV0dXJuOwotCi0JY2ggPSBrbWFsbG9jKHNpemVvZigqY2gpLCBHRlBfS0VSTkVMKTsKLQkvKiBSZXR1cm4gc2lsZW50bHkgdG8gd29yayB3aXRoIG90aGVyIGNoYW5uZWxzICovCi0JaWYgKCFjaCkKLQkJcmV0dXJuOwotCi0JY2gtPmlkID0gaWQ7Ci0JY2gtPmRtYWMgPSBOVUxMOwotCi0JbGlzdF9hZGRfdGFpbCgmY2gtPm5vZGUsICZjaGFuX2xpc3QpOwotfQotCi0vKiBJZiB0aGUgY2hhbm5lbCBpcyBub3QgeWV0IGFjcXVpcmVkIGJ5IGFueSBjbGllbnQgKi8KLXN0YXRpYyBib29sIGNoYW5fZnJlZShzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoKQotewotCWlmICghY2gpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIENoYW5uZWwgcG9pbnRzIHRvIHNvbWUgRE1BQyBvbmx5IHdoZW4gaXQncyBhY3F1aXJlZCAqLwotCXJldHVybiBjaC0+ZG1hYyA/IGZhbHNlIDogdHJ1ZTsKLX0KLQotLyoKLSAqIFJldHVybnMgMCBpcyBwZXJpcGhlcmFsIGkvZiBpcyBpbnZhbGlkIG9yIG5vdCBwcmVzZW50IG9uIHRoZSBkbWFjLgotICogSW5kZXggKyAxLCBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpZmFjZV9vZl9kbWFjKHN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYywgZW51bSBkbWFfY2ggY2hfaWQpCi17Ci0JZW51bSBkbWFfY2ggKmlkID0gZG1hYy0+cGVyaTsKLQlpbnQgaTsKLQotCS8qIERpc2NvdW50IGludmFsaWQgbWFya2VycyAqLwotCWlmIChjaF9pZCA9PSBETUFDSF9NQVgpCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMDsgaSA8IFBMMzMwX01BWF9QRVJJOyBpKyspCi0JCWlmIChpZFtpXSA9PSBjaF9pZCkKLQkJCXJldHVybiBpICsgMTsKLQotCXJldHVybiAwOwotfQotCi0vKiBJZiBhbGwgY2hhbm5lbCB0aHJlYWRzIG9mIHRoZSBETUFDIGFyZSBidXN5ICovCi1zdGF0aWMgaW5saW5lIGJvb2wgZG1hY19idXN5KHN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYykKLXsKLQlzdHJ1Y3QgcGwzMzBfaW5mbyAqcGkgPSBkbWFjLT5waTsKLQotCXJldHVybiAoZG1hYy0+YnVzeV9jaGFuIDwgcGktPnBjZmcubnVtX2NoYW4pID8gZmFsc2UgOiB0cnVlOwotfQotCi0vKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyZWUgY2hhbm5lbHMgdGhhdAotICogY2FuIGJlIGhhbmRsZWQgYnkgdGhpcyBkbWFjIG9ubHkuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaF9vbmx5YnlfZG1hYyhzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWMpCi17Ci0JZW51bSBkbWFfY2ggKmlkID0gZG1hYy0+cGVyaTsKLQlzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmQ7Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBmb3VuZCwgY291bnQgPSAwOwotCWVudW0gZG1hX2NoIHA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEwzMzBfTUFYX1BFUkk7IGkrKykgewotCQlwID0gaWRbaV07Ci0JCWNoID0gaWRfdG9fY2hhbihwKTsKLQotCQlpZiAocCA9PSBETUFDSF9NQVggfHwgIWNoYW5fZnJlZShjaCkpCi0JCQljb250aW51ZTsKLQotCQlmb3VuZCA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRtYWNfbGlzdCwgbm9kZSkgewotCQkJaWYgKGQgIT0gZG1hYyAmJiBpZmFjZV9vZl9kbWFjKGQsIGNoLT5pZCkpIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkKLQkJCWNvdW50Kys7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogTWVhc3VyZSBvZiBzdWl0YWJpbGl0eSBvZiAnZG1hYycgaGFuZGxpbmcgJ2NoJwotICoKLSAqIDAgaW5kaWNhdGVzICdkbWFjJyBjYW4gbm90IGhhbmRsZSAnY2gnIGVpdGhlcgotICogYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBvcgotICogYmVjYXVzZSBhbGwgZG1hYyBjaGFubmVscyBhcmUgY3VycmVudGx5IGJ1c3kuCi0gKgotICogPjAgdmxhdWUgaW5kaWNhdGVzICdkbWFjJyBoYXMgdGhlIGNhcGFiaWxpdHkuCi0gKiBUaGUgYmlnZ2VyIHRoZSB2YWx1ZSB0aGUgbW9yZSBzdWl0YWJsZSB0aGUgZG1hYy4KLSAqLwotI2RlZmluZSBNQVhfU1VJVAlVSU5UX01BWAotI2RlZmluZSBNSU5fU1VJVAkwCi0KLXN0YXRpYyB1bnNpZ25lZCBzdWl0YWJsaWxpdHkoc3RydWN0IHMzY19wbDMzMF9kbWFjICpkbWFjLAotCQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoKQotewotCXN0cnVjdCBwbDMzMF9pbmZvICpwaSA9IGRtYWMtPnBpOwotCWVudW0gZG1hX2NoICppZCA9IGRtYWMtPnBlcmk7Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpkOwotCXVuc2lnbmVkIHM7Ci0JaW50IGk7Ci0KLQlzID0gTUlOX1NVSVQ7Ci0JLyogSWYgYWxsIHRoZSBETUFDIGNoYW5uZWwgdGhyZWFkcyBhcmUgYnVzeSAqLwotCWlmIChkbWFjX2J1c3koZG1hYykpCi0JCXJldHVybiBzOwotCi0JZm9yIChpID0gMDsgaSA8IFBMMzMwX01BWF9QRVJJOyBpKyspCi0JCWlmIChpZFtpXSA9PSBjaC0+aWQpCi0JCQlicmVhazsKLQotCS8qIElmIHRoZSAnZG1hYycgY2FuJ3QgdGFsayB0byAnY2gnICovCi0JaWYgKGkgPT0gUEwzMzBfTUFYX1BFUkkpCi0JCXJldHVybiBzOwotCi0JcyA9IE1BWF9TVUlUOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRtYWNfbGlzdCwgbm9kZSkgewotCQkvKgotCQkgKiBJZiBzb21lIG90aGVyIGRtYWMgY2FuIHRhbGsgdG8gdGhpcwotCQkgKiBwZXJpIGFuZCBoYXMgc29tZSBjaGFubmVsIGZyZWUuCi0JCSAqLwotCQlpZiAoZCAhPSBkbWFjICYmIGlmYWNlX29mX2RtYWMoZCwgY2gtPmlkKSAmJiAhZG1hY19idXN5KGQpKSB7Ci0JCQlzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChzKQotCQlyZXR1cm4gczsKLQotCXMgPSAxMDA7Ci0KLQkvKiBHb29kIGlmIGZyZWUgY2hhbnMgYXJlIG1vcmUsIGJhZCBvdGhlcndpc2UgKi8KLQlzICs9IChwaS0+cGNmZy5udW1fY2hhbiAtIGRtYWMtPmJ1c3lfY2hhbikgLSBjaF9vbmx5YnlfZG1hYyhkbWFjKTsKLQotCXJldHVybiBzOwotfQotCi0vKiBNb3JlIHRoYW4gb25lIERNQUMgbWF5IGhhdmUgY2FwYWJpbGl0eSB0byB0cmFuc2ZlciBkYXRhIHdpdGggdGhlCi0gKiBwZXJpcGhlcmFsLiBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgbW9zdCBzdWl0YWJsZSBETUFDIHRvIG1hbmFnZSB0aGUKLSAqIGNoYW5uZWwgYW5kIGhlbmNlIGNvbW11bmljYXRlIHdpdGggdGhlIHBlcmlwaGVyYWwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKm1hcF9jaGFuX3RvX2RtYWMoc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmQsICpkbWFjID0gTlVMTDsKLQl1bnNpZ25lZCBzbiwgc2wgPSBNSU5fU1VJVDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRtYWNfbGlzdCwgbm9kZSkgewotCQlzbiA9IHN1aXRhYmxpbGl0eShkLCBjaCk7Ci0KLQkJaWYgKHNuID09IE1BWF9TVUlUKQotCQkJcmV0dXJuIGQ7Ci0KLQkJaWYgKHNuID4gc2wpCi0JCQlkbWFjID0gZDsKLQl9Ci0KLQlyZXR1cm4gZG1hYzsKLX0KLQotLyogQWNxdWlyZSB0aGUgY2hhbm5lbCBmb3IgcGVyaXBoZXJhbCAnaWQnICovCi1zdGF0aWMgc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaGFuX2FjcXVpcmUoY29uc3QgZW51bSBkbWFfY2ggaWQpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCA9IGlkX3RvX2NoYW4oaWQpOwotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYzsKLQotCS8qIElmIHRoZSBjaGFubmVsIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgYWxyZWFkeSBhY3F1aXJlZCAqLwotCWlmICghY2ggfHwgIWNoYW5fZnJlZShjaCkpIHsKLQkJY2ggPSBOVUxMOwotCQlnb3RvIGFjcV9leGl0OwotCX0KLQotCWRtYWMgPSBtYXBfY2hhbl90b19kbWFjKGNoKTsKLQkvKiBJZiBjb3VsZG4ndCBtYXAgKi8KLQlpZiAoIWRtYWMpIHsKLQkJY2ggPSBOVUxMOwotCQlnb3RvIGFjcV9leGl0OwotCX0KLQotCWRtYWMtPmJ1c3lfY2hhbisrOwotCWNoLT5kbWFjID0gZG1hYzsKLQotYWNxX2V4aXQ6Ci0JcmV0dXJuIGNoOwotfQotCi0vKiBEZWxldGUgeGZlciBmcm9tIHRoZSBxdWV1ZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRlbF9mcm9tX3F1ZXVlKHN0cnVjdCBzM2NfcGwzMzBfeGZlciAqeGZlcikKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnQ7Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQlpbnQgZm91bmQ7Ci0KLQlpZiAoIXhmZXIpCi0JCXJldHVybjsKLQotCWNoID0geGZlci0+Y2hhbjsKLQotCS8qIE1ha2Ugc3VyZSB4ZmVyIGlzIGluIHRoZSBxdWV1ZSAqLwotCWZvdW5kID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZjaC0+eGZlcl9saXN0LCBub2RlKQotCQlpZiAodCA9PSB4ZmVyKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JaWYgKCFmb3VuZCkKLQkJcmV0dXJuOwotCi0JLyogSWYgeGZlciBpcyBsYXN0IGVudHJ5IGluIHRoZSBxdWV1ZSAqLwotCWlmICh4ZmVyLT5ub2RlLm5leHQgPT0gJmNoLT54ZmVyX2xpc3QpCi0JCXQgPSBsaXN0X2VudHJ5KGNoLT54ZmVyX2xpc3QubmV4dCwKLQkJCQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIG5vZGUpOwotCWVsc2UKLQkJdCA9IGxpc3RfZW50cnkoeGZlci0+bm9kZS5uZXh0LAotCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgbm9kZSk7Ci0KLQkvKiBJZiB0aGVyZSB3YXMgb25seSBvbmUgbm9kZSBsZWZ0ICovCi0JaWYgKHQgPT0geGZlcikKLQkJY2gtPnhmZXJfaGVhZCA9IE5VTEw7Ci0JZWxzZSBpZiAoY2gtPnhmZXJfaGVhZCA9PSB4ZmVyKQotCQljaC0+eGZlcl9oZWFkID0gdDsKLQotCWxpc3RfZGVsKCZ4ZmVyLT5ub2RlKTsKLX0KLQotLyogUHJvdmlkZXMgcG9pbnRlciB0byB0aGUgbmV4dCB4ZmVyIGluIHRoZSBxdWV1ZS4KLSAqIElmIENJUkNVTEFSIG9wdGlvbiBpcyBzZXQsIHRoZSBsaXN0IGlzIGxlZnQgaW50YWN0LAotICogb3RoZXJ3aXNlIHRoZSB4ZmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAqIEZvcmNlZCBkZWxldGUgJ3BsdWNrJyBjYW4gYmUgc2V0IHRvIG92ZXJyaWRlIHRoZSBDSVJDVUxBUiBvcHRpb24uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKmdldF9mcm9tX3F1ZXVlKHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gsCi0JCWludCBwbHVjaykKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXIgPSBjaC0+eGZlcl9oZWFkOwotCi0JaWYgKCF4ZmVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIElmIHhmZXIgaXMgbGFzdCBlbnRyeSBpbiB0aGUgcXVldWUgKi8KLQlpZiAoeGZlci0+bm9kZS5uZXh0ID09ICZjaC0+eGZlcl9saXN0KQotCQljaC0+eGZlcl9oZWFkID0gbGlzdF9lbnRyeShjaC0+eGZlcl9saXN0Lm5leHQsCi0JCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgbm9kZSk7Ci0JZWxzZQotCQljaC0+eGZlcl9oZWFkID0gbGlzdF9lbnRyeSh4ZmVyLT5ub2RlLm5leHQsCi0JCQkJCXN0cnVjdCBzM2NfcGwzMzBfeGZlciwgbm9kZSk7Ci0KLQlpZiAocGx1Y2sgfHwgIShjaC0+b3B0aW9ucyAmIFMzQzI0MTBfRE1BRl9DSVJDVUxBUikpCi0JCWRlbF9mcm9tX3F1ZXVlKHhmZXIpOwotCi0JcmV0dXJuIHhmZXI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdG9fcXVldWUoc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCwKLQkJc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyLCBpbnQgZnJvbnQpCi17Ci0Jc3RydWN0IHBsMzMwX3hmZXIgKnh0OwotCi0JLyogSWYgcXVldWUgZW1wdHkgKi8KLQlpZiAoY2gtPnhmZXJfaGVhZCA9PSBOVUxMKQotCQljaC0+eGZlcl9oZWFkID0geGZlcjsKLQotCXh0ID0gJmNoLT54ZmVyX2hlYWQtPnB4OwotCS8qIElmIHRoZSBoZWFkIGFscmVhZHkgc3VibWl0dGVkIChDSVJDVUxBUiBoZWFkKSAqLwotCWlmIChjaC0+b3B0aW9ucyAmIFMzQzI0MTBfRE1BRl9DSVJDVUxBUiAmJgotCQkoeHQgPT0gY2gtPnJlcVswXS54IHx8IHh0ID09IGNoLT5yZXFbMV0ueCkpCi0JCWNoLT54ZmVyX2hlYWQgPSB4ZmVyOwotCi0JLyogSWYgdGhpcyBpcyBhIHJlc3VibWlzc2lvbiwgaXQgc2hvdWxkIGdvIGF0IHRoZSBoZWFkICovCi0JaWYgKGZyb250KSB7Ci0JCWNoLT54ZmVyX2hlYWQgPSB4ZmVyOwotCQlsaXN0X2FkZCgmeGZlci0+bm9kZSwgJmNoLT54ZmVyX2xpc3QpOwotCX0gZWxzZSB7Ci0JCWxpc3RfYWRkX3RhaWwoJnhmZXItPm5vZGUsICZjaC0+eGZlcl9saXN0KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfZmluaXNoX29mZihzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXIsCi0JCWVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXMsIGludCBmZnJlZSkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCi0JaWYgKCF4ZmVyKQotCQlyZXR1cm47Ci0KLQljaCA9IHhmZXItPmNoYW47Ci0KLQkvKiBEbyBjYWxsYmFjayAqLwotCWlmIChjaC0+Y2FsbGJhY2tfZm4pCi0JCWNoLT5jYWxsYmFja19mbihOVUxMLCB4ZmVyLT50b2tlbiwgeGZlci0+cHguYnl0ZXMsIHJlcyk7Ci0KLQkvKiBGb3JjZSBGcmVlIG9yIGlmIGJ1ZmZlciBpcyBub3QgbmVlZGVkIGFueW1vcmUgKi8KLQlpZiAoZmZyZWUgfHwgIShjaC0+b3B0aW9ucyAmIFMzQzI0MTBfRE1BRl9DSVJDVUxBUikpCi0JCWttZW1fY2FjaGVfZnJlZShjaC0+ZG1hYy0+a21jYWNoZSwgeGZlcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHMzY19wbDMzMF9zdWJtaXQoc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaCwKLQkJc3RydWN0IHBsMzMwX3JlcSAqcikKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXI7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBJZiBhbHJlYWR5IHN1Ym1pdHRlZCAqLwotCWlmIChyLT54KQotCQlyZXR1cm4gMDsKLQotCXhmZXIgPSBnZXRfZnJvbV9xdWV1ZShjaCwgMCk7Ci0JaWYgKHhmZXIpIHsKLQkJci0+eCA9ICZ4ZmVyLT5weDsKLQotCQkvKiBVc2UgbWF4IGJhbmR3aWR0aCBmb3IgTTwtPk0geGZlcnMgKi8KLQkJaWYgKHItPnJxdHlwZSA9PSBNRU1UT01FTSkgewotCQkJc3RydWN0IHBsMzMwX2luZm8gKnBpID0geGZlci0+Y2hhbi0+ZG1hYy0+cGk7Ci0JCQlpbnQgYnVyc3QgPSAxIDw8IGNoLT5ycWNmZy5icnN0X3NpemU7Ci0JCQl1MzIgYnl0ZXMgPSByLT54LT5ieXRlczsKLQkJCWludCBibDsKLQotCQkJYmwgPSBwaS0+cGNmZy5kYXRhX2J1c193aWR0aCAvIDg7Ci0JCQlibCAqPSBwaS0+cGNmZy5kYXRhX2J1Zl9kZXA7Ci0JCQlibCAvPSBidXJzdDsKLQotCQkJLyogc3JjL2RzdF9idXJzdF9sZW4gY2FuJ3QgYmUgbW9yZSB0aGFuIDE2ICovCi0JCQlpZiAoYmwgPiAxNikKLQkJCQlibCA9IDE2OwotCi0JCQl3aGlsZSAoYmwgPiAxKSB7Ci0JCQkJaWYgKCEoYnl0ZXMgJSAoYmwgKiBidXJzdCkpKQotCQkJCQlicmVhazsKLQkJCQlibC0tOwotCQkJfQotCi0JCQljaC0+cnFjZmcuYnJzdF9sZW4gPSBibDsKLQkJfSBlbHNlIHsKLQkJCWNoLT5ycWNmZy5icnN0X2xlbiA9IDE7Ci0JCX0KLQotCQlyZXQgPSBwbDMzMF9zdWJtaXRfcmVxKGNoLT5wbDMzMF9jaGFuX2lkLCByKTsKLQotCQkvKiBJZiBzdWJtaXNzaW9uIHdhcyBzdWNjZXNzZnVsICovCi0JCWlmICghcmV0KSB7Ci0JCQljaC0+bHJxID0gcjsgLyogbGF0ZXN0IHN1Ym1pdHRlZCByZXEgKi8KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJci0+eCA9IE5VTEw7Ci0KLQkJLyogSWYgYm90aCBvZiB0aGUgUEwzMzAgcGluZy1wb25nIGJ1ZmZlcnMgZmlsbGVkICovCi0JCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJZGV2X2VycihjaC0+ZG1hYy0+cGktPmRldiwgIiVzOiVkIVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJLyogUXVldWUgYmFjayBhZ2FpbiAqLwotCQkJYWRkX3RvX3F1ZXVlKGNoLCB4ZmVyLCAxKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKGNoLT5kbWFjLT5waS0+ZGV2LCAiJXM6JWQhXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlfZmluaXNoX29mZih4ZmVyLCBTM0MyNDEwX1JFU19FUlIsIDApOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgczNjX3BsMzMwX3JxKHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gsCi0Jc3RydWN0IHBsMzMwX3JlcSAqciwgZW51bSBwbDMzMF9vcF9lcnIgZXJyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyOwotCXN0cnVjdCBwbDMzMF94ZmVyICp4bCA9IHItPng7Ci0JZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0Jci0+eCA9IE5VTEw7Ci0KLQlzM2NfcGwzMzBfc3VibWl0KGNoLCByKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQkvKiBNYXAgcmVzdWx0IHRvIFMzQyBETUEgQVBJICovCi0JaWYgKGVyciA9PSBQTDMzMF9FUlJfTk9ORSkKLQkJcmVzID0gUzNDMjQxMF9SRVNfT0s7Ci0JZWxzZSBpZiAoZXJyID09IFBMMzMwX0VSUl9BQk9SVCkKLQkJcmVzID0gUzNDMjQxMF9SRVNfQUJPUlQ7Ci0JZWxzZQotCQlyZXMgPSBTM0MyNDEwX1JFU19FUlI7Ci0KLQkvKiBJZiBsYXN0IHJlcXVlc3QgaGFkIHNvbWUgeGZlciAqLwotCWlmICh4bCkgewotCQl4ZmVyID0gY29udGFpbmVyX29mKHhsLCBzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIHB4KTsKLQkJX2ZpbmlzaF9vZmYoeGZlciwgcmVzLCAwKTsKLQl9IGVsc2UgewotCQlkZXZfaW5mbyhjaC0+ZG1hYy0+cGktPmRldiwgIiVzOiVkIE5vIFhmZXI/IVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzM2NfcGwzMzBfcnEwKHZvaWQgKnRva2VuLCBlbnVtIHBsMzMwX29wX2VyciBlcnIpCi17Ci0Jc3RydWN0IHBsMzMwX3JlcSAqciA9IHRva2VuOwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2ggPSBjb250YWluZXJfb2YociwKLQkJCQkJc3RydWN0IHMzY19wbDMzMF9jaGFuLCByZXFbMF0pOwotCXMzY19wbDMzMF9ycShjaCwgciwgZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgczNjX3BsMzMwX3JxMSh2b2lkICp0b2tlbiwgZW51bSBwbDMzMF9vcF9lcnIgZXJyKQotewotCXN0cnVjdCBwbDMzMF9yZXEgKnIgPSB0b2tlbjsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoID0gY29udGFpbmVyX29mKHIsCi0JCQkJCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiwgcmVxWzFdKTsKLQlzM2NfcGwzMzBfcnEoY2gsIHIsIGVycik7Ci19Ci0KLS8qIFJlbGVhc2UgYW4gYWNxdWlyZWQgY2hhbm5lbCAqLwotc3RhdGljIHZvaWQgY2hhbl9yZWxlYXNlKHN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2gpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpkbWFjOwotCi0JaWYgKGNoYW5fZnJlZShjaCkpCi0JCXJldHVybjsKLQotCWRtYWMgPSBjaC0+ZG1hYzsKLQljaC0+ZG1hYyA9IE5VTEw7Ci0JZG1hYy0+YnVzeV9jaGFuLS07Ci19Ci0KLWludCBzM2MyNDEwX2RtYV9jdHJsKGVudW0gZG1hX2NoIGlkLCBlbnVtIHMzYzI0MTBfY2hhbl9vcCBvcCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIgKnhmZXI7Ci0JZW51bSBwbDMzMF9jaGFuX29wIHBsMzMwb3A7Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpZHgsIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JY2ggPSBpZF90b19jaGFuKGlkKTsKLQotCWlmICghY2ggfHwgY2hhbl9mcmVlKGNoKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGN0cmxfZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBTM0MyNDEwX0RNQU9QX1NUQVJUOgotCQkvKiBNYWtlIHN1cmUgYm90aCByZXFzIGFyZSBlbnF1ZXVlZCAqLwotCQlpZHggPSAoY2gtPmxycSA9PSAmY2gtPnJlcVswXSkgPyAxIDogMDsKLQkJczNjX3BsMzMwX3N1Ym1pdChjaCwgJmNoLT5yZXFbaWR4XSk7Ci0JCXMzY19wbDMzMF9zdWJtaXQoY2gsICZjaC0+cmVxWzEgLSBpZHhdKTsKLQkJcGwzMzBvcCA9IFBMMzMwX09QX1NUQVJUOwotCQlicmVhazsKLQotCWNhc2UgUzNDMjQxMF9ETUFPUF9TVE9QOgotCQlwbDMzMG9wID0gUEwzMzBfT1BfQUJPUlQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBTM0MyNDEwX0RNQU9QX0ZMVVNIOgotCQlwbDMzMG9wID0gUEwzMzBfT1BfRkxVU0g7Ci0JCWJyZWFrOwotCi0JY2FzZSBTM0MyNDEwX0RNQU9QX1BBVVNFOgotCWNhc2UgUzNDMjQxMF9ETUFPUF9SRVNVTUU6Ci0JY2FzZSBTM0MyNDEwX0RNQU9QX1RJTUVPVVQ6Ci0JY2FzZSBTM0MyNDEwX0RNQU9QX1NUQVJURUQ6Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCi0JZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gcGwzMzBfY2hhbl9jdHJsKGNoLT5wbDMzMF9jaGFuX2lkLCBwbDMzMG9wKTsKLQotCWlmIChwbDMzMG9wID09IFBMMzMwX09QX1NUQVJUKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWR4ID0gKGNoLT5scnEgPT0gJmNoLT5yZXFbMF0pID8gMSA6IDA7Ci0KLQkvKiBBYm9ydCB0aGUgY3VycmVudCB4ZmVyICovCi0JaWYgKGNoLT5yZXFbaWR4XS54KSB7Ci0JCXhmZXIgPSBjb250YWluZXJfb2YoY2gtPnJlcVtpZHhdLngsCi0JCQkJc3RydWN0IHMzY19wbDMzMF94ZmVyLCBweCk7Ci0KLQkJLyogRHJvcCB4ZmVyIGR1cmluZyBGTFVTSCAqLwotCQlpZiAocGwzMzBvcCA9PSBQTDMzMF9PUF9GTFVTSCkKLQkJCWRlbF9mcm9tX3F1ZXVlKHhmZXIpOwotCi0JCWNoLT5yZXFbaWR4XS54ID0gTlVMTDsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlfZmluaXNoX29mZih4ZmVyLCBTM0MyNDEwX1JFU19BQk9SVCwKLQkJCQlwbDMzMG9wID09IFBMMzMwX09QX0ZMVVNIID8gMSA6IDApOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKiBGbHVzaCB0aGUgd2hvbGUgcXVldWUgKi8KLQlpZiAocGwzMzBvcCA9PSBQTDMzMF9PUF9GTFVTSCkgewotCi0JCWlmIChjaC0+cmVxWzEgLSBpZHhdLngpIHsKLQkJCXhmZXIgPSBjb250YWluZXJfb2YoY2gtPnJlcVsxIC0gaWR4XS54LAotCQkJCQlzdHJ1Y3QgczNjX3BsMzMwX3hmZXIsIHB4KTsKLQotCQkJZGVsX2Zyb21fcXVldWUoeGZlcik7Ci0KLQkJCWNoLT5yZXFbMSAtIGlkeF0ueCA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCQlfZmluaXNoX29mZih4ZmVyLCBTM0MyNDEwX1JFU19BQk9SVCwgMSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJfQotCi0JCS8qIEZpbmlzaCBvZmYgdGhlIHJlbWFpbmluZyBpbiB0aGUgcXVldWUgKi8KLQkJeGZlciA9IGNoLT54ZmVyX2hlYWQ7Ci0JCXdoaWxlICh4ZmVyKSB7Ci0KLQkJCWRlbF9mcm9tX3F1ZXVlKHhmZXIpOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsIDEpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQkJCXhmZXIgPSBjaC0+eGZlcl9oZWFkOwotCQl9Ci0JfQotCi1jdHJsX2V4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2N0cmwpOwotCi1pbnQgczNjMjQxMF9kbWFfZW5xdWV1ZShlbnVtIGRtYV9jaCBpZCwgdm9pZCAqdG9rZW4sCi0JCQlkbWFfYWRkcl90IGFkZHIsIGludCBzaXplKQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0Jc3RydWN0IHMzY19wbDMzMF94ZmVyICp4ZmVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGlkeCwgcmV0ID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JY2ggPSBpZF90b19jaGFuKGlkKTsKLQotCS8qIEVycm9yIGlmIGludmFsaWQgb3IgZnJlZSBjaGFubmVsICovCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5xX2V4aXQ7Ci0JfQotCi0JLyogRXJyb3IgaWYgc2l6ZSBpcyB1bmFsaWduZWQgKi8KLQlpZiAoY2gtPnJxY2ZnLmJyc3Rfc2l6ZSAmJiBzaXplICUgKDEgPDwgY2gtPnJxY2ZnLmJyc3Rfc2l6ZSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbnFfZXhpdDsKLQl9Ci0KLQl4ZmVyID0ga21lbV9jYWNoZV9hbGxvYyhjaC0+ZG1hYy0+a21jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF4ZmVyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZW5xX2V4aXQ7Ci0JfQotCi0JeGZlci0+dG9rZW4gPSB0b2tlbjsKLQl4ZmVyLT5jaGFuID0gY2g7Ci0JeGZlci0+cHguYnl0ZXMgPSBzaXplOwotCXhmZXItPnB4Lm5leHQgPSBOVUxMOyAvKiBTaW5nbGUgcmVxdWVzdCAqLwotCi0JLyogRm9yIFMzQyBETUEgQVBJLCBkaXJlY3Rpb24gaXMgYWx3YXlzIGZpeGVkIGZvciBhbGwgeGZlcnMgKi8KLQlpZiAoY2gtPnJlcVswXS5ycXR5cGUgPT0gTUVNVE9ERVYpIHsKLQkJeGZlci0+cHguc3JjX2FkZHIgPSBhZGRyOwotCQl4ZmVyLT5weC5kc3RfYWRkciA9IGNoLT5zZGFkZHI7Ci0JfSBlbHNlIHsKLQkJeGZlci0+cHguc3JjX2FkZHIgPSBjaC0+c2RhZGRyOwotCQl4ZmVyLT5weC5kc3RfYWRkciA9IGFkZHI7Ci0JfQotCi0JYWRkX3RvX3F1ZXVlKGNoLCB4ZmVyLCAwKTsKLQotCS8qIFRyeSBzdWJtaXR0aW5nIG9uIGVpdGhlciByZXF1ZXN0ICovCi0JaWR4ID0gKGNoLT5scnEgPT0gJmNoLT5yZXFbMF0pID8gMSA6IDA7Ci0KLQlpZiAoIWNoLT5yZXFbaWR4XS54KQotCQlzM2NfcGwzMzBfc3VibWl0KGNoLCAmY2gtPnJlcVtpZHhdKTsKLQllbHNlCi0JCXMzY19wbDMzMF9zdWJtaXQoY2gsICZjaC0+cmVxWzEgLSBpZHhdKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY2gtPm9wdGlvbnMgJiBTM0MyNDEwX0RNQUZfQVVUT1NUQVJUKQotCQlzM2MyNDEwX2RtYV9jdHJsKGlkLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKLQotCXJldHVybiAwOwotCi1lbnFfZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZW5xdWV1ZSk7Ci0KLWludCBzM2MyNDEwX2RtYV9yZXF1ZXN0KGVudW0gZG1hX2NoIGlkLAotCQkJc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqY2xpZW50LAotCQkJdm9pZCAqZGV2KQotewotCXN0cnVjdCBzM2NfcGwzMzBfZG1hYyAqZG1hYzsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gY2hhbl9hY3F1aXJlKGlkKTsKLQlpZiAoIWNoKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byByZXFfZXhpdDsKLQl9Ci0KLQlkbWFjID0gY2gtPmRtYWM7Ci0KLQljaC0+cGwzMzBfY2hhbl9pZCA9IHBsMzMwX3JlcXVlc3RfY2hhbm5lbChkbWFjLT5waSk7Ci0JaWYgKCFjaC0+cGwzMzBfY2hhbl9pZCkgewotCQljaGFuX3JlbGVhc2UoY2gpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gcmVxX2V4aXQ7Ci0JfQotCi0JY2gtPmNsaWVudCA9IGNsaWVudDsKLQljaC0+b3B0aW9ucyA9IDA7IC8qIENsZWFyIGFueSBvcHRpb24gKi8KLQljaC0+Y2FsbGJhY2tfZm4gPSBOVUxMOyAvKiBDbGVhciBhbnkgY2FsbGJhY2sgKi8KLQljaC0+bHJxID0gTlVMTDsKLQotCWNoLT5ycWNmZy5icnN0X3NpemUgPSAyOyAvKiBEZWZhdWx0IHdvcmQgc2l6ZSAqLwotCWNoLT5ycWNmZy5zd2FwID0gU1dBUF9OTzsKLQljaC0+cnFjZmcuc2NjdGwgPSBTQ0NUUkwwOyAvKiBOb25jYWNoZWFibGUgYW5kIG5vbmJ1ZmZlcmFibGUgKi8KLQljaC0+cnFjZmcuZGNjdGwgPSBEQ0NUUkwwOyAvKiBOb25jYWNoZWFibGUgYW5kIG5vbmJ1ZmZlcmFibGUgKi8KLQljaC0+cnFjZmcucHJpdmlsZWdlZCA9IDA7Ci0JY2gtPnJxY2ZnLmluc25hY2Nlc3MgPSAwOwotCi0JLyogU2V0IGludmFsaWQgZGlyZWN0aW9uICovCi0JY2gtPnJlcVswXS5ycXR5cGUgPSBERVZUT0RFVjsKLQljaC0+cmVxWzFdLnJxdHlwZSA9IGNoLT5yZXFbMF0ucnF0eXBlOwotCi0JY2gtPnJlcVswXS5jZmcgPSAmY2gtPnJxY2ZnOwotCWNoLT5yZXFbMV0uY2ZnID0gY2gtPnJlcVswXS5jZmc7Ci0KLQljaC0+cmVxWzBdLnBlcmkgPSBpZmFjZV9vZl9kbWFjKGRtYWMsIGlkKSAtIDE7IC8qIE9yaWdpbmFsIGluZGV4ICovCi0JY2gtPnJlcVsxXS5wZXJpID0gY2gtPnJlcVswXS5wZXJpOwotCi0JY2gtPnJlcVswXS50b2tlbiA9ICZjaC0+cmVxWzBdOwotCWNoLT5yZXFbMF0ueGZlcl9jYiA9IHMzY19wbDMzMF9ycTA7Ci0JY2gtPnJlcVsxXS50b2tlbiA9ICZjaC0+cmVxWzFdOwotCWNoLT5yZXFbMV0ueGZlcl9jYiA9IHMzY19wbDMzMF9ycTE7Ci0KLQljaC0+cmVxWzBdLnggPSBOVUxMOwotCWNoLT5yZXFbMV0ueCA9IE5VTEw7Ci0KLQkvKiBSZXNldCB4ZmVyIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmY2gtPnhmZXJfbGlzdCk7Ci0JY2gtPnhmZXJfaGVhZCA9IE5VTEw7Ci0KLXJlcV9leGl0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9yZXF1ZXN0KTsKLQotaW50IHMzYzI0MTBfZG1hX2ZyZWUoZW51bSBkbWFfY2ggaWQsIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXN0cnVjdCBzM2NfcGwzMzBfeGZlciAqeGZlcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGlkeDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JY2ggPSBpZF90b19jaGFuKGlkKTsKLQotCWlmICghY2ggfHwgY2hhbl9mcmVlKGNoKSkKLQkJZ290byBmcmVlX2V4aXQ7Ci0KLQkvKiBSZWZ1c2UgaWYgc29tZW9uZSBlbHNlIHdhbnRlZCB0byBmcmVlIHRoZSBjaGFubmVsICovCi0JaWYgKGNoLT5jbGllbnQgIT0gY2xpZW50KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBmcmVlX2V4aXQ7Ci0JfQotCi0JLyogU3RvcCBhbnkgYWN0aXZlIHhmZXIsIEZsdXNoZSB0aGUgcXVldWUgYW5kIGRvIGNhbGxiYWNrcyAqLwotCXBsMzMwX2NoYW5fY3RybChjaC0+cGwzMzBfY2hhbl9pZCwgUEwzMzBfT1BfRkxVU0gpOwotCi0JLyogQWJvcnQgdGhlIHN1Ym1pdHRlZCByZXF1ZXN0cyAqLwotCWlkeCA9IChjaC0+bHJxID09ICZjaC0+cmVxWzBdKSA/IDEgOiAwOwotCi0JaWYgKGNoLT5yZXFbaWR4XS54KSB7Ci0JCXhmZXIgPSBjb250YWluZXJfb2YoY2gtPnJlcVtpZHhdLngsCi0JCQkJc3RydWN0IHMzY19wbDMzMF94ZmVyLCBweCk7Ci0KLQkJY2gtPnJlcVtpZHhdLnggPSBOVUxMOwotCQlkZWxfZnJvbV9xdWV1ZSh4ZmVyKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlfZmluaXNoX29mZih4ZmVyLCBTM0MyNDEwX1JFU19BQk9SVCwgMSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChjaC0+cmVxWzEgLSBpZHhdLngpIHsKLQkJeGZlciA9IGNvbnRhaW5lcl9vZihjaC0+cmVxWzEgLSBpZHhdLngsCi0JCQkJc3RydWN0IHMzY19wbDMzMF94ZmVyLCBweCk7Ci0KLQkJY2gtPnJlcVsxIC0gaWR4XS54ID0gTlVMTDsKLQkJZGVsX2Zyb21fcXVldWUoeGZlcik7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJX2ZpbmlzaF9vZmYoeGZlciwgUzNDMjQxMF9SRVNfQUJPUlQsIDEpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKiBQbHVjayBhbmQgQWJvcnQgdGhlIHF1ZXVlZCByZXF1ZXN0cyBpbiBvcmRlciAqLwotCWRvIHsKLQkJeGZlciA9IGdldF9mcm9tX3F1ZXVlKGNoLCAxKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlfZmluaXNoX29mZih4ZmVyLCBTM0MyNDEwX1JFU19BQk9SVCwgMSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNfbG9jaywgZmxhZ3MpOwotCX0gd2hpbGUgKHhmZXIpOwotCi0JY2gtPmNsaWVudCA9IE5VTEw7Ci0KLQlwbDMzMF9yZWxlYXNlX2NoYW5uZWwoY2gtPnBsMzMwX2NoYW5faWQpOwotCi0JY2gtPnBsMzMwX2NoYW5faWQgPSBOVUxMOwotCi0JY2hhbl9yZWxlYXNlKGNoKTsKLQotZnJlZV9leGl0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9mcmVlKTsKLQotaW50IHMzYzI0MTBfZG1hX2NvbmZpZyhlbnVtIGRtYV9jaCBpZCwgaW50IHhmZXJ1bml0KQotewotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0Jc3RydWN0IHBsMzMwX2luZm8gKnBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIGRid2lkdGgsIHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBjZmdfZXhpdDsKLQl9Ci0KLQlwaSA9IGNoLT5kbWFjLT5waTsKLQlkYndpZHRoID0gcGktPnBjZmcuZGF0YV9idXNfd2lkdGggLyA4OwotCi0JLyogTWF4IHNpemUgb2YgeGZlciBjYW4gYmUgcGNmZy5kYXRhX2J1c193aWR0aCAqLwotCWlmICh4ZmVydW5pdCA+IGRid2lkdGgpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBjZmdfZXhpdDsKLQl9Ci0KLQlpID0gMDsKLQl3aGlsZSAoeGZlcnVuaXQgIT0gKDEgPDwgaSkpCi0JCWkrKzsKLQotCS8qIElmIHZhbGlkIHZhbHVlICovCi0JaWYgKHhmZXJ1bml0ID09ICgxIDw8IGkpKQotCQljaC0+cnFjZmcuYnJzdF9zaXplID0gaTsKLQllbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLWNmZ19leGl0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2RtYV9jb25maWcpOwotCi0vKiBPcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLwotI2RlZmluZSBTM0NfUEwzMzBfRkxBR1MgKFMzQzI0MTBfRE1BRl9DSVJDVUxBUiB8IFMzQzI0MTBfRE1BRl9BVVRPU1RBUlQpCi0KLWludCBzM2MyNDEwX2RtYV9zZXRmbGFncyhlbnVtIGRtYV9jaCBpZCwgdW5zaWduZWQgaW50IG9wdGlvbnMpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9jaGFuICpjaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQljaCA9IGlkX3RvX2NoYW4oaWQpOwotCi0JaWYgKCFjaCB8fCBjaGFuX2ZyZWUoY2gpIHx8IG9wdGlvbnMgJiB+KFMzQ19QTDMzMF9GTEFHUykpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQljaC0+b3B0aW9ucyA9IG9wdGlvbnM7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX3NldGZsYWdzKTsKLQotaW50IHMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihlbnVtIGRtYV9jaCBpZCwgczNjMjQxMF9kbWFfY2Jmbl90IHJ0bikKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQljaC0+Y2FsbGJhY2tfZm4gPSBydG47Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKTsKLQotaW50IHMzYzI0MTBfZG1hX2RldmNvbmZpZyhlbnVtIGRtYV9jaCBpZCwgZW51bSBzM2MyNDEwX2RtYXNyYyBzb3VyY2UsCi0JCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCWNoID0gaWRfdG9fY2hhbihpZCk7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkZXZjZmdfZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKHNvdXJjZSkgewotCWNhc2UgUzNDMjQxMF9ETUFTUkNfSFc6IC8qIFAtPk0gKi8KLQkJY2gtPnJlcVswXS5ycXR5cGUgPSBERVZUT01FTTsKLQkJY2gtPnJlcVsxXS5ycXR5cGUgPSBERVZUT01FTTsKLQkJY2gtPnJxY2ZnLnNyY19pbmMgPSAwOwotCQljaC0+cnFjZmcuZHN0X2luYyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgUzNDMjQxMF9ETUFTUkNfTUVNOiAvKiBNLT5QICovCi0JCWNoLT5yZXFbMF0ucnF0eXBlID0gTUVNVE9ERVY7Ci0JCWNoLT5yZXFbMV0ucnF0eXBlID0gTUVNVE9ERVY7Ci0JCWNoLT5ycWNmZy5zcmNfaW5jID0gMTsKLQkJY2gtPnJxY2ZnLmRzdF9pbmMgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRldmNmZ19leGl0OwotCX0KLQotCWNoLT5zZGFkZHIgPSBhZGRyZXNzOwotCi1kZXZjZmdfZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woczNjMjQxMF9kbWFfZGV2Y29uZmlnKTsKLQotaW50IHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKGVudW0gZG1hX2NoIGlkLCBkbWFfYWRkcl90ICpzcmMsIGRtYV9hZGRyX3QgKmRzdCkKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2NoYW4gKmNoID0gaWRfdG9fY2hhbihpZCk7Ci0Jc3RydWN0IHBsMzMwX2NoYW5zdGF0dXMgc3RhdHVzOwotCWludCByZXQ7Ci0KLQlpZiAoIWNoIHx8IGNoYW5fZnJlZShjaCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gcGwzMzBfY2hhbl9zdGF0dXMoY2gtPnBsMzMwX2NoYW5faWQsICZzdGF0dXMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKnNyYyA9IHN0YXR1cy5zcmNfYWRkcjsKLQkqZHN0ID0gc3RhdHVzLmRzdF9hZGRyOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKTsKLQotc3RhdGljIGlycXJldHVybl90IHBsMzMwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JaWYgKHBsMzMwX3VwZGF0ZShkYXRhKSkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIElSUV9OT05FOwotfQotCi1zdGF0aWMgaW50IHBsMzMwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHMzY19wbDMzMF9kbWFjICpzM2NfcGwzMzBfZG1hYzsKLQlzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhICpwbDMzMHBkOwotCXN0cnVjdCBwbDMzMF9pbmZvICpwbDMzMF9pbmZvOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBpLCByZXQsIGlycTsKLQotCXBsMzMwcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCS8qIENhbid0IGRvIHdpdGhvdXQgdGhlIGxpc3Qgb2YgXzMyXyBwZXJpcGhlcmFscyAqLwotCWlmICghcGwzMzBwZCB8fCAhcGwzMzBwZC0+cGVyaSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybSBkYXRhIG1pc3NpbmchXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcGwzMzBfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwbDMzMF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbDMzMF9pbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsMzMwX2luZm8tPnBsMzMwX2RhdGEgPSBOVUxMOwotCXBsMzMwX2luZm8tPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gcHJvYmVfZXJyMTsKLQl9Ci0KLQlyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKLQotCXBsMzMwX2luZm8tPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFwbDMzMF9pbmZvLT5iYXNlKSB7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBwcm9iZV9lcnIyOwotCX0KLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKLQkJcmV0ID0gaXJxOwotCQlnb3RvIHByb2JlX2VycjM7Ci0JfQotCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBwbDMzMF9pcnFfaGFuZGxlciwgMCwKLQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBwbDMzMF9pbmZvKTsKLQlpZiAocmV0KQotCQlnb3RvIHByb2JlX2VycjQ7Ci0KLQkvKiBBbGxvY2F0ZSBhIG5ldyBETUFDICovCi0JczNjX3BsMzMwX2RtYWMgPSBrbWFsbG9jKHNpemVvZigqczNjX3BsMzMwX2RtYWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXMzY19wbDMzMF9kbWFjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZXJyNTsKLQl9Ci0KLQkvKiBHZXQgb3BlcmF0aW9uIGNsb2NrIGFuZCBlbmFibGUgaXQgKi8KLQlzM2NfcGwzMzBfZG1hYy0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGRtYSIpOwotCWlmIChJU19FUlIoczNjX3BsMzMwX2RtYWMtPmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBvcGVyYXRpb24gY2xvY2suXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBwcm9iZV9lcnI2OwotCX0KLQljbGtfZW5hYmxlKHMzY19wbDMzMF9kbWFjLT5jbGspOwotCi0JcmV0ID0gcGwzMzBfYWRkKHBsMzMwX2luZm8pOwotCWlmIChyZXQpCi0JCWdvdG8gcHJvYmVfZXJyNzsKLQotCS8qIEhvb2sgdGhlIGluZm8gKi8KLQlzM2NfcGwzMzBfZG1hYy0+cGkgPSBwbDMzMF9pbmZvOwotCi0JLyogTm8gYnVzeSBjaGFubmVscyAqLwotCXMzY19wbDMzMF9kbWFjLT5idXN5X2NoYW4gPSAwOwotCi0JczNjX3BsMzMwX2RtYWMtPmttY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShkZXZfbmFtZSgmcGRldi0+ZGV2KSwKLQkJCQlzaXplb2Yoc3RydWN0IHMzY19wbDMzMF94ZmVyKSwgMCwgMCwgTlVMTCk7Ci0KLQlpZiAoIXMzY19wbDMzMF9kbWFjLT5rbWNhY2hlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZXJyODsKLQl9Ci0KLQkvKiBHZXQgdGhlIGxpc3Qgb2YgcGVyaXBoZXJhbHMgKi8KLQlzM2NfcGwzMzBfZG1hYy0+cGVyaSA9IHBsMzMwcGQtPnBlcmk7Ci0KLQkvKiBBdHRhY2ggdG8gdGhlIGxpc3Qgb2YgRE1BQ3MgKi8KLQlsaXN0X2FkZF90YWlsKCZzM2NfcGwzMzBfZG1hYy0+bm9kZSwgJmRtYWNfbGlzdCk7Ci0KLQkvKiBDcmVhdGUgYSBjaGFubmVsIGZvciBlYWNoIHBlcmlwaGVyYWwgaW4gdGhlIERNQUMKLQkgKiB0aGF0IGlzLCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUEwzMzBfTUFYX1BFUkk7IGkrKykKLQkJaWYgKHMzY19wbDMzMF9kbWFjLT5wZXJpW2ldICE9IERNQUNIX01BWCkKLQkJCWNoYW5fYWRkKHMzY19wbDMzMF9kbWFjLT5wZXJpW2ldKTsKLQotCXByaW50ayhLRVJOX0lORk8KLQkJIkxvYWRlZCBkcml2ZXIgZm9yIFBMMzMwIERNQUMtJWQgJXNcbiIsCXBkZXYtPmlkLCBwZGV2LT5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJcdERCVUZGLSV1eCV1Ynl0ZXMgTnVtX0NoYW5zLSV1IE51bV9QZXJpLSV1IE51bV9FdmVudHMtJXVcbiIsCi0JCXBsMzMwX2luZm8tPnBjZmcuZGF0YV9idWZfZGVwLAotCQlwbDMzMF9pbmZvLT5wY2ZnLmRhdGFfYnVzX3dpZHRoIC8gOCwgcGwzMzBfaW5mby0+cGNmZy5udW1fY2hhbiwKLQkJcGwzMzBfaW5mby0+cGNmZy5udW1fcGVyaSwgcGwzMzBfaW5mby0+cGNmZy5udW1fZXZlbnRzKTsKLQotCXJldHVybiAwOwotCi1wcm9iZV9lcnI4OgotCXBsMzMwX2RlbChwbDMzMF9pbmZvKTsKLXByb2JlX2Vycjc6Ci0JY2xrX2Rpc2FibGUoczNjX3BsMzMwX2RtYWMtPmNsayk7Ci0JY2xrX3B1dChzM2NfcGwzMzBfZG1hYy0+Y2xrKTsKLXByb2JlX2VycjY6Ci0Ja2ZyZWUoczNjX3BsMzMwX2RtYWMpOwotcHJvYmVfZXJyNToKLQlmcmVlX2lycShpcnEsIHBsMzMwX2luZm8pOwotcHJvYmVfZXJyNDoKLXByb2JlX2VycjM6Ci0JaW91bm1hcChwbDMzMF9pbmZvLT5iYXNlKTsKLXByb2JlX2VycjI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci1wcm9iZV9lcnIxOgotCWtmcmVlKHBsMzMwX2luZm8pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbDMzMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgczNjX3BsMzMwX2RtYWMgKmRtYWMsICpkOwotCXN0cnVjdCBzM2NfcGwzMzBfY2hhbiAqY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZGVsLCBmb3VuZDsKLQotCWlmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc19sb2NrLCBmbGFncyk7Ci0KLQlmb3VuZCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZG1hY19saXN0LCBub2RlKQotCQlpZiAoZC0+cGktPmRldiA9PSAmcGRldi0+ZGV2KSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JaWYgKCFmb3VuZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkbWFjID0gZDsKLQotCS8qIFJlbW92ZSBhbGwgQ2hhbm5lbHMgdGhhdCBhcmUgbWFuYWdlZCBvbmx5IGJ5IHRoaXMgRE1BQyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZjaGFuX2xpc3QsIG5vZGUpIHsKLQotCQkvKiBPbmx5IGNoYW5uZWxzIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhpcyBETUFDICovCi0JCWlmIChpZmFjZV9vZl9kbWFjKGRtYWMsIGNoLT5pZCkpCi0JCQlkZWwgPSAxOwotCQllbHNlCi0JCQljb250aW51ZTsKLQotCQkvKiBEb24ndCByZW1vdmUgaWYgc29tZSBvdGhlciBETUFDIGhhcyBpdCB0b28gKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZG1hY19saXN0LCBub2RlKQotCQkJaWYgKGQgIT0gZG1hYyAmJiBpZmFjZV9vZl9kbWFjKGQsIGNoLT5pZCkpIHsKLQkJCQlkZWwgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCWlmIChkZWwpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc19sb2NrLCBmbGFncyk7Ci0JCQlzM2MyNDEwX2RtYV9mcmVlKGNoLT5pZCwgY2gtPmNsaWVudCk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQkJCWxpc3RfZGVsKCZjaC0+bm9kZSk7Ci0JCQlrZnJlZShjaCk7Ci0JCX0KLQl9Ci0KLQkvKiBEaXNhYmxlIG9wZXJhdGlvbiBjbG9jayAqLwotCWNsa19kaXNhYmxlKGRtYWMtPmNsayk7Ci0JY2xrX3B1dChkbWFjLT5jbGspOwotCi0JLyogUmVtb3ZlIHRoZSBETUFDICovCi0JbGlzdF9kZWwoJmRtYWMtPm5vZGUpOwotCWtmcmVlKGRtYWMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbDMzMF9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkubmFtZQk9ICJzM2MtcGwzMzAiLAotCX0sCi0JLnByb2JlCQk9IHBsMzMwX3Byb2JlLAotCS5yZW1vdmUJCT0gcGwzMzBfcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcGwzMzBfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBsMzMwX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChwbDMzMF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHBsMzMwX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGwzMzBfZHJpdmVyKTsKLQlyZXR1cm47Ci19Ci1tb2R1bGVfZXhpdChwbDMzMF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBMMzMwIERNQSBDb250cm9sbGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZGVidWctbWFjcm8uUwppbmRleCA4NTAxYmJmLi4wMmIxNjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L2RlYnVnLW1hY3JvLlMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL3NlcmlhbC5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdglccnAsICNTUEVBUl9EQkdfVUFSVF9CQVNFCQlAIFBoeXNpY2FsIGJhc2UKIAkJbW92CVxydiwgI1ZBX1NQRUFSX0RCR19VQVJUX0JBU0UJCUAgVmlydHVhbCBiYXNlCiAJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9ncGlvLmggYi9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9ncGlvLmgKaW5kZXggYjg1N2M5MS4uNDBhOGMxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zcGVhci9pbmNsdWRlL3BsYXQvZ3Bpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L2dwaW8uaApAQCAtMSwyNCArMSBAQAotLyoKLSAqIGFyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L2dwaW8uaAotICoKLSAqIEdQSU8gbWFjcm9zIGZvciBTUEVBciBwbGF0Zm9ybQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBTVCBNaWNyb2VsZWN0cm9uaWNzCi0gKiBWaXJlc2ggS3VtYXI8dmlyZXNoLmt1bWFyQHN0LmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgX19QTEFUX0dQSU9fSAotI2RlZmluZSBfX1BMQVRfR1BJT19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+Ci0KLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLQotI2VuZGlmIC8qIF9fUExBVF9HUElPX0ggKi8KKy8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNwZWFyL2luY2x1ZGUvcGxhdC9tZW1vcnkuaCBiL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L21lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTM1OTllLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIGFyY2gvYXJtL3BsYXQtc3BlYXIvaW5jbHVkZS9wbGF0L21lbW9yeS5oCi0gKgotICogTWVtb3J5IG1hcCBmb3IgU1BFQXIgcGxhdGZvcm0KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgU1QgTWljcm9lbGVjdHJvbmljcwotICogVmlyZXNoIEt1bWFyPHZpcmVzaC5rdW1hckBzdC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaWZuZGVmIF9fUExBVF9NRU1PUllfSAotI2RlZmluZSBfX1BMQVRfTUVNT1JZX0gKLQotLyogUGh5c2ljYWwgRFJBTSBvZmZzZXQgKi8KLSNkZWZpbmUgUExBVF9QSFlTX09GRlNFVAkJVUwoMHgwMDAwMDAwMCkKLQotI2VuZGlmIC8qIF9fUExBVF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC10Y2MvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCA3NjYyZjczLi5jZjE3ZDA0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKi8KIAotCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgorCQkubWFjcm8JYWRkcnVhcnQsIHJwLCBydiwgdG1wCiAJCW1vdmVxCVxycCwgIzB4OTAwMDAwMDAJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKIAkJbW92bmUJXHJ2LCAjMHhGMTAwMDAwMAlAIHZpcnR1YWwgYmFzZQogCQlvcnIJXHJwLCBccnAsICMweDAwMDA3MDAwCUAgVUFSVDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtdGNjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL3BsYXQtdGNjL2luY2x1ZGUvbWFjaC9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNmUwYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LXRjYy9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRlbGVjaGlwcwotICogQ29weXJpZ2h0IChDKSAyMDEwIEhhbnMgSi4gS29jaCA8aGprQGxpbnV0cm9uaXguZGU+Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgdjIuCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKLQotLyoKLSAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgotICovCi0jZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCVVMKDB4MjAwMDAwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC12ZXJzYXRpbGUvcGxhdHNtcC5jIGIvYXJjaC9hcm0vcGxhdC12ZXJzYXRpbGUvcGxhdHNtcC5jCmluZGV4IDUxZWNmZWEuLjkyZjE4ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtdmVyc2F0aWxlL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9wbGF0c21wLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkgKiBzaW5jZSB3ZSBoYXZlbid0IHNlbnQgdGhlbSBhIHNvZnQgaW50ZXJydXB0LCB0aGV5IHNob3VsZG4ndAogCSAqIGJlIHRoZXJlLgogCSAqLwotCXdyaXRlX3Blbl9yZWxlYXNlKGNwdSk7CisJd3JpdGVfcGVuX3JlbGVhc2UoY3B1X2xvZ2ljYWxfbWFwKGNwdSkpOwogCiAJLyoKIAkgKiBTZW5kIHRoZSBzZWNvbmRhcnkgQ1BVIGEgc29mdCBpbnRlcnJ1cHQsIHRoZXJlYnkgY2F1c2luZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCmluZGV4IDc5YmNiNDMuLjhmM2NjZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYworKysgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKQEAgLTgsOSArOCw5IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CkBAIC02OCw3ICs2OCw3IEBACiAvKgogICogRm9yY2UgYSByZWxvYWQgb2YgdGhlIFZGUCBjb250ZXh0IGZyb20gdGhlIHRocmVhZCBzdHJ1Y3R1cmUuICBXZSBkbwogICogdGhpcyBieSBlbnN1cmluZyB0aGF0IGFjY2VzcyB0byB0aGUgVkZQIGhhcmR3YXJlIGlzIGRpc2FibGVkLCBhbmQKLSAqIGNsZWFyIGxhc3RfVkZQX2NvbnRleHQuICBNdXN0IGJlIGNhbGxlZCBmcm9tIG5vbi1wcmVlbXB0aWJsZSBjb250ZXh0LgorICogY2xlYXIgdmZwX2N1cnJlbnRfaHdfc3RhdGUuICBNdXN0IGJlIGNhbGxlZCBmcm9tIG5vbi1wcmVlbXB0aWJsZSBjb250ZXh0LgogICovCiBzdGF0aWMgdm9pZCB2ZnBfZm9yY2VfcmVsb2FkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQogewpAQCAtNDM2LDkgKzQzNiw3IEBACiAJc2V0X2NvcHJvX2FjY2VzcyhhY2Nlc3MgfCBDUEFDQ19GVUxMKDEwKSB8IENQQUNDX0ZVTEwoMTEpKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+Ci0KKyNpZmRlZiBDT05GSUdfQ1BVX1BNCiBzdGF0aWMgaW50IHZmcF9wbV9zdXNwZW5kKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKQEAgLTQ2OCwxOSArNDY2LDMzIEBACiAJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU4pOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHZmcF9wbV9zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZAk9IHZmcF9wbV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gdmZwX3BtX3Jlc3VtZSwKK3N0YXRpYyBpbnQgdmZwX2NwdV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgY21kLAorCXZvaWQgKnYpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENQVV9QTV9FTlRFUjoKKwkJdmZwX3BtX3N1c3BlbmQoKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfUE1fRU5URVJfRkFJTEVEOgorCWNhc2UgQ1BVX1BNX0VYSVQ6CisJCXZmcF9wbV9yZXN1bWUoKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdmZwX2NwdV9wbV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHZmcF9jcHVfcG1fbm90aWZpZXIsCiB9OwogCiBzdGF0aWMgdm9pZCB2ZnBfcG1faW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZ2ZnBfcG1fc3lzY29yZV9vcHMpOworCWNwdV9wbV9yZWdpc3Rlcl9ub3RpZmllcigmdmZwX2NwdV9wbV9ub3RpZmllcl9ibG9jayk7CiB9CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdmZwX3BtX2luaXQodm9pZCkgeyB9Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCisjZW5kaWYgLyogQ09ORklHX0NQVV9QTSAqLwogCiAvKgogICogRW5zdXJlIHRoYXQgdGhlIFZGUCBzdGF0ZSBzdG9yZWQgaW4gJ3RocmVhZC0+dmZwc3RhdGUnIGlzIHVwIHRvIGRhdGUKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCmluZGV4IGZhZmVkNGMuLjFmMTdiZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwpAQCAtOTAsMTEgKzkwLDYgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpuYW5kX3BhcnRfaW5mbyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKLXsKLQkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKG5hbmRfcGFydGl0aW9ucyk7Ci0JcmV0dXJuIG5hbmRfcGFydGl0aW9uczsKLX0KIAogc3RhdGljIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgYXRuZ3cxMDBta2lpX25hbmRfZGF0YSBfX2luaXRkYXRhID0gewogCS5jbGUJCT0gMjEsCkBAIC0xMDIsNyArOTcsOCBAQAogCS5yZHlfcGluCT0gR1BJT19QSU5fUEIoMjgpLAogCS5lbmFibGVfcGluCT0gR1BJT19QSU5fUEUoMjMpLAogCS5idXNfd2lkdGhfMTYJPSB0cnVlLAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydF9pbmZvLAorCS5wYXJ0cwkJPSBuYW5kX3BhcnRpdGlvbnMsCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUobmFuZF9wYXJ0aXRpb25zKSwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDZjZTMwZmIuLjQ2NDNmZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTkwLDE4ICs5MCwxMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydF9pbmZvKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQotewotCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUobmFuZF9wYXJ0aXRpb25zKTsKLQlyZXR1cm4gbmFuZF9wYXJ0aXRpb25zOwotfQotCiBzdGF0aWMgc3RydWN0IGF0bWVsX25hbmRfZGF0YSBhdHN0azEwMDZfbmFuZF9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmNsZQkJPSAyMSwKIAkuYWxlCQk9IDIyLAogCS5yZHlfcGluCT0gR1BJT19QSU5fUEIoMzApLAogCS5lbmFibGVfcGluCT0gR1BJT19QSU5fUEIoMjkpLAotCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydF9pbmZvLAorCS5wYXJ0cwkJPSBuYW5kX3BhcnRpdGlvbnMsCisJLm51bV9wYXJ0cwk9IEFSUkFZX1NJWkUobnVtX3BhcnRpdGlvbnMpLAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKaW5kZXggODY5MjVmZC4uMjNiMWE5NyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jcHVmcmVxLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2NwdWZyZXEuYwppbmRleCAwMjRjNTg2Li42Mjc3NDMzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2NwdWZyZXEuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2NwdWZyZXEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiBzdGF0aWMgc3RydWN0IGNsayAqY3B1Y2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYm9hcmQuaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2JvYXJkLmgKaW5kZXggNjc5NDU4ZC4uNWQ3ZmZjYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYm9hcmQuaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9ib2FyZC5oCkBAIC0xMjgsNyArMTI4LDggQEAKIAl1OAlhbGU7CQkvKiBhZGRyZXNzIGxpbmUgbnVtYmVyIGNvbm5lY3RlZCB0byBBTEUgKi8KIAl1OAljbGU7CQkvKiBhZGRyZXNzIGxpbmUgbnVtYmVyIGNvbm5lY3RlZCB0byBDTEUgKi8KIAl1OAlidXNfd2lkdGhfMTY7CS8qIGJ1c3dpZHRoIGlzIDE2IGJpdCAqLwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICooKnBhcnRpdGlvbl9pbmZvKShpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucyk7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOworCXVuc2lnbmVkIGludAludW1fcGFydHM7CiB9Owogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqCiBhdDMyX2FkZF9kZXZpY2VfbmFuZCh1bnNpZ25lZCBpbnQgaWQsIHN0cnVjdCBhdG1lbF9uYW5kX2RhdGEgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwppbmRleCAyNTg2ODJiLi5hYWZmODNjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKaW5kZXggOWIzOWRlYS4uOTAzYzdkOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vZG1hLWNvaGVyZW50LmMgYi9hcmNoL2F2cjMyL21tL2RtYS1jb2hlcmVudC5jCmluZGV4IDNjMDA0MjIuLjUwY2RiNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vZG1hLWNvaGVyZW50LmMKKysrIGIvYXJjaC9hdnIzMi9tbS9kbWEtY29oZXJlbnQuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaAppbmRleCA3ZmQwZWM3Li5lY2FjZGYzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2VyaWFsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NlcmlhbC5oCkBAIC0zMiw2ICszMiw4IEBACiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCXVuc2lnbmVkIGludCBvbGRfc3RhdHVzOworCWludCB0eF9pcnE7CisJaW50IHJ4X2lycTsKIAlpbnQgc3RhdHVzX2lycTsKICNpZm5kZWYgQkZJTl9VQVJUX0JGNTRYX1NUWUxFCiAJdW5zaWduZWQgaW50IGxzcjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jCmluZGV4IDA0ZGRjZmUuLmYwZDExMTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZG1hLW1hcHBpbmcuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgc3BpbmxvY2tfdCBkbWFfcGFnZV9sb2NrOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmRtYV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDA0MzAwZjIuLmU0N2QxOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vYmZpbl9wZm1vbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3N5c19iZmluLmMKaW5kZXggODk0NDhlZC4uZDk5ODM4MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc3lzX2JmaW4uYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zeXNfYmZpbi5jCkBAIC00MSw2ICs0MSw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19GQikgfHwgZGVmaW5lZChDT05GSUdfRkJfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiB1bnNpZ25lZCBsb25nIGdldF9mYl91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIG9yaWdfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwppbmRleCBkNzhmYzJjLi5kMWMwYzBjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTM3Miw4ICszNzMsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTQxNSw4ICs0MjEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jCmluZGV4IDU1YzEyNzkuLjU0NzBiZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYwpAQCAtMzA5LDggKzMwOSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMzUyLDggKzM1NywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9hZDcxNjBldmFsLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYwppbmRleCBjMDRkZjQzLi41YmM2OTM4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC0zODAsOCArMzgxLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC00MjMsOCArNDI5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKaW5kZXggNjQwMDM0MS4uY2QyODk2OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC01MzksOCArNTQwLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC01ODIsOCArNTg4LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKaW5kZXggNmRiYjFiNC4uOWY3OTJlYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC00MTcsOCArNDE4LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC00NjAsOCArNDY2LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKaW5kZXggNGU5ZGM5Yy4uM2VjYWZmZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC03MTAsOCArNzExLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC03NTMsOCArNzU5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMKaW5kZXggZWM0YmM3NC4uM2E5MmM0MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC00OTUsOCArNDk2LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC01MzksOCArNTQ1LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKaW5kZXggNWRhNTc4Ny4uNDdjYWRkMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwpAQCAtMjM4LDggKzIzOCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYICsgMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCmluZGV4IGIwZWM4MjUuLjE4ODE3ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCkBAIC0xOTMsOCArMTkzLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlggKyAxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwppbmRleCAxNGY1NGEzLi4yYzhmMzBlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCkBAIC0yMjEsOCArMjIxLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlggKyAxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwppbmRleCBlY2QyODAxLi4xNDQ1NTZlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCkBAIC0yOTIsOCArMjkyLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlggKyAxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKaW5kZXggZmJlZTc3Zi4uYjU5N2Q0ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKQEAgLTE1MSw4ICsxNTEsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCArIDEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCmluZGV4IDk2NGE4ZTUuLjJhZmQwMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKQEAgLTI5OCw4ICsyOTgsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCArIDEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKaW5kZXggOWZiMjBkNi4uNjA0YTQzMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KQEAgLTMwNSw4ICszMDYsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTM2Niw4ICszNzIsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCmluZGV4IDViYTM4OWYuLmQ5MTZiNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC0zMDYsOCArMzA3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0zNDksOCArMzU1LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2RucDUzNzAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCmluZGV4IDhiYzk1MWQuLjVmMzA3MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0yMzYsOCArMjM3LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0yODAsOCArMjg2LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgICA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCAgID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgICA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKaW5kZXggYzYyZjlkYy4uMzkwMWRkMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwpAQCAtMjQwLDggKzI0MCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMjgzLDggKzI4OCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKaW5kZXggM2I4MTUxZC4uYWViZDMxYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTEwMCw2ICsxMDEsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9iZmluX21hYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGJmaW5fbWFjX3BlcmlwaGVyYWxzW10gPSBQX1JNSUkwOwogCiBzdGF0aWMgc3RydWN0IGJmaW5fcGh5ZGV2X3BsYXRmb3JtX2RhdGEgYmZpbl9waHlkZXZfZGF0YVtdID0gewpAQCAtMzA4LDggKzMxMCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMzUxLDggKzM1OCwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCmluZGV4IDZjOTE2YTYuLjdmYmIwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC0xNTY2LDggKzE1NjcsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTE2MjEsOCArMTYyNywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKaW5kZXggMmRhMDMxNi4uNjkxN2NlMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KQEAgLTMwNiw4ICszMDcsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTM0OSw4ICszNTUsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYwppbmRleCA2MjlmM2MzLi44MzU2ZWI1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCkBAIC00OSw4ICs0OSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1RYLAorCQkuZW5kID0gSVJRX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAotCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMTA0LDggKzEwOSwxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1RYLAorCQkuZW5kID0gSVJRX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAotCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtMTQ3LDggKzE1NywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQyX1RYLAorCQkuZW5kID0gSVJRX1VBUlQyX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlQyX1JYLAotCQkuZW5kID0gSVJRX1VBUlQyX1JYKzEsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCmluZGV4IDIxMmI5ZTAuLjAzNTBlYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKQEAgLTEzNSw4ICsxMzUsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTE3OCw4ICsxODMsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTIzNyw4ICsyNDcsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUMl9UWCwKKwkJLmVuZCA9IElSUV9VQVJUMl9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUMl9SWCwKLQkJLmVuZCA9IElSUV9VQVJUMl9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQyX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKQEAgLTI4MCw4ICsyOTUsMTMgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAl7CisJCS5zdGFydCA9IElSUV9VQVJUM19UWCwKKwkJLmVuZCA9IElSUV9VQVJUM19UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKLQkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZW5kID0gSVJRX1VBUlQzX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCBjZDljYmI2Li5iYjg2OGFjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC0yNDEsOCArMjQxLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0yODQsOCArMjg5LDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0zNDMsOCArMzUzLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDJfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUMl9SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC0zODYsOCArNDAxLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVDNfVFgsCisJCS5lbmQgPSBJUlFfVUFSVDNfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJewogCQkuc3RhcnQgPSBJUlFfVUFSVDNfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVDNfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUM19SWCwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvYWN2aWxvbi5jCmluZGV4IDk3MmUxMzQuLmIxYjczMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvYWN2aWxvbi5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvYWN2aWxvbi5jCkBAIC0yMDMsOCArMjAzLDEzIEBACiAJIC5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCSB9LAogCXsKKwkgLnN0YXJ0ID0gSVJRX1VBUlRfVFgsCisJIC5lbmQgPSBJUlFfVUFSVF9UWCwKKwkgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJIH0sCisJewogCSAuc3RhcnQgPSBJUlFfVUFSVF9SWCwKLQkgLmVuZCA9IElSUV9VQVJUX1JYICsgMSwKKwkgLmVuZCA9IElSUV9VQVJUX1JYLAogCSAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAkgfSwKIAl7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKaW5kZXggYzFiNzJmMi4uYzAxN2NmMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwpAQCAtMjc3LDggKzI3NywxMyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlRfVFgsCisJCS5lbmQgPSBJUlFfVUFSVF9UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CiAJCS5zdGFydCA9IElSUV9VQVJUX1JYLAotCQkuZW5kID0gSVJRX1VBUlRfUlgrMSwKKwkJLmVuZCA9IElSUV9VQVJUX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwppbmRleCA5NDkwZGM4Li4yN2YyMmVkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCkBAIC0xNzIsOCArMTcyLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlRfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlRfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCmluZGV4IGJiMDU2ZTYuLjFhNTdiYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKQEAgLTUxLDggKzUxLDEzIEBACiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJeworCQkuc3RhcnQgPSBJUlFfVUFSVF9UWCwKKwkJLmVuZCA9IElSUV9VQVJUX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKIAkJLnN0YXJ0ID0gSVJRX1VBUlRfUlgsCi0JCS5lbmQgPSBJUlFfVUFSVF9SWCsxLAorCQkuZW5kID0gSVJRX1VBUlRfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwppbmRleCA4NWRjNmQ2Li4yZTZlZWZkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tbS9pbml0LmMgYi9hcmNoL2JsYWNrZmluL21tL2luaXQuYwppbmRleCBmODQzNWNkLi43OGRhYWUwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYworKysgYi9hcmNoL2JsYWNrZmluL21tL2luaXQuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vYmZpbi1nbG9iYWwuaD4KICNpbmNsdWRlIDxhc20vcGRhLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2tnZGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCmluZGV4IGI5ZjljOGMuLmI1NzlkZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jCkBAIC02OTQsNyArNjk0LDcgQEAKICAgICAgICAgICAgICAgICAvKiBWYWxpZCBtZW0gYWRkcmVzcy4gKi8KICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAqbWVtKys7Ci0JCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2gpOworCQkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCkBAIC04NjgsNyArODY4LDcgQEAKIAkvKiBTZW5kIHRyYXAgdHlwZSAoY29udmVydGVkIHRvIHNpZ25hbCkgKi8KIAogCSpwdHIrKyA9ICdUJzsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgc2lndmFsKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgc2lndmFsKTsKIAogCS8qIFNlbmQgcmVnaXN0ZXIgY29udGVudHMuIFdlIHByb2JhYmx5IG9ubHkgbmVlZCB0byBzZW5kIHRoZQogCSAqIFBDLCBmcmFtZSBwb2ludGVyIGFuZCBzdGFjayBwb2ludGVyIGhlcmUuIE90aGVyIHJlZ2lzdGVycyB3aWxsIGJlCkBAIC04ODEsNyArODgxLDcgQEAKICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZWFkX3JlZ2lzdGVyIChyZWdubywgJnJlZ19jb250KTsKICAgICAgICAgICAgICAgICAKIAkJaWYgKHN0YXR1cyA9PSBTVUNDRVNTKSB7Ci0JCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgcmVnbm8pOworCQkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIHJlZ25vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICc6JzsKIAogICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbWVtMmhleChwdHIsICh1bnNpZ25lZCBjaGFyICopJnJlZ19jb250LApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9uYW5kZmxhc2guYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvbmFuZGZsYXNoLmMKaW5kZXggZjU4ZjJjMS4uN2ZiNTIxMiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9uYW5kZmxhc2guYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWEzL25hbmRmbGFzaC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAl0aGlzLT5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CiAKIAkvKiBFbmFibGUgdGhlIGZvbGxvd2luZyBmb3IgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgKi8KLQkvKiB0aGlzLT5vcHRpb25zID0gTkFORF9VU0VfRkxBU0hfQkJUOyAqLworCS8qIHRoaXMtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOyAqLwogCiAJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCiAJaWYgKG5hbmRfc2NhbihjcmlzdjMyX210ZCwgMSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvbmFuZGZsYXNoLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL25hbmRmbGFzaC5jCmluZGV4IGQ1YjBjYzkuLmUwMzIzODQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvbmFuZGZsYXNoLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1mcy9uYW5kZmxhc2guYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJdGhpcy0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOwogCiAJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCi0JLyogdGhpcy0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVDsgKi8KKwkvKiB0aGlzLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9GTEFTSDsgKi8KIAogCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwogCWlmIChuYW5kX3NjYW4oY3Jpc3YzMl9tdGQsIDEpKSB7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2tnZGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCmluZGV4IGMwMzQzYzMuLjhjMWQzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCkBAIC02NzcsNyArNjc3LDcgQEAKICAgICAgICAgICAgICAgICAvKiBWYWxpZCBtZW0gYWRkcmVzcy4gKi8KIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCWNoID0gKm1lbSsrOwotCQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoKTsKKwkJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaCk7CiAJCX0KICAgICAgICAgfQogICAgICAgICAvKiBUZXJtaW5hdGUgcHJvcGVybHkuICovCkBAIC02OTUsNyArNjk1LDcgQEAKIAltZW0gKz0gY291bnQgLSAxOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCWNoID0gKm1lbS0tOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2gpOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2gpOwogICAgICAgICB9CiAKICAgICAgICAgLyogVGVybWluYXRlIHByb3Blcmx5LiAqLwpAQCAtODgwLDcgKzg4MCw3IEBACiAJLyogU2VuZCB0cmFwIHR5cGUgKGNvbnZlcnRlZCB0byBzaWduYWwpICovCiAKIAkqcHRyKysgPSAnVCc7Ci0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIHNpZ3ZhbCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIHNpZ3ZhbCk7CiAKIAlpZiAoKChyZWcuZXhzICYgMHhmZjAwKSA+PiA4KSA9PSAweGMpIHsKIApAQCAtOTg4LDI2ICs5ODgsMjYgQEAKIAl9CiAJLyogT25seSBzZW5kIFBDLCBmcmFtZSBhbmQgc3RhY2sgcG9pbnRlci4gKi8KIAlyZWFkX3JlZ2lzdGVyKFBDLCAmcmVnX2NvbnQpOwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBQQyk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIFBDKTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleChwdHIsICh1bnNpZ25lZCBjaGFyICopJnJlZ19jb250LCByZWdpc3Rlcl9zaXplW1BDXSk7CiAJKnB0cisrID0gJzsnOwogCiAJcmVhZF9yZWdpc3RlcihSOCwgJnJlZ19jb250KTsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgUjgpOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBSOCk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgocHRyLCAodW5zaWduZWQgY2hhciAqKSZyZWdfY29udCwgcmVnaXN0ZXJfc2l6ZVtSOF0pOwogCSpwdHIrKyA9ICc7JzsKIAogCXJlYWRfcmVnaXN0ZXIoU1AsICZyZWdfY29udCk7Ci0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIFNQKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgU1ApOwogCSpwdHIrKyA9ICc6JzsKIAlwdHIgPSBtZW0yaGV4KHB0ciwgKHVuc2lnbmVkIGNoYXIgKikmcmVnX2NvbnQsIHJlZ2lzdGVyX3NpemVbU1BdKTsKIAkqcHRyKysgPSAnOyc7CiAKIAkvKiBTZW5kIEVSUCBhcyB3ZWxsOyB0aGlzIHdpbGwgc2F2ZSB1cyBhbiBlbnRpcmUgcmVnaXN0ZXIgZmV0Y2ggaW4gc29tZSBjYXNlcy4gKi8KICAgICAgICAgcmVhZF9yZWdpc3RlcihFUlAsICZyZWdfY29udCk7Ci0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEVSUCk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEVSUCk7CiAgICAgICAgICpwdHIrKyA9ICc6JzsKICAgICAgICAgcHRyID0gbWVtMmhleChwdHIsICh1bnNpZ25lZCBjaGFyICopJnJlZ19jb250LCByZWdpc3Rlcl9zaXplW0VSUF0pOwogICAgICAgICAqcHRyKysgPSAnOyc7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCmluZGV4IGE0ZGJhNmIuLmE2ZDUzODEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCkBAIC02NzIsNyArNjcyLDcgQEAKIAlpZiAoKHVpbnQzMl90KW1lbSYxICYmIGNvdW50Pj0xKSB7CiAJCWlmICghZ2Ric3R1Yl9yZWFkX2J5dGUobWVtLGNoKSkKIAkJCXJldHVybiBOVUxMOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOwogCQltZW0rKzsKIAkJY291bnQtLTsKIAl9CkBAIC02ODAsOCArNjgwLDggQEAKIAlpZiAoKHVpbnQzMl90KW1lbSYzICYmIGNvdW50Pj0yKSB7CiAJCWlmICghZ2Ric3R1Yl9yZWFkX3dvcmQobWVtLCh1aW50MTZfdCAqKWNoKSkKIAkJCXJldHVybiBOVUxMOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMV0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMV0pOwogCQltZW0gKz0gMjsKIAkJY291bnQgLT0gMjsKIAl9CkBAIC02ODksMTAgKzY4OSwxMCBAQAogCXdoaWxlIChjb3VudD49NCkgewogCQlpZiAoIWdkYnN0dWJfcmVhZF9kd29yZChtZW0sKHVpbnQzMl90ICopY2gpKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsxXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsyXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFszXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsxXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsyXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFszXSk7CiAJCW1lbSArPSA0OwogCQljb3VudCAtPSA0OwogCX0KQEAgLTcwMCw4ICs3MDAsOCBAQAogCWlmIChjb3VudD49MikgewogCQlpZiAoIWdkYnN0dWJfcmVhZF93b3JkKG1lbSwodWludDE2X3QgKiljaCkpCiAJCQlyZXR1cm4gTlVMTDsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzBdKTsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsIGNoWzFdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzBdKTsKKwkJYnVmID0gaGV4X2J5dGVfcGFjayhidWYsIGNoWzFdKTsKIAkJbWVtICs9IDI7CiAJCWNvdW50IC09IDI7CiAJfQpAQCAtNzA5LDcgKzcwOSw3IEBACiAJaWYgKGNvdW50Pj0xKSB7CiAJCWlmICghZ2Ric3R1Yl9yZWFkX2J5dGUobWVtLGNoKSkKIAkJCXJldHVybiBOVUxMOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOwogCX0KIAogCSpidWYgPSAwOwpAQCAtMTQ5OCwyMSArMTQ5OCwyMSBAQAogCQlwdHIgPSBtZW0yaGV4KHRpdGxlLCBwdHIsIHNpemVvZih0aXRsZSkgLSAxLDApOwogCiAJCWh4ID0gaGV4X2FzY19oaShicnIgPj4gMjQpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oYnJyID4+IDI0KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2hpKGJyciA+PiAxNik7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhicnIgPj4gMTYpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfaGkoYnJyID4+IDgpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oYnJyID4+IDgpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfaGkoYnJyKTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGJycik7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAKIAkJcHRyID0gbWVtMmhleChjcmxmLCBwdHIsIHNpemVvZihjcmxmKSAtIDEsIDApOwogCQkqcHRyID0gMDsKQEAgLTE1MjYsMTAgKzE1MjYsMTAgQEAKIAogCS8qIFNlbmQgdHJhcCB0eXBlIChjb252ZXJ0ZWQgdG8gc2lnbmFsKSAqLwogCSpwdHIrKyA9ICdUJzsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgc2lndmFsKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgc2lndmFsKTsKIAogCS8qIFNlbmQgRXJyb3IgUEMgKi8KLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgR0RCX1JFR19QQyk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEdEQl9SRUdfUEMpOwogCSpwdHIrKyA9ICc6JzsKIAlwdHIgPSBtZW0yaGV4KCZfX2RlYnVnX2ZyYW1lLT5wYywgcHRyLCA0LCAwKTsKIAkqcHRyKysgPSAnOyc7CkBAIC0xNTM3LDcgKzE1MzcsNyBAQAogCS8qCiAJICogU2VuZCBmcmFtZSBwb2ludGVyCiAJICovCi0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEdEQl9SRUdfRlApOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBHREJfUkVHX0ZQKTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleCgmX19kZWJ1Z19mcmFtZS0+ZnAsIHB0ciwgNCwgMCk7CiAJKnB0cisrID0gJzsnOwpAQCAtMTU0NSw3ICsxNTQ1LDcgQEAKIAkvKgogCSAqIFNlbmQgc3RhY2sgcG9pbnRlcgogCSAqLwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBHREJfUkVHX1NQKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgR0RCX1JFR19TUCk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgoJl9fZGVidWdfZnJhbWUtPnNwLCBwdHIsIDQsIDApOwogCSpwdHIrKyA9ICc7JzsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ncGlvLWludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvaDgzMDAvaW5jbHVkZS9hc20vZ3Bpby5oCnJlbmFtZSB0byBhcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2dwaW8taW50ZXJuYWwuaApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvaXJxLmMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9pcnEuYwppbmRleCBlOTc3MzQ1Li5iYzRmNTFiIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9pcnEuYworKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9pcnEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLWludGVybmFsLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ3MzMDZ4Lmg+CiAKIGNvbnN0IGludCBfX2luaXRkYXRhIGg4MzAwX3NhdmVkX3ZlY3RvcnNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2lycS5jIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaXJxLmMKaW5kZXggODE4MmYwNC4uN2I1ZjI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaXJxLmMKKysrIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaXJxLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby1pbnRlcm5hbC5oPgogI2luY2x1ZGUgPGFzbS9yZWdzMjY3eC5oPgogCiAvKiBzYXZlZCB2ZWN0b3IgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL0tjb25maWcgYi9hcmNoL2hleGFnb24vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUxM2MyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL0tjb25maWcKQEAgLTAsMCArMSwyMjAgQEAKKyMgSGV4YWdvbiBjb25maWd1cmF0aW9uCitjb21tZW50ICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgSGV4YWdvbiIKKworY29uZmlnIEhFWEFHT04KKwlkZWZfYm9vbCB5CisJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaWYgU01QCisJIyBPdGhlciBwZW5kaW5nIHByb2plY3RzL3RvLWRvIGl0ZW1zLgorCSMgc2VsZWN0IEhBVkVfUkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQSQorCSMgc2VsZWN0IEhBVkVfSFdfQlJFQUtQT0lOVCBpZiBQRVJGX0VWRU5UUworCSMgc2VsZWN0IEFSQ0hfSEFTX0NQVV9JRExFX1dBSVQKKwkjIHNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCSMgc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJIyBzZWxlY3QgSEFWRV9DTEsKKwkjIHNlbGVjdCBJUlFfUEVSX0NQVQorCXNlbGVjdCBIQVZFX0lSUV9XT1JLCisJIyBzZWxlY3QgR0VORVJJQ19QRU5ESU5HX0lSUSBpZiBTTVAKKwlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NAorCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IEhBVkVfR0VORVJJQ19IQVJESVJRUworCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19ERVBSRUNBVEVECisJIyBHRU5FUklDX0FMTE9DQVRPUiBpcyB1c2VkIGJ5IGRtYV9hbGxvY19jb2hlcmVudCgpCisJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCisJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKKwlzZWxlY3QgSEFWRV9BUkNIX0tHREIKKwlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSworCXNlbGVjdCBOT19JT1BPUlQKKwkjIG1vc3RseSBnZW5lcmljIHJvdXRpbmVzLCB3aXRoIHNvbWUgYWNjZWxlcmF0ZWQgb25lcworCS0tLWhlbHAtLS0KKwkgIFF1YWxjb21tIEhleGFnb24gaXMgYSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIGRlc2lnbmVkIGZvciBoaWdoCisJICBwZXJmb3JtYW5jZSBhbmQgbG93IHBvd2VyIGFjcm9zcyBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMuCisKK2NvbmZpZyBIRVhBR09OX0FSQ0hfVjEKKwlib29sCisKK2NvbmZpZyBIRVhBR09OX0FSQ0hfVjIKKwlib29sCisKK2NvbmZpZyBIRVhBR09OX0FSQ0hfVjMKKwlib29sCisKK2NvbmZpZyBIRVhBR09OX0FSQ0hfVjQKKwlib29sCisKK2NvbmZpZyBGUkFNRV9QT0lOVEVSCisJZGVmX2Jvb2wgeQorCitjb25maWcgTE9DS0RFUF9TVVBQT1JUCisJZGVmX2Jvb2wgeQorCitjb25maWcgUENJCisJZGVmX2Jvb2wgbgorCitjb25maWcgRUFSTFlfUFJJTlRLCisJZGVmX2Jvb2wgeQorCitjb25maWcgS1RJTUVfU0NBTEFSCisJZGVmX2Jvb2wgeQorCitjb25maWcgTU1VCisJZGVmX2Jvb2wgeQorCitjb25maWcgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAorCWRlZl9ib29sIHkKKworY29uZmlnIEdFTkVSSUNfQ1NVTQorCWRlZl9ib29sIHkKKworIworIyBVc2UgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgaW4ga2VybmVsL2lycS86CisjCitjb25maWcgR0VORVJJQ19JUlFfUFJPQkUKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJZGVmX2Jvb2wgeQorCisjY29uZmlnIFpPTkVfRE1BCisjCWJvb2wKKyMJZGVmYXVsdCB5CisKK2NvbmZpZyBIQVNfRE1BCisJYm9vbAorCXNlbGVjdCBIQVZFX0RNQV9BVFRSUworCWRlZmF1bHQgeQorCitjb25maWcgTkVFRF9TR19ETUFfTEVOR1RICisJZGVmX2Jvb2wgeQorCitjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworCWRlZl9ib29sIG4KKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19IV0VJR0hUCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19USU1FCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUworCWRlZl9ib29sIHkKKworY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCisJZGVmX2Jvb2wgeQorCitjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCisJZGVmX2Jvb2wgeQorCXNlbGVjdCBTVEFDS1RSQUNFCisKK2NvbmZpZyBHRU5FUklDX0JVRworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIEJVRworCitjb25maWcgQlVHCisJZGVmX2Jvb2wgeQorCittZW51ICJNYWNoaW5lIHNlbGVjdGlvbiIKKworY2hvaWNlCisJcHJvbXB0ICJTeXN0ZW0gdHlwZSIKKwlkZWZhdWx0IEhFWEFHT05fQVJDSF9WMgorCitjb25maWcgSEVYQUdPTl9DT01FVAorCWJvb2wgIkNvbWV0IEJvYXJkIgorCXNlbGVjdCBIRVhBR09OX0FSQ0hfVjIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgQ29tZXQgcGxhdGZvcm0uCisKK2VuZGNob2ljZQorCitjb25maWcgSEVYQUdPTl9WTQorCWRlZl9ib29sIHkKKworY29uZmlnIENNRExJTkUKKwlzdHJpbmcgIkRlZmF1bHQga2VybmVsIGNvbW1hbmQgc3RyaW5nIgorCWRlZmF1bHQgIiIKKwloZWxwCisJICBPbiBzb21lIHBsYXRmb3JtcywgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSBmb3IgdGhlIGJvb3QgbG9hZGVyCisJICB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUga2VybmVsLiBGb3IgdGhlc2UsIHlvdSBzaG91bGQgc3VwcGx5IHNvbWUKKwkgIGNvbW1hbmQtbGluZSBvcHRpb25zIGF0IGJ1aWxkIHRpbWUgYnkgZW50ZXJpbmcgdGhlbSBoZXJlLiAgQXQgYQorCSAgbWluaW11bSwgeW91IHNob3VsZCBzcGVjaWZ5IHRoZSBtZW1vcnkgc2l6ZSBhbmQgdGhlIHJvb3QgZGV2aWNlCisJICAoZS5nLiwgbWVtPTY0TSByb290PS9kZXYvbmZzKS4KKworY29uZmlnIEhFWEFHT05fQU5HRUxfVFJBUFMKKwlib29sICJVc2UgQW5nZWwgVHJhcHMiCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgRW5hYmxlIGFuZ2VsIGRlYnVnIHRyYXBzIChmb3IgcHJpbnRrJ3MpLgorCitjb25maWcgU01QCisJYm9vbCAiTXVsdGktUHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZXMgU01QIHN1cHBvcnQgaW4gdGhlIGtlcm5lbC4gIElmIHVuc3VyZSwgc2F5ICJZIgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyIgaWYgU01QCisJcmFuZ2UgMiA2IGlmIFNNUAorCWRlZmF1bHQgIjEiIGlmICFTTVAKKwlkZWZhdWx0ICI2IiBpZiBTTVAKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB3aGljaCB0aGlzCisJICBrZXJuZWwgd2lsbCBzdXBwb3J0LiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIDYgYW5kIHRoZQorCSAgbWluaW11bSB2YWx1ZSB3aGljaCBtYWtlcyBzZW5zZSBpcyAyLgorCisJICBUaGlzIGlzIHB1cmVseSB0byBzYXZlIG1lbW9yeSAtIGVhY2ggc3VwcG9ydGVkIENQVSBhZGRzCisJICBhcHByb3hpbWF0ZWx5IGVpZ2h0IGtpbG9ieXRlcyB0byB0aGUga2VybmVsIGltYWdlLgorCitjaG9pY2UKKwlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiCisJZGVmYXVsdCBQQUdFX1NJWkVfNEtCCisJLS0taGVscC0tLQorCSAgQ2hhbmdlcyB0aGUgZGVmYXVsdCBwYWdlIHNpemU7IHVzZSB3aXRoIGNhdXRpb24uCisKK2NvbmZpZyBQQUdFX1NJWkVfNEtCCisJYm9vbCAiNEtCIgorCitjb25maWcgUEFHRV9TSVpFXzE2S0IKKwlib29sICIxNktCIgorCitjb25maWcgUEFHRV9TSVpFXzY0S0IKKwlib29sICI2NEtCIgorCitjb25maWcgUEFHRV9TSVpFXzI1NktCCisJYm9vbCAiMjU2S0IiCisKK2VuZGNob2ljZQorCitzb3VyY2UgIm1tL0tjb25maWciCisKK3NvdXJjZSAia2VybmVsL0tjb25maWcuaHoiCitzb3VyY2UgImtlcm5lbC90aW1lL0tjb25maWciCisKK2NvbmZpZyBHRU5FUklDX0dQSU8KKwlib29sICJHZW5lcmljIEdQSU8gc3VwcG9ydCIKKwlkZWZhdWx0IG4KKworZW5kbWVudQorCitzb3VyY2UgImluaXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9LY29uZmlnIgorc291cmNlICJmcy9LY29uZmlnIgorCittZW51ICJFeGVjdXRhYmxlIEZpbGUgRm9ybWF0cyIKK3NvdXJjZSAiZnMvS2NvbmZpZy5iaW5mbXQiCitlbmRtZW51CisKK3NvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgInNlY3VyaXR5L0tjb25maWciCitzb3VyY2UgImNyeXB0by9LY29uZmlnIgorc291cmNlICJsaWIvS2NvbmZpZyIKKworbWVudSAiS2VybmVsIGhhY2tpbmciCitzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgorZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL01ha2VmaWxlIGIvYXJjaC9oZXhhZ29uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGRlODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1OCBAQAorIyAgTWFrZWZpbGUgZm9yIHRoZSBIZXhhZ29uIGFyY2gKKworS0JVSUxEX0RFRkNPTkZJRyA9IGNvbWV0X2RlZmNvbmZpZworCisjIERvIG5vdCB1c2UgR1AtcmVsYXRpdmUganVtcHMKK0tCVUlMRF9DRkxBR1MgKz0gLUcwCitMREZMQUdTX3ZtbGludXggKz0gLUcwCisKKyMgRG8gbm90IHVzZSBzaW5nbGUtYnl0ZSBlbnVtczsgdGhlc2Ugd2lsbCBvdmVyZmxvdy4KK0tCVUlMRF9DRkxBR1MgKz0gLWZuby1zaG9ydC1lbnVtcworCisjIE1vZHVsZXMgbXVzdCB1c2UgZWl0aGVyIGxvbmctY2FsbHMsIG9yIHVzZSBwaWMvcGx0LgorIyBVc2UgbG9uZy1jYWxscyBmb3Igbm93LCBpdCdzIGVhc2llci4gIEFuZCBmYXN0ZXIuCisjIENGTEFHU19NT0RVTEUgKz0gLWZQSUMKKyMgTERGTEFHU19NT0RVTEUgKz0gLXNoYXJlZAorQ0ZMQUdTX01PRFVMRSArPSAtbWxvbmctY2FsbHMKKworY2ZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WMSkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXYxKQorY2ZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WMikgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXYyKQorY2ZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WMykgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXYzKQorY2ZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WNCkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXY0KQorCithZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YxKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjEpCithZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YyKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjIpCithZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YzKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjMpCithZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1Y0KSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjQpCisKK2xkZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1YxKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjEpCitsZGZsYWdzLSQoQ09ORklHX0hFWEFHT05fQVJDSF9WMikgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXYyKQorbGRmbGFncy0kKENPTkZJR19IRVhBR09OX0FSQ0hfVjMpICs9ICQoY2FsbCBjYy1vcHRpb24sLW12MykKK2xkZmxhZ3MtJChDT05GSUdfSEVYQUdPTl9BUkNIX1Y0KSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdjQpCisKK0tCVUlMRF9DRkxBR1MgKz0gJChjZmxhZ3MteSkKK0tCVUlMRF9BRkxBR1MgKz0gJChhZmxhZ3MteSkKKworIyAgbm8gS0JVSUxEX0xERkxBR1M/CitMREZMQUdTICs9ICQobGRmbGFncy15KQorCisjIFRocmVhZC1pbmZvIHJlZ2lzdGVyIHdpbGwgYmUgcjE5LiAgVGhpcyB2YWx1ZSBpcyBub3QgY29uZmlndXJlYWJsZTsKKyMgaXQgaXMgaGFyZC1jb2RlZCBpbiBzZXZlcmFsIGZpbGVzLgorVElSX05BTUUgOj0gcjE5CitLQlVJTERfQ0ZMQUdTICs9IC1mZml4ZWQtJChUSVJfTkFNRSkgLURUSFJFQURJTkZPX1JFRz0kKFRJUl9OQU1FKSAtRF9fbGludXhfXworS0JVSUxEX0FGTEFHUyArPSAtRFRIUkVBRElORk9fUkVHPSQoVElSX05BTUUpCisKK0xJQkdDQyA6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0NGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCitsaWJzLXkgKz0gJChMSUJHQ0MpCisKK2hlYWQteSA6PSBhcmNoL2hleGFnb24va2VybmVsL2hlYWQubyBcCisJYXJjaC9oZXhhZ29uL2tlcm5lbC9pbml0X3Rhc2subworCitjb3JlLXkgKz0gYXJjaC9oZXhhZ29uL2tlcm5lbC8gXAorCWFyY2gvaGV4YWdvbi9tbS8gXAorCWFyY2gvaGV4YWdvbi9saWIvCisKKyMJYXJjaC9oZXhhZ29uL3BsYXRmb3JtL2NvbW1vbi8KKyMKKyNjb3JlLSQoQ09ORklHX0hFWEFHT05fQ09NRVQpCQkrPSBhcmNoL2hleGFnb24vcGxhdGZvcm0vY29tZXQvCisjbWFjaGluZS0kKENPTkZJR19IRVhBR09OX0NPTUVUKQkJOj0gY29tZXQKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9jb25maWdzL2NvbWV0X2RlZmNvbmZpZyBiL2FyY2gvaGV4YWdvbi9jb25maWdzL2NvbWV0X2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI0ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2NvbmZpZ3MvY29tZXRfZGVmY29uZmlnCkBAIC0wLDAgKzEsODUgQEAKK0NPTkZJR19TTVA9eQorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfSFpfMTAwPXkKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NST1NTX0NPTVBJTEU9ImhleGFnb24tIgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iLXNtcCIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorQ09ORklHX1RBU0tTVEFUUz15CitDT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xOAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfQ09OTkVDVE9SPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfTkJEPXkKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1BIWUxJQj15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD02NAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0RFQlVHPXkKK0NPTkZJR19TUElfQklUQkFORz15CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQorIyBDT05GSUdfTUlTQ19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorQ09ORklHX0NSQ19DQ0lUVD15CitDT05GSUdfQ1JDMTY9eQorQ09ORklHX0NSQ19UMTBESUY9eQorQ09ORklHX0xJQkNSQzMyQz15CitDT05GSUdfRlJBTUVfV0FSTj0wCitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYTE3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0wLDAgKzEsNTggQEAKK2luY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK2hlYWRlci15ICs9IHJlZ2lzdGVycy5oCitoZWFkZXIteSArPSB1Y29udGV4dC5oCitoZWFkZXIteSArPSB1c2VyLmgKKworZ2VuZXJpYy15ICs9IGF1eHZlYy5oCitnZW5lcmljLXkgKz0gYnVnLmgKK2dlbmVyaWMteSArPSBidWdzLmgKK2dlbmVyaWMteSArPSBjcHVtYXNrLmgKK2dlbmVyaWMteSArPSBjcHV0aW1lLmgKK2dlbmVyaWMteSArPSBjdXJyZW50LmgKK2dlbmVyaWMteSArPSBkZXZpY2UuaAorZ2VuZXJpYy15ICs9IGRpdjY0LmgKK2dlbmVyaWMteSArPSBlbWVyZ2VuY3ktcmVzdGFydC5oCitnZW5lcmljLXkgKz0gZXJybm8uaAorZ2VuZXJpYy15ICs9IGZiLmgKK2dlbmVyaWMteSArPSBmY250bC5oCitnZW5lcmljLXkgKz0gZnRyYWNlLmgKK2dlbmVyaWMteSArPSBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBod19pcnEuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpb2N0bHMuaAorZ2VuZXJpYy15ICs9IGlvbWFwLmgKK2dlbmVyaWMteSArPSBpcGNidWYuaAorZ2VuZXJpYy15ICs9IGlwYy5oCitnZW5lcmljLXkgKz0gaXJxX3JlZ3MuaAorZ2VuZXJpYy15ICs9IGtkZWJ1Zy5oCitnZW5lcmljLXkgKz0ga21hcF90eXBlcy5oCitnZW5lcmljLXkgKz0gbG9jYWw2NC5oCitnZW5lcmljLXkgKz0gbG9jYWwuaAorZ2VuZXJpYy15ICs9IGxvY2FsLmgKK2dlbmVyaWMteSArPSBtbWFuLmgKK2dlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IHBjaS5oCitnZW5lcmljLXkgKz0gcGVyY3B1LmgKK2dlbmVyaWMteSArPSBwb2xsLmgKK2dlbmVyaWMteSArPSBwb3NpeF90eXBlcy5oCitnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAorZ2VuZXJpYy15ICs9IHJ3c2VtLmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VjdGlvbnMuaAorZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAorZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCitnZW5lcmljLXkgKz0gc2htYnVmLmgKK2dlbmVyaWMteSArPSBzaG1wYXJhbS5oCitnZW5lcmljLXkgKz0gc2lnaW5mby5oCitnZW5lcmljLXkgKz0gc29ja2V0LmgKK2dlbmVyaWMteSArPSBzb2NraW9zLmgKK2dlbmVyaWMteSArPSBzdGF0ZnMuaAorZ2VuZXJpYy15ICs9IHN0YXQuaAorZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKK2dlbmVyaWMteSArPSB0ZXJtaW9zLmgKK2dlbmVyaWMteSArPSB0b3BvbG9neS5oCitnZW5lcmljLXkgKz0gdHlwZXMuaAorZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKK2dlbmVyaWMteSArPSB1bmFsaWduZWQuaAorZ2VuZXJpYy15ICs9IHhvci5oCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzBlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8Z2VuZXJhdGVkL2FzbS1vZmZzZXRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMGY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIEF0b21pYyBvcGVyYXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0FUT01JQ19ICisjZGVmaW5lIF9BU01fQVRPTUlDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJCXsgKGkpIH0KKyNkZWZpbmUgYXRvbWljX3NldCh2LCBpKQkoKHYpLT5jb3VudGVyID0gKGkpKQorCisvKioKKyAqIGF0b21pY19yZWFkIC0gcmVhZHMgYSB3b3JkLCBhdG9taWNhbGx5CisgKiBAdjogcG9pbnRlciB0byBhdG9taWMgdmFsdWUKKyAqCisgKiBBc3N1bWVzIGFsbCB3b3JkIHJlYWRzIG9uIG91ciBhcmNoaXRlY3R1cmUgYXJlIGF0b21pYy4KKyAqLworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKKworLyoqCisgKiBhdG9taWNfeGNoZyAtIGF0b21pYworICogQHY6IHBvaW50ZXIgdG8gbWVtb3J5IHRvIGNoYW5nZQorICogQG5ldzogbmV3IHZhbHVlICh0ZWNobmljYWxseSBwYXNzZWQgaW4gYSByZWdpc3RlciAtLSBzZWUgeGNoZykKKyAqLworI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpCSh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG5ldykpKQorCisKKy8qKgorICogYXRvbWljX2NtcHhjaGcgLSBhdG9taWMgY29tcGFyZS1hbmQtZXhjaGFuZ2UgdmFsdWVzCisgKiBAdjogcG9pbnRlciB0byB2YWx1ZSB0byBjaGFuZ2UKKyAqIEBvbGQ6ICBkZXNpcmVkIG9sZCB2YWx1ZSB0byBtYXRjaAorICogQG5ldzogIG5ldyB2YWx1ZSB0byBwdXQgaW4KKyAqCisgKiBQYXJhbWV0ZXJzIGFyZSB0aGVuIHBvaW50ZXIsIHZhbHVlLWluLXJlZ2lzdGVyLCB2YWx1ZS1pbi1yZWdpc3RlciwKKyAqIGFuZCB0aGUgb3V0cHV0IGlzIHRoZSBvbGQgdmFsdWUuCisgKgorICogQXBwYXJlbnRseSB0aGlzIGlzIGNvbXBsaWNhdGVkIGZvciBhcmNocyB0aGF0IGRvbid0IHN1cHBvcnQKKyAqIHRoZSBtZW13X2xvY2tlZCBsaWtlIHdlIGRvIChvciBpdCdzIGJyb2tlbiBvciB3aGF0ZXZlcikuCisgKgorICogS2luZCBvZiB0aGUgbHluY2hwaW4gb2YgdGhlIHJlc3Qgb2YgdGhlIGdlbmVyaWNhbGx5IGRlZmluZWQgcm91dGluZXMuCisgKiBSZW1lbWJlciBWMiBoYWQgdGhhdCBidWcgd2l0aCBkb3RuZXcgcHJlZGljYXRlIHNldCBieSBtZW13X2xvY2tlZC4KKyAqCisgKiAib2xkIiBpcyAiZXhwZWN0ZWQiIG9sZCB2YWwsIF9fb2xkdmFsIGlzIGFjdHVhbCBvbGQgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2NtcHhjaGcoYXRvbWljX3QgKnYsIGludCBvbGQsIGludCBuZXcpCit7CisJaW50IF9fb2xkdmFsOworCisJYXNtIHZvbGF0aWxlKAorCQkiMToJJTAgPSBtZW13X2xvY2tlZCglMSk7XG4iCisJCSIJeyBQMCA9IGNtcC5lcSglMCwlMik7XG4iCisJCSIJICBpZiAoIVAwLm5ldykganVtcDpudCAyZjsgfVxuIgorCQkiCW1lbXdfbG9ja2VkKCUxLFAwKSA9ICUzO1xuIgorCQkiCWlmICghUDApIGp1bXAgMWI7XG4iCisJCSIyOlxuIgorCQk6ICI9JnIiIChfX29sZHZhbCkKKwkJOiAiciIgKCZ2LT5jb3VudGVyKSwgInIiIChvbGQpLCAiciIgKG5ldykKKwkJOiAibWVtb3J5IiwgInAwIgorCSk7CisKKwlyZXR1cm4gX19vbGR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgb3V0cHV0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMToJJTAgPSBtZW13X2xvY2tlZCglMSk7XG4iCisJCSIJJTAgPSBhZGQoJTAsJTIpO1xuIgorCQkiCW1lbXdfbG9ja2VkKCUxLFAzKT0lMDtcbiIKKwkJIglpZiAhUDMganVtcCAxYjtcbiIKKwkJOiAiPSZyIiAob3V0cHV0KQorCQk6ICJyIiAoJnYtPmNvdW50ZXIpLCAiciIgKGkpCisJCTogIm1lbW9yeSIsICJwMyIKKwkpOworCXJldHVybiBvdXRwdXQ7CisKK30KKworI2RlZmluZSBhdG9taWNfYWRkKGksIHYpIGF0b21pY19hZGRfcmV0dXJuKGksICh2KSkKKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCWludCBvdXRwdXQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMToJJTAgPSBtZW13X2xvY2tlZCglMSk7XG4iCisJCSIJJTAgPSBzdWIoJTAsJTIpO1xuIgorCQkiCW1lbXdfbG9ja2VkKCUxLFAzKT0lMFxuIgorCQkiCWlmICFQMyBqdW1wIDFiO1xuIgorCQk6ICI9JnIiIChvdXRwdXQpCisJCTogInIiICgmdi0+Y291bnRlciksICJyIiAoaSkKKwkJOiAibWVtb3J5IiwgInAzIgorCSk7CisJcmV0dXJuIG91dHB1dDsKK30KKworI2RlZmluZSBhdG9taWNfc3ViKGksIHYpIGF0b21pY19zdWJfcmV0dXJuKGksICh2KSkKKworLyoqCisgKiBhdG9taWNfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCisgKiBAdjogcG9pbnRlciB0byB2YWx1ZQorICogQGE6IGFtb3VudCB0byBhZGQKKyAqIEB1OiB1bmxlc3MgdmFsdWUgaXMgZXF1YWwgdG8gdQorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgYWRkIGhhcHBlbmVkLCAwIGlmIGl0IGRpZG4ndC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgX19hdG9taWNfYWRkX3VubGVzcyhhdG9taWNfdCAqdiwgaW50IGEsIGludCB1KQoreworCWludCBvdXRwdXQsIF9fb2xkdmFsOworCWFzbSB2b2xhdGlsZSgKKwkJIjE6CSUwID0gbWVtd19sb2NrZWQoJTIpOyIKKwkJIgl7IgorCQkiCQlwMyA9IGNtcC5lcSglMCwgJTQpOyIKKwkJIgkJaWYgKHAzLm5ldykganVtcDpudCAyZjsiCisJCSIJCSUwID0gYWRkKCUwLCAlMyk7IgorCQkiCQklMSA9ICMwOyIKKwkJIgl9IgorCQkiCW1lbXdfbG9ja2VkKCUyLCBwMykgPSAlMDsiCisJCSIJeyIKKwkJIgkJaWYgIXAzIGp1bXAgMWI7IgorCQkiCQklMSA9ICMxOyIKKwkJIgl9IgorCQkiMjoiCisJCTogIj0mciIgKF9fb2xkdmFsKSwgIj0mciIgKG91dHB1dCkKKwkJOiAiciIgKHYpLCAiciIgKGEpLCAiciIgKHUpCisJCTogIm1lbW9yeSIsICJwMyIKKwkpOworCXJldHVybiBvdXRwdXQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCisKKyNkZWZpbmUgYXRvbWljX2luYyh2KSBhdG9taWNfYWRkKDEsICh2KSkKKyNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsICh2KSkKKworI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpIChhdG9taWNfYWRkX3JldHVybigxLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikgKGF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLCB2KSAoYXRvbWljX3N1Yl9yZXR1cm4oaSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfYWRkX25lZ2F0aXZlKGksIHYpIChhdG9taWNfYWRkX3JldHVybihpLCAodikpIDwgMCkKKworCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIChhdG9taWNfYWRkX3JldHVybigxLCB2KSkKKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgKGF0b21pY19zdWJfcmV0dXJuKDEsIHYpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM0NjFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQml0IG9wZXJhdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fQklUT1BTX0gKKyNkZWZpbmUgX0FTTV9CSVRPUFNfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKKworLyoKKyAqIFRoZSBvZmZzZXQgY2FsY3VsYXRpb25zIGZvciB0aGVzZSBhcmUgYmFzZWQgb24gQklUU19QRVJfTE9ORyA9PSAzMgorICogKGkuZS4gSSBnZXQgdG8gc2hpZnQgYnkgIzUtMiAoMzIgYml0cyBwZXIgbG9uZywgNCBieXRlcyBwZXIgYWNjZXNzKSwKKyAqIG1hc2sgYnkgMHgwMDAwMDAxRikKKyAqCisgKiBUeXBpY2FsbHksIFIxMCBpcyBjbG9iYmVyZWQgZm9yIGFkZHJlc3MsIFIxMSBiaXQgbnIsIGFuZCBSMTIgaXMgdGVtcAorICovCisKKy8qKgorICogdGVzdF9hbmRfY2xlYXJfYml0IC0gY2xlYXIgYSBiaXQgYW5kIHJldHVybiBpdHMgb2xkIHZhbHVlCisgKiBAbnI6ICBiaXQgbnVtYmVyIHRvIGNsZWFyCisgKiBAYWRkcjogIHBvaW50ZXIgdG8gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJaW50IG9sZHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiCXtSMTAgPSAlMTsgUjExID0gYXNyKCUyLCM1KTsgfVxuIgorCSIJe1IxMCArPSBhc2woUjExLCMyKTsgUjExID0gYW5kKCUyLCMweDFmKX1cbiIKKwkiMToJUjEyID0gbWVtd19sb2NrZWQoUjEwKTtcbiIKKwkiCXsgUDAgPSB0c3RiaXQoUjEyLFIxMSk7IFIxMiA9IGNscmJpdChSMTIsUjExKTsgfVxuIgorCSIJbWVtd19sb2NrZWQoUjEwLFAxKSA9IFIxMjtcbiIKKwkiCXtpZiAhUDEganVtcCAxYjsgJTAgPSBtdXgoUDAsIzEsIzApO31cbiIKKwk6ICI9JnIiIChvbGR2YWwpCisJOiAiciIgKGFkZHIpLCAiciIgKG5yKQorCTogInIxMCIsICJyMTEiLCAicjEyIiwgInAwIiwgInAxIiwgIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIG9sZHZhbDsKK30KKworLyoqCisgKiB0ZXN0X2FuZF9zZXRfYml0IC0gc2V0IGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiAgYml0IG51bWJlciB0byBzZXQKKyAqIEBhZGRyOiAgcG9pbnRlciB0byBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJaW50IG9sZHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiCXtSMTAgPSAlMTsgUjExID0gYXNyKCUyLCM1KTsgfVxuIgorCSIJe1IxMCArPSBhc2woUjExLCMyKTsgUjExID0gYW5kKCUyLCMweDFmKX1cbiIKKwkiMToJUjEyID0gbWVtd19sb2NrZWQoUjEwKTtcbiIKKwkiCXsgUDAgPSB0c3RiaXQoUjEyLFIxMSk7IFIxMiA9IHNldGJpdChSMTIsUjExKTsgfVxuIgorCSIJbWVtd19sb2NrZWQoUjEwLFAxKSA9IFIxMjtcbiIKKwkiCXtpZiAhUDEganVtcCAxYjsgJTAgPSBtdXgoUDAsIzEsIzApO31cbiIKKwk6ICI9JnIiIChvbGR2YWwpCisJOiAiciIgKGFkZHIpLCAiciIgKG5yKQorCTogInIxMCIsICJyMTEiLCAicjEyIiwgInAwIiwgInAxIiwgIm1lbW9yeSIKKwkpOworCisKKwlyZXR1cm4gb2xkdmFsOworCit9CisKKy8qKgorICogdGVzdF9hbmRfY2hhbmdlX2JpdCAtIHRvZ2dsZSBhIGJpdCBhbmQgcmV0dXJuIGl0cyBvbGQgdmFsdWUKKyAqIEBucjogIGJpdCBudW1iZXIgdG8gc2V0CisgKiBAYWRkcjogIHBvaW50ZXIgdG8gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCWludCBvbGR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJIgl7UjEwID0gJTE7IFIxMSA9IGFzciglMiwjNSk7IH1cbiIKKwkiCXtSMTAgKz0gYXNsKFIxMSwjMik7IFIxMSA9IGFuZCglMiwjMHgxZil9XG4iCisJIjE6CVIxMiA9IG1lbXdfbG9ja2VkKFIxMCk7XG4iCisJIgl7IFAwID0gdHN0Yml0KFIxMixSMTEpOyBSMTIgPSB0b2dnbGViaXQoUjEyLFIxMSk7IH1cbiIKKwkiCW1lbXdfbG9ja2VkKFIxMCxQMSkgPSBSMTI7XG4iCisJIgl7aWYgIVAxIGp1bXAgMWI7ICUwID0gbXV4KFAwLCMxLCMwKTt9XG4iCisJOiAiPSZyIiAob2xkdmFsKQorCTogInIiIChhZGRyKSwgInIiIChucikKKwk6ICJyMTAiLCAicjExIiwgInIxMiIsICJwMCIsICJwMSIsICJtZW1vcnkiCisJKTsKKworCXJldHVybiBvbGR2YWw7CisKK30KKworLyoKKyAqIEF0b21pYywgYnV0IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuIHZhbHVlLgorICogUmV3cml0ZSBsYXRlciB0byBzYXZlIGEgY3ljbGUgb3IgdHdvLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCXRlc3RfYW5kX2NsZWFyX2JpdChuciwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwl0ZXN0X2FuZF9zZXRfYml0KG5yLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCXRlc3RfYW5kX2NoYW5nZV9iaXQobnIsIGFkZHIpOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgYWxsb3dlZCB0byBiZSBub24tYXRvbWljLiAgSW4gZmFjdCB0aGUgZ2VuZXJpYyBmbGF2b3JzIGFyZQorICogaW4gbm9uLWF0b21pYy5oLiAgV291bGQgaXQgYmUgYmV0dGVyIHRvIHVzZSBpbnRyaW5zaWNzIGZvciB0aGlzPworICoKKyAqIE9LLCB3cml0ZXMgaW4gb3VyIGFyY2hpdGVjdHVyZSBkbyBub3QgaW52YWxpZGF0ZSBMTC9TQywgc28gdGhpcyBoYXMgdG8KKyAqIGJlIGF0b21pYywgcGFydGljdWxhcmx5IGZvciB0aGluZ3MgbGlrZSBzbGFiX2xvY2sgYW5kIHNsYWJfdW5sb2NrLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl0ZXN0X2FuZF9zZXRfYml0KG5yLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdGVzdF9hbmRfY2hhbmdlX2JpdChuciwgYWRkcik7Cit9CisKKy8qICBBcHBhcmVudGx5LCBhdCBsZWFzdCBzb21lIG9mIHRoZXNlIGFyZSBhbGxvd2VkIHRvIGJlIG5vbi1hdG9taWMgICovCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChuciwgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQobnIsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXJldHVybiB0ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IHJldHZhbDsKKworCWFzbSB2b2xhdGlsZSgKKwkie1AwID0gdHN0Yml0KCUxLCUyKTsgaWYgKFAwLm5ldykgJTAgPSAjMTsgaWYgKCFQMC5uZXcpICUwID0gIzA7fVxuIgorCTogIj0mciIgKHJldHZhbCkKKwk6ICJyIiAoYWRkcltCSVRfV09SRChucildKSwgInIiIChuciAlIEJJVFNfUEVSX0xPTkcpCisJOiAicDAiCisJKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgdGVzdF9iaXQobnIsIGFkZHIpIF9fdGVzdF9iaXQobnIsIGFkZHIpCisKKy8qCisgKiBmZnogLSBmaW5kIGZpcnN0IHplcm8gaW4gd29yZC4KKyAqIEB3b3JkOiBUaGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBVbmRlZmluZWQgaWYgbm8gemVybyBleGlzdHMsIHNvIGNvZGUgc2hvdWxkIGNoZWNrIGFnYWluc3QgfjBVTCBmaXJzdC4KKyAqLworc3RhdGljIGlubGluZSBsb25nIGZmeihpbnQgeCkKK3sKKwlpbnQgcjsKKworCWFzbSgiJTAgPSBjdDEoJTEpO1xuIgorCQk6ICI9JnIiIChyKQorCQk6ICJyIiAoeCkpOworCXJldHVybiByOworfQorCisvKgorICogZmxzIC0gZmluZCBsYXN0IChtb3N0LXNpZ25pZmljYW50KSBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcyBmZnMuCisgKiBOb3RlIGZscygwKSA9IDAsIGZscygxKSA9IDEsIGZscygweDgwMDAwMDAwKSA9IDMyLgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgZmxzKGludCB4KQoreworCWludCByOworCisJYXNtKCJ7ICUwID0gY2wwKCUxKTt9XG4iCisJCSIlMCA9IHN1YigjMzIsJTApO1xuIgorCQk6ICI9JnIiIChyKQorCQk6ICJyIiAoeCkKKwkJOiAicDAiKTsKKworCXJldHVybiByOworfQorCisvKgorICogZmZzIC0gZmluZCBmaXJzdCBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcworICogdGhlIGxpYmMgYW5kIGNvbXBpbGVyIGJ1aWx0aW4gZmZzIHJvdXRpbmVzLCB0aGVyZWZvcmUKKyAqIGRpZmZlcnMgaW4gc3Bpcml0IGZyb20gdGhlIGFib3ZlIGZmeiAobWFuIGZmcykuCisgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBmZnMoaW50IHgpCit7CisJaW50IHI7CisKKwlhc20oInsgUDAgPSBjbXAuZXEoJTEsIzApOyAlMCA9IGN0MCglMSk7fVxuIgorCQkieyBpZiBQMCAlMCA9ICMwOyBpZiAhUDAgJTAgPSBhZGQoJTAsIzEpO31cbiIKKwkJOiAiPSZyIiAocikKKwkJOiAiciIgKHgpCisJCTogInAwIik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIF9fZmZzIC0gZmluZCBmaXJzdCBiaXQgaW4gd29yZC4KKyAqIEB3b3JkOiBUaGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBVbmRlZmluZWQgaWYgbm8gYml0IGV4aXN0cywgc28gY29kZSBzaG91bGQgY2hlY2sgYWdhaW5zdCAwIGZpcnN0LgorICoKKyAqIGJpdHNfcGVyX2xvbmcgYXNzdW1lZCB0byBiZSAzMgorICogbnVtYmVyaW5nIHN0YXJ0cyBhdCAwIEkgdGhpbmsgKGluc3RlYWQgb2YgMSBsaWtlIGZmcykKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZmZzKHVuc2lnbmVkIGxvbmcgd29yZCkKK3sKKwlpbnQgbnVtOworCisJYXNtKCIlMCA9IGN0MCglMSk7XG4iCisJCTogIj0mciIgKG51bSkKKwkJOiAiciIgKHdvcmQpKTsKKworCXJldHVybiBudW07Cit9CisKKy8qCisgKiBfX2ZscyAtIGZpbmQgbGFzdCAobW9zdC1zaWduaWZpY2FudCkgc2V0IGJpdCBpbiBhIGxvbmcgd29yZAorICogQHdvcmQ6IHRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFVuZGVmaW5lZCBpZiBubyBzZXQgYml0IGV4aXN0cywgc28gY29kZSBzaG91bGQgY2hlY2sgYWdhaW5zdCAwIGZpcnN0LgorICogYml0c19wZXJfbG9uZyBhc3N1bWVkIHRvIGJlIDMyCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2Zscyh1bnNpZ25lZCBsb25nIHdvcmQpCit7CisJaW50IG51bTsKKworCWFzbSgiJTAgPSBjbDAoJTEpO1xuIgorCQkiJTAgPSBzdWIoIzMxLCUwKTtcbiIKKwkJOiAiPSZyIiAobnVtKQorCQk6ICJyIiAod29yZCkpOworCisJcmV0dXJuIG51bTsKK30KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9sb2NrLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9od2VpZ2h0Lmg+CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbGUuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZXh0Mi1hdG9taWMuaD4KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2JpdHNwZXJsb25nLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYml0c3BlcmxvbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzAxY2FlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2JpdHNwZXJsb25nLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fSEVYQUdPTl9CSVRTUEVSTE9OR19ICisjZGVmaW5lIF9fQVNNX0hFWEFHT05fQklUU1BFUkxPTkdfSAorCisjZGVmaW5lIF9fQklUU19QRVJfTE9ORyAzMgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0c3BlcmxvbmcuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxOWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0JZVEVPUkRFUl9ICisjZGVmaW5lIF9BU01fQllURU9SREVSX0gKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgorCisjZW5kaWYgLyogX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NhY2hlLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAxZGUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENhY2hlIGRlZmluaXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0NBQ0hFX0gKKyNkZWZpbmUgX19BU01fQ0FDSEVfSAorCisvKiBCeXRlcyBwZXIgTDEgY2FjaGUgbGluZSAqLworI2RlZmluZSBMMV9DQUNIRV9TSElGVAkJKDUpCisjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCQkoMSA8PCBMMV9DQUNIRV9TSElGVCkKKworI2RlZmluZSBfX2NhY2hlbGluZV9hbGlnbmVkCV9fYWxpZ25lZChMMV9DQUNIRV9CWVRFUykKKyNkZWZpbmUgX19fX2NhY2hlbGluZV9hbGlnbmVkCV9fYWxpZ25lZChMMV9DQUNIRV9CWVRFUykKKworLyogU2VlIGh0dHA6Ly9rZXJuZWx0cmFwLm9yZy9ub2RlLzE1MTAwICAqLworI2RlZmluZSBfX3JlYWRfbW9zdGx5CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NWMxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENhY2hlIGZsdXNoIG9wZXJhdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9DQUNIRUZMVVNIX0gKKyNkZWZpbmUgX0FTTV9DQUNIRUZMVVNIX0gKKworI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY2FjaGVmbHVzaC5oPgorCisvKiBDYWNoZSBmbHVzaGluZzoKKyAqCisgKiAgLSBmbHVzaF9jYWNoZV9hbGwoKSBmbHVzaGVzIGVudGlyZSBjYWNoZQorICogIC0gZmx1c2hfY2FjaGVfbW0obW0pIGZsdXNoZXMgdGhlIHNwZWNpZmllZCBtbSBjb250ZXh0J3MgY2FjaGUgbGluZXMKKyAqICAtIGZsdXNoX2NhY2hlX3BhZ2UobW0sIHZtYWRkciwgcGZuKSBmbHVzaGVzIGEgc2luZ2xlIHBhZ2UKKyAqICAtIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkgZmx1c2hlcyBhIHJhbmdlIG9mIHBhZ2VzCisgKiAgLSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkgZmx1c2ggYSByYW5nZSBvZiBpbnN0cnVjdGlvbnMKKyAqICAtIGZsdXNoX2RjYWNoZV9wYWdlKHBnKSBmbHVzaGVzKHdiYWNrJmludmFsaWRhdGVzKSBhIHBhZ2UgZm9yIGRjYWNoZQorICogIC0gZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwZykgZmx1c2hlcyhpbnZhbGlkYXRlcykgYSBwYWdlIGZvciBpY2FjaGUKKyAqCisgKiAgTmVlZCB0byBkb3VibGVjaGVjayB3aGljaCBvbmUgaXMgcmVhbGx5IG5lZWRlZCBmb3IgcHRyYWNlIHN0dWZmIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgTElORVNJWkUJMzIKKyNkZWZpbmUgTElORUJJVFMJNQorCisvKgorICogRmx1c2ggRGNhY2hlIHJhbmdlIHRocm91Z2ggY3VycmVudCBtYXAuCisgKi8KK2V4dGVybiB2b2lkIGZsdXNoX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CisKKy8qCisgKiBGbHVzaCBJY2FjaGUgcmFuZ2UgdGhyb3VnaCBjdXJyZW50IG1hcC4KKyAqLworI3VuZGVmIGZsdXNoX2ljYWNoZV9yYW5nZQorZXh0ZXJuIHZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworLyoKKyAqIE1lbW9yeS1tYW5hZ2VtZW50IHJlbGF0ZWQgZmx1c2hlcyBhcmUgdGhlcmUgdG8gZW5zdXJlIGluIG5vbi1waHlzaWNhbGx5CisgKiBpbmRleGVkIGNhY2hlIHNjaGVtZXMgdGhhdCBzdGFsZSBsaW5lcyBiZWxvbmdpbmcgdG8gYSBnaXZlbiBBU0lEIGFyZW4ndAorICogaW4gdGhlIGNhY2hlIHRvIGNvbmZ1c2UgdGhpbmdzLiAgVGhlIHByb3RvdHlwZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZQorICogb25seSB1c2VzIGEgc2luZ2xlIEFTSUQgZm9yIGFsbCB1c2VyLW1vZGUgbWFwcywgd2hpY2ggc2hvdWxkCisgKiBtZWFuIHRoYXQgdGhleSBhcmVuJ3QgbmVjZXNzYXJ5LiAgQSBicnV0ZS1mb3JjZSwgZmx1c2gtZXZlcnl0aGluZworICogaW1wbGVtZW50YXRpb24sIHdpdGggdGhlIG5hbWUgeHh4eHhfaGV4YWdvbigpIGlzIHByZXNlbnQgaW4KKyAqIGFyY2gvaGV4YWdvbi9tbS9jYWNoZS5jLCBidXQgbGV0J3Mgbm90IHdpcmUgaXQgdXAgdW50aWwgd2Uga25vdworICogaXQgaXMgbmVlZGVkLgorICovCitleHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9hbGxfaGV4YWdvbih2b2lkKTsKKworLyoKKyAqIFRoaXMgbWF5IG9yIG1heSBub3QgZXZlciBoYXZlIHRvIGJlIG5vbi1udWxsLCBkZXBlbmRpbmcgb24gdGhlCisgKiB2aXJ0dWFsIG1hY2hpbmUgTU1VLiAgRm9yIGEgbmF0aXZlIGtlcm5lbCwgaXQncyBkZWZpbml0aWVseSAgYSBuby1vcAorICoKKyAqIFRoaXMgaXMgYWxzbyB0aGUgcGxhY2Ugd2hlcmUgZGVmZXJyZWQgY2FjaGUgY29oZXJlbmN5IHN0dWZmIHNlZW1zCisgKiB0byBoYXBwZW4sIGNsYXNzaWNhbGx5Li4uICBidXQgaW5zdGVhZCB3ZSBkbyBpdCBsaWtlIGlhNjQgYW5kCisgKiBjbGVhbiB0aGUgY2FjaGUgd2hlbiB0aGUgUFRFIGlzIHNldC4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQoreworCS8qICBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YSBkb2Vzbid0IHdpbmQgdXAgaGVyZSwgZG9lcyBpdD8gICovCit9CisKKyN1bmRlZiBjb3B5X3RvX3VzZXJfcGFnZQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdG9fdXNlcl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQkgICAgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIsCisJCQkJCSAgICAgdm9pZCAqZHN0LCB2b2lkICpzcmMsIGludCBsZW4pCit7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgeworCQlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIGRzdCwKKwkJKHVuc2lnbmVkIGxvbmcpIGRzdCArIGxlbik7CisJfQorfQorCisKK2V4dGVybiB2b2lkIGhleGFnb25faW52X2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBoZXhhZ29uX2NsZWFuX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vY2hlY2tzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U0ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9DSEVDS1NVTV9ICisjZGVmaW5lIF9BU01fQ0hFQ0tTVU1fSAorCisjZGVmaW5lIGRvX2NzdW0JZG9fY3N1bQordW5zaWduZWQgaW50IGRvX2NzdW0oY29uc3Qgdm9pZCAqdm9pZHB0ciwgaW50IGxlbik7CisKKy8qCisgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKKyAqIGNoZWNrc3VtcworICoKKyAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgorICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKKyAqLworI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtKTsKKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCisgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAorICovCisjZGVmaW5lIGNzdW1fdGNwdWRwX25vZm9sZCBjc3VtX3RjcHVkcF9ub2ZvbGQKK19fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKKwl1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKTsKKworI2RlZmluZSBjc3VtX3RjcHVkcF9tYWdpYyBjc3VtX3RjcHVkcF9tYWdpYworX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAorCXVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pOworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY2hlY2tzdW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZGVsYXkuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjEyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZGVsYXkuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX0RFTEFZX0gKKyNkZWZpbmUgX0FTTV9ERUxBWV9ICisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisKKyNkZWZpbmUgdWRlbGF5KHVzZWNzKSBfX3VkZWxheSgodXNlY3MpKQorCisjZW5kaWYgLyogX0FTTV9ERUxBWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OGIyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIERNQSBvcGVyYXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fRE1BX01BUFBJTkdfSAorI2RlZmluZSBfQVNNX0RNQV9NQVBQSU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtYXR0cnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IGRldmljZTsKK2V4dGVybiBpbnQgYmFkX2RtYV9hZGRyZXNzOworCitleHRlcm4gc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzOworCisjZGVmaW5lIGRtYV9hbGxvY19ub25jb2hlcmVudChkLCBzLCBoLCBmKSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaCwgZikKKyNkZWZpbmUgZG1hX2ZyZWVfbm9uY29oZXJlbnQoZCwgcywgdiwgaCkgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgdiwgaCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX21hcF9vcHMgKmdldF9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBkbWFfb3BzOworfQorCitleHRlcm4gaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CitleHRlcm4gaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKK2V4dGVybiBpbnQgZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOworZXh0ZXJuIHZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctY29tbW9uLmg+CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkbWFfY2FwYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYWRkciArIHNpemUgLSAxIDw9ICpkZXYtPmRtYV9tYXNrOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCWlmIChkbWFfb3BzLT5tYXBwaW5nX2Vycm9yKQorCQlyZXR1cm4gZG1hX29wcy0+bWFwcGluZ19lcnJvcihkZXYsIGRtYV9hZGRyKTsKKworCXJldHVybiAoZG1hX2FkZHIgPT0gYmFkX2RtYV9hZGRyZXNzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKK3sKKwl2b2lkICpyZXQ7CisJc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCFkbWFfb3BzKTsKKworCXJldCA9IG9wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKKworCWRlYnVnX2RtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICpkbWFfaGFuZGxlLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCisJZG1hX29wcy0+ZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKKworCWRlYnVnX2RtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kbWEuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTZkMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2RtYS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fRE1BX0gKKyNkZWZpbmUgX0FTTV9ETUFfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAxCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUyAgKFBBR0VfT0ZGU0VUKQorCitleHRlcm4gc2l6ZV90IGhleGFnb25fY29oZXJlbnRfcG9vbF9zaXplOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk3NmEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogRUxGIGRlZmluaXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0VMRl9ICisjZGVmaW5lIF9fQVNNX0VMRl9ICisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKworLyoKKyAqIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiBsaW51eC9lbGYtZW0uaC4KKyAqLworI2RlZmluZSBFTV9IRVhBR09OCTE2NCAgIC8qIFFVQUxDT01NIEhleGFnb24gKi8KKworc3RydWN0IGVsZjMyX2hkcjsKKworLyoKKyAqIEVMRiBoZWFkZXIgZV9mbGFncyBkZWZpbmVzLgorICovCisKKy8qICBzaG91bGQgaGF2ZSBzdHVmZiBsaWtlICJDUFUgdHlwZSIgYW5kIG1heWJlICJBQkkgdmVyc2lvbiIsIGV0YyAgKi8KKworLyogSGV4YWdvbiByZWxvY2F0aW9ucyAqLworICAvKiBWMiAqLworI2RlZmluZSBSX0hFWEFHT05fTk9ORSAgICAgICAgICAgMAorI2RlZmluZSBSX0hFWEFHT05fQjIyX1BDUkVMICAgICAgMQorI2RlZmluZSBSX0hFWEFHT05fQjE1X1BDUkVMICAgICAgMgorI2RlZmluZSBSX0hFWEFHT05fQjdfUENSRUwgICAgICAgMworI2RlZmluZSBSX0hFWEFHT05fTE8xNiAgICAgICAgICAgNAorI2RlZmluZSBSX0hFWEFHT05fSEkxNiAgICAgICAgICAgNQorI2RlZmluZSBSX0hFWEFHT05fMzIgICAgICAgICAgICAgNgorI2RlZmluZSBSX0hFWEFHT05fMTYgICAgICAgICAgICAgNworI2RlZmluZSBSX0hFWEFHT05fOCAgICAgICAgICAgICAgOAorI2RlZmluZSBSX0hFWEFHT05fR1BSRUwxNl8wICAgICAgOQorI2RlZmluZSBSX0hFWEFHT05fR1BSRUwxNl8xICAgICAxMAorI2RlZmluZSBSX0hFWEFHT05fR1BSRUwxNl8yICAgICAxMQorI2RlZmluZSBSX0hFWEFHT05fR1BSRUwxNl8zICAgICAxMgorI2RlZmluZSBSX0hFWEFHT05fSEwxNiAgICAgICAgICAxMworICAvKiBWMyAqLworI2RlZmluZSBSX0hFWEFHT05fQjEzX1BDUkVMICAgICAxNAorICAvKiBWNCAqLworI2RlZmluZSBSX0hFWEFHT05fQjlfUENSRUwgICAgICAxNQorICAvKiBWNCAoZXh0ZW5kZXJzKSAqLworI2RlZmluZSBSX0hFWEFHT05fQjMyX1BDUkVMX1ggICAxNgorI2RlZmluZSBSX0hFWEFHT05fMzJfNl9YICAgICAgICAxNworICAvKiBWNCAoZXh0ZW5kZWQpICovCisjZGVmaW5lIFJfSEVYQUdPTl9CMjJfUENSRUxfWCAgIDE4CisjZGVmaW5lIFJfSEVYQUdPTl9CMTVfUENSRUxfWCAgIDE5CisjZGVmaW5lIFJfSEVYQUdPTl9CMTNfUENSRUxfWCAgIDIwCisjZGVmaW5lIFJfSEVYQUdPTl9COV9QQ1JFTF9YICAgIDIxCisjZGVmaW5lIFJfSEVYQUdPTl9CN19QQ1JFTF9YICAgIDIyCisjZGVmaW5lIFJfSEVYQUdPTl8xNl9YICAgICAgICAgIDIzCisjZGVmaW5lIFJfSEVYQUdPTl8xMl9YICAgICAgICAgIDI0CisjZGVmaW5lIFJfSEVYQUdPTl8xMV9YICAgICAgICAgIDI1CisjZGVmaW5lIFJfSEVYQUdPTl8xMF9YICAgICAgICAgIDI2CisjZGVmaW5lIFJfSEVYQUdPTl85X1ggICAgICAgICAgIDI3CisjZGVmaW5lIFJfSEVYQUdPTl84X1ggICAgICAgICAgIDI4CisjZGVmaW5lIFJfSEVYQUdPTl83X1ggICAgICAgICAgIDI5CisjZGVmaW5lIFJfSEVYQUdPTl82X1ggICAgICAgICAgIDMwCisgIC8qIFYyIFBJQyAqLworI2RlZmluZSBSX0hFWEFHT05fMzJfUENSRUwgICAgICAzMQorI2RlZmluZSBSX0hFWEFHT05fQ09QWSAgICAgICAgICAzMgorI2RlZmluZSBSX0hFWEFHT05fR0xPQl9EQVQgICAgICAzMworI2RlZmluZSBSX0hFWEFHT05fSk1QX1NMT1QgICAgICAzNAorI2RlZmluZSBSX0hFWEFHT05fUkVMQVRJVkUgICAgICAzNQorI2RlZmluZSBSX0hFWEFHT05fUExUX0IyMl9QQ1JFTCAzNgorI2RlZmluZSBSX0hFWEFHT05fR09UT0ZGX0xPMTYgICAzNworI2RlZmluZSBSX0hFWEFHT05fR09UT0ZGX0hJMTYgICAzOAorI2RlZmluZSBSX0hFWEFHT05fR09UT0ZGXzMyICAgICAzOQorI2RlZmluZSBSX0hFWEFHT05fR09UX0xPMTYgICAgICA0MAorI2RlZmluZSBSX0hFWEFHT05fR09UX0hJMTYgICAgICA0MQorI2RlZmluZSBSX0hFWEFHT05fR09UXzMyICAgICAgICA0MgorI2RlZmluZSBSX0hFWEFHT05fR09UXzE2ICAgICAgICA0MworCisvKgorICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgZWxmX2dyZWdzZXRfdDsKKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YoZWxmX2dyZWdzZXRfdCkvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisvKiAgUGxhY2Vob2xkZXIgICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2ZwcmVnc2V0X3Q7CisKKy8qCisgKiBCeXBhc3MgdGhlIHdob2xlICJyZWdzZXRzIiB0aGluZyBmb3Igbm93IGFuZCB1c2UgdGhlIGRlZmluZS4KKyAqLworCisjZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhERVNULCBSRUdTKQlcCitkbyB7CQkJCQlcCisJREVTVC5yMCA9IFJFR1MtPnIwMDsJCVwKKwlERVNULnIxID0gUkVHUy0+cjAxOwkJXAorCURFU1QucjIgPSBSRUdTLT5yMDI7CQlcCisJREVTVC5yMyA9IFJFR1MtPnIwMzsJCVwKKwlERVNULnI0ID0gUkVHUy0+cjA0OwkJXAorCURFU1QucjUgPSBSRUdTLT5yMDU7CQlcCisJREVTVC5yNiA9IFJFR1MtPnIwNjsJCVwKKwlERVNULnI3ID0gUkVHUy0+cjA3OwkJXAorCURFU1QucjggPSBSRUdTLT5yMDg7CQlcCisJREVTVC5yOSA9IFJFR1MtPnIwOTsJCVwKKwlERVNULnIxMCA9IFJFR1MtPnIxMDsJCVwKKwlERVNULnIxMSA9IFJFR1MtPnIxMTsJCVwKKwlERVNULnIxMiA9IFJFR1MtPnIxMjsJCVwKKwlERVNULnIxMyA9IFJFR1MtPnIxMzsJCVwKKwlERVNULnIxNCA9IFJFR1MtPnIxNDsJCVwKKwlERVNULnIxNSA9IFJFR1MtPnIxNTsJCVwKKwlERVNULnIxNiA9IFJFR1MtPnIxNjsJCVwKKwlERVNULnIxNyA9IFJFR1MtPnIxNzsJCVwKKwlERVNULnIxOCA9IFJFR1MtPnIxODsJCVwKKwlERVNULnIxOSA9IFJFR1MtPnIxOTsJCVwKKwlERVNULnIyMCA9IFJFR1MtPnIyMDsJCVwKKwlERVNULnIyMSA9IFJFR1MtPnIyMTsJCVwKKwlERVNULnIyMiA9IFJFR1MtPnIyMjsJCVwKKwlERVNULnIyMyA9IFJFR1MtPnIyMzsJCVwKKwlERVNULnIyNCA9IFJFR1MtPnIyNDsJCVwKKwlERVNULnIyNSA9IFJFR1MtPnIyNTsJCVwKKwlERVNULnIyNiA9IFJFR1MtPnIyNjsJCVwKKwlERVNULnIyNyA9IFJFR1MtPnIyNzsJCVwKKwlERVNULnIyOCA9IFJFR1MtPnIyODsJCVwKKwlERVNULnIyOSA9IHB0X3BzcChSRUdTKTsJXAorCURFU1QucjMwID0gUkVHUy0+cjMwOwkJXAorCURFU1QucjMxID0gUkVHUy0+cjMxOwkJXAorCURFU1Quc2EwID0gUkVHUy0+c2EwOwkJXAorCURFU1QubGMwID0gUkVHUy0+bGMwOwkJXAorCURFU1Quc2ExID0gUkVHUy0+c2ExOwkJXAorCURFU1QubGMxID0gUkVHUy0+bGMxOwkJXAorCURFU1QubTAgPSBSRUdTLT5tMDsJCVwKKwlERVNULm0xID0gUkVHUy0+bTE7CQlcCisJREVTVC51c3IgPSBSRUdTLT51c3I7CQlcCisJREVTVC5wM18wID0gUkVHUy0+cHJlZHM7CVwKKwlERVNULmdwID0gUkVHUy0+Z3A7CQlcCisJREVTVC51Z3AgPSBSRUdTLT51Z3A7CQlcCisJREVTVC5wYyA9IHB0X2VscihSRUdTKTsJXAorCURFU1QuY2F1c2UgPSBwdF9jYXVzZShSRUdTKTsJXAorCURFU1QuYmFkdmEgPSBwdF9iYWR2YShSRUdTKTsJXAorfSB3aGlsZSAoMCk7CisKKworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KKyAqIENoZWNrcyB0aGUgbWFjaGluZSBhbmQgQUJJIHR5cGUuCisgKi8KKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goaGRyKQkoKGhkciktPmVfbWFjaGluZSA9PSBFTV9IRVhBR09OKQorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTMzIKKyNkZWZpbmUgRUxGX0RBVEEJRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0gJRU1fSEVYQUdPTgorCisjaWZkZWYgQ09ORklHX0hFWEFHT05fQVJDSF9WMgorI2RlZmluZSBFTEZfQ09SRV9FRkxBR1MgMHgxCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19IRVhBR09OX0FSQ0hfVjMKKyNkZWZpbmUgRUxGX0NPUkVfRUZMQUdTIDB4MgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEVYQUdPTl9BUkNIX1Y0CisjZGVmaW5lIEVMRl9DT1JFX0VGTEFHUyAweDMKKyNlbmRpZgorCisvKgorICogU29tZSBhcmNoaXRlY3R1cmVzIGhhdmUgbGQuc28gc2V0IHVwIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uCisgKiB0byBiZSByZWdpc3RlcmVkIHVzaW5nIGF0ZXhpdCwgdG8gZmFjaWxpdGF0ZSBjbGVhbnVwLiAgU28gdGhhdAorICogc3RhdGljIGV4ZWN1dGFibGVzIHdpbGwgYmUgd2VsbC1iZWhhdmVkLCB3ZSB3b3VsZCBudWxsIHRoZSByZWdpc3RlcgorICogaW4gcXVlc3Rpb24gaGVyZSwgaW4gdGhlIHB0X3JlZ3Mgc3RydWN0dXJlIHBhc3NlZC4gIEZvciBub3csCisgKiBsZWF2ZSBpdCBhIG51bGwgbWFjcm8uCisgKi8KKyNkZWZpbmUgRUxGX1BMQVRfSU5JVChyZWdzLCBsb2FkX2FkZHIpIGRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBVU0VfRUxGX0NPUkVfRFVNUAorI2RlZmluZSBDT1JFX0RVTVBfVVNFX1JFR1NFVAorCisvKiBIcm0gaXMgdGhpcyBnb2luZyB0byBjYXVzZSBwcm9ibGVtcyBmb3IgY2hhbmdpbmcgUEFHRV9TSVpFPyAgKi8KKyNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgorCisvKgorICogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKKyAqIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgorICogdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KKyAqIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4KKyAqLworI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UgICAgICAgICAweDA4MDAwMDAwVUwKKworLyoKKyAqIFRoaXMgeWllbGRzIGEgbWFzayB0aGF0IHVzZXIgcHJvZ3JhbXMgY2FuIHVzZSB0byBmaWd1cmUgb3V0IHdoYXQKKyAqIGluc3RydWN0aW9uIHNldCB0aGlzIGNwdSBzdXBwb3J0cy4KKyAqLworI2RlZmluZSBFTEZfSFdDQVAJKDApCisKKy8qCisgKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAqIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgKiBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KKyAqLworI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCisjZW5kaWYKKworI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKK3N0cnVjdCBsaW51eF9iaW5wcm07CitleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCQkJCSAgICAgICBpbnQgdXNlc19pbnRlcnApOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2Y0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIEZpeG1hcCBzdXBwb3J0IGZvciBIZXhhZ29uIC0gZW5vdWdoIHRvIHN1cHBvcnQgaGlnaG1lbSBmZWF0dXJlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9GSVhNQVBfSAorI2RlZmluZSBfQVNNX0ZJWE1BUF9ICisKKy8qCisgKiBBIGxvdCBvZiB0aGUgZml4bWFwIGluZm8gaXMgYWxyZWFkeSBpbiBtZW0tbGF5b3V0LmgKKyAqLworI2luY2x1ZGUgPGFzbS9tZW0tbGF5b3V0Lmg+CisKKy8qCisgKiBGdWxsIGZpeG1hcCBzdXBwb3J0IGludm9sdmVzIHNldF9maXhtYXAoKSBmdW5jdGlvbnMsIGJ1dAorICogdGhlc2UgbWF5IG5vdCBiZSBuZWVkZWQgaWYgYWxsIHdlJ3JlIGFmdGVyIGlzIGFuIGFyZWEgZm9yCisgKiBoaWdobWVtIGtlcm5lbCBtYXBwaW5ncy4KKyAqLworI2RlZmluZQlfX2ZpeF90b192aXJ0KHgpCShGSVhBRERSX1RPUCAtICgoeCkgPDwgUEFHRV9TSElGVCkpCisjZGVmaW5lCV9fdmlydF90b19maXgoeCkJKChGSVhBRERSX1RPUCAtICgoeCkmUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVCkKKworZXh0ZXJuIHZvaWQgX190aGlzX2ZpeG1hcF9kb2VzX25vdF9leGlzdCh2b2lkKTsKKworLyoqCisgKiBmaXhfdG9fdmlydCAtLSAiaW5kZXggdG8gYWRkcmVzcyIgdHJhbnNsYXRpb24uCisgKgorICogSWYgYW55b25lIHRyaWVzIHRvIHVzZSB0aGUgaWR4IGRpcmVjdGx5IHdpdGhvdXQgdHJhbnNsYXRpb24sCisgKiB3ZSBjYXRjaCB0aGUgYnVnIHdpdGggYSBOVUxMLWRlZmVyZW5jZSBrZXJuZWwgb29wcy4gSWxsZWdhbAorICogcmFuZ2VzIG9mIGluY29taW5nIGluZGljZXMgYXJlIGNhdWdodCB0b28uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaXhfdG9fdmlydChjb25zdCB1bnNpZ25lZCBpbnQgaWR4KQoreworCS8qCisJICogVGhpcyBicmFuY2ggZ2V0cyBjb21wbGV0ZWx5IGVsaW1pbmF0ZWQgYWZ0ZXIgaW5saW5pbmcsCisJICogZXhjZXB0IHdoZW4gc29tZW9uZSB0cmllcyB0byB1c2UgZml4YWRkciBpbmRpY2VzIGluIGFuCisJICogaWxsZWdhbCB3YXkuIChzdWNoIGFzIG1peGluZyB1cCBhZGRyZXNzIHR5cGVzIG9yIHVzaW5nCisJICogb3V0LW9mLXJhbmdlIGluZGljZXMpLgorCSAqCisJICogSWYgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCwgdGhlIGxpbmtlciB3aWxsIGNvbXBsYWluCisJICogbG91ZGx5IHdpdGggYSByZWFzb25hYmx5IGNsZWFyIGVycm9yIG1lc3NhZ2UuLgorCSAqLworCWlmIChpZHggPj0gX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzKQorCQlfX3RoaXNfZml4bWFwX2RvZXNfbm90X2V4aXN0KCk7CisKKwlyZXR1cm4gX19maXhfdG9fdmlydChpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19maXgoY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwlCVUdfT04odmFkZHIgPj0gRklYQUREUl9UT1AgfHwgdmFkZHIgPCBGSVhBRERSX1NUQVJUKTsKKwlyZXR1cm4gX192aXJ0X3RvX2ZpeCh2YWRkcik7Cit9CisKKyNkZWZpbmUga21hcF9nZXRfZml4bWFwX3B0ZSh2YWRkcikgXAorCXB0ZV9vZmZzZXRfa2VybmVsKHBtZF9vZmZzZXQocHVkX29mZnNldChwZ2Rfb2Zmc2V0X2sodmFkZHIpLCBcCisJCQkJKHZhZGRyKSksICh2YWRkcikpLCAodmFkZHIpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9mcHUuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9mcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTEzNWVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2ZwdS5oCkBAIC0wLDAgKzEsNCBAQAorLyoKKyAqIElmIHRoZSBGUFUgaXMgdXNlZCBpbnNpZGUgdGhlIGtlcm5lbCwKKyAqIGtlcm5lbF9mcHVfZW5kKCkgd2lsbCBiZSBkZWZpbmVkIGhlcmUuCisgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2Z1dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1OTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9mdXRleC5oCkBAIC0wLDAgKzEsMTM3IEBACisjaWZuZGVmIF9BU01fSEVYQUdPTl9GVVRFWF9ICisjZGVmaW5lIF9BU01fSEVYQUdPTl9GVVRFWF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworLyogWFhYIFRPRE8tLSBuZWVkIHRvIGFkZCBzeW5jIGJhcnJpZXJzISAqLworCisjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGUoIFwKKwkiMTogJTAgPSBtZW13X2xvY2tlZCglMyk7XG4iIFwKKwkgICAgLyogRm9yIGV4YW1wbGU6ICUxID0gJTQgKi8gXAorCSAgICBpbnNuIFwKKwkiMjogbWVtd19sb2NrZWQoJTMscDIpID0gJTE7XG4iIFwKKwkiICAgaWYgIXAyIGp1bXAgMWI7XG4iIFwKKwkiICAgJTEgPSAjMDtcbiIgXAorCSIzOlxuIiBcCisJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIgXAorCSI0OiAlMSA9ICMlNTtcbiIgXAorCSIgICBqdW1wIDNiXG4iIFwKKwkiLnByZXZpb3VzXG4iIFwKKwkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIiBcCisJIi5sb25nIDFiLDRiLDJiLDRiXG4iIFwKKwkiLnByZXZpb3VzXG4iIFwKKwk6ICI9JnIiIChvbGR2YWwpLCAiPSZyIiAocmV0KSwgIittIiAoKnVhZGRyKSBcCisJOiAiciIgKHVhZGRyKSwgInIiIChvcGFyZyksICJpIiAoLUVGQVVMVCkgXAorCTogInAyIiwgIm1lbW9yeSIpCisKKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19vcF9pbnVzZXIoaW50IGVuY29kZWRfb3AsIGludCBfX3VzZXIgKnVhZGRyKQoreworCWludCBvcCA9IChlbmNvZGVkX29wID4+IDI4KSAmIDc7CisJaW50IGNtcCA9IChlbmNvZGVkX29wID4+IDI0KSAmIDE1OworCWludCBvcGFyZyA9IChlbmNvZGVkX29wIDw8IDgpID4+IDIwOworCWludCBjbXBhcmcgPSAoZW5jb2RlZF9vcCA8PCAyMCkgPj4gMjA7CisJaW50IG9sZHZhbCA9IDAsIHJldDsKKwlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCisJCW9wYXJnID0gMSA8PCBvcGFyZzsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgRlVURVhfT1BfU0VUOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiJTEgPSAlNFxuIiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlfX2Z1dGV4X2F0b21pY19vcCgiJTEgPSBhZGQoJTAsJTQpXG4iLCByZXQsIG9sZHZhbCwgdWFkZHIsCisJCQkJICBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wKCIlMSA9IG9yKCUwLCU0KVxuIiwgcmV0LCBvbGR2YWwsIHVhZGRyLAorCQkJCSAgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX0FORE46CisJCV9fZnV0ZXhfYXRvbWljX29wKCIlMSA9IG5vdCglNCk7ICUxID0gYW5kKCUwLCUxKVxuIiwgcmV0LAorCQkJCSAgb2xkdmFsLCB1YWRkciwgb3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX1hPUjoKKwkJX19mdXRleF9hdG9taWNfb3AoIiUxID0geG9yKCUwLCU0KVxuIiwgcmV0LCBvbGR2YWwsIHVhZGRyLAorCQkJCSAgb3BhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PU1lTOworCX0KKworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCWlmICghcmV0KSB7CisJCXN3aXRjaCAoY21wKSB7CisJCWNhc2UgRlVURVhfT1BfQ01QX0VROgorCQkJcmV0ID0gKG9sZHZhbCA9PSBjbXBhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOgorCQkJcmV0ID0gKG9sZHZhbCAhPSBjbXBhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0xUOgorCQkJcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR0U6CisJCQlyZXQgPSAob2xkdmFsID49IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6CisJCQlyZXQgPSAob2xkdmFsIDw9IGNtcGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfR1Q6CisJCQlyZXQgPSAob2xkdmFsID4gY21wYXJnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVOT1NZUzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModTMyICp1dmFsLCB1MzIgX191c2VyICp1YWRkciwgdTMyIG9sZHZhbCwKKwkJCSAgICAgIHUzMiBuZXd2YWwpCit7CisJaW50IHByZXY7CisJaW50IHJldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZih1MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJIjE6ICUxID0gbWVtd19sb2NrZWQoJTMpXG4iCisJIiAgIHtcbiIKKwkiICAgICAgcDIgPSBjbXAuZXEoJTEsJTQpXG4iCisJIiAgICAgIGlmICFwMi5uZXcganVtcDpOVCAzZlxuIgorCSIgICB9XG4iCisJIjI6IG1lbXdfbG9ja2VkKCUzLHAyKSA9ICU1XG4iCisJIiAgIGlmICFwMiBqdW1wIDFiXG4iCisJIjM6XG4iCisJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkiNDogJTAgPSAjJTZcbiIKKwkiICAganVtcCAzYlxuIgorCSIucHJldmlvdXNcbiIKKwkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCSIubG9uZyAxYiw0YiwyYiw0YlxuIgorCSIucHJldmlvdXNcbiIKKwk6ICIrciIgKHJldCksICI9JnIiIChwcmV2KSwgIittIiAoKnVhZGRyKQorCTogInIiICh1YWRkciksICJyIiAob2xkdmFsKSwgInIiIChuZXd2YWwpLCAiaSIoLUVGQVVMVCkKKwk6ICJwMiIsICJtZW1vcnkiKTsKKworCSp1dmFsID0gcHJldjsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fSEVYQUdPTl9GVVRFWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaGV4YWdvbl92bS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2hleGFnb25fdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJjYjlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2hleGFnb25fdm0uaApAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgdG8gSGV4YWdvbiBWaXJ0YWwgTWFjaGluZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEFTTV9IRVhBR09OX1ZNX0gKKyNkZWZpbmUgQVNNX0hFWEFHT05fVk1fSAorCisvKgorICogSW4gcHJpbmNpcGxlLCBhIExpbnV4IGtlcm5lbCBmb3IgdGhlIFZNIGNvdWxkCisgKiBzZWxlY3RpdmVseSBkZWZpbmUgdGhlIHZpcnR1YWwgaW5zdHJ1Y3Rpb25zCisgKiBhcyBpbmxpbmUgYXNzZW1ibGVyIG1hY3JvcywgYnV0IGZvciBhIGZpcnN0IHBhc3MsCisgKiB3ZSdsbCB1c2Ugc3Vicm91dGluZXMgZm9yIGJvdGggdGhlIFZNIGFuZCB0aGUgbmF0aXZlCisgKiBrZXJuZWxzLiAgSXQncyBjb3N0aW5nIGEgc3Vicm91dGluZSBjYWxsL3JldHVybiwKKyAqIGJ1dCBpdCBtYWtlcyBmb3IgYSBzaW5nbGUgc2V0IG9mIGVudHJ5IHBvaW50cworICogZm9yIHRyYWNpbmcvZGVidWdnaW5nLgorICovCisKKy8qCisgKiBMZXRzIG1ha2UgdGhpcyBzdHVmZiB2aXNpYmxlIG9ubHkgaWYgY29uZmlndXJlZCwKKyAqIHNvIHdlIGNhbiB1bmNvbmRpdGlvbmFsbHkgaW5jbHVkZSB0aGUgZmlsZS4KKyAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitlbnVtIFZNX0NBQ0hFX09QUyB7CisJaWNraWxsLAorCWRja2lsbCwKKwlsMmtpbGwsCisJZGNjbGVhbmludmEsCisJaWNpbnZhLAorCWlkc3luYywKKwlmZXRjaF9jZmcKK307CisKK2VudW0gVk1fSU5UX09QUyB7CisJbm9wLAorCWdsb2JlbiwKKwlnbG9iZGlzLAorCWxvY2VuLAorCWxvY2RpcywKKwlhZmZpbml0eSwKKwlnZXQsCisJcGVlaywKKwlzdGF0dXMsCisJcG9zdCwKKwljbGVhcgorfTsKKworZXh0ZXJuIHZvaWQgX0tfVk1fZXZlbnRfdmVjdG9yKHZvaWQpOworCit2b2lkIF9fdm1ydGUodm9pZCk7Citsb25nIF9fdm1zZXR2ZWModm9pZCAqKTsKK2xvbmcgX192bXNldGllKGxvbmcpOworbG9uZyBfX3ZtZ2V0aWUodm9pZCk7Citsb25nIF9fdm1pbnRvcChlbnVtIFZNX0lOVF9PUFMsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOworbG9uZyBfX3ZtY2xybWFwKHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7Citsb25nIF9fdm1uZXdtYXAodm9pZCAqKTsKK2xvbmcgX192bWNhY2hlKGVudW0gVk1fQ0FDSEVfT1BTIG9wLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBfX3ZtZ2V0dGltZSh2b2lkKTsKK2xvbmcgX192bXNldHRpbWUodW5zaWduZWQgbG9uZyBsb25nKTsKK2xvbmcgX192bXN0YXJ0KHZvaWQgKiwgdm9pZCAqKTsKK3ZvaWQgX192bXN0b3Aodm9pZCk7Citsb25nIF9fdm13YWl0KHZvaWQpOwordm9pZCBfX3ZteWllbGQodm9pZCk7Citsb25nIF9fdm12cGlkKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2lja2lsbCh2b2lkKQoreworCXJldHVybiBfX3ZtY2FjaGUoaWNraWxsLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1jYWNoZV9kY2tpbGwodm9pZCkKK3sKKwlyZXR1cm4gX192bWNhY2hlKGRja2lsbCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3ZtY2FjaGVfbDJraWxsKHZvaWQpCit7CisJcmV0dXJuIF9fdm1jYWNoZShsMmtpbGwsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWNhY2hlX2RjY2xlYW5pbnZhKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJcmV0dXJuIF9fdm1jYWNoZShkY2NsZWFuaW52YSwgYWRkciwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1jYWNoZV9pY2ludmEodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gX192bWNhY2hlKGljaW52YSwgYWRkciwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1jYWNoZV9pZHN5bmModW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gX192bWNhY2hlKGlkc3luYywgYWRkciwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1jYWNoZV9mZXRjaF9jZmcodW5zaWduZWQgbG9uZyB2YWwpCit7CisJcmV0dXJuIF9fdm1jYWNoZShmZXRjaF9jZmcsIHZhbCwgMCk7Cit9CisKKy8qIGludGVycnVwdCBvcGVyYXRpb25zICAqLworCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX25vcCh2b2lkKQoreworCXJldHVybiBfX3ZtaW50b3Aobm9wLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9nbG9iZW4obG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AoZ2xvYmVuLCBpLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9nbG9iZGlzKGxvbmcgaSkKK3sKKwlyZXR1cm4gX192bWludG9wKGdsb2JkaXMsIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2xvY2VuKGxvbmcgaSkKK3sKKwlyZXR1cm4gX192bWludG9wKGxvY2VuLCBpLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9sb2NkaXMobG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3AobG9jZGlzLCBpLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9hZmZpbml0eShsb25nIGksIGxvbmcgY3B1KQoreworCXJldHVybiBfX3ZtaW50b3AobG9jZGlzLCBpLCBjcHUsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2dldCh2b2lkKQoreworCXJldHVybiBfX3ZtaW50b3AoZ2V0LCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9wZWVrKHZvaWQpCit7CisJcmV0dXJuIF9fdm1pbnRvcChwZWVrLCAwLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9zdGF0dXMobG9uZyBpKQoreworCXJldHVybiBfX3ZtaW50b3Aoc3RhdHVzLCBpLCAwLCAwLCAwKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9fdm1pbnRvcF9wb3N0KGxvbmcgaSkKK3sKKwlyZXR1cm4gX192bWludG9wKHBvc3QsIGksIDAsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgX192bWludG9wX2NsZWFyKGxvbmcgaSkKK3sKKwlyZXR1cm4gX192bWludG9wKGNsZWFyLCBpLCAwLCAwLCAwKTsKK30KKworI2Vsc2UgLyogT25seSBhc3NlbWJseSBjb2RlIHNob3VsZCByZWZlcmVuY2UgdGhlc2UgKi8KKworI2RlZmluZSBIVk1fVFJBUDFfVk1SVEUJCQkxCisjZGVmaW5lIEhWTV9UUkFQMV9WTVNFVFZFQwkJMgorI2RlZmluZSBIVk1fVFJBUDFfVk1TRVRJRQkJMworI2RlZmluZSBIVk1fVFJBUDFfVk1HRVRJRQkJNAorI2RlZmluZSBIVk1fVFJBUDFfVk1JTlRPUAkJNQorI2RlZmluZSBIVk1fVFJBUDFfVk1DTFJNQVAJCTEwCisjZGVmaW5lIEhWTV9UUkFQMV9WTU5FV01BUAkJMTEKKyNkZWZpbmUgSFZNX1RSQVAxX0ZPUk1FUkxZX1ZNV0lSRQkxMgorI2RlZmluZSBIVk1fVFJBUDFfVk1DQUNIRQkJMTMKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNR0VUVElNRQkJMTQKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNU0VUVElNRQkJMTUKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNV0FJVAkJMTYKKyNkZWZpbmUgSFZNX1RSQVAxX1ZNWUlFTEQJCTE3CisjZGVmaW5lIEhWTV9UUkFQMV9WTVNUQVJUCQkxOAorI2RlZmluZSBIVk1fVFJBUDFfVk1TVE9QCQkxOQorI2RlZmluZSBIVk1fVFJBUDFfVk1WUElECQkyMAorI2RlZmluZSBIVk1fVFJBUDFfVk1TRVRSRUdTCQkyMQorI2RlZmluZSBIVk1fVFJBUDFfVk1HRVRSRUdTCQkyMgorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBDb25zdGFudHMgZm9yIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcworICovCisKKy8qIHZtc2V0aWUgYXJndW1lbnRzICovCisKKyNkZWZpbmUgVk1fSU5UX0RJU0FCTEUJMAorI2RlZmluZSBWTV9JTlRfRU5BQkxFCTEKKworLyogdm1zZXRpbWFzayBhcmd1bWVudHMgKi8KKworI2RlZmluZSBWTV9JTlRfVU5NQVNLCTAKKyNkZWZpbmUgVk1fSU5UX01BU0sJMQorCisjZGVmaW5lIFZNX05FV01BUF9UWVBFX0xJTkVBUgkwCisjZGVmaW5lIFZNX05FV01BUF9UWVBFX1BHVEFCTEVTCTEKKworCisvKgorICogRXZlbnQgUmVjb3JkIGRlZmluaXRpb25zIHVzZWZ1bCB0byBib3RoIEMgYW5kIEFzc2VtYmxlcgorICovCisKKy8qIFZNRVNUIExheW91dCAqLworCisjZGVmaW5lIEhWTV9WTUVTVF9VTV9TRlQJMzEKKyNkZWZpbmUgSFZNX1ZNRVNUX1VNX01TSwkxCisjZGVmaW5lIEhWTV9WTUVTVF9JRV9TRlQJMzAKKyNkZWZpbmUgSFZNX1ZNRVNUX0lFX01TSwkxCisjZGVmaW5lIEhWTV9WTUVTVF9FVkVOVE5VTV9TRlQJMTYKKyNkZWZpbmUgSFZNX1ZNRVNUX0VWRU5UTlVNX01TSwkweGZmCisjZGVmaW5lIEhWTV9WTUVTVF9DQVVTRV9TRlQJMAorI2RlZmluZSBIVk1fVk1FU1RfQ0FVU0VfTVNLCTB4ZmZmZgorCisvKgorICogVGhlIGluaXRpYWwgcHJvZ3JhbSBnZXRzIHRvIGZpbmQgYSBzeXN0ZW0gZW52aXJvbm1lbnQgZGVzY3JpcHRvcgorICogb24gaXRzIHN0YWNrIHdoZW4gaXQgYmVnaW5zIGV4ZWN0aW9uLiBUaGUgZmlyc3Qgd29yZCBpcyBhIHZlcnNpb24KKyAqIGNvZGUgdG8gaW5kaWNhdGUgd2hhdCBpcyB0aGVyZS4gIFplcm8gbWVhbnMgbm90aGluZyBtb3JlLgorICovCisKKyNkZWZpbmUgSEVYQUdPTl9WTV9TRURfTlVMTAkwCisKKy8qCisgKiBFdmVudCBudW1iZXJzIGZvciB2ZWN0b3IgYmluZGluZworICovCisKKyNkZWZpbmUgSFZNX0VWX1JFU0VUCQkwCisjZGVmaW5lIEhWTV9FVl9NQUNIQ0hFQ0sJMQorI2RlZmluZSBIVk1fRVZfR0VORVgJCTIKKyNkZWZpbmUgSFZNX0VWX1RSQVAJCTgKKyNkZWZpbmUgSFZNX0VWX0lOVFIJCTE1CisvKiBUaGVzZSBzaG91ZCBiZSBudWtlZCBhcyBzb29uIGFzIHdlIGtub3cgdGhlIFZNIGlzIHVwIHRvIHNwZWMgdjAuMS4xICovCisjZGVmaW5lIEhWTV9FVl9JTlRSXzAJCTE2CisjZGVmaW5lIEhWTV9NQVhfSU5UUgkJMjQwCisKKy8qCisgKiBDYXVzZSB2YWx1ZXMgZm9yIEdlbmVyYWwgRXhjZXB0aW9uCisgKi8KKworI2RlZmluZSBIVk1fR0VfQ19CVVMJMHgwMQorI2RlZmluZSBIVk1fR0VfQ19YUFJPVAkweDExCisjZGVmaW5lIEhWTV9HRV9DX1hVU0VSCTB4MTQKKyNkZWZpbmUgSFZNX0dFX0NfSU5WSQkweDE1CisjZGVmaW5lIEhWTV9HRV9DX1BSSVZJCTB4MUIKKyNkZWZpbmUgSFZNX0dFX0NfWE1BTAkweDFDCisjZGVmaW5lIEhWTV9HRV9DX1JNQUwJMHgyMAorI2RlZmluZSBIVk1fR0VfQ19XTUFMCTB4MjEKKyNkZWZpbmUgSFZNX0dFX0NfUlBST1QJMHgyMgorI2RlZmluZSBIVk1fR0VfQ19XUFJPVAkweDIzCisjZGVmaW5lIEhWTV9HRV9DX1JVU0VSCTB4MjQKKyNkZWZpbmUgSFZNX0dFX0NfV1VTRVIJMHgyNQorI2RlZmluZSBIVk1fR0VfQ19DQUNIRQkweDI4CisKKy8qCisgKiBDYXVzZSBjb2RlcyBmb3IgTWFjaGluZSBDaGVjaworICovCisKKyNkZWZpbmUJSFZNX01DSEtfQ19ET1dOCQkweDAwCisjZGVmaW5lCUhWTV9NQ0hLX0NfQkFEU1AJMHgwMQorI2RlZmluZQlIVk1fTUNIS19DX0JBREVYCTB4MDIKKyNkZWZpbmUJSFZNX01DSEtfQ19CQURQVAkweDAzCisjZGVmaW5lCUhWTV9NQ0hLX0NfUkVHV1IJMHgyOQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pbnRyaW5zaWNzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaW50cmluc2ljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDIxODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaW50cmluc2ljcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fSEVYQUdPTl9JTlRSSU5TSUNTX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX0lOVFJJTlNJQ1NfSAorCisjZGVmaW5lIEhFWEFHT05fUF92cm1weWhhY2NfUFAJX19idWlsdGluX0hFWEFHT05fTTJfdnJtYWNfczAKKyNkZWZpbmUgSEVYQUdPTl9QX3ZybXB5aF9QUAlfX2J1aWx0aW5fSEVYQUdPTl9NMl92cm1weV9zMAorI2RlZmluZSBIRVhBR09OX1JfY2wwX1IJCV9fYnVpbHRpbl9IRVhBR09OX1MyX2NsMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhY2MyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pby5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogSU8gZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9JT19ICisjZGVmaW5lIF9BU01fSU9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KKyNpbmNsdWRlIDxhc20vaW9tYXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKy8qCisgKiBXZSBkb24ndCBoYXZlIFBDSSB5ZXQuCisgKiBfSU9fQkFTRSBpcyBwb2ludGluZyBhdCB3aGF0IHNob3VsZCBiZSB1bnVzZWQgdmlydHVhbCBzcGFjZS4KKyAqLworI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmYKKyNkZWZpbmUgX0lPX0JBU0UgKCh2b2lkIF9faW9tZW0gKikweGZlMDAwMDAwKQorCitleHRlcm4gaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitleHRlcm4gdm9pZCBfX2lvdW5tYXAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKKworLyogRGVmaW5lZCBpbiBsaWIvaW8uYywgbmVlZGVkIGZvciBzbWM5MXggZHJpdmVyLiAqLworZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGVzdyh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKKworZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGVzbCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKKworI2RlZmluZSByZWFkc3cocCwgZCwgbCkJX19yYXdfcmVhZHN3KHAsIGQsIGwpCisjZGVmaW5lIHdyaXRlc3cocCwgZCwgbCkgX19yYXdfd3JpdGVzdyhwLCBkLCBsKQorCisjZGVmaW5lIHJlYWRzbChwLCBkLCBsKSAgIF9fcmF3X3JlYWRzbChwLCBkLCBsKQorI2RlZmluZSB3cml0ZXNsKHAsIGQsIGwpICBfX3Jhd193cml0ZXNsKHAsIGQsIGwpCisKKy8qCisgKiB2aXJ0X3RvX3BoeXMgLSBtYXAgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsCisgKiBAYWRkcmVzczogIGFkZHJlc3MgdG8gbWFwCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKK3sKKwlyZXR1cm4gX19wYShhZGRyZXNzKTsKK30KKworLyoKKyAqIHBoeXNfdG9fdmlydCAtIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwKKyAqIEBhZGRyZXNzOiBhZGRyZXNzIHRvIG1hcAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIF9fdmEoYWRkcmVzcyk7Cit9CisKKy8qCisgKiBjb252ZXJ0IGEgcGh5c2ljYWwgcG9pbnRlciB0byBhIHZpcnR1YWwga2VybmVsIHBvaW50ZXIgZm9yCisgKiAvZGV2L21lbSBhY2Nlc3MuCisgKi8KKyNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApICAgIF9fdmEocCkKKyNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkgICAgX192YShwKQorCisvKgorICogSU8gcG9ydCBhY2Nlc3MgcHJpbWl0aXZlcy4gIEhleGFnb24gZG9lc24ndCBoYXZlIHNwZWNpYWwgSU8gYWNjZXNzCisgKiBpbnN0cnVjdGlvbnM7IGFsbCBJL08gaXMgbWVtb3J5IG1hcHBlZC4KKyAqCisgKiBpbi9vdXQgYXJlIHVzZWQgZm9yICJwb3J0cyIsIGJ1dCB3ZSBkb24ndCBoYXZlICJwb3J0IGluc3RydWN0aW9ucyIsCisgKiBzbyB0aGVzZSBhcmUgcmVhbGx5IGp1c3QgbWVtb3J5IG1hcHBlZCB0b28uCisgKi8KKworLyoKKyAqIHJlYWRiIC0gcmVhZCBieXRlIGZyb20gbWVtb3J5IG1hcHBlZCBkZXZpY2UKKyAqIEBhZGRyOiAgcG9pbnRlciB0byBtZW1vcnkKKyAqCisgKiBPcGVyYXRlcyBvbiAiSS9PIGJ1cyBtZW1vcnkgc3BhY2UiCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXU4IHZhbDsKKwlhc20gdm9sYXRpbGUoCisJCSIlMCA9IG1lbWIoJTEpOyIKKwkJOiAiPSZyIiAodmFsKQorCQk6ICJyIiAoYWRkcikKKwkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MTYgdmFsOworCWFzbSB2b2xhdGlsZSgKKwkJIiUwID0gbWVtaCglMSk7IgorCQk6ICI9JnIiICh2YWwpCisJCTogInIiIChhZGRyKQorCSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIgcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKAorCQkiJTAgPSBtZW13KCUxKTsiCisJCTogIj0mciIgKHZhbCkKKwkJOiAiciIgKGFkZHIpCisJKTsKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogd3JpdGViIC0gd3JpdGUgYSBieXRlIHRvIGEgbWVtb3J5IGxvY2F0aW9uCisgKiBAZGF0YTogZGF0YSB0byB3cml0ZSB0bworICogQGFkZHI6ICBwb2ludGVyIHRvIG1lbW9yeQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlYih1OCBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJYXNtIHZvbGF0aWxlKAorCQkibWVtYiglMCkgPSAlMTsiCisJCToKKwkJOiAiciIgKGFkZHIpLCAiciIgKGRhdGEpCisJCTogIm1lbW9yeSIKKwkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGV3KHUxNiBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJYXNtIHZvbGF0aWxlKAorCQkibWVtaCglMCkgPSAlMTsiCisJCToKKwkJOiAiciIgKGFkZHIpLCAiciIgKGRhdGEpCisJCTogIm1lbW9yeSIKKwkpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWwodTMyIGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlhc20gdm9sYXRpbGUoCisJCSJtZW13KCUwKSA9ICUxOyIKKwkJOgorCQk6ICJyIiAoYWRkciksICJyIiAoZGF0YSkKKwkJOiAibWVtb3J5IgorCSk7Cit9CisKKyNkZWZpbmUgX19yYXdfd3JpdGViIHdyaXRlYgorI2RlZmluZSBfX3Jhd193cml0ZXcgd3JpdGV3CisjZGVmaW5lIF9fcmF3X3dyaXRlbCB3cml0ZWwKKworI2RlZmluZSBfX3Jhd19yZWFkYiByZWFkYgorI2RlZmluZSBfX3Jhd19yZWFkdyByZWFkdworI2RlZmluZSBfX3Jhd19yZWFkbCByZWFkbAorCisvKgorICogTmVlZCBhbiBtdHlwZSBzb21ld2hlcmUgaW4gaGVyZSwgZm9yIGNhY2hlIHR5cGUgZGVhbHM/CisgKiBUaGlzIGlzIHByb2JhYmx5IHRvbyBsb25nIGZvciBhbiBpbmxpbmUuCisgKi8KK3ZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBpb3JlbWFwX25vY2FjaGUocGh5c19hZGRyLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCV9faW91bm1hcChhZGRyKTsKK30KKworI2RlZmluZSBfX3Jhd193cml0ZWwgd3JpdGVsCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRzdCwgY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsCisJaW50IGNvdW50KQoreworCW1lbWNweShkc3QsICh2b2lkICopIHNyYywgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKKwlpbnQgY291bnQpCit7CisJbWVtY3B5KCh2b2lkICopIGRzdCwgc3JjLCBjb3VudCk7Cit9CisKKyNkZWZpbmUgUENJX0lPX0FERFIJKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKQorCisvKgorICogaW5iIC0gcmVhZCBieXRlIGZyb20gSS9PIHBvcnQgb3Igc29tZXRoaW5nCisgKiBAcG9ydDogIGFkZHJlc3MgaW4gSS9PIHNwYWNlCisgKgorICogT3BlcmF0ZXMgb24gIkkvTyBidXMgSS9PIHNwYWNlIgorICovCitzdGF0aWMgaW5saW5lIHU4IGluYih1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuIHJlYWRiKF9JT19CQVNFICsgKHBvcnQgJiBJT19TUEFDRV9MSU1JVCkpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBpbncodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiByZWFkdyhfSU9fQkFTRSArIChwb3J0ICYgSU9fU1BBQ0VfTElNSVQpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5sKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlyZXR1cm4gcmVhZGwoX0lPX0JBU0UgKyAocG9ydCAmIElPX1NQQUNFX0xJTUlUKSk7Cit9CisKKy8qCisgKiBvdXRiIC0gd3JpdGUgYSBieXRlIHRvIGEgbWVtb3J5IGxvY2F0aW9uCisgKiBAZGF0YTogZGF0YSB0byB3cml0ZSB0bworICogQGFkZHI6ICBhZGRyZXNzIGluIEkvTyBzcGFjZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0Yih1OCBkYXRhLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJd3JpdGViKGRhdGEsIF9JT19CQVNFICsgKHBvcnQgJiBJT19TUEFDRV9MSU1JVCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0dyh1MTYgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXdyaXRldyhkYXRhLCBfSU9fQkFTRSArIChwb3J0ICYgSU9fU1BBQ0VfTElNSVQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG91dGwodTMyIGRhdGEsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl3cml0ZWwoZGF0YSwgX0lPX0JBU0UgKyAocG9ydCAmIElPX1NQQUNFX0xJTUlUKSk7Cit9CisKKyNkZWZpbmUgb3V0Yl9wIG91dGIKKyNkZWZpbmUgb3V0d19wIG91dHcKKyNkZWZpbmUgb3V0bF9wIG91dGwKKworI2RlZmluZSBpbmJfcCBpbmIKKyNkZWZpbmUgaW53X3AgaW53CisjZGVmaW5lIGlubF9wIGlubAorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQl1OCAqYnVmID0gYnVmZmVyOworCQlkbyB7CisJCQl1OCB4ID0gaW5iKHBvcnQpOworCQkJKmJ1ZisrID0geDsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQl1MTYgKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJdTE2IHggPSBpbncocG9ydCk7CisJCQkqYnVmKysgPSB4OworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXUzMiAqYnVmID0gYnVmZmVyOworCQlkbyB7CisJCQl1MzIgeCA9IGludyhwb3J0KTsKKwkJCSpidWYrKyA9IHg7CisJCX0gd2hpbGUgKC0tY291bnQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCWNvbnN0IHU4ICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCW91dGIoKmJ1ZisrLCBwb3J0KTsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJY29uc3QgdTE2ICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCW91dHcoKmJ1ZisrLCBwb3J0KTsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJY29uc3QgdTMyICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCW91dGwoKmJ1ZisrLCBwb3J0KTsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCisjZGVmaW5lIGZsdXNoX3dyaXRlX2J1ZmZlcnMoKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDhjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaXJxLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9JUlFfSF8KKyNkZWZpbmUgX0FTTV9JUlFfSF8KKworLyogTnVtYmVyIG9mIGZpcnN0LWxldmVsIGludGVycnVwdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDUFUgY29yZS4gKi8KKyNkZWZpbmUgSEVYQUdPTl9DUFVJTlRTIDMyCisKKy8qCisgKiBNdXN0IGRlZmluZSBOUl9JUlFTIGJlZm9yZSBpbmNsdWRpbmcgPGFzbS1nZW5lcmljL2lycS5oPgorICogNjQgPT0gdGhlIHR3byBTSVJDJ3MsIDE3NiA9PSB0aGUgdHdvIGdwaW8ncworICoKKyAqIElSUSBjb25maWd1cmF0aW9uIGlzIHN0aWxsIGluIGZsdXg7IGRlZmluaW5nIHRoaXMgdG8gYSBjb21mb3J0YWJseQorICogbGFyZ2UgbnVtYmVyLgorICovCisjZGVmaW5lIE5SX0lSUVMgNTEyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnEuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTUyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogSVJRIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9JUlFGTEFHU19ICisjZGVmaW5lIF9BU01fSVJRRkxBR1NfSAorCisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCit7CisJcmV0dXJuIF9fdm1nZXRpZSgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQoreworCXJldHVybiBfX3Ztc2V0aWUoVk1fSU5UX0RJU0FCTEUpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuICFmbGFnczsKK30KKworc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiAhX192bWdldGllKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3sKKwlfX3Ztc2V0aWUoVk1fSU5UX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCit7CisJX192bXNldGllKFZNX0lOVF9ESVNBQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlfX3Ztc2V0aWUoZmxhZ3MpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9rZ2RiLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20va2dkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODc3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20va2dkYi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBhcmNoL2hleGFnb24vaW5jbHVkZS9hc20va2dkYi5oIC0gSGV4YWdvbiBLR0RCIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0hFWEFHT05fS0dEQl9IX18KKyNkZWZpbmUgX19IRVhBR09OX0tHREJfSF9fCisKKyNkZWZpbmUgQlJFQUtfSU5TVFJfU0laRSA0CisjZGVmaW5lIENBQ0hFX0ZMVVNIX0lTX1NBRkUgICAxCisjZGVmaW5lIEJVRk1BWCAgICAgICAoKE5VTVJFR0JZVEVTICogMikgKyA1MTIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2tnZGJfYnJlYWtwb2ludCh2b2lkKQoreworCWFzbSgidHJhcDAoIzB4REIpIik7Cit9CisKKy8qIFJlZ2lzdGVyczoKKyAqIDMyIGdwciArIHNhMC8xICsgbGMwLzEgKyBtMC8xICsgZ3AgKyB1Z3AgKyBwcmVkICsgcGMgPSA0MiB0b3RhbC4KKyAqIHZtIHJlZ3MgPSBwc3ArZWxyK2VzdCtiYWR2YSA9IDQKKyAqIHN5c2NhbGwrcmVzdGFydCA9IDIgbW9yZQorICogc28gNDggPSA0MiArNCArIDIKKyAqLworI2RlZmluZSBEQkdfVVNFUl9SRUdTIDQyCisjZGVmaW5lIERCR19NQVhfUkVHX05VTSAoREJHX1VTRVJfUkVHUyArIDYpCisjZGVmaW5lIE5VTVJFR0JZVEVTICAoREJHX01BWF9SRUdfTlVNKjQpCisKKyNlbmRpZiAvKiBfX0hFWEFHT05fS0dEQl9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9saW5rYWdlLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbGlua2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGI4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbGlua2FnZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0xJTktBR0VfSAorI2RlZmluZSBfX0FTTV9MSU5LQUdFX0gKKworI2RlZmluZSBfX0FMSUdOCQkuYWxpZ24gNAorI2RlZmluZSBfX0FMSUdOX1NUUgkiLmFsaWduIDQiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21lbS1sYXlvdXQuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tZW0tbGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlNWRjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tZW0tbGF5b3V0LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBNZW1vcnkgbGF5b3V0IGRlZmluaXRpb25zIGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fSEVYQUdPTl9NRU1fTEFZT1VUX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX01FTV9MQVlPVVRfSAorCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKworLyoKKyAqIEhhdmUgdG8gZG8gdGhpcyBmb3IgZ2lub3Jtb3VzIG51bWJlcnMsIGVsc2UgdGhleSBnZXQgcHJpbnRlZCBhcworICogbmVnYXRpdmUgbnVtYmVycywgd2hpY2ggdGhlIGxpbmtlciBubyBsaWtleSB3aGVuIHlvdSB0cnkgdG8KKyAqIGFzc2lnbiBpdCB0byB0aGUgbG9jYXRpb24gY291bnRlci4KKyAqLworCisjZGVmaW5lIFBBR0VfT0ZGU0VUCQkJX0FDKDB4YzAwMDAwMDAsIFVMKQorCisvKgorICogTE9BRF9BRERSRVNTIGlzIHRoZSBwaHlzaWNhbC9saW5lYXIgYWRkcmVzcyBvZiB3aGVyZSBpbiBtZW1vcnkKKyAqIHRoZSBrZXJuZWwgZ2V0cyBsb2FkZWQuIFRoZSAxMiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG11c3QgYmUgemVybyAoMCkKKyAqIGR1ZSB0byBsaW1pdGF0aW9ucyBvbiBzZXR0aW5nIHRoZSBFVkIKKyAqCisgKi8KKworI2lmbmRlZiBMT0FEX0FERFJFU1MKKyNkZWZpbmUgTE9BRF9BRERSRVNTCQkJMHgwMDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgVEFTS19TSVpFCQkJKFBBR0VfT0ZGU0VUKQorCisvKiAgbm90IHN1cmUgaG93IHRoZXNlIGFyZSB1c2VkIHlldCAgKi8KKyNkZWZpbmUgU1RBQ0tfVE9QCQkJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJCQlUQVNLX1NJWkUKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK2VudW0gZml4ZWRfYWRkcmVzc2VzIHsKKwlGSVhfS01BUF9CRUdJTiwKKwlGSVhfS01BUF9FTkQsICAvKiAgY2hlY2sgZm9yIHBlci1jcHVpc20gICovCisJX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzCit9OworCisjZGVmaW5lIE1JTl9LRVJORUxfU0VHIDB4MzAwICAgLyogRnJvbSAweGMwMDAwMDAwICovCitleHRlcm4gaW50IG1heF9rZXJuZWxfc2VnOworCisvKgorICogU3RhcnQgb2Ygdm1hbGxvYyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZm9yIGtlcm5lbDsKKyAqIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgcGh5c2ljYWwgbWVtb3J5IGF2YWlsYWJsZQorICovCisKKyNkZWZpbmUgVk1BTExPQ19TVEFSVCAoUEFHRV9PRkZTRVQgKyBWTUFMTE9DX09GRlNFVCArIFwKKwkodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSkKKworLyogR2FwIGJldHdlZW4gcGh5c2ljYWwgcmFtIGFuZCB2bWFsbG9jIHNwYWNlIGZvciBndWFyZCBwdXJwb3Nlcy4gKi8KKyNkZWZpbmUgVk1BTExPQ19PRkZTRVQgUEFHRV9TSVpFCisKKy8qCisgKiBDcmVhdGUgdGhlIHNwYWNlIGJldHdlZW4gVk1BTExPQ19TVEFSVCBhbmQgRklYQUREUl9UT1AgYmFja3dhcmRzCisgKiBmcm9tIHRoZSAuLi4gInRvcCIuCisgKgorICogUGVybWFuZW50IElPIG1hcHBpbmdzIHdpbGwgbGl2ZSBhdCAweGZleHhfeHh4eAorICogSHlwZXJ2aXNvciBvY2N1cGllcyB0aGUgbGFzdCAxNk1CIHBhZ2UgYXQgMHhmZnh4eHh4eAorICovCisKKyNkZWZpbmUgRklYQUREUl9UT1AgICAgIDB4ZmUwMDAwMDAKKyNkZWZpbmUgRklYQUREUl9TSVpFICAgIChfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgRklYQUREUl9TVEFSVCAgIChGSVhBRERSX1RPUCAtIEZJWEFERFJfU0laRSkKKworLyoKKyAqICJwZXJtYW5lbnQga2VybmVsIG1hcHBpbmdzIiwgZGVmaW5lZCBhcyBsb25nLWxhc3RpbmcgbWFwcGluZ3Mgb2YKKyAqIGhpZ2gtbWVtb3J5IHBhZ2UgZnJhbWVzIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgorICovCisKKyNkZWZpbmUgTEFTVF9QS01BUAlQVFJTX1BFUl9QVEUKKyNkZWZpbmUgTEFTVF9QS01BUF9NQVNLCShMQVNUX1BLTUFQIC0gMSkKKyNkZWZpbmUgUEtNQVBfTlIodmlydCkJKCh2aXJ0IC0gUEtNQVBfQkFTRSkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgUEtNQVBfQUREUihucikJKFBLTUFQX0JBU0UgKyAoKG5yKSA8PCBQQUdFX1NISUZUKSkKKworLyoKKyAqIFRvIHRoZSAibGVmdCIgb2YgdGhlIGZpeGVkIG1hcCBzcGFjZSBpcyB0aGUga21hcCBzcGFjZQorICoKKyAqICJQZXJtYW5lbnQgS2VybmVsIE1hcHBpbmdzIjsgZmFuY3kgKG9yIGxlc3MgZmFuY3kpIFBURSB0YWJsZQorICogdGhhdCBsb29rcyBsaWtlIGl0J3MgYWN0dWFsbHkgd2Fsa2VkLgorICogTmVlZCB0byBjaGVjayB0aGUgYWxpZ25tZW50L3NoaWZ0IHVzYWdlOyBzb21lIGFyY2hzIHVzZQorICogUE1EX01BU0sgb24gdGhpcyB2YWx1ZQorICovCisjZGVmaW5lIFBLTUFQX0JBU0UgKEZJWEFERFJfU1RBUlQtUEFHRV9TSVpFKkxBU1RfUEtNQVApCisKKy8qCisgKiAyIHBhZ2VzIG9mIGd1YXJkIGdhcCBiZXR3ZWVuIHdoZXJlIHZtYWxsb2MgYXJlYSBlbmRzCisgKiBhbmQgcGttYXBfYmFzZSBiZWdpbnMuCisgKi8KKyNkZWZpbmUgVk1BTExPQ19FTkQgKFBLTUFQX0JBU0UtUEFHRV9TSVpFKjIpCisjZW5kaWYgLyogICFfX0FTU0VNQkxZX18gICovCisKKworI2VuZGlmIC8qIF9BU01fSEVYQUdPTl9NRU1fTEFZT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE1ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fTU1VX0gKKyNkZWZpbmUgX0FTTV9NTVVfSAorCisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KKworLyoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzdGF0ZSBmb3IgYSBtbV9zdHJ1Y3QuCisgKiBGb3IgdGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lLCBpdCBjYW4gYmUgYSBjb3B5CisgKiBvZiB0aGUgcG9pbnRlciB0byB0aGUgcGFnZSB0YWJsZSBiYXNlLgorICovCitzdHJ1Y3QgbW1fY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBsb25nIGdlbmVyYXRpb247CisJdW5zaWduZWQgbG9uZyBwdGJhc2U7CisJc3RydWN0IGhleGFnb25fdmRzbyAqdmRzbzsKK307CisKK3R5cGVkZWYgc3RydWN0IG1tX2NvbnRleHQgbW1fY29udGV4dF90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTU0gY29udGV4dCBzdXBwb3J0IGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fTU1VX0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX01NVV9DT05URVhUX0gKKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vbWVtLWxheW91dC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworfQorCisvKgorICogVk0gcG9ydCBoaWRlcyBhbGwgVExCIG1hbmFnZW1lbnQsIHNvICJsYXp5IFRMQiIgaXNuJ3QgdmVyeQorICogbWVhbmluZ2Z1bC4gIEV2ZW4gZm9yIHBvcnRzIHRvIGFyY2hpdGVjdHVyZXMgd2l0aCB2aXNibGUgVExCcywKKyAqIHRoaXMgaXMgYWxtb3N0IGludmFyaWFibHkgYSBudWxsIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7Cit9CisKKy8qCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgYWN0aW9ucywgaWYgYW55LCBmb3IgbWVtb3J5IG1hcCBkZWFjdGl2YXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFjdGl2YXRlX21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworfQorCisvKioKKyAqIGluaXRfbmV3X2NvbnRleHQgLSBpbml0aWFsaXplIGNvbnRleHQgcmVsYXRlZCBpbmZvIGZvciBuZXcgbW1fc3RydWN0IGluc3RhbmNlCisgKiBAdHNrOiBwb2ludGVyIHRvIGEgdGFzayBzdHJ1Y3QKKyAqIEBtbTogcG9pbnRlciB0byBhIG5ldyBtbSBzdHJ1Y3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJLyogbW0tPmNvbnRleHQgaXMgc2V0IHVwIGJ5IHBnZF9hbGxvYyAqLworCXJldHVybiAwOworfQorCisvKgorICogIFN3aXRjaCBhY3RpdmUgbW0gY29udGV4dAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaW50IGwxOworCisJLyoKKwkgKiBGb3IgdmlydHVhbCBtYWNoaW5lLCB3ZSBoYXZlIHRvIHVwZGF0ZSBzeXN0ZW0gbWFwIGlmIGl0J3MgYmVlbgorCSAqIHRvdWNoZWQuCisJICovCisJaWYgKG5leHQtPmNvbnRleHQuZ2VuZXJhdGlvbiA8IHByZXYtPmNvbnRleHQuZ2VuZXJhdGlvbikgeworCQlmb3IgKGwxID0gTUlOX0tFUk5FTF9TRUc7IGwxIDw9IG1heF9rZXJuZWxfc2VnOyBsMSsrKQorCQkJbmV4dC0+cGdkW2wxXSA9IGluaXRfbW0ucGdkW2wxXTsKKworCQluZXh0LT5jb250ZXh0LmdlbmVyYXRpb24gPSBwcmV2LT5jb250ZXh0LmdlbmVyYXRpb247CisJfQorCisJX192bW5ld21hcCgodm9pZCAqKW5leHQtPmNvbnRleHQucHRiYXNlKTsKK30KKworLyoKKyAqICBBY3RpdmF0ZSBuZXcgbWVtb3J5IG1hcCBmb3IgdGFzaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXN3aXRjaF9tbShwcmV2LCBuZXh0LCBjdXJyZW50X3RocmVhZF9pbmZvKCktPnRhc2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogIEdlbmVyaWMgaG9va3MgZm9yIGFyY2hfZHVwX21tYXAgYW5kIGFyY2hfZXhpdF9tbWFwICAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21vZHVsZS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmE0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbW9kdWxlLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9NT0RVTEVfSAorI2RlZmluZSBfQVNNX01PRFVMRV9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tb2R1bGUuaD4KKworI2RlZmluZSBNT0RVTEVfQVJDSF9WRVJNQUdJQyBfX3N0cmluZ2lmeShQUk9DRVNTT1JfTU9ERUxfTkFNRSkgIiAiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL211dGV4LmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGI1MmRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL211dGV4LmgKQEAgLTAsMCArMSw4IEBACisvKgorICogUHVsbCBpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG11dGV4IGZhc3RwYXRoLgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkOTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBQYWdlIG1hbmFnZW1lbnQgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9QQUdFX0gKKyNkZWZpbmUgX0FTTV9QQUdFX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CisKKy8qICBUaGlzIGlzIHByb2JhYmx5IG5vdCB0aGUgbW9zdCBncmFjZWZ1bCB3YXkgdG8gaGFuZGxlIHRoaXMuICAqLworCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV80S0IKKyNkZWZpbmUgUEFHRV9TSElGVCAxMgorI2RlZmluZSBIRVhBR09OX0wxX1BURV9TSVpFIF9fSFZNX1BERV9TXzRLQgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzE2S0IKKyNkZWZpbmUgUEFHRV9TSElGVCAxNAorI2RlZmluZSBIRVhBR09OX0wxX1BURV9TSVpFIF9fSFZNX1BERV9TXzE2S0IKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBR0VfU0laRV82NEtCCisjZGVmaW5lIFBBR0VfU0hJRlQgMTYKKyNkZWZpbmUgSEVYQUdPTl9MMV9QVEVfU0laRSBfX0hWTV9QREVfU182NEtCCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMjU2S0IKKyNkZWZpbmUgUEFHRV9TSElGVCAxOAorI2RlZmluZSBIRVhBR09OX0wxX1BURV9TSVpFIF9fSFZNX1BERV9TXzI1NktCCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMU1CCisjZGVmaW5lIFBBR0VfU0hJRlQgMjAKKyNkZWZpbmUgSEVYQUdPTl9MMV9QVEVfU0laRSBfX0hWTV9QREVfU18xTUIKKyNlbmRpZgorCisvKgorICogIFRoZXNlIHNob3VsZCBiZSBkZWZpbmVkIGluIGh1Z2V0bGIuaCwgYnV0IGFwcGFyZW50bHkgbm90LgorICogICJIdWdlIiBmb3IgdXMgc2hvdWxkIGJlIDRNQiBvciAxNk1CLCB3aGljaCBhcmUgYm90aCByZXByZXNlbnRlZAorICogIGluIEwxIFBURSdzLiAgUmlnaHQgbm93LCBpdCdzIHNldCB1cCBmb3IgNE1CLgorICovCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorI2RlZmluZSBIUEFHRV9TSElGVCAyMgorI2RlZmluZSBIUEFHRV9TSVpFICgxVUwgPDwgSFBBR0VfU0hJRlQpCisjZGVmaW5lIEhQQUdFX01BU0sgKH4oSFBBR0VfU0laRS0xKSkKKyNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSIChIUEFHRV9TSElGVC1QQUdFX1NISUZUKQorI2RlZmluZSBIVk1fSFVHRVBBR0VfU0laRSAweDUKKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfU0laRSAgKDFVTCA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX01BU0sgICh+KCgxIDw8IFBBR0VfU0hJRlQpIC0gMSkpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogVGhpcyBpcyBmb3IgUEZOX0RPV04sIHdoaWNoIG1tLmggbmVlZHMuICBTZWVtcyB0aGUgcmlnaHQgcGxhY2UgdG8gcHVsbCBpdCBpbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorCisvKgorICogV2UgaW1wbGVtZW50IGEgdHdvLWxldmVsIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBwYWdlIHRhYmxlIHN0cnVjdHVyZS4KKyAqIE51bGwgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgbGV2ZWwgKHBtZCwgcHVkKSBkZWZpbml0aW9ucyB3aWxsIGNvbWUgZnJvbQorICogYXNtLWdlbmVyaWMvcGFnZXRhYmxlLW5vcG1kLmggYW5kIGFzbS1nZW5lcmljL3BhZ2V0YWJsZS1ub3B1ZC5oCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwdGU7IH0gcHRlX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKworI2RlZmluZSBwdGVfdmFsKHgpICAgICAoKHgpLnB0ZSkKKyNkZWZpbmUgcGdkX3ZhbCh4KSAgICAgKCh4KS5wZ2QpCisjZGVmaW5lIHBncHJvdF92YWwoeCkgICgoeCkucGdwcm90KQorI2RlZmluZSBfX3B0ZSh4KSAgICAgICAoKHB0ZV90KSB7ICh4KSB9KQorI2RlZmluZSBfX3BnZCh4KSAgICAgICAoKHBnZF90KSB7ICh4KSB9KQorI2RlZmluZSBfX3BncHJvdCh4KSAgICAoKHBncHJvdF90KSB7ICh4KSB9KQorCisvKgorICogV2UgbmVlZCBhIF9fcGEgYW5kIGEgX192YSByb3V0aW5lIGZvciBrZXJuZWwgc3BhY2UuCisgKiBNSVBTIHNheXMgdGhleSdyZSBvbmx5IHVzZWQgZHVyaW5nIG1lbV9pbml0LgorICogYWxzbywgY2hlY2sgaWYgd2UgbmVlZCBhIFBIWVNfT0ZGU0VULgorICovCisjZGVmaW5lIF9fcGEoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSAtIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSgodW5zaWduZWQgbG9uZykoeCkgKyBQQUdFX09GRlNFVCkpCisKKy8qIFRoZSAicGFnZSBmcmFtZSIgZGVzY3JpcHRvciBpcyBkZWZpbmVkIGluIGxpbnV4L21tLmggKi8KK3N0cnVjdCBwYWdlOworCisvKiBSZXR1cm5zIHBhZ2UgZnJhbWUgZGVzY3JpcHRvciBmb3IgdmlydHVhbCBhZGRyZXNzLiAqLworI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpIHBmbl90b19wYWdlKFBGTl9ET1dOKF9fcGEoa2FkZHIpKSkKKworLyogRGVmYXVsdCB2bSBhcmVhIGJlaGF2aW9yIGlzIG5vbi1leGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIChWTV9SRUFEIHwgVk1fV1JJVEUgfCBcCisJCQkJVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKworI2RlZmluZSBwZm5fdmFsaWQocGZuKSAoKHBmbikgPCBtYXhfbWFwbnIpCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikgcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCisKKy8qICBOZWVkIHRvIG5vdCB1c2UgYSBkZWZpbmUgZm9yIGxpbmVzaXplOyBtYXkgbW92ZSB0aGlzIHRvIGFub3RoZXIgZmlsZS4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfcGFnZSh2b2lkICpwYWdlKQoreworCS8qICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb24gcGFnZXMgd2l0aCBMMSBXQiBjYWNoZSAqLworCWFzbSB2b2xhdGlsZSgKKwkJIglsb29wMCgxZiwlMSk7XG4iCisJCSIxOgl7IGRjemVyb2EoJTApO1xuIgorCQkiCSAgJTAgPSBhZGQoJTAsIzMyKTsgfTplbmRsb29wMFxuIgorCQk6ICIrciIgKHBhZ2UpCisJCTogInIiIChQQUdFX1NJWkUvMzIpCisJCTogImxjMCIsICJzYTAiLCAibWVtb3J5IgorCSk7Cit9CisKKyNkZWZpbmUgY29weV9wYWdlKHRvLCBmcm9tKQltZW1jcHkoKHRvKSwgKGZyb20pLCBQQUdFX1NJWkUpCisKKy8qCisgKiBVbmRlciBhc3N1bXB0aW9uIHRoYXQga2VybmVsIGFsd2F5cyAic2VlcyIgdXNlciBtYXAuLi4KKyAqLworI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCisjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKKworLyoKKyAqIHBhZ2VfdG9fcGh5cyAtIGNvbnZlcnQgcGFnZSB0byBwaHlzaWNhbCBhZGRyZXNzCisgKiBAcGFnZSAtIHBvaW50ZXIgdG8gcGFnZSBlbnRyeSBpbiBtZW1fbWFwCisgKi8KKyNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpICAgICAgKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCisKKy8qCisgKiBGb3IgcG9ydCB0byBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZSwgTUFZQkUgd2UgY2hlY2sgZm9yIGF0dGVtcHRzCisgKiB0byByZWZlcmVuY2UgcmVzZXJ2ZWQgSFZNIHNwYWNlLCBidXQgaW4gYW55IGNhc2UsIHRoZSBWTSB3aWxsIGJlCisgKiBwcm90ZWN0ZWQuCisgKi8KKyNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpICAgKDEpCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KKy8qIFhYWCBUb2RvOiBpbXBsZW1lbnQgYXNzZW1ibHktb3B0aW1pemVkIHZlcnNpb24gb2YgZ2V0b3JkZXIuICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ2V0b3JkZXIuaD4KKworI2VuZGlmIC8qIGlmZGVmIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIGlmZGVmIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGFyYW0uaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGFyYW0uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BBUkFNX0gKKyNkZWZpbmUgX0FTTV9QQVJBTV9ICisKKyNkZWZpbmUgRVhFQ19QQUdFU0laRQkxNjM4NAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFyYW0uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI5MTBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BFUkZfRVZFTlRfSAorI2RlZmluZSBfQVNNX1BFUkZfRVZFTlRfSAorCisjZGVmaW5lIFBFUkZfRVZFTlRfSU5ERVhfT0ZGU0VUCTAKKworI2VuZGlmIC8qIF9BU01fUEVSRl9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ0M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIFBhZ2UgdGFibGUgc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BHQUxMT0NfSAorI2RlZmluZSBfQVNNX1BHQUxMT0NfSAorCisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNkZWZpbmUgY2hlY2tfcGd0X2NhY2hlKCkgZG8ge30gd2hpbGUgKDApCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcga21hcF9nZW5lcmF0aW9uOworCisvKgorICogUGFnZSB0YWJsZSBjcmVhdGlvbiBpbnRlcmZhY2UKKyAqLworc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXBnZF90ICpwZ2Q7CisKKwlwZ2QgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCisJLyoKKwkgKiBUaGVyZSBtYXkgYmUgYmV0dGVyIHdheXMgdG8gZG8gdGhpcywgYnV0IHRvIGVuc3VyZQorCSAqIHRoYXQgbmV3IGFkZHJlc3Mgc3BhY2VzIGFsd2F5cyBjb250YWluIHRoZSBrZXJuZWwKKwkgKiBiYXNlIG1hcHBpbmcsIGFuZCB0byBlbnN1cmUgdGhhdCB0aGUgdXNlciBhcmVhIGlzCisJICogaW5pdGlhbGx5IG1hcmtlZCBpbnZhbGlkLCBpbml0aWFsaXplIHRoZSBuZXcgbWFwCisJICogbWFwIHdpdGggYSBjb3B5IG9mIHRoZSBrZXJuZWwncyBwZXJzaXN0ZW50IG1hcC4KKwkgKi8KKworCW1lbWNweShwZ2QsIHN3YXBwZXJfcGdfZGlyLCBQVFJTX1BFUl9QR0Qqc2l6ZW9mKHBnZF90ICopKTsKKwltbS0+Y29udGV4dC5nZW5lcmF0aW9uID0ga21hcF9nZW5lcmF0aW9uOworCisJLyogUGh5c2ljYWwgdmVyc2lvbiBpcyB3aGF0IGlzIHBhc3NlZCB0byB2aXJ0dWFsIG1hY2hpbmUgb24gc3dpdGNoICovCisJbW0tPmNvbnRleHQucHRiYXNlID0gX19wYShwZ2QpOworCisJcmV0dXJuIHBnZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGdkKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcGFnZSAqcHRlOworCisJcHRlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfUkVQRUFUIHwgX19HRlBfWkVSTyk7CisKKwlpZiAocHRlKQorCQlwZ3RhYmxlX3BhZ2VfY3RvcihwdGUpOworCisJcmV0dXJuIHB0ZTsKK30KKworLyogX2tlcm5lbCB2YXJpYW50IGdldHMgdG8gdXNlIGEgZGlmZmVyZW50IGFsbG9jYXRvciAqLworc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCWdmcF90IGZsYWdzID0gIEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPOworCXJldHVybiAocHRlX3QgKikgX19nZXRfZnJlZV9wYWdlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKQoreworCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CisJX19mcmVlX3BhZ2UocHRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZSkKK3sKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKKwkJCQlwZ3RhYmxlX3QgcHRlKQoreworCS8qCisJICogQ29udmVuaWVudGx5LCB6ZXJvIGluIDMgTFNCIG1lYW5zIGluZGlyZWN0IDRLIHBhZ2UgdGFibGUuCisJICogTm90IHNvIGNvbnZlbmllbnQgd2hlbiB5b3UncmUgdHJ5aW5nIHRvIHZhcnkgdGhlIHBhZ2Ugc2l6ZS4KKwkgKi8KKwlzZXRfcG1kKHBtZCwgX19wbWQoKCh1bnNpZ25lZCBsb25nKXBhZ2VfdG9fcGZuKHB0ZSkgPDwgUEFHRV9TSElGVCkgfAorCQlIRVhBR09OX0wxX1BURV9TSVpFKSk7Cit9CisKKy8qCisgKiBPdGhlciBhcmNoaXRlY3R1cmVzIHNlZW0gdG8gaGF2ZSB3YXlzIG9mIG1ha2luZyBhbGwgcHJvY2Vzc2VzCisgKiBzaGFyZSB0aGUgc2FtZSBwbWQncyBmb3IgdGhlaXIga2VybmVsIG1hcHBpbmdzLCBidXQgdGhlIHYwLjMKKyAqIEhleGFnb24gVk0gc3BlYyBoYXMgYSAibW9ub2xpdGhpYyIgTDEgdGFibGUgZm9yIHVzZXIgYW5kIGtlcm5lbAorICogc2VnbWVudHMuICBXZSB0cmFjayAiZ2VuZXJhdGlvbnMiIG9mIHRoZSBrZXJuZWwgbWFwIHRvIG1pbmltaXplCisgKiBvdmVyaGVhZCwgYW5kIHVwZGF0ZSB0aGUgInNsYXZlIiBjb3BpZXMgb2YgdGhlIGtlcm5lbCBtYXBwaW5ncworICogYXMgcGFydCBvZiBzd2l0Y2hfbW0uICBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUKKyAqIGtlcm5lbCBtYXAgb2YgdGhlIGFjdGl2ZSB0aHJlYWQgd2hvJ3MgY2FsbGluZyBwbWRfcG9wdWxhdGVfa2VybmVsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAorCQkJCSAgICAgICBwdGVfdCAqcHRlKQoreworCWV4dGVybiBzcGlubG9ja190IGttYXBfZ2VuX2xvY2s7CisJcG1kX3QgKnBwbWQ7CisJaW50IHBtZGluZGV4OworCisJc3Bpbl9sb2NrKCZrbWFwX2dlbl9sb2NrKTsKKwlrbWFwX2dlbmVyYXRpb24rKzsKKwltbS0+Y29udGV4dC5nZW5lcmF0aW9uID0ga21hcF9nZW5lcmF0aW9uOworCWN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5nZW5lcmF0aW9uID0ga21hcF9nZW5lcmF0aW9uOworCXNwaW5fdW5sb2NrKCZrbWFwX2dlbl9sb2NrKTsKKworCXNldF9wbWQocG1kLCBfX3BtZCgoKHVuc2lnbmVkIGxvbmcpX19wYShwdGUpKSB8IEhFWEFHT05fTDFfUFRFX1NJWkUpKTsKKworCS8qCisJICogTm93IHRoZSAic2xhdmUiIGNvcHkgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLgorCSAqIFRoaXMgaXMgcG9pbnRlciBhcml0aG1ldGljLCBub3QgYnl0ZSBhZGRyZXNzZXMhCisJICovCisJcG1kaW5kZXggPSAocGdkX3QgKilwbWQgLSBtbS0+cGdkOworCXBwbWQgPSAocG1kX3QgKiljdXJyZW50LT5hY3RpdmVfbW0tPnBnZCArIHBtZGluZGV4OworCXNldF9wbWQocHBtZCwgX19wbWQoKCh1bnNpZ25lZCBsb25nKV9fcGEocHRlKSkgfCBIRVhBR09OX0wxX1BURV9TSVpFKSk7CisJaWYgKHBtZGluZGV4ID4gbWF4X2tlcm5lbF9zZWcpCisJCW1heF9rZXJuZWxfc2VnID0gcG1kaW5kZXg7Cit9CisKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLCBwdGUsIGFkZHIpCQlcCitkbyB7CQkJCQkJXAorCXBndGFibGVfcGFnZV9kdG9yKChwdGUpKTsJCVwKKwl0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksIChwdGUpKTsJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2MTliZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBQYWdlIHRhYmxlIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9QR1RBQkxFX0gKKyNkZWZpbmUgX0FTTV9QR1RBQkxFX0gKKworLyoKKyAqIFBhZ2UgdGFibGUgZGVmaW5pdGlvbnMgZm9yIFF1YWxjb21tIEhleGFnb24gcHJvY2Vzc29yLgorICovCisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgorCisvKiBBIGhhbmR5IHRoaW5nIHRvIGhhdmUgaWYgb25lIGhhcyB0aGUgUkFNLiBEZWNsYXJlZCBpbiBoZWFkLlMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHplcm9fcGFnZV9tYXNrOworCisvKgorICogVGhlIFBURSBtb2RlbCBkZXNjcmliZWQgaGVyZSBpcyB0aGF0IG9mIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZSwKKyAqIHdoaWNoIGF1dG9ub21vdXNseSB3YWxrcyAyLWxldmVsIHBhZ2UgdGFibGVzLiAgQXQgYSBsb3dlciBsZXZlbCwgd2UKKyAqIGFsc28gZGVzY3JpYmUgdGhlIFJJU0Npc2ggc29mdHdhcmUtbG9hZGVkIFRMQiBlbnRyeSBzdHJ1Y3R1cmUgb2YKKyAqIHRoZSB1bmRlcmx5aW5nIEhleGFnb24gcHJvY2Vzc29yLiBBIGtlcm5lbCBidWlsdCB0byBydW4gb24gdGhlCisgKiB2aXJ0dWFsIG1hY2hpbmUgaGFzIG5vIG5lZWQgdG8ga25vdyBhYm91dCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS4KKyAqLworI2luY2x1ZGUgPGFzbS92bV9tbXUuaD4KKworLyoKKyAqIFRvIG1heGltaXplIHRoZSBjb21mb3J0IGxldmVsIGZvciB0aGUgUFRFIG1hbmlwdWxhdGlvbiBtYWNyb3MsCisgKiBkZWZpbmUgdGhlICJ3ZWxsIGtub3duIiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgYml0cy4KKyAqLworI2RlZmluZSBfUEFHRV9SRUFECV9fSFZNX1BURV9SCisjZGVmaW5lIF9QQUdFX1dSSVRFCV9fSFZNX1BURV9XCisjZGVmaW5lIF9QQUdFX0VYRUNVVEUJX19IVk1fUFRFX1gKKyNkZWZpbmUgX1BBR0VfVVNFUglfX0hWTV9QVEVfVQorCisvKgorICogV2UgaGF2ZSBhIHRvdGFsIG9mIDQgInNvZnQiIGJpdHMgYXZhaWxhYmxlIGluIHRoZSBhYnN0cmFjdCBQVEUuCisgKiBUaGUgdHdvIG1hbmRhdG9yeSBzb2Z0d2FyZSBiaXRzIGFyZSBEaXJ0eSBhbmQgQWNjZXNzZWQuCisgKiBUbyBtYWtlIG5vbmxpbmVhciBzd2FwIHdvcmsgYWNjb3JkaW5nIHRvIHRoZSBtb3JlIHJlY2VudAorICogbW9kZWwsIHdlIHdhbnQgYSBsb3cgb3JkZXIgIlByZXNlbnQiIGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGUgUFRFIGRlc2NyaWJlcyBNTVUgcHJvZ3JhbW1pbmcgb3Igc3dhcCBzcGFjZS4KKyAqLworI2RlZmluZSBfUEFHRV9QUkVTRU5UCSgxPDwwKQorI2RlZmluZSBfUEFHRV9ESVJUWQkoMTw8MSkKKyNkZWZpbmUgX1BBR0VfQUNDRVNTRUQJKDE8PDIpCisKKy8qCisgKiBfUEFHRV9GSUxFIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiBfUEFHRV9QUkVTRU5UIGlzIGZhbHNlLCB3aGlsZQorICogX1BBR0VfRElSVFkgaXMgb25seSBtZWFuaW5nZnVsIGlmIF9QQUdFX1BSRVNFTlQgaXMgdHJ1ZS4KKyAqIFNvIHdlIGNhbiBvdmVybG9hZCB0aGUgYml0Li4uCisgKi8KKyNkZWZpbmUgX1BBR0VfRklMRQlfUEFHRV9ESVJUWSAvKiBzZXQ6ICBwYWdlY2FjaGUsIHVuc2V0ID0gc3dhcCAqLworCisvKgorICogRm9yIG5vdywgbGV0J3Mgc2F5IHRoYXQgVmFsaWQgYW5kIFByZXNlbnQgYXJlIHRoZSBzYW1lIHRoaW5nLgorICogQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgc2F5IHRoYXQgaXQncyB0aGUgIm9yIiBvZiBSLCBXLCBhbmQgWAorICogcGVybWlzc2lvbnMuCisgKi8KKyNkZWZpbmUgX1BBR0VfVkFMSUQJX1BBR0VfUFJFU0VOVAorCisvKgorICogV2UncmUgbm90IGRlZmluaW5nIF9QQUdFX0dMT0JBTCBoZXJlLCBzaW5jZSB0aGVyZSdzIG5vIGNvbmNlcHQKKyAqIG9mIGdsb2JhbCBwYWdlcyBvciBBU0lEcyBleHBvc2VkIHRvIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZSwKKyAqIGFuZCB3ZSB3YW50IHRvIHVzZSB0aGUgc2FtZSBwYWdlIHRhYmxlIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBpbgorICogdGhlIG5hdGl2ZSBrZXJuZWwgYXMgd2UgZG8gaW4gdGhlIHZpcnR1YWwgbWFjaGluZSBrZXJuZWwuCisgKiBTbyB3ZSdsbCBwdXQgdXAgd2l0aCBhIGJpdCBvZiBpbmVmZmljaWVuY3kgZm9yIG5vdy4uLgorICovCisKKy8qCisgKiBUb3AgIkZPVVJUSCIgbGV2ZWwgKHBnZCksIHdoaWNoIGZvciB0aGUgSGV4YWdvbiBWTSBpcyByZWFsbHkKKyAqIG9ubHkgdGhlIHNlY29uZCBmcm9tIHRoZSBib3R0b20sIHBnZCBhbmQgcHVkIGJvdGggYmVpbmcgY29sbGFwc2VkLgorICogRWFjaCBlbnRyeSByZXByZXNlbnRzIDRNQiBvZiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UsIDRLIG9mIHRhYmxlCisgKiB0aHVzIG1hcHMgdGhlIGZ1bGwgNEdCLgorICovCisjZGVmaW5lIFBHRElSX1NISUZUIDIyCisjZGVmaW5lIFBUUlNfUEVSX1BHRCAxMDI0CisKKyNkZWZpbmUgUEdESVJfU0laRSAoMVVMIDw8IFBHRElSX1NISUZUKQorI2RlZmluZSBQR0RJUl9NQVNLICh+KFBHRElSX1NJWkUtMSkpCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzRLQgorI2RlZmluZSBQVFJTX1BFUl9QVEUgMTAyNAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzE2S0IKKyNkZWZpbmUgUFRSU19QRVJfUFRFIDI1NgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFHRV9TSVpFXzY0S0IKKyNkZWZpbmUgUFRSU19QRVJfUFRFIDY0CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMjU2S0IKKyNkZWZpbmUgUFRSU19QRVJfUFRFIDE2CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQUdFX1NJWkVfMU1CCisjZGVmaW5lIFBUUlNfUEVSX1BURSA0CisjZW5kaWYKKworLyogIEFueSBiaWdnZXIgYW5kIHRoZSBQVEUgZGlzYXBwZWFycy4gICovCisjZGVmaW5lIHBnZF9FUlJPUihlKSBcCisJcHJpbnRrKEtFUk5fRVJSICIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxcCisJCXBnZF92YWwoZSkpCisKKy8qCisgKiBQYWdlIFByb3RlY3Rpb24gQ29uc3RhbnRzLiBJbmNsdWRlcyAoaW4gdGhpcyB2YXJpYW50KSBjYWNoZSBhdHRyaWJ1dGVzLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBfZGZsdF9jYWNoZV9hdHQ7CisKKyNkZWZpbmUgUEFHRV9OT05FCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgXAorCQkJCV9kZmx0X2NhY2hlX2F0dCkKKyNkZWZpbmUgUEFHRV9SRUFET05MWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IFwKKwkJCQlfUEFHRV9SRUFEIHwgX1BBR0VfRVhFQ1VURSB8IF9kZmx0X2NhY2hlX2F0dCkKKyNkZWZpbmUgUEFHRV9DT1BZCVBBR0VfUkVBRE9OTFkKKyNkZWZpbmUgUEFHRV9FWEVDCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgXAorCQkJCV9QQUdFX1JFQUQgfCBfUEFHRV9FWEVDVVRFIHwgX2RmbHRfY2FjaGVfYXR0KQorI2RlZmluZSBQQUdFX0NPUFlfRVhFQwlQQUdFX0VYRUMKKyNkZWZpbmUgUEFHRV9TSEFSRUQJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9SRUFEIHwgXAorCQkJCV9QQUdFX0VYRUNVVEUgfCBfUEFHRV9XUklURSB8IF9kZmx0X2NhY2hlX2F0dCkKKyNkZWZpbmUgUEFHRV9LRVJORUwJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JFQUQgfCBcCisJCQkJX1BBR0VfV1JJVEUgfCBfUEFHRV9FWEVDVVRFIHwgX2RmbHRfY2FjaGVfYXR0KQorCisKKy8qCisgKiBBbGlhc2VzIGZvciBtYXBwaW5nIG1tYXAoKSBwcm90ZWN0aW9uIGJpdHMgdG8gcGFnZSBwcm90ZWN0aW9ucy4KKyAqIFRoZXNlIGdldCB1c2VkIGZvciBzdGF0aWMgaW5pdGlhbGl6YXRpb24sIHNvIHVzaW5nIHRoZSBfZGZsdF9jYWNoZV9hdHQKKyAqIHZhcmlhYmxlIGZvciB0aGUgZGVmYXVsdCBjYWNoZSBhdHRyaWJ1dGUgaXNuJ3Qgd29ya2FibGUuIElmIHRoZQorICogZGVmYXVsdCBnZXRzIGNoYW5nZWQgYXQgYm9vdCB0aW1lLCB0aGUgYm9vdCBvcHRpb24gY29kZSBoYXMgdG8KKyAqIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMgbGlrZSB0aGUgcHJvdGFjdGlvbl9tYXBbXSBhcnJheS4KKyAqLworI2RlZmluZSBDQUNIRURFRgkoQ0FDSEVfREVGQVVMVCA8PCA2KQorCisvKiBQcml2YXRlIChjb3B5LW9uLXdyaXRlKSBwYWdlIHByb3RlY3Rpb25zLiAqLworI2RlZmluZSBfX1AwMDAgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBDQUNIRURFRikKKyNkZWZpbmUgX19QMDAxIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfUkVBRCB8IENBQ0hFREVGKQorI2RlZmluZSBfX1AwMTAgX19QMDAwCS8qIFdyaXRlLW9ubHkgY29weS1vbi13cml0ZSAqLworI2RlZmluZSBfX1AwMTEgX19QMDAxCS8qIFJlYWQvV3JpdGUgY29weS1vbi13cml0ZSAqLworI2RlZmluZSBfX1AxMDAgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBcCisJCQlfUEFHRV9FWEVDVVRFIHwgQ0FDSEVERUYpCisjZGVmaW5lIF9fUDEwMSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUNVVEUgfCBcCisJCQlfUEFHRV9SRUFEIHwgQ0FDSEVERUYpCisjZGVmaW5lIF9fUDExMCBfX1AxMDAJLyogV3JpdGUvZXhlY3V0ZSBjb3B5LW9uLXdyaXRlICovCisjZGVmaW5lIF9fUDExMSBfX1AxMDEJLyogUmVhZC9Xcml0ZS9FeGVjdXRlLCBjb3B5LW9uLXdyaXRlICovCisKKy8qIFNoYXJlZCBwYWdlIHByb3RlY3Rpb25zLiAqLworI2RlZmluZSBfX1MwMDAgX19QMDAwCisjZGVmaW5lIF9fUzAwMSBfX1AwMDEKKyNkZWZpbmUgX19TMDEwIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgXAorCQkJX1BBR0VfV1JJVEUgfCBDQUNIRURFRikKKyNkZWZpbmUgX19TMDExIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfUkVBRCB8IFwKKwkJCV9QQUdFX1dSSVRFIHwgQ0FDSEVERUYpCisjZGVmaW5lIF9fUzEwMCBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IFwKKwkJCV9QQUdFX0VYRUNVVEUgfCBDQUNIRURFRikKKyNkZWZpbmUgX19TMTAxIF9fUDEwMQorI2RlZmluZSBfX1MxMTAgX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBcCisJCQlfUEFHRV9FWEVDVVRFIHwgX1BBR0VfV1JJVEUgfCBDQUNIRURFRikKKyNkZWZpbmUgX19TMTExIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfUkVBRCB8IFwKKwkJCV9QQUdFX0VYRUNVVEUgfCBfUEFHRV9XUklURSB8IENBQ0hFREVGKQorCitleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsgIC8qIGxvY2F0ZWQgaW4gaGVhZC5TICovCisKKy8qIFNlZW1zIHRvIGJlIHplcm8gZXZlbiBpbiBhcmNoaXRlY3R1cmVzIHdoZXJlIHRoZSB6ZXJvIHBhZ2UgaXMgZmlyZXdhbGxlZD8gKi8KKyNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTIDAKKyNkZWZpbmUgcHRlX3NwZWNpYWwocHRlKQkwCisjZGVmaW5lIHB0ZV9ta3NwZWNpYWwocHRlKQkocHRlKQorCisvKiAgSFVHRVRMQiBub3Qgd29ya2luZyBjdXJyZW50bHkgICovCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorI2RlZmluZSBwdGVfbWtodWdlKHB0ZSkgX19wdGUoKHB0ZV92YWwocHRlKSAmIH4weDMpIHwgSFZNX0hVR0VQQUdFX1NJWkUpCisjZW5kaWYKKworLyoKKyAqIEZvciBub3csIGFzc3VtZSB0aGF0IGhpZ2hlci1sZXZlbCBjb2RlIHdpbGwgZG8gVExCL01NVSBpbnZhbGlkYXRpb25zCisgKiBhbmQgZG9uJ3QgaW5zZXJ0IHRoYXQgb3ZlcmhlYWQgaW50byB0aGlzIGxvdy1sZXZlbCBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgc3luY19pY2FjaGVfZGNhY2hlKHB0ZV90IHB0ZSk7CisKKyNkZWZpbmUgcHRlX3ByZXNlbnRfZXhlY191c2VyKHB0ZSkgXAorCSgocHRlX3ZhbChwdGUpICYgKF9QQUdFX0VYRUNVVEUgfCBfUEFHRV9VU0VSKSkgPT0gXAorCShfUEFHRV9FWEVDVVRFIHwgX1BBR0VfVVNFUikpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJLyogIHNob3VsZCByZWFsbHkgYmUgdXNpbmcgcHRlX2V4ZWMsIGlmIGl0IHdlcmVuJ3QgZGVjbGFyZWQgbGF0ZXIuICovCisJaWYgKHB0ZV9wcmVzZW50X2V4ZWNfdXNlcihwdGV2YWwpKQorCQlzeW5jX2ljYWNoZV9kY2FjaGUocHRldmFsKTsKKworCSpwdGVwID0gcHRldmFsOworfQorCisvKgorICogRm9yIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZSBNTVUgKG9yIGl0cyBlbXVsYXRpb24pLCBhIG51bGwvaW52YWxpZAorICogTDEgUFRFIChQTUQvUEdEKSBoYXMgNyBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gRm9yIHRoZSBMMiBQVEUKKyAqIChMaW51eCBQVEUpLCB0aGUga2V5IGlzIHRvIGhhdmUgYml0cyAxMS4uOSBhbGwgemVyby4gIFdlJ2QgdXNlIDB4NworICogYXMgYSB1bml2ZXJzYWwgbnVsbCBlbnRyeSwgYnV0IHNvbWUgb2YgdGhvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworICogYXJlIGludGVycHJldGVkIGJ5IHNvZnR3YXJlLgorICovCisjZGVmaW5lIF9OVUxMX1BNRAkweDcKKyNkZWZpbmUgX05VTExfUFRFCTB4MAorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2NsZWFyKHBtZF90ICpwbWRfZW50cnlfcHRyKQoreworCSBwbWRfdmFsKCpwbWRfZW50cnlfcHRyKSA9IF9OVUxMX1BNRDsKK30KKworLyoKKyAqIENvbnZlbmllbnRseSwgYSBudWxsIFBURSB2YWx1ZSBpcyBpbnZhbGlkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJcHRlX3QgKnB0ZXApCit7CisJcHRlX3ZhbCgqcHRlcCkgPSBfTlVMTF9QVEU7Cit9CisKKyNpZmRlZiBORUVEX1BNRF9JTkRFWF9ERVNQSVRFX0JFSU5HXzJfTEVWRUwKKy8qKgorICogcG1kX2luZGV4IC0gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBQTUQgcGFnZQorICogd2hpY2ggd291bGQgY29udHJvbCB0aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzCisgKi8KKyNkZWZpbmUgcG1kX2luZGV4KGFkZHJlc3MpICgoKGFkZHJlc3MpID4+IFBNRF9TSElGVCkgJiAoUFRSU19QRVJfUE1ELTEpKQorCisjZW5kaWYKKworLyoqCisgKiBwZ2RfaW5kZXggLSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgaW4gdGhlIFBHRCBwYWdlCisgKiB3aGljaCB3b3VsZCBjb250cm9sIHRoZSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBUaGlzIHJldHVybnMgdGhlICppbmRleCogZm9yIHRoZSBhZGRyZXNzIGluIHRoZSBwZ2RfdAorICovCisjZGVmaW5lIHBnZF9pbmRleChhZGRyZXNzKSAoKChhZGRyZXNzKSA+PiBQR0RJUl9TSElGVCkgJiAoUFRSU19QRVJfUEdELTEpKQorCisvKgorICogcGdkX29mZnNldCAtIGZpbmQgYW4gb2Zmc2V0IGluIGEgcGFnZS10YWJsZS1kaXJlY3RvcnkKKyAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKSAoKG1tKS0+cGdkICsgcGdkX2luZGV4KGFkZHIpKQorCisvKgorICogcGdkX29mZnNldF9rIC0gZ2V0IGtlcm5lbCAoaW5pdF9tbSkgcGdkIGVudHJ5IHBvaW50ZXIgZm9yIGFkZHIKKyAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykgcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcykKKworLyoqCisgKiBwbWRfbm9uZSAtIGNoZWNrIGlmIHBtZF9lbnRyeSBpcyBtYXBwZWQKKyAqIEBwbWRfZW50cnk6ICBwbWQgZW50cnkKKyAqCisgKiBNSVBTIGNoZWNrcyBpdCBhZ2FpbnN0IHRoYXQgImludmFsaWQgcHRlIHRhYmxlIiB0aGluZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcG1kX25vbmUocG1kX3QgcG1kKQoreworCXJldHVybiBwbWRfdmFsKHBtZCkgPT0gX05VTExfUE1EOworfQorCisvKioKKyAqIHBtZF9wcmVzZW50IC0gaXMgdGhlcmUgYSBwYWdlIHRhYmxlIGJlaGluZCB0aGlzPworICogRXNzZW50aWFsbHkgdGhlIGludmVyc2Ugb2YgcG1kX25vbmUuICBXZSBtYXliZQorICogc2F2ZSBhbiBpbmxpbmUgaW5zdHJ1Y3Rpb24gYnkgZGVmaW5pbmcgaXQgdGhpcworICogd2F5LCBpbnN0ZWFkIG9mIHNpbXBseSAiIXBtZF9ub25lIi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcG1kX3ByZXNlbnQocG1kX3QgcG1kKQoreworCXJldHVybiBwbWRfdmFsKHBtZCkgIT0gKHVuc2lnbmVkIGxvbmcpX05VTExfUE1EOworfQorCisvKioKKyAqIHBtZF9iYWQgLSBjaGVjayBpZiBhIFBNRCBlbnRyeSBpcyAiYmFkIi4gVGhhdCBtaWdodCBtZWFuIHN3YXBwZWQgb3V0LgorICogQXMgd2UgaGF2ZSBubyBrbm93biBjYXVzZSBvZiBiYWRuZXNzLCBpdCdzIG51bGwsIGFzIGl0IGlzIGZvciBtYW55CisgKiBhcmNoaXRlY3R1cmVzLgorICovCitzdGF0aWMgaW5saW5lIGludCBwbWRfYmFkKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBtZF9wYWdlIC0gY29udmVydHMgYSBQTUQgZW50cnkgdG8gYSBwYWdlIHBvaW50ZXIKKyAqLworI2RlZmluZSBwbWRfcGFnZShwbWQpICAocGZuX3RvX3BhZ2UocG1kX3ZhbChwbWQpID4+IFBBR0VfU0hJRlQpKQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKKworLyoqCisgKiBwdGVfbm9uZSAtIGNoZWNrIGlmIHB0ZSBpcyBtYXBwZWQKKyAqIEBwdGU6IHB0ZV90IGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9ub25lKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpID09IF9OVUxMX1BURTsKK307CisKKy8qCisgKiBwdGVfcHJlc2VudCAtIGNoZWNrIGlmIHBhZ2UgaXMgcHJlc2VudAorICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfcHJlc2VudChwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1BSRVNFTlQ7Cit9CisKKy8qIG1rX3B0ZSAtIG1ha2UgYSBQVEUgb3V0IG9mIGEgcGFnZSBwb2ludGVyIGFuZCBwcm90ZWN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgbWtfcHRlKHBhZ2UsIHBncHJvdCkgcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgKHBncHJvdCkpCisKKy8qIHB0ZV9wYWdlIC0gcmV0dXJucyBhIHBhZ2UgKGZyYW1lIHBvaW50ZXIvZGVzY3JpcHRvcj8pIGJhc2VkIG9uIGEgUFRFICovCisjZGVmaW5lIHB0ZV9wYWdlKHgpIHBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCisKKy8qIHB0ZV9ta29sZCAtIG1hcmsgUFRFIGFzIG5vdCByZWNlbnRseSBhY2Nlc3NlZCAqLworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX21reW91bmcgLSBtYXJrIFBURSBhcyByZWNlbnRseSBhY2Nlc3NlZCAqLworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOworCXJldHVybiBwdGU7Cit9CisKKy8qIHB0ZV9ta2NsZWFuIC0gbWFyayBwYWdlIGFzIGluIHN5bmMgd2l0aCBiYWNraW5nIHN0b3JlICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOworCXJldHVybiBwdGU7Cit9CisKKy8qIHB0ZV9ta2RpcnR5IC0gbWFyayBwYWdlIGFzIG1vZGlmaWVkICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX3lvdW5nIC0gImlzIFBURSBtYXJrZWQgYXMgYWNjZXNzZWQiPyAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7Cit9CisKKy8qIHB0ZV9kaXJ0eSAtICJpcyBQVEUgZGlydHk/IiAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7Cit9CisKKy8qIHB0ZV9tb2RpZnkgLSBzZXQgcHJvdGVjdGlvbiBiaXRzIG9uIFBURSAqLworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbW9kaWZ5KHB0ZV90IHB0ZSwgcGdwcm90X3QgcHJvdCkKK3sKKwlwdGVfdmFsKHB0ZSkgJj0gUEFHRV9NQVNLOworCXB0ZV92YWwocHRlKSB8PSBwZ3Byb3RfdmFsKHByb3QpOworCXJldHVybiBwdGU7Cit9CisKKy8qIHB0ZV93cnByb3RlY3QgLSBtYXJrIHBhZ2UgYXMgbm90IHdyaXRhYmxlICovCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfV1JJVEU7CisJcmV0dXJuIHB0ZTsKK30KKworLyogcHRlX21rd3JpdGUgLSBtYXJrIHBhZ2UgYXMgd3JpdGFibGUgKi8KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9XUklURTsKKwlyZXR1cm4gcHRlOworfQorCisvKiBwdGVfbWtleGVjIC0gbWFyayBQVEUgYXMgZXhlY3V0YWJsZSAqLworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRVhFQ1VURTsKKwlyZXR1cm4gcHRlOworfQorCisvKiBwdGVfcmVhZCAtICJpcyBQVEUgbWFya2VkIGFzIHJlYWRhYmxlPyIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsKK30KKworLyogcHRlX3dyaXRlIC0gImlzIFBURSBtYXJrZWQgYXMgd3JpdGFibGU/IiAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7Cit9CisKKworLyogcHRlX2V4ZWMgLSAiaXMgUFRFIG1hcmtlZCBhcyBleGVjdXRhYmxlPyIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQ1VURTsKK30KKworLyogX19wdGVfdG9fc3dwX2VudHJ5IC0gZXh0cmFjdCBzd2FwIGVudHJ5IGZyb20gUFRFICovCisjZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpICgoc3dwX2VudHJ5X3QpIHsgcHRlX3ZhbChwdGUpIH0pCisKKy8qIF9fc3dwX2VudHJ5X3RvX3B0ZSAtIGV4dHJhY3QgUFRFIGZyb20gc3dhcCBlbnRyeSAqLworI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoeCkgKChwdGVfdCkgeyAoeCkudmFsIH0pCisKKy8qIHBmbl9wdGUgLSBjb252ZXJ0IHBhZ2UgbnVtYmVyIGFuZCBwcm90ZWN0aW9uIHZhbHVlIHRvIHBhZ2UgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHBncHJvdCkgX19wdGUoKHBmbiA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocGdwcm90KSkKKworLyogcHRlX3BmbiAtIGNvbnZlcnQgcHRlIHRvIHBhZ2UgZnJhbWUgbnVtYmVyICovCisjZGVmaW5lIHB0ZV9wZm4ocHRlKSAocHRlX3ZhbChwdGUpID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIHNldF9wbWQocG1kcHRyLCBwbWR2YWwpICgqKHBtZHB0cikgPSAocG1kdmFsKSkKKworLyoKKyAqIHNldF9wdGVfYXQgLSB1cGRhdGUgcGFnZSB0YWJsZSBhbmQgZG8gd2hhdGV2ZXIgbWFnaWMgbWF5IGJlCisgKiBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS9maXJtd2FyZSB0YWtlIG5vdGUuCisgKgorICogVk0gbWF5IHJlcXVpcmUgYSB2aXJ0dWFsIGluc3RydWN0aW9uIHRvIGFsZXJ0IHRoZSBNTVUuCisgKi8KKyNkZWZpbmUgc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKSBzZXRfcHRlKHB0ZXAsIHB0ZSkKKworLyoKKyAqIE1heSBuZWVkIHRvIGludm9rZSB0aGUgdmlydHVhbCBtYWNoaW5lIGFzIHdlbGwuLi4KKyAqLworI2RlZmluZSBwdGVfdW5tYXAocHRlKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkJZG8geyB9IHdoaWxlICgwKQorCisvKgorICogcHRlX29mZnNldF9tYXAgLSByZXR1cm5zIHRoZSBsaW5lYXIgYWRkcmVzcyBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeQorICogY29ycmVzcG9uZGluZyB0byBhbiBhZGRyZXNzCisgKi8KKyNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLCBhZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCooZGlyKSkpICsgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQorCisjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwX25lc3RlZChwbWQsIGFkZHIpIHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcikKKworLyogcHRlX29mZnNldF9rZXJuZWwgLSBrZXJuZWwgdmVyc2lvbiBvZiBwdGVfb2Zmc2V0ICovCisjZGVmaW5lIHB0ZV9vZmZzZXRfa2VybmVsKGRpciwgYWRkcmVzcykgXAorCSgocHRlX3QgKikgKHVuc2lnbmVkIGxvbmcpIF9fdmEocG1kX3ZhbCgqZGlyKSAmIFBBR0VfTUFTSykgXAorCQkJCSsgIF9fcHRlX29mZnNldChhZGRyZXNzKSkKKworLyogWkVST19QQUdFIC0gcmV0dXJucyB0aGUgZ2xvYmFsbHkgc2hhcmVkIHplcm8gcGFnZSAqLworI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoJmVtcHR5X3plcm9fcGFnZSkpCisKKyNkZWZpbmUgX19wdGVfb2Zmc2V0KGFkZHJlc3MpICgoKGFkZHJlc3MpID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURSAtIDEpKQorCisvKiBOb3RoaW5nIHNwZWNpYWwgYWJvdXQgSU8gcmVtYXBwaW5nIGF0IHRoaXMgcG9pbnQgKi8KKyNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkgXAorCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCisKKy8qICBJIHRoaW5rIHRoaXMgaXMgaW4gY2FzZSB3ZSBoYXZlIHBhZ2UgdGFibGUgY2FjaGVzOyBuZWVkZWQgYnkgaW5pdC9tYWluLmMgICovCisjZGVmaW5lIHBndGFibGVfY2FjaGVfaW5pdCgpICAgIGRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIFN3YXAvZmlsZSBQVEUgZGVmaW5pdGlvbnMuICBJZiBfUEFHRV9QUkVTRU5UIGlzIHplcm8sIHRoZSByZXN0IG9mIHRoZQorICogUFRFIGlzIGludGVycHJldGVkIGFzIHN3YXAgaW5mb3JtYXRpb24uICBEZXBlbmRpbmcgb24gdGhlIF9QQUdFX0ZJTEUKKyAqIGJpdCwgdGhlIHJlbWFpbmluZyBmcmVlIGJpdHMgYXJlIGVpdGVociBpbnRlcnByZXRlZCBhcyBhIGZpbGUgb2Zmc2V0CisgKiBvciBhIHN3YXAgdHlwZS9vZmZzZXQgdHVwbGUuICBSYXRoZXIgdGhhbiBoYXZlIHRoZSBUTEIgZmlsbCBoYW5kbGVyCisgKiB0ZXN0IF9QQUdFX1BSRVNFTlQsIHdlJ3JlIGdvaW5nIHRvIHJlc2VydmUgdGhlIHBlcm1pc3Npb25zIGJpdHMKKyAqIGFuZCBzZXQgdGhlbSB0byBhbGwgemVyb3MgZm9yIHN3YXAgZW50cmllcywgd2hpY2ggc3BlZWRzIHVwIHRoZQorICogbWlzcyBoYW5kbGVyIGF0IHRoZSBjb3N0IG9mIDMgYml0cyBvZiBvZmZzZXQuICBUaGF0IHRyYWRlLW9mZiBjYW4KKyAqIGJlIHJldmlzaXRlZCBpZiBuZWNlc3NhcnksIGJ1dCBIZXhhZ29uIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgYW5kCisgKiB0YXJnZXQgYXBwbGljYXRpb25zIHN1Z2dlc3QgYSBsb3Qgb2YgVExCIG1pc3NlcyBhbmQgbm90IG11Y2ggc3dhcCBzcGFjZS4KKyAqCisgKiBGb3JtYXQgb2Ygc3dhcCBQVEU6CisgKgliaXQJMDoJUHJlc2VudCAoemVybykKKyAqCWJpdAkxOglfUEFHRV9GSUxFICh6ZXJvKQorICoJYml0cwkyLTY6CXN3YXAgdHlwZSAoYXJjaCBpbmRlcGVuZGVudCBsYXllciB1c2VzIDUgYml0cyBtYXgpCisgKgliaXRzCTctOToJYml0cyAyOjAgb2Ygb2Zmc2V0CisgKgliaXRzIDEwLTEyOgllZmZlY3RpdmVseSBfUEFHRV9QUk9UTk9ORSAoYWxsIHplcm8pCisgKgliaXRzIDEzLTMxOiAgYml0cyAyMTozIG9mIHN3YXAgb2Zmc2V0CisgKgorICogRm9ybWF0IG9mIGZpbGUgUFRFOgorICoJYml0CTA6CVByZXNlbnQgKHplcm8pCisgKgliaXQJMToJX1BBR0VfRklMRSAoemVybykKKyAqCWJpdHMJMi05OgliaXRzIDc6MCBvZiBvZmZzZXQKKyAqCWJpdHMgMTAtMTI6CWVmZmVjdGl2ZWx5IF9QQUdFX1BST1ROT05FIChhbGwgemVybykKKyAqCWJpdHMgMTMtMzE6ICBiaXRzIDI2Ojggb2Ygc3dhcCBvZmZzZXQKKyAqCisgKiBUaGUgc3BsaXQgb2Zmc2V0IG1ha2VzIHNvbWUgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3MgYSBsaXR0bGUgZ25hcmx5LAorICogYnV0IHRoZXJlJ3MgcGxlbnR5IG9mIHByZWNlZGVudCBmb3IgdGhpcyBzb3J0IG9mIHRoaW5nLgorICovCisjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTICAgICAyNworCisvKiBVc2VkIGZvciBzd2FwIFBURXMgKi8KKyNkZWZpbmUgX19zd3BfdHlwZShzd3BfcHRlKQkJKCgoc3dwX3B0ZSkudmFsID4+IDIpICYgMHgxZikKKworI2RlZmluZSBfX3N3cF9vZmZzZXQoc3dwX3B0ZSkgXAorCSgoKChzd3BfcHRlKS52YWwgPj4gNykgJiAweDcpIHwgKCgoc3dwX3B0ZSkudmFsID4+IDEwKSAmIDB4MDAzZmZmZjgpKQorCisjZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsIG9mZnNldCkgXAorCSgoc3dwX2VudHJ5X3QpCXsgXAorCQkoKHR5cGUgPDwgMikgfCBcCisJCSAoKG9mZnNldCAmIDB4M2ZmZmY4KSA8PCAxMCkgfCAoKG9mZnNldCAmIDB4NykgPDwgNykpIH0pCisKKy8qIFVzZWQgZm9yIGZpbGUgUFRFcyAqLworI2RlZmluZSBwdGVfZmlsZShwdGUpIFwKKwkoKHB0ZV92YWwocHRlKSAmIChfUEFHRV9GSUxFIHwgX1BBR0VfUFJFU0VOVCkpID09IF9QQUdFX0ZJTEUpCisKKyNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHB0ZSkgXAorCSgoKHB0ZV92YWwocHRlKSA+PiAyKSAmIDB4ZmYpIHwgKChwdGVfdmFsKHB0ZSkgPj4gNSkgJiAweDA3ZmZmZjAwKSkKKworI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKSBcCisJKChwdGVfdCkgeyAoKCgob2ZmKSAmIDB4N2ZmZmYwMCkgPDwgNSkgfCAoKChvZmYpICYgMHhmZikgPDwgMilcCisJfCBfUEFHRV9GSUxFKSB9KQorCisvKiAgT2ggYm95LiAgVGhlcmUgYXJlIGEgbG90IG9mIHBvc3NpYmxlIGFyY2ggb3ZlcnJpZGVzIGZvdW5kIGluIHRoaXMgZmlsZS4gICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM1ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogUHJvY2Vzcy9wcm9jZXNzb3Igc3VwcG9ydCBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BST0NFU1NPUl9ICisjZGVmaW5lIF9BU01fUFJPQ0VTU09SX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGFzbS9tZW0tbGF5b3V0Lmg+CisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKKy8qICBtdXN0IGJlIGEgbWFjcm8gICovCisjZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgKHsgX19sYWJlbF9fIF9sOyBfbDogJiZfbDsgfSkKKworLyogIHRhc2tfc3RydWN0LCBkZWZpbmVkIGVsc2V3aGVyZSwgaXMgdGhlICJwcm9jZXNzIGRlc2NyaXB0b3IiICovCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKKy8qICB0aGlzIGlzIGRlZmluZWQgaW4gYXJjaC9wcm9jZXNzLmMgICovCitleHRlcm4gcGlkX3Qga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitleHRlcm4gdm9pZCBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiB0aHJlYWRfc3RydWN0IGlzIHN1cHBvc2VkIHRvIGJlIGZvciBjb250ZXh0IHN3aXRjaCBkYXRhLgorICogU3BlY2lmaWNhbGx5LCB0byBob2xkIHRoZSBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBzd2l0Y2hfdG8uLi4KKyAqLworc3RydWN0IHRocmVhZF9zdHJ1Y3QgeworCXZvaWQgKnN3aXRjaF9zcDsKK307CisKKy8qCisgKiBpbml0aWFsaXplcyB0aHJlYWRfc3RydWN0CisgKiBUaGUgb25seSB0aGluZyB3ZSBoYXZlIGluIHRoZXJlIGlzIHN3aXRjaF9zcAorICogd2hpY2ggZG9lc24ndCByZWFsbHkgbmVlZCB0byBiZSBpbml0aWFsaXplZC4KKyAqLworCisjZGVmaW5lIElOSVRfVEhSRUFEIHsgXAorfQorCisjZGVmaW5lIGNwdV9yZWxheCgpIF9fdm15aWVsZCgpCisKKy8qCisgKiAiVW5sYXp5aW5nIGFsbCBsYXp5IHN0YXR1cyIgb2NjdXJzIGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7Cit9CisKKy8qCisgKiBEZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bSBzcGFjZSBkdXJpbmcKKyAqIG1tYXBzLgorICogU2VlIGFsc28gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYS4KKyAqIERvZXNuJ3QgYWZmZWN0IGlmIHlvdSBoYXZlIE1BWF9GSVhFRCBpbiB0aGUgcGFnZSBmbGFncyBzZXQgdGhvdWdoLi4uCisgKgorICogQXBwYXJlbnRseSB0aGUgY29udmVudGlvbiBpcyB0aGF0IGxkLnNvIHdpbGwgYXNrIGZvciAidW5tYXBwZWQiIHByaXZhdGUKKyAqIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgU09NRVdIRVJFLCBidXQgaXQgYWxzbyBhc2tzIGZvciBtZW1vcnkgZXhwbGljaXRseQorICogdmlhIE1BUF9GSVhFRCBhdCB0aGUgbG93ZXIgKiBhZGRyZXNzZXMgc3RhcnRpbmcgYXQgVkE9MHgwLgorICoKKyAqIElmIHRoZSB0d28gcmVxdWVzdHMgY29sbGlkZSwgeW91IGdldCBhdXRoZW50aWMgc2VnZmF1bHRpbmcgYWN0aW9uLCBzbworICogeW91IGhhdmUgdG8ga2ljayB0aGUgInVubWFwcGVkIiBiYXNlIHJlcXVlc3RzIGhpZ2hlciB1cC4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFBBR0VfQUxJR04oVEFTS19TSVpFLzMpKQorCisKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKwkoKHN0cnVjdCBwdF9yZWdzICopKHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFKSAtIDEpCisKKyNkZWZpbmUgS1NUS19FSVAodHNrKSAocHRfZWxyKHRhc2tfcHRfcmVncyh0c2spKSkKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAocHRfcHNwKHRhc2tfcHRfcmVncyh0c2spKSkKKworLyogIEZyZWUgYWxsIHJlc291cmNlcyBoZWxkIGJ5IGEgdGhyZWFkOyBkZWZpbmVkIGluIHByb2Nlc3MuYyAgKi8KK2V4dGVybiB2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKTsKKworLyogR2V0IHdhaXQgY2hhbm5lbCBmb3IgdGFzayBQLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCisvKiAgVGhlIGZvbGxvd2luZyBzdHVmZiBpcyBwcmV0dHkgSEVYQUdPTiBzcGVjaWZpYy4gICovCisKKy8qICBUaGlzIGlzIHJlYWxseSBqdXN0IGhlcmUgZm9yIF9fc3dpdGNoX3RvLgorICAgIE9mZnNldHMgYXJlIHB1bGxlZCB2aWEgYXNtLW9mZnNldHMuYyAgKi8KKworLyoKKyAqIE5vIHJlYWwgcmVhc29uIHdoeSBWTSBhbmQgbmF0aXZlIHN3aXRjaCBzdGFja3Mgc2hvdWxkIGJlIGRpZmZlcmVudC4KKyAqIFVsdGltYXRlbHkgdGhpcyBzaG91bGQgbWVyZ2UuICBOb3RlIHRoYXQgUmV2IEMuIEFCSSBjYWxsZWQgb3V0IG9ubHkKKyAqIFIyNC0yNyBhcyBjYWxsZWUgc2F2ZWQgR1BScyBuZWVkaW5nIGV4cGxpY2l0IGF0dGVudGlvbiAoUjI5LTMxIGJlaW5nCisgKiBkZWFsdCB3aXRoIGF1dG9tYWdpY2FsbHkgYnkgYWxsb2NmcmFtZSksIGJ1dCB0aGUgY3VycmVudCBBQkkgaGFzCisgKiBtb3JlLCBSMTYtUjI3LiAgQnkgc2F2aW5nIG1vcmUsIHRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgd2Ugd2FzdGUgc29tZQorICogY3ljbGVzIGlmIGJ1aWxkaW5nIHdpdGggdGhlIG9sZCBjb21waWxlcnMuCisgKi8KKworc3RydWN0IGhleGFnb25fc3dpdGNoX3N0YWNrIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcJcjE3MTY7CisJdW5zaWduZWQgbG9uZyBsb25nCXIxOTE4OworCXVuc2lnbmVkIGxvbmcgbG9uZwlyMjEyMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJcjIzMjI7CisJdW5zaWduZWQgbG9uZyBsb25nCXIyNTI0OworCXVuc2lnbmVkIGxvbmcgbG9uZwlyMjcyNjsKKwl1bnNpZ25lZCBsb25nCQlmcDsKKwl1bnNpZ25lZCBsb25nCQlscjsKK307CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmY2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIFB0cmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1BUUkFDRV9ICisjZGVmaW5lIF9BU01fUFRSQUNFX0gKKworI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKworI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpIHB0X2VscihyZWdzKQorI2RlZmluZSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncykgKChyZWdzKS0+cjI5KQorCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQorCisvKiBrcHJvYmUtYmFzZWQgZXZlbnQgdHJhY2VyIHN1cHBvcnQgKi8KK2V4dGVybiBpbnQgcmVnc19xdWVyeV9yZWdpc3Rlcl9vZmZzZXQoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gY29uc3QgY2hhciAqcmVnc19xdWVyeV9yZWdpc3Rlcl9uYW1lKHVuc2lnbmVkIGludCBvZmZzZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9yZWdpc3RlcnMuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9yZWdpc3RlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ3NDFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9SRUdJU1RFUlNfSAorI2RlZmluZSBfQVNNX1JFR0lTVEVSU19ICisKKyNkZWZpbmUgU1AgcjI5CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qICBTZWUga2VybmVsL2VudHJ5LlMgZm9yIGZ1cnRoZXIgZG9jdW1lbnRhdGlvbi4gICovCisKKy8qCisgKiBFbnRyeSBjb2RlIGNvcGllcyB0aGUgZXZlbnQgcmVjb3JkIG91dCBvZiBndWVzdCByZWdpc3RlcnMgaW50bworICogdGhpcyBzdHJ1Y3R1cmUgKHdoaWNoIGlzIG9uIHRoZSBzdGFjaykuCisgKi8KKworc3RydWN0IGh2bV9ldmVudF9yZWNvcmQgeworCXVuc2lnbmVkIGxvbmcgdm1lbDsgICAgIC8qIEV2ZW50IExpbmthZ2UgKHJldHVybiBhZGRyZXNzKSAqLworCXVuc2lnbmVkIGxvbmcgdm1lc3Q7ICAgIC8qIEV2ZW50IGNvbnRleHQgLSBwcmUtZXZlbnQgU1NSIHZhbHVlcyAqLworCXVuc2lnbmVkIGxvbmcgdm1wc3A7ICAgIC8qIFByZXZpb3VzIHN0YWNrIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHZtYmFkdmE7ICAvKiBCYWQgdmlydHVhbCBhZGRyZXNzIGZvciBhZGRyZXNzaW5nIGV2ZW50cyAqLworfTsKKworc3RydWN0IHB0X3JlZ3MgeworCWxvbmcgcmVzdGFydF9yMDsgICAgICAgIC8qIFIwIGNoZWNrcG9pbnQgZm9yIHN5c2NhbGwgcmVzdGFydCAqLworCWxvbmcgc3lzY2FsbF9ucjsgICAgICAgIC8qIE9ubHkgdXNlZCBpbiBzeXN0ZW0gY2FsbHMgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHVzcjsKKwkJCXVuc2lnbmVkIGxvbmcgcHJlZHM7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcHJlZHN1c3I7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIG0wOworCQkJdW5zaWduZWQgbG9uZyBtMTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCBtMW0wOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyBzYTE7CisJCQl1bnNpZ25lZCBsb25nIGxjMTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCBsYzFzYTE7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHNhMDsKKwkJCXVuc2lnbmVkIGxvbmcgbGMwOworCQl9OworCQlsb25nIGxvbmcgaW50IGxjMHNhMDsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgZ3A7CisJCQl1bnNpZ25lZCBsb25nIHVncDsKKwkJfTsKKwkJbG9uZyBsb25nIGludCB1Z3BncDsKKwl9OworCS8qCisJKiBCZSBleHRyZW1lbHkgY2FyZWZ1bCB3aXRoIHJlYXJyYW5naW5nIHRoZXNlLCBpZiBhdCBhbGwuICBTb21lIGNvZGUKKwkqIGFzc3VtZXMgdGhlIDMyIHJlZ2lzdGVycyBleGlzdCBleGFjdGx5IGxpa2UgdGhpcyBpbiBtZW1vcnk7CisJKiBlLmcuIGtlcm5lbC9wdHJhY2UuYworCSogZS5nLiBrZXJuZWwvc2lnbmFsLmMgKHJlc3RvcmVfc2lnY29udGV4dCkKKwkqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjAwOworCQkJdW5zaWduZWQgbG9uZyByMDE7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjAxMDA7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIwMjsKKwkJCXVuc2lnbmVkIGxvbmcgcjAzOworCQl9OworCQlsb25nIGxvbmcgaW50IHIwMzAyOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMDQ7CisJCQl1bnNpZ25lZCBsb25nIHIwNTsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMDUwNDsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjA2OworCQkJdW5zaWduZWQgbG9uZyByMDc7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjA3MDY7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIwODsKKwkJCXVuc2lnbmVkIGxvbmcgcjA5OworCQl9OworCQlsb25nIGxvbmcgaW50IHIwOTA4OworCX07CisJdW5pb24geworCSAgICAgICBzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMTA7CisJCQl1bnNpZ25lZCBsb25nIHIxMTsKKwkgICAgICAgfTsKKwkgICAgICAgbG9uZyBsb25nIGludCByMTExMDsKKwl9OworCXVuaW9uIHsKKwkgICAgICAgc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjEyOworCQkJdW5zaWduZWQgbG9uZyByMTM7CisJICAgICAgIH07CisJICAgICAgIGxvbmcgbG9uZyBpbnQgcjEzMTI7CisJfTsKKwl1bmlvbiB7CisJICAgICAgIHN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIxNDsKKwkJCXVuc2lnbmVkIGxvbmcgcjE1OworCSAgICAgICB9OworCSAgICAgICBsb25nIGxvbmcgaW50IHIxNTE0OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMTY7CisJCQl1bnNpZ25lZCBsb25nIHIxNzsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMTcxNjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjE4OworCQkJdW5zaWduZWQgbG9uZyByMTk7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjE5MTg7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIyMDsKKwkJCXVuc2lnbmVkIGxvbmcgcjIxOworCQl9OworCQlsb25nIGxvbmcgaW50IHIyMTIwOworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMjI7CisJCQl1bnNpZ25lZCBsb25nIHIyMzsKKwkJfTsKKwkJbG9uZyBsb25nIGludCByMjMyMjsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjI0OworCQkJdW5zaWduZWQgbG9uZyByMjU7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjI1MjQ7CisJfTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIHIyNjsKKwkJCXVuc2lnbmVkIGxvbmcgcjI3OworCQl9OworCQlsb25nIGxvbmcgaW50IHIyNzI2OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZyByMjg7CisJCQl1bnNpZ25lZCBsb25nIHIyOTsKKwkgICAgICAgfTsKKwkgICAgICAgbG9uZyBsb25nIGludCByMjkyODsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgcjMwOworCQkJdW5zaWduZWQgbG9uZyByMzE7CisJCX07CisJCWxvbmcgbG9uZyBpbnQgcjMxMzA7CisJfTsKKwkvKiBWTSBkaXNwYXRjaCBwdXNoZXMgZXZlbnQgcmVjb3JkIG9udG8gc3RhY2sgLSB3ZSBjYW4gYnVpbGQgb24gaXQgKi8KKwlzdHJ1Y3QgaHZtX2V2ZW50X3JlY29yZCBodm1lcjsKK307CisKKy8qIERlZmluZXMgdG8gY29udmVuaWVudGx5IGFjY2VzcyB0aGUgdmFsdWVzICAqLworCisvKgorICogQXMgb2YgdGhlIFZNIHNwZWMgMC41LCB0aGVzZSByZWdpc3RlcnMgYXJlIG5vdyBzZXQvcmV0cmlldmVkIHZpYSBhCisgKiBWTSBjYWxsLiAgT24gdGhlIGluLWJvdW5kIHNpZGUsIHdlIGp1c3QgZmV0Y2ggdGhlIHZhbHVlcworICogYXQgdGhlIGVudHJ5IHBvaW50cyBhbmQgc3R1ZmYgdGhlbSBpbnRvIHRoZSBvbGQgcmVjb3JkIGluIHB0X3JlZ3MuCisgKiBIb3dldmVyLCBvbiB0aGUgb3V0Ym91bmQgc2lkZSwgcHJvYmFibHkgYXQgVk0gcnRlLCB3ZSBzZXQgdGhlCisgKiByZWdpc3RlcnMgYmFjay4KKyAqLworCisjZGVmaW5lIHB0X2VscihyZWdzKSAoKHJlZ3MpLT5odm1lci52bWVsKQorI2RlZmluZSBwdF9zZXRfZWxyKHJlZ3MsIHZhbCkgKChyZWdzKS0+aHZtZXIudm1lbCA9ICh2YWwpKQorI2RlZmluZSBwdF9jYXVzZShyZWdzKSAoKHJlZ3MpLT5odm1lci52bWVzdCAmIChIVk1fVk1FU1RfQ0FVU0VfTVNLKSkKKyNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpIFwKKwkoKChyZWdzKS0+aHZtZXIudm1lc3QgJiAoSFZNX1ZNRVNUX1VNX01TSyA8PCBIVk1fVk1FU1RfVU1fU0ZUKSkgIT0gMCkKKyNkZWZpbmUgaW50c19lbmFibGVkKHJlZ3MpIFwKKwkoKChyZWdzKS0+aHZtZXIudm1lc3QgJiAoSFZNX1ZNRVNUX0lFX01TSyA8PCBIVk1fVk1FU1RfSUVfU0ZUKSkgIT0gMCkKKyNkZWZpbmUgcHRfcHNwKHJlZ3MpICgocmVncyktPmh2bWVyLnZtcHNwKQorI2RlZmluZSBwdF9iYWR2YShyZWdzKSAoKHJlZ3MpLT5odm1lci52bWJhZHZhKQorCisjZGVmaW5lIHB0X3NldF9ydGVfc3AocmVncywgc3ApIGRvIHtcCisJcHRfcHNwKHJlZ3MpID0gKHNwKTtcCisJKHJlZ3MpLT5TUCA9ICh1bnNpZ25lZCBsb25nKSAmKChyZWdzKS0+aHZtZXIpO1wKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHB0X3NldF9rbW9kZShyZWdzKSBcCisJKHJlZ3MpLT5odm1lci52bWVzdCA9IChIVk1fVk1FU1RfSUVfTVNLIDw8IEhWTV9WTUVTVF9JRV9TRlQpCisKKyNkZWZpbmUgcHRfc2V0X3VzZXJtb2RlKHJlZ3MpIFwKKwkocmVncyktPmh2bWVyLnZtZXN0ID0gKEhWTV9WTUVTVF9VTV9NU0sgPDwgSFZNX1ZNRVNUX1VNX1NGVCkgXAorCQkJICAgIHwgKEhWTV9WTUVTVF9JRV9NU0sgPDwgSFZNX1ZNRVNUX0lFX1NGVCkKKworI2VuZGlmICAvKiAgaWZuZGVmIF9fQVNTRU1CTFkgICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc1NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9TRVRVUF9ICisjZGVmaW5lIF9BU01fU0VUVVBfSAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NldHVwLmg+CisKK2V4dGVybiBjaGFyIGV4dGVybmFsX2NtZGxpbmVfYnVmZmVyOworCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoX21lbW9yeSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NJR0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX1NJR0NPTlRFWFRfSAorCisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKworLyoKKyAqIFNpZ25hbCBjb250ZXh0IHN0cnVjdHVyZSAtIGNvbnRhaW5zIGFsbCBpbmZvIHRvIGRvIHdpdGggdGhlIHN0YXRlCisgKiBiZWZvcmUgdGhlIHNpZ25hbCBoYW5kbGVyIHdhcyBpbnZva2VkLiAgTm90ZTogb25seSBhZGQgbmV3IGVudHJpZXMKKyAqIHRvIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHNpZ2NvbnRleHQgeworCXN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHNjX3JlZ3M7Cit9IF9fYWxpZ25lZCg4KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxYzA1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NJR05BTF9ICisjZGVmaW5lIF9BU01fU0lHTkFMX0gKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19ydF9zaWd0cmFtcF90ZW1wbGF0ZVsyXTsKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M4NjlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBTTVAgZGVmaW5pdGlvbnMgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fU01QX0gKKyNkZWZpbmUgX19BU01fU01QX0gKKworI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKworI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKKworZW51bSBpcGlfbWVzc2FnZV90eXBlIHsKKwlJUElfTk9QID0gMCwKKwlJUElfUkVTQ0hFRFVMRSA9IDEsCisJSVBJX0NBTExfRlVOQywKKwlJUElfQ0FMTF9GVU5DX1NJTkdMRSwKKwlJUElfQ1BVX1NUT1AsCisJSVBJX1RJTUVSLAorfTsKKworZXh0ZXJuIHZvaWQgc2VuZF9pcGkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssIGVudW0gaXBpX21lc3NhZ2VfdHlwZSBtc2cpOworZXh0ZXJuIHZvaWQgc21wX3N0YXJ0X2NwdXModm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpKGludCBjcHUpOworZXh0ZXJuIHZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOworCitleHRlcm4gdm9pZCBzbXBfdm1fdW5tYXNrX2lycSh2b2lkICppbmZvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OGE5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIFNwaW5sb2NrIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU1BJTkxPQ0tfSAorI2RlZmluZSBfQVNNX1NQSU5MT0NLX0gKKworI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgorCisvKgorICogVGhpcyBmaWxlIGlzIHB1bGxlZCBpbiBmb3IgU01QIGJ1aWxkcy4KKyAqIFJlYWxseSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgYmFycmllciBzdHVmZiBmb3IgInRydWUiIFNNUAorICovCisKKy8qCisgKiBSZWFkIGxvY2tzOgorICogLSBsb2FkIHRoZSBsb2NrIHZhbHVlCisgKiAtIGluY3JlbWVudCBpdAorICogLSBpZiB0aGUgbG9jayB2YWx1ZSBpcyBzdGlsbCBuZWdhdGl2ZSwgZ28gYmFjayBhbmQgdHJ5IGFnYWluLgorICogLSB1bnN1Y2Nlc3NmdWwgc3RvcmUgaXMgdW5zdWNjZXNzZnVsLiAgR28gYmFjayBhbmQgdHJ5IGFnYWluLiAgTG9zZXIuCisgKiAtIHN1Y2Nlc3NmdWwgc3RvcmUgbmV3IGxvY2sgdmFsdWUgaWYgcG9zaXRpdmUgLT4gbG9jayBhY3F1aXJlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX2xvY2soYXJjaF9yd2xvY2tfdCAqbG9jaykKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIjE6CVI2ID0gbWVtd19sb2NrZWQoJTApO1xuIgorCQkiCXsgUDMgPSBjbXAuZ2UoUjYsIzApOyBSNiA9IGFkZChSNiwjMSk7fVxuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWI7IH1cbiIKKwkJIgltZW13X2xvY2tlZCglMCxQMykgPSBSNjtcbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFiOyB9XG4iCisJCToKKwkJOiAiciIgKCZsb2NrLT5sb2NrKQorCQk6ICJtZW1vcnkiLCAicjYiLCAicDMiCisJKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX3VubG9jayhhcmNoX3J3bG9ja190ICpsb2NrKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiMToJUjYgPSBtZW13X2xvY2tlZCglMCk7XG4iCisJCSIJUjYgPSBhZGQoUjYsIy0xKTtcbiIKKwkJIgltZW13X2xvY2tlZCglMCxQMykgPSBSNlxuIgorCQkiCWlmICFQMyBqdW1wIDFiO1xuIgorCQk6CisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7CisKK30KKworLyogIEkgdGhpbmsgdGhpcyByZXR1cm5zIDAgb24gZmFpbCwgMSBvbiBzdWNjZXNzLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfcmVhZF90cnlsb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCit7CisJaW50IHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJUjYgPSBtZW13X2xvY2tlZCglMSk7XG4iCisJCSIJeyAlMCA9ICMwOyBQMyA9IGNtcC5nZShSNiwjMCk7IFI2ID0gYWRkKFI2LCMxKTt9XG4iCisJCSIJeyBpZiAhUDMganVtcCAxZjsgfVxuIgorCQkiCW1lbXdfbG9ja2VkKCUxLFAzKSA9IFI2O1xuIgorCQkiCXsgJTAgPSBQMyB9XG4iCisJCSIxOlxuIgorCQk6ICI9JnIiICh0ZW1wKQorCQk6ICJyIiAoJmxvY2stPmxvY2spCisJCTogIm1lbW9yeSIsICJyNiIsICJwMyIKKwkpOworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcmNoX3JlYWRfY2FuX2xvY2soYXJjaF9yd2xvY2tfdCAqcndsb2NrKQoreworCXJldHVybiByd2xvY2stPmxvY2sgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXJjaF93cml0ZV9jYW5fbG9jayhhcmNoX3J3bG9ja190ICpyd2xvY2spCit7CisJcmV0dXJuIHJ3bG9jay0+bG9jayA9PSAwOworfQorCisvKiAgU3R1ZmZzIGEgLTEgaW4gdGhlIGxvY2sgdmFsdWU/ICAqLworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfd3JpdGVfbG9jayhhcmNoX3J3bG9ja190ICpsb2NrKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiMToJUjYgPSBtZW13X2xvY2tlZCglMClcbiIKKwkJIgl7IFAzID0gY21wLmVxKFI2LCMwKTsgIFI2ID0gIy0xO31cbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFiOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTAsUDMpID0gUjY7XG4iCisJCSIJeyBpZiAhUDMganVtcCAxYjsgfVxuIgorCQk6CisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgYXJjaF93cml0ZV90cnlsb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCit7CisJaW50IHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJUjYgPSBtZW13X2xvY2tlZCglMSlcbiIKKwkJIgl7ICUwID0gIzA7IFAzID0gY21wLmVxKFI2LCMwKTsgIFI2ID0gIy0xO31cbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFmOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDMpID0gUjY7XG4iCisJCSIJJTAgPSBQMztcbiIKKwkJIjE6XG4iCisJCTogIj0mciIgKHRlbXApCisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7CisJcmV0dXJuIHRlbXA7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfd3JpdGVfdW5sb2NrKGFyY2hfcndsb2NrX3QgKmxvY2spCit7CisJc21wX21iKCk7CisJbG9jay0+bG9jayA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3NwaW5fbG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIxOglSNiA9IG1lbXdfbG9ja2VkKCUwKTtcbiIKKwkJIglQMyA9IGNtcC5lcShSNiwjMCk7XG4iCisJCSIJeyBpZiAhUDMganVtcCAxYjsgUjYgPSAjMTsgfVxuIgorCQkiCW1lbXdfbG9ja2VkKCUwLFAzKSA9IFI2O1xuIgorCQkiCXsgaWYgIVAzIGp1bXAgMWI7IH1cbiIKKwkJOgorCQk6ICJyIiAoJmxvY2stPmxvY2spCisJCTogIm1lbW9yeSIsICJyNiIsICJwMyIKKwkpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3NwaW5fdW5sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlzbXBfbWIoKTsKKwlsb2NrLT5sb2NrID0gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXJjaF9zcGluX3RyeWxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQoreworCWludCB0ZW1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCVI2ID0gbWVtd19sb2NrZWQoJTEpO1xuIgorCQkiCVAzID0gY21wLmVxKFI2LCMwKTtcbiIKKwkJIgl7IGlmICFQMyBqdW1wIDFmOyBSNiA9ICMxOyAlMCA9ICMwOyB9XG4iCisJCSIJbWVtd19sb2NrZWQoJTEsUDMpID0gUjY7XG4iCisJCSIJJTAgPSBQMztcbiIKKwkJIjE6XG4iCisJCTogIj0mciIgKHRlbXApCisJCTogInIiICgmbG9jay0+bG9jaykKKwkJOiAibWVtb3J5IiwgInI2IiwgInAzIgorCSk7CisJcmV0dXJuIHRlbXA7Cit9CisKKy8qCisgKiBTTVAgc3BpbmxvY2tzIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBvbmx5IGEgc2luZ2xlIENQVSBhdCB0aGUgbG9jaworICovCisjZGVmaW5lIGFyY2hfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBhcmNoX3NwaW5fbG9jayhsb2NrKQorI2RlZmluZSBhcmNoX3NwaW5fdW5sb2NrX3dhaXQobG9jaykgXAorCWRvIHt3aGlsZSAoYXJjaF9zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGFyY2hfc3Bpbl9pc19sb2NrZWQoeCkgKCh4KS0+bG9jayAhPSAwKQorCisjZGVmaW5lIGFyY2hfcmVhZF9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBhcmNoX3JlYWRfbG9jayhsb2NrKQorI2RlZmluZSBhcmNoX3dyaXRlX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfd3JpdGVfbG9jayhsb2NrKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5MzdhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBTcGlubG9jayBzdXBwb3J0IGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fU1BJTkxPQ0tfVFlQRVNfSAorI2RlZmluZSBfQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IGFyY2hfc3BpbmxvY2tfdDsKKworI2RlZmluZSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gYXJjaF9yd2xvY2tfdDsKKworI2RlZmluZSBfX0FSQ0hfUldfTE9DS19VTkxPQ0tFRAkJeyAwIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3RyaW5nLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0ODljMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zdHJpbmcuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NUUklOR19IXworI2RlZmluZSBfQVNNX1NUUklOR19IXworCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DUFkKK2V4dGVybiB2b2lkICptZW1jcHkodm9pZCAqX190bywgX19jb25zdF9fIHZvaWQgKl9fZnJvbSwgc2l6ZV90IF9fbik7CisKKy8qICBUb0RvOiAgdXNlIGRjemVyb2EsIGFjY2VsZXJhdGUgdGhlIGNvbXBpbGVyLWNvbnN0YW50IHplcm8gY2FzZSAgKi8KKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0VUCitleHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKl9fdG8sIGludCBjLCBzaXplX3QgX19uKTsKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfQVNNX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N1c3BlbmQuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5ZGQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9TVVNQRU5EX0gKKyNkZWZpbmUgX0FTTV9TVVNQRU5EX0gKKworc3RhdGljIGlubGluZSBpbnQgYXJjaF9wcmVwYXJlX3N1c3BlbmQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWNmMGJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NXQUJfSAorI2RlZmluZSBfQVNNX1NXQUJfSAorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdkNjFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogU3lzY2FsbCBzdXBwb3J0IGZvciB0aGUgSGV4YWdvbiBhcmNoaXRlY3R1cmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fSEVYQUdPTl9TWVNDQUxMX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX1NZU0NBTExfSAorCit0eXBlZGVmIGxvbmcgKCpzeXNjYWxsX2ZuKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKK2FzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoY2hhciBfX3VzZXIgKnVmaWxlbmFtZSwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmFyZ3YsCisJCQkgIGNoYXIgX191c2VyICogX191c2VyICplbnZwKTsKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld3NwLAorCQkJIHVuc2lnbmVkIGxvbmcgcGFyZW50X3RpZHAsIHVuc2lnbmVkIGxvbmcgY2hpbGRfdGlkcCk7CisKKyNkZWZpbmUgc3lzX2V4ZWN2ZQlzeXNfZXhlY3ZlCisjZGVmaW5lIHN5c19jbG9uZQlzeXNfY2xvbmUKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N5c2NhbGxzLmg+CisKK2V4dGVybiB2b2lkICpzeXNfY2FsbF90YWJsZVtdOworCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfbnIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPnIwNjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCit7CisJQlVHX09OKGkgKyBuID4gNik7CisJbWVtY3B5KGFyZ3MsICYoJnJlZ3MtPnIwMClbaV0sIG4gKiBzaXplb2YoYXJnc1swXSkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzZWQxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIFN5c3RlbSBsZXZlbCBkZWZpbml0aW9ucyBmb3IgdGhlIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1NZU1RFTV9ICisjZGVmaW5lIF9BU01fU1lTVEVNX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCitzdHJ1Y3QgdGhyZWFkX3N0cnVjdDsKKworZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICosCisJc3RydWN0IHRhc2tfc3RydWN0ICosCisJc3RydWN0IHRhc2tfc3RydWN0ICopOworCisjZGVmaW5lIHN3aXRjaF90byhwLCBuLCByKSBkbyB7XAorCXIgPSBfX3N3aXRjaF90bygocCksIChuKSwgKHIpKTtcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgcm1iKCkJCQkJYmFycmllcigpCisjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJCWJhcnJpZXIoKQorI2RlZmluZSB3bWIoKQkJCQliYXJyaWVyKCkKKyNkZWZpbmUgbWIoKQkJCQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JtYigpCQkJYmFycmllcigpCisjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfd21iKCkJCQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iKCkJCQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKworLyoKKyAqIF9feGNoZyAtIGF0b21pY2FsbHkgZXhjaGFuZ2UgYSByZWdpc3RlciBhbmQgYSBtZW1vcnkgbG9jYXRpb24KKyAqIEB4OiB2YWx1ZSB0byBzd2FwCisgKiBAcHRyOiBwb2ludGVyIHRvIG1lbW9yeQorICogQHNpemU6ICBzaXplIG9mIHRoZSB2YWx1ZQorICoKKyAqIE9ubHkgNCBieXRlcyBzdXBwb3J0ZWQgY3VycmVudGx5LgorICoKKyAqIE5vdGU6ICB0aGVyZSB3YXMgYW4gZXJyYXRhIGZvciBWMiBhYm91dCAubmV3J3MgYW5kIG1lbXdfbG9ja2VkLgorICoKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkgICBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKworCS8qICBDYW4ndCBzZWVtIHRvIHVzZSBwcmludGsgb3IgcGFuaWMgaGVyZSwgc28ganVzdCBzdG9wICAqLworCWlmIChzaXplICE9IDQpIGRvIHsgYXNtIHZvbGF0aWxlKCJicmtwdDtcbiIpOyB9IHdoaWxlICgxKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiMToJJTAgPSBtZW13X2xvY2tlZCglMSk7XG4iICAgIC8qICBsb2FkIGludG8gcmV0dmFsICovCisJIgltZW13X2xvY2tlZCglMSxQMCkgPSAlMjtcbiIgLyogIHN0b3JlIGludG8gbWVtb3J5ICovCisJIglpZiAhUDAganVtcCAxYjtcbiIKKwk6ICI9JnIiIChyZXR2YWwpCisJOiAiciIgKHB0ciksICJyIiAoeCkKKwk6ICJtZW1vcnkiLCAicDAiCisJKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogQXRvbWljYWxseSBzd2FwIHRoZSBjb250ZW50cyBvZiBhIHJlZ2lzdGVyIHdpdGggbWVtb3J5LiAgU2hvdWxkIGJlIGF0b21pYworICogYmV0d2VlbiBtdWx0aXBsZSBDUFUncyBhbmQgd2l0aGluIGludGVycnVwdHMgb24gdGhlIHNhbWUgQ1BVLgorICovCisjZGVmaW5lIHhjaGcocHRyLCB2KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHYpLCAocHRyKSwgXAorCXNpemVvZigqKHB0cikpKSkKKworLyogIFNldCBhIHZhbHVlIGFuZCB1c2UgYSBtZW1vcnkgYmFycmllci4gIFVzZWQgYnkgdGhlIHNjaGVkdWxlciBzb21ld2hlcmUuICAqLworI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgXAorCWRvIHsgdmFyID0gdmFsdWU7IG1iKCk7IH0gd2hpbGUgKDApCisKKy8qCisgKiAgc2VlIHJ0LW11dGV4LWRlc2lnbi50eHQ7IGNtcHhjaGcgc3VwcG9zZWRseSBjaGVja3MgaWYgKnB0ciA9PSBBIGFuZCBzd2Fwcy4KKyAqICBsb29rcyBqdXN0IGxpa2UgYXRvbWljX2NtcHhjaGcgb24gb3VyIGFyY2ggY3VycmVudGx5IHdpdGggYSBidW5jaCBvZgorICogIHZhcmlhYmxlIGNhc3RpbmcuCisgKi8KKyNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCisKKyNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAorKHsJCQkJCQkJCVwKKwlfX3R5cGVvZl9fKHB0cikgX19wdHIgPSAocHRyKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZCA9IChvbGQpOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19uZXcgPSAobmV3KTsJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fb2xkdmFsID0gMDsJCQlcCisJCQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoCQkJCQkJXAorCQkiMToJJTAgPSBtZW13X2xvY2tlZCglMSk7XG4iCQlcCisJCSIJeyBQMCA9IGNtcC5lcSglMCwlMik7XG4iCQlcCisJCSIJICBpZiAoIVAwLm5ldykganVtcDpudCAyZjsgfVxuIgkJXAorCQkiCW1lbXdfbG9ja2VkKCUxLHAwKSA9ICUzO1xuIgkJXAorCQkiCWlmICghUDApIGp1bXAgMWI7XG4iCQkJXAorCQkiMjpcbiIJCQkJCQlcCisJCTogIj0mciIgKF9fb2xkdmFsKQkJCQlcCisJCTogInIiIChfX3B0ciksICJyIiAoX19vbGQpLCAiciIgKF9fbmV3KQkJXAorCQk6ICJtZW1vcnkiLCAicDAiCQkJCVwKKwkpOwkJCQkJCQlcCisJX19vbGR2YWw7CQkJCQkJXAorfSkKKworLyogIFNob3VsZCBwcm9iYWJseSBzaG9vdCBmb3IgYW4gOC1ieXRlIGFsaWduZWQgc3RhY2sgcG9pbnRlciAgKi8KKyNkZWZpbmUgU1RBQ0tfTUFTSyAofjcpCisjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHggJiBTVEFDS19NQVNLKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyOTM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogVGhyZWFkIHN1cHBvcnQgZm9yIHRoZSBIZXhhZ29uIGFyY2hpdGVjdHVyZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9USFJFQURfSU5GT19ICisjZGVmaW5lIF9BU01fVEhSRUFEX0lORk9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNlbmRpZgorCisjZGVmaW5lIFRIUkVBRF9TSElGVAkJMTIKKyNkZWZpbmUgVEhSRUFEX1NJWkUJCSgxPDxUSFJFQURfU0hJRlQpCisKKyNpZiBUSFJFQURfU0hJRlQgPj0gUEFHRV9TSElGVAorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkoVEhSRUFEX1NISUZUIC0gUEFHRV9TSElGVCkKKyNlbHNlICAvKiAgZG9uJ3QgdXNlIHN0YW5kYXJkIGFsbG9jYXRvciAgKi8KKyNkZWZpbmUgX19IQVZFX0FSQ0hfVEhSRUFEX0lORk9fQUxMT0NBVE9SCitleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mb19ub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgbm9kZSk7CitleHRlcm4gdm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpOworI2VuZGlmCisKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgc2VnOworfSBtbV9zZWdtZW50X3Q7CisKKy8qCisgKiBUaGlzIGlzIHVuaW9uJ2Qgd2l0aCB0aGUgImJvdHRvbSIgb2YgdGhlIGtlcm5lbCBzdGFjay4KKyAqIEl0IGtlZXBzIHRyYWNrIG9mIHRocmVhZCBpbmZvIHdoaWNoIGlzIGhhbmR5IGZvciByb3V0aW5lcworICogdG8gYWNjZXNzIHF1aWNrbHkuCisgKi8KKworc3RydWN0IHRocmVhZF9pbmZvIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCisJc3RydWN0IGV4ZWNfZG9tYWluICAgICAgKmV4ZWNfZG9tYWluOyAgIC8qIGV4ZWN1dGlvbiBkb21haW4gKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsgICAgICAgICAgLyogbG93IGxldmVsIGZsYWdzICovCisJX191MzIgICAgICAgICAgICAgICAgICAgY3B1OyAgICAgICAgICAgIC8qIGN1cnJlbnQgY3B1ICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdF9jb3VudDsgIC8qIDA9PnByZWVtcHRpYmxlLDwwPT5CVUcgKi8KKwltbV9zZWdtZW50X3QgICAgICAgICAgICBhZGRyX2xpbWl0OyAgICAgLyogc2VnbWVudGF0aW9uIHN1eCAqLworCS8qCisJICogdXNlZCBmb3Igc3lzY2FsbHMgc29tZWhvdzsKKwkgKiBzZWVtcyB0byBoYXZlIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgZm91ciBhcmd1bWVudHMKKwkgKi8KKwlzdHJ1Y3QgcmVzdGFydF9ibG9jayAgICByZXN0YXJ0X2Jsb2NrOworCS8qIFBvaW50cyB0byB0aGUgY3VycmVudCBwdF9yZWdzIGZyYW1lICAqLworCXN0cnVjdCBwdF9yZWdzCQkqcmVnczsKKwkvKgorCSAqIHNhdmVkIGtlcm5lbCBzcCBhdCBzd2l0Y2hfdG8gdGltZTsKKwkgKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHVzZWQgKGl0J3Mgbm90IGluIHRoZSBWTSBtb2RlbCBpdCBzZWVtczsKKwkgKiBzZWUgdGhyZWFkX3N0cnVjdCkKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlzcDsKK307CisKKyNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisjZW5kaWYgIC8qIF9fQVNTRU1CTFlfXyAgKi8KKworLyogIGxvb2tzIGxpa2UgImxpbnV4L2hhcmRpcnEuaCIgdXNlcyB0aGlzLiAgKi8KKworI2RlZmluZSBQUkVFTVBUX0FDVElWRQkJMHgxMDAwMDAwMAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLnRhc2sgICAgICAgICAgID0gJnRzaywgICAgICAgICAgICAgICAgIFwKKwkuZXhlY19kb21haW4gICAgPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwgXAorCS5mbGFncyAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICBcCisJLmNwdSAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgIFwKKwkucHJlZW1wdF9jb3VudCAgPSAxLCAgICAgICAgICAgICAgICAgICAgXAorCS5hZGRyX2xpbWl0ICAgICA9IEtFUk5FTF9EUywgICAgICAgICAgICBcCisJLnJlc3RhcnRfYmxvY2sgPSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsLCAgICBcCisJfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkuc3AgPSAwLAkJCQlcCisJLnJlZ3MgPSBOVUxMLAkJCVwKK30KKworI2RlZmluZSBpbml0X3RocmVhZF9pbmZvICAgICAgICAoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCisjZGVmaW5lIGluaXRfc3RhY2sgICAgICAgICAgICAgIChpbml0X3RocmVhZF91bmlvbi5zdGFjaykKKworLyogVGFja3kgcHJlcHJvY2Vzc29yIHRyaWNrZXJ5ICovCisjZGVmaW5lCXFxc3RyKHMpIHFzdHIocykKKyNkZWZpbmUgcXN0cihzKSAjcworI2RlZmluZSBRVU9URURfVEhSRUFESU5GT19SRUcgcXFzdHIoVEhSRUFESU5GT19SRUcpCisKK3JlZ2lzdGVyIHN0cnVjdCB0aHJlYWRfaW5mbyAqX19jdXJyZW50X3RocmVhZF9pbmZvIGFzbShRVU9URURfVEhSRUFESU5GT19SRUcpOworI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkgIF9fY3VycmVudF90aHJlYWRfaW5mbworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiB0aHJlYWQgaW5mb3JtYXRpb24gZmxhZ3MKKyAqIC0gdGhlc2UgYXJlIHByb2Nlc3Mgc3RhdGUgZmxhZ3MgdGhhdCB2YXJpb3VzIGFzc2VtYmx5IGZpbGVzCisgKiAgIG1heSBuZWVkIHRvIGFjY2VzcworICogLSBwZW5kaW5nIHdvcmstdG8tYmUtZG9uZSBmbGFncyBhcmUgaW4gTFNXCisgKiAtIG90aGVyIGZsYWdzIGluIE1TVworICovCisKKyNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UgICAgICAgMCAgICAgICAvKiBzeXNjYWxsIHRyYWNlIGFjdGl2ZSAqLworI2RlZmluZSBUSUZfTk9USUZZX1JFU1VNRSAgICAgICAxICAgICAgIC8qIHJlc3VtcHRpb24gbm90aWZpY2F0aW9uIHJlcXVlc3RlZCAqLworI2RlZmluZSBUSUZfU0lHUEVORElORyAgICAgICAgICAyICAgICAgIC8qIHNpZ25hbCBwZW5kaW5nICovCisjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQgICAgICAgIDMgICAgICAgLyogcmVzY2hlZHVsaW5nIG5lY2Vzc2FyeSAqLworI2RlZmluZSBUSUZfU0lOR0xFU1RFUCAgICAgICAgICA0ICAgICAgIC8qIHJlc3RvcmUgc3MgQCByZXR1cm4gdG8gdXNyIG1vZGUgKi8KKyNkZWZpbmUgVElGX0lSRVQgICAgICAgICAgICAgICAgNSAgICAgICAvKiByZXR1cm4gd2l0aCBpcmV0ICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sgICAgIDYgICAgICAgLyogcmVzdG9yZSBzaWcgbWFzayBpbiBkb19zaWduYWwoKSAqLworLyogdHJ1ZSBpZiBwb2xsX2lkbGUoKSBpcyBwb2xsaW5nIFRJRl9ORUVEX1JFU0NIRUQgKi8KKyNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHICAgICAgMTYKKyNkZWZpbmUgVElGX01FTURJRSAgICAgICAgICAgICAgMTcgICAgICAvKiBPT00ga2lsbGVyIGtpbGxlZCBwcm9jZXNzICovCisKKyNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFICAgICAgKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCisjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRSAgICAgICgxIDw8IFRJRl9OT1RJRllfUkVTVU1FKQorI2RlZmluZSBfVElGX1NJR1BFTkRJTkcgICAgICAgICAoMSA8PCBUSUZfU0lHUEVORElORykKKyNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQgICAgICAgKDEgPDwgVElGX05FRURfUkVTQ0hFRCkKKyNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQICAgICAgICAgKDEgPDwgVElGX1NJTkdMRVNURVApCisjZGVmaW5lIF9USUZfSVJFVCAgICAgICAgICAgICAgICgxIDw8IFRJRl9JUkVUKQorI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSyAgICAoMSA8PCBUSUZfUkVTVE9SRV9TSUdNQVNLKQorI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHICAgICAoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCisKKy8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gLSBBbGwgYnV0IFRJRl9TWVNDQUxMX1RSQUNFICovCisjZGVmaW5lIF9USUZfV09SS19NQVNLICAgICAgICAgICgweDAwMDBGRkZGICYgfl9USUZfU1lTQ0FMTF9UUkFDRSkKKworLyogd29yayB0byBkbyBvbiBhbnkgcmV0dXJuIHRvIHUtc3BhY2UgKi8KKyNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sgICAgICAgMHgwMDAwRkZGRgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1lLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEFTTV9USU1FX0gKKyNkZWZpbmUgQVNNX1RJTUVfSAorCitleHRlcm4gY3ljbGVzX3QgICAgICAgIHBjeWNsZV9mcmVxX21oejsKK2V4dGVybiBjeWNsZXNfdCAgICAgICAgdGhyZWFkX2ZyZXFfbWh6OworZXh0ZXJuIGN5Y2xlc190ICAgICAgICBzbGVlcF9jbGtfZnJlcTsKKwordm9pZCBzZXR1cF9wZXJjcHVfY2xvY2tkZXYodm9pZCk7Cit2b2lkIGlwaV90aW1lcih2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZXItcmVncy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RpbWVyLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODBkYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RpbWVyLXJlZ3MuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogVGltZXIgc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9USU1FUl9SRUdTX0gKKyNkZWZpbmUgX0FTTV9USU1FUl9SRUdTX0gKKworLyogIFRoaXMgc3R1ZmYgc2hvdWxkIGdvIGludG8gYSBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlICAqLworI2RlZmluZSBUQ1gwX0NMS19SQVRFCQkxOTIwMAorI2RlZmluZSBUSU1FUl9FTkFCTEUJCTAKKyNkZWZpbmUgVElNRVJfQ0xSX09OX01BVENICTEKKworLyoKKyAqIDh4NTAgSEREIFNwZWNzIDUtOC4gIFNpbXVsYXRvciBjby1zaW0gbm90IGZpeGVkIHVudGlsCisgKiByZWxlYXNlIDEuMSwgYW5kIHRoZW4gaXQncyAiYWRqdXN0YWJsZSIgYW5kIHByb2JhYmx5IG5vdCBkZWZhdWx0ZWQuCisgKi8KKyNkZWZpbmUgUlRPU19USU1FUl9JTlQJCTMKKyNpZmRlZiBDT05GSUdfSEVYQUdPTl9DT01FVAorI2RlZmluZSBSVE9TX1RJTUVSX1JFR1NfQUREUgkweEFCMDAwMDAwVUwKKyNlbmRpZgorI2RlZmluZSBTTEVFUF9DTEtfUkFURQkJMzIwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZXguaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWM2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGltZXguaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1RJTUVYX0gKKyNkZWZpbmUgX0FTTV9USU1FWF9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90aW1leC5oPgorI2luY2x1ZGUgPGFzbS90aW1lci1yZWdzLmg+CisKKy8qIFVzaW5nIFRDWDAgYXMgb3VyIGNsb2NrLiAgQ0xPQ0tfVElDS19SQVRFIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkLiAqLworI2RlZmluZSBDTE9DS19USUNLX1JBVEUgICAgICAgICAgICAgIFRDWDBfQ0xLX1JBVEUKKworI2RlZmluZSBBUkNIX0hBU19SRUFEX0NVUlJFTlRfVElNRVIKKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9jdXJyZW50X3RpbWVyKHVuc2lnbmVkIGxvbmcgKnRpbWVyX3ZhbCkKK3sKKwkqdGltZXJfdmFsID0gKHVuc2lnbmVkIGxvbmcpIF9fdm1nZXR0aW1lKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RsYi5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RsYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2FiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdGxiLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9UTEJfSAorI2RlZmluZSBfQVNNX1RMQl9ICisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKy8qCisgKiBXZSBkb24ndCBuZWVkIGFueSBzcGVjaWFsIHBlci1wdGUgb3IgcGVyLXZtYSBoYW5kbGluZy4uLgorICovCisjZGVmaW5lIHRsYl9zdGFydF92bWEodGxiLCB2bWEpCQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdGxiX2VuZF92bWEodGxiLCB2bWEpCQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX190bGJfcmVtb3ZlX3RsYl9lbnRyeSh0bGIsIHB0ZXAsIGFkZHJlc3MpCWRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIC4uIGJlY2F1c2Ugd2UgZmx1c2ggdGhlIHdob2xlIG1tIHdoZW4gaXQgZmlsbHMgdXAKKyAqLworI2RlZmluZSB0bGJfZmx1c2godGxiKQkJZmx1c2hfdGxiX21tKCh0bGIpLT5tbSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RsYi5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5YTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBUTEIgZmx1c2ggc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9UTEJGTFVTSF9ICisjZGVmaW5lIF9BU01fVExCRkxVU0hfSAorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBUTEIgZmx1c2hpbmcgLS0gaW4gIlNNUCIsIHRoZXNlIHJvdXRpbmVzIGdldCBkZWZpbmVkIHRvIGJlIHRoZQorICogb25lcyBmcm9tIHNtcC5jLCBlbHNlIHRoZXkgYXJlIHNvbWUgbG9jYWwgZmxhdm9ycy4KKyAqLworCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBjb21tb25seSBtYWNyb3MsIGJ1dCBpbiB0aGUgaW50ZXJlc3RzIG9mCisgKiBWTSB2cy4gbmF0aXZlIGltcGxlbWVudGF0aW9uIGFuZCBjb2RlIHNpemUsIHdlIHNpbXBseSBkZWNsYXJlCisgKiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyBoZXJlLgorICovCitleHRlcm4gdm9pZCB0bGJfZmx1c2hfYWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqICJUaGlzIGlzIGNhbGxlZCBpbiBtdW5tYXAgd2hlbiB3ZSBoYXZlIGZyZWVkIHVwIHNvbWUgcGFnZS10YWJsZSBwYWdlcy4KKyAqIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4uLiIKKyAqCisgKiBUaGUgVk0ga2VybmVsIGRvZXNuJ3Qgd2FsayBwYWdlIHRhYmxlcywgYW5kIHRoZXkgYXJlIHBhc3NlZCB0byB0aGUgVk1NCisgKiBieSBsb2dpY2FsIGFkZHJlc3MuIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgcG9zc2liaWxpdHkgdGhhdCB0aGV5CisgKiBjb3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBWTSBrZXJuZWwgYmFzZWQgb24gYSBzdGFsZSBtYXBwaW5nLCBzaW5jZQorICogdGhleSB3b3VsZCBvbmx5IGJlIGxvY2F0ZWQgYnkgY29uc3VsdGluZyB0aGUgbW0gc3RydWN0dXJlLCBhbmQgdGhleQorICogd2lsbCBoYXZlIGJlZW4gcHVyZ2VkIGZyb20gdGhhdCBzdHJ1Y3R1cmUgYnkgdGhlIG11bm1hcC4gIFNlZW1zIGxpa2UKKyAqIGEgbm9vcCBvbiBIVk0gYXMgd2VsbC4KKyAqLworI2RlZmluZSBmbHVzaF90bGJfcGd0YWJsZXMobW0sIHN0YXJ0LCBlbmQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdHJhcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQwN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFRyYXAgc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9IRVhBR09OX1RSQVBTX0gKKyNkZWZpbmUgX0FTTV9IRVhBR09OX1RSQVBTX0gKKworI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKworZXh0ZXJuIGludCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpOworZXh0ZXJuIGludCBkaWVfaWZfa2VybmVsKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKTsKKworI2VuZGlmIC8qIF9BU01fSEVYQUdPTl9UUkFQU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTcwNmVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFVzZXIgbWVtb3J5IGFjY2VzcyBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBfQVNNX1VBQ0NFU1NfSAorI2RlZmluZSBfQVNNX1VBQ0NFU1NfSAorLyoKKyAqIFVzZXIgc3BhY2UgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCisvKgorICogYWNjZXNzX29rOiAtIENoZWNrcyBpZiBhIHVzZXIgc3BhY2UgcG9pbnRlciBpcyB2YWxpZAorICogQHR5cGU6IFR5cGUgb2YgYWNjZXNzOiAlVkVSSUZZX1JFQUQgb3IgJVZFUklGWV9XUklURS4gIE5vdGUgdGhhdAorICogICAgICAgICVWRVJJRllfV1JJVEUgaXMgYSBzdXBlcnNldCBvZiAlVkVSSUZZX1JFQUQgLSBpZiBpdCBpcyBzYWZlCisgKiAgICAgICAgdG8gd3JpdGUgdG8gYSBibG9jaywgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcmVhZCBmcm9tIGl0LgorICogQGFkZHI6IFVzZXIgc3BhY2UgcG9pbnRlciB0byBzdGFydCBvZiBibG9jayB0byBjaGVjaworICogQHNpemU6IFNpemUgb2YgYmxvY2sgdG8gY2hlY2sKKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENoZWNrcyBpZiBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSBpcyB2YWxpZC4KKyAqCisgKiBSZXR1cm5zIHRydWUgKG5vbnplcm8pIGlmIHRoZSBtZW1vcnkgYmxvY2sgKm1heSogYmUgdmFsaWQsIGZhbHNlICh6ZXJvKQorICogaWYgaXQgaXMgZGVmaW5pdGVseSBpbnZhbGlkLgorICoKKyAqIFVzZXIgYWRkcmVzcyBzcGFjZSBpbiBIZXhhZ29uLCBsaWtlIHg4NiwgZ29lcyB0byAweGJmZmZmZmZmLCBzbyB0aGUKKyAqIHNpbXBsZSBNU0ItYmFzZWQgdGVzdHMgdXNlZCBieSBNSVBTIHdvbid0IHdvcmsuICBTb21lIGZ1cnRoZXIKKyAqIG9wdGltaXphdGlvbiBpcyBwcm9iYWJseSBwb3NzaWJsZSBoZXJlLCBidXQgZm9yIG5vdywga2VlcCBpdAorICogcmVhc29uYWJseSBzaW1wbGUgYW5kIG5vdCAqdG9vKiBzbG93LiAgQWZ0ZXIgYWxsLCB3ZSd2ZSBnb3QgdGhlCisgKiBNTVUgZm9yIGJhY2t1cC4KKyAqLworI2RlZmluZSBWRVJJRllfUkVBRCAgICAgMAorI2RlZmluZSBWRVJJRllfV1JJVEUgICAgMQorCisjZGVmaW5lIF9fYWNjZXNzX29rKGFkZHIsIHNpemUpIFwKKwkoKGdldF9mcygpLnNlZyA9PSBLRVJORUxfRFMuc2VnKSB8fCBcCisJKCgodW5zaWduZWQgbG9uZylhZGRyIDwgZ2V0X2ZzKCkuc2VnKSAmJiBcCisJICAodW5zaWduZWQgbG9uZylzaXplIDwgKGdldF9mcygpLnNlZyAtICh1bnNpZ25lZCBsb25nKWFkZHIpKSkKKworLyoKKyAqIFdoZW4gYSBrZXJuZWwtbW9kZSBwYWdlIGZhdWx0IGlzIHRha2VuLCB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KKyAqIGFkZHJlc3MgaXMgY2hlY2tlZCBhZ2FpbnN0IGEgdGFibGUgb2YgZXhjZXB0aW9uX3RhYmxlX2VudHJpZXMuCisgKiBFYWNoIGVudHJ5IGlzIGEgdHVwbGUgb2YgdGhlIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtYXkKKyAqIGJlIGF1dGhvcml6ZWQgdG8gZmF1bHQsIGFuZCB0aGUgYWRkcmVzcyBhdCB3aGljaCBleGVjdXRpb24gc2hvdWxkCisgKiBiZSByZXN1bWVkIGluc3RlYWQgb2YgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLCBzbyBhcyB0byBlZmZlY3QKKyAqIGEgd29ya2Fyb3VuZC4KKyAqLworCisvKiAgQXNzZW1ibHkgc29tZXdoYXQgb3B0aW1pemVkIGNvcHkgcm91dGluZXMgICovCit1bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXJfaGV4YWdvbih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG4pOwordW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcl9oZXhhZ29uKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG4pOworCisjZGVmaW5lIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pIF9fY29weV9mcm9tX3VzZXJfaGV4YWdvbih0bywgZnJvbSwgbikKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIF9fY29weV90b191c2VyX2hleGFnb24odG8sIGZyb20sIG4pCisKKy8qCisgKiBYWFggdG9kbzogc29tZSBhZGRpdG9uYWwgcGVyZm9ybWFuY2UgZ2FpbiBpcyBwb3NzaWJsZSBieQorICogaW1wbGVtZW50aW5nIF9fY29weV90by9mcm9tX3VzZXJfaW5hdG9taWMsIHdoaWNoIGlzIG11Y2gKKyAqIGxpa2UgX19jb3B5X3RvL2Zyb21fdXNlciwgYnV0IHBlcmZvcm1zIHNsaWdodGx5IGxlc3MgY2hlY2tpbmcuCisgKi8KKworX19rZXJuZWxfc2l6ZV90IF9fY2xlYXJfdXNlcl9oZXhhZ29uKHZvaWQgX191c2VyICpkZXN0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKKyNkZWZpbmUgX19jbGVhcl91c2VyKGEsIHMpIF9fY2xlYXJfdXNlcl9oZXhhZ29uKChhKSwgKHMpKQorCisjZGVmaW5lIF9fc3RybmNweV9mcm9tX3VzZXIoZHN0LCBzcmMsIG4pIGhleGFnb25fc3RybmNweV9mcm9tX3VzZXIoZHN0LCBzcmMsIG4pCisKKy8qICBnZXQgYXJvdW5kIHRoZSBpZm5kZWYgaW4gYXNtLWdlbmVyaWMvdWFjY2Vzcy5oICAqLworI2RlZmluZSBfX3N0cm5sZW5fdXNlciBfX3N0cm5sZW5fdXNlcgorCitleHRlcm4gbG9uZyBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIG4pOworCitzdGF0aWMgaW5saW5lIGxvbmcgaGV4YWdvbl9zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsCisJCQkJCSAgICAgbG9uZyBuKTsKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3VhY2Nlc3MuaD4KKworLyogIFRvZG86ICBhbiBhY3R1YWwgYWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiB0aGlzLiAgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBoZXhhZ29uX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKKwkJCQkJICAgICBsb25nIG4pCit7CisJbG9uZyByZXMgPSBfX3N0cm5sZW5fdXNlcihzcmMsIG4pOworCisJLyogcmV0dXJuIGZyb20gc3RybmxlbiBjYW4ndCBiZSB6ZXJvIC0tIHRoYXQgd291bGQgYmUgcnViYmlzaC4gKi8KKworCWlmIChyZXMgPiBuKSB7CisJCWNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBuKTsKKwkJcmV0dXJuIG47CisJfSBlbHNlIHsKKwkJY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIHJlcyk7CisJCXJldHVybiByZXMtMTsKKwl9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFN5c2NhbGwgc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZiAhZGVmaW5lZChfQVNNX0hFWEFHT05fVU5JU1REX0gpIHx8IGRlZmluZWQoX19TWVNDQUxMKQorI2RlZmluZSBfQVNNX0hFWEFHT05fVU5JU1REX0gKKworLyoKKyAqICBUaGUga2VybmVsIHB1bGxzIHRoaXMgdW5pc3RkLmggaW4gdGhyZWUgZGlmZmVyZW50IHdheXM6CisgKiAgMS4gIHRoZSAibm9ybWFsIiB3YXkgd2hpY2ggZ2V0cyBhbGwgdGhlIF9fTlIgZGVmaW5lcworICogIDIuICB3aXRoIF9fU1lTQ0FMTCBkZWZpbmVkIHRvIHByb2R1Y2UgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKiAgMy4gIHdpdGggX19TWVNDQUxMIGRlZmluZWQgdG8gcHJvZHVjZSBzeXNjYWxsIHRhYmxlIGluaXRpYWxpemF0aW9uCisgKiAgU2VlIGFsc286ICBzeXNjYWxsdGFiLmMKKyAqLworCisjZGVmaW5lIHN5c19tbWFwMiBzeXNfbW1hcF9wZ29mZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdW5pc3RkLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VzZXIuaCBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1NTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91c2VyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgSEVYQUdPTl9BU01fVVNFUl9ICisjZGVmaW5lIEhFWEFHT05fQVNNX1VTRVJfSAorCisvKgorICogTGF5b3V0IGZvciByZWdpc3RlcnMgcGFzc2VkIGluIGVsZiBjb3JlIGR1bXBzIHRvIHVzZXJzcGFjZS4KKyAqCisgKiBCYXNpY2FsbHkgYSByZWFycmFuZ2VkIHN1YnNldCBvZiAicHRfcmVncyIuCisgKgorICogSW50ZXJlc3RlZCBwYXJ0aWVzOiAgbGliYywgZ2RiLi4uCisgKi8KKworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgcjA7CisJdW5zaWduZWQgbG9uZyByMTsKKwl1bnNpZ25lZCBsb25nIHIyOworCXVuc2lnbmVkIGxvbmcgcjM7CisJdW5zaWduZWQgbG9uZyByNDsKKwl1bnNpZ25lZCBsb25nIHI1OworCXVuc2lnbmVkIGxvbmcgcjY7CisJdW5zaWduZWQgbG9uZyByNzsKKwl1bnNpZ25lZCBsb25nIHI4OworCXVuc2lnbmVkIGxvbmcgcjk7CisJdW5zaWduZWQgbG9uZyByMTA7CisJdW5zaWduZWQgbG9uZyByMTE7CisJdW5zaWduZWQgbG9uZyByMTI7CisJdW5zaWduZWQgbG9uZyByMTM7CisJdW5zaWduZWQgbG9uZyByMTQ7CisJdW5zaWduZWQgbG9uZyByMTU7CisJdW5zaWduZWQgbG9uZyByMTY7CisJdW5zaWduZWQgbG9uZyByMTc7CisJdW5zaWduZWQgbG9uZyByMTg7CisJdW5zaWduZWQgbG9uZyByMTk7CisJdW5zaWduZWQgbG9uZyByMjA7CisJdW5zaWduZWQgbG9uZyByMjE7CisJdW5zaWduZWQgbG9uZyByMjI7CisJdW5zaWduZWQgbG9uZyByMjM7CisJdW5zaWduZWQgbG9uZyByMjQ7CisJdW5zaWduZWQgbG9uZyByMjU7CisJdW5zaWduZWQgbG9uZyByMjY7CisJdW5zaWduZWQgbG9uZyByMjc7CisJdW5zaWduZWQgbG9uZyByMjg7CisJdW5zaWduZWQgbG9uZyByMjk7CisJdW5zaWduZWQgbG9uZyByMzA7CisJdW5zaWduZWQgbG9uZyByMzE7CisJdW5zaWduZWQgbG9uZyBzYTA7CisJdW5zaWduZWQgbG9uZyBsYzA7CisJdW5zaWduZWQgbG9uZyBzYTE7CisJdW5zaWduZWQgbG9uZyBsYzE7CisJdW5zaWduZWQgbG9uZyBtMDsKKwl1bnNpZ25lZCBsb25nIG0xOworCXVuc2lnbmVkIGxvbmcgdXNyOworCXVuc2lnbmVkIGxvbmcgcDNfMDsKKwl1bnNpZ25lZCBsb25nIGdwOworCXVuc2lnbmVkIGxvbmcgdWdwOworCXVuc2lnbmVkIGxvbmcgcGM7CisJdW5zaWduZWQgbG9uZyBjYXVzZTsKKwl1bnNpZ25lZCBsb25nIGJhZHZhOworCXVuc2lnbmVkIGxvbmcgcGFkMTsgIC8qIHBhZCBvdXQgdG8gNDggd29yZHMgdG90YWwgKi8KKwl1bnNpZ25lZCBsb25nIHBhZDI7ICAvKiBwYWQgb3V0IHRvIDQ4IHdvcmRzIHRvdGFsICovCisJdW5zaWduZWQgbG9uZyBwYWQzOyAgLyogcGFkIG91dCB0byA0OCB3b3JkcyB0b3RhbCAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdmRzby5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3Zkc28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk1Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3Zkc28uaApAQCAtMCwwICsxLDMwIEBACisvKgorICogdkRTTyBpbXBsZW1lbnRhdGlvbiBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX1ZEU09fSAorI2RlZmluZSBfX0FTTV9WRFNPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBoZXhhZ29uX3Zkc28geworCXUzMiBydF9zaWduYWxfdHJhbXBvbGluZVsyXTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9WRFNPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS92bV9mYXVsdC5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3ZtX2ZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjZGEzNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS92bV9mYXVsdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fSEVYQUdPTl9WTV9GQVVMVF9ICisjZGVmaW5lIF9BU01fSEVYQUdPTl9WTV9GQVVMVF9ICisKK2V4dGVybiB2b2lkIGV4ZWN1dGVfcHJvdGVjdGlvbl9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHdyaXRlX3Byb3RlY3Rpb25fZmF1bHQoc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCByZWFkX3Byb3RlY3Rpb25fZmF1bHQoc3RydWN0IHB0X3JlZ3MgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3ZtX21tdS5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3ZtX21tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDQ2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdm1fbW11LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBIZXhhZ29uIFZNIHBhZ2UgdGFibGUgZW50cnkgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fVk1fTU1VX0gKKyNkZWZpbmUgX0FTTV9WTV9NTVVfSAorCisvKgorICogU2hpZnQsIG1hc2ssIGFuZCBvdGhlciBjb25zdGFudHMgZm9yIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZQorICogcGFnZSB0YWJsZXMuCisgKgorICogVmlydHVhbCBtYWNoaW5lIE1NVSBhbGxvd3MgZmlyc3QtbGV2ZWwgZW50cmllcyB0byBlaXRoZXIgYmUKKyAqIHNpbmdsZS1sZXZlbCBsb29rdXAgUFRFcyBmb3IgdmVyeSBsYXJnZSBwYWdlcywgb3IgUERFcyBwb2ludGluZworICogdG8gc2Vjb25kLWxldmVsIFBURXMgZm9yIHNtYWxsZXIgcGFnZXMuIElmIFBURSBpcyBzaW5nbGUtbGV2ZWwsCisgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBjYW5ub3QgYmUgdXNlZCBhcyBzb2Z0d2FyZSBiaXRzIHRvIGVuY29kZQorICogdmlydHVhbCBtZW1vcnkgc3Vic3lzdGVtIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWdlLCBhbmQgdGhhdCBzdGF0ZQorICogbXVzdCBiZSBtYWludGFpbmVkIGluIHNvbWUgcGFyYWxsZWwgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KKworLyogUyBvciBQYWdlIFNpemUgZmllbGQgaW4gUERFICovCisjZGVmaW5lCV9fSFZNX1BERV9TCQkoMHg3IDw8IDApCisjZGVmaW5lIF9fSFZNX1BERV9TXzRLQgkJMAorI2RlZmluZSBfX0hWTV9QREVfU18xNktCCTEKKyNkZWZpbmUgX19IVk1fUERFX1NfNjRLQgkyCisjZGVmaW5lIF9fSFZNX1BERV9TXzI1NktCCTMKKyNkZWZpbmUgX19IVk1fUERFX1NfMU1CCQk0CisjZGVmaW5lIF9fSFZNX1BERV9TXzRNQgkJNQorI2RlZmluZSBfX0hWTV9QREVfU18xNk1CCTYKKyNkZWZpbmUgX19IVk1fUERFX1NfSU5WQUxJRAk3CisKKy8qIE1hc2tzIGZvciBMMiBwYWdlIHRhYmxlIHBvaW50ZXIsIGFzIGZ1bmN0aW9uIG9mIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBfX0hWTV9QREVfUFRNQVNLXzRLQgkweGZmZmZmMDAwCisjZGVmaW5lIF9fSFZNX1BERV9QVE1BU0tfMTZLQgkweGZmZmZmYzAwCisjZGVmaW5lIF9fSFZNX1BERV9QVE1BU0tfNjRLQgkweGZmZmZmZjAwCisjZGVmaW5lIF9fSFZNX1BERV9QVE1BU0tfMjU2S0IJMHhmZmZmZmZjMAorI2RlZmluZSBfX0hWTV9QREVfUFRNQVNLXzFNQgkweGZmZmZmZmYwCisKKy8qCisgKiBWaXJ0dWFsIE1hY2hpbmUgUFRFIEJpdHMvRmllbGRzCisgKi8KKyNkZWZpbmUgX19IVk1fUFRFX1QJCSgxPDw0KQorI2RlZmluZSBfX0hWTV9QVEVfVQkJKDE8PDUpCisjZGVmaW5lCV9fSFZNX1BURV9DCQkoMHg3PDw2KQorI2RlZmluZSBfX0hWTV9QVEVfQ1ZBTChwdGUpCSgoKHB0ZSkgJiBfX0hWTV9QVEVfQykgPj4gNikKKyNkZWZpbmUgX19IVk1fUFRFX1IJCSgxPDw5KQorI2RlZmluZSBfX0hWTV9QVEVfVwkJKDE8PDEwKQorI2RlZmluZSBfX0hWTV9QVEVfWAkJKDE8PDExKQorCisvKgorICogQ2FjaGUgQXR0cmlidXRlcywgdG8gYmUgc2hpZnRlZCBhcyBuZWNlc3NhcnkgZm9yIHZpcnR1YWwvcGh5c2ljYWwgUFRFcworICovCisKKyNkZWZpbmUgX19IRVhBR09OX0NfV0IJCTB4MAkvKiBXcml0ZS1iYWNrLCBubyBMMiAqLworI2RlZmluZQlfX0hFWEFHT05fQ19XVAkJMHgxCS8qIFdyaXRlLXRocm91Z2gsIG5vIEwyICovCisjZGVmaW5lCV9fSEVYQUdPTl9DX0RFVgkJMHg0CS8qIERldmljZSByZWdpc3RlciBzcGFjZSAqLworI2RlZmluZQlfX0hFWEFHT05fQ19XVF9MMgkweDUJLyogV3JpdGUtdGhyb3VnaCwgd2l0aCBMMiAqLworLyogdGhpcyByZWFsbHkgc2hvdWxkIGJlICNpZiBDT05GSUdfSEVYQUdPTl9BUkNIID0gMiBidXQgdGhhdCdzIG5vdCBkZWZpbmVkICovCisjaWYgZGVmaW5lZChDT05GSUdfSEVYQUdPTl9DT01FVCkgfHwgZGVmaW5lZChDT05GSUdfUURTUDZfU1QxKQorI2RlZmluZSBfX0hFWEFHT05fQ19VTkMJCV9fSEVYQUdPTl9DX0RFVgorI2Vsc2UKKyNkZWZpbmUJX19IRVhBR09OX0NfVU5DCQkweDYJLyogVW5jYWNoZWQgbWVtb3J5ICovCisjZW5kaWYKKyNkZWZpbmUJX19IRVhBR09OX0NfV0JfTDIJMHg3CS8qIFdyaXRlLWJhY2ssIHdpdGggTDIgKi8KKworLyoKKyAqIFRoaXMgY2FuIGJlIG92ZXJyaWRlbiwgYnV0IHdlJ3JlIGRlZmF1bHRpbmcgdG8gdGhlIG1vc3QgYWdncmVzc2l2ZQorICogY2FjaGUgcG9saWN5LCB0aGUgYmV0dGVyIHRvIGZpbmQgYnVncyBzb29uZXIuCisgKi8KKworI2RlZmluZQlDQUNIRV9ERUZBVUxUCV9fSEVYQUdPTl9DX1dCX0wyCisKKy8qIE1hc2tzIGZvciBwaHlzaWNhbCBwYWdlIGFkZHJlc3MsIGFzIGEgZnVuY3Rpb24gb2YgcGFnZSBzaXplICovCisKKyNkZWZpbmUgX19IVk1fUFRFX1BHTUFTS180S0IJMHhmZmZmZjAwMAorI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzE2S0IJMHhmZmZmYzAwMAorI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzY0S0IJMHhmZmZmMDAwMAorI2RlZmluZSBfX0hWTV9QVEVfUEdNQVNLXzI1NktCCTB4ZmZmYzAwMDAKKyNkZWZpbmUgX19IVk1fUFRFX1BHTUFTS18xTUIJMHhmZmYwMDAwMAorCisvKiBNYXNrcyBmb3Igc2luZ2xlLWxldmVsIGxhcmdlIHBhZ2UgbG9va3VwcyAqLworCisjZGVmaW5lIF9fSFZNX1BURV9QR01BU0tfNE1CCTB4ZmZjMDAwMDAKKyNkZWZpbmUgX19IVk1fUFRFX1BHTUFTS18xNk1CCTB4ZmYwMDAwMDAKKworLyoKKyAqICJCaWcga2VybmVsIHBhZ2UgbWFwcGluZ3MiIChzZWUgdm1faW5pdF9zZWd0YWJsZS5TKQorICogYXJlIGN1cnJlbnRseSAxNk1CCisgKi8KKworI2RlZmluZSBCSUdfS0VSTkVMX1BBR0VfU0hJRlQgMjQKKyNkZWZpbmUgQklHX0tFUk5FTF9QQUdFX1NJWkUgKDEgPDwgQklHX0tFUk5FTF9QQUdFX1NISUZUKQorCisKKworI2VuZGlmIC8qIF9BU01fVk1fTU1VX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2hleGFnb24va2VybmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODlmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKK2V4dHJhLXkgOj0gaGVhZC5vIHZtbGludXgubGRzIGluaXRfdGFzay5vCisKK29iai0kKENPTkZJR19TTVApICs9IHNtcC5vIHRvcG9sb2d5Lm8KKworb2JqLXkgKz0gc2V0dXAubyBpcnFfY3B1Lm8gdHJhcHMubyBzeXNjYWxsdGFiLm8gc2lnbmFsLm8gdGltZS5vCitvYmoteSArPSBwcm9jZXNzLm8gc3lzY2FsbC5vIHRyYW1wb2xpbmUubyByZXNldC5vIHB0cmFjZS5vCitvYmoteSArPSB2ZHNvLm8KKworb2JqLSQoQ09ORklHX0tHREIpICAgICs9IGtnZGIubworb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vIGhleGFnb25fa3N5bXMubworCisjIE1vZHVsZXMgcmVxdWlyZWQgdG8gd29yayB3aXRoIHRoZSBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZQorb2JqLXkgKz0gdm1fZW50cnkubyB2bV9ldmVudHMubyB2bV9zd2l0Y2gubyB2bV9vcHMubyB2bV9pbml0X3NlZ3RhYmxlLm8KK29iai15ICs9IHZtX3ZlY3RvcnMubworCitvYmotJChDT05GSUdfSEFTX0RNQSkgKz0gZG1hLm8KKworb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpICs9IHN0YWNrdHJhY2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmZhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogS2V2aW4gS2lzc2VsbCwga2V2aW5rQG1pcHMuY29tIGFuZCBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqIENvcHlyaWdodCAoQykgMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYnVpbGQuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisvKiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gcHJvZHVjZSBhc20vbGlua2Vyc2NyaXB0IGNvbnN0YW50cyBmcm9tIGhlYWRlcgorICAgIGZpbGVzIHR5cGljYWxseSB1c2VkIGluIGMuICBTcGVjaWZpY2FsbHksIGl0IGdlbmVyYXRlcyBhc20tb2Zmc2V0cy5oICAqLworCitpbnQgbWFpbih2b2lkKQoreworCUNPTU1FTlQoIlRoaXMgaXMgYSBjb21tZW50LiIpOworCS8qICBtaWdodCBnZXQgdGhlc2UgZnJvbSBzb21ld2hlcmUgZWxzZS4gICovCisJREVGSU5FKF9QQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJREVGSU5FKF9QQUdFX1NISUZULCBQQUdFX1NISUZUKTsKKwlCTEFOSygpOworCisJQ09NTUVOVCgiSGV4YWdvbiBwdF9yZWdzIGRlZmluaXRpb25zIik7CisJT0ZGU0VUKF9QVF9TWVNDQUxMX05SLCBwdF9yZWdzLCBzeXNjYWxsX25yKTsKKwlPRkZTRVQoX1BUX1VHUEdQLCBwdF9yZWdzLCB1Z3BncCk7CisJT0ZGU0VUKF9QVF9SMzEzMCwgcHRfcmVncywgcjMxMzApOworCU9GRlNFVChfUFRfUjI5MjgsIHB0X3JlZ3MsIHIyOTI4KTsKKwlPRkZTRVQoX1BUX1IyNzI2LCBwdF9yZWdzLCByMjcyNik7CisJT0ZGU0VUKF9QVF9SMjUyNCwgcHRfcmVncywgcjI1MjQpOworCU9GRlNFVChfUFRfUjIzMjIsIHB0X3JlZ3MsIHIyMzIyKTsKKwlPRkZTRVQoX1BUX1IyMTIwLCBwdF9yZWdzLCByMjEyMCk7CisJT0ZGU0VUKF9QVF9SMTkxOCwgcHRfcmVncywgcjE5MTgpOworCU9GRlNFVChfUFRfUjE3MTYsIHB0X3JlZ3MsIHIxNzE2KTsKKwlPRkZTRVQoX1BUX1IxNTE0LCBwdF9yZWdzLCByMTUxNCk7CisJT0ZGU0VUKF9QVF9SMTMxMiwgcHRfcmVncywgcjEzMTIpOworCU9GRlNFVChfUFRfUjExMTAsIHB0X3JlZ3MsIHIxMTEwKTsKKwlPRkZTRVQoX1BUX1IwOTA4LCBwdF9yZWdzLCByMDkwOCk7CisJT0ZGU0VUKF9QVF9SMDcwNiwgcHRfcmVncywgcjA3MDYpOworCU9GRlNFVChfUFRfUjA1MDQsIHB0X3JlZ3MsIHIwNTA0KTsKKwlPRkZTRVQoX1BUX1IwMzAyLCBwdF9yZWdzLCByMDMwMik7CisJT0ZGU0VUKF9QVF9SMDEwMCwgcHRfcmVncywgcjAxMDApOworCU9GRlNFVChfUFRfTEMwU0EwLCBwdF9yZWdzLCBsYzBzYTApOworCU9GRlNFVChfUFRfTEMxU0ExLCBwdF9yZWdzLCBsYzFzYTEpOworCU9GRlNFVChfUFRfTTFNMCwgcHRfcmVncywgbTFtMCk7CisJT0ZGU0VUKF9QVF9QUkVEU1VTUiwgcHRfcmVncywgcHJlZHN1c3IpOworCU9GRlNFVChfUFRfRVZSRUMsIHB0X3JlZ3MsIGh2bWVyKTsKKwlPRkZTRVQoX1BUX0VSX1ZNRUwsIHB0X3JlZ3MsIGh2bWVyLnZtZWwpOworCU9GRlNFVChfUFRfRVJfVk1FU1QsIHB0X3JlZ3MsIGh2bWVyLnZtZXN0KTsKKwlPRkZTRVQoX1BUX0VSX1ZNUFNQLCBwdF9yZWdzLCBodm1lci52bXBzcCk7CisJT0ZGU0VUKF9QVF9FUl9WTUJBRFZBLCBwdF9yZWdzLCBodm1lci52bWJhZHZhKTsKKwlERUZJTkUoX1BUX1JFR1NfU0laRSwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJQkxBTksoKTsKKworCUNPTU1FTlQoIkhleGFnb24gdGhyZWFkX2luZm8gZGVmaW5pdGlvbnMiKTsKKwlPRkZTRVQoX1RIUkVBRF9JTkZPX0ZMQUdTLCB0aHJlYWRfaW5mbywgZmxhZ3MpOworCU9GRlNFVChfVEhSRUFEX0lORk9fUFRfUkVHUywgdGhyZWFkX2luZm8sIHJlZ3MpOworCU9GRlNFVChfVEhSRUFEX0lORk9fU1AsIHRocmVhZF9pbmZvLCBzcCk7CisJREVGSU5FKF9USFJFQURfU0laRSwgVEhSRUFEX1NJWkUpOworCUJMQU5LKCk7CisKKwlDT01NRU5UKCJIZXhhZ29uIGhleGFnb25fc3dpdGNoX3N0YWNrIGRlZmluaXRpb25zIik7CisJT0ZGU0VUKF9TV0lUQ0hfUjE3MTYsIGhleGFnb25fc3dpdGNoX3N0YWNrLCByMTcxNik7CisJT0ZGU0VUKF9TV0lUQ0hfUjE5MTgsIGhleGFnb25fc3dpdGNoX3N0YWNrLCByMTkxOCk7CisJT0ZGU0VUKF9TV0lUQ0hfUjIxMjAsIGhleGFnb25fc3dpdGNoX3N0YWNrLCByMjEyMCk7CisJT0ZGU0VUKF9TV0lUQ0hfUjIzMjIsIGhleGFnb25fc3dpdGNoX3N0YWNrLCByMjMyMik7CisKKwlPRkZTRVQoX1NXSVRDSF9SMjUyNCwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIyNTI0KTsKKwlPRkZTRVQoX1NXSVRDSF9SMjcyNiwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIHIyNzI2KTsKKwlPRkZTRVQoX1NXSVRDSF9GUCwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIGZwKTsKKwlPRkZTRVQoX1NXSVRDSF9MUiwgaGV4YWdvbl9zd2l0Y2hfc3RhY2ssIGxyKTsKKwlERUZJTkUoX1NXSVRDSF9TVEFDS19TSVpFLCBzaXplb2Yoc3RydWN0IGhleGFnb25fc3dpdGNoX3N0YWNrKSk7CisJQkxBTksoKTsKKworCUNPTU1FTlQoIkhleGFnb24gdGFza19zdHJ1Y3QgZGVmaW5pdGlvbnMiKTsKKwlPRkZTRVQoX1RBU0tfVEhSRUFEX0lORk8sIHRhc2tfc3RydWN0LCBzdGFjayk7CisJT0ZGU0VUKF9UQVNLX1NUUlVDVF9USFJFQUQsIHRhc2tfc3RydWN0LCB0aHJlYWQpOworCisJQ09NTUVOVCgiSGV4YWdvbiB0aHJlYWRfc3RydWN0IGRlZmluaXRpb25zIik7CisJT0ZGU0VUKF9USFJFQURfU1RSVUNUX1NXSVRDSF9TUCwgdGhyZWFkX3N0cnVjdCwgc3dpdGNoX3NwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9kbWEuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMWFjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvZG1hLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBETUEgaW1wbGVtZW50YXRpb24gZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKworc3RydWN0IGRtYV9tYXBfb3BzICpkbWFfb3BzOworRVhQT1JUX1NZTUJPTChkbWFfb3BzKTsKKworaW50IGJhZF9kbWFfYWRkcmVzczsgIC8qICBnbG9iYWxzIGFyZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHplcm8gICovCisKK2ludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJaWYgKG1hc2sgPT0gRE1BX0JJVF9NQVNLKDMyKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7CisKK2ludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlpZiAoIWRldi0+ZG1hX21hc2sgfHwgIWRtYV9zdXBwb3J0ZWQoZGV2LCBtYXNrKSkKKwkJcmV0dXJuIC1FSU87CisKKwkqZGV2LT5kbWFfbWFzayA9IG1hc2s7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKKworc3RhdGljIHN0cnVjdCBnZW5fcG9vbCAqY29oZXJlbnRfcG9vbDsKKworCisvKiBBbGxvY2F0ZXMgZnJvbSBhIHBvb2wgb2YgdW5jYWNoZWQgbWVtb3J5IHRoYXQgd2FzIHJlc2VydmVkIGF0IGJvb3QgdGltZSAqLworCit2b2lkICpoZXhhZ29uX2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSBkbWFfYWRkcl90ICpkbWFfYWRkciwgZ2ZwX3QgZmxhZykKK3sKKwl2b2lkICpyZXQ7CisKKwlpZiAoY29oZXJlbnRfcG9vbCA9PSBOVUxMKSB7CisJCWNvaGVyZW50X3Bvb2wgPSBnZW5fcG9vbF9jcmVhdGUoUEFHRV9TSElGVCwgLTEpOworCisJCWlmIChjb2hlcmVudF9wb29sID09IE5VTEwpCisJCQlwYW5pYygiQ2FuJ3QgY3JlYXRlICVzKCkgbWVtb3J5IHBvb2whIiwgX19mdW5jX18pOworCQllbHNlCisJCQlnZW5fcG9vbF9hZGQoY29oZXJlbnRfcG9vbCwKKwkJCQkoUEFHRV9PRkZTRVQgKyAobWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCkpLAorCQkJCWhleGFnb25fY29oZXJlbnRfcG9vbF9zaXplLCAtMSk7CisJfQorCisJcmV0ID0gKHZvaWQgKikgZ2VuX3Bvb2xfYWxsb2MoY29oZXJlbnRfcG9vbCwgc2l6ZSk7CisKKwlpZiAocmV0KSB7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkqZG1hX2FkZHIgPSAoZG1hX2FkZHJfdCkgKHJldCAtIFBBR0VfT0ZGU0VUKTsKKwl9IGVsc2UKKwkJKmRtYV9hZGRyID0gfjA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoZXhhZ29uX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCisJCQkJICBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCWdlbl9wb29sX2ZyZWUoY29oZXJlbnRfcG9vbCwgKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBzaXplKTsKK30KKworc3RhdGljIGludCBjaGVja19hZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkgICAgICBkbWFfYWRkcl90IGJ1cywgc2l6ZV90IHNpemUpCit7CisJaWYgKGh3ZGV2ICYmIGh3ZGV2LT5kbWFfbWFzayAmJiAhZG1hX2NhcGFibGUoaHdkZXYsIGJ1cywgc2l6ZSkpIHsKKwkJaWYgKCpod2Rldi0+ZG1hX21hc2sgPj0gRE1BX0JJVF9NQVNLKDMyKSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogb3ZlcmZsb3cgJUx4KyV6dSBvZiBkZXZpY2UgbWFzayAlTHhcbiIsCisJCQkJbmFtZSwgKGxvbmcgbG9uZylidXMsIHNpemUsCisJCQkJKGxvbmcgbG9uZykqaHdkZXYtPmRtYV9tYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhleGFnb25fbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJV0FSTl9PTihuZW50cyA9PSAwIHx8IHNnWzBdLmxlbmd0aCA9PSAwKTsKKworCWZvcl9lYWNoX3NnKHNnLCBzLCBuZW50cywgaSkgeworCQlzLT5kbWFfYWRkcmVzcyA9IHNnX3BoeXMocyk7CisJCWlmICghY2hlY2tfYWRkcigibWFwX3NnIiwgaHdkZXYsIHMtPmRtYV9hZGRyZXNzLCBzLT5sZW5ndGgpKQorCQkJcmV0dXJuIDA7CisKKwkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKKworCQlmbHVzaF9kY2FjaGVfcmFuZ2UoUEFHRV9PRkZTRVQgKyBzLT5kbWFfYWRkcmVzcywKKwkJCQkgICBQQUdFX09GRlNFVCArIHMtPmRtYV9hZGRyZXNzICsgcy0+bGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gbmVudHM7Cit9CisKKy8qCisgKiBhZGRyZXNzIGlzIHZpcnR1YWwKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLAorCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgRE1BX1RPX0RFVklDRToKKwkJaGV4YWdvbl9jbGVhbl9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCSh1bnNpZ25lZCBsb25nKSBhZGRyICsgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQloZXhhZ29uX2ludl9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCSh1bnNpZ25lZCBsb25nKSBhZGRyICsgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHIgKyBzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hZGRyX3RvX3ZpcnQoZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSBkbWFfYWRkcik7Cit9CisKKy8qKgorICogaGV4YWdvbl9tYXBfcGFnZSgpIC0gbWFwcyBhbiBhZGRyZXNzIGZvciBkZXZpY2UgRE1BCisgKiBAZGV2Oglwb2ludGVyIHRvIERNQSBkZXZpY2UKKyAqIEBwYWdlOglwb2ludGVyIHRvIHBhZ2Ugc3RydWN0IG9mIERNQSBtZW1vcnkKKyAqIEBvZmZzZXQ6CW9mZnNldCB3aXRoaW4gcGFnZQorICogQHNpemU6CXNpemUgb2YgbWVtb3J5IHRvIG1hcAorICogQGRpcjoJdHJhbnNmZXIgZGlyZWN0aW9uCisgKiBAYXR0cnM6CXBvaW50ZXIgdG8gRE1BIGF0dHJzIChub3QgdXNlZCkKKyAqCisgKiBDYWxsZWQgdG8gbWFwIGEgbWVtb3J5IGFkZHJlc3MgdG8gYSBETUEgYWRkcmVzcyBwcmlvcgorICogdG8gYWNjZXNzZXMgdG8vZnJvbSBkZXZpY2UuCisgKgorICogV2UgZG9uJ3QgcGFydGljdWxhcmx5IGhhdmUgbWFueSBob29wcyB0byBqdW1wIHRocm91Z2gKKyAqIHNvIGZhci4gIFN0cmFpZ2h0IHRyYW5zbGF0aW9uIGJldHdlZW4gcGh5cyBhbmQgdmlydHVhbC4KKyAqCisgKiBETUEgaXMgbm90IGNhY2hlIGNvaGVyZW50IHNvIHN5bmMgaXMgbmVjZXNzYXJ5OyB0aGlzCisgKiBzZWVtcyB0byBiZSBhIGNvbnZlbmllbnQgcGxhY2UgdG8gZG8gaXQuCisgKgorICovCitzdGF0aWMgZG1hX2FkZHJfdCBoZXhhZ29uX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwlkbWFfYWRkcl90IGJ1cyA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKKwlXQVJOX09OKHNpemUgPT0gMCk7CisKKwlpZiAoIWNoZWNrX2FkZHIoIm1hcF9zaW5nbGUiLCBkZXYsIGJ1cywgc2l6ZSkpCisJCXJldHVybiBiYWRfZG1hX2FkZHJlc3M7CisKKwlkbWFfc3luYyhkbWFfYWRkcl90b192aXJ0KGJ1cyksIHNpemUsIGRpcik7CisKKwlyZXR1cm4gYnVzOworfQorCitzdGF0aWMgdm9pZCBoZXhhZ29uX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3N5bmMoZG1hX2FkZHJfdG9fdmlydChkbWFfaGFuZGxlKSwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIHZvaWQgaGV4YWdvbl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV9zeW5jKGRtYV9hZGRyX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcik7Cit9CisKK3N0cnVjdCBkbWFfbWFwX29wcyBoZXhhZ29uX2RtYV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50CT0gaGV4YWdvbl9kbWFfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQJPSBoZXhhZ29uX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZwkJPSBoZXhhZ29uX21hcF9zZywKKwkubWFwX3BhZ2UJPSBoZXhhZ29uX21hcF9wYWdlLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1ID0gaGV4YWdvbl9zeW5jX3NpbmdsZV9mb3JfY3B1LAorCS5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlID0gaGV4YWdvbl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlLAorCS5pc19waHlzCT0gMSwKK307CisKK3ZvaWQgX19pbml0IGhleGFnb25fZG1hX2luaXQodm9pZCkKK3sKKwlpZiAoZG1hX29wcykKKwkJcmV0dXJuOworCisJZG1hX29wcyA9ICZoZXhhZ29uX2RtYV9vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL2hlYWQuUyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNmI4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL2hlYWQuUwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIEVhcmx5IGtlcm5lbCBzdGFydHVwIGNvZGUgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KKyNpbmNsdWRlIDxhc20vdm1fbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworCV9fSU5JVAorRU5UUlkoc3RleHQpCisJLyoKKwkgKiBWTU0gd2lsbCBhbHJlYWR5IGhhdmUgc2V0IHVwIHRydWUgdmVjdG9yIHBhZ2UsIE1NVSwgZXRjLgorCSAqIFRvIHNldCB1cCBpbml0aWFsIGtlcm5lbCBpZGVudGl0eSBtYXAsIHdlIGhhdmUgdG8gcGFzcworCSAqIHRoZSBWTU0gYSBwb2ludGVyIHRvIHNvbWUgY2Fub25pY2FsIHBhZ2UgdGFibGVzLiBJbgorCSAqIHRoaXMgaW1wbGVtZW50YXRpb24sIHdlJ3JlIGFzc3VtaW5nIHRoYXQgd2UndmUgZ290CisJICogdGhlbSBwcmVjb21waWxlZC4gR2VuZXJhdGUgdmFsdWUgaW4gUjI0LCBhcyB3ZSdsbCBuZWVkCisJICogaXQgYWdhaW4gc2hvcnRseS4KKwkgKi8KKwlyMjQuTCA9ICNMTyhzd2FwcGVyX3BnX2RpcikKKwlyMjQuSCA9ICNISShzd2FwcGVyX3BnX2RpcikKKworCS8qCisJICogU3ltYm9sIGlzIGtlcm5lbCBzZWdtZW50IGFkZHJlc3MsIGJ1dCB3ZSBuZWVkCisJICogdGhlIGxvZ2ljYWwvcGh5c2ljYWwgYWRkcmVzcy4KKwkgKi8KKwlyMjQgPSBhc2wocjI0LCAjMikKKwlyMjQgPSBsc3IocjI0LCAjMikKKworCXIwID0gcjI0CisKKwkvKgorCSAqIEluaXRpYWxpemUgYSAxNk1CIFBURSB0byBtYWtlIHRoZSB2aXJ0dWFsIGFuZCBwaHlzaWNhbAorCSAqIGFkZHJlc3NlcyB3aGVyZSB0aGUga2VybmVsIHdhcyBsb2FkZWQgYmUgaWRlbnRpY2FsLgorCSAqLworI2RlZmluZSBQVEVfQklUUyAoIF9fSFZNX1BURV9SIHwgX19IVk1fUFRFX1cgfCBfX0hWTV9QVEVfWAlcCisJCSAgfCBfX0hFWEFHT05fQ19XQl9MMiA8PCA2CQkJXAorCQkgIHwgX19IVk1fUERFX1NfNE1CKQorCisJcjEgPSBwYworCXIyLkggPSAjMHhmZmMwCisJcjIuTCA9ICMweDAwMDAKKwlyMSA9IGFuZChyMSxyMikJCS8qIHJvdW5kIFBDIHRvIDRNQiBib3VuZGFyeQkqLworCXIyID0gbHNyKHIxLCAjMjIpCS8qIDRNQiBwYWdlIG51bWJlcgkJKi8KKwlyMiA9IGFzbChyMiwgIzIpCS8qIHRpbWVzIHNpemVvZihQVEUpICg0Ynl0ZXMpCSovCisJcjAgPSBhZGQocjAscjIpCQkvKiByMCA9IGFkZHJlc3Mgb2YgY29ycmVjdCBQVEUJKi8KKwlyMiA9ICNQVEVfQklUUworCXIxID0gYWRkKHIxLHIyKQkJLyogcjEgPSA0TUIgUFRFIGZvciB0aGUgZmlyc3QgZW50cnkJKi8KKwlyMi5oID0gIzB4MDA0MAorCXIyLmwgPSAjMHgwMDAwCQkvKiA0TUIJKi8KKwltZW13KHIwICsrICM0KSA9IHIxCisJcjEgPSBhZGQocjEsIHIyKQorCW1lbXcocjAgKysgIzQpID0gcjEKKworCXIwID0gcjI0CisKKwkvKgorCSAqIFRoZSBzdWJyb3V0aW5lIHdyYXBwZXIgYXJvdW5kIHRoZSB2aXJ0dWFsIGluc3RydWN0aW9uIHRvdWNoZXMKKwkgKiBubyBtZW1vcnksIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdCBldmVuIGhlcmUuCisJICovCisJY2FsbAlfX3ZtbmV3bWFwOworCisJLyogIEp1bXAgaW50byB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UuICAqLworCisJcjMxLmggPSAjaGkoX19oZWFkX3NfdmFkZHJfdGFyZ2V0KQorCXIzMS5sID0gI2xvKF9faGVhZF9zX3ZhZGRyX3RhcmdldCkKKwlqdW1wciByMzEKKworCS8qICBJbnNlcnQgdHJpcHB5IHNwYWNlIGVmZmVjdHMuICAqLworCitfX2hlYWRfc192YWRkcl90YXJnZXQ6CisJLyoKKwkgKiBUZWFyIGRvd24gVkE9UEEgdHJhbnNsYXRpb24gbm93IHRoYXQgd2UgYXJlIHJ1bm5pbmcKKwkgKiBpbiB0aGUgZGVzZ25hdGVkIGtlcm5lbCBzZWdtZW50cy4KKwkgKi8KKwlyMCA9ICNfX0hWTV9QREVfU19JTlZBTElECisJcjEgPSByMjQKKwlsb29wMCgxZiwjMHgxMDApCisxOgorCXsKKwkJbWVtdyhSMSArKyAjNCkgPSBSMAorCX06ZW5kbG9vcDAKKworCXIwID0gcjI0CisJY2FsbCBfX3ZtbmV3bWFwCisKKwkvKiAgR28gYWhlYWQgYW5kIGluc3RhbGwgdGhlIHRyYXAwIHJldHVybiBzbyBhbmdlbCBjYWxscyB3b3JrICAqLworCXIwLmggPSAjaGkoX0tfcHJvdmlzaW9uYWxfdmVjKQorCXIwLmwgPSAjbG8oX0tfcHJvdmlzaW9uYWxfdmVjKQorCWNhbGwgX192bXNldHZlYworCisJLyoKKwkgKiBPSywgYXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgc3RhcnQgdG8gYmUgbXVjaCBtb3JlIGNhcmVmdWwsCisJICogd2UncmUgZ29pbmcgdG8gZW50ZXIgQyBjb2RlIGFuZCBzdGFydCB0b3VjaGluZyBtZW1vcnkKKwkgKiBpbiBhbGwgc29ydHMgb2YgcGxhY2VzLgorCSAqIFRoaXMgbWVhbnM6CisJICogICAgICBTR1AgbmVlZHMgdG8gYmUgT0sKKwkgKglOZWVkIHRvIGxvY2sgc2hhcmVkIHJlc291cmNlcworCSAqCUEgYnVuY2ggb2Ygb3RoZXIgdGhpbmdzIHRoYXQgd2lsbCBjYXVzZQorCSAqIAlhbGwga2luZHMgb2YgcGFpbmZ1bCBidWdzCisJICovCisKKwkvKgorCSAqIFN0YWNrIHBvaW50ZXIgc2hvdWxkIGJlIHBvaW50ZWQgYXQgdGhlIGluaXQgdGFzaydzCisJICogdGhyZWFkIHN0YWNrLCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIGFyY2gvaW5pdF90YXNrLmMuCisJICogU28gdWhoaGhoLi4uCisJICogSXQncyBhY2Nlc3NpYmxlIHZpYSB0aGUgaW5pdF90aHJlYWRfdW5pb24sIHdoaWNoIGlzIGEgdW5pb24KKwkgKiBvZiBhIHRocmVhZF9pbmZvIHN0cnVjdCBhbmQgYSBzdGFjazsgb2YgY291cnNlLCB0aGUgdG9wCisJICogb2YgdGhlIHN0YWNrIGlzIG5vdCBmb3IgeW91LiAgVGhlIGVuZCBvZiB0aGUgc3RhY2sKKwkgKiBpcyBzaW1wbHkgaW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU0laRS4KKwkgKi8KKworCXtyMjkuSCA9ICNISShpbml0X3RocmVhZF91bmlvbik7IHIwLkggPSAjSEkoX1RIUkVBRF9TSVpFKTsgfQorCXtyMjkuTCA9ICNMTyhpbml0X3RocmVhZF91bmlvbik7IHIwLkwgPSAjTE8oX1RIUkVBRF9TSVpFKTsgfQorCisJLyogIGluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIHVzZWQgdG8gcG9pbnQgdG8gY3VycmVudF90aHJlYWRfaW5mbyAqLworCS8qICBGaXhtZTogIFRIUkVBRElORk9fUkVHIGNhbid0IGJlIFIyIGJlY2F1c2Ugb2YgdGhhdCBtZW1zZXQgdGhpbmcuICovCisJe3IyOSA9IGFkZChyMjkscjApOyBUSFJFQURJTkZPX1JFRyA9IHIyOTsgfQorCisJLyogIEhhY2s6ICB6ZXJvIGJzczsgKi8KKwl7IHIwLkwgPSAjTE8oX19ic3Nfc3RhcnQpOyAgcjEgPSAjMDsgcjIubCA9ICNMTyhfX2Jzc19zdG9wKTsgfQorCXsgcjAuSCA9ICNISShfX2Jzc19zdGFydCk7ICAgICAgICAgICByMi5oID0gI0hJKF9fYnNzX3N0b3ApOyB9CisKKwlyMiA9IHN1YihyMixyMCk7CisJY2FsbCBtZW1zZXQ7CisKKwkvKiBUaW1lIHRvIG1ha2UgdGhlIGRvdWdobnV0cy4gICAqLworCWNhbGwgc3RhcnRfa2VybmVsCisKKwkvKgorCSAqIFNob3VsZCBub3QgcmVhY2ggaGVyZS4KKwkgKi8KKzE6CisJanVtcCAxYgorCisucDJhbGlnbiBQQUdFX1NISUZUCitFTlRSWShleHRlcm5hbF9jbWRsaW5lX2J1ZmZlcikKKyAgICAgICAgLmZpbGwgX1BBR0VfU0laRSwxLDAKKworLmRhdGEKKy5wMmFsaWduIFBBR0VfU0hJRlQKK0VOVFJZKGVtcHR5X3plcm9fcGFnZSkKKyAgICAgICAgLmZpbGwgX1BBR0VfU0laRSwxLDAKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvaGV4YWdvbl9rc3ltcy5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9oZXhhZ29uX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxODkyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvaGV4YWdvbl9rc3ltcy5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBFeHBvcnQgb2Ygc3ltYm9scyBkZWZpbmVkIGluIGFzc2VtYmx5IGZpbGVzIGFuZC9vciBsaWJnY2MuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworRVhQT1JUX1NZTUJPTChfX2NvcHlfZnJvbV91c2VyX2hleGFnb24pOworRVhQT1JUX1NZTUJPTChfX2NvcHlfdG9fdXNlcl9oZXhhZ29uKTsKK0VYUE9SVF9TWU1CT0woX192bWdldGllKTsKK0VYUE9SVF9TWU1CT0woX192bXNldGllKTsKK0VYUE9SVF9TWU1CT0wobWVtY3B5KTsKK0VYUE9SVF9TWU1CT0wobWVtc2V0KTsKKworI2RlZmluZSBERUNMQVJFX0VYUE9SVChuYW1lKSAgICAgXAorCWV4dGVybiB2b2lkIG5hbWUodm9pZCk7IEVYUE9SVF9TWU1CT0wobmFtZSkKKworLyogU3ltYm9scyBmb3VuZCBpbiBsaWJnY2MgdGhhdCBhc3NvcnRlZCBrZXJuZWwgbW9kdWxlcyBuZWVkICovCitERUNMQVJFX0VYUE9SVChfX2hleGFnb25fbWVtY3B5X2xpa2VseV9hbGlnbmVkX21pbjMyYnl0ZXNfbXVsdDhieXRlcyk7CisKK0RFQ0xBUkVfRVhQT1JUKF9faGV4YWdvbl9kaXZzaTMpOworREVDTEFSRV9FWFBPUlQoX19oZXhhZ29uX21vZHNpMyk7CitERUNMQVJFX0VYUE9SVChfX2hleGFnb25fdWRpdnNpMyk7CitERUNMQVJFX0VYUE9SVChfX2hleGFnb25fdW1vZHNpMyk7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9pbml0X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI4M2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogSW5pdCB0YXNrIGRlZmluaXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXF1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgc3RydWN0IHNpZ25hbF9zdHJ1Y3QgaW5pdF9zaWduYWxzID0gSU5JVF9TSUdOQUxTKGluaXRfc2lnbmFscyk7CitzdGF0aWMgc3RydWN0IHNpZ2hhbmRfc3RydWN0IGluaXRfc2lnaGFuZCA9IElOSVRfU0lHSEFORChpbml0X3NpZ2hhbmQpOworCisvKgorICogSW5pdGlhbCB0aHJlYWQgc3RydWN0dXJlLgorICoKKyAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyA4MTkyLWJ5dGUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBtYWtpbmcgc3VyZQorICogdGhlIGxpbmtlciBtYXBzIHRoaXMgaW4gdGhlIC50ZXh0IHNlZ21lbnQgcmlnaHQgYWZ0ZXIgaGVhZC5TLAorICogYW5kIG1ha2luZyBoZWFkLlMgZW5zdXJlIHRoZSBwcm9wZXIgYWxpZ25tZW50LgorICovCit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIiksCisJCV9fYWxpZ25lZF9fKFRIUkVBRF9TSVpFKSkpID0geworCQkJSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spCisJCX07CisKKy8qCisgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgorICoKKyAqIEFsbCBvdGhlciB0YXNrIHN0cnVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc2xhYnMgaW4gZm9yay5jCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCBpbml0X3Rhc2sgPSBJTklUX1RBU0soaW5pdF90YXNrKTsKK0VYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvaXJxX2NwdS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9pcnFfY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0MTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvaXJxX2NwdS5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBGaXJzdC1sZXZlbCBpbnRlcnJ1cHQgY29udHJvbGxlciBtb2RlbCBmb3IgSGV4YWdvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworc3RhdGljIHZvaWQgbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCV9fdm1pbnRvcF9sb2NkaXMoKGxvbmcpIGRhdGEtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfaXJxX251bSh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fdm1pbnRvcF9sb2NkaXMoKGxvbmcpIGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCV9fdm1pbnRvcF9sb2NlbigobG9uZykgZGF0YS0+aXJxKTsKK30KKworLyogIFRoaXMgaXMgYWN0dWFsbHkgYWxsIHdlIG5lZWQgZm9yIGhhbmRsZV9mYXN0ZW9pX2lycSAgKi8KK3N0YXRpYyB2b2lkIGVvaV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCV9fdm1pbnRvcF9nbG9iZW4oKGxvbmcpIGRhdGEtPmlycSk7Cit9CisKKy8qIFBvd2VyIG1hbWFuZ2VtZW50IHdha2UgY2FsbC4gV2UgZG9uJ3QgbmVlZCB0aGlzLCBob3dldmVyLAorICogaWYgdGhpcyBpcyBhYnNlbnQsIHRoZW4gYW4gLUVOWElPIGVycm9yIGlzIHJldHVybmVkIHRvIHRoZQorICogbXNtX3NlcmlhbCBkcml2ZXIsIGFuZCBpdCBmYWlscyB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZS4KKyAqIFRoaXMgaXMgYSBidWcgaW4gdGhlIG1zbV9zZXJpYWwgZHJpdmVyLCBidXQsIGZvciBub3csIHdlCisgKiB3b3JrIGFyb3VuZCBpdCBoZXJlLCBieSBwcm92aWRpbmcgdGhpcyBib2d1cyBoYW5kbGVyLgorICogWFhYIEZJWE1FISEhIHJlbW92ZSB0aGlzIHdoZW4gbXNtX3NlcmlhbCBpcyBmaXhlZC4KKyAqLworc3RhdGljIGludCBzZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBoZXhhZ29uX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJIRVhBR09OIiwKKwkuaXJxX21hc2sJPSBtYXNrX2lycSwKKwkuaXJxX3VubWFzawk9IHVubWFza19pcnEsCisJLmlycV9zZXRfd2FrZQk9IHNldF93YWtlLAorCS5pcnFfZW9pCT0gZW9pX2lycQorfTsKKworLyoqCisgKiBUaGUgaGV4YWdvbiBjb3JlIGNvbWVzIHdpdGggYSBmaXJzdC1sZXZlbCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogd2l0aCAzMiB0b3RhbCBwb3NzaWJsZSBpbnRlcnJ1cHRzLiAgV2hlbiB0aGUgY29yZSBpcyBlbWJlZGRlZAorICogaW50byBkaWZmZXJlbnQgc3lzdGVtcy9wbGF0Zm9ybXMsIGl0IGlzIHR5cGljYWxseSB3cmFwcGVkIGJ5CisgKiBtYWNybyBjZWxscyB0aGF0IHByb3ZpZGUgb25lIG9yIG1vcmUgc2Vjb25kLWxldmVsIGludGVycnVwdAorICogY29udHJvbGxlcnMgdGhhdCBhcmUgY2FzY2FkZWQgaW50byBvbmUgb3IgbW9yZSBvZiB0aGUgZmlyc3QtbGV2ZWwKKyAqIGludGVycnVwdHMgaGFuZGxlZCBoZXJlLiBUaGUgcHJlY2lzZSB3aXJpbmcgb2YgdGhlc2Ugb3RoZXIKKyAqIGlycXMgdmFyaWVzIGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0sIGFuZCBhcmUgc2V0IHVwICYgY29uZmlndXJlZAorICogaW4gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzLgorICoKKyAqIFRoZSBmaXJzdC1sZXZlbCBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyB3cmFwcGVkIGJ5IHRoZSBWTSwgd2hpY2gKKyAqIHZpcnR1YWxpemVzIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBmb3IgdXMuICBJdCBwcm92aWRlcyBhIHZlcnkKKyAqIHNpbXBsZSwgZmFzdCAmIGVmZmljaWVudCBBUEksIGFuZCBzbyB0aGUgZmFzdGVvaSBoYW5kbGVyIGlzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBjYXNlLgorICovCit2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IEhFWEFHT05fQ1BVSU5UUzsgaXJxKyspIHsKKwkJbWFza19pcnFfbnVtKGlycSk7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZoZXhhZ29uX2lycV9jaGlwLAorCQkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2hleGFnb24va2VybmVsL2tnZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRhYTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9rZ2RiLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBhcmNoL2hleGFnb24va2VybmVsL2tnZGIuYyAtIEhleGFnb24gS0dEQiBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisKKy8qIEFsbCByZWdpc3RlcnMgYXJlIDQgYnl0ZXMsIGZvciBub3cgKi8KKyNkZWZpbmUgR0RCX1NJWkVPRl9SRUcgNAorCisvKiBUaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIHVzZWQgZHVyaW5nIHByaW50aW5nIG9mIHRoZSByZWdzOworICogS2VlcCB0aGVzZSBhdCB0aHJlZSBsZXR0ZXJzIHRvIHByZXR0eS1wcmludC4gKi8KK3N0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPSB7CisJeyAiIHIwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDApfSwKKwl7ICIgcjEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwMSl9LAorCXsgIiByMiIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjAyKX0sCisJeyAiIHIzIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDMpfSwKKwl7ICIgcjQiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwNCl9LAorCXsgIiByNSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjA1KX0sCisJeyAiIHI2IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDYpfSwKKwl7ICIgcjciLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIwNyl9LAorCXsgIiByOCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjA4KX0sCisJeyAiIHI5IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMDkpfSwKKwl7ICJyMTAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxMCl9LAorCXsgInIxMSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjExKX0sCisJeyAicjEyIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTIpfSwKKwl7ICJyMTMiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxMyl9LAorCXsgInIxNCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjE0KX0sCisJeyAicjE1IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTUpfSwKKwl7ICJyMTYiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxNil9LAorCXsgInIxNyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjE3KX0sCisJeyAicjE4IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMTgpfSwKKwl7ICJyMTkiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIxOSl9LAorCXsgInIyMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjIwKX0sCisJeyAicjIxIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjEpfSwKKwl7ICJyMjIiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyMil9LAorCXsgInIyMyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjIzKX0sCisJeyAicjI0IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjQpfSwKKwl7ICJyMjUiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyNSl9LAorCXsgInIyNiIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjI2KX0sCisJeyAicjI3IiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMjcpfSwKKwl7ICJyMjgiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIyOCl9LAorCXsgInIyOSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcjI5KX0sCisJeyAicjMwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCByMzApfSwKKwl7ICJyMzEiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHIzMSl9LAorCisJeyAidXNyIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCB1c3IpfSwKKwl7ICJwcmVkcyIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcHJlZHMpfSwKKwl7ICIgbTAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG0wKX0sCisJeyAiIG0xIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBtMSl9LAorCXsgInNhMCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc2EwKX0sCisJeyAic2ExIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzYTEpfSwKKwl7ICJsYzAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGxjMCl9LAorCXsgImxjMSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbGMxKX0sCisJeyAiIGdwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBncCl9LAorCXsgInVncCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgdWdwKX0sCisJeyAicHNwIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBodm1lci52bXBzcCl9LAorCXsgImVsciIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaHZtZXIudm1lbCl9LAorCXsgImVzdCIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaHZtZXIudm1lc3QpfSwKKwl7ICJiYWR2YSIsIEdEQl9TSVpFT0ZfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgaHZtZXIudm1iYWR2YSl9LAorCXsgInJlc3RhcnRfcjAiLCBHREJfU0laRU9GX1JFRywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHJlc3RhcnRfcjApfSwKKwl7ICJzeXNjYWxsX25yIiwgR0RCX1NJWkVPRl9SRUcsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzeXNjYWxsX25yKX0sCit9OworCitzdHJ1Y3Qga2dkYl9hcmNoIGFyY2hfa2dkYl9vcHMgPSB7CisJLyogdHJhcDAoIzB4REIpIDB4MGNkYjAwNTQgKi8KKwkuZ2RiX2JwdF9pbnN0ciA9IHsweDU0LCAweDAwLCAweGRiLCAweDBjfSwKK307CisKK2NoYXIgKmRiZ19nZXRfcmVnKGludCByZWdubywgdm9pZCAqbWVtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocmVnbm8gPj0gREJHX01BWF9SRUdfTlVNIHx8IHJlZ25vIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqKCh1bnNpZ25lZCBsb25nICopIG1lbSkgPSAqKCh1bnNpZ25lZCBsb25nICopICgodm9pZCAqKXJlZ3MgKworCQlkYmdfcmVnX2RlZltyZWdub10ub2Zmc2V0KSk7CisKKwlyZXR1cm4gZGJnX3JlZ19kZWZbcmVnbm9dLm5hbWU7Cit9CisKK2ludCBkYmdfc2V0X3JlZyhpbnQgcmVnbm8sIHZvaWQgKm1lbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlZ25vID49IERCR19NQVhfUkVHX05VTSB8fCByZWdubyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJKigodW5zaWduZWQgbG9uZyAqKSAoKHZvaWQgKilyZWdzICsgZGJnX3JlZ19kZWZbcmVnbm9dLm9mZnNldCkpID0KKwkJKigodW5zaWduZWQgbG9uZyAqKSBtZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQga2dkYl9hcmNoX3NldF9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYykKK3sKKwlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpID0gcGM7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisKKy8qKgorICoga2dkYl9yb3VuZHVwX2NwdXMgLSBHZXQgb3RoZXIgQ1BVcyBpbnRvIGEgaG9sZGluZyBwYXR0ZXJuCisgKiBAZmxhZ3M6IEN1cnJlbnQgSVJRIHN0YXRlCisgKgorICogT24gU01QIHN5c3RlbXMsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhdHRlbnRpb24gb2YgdGhlIG90aGVyIENQVXMKKyAqIGFuZCBnZXQgdGhlbSBiZSBpbiBhIGtub3duIHN0YXRlLiAgVGhpcyBzaG91bGQgZG8gd2hhdCBpcyBuZWVkZWQKKyAqIHRvIGdldCB0aGUgb3RoZXIgQ1BVcyB0byBjYWxsIGtnZGJfd2FpdCgpLiBOb3RlIHRoYXQgb24gc29tZSBhcmNoZXMsCisgKiB0aGUgTk1JIGFwcHJvYWNoIGlzIG5vdCB1c2VkIGZvciByb3VuZGluZyB1cCBhbGwgdGhlIENQVXMuIEZvciBleGFtcGxlLAorICogaW4gY2FzZSBvZiBNSVBTLCBzbXBfY2FsbF9mdW5jdGlvbigpIGlzIHVzZWQgdG8gcm91bmR1cCBDUFVzLiBJbgorICogdGhpcyBjYXNlLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGVuYWJsZWQgYmVmb3JlCisgKiBjYWxsaW5nIHNtcF9jYWxsX2Z1bmN0aW9uKCkuIFRoZSBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIGlzCisgKiB0aGUgZmxhZ3MgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgdGhlIGludGVycnVwdHMuIFRoZXJlIGlzCisgKiBsb2NhbF9pcnFfc2F2ZSgpIGNhbGwgYmVmb3JlIGtnZGJfcm91bmR1cF9jcHVzKCkuCisgKgorICogT24gbm9uLVNNUCBzeXN0ZW1zLCB0aGlzIGlzIG5vdCBjYWxsZWQuCisgKi8KKworc3RhdGljIHZvaWQgaGV4YWdvbl9rZ2RiX25taV9ob29rKHZvaWQgKmlnbm9yZWQpCit7CisJa2dkYl9ubWljYWxsYmFjayhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBnZXRfaXJxX3JlZ3MoKSk7Cit9CisKK3ZvaWQga2dkYl9yb3VuZHVwX2NwdXModW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJc21wX2NhbGxfZnVuY3Rpb24oaGV4YWdvbl9rZ2RiX25taV9ob29rLCBOVUxMLCAwKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworfQorI2VuZGlmCisKKworLyogIE5vdCB5ZXQgd29ya2luZyAgKi8KK3ZvaWQgc2xlZXBpbmdfdGhyZWFkX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLAorCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHB0X3JlZ3MgKnRocmVhZF9yZWdzOworCisJaWYgKHRhc2sgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSB0byB6ZXJvICovCisJbWVtc2V0KGdkYl9yZWdzLCAwLCBOVU1SRUdCWVRFUyk7CisKKwkvKiBPdGhlcndpc2UsIHdlIGhhdmUgb25seSBzb21lIHJlZ2lzdGVycyBmcm9tIHN3aXRjaF90bygpICovCisJdGhyZWFkX3JlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CisJZ2RiX3JlZ3NbMF0gPSB0aHJlYWRfcmVncy0+cjAwOworfQorCisvKioKKyAqIGtnZGJfYXJjaF9oYW5kbGVfZXhjZXB0aW9uIC0gSGFuZGxlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBHREIgcGFja2V0cy4KKyAqIEB2ZWN0b3I6IFRoZSBlcnJvciB2ZWN0b3Igb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbmVkLgorICogQHNpZ25vOiBUaGUgc2lnbmFsIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaGFwcGVuZWQuCisgKiBAZXJyX2NvZGU6IFRoZSBlcnJvciBjb2RlIG9mIHRoZSBleGNlcHRpb24gdGhhdCBoYXBwZW5lZC4KKyAqIEByZW1jb21faW5fYnVmZmVyOiBUaGUgYnVmZmVyIG9mIHRoZSBwYWNrZXQgd2UgaGF2ZSByZWFkLgorICogQHJlbWNvbV9vdXRfYnVmZmVyOiBUaGUgYnVmZmVyIG9mICVCVUZNQVggYnl0ZXMgdG8gd3JpdGUgYSBwYWNrZXQgaW50by4KKyAqIEByZWdzOiBUaGUgJnN0cnVjdCBwdF9yZWdzIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBNVVNUIGhhbmRsZSB0aGUgJ2MnIGFuZCAncycgY29tbWFuZCBwYWNrZXRzLAorICogYXMgd2VsbCBwYWNrZXRzIHRvIHNldCAvIHJlbW92ZSBhIGhhcmR3YXJlIGJyZWFrcG9pbnQsIGlmIHVzZWQuCisgKiBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBwYWNrZXRzIHdoaWNoIHRoZSBoYXJkd2FyZSBuZWVkcyB0byBoYW5kbGUsCisgKiB0aGV5IGFyZSBoYW5kbGVkIGhlcmUuICBUaGUgY29kZSBzaG91bGQgcmV0dXJuIC0xIGlmIGl0IHdhbnRzIHRvCisgKiBwcm9jZXNzIG1vcmUgcGFja2V0cywgYW5kIGEgJTAgb3IgJTEgaWYgaXQgd2FudHMgdG8gZXhpdCBmcm9tIHRoZQorICoga2dkYiBjYWxsYmFjay4KKyAqCisgKiBOb3QgeWV0IHdvcmtpbmcuCisgKi8KK2ludCBrZ2RiX2FyY2hfaGFuZGxlX2V4Y2VwdGlvbihpbnQgdmVjdG9yLCBpbnQgc2lnbm8sIGludCBlcnJfY29kZSwKKwkJCSAgICAgICBjaGFyICpyZW1jb21faW5fYnVmZmVyLCBjaGFyICpyZW1jb21fb3V0X2J1ZmZlciwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqbGludXhfcmVncykKK3sKKwlzd2l0Y2ggKHJlbWNvbV9pbl9idWZmZXJbMF0pIHsKKwljYXNlICdzJzoKKwljYXNlICdjJzoKKwkJcmV0dXJuIDA7CisJfQorCS8qIFN0YXkgaW4gdGhlIGRlYnVnZ2VyLiAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfX2tnZGJfbm90aWZ5KHN0cnVjdCBkaWVfYXJncyAqYXJncywgdW5zaWduZWQgbG9uZyBjbWQpCit7CisJLyogY3B1IHJvdW5kdXAgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmtnZGJfYWN0aXZlKSAhPSAtMSkgeworCQlrZ2RiX25taWNhbGxiYWNrKHNtcF9wcm9jZXNzb3JfaWQoKSwgYXJncy0+cmVncyk7CisJCXJldHVybiBOT1RJRllfU1RPUDsKKwl9CisKKwlpZiAodXNlcl9tb2RlKGFyZ3MtPnJlZ3MpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlpZiAoa2dkYl9oYW5kbGVfZXhjZXB0aW9uKGFyZ3MtPnRyYXBuciAmIDB4ZmYsIGFyZ3MtPnNpZ25yLCBhcmdzLT5lcnIsCisJCQkJICAgIGFyZ3MtPnJlZ3MpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlyZXR1cm4gTk9USUZZX1NUT1A7Cit9CisKK3N0YXRpYyBpbnQKK2tnZGJfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0ID0gX19rZ2RiX25vdGlmeShwdHIsIGNtZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrZ2RiX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0ga2dkYl9ub3RpZnksCisKKwkvKgorCSAqIExvd2VzdC1wcmlvIG5vdGlmaWVyIHByaW9yaXR5LCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIGxhc3Q6CisJICovCisJLnByaW9yaXR5ID0gLUlOVF9NQVgsCit9OworCisvKioKKyAqIGtnZGJfYXJjaF9pbml0IC0gUGVyZm9ybSBhbnkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGluaXRhbGl6YXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgaW5pdGFsaXphdGlvbiBvZiBhbnkgYXJjaGl0ZWN0dXJlCisgKiBzcGVjaWZpYyBjYWxsYmFja3MuCisgKi8KK2ludCBrZ2RiX2FyY2hfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOworfQorCisvKioKKyAqIGtnZGJfYXJjaF9leGl0IC0gUGVyZm9ybSBhbnkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHVuaW5pdGFsaXphdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSB1bmluaXRhbGl6YXRpb24gb2YgYW55IGFyY2hpdGVjdHVyZQorICogc3BlY2lmaWMgY2FsbGJhY2tzLCBmb3IgZHluYW1pYyByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uLgorICovCit2b2lkIGtnZGJfYXJjaF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmtnZGJfbm90aWZpZXIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhNzZiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvbW9kdWxlLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBLZXJuZWwgbW9kdWxlIGxvYWRlciBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm10ICwgLi4uKQorI2VuZGlmCisKKy8qCisgKiBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zIC0gdHdlYWsgZ290L3BsdCBzZWN0aW9ucy4KKyAqIEBoZHIgLSBwb2ludGVyIHRvIGVsZiBoZWFkZXIKKyAqIEBzZWNoZHJzIC0gcG9pbnRlciB0byBlbGYgbG9hZCBzZWN0aW9uIGhlYWRlcnMKKyAqIEBzZWNzdHJpbmdzIC0gc3ltYm9sIG5hbWVzCisgKiBAbW9kIC0gcG9pbnRlciB0byBtb2R1bGUKKyAqLworaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkJY2hhciAqc2Vjc3RyaW5ncywKKwkJCQlzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZvdW5kID0gMDsKKworCS8qIExvb2sgZm9yIC5wbHQgYW5kL29yIC5nb3QucGx0IGFuZC9vciAuaW5pdC5wbHQgc2VjdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKwkJREVCVUdQKCJTZWN0aW9uICVkIGlzICVzXG4iLCBpLAorCQkgICAgICAgc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSk7CisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSwgIi5wbHQiKSA9PSAwKQorCQkJZm91bmQgPSBpKzE7CisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSwgIi5nb3QucGx0IikgPT0gMCkKKwkJCWZvdW5kID0gaSsxOworCQlpZiAoc3RyY21wKHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUsICIucmVsYS5wbHQiKSA9PSAwKQorCQkJZm91bmQgPSBpKzE7CisJfQorCisJLyogQXQgdGhpcyB0aW1lLCB3ZSBkb24ndCBzdXBwb3J0IG1vZHVsZXMgY29taWxlZCB3aXRoIC1zaGFyZWQgKi8KKwlpZiAoZm91bmQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIk1vZHVsZSAnJXMnIGNvbnRhaW5zIHVuZXhwZWN0ZWQgLnBsdC8uZ290IHNlY3Rpb25zLlxuIiwKKwkJCW1vZC0+bmFtZSk7CisJCS8qICByZXR1cm4gLUVOT0VYRUM7ICAqLworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYXBwbHlfcmVsb2NhdGVfYWRkIC0gcGVyZm9ybSByZWxhIHJlbG9jYXRpb25zLgorICogQHNlY2hkcnMgLSBwb2ludGVyIHRvIHNlY3Rpb24gaGVhZGVycworICogQHN0cnRhYiAtIHNvbWUgc29ydCBvZiBzdGFydCBhZGRyZXNzPworICogQHN5bWluZGV4IC0gc3ltYm9sIGluZGV4IG9mZnNldCBvciBzb21ldGhpbmc/CisgKiBAcmVsc2VjIC0gYWRkcmVzcyB0byByZWxvY2F0ZSB0bz8KKyAqIEBtb2R1bGUgLSBwb2ludGVyIHRvIG1vZHVsZQorICoKKyAqIFBlcmZvcm0gcmVsYSByZWxvY2F0aW9ucy4KKyAqLworaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGZfU2hkciAqc2VjaGRycywgY29uc3QgY2hhciAqc3RydGFiLAorCQkJdW5zaWduZWQgaW50IHN5bWluZGV4LCB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkJc3RydWN0IG1vZHVsZSAqbW9kdWxlKQoreworCXVuc2lnbmVkIGludCBpOworCUVsZjMyX1N5bSAqc3ltOworCXVpbnQzMl90ICpsb2NhdGlvbjsKKwl1aW50MzJfdCB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgbnJlbG9jcyA9IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKEVsZjMyX1JlbGEpOworCUVsZjMyX1JlbGEgKnJlbGEgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOworCUVsZjMyX1dvcmQgc3ltX2luZm8gPSBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbzsKKwlFbGYzMl9TeW0gKnN5bV9iYXNlID0gKEVsZjMyX1N5bSAqKSBzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyOworCXZvaWQgKmxvY19iYXNlID0gKHZvaWQgKikgc2VjaGRyc1tzeW1faW5mb10uc2hfYWRkcjsKKworCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGlvbnMgaW4gc2VjdGlvbiAldSB0byBzZWN0aW9uICV1IGJhc2U9JXBcbiIsCisJICAgICAgIHJlbHNlYywgc3ltX2luZm8sIGxvY19iYXNlKTsKKworCWZvciAoaSA9IDA7IGkgPCBucmVsb2NzOyBpKyspIHsKKworCQkvKiBTeW1ib2wgdG8gcmVsb2NhdGUgKi8KKwkJc3ltID0gc3ltX2Jhc2UgKyBFTEYzMl9SX1NZTShyZWxhW2ldLnJfaW5mbyk7CisKKwkJLyogV2hlcmUgdG8gbWFrZSB0aGUgY2hhbmdlICovCisJCWxvY2F0aW9uID0gbG9jX2Jhc2UgKyByZWxhW2ldLnJfb2Zmc2V0OworCisJCS8qIGBFdmVyeXRoaW5nIGlzIHJlbGF0aXZlJy4gKi8KKwkJdmFsdWUgPSBzeW0tPnN0X3ZhbHVlICsgcmVsYVtpXS5yX2FkZGVuZDsKKworCQlERUJVR1AoIiVkOiB2YWx1ZT0lMDh4IGxvYz0lcCByZWxvYz0lZCBzeW1ib2w9JXNcbiIsCisJCSAgICAgICBpLCB2YWx1ZSwgbG9jYXRpb24sIEVMRjMyX1JfVFlQRShyZWxhW2ldLnJfaW5mbyksCisJCSAgICAgICBzeW0tPnN0X25hbWUgPworCQkgICAgICAgJnN0cnRhYltzeW0tPnN0X25hbWVdIDogIihhbm9ueW1vdXMpIik7CisKKwkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsYVtpXS5yX2luZm8pKSB7CisJCWNhc2UgUl9IRVhBR09OX0IyMl9QQ1JFTDogeworCQkJaW50IGRpc3QgPSAoaW50KSh2YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbik7CisJCQlpZiAoKGRpc3QgPCAtMHgwMDgwMDAwMCkgfHwKKwkJCSAgICAoZGlzdCA+PSAweDAwODAwMDAwKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6ICVzOiAlMDh4PSUwOHgtJTA4eCAlc1xuIiwKKwkJCQkgICAgICAgbW9kdWxlLT5uYW1lLAorCQkJCSAgICAgICAiUl9IRVhBR09OX0IyMl9QQ1JFTCByZWxvYyBvdXQgb2YgcmFuZ2UiLAorCQkJCSAgICAgICBkaXN0LCB2YWx1ZSwgKHVpbnQzMl90KWxvY2F0aW9uLAorCQkJCSAgICAgICBzeW0tPnN0X25hbWUgPworCQkJCSAgICAgICAmc3RydGFiW3N5bS0+c3RfbmFtZV0gOiAiKGFub255bW91cykiKTsKKwkJCQlyZXR1cm4gLUVOT0VYRUM7CisJCQl9CisJCQlERUJVR1AoIkIyMl9QQ1JFTCBjb250ZW50czogJTA4WC5cbiIsICpsb2NhdGlvbik7CisJCQkqbG9jYXRpb24gJj0gfjB4MDFmZjNmZmY7CisJCQkqbG9jYXRpb24gfD0gMHgwMDAwM2ZmZiAmIGRpc3Q7CisJCQkqbG9jYXRpb24gfD0gMHgwMWZmMDAwMCAmIChkaXN0PDwyKTsKKwkJCURFQlVHUCgiQ29udGVudHMgYWZ0ZXIgcmVsb2M6ICUwOHhcbiIsICpsb2NhdGlvbik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFJfSEVYQUdPTl9ISTE2OgorCQkJdmFsdWUgPSAodmFsdWU+PjE2KSAmIDB4ZmZmZjsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgUl9IRVhBR09OX0xPMTY6CisJCQkqbG9jYXRpb24gJj0gfjB4MDBjMDNmZmY7CisJCQkqbG9jYXRpb24gfD0gdmFsdWUgJiAweDNmZmY7CisJCQkqbG9jYXRpb24gfD0gKHZhbHVlICYgMHhjMDAwKSA8PCA4OworCQkJYnJlYWs7CisJCWNhc2UgUl9IRVhBR09OXzMyOgorCQkJKmxvY2F0aW9uID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBSX0hFWEFHT05fMzJfUENSRUw6CisJCQkqbG9jYXRpb24gPSB2YWx1ZSAtICh1aW50MzJfdClsb2NhdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIFJfSEVYQUdPTl9QTFRfQjIyX1BDUkVMOgorCQljYXNlIFJfSEVYQUdPTl9HT1RPRkZfTE8xNjoKKwkJY2FzZSBSX0hFWEFHT05fR09UT0ZGX0hJMTY6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHT1QvUExUIHJlbG9jYXRpb25zIHVuc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIG1vZHVsZS0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIHJlbG9jYXRpb246ICV1XG4iLAorCQkJICAgICAgIG1vZHVsZS0+bmFtZSwKKwkJCSAgICAgICBFTEYzMl9SX1RZUEUocmVsYVtpXS5yX2luZm8pKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNGYwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogUHJvY2VzcyBjcmVhdGlvbiBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyoKKyAqIEtlcm5lbCB0aHJlYWQgY3JlYXRpb24uICBUaGUgZGVzaXJlZCBrZXJuZWwgZnVuY3Rpb24gaXMgIndyYXBwZWQiCisgKiBpbiB0aGUga2VybmVsX3RocmVhZF9oZWxwZXIgZnVuY3Rpb24sIHdoaWNoIGRvZXMgY2xlYW51cAorICogYWZ0ZXJ3YXJkcy4KKyAqLworc3RhdGljIHZvaWQgX19ub3JldHVybiBrZXJuZWxfdGhyZWFkX2hlbHBlcih2b2lkICphcmcsIGludCAoKmZuKSh2b2lkICopKQoreworCWRvX2V4aXQoZm4oYXJnKSk7Cit9CisKK2ludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKworCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKKwkvKgorCSAqIFllcywgd2UncmUgZXhwbG90aW5nIGlsbGljaXQga25vd2xlZGdlIG9mIHRoZSBBQkkgaGVyZS4KKwkgKi8KKwlyZWdzLnIwMCA9ICh1bnNpZ25lZCBsb25nKSBhcmc7CisJcmVncy5yMDEgPSAodW5zaWduZWQgbG9uZykgZm47CisJcHRfc2V0X2VscigmcmVncywgKHVuc2lnbmVkIGxvbmcpa2VybmVsX3RocmVhZF9oZWxwZXIpOworCXB0X3NldF9rbW9kZSgmcmVncyk7CisKKwlyZXR1cm4gZG9fZm9yayhmbGFnc3xDTE9ORV9WTXxDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKKworLyoKKyAqIFByb2dyYW0gdGhyZWFkIGxhdW5jaC4gIE9mdGVuIGRlZmluZWQgYXMgYSBtYWNybyBpbiBwcm9jZXNzb3IuaCwKKyAqIGJ1dCB3ZSdyZSBzaG9vdGluZyBmb3IgYSBzbWFsbCBmb290cHJpbnQgYW5kIGl0J3Mgbm90IGFuIGlubmVyLWxvb3AKKyAqIHBlcmZvcm1hbmNlLWNyaXRpY2FsIG9wZXJhdGlvbi4KKyAqCisgKiBUaGUgSGV4YWdvbiBBQkkgc3BlY2lmaWVzIHRoYXQgUjI4IGlzIHplcm8nZWQgYmVmb3JlIHByb2dyYW0gbGF1bmNoLAorICogc28gdGhhdCBnZXRzIGF1dG9tYXRpY2FsbHkgZG9uZSBoZXJlLiAgSWYgd2UgZXZlciBzdG9wIGRvaW5nIHRoYXQgaGVyZSwKKyAqIHdlJ2xsIHByb2JhYmx5IHdhbnQgdG8gZGVmaW5lIHRoZSBFTEZfUExBVF9JTklUIG1hY3JvLgorICovCit2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBzcCkKK3sKKwkvKiBTZXQgdG8gcnVuIHdpdGggdXNlci1tb2RlIGRhdGEgc2VnbWVudGF0aW9uICovCisJc2V0X2ZzKFVTRVJfRFMpOworCS8qIFdlIHdhbnQgdG8gemVybyBhbGwgZGF0YS1jb250YWluaW5nIHJlZ2lzdGVycy4gSXMgdGhpcyBvdmVya2lsbD8gKi8KKwltZW1zZXQocmVncywgMCwgc2l6ZW9mKCpyZWdzKSk7CisJLyogV2UgbWlnaHQgd2FudCB0byBhbHNvIHplcm8gYWxsIFByb2Nlc3NvciByZWdpc3RlcnMgaGVyZSAqLworCXB0X3NldF91c2VybW9kZShyZWdzKTsKKwlwdF9zZXRfZWxyKHJlZ3MsIHBjKTsKKwlwdF9zZXRfcnRlX3NwKHJlZ3MsIHNwKTsKK30KKworLyoKKyAqICBTcGluLCBvciBiZXR0ZXIgc3RpbGwsIGRvIGEgaGFyZHdhcmUgb3IgVk0gd2FpdCBpbnN0cnVjdGlvbgorICogIElmIGhhcmR3YXJlIG9yIFZNIG9mZmVyIHdhaXQgdGVybWluYXRpb24gZXZlbiB0aG91Z2ggaW50ZXJydXB0cworICogIGFyZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCit7CisJX192bXdhaXQoKTsKK30KKwordm9pZCAoKmlkbGVfc2xlZXApKHZvaWQpID0gZGVmYXVsdF9pZGxlOworCit2b2lkIGNwdV9pZGxlKHZvaWQpCit7CisJd2hpbGUgKDEpIHsKKwkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQkJaWRsZV9zbGVlcCgpOworCQkJLyogIGludGVycnVwdHMgd2FrZSB1cyB1cCwgYnV0IGFyZW4ndCBzZXJ2aWNlZCAgKi8KKwkJCWxvY2FsX2lycV9lbmFibGUoKTsJLyogc2VydmljZSBpbnRlcnJ1cHQgICAqLworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJfQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKKwkJc2NoZWR1bGUoKTsKKwl9Cit9CisKKy8qCisgKiAgUmV0dXJuIHNhdmVkIFBDIG9mIGEgYmxvY2tlZCB0aHJlYWQKKyAqLwordW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3B5IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB0aHJlYWQgc3RhdGUKKyAqLworaW50IGNvcHlfdGhyZWFkKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdXNwLAorCQl1bnNpZ25lZCBsb25nIHVudXNlZCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKKwlzdHJ1Y3QgaGV4YWdvbl9zd2l0Y2hfc3RhY2sgKnNzOworCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CisKKwljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCgodW5zaWduZWQgbG9uZykgdGkgKyBUSFJFQURfU0laRSkgLQorCQkJCQlzaXplb2YoKmNoaWxkcmVncykpOworCisJbWVtY3B5KGNoaWxkcmVncywgcmVncywgc2l6ZW9mKCpjaGlsZHJlZ3MpKTsKKwl0aS0+cmVncyA9IGNoaWxkcmVnczsKKworCS8qCisJICogRXN0YWJsaXNoIGtlcm5lbCBzdGFjayBwb2ludGVyIGFuZCBpbml0aWFsIFBDIGZvciBuZXcgdGhyZWFkCisJICovCisJc3MgPSAoc3RydWN0IGhleGFnb25fc3dpdGNoX3N0YWNrICopICgodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzIC0KKwkJCQkJCSAgICBzaXplb2YoKnNzKSk7CisJc3MtPmxyID0gKHVuc2lnbmVkIGxvbmcpcmV0X2Zyb21fZm9yazsKKwlwLT50aHJlYWQuc3dpdGNoX3NwID0gc3M7CisKKwkvKiBJZiBVc2VyIG1vZGUgdGhyZWFkLCBzZXQgcHRfcmVnIHN0YWNrIHBvaW50ZXIgYXMgcGVyIHBhcmFtZXRlciAqLworCWlmICh1c2VyX21vZGUoY2hpbGRyZWdzKSkgeworCQlwdF9zZXRfcnRlX3NwKGNoaWxkcmVncywgdXNwKTsKKworCQkvKiBDaGlsZCBzZWVzIHplcm8gcmV0dXJuIHZhbHVlICovCisJCWNoaWxkcmVncy0+cjAwID0gMDsKKworCQkvKgorCQkgKiBUaGUgY2xvbmUgc3lzY2FsbCBoYXMgdGhlIEMgc2lnbmF0dXJlOgorCQkgKiBpbnQgW3IwXSBjbG9uZShpbnQgZmxhZ3MgW3IwXSwKKwkJICogICAgICAgICAgIHZvaWQgKmNoaWxkX2ZyYW1lIFtyMV0sCisJCSAqICAgICAgICAgICB2b2lkICpwYXJlbnRfdGlkIFtyMl0sCisJCSAqICAgICAgICAgICB2b2lkICpjaGlsZF90aWQgW3IzXSwKKwkJICogICAgICAgICAgIHZvaWQgKnRocmVhZF9jb250cm9sX2Jsb2NrIFtyNF0pOworCQkgKiB1Z3AgaXMgdXNlZCB0byBwcm92aWRlIFRMUyBzdXBwb3J0LgorCQkgKi8KKwkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQorCQkJY2hpbGRyZWdzLT51Z3AgPSBjaGlsZHJlZ3MtPnIwNDsKKworCQkvKgorCQkgKiBQYXJlbnQgc2VlcyBuZXcgcGlkIC0tIG5vdCBuZWNlc3NhcnksIG5vdCBldmVuIHBvc3NpYmxlIGF0CisJCSAqIHRoaXMgcG9pbnQgaW4gdGhlIGZvcmsgcHJvY2VzcworCQkgKiBNaWdodCBhbHNvIHdhbnQgdG8gc2V0IHRoaW5ncyBsaWtlIHRpLT5hZGRyX2xpbWl0CisJCSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIGtlcm5lbCB0aHJlYWQsIHJlc3VtZSBzdGFjayBpcyBrZXJuZWwgc3RhY2sgYmFzZS4KKwkJICogTm90ZSB0aGF0IHRoaXMgaXMgcG9pbnRlciBhcml0aG1ldGljIG9uIHB0X3JlZ3MgKgorCQkgKi8KKwkJcHRfc2V0X3J0ZV9zcChjaGlsZHJlZ3MsICh1bnNpZ25lZCBsb25nKShjaGlsZHJlZ3MgKyAxKSk7CisJCS8qCisJCSAqIFdlIG5lZWQgdGhlIGN1cnJlbnQgdGhyZWFkX2luZm8gZmFzdCBwYXRoIHBvaW50ZXIKKwkJICogc2V0IHVwIGluIHB0X3JlZ3MuICBUaGUgcmVnaXN0ZXIgdG8gYmUgdXNlZCBpcworCQkgKiBwYXJhbWV0cmljIGZvciBhc3NlbWJsZXIgY29kZSwgYnV0IHRoZSBtZWNoYW5pc20KKwkJICogZG9lc24ndCBkcm9wIG5lYXRseSBpbnRvIEMuICBOZWVkcyB0byBiZSBmaXhlZC4KKwkJICovCisJCWNoaWxkcmVncy0+VEhSRUFESU5GT19SRUcgPSAodW5zaWduZWQgbG9uZykgdGk7CisJfQorCisJLyoKKwkgKiB0aHJlYWRfaW5mbyBwb2ludGVyIGlzIHB1bGxlZCBvdXQgb2YgdGFza19zdHJ1Y3QgInN0YWNrIgorCSAqIGZpZWxkIG9uIHN3aXRjaF90by4KKwkgKi8KKwlwLT5zdGFjayA9ICh2b2lkICopdGk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbGVhc2UgYW55IGFyY2hpdGVjdHVyZS1zcGVjaWZpYyByZXNvdXJjZXMgbG9ja2VkIGJ5IHRocmVhZAorICovCit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQoreworfQorCisvKgorICogRnJlZSBhbnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMsIGV0Yy4KKyAqLwordm9pZCBleGl0X3RocmVhZCh2b2lkKQoreworfQorCisvKgorICogU29tZSBhcmNocyBmbHVzaCBkZWJ1ZyBhbmQgRlBVIGluZm8gaGVyZQorICovCit2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQoreworfQorCisvKgorICogVGhlICJ3YWl0IGNoYW5uZWwiIHRlcm1pbm9sb2d5IGlzIGFyY2hhaWMsIGJ1dCB3aGF0IHdlIHdhbnQKKyAqIGlzIGFuIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgc2NoZWR1bGVyCisgKiB3YXMgaW52b2tlZCBieSBhIGJsb2NrZWQgdGhyZWFkLgorICovCit1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJdW5zaWduZWQgbG9uZyBmcCwgcGM7CisJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOworCWludCBjb3VudCA9IDA7CisJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCisJCXJldHVybiAwOworCisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKKwlmcCA9ICgoc3RydWN0IGhleGFnb25fc3dpdGNoX3N0YWNrICopcC0+dGhyZWFkLnN3aXRjaF9zcCktPmZwOworCWRvIHsKKwkJaWYgKGZwIDwgKHN0YWNrX3BhZ2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkgfHwKKwkJCWZwID49IChUSFJFQURfU0laRSAtIDggKyBzdGFja19wYWdlKSkKKwkJCXJldHVybiAwOworCQlwYyA9ICgodW5zaWduZWQgbG9uZyAqKWZwKVsxXTsKKwkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMocGMpKQorCQkJcmV0dXJuIHBjOworCQlmcCA9ICoodW5zaWduZWQgbG9uZyAqKSBmcDsKKwl9IHdoaWxlIChjb3VudCsrIDwgMTYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCb3Jyb3dlZCBmcm9tIFBvd2VyUEMgLS0gYmFzaWNhbGx5IGFsbG93IHNtYWxsZXIga2VybmVsIHN0YWNrcyBpZiB3ZQorICogZ28gY3Jhenkgd2l0aCB0aGUgcGFnZSBzaXplcy4KKyAqLworI2lmIFRIUkVBRF9TSElGVCA8IFBBR0VfU0hJRlQKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp0aHJlYWRfaW5mb19jYWNoZTsKKworc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mb19ub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgbm9kZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOworCisJdGkgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUodGhyZWFkX2luZm9fY2FjaGUsIEdGUF9LRVJORUwsIG5vZGUpOworCWlmICh1bmxpa2VseSh0aSA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCisJbWVtc2V0KHRpLCAwLCBUSFJFQURfU0laRSk7CisjZW5kaWYKKwlyZXR1cm4gdGk7Cit9CisKK3ZvaWQgZnJlZV90aHJlYWRfaW5mbyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQoreworCWttZW1fY2FjaGVfZnJlZSh0aHJlYWRfaW5mb19jYWNoZSwgdGkpOworfQorCisvKiAgV2VhayBzeW1ib2w7IGNhbGxlZCBieSBpbml0L21haW4uYyAgKi8KKwordm9pZCB0aHJlYWRfaW5mb19jYWNoZV9pbml0KHZvaWQpCit7CisJdGhyZWFkX2luZm9fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidGhyZWFkX2luZm8iLCBUSFJFQURfU0laRSwKKwkJCQkJICAgICAgVEhSRUFEX1NJWkUsIDAsIE5VTEwpOworCUJVR19PTih0aHJlYWRfaW5mb19jYWNoZSA9PSBOVUxMKTsKK30KKworI2VuZGlmIC8qIFRIUkVBRF9TSElGVCA8IFBBR0VfU0hJRlQgKi8KKworLyoKKyAqIFJlcXVpcmVkIHBsYWNlaG9sZGVyLgorICovCitpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVsZl9mcHJlZ3NldF90ICpmcHUpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWEzZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9wdHJhY2UuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIFB0cmFjZSBzdXBwb3J0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGdlbmVyYXRlZC9jb21waWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKworc3RhdGljIGludCBnZW5yZWdzX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJICAgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZHVtbXk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKworCisJaWYgKCFyZWdzKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFRoZSBnZW5lcmFsIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSBjb3B5b3V0IG11c3QgaGFwcGVuIGluCisJICogZXhhY3RseSB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGUgdXNlcnNwYWNlIGV4cGVjdHMgdGhlc2UKKwkgKiByZWdzLiBOb3csIHRoZSBzZXF1ZW5jZSBpbiB1c2Vyc3BhY2UgZG9lcyBub3QgbWF0Y2ggdGhlCisJICogc2VxdWVuY2UgaW4gdGhlIGtlcm5lbCwgc28gZXZlcnl0aGluZyBwYXN0IHRoZSAzMiBncHJzCisJICogaGFwcGVucyBvbmUgYXQgYSB0aW1lLgorCSAqLworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICAmcmVncy0+cjAwLCAwLCAzMipzaXplb2YodW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIE9ORVhUKEtQVF9SRUcsIFVTUl9SRUcpIFwKKwlpZiAoIXJldCkgXAorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCBcCisJCQlLUFRfUkVHLCBvZmZzZXRvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwgVVNSX1JFRyksIFwKKwkJCW9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LCBVU1JfUkVHKSArIFwKKwkJCQkgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCS8qIE11c3QgYmUgZXhhY3RseSBzYW1lIHNlcXVlbmNlIGFzIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0ICovCisJT05FWFQoJnJlZ3MtPnNhMCwgc2EwKTsKKwlPTkVYVCgmcmVncy0+bGMwLCBsYzApOworCU9ORVhUKCZyZWdzLT5zYTEsIHNhMSk7CisJT05FWFQoJnJlZ3MtPmxjMSwgbGMxKTsKKwlPTkVYVCgmcmVncy0+bTAsIG0wKTsKKwlPTkVYVCgmcmVncy0+bTEsIG0xKTsKKwlPTkVYVCgmcmVncy0+dXNyLCB1c3IpOworCU9ORVhUKCZyZWdzLT5wcmVkcywgcDNfMCk7CisJT05FWFQoJnJlZ3MtPmdwLCBncCk7CisJT05FWFQoJnJlZ3MtPnVncCwgdWdwKTsKKwlPTkVYVCgmcHRfZWxyKHJlZ3MpLCBwYyk7CisJZHVtbXkgPSBwdF9jYXVzZShyZWdzKTsKKwlPTkVYVCgmZHVtbXksIGNhdXNlKTsKKwlPTkVYVCgmcHRfYmFkdmEocmVncyksIGJhZHZhKTsKKworCS8qIFBhZCB0aGUgcmVzdCB3aXRoIHplcm9zLCBpZiBuZWVkZWQgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dF96ZXJvKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwgcGFkMSksIC0xKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbnJlZ3Nfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgYnVja2V0OworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7CisKKwlpZiAoIXJlZ3MpCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAmcmVncy0+cjAwLCAwLCAzMipzaXplb2YodW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIElORVhUKEtQVF9SRUcsIFVTUl9SRUcpIFwKKwlpZiAoIXJldCkgXAorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIFwKKwkJCUtQVF9SRUcsIG9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LCBVU1JfUkVHKSwgXAorCQkJb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsIFVTUl9SRUcpICsgXAorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkvKiBNdXN0IGJlIGV4YWN0bHkgc2FtZSBzZXF1ZW5jZSBhcyBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCAqLworCUlORVhUKCZyZWdzLT5zYTAsIHNhMCk7CisJSU5FWFQoJnJlZ3MtPmxjMCwgbGMwKTsKKwlJTkVYVCgmcmVncy0+c2ExLCBzYTEpOworCUlORVhUKCZyZWdzLT5sYzEsIGxjMSk7CisJSU5FWFQoJnJlZ3MtPm0wLCBtMCk7CisJSU5FWFQoJnJlZ3MtPm0xLCBtMSk7CisJSU5FWFQoJnJlZ3MtPnVzciwgdXNyKTsKKwlJTkVYVCgmcmVncy0+cHJlZHMsIHAzXzApOworCUlORVhUKCZyZWdzLT5ncCwgZ3ApOworCUlORVhUKCZyZWdzLT51Z3AsIHVncCk7CisJSU5FWFQoJnB0X2VscihyZWdzKSwgcGMpOworCisJLyogQ0FVU0UgYW5kIEJBRFZBIGFyZW4ndCB3cml0ZWFibGUuICovCisJSU5FWFQoJmJ1Y2tldCwgY2F1c2UpOworCUlORVhUKCZidWNrZXQsIGJhZHZhKTsKKworCS8qIElnbm9yZSB0aGUgcmVzdCwgaWYgbmVlZGVkICovCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCW9mZnNldG9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0LCBwYWQxKSwgLTEpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogVGhpcyBpcyBzcGVjaWFsOyBTUCBpcyBhY3R1YWxseSByZXN0b3JlZCBieSB0aGUgVk0gdmlhIHRoZQorCSAqIHNwZWNpYWwgZXZlbnQgcmVjb3JkIHdoaWNoIGlzIHNldCBieSB0aGUgc3BlY2lhbCB0cmFwLgorCSAqLworCXJlZ3MtPmh2bWVyLnZtcHNwID0gcmVncy0+cjI5OworCXJldHVybiAwOworfQorCitlbnVtIGhleGFnb25fcmVnc2V0IHsKKwlSRUdTRVRfR0VORVJBTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgaGV4YWdvbl9yZWdzZXRzW10gPSB7CisJW1JFR1NFVF9HRU5FUkFMXSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCisJCS5uID0gRUxGX05HUkVHLAorCQkuc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJLmFsaWduID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkuZ2V0ID0gZ2VucmVnc19nZXQsCisJCS5zZXQgPSBnZW5yZWdzX3NldCwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3IGhleGFnb25fdXNlcl92aWV3ID0geworCS5uYW1lID0gVVRTX01BQ0hJTkUsCisJLmVfbWFjaGluZSA9IEVMRl9BUkNILAorCS5laV9vc2FiaSA9IEVMRl9PU0FCSSwKKwkucmVnc2V0cyA9IGhleGFnb25fcmVnc2V0cywKKwkubiA9IEFSUkFZX1NJWkUoaGV4YWdvbl9yZWdzZXRzKQorfTsKKworY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZoZXhhZ29uX3VzZXJfdmlldzsKK30KKwordm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCS8qIEJvaWxlcnBsYXRlIC0gcmVzb2x2ZXMgdG8gbnVsbCBpbmxpbmUgaWYgbm8gSFcgc2luZ2xlLXN0ZXAgKi8KKwl1c2VyX2Rpc2FibGVfc2luZ2xlX3N0ZXAoY2hpbGQpOworfQorCitsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKKwkJIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXJldHVybiBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3Jlc2V0LmMgYi9hcmNoL2hleGFnb24va2VybmVsL3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvcmVzZXQuYwpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKK3ZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlzbXBfc2VuZF9zdG9wKCk7CisJX192bXN0b3AoKTsKK30KKwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKK30KKwordm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqY21kKQoreworfQorCit2b2lkIHBtX3Bvd2VyX29mZih2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDJmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3NldHVwLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBBcmNoIHJlbGF0ZWQgc2V0dXAgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorI2luY2x1ZGUgPGFzbS92bV9tbXUuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2lmZGVmIENPTkZJR19PRgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjZW5kaWYKKworY2hhciBjbWRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CitzdGF0aWMgY2hhciBkZWZhdWx0X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV0gX19pbml0ZGF0YSA9IENPTkZJR19DTURMSU5FOworCitpbnQgb25fc2ltdWxhdG9yOworCit2b2lkIF9fY3B1aW5pdCBjYWxpYnJhdGVfZGVsYXkodm9pZCkKK3sKKwlsb29wc19wZXJfamlmZnkgPSB0aHJlYWRfZnJlcV9taHogKiAxMDAwMDAwIC8gSFo7Cit9CisKKy8qCisgKiBzZXR1cF9hcmNoIC0gIGhpZ2ggbGV2ZWwgYXJjaGl0ZWN0dXJhbCBzZXR1cCByb3V0aW5lCisgKiBAY21kbGluZV9wOiBwb2ludGVyIHRvIHBvaW50ZXIgdG8gY29tbWFuZC1saW5lIGFyZ3VtZW50cworICovCisKK3ZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKK3sKKwljaGFyICpwID0gJmV4dGVybmFsX2NtZGxpbmVfYnVmZmVyOworCisJLyoKKwkgKiBUaGVzZSB3aWxsIGV2ZW50dWFsbHkgYmUgcHVsbGVkIGluIHZpYSBlaXRoZXIgc29tZSBoeXBlcnZpc29yCisJICogb3IgZGV2aWNldHJlZSBkZXNjcmlwdGlvbi4gIEhhcmR3aXJpbmcgZm9yIG5vdy4KKwkgKi8KKwlwY3ljbGVfZnJlcV9taHogPSA2MDA7CisJdGhyZWFkX2ZyZXFfbWh6ID0gMTAwOworCXNsZWVwX2Nsa19mcmVxID0gMzIwMDA7CisKKwkvKgorCSAqIFNldCB1cCBldmVudCBiaW5kaW5ncyB0byBoYW5kbGUgZXhjZXB0aW9ucyBhbmQgaW50ZXJydXB0cy4KKwkgKi8KKwlfX3Ztc2V0dmVjKF9LX1ZNX2V2ZW50X3ZlY3Rvcik7CisKKwkvKgorCSAqIFNpbXVsYXRvciBoYXMgYSBmZXcgZGlmZmVyZW5jZXMgZnJvbSB0aGUgaGFyZHdhcmUuCisJICogRm9yIG5vdywgY2hlY2sgdW5pbml0aWFsaXplZC1idXQtbWFwcGVkIG1lbW9yeQorCSAqIHByaW9yIHRvIGludm9raW5nIHNldHVwX2FyY2hfbWVtb3J5KCkuCisJICovCisJaWYgKCooaW50ICopKCh1bnNpZ25lZCBsb25nKV9lbmQgKyA4KSA9PSAweDFmMWYxZjFmKQorCQlvbl9zaW11bGF0b3IgPSAxOworCWVsc2UKKwkJb25fc2ltdWxhdG9yID0gMDsKKworCWlmIChwWzBdICE9ICdcMCcpCisJCXN0cmxjcHkoYm9vdF9jb21tYW5kX2xpbmUsIHAsIENPTU1BTkRfTElORV9TSVpFKTsKKwllbHNlCisJCXN0cmxjcHkoYm9vdF9jb21tYW5kX2xpbmUsIGRlZmF1bHRfY29tbWFuZF9saW5lLAorCQkJQ09NTUFORF9MSU5FX1NJWkUpOworCisJLyoKKwkgKiBib290X2NvbW1hbmRfbGluZSBhbmQgdGhlIHZhbHVlIHNldCB1cCBieSBzZXR1cF9hcmNoCisJICogYXJlIGJvdGggcGlja2VkIHVwIGJ5IHRoZSBpbml0IGNvZGUuIElmIG5vIHJlYXNvbiB0bworCSAqIG1ha2UgdGhlbSBkaWZmZXJlbnQsIHBhc3MgdGhlIHNhbWUgcG9pbnRlciBiYWNrLgorCSAqLworCXN0cmxjcHkoY21kX2xpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJKmNtZGxpbmVfcCA9IGNtZF9saW5lOworCisJcGFyc2VfZWFybHlfcGFyYW0oKTsKKworCXNldHVwX2FyY2hfbWVtb3J5KCk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJc21wX3N0YXJ0X2NwdXMoKTsKKyNlbmRpZgorfQorCisvKgorICogRnVuY3Rpb25zIGZvciBkdW1waW5nIENQVSBpbmZvIHZpYSAvcHJvYworICogUHJvYmFibHkgc2hvdWxkIG1vdmUgdG8ga2VybmVsL3Byb2MuYyBvciBzb21ldGhpbmcuCisgKi8KK3N0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICpwb3MgPCBucl9jcHVfaWRzID8gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpICpwb3MgKyAxKSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpjX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIGNfc3RhcnQobSwgcG9zKTsKK30KKworc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKK30KKworLyoKKyAqIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQKKyAqIENQVSBwcm9wZXJ0aWVzIGxpa2UgSVNBIGxldmVsLCBUTEIgc2l6ZSwgZXRjLgorICovCitzdGF0aWMgaW50IHNob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKSB2IC0gMTsKKworCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIiwgY3B1KTsKKwlzZXFfcHJpbnRmKG0sICJtb2RlbCBuYW1lXHQ6IEhleGFnb24gVmlydHVhbCBNYWNoaW5lXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJCb2dvTWlwc1x0OiAlbHUuJTAybHVcbiIsCisJCShsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwMDAsCisJCSgobG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDApOworCXNlcV9wcmludGYobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworCS5zdGFydCAgPSAmY19zdGFydCwKKwkubmV4dCAgID0gJmNfbmV4dCwKKwkuc3RvcCAgID0gJmNfc3RvcCwKKwkuc2hvdyAgID0gJnNob3dfY3B1aW5mbywKK307CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDViZTMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zaWduYWwuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIFNpZ25hbCBzdXBwb3J0IGZvciBIZXhhZ29uIHByb2Nlc3NvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2lzdGVycy5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS92ZHNvLmg+CisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK3N0cnVjdCBydF9zaWdmcmFtZSB7CisJdW5zaWduZWQgbG9uZyB0cmFtcFsyXTsKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCXN0cnVjdCB1Y29udGV4dCB1YzsKK307CisKK3N0YXRpYyB2b2lkIF9fdXNlciAqZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICBzaXplX3QgZnJhbWVfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+cjI5OworCisJLyogU3dpdGNoIHRvIHNpZ25hbCBzdGFjayBpZiBhcHByb3ByaWF0ZSAqLworCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgKHNhc19zc19mbGFncyhzcCkgPT0gMCkpCisJCXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisKKwlyZXR1cm4gKHZvaWQgX191c2VyICopKChzcCAtIGZyYW1lX3NpemUpICYgfihzaXplb2YobG9uZyBsb25nKSAtIDEpKTsKK30KKworc3RhdGljIGludCBzZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBlcnIgPSAwOworCisJZXJyIHw9IGNvcHlfdG9fdXNlcigmc2MtPnNjX3JlZ3MucjAsICZyZWdzLT5yMDAsCisJCQkgICAgMzIqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnNhMCwgJnNjLT5zY19yZWdzLnNhMCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+bGMwLCAmc2MtPnNjX3JlZ3MubGMwKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5zYTEsICZzYy0+c2NfcmVncy5zYTEpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmxjMSwgJnNjLT5zY19yZWdzLmxjMSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+bTAsICZzYy0+c2NfcmVncy5tMCk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+bTEsICZzYy0+c2NfcmVncy5tMSk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+dXNyLCAmc2MtPnNjX3JlZ3MudXNyKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5wcmVkcywgJnNjLT5zY19yZWdzLnAzXzApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmdwLCAmc2MtPnNjX3JlZ3MuZ3ApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnVncCwgJnNjLT5zY19yZWdzLnVncCk7CisKKwl0bXAgPSBwdF9lbHIocmVncyk7IGVyciB8PSBfX3B1dF91c2VyKHRtcCwgJnNjLT5zY19yZWdzLnBjKTsKKwl0bXAgPSBwdF9jYXVzZShyZWdzKTsgZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAmc2MtPnNjX3JlZ3MuY2F1c2UpOworCXRtcCA9IHB0X2JhZHZhKHJlZ3MpOyBlcnIgfD0gX19wdXRfdXNlcih0bXAsICZzYy0+c2NfcmVncy5iYWR2YSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGVyciA9IDA7CisKKwllcnIgfD0gY29weV9mcm9tX3VzZXIoJnJlZ3MtPnIwMCwgJnNjLT5zY19yZWdzLnIwLAorCQkJICAgICAgMzIgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+c2EwLCAmc2MtPnNjX3JlZ3Muc2EwKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5sYzAsICZzYy0+c2NfcmVncy5sYzApOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPnNhMSwgJnNjLT5zY19yZWdzLnNhMSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+bGMxLCAmc2MtPnNjX3JlZ3MubGMxKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5tMCwgJnNjLT5zY19yZWdzLm0wKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5tMSwgJnNjLT5zY19yZWdzLm0xKTsKKwllcnIgfD0gX19nZXRfdXNlcihyZWdzLT51c3IsICZzYy0+c2NfcmVncy51c3IpOworCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPnByZWRzLCAmc2MtPnNjX3JlZ3MucDNfMCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+Z3AsICZzYy0+c2NfcmVncy5ncCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+dWdwLCAmc2MtPnNjX3JlZ3MudWdwKTsKKworCWVyciB8PSBfX2dldF91c2VyKHRtcCwgJnNjLT5zY19yZWdzLnBjKTsgcHRfc2V0X2VscihyZWdzLCB0bXApOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFNldHVwIHNpZ25hbCBzdGFjayBmcmFtZSB3aXRoIHNpZ2luZm8gc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJCQkgIHNpZ3NldF90ICpzZXQsICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwlzdHJ1Y3QgaGV4YWdvbl92ZHNvICp2ZHNvID0gY3VycmVudC0+bW0tPmNvbnRleHQudmRzbzsKKworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2Yoc3RydWN0IHJ0X3NpZ2ZyYW1lKSk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X3NpZ2ZyYW1lKSkpCisJCWdvdG8Jc2lnc2VndjsKKworCWlmIChjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pKQorCQlnb3RvCXNpZ3NlZ3Y7CisKKwkvKiBUaGUgb24tc3RhY2sgc2lnbmFsIHRyYW1wb2xpbmUgaXMgbm8gbG9uZ2VyIGV4ZWN1dGVkOworCSAqIGhvd2V2ZXIsIHRoZSBsaWJnY2Mgc2lnbmFsIGZyYW1lIHVud2luZGluZyBjb2RlIGNoZWNrcyBmb3IKKwkgKiB0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgdHdvIG51bWVyaWMgbWFnaWMgdmFsdWVzLgorCSAqLworCWVyciB8PSBfX3B1dF91c2VyKDB4NzgwMGQxNjYsICZmcmFtZS0+dHJhbXBbMF0pOworCWVyciB8PSBfX3B1dF91c2VyKDB4NTQwMGMwMDQsICZmcmFtZS0+dHJhbXBbMV0pOworCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlpZiAoZXJyKQorCQlnb3RvIHNpZ3NlZ3Y7CisKKwkvKiBMb2FkIHIwL3IxIHBhaXIgd2l0aCBzaWdudW1iZXIvc2lnaW5mbyBwb2ludGVyLi4uICovCisJcmVncy0+cjAxMDAgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykoKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5pbmZvKSA8PCAzMikKKwkJfCAodW5zaWduZWQgbG9uZyBsb25nKXNpZ25yOworCXJlZ3MtPnIwMiA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCXJlZ3MtPnIzMSA9ICh1bnNpZ25lZCBsb25nKSB2ZHNvLT5ydF9zaWduYWxfdHJhbXBvbGluZTsKKwlwdF9wc3AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJcHRfc2V0X2VscihyZWdzLCAodW5zaWduZWQgbG9uZylrYS0+c2Euc2FfaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKKworc2lnc2VndjoKKwlmb3JjZV9zaWdzZWd2KHNpZ25yLCBjdXJyZW50KTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoKKyAqIFNldHVwIGludm9jYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXIKKyAqLworc3RhdGljIGludCBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmM7CisKKwkvKgorCSAqIElmIHdlJ3JlIGhhbmRsaW5nIGEgc2lnbmFsIHRoYXQgYWJvcnRlZCBhIHN5c3RlbSBjYWxsLAorCSAqIHNldCB1cCB0aGUgZXJyb3IgcmV0dXJuIHZhbHVlIGJlZm9yZSBhZGRpbmcgdGhlIHNpZ25hbAorCSAqIGZyYW1lIHRvIHRoZSBzdGFjay4KKwkgKi8KKworCWlmIChyZWdzLT5zeXNjYWxsX25yID49IDApIHsKKwkJc3dpdGNoIChyZWdzLT5yMDApIHsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJCXJlZ3MtPnIwMCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7CisJCQkJcmVncy0+cjAwID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgorCQkJcmVncy0+cjA2ID0gcmVncy0+c3lzY2FsbF9ucjsKKwkJCXB0X3NldF9lbHIocmVncywgcHRfZWxyKHJlZ3MpIC0gNCk7CisJCQlyZWdzLT5yMDAgPSByZWdzLT5yZXN0YXJ0X3IwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogU2V0IHVwIHRoZSBzdGFjayBmcmFtZTsgbm90IGRvaW5nIHRoZSBTQV9TSUdJTkZPIHRoaW5nLiAgV2UKKwkgKiBvbmx5IHNldCB1cCB0aGUgcnRfZnJhbWUgZmxhdm9yLgorCSAqLworCXJjID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKKworCS8qIElmIHRoZXJlIHdhcyBhbiBlcnJvciBvbiBzZXR1cCwgbm8gc2lnbmFsIHdhcyBkZWxpdmVyZWQuICovCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZyk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSByZXR1cm4tZnJvbS1ldmVudCBjb2RlLgorICovCitzdGF0aWMgdm9pZCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtfc2lnYWN0aW9uIHNpZ2FjdDsKKwlzaWdpbmZvX3QgaW5mbzsKKwlpbnQgc2lnbm87CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcmV0dXJuOworCisJaWYgKHRyeV90b19mcmVlemUoKSkKKwkJZ290byBub19zaWduYWw7CisKKwlzaWdubyA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJnNpZ2FjdCwgcmVncywgTlVMTCk7CisKKwlpZiAoc2lnbm8gPiAwKSB7CisJCXNpZ3NldF90ICpvbGRzZXQ7CisKKwkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKKwkJZWxzZQorCQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CisKKwkJaWYgKGhhbmRsZV9zaWduYWwoc2lnbm8sICZpbmZvLCAmc2lnYWN0LCBvbGRzZXQsIHJlZ3MpID09IDApIHsKKwkJCS8qCisJCQkgKiBTdWNjZXNzZnVsIGRlbGl2ZXJ5IGNhc2UuICBUaGUgc2F2ZWQgc2lnbWFzayBpcworCQkJICogc3RvcmVkIGluIHRoZSBzaWduYWwgZnJhbWUsIGFuZCB3aWxsIGJlIHJlc3RvcmVkCisJCQkgKiBieSBzaWdyZXR1cm4uICBXZSBjYW4gY2xlYXIgdGhlIFRJRiBmbGFnLgorCQkJICovCisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKworCQkJdHJhY2Vob29rX3NpZ25hbF9oYW5kbGVyKHNpZ25vLCAmaW5mbywgJnNpZ2FjdCwgcmVncywKKwkJCQl0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworbm9fc2lnbmFsOgorCS8qCisJICogSWYgd2UgY2FtZSBmcm9tIGEgc3lzdGVtIGNhbGwsIGhhbmRsZSB0aGUgcmVzdGFydC4KKwkgKi8KKwlpZiAocmVncy0+c3lzY2FsbF9uciA+PSAwKSB7CisJCXN3aXRjaCAocmVncy0+cjAwKSB7CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQlyZWdzLT5yMDYgPSByZWdzLT5zeXNjYWxsX25yOworCQkJYnJlYWs7CisJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCXJlZ3MtPnIwNiA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG5vX3Jlc3RhcnQ7CisJCX0KKwkJcHRfc2V0X2VscihyZWdzLCBwdF9lbHIocmVncykgLSA0KTsKKwkJcmVncy0+cjAwID0gcmVncy0+cmVzdGFydF9yMDsKKwl9CisKK25vX3Jlc3RhcnQ6CisJLyogSWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgcHV0IHRoZSBzYXZlZCBzaWdtYXNrIGJhY2sgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9Cit9CisKK3ZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB0aHJlYWRfaW5mb19mbGFncykKK3sKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX1NJR1BFTkRJTkcpCisJCWRvX3NpZ25hbChyZWdzKTsKKworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfTk9USUZZX1JFU1VNRSk7CisJCWlmIChjdXJyZW50LT5yZXBsYWNlbWVudF9zZXNzaW9uX2tleXJpbmcpCisJCQlrZXlfcmVwbGFjZV9zZXNzaW9uX2tleXJpbmcoKTsKKwl9Cit9CisKKy8qCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgd3JhcHBlcnMgZm9yIHNpZ25hbC1yZWxhdGVkIHN5c3RlbSBjYWxscworICovCithc21saW5rYWdlIGludCBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnJlZ3M7CisKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5yMjkpOworfQorCithc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHZvaWQpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnJlZ3M7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJc2lnc2V0X3QgYmxvY2tlZDsKKworCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKilwdF9wc3AocmVncyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoJmJsb2NrZWQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKGJsb2NrZWQpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJmJsb2NrZWQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gYmxvY2tlZDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpKQorCQlnb3RvIGJhZGZyYW1lOworCisJLyogUmVzdG9yZSB0aGUgdXNlcidzIHN0YWNrIGFzIHdlbGwgKi8KKwlwdF9wc3AocmVncykgPSByZWdzLT5yMjk7CisKKwkvKgorCSAqIExlYXZlIGEgdHJhY2UgaW4gdGhlIHN0YWNrIGZyYW1lIHRoYXQgdGhpcyB3YXMgYSBzaWdyZXR1cm4uCisJICogSWYgdGhlIHN5c3RlbSBjYWxsIGlzIHRvIHJlcGxheSwgd2UndmUgYWxyZWFkeSByZXN0b3JlZCB0aGUKKwkgKiBudW1iZXIgaW4gdGhlIEdQUiBzbG90IGFuZCBpdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIG9uIHRoZQorCSAqIG5ldyBzeXN0ZW0gY2FsbCB0cmFwIGVudHJ5LiBOb3RlIHRoYXQgaWYgcmVzdG9yZV9zaWdjb250ZXh0KCkKKwkgKiBkaWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBidWxrIGNvcHkgb2YgdGhlIHB0X3JlZ3Mgc3RydWN0LAorCSAqIHdlIGNvdWxkIGF2b2lkIHRoaXMgYXNzaWdubWVudCBieSBzaW1wbHkgbm90IG92ZXJ3cml0aW5nCisJICogcmVncy0+c3lzY2FsbF9uci4KKwkgKi8KKwlyZWdzLT5zeXNjYWxsX25yID0gX19OUl9ydF9zaWdyZXR1cm47CisKKwkvKgorCSAqIElmIHdlIHdlcmUgbWV0aWN1bG91cywgd2UnZCBvbmx5IGNhbGwgdGhpcyBpZiB3ZSBrbmV3IHRoYXQKKwkgKiB3ZSB3ZXJlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSBhbiBhbHRlcm5hdGUgc3RhY2ssIGFuZCB3ZSdkCisJICogY29uc2lkZXIgYW55IGVycm9yIHRvIGJlIGZhdGFsLiAgV2hhdCB3ZSBkbyBoZXJlLCBpbiBjb21tb24KKwkgKiB3aXRoIG1hbnkgb3RoZXIgYXJjaGl0ZWN0dXJlcywgaXMgY2FsbCBpdCBibGluZGx5IGFuZCBvbmx5CisJICogY29uc2lkZXIgdGhlIC1FRkFVTFQgcmV0dXJuIGNhc2UgdG8gYmUgcHJvb2Ygb2YgYSBwcm9ibGVtLgorCSAqLworCWlmIChkb19zaWdhbHRzdGFjaygmZnJhbWUtPnVjLnVjX3N0YWNrLCBOVUxMLCBwdF9wc3AocmVncykpID09IC1FRkFVTFQpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlyZXR1cm4gMDsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9zbXAuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MWEyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc21wLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBTTVAgc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+ICAvKiAgeGNoZyAgKi8KKyNpbmNsdWRlIDxhc20vdGltZS5oPiAgICAvKiAgdGltZXJfaW50ZXJydXB0ICAqLworI2luY2x1ZGUgPGFzbS9oZXhhZ29uX3ZtLmg+CisKKyNkZWZpbmUgQkFTRV9JUElfSVJRIDI2CisKKy8qCisgKiBjcHVfcG9zc2libGVfbWFwIG5lZWRzIHRvIGJlIGZpbGxlZCBvdXQgcHJpb3IgdG8gc2V0dXBfcGVyX2NwdV9hcmVhcworICogKHdoaWNoIGlzIHByaW9yIHRvIGFueSBvZiBvdXIgc21wX3ByZXBhcmVfY3B1IGNyYXApLCBpbiBvcmRlciB0byBzZXQKKyAqIHVwIHRoZS4uLiAgcGVyX2NwdSBhcmVhcy4KKyAqLworCitzdHJ1Y3QgaXBpX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgYml0czsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBpX2RhdGEsIGlwaV9kYXRhKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9faGFuZGxlX2lwaSh1bnNpZ25lZCBsb25nICpvcHMsIHN0cnVjdCBpcGlfZGF0YSAqaXBpLAorCQkJCWludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBtc2cgPSAwOworCWRvIHsKKwkJbXNnID0gZmluZF9uZXh0X2JpdChvcHMsIEJJVFNfUEVSX0xPTkcsIG1zZysxKTsKKworCQlzd2l0Y2ggKG1zZykgeworCisJCWNhc2UgSVBJX1RJTUVSOgorCQkJaXBpX3RpbWVyKCk7CisJCQlicmVhazsKKworCQljYXNlIElQSV9DQUxMX0ZVTkM6CisJCQlnZW5lcmljX3NtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUElfQ0FMTF9GVU5DX1NJTkdMRToKKwkJCWdlbmVyaWNfc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUElfQ1BVX1NUT1A6CisJCQkvKgorCQkJICogY2FsbCB2bXN0b3AoKQorCQkJICovCisJCQlfX3Ztc3RvcCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUElfUkVTQ0hFRFVMRToKKwkJCXNjaGVkdWxlcl9pcGkoKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAobXNnIDwgQklUU19QRVJfTE9ORyk7Cit9CisKKy8qICBVc2VkIGZvciBJUEkgY2FsbCBmcm9tIG90aGVyIENQVSdzIHRvIHVubWFzayBpbnQgICovCit2b2lkIHNtcF92bV91bm1hc2tfaXJxKHZvaWQgKmluZm8pCit7CisJX192bWludG9wX2xvY2VuKChsb25nKSBpbmZvKTsKK30KKworCisvKgorICogVGhpcyBpcyBiYXNlZCBvbiBBbHBoYSdzIElQSSBzdHVmZi4KKyAqIFN1cHBvc2VkIHRvIHRha2UgKGludCwgdm9pZCopIGFzIGFyZ3Mgbm93LgorICogU3BlY2lmaWNhbGx5LCBmaXJzdCBhcmcgaXMgaXJxLCBzZWNvbmQgaXMgdGhlIGlycV9kZXNjLgorICovCisKK2lycXJldHVybl90IGhhbmRsZV9pcGkoaW50IGlycSwgdm9pZCAqZGVzYykKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBpcGlfZGF0YSAqaXBpID0gJnBlcl9jcHUoaXBpX2RhdGEsIGNwdSk7CisJdW5zaWduZWQgbG9uZyBvcHM7CisKKwl3aGlsZSAoKG9wcyA9IHhjaGcoJmlwaS0+Yml0cywgMCkpICE9IDApCisJCV9faGFuZGxlX2lwaSgmb3BzLCBpcGksIGNwdSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCit2b2lkIHNlbmRfaXBpKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLCBlbnVtIGlwaV9tZXNzYWdlX3R5cGUgbXNnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjcHU7CisJdW5zaWduZWQgbG9uZyByZXR2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3JfZWFjaF9jcHUoY3B1LCBjcHVtYXNrKSB7CisJCXN0cnVjdCBpcGlfZGF0YSAqaXBpID0gJnBlcl9jcHUoaXBpX2RhdGEsIGNwdSk7CisKKwkJc2V0X2JpdChtc2csICZpcGktPmJpdHMpOworCQkvKiAgUG9zc2libGUgYmFycmllciBoZXJlICAqLworCQlyZXR2YWwgPSBfX3ZtaW50b3BfcG9zdChCQVNFX0lQSV9JUlErY3B1KTsKKworCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0ICVsZCBub3QgY29uZmlndXJlZD9cbiIsCisJCQkJQkFTRV9JUElfSVJRK2NwdSk7CisJCX0KKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlwaV9pbnRkZXNjID0geworCS5oYW5kbGVyID0gaGFuZGxlX2lwaSwKKwkuZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HLAorCS5uYW1lID0gImlwaV9oYW5kbGVyIgorfTsKKwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKK3sKK30KKworLyoKKyAqIGludGVycnVwdHMgc2hvdWxkIGFscmVhZHkgYmUgZGlzYWJsZWQgZnJvbSB0aGUgVk0KKyAqIFNQIHNob3VsZCBhbHJlYWR5IGJlIGNvcnJlY3Q7IG5lZWQgdG8gc2V0IFRIUkVBRElORk9fUkVHCisgKiB0byBwb2ludCB0byBjdXJyZW50IHRocmVhZCBpbmZvCisgKi8KKwordm9pZCBfX2NwdWluaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIHRocmVhZF9wdHI7CisKKwkvKiAgQ2FsY3VsYXRlIHRocmVhZF9pbmZvIHBvaW50ZXIgZnJvbSBzdGFjayBwb2ludGVyICAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiJTAgPSBTUDtcbiIKKwkJOiAiPXIiICh0aHJlYWRfcHRyKQorCSk7CisKKwl0aHJlYWRfcHRyID0gdGhyZWFkX3B0ciAmIH4oVEhSRUFEX1NJWkUtMSk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJUVVPVEVEX1RIUkVBRElORk9fUkVHICIgPSAlMDtcbiIKKwkJOgorCQk6ICJyIiAodGhyZWFkX3B0cikKKwkpOworCisJLyogIFNldCB0aGUgbWVtb3J5IHN0cnVjdCAgKi8KKwlhdG9taWNfaW5jKCZpbml0X21tLm1tX2NvdW50KTsKKwljdXJyZW50LT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXNldHVwX2lycShCQVNFX0lQSV9JUlEgKyBjcHUsICZpcGlfaW50ZGVzYyk7CisKKwkvKiAgUmVnaXN0ZXIgdGhlIGNsb2NrX2V2ZW50IGR1bW15ICAqLworCXNldHVwX3BlcmNwdV9jbG9ja2RldigpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY3B1ICVkXG4iLCBfX2Z1bmNfXywgY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUpOworCisJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKKwl3aGlsZSAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfYWN0aXZlX21hc2spKQorCQljcHVfcmVsYXgoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwljcHVfaWRsZSgpOworfQorCisKKy8qCisgKiBjYWxsZWQgb25jZSBmb3IgZWFjaCBwcmVzZW50IGNwdQorICogYXBwYXJlbnRseSBzdGFydHMgdXAgdGhlIENQVSBhbmQgdGhlbgorICogbWFpbnRhaW5zIGNvbnRyb2wgdW50aWwgImNwdV9vbmxpbmUoY3B1KSIgaXMgc2V0LgorICovCisKK2ludCBfX2NwdWluaXQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQ7CisJdm9pZCAqc3RhY2tfc3RhcnQ7CisKKwkvKiAgQ3JlYXRlIG5ldyBpbml0IHRhc2sgZm9yIHRoZSBDUFUgICovCisJaWRsZSA9IGZvcmtfaWRsZShjcHUpOworCWlmIChJU19FUlIoaWRsZSkpCisJCXBhbmljKEtFUk5fRVJSICJmb3JrX2lkbGUgZmFpbGVkXG4iKTsKKworCXRocmVhZCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKilpZGxlLT5zdGFjazsKKwl0aHJlYWQtPmNwdSA9IGNwdTsKKworCS8qICBCb290IHRvIHRoZSBoZWFkLiAgKi8KKwlzdGFja19zdGFydCA9ICAoKHZvaWQgKikgdGhyZWFkKSArIFRIUkVBRF9TSVpFOworCV9fdm1zdGFydChzdGFydF9zZWNvbmRhcnksIHN0YWNrX3N0YXJ0KTsKKworCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQorCQliYXJyaWVyKCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBpOworCisJLyoKKwkgKiBzaG91bGQgZXZlbnR1YWxseSBoYXZlIHNvbWUgc29ydCBvZiBtYWNoaW5lCisJICogZGVzY3JpcHRvciB0aGF0IGhhcyB0aGlzIHN0dWZmCisJICovCisKKwkvKiAgUmlnaHQgbm93LCBsZXQncyBqdXN0IGZha2UgaXQuICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCisJCWNwdV9zZXQoaSwgY3B1X3ByZXNlbnRfbWFwKTsKKworCS8qICBBbHNvIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGludGVycnVwdHMgZm9yIElQSSAgKi8KKwlpZiAobWF4X2NwdXMgPiAxKQorCQlzZXR1cF9pcnEoQkFTRV9JUElfSVJRLCAmaXBpX2ludGRlc2MpOworfQorCit2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKwlzZW5kX2lwaShjcHVtYXNrX29mKGNwdSksIElQSV9SRVNDSEVEVUxFKTsKK30KKwordm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJc3RydWN0IGNwdW1hc2sgdGFyZ2V0czsKKwljcHVtYXNrX2NvcHkoJnRhcmdldHMsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCAmdGFyZ2V0cyk7CisJc2VuZF9pcGkoJnRhcmdldHMsIElQSV9DUFVfU1RPUCk7Cit9CisKK3ZvaWQgYXJjaF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KQoreworCXNlbmRfaXBpKGNwdW1hc2tfb2YoY3B1KSwgSVBJX0NBTExfRlVOQ19TSU5HTEUpOworfQorCit2b2lkIGFyY2hfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaV9tYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCXNlbmRfaXBpKG1hc2ssIElQSV9DQUxMX0ZVTkMpOworfQorCitpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIHNtcF9zdGFydF9jcHVzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3N0YWNrdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWM1OTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFN0YWNrdHJhY2Ugc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCityZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1cnJlbnRfZnJhbWVfcG9pbnRlciBhc20oInIzMCIpOworCitzdHJ1Y3Qgc3RhY2tmcmFtZSB7CisJdW5zaWduZWQgbG9uZyBmcDsKKwl1bnNpZ25lZCBsb25nIHJldHM7Cit9OworCisvKgorICogU2F2ZSBzdGFjay1iYWNrdHJhY2UgYWRkcmVzc2VzIGludG8gYSBzdGFja190cmFjZSBidWZmZXIuCisgKi8KK3ZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQoreworCXVuc2lnbmVkIGxvbmcgbG93LCBoaWdoOworCXVuc2lnbmVkIGxvbmcgZnA7CisJc3RydWN0IHN0YWNrZnJhbWUgKmZyYW1lOworCWludCBza2lwID0gdHJhY2UtPnNraXA7CisKKwlsb3cgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCk7CisJaGlnaCA9IGxvdyArIFRIUkVBRF9TSVpFOworCWZwID0gY3VycmVudF9mcmFtZV9wb2ludGVyOworCisJd2hpbGUgKGZwID49IGxvdyAmJiBmcCA8PSAoaGlnaCAtIHNpemVvZigqZnJhbWUpKSkgeworCQlmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tmcmFtZSAqKWZwOworCisJCWlmIChza2lwKSB7CisJCQlza2lwLS07CisJCX0gZWxzZSB7CisJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGZyYW1lLT5yZXRzOworCQkJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKKwkJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBuZXh0IGZyYW1lIG11c3QgYmUgYXQgYSBoaWdoZXIgYWRkcmVzcyB0aGFuIHRoZQorCQkgKiBjdXJyZW50IGZyYW1lLgorCQkgKi8KKwkJbG93ID0gZnAgKyBzaXplb2YoKmZyYW1lKTsKKwkJZnAgPSBmcmFtZS0+ZnA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3N5c2NhbGwuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3lzY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGRkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3N5c2NhbGwuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogSGV4YWdvbiBzeXN0ZW0gY2FsbHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vbW1hbi5oPgorI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKworLyoKKyAqIFN5c3RlbSBjYWxscyB3aXRoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB3cmFwcGVycy4KKyAqIFNlZSBzaWduYWwuYyBmb3Igc2lnbmFsLXJlbGF0ZWQgc3lzdGVtIGNhbGwgd3JhcHBlcnMuCisgKi8KKworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqdWZpbGVuYW1lLAorCQkJICBjb25zdCBjaGFyIF9fdXNlciAqY29uc3QgX191c2VyICphcmd2LAorCQkJICBjb25zdCBjaGFyIF9fdXNlciAqY29uc3QgX191c2VyICplbnZwKQoreworCXN0cnVjdCBwdF9yZWdzICpwcmVncyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVnczsKKwljaGFyICpmaWxlbmFtZTsKKwlpbnQgcmV0dmFsOworCisJZmlsZW5hbWUgPSBnZXRuYW1lKHVmaWxlbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUihmaWxlbmFtZSk7CisJaWYgKElTX0VSUihmaWxlbmFtZSkpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBkb19leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnAsIHByZWdzKTsKKwlwdXRuYW1lKGZpbGVuYW1lKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld3NwLAorCQkJIHVuc2lnbmVkIGxvbmcgcGFyZW50X3RpZHAsIHVuc2lnbmVkIGxvbmcgY2hpbGRfdGlkcCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnJlZ3M7CisKKwlpZiAoIW5ld3NwKQorCQluZXdzcCA9IHByZWdzLT5TUDsKKwlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsIHByZWdzLCAwLCAoaW50IF9fdXNlciAqKXBhcmVudF90aWRwLAorCQkgICAgICAgKGludCBfX3VzZXIgKiljaGlsZF90aWRwKTsKK30KKworLyoKKyAqIERvIGEgc3lzdGVtIGNhbGwgZnJvbSB0aGUga2VybmVsLCBzbyBhcyB0byBoYXZlIGEgcHJvcGVyIHB0X3JlZ3MKKyAqIGFuZCByZWN5Y2xlIHRoZSBzeXNfZXhlY3ZwZSBpbmZydXN0cnVjdHVyZS4KKyAqLworaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCSAgY29uc3QgY2hhciAqY29uc3QgYXJndltdLCBjb25zdCBjaGFyICpjb25zdCBlbnZwW10pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgicjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmaWxlbmFtZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTEgYXNtKCJyMSIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZ3Y7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgicjIiKSA9ICh1bnNpZ25lZCBsb25nKSBlbnZwOworCWludCByZXR2YWw7CisKKwlfX2FzbV9fIHZvbGF0aWxlKAorCQkiCVI2ID0gIyU0O1xuIgorCQkiCXRyYXAwKCMxKTtcbiIKKwkJIgklMCA9IFIwO1xuIgorCQk6ICI9ciIgKHJldHZhbCkKKwkJOiAiciIgKF9fYTApLCAiciIgKF9fYTEpLCAiciIgKF9fYTIpLCAiaSIgKF9fTlJfZXhlY3ZlKQorCSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfZXhlY3ZlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3lzY2FsbHRhYi5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC9zeXNjYWxsdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1MGY0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvc3lzY2FsbHRhYi5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBTeXN0ZW0gY2FsbCB0YWJsZSBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c2NhbGwuaD4KKworI3VuZGVmIF9fU1lTQ0FMTAorI2RlZmluZSBfX1NZU0NBTEwobnIsIGNhbGwpIFtucl0gPSAoY2FsbCksCisKK3ZvaWQgKnN5c19jYWxsX3RhYmxlW19fTlJfc3lzY2FsbHNdID0geworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KK307CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3RpbWUuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWUxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3RpbWUuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIFRpbWUgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIEhleGFnb24gYXJjaGl0ZWN0dXJlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lci1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworLyoKKyAqIEZvciB0aGUgY2xvY2tzb3VyY2Ugd2UgbmVlZDoKKyAqCXBjeWNsZSBmcmVxdWVuY3kgKDYwME1IeikKKyAqIEZvciB0aGUgbG9vcHNfcGVyX2ppZmZ5IHdlIG5lZWQ6CisgKgl0aHJlYWQvY3B1IGZyZXF1ZW5jeSAoMTAwTUh6KQorICogQW5kIGZvciB0aGUgdGltZXIsIHdlIG5lZWQ6CisgKglzbGVlcCBjbG9jayByYXRlCisgKi8KKworY3ljbGVzX3QJcGN5Y2xlX2ZyZXFfbWh6OworY3ljbGVzX3QJdGhyZWFkX2ZyZXFfbWh6OworY3ljbGVzX3QJc2xlZXBfY2xrX2ZyZXE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRvc190aW1lcl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IFJUT1NfVElNRVJfUkVHU19BRERSLAorCQkuZW5kCT0gUlRPU19USU1FUl9SRUdTX0FERFIrUEFHRV9TSVpFLTEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydG9zX3RpbWVyX2RldmljZSA9IHsKKwkubmFtZQkJPSAicnRvc190aW1lciIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShydG9zX3RpbWVyX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRvc190aW1lcl9yZXNvdXJjZXMsCit9OworCisvKiAgQSBsb3Qgb2YgdGhpcyBzdHVmZiBzaG91bGQgbW92ZSBpbnRvIGEgcGxhdGZvcm0gc3BlY2lmaWMgc2VjdGlvbi4gICovCitzdHJ1Y3QgYWRzcF9od190aW1lcl9zdHJ1Y3QgeworCXUzMiBtYXRjaDsgICAvKiAgTWF0Y2ggdmFsdWUgICovCisJdTMyIGNvdW50OworCXUzMiBlbmFibGU7ICAvKiAgWzFdIC0gQ0xSX09OX01BVENIX0VOLCBbMF0gLSBFTiAgKi8KKwl1MzIgY2xlYXI7ICAgLyogIG9uZS1zaG90IHJlZ2lzdGVyIHRoYXQgY2xlYXJzIHRoZSBjb3VudCAgKi8KK307CisKKy8qICBMb29rIGZvciAiVENYMCIgZm9yIHJlbGF0ZWQgY29uc3RhbnRzLiAgKi8KK3N0YXRpYyBfX2lvbWVtIHN0cnVjdCBhZHNwX2h3X3RpbWVyX3N0cnVjdCAqcnRvc190aW1lcjsKKworc3RhdGljIGN5Y2xlX3QgdGltZXJfZ2V0X2N5Y2xlcyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXJldHVybiAoY3ljbGVfdCkgX192bWdldHRpbWUoKTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBoZXhhZ29uX2Nsb2Nrc291cmNlID0geworCS5uYW1lCQk9ICJwY3ljbGVzIiwKKwkucmF0aW5nCQk9IDI1MCwKKwkucmVhZAkJPSB0aW1lcl9nZXRfY3ljbGVzLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKK307CisKK3N0YXRpYyBpbnQgc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQoreworCS8qICBBc3N1bWluZyB0aGUgdGltZXIgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIHdlIGVudGVyIGhlcmUuICAqLworCisJaW93cml0ZTMyKDEsICZydG9zX3RpbWVyLT5jbGVhcik7CisJaW93cml0ZTMyKDAsICZydG9zX3RpbWVyLT5jbGVhcik7CisKKwlpb3dyaXRlMzIoZGVsdGEsICZydG9zX3RpbWVyLT5tYXRjaCk7CisJaW93cml0ZTMyKDEgPDwgVElNRVJfRU5BQkxFLCAmcnRvc190aW1lci0+ZW5hYmxlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldHMgdGhlIG1vZGUgKHBlcmlvZGljLCBzaHV0ZG93biwgb25lc2hvdCwgZXRjKSBvZiBhIHRpbWVyLgorICovCitzdGF0aWMgdm9pZCBzZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJLyogWFhYIGltcGxlbWVudCBtZSAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworI2lmZGVmIENPTkZJR19TTVAKKy8qICBCcm9hZGNhc3QgbWVjaGFuaXNtICAqLworc3RhdGljIHZvaWQgYnJvYWRjYXN0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCXNlbmRfaXBpKG1hc2ssIElQSV9USU1FUik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgaGV4YWdvbl9jbG9ja2V2ZW50X2RldiA9IHsKKwkubmFtZQkJPSAiY2xvY2tldmVudCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkucmF0aW5nCQk9IDQwMCwKKwkuaXJxCQk9IFJUT1NfVElNRVJfSU5ULAorCS5zZXRfbmV4dF9ldmVudCA9IHNldF9uZXh0X2V2ZW50LAorCS5zZXRfbW9kZQk9IHNldF9tb2RlLAorI2lmZGVmIENPTkZJR19TTVAKKwkuYnJvYWRjYXN0CT0gYnJvYWRjYXN0LAorI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGNsb2NrX2V2ZW50cyk7CisKK3ZvaWQgc2V0dXBfcGVyY3B1X2Nsb2NrZGV2KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZV9kZXYgPSAmaGV4YWdvbl9jbG9ja2V2ZW50X2RldjsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkdW1teV9jbG9ja19kZXYgPQorCQkmcGVyX2NwdShjbG9ja19ldmVudHMsIGNwdSk7CisKKwltZW1jcHkoZHVtbXlfY2xvY2tfZGV2LCBjZV9kZXYsIHNpemVvZigqZHVtbXlfY2xvY2tfZGV2KSk7CisJSU5JVF9MSVNUX0hFQUQoJmR1bW15X2Nsb2NrX2Rldi0+bGlzdCk7CisKKwlkdW1teV9jbG9ja19kZXYtPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfRFVNTVk7CisJZHVtbXlfY2xvY2tfZGV2LT5jcHVtYXNrID0gY3B1bWFza19vZihjcHUpOworCWR1bW15X2Nsb2NrX2Rldi0+bW9kZSA9IENMT0NLX0VWVF9NT0RFX1VOVVNFRDsKKworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShkdW1teV9jbG9ja19kZXYpOworfQorCisvKiAgQ2FsbGVkIGZyb20gc21wLmMgZm9yIGVhY2ggQ1BVJ3MgdGltZXIgaXBpIGNhbGwgICovCit2b2lkIGlwaV90aW1lcih2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VfZGV2ID0gJnBlcl9jcHUoY2xvY2tfZXZlbnRzLCBjcHUpOworCisJY2VfZGV2LT5ldmVudF9oYW5kbGVyKGNlX2Rldik7Cit9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlX2RldiA9ICZoZXhhZ29uX2Nsb2NrZXZlbnRfZGV2OworCisJaW93cml0ZTMyKDAsICZydG9zX3RpbWVyLT5lbmFibGUpOworCWNlX2Rldi0+ZXZlbnRfaGFuZGxlcihjZV9kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAgVGhpcyBzaG91bGQgYWxzbyBiZSBwdWxsZWQgZnJvbSBkZXZ0cmVlICAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcnRvc190aW1lcl9pbnRkZXNjID0geworCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAorCS5mbGFncyA9IElSUUZfVElNRVIgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCS5uYW1lID0gInJ0b3NfdGltZXIiCit9OworCisvKgorICogdGltZV9pbml0X2RlZmVycmVkIC0gY2FsbGVkIGJ5IHN0YXJ0X2tlcm5lbCB0byBzZXQgdXAgdGltZXIvY2xvY2sgc291cmNlCisgKgorICogSW5zdGFsbCB0aGUgSVJRIGhhbmRsZXIgZm9yIHRoZSBjbG9jaywgc2V0dXAgdGltZXJzLgorICogVGhpcyBpcyBkb25lIGxhdGUsIGFzIHRoYXQgd2F5LCB3ZSBjYW4gdXNlIGlvcmVtYXAoKS4KKyAqCisgKiBUaGlzIHJ1bnMganVzdCBiZWZvcmUgdGhlIGRlbGF5IGxvb3AgaXMgY2FsaWJyYXRlZCwgYW5kCisgKiBpcyB1c2VkIGZvciBkZWxheSBjYWxpYnJhdGlvbi4KKyAqLwordm9pZCBfX2luaXQgdGltZV9pbml0X2RlZmVycmVkKHZvaWQpCit7CisJc3RydWN0IHJlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VfZGV2ID0gJmhleGFnb25fY2xvY2tldmVudF9kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwlpbnQgZXJyOworCisJY2VfZGV2LT5jcHVtYXNrID0gY3B1X2FsbF9tYXNrOworCisJaWYgKCFyZXNvdXJjZSkKKwkJcmVzb3VyY2UgPSBydG9zX3RpbWVyX2RldmljZS5yZXNvdXJjZTsKKworCS8qICBpb3JlbWFwIGhlcmUgbWVhbnMgdGhpcyBoYXMgdG8gcnVuIGxhdGVyLCBhZnRlciBwYWdpbmcgaW5pdCAgKi8KKwlydG9zX3RpbWVyID0gaW9yZW1hcChyZXNvdXJjZS0+c3RhcnQsIHJlc291cmNlLT5lbmQKKwkJLSByZXNvdXJjZS0+c3RhcnQgKyAxKTsKKworCWlmICghcnRvc190aW1lcikgeworCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzb3VyY2UtPnN0YXJ0LCByZXNvdXJjZS0+ZW5kCisJCQktIHJlc291cmNlLT5zdGFydCArIDEpOworCX0KKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9raHooJmhleGFnb25fY2xvY2tzb3VyY2UsIHBjeWNsZV9mcmVxX21oeiAqIDEwMDApOworCisJLyogIE5vdGU6IHRoZSBzaW0gZ2VuZXJpYyBSVE9TIGNsb2NrIGlzIGFwcGFyZW50bHkgcmVhbGx5IDE4NzUwSHogICovCisKKwkvKgorCSAqIExhc3QgYXJnIGlzIHNvbWUgZ3VhcmFudGVlZCBzZWNvbmRzIGZvciB3aGljaCB0aGUgY29udmVyc2lvbiB3aWxsCisJICogd29yayB3aXRob3V0IG92ZXJmbG93LgorCSAqLworCWNsb2NrZXZlbnRzX2NhbGNfbXVsdF9zaGlmdChjZV9kZXYsIHNsZWVwX2Nsa19mcmVxLCA0KTsKKworCWNlX2Rldi0+bWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweDdmZmZmZmZmLCBjZV9kZXYpOworCWNlX2Rldi0+bWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweGYsIGNlX2Rldik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJc2V0dXBfcGVyY3B1X2Nsb2NrZGV2KCk7CisjZW5kaWYKKworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShjZV9kZXYpOworCXNldHVwX2lycShjZV9kZXYtPmlycSwgJnJ0b3NfdGltZXJfaW50ZGVzYyk7Cit9CisKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworCWxhdGVfdGltZV9pbml0ID0gdGltZV9pbml0X2RlZmVycmVkOworfQorCisvKgorICogVGhpcyBjb3VsZCBiZWNvbWUgcGFyYW1ldHJpYyBvciBwZXJoYXBzIGV2ZW4gY29tcHV0ZWQgYXQgcnVuLXRpbWUsCisgKiBidXQgZm9yIG5vdyB3ZSB0YWtlIHRoZSBvYnNlcnZlZCBzaW11bGF0b3Igaml0dGVyLgorICovCitzdGF0aWMgbG9uZyBsb25nIGZ1ZGdlZmFjdG9yID0gMzUwOyAgLyogTWF5YmUgbG93ZXIgaWYga2VybmVsIG9wdGltaXplZC4gKi8KKwordm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IF9fdm1nZXR0aW1lKCk7CisJdW5zaWduZWQgbG9uZyBsb25nIGZpbmlzaCA9IChwY3ljbGVfZnJlcV9taHogKiB1c2VjcykgLSBmdWRnZWZhY3RvcjsKKworCXdoaWxlICgoX192bWdldHRpbWUoKSAtIHN0YXJ0KSA8IGZpbmlzaCkKKwkJY3B1X3JlbGF4KCk7IC8qICBub3Qgc3VyZSBob3cgdGhpcyBpbXByb3ZlcyByZWFkYWJpbGl0eSAgKi8KK30KK0VYUE9SVF9TWU1CT0woX191ZGVsYXkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC90b3BvbG9neS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDQ3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENQVSB0b3BvbG9neSBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCisvKiAgU3dpcGVkIGZyb20gTUlQUy4gICovCisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkgeworCisJCS8qCisJCSAqIHJlZ2lzdGVyX2NwdSB0YWtlcyBhIHBlcl9jcHUgcG9pbnRlciBhbmQKKwkJICoganVzdCBwb2ludHMgaXQgYXQgYW5vdGhlciBwZXJfY3B1IHN0cnVjdC4uLgorCQkgKi8KKworCQlyZXQgPSByZWdpc3Rlcl9jcHUoJnBlcl9jcHUoY3B1X2RldmljZXMsIGkpLCBpKTsKKwkJaWYgKHJldCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInRvcG9sb2d5X2luaXQ6IHJlZ2lzdGVyX2NwdSAlZCAiCisJCQkgICAgICAgImZhaWxlZCAoJWQpXG4iLCBpLCByZXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhbXBvbGluZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzM2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFRyYW1wb2xpbmUgc2VxdWVuY2VzIHRvIGJlIGNvcGllZCBvbnRvIHVzZXIgc3RhY2suCisgKiBUaGlzIGNvbnN1bWVzIGEgbGl0dGxlIG1vcmUgc3BhY2UgdGhhbiBoYW5kLWFzc2VtYmxpbmcKKyAqIGltbWVkaWF0ZSBjb25zdGFudHMgZm9yIHVzZSBpbiBDLCBidXQgaXMgbW9yZSBwb3J0YWJsZQorICogdG8gZnV0dXJlIHR3ZWFrcyB0byB0aGUgSGV4YWdvbiBpbnN0cnVjdGlvbiBzZXQuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworLyogIFNpZyB0cmFtcG9saW5lcyAtIGNhbGwgc3lzX3NpZ3JldHVybiBvciBzeXNfcnRfc2lncmV0dXJuIGFzIGFwcHJvcHJpYXRlICovCisKKy8qICBwbGFpbiBzaWdyZXR1cm4gaXMgZ29uZS4gICovCisKKwkuZ2xvYmwgX19ydF9zaWd0cmFtcF90ZW1wbGF0ZQorX19ydF9zaWd0cmFtcF90ZW1wbGF0ZToKKwlyNiA9ICNfX05SX3J0X3NpZ3JldHVybjsKKwl0cmFwMCgjMSk7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3RyYXBzLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4ODU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdHJhcHMuYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIEtlcm5lbCB0cmFwcy9ldmVudHMgZm9yIEhleGFnb24gcHJvY2Vzc29yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vdm1fZmF1bHQuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9yZWdpc3RlcnMuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaWZkZWYgQ09ORklHX0tHREIKKyMgaW5jbHVkZSA8bGludXgva2dkYi5oPgorI2VuZGlmCisKKyNkZWZpbmUgVFJBUF9TWVNDQUxMCTEKKyNkZWZpbmUgVFJBUF9ERUJVRwkweGRiCisKK3ZvaWQgX19pbml0IHRyYXBfaW5pdCh2b2lkKQoreworfQorCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQlVHCisvKiBNYXliZSBzaG91bGQgcmVzZW1ibGUgYXJjaC9zaC9rZXJuZWwvdHJhcHMuYyA/PyAqLworaW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19HRU5FUklDX0JVRyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZXhfbmFtZShpbnQgZXgpCit7CisJc3dpdGNoIChleCkgeworCWNhc2UgSFZNX0dFX0NfWFBST1Q6CisJY2FzZSBIVk1fR0VfQ19YVVNFUjoKKwkJcmV0dXJuICJFeGVjdXRlIHByb3RlY3Rpb24gZmF1bHQiOworCWNhc2UgSFZNX0dFX0NfUlBST1Q6CisJY2FzZSBIVk1fR0VfQ19SVVNFUjoKKwkJcmV0dXJuICJSZWFkIHByb3RlY3Rpb24gZmF1bHQiOworCWNhc2UgSFZNX0dFX0NfV1BST1Q6CisJY2FzZSBIVk1fR0VfQ19XVVNFUjoKKwkJcmV0dXJuICJXcml0ZSBwcm90ZWN0aW9uIGZhdWx0IjsKKwljYXNlIEhWTV9HRV9DX1hNQUw6CisJCXJldHVybiAiTWlzYWxpZ25lZCBpbnN0cnVjdGlvbiI7CisJY2FzZSBIVk1fR0VfQ19STUFMOgorCQlyZXR1cm4gIk1pc2FsaWduZWQgZGF0YSBsb2FkIjsKKwljYXNlIEhWTV9HRV9DX1dNQUw6CisJCXJldHVybiAiTWlzYWxpZ25lZCBkYXRhIHN0b3JlIjsKKwljYXNlIEhWTV9HRV9DX0lOVkk6CisJY2FzZSBIVk1fR0VfQ19QUklWSToKKwkJcmV0dXJuICJJbGxlZ2FsIGluc3RydWN0aW9uIjsKKwljYXNlIEhWTV9HRV9DX0JVUzoKKwkJcmV0dXJuICJQcmVjaXNlIGJ1cyBlcnJvciI7CisJY2FzZSBIVk1fR0VfQ19DQUNIRToKKwkJcmV0dXJuICJDYWNoZSBlcnJvciI7CisKKwljYXNlIDB4ZGI6CisJCXJldHVybiAiRGVidWdnZXIgdHJhcCI7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVucmVjb2duaXplZCBleGNlcHRpb24iOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmZwLAorCQkJICB1bnNpZ25lZCBsb25nIGlwKQoreworCWludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAyNDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICpuZXdmcDsKKwl1bnNpZ25lZCBsb25nIGxvdywgaGlnaDsKKwljaGFyIHRtcHN0clsxMjhdOworCWNoYXIgKm1vZG5hbWU7CisJaW50IGk7CisKKwlpZiAodGFzayA9PSBOVUxMKQorCQl0YXNrID0gY3VycmVudDsKKworCXByaW50ayhLRVJOX0lORk8gIkNQVSMlZCwgJXMvJWQsIENhbGwgVHJhY2U6XG4iLAorCSAgICAgICByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCB0YXNrLT5jb21tLAorCSAgICAgICB0YXNrX3BpZF9ucih0YXNrKSk7CisKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCQlhc20oIiUwID0gcjMwIiA6ICI9ciIgKGZwKSk7CisJCX0gZWxzZSB7CisJCQlmcCA9ICh1bnNpZ25lZCBsb25nICopCisJCQkgICAgICgoc3RydWN0IGhleGFnb25fc3dpdGNoX3N0YWNrICopCisJCQkgICAgIHRhc2stPnRocmVhZC5zd2l0Y2hfc3ApLT5mcDsKKwkJfQorCX0KKworCWlmICgoKCh1bnNpZ25lZCBsb25nKSBmcCkgJiAweDMpIHx8ICgodW5zaWduZWQgbG9uZykgZnAgPCAweDEwMDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIi0tIENvcnJ1cHQgZnJhbWUgcG9pbnRlciAlcFxuIiwgZnApOworCQlyZXR1cm47CisJfQorCisJLyogU2F2ZWQgbGluayByZWcgaXMgb25lIHdvcmQgYWJvdmUgRlAgKi8KKwlpZiAoIWlwKQorCQlpcCA9ICooZnArMSk7CisKKwkvKiBFeHBlY3Qga2VybmVsIHN0YWNrIHRvIGJlIGluLWJvdW5kcyAqLworCWxvdyA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKKwloaWdoID0gbG93ICsgVEhSRUFEX1NJWkUgLSA4OworCWxvdyArPSBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgeworCisJCW5hbWUgPSBrYWxsc3ltc19sb29rdXAoaXAsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgdG1wc3RyKTsKKworCQlwcmludGsoS0VSTl9JTkZPICJbJXBdIDB4JWx4OiAlcyArIDB4JWx4IiwgZnAsIGlwLCBuYW1lLAorCQkJb2Zmc2V0KTsKKwkJaWYgKCgodW5zaWduZWQgbG9uZykgZnAgPCBsb3cpIHx8IChoaWdoIDwgKHVuc2lnbmVkIGxvbmcpIGZwKSkKKwkJCXByaW50ayhLRVJOX0NPTlQgIiAoRlAgb3V0IG9mIGJvdW5kcyEpIik7CisJCWlmIChtb2RuYW1lKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiIFslc10gIiwgbW9kbmFtZSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisKKwkJbmV3ZnAgPSAodW5zaWduZWQgbG9uZyAqKSAqZnA7CisKKwkJaWYgKCgodW5zaWduZWQgbG9uZykgbmV3ZnApICYgMHgzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICItLSBDb3JydXB0IGZyYW1lIHBvaW50ZXIgJXBcbiIsCisJCQkJbmV3ZnApOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBBdHRlbXB0IHRvIGNvbnRpbnVlIHBhc3QgZXhjZXB0aW9uLiAqLworCQlpZiAoMCA9PSBuZXdmcCkgeworCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKCgodm9pZCAqKWZwKQorCQkJCQkJKyA4KTsKKworCQkJaWYgKHJlZ3MtPnN5c2NhbGxfbnIgIT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICItLSB0cmFwMCAtLSBzeXNjYWxsX25yOiAlbGQiLAorCQkJCQlyZWdzLT5zeXNjYWxsX25yKTsKKwkJCQlwcmludGsoS0VSTl9DT05UICIgIHBzcDogJWx4ICBlbHI6ICVseFxuIiwKKwkJCQkJIHB0X3BzcChyZWdzKSwgcHRfZWxyKHJlZ3MpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogcmVhbGx5IHdhbnQgdG8gc2VlIG1vcmUgLi4uICovCisJCQkJa3N0YWNrX2RlcHRoX3RvX3ByaW50ICs9IDY7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiLS0gJXMgKDB4JWx4KSAgYmFkdmE6ICVseFxuIiwKKwkJCQkJZXhfbmFtZShwdF9jYXVzZShyZWdzKSksIHB0X2NhdXNlKHJlZ3MpLAorCQkJCQlwdF9iYWR2YShyZWdzKSk7CisJCQl9CisKKwkJCW5ld2ZwID0gKHVuc2lnbmVkIGxvbmcgKikgcmVncy0+cjMwOworCQkJaXAgPSBwdF9lbHIocmVncyk7CisJCX0gZWxzZSB7CisJCQlpcCA9ICoobmV3ZnAgKyAxKTsKKwkJfQorCisJCS8qIElmIGxpbmsgcmVnIGlzIG51bGwsIHdlIGFyZSBkb25lLiAqLworCQlpZiAoaXAgPT0gMHgwKQorCQkJYnJlYWs7CisKKwkJLyogSWYgbmV3ZnAgaXNuJ3QgbGFyZ2VyLCB3ZSdyZSB0cmFjaW5nIGdhcmJhZ2UuICovCisJCWlmIChuZXdmcCA+IGZwKQorCQkJZnAgPSBuZXdmcDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorfQorCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpmcCkKK3sKKwkvKiBTYXZlZCBsaW5rIHJlZyBpcyBvbmUgd29yZCBhYm92ZSBGUCAqLworCWRvX3Nob3dfc3RhY2sodGFzaywgZnAsIDApOworfQorCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICpmcDsKKwlhc20oIiUwID0gcjMwIiA6ICI9ciIgKGZwKSk7CisJc2hvd19zdGFjayhjdXJyZW50LCBmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCitpbnQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQoreworCXN0YXRpYyBzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCWludCBjb3VudGVyOworCX0gZGllID0geworCQkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRpZS5sb2NrKSwKKwkJLmNvdW50ZXIgPSAwCisJfTsKKworCWNvbnNvbGVfdmVyYm9zZSgpOworCW9vcHNfZW50ZXIoKTsKKworCXNwaW5fbG9ja19pcnEoJmRpZS5sb2NrKTsKKwlidXN0X3NwaW5sb2NrcygxKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiT29wczogJXNbIyVkXTpcbiIsIHN0ciwgKytkaWUuY291bnRlcik7CisKKwlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsIHB0X2NhdXNlKHJlZ3MpLCBTSUdTRUdWKSA9PQorCSAgICBOT1RJRllfU1RPUCkKKwkJcmV0dXJuIDE7CisKKwlwcmludF9tb2R1bGVzKCk7CisJc2hvd19yZWdzKHJlZ3MpOworCWRvX3Nob3dfc3RhY2soY3VycmVudCwgJnJlZ3MtPnIzMCwgcHRfZWxyKHJlZ3MpKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOworCisJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CisKKwlpZiAocGFuaWNfb25fb29wcykKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOworCisJb29wc19leGl0KCk7CisJZG9fZXhpdChlcnIpOworCXJldHVybiAwOworfQorCitpbnQgZGllX2lmX2tlcm5lbChjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcmV0dXJuIGRpZShzdHIsIHJlZ3MsIGVycik7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoKKyAqIEl0J3Mgbm90IGNsZWFyIHRoYXQgbWlzYWxpZ25lZCBmZXRjaGVzIGFyZSBldmVyIHJlY292ZXJhYmxlLgorICovCitzdGF0aWMgdm9pZCBtaXNhbGlnbmVkX2luc3RydWN0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRpZV9pZl9rZXJuZWwoIk1pc2FsaWduZWQgSW5zdHJ1Y3Rpb24iLCByZWdzLCAwKTsKKwlmb3JjZV9zaWcoU0lHQlVTLCBjdXJyZW50KTsKK30KKworLyoKKyAqIE1pc2FsaWduZWQgbG9hZHMgYW5kIHN0b3Jlcywgb24gdGhlIG90aGVyIGhhbmQsIGNhbiBiZQorICogZW11bGF0ZWQsIGFuZCBwcm9iYWJseSBzaG91bGQgYmUsIHNvbWUgZGF5LiAgQnV0IGZvciBub3cKKyAqIHRoZXkgd2lsbCBiZSBjb25zaWRlcmVkIGZhdGFsLgorICovCitzdGF0aWMgdm9pZCBtaXNhbGlnbmVkX2RhdGFfbG9hZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlkaWVfaWZfa2VybmVsKCJNaXNhbGlnbmVkIERhdGEgTG9hZCIsIHJlZ3MsIDApOworCWZvcmNlX3NpZyhTSUdCVVMsIGN1cnJlbnQpOworfQorCitzdGF0aWMgdm9pZCBtaXNhbGlnbmVkX2RhdGFfc3RvcmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZGllX2lmX2tlcm5lbCgiTWlzYWxpZ25lZCBEYXRhIFN0b3JlIiwgcmVncywgMCk7CisJZm9yY2Vfc2lnKFNJR0JVUywgY3VycmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGlsbGVnYWxfaW5zdHJ1Y3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZGllX2lmX2tlcm5lbCgiSWxsZWdhbCBJbnN0cnVjdGlvbiIsIHJlZ3MsIDApOworCWZvcmNlX3NpZyhTSUdJTEwsIGN1cnJlbnQpOworfQorCisvKgorICogUHJlY2lzZSBidXMgZXJyb3JzIG1heSBiZSByZWNvdmVyYWJsZSB3aXRoIGEgYSByZXRyeSwKKyAqIGJ1dCBmb3Igbm93LCB0cmVhdCB0aGVtIGFzIGlycmVjb3ZlcmFibGUuCisgKi8KK3N0YXRpYyB2b2lkIHByZWNpc2VfYnVzX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRpZV9pZl9rZXJuZWwoIlByZWNpc2UgQnVzIEVycm9yIiwgcmVncywgMCk7CisJZm9yY2Vfc2lnKFNJR0JVUywgY3VycmVudCk7Cit9CisKKy8qCisgKiBJZiBhbnl0aGluZyBpcyB0byBiZSBkb25lIGhlcmUgb3RoZXIgdGhhbiBwYW5pYywKKyAqIGl0IHdpbGwgcHJvYmFibHkgYmUgY29tcGxleCBhbmQgbWlncmF0ZSB0byBhbm90aGVyCisgKiBzb3VyY2UgbW9kdWxlLiAgRm9yIG5vdywganVzdCBkaWUuCisgKi8KK3N0YXRpYyB2b2lkIGNhY2hlX2Vycm9yKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRpZSgiQ2FjaGUgRXJyb3IiLCByZWdzLCAwKTsKK30KKworLyoKKyAqIEdlbmVyYWwgZXhjZXB0aW9uIGhhbmRsZXIKKyAqLwordm9pZCBkb19nZW5leChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIERlY29kZSBDYXVzZSBhbmQgRGlzcGF0Y2gKKwkgKi8KKwlzd2l0Y2ggKHB0X2NhdXNlKHJlZ3MpKSB7CisJY2FzZSBIVk1fR0VfQ19YUFJPVDoKKwljYXNlIEhWTV9HRV9DX1hVU0VSOgorCQlleGVjdXRlX3Byb3RlY3Rpb25fZmF1bHQocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfUlBST1Q6CisJY2FzZSBIVk1fR0VfQ19SVVNFUjoKKwkJcmVhZF9wcm90ZWN0aW9uX2ZhdWx0KHJlZ3MpOworCQlicmVhazsKKwljYXNlIEhWTV9HRV9DX1dQUk9UOgorCWNhc2UgSFZNX0dFX0NfV1VTRVI6CisJCXdyaXRlX3Byb3RlY3Rpb25fZmF1bHQocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfWE1BTDoKKwkJbWlzYWxpZ25lZF9pbnN0cnVjdGlvbihyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19STUFMOgorCQltaXNhbGlnbmVkX2RhdGFfbG9hZChyZWdzKTsKKwkJYnJlYWs7CisJY2FzZSBIVk1fR0VfQ19XTUFMOgorCQltaXNhbGlnbmVkX2RhdGFfc3RvcmUocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfSU5WSToKKwljYXNlIEhWTV9HRV9DX1BSSVZJOgorCQlpbGxlZ2FsX2luc3RydWN0aW9uKHJlZ3MpOworCQlicmVhazsKKwljYXNlIEhWTV9HRV9DX0JVUzoKKwkJcHJlY2lzZV9idXNfZXJyb3IocmVncyk7CisJCWJyZWFrOworCWNhc2UgSFZNX0dFX0NfQ0FDSEU6CisJCWNhY2hlX2Vycm9yKHJlZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBIYWx0IGFuZCBjYXRjaCBmaXJlICovCisJCXBhbmljKCJVbnJlY29nbml6ZWQgZXhjZXB0aW9uIDB4JWx4XG4iLCBwdF9jYXVzZShyZWdzKSk7CisJCWJyZWFrOworCX0KK30KKworLyogSW5kaXJlY3Qgc3lzdGVtIGNhbGwgZGlzcGF0Y2ggKi8KK2xvbmcgc3lzX3N5c2NhbGwodm9pZCkKK3sKKwlwcmludGsoS0VSTl9FUlIgInN5c19zeXNjYWxsIGludm9rZWQhXG4iKTsKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwordm9pZCBkb190cmFwMChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHN5c2NhbGxyZXQgPSAwOworCXN5c2NhbGxfZm4gc3lzY2FsbDsKKworCXN3aXRjaCAocHRfY2F1c2UocmVncykpIHsKKwljYXNlIFRSQVBfU1lTQ0FMTDoKKwkJLyogU3lzdGVtIGNhbGwgaXMgdHJhcDAgIzEgKi8KKworCQkvKiBhbGxvdyBzdHJhY2UgdG8gY2F0Y2ggc3lzY2FsbCBhcmdzICAqLworCQlpZiAodW5saWtlbHkodGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkgJiYKKwkJCXRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShyZWdzKSkpCisJCQlyZXR1cm47ICAvKiAgcmV0dXJuIC1FTk9TWVMgc29tZXdoZXJlPyAgKi8KKworCQkvKiBJbnRlcnJ1cHRzIHNob3VsZCBiZSByZS1lbmFibGVkIGZvciBzeXNjYWxsIHByb2Nlc3NpbmcgKi8KKwkJX192bXNldGllKFZNX0lOVF9FTkFCTEUpOworCisJCS8qCisJCSAqIFN5c3RlbSBjYWxsIG51bWJlciBpcyBpbiByNiwgYXJndW1lbnRzIGluIHIwLi5yNS4KKwkJICogRm9ydHVuYXRlbHksIG5vIExpbnV4IHN5c2NhbGwgaGFzIG1vcmUgdGhhbiA2IGFyZ3VtZW50cywKKwkJICogYW5kIEhleGFnb24gQUJJIHBhc3NlcyBmaXJzdCA2IGFyZ3VtZW50cyBpbiByZWdpc3RlcnMuCisJCSAqIDY0LWJpdCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiBvZGQvZXZlbiByZWdpc3RlciBwYWlycy4KKwkJICogRm9ydHVuYXRlbHksIHdlIGhhdmUgbm8gc3lzdGVtIGNhbGxzIHRoYXQgdGFrZSBtb3JlCisJCSAqIHRoYW4gdGhyZWUgYXJndW1lbnRzIHdpdGggbW9yZSB0aGFuIG9uZSA2NC1iaXQgdmFsdWUuCisJCSAqIFNob3VsZCB0aGF0IGNoYW5nZSwgd2UnZCBuZWVkIHRvIHJlZGVzaWduIHRvIGNvcHkKKwkJICogYmV0d2VlbiB1c2VyIGFuZCBrZXJuZWwgc3RhY2tzLgorCQkgKi8KKwkJcmVncy0+c3lzY2FsbF9uciA9IHJlZ3MtPnIwNjsKKworCQkvKgorCQkgKiBHUFIgUjAgY2FycmllcyB0aGUgZmlyc3QgcGFyYW1ldGVyLCBhbmQgaXMgYWxzbyB1c2VkCisJCSAqIHRvIHJlcG9ydCB0aGUgcmV0dXJuIHZhbHVlLiAgV2UgbmVlZCBhIGJhY2t1cCBvZgorCQkgKiB0aGUgdXNlcidzIHZhbHVlIGluIGNhc2Ugd2UgbmVlZCB0byBkbyBhIGxhdGUgcmVzdGFydAorCQkgKiBvZiB0aGUgc3lzdGVtIGNhbGwuCisJCSAqLworCQlyZWdzLT5yZXN0YXJ0X3IwID0gcmVncy0+cjAwOworCisJCWlmICgodW5zaWduZWQgbG9uZykgcmVncy0+c3lzY2FsbF9uciA+PSBfX05SX3N5c2NhbGxzKSB7CisJCQlyZWdzLT5yMDAgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCXN5c2NhbGwgPSAoc3lzY2FsbF9mbikKKwkJCQkgIChzeXNfY2FsbF90YWJsZVtyZWdzLT5zeXNjYWxsX25yXSk7CisJCQlzeXNjYWxscmV0ID0gc3lzY2FsbChyZWdzLT5yMDAsIHJlZ3MtPnIwMSwKKwkJCQkgICByZWdzLT5yMDIsIHJlZ3MtPnIwMywKKwkJCQkgICByZWdzLT5yMDQsIHJlZ3MtPnIwNSk7CisJCX0KKworCQkvKgorCQkgKiBJZiBpdCB3YXMgYSBzaWdyZXR1cm4gc3lzdGVtIGNhbGwsIGRvbid0IG92ZXJ3cml0ZQorCQkgKiByMCB2YWx1ZSBpbiBzdGFjayBmcmFtZSB3aXRoIHJldHVybiB2YWx1ZS4KKwkJICoKKwkJICogX19OUl9zaWdyZXR1cm4gZG9lc24ndCBzZWVtIHRvIGV4aXN0IGluIG5ldyB1bmlzdGQuaAorCQkgKi8KKworCQlpZiAocmVncy0+c3lzY2FsbF9uciAhPSBfX05SX3J0X3NpZ3JldHVybikKKwkJCXJlZ3MtPnIwMCA9IHN5c2NhbGxyZXQ7CisKKwkJLyogYWxsb3cgc3RyYWNlIHRvIGdldCB0aGUgc3lzY2FsbCByZXR1cm4gc3RhdGUgICovCisJCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkpCisJCQl0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdChyZWdzLCAwKTsKKworCQlicmVhazsKKwljYXNlIFRSQVBfREVCVUc6CisJCS8qIFRyYXAwIDB4ZGIgaXMgZGVidWcgYnJlYWtwb2ludCAqLworCQlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCQlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCisJCQlpbmZvLnNpX3NpZ25vID0gU0lHVFJBUDsKKwkJCWluZm8uc2lfZXJybm8gPSAwOworCQkJLyoKKwkJCSAqIFNvbWUgYXJjaGl0ZWN1cmVzIGFkZCBzb21lIHBlci10aHJlYWQgc3RhdGUKKwkJCSAqIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYnJlYWtwb2ludCB0cmFwcyBhbmQKKwkJCSAqIHRyYWNlIHRyYXBzLiAgV2UgbWF5IHdhbnQgdG8gZG8gdGhhdCwgYW5kCisJCQkgKiBzZXQgdGhlIHNpX2NvZGUgdmFsdWUgYXBwcm9wcmlhdGVseSwgb3Igd2UKKwkJCSAqIG1heSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCB0cmFwMCBmbGF2b3IuCisJCQkgKi8KKwkJCWluZm8uc2lfY29kZSA9IFRSQVBfQlJLUFQ7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKikgcHRfZWxyKHJlZ3MpOworCQkJc2VuZF9zaWdfaW5mbyhTSUdUUkFQLCAmaW5mbywgY3VycmVudCk7CisJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX0tHREIKKwkJCWtnZGJfaGFuZGxlX2V4Y2VwdGlvbihwdF9jYXVzZShyZWdzKSwgU0lHVFJBUCwKKwkJCQkJICAgICAgVFJBUF9CUktQVCwgcmVncyk7CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwl9CisJLyogSWdub3JlIG90aGVyIHRyYXAwIGNvZGVzIGZvciBub3csIGVzcGVjaWFsbHkgMCAoQW5nZWwgY2FsbHMpICovCit9CisKKy8qCisgKiBNYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KK3ZvaWQgZG9fbWFjaGNoZWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIEhhbHQgYW5kIGNhdGNoIGZpcmUgKi8KKwlfX3Ztc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92ZHNvLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3Zkc28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI3N2MzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92ZHNvLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiB2RFNPIGltcGxlbWVudGF0aW9uIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGFzbS92ZHNvLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdmRzb19wYWdlOworCisvKiBDcmVhdGUgYSB2RFNPIHBhZ2UgaG9sZGluZyB0aGUgc2lnbmFsIHRyYW1wb2xpbmUuCisgKiBXZSB3YW50IHRoaXMgZm9yIGEgbm9uLWV4ZWN1dGFibGUgc3RhY2suCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZkc29faW5pdCh2b2lkKQoreworCXN0cnVjdCBoZXhhZ29uX3Zkc28gKnZkc287CisKKwl2ZHNvX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghdmRzb19wYWdlKQorCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIHZkc28iKTsKKworCXZkc28gPSB2bWFwKCZ2ZHNvX3BhZ2UsIDEsIDAsIFBBR0VfS0VSTkVMKTsKKwlpZiAoIXZkc28pCisJCXBhbmljKCJDYW5ub3QgbWFwIHZkc28iKTsKKwljbGVhcl9wYWdlKHZkc28pOworCisJLyogSW5zdGFsbCB0aGUgc2lnbmFsIHRyYW1wb2xpbmU7IGN1cnJlbnRseSBsb29rcyBsaWtlIHRoaXM6CisJICoJcjYgPSAjX19OUl9ydF9zaWdyZXR1cm47CisJICoJdHJhcDAoIzEpOworCSAqLworCXZkc28tPnJ0X3NpZ25hbF90cmFtcG9saW5lWzBdID0gX19ydF9zaWd0cmFtcF90ZW1wbGF0ZVswXTsKKwl2ZHNvLT5ydF9zaWduYWxfdHJhbXBvbGluZVsxXSA9IF9fcnRfc2lndHJhbXBfdGVtcGxhdGVbMV07CisKKwl2dW5tYXAodmRzbyk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwodmRzb19pbml0KTsKKworLyoKKyAqIENhbGxlZCBmcm9tIGJpbmZtdF9lbGYuICBDcmVhdGUgYSBWTUEgZm9yIHRoZSB2RFNPIHBhZ2UuCisgKi8KK2ludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IHVzZXNfaW50ZXJwKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBUcnkgdG8gZ2V0IGl0IGxvYWRlZCByaWdodCBuZWFyIGxkLnNvL2dsaWJjLiAqLworCXZkc29fYmFzZSA9IFNUQUNLX1RPUDsKKworCXZkc29fYmFzZSA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZkc29fYmFzZSwgUEFHRV9TSVpFLCAwLCAwKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHZkc29fYmFzZSkpIHsKKwkJcmV0ID0gdmRzb19iYXNlOworCQlnb3RvIHVwX2ZhaWw7CisJfQorCisJLyogTUFZV1JJVEUgdG8gYWxsb3cgZ2RiIHRvIENPVyBhbmQgc2V0IGJyZWFrcG9pbnRzLiAqLworCXJldCA9IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLCB2ZHNvX2Jhc2UsIFBBR0VfU0laRSwKKwkJCQkgICAgICBWTV9SRUFEfFZNX0VYRUN8CisJCQkJICAgICAgVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDfAorCQkJCSAgICAgIFZNX0FMV0FZU0RVTVAsCisJCQkJICAgICAgJnZkc29fcGFnZSk7CisKKwlpZiAocmV0KQorCQlnb3RvIHVwX2ZhaWw7CisKKwltbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKil2ZHNvX2Jhc2U7CisKK3VwX2ZhaWw6CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciAqYXJjaF92bWFfbmFtZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAodm1hLT52bV9tbSAmJiB2bWEtPnZtX3N0YXJ0ID09IChsb25nKXZtYS0+dm1fbW0tPmNvbnRleHQudmRzbykKKwkJcmV0dXJuICJbdmRzb10iOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9lbnRyeS5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9lbnRyeS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTkwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX2VudHJ5LlMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBFdmVudCBlbnRyeS9leGl0IGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPiAgLyogIGFzc2VtYmx5LXNhZmVyIHZlcnNpb25zIG9mIEMgZGVmaW5lcyAqLworI2luY2x1ZGUgPGFzbS9tZW0tbGF5b3V0Lmg+ICAgLyogIHNpZ2gsIGV4Y2VwdCBmb3IgcGFnZV9vZmZzZXQgICovCisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKworLyoKKyAqIEVudHJ5IGludG8gZ3Vlc3QtbW9kZSBMaW51eCB1bmRlciBIZXhhZ29uIFZpcnR1YWwgTWFjaGluZS4KKyAqIFN0YWNrIHBvaW50ZXIgcG9pbnRzIHRvIGV2ZW50IHJlY29yZCAtIGJ1aWxkIHB0X3JlZ3Mgb24gdG9wIG9mIGl0LAorICogc2V0IHVwIGEgcGxhdXNpYmxlIEMgc3RhY2sgZnJhbWUsIGFuZCBkaXNwYXRjaCB0byB0aGUgQyBoYW5kbGVyLgorICogT24gcmV0dXJuLCBkbyB2bXJ0ZSB2aXJ0dWFsIGluc3RydWN0aW9uIHdpdGggU1Agd2hlcmUgd2Ugc3RhcnRlZC4KKyAqCisgKiBWTSBTcGVjIDAuNSB1c2VzIGEgdHJhcCB0byBmZXRjaCBIVk0gcmVjb3JkIG5vdy4KKyAqLworCisvKgorICogU2F2ZSBmdWxsIHJlZ2lzdGVyIHN0YXRlLCB3aGlsZSBzZXR0aW5nIHVwIHRocmVhZF9pbmZvIHN0cnVjdAorICogcG9pbnRlciBkZXJpdmVkIGZyb20ga2VybmVsIHN0YWNrIHBvaW50ZXIgaW4gVEhSRUFESU5GT19SRUcKKyAqIHJlZ2lzdGVyLCBwdXR0aW5nIHByaW9yIHRocmVhZF9pbmZvLnJlZ3MgcG9pbnRlciBpbiBhIGNhbGxlZS1zYXZlCisgKiByZWdpc3RlciAoUjI0LCB3aGljaCBoYWQgYmV0dGVyIG5vdCBldmVyIGJlIGFzc2lnbmVkIHRvIFRIUkVBRElORk9fUkVHKSwKKyAqIGFuZCB1cGRhdGluZyB0aHJlYWRfaW5mby5yZWdzIHRvIHBvaW50IHRvIGN1cnJlbnQgc3RhY2sgZnJhbWUsCisgKiBzbyBhcyB0byBzdXBwb3J0IG5lc3RlZCBldmVudHMgaW4ga2VybmVsIG1vZGUuCisgKgorICogQXMgdGhpcyBpcyBjb21tb24gY29kZSwgd2Ugc2V0IHRoZSBwdF9yZWdzIHN5c3RlbSBjYWxsIG51bWJlcgorICogdG8gLTEgZm9yIGFsbCBldmVudHMuICBJdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHN5c3RlbSBjYWxsCisgKiBudW1iZXIgaW4gdGhlIGNhc2Ugd2hlcmUgd2UgZGVjb2RlIGEgc3lzdGVtIGNhbGwgKHRyYXAwKCMxKSkuCisgKi8KKworI2RlZmluZSBzYXZlX3B0X3JlZ3MoKVwKKwltZW1kKFIwICsgI19QVF9SMzEzMCkgPSBSMzE6MzA7IFwKKwl7IG1lbXcoUjAgKyAjX1BUX1IyOTI4KSA9IFIyODsgXAorCSAgUjMxID0gbWVtdyhSMCArICNfUFRfRVJfVk1QU1ApOyB9XAorCXsgbWVtdyhSMCArICMoX1BUX1IyOTI4ICsgNCkpID0gUjMxOyBcCisJICBSMzEgPSB1Z3A7IH0gXAorCXsgbWVtZChSMCArICNfUFRfUjI3MjYpID0gUjI3OjI2OyBcCisJICBSMzAgPSBncCA7IH0gXAorCW1lbWQoUjAgKyAjX1BUX1IyNTI0KSA9IFIyNToyNDsgXAorCW1lbWQoUjAgKyAjX1BUX1IyMzIyKSA9IFIyMzoyMjsgXAorCW1lbWQoUjAgKyAjX1BUX1IyMTIwKSA9IFIyMToyMDsgXAorCW1lbWQoUjAgKyAjX1BUX1IxOTE4KSA9IFIxOToxODsgXAorCW1lbWQoUjAgKyAjX1BUX1IxNzE2KSA9IFIxNzoxNjsgXAorCW1lbWQoUjAgKyAjX1BUX1IxNTE0KSA9IFIxNToxNDsgXAorCW1lbWQoUjAgKyAjX1BUX1IxMzEyKSA9IFIxMzoxMjsgXAorCXsgbWVtZChSMCArICNfUFRfUjExMTApID0gUjExOjEwOyBcCisJICBSMTUgPSBsYzA7IH0gXAorCXsgbWVtZChSMCArICNfUFRfUjA5MDgpID0gUjk6ODsgXAorCSAgUjE0ID0gc2EwOyB9IFwKKwl7IG1lbWQoUjAgKyAjX1BUX1IwNzA2KSA9IFI3OjY7IFwKKwkgIFIxMyA9IGxjMTsgfSBcCisJeyBtZW1kKFIwICsgI19QVF9SMDUwNCkgPSBSNTo0OyBcCisJICBSMTIgPSBzYTE7IH0gXAorCXsgbWVtZChSMCArICNfUFRfVUdQR1ApID0gUjMxOjMwOyBcCisJICBSMTEgPSBtMTsgXAorCSAgUjIuSCA9ICNISShfVEhSRUFEX1NJWkUpOyB9IFwKKwl7IG1lbWQoUjAgKyAjX1BUX0xDMFNBMCkgPSBSMTU6MTQ7IFwKKwkgIFIxMCA9IG0wOyBcCisJICBSMi5MID0gI0xPKF9USFJFQURfU0laRSk7IH0gXAorCXsgbWVtZChSMCArICNfUFRfTEMxU0ExKSA9IFIxMzoxMjsgXAorCSAgUjE1ID0gcDM6MDsgXAorCSAgUjIgPSBuZWcoUjIpOyB9IFwKKwl7IG1lbWQoUjAgKyAjX1BUX00xTTApID0gUjExOjEwOyBcCisJICBSMTQgID0gdXNyOyBcCisJICBSMiA9IGFuZChSMCxSMik7IH0gXAorCXsgbWVtZChSMCArICNfUFRfUFJFRFNVU1IpID0gIFIxNToxNDsgXAorCSAgVEhSRUFESU5GT19SRUcgPSBSMjsgfSBcCisJeyByMjQgPSBtZW13KFRIUkVBRElORk9fUkVHICsgI19USFJFQURfSU5GT19QVF9SRUdTKTsgXAorCSAgbWVtdyhUSFJFQURJTkZPX1JFRyArICNfVEhSRUFEX0lORk9fUFRfUkVHUykgPSBSMDsgXAorCSAgUjIgPSAjLTE7IH0gXAorCXsgbWVtdyhSMCArICNfUFRfU1lTQ0FMTF9OUikgPSBSMjsgXAorCSAgUjMwID0gIzA7IH0KKworLyoKKyAqIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCB0aHJlYWRfaW5mby5yZWdzIHN0YXRlLiBUSFJFQURJTkZPX1JFRworICogaXMgYXNzdW1lZCB0byBzdGlsbCBiZSBzYW5lLCBhbmQgUjI0IHRvIGhhdmUgYmVlbiBjb3JyZWN0bHkKKyAqIHByZXNlcnZlZC4gRG9uJ3QgcmVzdG9yZSBSMjkgKFNQKSB1bnRpbCBsYXRlci4KKyAqLworCisjZGVmaW5lIHJlc3RvcmVfcHRfcmVncygpIFwKKwl7IG1lbXcoVEhSRUFESU5GT19SRUcgKyAjX1RIUkVBRF9JTkZPX1BUX1JFR1MpID0gUjI0OyBcCisJICBSMTU6MTQgPSBtZW1kKFIwICsgI19QVF9QUkVEU1VTUik7IH0gXAorCXsgUjExOjEwID0gbWVtZChSMCArICNfUFRfTTFNMCk7IFwKKwkgIHAzOjAgPSBSMTU7IH0gXAorCXsgUjEzOjEyID0gbWVtZChSMCArICNfUFRfTEMxU0ExKTsgXAorCSAgdXNyID0gUjE0OyB9IFwKKwl7IFIxNToxNCA9IG1lbWQoUjAgKyAjX1BUX0xDMFNBMCk7IFwKKwkgIG0xID0gUjExOyB9IFwKKwl7IFIzOjIgPSBtZW1kKFIwICsgI19QVF9SMDMwMik7IFwKKwkgIG0wID0gUjEwOyB9IFwKKwl7IFI1OjQgPSBtZW1kKFIwICsgI19QVF9SMDUwNCk7IFwKKwkgIGxjMSA9IFIxMzsgfSBcCisJeyBSNzo2ID0gbWVtZChSMCArICNfUFRfUjA3MDYpOyBcCisJICBzYTEgPSBSMTI7IH0gXAorCXsgUjk6OCA9IG1lbWQoUjAgKyAjX1BUX1IwOTA4KTsgXAorCSAgbGMwID0gUjE1OyB9IFwKKwl7IFIxMToxMCA9IG1lbWQoUjAgKyAjX1BUX1IxMTEwKTsgXAorCSAgc2EwID0gUjE0OyB9IFwKKwl7IFIxMzoxMiA9IG1lbWQoUjAgKyAjX1BUX1IxMzEyKTsgXAorCSAgUjE1OjE0ID0gbWVtZChSMCArICNfUFRfUjE1MTQpOyB9IFwKKwl7IFIxNzoxNiA9IG1lbWQoUjAgKyAjX1BUX1IxNzE2KTsgXAorCSAgUjE5OjE4ID0gbWVtZChSMCArICNfUFRfUjE5MTgpOyB9IFwKKwl7IFIyMToyMCA9IG1lbWQoUjAgKyAjX1BUX1IyMTIwKTsgXAorCSAgUjIzOjIyID0gbWVtZChSMCArICNfUFRfUjIzMjIpOyB9IFwKKwl7IFIyNToyNCA9IG1lbWQoUjAgKyAjX1BUX1IyNTI0KTsgXAorCSAgUjI3OjI2ID0gbWVtZChSMCArICNfUFRfUjI3MjYpOyB9IFwKKwlSMzE6MzAgPSBtZW1kKFIwICsgI19QVF9VR1BHUCk7IFwKKwl7IFIyOCA9IG1lbXcoUjAgKyAjX1BUX1IyOTI4KTsgXAorCSAgdWdwID0gUjMxOyB9IFwKKwl7IFIzMTozMCA9IG1lbWQoUjAgKyAjX1BUX1IzMTMwKTsgXAorCSAgZ3AgPSBSMzA7IH0KKworCS8qCisJICogQ2xlYXJzIG9mZiBlbm91Z2ggc3BhY2UgZm9yIHRoZSByZXN0IG9mIHB0X3JlZ3M7IGV2cmVjIGlzIGEgcGFydAorCSAqIG9mIHB0X3JlZ3MgaW4gSFZNIG1vZGUuICBTYXZlIFIwL1IxLCBzZXQgaGFuZGxlcidzIGFkZHJlc3MgaW4gUjEuCisJICogUjAgaXMgdGhlIGFkZHJlc3Mgb2YgcHRfcmVncyBhbmQgaXMgdGhlIHBhcmFtZXRlciB0byBzYXZlX3B0X3JlZ3MuCisJICovCisKKy8qCisgKiBTaW5jZSB0aGUgSFZNIGlzbid0IGF1dG9tYWdpY2FsbHkgcHVzaGluZyB0aGUgRVZSRUMgb250byB0aGUgc3RhY2sgYW55bW9yZSwKKyAqIHdlJ2xsIHN1YnJhY3QgdGhlIGVudGlyZSBzaXplIG91dCBhbmQgdGhlbiBmaWxsIGl0IGluIG91cnNlbHZlcy4KKyAqIE5lZWQgdG8gc2F2ZSBvZmYgUjAsIFIxLCBSMiwgUjMgaW1tZWRpYXRlbHkuCisgKi8KKworI2RlZmluZQl2bV9ldmVudF9lbnRyeShDSGFuZGxlcikgXAorCXsgXAorCQlSMjkgPSBhZGQoUjI5LCAjLShfUFRfUkVHU19TSVpFKSk7IFwKKwkJbWVtZChSMjkgKyAjKF9QVF9SMDEwMCArIC1fUFRfUkVHU19TSVpFKSkgPSBSMTowOyBcCisJfSBcCisJeyBcCisJCW1lbWQoUjI5ICsjX1BUX1IwMzAyKSA9IFIzOjI7IFwKKwl9IFwKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNR0VUUkVHUyk7IFwKKwl7IFwKKwkJbWVtZChSMjkgKyAjX1BUX0VSX1ZNRUwpID0gUjE6MDsgXAorCQlSMCA9IFIyOTsgXAorCQlSMS5MID0gI0xPKENIYW5kbGVyKTsgXAorCX0gXAorCXsgXAorCQltZW1kKFIyOSArICNfUFRfRVJfVk1QU1ApID0gUjM6MjsgXAorCQlSMS5IID0gI0hJKENIYW5kbGVyKTsgXAorCQlqdW1wIGV2ZW50X2Rpc3BhdGNoOyBcCisJfQorCisudGV4dAorCS8qCisJICogRG8gYnVsayBzYXZlL3Jlc3RvcmUgaW4gb25lIHBsYWNlLgorCSAqIEFkZHMgYSBqdW1wIHRvIGRpc3BhdGNoIGxhdGVuY3ksIGJ1dAorCSAqIHNhdmVzIGh1bmRyZWRzIG9mIGJ5dGVzLgorCSAqLworCitldmVudF9kaXNwYXRjaDoKKwlzYXZlX3B0X3JlZ3MoKQorCWNhbGxyCXIxCisKKwkvKgorCSAqIElmIHdlIHdlcmUgaW4ga2VybmVsIG1vZGUsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgc2NoZWR1bGVyCisJICogb3Igc2lnbmFscyBpZiBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0LiAgSWYgc2V0LCB0aGVuIGl0IGhhcworCSAqIHRvIGp1bXAgdG8gYSBuZWVkX3Jlc2NoZWQga2luZCBvZiBibG9jay4KKwkgKiBCVFcsIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorCSAqLworCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlSMCA9ICNWTV9JTlRfRElTQUJMRQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRJRSkKKyNlbmRpZgorCisJLyogICJOZXN0ZWQgY29udHJvbCBwYXRoIiAtLSBpZiB0aGUgcHJldmlvdXMgbW9kZSB3YXMga2VybmVsICAqLworCVIwID0gbWVtdyhSMjkgKyAjX1BUX0VSX1ZNRVNUKTsKKwlQMCA9IHRzdGJpdChSMCwgI0hWTV9WTUVTVF9VTV9TRlQpOworCWlmICFQMCBqdW1wIHJlc3RvcmVfYWxsOworCS8qCisJICogUmV0dXJuaW5nIGZyb20gc3lzdGVtIGNhbGwsIG5vcm1hbGx5IGNvbWluZyBiYWNrIGZyb20gdXNlciBtb2RlCisJICovCityZXR1cm5fZnJvbV9zeXNjYWxsOgorCS8qICBEaXNhYmxlIGludGVycnVwdHMgd2hpbGUgY2hlY2tpbmcgVElGICAqLworCVIwID0gI1ZNX0lOVF9ESVNBQkxFCisJdHJhcDEoI0hWTV9UUkFQMV9WTVNFVElFKQorCisJLyoKKwkgKiBDb21pbmcgYmFjayBmcm9tIHRoZSBDLXdvcmxkLCBvdXIgdGhyZWFkIGluZm8gcG9pbnRlcgorCSAqIHNob3VsZCBiZSBpbiB0aGUgZGVzaWduYXRlZCByZWdpc3RlciAodXN1YWxseSBSMTkpCisJICovCisJUjEuTCA9ICNMTyhfVElGX0FMTFdPUktfTUFTSykKKwl7CisJCVIxLkggPSAjSEkoX1RJRl9BTExXT1JLX01BU0spOworCQlSMCA9IG1lbXcoVEhSRUFESU5GT19SRUcgKyAjX1RIUkVBRF9JTkZPX0ZMQUdTKTsKKwl9CisKKwkvKgorCSAqIENvbXBhcmUgYWdhaW5zdCB0aGUgInJldHVybiB0byB1c2Vyc3BhY2UiIF9USUZfV09SS19NQVNLCisJICovCisJUjEgPSBhbmQoUjEsUjApOworCXsgUDAgPSBjbXAuZXEoUjEsIzApOyBpZiAoIVAwLm5ldykganVtcDp0IHdvcmtfcGVuZGluZzt9CisJanVtcCByZXN0b3JlX2FsbDsgIC8qICB3ZSdyZSBvdXR0YSBoZXJlISAgKi8KKword29ya19wZW5kaW5nOgorCXsKKwkJUDAgPSB0c3RiaXQoUjEsICNUSUZfTkVFRF9SRVNDSEVEKTsKKwkJaWYgKCFQMC5uZXcpIGp1bXA6bnQgd29ya19ub3RpZnlzaWc7CisJfQorCWNhbGwgc2NoZWR1bGUKKwlqdW1wIHJldHVybl9mcm9tX3N5c2NhbGw7ICAvKiAgY2hlY2sgZm9yIG1vcmUgd29yayAgKi8KKword29ya19ub3RpZnlzaWc6CisJLyogIHRoaXMgaXMgdGhlIHBhcnQgdGhhdCdzIGtpbmQgb2YgZnV6enkuICAqLworCVIxID0gYW5kKFIwLCAjKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSkpOworCVAwID0gY21wLmVxKFIxLCAjMCk7CisJaWYgUDAganVtcCByZXN0b3JlX2FsbAorCVIxID0gUjA7IAkvKiB1bnNpZ25lZCBsb25nIHRocmVhZF9pbmZvX2ZsYWdzICovCisJUjAgPSBSMjk7CS8qIHJlZ3Mgc2hvdWxkIHN0aWxsIGJlIGF0IHRvcCBvZiBzdGFjayAgKi8KKwljYWxsIGRvX25vdGlmeV9yZXN1bWUKKworcmVzdG9yZV9hbGw6CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBpZiB0aGV5IHdlcmVuJ3QgYWxyZWFkeSwgYmVmb3JlIHJlZyByZXN0b3JlLiAgKi8KKwlSMCA9ICNWTV9JTlRfRElTQUJMRQorCXRyYXAxKCNIVk1fVFJBUDFfVk1TRVRJRSkKKworCS8qICBkbyB0aGUgc2V0cmVncyBoZXJlIGZvciBWTSAwLjUgICovCisJLyogIFIyOSBoZXJlIHNob3VsZCBhbHJlYWR5IGJlIHBvaW50aW5nIGF0IHB0X3JlZ3MgICovCisJUjE6MCA9IG1lbWQoUjI5ICsgI19QVF9FUl9WTUVMKTsKKwlSMzoyID0gbWVtZChSMjkgKyAjX1BUX0VSX1ZNUFNQKTsKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUUkVHUyk7CisKKwlSMCA9IFIyOQorCXJlc3RvcmVfcHRfcmVncygpCisJUjE6MCA9IG1lbWQoUjI5ICsgI19QVF9SMDEwMCk7CisJUjI5ID0gYWRkKFIyOSwgI19QVF9SRUdTX1NJWkUpOworCXRyYXAxKCNIVk1fVFJBUDFfVk1SVEUpCisJLyogTm90cmVhY2hlZCAqLworCisJLmdsb2JsIF9LX2VudGVyX2dlbmV4CitfS19lbnRlcl9nZW5leDoKKwl2bV9ldmVudF9lbnRyeShkb19nZW5leCkKKworCS5nbG9ibCBfS19lbnRlcl9pbnRlcnJ1cHQKK19LX2VudGVyX2ludGVycnVwdDoKKwl2bV9ldmVudF9lbnRyeShhcmNoX2RvX0lSUSkKKworCS5nbG9ibCBfS19lbnRlcl90cmFwMAorX0tfZW50ZXJfdHJhcDA6CisJdm1fZXZlbnRfZW50cnkoZG9fdHJhcDApCisKKwkuZ2xvYmwgX0tfZW50ZXJfbWFjaGNoZWNrCitfS19lbnRlcl9tYWNoY2hlY2s6CisJdm1fZXZlbnRfZW50cnkoZG9fbWFjaGNoZWNrKQorCisKKwkuZ2xvYmwgcmV0X2Zyb21fZm9yaworcmV0X2Zyb21fZm9yazoKKwljYWxsIHNjaGVkdWxlX3RhaWwKKwlqdW1wIHJldHVybl9mcm9tX3N5c2NhbGwKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fZXZlbnRzLmMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtX2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmEwODFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9ldmVudHMuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIE1vc3RseSBJUlEgc3VwcG9ydCBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vcmVnaXN0ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyoKKyAqIHNob3dfcmVncyAtIHByaW50IHB0X3JlZ3Mgc3RydWN0dXJlCisgKiBAcmVnczogcG9pbnRlciB0byBwdF9yZWdzCisgKgorICogVG8tZG86ICBhZGQgYWxsIHRoZSBhY2Nlc3NvciBkZWZpbml0aW9ucyB0byByZWdpc3RlcnMuaAorICoKKyAqIFdpbGwgbWFrZSB0aGlzIHJvdXRpbmUgYSBsb3QgZWFzaWVyIHRvIHdyaXRlLgorICovCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAicmVzdGFydF9yMDogXHQweCUwOGx4ICAgc3lzY2FsbF9ucjogJWxkXG4iLAorCSAgICAgICByZWdzLT5yZXN0YXJ0X3IwLCByZWdzLT5zeXNjYWxsX25yKTsKKwlwcmludGsoS0VSTl9FTUVSRyAicHJlZHM6IFx0XHQweCUwOGx4XG4iLCByZWdzLT5wcmVkcyk7CisJcHJpbnRrKEtFUk5fRU1FUkcgImxjMDogXHQweCUwOGx4ICAgc2EwOiAweCUwOGx4ICAgbTA6ICAweCUwOGx4XG4iLAorCSAgICAgICByZWdzLT5sYzAsIHJlZ3MtPnNhMCwgcmVncy0+bTApOworCXByaW50ayhLRVJOX0VNRVJHICJsYzE6IFx0MHglMDhseCAgIHNhMTogMHglMDhseCAgIG0xOiAgMHglMDhseFxuIiwKKwkgICAgICAgcmVncy0+bGMxLCByZWdzLT5zYTEsIHJlZ3MtPm0xKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiZ3A6IFx0MHglMDhseCAgIHVncDogMHglMDhseCAgIHVzcjogMHglMDhseFxuIiwKKwkgICAgICAgcmVncy0+Z3AsIHJlZ3MtPnVncCwgcmVncy0+dXNyKTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjA6IFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjAwLAorCQlyZWdzLT5yMDEsCisJCXJlZ3MtPnIwMiwKKwkJcmVncy0+cjAzKTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjQ6ICBcdDB4JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIHJlZ3MtPnIwNCwKKwkJcmVncy0+cjA1LAorCQlyZWdzLT5yMDYsCisJCXJlZ3MtPnIwNyk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInI4OiAgXHQweCUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCByZWdzLT5yMDgsCisJCXJlZ3MtPnIwOSwKKwkJcmVncy0+cjEwLAorCQlyZWdzLT5yMTEpOworCXByaW50ayhLRVJOX0VNRVJHICJyMTI6IFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjEyLAorCQlyZWdzLT5yMTMsCisJCXJlZ3MtPnIxNCwKKwkJcmVncy0+cjE1KTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjE2OiBcdDB4JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIHJlZ3MtPnIxNiwKKwkJcmVncy0+cjE3LAorCQlyZWdzLT5yMTgsCisJCXJlZ3MtPnIxOSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInIyMDogXHQweCUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCByZWdzLT5yMjAsCisJCXJlZ3MtPnIyMSwKKwkJcmVncy0+cjIyLAorCQlyZWdzLT5yMjMpOworCXByaW50ayhLRVJOX0VNRVJHICJyMjQ6IFx0MHglMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgcmVncy0+cjI0LAorCQlyZWdzLT5yMjUsCisJCXJlZ3MtPnIyNiwKKwkJcmVncy0+cjI3KTsKKwlwcmludGsoS0VSTl9FTUVSRyAicjI4OiBcdDB4JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIHJlZ3MtPnIyOCwKKwkJcmVncy0+cjI5LAorCQlyZWdzLT5yMzAsCisJCXJlZ3MtPnIzMSk7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiZWxyOiBcdDB4JTA4bHggICBjYXVzZTogMHglMDhseCAgIHVzZXJfbW9kZTogJWRcbiIsCisJCXB0X2VscihyZWdzKSwgcHRfY2F1c2UocmVncyksIHVzZXJfbW9kZShyZWdzKSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInBzcDogXHQweCUwOGx4ICAgYmFkdmE6IDB4JTA4bHggICBpbnRfZW5hYmxlZDogJWRcbiIsCisJCXB0X3BzcChyZWdzKSwgcHRfYmFkdmEocmVncyksIGludHNfZW5hYmxlZChyZWdzKSk7Cit9CisKK3ZvaWQgZHVtbXlfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgZWxyID0gcHRfZWxyKHJlZ3MpOworCXByaW50ayhLRVJOX0VSUiAiVW5pbXBsZW1lbnRlZCBoYW5kbGVyOyBFTFI9MHglMDh4XG4iLCBlbHIpOworfQorCisKK3ZvaWQgYXJjaF9kb19JUlEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGlycSA9IHB0X2NhdXNlKHJlZ3MpOworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKKworCWlycV9lbnRlcigpOworCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOworCWlycV9leGl0KCk7CisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1faW5pdF9zZWd0YWJsZS5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9pbml0X3NlZ3RhYmxlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViYjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1faW5pdF9zZWd0YWJsZS5TCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogSW5pdGlhbCBwYWdlIHRhYmxlIGZvciBMaW51eCBrZXJuZWwgdW5kZXIgSGV4YWdvbiBWTSwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhlc2UgdGFibGVzIGFyZSBwcmUtY29tcHV0ZWQgYW5kIGxpbmtlZCBpbnRvIGtlcm5lbC4KKyAqLworCisjaW5jbHVkZSA8YXNtL3ZtX21tdS5oPgorLyogICNpbmNsdWRlIDxhc20vaW9tYXAuaD4gICovCisKKy8qCisgKiBTdGFydCB3aXRoIG1hcHBpbmcgUEE9MCB0byBib3RoIFZBPTB4MCBhbmQgVkE9MHhjMDAwMDAwIGFzIDE2TUIgbGFyZ2UgcGFnZXMuCisgKiBObyB1c2VyIG1vZGUgYWNjZXNzLCBSV1gsIHdyaXRlLWJhY2sgY2FjaGUuICBUaGUgZW50cnkgbmVlZHMKKyAqIHRvIGJlIHJlcGxpY2F0ZWQgZm9yIGFsbCA0IHZpcnR1YWwgc2VnbWVudHMgbWFwcGluZyB0byB0aGUgcGFnZS4KKyAqLworCisvKiAiQmlnIEtlcm5lbCBQYWdlIiAgKi8KKyNkZWZpbmUgQktQKHBhKSAoKChwYSkgJiBfX0hWTV9QVEVfUEdNQVNLXzRNQikJCVwKKwkJfCBfX0hWTV9QVEVfUiB8IF9fSFZNX1BURV9XIHwgX19IVk1fUFRFX1gJXAorCQl8IF9fSEVYQUdPTl9DX1dCX0wyIDw8IDYJCQlcCisJCXwgX19IVk1fUERFX1NfMTZNQikKKworLyogIE5vIGNhY2hlIHZlcnNpb24gICovCisKKyNkZWZpbmUgQktQR19JTyhwYSkgKCgocGEpICYgX19IVk1fUFRFX1BHTUFTS18xNk1CKSBcCisJCQl8IF9fSFZNX1BURV9SIHwgX19IVk1fUFRFX1cgfCBfX0hWTV9QVEVfWCBcCisJCQl8IF9fSFZNX1BERV9TXzE2TUIgfCBfX0hFWEFHT05fQ19ERVYgPDwgNiApCisKKyNkZWZpbmUgRk9VUktfSU8ocGEpICgoKHBhKSAmIF9fSFZNX1BURV9QR01BU0tfNEtCKSBcCisJCQl8IF9fSFZNX1BURV9SIHwgX19IVk1fUFRFX1cgfCBfX0hWTV9QVEVfWCBcCisJCQl8IF9fSEVYQUdPTl9DX0RFViA8PCA2ICkKKworI2RlZmluZSBMMl9QVFIocGEpICgoKHBhKSAmIF9fSFZNX1BURV9QR01BU0tfNEtCKSBcCisJCQl8IF9fSFZNX1BERV9TXzRLQiAgKQorCisjZGVmaW5lIFggX19IVk1fUERFX1NfSU5WQUxJRAorCisJLnAyYWxpZ24gMTIKKwkuZ2xvYmwgc3dhcHBlcl9wZ19kaXIKKwkuZ2xvYmwgX0tfaW5pdF9zZWd0YWJsZQorc3dhcHBlcl9wZ19kaXI6CisvKiBWQSAweDAwMDAwMDAwICovCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKy8qIFZBIDB4NDAwMDAwMDAgKi8KKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKy8qIFZBIDB4ODAwMDAwMDAgKi8KKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKwkud29yZCBYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgKKy8qMHhhOCovLndvcmQgWCxYLFgsWAorI2lmZGVmIENPTkZJR19DT01FVF9FQVJMWV9VQVJUX0RFQlVHCitVQVJUX1BURV9FTlRSWToKKy8qMHhhOSovLndvcmQgQktQR19JTygweGE5MDAwMDAwKSxCS1BHX0lPKDB4YTkwMDAwMDApLEJLUEdfSU8oMHhhOTAwMDAwMCksQktQR19JTygweGE5MDAwMDAwKQorI2Vsc2UKKy8qMHhhOSovLndvcmQgWCxYLFgsWAorI2VuZGlmCisvKjB4YWEqLy53b3JkIFgsWCxYLFgKKy8qMHhhYiovLndvcmQgWCxYLFgsWAorLyoweGFjKi8ud29yZCBYLFgsWCxYCisvKjB4YWQqLy53b3JkIFgsWCxYLFgKKy8qMHhhZSovLndvcmQgWCxYLFgsWAorLyoweGFmKi8ud29yZCBYLFgsWCxYCisvKjB4YjAqLy53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorCS53b3JkIFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWCxYLFgsWAorX0tfaW5pdF9zZWd0YWJsZToKKy8qIFZBIDB4QzAwMDAwMDAgKi8KKwkud29yZCBCS1AoMHgwMDAwMDAwMCksIEJLUCgweDAwNDAwMDAwKSwgQktQKDB4MDA4MDAwMDApLCBCS1AoMHgwMGMwMDAwMCkKKwkud29yZCBCS1AoMHgwMTAwMDAwMCksIEJLUCgweDAxNDAwMDAwKSwgQktQKDB4MDE4MDAwMDApLCBCS1AoMHgwMWMwMDAwMCkKKwkud29yZCBCS1AoMHgwMjAwMDAwMCksIEJLUCgweDAyNDAwMDAwKSwgQktQKDB4MDI4MDAwMDApLCBCS1AoMHgwMmMwMDAwMCkKKwkud29yZCBCS1AoMHgwMzAwMDAwMCksIEJLUCgweDAzNDAwMDAwKSwgQktQKDB4MDM4MDAwMDApLCBCS1AoMHgwM2MwMDAwMCkKKwkud29yZCBCS1AoMHgwNDAwMDAwMCksIEJLUCgweDA0NDAwMDAwKSwgQktQKDB4MDQ4MDAwMDApLCBCS1AoMHgwNGMwMDAwMCkKKwkud29yZCBCS1AoMHgwNTAwMDAwMCksIEJLUCgweDA1NDAwMDAwKSwgQktQKDB4MDU4MDAwMDApLCBCS1AoMHgwNWMwMDAwMCkKKwkud29yZCBCS1AoMHgwNjAwMDAwMCksIEJLUCgweDA2NDAwMDAwKSwgQktQKDB4MDY4MDAwMDApLCBCS1AoMHgwNmMwMDAwMCkKKwkud29yZCBCS1AoMHgwNzAwMDAwMCksIEJLUCgweDA3NDAwMDAwKSwgQktQKDB4MDc4MDAwMDApLCBCS1AoMHgwN2MwMDAwMCkKKworCS53b3JkIEJLUCgweDA4MDAwMDAwKSwgQktQKDB4MDg0MDAwMDApLCBCS1AoMHgwODgwMDAwMCksIEJLUCgweDA4YzAwMDAwKQorCS53b3JkIEJLUCgweDA5MDAwMDAwKSwgQktQKDB4MDk0MDAwMDApLCBCS1AoMHgwOTgwMDAwMCksIEJLUCgweDA5YzAwMDAwKQorCS53b3JkIEJLUCgweDBhMDAwMDAwKSwgQktQKDB4MGE0MDAwMDApLCBCS1AoMHgwYTgwMDAwMCksIEJLUCgweDBhYzAwMDAwKQorCS53b3JkIEJLUCgweDBiMDAwMDAwKSwgQktQKDB4MGI0MDAwMDApLCBCS1AoMHgwYjgwMDAwMCksIEJLUCgweDBiYzAwMDAwKQorCS53b3JkIEJLUCgweDBjMDAwMDAwKSwgQktQKDB4MGM0MDAwMDApLCBCS1AoMHgwYzgwMDAwMCksIEJLUCgweDBjYzAwMDAwKQorCS53b3JkIEJLUCgweDBkMDAwMDAwKSwgQktQKDB4MGQ0MDAwMDApLCBCS1AoMHgwZDgwMDAwMCksIEJLUCgweDBkYzAwMDAwKQorCS53b3JkIEJLUCgweDBlMDAwMDAwKSwgQktQKDB4MGU0MDAwMDApLCBCS1AoMHgwZTgwMDAwMCksIEJLUCgweDBlYzAwMDAwKQorCS53b3JkIEJLUCgweDBmMDAwMDAwKSwgQktQKDB4MGY0MDAwMDApLCBCS1AoMHgwZjgwMDAwMCksIEJLUCgweDBmYzAwMDAwKQorCisJLndvcmQgQktQKDB4MTAwMDAwMDApLCBCS1AoMHgxMDQwMDAwMCksIEJLUCgweDEwODAwMDAwKSwgQktQKDB4MTBjMDAwMDApCisJLndvcmQgQktQKDB4MTEwMDAwMDApLCBCS1AoMHgxMTQwMDAwMCksIEJLUCgweDExODAwMDAwKSwgQktQKDB4MTFjMDAwMDApCisJLndvcmQgQktQKDB4MTIwMDAwMDApLCBCS1AoMHgxMjQwMDAwMCksIEJLUCgweDEyODAwMDAwKSwgQktQKDB4MTJjMDAwMDApCisJLndvcmQgQktQKDB4MTMwMDAwMDApLCBCS1AoMHgxMzQwMDAwMCksIEJLUCgweDEzODAwMDAwKSwgQktQKDB4MTNjMDAwMDApCisJLndvcmQgQktQKDB4MTQwMDAwMDApLCBCS1AoMHgxNDQwMDAwMCksIEJLUCgweDE0ODAwMDAwKSwgQktQKDB4MTRjMDAwMDApCisJLndvcmQgQktQKDB4MTUwMDAwMDApLCBCS1AoMHgxNTQwMDAwMCksIEJLUCgweDE1ODAwMDAwKSwgQktQKDB4MTVjMDAwMDApCisJLndvcmQgQktQKDB4MTYwMDAwMDApLCBCS1AoMHgxNjQwMDAwMCksIEJLUCgweDE2ODAwMDAwKSwgQktQKDB4MTZjMDAwMDApCisJLndvcmQgQktQKDB4MTcwMDAwMDApLCBCS1AoMHgxNzQwMDAwMCksIEJLUCgweDE3ODAwMDAwKSwgQktQKDB4MTdjMDAwMDApCisKKwkud29yZCBCS1AoMHgxODAwMDAwMCksIEJLUCgweDE4NDAwMDAwKSwgQktQKDB4MTg4MDAwMDApLCBCS1AoMHgxOGMwMDAwMCkKKwkud29yZCBCS1AoMHgxOTAwMDAwMCksIEJLUCgweDE5NDAwMDAwKSwgQktQKDB4MTk4MDAwMDApLCBCS1AoMHgxOWMwMDAwMCkKKwkud29yZCBCS1AoMHgxYTAwMDAwMCksIEJLUCgweDFhNDAwMDAwKSwgQktQKDB4MWE4MDAwMDApLCBCS1AoMHgxYWMwMDAwMCkKKwkud29yZCBCS1AoMHgxYjAwMDAwMCksIEJLUCgweDFiNDAwMDAwKSwgQktQKDB4MWI4MDAwMDApLCBCS1AoMHgxYmMwMDAwMCkKKwkud29yZCBCS1AoMHgxYzAwMDAwMCksIEJLUCgweDFjNDAwMDAwKSwgQktQKDB4MWM4MDAwMDApLCBCS1AoMHgxY2MwMDAwMCkKKwkud29yZCBCS1AoMHgxZDAwMDAwMCksIEJLUCgweDFkNDAwMDAwKSwgQktQKDB4MWQ4MDAwMDApLCBCS1AoMHgxZGMwMDAwMCkKKwkud29yZCBCS1AoMHgxZTAwMDAwMCksIEJLUCgweDFlNDAwMDAwKSwgQktQKDB4MWU4MDAwMDApLCBCS1AoMHgxZWMwMDAwMCkKKwkud29yZCBCS1AoMHgxZjAwMDAwMCksIEJLUCgweDFmNDAwMDAwKSwgQktQKDB4MWY4MDAwMDApLCBCS1AoMHgxZmMwMDAwMCkKKworCS53b3JkIEJLUCgweDIwMDAwMDAwKSwgQktQKDB4MjA0MDAwMDApLCBCS1AoMHgyMDgwMDAwMCksIEJLUCgweDIwYzAwMDAwKQorCS53b3JkIEJLUCgweDIxMDAwMDAwKSwgQktQKDB4MjE0MDAwMDApLCBCS1AoMHgyMTgwMDAwMCksIEJLUCgweDIxYzAwMDAwKQorCS53b3JkIEJLUCgweDIyMDAwMDAwKSwgQktQKDB4MjI0MDAwMDApLCBCS1AoMHgyMjgwMDAwMCksIEJLUCgweDIyYzAwMDAwKQorCS53b3JkIEJLUCgweDIzMDAwMDAwKSwgQktQKDB4MjM0MDAwMDApLCBCS1AoMHgyMzgwMDAwMCksIEJLUCgweDIzYzAwMDAwKQorCS53b3JkIEJLUCgweDI0MDAwMDAwKSwgQktQKDB4MjQ0MDAwMDApLCBCS1AoMHgyNDgwMDAwMCksIEJLUCgweDI0YzAwMDAwKQorCS53b3JkIEJLUCgweDI1MDAwMDAwKSwgQktQKDB4MjU0MDAwMDApLCBCS1AoMHgyNTgwMDAwMCksIEJLUCgweDI1YzAwMDAwKQorCS53b3JkIEJLUCgweDI2MDAwMDAwKSwgQktQKDB4MjY0MDAwMDApLCBCS1AoMHgyNjgwMDAwMCksIEJLUCgweDI2YzAwMDAwKQorCS53b3JkIEJLUCgweDI3MDAwMDAwKSwgQktQKDB4Mjc0MDAwMDApLCBCS1AoMHgyNzgwMDAwMCksIEJLUCgweDI3YzAwMDAwKQorCisJLndvcmQgQktQKDB4MjgwMDAwMDApLCBCS1AoMHgyODQwMDAwMCksIEJLUCgweDI4ODAwMDAwKSwgQktQKDB4MjhjMDAwMDApCisJLndvcmQgQktQKDB4MjkwMDAwMDApLCBCS1AoMHgyOTQwMDAwMCksIEJLUCgweDI5ODAwMDAwKSwgQktQKDB4MjljMDAwMDApCisJLndvcmQgQktQKDB4MmEwMDAwMDApLCBCS1AoMHgyYTQwMDAwMCksIEJLUCgweDJhODAwMDAwKSwgQktQKDB4MmFjMDAwMDApCisJLndvcmQgQktQKDB4MmIwMDAwMDApLCBCS1AoMHgyYjQwMDAwMCksIEJLUCgweDJiODAwMDAwKSwgQktQKDB4MmJjMDAwMDApCisJLndvcmQgQktQKDB4MmMwMDAwMDApLCBCS1AoMHgyYzQwMDAwMCksIEJLUCgweDJjODAwMDAwKSwgQktQKDB4MmNjMDAwMDApCisJLndvcmQgQktQKDB4MmQwMDAwMDApLCBCS1AoMHgyZDQwMDAwMCksIEJLUCgweDJkODAwMDAwKSwgQktQKDB4MmRjMDAwMDApCisJLndvcmQgQktQKDB4MmUwMDAwMDApLCBCS1AoMHgyZTQwMDAwMCksIEJLUCgweDJlODAwMDAwKSwgQktQKDB4MmVjMDAwMDApCisJLndvcmQgQktQKDB4MmYwMDAwMDApLCBCS1AoMHgyZjQwMDAwMCksIEJLUCgweDJmODAwMDAwKSwgQktQKDB4MmZjMDAwMDApCisKKwkud29yZCBCS1AoMHgzMDAwMDAwMCksIEJLUCgweDMwNDAwMDAwKSwgQktQKDB4MzA4MDAwMDApLCBCS1AoMHgzMGMwMDAwMCkKKwkud29yZCBCS1AoMHgzMTAwMDAwMCksIEJLUCgweDMxNDAwMDAwKSwgQktQKDB4MzE4MDAwMDApLCBCS1AoMHgzMWMwMDAwMCkKKwkud29yZCBCS1AoMHgzMjAwMDAwMCksIEJLUCgweDMyNDAwMDAwKSwgQktQKDB4MzI4MDAwMDApLCBCS1AoMHgzMmMwMDAwMCkKKwkud29yZCBCS1AoMHgzMzAwMDAwMCksIEJLUCgweDMzNDAwMDAwKSwgQktQKDB4MzM4MDAwMDApLCBCS1AoMHgzM2MwMDAwMCkKKwkud29yZCBCS1AoMHgzNDAwMDAwMCksIEJLUCgweDM0NDAwMDAwKSwgQktQKDB4MzQ4MDAwMDApLCBCS1AoMHgzNGMwMDAwMCkKKwkud29yZCBCS1AoMHgzNTAwMDAwMCksIEJLUCgweDM1NDAwMDAwKSwgQktQKDB4MzU4MDAwMDApLCBCS1AoMHgzNWMwMDAwMCkKKwkud29yZCBCS1AoMHgzNjAwMDAwMCksIEJLUCgweDM2NDAwMDAwKSwgQktQKDB4MzY4MDAwMDApLCBCS1AoMHgzNmMwMDAwMCkKKwkud29yZCBCS1AoMHgzNzAwMDAwMCksIEJLUCgweDM3NDAwMDAwKSwgQktQKDB4Mzc4MDAwMDApLCBCS1AoMHgzN2MwMDAwMCkKKworCS53b3JkIEJLUCgweDM4MDAwMDAwKSwgQktQKDB4Mzg0MDAwMDApLCBCS1AoMHgzODgwMDAwMCksIEJLUCgweDM4YzAwMDAwKQorCS53b3JkIEJLUCgweDM5MDAwMDAwKSwgQktQKDB4Mzk0MDAwMDApLCBCS1AoMHgzOTgwMDAwMCksIEJLUCgweDM5YzAwMDAwKQorCS53b3JkIEJLUCgweDNhMDAwMDAwKSwgQktQKDB4M2E0MDAwMDApLCBCS1AoMHgzYTgwMDAwMCksIEJLUCgweDNhYzAwMDAwKQorCS53b3JkIEJLUCgweDNiMDAwMDAwKSwgQktQKDB4M2I0MDAwMDApLCBCS1AoMHgzYjgwMDAwMCksIEJLUCgweDNiYzAwMDAwKQorCS53b3JkIEJLUCgweDNjMDAwMDAwKSwgQktQKDB4M2M0MDAwMDApLCBCS1AoMHgzYzgwMDAwMCksIEJLUCgweDNjYzAwMDAwKQorCS53b3JkIEJLUCgweDNkMDAwMDAwKSwgQktQKDB4M2Q0MDAwMDApLCBCS1AoMHgzZDgwMDAwMCksIEJLUCgweDNkYzAwMDAwKQorX0tfaW9fbWFwOgorCS53b3JkIFgsWCxYLFggLyogMHgzZTAwMDAwMCAtIGRldmljZSBJTyBlYXJseSByZW1hcCAqLworCS53b3JkIFgsWCxYLFggLyogMHgzZjAwMDAwMCAtIGh5cGVydmlzb3Igc3BhY2UqLworCisjaWYgMAorLyoKKyAqIFRoaXMgaXMgaW4gaGVyZSBhcyBhbiBleGFtcGxlIGZvciBkZXZpY2VzIHdoaWNoIG5lZWQgdG8gYmUgbWFwcGVkIHJlYWxseQorICogZWFybHkuCisgKi8KKwkucDJhbGlnbiAxMgorCS5nbG9ibCBfS19pb19rbWFwCisJLmdsb2JsIF9LX2luaXRfZGV2aWNldGFibGUKK19LX2luaXRfZGV2aWNldGFibGU6ICAvKiAgU2hvdWxkIGJlIDRNQiB3b3J0aCBvZiBlbnRyaWVzICAqLworCS53b3JkIEZPVVJLX0lPKE1TTV9HUElPMV9QSFlTKSxGT1VSS19JTyhNU01fR1BJTzJfUEhZUyksRk9VUktfSU8oTVNNX1NJUkNfUEhZUyksWAorCS53b3JkIEZPVVJLX0lPKFRMTU1fR1BJTzFfUEhZUyksWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorCS53b3JkIFgsWCxYLFgKKwkud29yZCBYLFgsWCxYCisJLndvcmQgWCxYLFgsWAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3ZtX29wcy5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9vcHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQ3ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9vcHMuUwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEhleGFnb24gVk0gaW5zdHJ1Y3Rpb24gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworLyoKKyAqIEMgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWFjaGluZSAiaW5zdHJ1Y3Rpb25zIi4gIFRoZXNlCisgKiBjb3VsZCBiZSwgYW5kIHBlcmhhcHMgc29tZSBkYXkgd2lsbCBiZSwgaGFuZGxlZCBhcyBpbi1saW5lCisgKiBtYWNyb3MsIGJ1dCBmb3IgdHJhY2luZy9kZWJ1Z2dpbmcgaXQncyBoYW5keSB0byBoYXZlCisgKiBhIHNpbmdsZSBwb2ludCBvZiBpbnZvY2F0aW9uIGZvciBlYWNoIG9mIHRoZW0uCisgKiBDb252ZW5pZW50bHksIHRoZXkgdGFrZSBwYXJhbXRlcnMgYW5kIHJldHVybiB2YWx1ZXMKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgQUJJIGNhbGxpbmcgY29udmVudGlvbi4KKyAqLworCitFTlRSWShfX3ZtcnRlKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1SVEUpOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bXNldHZlYykKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUVkVDKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1zZXRpZSkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUSUUpOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bWdldGllKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1HRVRJRSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtaW50b3ApCisJdHJhcDEoI0hWTV9UUkFQMV9WTUlOVE9QKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1jbHJtYXApCisJdHJhcDEoI0hWTV9UUkFQMV9WTUNMUk1BUCk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtbmV3bWFwKQorCXIxID0gI1ZNX05FV01BUF9UWVBFX1BHVEFCTEVTOworCXRyYXAxKCNIVk1fVFJBUDFfVk1ORVdNQVApOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bWNhY2hlKQorCXRyYXAxKCNIVk1fVFJBUDFfVk1DQUNIRSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtZ2V0dGltZSkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNR0VUVElNRSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3Ztc2V0dGltZSkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUVElNRSk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3Ztd2FpdCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNV0FJVCk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZteWllbGQpCisJdHJhcDEoI0hWTV9UUkFQMV9WTVlJRUxEKTsKKwlqdW1wcglSMzE7CisKK0VOVFJZKF9fdm1zdGFydCkKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU1RBUlQpOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bXN0b3ApCisJdHJhcDEoI0hWTV9UUkFQMV9WTVNUT1ApOworCWp1bXByCVIzMTsKKworRU5UUlkoX192bXZwaWQpCisJdHJhcDEoI0hWTV9UUkFQMV9WTVZQSUQpOworCWp1bXByCVIzMTsKKworLyogIFByb2JhYmx5IG5vdCBhY3R1YWxseSBnb2luZyB0byB1c2UgdGhlc2U7IHNlZSB2bV9lbnRyeS5TICAqLworCitFTlRSWShfX3Ztc2V0cmVncykKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNU0VUUkVHUyk7CisJanVtcHIJUjMxOworCitFTlRSWShfX3ZtZ2V0cmVncykKKwl0cmFwMSgjSFZNX1RSQVAxX1ZNR0VUUkVHUyk7CisJanVtcHIJUjMxOwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV9zd2l0Y2guUyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fc3dpdGNoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlY2YyZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fc3dpdGNoLlMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvbnRleHQgc3dpdGNoIHN1cHBvcnQgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKKy50ZXh0CisKKy8qCisgKiBUaGUgcmVnaXN0ZXIgdXNlZCBhcyBhIGZhc3QtcGF0aCB0aHJlYWQgaW5mb3JtYXRpb24gcG9pbnRlcgorICogaXMgZGV0ZXJtaW5lZCBhcyBhIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbi4gIElmIGl0IGhhcHBlbnMKKyAqIHRvIGJlIGEgY2FsbGVlLXNhdmUgcmVnaXN0ZXIsIHdlJ3JlIGdvaW5nIHRvIGJlIHNhdmluZyBhbmQKKyAqIHJlc3RvcmluZyBpdCB0d2ljZSBoZXJlLgorICoKKyAqIFRoaXMgY29kZSBhbnRpY2lwYXRlcyBhIHJldmlzZWQgQUJJIHdoZXJlIFIyMC0yMyBhcmUgYWRkZWQKKyAqIHRvIHRoZSBzZXQgb2YgY2FsbGVlLXNhdmUgcmVnaXN0ZXJzLCBidXQgdGhpcyBzaG91bGQgYmUKKyAqIGJhY2t3YXJkIGNvbXBhdGlibGUgdG8gbGVnYWN5IHRvb2xzLgorICovCisKKworLyoKKyAqCXZvaWQgc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKyAqCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbGFzdCk7CisgKi8KKwkucDJhbGlnbiAyCisJLmdsb2JsIF9fc3dpdGNoX3RvCisJLnR5cGUJX19zd2l0Y2hfdG8sIEBmdW5jdGlvbgorCisvKgorICogV2hlbiB3ZSBleGl0IHRoZSB3b3JtaG9sZSwgd2UgbmVlZCB0byBzdG9yZSB0aGUgcHJldmlvdXMgdGFzaworICogaW4gdGhlIG5ldyBSMCdzIHBvaW50ZXIuICBUZWNobmljYWxseSBpdCBzaG91bGQgYmUgUjIsIGJ1dCB0aGV5IHNob3VsZAorICogYmUgdGhlIHNhbWU7IHNlZW1zIGxpa2UgYSBsZWdhY3kgdGhpbmcuICBJbiBzaG9ydCwgZG9uJ3QgYnV0Y2hlcgorICogUjAsIGxldCBpdCBnbyBiYWNrIG91dCB1bm1vbGVzdGVkLgorICovCisKK19fc3dpdGNoX3RvOgorCS8qCisJICogUHVzaCBjYWxsZWUtc2F2ZXMgb250byAicHJldiIgc3RhY2suCisJICogSGVyZSwgd2UncmUgc25lYWt5IGJlY2F1c2UgdGhlIExSIGFuZCBGUAorCSAqIHN0b3JhZ2Ugb2YgdGhlIHRocmVhZF9zdGFjayBzdHJ1Y3R1cmUKKwkgKiBpcyBhdXRvbWFnaWNhbGx5IGFsbG9jYXRlZCBieSBhbGxvY2ZyYW1lLAorCSAqIHNvIHdlIHBhc3Mgc3RydWN0IHNpemUgbGVzcyA4LgorCSAqLworCWFsbG9jZnJhbWUoIyhfU1dJVENIX1NUQUNLX1NJWkUgLSA4KSk7CisJbWVtZChSMjkrIyhfU1dJVENIX1IyNzI2KSk9UjI3OjI2OworCW1lbWQoUjI5KyMoX1NXSVRDSF9SMjUyNCkpPVIyNToyNDsKKwltZW1kKFIyOSsjKF9TV0lUQ0hfUjIzMjIpKT1SMjM6MjI7CisJbWVtZChSMjkrIyhfU1dJVENIX1IyMTIwKSk9UjIxOjIwOworCW1lbWQoUjI5KyMoX1NXSVRDSF9SMTkxOCkpPVIxOToxODsKKwltZW1kKFIyOSsjKF9TV0lUQ0hfUjE3MTYpKT1SMTc6MTY7CisJLyogU3Rhc2ggdGhyZWFkX2luZm8gcG9pbnRlciBpbiB0YXNrX3N0cnVjdCAqLworCW1lbXcoUjArI19UQVNLX1RIUkVBRF9JTkZPKSA9IFRIUkVBRElORk9fUkVHOworCW1lbXcoUjAgKyMoX1RBU0tfU1RSVUNUX1RIUkVBRCArIF9USFJFQURfU1RSVUNUX1NXSVRDSF9TUCkpID0gUjI5OworCS8qIFN3aXRjaCB0byAibmV4dCIgc3RhY2sgYW5kIHJlc3RvcmUgY2FsbGVlIHNhdmVzIGZyb20gdGhlcmUgKi8KKwlSMjkgPSBtZW13KFIxICsgIyhfVEFTS19TVFJVQ1RfVEhSRUFEICsgX1RIUkVBRF9TVFJVQ1RfU1dJVENIX1NQKSk7CisJeworCSAgICBSMjc6MjYgPSBtZW1kKFIyOSsjKF9TV0lUQ0hfUjI3MjYpKTsKKwkgICAgUjI1OjI0ID0gbWVtZChSMjkrIyhfU1dJVENIX1IyNTI0KSk7CisJfQorCXsKKwkgICAgUjIzOjIyID0gbWVtZChSMjkrIyhfU1dJVENIX1IyMzIyKSk7CisJICAgIFIyMToyMCA9IG1lbWQoUjI5KyMoX1NXSVRDSF9SMjEyMCkpOworCX0KKwl7CisJICAgIFIxOToxOCA9IG1lbWQoUjI5KyMoX1NXSVRDSF9SMTkxOCkpOworCSAgICBSMTc6MTYgPSBtZW1kKFIyOSsjKF9TV0lUQ0hfUjE3MTYpKTsKKwl9CisJeworCSAgICAvKiBUSFJFQURJTkZPX1JFRyBpcyBjdXJyZW50bHkgb25lIG9mIHRoZSBjYWxsZWUtc2F2ZWQgcmVncworCSAgICAgKiBhYm92ZSwgYW5kIHNvIGJlIHN1cmUgdG8gcmUtbG9hZCBpdCBsYXN0LgorCSAgICAgKi8KKwkgICAgVEhSRUFESU5GT19SRUcgPSBtZW13KFIxICsgI19UQVNLX1RIUkVBRF9JTkZPKTsKKwkgICAgUjMxOjMwID0gbWVtZChSMjkrI19TV0lUQ0hfRlApOworCX0KKwl7CisJICAgIFIyOSA9IGFkZChSMjksI19TV0lUQ0hfU1RBQ0tfU0laRSk7CisJICAgIGp1bXByIFIzMTsKKwl9CisJLnNpemUJX19zd2l0Y2hfdG8sIC4tX19zd2l0Y2hfdG8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fdmVjdG9ycy5TIGIvYXJjaC9oZXhhZ29uL2tlcm5lbC92bV92ZWN0b3JzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhNGI1MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1fdmVjdG9ycy5TCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBFdmVudCBqdW1wIHRhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCisudGV4dAorCisvKiAgVGhpcyBpcyByZWdpc3RlcmVkIGVhcmx5IG9uIHRvIGFsbG93IGFuZ2VsICAqLworLmdsb2JhbCBfS19wcm92aXNpb25hbF92ZWMKK19LX3Byb3Zpc2lvbmFsX3ZlYzoKKwlqdW1wIDFmOworCWp1bXAgMWY7CisJanVtcCAxZjsKKwlqdW1wIDFmOworCWp1bXAgMWY7CisJdHJhcDEoI0hWTV9UUkFQMV9WTVJURSkKKwlqdW1wIDFmOworCWp1bXAgMWY7CisKKworLmdsb2JhbCBfS19WTV9ldmVudF92ZWN0b3IKK19LX1ZNX2V2ZW50X3ZlY3RvcjoKKzE6CisJanVtcCAxYjsgIC8qICBSZXNldCAgKi8KKwlqdW1wIF9LX2VudGVyX21hY2hjaGVjazsKKwlqdW1wIF9LX2VudGVyX2dlbmV4OworCWp1bXAgMWI7ICAvKiAgMyBSc3ZkICAqLworCWp1bXAgMWI7ICAvKiAgNCBSc3ZkICAqLworCWp1bXAgX0tfZW50ZXJfdHJhcDA7CisJanVtcCAxYjsgIC8qICA2IFJzdmQgICovCisJanVtcCBfS19lbnRlcl9pbnRlcnJ1cHQ7CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2hleGFnb24va2VybmVsL3ZtbGludXgubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxZDNjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgSGV4YWdvbiBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjZGVmaW5lIExPQURfT0ZGU0VUIFBBR0VfT0ZGU0VUCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgkvKiAgTW9zdCBvZiB0aGUga2VybmVsIGRlZmluZXMgYXJlIGhlcmUgICovCisjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4JLyogIGV4Y2VwdCBmb3IgcGFnZV9vZmZzZXQgICovCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CQkvKiAgYW5kIG5vdyB3ZSdyZSBwdWxsaW5nIGNhY2hlIGxpbmUgc2l6ZSAgKi8KK09VVFBVVF9BUkNIKGhleGFnb24pCitFTlRSWShzdGV4dCkKKworamlmZmllcyA9IGppZmZpZXNfNjQ7CisKKy8qCitTZWUgYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaCBmb3IgZXhwYW5zaW9uIG9mIHNvbWUgb2YgdGhlc2UgbWFjcm9zLgorU2VlIGFzbS1nZW5lcmljL3NlY3Rpb25zLmggZm9yIHNlZW1pbmdseSByZXF1aXJlZCBsYWJlbHMuCisqLworCisjZGVmaW5lIFBBR0VfU0laRSBfUEFHRV9TSVpFCisKKy8qICBUaGlzIExPQURfT0ZGU0VUIGlzIHRlbXBvcmFyeSBmb3IgZGVidWdnaW5nIG9uIHRoZSBzaW11bGF0b3I7IGl0IG1heSBjaGFuZ2UKKyAgICBmb3IgaHlwZXJ2aXNvciBwc2V1ZG8tcGh5c2ljYWwgbWVtb3J5LiAgKi8KKworCitTRUNUSU9OUworeworCS4gPSBQQUdFX09GRlNFVCArIExPQURfQUREUkVTUzsKKworCV9faW5pdF9iZWdpbiA9IC47CisJSEVBRF9URVhUX1NFQ1RJT04KKwlJTklUX1RFWFRfU0VDVElPTihQQUdFX1NJWkUpCisJUEVSQ1BVX1NFQ1RJT04oTDFfQ0FDSEVfQllURVMpCisJX19pbml0X2VuZCA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKF9QQUdFX1NJWkUpOworCV9zdGV4dCA9IC47CisJLnRleHQgOiBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisJCV90ZXh0ID0gLjsKKwkJVEVYVF9URVhUCisJCVNDSEVEX1RFWFQKKwkJTE9DS19URVhUCisJCUtQUk9CRVNfVEVYVAorCQkqKC5maXh1cCkKKwl9CisJX2V0ZXh0ID0gLjsKKworCUlOSVRfREFUQV9TRUNUSU9OKFBBR0VfU0laRSkKKworCV9zZGF0YSA9IC47CisJCVJXX0RBVEFfU0VDVElPTigzMixQQUdFX1NJWkUsUEFHRV9TSVpFKQorCQlST19EQVRBX1NFQ1RJT04oUEFHRV9TSVpFKQorCV9lZGF0YSA9IC47CisKKwlFWENFUFRJT05fVEFCTEUoMTYpCisJTk9URVMKKworCUJTU19TRUNUSU9OKF9QQUdFX1NJWkUsIF9QQUdFX1NJWkUsIF9QQUdFX1NJWkUpCisKKwlfZW5kID0gLjsKKworCS9ESVNDQVJELyA6IHsKKwkJRVhJVF9URVhUCisJCUVYSVRfREFUQQorCQlFWElUX0NBTEwKKwl9CisKKwlTVEFCU19ERUJVRworCURXQVJGX0RFQlVHCisKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9saWIvTWFrZWZpbGUgYi9hcmNoL2hleGFnb24vbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDY1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbGliL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIworIyBNYWtlZmlsZSBmb3IgaGV4YWdvbi1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLgorIworb2JqLXkgPSBjaGVja3N1bS5vIGlvLm8gbWVtY3B5Lm8gbWVtc2V0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaGV4YWdvbi9saWIvY2hlY2tzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzAwNTUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2xpYi9jaGVja3N1bS5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ2hlY2tzdW0gZnVuY3Rpb25zIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogIFRoaXMgd2FzIGRlcml2ZWQgZnJvbSBhcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jICAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KKworCisvKiAgVmVjdG9yIHZhbHVlIG9wZXJhdGlvbnMgICovCisjZGVmaW5lIFNJR04oeCwgeSkJKCgweDgwMDBVTEwqeCk8PHkpCisjZGVmaW5lIENBUlJZKHgsIHkpCSgoMHgwMDAyVUxMKngpPDx5KQorI2RlZmluZSBTRUxFQ1QoeCwgeSkJKCgweDAwMDFVTEwqeCk8PHkpCisKKyNkZWZpbmUgVlJfTkVHQVRFKGEsIGIsIGMsIGQpCShTSUdOKGEsIDQ4KSArIFNJR04oYiwgMzIpICsgU0lHTihjLCAxNikgXAorCSsgU0lHTihkLCAwKSkKKyNkZWZpbmUgVlJfQ0FSUlkoYSwgYiwgYywgZCkJKENBUlJZKGEsIDQ4KSArIENBUlJZKGIsIDMyKSArIENBUlJZKGMsIDE2KSBcCisJKyBDQVJSWShkLCAwKSkKKyNkZWZpbmUgVlJfU0VMRUNUKGEsIGIsIGMsIGQpCShTRUxFQ1QoYSwgNDgpICsgU0VMRUNUKGIsIDMyKSArIFNFTEVDVChjLCAxNikgXAorCSsgU0VMRUNUKGQsIDApKQorCisKKy8qIG9wdGltaXplZCBIRVhBR09OIFYzIGludHJpbnNpYyB2ZXJzaW9uICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGZyb202NHRvMTYodTY0IHgpCit7CisJdTY0IHN1bTsKKworCXN1bSA9IEhFWEFHT05fUF92cm1weWhfUFAoeF5WUl9ORUdBVEUoMSwgMSwgMSwgMSksCisJCQkgICAgIFZSX1NFTEVDVCgxLCAxLCAxLCAxKSk7CisJc3VtICs9IFZSX0NBUlJZKDAsIDAsIDEsIDApOworCXN1bSA9IEhFWEFHT05fUF92cm1weWhfUFAoc3VtLCBWUl9TRUxFQ1QoMCwgMCwgMSwgMSkpOworCisJcmV0dXJuIDB4RkZGRiAmIHN1bTsKK30KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCisgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZC4KKyAqLworX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAorCQkJICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJICBfX3dzdW0gc3VtKQoreworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5mcm9tNjR0bzE2KAorCQkoX19mb3JjZSB1NjQpc2FkZHIgKyAoX19mb3JjZSB1NjQpZGFkZHIgKworCQkoX19mb3JjZSB1NjQpc3VtICsgKChsZW4gKyBwcm90bykgPDwgOCkpOworfQorCitfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCisJCQkgIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkgIF9fd3N1bSBzdW0pCit7CisJdTY0IHJlc3VsdDsKKworCXJlc3VsdCA9IChfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCSAoX19mb3JjZSB1NjQpc3VtICsgKChsZW4gKyBwcm90bykgPDwgOCk7CisKKwkvKiBGb2xkIGRvd24gdG8gMzItYml0cyBzbyB3ZSBkb24ndCBsb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MKKwkgICBuZXR3b3JrIHN0YWNrLiAgKi8KKwkvKiA2NCB0byAzMyAqLworCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmVUwpICsgKHJlc3VsdCA+PiAzMik7CisJLyogMzMgdG8gMzIgKi8KKwlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZlVMKSArIChyZXN1bHQgPj4gMzIpOworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChjc3VtX3RjcHVkcF9ub2ZvbGQpOworCisvKgorICogRG8gYSA2NC1iaXQgY2hlY2tzdW0gb24gYW4gYXJiaXRyYXJ5IG1lbW9yeSBhcmVhLi4KKyAqCisgKiBUaGlzIGlzbid0IGEgZ3JlYXQgcm91dGluZSwgYnV0IGl0J3Mgbm90IF9ob3JyaWJsZV8gZWl0aGVyLiBUaGUKKyAqIGlubmVyIGxvb3AgY291bGQgYmUgdW5yb2xsZWQgYSBiaXQgZnVydGhlciwgYW5kIHRoZXJlIGFyZSBiZXR0ZXIKKyAqIHdheXMgdG8gZG8gdGhlIGNhcnJ5LCBidXQgdGhpcyBpcyByZWFzb25hYmxlLgorICovCisKKy8qIG9wdGltaXplZCBIRVhBR09OIGludHJpbnNpYyB2ZXJzaW9uLCB3aXRoIG92ZXIgcmVhZCBmaXhlZCAqLwordW5zaWduZWQgaW50IGRvX2NzdW0oY29uc3Qgdm9pZCAqdm9pZHB0ciwgaW50IGxlbikKK3sKKwl1NjQgc3VtMCwgc3VtMSwgeDAsIHgxLCAqcHRyOF9vLCAqcHRyOF9lLCAqcHRyODsKKwlpbnQgaSwgc3RhcnQsIG1pZCwgZW5kLCBtYXNrOworCWNvbnN0IGNoYXIgKnB0ciA9IHZvaWRwdHI7CisJdW5zaWduZWQgc2hvcnQgKnB0cjI7CisJdW5zaWduZWQgaW50ICpwdHI0OworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gMDsKKworCXN0YXJ0ID0gMHhGICYgKDE2LSgoKGludCkgcHRyKSAmIDB4RikpIDsKKwltYXNrICA9IDB4N2ZmZmZmZmZVTCA+PiBIRVhBR09OX1JfY2wwX1IobGVuKTsKKwlzdGFydCA9IHN0YXJ0ICYgbWFzayA7CisKKwltaWQgPSBsZW4gLSBzdGFydDsKKwllbmQgPSBtaWQgJiAweEY7CisJbWlkID0gbWlkPj40OworCXN1bTAgPSBtaWQgPDwgMTg7CisJc3VtMSA9IDA7CisKKwlpZiAoc3RhcnQgJiAxKQorCQlzdW0wICs9ICh1NjQpIChwdHJbMF0gPDwgOCk7CisJcHRyMiA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcHRyW3N0YXJ0ICYgMV07CisJaWYgKHN0YXJ0ICYgMikKKwkJc3VtMSArPSAodTY0KSBwdHIyWzBdOworCXB0cjQgPSAodW5zaWduZWQgaW50ICopICZwdHJbc3RhcnQgJiAzXTsKKwlpZiAoc3RhcnQgJiA0KSB7CisJCXN1bTAgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTAsCisJCQlWUl9ORUdBVEUoMCwgMCwgMSwgMSleKCh1NjQpcHRyNFswXSksCisJCQlWUl9TRUxFQ1QoMCwgMCwgMSwgMSkpOworCQlzdW0wICs9IFZSX1NFTEVDVCgwLCAwLCAxLCAwKTsKKwl9CisJcHRyOCA9ICh1NjQgKikgJnB0cltzdGFydCAmIDddOworCWlmIChzdGFydCAmIDgpIHsKKwkJc3VtMSA9IEhFWEFHT05fUF92cm1weWhhY2NfUFAoc3VtMSwKKwkJCVZSX05FR0FURSgxLCAxLCAxLCAxKV4ocHRyOFswXSksCisJCQlWUl9TRUxFQ1QoMSwgMSwgMSwgMSkpOworCQlzdW0xICs9IFZSX0NBUlJZKDAsIDAsIDEsIDApOworCX0KKwlwdHI4X28gPSAodTY0ICopIChwdHIgKyBzdGFydCk7CisJcHRyOF9lID0gKHU2NCAqKSAocHRyICsgc3RhcnQgKyA4KTsKKworCWlmIChtaWQpIHsKKwkJeDAgPSAqcHRyOF9lOyBwdHI4X2UgKz0gMjsKKwkJeDEgPSAqcHRyOF9vOyBwdHI4X28gKz0gMjsKKwkJaWYgKG1pZCA+IDEpCisJCQlmb3IgKGkgPSAwOyBpIDwgbWlkLTE7IGkrKykgeworCQkJCXN1bTAgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTAsCisJCQkJCXgwXlZSX05FR0FURSgxLCAxLCAxLCAxKSwKKwkJCQkJVlJfU0VMRUNUKDEsIDEsIDEsIDEpKTsKKwkJCQlzdW0xID0gSEVYQUdPTl9QX3ZybXB5aGFjY19QUChzdW0xLAorCQkJCQl4MV5WUl9ORUdBVEUoMSwgMSwgMSwgMSksCisJCQkJCVZSX1NFTEVDVCgxLCAxLCAxLCAxKSk7CisJCQkJeDAgPSAqcHRyOF9lOyBwdHI4X2UgKz0gMjsKKwkJCQl4MSA9ICpwdHI4X287IHB0cjhfbyArPSAyOworCQkJfQorCQlzdW0wID0gSEVYQUdPTl9QX3ZybXB5aGFjY19QUChzdW0wLCB4MF5WUl9ORUdBVEUoMSwgMSwgMSwgMSksCisJCQlWUl9TRUxFQ1QoMSwgMSwgMSwgMSkpOworCQlzdW0xID0gSEVYQUdPTl9QX3ZybXB5aGFjY19QUChzdW0xLCB4MV5WUl9ORUdBVEUoMSwgMSwgMSwgMSksCisJCQlWUl9TRUxFQ1QoMSwgMSwgMSwgMSkpOworCX0KKworCXB0cjQgPSAodW5zaWduZWQgaW50ICopICZwdHJbc3RhcnQgKyAobWlkICogMTYpICsgKGVuZCAmIDgpXTsKKwlpZiAoZW5kICYgNCkgeworCQlzdW0xID0gSEVYQUdPTl9QX3ZybXB5aGFjY19QUChzdW0xLAorCQkJVlJfTkVHQVRFKDAsIDAsIDEsIDEpXigodTY0KXB0cjRbMF0pLAorCQkJVlJfU0VMRUNUKDAsIDAsIDEsIDEpKTsKKwkJc3VtMSArPSBWUl9TRUxFQ1QoMCwgMCwgMSwgMCk7CisJfQorCXB0cjIgPSAodW5zaWduZWQgc2hvcnQgKikgJnB0cltzdGFydCArIChtaWQgKiAxNikgKyAoZW5kICYgMTIpXTsKKwlpZiAoZW5kICYgMikKKwkJc3VtMCArPSAodTY0KSBwdHIyWzBdOworCisJaWYgKGVuZCAmIDEpCisJCXN1bTEgKz0gKHU2NCkgcHRyW3N0YXJ0ICsgKG1pZCAqIDE2KSArIChlbmQgJiAxNCldOworCisJcHRyOCA9ICh1NjQgKikgJnB0cltzdGFydCArIChtaWQgKiAxNildOworCWlmIChlbmQgJiA4KSB7CisJCXN1bTAgPSBIRVhBR09OX1BfdnJtcHloYWNjX1BQKHN1bTAsCisJCQlWUl9ORUdBVEUoMSwgMSwgMSwgMSleKHB0cjhbMF0pLAorCQkJVlJfU0VMRUNUKDEsIDEsIDEsIDEpKTsKKwkJc3VtMCArPSBWUl9DQVJSWSgwLCAwLCAxLCAwKTsKKwl9CisJc3VtMCA9IEhFWEFHT05fUF92cm1weWhfUFAoKHN1bTArc3VtMSleVlJfTkVHQVRFKDAsIDAsIDAsIDEpLAorCQlWUl9TRUxFQ1QoMCwgMCwgMSwgMSkpOworCXN1bTAgKz0gVlJfTkVHQVRFKDAsIDAsIDAsIDEpOworCXN1bTAgPSBIRVhBR09OX1BfdnJtcHloX1BQKHN1bTAsIFZSX1NFTEVDVCgwLCAwLCAxLCAxKSk7CisKKwlpZiAoc3RhcnQgJiAxKQorCQlzdW0wID0gKHN1bTAgPDwgOCkgfCAoMHhGRiAmIChzdW0wID4+IDgpKTsKKworCXJldHVybiAweEZGRkYgJiBzdW0wOworfQorCisvKgorICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCisgKi8KK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKK3sKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9saWIvaW8uYyBiL2FyY2gvaGV4YWdvbi9saWIvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU0N2JhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL2xpYi9pby5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBJL08gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogIFRoZXNlIGFyZSBhbGwgRklGTyByb3V0aW5lcyEgICovCisKKy8qCisgKiBfX3Jhd19yZWFkc3cgLSByZWFkIHdvcmRzIGEgc2hvcnQgYXQgYSB0aW1lCisgKiBAYWRkcjogIHNvdXJjZSBhZGRyZXNzCisgKiBAZGF0YTogIGRhdGEgYWRkcmVzcworICogQGxlbjogbnVtYmVyIG9mIHNob3J0cyB0byByZWFkCisgKi8KK3ZvaWQgX19yYXdfcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwljb25zdCB2b2xhdGlsZSBzaG9ydCBpbnQgKnNyYyA9IChzaG9ydCBpbnQgKikgYWRkcjsKKwlzaG9ydCBpbnQgKmRzdCA9IChzaG9ydCBpbnQgKikgZGF0YTsKKworCWlmICgodTMyKWRhdGEgJiAweDEpCisJCXBhbmljKCJ1bmFsaWduZWQgcG9pbnRlciB0byByZWFkc3ciKTsKKworCXdoaWxlIChsZW4tLSA+IDApCisJCSpkc3QrKyA9ICpzcmM7CisKK30KKworLyoKKyAqIF9fcmF3X3dyaXRlc3cgLSByZWFkIHdvcmRzIGEgc2hvcnQgYXQgYSB0aW1lCisgKiBAYWRkcjogIHNvdXJjZSBhZGRyZXNzCisgKiBAZGF0YTogIGRhdGEgYWRkcmVzcworICogQGxlbjogbnVtYmVyIG9mIHNob3J0cyB0byByZWFkCisgKi8KK3ZvaWQgX19yYXdfd3JpdGVzdyh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJY29uc3Qgc2hvcnQgaW50ICpzcmMgPSAoc2hvcnQgaW50ICopZGF0YTsKKwl2b2xhdGlsZSBzaG9ydCBpbnQgKmRzdCA9IChzaG9ydCBpbnQgKilhZGRyOworCisJaWYgKCh1MzIpZGF0YSAmIDB4MSkKKwkJcGFuaWMoInVuYWxpZ25lZCBwb2ludGVyIHRvIHdyaXRlc3ciKTsKKworCXdoaWxlIChsZW4tLSA+IDApCisJCSpkc3QgPSAqc3JjKys7CisKKworfQorCisvKiAgUHJldHR5IHN1cmUgbGVuIGlzIHByZS1hZGp1c3RlZCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgYWNjZXNzIGFscmVhZHkgKi8KK3ZvaWQgX19yYXdfcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwljb25zdCB2b2xhdGlsZSBsb25nICpzcmMgPSAobG9uZyAqKSBhZGRyOworCWxvbmcgKmRzdCA9IChsb25nICopIGRhdGE7CisKKwlpZiAoKHUzMilkYXRhICYgMHgzKQorCQlwYW5pYygidW5hbGlnbmVkIHBvaW50ZXIgdG8gcmVhZHNsIik7CisKKwl3aGlsZSAobGVuLS0gPiAwKQorCQkqZHN0KysgPSAqc3JjOworCisKK30KKwordm9pZCBfX3Jhd193cml0ZXNsKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwljb25zdCBsb25nICpzcmMgPSAobG9uZyAqKWRhdGE7CisJdm9sYXRpbGUgbG9uZyAqZHN0ID0gKGxvbmcgKilhZGRyOworCisJaWYgKCh1MzIpZGF0YSAmIDB4MykKKwkJcGFuaWMoInVuYWxpZ25lZCBwb2ludGVyIHRvIHdyaXRlc2wiKTsKKworCXdoaWxlIChsZW4tLSA+IDApCisJCSpkc3QgPSAqc3JjKys7CisKKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2xpYi9tZW1jcHkuUyBiL2FyY2gvaGV4YWdvbi9saWIvbWVtY3B5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMWMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9saWIvbWVtY3B5LlMKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIERlc2NyaXB0aW9uCisgKgorICogICBsaWJyYXJ5IGZ1bmN0aW9uIGZvciBtZW1jcHkgd2hlcmUgbGVuZ3RoIGJ5dGVzIGFyZSBjb3BpZWQgZnJvbQorICogICBwdHJfaW4gdG8gcHRyX291dC4gcHRyX291dCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCisgKiAgIEFsbG93cyBhbnkgY29tYmluYXRpb24gb2YgYWxpZ25tZW50IG9uIGlucHV0IGFuZCBvdXRwdXQgcG9pbnRlcnMKKyAqICAgYW5kIGxlbmd0aCBmcm9tIDAgdG8gMl4zMi0xCisgKgorICogUmVzdHJpY3Rpb25zCisgKiAgIFRoZSBhcnJheXMgc2hvdWxkIG5vdCBvdmVybGFwLCB0aGUgcHJvZ3JhbSB3aWxsIHByb2R1Y2UgdW5kZWZpbmVkIG91dHB1dAorICogICBpZiB0aGV5IGRvLgorICogICBGb3IgYmxvY2tzIGxlc3MgdGhhbiAxNiBieXRlcyBhIGJ5dGUgYnkgYnl0ZSBjb3B5IGlzIHBlcmZvcm1lZC4gRm9yCisgKiAgIDhieXRlIGFsaWdubWVudHMsIGFuZCBsZW5ndGggbXVsdGlwbGVzLCBhIGR3b3JkIGNvcHkgaXMgcGVyZm9ybWVkIHVwIHRvCisgKiAgIDk2Ynl0ZXMKKyAqIEhpc3RvcnkKKyAqCisgKiAgIERKSCAgNS8xNS8wOSBJbml0aWFsIHZlcnNpb24gMS4wCisgKiAgIERKSCAgNi8gMS8wOSBWZXJzaW9uIDEuMSBtb2RpZmllZCBBQkkgdG8gaW5sY3VkZSBSMTYtUjE5CisgKiAgIERKSCAgNy8xMi8wOSBWZXJzaW9uIDEuMiBvcHRpbWl6ZWQgY29kZXNpemUgZG93biB0byA3NjAgd2FzIDg0MAorICogICBESkggMTAvMTQvMDkgVmVyc2lvbiAxLjMgYWRkZWQgc3BlY2lhbCBsb29wIGZvciBhbGlnbmVkIGNhc2UsIHdhcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJlYWRpbmcgYmxvYXRlZCBjb2Rlc2l6ZSBiYWNrIHVwIHRvIDg5MgorICogICBESkggIDQvMjAvMTAgVmVyc2lvbiAxLjQgZml4ZWQgTGR3b3JkX2xvb3BfZXBpbG9nIGxvb3AgdG8gcHJldmVudCBsb2FkcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJpbmcgaWYgb25seSAxIGxlZnQgb3V0c3RhbmRpbmcsIGZpeGVzIGJ1ZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzODg4LCBjb3JyZWN0ZWQgZm9yIGFsbCBhbGlnbm1lbnRzLiBQZWVsZWQgb2ZmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDMyYnl0ZSBjaHVuayBmcm9tIGtlcm5lbCBsb29wIGFuZCBleHRlbmRlZCA4Ynl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCBhdCBlbmQgdG8gc29sdmUgYWxsIGNvbWJpbmF0aW9ucyBhbmQgcHJldmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlciByZWFkLiAgRml4ZWQgTGR3b3JkX2xvb3BfcHJvbG9nIHRvIHByZXZlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyZWFkIGZvciBibG9ja3MgbGVzcyB0aGFuIDQ4Ynl0ZXMuIFJlZHVjZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzaXplIHRvIDc1MiBieXRlcworICogICBESkggIDQvMjEvMTAgdmVyc2lvbiAxLjUgMS40IGZpeCBicm9rZSBjb2RlIGZvciBpbnB1dCBibG9jayBlbmRzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCB0byBkd29yZCBib3VuZGFyaWVzLHVuZGVyd3JpdGluZyBieSAxCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlLCBhZGRlZCBkZXRlY3Rpb24gZm9yIHRoaXMgYW5kIGZpeGVkLiBBCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXR0bGUgYmxvYXQuCisgKiAgIERKSCAgNC8yMy8xMCB2ZXJzaW9uIDEuNiBjb3JyZWN0ZWQgc3RhY2sgZXJyb3IsIFIyMCB3YXMgbm90IGJlaW5nIHJlc3RvcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMsIGZpeGVkIHRoZSBlcnJvciBvZiBSMjAgYmVpbmcgbW9kaWZpZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBpdCB3YXMgYmVpbmcgc2F2ZWQKKyAqIE5hdHVyYWwgYyBtb2RlbAorICogPT09PT09PT09PT09PT09CisgKiB2b2lkICogbWVtY3B5KGNoYXIgKiBwdHJfb3V0LCBjaGFyICogcHRyX2luLCBpbnQgbGVuZ3RoKSB7CisgKiAgIGludCBpOworICogICBpZihsZW5ndGgpIGZvcihpPTA7IGkgPCBsZW5ndGg7IGkrKykgeyBwdHJfb3V0W2ldID0gcHRyX2luW2ldOyB9CisgKiAgIHJldHVybihwdHJfb3V0KTsKKyAqIH0KKyAqCisgKiBPcHRpbWl6ZWQgbWVtY3B5IGZ1bmN0aW9uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB2b2lkICogbWVtY3B5KGNoYXIgKiBwdHJfb3V0LCBjaGFyICogcHRyX2luLCBpbnQgbGVuKSB7CisgKiAgIGludCBpLCBwcm9sb2csIGtlcm5lbCwgZXBpbG9nLCBtYXNrOworICogICB1OCBvZmZzZXQ7CisgKiAgIHM2NCBkYXRhMCwgZGF0YUY4LCBkYXRhNzA7CisgKgorICogICBzNjQgKiBwdHI4X2luOworICogICBzNjQgKiBwdHI4X291dDsKKyAqICAgczMyICogcHRyNDsKKyAqICAgczE2ICogcHRyMjsKKyAqCisgKiAgIG9mZnNldCA9ICgoaW50KSBwdHJfaW4pICYgNzsKKyAqICAgcHRyOF9pbiA9IChzNjQgKikgJnB0cl9pblstb2Zmc2V0XTsgICAvL3JlYWQgaW4gdGhlIGFsaWduZWQgcG9pbnRlcnMKKyAqCisgKiAgIGRhdGE3MCA9ICpwdHI4X2luKys7CisgKiAgIGRhdGFGOCA9ICpwdHI4X2luKys7CisgKgorICogICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhRjgsIGRhdGE3MCwgb2Zmc2V0KTsKKyAqCisgKiAgIHByb2xvZyA9IDMyIC0gKChpbnQpIHB0cl9vdXQpOworICogICBtYXNrICA9IDB4N2ZmZmZmZmYgPj4gSEVYQUdPTl9SX2NsMF9SKGxlbik7CisgKiAgIHByb2xvZyA9IHByb2xvZyAmIG1hc2s7CisgKiAgIGtlcm5lbCA9IGxlbiAtIHByb2xvZzsKKyAqICAgZXBpbG9nID0ga2VybmVsICYgMHgxRjsKKyAqICAga2VybmVsID0ga2VybmVsPj41OworICoKKyAqICAgaWYgKHByb2xvZyAmIDEpIHsgcHRyX291dFswXSA9ICh1OCkgZGF0YTA7IGRhdGEwID4+PSA4OyBwdHJfb3V0ICs9IDE7fQorICogICBwdHIyID0gKHMxNiAqKSAmcHRyX291dFswXTsKKyAqICAgaWYgKHByb2xvZyAmIDIpIHsgcHRyMlswXSA9ICh1MTYpIGRhdGEwOyAgZGF0YTAgPj49IDE2OyBwdHJfb3V0ICs9IDI7fQorICogICBwdHI0ID0gKHMzMiAqKSAmcHRyX291dFswXTsKKyAqICAgaWYgKHByb2xvZyAmIDQpIHsgcHRyNFswXSA9ICh1MzIpIGRhdGEwOyAgZGF0YTAgPj49IDMyOyBwdHJfb3V0ICs9IDQ7fQorICoKKyAqICAgb2Zmc2V0ID0gb2Zmc2V0ICsgKHByb2xvZyAmIDcpOworICogICBpZiAob2Zmc2V0ID49IDgpIHsKKyAqICAgICBkYXRhNzAgPSBkYXRhRjg7CisgKiAgICAgZGF0YUY4ID0gKnB0cjhfaW4rKzsKKyAqICAgfQorICogICBvZmZzZXQgPSBvZmZzZXQgJiAweDc7CisgKgorICogICBwcm9sb2cgPSBwcm9sb2cgPj4gMzsKKyAqICAgaWYgKHByb2xvZykgZm9yIChpPTA7IGkgPCBwcm9sb2c7IGkrKykgeworICogICAgICAgZGF0YTAgPSBIRVhBR09OX1BfdmFsaWduYl9QUHAoZGF0YUY4LCBkYXRhNzAsIG9mZnNldCk7CisgKiAgICAgICBwdHI4X291dCA9IChzNjQgKikgJnB0cl9vdXRbMF07ICpwdHI4X291dCA9IGRhdGEwOyBwdHJfb3V0ICs9IDg7CisgKiAgICAgICBkYXRhNzAgPSBkYXRhRjg7CisgKiAgICAgICBkYXRhRjggPSAqcHRyOF9pbisrOworICogICB9CisgKiAgIGlmKGtlcm5lbCkgeyBrZXJuZWwgLT0gMTsgZXBpbG9nICs9IDMyOyB9CisgKiAgIGlmKGtlcm5lbCkgZm9yKGk9MDsgaSA8IGtlcm5lbDsgaSsrKSB7CisgKiAgICAgICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhRjgsIGRhdGE3MCwgb2Zmc2V0KTsKKyAqICAgICAgIHB0cjhfb3V0ID0gKHM2NCAqKSAmcHRyX291dFswXTsgKnB0cjhfb3V0ID0gZGF0YTA7IHB0cl9vdXQgKz0gODsKKyAqICAgICAgIGRhdGE3MCA9ICpwdHI4X2luKys7CisgKgorICogICAgICAgZGF0YTAgPSBIRVhBR09OX1BfdmFsaWduYl9QUHAoZGF0YTcwLCBkYXRhRjgsIG9mZnNldCk7CisgKiAgICAgICBwdHI4X291dCA9IChzNjQgKikgJnB0cl9vdXRbMF07ICpwdHI4X291dCA9IGRhdGEwOyBwdHJfb3V0ICs9IDg7CisgKiAgICAgICBkYXRhRjggPSAqcHRyOF9pbisrOworICoKKyAqICAgICAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGFGOCwgZGF0YTcwLCBvZmZzZXQpOworICogICAgICAgcHRyOF9vdXQgPSAoczY0ICopICZwdHJfb3V0WzBdOyAqcHRyOF9vdXQgPSBkYXRhMDsgcHRyX291dCArPSA4OworICogICAgICAgZGF0YTcwID0gKnB0cjhfaW4rKzsKKyAqCisgKiAgICAgICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhNzAsIGRhdGFGOCwgb2Zmc2V0KTsKKyAqICAgICAgIHB0cjhfb3V0ID0gKHM2NCAqKSAmcHRyX291dFswXTsgKnB0cjhfb3V0ID0gZGF0YTA7IHB0cl9vdXQgKz0gODsKKyAqICAgICAgIGRhdGFGOCA9ICpwdHI4X2luKys7CisgKiAgIH0KKyAqICAgZXBpbG9nZHdzID0gZXBpbG9nID4+IDM7CisgKiAgIGlmIChlcGlsb2dkd3MpIGZvciAoaT0wOyBpIDwgZXBpbG9nZHdzOyBpKyspIHsKKyAqICAgICAgIGRhdGEwID0gSEVYQUdPTl9QX3ZhbGlnbmJfUFBwKGRhdGFGOCwgZGF0YTcwLCBvZmZzZXQpOworICogICAgICAgcHRyOF9vdXQgPSAoczY0ICopICZwdHJfb3V0WzBdOyAqcHRyOF9vdXQgPSBkYXRhMDsgcHRyX291dCArPSA4OworICogICAgICAgZGF0YTcwID0gZGF0YUY4OworICogICAgICAgZGF0YUY4ID0gKnB0cjhfaW4rKzsKKyAqICAgfQorICogICBkYXRhMCA9IEhFWEFHT05fUF92YWxpZ25iX1BQcChkYXRhRjgsIGRhdGE3MCwgb2Zmc2V0KTsKKyAqCisgKiAgIHB0cjQgPSAoczMyICopICZwdHJfb3V0WzBdOworICogICBpZiAoZXBpbG9nICYgNCkgeyBwdHI0WzBdID0gKHUzMikgZGF0YTA7IGRhdGEwID4+PSAzMjsgcHRyX291dCArPSA0O30KKyAqICAgcHRyMiA9IChzMTYgKikgJnB0cl9vdXRbMF07CisgKiAgIGlmIChlcGlsb2cgJiAyKSB7IHB0cjJbMF0gPSAodTE2KSBkYXRhMDsgZGF0YTAgPj49IDE2OyBwdHJfb3V0ICs9IDI7fQorICogICBpZiAoZXBpbG9nICYgMSkgeyAqcHRyX291dCsrID0gKHU4KSBkYXRhMDsgfQorICoKKyAqICAgcmV0dXJuKHB0cl9vdXQgLSBsZW5ndGgpOworICogfQorICoKKyAqIENvZGVzaXplIDogNzg0IGJ5dGVzCisgKi8KKworCisjZGVmaW5lIHB0cl9vdXQJCVIwCS8qICBkZXN0aW5hdGlvbiAgcG91bnRlciAgKi8KKyNkZWZpbmUgcHRyX2luCQlSMQkvKiAgc291cmNlIHBvaW50ZXIgICovCisjZGVmaW5lIGxlbgkJUjIJLyogIGxlbmd0aCBvZiBjb3B5IGluIGJ5dGVzICAqLworCisjZGVmaW5lIGRhdGE3MAkJUjEzOjEyCS8qICBsbyA4IGJ5dGVzIG9mIG5vbi1hbGlnbmVkIHRyYW5zZmVyICAqLworI2RlZmluZSBkYXRhRjgJCVIxMToxMAkvKiAgaGkgOCBieXRlcyBvZiBub24tYWxpZ25lZCB0cmFuc2ZlciAgKi8KKyNkZWZpbmUgbGRhdGEwCQlSNzo2CS8qICBldmVuIDggYnl0ZXMgY2h1bmtzICAqLworI2RlZmluZSBsZGF0YTEJCVIyNToyNAkvKiAgb2RkIDggYnl0ZXMgY2h1bmtzICAqLworI2RlZmluZSBkYXRhMQkJUjcJLyogIGxvd2VyIDggYnl0ZXMgb2YgbGRhdGExICAqLworI2RlZmluZSBkYXRhMAkJUjYJLyogIGxvd2VyIDggYnl0ZXMgb2YgbGRhdGEwICAqLworCisjZGVmaW5lIGlmYnl0ZQkJcDAJLyogIGlmIHRyYW5zZmVyIGhhcyBieXRlcyBpbiBlcGlsb2cvcHJvbG9nICAqLworI2RlZmluZSBpZmh3b3JkCQlwMAkvKiAgaWYgdHJhbnNmZXIgaGFzIHNob3J0cyBpbiBlcGlsb2cvcHJvbG9nICAqLworI2RlZmluZSBpZndvcmQJCXAwCS8qICBpZiB0cmFuc2ZlciBoYXMgd29yZHMgaW4gZXBpbG9nL3Byb2xvZyAgKi8KKyNkZWZpbmUgbm9wcm9sb2cJcDAJLyogIG5vIHByb2xvZywgeGZlciBzdGFydHMgYXQgMzJieXRlICAqLworI2RlZmluZSBub2tlcm5lbAlwMQkvKiAgbm8gMzJieXRlIG11bHRpcGxlIGJsb2NrIGluIHRoZSB0cmFuc2ZlciAgKi8KKyNkZWZpbmUgbm9lcGlsb2cJcDAJLyogIG5vIGVwaWxvZywgeGZlciBlbmRzIG9uIDMyYnl0ZSBib3VuZGFyeSAgKi8KKyNkZWZpbmUgYWxpZ24JCXAyCS8qICBhbGlnbm1lbnQgb2YgaW5wdXQgcmVsIHRvIDhieXRlIGJvdW5kYXJ5ICAqLworI2RlZmluZSBrZXJuZWwxCQlwMAkvKiAga2VybmVsIGNvdW50ID09IDEgICovCisKKyNkZWZpbmUgZGFsaWduCQlSMjUJLyogIHJlbCBhbGlnbm1lbnQgb2YgaW5wdXQgdG8gb3V0cHV0IGRhdGEgICovCisjZGVmaW5lIHN0YXIzCQlSMTYJLyogIG51bWJlciBieXRlcyBpbiBwcm9sb2cgLSBkd29yZHMgICovCisjZGVmaW5lIHJlc3QJCVI4CS8qICBsZW5ndGggLSBwcm9sb2cgYnl0ZXMgICovCisjZGVmaW5lIGJhY2sJCVI3CS8qICBuciBieXRlcyA+IGR3b3JkIGJvdW5kYXJ5IGluIHNyYyBibG9jayAgKi8KKyNkZWZpbmUgZXBpbG9nCQlSMwkvKiAgYnl0ZXMgaW4gZXBpbG9nICAqLworI2RlZmluZSBpbmMJCVIxNToxNAkvKiAgaW5jIGtlcm5lbCBieSAtMSBhbmQgZGVmZXRjaCBwdHIgYnkgMzIgICovCisjZGVmaW5lIGtlcm5lbAkJUjQJLyogIG51bWJlciBvZiAzMmJ5dGUgY2h1bmtzIGluIGtlcm5lbCAgKi8KKyNkZWZpbmUgcHRyX2luX3BfMTI4CVI1CS8qICBwb2ludGVyIGZvciBwcmVmZXRjaCBvZiBpbnB1dCBkYXRhICAqLworI2RlZmluZSBtYXNrCQlSOAkvKiAgbWFzayB1c2VkIHRvIGRldGVybWluZSBwcm9sb2cgc2l6ZSAgKi8KKyNkZWZpbmUgc2hpZnQJCVI4CS8qICB1c2VkIHRvIHdvcmsgYSBzaGlmdGVyIHRvIGV4dHJhY3QgYnl0ZXMgICovCisjZGVmaW5lIHNoaWZ0MgkJUjUJLyogIGluIGVwaWxvZyB0byB3b3Jrc2hpZnRlciB0byBleHRyYWN0IGJ5dGVzICovCisjZGVmaW5lIHByb2xvZwkJUjE1CS8qICBieXRlcyBpbiAgcHJvbG9nICAqLworI2RlZmluZSBlcGlsb2dkd3MJUjE1CS8qICBudW1iZXIgZHdvcmRzIGluIGVwaWxvZyAgKi8KKyNkZWZpbmUgc2hpZnRiCQlSMTQJLyogIHVzZWQgdG8gZXh0cmFjdCBieXRlcyAgKi8KKyNkZWZpbmUgb2Zmc2V0CQlSOQkvKiAgc2FtZSBhcyBhbGlnbiBpbiByZWcgICovCisjZGVmaW5lIHB0cl9vdXRfcF8zMglSMTcJLyogIHBvaW50ZXIgdG8gb3V0cHV0IGRjemVybyAgKi8KKyNkZWZpbmUgYWxpZ244ODgJUjE0CS8qICBpZiBzaW1wbGUgZHdvcmQgbG9vcCBjYW4gYmUgdXNlZCAgKi8KKyNkZWZpbmUgbGVuOAkJUjkJLyogIG51bWJlciBvZiBkd29yZHMgaW4gbGVuZ3RoICAqLworI2RlZmluZSBvdmVyCQlSMjAJLyogIG5yIG9mIGJ5dGVzID4gbGFzdCBpbnAgYnVmIGR3b3JkIGJvdW5kYXJ5ICovCisKKyNkZWZpbmUgcHRyX2luX3BfMTI4a2VybmVsCVI1OjQJLyogIHBhY2tlZCBmZXRjaCBwb2ludGVyICYga2VybmVsIGNudCAqLworCisJLnNlY3Rpb24gLnRleHQKKwkucDJhbGlnbiA0CisgICAgICAgIC5nbG9iYWwgbWVtY3B5CisgICAgICAgIC50eXBlIG1lbWNweSwgQGZ1bmN0aW9uCittZW1jcHk6Cit7CisJcDIgPSBjbXAuZXEobGVuLCAjMCk7CQkvKiAgPTAgKi8KKwlhbGlnbjg4OCA9IG9yKHB0cl9pbiwgcHRyX291dCk7CS8qICAlOCA8IDk3ICovCisJcDAgPSBjbXAuZ3R1KGxlbiwgIzIzKTsJCS8qICAlMSwgPDI0ICovCisJcDEgPSBjbXAuZXEocHRyX2luLCBwdHJfb3V0KTsJLyogIGF0dGVtcHQgdG8gb3ZlcndyaXRlIHNlbGYgKi8KK30KK3sKKwlwMSA9IG9yKHAyLCBwMSk7CisJcDMgPSBjbXAuZ3R1KGxlbiwgIzk1KTsJCS8qICAlOCA8IDk3ICovCisJYWxpZ244ODggPSBvcihhbGlnbjg4OCwgbGVuKTsJLyogICU4IDwgOTcgKi8KKwlsZW44ID0gbHNyKGxlbiwgIzMpOwkJLyogICU4IDwgOTcgKi8KK30KK3sKKwlkY2ZldGNoKHB0cl9pbik7CQkvKiAgemVyby9wdHJpbj1wdHJvdXQgY2F1c2VzIGZldGNoICovCisJcDIgPSBiaXRzY2xyKGFsaWduODg4LCAjNyk7CS8qICAlOCA8IDk3ICAqLworCWlmKHAxKSBqdW1wciByMzE7CQkvKiAgPTAgICovCit9Cit7CisJcDIgPSBhbmQocDIsIXAzKTsJCQkvKiAgJTggPCA5NyAgKi8KKwlpZiAocDIubmV3KSBsZW4gPSBhZGQobGVuLCAjLTgpOwkvKiAgJTggPCA5NyAgKi8KKwlpZiAocDIubmV3KSBqdW1wOk5UIC5MZHdvcmRhbGlnbmVkOyAJLyogICU4IDwgOTcgICovCit9Cit7CisJaWYoIXAwKSBqdW1wIC5MYnl0ZXMyM29ybGVzczsJLyogICUxLCA8MjQgICovCisJbWFzay5sID0gI0xPKDB4N2ZmZmZmZmYpOworCS8qICBhbGwgYnl0ZXMgYmVmb3JlIGxpbmUgbXVsdGlwbGVzIG9mIGRhdGEgICovCisJcHJvbG9nID0gc3ViKCMwLCBwdHJfb3V0KTsKK30KK3sKKwkvKiAgc2F2ZSByMzEgb24gc3RhY2ssIGRlY3JlbWVudCBzcCBieSAxNiAgKi8KKwlhbGxvY2ZyYW1lKCMyNCk7CisJbWFzay5oID0gI0hJKDB4N2ZmZmZmZmYpOworCXB0cl9pbl9wXzEyOCA9IGFkZChwdHJfaW4sICMzMik7CisJYmFjayA9IGNsMChsZW4pOworfQoreworCW1lbWQoc3ArIzApID0gUjE3OjE2OwkJLyogIHNhdmUgcjE2LHIxNyBvbiBzdGFjazYgICovCisJcjMxLmwgPSAjTE8oLkxtZW1jcHlfcmV0dXJuKTsJLyogIHNldCB1cCBmaW5hbCByZXR1cm4gcG9pbnRlciAgKi8KKwlwcm9sb2cgJj0gbHNyKG1hc2ssIGJhY2spOworCW9mZnNldCA9IGFuZChwdHJfaW4sICM3KTsKK30KK3sKKwltZW1kKHNwKyM4KSA9IFIyNToyNDsJCS8qICBzYXZlIHIyNSxyMjQgb24gc3RhY2sgICovCisJZGFsaWduID0gc3ViKHB0cl9vdXQsIHB0cl9pbik7CisJcjMxLmggPSAjSEkoLkxtZW1jcHlfcmV0dXJuKTsJLyogIHNldCB1cCBmaW5hbCByZXR1cm4gcG9pbnRlciAgKi8KK30KK3sKKwkvKiAgc2VlIGlmIHRoZXJlIGlmIGlucHV0IGJ1ZmZlciBlbmQgaWYgYWxpZ25lZCAgKi8KKwlvdmVyID0gYWRkKGxlbiwgcHRyX2luKTsKKwliYWNrID0gYWRkKGxlbiwgb2Zmc2V0KTsKKwltZW1kKHNwKyMxNikgPSBSMjE6MjA7CQkvKiAgc2F2ZSByMjAscjIxIG9uIHN0YWNrICAqLworfQoreworCW5vcHJvbG9nID0gYml0c2Nscihwcm9sb2csICM3KTsKKwlwcm9sb2cgPSBhbmQocHJvbG9nLCAjMzEpOworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsKKwlwdHJfaW5fcF8xMjggPSBhZGQocHRyX2luX3BfMTI4LCAjMzIpOworfQoreworCWtlcm5lbCA9IHN1YihsZW4sIHByb2xvZyk7CisJc2hpZnQgPSBhc2wocHJvbG9nLCAjMyk7CisJc3RhcjMgPSBhbmQocHJvbG9nLCAjNyk7CisJcHRyX2luID0gYW5kKHB0cl9pbiwgIy04KTsKK30KK3sKKwlwcm9sb2cgPSBsc3IocHJvbG9nLCAjMyk7CisJZXBpbG9nID0gYW5kKGtlcm5lbCwgIzMxKTsKKwlwdHJfb3V0X3BfMzIgPSBhZGQocHRyX291dCwgcHJvbG9nKTsKKwlvdmVyID0gYW5kKG92ZXIsICM3KTsKK30KK3sKKwlwMyA9IGNtcC5ndHUoYmFjaywgIzgpOworCWtlcm5lbCA9IGxzcihrZXJuZWwsICM1KTsKKwlkY2ZldGNoKHB0cl9pbl9wXzEyOCk7CisJcHRyX2luX3BfMTI4ID0gYWRkKHB0cl9pbl9wXzEyOCwgIzMyKTsKK30KK3sKKwlwMSA9IGNtcC5lcShwcm9sb2csICMwKTsKKwlpZighcDEubmV3KSBwcm9sb2cgPSBhZGQocHJvbG9nLCAjMSk7CisJZGNmZXRjaChwdHJfaW5fcF8xMjgpOwkvKiAgcmVzZXJ2ZSB0aGUgbGluZSA2NGJ5dGVzIG9uICAqLworCXB0cl9pbl9wXzEyOCA9IGFkZChwdHJfaW5fcF8xMjgsICMzMik7Cit9Cit7CisJbm9rZXJuZWwgPSBjbXAuZXEoa2VybmVsLCMwKTsKKwlkY2ZldGNoKHB0cl9pbl9wXzEyOCk7CS8qIHJlc2VydmUgdGhlIGxpbmUgNjRieXRlcyBvbiAgKi8KKwlwdHJfaW5fcF8xMjggPSBhZGQocHRyX2luX3BfMTI4LCAjMzIpOworCXNoaWZ0YiA9IGFuZChzaGlmdCwgIzgpOworfQoreworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsJCS8qICByZXNlcnZlIHRoZSBsaW5lIDY0Ynl0ZXMgb24gICovCisJcHRyX2luX3BfMTI4ID0gYWRkKHB0cl9pbl9wXzEyOCwgIzMyKTsKKwlpZihub2tlcm5lbCkganVtcCAuTHNraXA2NDsKKwlwMiA9IGNtcC5lcShrZXJuZWwsICMxKTsJLyogIHNraXAgb3ZyIGlmIGtlcm5lbCA9PSAwICAqLworfQoreworCWRjemVyb2EocHRyX291dF9wXzMyKTsKKwkvKiAgZG9uJ3QgYWR2YW5jZSBwb2ludGVyICAqLworCWlmKCFwMikgcHRyX291dF9wXzMyID0gYWRkKHB0cl9vdXRfcF8zMiwgIzMyKTsKK30KK3sKKwlkYWxpZ24gPSBhbmQoZGFsaWduLCAjMzEpOworCWRjemVyb2EocHRyX291dF9wXzMyKTsKK30KKy5Mc2tpcDY0OgoreworCWRhdGE3MCA9IG1lbWQocHRyX2luKysjMTYpOworCWlmKHAzKSBkYXRhRjggPSBtZW1kKHB0cl9pbisjOCk7CisJaWYobm9wcm9sb2cpIGp1bXAgLkxub3Byb2xvZzMyOworCWFsaWduID0gb2Zmc2V0OworfQorLyogIHVwdG8gaW5pdGlhbCA3IGJ5dGVzICAqLworeworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YUY4LCBkYXRhNzAsIGFsaWduKTsKKwlpZmJ5dGUgPSB0c3RiaXQoc2hpZnQsIzMpOworCW9mZnNldCA9IGFkZChvZmZzZXQsIHN0YXIzKTsKK30KK3sKKwlpZihpZmJ5dGUpIG1lbWIocHRyX291dCsrIzEpID0gZGF0YTA7CisJbGRhdGEwID0gbHNyKGxkYXRhMCwgc2hpZnRiKTsKKwlzaGlmdGIgPSBhbmQoc2hpZnQsICMxNik7CisJaWZod29yZCA9IHRzdGJpdChzaGlmdCwjNCk7Cit9Cit7CisJaWYoaWZod29yZCkgbWVtaChwdHJfb3V0KysjMikgPSBkYXRhMDsKKwlsZGF0YTAgPSBsc3IobGRhdGEwLCBzaGlmdGIpOworCWlmd29yZCA9IHRzdGJpdChzaGlmdCwjNSk7CisJcDIgPSBjbXAuZ3R1KG9mZnNldCwgIzcpOworfQoreworCWlmKGlmd29yZCkgbWVtdyhwdHJfb3V0KysjNCkgPSBkYXRhMDsKKwlpZihwMikgZGF0YTcwID0gZGF0YUY4OworCWlmKHAyKSBkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOwkvKiAgYW5vdGhlciA4IGJ5dGVzICAqLworCWFsaWduID0gb2Zmc2V0OworfQorLkxub3Byb2xvZzMyOgoreworCXAzID0gc3AxbG9vcDAoLkxkd29yZF9sb29wX3Byb2xvZywgcHJvbG9nKQorCXJlc3QgPSBzdWIobGVuLCBzdGFyMyk7CS8qICB3aGF0cyBsZWZ0IGFmdGVyIHRoZSBsb29wICAqLworCXAwID0gY21wLmd0KG92ZXIsICMwKTsKK30KKwlpZihwMCkgcmVzdCA9IGFkZChyZXN0LCAjMTYpOworLkxkd29yZF9sb29wX3Byb2xvZzoKK3sKKwlpZihwMykgbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCXAwID0gY21wLmd0KHJlc3QsICMxNik7Cit9Cit7CisJZGF0YTcwID0gZGF0YUY4OworCWlmKHAwKSBkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOworCXJlc3QgPSBhZGQocmVzdCwgIy04KTsKK306ZW5kbG9vcDAKKy5Ma2VybmVsOgoreworCS8qICBrZXJuZWwgaXMgYXQgbGVhc3QgMzJieXRlcyAgKi8KKwlwMyA9IGNtcC5ndHUoa2VybmVsLCAjMCk7CisJLyogIGxhc3QgaXRuLiByZW1vdmUgZWRnZSBlZmZlY3RzICAqLworCWlmKHAzLm5ldykga2VybmVsID0gYWRkKGtlcm5lbCwgIy0xKTsKKwkvKiAgZGVhbHQgd2l0aCBpbiBsYXN0IGR3b3JkIGxvb3AgICovCisJaWYocDMubmV3KSBlcGlsb2cgPSBhZGQoZXBpbG9nLCAjMzIpOworfQoreworCW5va2VybmVsID0gY21wLmVxKGtlcm5lbCwgIzApOwkJLyogIGFmdGVyIGFkanVzdG1lbnQsIHJlY2hlY2sgKi8KKwlpZihub2tlcm5lbC5uZXcpIGp1bXA6TlQgLkxlcGlsb2c7CS8qICBsaWtlbHkgbm90IHRha2VuICAqLworCWluYyA9IGNvbWJpbmUoIzMyLCAjLTEpOworCXAzID0gY21wLmd0dShkYWxpZ24sICMyNCk7Cit9Cit7CisJaWYocDMpIGp1bXAgLkxvZGRfYWxpZ25tZW50OworfQoreworCWxvb3AwKC5Mb3dvcmRfbG9vcF8yNXRvMzEsIGtlcm5lbCk7CisJa2VybmVsMSA9IGNtcC5ndHUoa2VybmVsLCAjMSk7CisJcmVzdCA9IGtlcm5lbDsKK30KKwkuZmFsaWduCisuTG93b3JkX2xvb3BfMjV0bzMxOgoreworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsJLyogIHByZWZldGNoIDQgbGluZXMgYWhlYWQgICovCisJaWYoa2VybmVsMSkgcHRyX291dF9wXzMyID0gYWRkKHB0cl9vdXRfcF8zMiwgIzMyKTsKK30KK3sKKwlkY3plcm9hKHB0cl9vdXRfcF8zMik7CS8qICByZXNlcnZlIHRoZSBuZXh0IDMyYnl0ZXMgaW4gY2FjaGUgICovCisJcDMgPSBjbXAuZXEoa2VybmVsLCByZXN0KTsKK30KK3sKKwkvKiAga2VybmVsIC09IDEgICovCisJcHRyX2luX3BfMTI4a2VybmVsID0gdmFkZHcocHRyX2luX3BfMTI4a2VybmVsLCBpbmMpOworCS8qICBraWxsIHdyaXRlIG9uIGZpcnN0IGl0ZXJhdGlvbiAgKi8KKwlpZighcDMpIG1lbWQocHRyX291dCsrIzgpID0gbGRhdGExOworCWxkYXRhMSA9IHZhbGlnbmIoZGF0YUY4LCBkYXRhNzAsIGFsaWduKTsKKwlkYXRhNzAgPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YTcwLCBkYXRhRjgsIGFsaWduKTsKKwlkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGExOworCWxkYXRhMSA9IHZhbGlnbmIoZGF0YUY4LCBkYXRhNzAsIGFsaWduKTsKKwlkYXRhNzAgPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YTcwLCBkYXRhRjgsIGFsaWduKTsKKwlkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOworCWtlcm5lbDEgPSBjbXAuZ3R1KGtlcm5lbCwgIzEpOworfTplbmRsb29wMAoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGExOworCWp1bXAgLkxlcGlsb2c7Cit9CisuTG9kZF9hbGlnbm1lbnQ6Cit7CisJbG9vcDAoLkxvd29yZF9sb29wXzAwdG8yNCwga2VybmVsKTsKKwlrZXJuZWwxID0gY21wLmd0dShrZXJuZWwsICMxKTsKKwlyZXN0ID0gYWRkKGtlcm5lbCwgIy0xKTsKK30KKwkuZmFsaWduCisuTG93b3JkX2xvb3BfMDB0bzI0OgoreworCWRjZmV0Y2gocHRyX2luX3BfMTI4KTsJLyogIHByZWZldGNoIDQgbGluZXMgYWhlYWQgICovCisJcHRyX2luX3BfMTI4a2VybmVsID0gdmFkZHcocHRyX2luX3BfMTI4a2VybmVsLCBpbmMpOworCWlmKGtlcm5lbDEpIHB0cl9vdXRfcF8zMiA9IGFkZChwdHJfb3V0X3BfMzIsICMzMik7Cit9Cit7CisJZGN6ZXJvYShwdHJfb3V0X3BfMzIpOwkvKiAgcmVzZXJ2ZSB0aGUgbmV4dCAzMmJ5dGVzIGluIGNhY2hlICAqLworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YUY4LCBkYXRhNzAsIGFsaWduKTsKKwlkYXRhNzAgPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YTcwLCBkYXRhRjgsIGFsaWduKTsKKwlkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YUY4LCBkYXRhNzAsIGFsaWduKTsKKwlkYXRhNzAgPSBtZW1kKHB0cl9pbisrIzgpOworfQoreworCW1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IHZhbGlnbmIoZGF0YTcwLCBkYXRhRjgsIGFsaWduKTsKKwlkYXRhRjggPSBtZW1kKHB0cl9pbisrIzgpOworCWtlcm5lbDEgPSBjbXAuZ3R1KGtlcm5lbCwgIzEpOworfTplbmRsb29wMAorLkxlcGlsb2c6Cit7CisJbm9lcGlsb2cgPSBjbXAuZXEoZXBpbG9nLCMwKTsKKwllcGlsb2dkd3MgPSBsc3IoZXBpbG9nLCAjMyk7CisJa2VybmVsID0gYW5kKGVwaWxvZywgIzcpOworfQoreworCWlmKG5vZXBpbG9nKSBqdW1wciByMzE7CisJaWYobm9lcGlsb2cpIHB0cl9vdXQgPSBzdWIocHRyX291dCwgbGVuKTsKKwlwMyA9IGNtcC5lcShlcGlsb2dkd3MsICMwKTsKKwlzaGlmdDIgPSBhc2woZXBpbG9nLCAjMyk7Cit9Cit7CisJc2hpZnRiID0gYW5kKHNoaWZ0MiwgIzMyKTsKKwlpZndvcmQgPSB0c3RiaXQoZXBpbG9nLCMyKTsKKwlpZihwMykganVtcCAuTGVwaWxvZzYwOworCWlmKCFwMykgZXBpbG9nID0gYWRkKGVwaWxvZywgIy0xNik7Cit9Cit7CisJbG9vcDAoLkxkd29yZF9sb29wX2VwaWxvZywgZXBpbG9nZHdzKTsKKwkvKiAgc3RvcCBjcml0ZXJpYSBpcyBsc2JzIHVubGVzcyA9IDAgdGhlbiBpdHMgOCAgKi8KKwlwMyA9IGNtcC5lcShrZXJuZWwsICMwKTsKKwlpZihwMy5uZXcpIGtlcm5lbD0gIzg7CisJcDEgPSBjbXAuZ3Qob3ZlciwgIzApOworfQorCS8qICBpZiBub3QgYWxpZ25lZCB0byBlbmQgb2YgYnVmZmVyIGV4ZWN1dGUgMSBtb3JlIGl0ZXJhdGlvbiAgKi8KKwlpZihwMSkga2VybmVsPSAjMDsKKy5MZHdvcmRfbG9vcF9lcGlsb2c6Cit7CisJbWVtZChwdHJfb3V0KysjOCkgPSBsZGF0YTA7CisJbGRhdGEwID0gdmFsaWduYihkYXRhRjgsIGRhdGE3MCwgYWxpZ24pOworCXAzID0gY21wLmd0KGVwaWxvZywga2VybmVsKTsKK30KK3sKKwlkYXRhNzAgPSBkYXRhRjg7CisJaWYocDMpIGRhdGFGOCA9IG1lbWQocHRyX2luKysjOCk7CisJZXBpbG9nID0gYWRkKGVwaWxvZywgIy04KTsKK306ZW5kbG9vcDAKKy8qIGNvcHkgbGFzdCA3IGJ5dGVzICovCisuTGVwaWxvZzYwOgoreworCWlmKGlmd29yZCkgbWVtdyhwdHJfb3V0KysjNCkgPSBkYXRhMDsKKwlsZGF0YTAgPSBsc3IobGRhdGEwLCBzaGlmdGIpOworCWlmaHdvcmQgPSB0c3RiaXQoZXBpbG9nLCMxKTsKKwlzaGlmdGIgPSBhbmQoc2hpZnQyLCAjMTYpOworfQoreworCWlmKGlmaHdvcmQpIG1lbWgocHRyX291dCsrIzIpID0gZGF0YTA7CisJbGRhdGEwID0gbHNyKGxkYXRhMCwgc2hpZnRiKTsKKwlpZmJ5dGUgPSB0c3RiaXQoZXBpbG9nLCMwKTsKKwlpZihpZmJ5dGUubmV3KSBsZW4gPSBhZGQobGVuLCAjLTEpOworfQoreworCWlmKGlmYnl0ZSkgbWVtYihwdHJfb3V0KSA9IGRhdGEwOworCXB0cl9vdXQgPSBzdWIocHRyX291dCwgbGVuKTsJLyogIHJldHVybiBkZXN0IHBvaW50ZXIgICovCisgICAgICAgIGp1bXByIHIzMTsKK30KKy8qICBkbyBieXRlIGNvcHkgZm9yIHNtYWxsIG4gICovCisuTGJ5dGVzMjNvcmxlc3M6Cit7CisJcDMgPSBzcDFsb29wMCguTGJ5dGVfY29weSwgbGVuKTsKKwlsZW4gPSBhZGQobGVuLCAjLTEpOworfQorLkxieXRlX2NvcHk6Cit7CisJZGF0YTAgPSBtZW1iKHB0cl9pbisrIzEpOworCWlmKHAzKSBtZW1iKHB0cl9vdXQrKyMxKSA9IGRhdGEwOworfTplbmRsb29wMAoreworCW1lbWIocHRyX291dCkgPSBkYXRhMDsKKwlwdHJfb3V0ID0gc3ViKHB0cl9vdXQsIGxlbik7CisJanVtcHIgcjMxOworfQorLyogIGRvIGR3b3JkIGNvcGllcyBmb3IgYWxpZ25lZCBpbiwgb3V0IGFuZCBsZW5ndGggICovCisuTGR3b3JkYWxpZ25lZDoKK3sKKwlwMyA9IHNwMWxvb3AwKC5MZHdvcmRfY29weSwgbGVuOCk7Cit9CisuTGR3b3JkX2NvcHk6Cit7CisJaWYocDMpIG1lbWQocHRyX291dCsrIzgpID0gbGRhdGEwOworCWxkYXRhMCA9IG1lbWQocHRyX2luKysjOCk7Cit9OmVuZGxvb3AwCit7CisJbWVtZChwdHJfb3V0KSA9IGxkYXRhMDsKKwlwdHJfb3V0ID0gc3ViKHB0cl9vdXQsIGxlbik7CisJanVtcHIgcjMxOwkvKiAgcmV0dXJuIHRvIGZ1bmN0aW9uIGNhbGxlciAgKi8KK30KKy5MbWVtY3B5X3JldHVybjoKKwlyMjE6MjAgPSBtZW1kKHNwKyMxNik7CS8qICByZXN0b3JlIHIyMCtyMjEgICovCit7CisJcjI1OjI0ID0gbWVtZChzcCsjOCk7CS8qICByZXN0b3JlIHIyNCtyMjUgICovCisJcjE3OjE2ID0gbWVtZChzcCsjMCk7CS8qICByZXN0b3JlIHIxNityMTcgICovCit9CisJZGVhbGxvY2ZyYW1lOwkvKiAgcmVzdG9yZSByMzEgYW5kIGluY3JtZW50IHN0YWNrIGJ5IDE2ICAqLworCWp1bXByIHIzMQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL2xpYi9tZW1zZXQuUyBiL2FyY2gvaGV4YWdvbi9saWIvbWVtc2V0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkOTYxNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9saWIvbWVtc2V0LlMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisKKy8qIEhFWEFHT04gYXNzZW1ibHkgb3B0aW1pemVkIG1lbXNldCAqLworLyogUmVwbGFjZXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb24gbWVtc2V0ICovCisKKworICAgICAgICAubWFjcm8gSEVYQUdPTl9PUFRfRlVOQ19CRUdJTiBuYW1lCisJLnRleHQKKwkucDJhbGlnbiA0CisJLmdsb2JsIFxuYW1lCisJLnR5cGUgIFxuYW1lLCBAZnVuY3Rpb24KK1xuYW1lOgorCS5lbmRtCisKKwkubWFjcm8gSEVYQUdPTl9PUFRfRlVOQ19GSU5JU0ggbmFtZQorCS5zaXplICBcbmFtZSwgLiAtIFxuYW1lCisJLmVuZG0KKworLyogRlVOQ1RJT046IG1lbXNldCAodjIgdmVyc2lvbikgKi8KKyNpZiBfX0hFWEFHT05fQVJDSF9fIDwgMworSEVYQUdPTl9PUFRfRlVOQ19CRUdJTiBtZW1zZXQKKwl7CisJCXI2ID0gIzgKKwkJcjcgPSBleHRyYWN0dShyMCwgIzMgLCAjMCkKKwkJcDAgPSBjbXAuZXEocjIsICMwKQorCQlwMSA9IGNtcC5ndHUocjIsICM3KQorCX0KKwl7CisJCXI0ID0gdnNwbGF0YihyMSkKKwkJcjggPSByMCAgICAgICAgICAgLyogbGVhdmUgcjAgaW50YWN0IGZvciByZXR1cm4gdmFsICAqLworCQlyOSA9IHN1YihyNiwgcjcpICAvKiBieXRlcyB1bnRpbCBkb3VibGUgYWxpZ25tZW50ICAqLworCQlpZiBwMCBqdW1wciByMzEgICAvKiBjb3VudCA9PSAwLCBzbyByZXR1cm4gICovCisJfQorCXsKKwkJcjMgPSAjMAorCQlyNyA9ICMwCisJCXAwID0gdHN0Yml0KHI5LCAjMCkKKwkJaWYgcDEganVtcCAyZiAvKiBza2lwIGJ5dGUgbG9vcCAqLworCX0KKworLyogbGVzcyB0aGFuIDggYnl0ZXMgdG8gc2V0LCBzbyBqdXN0IHNldCBhIGJ5dGUgYXQgYSB0aW1lIGFuZCByZXR1cm4gICovCisKKwkJbG9vcDAoMWYsIHIyKSAvKiBieXRlIGxvb3AgKi8KKwkuZmFsaWduCisxOiAvKiBieXRlIGxvb3AgKi8KKwl7CisJCW1lbWIocjgrKyMxKSA9IHI0CisJfTplbmRsb29wMAorCQlqdW1wciByMzEKKwkuZmFsaWduCisyOiAvKiBza2lwIGJ5dGUgbG9vcCAqLworCXsKKwkJcjYgPSAjMQorCQlwMCA9IHRzdGJpdChyOSwgIzEpCisJCXAxID0gY21wLmVxKHIyLCAjMSkKKwkJaWYgIXAwIGp1bXAgM2YgLyogc2tpcCBpbml0aWFsIGJ5dGUgc3RvcmUgKi8KKwl9CisJeworCQltZW1iKHI4KysjMSkgPSByNAorCQlyMzoyID0gc3ViKHIzOjIsIHI3OjYpCisJCWlmIHAxIGp1bXByIHIzMQorCX0KKwkuZmFsaWduCiszOiAvKiBza2lwIGluaXRpYWwgYnl0ZSBzdG9yZSAqLworCXsKKwkJcjYgPSAjMgorCQlwMCA9IHRzdGJpdChyOSwgIzIpCisJCXAxID0gY21wLmVxKHIyLCAjMikKKwkJaWYgIXAwIGp1bXAgNGYgLyogc2tpcCBpbml0aWFsIGhhbGYgc3RvcmUgKi8KKwl9CisJeworCQltZW1oKHI4KysjMikgPSByNAorCQlyMzoyID0gc3ViKHIzOjIsIHI3OjYpCisJCWlmIHAxIGp1bXByIHIzMQorCX0KKwkuZmFsaWduCis0OiAvKiBza2lwIGluaXRpYWwgaGFsZiBzdG9yZSAqLworCXsKKwkJcjYgPSAjNAorCQlwMCA9IGNtcC5ndHUocjIsICM3KQorCQlwMSA9IGNtcC5lcShyMiwgIzQpCisJCWlmICFwMCBqdW1wIDVmIC8qIHNraXAgaW5pdGlhbCB3b3JkIHN0b3JlICovCisJfQorCXsKKwkJbWVtdyhyOCsrIzQpID0gcjQKKwkJcjM6MiA9IHN1YihyMzoyLCByNzo2KQorCQlwMCA9IGNtcC5ndHUocjIsICMxMSkKKwkJaWYgcDEganVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzU6IC8qIHNraXAgaW5pdGlhbCB3b3JkIHN0b3JlICovCisJeworCQlyMTAgPSBsc3IocjIsICMzKQorCQlwMSA9IGNtcC5lcShyMywgIzEpCisJCWlmICFwMCBqdW1wIDdmIC8qIHNraXAgZG91YmxlIGxvb3AgKi8KKwl9CisJeworCQlyNSA9IHI0CisJCXI2ID0gIzgKKwkJbG9vcDAoNmYsIHIxMCkgLyogZG91YmxlIGxvb3AgKi8KKwl9CisKKy8qIHNldCBieXRlcyBhIGRvdWJsZSB3b3JkIGF0IGEgdGltZSAgKi8KKworCS5mYWxpZ24KKzY6IC8qIGRvdWJsZSBsb29wICovCisJeworCQltZW1kKHI4KysjOCkgPSByNTo0CisJCXIzOjIgPSBzdWIocjM6Miwgcjc6NikKKwkJcDEgPSBjbXAuZXEocjIsICM4KQorCX06ZW5kbG9vcDAKKwkuZmFsaWduCis3OiAvKiBza2lwIGRvdWJsZSBsb29wICovCisJeworCQlwMCA9IHRzdGJpdChyMiwgIzIpCisJCWlmIHAxIGp1bXByIHIzMQorCX0KKwl7CisJCXI2ID0gIzQKKwkJcDAgPSB0c3RiaXQocjIsICMxKQorCQlwMSA9IGNtcC5lcShyMiwgIzQpCisJCWlmICFwMCBqdW1wIDhmIC8qIHNraXAgZmluYWwgd29yZCBzdG9yZSAqLworCX0KKwl7CisJCW1lbXcocjgrKyM0KSA9IHI0CisJCXIzOjIgPSBzdWIocjM6Miwgcjc6NikKKwkJaWYgcDEganVtcHIgcjMxCisJfQorCS5mYWxpZ24KKzg6IC8qIHNraXAgZmluYWwgd29yZCBzdG9yZSAqLworCXsKKwkJcDEgPSBjbXAuZXEocjIsICMyKQorCQlpZiAhcDAganVtcCA5ZiAvKiBza2lwIGZpbmFsIGhhbGYgc3RvcmUgKi8KKwl9CisJeworCQltZW1oKHI4KysjMikgPSByNAorCQlpZiBwMSBqdW1wciByMzEKKwl9CisJLmZhbGlnbgorOTogLyogc2tpcCBmaW5hbCBoYWxmIHN0b3JlICovCisJeworCQltZW1iKHI4KysjMSkgPSByNAorCQlqdW1wciByMzEKKwl9CitIRVhBR09OX09QVF9GVU5DX0ZJTklTSCBtZW1zZXQKKyNlbmRpZgorCisKKy8qICBGVU5DVElPTjogbWVtc2V0ICh2MyBhbmQgaGlnaGVyIHZlcnNpb24pICAqLworI2lmIF9fSEVYQUdPTl9BUkNIX18gPj0gMworSEVYQUdPTl9PUFRfRlVOQ19CRUdJTiBtZW1zZXQKKwl7CisJCXI3PXZzcGxhdGIocjEpCisJCXI2ID0gcjAKKwkJaWYgKHIyPT0jMCkganVtcDpudCAuTDEKKwl9CisJeworCQlyNTo0PWNvbWJpbmUocjcscjcpCisJCXAwID0gY21wLmd0dShyMiwjOCkKKwkJaWYgKHAwLm5ldykganVtcDpudCAuTDMKKwl9CisJeworCQlyMyA9IHIwCisJCWxvb3AwKC5MNDcscjIpCisJfQorCS5mYWxpZ24KKy5MNDc6CisJeworCQltZW1iKHIzKysjMSkgPSByMQorCX06ZW5kbG9vcDAgLyogc3RhcnQ9Lkw0NyAqLworCQlqdW1wciByMzEKKy5MMzoKKwl7CisJCXAwID0gdHN0Yml0KHIwLCMwKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDgKKwkJcDEgPSBjbXAuZXEocjIsICMxKQorCX0KKwl7CisJCXI2ID0gYWRkKHIwLCAjMSkKKwkJcjIgPSBhZGQocjIsIy0xKQorCQltZW1iKHIwKSA9IHIxCisJCWlmIChwMSkganVtcCAuTDEKKwl9CisuTDg6CisJeworCQlwMCA9IHRzdGJpdChyNiwjMSkKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkwxMAorCX0KKwl7CisJCXIyID0gYWRkKHIyLCMtMikKKwkJbWVtaChyNisrIzIpID0gcjcKKwkJcDAgPSBjbXAuZXEocjIsICMyKQorCQlpZiAocDAubmV3KSBqdW1wOm50IC5MMQorCX0KKy5MMTA6CisJeworCQlwMCA9IHRzdGJpdChyNiwjMikKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkwxMgorCX0KKwl7CisJCXIyID0gYWRkKHIyLCMtNCkKKwkJbWVtdyhyNisrIzQpID0gcjcKKwkJcDAgPSBjbXAuZXEocjIsICM0KQorCQlpZiAocDAubmV3KSBqdW1wOm50IC5MMQorCX0KKy5MMTI6CisJeworCQlwMCA9IGNtcC5ndHUocjIsIzEyNykKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkwxNAorCX0KKwkJcjMgPSBhbmQocjYsIzMxKQorCQlpZiAocjM9PSMwKSBqdW1wOm50IC5MMTcKKwl7CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwkJcjIgPSBhZGQocjIsIy04KQorCX0KKwkJcjMgPSBhbmQocjYsIzMxKQorCQlpZiAocjM9PSMwKSBqdW1wOm50IC5MMTcKKwl7CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwkJcjIgPSBhZGQocjIsIy04KQorCX0KKwkJcjMgPSBhbmQocjYsIzMxKQorCQlpZiAocjM9PSMwKSBqdW1wOm50IC5MMTcKKwl7CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwkJcjIgPSBhZGQocjIsIy04KQorCX0KKy5MMTc6CisJeworCQlyMyA9IGxzcihyMiwjNSkKKwkJaWYgKHIxIT0jMCkganVtcDpudCAuTDE4CisJfQorCXsKKwkJcjggPSByMworCQlyMyA9IHI2CisJCWxvb3AwKC5MNDYscjMpCisJfQorCS5mYWxpZ24KKy5MNDY6CisJeworCQlkY3plcm9hKHI2KQorCQlyNiA9IGFkZChyNiwjMzIpCisJCXIyID0gYWRkKHIyLCMtMzIpCisJfTplbmRsb29wMCAvKiBzdGFydD0uTDQ2ICovCisuTDE0OgorCXsKKwkJcDAgPSBjbXAuZ3R1KHIyLCM3KQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDI4CisJCXI4ID0gbHNyKHIyLCMzKQorCX0KKwkJbG9vcDAoLkw0NCxyOCkKKwkuZmFsaWduCisuTDQ0OgorCXsKKwkJbWVtZChyNisrIzgpID0gcjU6NAorCQlyMiA9IGFkZChyMiwjLTgpCisJfTplbmRsb29wMCAvKiBzdGFydD0uTDQ0ICovCisuTDI4OgorCXsKKwkJcDAgPSB0c3RiaXQocjIsIzIpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5MMzMKKwl9CisJeworCQlyMiA9IGFkZChyMiwjLTQpCisJCW1lbXcocjYrKyM0KSA9IHI3CisJfQorLkwzMzoKKwl7CisJCXAwID0gdHN0Yml0KHIyLCMxKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTDM1CisJfQorCXsKKwkJcjIgPSBhZGQocjIsIy0yKQorCQltZW1oKHI2KysjMikgPSByNworCX0KKy5MMzU6CisJCXAwID0gY21wLmVxKHIyLCMxKQorCQlpZiAocDApIG1lbWIocjYpID0gcjEKKy5MMToKKwkJanVtcHIgcjMxCisuTDE4OgorCQlsb29wMCguTDQ1LHIzKQorCS5mYWxpZ24KKy5MNDU6CisJCWRjemVyb2EocjYpCisJeworCQltZW1kKHI2KysjOCkgPSByNTo0CisJCXIyID0gYWRkKHIyLCMtMzIpCisJfQorCQltZW1kKHI2KysjOCkgPSByNTo0CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwl7CisJCW1lbWQocjYrKyM4KSA9IHI1OjQKKwl9OmVuZGxvb3AwIC8qIHN0YXJ0PS5MNDUgICovCisJCWp1bXAgLkwxNAorSEVYQUdPTl9PUFRfRlVOQ19GSU5JU0ggbWVtc2V0CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9tbS9NYWtlZmlsZSBiL2FyY2gvaGV4YWdvbi9tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBiZTRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgSGV4YWdvbiBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0KKyMKKworb2JqLXkgOj0gaW5pdC5vIHBnYWxsb2MubyBpb3JlbWFwLm8gdWFjY2Vzcy5vIHZtX2ZhdWx0Lm8gY2FjaGUubworb2JqLXkgKz0gY29weV90b191c2VyLm8gY29weV9mcm9tX3VzZXIubyBzdHJubGVuX3VzZXIubyB2bV90bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL2NhY2hlLmMgYi9hcmNoL2hleGFnb24vbW0vY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNmNmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL2NhY2hlLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDYWNoZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3IgSGV4YWdvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2hleGFnb25fdm0uaD4KKworI2RlZmluZSBzcGFubGluZXMoc3RhcnQsIGVuZCkgXAorCSgoKGVuZCAtIChzdGFydCAmIH4oTElORVNJWkUgLSAxKSkpID4+IExJTkVCSVRTKSArIDEpCisKK3ZvaWQgZmx1c2hfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgbGluZXMgPSBzcGFubGluZXMoc3RhcnQsIGVuZC0xKTsKKwl1bnNpZ25lZCBsb25nIGksIGZsYWdzOworCisJc3RhcnQgJj0gfihMSU5FU0laRSAtIDEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGxpbmVzOyBpKyspIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCWRjY2xlYW5pbnZhKCUwKTsJIgorCQk6CisJCTogInIiIChzdGFydCkKKwkJKTsKKwkJc3RhcnQgKz0gTElORVNJWkU7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBsaW5lcyA9IHNwYW5saW5lcyhzdGFydCwgZW5kLTEpOworCXVuc2lnbmVkIGxvbmcgaSwgZmxhZ3M7CisKKwlzdGFydCAmPSB+KExJTkVTSVpFIC0gMSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGluZXM7IGkrKykgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkiCWRjY2xlYW5hKCUwKTsgIgorCQkJIglpY2ludmEoJTApOwkiCisJCQk6CisJCQk6ICJyIiAoc3RhcnQpCisJCSk7CisJCXN0YXJ0ICs9IExJTkVTSVpFOworCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJpc3luYyIKKwkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBoZXhhZ29uX2NsZWFuX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxpbmVzID0gc3BhbmxpbmVzKHN0YXJ0LCBlbmQtMSk7CisJdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKKworCXN0YXJ0ICY9IH4oTElORVNJWkUgLSAxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIglkY2NsZWFuYSglMCk7CSIKKwkJOgorCQk6ICJyIiAoc3RhcnQpCisJCSk7CisJCXN0YXJ0ICs9IExJTkVTSVpFOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgaGV4YWdvbl9pbnZfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgbGluZXMgPSBzcGFubGluZXMoc3RhcnQsIGVuZC0xKTsKKwl1bnNpZ25lZCBsb25nIGksIGZsYWdzOworCisJc3RhcnQgJj0gfihMSU5FU0laRSAtIDEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGxpbmVzOyBpKyspIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiCWRjaW52YSglMCk7CSIKKwkJOgorCQk6ICJyIiAoc3RhcnQpCisJCSk7CisJCXN0YXJ0ICs9IExJTkVTSVpFOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworCisKKy8qCisgKiBUaGlzIGlzIGp1c3QgcmVhbGx5IGJydXRhbCBhbmQgc2hvdWxkbid0IGJlIHVzZWQgYW55d2F5cywKKyAqIGVzcGVjaWFsbHkgb24gVjIuICBMZWZ0IGhlcmUganVzdCBpbiBjYXNlLgorICovCit2b2lkIGZsdXNoX2NhY2hlX2FsbF9oZXhhZ29uKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX192bWNhY2hlX2lja2lsbCgpOworCV9fdm1jYWNoZV9kY2tpbGwoKTsKKwlfX3ZtY2FjaGVfbDJraWxsKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCW1iKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vY29weV9mcm9tX3VzZXIuUyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X2Zyb21fdXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjFkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vY29weV9mcm9tX3VzZXIuUwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIFVzZXIgbWVtb3J5IGNvcHkgZnVuY3Rpb25zIGZvciBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGludm9sdmVzIHZhbGlnbmIKKyAqIFRoZSBlYXN5IHdheSB0byBkbyB0aGlzIGlzIG9ubHkgc3BlZWQgdXAgc3JjL2Rlc3Qgc2ltaWxhciBhbGlnbm1lbnQuCisgKi8KKworLyoKKyAqIENvcHkgdG8vZnJvbSB1c2VyIGFyZSB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgZm9yIHBhY2tldHMgd2l0aCBhIGxvYWQgYW5kCisgKiBhIHN0b3JlLCBJIGRvbid0IGtub3cgaG93IHRvIHRlbGwgd2hpY2gga2luZCBvZiBleGNlcHRpb24gd2UgZ290LgorICogVGhlcmVmb3JlLCB3ZSBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uLCBhbmQgaGFuZGxlIGZhdWx0aW5nIGFkZHJlc3NlcworICogZGlmZmVyZW50bHkgZm9yIGVhY2ggZnVuY3Rpb24KKyAqLworCisvKgorICogY29weSBmcm9tIHVzZXI6IGxvYWRzIGNhbiBmYXVsdAorICovCisjZGVmaW5lIHNyY19zYXYgcjEzCisjZGVmaW5lIGRzdF9zYXYgcjEyCisjZGVmaW5lIHNyY19kc3Rfc2F2IHIxMzoxMgorI2RlZmluZSBkX2RidWYgcjE1OjE0CisjZGVmaW5lIHdfZGJ1ZiByMTUKKworI2RlZmluZSBkc3QgcjAKKyNkZWZpbmUgc3JjIHIxCisjZGVmaW5lIGJ5dGVzIHIyCisjZGVmaW5lIGxvb3Bjb3VudCByNQorCisjZGVmaW5lIEZVTkNOQU1FIF9fY29weV9mcm9tX3VzZXJfaGV4YWdvbgorI2luY2x1ZGUgImNvcHlfdXNlcl90ZW1wbGF0ZS5TIgorCisJLyogTE9BRCBGQVVMVFMgZnJvbSBDT1BZX0ZST01fVVNFUiAqLworCisJLyogQWxpZ25tZW50IGxvb3AuICByMiBoYXMgYmVlbiB1cGRhdGVkLiBSZXR1cm4gaXQuICovCisJLmZhbGlnbgorMTAwOToKKzIwMDk6Cis0MDA5OgorCXsKKwkJcjAgPSByMgorCQlqdW1wciByMzEKKwl9CisJLyogTm9ybWFsIGNvcHkgbG9vcHMuIERvIGVwaWxvZy4gVXNlIHNyYy1zcmNfc2F2IHRvIGNvbXB1dGUgZGlzdGFuY2UgKi8KKwkvKiBYIC0gKEEgLSBCKSA9PSBYICsgQiAtIEEgKi8KKwkuZmFsaWduCis4MDg5OgorCXsKKwkJbWVtZChkc3QpID0gZF9kYnVmCisJCXIyICs9IHN1YihzcmNfc2F2LHNyYykKKwl9CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKwkuZmFsaWduCis0MDg5OgorCXsKKwkJbWVtdyhkc3QpID0gd19kYnVmCisJCXIyICs9IHN1YihzcmNfc2F2LHNyYykKKwl9CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKwkuZmFsaWduCisyMDg5OgorCXsKKwkJbWVtaChkc3QpID0gd19kYnVmCisJCXIyICs9IHN1YihzcmNfc2F2LHNyYykKKwl9CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKwkuZmFsaWduCisxMDg5OgorCXsKKwkJbWVtYihkc3QpID0gd19kYnVmCisJCXIyICs9IHN1YihzcmNfc2F2LHNyYykKKwl9CisJeworCQlyMCA9IHIyCisJCWp1bXByIHIzMQorCX0KKworCS8qIENPUFkgRlJPTSBVU0VSOiBvbmx5IGxvYWRzIGNhbiBmYWlsICovCisKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5sb25nIDEwMDBiLDEwMDliCisJLmxvbmcgMjAwMGIsMjAwOWIKKwkubG9uZyA0MDAwYiw0MDA5YgorCS5sb25nIDgwODBiLDgwODliCisJLmxvbmcgNDA4MGIsNDA4OWIKKwkubG9uZyAyMDgwYiwyMDg5YgorCS5sb25nIDEwODBiLDEwODliCisJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vY29weV90b191c2VyLlMgYi9hcmNoL2hleGFnb24vbW0vY29weV90b191c2VyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NzQwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3RvX3VzZXIuUwpAQCAtMCwwICsxLDkyIEBACisvKgorICogVXNlciBtZW1vcnkgY29weWluZyByb3V0aW5lcyBmb3IgdGhlIEhleGFnb24gS2VybmVsCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyogVGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGludm9sdmVzIHZhbGlnbmIKKyAqIFRoZSBlYXN5IHdheSB0byBkbyB0aGlzIGlzIG9ubHkgc3BlZWQgdXAgc3JjL2Rlc3Qgc2ltaWxhciBhbGlnbm1lbnQuCisgKi8KKworLyoKKyAqIENvcHkgdG8vZnJvbSB1c2VyIGFyZSB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgZm9yIHBhY2tldHMgd2l0aCBhIGxvYWQgYW5kCisgKiBhIHN0b3JlLCBJIGRvbid0IGtub3cgaG93IHRvIHRlbGwgd2hpY2gga2luZCBvZiBleGNlcHRpb24gd2UgZ290LgorICogVGhlcmVmb3JlLCB3ZSBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uLCBhbmQgaGFuZGxlIGZhdWx0aW5nIGFkZHJlc3NlcworICogZGlmZmVyZW50bHkgZm9yIGVhY2ggZnVuY3Rpb24KKyAqLworCisvKgorICogY29weSB0byB1c2VyOiBzdG9yZXMgY2FuIGZhdWx0CisgKi8KKyNkZWZpbmUgc3JjX3NhdiByMTMKKyNkZWZpbmUgZHN0X3NhdiByMTIKKyNkZWZpbmUgc3JjX2RzdF9zYXYgcjEzOjEyCisjZGVmaW5lIGRfZGJ1ZiByMTU6MTQKKyNkZWZpbmUgd19kYnVmIHIxNQorCisjZGVmaW5lIGRzdCByMAorI2RlZmluZSBzcmMgcjEKKyNkZWZpbmUgYnl0ZXMgcjIKKyNkZWZpbmUgbG9vcGNvdW50IHI1CisKKyNkZWZpbmUgRlVOQ05BTUUgX19jb3B5X3RvX3VzZXJfaGV4YWdvbgorI2luY2x1ZGUgImNvcHlfdXNlcl90ZW1wbGF0ZS5TIgorCisJLyogU1RPUkUgRkFVTFRTIGZyb20gQ09QWV9UT19VU0VSICovCisJLmZhbGlnbgorMTEwOToKKzIxMDk6Cis0MTA5OgorCS8qIEFsaWdubWVudCBsb29wLiAgcjIgaGFzIGJlZW4gdXBkYXRlZC4gIFJldHVybiBpdC4gKi8KKwl7CisJCXIwID0gcjIKKwkJanVtcHIgcjMxCisJfQorCS8qIE5vcm1hbCBjb3B5IGxvb3BzLiAgVXNlIGRzdC1kc3Rfc2F2IHRvIGNvbXB1dGUgZGlzdGFuY2UgKi8KKwkvKiBkc3QgaG9sZHMgYmVzdCB3cml0ZSwgbm8gbmVlZCB0byB1bndpbmQgYW55IGxvb3BzICovCisJLyogWCAtIChBIC0gQikgPT0gWCArIEIgLSBBICovCisJLmZhbGlnbgorODE4OToKKzgxOTk6Cis0MTg5OgorNDE5OToKKzIxODk6CisyMTk5OgorMTE4OToKKzExOTk6CisJeworCQlyMiArPSBzdWIoZHN0X3Nhdixkc3QpCisJfQorCXsKKwkJcjAgPSByMgorCQlqdW1wciByMzEKKwl9CisKKwkvKiBDT1BZIFRPIFVTRVI6IG9ubHkgc3RvcmVzIGNhbiBmYWlsICovCisJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkubG9uZyAxMTAwYiwxMTA5YgorCS5sb25nIDIxMDBiLDIxMDliCisJLmxvbmcgNDEwMGIsNDEwOWIKKwkubG9uZyA4MTgwYiw4MTg5YgorCS5sb25nIDgxOTBiLDgxOTliCisJLmxvbmcgNDE4MGIsNDE4OWIKKwkubG9uZyA0MTkwYiw0MTk5YgorCS5sb25nIDIxODBiLDIxODliCisJLmxvbmcgMjE5MGIsMjE5OWIKKwkubG9uZyAxMTgwYiwxMTg5YgorCS5sb25nIDExOTBiLDExOTliCisJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vY29weV91c2VyX3RlbXBsYXRlLlMgYi9hcmNoL2hleGFnb24vbW0vY29weV91c2VyX3RlbXBsYXRlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkN2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9jb3B5X3VzZXJfdGVtcGxhdGUuUwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qIE51bWVyb2xvZ3k6CisgKiBXWFlaCisgKiBXOiB3aWR0aCBpbiBieXRlcworICogWDogTG9hZD0wLCBTdG9yZT0xCisgKiBZOiBMb2NhdGlvbiAwPXByZWFtYmxlLDg9bG9vcCw5PWVwaWxvZworICogWjogTG9jYXRpb249MCxoYW5kbGVyPTkKKyAqLworCS50ZXh0CisJLmdsb2JhbCBGVU5DTkFNRQorCS50eXBlIEZVTkNOQU1FLCBAZnVuY3Rpb24KKwkucDJhbGlnbiA1CitGVU5DTkFNRToKKwl7CisJCXAwID0gY21wLmd0dShieXRlcywjMCkKKwkJaWYgKCFwMC5uZXcpIGp1bXA6bnQgLkxkb25lCisJCXIzID0gb3IoZHN0LHNyYykKKwkJcjQgPSB4b3IoZHN0LHNyYykKKwl9CisJeworCQlwMSA9IGNtcC5ndHUoYnl0ZXMsIzE1KQorCQlwMCA9IGJpdHNjbHIocjMsIzcpCisJCWlmICghcDAubmV3KSBqdW1wOm50IC5Mb29wX25vdF9hbGlnbmVkXzgKKwkJc3JjX2RzdF9zYXYgPSBjb21iaW5lKHNyYyxkc3QpCisJfQorCisJeworCQlsb29wY291bnQgPSBsc3IoYnl0ZXMsIzMpCisJCWlmICghcDEpIGp1bXAgLkxzbWFsbAorCX0KKwlwMz1zcDFsb29wMCguTG9vcDgsbG9vcGNvdW50KQorLkxvb3A4OgorODA4MDoKKzgxODA6CisJeworCQlpZiAocDMpIG1lbWQoZHN0KysjOCkgPSBkX2RidWYKKwkJZF9kYnVmID0gbWVtZChzcmMrKyM4KQorCX06ZW5kbG9vcDAKKzgxOTA6CisJeworCQltZW1kKGRzdCsrIzgpID0gZF9kYnVmCisJCWJ5dGVzIC09IGFzbChsb29wY291bnQsIzMpCisJCWp1bXAgLkxzbWFsbAorCX0KKworLkxvb3Bfbm90X2FsaWduZWRfODoKKwl7CisJCXAwID0gYml0c2NscihyNCwjNykKKwkJaWYgKHAwLm5ldykganVtcDpudCAuTGFsaWduCisJfQorCXsKKwkJcDAgPSBiaXRzY2xyKHIzLCMzKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTG9vcF9ub3RfYWxpZ25lZF80CisJCXAxID0gY21wLmd0dShieXRlcywjNykKKwl9CisKKwl7CisJCWlmICghcDEpIGp1bXAgLkxzbWFsbAorCQlsb29wY291bnQgPSBsc3IoYnl0ZXMsIzIpCisJfQorCXAzPXNwMWxvb3AwKC5Mb29wNCxsb29wY291bnQpCisuTG9vcDQ6Cis0MDgwOgorNDE4MDoKKwl7CisJCWlmIChwMykgbWVtdyhkc3QrKyM0KSA9IHdfZGJ1ZgorCQl3X2RidWYgPSBtZW13KHNyYysrIzQpCisJfTplbmRsb29wMAorNDE5MDoKKwl7CisJCW1lbXcoZHN0KysjNCkgPSB3X2RidWYKKwkJYnl0ZXMgLT0gYXNsKGxvb3Bjb3VudCwjMikKKwkJanVtcCAuTHNtYWxsCisJfQorCisuTG9vcF9ub3RfYWxpZ25lZF80OgorCXsKKwkJcDAgPSBiaXRzY2xyKHIzLCMxKQorCQlpZiAoIXAwLm5ldykganVtcDpudCAuTG9vcF9ub3RfYWxpZ25lZAorCQlwMSA9IGNtcC5ndHUoYnl0ZXMsIzMpCisJfQorCisJeworCQlpZiAoIXAxKSBqdW1wIC5Mc21hbGwKKwkJbG9vcGNvdW50ID0gbHNyKGJ5dGVzLCMxKQorCX0KKwlwMz1zcDFsb29wMCguTG9vcDIsbG9vcGNvdW50KQorLkxvb3AyOgorMjA4MDoKKzIxODA6CisJeworCQlpZiAocDMpIG1lbWgoZHN0KysjMikgPSB3X2RidWYKKwkJd19kYnVmID0gbWVtdWgoc3JjKysjMikKKwl9OmVuZGxvb3AwCisyMTkwOgorCXsKKwkJbWVtaChkc3QrKyMyKSA9IHdfZGJ1ZgorCQlieXRlcyAtPSBhc2wobG9vcGNvdW50LCMxKQorCQlqdW1wIC5Mc21hbGwKKwl9CisKKy5Mb29wX25vdF9hbGlnbmVkOiAvKiBXb3JrcyBmb3IgYXMgc21hbGwgYXMgb25lIGJ5dGUgKi8KKwlwMz1zcDFsb29wMCguTG9vcDEsYnl0ZXMpCisuTG9vcDE6CisxMDgwOgorMTE4MDoKKwl7CisJCWlmIChwMykgbWVtYihkc3QrKyMxKSA9IHdfZGJ1ZgorCQl3X2RidWYgPSBtZW11YihzcmMrKyMxKQorCX06ZW5kbG9vcDAKKwkvKiBEb25lICovCisxMTkwOgorCXsKKwkJbWVtYihkc3QpID0gd19kYnVmCisJCWp1bXByIHIzMQorCQlyMCA9ICMwCisJfQorCisuTHNtYWxsOgorCXsKKwkJcDAgPSBjbXAuZ3R1KGJ5dGVzLCMwKQorCQlpZiAocDAubmV3KSBqdW1wOm50IC5Mb29wX25vdF9hbGlnbmVkCisJfQorLkxkb25lOgorCXsKKwkJcjAgPSAjMAorCQlqdW1wciByMzEKKwl9CisJLmZhbGlnbgorLkxhbGlnbjoKKzEwMDA6CisJeworCQlpZiAocDAubmV3KSB3X2RidWYgPSBtZW11YihzcmMpCisJCXAwID0gdHN0Yml0KHNyYywjMCkKKwkJaWYgKCFwMSkganVtcCAuTHNtYWxsCisJfQorMTEwMDoKKwl7CisJCWlmIChwMCkgbWVtYihkc3QrKyMxKSA9IHdfZGJ1ZgorCQlpZiAocDApIGJ5dGVzID0gYWRkKGJ5dGVzLCMtMSkKKwkJaWYgKHAwKSBzcmMgPSBhZGQoc3JjLCMxKQorCX0KKzIwMDA6CisJeworCQlpZiAocDAubmV3KSB3X2RidWYgPSBtZW11aChzcmMpCisJCXAwID0gdHN0Yml0KHNyYywjMSkKKwkJaWYgKCFwMSkganVtcCAuTHNtYWxsCisJfQorMjEwMDoKKwl7CisJCWlmIChwMCkgbWVtaChkc3QrKyMyKSA9IHdfZGJ1ZgorCQlpZiAocDApIGJ5dGVzID0gYWRkKGJ5dGVzLCMtMikKKwkJaWYgKHAwKSBzcmMgPSBhZGQoc3JjLCMyKQorCX0KKzQwMDA6CisJeworCQlpZiAocDAubmV3KSB3X2RidWYgPSBtZW13KHNyYykKKwkJcDAgPSB0c3RiaXQoc3JjLCMyKQorCQlpZiAoIXAxKSBqdW1wIC5Mc21hbGwKKwl9Cis0MTAwOgorCXsKKwkJaWYgKHAwKSBtZW13KGRzdCsrIzQpID0gd19kYnVmCisJCWlmIChwMCkgYnl0ZXMgPSBhZGQoYnl0ZXMsIy00KQorCQlpZiAocDApIHNyYyA9IGFkZChzcmMsIzQpCisJCWp1bXAgRlVOQ05BTUUKKwl9CisJLnNpemUgRlVOQ05BTUUsLi1GVU5DTkFNRQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL2luaXQuYyBiL2FyY2gvaGV4YWdvbi9tbS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3ZDc0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9pbml0LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBNZW1vcnkgc3Vic3lzdGVtIGluaXRpYWxpemF0aW9uIGZvciBIZXhhZ29uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vdm1fbW11Lmg+CisKKy8qCisgKiBEZWZpbmUgYSBzdGFydHBnIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBrZXJuZWwgaW1hZ2UgYW5kIGEgbGFzdHBnCisgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgcmVhbCBvciBzaW11bGF0ZWQgcGxhdGZvcm0gbWVtb3J5LgorICovCisjZGVmaW5lIGJvb3RtZW1fc3RhcnRwZyAoUEZOX1VQKCgodW5zaWduZWQgbG9uZykgX2VuZCkgLSBQQUdFX09GRlNFVCkpCisKK3Vuc2lnbmVkIGxvbmcgYm9vdG1lbV9sYXN0cGc7ICAvKiAgU2hvdWxkIGJlIHNldCBieSBwbGF0Zm9ybSBjb2RlICAqLworCisvKiAgU2V0IGFzIHZhcmlhYmxlIHRvIGxpbWl0IFBNRCBjb3BpZXMgICovCitpbnQgbWF4X2tlcm5lbF9zZWcgPSAweDMwMzsKKworLyogIHRoaW5rIHRoaXMgc2hvdWxkIGJlIChwYWdlX3NpemUtMSkgdGhlIHdheSBpdCdzIHVzZWQuLi4qLwordW5zaWduZWQgbG9uZyB6ZXJvX3BhZ2VfbWFzazsKKworLyogIGluZGljYXRlIHBmbidzIG9mIGhpZ2ggbWVtb3J5ICAqLwordW5zaWduZWQgbG9uZyBoaWdoc3RhcnRfcGZuLCBoaWdoZW5kX3BmbjsKKworLyogc3RydWN0IG1tdV9nYXRoZXIgZGVmaW5lZCBpbiBhc20tZ2VuZXJpYy5oOyAgKi8KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CisKKy8qIERlZmF1bHQgY2FjaGUgYXR0cmlidXRlIGZvciBuZXdseSBjcmVhdGVkIHBhZ2UgdGFibGVzICovCit1bnNpZ25lZCBsb25nIF9kZmx0X2NhY2hlX2F0dCA9IENBQ0hFREVGOworCisvKgorICogVGhlIGN1cnJlbnQgImdlbmVyYXRpb24iIG9mIGtlcm5lbCBtYXAsIHdoaWNoIHNob3VsZCBub3Qgcm9sbAorICogb3ZlciB1bnRpbCBIZWxsIGZyZWV6ZXMgb3Zlci4gIEFjdHVhbCBib3VuZCBpbiB5ZWFycyBuZWVkcyB0byBiZQorICogY2FsY3VsYXRlZCB0byBjb25maXJtLgorICovCitERUZJTkVfU1BJTkxPQ0soa21hcF9nZW5fbG9jayk7CisKKy8qICBjaGVja3BhdGNoIHNheXMgZG9uJ3QgaW5pdCB0aGlzIHRvIDAuICAqLwordW5zaWduZWQgbG9uZyBsb25nIGttYXBfZ2VuZXJhdGlvbjsKKworLyoKKyAqIG1lbV9pbml0IC0gaW5pdGlhbGl6ZXMgbWVtb3J5CisgKgorICogRnJlZXMgdXAgYm9vdG1lbQorICogRml4ZXMgdXAgbW9yZSBzdHVmZiBmb3IgSElHSE1FTQorICogQ2FsY3VsYXRlcyBhbmQgZGlzcGxheXMgbWVtb3J5IGF2YWlsYWJsZS91c2VkCisgKi8KK3ZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCit7CisJLyogIE5vIGlkZWEgd2hlcmUgdGhpcyBpcyBhY3R1YWxseSBkZWNsYXJlZC4gIFNlZW1zIHRvIGV2YWRlIExYUi4gICovCisJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbSgpOworCW51bV9waHlzcGFnZXMgPSBib290bWVtX2xhc3RwZzsJLyogIHNlcmlvdXNseSwgd2hhdD8gICovCisKKwlwcmludGsoS0VSTl9JTkZPICJ0b3RhbHJhbV9wYWdlcyA9ICVsZFxuIiwgdG90YWxyYW1fcGFnZXMpOworCisJLyoKKwkgKiAgVG8tRG86ICBzb21lb25lIHNvbWV3aGVyZSBzaG91bGQgd2lwZSBvdXQgdGhlIGJvb3RtZW0gbWFwCisJICogIGFmdGVyIHdlJ3JlIGRvbmU/CisJICovCisKKwkvKgorCSAqIFRoaXMgY2FuIGJlIG1vdmVkIHRvIHNvbWUgbW9yZSB2aXJ0dWFsLW1lbW9yeS1zcGVjaWZpYworCSAqIGluaXRpYWxpemF0aW9uIGhvb2sgYXQgc29tZSBwb2ludC4gIFNldCB0aGUgaW5pdF9tbQorCSAqIGRlc2NyaXB0b3JzICJjb250ZXh0IiB2YWx1ZSB0byBwb2ludCB0byB0aGUgaW5pdGlhbAorCSAqIGtlcm5lbCBzZWdtZW50IHRhYmxlJ3MgcGh5c2ljYWwgYWRkcmVzcy4KKwkgKi8KKwlpbml0X21tLmNvbnRleHQucHRiYXNlID0gX19wYShpbml0X21tLnBnZCk7Cit9CisKKy8qCisgKiBmcmVlX2luaXRtZW0gLSBmcmVlcyBtZW1vcnkgdXNlZCBieSBzdHVmZiBkZWNsYXJlZCB3aXRoIF9faW5pdAorICoKKyAqIFRvZG86ICBmcmVlIHBhZ2VzIGJldHdlZW4gX19pbml0X2JlZ2luIGFuZCBfX2luaXRfZW5kOyBwb3NzaWJseQorICogc29tZSBkZXZ0cmVlIHJlbGF0ZWQgc3R1ZmYgYXMgd2VsbC4KKyAqLwordm9pZCBfX2luaXRfcmVmb2sgZnJlZV9pbml0bWVtKHZvaWQpCit7Cit9CisKKy8qCisgKiBmcmVlX2luaXRyZF9tZW0gLSBmcmVlcy4uLiAgaW5pdHJkIG1lbW9yeS4KKyAqIEBzdGFydCAtIHN0YXJ0IG9mIGluaXQgbWVtb3J5CisgKiBAZW5kIC0gZW5kIG9mIGluaXQgbWVtb3J5CisgKgorICogQXBwYXJlbnRseSBoYXMgdG8gYmUgcGFzc2VkIHRoZSBhZGRyZXNzIG9mIHRoZSBpbml0cmQgbWVtb3J5LgorICoKKyAqIFdyYXBwZWQgYnkgI2lmZGVmIENPTkZJR19CTEtERVZfSU5JVFJECisgKi8KK3ZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworfQorCit2b2lkIHN5bmNfaWNhY2hlX2RjYWNoZShwdGVfdCBwdGUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7CisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlfX3ZtY2FjaGVfaWRzeW5jKGFkZHIsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKiBJbiBvcmRlciB0byBzZXQgdXAgcGFnZSBhbGxvY2F0b3IgIm5vZGVzIiwKKyAqIHNvbWVib2R5IGhhcyB0byBjYWxsIGZyZWVfYXJlYV9pbml0KCkgZm9yIFVNQS4KKyAqCisgKiBJbiB0aGlzIG1vZGUsIHdlIG9ubHkgaGF2ZSBvbmUgcGdfZGF0YV90CisgKiBzdHJ1Y3R1cmU6IGNvbnRpZ19tZW1fZGF0YS4KKyAqLwordm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVzW01BWF9OUl9aT05FU10gPSB7MCwgfTsKKworCS8qCisJICogIFRoaXMgaXMgbm90IHBhcnRpY3VsYXJseSB3ZWxsIGRvY3VtZW50ZWQgYW55d2hlcmUsIGJ1dAorCSAqICBnaXZlIFpPTkVfTk9STUFMIGFsbCB0aGUgbWVtb3J5LCBpbmNsdWRpbmcgdGhlIGJpZyBob2xlcworCSAqICBsZWZ0IGJ5IHRoZSBrZXJuZWwrYm9vdG1lbV9tYXAgd2hpY2ggYXJlIGFscmVhZHkgbGVmdCBhcyByZXNlcnZlZAorCSAqICBpbiB0aGUgYm9vdG1lbV9tYXA7IGZyZWVfYXJlYV9pbml0IHNob3VsZCBzZWUgdGhvc2UgYml0cyBhbmQKKwkgKiAgYWRqdXN0IGFjY29yZGluZ2x5LgorCSAqLworCisJem9uZXNfc2l6ZXNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47CisKKwlmcmVlX2FyZWFfaW5pdCh6b25lc19zaXplcyk7ICAvKiAgc2V0cyB1cCB0aGUgem9uZWxpc3RzIGFuZCBtZW1fbWFwICAqLworCisJLyoKKwkgKiBTdGFydCBvZiBoaWdoIG1lbW9yeSBhcmVhLiAgV2lsbCBwcm9iYWJseSBuZWVkIHNvbWV0aGluZyBtb3JlCisJICogZmFuY3kgaWYgd2UuLi4gIGdldCBtb3JlIGZhbmN5LgorCSAqLworCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikoKGJvb3RtZW1fbGFzdHBnICsgMSkgPDwgUEFHRV9TSElGVCk7Cit9CisKKyNpZm5kZWYgRE1BX1JFU0VSVkUKKyNkZWZpbmUgRE1BX1JFU0VSVkUJCSg0KQorI2VuZGlmCisKKyNkZWZpbmUgRE1BX0NIVU5LU0laRQkJKDE8PDIyKQorI2RlZmluZSBETUFfUkVTRVJWRURfQllURVMJKERNQV9SRVNFUlZFICogRE1BX0NIVU5LU0laRSkKKworLyoKKyAqIFBpY2sgb3V0IHRoZSBtZW1vcnkgc2l6ZS4gIFdlIGxvb2sgZm9yIG1lbT1zaXplLAorICogd2hlcmUgc2l6ZSBpcyAic2l6ZVtLa01tXSIKKyAqLworc3RhdGljIGludCBfX2luaXQgZWFybHlfbWVtKGNoYXIgKnApCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgKmVuZHA7CisKKwlzaXplID0gbWVtcGFyc2UocCwgJmVuZHApOworCisJYm9vdG1lbV9sYXN0cGcgPSBQRk5fRE9XTihzaXplKTsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm1lbSIsIGVhcmx5X21lbSk7CisKK3NpemVfdCBoZXhhZ29uX2NvaGVyZW50X3Bvb2xfc2l6ZSA9IChzaXplX3QpIChETUFfUkVTRVJWRSA8PCAyMik7CisKK3ZvaWQgX19pbml0IHNldHVwX2FyY2hfbWVtb3J5KHZvaWQpCit7CisJaW50IGJvb3RtYXBfc2l6ZTsKKwkvKiAgWFhYIFRvZG86IHRoaXMgcHJvYmFibHkgc2hvdWxkIGJlIGNsZWFuZWQgdXAgICovCisJdTMyICpzZWd0YWJsZSA9ICh1MzIgKikgJnN3YXBwZXJfcGdfZGlyWzBdOworCXUzMiAqc2VndGFibGVfZW5kOworCisJLyoKKwkgKiBTZXQgdXAgYm9vdCBtZW1vcnkgYWxsb2NhdG9yCisJICoKKwkgKiBUaGUgR29ybWFuIGJvb2sgYWxzbyB0YWxrcyBhYm91dCB0aGVzZSBmdW5jdGlvbnMuCisJICogVGhpcyBuZWVkcyB0byBjaGFuZ2UgZm9yIGhpZ2htZW0gc2V0dXBzLgorCSAqLworCisJLyogTWVtb3J5IHNpemUgbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNk0gKi8KKwlib290bWVtX2xhc3RwZyA9IFBGTl9ET1dOKChib290bWVtX2xhc3RwZyA8PCBQQUdFX1NISUZUKSAmCisJCX4oKEJJR19LRVJORUxfUEFHRV9TSVpFKSAtIDEpKTsKKworCS8qCisJICogUmVzZXJ2ZSB0aGUgdG9wIERNQV9SRVNFUlZFIGJ5dGVzIG9mIFJBTSBmb3IgRE1BICh1bmNhY2hlZCkKKwkgKiBtZW1vcnkgYWxsb2NhdGlvbgorCSAqLworCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbShib290bWVtX3N0YXJ0cGcsIGJvb3RtZW1fbGFzdHBnIC0KKwkJCQkgICAgUEZOX0RPV04oRE1BX1JFU0VSVkVEX0JZVEVTKSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJib290bWVtX3N0YXJ0cGc6ICAweCUwOGx4XG4iLCBib290bWVtX3N0YXJ0cGcpOworCXByaW50ayhLRVJOX0lORk8gImJvb3RtZW1fbGFzdHBnOiAgMHglMDhseFxuIiwgYm9vdG1lbV9sYXN0cGcpOworCXByaW50ayhLRVJOX0lORk8gImJvb3RtYXBfc2l6ZTogICVkXG4iLCBib290bWFwX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIm1heF9sb3dfcGZuOiAgMHglMDhseFxuIiwgbWF4X2xvd19wZm4pOworCisJLyoKKwkgKiBUaGUgZGVmYXVsdCBWTSBwYWdlIHRhYmxlcyAod2lsbCBiZSkgcG9wdWxhdGVkIHdpdGgKKwkgKiBWQT1QQStQQUdFX09GRlNFVCBtYXBwaW5nLiAgV2UgZ28gaW4gYW5kIGludmFsaWRhdGUgZW50cmllcworCSAqIGhpZ2hlciB0aGFuIHdoYXQgd2UgaGF2ZSBtZW1vcnkgZm9yLgorCSAqLworCisJLyogIHRoaXMgaXMgcG9pbnRlciBhcml0aG1ldGljOyBlYWNoIGVudHJ5IGNvdmVycyA0TUIgICovCisJc2VndGFibGUgPSBzZWd0YWJsZSArIChQQUdFX09GRlNFVCA+PiAyMik7CisKKwkvKiAgdGhpcyBhY3R1YWxseSBvbmx5IGdvZXMgdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3QgZ2lnICAqLworCXNlZ3RhYmxlX2VuZCA9IHNlZ3RhYmxlICsgKDE8PCgzMC0yMikpOworCisJLyogIE1vdmUgZm9yd2FyZCB0byB0aGUgc3RhcnQgb2YgZW1wdHkgcGFnZXMgICovCisJc2VndGFibGUgKz0gYm9vdG1lbV9sYXN0cGcgPj4gKDIyLVBBR0VfU0hJRlQpOworCisJeworCSAgICBpbnQgaTsKKworCSAgICBmb3IgKGkgPSAxIDsgaSA8PSBETUFfUkVTRVJWRSA7IGkrKykKKwkJc2VndGFibGVbLWldID0gKChzZWd0YWJsZVstaV0gJiBfX0hWTV9QVEVfUEdNQVNLXzRNQikKKwkJCQl8IF9fSFZNX1BURV9SIHwgX19IVk1fUFRFX1cgfCBfX0hWTV9QVEVfWAorCQkJCXwgX19IRVhBR09OX0NfVU5DIDw8IDYKKwkJCQl8IF9fSFZNX1BERV9TXzRNQik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiY2xlYXJpbmcgc2VndGFibGUgZnJvbSAlcCB0byAlcFxuIiwgc2VndGFibGUsCisJCXNlZ3RhYmxlX2VuZCk7CisJd2hpbGUgKHNlZ3RhYmxlIDwgKHNlZ3RhYmxlX2VuZC04KSkKKwkJKihzZWd0YWJsZSsrKSA9IF9fSFZNX1BERV9TX0lOVkFMSUQ7CisJLyogc3RvcCB0aGUgcG9pbnRlciBhdCB0aGUgZGV2aWNlIEkvTyA0TUIgcGFnZSAgKi8KKworCXByaW50ayhLRVJOX0lORk8gInNlZ3RhYmxlID0gJXAgKHNob3VsZCBiZSBlcXVhbCB0byBfS19pb19tYXApXG4iLAorCQlzZWd0YWJsZSk7CisKKyNpZiAwCisJLyogIE90aGVyIGhhbGYgb2YgdGhlIGVhcmx5IGRldmljZSB0YWJsZSBmcm9tIHZtX2luaXRfc2VndGFibGUuICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJl9LX2luaXRfZGV2aWNldGFibGUgPSAweCUwOHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKSBfS19pbml0X2RldmljZXRhYmxlLVBBR0VfT0ZGU0VUKTsKKwkqc2VndGFibGUgPSAoKHUzMikgKHVuc2lnbmVkIGxvbmcpIF9LX2luaXRfZGV2aWNldGFibGUtUEFHRV9PRkZTRVQpIHwKKwkJX19IVk1fUERFX1NfNEtCOworCXByaW50ayhLRVJOX0lORk8gIipzZWd0YWJsZSA9IDB4JTA4eFxuIiwgKnNlZ3RhYmxlKTsKKyNlbmRpZgorCisJLyoKKwkgKiBGcmVlIGFsbCB0aGUgbWVtb3J5IHRoYXQgd2Fzbid0IHRha2VuIHVwIGJ5IHRoZSBib290bWFwLCB0aGUgRE1BCisJICogcmVzZXJ2ZSwgb3Iga2VybmVsIGl0c2VsZi4KKwkgKi8KKwlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoYm9vdG1lbV9zdGFydHBnKStib290bWFwX3NpemUsCisJCSAgICAgUEZOX1BIWVMoYm9vdG1lbV9sYXN0cGcgLSBib290bWVtX3N0YXJ0cGcpIC0gYm9vdG1hcF9zaXplIC0KKwkJICAgICBETUFfUkVTRVJWRURfQllURVMpOworCisJLyoKKwkgKiAgVGhlIGJvb3RtZW0gYWxsb2NhdG9yIHNlZW1pbmdseSBqdXN0IGxpdmVzIHRvIGZlZWQgbWVtb3J5CisJICogIHRvIHRoZSBwYWdpbmcgc3lzdGVtCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiUEFHRV9TSVpFPSVsdVxuIiwgUEFHRV9TSVpFKTsKKwlwYWdpbmdfaW5pdCgpOyAgLyogIFNlZSBHb3JtYW4gQm9vaywgMi4zICAqLworCisJLyoKKwkgKiAgQXQgdGhpcyBwb2ludCwgdGhlIHBhZ2UgYWxsb2NhdG9yIGlzIGtpbmQgb2YgaW5pdGlhbGl6ZWQsIGJ1dAorCSAqICBhcHBhcmVudGx5IG5vIHBhZ2VzIGFyZSBhdmFpbGFibGUgKGp1c3QgbGlrZSB3aXRoIHRoZSBib290bWVtCisJICogIGFsbG9jYXRvciksIGFuZCBuZWVkIHRvIGJlIGZyZWVkIHRoZW1zZWx2ZXMgdmlhIG1lbV9pbml0KCksCisJICogIHdoaWNoIGlzIGNhbGxlZCBieSBzdGFydF9rZXJuZWwoKSBsYXRlciBvbiBpbiB0aGUgcHJvY2VzcworCSAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL2lvcmVtYXAuYyBiL2FyY2gvaGV4YWdvbi9tbS9pb3JlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzN2JjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9pb3JlbWFwLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIEkvTyByZW1hcCBmdW5jdGlvbnMgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKK3ZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHIsIGFkZHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisKKwlwZ3Byb3RfdCBwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVHxfUEFHRV9SRUFEfF9QQUdFX1dSSVRFCisJCQkJCXwoX19IRVhBR09OX0NfREVWIDw8IDYpKTsKKworCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOworCisJLyogIFdyYXBwaW5nIG5vdCBhbGxvd2VkICAqLworCWlmICghc2l6ZSB8fCAobGFzdF9hZGRyIDwgcGh5c19hZGRyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiAgUm91bmRzIHVwIHRvIG5leHQgcGFnZSBzaXplLCBpbmNsdWRpbmcgd2hvbGUtcGFnZSBvZmZzZXQgKi8KKwlzaXplID0gUEFHRV9BTElHTihvZmZzZXQgKyBzaXplKTsKKworCWFyZWEgPSBnZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQKTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYXJlYS0+YWRkcjsKKworCWlmIChpb3JlbWFwX3BhZ2VfcmFuZ2UoYWRkciwgYWRkcitzaXplLCBwaHlzX2FkZHIsIHByb3QpKSB7CisJCXZ1bm1hcCgodm9pZCAqKWFkZHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAob2Zmc2V0ICsgYWRkcik7Cit9CisKK3ZvaWQgX19pb3VubWFwKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl2dW5tYXAoKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZGRyICYgUEFHRV9NQVNLKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vcGdhbGxvYy5jIGIvYXJjaC9oZXhhZ29uL21tL3BnYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc1ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL3BnYWxsb2MuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKwordm9pZCBfX2luaXQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vc3Rybmxlbl91c2VyLlMgYi9hcmNoL2hleGFnb24vbW0vc3Rybmxlbl91c2VyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2YTE2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaGV4YWdvbi9tbS9zdHJubGVuX3VzZXIuUwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFVzZXIgc3RyaW5nIGxlbmd0aCBmdW5jdGlvbnMgZm9yIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNkZWZpbmUgaXNyYwlyMAorI2RlZmluZSBtYXgJcjEJLyogIERvIG5vdCBjaGFuZ2UhICAqLworCisjZGVmaW5lIGVuZAlyMgorI2RlZmluZSB0bXAxCXIzCisKKyNkZWZpbmUgb2JvCXI2CS8qICBvZmYtYnktb25lICAqLworI2RlZmluZSBzdGFydAlyNworI2RlZmluZSBtb2Q4CXI4CisjZGVmaW5lIGRidWYgICAgcjE1OjE0CisjZGVmaW5lIGRjbXAJcjEzOjEyCisKKy8qCisgKiBUaGUgdmVjdG9yIG1hc2sgdmVyc2lvbiBvZiB0aGlzIHR1cm5lZCBvdXQgKnJlYWxseSogYmFkbHkuCisgKiBUaGUgaGFyZHdhcmUgbG9vcCB2ZXJzaW9uIGFsc28gdHVybmVkIG91dCAqcmVhbGx5KiBiYWRseS4KKyAqIFNlZW1zIHN0cmFpZ2h0IHBvaW50ZXIgYXJpdGhtZXRpYyBiYXNpY2FsbHkgd2lucyBoZXJlLgorICovCisKKyNkZWZpbmUgZm5hbWUgX19zdHJubGVuX3VzZXIKKworCS50ZXh0CisJLmdsb2JhbCBmbmFtZQorCS50eXBlIGZuYW1lLCBAZnVuY3Rpb24KKwkucDJhbGlnbiA1ICAvKiAgd2h5PyAgKi8KK2ZuYW1lOgorCXsKKwkJbW9kOCA9IGFuZChpc3JjLCM3KTsKKwkJZW5kID0gYWRkKGlzcmMsbWF4KTsKKwkJc3RhcnQgPSBpc3JjOworCX0KKwl7CisJCVAwID0gY21wLmVxKG1vZDgsIzApOworCQltb2Q4ID0gYW5kKGVuZCwjNyk7CisJCWRjbXAgPSAjMDsKKwkJaWYgKFAwLm5ldykganVtcDp0IGR3X2xvb3A7CS8qICBmaXJlIHVwIHRoZSBvdmVuICAqLworCX0KKworYWxpZ25tZW50X2xvb3A6CitmYWlsXzE6CXsKKwkJdG1wMSA9IG1lbWIoc3RhcnQrKyMxKTsKKwl9CisJeworCQlQMCA9IGNtcC5lcSh0bXAxLCMwKTsKKwkJaWYgKFAwLm5ldykganVtcDpudCBleGl0X2ZvdW5kOworCQlQMSA9IGNtcC5ndHUoZW5kLHN0YXJ0KTsKKwkJbW9kOCA9IGFuZChzdGFydCwjNyk7CisJfQorCXsKKwkJaWYgKCFQMSkganVtcCBleGl0X2Vycm9yOyAgLyogIGhpdCB0aGUgZW5kICAqLworCQlQMCA9IGNtcC5lcShtb2Q4LCMwKTsKKwl9CisJeworCQlpZiAoIVAwKSBqdW1wIGFsaWdubWVudF9sb29wOworCX0KKworCisKK2R3X2xvb3A6CitmYWlsXzI6CXsKKwkJZGJ1ZiA9IG1lbWQoc3RhcnQpOworCQlvYm8gPSBhZGQoc3RhcnQsIzEpOworCX0KKwl7CisJCVAwID0gdmNtcGIuZXEoZGJ1ZixkY21wKTsKKwl9CisJeworCQl0bXAxID0gUDA7CisJCVAwID0gY21wLmd0dShlbmQsc3RhcnQpOworCX0KKwl7CisJCXRtcDEgPSBjdDAodG1wMSk7CisJCW1vZDggPSBhbmQoZW5kLCM3KTsKKwkJaWYgKCFQMCkganVtcCBlbmRfY2hlY2s7CisJfQorCXsKKwkJUDAgPSBjbXAuZXEodG1wMSwjMzIpOworCQlpZiAoIVAwLm5ldykganVtcDpudCBleGl0X2ZvdW5kOworCQlpZiAoIVAwLm5ldykgc3RhcnQgPSBhZGQob2JvLHRtcDEpOworCX0KKwl7CisJCXN0YXJ0ID0gYWRkKHN0YXJ0LCM4KTsKKwkJanVtcCBkd19sb29wOworCX0JLyogIG1pZ2h0IGJlIG5pY2UgdG8gY29tYmluZSB0aGVzZSBqdW1wcy4uLiAgICovCisKKworZW5kX2NoZWNrOgorCXsKKwkJUDAgPSBjbXAuZ3QodG1wMSxtb2Q4KTsKKwkJaWYgKFAwLm5ldykganVtcDpudCBleGl0X2Vycm9yOwkvKiAgbmV2ZXJmb3VuZCEgICovCisJCXN0YXJ0ID0gYWRkKG9ibyx0bXAxKTsKKwl9CisKK2V4aXRfZm91bmQ6CisJeworCQlSMCA9IHN1YihzdGFydCxpc3JjKTsKKwkJanVtcHIgUjMxOworCX0KKworZXhpdF9lcnJvcjoKKwl7CisJCVIwID0gYWRkKG1heCwjMSk7CisJCWp1bXByIFIzMTsKKwl9CisKKwkvKiAgVWgsIHdoYXQgZG9lcyB0aGUgImZpeHVwIiByZXR1cm4gaGVyZT8gICovCisJLmZhbGlnbgorZml4XzE6CisJeworCQlSMCA9ICMwOworCQlqdW1wciBSMzE7CisJfQorCisJLnNpemUgZm5hbWUsLi1mbmFtZQorCisKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisubG9uZyBmYWlsXzEsZml4XzEKKy5sb25nIGZhaWxfMixmaXhfMQorLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vbW0vdWFjY2Vzcy5jIGIvYXJjaC9oZXhhZ29uL21tL3VhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQ4MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL3VhY2Nlc3MuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIFN1cHBvcnQgZm9yIHVzZXIgbWVtb3J5IGFjY2VzcyBmcm9tIGtlcm5lbC4gIFRoaXMgd2lsbAorICogcHJvYmFibHkgYmUgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UgYXQgc29tZSBwb2ludCwgYnV0CisgKiBmb3IgZWFzZSBvZiBkZWJ1ZywgYW5kIHRvIGEgbGVzc2VyIGRlZ3JlZSBmb3IgY29kZSBzaXplLAorICogd2UgaW1wbGVtZW50IGhlcmUgYXMgc3Vicm91dGluZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworLyoKKyAqIEZvciBjbGVhcl91c2VyKCksIGV4cGxvaXQgcHJldmlvdXNseSBkZWZpbmVkIGNvcHlfdG9fdXNlciBmdW5jdGlvbgorICogYW5kIHRoZSBmYWN0IHRoYXQgd2UndmUgZ290IGEgaGFuZHkgemVybyBwYWdlIGRlZmluZWQgaW4ga2VybmVsL2hlYWQuUworICoKKyAqIGRjemVybyBoZXJlIHdvdWxkIGJlIGV2ZW4gZmFzdGVyLgorICovCitfX2tlcm5lbF9zaXplX3QgX19jbGVhcl91c2VyX2hleGFnb24odm9pZCBfX3VzZXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJbG9uZyB1bmNsZWFyZWQ7CisKKwl3aGlsZSAoY291bnQgPiBQQUdFX1NJWkUpIHsKKwkJdW5jbGVhcmVkID0gX19jb3B5X3RvX3VzZXJfaGV4YWdvbihkZXN0LCAmZW1wdHlfemVyb19wYWdlLAorCQkJCQkJUEFHRV9TSVpFKTsKKwkJaWYgKHVuY2xlYXJlZCkKKwkJCXJldHVybiBjb3VudCAtIChQQUdFX1NJWkUgLSB1bmNsZWFyZWQpOworCQljb3VudCAtPSBQQUdFX1NJWkU7CisJCWRlc3QgKz0gUEFHRV9TSVpFOworCX0KKwlpZiAoY291bnQpCisJCWNvdW50ID0gX19jb3B5X3RvX3VzZXJfaGV4YWdvbihkZXN0LCAmZW1wdHlfemVyb19wYWdlLCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY2xlYXJfdXNlcl9oZXhhZ29uKHZvaWQgX191c2VyICpkZXN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGVzdCwgY291bnQpKQorCQlyZXR1cm4gY291bnQ7CisJZWxzZQorCQlyZXR1cm4gX19jbGVhcl91c2VyX2hleGFnb24oZGVzdCwgY291bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL3ZtX2ZhdWx0LmMgYi9hcmNoL2hleGFnb24vbW0vdm1fZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBiNzZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oZXhhZ29uL21tL3ZtX2ZhdWx0LmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBNZW1vcnkgZmF1bHQgaGFuZGxpbmcgZm9yIEhleGFnb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKy8qCisgKiBQYWdlIGZhdWx0IGhhbmRsaW5nIGZvciB0aGUgSGV4YWdvbiBWaXJ0dWFsIE1hY2hpbmUuCisgKiBDYW4gYWxzbyBiZSBjYWxsZWQgYnkgYSBuYXRpdmUgcG9ydCBlbXVsYXRpbmcgdGhlIEhWTQorICogZXhlY3B0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorCisvKgorICogRGVjb2RlIG9mIGhhcmR3YXJlIGV4Y2VwdGlvbiBzZW5kcyB1cyB0byBvbmUgb2Ygc2V2ZXJhbAorICogZW50cnkgcG9pbnRzLiAgQXQgZWFjaCwgd2UgZ2VuZXJhdGUgY2Fub25pY2FsIGFyZ3VtZW50cworICogZm9yIGhhbmRsaW5nIGJ5IHRoZSBhYnN0cmFjdCBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLgorICovCisjZGVmaW5lIEZMVF9JRkVUQ0ggICAgIC0xCisjZGVmaW5lIEZMVF9MT0FEICAgICAgICAwCisjZGVmaW5lIEZMVF9TVE9SRSAgICAgICAxCisKKworLyoKKyAqIENhbm9uaWNhbCBwYWdlIGZhdWx0IGhhbmRsZXIKKyAqLwordm9pZCBkb19wYWdlX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgbG9uZyBjYXVzZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzaWdpbmZvX3QgaW5mbzsKKwlpbnQgc2lfY29kZSA9IFNFR1ZfTUFQRVJSOworCWludCBmYXVsdDsKKwljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXh1cDsKKworCS8qCisJICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGhhdmUgbm8gdXNlciBjb250ZXh0LAorCSAqIHRoZW4gbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuCisJICovCisJaWYgKHVubGlrZWx5KGluX2ludGVycnVwdCgpIHx8ICFtbSkpCisJCWdvdG8gbm9fY29udGV4dDsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CisJaWYgKCF2bWEpCisJCWdvdG8gYmFkX2FyZWE7CisKKwlpZiAodm1hLT52bV9zdGFydCA8PSBhZGRyZXNzKQorCQlnb3RvIGdvb2RfYXJlYTsKKworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQorCQlnb3RvIGJhZF9hcmVhOworCisJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKQorCQlnb3RvIGJhZF9hcmVhOworCitnb29kX2FyZWE6CisJLyogQWRkcmVzcyBzcGFjZSBpcyBPSy4gIE5vdyBjaGVjayBhY2Nlc3MgcmlnaHRzLiAqLworCXNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKKworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIEZMVF9JRkVUQ0g6CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSkKKwkJCWdvdG8gYmFkX2FyZWE7CisJCWJyZWFrOworCWNhc2UgRkxUX0xPQUQ6CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSkKKwkJCWdvdG8gYmFkX2FyZWE7CisJCWJyZWFrOworCWNhc2UgRkxUX1NUT1JFOgorCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJZ290byBiYWRfYXJlYTsKKwkJYnJlYWs7CisJfQorCisJZmF1bHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgKGNhdXNlID4gMCkpOworCisJLyogVGhlIG1vc3QgY29tbW9uIGNhc2UgLS0gd2UgYXJlIGRvbmUuICovCisJaWYgKGxpa2VseSghKGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSkgeworCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9NQUpPUikKKwkJCWN1cnJlbnQtPm1hal9mbHQrKzsKKwkJZWxzZQorCQkJY3VycmVudC0+bWluX2ZsdCsrOworCisJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCXJldHVybjsKKwl9CisKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJLyogSGFuZGxlIGNvcHlpbi9vdXQgZXhjZXB0aW9uIGNhc2VzICovCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCWdvdG8gbm9fY29udGV4dDsKKworCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkgeworCQlwYWdlZmF1bHRfb3V0X29mX21lbW9yeSgpOworCQlyZXR1cm47CisJfQorCisJLyogVXNlci1tb2RlIGFkZHJlc3MgaXMgaW4gdGhlIG1lbW9yeSBtYXAsIGJ1dCB3ZSBhcmUKKwkgKiB1bmFibGUgdG8gZml4IHVwIHRoZSBwYWdlIGZhdWx0LgorCSAqLworCWlmIChmYXVsdCAmIFZNX0ZBVUxUX1NJR0JVUykgeworCQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOworCQlpbmZvLnNpX2NvZGUgPSBCVVNfQURSRVJSOworCX0KKwkvKiBBZGRyZXNzIGlzIG5vdCBpbiB0aGUgbWVtb3J5IG1hcCAqLworCWVsc2UgeworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9jb2RlID0gU0VHVl9BQ0NFUlI7CisJfQorCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CisJZm9yY2Vfc2lnX2luZm8oaW5mby5zaV9jb2RlLCAmaW5mbywgY3VycmVudCk7CisJcmV0dXJuOworCitiYWRfYXJlYToKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCWluZm8uc2lfY29kZSA9IHNpX2NvZGU7CisJCWluZm8uc2lfYWRkciA9ICh2b2lkICopYWRkcmVzczsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJmluZm8sIGN1cnJlbnQpOworCQlyZXR1cm47CisJfQorCS8qIEtlcm5lbC1tb2RlIGZhdWx0IGZhbGxzIHRocm91Z2ggKi8KKworbm9fY29udGV4dDoKKwlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHB0X2VscihyZWdzKSk7CisJaWYgKGZpeHVwKSB7CisJCXB0X3NldF9lbHIocmVncywgZml4dXAtPmZpeHVwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaW5ncyBhcmUgbG9va2luZyB2ZXJ5LCB2ZXJ5IGJhZCBub3cgKi8KKwlidXN0X3NwaW5sb2NrcygxKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgYXQgIgorCQkidmlydHVhbCBhZGRyZXNzIDB4JTA4bHgsIHJlZ3MgJXBcbiIsIGFkZHJlc3MsIHJlZ3MpOworCWRpZSgiQmFkIEtlcm5lbCBWQSIsIHJlZ3MsIFNJR0tJTEwpOworfQorCisKK3ZvaWQgcmVhZF9wcm90ZWN0aW9uX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgYmFkdmFkciA9IHB0X2JhZHZhKHJlZ3MpOworCisJZG9fcGFnZV9mYXVsdChiYWR2YWRyLCBGTFRfTE9BRCwgcmVncyk7Cit9CisKK3ZvaWQgd3JpdGVfcHJvdGVjdGlvbl9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGJhZHZhZHIgPSBwdF9iYWR2YShyZWdzKTsKKworCWRvX3BhZ2VfZmF1bHQoYmFkdmFkciwgRkxUX1NUT1JFLCByZWdzKTsKK30KKwordm9pZCBleGVjdXRlX3Byb3RlY3Rpb25fZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBiYWR2YWRyID0gcHRfYmFkdmEocmVncyk7CisKKwlkb19wYWdlX2ZhdWx0KGJhZHZhZHIsIEZMVF9JRkVUQ0gsIHJlZ3MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9oZXhhZ29uL21tL3ZtX3RsYi5jIGIvYXJjaC9oZXhhZ29uL21tL3ZtX3RsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZmY0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2hleGFnb24vbW0vdm1fdGxiLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIEhleGFnb24gVmlydHVhbCBNYWNoaW5lIFRMQiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogVGhlIEhleGFnb24gVmlydHVhbCBNYWNoaW5lIGNvbmNlYWxzIHRoZSByZWFsIHdvcmtpbmdzIG9mCisgKiB0aGUgVExCLCBidXQgdGhlcmUgYXJlIG9uZSBvciB0d28gZnVuY3Rpb25zIHRoYXQgbmVlZCB0bworICogYmUgaW5zdGFudGlhdGVkIGZvciBpdCwgZGlmZmVyZW50bHkgZnJvbSBhIG5hdGl2ZSBidWlsZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaGV4YWdvbl92bS5oPgorCisvKgorICogSW5pdGlhbCBWTSBpbXBsZW1lbnRhdGlvbiBoYXMgb25seSBvbmUgbWFwIGFjdGl2ZSBhdCBhIHRpbWUsIHdpdGgKKyAqIFRMQiBwdXJnaW5ncyBvbiBjaGFuZ2VzLiAgU28gZWl0aGVyIHdlJ3JlIG51a2luZyB0aGUgY3VycmVudCBtYXAsCisgKiBvciBpdCdzIGEgbm8tb3AuICBUaGlzIG9wZXJhdGlvbiBpcyBtZXNzeSBvbiB0cnVlIFNNUHMgd2hlcmUgb3RoZXIKKyAqIHByb2Nlc3NvcnMgbXVzdCBiZSBpbmR1Y2VkIHRvIGZsdXNoIHRoZSBjb3BpZXMgaW4gdGhlaXIgbG9jYWwgVExCcywKKyAqIGJ1dCBIZXhhZ29uIHRocmVhZC1iYXNlZCB2aXJ0dWFsIHByb2Nlc3NvcnMgc2hhcmUgdGhlIHNhbWUgTU1VLgorICovCit2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCXVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKworCWlmIChtbS0+Y29udGV4dC5wdGJhc2UgPT0gY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LnB0YmFzZSkKKwkJX192bWNscm1hcCgodm9pZCAqKXN0YXJ0LCBlbmQgLSBzdGFydCk7Cit9CisKKy8qCisgKiBGbHVzaCBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHZpcnR1YWwgbWFwIC0gdXNlZCBieSBoaWdobWVtCisgKi8KK3ZvaWQgZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCV9fdm1jbHJtYXAoKHZvaWQgKil2YWRkciwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIEZsdXNoIGFsbCBUTEJzIGFjcm9zcyBhbGwgQ1BVcywgdmlydHVhbCBvciByZWFsLgorICogQSBzaW5nbGUgSGV4YWdvbiBjb3JlIGhhcyA2IHRocmVhZCBjb250ZXh0cyBidXQKKyAqIG9ubHkgb25lIFRMQi4KKyAqLwordm9pZCB0bGJfZmx1c2hfYWxsKHZvaWQpCit7CisJLyogIHNob3VsZCBwcm9iYWJseSB1c2UgdGhhdCBmaXhhZGRyIGVuZCBvciB3aGF0ZXZlIGxhYmVsICAqLworCV9fdm1jbHJtYXAoMCwgMHhmZmZmMDAwMCk7Cit9CisKKy8qCisgKiBGbHVzaCBUTEIgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBtbV9zdHJ1Y3QgbWFwcGluZy4KKyAqLwordm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJLyogQ3VycmVudCBWaXJ0dWFsIE1hY2hpbmUgaGFzIG9ubHkgb25lIG1hcCBhY3RpdmUgYXQgYSB0aW1lICovCisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5wdGJhc2UgPT0gbW0tPmNvbnRleHQucHRiYXNlKQorCQl0bGJfZmx1c2hfYWxsKCk7Cit9CisKKy8qCisgKiBGbHVzaCBUTEIgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGEgcGFnZSBvZiBhIHZtYS4KKyAqLwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisKKwlpZiAobW0tPmNvbnRleHQucHRiYXNlICA9PSBjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQucHRiYXNlKQorCQlfX3ZtY2xybWFwKCh2b2lkICopdmFkZHIsIFBBR0VfU0laRSk7Cit9CisKKy8qCisgKiBGbHVzaCBUTEIgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggYSBrZXJuZWwgYWRkcmVzcyByYW5nZS4KKyAqIExpa2UgZmx1c2ggcmFuZ2UsIGJ1dCB3aXRob3V0IHRoZSBjaGVjayBvbiB0aGUgdm1hLT52bV9tbS4KKyAqLwordm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCQlfX3ZtY2xybWFwKCh2b2lkICopc3RhcnQsIGVuZCAtIHN0YXJ0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggM2ZmNzc4NS4uMjc0ODliNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTkyLDcgKzkyLDcgQEAKIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBHRU5FUklDX0dQSU8KLQlkZWZfYm9vbCB5CisJYm9vbAogCiBjb25maWcgRE1JCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2VuZXJpY19kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwppbmRleCA0M2FiMWNkLi45NTRkODFlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZwpAQCAtODcsNiArODcsNyBAQAogQ09ORklHX05FVF9UVUxJUD15CiBDT05GSUdfVFVMSVA9bQogQ09ORklHX05FVF9QQ0k9eQorQ09ORklHX05FVF9WRU5ET1JfSU5URUw9eQogQ09ORklHX0UxMDA9bQogQ09ORklHX0UxMDAwPXkKIENPTkZJR19JR0I9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbnNwYXJzZV9kZWZjb25maWcKaW5kZXggYjExZmE4OC4uOTFjNDFlYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvZ2Vuc3BhcnNlX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy9nZW5zcGFyc2VfZGVmY29uZmlnCkBAIC03NSw2ICs3NSw3IEBACiBDT05GSUdfTkVUX1RVTElQPXkKIENPTkZJR19UVUxJUD1tCiBDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15CiBDT05GSUdfRTEwMD1tCiBDT05GSUdfRTEwMDA9eQogQ09ORklHX1RJR09OMz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKaW5kZXggMTM3YTQ1My4uYTVhOWUwMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwpAQCAtNzcsNiArNzcsNyBAQAogQ09ORklHX05FVF9UVUxJUD15CiBDT05GSUdfVFVMSVA9bQogQ09ORklHX05FVF9QQ0k9eQorQ09ORklHX05FVF9WRU5ET1JfSU5URUw9eQogQ09ORklHX0UxMDA9bQogQ09ORklHX0UxMDAwPXkKIENPTkZJR19USUdPTjM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MveGVuX2RvbXVfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3MveGVuX2RvbXVfZGVmY29uZmlnCmluZGV4IDJiZjc2ZTQuLjM3YjliNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3hlbl9kb211X2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy94ZW5fZG9tdV9kZWZjb25maWcKQEAgLTgwLDYgKzgwLDcgQEAKIENPTkZJR19ORVRfVFVMSVA9eQogQ09ORklHX1RVTElQPW0KIENPTkZJR19ORVRfUENJPXkKK0NPTkZJR19ORVRfVkVORE9SX0lOVEVMPXkKIENPTkZJR19FMTAwPW0KIENPTkZJR19FMTAwMD15CiBDT05GSUdfVElHT04zPXkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCmluZGV4IDFkNDI4MjcuLmZjN2FiYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZwpAQCAtNTcsNiArNTcsNyBAQAogQ09ORklHX1RVTElQX05BUEk9eQogQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTj15CiBDT05GSUdfTkVUX1BDST15CitDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15CiBDT05GSUdfRTEwMD15CiBDT05GSUdfRTEwMDA9eQogQ09ORklHX1RJR09OMz15CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL2h3c3dfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCmluZGV4IGU0YTgwZDguLjFlNGNhZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIAogZXh0ZXJuIHN0cnVjdCBkbWFfbWFwX29wcyBzYmFfZG1hX29wcywgc3dpb3RsYl9kbWFfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDdjOTI4ZGEuLjc2MTcyNDggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTMyMSwxMSArMzIxLDEzIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkJMTMyOQogI2RlZmluZSBfX05SX3NldG5zCQkJMTMzMAogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkJMTMzMQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJCTEzMzIKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkJMTMzMwogCiAjaWZkZWYgX19LRVJORUxfXwogCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMDggLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KKyNkZWZpbmUgTlJfc3lzY2FsbHMJCQkzMTAgLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBzdG9wIHNjcmlwdHMvY2hlY2tzeXNjYWxscy5zaCBmcm9tIGNvbXBsYWluaW5nIGFib3V0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWZhZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElzYWt1IFlhbWFoYXRhIDx5YW1haGF0YSBhdCB2YWxpbnV4IGNvIGpwPgotICogICAgICAgICAgICAgICAgICAgIFZBIExpbnV4IFN5c3RlbXMgSmFwYW4gSy5LLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfQVNNX0lBNjRfWEVOX0dSQU5UX1RBQkxFX0gKLSNkZWZpbmUgX0FTTV9JQTY0X1hFTl9HUkFOVF9UQUJMRV9ICi0KLXN0cnVjdCB2bV9zdHJ1Y3QgKnhlbl9hbGxvY192bV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci12b2lkIHhlbl9mcmVlX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7Ci0KLSNlbmRpZiAvKiBfQVNNX0lBNjRfWEVOX0dSQU5UX1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oCmluZGV4IGU5NTFlNzQuLjFkMjQyN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3hlbi9pbnRlcmZhY2UuaApAQCAtNzYsNiArNzYsNyBAQAogREVGSU5FX0dVRVNUX0hBTkRMRShpbnQpOwogREVGSU5FX0dVRVNUX0hBTkRMRShsb25nKTsKIERFRklORV9HVUVTVF9IQU5ETEUodm9pZCk7CitERUZJTkVfR1VFU1RfSEFORExFKHVpbnQ2NF90KTsKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHhlbl9wZm5fdDsKIERFRklORV9HVUVTVF9IQU5ETEUoeGVuX3Bmbl90KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZG1hLW1hcHBpbmcuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZG1hLW1hcHBpbmcuYwppbmRleCBmMmMxNjAwLi43Zjc5MTYyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9kbWEtbWFwcGluZy5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIFNldCB0aGlzIHRvIDEgaWYgdGhlcmUgaXMgYSBIVyBJT01NVSBpbiB0aGUgc3lzdGVtICovCiBpbnQgaW9tbXVfZGV0ZWN0ZWQgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCAxOThjNzUzLi41YjMxZDQ2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNzc3LDYgKzE3NzcsOCBAQAogCWRhdGE4IHN5c19zeW5jZnMKIAlkYXRhOCBzeXNfc2V0bnMJCQkJLy8gMTMzMAogCWRhdGE4IHN5c19zZW5kbW1zZworCWRhdGE4IHN5c19wcm9jZXNzX3ZtX3JlYWR2CisJZGF0YTggc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CiAKIAkub3JnIHN5c19jYWxsX3RhYmxlICsgOCpOUl9zeXNjYWxscwkvLyBndWFyZCBhZ2FpbnN0IGZhaWx1cmVzIHRvIGluY3JlYXNlIE5SX3N5c2NhbGxzCiAjZW5kaWYgLyogX19JQTY0X0FTTV9QQVJBVklSVFVBTElaRURfTkFUSVZFICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggMGUwZTBjYy4uOWJlMWYxMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9udW1hLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jIGIvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jCmluZGV4IDgyMTNlZmUuLjQzZjRjOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vZ2NjX2ludHJpbi5oPgpAQCAtMjA0LDcgKzIwNSw3IEBACiAJCXIgPSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQ7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9JT01NVToKLQkJciA9IGlvbW11X2ZvdW5kKCk7CisJCXIgPSBpb21tdV9wcmVzZW50KCZwY2lfYnVzX3R5cGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IGFhMjUzM2EuLjJjMjc3MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jCmluZGV4IDhjZGNiMTcuLmIxNzI1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggOTgwNzlmMi4uMGEzNmYwOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggMzA4NjJjMC4uMmRlNDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTYxNSwxMSArNjE1LDE1IEBACiAJCX0KIAl9CiAKLQlpZiAoY3B1ID09IFNOX0hXUEVSRl9BUkdfQU5ZX0NQVSB8fCBjcHUgPT0gZ2V0X2NwdSgpKSB7Ci0JCS8qIGRvbid0IGNhcmUsIG9yIGFscmVhZHkgb24gY29ycmVjdCBjcHUgKi8KKwlpZiAoY3B1ID09IFNOX0hXUEVSRl9BUkdfQU5ZX0NQVSkgeworCQkvKiBkb24ndCBjYXJlIHdoaWNoIGNwdSAqLwogCQlzbl9od3BlcmZfY2FsbF9zYWwob3BfaW5mbyk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSBpZiAoY3B1ID09IGdldF9jcHUoKSkgeworCQkvKiBhbHJlYWR5IG9uIGNvcnJlY3QgY3B1ICovCisJCXNuX2h3cGVyZl9jYWxsX3NhbChvcF9pbmZvKTsKKwkJcHV0X2NwdSgpOworCX0gZWxzZSB7CisJCXB1dF9jcHUoKTsKIAkJaWYgKHVzZV9pcGkpIHsKIAkJCS8qIHVzZSBhbiBpbnRlcnByb2Nlc3NvciBpbnRlcnJ1cHQgdG8gY2FsbCBTQUwgKi8KIAkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIHNuX2h3cGVyZl9jYWxsX3NhbCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCmluZGV4IDMzZGVmNjYuLjFlODYzYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IDNjYjVjZjMuLjU2OThmMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vZ2VvLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKaW5kZXggOWMyNzFiZS4uNjQyNDUxZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQveGVuL2dyYW50LXRhYmxlLmMgYi9hcmNoL2lhNjQveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggNDhjY2EzNy4uYzE4MjgxMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3hlbi9ncmFudC10YWJsZS5jCisrKyBiL2FyY2gvaWE2NC94ZW4vZ3JhbnQtdGFibGUuYwpAQCAtMzEsNjggKzMxLDYgQEAKIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgogCi1zdHJ1Y3Qgdm1fc3RydWN0ICp4ZW5fYWxsb2Nfdm1fYXJlYSh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaW50IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgdmlydDsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQl2aXJ0ID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7Ci0JaWYgKHZpcnQgPT0gMCkKLQkJZ290byBlcnIwOwotCW5yX3BhZ2VzID0gMSA8PCBvcmRlcjsKLQlzY3J1Yl9wYWdlcyh2aXJ0LCBucl9wYWdlcyk7Ci0KLQlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXJlYSA9PSBOVUxMKQotCQlnb3RvIGVycjE7Ci0KLQlhcmVhLT5mbGFncyA9IFZNX0lPUkVNQVA7Ci0JYXJlYS0+YWRkciA9ICh2b2lkICopdmlydDsKLQlhcmVhLT5zaXplID0gc2l6ZTsKLQlhcmVhLT5wYWdlcyA9IE5VTEw7Ci0JYXJlYS0+bnJfcGFnZXMgPSBucl9wYWdlczsKLQlhcmVhLT5waHlzX2FkZHIgPSAwOwkvKiB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jIHVzZXMgdGhpcyBmaWVsZCEgICovCi0KLQlyZXR1cm4gYXJlYTsKLQotZXJyMToKLQlmcmVlX3BhZ2VzKHZpcnQsIG9yZGVyKTsKLWVycjA6Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5fYWxsb2Nfdm1fYXJlYSk7Ci0KLXZvaWQgeGVuX2ZyZWVfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKQotewotCXVuc2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihhcmVhLT5zaXplKTsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBfX3BhKGFyZWEtPmFkZHIpOwotCi0JLyogVGhpcyBhcmVhIGlzIHVzZWQgZm9yIGZvcmVpZ24gcGFnZSBtYXBwcGluZy4KLQkgKiBTbyB1bmRlcmx5aW5nIG1hY2hpbmUgcGFnZSBtYXkgbm90IGJlIGFzc2lnbmVkLiAqLwotCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBvcmRlcik7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHJldDsKLQkJdW5zaWduZWQgbG9uZyBncGZuID0gKHBoeXNfYWRkciA+PiBQQUdFX1NISUZUKSArIGk7Ci0JCXN0cnVjdCB4ZW5fbWVtb3J5X3Jlc2VydmF0aW9uIHJlc2VydmF0aW9uID0gewotCQkJLm5yX2V4dGVudHMgICA9IDEsCi0JCQkuYWRkcmVzc19iaXRzID0gMCwKLQkJCS5leHRlbnRfb3JkZXIgPSAwLAotCQkJLmRvbWlkICAgICAgICA9IERPTUlEX1NFTEYKLQkJfTsKLQkJc2V0X3hlbl9ndWVzdF9oYW5kbGUocmVzZXJ2YXRpb24uZXh0ZW50X3N0YXJ0LCAmZ3Bmbik7Ci0JCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9wb3B1bGF0ZV9waHlzbWFwLAotCQkJCQkgICAmcmVzZXJ2YXRpb24pOwotCQlCVUdfT04ocmV0ICE9IDEpOwotCX0KLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFyZWEtPmFkZHIsIG9yZGVyKTsKLQlrZnJlZShhcmVhKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9mcmVlX3ZtX2FyZWEpOwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBncmFudCB0YWJsZSBoYWNrCiAgKiBjbWQ6IEdOVFRBQk9QX3h4eApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3hlbi9oeXBlcnZpc29yLmMgYi9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYwppbmRleCBjYWM0ZDk3Li41MjE3MmVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYworKysgYi9hcmNoL2lhNjQveGVuL2h5cGVydmlzb3IuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20veGVuL3ByaXZvcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IDZjNGU5YWEuLmVmODBhNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0zMjMsMTMgKzMyMyw2IEBACiAJZGVmYXVsdCAiMSIKIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAotIyB0dXJuaW5nIHRoaXMgb24gd2FzdGVzIGEgYnVuY2ggb2Ygc3BhY2UuCi0jIFN1bW1pdCBuZWVkcyBpdCBvbmx5IHdoZW4gTlVNQSBpcyBvbgotY29uZmlnIEJPT1RfSU9SRU1BUAotCWJvb2wKLQlkZXBlbmRzIG9uIE5VTUEKLQlkZWZhdWx0IG4KLQogZW5kbWVudQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggNmMyODU4Mi4uMzYxZDU0MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTQsOCArNCw4IEBACiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfQU9VVCBpZiBNTVUKIAlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NCBpZiBNTVUKLQlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTIGlmICFNTVUKLQlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVyBpZiAhTU1VCisJc2VsZWN0IEhBVkVfR0VORVJJQ19IQVJESVJRUworCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHIGlmIFJNV19JTlNOUwogCiBjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcuYnVzIGIvYXJjaC9tNjhrL0tjb25maWcuYnVzCmluZGV4IDgyOTRmMGMuLjNhZGI0OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnLmJ1cworKysgYi9hcmNoL202OGsvS2NvbmZpZy5idXMKQEAgLTIsNiArMiwxNSBAQAogCiBjb21tZW50ICJCdXMgU3VwcG9ydCIKIAorY29uZmlnIERJTworCWJvb2wgIkRJTyBidXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhQMzAwCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlICJESU8iIGV4cGFuc2lvbiBidXMgdXNlZCBpbgorCSAgSFAzMDAgbWFjaGluZXMuIElmIHlvdSBhcmUgdXNpbmcgc3VjaCBhIHN5c3RlbSB5b3UgYWxtb3N0IGNlcnRhaW5seQorCSAgd2FudCB0aGlzLgorCiBjb25maWcgTlVCVVMKIAlib29sCiAJZGVwZW5kcyBvbiBNQUMKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnLmRldmljZXMgYi9hcmNoL202OGsvS2NvbmZpZy5kZXZpY2VzCmluZGV4IGQyMTQwMzQuLjYwMzNmNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnLmRldmljZXMKKysrIGIvYXJjaC9tNjhrL0tjb25maWcuZGV2aWNlcwpAQCAtMjQsNiArMjQsMzcgQEAKIAkgIGluY2x1ZGluZyB0aGUgbW9kZWwsIENQVSwgTU1VLCBjbG9jayBzcGVlZCwgQm9nb01JUFMgcmF0aW5nLAogCSAgYW5kIG1lbW9yeSBzaXplLgogCitjb25maWcgTkFURkVBVAorCWJvb2wgIkFSQW55TSBlbXVsYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVRBUkkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEFSQW55TSBuYXRpdmUgZmVhdHVyZXMsIHN1Y2ggYXMKKwkgIGFjY2VzcyB0byBhIGRpc2sgaW1hZ2UgYXMgL2Rldi9oZGEuCisKK2NvbmZpZyBORkJMT0NLCisJdHJpc3RhdGUgIk5hdEZlYXQgYmxvY2sgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCTE9DSyAmJiBOQVRGRUFUCisJaGVscAorCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJBbnlNIE5hdEZlYXQgYmxvY2sgZGV2aWNlCisJICB3aGljaCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgaGFyZCBkcml2ZXMgd2l0aG91dCB1c2luZworCSAgdGhlIGhhcmR3YXJlIGVtdWxhdGlvbi4KKworY29uZmlnIE5GQ09OCisJdHJpc3RhdGUgIk5hdEZlYXQgY29uc29sZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBOQVRGRUFUCisJaGVscAorCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJBbnlNIE5hdEZlYXQgY29uc29sZSBkcml2ZXIKKwkgIHdoaWNoIGFsbG93cyB0aGUgY29uc29sZSBvdXRwdXQgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgc3RkZXJyCisJICBvdXRwdXQgb2YgQVJBbnlNLgorCitjb25maWcgTkZFVEgKKwl0cmlzdGF0ZSAiTmF0RmVhdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gRVRIRVJORVQgJiYgTkFURkVBVAorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSQW55TSBOYXRGZWF0IG5ldHdvcmsgZGV2aWNlCisJICB3aGljaCB3aWxsIGVtdWxhdGUgYSByZWd1bGFyIGV0aGVybmV0IGRldmljZSB3aGlsZSBwcmVzZW50aW5nIGFuCisJICBldGhlcnRhcCBkZXZpY2UgdG8gdGhlIGhvc3Qgc3lzdGVtLgorCiBlbmRtZW51CiAKIG1lbnUgIkNoYXJhY3RlciBkZXZpY2VzIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKaW5kZXggYzViNTIxMi4uNDdiNWY5MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYworKysgYi9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCkBAIC0xLDQzICsxLDE1IEBACiAvKgotICogbGludXgvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYyAtLSBBbWlnYSBMaW51eCBpbnRlcnJ1cHQgaGFuZGxpbmcgY29kZQorICogQW1pZ2EgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogMTEvMDcvOTY6IHJld3JpdHRlbiBpbnRlcnJ1cHQgaGFuZGxpbmcsIGlycSBsaXN0cyBhcmUgZXhpc3RzIG5vdyBvbmx5IGZvcgotICogICAgICAgICAgIHRoaXMgc291cmNlcyB3aGVyZSBpdCBtYWtlcyBzZW5zZSAoVkVSVEIvUE9SVFMvRVhURVIpIGFuZCB5b3UgbXVzdAotICogICAgICAgICAgIGJlIGNhcmVmdWwgdGhhdCBkZXZfaWQgZm9yIHRoaXMgc291cmNlcyBpcyB1bmlxdWUgc2luY2UgdGhpcyB0aGUKLSAqICAgICAgICAgICBvbmx5IHBvc3NpYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGhhbmRsZXJzIGZvcgotICogICAgICAgICAgIGZyZWVfaXJxLiBpcnEgbGlzdHMgYWxzbyBoYXZlIGRpZmZlcmVudCBpcnEgZmxhZ3M6Ci0gKiAgICAgICAgICAgLSBJUlFfRkxHX0ZBU1Q6IGhhbmRsZXIgaXMgaW5zZXJ0ZWQgYXQgdG9wIG9mIGxpc3QgKGFmdGVyIG90aGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3QgaGFuZGxlcnMpCi0gKiAgICAgICAgICAgLSBJUlFfRkxHX1NMT1c6IGhhbmRsZXIgaXMgaW5zZXJ0ZWQgYXQgYm90dG9tIG9mIGxpc3QgYW5kIGJlZm9yZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV5J3JlIGV4ZWN1dGVkIGlycSBsZXZlbCBpcyBzZXQgdG8gdGhlIHByZXZpb3VzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSwgYnV0IGhhbmRsZXJzIGRvbid0IG5lZWQgdG8gYmUgcmVlbnRyYW50LCBpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICByZWVudHJhbmNlIG9jY3VycmVkLCBzbG93IGhhbmRsZXJzIHdpbGwgYmUganVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgYWdhaW4uCi0gKiAgICAgICAgICAgVGhlIHdob2xlIGludGVycnVwdCBoYW5kbGluZyBmb3IgQ0lBcyBpcyBtb3ZlZCB0byBjaWEuYwotICogICAgICAgICAgIC9Sb21hbiBaaXBwZWwKLSAqCi0gKiAwNy8wOC85OTogcmV3YW1wIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgLSB3ZSBub3cgaGF2ZSB0d28gdHlwZXMgb2YKLSAqICAgICAgICAgICBpbnRlcnJ1cHRzLCBub3JtYWwgYW5kIGZhc3QgaGFuZGxlcnMsIGZhc3QgaGFuZGxlcnMgYmVpbmcKLSAqICAgICAgICAgICBtYXJrZWQgd2l0aCBJUlFGX0RJU0FCTEVEIGFuZCBydW5zIHdpdGggYWxsIG90aGVyIGludGVycnVwdHMKLSAqICAgICAgICAgICBkaXNhYmxlZC4gTm9ybWFsIGludGVycnVwdHMgZGlzYWJsZSB0aGVpciBvd24gc291cmNlIGJ1dAotICogICAgICAgICAgIHJ1biB3aXRoIGFsbCBvdGhlciBpbnRlcnJ1cHQgc291cmNlcyBlbmFibGVkLgotICogICAgICAgICAgIFBPUlRTIGFuZCBFWFRFUiBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgc2hhcmVkIGV2ZW4gaWYgdGhlCi0gKiAgICAgICAgICAgZHJpdmVycyBkbyBub3QgZXhwbGljaXRseSBtYXJrIHRoaXMgd2hlbiBjYWxsaW5nCi0gKiAgICAgICAgICAgcmVxdWVzdF9pcnEgd2hpY2ggdGhleSByZWFsbHkgc2hvdWxkIGRvLgotICogICAgICAgICAgIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgd2F5IGludGVycnVwdHMgYXJlIGhhbmRsZWQgb24gYWxsCi0gKiAgICAgICAgICAgb3RoZXIgYXJjaGl0ZWN0dXJlcyBhbmQgbWFrZXMgYSB0b24gb2Ygc2Vuc2UgYmVzaWRlcwotICogICAgICAgICAgIGhhdmluZyB0aGUgYWR2YW50YWdlIG9mIG1ha2luZyBpdCBlYXNpZXIgdG8gc2hhcmUKLSAqICAgICAgICAgICBkcml2ZXJzLgotICogICAgICAgICAgIC9KZXMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CkBAIC00NSwyMCArMTcsMTI4IEBACiAjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgogI2luY2x1ZGUgPGFzbS9hbWlwY21jaWEuaD4KIAotc3RhdGljIHZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGFtaWdhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQxKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDMoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQ1KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgYW1pZ2FfaXJxX2NvbnRyb2xsZXIgPSB7CisvKgorICogRW5hYmxlL2Rpc2FibGUgYSBwYXJ0aWN1bGFyIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KKyAqIE5vdGUgdGhhdCB0aGlzIG1heSBhZmZlY3Qgb3RoZXIgaW50ZXJydXB0cyBpbiBjYXNlIG9mIGEgc2hhcmVkIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhIF92ZXJ5XyBzaG9ydCB0aW1lIHRvIGNoYW5nZSBzb21lCisgKiBpbnRlcm5hbCBkYXRhLCB0aGF0IG1heSBub3QgYmUgY2hhbmdlZCBieSB0aGUgaW50ZXJydXB0IGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKworc3RhdGljIHZvaWQgYW1pZ2FfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8ICgxIDw8IChkYXRhLT5pcnEgLSBJUlFfVVNFUikpOworfQorCitzdGF0aWMgdm9pZCBhbWlnYV9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJYW1pZ2FfY3VzdG9tLmludGVuYSA9IDEgPDwgKGRhdGEtPmlycSAtIElSUV9VU0VSKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhbWlnYV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiYW1pZ2EiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGFtaWdhX2lycV9jb250cm9sbGVyLmxvY2spLAotCS5lbmFibGUJCT0gYW1pZ2FfZW5hYmxlX2lycSwKLQkuZGlzYWJsZQk9IGFtaWdhX2Rpc2FibGVfaXJxLAorCS5pcnFfZW5hYmxlCT0gYW1pZ2FfaXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJPSBhbWlnYV9pcnFfZGlzYWJsZSwKIH07CiAKKworLyoKKyAqIFRoZSBidWlsdGluIEFtaWdhIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVycy4KKyAqLworCitzdGF0aWMgdm9pZCBhbWlfaW50MSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CisKKwkvKiBpZiBzZXJpYWwgdHJhbnNtaXQgYnVmZmVyIGVtcHR5LCBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50cyAmIElGX1RCRSkgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfVEJFOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX1RCRSk7CisJfQorCisJLyogaWYgZmxvcHB5IGRpc2sgdHJhbnNmZXIgY29tcGxldGUsIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfRFNLQkxLKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfRFNLQkxLKTsKKwl9CisKKwkvKiBpZiBzb2Z0d2FyZSBpbnRlcnJ1cHQgc2V0LCBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50cyAmIElGX1NPRlQpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NPRlQ7CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfU09GVCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbWlfaW50Myh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CisKKwkvKiBpZiBhIGJsaXR0ZXIgaW50ZXJydXB0ICovCisJaWYgKGludHMgJiBJRl9CTElUKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9CTElUOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0JMSVQpOworCX0KKworCS8qIGlmIGEgY29wcGVyIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfQ09QRVIpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0NPUEVSOworCQlnZW5lcmljX2hhbmRsZV9pcnEoSVJRX0FNSUdBX0NPUFBFUik7CisJfQorCisJLyogaWYgYSB2ZXJ0aWNhbCBibGFuayBpbnRlcnJ1cHQgKi8KKwlpZiAoaW50cyAmIElGX1ZFUlRCKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9WRVJUQjsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9WRVJUQik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbWlfaW50NCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7CisKKwkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfQVVEMCkgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMDsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9BVUQwKTsKKwl9CisKKwkvKiBpZiBhdWRpbyAxIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfQVVEMSkgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9BVUQxKTsKKwl9CisKKwkvKiBpZiBhdWRpbyAyIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfQVVEMikgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMjsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9BVUQyKTsKKwl9CisKKwkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfQVVEMykgeworCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMzsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9BVUQzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtaV9pbnQ1KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKKworCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfUkJGKSB7CisJCS8qIGFja25vd2xlZGdlIG9mIElGX1JCRiBtdXN0IGJlIGRvbmUgYnkgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgKi8KKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9BTUlHQV9SQkYpOworCX0KKworCS8qIGlmIGEgZGlzayBzeW5jIGludGVycnVwdCAqLworCWlmIChpbnRzICYgSUZfRFNLU1lOKSB7CisJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47CisJCWdlbmVyaWNfaGFuZGxlX2lycShJUlFfQU1JR0FfRFNLU1lOKTsKKwl9Cit9CisKKwogLyoKICAqIHZvaWQgYW1pZ2FfaW5pdF9JUlEodm9pZCkKICAqCkBAIC03MiwxNiArMTUyLDEzIEBACiAKIHZvaWQgX19pbml0IGFtaWdhX2luaXRfSVJRKHZvaWQpCiB7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIGFtaV9pbnQxLCAwLCAiaW50MSIsIE5VTEwpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGludCVkXG4iLCAxKTsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgYW1pX2ludDMsIDAsICJpbnQzIiwgTlVMTCkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgaW50JWRcbiIsIDMpOwotCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT180LCBhbWlfaW50NCwgMCwgImludDQiLCBOVUxMKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBpbnQlZFxuIiwgNCk7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIGFtaV9pbnQ1LCAwLCAiaW50NSIsIE5VTEwpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGludCVkXG4iLCA1KTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhbWlnYV9pcnFfY2hpcCwgaGFuZGxlX3NpbXBsZV9pcnEsIElSUV9VU0VSLAorCQkJCSAgQU1JX1NURF9JUlFTKTsKIAotCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmFtaWdhX2lycV9jb250cm9sbGVyLCBJUlFfVVNFUiwgQU1JX1NURF9JUlFTKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18xLCBhbWlfaW50MSk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fMywgYW1pX2ludDMpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzQsIGFtaV9pbnQ0KTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT181LCBhbWlfaW50NSk7CiAKIAkvKiB0dXJuIG9mZiBQQ01DSUEgaW50ZXJydXB0cyAqLwogCWlmIChBTUlHQUhXX1BSRVNFTlQoUENNQ0lBKSkKQEAgLTk1LDEyMCArMTcyLDMgQEAKIAljaWFfaW5pdF9JUlEoJmNpYWFfYmFzZSk7CiAJY2lhX2luaXRfSVJRKCZjaWFiX2Jhc2UpOwogfQotCi0vKgotICogRW5hYmxlL2Rpc2FibGUgYSBwYXJ0aWN1bGFyIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqIE5vdGUgdGhhdCB0aGlzIG1heSBhZmZlY3Qgb3RoZXIgaW50ZXJydXB0cyBpbiBjYXNlIG9mIGEgc2hhcmVkIGludGVycnVwdC4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhIF92ZXJ5XyBzaG9ydCB0aW1lIHRvIGNoYW5nZSBzb21lCi0gKiBpbnRlcm5hbCBkYXRhLCB0aGF0IG1heSBub3QgYmUgY2hhbmdlZCBieSB0aGUgaW50ZXJydXB0IGF0IHRoZSBzYW1lIHRpbWUuCi0gKi8KLQotc3RhdGljIHZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCAoMSA8PCAoaXJxIC0gSVJRX1VTRVIpKTsKLX0KLQotc3RhdGljIHZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gMSA8PCAoaXJxIC0gSVJRX1VTRVIpOwotfQotCi0vKgotICogVGhlIGJ1aWx0aW4gQW1pZ2EgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXJzLgotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50MShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQgaW50cyA9IGFtaWdhX2N1c3RvbS5pbnRyZXFyICYgYW1pZ2FfY3VzdG9tLmludGVuYXI7Ci0KLQkvKiBpZiBzZXJpYWwgdHJhbnNtaXQgYnVmZmVyIGVtcHR5LCBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX1RCRSkgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfVEJFOwotCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1RCRSk7Ci0JfQotCi0JLyogaWYgZmxvcHB5IGRpc2sgdHJhbnNmZXIgY29tcGxldGUsIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfRFNLQkxLKSB7Ci0JCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tCTEs7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfRFNLQkxLKTsKLQl9Ci0KLQkvKiBpZiBzb2Z0d2FyZSBpbnRlcnJ1cHQgc2V0LCBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX1NPRlQpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NPRlQ7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfU09GVCk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQzKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKLQotCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0JMSVQpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQkxJVCk7Ci0JfQotCi0JLyogaWYgYSBjb3BwZXIgaW50ZXJydXB0ICovCi0JaWYgKGludHMgJiBJRl9DT1BFUikgewotCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQ09QRVI7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQ09QUEVSKTsKLQl9Ci0KLQkvKiBpZiBhIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfVkVSVEIpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1ZFUlRCOwotCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1ZFUlRCKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIHNob3J0IGludHMgPSBhbWlnYV9jdXN0b20uaW50cmVxciAmIGFtaWdhX2N1c3RvbS5pbnRlbmFyOwotCi0JLyogaWYgYXVkaW8gMCBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0FVRDApIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDA7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMCk7Ci0JfQotCi0JLyogaWYgYXVkaW8gMSBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0FVRDEpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDE7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMSk7Ci0JfQotCi0JLyogaWYgYXVkaW8gMiBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0FVRDIpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDI7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMik7Ci0JfQotCi0JLyogaWYgYXVkaW8gMyBpbnRlcnJ1cHQgKi8KLQlpZiAoaW50cyAmIElGX0FVRDMpIHsKLQkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDM7Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMyk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQ1KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnRzID0gYW1pZ2FfY3VzdG9tLmludHJlcXIgJiBhbWlnYV9jdXN0b20uaW50ZW5hcjsKLQotCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfUkJGKSB7Ci0JCS8qIGFja25vd2xlZGdlIG9mIElGX1JCRiBtdXN0IGJlIGRvbmUgYnkgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgKi8KLQkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9SQkYpOwotCX0KLQotCS8qIGlmIGEgZGlzayBzeW5jIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfRFNLU1lOKSB7Ci0JCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9EU0tTWU47Ci0JCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfRFNLU1lOKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jIGIvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCmluZGV4IGVjZDBmN2MuLjE4YzBlMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jaWEuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKQEAgLTkzLDEzICs5MywxNCBAQAogCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBiYXNlLT5pbnRfbWFzazsKIAlmb3IgKDsgaW50czsgbWFjaF9pcnErKywgaW50cyA+Pj0gMSkgewogCQlpZiAoaW50cyAmIDEpCi0JCQltNjhrX2hhbmRsZV9pbnQobWFjaF9pcnEpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKG1hY2hfaXJxKTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBjaWFfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgY2lhX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CiAJdW5zaWduZWQgY2hhciBtYXNrOwogCiAJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikgewpAQCAtMTEzLDE5ICsxMTQsMjAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNpYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgY2lhX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZGF0YS0+aXJxOworCiAJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikKIAkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFCKSk7CiAJZWxzZQogCQljaWFfYWJsZV9pcnEoJmNpYWFfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUEpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBjaWFfaXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNpYV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAiY2lhIiwKLQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChjaWFfaXJxX2NvbnRyb2xsZXIubG9jayksCi0JLmVuYWJsZQkJPSBjaWFfZW5hYmxlX2lycSwKLQkuZGlzYWJsZQk9IGNpYV9kaXNhYmxlX2lycSwKKwkuaXJxX2VuYWJsZQk9IGNpYV9pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IGNpYV9pcnFfZGlzYWJsZSwKIH07CiAKIC8qCkBAIC0xMzQsOSArMTM2LDkgQEAKICAqIGludG8gdGhpcyBjaGFpbi4KICAqLwogCi1zdGF0aWMgdm9pZCBhdXRvX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGF1dG9faXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3dpdGNoIChpcnEpIHsKKwlzd2l0Y2ggKGRhdGEtPmlycSkgewogCWNhc2UgSVJRX0FVVE9fMjoKIAkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1BPUlRTOwogCQlicmVhazsKQEAgLTE0Niw5ICsxNDgsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXV0b19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYXV0b19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3dpdGNoIChpcnEpIHsKKwlzd2l0Y2ggKGRhdGEtPmlycSkgewogCWNhc2UgSVJRX0FVVE9fMjoKIAkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1BPUlRTOwogCQlicmVhazsKQEAgLTE1OCwyNCArMTYwLDI1IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGF1dG9faXJxX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGF1dG9faXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gImF1dG8iLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGF1dG9faXJxX2NvbnRyb2xsZXIubG9jayksCi0JLmVuYWJsZQkJPSBhdXRvX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUJPSBhdXRvX2Rpc2FibGVfaXJxLAorCS5pcnFfZW5hYmxlCT0gYXV0b19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IGF1dG9faXJxX2Rpc2FibGUsCiB9OwogCiB2b2lkIF9faW5pdCBjaWFfaW5pdF9JUlEoc3RydWN0IGNpYWJhc2UgKmJhc2UpCiB7Ci0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmY2lhX2lycV9jb250cm9sbGVyLCBiYXNlLT5jaWFfaXJxLCBDSUFfSVJRUyk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmY2lhX2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSwKKwkJCQkgIGJhc2UtPmNpYV9pcnEsIENJQV9JUlFTKTsKIAogCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBhbmQgdHVybiBvZmYgYWxsIGludGVycnVwdHMgKi8KIAljaWFfc2V0X2lycShiYXNlLCBDSUFfSUNSX0FMTCk7CiAJY2lhX2FibGVfaXJxKGJhc2UsIENJQV9JQ1JfQUxMKTsKIAogCS8qIG92ZXJyaWRlIGF1dG8gaW50IGFuZCBpbnN0YWxsIENJQSBoYW5kbGVyICovCi0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXV0b19pcnFfY29udHJvbGxlciwgYmFzZS0+aGFuZGxlcl9pcnEsIDEpOwotCW02OGtfaXJxX3N0YXJ0dXAoYmFzZS0+aGFuZGxlcl9pcnEpOworCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmF1dG9faXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxLAorCQkJCSAgYmFzZS0+aGFuZGxlcl9pcnEsIDEpOworCW02OGtfaXJxX3N0YXJ0dXBfaXJxKGJhc2UtPmhhbmRsZXJfaXJxKTsKIAlpZiAocmVxdWVzdF9pcnEoYmFzZS0+aGFuZGxlcl9pcnEsIGNpYV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCWJhc2UtPm5hbWUsIGJhc2UpKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgYmFzZS0+bmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXBvbGxvL2RuX2ludHMuYyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCmluZGV4IDVkNDdmM2EuLjE3YmUxZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCisrKyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCkBAIC0xLDE5ICsxLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2Fwb2xsb2h3Lmg+CiAKLXZvaWQgZG5fcHJvY2Vzc19pbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQordW5zaWduZWQgaW50IGFwb2xsb19pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0JX19tNjhrX2hhbmRsZV9pbnQoaXJxLCBmcCk7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKIAotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKT0weDIwOwotCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKT0weDIwOwotfQotCi1pbnQgYXBvbGxvX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17CiAJaWYgKGlycSA8IDgpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKzEpICY9IH4oMSA8PCBpcnEpOwogCWVsc2UKQEAgLTIxLDI0ICsxNSwzMyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGFwb2xsb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3ZvaWQgYXBvbGxvX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCWlmIChpcnEgPCA4KQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocGljYSsxKSB8PSAoMSA8PCBpcnEpOwogCWVsc2UKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IrMSkgfD0gKDEgPDwgKGlycSAtIDgpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhcG9sbG9faXJxX2NvbnRyb2xsZXIgPSB7Cit2b2lkIGFwb2xsb19pcnFfZW9pKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocGljYSkgPSAweDIwOworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKSA9IDB4MjA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXBvbGxvX2lycV9jaGlwID0gewogCS5uYW1lICAgICAgICAgICA9ICJhcG9sbG8iLAotCS5sb2NrICAgICAgICAgICA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGFwb2xsb19pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cCAgICAgICAgPSBhcG9sbG9faXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duICAgICAgID0gYXBvbGxvX2lycV9zaHV0ZG93biwKKwkuaXJxX3N0YXJ0dXAgICAgPSBhcG9sbG9faXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93biAgID0gYXBvbGxvX2lycV9zaHV0ZG93biwKKwkuaXJxX2VvaQk9IGFwb2xsb19pcnFfZW9pLAogfTsKIAogCiB2b2lkIF9faW5pdCBkbl9pbml0X0lSUSh2b2lkKQogewotCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIgKyA5NiwgMTYsIGRuX3Byb2Nlc3NfaW50KTsKLQltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhcG9sbG9faXJxX2NvbnRyb2xsZXIsIElSUV9BUE9MTE8sIDE2KTsKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSICsgOTYsIDE2KTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhcG9sbG9faXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSwKKwkJCQkgIElSUV9BUE9MTE8sIDE2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMgYi9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCmluZGV4IDI2YTgwNGUuLjZkMTk2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwpAQCAtNjAsMjQ0ICs2MCw4IEBACiAgKiA8YXNtL2F0YXJpaW50cy5oPik6IEF1dG92ZWN0b3IgaW50ZXJydXB0cyBhcmUgMS4uNywgdGhlbiBmb2xsb3cgU1QtTUZQLAogICogVFQtTUZQLCBTQ0MsIGFuZCBmaW5hbGx5IFZNRSBpbnRlcnJ1cHRzLiBWZWN0b3IgbnVtYmVycyBmb3IgdGhlIGxhdHRlciBjYW4KICAqIGJlIGFsbG9jYXRlZCBieSBhdGFyaV9yZWdpc3Rlcl92bWVfaW50KCkuCi0gKgotICogRWFjaCBpbnRlcnJ1cHQgY2FuIGJlIG9mIHRocmVlIHR5cGVzOgotICoKLSAqICAtIFNMT1c6IFRoZSBoYW5kbGVyIHJ1bnMgd2l0aCBhbGwgaW50ZXJydXB0cyBlbmFibGVkLCBleGNlcHQgdGhlIG9uZSBpdAotICogICAgd2FzIGNhbGxlZCBieSAodG8gYXZvaWQgcmVlbnRlcmluZykuIFRoaXMgc2hvdWxkIGJlIHRoZSB1c3VhbCBtZXRob2QuCi0gKiAgICBCdXQgaXQgaXMgY3VycmVudGx5IHBvc3NpYmxlIG9ubHkgZm9yIE1GUCBpbnRzLCBzaW5jZSBvbmx5IHRoZSBNRlAKLSAqICAgIG9mZmVycyBhbiBlYXN5IHdheSB0byBtYXNrIGludGVycnVwdHMuCi0gKgotICogIC0gRkFTVDogVGhlIGhhbmRsZXIgcnVucyB3aXRoIGFsbCBpbnRlcnJ1cHRzIGRpc2FibGVkLiBUaGlzIHNob3VsZCBiZSB1c2VkCi0gKiAgICBvbmx5IGZvciByZWFsbHkgZmFzdCBoYW5kbGVycywgdGhhdCBqdXN0IGRvIGFjdGlvbnMgaW1tZWRpYXRlbHkKLSAqICAgIG5lY2Vzc2FyeSwgYW5kIGxldCB0aGUgcmVzdCBkbyBhIGJvdHRvbSBoYWxmIG9yIHRhc2sgcXVldWUuCi0gKgotICogIC0gUFJJT1JJVElaRUQ6IFRoZSBoYW5kbGVyIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBoaWdoZXItbGV2ZWwgaW50cwotICogICAgKGdyZWF0ZXIgSVBMLCBubyBNRlAgcHJpb3JpdGllcyEpLiBUaGlzIGlzIHRoZSBtZXRob2Qgb2YgY2hvaWNlIGZvciBpbnRzCi0gKiAgICB3aGljaCBzaG91bGQgYmUgc2xvdywgYnV0IGFyZSBub3QgZnJvbSBhIE1GUC4KLSAqCi0gKiBUaGUgZmVhdHVyZSBvZiBtb3JlIHRoYW4gb25lIGhhbmRsZXIgZm9yIG9uZSBpbnQgc291cmNlIGlzIHN0aWxsIHRoZXJlLCBidXQKLSAqIG9ubHkgYXBwbGljYWJsZSBpZiBhbGwgaGFuZGVycyBhcmUgb2YgdGhlIHNhbWUgdHlwZS4gVG8gbm90IHNsb3cgZG93bgotICogcHJvY2Vzc2luZyBvZiBpbnRzIHdpdGggb25seSBvbmUgaGFuZGxlciBieSB0aGUgY2hhaW5pbmcgZmVhdHVyZSwgdGhlIGxpc3QKLSAqIGNhbGxpbmcgZnVuY3Rpb24gYXRhcmlfY2FsbF9pcnFfbGlzdCgpIGlzIG9ubHkgcGx1Z2dlZCBpbiBhdCB0aGUgdGltZSB0aGUKLSAqIHNlY29uZCBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQuCi0gKgotICogSW1wbGVtZW50YXRpb24gbm90ZXM6IEZvciBmYXN0LWFzLXBvc3NpYmxlIGludCBoYW5kbGluZywgdGhlcmUgYXJlIHNlcGFyYXRlCi0gKiBlbnRyeSBwb2ludHMgZm9yIGVhY2ggdHlwZSAoc2xvdy9mYXN0L3ByaW8pLiBUaGUgYXNzZW1ibGVyIGhhbmRsZXIgY2FsbHMKLSAqIHRoZSBpcnEgZGlyZWN0bHkgaW4gdGhlIHVzdWFsIGNhc2UsIG5vIEMgd3JhcHBlciBpcyBpbnZvbHZlZC4gSW4gY2FzZSBvZgotICogbXVsdGlwbGUgaGFuZGxlcnMsIGF0YXJpX2NhbGxfaXJxX2xpc3QoKSBpcyByZWdpc3RlcmVkIGFzIGhhbmRsZXIgYW5kIGNhbGxzCi0gKiBpbiB0dXJuIHRoZSByZWFsIGlycSdzLiBUbyBlYXNlIGFjY2VzcyBmcm9tIGFzc2VtYmxlciBsZXZlbCB0byB0aGUgaXJxCi0gKiBmdW5jdGlvbiBwb2ludGVyIGFuZCBhY2NvbXBhbnlpbmcgZGF0YSwgdGhlc2UgdHdvIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZQotICogYXJyYXksIGlycV9oYW5kbGVyW10uIFRoZSByZXN0IG9mIGRhdGEgKHR5cGUsIG5hbWUpIGFyZSBwdXQgaW50byBhIHNlY29uZAotICogYXJyYXksIGlycV9wYXJhbSwgdGhhdCBpcyBhY2Nlc3NlZCBmcm9tIEMgb25seS4gRm9yIGVhY2ggc2xvdyBpbnRlcnJ1cHQgKDMyCi0gKiBpbiBhbGwpIHRoZXJlIGFyZSBzZXBhcmF0ZSBoYW5kbGVyIGZ1bmN0aW9ucywgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8KLSAqIGhhcmQtY29kZSB0aGUgTUZQIHJlZ2lzdGVyIGFkZHJlc3MgYW5kIHZhbHVlLCBhcmUgbmVjZXNzYXJ5IHRvIG1hc2sgdGhlCi0gKiBpbnQuIElmIHRoZXJlJ2QgYmUgb25seSBvbmUgZ2VuZXJpYyBmdW5jdGlvbiwgbG90cyBvZiBjYWxjdWxhdGlvbnMgd291bGQgYmUKLSAqIG5lZWRlZCB0byBkZXRlcm1pbmUgTUZQIHJlZ2lzdGVyIGFuZCBpbnQgbWFzayBmcm9tIHRoZSB2ZWN0b3IgbnVtYmVyIDotKAotICoKLSAqIEZ1cnRoZXJtb3JlLCBzbG93IGludHMgbWF5IG5vdCBsb3dlciB0aGUgSVBMIGJlbG93IGl0cyBwcmV2aW91cyB2YWx1ZQotICogKGJlZm9yZSB0aGUgaW50IGhhcHBlbmVkKS4gVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBhbiBpbnQgb2YgY2xhc3MgUFJJTywgb24KLSAqIHRoYXQgdGhpcyBpbnQgbWF5IGJlIHN0YWNrZWQsIGNhbm5vdCBiZSByZWVudGVyZWQuIFRoaXMgZmVhdHVyZSBpcwotICogaW1wbGVtZW50ZWQgYXMgZm9sbG93czogSWYgdGhlIHN0YWNrIGZyYW1lIGZvcm1hdCBpcyAxICh0aHJvd2F3YXkpLCB0aGUgaW50Ci0gKiBpcyBub3Qgc3RhY2tlZCwgYW5kIHRoZSBJUEwgaXMgYW5kZWQgd2l0aCAweGZiZmYsIHJlc3VsdGluZyBpbiBhIG5ldyBsZXZlbAotICogMiwgd2hpY2ggc3RpbGwgYmxvY2tzIHRoZSBIU1lOQywgYnV0IG5vIGludGVycnVwdHMgb2YgaW50ZXJlc3QuIElmIHRoZQotICogZnJhbWUgZm9ybWF0IGlzIDAsIHRoZSBpbnQgaXMgbmVzdGVkLCBhbmQgdGhlIG9sZCBJUEwgdmFsdWUgY2FuIGJlIGZvdW5kIGluCi0gKiB0aGUgc3IgY29weSBpbiB0aGUgZnJhbWUuCiAgKi8KIAotI2lmIDAKLQotI2RlZmluZQlOVU1fSU5UX1NPVVJDRVMJKDggKyBOVU1fQVRBUklfU09VUkNFUykKLQotdHlwZWRlZiB2b2lkICgqYXNtX2lycV9oYW5kbGVyKSh2b2lkKTsKLQotc3RydWN0IGlycWhhbmRsZXIgewotCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXZvaWQJKmRldl9pZDsKLX07Ci0KLXN0cnVjdCBpcnFwYXJhbSB7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQljb25zdCBjaGFyCSpkZXZuYW1lOwotfTsKLQotLyoKLSAqIEFycmF5IHdpdGggaXJxJ3MgYW5kIHRoZWlyIHBhcmFtZXRlciBkYXRhLiBUaGlzIGFycmF5IGlzIGFjY2Vzc2VkIGZyb20gbG93Ci0gKiBsZXZlbCBhc3NlbWJsZXIgY29kZSwgc28gYW4gZWxlbWVudCBzaXplIG9mIDggYWxsb3dzIHVzYWdlIG9mIGluZGV4IHNjYWxpbmcKLSAqIGFkZHJlc3NpbmcgbW9kZS4KLSAqLwotc3RhdGljIHN0cnVjdCBpcnFoYW5kbGVyIGlycV9oYW5kbGVyW05VTV9JTlRfU09VUkNFU107Ci0KLS8qCi0gKiBUaGlzIGFycmF5IGhvbGQgdGhlIHJlc3Qgb2YgcGFyYW1ldGVycyBvZiBpbnQgaGFuZGxlcnM6IHR5cGUKLSAqIChzbG93LGZhc3QscHJpbykgYW5kIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGVzZSB2YWx1ZXMgYXJlIG9ubHkKLSAqIGFjY2Vzc2VkIGZyb20gQwotICovCi1zdGF0aWMgc3RydWN0IGlycXBhcmFtIGlycV9wYXJhbVtOVU1fSU5UX1NPVVJDRVNdOwotCi0vKiBjaGVjayBmb3IgdmFsaWQgaW50IG51bWJlciAoY29tcGxleCwgc2lnaC4uLikgKi8KLSNkZWZpbmUJSVNfVkFMSURfSU5UTk8obikJCQkJCQkJCQkJCVwKLQkoKG4pID4gMCAmJgkJCQkJCQkJCQkJCQkJXAotCSAvKiBhdXRvdmVjIGFuZCBTVC1NRlAgb2sgYW55d2F5ICovCQkJCQkJCQlcCi0JICgoKG4pIDwgVFRNRlBfU09VUkNFX0JBU0UpIHx8CQkJCQkJCQkJXAotCSAgLyogVFQtTUZQIG9rIGlmIHByZXNlbnQgKi8JCQkJCQkJCQlcCi0JICAoKG4pID49IFRUTUZQX1NPVVJDRV9CQVNFICYmIChuKSA8IFNDQ19TT1VSQ0VfQkFTRSAmJgkJCVwKLQkgICBBVEFSSUhXX1BSRVNFTlQoVFRfTUZQKSkgfHwJCQkJCQkJCQlcCi0JICAvKiBTQ0Mgb2sgaWYgcHJlc2VudCBhbmQgbnVtYmVyIGV2ZW4gKi8JCQkJCQlcCi0JICAoKG4pID49IFNDQ19TT1VSQ0VfQkFTRSAmJiAobikgPCBWTUVfU09VUkNFX0JBU0UgJiYJCQlcCi0JICAgISgobikgJiAxKSAmJiBBVEFSSUhXX1BSRVNFTlQoU0NDKSkgfHwJCQkJCQlcCi0JICAvKiBncmVhdGVyIG51bWJlcnMgb2sgaWYgdGhleSBhcmUgcmVnaXN0ZXJlZCBWTUUgdmVjdG9ycyAqLwkJXAotCSAgKChuKSA+PSBWTUVfU09VUkNFX0JBU0UgJiYgKG4pIDwgVk1FX1NPVVJDRV9CQVNFICsgVk1FX01BWF9TT1VSQ0VTICYmIFwKLQkJICBmcmVlX3ZtZV92ZWNfYml0bWFwICYgKDEgPDwgKChuKSAtIFZNRV9TT1VSQ0VfQkFTRSkpKSkpCi0KLQotLyoKLSAqIEhlcmUgc3RhcnQgdGhlIGFzc2VtYmxlciBlbnRyeSBwb2ludHMgZm9yIGludGVycnVwdHMKLSAqLwotCi0jZGVmaW5lIElSUV9OQU1FKG5yKSBhdGFyaV9zbG93X2lycV8jI25yIyNfaGFuZGxlcih2b2lkKQotCi0jZGVmaW5lCUJVSUxEX1NMT1dfSVJRKG4pCQkJCQkJICAgXAotYXNtbGlua2FnZSB2b2lkIElSUV9OQU1FKG4pOwkJCQkJCSAgIFwKLS8qIER1bW15IGZ1bmN0aW9uIHRvIGFsbG93IGFzbSB3aXRoIG9wZXJhbmRzLiAgKi8JCQkgICBcCi12b2lkIGF0YXJpX3Nsb3dfaXJxXyMjbiMjX2R1bW15ICh2b2lkKSB7CQkJCSAgIFwKLV9fYXNtX18gKF9fQUxJR05fU1RSICJcbiIJCQkJCQkgICBcCi0iYXRhcmlfc2xvd19pcnFfIiAjbiAiX2hhbmRsZXI6XHQiCQkJCQkgICBcCi0iCWFkZGwJJTYsJTVcbiIJLyogcHJlZW1wdF9jb3VudCgpICs9IEhBUkRJUlFfT0ZGU0VUICovCSAgIFwKLQlTQVZFX0FMTF9JTlQgIlxuIgkJCQkJCSAgIFwKLQlHRVRfQ1VSUkVOVCglJWQwKSAiXG4iCQkJCQkJICAgXAotIglhbmRiCSN+KDE8PCglYzMmNykpLCVhNDp3XG4iCS8qIG1hc2sgdGhpcyBpbnRlcnJ1cHQgKi8JICAgXAotCS8qIGdldCBvbGQgSVBMIGZyb20gc3RhY2sgZnJhbWUgKi8JCQkJICAgXAotIgliZmV4dHUJJSVzcEAoJWMyKXsjNSwjM30sJSVkMFxuIgkJCQkgICBcCi0iCW1vdmV3CSUlc3IsJSVkMVxuIgkJCQkJCSAgIFwKLSIJYmZpbnMJJSVkMCwlJWQxeyMyMSwjM31cbiIJCQkJCSAgIFwKLSIJbW92ZXcJJSVkMSwlJXNyXG4iCQkvKiBzZXQgSVBMID0gcHJldmlvdXMgdmFsdWUgKi8JICAgXAotIglhZGRxbAkjMSwlYTBcbiIJCQkJCQkgICBcCi0iCWxlYQklYTEsJSVhMFxuIgkJCQkJCSAgIFwKLSIJcGVhCSUlc3BAXG4iCQkvKiBwdXNoIGFkZHIgb2YgZnJhbWUgKi8JICAgXAotIgltb3ZlbAklJWEwQCg0KSwlJXNwQC1cbiIJLyogcHVzaCBoYW5kbGVyIGRhdGEgKi8JCSAgIFwKLSIJcGVhCSglYzMrOClcbiIJCS8qIHB1c2ggaW50IG51bWJlciAqLwkJICAgXAotIgltb3ZlbAklJWEwQCwlJWEwXG4iCQkJCQkJICAgXAotIglqYnNyCSUlYTBAXG4iCQkvKiBjYWxsIHRoZSBoYW5kbGVyICovCQkgICBcCi0iCWFkZHFsCSM4LCUlc3BcbiIJCQkJCQkgICBcCi0iCWFkZHFsCSM0LCUlc3BcbiIJCQkJCQkgICBcCi0iCW9ydwkjMHgwNjAwLCUlc3JcbiIJCQkJCQkgICBcCi0iCWFuZHcJIzB4ZmVmZiwlJXNyXG4iCQkvKiBzZXQgSVBMID0gNiBhZ2FpbiAqLwkJICAgXAotIglvcmIJIygxPDwoJWMzJjcpKSwlYTQ6d1xuIgkvKiBub3cgdW5tYXNrIHRoZSBpbnQgYWdhaW4gKi8JICAgXAotIglqYnJhCXJldF9mcm9tX2ludGVycnVwdFxuIgkJCQkJICAgXAotCSA6IDogImkiICgma3N0YXRfY3B1KDApLmlycXNbbis4XSksICJpIiAoJmlycV9oYW5kbGVyW24rOF0pLAkgICBcCi0JICAgICAibiIgKFBUX09GRl9TUiksICJuIiAobiksCQkJCQkgICBcCi0JICAgICAiaSIgKG4gJiA4ID8gKG4gJiAxNiA/ICZ0dF9tZnAuaW50X21rX2EgOiAmc3RfbWZwLmludF9ta19hKSAgIFwKLQkJICAgICAgICA6IChuICYgMTYgPyAmdHRfbWZwLmludF9ta19iIDogJnN0X21mcC5pbnRfbWtfYikpLCBcCi0JICAgICAibSIgKHByZWVtcHRfY291bnQoKSksICJkaSIgKEhBUkRJUlFfT0ZGU0VUKQkJICAgXAotKTsJCQkJCQkJCQkgICBcCi0JZm9yICg7Oyk7CQkJLyogZmFrZSBub3JldHVybiAqLwkJICAgXAotfQotCi1CVUlMRF9TTE9XX0lSUSgwKTsKLUJVSUxEX1NMT1dfSVJRKDEpOwotQlVJTERfU0xPV19JUlEoMik7Ci1CVUlMRF9TTE9XX0lSUSgzKTsKLUJVSUxEX1NMT1dfSVJRKDQpOwotQlVJTERfU0xPV19JUlEoNSk7Ci1CVUlMRF9TTE9XX0lSUSg2KTsKLUJVSUxEX1NMT1dfSVJRKDcpOwotQlVJTERfU0xPV19JUlEoOCk7Ci1CVUlMRF9TTE9XX0lSUSg5KTsKLUJVSUxEX1NMT1dfSVJRKDEwKTsKLUJVSUxEX1NMT1dfSVJRKDExKTsKLUJVSUxEX1NMT1dfSVJRKDEyKTsKLUJVSUxEX1NMT1dfSVJRKDEzKTsKLUJVSUxEX1NMT1dfSVJRKDE0KTsKLUJVSUxEX1NMT1dfSVJRKDE1KTsKLUJVSUxEX1NMT1dfSVJRKDE2KTsKLUJVSUxEX1NMT1dfSVJRKDE3KTsKLUJVSUxEX1NMT1dfSVJRKDE4KTsKLUJVSUxEX1NMT1dfSVJRKDE5KTsKLUJVSUxEX1NMT1dfSVJRKDIwKTsKLUJVSUxEX1NMT1dfSVJRKDIxKTsKLUJVSUxEX1NMT1dfSVJRKDIyKTsKLUJVSUxEX1NMT1dfSVJRKDIzKTsKLUJVSUxEX1NMT1dfSVJRKDI0KTsKLUJVSUxEX1NMT1dfSVJRKDI1KTsKLUJVSUxEX1NMT1dfSVJRKDI2KTsKLUJVSUxEX1NMT1dfSVJRKDI3KTsKLUJVSUxEX1NMT1dfSVJRKDI4KTsKLUJVSUxEX1NMT1dfSVJRKDI5KTsKLUJVSUxEX1NMT1dfSVJRKDMwKTsKLUJVSUxEX1NMT1dfSVJRKDMxKTsKLQotYXNtX2lycV9oYW5kbGVyIHNsb3dfaGFuZGxlcnNbMzJdID0gewotCVswXQk9IGF0YXJpX3Nsb3dfaXJxXzBfaGFuZGxlciwKLQlbMV0JPSBhdGFyaV9zbG93X2lycV8xX2hhbmRsZXIsCi0JWzJdCT0gYXRhcmlfc2xvd19pcnFfMl9oYW5kbGVyLAotCVszXQk9IGF0YXJpX3Nsb3dfaXJxXzNfaGFuZGxlciwKLQlbNF0JPSBhdGFyaV9zbG93X2lycV80X2hhbmRsZXIsCi0JWzVdCT0gYXRhcmlfc2xvd19pcnFfNV9oYW5kbGVyLAotCVs2XQk9IGF0YXJpX3Nsb3dfaXJxXzZfaGFuZGxlciwKLQlbN10JPSBhdGFyaV9zbG93X2lycV83X2hhbmRsZXIsCi0JWzhdCT0gYXRhcmlfc2xvd19pcnFfOF9oYW5kbGVyLAotCVs5XQk9IGF0YXJpX3Nsb3dfaXJxXzlfaGFuZGxlciwKLQlbMTBdCT0gYXRhcmlfc2xvd19pcnFfMTBfaGFuZGxlciwKLQlbMTFdCT0gYXRhcmlfc2xvd19pcnFfMTFfaGFuZGxlciwKLQlbMTJdCT0gYXRhcmlfc2xvd19pcnFfMTJfaGFuZGxlciwKLQlbMTNdCT0gYXRhcmlfc2xvd19pcnFfMTNfaGFuZGxlciwKLQlbMTRdCT0gYXRhcmlfc2xvd19pcnFfMTRfaGFuZGxlciwKLQlbMTVdCT0gYXRhcmlfc2xvd19pcnFfMTVfaGFuZGxlciwKLQlbMTZdCT0gYXRhcmlfc2xvd19pcnFfMTZfaGFuZGxlciwKLQlbMTddCT0gYXRhcmlfc2xvd19pcnFfMTdfaGFuZGxlciwKLQlbMThdCT0gYXRhcmlfc2xvd19pcnFfMThfaGFuZGxlciwKLQlbMTldCT0gYXRhcmlfc2xvd19pcnFfMTlfaGFuZGxlciwKLQlbMjBdCT0gYXRhcmlfc2xvd19pcnFfMjBfaGFuZGxlciwKLQlbMjFdCT0gYXRhcmlfc2xvd19pcnFfMjFfaGFuZGxlciwKLQlbMjJdCT0gYXRhcmlfc2xvd19pcnFfMjJfaGFuZGxlciwKLQlbMjNdCT0gYXRhcmlfc2xvd19pcnFfMjNfaGFuZGxlciwKLQlbMjRdCT0gYXRhcmlfc2xvd19pcnFfMjRfaGFuZGxlciwKLQlbMjVdCT0gYXRhcmlfc2xvd19pcnFfMjVfaGFuZGxlciwKLQlbMjZdCT0gYXRhcmlfc2xvd19pcnFfMjZfaGFuZGxlciwKLQlbMjddCT0gYXRhcmlfc2xvd19pcnFfMjdfaGFuZGxlciwKLQlbMjhdCT0gYXRhcmlfc2xvd19pcnFfMjhfaGFuZGxlciwKLQlbMjldCT0gYXRhcmlfc2xvd19pcnFfMjlfaGFuZGxlciwKLQlbMzBdCT0gYXRhcmlfc2xvd19pcnFfMzBfaGFuZGxlciwKLQlbMzFdCT0gYXRhcmlfc2xvd19pcnFfMzFfaGFuZGxlcgotfTsKLQotYXNtbGlua2FnZSB2b2lkIGF0YXJpX2Zhc3RfaXJxX2hhbmRsZXIoIHZvaWQgKTsKLWFzbWxpbmthZ2Ugdm9pZCBhdGFyaV9wcmlvX2lycV9oYW5kbGVyKCB2b2lkICk7Ci0KLS8qIER1bW15IGZ1bmN0aW9uIHRvIGFsbG93IGFzbSB3aXRoIG9wZXJhbmRzLiAgKi8KLXZvaWQgYXRhcmlfZmFzdF9wcmlvX2lycV9kdW1teSAodm9pZCkgewotX19hc21fXyAoX19BTElHTl9TVFIgIlxuIgotImF0YXJpX2Zhc3RfaXJxX2hhbmRsZXI6XG5cdCIKLQkib3J3CSMweDcwMCwlJXNyXG4iCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0iYXRhcmlfcHJpb19pcnFfaGFuZGxlcjpcblx0IgotCSJhZGRsCSUzLCUyXG5cdCIJCS8qIHByZWVtcHRfY291bnQoKSArPSBIQVJESVJRX09GRlNFVCAqLwotCVNBVkVfQUxMX0lOVCAiXG5cdCIKLQlHRVRfQ1VSUkVOVCglJWQwKSAiXG5cdCIKLQkvKiBnZXQgdmVjdG9yIG51bWJlciBmcm9tIHN0YWNrIGZyYW1lIGFuZCBjb252ZXJ0IHRvIHNvdXJjZSAqLwotCSJiZmV4dHUJJSVzcEAoJWMxKXsjNCwjMTB9LCUlZDBcblx0IgotCSJzdWJ3CSMoMHg0MC04KSwlJWQwXG5cdCIKLQkianBsCTFmXG5cdCIKLQkiYWRkdwkjKDB4NDAtOC0weDE4KSwlJWQwXG4iCi0gICAgIjE6XHRsZWEJJWEwLCUlYTBcblx0IgotCSJhZGRxbAkjMSwlJWEwQCglJWQwOmw6NClcblx0IgotCSJsZWEJaXJxX2hhbmRsZXIsJSVhMFxuXHQiCi0JImxlYQklJWEwQCglJWQwOmw6OCksJSVhMFxuXHQiCi0JInBlYQklJXNwQFxuXHQiCQkvKiBwdXNoIGZyYW1lIGFkZHJlc3MgKi8KLQkibW92ZWwJJSVhMEAoNCksJSVzcEAtXG5cdCIJLyogcHVzaCBoYW5kbGVyIGRhdGEgKi8KLQkibW92ZWwJJSVkMCwlJXNwQC1cblx0IgkvKiBwdXNoIGludCBudW1iZXIgKi8KLQkibW92ZWwJJSVhMEAsJSVhMFxuXHQiCi0JImpzcgklJWEwQFxuXHQiCQkvKiBhbmQgY2FsbCB0aGUgaGFuZGxlciAqLwotCSJhZGRxbAkjOCwlJXNwXG5cdCIKLQkiYWRkcWwJIzQsJSVzcFxuXHQiCi0JImpicmEJcmV0X2Zyb21faW50ZXJydXB0IgotCSA6IDogImkiICgma3N0YXRfY3B1KDApLmlycXMpLCAibiIgKFBUX09GRl9GT1JNQVRWRUMpLAotCSAgICAgIm0iIChwcmVlbXB0X2NvdW50KCkpLCAiZGkiIChIQVJESVJRX09GRlNFVCkKLSk7Ci0JZm9yICg7Oyk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIEJpdG1hcCBmb3IgZnJlZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlcnMKICAqIChuZXcgdmVjdG9ycyBzdGFydGluZyBmcm9tIDB4NzAgY2FuIGJlIGFsbG9jYXRlZCBieQpAQCAtMzIwLDMxICs4NCw0NCBAQAogCiBleHRlcm4gaW50IGF0YXJpX1NDQ19yZXNldF9kb25lOwogCi1zdGF0aWMgaW50IGF0YXJpX3N0YXJ0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YXJpX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQltNjhrX2lycV9zdGFydHVwKGlycSk7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKworCW02OGtfaXJxX3N0YXJ0dXAoZGF0YSk7CiAJYXRhcmlfdHVybm9uX2lycShpcnEpOwogCWF0YXJpX2VuYWJsZV9pcnEoaXJxKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXRhcmlfc2h1dGRvd25faXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhdGFyaV9pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkYXRhKQogeworCXVuc2lnbmVkIGludCBpcnEgPSBkYXRhLT5pcnE7CisKIAlhdGFyaV9kaXNhYmxlX2lycShpcnEpOwogCWF0YXJpX3R1cm5vZmZfaXJxKGlycSk7Ci0JbTY4a19pcnFfc2h1dGRvd24oaXJxKTsKKwltNjhrX2lycV9zaHV0ZG93bihkYXRhKTsKIAogCWlmIChpcnEgPT0gSVJRX0FVVE9fNCkKIAkgICAgdmVjdG9yc1tWRUNfSU5UNF0gPSBmYWxjb25faGJsaGFuZGxlcjsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdGFyaV9pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyB2b2lkIGF0YXJpX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWF0YXJpX2VuYWJsZV9pcnEoZGF0YS0+aXJxKTsKK30KKworc3RhdGljIHZvaWQgYXRhcmlfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCWF0YXJpX2Rpc2FibGVfaXJxKGRhdGEtPmlycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXRhcmlfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gImF0YXJpIiwKLQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChhdGFyaV9pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cAk9IGF0YXJpX3N0YXJ0dXBfaXJxLAotCS5zaHV0ZG93bgk9IGF0YXJpX3NodXRkb3duX2lycSwKLQkuZW5hYmxlCQk9IGF0YXJpX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUJPSBhdGFyaV9kaXNhYmxlX2lycSwKKwkuaXJxX3N0YXJ0dXAJPSBhdGFyaV9pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duCT0gYXRhcmlfaXJxX3NodXRkb3duLAorCS5pcnFfZW5hYmxlCT0gYXRhcmlfaXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJPSBhdGFyaV9pcnFfZGlzYWJsZSwKIH07CiAKIC8qCkBAIC0zNjAsOCArMTM3LDkgQEAKIAogdm9pZCBfX2luaXQgYXRhcmlfaW5pdF9JUlEodm9pZCkKIHsKLQltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCBOVU1fQVRBUklfU09VUkNFUyAtIElSUV9VU0VSLCBOVUxMKTsKLQltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhdGFyaV9pcnFfY29udHJvbGxlciwgMSwgTlVNX0FUQVJJX1NPVVJDRVMgLSAxKTsKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCBOVU1fQVRBUklfU09VUkNFUyAtIElSUV9VU0VSKTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhdGFyaV9pcnFfY2hpcCwgaGFuZGxlX3NpbXBsZV9pcnEsIDEsCisJCQkJICBOVU1fQVRBUklfU09VUkNFUyAtIDEpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTUZQKHMpICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMgYi9hcmNoL202OGsvYXRhcmkvdGltZS5jCmluZGV4IGEwNTMxZjMuLmMwY2M2OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYyBiL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYwppbmRleCAxZWRkOTUwLi44MTI4NjQ3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCkBAIC04Niw3ICs4Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBidm1lNjAwMF9pbml0X0lSUSh2b2lkKQogewotCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7CisJbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyKTsKIH0KIAogdm9pZCBfX2luaXQgY29uZmlnX2J2bWU2MDAwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvZW11L25mYmxvY2suYyBiL2FyY2gvbTY4ay9lbXUvbmZibG9jay5jCmluZGV4IDQ4ZTUwZjguLmUzMDExMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9lbXUvbmZibG9jay5jCisrKyBiL2FyY2gvbTY4ay9lbXUvbmZibG9jay5jCkBAIC01OSw3ICs1OSw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiB9OwogCi1zdGF0aWMgaW50IG5maGRfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHZvaWQgbmZoZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IG5maGRfZGV2aWNlICpkZXYgPSBxdWV1ZS0+cXVldWVkYXRhOwogCXN0cnVjdCBiaW9fdmVjICpidmVjOwpAQCAtNzYsNyArNzYsNiBAQAogCQlzZWMgKz0gbGVuOwogCX0KIAliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBuZmhkX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMgYi9hcmNoL202OGsvaHAzMDAvdGltZS5jCmluZGV4IGY2MzEyYzcuLmM4N2ZlNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKKysrIGIvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYwpAQCAtNzAsNyArNzAsNyBAQAogCiAgIGFzbSB2b2xhdGlsZSgiIG1vdnB3ICUwLCUxQCg1KSIgOiA6ICJkIiAoSU5UVkFMKSwgImEiIChDTE9DS0JBU0UpKTsKIAotICBpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgaHAzMDBfdGljaywgSVJRX0ZMR19TVEQsICJ0aW1lciB0aWNrIiwgdmVjdG9yKSkKKyAgaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzYsIGhwMzAwX3RpY2ssIDAsICJ0aW1lciB0aWNrIiwgdmVjdG9yKSkKICAgICBwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHRpbWVyIGludGVycnVwdFxuIik7CiAKICAgb3V0XzgoQ0xPQ0tCQVNFICsgQ0xLQ1IyLCAweDEpOwkJLyogc2VsZWN0IENSMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKaW5kZXggODcwZTUzNC4uZGIzMGVkMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0xOCw2ICsxOCwxMSBAQAogCiAjaWZkZWYgQ09ORklHX01NVQogCitzdGF0aWMgaW5saW5lIHZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlwcl9jcml0KCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOworfQorCiAvKiBlbnRyeS5TIGlzIHNlbnNpdGl2ZSB0byB0aGUgb2Zmc2V0cyBvZiB0aGVzZSBmaWVsZHMgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBpbnQgX19zb2Z0aXJxX3BlbmRpbmc7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggNjllZDBkNzQuLjYxOThkZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTI3LDExICsyNyw2IEBACiAKICNpZmRlZiBDT05GSUdfTU1VCiAKLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX3R5cGVzLmg+Ci0KIC8qCiAgKiBJbnRlcnJ1cHQgc291cmNlIGRlZmluaXRpb25zCiAgKiBHZW5lcmFsIGludGVycnVwdCBzb3VyY2VzIGFyZSB0aGUgbGV2ZWwgMS03LgpAQCAtNTQsMTAgKzQ5LDYgQEAKIAogI2RlZmluZSBJUlFfVVNFUgk4CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2Nhbm9uaWNhbGl6ZSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotc3RydWN0IHB0X3JlZ3M7Ci0KIC8qCiAgKiB2YXJpb3VzIGZsYWdzIGZvciByZXF1ZXN0X2lycSgpIC0gdGhlIEFtaWdhIG5vdyB1c2VzIHRoZSBzdGFuZGFyZAogICogbWVjaGFuaXNtIGxpa2UgYWxsIG90aGVyIGFyY2hpdGVjdHVyZXMgLSBJUlFGX0RJU0FCTEVEIGFuZApAQCAtNzEsNTcgKzYyLDI3IEBACiAjZGVmaW5lIElSUV9GTEdfU1RECSgweDgwMDApCS8qIGludGVybmFsbHkgdXNlZAkJKi8KICNlbmRpZgogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBjaGFpbiB0b2dldGhlciB0aGUgSVNScyBmb3IgYSBwYXJ0aWN1bGFyCi0gKiBpbnRlcnJ1cHQgc291cmNlIChpZiBpdCBzdXBwb3J0cyBjaGFpbmluZykuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGlycV9ub2RlIHsKLQlpcnFyZXR1cm5fdAkoKmhhbmRsZXIpKGludCwgdm9pZCAqKTsKLQl2b2lkCQkqZGV2X2lkOwotCXN0cnVjdCBpcnFfbm9kZSAqbmV4dDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci19IGlycV9ub2RlX3Q7CitzdHJ1Y3QgaXJxX2RhdGE7CitzdHJ1Y3QgaXJxX2NoaXA7CitzdHJ1Y3QgaXJxX2Rlc2M7CitleHRlcm4gdW5zaWduZWQgaW50IG02OGtfaXJxX3N0YXJ0dXAoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbTY4a19pcnFfc3RhcnR1cF9pcnEodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gdm9pZCBtNjhrX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdCh2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LAorCQkJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250KTsKK2V4dGVybiB2b2lkIG02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoc3RydWN0IGlycV9jaGlwICosCisJCQkJICAgICAgdm9pZCAoKmhhbmRsZSkodW5zaWduZWQgaW50IGlycSwKKwkJCQkJCSAgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY250KTsKIAotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGhhcyBvbmx5IDQgZWxlbWVudHMgZm9yIHNwZWVkIHJlYXNvbnMKLSAqLwotc3RydWN0IGlycV9oYW5kbGVyIHsKLQlpbnQJCSgqaGFuZGxlcikoaW50LCB2b2lkICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jdm9pZAkJKmRldl9pZDsKLQljb25zdCBjaGFyCSpkZXZuYW1lOwotfTsKLQotc3RydWN0IGlycV9jb250cm9sbGVyIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXNwaW5sb2NrX3QgbG9jazsKLQlpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgaXJxKTsKLQl2b2lkICgqc2h1dGRvd24pKHVuc2lnbmVkIGludCBpcnEpOwotCXZvaWQgKCplbmFibGUpKHVuc2lnbmVkIGludCBpcnEpOwotCXZvaWQgKCpkaXNhYmxlKSh1bnNpZ25lZCBpbnQgaXJxKTsKLX07Ci0KLWV4dGVybiBpbnQgbTY4a19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgbTY4a19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50KTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBpcnFfbm9kZV90Ci0gKi8KLWV4dGVybiBpcnFfbm9kZV90ICpuZXdfaXJxX25vZGUodm9pZCk7Ci0KLWV4dGVybiB2b2lkIG02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQodm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOwotZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250LAotCQkJCSAgICAgIHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKTsKLWV4dGVybiB2b2lkIG02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoc3RydWN0IGlycV9jb250cm9sbGVyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLQotYXNtbGlua2FnZSB2b2lkIG02OGtfaGFuZGxlX2ludCh1bnNpZ25lZCBpbnQpOwotYXNtbGlua2FnZSB2b2lkIF9fbTY4a19oYW5kbGVfaW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdW5zaWduZWQgaW50IGlycV9jYW5vbmljYWxpemUodW5zaWduZWQgaW50IGlycSk7CiAKICNlbHNlCiAjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoaXJxKSAgKGlycSkKICNlbmRpZiAvKiBDT05GSUdfTU1VICovCiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19JUlEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKICNlbmRpZiAvKiBfTTY4S19JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tYWNpbnRvc2guaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tYWNpbnRvc2guaAppbmRleCBjMmExYzVlLi4xMmViZTQzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbWFjaW50b3NoLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21hY2ludG9zaC5oCkBAIC0xMiw2ICsxMiw4IEBACiBleHRlcm4gdm9pZCBtYWNfcG93ZXJvZmYodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNfaW5pdF9JUlEodm9pZCk7CiBleHRlcm4gaW50IG1hY19pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgbWFjX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKK2V4dGVybiB2b2lkIG1hY19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiAvKgogICoJRmxvcHB5IGRyaXZlciBtYWdpYyBob29rIC0gcHJvYmFibHkgc2hvdWxkbid0IGJlIGhlcmUKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9xNDBpbnRzLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcTQwaW50cy5oCmluZGV4IDNkOTcwYWYuLjIyZjEyYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9xNDBpbnRzLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3E0MGludHMuaApAQCAtMjQsNiArMjQsMyBAQAogI2RlZmluZSBRNDBfSVJRMTBfTUFTSyAgICAgICAoMTw8NSkKICNkZWZpbmUgUTQwX0lSUTE0X01BU0sgICAgICAgKDE8PDYpCiAjZGVmaW5lIFE0MF9JUlExNV9NQVNLICAgICAgICgxPDw3KQotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBxNDBfcHJvYmVfaXJxX29uICh2b2lkKTsKLWV4dGVybiBpbnQgcTQwX3Byb2JlX2lycV9vZmYgKHVuc2lnbmVkIGxvbmcgaXJxcyk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlN2YwZjJlLi5jNTY5NjE5IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsMTYgKzYsMTUgQEAKIGV4dHJhLSQoQ09ORklHX1NVTjMpCTo9IHN1bjMtaGVhZC5vCiBleHRyYS15CQkJKz0gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gZW50cnkubyBtNjhrX2tzeW1zLm8gbW9kdWxlLm8gcHJvY2Vzcy5vIHB0cmFjZS5vIHNldHVwLm8gc2lnbmFsLm8gXAotCSAgIHN5c19tNjhrLm8gc3lzY2FsbHRhYmxlLm8gdGltZS5vIHRyYXBzLm8KK29iai15CTo9IGVudHJ5Lm8gaXJxLm8gbTY4a19rc3ltcy5vIG1vZHVsZS5vIHByb2Nlc3MubyBwdHJhY2UubyBzZXR1cC5vIFwKKwkgICBzaWduYWwubyBzeXNfbTY4ay5vIHN5c2NhbGx0YWJsZS5vIHRpbWUubyB0cmFwcy5vCiAKLW9iai0kKENPTkZJR19NTVUpCSs9IGludHMubyBkZXZyZXMubyB2ZWN0b3JzLm8KLWRldnJlcy0kKENPTkZJR19NTVUpCT0gLi4vLi4vLi4va2VybmVsL2lycS9kZXZyZXMubworb2JqLSQoQ09ORklHX01NVSkJKz0gaW50cy5vIHZlY3RvcnMubwogCiBpZm5kZWYgQ09ORklHX01NVV9TVU4zCiBvYmoteQkJCSs9IGRtYS5vCiBlbmRpZgogaWZuZGVmIENPTkZJR19NTVUKLW9iai15CQkJKz0gaW5pdF90YXNrLm8gaXJxLm8KK29iai15CQkJKz0gaW5pdF90YXNrLm8KIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZG1hX21tLmMgYi9hcmNoL202OGsva2VybmVsL2RtYV9tbS5jCmluZGV4IDRiYmIzYzIuLmEzYzQ3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZG1hX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWFfbW0uYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZG1hX25vLmMgYi9hcmNoL202OGsva2VybmVsL2RtYV9uby5jCmluZGV4IGZjNjE1NDEuLmYxZGMzZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZG1hX25vLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9kbWFfbm8uYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbW0uUyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbW0uUwppbmRleCBiZDBlYzA1Li5jNzEzZjUxIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9tbS5TCkBAIC00OCw3ICs0OCw3IEBACiAuZ2xvYmwgc3lzX2ZvcmssIHN5c19jbG9uZSwgc3lzX3Zmb3JrCiAuZ2xvYmwgcmV0X2Zyb21faW50ZXJydXB0LCBiYWRfaW50ZXJydXB0CiAuZ2xvYmwgYXV0b19pcnFoYW5kbGVyX2ZpeHVwCi0uZ2xvYmwgdXNlcl9pcnF2ZWNfZml4dXAsIHVzZXJfaXJxaGFuZGxlcl9maXh1cAorLmdsb2JsIHVzZXJfaXJxdmVjX2ZpeHVwCiAKIC50ZXh0CiBFTlRSWShidXNlcnIpCkBAIC0yMDcsNyArMjA3LDcgQEAKIAltb3ZlbAklc3AsJXNwQC0KIAltb3ZlbAklZDAsJXNwQC0JCXwgIHB1dCB2ZWN0b3IgIyBvbiBzdGFjawogYXV0b19pcnFoYW5kbGVyX2ZpeHVwID0gLiArIDIKLQlqc3IJX19tNjhrX2hhbmRsZV9pbnQJfCAgcHJvY2VzcyB0aGUgSVJRCisJanNyCWRvX0lSUQkJCXwgIHByb2Nlc3MgdGhlIElSUQogCWFkZHFsCSM4LCVzcAkJCXwgIHBvcCBwYXJhbWV0ZXJzIG9mZiBzdGFjawogCiByZXRfZnJvbV9pbnRlcnJ1cHQ6CkBAIC0yNDAsOCArMjQwLDcgQEAKIAogCW1vdmVsCSVzcCwlc3BALQogCW1vdmVsCSVkMCwlc3BALQkJfCAgcHV0IHZlY3RvciAjIG9uIHN0YWNrCi11c2VyX2lycWhhbmRsZXJfZml4dXAgPSAuICsgMgotCWpzcglfX202OGtfaGFuZGxlX2ludAl8ICBwcm9jZXNzIHRoZSBJUlEKKwlqc3IJZG9fSVJRCQkJfCAgcHJvY2VzcyB0aGUgSVJRCiAJYWRkcWwJIzgsJXNwCQkJfCAgcG9wIHBhcmFtZXRlcnMgb2ZmIHN0YWNrCiAKIAlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwppbmRleCA3NjFlZTA0Li43NGZlZmFjIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2ludHMuYworKysgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwpAQCAtNCwyNSArNCw2IEBACiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogMDcvMDMvOTY6IFRpbWVyIGluaXRpYWxpemF0aW9uLCBhbmQgdGh1cyBtYWNoX3NjaGVkX2luaXQoKSwKLSAqICAgICAgICAgICByZW1vdmVkIGZyb20gcmVxdWVzdF9pcnEoKSBhbmQgbW92ZWQgdG8gaW5pdF90aW1lKCkuCi0gKiAgICAgICAgICAgV2Ugc2hvdWxkIHRoZXJlZm9yZSBjb25zaWRlciByZW5hbWluZyBvdXIgYWRkX2lzcigpIGFuZAotICogICAgICAgICAgIHJlbW92ZV9pc3IoKSB0byByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSgpCi0gKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBzbyB0aGV5IGFyZSBjb21wbGlhbnQgd2l0aCB0aGUgb3RoZXIKLSAqICAgICAgICAgICBhcmNoaXRlY3R1cmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvSmVzCi0gKiAxMS8wNy85NjogQ2hhbmdlZCBhbGwgYWRkXy9yZW1vdmVfaXNyKCkgdG8gcmVxdWVzdF8vZnJlZV9pcnEoKSBjYWxscy4KLSAqICAgICAgICAgICBSZW1vdmVkIGlycSBsaXN0IHN1cHBvcnQsIGlmIGFueSBtYWNoaW5lIG5lZWRzIGFuIGlycSBzZXJ2ZXIKLSAqICAgICAgICAgICBpdCBtdXN0IGltcGxlbWVudCB0aGlzIGl0c2VsZiAoYXMgaXQncyBhbHJlYWR5IGRvbmUpLCBpbnN0ZWFkCi0gKiAgICAgICAgICAgb25seSBkZWZhdWx0IGhhbmRsZXIgYXJlIHVzZWQgd2l0aCBtYWNoX2RlZmF1bHRfaGFuZGxlci4KLSAqICAgICAgICAgICByZXF1ZXN0X2lycSBnb3Qgc29tZSBmbGFncyBkaWZmZXJlbnQgZnJvbSBvdGhlciBhcmNoaXRlY3R1cmVzOgotICogICAgICAgICAgIC0gSVJRX0ZMR19SRVBMQUNFIDogUmVwbGFjZSBhbiBleGlzdGluZyBoYW5kbGVyICh0aGUgZGVmYXVsdCBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSByZXBsYWNlZCB3aXRob3V0IHRoaXMgZmxhZykKLSAqICAgICAgICAgICAtIElSUV9GTEdfTE9DSyA6IGhhbmRsZXIgY2FuJ3QgYmUgcmVwbGFjZWQKLSAqICAgICAgICAgICBUaGVyZSBhcmUgb3RoZXIgbWFjaGluZSBkZXBlbmRpbmcgZmxhZ3MsIHNlZSB0aGVyZQotICogICAgICAgICAgIElmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSBkZWZhdWx0IGhhbmRsZXIgeW91IHNob3VsZCBrbm93IHdoYXQKLSAqICAgICAgICAgICB5b3UncmUgZG9pbmcsIHNpbmNlIGl0IG1pZ2h0IGhhbmRsZSBkaWZmZXJlbnQgb3RoZXIgaXJxIHNvdXJjZXMKLSAqICAgICAgICAgICB3aGljaCBtdXN0IGJlIHNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvUm9tYW4gWmlwcGVsCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDcsMzMgKzI4LDIyIEBACiAjZW5kaWYKIAogZXh0ZXJuIHUzMiBhdXRvX2lycWhhbmRsZXJfZml4dXBbXTsKLWV4dGVybiB1MzIgdXNlcl9pcnFoYW5kbGVyX2ZpeHVwW107CiBleHRlcm4gdTE2IHVzZXJfaXJxdmVjX2ZpeHVwW107CiAKLS8qIHRhYmxlIGZvciBzeXN0ZW0gaW50ZXJydXB0IGhhbmRsZXJzICovCi1zdGF0aWMgc3RydWN0IGlycV9ub2RlICppcnFfbGlzdFtOUl9JUlFTXTsKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmlycV9jb250cm9sbGVyW05SX0lSUVNdOwotc3RhdGljIGludCBpcnFfZGVwdGhbTlJfSVJRU107Ci0KIHN0YXRpYyBpbnQgbTY4a19maXJzdF91c2VyX3ZlYzsKIAotc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdXRvX2lycV9jb250cm9sbGVyID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhdXRvX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJhdXRvIiwKLQkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChhdXRvX2lycV9jb250cm9sbGVyLmxvY2spLAotCS5zdGFydHVwCT0gbTY4a19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSBtNjhrX2lycV9zaHV0ZG93biwKKwkuaXJxX3N0YXJ0dXAJPSBtNjhrX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBtNjhrX2lycV9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgdXNlcl9pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdXNlcl9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAidXNlciIsCi0JLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQodXNlcl9pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCisJLmlycV9zdGFydHVwCT0gbTY4a19pcnFfc3RhcnR1cCwKKwkuaXJxX3NodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCiB9OwogCi0jZGVmaW5lIE5VTV9JUlFfTk9ERVMgMTAwCi1zdGF0aWMgaXJxX25vZGVfdCBub2Rlc1tOVU1fSVJRX05PREVTXTsKLQogLyoKICAqIHZvaWQgaW5pdF9JUlEodm9pZCkKICAqCkBAIC05Niw3ICs2Niw3IEBACiAJfQogCiAJZm9yIChpID0gSVJRX0FVVE9fMTsgaSA8PSBJUlFfQVVUT183OyBpKyspCi0JCWlycV9jb250cm9sbGVyW2ldID0gJmF1dG9faXJxX2NvbnRyb2xsZXI7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmYXV0b19pcnFfY2hpcCwgaGFuZGxlX3NpbXBsZV9pcnEpOwogCiAJbWFjaF9pbml0X0lSUSgpOwogfQpAQCAtMTA2LDcgKzc2LDcgQEAKICAqIEBoYW5kbGVyOiBjYWxsZWQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzCiAgKgogICogc2V0dXAgdGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIGZyb20gYXV0byB2ZWN0b3IgaW50ZXJydXB0cyBpbnN0ZWFkIG9mIHRoZQotICogc3RhbmRhcmQgX19tNjhrX2hhbmRsZV9pbnQoKSwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBpcnEgbnVtYmVycyBpbiB0aGUgcmFuZ2UKKyAqIHN0YW5kYXJkIGRvX0lSUSgpLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGlycSBudW1iZXJzIGluIHRoZSByYW5nZQogICogZnJvbSBJUlFfQVVUT18xIC0gSVJRX0FVVE9fNy4KICAqLwogdm9pZCBfX2luaXQgbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdCh2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSkKQEAgLTEyMCwyMTcgKzkwLDQ5IEBACiAgKiBtNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0CiAgKiBAdmVjOiBmaXJzdCB1c2VyIHZlY3RvciBpbnRlcnJ1cHQgdG8gaGFuZGxlCiAgKiBAY250OiBudW1iZXIgb2YgYWN0aXZlIHVzZXIgdmVjdG9yIGludGVycnVwdHMKLSAqIEBoYW5kbGVyOiBjYWxsZWQgZnJvbSB1c2VyIHZlY3RvciBpbnRlcnJ1cHRzCiAgKgogICogc2V0dXAgdXNlciB2ZWN0b3IgaW50ZXJydXB0cywgdGhpcyBpbmNsdWRlcyBhY3RpdmF0aW5nIHRoZSBzcGVjaWZpZWQgcmFuZ2UKICAqIG9mIGludGVycnVwdHMsIG9ubHkgdGhlbiB0aGVzZSBpbnRlcnJ1cHRzIGNhbiBiZSByZXF1ZXN0ZWQgKG5vdGU6IHRoaXMgaXMKLSAqIGRpZmZlcmVudCBmcm9tIGF1dG8gdmVjdG9yIGludGVycnVwdHMpLiBBbiBvcHRpb25hbCBoYW5kbGVyIGNhbiBiZSBpbnN0YWxsZWQKLSAqIHRvIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IF9fbTY4a19oYW5kbGVfaW50KCksIGl0IHdpbGwgYmUgY2FsbGVkCi0gKiB3aXRoIGlycSBudW1iZXJzIHN0YXJ0aW5nIGZyb20gSVJRX1VTRVIuCisgKiBkaWZmZXJlbnQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzKS4KICAqLwotdm9pZCBfX2luaXQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250LAotCQkJCSAgICAgIHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKQordm9pZCBfX2luaXQgbTY4a19zZXR1cF91c2VyX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgdmVjLCB1bnNpZ25lZCBpbnQgY250KQogewogCWludCBpOwogCiAJQlVHX09OKElSUV9VU0VSICsgY250ID4gTlJfSVJRUyk7CiAJbTY4a19maXJzdF91c2VyX3ZlYyA9IHZlYzsKIAlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCWlycV9jb250cm9sbGVyW0lSUV9VU0VSICsgaV0gPSAmdXNlcl9pcnFfY29udHJvbGxlcjsKKwkJaXJxX3NldF9jaGlwKElSUV9VU0VSICsgaSwgJnVzZXJfaXJxX2NoaXApOwogCSp1c2VyX2lycXZlY19maXh1cCA9IHZlYyAtIElSUV9VU0VSOwotCWlmIChoYW5kbGVyKQotCQkqdXNlcl9pcnFoYW5kbGVyX2ZpeHVwID0gKHUzMiloYW5kbGVyOwogCWZsdXNoX2ljYWNoZSgpOwogfQogCiAvKioKICAqIG02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIKLSAqIEBjb250cjogaXJxIGNvbnRyb2xsZXIgd2hpY2ggY29udHJvbHMgc3BlY2lmaWVkIGlycQorICogQGNoaXA6IGlycSBjaGlwIHdoaWNoIGNvbnRyb2xzIHNwZWNpZmllZCBpcnEKKyAqIEBoYW5kbGU6IGZsb3cgaGFuZGxlciB3aGljaCBoYW5kbGVzIHNwZWNpZmllZCBpcnEKICAqIEBpcnE6IGZpcnN0IGlycSB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBjb250cm9sbGVyCisgKiBAY250OiBudW1iZXIgb2YgaXJxcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBjb250cm9sbGVyCiAgKgogICogQ2hhbmdlIHRoZSBjb250cm9sbGVyIGZvciB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGlycSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvCiAgKiBtYW5hZ2UgdGhlc2UgaXJxLiBhdXRvL3VzZXIgaXJxIGFscmVhZHkgaGF2ZSBhIGRlZmF1bHQgY29udHJvbGxlciwgd2hpY2ggY2FuCiAgKiBiZSBjaGFuZ2VkIGFzIHdlbGwsIGJ1dCB0aGUgY29udHJvbGxlciBwcm9iYWJseSBzaG91bGQgdXNlIG02OGtfaXJxX3N0YXJ0dXAvCiAgKiBtNjhrX2lycV9zaHV0ZG93bi4KICAqLwotdm9pZCBtNjhrX3NldHVwX2lycV9jb250cm9sbGVyKHN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHIsIHVuc2lnbmVkIGludCBpcnEsCit2b2lkIG02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoc3RydWN0IGlycV9jaGlwICpjaGlwLAorCQkJICAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIHVuc2lnbmVkIGludCBpcnEsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGNudCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKLQkJaXJxX2NvbnRyb2xsZXJbaXJxICsgaV0gPSBjb250cjsKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaXJxX3NldF9jaGlwKGlycSArIGksIGNoaXApOworCQlpZiAoaGFuZGxlKQorCQkJaXJxX3NldF9oYW5kbGVyKGlycSArIGksIGhhbmRsZSk7CisJfQogfQogCi1pcnFfbm9kZV90ICpuZXdfaXJxX25vZGUodm9pZCkKLXsKLQlpcnFfbm9kZV90ICpub2RlOwotCXNob3J0IGk7Ci0KLQlmb3IgKG5vZGUgPSBub2RlcywgaSA9IE5VTV9JUlFfTk9ERVMtMTsgaSA+PSAwOyBub2RlKyssIGktLSkgewotCQlpZiAoIW5vZGUtPmhhbmRsZXIpIHsKLQkJCW1lbXNldChub2RlLCAwLCBzaXplb2YoKm5vZGUpKTsKLQkJCXJldHVybiBub2RlOwotCQl9Ci0JfQotCi0JcHJpbnRrICgibmV3X2lycV9ub2RlOiBvdXQgb2Ygbm9kZXNcbiIpOwotCXJldHVybiBOVUxMOwotfQotCi1pbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOwotCXN0cnVjdCBpcnFfbm9kZSAqKnByZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgX19mdW5jX18sIGlycSwgbm9kZS0+ZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0KLQlwcmV2ID0gaXJxX2xpc3QgKyBpcnE7Ci0JaWYgKCpwcmV2KSB7Ci0JCS8qIENhbid0IHNoYXJlIGludGVycnVwdHMgdW5sZXNzIGJvdGggYWdyZWUgdG8gKi8KLQkJaWYgKCEoKCpwcmV2KS0+ZmxhZ3MgJiBub2RlLT5mbGFncyAmIElSUUZfU0hBUkVEKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJd2hpbGUgKCpwcmV2KQotCQkJcHJldiA9ICYoKnByZXYpLT5uZXh0OwotCX0KLQotCWlmICghaXJxX2xpc3RbaXJxXSkgewotCQlpZiAoY29udHItPnN0YXJ0dXApCi0JCQljb250ci0+c3RhcnR1cChpcnEpOwotCQllbHNlCi0JCQljb250ci0+ZW5hYmxlKGlycSk7Ci0JfQotCW5vZGUtPm5leHQgPSBOVUxMOwotCSpwcmV2ID0gbm9kZTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycV9oYW5kbGVyX3QgaGFuZGxlciwKLQkJdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBpcnFfbm9kZSAqbm9kZTsKLQlpbnQgcmVzOwotCi0Jbm9kZSA9IG5ld19pcnFfbm9kZSgpOwotCWlmICghbm9kZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlub2RlLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlub2RlLT5mbGFncyAgID0gZmxhZ3M7Ci0Jbm9kZS0+ZGV2X2lkICA9IGRldl9pZDsKLQlub2RlLT5kZXZuYW1lID0gZGV2bmFtZTsKLQotCXJlcyA9IHNldHVwX2lycShpcnEsIG5vZGUpOwotCWlmIChyZXMpCi0JCW5vZGUtPmhhbmRsZXIgPSBOVUxMOwotCi0JcmV0dXJuIHJlczsKLX0KLQotRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2lycSk7Ci0KLXZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7Ci0Jc3RydWN0IGlycV9ub2RlICoqcCwgKm5vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwgX19mdW5jX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLQotCXAgPSBpcnFfbGlzdCArIGlycTsKLQl3aGlsZSAoKG5vZGUgPSAqcCkpIHsKLQkJaWYgKG5vZGUtPmRldl9pZCA9PSBkZXZfaWQpCi0JCQlicmVhazsKLQkJcCA9ICZub2RlLT5uZXh0OwotCX0KLQotCWlmIChub2RlKSB7Ci0JCSpwID0gbm9kZS0+bmV4dDsKLQkJbm9kZS0+aGFuZGxlciA9IE5VTEw7Ci0JfSBlbHNlCi0JCXByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBpcnEpOwotCi0JaWYgKCFpcnFfbGlzdFtpcnFdKSB7Ci0JCWlmIChjb250ci0+c2h1dGRvd24pCi0JCQljb250ci0+c2h1dGRvd24oaXJxKTsKLQkJZWxzZQotCQkJY29udHItPmRpc2FibGUoaXJxKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOwotfQotCi1FWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKLQotdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGlycSA+PSBOUl9JUlFTIHx8ICEoY29udHIgPSBpcnFfY29udHJvbGxlcltpcnFdKSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLQlpZiAoaXJxX2RlcHRoW2lycV0pIHsKLQkJaWYgKCEtLWlycV9kZXB0aFtpcnFdKSB7Ci0JCQlpZiAoY29udHItPmVuYWJsZSkKLQkJCQljb250ci0+ZW5hYmxlKGlycSk7Ci0JCX0KLQl9IGVsc2UKLQkJV0FSTl9PTigxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOwotfQotCi1FWFBPUlRfU1lNQk9MKGVuYWJsZV9pcnEpOwotCi12b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGlycSA+PSBOUl9JUlFTIHx8ICEoY29udHIgPSBpcnFfY29udHJvbGxlcltpcnFdKSkgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWlycV9kZXB0aFtpcnFdKyspIHsKLQkJaWYgKGNvbnRyLT5kaXNhYmxlKQotCQkJY29udHItPmRpc2FibGUoaXJxKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycSk7Ci0KLXZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCBpcnEpIF9fYXR0cmlidXRlX18oKGFsaWFzKCJkaXNhYmxlX2lycSIpKSk7Ci0KLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnFfbm9zeW5jKTsKLQotaW50IG02OGtfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKK3Vuc2lnbmVkIGludCBtNjhrX2lycV9zdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmIChpcnEgPD0gSVJRX0FVVE9fNykKIAkJdmVjdG9yc1tWRUNfU1BVUiArIGlycV0gPSBhdXRvX2ludGhhbmRsZXI7CkBAIC0zMzksOCArMTQxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbTY4a19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3Vuc2lnbmVkIGludCBtNjhrX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKKwlyZXR1cm4gbTY4a19pcnFfc3RhcnR1cF9pcnEoZGF0YS0+aXJxKTsKK30KKwordm9pZCBtNjhrX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCWlmIChpcnEgPD0gSVJRX0FVVE9fNykKIAkJdmVjdG9yc1tWRUNfU1BVUiArIGlycV0gPSBiYWRfaW50aGFuZGxlcjsKIAllbHNlCkBAIC0zNDgsMzMgKzE1Nyw2IEBACiB9CiAKIAotLyoKLSAqIERvIHdlIG5lZWQgdGhlc2UgcHJvYmUgZnVuY3Rpb25zIG9uIHRoZSBtNjhrPwotICoKLSAqICAuLi4gbWF5IGJlIHVzZWZ1bCB3aXRoIElTQSBkZXZpY2VzCi0gKi8KLXVuc2lnbmVkIGxvbmcgcHJvYmVfaXJxX29uICh2b2lkKQotewotI2lmZGVmIENPTkZJR19RNDAKLQlpZiAoTUFDSF9JU19RNDApCi0JCXJldHVybiBxNDBfcHJvYmVfaXJxX29uKCk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb24pOwotCi1pbnQgcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQotewotI2lmZGVmIENPTkZJR19RNDAKLQlpZiAoTUFDSF9JU19RNDApCi0JCXJldHVybiBxNDBfcHJvYmVfaXJxX29mZihpcnFzKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vZmYpOwotCiB1bnNpZ25lZCBpbnQgaXJxX2Nhbm9uaWNhbGl6ZSh1bnNpZ25lZCBpbnQgaXJxKQogewogI2lmZGVmIENPTkZJR19RNDAKQEAgLTM4Niw1MiArMTY4LDkgQEAKIAogRVhQT1JUX1NZTUJPTChpcnFfY2Fub25pY2FsaXplKTsKIAotYXNtbGlua2FnZSB2b2lkIG02OGtfaGFuZGxlX2ludCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcnFfbm9kZSAqbm9kZTsKLQlrc3RhdF9jcHUoMCkuaXJxc1tpcnFdKys7Ci0Jbm9kZSA9IGlycV9saXN0W2lycV07Ci0JZG8gewotCQlub2RlLT5oYW5kbGVyKGlycSwgbm9kZS0+ZGV2X2lkKTsKLQkJbm9kZSA9IG5vZGUtPm5leHQ7Ci0JfSB3aGlsZSAobm9kZSk7Ci19Ci0KLWFzbWxpbmthZ2Ugdm9pZCBfX202OGtfaGFuZGxlX2ludCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7Ci0Jb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7Ci0JbTY4a19oYW5kbGVfaW50KGlycSk7Ci0Jc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKLX0KIAogYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9iYWRpbnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Ja3N0YXRfY3B1KDApLmlycXNbMF0rKzsKLQlwcmludGsoInVuZXhwZWN0ZWQgaW50ZXJydXB0IGZyb20gJXVcbiIsIHJlZ3MtPnZlY3Rvcik7CisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CisJcHJfd2FybigidW5leHBlY3RlZCBpbnRlcnJ1cHQgZnJvbSAldVxuIiwgcmVncy0+dmVjdG9yKTsKIH0KLQotaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKLQlzdHJ1Y3QgaXJxX25vZGUgKm5vZGU7Ci0JaW50IGkgPSAqKGxvZmZfdCAqKSB2OwotCi0JLyogYXV0b3ZlY3RvciBpbnRlcnJ1cHRzICovCi0JaWYgKGlycV9saXN0W2ldKSB7Ci0JCWNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaV07Ci0JCW5vZGUgPSBpcnFfbGlzdFtpXTsKLQkJc2VxX3ByaW50ZihwLCAiJS04cyAlM3U6ICUxMHUgJXMiLCBjb250ci0+bmFtZSwgaSwga3N0YXRfY3B1KDApLmlycXNbaV0sIG5vZGUtPmRldm5hbWUpOwotCQl3aGlsZSAoKG5vZGUgPSBub2RlLT5uZXh0KSkKLQkJCXNlcV9wcmludGYocCwgIiwgJXMiLCBub2RlLT5kZXZuYW1lKTsKLQkJc2VxX3B1dHMocCwgIlxuIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKQotewotCS8qIEluc2VydCAvcHJvYy9pcnEgZHJpdmVyIGhlcmUgKi8KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9iYWJvb24uYyBiL2FyY2gvbTY4ay9tYWMvYmFib29uLmMKaW5kZXggMmE5NmJlYi4uYjQwMzkyNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9iYWJvb24uYworKysgYi9hcmNoL202OGsvbWFjL2JhYm9vbi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMjAsOSArMjEsNiBAQAogCiAvKiAjZGVmaW5lIERFQlVHX0lSUVMgKi8KIAotZXh0ZXJuIHZvaWQgbWFjX2VuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIG1hY19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOwotCiBpbnQgYmFib29uX3ByZXNlbnQ7CiBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGJhYm9vbiAqYmFib29uOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFib29uX2Rpc2FibGVkOwpAQCAtNTMsNyArNTEsNyBAQAogICogQmFib29uIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIHdvcmtzIGEgbG90IGxpa2UgYSBWSUEuCiAgKi8KIAotc3RhdGljIGlycXJldHVybl90IGJhYm9vbl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIHZvaWQgYmFib29uX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGlycV9iaXQsIGlycV9udW07CiAJdW5zaWduZWQgY2hhciBldmVudHM7CkBAIC02NCwxNSArNjIsMTYgQEAKIAkJKHVpbnQpIGJhYm9vbi0+bWJfc3RhdHVzKTsKICNlbmRpZgogCi0JaWYgKCEoZXZlbnRzID0gYmFib29uLT5tYl9pZnIgJiAweDA3KSkKLQkJcmV0dXJuIElSUV9OT05FOworCWV2ZW50cyA9IGJhYm9vbi0+bWJfaWZyICYgMHgwNzsKKwlpZiAoIWV2ZW50cykKKwkJcmV0dXJuOwogCiAJaXJxX251bSA9IElSUV9CQUJPT05fMDsKIAlpcnFfYml0ID0gMTsKIAlkbyB7CiAJICAgICAgICBpZiAoZXZlbnRzICYgaXJxX2JpdCkgewogCQkJYmFib29uLT5tYl9pZnIgJj0gfmlycV9iaXQ7Ci0JCQltNjhrX2hhbmRsZV9pbnQoaXJxX251bSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX251bSk7CiAJCX0KIAkJaXJxX2JpdCA8PD0gMTsKIAkJaXJxX251bSsrOwpAQCAtODIsNyArODEsNiBAQAogCS8qIGZvciBub3cgd2UgbmVlZCB0byBzbWFzaCBhbGwgaW50ZXJydXB0cyAqLwogCWJhYm9vbi0+bWJfaWZyICY9IH5ldmVudHM7CiAjZW5kaWYKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIC8qCkBAIC05Miw4ICs5MCw3IEBACiB2b2lkIF9faW5pdCBiYWJvb25fcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQogewogCWJhYm9vbl9kaXNhYmxlZCA9IDA7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9OVUJVU19DLCBiYWJvb25faXJxLCAwLCAiYmFib29uIiwgKHZvaWQgKiliYWJvb24pKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGJhYm9vbiBpbnRlcnJ1cHRcbiIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9OVUJVU19DLCBiYWJvb25faXJxKTsKIH0KIAogLyoKQEAgLTExMSw3ICsxMDgsNyBAQAogCiAJYmFib29uX2Rpc2FibGVkICY9IH4oMSA8PCBpcnFfaWR4KTsKIAlpZiAoIWJhYm9vbl9kaXNhYmxlZCkKLQkJbWFjX2VuYWJsZV9pcnEoSVJRX05VQlVTX0MpOworCQltYWNfaXJxX2VuYWJsZShpcnFfZ2V0X2lycV9kYXRhKElSUV9OVUJVU19DKSk7CiB9CiAKIHZvaWQgYmFib29uX2lycV9kaXNhYmxlKGludCBpcnEpCkBAIC0xMjQsNyArMTIxLDcgQEAKIAogCWJhYm9vbl9kaXNhYmxlZCB8PSAxIDw8IGlycV9pZHg7CiAJaWYgKGJhYm9vbl9kaXNhYmxlZCkKLQkJbWFjX2Rpc2FibGVfaXJxKElSUV9OVUJVU19DKTsKKwkJbWFjX2lycV9kaXNhYmxlKGlycV9nZXRfaXJxX2RhdGEoSVJRX05VQlVTX0MpKTsKIH0KIAogdm9pZCBiYWJvb25faXJxX2NsZWFyKGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL2lvcC5jIGIvYXJjaC9tNjhrL21hYy9pb3AuYwppbmRleCAxYWQ0ZTlkLi5hNTQ2MmNjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2lvcC5jCisrKyBiL2FyY2gvbTY4ay9tYWMvaW9wLmMKQEAgLTMwNSwxNSArMzA1LDEzIEBACiB7CiAJaWYgKGlvcF9pc21fcHJlc2VudCkgewogCQlpZiAob3NzX3ByZXNlbnQpIHsKLQkJCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUElTTSwgaW9wX2lzbV9pcnEsCi0JCQkJCUlSUV9GTEdfTE9DSywgIklTTSBJT1AiLAotCQkJCQkodm9pZCAqKSBJT1BfTlVNX0lTTSkpCisJCQlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BJU00sIGlvcF9pc21faXJxLCAwLAorCQkJCQkiSVNNIElPUCIsICh2b2lkICopSU9QX05VTV9JU00pKQogCQkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgSVNNIElPUCBpbnRlcnJ1cHRcbiIpOwogCQkJb3NzX2lycV9lbmFibGUoSVJRX01BQ19BREIpOwogCQl9IGVsc2UgewotCQkJaWYgKHJlcXVlc3RfaXJxKElSUV9WSUEyXzAsIGlvcF9pc21faXJxLAotCQkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAiSVNNIElPUCIsCi0JCQkJCSh2b2lkICopIElPUF9OVU1fSVNNKSkKKwkJCWlmIChyZXF1ZXN0X2lycShJUlFfVklBMl8wLCBpb3BfaXNtX2lycSwgMCwgIklTTSBJT1AiLAorCQkJCQkodm9pZCAqKUlPUF9OVU1fSVNNKSkKIAkJCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIElTTSBJT1AgaW50ZXJydXB0XG4iKTsKIAkJfQogCQlpZiAoIWlvcF9hbGl2ZShpb3BfYmFzZVtJT1BfTlVNX0lTTV0pKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL21hY2ludHMuYyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCmluZGV4IGY5MjE5MGMuLmJhMjIwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCkBAIC0xOTAsMTQgKzE5MCwxMCBAQAogCiAvKiAjZGVmaW5lIERFQlVHX01BQ0lOVFMgKi8KIAotdm9pZCBtYWNfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgbWFjX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIG1hY19pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbWFjX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJtYWMiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG1hY19pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuZW5hYmxlCQk9IG1hY19lbmFibGVfaXJxLAotCS5kaXNhYmxlCT0gbWFjX2Rpc2FibGVfaXJxLAorCS5pcnFfZW5hYmxlCT0gbWFjX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gbWFjX2lycV9kaXNhYmxlLAogfTsKIAogdm9pZCBfX2luaXQgbWFjX2luaXRfSVJRKHZvaWQpCkBAIC0yMDUsNyArMjAxLDcgQEAKICNpZmRlZiBERUJVR19NQUNJTlRTCiAJcHJpbnRrKCJtYWNfaW5pdF9JUlEoKTogU2V0dGluZyB0aGluZ3MgdXAuLi5cbiIpOwogI2VuZGlmCi0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmbWFjX2lycV9jb250cm9sbGVyLCBJUlFfVVNFUiwKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZtYWNfaXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxLCBJUlFfVVNFUiwKIAkJCQkgIE5VTV9NQUNfU09VUkNFUyAtIElSUV9VU0VSKTsKIAkvKiBNYWtlIHN1cmUgdGhlIFNPTklDIGludGVycnVwdCBpcyBjbGVhcmVkIG9yIHRoaW5ncyBnZXQgdWdseSAqLwogI2lmZGVmIFNIVVRVUF9TT05JQwpAQCAtMjQxLDE2ICsyMzcsMTcgQEAKIH0KIAogLyoKLSAqICBtYWNfZW5hYmxlX2lycSAtIGVuYWJsZSBhbiBpbnRlcnJ1cHQgc291cmNlCi0gKiBtYWNfZGlzYWJsZV9pcnEgLSBkaXNhYmxlIGFuIGludGVycnVwdCBzb3VyY2UKKyAqICBtYWNfaXJxX2VuYWJsZSAtIGVuYWJsZSBhbiBpbnRlcnJ1cHQgc291cmNlCisgKiBtYWNfaXJxX2Rpc2FibGUgLSBkaXNhYmxlIGFuIGludGVycnVwdCBzb3VyY2UKICAqICAgbWFjX2NsZWFyX2lycSAtIGNsZWFycyBhIHBlbmRpbmcgaW50ZXJydXB0Ci0gKiBtYWNfcGVuZGluZ19pcnEgLSBSZXR1cm5zIHRoZSBwZW5kaW5nIHN0YXR1cyBvZiBhbiBJUlEgKG5vbnplcm8gPSBwZW5kaW5nKQorICogbWFjX2lycV9wZW5kaW5nIC0gcmV0dXJucyB0aGUgcGVuZGluZyBzdGF0dXMgb2YgYW4gSVJRIChub256ZXJvID0gcGVuZGluZykKICAqCiAgKiBUaGVzZSByb3V0aW5lcyBhcmUganVzdCBkaXNwYXRjaGVycyB0byB0aGUgVklBL09TUy9QU0Mgcm91dGluZXMuCiAgKi8KIAotdm9pZCBtYWNfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQordm9pZCBtYWNfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJaW50IGlycSA9IGRhdGEtPmlycTsKIAlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7CkBAIC0yODMsOCArMjgwLDkgQEAKIAl9CiB9CiAKLXZvaWQgbWFjX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit2b2lkIG1hY19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJaW50IGlycSA9IGRhdGEtPmlycTsKIAlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL29zcy5jIGIvYXJjaC9tNjhrL21hYy9vc3MuYwppbmRleCBhOWMwZjVhLi5hNGM4MmRhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL29zcy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvb3NzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgpAQCAtMjksMTAgKzMwLDcgQEAKIGludCBvc3NfcHJlc2VudDsKIHZvbGF0aWxlIHN0cnVjdCBtYWNfb3NzICpvc3M7CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBvc3NfaXJxKGludCwgdm9pZCAqKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBvc3NfbnVidXNfaXJxKGludCwgdm9pZCAqKTsKLQotZXh0ZXJuIGlycXJldHVybl90IHZpYTFfaXJxKGludCwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIHZpYTFfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CiAKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBPU1MKQEAgLTYwLDI2ICs1OCw2IEBACiB9CiAKIC8qCi0gKiBSZWdpc3RlciB0aGUgT1NTIGFuZCBOdUJ1cyBpbnRlcnJ1cHQgZGlzcGF0Y2hlcnMuCi0gKi8KLQotdm9pZCBfX2luaXQgb3NzX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKLXsKLQlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9TQ1NJLCBvc3NfaXJxLCBJUlFfRkxHX0xPQ0ssCi0JCQkic2NzaSIsICh2b2lkICopIG9zcykpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic2NzaSIpOwotCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0ssCi0JCQkibnVidXMiLCAodm9pZCAqKSBvc3MpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgIm51YnVzIik7Ci0JaWYgKHJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEsIElSUV9GTEdfTE9DSywKLQkJCSJzb3VuZCIsICh2b2lkICopIG9zcykpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic291bmQiKTsKLQlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9WSUExLCB2aWExX2lycSwgSVJRX0ZMR19MT0NLLAotCQkJInZpYTEiLCAodm9pZCAqKSB2aWExKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2aWExIik7Ci19Ci0KLS8qCiAgKiBJbml0aWFsaXplIE9TUyBmb3IgTnVidXMgYWNjZXNzCiAgKi8KIApAQCAtOTIsMTcgKzcwLDE3IEBACiAgKiBhbmQgU0NTSTsgZXZlcnl0aGluZyBlbHNlIGlzIHJvdXRlZCB0byBpdHMgb3duIGF1dG92ZWN0b3IgSVJRLgogICovCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBvc3NfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIG9zc19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBldmVudHM7CiAKIAlldmVudHMgPSBvc3MtPmlycV9wZW5kaW5nICYgKE9TU19JUF9TT1VORHxPU1NfSVBfU0NTSSk7CiAJaWYgKCFldmVudHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAjaWZkZWYgREVCVUdfSVJRUwogCWlmICgoY29uc29sZV9sb2dsZXZlbCA9PSAxMCkgJiYgIShldmVudHMgJiBPU1NfSVBfU0NTSSkpIHsKLQkJcHJpbnRrKCJvc3NfaXJxOiBpcnEgJWQgZXZlbnRzID0gMHglMDRYXG4iLCBpcnEsCisJCXByaW50aygib3NzX2lycTogaXJxICV1IGV2ZW50cyA9IDB4JTA0WFxuIiwgaXJxLAogCQkJKGludCkgb3NzLT5pcnFfcGVuZGluZyk7CiAJfQogI2VuZGlmCkBAIC0xMTMsMTEgKzkxLDEwIEBACiAJCS8qIEZJWE1FOiBjYWxsIHNvdW5kIGhhbmRsZXIgKi8KIAl9IGVsc2UgaWYgKGV2ZW50cyAmIE9TU19JUF9TQ1NJKSB7CiAJCW9zcy0+aXJxX3BlbmRpbmcgJj0gfk9TU19JUF9TQ1NJOwotCQltNjhrX2hhbmRsZV9pbnQoSVJRX01BQ19TQ1NJKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKElSUV9NQUNfU0NTSSk7CiAJfSBlbHNlIHsKIAkJLyogRklYTUU6IGVycm9yIGNoZWNrIGhlcmU/ICovCiAJfQotCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogLyoKQEAgLTEyNiwxMyArMTAzLDEzIEBACiAgKiBVbmxpa2UgdGhlIFZJQS9SQlYgdGhpcyBpcyBvbiBpdHMgb3duIGF1dG92ZWN0b3IgaW50ZXJydXB0IGxldmVsLgogICovCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBvc3NfbnVidXNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIG9zc19udWJ1c19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBldmVudHMsIGlycV9iaXQsIGk7CiAKIAlldmVudHMgPSBvc3MtPmlycV9wZW5kaW5nICYgT1NTX0lQX05VQlVTOwogCWlmICghZXZlbnRzKQotCQlyZXR1cm4gSVJRX05PTkU7CisJCXJldHVybjsKIAogI2lmZGVmIERFQlVHX05VQlVTX0lOVAogCWlmIChjb25zb2xlX2xvZ2xldmVsID4gNykgewpAQCAtMTQ4LDEwICsxMjUsMjEgQEAKIAkJaXJxX2JpdCA+Pj0gMTsKIAkJaWYgKGV2ZW50cyAmIGlycV9iaXQpIHsKIAkJCW9zcy0+aXJxX3BlbmRpbmcgJj0gfmlycV9iaXQ7Ci0JCQltNjhrX2hhbmRsZV9pbnQoTlVCVVNfU09VUkNFX0JBU0UgKyBpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShOVUJVU19TT1VSQ0VfQkFTRSArIGkpOwogCQl9CiAJfSB3aGlsZShldmVudHMgJiAoaXJxX2JpdCAtIDEpKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZWdpc3RlciB0aGUgT1NTIGFuZCBOdUJ1cyBpbnRlcnJ1cHQgZGlzcGF0Y2hlcnMuCisgKi8KKwordm9pZCBfX2luaXQgb3NzX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKK3sKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihPU1NfSVJRTEVWX1NDU0ksIG9zc19pcnEpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKE9TU19JUlFMRVZfTlVCVVMsIG9zc19udWJ1c19pcnEpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKE9TU19JUlFMRVZfVklBMSwgdmlhMV9pcnEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9wc2MuYyBiL2FyY2gvbTY4ay9tYWMvcHNjLmMKaW5kZXggYTRjM2ViNi4uZTZjMmQyMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9wc2MuYworKysgYi9hcmNoL202OGsvbWFjL3BzYy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMzAsOCArMzEsNiBAQAogaW50IHBzY19wcmVzZW50Owogdm9sYXRpbGUgX191OCAqcHNjOwogCi1pcnFyZXR1cm5fdCBwc2NfaXJxKGludCwgdm9pZCAqKTsKLQogLyoKICAqIERlYnVnZ2luZyBkdW1wLCB1c2VkIGluIHZhcmlvdXMgcGxhY2VzIHRvIHNlZSB3aGF0J3MgZ29pbmcgb24uCiAgKi8KQEAgLTExMiw1MiArMTExLDUyIEBACiB9CiAKIC8qCi0gKiBSZWdpc3RlciB0aGUgUFNDIGludGVycnVwdCBkaXNwYXRjaGVycyBmb3IgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzIDMtNi4KLSAqLwotCi12b2lkIF9faW5pdCBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQotewotCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18zLCBwc2NfaXJxLCAwLCAicHNjMyIsICh2b2lkICopIDB4MzApKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHBzYyVkIGludGVycnVwdFxuIiwgMyk7Ci0JaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIHBzY19pcnEsIDAsICJwc2M0IiwgKHZvaWQgKikgMHg0MCkpCi0JCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgcHNjJWQgaW50ZXJydXB0XG4iLCA0KTsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNSwgcHNjX2lycSwgMCwgInBzYzUiLCAodm9pZCAqKSAweDUwKSkKLQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBwc2MlZCBpbnRlcnJ1cHRcbiIsIDUpOwotCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT182LCBwc2NfaXJxLCAwLCAicHNjNiIsICh2b2lkICopIDB4NjApKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHBzYyVkIGludGVycnVwdFxuIiwgNik7Ci19Ci0KLS8qCiAgKiBQU0MgaW50ZXJydXB0IGhhbmRsZXIuIEl0J3MgYSBsb3QgbGlrZSB0aGUgVklBIGludGVycnVwdCBoYW5kbGVyLgogICovCiAKLWlycXJldHVybl90IHBzY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIHZvaWQgcHNjX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7Ci0JaW50IHBJRlIJPSBwSUZSYmFzZSArICgoaW50KSBkZXZfaWQpOwotCWludCBwSUVSCT0gcElFUmJhc2UgKyAoKGludCkgZGV2X2lkKTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCWludCBwSUZSCT0gcElGUmJhc2UgKyBvZmZzZXQ7CisJaW50IHBJRVIJPSBwSUVSYmFzZSArIG9mZnNldDsKIAlpbnQgaXJxX251bTsKIAl1bnNpZ25lZCBjaGFyIGlycV9iaXQsIGV2ZW50czsKIAogI2lmZGVmIERFQlVHX0lSUVMKLQlwcmludGsoInBzY19pcnE6IGlycSAlZCBwSUZSID0gMHglMDJYIHBJRVIgPSAweCUwMlhcbiIsCisJcHJpbnRrKCJwc2NfaXJxOiBpcnEgJXUgcElGUiA9IDB4JTAyWCBwSUVSID0gMHglMDJYXG4iLAogCQlpcnEsIChpbnQpIHBzY19yZWFkX2J5dGUocElGUiksIChpbnQpIHBzY19yZWFkX2J5dGUocElFUikpOwogI2VuZGlmCiAKIAlldmVudHMgPSBwc2NfcmVhZF9ieXRlKHBJRlIpICYgcHNjX3JlYWRfYnl0ZShwSUVSKSAmIDB4RjsKIAlpZiAoIWV2ZW50cykKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm47CiAKIAlpcnFfbnVtID0gaXJxIDw8IDM7CiAJaXJxX2JpdCA9IDE7CiAJZG8gewogCQlpZiAoZXZlbnRzICYgaXJxX2JpdCkgewogCQkJcHNjX3dyaXRlX2J5dGUocElGUiwgaXJxX2JpdCk7Ci0JCQltNjhrX2hhbmRsZV9pbnQoaXJxX251bSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX251bSk7CiAJCX0KIAkJaXJxX251bSsrOwogCQlpcnFfYml0IDw8PSAxOwogCX0gd2hpbGUgKGV2ZW50cyA+PSBpcnFfYml0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZWdpc3RlciB0aGUgUFNDIGludGVycnVwdCBkaXNwYXRjaGVycyBmb3IgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzIDMtNi4KKyAqLworCit2b2lkIF9faW5pdCBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQoreworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzMsIHBzY19pcnEpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKElSUV9BVVRPXzMsICh2b2lkICopMHgzMCk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSVJRX0FVVE9fNCwgcHNjX2lycSk7CisJaXJxX3NldF9oYW5kbGVyX2RhdGEoSVJRX0FVVE9fNCwgKHZvaWQgKikweDQwKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT181LCBwc2NfaXJxKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShJUlFfQVVUT181LCAodm9pZCAqKTB4NTApOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzYsIHBzY19pcnEpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKElSUV9BVVRPXzYsICh2b2lkICopMHg2MCk7CiB9CiAKIHZvaWQgcHNjX2lycV9lbmFibGUoaW50IGlycSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy92aWEuYyBiL2FyY2gvbTY4ay9tYWMvdmlhLmMKaW5kZXggZTcxMTY2ZC4uZjE2MDBhZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy92aWEuYworKysgYi9hcmNoL202OGsvbWFjL3ZpYS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CkBAIC03Nyw5ICs3OCw2IEBACiBzdGF0aWMgdTggbnVidXNfZGlzYWJsZWQ7CiAKIHZvaWQgdmlhX2RlYnVnX2R1bXAodm9pZCk7Ci1pcnFyZXR1cm5fdCB2aWExX2lycShpbnQsIHZvaWQgKik7Ci1pcnFyZXR1cm5fdCB2aWEyX2lycShpbnQsIHZvaWQgKik7Ci1pcnFyZXR1cm5fdCB2aWFfbnVidXNfaXJxKGludCwgdm9pZCAqKTsKIHZvaWQgdmlhX2lycV9lbmFibGUoaW50IGlycSk7CiB2b2lkIHZpYV9pcnFfZGlzYWJsZShpbnQgaXJxKTsKIHZvaWQgdmlhX2lycV9jbGVhcihpbnQgaXJxKTsKQEAgLTI4MSw0MCArMjc5LDExIEBACiAJdmlhMVt2VDFDTF0gPSBNQUNfQ0xPQ0tfTE9XOwogCXZpYTFbdlQxQ0hdID0gTUFDX0NMT0NLX0hJR0g7CiAKLQlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19USU1FUl8xLCBmdW5jLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIGZ1bmMpKQorCWlmIChyZXF1ZXN0X2lycShJUlFfTUFDX1RJTUVSXzEsIGZ1bmMsIDAsICJ0aW1lciIsIGZ1bmMpKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInRpbWVyIik7CiB9CiAKIC8qCi0gKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGRpc3BhdGNoZXJzIGZvciBWSUEgb3IgUkJWIG1hY2hpbmVzIG9ubHkuCi0gKi8KLQotdm9pZCBfX2luaXQgdmlhX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKLXsKLQlpZiAodmlhX2FsdF9tYXBwaW5nKSB7Ci0JCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKLQkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAic29mdHdhcmUiLAotCQkJCSh2b2lkICopIHZpYTEpKQotCQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJzb2Z0d2FyZSIpOwotCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgdmlhMV9pcnEsCi0JCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgInZpYTEiLAotCQkJCSh2b2lkICopIHZpYTEpKQotCQkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2aWExIik7Ci0JfSBlbHNlIHsKLQkJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIHZpYTFfaXJxLAotCQkJCUlSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsICJ2aWExIiwKLQkJCQkodm9pZCAqKSB2aWExKSkKLQkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAidmlhMSIpOwotCX0KLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMiwgdmlhMl9pcnEsIElSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsCi0JCQkidmlhMiIsICh2b2lkICopIHZpYTIpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInZpYTIiKTsKLQlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19OVUJVUywgdmlhX251YnVzX2lycSwKLQkJCUlSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsICJudWJ1cyIsICh2b2lkICopIHZpYTIpKQotCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgIm51YnVzIik7Ci19Ci0KLS8qCiAgKiBEZWJ1Z2dpbmcgZHVtcCwgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyB0byBzZWUgd2hhdCdzIGdvaW5nIG9uLgogICovCiAKQEAgLTQ0Niw0OCArNDE1LDQ2IEBACiAgKiB2aWE2NTIyLmMgOi0pLCBkaXNhYmxlL3BlbmRpbmcgbWFza3MgYWRkZWQuCiAgKi8KIAotaXJxcmV0dXJuX3QgdmlhMV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCB2aWExX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGlycV9udW07CiAJdW5zaWduZWQgY2hhciBpcnFfYml0LCBldmVudHM7CiAKIAlldmVudHMgPSB2aWExW3ZJRlJdICYgdmlhMVt2SUVSXSAmIDB4N0Y7CiAJaWYgKCFldmVudHMpCi0JCXJldHVybiBJUlFfTk9ORTsKKwkJcmV0dXJuOwogCiAJaXJxX251bSA9IFZJQTFfU09VUkNFX0JBU0U7CiAJaXJxX2JpdCA9IDE7CiAJZG8gewogCQlpZiAoZXZlbnRzICYgaXJxX2JpdCkgewogCQkJdmlhMVt2SUZSXSA9IGlycV9iaXQ7Ci0JCQltNjhrX2hhbmRsZV9pbnQoaXJxX251bSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX251bSk7CiAJCX0KIAkJKytpcnFfbnVtOwogCQlpcnFfYml0IDw8PSAxOwogCX0gd2hpbGUgKGV2ZW50cyA+PSBpcnFfYml0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWlycXJldHVybl90IHZpYTJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIHZpYTJfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpbnQgaXJxX251bTsKIAl1bnNpZ25lZCBjaGFyIGlycV9iaXQsIGV2ZW50czsKIAogCWV2ZW50cyA9IHZpYTJbZ0lGUl0gJiB2aWEyW2dJRVJdICYgMHg3RjsKIAlpZiAoIWV2ZW50cykKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm47CiAKIAlpcnFfbnVtID0gVklBMl9TT1VSQ0VfQkFTRTsKIAlpcnFfYml0ID0gMTsKIAlkbyB7CiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQl2aWEyW2dJRlJdID0gaXJxX2JpdCB8IHJidl9jbGVhcjsKLQkJCW02OGtfaGFuZGxlX2ludChpcnFfbnVtKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfbnVtKTsKIAkJfQogCQkrK2lycV9udW07CiAJCWlycV9iaXQgPDw9IDE7CiAJfSB3aGlsZSAoZXZlbnRzID49IGlycV9iaXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogLyoKQEAgLTQ5NSw3ICs0NjIsNyBAQAogICogVklBMiBkaXNwYXRjaGVyIGFzIGEgZmFzdCBpbnRlcnJ1cHQgaGFuZGxlci4KICAqLwogCi1pcnFyZXR1cm5fdCB2aWFfbnVidXNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3ZvaWQgdmlhX251YnVzX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IHNsb3RfaXJxOwogCXVuc2lnbmVkIGNoYXIgc2xvdF9iaXQsIGV2ZW50czsKQEAgLTUwNiw3ICs0NzMsNyBAQAogCWVsc2UKIAkJZXZlbnRzICY9IH52aWEyW3ZEaXJBXTsKIAlpZiAoIWV2ZW50cykKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm47CiAKIAlkbyB7CiAJCXNsb3RfaXJxID0gSVJRX05VQlVTX0Y7CkBAIC01MTQsNyArNDgxLDcgQEAKIAkJZG8gewogCQkJaWYgKGV2ZW50cyAmIHNsb3RfYml0KSB7CiAJCQkJZXZlbnRzICY9IH5zbG90X2JpdDsKLQkJCQltNjhrX2hhbmRsZV9pbnQoc2xvdF9pcnEpOworCQkJCWdlbmVyaWNfaGFuZGxlX2lycShzbG90X2lycSk7CiAJCQl9CiAJCQktLXNsb3RfaXJxOwogCQkJc2xvdF9iaXQgPj49IDE7CkBAIC01MjgsNyArNDk1LDI0IEBACiAJCWVsc2UKIAkJCWV2ZW50cyAmPSB+dmlhMlt2RGlyQV07CiAJfSB3aGlsZSAoZXZlbnRzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGRpc3BhdGNoZXJzIGZvciBWSUEgb3IgUkJWIG1hY2hpbmVzIG9ubHkuCisgKi8KKwordm9pZCBfX2luaXQgdmlhX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKK3sKKwlpZiAodmlhX2FsdF9tYXBwaW5nKSB7CisJCS8qIHNvZnR3YXJlIGludGVycnVwdCAqLworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18xLCB2aWExX2lycSk7CisJCS8qIHZpYTEgaW50ZXJydXB0ICovCisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzYsIHZpYTFfaXJxKTsKKwl9IGVsc2UgeworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfQVVUT18xLCB2aWExX2lycSk7CisJfQorCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElSUV9BVVRPXzIsIHZpYTJfaXJxKTsKKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihJUlFfTUFDX05VQlVTLCB2aWFfbnVidXNfaXJxKTsKIH0KIAogdm9pZCB2aWFfaXJxX2VuYWJsZShpbnQgaXJxKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYyBiL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCmluZGV4IDZjYjljM2EuLjVkZTkyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jCkBAIC04MSw3ICs4MSw3IEBACiAKIHZvaWQgX19pbml0IG12bWUxNDdfaW5pdF9JUlEodm9pZCkKIHsKLQltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5Mik7CiB9CiAKIHZvaWQgX19pbml0IGNvbmZpZ19tdm1lMTQ3KHZvaWQpCkBAIC0xMTQsOCArMTE0LDcgQEAKIHZvaWQgbXZtZTE0N19zY2hlZF9pbml0IChpcnFfaGFuZGxlcl90IHRpbWVyX3JvdXRpbmUpCiB7CiAJdGlja19oYW5kbGVyID0gdGltZXJfcm91dGluZTsKLQlpZiAocmVxdWVzdF9pcnEoUENDX0lSUV9USU1FUjEsIG12bWUxNDdfdGltZXJfaW50LCBJUlFfRkxHX1JFUExBQ0UsCi0JCQkidGltZXIgMSIsIE5VTEwpKQorCWlmIChyZXF1ZXN0X2lycShQQ0NfSVJRX1RJTUVSMSwgbXZtZTE0N190aW1lcl9pbnQsIDAsICJ0aW1lciAxIiwgTlVMTCkpCiAJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50ZXJydXB0XG4iKTsKIAogCS8qIEluaXQgdGhlIGNsb2NrIHdpdGggYSB2YWx1ZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMgYi9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYwppbmRleCAwYjI4ZTI2Li4zMWE2NmQ5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYworKysgYi9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtdm1lMTZ4X2luaXRfSVJRICh2b2lkKQogewotCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7CisJbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTkyKTsKIH0KIAogI2RlZmluZSBwY2MyY2hpcAkoKHZvbGF0aWxlIHVfY2hhciAqKTB4ZmZmNDIwMDApCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcTQwL3E0MGludHMuYyBiL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCmluZGV4IDlmMGUzZDUuLjJiODg4NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCisrKyBiL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCkBAIC0xNSwxMCArMTUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNpbmNsdWRlIDxhc20vcTQwX21hc3Rlci5oPgpAQCAtMzUsMzUgKzM1LDM2IEBACiAqLwogCiBzdGF0aWMgdm9pZCBxNDBfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotc3RhdGljIHZvaWQgcTQwX2VuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIHE0MF9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgcTQwX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKK3N0YXRpYyB2b2lkIHE0MF9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOwogCiB1bnNpZ25lZCBzaG9ydCBxNDBfYWJsZWNvdW50WzM1XTsKIHVuc2lnbmVkIHNob3J0IHE0MF9zdGF0ZVszNV07CiAKLXN0YXRpYyBpbnQgcTQwX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdW5zaWduZWQgaW50IHE0MF9pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCS8qIHRlc3QgZm9yIElTQSBpbnRzIG5vdCBpbXBsZW1lbnRlZCBieSBIVyAqLwogCXN3aXRjaCAoaXJxKSB7CiAJY2FzZSAxOiBjYXNlIDI6IGNhc2UgODogY2FzZSA5OgogCWNhc2UgMTE6IGNhc2UgMTI6IGNhc2UgMTM6CiAJCXByaW50aygiJXM6IElTQSBJUlEgJWQgbm90IGltcGxlbWVudGVkIGJ5IEhXXG4iLCBfX2Z1bmNfXywgaXJxKTsKLQkJcmV0dXJuIC1FTlhJTzsKKwkJLyogRklYTUUgcmV0dXJuIC1FTlhJTzsgKi8KIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHE0MF9pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHE0MF9pcnFfc2h1dGRvd24oc3RydWN0IGlycV9kYXRhICpkYXRhKQogewogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIHE0MF9pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcTQwX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJxNDAiLAotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHE0MF9pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cAk9IHE0MF9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSBxNDBfaXJxX3NodXRkb3duLAotCS5lbmFibGUJCT0gcTQwX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUJPSBxNDBfZGlzYWJsZV9pcnEsCisJLmlycV9zdGFydHVwCT0gcTQwX2lycV9zdGFydHVwLAorCS5pcnFfc2h1dGRvd24JPSBxNDBfaXJxX3NodXRkb3duLAorCS5pcnFfZW5hYmxlCT0gcTQwX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gcTQwX2lycV9kaXNhYmxlLAogfTsKIAogLyoKQEAgLTgxLDEzICs4MiwxNCBAQAogCiB2b2lkIF9faW5pdCBxNDBfaW5pdF9JUlEodm9pZCkKIHsKLQltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZxNDBfaXJxX2NvbnRyb2xsZXIsIDEsIFE0MF9JUlFfTUFYKTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZxNDBfaXJxX2NoaXAsIGhhbmRsZV9zaW1wbGVfaXJxLCAxLAorCQkJCSAgUTQwX0lSUV9NQVgpOwogCiAJLyogc2V0dXAgaGFuZGxlciBmb3IgSVNBIGludHMgKi8KIAltNjhrX3NldHVwX2F1dG9faW50ZXJydXB0KHE0MF9pcnFfaGFuZGxlcik7CiAKLQltNjhrX2lycV9zdGFydHVwKElSUV9BVVRPXzIpOwotCW02OGtfaXJxX3N0YXJ0dXAoSVJRX0FVVE9fNCk7CisJbTY4a19pcnFfc3RhcnR1cF9pcnEoSVJRX0FVVE9fMik7CisJbTY4a19pcnFfc3RhcnR1cF9pcnEoSVJRX0FVVE9fNCk7CiAKIAkvKiBub3cgZW5hYmxlIHNvbWUgaW50cy4uICovCiAJbWFzdGVyX291dGIoMSwgRVhUX0VOQUJMRV9SRUcpOyAgLyogSVNBIElSUSA1LTE1ICovCkBAIC0yMTgsMTEgKzIyMCwxMSBAQAogCXN3aXRjaCAoaXJxKSB7CiAJY2FzZSA0OgogCWNhc2UgNjoKLQkJX19tNjhrX2hhbmRsZV9pbnQoUTQwX0lSUV9TQU1QTEUsIGZwKTsKKwkJZG9fSVJRKFE0MF9JUlFfU0FNUExFLCBmcCk7CiAJCXJldHVybjsKIAl9CiAJaWYgKG1pciAmIFE0MF9JUlFfRlJBTUVfTUFTSykgewotCQlfX202OGtfaGFuZGxlX2ludChRNDBfSVJRX0ZSQU1FLCBmcCk7CisJCWRvX0lSUShRNDBfSVJRX0ZSQU1FLCBmcCk7CiAJCW1hc3Rlcl9vdXRiKC0xLCBGUkFNRV9DTEVBUl9SRUcpOwogCX0KIAlpZiAoKG1pciAmIFE0MF9JUlFfU0VSX01BU0spIHx8IChtaXIgJiBRNDBfSVJRX0VYVF9NQVNLKSkgewpAQCAtMjU3LDcgKzI1OSw3IEBACiAJCQkJCWdvdG8gaWlycTsKIAkJCQl9CiAJCQkJcTQwX3N0YXRlW2lycV0gfD0gSVJRX0lOUFJPR1JFU1M7Ci0JCQkJX19tNjhrX2hhbmRsZV9pbnQoaXJxLCBmcCk7CisJCQkJZG9fSVJRKGlycSwgZnApOwogCQkJCXE0MF9zdGF0ZVtpcnFdICY9IH5JUlFfSU5QUk9HUkVTUzsKIAogCQkJCS8qIG5haXZlbHkgZW5hYmxlIGV2ZXJ5dGhpbmcsIGlmIHRoYXQgZmFpbHMgdGhhbiAgICAqLwpAQCAtMjg4LDI1ICsyOTAsMjkgQEAKIAltaXIgPSBtYXN0ZXJfaW5iKElJUlFfUkVHKTsKIAkvKiBzaG91bGQgdGVzdCB3aGV0aGVyIGtleWJvYXJkIGlycSBpcyByZWFsbHkgZW5hYmxlZCwgZG9pbmcgaXQgaW4gZGVmaGFuZCAqLwogCWlmIChtaXIgJiBRNDBfSVJRX0tFWUJfTUFTSykKLQkJX19tNjhrX2hhbmRsZV9pbnQoUTQwX0lSUV9LRVlCT0FSRCwgZnApOworCQlkb19JUlEoUTQwX0lSUV9LRVlCT0FSRCwgZnApOwogCiAJcmV0dXJuOwogfQogCi12b2lkIHE0MF9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit2b2lkIHE0MF9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZGF0YS0+aXJxOworCiAJaWYgKGlycSA+PSA1ICYmIGlycSA8PSAxNSkgewogCQltZXh0X2Rpc2FibGVkLS07CiAJCWlmIChtZXh0X2Rpc2FibGVkID4gMCkKLQkJCXByaW50aygicTQwX2VuYWJsZV9pcnEgOiBuZXN0ZWQgZGlzYWJsZS9lbmFibGVcbiIpOworCQkJcHJpbnRrKCJxNDBfaXJxX2VuYWJsZSA6IG5lc3RlZCBkaXNhYmxlL2VuYWJsZVxuIik7CiAJCWlmIChtZXh0X2Rpc2FibGVkID09IDApCiAJCQltYXN0ZXJfb3V0YigxLCBFWFRfRU5BQkxFX1JFRyk7CiAJfQogfQogCiAKLXZvaWQgcTQwX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit2b2lkIHE0MF9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycTsKKwogCS8qIGRpc2FibGUgSVNBIGlxcyA6IG9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4KIAkgKiB2ZXJpZmllZCB0byBiZSBRNDAgImNvbXBhdGlibGUiIC0gcmlnaHQgbm93IElERSwgTkUySwogCSAqIEFueSBkcml2ZXIgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHNsZWVwIGFjcm9zcyBkaXNhYmxlX2lycSAhIQpAQCAtMzE5LDEzICszMjUsMyBAQAogCQkJcHJpbnRrKCJkaXNhYmxlX2lycSBuZXN0aW5nIGNvdW50ICVkXG4iLG1leHRfZGlzYWJsZWQpOwogCX0KIH0KLQotdW5zaWduZWQgbG9uZyBxNDBfcHJvYmVfaXJxX29uKHZvaWQpCi17Ci0JcHJpbnRrKCJpcnEgcHJvYmluZyBub3Qgd29ya2luZyAtIHJlY29uZmlndXJlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdGhpc1xuIik7Ci0JcmV0dXJuIC0xOwotfQotaW50IHE0MF9wcm9iZV9pcnFfb2ZmKHVuc2lnbmVkIGxvbmcgaXJxcykKLXsKLQlyZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jIGIvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYwppbmRleCA2NDY0YWQzLi43OGI2MGY1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNpbnRzLmMKQEAgLTUxLDI1ICs1MSwyOSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuM19pbnQ3KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQkqc3VuM19pbnRyZWcgfD0gICgxIDw8IGlycSk7Ci0JaWYgKCEoa3N0YXRfY3B1KDApLmlycXNbaXJxXSAlIDIwMDApKQotCQlzdW4zX2xlZHMobGVkX3BhdHRlcm5bKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAxNjAwMCkgLyAyMDAwXSk7CisJdW5zaWduZWQgaW50IGNudDsKKworCWNudCA9IGtzdGF0X2lycXNfY3B1KGlycSwgMCk7CisJaWYgKCEoY250ICUgMjAwMCkpCisJCXN1bjNfbGVkcyhsZWRfcGF0dGVybltjbnQgJSAxNjAwMCAvIDIwMDBdKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzdW4zX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogeworCXVuc2lnbmVkIGludCBjbnQ7CisKICNpZmRlZiBDT05GSUdfU1VOMwogCWludGVyc2lsX2NsZWFyKCk7CiAjZW5kaWYKLSAgICAgICAgKnN1bjNfaW50cmVnIHw9ICAoMSA8PCBpcnEpOwogI2lmZGVmIENPTkZJR19TVU4zCiAJaW50ZXJzaWxfY2xlYXIoKTsKICNlbmRpZgogCXh0aW1lX3VwZGF0ZSgxKTsKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKLSAgICAgICAgaWYgKCEoa3N0YXRfY3B1KDApLmlycXNbaXJxXSAlIDIwKSkKLSAgICAgICAgICAgICAgICBzdW4zX2xlZHMobGVkX3BhdHRlcm5bKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAxNjApIC8gMjBdKTsKKwljbnQgPSBrc3RhdF9pcnFzX2NwdShpcnEsIDApOworCWlmICghKGNudCAlIDIwKSkKKwkJc3VuM19sZWRzKGxlZF9wYXR0ZXJuW2NudCAlIDE2MCAvIDIwXSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC03OSwyOSArODMsMzMgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjNfaW50aGFuZGxlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3N0YXRpYyB2b2lkIHN1bjNfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0gICAgICAgICpzdW4zX2ludHJlZyAmPSB+KDEgPDwgaXJxKTsKKyAgICBzdW4zX2VuYWJsZV9pcnEoZGF0YS0+aXJxKTsKK307CiAKLQlfX202OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKLX0KK3N0YXRpYyB2b2lkIHN1bjNfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworICAgIHN1bjNfZGlzYWJsZV9pcnEoZGF0YS0+aXJxKTsKK307CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgc3VuM19pcnFfY29udHJvbGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuM19pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAic3VuMyIsCi0JLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoc3VuM19pcnFfY29udHJvbGxlci5sb2NrKSwKLQkuc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCi0JLmVuYWJsZQkJPSBzdW4zX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUJPSBzdW4zX2Rpc2FibGVfaXJxLAorCS5pcnFfc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93bgk9IG02OGtfaXJxX3NodXRkb3duLAorCS5pcnFfZW5hYmxlCT0gc3VuM19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IHN1bjNfaXJxX2Rpc2FibGUsCisJLmlycV9tYXNrCT0gc3VuM19pcnFfZGlzYWJsZSwKKwkuaXJxX3VubWFzawk9IHN1bjNfaXJxX2VuYWJsZSwKIH07CiAKIHZvaWQgX19pbml0IHN1bjNfaW5pdF9JUlEodm9pZCkKIHsKIAkqc3VuM19pbnRyZWcgPSAxOwogCi0JbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdChzdW4zX2ludGhhbmRsZSk7Ci0JbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmc3VuM19pcnFfY29udHJvbGxlciwgSVJRX0FVVE9fMSwgNyk7Ci0JbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTI4LCBOVUxMKTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZzdW4zX2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxLCBJUlFfQVVUT18xLAorCQkJCSAgNyk7CisJbTY4a19zZXR1cF91c2VyX2ludGVycnVwdChWRUNfVVNFUiwgMTI4KTsKIAogCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT181LCBzdW4zX2ludDUsIDAsICJpbnQ1IiwgTlVMTCkpCiAJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAiaW50NSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCBhNTY5NTE0Li4zYTNlNWI4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtMjgsMTIgKzI4LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZG1hLWF0dHJzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLWNvaGVyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2RlZmluZSBETUFfRVJST1JfQ09ERQkJKH4oZG1hX2FkZHJfdCkweDApCiAKICNkZWZpbmUgX19kbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBnZnAsIHNpemUsIGhhbmRsZSkJTlVMTAogI2RlZmluZSBfX2RtYV9mcmVlX2NvaGVyZW50KHNpemUsIGFkZHIpCQkoKHZvaWQpMCkKLSNkZWZpbmUgX19kbWFfc3luYyhhZGRyLCBzaXplLCBydykJCSgodm9pZCkwKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGV2aWNlX3RvX21hc2soc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtOTUsNiArOTUsMjIgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oPgogCitzdGF0aWMgaW5saW5lIHZvaWQgX19kbWFfc3luYyh1bnNpZ25lZCBsb25nIHBhZGRyLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgRE1BX1RPX0RFVklDRToKKwljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQlmbHVzaF9kY2FjaGVfcmFuZ2UocGFkZHIsIHBhZGRyICsgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7CiAJc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOwpAQCAtMTM1LDcgKzE1MSw3IEBACiAJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKLQlfX2RtYV9zeW5jKHZhZGRyLCBzaXplLCAoaW50KWRpcmVjdGlvbik7CisJX19kbWFfc3luYyh2aXJ0X3RvX3BoeXModmFkZHIpLCBzaXplLCAoaW50KWRpcmVjdGlvbik7CiB9CiAKICNlbmRpZgkvKiBfQVNNX01JQ1JPQkxBWkVfRE1BX01BUFBJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDA5OGRmZGQuLjgzNDg0OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTE2LDEzICsxNiwxNSBAQAogICogSSd2ZSBzbmFmZmxlZCB0aGUgdmFsdWUgZnJvbSB0aGUgbWljcm9ibGF6ZSBiaW51dGlscyBzb3VyY2UgY29kZQogICogL2JpbnV0aWxzL21pY3JvYmxhemUvaW5jbHVkZS9lbGYvbWljcm9ibGF6ZS5oCiAgKi8KLSNkZWZpbmUgRU1fWElMSU5YX01JQ1JPQkxBWkUJMHhiYWFiCi0jZGVmaW5lIEVMRl9BUkNICQlFTV9YSUxJTlhfTUlDUk9CTEFaRQorI2RlZmluZSBFTV9NSUNST0JMQVpFCQkxODkKKyNkZWZpbmUgRU1fTUlDUk9CTEFaRV9PTEQJMHhiYWFiCisjZGVmaW5lIEVMRl9BUkNICQlFTV9NSUNST0JMQVpFCiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgogICovCi0jZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpCSgoeCktPmVfbWFjaGluZSA9PSBFTV9YSUxJTlhfTUlDUk9CTEFaRSkKKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkJKCh4KS0+ZV9tYWNoaW5lID09IEVNX01JQ1JPQkxBWkUgXAorCQkJCSB8fCAoeCktPmVfbWFjaGluZSA9PSBFTV9NSUNST0JMQVpFX09MRCkKIAogLyoKICAqIFRoZXNlIGFyZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIGluIHRoZSBjb3JlIGR1bXBzLgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IGU2YTIyODQuLjVhNDMzY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTE3LDggKzE3LDYgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgogCi0jZGVmaW5lIF9fQVJDSF9XQU5UX0lOVEVSUlVQVFNfT05fQ1RYU1cKLQogc3RydWN0IHRhc2tfc3RydWN0Owogc3RydWN0IHRocmVhZF9pbmZvOwogCkBAIC05NiwxMSArOTQsNCBAQAogCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCiAKLS8qCi0gKiBNaWNyb0JsYXplIGRvZXNuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3NlcyBpbiBoYXJkd2FyZS4KLSAqCi0gKiBCYXNlZCBvbiB0aGlzIHdlIGZvcmNlIHRoZSBJUCBoZWFkZXIgYWxpZ25tZW50IGluIG5ldHdvcmsgZHJpdmVycy4KLSAqLwotI2RlZmluZSBORVRfSVBfQUxJR04JMgotCiAjZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA1YmI5NWExLi4wNzJiMDA3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAqICAtICJhZGRyIiwgImFkZHIgKyBzaXplIiBhbmQgInNpemUiIGFyZSBhbGwgYmVsb3cgdGhlIGxpbWl0CiAgKi8KICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpIFwKLQkoZ2V0X2ZzKCkuc2VnID4gKCgodW5zaWduZWQgbG9uZykoYWRkcikpIHwgXAorCShnZXRfZnMoKS5zZWcgPj0gKCgodW5zaWduZWQgbG9uZykoYWRkcikpIHwgXAogCQkoc2l6ZSkgfCAoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgKHNpemUpKSkpCiAKIC8qIHx8IHByaW50aygiYWNjZXNzX29rIGZhaWxlZCBmb3IgJXMgYXQgMHglMDhseCAoc2l6ZSAlZCksIHNlZyAweCUwOHhcbiIsCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKaW5kZXggNDQzOTRkOC4uNTQxOTRiMiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYwpAQCAtMzQsNiArMzQsNyBAQAogCXsiOC4wMC5hIiwgMHgxMn0sCiAJeyI4LjAwLmIiLCAweDEzfSwKIAl7IjguMTAuYSIsIDB4MTR9LAorCXsiOC4yMC5hIiwgMHgxNX0sCiAJe05VTEwsIDB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9kbWEuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZG1hLmMKaW5kZXggMzkzZTZiMi4uNjVhNGFmNCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9kbWEuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2RtYS5jCkBAIC0xMCw4ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogLyoKICAqIEdlbmVyaWMgZGlyZWN0IERNQSBpbXBsZW1lbnRhdGlvbgpAQCAtMjEsMjEgKzIxLDYgQEAKICAqIGNhbiBzZXQgYXJjaGRhdGEuZG1hX2RhdGEgdG8gYW4gdW5zaWduZWQgbG9uZyBob2xkaW5nIHRoZSBvZmZzZXQuIEJ5CiAgKiBkZWZhdWx0IHRoZSBvZmZzZXQgaXMgUENJX0RSQU1fT0ZGU0VULgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kbWFfc3luY19wYWdlKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0Jc3dpdGNoIChkaXJlY3Rpb24pIHsKLQljYXNlIERNQV9UT19ERVZJQ0U6Ci0JY2FzZSBETUFfQklESVJFQ1RJT05BTDoKLQkJZmx1c2hfZGNhY2hlX3JhbmdlKHBhZGRyICsgb2Zmc2V0LCBwYWRkciArIG9mZnNldCArIHNpemUpOwotCQlicmVhazsKLQljYXNlIERNQV9GUk9NX0RFVklDRToKLQkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UocGFkZHIgKyBvZmZzZXQsIHBhZGRyICsgb2Zmc2V0ICsgc2l6ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLX0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTkxLDcgKzc2LDcgQEAKIAkvKiBGSVhNRSB0aGlzIHBhcnQgb2YgY29kZSBpcyB1bnRlc3RlZCAqLwogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKSB7CiAJCXNnLT5kbWFfYWRkcmVzcyA9IHNnX3BoeXMoc2cpICsgZ2V0X2RtYV9kaXJlY3Rfb2Zmc2V0KGRldik7Ci0JCV9fZG1hX3N5bmNfcGFnZShwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpLCBzZy0+b2Zmc2V0LAorCQlfX2RtYV9zeW5jKHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0LAogCQkJCQkJCXNnLT5sZW5ndGgsIGRpcmVjdGlvbik7CiAJfQogCkBAIC0xMTYsNyArMTAxLDcgQEAKIAkJCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCiAJCQkJCSAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0JX19kbWFfc3luY19wYWdlKHBhZ2VfdG9fcGh5cyhwYWdlKSwgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOworCV9fZG1hX3N5bmMocGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOwogCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQgKyBnZXRfZG1hX2RpcmVjdF9vZmZzZXQoZGV2KTsKIH0KIApAQCAtMTMxLDcgKzExNiw2MyBAQAogICogcGh5c190b192aXJ0IGlzIGhlcmUgYmVjYXVzZSBpbiBfX2RtYV9zeW5jX3BhZ2UgaXMgX192aXJ0X3RvX3BoeXMgYW5kCiAgKiBkbWFfYWRkcmVzcyBpcyBwaHlzaWNhbCBhZGRyZXNzCiAgKi8KLQlfX2RtYV9zeW5jX3BhZ2UoZG1hX2FkZHJlc3MsIDAgLCBzaXplLCBkaXJlY3Rpb24pOworCV9fZG1hX3N5bmMoZG1hX2FkZHJlc3MsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX2RpcmVjdF9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwkvKgorCSAqIEl0J3MgcG9pbnRsZXNzIHRvIGZsdXNoIHRoZSBjYWNoZSBhcyB0aGUgbWVtb3J5IHNlZ21lbnQKKwkgKiBpcyBnaXZlbiB0byB0aGUgQ1BVCisJICovCisKKwlpZiAoZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJX19kbWFfc3luYyhkbWFfaGFuZGxlLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9kaXJlY3Rfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCS8qCisJICogSXQncyBwb2ludGxlc3MgdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGUgaWYgdGhlIGRldmljZSBpc24ndAorCSAqIHN1cHBvc2VkIHRvIHdyaXRlIHRvIHRoZSByZWxldmFudCByZWdpb24KKwkgKi8KKworCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJX19kbWFfc3luYyhkbWFfaGFuZGxlLCBzaXplLCBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9kaXJlY3Rfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCS8qIEZJWE1FIHRoaXMgcGFydCBvZiBjb2RlIGlzIHVudGVzdGVkICovCisJaWYgKGRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKQorCQkJX19kbWFfc3luYyhzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX2RpcmVjdF9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZW50cywKKwkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJLyogRklYTUUgdGhpcyBwYXJ0IG9mIGNvZGUgaXMgdW50ZXN0ZWQgKi8KKwlpZiAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKQorCQkJX19kbWFfc3luYyhzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgsIGRpcmVjdGlvbik7CiB9CiAKIHN0cnVjdCBkbWFfbWFwX29wcyBkbWFfZGlyZWN0X29wcyA9IHsKQEAgLTE0Miw2ICsxODMsMTAgQEAKIAkuZG1hX3N1cHBvcnRlZAk9IGRtYV9kaXJlY3RfZG1hX3N1cHBvcnRlZCwKIAkubWFwX3BhZ2UJPSBkbWFfZGlyZWN0X21hcF9wYWdlLAogCS51bm1hcF9wYWdlCT0gZG1hX2RpcmVjdF91bm1hcF9wYWdlLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1CQk9IGRtYV9kaXJlY3Rfc3luY19zaW5nbGVfZm9yX2NwdSwKKwkuc3luY19zaW5nbGVfZm9yX2RldmljZQkJPSBkbWFfZGlyZWN0X3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UsCisJLnN5bmNfc2dfZm9yX2NwdQkJPSBkbWFfZGlyZWN0X3N5bmNfc2dfZm9yX2NwdSwKKwkuc3luY19zZ19mb3JfZGV2aWNlCQk9IGRtYV9kaXJlY3Rfc3luY19zZ19mb3JfZGV2aWNlLAogfTsKIEVYUE9SVF9TWU1CT0woZG1hX2RpcmVjdF9vcHMpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2V4Y2VwdGlvbnMuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jCmluZGV4IDY2ZmFkMjMuLjYzNDhkYzggMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAljYXNlIE1JQ1JPQkxBWkVfRElWX1pFUk9fRVhDRVBUSU9OOgogCQlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCQlwcl9kZWJ1ZygiRGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uIGluIHVzZXIgbW9kZVxuIik7Ci0JCQlfZXhjZXB0aW9uKFNJR0lMTCwgcmVncywgRlBFX0lOVERJViwgYWRkcik7CisJCQlfZXhjZXB0aW9uKFNJR0ZQRSwgcmVncywgRlBFX0lOVERJViwgYWRkcik7CiAJCQlyZXR1cm47CiAJCX0KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGl2aWRlIGJ5IHplcm8gZXhjZXB0aW9uICIgXApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pcnEuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaXJxLmMKaW5kZXggY2U3YWM4NC4uZTVkNjNhOCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2lycS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZGJiODEyNC4uOTVjYzI5NSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE3OSw2ICsxNzksNyBAQAogCiAJdGktPmNwdV9jb250ZXh0Lm1zciA9IChjaGlsZHJlZ3MtPm1zcnxNU1JfVk0pOwogCXRpLT5jcHVfY29udGV4dC5tc3IgJj0gfk1TUl9VTVM7IC8qIHN3aXRjaF90byB0byBrZXJuZWwgbW9kZSAqLworCXRpLT5jcHVfY29udGV4dC5tc3IgJj0gfk1TUl9JRTsKICNlbmRpZgogCXRpLT5jcHVfY29udGV4dC5yMTUgPSAodW5zaWduZWQgbG9uZylyZXRfZnJvbV9mb3JrIC0gODsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNmE4ZTBjYy4uMDQzY2I1OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3B0cmFjZS5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkJcmV0ID0gLTFMOwogCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQotCQlhdWRpdF9zeXNjYWxsX2VudHJ5KEVNX1hJTElOWF9NSUNST0JMQVpFLCByZWdzLT5yMTIsCisJCWF1ZGl0X3N5c2NhbGxfZW50cnkoRU1fTUlDUk9CTEFaRSwgcmVncy0+cjEyLAogCQkJCSAgICByZWdzLT5yNSwgcmVncy0+cjYsCiAJCQkJICAgIHJlZ3MtPnI3LCByZWdzLT5yOCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdGltZXIuYwppbmRleCBlNTU1MGNlLi5hZjc0YjExIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3RpbWVyLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC90aW1lci5jCkBAIC0zMDgsNyArMzA4LDggQEAKIHsKIAlpZiAodGltZXJfaW5pdGlhbGl6ZWQpIHsKIAkJc3RydWN0IGNsb2Nrc291cmNlICpjcyA9ICZjbG9ja3NvdXJjZV9taWNyb2JsYXplOwotCQljeWNsZV90IGN5YyA9IGNudDMyX3RvXzYzKGNzLT5yZWFkKE5VTEwpKTsKKworCQljeWNsZV90IGN5YyA9IGNudDMyX3RvXzYzKGNzLT5yZWFkKE5VTEwpKSAmIExMT05HX01BWDsKIAkJcmV0dXJuIGNsb2Nrc291cmNlX2N5YzJucyhjeWMsIGNzLT5tdWx0LCBjcy0+c2hpZnQpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvbGliL01ha2VmaWxlCmluZGV4IDEwYzMyMGEuLmMxMzA2N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi9NYWtlZmlsZQpAQCAtMjUsNSArMjUsNiBAQAogbGliLXkgKz0gbW9kc2kzLm8KIGxpYi15ICs9IG11bGRpMy5vCiBsaWIteSArPSBtdWxzaTMubworbGliLXkgKz0gdWNtcGRpMi5vCiBsaWIteSArPSB1ZGl2c2kzLm8KIGxpYi15ICs9IHVtb2RzaTMubwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzX29sZC5TIGIvYXJjaC9taWNyb2JsYXplL2xpYi91YWNjZXNzX29sZC5TCmluZGV4IDU4MTBjZWMuLmYwMzcyNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9saWIvdWFjY2Vzc19vbGQuUworKysgYi9hcmNoL21pY3JvYmxhemUvbGliL3VhY2Nlc3Nfb2xkLlMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qCiAgKiBpbnQgX19zdHJuY3B5X3VzZXIoY2hhciAqdG8sIGNoYXIgKmZyb20sIGludCBsZW4pOwpAQCAtMzMsOCArMzQsOCBAQAogCSAqIHIzIC0gdGVtcCBjb3VudAogCSAqIHI0IC0gdGVtcCB2YWwKIAkgKi8KKwliZXFpZAlyNywzZgogCWFkZGlrCXIzLHI3LDAJCS8qIHRlbXBfY291bnQgPSBsZW4gKi8KLQliZXFpCXIzLDNmCiAxOgogCWxidQlyNCxyNixyMAogCXNiCXI0LHI1LHIwCkBAIC03Niw4ICs3Nyw4IEBACiAudHlwZSAgX19zdHJubGVuX3VzZXIsIEBmdW5jdGlvbgogLmFsaWduIDQ7CiBfX3N0cm5sZW5fdXNlcjoKKwliZXFpZAlyNiwzZgogCWFkZGlrCXIzLHI2LDAKLQliZXFpCXIzLDNmCiAxOgogCWxidQlyNCxyNSxyMAogCWJlcWlkCXI0LDJmCQkvKiBicmVhayBvbiBOVUwgKi8KQEAgLTEwMiw2ICsxMDMsNDkgQEAKIAkuc2VjdGlvbglfX2V4X3RhYmxlLCJhIgogCS53b3JkCTFiLDRiCiAKKy8qIExvb3AgdW5yb2xsaW5nIGZvciBfX2NvcHlfdG9mcm9tX3VzZXIgKi8KKyNkZWZpbmUgQ09QWShvZmZzZXQpCVwKKzE6CWx3aQlyNCAsIHI2LCAweDAwMDAgKyBvZmZzZXQ7CVwKKzI6CWx3aQlyMTksIHI2LCAweDAwMDQgKyBvZmZzZXQ7CVwKKzM6CWx3aQlyMjAsIHI2LCAweDAwMDggKyBvZmZzZXQ7CVwKKzQ6CWx3aQlyMjEsIHI2LCAweDAwMEMgKyBvZmZzZXQ7CVwKKzU6CWx3aQlyMjIsIHI2LCAweDAwMTAgKyBvZmZzZXQ7CVwKKzY6CWx3aQlyMjMsIHI2LCAweDAwMTQgKyBvZmZzZXQ7CVwKKzc6CWx3aQlyMjQsIHI2LCAweDAwMTggKyBvZmZzZXQ7CVwKKzg6CWx3aQlyMjUsIHI2LCAweDAwMUMgKyBvZmZzZXQ7CVwKKzk6CXN3aQlyNCAsIHI1LCAweDAwMDAgKyBvZmZzZXQ7CVwKKzEwOglzd2kJcjE5LCByNSwgMHgwMDA0ICsgb2Zmc2V0OwlcCisxMToJc3dpCXIyMCwgcjUsIDB4MDAwOCArIG9mZnNldDsJXAorMTI6CXN3aQlyMjEsIHI1LCAweDAwMEMgKyBvZmZzZXQ7CVwKKzEzOglzd2kJcjIyLCByNSwgMHgwMDEwICsgb2Zmc2V0OwlcCisxNDoJc3dpCXIyMywgcjUsIDB4MDAxNCArIG9mZnNldDsJXAorMTU6CXN3aQlyMjQsIHI1LCAweDAwMTggKyBvZmZzZXQ7CVwKKzE2Oglzd2kJcjI1LCByNSwgMHgwMDFDICsgb2Zmc2V0OwlcCisJLnNlY3Rpb24gX19leF90YWJsZSwiYSI7CQlcCisJLndvcmQJMWIsIDBmOwkJCQlcCisJLndvcmQJMmIsIDBmOwkJCQlcCisJLndvcmQJM2IsIDBmOwkJCQlcCisJLndvcmQJNGIsIDBmOwkJCQlcCisJLndvcmQJNWIsIDBmOwkJCQlcCisJLndvcmQJNmIsIDBmOwkJCQlcCisJLndvcmQJN2IsIDBmOwkJCQlcCisJLndvcmQJOGIsIDBmOwkJCQlcCisJLndvcmQJOWIsIDBmOwkJCQlcCisJLndvcmQJMTBiLCAwZjsJCQlcCisJLndvcmQJMTFiLCAwZjsJCQlcCisJLndvcmQJMTJiLCAwZjsJCQlcCisJLndvcmQJMTNiLCAwZjsJCQlcCisJLndvcmQJMTRiLCAwZjsJCQlcCisJLndvcmQJMTViLCAwZjsJCQlcCisJLndvcmQJMTZiLCAwZjsJCQlcCisJLnRleHQKKworI2RlZmluZSBDT1BZXzgwKG9mZnNldCkJXAorCUNPUFkoMHgwMCArIG9mZnNldCk7XAorCUNPUFkoMHgyMCArIG9mZnNldCk7XAorCUNPUFkoMHg0MCArIG9mZnNldCk7XAorCUNPUFkoMHg2MCArIG9mZnNldCk7CisKIC8qCiAgKiBpbnQgX19jb3B5X3RvZnJvbV91c2VyKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgbGVuKQogICogUmV0dXJuOgpAQCAtMTE5LDM0ICsxNjMsNzkgQEAKIAkgKiByNywgcjMgLSBjb3VudAogCSAqIHI0IC0gdGVtcHZhbAogCSAqLwotCWJlcWlkCXI3LCAzZiAvKiB6ZXJvIHNpemUgaXMgbm90IGxpa2VseSAqLwotCWFuZGkJcjMsIHI3LCAweDMgLyogZmlsdGVyIGFkZCBjb3VudCAqLwotCWJuZWlkCXIzLCA0ZiAvKiBpZiBpcyBvZGQgdmFsdWUgdGhlbiBieXRlIGNvcHlpbmcgKi8KKwliZXFpZAlyNywgMGYgLyogemVybyBzaXplIGlzIG5vdCBsaWtlbHkgKi8KIAlvcglyMywgcjUsIHI2IC8qIGZpbmQgaWYgaXMgYW55IHRvL2Zyb20gdW5hbGlnbmVkICovCi0JYW5kaQlyMywgcjMsIDB4MyAvKiBtYXNrIHVuYWxpZ25lZCAqLwotCWJuZWlkCXIzLCAxZiAvKiBpdCBpcyB1bmFsaWduZWQgLT4gdGhlbiBqdW1wICovCisJb3IJcjMsIHIzLCByNyAvKiBmaW5kIGlmIGNvdW50IGlzIHVuYWxpZ25lZCAqLworCWFuZGkJcjMsIHIzLCAweDMgLyogbWFzayBsYXN0IDMgYml0cyAqLworCWJuZWlkCXIzLCBidTEgLyogaWYgcjMgaXMgbm90IHplcm8gdGhlbiBieXRlIGNvcHlpbmcgKi8KIAlvcglyMywgcjAsIHIwCiAKLS8qIGF0IGxlYXN0IG9uZSA0IGJ5dGUgY29weSAqLwotNToJbHcJcjQsIHI2LCByMwotNjoJc3cJcjQsIHI1LCByMworCXJzdWJpCXIzLCByNywgUEFHRV9TSVpFIC8qIGRldGVjdCBQQUdFX1NJWkUgKi8KKwliZXFpZAlyMywgcGFnZTsKKwlvcglyMywgcjAsIHIwCisKK3cxOglsdwlyNCwgcjYsIHIzIC8qIGF0IGxlYXN0IG9uZSA0IGJ5dGUgY29weSAqLwordzI6CXN3CXI0LCByNSwgcjMKIAlhZGRpawlyNywgcjcsIC00Ci0JYm5laWQJcjcsIDViCisJYm5laWQJcjcsIHcxCiAJYWRkaWsJcjMsIHIzLCA0CiAJYWRkaWsJcjMsIHI3LCAwCiAJcnRzZAlyMTUsIDgKIAlub3AKLTQ6CW9yCXIzLCByMCwgcjAKLTE6CWxidQlyNCxyNixyMwotMjoJc2IJcjQscjUscjMKKworCS5zZWN0aW9uCV9fZXhfdGFibGUsImEiCisJLndvcmQJdzEsIDBmOworCS53b3JkCXcyLCAwZjsKKwkudGV4dAorCisuYWxpZ24gNCAvKiBBbGlnbm1lbnQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaWNhY2hlIGhhcHB5ICovCitwYWdlOgkvKiBDcmVhdGUgcm9vbSBvbiBzdGFjayBhbmQgc2F2ZSByZWdpc3RlcnMgZm9yIHN0b3JpZ24gdmFsdWVzICovCisJYWRkaWsgICByMSwgcjEsIC0zMgorCXN3aQlyMTksIHIxLCA0CisJc3dpCXIyMCwgcjEsIDgKKwlzd2kJcjIxLCByMSwgMTIKKwlzd2kJcjIyLCByMSwgMTYKKwlzd2kJcjIzLCByMSwgMjAKKwlzd2kJcjI0LCByMSwgMjQKKwlzd2kJcjI1LCByMSwgMjgKK2xvb3A6CS8qIHI0LCByMTksIHIyMCwgcjIxLCByMjIsIHIyMywgcjI0LCByMjUgYXJlIHVzZWQgZm9yIHN0b3JpbmcgdmFsdWVzICovCisJLyogTG9vcCB1bnJvbGxpbmcgdG8gZ2V0IHBlcmZvcm1hbmNlIGJvb3N0ICovCisJQ09QWV84MCgweDAwMCk7CisJQ09QWV84MCgweDA4MCk7CisJQ09QWV84MCgweDEwMCk7CisJQ09QWV84MCgweDE4MCk7CisJLyogY29weSBsb29wICovCisJYWRkaWsJcjYsIHI2LCAweDIwMAorCWFkZGlrCXI3LCByNywgLTB4MjAwCisJYm5laWQJcjcsIGxvb3AKKwlhZGRpawlyNSwgcjUsIDB4MjAwCisJLyogUmVzdG9yZSByZWdpc3RlciBjb250ZW50ICovCisJbHdpCXIxOSwgcjEsIDQKKwlsd2kJcjIwLCByMSwgOAorCWx3aQlyMjEsIHIxLCAxMgorCWx3aQlyMjIsIHIxLCAxNgorCWx3aQlyMjMsIHIxLCAyMAorCWx3aQlyMjQsIHIxLCAyNAorCWx3aQlyMjUsIHIxLCAyOAorCWFkZGlrICAgcjEsIHIxLCAzMgorCS8qIHJldHVybiBiYWNrICovCisJYWRkaWsJcjMsIHI3LCAwCisJcnRzZAlyMTUsIDgKKwlub3AKKworLmFsaWduIDQgLyogQWxpZ25tZW50IGlzIGltcG9ydGFudCB0byBrZWVwIGljYWNoZSBoYXBweSAqLworYnUxOglsYnUJcjQscjYscjMKK2J1MjoJc2IJcjQscjUscjMKIAlhZGRpawlyNyxyNywtMQotCWJuZWlkCXI3LDFiCisJYm5laWQJcjcsYnUxCiAJYWRkaWsJcjMscjMsMQkJLyogZGVsYXkgc2xvdCAqLwotMzoKKzA6CiAJYWRkaWsJcjMscjcsMAogCXJ0c2QJcjE1LDgKIAlub3AKIAkuc2l6ZSAgIF9fY29weV90b2Zyb21fdXNlciwgLiAtIF9fY29weV90b2Zyb21fdXNlcgogCiAJLnNlY3Rpb24JX19leF90YWJsZSwiYSIKLQkud29yZAkxYiwzYiwyYiwzYiw1YiwzYiw2YiwzYgorCS53b3JkCWJ1MSwgMGI7CisJLndvcmQJYnUyLCAwYjsKKwkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi91Y21wZGkyLmMgYi9hcmNoL21pY3JvYmxhemUvbGliL3VjbXBkaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2NhMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi91Y21wZGkyLmMKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibGliZ2NjLmgiCisKK3dvcmRfdHlwZSBfX3VjbXBkaTIodW5zaWduZWQgbG9uZyBsb25nIGEsIHVuc2lnbmVkIGxvbmcgbG9uZyBiKQoreworCWNvbnN0IERXdW5pb24gYXUgPSB7LmxsID0gYX07CisJY29uc3QgRFd1bmlvbiBidSA9IHsubGwgPSBifTsKKworCWlmICgodW5zaWduZWQgaW50KSBhdS5zLmhpZ2ggPCAodW5zaWduZWQgaW50KSBidS5zLmhpZ2gpCisJCXJldHVybiAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMuaGlnaCA+ICh1bnNpZ25lZCBpbnQpIGJ1LnMuaGlnaCkKKwkJcmV0dXJuIDI7CisJaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMubG93IDwgKHVuc2lnbmVkIGludCkgYnUucy5sb3cpCisJCXJldHVybiAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMubG93ID4gKHVuc2lnbmVkIGludCkgYnUucy5sb3cpCisJCXJldHVybiAyOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChfX3VjbXBkaTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYyBiL2FyY2gvbWljcm9ibGF6ZS9tbS9pbml0LmMKaW5kZXggMzZhMTMzZS4uNTY1ZDE5MyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL21tL2luaXQuYworKysgYi9hcmNoL21pY3JvYmxhemUvbW0vaW5pdC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL2lvbWFwLmMgYi9hcmNoL21pY3JvYmxhemUvcGNpL2lvbWFwLmMKaW5kZXggM2ZiZjE2Zi4uNTdhY2RhOCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL3BjaS9pb21hcC5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvaW9tYXAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCmluZGV4IDRjZmFlMjAuLmRiODQxYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDRjYmM2ZDguLmQ0NmYxZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC00Nyw2ICs0Nyw4IEBACiAJc2VsZWN0IEdFTkVSSUNfR1BJTwogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfWkJPT1QKKwlzZWxlY3QgVVNCX0FSQ0hfSEFTX09IQ0kKKwlzZWxlY3QgVVNCX0FSQ0hfSEFTX0VIQ0kKIAogY29uZmlnIEFSNwogCWJvb2wgIlRleGFzIEluc3RydW1lbnRzIEFSNyIKQEAgLTIwNiw2ICsyMDgsNyBAQAogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCXNlbGVjdCBIQVZFX1BXTQogCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAKIGNvbmZpZyBMQU5USVEKIAlib29sICJMYW50aXEgYmFzZWQgcGxhdGZvcm1zIgpAQCAtODE3LDEwICs4MjAsNiBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAotY29uZmlnIEFSQ0hfU1VQUE9SVFNfT1BST0ZJTEUKLQlib29sCi0JZGVmYXVsdCB5IGlmICFNSVBTX01UX1NNVEMKLQogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTIwOTIsNyArMjA5MSw3IEBACiAKIGNvbmZpZyBIV19QRVJGX0VWRU5UUwogCWJvb2wgIkVuYWJsZSBoYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIHBlcmYgZXZlbnRzIgotCWRlcGVuZHMgb24gUEVSRl9FVkVOVFMgJiYgIU1JUFNfTVRfU01UQyAmJiBPUFJPRklMRT1uICYmIENQVV9NSVBTMzIKKwlkZXBlbmRzIG9uIFBFUkZfRVZFTlRTICYmICFNSVBTX01UX1NNVEMgJiYgT1BST0ZJTEU9biAmJiAoQ1BVX01JUFMzMiB8fCBDUFVfTUlQUzY0IHx8IENQVV9SMTAwMDAgfHwgQ1BVX1NCMSB8fCBDUFVfQ0FWSVVNX09DVEVPTikKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBFbmFibGUgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBwZXJmIGV2ZW50cy4gSWYKQEAgLTIyNTIsMTYgKzIyNTEsNiBAQAogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLnByZWVtcHQiCiAKLWNvbmZpZyBNSVBTX0lOU0FORV9MQVJHRQotCWJvb2wgIlN1cHBvcnQgZm9yIGxhcmdlIDY0LWJpdCBjb25maWd1cmF0aW9ucyIKLQlkZXBlbmRzIG9uIENQVV9SMTAwMDAgJiYgNjRCSVQKLQloZWxwCi0JICBNSVBTIFIxMDAwMCBkb2VzIHN1cHBvcnQgYSA0NCBiaXQgLyAxNlRCIGFkZHJlc3Mgc3BhY2UgYXMgb3Bwb3NlZCB0bwotCSAgcHJldmlvdXMgNjQtYml0IHByb2Nlc3NvcnMgd2hpY2ggb25seSBzdXBwb3J0ZWQgNDAgYml0IC8gMVRCLiBJZiB5b3UKLQkgIG5lZWQgcHJvY2Vzc2VzIG9mIG1vcmUgdGhhbiAxVEIgdmlydHVhbCBhZGRyZXNzIHNwYWNlLCBzYXkgWSBoZXJlLgotCSAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhZGRpdGlvbmFsIG1lbW9yeSB1c2FnZSwgc28gaXQgaXMgbm90Ci0JICByZWNvbW1lbmRlZCBmb3Igbm9ybWFsIHVzZXJzLgotCiBjb25maWcgS0VYRUMKIAlib29sICJLZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDUzZTM1MTQuLjBiZTMxODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTIyNiw3ICsyMjYsNyBAQAogaWZkZWYgQ09ORklHX01JUFMKIENIRUNLRkxBR1MgKz0gJChzaGVsbCAkKENDKSAkKEtCVUlMRF9DRkxBR1MpIC1kTSAtRSAteGMgL2Rldi9udWxsIHwgXAogCWVncmVwIC12dyAnX19HTlVDXyh8TUlOT1JffFBBVENITEVWRUxfKV8nIHwgXAotCXNlZCAtZSAncy9eXCNkZWZpbmUgLy1ELycgLWUgInMvIC89Jy8iIC1lICJzLyQkLycvIikKKwlzZWQgLWUgInMvXlwjZGVmaW5lIC8tRCcvIiAtZSAicy8gLyc9Jy8iIC1lICJzLyQkLycvIikKIGlmZGVmIENPTkZJR182NEJJVAogQ0hFQ0tGTEFHUwkJKz0gLW02NAogZW5kaWYKQEAgLTI4NiwxNiArMjg2LDE4IEBACiBhcmNocHJlcGFyZToKIGlmZGVmIENPTkZJR19NSVBTMzJfTjMyCiAJQGVjaG8gJyAgQ2hlY2tpbmcgbWlzc2luZy1zeXNjYWxscyBmb3IgTjMyJwotCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4gbWlzc2luZy1zeXNjYWxscyBjY2ZsYWdzLXk9Ii1tYWJpPW4zMiIKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0uIG1pc3Npbmctc3lzY2FsbHMgbWlzc2luZ19zeXNjYWxsc19mbGFncz0iLW1hYmk9bjMyIgogZW5kaWYKIGlmZGVmIENPTkZJR19NSVBTMzJfTzMyCiAJQGVjaG8gJyAgQ2hlY2tpbmcgbWlzc2luZy1zeXNjYWxscyBmb3IgTzMyJwotCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4gbWlzc2luZy1zeXNjYWxscyBjY2ZsYWdzLXk9Ii1tYWJpPTMyIgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4gbWlzc2luZy1zeXNjYWxscyBtaXNzaW5nX3N5c2NhbGxzX2ZsYWdzPSItbWFiaT0zMiIKIGVuZGlmCiAKIGluc3RhbGw6CiAJJChRKWluc3RhbGwgLUQgLW0gNzU1IHZtbGludXggJChJTlNUQUxMX1BBVEgpL3ZtbGludXgtJChLRVJORUxSRUxFQVNFKQoraWZkZWYgQ09ORklHX1NZU19TVVBQT1JUU19aQk9PVAogCSQoUSlpbnN0YWxsIC1EIC1tIDc1NSB2bWxpbnV6ICQoSU5TVEFMTF9QQVRIKS92bWxpbnV6LSQoS0VSTkVMUkVMRUFTRSkKK2VuZGlmCiAJJChRKWluc3RhbGwgLUQgLW0gNjQ0IC5jb25maWcgJChJTlNUQUxMX1BBVEgpL2NvbmZpZy0kKEtFUk5FTFJFTEVBU0UpCiAJJChRKWluc3RhbGwgLUQgLW0gNjQ0IFN5c3RlbS5tYXAgJChJTlNUQUxMX1BBVEgpL1N5c3RlbS5tYXAtJChLRVJORUxSRUxFQVNFKQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnIGIvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZwppbmRleCAyY2NmZDRhLi4yYTY4YmU2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKQEAgLTE4LDIwICsxOCwyMCBAQAogCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCiBjb25maWcgTUlQU19CT1NQT1JVUwogCWJvb2wgIkFsY2hlbXkgQm9zcG9ydXMgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAogY29uZmlnIE1JUFNfREIxMDAwCiAJYm9vbCAiQWxjaGVteSBEQjEwMDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTEwMDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtMzksMTQgKzM5LDE0IEBACiAKIGNvbmZpZyBNSVBTX0RCMTEwMAogCWJvb2wgIkFsY2hlbXkgREIxMTAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMTAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAKIGNvbmZpZyBNSVBTX0RCMTIwMAogCWJvb2wgIkFsY2hlbXkgREIxMjAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMjAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX0NPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KQEAgLTU0LDcgKzU0LDcgQEAKIAogY29uZmlnIE1JUFNfREIxNTAwCiAJYm9vbCAiQWxjaGVteSBEQjE1MDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCkBAIC02NCw3ICs2NCw3IEBACiAKIGNvbmZpZyBNSVBTX0RCMTU1MAogCWJvb2wgIkFsY2hlbXkgREIxNTUwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxNTUwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQpAQCAtNzQsMTMgKzc0LDEzIEBACiBjb25maWcgTUlQU19NSVJBR0UKIAlib29sICJBbGNoZW15IE1pcmFnZSBib2FyZCIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCiBjb25maWcgTUlQU19QQjEwMDAKIAlib29sICJBbGNoZW15IFBCMTAwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTAwMAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKQEAgLTg5LDcgKzg5LDcgQEAKIAogY29uZmlnIE1JUFNfUEIxMTAwCiAJYm9vbCAiQWxjaGVteSBQQjExMDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTExMDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCkBAIC05OCw3ICs5OCw3IEBACiAKIGNvbmZpZyBNSVBTX1BCMTIwMAogCWJvb2wgIkFsY2hlbXkgUEIxMjAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMjAwCisJc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTEwMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KQEAgLTEwNiw3ICsxMDYsNyBAQAogCiBjb25maWcgTUlQU19QQjE1MDAKIAlib29sICJBbGNoZW15IFBCMTUwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTUwMAorCXNlbGVjdCBBTENIRU1ZX0dQSU9JTlRfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogY29uZmlnIE1JUFNfUEIxNTUwCiAJYm9vbCAiQWxjaGVteSBQQjE1NTAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1NTAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCkBAIC0xMjQsMTMgKzEyNCwxMyBAQAogY29uZmlnIE1JUFNfWFhTMTUwMAogCWJvb2wgIk15Q2FibGUgWFhTMTUwMCBib2FyZCIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCiBjb25maWcgTUlQU19HUFIKIAlib29sICJUcmFwZXplIElUUyBHUFIgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1NTAKKwlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCkBAIC0xMzgsMjMgKzEzOCwzIEBACiAJc2VsZWN0IFNZU19IQVNfRUFSTFlfUFJJTlRLCiAKIGVuZGNob2ljZQotCi1jb25maWcgU09DX0FVMTAwMAotCWJvb2wKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAotCi1jb25maWcgU09DX0FVMTEwMAotCWJvb2wKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAotCi1jb25maWcgU09DX0FVMTUwMAotCWJvb2wKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAotCi1jb25maWcgU09DX0FVMTU1MAotCWJvb2wKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMAotCi1jb25maWcgU09DX0FVMTIwMAotCWJvb2wKLQlzZWxlY3QgQUxDSEVNWV9HUElPSU5UX0FVMTAwMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL01ha2VmaWxlCmluZGV4IDI3ODExZmUuLjgxMWVjZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKQEAgLTEyLDkgKzEyLDUgQEAKIAogIyBvcHRpb25hbCBncGlvbGliIHN1cHBvcnQKIGlmZXEgKCQoQ09ORklHX0FMQ0hFTVlfR1BJT19JTkRJUkVDVCksKQotIGlmZXEgKCQoQ09ORklHX0dQSU9MSUIpLHkpCi0gIG9iai0kKENPTkZJR19BTENIRU1ZX0dQSU9JTlRfQVUxMDAwKSArPSBncGlvbGliLWF1MTAwMC5vCi0gZW5kaWYKKyBvYmotJChDT05GSUdfR1BJT0xJQikgKz0gZ3Bpb2xpYi5vCiBlbmRpZgotCi1vYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMKaW5kZXggM2E1YWJiNS4uMGU2M2VlNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMKQEAgLTQwLDggKzQwLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKLQogLyoKICAqIFRoZSBEZXNjcmlwdG9yIEJhc2VkIERNQSBzdXBwb3J0cyB1cCB0byAxNiBjaGFubmVscy4KICAqCkBAIC02MiwxMjAgKzYwLDk2IEBACiAJCQkoZGJkbWFfZ2xvYmFsX3QgKilLU0VHMUFERFIoQVUxNTUwX0RCRE1BX0NPTkZfUEhZU19BRERSKTsKIHN0YXRpYyBpbnQgZGJkbWFfaW5pdGlhbGl6ZWQ7CiAKLXN0YXRpYyBkYmRldl90YWJfdCBkYmRldl90YWJbXSA9IHsKLSNpZmRlZiBDT05GSUdfU09DX0FVMTU1MAorc3RhdGljIGRiZGV2X3RhYl90ICpkYmRldl90YWI7CisKK3N0YXRpYyBkYmRldl90YWJfdCBhdTE1NTBfZGJkZXZfdGFiW10gX19pbml0ZGF0YSA9IHsKIAkvKiBVQVJUUyAqLwotCXsgRFNDUl9DTUQwX1VBUlQwX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExMTAwMDA0LCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVUFSVDBfUlgsIERFVl9GTEFHU19JTiwgMCwgOCwgMHgxMTEwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQzX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExNDAwMDA0LCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVUFSVDNfUlgsIERFVl9GTEFHU19JTiwgMCwgOCwgMHgxMTQwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUMF9UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTEwMDAwNCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUMF9SWCwgREVWX0ZMQUdTX0lOLCAgMCwgOCwgMHgxMTEwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUM19UWCwgREVWX0ZMQUdTX09VVCwgMCwgOCwgMHgxMTQwMDAwNCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUM19SWCwgREVWX0ZMQUdTX0lOLCAgMCwgOCwgMHgxMTQwMDAwMCwgMCwgMCB9LAogCiAJLyogRVhUIERNQSAqLwotCXsgRFNDUl9DTUQwX0RNQV9SRVEwLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfRE1BX1JFUTEsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9ETUFfUkVRMiwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0RNQV9SRVEzLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVEwLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVExLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVEyLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVEzLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCiAKIAkvKiBVU0IgREVWICovCi0JeyBEU0NSX0NNRDBfVVNCREVWX1JYMCwgREVWX0ZMQUdTX0lOLCA0LCA4LCAweDEwMjAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVVNCREVWX1RYMCwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDIwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VTQkRFVl9UWDEsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTAyMDAwMDgsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9VU0JERVZfVFgyLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwMjAwMDBjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVVNCREVWX1JYMywgREVWX0ZMQUdTX0lOLCA0LCA4LCAweDEwMjAwMDEwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVVNCREVWX1JYNCwgREVWX0ZMQUdTX0lOLCA0LCA4LCAweDEwMjAwMDE0LCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9SWDAsIERFVl9GTEFHU19JTiwgIDQsIDgsIDB4MTAyMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1RYMCwgREVWX0ZMQUdTX09VVCwgNCwgOCwgMHgxMDIwMDAwNCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfVFgxLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwMjAwMDA4LCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9UWDIsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTAyMDAwMGMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1JYMywgREVWX0ZMQUdTX0lOLCAgNCwgOCwgMHgxMDIwMDAxMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfUlg0LCBERVZfRkxBR1NfSU4sICA0LCA4LCAweDEwMjAwMDE0LCAwLCAwIH0sCiAKLQkvKiBQU0MgMCAqLwotCXsgRFNDUl9DTUQwX1BTQzBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTFhMDAwMWMsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9QU0MwX1JYLCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MTFhMDAwMWMsIDAsIDAgfSwKKwkvKiBQU0NzICovCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTFhMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfUFNDMF9SWCwgREVWX0ZMQUdTX0lOLCAgMCwgMCwgMHgxMWEwMDAxYywgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9QU0MxX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDExYjAwMDFjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzFfUlgsIERFVl9GTEFHU19JTiwgIDAsIDAsIDB4MTFiMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9UWCwgREVWX0ZMQUdTX09VVCwgMCwgMCwgMHgxMGEwMDAxYywgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1JYLCBERVZfRkxBR1NfSU4sICAwLCAwLCAweDEwYTAwMDFjLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX1BTQzNfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTBiMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfUFNDM19SWCwgREVWX0ZMQUdTX0lOLCAgMCwgMCwgMHgxMGIwMDAxYywgMCwgMCB9LAogCi0JLyogUFNDIDEgKi8KLQl7IERTQ1JfQ01EMF9QU0MxX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDExYjAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMV9SWCwgREVWX0ZMQUdTX0lOLCAwLCAwLCAweDExYjAwMDFjLCAwLCAwIH0sCi0KLQkvKiBQU0MgMiAqLwotCXsgRFNDUl9DTUQwX1BTQzJfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MTBhMDAwMWMsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9QU0MyX1JYLCBERVZfRkxBR1NfSU4sIDAsIDAsIDB4MTBhMDAwMWMsIDAsIDAgfSwKLQotCS8qIFBTQyAzICovCi0JeyBEU0NSX0NNRDBfUFNDM19UWCwgREVWX0ZMQUdTX09VVCwgMCwgMCwgMHgxMGIwMDAxYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1BTQzNfUlgsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgxMGIwMDAxYywgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfUENJX1dSSVRFLCAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCS8qIFBDSSAqLwotCXsgRFNDUl9DTUQwX05BTkRfRkxBU0gsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwJLyogTkFORCAqLworCXsgQVUxNTUwX0RTQ1JfQ01EMF9QQ0lfV1JJVEUsICAwLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sICAvKiBQQ0kgKi8KKwl7IEFVMTU1MF9EU0NSX0NNRDBfTkFORF9GTEFTSCwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LCAvKiBOQU5EICovCiAKIAkvKiBNQUMgMCAqLwotCXsgRFNDUl9DTUQwX01BQzBfUlgsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX01BQzBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTU1MF9EU0NSX0NNRDBfTUFDMF9SWCwgREVWX0ZMQUdTX0lOLCAgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxNTUwX0RTQ1JfQ01EMF9NQUMwX1RYLCBERVZfRkxBR1NfT1VULCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCiAKIAkvKiBNQUMgMSAqLwotCXsgRFNDUl9DTUQwX01BQzFfUlgsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX01BQzFfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQotI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxNTUwICovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCXsgRFNDUl9DTUQwX1VBUlQwX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExMTAwMDA0LCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVUFSVDBfUlgsIERFVl9GTEFHU19JTiwgMCwgOCwgMHgxMTEwMDAwMCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1VBUlQxX1RYLCBERVZfRkxBR1NfT1VULCAwLCA4LCAweDExMjAwMDA0LCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfVUFSVDFfUlgsIERFVl9GTEFHU19JTiwgMCwgOCwgMHgxMTIwMDAwMCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfRE1BX1JFUTAsIDAsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9ETUFfUkVRMSwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfTUFFX0JFLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfTUFFX0ZFLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfTUFFX0JPVEgsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9MQ0QsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX1NETVNfVFgwLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwNjAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfU0RNU19SWDAsIERFVl9GTEFHU19JTiwgNCwgOCwgMHgxMDYwMDAwNCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1NETVNfVFgxLCBERVZfRkxBR1NfT1VULCA0LCA4LCAweDEwNjgwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfU0RNU19SWDEsIERFVl9GTEFHU19JTiwgNCwgOCwgMHgxMDY4MDAwNCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfQUVTX1JYLCBERVZfRkxBR1NfSU4gLCA0LCAzMiwgMHgxMDMwMDAwOCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0FFU19UWCwgREVWX0ZMQUdTX09VVCwgNCwgMzIsIDB4MTAzMDAwMDQsIDAsIDAgfSwKLQotCXsgRFNDUl9DTUQwX1BTQzBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDE2LCAweDExYTAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMF9SWCwgREVWX0ZMQUdTX0lOLCAwLCAxNiwgMHgxMWEwMDAxYywgMCwgMCB9LAotCXsgRFNDUl9DTUQwX1BTQzBfU1lOQywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfUFNDMV9UWCwgREVWX0ZMQUdTX09VVCwgMCwgMTYsIDB4MTFiMDAwMWMsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9QU0MxX1JYLCBERVZfRkxBR1NfSU4sIDAsIDE2LCAweDExYjAwMDFjLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfUFNDMV9TWU5DLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0KLQl7IERTQ1JfQ01EMF9DSU1fUlhBLCBERVZfRkxBR1NfSU4sIDAsIDMyLCAweDE0MDA0MDIwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfQ0lNX1JYQiwgREVWX0ZMQUdTX0lOLCAwLCAzMiwgMHgxNDAwNDA0MCwgMCwgMCB9LAotCXsgRFNDUl9DTUQwX0NJTV9SWEMsIERFVl9GTEFHU19JTiwgMCwgMzIsIDB4MTQwMDQwNjAsIDAsIDAgfSwKLQl7IERTQ1JfQ01EMF9DSU1fU1lOQywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAotCi0JeyBEU0NSX0NNRDBfTkFORF9GTEFTSCwgREVWX0ZMQUdTX0lOLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0KLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTIwMCAqLworCXsgQVUxNTUwX0RTQ1JfQ01EMF9NQUMxX1JYLCBERVZfRkxBR1NfSU4sICAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTE1NTBfRFNDUl9DTUQwX01BQzFfVFgsIERFVl9GTEFHU19PVVQsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKIAogCXsgRFNDUl9DTUQwX1RIUk9UVExFLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0JeyBEU0NSX0NNRDBfQUxXQVlTLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCi0KLQkvKiBQcm92aWRlIDE2IHVzZXIgZGVmaW5hYmxlIGRldmljZSB0eXBlcyAqLwotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLQl7IH4wLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0JeyB+MCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotCXsgfjAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKwl7IERTQ1JfQ01EMF9BTFdBWVMsICAgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAogfTsKIAotI2RlZmluZSBEQkRFVl9UQUJfU0laRQlBUlJBWV9TSVpFKGRiZGV2X3RhYikKK3N0YXRpYyBkYmRldl90YWJfdCBhdTEyMDBfZGJkZXZfdGFiW10gX19pbml0ZGF0YSA9IHsKKwl7IEFVMTIwMF9EU0NSX0NNRDBfVUFSVDBfVFgsIERFVl9GTEFHU19PVVQsIDAsIDgsIDB4MTExMDAwMDQsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfVUFSVDBfUlgsIERFVl9GTEFHU19JTiwgIDAsIDgsIDB4MTExMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfVUFSVDFfVFgsIERFVl9GTEFHU19PVVQsIDAsIDgsIDB4MTEyMDAwMDQsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfVUFSVDFfUlgsIERFVl9GTEFHU19JTiwgIDAsIDgsIDB4MTEyMDAwMDAsIDAsIDAgfSwKIAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMCwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMSwgMCwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCisJeyBBVTEyMDBfRFNDUl9DTUQwX01BRV9CRSwgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9NQUVfRkUsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfTUFFX0JPVEgsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfTENELCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisKKwl7IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDAsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTA2MDAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDAsIERFVl9GTEFHU19JTiwgIDQsIDgsIDB4MTA2MDAwMDQsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDEsIERFVl9GTEFHU19PVVQsIDQsIDgsIDB4MTA2ODAwMDAsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDEsIERFVl9GTEFHU19JTiwgIDQsIDgsIDB4MTA2ODAwMDQsIDAsIDAgfSwKKworCXsgQVUxMjAwX0RTQ1JfQ01EMF9BRVNfUlgsIERFVl9GTEFHU19JTiAsIDQsIDMyLCAweDEwMzAwMDA4LCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX0FFU19UWCwgREVWX0ZMQUdTX09VVCwgNCwgMzIsIDB4MTAzMDAwMDQsIDAsIDAgfSwKKworCXsgQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1RYLCAgIERFVl9GTEFHU19PVVQsIDAsIDE2LCAweDExYTAwMDFjLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfUlgsICAgREVWX0ZMQUdTX0lOLCAgMCwgMTYsIDB4MTFhMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9TWU5DLCBERVZfRkxBR1NfQU5ZVVNFLCAwLCAwLCAweDAwMDAwMDAwLCAwLCAwIH0sCisJeyBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfVFgsICAgREVWX0ZMQUdTX09VVCwgMCwgMTYsIDB4MTFiMDAwMWMsIDAsIDAgfSwKKwl7IEFVMTIwMF9EU0NSX0NNRDBfUFNDMV9SWCwgICBERVZfRkxBR1NfSU4sICAwLCAxNiwgMHgxMWIwMDAxYywgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1NZTkMsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKworCXsgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fUlhBLCAgREVWX0ZMQUdTX0lOLCAwLCAzMiwgMHgxNDAwNDAyMCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fUlhCLCAgREVWX0ZMQUdTX0lOLCAwLCAzMiwgMHgxNDAwNDA0MCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fUlhDLCAgREVWX0ZMQUdTX0lOLCAwLCAzMiwgMHgxNDAwNDA2MCwgMCwgMCB9LAorCXsgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fU1lOQywgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCisJeyBBVTEyMDBfRFNDUl9DTUQwX05BTkRfRkxBU0gsIERFVl9GTEFHU19JTiwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorCisJeyBEU0NSX0NNRDBfVEhST1RUTEUsIERFVl9GTEFHU19BTllVU0UsIDAsIDAsIDB4MDAwMDAwMDAsIDAsIDAgfSwKKwl7IERTQ1JfQ01EMF9BTFdBWVMsICAgREVWX0ZMQUdTX0FOWVVTRSwgMCwgMCwgMHgwMDAwMDAwMCwgMCwgMCB9LAorfTsKKworLyogMzIgcHJlZGVmaW5lZCBwbHVzIDMyIGN1c3RvbSAqLworI2RlZmluZSBEQkRFVl9UQUJfU0laRQkJNjQKIAogc3RhdGljIGNoYW5fdGFiX3QgKmNoYW5fdGFiX3B0cltOVU1fREJETUFfQ0hBTlNdOwogCkBAIC0xMDI4LDM4ICsxMDAyLDQzIEBACiAJLnJlc3VtZQkJPSBhbGNoZW15X2RiZG1hX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGF1MXh4eF9kYmRtYV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkYmRtYV9zZXR1cCh1bnNpZ25lZCBpbnQgaXJxLCBkYmRldl90YWJfdCAqaWR0YWJsZSkKIHsKLQlpbnQgaXJxX25yLCByZXQ7CisJaW50IHJldDsKKworCWRiZGV2X3RhYiA9IGt6YWxsb2Moc2l6ZW9mKGRiZGV2X3RhYl90KSAqIERCREVWX1RBQl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRiZGV2X3RhYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoZGJkZXZfdGFiLCBpZHRhYmxlLCAzMiAqIHNpemVvZihkYmRldl90YWJfdCkpOworCWZvciAocmV0ID0gMzI7IHJldCA8IERCREVWX1RBQl9TSVpFOyByZXQrKykKKwkJZGJkZXZfdGFiW3JldF0uZGV2X2lkID0gfjA7CiAKIAlkYmRtYV9ncHRyLT5kZG1hX2NvbmZpZyA9IDA7CiAJZGJkbWFfZ3B0ci0+ZGRtYV90aHJvdHRsZSA9IDA7CiAJZGJkbWFfZ3B0ci0+ZGRtYV9pbnRlbiA9IDB4ZmZmZjsKIAlhdV9zeW5jKCk7CiAKLQlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgewotCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgotCQlpcnFfbnIgPSBBVTE1NTBfRERNQV9JTlQ7Ci0JCWJyZWFrOwotCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgotCQlpcnFfbnIgPSBBVTEyMDBfRERNQV9JTlQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldCA9IHJlcXVlc3RfaXJxKGlycV9uciwgZGJkbWFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAotCQkJIkF1MXh4eCBkYmRtYSIsICh2b2lkICopZGJkbWFfZ3B0cik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBkYmRtYV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJkYmRtYSIsCisJCQkgICh2b2lkICopZGJkbWFfZ3B0cik7CiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZ3JhYiBEQkRNQSBpbnRlcnJ1cHQhXG4iKTsKIAllbHNlIHsKIAkJZGJkbWFfaW5pdGlhbGl6ZWQgPSAxOwotCQlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15IERCRE1BIGluaXRpYWxpemVkXG4iKTsKIAkJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmFsY2hlbXlfZGJkbWFfc3lzY29yZV9vcHMpOwogCX0KIAogCXJldHVybiByZXQ7CiB9Ci1zdWJzeXNfaW5pdGNhbGwoYXUxeHh4X2RiZG1hX2luaXQpOwogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfZGJkbWFfaW5pdCh2b2lkKQoreworCXN3aXRjaCAoYWxjaGVteV9nZXRfY3B1dHlwZSgpKSB7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6CisJCXJldHVybiBkYmRtYV9zZXR1cChBVTE1NTBfRERNQV9JTlQsIGF1MTU1MF9kYmRldl90YWIpOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXR1cm4gZGJkbWFfc2V0dXAoQVUxMjAwX0RETUFfSU5ULCBhdTEyMDBfZGJkZXZfdGFiKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoYWxjaGVteV9kYmRtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kbWEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kbWEuYwppbmRleCAzNDc5ODBlLi45YjYyNGUyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZG1hLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RtYS5jCkBAIC00MCw4ICs0MCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTAwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkKIC8qCiAgKiBBIG5vdGUgb24gcmVzb3VyY2UgYWxsb2NhdGlvbjoKICAqCkBAIC04OCwxMiArODYsMTIgQEAKIAl7IEFVMTAwMF9BQzk3X1BIWVNfQUREUiArIDB4MDgsIERNQV9EVzE2IHwgRE1BX0RSIH0sCS8qIEFDOTcgUlggYyAqLwogCXsgQVUxMDAwX1VBUlQzX1BIWVNfQUREUiArIDB4MDQsIERNQV9EVzggfCBETUFfTkMgfSwJLyogVUFSVDNfVFggKi8KIAl7IEFVMTAwMF9VQVJUM19QSFlTX0FERFIgKyAweDAwLCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIFVBUlQzX1JYICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDAwLCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQMFJEICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDA0LCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQMFdSICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDA4LCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQMldSICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDBjLCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQM1dSICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDEwLCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQNFJEICovCi0JeyBBVTEwMDBfVVNCRF9QSFlTX0FERFIgKyAweDE0LCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQNVJEICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDAwLCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQMFJEICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDA0LCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQMFdSICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDA4LCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQMldSICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDBjLCBETUFfRFc4IHwgRE1BX05DIH0sIC8qIEVQM1dSICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDEwLCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQNFJEICovCisJeyBBVTEwMDBfVVNCX1VEQ19QSFlTX0FERFIgKyAweDE0LCBETUFfRFc4IHwgRE1BX05DIHwgRE1BX0RSIH0sIC8qIEVQNVJEICovCiAJLyogb24gQXUxNTAwLCB0aGVzZSAyIGFyZSBETUFfUkVRMi8zIChHUElPMjA4LzIwOSkgaW5zdGVhZCEgKi8KIAl7IEFVMTAwMF9JMlNfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXMzIgfCBETUFfTkN9LAkvKiBJMlMgVFggKi8KIAl7IEFVMTAwMF9JMlNfUEhZU19BRERSICsgMHgwMCwgRE1BX0RXMzIgfCBETUFfTkMgfCBETUFfRFJ9LCAvKiBJMlMgUlggKi8KQEAgLTE3MCwxMyArMTY4LDEzIEBACiAJY29uc3Qgc3RydWN0IGRtYV9kZXYgKmRldjsKIAlpbnQgaSwgcmV0OwogCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkKLQlpZiAoZGV2X2lkIDwgMCB8fCBkZXZfaWQgPj0gKERNQV9OVU1fREVWICsgRE1BX05VTV9ERVZfQkFOSzIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbHNlCi0JaWYgKGRldl9pZCA8IDAgfHwgZGV2X2lkID49IERNQV9OVU1fREVWKQotCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgorCWlmIChhbGNoZW15X2dldF9jcHV0eXBlKCkgPT0gQUxDSEVNWV9DUFVfQVUxMTAwKSB7CisJCWlmIChkZXZfaWQgPCAwIHx8IGRldl9pZCA+PSAoRE1BX05VTV9ERVYgKyBETUFfTlVNX0RFVl9CQU5LMikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoZGV2X2lkIDwgMCB8fCBkZXZfaWQgPj0gRE1BX05VTV9ERVYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0FVMTAwMF9ETUFfQ0hBTk5FTFM7IGkrKykKIAkJaWYgKGF1MTAwMF9kbWFfdGFibGVbaV0uZGV2X2lkIDwgMCkKQEAgLTIzOSwzMCArMjM3LDI4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGF1MTAwMF9kbWFfaW5pdCh2b2lkKQogewotICAgICAgICBpbnQgYmFzZSwgaTsKKwlpbnQgYmFzZSwgaTsKIAotICAgICAgICBzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgewotICAgICAgICBjYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKLSAgICAgICAgICAgICAgICBiYXNlID0gQVUxMDAwX0RNQV9JTlRfQkFTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTENIRU1ZX0NQVV9BVTE1MDA6Ci0gICAgICAgICAgICAgICAgYmFzZSA9IEFVMTUwMF9ETUFfSU5UX0JBU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgotICAgICAgICAgICAgICAgIGJhc2UgPSBBVTExMDBfRE1BX0lOVF9CQVNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwkJYmFzZSA9IEFVMTAwMF9ETUFfSU5UX0JBU0U7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCQliYXNlID0gQVUxNTAwX0RNQV9JTlRfQkFTRTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTExMDA6CisJCWJhc2UgPSBBVTExMDBfRE1BX0lOVF9CQVNFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwl9CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9BVTEwMDBfRE1BX0NIQU5ORUxTOyBpKyspCi0gICAgICAgICAgICAgICAgYXUxMDAwX2RtYV90YWJsZVtpXS5pcnEgPSBiYXNlICsgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FVMTAwMF9ETUFfQ0hBTk5FTFM7IGkrKykKKwkJYXUxMDAwX2RtYV90YWJsZVtpXS5pcnEgPSBiYXNlICsgaTsKIAotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJBbGNoZW15IERNQSBpbml0aWFsaXplZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQWxjaGVteSBETUEgaW5pdGlhbGl6ZWRcbiIpOwogCiBvdXQ6Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbChhdTEwMDBfZG1hX2luaXQpOwotCi0jZW5kaWYgLyogQVUxMDAwIEFVMTUwMCBBVTExMDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9ncGlvbGliLWF1MTAwMC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW9saWItYXUxMDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTFhOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2dwaW9saWItYXUxMDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSwgT3BlbldydC5vcmcsIEZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+Ci0gKiAgCUdQSU9MSUIgc3VwcG9ydCBmb3IgQXUxMDAwLCBBdTE1MDAsIEF1MTEwMCwgQXUxNTUwIGFuZCBBdTEyeDAuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICBOb3RlcyA6Ci0gKiAJYXUxMDAwIFNvQyBoYXZlIG9ubHkgb25lIEdQSU8gYmxvY2sgOiBHUElPMQotICogCUF1MTEwMCwgQXUxNXgwLCBBdTEyeDAgaGF2ZSBhIHNlY29uZCBvbmUgOiBHUElPMgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvZ3Bpby5oPgotCi1zdGF0aWMgaW50IGdwaW8yX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIGFsY2hlbXlfZ3BpbzJfZ2V0X3ZhbHVlKG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdwaW8yX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlhbGNoZW15X2dwaW8yX3NldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBncGlvMl9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8yX2RpcmVjdGlvbl9pbnB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UpOwotfQotCi1zdGF0aWMgaW50IGdwaW8yX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAotCQkJCSAgaW50IHZhbHVlKQotewotCXJldHVybiBhbGNoZW15X2dwaW8yX2RpcmVjdGlvbl9vdXRwdXQob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFLAotCQkJCQkJdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGdwaW8yX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIGFsY2hlbXlfZ3BpbzJfdG9faXJxKG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSk7Ci19Ci0KLQotc3RhdGljIGludCBncGlvMV9nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8xX2dldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UpOwotfQotCi1zdGF0aWMgdm9pZCBncGlvMV9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlhbGNoZW15X2dwaW8xX3NldF92YWx1ZShvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBncGlvMV9kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBhbGNoZW15X2dwaW8xX2RpcmVjdGlvbl9pbnB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UpOwotfQotCi1zdGF0aWMgaW50IGdwaW8xX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JcmV0dXJuIGFsY2hlbXlfZ3BpbzFfZGlyZWN0aW9uX291dHB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8xX0JBU0UsCi0JCQkJCSAgICAgdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGdwaW8xX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIGFsY2hlbXlfZ3BpbzFfdG9faXJxKG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSk7Ci19Ci0KLXN0cnVjdCBncGlvX2NoaXAgYWxjaGVteV9ncGlvX2NoaXBbXSA9IHsKLQlbMF0gPSB7Ci0JCS5sYWJlbAkJCT0gImFsY2hlbXktZ3BpbzEiLAotCQkuZGlyZWN0aW9uX2lucHV0CT0gZ3BpbzFfZGlyZWN0aW9uX2lucHV0LAotCQkuZGlyZWN0aW9uX291dHB1dAk9IGdwaW8xX2RpcmVjdGlvbl9vdXRwdXQsCi0JCS5nZXQJCQk9IGdwaW8xX2dldCwKLQkJLnNldAkJCT0gZ3BpbzFfc2V0LAotCQkudG9faXJxCQkJPSBncGlvMV90b19pcnEsCi0JCS5iYXNlCQkJPSBBTENIRU1ZX0dQSU8xX0JBU0UsCi0JCS5uZ3BpbwkJCT0gQUxDSEVNWV9HUElPMV9OVU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5sYWJlbCAgICAgICAgICAgICAgICAgID0gImFsY2hlbXktZ3BpbzIiLAotCQkuZGlyZWN0aW9uX2lucHV0ICAgICAgICA9IGdwaW8yX2RpcmVjdGlvbl9pbnB1dCwKLQkJLmRpcmVjdGlvbl9vdXRwdXQgICAgICAgPSBncGlvMl9kaXJlY3Rpb25fb3V0cHV0LAotCQkuZ2V0ICAgICAgICAgICAgICAgICAgICA9IGdwaW8yX2dldCwKLQkJLnNldCAgICAgICAgICAgICAgICAgICAgPSBncGlvMl9zZXQsCi0JCS50b19pcnEJCQk9IGdwaW8yX3RvX2lycSwKLQkJLmJhc2UgICAgICAgICAgICAgICAgICAgPSBBTENIRU1ZX0dQSU8yX0JBU0UsCi0JCS5uZ3BpbyAgICAgICAgICAgICAgICAgID0gQUxDSEVNWV9HUElPMl9OVU0sCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0JZ3Bpb2NoaXBfYWRkKCZhbGNoZW15X2dwaW9fY2hpcFswXSk7Ci0JaWYgKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSAhPSBBTENIRU1ZX0NQVV9BVTEwMDApCi0JCWdwaW9jaGlwX2FkZCgmYWxjaGVteV9ncGlvX2NoaXBbMV0pOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKGFsY2hlbXlfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9ncGlvbGliLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZ3Bpb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZmI0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZ3Bpb2xpYi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5LCBPcGVuV3J0Lm9yZywgRmxvcmlhbiBGYWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4KKyAqCUdQSU9MSUIgc3VwcG9ydCBmb3IgQWxjaGVteSBjaGlwcy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZgkgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUJTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQJICBgYEFTCUlTJycgQU5EICAgQU5ZCUVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsCSAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PCUVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCSBMSUFCTEUgRk9SIEFOWQkgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQJICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMJT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsCU9SIFBST0ZJVFM7IE9SCUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4JIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIE5vdGVzIDoKKyAqCVRoaXMgZmlsZSBtdXN0IE9OTFkgYmUgYnVpbHQgd2hlbiBDT05GSUdfR1BJT0xJQj15IGFuZAorICoJIENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1Q9biwgb3RoZXJ3aXNlIGNvbXBpbGF0aW9uIHdpbGwgZmFpbCEKKyAqCWF1MTAwMCBTb0MgaGF2ZSBvbmx5IG9uZSBHUElPIGJsb2NrIDogR1BJTzEKKyAqCUF1MTEwMCwgQXUxNXgwLCBBdTEyeDAgaGF2ZSBhIHNlY29uZCBvbmUgOiBHUElPMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2dwaW8tYXUxMDAwLmg+CisKK3N0YXRpYyBpbnQgZ3BpbzJfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gYWxjaGVteV9ncGlvMl9nZXRfdmFsdWUob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFKTsKK30KKworc3RhdGljIHZvaWQgZ3BpbzJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWFsY2hlbXlfZ3BpbzJfc2V0X3ZhbHVlKG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdwaW8yX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzJfZGlyZWN0aW9uX2lucHV0KG9mZnNldCArIEFMQ0hFTVlfR1BJTzJfQkFTRSk7Cit9CisKK3N0YXRpYyBpbnQgZ3BpbzJfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJICBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzJfZGlyZWN0aW9uX291dHB1dChvZmZzZXQgKyBBTENIRU1ZX0dQSU8yX0JBU0UsCisJCQkJCQl2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3BpbzJfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gYWxjaGVteV9ncGlvMl90b19pcnEob2Zmc2V0ICsgQUxDSEVNWV9HUElPMl9CQVNFKTsKK30KKworCitzdGF0aWMgaW50IGdwaW8xX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzFfZ2V0X3ZhbHVlKG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW8xX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCWFsY2hlbXlfZ3BpbzFfc2V0X3ZhbHVlKG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdwaW8xX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIGFsY2hlbXlfZ3BpbzFfZGlyZWN0aW9uX2lucHV0KG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSk7Cit9CisKK3N0YXRpYyBpbnQgZ3BpbzFfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gYWxjaGVteV9ncGlvMV9kaXJlY3Rpb25fb3V0cHV0KG9mZnNldCArIEFMQ0hFTVlfR1BJTzFfQkFTRSwKKwkJCQkJICAgICB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3BpbzFfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gYWxjaGVteV9ncGlvMV90b19pcnEob2Zmc2V0ICsgQUxDSEVNWV9HUElPMV9CQVNFKTsKK30KKworc3RydWN0IGdwaW9fY2hpcCBhbGNoZW15X2dwaW9fY2hpcFtdID0geworCVswXSA9IHsKKwkJLmxhYmVsCQkJPSAiYWxjaGVteS1ncGlvMSIsCisJCS5kaXJlY3Rpb25faW5wdXQJPSBncGlvMV9kaXJlY3Rpb25faW5wdXQsCisJCS5kaXJlY3Rpb25fb3V0cHV0CT0gZ3BpbzFfZGlyZWN0aW9uX291dHB1dCwKKwkJLmdldAkJCT0gZ3BpbzFfZ2V0LAorCQkuc2V0CQkJPSBncGlvMV9zZXQsCisJCS50b19pcnEJCQk9IGdwaW8xX3RvX2lycSwKKwkJLmJhc2UJCQk9IEFMQ0hFTVlfR1BJTzFfQkFTRSwKKwkJLm5ncGlvCQkJPSBBTENIRU1ZX0dQSU8xX05VTSwKKwl9LAorCVsxXSA9IHsKKwkJLmxhYmVsICAgICAgICAgICAgICAgICAgPSAiYWxjaGVteS1ncGlvMiIsCisJCS5kaXJlY3Rpb25faW5wdXQgICAgICAgID0gZ3BpbzJfZGlyZWN0aW9uX2lucHV0LAorCQkuZGlyZWN0aW9uX291dHB1dCAgICAgICA9IGdwaW8yX2RpcmVjdGlvbl9vdXRwdXQsCisJCS5nZXQgICAgICAgICAgICAgICAgICAgID0gZ3BpbzJfZ2V0LAorCQkuc2V0ICAgICAgICAgICAgICAgICAgICA9IGdwaW8yX3NldCwKKwkJLnRvX2lycQkJCT0gZ3BpbzJfdG9faXJxLAorCQkuYmFzZSAgICAgICAgICAgICAgICAgICA9IEFMQ0hFTVlfR1BJTzJfQkFTRSwKKwkJLm5ncGlvICAgICAgICAgICAgICAgICAgPSBBTENIRU1ZX0dQSU8yX05VTSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWxjaGVteV9ncGlvY2hpcF9pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCQlyZXQgPSBncGlvY2hpcF9hZGQoJmFsY2hlbXlfZ3Bpb19jaGlwWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1MDAuLi5BTENIRU1ZX0NQVV9BVTEyMDA6CisJCXJldCA9IGdwaW9jaGlwX2FkZCgmYWxjaGVteV9ncGlvX2NoaXBbMF0pOworCQlyZXQgfD0gZ3Bpb2NoaXBfYWRkKCZhbGNoZW15X2dwaW9fY2hpcFsxXSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorYXJjaF9pbml0Y2FsbChhbGNoZW15X2dwaW9jaGlwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BjaS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY2Y2Y1Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglBbGNoZW15L0FNRCBBdTF4MDAgUENJIHN1cHBvcnQuCi0gKgotICogQ29weXJpZ2h0IDIwMDEtMjAwMywgMjAwNy0yMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICoKLSAqICBTdXBwb3J0IGZvciBhbGwgZGV2aWNlcyAoZ3JlYXRlciB0aGFuIDE2KSBhZGRlZCBieSBEYXZpZCBHYXRocmlnaHQuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLS8qIFRCRCAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2lfaW9fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gUENJX0lPX1NUQVJULAotCS5lbmQJPSBQQ0lfSU9fRU5ELAotCS5uYW1lCT0gIlBDSSBJTyBzcGFjZSIsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2lfbWVtX3Jlc291cmNlID0gewotCS5zdGFydAk9IFBDSV9NRU1fU1RBUlQsCi0JLmVuZAk9IFBDSV9NRU1fRU5ELAotCS5uYW1lCT0gIlBDSSBtZW1vcnkgc3BhY2UiLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1leHRlcm4gc3RydWN0IHBjaV9vcHMgYXUxeF9wY2lfb3BzOwotCi1zdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGF1MXhfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9ICZhdTF4X3BjaV9vcHMsCi0JLmlvX3Jlc291cmNlCT0gJnBjaV9pb19yZXNvdXJjZSwKLQkubWVtX3Jlc291cmNlCT0gJnBjaV9tZW1fcmVzb3VyY2UsCi19OwotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZpcnRfaW9fYWRkcjsKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBhdTF4X3BjaV9zZXR1cCh2b2lkKQotewotCWV4dGVybiB2b2lkIGF1MXhfcGNpX2NmZ19pbml0KHZvaWQpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkKLQl2aXJ0X2lvX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKEF1MTUwMF9QQ0lfSU9fU1RBUlQsCi0JCQlBdTE1MDBfUENJX0lPX0VORCAtIEF1MTUwMF9QQ0lfSU9fU1RBUlQgKyAxKTsKLQotCWlmICghdmlydF9pb19hZGRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGlvcmVtYXAgcGNpIHNwYWNlXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWF1MXhfY29udHJvbGxlci5pb19tYXBfYmFzZSA9IHZpcnRfaW9fYWRkcjsKLQotI2lmZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKLQl7Ci0JCS8qCi0JCSAqICBTZXQgdGhlIE5DIGJpdCBpbiBjb250cm9sbGVyIGZvciBBdTE1MDAgcHJlLUFDIHNpbGljb24KLQkJICovCi0JCXUzMiBwcmlkID0gcmVhZF9jMF9wcmlkKCk7Ci0KLQkJaWYgKChwcmlkICYgMHhGRjAwMDAwMCkgPT0gMHgwMTAwMDAwMCAmJiBwcmlkIDwgMHgwMTAzMDIwMikgewotCQkJYXVfd3JpdGVsKCgxIDw8IDE2KSB8IGF1X3JlYWRsKEF1MTUwMF9QQ0lfQ0ZHKSwKLQkJCQkgIEF1MTUwMF9QQ0lfQ0ZHKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIk5vbi1jb2hlcmVudCBQQ0kgYWNjZXNzZXMgZW5hYmxlZFxuIik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXNldF9pb19wb3J0X2Jhc2UodmlydF9pb19hZGRyKTsKLSNlbmRpZgotCi0JYXUxeF9wY2lfY2ZnX2luaXQoKTsKLQotCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZhdTF4X2NvbnRyb2xsZXIpOwotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKGF1MXhfcGNpX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMKaW5kZXggZjcyYzQ4ZC4uYzhlNWQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTExMDBfbW1jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9ldGguaD4KQEAgLTExMSwyNzAgKzExMSw4NyBAQAogCQlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15OiBmYWlsZWQgdG8gcmVnaXN0ZXIgVUFSVHNcbiIpOwogfQogCi0vKiBPSENJIChVU0IgZnVsbCBzcGVlZCBob3N0IGNvbnRyb2xsZXIpICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MXh4eF91c2Jfb2hjaV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBVU0JfT0hDSV9CQVNFLAotCQkuZW5kCQk9IFVTQl9PSENJX0JBU0UgKyBVU0JfT0hDSV9MRU4gLSAxLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBGT1JfUExBVEZPUk1fQ19VU0JfSE9TVF9JTlQsCi0JCS5lbmQJCT0gRk9SX1BMQVRGT1JNX0NfVVNCX0hPU1RfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKKworLyogVGhlIGRtYW1hc2sgbXVzdCBiZSBzZXQgZm9yIE9IQ0kvRUhDSSB0byB3b3JrICovCitzdGF0aWMgdTY0IGFsY2hlbXlfb2hjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKK3N0YXRpYyB1NjQgX19tYXliZV91bnVzZWQgYWxjaGVteV9laGNpX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGNoZW15X29oY2lfZGF0YVtdWzJdIF9faW5pdGRhdGEgPSB7CisJW0FMQ0hFTVlfQ1BVX0FVMTAwMF0gPSB7IEFVMTAwMF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTAwMF9VU0JfSE9TVF9JTlQgfSwKKwlbQUxDSEVNWV9DUFVfQVUxNTAwXSA9IHsgQVUxMDAwX1VTQl9PSENJX1BIWVNfQUREUiwgQVUxNTAwX1VTQl9IT1NUX0lOVCB9LAorCVtBTENIRU1ZX0NQVV9BVTExMDBdID0geyBBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTExMDBfVVNCX0hPU1RfSU5UIH0sCisJW0FMQ0hFTVlfQ1BVX0FVMTU1MF0gPSB7IEFVMTU1MF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTU1MF9VU0JfSE9TVF9JTlQgfSwKKwlbQUxDSEVNWV9DUFVfQVUxMjAwXSA9IHsgQVUxMjAwX1VTQl9PSENJX1BIWVNfQUREUiwgQVUxMjAwX1VTQl9JTlQgfSwKIH07CiAKLS8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJIHRvIHdvcmsgKi8KLXN0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxeHh4X3VzYl9vaGNpX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXUxeHh4LW9oY2kiLAotCS5pZAkJPSAwLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzawkJPSAmb2hjaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MXh4eF91c2Jfb2hjaV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGF1MXh4eF91c2Jfb2hjaV9yZXNvdXJjZXMsCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGNoZW15X2VoY2lfZGF0YVtdWzJdIF9faW5pdGRhdGEgPSB7CisJW0FMQ0hFTVlfQ1BVX0FVMTIwMF0gPSB7IEFVMTIwMF9VU0JfRUhDSV9QSFlTX0FERFIsIEFVMTIwMF9VU0JfSU5UIH0sCiB9OwogCi0vKioqIEFVMTEwMCBMQ0QgY29udHJvbGxlciAqKiovCi0KLSNpZmRlZiBDT05GSUdfRkJfQVUxMTAwCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTEwMF9sY2RfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBMQ0RfUEhZU19BRERSLAotCQkuZW5kICAgICAgICAgICAgPSBMQ0RfUEhZU19BRERSICsgMHg4MDAgLSAxLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gQVUxMTAwX0xDRF9JTlQsCi0JCS5lbmQgICAgICAgICAgICA9IEFVMTEwMF9MQ0RfSU5ULAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX0lSUSwKK3N0YXRpYyBpbnQgX19pbml0IF9uZXdfdXNicmVzKHN0cnVjdCByZXNvdXJjZSAqKnIsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipkKQoreworCSpyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIsIEdGUF9LRVJORUwpOworCWlmICghKnIpCisJCXJldHVybiAtRU5PTUVNOworCSpkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghKmQpIHsKKwkJa2ZyZWUoKnIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci19OwogCi1zdGF0aWMgdTY0IGF1MTEwMF9sY2RfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJKCpkKS0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwkoKmQpLT5udW1fcmVzb3VyY2VzID0gMjsKKwkoKmQpLT5yZXNvdXJjZSA9ICpyOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTExMDBfbGNkX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiYXUxMTAwLWxjZCIsCi0JLmlkICAgICAgICAgICAgID0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZhdTExMDBfbGNkX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYXUxMTAwX2xjZF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGF1MTEwMF9sY2RfcmVzb3VyY2VzLAotfTsKLSNlbmRpZgorCXJldHVybiAwOworfQogCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLS8qIEVIQ0kgKFVTQiBoaWdoIHNwZWVkIGhvc3QgY29udHJvbGxlcikgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X3VzYl9laGNpX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFVTQl9FSENJX0JBU0UsCi0JCS5lbmQJCT0gVVNCX0VIQ0lfQkFTRSArIFVTQl9FSENJX0xFTiAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZW5kCQk9IEFVMTIwMF9VU0JfSU5ULAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07CitzdGF0aWMgdm9pZCBfX2luaXQgYWxjaGVteV9zZXR1cF91c2IoaW50IGN0eXBlKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKLXN0YXRpYyB1NjQgZWhjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKwkvKiBzZXR1cCBPSENJMC4gIEV2ZXJ5IHZhcmlhbnQgaGFzIG9uZSAqLworCWlmIChfbmV3X3VzYnJlcygmcmVzLCAmcGRldikpCisJCXJldHVybjsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxeHh4X3VzYl9laGNpX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXUxeHh4LWVoY2kiLAotCS5pZAkJPSAwLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzawkJPSAmZWhjaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MXh4eF91c2JfZWhjaV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGF1MXh4eF91c2JfZWhjaV9yZXNvdXJjZXMsCi19OworCXJlc1swXS5zdGFydCA9IGFsY2hlbXlfb2hjaV9kYXRhW2N0eXBlXVswXTsKKwlyZXNbMF0uZW5kID0gcmVzWzBdLnN0YXJ0ICsgMHgxMDAgLSAxOworCXJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCXJlc1sxXS5zdGFydCA9IGFsY2hlbXlfb2hjaV9kYXRhW2N0eXBlXVsxXTsKKwlyZXNbMV0uZW5kID0gcmVzWzFdLnN0YXJ0OworCXJlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCXBkZXYtPm5hbWUgPSAiYXUxeHh4LW9oY2kiOworCXBkZXYtPmlkID0gMDsKKwlwZGV2LT5kZXYuZG1hX21hc2sgPSAmYWxjaGVteV9vaGNpX2RtYW1hc2s7CiAKLS8qIEF1MTIwMCBVREMgKFVTQiBnYWRnZXQgY29udHJvbGxlcikgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X3VzYl9nZHRfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gVVNCX1VEQ19CQVNFLAotCQkuZW5kCQk9IFVTQl9VRENfQkFTRSArIFVTQl9VRENfTEVOIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gQVUxMjAwX1VTQl9JTlQsCi0JCS5lbmQJCT0gQVUxMjAwX1VTQl9JTlQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKKwlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpKQorCQlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15IFVTQjogY2Fubm90IGFkZCBPSENJMFxuIik7CiAKLXN0YXRpYyB1NjQgdWRjX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTF4eHhfdXNiX2dkdF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF1MXh4eC11ZGMiLAotCS5pZAkJPSAwLAotCS5kZXYgPSB7Ci0JCS5kbWFfbWFzawkJPSAmdWRjX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxeHh4X3VzYl9nZHRfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTF4eHhfdXNiX2dkdF9yZXNvdXJjZXMsCi19OworCS8qIHNldHVwIEVIQ0kwOiBBdTEyMDAgKi8KKwlpZiAoY3R5cGUgPT0gQUxDSEVNWV9DUFVfQVUxMjAwKSB7CisJCWlmIChfbmV3X3VzYnJlcygmcmVzLCAmcGRldikpCisJCQlyZXR1cm47CiAKLS8qIEF1MTIwMCBVT0MgKFVTQiBPVEcgY29udHJvbGxlcikgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxeHh4X3VzYl9vdGdfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gVVNCX1VPQ19CQVNFLAotCQkuZW5kCQk9IFVTQl9VT0NfQkFTRSArIFVTQl9VT0NfTEVOIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gQVUxMjAwX1VTQl9JTlQsCi0JCS5lbmQJCT0gQVUxMjAwX1VTQl9JTlQsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKKwkJcmVzWzBdLnN0YXJ0ID0gYWxjaGVteV9laGNpX2RhdGFbY3R5cGVdWzBdOworCQlyZXNbMF0uZW5kID0gcmVzWzBdLnN0YXJ0ICsgMHgxMDAgLSAxOworCQlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJcmVzWzFdLnN0YXJ0ID0gYWxjaGVteV9laGNpX2RhdGFbY3R5cGVdWzFdOworCQlyZXNbMV0uZW5kID0gcmVzWzFdLnN0YXJ0OworCQlyZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJcGRldi0+bmFtZSA9ICJhdTF4eHgtZWhjaSI7CisJCXBkZXYtPmlkID0gMDsKKwkJcGRldi0+ZGV2LmRtYV9tYXNrID0gJmFsY2hlbXlfZWhjaV9kbWFtYXNrOwogCi1zdGF0aWMgdTY0IHVvY19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxeHh4X3VzYl9vdGdfZGV2aWNlID0gewotCS5uYW1lCQk9ICJhdTF4eHgtdW9jIiwKLQkuaWQJCT0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJnVvY19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MXh4eF91c2Jfb3RnX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gYXUxeHh4X3VzYl9vdGdfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbGNkX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0ICAgICAgICAgID0gTENEX1BIWVNfQUREUiwKLQkJLmVuZCAgICAgICAgICAgID0gTENEX1BIWVNfQUREUiArIDB4ODAwIC0gMSwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IEFVMTIwMF9MQ0RfSU5ULAotCQkuZW5kICAgICAgICAgICAgPSBBVTEyMDBfTENEX0lOVCwKLQkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9JUlEsCisJCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldikpCisJCQlwcmludGsoS0VSTl9JTkZPICJBbGNoZW15IFVTQjogY2Fubm90IGFkZCBFSENJMFxuIik7CiAJfQotfTsKLQotc3RhdGljIHU2NCBhdTEyMDBfbGNkX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTEyMDBfbGNkX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiYXUxMjAwLWxjZCIsCi0JLmlkICAgICAgICAgICAgID0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZhdTEyMDBfbGNkX2RtYW1hc2ssCi0JCS5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKLQl9LAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYXUxMjAwX2xjZF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGF1MTIwMF9sY2RfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHU2NCBhdTF4eHhfbW1jX2RtYW1hc2sgPSAgRE1BX0JJVF9NQVNLKDMyKTsKLQotZXh0ZXJuIHN0cnVjdCBhdTF4bW1jX3BsYXRmb3JtX2RhdGEgYXUxeG1tY19wbGF0ZGF0YVsyXTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IEFVMTEwMF9TRDBfUEhZU19BRERSLAotCQkuZW5kICAgICAgICAgICAgPSBBVTExMDBfU0QwX1BIWVNfQUREUiArIDB4ZmZmLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IEFVMTIwMF9TRF9JTlQsCi0JCS5lbmQJCT0gQVUxMjAwX1NEX0lOVCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJCT0gRFNDUl9DTUQwX1NETVNfVFgwLAotCQkuZW5kCQk9IERTQ1JfQ01EMF9TRE1TX1RYMCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfRE1BLAotCX0sCi0JWzNdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBEU0NSX0NNRDBfU0RNU19SWDAsCi0JCS5lbmQJCT0gRFNDUl9DTUQwX1NETVNfUlgwLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX0RNQSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTEyMDBfbW1jMF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAiYXUxeHh4LW1tYyIsCi0JLmlkID0gMCwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJmF1MXh4eF9tbWNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJmF1MXhtbWNfcGxhdGRhdGFbMF0sCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX21tYzBfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTEyMDBfbW1jMF9yZXNvdXJjZXMsCi19OwotCi0jaWZuZGVmIENPTkZJR19NSVBTX0RCMTIwMAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgICAgICAgICA9IEFVMTEwMF9TRDFfUEhZU19BRERSLAotCQkuZW5kICAgICAgICAgICAgPSBBVTExMDBfU0QxX1BIWVNfQUREUiArIDB4ZmZmLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IEFVMTIwMF9TRF9JTlQsCi0JCS5lbmQJCT0gQVUxMjAwX1NEX0lOVCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJCT0gRFNDUl9DTUQwX1NETVNfVFgxLAotCQkuZW5kCQk9IERTQ1JfQ01EMF9TRE1TX1RYMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfRE1BLAotCX0sCi0JWzNdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBEU0NSX0NNRDBfU0RNU19SWDEsCi0JCS5lbmQJCT0gRFNDUl9DTUQwX1NETVNfUlgxLAotCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX0RNQSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTEyMDBfbW1jMV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAiYXUxeHh4LW1tYyIsCi0JLmlkID0gMSwKLQkuZGV2ID0gewotCQkuZG1hX21hc2sJCT0gJmF1MXh4eF9tbWNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJmF1MXhtbWNfcGxhdGRhdGFbMV0sCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMjAwX21tYzFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBhdTEyMDBfbW1jMV9yZXNvdXJjZXMsCi19OwotI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX01JUFNfREIxMjAwICovCi0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwICovCi0KLS8qIEFsbCBBbGNoZW15IGRlbW9ib2FyZHMgd2l0aCBJMkMgaGF2ZSB0aGlzICNkZWZpbmUgaW4gdGhlaXIgaGVhZGVycyAqLwotI2lmZGVmIFNNQlVTX1BTQ19CQVNFCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBiZGJfc21idXNfcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJPSBDUEhZU0FERFIoU01CVVNfUFNDX0JBU0UpLAotCQkuZW5kCT0gQ1BIWVNBRERSKFNNQlVTX1BTQ19CQVNFICsgMHhmZmZmZiksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYmRiX3NtYnVzX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXUxeHBzY19zbWJ1cyIsCi0JLmlkCQk9IDAsCS8qIGJ1cyBudW1iZXIgKi8KLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocGJkYl9zbWJ1c19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHBiZGJfc21idXNfcmVzb3VyY2VzLAotfTsKLSNlbmRpZgorfQogCiAvKiBNYWNybyB0byBoZWxwIGRlZmluaW5nIHRoZSBFdGhlcm5ldCBNQUMgcmVzb3VyY2VzICovCi0jZGVmaW5lIE1BQ19SRVNfQ09VTlQJMwkvKiBNQUMgcmVncyBiYXNlLCBNQUMgZW5hYmxlIHJlZywgTUFDIElOVCAqLwotI2RlZmluZSBNQUNfUkVTKF9iYXNlLCBfZW5hYmxlLCBfaXJxKQkJCVwKKyNkZWZpbmUgTUFDX1JFU19DT1VOVAk0CS8qIE1BQyByZWdzLCBNQUMgZW4sIE1BQyBJTlQsIE1BQ0RNQSByZWdzICovCisjZGVmaW5lIE1BQ19SRVMoX2Jhc2UsIF9lbmFibGUsIF9pcnEsIF9tYWNkbWEpCQlcCiAJewkJCQkJCVwKIAkJLnN0YXJ0CT0gX2Jhc2UsCQkJXAogCQkuZW5kCT0gX2Jhc2UgKyAweGZmZmYsCQlcCkBAIC0zODksMjggKzIwNiwzNyBAQAogCQkuc3RhcnQJPSBfaXJxLAkJCQlcCiAJCS5lbmQJPSBfaXJxLAkJCQlcCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCQlcCisJfSwJCQkJCQlcCisJewkJCQkJCVwKKwkJLnN0YXJ0CT0gX21hY2RtYSwJCQlcCisJCS5lbmQJPSBfbWFjZG1hICsgMHgxZmYsCQlcCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAkJXAogCX0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTF4eHhfZXRoMF9yZXNvdXJjZXNbXVtNQUNfUkVTX0NPVU5UXSBfX2luaXRkYXRhID0gewogCVtBTENIRU1ZX0NQVV9BVTEwMDBdID0gewogCQlNQUNfUkVTKEFVMTAwMF9NQUMwX1BIWVNfQUREUiwKIAkJCUFVMTAwMF9NQUNFTl9QSFlTX0FERFIsCi0JCQlBVTEwMDBfTUFDMF9ETUFfSU5UKQorCQkJQVUxMDAwX01BQzBfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUEwX1BIWVNfQUREUikKIAl9LAogCVtBTENIRU1ZX0NQVV9BVTE1MDBdID0gewogCQlNQUNfUkVTKEFVMTUwMF9NQUMwX1BIWVNfQUREUiwKIAkJCUFVMTUwMF9NQUNFTl9QSFlTX0FERFIsCi0JCQlBVTE1MDBfTUFDMF9ETUFfSU5UKQorCQkJQVUxNTAwX01BQzBfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUEwX1BIWVNfQUREUikKIAl9LAogCVtBTENIRU1ZX0NQVV9BVTExMDBdID0gewogCQlNQUNfUkVTKEFVMTAwMF9NQUMwX1BIWVNfQUREUiwKIAkJCUFVMTAwMF9NQUNFTl9QSFlTX0FERFIsCi0JCQlBVTExMDBfTUFDMF9ETUFfSU5UKQorCQkJQVUxMTAwX01BQzBfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUEwX1BIWVNfQUREUikKIAl9LAogCVtBTENIRU1ZX0NQVV9BVTE1NTBdID0gewogCQlNQUNfUkVTKEFVMTAwMF9NQUMwX1BIWVNfQUREUiwKIAkJCUFVMTAwMF9NQUNFTl9QSFlTX0FERFIsCi0JCQlBVTE1NTBfTUFDMF9ETUFfSU5UKQorCQkJQVUxNTUwX01BQzBfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUEwX1BIWVNfQUREUikKIAl9LAogfTsKIApAQCAtNDI5LDE3ICsyNTUsMjAgQEAKIAlbQUxDSEVNWV9DUFVfQVUxMDAwXSA9IHsKIAkJTUFDX1JFUyhBVTEwMDBfTUFDMV9QSFlTX0FERFIsCiAJCQlBVTEwMDBfTUFDRU5fUEhZU19BRERSICsgNCwKLQkJCUFVMTAwMF9NQUMxX0RNQV9JTlQpCisJCQlBVTEwMDBfTUFDMV9ETUFfSU5ULAorCQkJQVUxMDAwX01BQ0RNQTFfUEhZU19BRERSKQogCX0sCiAJW0FMQ0hFTVlfQ1BVX0FVMTUwMF0gPSB7CiAJCU1BQ19SRVMoQVUxNTAwX01BQzFfUEhZU19BRERSLAogCQkJQVUxNTAwX01BQ0VOX1BIWVNfQUREUiArIDQsCi0JCQlBVTE1MDBfTUFDMV9ETUFfSU5UKQorCQkJQVUxNTAwX01BQzFfRE1BX0lOVCwKKwkJCUFVMTAwMF9NQUNETUExX1BIWVNfQUREUikKIAl9LAogCVtBTENIRU1ZX0NQVV9BVTE1NTBdID0gewogCQlNQUNfUkVTKEFVMTAwMF9NQUMxX1BIWVNfQUREUiwKIAkJCUFVMTAwMF9NQUNFTl9QSFlTX0FERFIgKyA0LAotCQkJQVUxNTUwX01BQzFfRE1BX0lOVCkKKwkJCUFVMTU1MF9NQUMxX0RNQV9JTlQsCisJCQlBVTEwMDBfTUFDRE1BMV9QSFlTX0FERFIpCiAJfSwKIH07CiAKQEAgLTUyMSwzNiArMzUwLDE1IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXUxeHh4X3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZhdTF4eHhfdXNiX29oY2lfZGV2aWNlLAotI2lmZGVmIENPTkZJR19GQl9BVTExMDAKLQkmYXUxMTAwX2xjZF9kZXZpY2UsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCSZhdTF4eHhfdXNiX2VoY2lfZGV2aWNlLAotCSZhdTF4eHhfdXNiX2dkdF9kZXZpY2UsCi0JJmF1MXh4eF91c2Jfb3RnX2RldmljZSwKLQkmYXUxMjAwX2xjZF9kZXZpY2UsCi0JJmF1MTIwMF9tbWMwX2RldmljZSwKLSNpZm5kZWYgQ09ORklHX01JUFNfREIxMjAwCi0JJmF1MTIwMF9tbWMxX2RldmljZSwKLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgU01CVVNfUFNDX0JBU0UKLQkmcGJkYl9zbWJ1c19kZXZpY2UsCi0jZW5kaWYKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGF1MXh4eF9wbGF0Zm9ybV9pbml0KHZvaWQpCiB7Ci0JaW50IGVyciwgY3R5cGUgPSBhbGNoZW15X2dldF9jcHV0eXBlKCk7CisJaW50IGN0eXBlID0gYWxjaGVteV9nZXRfY3B1dHlwZSgpOwogCiAJYWxjaGVteV9zZXR1cF91YXJ0cyhjdHlwZSk7CiAJYWxjaGVteV9zZXR1cF9tYWNzKGN0eXBlKTsKKwlhbGNoZW15X3NldHVwX3VzYihjdHlwZSk7CiAKLQllcnIgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhdTF4eHhfcGxhdGZvcm1fZGV2aWNlcywKLQkJCQkgICBBUlJBWV9TSVpFKGF1MXh4eF9wbGF0Zm9ybV9kZXZpY2VzKSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogYXJjaF9pbml0Y2FsbChhdTF4eHhfcGxhdGZvcm1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcG93ZXIuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCmluZGV4IGI4NjMyNGEuLmJkZDY2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCkBAIC0zNyw4ICszNyw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAKLSNpZmRlZiBDT05GSUdfUE0KLQogLyoKICAqIFdlIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIGEgYnVuY2ggb2YgY29yZSByZWdpc3RlcnMgdGhhdCBhcmUKICAqIGVpdGhlciB2b2xhdGlsZSBvciByZXNldCB0byBzb21lIHN0YXRlIGFjcm9zcyBhIHByb2Nlc3NvciBzbGVlcC4KQEAgLTQ5LDcgKzQ3LDYgQEAKICAqIFdlIG9ubHkgaGF2ZSB0byBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzIHRoYXQgYXJlbid0IG90aGVyd2lzZQogICogZG9uZSBhcyBwYXJ0IG9mIGEgZHJpdmVyIHBtXyogZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdXNiWzJdOwogc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF9zeXNfY2xvY2tzWzVdOwogc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF9zeXNfcGluZnVuYzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfc3RhdGljX21lbWN0bHJbNF1bM107CkBAIC01NywzMSArNTQsNiBAQAogCiBzdGF0aWMgdm9pZCBzYXZlX2NvcmVfcmVncyh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfU09DX0FVMTIwMAotCS8qIFNodXRkb3duIFVTQiBob3N0L2RldmljZS4gKi8KLQlzbGVlcF91c2JbMF0gPSBhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpOwotCi0JLyogVGhlcmUgYXBwZWFycyB0byBiZSBzb21lIHVuZG9jdW1lbnRlZCByZXNldCByZWdpc3Rlci4uLi4gKi8KLQlhdV93cml0ZWwoMCwgMHhiMDEwMDAwNCk7Ci0JYXVfc3luYygpOwotCWF1X3dyaXRlbCgwLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQotCXNsZWVwX3VzYlsxXSA9IGF1X3JlYWRsKFVTQkRfRU5BQkxFKTsKLQlhdV93cml0ZWwoMCwgVVNCRF9FTkFCTEUpOwotCWF1X3N5bmMoKTsKLQotI2Vsc2UJLyogQVUxMjAwICovCi0KLQkvKiBlbmFibGUgYWNjZXNzIHRvIE9URyBtbWlvIHNvIHdlIGNhbiBzYXZlIE9URyBDQVAvTVVYLgotCSAqIEZJWE1FOiB3cml0ZSBhbiBPVEcgZHJpdmVyIGFuZCBtb3ZlIHRoaXMgc3R1ZmYgdGhlcmUhCi0JICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9NU1JfQkFTRSArIDQpIHwgKDEgPDwgNiksIFVTQl9NU1JfQkFTRSArIDQpOwotCWF1X3N5bmMoKTsKLQlzbGVlcF91c2JbMF0gPSBhdV9yZWFkbCgweGI0MDIwMDIwKTsJLyogT1RHX0NBUCAqLwotCXNsZWVwX3VzYlsxXSA9IGF1X3JlYWRsKDB4YjQwMjAwMjQpOwkvKiBPVEdfTVVYICovCi0jZW5kaWYKLQogCS8qIENsb2NrcyBhbmQgUExMcy4gKi8KIAlzbGVlcF9zeXNfY2xvY2tzWzBdID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7CiAJc2xlZXBfc3lzX2Nsb2Nrc1sxXSA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDEpOwpAQCAtMTI1LDIyICs5Nyw2IEBACiAJYXVfd3JpdGVsKHNsZWVwX3N5c19waW5mdW5jLCBTWVNfUElORlVOQyk7CiAJYXVfc3luYygpOwogCi0jaWZuZGVmIENPTkZJR19TT0NfQVUxMjAwCi0JYXVfd3JpdGVsKHNsZWVwX3VzYlswXSwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV93cml0ZWwoc2xlZXBfdXNiWzFdLCBVU0JEX0VOQUJMRSk7Ci0JYXVfc3luYygpOwotI2Vsc2UKLQkvKiBlbmFibGUgYWNjZXNzIHRvIE9URyBtZW1vcnkgKi8KLQlhdV93cml0ZWwoYXVfcmVhZGwoVVNCX01TUl9CQVNFICsgNCkgfCAoMSA8PCA2KSwgVVNCX01TUl9CQVNFICsgNCk7Ci0JYXVfc3luYygpOwotCi0JLyogcmVzdG9yZSBPVEcgY2FwcyBhbmQgcG9ydCBtdXguICovCi0JYXVfd3JpdGVsKHNsZWVwX3VzYlswXSwgMHhiNDAyMDAyMCArIDApOwkvKiBPVEdfQ0FQICovCi0JYXVfc3luYygpOwotCWF1X3dyaXRlbChzbGVlcF91c2JbMV0sIDB4YjQwMjAwMjAgKyA0KTsJLyogT1RHX01VWCAqLwotCWF1X3N5bmMoKTsKLSNlbmRpZgotCiAJLyogUmVzdG9yZSB0aGUgc3RhdGljIG1lbW9yeSBjb250cm9sbGVyIGNvbmZpZ3VyYXRpb24uICovCiAJYXVfd3JpdGVsKHNsZWVwX3N0YXRpY19tZW1jdGxyWzBdWzBdLCBNRU1fU1RDRkcwKTsKIAlhdV93cml0ZWwoc2xlZXBfc3RhdGljX21lbWN0bHJbMF1bMV0sIE1FTV9TVFRJTUUwKTsKQEAgLTE3NCw1ICsxMzAsMyBAQAogCiAJcmVzdG9yZV9jb3JlX3JlZ3MoKTsKIH0KLQotI2VuZGlmCS8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwppbmRleCAxYjg4N2M4Li4zN2ZmZDk5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwpAQCAtNzMsOCArNzMsOCBAQAogLyogVGhpcyByb3V0aW5lIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIEF1MXggYmFzZWQgYm9hcmRzICovCiBwaHlzX3QgX19maXh1cF9iaWdwaHlzX2FkZHIocGh5c190IHBoeXNfYWRkciwgcGh5c190IHNpemUpCiB7Ci0JdTMyIHN0YXJ0ID0gKHUzMilBdTE1MDBfUENJX01FTV9TVEFSVDsKLQl1MzIgZW5kICAgPSAodTMyKUF1MTUwMF9QQ0lfTUVNX0VORDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gQUxDSEVNWV9QQ0lfTUVNV0lOX1NUQVJUOworCXVuc2lnbmVkIGxvbmcgZW5kID0gQUxDSEVNWV9QQ0lfTUVNV0lOX0VORDsKIAogCS8qIERvbid0IGZpeHVwIDM2LWJpdCBhZGRyZXNzZXMgKi8KIAlpZiAoKHBoeXNfYWRkciA+PiAzMikgIT0gMCkKQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qIENoZWNrIGZvciBQQ0kgbWVtb3J5IHdpbmRvdyAqLwogCWlmIChwaHlzX2FkZHIgPj0gc3RhcnQgJiYgKHBoeXNfYWRkciArIHNpemUgLSAxKSA8PSBlbmQpCi0JCXJldHVybiAocGh5c190KSgocGh5c19hZGRyIC0gc3RhcnQpICsgQXUxNTAwX1BDSV9NRU1fU1RBUlQpOworCQlyZXR1cm4gKHBoeXNfdCkoQVUxNTAwX1BDSV9NRU1fUEhZU19BRERSICsgcGh5c19hZGRyKTsKIAogCS8qIGRlZmF1bHQgbm9wICovCiAJcmV0dXJuIHBoeXNfYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjEyMDAvcGxhdGZvcm0uYwppbmRleCBmYmI1NTkzLi5jNjE4NjdjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxMjAwL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMTIwMC9wbGF0Zm9ybS5jCkBAIC0yMTMsNyArMjEzLDEyIEBACiAJCS5zdGFydAk9IERCMTIwMF9JREVfSU5ULAogCQkuZW5kCT0gREIxMjAwX0lERV9JTlQsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0KKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMSwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCiBzdGF0aWMgdTY0IGlkZV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKQEAgLTMyOCwyMyArMzMzLDg1IEBACiAJLmJyaWdodG5lc3Nfc2V0CT0gZGIxMjAwX21tY2xlZF9zZXQsCiB9OwogCi0vKiBuZWVkZWQgYnkgYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3BsYXRmb3JtLmMgKi8KLXN0cnVjdCBhdTF4bW1jX3BsYXRmb3JtX2RhdGEgYXUxeG1tY19wbGF0ZGF0YVtdID0geworc3RhdGljIHN0cnVjdCBhdTF4bW1jX3BsYXRmb3JtX2RhdGEgZGIxMjAwbW1jX3BsYXRkYXRhID0geworCS5jZF9zZXR1cAk9IGRiMTIwMF9tbWNfY2Rfc2V0dXAsCisJLnNldF9wb3dlcgk9IGRiMTIwMF9tbWNfc2V0X3Bvd2VyLAorCS5jYXJkX2luc2VydGVkCT0gZGIxMjAwX21tY19jYXJkX2luc2VydGVkLAorCS5jYXJkX3JlYWRvbmx5CT0gZGIxMjAwX21tY19jYXJkX3JlYWRvbmx5LAorCS5sZWQJCT0gJmRiMTIwMF9tbWNfbGVkLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5jZF9zZXR1cAk9IGRiMTIwMF9tbWNfY2Rfc2V0dXAsCi0JCS5zZXRfcG93ZXIJPSBkYjEyMDBfbW1jX3NldF9wb3dlciwKLQkJLmNhcmRfaW5zZXJ0ZWQJPSBkYjEyMDBfbW1jX2NhcmRfaW5zZXJ0ZWQsCi0JCS5jYXJkX3JlYWRvbmx5CT0gZGIxMjAwX21tY19jYXJkX3JlYWRvbmx5LAotCQkubGVkCQk9ICZkYjEyMDBfbW1jX2xlZCwKKwkJLnN0YXJ0CT0gQVUxMTAwX1NEMF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTExMDBfU0QwX1BIWVNfQUREUiArIDB4ZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX1NEX0lOVCwKKwkJLmVuZAk9IEFVMTIwMF9TRF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgwLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDAsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9Cit9OworCitzdGF0aWMgdTY0IGF1MXh4eF9tbWNfZG1hbWFzayA9ICBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjEyMDBfbW1jMF9kZXYgPSB7CisJLm5hbWUJCT0gImF1MXh4eC1tbWMiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmYXUxeHh4X21tY19kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmZGIxMjAwbW1jX3BsYXRkYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTIwMF9tbWMwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gYXUxMjAwX21tYzBfcmVzb3VyY2VzLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX2xjZF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9MQ0RfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMjAwX0xDRF9QSFlTX0FERFIgKyAweDgwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVTEyMDBfTENEX0lOVCwKKwkJLmVuZAk9IEFVMTIwMF9MQ0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgdTY0IGF1MTIwMF9sY2RfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MTIwMF9sY2RfZGV2ID0geworCS5uYW1lCQk9ICJhdTEyMDAtbGNkIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MTIwMF9sY2RfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfbGNkX3JlcyksCisJLnJlc291cmNlCT0gYXUxMjAwX2xjZF9yZXMsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfcHNjMF9yZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAk9IFBTQzBfUEhZU19BRERSLAotCQkuZW5kCT0gUFNDMF9QSFlTX0FERFIgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQJPSBBVTE1NTBfUFNDMF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1NTBfUFNDMF9QSFlTX0FERFIgKyAweGZmZiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7CkBAIC0zNTMsMTMgKzQyMCwxMyBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCVsyXSA9IHsKLQkJLnN0YXJ0CT0gRFNDUl9DTUQwX1BTQzBfVFgsCi0JCS5lbmQJPSBEU0NSX0NNRDBfUFNDMF9UWCwKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1RYLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1RYLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKIAl9LAogCVszXSA9IHsKLQkJLnN0YXJ0CT0gRFNDUl9DTUQwX1BTQzBfUlgsCi0JCS5lbmQJPSBEU0NSX0NNRDBfUFNDMF9SWCwKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1JYLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1JYLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKIAl9LAogfTsKQEAgLTQwMSw4ICs0NjgsOCBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTIwMF9wc2MxX3Jlc1tdID0gewogCVswXSA9IHsKLQkJLnN0YXJ0CT0gUFNDMV9QSFlTX0FERFIsCi0JCS5lbmQJPSBQU0MxX1BIWVNfQUREUiArIDB4MDAwZmZmZmYsCisJCS5zdGFydAk9IEFVMTU1MF9QU0MxX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTU1MF9QU0MxX1BIWVNfQUREUiArIDB4ZmZmLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKQEAgLTQxMSwxNyArNDc4LDE4IEBACiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJWzJdID0gewotCQkuc3RhcnQJPSBEU0NSX0NNRDBfUFNDMV9UWCwKLQkJLmVuZAk9IERTQ1JfQ01EMF9QU0MxX1RYLAorCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfVFgsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfVFgsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAogCX0sCiAJWzNdID0gewotCQkuc3RhcnQJPSBEU0NSX0NNRDBfUFNDMV9SWCwKLQkJLmVuZAk9IERTQ1JfQ01EMF9QU0MxX1JYLAorCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfUlgsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1BTQzFfUlgsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAogCX0sCiB9OwogCisvKiBBQzk3IG9yIEkyUyBkZXZpY2UgKi8KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMTIwMF9hdWRpb19kZXYgPSB7CiAJLyogbmFtZSBhc3NpZ25lZCBsYXRlciBiYXNlZCBvbiBzd2l0Y2ggc2V0dGluZyAqLwogCS5pZAkJPSAxLAkvKiBQU0MgSUQgKi8KQEAgLTQyOSwxOSArNDk3LDM0IEBACiAJLnJlc291cmNlCT0gYXUxMjAwX3BzYzFfcmVzLAogfTsKIAorLyogREIxMjAwIEFTb0MgY2FyZCBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMTIwMF9zb3VuZF9kZXYgPSB7CisJLyogbmFtZSBhc3NpZ25lZCBsYXRlciBiYXNlZCBvbiBzd2l0Y2ggc2V0dGluZyAqLworCS5pZAkJPSAxLAkvKiBQU0MgSUQgKi8KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMTIwMF9zdGFjX2RldiA9IHsKIAkubmFtZQkJPSAiYWM5Ny1jb2RlYyIsCiAJLmlkCQk9IDEsCS8qIG9uIFBTQzEgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMTIwMF9hdWRpb2RtYV9kZXYgPSB7CisJLm5hbWUJCT0gImF1MXhwc2MtcGNtIiwKKwkuaWQJCT0gMSwJLyogUFNDIElEICovCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGIxMjAwX2RldnNbXSBfX2luaXRkYXRhID0gewogCU5VTEwsCQkvKiBQU0MwLCBzZWxlY3RlZCBieSBTNi44ICovCiAJJmRiMTIwMF9pZGVfZGV2LAorCSZkYjEyMDBfbW1jMF9kZXYsCisJJmF1MTIwMF9sY2RfZGV2LAogCSZkYjEyMDBfZXRoX2RldiwKIAkmZGIxMjAwX3J0Y19kZXYsCiAJJmRiMTIwMF9uYW5kX2RldiwKKwkmZGIxMjAwX2F1ZGlvZG1hX2RldiwKIAkmZGIxMjAwX2F1ZGlvX2RldiwKIAkmZGIxMjAwX3N0YWNfZGV2LAorCSZkYjEyMDBfc291bmRfZGV2LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZGIxMjAwX2Rldl9pbml0KHZvaWQpCkBAIC01MDEsNDEgKzU4NCwzOSBAQAogCWlmIChzdyA9PSBCQ1NSX1NXSVRDSEVTX0RJUF84KSB7CiAJCWJjc3JfbW9kKEJDU1JfUkVTRVRTLCAwLCBCQ1NSX1JFU0VUU19QU0MxTVVYKTsKIAkJZGIxMjAwX2F1ZGlvX2Rldi5uYW1lID0gImF1MXhwc2NfaTJzIjsKKwkJZGIxMjAwX3NvdW5kX2Rldi5uYW1lID0gImRiMTIwMC1pMnMiOwogCQlwcmludGsoS0VSTl9JTkZPICIgUzYuNyBPTiA6IFBTQzEgbW9kZSBJMlNcbiIpOwogCX0gZWxzZSB7CiAJCWJjc3JfbW9kKEJDU1JfUkVTRVRTLCBCQ1NSX1JFU0VUU19QU0MxTVVYLCAwKTsKIAkJZGIxMjAwX2F1ZGlvX2Rldi5uYW1lID0gImF1MXhwc2NfYWM5NyI7CisJCWRiMTIwMF9zb3VuZF9kZXYubmFtZSA9ICJkYjEyMDAtYWM5NyI7CiAJCXByaW50ayhLRVJOX0lORk8gIiBTNi43IE9GRjogUFNDMSBtb2RlIEFDOTdcbiIpOwogCX0KIAogCS8qIEF1ZGlvIFBTQyBjbG9jayBpcyBzdXBwbGllZCBleHRlcm5hbGx5LiAoRklYTUU6IHBsYXRkYXRhISEpICovCiAJX19yYXdfd3JpdGVsKFBTQ19TRUxfQ0xLX1NFUkNMSywKLQkJKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihQU0MxX1BIWVNfQUREUikgKyBQU0NfU0VMX09GRlNFVCk7CisJCSh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTUwX1BTQzFfUEhZU19BRERSKSArIFBTQ19TRUxfT0ZGU0VUKTsKIAl3bWIoKTsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAotCQkJCSAgICBEQjEyMDBfUEMwX0lOVCwKLQkJCQkgICAgREIxMjAwX1BDMF9JTlNFUlRfSU5ULAotCQkJCSAgICAvKkRCMTIwMF9QQzBfU1RTQ0hHX0lOVCovMCwKLQkJCQkgICAgREIxMjAwX1BDMF9FSkVDVF9JTlQsCi0JCQkJICAgIDApOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKKwkJREIxMjAwX1BDMF9JTlQsIERCMTIwMF9QQzBfSU5TRVJUX0lOVCwKKwkJLypEQjEyMDBfUEMwX1NUU0NIR19JTlQqLzAsIERCMTIwMF9QQzBfRUpFQ1RfSU5ULCAwKTsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQ0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQ0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMTAwMDAgLSAxLAotCQkJCSAgICBEQjEyMDBfUEMxX0lOVCwKLQkJCQkgICAgREIxMjAwX1BDMV9JTlNFUlRfSU5ULAotCQkJCSAgICAvKkRCMTIwMF9QQzFfU1RTQ0hHX0lOVCovMCwKLQkJCQkgICAgREIxMjAwX1BDMV9FSkVDVF9JTlQsCi0JCQkJICAgIDEpOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQ0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwNDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA0MDEwMDAwIC0gMSwKKwkJREIxMjAwX1BDMV9JTlQsIERCMTIwMF9QQzFfSU5TRVJUX0lOVCwKKwkJLypEQjEyMDBfUEMxX1NUU0NIR19JTlQqLzAsIERCMTIwMF9QQzFfRUpFQ1RfSU5ULCAxKTsKIAogCXN3YXBwZWQgPSBiY3NyX3JlYWQoQkNTUl9TVEFUVVMpICYgQkNTUl9TVEFUVVNfREIxMjAwX1NXQVBCT09UOwogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goNjQgPDwgMjAsIDIsIHN3YXBwZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jCmluZGV4IDVjOTU2ZmUuLjdjZDM2ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvYm9hcmRfc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2JvYXJkX3NldHVwLmMKQEAgLTQwLDI0ICs0MCw2IEBACiAKICNpbmNsdWRlIDxwcm9tLmg+CiAKLSNpZmRlZiBDT05GSUdfTUlQU19EQjE1MDAKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTJdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDEyIC0gSFBUMzcxICAgKi8KLQlbMTNdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIEFVMTUwMF9QQ0lfSU5UQywgQVUxNTAwX1BDSV9JTlREIH0sIC8qIElEU0VMIDEzIC0gUENJIHNsb3QgKi8KLX07Ci0KLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfTUlQU19EQjE1NTAKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTFdID0geyAtMSwgQVUxNTUwX1BDSV9JTlRDLCAweGZmLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDExIC0gb24tYm9hcmQgSFBUMzcxICovCi0JWzEyXSA9IHsgLTEsIEFVMTU1MF9QQ0lfSU5UQiwgQVUxNTUwX1BDSV9JTlRDLCBBVTE1NTBfUENJX0lOVEQsIEFVMTU1MF9QQ0lfSU5UQSB9LCAvKiBJRFNFTCAxMiAtIFBDSSBzbG90IDIgKGxlZnQpICovCi0JWzEzXSA9IHsgLTEsIEFVMTU1MF9QQ0lfSU5UQSwgQVUxNTUwX1BDSV9JTlRCLCBBVTE1NTBfUENJX0lOVEMsIEFVMTU1MF9QQ0lfSU5URCB9LCAvKiBJRFNFTCAxMyAtIFBDSSBzbG90IDEgKHJpZ2h0KSAqLwotfTsKLSNlbmRpZgotCi0KICNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUwogY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0gewogCVsxMV0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAxMSAtIG1pbmlQQ0kgICovCkBAIC05MSwxMiArNzMsNiBAQAogCiAKICNpZmRlZiBDT05GSUdfTUlQU19NSVJBR0UKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTFdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRELCAweGZmLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDExIC0gU01JIFZHWCAqLwotCVsxMl0gPSB7IC0xLCAweGZmLCAweGZmLCBBVTE1MDBfUENJX0lOVEMsIDB4ZmYgfSwgLyogSURTRUwgMTIgLSBQTlgxMzAwICovCi0JWzEzXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRCLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDEzIC0gbWluaVBDSSAqLwotfTsKLQogc3RhdGljIHZvaWQgbWlyYWdlX3Bvd2VyX29mZih2b2lkKQogewogCWFsY2hlbXlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIxMCwgMSk7CkBAIC0xNTgsOSArMTM0LDcgQEAKIAkvKiBpbml0aWFsaXplIGJvYXJkIHJlZ2lzdGVyIHNwYWNlICovCiAJYmNzcl9pbml0KGJjc3IxLCBiY3NyMik7CiAKLQkvKiBOb3QgdmFsaWQgZm9yIEF1MTU1MCAqLwotI2lmIGRlZmluZWQoQ09ORklHX0lSREEpICYmIFwKLSAgIChkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxMTAwKSkKKyNpZiBkZWZpbmVkKENPTkZJR19JUkRBKSAmJiBkZWZpbmVkKENPTkZJR19BVTEwMDBfRklSKQogCXsKIAkJdTMyIHBpbl9mdW5jOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL3BsYXRmb3JtLmMKaW5kZXggOTc4ZDVhYi4uOWU2YjNkNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvcGxhdGZvcm0uYwpAQCAtMTksMTIgKzE5LDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwX2RtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CiAjaW5jbHVkZSAiLi4vcGxhdGZvcm0uaCIKIAorc3RydWN0IHBjaV9kZXY7CisKIC8qIERCMXh4eCBQQ01DSUEgaW50ZXJydXB0IHNvdXJjZXM6CiAgKiBDRDAvMSAJR1BJTzAvMwogICogU1RTQ0hHMC8xCUdQSU8xLzQKQEAgLTg1LDM0ICs5MCwyMjcgQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENJCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTAwCitzdGF0aWMgaW50IGRiMXh4eF9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCWlmICgoc2xvdCA8IDEyKSB8fCAoc2xvdCA+IDEzKSB8fCBwaW4gPT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChzbG90ID09IDEyKQorCQlyZXR1cm4gKHBpbiA9PSAxKSA/IEFVMTUwMF9QQ0lfSU5UQSA6IDB4ZmY7CisJaWYgKHNsb3QgPT0gMTMpIHsKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRBOworCQljYXNlIDI6IHJldHVybiBBVTE1MDBfUENJX0lOVEI7CisJCWNhc2UgMzogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQzsKKwkJY2FzZSA0OiByZXR1cm4gQVUxNTAwX1BDSV9JTlREOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCitzdGF0aWMgaW50IGRiMXh4eF9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCWlmICgoc2xvdCA8IDExKSB8fCAoc2xvdCA+IDEzKSB8fCBwaW4gPT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChzbG90ID09IDExKQorCQlyZXR1cm4gKHBpbiA9PSAxKSA/IEFVMTU1MF9QQ0lfSU5UQyA6IDB4ZmY7CisJaWYgKHNsb3QgPT0gMTIpIHsKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVUxNTUwX1BDSV9JTlRCOworCQljYXNlIDI6IHJldHVybiBBVTE1NTBfUENJX0lOVEM7CisJCWNhc2UgMzogcmV0dXJuIEFVMTU1MF9QQ0lfSU5URDsKKwkJY2FzZSA0OiByZXR1cm4gQVUxNTUwX1BDSV9JTlRBOworCQl9CisJfQorCWlmIChzbG90ID09IDEzKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTU1MF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTUwX1BDSV9JTlRCOworCQljYXNlIDM6IHJldHVybiBBVTE1NTBfUENJX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFVMTU1MF9QQ0lfSU5URDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCitzdGF0aWMgaW50IGRiMXh4eF9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCWlmICgoc2xvdCA8IDExKSB8fCAoc2xvdCA+IDEzKSB8fCBwaW4gPT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChzbG90ID09IDEyKQorCQlyZXR1cm4gKHBpbiA9PSAxKSA/IEFVMTUwMF9QQ0lfSU5UQSA6IDB4ZmY7CisJaWYgKHNsb3QgPT0gMTEpIHsKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRBOworCQljYXNlIDI6IHJldHVybiBBVTE1MDBfUENJX0lOVEI7CisJCWRlZmF1bHQ6IHJldHVybiAweGZmOworCQl9CisJfQorCWlmIChzbG90ID09IDEzKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRCOworCQljYXNlIDM6IHJldHVybiBBVTE1MDBfUENJX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFVMTUwMF9QQ0lfSU5URDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX01JUkFHRQorc3RhdGljIGludCBkYjF4eHhfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMSkgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMSkKKwkJcmV0dXJuIChwaW4gPT0gMSkgPyBBVTE1MDBfUENJX0lOVEQgOiAweGZmOworCWlmIChzbG90ID09IDEyKQorCQlyZXR1cm4gKHBpbiA9PSAzKSA/IEFVMTUwMF9QQ0lfSU5UQyA6IDB4ZmY7CisJaWYgKHNsb3QgPT0gMTMpIHsKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRBOworCQljYXNlIDI6IHJldHVybiBBVTE1MDBfUENJX0lOVEI7CisJCWRlZmF1bHQ6IHJldHVybiAweGZmOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2hvc3RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFsY2hlbXlfcGNpX3BsYXRkYXRhIGRiMXh4eF9wY2lfcGQgPSB7CisJLmJvYXJkX21hcF9pcnEJPSBkYjF4eHhfbWFwX3BjaV9pcnEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkYjF4eHhfcGNpX2hvc3RfZGV2ID0geworCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZkYjF4eHhfcGNpX3BkLAorCS5uYW1lCQk9ICJhbGNoZW15LXBjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFsY2hlbXlfcGNpX2hvc3RfcmVzKSwKKwkucmVzb3VyY2UJPSBhbGNoZW15X3BjaV9ob3N0X3JlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRiMTV4MF9wY2lfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRiMXh4eF9wY2lfaG9zdF9kZXYpOworfQorLyogbXVzdCBiZSBhcmNoX2luaXRjYWxsOyBNSVBTIFBDSSBzY2FucyBidXNzZXMgaW4gYSBzdWJzeXNfaW5pdGNhbGwgKi8KK2FyY2hfaW5pdGNhbGwoZGIxNXgwX3BjaV9pbml0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxMTAwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTEwMF9sY2RfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTExMDBfTENEX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTEwMF9MQ0RfUEhZU19BRERSICsgMHg4MDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMTAwX0xDRF9JTlQsCisJCS5lbmQJPSBBVTExMDBfTENEX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHU2NCBhdTExMDBfbGNkX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdTExMDBfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXUxMTAwLWxjZCIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLmRtYV9tYXNrCQk9ICZhdTExMDBfbGNkX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXUxMTAwX2xjZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGF1MTEwMF9sY2RfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfYWM5N2NfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTEwMDBfQUM5N19QSFlTX0FERFIsCisJCS5lbmQJPSBBVTEwMDBfQUM5N19QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IERNQV9JRF9BQzk3Q19UWCwKKwkJLmVuZAk9IERNQV9JRF9BQzk3Q19UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IERNQV9JRF9BQzk3Q19SWCwKKwkJLmVuZAk9IERNQV9JRF9BQzk3Q19SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFsY2hlbXlfYWM5N2NfZGV2ID0geworCS5uYW1lCQk9ICJhbGNoZW15LWFjOTdjIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gYWxjaGVteV9hYzk3Y19yZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFsY2hlbXlfYWM5N2NfcmVzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFsY2hlbXlfYWM5N2NfZG1hX2RldiA9IHsKKwkubmFtZQkJPSAiYWxjaGVteS1wY20tZG1hIiwKKwkuaWQJCT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMXgwMF9jb2RlY19kZXYgPSB7CisJLm5hbWUJCT0gImFjOTctY29kZWMiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRiMXgwMF9hdWRpb19kZXYgPSB7CisJLm5hbWUJCT0gImRiMTAwMC1hdWRpbyIsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBkYjF4eHhfZGV2X2luaXQodm9pZCkKIHsKICNpZmRlZiBEQjFYWFhfSEFTX1BDTUNJQQotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAotCQkJCSAgICBEQjFYWFhfUENNQ0lBX0NBUkQwLAotCQkJCSAgICBEQjFYWFhfUENNQ0lBX0NEMCwKLQkJCQkgICAgLypEQjFYWFhfUENNQ0lBX1NUU0NIRzAqLzAsCi0JCQkJICAgIDAsCi0JCQkJICAgIDApOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKKwkJREIxWFhYX1BDTUNJQV9DQVJEMCwgREIxWFhYX1BDTUNJQV9DRDAsCisJCS8qREIxWFhYX1BDTUNJQV9TVFNDSEcwKi8wLCAwLCAwKTsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQ0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQ0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDQwMTAwMDAgLSAxLAotCQkJCSAgICBEQjFYWFhfUENNQ0lBX0NBUkQxLAotCQkJCSAgICBEQjFYWFhfUENNQ0lBX0NEMSwKLQkJCQkgICAgLypEQjFYWFhfUENNQ0lBX1NUU0NIRzEqLzAsCi0JCQkJICAgIDAsCi0JCQkJICAgIDEpOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA0MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDQ0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDQwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwNDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwNDAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA0MDEwMDAwIC0gMSwKKwkJREIxWFhYX1BDTUNJQV9DQVJEMSwgREIxWFhYX1BDTUNJQV9DRDEsCisJCS8qREIxWFhYX1BDTUNJQV9TVFNDSEcxKi8wLCAwLCAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX0RCMTEwMAorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXUxMTAwX2xjZF9kZXZpY2UpOwogI2VuZGlmCiAJZGIxeF9yZWdpc3Rlcl9ub3JmbGFzaChCT0FSRF9GTEFTSF9TSVpFLCBCT0FSRF9GTEFTSF9XSURUSCwgRl9TV0FQUEVEKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZGIxeDAwX2NvZGVjX2Rldik7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhbGNoZW15X2FjOTdjX2RtYV9kZXYpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWxjaGVteV9hYzk3Y19kZXYpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZGIxeDAwX2F1ZGlvX2Rldik7CisKIAlyZXR1cm4gMDsKIH0KIGRldmljZV9pbml0Y2FsbChkYjF4eHhfZGV2X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTEwMC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTEwMC9wbGF0Zm9ybS5jCmluZGV4IDJjOGRjMjkuLjljNTdjMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjExMDAvcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMTAwL3BsYXRmb3JtLmMKQEAgLTE5LDMxICsxOSw1OCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogCiAjaW5jbHVkZSAiLi4vcGxhdGZvcm0uaCIKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTExMDBfbGNkX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMTAwX0xDRF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTExMDBfTENEX1BIWVNfQUREUiArIDB4ODAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTEwMF9MQ0RfSU5ULAorCQkuZW5kCT0gQVUxMTAwX0xDRF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyB1NjQgYXUxMTAwX2xjZF9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXUxMTAwX2xjZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF1MTEwMC1sY2QiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmYXUxMTAwX2xjZF9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTEwMF9sY2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBhdTExMDBfbGNkX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHBiMTEwMF9kZXZfaW5pdCh2b2lkKQogewogCWludCBzd2FwcGVkOwogCiAJLyogUENNQ0lBLiBzaW5nbGUgc29ja2V0LCBpZGVudGljYWwgdG8gUGIxNTAwICovCi0JZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KFBDTUNJQV9BVFRSX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCi0JCQkJICAgIEFVMTEwMF9HUElPMTFfSU5ULAkgLyogY2FyZCAqLwotCQkJCSAgICBBVTExMDBfR1BJTzlfSU5ULAkgLyogaW5zZXJ0ICovCi0JCQkJICAgIC8qQVUxMTAwX0dQSU8xMF9JTlQqLzAsIC8qIHN0c2NoZyAqLwotCQkJCSAgICAwLAkJCSAvKiBlamVjdCAqLwotCQkJCSAgICAwKTsJCQkgLyogaWQgKi8KKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCisJCUFVMTEwMF9HUElPMTFfSU5ULCBBVTExMDBfR1BJTzlfSU5ULAkgLyogY2FyZCAvIGluc2VydCAqLworCQkvKkFVMTEwMF9HUElPMTBfSU5UKi8wLCAwLCAwKTsgLyogc3RzY2hnIC8gZWplY3QgLyBpZCAqLwogCiAJc3dhcHBlZCA9IGJjc3JfcmVhZChCQ1NSX1NUQVRVUykgJiAgQkNTUl9TVEFUVVNfREIxMDAwX1NXQVBCT09UOwogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goNjQgKiAxMDI0ICogMTAyNCwgNCwgc3dhcHBlZCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdTExMDBfbGNkX2RldmljZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvcGxhdGZvcm0uYwppbmRleCAzZWYyZGNlLi41NGY3ZjdiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9wbGF0Zm9ybS5jCkBAIC0yNCw5ICsyNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMTAwX21tYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaD4KIAogI2luY2x1ZGUgIi4uL3BsYXRmb3JtLmgiCiAKQEAgLTg4LDcgKzkwLDcgQEAKIAlyZXR1cm4gKGJjc3JfcmVhZChCQ1NSX1NJR1NUQVQpICYgQkNTUl9JTlRfU0QxSU5TRVJUKSA/IDEgOiAwOwogfQogCi1jb25zdCBzdHJ1Y3QgYXUxeG1tY19wbGF0Zm9ybV9kYXRhIGF1MXhtbWNfcGxhdGRhdGFbMl0gPSB7CitzdGF0aWMgc3RydWN0IGF1MXhtbWNfcGxhdGZvcm1fZGF0YSBwYjEyMDBtbWNfcGxhdGRhdGFbMl0gPSB7CiAJWzBdID0gewogCQkuc2V0X3Bvd2VyCT0gcGIxMjAwbW1jMF9zZXRfcG93ZXIsCiAJCS5jYXJkX2luc2VydGVkCT0gcGIxMjAwbW1jMF9jYXJkX2luc2VydGVkLApAQCAtMTA1LDYgKzEwNyw3OSBAQAogCX0sCiB9OwogCitzdGF0aWMgdTY0IGF1MXh4eF9tbWNfZG1hbWFzayA9ICBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF1MTIwMF9tbWMwX3Jlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMTAwX1NEMF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTExMDBfU0QwX1BIWVNfQUREUiArIDB4ZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX1NEX0lOVCwKKwkJLmVuZAk9IEFVMTIwMF9TRF9JTlQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgwLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19SWDAsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYjEyMDBfbW1jMF9kZXYgPSB7CisJLm5hbWUJCT0gImF1MXh4eC1tbWMiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSAmYXUxeHh4X21tY19kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmcGIxMjAwbW1jX3BsYXRkYXRhWzBdLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTIwMF9tbWMwX3JlcyksCisJLnJlc291cmNlCT0gYXUxMjAwX21tYzBfcmVzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTEyMDBfbW1jMV9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTEwMF9TRDFfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMTAwX1NEMV9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9TRF9JTlQsCisJCS5lbmQJPSBBVTEyMDBfU0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1RYMSwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzNdID0geworCQkuc3RhcnQJPSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfUlgxLAorCQkuZW5kCT0gQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGIxMjAwX21tYzFfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4eHgtbW1jIiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MXh4eF9tbWNfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJnBiMTIwMG1tY19wbGF0ZGF0YVsxXSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfbW1jMV9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9tbWMxX3JlcywKK307CisKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpZGVfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSBJREVfUEhZU19BRERSLApAQCAtMTE1LDcgKzE5MCwxMiBAQAogCQkuc3RhcnQJPSBJREVfSU5ULAogCQkuZW5kCT0gSURFX0lOVCwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEKLQl9CisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEsCisJCS5lbmQJPSBBVTEyMDBfRFNDUl9DTUQwX0RNQV9SRVExLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAogc3RhdGljIHU2NCBpZGVfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CkBAIC0xNjEsMzggKzI0MSw5NCBAQAogCS5yZXNvdXJjZQk9IHNtYzkxYzExMV9yZXNvdXJjZXMKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX3BzYzBfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1NTBfUFNDMF9QSFlTX0FERFIsCisJCS5lbmQJPSBBVTE1NTBfUFNDMF9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9QU0MwX0lOVCwKKwkJLmVuZAk9IEFVMTIwMF9QU0MwX0lOVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9SWCwKKwkJLmVuZAk9IEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBiMTIwMF9pMmNfZGV2ID0geworCS5uYW1lCQk9ICJhdTF4cHNjX3NtYnVzIiwKKwkuaWQJCT0gMCwJLyogYnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfcHNjMF9yZXMpLAorCS5yZXNvdXJjZQk9IGF1MTIwMF9wc2MwX3JlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXUxMjAwX2xjZF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTIwMF9MQ0RfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMjAwX0xDRF9QSFlTX0FERFIgKyAweDgwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVTEyMDBfTENEX0lOVCwKKwkJLmVuZAk9IEFVMTIwMF9MQ0RfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgdTY0IGF1MTIwMF9sY2RfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1MTIwMF9sY2RfZGV2ID0geworCS5uYW1lCQk9ICJhdTEyMDAtbGNkIiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkuZG1hX21hc2sJCT0gJmF1MTIwMF9sY2RfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdTEyMDBfbGNkX3JlcyksCisJLnJlc291cmNlCT0gYXUxMjAwX2xjZF9yZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYm9hcmRfcGxhdGZvcm1fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmlkZV9kZXZpY2UsCi0JJnNtYzkxYzExMV9kZXZpY2UKKwkmc21jOTFjMTExX2RldmljZSwKKwkmcGIxMjAwX2kyY19kZXYsCisJJnBiMTIwMF9tbWMwX2RldiwKKwkmcGIxMjAwX21tYzFfZGV2LAorCSZhdTEyMDBfbGNkX2RldiwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGJvYXJkX3JlZ2lzdGVyX2RldmljZXModm9pZCkKIHsKIAlpbnQgc3dhcHBlZDsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAotCQkJCSAgICBQQjEyMDBfUEMwX0lOVCwKLQkJCQkgICAgUEIxMjAwX1BDMF9JTlNFUlRfSU5ULAotCQkJCSAgICAvKlBCMTIwMF9QQzBfU1RTQ0hHX0lOVCovMCwKLQkJCQkgICAgUEIxMjAwX1BDMF9FSkVDVF9JTlQsCi0JCQkJICAgIDApOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKKwkJUEIxMjAwX1BDMF9JTlQsIFBCMTIwMF9QQzBfSU5TRVJUX0lOVCwKKwkJLypQQjEyMDBfUEMwX1NUU0NIR19JTlQqLzAsIFBCMTIwMF9QQzBfRUpFQ1RfSU5ULCAwKTsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDg0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDg0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMTAwMDAgLSAxLAotCQkJCSAgICBQQjEyMDBfUEMxX0lOVCwKLQkJCQkgICAgUEIxMjAwX1BDMV9JTlNFUlRfSU5ULAotCQkJCSAgICAvKlBCMTIwMF9QQzFfU1RTQ0hHX0lOVCovMCwKLQkJCQkgICAgUEIxMjAwX1BDMV9FSkVDVF9JTlQsCi0JCQkJICAgIDEpOworCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldCgKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA4MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDg0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDgwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwODQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwODAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDA4MDEwMDAwIC0gMSwKKwkJUEIxMjAwX1BDMV9JTlQsIFBCMTIwMF9QQzFfSU5TRVJUX0lOVCwKKwkJLypQQjEyMDBfUEMxX1NUU0NIR19JTlQqLzAsIFBCMTIwMF9QQzFfRUpFQ1RfSU5ULCAxKTsKIAogCXN3YXBwZWQgPSBiY3NyX3JlYWQoQkNTUl9TVEFUVVMpICYgIEJDU1JfU1RBVFVTX0RCMTIwMF9TV0FQQk9PVDsKIAlkYjF4X3JlZ2lzdGVyX25vcmZsYXNoKDEyOCAqIDEwMjQgKiAxMDI0LCAyLCBzd2FwcGVkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvYm9hcmRfc2V0dXAuYwppbmRleCAzYjRmYTMyLi4zN2MxODgzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9ib2FyZF9zZXR1cC5jCkBAIC0zMywxMyArMzMsNiBAQAogCiAjaW5jbHVkZSA8cHJvbS5oPgogCi0KLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTJdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmLCAweGZmIH0sICAgLyogSURTRUwgMTIgLSBIUFQzNzAJKi8KLQlbMTNdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIEFVMTUwMF9QQ0lfSU5UQywgQVUxNTAwX1BDSV9JTlREIH0sICAgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAqLwotfTsKLQotCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKIHsKIAlyZXR1cm4gIkFsY2hlbXkgUGIxNTAwIjsKQEAgLTEwMSwyMCArOTQsMTggQEAKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpICovCiAKICNpZmRlZiBDT05GSUdfUENJCi0JLyogU2V0dXAgUENJIGJ1cyBjb250cm9sbGVyICovCi0JYXVfd3JpdGVsKDAsIEF1MTUwMF9QQ0lfQ01FTSk7Ci0JYXVfd3JpdGVsKDB4MDAwMDNmZmYsIEF1MTUwMF9DRkdfQkFTRSk7Ci0jaWYgZGVmaW5lZChfX01JUFNFQl9fKQotCWF1X3dyaXRlbCgweGYgfCAoMiA8PCA2KSB8ICgxIDw8IDQpLCBBdTE1MDBfUENJX0NGRyk7Ci0jZWxzZQotCWF1X3dyaXRlbCgweGYsIEF1MTUwMF9QQ0lfQ0ZHKTsKLSNlbmRpZgotCWF1X3dyaXRlbCgweGYwMDAwMDAwLCBBdTE1MDBfUENJX01XTUFTS19ERVYpOwotCWF1X3dyaXRlbCgwLCBBdTE1MDBfUENJX01XQkFTRV9SRVZfQ0NMKTsKLQlhdV93cml0ZWwoMHgwMmEwMDM1NiwgQXUxNTAwX1BDSV9TVEFUQ01EKTsKLQlhdV93cml0ZWwoMHgwMDAwM2MwNCwgQXUxNTAwX1BDSV9IRFJUWVBFKTsKLQlhdV93cml0ZWwoMHgwMDAwMDAwOCwgQXUxNTAwX1BDSV9NQkFSKTsKLQlhdV9zeW5jKCk7CisJeworCQl2b2lkIF9faW9tZW0gKmJhc2UgPQorCQkJCSh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxNTAwX1BDSV9QSFlTX0FERFIpOworCQkvKiBTZXR1cCBQQ0kgYnVzIGNvbnRyb2xsZXIgKi8KKwkJX19yYXdfd3JpdGVsKDB4MDAwMDNmZmYsIGJhc2UgKyBQQ0lfUkVHX0NNRU0pOworCQlfX3Jhd193cml0ZWwoMHhmMDAwMDAwMCwgYmFzZSArIFBDSV9SRUdfTVdNQVNLX0RFVik7CisJCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgUENJX1JFR19NV0JBU0VfUkVWX0NDTCk7CisJCV9fcmF3X3dyaXRlbCgweDAyYTAwMzU2LCBiYXNlICsgUENJX1JFR19TVEFUQ01EKTsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDNjMDQsIGJhc2UgKyBQQ0lfUkVHX1BBUkFNKTsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIGJhc2UgKyBQQ0lfUkVHX01CQVIpOworCQl3bWIoKTsKKwl9CiAjZW5kaWYKIAogCS8qIEVuYWJsZSBzeXMgYnVzIGNsb2NrIGRpdmlkZXIgd2hlbiBJRExFIHN0YXRlIG9yIG5vIGJ1cyBhY3Rpdml0eS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvcGxhdGZvcm0uYwppbmRleCBkNDQzYmM3Li4xZTUyYTAxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9wbGF0Zm9ybS5jCkBAIC0xOCwzMiArMTgsNzcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvYmNzci5oPgogCiAjaW5jbHVkZSAiLi4vcGxhdGZvcm0uaCIKIAorc3RhdGljIGludCBwYjE1MDBfbWFwX3BjaV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpZiAoKHNsb3QgPCAxMikgfHwgKHNsb3QgPiAxMykgfHwgcGluID09IDApCisJCXJldHVybiAtMTsKKwlpZiAoc2xvdCA9PSAxMikKKwkJcmV0dXJuIChwaW4gPT0gMSkgPyBBVTE1MDBfUENJX0lOVEEgOiAweGZmOworCWlmIChzbG90ID09IDEzKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRCOworCQljYXNlIDM6IHJldHVybiBBVTE1MDBfUENJX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFVMTUwMF9QQ0lfSU5URDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWxjaGVteV9wY2lfaG9zdF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxNTAwX1BDSV9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWxjaGVteV9wY2lfcGxhdGRhdGEgcGIxNTAwX3BjaV9wZCA9IHsKKwkuYm9hcmRfbWFwX2lycQk9IHBiMTUwMF9tYXBfcGNpX2lycSwKKwkucGNpX2NmZ19zZXQJPSBQQ0lfQ09ORklHX0FFTiB8IFBDSV9DT05GSUdfUjJIIHwgUENJX0NPTkZJR19SMUggfAorCQkJICBQQ0lfQ09ORklHX0NIIHwKKyNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCisJCQkgIFBDSV9DT05GSUdfU0lDX0hXQV9EQVQgfCBQQ0lfQ09ORklHX1NNLAorI2Vsc2UKKwkJCSAgMCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGIxNTAwX3BjaV9ob3N0ID0geworCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZwYjE1MDBfcGNpX3BkLAorCS5uYW1lCQk9ICJhbGNoZW15LXBjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFsY2hlbXlfcGNpX2hvc3RfcmVzKSwKKwkucmVzb3VyY2UJPSBhbGNoZW15X3BjaV9ob3N0X3JlcywKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHBiMTUwMF9kZXZfaW5pdCh2b2lkKQogewogCWludCBzd2FwcGVkOwogCi0JLyogUENNQ0lBLiBzaW5nbGUgc29ja2V0LCBpZGVudGljYWwgdG8gUGIxNTAwICovCi0JZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KFBDTUNJQV9BVFRSX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDA0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCi0JCQkJICAgIEFVMTUwMF9HUElPMTFfSU5ULAkgLyogY2FyZCAqLwotCQkJCSAgICBBVTE1MDBfR1BJTzlfSU5ULAkgLyogaW5zZXJ0ICovCi0JCQkJICAgIC8qQVUxNTAwX0dQSU8xMF9JTlQqLzAsIC8qIHN0c2NoZyAqLwotCQkJCSAgICAwLAkJCSAvKiBlamVjdCAqLwotCQkJCSAgICAwKTsJCQkgLyogaWQgKi8KKwkvKiBQQ01DSUEuIHNpbmdsZSBzb2NrZXQsIGlkZW50aWNhbCB0byBQYjExMDAgKi8KKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDAwNDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwMDAxMDAwMCAtIDEsCisJCUFVMTUwMF9HUElPMTFfSU5ULCBBVTE1MDBfR1BJTzlfSU5ULAkgLyogY2FyZCAvIGluc2VydCAqLworCQkvKkFVMTUwMF9HUElPMTBfSU5UKi8wLCAwLCAwKTsgLyogc3RzY2hnIC8gZWplY3QgLyBpZCAqLwogCiAJc3dhcHBlZCA9IGJjc3JfcmVhZChCQ1NSX1NUQVRVUykgJiAgQkNTUl9TVEFUVVNfREIxMDAwX1NXQVBCT09UOwogCWRiMXhfcmVnaXN0ZXJfbm9yZmxhc2goNjQgKiAxMDI0ICogMTAyNCwgNCwgc3dhcHBlZCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwYjE1MDBfcGNpX2hvc3QpOwogCiAJcmV0dXJuIDA7CiB9Ci1kZXZpY2VfaW5pdGNhbGwocGIxNTAwX2Rldl9pbml0KTsKK2FyY2hfaW5pdGNhbGwocGIxNTAwX2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvYm9hcmRfc2V0dXAuYwppbmRleCBiNzkwMjEzLi4wZjYyZDFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9ib2FyZF9zZXR1cC5jCkBAIC0zNywxMiArMzcsNiBAQAogCiAjaW5jbHVkZSA8cHJvbS5oPgogCi0KLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTJdID0geyAtMSwgQVUxNTUwX1BDSV9JTlRCLCBBVTE1NTBfUENJX0lOVEMsIEFVMTU1MF9QQ0lfSU5URCwgQVUxNTUwX1BDSV9JTlRBIH0sIC8qIElEU0VMIDEyIC0gUENJIHNsb3QgMiAobGVmdCkgICovCi0JWzEzXSA9IHsgLTEsIEFVMTU1MF9QQ0lfSU5UQSwgQVUxNTUwX1BDSV9JTlRCLCBBVTE1NTBfUENJX0lOVEMsIEFVMTU1MF9QQ0lfSU5URCB9LCAvKiBJRFNFTCAxMyAtIFBDSSBzbG90IDEgKHJpZ2h0KSAqLwotfTsKLQogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CiAJcmV0dXJuICJBbGNoZW15IFBiMTU1MCI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL3BsYXRmb3JtLmMKaW5kZXggZDcxNTBkMC4uYTQ2MDRiOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvcGxhdGZvcm0uYwpAQCAtMTgsMTQgKzE4LDg5IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CiAKICNpbmNsdWRlICIuLi9wbGF0Zm9ybS5oIgogCitzdGF0aWMgaW50IHBiMTU1MF9tYXBfcGNpX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZCwgdTggc2xvdCwgdTggcGluKQoreworCWlmICgoc2xvdCA8IDEyKSB8fCAoc2xvdCA+IDEzKSB8fCBwaW4gPT0gMCkKKwkJcmV0dXJuIC0xOworCWlmIChzbG90ID09IDEyKSB7CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQjsKKwkJY2FzZSAyOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRDOworCQljYXNlIDM6IHJldHVybiBBVTE1MDBfUENJX0lOVEQ7CisJCWNhc2UgNDogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQTsKKwkJfQorCX0KKwlpZiAoc2xvdCA9PSAxMykgeworCQlzd2l0Y2ggKHBpbikgeworCQljYXNlIDE6IHJldHVybiBBVTE1MDBfUENJX0lOVEE7CisJCWNhc2UgMjogcmV0dXJuIEFVMTUwMF9QQ0lfSU5UQjsKKwkJY2FzZSAzOiByZXR1cm4gQVUxNTAwX1BDSV9JTlRDOworCQljYXNlIDQ6IHJldHVybiBBVTE1MDBfUENJX0lOVEQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFsY2hlbXlfcGNpX2hvc3RfcmVzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVTE1MDBfUENJX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSICsgMHhmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGFsY2hlbXlfcGNpX3BsYXRkYXRhIHBiMTU1MF9wY2lfcGQgPSB7CisJLmJvYXJkX21hcF9pcnEJPSBwYjE1NTBfbWFwX3BjaV9pcnEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYjE1NTBfcGNpX2hvc3QgPSB7CisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJnBiMTU1MF9wY2lfcGQsCisJLm5hbWUJCT0gImFsY2hlbXktcGNpIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYWxjaGVteV9wY2lfaG9zdF9yZXMpLAorCS5yZXNvdXJjZQk9IGFsY2hlbXlfcGNpX2hvc3RfcmVzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdTE1NTBfcHNjMl9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTU1MF9QU0MyX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTU1MF9QU0MyX1BIWVNfQUREUiArIDB4ZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTUwX1BTQzJfSU5ULAorCQkuZW5kCT0gQVUxNTUwX1BTQzJfSU5ULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1RYLAorCQkuZW5kCT0gQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1RYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1JYLAorCQkuZW5kCT0gQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1JYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGIxNTUwX2kyY19kZXYgPSB7CisJLm5hbWUJCT0gImF1MXhwc2Nfc21idXMiLAorCS5pZAkJPSAwLAkvKiBidXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1MTU1MF9wc2MyX3JlcyksCisJLnJlc291cmNlCT0gYXUxNTUwX3BzYzJfcmVzLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgcGIxNTUwX2Rldl9pbml0KHZvaWQpCiB7CiAJaW50IHN3YXBwZWQ7CkBAIC0zNywzMyArMTEyLDI5IEBACiAJKiBkcml2ZXJzIGFyZSB1c2VkIHRvIHNoYXJlZCBpcnFzIGFuZCBiKSBzdGF0dXNjaGFuZ2UgaXNuJ3QgcmVhbGx5IHVzZS0KIAkqIGZ1bCBhbnl3YXkuCiAJKi8KLQlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoUENNQ0lBX0FUVFJfUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9NRU1fUEhZU19BRERSLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIsCi0JCQkJICAgIFBDTUNJQV9JT19QSFlTX0FERFIgICArIDB4MDAwMDEwMDAwIC0gMSwKLQkJCQkgICAgQVUxNTUwX0dQSU8yMDFfMjA1X0lOVCwKLQkJCQkgICAgQVUxNTUwX0dQSU8wX0lOVCwKLQkJCQkgICAgMCwKLQkJCQkgICAgMCwKLQkJCQkgICAgMCk7CisJZGIxeF9yZWdpc3Rlcl9wY21jaWFfc29ja2V0KAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIsCisJCUFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwMDQwMDAwMCAtIDEsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDAwMTAwMDAgLSAxLAorCQlBVTE1NTBfR1BJTzIwMV8yMDVfSU5ULCBBVTE1NTBfR1BJTzBfSU5ULCAwLCAwLCAwKTsKIAotCWRiMXhfcmVnaXN0ZXJfcGNtY2lhX3NvY2tldChQQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0FUVFJfUEhZU19BRERSICsgMHgwMDg0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfTUVNX1BIWVNfQUREUiAgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDg0MDAwMDAgLSAxLAotCQkJCSAgICBQQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwODAwMDAwMCwKLQkJCQkgICAgUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMTAwMDAgLSAxLAotCQkJCSAgICBBVTE1NTBfR1BJTzIwMV8yMDVfSU5ULAotCQkJCSAgICBBVTE1NTBfR1BJTzFfSU5ULAotCQkJCSAgICAwLAotCQkJCSAgICAwLAotCQkJCSAgICAxKTsKKwlkYjF4X3JlZ2lzdGVyX3BjbWNpYV9zb2NrZXQoCisJCUFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwODAwMDAwMCwKKwkJQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDA4NDAwMDAwIC0gMSwKKwkJQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICArIDB4MDA4MDAwMDAwLAorCQlBVTEwMDBfUENNQ0lBX01FTV9QSFlTX0FERFIgICsgMHgwMDg0MDAwMDAgLSAxLAorCQlBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUiAgICsgMHgwMDgwMDAwMDAsCisJCUFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSICAgKyAweDAwODAxMDAwMCAtIDEsCisJCUFVMTU1MF9HUElPMjAxXzIwNV9JTlQsIEFVMTU1MF9HUElPMV9JTlQsIDAsIDAsIDEpOwogCiAJc3dhcHBlZCA9IGJjc3JfcmVhZChCQ1NSX1NUQVRVUykgJiBCQ1NSX1NUQVRVU19QQjE1NTBfU1dBUEJPT1Q7CiAJZGIxeF9yZWdpc3Rlcl9ub3JmbGFzaCgxMjggKiAxMDI0ICogMTAyNCwgNCwgc3dhcHBlZCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwYjE1NTBfcGNpX2hvc3QpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGIxNTUwX2kyY19kZXYpOwogCiAJcmV0dXJuIDA7CiB9Ci1kZXZpY2VfaW5pdGNhbGwocGIxNTUwX2Rldl9pbml0KTsKK2FyY2hfaW5pdGNhbGwocGIxNTUwX2Rldl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2dwci9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2JvYXJkX3NldHVwLmMKaW5kZXggNWY4ZjA2OS4uZGVhNDVjNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZ3ByL2JvYXJkX3NldHVwLmMKQEAgLTM2LDEwICszNiw2IEBACiAKICNpbmNsdWRlIDxwcm9tLmg+CiAKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMF0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQiwgMHhmZiwgMHhmZiB9LAotfTsKLQogc3RhdGljIHZvaWQgZ3ByX3Jlc2V0KGNoYXIgKmMpCiB7CiAJLyogc3dpdGNoIFN5c3RlbS1MRUQgdG8gb3JhbmdlIChyZWQjIGFuZCBncmVlbiMgb24pICovCkBAIC03NiwxMiArNzIsNCBAQAogCiAJLyogVGFrZSBhd2F5IFJlc2V0IG9mIFVNVFMtY2FyZCAqLwogCWFsY2hlbXlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KDIxNSwgMSk7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0jaWYgZGVmaW5lZChfX01JUFNFQl9fKQotCWF1X3dyaXRlbCgweGYgfCAoMiA8PCA2KSB8ICgxIDw8IDQpLCBBdTE1MDBfUENJX0NGRyk7Ci0jZWxzZQotCWF1X3dyaXRlbCgweGYsIEF1MTUwMF9QQ0lfQ0ZHKTsKLSNlbmRpZgotI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9ncHIvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9wbGF0Zm9ybS5jCmluZGV4IDE0YjQ2NjIuLjk4MmNlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2dwci9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2dwci9wbGF0Zm9ybS5jCkBAIC0xNjcsNiArMTY3LDQ1IEBACiAJfQogfTsKIAorCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWxjaGVteV9wY2lfaG9zdF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxNTAwX1BDSV9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgZ3ByX21hcF9wY2lfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkLCB1OCBzbG90LCB1OCBwaW4pCit7CisJaWYgKChzbG90ID09IDApICYmIChwaW4gPT0gMSkpCisJCXJldHVybiBBVTE1NTBfUENJX0lOVEE7CisJZWxzZSBpZiAoKHNsb3QgPT0gMCkgJiYgKHBpbiA9PSAyKSkKKwkJcmV0dXJuIEFVMTU1MF9QQ0lfSU5UQjsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBhbGNoZW15X3BjaV9wbGF0ZGF0YSBncHJfcGNpX3BkID0geworCS5ib2FyZF9tYXBfaXJxCT0gZ3ByX21hcF9wY2lfaXJxLAorCS5wY2lfY2ZnX3NldAk9IFBDSV9DT05GSUdfQUVOIHwgUENJX0NPTkZJR19SMkggfCBQQ0lfQ09ORklHX1IxSCB8CisJCQkgIFBDSV9DT05GSUdfQ0ggfAorI2lmIGRlZmluZWQoX19NSVBTRUJfXykKKwkJCSAgUENJX0NPTkZJR19TSUNfSFdBX0RBVCB8IFBDSV9DT05GSUdfU00sCisjZWxzZQorCQkJICAwLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBncHJfcGNpX2hvc3RfZGV2ID0geworCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZncHJfcGNpX3BkLAorCS5uYW1lCQk9ICJhbGNoZW15LXBjaSIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGFsY2hlbXlfcGNpX2hvc3RfcmVzKSwKKwkucmVzb3VyY2UJPSBhbGNoZW15X3BjaV9ob3N0X3JlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpncHJfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmdwcl93ZHRfZGV2aWNlLAogCSZncHJfbXRkX2RldmljZSwKQEAgLTE3NCw2ICsyMTMsMTQgQEAKIAkmZ3ByX2xlZF9kZXZpY2VzLAogfTsKIAorc3RhdGljIGludCBfX2luaXQgZ3ByX3BjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZ3ByX3BjaV9ob3N0X2Rldik7Cit9CisvKiBtdXN0IGJlIGFyY2hfaW5pdGNhbGw7IE1JUFMgUENJIHNjYW5zIGJ1c3NlcyBpbiBhIHN1YnN5c19pbml0Y2FsbCAqLworYXJjaF9pbml0Y2FsbChncHJfcGNpX2luaXQpOworCisKIHN0YXRpYyBpbnQgX19pbml0IGdwcl9kZXZfaW5pdCh2b2lkKQogewogCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGdwcl9pMmNfaW5mbywgQVJSQVlfU0laRShncHJfaTJjX2luZm8pKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCmluZGV4IDNhZTk4NGMuLjg1MWE1YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwpAQCAtMzgsMjAgKzM4LDYgQEAKIAogI2luY2x1ZGUgPHByb20uaD4KIAotY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0gewotCVswXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQSwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDAwIC0gQWRhcHRlckEtU2xvdDAgKHRvcCkgKi8KLQlbMV0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEIsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMSAtIEFkYXB0ZXJBLVNsb3QxIChib3R0b20pICovCi0JWzJdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRDLCBBVTE1MDBfUENJX0lOVEQsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDIgLSBBZGFwdGVyQi1TbG90MCAodG9wKSAqLwotCVszXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5URCwgQVUxNTAwX1BDSV9JTlRDLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDAzIC0gQWRhcHRlckItU2xvdDEgKGJvdHRvbSkgKi8KLQlbNF0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQiwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwNCAtIEFkYXB0ZXJDLVNsb3QwICh0b3ApICovCi0JWzVdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRCLCBBVTE1MDBfUENJX0lOVEEsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDUgLSBBZGFwdGVyQy1TbG90MSAoYm90dG9tKSAqLwotCVs2XSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQywgQVUxNTAwX1BDSV9JTlRELCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDA2IC0gQWRhcHRlckQtU2xvdDAgKHRvcCkgKi8KLQlbN10gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEQsIEFVMTUwMF9QQ0lfSU5UQywgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwNyAtIEFkYXB0ZXJELVNsb3QxIChib3R0b20pICovCi19OwotCi1leHRlcm4gaW50ICgqYm9hcmRfcGNpX2lkc2VsKSh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKLWludCBtdHgxX3BjaV9pZHNlbCh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKLQogc3RhdGljIHZvaWQgbXR4MV9yZXNldChjaGFyICpjKQogewogCS8qIEp1bXAgdG8gdGhlIHJlc2V0IHZlY3RvciAqLwpAQCAtNzQsMTUgKzYwLDYgQEAKIAlhbGNoZW15X2dwaW9fZGlyZWN0aW9uX291dHB1dCgyMDQsIDApOwogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkgKi8KIAotI2lmZGVmIENPTkZJR19QQ0kKLSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCi0JYXVfd3JpdGVsKDB4ZiB8ICgyIDw8IDYpIHwgKDEgPDwgNCksIEF1MTUwMF9QQ0lfQ0ZHKTsKLSNlbHNlCi0JYXVfd3JpdGVsKDB4ZiwgQXUxNTAwX1BDSV9DRkcpOwotI2VuZGlmCi0JYm9hcmRfcGNpX2lkc2VsID0gbXR4MV9wY2lfaWRzZWw7Ci0jZW5kaWYKLQogCS8qIEluaXRpYWxpemUgc3lzX3BpbmZ1bmMgKi8KIAlhdV93cml0ZWwoU1lTX1BGX05JMiwgU1lTX1BJTkZVTkMpOwogCkBAIC0xMDQsMjMgKzgxLDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICI0RyBTeXN0ZW1zIE1UWC0xIEJvYXJkXG4iKTsKIH0KIAotaW50Ci1tdHgxX3BjaV9pZHNlbCh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KQotewotCS8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWNlc3NhcnkgdG8gc3VwcG9ydCBhIHByb3ByaWV0YXJ5IENhcmRidXMKLQkgKiBhZGFwdGVyIG9uIHRoZSBtdHgtMSAic2luZ2xlYm9hcmQiIHZhcmlhbnQuIEl0IHRyaWdnZXJzIGEgY3VzdG9tCi0JICogbG9naWMgY2hpcCBjb25uZWN0ZWQgdG8gRVhUX0lPMyAoR1BJTzEpIHRvIHN1cHByZXNzIElEU0VMIHNpZ25hbHMuCi0JICovCi0JaWYgKGFzc2VydCAmJiBkZXZzZWwgIT0gMCkKLQkJLyogU3VwcHJlc3Mgc2lnbmFsIHRvIENhcmRidXMgKi8KLQkJYWxjaGVteV9ncGlvX3NldF92YWx1ZSgxLCAwKTsJLyogc2V0IEVYVF9JTzMgT0ZGICovCi0JZWxzZQotCQlhbGNoZW15X2dwaW9fc2V0X3ZhbHVlKDEsIDEpOwkvKiBzZXQgRVhUX0lPMyBPTiAqLwotCi0JdWRlbGF5KDEpOwotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBtdHgxX2luaXRfaXJxKHZvaWQpCiB7CiAJaXJxX3NldF9pcnFfdHlwZShBVTE1MDBfR1BJTzIwNF9JTlQsIElSUUZfVFJJR0dFUl9ISUdIKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9wbGF0Zm9ybS5jCmluZGV4IDU1NjI4ZTMuLmNjNDdiNjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL3BsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvcGxhdGZvcm0uYwpAQCAtMTM1LDcgKzEzNSw2OSBAQAogCS5yZXNvdXJjZQk9ICZtdHgxX210ZF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWxjaGVteV9wY2lfaG9zdF9yZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFVMTUwMF9QQ0lfUEhZU19BRERSLAorCQkuZW5kCT0gQVUxNTAwX1BDSV9QSFlTX0FERFIgKyAweGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgbXR4MV9wY2lfaWRzZWwodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCkKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgYSBwcm9wcmlldGFyeSBDYXJkYnVzCisJICogYWRhcHRlciBvbiB0aGUgbXR4LTEgInNpbmdsZWJvYXJkIiB2YXJpYW50LiBJdCB0cmlnZ2VycyBhIGN1c3RvbQorCSAqIGxvZ2ljIGNoaXAgY29ubmVjdGVkIHRvIEVYVF9JTzMgKEdQSU8xKSB0byBzdXBwcmVzcyBJRFNFTCBzaWduYWxzLgorCSAqLworCWlmIChhc3NlcnQgJiYgZGV2c2VsICE9IDApCisJCS8qIFN1cHByZXNzIHNpZ25hbCB0byBDYXJkYnVzICovCisJCWFsY2hlbXlfZ3Bpb19zZXRfdmFsdWUoMSwgMCk7CS8qIHNldCBFWFRfSU8zIE9GRiAqLworCWVsc2UKKwkJYWxjaGVteV9ncGlvX3NldF92YWx1ZSgxLCAxKTsJLyogc2V0IEVYVF9JTzMgT04gKi8KKworCXVkZWxheSgxKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbXR4MV9pcnF0YWJbXVs1XSA9IHsKKwlbMF0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEEsIEFVMTUwMF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMCAtIEFkYXB0ZXJBLVNsb3QwICh0b3ApICovCisJWzFdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRCLCBBVTE1MDBfUENJX0lOVEEsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDEgLSBBZGFwdGVyQS1TbG90MSAoYm90dG9tKSAqLworCVsyXSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQywgQVUxNTAwX1BDSV9JTlRELCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDAyIC0gQWRhcHRlckItU2xvdDAgKHRvcCkgKi8KKwlbM10gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEQsIEFVMTUwMF9QQ0lfSU5UQywgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwMyAtIEFkYXB0ZXJCLVNsb3QxIChib3R0b20pICovCisJWzRdID0geyAtMSwgQVUxNTAwX1BDSV9JTlRBLCBBVTE1MDBfUENJX0lOVEIsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDQgLSBBZGFwdGVyQy1TbG90MCAodG9wKSAqLworCVs1XSA9IHsgLTEsIEFVMTUwMF9QQ0lfSU5UQiwgQVUxNTAwX1BDSV9JTlRBLCAweGZmLCAweGZmIH0sIC8qIElEU0VMIDA1IC0gQWRhcHRlckMtU2xvdDEgKGJvdHRvbSkgKi8KKwlbNl0gPSB7IC0xLCBBVTE1MDBfUENJX0lOVEMsIEFVMTUwMF9QQ0lfSU5URCwgMHhmZiwgMHhmZiB9LCAvKiBJRFNFTCAwNiAtIEFkYXB0ZXJELVNsb3QwICh0b3ApICovCisJWzddID0geyAtMSwgQVUxNTAwX1BDSV9JTlRELCBBVTE1MDBfUENJX0lOVEMsIDB4ZmYsIDB4ZmYgfSwgLyogSURTRUwgMDcgLSBBZGFwdGVyRC1TbG90MSAoYm90dG9tKSAqLworfTsKKworc3RhdGljIGludCBtdHgxX21hcF9wY2lfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkLCB1OCBzbG90LCB1OCBwaW4pCit7CisJcmV0dXJuIG10eDFfaXJxdGFiW3Nsb3RdW3Bpbl07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWxjaGVteV9wY2lfcGxhdGRhdGEgbXR4MV9wY2lfcGQgPSB7CisJLmJvYXJkX21hcF9pcnEJID0gbXR4MV9tYXBfcGNpX2lycSwKKwkuYm9hcmRfcGNpX2lkc2VsID0gbXR4MV9wY2lfaWRzZWwsCisJLnBjaV9jZmdfc2V0CSA9IFBDSV9DT05GSUdfQUVOIHwgUENJX0NPTkZJR19SMkggfCBQQ0lfQ09ORklHX1IxSCB8CisJCQkgICBQQ0lfQ09ORklHX0NIIHwKKyNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCisJCQkgICBQQ0lfQ09ORklHX1NJQ19IV0FfREFUIHwgUENJX0NPTkZJR19TTSwKKyNlbHNlCisJCQkgICAwLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdHgxX3BjaV9ob3N0ID0geworCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZtdHgxX3BjaV9wZCwKKwkubmFtZQkJPSAiYWxjaGVteS1wY2kiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhbGNoZW15X3BjaV9ob3N0X3JlcyksCisJLnJlc291cmNlCT0gYWxjaGVteV9wY2lfaG9zdF9yZXMsCit9OworCisKIHN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBwbGF0Zm9ybV9kZXZpY2UgKiBtdHgxX2RldnNbXSA9IHsKKwkmbXR4MV9wY2lfaG9zdCwKIAkmbXR4MV9ncGlvX2xlZHMsCiAJJm10eDFfd2R0LAogCSZtdHgxX2J1dHRvbiwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwppbmRleCA4MWU1N2ZhLi4zZmE4M2Y3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9ib2FyZF9zZXR1cC5jCkBAIC03MCwxNCArNzAsNiBAQAogCS8qIEVuYWJsZSBEVFIgKE1DUiBiaXQgMCkgPSBVU0IgcG93ZXIgdXAgKi8KIAlfX3Jhd193cml0ZWwoMSwgKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEwMDBfVUFSVDNfUEhZU19BRERSICsgMHgxOCkpOwogCXdtYigpOwotCi0jaWZkZWYgQ09ORklHX1BDSQotI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLQlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOwotI2Vsc2UKLQlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7Ci0jZW5kaWYKLSNlbmRpZgogfQogCiBzdGF0aWMgaW50IF9faW5pdCB4eHMxNTAwX2luaXRfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL3BsYXRmb3JtLmMKaW5kZXggZTg3YzQ1Yy4uMDZhM2E0NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvcGxhdGZvcm0uYwpAQCAtMjcsMjAgKzI3LDIwIEBACiAJewogCQkubmFtZQk9ICJwY21jaWEtaW8iLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQkJLnN0YXJ0CT0gUENNQ0lBX0lPX1BIWVNfQUREUiwKLQkJLmVuZAk9IFBDTUNJQV9JT19QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCisJCS5zdGFydAk9IEFVMTAwMF9QQ01DSUFfSU9fUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMDAwX1BDTUNJQV9JT19QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCiAJfSwKIAl7CiAJCS5uYW1lCT0gInBjbWNpYS1hdHRyIiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JCS5zdGFydAk9IFBDTUNJQV9BVFRSX1BIWVNfQUREUiwKLQkJLmVuZAk9IFBDTUNJQV9BVFRSX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJLnN0YXJ0CT0gQVUxMDAwX1BDTUNJQV9BVFRSX1BIWVNfQUREUiwKKwkJLmVuZAk9IEFVMTAwMF9QQ01DSUFfQVRUUl9QSFlTX0FERFIgKyAweDAwMDQwMDAwMCAtIDEsCiAJfSwKIAl7CiAJCS5uYW1lCT0gInBjbWNpYS1tZW0iLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQkJLnN0YXJ0CT0gUENNQ0lBX01FTV9QSFlTX0FERFIsCi0JCS5lbmQJPSBQQ01DSUFfTUVNX1BIWVNfQUREUiArIDB4MDAwNDAwMDAwIC0gMSwKKwkJLnN0YXJ0CT0gQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSLAorCQkuZW5kCT0gQVUxMDAwX1BDTUNJQV9NRU1fUEhZU19BRERSICsgMHgwMDA0MDAwMDAgLSAxLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmNtNDd4eC9ncGlvLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9ncGlvLmMKaW5kZXggNTdiNDI1Zi4uNWViZGY2MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2JjbTQ3eHgvZ3Bpby5jCisrKyBiL2FyY2gvbWlwcy9iY200N3h4L2dwaW8uYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNyBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9kcml2ZXJfZXh0aWYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMgYi9hcmNoL21pcHMvYmNtNDd4eC9zZXR1cC5jCmluZGV4IDE3YzNkMTQuLjFjZmRkYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iY200N3h4L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2JjbTQ3eHgvc2V0dXAuYwpAQCAtMjYsNiArMjYsNyBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2VtYmVkZGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYwppbmRleCAyOWQ1NmFmLi5jZTY0ODNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NzcmMtb2N0ZW9uLmMKQEAgLTcsNiArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgQ2F2aXVtIE5ldHdvcmtzLCBJbmMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jCmluZGV4IDFhYmI2NmMuLmVhNGZlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2RtYS1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9kbWEtb2N0ZW9uLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2ZsYXNoX3NldHVwLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9mbGFzaF9zZXR1cC5jCmluZGV4IDBlZTAyZjUuLjk3NWMyMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2ZsYXNoX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZmxhc2hfc2V0dXAuYwpAQCAtOCw2ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBDYXZpdW0gTmV0d29ya3MKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDQwYmI5ZmQuLjY5NDY4ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTE0LDQgKzExNCwyOCBAQAogZXh0ZXJuIHZvaWQgKmttYXBfY29oZXJlbnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiBleHRlcm4gdm9pZCBrdW5tYXBfY29oZXJlbnQodm9pZCk7CiAKKyNkZWZpbmUgQVJDSF9IQVNfRkxVU0hfS0VSTkVMX0RDQUNIRV9QQUdFCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfa2VybmVsX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCUJVR19PTihjcHVfaGFzX2RjX2FsaWFzZXMgJiYgUGFnZUhpZ2hNZW0ocGFnZSkpOworfQorCisvKgorICogRm9yIG5vdyBmbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSBhbmQgaW52YWxpZGF0ZV9rZXJuZWxfdm1hcF9yYW5nZSBib3RoIGRvIGEKKyAqIGNhY2hlIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZSBvcGVyYXRpb24uCisgKi8KK2V4dGVybiB2b2lkICgqX19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSkodW5zaWduZWQgbG9uZyB2YWRkciwgaW50IHNpemUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2Uodm9pZCAqdmFkZHIsIGludCBzaXplKQoreworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCisJCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludmFsaWRhdGVfa2VybmVsX3ZtYXBfcmFuZ2Uodm9pZCAqdmFkZHIsIGludCBzaXplKQoreworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCisJCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHZhZGRyLCBzaXplKTsKK30KKwogI2VuZGlmIC8qIF9BU01fQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggZGJjNTEwNi4uYjc3ZGYwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTExLDcgKzExMSw4IEBACiAJaW50CQlmX2JhdmFpbDsKIAljb21wYXRfZnNpZF90CWZfZnNpZDsKIAlpbnQJCWZfbmFtZWxlbjsKLQlpbnQJCWZfc3BhcmVbNl07CisJaW50CQlmX2ZsYWdzOworCWludAkJZl9zcGFyZVs1XTsKIH07CiAKICNkZWZpbmUgQ09NUEFUX1JMSU1fSU5GSU5JVFkJMHg3ZmZmZmZmZlVMCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggNWY5NWE0Yi4uMmY3ZjQxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMTM1LDYgKzEzNSw5IEBACiAjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjUwWFggMHgwNjAwCiAjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjUyWFggMHgwNzAwCiAjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjYzWFggMHg5MDAwCisjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjY4WFggMHg5MTAwCisjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjY2WFggMHg5MjAwCisjZGVmaW5lIFBSSURfSU1QX0NBVklVTV9DTjYxWFggMHg5MzAwCiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIFBSSUQncyBmb3Igd2hlbiAyMzoxNiA9PSBQUklEX0NPTVBfSU5HRU5JQwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaAppbmRleCBiMDRlNGRlLi5hNThmMjI5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaApAQCAtMzI5LDE0ICszMjksMTAgQEAKIAkJCSJkc3JsMzIJJUwwLCAlTDAsIDAiCQkJIlxuXHQiCVwKIAkJCSJkc2xsMzIJJU0wLCAlTTAsIDAiCQkJIlxuXHQiCVwKIAkJCSJvcgklTDAsICVMMCwgJU0wIgkJCSJcblx0IglcCi0JCQkiLnNldAlwdXNoIgkJCQkiXG5cdCIJXAotCQkJIi5zZXQJbm9yZW9yZGVyIgkJCSJcblx0IglcCi0JCQkiLnNldAlub21hY3JvIgkJCSJcblx0IglcCiAJCQkic2QJJUwwLCAlMiIJCQkiXG5cdCIJXAotCQkJIi5zZXQJcG9wIgkJCQkiXG5cdCIJXAogCQkJIi5zZXQJbWlwczAiCQkJCSJcbiIJXAogCQkJOiAiPXIiIChfX3RtcCkJCQkJCVwKLQkJCTogIjAiIChfX3ZhbCksICJSIiAoKl9fbWVtKSk7CQkJXAorCQkJOiAiMCIgKF9fdmFsKSwgIm0iICgqX19tZW0pKTsJCQlcCiAJCWlmIChpcnEpCQkJCQkJXAogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7CQkJXAogCX0gZWxzZQkJCQkJCQkJXApAQCAtMzU5LDE2ICszNTUsMTIgQEAKIAkJCWxvY2FsX2lycV9zYXZlKF9fZmxhZ3MpOwkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJCQkiLnNldAltaXBzMyIJCSJcdFx0IyBfX3JlYWRxIgkiXG5cdCIJXAotCQkJIi5zZXQJcHVzaCIJCQkJIlxuXHQiCVwKLQkJCSIuc2V0CW5vcmVvcmRlciIJCQkiXG5cdCIJXAotCQkJIi5zZXQJbm9tYWNybyIJCQkiXG5cdCIJXAogCQkJImxkCSVMMCwgJTEiCQkJIlxuXHQiCVwKLQkJCSIuc2V0CXBvcCIJCQkJIlxuXHQiCVwKIAkJCSJkc3JhMzIJJU0wLCAlTDAsIDAiCQkJIlxuXHQiCVwKIAkJCSJzbGwJJUwwLCAlTDAsIDAiCQkJIlxuXHQiCVwKIAkJCSIuc2V0CW1pcHMwIgkJCQkiXG4iCVwKIAkJCTogIj1yIiAoX192YWwpCQkJCQlcCi0JCQk6ICJSIiAoKl9fbWVtKSk7CQkJCVwKKwkJCTogIm0iICgqX19tZW0pKTsJCQkJXAogCQlpZiAoaXJxKQkJCQkJCVwKIAkJCWxvY2FsX2lycV9yZXN0b3JlKF9fZmxhZ3MpOwkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKaW5kZXggZjI2MGViZS4uZGUyNGVjNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKQEAgLTI0NSw2ICsyNDUsMjMgQEAKIHZvaWQgYWxjaGVteV9zbGVlcF9hdTE1NTAodm9pZCk7CiB2b2lkIGF1X3NsZWVwKHZvaWQpOwogCisvKiBVU0I6IGRyaXZlcnMvdXNiL2hvc3QvYWxjaGVteS1jb21tb24uYyAqLworZW51bSBhbGNoZW15X3VzYl9ibG9jayB7CisJQUxDSEVNWV9VU0JfT0hDSTAsCisJQUxDSEVNWV9VU0JfVURDMCwKKwlBTENIRU1ZX1VTQl9FSENJMCwKKwlBTENIRU1ZX1VTQl9PVEcwLAorfTsKK2ludCBhbGNoZW15X3VzYl9jb250cm9sKGludCBibG9jaywgaW50IGVuYWJsZSk7CisKKy8qIFBDSSBjb250cm9sbGVyIHBsYXRmb3JtIGRhdGEgKi8KK3N0cnVjdCBhbGNoZW15X3BjaV9wbGF0ZGF0YSB7CisJaW50ICgqYm9hcmRfbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50ICgqYm9hcmRfcGNpX2lkc2VsKSh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKKwkvKiBiaXRzIHRvIHNldC9jbGVhciBpbiBQQ0lfQ09ORklHIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZyBwY2lfY2ZnX3NldDsKKwl1bnNpZ25lZCBsb25nIHBjaV9jZmdfY2xyOworfTsKIAogLyogU09DIEludGVycnVwdCBudW1iZXJzICovCiAKQEAgLTU3NSwzOCArNTkyLDk1IEBACiAjZW5kaWYgLyogIWRlZmluZWQgKF9MQU5HVUFHRV9BU1NFTUJMWSkgKi8KIAogLyoKLSAqIFNEUkFNIHJlZ2lzdGVyIG9mZnNldHMKKyAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzc2VzIGZvciBpbnRlZ3JhdGVkIHBlcmlwaGVyYWxzCisgKiAwLi5hdTEwMDAgMS4uYXUxNTAwIDIuLmF1MTEwMCAzLi5hdTE1NTAgNC4uYXUxMjAwCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTAwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkKLSNkZWZpbmUgTUVNX1NETU9ERTAJCTB4MDAwMAotI2RlZmluZSBNRU1fU0RNT0RFMQkJMHgwMDA0Ci0jZGVmaW5lIE1FTV9TRE1PREUyCQkweDAwMDgKLSNkZWZpbmUgTUVNX1NEQUREUjAJCTB4MDAwQwotI2RlZmluZSBNRU1fU0RBRERSMQkJMHgwMDEwCi0jZGVmaW5lIE1FTV9TREFERFIyCQkweDAwMTQKLSNkZWZpbmUgTUVNX1NEUkVGQ0ZHCQkweDAwMTgKLSNkZWZpbmUgTUVNX1NEUFJFQ01ECQkweDAwMUMKLSNkZWZpbmUgTUVNX1NEQVVUT1JFRgkJMHgwMDIwCi0jZGVmaW5lIE1FTV9TRFdSTUQwCQkweDAwMjQKLSNkZWZpbmUgTUVNX1NEV1JNRDEJCTB4MDAyOAotI2RlZmluZSBNRU1fU0RXUk1EMgkJMHgwMDJDCi0jZGVmaW5lIE1FTV9TRFNMRUVQCQkweDAwMzAKLSNkZWZpbmUgTUVNX1NEU01DS0UJCTB4MDAzNAogCi0vKgotICogTUVNX1NETU9ERSByZWdpc3RlciBjb250ZW50IGRlZmluaXRpb25zCi0gKi8KKyNkZWZpbmUgQVUxMDAwX0FDOTdfUEhZU19BRERSCQkweDEwMDAwMDAwIC8qIDAxMiAqLworI2RlZmluZSBBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSCTB4MTAxMDAwMDAgLyogMDEyICovCisjZGVmaW5lIEFVMTAwMF9VU0JfVURDX1BIWVNfQUREUgkweDEwMjAwMDAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxMDAwX0lSREFfUEhZU19BRERSCQkweDEwMzAwMDAwIC8qIDAyICovCisjZGVmaW5lIEFVMTIwMF9BRVNfUEhZU19BRERSCQkweDEwMzAwMDAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMDAwX0lDMF9QSFlTX0FERFIJCTB4MTA0MDAwMDAgLyogMDEyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX01BQzBfUEhZU19BRERSCQkweDEwNTAwMDAwIC8qIDAyMyAqLworI2RlZmluZSBBVTEwMDBfTUFDMV9QSFlTX0FERFIJCTB4MTA1MTAwMDAgLyogMDIzICovCisjZGVmaW5lIEFVMTAwMF9NQUNFTl9QSFlTX0FERFIJCTB4MTA1MjAwMDAgLyogMDIzICovCisjZGVmaW5lIEFVMTEwMF9TRDBfUEhZU19BRERSCQkweDEwNjAwMDAwIC8qIDI0ICovCisjZGVmaW5lIEFVMTEwMF9TRDFfUEhZU19BRERSCQkweDEwNjgwMDAwIC8qIDI0ICovCisjZGVmaW5lIEFVMTU1MF9QU0MyX1BIWVNfQUREUgkJMHgxMEEwMDAwMCAvKiAzICovCisjZGVmaW5lIEFVMTU1MF9QU0MzX1BIWVNfQUREUgkJMHgxMEIwMDAwMCAvKiAzICovCisjZGVmaW5lIEFVMTAwMF9JMlNfUEhZU19BRERSCQkweDExMDAwMDAwIC8qIDAyICovCisjZGVmaW5lIEFVMTUwMF9NQUMwX1BIWVNfQUREUgkJMHgxMTUwMDAwMCAvKiAxICovCisjZGVmaW5lIEFVMTUwMF9NQUMxX1BIWVNfQUREUgkJMHgxMTUxMDAwMCAvKiAxICovCisjZGVmaW5lIEFVMTUwMF9NQUNFTl9QSFlTX0FERFIJCTB4MTE1MjAwMDAgLyogMSAqLworI2RlZmluZSBBVTEwMDBfVUFSVDBfUEhZU19BRERSCQkweDExMTAwMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTIwMF9TV0NOVF9QSFlTX0FERFIJCTB4MTExMDAxMEMgLyogNCAqLworI2RlZmluZSBBVTEwMDBfVUFSVDFfUEhZU19BRERSCQkweDExMjAwMDAwIC8qIDAyMzQgKi8KKyNkZWZpbmUgQVUxMDAwX1VBUlQyX1BIWVNfQUREUgkJMHgxMTMwMDAwMCAvKiAwICovCisjZGVmaW5lIEFVMTAwMF9VQVJUM19QSFlTX0FERFIJCTB4MTE0MDAwMDAgLyogMDEyMyAqLworI2RlZmluZSBBVTEwMDBfU1NJMF9QSFlTX0FERFIJCTB4MTE2MDAwMDAgLyogMDIgKi8KKyNkZWZpbmUgQVUxMDAwX1NTSTFfUEhZU19BRERSCQkweDExNjgwMDAwIC8qIDAyICovCisjZGVmaW5lIEFVMTUwMF9HUElPMl9QSFlTX0FERFIJCTB4MTE3MDAwMDAgLyogMTIzNCAqLworI2RlZmluZSBBVTEwMDBfSUMxX1BIWVNfQUREUgkJMHgxMTgwMDAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfU1lTX1BIWVNfQUREUgkJMHgxMTkwMDAwMCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTE1NTBfUFNDMF9QSFlTX0FERFIJCTB4MTFBMDAwMDAgLyogMzQgKi8KKyNkZWZpbmUgQVUxNTUwX1BTQzFfUEhZU19BRERSCQkweDExQjAwMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTAwMF9NRU1fUEhZU19BRERSCQkweDE0MDAwMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9TVEFUSUNfTUVNX1BIWVNfQUREUgkweDE0MDAxMDAwIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9ETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDAxMiAqLworI2RlZmluZSBBVTE1NTBfREJETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUgkweDE0MDAzMDAwIC8qIDM0ICovCisjZGVmaW5lIEFVMTAwMF9NQUNETUEwX1BIWVNfQUREUgkweDE0MDA0MDAwIC8qIDAxMjMgKi8KKyNkZWZpbmUgQVUxMDAwX01BQ0RNQTFfUEhZU19BRERSCTB4MTQwMDQyMDAgLyogMDEyMyAqLworI2RlZmluZSBBVTEyMDBfQ0lNX1BIWVNfQUREUgkJMHgxNDAwNDAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTUwMF9QQ0lfUEhZU19BRERSCQkweDE0MDA1MDAwIC8qIDEzICovCisjZGVmaW5lIEFVMTU1MF9QRV9QSFlTX0FERFIJCTB4MTQwMDgwMDAgLyogMyAqLworI2RlZmluZSBBVTEyMDBfTUFFQkVfUEhZU19BRERSCQkweDE0MDEwMDAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMjAwX01BRUZFX1BIWVNfQUREUgkJMHgxNDAxMjAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTU1MF9VU0JfT0hDSV9QSFlTX0FERFIJMHgxNDAyMDAwMCAvKiAzICovCisjZGVmaW5lIEFVMTIwMF9VU0JfQ1RMX1BIWVNfQUREUgkweDE0MDIwMDAwIC8qIDQgKi8KKyNkZWZpbmUgQVUxMjAwX1VTQl9PVEdfUEhZU19BRERSCTB4MTQwMjAwMjAgLyogNCAqLworI2RlZmluZSBBVTEyMDBfVVNCX09IQ0lfUEhZU19BRERSCTB4MTQwMjAxMDAgLyogNCAqLworI2RlZmluZSBBVTEyMDBfVVNCX0VIQ0lfUEhZU19BRERSCTB4MTQwMjAyMDAgLyogNCAqLworI2RlZmluZSBBVTEyMDBfVVNCX1VEQ19QSFlTX0FERFIJMHgxNDAyMjAwMCAvKiA0ICovCisjZGVmaW5lIEFVMTEwMF9MQ0RfUEhZU19BRERSCQkweDE1MDAwMDAwIC8qIDIgKi8KKyNkZWZpbmUgQVUxMjAwX0xDRF9QSFlTX0FERFIJCTB4MTUwMDAwMDAgLyogNCAqLworI2RlZmluZSBBVTE1MDBfUENJX01FTV9QSFlTX0FERFIJMHg0MDAwMDAwMDBVTEwgLyogMTMgKi8KKyNkZWZpbmUgQVUxNTAwX1BDSV9JT19QSFlTX0FERFIJCTB4NTAwMDAwMDAwVUxMIC8qIDEzICovCisjZGVmaW5lIEFVMTUwMF9QQ0lfQ09ORklHMF9QSFlTX0FERFIJMHg2MDAwMDAwMDBVTEwgLyogMTMgKi8KKyNkZWZpbmUgQVUxNTAwX1BDSV9DT05GSUcxX1BIWVNfQUREUgkweDY4MDAwMDAwMFVMTCAvKiAxMyAqLworI2RlZmluZSBBVTEwMDBfUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTCAvKiAwMTIzNCAqLworI2RlZmluZSBBVTEwMDBfUENNQ0lBX0FUVFJfUEhZU19BRERSCTB4RjQwMDAwMDAwVUxMIC8qIDAxMjM0ICovCisjZGVmaW5lIEFVMTAwMF9QQ01DSUFfTUVNX1BIWVNfQUREUgkweEY4MDAwMDAwMFVMTCAvKiAwMTIzNCAqLworCisKKy8qIEF1MTAwMCBTRFJBTSBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEFVMTAwMF9NRU1fU0RNT0RFMAkJMHgwMDAwCisjZGVmaW5lIEFVMTAwMF9NRU1fU0RNT0RFMQkJMHgwMDA0CisjZGVmaW5lIEFVMTAwMF9NRU1fU0RNT0RFMgkJMHgwMDA4CisjZGVmaW5lIEFVMTAwMF9NRU1fU0RBRERSMAkJMHgwMDBDCisjZGVmaW5lIEFVMTAwMF9NRU1fU0RBRERSMQkJMHgwMDEwCisjZGVmaW5lIEFVMTAwMF9NRU1fU0RBRERSMgkJMHgwMDE0CisjZGVmaW5lIEFVMTAwMF9NRU1fU0RSRUZDRkcJCTB4MDAxOAorI2RlZmluZSBBVTEwMDBfTUVNX1NEUFJFQ01ECQkweDAwMUMKKyNkZWZpbmUgQVUxMDAwX01FTV9TREFVVE9SRUYJCTB4MDAyMAorI2RlZmluZSBBVTEwMDBfTUVNX1NEV1JNRDAJCTB4MDAyNAorI2RlZmluZSBBVTEwMDBfTUVNX1NEV1JNRDEJCTB4MDAyOAorI2RlZmluZSBBVTEwMDBfTUVNX1NEV1JNRDIJCTB4MDAyQworI2RlZmluZSBBVTEwMDBfTUVNX1NEU0xFRVAJCTB4MDAzMAorI2RlZmluZSBBVTEwMDBfTUVNX1NEU01DS0UJCTB4MDAzNAorCisvKiBNRU1fU0RNT0RFIHJlZ2lzdGVyIGNvbnRlbnQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTUVNX1NETU9ERV9GCQkoMSA8PCAyMikKICNkZWZpbmUgTUVNX1NETU9ERV9TUgkJKDEgPDwgMjEpCiAjZGVmaW5lIE1FTV9TRE1PREVfQlMJCSgxIDw8IDIwKQogI2RlZmluZSBNRU1fU0RNT0RFX1JTCQkoMyA8PCAxOCkKICNkZWZpbmUgTUVNX1NETU9ERV9DUwkJKDcgPDwgMTUpCi0jZGVmaW5lIE1FTV9TRE1PREVfVFJBUyAJKDE1IDw8IDExKQotI2RlZmluZSBNRU1fU0RNT0RFX1RNUkQgCSgzIDw8IDkpCisjZGVmaW5lIE1FTV9TRE1PREVfVFJBUwkJKDE1IDw8IDExKQorI2RlZmluZSBNRU1fU0RNT0RFX1RNUkQJCSgzIDw8IDkpCiAjZGVmaW5lIE1FTV9TRE1PREVfVFdSCQkoMyA8PCA3KQogI2RlZmluZSBNRU1fU0RNT0RFX1RSUAkJKDMgPDwgNSkKLSNkZWZpbmUgTUVNX1NETU9ERV9UUkNEIAkoMyA8PCAzKQorI2RlZmluZSBNRU1fU0RNT0RFX1RSQ0QJCSgzIDw8IDMpCiAjZGVmaW5lIE1FTV9TRE1PREVfVENMCQkoNyA8PCAwKQogCiAjZGVmaW5lIE1FTV9TRE1PREVfQlNfMkJhbmsJKDAgPDwgMjApCkBAIC02MjgsMTczICs3MDIsNDMgQEAKICNkZWZpbmUgTUVNX1NETU9ERV9UUkNEX04oTikJKChOKSA8PCAzKQogI2RlZmluZSBNRU1fU0RNT0RFX1RDTF9OKE4pCSgoTikgPDwgMCkKIAotLyoKLSAqIE1FTV9TREFERFIgcmVnaXN0ZXIgY29udGVudHMgZGVmaW5pdGlvbnMKLSAqLworLyogTUVNX1NEQUREUiByZWdpc3RlciBjb250ZW50cyBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBNRU1fU0RBRERSX0UJCSgxIDw8IDIwKQotI2RlZmluZSBNRU1fU0RBRERSX0NTQkEgCSgweDAzRkYgPDwgMTApCisjZGVmaW5lIE1FTV9TREFERFJfQ1NCQQkJKDB4MDNGRiA8PCAxMCkKICNkZWZpbmUgTUVNX1NEQUREUl9DU01BU0sJKDB4MDNGRiA8PCAwKQogI2RlZmluZSBNRU1fU0RBRERSX0NTQkFfTihOKQkoKE4pICYgKDB4MDNGRiA8PCAyMikgPj4gMTIpCiAjZGVmaW5lIE1FTV9TREFERFJfQ1NNQVNLX04oTikJKChOKSYoMHgwM0ZGIDw8IDIyKSA+PiAyMikKIAotLyoKLSAqIE1FTV9TRFJFRkNGRyByZWdpc3RlciBjb250ZW50IGRlZmluaXRpb25zCi0gKi8KKy8qIE1FTV9TRFJFRkNGRyByZWdpc3RlciBjb250ZW50IGRlZmluaXRpb25zICovCiAjZGVmaW5lIE1FTV9TRFJFRkNGR19UUkMJKDE1IDw8IDI4KQogI2RlZmluZSBNRU1fU0RSRUZDRkdfVFJQTQkoMyA8PCAyNikKICNkZWZpbmUgTUVNX1NEUkVGQ0ZHX0UJCSgxIDw8IDI1KQotI2RlZmluZSBNRU1fU0RSRUZDRkdfUkUgCSgweDFmZmZmZmYgPDwgMCkKKyNkZWZpbmUgTUVNX1NEUkVGQ0ZHX1JFCQkoMHgxZmZmZmZmIDw8IDApCiAjZGVmaW5lIE1FTV9TRFJFRkNGR19UUkNfTihOKQkoKE4pIDw8IE1FTV9TRFJFRkNGR19UUkMpCiAjZGVmaW5lIE1FTV9TRFJFRkNGR19UUlBNX04oTikJKChOKSA8PCBNRU1fU0RSRUZDRkdfVFJQTSkKICNkZWZpbmUgTUVNX1NEUkVGQ0ZHX1JFRl9OKE4pCShOKQotI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEF1MTU1MCBTRFJBTSBSZWdpc3RlciBPZmZzZXRzCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKLSNkZWZpbmUgTUVNX1NETU9ERTAJCTB4MDgwMAotI2RlZmluZSBNRU1fU0RNT0RFMQkJMHgwODA4Ci0jZGVmaW5lIE1FTV9TRE1PREUyCQkweDA4MTAKLSNkZWZpbmUgTUVNX1NEQUREUjAJCTB4MDgyMAotI2RlZmluZSBNRU1fU0RBRERSMQkJMHgwODI4Ci0jZGVmaW5lIE1FTV9TREFERFIyCQkweDA4MzAKLSNkZWZpbmUgTUVNX1NEQ09ORklHQQkJMHgwODQwCi0jZGVmaW5lIE1FTV9TRENPTkZJR0IJCTB4MDg0OAotI2RlZmluZSBNRU1fU0RTVEFUCQkweDA4NTAKLSNkZWZpbmUgTUVNX1NERVJSQUREUgkJMHgwODU4Ci0jZGVmaW5lIE1FTV9TRFNUUklERTAJCTB4MDg2MAotI2RlZmluZSBNRU1fU0RTVFJJREUxCQkweDA4NjgKLSNkZWZpbmUgTUVNX1NEU1RSSURFMgkJMHgwODcwCi0jZGVmaW5lIE1FTV9TRFdSTUQwCQkweDA4ODAKLSNkZWZpbmUgTUVNX1NEV1JNRDEJCTB4MDg4OAotI2RlZmluZSBNRU1fU0RXUk1EMgkJMHgwODkwCi0jZGVmaW5lIE1FTV9TRFBSRUNNRAkJMHgwOEMwCi0jZGVmaW5lIE1FTV9TREFVVE9SRUYJCTB4MDhDOAotI2RlZmluZSBNRU1fU0RTUkVGCQkweDA4RDAKLSNkZWZpbmUgTUVNX1NEU0xFRVAJCU1FTV9TRFNSRUYKLQotI2VuZGlmCi0KLS8qCi0gKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3NlcyBmb3IgaW50ZWdyYXRlZCBwZXJpcGhlcmFscwotICogMC4uYXUxMDAwIDEuLmF1MTUwMCAyLi5hdTExMDAgMy4uYXUxNTUwIDQuLmF1MTIwMAotICovCi0KLSNkZWZpbmUgQVUxMDAwX0FDOTdfUEhZU19BRERSCQkweDEwMDAwMDAwIC8qIDAxMiAqLwotI2RlZmluZSBBVTEwMDBfVVNCRF9QSFlTX0FERFIJCTB4MTAyMDAwMDAgLyogMDEyMyAqLwotI2RlZmluZSBBVTEwMDBfSUMwX1BIWVNfQUREUgkJMHgxMDQwMDAwMCAvKiAwMTIzNCAqLwotI2RlZmluZSBBVTEwMDBfTUFDMF9QSFlTX0FERFIJCTB4MTA1MDAwMDAgLyogMDIzICovCi0jZGVmaW5lIEFVMTAwMF9NQUMxX1BIWVNfQUREUgkJMHgxMDUxMDAwMCAvKiAwMjMgKi8KLSNkZWZpbmUgQVUxMDAwX01BQ0VOX1BIWVNfQUREUgkJMHgxMDUyMDAwMCAvKiAwMjMgKi8KLSNkZWZpbmUgQVUxMTAwX1NEMF9QSFlTX0FERFIJCTB4MTA2MDAwMDAgLyogMjQgKi8KLSNkZWZpbmUgQVUxMTAwX1NEMV9QSFlTX0FERFIJCTB4MTA2ODAwMDAgLyogMjQgKi8KLSNkZWZpbmUgQVUxMDAwX0kyU19QSFlTX0FERFIJCTB4MTEwMDAwMDAgLyogMDIgKi8KLSNkZWZpbmUgQVUxNTAwX01BQzBfUEhZU19BRERSCQkweDExNTAwMDAwIC8qIDEgKi8KLSNkZWZpbmUgQVUxNTAwX01BQzFfUEhZU19BRERSCQkweDExNTEwMDAwIC8qIDEgKi8KLSNkZWZpbmUgQVUxNTAwX01BQ0VOX1BIWVNfQUREUgkJMHgxMTUyMDAwMCAvKiAxICovCi0jZGVmaW5lIEFVMTAwMF9VQVJUMF9QSFlTX0FERFIJCTB4MTExMDAwMDAgLyogMDEyMzQgKi8KLSNkZWZpbmUgQVUxMDAwX1VBUlQxX1BIWVNfQUREUgkJMHgxMTIwMDAwMCAvKiAwMjM0ICovCi0jZGVmaW5lIEFVMTAwMF9VQVJUMl9QSFlTX0FERFIJCTB4MTEzMDAwMDAgLyogMCAqLwotI2RlZmluZSBBVTEwMDBfVUFSVDNfUEhZU19BRERSCQkweDExNDAwMDAwIC8qIDAxMjMgKi8KLSNkZWZpbmUgQVUxNTAwX0dQSU8yX1BIWVNfQUREUgkJMHgxMTcwMDAwMCAvKiAxMjM0ICovCi0jZGVmaW5lIEFVMTAwMF9JQzFfUEhZU19BRERSCQkweDExODAwMDAwIC8qIDAxMjM0ICovCi0jZGVmaW5lIEFVMTAwMF9TWVNfUEhZU19BRERSCQkweDExOTAwMDAwIC8qIDAxMjM0ICovCi0jZGVmaW5lIEFVMTAwMF9ETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDAxMiAqLwotI2RlZmluZSBBVTE1NTBfREJETUFfUEhZU19BRERSCQkweDE0MDAyMDAwIC8qIDM0ICovCi0jZGVmaW5lIEFVMTU1MF9EQkRNQV9DT05GX1BIWVNfQUREUgkweDE0MDAzMDAwIC8qIDM0ICovCi0jZGVmaW5lIEFVMTAwMF9NQUNETUEwX1BIWVNfQUREUgkweDE0MDA0MDAwIC8qIDAxMjMgKi8KLSNkZWZpbmUgQVUxMDAwX01BQ0RNQTFfUEhZU19BRERSCTB4MTQwMDQyMDAgLyogMDEyMyAqLwotCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTAwMAotI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCi0jZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTAxMDAwMDAKLSNkZWZpbmUJSVJEQV9QSFlTX0FERFIJCTB4MTAzMDAwMDAKLSNkZWZpbmUJU1NJMF9QSFlTX0FERFIJCTB4MTE2MDAwMDAKLSNkZWZpbmUJU1NJMV9QSFlTX0FERFIJCTB4MTE2ODAwMDAKLSNkZWZpbmUgUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfQVRUUl9QSFlTX0FERFIJMHhGNDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTUwMAotI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCi0jZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTAxMDAwMDAKLSNkZWZpbmUgUENJX1BIWVNfQUREUgkJMHgxNDAwNTAwMAotI2RlZmluZSBQQ0lfTUVNX1BIWVNfQUREUgkweDQwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfSU9fUEhZU19BRERSCTB4NTAwMDAwMDAwVUxMCi0jZGVmaW5lIFBDSV9DT05GSUcwX1BIWVNfQUREUgkweDYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfQ09ORklHMV9QSFlTX0FERFIJMHg2ODAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfQVRUUl9QSFlTX0FERFIJMHhGNDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTEwMAotI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCi0jZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUJVVNCSF9QSFlTX0FERFIJCTB4MTAxMDAwMDAKLSNkZWZpbmUJSVJEQV9QSFlTX0FERFIJCTB4MTAzMDAwMDAKLSNkZWZpbmUJU1NJMF9QSFlTX0FERFIJCTB4MTE2MDAwMDAKLSNkZWZpbmUJU1NJMV9QSFlTX0FERFIJCTB4MTE2ODAwMDAKLSNkZWZpbmUgTENEX1BIWVNfQUREUgkJMHgxNTAwMDAwMAotI2RlZmluZSBQQ01DSUFfSU9fUEhZU19BRERSCTB4RjAwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9BVFRSX1BIWVNfQUREUgkweEY0MDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfTUVNX1BIWVNfQUREUgkweEY4MDAwMDAwMFVMTAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCi0jZGVmaW5lCU1FTV9QSFlTX0FERFIJCTB4MTQwMDAwMDAKLSNkZWZpbmUJU1RBVElDX01FTV9QSFlTX0FERFIJMHgxNDAwMTAwMAotI2RlZmluZQlVU0JIX1BIWVNfQUREUgkJMHgxNDAyMDAwMAotI2RlZmluZSBQQ0lfUEhZU19BRERSCQkweDE0MDA1MDAwCi0jZGVmaW5lIFBFX1BIWVNfQUREUgkJMHgxNDAwODAwMAotI2RlZmluZSBQU0MwX1BIWVNfQUREUgkJMHgxMUEwMDAwMAotI2RlZmluZSBQU0MxX1BIWVNfQUREUgkJMHgxMUIwMDAwMAotI2RlZmluZSBQU0MyX1BIWVNfQUREUgkJMHgxMEEwMDAwMAotI2RlZmluZSBQU0MzX1BIWVNfQUREUgkJMHgxMEIwMDAwMAotI2RlZmluZSBQQ0lfTUVNX1BIWVNfQUREUgkweDQwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfSU9fUEhZU19BRERSCTB4NTAwMDAwMDAwVUxMCi0jZGVmaW5lIFBDSV9DT05GSUcwX1BIWVNfQUREUgkweDYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ0lfQ09ORklHMV9QSFlTX0FERFIJMHg2ODAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX0lPX1BIWVNfQUREUgkweEYwMDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfQVRUUl9QSFlTX0FERFIJMHhGNDAwMDAwMDBVTEwKLSNkZWZpbmUgUENNQ0lBX01FTV9QSFlTX0FERFIJMHhGODAwMDAwMDBVTEwKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotI2RlZmluZQlNRU1fUEhZU19BRERSCQkweDE0MDAwMDAwCi0jZGVmaW5lCVNUQVRJQ19NRU1fUEhZU19BRERSCTB4MTQwMDEwMDAKLSNkZWZpbmUgQUVTX1BIWVNfQUREUgkJMHgxMDMwMDAwMAotI2RlZmluZSBDSU1fUEhZU19BRERSCQkweDE0MDA0MDAwCi0jZGVmaW5lIFVTQk1fUEhZU19BRERSCQkweDE0MDIwMDAwCi0jZGVmaW5lCVVTQkhfUEhZU19BRERSCQkweDE0MDIwMTAwCi0jZGVmaW5lIFBTQzBfUEhZU19BRERSCSAJMHgxMUEwMDAwMAotI2RlZmluZSBQU0MxX1BIWVNfQUREUgkgCTB4MTFCMDAwMDAKLSNkZWZpbmUgTENEX1BIWVNfQUREUgkJMHgxNTAwMDAwMAotI2RlZmluZSBTV0NOVF9QSFlTX0FERFIJCTB4MTExMDAxMEMKLSNkZWZpbmUgTUFFRkVfUEhZU19BRERSCQkweDE0MDEyMDAwCi0jZGVmaW5lIE1BRUJFX1BIWVNfQUREUgkJMHgxNDAxMDAwMAotI2RlZmluZSBQQ01DSUFfSU9fUEhZU19BRERSCTB4RjAwMDAwMDAwVUxMCi0jZGVmaW5lIFBDTUNJQV9BVFRSX1BIWVNfQUREUgkweEY0MDAwMDAwMFVMTAotI2RlZmluZSBQQ01DSUFfTUVNX1BIWVNfQUREUgkweEY4MDAwMDAwMFVMTAotI2VuZGlmCisvKiBBdTE1NTAgU0RSQU0gUmVnaXN0ZXIgT2Zmc2V0cyAqLworI2RlZmluZSBBVTE1NTBfTUVNX1NETU9ERTAJCTB4MDgwMAorI2RlZmluZSBBVTE1NTBfTUVNX1NETU9ERTEJCTB4MDgwOAorI2RlZmluZSBBVTE1NTBfTUVNX1NETU9ERTIJCTB4MDgxMAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQUREUjAJCTB4MDgyMAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQUREUjEJCTB4MDgyOAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQUREUjIJCTB4MDgzMAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQ09ORklHQQkJMHgwODQwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RDT05GSUdCCQkweDA4NDgKKyNkZWZpbmUgQVUxNTUwX01FTV9TRFNUQVQJCTB4MDg1MAorI2RlZmluZSBBVTE1NTBfTUVNX1NERVJSQUREUgkJMHgwODU4CisjZGVmaW5lIEFVMTU1MF9NRU1fU0RTVFJJREUwCQkweDA4NjAKKyNkZWZpbmUgQVUxNTUwX01FTV9TRFNUUklERTEJCTB4MDg2OAorI2RlZmluZSBBVTE1NTBfTUVNX1NEU1RSSURFMgkJMHgwODcwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RXUk1EMAkJMHgwODgwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RXUk1EMQkJMHgwODg4CisjZGVmaW5lIEFVMTU1MF9NRU1fU0RXUk1EMgkJMHgwODkwCisjZGVmaW5lIEFVMTU1MF9NRU1fU0RQUkVDTUQJCTB4MDhDMAorI2RlZmluZSBBVTE1NTBfTUVNX1NEQVVUT1JFRgkJMHgwOEM4CisjZGVmaW5lIEFVMTU1MF9NRU1fU0RTUkVGCQkweDA4RDAKKyNkZWZpbmUgQVUxNTUwX01FTV9TRFNMRUVQCQlNRU1fU0RTUkVGCiAKIC8qIFN0YXRpYyBCdXMgQ29udHJvbGxlciAqLwogI2RlZmluZSBNRU1fU1RDRkcwCQkweEI0MDAxMDAwCkBAIC04MTMsODEgKzc1NywxNCBAQAogI2RlZmluZSBNRU1fU1RUSU1FMwkJMHhCNDAwMTAzNAogI2RlZmluZSBNRU1fU1RBRERSMwkJMHhCNDAwMTAzOAogCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKICNkZWZpbmUgTUVNX1NUTkRDVEwJCTB4QjQwMDExMDAKICNkZWZpbmUgTUVNX1NUU1RBVAkJMHhCNDAwMTEwNAogCiAjZGVmaW5lIE1FTV9TVE5BTkRfQ01ECQkweDAKICNkZWZpbmUgTUVNX1NUTkFORF9BRERSIAkweDQKICNkZWZpbmUgTUVNX1NUTkFORF9EQVRBIAkweDIwCi0jZW5kaWYKIAogCi0KLQotLyogQXUxMDAwICovCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEwMDAKLQotI2RlZmluZSBVU0JfT0hDSV9CQVNFCQkweDEwMTAwMDAwCS8qIHBoeXMgYWRkciBmb3IgaW9yZW1hcCAqLwotI2RlZmluZSBVU0JfSE9TVF9DT05GSUcgCTB4QjAxN0ZGRkMKLSNkZWZpbmUgRk9SX1BMQVRGT1JNX0NfVVNCX0hPU1RfSU5UIEFVMTAwMF9VU0JfSE9TVF9JTlQKLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTAwMCAqLwotCi0vKiBBdTE1MDAgKi8KLSNpZmRlZiBDT05GSUdfU09DX0FVMTUwMAotCi0jZGVmaW5lIFVTQl9PSENJX0JBU0UJCTB4MTAxMDAwMDAJLyogcGh5cyBhZGRyIGZvciBpb3JlbWFwICovCi0jZGVmaW5lIFVTQl9IT1NUX0NPTkZJRyAJMHhCMDE3ZmZmYwotI2RlZmluZSBGT1JfUExBVEZPUk1fQ19VU0JfSE9TVF9JTlQgQVUxNTAwX1VTQl9IT1NUX0lOVAotI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxNTAwICovCi0KLS8qIEF1MTEwMCAqLwotI2lmZGVmIENPTkZJR19TT0NfQVUxMTAwCi0KLSNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxMDEwMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KLSNkZWZpbmUgVVNCX0hPU1RfQ09ORklHIAkweEIwMTdGRkZDCi0jZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTExMDBfVVNCX0hPU1RfSU5UCi0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTExMDAgKi8KLQotI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCi0KLSNkZWZpbmUgVVNCX09IQ0lfQkFTRQkJMHgxNDAyMDAwMAkvKiBwaHlzIGFkZHIgZm9yIGlvcmVtYXAgKi8KLSNkZWZpbmUgVVNCX09IQ0lfTEVOCQkweDAwMDYwMDAwCi0jZGVmaW5lIFVTQl9IT1NUX0NPTkZJRyAJMHhCNDAyN2ZmYwotI2RlZmluZSBGT1JfUExBVEZPUk1fQ19VU0JfSE9TVF9JTlQgQVUxNTUwX1VTQl9IT1NUX0lOVAotI2VuZGlmIC8qIENPTkZJR19TT0NfQVUxNTUwICovCi0KLQotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0KLSNkZWZpbmUgVVNCX1VPQ19CQVNFCQkweDE0MDIwMDIwCi0jZGVmaW5lIFVTQl9VT0NfTEVOCQkweDIwCi0jZGVmaW5lIFVTQl9PSENJX0JBU0UJCTB4MTQwMjAxMDAKLSNkZWZpbmUgVVNCX09IQ0lfTEVOCQkweDEwMAotI2RlZmluZSBVU0JfRUhDSV9CQVNFCQkweDE0MDIwMjAwCi0jZGVmaW5lIFVTQl9FSENJX0xFTgkJMHgxMDAKLSNkZWZpbmUgVVNCX1VEQ19CQVNFCQkweDE0MDIyMDAwCi0jZGVmaW5lIFVTQl9VRENfTEVOCQkweDIwMDAKLSNkZWZpbmUgVVNCX01TUl9CQVNFCQkweEI0MDIwMDAwCi0jZGVmaW5lIFVTQl9NU1JfTUNGRwkJNAotI2RlZmluZSBVU0JNU1JNQ0ZHX09NRU1FTgkwCi0jZGVmaW5lIFVTQk1TUk1DRkdfT0JNRU4JMQotI2RlZmluZSBVU0JNU1JNQ0ZHX0VNRU1FTgkyCi0jZGVmaW5lIFVTQk1TUk1DRkdfRUJNRU4JMwotI2RlZmluZSBVU0JNU1JNQ0ZHX0RNRU1FTgk0Ci0jZGVmaW5lIFVTQk1TUk1DRkdfREJNRU4JNQotI2RlZmluZSBVU0JNU1JNQ0ZHX0dNRU1FTgk2Ci0jZGVmaW5lIFVTQk1TUk1DRkdfT0hDQ0xLRU4JMTYKLSNkZWZpbmUgVVNCTVNSTUNGR19FSENDTEtFTgkxNwotI2RlZmluZSBVU0JNU1JNQ0ZHX1VEQ0NMS0VOCTE4Ci0jZGVmaW5lIFVTQk1TUk1DRkdfUEhZUExMRU4JMTkKLSNkZWZpbmUgVVNCTVNSTUNGR19SRENPTUIJMzAKLSNkZWZpbmUgVVNCTVNSTUNGR19QRkVOIAkzMQotCi0jZGVmaW5lIEZPUl9QTEFURk9STV9DX1VTQl9IT1NUX0lOVCBBVTEyMDBfVVNCX0lOVAotCi0jZW5kaWYgLyogQ09ORklHX1NPQ19BVTEyMDAgKi8KLQogLyogUHJvZ3JhbW1hYmxlIENvdW50ZXJzIDAgYW5kIDEgKi8KICNkZWZpbmUgU1lTX0JBU0UJCTB4QjE5MDAwMDAKICNkZWZpbmUgU1lTX0NPVU5URVJfQ05UUkwJKFNZU19CQVNFICsgMHgxNCkKQEAgLTk1OCw1NiArODM1LDYgQEAKICMgIGRlZmluZSBJMlNfQ09OVFJPTF9EIAkoMSA8PCAxKQogIyAgZGVmaW5lIEkyU19DT05UUk9MX0NFCSgxIDw8IDApCiAKLS8qIFVTQiBIb3N0IENvbnRyb2xsZXIgKi8KLSNpZm5kZWYgVVNCX09IQ0lfTEVOCi0jZGVmaW5lIFVTQl9PSENJX0xFTgkJMHgwMDEwMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX1NPQ19BVTEyMDAKLQotLyogVVNCIERldmljZSBDb250cm9sbGVyICovCi0jZGVmaW5lIFVTQkRfRVAwUkQJCTB4QjAyMDAwMDAKLSNkZWZpbmUgVVNCRF9FUDBXUgkJMHhCMDIwMDAwNAotI2RlZmluZSBVU0JEX0VQMldSCQkweEIwMjAwMDA4Ci0jZGVmaW5lIFVTQkRfRVAzV1IJCTB4QjAyMDAwMEMKLSNkZWZpbmUgVVNCRF9FUDRSRAkJMHhCMDIwMDAxMAotI2RlZmluZSBVU0JEX0VQNVJECQkweEIwMjAwMDE0Ci0jZGVmaW5lIFVTQkRfSU5URU4JCTB4QjAyMDAwMTgKLSNkZWZpbmUgVVNCRF9JTlRTVEFUCQkweEIwMjAwMDFDCi0jICBkZWZpbmUgVVNCREVWX0lOVF9TT0YJKDEgPDwgMTIpCi0jICBkZWZpbmUgVVNCREVWX0lOVF9IRl9CSVQJNgotIyAgZGVmaW5lIFVTQkRFVl9JTlRfSEZfTUFTSwkoMHgzZiA8PCBVU0JERVZfSU5UX0hGX0JJVCkKLSMgIGRlZmluZSBVU0JERVZfSU5UX0NNUExUX0JJVAkwCi0jICBkZWZpbmUgVVNCREVWX0lOVF9DTVBMVF9NQVNLICgweDNmIDw8IFVTQkRFVl9JTlRfQ01QTFRfQklUKQotI2RlZmluZSBVU0JEX0NPTkZJRwkJMHhCMDIwMDAyMAotI2RlZmluZSBVU0JEX0VQMENTCQkweEIwMjAwMDI0Ci0jZGVmaW5lIFVTQkRfRVAyQ1MJCTB4QjAyMDAwMjgKLSNkZWZpbmUgVVNCRF9FUDNDUwkJMHhCMDIwMDAyQwotI2RlZmluZSBVU0JEX0VQNENTCQkweEIwMjAwMDMwCi0jZGVmaW5lIFVTQkRfRVA1Q1MJCTB4QjAyMDAwMzQKLSMgIGRlZmluZSBVU0JERVZfQ1NfU1UJCSgxIDw8IDE0KQotIyAgZGVmaW5lIFVTQkRFVl9DU19OQUsgCSgxIDw8IDEzKQotIyAgZGVmaW5lIFVTQkRFVl9DU19BQ0sgCSgxIDw8IDEyKQotIyAgZGVmaW5lIFVTQkRFVl9DU19CVVNZCSgxIDw8IDExKQotIyAgZGVmaW5lIFVTQkRFVl9DU19UU0laRV9CSVQJMQotIyAgZGVmaW5lIFVTQkRFVl9DU19UU0laRV9NQVNLCSgweDNmZiA8PCBVU0JERVZfQ1NfVFNJWkVfQklUKQotIyAgZGVmaW5lIFVTQkRFVl9DU19TVEFMTAkoMSA8PCAwKQotI2RlZmluZSBVU0JEX0VQMFJEU1RBVAkJMHhCMDIwMDA0MAotI2RlZmluZSBVU0JEX0VQMFdSU1RBVAkJMHhCMDIwMDA0NAotI2RlZmluZSBVU0JEX0VQMldSU1RBVAkJMHhCMDIwMDA0OAotI2RlZmluZSBVU0JEX0VQM1dSU1RBVAkJMHhCMDIwMDA0QwotI2RlZmluZSBVU0JEX0VQNFJEU1RBVAkJMHhCMDIwMDA1MAotI2RlZmluZSBVU0JEX0VQNVJEU1RBVAkJMHhCMDIwMDA1NAotIyAgZGVmaW5lIFVTQkRFVl9GU1RBVF9GTFVTSAkoMSA8PCA2KQotIyAgZGVmaW5lIFVTQkRFVl9GU1RBVF9VRgkoMSA8PCA1KQotIyAgZGVmaW5lIFVTQkRFVl9GU1RBVF9PRgkoMSA8PCA0KQotIyAgZGVmaW5lIFVTQkRFVl9GU1RBVF9GQ05UX0JJVCAwCi0jICBkZWZpbmUgVVNCREVWX0ZTVEFUX0ZDTlRfTUFTSyAoMHgwZiA8PCBVU0JERVZfRlNUQVRfRkNOVF9CSVQpCi0jZGVmaW5lIFVTQkRfRU5BQkxFCQkweEIwMjAwMDU4Ci0jICBkZWZpbmUgVVNCREVWX0VOQUJMRSAJKDEgPDwgMSkKLSMgIGRlZmluZSBVU0JERVZfQ0UJCSgxIDw8IDApCi0KLSNlbmRpZiAvKiAhQ09ORklHX1NPQ19BVTEyMDAgKi8KIAogLyogRXRoZXJuZXQgQ29udHJvbGxlcnMgICovCiAKQEAgLTEzMjIsNyArMTE0OSw2IEBACiAjICBkZWZpbmUgU1lTX1BGX01VU1RfQkVfU0VUCSgoMSA8PCA1KSB8ICgxIDw8IDIpKQogCiAvKiBBdTEyMDAgb25seSAqLwotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCiAjZGVmaW5lIFNZU19QSU5GVU5DX0RNQSAJKDEgPDwgMzEpCiAjZGVmaW5lIFNZU19QSU5GVU5DX1MwQSAJKDEgPDwgMzApCiAjZGVmaW5lIFNZU19QSU5GVU5DX1MxQSAJKDEgPDwgMjkpCkBAIC0xMzUwLDcgKzExNzYsNiBAQAogI2RlZmluZSBTWVNfUElORlVOQ19QMEIgCSgxIDw8IDQpCiAjZGVmaW5lIFNZU19QSU5GVU5DX1UwVCAJKDEgPDwgMykKICNkZWZpbmUgU1lTX1BJTkZVTkNfUzFCIAkoMSA8PCAyKQotI2VuZGlmCiAKIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KICNkZWZpbmUgU1lTX1NDUkFUQ0gwCQkweEIxOTAwMDE4CkBAIC0xNDA2LDEyICsxMjMxLDEyIEBACiAjICBkZWZpbmUgU1lTX0NTX01JMl9NQVNLCSgweDcgPDwgU1lTX0NTX01JMl9CSVQpCiAjICBkZWZpbmUgU1lTX0NTX0RJMgkJKDEgPDwgMTYpCiAjICBkZWZpbmUgU1lTX0NTX0NJMgkJKDEgPDwgMTUpCi0jaWZkZWYgQ09ORklHX1NPQ19BVTExMDAKKwogIyAgZGVmaW5lIFNZU19DU19NTF9CSVQgCTcKICMgIGRlZmluZSBTWVNfQ1NfTUxfTUFTSwkoMHg3IDw8IFNZU19DU19NTF9CSVQpCiAjICBkZWZpbmUgU1lTX0NTX0RMCQkoMSA8PCA2KQogIyAgZGVmaW5lIFNZU19DU19DTAkJKDEgPDwgNSkKLSNlbHNlCisKICMgIGRlZmluZSBTWVNfQ1NfTVVIX0JJVAkxMgogIyAgZGVmaW5lIFNZU19DU19NVUhfTUFTSwkoMHg3IDw8IFNZU19DU19NVUhfQklUKQogIyAgZGVmaW5lIFNZU19DU19EVUgJCSgxIDw8IDExKQpAQCAtMTQyMCw3ICsxMjQ1LDcgQEAKICMgIGRlZmluZSBTWVNfQ1NfTVVEX01BU0sJKDB4NyA8PCBTWVNfQ1NfTVVEX0JJVCkKICMgIGRlZmluZSBTWVNfQ1NfRFVECQkoMSA8PCA2KQogIyAgZGVmaW5lIFNZU19DU19DVUQJCSgxIDw8IDUpCi0jZW5kaWYKKwogIyAgZGVmaW5lIFNZU19DU19NSVJfQklUCTIKICMgIGRlZmluZSBTWVNfQ1NfTUlSX01BU0sJKDB4NyA8PCBTWVNfQ1NfTUlSX0JJVCkKICMgIGRlZmluZSBTWVNfQ1NfRElSCQkoMSA8PCAxKQpAQCAtMTQ2Nyw1OCArMTI5MiwzMCBAQAogIyAgZGVmaW5lIEFDOTdDX1JTCQkoMSA8PCAxKQogIyAgZGVmaW5lIEFDOTdDX0NFCQkoMSA8PCAwKQogCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkKLS8qIEF1MTUwMCBQQ0kgQ29udHJvbGxlciAqLwotI2RlZmluZSBBdTE1MDBfQ0ZHX0JBU0UgCTB4QjQwMDUwMDAJLyogdmlydHVhbCwgS1NFRzEgYWRkciAqLwotI2RlZmluZSBBdTE1MDBfUENJX0NNRU0gCShBdTE1MDBfQ0ZHX0JBU0UgKyAwKQotI2RlZmluZSBBdTE1MDBfUENJX0NGRwkJKEF1MTUwMF9DRkdfQkFTRSArIDQpCi0jICBkZWZpbmUgUENJX0VSUk9SCQkoKDEgPDwgMjIpIHwgKDEgPDwgMjMpIHwgKDEgPDwgMjQpIHwgXAotCQkJCSAoMSA8PCAyNSkgfCAoMSA8PCAyNikgfCAoMSA8PCAyNykpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfQjJCTUFTS19DQ0gJKEF1MTUwMF9DRkdfQkFTRSArIDgpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfQjJCMF9WSUQJKEF1MTUwMF9DRkdfQkFTRSArIDB4QykKLSNkZWZpbmUgQXUxNTAwX1BDSV9CMkIxX0lECShBdTE1MDBfQ0ZHX0JBU0UgKyAweDEwKQotI2RlZmluZSBBdTE1MDBfUENJX01XTUFTS19ERVYJKEF1MTUwMF9DRkdfQkFTRSArIDB4MTQpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfTVdCQVNFX1JFVl9DQ0wgKEF1MTUwMF9DRkdfQkFTRSArIDB4MTgpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfRVJSX0FERFIJKEF1MTUwMF9DRkdfQkFTRSArIDB4MUMpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfU1BFQ19JTlRBQ0sJKEF1MTUwMF9DRkdfQkFTRSArIDB4MjApCi0jZGVmaW5lIEF1MTUwMF9QQ0lfSUQJCShBdTE1MDBfQ0ZHX0JBU0UgKyAweDEwMCkKLSNkZWZpbmUgQXUxNTAwX1BDSV9TVEFUQ01ECShBdTE1MDBfQ0ZHX0JBU0UgKyAweDEwNCkKLSNkZWZpbmUgQXUxNTAwX1BDSV9DTEFTU1JFVgkoQXUxNTAwX0NGR19CQVNFICsgMHgxMDgpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfSERSVFlQRQkoQXUxNTAwX0NGR19CQVNFICsgMHgxMEMpCi0jZGVmaW5lIEF1MTUwMF9QQ0lfTUJBUiAJKEF1MTUwMF9DRkdfQkFTRSArIDB4MTEwKQogCi0jZGVmaW5lIEF1MTUwMF9QQ0lfSERSCQkweEI0MDA1MTAwCS8qIHZpcnR1YWwsIEtTRUcxIGFkZHIgKi8KLQotLyoKLSAqIEFsbCBvZiBvdXIgc3RydWN0dXJlcywgbGlrZSBQQ0kgcmVzb3VyY2UsIGhhdmUgMzItYml0IG1lbWJlcnMuCi0gKiBEcml2ZXJzIGFyZSBleHBlY3RlZCB0byBkbyBhbiBpb3JlbWFwIG9uIHRoZSBQQ0kgTUVNIHJlc291cmNlLCBidXQgaXQncwotICogaGFyZCB0byBzdG9yZSAweDQgMDAwMCAwMDAwIGluIGEgMzItYml0IHR5cGUuICBXZSByZXF1aXJlIGEgc21hbGwgcGF0Y2gKLSAqIHRvIF9faW9yZW1hcCB0byBjaGVjayBmb3IgYWRkcmVzc2VzIGJldHdlZW4gKHUzMilBdTE1MDBfUENJX01FTV9TVEFSVCBhbmQKLSAqICh1MzIpQXUxNTAwX1BDSV9NRU1fRU5EIGFuZCBjaGFuZ2UgdGhvc2UgdG8gdGhlIGZ1bGwgMzYtYml0IFBDSSBNRU0KLSAqIGFkZHJlc3Nlcy4gIEZvciBQQ0kgSS9PLCBpdCdzIHNpbXBsZXIgYmVjYXVzZSB3ZSBnZXQgdG8gZG8gdGhlIGlvcmVtYXAKLSAqIG91cnNlbHZlcyBhbmQgdGhlbiBhZGp1c3QgdGhlIGRldmljZSdzIHJlc291cmNlcy4KKy8qIFRoZSBQQ0kgY2hpcCBzZWxlY3RzIGFyZSBvdXRzaWRlIHRoZSAzMmJpdCBzcGFjZSwgYW5kIHNpbmNlIHdlIGNhbid0CisgKiBqdXN0IHByb2dyYW0gdGhlIDM2Yml0IGFkZHJlc3NlcyBpbnRvIEJBUnMsIHdlIGhhdmUgdG8gdGFrZSBhIGNodW5rCisgKiBvdXQgb2YgdGhlIDMyYml0IHNwYWNlIGFuZCByZXNlcnZlIGl0IGZvciBQQ0kuICBXaGVuIHRoZXNlIGFkZHJlc3NlcworICogYXJlIGlvcmVtYXAoKWVkLCB0aGV5J2xsIGJlIGZpeGVkIHVwIHRvIHRoZSByZWFsIDM2Yml0IGFkZHJlc3MgYmVmb3JlCisgKiBiZWluZyBwYXNzZWQgdG8gdGhlIHJlYWwgaW9yZW1hcCBmdW5jdGlvbi4KICAqLwotI2RlZmluZSBBdTE1MDBfRVhUX0NGRwkJMHg2MDAwMDAwMDBVTEwKLSNkZWZpbmUgQXUxNTAwX0VYVF9DRkdfVFlQRTEJMHg2ODAwMDAwMDBVTEwKLSNkZWZpbmUgQXUxNTAwX1BDSV9JT19TVEFSVAkweDUwMDAwMDAwMFVMTAotI2RlZmluZSBBdTE1MDBfUENJX0lPX0VORAkweDUwMDBGRkZGRlVMTAotI2RlZmluZSBBdTE1MDBfUENJX01FTV9TVEFSVAkweDQ0MDAwMDAwMFVMTAotI2RlZmluZSBBdTE1MDBfUENJX01FTV9FTkQJMHg0NEZGRkZGRkZVTEwKKyNkZWZpbmUgQUxDSEVNWV9QQ0lfTUVNV0lOX1NUQVJUCShBVTE1MDBfUENJX01FTV9QSFlTX0FERFIgPj4gNCkKKyNkZWZpbmUgQUxDSEVNWV9QQ0lfTUVNV0lOX0VORAkJKEFMQ0hFTVlfUENJX01FTVdJTl9TVEFSVCArIDB4MEZGRkZGRkYpCiAKLSNkZWZpbmUgUENJX0lPX1NUQVJUCTB4MDAwMDEwMDAKLSNkZWZpbmUgUENJX0lPX0VORAkweDAwMEZGRkZGCi0jZGVmaW5lIFBDSV9NRU1fU1RBUlQJMHg0MDAwMDAwMAotI2RlZmluZSBQQ0lfTUVNX0VORAkweDRGRkZGRkZGCisvKiBmb3IgUENJIElPIGl0J3Mgc2ltcGxlciBiZWNhdXNlIHdlIGdldCB0byBkbyB0aGUgaW9yZW1hcCBvdXJzZWx2ZXMgYW5kIHRoZW4KKyAqIGFkanVzdCB0aGUgZGV2aWNlJ3MgcmVzb3VyY2VzLgorICovCisjZGVmaW5lIEFMQ0hFTVlfUENJX0lPV0lOX1NUQVJUCQkweDAwMDAxMDAwCisjZGVmaW5lIEFMQ0hFTVlfUENJX0lPV0lOX0VORAkJMHgwMDAwRkZGRgogCi0jZGVmaW5lIFBDSV9GSVJTVF9ERVZGTiAoMCA8PCAzKQotI2RlZmluZSBQQ0lfTEFTVF9ERVZGTgkoMTkgPDwgMykKKyNpZmRlZiBDT05GSUdfUENJCiAKICNkZWZpbmUgSU9QT1JUX1JFU09VUkNFX1NUQVJUCTB4MDAwMDEwMDAJLyogc2tpcCBsZWdhY3kgcHJvYmluZyAqLwogI2RlZmluZSBJT1BPUlRfUkVTT1VSQ0VfRU5ECTB4ZmZmZmZmZmYKICNkZWZpbmUgSU9NRU1fUkVTT1VSQ0VfU1RBUlQJMHgxMDAwMDAwMAogI2RlZmluZSBJT01FTV9SRVNPVVJDRV9FTkQJMHhmZmZmZmZmZmZVTEwKIAotI2Vsc2UgLyogQXUxMDAwIGFuZCBBdTExMDAgYW5kIEF1MTIwMCAqLworI2Vsc2UKIAogLyogRG9uJ3QgYWxsb3cgYW55IGxlZ2FjeSBwb3J0cyBwcm9iaW5nICovCiAjZGVmaW5lIElPUE9SVF9SRVNPVVJDRV9TVEFSVAkweDEwMDAwMDAwCkBAIC0xNTI2LDEzICsxMzIzLDc3IEBACiAjZGVmaW5lIElPTUVNX1JFU09VUkNFX1NUQVJUCTB4MTAwMDAwMDAKICNkZWZpbmUgSU9NRU1fUkVTT1VSQ0VfRU5ECTB4ZmZmZmZmZmZmVUxMCiAKLSNkZWZpbmUgUENJX0lPX1NUQVJUCTAKLSNkZWZpbmUgUENJX0lPX0VORAkwCi0jZGVmaW5lIFBDSV9NRU1fU1RBUlQJMAotI2RlZmluZSBQQ0lfTUVNX0VORAkwCi0jZGVmaW5lIFBDSV9GSVJTVF9ERVZGTiAwCi0jZGVmaW5lIFBDSV9MQVNUX0RFVkZOCTAKLQogI2VuZGlmCiAKKy8qIFBDSSBjb250cm9sbGVyIGJsb2NrIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgUENJX1JFR19DTUVNCQkweDAwMDAKKyNkZWZpbmUgUENJX1JFR19DT05GSUcJCTB4MDAwNAorI2RlZmluZSBQQ0lfUkVHX0IyQk1BU0tfQ0NICTB4MDAwOAorI2RlZmluZSBQQ0lfUkVHX0IyQkJBU0UwX1ZJRAkweDAwMEMKKyNkZWZpbmUgUENJX1JFR19CMkJCQVNFMV9TSUQJMHgwMDEwCisjZGVmaW5lIFBDSV9SRUdfTVdNQVNLX0RFVgkweDAwMTQKKyNkZWZpbmUgUENJX1JFR19NV0JBU0VfUkVWX0NDTAkweDAwMTgKKyNkZWZpbmUgUENJX1JFR19FUlJfQUREUgkweDAwMUMKKyNkZWZpbmUgUENJX1JFR19TUEVDX0lOVEFDSwkweDAwMjAKKyNkZWZpbmUgUENJX1JFR19JRAkJMHgwMTAwCisjZGVmaW5lIFBDSV9SRUdfU1RBVENNRAkJMHgwMTA0CisjZGVmaW5lIFBDSV9SRUdfQ0xBU1NSRVYJMHgwMTA4CisjZGVmaW5lIFBDSV9SRUdfUEFSQU0JCTB4MDEwQworI2RlZmluZSBQQ0lfUkVHX01CQVIJCTB4MDExMAorI2RlZmluZSBQQ0lfUkVHX1RJTUVPVVQJCTB4MDE0MAorCisvKiBQQ0kgY29udHJvbGxlciBibG9jayByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFBDSV9DTUVNX0UJCSgxIDw8IDI4KQkvKiBlbmFibGUgY2FjaGVhYmxlIG1lbW9yeSAqLworI2RlZmluZSBQQ0lfQ01FTV9DTUJBU0UoeCkJKCgoeCkgJiAweDNmZmYpIDw8IDE0KQorI2RlZmluZSBQQ0lfQ01FTV9DTU1BU0soeCkJKCh4KSAmIDB4M2ZmZikKKyNkZWZpbmUgUENJX0NPTkZJR19FUkQJCSgxIDw8IDI3KSAvKiBwY2kgZXJyb3IgZHVyaW5nIFIvVyAqLworI2RlZmluZSBQQ0lfQ09ORklHX0VUCQkoMSA8PCAyNikgLyogZXJyb3IgaW4gdGFyZ2V0IG1vZGUgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19FRgkJKDEgPDwgMjUpIC8qIGZhdGFsIGVycm9yICovCisjZGVmaW5lIFBDSV9DT05GSUdfRVAJCSgxIDw8IDI0KSAvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19FTQkJKDEgPDwgMjMpIC8qIG11bHRpcGxlIGVycm9ycyAqLworI2RlZmluZSBQQ0lfQ09ORklHX0JNCQkoMSA8PCAyMikgLyogYmFkIG1hc3RlciBlcnJvciAqLworI2RlZmluZSBQQ0lfQ09ORklHX1BECQkoMSA8PCAyMCkgLyogUENJIERpc2FibGUgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19CTUUJCSgxIDw8IDE5KSAvKiBCeXRlIE1hc2sgRW5hYmxlIGZvciByZWFkcyAqLworI2RlZmluZSBQQ0lfQ09ORklHX05DCQkoMSA8PCAxNikgLyogbWFyayBtZW0gYWNjZXNzIG5vbi1jb2hlcmVudCAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lBCQkoMSA8PCAxNSkgLyogSU5UQSMgZW5hYmxlZCAodGFyZ2V0IG1vZGUpICovCisjZGVmaW5lIFBDSV9DT05GSUdfSVAJCSgxIDw8IDEzKSAvKiBpbnQgb24gUENJX1BFUlIjICovCisjZGVmaW5lIFBDSV9DT05GSUdfSVMJCSgxIDw8IDEyKSAvKiBpbnQgb24gUENJX1NFUlIjICovCisjZGVmaW5lIFBDSV9DT05GSUdfSU1NCQkoMSA8PCAxMSkgLyogaW50IG9uIG1hc3RlciBhYm9ydCAqLworI2RlZmluZSBQQ0lfQ09ORklHX0lUTQkJKDEgPDwgMTApIC8qIGludCBvbiB0YXJnZXQgYWJvcnQgKGFzIG1hc3RlcikgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19JVFQJCSgxIDw8IDkpICAvKiBpbnQgb24gdGFyZ2V0IGFib3J0IChhcyB0YXJnZXQpICovCisjZGVmaW5lIFBDSV9DT05GSUdfSVBCCQkoMSA8PCA4KSAgLyogaW50IG9uIFBFUlIjIGluIGJ1cyBtYXN0ZXIgYWNjICovCisjZGVmaW5lIFBDSV9DT05GSUdfU0lDX05PCSgwIDw8IDYpICAvKiBubyBieXRlIG1hc2sgY2hhbmdlcyAqLworI2RlZmluZSBQQ0lfQ09ORklHX1NJQ19CQV9BRFIJKDEgPDwgNikgIC8qIG9uIGJ5dGUvaHcgYWNjLCBpbnZlcnQgYWRyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19TSUNfSFdBX0RBVAkoMiA8PCA2KSAgLyogb24gaGFsZndvcmQgYWNjLCBzd2FwIGRhdGEgKi8KKyNkZWZpbmUgUENJX0NPTkZJR19TSUNfQUxMCSgzIDw8IDYpICAvKiBzd2FwIGRhdGEgYnl0ZXMgb24gYWxsIGFjY2Vzc2VzICovCisjZGVmaW5lIFBDSV9DT05GSUdfU1QJCSgxIDw8IDUpICAvKiBzd2FwIGRhdGEgYnkgdGFyZ2V0IHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSBQQ0lfQ09ORklHX1NNCQkoMSA8PCA0KSAgLyogc3dhcCBkYXRhIGZyb20gUENJIGN0bCAqLworI2RlZmluZSBQQ0lfQ09ORklHX0FFTgkJKDEgPDwgMykgIC8qIGVuYWJsZSBpbnRlcm5hbCBhcmJpdGVyICovCisjZGVmaW5lIFBDSV9DT05GSUdfUjJICQkoMSA8PCAyKSAgLyogUkVRMiMgdG8gaGktcHJpbyBhcmJpdGVyICovCisjZGVmaW5lIFBDSV9DT05GSUdfUjFICQkoMSA8PCAxKSAgLyogUkVRMSMgdG8gaGktcHJpbyBhcmJpdGVyICovCisjZGVmaW5lIFBDSV9DT05GSUdfQ0gJCSgxIDw8IDApICAvKiBQQ0kgY3RsIHRvIGhpLXByaW8gYXJiaXRlciAqLworI2RlZmluZSBQQ0lfQjJCTUFTS19CMkJNQVNLKHgpCSgoKHgpICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgUENJX0IyQk1BU0tfQ0NIKHgpCSgoeCkgJiAweGZmZmYpIC8qIDE2IHVwcGVyIGJpdHMgb2YgY2xhc3MgY29kZSAqLworI2RlZmluZSBQQ0lfQjJCQkFTRTBfVklEX0IwKHgpCSgoKHgpICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgUENJX0IyQkJBU0UwX1ZJRF9TVih4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBQQ0lfQjJCQkFTRTFfU0lEX0IxKHgpCSgoKHgpICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgUENJX0IyQkJBU0UxX1NJRF9TSSh4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBQQ0lfTVdNQVNLREVWX01XTUFTSyh4KSAoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9NV01BU0tERVZfREVWSUQoeCkJKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgUENJX01XQkFTRVJFVkNDTF9CQVNFKHgpICgoKHgpICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgUENJX01XQkFTRVJFVkNDTF9SRVYoeCkgICgoKHgpICYgMHhmZikgPDwgOCkKKyNkZWZpbmUgUENJX01XQkFTRVJFVkNDTF9DQ0woeCkgICgoeCkgJiAweGZmKQorI2RlZmluZSBQQ0lfSURfRElEKHgpCQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9JRF9WSUQoeCkJCSgoeCkgJiAweGZmZmYpCisjZGVmaW5lIFBDSV9TVEFUQ01EX1NUQVRVUyh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9TVEFUQ01EX0NNRCh4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBQQ0lfQ0xBU1NSRVZfQ0xBU1MoeCkJKCgoeCkgJiAweDAwZmZmZmZmKSA8PCA4KQorI2RlZmluZSBQQ0lfQ0xBU1NSRVZfUkVWKHgpCSgoeCkgJiAweGZmKQorI2RlZmluZSBQQ0lfUEFSQU1fQklTVCh4KQkoKCh4KSAmIDB4ZmYpIDw8IDI0KQorI2RlZmluZSBQQ0lfUEFSQU1fSFQoeCkJCSgoKHgpICYgMHhmZikgPDwgMTYpCisjZGVmaW5lIFBDSV9QQVJBTV9MVCh4KQkJKCgoeCkgJiAweGZmKSA8PCA4KQorI2RlZmluZSBQQ0lfUEFSQU1fQ0xTKHgpCSgoeCkgJiAweGZmKQorI2RlZmluZSBQQ0lfVElNRU9VVF9SRVRSSUVTKHgpCSgoKHgpICYgMHhmZikgPDwgOCkJLyogbWF4IHJldHJpZXMgKi8KKyNkZWZpbmUgUENJX1RJTUVPVVRfVE8oeCkJKCh4KSAmIDB4ZmYpCS8qIHRhcmdldCByZWFkeSB0aW1lb3V0ICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjM2NTUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfQVUxWFhYX0hfCi0jZGVmaW5lIF9BVTFYWFhfSF8KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLQotI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX01JUFNfREIxNTAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTU1MCkKLSNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvZGIxeDAwLmg+Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX01JUFNfUEIxNTUwKQotI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaD4KLQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjEyMDApCi0jaW5jbHVkZSA8YXNtL21hY2gtcGIxeDAwL3BiMTIwMC5oPgotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTIwMCkKLSNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvZGIxMjAwLmg+Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogX0FVMVhYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oCmluZGV4IDJmZGFjZmUuLjMyM2NlMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKQEAgLTEyNiw2NiArMTI2LDYyIEBACiAjZGVmaW5lIFNXX1NUQVRVU19JTlVTRSAJKDEgPDwgMCkKIAogLyogQ29tbWFuZCAwIGRldmljZSBJRHMuICovCi0jaWZkZWYgQ09ORklHX1NPQ19BVTE1NTAKLSNkZWZpbmUgRFNDUl9DTUQwX1VBUlQwX1RYCTAKLSNkZWZpbmUgRFNDUl9DTUQwX1VBUlQwX1JYCTEKLSNkZWZpbmUgRFNDUl9DTUQwX1VBUlQzX1RYCTIKLSNkZWZpbmUgRFNDUl9DTUQwX1VBUlQzX1JYCTMKLSNkZWZpbmUgRFNDUl9DTUQwX0RNQV9SRVEwCTQKLSNkZWZpbmUgRFNDUl9DTUQwX0RNQV9SRVExCTUKLSNkZWZpbmUgRFNDUl9DTUQwX0RNQV9SRVEyCTYKLSNkZWZpbmUgRFNDUl9DTUQwX0RNQV9SRVEzCTcKLSNkZWZpbmUgRFNDUl9DTUQwX1VTQkRFVl9SWDAJOAotI2RlZmluZSBEU0NSX0NNRDBfVVNCREVWX1RYMAk5Ci0jZGVmaW5lIERTQ1JfQ01EMF9VU0JERVZfVFgxCTEwCi0jZGVmaW5lIERTQ1JfQ01EMF9VU0JERVZfVFgyCTExCi0jZGVmaW5lIERTQ1JfQ01EMF9VU0JERVZfUlgzCTEyCi0jZGVmaW5lIERTQ1JfQ01EMF9VU0JERVZfUlg0CTEzCi0jZGVmaW5lIERTQ1JfQ01EMF9QU0MwX1RYCTE0Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MwX1JYCTE1Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MxX1RYCTE2Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MxX1JYCTE3Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MyX1RYCTE4Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MyX1JYCTE5Ci0jZGVmaW5lIERTQ1JfQ01EMF9QU0MzX1RYCTIwCi0jZGVmaW5lIERTQ1JfQ01EMF9QU0MzX1JYCTIxCi0jZGVmaW5lIERTQ1JfQ01EMF9QQ0lfV1JJVEUJMjIKLSNkZWZpbmUgRFNDUl9DTUQwX05BTkRfRkxBU0gJMjMKLSNkZWZpbmUgRFNDUl9DTUQwX01BQzBfUlgJMjQKLSNkZWZpbmUgRFNDUl9DTUQwX01BQzBfVFgJMjUKLSNkZWZpbmUgRFNDUl9DTUQwX01BQzFfUlgJMjYKLSNkZWZpbmUgRFNDUl9DTUQwX01BQzFfVFgJMjcKLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTU1MCAqLworI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VBUlQwX1RYCTAKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9VQVJUMF9SWAkxCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVUFSVDNfVFgJMgorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VBUlQzX1JYCTMKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMAk0CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfRE1BX1JFUTEJNQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX0RNQV9SRVEyCTYKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9ETUFfUkVRMwk3CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1JYMAk4CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1RYMAk5CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1RYMQkxMAorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1VTQkRFVl9UWDIJMTEKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9VU0JERVZfUlgzCTEyCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfVVNCREVWX1JYNAkxMworI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BTQzBfVFgJMTQKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MwX1JYCTE1CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUFNDMV9UWAkxNgorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BTQzFfUlgJMTcKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MyX1RYCTE4CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUFNDMl9SWAkxOQorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX1BTQzNfVFgJMjAKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1JYCTIxCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfUENJX1dSSVRFCTIyCisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfTkFORF9GTEFTSAkyMworI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX01BQzBfUlgJMjQKKyNkZWZpbmUgQVUxNTUwX0RTQ1JfQ01EMF9NQUMwX1RYCTI1CisjZGVmaW5lIEFVMTU1MF9EU0NSX0NNRDBfTUFDMV9SWAkyNgorI2RlZmluZSBBVTE1NTBfRFNDUl9DTUQwX01BQzFfVFgJMjcKIAotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMF9UWAkwCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMF9SWAkxCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMV9UWAkyCi0jZGVmaW5lIERTQ1JfQ01EMF9VQVJUMV9SWAkzCi0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMAk0Ci0jZGVmaW5lIERTQ1JfQ01EMF9ETUFfUkVRMQk1Ci0jZGVmaW5lIERTQ1JfQ01EMF9NQUVfQkUJNgotI2RlZmluZSBEU0NSX0NNRDBfTUFFX0ZFCTcKLSNkZWZpbmUgRFNDUl9DTUQwX1NETVNfVFgwCTgKLSNkZWZpbmUgRFNDUl9DTUQwX1NETVNfUlgwCTkKLSNkZWZpbmUgRFNDUl9DTUQwX1NETVNfVFgxCTEwCi0jZGVmaW5lIERTQ1JfQ01EMF9TRE1TX1JYMQkxMQotI2RlZmluZSBEU0NSX0NNRDBfQUVTX1RYCTEzCi0jZGVmaW5lIERTQ1JfQ01EMF9BRVNfUlgJMTIKLSNkZWZpbmUgRFNDUl9DTUQwX1BTQzBfVFgJMTQKLSNkZWZpbmUgRFNDUl9DTUQwX1BTQzBfUlgJMTUKLSNkZWZpbmUgRFNDUl9DTUQwX1BTQzFfVFgJMTYKLSNkZWZpbmUgRFNDUl9DTUQwX1BTQzFfUlgJMTcKLSNkZWZpbmUgRFNDUl9DTUQwX0NJTV9SWEEJMTgKLSNkZWZpbmUgRFNDUl9DTUQwX0NJTV9SWEIJMTkKLSNkZWZpbmUgRFNDUl9DTUQwX0NJTV9SWEMJMjAKLSNkZWZpbmUgRFNDUl9DTUQwX01BRV9CT1RICTIxCi0jZGVmaW5lIERTQ1JfQ01EMF9MQ0QJCTIyCi0jZGVmaW5lIERTQ1JfQ01EMF9OQU5EX0ZMQVNICTIzCi0jZGVmaW5lIERTQ1JfQ01EMF9QU0MwX1NZTkMJMjQKLSNkZWZpbmUgRFNDUl9DTUQwX1BTQzFfU1lOQwkyNQotI2RlZmluZSBEU0NSX0NNRDBfQ0lNX1NZTkMJMjYKLSNlbmRpZiAvKiBDT05GSUdfU09DX0FVMTIwMCAqLworI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1VBUlQwX1RYCTAKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9VQVJUMF9SWAkxCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfVUFSVDFfVFgJMgorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1VBUlQxX1JYCTMKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9ETUFfUkVRMAk0CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfRE1BX1JFUTEJNQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX01BRV9CRQkJNgorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX01BRV9GRQkJNworI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1NETVNfVFgwCTgKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMAk5CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfU0RNU19UWDEJMTAKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9TRE1TX1JYMQkxMQorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX0FFU19UWAkJMTMKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9BRVNfUlgJCTEyCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfUFNDMF9UWAkxNAorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX1BTQzBfUlgJMTUKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1RYCTE2CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfUFNDMV9SWAkxNworI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX0NJTV9SWEEJMTgKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fUlhCCTE5CisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfQ0lNX1JYQwkyMAorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX01BRV9CT1RICTIxCisjZGVmaW5lIEFVMTIwMF9EU0NSX0NNRDBfTENECQkyMgorI2RlZmluZSBBVTEyMDBfRFNDUl9DTUQwX05BTkRfRkxBU0gJMjMKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9QU0MwX1NZTkMJMjQKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1NZTkMJMjUKKyNkZWZpbmUgQVUxMjAwX0RTQ1JfQ01EMF9DSU1fU1lOQwkyNgogCiAjZGVmaW5lIERTQ1JfQ01EMF9USFJPVFRMRQkzMAogI2RlZmluZSBEU0NSX0NNRDBfQUxXQVlTCTMxCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9pZGUuaAppbmRleCA1NjU2YzcyLi5lMzA2Mzg0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKQEAgLTU4LDYgKzU4LDcgQEAKICNlbmRpZgogCWludAkJCWlycTsKIAl1MzIJCQlyZWdiYXNlOworCWludAkJCWRkbWFfaWQ7CiB9IF9hdWlkZV9od2lmOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmgKaW5kZXggODkyYjdmMS4uNGUzZjNiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oCkBAIC0zMywxOSArMzMsNiBAQAogI2lmbmRlZiBfQVUxMDAwX1BTQ19IXwogI2RlZmluZSBfQVUxMDAwX1BTQ19IXwogCi0vKiBUaGUgUFNDIGJhc2UgYWRkcmVzc2VzLiAgKi8KLSNpZmRlZiBDT05GSUdfU09DX0FVMTU1MAotI2RlZmluZSBQU0MwX0JBU0VfQUREUgkJMHhiMWEwMDAwMAotI2RlZmluZSBQU0MxX0JBU0VfQUREUgkJMHhiMWIwMDAwMAotI2RlZmluZSBQU0MyX0JBU0VfQUREUgkJMHhiMGEwMDAwMAotI2RlZmluZSBQU0MzX0JBU0VfQUREUgkJMHhiMGIwMDAwMAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotI2RlZmluZSBQU0MwX0JBU0VfQUREUgkJMHhiMWEwMDAwMAotI2RlZmluZSBQU0MxX0JBU0VfQUREUgkJMHhiMWIwMDAwMAotI2VuZGlmCi0KIC8qCiAgKiBUaGUgUFNDIHNlbGVjdCBhbmQgY29udHJvbCByZWdpc3RlcnMgYXJlIGNvbW1vbiB0byBhbGwgcHJvdG9jb2xzLgogICovCkBAIC04MCwxOSArNjcsNiBAQAogI2RlZmluZSBQU0NfQUM5N0dQT19PRkZTRVQJMHgwMDAwMDAyOAogI2RlZmluZSBQU0NfQUM5N0dQSV9PRkZTRVQJMHgwMDAwMDAyYwogCi0jZGVmaW5lIEFDOTdfUFNDX1NFTAkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfU0VMX09GRlNFVCkKLSNkZWZpbmUgQUM5N19QU0NfQ1RSTAkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQ1RSTF9PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3Q0ZHCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3Q0ZHX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdNU0sJCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdNU0tfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N1BDUgkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N1BDUl9PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3U1RBVAkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N1NUQVRfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N0VWTlQJCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdFVk5UX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdUWFJYCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3VFhSWF9PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3Q0RDCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3Q0RDX09GRlNFVCkKLSNkZWZpbmUgUFNDX0FDOTdSU1QJCShBQzk3X1BTQ19CQVNFICsgUFNDX0FDOTdSU1RfT0ZGU0VUKQotI2RlZmluZSBQU0NfQUM5N0dQTwkJKEFDOTdfUFNDX0JBU0UgKyBQU0NfQUM5N0dQT19PRkZTRVQpCi0jZGVmaW5lIFBTQ19BQzk3R1BJCQkoQUM5N19QU0NfQkFTRSArIFBTQ19BQzk3R1BJX09GRlNFVCkKLQogLyogQUM5NyBDb25maWcgUmVnaXN0ZXIuICovCiAjZGVmaW5lIFBTQ19BQzk3Q0ZHX1JUX01BU0sJKDMgPDwgMzApCiAjZGVmaW5lIFBTQ19BQzk3Q0ZHX1JUX0ZJRk8xCSgwIDw8IDMwKQpAQCAtMzk0LDE5ICszNjgsNiBAQAogI2RlZmluZSBQU0NfU1BJVFhSWF9MQwkJKDEgPDwgMjkpCiAjZGVmaW5lIFBTQ19TUElUWFJYX1NSCQkoMSA8PCAyOCkKIAotLyogUFNDIGluIFNNQnVzIChJMkMpIE1vZGUuICovCi10eXBlZGVmIHN0cnVjdAlwc2Nfc21iIHsKLQl1MzIJcHNjX3NlbDsKLQl1MzIJcHNjX2N0cmw7Ci0JdTMyCXBzY19zbWJjZmc7Ci0JdTMyCXBzY19zbWJtc2s7Ci0JdTMyCXBzY19zbWJwY3I7Ci0JdTMyCXBzY19zbWJzdGF0OwotCXUzMglwc2Nfc21iZXZudDsKLQl1MzIJcHNjX3NtYnR4cng7Ci0JdTMyCXBzY19zbWJ0bXI7Ci19IHBzY19zbWJfdDsKLQogLyogU01CdXMgQ29uZmlnIFJlZ2lzdGVyLiAqLwogI2RlZmluZSBQU0NfU01CQ0ZHX1JUX01BU0sJKDMgPDwgMzApCiAjZGVmaW5lIFBTQ19TTUJDRkdfUlRfRklGTzEJKDAgPDwgMzApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9ncGlvLWF1MTAwMC5oCmluZGV4IDFmNDFhNTIuLjczODUzYjVhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaApAQCAtMzQ3LDE3ICszNDcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogT24gQXUxMDAwLCBBdTE1MDAgYW5kIEF1MTEwMCBHUElPcyB3b24ndCB3b3JrIGFzIGlucHV0cyBiZWZvcmUKLSAqIFNZU19QSU5JTlBVVEVOIGlzIHdyaXR0ZW4gdG8gYXQgbGVhc3Qgb25jZS4gIE9uIEF1MTU1MC9BdTEyMDAgdGhpcwotICogcmVnaXN0ZXIgZW5hYmxlcyB1c2Ugb2YgR1BJT3MgYXMgd2FrZSBzb3VyY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhbGNoZW15X2dwaW8xX2lucHV0X2VuYWJsZSh2b2lkKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1NZU19QSFlTX0FERFIpOwotCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgU1lTX1BJTklOUFVURU4pOwkvKiB0aGUgd3JpdGUgb3AgaXMga2V5ICovCi0Jd21iKCk7Ci19Ci0KIC8qIEdQSU8yIHNoYXJlZCBpbnRlcnJ1cHRzIGFuZCBjb250cm9sICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2FsY2hlbXlfZ3BpbzJfbW9kX2ludChpbnQgZ3BpbzIsIGludCBlbikKQEAgLTU2MSw2ICs1NTAsNyBAQAogCiAjaWZuZGVmIENPTkZJR19HUElPTElCCiAKKyNpZmRlZiBDT05GSUdfQUxDSEVNWV9HUElPSU5UX0FVMTAwMAogCiAjaWZuZGVmIENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QJLyogY2FzZSAoNCkgKi8KIApAQCAtNjY1LDI0ICs2NTUsNyBAQAogCiAjZW5kaWYJLyogIUNPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QgKi8KIAotCi0jZWxzZQkvKiBDT05GSUcgR1BJT0xJQiAqLwotCi0KLSAvKiB1c2luZyBncGlvbGliIHRvIHByb3ZpZGUgdXAgdG8gMiBncGlvX2NoaXBzIGZvciBvbi1jaGlwIGdwaW9zICovCi0jaWZuZGVmIENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QJLyogY2FzZSAoMikgKi8KLQotLyogZ2V0IGV2ZXJ5dGhpbmcgdGhyb3VnaCBncGlvbGliICovCi0jZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKLSNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQotI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCi0jZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCi0jZGVmaW5lIGlycV90b19ncGlvCWFsY2hlbXlfaXJxX3RvX2dwaW8KLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KLQotI2VuZGlmCS8qICFDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUICovCi0KKyNlbmRpZgkvKiBDT05GSUdfQUxDSEVNWV9HUElPSU5UX0FVMTAwMCAqLwogCiAjZW5kaWYJLyogIUNPTkZJR19HUElPTElCICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9ncGlvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvZ3Bpby5oCmluZGV4IGMzZjYwY2QuLmZjZGM4YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9ncGlvLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2dwaW8uaApAQCAtMSwxMCArMSw4MyBAQAorLyoKKyAqIEFsY2hlbXkgR1BJTyBzdXBwb3J0LgorICoKKyAqIFdpdGggQ09ORklHX0dQSU9MSUI9eSBkaWZmZXJlbnQgdHlwZXMgb2Ygb24tY2hpcCBHUElPIGNhbiBiZSBzdXBwb3J0ZWQgd2l0aGluCisgKiAgdGhlIHNhbWUga2VybmVsIGltYWdlLgorICogV2l0aCBDT05GSUdfR1BJT0xJQj1uLCB5b3VyIGJvYXJkIG11c3Qgc2VsZWN0IEFMQ0hFTVlfR1BJT0lOVF9BVTFYWFggZm9yIHRoZQorICogIGFwcHJvcHJpYXRlIENQVSB0eXBlIChBVTEwMDAgY3VycmVudGx5KS4KKyAqLworCiAjaWZuZGVmIF9BTENIRU1ZX0dQSU9fSF8KICNkZWZpbmUgX0FMQ0hFTVlfR1BJT19IXwogCi0jaWYgZGVmaW5lZChDT05GSUdfQUxDSEVNWV9HUElPSU5UX0FVMTAwMCkKLQorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvZ3Bpby1hdTEwMDAuaD4KIAotI2VuZGlmCisvKiBPbiBBdTEwMDAsIEF1MTUwMCBhbmQgQXUxMTAwIEdQSU9zIHdvbid0IHdvcmsgYXMgaW5wdXRzIGJlZm9yZQorICogU1lTX1BJTklOUFVURU4gaXMgd3JpdHRlbiB0byBhdCBsZWFzdCBvbmNlLiAgT24gQXUxNTUwL0F1MTIwMC9BdTEzMDAgdGhpcworICogcmVnaXN0ZXIgZW5hYmxlcyB1c2Ugb2YgR1BJT3MgYXMgd2FrZSBzb3VyY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhbGNoZW15X2dwaW8xX2lucHV0X2VuYWJsZSh2b2lkKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9ICh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMDAwX1NZU19QSFlTX0FERFIpOworCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgMHgxMTApOwkJLyogdGhlIHdyaXRlIG9wIGlzIGtleSAqLworCXdtYigpOworfQorCisKKy8qIExpbnV4IGdwaW8gZnJhbWV3b3JrIGludGVncmF0aW9uLgorKgorKiA0IHVzZSBjYXNlcyBvZiBBbGNoZW15IEdQSU9TOgorKigxKSBHUElPTElCPXksIEFMQ0hFTVlfR1BJT19JTkRJUkVDVD15OgorKglCb2FyZCBtdXN0IHJlZ2lzdGVyIGdwaW9jaGlwcy4KKyooMikgR1BJT0xJQj15LCBBTENIRU1ZX0dQSU9fSU5ESVJFQ1Q9bjoKKyoJQSBncGlvY2hpcCBmb3IgdGhlIDc1IEdQSU9zIGlzIHJlZ2lzdGVyZWQuCisqCisqKDMpIEdQSU9MSUI9biwgQUxDSEVNWV9HUElPX0lORElSRUNUPXk6CisqCXRoZSBib2FyZHMnIGdwaW8uaCBtdXN0IHByb3ZpZGUJdGhlIGxpbnV4IGdwaW8gd3JhcHBlciBmdW5jdGlvbnMsCisqCisqKDQpIEdQSU9MSUI9biwgQUxDSEVNWV9HUElPX0lORElSRUNUPW46CisqCWlubGluYWJsZSBncGlvIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgd2hpY2ggZW5hYmxlIGFjY2VzcyB0byB0aGUKKyoJQXUxMzAwIGdwaW9zIG9ubHkgYnkgdXNpbmcgdGhlIG51bWJlcnMgc3RyYWlnaHQgb3V0IG9mIHRoZSBkYXRhLQorKglzaGVldHMuCisKKyogQ2FzZXMgMSBhbmQgMyBhcmUgaW50ZW5kZWQgZm9yIGJvYXJkcyB3aGljaCB3YW50IHRvIHByb3ZpZGUgdGhlaXIgb3duCisqIEdQSU8gbmFtZXNwYWNlIGFuZCAtb3BlcmF0aW9ucyAoaS5lLiBmb3IgZXhhbXBsZSB5b3UgaGF2ZSA4IEdQSU9zCisqIHdoaWNoIGFyZSBpbiBwYXJ0IHByb3ZpZGVkIGJ5IHNwYXJlIEF1MTMwMCBHUElPIHBpbnMgYW5kIGluIHBhcnQgYnkKKyogYW4gZXh0ZXJuYWwgRlBHQSBidXQgeW91IHN0aWxsIHdhbnQgdGhlbSB0byBiZSBhY2Nzc2libGUgaW4gbGludXgKKyogYXMgZ3BpbzAtNy4gVGhlIGJvYXJkIGNhbiBvZiBjb3Vyc2UgdXNlIHRoZSBhbGNoZW15X2dwaW9YXyogZnVuY3Rpb25zCisqIGFzIHJlcXVpcmVkKS4KKyovCisKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCisvKiB3cmFwcyB0aGUgY3B1LWRlcGVuZGVudCBpcnFfdG9fZ3BpbyBmdW5jdGlvbnMgKi8KKy8qIEZJWE1FOiBncGlvbGliIG5lZWRzIGFuIGlycV90b19ncGlvIGhvb2sgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fYXVfaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKK3sKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwLi4uQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXR1cm4gYWxjaGVteV9pcnFfdG9fZ3BpbyhpcnEpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKiB1c2luZyBncGlvbGliIHRvIHByb3ZpZGUgdXAgdG8gMiBncGlvX2NoaXBzIGZvciBvbi1jaGlwIGdwaW9zICovCisjaWZuZGVmIENPTkZJR19BTENIRU1ZX0dQSU9fSU5ESVJFQ1QJLyogY2FzZSAoMikgKi8KKworLyogZ2V0IGV2ZXJ5dGhpbmcgdGhyb3VnaCBncGlvbGliICovCisjZGVmaW5lIGdwaW9fdG9faXJxCV9fZ3Bpb190b19pcnEKKyNkZWZpbmUgZ3Bpb19nZXRfdmFsdWUJX19ncGlvX2dldF92YWx1ZQorI2RlZmluZSBncGlvX3NldF92YWx1ZQlfX2dwaW9fc2V0X3ZhbHVlCisjZGVmaW5lIGdwaW9fY2Fuc2xlZXAJX19ncGlvX2NhbnNsZWVwCisjZGVmaW5lIGlycV90b19ncGlvCV9fYXVfaXJxX3RvX2dwaW8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKworI2VuZGlmCS8qICFDT05GSUdfQUxDSEVNWV9HUElPX0lORElSRUNUICovCisKKworI2VuZGlmCS8qIENPTkZJR19HUElPTElCICovCiAKICNlbmRpZgkvKiBfQUxDSEVNWV9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxMjAwLmgKaW5kZXggMzQwNDI0OC4uN2EzOTY1NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMTIwMC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaApAQCAtNDYsOCArNDYsNiBAQAogCiAjZGVmaW5lIElERV9QSFlTX0FERFIJCTB4MTg4MDAwMDAKICNkZWZpbmUgSURFX1JFR19TSElGVAkJNQotI2RlZmluZSBJREVfRERNQV9SRVEJCURTQ1JfQ01EMF9ETUFfUkVRMQotI2RlZmluZSBJREVfUlFTSVpFCQkxMjgKIAogI2RlZmluZSBEQjEyMDBfSURFX1BIWVNfQUREUglJREVfUEhZU19BRERSCiAjZGVmaW5lIERCMTIwMF9JREVfUEhZU19MRU4JKDE2IDw8IElERV9SRUdfU0hJRlQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxeDAwLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAvZGIxeDAwLmgKaW5kZXggYTkxOWRhYy4uYTVhZmZiMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMC9kYjF4MDAuaApAQCAtMzEsMTUgKzMxLDE1IEBACiAKICNpZmRlZiBDT05GSUdfTUlQU19EQjE1NTAKIAotI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JRFNDUl9DTUQwX1BTQzFfVFgKLSNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1JYCi0jZGVmaW5lIERCRE1BX0kyU19UWF9DSEFOCURTQ1JfQ01EMF9QU0MzX1RYCi0jZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCURTQ1JfQ01EMF9QU0MzX1JYCisjZGVmaW5lIERCRE1BX0FDOTdfVFhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzFfVFgKKyNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCUFVMTU1MF9EU0NSX0NNRDBfUFNDMV9SWAorI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzNfVFgKKyNkZWZpbmUgREJETUFfSTJTX1JYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1JYCiAKLSNkZWZpbmUgU1BJX1BTQ19CQVNFCQlQU0MwX0JBU0VfQUREUgotI2RlZmluZSBBQzk3X1BTQ19CQVNFCQlQU0MxX0JBU0VfQUREUgotI2RlZmluZSBTTUJVU19QU0NfQkFTRQkJUFNDMl9CQVNFX0FERFIKLSNkZWZpbmUgSTJTX1BTQ19CQVNFCQlQU0MzX0JBU0VfQUREUgorI2RlZmluZSBTUElfUFNDX0JBU0UJCUFVMTU1MF9QU0MwX1BIWVNfQUREUgorI2RlZmluZSBBQzk3X1BTQ19CQVNFCQlBVTE1NTBfUFNDMV9QSFlTX0FERFIKKyNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCUFVMTU1MF9QU0MyX1BIWVNfQUREUgorI2RlZmluZSBJMlNfUFNDX0JBU0UJCUFVMTU1MF9QU0MzX1BIWVNfQUREUgogCiAjZGVmaW5lIE5BTkRfUEhZU19BRERSCQkweDIwMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjEyMDAuaAppbmRleCBmY2U0MzMyLi4zNzQ0MTZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxMjAwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTIwMC5oCkBAIC0yOCwyMyArMjgsMjMgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaD4KIAotI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JRFNDUl9DTUQwX1BTQzFfVFgKLSNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1JYCi0jZGVmaW5lIERCRE1BX0kyU19UWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1RYCi0jZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1JYCisjZGVmaW5lIERCRE1BX0FDOTdfVFhfQ0hBTglBVTEyMDBfRFNDUl9DTUQwX1BTQzFfVFgKKyNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCUFVMTIwMF9EU0NSX0NNRDBfUFNDMV9SWAorI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglBVTEyMDBfRFNDUl9DTUQwX1BTQzFfVFgKKyNkZWZpbmUgREJETUFfSTJTX1JYX0NIQU4JQVUxMjAwX0RTQ1JfQ01EMF9QU0MxX1JYCiAKIC8qCiAgKiBTUEkgYW5kIFNNQiBhcmUgbXV4ZWQgb24gdGhlIFBiMTIwMCBib2FyZC4KICAqIFJlZmVyIHRvIGJvYXJkIGRvY3VtZW50YXRpb24uCiAgKi8KLSNkZWZpbmUgU1BJX1BTQ19CQVNFCQlQU0MwX0JBU0VfQUREUgotI2RlZmluZSBTTUJVU19QU0NfQkFTRQkJUFNDMF9CQVNFX0FERFIKKyNkZWZpbmUgU1BJX1BTQ19CQVNFCQlBVTE1NTBfUFNDMF9QSFlTX0FERFIKKyNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCUFVMTU1MF9QU0MwX1BIWVNfQUREUgogLyoKICAqIEFDOTcgYW5kIEkyUyBhcmUgbXV4ZWQgb24gdGhlIFBiMTIwMCBib2FyZC4KICAqIFJlZmVyIHRvIGJvYXJkIGRvY3VtZW50YXRpb24uCiAgKi8KLSNkZWZpbmUgQUM5N19QU0NfQkFTRSAgICAgICBQU0MxX0JBU0VfQUREUgotI2RlZmluZSBJMlNfUFNDX0JBU0UJUFNDMV9CQVNFX0FERFIKKyNkZWZpbmUgQUM5N19QU0NfQkFTRSAgICAgICBBVTE1NTBfUFNDMV9QSFlTX0FERFIKKyNkZWZpbmUgSTJTX1BTQ19CQVNFCUFVMTU1MF9QU0MxX1BIWVNfQUREUgogCiAKICNkZWZpbmUgQkNTUl9TWVNURU1fVkRESQkweDAwMUYKQEAgLTc2LDggKzc2LDYgQEAKICNkZWZpbmUgSURFX1JFR19TSElGVAkJNQogI2RlZmluZSBJREVfUEhZU19MRU4JCSgxNiA8PCBJREVfUkVHX1NISUZUKQogI2RlZmluZSBJREVfSU5UIAkJUEIxMjAwX0lERV9JTlQKLSNkZWZpbmUgSURFX0RETUFfUkVRCQlEU0NSX0NNRDBfRE1BX1JFUTEKLSNkZWZpbmUgSURFX1JRU0laRQkJMTI4CiAKICNkZWZpbmUgTkFORF9QSFlTX0FERFIgCTB4MUMwMDAwMDAKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oCmluZGV4IGY4MzVjODguLjQ0M2I4OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAvcGIxNTUwLmgKQEAgLTMwLDE1ICszMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9wc2MuaD4KIAotI2RlZmluZSBEQkRNQV9BQzk3X1RYX0NIQU4JRFNDUl9DTUQwX1BTQzFfVFgKLSNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCURTQ1JfQ01EMF9QU0MxX1JYCi0jZGVmaW5lIERCRE1BX0kyU19UWF9DSEFOCURTQ1JfQ01EMF9QU0MzX1RYCi0jZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOCURTQ1JfQ01EMF9QU0MzX1JYCisjZGVmaW5lIERCRE1BX0FDOTdfVFhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzFfVFgKKyNkZWZpbmUgREJETUFfQUM5N19SWF9DSEFOCUFVMTU1MF9EU0NSX0NNRDBfUFNDMV9SWAorI2RlZmluZSBEQkRNQV9JMlNfVFhfQ0hBTglBVTE1NTBfRFNDUl9DTUQwX1BTQzNfVFgKKyNkZWZpbmUgREJETUFfSTJTX1JYX0NIQU4JQVUxNTUwX0RTQ1JfQ01EMF9QU0MzX1JYCiAKLSNkZWZpbmUgU1BJX1BTQ19CQVNFCQlQU0MwX0JBU0VfQUREUgotI2RlZmluZSBBQzk3X1BTQ19CQVNFCQlQU0MxX0JBU0VfQUREUgotI2RlZmluZSBTTUJVU19QU0NfQkFTRQkJUFNDMl9CQVNFX0FERFIKLSNkZWZpbmUgSTJTX1BTQ19CQVNFCQlQU0MzX0JBU0VfQUREUgorI2RlZmluZSBTUElfUFNDX0JBU0UJCUFVMTU1MF9QU0MwX1BIWVNfQUREUgorI2RlZmluZSBBQzk3X1BTQ19CQVNFCQlBVTE1NTBfUFNDMV9QSFlTX0FERFIKKyNkZWZpbmUgU01CVVNfUFNDX0JBU0UJCUFVMTU1MF9QU0MyX1BIWVNfQUREUgorI2RlZmluZSBJMlNfUFNDX0JBU0UJCUFVMTU1MF9QU0MzX1BIWVNfQUREUgogCiAvKgogICogVGltaW5nIHZhbHVlcyBhcyBkZXNjcmliZWQgaW4gZGF0YWJvb2ssICogbnMgdmFsdWUgc3RyaXBwZWQgb2YKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcHJvbS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNwcm9tLmgKaW5kZXggMTQ2ZDQxYi4uZTkzOTQzZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNwcm9tLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNwcm9tLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fQVNNX01JUFNfUFJPTV9ICi0jZGVmaW5lIF9fQVNNX01JUFNfUFJPTV9ICisjaWZuZGVmIF9fQVNNX01JUFNQUk9NX0gKKyNkZWZpbmUgX19BU01fTUlQU1BST01fSAogCiAjZGVmaW5lIFBST01fUkVTRVQJCTAKICNkZWZpbmUgUFJPTV9FWEVDCQkxCkBAIC03Myw0ICs3Myw0IEBACiAKIGV4dGVybiBjaGFyICpwcm9tX2dldGVudihjaGFyICopOwogCi0jZW5kaWYgLyogX19BU01fTUlQU19QUk9NX0ggKi8KKyNlbmRpZiAvKiBfX0FTTV9NSVBTUFJPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCmluZGV4IDZhNmY4YTguLjJlYTdiODEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCkBAIC0xMDA2LDE4ICsxMDA2LDI2IEBACiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMCh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAwLCB2YWwpCiAjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIwKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMSkKICNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIwKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDEsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjBfNjQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCAxKQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjBfNjQodmFsKSBfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMSwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjdHJsMSgpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDIpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCAyLCB2YWwpCiAjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIxKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgMykKICNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIxKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDMsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjFfNjQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCAzKQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjFfNjQodmFsKSBfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgMywgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjdHJsMigpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDQpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMih2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA0LCB2YWwpCiAjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIyKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNSkKICNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIyKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDUsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjJfNjQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCA1KQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjJfNjQodmFsKSBfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgNSwgdmFsKQogI2RlZmluZSByZWFkX2MwX3BlcmZjdHJsMygpCV9fcmVhZF8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDYpCiAjZGVmaW5lIHdyaXRlX2MwX3BlcmZjdHJsMyh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDI1LCA2LCB2YWwpCiAjZGVmaW5lIHJlYWRfYzBfcGVyZmNudHIzKCkJX19yZWFkXzMyYml0X2MwX3JlZ2lzdGVyKCQyNSwgNykKICNkZWZpbmUgd3JpdGVfYzBfcGVyZmNudHIzKHZhbCkJX193cml0ZV8zMmJpdF9jMF9yZWdpc3RlcigkMjUsIDcsIHZhbCkKKyNkZWZpbmUgcmVhZF9jMF9wZXJmY250cjNfNjQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCA3KQorI2RlZmluZSB3cml0ZV9jMF9wZXJmY250cjNfNjQodmFsKSBfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNSwgNywgdmFsKQogCiAvKiBSTTkwMDAgUGVyZkNvdW50IHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXIgKi8KICNkZWZpbmUgcmVhZF9jMF9wZXJmY291bnQoKQlfX3JlYWRfNjRiaXRfYzBfcmVnaXN0ZXIoJDI1LCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9tLmgKaW5kZXggODU3ZDliNy4uN2E2ZTgyZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb20uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvbS5oCkBAIC04LDggKzgsOCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgogICovCi0jaWZuZGVmIF9fQVNNX01JUFNfUFJPTV9ICi0jZGVmaW5lIF9fQVNNX01JUFNfUFJPTV9ICisjaWZuZGVmIF9fQVNNX1BST01fSAorI2RlZmluZSBfX0FTTV9QUk9NX0gKIAogI2lmZGVmIENPTkZJR19PRgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMjUsNCArMjUsNCBAQAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV90cmVlX2luaXQodm9pZCkgeyB9CiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKLSNlbmRpZiAvKiBfQVNNX01JUFNfUFJPTV9IICovCisjZW5kaWYgLyogX19BU01fUFJPTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcmVnZGVmLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcmVnZGVmLmgKaW5kZXggN2M4ZWNiNi4uNzg1YTUxOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3JlZ2RlZi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9yZWdkZWYuaApAQCAtNiw2ICs2LDggQEAKICAqIENvcHlyaWdodCAoQykgMTk4NSBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KICAqIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk5LCAyMDAzIGJ5IFJhbGYgQmFlY2hsZQogICogQ29weXJpZ2h0IChDKSAxOTkwIC0gMTk5MiwgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgV2luZCBSaXZlciBTeXN0ZW1zLAorICogICB3cml0dGVuIGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KICAqLwogI2lmbmRlZiBfQVNNX1JFR0RFRl9ICiAjZGVmaW5lIF9BU01fUkVHREVGX0gKQEAgLTMwLDkgKzMyLDEzIEBACiAjZGVmaW5lIHQyICAgICAgJDEwCiAjZGVmaW5lIHQzICAgICAgJDExCiAjZGVmaW5lIHQ0ICAgICAgJDEyCisjZGVmaW5lIHRhMAkkMTIKICNkZWZpbmUgdDUgICAgICAkMTMKKyNkZWZpbmUgdGExCSQxMwogI2RlZmluZSB0NiAgICAgICQxNAorI2RlZmluZSB0YTIJJDE0CiAjZGVmaW5lIHQ3ICAgICAgJDE1CisjZGVmaW5lIHRhMwkkMTUKICNkZWZpbmUgczAgICAgICAkMTYgICAgIC8qIGNhbGxlZSBzYXZlZCAqLwogI2RlZmluZSBzMSAgICAgICQxNwogI2RlZmluZSBzMiAgICAgICQxOApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9ncGlvLmMgYi9hcmNoL21pcHMvano0NzQwL2dwaW8uYwppbmRleCA0Mzk3OTcyLi5lMWRkYjk1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvano0NzQwL2dwaW8uYworKysgYi9hcmNoL21pcHMvano0NzQwL2dwaW8uYwpAQCAtMTcsOCArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMzAsNiArMjgsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KIAorI2luY2x1ZGUgImlycS5oIgorCiAjZGVmaW5lIEpaNDc0MF9HUElPX0JBU0VfQSAoMzIqMCkKICNkZWZpbmUgSlo0NzQwX0dQSU9fQkFTRV9CICgzMioxKQogI2RlZmluZSBKWjQ3NDBfR1BJT19CQVNFX0MgKDMyKjIpCkBAIC03NywxNCArNzcsMTAgQEAKIHN0cnVjdCBqel9ncGlvX2NoaXAgewogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IGlycV9iYXNlOwotCXVpbnQzMl90IHdha2V1cDsKLQl1aW50MzJfdCBzdXNwZW5kX21hc2s7CiAJdWludDMyX3QgZWRnZV90cmlnZ2VyX2JvdGg7CiAKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAKLQlzcGlubG9ja190IGxvY2s7Ci0KIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKIH07CiAKQEAgLTEwMiw3ICs5OCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGp6X2dwaW9fY2hpcCAqaXJxX3RvX2p6X2dwaW9fY2hpcChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0JcmV0dXJuIGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXJldHVybiBnYy0+cHJpdmF0ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGp6X2dwaW9fd3JpdGVfYml0KHVuc2lnbmVkIGludCBncGlvLCB1bnNpZ25lZCBpbnQgcmVnKQpAQCAtMzA0LDIxICszMDEsMTUgQEAKIHsKIAl1aW50MzJfdCBmbGFnOwogCXVuc2lnbmVkIGludCBncGlvX2lycTsKLQl1bnNpZ25lZCBpbnQgZ3Bpb19iYW5rOwogCXN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwogCi0JZ3Bpb19iYW5rID0gSlo0NzQwX0lSUV9HUElPMCAtIGlycTsKLQogCWZsYWcgPSByZWFkbChjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fRkxBRyk7Ci0KIAlpZiAoIWZsYWcpCiAJCXJldHVybjsKIAotCWdwaW9faXJxID0gX19mbHMoZmxhZyk7CisJZ3Bpb19pcnEgPSBjaGlwLT5pcnFfYmFzZSArIF9fZmxzKGZsYWcpOwogCi0JanpfZ3Bpb19jaGVja190cmlnZ2VyX2JvdGgoY2hpcCwgaXJxKTsKLQotCWdwaW9faXJxICs9IChncGlvX2JhbmsgPDwgNSkgKyBKWjQ3NDBfSVJRX0dQSU8oMCk7CisJanpfZ3Bpb19jaGVja190cmlnZ2VyX2JvdGgoY2hpcCwgZ3Bpb19pcnEpOwogCiAJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9faXJxKTsKIH07CkBAIC0zMjksMTggKzMyMCwxMiBAQAogCXdyaXRlbChJUlFfVE9fQklUKGRhdGEtPmlycSksIGNoaXAtPmJhc2UgKyByZWcpOwogfQogCi1zdGF0aWMgdm9pZCBqel9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlqel9ncGlvX3NldF9pcnFfYml0KGRhdGEsIEpaX1JFR19HUElPX01BU0tfU0VUKTsKLX07Ci0KIHN0YXRpYyB2b2lkIGp6X2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCA9IGlycV90b19qel9ncGlvX2NoaXAoZGF0YSk7CiAKIAlqel9ncGlvX2NoZWNrX3RyaWdnZXJfYm90aChjaGlwLCBkYXRhLT5pcnEpOwotCi0JanpfZ3Bpb19zZXRfaXJxX2JpdChkYXRhLCBKWl9SRUdfR1BJT19NQVNLX0NMRUFSKTsKKwlpcnFfZ2NfdW5tYXNrX2VuYWJsZV9yZWcoZGF0YSk7CiB9OwogCiAvKiBUT0RPOiBDaGVjayBpZiBmdW5jdGlvbiBpcyBncGlvICovCkBAIC0zNTMsMTggKzMzOCwxMyBAQAogCiBzdGF0aWMgdm9pZCBqel9ncGlvX2lycV9zaHV0ZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0JanpfZ3Bpb19pcnFfbWFzayhkYXRhKTsKKwlpcnFfZ2NfbWFza19kaXNhYmxlX3JlZyhkYXRhKTsKIAogCS8qIFNldCBkaXJlY3Rpb24gdG8gaW5wdXQgKi8KIAlqel9ncGlvX3NldF9pcnFfYml0KGRhdGEsIEpaX1JFR19HUElPX0RJUkVDVElPTl9DTEVBUik7CiAJanpfZ3Bpb19zZXRfaXJxX2JpdChkYXRhLCBKWl9SRUdfR1BJT19TRUxFQ1RfQ0xFQVIpOwogfQogCi1zdGF0aWMgdm9pZCBqel9ncGlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCWp6X2dwaW9fc2V0X2lycV9iaXQoZGF0YSwgSlpfUkVHX0dQSU9fRkxBR19DTEVBUik7Ci19OwotCiBzdGF0aWMgaW50IGp6X2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKIHsKIAlzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwID0gaXJxX3RvX2p6X2dwaW9fY2hpcChkYXRhKTsKQEAgLTQwOCwzNSArMzg4LDEzIEBACiBzdGF0aWMgaW50IGp6X2dwaW9faXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQogewogCXN0cnVjdCBqel9ncGlvX2NoaXAgKmNoaXAgPSBpcnFfdG9fanpfZ3Bpb19jaGlwKGRhdGEpOwotCXNwaW5fbG9jaygmY2hpcC0+bG9jayk7Ci0JaWYgKG9uKQotCQljaGlwLT53YWtldXAgfD0gSVJRX1RPX0JJVChkYXRhLT5pcnEpOwotCWVsc2UKLQkJY2hpcC0+d2FrZXVwICY9IH5JUlFfVE9fQklUKGRhdGEtPmlycSk7Ci0Jc3Bpbl91bmxvY2soJmNoaXAtPmxvY2spOwogCisJaXJxX2djX3NldF93YWtlKGRhdGEsIG9uKTsKIAlpcnFfc2V0X2lycV93YWtlKGNoaXAtPmlycSwgb24pOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAganpfZ3Bpb19pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJHUElPIiwKLQkuaXJxX21hc2sgPSBqel9ncGlvX2lycV9tYXNrLAotCS5pcnFfdW5tYXNrID0ganpfZ3Bpb19pcnFfdW5tYXNrLAotCS5pcnFfYWNrID0ganpfZ3Bpb19pcnFfYWNrLAotCS5pcnFfc3RhcnR1cCA9IGp6X2dwaW9faXJxX3N0YXJ0dXAsCi0JLmlycV9zaHV0ZG93biA9IGp6X2dwaW9faXJxX3NodXRkb3duLAotCS5pcnFfc2V0X3R5cGUgPSBqel9ncGlvX2lycV9zZXRfdHlwZSwKLQkuaXJxX3NldF93YWtlID0ganpfZ3Bpb19pcnFfc2V0X3dha2UsCi0JLmZsYWdzID0gSVJRQ0hJUF9TRVRfVFlQRV9NQVNLRUQsCi19OwotCi0vKgotICogVGhpcyBsb2NrIGNsYXNzIHRlbGxzIGxvY2tkZXAgdGhhdCBHUElPIGlycXMgYXJlIGluIGEgZGlmZmVyZW50Ci0gKiBjYXRlZ29yeSB0aGFuIHRoZWlyIHBhcmVudHMsIHNvIGl0IHdvbid0IHJlcG9ydCBmYWxzZSByZWN1cnNpb24uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZ3Bpb19sb2NrX2NsYXNzOwotCiAjZGVmaW5lIEpaNDc0MF9HUElPX0NISVAoX2JhbmspIHsgXAogCS5pcnFfYmFzZSA9IEpaNDc0MF9JUlFfR1BJT19CQVNFXyAjIyBfYmFuaywgXAogCS5ncGlvX2NoaXAgPSB7IFwKQEAgLTQ1OCw2NCArNDE2LDQ0IEBACiAJSlo0NzQwX0dQSU9fQ0hJUChEKSwKIH07CiAKLXN0YXRpYyB2b2lkIGp6NDc0MF9ncGlvX3N1c3BlbmRfY2hpcChzdHJ1Y3QganpfZ3Bpb19jaGlwICpjaGlwKQotewotCWNoaXAtPnN1c3BlbmRfbWFzayA9IHJlYWRsKGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLKTsKLQl3cml0ZWwofihjaGlwLT53YWtldXApLCBjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fTUFTS19TRVQpOwotCXdyaXRlbChjaGlwLT53YWtldXAsIGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLX0NMRUFSKTsKLX0KLQotc3RhdGljIGludCBqejQ3NDBfZ3Bpb19zdXNwZW5kKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShqejQ3NDBfZ3Bpb19jaGlwcyk7IGkrKykKLQkJano0NzQwX2dwaW9fc3VzcGVuZF9jaGlwKCZqejQ3NDBfZ3Bpb19jaGlwc1tpXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgano0NzQwX2dwaW9fcmVzdW1lX2NoaXAoc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCkKLXsKLQl1aW50MzJfdCBtYXNrID0gY2hpcC0+c3VzcGVuZF9tYXNrOwotCi0Jd3JpdGVsKH5tYXNrLCBjaGlwLT5iYXNlICsgSlpfUkVHX0dQSU9fTUFTS19DTEVBUik7Ci0Jd3JpdGVsKG1hc2ssIGNoaXAtPmJhc2UgKyBKWl9SRUdfR1BJT19NQVNLX1NFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGp6NDc0MF9ncGlvX3Jlc3VtZSh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gQVJSQVlfU0laRShqejQ3NDBfZ3Bpb19jaGlwcykgLSAxOyBpID49IDAgOyBpLS0pCi0JCWp6NDc0MF9ncGlvX3Jlc3VtZV9jaGlwKCZqejQ3NDBfZ3Bpb19jaGlwc1tpXSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgano0NzQwX2dwaW9fc3lzY29yZV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBqejQ3NDBfZ3Bpb19zdXNwZW5kLAotCS5yZXN1bWUgPSBqejQ3NDBfZ3Bpb19yZXN1bWUsCi19OwotCiBzdGF0aWMgdm9pZCBqejQ3NDBfZ3Bpb19jaGlwX2luaXQoc3RydWN0IGp6X2dwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGlkKQogewotCWludCBpcnE7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKIAogCWNoaXAtPmJhc2UgPSBpb3JlbWFwKEpaNDc0MF9HUElPX0JBU0VfQUREUiArIChpZCAqIDB4MTAwKSwgMHgxMDApOwogCi0JZ3Bpb2NoaXBfYWRkKCZjaGlwLT5ncGlvX2NoaXApOwotCiAJY2hpcC0+aXJxID0gSlo0NzQwX0lSUV9JTlRDX0dQSU8oaWQpOwogCWlycV9zZXRfaGFuZGxlcl9kYXRhKGNoaXAtPmlycSwgY2hpcCk7CiAJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoY2hpcC0+aXJxLCBqel9ncGlvX2lycV9kZW11eF9oYW5kbGVyKTsKIAotCWZvciAoaXJxID0gY2hpcC0+aXJxX2Jhc2U7IGlycSA8IGNoaXAtPmlycV9iYXNlICsgY2hpcC0+Z3Bpb19jaGlwLm5ncGlvOyArK2lycSkgewotCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaXJxLCAmZ3Bpb19sb2NrX2NsYXNzKTsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBjaGlwKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmp6X2dwaW9faXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9CisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKGNoaXAtPmdwaW9fY2hpcC5sYWJlbCwgMSwgY2hpcC0+aXJxX2Jhc2UsCisJCWNoaXAtPmJhc2UsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJZ2MtPndha2VfZW5hYmxlZCA9IElSUV9NU0soY2hpcC0+Z3Bpb19jaGlwLm5ncGlvKTsKKwlnYy0+cHJpdmF0ZSA9IGNoaXA7CisKKwljdCA9IGdjLT5jaGlwX3R5cGVzOworCWN0LT5yZWdzLmVuYWJsZSA9IEpaX1JFR19HUElPX01BU0tfQ0xFQVI7CisJY3QtPnJlZ3MuZGlzYWJsZSA9IEpaX1JFR19HUElPX01BU0tfU0VUOworCWN0LT5yZWdzLmFjayA9IEpaX1JFR19HUElPX0ZMQUdfQ0xFQVI7CisKKwljdC0+Y2hpcC5uYW1lID0gIkdQSU8iOworCWN0LT5jaGlwLmlycV9tYXNrID0gaXJxX2djX21hc2tfZGlzYWJsZV9yZWc7CisJY3QtPmNoaXAuaXJxX3VubWFzayA9IGp6X2dwaW9faXJxX3VubWFzazsKKwljdC0+Y2hpcC5pcnFfYWNrID0gaXJxX2djX2Fja19zZXRfYml0OworCWN0LT5jaGlwLmlycV9zdXNwZW5kID0gano0NzQwX2lycV9zdXNwZW5kOworCWN0LT5jaGlwLmlycV9yZXN1bWUgPSBqejQ3NDBfaXJxX3Jlc3VtZTsKKwljdC0+Y2hpcC5pcnFfc3RhcnR1cCA9IGp6X2dwaW9faXJxX3N0YXJ0dXA7CisJY3QtPmNoaXAuaXJxX3NodXRkb3duID0ganpfZ3Bpb19pcnFfc2h1dGRvd247CisJY3QtPmNoaXAuaXJxX3NldF90eXBlID0ganpfZ3Bpb19pcnFfc2V0X3R5cGU7CisJY3QtPmNoaXAuaXJxX3NldF93YWtlID0ganpfZ3Bpb19pcnFfc2V0X3dha2U7CisJY3QtPmNoaXAuZmxhZ3MgPSBJUlFDSElQX1NFVF9UWVBFX01BU0tFRDsKKworCWlycV9zZXR1cF9nZW5lcmljX2NoaXAoZ2MsIElSUV9NU0soY2hpcC0+Z3Bpb19jaGlwLm5ncGlvKSwKKwkJSVJRX0dDX0lOSVRfTkVTVEVEX0xPQ0ssIDAsIElSUV9OT1BST0JFIHwgSVJRX0xFVkVMKTsKKworCWdwaW9jaGlwX2FkZCgmY2hpcC0+Z3Bpb19jaGlwKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgano0NzQwX2dwaW9faW5pdCh2b2lkKQpAQCAtNTI1LDggKzQ2Myw2IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoano0NzQwX2dwaW9fY2hpcHMpOyArK2kpCiAJCWp6NDc0MF9ncGlvX2NoaXBfaW5pdCgmano0NzQwX2dwaW9fY2hpcHNbaV0sIGkpOwogCi0JcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmp6NDc0MF9ncGlvX3N5c2NvcmVfb3BzKTsKLQogCXByaW50ayhLRVJOX0lORk8gIkpaNDc0MCBHUElPIGluaXRpYWxpemVkXG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9pcnEuYyBiL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmMKaW5kZXggZDgyYzBjNC4uZmM1N2RlZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2p6NDc0MC9pcnEuYworKysgYi9hcmNoL21pcHMvano0NzQwL2lycS5jCkBAIC0zMiw4ICszMiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2Jhc2UuaD4KIAogc3RhdGljIHZvaWQgX19pb21lbSAqanpfaW50Y19iYXNlOwotc3RhdGljIHVpbnQzMl90IGp6X2ludGNfd2FrZXVwOwotc3RhdGljIHVpbnQzMl90IGp6X2ludGNfc2F2ZWQ7CiAKICNkZWZpbmUgSlpfUkVHX0lOVENfU1RBVFVTCTB4MDAKICNkZWZpbmUgSlpfUkVHX0lOVENfTUFTSwkweDA0CkBAIC00MSw0MSArMzksNiBAQAogI2RlZmluZSBKWl9SRUdfSU5UQ19DTEVBUl9NQVNLCTB4MGMKICNkZWZpbmUgSlpfUkVHX0lOVENfUEVORElORwkweDEwCiAKLSNkZWZpbmUgSVJRX0JJVCh4KSBCSVQoKHgpIC0gSlo0NzQwX0lSUV9CQVNFKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW50Y19pcnFfYml0KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGNfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jd3JpdGVsKGludGNfaXJxX2JpdChkYXRhKSwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfQ0xFQVJfTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGNfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXdyaXRlbChpbnRjX2lycV9iaXQoZGF0YSksIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX1NFVF9NQVNLKTsKLX0KLQotc3RhdGljIGludCBpbnRjX2lycV9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKLXsKLQlpZiAob24pCi0JCWp6X2ludGNfd2FrZXVwIHw9IGludGNfaXJxX2JpdChkYXRhKTsKLQllbHNlCi0JCWp6X2ludGNfd2FrZXVwICY9IH5pbnRjX2lycV9iaXQoZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpbnRjX2lycV90eXBlID0gewotCS5uYW1lID0JCSJJTlRDIiwKLQkuaXJxX21hc2sgPQlpbnRjX2lycV9tYXNrLAotCS5pcnFfbWFza19hY2sgPQlpbnRjX2lycV9tYXNrLAotCS5pcnFfdW5tYXNrID0JaW50Y19pcnFfdW5tYXNrLAotCS5pcnFfc2V0X3dha2UgPQlpbnRjX2lycV9zZXRfd2FrZSwKLX07Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBqejQ3NDBfY2FzY2FkZShpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXVpbnQzMl90IGlycV9yZWc7CkBAIC04OCw2ICs1MSwyNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIHZvaWQgano0NzQwX2lycV9zZXRfbWFzayhzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsIHVpbnQzMl90IG1hc2spCit7CisJc3RydWN0IGlycV9jaGlwX3JlZ3MgKnJlZ3MgPSAmZ2MtPmNoaXBfdHlwZXMtPnJlZ3M7CisKKwl3cml0ZWwobWFzaywgZ2MtPnJlZ19iYXNlICsgcmVncy0+ZW5hYmxlKTsKKwl3cml0ZWwofm1hc2ssIGdjLT5yZWdfYmFzZSArIHJlZ3MtPmRpc2FibGUpOworfQorCit2b2lkIGp6NDc0MF9pcnFfc3VzcGVuZChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJano0NzQwX2lycV9zZXRfbWFzayhnYywgZ2MtPndha2VfYWN0aXZlKTsKK30KKwordm9pZCBqejQ3NDBfaXJxX3Jlc3VtZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJano0NzQwX2lycV9zZXRfbWFzayhnYywgZ2MtPm1hc2tfY2FjaGUpOworfQorCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBqejQ3NDBfY2FzY2FkZV9hY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBqejQ3NDBfY2FzY2FkZSwKIAkubmFtZSA9ICJKWjQ3NDAgY2FzY2FkZSBpbnRlcnJ1cHQiLApAQCAtOTUsNyArNzgsOSBAQAogCiB2b2lkIF9faW5pdCBhcmNoX2luaXRfaXJxKHZvaWQpCiB7Ci0JaW50IGk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKKwogCW1pcHNfY3B1X2lycV9pbml0KCk7CiAKIAlqel9pbnRjX2Jhc2UgPSBpb3JlbWFwKEpaNDc0MF9JTlRDX0JBU0VfQUREUiwgMHgxNCk7CkBAIC0xMDMsMTAgKzg4LDIyIEBACiAJLyogTWFzayBhbGwgaXJxcyAqLwogCXdyaXRlbCgweGZmZmZmZmZmLCBqel9pbnRjX2Jhc2UgKyBKWl9SRUdfSU5UQ19TRVRfTUFTSyk7CiAKLQlmb3IgKGkgPSBKWjQ3NDBfSVJRX0JBU0U7IGkgPCBKWjQ3NDBfSVJRX0JBU0UgKyAzMjsgaSsrKSB7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGksICh2b2lkICopSVJRX0JJVChpKSk7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpLCAmaW50Y19pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfQorCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgiSU5UQyIsIDEsIEpaNDc0MF9JUlFfQkFTRSwganpfaW50Y19iYXNlLAorCQloYW5kbGVfbGV2ZWxfaXJxKTsKKworCWdjLT53YWtlX2VuYWJsZWQgPSBJUlFfTVNLKDMyKTsKKworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisJY3QtPnJlZ3MuZW5hYmxlID0gSlpfUkVHX0lOVENfQ0xFQVJfTUFTSzsKKwljdC0+cmVncy5kaXNhYmxlID0gSlpfUkVHX0lOVENfU0VUX01BU0s7CisJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlycV9nY191bm1hc2tfZW5hYmxlX3JlZzsKKwljdC0+Y2hpcC5pcnFfbWFzayA9IGlycV9nY19tYXNrX2Rpc2FibGVfcmVnOworCWN0LT5jaGlwLmlycV9tYXNrX2FjayA9IGlycV9nY19tYXNrX2Rpc2FibGVfcmVnOworCWN0LT5jaGlwLmlycV9zZXRfd2FrZSA9IGlycV9nY19zZXRfd2FrZTsKKwljdC0+Y2hpcC5pcnFfc3VzcGVuZCA9IGp6NDc0MF9pcnFfc3VzcGVuZDsKKwljdC0+Y2hpcC5pcnFfcmVzdW1lID0gano0NzQwX2lycV9yZXN1bWU7CisKKwlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKDMyKSwgMCwgMCwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwpOwogCiAJc2V0dXBfaXJxKDIsICZqejQ3NDBfY2FzY2FkZV9hY3Rpb24pOwogfQpAQCAtMTIyLDE5ICsxMTksNiBAQAogCQlzcHVyaW91c19pbnRlcnJ1cHQoKTsKIH0KIAotdm9pZCBqejQ3NDBfaW50Y19zdXNwZW5kKHZvaWQpCi17Ci0JanpfaW50Y19zYXZlZCA9IHJlYWRsKGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX01BU0spOwotCXdyaXRlbCh+anpfaW50Y193YWtldXAsIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX1NFVF9NQVNLKTsKLQl3cml0ZWwoanpfaW50Y193YWtldXAsIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX0NMRUFSX01BU0spOwotfQotCi12b2lkIGp6NDc0MF9pbnRjX3Jlc3VtZSh2b2lkKQotewotCXdyaXRlbCh+anpfaW50Y19zYXZlZCwganpfaW50Y19iYXNlICsgSlpfUkVHX0lOVENfQ0xFQVJfTUFTSyk7Ci0Jd3JpdGVsKGp6X2ludGNfc2F2ZWQsIGp6X2ludGNfYmFzZSArIEpaX1JFR19JTlRDX1NFVF9NQVNLKTsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50Y19zZXFfcmVnKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3QgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmggYi9hcmNoL21pcHMvano0NzQwL2lycS5oCmluZGV4IDU2YjVlYWQuLmY3NWUzOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qejQ3NDAvaXJxLmgKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9pcnEuaApAQCAtMTUsNyArMTUsOSBAQAogI2lmbmRlZiBfX01JUFNfSlo0NzQwX0lSUV9IX18KICNkZWZpbmUgX19NSVBTX0paNDc0MF9JUlFfSF9fCiAKLWV4dGVybiB2b2lkIGp6NDc0MF9pbnRjX3N1c3BlbmQodm9pZCk7Ci1leHRlcm4gdm9pZCBqejQ3NDBfaW50Y19yZXN1bWUodm9pZCk7CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKK2V4dGVybiB2b2lkIGp6NDc0MF9pcnFfc3VzcGVuZChzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpOworZXh0ZXJuIHZvaWQgano0NzQwX2lycV9yZXN1bWUoc3RydWN0IGlycV9kYXRhICpkYXRhKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvano0NzQwL3BtLmMgYi9hcmNoL21pcHMvano0NzQwL3BtLmMKaW5kZXggOTAyZDViNS4uNjc0NGZhNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2p6NDc0MC9wbS5jCisrKyBiL2FyY2gvbWlwcy9qejQ3NDAvcG0uYwpAQCAtMjEsMTEgKzIxLDkgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvY2xvY2suaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCi0jaW5jbHVkZSAiaXJxLmgiCiAKIHN0YXRpYyBpbnQgano0NzQwX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKLQlqejQ3NDBfaW50Y19zdXNwZW5kKCk7CiAJano0NzQwX2Nsb2NrX3N1c3BlbmQoKTsKIAogCWp6NDc0MF9jbG9ja19zZXRfd2FpdF9tb2RlKEpaNDc0MF9XQUlUX01PREVfU0xFRVApOwpAQCAtMzcsNyArMzUsNiBAQAogCWp6NDc0MF9jbG9ja19zZXRfd2FpdF9tb2RlKEpaNDc0MF9XQUlUX01PREVfSURMRSk7CiAKIAlqejQ3NDBfY2xvY2tfcmVzdW1lKCk7Ci0Jano0NzQwX2ludGNfcmVzdW1lKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvODI1MC1wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2tlcm5lbC84MjUwLXBsYXRmb3JtLmMKaW5kZXggY2JmM2ZlMi4uNWM2YjJhYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC84MjUwLXBsYXRmb3JtLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC84MjUwLXBsYXRmb3JtLmMKQEAgLTUsNyArNSw2IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQppbmRleCA4M2JiYTMzLi4xYTk2NjE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKQEAgLTExLDYgKzExLDggQEAKIGlmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKIENGTEFHU19SRU1PVkVfZnRyYWNlLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfZWFybHlfcHJpbnRrLm8gPSAtcGcKK0NGTEFHU19SRU1PVkVfcGVyZl9ldmVudC5vID0gLXBnCitDRkxBR1NfUkVNT1ZFX3BlcmZfZXZlbnRfbWlwc3h4Lm8gPSAtcGcKIGVuZGlmCiAKIG9iai0kKENPTkZJR19DRVZUX0JDTTE0ODApCSs9IGNldnQtYmNtMTQ4MC5vCkBAIC0xMDYsNyArMTA4LDggQEAKIAogb2JqLSQoQ09ORklHX01JUFNfQ1BVRlJFUSkJKz0gY3B1ZnJlcS8KIAotb2JqLSQoQ09ORklHX0hXX1BFUkZfRVZFTlRTKQkrPSBwZXJmX2V2ZW50Lm8KK29iai0kKENPTkZJR19QRVJGX0VWRU5UUykJKz0gcGVyZl9ldmVudC5vCitvYmotJChDT05GSUdfSFdfUEVSRl9FVkVOVFMpCSs9IHBlcmZfZXZlbnRfbWlwc3h4Lm8KIAogb2JqLSQoQ09ORklHX0pVTVBfTEFCRUwpCSs9IGp1bXBfbGFiZWwubwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCBlYmMwY2QyLi5jN2QzY2YxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9idWdzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vd2F0Y2guaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3NwcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtOTc4LDcgKzk3OSwxMCBAQAogcGxhdGZvcm06CiAJCXNldF9lbGZfcGxhdGZvcm0oY3B1LCAib2N0ZW9uIik7CiAJCWJyZWFrOworCWNhc2UgUFJJRF9JTVBfQ0FWSVVNX0NONjFYWDoKIAljYXNlIFBSSURfSU1QX0NBVklVTV9DTjYzWFg6CisJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ042NlhYOgorCWNhc2UgUFJJRF9JTVBfQ0FWSVVNX0NONjhYWDoKIAkJYy0+Y3B1dHlwZSA9IENQVV9DQVZJVU1fT0NURU9OMjsKIAkJX19jcHVfbmFtZVtjcHVdID0gIkNhdml1bSBPY3Rlb24gSUkiOwogCQlzZXRfZWxmX3BsYXRmb3JtKGNwdSwgIm9jdGVvbjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTMuYwppbmRleCBiZTRlZTdkLi43MDQ3YmZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjUzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1My5jCkBAIC00LDcgKzQsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL21pcHMva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDZkNmNhNTMuLjVmOWE3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jCmluZGV4IDBjNmFmZWUuLjE0YWM1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYwpAQCAtOSw3ICs5LDYgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDA2IFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwppbmRleCBiNTM5NzBkLi43ZjUwMzE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLW10LmMKaW5kZXggNTk0Y2E2OS4uYzIzZDExZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLW10LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLW10LmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21pcHNfa3N5bXMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCmluZGV4IDFkMDQ4MDcuLjU3YmExM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwc19rc3ltcy5jCkBAIC05LDcgKzksNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYwppbmRleCA0YjkzMGFjLi5hNTA2NmIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDBhZWU5NDQuLmMxY2Y5YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xNCw1MzMgKzE0LDE2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPiAvKiBGb3IgcGVyZl9pcnEgKi8KLQotLyogVGhlc2UgYXJlIGZvciAzMmJpdCBjb3VudGVycy4gRm9yIDY0Yml0IG9uZXMsIGRlZmluZSB0aGVtIGFjY29yZGluZ2x5LiAqLwotI2RlZmluZSBNQVhfUEVSSU9ECSgoMVVMTCA8PCAzMikgLSAxKQotI2RlZmluZSBWQUxJRF9DT1VOVAkweDdmZmZmZmZmCi0jZGVmaW5lIFRPVEFMX0JJVFMJMzIKLSNkZWZpbmUgSElHSEVTVF9CSVQJMzEKLQotI2RlZmluZSBNSVBTX01BWF9IV0VWRU5UUyA0Ci0KLXN0cnVjdCBjcHVfaHdfZXZlbnRzIHsKLQkvKiBBcnJheSBvZiBldmVudHMgb24gdGhpcyBjcHUuICovCi0Jc3RydWN0IHBlcmZfZXZlbnQJKmV2ZW50c1tNSVBTX01BWF9IV0VWRU5UU107Ci0KLQkvKgotCSAqIFNldCB0aGUgYml0IChpbmRleGVkIGJ5IHRoZSBjb3VudGVyIG51bWJlcikgd2hlbiB0aGUgY291bnRlcgotCSAqIGlzIHVzZWQgZm9yIGFuIGV2ZW50LgotCSAqLwotCXVuc2lnbmVkIGxvbmcJCXVzZWRfbWFza1tCSVRTX1RPX0xPTkdTKE1JUFNfTUFYX0hXRVZFTlRTKV07Ci0KLQkvKgotCSAqIFRoZSBib3Jyb3dlZCBNU0IgZm9yIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyLiBBIE1JUFMgcGVyZm9ybWFuY2UKLQkgKiBjb3VudGVyIHVzZXMgaXRzIGJpdCAzMSAoZm9yIDMyYml0IGNvdW50ZXJzKSBvciBiaXQgNjMgKGZvciA2NGJpdAotCSAqIGNvdW50ZXJzKSBhcyBhIGZhY3RvciBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgY291bnRlciBvdmVyZmxvdwotCSAqIHNob3VsZCBiZSBzaWduYWxlZC4gU28gaGVyZSB3ZSB1c2UgYSBzZXBhcmF0ZSBNU0IgZm9yIGVhY2gKLQkgKiBjb3VudGVyIHRvIG1ha2UgdGhpbmdzIGVhc3kuCi0JICovCi0JdW5zaWduZWQgbG9uZwkJbXNic1tCSVRTX1RPX0xPTkdTKE1JUFNfTUFYX0hXRVZFTlRTKV07Ci0KLQkvKgotCSAqIFNvZnR3YXJlIGNvcHkgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGVhY2ggcGVyZm9ybWFuY2UgY291bnRlci4KLQkgKiBNSVBTIENQVXMgdmFyeSBpbiBwZXJmb3JtYW5jZSBjb3VudGVycy4gVGhleSB1c2UgdGhpcyBkaWZmZXJlbnRseSwKLQkgKiBhbmQgZXZlbiBtYXkgbm90IHVzZSBpdC4KLQkgKi8KLQl1bnNpZ25lZCBpbnQJCXNhdmVkX2N0cmxbTUlQU19NQVhfSFdFVkVOVFNdOwotfTsKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfZXZlbnRzLCBjcHVfaHdfZXZlbnRzKSA9IHsKLQkuc2F2ZWRfY3RybCA9IHswfSwKLX07Ci0KLS8qIFRoZSBkZXNjcmlwdGlvbiBvZiBNSVBTIHBlcmZvcm1hbmNlIGV2ZW50cy4gKi8KLXN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgewotCXVuc2lnbmVkIGludCBldmVudF9pZDsKLQkvKgotCSAqIE1JUFMgcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIGluZGV4ZWQgc3RhcnRpbmcgZnJvbSAwLgotCSAqIENOVFJfRVZFTiBpbmRpY2F0ZXMgdGhlIGluZGV4ZXMgb2YgdGhlIGNvdW50ZXJzIHRvIGJlIHVzZWQgYXJlCi0JICogZXZlbiBudW1iZXJzLgotCSAqLwotCXVuc2lnbmVkIGludCBjbnRyX21hc2s7Ci0JI2RlZmluZSBDTlRSX0VWRU4JMHg1NTU1NTU1NQotCSNkZWZpbmUgQ05UUl9PREQJMHhhYWFhYWFhYQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotCWVudW0gewotCQlUICA9IDAsCi0JCVYgID0gMSwKLQkJUCAgPSAyLAotCX0gcmFuZ2U7Ci0jZWxzZQotCSNkZWZpbmUgVAotCSNkZWZpbmUgVgotCSNkZWZpbmUgUAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IG1pcHNfcGVyZl9ldmVudCByYXdfZXZlbnQ7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHJhd19ldmVudF9tdXRleCk7Ci0KLSNkZWZpbmUgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCAweGZmZmZmZmZmCi0jZGVmaW5lIEMoeCkgUEVSRl9DT1VOVF9IV19DQUNIRV8jI3gKLQotc3RydWN0IG1pcHNfcG11IHsKLQljb25zdCBjaGFyCSpuYW1lOwotCWludAkJaXJxOwotCWlycXJldHVybl90CSgqaGFuZGxlX2lycSkoaW50IGlycSwgdm9pZCAqZGV2KTsKLQlpbnQJCSgqaGFuZGxlX3NoYXJlZF9pcnEpKHZvaWQpOwotCXZvaWQJCSgqc3RhcnQpKHZvaWQpOwotCXZvaWQJCSgqc3RvcCkodm9pZCk7Ci0JaW50CQkoKmFsbG9jX2NvdW50ZXIpKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAotCQkJCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjKTsKLQl1NjQJCSgqcmVhZF9jb3VudGVyKSh1bnNpZ25lZCBpbnQgaWR4KTsKLQl2b2lkCQkoKndyaXRlX2NvdW50ZXIpKHVuc2lnbmVkIGludCBpZHgsIHU2NCB2YWwpOwotCXZvaWQJCSgqZW5hYmxlX2V2ZW50KShzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KTsKLQl2b2lkCQkoKmRpc2FibGVfZXZlbnQpKGludCBpZHgpOwotCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKigqbWFwX3Jhd19ldmVudCkodTY0IGNvbmZpZyk7Ci0JY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAoKmdlbmVyYWxfZXZlbnRfbWFwKVtQRVJGX0NPVU5UX0hXX01BWF07Ci0JY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAoKmNhY2hlX2V2ZW50X21hcCkKLQkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCi0JCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQotCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOwotCXVuc2lnbmVkIGludAludW1fY291bnRlcnM7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcG11ICptaXBzcG11OwotCi1zdGF0aWMgaW50Ci1taXBzcG11X2V2ZW50X3NldF9wZXJpb2Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YywKLQkJCWludCBpZHgpCi17Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQlzNjQgbGVmdCA9IGxvY2FsNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7Ci0JczY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKLQlpbnQgcmV0ID0gMDsKLQl1NjQgdWxlZnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICh1bmxpa2VseShsZWZ0IDw9IC1wZXJpb2QpKSB7Ci0JCWxlZnQgPSBwZXJpb2Q7Ci0JCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKLQkJaHdjLT5sYXN0X3BlcmlvZCA9IHBlcmlvZDsKLQkJcmV0ID0gMTsKLQl9Ci0KLQlpZiAodW5saWtlbHkobGVmdCA8PSAwKSkgewotCQlsZWZ0ICs9IHBlcmlvZDsKLQkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOwotCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOwotCQlyZXQgPSAxOwotCX0KLQotCWlmIChsZWZ0ID4gKHM2NClNQVhfUEVSSU9EKQotCQlsZWZ0ID0gTUFYX1BFUklPRDsKLQotCWxvY2FsNjRfc2V0KCZod2MtPnByZXZfY291bnQsICh1NjQpLWxlZnQpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXVsZWZ0ID0gKHU2NCkoLWxlZnQpICYgTUFYX1BFUklPRDsKLQl1bGVmdCA+IFZBTElEX0NPVU5UID8KLQkJc2V0X2JpdChpZHgsIGNwdWMtPm1zYnMpIDogY2xlYXJfYml0KGlkeCwgY3B1Yy0+bXNicyk7Ci0JbWlwc3BtdS0+d3JpdGVfY291bnRlcihpZHgsICh1NjQpKC1sZWZ0KSAmIFZBTElEX0NPVU5UKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtaXBzcG11X2V2ZW50X3VwZGF0ZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAotCQkJaW50IGlkeCkKLXsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHNoaWZ0ID0gNjQgLSBUT1RBTF9CSVRTOwotCXM2NCBwcmV2X3Jhd19jb3VudCwgbmV3X3Jhd19jb3VudDsKLQl1NjQgZGVsdGE7Ci0KLWFnYWluOgotCXByZXZfcmF3X2NvdW50ID0gbG9jYWw2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBNYWtlIHRoZSBjb3VudGVyIHZhbHVlIGJlIGEgInJlYWwiIG9uZS4gKi8KLQluZXdfcmF3X2NvdW50ID0gbWlwc3BtdS0+cmVhZF9jb3VudGVyKGlkeCk7Ci0JaWYgKG5ld19yYXdfY291bnQgJiAodGVzdF9iaXQoaWR4LCBjcHVjLT5tc2JzKSA8PCBISUdIRVNUX0JJVCkpIHsKLQkJbmV3X3Jhd19jb3VudCAmPSBWQUxJRF9DT1VOVDsKLQkJY2xlYXJfYml0KGlkeCwgY3B1Yy0+bXNicyk7Ci0JfSBlbHNlCi0JCW5ld19yYXdfY291bnQgfD0gKHRlc3RfYml0KGlkeCwgY3B1Yy0+bXNicykgPDwgSElHSEVTVF9CSVQpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWlmIChsb2NhbDY0X2NtcHhjaGcoJmh3Yy0+cHJldl9jb3VudCwgcHJldl9yYXdfY291bnQsCi0JCQkJbmV3X3Jhd19jb3VudCkgIT0gcHJldl9yYXdfY291bnQpCi0JCWdvdG8gYWdhaW47Ci0KLQlkZWx0YSA9IChuZXdfcmF3X2NvdW50IDw8IHNoaWZ0KSAtIChwcmV2X3Jhd19jb3VudCA8PCBzaGlmdCk7Ci0JZGVsdGEgPj49IHNoaWZ0OwotCi0JbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOwotCWxvY2FsNjRfc3ViKGRlbHRhLCAmaHdjLT5wZXJpb2RfbGVmdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0KLQlpZiAoIW1pcHNwbXUpCi0JCXJldHVybjsKLQotCWlmIChmbGFncyAmIFBFUkZfRUZfUkVMT0FEKQotCQlXQVJOX09OX09OQ0UoIShod2MtPnN0YXRlICYgUEVSRl9IRVNfVVBUT0RBVEUpKTsKLQotCWh3Yy0+c3RhdGUgPSAwOwotCi0JLyogU2V0IHRoZSBwZXJpb2QgZm9yIHRoZSBldmVudC4gKi8KLQltaXBzcG11X2V2ZW50X3NldF9wZXJpb2QoZXZlbnQsIGh3YywgaHdjLT5pZHgpOwotCi0JLyogRW5hYmxlIHRoZSBldmVudC4gKi8KLQltaXBzcG11LT5lbmFibGVfZXZlbnQoaHdjLCBod2MtPmlkeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKLQotCWlmICghbWlwc3BtdSkKLQkJcmV0dXJuOwotCi0JaWYgKCEoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKSB7Ci0JCS8qIFdlIGFyZSB3b3JraW5nIG9uIGEgbG9jYWwgZXZlbnQuICovCi0JCW1pcHNwbXUtPmRpc2FibGVfZXZlbnQoaHdjLT5pZHgpOwotCQliYXJyaWVyKCk7Ci0JCW1pcHNwbXVfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKLQkJaHdjLT5zdGF0ZSB8PSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1pcHNwbXVfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0JaW50IGlkeDsKLQlpbnQgZXJyID0gMDsKLQotCXBlcmZfcG11X2Rpc2FibGUoZXZlbnQtPnBtdSk7Ci0KLQkvKiBUbyBsb29rIGZvciBhIGZyZWUgY291bnRlciBmb3IgdGhpcyBldmVudC4gKi8KLQlpZHggPSBtaXBzcG11LT5hbGxvY19jb3VudGVyKGNwdWMsIGh3Yyk7Ci0JaWYgKGlkeCA8IDApIHsKLQkJZXJyID0gaWR4OwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZXJlIGlzIGFuIGV2ZW50IGluIHRoZSBjb3VudGVyIHdlIGFyZSBnb2luZyB0byB1c2UgdGhlbgotCSAqIG1ha2Ugc3VyZSBpdCBpcyBkaXNhYmxlZC4KLQkgKi8KLQlldmVudC0+aHcuaWR4ID0gaWR4OwotCW1pcHNwbXUtPmRpc2FibGVfZXZlbnQoaWR4KTsKLQljcHVjLT5ldmVudHNbaWR4XSA9IGV2ZW50OwotCi0JaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hFU19VUFRPREFURTsKLQlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQotCQltaXBzcG11X3N0YXJ0KGV2ZW50LCBQRVJGX0VGX1JFTE9BRCk7Ci0KLQkvKiBQcm9wYWdhdGUgb3VyIGNoYW5nZXMgdG8gdGhlIHVzZXJzcGFjZSBtYXBwaW5nLiAqLwotCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKLQotb3V0OgotCXBlcmZfcG11X2VuYWJsZShldmVudC0+cG11KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBtaXBzcG11X2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwotCWludCBpZHggPSBod2MtPmlkeDsKLQotCVdBUk5fT04oaWR4IDwgMCB8fCBpZHggPj0gbWlwc3BtdS0+bnVtX2NvdW50ZXJzKTsKLQotCW1pcHNwbXVfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwotCWNwdWMtPmV2ZW50c1tpZHhdID0gTlVMTDsKLQljbGVhcl9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spOwotCi0JcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBtaXBzcG11X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwotCi0JLyogRG9uJ3QgcmVhZCBkaXNhYmxlZCBjb3VudGVycyEgKi8KLQlpZiAoaHdjLT5pZHggPCAwKQotCQlyZXR1cm47Ci0KLQltaXBzcG11X2V2ZW50X3VwZGF0ZShldmVudCwgaHdjLCBod2MtPmlkeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNwbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKLXsKLQlpZiAobWlwc3BtdSkKLQkJbWlwc3BtdS0+c3RhcnQoKTsKLX0KLQotc3RhdGljIHZvaWQgbWlwc3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKLXsKLQlpZiAobWlwc3BtdSkKLQkJbWlwc3BtdS0+c3RvcCgpOwotfQotCi1zdGF0aWMgYXRvbWljX3QgYWN0aXZlX2V2ZW50cyA9IEFUT01JQ19JTklUKDApOwotc3RhdGljIERFRklORV9NVVRFWChwbXVfcmVzZXJ2ZV9tdXRleCk7Ci1zdGF0aWMgaW50ICgqc2F2ZV9wZXJmX2lycSkodm9pZCk7Ci0KLXN0YXRpYyBpbnQgbWlwc3BtdV9nZXRfaXJxKHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmIChtaXBzcG11LT5pcnEgPj0gMCkgewotCQkvKiBSZXF1ZXN0IG15IG93biBpcnEgaGFuZGxlci4gKi8KLQkJZXJyID0gcmVxdWVzdF9pcnEobWlwc3BtdS0+aXJxLCBtaXBzcG11LT5oYW5kbGVfaXJxLAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9CQUxBTkNJTkcsCi0JCQkibWlwc19wZXJmX3BtdSIsIE5VTEwpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gcmVxdWVzdCBJUlElZCBmb3IgTUlQUyAiCi0JCQkgICAicGVyZm9ybWFuY2UgY291bnRlcnMhXG4iLCBtaXBzcG11LT5pcnEpOwotCQl9Ci0JfSBlbHNlIGlmIChjcDBfcGVyZmNvdW50X2lycSA8IDApIHsKLQkJLyoKLQkJICogV2UgYXJlIHNoYXJpbmcgdGhlIGlycSBudW1iZXIgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0LgotCQkgKi8KLQkJc2F2ZV9wZXJmX2lycSA9IHBlcmZfaXJxOwotCQlwZXJmX2lycSA9IG1pcHNwbXUtPmhhbmRsZV9zaGFyZWRfaXJxOwotCQllcnIgPSAwOwotCX0gZWxzZSB7Ci0JCXByX3dhcm5pbmcoIlRoZSBwbGF0Zm9ybSBoYXNuJ3QgcHJvcGVybHkgZGVmaW5lZCBpdHMgIgotCQkJImludGVycnVwdCBjb250cm9sbGVyLlxuIik7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbWlwc3BtdV9mcmVlX2lycSh2b2lkKQotewotCWlmIChtaXBzcG11LT5pcnEgPj0gMCkKLQkJZnJlZV9pcnEobWlwc3BtdS0+aXJxLCBOVUxMKTsKLQllbHNlIGlmIChjcDBfcGVyZmNvdW50X2lycSA8IDApCi0JCXBlcmZfaXJxID0gc2F2ZV9wZXJmX2lycTsKLX0KLQotLyoKLSAqIG1pcHN4eC9ybTkwMDAvbG9vbmdzb24yIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIGNvdW50ZXJzLCB0aGV5IGhhdmUKLSAqIHNwZWNpZmljIGxvdy1sZXZlbCBpbml0IHJvdXRpbmVzLgotICovCi1zdGF0aWMgdm9pZCByZXNldF9jb3VudGVycyh2b2lkICphcmcpOwotc3RhdGljIGludCBfX2h3X3BlcmZfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwotCi1zdGF0aWMgdm9pZCBod19wZXJmX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCWlmIChhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZhY3RpdmVfZXZlbnRzLAotCQkJCSZwbXVfcmVzZXJ2ZV9tdXRleCkpIHsKLQkJLyoKLQkJICogV2UgbXVzdCBub3QgY2FsbCB0aGUgZGVzdHJveSBmdW5jdGlvbiB3aXRoIGludGVycnVwdHMKLQkJICogZGlzYWJsZWQuCi0JCSAqLwotCQlvbl9lYWNoX2NwdShyZXNldF9jb3VudGVycywKLQkJCSh2b2lkICopKGxvbmcpbWlwc3BtdS0+bnVtX2NvdW50ZXJzLCAxKTsKLQkJbWlwc3BtdV9mcmVlX2lycSgpOwotCQltdXRleF91bmxvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbWlwc3BtdV9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKLXsKLQlpbnQgZXJyID0gMDsKLQotCXN3aXRjaCAoZXZlbnQtPmF0dHIudHlwZSkgewotCWNhc2UgUEVSRl9UWVBFX1JBVzoKLQljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKLQljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlpZiAoIW1pcHNwbXUgfHwgZXZlbnQtPmNwdSA+PSBucl9jcHVtYXNrX2JpdHMgfHwKLQkJKGV2ZW50LT5jcHUgPj0gMCAmJiAhY3B1X29ubGluZShldmVudC0+Y3B1KSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZhY3RpdmVfZXZlbnRzKSkgewotCQlpZiAoYXRvbWljX3JlYWQoJmFjdGl2ZV9ldmVudHMpID4gTUlQU19NQVhfSFdFVkVOVFMpIHsKLQkJCWF0b21pY19kZWMoJmFjdGl2ZV9ldmVudHMpOwotCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCX0KLQotCQltdXRleF9sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPT0gMCkKLQkJCWVyciA9IG1pcHNwbXVfZ2V0X2lycSgpOwotCi0JCWlmICghZXJyKQotCQkJYXRvbWljX2luYygmYWN0aXZlX2V2ZW50cyk7Ci0JCW11dGV4X3VubG9jaygmcG11X3Jlc2VydmVfbXV0ZXgpOwotCX0KLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBfX2h3X3BlcmZfZXZlbnRfaW5pdChldmVudCk7Ci0JaWYgKGVycikKLQkJaHdfcGVyZl9ldmVudF9kZXN0cm95KGV2ZW50KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcG11IHBtdSA9IHsKLQkucG11X2VuYWJsZQk9IG1pcHNwbXVfZW5hYmxlLAotCS5wbXVfZGlzYWJsZQk9IG1pcHNwbXVfZGlzYWJsZSwKLQkuZXZlbnRfaW5pdAk9IG1pcHNwbXVfZXZlbnRfaW5pdCwKLQkuYWRkCQk9IG1pcHNwbXVfYWRkLAotCS5kZWwJCT0gbWlwc3BtdV9kZWwsCi0JLnN0YXJ0CQk9IG1pcHNwbXVfc3RhcnQsCi0JLnN0b3AJCT0gbWlwc3BtdV9zdG9wLAotCS5yZWFkCQk9IG1pcHNwbXVfcmVhZCwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1taXBzcG11X3BlcmZfZXZlbnRfZW5jb2RlKGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKLXsKLS8qCi0gKiBUb3AgOCBiaXRzIGZvciByYW5nZSwgbmV4dCAxNiBiaXRzIGZvciBjbnRyX21hc2ssIGxvd2VzdCA4IGJpdHMgZm9yCi0gKiBldmVudF9pZC4KLSAqLwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotCXJldHVybiAoKHVuc2lnbmVkIGludClwZXYtPnJhbmdlIDw8IDI0KSB8Ci0JCShwZXYtPmNudHJfbWFzayAmIDB4ZmZmZjAwKSB8Ci0JCShwZXYtPmV2ZW50X2lkICYgMHhmZik7Ci0jZWxzZQotCXJldHVybiAocGV2LT5jbnRyX21hc2sgJiAweGZmZmYwMCkgfAotCQkocGV2LT5ldmVudF9pZCAmIDB4ZmYpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICoKLW1pcHNwbXVfbWFwX2dlbmVyYWxfZXZlbnQoaW50IGlkeCkKLXsKLQljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpwZXY7Ci0KLQlwZXYgPSAoKCptaXBzcG11LT5nZW5lcmFsX2V2ZW50X21hcClbaWR4XS5ldmVudF9pZCA9PQotCQlVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEID8gRVJSX1BUUigtRU9QTk9UU1VQUCkgOgotCQkmKCptaXBzcG11LT5nZW5lcmFsX2V2ZW50X21hcClbaWR4XSk7Ci0KLQlyZXR1cm4gcGV2OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqCi1taXBzcG11X21hcF9jYWNoZV9ldmVudCh1NjQgY29uZmlnKQotewotCXVuc2lnbmVkIGludCBjYWNoZV90eXBlLCBjYWNoZV9vcCwgY2FjaGVfcmVzdWx0OwotCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldjsKLQotCWNhY2hlX3R5cGUgPSAoY29uZmlnID4+IDApICYgMHhmZjsKLQlpZiAoY2FjaGVfdHlwZSA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQljYWNoZV9vcCA9IChjb25maWcgPj4gOCkgJiAweGZmOwotCWlmIChjYWNoZV9vcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7Ci0JaWYgKGNhY2hlX3Jlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0JcGV2ID0gJigoKm1pcHNwbXUtPmNhY2hlX2V2ZW50X21hcCkKLQkJCQkJW2NhY2hlX3R5cGVdCi0JCQkJCVtjYWNoZV9vcF0KLQkJCQkJW2NhY2hlX3Jlc3VsdF0pOwotCi0JaWYgKHBldi0+ZXZlbnRfaWQgPT0gVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwotCi0JcmV0dXJuIHBldjsKLQotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX2V2ZW50KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAotCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0IGh3X3BlcmZfZXZlbnQgZmFrZV9od2MgPSBldmVudC0+aHc7Ci0KLQkvKiBBbGxvdyBtaXhlZCBldmVudCBncm91cC4gU28gcmV0dXJuIDEgdG8gcGFzcyB2YWxpZGF0aW9uLiAqLwotCWlmIChldmVudC0+cG11ICE9ICZwbXUgfHwgZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiBtaXBzcG11LT5hbGxvY19jb3VudGVyKGNwdWMsICZmYWtlX2h3YykgPj0gMDsKLX0KLQotc3RhdGljIGludCB2YWxpZGF0ZV9ncm91cChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCi17Ci0Jc3RydWN0IHBlcmZfZXZlbnQgKnNpYmxpbmcsICpsZWFkZXIgPSBldmVudC0+Z3JvdXBfbGVhZGVyOwotCXN0cnVjdCBjcHVfaHdfZXZlbnRzIGZha2VfY3B1YzsKLQotCW1lbXNldCgmZmFrZV9jcHVjLCAwLCBzaXplb2YoZmFrZV9jcHVjKSk7Ci0KLQlpZiAoIXZhbGlkYXRlX2V2ZW50KCZmYWtlX2NwdWMsIGxlYWRlcikpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGdyb3VwX2VudHJ5KSB7Ci0JCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1Yywgc2libGluZykpCi0JCQlyZXR1cm4gLUVOT1NQQzsKLQl9Ci0KLQlpZiAoIXZhbGlkYXRlX2V2ZW50KCZmYWtlX2NwdWMsIGV2ZW50KSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBuZWVkZWQgYnkgc3BlY2lmaWMgaXJxIGhhbmRsZXJzIGluIHBlcmZfZXZlbnRfKi5jICovCi1zdGF0aWMgdm9pZAotaGFuZGxlX2Fzc29jaWF0ZWRfZXZlbnQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCi0JaW50IGlkeCwgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGNwdWMtPmV2ZW50c1tpZHhdOwotCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwotCi0JbWlwc3BtdV9ldmVudF91cGRhdGUoZXZlbnQsIGh3YywgaWR4KTsKLQlkYXRhLT5wZXJpb2QgPSBldmVudC0+aHcubGFzdF9wZXJpb2Q7Ci0JaWYgKCFtaXBzcG11X2V2ZW50X3NldF9wZXJpb2QoZXZlbnQsIGh3YywgaWR4KSkKLQkJcmV0dXJuOwotCi0JaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsIGRhdGEsIHJlZ3MpKQotCQltaXBzcG11LT5kaXNhYmxlX2V2ZW50KGlkeCk7Ci19Ci0KLSNpbmNsdWRlICJwZXJmX2V2ZW50X21pcHN4eC5jIgogCiAvKiBDYWxsY2hhaW4gaGFuZGxpbmcgY29kZS4gKi8KIAogLyoKICAqIExlYXZlIHVzZXJzcGFjZSBjYWxsY2hhaW4gZW1wdHkgZm9yIG5vdy4gV2hlbiB3ZSBmaW5kIGEgd2F5IHRvIHRyYWNlCi0gKiB0aGUgdXNlciBzdGFjayBjYWxsY2hhaW5zLCB3ZSBhZGQgaGVyZS4KKyAqIHRoZSB1c2VyIHN0YWNrIGNhbGxjaGFpbnMsIHdlIHdpbGwgYWRkIGl0IGhlcmUuCiAgKi8KLXZvaWQgcGVyZl9jYWxsY2hhaW5fdXNlcihzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LAotCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci19CiAKIHN0YXRpYyB2b2lkIHNhdmVfcmF3X3BlcmZfY2FsbGNoYWluKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCiAJdW5zaWduZWQgbG9uZyByZWcyOSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYwppbmRleCBlNWFkMDlhLi40ZjI5NzFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCkBAIC0xLDEzICsxLDExMiBAQAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9NSVBTNjQpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfUjEwMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU0IxKQorLyoKKyAqIExpbnV4IHBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCBmb3IgTUlQUy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBDYXZpdW0gTmV0d29ya3MsIEluYy4KKyAqIEF1dGhvcjogRGVuZy1DaGVuZyBaaHUKKyAqCisgKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIGZvciBBUk0sIHdoaWNoIGlzIGluIHR1cm4KKyAqIGJhc2VkIG9uIHRoZSBzcGFyYzY0IHBlcmYgZXZlbnQgY29kZSBhbmQgdGhlIHg4NiBjb2RlLiBQZXJmb3JtYW5jZQorICogY291bnRlciBhY2Nlc3MgaXMgYmFzZWQgb24gdGhlIE1JUFMgT3Byb2ZpbGUgY29kZS4gQW5kIHRoZSBjYWxsY2hhaW4KKyAqIHN1cHBvcnQgcmVmZXJlbmNlcyB0aGUgY29kZSBvZiBNSVBTIHN0YWNrdHJhY2UuYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+IC8qIEZvciBwZXJmX2lycSAqLworCisjZGVmaW5lIE1JUFNfTUFYX0hXRVZFTlRTIDQKKworc3RydWN0IGNwdV9od19ldmVudHMgeworCS8qIEFycmF5IG9mIGV2ZW50cyBvbiB0aGlzIGNwdS4gKi8KKwlzdHJ1Y3QgcGVyZl9ldmVudAkqZXZlbnRzW01JUFNfTUFYX0hXRVZFTlRTXTsKKworCS8qCisJICogU2V0IHRoZSBiaXQgKGluZGV4ZWQgYnkgdGhlIGNvdW50ZXIgbnVtYmVyKSB3aGVuIHRoZSBjb3VudGVyCisJICogaXMgdXNlZCBmb3IgYW4gZXZlbnQuCisJICovCisJdW5zaWduZWQgbG9uZwkJdXNlZF9tYXNrW0JJVFNfVE9fTE9OR1MoTUlQU19NQVhfSFdFVkVOVFMpXTsKKworCS8qCisJICogU29mdHdhcmUgY29weSBvZiB0aGUgY29udHJvbCByZWdpc3RlciBmb3IgZWFjaCBwZXJmb3JtYW5jZSBjb3VudGVyLgorCSAqIE1JUFMgQ1BVcyB2YXJ5IGluIHBlcmZvcm1hbmNlIGNvdW50ZXJzLiBUaGV5IHVzZSB0aGlzIGRpZmZlcmVudGx5LAorCSAqIGFuZCBldmVuIG1heSBub3QgdXNlIGl0LgorCSAqLworCXVuc2lnbmVkIGludAkJc2F2ZWRfY3RybFtNSVBTX01BWF9IV0VWRU5UU107Cit9OworREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9od19ldmVudHMsIGNwdV9od19ldmVudHMpID0geworCS5zYXZlZF9jdHJsID0gezB9LAorfTsKKworLyogVGhlIGRlc2NyaXB0aW9uIG9mIE1JUFMgcGVyZm9ybWFuY2UgZXZlbnRzLiAqLworc3RydWN0IG1pcHNfcGVyZl9ldmVudCB7CisJdW5zaWduZWQgaW50IGV2ZW50X2lkOworCS8qCisJICogTUlQUyBwZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgaW5kZXhlZCBzdGFydGluZyBmcm9tIDAuCisJICogQ05UUl9FVkVOIGluZGljYXRlcyB0aGUgaW5kZXhlcyBvZiB0aGUgY291bnRlcnMgdG8gYmUgdXNlZCBhcmUKKwkgKiBldmVuIG51bWJlcnMuCisJICovCisJdW5zaWduZWQgaW50IGNudHJfbWFzazsKKwkjZGVmaW5lIENOVFJfRVZFTgkweDU1NTU1NTU1CisJI2RlZmluZSBDTlRSX09ERAkweGFhYWFhYWFhCisJI2RlZmluZSBDTlRSX0FMTAkweGZmZmZmZmZmCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCisJZW51bSB7CisJCVQgID0gMCwKKwkJViAgPSAxLAorCQlQICA9IDIsCisJfSByYW5nZTsKKyNlbHNlCisJI2RlZmluZSBUCisJI2RlZmluZSBWCisJI2RlZmluZSBQCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50IHJhd19ldmVudDsKK3N0YXRpYyBERUZJTkVfTVVURVgocmF3X2V2ZW50X211dGV4KTsKKworI2RlZmluZSBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQyh4KSBQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCitzdHJ1Y3QgbWlwc19wbXUgeworCXU2NAkJbWF4X3BlcmlvZDsKKwl1NjQJCXZhbGlkX2NvdW50OworCXU2NAkJb3ZlcmZsb3c7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCWlycTsKKwl1NjQJCSgqcmVhZF9jb3VudGVyKSh1bnNpZ25lZCBpbnQgaWR4KTsKKwl2b2lkCQkoKndyaXRlX2NvdW50ZXIpKHVuc2lnbmVkIGludCBpZHgsIHU2NCB2YWwpOworCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKigqbWFwX3Jhd19ldmVudCkodTY0IGNvbmZpZyk7CisJY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAoKmdlbmVyYWxfZXZlbnRfbWFwKVtQRVJGX0NPVU5UX0hXX01BWF07CisJY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAoKmNhY2hlX2V2ZW50X21hcCkKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworCXVuc2lnbmVkIGludAludW1fY291bnRlcnM7Cit9OworCitzdGF0aWMgc3RydWN0IG1pcHNfcG11IG1pcHNwbXU7CiAKICNkZWZpbmUgTV9DT05GSUcxX1BDCSgxIDw8IDQpCiAKLSNkZWZpbmUgTV9QRVJGQ1RMX0VYTAkJCSgxVUwgICAgICA8PCAgMCkKLSNkZWZpbmUgTV9QRVJGQ1RMX0tFUk5FTAkJKDFVTCAgICAgIDw8ICAxKQotI2RlZmluZSBNX1BFUkZDVExfU1VQRVJWSVNPUgkJKDFVTCAgICAgIDw8ICAyKQotI2RlZmluZSBNX1BFUkZDVExfVVNFUgkJCSgxVUwgICAgICA8PCAgMykKLSNkZWZpbmUgTV9QRVJGQ1RMX0lOVEVSUlVQVF9FTkFCTEUJKDFVTCAgICAgIDw8ICA0KQorI2RlZmluZSBNX1BFUkZDVExfRVhMCQkJKDEgICAgICA8PCAgMCkKKyNkZWZpbmUgTV9QRVJGQ1RMX0tFUk5FTAkJKDEgICAgICA8PCAgMSkKKyNkZWZpbmUgTV9QRVJGQ1RMX1NVUEVSVklTT1IJCSgxICAgICAgPDwgIDIpCisjZGVmaW5lIE1fUEVSRkNUTF9VU0VSCQkJKDEgICAgICA8PCAgMykKKyNkZWZpbmUgTV9QRVJGQ1RMX0lOVEVSUlVQVF9FTkFCTEUJKDEgICAgICA8PCAgNCkKICNkZWZpbmUgTV9QRVJGQ1RMX0VWRU5UKGV2ZW50KQkJKCgoZXZlbnQpICYgMHgzZmYpICA8PCA1KQogI2RlZmluZSBNX1BFUkZDVExfVlBFSUQodnBlKQkJKCh2cGUpICAgIDw8IDE2KQogI2RlZmluZSBNX1BFUkZDVExfTVRfRU4oZmlsdGVyKQkJKChmaWx0ZXIpIDw8IDIwKQpAQCAtMTUsOCArMTE0LDggQEAKICNkZWZpbmUgICAgTV9UQ19FTl9WUEUJCQlNX1BFUkZDVExfTVRfRU4oMSkKICNkZWZpbmUgICAgTV9UQ19FTl9UQwkJCU1fUEVSRkNUTF9NVF9FTigyKQogI2RlZmluZSBNX1BFUkZDVExfVENJRCh0Y2lkKQkJKCh0Y2lkKSAgIDw8IDIyKQotI2RlZmluZSBNX1BFUkZDVExfV0lERQkJCSgxVUwgICAgICA8PCAzMCkKLSNkZWZpbmUgTV9QRVJGQ1RMX01PUkUJCQkoMVVMICAgICAgPDwgMzEpCisjZGVmaW5lIE1fUEVSRkNUTF9XSURFCQkJKDEgICAgICA8PCAzMCkKKyNkZWZpbmUgTV9QRVJGQ1RMX01PUkUJCQkoMSAgICAgIDw8IDMxKQogCiAjZGVmaW5lIE1fUEVSRkNUTF9DT1VOVF9FVkVOVF9XSEVORVZFUgkoTV9QRVJGQ1RMX0VYTCB8CQlcCiAJCQkJCU1fUEVSRkNUTF9LRVJORUwgfAkJXApAQCAtMzEsMTEgKzEzMCwxMiBAQAogI2VuZGlmCiAjZGVmaW5lIE1fUEVSRkNUTF9FVkVOVF9NQVNLCQkweGZlMAogCi0jZGVmaW5lIE1fQ09VTlRFUl9PVkVSRkxPVwkJKDFVTCAgICAgIDw8IDMxKQogCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCiBzdGF0aWMgaW50IGNwdV9oYXNfbWlwc210X3BlcnRjY291bnRlcnM7CiAKK3N0YXRpYyBERUZJTkVfUldMT0NLKHBtdWludF9yd2xvY2spOworCiAvKgogICogRklYTUU6IEZvciBWU01QLCB2cGVfaWQoKSBpcyByZWRlZmluZWQgZm9yIFBlcmYtZXZlbnRzLCBiZWNhdXNlCiAgKiBjcHVfZGF0YVtjcHVpZF0udnBlX2lkIHJlcG9ydHMgMCBmb3IgX2JvdGhfIENQVXMuCkBAIC00OSw3OSArMTQ5LDYyMSBAQAogI2VuZGlmCiAKIC8qIENvcGllZCBmcm9tIG9wX21vZGVsX21pcHN4eC5jICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2cGVfc2hpZnQodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnBlX3NoaWZ0KHZvaWQpCiB7CiAJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwogfQotI2Vsc2UgLyogIUNPTkZJR19NSVBTX01UX1NNUCAqLwotI2RlZmluZSB2cGVfaWQoKQkwCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHZwZV9zaGlmdCh2b2lkKQotewotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNUCAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY291bnRlcnNfdG90YWxfdG9fcGVyX2NwdSh1bnNpZ25lZCBpbnQgY291bnRlcnMpCitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ZXJzX3RvdGFsX3RvX3Blcl9jcHUodW5zaWduZWQgaW50IGNvdW50ZXJzKQogewogCXJldHVybiBjb3VudGVycyA+PiB2cGVfc2hpZnQoKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNvdW50ZXJzX3Blcl9jcHVfdG9fdG90YWwodW5zaWduZWQgaW50IGNvdW50ZXJzKQorc3RhdGljIHVuc2lnbmVkIGludCBjb3VudGVyc19wZXJfY3B1X3RvX3RvdGFsKHVuc2lnbmVkIGludCBjb3VudGVycykKIHsKIAlyZXR1cm4gY291bnRlcnMgPDwgdnBlX3NoaWZ0KCk7CiB9CiAKLSNkZWZpbmUgX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMociwgbiwgbnApCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJfYzBfICMjIHIgIyMgbih2b2lkKQkJCVwKLXsJCQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IGNwdSA9IHZwZV9pZCgpOwkJCQkJXAotCQkJCQkJCQkJXAotCXN3aXRjaCAoY3B1KSB7CQkJCQkJCVwKLQljYXNlIDA6CQkJCQkJCQlcCi0JCXJldHVybiByZWFkX2MwXyAjIyByICMjIG4oKTsJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQkJcmV0dXJuIHJlYWRfYzBfICMjIHIgIyMgbnAoKTsJCQkJXAotCWRlZmF1bHQ6CQkJCQkJCVwKLQkJQlVHKCk7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JcmV0dXJuIDA7CQkJCQkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgaW5saW5lIHZvaWQgd19jMF8gIyMgciAjIyBuKHVuc2lnbmVkIGludCB2YWx1ZSkJCQlcCi17CQkJCQkJCQkJXAotCXVuc2lnbmVkIGludCBjcHUgPSB2cGVfaWQoKTsJCQkJCVwKLQkJCQkJCQkJCVwKLQlzd2l0Y2ggKGNwdSkgewkJCQkJCQlcCi0JY2FzZSAwOgkJCQkJCQkJXAotCQl3cml0ZV9jMF8gIyMgciAjIyBuKHZhbHVlKTsJCQkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JCXdyaXRlX2MwXyAjIyByICMjIG5wKHZhbHVlKTsJCQkJXAotCQlyZXR1cm47CQkJCQkJCVwKLQlkZWZhdWx0OgkJCQkJCQlcCi0JCUJVRygpOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybjsJCQkJCQkJCVwKLX0JCQkJCQkJCQlcCisjZWxzZSAvKiAhQ09ORklHX01JUFNfTVRfU01QICovCisjZGVmaW5lIHZwZV9pZCgpCTAKIAotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmNudHIsIDAsIDIpCi1fX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhwZXJmY250ciwgMSwgMykKLV9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHBlcmZjbnRyLCAyLCAwKQotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmNudHIsIDMsIDEpCisjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01QICovCiAKLV9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHBlcmZjdHJsLCAwLCAyKQotX19kZWZpbmVfcGVyZl9hY2Nlc3NvcnMocGVyZmN0cmwsIDEsIDMpCi1fX2RlZmluZV9wZXJmX2FjY2Vzc29ycyhwZXJmY3RybCwgMiwgMCkKLV9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHBlcmZjdHJsLCAzLCAxKQorc3RhdGljIHZvaWQgcmVzdW1lX2xvY2FsX2NvdW50ZXJzKHZvaWQpOworc3RhdGljIHZvaWQgcGF1c2VfbG9jYWxfY291bnRlcnModm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWlwc3h4X3BtdV9oYW5kbGVfaXJxKGludCwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgbWlwc3h4X3BtdV9oYW5kbGVfc2hhcmVkX2lycSh2b2lkKTsKIAotc3RhdGljIGlubGluZSBpbnQgX19uX2NvdW50ZXJzKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgaW50IG1pcHN4eF9wbXVfc3dpenpsZV9wZXJmX2lkeCh1bnNpZ25lZCBpbnQgaWR4KQoreworCWlmICh2cGVfaWQoKSA9PSAxKQorCQlpZHggPSAoaWR4ICsgMikgJiAzOworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB1NjQgbWlwc3h4X3BtdV9yZWFkX2NvdW50ZXIodW5zaWduZWQgaW50IGlkeCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQkvKgorCQkgKiBUaGUgY291bnRlcnMgYXJlIHVuc2lnbmVkLCB3ZSBtdXN0IGNhc3QgdG8gdHJ1bmNhdGUKKwkJICogb2ZmIHRoZSBoaWdoIGJpdHMuCisJCSAqLworCQlyZXR1cm4gKHUzMilyZWFkX2MwX3BlcmZjbnRyMCgpOworCWNhc2UgMToKKwkJcmV0dXJuICh1MzIpcmVhZF9jMF9wZXJmY250cjEoKTsKKwljYXNlIDI6CisJCXJldHVybiAodTMyKXJlYWRfYzBfcGVyZmNudHIyKCk7CisJY2FzZSAzOgorCQlyZXR1cm4gKHUzMilyZWFkX2MwX3BlcmZjbnRyMygpOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAiSW52YWxpZCBwZXJmb3JtYW5jZSBjb3VudGVyIG51bWJlciAoJWQpXG4iLCBpZHgpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1NjQgbWlwc3h4X3BtdV9yZWFkX2NvdW50ZXJfNjQodW5zaWduZWQgaW50IGlkeCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY250cjBfNjQoKTsKKwljYXNlIDE6CisJCXJldHVybiByZWFkX2MwX3BlcmZjbnRyMV82NCgpOworCWNhc2UgMjoKKwkJcmV0dXJuIHJlYWRfYzBfcGVyZmNudHIyXzY0KCk7CisJY2FzZSAzOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY250cjNfNjQoKTsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgcGVyZm9ybWFuY2UgY291bnRlciBudW1iZXIgKCVkKVxuIiwgaWR4KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtaXBzeHhfcG11X3dyaXRlX2NvdW50ZXIodW5zaWduZWQgaW50IGlkeCwgdTY0IHZhbCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQl3cml0ZV9jMF9wZXJmY250cjAodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMToKKwkJd3JpdGVfYzBfcGVyZmNudHIxKHZhbCk7CisJCXJldHVybjsKKwljYXNlIDI6CisJCXdyaXRlX2MwX3BlcmZjbnRyMih2YWwpOworCQlyZXR1cm47CisJY2FzZSAzOgorCQl3cml0ZV9jMF9wZXJmY250cjModmFsKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgbWlwc3h4X3BtdV93cml0ZV9jb3VudGVyXzY0KHVuc2lnbmVkIGludCBpZHgsIHU2NCB2YWwpCit7CisJaWR4ID0gbWlwc3h4X3BtdV9zd2l6emxlX3BlcmZfaWR4KGlkeCk7CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgMDoKKwkJd3JpdGVfYzBfcGVyZmNudHIwXzY0KHZhbCk7CisJCXJldHVybjsKKwljYXNlIDE6CisJCXdyaXRlX2MwX3BlcmZjbnRyMV82NCh2YWwpOworCQlyZXR1cm47CisJY2FzZSAyOgorCQl3cml0ZV9jMF9wZXJmY250cjJfNjQodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMzoKKwkJd3JpdGVfYzBfcGVyZmNudHIzXzY0KHZhbCk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlwc3h4X3BtdV9yZWFkX2NvbnRyb2wodW5zaWduZWQgaW50IGlkeCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY3RybDAoKTsKKwljYXNlIDE6CisJCXJldHVybiByZWFkX2MwX3BlcmZjdHJsMSgpOworCWNhc2UgMjoKKwkJcmV0dXJuIHJlYWRfYzBfcGVyZmN0cmwyKCk7CisJY2FzZSAzOgorCQlyZXR1cm4gcmVhZF9jMF9wZXJmY3RybDMoKTsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgcGVyZm9ybWFuY2UgY291bnRlciBudW1iZXIgKCVkKVxuIiwgaWR4KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBtaXBzeHhfcG11X3dyaXRlX2NvbnRyb2wodW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZHggPSBtaXBzeHhfcG11X3N3aXp6bGVfcGVyZl9pZHgoaWR4KTsKKworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQl3cml0ZV9jMF9wZXJmY3RybDAodmFsKTsKKwkJcmV0dXJuOworCWNhc2UgMToKKwkJd3JpdGVfYzBfcGVyZmN0cmwxKHZhbCk7CisJCXJldHVybjsKKwljYXNlIDI6CisJCXdyaXRlX2MwX3BlcmZjdHJsMih2YWwpOworCQlyZXR1cm47CisJY2FzZSAzOgorCQl3cml0ZV9jMF9wZXJmY3RybDModmFsKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBtaXBzeHhfcG11X2FsbG9jX2NvdW50ZXIoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFdlIG9ubHkgbmVlZCB0byBjYXJlIHRoZSBjb3VudGVyIG1hc2suIFRoZSByYW5nZSBoYXMgYmVlbgorCSAqIGNoZWNrZWQgZGVmaW5pdGVseS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGNudHJfbWFzayA9IChod2MtPmV2ZW50X2Jhc2UgPj4gOCkgJiAweGZmZmY7CisKKwlmb3IgKGkgPSBtaXBzcG11Lm51bV9jb3VudGVycyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCS8qCisJCSAqIE5vdGUgdGhhdCBzb21lIE1JUFMgcGVyZiBldmVudHMgY2FuIGJlIGNvdW50ZWQgYnkgYm90aAorCQkgKiBldmVuIGFuZCBvZGQgY291bnRlcnMsIHdoZXJlc2FzIG1hbnkgb3RoZXIgYXJlIG9ubHkgYnkKKwkJICogZXZlbiBfb3JfIG9kZCBjb3VudGVycy4gVGhpcyBpbnRyb2R1Y2VzIGFuIGlzc3VlIHRoYXQKKwkJICogd2hlbiB0aGUgZm9ybWVyIGtpbmQgb2YgZXZlbnQgdGFrZXMgdGhlIGNvdW50ZXIgdGhlCisJCSAqIGxhdHRlciBraW5kIG9mIGV2ZW50IHdhbnRzIHRvIHVzZSwgdGhlbiB0aGUgImNvdW50ZXIKKwkJICogYWxsb2NhdGlvbiIgZm9yIHRoZSBsYXR0ZXIgZXZlbnQgd2lsbCBmYWlsLiBJbiBmYWN0IGlmCisJCSAqIHRoZXkgY2FuIGJlIGR5bmFtaWNhbGx5IHN3YXBwZWQsIHRoZXkgYm90aCBmZWVsIGhhcHB5LgorCQkgKiBCdXQgaGVyZSB3ZSBsZWF2ZSB0aGlzIGlzc3VlIGFsb25lIGZvciBub3cuCisJCSAqLworCQlpZiAodGVzdF9iaXQoaSwgJmNudHJfbWFzaykgJiYKKwkJCSF0ZXN0X2FuZF9zZXRfYml0KGksIGNwdWMtPnVzZWRfbWFzaykpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHZvaWQgbWlwc3h4X3BtdV9lbmFibGVfZXZlbnQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmV2dCwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOworCisJV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBtaXBzcG11Lm51bV9jb3VudGVycyk7CisKKwljcHVjLT5zYXZlZF9jdHJsW2lkeF0gPSBNX1BFUkZDVExfRVZFTlQoZXZ0LT5ldmVudF9iYXNlICYgMHhmZikgfAorCQkoZXZ0LT5jb25maWdfYmFzZSAmIE1fUEVSRkNUTF9DT05GSUdfTUFTSykgfAorCQkvKiBNYWtlIHN1cmUgaW50ZXJydXB0IGVuYWJsZWQuICovCisJCU1fUEVSRkNUTF9JTlRFUlJVUFRfRU5BQkxFOworCS8qCisJICogV2UgZG8gbm90IGFjdHVhbGx5IGxldCB0aGUgY291bnRlciBydW4uIExlYXZlIGl0IHVudGlsIHN0YXJ0KCkuCisJICovCit9CisKK3N0YXRpYyB2b2lkIG1pcHN4eF9wbXVfZGlzYWJsZV9ldmVudChpbnQgaWR4KQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVdBUk5fT04oaWR4IDwgMCB8fCBpZHggPj0gbWlwc3BtdS5udW1fY291bnRlcnMpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWNwdWMtPnNhdmVkX2N0cmxbaWR4XSA9IG1pcHN4eF9wbXVfcmVhZF9jb250cm9sKGlkeCkgJgorCQl+TV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSOworCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbChpZHgsIGNwdWMtPnNhdmVkX2N0cmxbaWR4XSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1pcHNwbXVfZXZlbnRfc2V0X3BlcmlvZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJICAgIHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MsCisJCQkJICAgIGludCBpZHgpCit7CisJdTY0IGxlZnQgPSBsb2NhbDY0X3JlYWQoJmh3Yy0+cGVyaW9kX2xlZnQpOworCXU2NCBwZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7CisJaW50IHJldCA9IDA7CisKKwlpZiAodW5saWtlbHkoKGxlZnQgKyBwZXJpb2QpICYgKDFVTEwgPDwgNjMpKSkgeworCQkvKiBsZWZ0IHVuZGVyZmxvd2VkIGJ5IG1vcmUgdGhhbiBwZXJpb2QuICovCisJCWxlZnQgPSBwZXJpb2Q7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwkJaHdjLT5sYXN0X3BlcmlvZCA9IHBlcmlvZDsKKwkJcmV0ID0gMTsKKwl9IGVsc2UJaWYgKHVubGlrZWx5KChsZWZ0ICsgcGVyaW9kKSA8PSBwZXJpb2QpKSB7CisJCS8qIGxlZnQgdW5kZXJmbG93ZWQgYnkgbGVzcyB0aGFuIHBlcmlvZC4gKi8KKwkJbGVmdCArPSBwZXJpb2Q7CisJCWxvY2FsNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwkJaHdjLT5sYXN0X3BlcmlvZCA9IHBlcmlvZDsKKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAobGVmdCA+IG1pcHNwbXUubWF4X3BlcmlvZCkgeworCQlsZWZ0ID0gbWlwc3BtdS5tYXhfcGVyaW9kOworCQlsb2NhbDY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CisJfQorCisJbG9jYWw2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgbWlwc3BtdS5vdmVyZmxvdyAtIGxlZnQpOworCisJbWlwc3BtdS53cml0ZV9jb3VudGVyKGlkeCwgbWlwc3BtdS5vdmVyZmxvdyAtIGxlZnQpOworCisJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9ldmVudF91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjLAorCQkJCSBpbnQgaWR4KQoreworCXU2NCBwcmV2X3Jhd19jb3VudCwgbmV3X3Jhd19jb3VudDsKKwl1NjQgZGVsdGE7CisKK2FnYWluOgorCXByZXZfcmF3X2NvdW50ID0gbG9jYWw2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOworCW5ld19yYXdfY291bnQgPSBtaXBzcG11LnJlYWRfY291bnRlcihpZHgpOworCisJaWYgKGxvY2FsNjRfY21weGNoZygmaHdjLT5wcmV2X2NvdW50LCBwcmV2X3Jhd19jb3VudCwKKwkJCQluZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKKwkJZ290byBhZ2FpbjsKKworCWRlbHRhID0gbmV3X3Jhd19jb3VudCAtIHByZXZfcmF3X2NvdW50OworCisJbG9jYWw2NF9hZGQoZGVsdGEsICZldmVudC0+Y291bnQpOworCWxvY2FsNjRfc3ViKGRlbHRhLCAmaHdjLT5wZXJpb2RfbGVmdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNwbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1JFTE9BRCkKKwkJV0FSTl9PTl9PTkNFKCEoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1VQVE9EQVRFKSk7CisKKwlod2MtPnN0YXRlID0gMDsKKworCS8qIFNldCB0aGUgcGVyaW9kIGZvciB0aGUgZXZlbnQuICovCisJbWlwc3BtdV9ldmVudF9zZXRfcGVyaW9kKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKKworCS8qIEVuYWJsZSB0aGUgZXZlbnQuICovCisJbWlwc3h4X3BtdV9lbmFibGVfZXZlbnQoaHdjLCBod2MtPmlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNwbXVfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKworCWlmICghKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKSkgeworCQkvKiBXZSBhcmUgd29ya2luZyBvbiBhIGxvY2FsIGV2ZW50LiAqLworCQltaXBzeHhfcG11X2Rpc2FibGVfZXZlbnQoaHdjLT5pZHgpOworCQliYXJyaWVyKCk7CisJCW1pcHNwbXVfZXZlbnRfdXBkYXRlKGV2ZW50LCBod2MsIGh3Yy0+aWR4KTsKKwkJaHdjLT5zdGF0ZSB8PSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7CisJfQorfQorCitzdGF0aWMgaW50IG1pcHNwbXVfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJaW50IGlkeDsKKwlpbnQgZXJyID0gMDsKKworCXBlcmZfcG11X2Rpc2FibGUoZXZlbnQtPnBtdSk7CisKKwkvKiBUbyBsb29rIGZvciBhIGZyZWUgY291bnRlciBmb3IgdGhpcyBldmVudC4gKi8KKwlpZHggPSBtaXBzeHhfcG11X2FsbG9jX2NvdW50ZXIoY3B1YywgaHdjKTsKKwlpZiAoaWR4IDwgMCkgeworCQllcnIgPSBpZHg7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgYW4gZXZlbnQgaW4gdGhlIGNvdW50ZXIgd2UgYXJlIGdvaW5nIHRvIHVzZSB0aGVuCisJICogbWFrZSBzdXJlIGl0IGlzIGRpc2FibGVkLgorCSAqLworCWV2ZW50LT5ody5pZHggPSBpZHg7CisJbWlwc3h4X3BtdV9kaXNhYmxlX2V2ZW50KGlkeCk7CisJY3B1Yy0+ZXZlbnRzW2lkeF0gPSBldmVudDsKKworCWh3Yy0+c3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7CisJaWYgKGZsYWdzICYgUEVSRl9FRl9TVEFSVCkKKwkJbWlwc3BtdV9zdGFydChldmVudCwgUEVSRl9FRl9SRUxPQUQpOworCisJLyogUHJvcGFnYXRlIG91ciBjaGFuZ2VzIHRvIHRoZSB1c2Vyc3BhY2UgbWFwcGluZy4gKi8KKwlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisKK291dDoKKwlwZXJmX3BtdV9lbmFibGUoZXZlbnQtPnBtdSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4ID0gaHdjLT5pZHg7CisKKwlXQVJOX09OKGlkeCA8IDAgfHwgaWR4ID49IG1pcHNwbXUubnVtX2NvdW50ZXJzKTsKKworCW1pcHNwbXVfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOworCWNwdWMtPmV2ZW50c1tpZHhdID0gTlVMTDsKKwljbGVhcl9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spOworCisJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBtaXBzcG11X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJLyogRG9uJ3QgcmVhZCBkaXNhYmxlZCBjb3VudGVycyEgKi8KKwlpZiAoaHdjLT5pZHggPCAwKQorCQlyZXR1cm47CisKKwltaXBzcG11X2V2ZW50X3VwZGF0ZShldmVudCwgaHdjLCBod2MtPmlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNwbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwl3cml0ZV91bmxvY2soJnBtdWludF9yd2xvY2spOworI2VuZGlmCisJcmVzdW1lX2xvY2FsX2NvdW50ZXJzKCk7Cit9CisKKy8qCisgKiBNSVBTIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGNhbiBiZSBwZXItVEMuIFRoZSBjb250cm9sIHJlZ2lzdGVycyBjYW4KKyAqIG5vdCBiZSBkaXJlY3RseSBhY2Nlc3NlZCBhY2Nyb3NzIENQVXMuIEhlbmNlIGlmIHdlIHdhbnQgdG8gZG8gZ2xvYmFsCisgKiBjb250cm9sLCB3ZSBuZWVkIGNyb3NzIENQVSBjYWxscy4gb25fZWFjaF9jcHUoKSBjYW4gaGVscCB1cywgYnV0IHdlCisgKiBjYW4gbm90IG1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gU28KKyAqIGhlcmUgd2UgcGF1c2UgbG9jYWwgY291bnRlcnMgYW5kIHRoZW4gZ3JhYiBhIHJ3bG9jayBhbmQgbGVhdmUgdGhlCisgKiBjb3VudGVycyBvbiBvdGhlciBDUFVzIGFsb25lLiBJZiBhbnkgY291bnRlciBpbnRlcnJ1cHQgcmFpc2VzIHdoaWxlCisgKiB3ZSBvd24gdGhlIHdyaXRlIGxvY2ssIHNpbXBseSBwYXVzZSBsb2NhbCBjb3VudGVycyBvbiB0aGF0IENQVSBhbmQKKyAqIHNwaW4gaW4gdGhlIGhhbmRsZXIuIEFsc28gd2Uga25vdyB3ZSB3b24ndCBiZSBzd2l0Y2hlZCB0byBhbm90aGVyCisgKiBDUFUgYWZ0ZXIgcGF1c2luZyBsb2NhbCBjb3VudGVycyBhbmQgYmVmb3JlIGdyYWJiaW5nIHRoZSBsb2NrLgorICovCitzdGF0aWMgdm9pZCBtaXBzcG11X2Rpc2FibGUoc3RydWN0IHBtdSAqcG11KQoreworCXBhdXNlX2xvY2FsX2NvdW50ZXJzKCk7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCisJd3JpdGVfbG9jaygmcG11aW50X3J3bG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIGF0b21pY190IGFjdGl2ZV9ldmVudHMgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocG11X3Jlc2VydmVfbXV0ZXgpOworc3RhdGljIGludCAoKnNhdmVfcGVyZl9pcnEpKHZvaWQpOworCitzdGF0aWMgaW50IG1pcHNwbXVfZ2V0X2lycSh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAobWlwc3BtdS5pcnEgPj0gMCkgeworCQkvKiBSZXF1ZXN0IG15IG93biBpcnEgaGFuZGxlci4gKi8KKwkJZXJyID0gcmVxdWVzdF9pcnEobWlwc3BtdS5pcnEsIG1pcHN4eF9wbXVfaGFuZGxlX2lycSwKKwkJCUlSUUZfUEVSQ1BVIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkJCSJtaXBzX3BlcmZfcG11IiwgTlVMTCk7CisJCWlmIChlcnIpIHsKKwkJCXByX3dhcm5pbmcoIlVuYWJsZSB0byByZXF1ZXN0IElSUSVkIGZvciBNSVBTICIKKwkJCSAgICJwZXJmb3JtYW5jZSBjb3VudGVycyFcbiIsIG1pcHNwbXUuaXJxKTsKKwkJfQorCX0gZWxzZSBpZiAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKSB7CisJCS8qCisJCSAqIFdlIGFyZSBzaGFyaW5nIHRoZSBpcnEgbnVtYmVyIHdpdGggdGhlIHRpbWVyIGludGVycnVwdC4KKwkJICovCisJCXNhdmVfcGVyZl9pcnEgPSBwZXJmX2lycTsKKwkJcGVyZl9pcnEgPSBtaXBzeHhfcG11X2hhbmRsZV9zaGFyZWRfaXJxOworCQllcnIgPSAwOworCX0gZWxzZSB7CisJCXByX3dhcm5pbmcoIlRoZSBwbGF0Zm9ybSBoYXNuJ3QgcHJvcGVybHkgZGVmaW5lZCBpdHMgIgorCQkJImludGVycnVwdCBjb250cm9sbGVyLlxuIik7CisJCWVyciA9IC1FTk9FTlQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbWlwc3BtdV9mcmVlX2lycSh2b2lkKQoreworCWlmIChtaXBzcG11LmlycSA+PSAwKQorCQlmcmVlX2lycShtaXBzcG11LmlycSwgTlVMTCk7CisJZWxzZSBpZiAoY3AwX3BlcmZjb3VudF9pcnEgPCAwKQorCQlwZXJmX2lycSA9IHNhdmVfcGVyZl9pcnE7Cit9CisKKy8qCisgKiBtaXBzeHgvcm05MDAwL2xvb25nc29uMiBoYXZlIGRpZmZlcmVudCBwZXJmb3JtYW5jZSBjb3VudGVycywgdGhleSBoYXZlCisgKiBzcGVjaWZpYyBsb3ctbGV2ZWwgaW5pdCByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgcmVzZXRfY291bnRlcnModm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgX19od19wZXJmX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKworc3RhdGljIHZvaWQgaHdfcGVyZl9ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmYWN0aXZlX2V2ZW50cywKKwkJCQkmcG11X3Jlc2VydmVfbXV0ZXgpKSB7CisJCS8qCisJCSAqIFdlIG11c3Qgbm90IGNhbGwgdGhlIGRlc3Ryb3kgZnVuY3Rpb24gd2l0aCBpbnRlcnJ1cHRzCisJCSAqIGRpc2FibGVkLgorCQkgKi8KKwkJb25fZWFjaF9jcHUocmVzZXRfY291bnRlcnMsCisJCQkodm9pZCAqKShsb25nKW1pcHNwbXUubnVtX2NvdW50ZXJzLCAxKTsKKwkJbWlwc3BtdV9mcmVlX2lycSgpOworCQltdXRleF91bmxvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWlwc3BtdV9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoZXZlbnQtPmF0dHIudHlwZSkgeworCWNhc2UgUEVSRl9UWVBFX1JBVzoKKwljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoZXZlbnQtPmNwdSA+PSBucl9jcHVtYXNrX2JpdHMgfHwKKwkgICAgKGV2ZW50LT5jcHUgPj0gMCAmJiAhY3B1X29ubGluZShldmVudC0+Y3B1KSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZhY3RpdmVfZXZlbnRzKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJmFjdGl2ZV9ldmVudHMpID4gTUlQU19NQVhfSFdFVkVOVFMpIHsKKwkJCWF0b21pY19kZWMoJmFjdGl2ZV9ldmVudHMpOworCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKworCQltdXRleF9sb2NrKCZwbXVfcmVzZXJ2ZV9tdXRleCk7CisJCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2V2ZW50cykgPT0gMCkKKwkJCWVyciA9IG1pcHNwbXVfZ2V0X2lycSgpOworCisJCWlmICghZXJyKQorCQkJYXRvbWljX2luYygmYWN0aXZlX2V2ZW50cyk7CisJCW11dGV4X3VubG9jaygmcG11X3Jlc2VydmVfbXV0ZXgpOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBfX2h3X3BlcmZfZXZlbnRfaW5pdChldmVudCk7CisJaWYgKGVycikKKwkJaHdfcGVyZl9ldmVudF9kZXN0cm95KGV2ZW50KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG11IHBtdSA9IHsKKwkucG11X2VuYWJsZQk9IG1pcHNwbXVfZW5hYmxlLAorCS5wbXVfZGlzYWJsZQk9IG1pcHNwbXVfZGlzYWJsZSwKKwkuZXZlbnRfaW5pdAk9IG1pcHNwbXVfZXZlbnRfaW5pdCwKKwkuYWRkCQk9IG1pcHNwbXVfYWRkLAorCS5kZWwJCT0gbWlwc3BtdV9kZWwsCisJLnN0YXJ0CQk9IG1pcHNwbXVfc3RhcnQsCisJLnN0b3AJCT0gbWlwc3BtdV9zdG9wLAorCS5yZWFkCQk9IG1pcHNwbXVfcmVhZCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlwc3BtdV9wZXJmX2V2ZW50X2VuY29kZShjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpwZXYpCit7CisvKgorICogVG9wIDggYml0cyBmb3IgcmFuZ2UsIG5leHQgMTYgYml0cyBmb3IgY250cl9tYXNrLCBsb3dlc3QgOCBiaXRzIGZvcgorICogZXZlbnRfaWQuCisgKi8KKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwlyZXR1cm4gKCh1bnNpZ25lZCBpbnQpcGV2LT5yYW5nZSA8PCAyNCkgfAorCQkocGV2LT5jbnRyX21hc2sgJiAweGZmZmYwMCkgfAorCQkocGV2LT5ldmVudF9pZCAmIDB4ZmYpOworI2Vsc2UKKwlyZXR1cm4gKHBldi0+Y250cl9tYXNrICYgMHhmZmZmMDApIHwKKwkJKHBldi0+ZXZlbnRfaWQgJiAweGZmKTsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqbWlwc3BtdV9tYXBfZ2VuZXJhbF9ldmVudChpbnQgaWR4KQoreworCWNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldjsKKworCXBldiA9ICgoKm1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXApW2lkeF0uZXZlbnRfaWQgPT0KKwkJVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCA/IEVSUl9QVFIoLUVPUE5PVFNVUFApIDoKKwkJJigqbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcClbaWR4XSk7CisKKwlyZXR1cm4gcGV2OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCAqbWlwc3BtdV9tYXBfY2FjaGVfZXZlbnQodTY0IGNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSwgY2FjaGVfb3AsIGNhY2hlX3Jlc3VsdDsKKwljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpwZXY7CisKKwljYWNoZV90eXBlID0gKGNvbmZpZyA+PiAwKSAmIDB4ZmY7CisJaWYgKGNhY2hlX3R5cGUgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY2FjaGVfb3AgPSAoY29uZmlnID4+IDgpICYgMHhmZjsKKwlpZiAoY2FjaGVfb3AgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY2FjaGVfcmVzdWx0ID0gKGNvbmZpZyA+PiAxNikgJiAweGZmOworCWlmIChjYWNoZV9yZXN1bHQgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXBldiA9ICYoKCptaXBzcG11LmNhY2hlX2V2ZW50X21hcCkKKwkJCQkJW2NhY2hlX3R5cGVdCisJCQkJCVtjYWNoZV9vcF0KKwkJCQkJW2NhY2hlX3Jlc3VsdF0pOworCisJaWYgKHBldi0+ZXZlbnRfaWQgPT0gVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCisJcmV0dXJuIHBldjsKKworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2V2ZW50KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgZmFrZV9od2MgPSBldmVudC0+aHc7CisKKwkvKiBBbGxvdyBtaXhlZCBldmVudCBncm91cC4gU28gcmV0dXJuIDEgdG8gcGFzcyB2YWxpZGF0aW9uLiAqLworCWlmIChldmVudC0+cG11ICE9ICZwbXUgfHwgZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQorCQlyZXR1cm4gMTsKKworCXJldHVybiBtaXBzeHhfcG11X2FsbG9jX2NvdW50ZXIoY3B1YywgJmZha2VfaHdjKSA+PSAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2dyb3VwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZywgKmxlYWRlciA9IGV2ZW50LT5ncm91cF9sZWFkZXI7CisJc3RydWN0IGNwdV9od19ldmVudHMgZmFrZV9jcHVjOworCisJbWVtc2V0KCZmYWtlX2NwdWMsIDAsIHNpemVvZihmYWtlX2NwdWMpKTsKKworCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgbGVhZGVyKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKKwkJaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9jcHVjLCBzaWJsaW5nKSkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgZXZlbnQpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGlzIG5lZWRlZCBieSBzcGVjaWZpYyBpcnEgaGFuZGxlcnMgaW4gcGVyZl9ldmVudF8qLmMgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9hc3NvY2lhdGVkX2V2ZW50KHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorCQkJCSAgICBpbnQgaWR4LCBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2lkeF07CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwltaXBzcG11X2V2ZW50X3VwZGF0ZShldmVudCwgaHdjLCBpZHgpOworCWRhdGEtPnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKKwlpZiAoIW1pcHNwbXVfZXZlbnRfc2V0X3BlcmlvZChldmVudCwgaHdjLCBpZHgpKQorCQlyZXR1cm47CisKKwlpZiAocGVyZl9ldmVudF9vdmVyZmxvdyhldmVudCwgZGF0YSwgcmVncykpCisJCW1pcHN4eF9wbXVfZGlzYWJsZV9ldmVudChpZHgpOworfQorCisKK3N0YXRpYyBpbnQgX19uX2NvdW50ZXJzKHZvaWQpCiB7CiAJaWYgKCEocmVhZF9jMF9jb25maWcxKCkgJiBNX0NPTkZJRzFfUEMpKQogCQlyZXR1cm4gMDsKQEAgLTEzNSw3ICs3NzcsNyBAQAogCXJldHVybiA0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBuX2NvdW50ZXJzKHZvaWQpCitzdGF0aWMgaW50IG5fY291bnRlcnModm9pZCkKIHsKIAlpbnQgY291bnRlcnM7CiAKQEAgLTE2MSw5OCArODAzLDIwIEBACiAJaW50IGNvdW50ZXJzID0gKGludCkobG9uZylhcmc7CiAJc3dpdGNoIChjb3VudGVycykgewogCWNhc2UgNDoKLQkJd19jMF9wZXJmY3RybDMoMCk7Ci0JCXdfYzBfcGVyZmNudHIzKDApOworCQltaXBzeHhfcG11X3dyaXRlX2NvbnRyb2woMywgMCk7CisJCW1pcHNwbXUud3JpdGVfY291bnRlcigzLCAwKTsKIAljYXNlIDM6Ci0JCXdfYzBfcGVyZmN0cmwyKDApOwotCQl3X2MwX3BlcmZjbnRyMigwKTsKKwkJbWlwc3h4X3BtdV93cml0ZV9jb250cm9sKDIsIDApOworCQltaXBzcG11LndyaXRlX2NvdW50ZXIoMiwgMCk7CiAJY2FzZSAyOgotCQl3X2MwX3BlcmZjdHJsMSgwKTsKLQkJd19jMF9wZXJmY250cjEoMCk7CisJCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbCgxLCAwKTsKKwkJbWlwc3BtdS53cml0ZV9jb3VudGVyKDEsIDApOwogCWNhc2UgMToKLQkJd19jMF9wZXJmY3RybDAoMCk7Ci0JCXdfYzBfcGVyZmNudHIwKDApOworCQltaXBzeHhfcG11X3dyaXRlX2NvbnRyb2woMCwgMCk7CisJCW1pcHNwbXUud3JpdGVfY291bnRlcigwLCAwKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0Ci1taXBzeHhfcG11X3JlYWRfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4KQotewotCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSAwOgotCQlyZXR1cm4gcl9jMF9wZXJmY250cjAoKTsKLQljYXNlIDE6Ci0JCXJldHVybiByX2MwX3BlcmZjbnRyMSgpOwotCWNhc2UgMjoKLQkJcmV0dXJuIHJfYzBfcGVyZmNudHIyKCk7Ci0JY2FzZSAzOgotCQlyZXR1cm4gcl9jMF9wZXJmY250cjMoKTsKLQlkZWZhdWx0OgotCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgcGVyZm9ybWFuY2UgY291bnRlciBudW1iZXIgKCVkKVxuIiwgaWR4KTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1pcHN4eF9wbXVfd3JpdGVfY291bnRlcih1bnNpZ25lZCBpbnQgaWR4LCB1NjQgdmFsKQotewotCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSAwOgotCQl3X2MwX3BlcmZjbnRyMCh2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAxOgotCQl3X2MwX3BlcmZjbnRyMSh2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAyOgotCQl3X2MwX3BlcmZjbnRyMih2YWwpOwotCQlyZXR1cm47Ci0JY2FzZSAzOgotCQl3X2MwX3BlcmZjbnRyMyh2YWwpOwotCQlyZXR1cm47Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotbWlwc3h4X3BtdV9yZWFkX2NvbnRyb2wodW5zaWduZWQgaW50IGlkeCkKLXsKLQlzd2l0Y2ggKGlkeCkgewotCWNhc2UgMDoKLQkJcmV0dXJuIHJfYzBfcGVyZmN0cmwwKCk7Ci0JY2FzZSAxOgotCQlyZXR1cm4gcl9jMF9wZXJmY3RybDEoKTsKLQljYXNlIDI6Ci0JCXJldHVybiByX2MwX3BlcmZjdHJsMigpOwotCWNhc2UgMzoKLQkJcmV0dXJuIHJfYzBfcGVyZmN0cmwzKCk7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIHBlcmZvcm1hbmNlIGNvdW50ZXIgbnVtYmVyICglZClcbiIsIGlkeCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1taXBzeHhfcG11X3dyaXRlX2NvbnRyb2wodW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzd2l0Y2ggKGlkeCkgewotCWNhc2UgMDoKLQkJd19jMF9wZXJmY3RybDAodmFsKTsKLQkJcmV0dXJuOwotCWNhc2UgMToKLQkJd19jMF9wZXJmY3RybDEodmFsKTsKLQkJcmV0dXJuOwotCWNhc2UgMjoKLQkJd19jMF9wZXJmY3RybDIodmFsKTsKLQkJcmV0dXJuOwotCWNhc2UgMzoKLQkJd19jMF9wZXJmY3RybDModmFsKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotc3RhdGljIERFRklORV9SV0xPQ0socG11aW50X3J3bG9jayk7Ci0jZW5kaWYKLQogLyogMjRLLzM0Sy8xMDA0SyBjb3JlcyBjYW4gc2hhcmUgdGhlIHNhbWUgZXZlbnQgbWFwLiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgbWlwc3h4Y29yZV9ldmVudF9tYXAKIAkJCQlbUEVSRl9DT1VOVF9IV19NQVhdID0gewpAQCAtMjc3LDYgKzg0MSwxNiBAQAogCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdID0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBvY3Rlb25fZXZlbnRfbWFwW1BFUkZfQ09VTlRfSFdfTUFYXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXSA9IHsgMHgwMSwgQ05UUl9BTEwgfSwKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdID0geyAweDAzLCBDTlRSX0FMTCB9LAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdID0geyAweDJiLCBDTlRSX0FMTCB9LAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10gPSB7IDB4MmUsIENOVFJfQUxMICB9LAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdID0geyAweDA4LCBDTlRSX0FMTCB9LAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdID0geyAweDA5LCBDTlRSX0FMTCB9LAorCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdID0geyAweDI1LCBDTlRSX0FMTCB9LAorfTsKKwogLyogMjRLLzM0Sy8xMDA0SyBjb3JlcyBjYW4gc2hhcmUgdGhlIHNhbWUgY2FjaGUgZXZlbnQgbWFwLiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgbWlwc3h4Y29yZV9jYWNoZV9tYXAKIAkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCkBAIC01MTAsMTAgKzEwODQsMTA1IEBACiB9LAogfTsKIAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfcGVyZl9ldmVudCBvY3Rlb25fY2FjaGVfbWFwCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9IHsKK1tDKEwxRCldID0geworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyAweDJiLCBDTlRSX0FMTCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyAweDJlLCBDTlRSX0FMTCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyAweDMwLCBDTlRSX0FMTCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAorW0MoTDFJKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IDB4MTgsIENOVFJfQUxMIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IDB4MTksIENOVFJfQUxMIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorfSwKK1tDKExMKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCisJW0MoT1BfV1JJVEUpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKK30sCitbQyhEVExCKV0gPSB7CisJLyoKKwkgKiBPbmx5IGdlbmVyYWwgRFRMQiBtaXNzZXMgYXJlIGNvdW50ZWQgdXNlIHRoZSBzYW1lIGV2ZW50IGZvcgorCSAqIHJlYWQgYW5kIHdyaXRlLgorCSAqLworCVtDKE9QX1JFQUQpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IDB4MzUsIENOVFJfQUxMIH0sCisJfSwKKwlbQyhPUF9XUklURSldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgMHgzNSwgQ05UUl9BTEwgfSwKKwl9LAorCVtDKE9QX1BSRUZFVENIKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKK30sCitbQyhJVExCKV0gPSB7CisJW0MoT1BfUkVBRCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgMHgzNywgQ05UUl9BTEwgfSwKKwl9LAorCVtDKE9QX1dSSVRFKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9QUkVGRVRDSCldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCit9LAorW0MoQlBVKV0gPSB7CisJLyogVXNpbmcgdGhlIHNhbWUgY29kZSBmb3IgKkhXX0JSQU5DSCogKi8KKwlbQyhPUF9SRUFEKV0gPSB7CisJCVtDKFJFU1VMVF9BQ0NFU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCQlbQyhSRVNVTFRfTUlTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJfSwKKwlbQyhPUF9XUklURSldID0geworCQlbQyhSRVNVTFRfQUNDRVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwkJW0MoUkVTVUxUX01JU1MpXQk9IHsgVU5TVVBQT1JURURfUEVSRl9FVkVOVF9JRCB9LAorCX0sCisJW0MoT1BfUFJFRkVUQ0gpXSA9IHsKKwkJW0MoUkVTVUxUX0FDQ0VTUyldCT0geyBVTlNVUFBPUlRFRF9QRVJGX0VWRU5UX0lEIH0sCisJCVtDKFJFU1VMVF9NSVNTKV0JPSB7IFVOU1VQUE9SVEVEX1BFUkZfRVZFTlRfSUQgfSwKKwl9LAorfSwKK307CisKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKLXN0YXRpYyB2b2lkCi1jaGVja19hbmRfY2FsY19yYW5nZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpwZXYpCitzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FsY19yYW5nZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKIHsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIApAQCAtNTM2LDkgKzEyMDUsOCBAQAogCQlod2MtPmNvbmZpZ19iYXNlIHw9IE1fVENfRU5fQUxMOwogfQogI2Vsc2UKLXN0YXRpYyB2b2lkCi1jaGVja19hbmRfY2FsY19yYW5nZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCi0JCQljb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpwZXYpCitzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FsY19yYW5nZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKnBldikKIHsKIH0KICNlbmRpZgpAQCAtNTYwLDcgKzEyMjgsNyBAQAogCX0gZWxzZSBpZiAoUEVSRl9UWVBFX1JBVyA9PSBldmVudC0+YXR0ci50eXBlKSB7CiAJCS8qIFdlIGFyZSB3b3JraW5nIG9uIHRoZSBnbG9iYWwgcmF3IGV2ZW50LiAqLwogCQltdXRleF9sb2NrKCZyYXdfZXZlbnRfbXV0ZXgpOwotCQlwZXYgPSBtaXBzcG11LT5tYXBfcmF3X2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZyk7CisJCXBldiA9IG1pcHNwbXUubWFwX3Jhd19ldmVudChldmVudC0+YXR0ci5jb25maWcpOwogCX0gZWxzZSB7CiAJCS8qIFRoZSBldmVudCB0eXBlIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuICovCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTYwNSw3ICsxMjczLDcgQEAKIAlod2MtPmNvbmZpZyA9IDA7CiAKIAlpZiAoIWh3Yy0+c2FtcGxlX3BlcmlvZCkgewotCQlod2MtPnNhbXBsZV9wZXJpb2QgID0gTUFYX1BFUklPRDsKKwkJaHdjLT5zYW1wbGVfcGVyaW9kICA9IG1pcHNwbXUubWF4X3BlcmlvZDsKIAkJaHdjLT5sYXN0X3BlcmlvZCAgICA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKIAkJbG9jYWw2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CiAJfQpAQCAtNjE4LDcwICsxMjg2LDQ3IEBACiAJfQogCiAJZXZlbnQtPmRlc3Ryb3kgPSBod19wZXJmX2V2ZW50X2Rlc3Ryb3k7Ci0KIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBwYXVzZV9sb2NhbF9jb3VudGVycyh2b2lkKQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JaW50IGNvdW50ZXJzID0gbWlwc3BtdS0+bnVtX2NvdW50ZXJzOworCWludCBjdHIgPSBtaXBzcG11Lm51bV9jb3VudGVyczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXN3aXRjaCAoY291bnRlcnMpIHsKLQljYXNlIDQ6Ci0JCWNwdWMtPnNhdmVkX2N0cmxbM10gPSByX2MwX3BlcmZjdHJsMygpOwotCQl3X2MwX3BlcmZjdHJsMyhjcHVjLT5zYXZlZF9jdHJsWzNdICYKLQkJCX5NX1BFUkZDVExfQ09VTlRfRVZFTlRfV0hFTkVWRVIpOwotCWNhc2UgMzoKLQkJY3B1Yy0+c2F2ZWRfY3RybFsyXSA9IHJfYzBfcGVyZmN0cmwyKCk7Ci0JCXdfYzBfcGVyZmN0cmwyKGNwdWMtPnNhdmVkX2N0cmxbMl0gJgotCQkJfk1fUEVSRkNUTF9DT1VOVF9FVkVOVF9XSEVORVZFUik7Ci0JY2FzZSAyOgotCQljcHVjLT5zYXZlZF9jdHJsWzFdID0gcl9jMF9wZXJmY3RybDEoKTsKLQkJd19jMF9wZXJmY3RybDEoY3B1Yy0+c2F2ZWRfY3RybFsxXSAmCi0JCQl+TV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSKTsKLQljYXNlIDE6Ci0JCWNwdWMtPnNhdmVkX2N0cmxbMF0gPSByX2MwX3BlcmZjdHJsMCgpOwotCQl3X2MwX3BlcmZjdHJsMChjcHVjLT5zYXZlZF9jdHJsWzBdICYKLQkJCX5NX1BFUkZDVExfQ09VTlRfRVZFTlRfV0hFTkVWRVIpOwotCX0KKwlkbyB7CisJCWN0ci0tOworCQljcHVjLT5zYXZlZF9jdHJsW2N0cl0gPSBtaXBzeHhfcG11X3JlYWRfY29udHJvbChjdHIpOworCQltaXBzeHhfcG11X3dyaXRlX2NvbnRyb2woY3RyLCBjcHVjLT5zYXZlZF9jdHJsW2N0cl0gJgorCQkJCQkgfk1fUEVSRkNUTF9DT1VOVF9FVkVOVF9XSEVORVZFUik7CisJfSB3aGlsZSAoY3RyID4gMCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCByZXN1bWVfbG9jYWxfY291bnRlcnModm9pZCkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19ldmVudHMpOwotCWludCBjb3VudGVycyA9IG1pcHNwbXUtPm51bV9jb3VudGVyczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjdHIgPSBtaXBzcG11Lm51bV9jb3VudGVyczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzd2l0Y2ggKGNvdW50ZXJzKSB7Ci0JY2FzZSA0OgotCQl3X2MwX3BlcmZjdHJsMyhjcHVjLT5zYXZlZF9jdHJsWzNdKTsKLQljYXNlIDM6Ci0JCXdfYzBfcGVyZmN0cmwyKGNwdWMtPnNhdmVkX2N0cmxbMl0pOwotCWNhc2UgMjoKLQkJd19jMF9wZXJmY3RybDEoY3B1Yy0+c2F2ZWRfY3RybFsxXSk7Ci0JY2FzZSAxOgotCQl3X2MwX3BlcmZjdHJsMChjcHVjLT5zYXZlZF9jdHJsWzBdKTsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWRvIHsKKwkJY3RyLS07CisJCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbChjdHIsIGNwdWMtPnNhdmVkX2N0cmxbY3RyXSk7CisJfSB3aGlsZSAoY3RyID4gMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWlwc3h4X3BtdV9oYW5kbGVfc2hhcmVkX2lycSh2b2lkKQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKLQl1bnNpZ25lZCBpbnQgY291bnRlcnMgPSBtaXBzcG11LT5udW1fY291bnRlcnM7Ci0JdW5zaWduZWQgaW50IGNvdW50ZXI7CisJdW5zaWduZWQgaW50IGNvdW50ZXJzID0gbWlwc3BtdS5udW1fY291bnRlcnM7CisJdTY0IGNvdW50ZXI7CiAJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAogCWlmIChjcHVfaGFzX21pcHNfcjIgJiYgIShyZWFkX2MwX2NhdXNlKCkgJiAoMSA8PCAyNikpKQogCQlyZXR1cm4gaGFuZGxlZDsKLQogCS8qCiAJICogRmlyc3Qgd2UgcGF1c2UgdGhlIGxvY2FsIGNvdW50ZXJzLCBzbyB0aGF0IHdoZW4gd2UgYXJlIGxvY2tlZAogCSAqIGhlcmUsIHRoZSBjb3VudGVycyBhcmUgYWxsIHBhdXNlZC4gV2hlbiBpdCBnZXRzIGxvY2tlZCBkdWUgdG8KQEAgLTcwMiwxMyArMTM0Nyw5IEBACiAjZGVmaW5lIEhBTkRMRV9DT1VOVEVSKG4pCQkJCQkJXAogCWNhc2UgbiArIDE6CQkJCQkJCVwKIAkJaWYgKHRlc3RfYml0KG4sIGNwdWMtPnVzZWRfbWFzaykpIHsJCQlcCi0JCQljb3VudGVyID0gcl9jMF9wZXJmY250ciAjIyBuKCk7CQkJXAotCQkJaWYgKGNvdW50ZXIgJiBNX0NPVU5URVJfT1ZFUkZMT1cpIHsJCVwKLQkJCQl3X2MwX3BlcmZjbnRyICMjIG4oY291bnRlciAmCQlcCi0JCQkJCQlWQUxJRF9DT1VOVCk7CQlcCi0JCQkJaWYgKHRlc3RfYW5kX2NoYW5nZV9iaXQobiwgY3B1Yy0+bXNicykpCVwKLQkJCQkJaGFuZGxlX2Fzc29jaWF0ZWRfZXZlbnQoY3B1YywJXAotCQkJCQkJbiwgJmRhdGEsIHJlZ3MpOwlcCisJCQljb3VudGVyID0gbWlwc3BtdS5yZWFkX2NvdW50ZXIobik7CQlcCisJCQlpZiAoY291bnRlciAmIG1pcHNwbXUub3ZlcmZsb3cpIHsJCVwKKwkJCQloYW5kbGVfYXNzb2NpYXRlZF9ldmVudChjcHVjLCBuLCAmZGF0YSwgcmVncyk7IFwKIAkJCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CQkJXAogCQkJfQkJCQkJCVwKIAkJfQpAQCAtNzMzLDEwNCArMTM3NCwxMSBAQAogCXJldHVybiBoYW5kbGVkOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QKLW1pcHN4eF9wbXVfaGFuZGxlX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWlwc3h4X3BtdV9oYW5kbGVfaXJxKGludCBpcnEsIHZvaWQgKmRldikKIHsKIAlyZXR1cm4gbWlwc3h4X3BtdV9oYW5kbGVfc2hhcmVkX2lycSgpOwogfQogCi1zdGF0aWMgdm9pZCBtaXBzeHhfcG11X3N0YXJ0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01QCi0Jd3JpdGVfdW5sb2NrKCZwbXVpbnRfcndsb2NrKTsKLSNlbmRpZgotCXJlc3VtZV9sb2NhbF9jb3VudGVycygpOwotfQotCi0vKgotICogTUlQUyBwZXJmb3JtYW5jZSBjb3VudGVycyBjYW4gYmUgcGVyLVRDLiBUaGUgY29udHJvbCByZWdpc3RlcnMgY2FuCi0gKiBub3QgYmUgZGlyZWN0bHkgYWNjZXNzZWQgYWNyb3NzIENQVXMuIEhlbmNlIGlmIHdlIHdhbnQgdG8gZG8gZ2xvYmFsCi0gKiBjb250cm9sLCB3ZSBuZWVkIGNyb3NzIENQVSBjYWxscy4gb25fZWFjaF9jcHUoKSBjYW4gaGVscCB1cywgYnV0IHdlCi0gKiBjYW4gbm90IG1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gU28KLSAqIGhlcmUgd2UgcGF1c2UgbG9jYWwgY291bnRlcnMgYW5kIHRoZW4gZ3JhYiBhIHJ3bG9jayBhbmQgbGVhdmUgdGhlCi0gKiBjb3VudGVycyBvbiBvdGhlciBDUFVzIGFsb25lLiBJZiBhbnkgY291bnRlciBpbnRlcnJ1cHQgcmFpc2VzIHdoaWxlCi0gKiB3ZSBvd24gdGhlIHdyaXRlIGxvY2ssIHNpbXBseSBwYXVzZSBsb2NhbCBjb3VudGVycyBvbiB0aGF0IENQVSBhbmQKLSAqIHNwaW4gaW4gdGhlIGhhbmRsZXIuIEFsc28gd2Uga25vdyB3ZSB3b24ndCBiZSBzd2l0Y2hlZCB0byBhbm90aGVyCi0gKiBDUFUgYWZ0ZXIgcGF1c2luZyBsb2NhbCBjb3VudGVycyBhbmQgYmVmb3JlIGdyYWJiaW5nIHRoZSBsb2NrLgotICovCi1zdGF0aWMgdm9pZCBtaXBzeHhfcG11X3N0b3Aodm9pZCkKLXsKLQlwYXVzZV9sb2NhbF9jb3VudGVycygpOwotI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotCXdyaXRlX2xvY2soJnBtdWludF9yd2xvY2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLW1pcHN4eF9wbXVfYWxsb2NfY291bnRlcihzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKLQkJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFdlIG9ubHkgbmVlZCB0byBjYXJlIHRoZSBjb3VudGVyIG1hc2suIFRoZSByYW5nZSBoYXMgYmVlbgotCSAqIGNoZWNrZWQgZGVmaW5pdGVseS4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIGNudHJfbWFzayA9IChod2MtPmV2ZW50X2Jhc2UgPj4gOCkgJiAweGZmZmY7Ci0KLQlmb3IgKGkgPSBtaXBzcG11LT5udW1fY291bnRlcnMgLSAxOyBpID49IDA7IGktLSkgewotCQkvKgotCQkgKiBOb3RlIHRoYXQgc29tZSBNSVBTIHBlcmYgZXZlbnRzIGNhbiBiZSBjb3VudGVkIGJ5IGJvdGgKLQkJICogZXZlbiBhbmQgb2RkIGNvdW50ZXJzLCB3aGVyZXNhcyBtYW55IG90aGVyIGFyZSBvbmx5IGJ5Ci0JCSAqIGV2ZW4gX29yXyBvZGQgY291bnRlcnMuIFRoaXMgaW50cm9kdWNlcyBhbiBpc3N1ZSB0aGF0Ci0JCSAqIHdoZW4gdGhlIGZvcm1lciBraW5kIG9mIGV2ZW50IHRha2VzIHRoZSBjb3VudGVyIHRoZQotCQkgKiBsYXR0ZXIga2luZCBvZiBldmVudCB3YW50cyB0byB1c2UsIHRoZW4gdGhlICJjb3VudGVyCi0JCSAqIGFsbG9jYXRpb24iIGZvciB0aGUgbGF0dGVyIGV2ZW50IHdpbGwgZmFpbC4gSW4gZmFjdCBpZgotCQkgKiB0aGV5IGNhbiBiZSBkeW5hbWljYWxseSBzd2FwcGVkLCB0aGV5IGJvdGggZmVlbCBoYXBweS4KLQkJICogQnV0IGhlcmUgd2UgbGVhdmUgdGhpcyBpc3N1ZSBhbG9uZSBmb3Igbm93LgotCQkgKi8KLQkJaWYgKHRlc3RfYml0KGksICZjbnRyX21hc2spICYmCi0JCQkhdGVzdF9hbmRfc2V0X2JpdChpLCBjcHVjLT51c2VkX21hc2spKQotCQkJcmV0dXJuIGk7Ci0JfQotCi0JcmV0dXJuIC1FQUdBSU47Ci19Ci0KLXN0YXRpYyB2b2lkCi1taXBzeHhfcG11X2VuYWJsZV9ldmVudChzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqZXZ0LCBpbnQgaWR4KQotewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2V2ZW50cyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVdBUk5fT04oaWR4IDwgMCB8fCBpZHggPj0gbWlwc3BtdS0+bnVtX2NvdW50ZXJzKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljcHVjLT5zYXZlZF9jdHJsW2lkeF0gPSBNX1BFUkZDVExfRVZFTlQoZXZ0LT5ldmVudF9iYXNlICYgMHhmZikgfAotCQkoZXZ0LT5jb25maWdfYmFzZSAmIE1fUEVSRkNUTF9DT05GSUdfTUFTSykgfAotCQkvKiBNYWtlIHN1cmUgaW50ZXJydXB0IGVuYWJsZWQuICovCi0JCU1fUEVSRkNUTF9JTlRFUlJVUFRfRU5BQkxFOwotCS8qCi0JICogV2UgZG8gbm90IGFjdHVhbGx5IGxldCB0aGUgY291bnRlciBydW4uIExlYXZlIGl0IHVudGlsIHN0YXJ0KCkuCi0JICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotbWlwc3h4X3BtdV9kaXNhYmxlX2V2ZW50KGludCBpZHgpCi17Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfZXZlbnRzKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JV0FSTl9PTihpZHggPCAwIHx8IGlkeCA+PSBtaXBzcG11LT5udW1fY291bnRlcnMpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWNwdWMtPnNhdmVkX2N0cmxbaWR4XSA9IG1pcHN4eF9wbXVfcmVhZF9jb250cm9sKGlkeCkgJgotCQl+TV9QRVJGQ1RMX0NPVU5UX0VWRU5UX1dIRU5FVkVSOwotCW1pcHN4eF9wbXVfd3JpdGVfY29udHJvbChpZHgsIGNwdWMtPnNhdmVkX2N0cmxbaWR4XSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCiAvKiAyNEsgKi8KICNkZWZpbmUgSVNfVU5TVVBQT1JURURfMjRLX0VWRU5UKHIsIGIpCQkJCQlcCiAJKChiKSA9PSAxMiB8fCAocikgPT0gMTUxIHx8IChyKSA9PSAxNTIgfHwgKGIpID09IDI2IHx8CQlcCkBAIC04OTIsOCArMTQ0MCw3IEBACiAgKiB0aGVuIDEyOCBuZWVkcyB0byBiZSBhZGRlZCB0byAxNSBhcyB0aGUgaW5wdXQgZm9yIHRoZSBldmVudCBjb25maWcsCiAgKiBpLmUuLCAxNDMgKDB4OEYpIHRvIGJlIHVzZWQuCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICoKLW1pcHN4eF9wbXVfbWFwX3Jhd19ldmVudCh1NjQgY29uZmlnKQorc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX3BlcmZfZXZlbnQgKm1pcHN4eF9wbXVfbWFwX3Jhd19ldmVudCh1NjQgY29uZmlnKQogewogCXVuc2lnbmVkIGludCByYXdfaWQgPSBjb25maWcgJiAweGZmOwogCXVuc2lnbmVkIGludCBiYXNlX2lkID0gcmF3X2lkICYgMHg3ZjsKQEAgLTk3MCw0MCArMTUxNyw0NCBAQAogCXJldHVybiAmcmF3X2V2ZW50OwogfQogCi1zdGF0aWMgc3RydWN0IG1pcHNfcG11IG1pcHN4eGNvcmVfcG11ID0gewotCS5oYW5kbGVfaXJxID0gbWlwc3h4X3BtdV9oYW5kbGVfaXJxLAotCS5oYW5kbGVfc2hhcmVkX2lycSA9IG1pcHN4eF9wbXVfaGFuZGxlX3NoYXJlZF9pcnEsCi0JLnN0YXJ0ID0gbWlwc3h4X3BtdV9zdGFydCwKLQkuc3RvcCA9IG1pcHN4eF9wbXVfc3RvcCwKLQkuYWxsb2NfY291bnRlciA9IG1pcHN4eF9wbXVfYWxsb2NfY291bnRlciwKLQkucmVhZF9jb3VudGVyID0gbWlwc3h4X3BtdV9yZWFkX2NvdW50ZXIsCi0JLndyaXRlX2NvdW50ZXIgPSBtaXBzeHhfcG11X3dyaXRlX2NvdW50ZXIsCi0JLmVuYWJsZV9ldmVudCA9IG1pcHN4eF9wbXVfZW5hYmxlX2V2ZW50LAotCS5kaXNhYmxlX2V2ZW50ID0gbWlwc3h4X3BtdV9kaXNhYmxlX2V2ZW50LAotCS5tYXBfcmF3X2V2ZW50ID0gbWlwc3h4X3BtdV9tYXBfcmF3X2V2ZW50LAotCS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2V2ZW50X21hcCwKLQkuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwLAotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19wZXJmX2V2ZW50ICpvY3Rlb25fcG11X21hcF9yYXdfZXZlbnQodTY0IGNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgcmF3X2lkID0gY29uZmlnICYgMHhmZjsKKwl1bnNpZ25lZCBpbnQgYmFzZV9pZCA9IHJhd19pZCAmIDB4N2Y7CiAKLXN0YXRpYyBzdHJ1Y3QgbWlwc19wbXUgbWlwc3h4NzRLY29yZV9wbXUgPSB7Ci0JLmhhbmRsZV9pcnEgPSBtaXBzeHhfcG11X2hhbmRsZV9pcnEsCi0JLmhhbmRsZV9zaGFyZWRfaXJxID0gbWlwc3h4X3BtdV9oYW5kbGVfc2hhcmVkX2lycSwKLQkuc3RhcnQgPSBtaXBzeHhfcG11X3N0YXJ0LAotCS5zdG9wID0gbWlwc3h4X3BtdV9zdG9wLAotCS5hbGxvY19jb3VudGVyID0gbWlwc3h4X3BtdV9hbGxvY19jb3VudGVyLAotCS5yZWFkX2NvdW50ZXIgPSBtaXBzeHhfcG11X3JlYWRfY291bnRlciwKLQkud3JpdGVfY291bnRlciA9IG1pcHN4eF9wbXVfd3JpdGVfY291bnRlciwKLQkuZW5hYmxlX2V2ZW50ID0gbWlwc3h4X3BtdV9lbmFibGVfZXZlbnQsCi0JLmRpc2FibGVfZXZlbnQgPSBtaXBzeHhfcG11X2Rpc2FibGVfZXZlbnQsCi0JLm1hcF9yYXdfZXZlbnQgPSBtaXBzeHhfcG11X21hcF9yYXdfZXZlbnQsCi0JLmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eDc0S2NvcmVfZXZlbnRfbWFwLAotCS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4NzRLY29yZV9jYWNoZV9tYXAsCi19OworCisJcmF3X2V2ZW50LmNudHJfbWFzayA9IENOVFJfQUxMOworCXJhd19ldmVudC5ldmVudF9pZCA9IGJhc2VfaWQ7CisKKwlpZiAoY3VycmVudF9jcHVfdHlwZSgpID09IENQVV9DQVZJVU1fT0NURU9OMikgeworCQlpZiAoYmFzZV9pZCA+IDB4NDIpCisJCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJfSBlbHNlIHsKKwkJaWYgKGJhc2VfaWQgPiAweDNhKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCX0KKworCXN3aXRjaCAoYmFzZV9pZCkgeworCWNhc2UgMHgwMDoKKwljYXNlIDB4MGY6CisJY2FzZSAweDFlOgorCWNhc2UgMHgxZjoKKwljYXNlIDB4MmY6CisJY2FzZSAweDM0OgorCWNhc2UgMHgzYiAuLi4gMHgzZjoKKwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAmcmF3X2V2ZW50OworfQogCiBzdGF0aWMgaW50IF9faW5pdAogaW5pdF9od19wZXJmX2V2ZW50cyh2b2lkKQogewogCWludCBjb3VudGVycywgaXJxOworCWludCBjb3VudGVyX2JpdHM7CiAKIAlwcl9pbmZvKCJQZXJmb3JtYW5jZSBjb3VudGVyczogIik7CiAKQEAgLTEwMzUsMzIgKzE1ODYsMzYgQEAKIAl9CiAjZW5kaWYKIAotCW9uX2VhY2hfY3B1KHJlc2V0X2NvdW50ZXJzLCAodm9pZCAqKShsb25nKWNvdW50ZXJzLCAxKTsKKwltaXBzcG11Lm1hcF9yYXdfZXZlbnQgPSBtaXBzeHhfcG11X21hcF9yYXdfZXZlbnQ7CiAKIAlzd2l0Y2ggKGN1cnJlbnRfY3B1X3R5cGUoKSkgewogCWNhc2UgQ1BVXzI0SzoKLQkJbWlwc3h4Y29yZV9wbXUubmFtZSA9ICJtaXBzLzI0SyI7Ci0JCW1pcHN4eGNvcmVfcG11Lm51bV9jb3VudGVycyA9IGNvdW50ZXJzOwotCQltaXBzeHhjb3JlX3BtdS5pcnEgPSBpcnE7Ci0JCW1pcHNwbXUgPSAmbWlwc3h4Y29yZV9wbXU7CisJCW1pcHNwbXUubmFtZSA9ICJtaXBzLzI0SyI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOwogCQlicmVhazsKIAljYXNlIENQVV8zNEs6Ci0JCW1pcHN4eGNvcmVfcG11Lm5hbWUgPSAibWlwcy8zNEsiOwotCQltaXBzeHhjb3JlX3BtdS5udW1fY291bnRlcnMgPSBjb3VudGVyczsKLQkJbWlwc3h4Y29yZV9wbXUuaXJxID0gaXJxOwotCQltaXBzcG11ID0gJm1pcHN4eGNvcmVfcG11OworCQltaXBzcG11Lm5hbWUgPSAibWlwcy8zNEsiOworCQltaXBzcG11LmdlbmVyYWxfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfZXZlbnRfbWFwOworCQltaXBzcG11LmNhY2hlX2V2ZW50X21hcCA9ICZtaXBzeHhjb3JlX2NhY2hlX21hcDsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfNzRLOgotCQltaXBzeHg3NEtjb3JlX3BtdS5uYW1lID0gIm1pcHMvNzRLIjsKLQkJbWlwc3h4NzRLY29yZV9wbXUubnVtX2NvdW50ZXJzID0gY291bnRlcnM7Ci0JCW1pcHN4eDc0S2NvcmVfcG11LmlycSA9IGlycTsKLQkJbWlwc3BtdSA9ICZtaXBzeHg3NEtjb3JlX3BtdTsKKwkJbWlwc3BtdS5uYW1lID0gIm1pcHMvNzRLIjsKKwkJbWlwc3BtdS5nZW5lcmFsX2V2ZW50X21hcCA9ICZtaXBzeHg3NEtjb3JlX2V2ZW50X21hcDsKKwkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmbWlwc3h4NzRLY29yZV9jYWNoZV9tYXA7CiAJCWJyZWFrOwogCWNhc2UgQ1BVXzEwMDRLOgotCQltaXBzeHhjb3JlX3BtdS5uYW1lID0gIm1pcHMvMTAwNEsiOwotCQltaXBzeHhjb3JlX3BtdS5udW1fY291bnRlcnMgPSBjb3VudGVyczsKLQkJbWlwc3h4Y29yZV9wbXUuaXJxID0gaXJxOwotCQltaXBzcG11ID0gJm1pcHN4eGNvcmVfcG11OworCQltaXBzcG11Lm5hbWUgPSAibWlwcy8xMDA0SyI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmbWlwc3h4Y29yZV9ldmVudF9tYXA7CisJCW1pcHNwbXUuY2FjaGVfZXZlbnRfbWFwID0gJm1pcHN4eGNvcmVfY2FjaGVfbWFwOworCQlicmVhazsKKwljYXNlIENQVV9DQVZJVU1fT0NURU9OOgorCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT05fUExVUzoKKwljYXNlIENQVV9DQVZJVU1fT0NURU9OMjoKKwkJbWlwc3BtdS5uYW1lID0gIm9jdGVvbiI7CisJCW1pcHNwbXUuZ2VuZXJhbF9ldmVudF9tYXAgPSAmb2N0ZW9uX2V2ZW50X21hcDsKKwkJbWlwc3BtdS5jYWNoZV9ldmVudF9tYXAgPSAmb2N0ZW9uX2NhY2hlX21hcDsKKwkJbWlwc3BtdS5tYXBfcmF3X2V2ZW50ID0gb2N0ZW9uX3BtdV9tYXBfcmF3X2V2ZW50OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9jb250KCJFaXRoZXIgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBwZXJmb3JtYW5jZSAiCkBAIC0xMDY4LDE1ICsxNjIzLDMzIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChtaXBzcG11KQotCQlwcl9jb250KCIlcyBQTVUgZW5hYmxlZCwgJWQgY291bnRlcnMgYXZhaWxhYmxlIHRvIGVhY2ggIgotCQkJIkNQVSwgaXJxICVkJXNcbiIsIG1pcHNwbXUtPm5hbWUsIGNvdW50ZXJzLCBpcnEsCi0JCQlpcnEgPCAwID8gIiAoc2hhcmUgd2l0aCB0aW1lciBpbnRlcnJ1cHQpIiA6ICIiKTsKKwltaXBzcG11Lm51bV9jb3VudGVycyA9IGNvdW50ZXJzOworCW1pcHNwbXUuaXJxID0gaXJxOworCisJaWYgKHJlYWRfYzBfcGVyZmN0cmwwKCkgJiBNX1BFUkZDVExfV0lERSkgeworCQltaXBzcG11Lm1heF9wZXJpb2QgPSAoMVVMTCA8PCA2MykgLSAxOworCQltaXBzcG11LnZhbGlkX2NvdW50ID0gKDFVTEwgPDwgNjMpIC0gMTsKKwkJbWlwc3BtdS5vdmVyZmxvdyA9IDFVTEwgPDwgNjM7CisJCW1pcHNwbXUucmVhZF9jb3VudGVyID0gbWlwc3h4X3BtdV9yZWFkX2NvdW50ZXJfNjQ7CisJCW1pcHNwbXUud3JpdGVfY291bnRlciA9IG1pcHN4eF9wbXVfd3JpdGVfY291bnRlcl82NDsKKwkJY291bnRlcl9iaXRzID0gNjQ7CisJfSBlbHNlIHsKKwkJbWlwc3BtdS5tYXhfcGVyaW9kID0gKDFVTEwgPDwgMzEpIC0gMTsKKwkJbWlwc3BtdS52YWxpZF9jb3VudCA9ICgxVUxMIDw8IDMxKSAtIDE7CisJCW1pcHNwbXUub3ZlcmZsb3cgPSAxVUxMIDw8IDMxOworCQltaXBzcG11LnJlYWRfY291bnRlciA9IG1pcHN4eF9wbXVfcmVhZF9jb3VudGVyOworCQltaXBzcG11LndyaXRlX2NvdW50ZXIgPSBtaXBzeHhfcG11X3dyaXRlX2NvdW50ZXI7CisJCWNvdW50ZXJfYml0cyA9IDMyOworCX0KKworCW9uX2VhY2hfY3B1KHJlc2V0X2NvdW50ZXJzLCAodm9pZCAqKShsb25nKWNvdW50ZXJzLCAxKTsKKworCXByX2NvbnQoIiVzIFBNVSBlbmFibGVkLCAlZCAlZC1iaXQgY291bnRlcnMgYXZhaWxhYmxlIHRvIGVhY2ggIgorCQkiQ1BVLCBpcnEgJWQlc1xuIiwgbWlwc3BtdS5uYW1lLCBjb3VudGVycywgY291bnRlcl9iaXRzLCBpcnEsCisJCWlycSA8IDAgPyAiIChzaGFyZSB3aXRoIHRpbWVyIGludGVycnVwdCkiIDogIiIpOwogCiAJcGVyZl9wbXVfcmVnaXN0ZXIoJnBtdSwgImNwdSIsIFBFUkZfVFlQRV9SQVcpOwogCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9pbml0Y2FsbChpbml0X2h3X3BlcmZfZXZlbnRzKTsKLQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzIpLi4uICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGIzMGNiMjUuLmM0N2Y5NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC05LDEzICs5LDEzIEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGhpZW1vIFNldWZlcgogICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9tLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb20uYwppbmRleCA1YjdlYWRlNC4uNmI4YjQyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9tLmMKQEAgLTksNyArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yZXNldC5jIGIvYXJjaC9taXBzL2tlcm5lbC9yZXNldC5jCmluZGV4IDA2MDU2M2EuLjA3ZmM1MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Jlc2V0LmMKQEAgLTcsNyArNyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKaW5kZXggN2E4MGI3Y2QuLjkzMzE2NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jCkBAIC0xOSw3ICsxOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCmluZGV4IDg2NWJjN2EuLjQ3OTIwNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCXN5cwlzeXNfbG9va3VwX2Rjb29raWUJNAogCXN5cwlzeXNfZXBvbGxfY3JlYXRlCTEKIAlzeXMJc3lzX2Vwb2xsX2N0bAkJNAotCXN5cwlzeXNfZXBvbGxfd2FpdAkJMwkvKiA0MjUwICovCisJc3lzCXN5c19lcG9sbF93YWl0CQk0CS8qIDQyNTAgKi8KIAlzeXMJc3lzX3JlbWFwX2ZpbGVfcGFnZXMJNQogCXN5cwlzeXNfc2V0X3RpZF9hZGRyZXNzCTEKIAlzeXMJc3lzX3Jlc3RhcnRfc3lzY2FsbAkwCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKaW5kZXggOGFkMWQ1Ni4uODRhZjI2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwpAQCAtMTIsNyArMTIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zcGlubG9ja190ZXN0LmMgYi9hcmNoL21pcHMva2VybmVsL3NwaW5sb2NrX3Rlc3QuYwppbmRleCBkYTYxMTM0Li4zOWY3YWI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NwaW5sb2NrX3Rlc3QuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NwaW5sb2NrX3Rlc3QuYwpAQCAtMyw3ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IGQ1MmZmNzcuLjFiYTc3NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKaW5kZXggMTA4M2FkNC4uOTlkNzNiNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKaW5kZXggY2JlYTYxOC4uMjYxY2NiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL21pcHMva2VybmVsL3VuYWxpZ25lZC5jCmluZGV4IGViMzE5YjUuLmFlZGI4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdW5hbGlnbmVkLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC91bmFsaWduZWQuYwpAQCAtNzMsNyArNzMsNiBAQAogICogICAgICAgVW5kbyB0aGUgcGFydGlhbCBzdG9yZSBpbiB0aGlzIGNhc2UuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwppbmRleCAzZWZjYjA2Li5iZmExMmE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKQEAgLTI5LDcgKzI5LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BsYXRmb3JtLmMKaW5kZXggZWQwMDdhMi4uNTAyYjA1OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcGxhdGZvcm0uYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxvb25nc29uMl9jcHVmcmVxX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLW9jdGVvbi5jIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKaW5kZXggMTZjNGQyNS4uZGFhODFmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKKysrIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKQEAgLTE2OSw2ICsxNjksMTAgQEAKIAkJb2N0ZW9uX2ZsdXNoX2ljYWNoZV9hbGxfY29yZXModm1hKTsKIH0KIAorc3RhdGljIHZvaWQgb2N0ZW9uX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKQoreworCUJVRygpOworfQogCiAvKioKICAqIFByb2JlIE9jdGVvbidzIGNhY2hlcwpAQCAtMjczLDYgKzI3Nyw4IEBACiAJZmx1c2hfaWNhY2hlX3JhbmdlCQk9IG9jdGVvbl9mbHVzaF9pY2FjaGVfcmFuZ2U7CiAJbG9jYWxfZmx1c2hfaWNhY2hlX3JhbmdlCT0gbG9jYWxfb2N0ZW9uX2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAorCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UJPSBvY3Rlb25fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2U7CisKIAlidWlsZF9jbGVhcl9wYWdlKCk7CiAJYnVpbGRfY29weV9wYWdlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yM2suYyBiL2FyY2gvbWlwcy9tbS9jLXIzay5jCmluZGV4IGU2YjBlZmQuLjA3NjU1ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXIzay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXIzay5jCkBAIC0yOTksNiArMjk5LDExIEBACiAJd3JpdGVfYzBfc3RhdHVzKGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgcjNrX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBzaXplKQoreworCUJVRygpOworfQorCiBzdGF0aWMgdm9pZCByM2tfZG1hX2NhY2hlX3diYWNrX2ludih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJLyogQ2F0Y2ggYmFkIGRyaXZlciBjb2RlICovCkBAIC0zMjMsNiArMzI4LDggQEAKIAlmbHVzaF9pY2FjaGVfcmFuZ2UgPSByM2tfZmx1c2hfaWNhY2hlX3JhbmdlOwogCWxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZSA9IHIza19mbHVzaF9pY2FjaGVfcmFuZ2U7CiAKKwlfX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlID0gcjNrX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlOworCiAJZmx1c2hfY2FjaGVfc2lndHJhbXAgPSByM2tfZmx1c2hfY2FjaGVfc2lndHJhbXA7CiAJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlID0gbG9jYWxfcjNrX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZTsKIAlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSByM2tfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCBiOWFhYmI5Li5hNzlmZTlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtNzIyLDYgKzcyMiwzOSBAQAogCQlyNGtfYmxhc3RfaWNhY2hlKCk7CiB9CiAKK3N0cnVjdCBmbHVzaF9rZXJuZWxfdm1hcF9yYW5nZV9hcmdzIHsKKwl1bnNpZ25lZCBsb25nCXZhZGRyOworCWludAkJc2l6ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9yNGtfZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2Uodm9pZCAqYXJncykKK3sKKwlzdHJ1Y3QgZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2VfYXJncyAqdm1yYSA9IGFyZ3M7CisJdW5zaWduZWQgbG9uZyB2YWRkciA9IHZtcmEtPnZhZGRyOworCWludCBzaXplID0gdm1yYS0+c2l6ZTsKKworCS8qCisJICogQWxpYXNlcyBvbmx5IGFmZmVjdCB0aGUgcHJpbWFyeSBjYWNoZXMgc28gZG9uJ3QgYm90aGVyIHdpdGgKKwkgKiBTLWNhY2hlcyBvciBULWNhY2hlcy4KKwkgKi8KKwlpZiAoY3B1X2hhc19zYWZlX2luZGV4X2NhY2hlb3BzICYmIHNpemUgPj0gZGNhY2hlX3NpemUpCisJCXI0a19ibGFzdF9kY2FjaGUoKTsKKwllbHNlIHsKKwkJUjQ2MDBfSElUX0NBQ0hFT1BfV0FSX0lNUEw7CisJCWJsYXN0X2RjYWNoZV9yYW5nZSh2YWRkciwgdmFkZHIgKyBzaXplKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHI0a19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2VfYXJncyBhcmdzOworCisJYXJncy52YWRkciA9ICh1bnNpZ25lZCBsb25nKSB2YWRkcjsKKwlhcmdzLnNpemUgPSBzaXplOworCisJcjRrX29uX2VhY2hfY3B1KGxvY2FsX3I0a19mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSwgJmFyZ3MpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcm03a19lcnJhdHVtMzEodm9pZCkKIHsKIAljb25zdCB1bnNpZ25lZCBsb25nIGljX2xzaXplID0gMzI7CkBAIC0xNDAzLDYgKzE0MzYsOCBAQAogCWZsdXNoX2NhY2hlX3BhZ2UJPSByNGtfZmx1c2hfY2FjaGVfcGFnZTsKIAlmbHVzaF9jYWNoZV9yYW5nZQk9IHI0a19mbHVzaF9jYWNoZV9yYW5nZTsKIAorCV9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UgPSByNGtfZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2U7CisKIAlmbHVzaF9jYWNoZV9zaWd0cmFtcAk9IHI0a19mbHVzaF9jYWNoZV9zaWd0cmFtcDsKIAlmbHVzaF9pY2FjaGVfYWxsCT0gcjRrX2ZsdXNoX2ljYWNoZV9hbGw7CiAJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlCT0gbG9jYWxfcjRrX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXR4MzkuYyBiL2FyY2gvbWlwcy9tbS9jLXR4MzkuYwppbmRleCBkMzUyZmFkLi5hNDNjMTk3YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2MtdHgzOS5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXR4MzkuYwpAQCAtMjUzLDYgKzI1MywxMSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgdHgzOV9mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZSh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgc2l6ZSkKK3sKKwlCVUcoKTsKK30KKwogc3RhdGljIHZvaWQgdHgzOV9kbWFfY2FjaGVfd2JhY2tfaW52KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgZW5kOwpAQCAtMzk0LDYgKzM5OSw4IEBACiAJCWZsdXNoX2ljYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfaWNhY2hlX3JhbmdlOwogCQlsb2NhbF9mbHVzaF9pY2FjaGVfcmFuZ2UgPSB0eDM5X2ZsdXNoX2ljYWNoZV9yYW5nZTsKIAorCQlfX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlID0gdHgzOV9mbHVzaF9rZXJuZWxfdm1hcF9yYW5nZTsKKwogCQlmbHVzaF9jYWNoZV9zaWd0cmFtcCA9IHR4MzlfZmx1c2hfY2FjaGVfc2lndHJhbXA7CiAJCWxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9IGxvY2FsX3R4MzlfZmx1c2hfZGF0YV9jYWNoZV9wYWdlOwogCQlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSB0eDM5X2ZsdXNoX2RhdGFfY2FjaGVfcGFnZTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggMTJhZjczOS4uODI5MzIwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTM1LDYgKzM1LDExIEBACiB2b2lkICgqX19mbHVzaF9jYWNoZV92bWFwKSh2b2lkKTsKIHZvaWQgKCpfX2ZsdXNoX2NhY2hlX3Z1bm1hcCkodm9pZCk7CiAKK3ZvaWQgKCpfX2ZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKSh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgc2l6ZSk7Cit2b2lkICgqX19pbnZhbGlkYXRlX2tlcm5lbF92bWFwX3JhbmdlKSh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgc2l6ZSk7CisKK0VYUE9SVF9TWU1CT0xfR1BMKF9fZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UpOworCiAvKiBNSVBTIHNwZWNpZmljIGNhY2hlIG9wZXJhdGlvbnMgKi8KIHZvaWQgKCpmbHVzaF9jYWNoZV9zaWd0cmFtcCkodW5zaWduZWQgbG9uZyBhZGRyKTsKIHZvaWQgKCpsb2NhbF9mbHVzaF9kYXRhX2NhY2hlX3BhZ2UpKHZvaWQgKiBhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGItcjNrLmMgYi9hcmNoL21pcHMvbW0vdGxiLXIzay5jCmluZGV4IDQwNDI0YWYuLjg3YmI4NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGItcjNrLmMKKysrIGIvYXJjaC9taXBzL21tL3RsYi1yM2suYwpAQCAtMjIzLDggKzIyMyw4IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi12b2lkIF9faW5pdCBhZGRfd2lyZWRfZW50cnkodW5zaWduZWQgbG9uZyBlbnRyeWxvMCwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGVudHJ5aGksIHVuc2lnbmVkIGxvbmcgcGFnZW1hc2spCit2b2lkIGFkZF93aXJlZF9lbnRyeSh1bnNpZ25lZCBsb25nIGVudHJ5bG8wLCB1bnNpZ25lZCBsb25nIGVudHJ5bG8xLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgZW50cnloaSwgdW5zaWduZWQgbG9uZyBwYWdlbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgb2xkX2N0eDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMgYi9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCmluZGV4IGJhNDAzMjUuLjBkMzk0ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL3RsYi1yNGsuYwpAQCAtMzM3LDggKzMzNyw4IEBACiAJRVhJVF9DUklUSUNBTChmbGFncyk7CiB9CiAKLXZvaWQgX19pbml0IGFkZF93aXJlZF9lbnRyeSh1bnNpZ25lZCBsb25nIGVudHJ5bG8wLCB1bnNpZ25lZCBsb25nIGVudHJ5bG8xLAotCXVuc2lnbmVkIGxvbmcgZW50cnloaSwgdW5zaWduZWQgbG9uZyBwYWdlbWFzaykKK3ZvaWQgYWRkX3dpcmVkX2VudHJ5KHVuc2lnbmVkIGxvbmcgZW50cnlsbzAsIHVuc2lnbmVkIGxvbmcgZW50cnlsbzEsCisJCSAgICAgdW5zaWduZWQgbG9uZyBlbnRyeWhpLCB1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyB3aXJlZDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy9QbGF0Zm9ybSBiL2FyY2gvbWlwcy9uZXRsb2dpYy9QbGF0Zm9ybQppbmRleCBmODdjMTY0Li5iNjQ4YjQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMvUGxhdGZvcm0KKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL1BsYXRmb3JtCkBAIC01LDYgKzUsMTEgQEAKIGNmbGFncy0kKENPTkZJR19OTE1fQ09NTU9OKSAgKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9uZXRsb2dpYwogCiAjCisjIHVzZSBtaXBzNjQgaWYgeGxyIGlzIG5vdCBhdmFpbGFibGUKKyMKK2NmbGFncy0kKENPTkZJR19OTE1fWExSKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD14bHIsLW1hcmNoPW1pcHM2NCkKKworIwogIyBORVRMT0dJQyBYTFIvWExTIFNvQywgU2ltdWxhdG9yIGFuZCBib2FyZHMKICMKIGNvcmUtJChDT05GSUdfTkxNX1hMUikJICAgICAgKz0gYXJjaC9taXBzL25ldGxvZ2ljL3hsci8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc2V0dXAuYyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc2V0dXAuYwppbmRleCA0ODI4MDI1Li5jZWUyNWRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zZXR1cC5jCkBAIC01Myw3ICs1Myw3IEBACiB1bnNpZ25lZCBsb25nIG5sbV9jb21tb25fZWJhc2UgPSAweDA7CiBzdHJ1Y3QgcHNiX2luZm8gbmxtX3Byb21faW5mbzsKIAotc3RhdGljIHZvaWQgbmxtX2Vhcmx5X3NlcmlhbF9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG5sbV9lYXJseV9zZXJpYWxfc2V0dXAodm9pZCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0IHM7CiAJbmxtX3JlZ190ICp1YXJ0X2Jhc2U7CkBAIC0xMDEsNyArMTAxLDcgQEAKIAkvKiBOb3RoaW5nIHlldCAqLwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF9hcmNzX2NtZGxpbmUoaW50ICphcmd2KQorc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX2FyY3NfY21kbGluZShpbnQgKmFyZ3YpCiB7CiAJaW50IGksIHJlbWFpbiwgbGVuOwogCWNoYXIgKmFyZzsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wLmMgYi9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcC5jCmluZGV4IGQ4NDJiY2UuLjA4MDI4NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wLmMKKysrIGIvYXJjaC9taXBzL25ldGxvZ2ljL3hsci9zbXAuYwpAQCAtMTU4LDYgKzE1OCwxMCBAQAogCiAJbnVtX2NwdXMgPSAxOwogCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJLyoKKwkJICogQlNQIGlzIG5vdCBzZXQgaW4gbmxtX2NwdV9yZWFkeSBhcnJheSwgaXQgaXMgb25seSBmb3IKKwkJICogQVNQcyAoZ290byBzZWUgc21wYm9vdC5TKQorCQkgKi8KIAkJaWYgKG5sbV9jcHVfcmVhZHlbaV0pIHsKIAkJCWNwdV9zZXQoaSwgcGh5c19jcHVfcHJlc2VudF9tYXApOwogCQkJX19jcHVfbnVtYmVyX21hcFtpXSA9IG51bV9jcHVzOwpAQCAtMTkxLDcgKzE5NSw3IEBACiAKIHVuc2lnbmVkIGxvbmcgc2Vjb25kYXJ5X2VudHJ5X3BvaW50OwogCi1pbnQgbmxtX3dha2V1cF9zZWNvbmRhcnlfY3B1cyh1MzIgd2FrZXVwX21hc2spCitpbnQgX19jcHVpbml0IG5sbV93YWtldXBfc2Vjb25kYXJ5X2NwdXModTMyIHdha2V1cF9tYXNrKQogewogCXVuc2lnbmVkIGludCB0aWQsIHBpZCwgaXBpLCBpLCBib290X2NwdTsKIAl2b2lkICpyZXNldF92ZWM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbmV0bG9naWMveGxyL3NtcGJvb3QuUyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wYm9vdC5TCmluZGV4IGI4ZTA3NDQuLjhjYjc4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wYm9vdC5TCisrKyBiL2FyY2gvbWlwcy9uZXRsb2dpYy94bHIvc21wYm9vdC5TCkBAIC0zMiwxNyArMzIsMTkgQEAKICAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogCi0KLS8qIERvbid0IGp1bXAgdG8gbGludXggZnVuY3Rpb24gZnJvbSBCb290bG9hZGVyIHN0YWNrLiBDaGFuZ2UgaXQKLSAqIGhlcmUuIEtlcm5lbCBtaWdodCBhbGxvY2F0ZSBib290bG9hZGVyIG1lbW9yeSBiZWZvcmUgYWxsIHRoZSBDUFVzIGFyZQotICogYnJvdWdodCB1cCAoZWc6IElub2RlIGNhY2hlIHJlZ2lvbikgYW5kIHdlIGJldHRlciBkb24ndCBvdmVyd3JpdGUgdGhpcwotICogbWVtb3J5CisvKgorICogRWFybHkgY29kZSBmb3Igc2Vjb25kYXJ5IENQVXMuIFRoaXMgd2lsbCBnZXQgdGhlbSBvdXQgb2YgdGhlIGJvb3Rsb2FkZXIKKyAqIGNvZGUgYW5kIGludG8gbGludXguIE5lZWRlZCBiZWNhdXNlIHRoZSBib290bG9hZGVyIGFyZWEgd2lsbCBiZSB0YWtlbgorICogYW5kIGluaXRpYWxpemVkIGJ5IGxpbnV4LgogICovCisJX19DUFVJTklUCiBORVNURUQocHJvbV9wcmVfYm9vdF9zZWNvbmRhcnlfY3B1cywgMTYsIHNwKQogCS5zZXQJbWlwczY0CiAJbWZjMAl0MCwgJDE1LCAxCSMgcmVhZCBlYmFzZQpAQCAtNzMsNyArNzUsMTEgQEAKIAlqcgl0MAogCW5vcAogRU5EKHByb21fcHJlX2Jvb3Rfc2Vjb25kYXJ5X2NwdXMpCisJX19GSU5JVAogCisvKgorICogTk1JIGNvZGUsIHVzZWQgZm9yIENQVSB3YWtldXAsIGNvcGllZCB0byByZXNldCBlbnRyeQorICovCiBORVNURUQobmxtX2Jvb3Rfc21wX25taSwgMCwgc3ApCiAJLnNldCBwdXNoCiAJLnNldCBub2F0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQppbmRleCA0ZGY4Nzk5Li5iYjgyY2JkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCkBAIC0xOCwxNCArMTgsMTMgQEAKIG9iai0kKENPTkZJR19CQ000N1hYKQkJKz0gcGNpLWJjbTQ3eHgubwogb2JqLSQoQ09ORklHX0JDTTYzWFgpCQkrPSBwY2ktYmNtNjN4eC5vIGZpeHVwLWJjbTYzeHgubyBcCiAJCQkJCW9wcy1iY202M3h4Lm8KK29iai0kKENPTkZJR19NSVBTX0FMQ0hFTVkpCSs9IHBjaS1hbGNoZW15Lm8KIAogIwogIyBUaGVzZSBhcmUgc3RpbGwgcHJldHR5IG11Y2ggaW4gdGhlIG9sZCBzdGF0ZSwgd2F0Y2gsIGdvIGJsaW5kLgogIwogb2JqLSQoQ09ORklHX0xBU0FUKQkJKz0gcGNpLWxhc2F0Lm8KIG9iai0kKENPTkZJR19NSVBTX0NPQkFMVCkJKz0gZml4dXAtY29iYWx0Lm8KLW9iai0kKENPTkZJR19TT0NfQVUxNTAwKQkrPSBmaXh1cC1hdTEwMDAubyBvcHMtYXUxMDAwLm8KLW9iai0kKENPTkZJR19TT0NfQVUxNTUwKQkrPSBmaXh1cC1hdTEwMDAubyBvcHMtYXUxMDAwLm8KIG9iai0kKENPTkZJR19TT0NfUE5YODU1MCkJKz0gZml4dXAtcG54ODU1MC5vIG9wcy1wbng4NTUwLm8KIG9iai0kKENPTkZJR19MRU1PVEVfRlVMT09ORzJFKQkrPSBmaXh1cC1mdWxvb25nMmUubyBvcHMtbG9vbmdzb24yLm8KIG9iai0kKENPTkZJR19MRU1PVEVfTUFDSDJGKQkrPSBmaXh1cC1sZW1vdGUyZi5vIG9wcy1sb29uZ3NvbjIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1hdTEwMDAuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtYXUxMDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZGRmYzQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1hdTEwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUJvYXJkIHNwZWNpZmljIFBDSSBmaXh1cHMuCi0gKgotICogQ29weXJpZ2h0IDIwMDEtMjAwMywgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLWV4dGVybiBjaGFyIGlycV90YWJfYWxjaGVteVtdWzVdOwotCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JcmV0dXJuIGlycV90YWJfYWxjaGVteVtzbG90XVtwaW5dOwotfQotCi0vKiBEbyBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYXQgcGNpX2VuYWJsZV9kZXZpY2UoKSB0aW1lICovCi1pbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1hdTEwMDAuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU3YzVhLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUFsY2hlbXkvQU1EIEF1MXh4MCBQQ0kgc3VwcG9ydC4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA3LTIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqICBTdXBwb3J0IGZvciBhbGwgZGV2aWNlcyAoZ3JlYXRlciB0aGFuIDE2KSBhZGRlZCBieSBEYXZpZCBHYXRocmlnaHQuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLSN1bmRlZglERUJVRwotI2lmZGVmCURFQlVHCi0jZGVmaW5lIERCRyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyB4KQotI2Vsc2UKLSNkZWZpbmUgREJHKHguLi4pCi0jZW5kaWYKLQotI2RlZmluZSBQQ0lfQUNDRVNTX1JFQUQgIDAKLSNkZWZpbmUgUENJX0FDQ0VTU19XUklURSAxCi0KLWludCAoKmJvYXJkX3BjaV9pZHNlbCkodW5zaWduZWQgaW50IGRldnNlbCwgaW50IGFzc2VydCk7Ci0KLXZvaWQgbW9kX3dpcmVkX2VudHJ5KGludCBlbnRyeSwgdW5zaWduZWQgbG9uZyBlbnRyeWxvMCwKLQkJdW5zaWduZWQgbG9uZyBlbnRyeWxvMSwgdW5zaWduZWQgbG9uZyBlbnRyeWhpLAotCQl1bnNpZ25lZCBsb25nIHBhZ2VtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgb2xkX3BhZ2VtYXNrOwotCXVuc2lnbmVkIGxvbmcgb2xkX2N0eDsKLQotCS8qIFNhdmUgb2xkIGNvbnRleHQgYW5kIGNyZWF0ZSBpbXBvc3NpYmxlIFZQTjIgdmFsdWUgKi8KLQlvbGRfY3R4ID0gcmVhZF9jMF9lbnRyeWhpKCkgJiAweGZmOwotCW9sZF9wYWdlbWFzayA9IHJlYWRfYzBfcGFnZW1hc2soKTsKLQl3cml0ZV9jMF9pbmRleChlbnRyeSk7Ci0Jd3JpdGVfYzBfcGFnZW1hc2socGFnZW1hc2spOwotCXdyaXRlX2MwX2VudHJ5aGkoZW50cnloaSk7Ci0Jd3JpdGVfYzBfZW50cnlsbzAoZW50cnlsbzApOwotCXdyaXRlX2MwX2VudHJ5bG8xKGVudHJ5bG8xKTsKLQl0bGJfd3JpdGVfaW5kZXhlZCgpOwotCXdyaXRlX2MwX2VudHJ5aGkob2xkX2N0eCk7Ci0Jd3JpdGVfYzBfcGFnZW1hc2sob2xkX3BhZ2VtYXNrKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKnBjaV9jZmdfdm07Ci1zdGF0aWMgaW50IHBjaV9jZmdfd2lyZWRfZW50cnk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2VudHJ5TG8wLCBsYXN0X2VudHJ5TG8xOwotCi0vKgotICogV2UgY2FuJ3QgaW9yZW1hcCB0aGUgZW50aXJlIHBjaSBjb25maWcgc3BhY2UgYmVjYXVzZSBpdCdzIHRvbyBsYXJnZS4KLSAqIE5vciBjYW4gd2UgY2FsbCBpb3JlbWFwIGR5bmFtaWNhbGx5IGJlY2F1c2Ugc29tZSBkZXZpY2UgZHJpdmVycyB1c2UKLSAqIHRoZSBQQ0kgY29uZmlnIHJvdXRpbmVzIGZyb20gd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBhbmQgdGhhdAotICogYmVjb21lcyBhIHByb2JsZW0gaW4gZ2V0X3ZtX2FyZWEoKS4gIFdlIHVzZSBvbmUgd2lyZWQgVExCIHRvIGhhbmRsZQotICogYWxsIGNvbmZpZyBhY2Nlc3NlcyBmb3IgYWxsIGJ1c3Nlcy4KLSAqLwotdm9pZCBfX2luaXQgYXUxeF9wY2lfY2ZnX2luaXQodm9pZCkKLXsKLQkvKiBSZXNlcnZlIGEgd2lyZWQgZW50cnkgZm9yIFBDSSBjb25maWcgYWNjZXNzZXMgKi8KLQlwY2lfY2ZnX3ZtID0gZ2V0X3ZtX2FyZWEoMHgyMDAwLCBWTV9JT1JFTUFQKTsKLQlpZiAoIXBjaV9jZmdfdm0pCi0JCXBhbmljKEtFUk5fRVJSICJQQ0kgdW5hYmxlIHRvIGdldCB2bSBhcmVhXG4iKTsKLQlwY2lfY2ZnX3dpcmVkX2VudHJ5ID0gcmVhZF9jMF93aXJlZCgpOwotCWFkZF93aXJlZF9lbnRyeSgwLCAwLCAodW5zaWduZWQgbG9uZylwY2lfY2ZnX3ZtLT5hZGRyLCBQTV80Syk7Ci0JbGFzdF9lbnRyeUxvMCA9IGxhc3RfZW50cnlMbzEgPSAweGZmZmZmZmZmOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ19hY2Nlc3ModW5zaWduZWQgY2hhciBhY2Nlc3NfdHlwZSwgc3RydWN0IHBjaV9idXMgKmJ1cywKLQkJCSB1bnNpZ25lZCBpbnQgZGV2X2ZuLCB1bnNpZ25lZCBjaGFyIHdoZXJlLCB1MzIgKmRhdGEpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkKLQl1bnNpZ25lZCBpbnQgZGV2aWNlID0gUENJX1NMT1QoZGV2X2ZuKTsKLQl1bnNpZ25lZCBpbnQgZnVuY3Rpb24gPSBQQ0lfRlVOQyhkZXZfZm4pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBjZmdfYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnJvciA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl1bnNpZ25lZCBsb25nIGVudHJ5TG8wLCBlbnRyeUxvMTsKLQotCWlmIChkZXZpY2UgPiAxOSkgewotCQkqZGF0YSA9IDB4ZmZmZmZmZmY7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXVfd3JpdGVsKCgoMHgyMDAwIDw8IDE2KSB8IChhdV9yZWFkbChBdTE1MDBfUENJX1NUQVRDTUQpICYgMHhmZmZmKSksCi0JCQlBdTE1MDBfUENJX1NUQVRDTUQpOwotCWF1X3N5bmNfdWRlbGF5KDEpOwotCi0JLyoKLQkgKiBBbGxvdyBib2FyZCB2ZW5kb3JzIHRvIGltcGxlbWVudCB0aGVpciBvd24gb2ZmLWNoaXAgSURTRUwuCi0JICogSWYgaXQgZG9lc24ndCBzdWNjZWVkLCBtYXkgYXMgd2VsbCBiYWlsIG91dCBhdCB0aGlzIHBvaW50LgotCSAqLwotCWlmIChib2FyZF9wY2lfaWRzZWwgJiYgYm9hcmRfcGNpX2lkc2VsKGRldmljZSwgMSkgPT0gMCkgewotCQkqZGF0YSA9IDB4ZmZmZmZmZmY7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFNldHVwIHRoZSBjb25maWcgd2luZG93ICovCi0JaWYgKGJ1cy0+bnVtYmVyID09IDApCi0JCWNmZ19iYXNlID0gKDEgPDwgZGV2aWNlKSA8PCAxMTsKLQllbHNlCi0JCWNmZ19iYXNlID0gMHg4MDAwMDAwMCB8IChidXMtPm51bWJlciA8PCAxNikgfCAoZGV2aWNlIDw8IDExKTsKLQotCS8qIFNldHVwIHRoZSBsb3dlciBiaXRzIG9mIHRoZSAzNi1iaXQgYWRkcmVzcyAqLwotCW9mZnNldCA9IChmdW5jdGlvbiA8PCA4KSB8ICh3aGVyZSAmIH4weDMpOwotCS8qIFBpY2sgdXAgYW55IGFkZHJlc3MgdGhhdCBmYWxscyBiZWxvdyB0aGUgcGFnZSBtYXNrICovCi0Jb2Zmc2V0IHw9IGNmZ19iYXNlICYgflBBR0VfTUFTSzsKLQotCS8qIFBhZ2UgYm91bmRhcnkgKi8KLQljZmdfYmFzZSA9IGNmZ19iYXNlICYgUEFHRV9NQVNLOwotCi0JLyoKLQkgKiBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlLCBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMKLQkgKiB0aGUgbGFzdCBkZXZpY2UgYWNjZXNzZWQsIHdlIGRvbid0IHRvdWNoIHRoZSBUTEIuCi0JICovCi0JZW50cnlMbzAgPSAoNiA8PCAyNikgfCAoY2ZnX2Jhc2UgPj4gNikgfCAoMiA8PCAzKSB8IDc7Ci0JZW50cnlMbzEgPSAoNiA8PCAyNikgfCAoY2ZnX2Jhc2UgPj4gNikgfCAoMHgxMDAwID4+IDYpIHwgKDIgPDwgMykgfCA3OwotCWlmICgoZW50cnlMbzAgIT0gbGFzdF9lbnRyeUxvMCkgfHwgKGVudHJ5TG8xICE9IGxhc3RfZW50cnlMbzEpKSB7Ci0JCW1vZF93aXJlZF9lbnRyeShwY2lfY2ZnX3dpcmVkX2VudHJ5LCBlbnRyeUxvMCwgZW50cnlMbzEsCi0JCQkJKHVuc2lnbmVkIGxvbmcpcGNpX2NmZ192bS0+YWRkciwgUE1fNEspOwotCQlsYXN0X2VudHJ5TG8wID0gZW50cnlMbzA7Ci0JCWxhc3RfZW50cnlMbzEgPSBlbnRyeUxvMTsKLQl9Ci0KLQlpZiAoYWNjZXNzX3R5cGUgPT0gUENJX0FDQ0VTU19XUklURSkKLQkJYXVfd3JpdGVsKCpkYXRhLCAoaW50KShwY2lfY2ZnX3ZtLT5hZGRyICsgb2Zmc2V0KSk7Ci0JZWxzZQotCQkqZGF0YSA9IGF1X3JlYWRsKChpbnQpKHBjaV9jZmdfdm0tPmFkZHIgKyBvZmZzZXQpKTsKLQotCWF1X3N5bmNfdWRlbGF5KDIpOwotCi0JREJHKCJjZmdfYWNjZXNzICVkIGJ1cy0+bnVtYmVyICV1IGRldiAldSBhdCAleCAqZGF0YSAleCBjb25mICVseFxuIiwKLQkgICAgYWNjZXNzX3R5cGUsIGJ1cy0+bnVtYmVyLCBkZXZpY2UsIHdoZXJlLCAqZGF0YSwgb2Zmc2V0KTsKLQotCS8qIENoZWNrIG1hc3RlciBhYm9ydCAqLwotCXN0YXR1cyA9IGF1X3JlYWRsKEF1MTUwMF9QQ0lfU1RBVENNRCk7Ci0KLQlpZiAoc3RhdHVzICYgKDEgPDwgMjkpKSB7Ci0JCSpkYXRhID0gMHhmZmZmZmZmZjsKLQkJZXJyb3IgPSAtMTsKLQkJREJHKCJBdTF4IE1hc3RlciBBYm9ydFxuIik7Ci0JfSBlbHNlIGlmICgoc3RhdHVzID4+IDI4KSAmIDB4ZikgewotCQlEQkcoIlBDSSBFUlIgZGV0ZWN0ZWQ6IGRldmljZSAldSwgc3RhdHVzICVseFxuIiwKLQkJICAgIGRldmljZSwgKHN0YXR1cyA+PiAyOCkgJiAweGYpOwotCi0JCS8qIENsZWFyIGVycm9ycyAqLwotCQlhdV93cml0ZWwoc3RhdHVzICYgMHhmMDAwZmZmZiwgQXUxNTAwX1BDSV9TVEFUQ01EKTsKLQotCQkqZGF0YSA9IDB4ZmZmZmZmZmY7Ci0JCWVycm9yID0gLTE7Ci0JfQotCi0JLyogVGFrZSBhd2F5IHRoZSBJRFNFTC4gKi8KLQlpZiAoYm9hcmRfcGNpX2lkc2VsKQotCQkodm9pZClib2FyZF9wY2lfaWRzZWwoZGV2aWNlLCAwKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCByZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICBpbnQgd2hlcmUsCXU4ICp2YWwpCi17Ci0JdTMyIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpOwotCWlmICh3aGVyZSAmIDEpCi0JCWRhdGEgPj49IDg7Ci0JaWYgKHdoZXJlICYgMikKLQkJZGF0YSA+Pj0gMTY7Ci0JKnZhbCA9IGRhdGEgJiAweGZmOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkgICAgaW50IHdoZXJlLCB1MTYgKnZhbCkKLXsKLQl1MzIgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSk7Ci0JaWYgKHdoZXJlICYgMikKLQkJZGF0YSA+Pj0gMTY7Ci0JKnZhbCA9IGRhdGEgJiAweGZmZmY7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkgICAgIGludCB3aGVyZSwgdTMyICp2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICAgaW50IHdoZXJlLCB1OCB2YWwpCi17Ci0JdTMyIGRhdGEgPSAwOwotCi0JaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQlyZXR1cm4gLTE7Ci0KLQlkYXRhID0gKGRhdGEgJiB+KDB4ZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAotCSAgICAgICAodmFsIDw8ICgod2hlcmUgJiAzKSA8PCAzKSk7Ci0KLQlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgICAgaW50IHdoZXJlLCB1MTYgdmFsKQotewotCXUzMiBkYXRhID0gMDsKLQotCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKSkKLQkJcmV0dXJuIC0xOwotCi0JZGF0YSA9IChkYXRhICYgfigweGZmZmYgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKSkgfAotCSAgICAgICAodmFsIDw8ICgod2hlcmUgJiAzKSA8PCAzKSk7Ci0KLQlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkgICAgICBpbnQgd2hlcmUsIHUzMiB2YWwpCi17Ci0JaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwgYnVzLCBkZXZmbiwgd2hlcmUsICZ2YWwpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQotewotCXN3aXRjaCAoc2l6ZSkgewotCWNhc2UgMTogewotCQkJdTggX3ZhbDsKLQkJCWludCByYyA9IHJlYWRfY29uZmlnX2J5dGUoYnVzLCBkZXZmbiwgd2hlcmUsICZfdmFsKTsKLQotCQkJKnZhbCA9IF92YWw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQljYXNlIDI6IHsKLQkJCXUxNiBfdmFsOwotCQkJaW50IHJjID0gcmVhZF9jb25maWdfd29yZChidXMsIGRldmZuLCB3aGVyZSwgJl92YWwpOwotCi0JCQkqdmFsID0gX3ZhbDsKLQkJCXJldHVybiByYzsKLQkJfQotCWRlZmF1bHQ6Ci0JCXJldHVybiByZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCi17Ci0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOgotCQlyZXR1cm4gd3JpdGVfY29uZmlnX2J5dGUoYnVzLCBkZXZmbiwgd2hlcmUsICh1OCkgdmFsKTsKLQljYXNlIDI6Ci0JCXJldHVybiB3cml0ZV9jb25maWdfd29yZChidXMsIGRldmZuLCB3aGVyZSwgKHUxNikgdmFsKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gd3JpdGVfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOwotCX0KLX0KLQotc3RydWN0IHBjaV9vcHMgYXUxeF9wY2lfb3BzID0gewotCWNvbmZpZ19yZWFkLAotCWNvbmZpZ193cml0ZQotfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWFsY2hlbXkuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWFsY2hlbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU1NzEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktYWxjaGVteS5jCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogQWxjaGVteSBQQ0kgaG9zdCBtb2RlIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMywgMjAwNy0yMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiBTdXBwb3J0IGZvciBhbGwgZGV2aWNlcyAoZ3JlYXRlciB0aGFuIDE2KSBhZGRlZCBieSBEYXZpZCBHYXRocmlnaHQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworI2lmZGVmIENPTkZJR19ERUJVR19QQ0kKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBQQ0lfQUNDRVNTX1JFQUQJCTAKKyNkZWZpbmUgUENJX0FDQ0VTU19XUklURQkxCisKK3N0cnVjdCBhbGNoZW15X3BjaV9jb250ZXh0IHsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgYWxjaGVteV9wY2lfY3RybDsJLyogbGVhdmUgYXMgZmlyc3QgbWVtYmVyISAqLworCXZvaWQgX19pb21lbSAqcmVnczsJCQkvKiBjdHJsIGJhc2UgKi8KKwkvKiB0b29scyBmb3Igd2lyZWQgZW50cnkgZm9yIGNvbmZpZyBzcGFjZSBhY2Nlc3MgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfZWxvMDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfZWxvMTsKKwlpbnQgd2lyZWRfZW50cnk7CisJc3RydWN0IHZtX3N0cnVjdCAqcGNpX2NmZ192bTsKKworCXVuc2lnbmVkIGxvbmcgcG1bMTJdOworCisJaW50ICgqYm9hcmRfbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmQsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50ICgqYm9hcmRfcGNpX2lkc2VsKSh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKK307CisKKy8qIElPL01FTSByZXNvdXJjZXMgZm9yIFBDSS4gS2VlcCB0aGUgbWVtcmVzIGluIHN5bmMgd2l0aCBfX2ZpeHVwX2JpZ3BoeXNfYWRkcgorICogaW4gYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMKKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhbGNoZW15X3BjaV9kZWZfbWVtcmVzID0geworCS5zdGFydAk9IEFMQ0hFTVlfUENJX01FTVdJTl9TVEFSVCwKKwkuZW5kCT0gQUxDSEVNWV9QQ0lfTUVNV0lOX0VORCwKKwkubmFtZQk9ICJQQ0kgbWVtb3J5IHNwYWNlIiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhbGNoZW15X3BjaV9kZWZfaW9yZXMgPSB7CisJLnN0YXJ0CT0gQUxDSEVNWV9QQ0lfSU9XSU5fU1RBUlQsCisJLmVuZAk9IEFMQ0hFTVlfUENJX0lPV0lOX0VORCwKKwkubmFtZQk9ICJQQ0kgSU8gc3BhY2UiLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KK307CisKK3N0YXRpYyB2b2lkIG1vZF93aXJlZF9lbnRyeShpbnQgZW50cnksIHVuc2lnbmVkIGxvbmcgZW50cnlsbzAsCisJCXVuc2lnbmVkIGxvbmcgZW50cnlsbzEsIHVuc2lnbmVkIGxvbmcgZW50cnloaSwKKwkJdW5zaWduZWQgbG9uZyBwYWdlbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIG9sZF9wYWdlbWFzazsKKwl1bnNpZ25lZCBsb25nIG9sZF9jdHg7CisKKwkvKiBTYXZlIG9sZCBjb250ZXh0IGFuZCBjcmVhdGUgaW1wb3NzaWJsZSBWUE4yIHZhbHVlICovCisJb2xkX2N0eCA9IHJlYWRfYzBfZW50cnloaSgpICYgMHhmZjsKKwlvbGRfcGFnZW1hc2sgPSByZWFkX2MwX3BhZ2VtYXNrKCk7CisJd3JpdGVfYzBfaW5kZXgoZW50cnkpOworCXdyaXRlX2MwX3BhZ2VtYXNrKHBhZ2VtYXNrKTsKKwl3cml0ZV9jMF9lbnRyeWhpKGVudHJ5aGkpOworCXdyaXRlX2MwX2VudHJ5bG8wKGVudHJ5bG8wKTsKKwl3cml0ZV9jMF9lbnRyeWxvMShlbnRyeWxvMSk7CisJdGxiX3dyaXRlX2luZGV4ZWQoKTsKKwl3cml0ZV9jMF9lbnRyeWhpKG9sZF9jdHgpOworCXdyaXRlX2MwX3BhZ2VtYXNrKG9sZF9wYWdlbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGFsY2hlbXlfcGNpX3dpcmVkX2VudHJ5KHN0cnVjdCBhbGNoZW15X3BjaV9jb250ZXh0ICpjdHgpCit7CisJY3R4LT53aXJlZF9lbnRyeSA9IHJlYWRfYzBfd2lyZWQoKTsKKwlhZGRfd2lyZWRfZW50cnkoMCwgMCwgKHVuc2lnbmVkIGxvbmcpY3R4LT5wY2lfY2ZnX3ZtLT5hZGRyLCBQTV80Syk7CisJY3R4LT5sYXN0X2VsbzAgPSBjdHgtPmxhc3RfZWxvMSA9IH4wOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19hY2Nlc3ModW5zaWduZWQgY2hhciBhY2Nlc3NfdHlwZSwgc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCSB1bnNpZ25lZCBpbnQgZGV2X2ZuLCB1bnNpZ25lZCBjaGFyIHdoZXJlLCB1MzIgKmRhdGEpCit7CisJc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgKmN0eCA9IGJ1cy0+c3lzZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlID0gUENJX1NMT1QoZGV2X2ZuKTsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb24gPSBQQ0lfRlVOQyhkZXZfZm4pOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGF0dXMsIGNmZ19iYXNlLCBmbGFncywgZW50cnlMbzAsIGVudHJ5TG8xLCByOworCWludCBlcnJvciA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKworCWlmIChkZXZpY2UgPiAxOSkgeworCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBZQU1PTiBvbiBhbGwgZGIxeHh4IGJvYXJkcyB3aXBlcyB0aGUgVExCIGFuZCB3cml0ZXMgemVybyB0byBDMF93aXJlZAorCSAqIG9uIHJlc3VtZSwgY2xlYXJpbmcgb3VyIHdpcmVkIGVudHJ5LiAgVW5mb3J0dW5hdGVseSB0aGUgLT5yZXN1bWUoKQorCSAqIGNhbGxiYWNrIGlzIGNhbGxlZCB3YXkgd2F5IHdheSB0b28gbGF0ZSAoYW5kIC0+c3VzcGVuZCgpIHRvbyBlYXJseSkKKwkgKiB0byBoYXZlIHRoZW0gZGVzdHJveSBhbmQgcmVjcmVhdGUgaXQuICBJbnN0ZWFkIGp1c3QgdGVzdCBpZiBjMF93aXJlZAorCSAqIGlzIG5vdyBsb3dlciB0aGFuIHRoZSBpbmRleCB3ZSByZXRyaWV2ZWQgYmVmb3JlIHN1c3BlbmRpbmcgYW5kIHRoZW4KKwkgKiByZWNyZWF0ZSB0aGUgZW50cnkgaWYgbmVjZXNzYXJ5LiAgT2YgY291cnNlIHRoaXMgaXMgdG90YWxseSBib25rZXJzCisJICogYW5kIGJyZWFrcyBhcyBzb29uIGFzIHNvbWVvbmUgZWxzZSBhZGRzIGFub3RoZXIgd2lyZWQgZW50cnkgc29tZXdoZXJlCisJICogZWxzZS4gIEFueW9uZSBoYXZlIGFueSBpZGVhcyBob3cgdG8gaGFuZGxlIHRoaXMgYmV0dGVyPworCSAqLworCWlmICh1bmxpa2VseShyZWFkX2MwX3dpcmVkKCkgPCBjdHgtPndpcmVkX2VudHJ5KSkKKwkJYWxjaGVteV9wY2lfd2lyZWRfZW50cnkoY3R4KTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19TVEFUQ01EKSAmIDB4MDAwMGZmZmY7CisJciB8PSBQQ0lfU1RBVENNRF9TVEFUVVMoMHgyMDAwKTsKKwlfX3Jhd193cml0ZWwociwgY3R4LT5yZWdzICsgUENJX1JFR19TVEFUQ01EKTsKKwl3bWIoKTsKKworCS8qIEFsbG93IGJvYXJkIHZlbmRvcnMgdG8gaW1wbGVtZW50IHRoZWlyIG93biBvZmYtY2hpcCBJRFNFTC4KKwkgKiBJZiBpdCBkb2Vzbid0IHN1Y2NlZWQsIG1heSBhcyB3ZWxsIGJhaWwgb3V0IGF0IHRoaXMgcG9pbnQuCisJICovCisJaWYgKGN0eC0+Ym9hcmRfcGNpX2lkc2VsKGRldmljZSwgMSkgPT0gMCkgeworCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldHVwIHRoZSBjb25maWcgd2luZG93ICovCisJaWYgKGJ1cy0+bnVtYmVyID09IDApCisJCWNmZ19iYXNlID0gKDEgPDwgZGV2aWNlKSA8PCAxMTsKKwllbHNlCisJCWNmZ19iYXNlID0gMHg4MDAwMDAwMCB8IChidXMtPm51bWJlciA8PCAxNikgfCAoZGV2aWNlIDw8IDExKTsKKworCS8qIFNldHVwIHRoZSBsb3dlciBiaXRzIG9mIHRoZSAzNi1iaXQgYWRkcmVzcyAqLworCW9mZnNldCA9IChmdW5jdGlvbiA8PCA4KSB8ICh3aGVyZSAmIH4weDMpOworCS8qIFBpY2sgdXAgYW55IGFkZHJlc3MgdGhhdCBmYWxscyBiZWxvdyB0aGUgcGFnZSBtYXNrICovCisJb2Zmc2V0IHw9IGNmZ19iYXNlICYgflBBR0VfTUFTSzsKKworCS8qIFBhZ2UgYm91bmRhcnkgKi8KKwljZmdfYmFzZSA9IGNmZ19iYXNlICYgUEFHRV9NQVNLOworCisJLyogVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzCisJICogdGhlIGxhc3QgZGV2aWNlIGFjY2Vzc2VkLCB3ZSBkb24ndCB0b3VjaCB0aGUgVExCLgorCSAqLworCWVudHJ5TG8wID0gKDYgPDwgMjYpIHwgKGNmZ19iYXNlID4+IDYpIHwgKDIgPDwgMykgfCA3OworCWVudHJ5TG8xID0gKDYgPDwgMjYpIHwgKGNmZ19iYXNlID4+IDYpIHwgKDB4MTAwMCA+PiA2KSB8ICgyIDw8IDMpIHwgNzsKKwlpZiAoKGVudHJ5TG8wICE9IGN0eC0+bGFzdF9lbG8wKSB8fCAoZW50cnlMbzEgIT0gY3R4LT5sYXN0X2VsbzEpKSB7CisJCW1vZF93aXJlZF9lbnRyeShjdHgtPndpcmVkX2VudHJ5LCBlbnRyeUxvMCwgZW50cnlMbzEsCisJCQkJKHVuc2lnbmVkIGxvbmcpY3R4LT5wY2lfY2ZnX3ZtLT5hZGRyLCBQTV80Syk7CisJCWN0eC0+bGFzdF9lbG8wID0gZW50cnlMbzA7CisJCWN0eC0+bGFzdF9lbG8xID0gZW50cnlMbzE7CisJfQorCisJaWYgKGFjY2Vzc190eXBlID09IFBDSV9BQ0NFU1NfV1JJVEUpCisJCV9fcmF3X3dyaXRlbCgqZGF0YSwgY3R4LT5wY2lfY2ZnX3ZtLT5hZGRyICsgb2Zmc2V0KTsKKwllbHNlCisJCSpkYXRhID0gX19yYXdfcmVhZGwoY3R4LT5wY2lfY2ZnX3ZtLT5hZGRyICsgb2Zmc2V0KTsKKwl3bWIoKTsKKworCURCRygiYWxjaGVteS1wY2k6IGNmZyBhY2Nlc3MgJWQgYnVzICV1IGRldiAldSBhdCAleCBkYXQgJXggY29uZiAlbHhcbiIsCisJICAgIGFjY2Vzc190eXBlLCBidXMtPm51bWJlciwgZGV2aWNlLCB3aGVyZSwgKmRhdGEsIG9mZnNldCk7CisKKwkvKiBjaGVjayBmb3IgZXJyb3JzLCBtYXN0ZXIgYWJvcnQgKi8KKwlzdGF0dXMgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX1NUQVRDTUQpOworCWlmIChzdGF0dXMgJiAoMSA8PCAyOSkpIHsKKwkJKmRhdGEgPSAweGZmZmZmZmZmOworCQllcnJvciA9IC0xOworCQlEQkcoImFsY2hlbXktcGNpOiBtYXN0ZXIgYWJvcnQgb24gY2ZnIGFjY2VzcyAlZCBidXMgJWQgZGV2ICVkIiwKKwkJICAgIGFjY2Vzc190eXBlLCBidXMtPm51bWJlciwgZGV2aWNlKTsKKwl9IGVsc2UgaWYgKChzdGF0dXMgPj4gMjgpICYgMHhmKSB7CisJCURCRygiYWxjaGVteS1wY2k6IFBDSSBFUlIgZGV0ZWN0ZWQ6IGRldiAlZCwgc3RhdHVzICVseFxuIiwKKwkJICAgIGRldmljZSwgKHN0YXR1cyA+PiAyOCkgJiAweGYpOworCisJCS8qIGNsZWFyIGVycm9ycyAqLworCQlfX3Jhd193cml0ZWwoc3RhdHVzICYgMHhmMDAwZmZmZiwgY3R4LT5yZWdzICsgUENJX1JFR19TVEFUQ01EKTsKKworCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCWVycm9yID0gLTE7CisJfQorCisJLyogVGFrZSBhd2F5IHRoZSBJRFNFTC4gKi8KKwkodm9pZCljdHgtPmJvYXJkX3BjaV9pZHNlbChkZXZpY2UsIDApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCByZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICBpbnQgd2hlcmUsCXU4ICp2YWwpCit7CisJdTMyIGRhdGE7CisJaW50IHJldCA9IGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpOworCisJaWYgKHdoZXJlICYgMSkKKwkJZGF0YSA+Pj0gODsKKwlpZiAod2hlcmUgJiAyKQorCQlkYXRhID4+PSAxNjsKKwkqdmFsID0gZGF0YSAmIDB4ZmY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICBpbnQgd2hlcmUsIHUxNiAqdmFsKQoreworCXUzMiBkYXRhOworCWludCByZXQgPSBjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsICZkYXRhKTsKKworCWlmICh3aGVyZSAmIDIpCisJCWRhdGEgPj49IDE2OworCSp2YWwgPSBkYXRhICYgMHhmZmZmOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICBpbnQgd2hlcmUsIHUzMiAqdmFsKQoreworCXJldHVybiBjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwgd2hlcmUsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICBpbnQgd2hlcmUsIHU4IHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAoY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCWRhdGEgPSAoZGF0YSAmIH4oMHhmZiA8PCAoKHdoZXJlICYgMykgPDwgMykpKSB8CisJICAgICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKworCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICBpbnQgd2hlcmUsIHUxNiB2YWwpCit7CisJdTMyIGRhdGEgPSAwOworCisJaWYgKGNvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhID0gKGRhdGEgJiB+KDB4ZmZmZiA8PCAoKHdoZXJlICYgMykgPDwgMykpKSB8CisJICAgICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKKworCWlmIChjb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgIGludCB3aGVyZSwgdTMyIHZhbCkKK3sKKwlyZXR1cm4gY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY2lfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCSAgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6IHsKKwkJCXU4IF92YWw7CisJCQlpbnQgcmMgPSByZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHdoZXJlLCAmX3ZhbCk7CisKKwkJCSp2YWwgPSBfdmFsOworCQkJcmV0dXJuIHJjOworCQl9CisJY2FzZSAyOiB7CisJCQl1MTYgX3ZhbDsKKwkJCWludCByYyA9IHJlYWRfY29uZmlnX3dvcmQoYnVzLCBkZXZmbiwgd2hlcmUsICZfdmFsKTsKKworCQkJKnZhbCA9IF92YWw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJfQorfQorCitzdGF0aWMgaW50IGFsY2hlbXlfcGNpX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXJldHVybiB3cml0ZV9jb25maWdfYnl0ZShidXMsIGRldmZuLCB3aGVyZSwgKHU4KSB2YWwpOworCWNhc2UgMjoKKwkJcmV0dXJuIHdyaXRlX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCAodTE2KSB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiB3cml0ZV9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwgd2hlcmUsIHZhbCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgYWxjaGVteV9wY2lfb3BzID0geworCS5yZWFkCT0gYWxjaGVteV9wY2lfcmVhZCwKKwkud3JpdGUJPSBhbGNoZW15X3BjaV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY2lfZGVmX2lkc2VsKHVuc2lnbmVkIGludCBkZXZzZWwsIGludCBhc3NlcnQpCit7CisJcmV0dXJuIDE7CS8qIHN1Y2Nlc3MgKi8KK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWxjaGVteV9wY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY2lfcGxhdGRhdGEgKnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgKmN0eDsKKwl2b2lkIF9faW9tZW0gKnZpcnRfaW87CisJdW5zaWduZWQgbG9uZyB2YWw7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCByZXQ7CisKKwkvKiBuZWVkIGF0IGxlYXN0IFBDSSBJUlEgbWFwcGluZyB0YWJsZSAqLworCWlmICghcGQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibmVlZCBwbGF0Zm9ybSBkYXRhIGZvciBQQ0kgc2V0dXBcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtb3J5IGZvciBwY2ljdGwgY29udGV4dFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyAgcGNpY3RsIGN0cmwgcmVncyByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGNsYWltIHBjaSByZWdzXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQxOworCX0KKworCWN0eC0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFjdHgtPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBwY2kgcmVnc1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBtYXAgcGFydHMgb2YgdGhlIFBDSSBJTyBhcmVhICovCisJLyogUkVWSVNJVDogaWYgdGhpcyBjaGFuZ2VzIHdpdGggYSBuZXdlciB2YXJpYW50IChkb3VidCBpdCkgbWFrZSB0aGlzCisJICogYSBwbGF0Zm9ybSByZXNvdXJjZS4KKwkgKi8KKwl2aXJ0X2lvID0gaW9yZW1hcChBVTE1MDBfUENJX0lPX1BIWVNfQUREUiwgMHgwMDEwMDAwMCk7CisJaWYgKCF2aXJ0X2lvKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZW1hcCBwY2kgaW8gc3BhY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDM7CisJfQorCWN0eC0+YWxjaGVteV9wY2lfY3RybC5pb19tYXBfYmFzZSA9ICh1bnNpZ25lZCBsb25nKXZpcnRfaW87CisKKyNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCisJLyogQXUxNTAwIHJldmlzaW9ucyBvbGRlciB0aGFuIEFEIGhhdmUgYm9ya2VkIGNvaGVyZW50IFBDSSAqLworCWlmICgoYWxjaGVteV9nZXRfY3B1dHlwZSgpID09IEFMQ0hFTVlfQ1BVX0FVMTUwMCkgJiYKKwkgICAgKHJlYWRfYzBfcHJpZCgpIDwgMHgwMTAzMDIwMikpIHsKKwkJdmFsID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpOworCQl2YWwgfD0gUENJX0NPTkZJR19OQzsKKwkJX19yYXdfd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpOworCQl3bWIoKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vbi1jb2hlcmVudCBQQ0kgb24gQXUxNTAwIEFBL0FCL0FDXG4iKTsKKwl9CisjZW5kaWYKKworCWlmIChwZC0+Ym9hcmRfbWFwX2lycSkKKwkJY3R4LT5ib2FyZF9tYXBfaXJxID0gcGQtPmJvYXJkX21hcF9pcnE7CisKKwlpZiAocGQtPmJvYXJkX3BjaV9pZHNlbCkKKwkJY3R4LT5ib2FyZF9wY2lfaWRzZWwgPSBwZC0+Ym9hcmRfcGNpX2lkc2VsOworCWVsc2UKKwkJY3R4LT5ib2FyZF9wY2lfaWRzZWwgPSBhbGNoZW15X3BjaV9kZWZfaWRzZWw7CisKKwkvKiBmaWxsIGluIHJlbGV2YW50IHBjaV9jb250cm9sbGVyIG1lbWJlcnMgKi8KKwljdHgtPmFsY2hlbXlfcGNpX2N0cmwucGNpX29wcyA9ICZhbGNoZW15X3BjaV9vcHM7CisJY3R4LT5hbGNoZW15X3BjaV9jdHJsLm1lbV9yZXNvdXJjZSA9ICZhbGNoZW15X3BjaV9kZWZfbWVtcmVzOworCWN0eC0+YWxjaGVteV9wY2lfY3RybC5pb19yZXNvdXJjZSA9ICZhbGNoZW15X3BjaV9kZWZfaW9yZXM7CisKKwkvKiB3ZSBjYW4ndCBpb3JlbWFwIHRoZSBlbnRpcmUgcGNpIGNvbmZpZyBzcGFjZSBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlLAorCSAqIG5vciBjYW4gd2UgZHluYW1pY2FsbHkgaW9yZW1hcCBpdCBiZWNhdXNlIHNvbWUgZHJpdmVycyB1c2UgdGhlCisJICogUENJIGNvbmZpZyByb3V0aW5lcyBmcm9tIHdpdGhpbiBhdG9taWMgY29udGV4IGFuZCB0aGF0IGJlY29tZXMgYQorCSAqIHByb2JsZW0gaW4gZ2V0X3ZtX2FyZWEoKS4gIEluc3RlYWQgd2UgdXNlIG9uZSB3aXJlZCBUTEIgZW50cnkgdG8KKwkgKiBoYW5kbGUgYWxsIGNvbmZpZyBhY2Nlc3NlcyBmb3IgYWxsIGJ1c3Nlcy4KKwkgKi8KKwljdHgtPnBjaV9jZmdfdm0gPSBnZXRfdm1fYXJlYSgweDIwMDAsIFZNX0lPUkVNQVApOworCWlmICghY3R4LT5wY2lfY2ZnX3ZtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgdm0gYXJlYVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0NDsKKwl9CisJY3R4LT53aXJlZF9lbnRyeSA9IDgxOTI7CS8qIGltcG9zc2libHkgaGlnaCB2YWx1ZSAqLworCisJc2V0X2lvX3BvcnRfYmFzZSgodW5zaWduZWQgbG9uZyljdHgtPmFsY2hlbXlfcGNpX2N0cmwuaW9fbWFwX2Jhc2UpOworCisJLyogYm9hcmQgbWF5IHdhbnQgdG8gbW9kaWZ5IGJpdHMgaW4gdGhlIGNvbmZpZyByZWdpc3RlciwgZG8gaXQgbm93ICovCisJdmFsID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpOworCXZhbCAmPSB+cGQtPnBjaV9jZmdfY2xyOworCXZhbCB8PSBwZC0+cGNpX2NmZ19zZXQ7CisJdmFsICY9IH5QQ0lfQ09ORklHX1BEOwkJLyogY2xlYXIgZGlzYWJsZSBiaXQgKi8KKwlfX3Jhd193cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRyk7CisJd21iKCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZjdHgtPmFsY2hlbXlfcGNpX2N0cmwpOworCisJcmV0dXJuIDA7CisKK291dDQ6CisJaW91bm1hcCh2aXJ0X2lvKTsKK291dDM6CisJaW91bm1hcChjdHgtPnJlZ3MpOworb3V0MjoKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworb3V0MToKKwlrZnJlZShjdHgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorLyogc2F2ZSBQQ0kgY29udHJvbGxlciByZWdpc3RlciBjb250ZW50cy4gKi8KK3N0YXRpYyBpbnQgYWxjaGVteV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsY2hlbXlfcGNpX2NvbnRleHQgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY3R4LT5wbVswXSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NNRU0pOworCWN0eC0+cG1bMV0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19DT05GSUcpICYgMHgwMDA5ZmZmZjsKKwljdHgtPnBtWzJdICA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfQjJCTUFTS19DQ0gpOworCWN0eC0+cG1bM10gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19CMkJCQVNFMF9WSUQpOworCWN0eC0+cG1bNF0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19CMkJCQVNFMV9TSUQpOworCWN0eC0+cG1bNV0gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19NV01BU0tfREVWKTsKKwljdHgtPnBtWzZdICA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfTVdCQVNFX1JFVl9DQ0wpOworCWN0eC0+cG1bN10gID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19JRCk7CisJY3R4LT5wbVs4XSAgPSBfX3Jhd19yZWFkbChjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NMQVNTUkVWKTsKKwljdHgtPnBtWzldICA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfUEFSQU0pOworCWN0eC0+cG1bMTBdID0gX19yYXdfcmVhZGwoY3R4LT5yZWdzICsgUENJX1JFR19NQkFSKTsKKwljdHgtPnBtWzExXSA9IF9fcmF3X3JlYWRsKGN0eC0+cmVncyArIFBDSV9SRUdfVElNRU9VVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhbGNoZW15X3BjaV9jb250ZXh0ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzBdLCAgY3R4LT5yZWdzICsgUENJX1JFR19DTUVNKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVsyXSwgIGN0eC0+cmVncyArIFBDSV9SRUdfQjJCTUFTS19DQ0gpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzNdLCAgY3R4LT5yZWdzICsgUENJX1JFR19CMkJCQVNFMF9WSUQpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzRdLCAgY3R4LT5yZWdzICsgUENJX1JFR19CMkJCQVNFMV9TSUQpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzVdLCAgY3R4LT5yZWdzICsgUENJX1JFR19NV01BU0tfREVWKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVs2XSwgIGN0eC0+cmVncyArIFBDSV9SRUdfTVdCQVNFX1JFVl9DQ0wpOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzddLCAgY3R4LT5yZWdzICsgUENJX1JFR19JRCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bOF0sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NMQVNTUkVWKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVs5XSwgIGN0eC0+cmVncyArIFBDSV9SRUdfUEFSQU0pOworCV9fcmF3X3dyaXRlbChjdHgtPnBtWzEwXSwgY3R4LT5yZWdzICsgUENJX1JFR19NQkFSKTsKKwlfX3Jhd193cml0ZWwoY3R4LT5wbVsxMV0sIGN0eC0+cmVncyArIFBDSV9SRUdfVElNRU9VVCk7CisJd21iKCk7CisJX19yYXdfd3JpdGVsKGN0eC0+cG1bMV0sICBjdHgtPnJlZ3MgKyBQQ0lfUkVHX0NPTkZJRyk7CisJd21iKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGFsY2hlbXlfcGNpX3Btb3BzID0geworCS5zdXNwZW5kCT0gYWxjaGVteV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFsY2hlbXlfcGNpX3Jlc3VtZSwKK307CisKKyNkZWZpbmUgQUxDSEVNWV9QQ0lDVExfUE0JKCZhbGNoZW15X3BjaV9wbW9wcykKKworI2Vsc2UKKyNkZWZpbmUgQUxDSEVNWV9QQ0lDVExfUE0JTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsY2hlbXlfcGNpY3RsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYWxjaGVteV9wY2lfcHJvYmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAiYWxjaGVteS1wY2kiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQUxDSEVNWV9QQ0lDVExfUE0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfcGNpX2luaXQodm9pZCkKK3sKKwkvKiBBdTE1MDAvQXUxNTUwIGhhdmUgUENJICovCisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTU1MDoKKwkJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWxjaGVteV9wY2ljdGxfZHJpdmVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGFsY2hlbXlfcGNpX2luaXQpOworCisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY2lfY29udGV4dCAqY3R4ID0gZGV2LT5zeXNkYXRhOworCWlmIChjdHggJiYgY3R4LT5ib2FyZF9tYXBfaXJxKQorCQlyZXR1cm4gY3R4LT5ib2FyZF9tYXBfaXJxKGRldiwgc2xvdCwgcGluKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwppbmRleCBhMGU3MjZlLi4xOTNlOTQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCkBAIC05LDYgKzksNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGFzbS9zbi9hcmNoLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS5jIGIvYXJjaC9taXBzL3BjaS9wY2kuYwppbmRleCAzM2JiYTdiLi40MWFmN2ZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9zZXR1cC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEvbXNwNzF4eC9tc3Bfc2V0dXAuYwppbmRleCAwYWJmYmUwLi42NTUzMDhhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jLXNpZXJyYS9tc3A3MXh4L21zcF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL21zcDcxeHgvbXNwX3NldHVwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9yNGtjYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNpbmNsdWRlIDxtc3BfcHJvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvcHktY29uc29sZS5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvcHktY29uc29sZS5jCmluZGV4IDQzNGQ3YjEuLmI3ZjFkOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3B5LWNvbnNvbGUuYworKysgYi9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9weS1jb25zb2xlLmMKQEAgLTY1LDE1ICs2NSwxMSBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCSIJLnNldAltaXBzMwkJXG4iCi0JIgkuc2V0CXB1c2gJCVxuIgotCSIJLnNldAlub3Jlb3JkZXIJXG4iCi0JIgkuc2V0CW5vbWFjcm8JCVxuIgogCSIJbGQJJTAsICUxCQlcbiIKLQkiCS5zZXQJcG9wCQlcbiIKIAkiCWxidQklMCwgKCUwKQlcbiIKIAkiCS5zZXQJbWlwczAJCVxuIgogCTogIj1yIiAocmVzKQotCTogIlIiICh2YWRkcikpOworCTogIm0iICh2YWRkcikpOwogCiAJd3JpdGVfYzBfc3RhdHVzKHNyKTsKIAlzc25vcF80KCk7CkBAIC05MywxNSArODksMTEgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkiCS5zZXQJbWlwczMJCVxuIgotCSIJLnNldAlwdXNoCQlcbiIKLQkiCS5zZXQJbm9yZW9yZGVyCVxuIgotCSIJLnNldAlub21hY3JvCQlcbiIKIAkiCWxkCSUwLCAlMQkJXG4iCi0JIgkuc2V0CXBvcAkJXG4iCiAJIglzYgklMiwgKCUwKQlcbiIKIAkiCS5zZXQJbWlwczAJCVxuIgogCTogIj0mciIgKHRtcCkKLQk6ICJSIiAodmFkZHIpLCAiciIgKGMpKTsKKwk6ICJtIiAodmFkZHIpLCAiciIgKGMpKTsKIAogCXdyaXRlX2MwX3N0YXR1cyhzcik7CiAJc3Nub3BfNCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Byb20uYyBiL2FyY2gvbWlwcy9wbng4NTUwL2NvbW1vbi9wcm9tLmMKaW5kZXggMzJmNzAwOS4uNDk2MzllOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BueDg1NTAvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvcG54ODU1MC9jb21tb24vcHJvbS5jCkBAIC0zMCw3ICszMCw3IEBACiB9dF9lbnZfdmFyOwogCiAKLWNoYXIgKiBwcm9tX2dldGNtZGxpbmUodm9pZCkKK2NoYXIgKiBfX2luaXQgcHJvbV9nZXRjbWRsaW5lKHZvaWQpCiB7CiAJcmV0dXJuICYoYXJjc19jbWRsaW5lWzBdKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wb3dlcnR2L0tjb25maWcgYi9hcmNoL21pcHMvcG93ZXJ0di9LY29uZmlnCmluZGV4IGZmMGU3ZTMuLjFhMWIwM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L0tjb25maWcKKysrIGIvYXJjaC9taXBzL3Bvd2VydHYvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLXNvdXJjZSAiYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9LY29uZmlnIgotCiBjb25maWcgQk9PVExPQURFUl9EUklWRVIKIAlib29sICJQb3dlclRWIEJvb3Rsb2FkZXIgRHJpdmVyIFN1cHBvcnQiCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL0tjb25maWcgYi9hcmNoL21pcHMvcG93ZXJ0di9hc2ljL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTZiZmUuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvYXNpYy9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotY29uZmlnIE1JTl9SVU5USU1FX1JFU09VUkNFUwotCWJvb2wgIlN1cHBvcnQgZm9yIG1pbmltdW0gcnVudGltZSByZXNvdXJjZXMiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBQT1dFUlRWCi0JaGVscAotCSAgRW5hYmxlcyBzdXBwb3J0IGZvciBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgKFNBIGFzaWMpIHJ1bnRpbWUKLQkgIHJlc291cmNlcyB0aGF0IGFyZSBwcmVhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KLQotY29uZmlnIE1JTl9SVU5USU1FX0RPQ1NJUwotCWJvb2wgIlN1cHBvcnQgZm9yIG1pbmltdW0gRE9DU0lTIHJlc291cmNlIgotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gTUlOX1JVTlRJTUVfUkVTT1VSQ0VTCi0JaGVscAotCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgcHJlYWxsb2NhdGVkIERPQ1NJUyByZXNvdXJjZS4KLQotY29uZmlnIE1JTl9SVU5USU1FX1BNRU0KLQlib29sICJTdXBwb3J0IGZvciBtaW5pbXVtIFBNRU0gcmVzb3VyY2UiCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBNSU5fUlVOVElNRV9SRVNPVVJDRVMKLQloZWxwCi0JICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBwcmVhbGxvY2F0ZWQgTWVtb3J5IHJlc291cmNlLgotCi1jb25maWcgTUlOX1JVTlRJTUVfVEZUUAotCWJvb2wgIlN1cHBvcnQgZm9yIG1pbmltdW0gVEZUUCByZXNvdXJjZSIKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIE1JTl9SVU5USU1FX1JFU09VUkNFUwotCWhlbHAKLQkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHByZWFsbG9jYXRlZCBURlRQIHJlc291cmNlLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VydHYvcGNpL2ZpeHVwLXBvd2VydHYuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L3BjaS9maXh1cC1wb3dlcnR2LmMKaW5kZXggNzI2YmMyZS4uZDdlY2JhZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvcGNpL2ZpeHVwLXBvd2VydHYuYworKysgYi9hcmNoL21pcHMvcG93ZXJ0di9wY2kvZml4dXAtcG93ZXJ0di5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1wb3dlcnR2L2ludGVycnVwdHMuaD4KICNpbmNsdWRlICJwb3dlcnR2LXBjaS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0di11c2IuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L3Bvd2VydHYtdXNiLmMKaW5kZXggNmFjODVjZi4uYjBlMmFmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3Bvd2VydHYvcG93ZXJ0di11c2IuYworKysgYi9hcmNoL21pcHMvcG93ZXJ0di9wb3dlcnR2LXVzYi5jCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXBvd2VydHYvYXNpYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3JiNTMyL2dwaW8uYyBiL2FyY2gvbWlwcy9yYjUzMi9ncGlvLmMKaW5kZXggNmM0N2RmZS4uNmVjNDFkZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3JiNTMyL2dwaW8uYworKysgYi9hcmNoL21pcHMvcmI1MzIvZ3Bpby5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcmI1MzIvc2V0dXAuYyBiL2FyY2gvbWlwcy9yYjUzMi9zZXR1cC5jCmluZGV4IDUwZjUzMGYuLmQwYzY0ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9yYjUzMi9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9yYjUzMi9zZXR1cC5jCkBAIC0zLDYgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jCmluZGV4IGIxOGIwNGUuLmY5MGRjZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LWlycS5jCkBAIC0zMzcsMTIgKzMzNywxMiBAQAogCS5pcnFfdW5tYXNrCT0gZW5hYmxlX2JyaWRnZV9pcnEsCiB9OwogCi12b2lkIF9fZGV2aW5pdCByZWdpc3Rlcl9icmlkZ2VfaXJxKHVuc2lnbmVkIGludCBpcnEpCit2b2lkIHJlZ2lzdGVyX2JyaWRnZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmYnJpZGdlX2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KIAotaW50IF9fZGV2aW5pdCByZXF1ZXN0X2JyaWRnZV9pcnEoc3RydWN0IGJyaWRnZV9jb250cm9sbGVyICpiYykKK2ludCByZXF1ZXN0X2JyaWRnZV9pcnEoc3RydWN0IGJyaWRnZV9jb250cm9sbGVyICpiYykKIHsKIAlpbnQgaXJxID0gYWxsb2NhdGVfaXJxbm8oKTsKIAlpbnQgc3dsZXZlbCwgY3B1OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9zcGlfZWVwcm9tLmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NwaV9lZXByb20uYwppbmRleCAxMDNhYmMxLi4zZGJhZDk5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NwaV9lZXByb20uYworKysgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3NwaV9lZXByb20uYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2VlcHJvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzkvc2V0dXAuYyBiL2FyY2gvbWlwcy90eHg5L3JidHg0OTM5L3NldHVwLmMKaW5kZXggN2RjMGZhZi4uMmFkODk3MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4eDkvcmJ0eDQ5Mzkvc2V0dXAuYworKysgYi9hcmNoL21pcHMvdHh4OS9yYnR4NDkzOS9zZXR1cC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vZ2l1LmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9naXUuYwppbmRleCAyMmNjNmYyLi5iMzJiM2JjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9naXUuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9naXUuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy92cjQxeHgvY29tbW9uL3J0Yy5jIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcnRjLmMKaW5kZXggZWJjNWRjZi4uNzZlM2U4YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcnRjLmMKKysrIGIvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vcnRjLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1zdHViLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1zdHViLmMKaW5kZXggNTM4MjY2Yi4uNTIyZWI4YSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItc3R1Yi5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLXN0dWIuYwpAQCAtNzk4LDcgKzc5OCw3IEBACiAJaWYgKCh1MzIpIG1lbSAmIDEgJiYgY291bnQgPj0gMSkgewogCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUobWVtLCBjaCkgIT0gMCkKIAkJCXJldHVybiAwOwotCQlidWYgPSBwYWNrX2hleF9ieXRlKGJ1ZiwgY2hbMF0pOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgY2hbMF0pOwogCQltZW0rKzsKIAkJY291bnQtLTsKIAl9CkBAIC04MDYsOCArODA2LDggQEAKIAlpZiAoKHUzMikgbWVtICYgMyAmJiBjb3VudCA+PSAyKSB7CiAJCWlmIChnZGJzdHViX3JlYWRfd29yZChtZW0sIGNoKSAhPSAwKQogCQkJcmV0dXJuIDA7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsxXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsxXSk7CiAJCW1lbSArPSAyOwogCQljb3VudCAtPSAyOwogCX0KQEAgLTgxNSwxMCArODE1LDEwIEBACiAJd2hpbGUgKGNvdW50ID49IDQpIHsKIAkJaWYgKGdkYnN0dWJfcmVhZF9kd29yZChtZW0sIGNoKSAhPSAwKQogCQkJcmV0dXJuIDA7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsxXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsyXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFszXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsxXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsyXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFszXSk7CiAJCW1lbSArPSA0OwogCQljb3VudCAtPSA0OwogCX0KQEAgLTgyNiw4ICs4MjYsOCBAQAogCWlmIChjb3VudCA+PSAyKSB7CiAJCWlmIChnZGJzdHViX3JlYWRfd29yZChtZW0sIGNoKSAhPSAwKQogCQkJcmV0dXJuIDA7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFsxXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFsxXSk7CiAJCW1lbSArPSAyOwogCQljb3VudCAtPSAyOwogCX0KQEAgLTgzNSw3ICs4MzUsNyBAQAogCWlmIChjb3VudCA+PSAxKSB7CiAJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShtZW0sIGNoKSAhPSAwKQogCQkJcmV0dXJuIDA7Ci0JCWJ1ZiA9IHBhY2tfaGV4X2J5dGUoYnVmLCBjaFswXSk7CisJCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBjaFswXSk7CiAJfQogCiAJKmJ1ZiA9IDA7CkBAIC0xMjczLDEzICsxMjczLDEzIEBACiAJCXB0ciA9IG1lbTJoZXgodGl0bGUsIHB0ciwgc2l6ZW9mKHRpdGxlKSAtIDEsIDApOwogCiAJCWh4ID0gaGV4X2FzY19oaShleGNlcCA+PiA4KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGV4Y2VwID4+IDgpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfaGkoZXhjZXApOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oZXhjZXApOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCiAJCXB0ciA9IG1lbTJoZXgoY3JsZiwgcHRyLCBzaXplb2YoY3JsZikgLSAxLCAwKTsKIAkJKnB0ciA9IDA7CkBAIC0xMjkxLDIxICsxMjkxLDIxIEBACiAJCXB0ciA9IG1lbTJoZXgodGJjYmVyciwgcHRyLCBzaXplb2YodGJjYmVycikgLSAxLCAwKTsKIAogCQloeCA9IGhleF9hc2NfaGkoYmNiZXJyID4+IDI0KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGJjYmVyciA+PiAyNCk7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19oaShiY2JlcnIgPj4gMTYpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCQloeCA9IGhleF9hc2NfbG8oYmNiZXJyID4+IDE2KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2hpKGJjYmVyciA+PiA4KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2xvKGJjYmVyciA+PiA4KTsKLQkJcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIGh4KTsKKwkJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIGh4KTsKIAkJaHggPSBoZXhfYXNjX2hpKGJjYmVycik7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBoeCk7CisJCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBoeCk7CiAJCWh4ID0gaGV4X2FzY19sbyhiY2JlcnIpOwotCQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgaHgpOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgaHgpOwogCiAJCXB0ciA9IG1lbTJoZXgoY3JsZiwgcHRyLCBzaXplb2YoY3JsZikgLSAxLCAwKTsKIAkJKnB0ciA9IDA7CkBAIC0xMzIxLDEyICsxMzIxLDEyIEBACiAJICogU2VuZCB0cmFwIHR5cGUgKGNvbnZlcnRlZCB0byBzaWduYWwpCiAJICovCiAJKnB0cisrID0gJ1QnOwotCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBzaWd2YWwpOworCXB0ciA9IGhleF9ieXRlX3BhY2socHRyLCBzaWd2YWwpOwogCiAJLyoKIAkgKiBTZW5kIEVycm9yIFBDCiAJICovCi0JcHRyID0gcGFja19oZXhfYnl0ZShwdHIsIEdEQl9SRUdJRF9QQyk7CisJcHRyID0gaGV4X2J5dGVfcGFjayhwdHIsIEdEQl9SRUdJRF9QQyk7CiAJKnB0cisrID0gJzonOwogCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPnBjLCBwdHIsIDQsIDApOwogCSpwdHIrKyA9ICc7JzsKQEAgLTEzMzQsNyArMTMzNCw3IEBACiAJLyoKIAkgKiBTZW5kIGZyYW1lIHBvaW50ZXIKIAkgKi8KLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgR0RCX1JFR0lEX0ZQKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgR0RCX1JFR0lEX0ZQKTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleCgmcmVncy0+YTMsIHB0ciwgNCwgMCk7CiAJKnB0cisrID0gJzsnOwpAQCAtMTM0Myw3ICsxMzQzLDcgQEAKIAkgKiBTZW5kIHN0YWNrIHBvaW50ZXIKIAkgKi8KIAlzc3AgPSAodW5zaWduZWQgbG9uZykgKHJlZ3MgKyAxKTsKLQlwdHIgPSBwYWNrX2hleF9ieXRlKHB0ciwgR0RCX1JFR0lEX1NQKTsKKwlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwgR0RCX1JFR0lEX1NQKTsKIAkqcHRyKysgPSAnOic7CiAJcHRyID0gbWVtMmhleCgmc3NwLCBwdHIsIDQsIDApOwogCSpwdHIrKyA9ICc7JzsKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvS2NvbmZpZyBiL2FyY2gvb3BlbnJpc2MvS2NvbmZpZwppbmRleCA5NDYwZTFjLi5lNTE4YTVhIDEwMDY0NAotLS0gYS9hcmNoL29wZW5yaXNjL0tjb25maWcKKysrIGIvYXJjaC9vcGVucmlzYy9LY29uZmlnCkBAIC0xOSw5ICsxOSw2IEBACiBjb25maWcgTU1VCiAJZGVmX2Jvb2wgeQogCi1jb25maWcgV0lTSEJPTkVfQlVTX0JJR19FTkRJQU4KLQlkZWZfYm9vbCB5Ci0KIGNvbmZpZyBTWU1CT0xfUFJFRklYCiAgICAgICAgIHN0cmluZwogICAgICAgICBkZWZhdWx0ICIiCkBAIC0xNjAsMTUgKzE1Nyw2IEBACiAKIAkgIFNheSBZIGlmIHlvdSBhcmUgdW5zdXJlLgogCi1jb25maWcgT1BFTlJJU0NfRVhDRVBUSU9OX0RFQlVHCi0JYm9vbCAiUHJpbnQgcHJvY2Vzc29yIHN0YXRlIGF0IGVhY2ggZXhjZXB0aW9uIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgbWFrZSB5b3VyIGtlcm5lbCB1bnVzYWJsZSBmb3IgYWxsIGJ1dCBrZXJuZWwKLQkgIGRlYnVnZ2luZy4KLQotCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCi0KIGNvbmZpZyBPUEVOUklTQ19FU1JfRVhDRVBUSU9OX0JVR19DSEVDSwogCWJvb2wgIkNoZWNrIGZvciBwb3NzaWJsZSBFU1IgZXhjZXB0aW9uIGJ1ZyIKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggZWZhMGI2MGMuLjc2MGYzMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0xMDUsNyArMTA1LDggQEAKIAlfX2tlcm5lbF9mc2lkX3QJZl9mc2lkOwogCXMzMgkJZl9uYW1lbGVuOwogCXMzMgkJZl9mcnNpemU7Ci0JczMyCQlmX3NwYXJlWzVdOworCXMzMgkJZl9mbGFnczsKKwlzMzIJCWZfc3BhcmVbNF07CiB9OwogCiBzdHJ1Y3QgY29tcGF0X3NpZ2NvbnRleHQgewpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKaW5kZXggOTk0YmNkOS4uNTcwOWM1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGRjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BjaS1kbWEuYwppbmRleCBkMDQ3ZWRlLi5kODdkMWM0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcGNpLWRtYS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wY2ktZG1hLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4gICAgLyogZm9yIERNQV9DSFVOS19TSVpFICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGNiNzFmM2QuLmEzMzI4YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjdW5kZWYgUENJX0RFQlVHCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wZGMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2xpYi9pb21hcC5jIGIvYXJjaC9wYXJpc2MvbGliL2lvbWFwLmMKaW5kZXggNTA2OWU4Yi4uOGY0NzBjOSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbGliL2lvbWFwLmMKKysrIGIvYXJjaC9wYXJpc2MvbGliL2lvbWFwLmMKQEAgLTUsNiArNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNDc2ODJiNi4uYjE3N2NhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTMyMyw3ICszMjMsNyBAQAogCiBjb25maWcgSE9UUExVR19DUFUKIAlib29sICJTdXBwb3J0IGZvciBlbmFibGluZy9kaXNhYmxpbmcgQ1BVcyIKLQlkZXBlbmRzIG9uIFNNUCAmJiBIT1RQTFVHICYmIEVYUEVSSU1FTlRBTCAmJiAoUFBDX1BTRVJJRVMgfHwgUFBDX1BNQUMpCisJZGVwZW5kcyBvbiBTTVAgJiYgSE9UUExVRyAmJiBFWFBFUklNRU5UQUwgJiYgKFBQQ19QU0VSSUVTIHx8IFBQQ19QTUFDIHx8IFBQQ19QT1dFUk5WKQogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgdG8gYmUgYWJsZSB0byBkaXNhYmxlIGFuZCByZS1lbmFibGUgaW5kaXZpZHVhbAogCSAgQ1BVcyBhdCBydW50aW1lIG9uIFNNUCBtYWNoaW5lcy4KQEAgLTM0NSw3ICszNDUsNyBAQAogCiBjb25maWcgS0VYRUMKIAlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIChQUENfQk9PSzNTIHx8IEZTTF9CT09LRSkgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiAoUFBDX0JPT0szUyB8fCBGU0xfQk9PS0UgfHwgKDQ0eCAmJiAhU01QICYmICE0N3gpKSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBrZXhlYyBpcyBhIHN5c3RlbSBjYWxsIHRoYXQgaW1wbGVtZW50cyB0aGUgYWJpbGl0eSB0byBzaHV0ZG93biB5b3VyCiAJICBjdXJyZW50IGtlcm5lbCwgYW5kIHRvIHN0YXJ0IGFub3RoZXIga2VybmVsLiAgSXQgaXMgbGlrZSBhIHJlYm9vdApAQCAtMzc5LDEwICszNzksNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSAiTiIKIAotY29uZmlnIFBQQ0JVR19OVlJBTQotCWJvb2wgIkVuYWJsZSByZWFkaW5nIFBQQ0JVRyBOVlJBTSBkdXJpbmcgYm9vdCIgaWYgUFBMVVMgfHwgTE9QRUMKLQlkZWZhdWx0IHkgaWYgUFBDX1BSRVAKLQogY29uZmlnIElSUV9BTExfQ1BVUwogCWJvb2wgIkRpc3RyaWJ1dGUgaW50ZXJydXB0cyBvbiBhbGwgQ1BVcyBieSBkZWZhdWx0IgogCWRlcGVuZHMgb24gU01QICYmICFNVjY0MzYwCkBAIC00MjksOCArNDI1LDcgQEAKIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBTWVNfU1VQUE9SVFNfSFVHRVRMQkZTCi0gICAgICAgZGVmX2Jvb2wgeQotICAgICAgIGRlcGVuZHMgb24gUFBDX0JPT0szU182NAorCWJvb2wKIAogc291cmNlICJtbS9LY29uZmlnIgogCkBAIC03NDYsMjQgKzc0MSw2IEBACiAJZGVwZW5kcyBvbiBQQ0lfODI2MCAmJiAhODI3MgogCWRlZmF1bHQgeQogCi1jaG9pY2UKLQlwcm9tcHQgIklETUEgY2hhbm5lbCBmb3IgUENJIDkgd29ya2Fyb3VuZCIKLQlkZXBlbmRzIG9uIDgyNjBfUENJOQotCi1jb25maWcgODI2MF9QQ0k5X0lETUExCi0JYm9vbCAiSURNQTEiCi0KLWNvbmZpZyA4MjYwX1BDSTlfSURNQTIKLQlib29sICJJRE1BMiIKLQotY29uZmlnIDgyNjBfUENJOV9JRE1BMwotCWJvb2wgIklETUEzIgotCi1jb25maWcgODI2MF9QQ0k5X0lETUE0Ci0JYm9vbCAiSURNQTQiCi0KLWVuZGNob2ljZQotCiBzb3VyY2UgImRyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwppbmRleCAwNjdjYjg0Li4xYjhhOWM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwpAQCAtMTQxLDkgKzE0MSw2IEBACiAKIGNvbmZpZyBQUENfRUFSTFlfREVCVUcKIAlib29sICJFYXJseSBkZWJ1Z2dpbmcgKGRhbmdlcm91cykiCi0JIyBQUENfRUFSTFlfREVCVUcgb24gNDQwIGxlYXZlcyBBUz0xIG1hcHBpbmdzIGFib3ZlIHRoZSBUTEIgaGlnaCB3YXRlcgotCSMgbWFyaywgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGggY3VycmVudCA0NDAgS1ZNLgotCWRlcGVuZHMgb24gIUtWTQogCWhlbHAKIAkgIFNheSBZIHRvIGVuYWJsZSBzb21lIGVhcmx5IGRlYnVnZ2luZyBmYWNpbGl0aWVzIHRoYXQgbWF5IGJlIGF2YWlsYWJsZQogCSAgZm9yIHlvdXIgcHJvY2Vzc29yL2JvYXJkIGNvbWJpbmF0aW9uLiBUaG9zZSBmYWNpbGl0aWVzIGFyZSBoYWNrcwpAQCAtMjIyLDcgKzIxOSw5IEBACiAKIGNvbmZpZyBQUENfRUFSTFlfREVCVUdfNDR4CiAJYm9vbCAiRWFybHkgc2VyaWFsIGRlYnVnZ2luZyBmb3IgSUJNL0FNQ0MgNDR4IENQVXMiCi0JZGVwZW5kcyBvbiA0NHgKKwkjIFBQQ19FQVJMWV9ERUJVRyBvbiA0NDAgbGVhdmVzIEFTPTEgbWFwcGluZ3MgYWJvdmUgdGhlIFRMQiBoaWdoIHdhdGVyCisJIyBtYXJrLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aCBjdXJyZW50IDQ0MCBLVk0uCisJZGVwZW5kcyBvbiA0NHggJiYgIUtWTQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIElCTSA0NHggY2hpcHMgdmlhIHRoZQogCSAgaW5idWlsdCBzZXJpYWwgcG9ydC4gIElmIHlvdSBlbmFibGUgdGhpcywgZW5zdXJlIHlvdSBzZXQKQEAgLTI1OCw4ICsyNTcsMzUgQEAKIAlkZXBlbmRzIG9uIFBQQ19XU1AKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKIAorY29uZmlnIFBQQ19FQVJMWV9ERUJVR19QUzNHRUxJQworCWJvb2wgIkVhcmx5IGRlYnVnZ2luZyB0aHJvdWdoIHRoZSBQUzMgRXRoZXJuZXQgcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwlzZWxlY3QgUFMzR0VMSUNfVURCRworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcgZm9yIHRoZSBQbGF5U3RhdGlvbjMgdmlhCisJICBVRFAgYnJvYWRjYXN0cyBzZW50IG91dCB0aHJvdWdoIHRoZSBFdGhlcm5ldCBwb3J0LgorCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX09QQUxfUkFXCisJYm9vbCAiT1BBTCByYXcgY29uc29sZSIKKwlkZXBlbmRzIG9uIEhWQ19PUEFMCisJaGVscAorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGVhcmx5IGRlYnVnZ2luZyBmb3IgdGhlIFBvd2VyTlYgcGxhdGZvcm0KKwkgIHVzaW5nIGEgInJhdyIgY29uc29sZQorCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX09QQUxfSFZTSQorCWJvb2wgIk9QQUwgaHZzaSBjb25zb2xlIgorCWRlcGVuZHMgb24gSFZDX09QQUwKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgZWFybHkgZGVidWdnaW5nIGZvciB0aGUgUG93ZXJOViBwbGF0Zm9ybQorCSAgdXNpbmcgYW4gImh2c2kiIGNvbnNvbGUKKwogZW5kY2hvaWNlCiAKK2NvbmZpZyBQUENfRUFSTFlfREVCVUdfT1BBTAorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFBQQ19FQVJMWV9ERUJVR19PUEFMX1JBVyB8fCBQUENfRUFSTFlfREVCVUdfT1BBTF9IVlNJCisKKwogY29uZmlnIFBQQ19FQVJMWV9ERUJVR19IVlNJX1ZURVJNTk8KIAloZXggInZ0ZXJtIG51bWJlciB0byB1c2Ugd2l0aCBlYXJseSBkZWJ1ZyBIVlNJIgogCWRlcGVuZHMgb24gUFBDX0VBUkxZX0RFQlVHX0xQQVJfSFZTSQpAQCAtMjY4LDYgKzI5NCwxOCBAQAogCSAgWW91IHByb2JhYmx5IHdhbnQgMHgzMDAwMDAwMCBmb3IgeW91ciBmaXJzdCBzZXJpYWwgcG9ydCBhbmQKIAkgIDB4MzAwMDAwMDEgZm9yIHlvdXIgc2Vjb25kIG9uZQogCitjb25maWcgUFBDX0VBUkxZX0RFQlVHX09QQUxfVlRFUk1OTworCWhleCAidnRlcm0gbnVtYmVyIHRvIHVzZSB3aXRoIE9QQUwgZWFybHkgZGVidWciCisJZGVwZW5kcyBvbiBQUENfRUFSTFlfREVCVUdfT1BBTAorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgVGhpcyBjb3JyZXNwb25kIHRvIHdoaWNoIC9kZXYvaHZjTiB5b3Ugd2FudCB0byB1c2UgZm9yIGVhcmx5CisJICBkZWJ1Zy4KKworCSAgT24gT1BBTCB2MSAodGFrZW92ZXIpIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSAwCisJICBPbiBPUEFMIHYyLCB0aGlzIHdpbGwgYmUgMCBmb3IgbmV0d29yayBjb25zb2xlIGFuZCAxIG9yIDIgZm9yCisJICB0aGUgbWFjaGluZSBidWlsdC1pbiBzZXJpYWwgcG9ydHMuCisKIGNvbmZpZyBQUENfRUFSTFlfREVCVUdfNDR4X1BIWVNMT1cKIAloZXggIkxvdyAzMiBiaXRzIG9mIGVhcmx5IGRlYnVnIFVBUlQgcGh5c2ljYWwgYWRkcmVzcyIKIAlkZXBlbmRzIG9uIFBQQ19FQVJMWV9ERUJVR180NHgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggYzI2MjAwYi4uNzJlZThjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTU4LDcgKzU4LDcgQEAKIGxpYmZkdCAgICAgICA6PSBmZHQuYyBmZHRfcm8uYyBmZHRfd2lwLmMgZmR0X3N3LmMgZmR0X3J3LmMgZmR0X3N0cmVycm9yLmMKIGxpYmZkdGhlYWRlciA6PSBmZHQuaCBsaWJmZHQuaCBsaWJmZHRfaW50ZXJuYWwuaAogCi0kKGFkZHByZWZpeCAkKG9iaikvLCQobGliZmR0KSBsaWJmZHQtd3JhcHBlci5vIHNpbXBsZWJvb3Qubyk6IFwKKyQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHQpIGxpYmZkdC13cmFwcGVyLm8gc2ltcGxlYm9vdC5vIGVwYXByLm8pOiBcCiAJJChhZGRwcmVmaXggJChvYmopLywkKGxpYmZkdGhlYWRlcikpCiAKIHNyYy13bGliIDo9IHN0cmluZy5TIGNydDAuUyBjcnRzYXZyZXMuUyBzdGRpby5jIG1haW4uYyBcCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkJJChpZiAkMywgLXMgJDMpJChpZiAkNCwgLWQgJDQpJChpZiAkNSwgLWkgJDUpIHZtbGludXgKIAogaW1hZ2UtJChDT05GSUdfUFBDX1BTRVJJRVMpCQkrPSB6SW1hZ2UucHNlcmllcworaW1hZ2UtJChDT05GSUdfUFBDX1BPV0VSTlYpCQkrPSB6SW1hZ2UucHNlcmllcwogaW1hZ2UtJChDT05GSUdfUFBDX01BUExFKQkJKz0gekltYWdlLm1hcGxlCiBpbWFnZS0kKENPTkZJR19QUENfSUJNX0NFTExfQkxBREUpCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfUFMzKQkJCSs9IGR0YkltYWdlLnBzMwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NoYXJvbi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2hhcm9uLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTAwZTUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NoYXJvbi5kdHMKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBjaGFyb24gYm9hcmQgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlbWloYWxmCisgKiBNYXJpYW4gQmFsYWtvd2ljeiA8bThAc2VtaWhhbGYuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgKKyAqIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworL2R0cy12MS87CisKKy8geworCW1vZGVsID0gImFub24sY2hhcm9uIjsKKwljb21wYXRpYmxlID0gImFub24sY2hhcm9uIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SworCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MDAwMDAwMDAgMHgwODAwMDAwMD47CS8vIDEyOE1CCisJfTsKKworCXNvYzUyMDBAZjAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtaW1tciI7CisJCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47CisJCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OworCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKworCQljZG1AMjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtY2RtIjsKKwkJCXJlZyA9IDwweDIwMCAweDM4PjsKKwkJfTsKKworCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKKwkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLXBpYyI7CisJCQlyZWcgPSA8MHg1MDAgMHg4MD47CisJCX07CisKKwkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MDAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJCWZzbCxoYXMtd2R0OworCQl9OworCisJCWNhbkA5MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1tc2NhbiI7CisJCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47CisJCQlyZWcgPSA8MHg5MDAgMHg4MD47CisJCX07CisKKwkJY2FuQDk4MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKKwkJCXJlZyA9IDwweDk4MCAweDgwPjsKKwkJfTsKKworCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1ncGlvIjsKKwkJCXJlZyA9IDwweGIwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA3IDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJdXNiQDEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7CisJCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OworCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47CisJCX07CisKKwkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJkbWEtY29udHJvbGxlciI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwweDEyMDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKKwkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLXhsYiI7CisJCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKKwkJfTsKKworCQlzZXJpYWxAMjAwMCB7CQkvLyBQU0MxCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCX07CisKKwkJc2VyaWFsQDI0MDAgewkJLy8gUFNDMworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CisJCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAzIDA+OworCQl9OworCisJCWV0aGVybmV0QDMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1mZWMiOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MiA1IDA+OworCQkJZml4ZWQtbGluayA9IDwxIDEgMTAwIDAgMD47CisJCX07CisKKwkJbWRpb0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLW1kaW8iOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47ICAgICAgIC8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47ICAgLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCisJCX07CisKKwkJYXRhQDNhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1hdGEiOworCQkJcmVnID0gPDB4M2EwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJfTsKKworCQlpMmNAM2QwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDNkMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47CisJCX07CisKKworCQlpMmNAM2Q0MCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDNkNDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CisKKwkJCWR0dEAyOCB7CisJCQkJY29tcGF0aWJsZSA9ICJuYXRpb25hbCxsbTgwIjsKKwkJCQlyZWcgPSA8MHgyOD47CisJCQl9OworCisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTM3NCI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJfTsKKwkJfTsKKworCQlzcmFtQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1zcmFtIjsKKwkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKKwkJfTsKKwl9OworCisJbG9jYWxidXMgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlcyA9IDwJMCAwIDB4ZmMwMDAwMDAgMHgwMjAwMDAwMAorCQkJCTEgMCAweGUwMDAwMDAwIDB4MDQwMDAwMDAgLy8gQ1MxIHJhbmdlLCBTTTUwMQorCQkJCTMgMCAweGU4MDAwMDAwIDB4MDAwODAwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MDIwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDw0PjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCX07CisKKwkJZGlzcGxheUAxLDAgeworCQkJY29tcGF0aWJsZSA9ICJzbWksc201MDEiOworCQkJcmVnID0gPDEgMHgwMDAwMDAwMCAweDAwODAwMDAwCisJCQkgICAgICAgMSAweDAzZTAwMDAwIDB4MDAyMDAwMDA+OworCQkJbW9kZSA9ICI2NDB4NDgwLTMyQDYwIjsKKwkJCWludGVycnVwdHMgPSA8MSAxIDM+OworCQkJbGl0dGxlLWVuZGlhbjsKKwkJfTsKKworCQltcmFtMEAzLDAgeworCQkJY29tcGF0aWJsZSA9ICJtdGQtcmFtIjsKKwkJCXJlZyA9IDwzIDB4MDAwMDAgMHg4MDAwMD47CisJCQliYW5rLXdpZHRoID0gPDE+OworCQl9OworCX07CisKKwlwY2lAZjAwMDBkMDAgeworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcGNpIjsKKwkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzCisJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMCAwIDMKKwkJCQkgMHhjMDAwIDAgMCAzICZtcGM1MjAwX3BpYyAwIDAgMworCQkJCSAweGMwMDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMCAzPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCisJCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgxMDAwMDAwMAorCQkJICAweDAyMDAwMDAwIDAgMHg5MDAwMDAwMCAweDkwMDAwMDAwIDAgMHgxMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgwMTAwMDAwMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCmluZGV4IDI3YmQyNjcuLmE3NTExZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCkBAIC0yMywxOSArMjMsMjYgQEAKIAogCXNvYzUyMDBAZjAwMDAwMDAgewogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCSNncGlvLWNlbGxzID0gPDI+OwogCQkJZnNsLGhhcy13ZHQ7CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCX07CisKKwkJdGltZXJANjEwIHsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJZ3Bpby1jb250cm9sbGVyOwogCQl9OwogCiAJCXJ0Y0A4MDAgewogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQljYW5AOTAwIHsKLQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlzcGlAZjAwIHsKKwkJCW1zcDQzMEAwIHsKKwkJCQljb21wYXRpYmxlID0gInNwaWRldiI7CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MzIwMDA+OworCQkJCXJlZyA9IDwwPjsKKwkJCX07CiAJCX07CiAKIAkJcHNjQDIwMDAgewkJLy8gUFNDMQpAQCAtNzMsMTEgKzgwLDE2IEBACiAJCX07CiAKIAkJaTJjQDNkMDAgewotCQkJcnRjQDUwIHsKKwkJCWVlcHJvbUA1MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJhdCwyNGMwOCI7CiAJCQkJcmVnID0gPDB4NTA+OwogCQkJfTsKIAorCQkJcnRjQDU2IHsKKwkJCQljb21wYXRpYmxlID0gIm1jLHJ2MzAyOWMyIjsKKwkJCQlyZWcgPSA8MHg1Nj47CisJCQl9OworCiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CiAJCQkJcmVnID0gPDB4Njg+OwpAQCAtOTAsMTEgKzEwMiwyMiBAQAogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzCisJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMCAwIDMKKwkJCQkgMHhjMDAwIDAgMCAzICZtcGM1MjAwX3BpYyAwIDAgMworCQkJCSAweGMwMDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMCAzPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCisJCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgxMDAwMDAwMAorCQkJICAweDAyMDAwMDAwIDAgMHg5MDAwMDAwMCAweDkwMDAwMDAwIDAgMHgxMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJcmFuZ2VzID0gPDAgMCAweGZmMDAwMDAwIDB4MTAwMDAwMD47CisJCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDEwMDAwMDAKKwkJCSAgNCAwIDB4NjAwMDAwMDAgMHgwMDAxMDAwPjsKIAogCQkvLyAxNi1iaXQgZmxhc2ggZGV2aWNlIGF0IExvY2FsUGx1cyBCdXMgQ1MwCiAJCWZsYXNoQDAsMCB7CkBAIC0xMjIsNSArMTQ1LDI1IEBACiAJCQkJcmVnID0gPDB4MDBmMDAwMDAgMHgxMDAwMDA+OwogCQkJfTsKIAkJfTsKKworCQljYW5ANCwwIHsKKwkJCWNvbXBhdGlibGUgPSAibnhwLHNqYTEwMDAiOworCQkJcmVnID0gPDQgMHgwMDAgMHg4MD47CisJCQlueHAsZXh0ZXJuYWwtY2xvY2stZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MSAyIDM+OyAvLyBMZXZlbC1sb3cKKwkJfTsKKworCQljYW5ANCwxMDAgeworCQkJY29tcGF0aWJsZSA9ICJueHAsc2phMTAwMCI7CisJCQlyZWcgPSA8NCAweDEwMCAweDgwPjsKKwkJCW54cCxleHRlcm5hbC1jbG9jay1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDIgMz47ICAvLyBMZXZlbC1sb3cKKwkJfTsKKworCQlzZXJpYWxANCwyMDAgeworCQkJY29tcGF0aWJsZSA9ICJueHAsc2MyOGw5MiI7CisJCQlyZWcgPSA8NCAweDIwMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAzIDM+OworCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9wcGM5YS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cwppbmRleCA4M2Y0Yjc5Li4yMjY2YmJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cwpAQCAtMjY5LDE0ICsyNjksMTYgQEAKIAkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7CisJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OwogCQkJcmFuZ2VzID0gPDB4MCAweDI0MDAwIDB4MTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MHgxZCAweDIgMHgxZSAweDIgMHgyMiAweDI+OworCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwICAyIDM0IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKIApAQCAtMjkwLDI1ICsyOTIsNDggQEAKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg5IDB4ND47CiAJCQkJCXJlZyA9IDwxPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCQl9OwogCQkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg4IDB4ND47CiAJCQkJCXJlZyA9IDwzPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQl9OworCQkJCXRiaTA6IHRiaS1waHlAMTEgeworCQkJCQlyZWcgPSA8MHgxMT47CisJCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwogCQkJCX07CiAJCQl9OwogCQl9OwogCiAJCWVuZXQxOiBldGhlcm5ldEAyNjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjYwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWYgMHgyIDB4MjAgMHgyIDB4MjEgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MzEgMiAzMiAyIDMzIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkyPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKKworCQkJbWRpb0A1MjAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKKwkJCQlyZWcgPSA8MHg1MjAgMHgyMD47CisKKwkJCQl0YmkyOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMKaW5kZXggZmMzYTMzMS4uNDI5ZTg3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjMzEwLmR0cwpAQCAtMjY3LDE0ICsyNjcsMTYgQEAKIAkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7CisJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OwogCQkJcmFuZ2VzID0gPDB4MCAweDI0MDAwIDB4MTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MHgxZCAweDIgMHgxZSAweDIgMHgyMiAweDI+OworCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwICAyIDM0IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKIApAQCAtMjg4LDI1ICsyOTAsNDggQEAKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg5IDB4ND47CiAJCQkJCXJlZyA9IDwxPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCQl9OwogCQkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg4IDB4ND47CiAJCQkJCXJlZyA9IDwzPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQl9OworCQkJCXRiaTA6IHRiaS1waHlAMTEgeworCQkJCQlyZWcgPSA8MHgxMT47CisJCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwogCQkJCX07CiAJCQl9OwogCQl9OwogCiAJCWVuZXQxOiBldGhlcm5ldEAyNjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjYwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWYgMHgyIDB4MjAgMHgyIDB4MjEgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MzEgMiAzMiAyIDMzIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkyPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKKworCQkJbWRpb0A1MjAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKKwkJCQlyZWcgPSA8MHg1MjAgMHgyMD47CisKKwkJCQl0YmkyOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKaW5kZXggYzA2NzFjYy4uZDgxMjAxYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cwpAQCAtMjY3LDE0ICsyNjcsMTYgQEAKIAkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7CisJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OwogCQkJcmFuZ2VzID0gPDB4MCAweDI0MDAwIDB4MTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MHgxZCAweDIgMHgxZSAweDIgMHgyMiAweDI+OworCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwICAyIDM0IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKIApAQCAtMjg4LDI1ICsyOTAsNDggQEAKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg5IDB4ND47CiAJCQkJCXJlZyA9IDwxPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCQl9OwogCQkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2VmX3BpYz47CiAJCQkJCWludGVycnVwdHMgPSA8MHg4IDB4ND47CiAJCQkJCXJlZyA9IDwzPjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQl9OworCQkJCXRiaTA6IHRiaS1waHlAMTEgeworCQkJCQlyZWcgPSA8MHgxMT47CisJCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwogCQkJCX07CiAJCQl9OwogCQl9OwogCiAJCWVuZXQxOiBldGhlcm5ldEAyNjAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOworCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDB4MjYwMDAgMHgxMDAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MWYgMHgyIDB4MjAgMHgyIDB4MjEgMHgyPjsKKwkJCWludGVycnVwdHMgPSA8MzEgMiAzMiAyIDMzIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl0YmktaGFuZGxlID0gPCZ0YmkyPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJnbWlpIjsKKworCQkJbWRpb0A1MjAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKKwkJCQlyZWcgPSA8MHg1MjAgMHgyMD47CisKKwkJCQl0YmkyOiB0YmktcGh5QDExIHsKKwkJCQkJcmVnID0gPDB4MTE+OworCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJCQl9OworCQkJfTsKIAkJfTsKIAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaGN1NC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaGN1NC5kdHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODg1OTguLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hjdTQuZHRzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0qIERldmljZSBUcmVlIFNvdXJjZSBmb3IgTmV0c3RhbCBNYXNjaGluZW4gSENVNAotKiBiYXNlZCBvbiB0aGUgSUJNIFdhbG51dAotKgotKiBDb3B5cmlnaHQgMjAwOAotKiBOaWtsYXVzIEdpZ2VyIDxuaWtsYXVzLmdpZ2VyQG1lbWJlci5mc2Yub3JnPgotKgotKiBDb3B5cmlnaHQgMjAwNyBJQk0gQ29ycC4KLSogSm9zaCBCb3llciA8andib3llckBsaW51eC52bmV0LmlibS5jb20+Ci0qCi0qIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQKLSogYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSovCi0KLS9kdHMtdjEvOwotCi0vIHsKLQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OwotCSNzaXplLWNlbGxzID0gPDB4MT47Ci0JbW9kZWwgPSAibmV0c3RhbCxoY3U0IjsKLQljb21wYXRpYmxlID0gIm5ldHN0YWwsaGN1NCI7Ci0JZGNyLXBhcmVudCA9IDwweDE+OwotCi0JYWxpYXNlcyB7Ci0JCWV0aGVybmV0MCA9ICIvcGxiL29wYi9ldGhlcm5ldEBlZjYwMDgwMCI7Ci0JCXNlcmlhbDAgPSAiL3BsYi9vcGIvc2VyaWFsQGVmNjAwMzAwIjsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDB4MT47Ci0JCSNzaXplLWNlbGxzID0gPDB4MD47Ci0KLQkJY3B1QDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCW1vZGVsID0gIlBvd2VyUEMsNDA1R1ByIjsKLQkJCXJlZyA9IDwweDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDB4MD47CS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDB4MjA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MHgyMD47Ci0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwotCQkJZGNyLWNvbnRyb2xsZXI7Ci0JCQlkY3ItYWNjZXNzLW1ldGhvZCA9ICJuYXRpdmUiOwotCQkJbGludXgscGhhbmRsZSA9IDwweDE+OwotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwIDB4MD47CS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQl9OwotCi0JVUlDMDogaW50ZXJydXB0LWNvbnRyb2xsZXIgewotCQljb21wYXRpYmxlID0gImlibSx1aWMiOwotCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJY2VsbC1pbmRleCA9IDwweDA+OwotCQlkY3ItcmVnID0gPDB4YzAgMHg5PjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MHgwPjsKLQkJI3NpemUtY2VsbHMgPSA8MHgwPjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwweDI+OwotCQlsaW51eCxwaGFuZGxlID0gPDB4Mj47Ci0JfTsKLQotCXBsYiB7Ci0JCWNvbXBhdGlibGUgPSAiaWJtLHBsYjMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OwotCQkjc2l6ZS1jZWxscyA9IDwweDE+OwotCQlyYW5nZXM7Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDA+OwkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0KLQkJU0RSQU0wOiBtZW1vcnktY29udHJvbGxlciB7Ci0JCQljb21wYXRpYmxlID0gImlibSxzZHJhbS00MDVncCI7Ci0JCQlkY3ItcmVnID0gPDB4MTAgMHgyPjsKLQkJfTsKLQotCQlNQUw6IG1jbWFsIHsKLQkJCWNvbXBhdGlibGUgPSAiaWJtLG1jbWFsLTQwNWdwIiwgImlibSxtY21hbCI7Ci0JCQlkY3ItcmVnID0gPDB4MTgwIDB4NjI+OwotCQkJbnVtLXR4LWNoYW5zID0gPDB4MT47Ci0JCQludW0tcngtY2hhbnMgPSA8MHgxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8MHgyPjsKLQkJCWludGVycnVwdHMgPSA8MHhiIDB4NCAweGMgMHg0IDB4YSAweDQgMHhkIDB4NCAweGUgMHg0PjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8MHgzPjsKLQkJfTsKLQotCQlQT0IwOiBvcGIgewotCQkJY29tcGF0aWJsZSA9ICJpYm0sb3BiLTQwNWdwIiwgImlibSxvcGIiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MHgxPjsKLQkJCSNzaXplLWNlbGxzID0gPDB4MT47Ci0JCQlyYW5nZXMgPSA8MHhlZjYwMDAwMCAweGVmNjAwMDAwIDB4YTAwMDAwPjsKLQkJCWRjci1yZWcgPSA8MHhhMCAweDU+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MD47CS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQotCQkJVUFSVDA6IHNlcmlhbEBlZjYwMDMwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJCXJlZyA9IDwweGVmNjAwMzAwIDB4OD47Ci0JCQkJdmlydHVhbC1yZWcgPSA8MHhlZjYwMDMwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MD47LyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDB4Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwweDAgMHg0PjsKLQkJCX07Ci0KLQkJCUlJQzogaTJjQGVmNjAwNTAwIHsKLQkJCQljb21wYXRpYmxlID0gImlibSxpaWMtNDA1Z3AiLCAiaWJtLGlpYyI7Ci0JCQkJcmVnID0gPDB4ZWY2MDA1MDAgMHgxMT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwweDI+OwotCQkJCWludGVycnVwdHMgPSA8MHgyIDB4ND47Ci0JCQl9OwotCi0JCQlHUElPOiBncGlvQGVmNjAwNzAwIHsKLQkJCQljb21wYXRpYmxlID0gImlibSxncGlvLTQwNWdwIjsKLQkJCQlyZWcgPSA8MHhlZjYwMDcwMCAweDIwPjsKLQkJCX07Ci0KLQkJCUVNQUM6IGV0aGVybmV0QGVmNjAwODAwIHsKLQkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCQljb21wYXRpYmxlID0gImlibSxlbWFjLTQwNWdwIiwgImlibSxlbWFjIjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDB4Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwweGYgMHg0IDB4OSAweDQ+OwotCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAwIDAwIDAwIDAwIDAwIDAwXTsKLQkJCQlyZWcgPSA8MHhlZjYwMDgwMCAweDcwPjsKLQkJCQltYWwtZGV2aWNlID0gPDB4Mz47Ci0JCQkJbWFsLXR4LWNoYW5uZWwgPSA8MHgwPjsKLQkJCQltYWwtcngtY2hhbm5lbCA9IDwweDA+OwotCQkJCWNlbGwtaW5kZXggPSA8MHgwPjsKLQkJCQltYXgtZnJhbWUtc2l6ZSA9IDwweDVkYz47Ci0JCQkJcngtZmlmby1zaXplID0gPDB4MTAwMD47Ci0JCQkJdHgtZmlmby1zaXplID0gPDB4ODAwPjsKLQkJCQlwaHktbW9kZSA9ICJybWlpIjsKLQkJCQlwaHktbWFwID0gPDB4MT47Ci0JCQl9OwotCQl9OwotCi0JCUVCQzA6IGViYyB7Ci0JCQljb21wYXRpYmxlID0gImlibSxlYmMtNDA1Z3AiLCAiaWJtLGViYyI7Ci0JCQlkY3ItcmVnID0gPDB4MTIgMHgyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDB4Mj47Ci0JCQkjc2l6ZS1jZWxscyA9IDwweDE+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MD47CS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQotCQkJc3JhbUAwLDAgewotCQkJCXJlZyA9IDwweDAgMHgwIDB4ODAwMDA+OwotCQkJfTsKLQotCQkJZmxhc2hAMCw4MDAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJqZWRlYy1mbGFzaCI7Ci0JCQkJYmFuay13aWR0aCA9IDwweDE+OwotCQkJCXJlZyA9IDwweDAgMHg4MDAwMCAweDgwMDAwPjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwweDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDB4MT47Ci0KLQkJCQlwYXJ0aXRpb25AMCB7Ci0JCQkJCWxhYmVsID0gIk9wZW5CSU9TIjsKLQkJCQkJcmVnID0gPDB4MCAweDgwMDAwPjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCX07Ci0KLQljaG9zZW4gewotCQlsaW51eCxzdGRvdXQtcGF0aCA9ICIvcGxiL29wYi9zZXJpYWxAZWY2MDAzMDAiOwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tzaTg1NjAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tzaTg1NjAuZHRzCmluZGV4IGJkYjdmYzAuLjI5NmM1NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rc2k4NTYwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3NpODU2MC5kdHMKQEAgLTMwNiw3ICszMDYsNyBAQAogCWxvY2FsYnVzQGZkZjA1MDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLWxvY2FsYnVzIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1sb2NhbGJ1cyIsICJzaW1wbGUtYnVzIjsKIAkJcmVnID0gPDB4ZmRmMDUwMDAgMHg2OD47CiAKIAkJcmFuZ2VzID0gPDB4MCAweDAgMHhlMDAwMDAwMCAweDAwODAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWdjb2dlLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ2NvZ2UuZHRzCmluZGV4IDEzNjBkMmYuLmVkZWRhZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ2NvZ2UuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZ2NvZ2UuZHRzCkBAIC0yMTMsNiArMjEzLDE1IEBACiAJCQkJbGludXgsbmV0d29yay1pbmRleCA9IDwyPjsKIAkJCQlmc2wsY3BtLWNvbW1hbmQgPSA8MHgxNjIwMDMwMD47CiAJCQl9OworCisJCQl1c2JAMTFiNjAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgyNzItY3BtLXVzYiI7CisJCQkJbW9kZSA9ICJwZXJpcGhlcmFsIjsKKwkJCQlyZWcgPSA8MHgxMWI2MCAweDQwIDB4OGIwMCAweDEwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMSA4PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZQSUM+OworCQkJCXVzYi1jbG9jayA9IDw1PjsKKwkJCX07CiAJCX07CiAKIAkJY3BtMl9waW9fYzogZ3Bpby1jb250cm9sbGVyQDEwZDQwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUyMDBiLmR0c2kKaW5kZXggYmMyNzU0OC4uN2FiMjg2YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUyMDBiLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUyMDBiLmR0c2kKQEAgLTE0Nyw2ICsxNDcsOCBAQAogCQl9OwogCiAJCXNwaUBmMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNwaSIsImZzbCxtcGM1MjAwLXNwaSI7CiAJCQlyZWcgPSA8MHhmMDAgMHgyMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIgMTMgMCAyIDE0IDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cwppbmRleCBiNTNkMWRmLi41MDVkYzg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cwpAQCAtMzkwLDcgKzM5MCw4IEBACiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OWUtbG9jYWxidXMiLAotCQkJICAgICAiZnNsLHBxMnByby1sb2NhbGJ1cyI7CisJCQkgICAgICJmc2wscHEycHJvLWxvY2FsYnVzIiwKKwkJCSAgICAgInNpbXBsZS1idXMiOwogCQlyZWcgPSA8MHhlMDAwNTAwMCAweGQ4PjsKIAkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZTAwMDAwMCAweDEwMDAwMDAJLyogZmxhc2ggKi8KIAkJCSAgMHgxIDB4MCAweGY4MDAwMDAwIDB4MjAwMDAJLyogVlNDIDczODUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwppbmRleCAxYmU5NzQzLi5iOWI4NzE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJfTsKIAogCQlib2FyZC1jb250cm9sQDMsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMmRzLXBpeGlzIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKIAkJCXJlZyA9IDwzIDAgMHgzMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCS8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBkcy5kdHMKaW5kZXggZGFlNDAzMS4uNjZmMDNkNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0cwpAQCAtMTE4LDYgKzExOCwxMSBAQAogCQkJfTsKIAkJfTsKIAorCQlib2FyZC1jb250cm9sQDMsMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjAyMGRzLWZwZ2EiLCAiZnNsLGZwZ2EtbmdwaXhpcyI7CisJCQlyZWcgPSA8MHgzIDB4MCAweDMwPjsKKwkJfTsKKwogCQluYW5kQDQsMCB7CiAJCQljb21wYXRpYmxlID0gImZzbCxlbGJjLWZjbS1uYW5kIjsKIAkJCXJlZyA9IDwweDQgMHgwIDB4NDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQwcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHJkYi5kdHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODRlMzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQwcmRiLmR0cworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogUDIwNDBSREIgRGV2aWNlIFRyZWUgU291cmNlCi0gKgotICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKgotICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS9pbmNsdWRlLyAicDIwNDBzaS5kdHNpIgotCi0vIHsKLQltb2RlbCA9ICJmc2wsUDIwNDBSREIiOwotCWNvbXBhdGlibGUgPSAiZnNsLFAyMDQwUkRCIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JfTsKLQotCXNvYzogc29jQGZmZTAwMDAwMCB7Ci0JCXNwaUAxMTAwMDAgewotCQkJZmxhc2hAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKLQkJCQlyZWcgPSA8MD47Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLwotCQkJCXBhcnRpdGlvbkB1LWJvb3QgewotCQkJCQlsYWJlbCA9ICJ1LWJvb3QiOwotCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0JCQkJcGFydGl0aW9uQGtlcm5lbCB7Ci0JCQkJCWxhYmVsID0gImtlcm5lbCI7Ci0JCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQkJCQlwYXJ0aXRpb25AZHRiIHsKLQkJCQkJbGFiZWwgPSAiZHRiIjsKLQkJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDEwMDAwMD47Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCQkJCXBhcnRpdGlvbkBmcyB7Ci0JCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKLQkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJaTJjQDExODAwMCB7Ci0JCQlsbTc1YkA0OCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJueHAsbG03NWEiOwotCQkJCXJlZyA9IDwweDQ4PjsKLQkJCX07Ci0JCQllZXByb21ANTAgewotCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOwotCQkJCXJlZyA9IDwweDUwPjsKLQkJCX07Ci0JCQlydGNANjggewotCQkJCWNvbXBhdGlibGUgPSAicGVyaWNvbSxwdDdjNDMzOCI7Ci0JCQkJcmVnID0gPDB4Njg+OwotCQkJfTsKLQkJfTsKLQotCQlpMmNAMTE4MTAwIHsKLQkJCWVlcHJvbUA1MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzI1NiI7Ci0JCQkJcmVnID0gPDB4NTA+OwotCQkJfTsKLQkJfTsKLQotCQl1c2IwOiB1c2JAMjEwMDAwIHsKLQkJCXBoeV90eXBlID0gInV0bWkiOwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJZHJfbW9kZSA9ICJob3N0IjsKLQkJCXBoeV90eXBlID0gInV0bWkiOwotCQl9OwotCX07Ci0KLQlsb2NhbGJ1c0BmZmUxMjQwMDAgewotCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OwotCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OwotCi0JCWZsYXNoQDAsMCB7Ci0JCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7Ci0JCQlyZWcgPSA8MCAwIDB4MDgwMDAwMDA+OwotCQkJYmFuay13aWR0aCA9IDwyPjsKLQkJCWRldmljZS13aWR0aCA9IDwyPjsKLQkJfTsKLQl9OwotCi0JcGNpMDogcGNpZUBmZmUyMDAwMDAgewotCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OwotCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OwotCQlwY2llQDAgewotCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCi0JCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAotCQkJCSAgMCAweDIwMDAwMDAwCi0KLQkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCi0JCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAotCQkJCSAgMCAweDAwMDEwMDAwPjsKLQkJfTsKLQl9OwotCi0JcGNpMTogcGNpZUBmZmUyMDEwMDAgewotCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OwotCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGY4MDEwMDAwIDB4MCAweDAwMDEwMDAwPjsKLQkJcGNpZUAwIHsKLQkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAotCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKLQkJCQkgIDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAotCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKLQkJCQkgIDAgMHgwMDAxMDAwMD47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJcmVnID0gPDB4ZiAweGZlMjAyMDAwIDAgMHgxMDAwPjsKLQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDQwMDAwMDAwIDAgMHgyMDAwMDAwMAotCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAyMDAwMCAwIDB4MDAwMTAwMDA+OwotCQlwY2llQDAgewotCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCi0JCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAotCQkJCSAgMCAweDIwMDAwMDAwCi0KLQkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCi0JCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAotCQkJCSAgMCAweDAwMDEwMDAwPjsKLQkJfTsKLQl9OwotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDBzaS5kdHNpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmRiYjI0Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MHNpLmR0c2kKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyoKLSAqIFAyMDQwIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCi0gKgotICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKgotICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS9kdHMtdjEvOwotCi0vIHsKLQljb21wYXRpYmxlID0gImZzbCxQMjA0MCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JI3NpemUtY2VsbHMgPSA8Mj47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0KLQlhbGlhc2VzIHsKLQkJY2NzciA9ICZzb2M7Ci0KLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlzZXJpYWwxID0gJnNlcmlhbDE7Ci0JCXNlcmlhbDIgPSAmc2VyaWFsMjsKLQkJc2VyaWFsMyA9ICZzZXJpYWwzOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCQl1c2IwID0gJnVzYjA7Ci0JCXVzYjEgPSAmdXNiMTsKLQkJZG1hMCA9ICZkbWEwOwotCQlkbWExID0gJmRtYTE7Ci0JCXNkaGMgPSAmc2RoYzsKLQkJbXNpMCA9ICZtc2kwOwotCQltc2kxID0gJm1zaTE7Ci0JCW1zaTIgPSAmbXNpMjsKLQotCQljcnlwdG8gPSAmY3J5cHRvOwotCQlzZWNfanIwID0gJnNlY19qcjA7Ci0JCXNlY19qcjEgPSAmc2VjX2pyMTsKLQkJc2VjX2pyMiA9ICZzZWNfanIyOwotCQlzZWNfanIzID0gJnNlY19qcjM7Ci0JCXJ0aWNfYSA9ICZydGljX2E7Ci0JCXJ0aWNfYiA9ICZydGljX2I7Ci0JCXJ0aWNfYyA9ICZydGljX2M7Ci0JCXJ0aWNfZCA9ICZydGljX2Q7Ci0JCXNlY19tb24gPSAmc2VjX21vbjsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKLQkJCUwyXzA6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47Ci0JCQlMMl8xOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwyPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OwotCQkJTDJfMjogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Mz47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKLQkJCUwyXzM6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQl9OwotCi0Jc29jOiBzb2NAZmZlMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OwotCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKLQotCQlzb2Mtc3JhbS1lcnJvciB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47Ci0JCX07Ci0KLQkJY29yZW5ldC1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwotCQl9OwotCi0JCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImZzbCxwNDA4MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKLQkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNz47Ci0JCX07Ci0KLQkJY29yZW5ldC1jZkAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47Ci0JCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OwotCQkJZnNsLGNjZi1udW0tc25vb3BpZHMgPSA8MzI+OwotCQl9OwotCi0JCWlvbW11QDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHBhbXUtdjEuMCIsICJmc2wscGFtdSI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDQwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkyNCAyIDAgMAotCQkJCTE2IDIgMSAzMD47Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljIiwgImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCW1zaTA6IG1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDIwMD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlMCAwIDAgMAotCQkJCTB4ZTEgMCAwIDAKLQkJCQkweGUyIDAgMCAwCi0JCQkJMHhlMyAwIDAgMAotCQkJCTB4ZTQgMCAwIDAKLQkJCQkweGU1IDAgMCAwCi0JCQkJMHhlNiAwIDAgMAotCQkJCTB4ZTcgMCAwIDA+OwotCQl9OwotCi0JCW1zaTE6IG1zaUA0MTgwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTgwMCAweDIwMD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlOCAwIDAgMAotCQkJCTB4ZTkgMCAwIDAKLQkJCQkweGVhIDAgMCAwCi0JCQkJMHhlYiAwIDAgMAotCQkJCTB4ZWMgMCAwIDAKLQkJCQkweGVkIDAgMCAwCi0JCQkJMHhlZSAwIDAgMAotCQkJCTB4ZWYgMCAwIDA+OwotCQl9OwotCi0JCW1zaTI6IG1zaUA0MWEwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MWEwMCAweDIwMD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhmMCAwIDAgMAotCQkJCTB4ZjEgMCAwIDAKLQkJCQkweGYyIDAgMCAwCi0JCQkJMHhmMyAwIDAgMAotCQkJCTB4ZjQgMCAwIDAKLQkJCQkweGY1IDAgMCAwCi0JCQkJMHhmNiAwIDAgMAotCQkJCTB4ZjcgMCAwIDA+OwotCQl9OwotCi0JCWd1dHM6IGdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OwotCQkJZnNsLGhhcy1yc3RjcjsKLQkJCSNzbGVlcC1jZWxscyA9IDwxPjsKLQkJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKLQkJfTsKLQotCQlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMGUwMCAweDIwMD47Ci0JCQkjc2xlZXAtY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcmNwbS0xLjAiOwotCQkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwxPjsKLQkJfTsKLQotCQlzZnA6IHNmcEBlODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOwotCQkJcmVnCSAgID0gPDB4ZTgwMDAgMHgxMDAwPjsKLQkJfTsKLQotCQlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1zZXJkZXMiOwotCQkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKLQkJfTsKLQotCQlkbWEwOiBkbWFAMTAwMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDEwMDMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDEwMDEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0cyA9IDwyOCAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMCAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMiAwIDA+OwotCQkJfTsKLQkJfTsKLQotCQlkbWExOiBkbWFAMTAxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDEwMTMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDEwMTEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMzIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNCAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMiAwIDA+OwotCQkJfTsKLQkJfTsKLQotCQlzcGlAMTEwMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOwotCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDUzIDB4MiAwIDA+OwotCQkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OwotCi0JCX07Ci0KLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47Ci0JCQlzZGhjaSxhdXRvLWNtZDEyOwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0KLQkJaTJjQDExODAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE4MTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExODEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExOTEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTkxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExZDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKLQkJfTsKLQotCQlncGlvMDogZ3Bpb0AxMzAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtZ3BpbyIsICJmc2wscW9yaXEtZ3BpbyI7Ci0JCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTUgMiAwIDA+OwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCX07Ci0KLQkJdXNiMDogdXNiQDIxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MC11c2IyLW1waCIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOwotCQkJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKLQkJCXBvcnQwOwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMHgyIDAgMD47Ci0JCX07Ci0KLQkJc2F0YUAyMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjggMHgyIDAgMD47Ci0JCX07Ci0KLQkJc2F0YUAyMjEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjkgMHgyIDAgMD47Ci0JCX07Ci0KLQkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcmVnID0gPDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJcmFuZ2VzID0gPDAgMHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDkyIDIgMCAwPjsKLQotCQkJc2VjX2pyMDoganJAMTAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjE6IGpyQDIwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIyOiBqckAzMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMzoganJANDAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKLQkJCX07Ci0KLQkJCXJ0aWNANjAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljIjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHg2MDAwIDB4MTAwPjsKLQkJCQlyYW5nZXMgPSA8MHgwIDB4NjEwMCAweGUwMD47Ci0KLQkJCQlydGljX2E6IHJ0aWMtYUAwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19iOiBydGljLWJAMjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2M6IHJ0aWMtY0A0MCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDQwIDB4MjAgMHgzMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfZDogcnRpYy1kQDYwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1tb24iLCAiZnNsLHNlYy12NC4wLW1vbiI7Ci0JCQlyZWcgPSA8MHgzMTQwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8OTMgMiAwIDA+OwotCQl9OwotCi0JfTsKLQotCWxvY2FsYnVzQGZmZTEyNDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7Ci0JCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JfTsKLQotCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMD47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDEgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDIgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci0KLQlwY2kxOiBwY2llQGZmZTIwMTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMj47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxcmRiLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWI2ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxcmRiLmR0cwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIFAyMDQxUkRCIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvaW5jbHVkZS8gInAyMDQxc2kuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiZnNsLFAyMDQxUkRCIjsKKwljb21wYXRpYmxlID0gImZzbCxQMjA0MVJEQiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCX07CisKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweDAwMDAwMDAwIDB4MDEwMDgwMDA+OworCX07CisKKwlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQlzcGlAMTEwMDAwIHsKKwkJCWZsYXNoQDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CisJCQkJcmVnID0gPDA+OworCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwkJCQlwYXJ0aXRpb25AdS1ib290IHsKKwkJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBrZXJuZWwgeworCQkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGR0YiB7CisJCQkJCWxhYmVsID0gImR0YiI7CisJCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZnMgeworCQkJCQlsYWJlbCA9ICJmaWxlIHN5c3RlbSI7CisJCQkJCXJlZyA9IDwweDAwNzAwMDAwIDB4MDA5MDAwMDA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCWkyY0AxMTgwMDAgeworCQkJbG03NWJANDggeworCQkJCWNvbXBhdGlibGUgPSAibnhwLGxtNzVhIjsKKwkJCQlyZWcgPSA8MHg0OD47CisJCQl9OworCQkJZWVwcm9tQDUwIHsKKwkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMjU2IjsKKwkJCQlyZWcgPSA8MHg1MD47CisJCQl9OworCQkJcnRjQDY4IHsKKwkJCQljb21wYXRpYmxlID0gInBlcmljb20scHQ3YzQzMzgiOworCQkJCXJlZyA9IDwweDY4PjsKKwkJCX07CisJCX07CisKKwkJaTJjQDExODEwMCB7CisJCQllZXByb21ANTAgeworCQkJCWNvbXBhdGlibGUgPSAiYXQyNCwyNGMyNTYiOworCQkJCXJlZyA9IDwweDUwPjsKKwkJCX07CisJCX07CisKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQlkcl9tb2RlID0gImhvc3QiOworCQl9OworCX07CisKKwlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OworCisJCWZsYXNoQDAsMCB7CisJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CisJCQlyZWcgPSA8MCAwIDB4MDgwMDAwMDA+OworCQkJYmFuay13aWR0aCA9IDwyPjsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsKKwkJfTsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGY4MDEwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKKworCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAyMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDQwMDAwMDAwIDAgMHgyMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAyMDAwMCAwIDB4MDAwMTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMCAweDAwMDEwMDAwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MXNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFzaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDkyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFzaS5kdHNpCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogUDIwNDEgU2lsaWNvbiBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAyMDQxIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXBjaTIgPSAmcGNpMjsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1MDogUG93ZXJQQyxlNTAwbWNAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CisJCQlMMl8wOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Mj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKKwkJCUwyXzI6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CisJCQlMMl8zOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJfTsKKworCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCisJCWRjc3ItZXB1QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAorCQkJCSAgICAgIDg0IDIgMCAwCisJCQkJICAgICAgODUgMiAwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCQlkY3NyLW54Y0AyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZHBhYUA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZGRyQDEyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJCWRldi1oYW5kbGUgPSA8JmRkcj47CisJCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLW5hbEAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1yY3BtQDIyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKKwkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUyPjsKKwkJCXJlZyA9IDwweDQyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKKwkJCXJlZyA9IDwweDQzMDAwIDB4MTAwMD47CisJCX07CisJfTsKKworCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAic29jIjsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKKwkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47CisKKwkJc29jLXNyYW0tZXJyb3IgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjk+OworCQl9OworCisJCWNvcmVuZXQtbGF3QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKKwkJfTsKKworCQlkZHI6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCQl9OworCisJCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1sMy1jYWNoZS1jb250cm9sbGVyIiwgImZzbCxwNDA4MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKKwkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNz47CisJCX07CisKKwkJY29yZW5ldC1jZkAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OworCQkJZnNsLGNjZi1udW0tc25vb3BpZHMgPSA8MzI+OworCQl9OworCisJCWlvbW11QDIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHBhbXUtdjEuMCIsICJmc2wscGFtdSI7CisJCQlyZWcgPSA8MHgyMDAwMCAweDQwMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkyNCAyIDAgMAorCQkJCTE2IDIgMSAzMD47CisJCX07CisKKwkJbXBpYzogcGljQDQwMDAwIHsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OworCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljIiwgImNocnAsb3Blbi1waWMiOworCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOworCQl9OworCisJCW1zaTA6IG1zaUA0MTYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTYwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlMCAwIDAgMAorCQkJCTB4ZTEgMCAwIDAKKwkJCQkweGUyIDAgMCAwCisJCQkJMHhlMyAwIDAgMAorCQkJCTB4ZTQgMCAwIDAKKwkJCQkweGU1IDAgMCAwCisJCQkJMHhlNiAwIDAgMAorCQkJCTB4ZTcgMCAwIDA+OworCQl9OworCisJCW1zaTE6IG1zaUA0MTgwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MTgwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlOCAwIDAgMAorCQkJCTB4ZTkgMCAwIDAKKwkJCQkweGVhIDAgMCAwCisJCQkJMHhlYiAwIDAgMAorCQkJCTB4ZWMgMCAwIDAKKwkJCQkweGVkIDAgMCAwCisJCQkJMHhlZSAwIDAgMAorCQkJCTB4ZWYgMCAwIDA+OworCQl9OworCisJCW1zaTI6IG1zaUA0MWEwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJCQlyZWcgPSA8MHg0MWEwMCAweDIwMD47CisJCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhmMCAwIDAgMAorCQkJCTB4ZjEgMCAwIDAKKwkJCQkweGYyIDAgMCAwCisJCQkJMHhmMyAwIDAgMAorCQkJCTB4ZjQgMCAwIDAKKwkJCQkweGY1IDAgMCAwCisJCQkJMHhmNiAwIDAgMAorCQkJCTB4ZjcgMCAwIDA+OworCQl9OworCisJCWd1dHM6IGdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKKwkJfTsKKworCQlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7CisJCQlyZWcgPSA8MHhlMGUwMCAweDIwMD47CisJCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJY2xvY2tnZW46IGdsb2JhbC11dGlsaXRpZXNAZTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OworCisJCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcmNwbS0xLjAiOworCQkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlzZnA6IHNmcEBlODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOworCQkJcmVnCSAgID0gPDB4ZTgwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1zZXJkZXMiOworCQkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkbWEwOiBkbWFAMTAwMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMDMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMDEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwyOCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzMCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzEgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlkbWExOiBkbWFAMTAxMzAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKKwkJCXJlZyA9IDwweDEwMTMwMCAweDQ+OworCQkJcmFuZ2VzID0gPDB4MCAweDEwMTEwMCAweDIwMD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJZG1hLWNoYW5uZWxAMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwzMiAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4ODAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMzIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTAwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQkJaW50ZXJydXB0cyA9IDwzNCAyIDAgMD47CisJCQl9OworCQkJZG1hLWNoYW5uZWxAMTgwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDM+OworCQkJCWludGVycnVwdHMgPSA8MzUgMiAwIDA+OworCQkJfTsKKwkJfTsKKworCQlzcGlAMTEwMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1lc3BpIiwgImZzbCxtcGM4NTM2LWVzcGkiOworCQkJcmVnID0gPDB4MTEwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDUzIDB4MiAwIDA+OworCQkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCQl9OworCisJCXNkaGM6IHNkaGNAMTE0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWVzZGhjIiwgImZzbCxlc2RoYyI7CisJCQlyZWcgPSA8MHgxMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NDggMiAwIDA+OworCQkJc2RoY2ksYXV0by1jbWQxMjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJfTsKKworCQlpMmNAMTE4MDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODAwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTgxMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE4MTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE5MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExOTEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCXNlcmlhbDA6IHNlcmlhbEAxMWM1MDAgeworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDE6IHNlcmlhbEAxMWM2MDAgeworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFjNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDI6IHNlcmlhbEAxMWQ1MDAgeworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNTAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCXNlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgeworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDB4MTFkNjAwIDB4MTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworCQl9OworCisJCWdwaW8wOiBncGlvQDEzMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1ncGlvIiwgImZzbCxxb3JpcS1ncGlvIjsKKwkJCXJlZyA9IDwweDEzMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw1NSAyIDAgMD47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJfTsKKworCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXVzYjItbXBoIiwKKwkJCQkJImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7CisJCQlyZWcgPSA8MHgyMTAwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ0IDB4MiAwIDA+OworCQkJcGh5X3R5cGUgPSAidXRtaSI7CisJCQlwb3J0MDsKKwkJfTsKKworCQl1c2IxOiB1c2JAMjExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXVzYjItZHIiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7CisJCQlyZWcgPSA8MHgyMTEwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDB4MiAwIDA+OworCQkJcGh5X3R5cGUgPSAidXRtaSI7CisJCX07CisKKwkJc2F0YUAyMjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7CisJCQlyZWcgPSA8MHgyMjAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NjggMHgyIDAgMD47CisJCX07CisKKwkJc2F0YUAyMjEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7CisJCQlyZWcgPSA8MHgyMjEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NjkgMHgyIDAgMD47CisJCX07CisKKwkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MzAwMDAwIDB4MTAwMDA+OworCQkJcmFuZ2VzID0gPDAgMHgzMDAwMDAgMHgxMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDkyIDIgMCAwPjsKKworCQkJc2VjX2pyMDoganJAMTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjE6IGpyQDIwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIyOiBqckAzMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMzoganJANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKKwkJCX07CisKKwkJCXJ0aWNANjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYyIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljIjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQlyZWcgPSA8MHg2MDAwIDB4MTAwPjsKKwkJCQlyYW5nZXMgPSA8MHgwIDB4NjEwMCAweGUwMD47CisKKwkJCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19iOiBydGljLWJAMjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2M6IHJ0aWMtY0A0MCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDQwIDB4MjAgMHgzMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlzZWNfbW9uOiBzZWNfbW9uQDMxNDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1tb24iLCAiZnNsLHNlYy12NC4wLW1vbiI7CisJCQlyZWcgPSA8MHgzMTQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8OTMgMiAwIDA+OworCQl9OworCisJfTsKKworCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCQlmc2wsbXNpID0gPCZtc2kwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAorCQkJCT47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJZnNsLG1zaSA9IDwmbXNpMT47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKKwkJCQk+OworCQl9OworCX07CisKKwlwY2kyOiBwY2llQGZmZTIwMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJcGNpZUAwIHsKKwkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAorCQkJCT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFkcy5kdHMKaW5kZXggNjljYWU2Ny4uYmJkMTEzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cwpAQCAtNDUsNiArNDUsMTAgQEAKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAl9OwogCisJZGNzcjogZGNzckBmMDAwMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHgwMDAwMDAwMCAweDAxMDA4MDAwPjsKKwl9OworCiAJc29jOiBzb2NAZmZlMDAwMDAwIHsKIAkJc3BpQDExMDAwMCB7CiAJCQlmbGFzaEAwIHsKQEAgLTE0Nyw4ICsxNTEsOCBAQAogCQl9OwogCiAJCWJvYXJkLWNvbnRyb2xAMywwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxZHMtcGl4aXMiOwotCQkJcmVnID0gPDMgMCAweDIwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKKwkJCXJlZyA9IDwzIDAgMHgzMD47CiAJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxc2kuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MXNpLmR0c2kKaW5kZXggOGI2OTU4MC4uODcxMzBiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxc2kuZHRzaQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFzaS5kdHNpCkBAIC00Miw2ICs0Miw3IEBACiAKIAlhbGlhc2VzIHsKIAkJY2NzciA9ICZzb2M7CisJCWRjc3IgPSAmZGNzcjsKIAogCQlzZXJpYWwwID0gJnNlcmlhbDA7CiAJCXNlcmlhbDEgPSAmc2VyaWFsMTsKQEAgLTExNCw2ICsxMTUsNzQgQEAKIAkJfTsKIAl9OwogCisJZGNzcjogZGNzckBmMDAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7CisKKwkJZGNzci1lcHVAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCisJCQkJICAgICAgODQgMiAwIDAKKwkJCQkgICAgICA4NSAyIDAgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1ucGMgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOworCQkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47CisJCX07CisJCWRjc3ItbnhjQDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNvcmVuZXQgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1jb3JlbmV0IjsKKwkJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kcGFhQDkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQzMDQxLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQzMDQxLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHI+OworCQkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQzMDQxLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLXJjcG1AMjIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQzMDQxLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKKwkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUyPjsKKwkJCXJlZyA9IDwweDQyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKKwkJCXJlZyA9IDwweDQzMDAwIDB4MTAwMD47CisJCX07CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTEzMyw3ICsyMDIsNyBAQAogCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKIAkJfTsKIAotCQltZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJZGRyOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA2MHFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBxZHMuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjkxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBxZHMuZHRzCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogUDMwNjBRRFMgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9pbmNsdWRlLyAicDMwNjBzaS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJmc2wsUDMwNjBRRFMiOworCWNvbXBhdGlibGUgPSAiZnNsLFAzMDYwUURTIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJfTsKKworCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4MDAwMDAwMDAgMHgwMTAwODAwMD47CisJfTsKKworCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXNwaUAxMTAwMDAgeworCQkJZmxhc2hAMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKKwkJCQlyZWcgPSA8MD47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkB1LWJvb3QgeworCQkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKKwkJCQkJcmVhZC1vbmx5OworCQkJCX07CisJCQkJcGFydGl0aW9uQGtlcm5lbCB7CisJCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OworCQkJCQlyZWFkLW9ubHk7CisJCQkJfTsKKwkJCQlwYXJ0aXRpb25AZHRiIHsKKwkJCQkJbGFiZWwgPSAiZHRiIjsKKwkJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDEwMDAwMD47CisJCQkJCXJlYWQtb25seTsKKwkJCQl9OworCQkJCXBhcnRpdGlvbkBmcyB7CisJCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKKwkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47CisJCQkJfTsKKwkJCX07CisJCQlmbGFzaEAxIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLGVuMjVxMzJiIjsKKwkJCQlyZWcgPSA8MT47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkBzcGkxIHsKKwkJCQkJbGFiZWwgPSAic3BpMSI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDA0MDAwMDA+OworCQkJCX07CisJCQl9OworCQkJZmxhc2hAMiB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCxhdDQ1ZGIwODFkIjsKKwkJCQlyZWcgPSA8Mj47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkBzcGkxIHsKKwkJCQkJbGFiZWwgPSAic3BpMiI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OworCQkJCX07CisJCQl9OworCQkJZmxhc2hAMyB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzc3QyNXdmMDQwIjsKKwkJCQlyZWcgPSA8Mz47CisJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCQkJCXBhcnRpdGlvbkBzcGkzIHsKKwkJCQkJbGFiZWwgPSAic3BpMyI7CisJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAwODAwMDA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCWkyY0AxMTgwMDAgeworCQkJZWVwcm9tQDUxIHsKKwkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMjU2IjsKKwkJCQlyZWcgPSA8MHg1MT47CisJCQl9OworCQkJZWVwcm9tQDUzIHsKKwkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMjU2IjsKKwkJCQlyZWcgPSA8MHg1Mz47CisJCQl9OworCQkJcnRjQDY4IHsKKwkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczMyMzIiOworCQkJCXJlZyA9IDwweDY4PjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MSAweDEgMCAwPjsKKwkJCX07CisJCX07CisKKwkJdXNiMDogdXNiQDIxMDAwMCB7CisJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwkJfTsKKworCQl1c2IxOiB1c2JAMjExMDAwIHsKKwkJCWRyX21vZGUgPSAiaG9zdCI7CisJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwkJfTsKKwl9OworCisJcmFwaWRpb0BmZmUwYzAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUwYzAwMDAgMCAweDExMDAwPjsKKworCQlwb3J0MSB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJCXBvcnQyIHsKKwkJCXJhbmdlcyA9IDwwIDAgMHhjIDB4MzAwMDAwMDAgMCAweDEwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMTI0MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwCisJCQkgIDIgMCAweGYgMHhmZmEwMDAwMCAweDAwMDQwMDAwCisJCQkgIDMgMCAweGYgMHhmZmRmMDAwMCAweDAwMDA4MDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMCAweDA4MDAwMDAwPjsKKwkJCWJhbmstd2lkdGggPSA8Mj47CisJCQlkZXZpY2Utd2lkdGggPSA8Mj47CisJCX07CisKKwkJbmFuZEAyLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQkJcmVnID0gPDB4MiAweDAgMHg0MDAwMD47CisKKwkJCXBhcnRpdGlvbkAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIFUtQm9vdCBJbWFnZSI7CisJCQkJcmVnID0gPDB4MCAweDAyMDAwMDAwPjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AMjAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBSb290IEZpbGUgU3lzdGVtIjsKKwkJCQlyZWcgPSA8MHgwMjAwMDAwMCAweDEwMDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxMjAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCQkJcmVnID0gPDB4MTIwMDAwMDAgMHgwODAwMDAwMD47CisJCQl9OworCisJCQlwYXJ0aXRpb25AMWEwMDAwMDAgeworCQkJCWxhYmVsID0gIk5BTkQgTGludXggS2VybmVsIEltYWdlIjsKKwkJCQlyZWcgPSA8MHgxYTAwMDAwMCAweDA0MDAwMDAwPjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxZTAwMDAwMCB7CisJCQkJbGFiZWwgPSAiTkFORCBEVEIgSW1hZ2UiOworCQkJCXJlZyA9IDwweDFlMDAwMDAwIDB4MDEwMDAwMDA+OworCQkJfTsKKworCQkJcGFydGl0aW9uQDFmMDAwMDAwIHsKKwkJCQlsYWJlbCA9ICJOQU5EIFdyaXRhYmxlIFVzZXIgYXJlYSI7CisJCQkJcmVnID0gPDB4MWYwMDAwMDAgMHgyMTAwMDAwMD47CisJCQl9OworCQl9OworCisJCWJvYXJkLWNvbnRyb2xAMywwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwcWRzLWZwZ2EiLCAiZnNsLGZwZ2EtcWl4aXMiOworCQkJcmVnID0gPDMgMCAweDEwMD47CisJCX07CisJfTsKKworCXBjaTA6IHBjaWVAZmZlMjAwMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJcGNpZUAwIHsKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAorCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDAgMHgyMDAwMDAwMAorCisJCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMAorCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDAgMHgwMDAxMDAwMD47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKKwkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCisJCQkJICAwIDB4MjAwMDAwMDAKKworCQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAKKwkJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwCisJCQkJICAwIDB4MDAwMTAwMDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwc2kuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA2MHNpLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5NDdlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA2MHNpLmR0c2kKQEAgLTAsMCArMSw3MTkgQEAKKy8qCisgKiBQMzA2MCBTaWxpY29uIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJY29tcGF0aWJsZSA9ICJmc2wsUDMwNjAiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJYWxpYXNlcyB7CisJCWNjc3IgPSAmc29jOworCQlkY3NyID0gJmRjc3I7CisKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCXNlcmlhbDIgPSAmc2VyaWFsMjsKKwkJc2VyaWFsMyA9ICZzZXJpYWwzOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQltc2kwID0gJm1zaTA7CisJCW1zaTEgPSAmbXNpMTsKKwkJbXNpMiA9ICZtc2kyOworCisJCWNyeXB0byA9ICZjcnlwdG87CisJCXNlY19qcjAgPSAmc2VjX2pyMDsKKwkJc2VjX2pyMSA9ICZzZWNfanIxOworCQlzZWNfanIyID0gJnNlY19qcjI7CisJCXNlY19qcjMgPSAmc2VjX2pyMzsKKwkJcnRpY19hID0gJnJ0aWNfYTsKKwkJcnRpY19iID0gJnJ0aWNfYjsKKwkJcnRpY19jID0gJnJ0aWNfYzsKKwkJcnRpY19kID0gJnJ0aWNfZDsKKwkJc2VjX21vbiA9ICZzZWNfbW9uOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwyXzE6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NDogUG93ZXJQQyxlNTAwbWNANCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDQ+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfND47CisJCQlMMl80OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTU6IFBvd2VyUEMsZTUwMG1jQDUgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw1PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OworCQkJTDJfNTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU2OiBQb3dlclBDLGU1MDBtY0A2IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Nj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl82PjsKKwkJCUwyXzY6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NzogUG93ZXJQQyxlNTAwbWNANyB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDc+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNz47CisJCQlMMl83OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJfTsKKworCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCisJCWRjc3ItZXB1QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAorCQkJCSAgICAgIDg0IDIgMCAwCisJCQkJICAgICAgODUgMiAwIDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbnBjIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCQl9OworCQlkY3NyLW54Y0AyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jb3JlbmV0IHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZHBhYUA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1vY25AMTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZGRyQDEyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJCWRldi1oYW5kbGUgPSA8JmRkcj47CisJCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLW5hbEAxODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1yY3BtQDIyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKKwkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU0PjsKKwkJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU1PjsKKwkJCXJlZyA9IDwweDQ1MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ2MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKKwkJCXJlZyA9IDwweDQ2MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHU3PjsKKwkJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47CisJCX07CisJfTsKKworCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJZGV2aWNlX3R5cGUgPSAic29jIjsKKwkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKKwkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47CisKKwkJc29jLXNyYW0tZXJyb3IgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjk+OworCQl9OworCisJCWNvcmVuZXQtbGF3QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKKwkJfTsKKworCQlkZHI6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCQl9OworCisJCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKKwkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAorCQkJICAgICAgIDB4MTEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKKwkJfTsKKworCQljb3JlbmV0LWNmQDE4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOworCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKKwkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47CisJCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47CisJCX07CisKKwkJaW9tbXVAMjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKKwkJCXJlZyA9IDwweDIwMDAwIDB4NTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTI0IDIgMCAwCisJCQkJMTYgMiAxIDMwPjsKKwkJfTsKKworCQltcGljOiBwaWNANDAwMDAgeworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47CisJCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCX07CisKKwkJbXNpMDogbXNpQDQxNjAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGUwIDAgMCAwCisJCQkJMHhlMSAwIDAgMAorCQkJCTB4ZTIgMCAwIDAKKwkJCQkweGUzIDAgMCAwCisJCQkJMHhlNCAwIDAgMAorCQkJCTB4ZTUgMCAwIDAKKwkJCQkweGU2IDAgMCAwCisJCQkJMHhlNyAwIDAgMD47CisJCX07CisKKwkJbXNpMTogbXNpQDQxODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGU4IDAgMCAwCisJCQkJMHhlOSAwIDAgMAorCQkJCTB4ZWEgMCAwIDAKKwkJCQkweGViIDAgMCAwCisJCQkJMHhlYyAwIDAgMAorCQkJCTB4ZWQgMCAwIDAKKwkJCQkweGVlIDAgMCAwCisJCQkJMHhlZiAwIDAgMD47CisJCX07CisKKwkJbXNpMjogbXNpQDQxYTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQkweGYwIDAgMCAwCisJCQkJMHhmMSAwIDAgMAorCQkJCTB4ZjIgMCAwIDAKKwkJCQkweGYzIDAgMCAwCisJCQkJMHhmNCAwIDAgMAorCQkJCTB4ZjUgMCAwIDAKKwkJCQkweGY2IDAgMCAwCisJCQkJMHhmNyAwIDAgMD47CisJCX07CisKKwkJcm11OiBybXVAZDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tcm11IjsKKwkJCXJlZyA9IDwweGQzMDAwIDB4NTAwPjsKKwkJCXJhbmdlcyA9IDwweDAgMHhkMzAwMCAweDUwMD47CisKKwkJCW1lc3NhZ2UtdW5pdEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLW1zZy11bml0IjsKKwkJCQlyZWcgPSA8MHgwIDB4MTAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPAorCQkJCQk2MCAyIDAgMCAgLyogbXNnMV90eF9pcnEgKi8KKwkJCQkJNjEgMiAwIDA+Oy8qIG1zZzFfcnhfaXJxICovCisJCQl9OworCQkJbWVzc2FnZS11bml0QDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7CisJCQkJcmVnID0gPDB4MTAwIDB4MTAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPAorCQkJCQk2MiAyIDAgMCAgLyogbXNnMl90eF9pcnEgKi8KKwkJCQkJNjMgMiAwIDA+Oy8qIG1zZzJfcnhfaXJxICovCisJCQl9OworCQkJZG9vcmJlbGwtdW5pdEA0MDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tZGJlbGwtdW5pdCI7CisJCQkJcmVnID0gPDB4NDAwIDB4ODA+OworCQkJCWludGVycnVwdHMgPSA8CisJCQkJCTU2IDIgMCAwICAvKiBiZWxsX291dGJfaXJxICovCisJCQkJCTU3IDIgMCAwPjsvKiBiZWxsX2luYl9pcnEgKi8KKwkJCX07CisJCQlwb3J0LXdyaXRlLXVuaXRANGUwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLXBvcnQtd3JpdGUtdW5pdCI7CisJCQkJcmVnID0gPDB4NGUwIDB4MjA+OworCQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDExPjsKKwkJCX07CisJCX07CisKKwkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7CisJCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47CisJCQlmc2wsaGFzLXJzdGNyOworCQkJI3NsZWVwLWNlbGxzID0gPDE+OworCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OworCQl9OworCisJCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKKwkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKKwkJCSNzbGVlcC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKKwkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCX07CisKKwkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7CisJCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OworCQkJI3NsZWVwLWNlbGxzID0gPDE+OworCQl9OworCisJCXNmcDogc2ZwQGU4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7CisJCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OworCQl9OworCisJCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXNlcmRlcyI7CisJCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OworCQl9OworCisJCWRtYTA6IGRtYUAxMDAzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47CisJCQl9OworCQl9OworCisJCWRtYTE6IGRtYUAxMDEzMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOworCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47CisJCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkbWEtY2hhbm5lbEAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCisJCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQkJCXJlZyA9IDwweDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEA4MCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDE+OworCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OworCQkJfTsKKwkJCWRtYS1jaGFubmVsQDEwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAorCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKKwkJCX07CisJCQlkbWEtY2hhbm5lbEAxODAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKKwkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCQkJcmVnID0gPDB4MTgwIDB4ODA+OworCQkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47CisJCQl9OworCQl9OworCisJCXNwaUAxMTAwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7CisJCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47CisJCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisJCX07CisKKwkJaTJjQDExODAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlpMmNAMTE4MTAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDExODEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKKwkJCWRmc3JyOworCQl9OworCisJCWkyY0AxMTkwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCQkJZGZzcnI7CisJCX07CisKKwkJaTJjQDExOTEwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgxMTkxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJCQlkZnNycjsKKwkJfTsKKworCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8MT47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mj47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDUwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKKwkJCWNlbGwtaW5kZXggPSA8Mz47CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKKwkJfTsKKworCQlncGlvMDogZ3Bpb0AxMzAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZ3BpbyIsICJmc2wscW9yaXEtZ3BpbyI7CisJCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTUgMiAwIDA+OworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCX07CisKKwkJdXNiMDogdXNiQDIxMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC11c2IyLW1waCIsCisJCQkJCSJmc2wsbXBjODV4eC11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOworCQkJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKKwkJfTsKKworCQl1c2IxOiB1c2JAMjExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXVzYjItZHIiLAorCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7CisJCQlyZWcgPSA8MHgyMTEwMDAgMHgxMDAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDB4MiAwIDA+OworCQl9OworCisJCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMSIsICJmc2wsc2VjLXY0LjAiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDMwMDAwMCAweDEwMDAwPjsKKwkJCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDkyIDIgMCAwPjsKKworCQkJc2VjX2pyMDoganJAMTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLCAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47CisJCQl9OworCisJCQlzZWNfanIxOiBqckAyMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1qb2ItcmluZyIsICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKKwkJCX07CisKKwkJCXNlY19qcjI6IGpyQDMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLWpvYi1yaW5nIiwgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OworCQkJfTsKKworCQkJc2VjX2pyMzoganJANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLCAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47CisJCQl9OworCisJCQlydGljQDYwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMiLCAiZnNsLHNlYy12NC4wLXJ0aWMiOworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OworCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKKworCQkJCXJ0aWNfYTogcnRpYy1hQDAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OworCQkJCX07CisKKwkJCQlydGljX2I6IHJ0aWMtYkAyMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMtbWVtb3J5IiwgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47CisJCQkJfTsKKworCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYy1tZW1vcnkiLCAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKKwkJCQl9OworCisJCQkJcnRpY19kOiBydGljLWRANjAgeworCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKKwkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKKwkJfTsKKwl9OworCisJcmFwaWRpb0BmZmUwYzAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWZzbCxzcmlvLXJtdS1oYW5kbGUgPSA8JnJtdT47CisJCXJhbmdlczsKKworCQlwb3J0MSB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJfTsKKworCQlwb3J0MiB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJfTsKKwl9OworCisJbG9jYWxidXNAZmZlMTI0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwl9OworCisJcGNpMDogcGNpZUBmZmUyMDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCWZzbCxtc2kgPSA8Jm1zaTA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCXBjaWVAMCB7CisJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCisJCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCisJCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCisJCQkJPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmUyMDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCQlmc2wsbXNpID0gPCZtc2kxPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQlwY2llQDAgeworCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwICovCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAorCQkJCT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMKaW5kZXggZWIxMTA5OC4uYzc5MTZkYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4MDAwMDAwMDAgMHgwMTAwODAwMD47CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCXNwaUAxMTAwMDAgewogCQkJZmxhc2hAMCB7CkBAIC0xMDgsNyArMTEyLDggQEAKIAogCWxvY2FsYnVzQGZmZTEyNDAwMCB7CiAJCXJlZyA9IDwweGYgMHhmZTEyNDAwMCAwIDB4MTAwMD47Ci0JCXJhbmdlcyA9IDwwIDAgMHhmIDB4ZTgwMDAwMDAgMHgwODAwMDAwMD47CisJCXJhbmdlcyA9IDwwIDAgMHhmIDB4ZTgwMDAwMDAgMHgwODAwMDAwMAorCQkJICAzIDAgMHhmIDB4ZmZkZjAwMDAgMHgwMDAwODAwMD47CiAKIAkJZmxhc2hAMCwwIHsKIAkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKQEAgLTExNiw2ICsxMjEsMTEgQEAKIAkJCWJhbmstd2lkdGggPSA8Mj47CiAJCQlkZXZpY2Utd2lkdGggPSA8Mj47CiAJCX07CisKKwkJYm9hcmQtY29udHJvbEAzLDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODBkcy1mcGdhIiwgImZzbCxmcGdhLW5ncGl4aXMiOworCQkJcmVnID0gPDMgMCAweDMwPjsKKwkJfTsKIAl9OwogCiAJcGNpMDogcGNpZUBmZmUyMDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwc2kuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kKaW5kZXggYjcxMDUxZjUuLmYyMGMwMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwc2kuZHRzaQpAQCAtNDIsNiArNDIsNyBAQAogCiAJYWxpYXNlcyB7CiAJCWNjc3IgPSAmc29jOworCQlkY3NyID0gJmRjc3I7CiAKIAkJc2VyaWFsMCA9ICZzZXJpYWwwOwogCQlzZXJpYWwxID0gJnNlcmlhbDE7CkBAIC03Nyw3ICs3OCw3IEBACiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQljcHUwOiBQb3dlclBDLDQwODBAMCB7CisJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwpAQCAtODUsNyArODYsNyBAQAogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CiAJCQl9OwogCQl9OwotCQljcHUxOiBQb3dlclBDLDQwODBAMSB7CisJCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwxPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwpAQCAtOTMsNyArOTQsNyBAQAogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CiAJCQl9OwogCQl9OwotCQljcHUyOiBQb3dlclBDLDQwODBAMiB7CisJCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwyPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OwpAQCAtMTAxLDcgKzEwMiw3IEBACiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKIAkJCX07CiAJCX07Ci0JCWNwdTM6IFBvd2VyUEMsNDA4MEAzIHsKKwkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDM+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CkBAIC0xMDksNyArMTEwLDcgQEAKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwogCQkJfTsKIAkJfTsKLQkJY3B1NDogUG93ZXJQQyw0MDgwQDQgeworCQljcHU0OiBQb3dlclBDLGU1MDBtY0A0IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8ND47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl80PjsKQEAgLTExNyw3ICsxMTgsNyBAQAogCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CiAJCQl9OwogCQl9OwotCQljcHU1OiBQb3dlclBDLDQwODBANSB7CisJCWNwdTU6IFBvd2VyUEMsZTUwMG1jQDUgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDw1PjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OwpAQCAtMTI1LDcgKzEyNiw3IEBACiAJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKIAkJCX07CiAJCX07Ci0JCWNwdTY6IFBvd2VyUEMsNDA4MEA2IHsKKwkJY3B1NjogUG93ZXJQQyxlNTAwbWNANiB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwogCQkJcmVnID0gPDY+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNj47CkBAIC0xMzMsNyArMTM0LDcgQEAKIAkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwogCQkJfTsKIAkJfTsKLQkJY3B1NzogUG93ZXJQQyw0MDgwQDcgeworCQljcHU3OiBQb3dlclBDLGU1MDBtY0A3IHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8Nz47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl83PjsKQEAgLTE0Myw2ICsxNDQsOTkgQEAKIAkJfTsKIAl9OwogCisJZGNzcjogZGNzckBmMDAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7CisKKwkJZGNzci1lcHVAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCisJCQkJICAgICAgODQgMiAwIDAKKwkJCQkgICAgICA4NSAyIDAgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1ucGMgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOworCQkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47CisJCX07CisJCWRjc3ItbnhjQDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNvcmVuZXQgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1jb3JlbmV0IjsKKwkJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kcGFhQDkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOworCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLW9jbkAxMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOworCQkJcmVnID0gPDB4MTEwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1kZHJAMTIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOworCQkJZGV2LWhhbmRsZSA9IDwmZGRyMT47CisJCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHIyPjsKKwkJCXJlZyA9IDwweDEzMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItbmFsQDE4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7CisJCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLXJjcG1AMjIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOworCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTA+OworCQkJcmVnID0gPDB4NDAwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OworCQkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTI+OworCQkJcmVnID0gPDB4NDIwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTM+OworCQkJcmVnID0gPDB4NDMwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTQ+OworCQkJcmVnID0gPDB4NDQwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDUwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTU+OworCQkJcmVnID0gPDB4NDUwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTY+OworCQkJcmVnID0gPDB4NDYwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1jcHUtc2ItcHJveHlANDcwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTc+OworCQkJcmVnID0gPDB4NDcwMDAgMHgxMDAwPjsKKwkJfTsKKwl9OworCiAJc29jOiBzb2NAZmZlMDAwMDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwpAQCAtMTYyLDEzICsyNTYsMTMgQEAKIAkJCWZzbCxudW0tbGF3cyA9IDwzMj47CiAJCX07CiAKLQkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWRkcjE6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwogCQl9OwogCi0JCW1lbW9yeS1jb250cm9sbGVyQDkwMDAgeworCQlkZHIyOiBtZW1vcnktY29udHJvbGxlckA5MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwZHMuZHRzCmluZGV4IDgzNjZlMmYuLmU2ZDQwOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMGRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBkcy5kdHMKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAorCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4MDAwMDAwMDAgMHgwMTAwODAwMD47CisJfTsKKwogCXNvYzogc29jQGZmZTAwMDAwMCB7CiAJCXNwaUAxMTAwMDAgewogCQkJZmxhc2hAMCB7CkBAIC0xNDcsOCArMTUxLDggQEAKIAkJfTsKIAogCQlib2FyZC1jb250cm9sQDMsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNTAyMGRzLXBpeGlzIjsKLQkJCXJlZyA9IDwzIDAgMHgyMD47CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMGRzLWZwZ2EiLCAiZnNsLGZwZ2EtbmdwaXhpcyI7CisJCQlyZWcgPSA8MyAwIDB4MzA+OwogCQl9OwogCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpCmluZGV4IDVlNjA0OGUuLmU3OTQ4YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMHNpLmR0c2kKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwc2kuZHRzaQpAQCAtNDIsNiArNDIsNyBAQAogCiAJYWxpYXNlcyB7CiAJCWNjc3IgPSAmc29jOworCQlkY3NyID0gJmRjc3I7CiAKIAkJc2VyaWFsMCA9ICZzZXJpYWwwOwogCQlzZXJpYWwxID0gJnNlcmlhbDE7CkBAIC05OCw2ICs5OSw2OSBAQAogCQl9OwogCX07CiAKKwlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKKworCQlkY3NyLWVwdUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKKwkJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCQkgICAgICA4NCAyIDAgMAorCQkJCSAgICAgIDg1IDIgMCAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcmVnID0gPDB4MCAweDEwMDA+OworCQl9OworCQlkY3NyLW5wYyB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKKwkJfTsKKwkJZGNzci1ueGNAMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY29yZW5ldCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOworCQkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRwYWFAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3Itb2NuQDExMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWRkckAxMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCQlkZXYtaGFuZGxlID0gPCZkZHIxPjsKKwkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItZGRyQDEzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJCWRldi1oYW5kbGUgPSA8JmRkcjI+OworCQkJcmVnID0gPDB4MTMwMDAgMHgxMDAwPjsKKwkJfTsKKwkJZGNzci1uYWxAMTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItcmNwbUAyMjAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCQl9OworCQlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1NTAwLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJCX07CisJCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTU1MDAtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OworCQkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKKwkJfTsKKwl9OworCiAJc29jOiBzb2NAZmZlMDAwMDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwpAQCAtMTE3LDEzICsxODEsMTMgQEAKIAkJCWZzbCxudW0tbGF3cyA9IDwzMj47CiAJCX07CiAKLQkJbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWRkcjE6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgewogCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwogCQl9OwogCi0JCW1lbW9yeS1jb250cm9sbGVyQDkwMDAgeworCQlkZHIyOiBtZW1vcnktY29udHJvbGxlckA5MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKIAkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4NTYwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4NTYwLmR0cwppbmRleCA5ZTEzZWQ4Li43MjA3OGViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODU2MC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzg1NjAuZHRzCkBAIC0zMzEsNyArMzMxLDcgQEAKIAl9OwogCiAJbG9jYWxidXNAZmY3MDUwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLWxvY2FsYnVzIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1sb2NhbGJ1cyIsICJzaW1wbGUtYnVzIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyZWcgPSA8MHhmZjcwNTAwMCAweDEwMD47CS8vIEJSeCwgT1J4LCBldGMuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveW9zZW1pdGUuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3lvc2VtaXRlLmR0cwppbmRleCA2NDkyMzI0Li4zMGJiNDc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveW9zZW1pdGUuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy95b3NlbWl0ZS5kdHMKQEAgLTEzOCw2ICsxMzgsNDIgQEAKIAkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSB6SW1hZ2UgKi8KIAkJCQlpbnRlcnJ1cHRzID0gPDB4NSAweDE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OworCisJCQkJbm9yX2ZsYXNoQDAsMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiYW1kLHMyOWdsMjU2biIsICJjZmktZmxhc2giOworCQkJCQliYW5rLXdpZHRoID0gPDI+OworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDQwMDAwMDA+OworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCXBhcnRpdGlvbkAwIHsKKwkJCQkJCWxhYmVsID0gImtlcm5lbCI7CisJCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMWUwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDFlMDAwMCB7CisJCQkJCQlsYWJlbCA9ICJkdGIiOworCQkJCQkJcmVnID0gPDB4MDAxZTAwMDAgMHgwMDAyMDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAyMDAwMDAgeworCQkJCQkJbGFiZWwgPSAicmFtZGlzayI7CisJCQkJCQlyZWcgPSA8MHgwMDIwMDAwMCAweDAxNDAwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDE2MDAwMDAgeworCQkJCQkJbGFiZWwgPSAiamZmczIiOworCQkJCQkJcmVnID0gPDB4MDE2MDAwMDAgMHgwMDQwMDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAxYTAwMDAwIHsKKwkJCQkJCWxhYmVsID0gInVzZXIiOworCQkJCQkJcmVnID0gPDB4MDFhMDAwMDAgMHgwMjU0MDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkAzZjQwMDAwIHsKKwkJCQkJCWxhYmVsID0gImVudiI7CisJCQkJCQlyZWcgPSA8MHgwM2Y0MDAwMCAweDAwMDQwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDNmODAwMDAgeworCQkJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQkJCXJlZyA9IDwweDAzZjgwMDAwIDB4MDAwODAwMDA+OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCQlVQVJUMDogc2VyaWFsQGVmNjAwMzAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9oY3U0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9oY3U0X2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhMjYzYy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvaGN1NF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1DT05GSUdfNDB4PXkKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19FWFBFUlQ9eQotQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15Ci1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci1DT05GSUdfSENVND15Ci0jIENPTkZJR19XQUxOVVQgaXMgbm90IHNldAotQ09ORklHX1NQQVJTRV9JUlE9eQotQ09ORklHX1BDST15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci1DT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15Ci1DT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotQ09ORklHX01URF9PRl9QQVJUUz15Ci1DT05GSUdfTVREX0NIQVI9eQotQ09ORklHX01URF9CTE9DSz1tCi1DT05GSUdfTVREX0NGST15Ci1DT05GSUdfTVREX0pFREVDUFJPQkU9eQotQ09ORklHX01URF9DRklfQU1EU1REPXkKLUNPTkZJR19NVERfUEhZU01BUF9PRj15Ci1DT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zNTAwMAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX0VUSEVSTkVUPXkKLUNPTkZJR19ORVRfVkVORE9SX0lCTT15Ci1DT05GSUdfSUJNX0VNQUM9eQotIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotIyBDT05GSUdfVlQgaXMgbm90IHNldAotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKLUNPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCi0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX0NSQU1GUz15Ci1DT05GSUdfTkZTX0ZTPXkKLUNPTkZJR19ORlNfVjM9eQotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfREVCVUdfRlM9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfREVURUNUX0hVTkdfVEFTSz15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15Ci1DT05GSUdfQ1JZUFRPPXkKLUNPTkZJR19DUllQVE9fQ0JDPXkKLUNPTkZJR19DUllQVE9fRUNCPXkKLUNPTkZJR19DUllQVE9fUENCQz15Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci0jIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNTJ4eC90cW01MjAwX2RlZmNvbmZpZwppbmRleCA5NTljZDJjLi43MTZhMzdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy81Mnh4L3RxbTUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzUyeHgvdHFtNTIwMF9kZWZjb25maWcKQEAgLTEsOSArMSwxMCBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKLUNPTkZJR19FWFBFUlQ9eQorQ09ORklHX0VNQkVEREVEPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKQEAgLTE3LDcgKzE4LDYgQEAKIENPTkZJR19QUENfTVBDNTIwMF9CVUdGSVg9eQogIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogQ09ORklHX1BQQ19CRVNUQ09NTT15Ci1DT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfUE09eQogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQpAQCAtMzgsMTcgKzM4LDE4IEBACiBDT05GSUdfTVREX0NPTkNBVD15CiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKK0NPTkZJR19NVERfT0ZfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQogQ09ORklHX01URF9DRklfQU1EU1REPXkKIENPTkZJR19NVERfUk9NPXkKIENPTkZJR19NVERfUEhZU01BUF9PRj15CitDT05GSUdfTVREX1BMQVRSQU09eQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zMjc2OAotIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1NEPXkKIENPTkZJR19DSFJfREVWX1NHPXkKIENPTkZJR19BVEE9eQpAQCAtNTYsMTMgKzU3LDExIEBACiBDT05GSUdfUEFUQV9QTEFURk9STT15CiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfTFhUX1BIWT15CitDT05GSUdfRklYRURfUEhZPXkKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX0ZFQ19NUEM1Mnh4PXkKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WVCBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX01QQzUyeHg9eQogQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEVfQkFVRD0xMTUyMDAKQEAgLTcwLDcgKzY5LDEzIEBACiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15CiBDT05GSUdfSTJDX01QQz15CitDT05GSUdfU0VOU09SU19MTTgwPXkKIENPTkZJR19XQVRDSERPRz15CitDT05GSUdfTUZEX1NNNTAxPXkKK0NPTkZJR19GQj15CitDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU49eQorQ09ORklHX0ZCX1NNNTAxPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKIENPTkZJR19VU0I9eQogQ09ORklHX1VTQl9ERVZJQ0VGUz15CiAjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKQEAgLTgwLDEwICs4NSwxMCBAQAogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfRFMxMzA3PXkKK0NPTkZJR19SVENfRFJWX0RTMTM3ND15CiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAotQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX01TRE9TX0ZTPXkKIENPTkZJR19WRkFUX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKQEAgLTEwMiw3ICsxMDcsNiBAQAogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fRUNCPXkKIENPTkZJR19DUllQVE9fUENCQz15CiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3AxMDIzcmRzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcDEwMjNyZHNfZGVmY29uZmlnCmluZGV4IDNmZjVhODEuLmMwOTFhYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcDEwMjNyZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvcDEwMjNyZHNfZGVmY29uZmlnCkBAIC0yNCw3ICsyNCw3IEBACiBDT05GSUdfUVVJQ0NfRU5HSU5FPXkKIENPTkZJR19RRV9HUElPPXkKIENPTkZJR19DUE0yPXkKLUNPTkZJR19NUEM4eHh4X0dQSU89eQorQ09ORklHX0dQSU9fTVBDOFhYWD15CiBDT05GSUdfSElHSE1FTT15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L3hlc19tcGM4NXh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgveGVzX21wYzg1eHhfZGVmY29uZmlnCmluZGV4IDVlYTMxMjQuLjFjZDZmY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgveGVzX21wYzg1eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgveGVzX21wYzg1eHhfZGVmY29uZmlnCkBAIC0yMCw3ICsyMCw3IEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogQ09ORklHX1hFU19NUEM4NXh4PXkKLUNPTkZJR19NUEM4eHh4X0dQSU89eQorQ09ORklHX0dQSU9fTVBDOFhYWD15CiBDT05GSUdfSElHSE1FTT15CiBDT05GSUdfTUFUSF9FTVVMQVRJT049eQogQ09ORklHX1NQQVJTRV9JUlE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZwppbmRleCA0MzExZDAyLi5mMDg3ZGU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZwpAQCAtMTIsOSArMTIsNyBAQAogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKIENPTkZJR19FTUJFRERFRD15CiBDT05GSUdfUEVSRl9FVkVOVFM9eQogQ09ORklHX1NMQUI9eQpAQCAtMjMsOCArMjEsOSBAQAogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogQ09ORklHX01PRFZFUlNJT05TPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKLUNPTkZJR19QMjA0MF9SREI9eQorQ09ORklHX1AyMDQxX1JEQj15CiBDT05GSUdfUDMwNDFfRFM9eQorQ09ORklHX1AzMDYwX1FEUz15CiBDT05GSUdfUDQwODBfRFM9eQogQ09ORklHX1A1MDIwX0RTPXkKIENPTkZJR19ISUdITUVNPXkKQEAgLTY5LDcgKzY4LDYgQEAKIENPTkZJR19JUF9TQ1RQPW0KIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfTVREPXkKLUNPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKIENPTkZJR19NVERfQkxPQ0s9eQpAQCAtMTA3LDcgKzEwNSw2IEBACiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfRVBBUFJfSFZfQllURUNIQU49eQogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CkBAIC0xMzYsOCArMTMzLDYgQEAKIENPTkZJR19VU0JfU1RPUkFHRT15CiBDT05GSUdfTU1DPXkKIENPTkZJR19NTUNfU0RIQ0k9eQotQ09ORklHX01NQ19TREhDSV9PRj15Ci1DT05GSUdfTU1DX1NESENJX09GX0VTREhDPXkKIENPTkZJR19FREFDPXkKIENPTkZJR19FREFDX01NX0VEQUM9eQogQ09ORklHX0VEQUNfTVBDODVYWD15CkBAIC0xNDYsNyArMTQxLDYgQEAKIENPTkZJR19SVENfRFJWX0NNT1M9eQogQ09ORklHX1VJTz15CiBDT05GSUdfU1RBR0lORz15Ci0jIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQgaXMgbm90IHNldAogQ09ORklHX1ZJUlRfRFJJVkVSUz15CiBDT05GSUdfRlNMX0hWX01BTkFHRVI9eQogQ09ORklHX0VYVDJfRlM9eQpAQCAtMTczLDcgKzE2Nyw2IEBACiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfTkxTX1VURjg9bQogQ09ORklHX01BR0lDX1NZU1JRPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFQlVHX1NISVJRPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19ERUJVR19JTkZPPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKaW5kZXggYzkyYzIwNC4uNzgyODIyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKQEAgLTExLDEwICsxMSw4IEBACiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19FWFBFUlQ9eQogQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CkBAIC0yNSw3ICsyMyw2IEBACiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfQklORk1UX01JU0M9bQotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfVU5JWD15CkBAIC05MywxMCArOTAsOCBAQAogQ09ORklHX0NSQ19JVFVfVD1tCiBDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiBDT05GSUdfREVCVUdfRlM9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfREVCVUdfSU5GTz15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfVklSUV9ERUJVRz15CiBDT05GSUdfQ1JZUFRPX1BDQkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWdjb2dlX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21nY29nZV9kZWZjb25maWcKaW5kZXggNmNiNTg4YS4uMGQzNmIwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWdjb2dlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tZ2NvZ2VfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIyIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfRVhQRVJUPXkKKyMgQ09ORklHX1JEX0daSVAgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TX0FMTD15CisjIENPTkZJR19QQ1NQS1JfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKIENPTkZJR19QUENfODJ4eD15CiBDT05GSUdfTUdDT0dFPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQogQ09ORklHX0JJTkZNVF9NSVNDPXkKICMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAogQ09ORklHX05FVD15CkBAIC0yNCwxMSArMzEsMTAgQEAKICMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15CitDT05GSUdfVElQQz15CiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiBDT05GSUdfTVREX0NIQVI9eQogQ09ORklHX01URF9CTEtERVZTPXkKQEAgLTQyLDcgKzQ4LDYgQEAKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQogQ09ORklHX0JMS19ERVZfTE9PUD15CiBDT05GSUdfQkxLX0RFVl9SQU09eQotIyBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlMgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX0ZJWEVEX1BIWT15CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKQEAgLTUwLDYgKzU1LDcgQEAKIENPTkZJR19GU19FTkVUX01ESU9fRkNDPXkKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKQEAgLTU3LDI0ICs2MywyNCBAQAogQ09ORklHX1NFUklBTF9DUE1fQ09OU09MRT15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0jIENPTkZJR19JMkNfUE9XRVJNQUMgaXMgbm90IHNldAogQ09ORklHX0kyQ19DUE09eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVQ9eQorQ09ORklHX1VTQl9GU0xfVVNCMj15CitDT05GSUdfVVNCX0dfU0VSSUFMPXkKK0NPTkZJR19VSU89eQorQ09ORklHX1VJT19QRFJWPXkKIENPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19FWFQzX0ZTPXkKLSMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19BVVRPRlM0X0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0NSQU1GUz15CitDT05GSUdfU1FVQVNIRlM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAogQ09ORklHX05MUz15CiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CiBDT05GSUdfTkxTX0FTQ0lJPXkKQEAgLTgyLDcgKzg4LDYgQEAKIENPTkZJR19OTFNfVVRGOD15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUxMnhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTEyeF9kZWZjb25maWcKaW5kZXggYzAyYmJiMi4uMjExZmNjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTEyeF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTEyeF9kZWZjb25maWcKQEAgLTEsOSArMSw5IEBACiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKICMgQ09ORklHX1NXQVAgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NQQVJTRV9JUlE9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTYKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCPXkKIENPTkZJR19NT0RVTEVTPXkKQEAgLTEzLDEwICsxMywxMSBAQAogIyBDT05GSUdfUFBDX0NIUlAgaXMgbm90IHNldAogQ09ORklHX1BQQ19NUEM1MTJ4PXkKIENPTkZJR19NUEM1MTIxX0FEUz15CitDT05GSUdfTVBDNTEyMV9HRU5FUklDPXkKK0NPTkZJR19QRE0zNjBORz15CiAjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0haXzEwMDA9eQotQ09ORklHX1NQQVJTRV9JUlE9eQogIyBDT05GSUdfTUlHUkFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKQEAgLTM1LDE4ICszNiwxNiBAQAogQ09ORklHX0NBTl9SQVc9eQogQ09ORklHX0NBTl9CQ009eQogQ09ORklHX0NBTl9WQ0FOPXkKLUNPTkZJR19DQU5fREVWPXkKIENPTkZJR19DQU5fTVNDQU49eQogQ09ORklHX0NBTl9ERUJVR19ERVZJQ0VTPXkKICMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKICMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAogIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQotQ09ORklHX01URF9DT05DQVQ9eQotQ09ORklHX01URF9QQVJUSVRJT05TPXkKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX09GX1BBUlRTPXkKIENPTkZJR19NVERfQ0hBUj15CiBDT05GSUdfTVREX0JMT0NLPXkKIENPTkZJR19NVERfQ0ZJPXkKQEAgLTYzLDYgKzYyLDcgQEAKIENPTkZJR19CTEtfREVWX1hJUD15CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19FRVBST01fQVQyND15CitDT05GSUdfRUVQUk9NX0FUMjU9eQogQ09ORklHX1NDU0k9eQogIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1NEPXkKQEAgLTk5LDEwICs5OSwxNCBAQAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19NUEM9eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX01QQzUxMnhfUFNDPXkKK0NPTkZJR19HUElPTElCPXkKK0NPTkZJR19HUElPX1NZU0ZTPXkKK0NPTkZJR19HUElPX01QQzhYWFg9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX01FRElBX1NVUFBPUlQ9eQogQ09ORklHX1ZJREVPX0RFVj15Ci0jIENPTkZJR19WSURFT19BTExPV19WNEwxIGlzIG5vdCBzZXQKIENPTkZJR19WSURFT19BRFZfREVCVUc9eQogIyBDT05GSUdfVklERU9fSEVMUEVSX0NISVBTX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1ZJREVPX1NBQTcxMVg9eQpAQCAtMTMyLDYgKzEzNiw1IEBACiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiAjIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKaW5kZXggZTYzZjUzNy4uMmExMzIwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjNTIwMF9kZWZjb25maWcKQEAgLTg4LDYgKzg4LDE4IEBACiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CiBDT05GSUdfTE9HTz15CitDT05GSUdfU09VTkQ9eQorQ09ORklHX1NORD15CisjIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EUklWRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BQQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0IgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1NORF9TT0NfTVBDNTIwMF9JMlM9eQorQ09ORklHX1NORF9NUEM1Mnh4X1NPQ19QQ00wMzA9eQorQ09ORklHX1NORF9NUEM1Mnh4X1NPQ19FRklLQT15CiBDT05GSUdfSElEX0RSQUdPTlJJU0U9eQogQ09ORklHX0hJRF9HWVJBVElPTj15CiBDT05GSUdfSElEX1RXSU5IQU49eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZwppbmRleCBhMzQ2N2JmLi5hMWU1YTE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZwpAQCAtMTAsMTAgKzEwLDggQEAKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX0VYUEVSVD15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKLUNPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKQEAgLTQxLDcgKzM5LDYgQEAKIENPTkZJR19TQkM4NTQ4PXkKIENPTkZJR19RVUlDQ19FTkdJTkU9eQogQ09ORklHX1FFX0dQSU89eQotQ09ORklHX01QQzh4eHhfR1BJTz15CiBDT05GSUdfSElHSE1FTT15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CkBAIC0xMjMsNiArMTIwLDcgQEAKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DUE09bQogQ09ORklHX0kyQ19NUEM9eQorQ09ORklHX0dQSU9fTVBDOFhYWD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQogQ09ORklHX0ZCPXkKQEAgLTIwNiw3ICsyMDQsNiBAQAogQ09ORklHX01BQ19QQVJUSVRJT049eQogQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0RFQlVHX0lORk89eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZwppbmRleCA5NjkzZjZlLi5kZDFlNDEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCkBAIC0xMiwxMCArMTIsOCBAQAogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfRVhQRVJUPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQpAQCAtNDIsNyArNDAsNiBAQAogQ09ORklHX1NCQzg1NDg9eQogQ09ORklHX1FVSUNDX0VOR0lORT15CiBDT05GSUdfUUVfR1BJTz15Ci1DT05GSUdfTVBDOHh4eF9HUElPPXkKIENPTkZJR19ISUdITUVNPXkKIENPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKQEAgLTEyNCw2ICsxMjEsNyBAQAogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0NQTT1tCiBDT05GSUdfSTJDX01QQz15CitDT05GSUdfR1BJT19NUEM4WFhYPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD15CiBDT05GSUdfRkI9eQpAQCAtMjA3LDEwICsyMDUsOCBAQAogQ09ORklHX01BQ19QQVJUSVRJT049eQogQ09ORklHX0NSQ19UMTBESUY9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX1ZJUlFfREVCVUc9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM0MHhfZGVmY29uZmlnCmluZGV4IDdjYjcwM2IuLjFlYjE5YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzQweF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNDB4X2RlZmNvbmZpZwpAQCAtMTQsNyArMTQsNiBAQAogQ09ORklHX1BQQzR4eF9HUElPPXkKIENPTkZJR19BQ0FESUE9eQogQ09ORklHX0VQNDA1PXkKLUNPTkZJR19IQ1U0PXkKIENPTkZJR19IT1RGT09UPXkKIENPTkZJR19LSUxBVUVBPXkKIENPTkZJR19NQUtBTFU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCmluZGV4IDg0YTY4NWE1Li41MzU3MTFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC00ODUsMyArNDg1LDcgQEAKIENPTkZJR19DUllQVE9fTFpPPW0KICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CitDT05GSUdfVklSVFVBTElaQVRJT049eQorQ09ORklHX0tWTV9CT09LM1NfNjQ9bQorQ09ORklHX0tWTV9CT09LM1NfNjRfSFY9eQorQ09ORklHX1ZIT1NUX05FVD1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2eHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNnh4X2RlZmNvbmZpZwppbmRleCAwNDM2MGY5Li5jNDdmMmJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzZ4eF9kZWZjb25maWcKQEAgLTcwLDcgKzcwLDcgQEAKIENPTkZJR19RVUlDQ19FTkdJTkU9eQogQ09ORklHX1FFX0dQSU89eQogQ09ORklHX1BQQ19CRVNUQ09NTT15Ci1DT05GSUdfTVBDOHh4eF9HUElPPXkKK0NPTkZJR19HUElPX01QQzhYWFg9eQogQ09ORklHX01DVV9NUEM4MzQ5RU1JVFg9bQogQ09ORklHX0hJR0hNRU09eQogQ09ORklHX05PX0haPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKaW5kZXggOTZhNThiNy4uYTcyZjI0MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKQEAgLTM2MiwzICszNjIsNyBAQAogQ09ORklHX0NSWVBUT19MWk89bQogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKK0NPTkZJR19WSVJUVUFMSVpBVElPTj15CitDT05GSUdfS1ZNX0JPT0szU182ND1tCitDT05GSUdfS1ZNX0JPT0szU182NF9IVj15CitDT05GSUdfVkhPU1RfTkVUPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCA5MTAxMGU4Li44OGU2MDJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0xMDAsNyArMTAwLDggQEAKIAljb21wYXRfZnNpZF90CWZfZnNpZDsKIAlpbnQJCWZfbmFtZWxlbjsJLyogU3VuT1MgaWdub3JlcyB0aGlzIGZpZWxkLiAqLwogCWludAkJZl9mcnNpemU7Ci0JaW50CQlmX3NwYXJlWzVdOworCWludAkJZl9mbGFnczsKKwlpbnQJCWZfc3BhcmVbNF07CiB9OwogCiAjZGVmaW5lIENPTVBBVF9STElNX09MRF9JTkZJTklUWQkweDdmZmZmZmZmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKaW5kZXggMTZkMjVjMC4uZDU3YzA4YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaApAQCAtMzcsNCArMzcsNiBAQAogCXU2NCBkbWFfbWFzazsKIH07CiAKKyNkZWZpbmUgQVJDSF9IQVNfRE1BX0dFVF9SRVFVSVJFRF9NQVNLCisKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zpcm13YXJlLmgKaW5kZXggM2E2YzU4Ni4uMTRkYjI5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zpcm13YXJlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zpcm13YXJlLmgKQEAgLTQ4LDYgKzQ4LDggQEAKICNkZWZpbmUgRldfRkVBVFVSRV9DTU8JCUFTTV9DT05TVCgweDAwMDAwMDAwMDIwMDAwMDApCiAjZGVmaW5lIEZXX0ZFQVRVUkVfVlBITgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwNDAwMDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9YQ01PCQlBU01fQ09OU1QoMHgwMDAwMDAwMDA4MDAwMDAwKQorI2RlZmluZSBGV19GRUFUVVJFX09QQUwJCUFTTV9DT05TVCgweDAwMDAwMDAwMTAwMDAwMDApCisjZGVmaW5lIEZXX0ZFQVRVUkVfT1BBTHYyCUFTTV9DT05TVCgweDAwMDAwMDAwMjAwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTY1LDYgKzY3LDggQEAKIAlGV19GRUFUVVJFX1BTRVJJRVNfQUxXQVlTID0gMCwKIAlGV19GRUFUVVJFX0lTRVJJRVNfUE9TU0lCTEUgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCiAJRldfRkVBVFVSRV9JU0VSSUVTX0FMV0FZUyA9IEZXX0ZFQVRVUkVfSVNFUklFUyB8IEZXX0ZFQVRVUkVfTFBBUiwKKwlGV19GRUFUVVJFX1BPV0VSTlZfUE9TU0lCTEUgPSBGV19GRUFUVVJFX09QQUwgfCBGV19GRUFUVVJFX09QQUx2MiwKKwlGV19GRUFUVVJFX1BPV0VSTlZfQUxXQVlTID0gMCwKIAlGV19GRUFUVVJFX1BTM19QT1NTSUJMRSA9IEZXX0ZFQVRVUkVfTFBBUiB8IEZXX0ZFQVRVUkVfUFMzX0xWMSwKIAlGV19GRUFUVVJFX1BTM19BTFdBWVMgPSBGV19GRUFUVVJFX0xQQVIgfCBGV19GRUFUVVJFX1BTM19MVjEsCiAJRldfRkVBVFVSRV9DRUxMRUJfUE9TU0lCTEUgPSBGV19GRUFUVVJFX0xQQVIgfCBGV19GRUFUVVJFX0JFQVQsCkBAIC03OCw2ICs4Miw5IEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJCUZXX0ZFQVRVUkVfSVNFUklFU19QT1NTSUJMRSB8CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKwkJRldfRkVBVFVSRV9QT1dFUk5WX1BPU1NJQkxFIHwKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QUENfUFMzCiAJCUZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFIHwKICNlbmRpZgpAQCAtOTUsNiArMTAyLDkgQEAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIAkJRldfRkVBVFVSRV9JU0VSSUVTX0FMV0FZUyAmCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKwkJRldfRkVBVFVSRV9QT1dFUk5WX0FMV0FZUyAmCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUFBDX1BTMwogCQlGV19GRUFUVVJFX1BTM19BTFdBWVMgJgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmxvcHB5LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmxvcHB5LmgKaW5kZXggMjRiZDM0Yy4uOTM2YTkwNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zsb3BweS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mbG9wcHkuaApAQCAtMTA4LDEwICsxMDgsMTAgQEAKIHsKIAlpZiAoY2FuX3VzZV92aXJ0dWFsX2RtYSkKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LAotCQkJCSAgIElSUUZfRElTQUJMRUQsICJmbG9wcHkiLCBOVUxMKTsKKwkJCQkgICAwLCAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkgICBJUlFGX0RJU0FCTEVELCAiZmxvcHB5IiwgTlVMTCk7CisJCQkJICAgMCwgImZsb3BweSIsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IHZkbWFfZG1hX3NldHVwKGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IG1vZGUsIGludCBpbykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCmluZGV4IDU4NTZhNjYuLjg2MDA0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaApAQCAtMSwxNSArMSw2MCBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfSFVHRVRMQl9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19IVUdFVExCX0gKIAorI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmh1Z2VwdGVfY2FjaGU7CitleHRlcm4gdm9pZCBfX2luaXQgcmVzZXJ2ZV9odWdldGxiX2dwYWdlcyh2b2lkKTsKKworc3RhdGljIGlubGluZSBwdGVfdCAqaHVnZXBkX3BhZ2UoaHVnZXBkX3QgaHBkKQoreworCUJVR19PTighaHVnZXBkX29rKGhwZCkpOworCXJldHVybiAocHRlX3QgKikoKGhwZC5wZCAmIH5IVUdFUERfU0hJRlRfTUFTSykgfCBQRF9IVUdFKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHVnZXBkX3NoaWZ0KGh1Z2VwZF90IGhwZCkKK3sKKwlyZXR1cm4gaHBkLnBkICYgSFVHRVBEX1NISUZUX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgKmh1Z2VwdGVfb2Zmc2V0KGh1Z2VwZF90ICpocGRwLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHVuc2lnbmVkIHBkc2hpZnQpCit7CisJLyoKKwkgKiBPbiAzMi1iaXQsIHdlIGhhdmUgbXVsdGlwbGUgaGlnaGVyLWxldmVsIHRhYmxlIGVudHJpZXMgdGhhdCBwb2ludCB0bworCSAqIHRoZSBzYW1lIGh1Z2VwdGUuICBKdXN0IHVzZSB0aGUgZmlyc3Qgb25lIHNpbmNlIHRoZXkncmUgYWxsCisJICogaWRlbnRpY2FsLiAgU28gZm9yIHRoYXQgY2FzZSwgaWR4PTAuCisJICovCisJdW5zaWduZWQgbG9uZyBpZHggPSAwOworCisJcHRlX3QgKmRpciA9IGh1Z2VwZF9wYWdlKCpocGRwKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlpZHggPSAoYWRkciAmICgoMVVMIDw8IHBkc2hpZnQpIC0gMSkpID4+IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CisjZW5kaWYKKworCXJldHVybiBkaXIgKyBpZHg7Cit9CisKIHB0ZV90ICpodWdlX3B0ZV9vZmZzZXRfYW5kX3NoaWZ0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkICpzaGlmdCk7CiAKIHZvaWQgZmx1c2hfZGNhY2hlX2ljYWNoZV9odWdlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTU1fU0xJQ0VTKSB8fCBkZWZpbmVkKENPTkZJR19QUENfU1VCUEFHRV9QUk9UKQogaW50IGlzX2h1Z2VwYWdlX29ubHlfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgbGVuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpc19odWdlcGFnZV9vbmx5X3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCQkgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCBib29rM2VfaHVnZXRsYl9wcmVsb2FkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGVhLCBwdGVfdCBwdGUpOwordm9pZCBmbHVzaF9odWdldGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdm1hZGRyKTsKIAogdm9pZCBodWdldGxiX2ZyZWVfcGdkX3JhbmdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBmbG9vciwKQEAgLTUwLDggKzk1LDExIEBACiBzdGF0aWMgaW5saW5lIHB0ZV90IGh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKLQl1bnNpZ25lZCBsb25nIG9sZCA9IHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIH4wVUwsIDEpOwotCXJldHVybiBfX3B0ZShvbGQpOworI2lmZGVmIENPTkZJR19QUEM2NAorCXJldHVybiBfX3B0ZShwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCB+MFVMLCAxKSk7CisjZWxzZQorCXJldHVybiBfX3B0ZShwdGVfdXBkYXRlKHB0ZXAsIH4wVUwsIDApKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLApAQCAtOTMsNCArMTQxLDE1IEBACiB7CiB9CiAKKyNlbHNlIC8qICEgQ09ORklHX0hVR0VUTEJfUEFHRSAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc2VydmVfaHVnZXRsYl9ncGFnZXModm9pZCkKK3sKKwlwcl9lcnIoIkNhbm5vdCByZXNlcnZlIGdwYWdlcyB3aXRob3V0IGh1Z2V0bGIgZW5hYmxlZFxuIik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfaHVnZXRsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQoreworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSFVHRVRMQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCmluZGV4IDhhMzM2OTguLmY5MjFlYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfS0VYRUNfSAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpIHx8IGRlZmluZWQoQ09ORklHXzQ0eCkKIAogLyoKICAqIE9uIEZTTC1Cb29rRSB3ZSBzZXR1cCBhIDE6MSBtYXBwaW5nIHdoaWNoIGNvdmVycyB0aGUgZmlyc3QgMkdpQiBvZiBtZW1vcnkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm0uaAppbmRleCBhNGY2Yzg1Li4wOGZlNjllIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bS5oCkBAIC0xNDksNiArMTQ5LDEyIEBACiAjZGVmaW5lIEtWTV9TUkVHU19FX1VQREFURV9EQlNSCQkoMSA8PCAzKQogCiAvKgorICogQm9vazNTIHNwZWNpYWwgYml0cyB0byBpbmRpY2F0ZSBjb250ZW50cyBpbiB0aGUgc3RydWN0IGJ5IG1haW50YWluaW5nCisgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHN0cnVjdHMuIElmIGFkZGluZyBhIG5ldyBmaWVsZCwKKyAqIHBsZWFzZSBtYWtlIHN1cmUgdG8gYWRkIGEgZmxhZyBmb3IgdGhhdCBuZXcgZmllbGQgKi8KKyNkZWZpbmUgS1ZNX1NSRUdTX1NfSElPUgkJKDEgPDwgMCkKKworLyoKICAqIEluIEtWTV9TRVRfU1JFR1MsIHJlc2VydmVkL3BhZCBmaWVsZHMgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZCBmcm9tIGEKICAqIHByZXZpb3VzIEtWTV9HRVRfUkVHUy4KICAqCkBAIC0xNzMsNiArMTc5LDggQEAKIAkJCQlfX3U2NCBpYmF0WzhdOyAKIAkJCQlfX3U2NCBkYmF0WzhdOyAKIAkJCX0gcHBjMzI7CisJCQlfX3U2NCBmbGFnczsgLyogS1ZNX1NSRUdTX1NfICovCisJCQlfX3U2NCBoaW9yOwogCQl9IHM7CiAJCXN0cnVjdCB7CiAJCQl1bmlvbiB7CkBAIC0yNzYsNiArMjg0LDExIEBACiAjZGVmaW5lIEtWTV9JTlRFUlJVUFRfVU5TRVQJLTJVCiAjZGVmaW5lIEtWTV9JTlRFUlJVUFRfU0VUX0xFVkVMCS0zVQogCisjZGVmaW5lIEtWTV9DUFVfNDQwCQkxCisjZGVmaW5lIEtWTV9DUFVfRTUwMFYyCQkyCisjZGVmaW5lIEtWTV9DUFVfM1NfMzIJCTMKKyNkZWZpbmUgS1ZNX0NQVV8zU182NAkJNAorCiAvKiBmb3IgS1ZNX0NBUF9TUEFQUl9UQ0UgKi8KIHN0cnVjdCBrdm1fY3JlYXRlX3NwYXByX3RjZSB7CiAJX191NjQgbGlvYm47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAppbmRleCA5OGRhMDEwLi5hMzg0ZmZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKQEAgLTkwLDYgKzkwLDggQEAKICNlbmRpZgogCWludCBjb250ZXh0X2lkW1NJRF9DT05URVhUU107CiAKKwlib29sIGhpb3Jfc3JlZ3M7CQkvKiBISU9SIGlzIHNldCBieSBTUkVHUywgbm90IFBWUiAqLworCiAJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3B0ZVtIUFRFR19IQVNIX05VTV9QVEVdOwogCXN0cnVjdCBobGlzdF9oZWFkIGhwdGVfaGFzaF9wdGVfbG9uZ1tIUFRFR19IQVNIX05VTV9QVEVfTE9OR107CiAJc3RydWN0IGhsaXN0X2hlYWQgaHB0ZV9oYXNoX3ZwdGVbSFBURUdfSEFTSF9OVU1fVlBURV07CkBAIC0xMzksMTUgKzE0MSwxNCBAQAogZXh0ZXJuIGludCBrdm1wcGNfZW11bGF0ZV9wYWlyZWRfc2luZ2xlKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gcGZuX3Qga3ZtcHBjX2dmbl90b19wZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4pOwogCi1leHRlcm4gdm9pZCBrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZSh2b2lkKTsKLWV4dGVybiB2b2lkIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZW50ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBrdm1wcGNfcm1jYWxsKHVsb25nIHNycjAsIHVsb25nIHNycjEpOworZXh0ZXJuIHZvaWQga3ZtcHBjX2VudHJ5X3RyYW1wb2xpbmUodm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfaHZfZW50cnlfdHJhbXBvbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19sb2FkX3VwX2ZwdSh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19sb2FkX3VwX2FsdGl2ZWModm9pZCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfbG9hZF91cF92c3godm9pZCk7CiBleHRlcm4gdTMyIGt2bXBwY19hbGlnbm1lbnRfZHNpc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgaW5zdCk7CiBleHRlcm4gdWxvbmcga3ZtcHBjX2FsaWdubWVudF9kYXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBpbnQgaW5zdCk7CitleHRlcm4gaW50IGt2bXBwY19oX3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjbWQpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MgKnRvX2Jvb2szcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC0zODIsNiArMzgzLDM5IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvbXB1dGVfdGxiaWVfcmIodW5zaWduZWQgbG9uZyB2LCB1bnNpZ25lZCBsb25nIHIsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwdGVfaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyByYiwgdmFfbG93OworCisJcmIgPSAodiAmIH4weDdmVUwpIDw8IDE2OwkJLyogQVZBIGZpZWxkICovCisJdmFfbG93ID0gcHRlX2luZGV4ID4+IDM7CisJaWYgKHYgJiBIUFRFX1ZfU0VDT05EQVJZKQorCQl2YV9sb3cgPSB+dmFfbG93OworCS8qIHhvciB2c2lkIGZyb20gQVZBICovCisJaWYgKCEodiAmIEhQVEVfVl8xVEJfU0VHKSkKKwkJdmFfbG93IF49IHYgPj4gMTI7CisJZWxzZQorCQl2YV9sb3cgXj0gdiA+PiAyNDsKKwl2YV9sb3cgJj0gMHg3ZmY7CisJaWYgKHYgJiBIUFRFX1ZfTEFSR0UpIHsKKwkJcmIgfD0gMTsJCQkvKiBMIGZpZWxkICovCisJCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwNikgJiYKKwkJICAgIChyICYgMHhmZjAwMCkpIHsKKwkJCS8qIG5vbi0xNk1CIGxhcmdlIHBhZ2UsIG11c3QgYmUgNjRrICovCisJCQkvKiAobWFza3MgZGVwZW5kIG9uIHBhZ2Ugc2l6ZSkgKi8KKwkJCXJiIHw9IDB4MTAwMDsJCS8qIHBhZ2UgZW5jb2RpbmcgaW4gTFAgZmllbGQgKi8KKwkJCXJiIHw9ICh2YV9sb3cgJiAweDdmKSA8PCAxNjsgLyogN2Igb2YgVkEgaW4gQVZBL0xQIGZpZWxkICovCisJCQlyYiB8PSAodmFfbG93ICYgMHhmZSk7CS8qIEFWQUwgZmllbGQgKFA3IGRvZXNuJ3Qgc2VlbSB0byBjYXJlKSAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogNGtCIHBhZ2UgKi8KKwkJcmIgfD0gKHZhX2xvdyAmIDB4N2ZmKSA8PCAxMjsJLyogcmVtYWluaW5nIDExYiBvZiBWQSAqLworCX0KKwlyYiB8PSAodiA+PiA1NCkgJiAweDMwMDsJCS8qIEIgZmllbGQgKi8KKwlyZXR1cm4gcmI7Cit9CisKIC8qIE1hZ2ljIHJlZ2lzdGVyIHZhbHVlcyBsb2FkZWQgaW50byByMyBhbmQgcjQgYmVmb3JlIHRoZSAnc2MnIGFzc2VtYmx5CiAgKiBpbnN0cnVjdGlvbiBmb3IgdGhlIE9TSSBoeXBlcmNhbGxzICovCiAjZGVmaW5lIE9TSV9TQ19NQUdJQ19SMwkJCTB4MTEzNzI0RkEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzX2FzbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKaW5kZXggZWY3YjM2OC4uMWYyZjViNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfYXNtLmgKQEAgLTc1LDYgKzc1LDggQEAKIAl1bG9uZyBzY3JhdGNoMDsKIAl1bG9uZyBzY3JhdGNoMTsKIAl1OCBpbl9ndWVzdDsKKwl1OCByZXN0b3JlX2hpZDU7CisJdTggbmFwcGluZzsKIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCiAJc3RydWN0IGt2bV92Y3B1ICprdm1fdmNwdTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggY2MyMmIyOC4uYmY4YWY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTE5OCwyMSArMTk4LDI5IEBACiAgKi8KIHN0cnVjdCBrdm1wcGNfdmNvcmUgewogCWludCBuX3J1bm5hYmxlOwotCWludCBuX2Jsb2NrZWQ7CisJaW50IG5fYnVzeTsKIAlpbnQgbnVtX3RocmVhZHM7CiAJaW50IGVudHJ5X2V4aXRfY291bnQ7CiAJaW50IG5fd29rZW47CiAJaW50IG5hcF9jb3VudDsKKwlpbnQgbmFwcGluZ190aHJlYWRzOwogCXUxNiBwY3B1OwotCXU4IHZjb3JlX3J1bm5pbmc7CisJdTggdmNvcmVfc3RhdGU7CiAJdTggaW5fZ3Vlc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBydW5uYWJsZV90aHJlYWRzOwogCXNwaW5sb2NrX3QgbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKIH07CiAKICNkZWZpbmUgVkNPUkVfRU5UUllfQ09VTlQodmMpCSgodmMpLT5lbnRyeV9leGl0X2NvdW50ICYgMHhmZikKICNkZWZpbmUgVkNPUkVfRVhJVF9DT1VOVCh2YykJKCh2YyktPmVudHJ5X2V4aXRfY291bnQgPj4gOCkKIAorLyogVmFsdWVzIGZvciB2Y29yZV9zdGF0ZSAqLworI2RlZmluZSBWQ09SRV9JTkFDVElWRQkwCisjZGVmaW5lIFZDT1JFX1JVTk5JTkcJMQorI2RlZmluZSBWQ09SRV9FWElUSU5HCTIKKyNkZWZpbmUgVkNPUkVfU0xFRVBJTkcJMworCiBzdHJ1Y3Qga3ZtcHBjX3B0ZSB7CiAJdWxvbmcgZWFkZHI7CiAJdTY0IHZwYWdlOwpAQCAtMjU4LDE0ICsyNjYsNiBAQAogCXVsb25nIGhvc3Rfc3RhY2s7CiAJdTMyIGhvc3RfcGlkOwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCi0JdWxvbmcgaG9zdF9tc3I7Ci0JdWxvbmcgaG9zdF9yMjsKLQl2b2lkICpob3N0X3JldGlwOwotCXVsb25nIHRyYW1wb2xpbmVfbG93bWVtOwotCXVsb25nIHRyYW1wb2xpbmVfZW50ZXI7Ci0JdWxvbmcgaGlnaG1lbV9oYW5kbGVyOwotCXVsb25nIHJtY2FsbDsKLQl1bG9uZyBob3N0X3BhY2FfcGh5czsKIAlzdHJ1Y3Qga3ZtcHBjX3NsYiBzbGJbNjRdOwogCWludCBzbGJfbWF4OwkJLyogMSArIGluZGV4IG9mIGxhc3QgdmFsaWQgZW50cnkgaW4gc2xiW10gKi8KIAlpbnQgc2xiX25yOwkJLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gU0xCICovCkBAIC0zODksNiArMzg5LDkgQEAKIAl1OCBkY3JfaXNfd3JpdGU7CiAJdTggb3NpX25lZWRlZDsKIAl1OCBvc2lfZW5hYmxlZDsKKwl1OCBwYXByX2VuYWJsZWQ7CisJdTggc2FuZTsKKwl1OCBjcHVfdHlwZTsKIAl1OCBoY2FsbF9uZWVkZWQ7CiAKIAl1MzIgY3ByMF9jZmdhZGRyOyAvKiBob2xkcyB0aGUgbGFzdCBzZXQgY3ByMF9jZmdhZGRyICovCkBAIC00MDgsMTEgKzQxMSwxMyBAQAogCXN0cnVjdCBkdGwgKmR0bDsKIAlzdHJ1Y3QgZHRsICpkdGxfZW5kOwogCisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxcDsKIAlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2Y29yZTsKIAlpbnQgcmV0OwogCWludCB0cmFwOwogCWludCBzdGF0ZTsKIAlpbnQgcHRpZDsKKwlib29sIHRpbWVyX3J1bm5pbmc7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgY3B1X3J1bjsKIAogCXN0cnVjdCBrdm1fdmNwdV9hcmNoX3NoYXJlZCAqc2hhcmVkOwpAQCAtNDI4LDggKzQzMyw5IEBACiAjZW5kaWYKIH07CiAKLSNkZWZpbmUgS1ZNUFBDX1ZDUFVfQlVTWV9JTl9IT1NUCTAKLSNkZWZpbmUgS1ZNUFBDX1ZDUFVfQkxPQ0tFRAkJMQorLyogVmFsdWVzIGZvciB2Y3B1LT5hcmNoLnN0YXRlICovCisjZGVmaW5lIEtWTVBQQ19WQ1BVX1NUT1BQRUQJCTAKKyNkZWZpbmUgS1ZNUFBDX1ZDUFVfQlVTWV9JTl9IT1NUCTEKICNkZWZpbmUgS1ZNUFBDX1ZDUFVfUlVOTkFCTEUJCTIKIAogI2VuZGlmIC8qIF9fUE9XRVJQQ19LVk1fSE9TVF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCmluZGV4IGQxMjFmNDkuLjQ2ZWZkMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaApAQCAtNjYsNiArNjYsNyBAQAogZXh0ZXJuIGludCBrdm1wcGNfZW11bGF0ZV9tbWlvKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gdm9pZCBrdm1wcGNfZW11bGF0ZV9kZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiB1MzIga3ZtcHBjX2dldF9kZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgdGIpOworZXh0ZXJuIGludCBrdm1wcGNfc2FuaXR5X2NoZWNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIC8qIENvcmUtc3BlY2lmaWMgaG9va3MgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2x2MWNhbGwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sdjFjYWxsLmgKaW5kZXggODE3MTNhYy4uZjc3YzcwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2x2MWNhbGwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHYxY2FsbC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogbHYxIGNhbGwgZGVjbGFyYXRpb24gbWFjcm9zICovCiAKQEAgLTMxNSw3ICszMTYsNyBAQAogTFYxX0NBTEwoZ3B1X2NvbnRleHRfaW9tYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAyMjEgKQogTFYxX0NBTEwoZ3B1X2NvbnRleHRfYXR0cmlidXRlLCAgICAgICAgICAgICAgICAgICAgICAgICA2LCAwLCAyMjUgKQogTFYxX0NBTEwoZ3B1X2NvbnRleHRfaW50ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAyMjcgKQotTFYxX0NBTEwoZ3B1X2F0dHJpYnV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAyMjggKQorTFYxX0NBTEwoZ3B1X2F0dHJpYnV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAyMjggKQogTFYxX0NBTEwoZ2V0X3J0YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCAyMzIgKQogTFYxX0NBTEwoc2V0X3BwZV9wZXJpb2RpY190cmFjZXJfZnJlcXVlbmN5LCAgICAgICAgICAgICAxLCAwLCAyNDAgKQogTFYxX0NBTEwoc3RhcnRfcHBlX3BlcmlvZGljX3RyYWNlciwgICAgICAgICAgICAgICAgICAgICA1LCAwLCAyNDEgKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKaW5kZXggNDdjYWNkZGIuLmI1NDBkNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIApAQCAtODUsOCArODYsOSBAQAogCXZvaWQJCSgqcGNpX2RtYV9kZXZfc2V0dXApKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCXZvaWQJCSgqcGNpX2RtYV9idXNfc2V0dXApKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCi0JLyogUGxhdGZvcm0gc2V0X2RtYV9tYXNrIG92ZXJyaWRlICovCisJLyogUGxhdGZvcm0gc2V0X2RtYV9tYXNrIGFuZCBkbWFfZ2V0X3JlcXVpcmVkX21hc2sgb3ZlcnJpZGVzICovCiAJaW50CQkoKmRtYV9zZXRfbWFzaykoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spOworCXU2NAkJKCpkbWFfZ2V0X3JlcXVpcmVkX21hc2spKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIAlpbnQJCSgqcHJvYmUpKHZvaWQpOwogCXZvaWQJCSgqc2V0dXBfYXJjaCkodm9pZCk7IC8qIE9wdGlvbmFsLCBtYXkgYmUgTlVMTCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKaW5kZXggM2VhMGY5YS4uMDI2MGVhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCkBAIC02Niw2ICs2Niw3IEBACiAjZGVmaW5lIE1BUzJfTQkJCTB4MDAwMDAwMDQKICNkZWZpbmUgTUFTMl9HCQkJMHgwMDAwMDAwMgogI2RlZmluZSBNQVMyX0UJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1BUzJfV0lNR0VfTUFTSwkJMHgwMDAwMDAxZgogI2RlZmluZSBNQVMyX0VQTl9NQVNLKHNpemUpCQkofjAgPDwgKHNpemUgKyAxMCkpCiAjZGVmaW5lIE1BUzJfVkFMKGFkZHIsIHNpemUsIGZsYWdzKQkoKGFkZHIpICYgTUFTMl9FUE5fTUFTSyhzaXplKSB8IChmbGFncykpCiAKQEAgLTgwLDYgKzgxLDcgQEAKICNkZWZpbmUgTUFTM19TVwkJCTB4MDAwMDAwMDQKICNkZWZpbmUgTUFTM19VUgkJCTB4MDAwMDAwMDIKICNkZWZpbmUgTUFTM19TUgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFTM19CQVBfTUFTSwkJMHgwMDAwMDAzZgogI2RlZmluZSBNQVMzX1NQU0laRQkJMHgwMDAwMDAzZQogI2RlZmluZSBNQVMzX1NQU0laRV9TSElGVAkxCiAKQEAgLTIxMiw2ICsyMTQsMTEgQEAKIAl1bnNpZ25lZCBpbnQJaWQ7CiAJdW5zaWduZWQgaW50CWFjdGl2ZTsKIAl1bnNpZ25lZCBsb25nCXZkc29fYmFzZTsKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUworCXU2NCBsb3dfc2xpY2VzX3BzaXplOyAgIC8qIFNMQiBwYWdlIHNpemUgZW5jb2RpbmdzICovCisJdTY0IGhpZ2hfc2xpY2VzX3BzaXplOyAgLyogNCBiaXRzIHBlciBzbGljZSBmb3Igbm93ICovCisJdTE2IHVzZXJfcHNpemU7ICAgICAgICAgLyogcGFnZSBzaXplIGluZGV4ICovCisjZW5kaWYKIH0gbW1fY29udGV4dF90OwogCiAvKiBQYWdlIHNpemUgZGVmaW5pdGlvbnMsIGNvbW1vbiBiZXR3ZWVuIDMyIGFuZCA2NC1iaXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCmluZGV4IGI0NDVlMGEuLmRiNjQ1ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaApAQCAtMjYyLDggKzI2Miw3IEBACiBleHRlcm4gaW50IGh0YWJfYm9sdF9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdnN0YXJ0LCB1bnNpZ25lZCBsb25nIHZlbmQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgcHN0YXJ0LCB1bnNpZ25lZCBsb25nIHByb3QsCiAJCQkgICAgIGludCBwc2l6ZSwgaW50IHNzaXplKTsKLWV4dGVybiB2b2lkIGFkZF9ncGFnZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplLAotCQkJICB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9wYWdlcyk7CitleHRlcm4gdm9pZCBhZGRfZ3BhZ2UodTY0IGFkZHIsIHU2NCBwYWdlX3NpemUsIHVuc2lnbmVkIGxvbmcgbnVtYmVyX29mX3BhZ2VzKTsKIGV4dGVybiB2b2lkIGRlbW90ZV9zZWdtZW50XzRrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogCiBleHRlcm4gdm9pZCBocHRlX2luaXRfbmF0aXZlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IDY5OGIzMDYuLmYwMTQ1NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LmgKQEAgLTE3NSwxNCArMTc1LDE2IEBACiAjZGVmaW5lIE1NVV9QQUdFXzY0S19BUAkzCS8qICJBZG1peGVkIHBhZ2VzIiAoaGFzaDY0IG9ubHkpICovCiAjZGVmaW5lIE1NVV9QQUdFXzI1NksJNAogI2RlZmluZSBNTVVfUEFHRV8xTQk1Ci0jZGVmaW5lIE1NVV9QQUdFXzhNCTYKLSNkZWZpbmUgTU1VX1BBR0VfMTZNCTcKLSNkZWZpbmUgTU1VX1BBR0VfMjU2TQk4Ci0jZGVmaW5lIE1NVV9QQUdFXzFHCTkKLSNkZWZpbmUgTU1VX1BBR0VfMTZHCTEwCi0jZGVmaW5lIE1NVV9QQUdFXzY0RwkxMQotI2RlZmluZSBNTVVfUEFHRV9DT1VOVAkxMgorI2RlZmluZSBNTVVfUEFHRV80TQk2CisjZGVmaW5lIE1NVV9QQUdFXzhNCTcKKyNkZWZpbmUgTU1VX1BBR0VfMTZNCTgKKyNkZWZpbmUgTU1VX1BBR0VfNjRNCTkKKyNkZWZpbmUgTU1VX1BBR0VfMjU2TQkxMAorI2RlZmluZSBNTVVfUEFHRV8xRwkxMQorI2RlZmluZSBNTVVfUEFHRV8xNkcJMTIKKyNkZWZpbmUgTU1VX1BBR0VfNjRHCTEzCiAKKyNkZWZpbmUgTU1VX1BBR0VfQ09VTlQJMTQKIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19TVERfTU1VXzY0KQogLyogNjQtYml0IGNsYXNzaWMgaGFzaCB0YWJsZSBNTVUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oCmluZGV4IGRmMTg5ODkuLmU2ZmFlNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaApAQCAtMjczLDggKzI3Myw2IEBACiAJdW5zaWduZWQgaW50CQlpcnFfY291bnQ7CiAJLyogTnVtYmVyIG9mIHNvdXJjZXMgKi8KIAl1bnNpZ25lZCBpbnQJCW51bV9zb3VyY2VzOwotCS8qIE51bWJlciBvZiBDUFVzICovCi0JdW5zaWduZWQgaW50CQludW1fY3B1czsKIAkvKiBkZWZhdWx0IHNlbnNlcyBhcnJheSAqLwogCXVuc2lnbmVkIGNoYXIJCSpzZW5zZXM7CiAJdW5zaWduZWQgaW50CQlzZW5zZXNfY291bnQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODkzZThmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaApAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIFBvd2VyTlYgT1BBTCBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19PUEFMX0gKKyNkZWZpbmUgX19PUEFMX0gKKworLyoqKioqKiBUYWtlb3ZlciBpbnRlcmZhY2UgKioqKioqKiovCisKKy8qIFBBUFIgSC1DYWxsIHVzZWQgdG8gcXVlcnR5IHRoZSBIQUwgZXhpc3RlbmNlIGFuZC9vciBpbnN0YW5jaWF0ZQorICogaXQgZnJvbSB3aXRoaW4gcEh5cCAodGVjaCBwcmV2aWV3IG9ubHkpLgorICoKKyAqIFRoaXMgaXMgZXhjbHVzaXZlbHkgdXNlZCBpbiBwcm9tX2luaXQuYworICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBvcGFsX3Rha2VvdmVyX2FyZ3MgeworCXU2NAlrX2ltYWdlOwkJLyogcjQgKi8KKwl1NjQJa19zaXplOwkJCS8qIHI1ICovCisJdTY0CWtfZW50cnk7CQkvKiByNiAqLworCXU2NAlrX2VudHJ5MjsJCS8qIHI3ICovCisJdTY0CWhhbF9hZGRyOwkJLyogcjggKi8KKwl1NjQJcmRfaW1hZ2U7CQkvKiByOSAqLworCXU2NAlyZF9zaXplOwkJLyogcjEwICovCisJdTY0CXJkX2xvYzsJCQkvKiByMTEgKi8KK307CisKK2V4dGVybiBsb25nIG9wYWxfcXVlcnlfdGFrZW92ZXIodTY0ICpoYWxfc2l6ZSwgdTY0ICpoYWxfYWxpZ24pOworCitleHRlcm4gbG9uZyBvcGFsX2RvX3Rha2VvdmVyKHN0cnVjdCBvcGFsX3Rha2VvdmVyX2FyZ3MgKmFyZ3MpOworCitzdHJ1Y3QgcnRhc19hcmdzOworZXh0ZXJuIGludCBvcGFsX2VudGVyX3J0YXMoc3RydWN0IHJ0YXNfYXJncyAqYXJncywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZGF0YSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZW50cnkpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qKioqKiogT1BBTCBBUElzICoqKioqKi8KKworLyogUmV0dXJuIGNvZGVzICovCisjZGVmaW5lIE9QQUxfU1VDQ0VTUyAJCTAKKyNkZWZpbmUgT1BBTF9QQVJBTUVURVIJCS0xCisjZGVmaW5lIE9QQUxfQlVTWQkJLTIKKyNkZWZpbmUgT1BBTF9QQVJUSUFMCQktMworI2RlZmluZSBPUEFMX0NPTlNUUkFJTkVECS00CisjZGVmaW5lIE9QQUxfQ0xPU0VECQktNQorI2RlZmluZSBPUEFMX0hBUkRXQVJFCQktNgorI2RlZmluZSBPUEFMX1VOU1VQUE9SVEVECS03CisjZGVmaW5lIE9QQUxfUEVSTUlTU0lPTgkJLTgKKyNkZWZpbmUgT1BBTF9OT19NRU0JCS05CisjZGVmaW5lIE9QQUxfUkVTT1VSQ0UJCS0xMAorI2RlZmluZSBPUEFMX0lOVEVSTkFMX0VSUk9SCS0xMQorI2RlZmluZSBPUEFMX0JVU1lfRVZFTlQJCS0xMgorI2RlZmluZSBPUEFMX0hBUkRXQVJFX0ZST1pFTgktMTMKKworLyogQVBJIFRva2VucyAoaW4gcjApICovCisjZGVmaW5lIE9QQUxfQ09OU09MRV9XUklURQkJCTEKKyNkZWZpbmUgT1BBTF9DT05TT0xFX1JFQUQJCQkyCisjZGVmaW5lIE9QQUxfUlRDX1JFQUQJCQkJMworI2RlZmluZSBPUEFMX1JUQ19XUklURQkJCQk0CisjZGVmaW5lIE9QQUxfQ0VDX1BPV0VSX0RPV04JCQk1CisjZGVmaW5lIE9QQUxfQ0VDX1JFQk9PVAkJCQk2CisjZGVmaW5lIE9QQUxfUkVBRF9OVlJBTQkJCQk3CisjZGVmaW5lIE9QQUxfV1JJVEVfTlZSQU0JCQk4CisjZGVmaW5lIE9QQUxfSEFORExFX0lOVEVSUlVQVAkJCTkKKyNkZWZpbmUgT1BBTF9QT0xMX0VWRU5UUwkJCTEwCisjZGVmaW5lIE9QQUxfUENJX1NFVF9IVUJfVENFX01FTU9SWQkJMTEKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1BIQl9UQ0VfTUVNT1JZCQkxMgorI2RlZmluZSBPUEFMX1BDSV9DT05GSUdfUkVBRF9CWVRFCQkxMworI2RlZmluZSBPUEFMX1BDSV9DT05GSUdfUkVBRF9IQUxGX1dPUkQgIAkxNAorI2RlZmluZSBPUEFMX1BDSV9DT05GSUdfUkVBRF9XT1JECQkxNQorI2RlZmluZSBPUEFMX1BDSV9DT05GSUdfV1JJVEVfQllURQkJMTYKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1dSSVRFX0hBTEZfV09SRAkJMTcKKyNkZWZpbmUgT1BBTF9QQ0lfQ09ORklHX1dSSVRFX1dPUkQJCTE4CisjZGVmaW5lIE9QQUxfU0VUX1hJVkUJCQkJMTkKKyNkZWZpbmUgT1BBTF9HRVRfWElWRQkJCQkyMAorI2RlZmluZSBPUEFMX0dFVF9DT01QTEVUSU9OX1RPS0VOX1NUQVRVUwkyMSAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBPUEFMX1JFR0lTVEVSX09QQUxfRVhDRVBUSU9OX0hBTkRMRVIJMjIKKyNkZWZpbmUgT1BBTF9QQ0lfRUVIX0ZSRUVaRV9TVEFUVVMJCTIzCisjZGVmaW5lIE9QQUxfUENJX1NIUEMJCQkJMjQKKyNkZWZpbmUgT1BBTF9DT05TT0xFX1dSSVRFX0JVRkZFUl9TUEFDRQkJMjUKKyNkZWZpbmUgT1BBTF9QQ0lfRUVIX0ZSRUVaRV9DTEVBUgkJMjYKKyNkZWZpbmUgT1BBTF9QQ0lfUEhCX01NSU9fRU5BQkxFCQkyNworI2RlZmluZSBPUEFMX1BDSV9TRVRfUEhCX01FTV9XSU5ET1cJCTI4CisjZGVmaW5lIE9QQUxfUENJX01BUF9QRV9NTUlPX1dJTkRPVwkJMjkKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX1BIQl9UQUJMRV9NRU1PUlkJCTMwCisjZGVmaW5lIE9QQUxfUENJX1NFVF9QRQkJCQkzMQorI2RlZmluZSBPUEFMX1BDSV9TRVRfUEVMVFYJCQkzMgorI2RlZmluZSBPUEFMX1BDSV9TRVRfTVZFCQkJMzMKKyNkZWZpbmUgT1BBTF9QQ0lfU0VUX01WRV9FTkFCTEUJCQkzNAorI2RlZmluZSBPUEFMX1BDSV9HRVRfWElWRV9SRUlTU1VFCQkzNQorI2RlZmluZSBPUEFMX1BDSV9TRVRfWElWRV9SRUlTU1VFCQkzNgorI2RlZmluZSBPUEFMX1BDSV9TRVRfWElWRV9QRQkJCTM3CisjZGVmaW5lIE9QQUxfR0VUX1hJVkVfU09VUkNFCQkJMzgKKyNkZWZpbmUgT1BBTF9HRVRfTVNJXzMyCQkJCTM5CisjZGVmaW5lIE9QQUxfR0VUX01TSV82NAkJCQk0MAorI2RlZmluZSBPUEFMX1NUQVJUX0NQVQkJCQk0MQorI2RlZmluZSBPUEFMX1FVRVJZX0NQVV9TVEFUVVMJCQk0MgorI2RlZmluZSBPUEFMX1dSSVRFX09QUEFORUwJCQk0MworI2RlZmluZSBPUEFMX1BDSV9NQVBfUEVfRE1BX1dJTkRPVwkJNDQKKyNkZWZpbmUgT1BBTF9QQ0lfTUFQX1BFX0RNQV9XSU5ET1dfUkVBTAkJNDUKKyNkZWZpbmUgT1BBTF9QQ0lfUkVTRVQJCQkJNDkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogT3RoZXIgZW51bXMgKi8KK2VudW0gT3BhbFZlbmRvckFwaVRva2VucyB7CisJT1BBTF9TVEFSVF9WRU5ET1JfQVBJX1JBTkdFID0gMTAwMCwgT1BBTF9FTkRfVkVORE9SX0FQSV9SQU5HRSA9IDE5OTkKK307CitlbnVtIE9wYWxGcmVlemVTdGF0ZSB7CisJT1BBTF9FRUhfU1RPUFBFRF9OT1RfRlJPWkVOID0gMCwKKwlPUEFMX0VFSF9TVE9QUEVEX01NSU9fRlJFRVpFID0gMSwKKwlPUEFMX0VFSF9TVE9QUEVEX0RNQV9GUkVFWkUgPSAyLAorCU9QQUxfRUVIX1NUT1BQRURfTU1JT19ETUFfRlJFRVpFID0gMywKKwlPUEFMX0VFSF9TVE9QUEVEX1JFU0VUID0gNCwKKwlPUEFMX0VFSF9TVE9QUEVEX1RFTVBfVU5BVkFJTCA9IDUsCisJT1BBTF9FRUhfU1RPUFBFRF9QRVJNX1VOQVZBSUwgPSA2Cit9OworZW51bSBPcGFsRWVoRnJlZXplQWN0aW9uVG9rZW4geworCU9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfTU1JTyA9IDEsCisJT1BBTF9FRUhfQUNUSU9OX0NMRUFSX0ZSRUVaRV9ETUEgPSAyLAorCU9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfQUxMID0gMworfTsKK2VudW0gT3BhbFBjaVN0YXR1c1Rva2VuIHsKKwlPUEFMX0VFSF9QSEJfTk9fRVJST1IgPSAwLAorCU9QQUxfRUVIX1BIQl9GQVRBTCA9IDEsCisJT1BBTF9FRUhfUEhCX1JFQ09WRVJBQkxFID0gMiwKKwlPUEFMX0VFSF9QSEJfQlVTX0VSUk9SID0gMywKKwlPUEFMX0VFSF9QQ0lfTk9fREVWU0VMID0gNCwKKwlPUEFMX0VFSF9QQ0lfVEEgPSA1LAorCU9QQUxfRUVIX1BDSUVYX1VSID0gNiwKKwlPUEFMX0VFSF9QQ0lFWF9DQSA9IDcsCisJT1BBTF9FRUhfUENJX01NSU9fRVJST1IgPSA4LAorCU9QQUxfRUVIX1BDSV9ETUFfRVJST1IgPSA5Cit9OworZW51bSBPcGFsU2hwY0FjdGlvbiB7CisJT1BBTF9TSFBDX0dFVF9MSU5LX1NUQVRFID0gMCwKKwlPUEFMX1NIUENfR0VUX1NMT1RfU1RBVEUgPSAxCit9OworZW51bSBPcGFsU2hwY0xpbmtTdGF0ZSB7CisJT1BBTF9TSFBDX0xJTktfRE9XTiA9IDAsCisJT1BBTF9TSFBDX0xJTktfVVAgPSAxCit9OworZW51bSBPcGFsTW1pb1dpbmRvd1R5cGUgeworCU9QQUxfTTMyX1dJTkRPV19UWVBFID0gMSwKKwlPUEFMX002NF9XSU5ET1dfVFlQRSA9IDIsCisJT1BBTF9JT19XSU5ET1dfVFlQRSA9IDMKK307CitlbnVtIE9wYWxTaHBjU2xvdFN0YXRlIHsKKwlPUEFMX1NIUENfREVWX05PVF9QUkVTRU5UID0gMCwKKwlPUEFMX1NIUENfREVWX1BSRVNFTlQgPSAxCit9OworZW51bSBPcGFsRXhjZXB0aW9uSGFuZGxlciB7CisJT1BBTF9NQUNISU5FX0NIRUNLX0hBTkRMRVIgPSAxLAorCU9QQUxfSFlQRVJWSVNPUl9NQUlOVEVOQU5DRV9IQU5ETEVSID0gMiwKKwlPUEFMX1NPRlRQQVRDSF9IQU5ETEVSID0gMworfTsKK2VudW0gT3BhbFBlbmRpbmdTdGF0ZSB7CisJT1BBTF9FVkVOVF9PUEFMX0lOVEVSTkFMID0gMHgxLAorCU9QQUxfRVZFTlRfTlZSQU0gPSAweDIsCisJT1BBTF9FVkVOVF9SVEMgPSAweDQsCisJT1BBTF9FVkVOVF9DT05TT0xFX09VVFBVVCA9IDB4OCwKKwlPUEFMX0VWRU5UX0NPTlNPTEVfSU5QVVQgPSAweDEwCit9OworCisvKiBNYWNoaW5lIGNoZWNrIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KK2VudW0gT3BhbE1DRV9WZXJzaW9uIHsKKwlPcGFsTUNFX1YxID0gMSwKK307CisKK2VudW0gT3BhbE1DRV9TZXZlcml0eSB7CisJT3BhbE1DRV9TRVZfTk9fRVJST1IgPSAwLAorCU9wYWxNQ0VfU0VWX1dBUk5JTkcgPSAxLAorCU9wYWxNQ0VfU0VWX0VSUk9SX1NZTkMgPSAyLAorCU9wYWxNQ0VfU0VWX0ZBVEFMID0gMywKK307CisKK2VudW0gT3BhbE1DRV9EaXNwb3NpdGlvbiB7CisJT3BhbE1DRV9ESVNQT1NJVElPTl9SRUNPVkVSRUQgPSAwLAorCU9wYWxNQ0VfRElTUE9TSVRJT05fTk9UX1JFQ09WRVJFRCA9IDEsCit9OworCitlbnVtIE9wYWxNQ0VfSW5pdGlhdG9yIHsKKwlPcGFsTUNFX0lOSVRJQVRPUl9VTktOT1dOID0gMCwKKwlPcGFsTUNFX0lOSVRJQVRPUl9DUFUgPSAxLAorfTsKKworZW51bSBPcGFsTUNFX0Vycm9yVHlwZSB7CisJT3BhbE1DRV9FUlJPUl9UWVBFX1VOS05PV04gPSAwLAorCU9wYWxNQ0VfRVJST1JfVFlQRV9VRSA9IDEsCisJT3BhbE1DRV9FUlJPUl9UWVBFX1NMQiA9IDIsCisJT3BhbE1DRV9FUlJPUl9UWVBFX0VSQVQgPSAzLAorCU9wYWxNQ0VfRVJST1JfVFlQRV9UTEIgPSA0LAorfTsKKworZW51bSBPcGFsTUNFX1VlRXJyb3JUeXBlIHsKKwlPcGFsTUNFX1VFX0VSUk9SX0lOREVURVJNSU5BVEUgPSAwLAorCU9wYWxNQ0VfVUVfRVJST1JfSUZFVENIID0gMSwKKwlPcGFsTUNFX1VFX0VSUk9SX1BBR0VfVEFCTEVfV0FMS19JRkVUQ0ggPSAyLAorCU9wYWxNQ0VfVUVfRVJST1JfTE9BRF9TVE9SRSA9IDMsCisJT3BhbE1DRV9VRV9FUlJPUl9QQUdFX1RBQkxFX1dBTEtfTE9BRF9TVE9SRSA9IDQsCit9OworCitlbnVtIE9wYWxNQ0VfU2xiRXJyb3JUeXBlIHsKKwlPcGFsTUNFX1NMQl9FUlJPUl9JTkRFVEVSTUlOQVRFID0gMCwKKwlPcGFsTUNFX1NMQl9FUlJPUl9QQVJJVFkgPSAxLAorCU9wYWxNQ0VfU0xCX0VSUk9SX01VTFRJSElUID0gMiwKK307CisKK2VudW0gT3BhbE1DRV9FcmF0RXJyb3JUeXBlIHsKKwlPcGFsTUNFX0VSQVRfRVJST1JfSU5ERVRFUk1JTkFURSA9IDAsCisJT3BhbE1DRV9FUkFUX0VSUk9SX1BBUklUWSA9IDEsCisJT3BhbE1DRV9FUkFUX0VSUk9SX01VTFRJSElUID0gMiwKK307CisKK2VudW0gT3BhbE1DRV9UbGJFcnJvclR5cGUgeworCU9wYWxNQ0VfVExCX0VSUk9SX0lOREVURVJNSU5BVEUgPSAwLAorCU9wYWxNQ0VfVExCX0VSUk9SX1BBUklUWSA9IDEsCisJT3BhbE1DRV9UTEJfRVJST1JfTVVMVElISVQgPSAyLAorfTsKKworZW51bSBPcGFsVGhyZWFkU3RhdHVzIHsKKwlPUEFMX1RIUkVBRF9JTkFDVElWRSA9IDB4MCwKKwlPUEFMX1RIUkVBRF9TVEFSVEVEID0gMHgxCit9OworCitlbnVtIE9wYWxQY2lCdXNDb21wYXJlIHsKKwlPcGFsUGNpQnVzQW55CT0gMCwJLyogQW55IGJ1cyBudW1iZXIgbWF0Y2ggKi8KKwlPcGFsUGNpQnVzM0JpdHMJPSAyLAkvKiBNYXRjaCB0b3AgMyBiaXRzIG9mIGJ1cyBudW1iZXIgKi8KKwlPcGFsUGNpQnVzNEJpdHMJPSAzLAkvKiBNYXRjaCB0b3AgNCBiaXRzIG9mIGJ1cyBudW1iZXIgKi8KKwlPcGFsUGNpQnVzNUJpdHMJPSA0LAkvKiBNYXRjaCB0b3AgNSBiaXRzIG9mIGJ1cyBudW1iZXIgKi8KKwlPcGFsUGNpQnVzNkJpdHMJPSA1LAkvKiBNYXRjaCB0b3AgNiBiaXRzIG9mIGJ1cyBudW1iZXIgKi8KKwlPcGFsUGNpQnVzN0JpdHMJPSA2LAkvKiBNYXRjaCB0b3AgNyBiaXRzIG9mIGJ1cyBudW1iZXIgKi8KKwlPcGFsUGNpQnVzQWxsCT0gNywJLyogTWF0Y2ggYnVzIG51bWJlciBleGFjdGx5ICovCit9OworCitlbnVtIE9wYWxEZXZpY2VDb21wYXJlIHsKKwlPUEFMX0lHTk9SRV9SSURfREVWSUNFX05VTUJFUiA9IDAsCisJT1BBTF9DT01QQVJFX1JJRF9ERVZJQ0VfTlVNQkVSID0gMQorfTsKKworZW51bSBPcGFsRnVuY0NvbXBhcmUgeworCU9QQUxfSUdOT1JFX1JJRF9GVU5DVElPTl9OVU1CRVIgPSAwLAorCU9QQUxfQ09NUEFSRV9SSURfRlVOQ1RJT05fTlVNQkVSID0gMQorfTsKKworZW51bSBPcGFsUGVBY3Rpb24geworCU9QQUxfVU5NQVBfUEUgPSAwLAorCU9QQUxfTUFQX1BFID0gMQorfTsKKworZW51bSBPcGFsUGNpUmVzZXRBbmRSZWluaXRTY29wZSB7CisJT1BBTF9QSEJfQ09NUExFVEUgPSAxLCBPUEFMX1BDSV9MSU5LID0gMiwgT1BBTF9QSEJfRVJST1IgPSAzLAorCU9QQUxfUENJX0hPVF9SRVNFVCA9IDQsIE9QQUxfUENJX0ZVTkRBTUVOVEFMX1JFU0VUID0gNSwKKwlPUEFMX1BDSV9JT0RBX1JFU0VUID0gNiwKK307CisKK2VudW0gT3BhbFBjaVJlc2V0U3RhdGUgeyBPUEFMX0RFQVNTRVJUX1JFU0VUID0gMCwgT1BBTF9BU1NFUlRfUkVTRVQgPSAxIH07CisKK3N0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQgeworCWVudW0gT3BhbE1DRV9WZXJzaW9uCXZlcnNpb246ODsJLyogMHgwMCAqLworCXVpbnQ4X3QJCQlpbl91c2U7CQkvKiAweDAxICovCisJZW51bSBPcGFsTUNFX1NldmVyaXR5CXNldmVyaXR5Ojg7CS8qIDB4MDIgKi8KKwllbnVtIE9wYWxNQ0VfSW5pdGlhdG9yCWluaXRpYXRvcjo4OwkvKiAweDAzICovCisJZW51bSBPcGFsTUNFX0Vycm9yVHlwZQllcnJvcl90eXBlOjg7CS8qIDB4MDQgKi8KKwllbnVtIE9wYWxNQ0VfRGlzcG9zaXRpb24gZGlzcG9zaXRpb246ODsgLyogMHgwNSAqLworCXVpbnQ4X3QJCQlyZXNlcnZlZF8xWzJdOwkvKiAweDA2ICovCisJdWludDY0X3QJCWdwcjM7CQkvKiAweDA4ICovCisJdWludDY0X3QJCXNycjA7CQkvKiAweDEwICovCisJdWludDY0X3QJCXNycjE7CQkvKiAweDE4ICovCisJdW5pb24gewkJCQkJLyogMHgyMCAqLworCQlzdHJ1Y3QgeworCQkJZW51bSBPcGFsTUNFX1VlRXJyb3JUeXBlIHVlX2Vycm9yX3R5cGU6ODsKKwkJCXVpbnQ4X3QJCWVmZmVjdGl2ZV9hZGRyZXNzX3Byb3ZpZGVkOworCQkJdWludDhfdAkJcGh5c2ljYWxfYWRkcmVzc19wcm92aWRlZDsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzFbNV07CisJCQl1aW50NjRfdAllZmZlY3RpdmVfYWRkcmVzczsKKwkJCXVpbnQ2NF90CXBoeXNpY2FsX2FkZHJlc3M7CisJCQl1aW50OF90CQlyZXNlcnZlZF8yWzhdOworCQl9IHVlX2Vycm9yOworCisJCXN0cnVjdCB7CisJCQllbnVtIE9wYWxNQ0VfU2xiRXJyb3JUeXBlIHNsYl9lcnJvcl90eXBlOjg7CisJCQl1aW50OF90CQllZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZDsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzFbNl07CisJCQl1aW50NjRfdAllZmZlY3RpdmVfYWRkcmVzczsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzJbMTZdOworCQl9IHNsYl9lcnJvcjsKKworCQlzdHJ1Y3QgeworCQkJZW51bSBPcGFsTUNFX0VyYXRFcnJvclR5cGUgZXJhdF9lcnJvcl90eXBlOjg7CisJCQl1aW50OF90CQllZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZDsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzFbNl07CisJCQl1aW50NjRfdAllZmZlY3RpdmVfYWRkcmVzczsKKwkJCXVpbnQ4X3QJCXJlc2VydmVkXzJbMTZdOworCQl9IGVyYXRfZXJyb3I7CisKKwkJc3RydWN0IHsKKwkJCWVudW0gT3BhbE1DRV9UbGJFcnJvclR5cGUgdGxiX2Vycm9yX3R5cGU6ODsKKwkJCXVpbnQ4X3QJCWVmZmVjdGl2ZV9hZGRyZXNzX3Byb3ZpZGVkOworCQkJdWludDhfdAkJcmVzZXJ2ZWRfMVs2XTsKKwkJCXVpbnQ2NF90CWVmZmVjdGl2ZV9hZGRyZXNzOworCQkJdWludDhfdAkJcmVzZXJ2ZWRfMlsxNl07CisJCX0gdGxiX2Vycm9yOworCX0gdTsKK307CisKK3R5cGVkZWYgc3RydWN0IG9wcGFuZWxfbGluZSB7CisJLyogWFhYICovCit9IG9wcGFuZWxfbGluZV90OworCisvKiBBUEkgZnVuY3Rpb25zICovCitpbnQ2NF90IG9wYWxfY29uc29sZV93cml0ZShpbnQ2NF90IHRlcm1fbnVtYmVyLCBpbnQ2NF90ICpsZW5ndGgsCisJCQkgICBjb25zdCB1aW50OF90ICpidWZmZXIpOworaW50NjRfdCBvcGFsX2NvbnNvbGVfcmVhZChpbnQ2NF90IHRlcm1fbnVtYmVyLCBpbnQ2NF90ICpsZW5ndGgsCisJCQkgIHVpbnQ4X3QgKmJ1ZmZlcik7CitpbnQ2NF90IG9wYWxfY29uc29sZV93cml0ZV9idWZmZXJfc3BhY2UoaW50NjRfdCB0ZXJtX251bWJlciwKKwkJCQkJaW50NjRfdCAqbGVuZ3RoKTsKK2ludDY0X3Qgb3BhbF9ydGNfcmVhZCh1aW50MzJfdCAqeWVhcl9tb250aF9kYXksCisJCSAgICAgIHVpbnQ2NF90ICpob3VyX21pbnV0ZV9zZWNvbmRfbWlsbGlzZWNvbmQpOworaW50NjRfdCBvcGFsX3J0Y193cml0ZSh1aW50MzJfdCB5ZWFyX21vbnRoX2RheSwKKwkJICAgICAgIHVpbnQ2NF90IGhvdXJfbWludXRlX3NlY29uZF9taWxsaXNlY29uZCk7CitpbnQ2NF90IG9wYWxfY2VjX3Bvd2VyX2Rvd24odWludDY0X3QgcmVxdWVzdCk7CitpbnQ2NF90IG9wYWxfY2VjX3JlYm9vdCh2b2lkKTsKK2ludDY0X3Qgb3BhbF9yZWFkX252cmFtKHVpbnQ2NF90IGJ1ZmZlciwgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0KTsKK2ludDY0X3Qgb3BhbF93cml0ZV9udnJhbSh1aW50NjRfdCBidWZmZXIsIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCk7CitpbnQ2NF90IG9wYWxfaGFuZGxlX2ludGVycnVwdCh1aW50NjRfdCBpc24sIHVpbnQ2NF90ICpvdXRzdGFuZGluZ19ldmVudF9tYXNrKTsKK2ludDY0X3Qgb3BhbF9wb2xsX2V2ZW50cyh1aW50NjRfdCAqb3V0c3RhbmRpbmdfZXZlbnRfbWFzayk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF9odWJfdGNlX21lbW9yeSh1aW50NjRfdCBodWJfaWQsIHVpbnQ2NF90IHRjZV9tZW1fYWRkciwKKwkJCQkgICAgdWludDY0X3QgdGNlX21lbV9zaXplKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3BoYl90Y2VfbWVtb3J5KHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgdGNlX21lbV9hZGRyLAorCQkJCSAgICB1aW50NjRfdCB0Y2VfbWVtX3NpemUpOworaW50NjRfdCBvcGFsX3BjaV9jb25maWdfcmVhZF9ieXRlKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAorCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCB1aW50OF90ICpkYXRhKTsKK2ludDY0X3Qgb3BhbF9wY2lfY29uZmlnX3JlYWRfaGFsZl93b3JkKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAorCQkJCSAgICAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQxNl90ICpkYXRhKTsKK2ludDY0X3Qgb3BhbF9wY2lfY29uZmlnX3JlYWRfd29yZCh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKKwkJCQkgIHVpbnQ2NF90IG9mZnNldCwgdWludDMyX3QgKmRhdGEpOworaW50NjRfdCBvcGFsX3BjaV9jb25maWdfd3JpdGVfYnl0ZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKKwkJCQkgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ4X3QgZGF0YSk7CitpbnQ2NF90IG9wYWxfcGNpX2NvbmZpZ193cml0ZV9oYWxmX3dvcmQodWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBidXNfZGV2X2Z1bmMsCisJCQkJCXVpbnQ2NF90IG9mZnNldCwgdWludDE2X3QgZGF0YSk7CitpbnQ2NF90IG9wYWxfcGNpX2NvbmZpZ193cml0ZV93b3JkKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAorCQkJCSAgIHVpbnQ2NF90IG9mZnNldCwgdWludDMyX3QgZGF0YSk7CitpbnQ2NF90IG9wYWxfc2V0X3hpdmUodWludDMyX3QgaXNuLCB1aW50MTZfdCBzZXJ2ZXIsIHVpbnQ4X3QgcHJpb3JpdHkpOworaW50NjRfdCBvcGFsX2dldF94aXZlKHVpbnQzMl90IGlzbiwgdWludDE2X3QgKnNlcnZlciwgdWludDhfdCAqcHJpb3JpdHkpOworaW50NjRfdCBvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyKHVpbnQ2NF90IG9wYWxfZXhjZXB0aW9uLAorCQkJCQl1aW50NjRfdCBoYW5kbGVyX2FkZHJlc3MsCisJCQkJCXVpbnQ2NF90IGdsdWVfY2FjaGVfbGluZSk7CitpbnQ2NF90IG9wYWxfcGNpX2VlaF9mcmVlemVfc3RhdHVzKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgcGVfbnVtYmVyLAorCQkJCSAgIHVpbnQ4X3QgKmZyZWV6ZV9zdGF0ZSwKKwkJCQkgICB1aW50MTZfdCAqcGNpX2Vycm9yX3R5cGUsCisJCQkJICAgdWludDY0X3QgKnBoYl9zdGF0dXMpOworaW50NjRfdCBvcGFsX3BjaV9lZWhfZnJlZXplX2NsZWFyKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgcGVfbnVtYmVyLAorCQkJCSAgdWludDY0X3QgZWVoX2FjdGlvbl90b2tlbik7CitpbnQ2NF90IG9wYWxfcGNpX3NocGModWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBzaHBjX2FjdGlvbiwgdWludDhfdCAqc3RhdGUpOworCisKKworaW50NjRfdCBvcGFsX3BjaV9waGJfbW1pb19lbmFibGUodWludDY0X3QgcGhiX2lkLCB1aW50MTZfdCB3aW5kb3dfdHlwZSwKKwkJCQkgdWludDE2X3Qgd2luZG93X251bSwgdWludDE2X3QgZW5hYmxlKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3BoYl9tZW1fd2luZG93KHVpbnQ2NF90IHBoYl9pZCwgdWludDE2X3Qgd2luZG93X3R5cGUsCisJCQkJICAgIHVpbnQxNl90IHdpbmRvd19udW0sCisJCQkJICAgIHVpbnQ2NF90IHN0YXJ0aW5nX3JlYWxfYWRkcmVzcywKKwkJCQkgICAgdWludDY0X3Qgc3RhcnRpbmdfcGNpX2FkZHJlc3MsCisJCQkJICAgIHVpbnQxNl90IHNlZ21lbnRfc2l6ZSk7CitpbnQ2NF90IG9wYWxfcGNpX21hcF9wZV9tbWlvX3dpbmRvdyh1aW50NjRfdCBwaGJfaWQsIHVpbnQxNl90IHBlX251bWJlciwKKwkJCQkgICAgdWludDE2X3Qgd2luZG93X3R5cGUsIHVpbnQxNl90IHdpbmRvd19udW0sCisJCQkJICAgIHVpbnQxNl90IHNlZ21lbnRfbnVtKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3BoYl90YWJsZV9tZW1vcnkodWludDY0X3QgcGhiX2lkLCB1aW50NjRfdCBydHRfYWRkciwKKwkJCQkgICAgICB1aW50NjRfdCBpdnRfYWRkciwgdWludDY0X3QgaXZ0X2xlbiwKKwkJCQkgICAgICB1aW50NjRfdCByZWplY3RfYXJyYXlfYWRkciwKKwkJCQkgICAgICB1aW50NjRfdCBwZWx0dl9hZGRyKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3BlKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgcGVfbnVtYmVyLCB1aW50NjRfdCBidXNfZGV2X2Z1bmMsCisJCQl1aW50OF90IGJ1c19jb21wYXJlLCB1aW50OF90IGRldl9jb21wYXJlLCB1aW50OF90IGZ1bmNfY29tcGFyZSwKKwkJCXVpbnQ4X3QgcGVfYWN0aW9uKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3BlbHR2KHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgcGFyZW50X3BlLCB1aW50MzJfdCBjaGlsZF9wZSwKKwkJCSAgIHVpbnQ4X3Qgc3RhdGUpOworaW50NjRfdCBvcGFsX3BjaV9zZXRfbXZlKHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgbXZlX251bWJlciwgdWludDMyX3QgcGVfbnVtYmVyKTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X212ZV9lbmFibGUodWludDY0X3QgcGhiX2lkLCB1aW50MzJfdCBtdmVfbnVtYmVyLAorCQkJCXVpbnQzMl90IHN0YXRlKTsKK2ludDY0X3Qgb3BhbF9wY2lfZ2V0X3hpdmVfcmVpc3N1ZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IHhpdmVfbnVtYmVyLAorCQkJCSAgdWludDhfdCAqcF9iaXQsIHVpbnQ4X3QgKnFfYml0KTsKK2ludDY0X3Qgb3BhbF9wY2lfc2V0X3hpdmVfcmVpc3N1ZSh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IHhpdmVfbnVtYmVyLAorCQkJCSAgdWludDhfdCBwX2JpdCwgdWludDhfdCBxX2JpdCk7CitpbnQ2NF90IG9wYWxfcGNpX3NldF94aXZlX3BlKHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgcGVfbnVtYmVyLAorCQkJICAgICB1aW50MzJfdCB4aXZlX251bSk7CitpbnQ2NF90IG9wYWxfZ2V0X3hpdmVfc291cmNlKHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgeGl2ZV9udW0sCisJCQkgICAgIGludDMyX3QgKmludGVycnVwdF9zb3VyY2VfbnVtYmVyKTsKK2ludDY0X3Qgb3BhbF9nZXRfbXNpXzMyKHVpbnQ2NF90IHBoYl9pZCwgdWludDMyX3QgbXZlX251bWJlciwgdWludDMyX3QgeGl2ZV9udW0sCisJCQl1aW50OF90IG1zaV9yYW5nZSwgdWludDMyX3QgKm1zaV9hZGRyZXNzLAorCQkJdWludDMyX3QgKm1lc3NhZ2VfZGF0YSk7CitpbnQ2NF90IG9wYWxfZ2V0X21zaV82NCh1aW50NjRfdCBwaGJfaWQsIHVpbnQzMl90IG12ZV9udW1iZXIsCisJCQl1aW50MzJfdCB4aXZlX251bSwgdWludDhfdCBtc2lfcmFuZ2UsCisJCQl1aW50NjRfdCAqbXNpX2FkZHJlc3MsIHVpbnQzMl90ICptZXNzYWdlX2RhdGEpOworaW50NjRfdCBvcGFsX3N0YXJ0X2NwdSh1aW50NjRfdCB0aHJlYWRfbnVtYmVyLCB1aW50NjRfdCBzdGFydF9hZGRyZXNzKTsKK2ludDY0X3Qgb3BhbF9xdWVyeV9jcHVfc3RhdHVzKHVpbnQ2NF90IHRocmVhZF9udW1iZXIsIHVpbnQ4X3QgKnRocmVhZF9zdGF0dXMpOworaW50NjRfdCBvcGFsX3dyaXRlX29wcGFuZWwob3BwYW5lbF9saW5lX3QgKmxpbmVzLCB1aW50NjRfdCBudW1fbGluZXMpOworaW50NjRfdCBvcGFsX3BjaV9tYXBfcGVfZG1hX3dpbmRvdyh1aW50NjRfdCBwaGJfaWQsIHVpbnQxNl90IHBlX251bWJlciwgdWludDE2X3Qgd2luZG93X2lkLAorCQkJCSAgIHVpbnQxNl90IHRjZV9sZXZlbHMsIHVpbnQ2NF90IHRjZV90YWJsZV9hZGRyLAorCQkJCSAgIHVpbnQ2NF90IHRjZV90YWJsZV9zaXplLCB1aW50NjRfdCB0Y2VfcGFnZV9zaXplKTsKK2ludDY0X3Qgb3BhbF9wY2lfbWFwX3BlX2RtYV93aW5kb3dfcmVhbCh1aW50NjRfdCBwaGJfaWQsIHVpbnQxNl90IHBlX251bWJlciwKKwkJCQkJdWludDE2X3QgZG1hX3dpbmRvd19udW1iZXIsIHVpbnQ2NF90IHBjaV9zdGFydF9hZGRyLAorCQkJCQl1aW50NjRfdCBwY2lfbWVtX3NpemUpOworaW50NjRfdCBvcGFsX3BjaV9yZXNldCh1aW50NjRfdCBwaGJfaWQsIHVpbnQ4X3QgcmVzZXRfc2NvcGUsIHVpbnQ4X3QgYXNzZXJ0X3N0YXRlKTsKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitleHRlcm4gaW50IGVhcmx5X2luaXRfZHRfc2Nhbl9vcGFsKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqdW5hbWUsIGludCBkZXB0aCwgdm9pZCAqZGF0YSk7CisKK2V4dGVybiBpbnQgb3BhbF9nZXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpOworZXh0ZXJuIGludCBvcGFsX3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCB0b3RhbF9sZW4pOworCitleHRlcm4gdm9pZCBodmNfb3BhbF9pbml0X2Vhcmx5KHZvaWQpOworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX29wYWwodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICp1bmFtZSwKKwkJCQkgICBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOworCitleHRlcm4gaW50IG9wYWxfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgb3BhbF9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgdG90YWxfbGVuKTsKKworZXh0ZXJuIHZvaWQgaHZjX29wYWxfaW5pdF9lYXJseSh2b2lkKTsKKworc3RydWN0IHJ0Y190aW1lOworZXh0ZXJuIGludCBvcGFsX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKK2V4dGVybiB2b2lkIG9wYWxfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb3BhbF9nZXRfYm9vdF90aW1lKHZvaWQpOworZXh0ZXJuIHZvaWQgb3BhbF9udnJhbV9pbml0KHZvaWQpOworCitleHRlcm4gaW50IG9wYWxfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9fT1BBTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAppbmRleCA1MTZiZmIzLi4xNzcyMmM3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgZ2V0X3NsYl9zaGFkb3coKQkoZ2V0X3BhY2EoKS0+c2xiX3NoYWRvd19wdHIpCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKK3N0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQ7CiAKIC8qCiAgKiBEZWZpbmVzIHRoZSBsYXlvdXQgb2YgdGhlIHBhY2EuCkBAIC0xMzUsNiArMTM2LDEzIEBACiAJdTggaW9fc3luYzsJCQkvKiB3cml0ZWwoKSBuZWVkcyBzcGluX3VubG9jayBzeW5jICovCiAJdTggaXJxX3dvcmtfcGVuZGluZzsJCS8qIElSUV9XT1JLIGludGVycnVwdCB3aGlsZSBzb2Z0LWRpc2FibGUgKi8KIAorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCS8qIFBvaW50ZXIgdG8gT1BBTCBtYWNoaW5lIGNoZWNrIGV2ZW50IHN0cnVjdHVyZSBzZXQgYnkgdGhlCisJICogZWFybHkgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIHVzZSBieSBoaWdoIGxldmVsIEMgaGFuZGxlcgorCSAqLworCXN0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQgKm9wYWxfbWNfZXZ0OworI2VuZGlmCisKIAkvKiBTdHVmZiBmb3IgYWNjdXJhdGUgdGltZSBhY2NvdW50aW5nICovCiAJdTY0IHVzZXJfdGltZTsJCQkvKiBhY2N1bXVsYXRlZCB1c2VybW9kZSBUQiB0aWNrcyAqLwogCXU2NCBzeXN0ZW1fdGltZTsJCS8qIGFjY3VtdWxhdGVkIHN5c3RlbSBUQiB0aWNrcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggMmNkNjY0ZS4uZGQ5YzRmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0zNiw2ICszNiwxOCBAQAogCiAjZGVmaW5lIFBBR0VfU0laRQkJKEFTTV9DT05TVCgxKSA8PCBQQUdFX1NISUZUKQogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKK2V4dGVybiB1bnNpZ25lZCBpbnQgSFBBR0VfU0hJRlQ7CisjZWxzZQorI2RlZmluZSBIUEFHRV9TSElGVCBQQUdFX1NISUZUCisjZW5kaWYKKyNkZWZpbmUgSFBBR0VfU0laRQkJKCgxVUwpIDw8IEhQQUdFX1NISUZUKQorI2RlZmluZSBIUEFHRV9NQVNLCQkofihIUEFHRV9TSVpFIC0gMSkpCisjZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKQorI2RlZmluZSBIVUdFX01BWF9IU1RBVEUJCShNTVVfUEFHRV9DT1VOVC0xKQorI2VuZGlmCisKIC8qIFdlIGRvIGRlZmluZSBBVF9TWVNJTkZPX0VIRFIgYnV0IGRvbid0IHVzZSB0aGUgZ2F0ZSBtZWNoYW5pc20gKi8KICNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBCQkxCiAKQEAgLTE1OCw2ICsxNzAsMjQgQEAKICNkZWZpbmUgaXNfa2VybmVsX2FkZHIoeCkJKCh4KSA+PSBQQUdFX09GRlNFVCkKICNlbmRpZgogCisvKgorICogVXNlIHRoZSB0b3AgYml0IG9mIHRoZSBoaWdoZXItbGV2ZWwgcGFnZSB0YWJsZSBlbnRyaWVzIHRvIGluZGljYXRlIHdoZXRoZXIKKyAqIHRoZSBlbnRyaWVzIHdlIHBvaW50IHRvIGNvbnRhaW4gaHVnZXBhZ2VzLiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cgdGhhdAorICogdGhlIHBhZ2UgdGFibGVzIGxpdmUgaW4ga2VybmVsIHNwYWNlLiAgSWYgd2UgZXZlciBkZWNpZGUgdG8gc3VwcG9ydCBoYXZpbmcKKyAqIHBhZ2UgdGFibGVzIGF0IGFyYml0cmFyeSBhZGRyZXNzZXMsIHRoaXMgYnJlYWtzIGFuZCB3aWxsIGhhdmUgdG8gY2hhbmdlLgorICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisjZGVmaW5lIFBEX0hVR0UgMHg4MDAwMDAwMDAwMDAwMDAwCisjZWxzZQorI2RlZmluZSBQRF9IVUdFIDB4ODAwMDAwMDAKKyNlbmRpZgorCisvKgorICogU29tZSBudW1iZXIgb2YgYml0cyBhdCB0aGUgbGV2ZWwgb2YgdGhlIHBhZ2UgdGFibGUgdGhhdCBwb2ludHMgdG8KKyAqIGEgaHVnZXB0ZSBhcmUgdXNlZCB0byBlbmNvZGUgdGhlIHNpemUuICBUaGlzIG1hc2tzIHRob3NlIGJpdHMuCisgKi8KKyNkZWZpbmUgSFVHRVBEX1NISUZUX01BU0sgICAgIDB4M2YKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI3VuZGVmIFNUUklDVF9NTV9UWVBFQ0hFQ0tTCkBAIC0yNDMsNyArMjczLDYgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7IHNpZ25lZCBsb25nIHBkOyB9IGh1Z2VwZF90OwotI2RlZmluZSBIVUdFUERfU0hJRlRfTUFTSyAgICAgMHgzZgogCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogc3RhdGljIGlubGluZSBpbnQgaHVnZXBkX29rKGh1Z2VwZF90IGhwZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV82NC5oCmluZGV4IDkzNTYyNjIuLmZiNDBlZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaApAQCAtNjQsMTcgKzY0LDYgQEAKIC8qIExvZyAyIG9mIHBhZ2UgdGFibGUgc2l6ZSAqLwogZXh0ZXJuIHU2NCBwcGM2NF9wZnRfc2l6ZTsKIAotLyogTGFyZ2UgcGFnZXMgc2l6ZSAqLwotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLWV4dGVybiB1bnNpZ25lZCBpbnQgSFBBR0VfU0hJRlQ7Ci0jZWxzZQotI2RlZmluZSBIUEFHRV9TSElGVCBQQUdFX1NISUZUCi0jZW5kaWYKLSNkZWZpbmUgSFBBR0VfU0laRQkJKCgxVUwpIDw8IEhQQUdFX1NISUZUKQotI2RlZmluZSBIUEFHRV9NQVNLCQkofihIUEFHRV9TSVpFIC0gMSkpCi0jZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKQotI2RlZmluZSBIVUdFX01BWF9IU1RBVEUJCShNTVVfUEFHRV9DT1VOVC0xKQotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1ib29rM2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wdGUtYm9vazNlLmgKaW5kZXggMDgyZDUxNS4uMDE1NjcwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3B0ZS1ib29rM2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHRlLWJvb2szZS5oCkBAIC03Miw2ICs3Miw5IEBACiAjZGVmaW5lCVBURV9SUE5fU0hJRlQJKDI0KQogI2VuZGlmCiAKKyNkZWZpbmUgUFRFX1dJTUdFX1NISUZUICgxOSkKKyNkZWZpbmUgUFRFX0JBUF9TSElGVAkoMikKKwogLyogT24gMzItYml0LCB3ZSBuZXZlciBjbGVhciB0aGUgdG9wIHBhcnQgb2YgdGhlIFBURSAqLwogI2lmZGVmIENPTkZJR19QUEMzMgogI2RlZmluZSBfUFRFX05PTkVfTUFTSwkweGZmZmZmZmZmMDAwMDAwMDBVTEwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaAppbmRleCA5ZWMwYjM5Li4yOGNkYmQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCkBAIC01NDgsNiArNTQ4LDkgQEAKICNkZWZpbmUgTDFDU1IxX0lDRkkJMHgwMDAwMDAwMgkvKiBJbnN0ciBDYWNoZSBGbGFzaCBJbnZhbGlkYXRlICovCiAjZGVmaW5lIEwxQ1NSMV9JQ0UJMHgwMDAwMDAwMQkvKiBJbnN0ciBDYWNoZSBFbmFibGUgKi8KIAorLyogQml0IGRlZmluaXRpb25zIGZvciBMMUNTUjIuICovCisjZGVmaW5lIEwxQ1NSMl9EQ1dTCTB4NDAwMDAwMDAJLyogRGF0YSBDYWNoZSB3cml0ZSBzaGFkb3cgKi8KKwogLyogQml0IGRlZmluaXRpb25zIGZvciBMMkNTUjAuICovCiAjZGVmaW5lIEwyQ1NSMF9MMkUJMHg4MDAwMDAwMAkvKiBMMiBDYWNoZSBFbmFibGUgKi8KICNkZWZpbmUgTDJDU1IwX0wyUEUJMHg0MDAwMDAwMAkvKiBMMiBDYWNoZSBQYXJpdHkvRUNDIEVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKaW5kZXggNTg2MjVkMS4uNDFmNjlhZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCkBAIC0yNDksMTAgKzI0OSwxMiBAQAogI2RlZmluZSBFUlJfRkxBR19BTFJFQURZX0xPR0dFRAkweDAKICNkZWZpbmUgRVJSX0ZMQUdfQk9PVAkJMHgxIAkvKiBsb2cgd2FzIHB1bGxlZCBmcm9tIE5WUkFNIG9uIGJvb3QgKi8KICNkZWZpbmUgRVJSX1RZUEVfUlRBU19MT0cJMHgyCS8qIGZyb20gcnRhcyBldmVudC1zY2FuICovCi0jZGVmaW5lIEVSUl9UWVBFX0tFUk5FTF9QQU5JQwkweDQJLyogZnJvbSBwYW5pYygpICovCisjZGVmaW5lIEVSUl9UWVBFX0tFUk5FTF9QQU5JQwkweDQJLyogZnJvbSBkaWUoKS9wYW5pYygpICovCisjZGVmaW5lIEVSUl9UWVBFX0tFUk5FTF9QQU5JQ19HWiAweDgJLyogZGl0dG8sIGNvbXByZXNzZWQgKi8KIAogLyogQWxsIHRoZSB0eXBlcyBhbmQgbm90IGZsYWdzICovCi0jZGVmaW5lIEVSUl9UWVBFX01BU0sJKEVSUl9UWVBFX1JUQVNfTE9HIHwgRVJSX1RZUEVfS0VSTkVMX1BBTklDKQorI2RlZmluZSBFUlJfVFlQRV9NQVNLIFwKKwkoRVJSX1RZUEVfUlRBU19MT0cgfCBFUlJfVFlQRV9LRVJORUxfUEFOSUMgfCBFUlJfVFlQRV9LRVJORUxfUEFOSUNfR1opCiAKICNkZWZpbmUgUlRBU19ERUJVRyBLRVJOX0RFQlVHICJSVEFTOiAiCiAgCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMTVhNzBiNy4uYWRiYTk3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXAuaApAQCAtNjUsNiArNjUsNyBAQAogdm9pZCBnZW5lcmljX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CiB2b2lkIGdlbmVyaWNfbWFjaF9jcHVfZGllKHZvaWQpOwogdm9pZCBnZW5lcmljX3NldF9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KTsKK2ludCBnZW5lcmljX2NoZWNrX2NwdV9yZXN0YXJ0KHVuc2lnbmVkIGludCBjcHUpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaAppbmRleCA1NGE0N2VhLi4wYzVmYTMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCkBAIC0xNiw3ICsxNiw3IEBACiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTSAqLwogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCi1leHRlcm4gdm9pZCBjcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiBpbnQgY3JlYXRlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gaW50IHJlbW92ZV9zZWN0aW9uX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gaW50IGhvdF9hZGRfc2NuX3RvX25pZCh1bnNpZ25lZCBsb25nIHNjbl9hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcHUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcHUuaAppbmRleCAwYzhiMzVkLi40ZTM2MGJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjZGVmaW5lIExTX1NJWkUgKDI1NiAqIDEwMjQpCiAjZGVmaW5lIExTX0FERFJfTUFTSyAoTFNfU0laRSAtIDEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKaW5kZXggZmEwZDI3YS4uNTU5YWUxZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaApAQCAtMzU0LDMgKzM1NCw1IEBACiBTWVNDQUxMX1NQVShzeW5jZnMpCiBDT01QQVRfU1lTX1NQVShzZW5kbW1zZykKIFNZU0NBTExfU1BVKHNldG5zKQorQ09NUEFUX1NZUyhwcm9jZXNzX3ZtX3JlYWR2KQorQ09NUEFUX1NZUyhwcm9jZXNzX3ZtX3dyaXRldikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggN2VmMGQ5MC4uMWUxMDRhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTE5LDE0ICsxOSwxMCBAQAogI2RlZmluZSBSRUNMQUlNX0RJU1RBTkNFIDEwCiAKIC8qCi0gKiBCZWZvcmUgZ29pbmcgb2ZmIG5vZGUgd2Ugd2FudCB0aGUgVk0gdG8gdHJ5IGFuZCByZWNsYWltIGZyb20gdGhlIGxvY2FsCi0gKiBub2RlLiBJdCBkb2VzIHRoaXMgaWYgdGhlIHJlbW90ZSBkaXN0YW5jZSBpcyBsYXJnZXIgdGhhbiBSRUNMQUlNX0RJU1RBTkNFLgotICogV2l0aCB0aGUgZGVmYXVsdCBSRU1PVEVfRElTVEFOQ0Ugb2YgMjAgYW5kIHRoZSBkZWZhdWx0IFJFQ0xBSU1fRElTVEFOQ0Ugb2YKLSAqIDIwLCB3ZSBuZXZlciByZWNsYWltIGFuZCBnbyBvZmYgbm9kZSBzdHJhaWdodCBhd2F5LgotICoKLSAqIFRvIGZpeCB0aGlzIHdlIGNob29zZSBhIHNtYWxsZXIgdmFsdWUgb2YgUkVDTEFJTV9ESVNUQU5DRS4KKyAqIEF2b2lkIGNyZWF0aW5nIGFuIGV4dHJhIGxldmVsIG9mIGJhbGFuY2luZyAoU0RfQUxMTk9ERVMpIG9uIHRoZSBsYXJnZXN0CisgKiBQT1dFUjcgYm94ZXMgd2hpY2ggaGF2ZSBhIG1heGltdW0gb2YgMzIgbm9kZXMuCiAgKi8KLSNkZWZpbmUgUkVDTEFJTV9ESVNUQU5DRSAxMAorI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDMyCiAKICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAKQEAgLTY5LDExICs2NSwxMSBAQAogCS5mb3JrZXhlY19pZHgJCT0gMCwJCQkJCVwKIAkJCQkJCQkJCVwKIAkuZmxhZ3MJCQk9IDEqU0RfTE9BRF9CQUxBTkNFCQkJXAotCQkJCXwgMSpTRF9CQUxBTkNFX05FV0lETEUJCQlcCisJCQkJfCAwKlNEX0JBTEFOQ0VfTkVXSURMRQkJCVwKIAkJCQl8IDEqU0RfQkFMQU5DRV9FWEVDCQkJXAogCQkJCXwgMSpTRF9CQUxBTkNFX0ZPUksJCQlcCiAJCQkJfCAwKlNEX0JBTEFOQ0VfV0FLRQkJCVwKLQkJCQl8IDAqU0RfV0FLRV9BRkZJTkUJCQlcCisJCQkJfCAxKlNEX1dBS0VfQUZGSU5FCQkJXAogCQkJCXwgMCpTRF9QUkVGRVJfTE9DQUwJCQlcCiAJCQkJfCAwKlNEX1NIQVJFX0NQVVBPV0VSCQkJXAogCQkJCXwgMCpTRF9QT1dFUlNBVklOR1NfQkFMQU5DRQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VkYmcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91ZGJnLmgKaW5kZXggNTM1NGFlOS4uODMzOGFlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VkYmcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWRiZy5oCkBAIC01NSw2ICs1NSw5IEBACiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X3VzYmdlY2tvKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF93c3Aodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X2Vodl9iYyh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCB1ZGJnX2luaXRfcHMzZ2VsaWModm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdWRiZ19pbml0X2RlYnVnX29wYWxfcmF3KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19vcGFsX2h2c2kodm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1VEQkdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IGI4YjNmNTkuLmQzZDFiNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTM3MywxMCArMzczLDEyIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkzNDgKICNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzQ5CiAjZGVmaW5lIF9fTlJfc2V0bnMJCTM1MAorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzUxCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzUyCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgX19OUl9zeXNjYWxscwkJMzUxCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTM1MwogCiAjZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0CiAjZGVmaW5lIE5SX3N5c2NhbGxzCV9fTlJfc3lzY2FsbHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS94aWNzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20veGljcy5oCmluZGV4IGIxODNhNDAuLmM0OGRlOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS94aWNzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3hpY3MuaApAQCAtMTUsOCArMTUsOCBAQAogI2RlZmluZQlERUZBVUxUX1BSSU9SSVRZCTUKIAogLyoKLSAqIE1hcmsgSVBJcyBhcyBoaWdoZXIgcHJpb3JpdHkgc28gd2UgY2FuIHRha2UgdGhlbSBpbnNpZGUgaW50ZXJydXB0cyB0aGF0Ci0gKiBhcmVudCBtYXJrZWQgSVJRRl9ESVNBQkxFRAorICogTWFyayBJUElzIGFzIGhpZ2hlciBwcmlvcml0eSBzbyB3ZSBjYW4gdGFrZSB0aGVtIGluc2lkZSBpbnRlcnJ1cHRzCisgKiBGSVhNRTogc3RpbGwgdHJ1ZSBub3c/CiAgKi8KICNkZWZpbmUgSVBJX1BSSU9SSVRZCQk0CiAKQEAgLTI3LDEwICsyNywxOCBAQAogI2RlZmluZSBNQVhfTlVNX1BSSU9SSVRJRVMJMwogCiAvKiBOYXRpdmUgSUNQICovCisjaWZkZWYgQ09ORklHX1BQQ19JQ1BfTkFUSVZFCiBleHRlcm4gaW50IGljcF9uYXRpdmVfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpY3BfbmF0aXZlX2luaXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQorI2VuZGlmCiAKIC8qIFBBUFIgSUNQICovCisjaWZkZWYgQ09ORklHX1BQQ19JQ1BfSFYKIGV4dGVybiBpbnQgaWNwX2h2X2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaWNwX2h2X2luaXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQorI2VuZGlmCiAKIC8qIElDUCBvcHMgKi8KIHN0cnVjdCBpY3Bfb3BzIHsKQEAgLTUxLDcgKzU5LDE4IEBACiBleHRlcm4gaW50IGljc19uYXRpdmVfaW5pdCh2b2lkKTsKIAogLyogUlRBUyBJQ1MgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0lDU19SVEFTCiBleHRlcm4gaW50IGljc19ydGFzX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaWNzX3J0YXNfaW5pdCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CisjZW5kaWYKKworLyogSEFMIElDUyAqLworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorZXh0ZXJuIGludCBpY3Nfb3BhbF9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGljc19vcGFsX2luaXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQorI2VuZGlmCiAKIC8qIElDUyBpbnN0YW5jZSwgaG9va2VkIHVwIHRvIGNoaXBfZGF0YSBvZiBhbiBpcnEgKi8KIHN0cnVjdCBpY3MgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDVmMDc4YmMuLjdjNTMyNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTQ0LDEwICs0NCwxNCBAQAogI2luY2x1ZGUgPGFzbS9jb21wYXQuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS94aWNzLmg+CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKICNpbmNsdWRlIDxhc20vaXNlcmllcy9hbHBhY2EuaD4KICNlbmRpZgorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19LVk0pIHx8IGRlZmluZWQoQ09ORklHX0tWTV9HVUVTVCkKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2VuZGlmCkBAIC00NDksOCArNDUzLDYgQEAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwogCURFRklORShWQ1BVX0tWTSwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBrdm0pKTsKIAlERUZJTkUoVkNQVV9WQ1BVSUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgdmNwdV9pZCkpOwotCURFRklORShWQ1BVX0hPU1RfUkVUSVAsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0X3JldGlwKSk7Ci0JREVGSU5FKFZDUFVfSE9TVF9NU1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0X21zcikpOwogCURFRklORShWQ1BVX1BVUlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wdXJyKSk7CiAJREVGSU5FKFZDUFVfU1BVUlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5zcHVycikpOwogCURFRklORShWQ1BVX0RTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kc2NyKSk7CkBAIC00NTgsMTQgKzQ2MCwxMiBAQAogCURFRklORShWQ1BVX1VBTU9SLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudWFtb3IpKTsKIAlERUZJTkUoVkNQVV9DVFJMLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guY3RybCkpOwogCURFRklORShWQ1BVX0RBQlIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kYWJyKSk7Ci0JREVGSU5FKFZDUFVfVFJBTVBPTElORV9MT1dNRU0sIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50cmFtcG9saW5lX2xvd21lbSkpOwotCURFRklORShWQ1BVX1RSQU1QT0xJTkVfRU5URVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50cmFtcG9saW5lX2VudGVyKSk7Ci0JREVGSU5FKFZDUFVfSElHSE1FTV9IQU5ETEVSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaGlnaG1lbV9oYW5kbGVyKSk7Ci0JREVGSU5FKFZDUFVfUk1DQUxMLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucm1jYWxsKSk7CiAJREVGSU5FKFZDUFVfSEZMQUdTLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guaGZsYWdzKSk7CiAJREVGSU5FKFZDUFVfREVDLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZGVjKSk7CiAJREVGSU5FKFZDUFVfREVDX0VYUElSRVMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kZWNfZXhwaXJlcykpOwogCURFRklORShWQ1BVX1BFTkRJTkdfRVhDLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucGVuZGluZ19leGNlcHRpb25zKSk7CisJREVGSU5FKFZDUFVfQ0VERUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5jZWRlZCkpOworCURFRklORShWQ1BVX1BST0RERUQsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wcm9kZGVkKSk7CiAJREVGSU5FKFZDUFVfVlBBLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudnBhKSk7CiAJREVGSU5FKFZDUFVfTU1DUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLm1tY3IpKTsKIAlERUZJTkUoVkNQVV9QTUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5wbWMpKTsKQEAgLTQ4MSw2ICs0ODEsNyBAQAogCURFRklORShWQ09SRV9FTlRSWV9FWElULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBlbnRyeV9leGl0X2NvdW50KSk7CiAJREVGSU5FKFZDT1JFX05BUF9DT1VOVCwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgbmFwX2NvdW50KSk7CiAJREVGSU5FKFZDT1JFX0lOX0dVRVNULCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBpbl9ndWVzdCkpOworCURFRklORShWQ09SRV9OQVBQSU5HX1RIUkVBRFMsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIG5hcHBpbmdfdGhyZWFkcykpOwogCURFRklORShWQ1BVX1NWQ1BVLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzLCBzaGFkb3dfdmNwdSkgLQogCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcywgdmNwdSkpOwogCURFRklORShWQ1BVX1NMQl9FLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3NsYiwgb3JpZ2UpKTsKQEAgLTUzNyw2ICs1MzgsOCBAQAogCUhTVEFURV9GSUVMRChIU1RBVEVfU0NSQVRDSDAsIHNjcmF0Y2gwKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX1NDUkFUQ0gxLCBzY3JhdGNoMSk7CiAJSFNUQVRFX0ZJRUxEKEhTVEFURV9JTl9HVUVTVCwgaW5fZ3Vlc3QpOworCUhTVEFURV9GSUVMRChIU1RBVEVfUkVTVE9SRV9ISUQ1LCByZXN0b3JlX2hpZDUpOworCUhTVEFURV9GSUVMRChIU1RBVEVfTkFQUElORywgbmFwcGluZyk7CiAKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IVgogCUhTVEFURV9GSUVMRChIU1RBVEVfS1ZNX1ZDUFUsIGt2bV92Y3B1KTsKQEAgLTU0OSw2ICs1NTIsNyBAQAogCUhTVEFURV9GSUVMRChIU1RBVEVfRFNDUiwgaG9zdF9kc2NyKTsKIAlIU1RBVEVfRklFTEQoSFNUQVRFX0RBQlIsIGRhYnIpOwogCUhTVEFURV9GSUVMRChIU1RBVEVfREVDRVhQLCBkZWNfZXhwaXJlcyk7CisJREVGSU5FKElQSV9QUklPUklUWSwgSVBJX1BSSU9SSVRZKTsKICNlbmRpZiAvKiBDT05GSUdfS1ZNX0JPT0szU182NF9IViAqLwogCiAjZWxzZSAvKiBDT05GSUdfUFBDX0JPT0szUyAqLwpAQCAtNjA5LDUgKzYxMywxMiBAQAogCQkJCQlhcmNoLnRpbWluZ19sYXN0X2VudGVyLnR2MzIudGJsKSk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCURFRklORShPUEFMX01DX0dQUjMsIG9mZnNldG9mKHN0cnVjdCBvcGFsX21hY2hpbmVfY2hlY2tfZXZlbnQsIGdwcjMpKTsKKwlERUZJTkUoT1BBTF9NQ19TUlIwLCBvZmZzZXRvZihzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50LCBzcnIwKSk7CisJREVGSU5FKE9QQUxfTUNfU1JSMSwgb2Zmc2V0b2Yoc3RydWN0IG9wYWxfbWFjaGluZV9jaGVja19ldmVudCwgc3JyMSkpOworCURFRklORShQQUNBX09QQUxfTUNfRVZULCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIG9wYWxfbWNfZXZ0KSk7CisjZW5kaWYKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCmluZGV4IDYwYjNlMzcuLmFjOGY1MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2xvY2suYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2xvY2suYwppbmRleCBjZTY2OGY1Li5hNzY0YjQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2Nsb2NrLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jbG9jay5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2Nsa19pbnRlcmZhY2UuaD4KIAogc3RydWN0IGNsa19pbnRlcmZhY2UgY2xrX2Z1bmN0aW9uczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCBmYTQ0ZmY1Li5lZGFlNWJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL29wcm9maWxlX2ltcGwuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwppbmRleCBjYzZhOWQ1Li5kODc5ODA5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYwppbmRleCBlNzU1NDE1Li4zZjY0NjRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKQEAgLTUsNiArNSw3IEBACiAgKiBidXNzZXMgdXNpbmcgdGhlIGlvbW11IGluZnJhc3RydWN0dXJlCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogCiAvKgpAQCAtOTAsMTMgKzkxLDI3IEBACiAJCXJldHVybiAxOwogfQogCitzdGF0aWMgdTY0IGRtYV9pb21tdV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpOworCXU2NCBtYXNrOworCWlmICghdGJsKQorCQlyZXR1cm4gMDsKKworCW1hc2sgPSAxVUxMIDwgKGZsc19sb25nKHRibC0+aXRfb2Zmc2V0ICsgdGJsLT5pdF9zaXplKSAtIDEpOworCW1hc2sgKz0gbWFzayAtIDE7CisKKwlyZXR1cm4gbWFzazsKK30KKwogc3RydWN0IGRtYV9tYXBfb3BzIGRtYV9pb21tdV9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50CT0gZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50CT0gZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zZwkJPSBkbWFfaW9tbXVfbWFwX3NnLAotCS51bm1hcF9zZwk9IGRtYV9pb21tdV91bm1hcF9zZywKLQkuZG1hX3N1cHBvcnRlZAk9IGRtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAotCS5tYXBfcGFnZQk9IGRtYV9pb21tdV9tYXBfcGFnZSwKLQkudW5tYXBfcGFnZQk9IGRtYV9pb21tdV91bm1hcF9wYWdlLAorCS5hbGxvY19jb2hlcmVudAkJPSBkbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQJCT0gZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZwkJCT0gZG1hX2lvbW11X21hcF9zZywKKwkudW5tYXBfc2cJCT0gZG1hX2lvbW11X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkCQk9IGRtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAorCS5tYXBfcGFnZQkJPSBkbWFfaW9tbXVfbWFwX3BhZ2UsCisJLnVubWFwX3BhZ2UJCT0gZG1hX2lvbW11X3VubWFwX3BhZ2UsCisJLmdldF9yZXF1aXJlZF9tYXNrCT0gZG1hX2lvbW11X2dldF9yZXF1aXJlZF9tYXNrLAogfTsKIEVYUE9SVF9TWU1CT0woZG1hX2lvbW11X29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1zd2lvdGxiLmMKaW5kZXggNDI5NWUwYi4uMWViYzkxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtc3dpb3RsYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLXN3aW90bGIuYwpAQCAtMjQsNiArMjQsMjEgQEAKIAogdW5zaWduZWQgaW50IHBwY19zd2lvdGxiX2VuYWJsZTsKIAorc3RhdGljIHU2NCBzd2lvdGxiX3Bvd2VycGNfZ2V0X3JlcXVpcmVkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1NjQgZW5kLCBtYXNrLCBtYXhfZGlyZWN0X2RtYV9hZGRyID0gZGV2LT5hcmNoZGF0YS5tYXhfZGlyZWN0X2RtYV9hZGRyOworCisJZW5kID0gbWVtYmxvY2tfZW5kX29mX0RSQU0oKTsKKwlpZiAobWF4X2RpcmVjdF9kbWFfYWRkciAmJiBlbmQgPiBtYXhfZGlyZWN0X2RtYV9hZGRyKQorCQllbmQgPSBtYXhfZGlyZWN0X2RtYV9hZGRyOworCWVuZCArPSBnZXRfZG1hX29mZnNldChkZXYpOworCisJbWFzayA9IDFVTEwgPDwgKGZsczY0KGVuZCkgLSAxKTsKKwltYXNrICs9IG1hc2sgLSAxOworCisJcmV0dXJuIG1hc2s7Cit9CisKIC8qCiAgKiBBdCB0aGUgbW9tZW50LCBhbGwgcGxhdGZvcm1zIHRoYXQgdXNlIHRoaXMgY29kZSBvbmx5IHJlcXVpcmUKICAqIHN3aW90bGIgdG8gYmUgdXNlZCBpZiB3ZSdyZSBvcGVyYXRpbmcgb24gSElHSE1FTS4gIFNpbmNlCkBAIC00NCw2ICs1OSw3IEBACiAJLnN5bmNfc2dfZm9yX2NwdSA9IHN3aW90bGJfc3luY19zZ19mb3JfY3B1LAogCS5zeW5jX3NnX2Zvcl9kZXZpY2UgPSBzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZSwKIAkubWFwcGluZ19lcnJvciA9IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IsCisJLmdldF9yZXF1aXJlZF9tYXNrID0gc3dpb3RsYl9wb3dlcnBjX2dldF9yZXF1aXJlZCwKIH07CiAKIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfc3dpb3RsYihzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS5jCmluZGV4IDRmMDk1OWYuLjdkMDIzM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CkBAIC05Niw2ICs5NywxOCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB1NjQgZG1hX2RpcmVjdF9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTY0IGVuZCwgbWFzazsKKworCWVuZCA9IG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkgKyBnZXRfZG1hX29mZnNldChkZXYpOworCisJbWFzayA9IDFVTEwgPDwgKGZsczY0KGVuZCkgLSAxKTsKKwltYXNrICs9IG1hc2sgLSAxOworCisJcmV0dXJuIG1hc2s7Cit9CisKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfZGlyZWN0X21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKQEAgLTEzNywxMyArMTUwLDE0IEBACiAjZW5kaWYKIAogc3RydWN0IGRtYV9tYXBfb3BzIGRtYV9kaXJlY3Rfb3BzID0gewotCS5hbGxvY19jb2hlcmVudAk9IGRtYV9kaXJlY3RfYWxsb2NfY29oZXJlbnQsCi0JLmZyZWVfY29oZXJlbnQJPSBkbWFfZGlyZWN0X2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zZwkJPSBkbWFfZGlyZWN0X21hcF9zZywKLQkudW5tYXBfc2cJPSBkbWFfZGlyZWN0X3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2RpcmVjdF9kbWFfc3VwcG9ydGVkLAotCS5tYXBfcGFnZQk9IGRtYV9kaXJlY3RfbWFwX3BhZ2UsCi0JLnVubWFwX3BhZ2UJPSBkbWFfZGlyZWN0X3VubWFwX3BhZ2UsCisJLmFsbG9jX2NvaGVyZW50CQkJPSBkbWFfZGlyZWN0X2FsbG9jX2NvaGVyZW50LAorCS5mcmVlX2NvaGVyZW50CQkJPSBkbWFfZGlyZWN0X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zZwkJCQk9IGRtYV9kaXJlY3RfbWFwX3NnLAorCS51bm1hcF9zZwkJCT0gZG1hX2RpcmVjdF91bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZAkJCT0gZG1hX2RpcmVjdF9kbWFfc3VwcG9ydGVkLAorCS5tYXBfcGFnZQkJCT0gZG1hX2RpcmVjdF9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZQkJCT0gZG1hX2RpcmVjdF91bm1hcF9wYWdlLAorCS5nZXRfcmVxdWlyZWRfbWFzawkJPSBkbWFfZGlyZWN0X2dldF9yZXF1aXJlZF9tYXNrLAogI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKIAkuc3luY19zaW5nbGVfZm9yX2NwdSAJCT0gZG1hX2RpcmVjdF9zeW5jX3NpbmdsZSwKIAkuc3luY19zaW5nbGVfZm9yX2RldmljZSAJPSBkbWFfZGlyZWN0X3N5bmNfc2luZ2xlLApAQCAtMTcwLDYgKzE4NCwyMyBAQAogfQogRVhQT1JUX1NZTUJPTChkbWFfc2V0X21hc2spOwogCit1NjQgZG1hX2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJaWYgKHBwY19tZC5kbWFfZ2V0X3JlcXVpcmVkX21hc2spCisJCXJldHVybiBwcGNfbWQuZG1hX2dldF9yZXF1aXJlZF9tYXNrKGRldik7CisKKwlpZiAodW5saWtlbHkoZG1hX29wcyA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG1hX29wcy0+Z2V0X3JlcXVpcmVkX21hc2spCisJCXJldHVybiBkbWFfb3BzLT5nZXRfcmVxdWlyZWRfbWFzayhkZXYpOworCisJcmV0dXJuIERNQV9CSVRfTUFTSyg4ICogc2l6ZW9mKGRtYV9hZGRyX3QpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtYV9nZXRfcmVxdWlyZWRfbWFzayk7CisKIHN0YXRpYyBpbnQgX19pbml0IGRtYV9pbml0KHZvaWQpCiB7CiAgICAgICAgZG1hX2RlYnVnX2luaXQoUFJFQUxMT0NfRE1BX0RFQlVHX0VOVFJJRVMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IDQxYjAyYzcuLmNmOWM2OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NCRV9SQVMKIAlTVERfRVhDRVBUSU9OX0hWKDB4MTIwMCwgMHgxMjAyLCBjYmVfc3lzdGVtX2Vycm9yKQotCUtWTV9IQU5ETEVSX1BSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDEyMDIpCisJS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4MTIwMikKICNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwogCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4MTMwMCwgMHgxMzAwLCBpbnN0cnVjdGlvbl9icmVha3BvaW50KQpAQCAtMjc1LDcgKzI3NSw3IEBACiAKICNpZmRlZiBDT05GSUdfQ0JFX1JBUwogCVNURF9FWENFUFRJT05fSFYoMHgxNjAwLCAweDE2MDIsIGNiZV9tYWludGVuYW5jZSkKLQlLVk1fSEFORExFUl9QUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxNjAyKQorCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDE2MDIpCiAjZW5kaWYgLyogQ09ORklHX0NCRV9SQVMgKi8KIAogCVNURF9FWENFUFRJT05fUFNFUklFUygweDE3MDAsIDB4MTcwMCwgYWx0aXZlY19hc3Npc3QpCkBAIC0yODMsNyArMjgzLDcgQEAKIAogI2lmZGVmIENPTkZJR19DQkVfUkFTCiAJU1REX0VYQ0VQVElPTl9IVigweDE4MDAsIDB4MTgwMiwgY2JlX3RoZXJtYWwpCi0JS1ZNX0hBTkRMRVJfUFJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4MTgwMikKKwlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxODAyKQogI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCiAKIAkuID0gMHgzMDAwCkBAIC00MjcsMTYgKzQyNyw2IEBACiAJYgkuCQkJCS8qIHByZXZlbnQgc3BlYy4gZXhlY3V0aW9uICovCiAjZW5kaWYgLyogX19ESVNBQkxFRF9fICovCiAKLS8qIEtWTSdzIHRyYW1wb2xpbmUgY29kZSBuZWVkcyB0byBiZSBjbG9zZSB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXJzICovCi0KLSNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCi0jaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfUFIKLSNpbmNsdWRlICIuLi9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUyIKLSNlbHNlCi0jaW5jbHVkZSAiLi4va3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMiCi0jZW5kaWYKLSNlbmRpZgotCiAJLmFsaWduCTcKIAkuZ2xvYmwJX19lbmRfaW50ZXJydXB0cwogX19lbmRfaW50ZXJydXB0czoKQEAgLTExNDMsNyArMTEzMyw3IEBACiAJcmZpZAogCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQogLyoKICAqIERhdGEgYXJlYSByZXNlcnZlZCBmb3IgRldOTUkgb3B0aW9uLgogICogVGhpcyBhZGRyZXNzICgweDcwMDApIGlzIGZpeGVkIGJ5IHRoZSBSUEEuCkBAIC0xMTUxLDcgKzExNDEsNyBAQAogCS49IDB4NzAwMAogCS5nbG9ibCBmd25taV9kYXRhX2FyZWEKIGZ3bm1pX2RhdGFfYXJlYToKLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BPV0VSTlYpICovCiAKIAkvKiBpU2VyaWVzIGRvZXMgbm90IHVzZSB0aGUgRldOTUkgc3R1ZmYsIHNvIGl0IGlzIHNhZmUgdG8gcHV0CiAJICogdGhpcyBoZXJlLCBldmVuIGlmIHdlIGxhdGVyIGFsbG93IGtlcm5lbHMgdGhhdCB3aWxsIGJvb3Qgb24KQEAgLTExNzYsOSArMTE2NiwxMiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCiAKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfUFNFUklFUykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BPV0VSTlYpCisJLyogcHNlcmllcyBhbmQgcG93ZXJudiBuZWVkIHRvIGtlZXAgdGhlIHdob2xlIHBhZ2UgZnJvbQorCSAqIDB4NzAwMCB0byAweDgwMDAgZnJlZSBmb3IgdXNlIGJ5IHRoZSBmaXJtd2FyZQorCSAqLwogICAgICAgICAuID0gMHg4MDAwCi0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKSAqLwogCiAvKgogICogU3BhY2UgZm9yIENQVTAncyBzZWdtZW50IHRhYmxlLgpAQCAtMTE5MywzICsxMTg2LDE5IEBACiAJLmdsb2JsIGluaXRpYWxfc3RhYgogaW5pdGlhbF9zdGFiOgogCS5zcGFjZQk0MDk2CisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCitfR0xPQkFMKG9wYWxfbWNfc2Vjb25kYXJ5X2hhbmRsZXIpCisJSE1UX01FRElVTQorCVNFVF9TQ1JBVENIMChyMTMpCisJR0VUX1BBQ0EocjEzKQorCWNscmxkaQlyMyxyMywyCisJdG92aXJ0KHIzLHIzKQorCXN0ZAlyMyxQQUNBX09QQUxfTUNfRVZUKHIxMykKKwlsZAlyMTMsT1BBTF9NQ19TUlIwKHIzKQorCW10c3ByCVNQUk5fU1JSMCxyMTMKKwlsZAlyMTMsT1BBTF9NQ19TUlIxKHIzKQorCW10c3ByCVNQUk5fU1JSMSxyMTMKKwlsZAlyMyxPUEFMX01DX0dQUjMocjMpCisJR0VUX1NDUkFUQ0gwKHIxMykKKwliCW1hY2hpbmVfY2hlY2tfcFNlcmllcworI2VuZGlmIC8qIENPTkZJR19QUENfUE9XRVJOViAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9maXJtd2FyZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9maXJtd2FyZS5jCmluZGV4IDZiMWY0MjcuLjJlYWU0NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZmlybXdhcmUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Zpcm13YXJlLmMKQEAgLTEzLDcgKzEzLDggQEAKICAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggYmEyNTBkNS4uMDY1NGRiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTEzOSw4ICsxMzksNyBAQAogCXRyYXAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAotMToJbXIJcjMxLHIzCQkJLyogc2F2ZSBwYXJhbWV0ZXJzICovCi0JbXIJcjMwLHI0CisxOgltcglyMzEscjMJCQkvKiBzYXZlIGRldmljZSB0cmVlIHB0ciAqLwogCWxpCXIyNCwwCQkJLyogY3B1ICMgKi8KIAogLyoKQEAgLTk2NCw4ICs5NjMsOCBAQAogICogRG8gZWFybHkgcGxhdGZvcm0tc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24sCiAgKiBhbmQgc2V0IHVwIHRoZSBNTVUuCiAgKi8KLQltcglyMyxyMzEKLQltcglyNCxyMzAKKwlsaQlyMywwCisJbXIJcjQscjMxCiAJYmwJbWFjaGluZV9pbml0CiAJYmwJX19zYXZlX2NwdV9zZXR1cAogCWJsCU1NVV9pbml0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMKaW5kZXggYTkxNjI2ZC4uODcyYTZhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQweC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUwpAQCAtNTgsMTMgKzU4LDcgQEAKIF9FTlRSWShfc3RleHQpOwogX0VOVFJZKF9zdGFydCk7CiAKLQkvKiBTYXZlIHBhcmFtZXRlcnMgd2UgYXJlIHBhc3NlZC4KLQkqLwotCW1yCXIzMSxyMwotCW1yCXIzMCxyNAotCW1yCXIyOSxyNQotCW1yCXIyOCxyNgotCW1yCXIyNyxyNworCW1yCXIzMSxyMwkJCS8qIHNhdmUgZGV2aWNlIHRyZWUgcHRyICovCiAKIAkvKiBXZSBoYXZlIHRvIHR1cm4gb24gdGhlIE1NVSByaWdodCBhd2F5IHNvIHdlIGdldCBjYWNoZSBtb2RlcwogCSAqIHNldCBjb3JyZWN0bHkuCkBAIC04NDksMTEgKzg0Myw4IEBACiAvKgogICogRGVjaWRlIHdoYXQgc29ydCBvZiBtYWNoaW5lIHRoaXMgaXMgYW5kIGluaXRpYWxpemUgdGhlIE1NVS4KICAqLwotCW1yCXIzLHIzMQotCW1yCXI0LHIzMAotCW1yCXI1LHIyOQotCW1yCXI2LHIyOAotCW1yCXI3LHIyNworCWxpCXIzLDAKKwltcglyNCxyMzEKIAlibAltYWNoaW5lX2luaXQKIAlibAlNTVVfaW5pdAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKaW5kZXggZjhlOTcxYi4uYjcyNWRhYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUwpAQCAtNjEsMTQgKzYxLDcgQEAKIAkgKiBvZiBhYmF0cm9uX3B0ZXB0cnMKIAkgKi8KIAlub3AKLS8qCi0gKiBTYXZlIHBhcmFtZXRlcnMgd2UgYXJlIHBhc3NlZAotICovCi0JbXIJcjMxLHIzCi0JbXIJcjMwLHI0Ci0JbXIJcjI5LHI1Ci0JbXIJcjI4LHI2Ci0JbXIJcjI3LHI3CisJbXIJcjMxLHIzCQkvKiBzYXZlIGRldmljZSB0cmVlIHB0ciAqLwogCWxpCXIyNCwwCQkvKiBDUFUgbnVtYmVyICovCiAKIAlibAlpbml0X2NwdV9zdGF0ZQpAQCAtMTIwLDExICsxMTMsOCBAQAogLyoKICAqIERlY2lkZSB3aGF0IHNvcnQgb2YgbWFjaGluZSB0aGlzIGlzIGFuZCBpbml0aWFsaXplIHRoZSBNTVUuCiAgKi8KLQltcglyMyxyMzEKLQltcglyNCxyMzAKLQltcglyNSxyMjkKLQltcglyNixyMjgKLQltcglyNyxyMjcKKwlsaQlyMywwCisJbXIJcjQscjMxCiAJYmwJbWFjaGluZV9pbml0CiAJYmwJTU1VX2luaXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwppbmRleCAzNTY0YzQ5Li4wNmM3MjUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwpAQCAtNTEsNiArNTEsMTEgQEAKICAqICBGb3IgcFNlcmllcyBvciBzZXJ2ZXIgcHJvY2Vzc29yczoKICAqICAgMS4gVGhlIE1NVSBpcyBvZmYgJiBvcGVuIGZpcm13YXJlIGlzIHJ1bm5pbmcgaW4gcmVhbCBtb2RlLgogICogICAyLiBUaGUga2VybmVsIGlzIGVudGVyZWQgYXQgX19zdGFydAorICogLW9yLSBGb3IgT1BBTCBlbnRyeToKKyAqICAgMS4gVGhlIE1NVSBpcyBvZmYsIHByb2Nlc3NvciBpbiBIViBtb2RlLCBwcmltYXJ5IENQVSBlbnRlcnMgYXQgMAorICogICAgICB3aXRoIGRldmljZS10cmVlIGluIGdwcjMuIFdlIGFsc28gZ2V0IE9QQUwgYmFzZSBpbiByOCBhbmQKKyAqCWVudHJ5IGluIHI5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqICAgMi4gU2Vjb25kYXJ5IHByb2Nlc3NvcnMgZW50ZXIgYXQgMHg2MCB3aXRoIFBJUiBpbiBncHIzCiAgKgogICogIEZvciBpU2VyaWVzOgogICogICAxLiBUaGUgTU1VIGlzIG9uIChhcyBpdCBhbHdheXMgaXMgZm9yIGlTZXJpZXMpCkBAIC0zMzEsNiArMzM2LDExIEBACiAJLyogU2F2ZSBwYXJhbWV0ZXJzICovCiAJbXIJcjMxLHIzCiAJbXIJcjMwLHI0CisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMCisJLyogU2F2ZSBPUEFMIGVudHJ5ICovCisJbXIJcjI4LHI4CisJbXIJcjI5LHI5CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfQk9PSzNFCiAJYmwJLnN0YXJ0X2luaXRpYWxpemF0aW9uX2Jvb2szZQpAQCAtNjc0LDkgKzY4NCw5IEBACiBfR0xPQkFMKHJlbGF0aXZlX3RvYykKIAltZmxyCXIwCiAJYmNsCTIwLDMxLCQrNAotMDoJbWZscglyOQotCWxkCXIyLChwX3RvYyAtIDBiKShyOSkKLQlhZGQJcjIscjIscjkKKzA6CW1mbHIJcjExCisJbGQJcjIsKHBfdG9jIC0gMGIpKHIxMSkKKwlhZGQJcjIscjIscjExCiAJbXRscglyMAogCWJscgogCkBAIC03MDcsNiArNzE3LDEyIEBACiAJYmRuegkzYgogNDoKIAorI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTAorCS8qIFNldHVwIE9QQUwgZW50cnkgKi8KKwlzdGQJcjI4LDAocjExKTsKKwlzdGQJcjI5LDgocjExKTsKKyNlbmRpZgorCiAjaWZuZGVmIENPTkZJR19QUENfQk9PSzNFCiAJbWZtc3IJcjYKIAlvcmkJcjYscjYsTVNSX1JJCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKaW5kZXggMWNiZjY0ZS4uYjY4Y2IxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtNzYsMTEgKzc2LDcgQEAKICAqLwogCS5nbG9ibAlfX3N0YXJ0CiBfX3N0YXJ0OgotCW1yCXIzMSxyMwkJCS8qIHNhdmUgcGFyYW1ldGVycyAqLwotCW1yCXIzMCxyNAotCW1yCXIyOSxyNQotCW1yCXIyOCxyNgotCW1yCXIyNyxyNworCW1yCXIzMSxyMwkJCS8qIHNhdmUgZGV2aWNlIHRyZWUgcHRyICovCiAKIAkvKiBXZSBoYXZlIHRvIHR1cm4gb24gdGhlIE1NVSByaWdodCBhd2F5IHNvIHdlIGdldCBjYWNoZSBtb2RlcwogCSAqIHNldCBjb3JyZWN0bHkuCkBAIC03MjMsMTEgKzcxOSw4IEBACiAvKgogICogRGVjaWRlIHdoYXQgc29ydCBvZiBtYWNoaW5lIHRoaXMgaXMgYW5kIGluaXRpYWxpemUgdGhlIE1NVS4KICAqLwotCW1yCXIzLHIzMQotCW1yCXI0LHIzMAotCW1yCXI1LHIyOQotCW1yCXI2LHIyOAotCW1yCXI3LHIyNworCWxpCXIzLDAKKwltcglyNCxyMzEKIAlibAltYWNoaW5lX2luaXQKIAlibAlNTVVfaW5pdAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKaW5kZXggNTA4NDU5Mi4uOWY1ZDIxMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtNjMsMTcgKzYzLDMwIEBACiAJICogb2YgYWJhdHJvbl9wdGVwdHJzCiAJICovCiAJbm9wCi0vKgotICogU2F2ZSBwYXJhbWV0ZXJzIHdlIGFyZSBwYXNzZWQKLSAqLwotCW1yCXIzMSxyMwotCW1yCXIzMCxyNAotCW1yCXIyOSxyNQotCW1yCXIyOCxyNgotCW1yCXIyNyxyNwotCWxpCXIyNSwwCQkvKiBwaHlzIGtlcm5lbCBzdGFydCAobG93KSAqLwotCWxpCXIyNCwwCQkvKiBDUFUgbnVtYmVyICovCi0JbGkJcjIzLDAJCS8qIHBoeXMga2VybmVsIHN0YXJ0IChoaWdoKSAqLworCisJLyogVHJhbnNsYXRlIGRldmljZSB0cmVlIGFkZHJlc3MgdG8gcGh5c2ljYWwsIHNhdmUgaW4gcjMwL3IzMSAqLworCW1mbXNyCXIxNgorCW1mc3ByCXIxNyxTUFJOX1BJRAorCXJsd2lubQlyMTcscjE3LDE2LDB4M2ZmZjAwMDAJLyogdHVybiBQSUQgaW50byBNQVM2W1NQSURdICovCisJcmx3aW1pCXIxNyxyMTYsMjgsMHgwMDAwMDAwMQkvKiB0dXJuIE1TUltEU10gaW50byBNQVM2W1NBU10gKi8KKwltdHNwcglTUFJOX01BUzYscjE3CisKKwl0bGJzeAkwLHIzCQkJLyogbXVzdCBzdWNjZWVkICovCisKKwltZnNwcglyMTYsU1BSTl9NQVMxCisJbWZzcHIJcjIwLFNQUk5fTUFTMworCXJsd2lubQlyMTcscjE2LDI1LDB4MWYJCS8qIHIxNyA9IGxvZzIocGFnZSBzaXplKSAqLworCWxpCXIxOCwxMDI0CisJc2x3CXIxOCxyMTgscjE3CQkvKiByMTggPSBwYWdlIHNpemUgKi8KKwlhZGRpCXIxOCxyMTgsLTEKKwlhbmQJcjE5LHIzLHIxOAkJLyogcjE5ID0gcGFnZSBvZmZzZXQgKi8KKwlhbmRjCXIzMSxyMjAscjE4CQkvKiByMzEgPSBwYWdlIGJhc2UgKi8KKwlvcglyMzEscjMxLHIxOQkJLyogcjMxID0gZGV2dHJlZSBwaHlzIGFkZHIgKi8KKwltZnNwcglyMzAsU1BSTl9NQVM3CisKKwlsaQlyMjUsMAkJCS8qIHBoeXMga2VybmVsIHN0YXJ0IChsb3cpICovCisJbGkJcjI0LDAJCQkvKiBDUFUgbnVtYmVyICovCisJbGkJcjIzLDAJCQkvKiBwaHlzIGtlcm5lbCBzdGFydCAoaGlnaCkgKi8KIAogLyogV2UgdHJ5IHRvIG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCBob3cgdGhlIGJvb3QgbG9hZGVyCiAgKiBzZXR1cCBvciB1c2VkIHRoZSBUTEJzLiAgV2UgaW52YWxpZGF0ZSBhbGwgbWFwcGluZ3MgZnJvbSB0aGUKQEAgLTE5OCwxMSArMjExLDggQEAKIC8qCiAgKiBEZWNpZGUgd2hhdCBzb3J0IG9mIG1hY2hpbmUgdGhpcyBpcyBhbmQgaW5pdGlhbGl6ZSB0aGUgTU1VLgogICovCi0JbXIJcjMscjMxCi0JbXIJcjQscjMwCi0JbXIJcjUscjI5Ci0JbXIJcjYscjI4Ci0JbXIJcjcscjI3CisJbXIJcjMscjMwCisJbXIJcjQscjMxCiAJYmwJbWFjaGluZV9pbml0CiAJYmwJTU1VX2luaXQKIApAQCAtMjM2LDggKzI0NiwyNCBAQAogICogaWYgd2UgZmluZCB0aGUgcHRlIChmYWxsIHRocm91Z2gpOgogICogICByMTEgaXMgbG93IHB0ZSB3b3JkCiAgKiAgIHIxMiBpcyBwb2ludGVyIHRvIHRoZSBwdGUKKyAqICAgcjEwIGlzIHRoZSBwc2hpZnQgZnJvbSB0aGUgUEdELCBpZiB3ZSdyZSBhIGh1Z2VwYWdlCiAgKi8KICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorI2RlZmluZSBGSU5EX1BURQlcCisJcmx3aW5tCXIxMiwgcjEwLCAxMywgMTksIDI5OwkvKiBDb21wdXRlIHBnZGlyL3BtZCBvZmZzZXQgKi8JXAorCWx3engJcjExLCByMTIsIHIxMTsJCS8qIEdldCBwZ2QvcG1kIGVudHJ5ICovCQlcCisJcmx3aW5tLglyMTIsIHIxMSwgMCwgMCwgMjA7CS8qIEV4dHJhY3QgcHQgYmFzZSBhZGRyZXNzICovCVwKKwlibHQJMTAwMGY7CQkJLyogTm9ybWFsIG5vbi1odWdlIHBhZ2UgKi8JXAorCWJlcQkyZjsJCQkvKiBCYWlsIGlmIG5vIHRhYmxlICovCQlcCisJb3JpcwlyMTEsIHIxMSwgUERfSFVHRUBoOwkvKiBQdXQgYmFjayBhZGRyZXNzIGJpdCAqLwlcCisJYW5kaS4JcjEwLCByMTEsIEhVR0VQRF9TSElGVF9NQVNLQGw7IC8qIGV4dHJhY3Qgc2l6ZSBmaWVsZCAqLwlcCisJeG9yCXIxMiwgcjEwLCByMTE7CQkvKiBkcm9wIHNpemUgYml0cyBmcm9tIHBvaW50ZXIgKi8gXAorCWIJMTAwMWY7CQkJCQkJCVwKKzEwMDA6CXJsd2ltaQlyMTIsIHIxMCwgMjMsIDIwLCAyODsJLyogQ29tcHV0ZSBwdGUgYWRkcmVzcyAqLwlcCisJbGkJcjEwLCAwOwkJCS8qIGNsZWFyIHIxMCAqLwkJCVwKKzEwMDE6CWx3eglyMTEsIDQocjEyKTsJCS8qIEdldCBwdGUgZW50cnkgKi8KKyNlbHNlCiAjZGVmaW5lIEZJTkRfUFRFCVwKIAlybHdpbm0JcjEyLCByMTAsIDEzLCAxOSwgMjk7CS8qIENvbXB1dGUgcGdkaXIvcG1kIG9mZnNldCAqLwlcCiAJbHd6eAlyMTEsIHIxMiwgcjExOwkJLyogR2V0IHBnZC9wbWQgZW50cnkgKi8JCVwKQEAgLTI0NSw3ICsyNzEsOCBAQAogCWJlcQkyZjsJCQkvKiBCYWlsIGlmIG5vIHRhYmxlICovCQlcCiAJcmx3aW1pCXIxMiwgcjEwLCAyMywgMjAsIDI4OwkvKiBDb21wdXRlIHB0ZSBhZGRyZXNzICovCVwKIAlsd3oJcjExLCA0KHIxMik7CQkvKiBHZXQgcHRlIGVudHJ5ICovCi0jZWxzZQorI2VuZGlmIC8qIEhVR0VQQUdFICovCisjZWxzZSAvKiAhUFRFXzY0QklUICovCiAjZGVmaW5lIEZJTkRfUFRFCVwKIAlybHdpbWkJcjExLCByMTAsIDEyLCAyMCwgMjk7CS8qIENyZWF0ZSBMMSAocGdkaXIvcG1kKSBhZGRyZXNzICovCVwKIAlsd3oJcjExLCAwKHIxMSk7CQkvKiBHZXQgTDEgZW50cnkgKi8JCQlcCkBAIC00MDIsOCArNDI5LDggQEAKIAogI2lmZGVmIENPTkZJR19QVEVfNjRCSVQKICNpZmRlZiBDT05GSUdfU01QCi0Jc3ViZglyMTAscjExLHIxMgkJLyogY3JlYXRlIGZhbHNlIGRhdGEgZGVwICovCi0JbHd6eAlyMTMscjExLHIxMAkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCisJc3ViZglyMTMscjExLHIxMgkJLyogY3JlYXRlIGZhbHNlIGRhdGEgZGVwICovCisJbHd6eAlyMTMscjExLHIxMwkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCiAjZWxzZQogCWx3eglyMTMsMChyMTIpCQkvKiBHZXQgdXBwZXIgcHRlIGJpdHMgKi8KICNlbmRpZgpAQCAtNDgzLDggKzUxMCw4IEBACiAKICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCiAjaWZkZWYgQ09ORklHX1NNUAotCXN1YmYJcjEwLHIxMSxyMTIJCS8qIGNyZWF0ZSBmYWxzZSBkYXRhIGRlcCAqLwotCWx3engJcjEzLHIxMSxyMTAJCS8qIEdldCB1cHBlciBwdGUgYml0cyAqLworCXN1YmYJcjEzLHIxMSxyMTIJCS8qIGNyZWF0ZSBmYWxzZSBkYXRhIGRlcCAqLworCWx3engJcjEzLHIxMSxyMTMJCS8qIEdldCB1cHBlciBwdGUgYml0cyAqLwogI2Vsc2UKIAlsd3oJcjEzLDAocjEyKQkJLyogR2V0IHVwcGVyIHB0ZSBiaXRzICovCiAjZW5kaWYKQEAgLTU0OCw3ICs1NzUsNyBAQAogLyoKICAqIEJvdGggdGhlIGluc3RydWN0aW9uIGFuZCBkYXRhIFRMQiBtaXNzIGdldCB0byB0aGlzCiAgKiBwb2ludCB0byBsb2FkIHRoZSBUTEIuCi0gKglyMTAgLSBhdmFpbGFibGUgdG8gdXNlCisgKglyMTAgLSB0c2l6ZSBlbmNvZGluZyAoaWYgSFVHRVRMQl9QQUdFKSBvciBhdmFpbGFibGUgdG8gdXNlCiAgKglyMTEgLSBUTEIgKGluZm8gZnJvbSBMaW51eCBQVEUpCiAgKglyMTIgLSBhdmFpbGFibGUgdG8gdXNlCiAgKglyMTMgLSB1cHBlciBiaXRzIG9mIFBURSAoaWYgUFRFXzY0QklUKSBvciBhdmFpbGFibGUgdG8gdXNlCkBAIC01NTgsMjEgKzU4NSw3MyBAQAogICoJVXBvbiBleGl0LCB3ZSByZWxvYWQgZXZlcnl0aGluZyBhbmQgUkZJLgogICovCiBmaW5pc2hfdGxiX2xvYWQ6CisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorCWNtcHdpCTYsIHIxMCwgMAkJCS8qIGNoZWNrIGZvciBodWdlIHBhZ2UgKi8KKwliZXEJNiwgZmluaXNoX3RsYl9sb2FkX2NvbnQgICAgCS8qICFodWdlICovCisKKwkvKiBBbGFzLCB3ZSBuZWVkIG1vcmUgc2NyYXRjaCByZWdpc3RlcnMgZm9yIGh1Z2VwYWdlcyAqLworCW1mc3ByCXIxMiwgU1BSTl9TUFJHX1RIUkVBRAorCXN0dwlyMTQsIFRIUkVBRF9OT1JNU0FWRSg0KShyMTIpCisJc3R3CXIxNSwgVEhSRUFEX05PUk1TQVZFKDUpKHIxMikKKwlzdHcJcjE2LCBUSFJFQURfTk9STVNBVkUoNikocjEyKQorCXN0dwlyMTcsIFRIUkVBRF9OT1JNU0FWRSg3KShyMTIpCisKKwkvKiBHZXQgdGhlIG5leHRfdGxiY2FtX2lkeCBwZXJjcHUgdmFyICovCisjaWZkZWYgQ09ORklHX1NNUAorCWx3eglyMTIsIFRIUkVBRF9JTkZPLVRIUkVBRChyMTIpCisJbHd6CXIxNSwgVElfQ1BVKHIxMikKKwlsaXMgICAgIHIxNCwgX19wZXJfY3B1X29mZnNldEBoCisJb3JpICAgICByMTQsIHIxNCwgX19wZXJfY3B1X29mZnNldEBsCisJcmx3aW5tICByMTUsIHIxNSwgMiwgMCwgMjkKKwlsd3p4ICAgIHIxNiwgcjE0LCByMTUKKyNlbHNlCisJbGkJcjE2LCAwCisjZW5kaWYKKwlsaXMgICAgIHIxNywgbmV4dF90bGJjYW1faWR4QGgKKwlvcmkJcjE3LCByMTcsIG5leHRfdGxiY2FtX2lkeEBsCisJYWRkCXIxNywgcjE3LCByMTYJCQkvKiByMTcgPSAqbmV4dF90bGJjYW1faWR4ICovCisJbHd6ICAgICByMTUsIDAocjE3KQkJCS8qIHIxNSA9IG5leHRfdGxiY2FtX2lkeCAqLworCisJbGlzCXIxNCwgTUFTMF9UTEJTRUwoMSlAaAkJLyogc2VsZWN0IFRMQjEgKFRMQkNBTSkgKi8KKwlybHdpbWkJcjE0LCByMTUsIDE2LCA0LCAxNQkJLyogbmV4dF90bGJjYW1faWR4IGVudHJ5ICovCisJbXRzcHIJU1BSTl9NQVMwLCByMTQKKworCS8qIEV4dHJhY3QgVExCMUNGRyhORU5UUlkpICovCisJbWZzcHIJcjE2LCBTUFJOX1RMQjFDRkcKKwlhbmRpLglyMTYsIHIxNiwgMHhmZmYKKworCS8qIFVwZGF0ZSBuZXh0X3RsYmNhbV9pZHgsIHdyYXBwaW5nIHdoZW4gbmVjZXNzYXJ5ICovCisJYWRkaQlyMTUsIHIxNSwgMQorCWNtcHcJcjE1LCByMTYKKwlibHQgCTEwMGYKKwlsaXMJcjE0LCB0bGJjYW1faW5kZXhAaAorCW9yaQlyMTQsIHIxNCwgdGxiY2FtX2luZGV4QGwKKwlsd3oJcjE1LCAwKHIxNCkKKzEwMDoJc3R3CXIxNSwgMChyMTcpCisKKwkvKgorCSAqIENhbGMgTUFTMV9UU0laRSBmcm9tIHIxMCAod2hpY2ggaGFzIHBzaGlmdCBlbmNvZGVkKQorCSAqIHRsYl9lbmMgPSAocHNoaWZ0IC0gMTApLgorCSAqLworCXN1YmkJcjE1LCByMTAsIDEwCisJbWZzcHIJcjE2LCBTUFJOX01BUzEKKwlybHdpbWkJcjE2LCByMTUsIDcsIDIwLCAyNAorCW10c3ByCVNQUk5fTUFTMSwgcjE2CisKKwkvKiBjb3B5IHRoZSBwc2hpZnQgZm9yIHVzZSBsYXRlciAqLworCW1yCXIxNCwgcjEwCisKKwkvKiBmYWxsIHRocm91Z2ggKi8KKworI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKwogCS8qCiAJICogV2Ugc2V0IGV4ZWN1dGUsIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZ3JhbnVsYXJpdHkgdG8KIAkgKiBwcm9wZXJseSBzZXQgdGhpcyBhdCB0aGUgcGFnZSBsZXZlbCAoTGludXggcHJvYmxlbSkuCiAJICogTWFueSBvZiB0aGVzZSBiaXRzIGFyZSBzb2Z0d2FyZSBvbmx5LiAgQml0cyB3ZSBkb24ndCBzZXQKIAkgKiBoZXJlIHdlIChwcm9wZXJseSBzaG91bGQpIGFzc3VtZSBoYXZlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4KIAkgKi8KLQotCW1mc3ByCXIxMiwgU1BSTl9NQVMyCi0jaWZkZWYgQ09ORklHX1BURV82NEJJVAotCXJsd2ltaQlyMTIsIHIxMSwgMzItMTksIDI3LCAzMQkvKiBleHRyYWN0IFdJTUdFIGZyb20gcHRlICovCi0jZWxzZQotCXJsd2ltaQlyMTIsIHIxMSwgMjYsIDI3LCAzMQkvKiBleHRyYWN0IFdJTUdFIGZyb20gcHRlICovCi0jZW5kaWYKLQltdHNwcglTUFJOX01BUzIsIHIxMgotCitmaW5pc2hfdGxiX2xvYWRfY29udDoKICNpZmRlZiBDT05GSUdfUFRFXzY0QklUCiAJcmx3aW5tCXIxMiwgcjExLCAzMi0yLCAyNiwgMzEJLyogTW92ZSBpbiBwZXJtIGJpdHMgKi8KIAlhbmRpLglyMTAsIHIxMSwgX1BBR0VfRElSVFkKQEAgLTU4MSwyMiArNjYwLDQwIEBACiAJYW5kYwlyMTIsIHIxMiwgcjEwCiAxOglybHdpbWkJcjEyLCByMTMsIDIwLCAwLCAxMQkvKiBncmFiIFJQTlszMjo0M10gKi8KIAlybHdpbWkJcjEyLCByMTEsIDIwLCAxMiwgMTkJLyogZ3JhYiBSUE5bNDQ6NTFdICovCi0JbXRzcHIJU1BSTl9NQVMzLCByMTIKKzI6CW10c3ByCVNQUk5fTUFTMywgcjEyCiBCRUdJTl9NTVVfRlRSX1NFQ1RJT04KIAlzcndpCXIxMCwgcjEzLCAxMgkJLyogZ3JhYiBSUE5bMTI6MzFdICovCiAJbXRzcHIJU1BSTl9NQVM3LCByMTAKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZTRVQoTU1VX0ZUUl9CSUdfUEhZUykKICNlbHNlCiAJbGkJcjEwLCAoX1BBR0VfRVhFQyB8IF9QQUdFX1BSRVNFTlQpCisJbXIJcjEzLCByMTEKIAlybHdpbWkJcjEwLCByMTEsIDMxLCAyOSwgMjkJLyogZXh0cmFjdCBfUEFHRV9ESVJUWSBpbnRvIFNXICovCiAJYW5kCXIxMiwgcjExLCByMTAKIAlhbmRpLglyMTAsIHIxMSwgX1BBR0VfVVNFUgkvKiBUZXN0IGZvciBfUEFHRV9VU0VSICovCiAJc2x3aQlyMTAsIHIxMiwgMQogCW9yCXIxMCwgcjEwLCByMTIKIAlpc2VsZXEJcjEyLCByMTIsIHIxMAotCXJsd2ltaQlyMTEsIHIxMiwgMCwgMjAsIDMxCS8qIEV4dHJhY3QgUlBOIGZyb20gUFRFIGFuZCBtZXJnZSB3aXRoIHBlcm1zICovCi0JbXRzcHIJU1BSTl9NQVMzLCByMTEKKwlybHdpbWkJcjEzLCByMTIsIDAsIDIwLCAzMQkvKiBHZXQgUlBOIGZyb20gUFRFLCBtZXJnZSB3LyBwZXJtcyAqLworCW10c3ByCVNQUk5fTUFTMywgcjEzCiAjZW5kaWYKKworCW1mc3ByCXIxMiwgU1BSTl9NQVMyCisjaWZkZWYgQ09ORklHX1BURV82NEJJVAorCXJsd2ltaQlyMTIsIHIxMSwgMzItMTksIDI3LCAzMQkvKiBleHRyYWN0IFdJTUdFIGZyb20gcHRlICovCisjZWxzZQorCXJsd2ltaQlyMTIsIHIxMSwgMjYsIDI3LCAzMQkvKiBleHRyYWN0IFdJTUdFIGZyb20gcHRlICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisJYmVxCTYsIDNmCQkJLyogZG9uJ3QgbWFzayBpZiBwYWdlIGlzbid0IGh1Z2UgKi8KKwlsaQlyMTMsIDEKKwlzbHcJcjEzLCByMTMsIHIxNAorCXN1YmkJcjEzLCByMTMsIDEKKwlybHdpbm0JcjEzLCByMTMsIDAsIDAsIDE5CS8qIGJvdHRvbSBiaXRzIHVzZWQgZm9yIFdJTUdFL2V0YyAqLworCWFuZGMJcjEyLCByMTIsIHIxMwkJLyogbWFzayBvZmYgZWEgYml0cyB3aXRoaW4gdGhlIHBhZ2UgKi8KKyNlbmRpZgorMzoJbXRzcHIJU1BSTl9NQVMyLCByMTIKKwogI2lmZGVmIENPTkZJR19FMjAwCiAJLyogUm91bmQgcm9iaW4gVExCMSBlbnRyaWVzIGFzc2lnbm1lbnQgKi8KIAltZnNwcglyMTIsIFNQUk5fTUFTMApAQCAtNjIyLDExICs3MTksMTkgQEAKIAltdHNwcglTUFJOX01BUzAscjEyCiAjZW5kaWYgLyogQ09ORklHX0UyMDAgKi8KIAordGxiX3dyaXRlX2VudHJ5OgogCXRsYndlCiAKIAkvKiBEb25lLi4ucmVzdG9yZSByZWdpc3RlcnMgYW5kIGdldCBvdXQgb2YgaGVyZS4gICovCiAJbWZzcHIJcjEwLCBTUFJOX1NQUkdfVEhSRUFECi0JbHd6CXIxMSwgVEhSRUFEX05PUk1TQVZFKDMpKHIxMCkKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisJYmVxCTYsIDhmIC8qIHNraXAgcmVzdG9yZSBmb3IgNGsgcGFnZSBmYXVsdHMgKi8KKwlsd3oJcjE0LCBUSFJFQURfTk9STVNBVkUoNCkocjEwKQorCWx3eglyMTUsIFRIUkVBRF9OT1JNU0FWRSg1KShyMTApCisJbHd6CXIxNiwgVEhSRUFEX05PUk1TQVZFKDYpKHIxMCkKKwlsd3oJcjE3LCBUSFJFQURfTk9STVNBVkUoNykocjEwKQorI2VuZGlmCis4Oglsd3oJcjExLCBUSFJFQURfTk9STVNBVkUoMykocjEwKQogCW10Y3IJcjExCiAJbHd6CXIxMywgVEhSRUFEX05PUk1TQVZFKDIpKHIxMCkKIAlsd3oJcjEyLCBUSFJFQURfTk9STVNBVkUoMSkocjEwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCA1ZWNkMDQwLi4yYmMwNTg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMKaW5kZXggMjg1ODFmMS4uZDM5YWU2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMKQEAgLTM3LDEyICszNywxNCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9pYm1lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CkBAIC0xMjUsMTcgKzEyNywyMyBAQAogCiBzdGF0aWMgaW50IGlibWVidXNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQogewotCXJldHVybiAxOworCXJldHVybiBtYXNrID09IERNQV9CSVRfTUFTSyg2NCk7Cit9CisKK3N0YXRpYyB1NjQgaWJtZWJ1c19kbWFfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBETUFfQklUX01BU0soNjQpOwogfQogCiBzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzIGlibWVidXNfZG1hX29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSBpYm1lYnVzX2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50ICA9IGlibWVidXNfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NnICAgICAgICAgPSBpYm1lYnVzX21hcF9zZywKLQkudW5tYXBfc2cgICAgICAgPSBpYm1lYnVzX3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkICA9IGlibWVidXNfZG1hX3N1cHBvcnRlZCwKLQkubWFwX3BhZ2UgICAgICAgPSBpYm1lYnVzX21hcF9wYWdlLAotCS51bm1hcF9wYWdlICAgICA9IGlibWVidXNfdW5tYXBfcGFnZSwKKwkuYWxsb2NfY29oZXJlbnQgICAgID0gaWJtZWJ1c19hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCAgICAgID0gaWJtZWJ1c19mcmVlX2NvaGVyZW50LAorCS5tYXBfc2cgICAgICAgICAgICAgPSBpYm1lYnVzX21hcF9zZywKKwkudW5tYXBfc2cgICAgICAgICAgID0gaWJtZWJ1c191bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZCAgICAgID0gaWJtZWJ1c19kbWFfc3VwcG9ydGVkLAorCS5nZXRfcmVxdWlyZWRfbWFzayAgPSBpYm1lYnVzX2RtYV9nZXRfcmVxdWlyZWRfbWFzaywKKwkubWFwX3BhZ2UgICAgICAgICAgID0gaWJtZWJ1c19tYXBfcGFnZSwKKwkudW5tYXBfcGFnZSAgICAgICAgID0gaWJtZWJ1c191bm1hcF9wYWdlLAogfTsKIAogc3RhdGljIGludCBpYm1lYnVzX21hdGNoX3BhdGgoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2U1MDAuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9lNTAwLlMKaW5kZXggM2UyYjk1Yy4uNGYwYWI4NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2U1MDAuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfZTUwMC5TCkBAIC0yNiw3ICsyNiw3IEBACiAJb3JpCXI0LHI0LF9UTEZfTkFQUElORwkvKiBzbyB3aGVuIHdlIHRha2UgYW4gZXhjZXB0aW9uICovCiAJc3R3CXI0LFRJX0xPQ0FMX0ZMQUdTKHIzKQkvKiBpdCB3aWxsIHJldHVybiB0byBvdXIgY2FsbGVyICovCiAKLSNpZmRlZiBDT05GSUdfRTUwME1DCisjaWZkZWYgQ09ORklHX1BQQ19FNTAwTUMKIAl3cnRlZWkJMQogMToJd2FpdAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCAyMzc1YjdlLi5kMDc2ZDQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8td29ya2Fyb3VuZHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8td29ya2Fyb3VuZHMuYwppbmRleCBmZmFmYWVhLi4xMmQzMjliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby13b3JrYXJvdW5kcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjdW5kZWYgREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBpbml0X21tICovCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCmluZGV4IDhkYzc1NDdjLi44ODYzODFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKaW5kZXggYjI1ZjYzMi4uMjYyNzkxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKaW5kZXggOTYxYmIwMy4uMGNmY2Y5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwpAQCAtNTAxLDYgKzUwMSwxNCBAQAogCXRibC0+aXRfbWFwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCW1lbXNldCh0YmwtPml0X21hcCwgMCwgc3opOwogCisJLyoKKwkgKiBSZXNlcnZlIHBhZ2UgMCBzbyBpdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBhbnkgbWFwcGluZ3MuCisJICogVGhpcyBhdm9pZHMgYnVnZ3kgZHJpdmVycyB0aGF0IGNvbnNpZGVyIHBhZ2UgMCB0byBiZSBpbnZhbGlkCisJICogdG8gY3Jhc2ggdGhlIG1hY2hpbmUgb3IgZXZlbiBsb3NlIGRhdGEuCisJICovCisJaWYgKHRibC0+aXRfb2Zmc2V0ID09IDApCisJCXNldF9iaXQoMCwgdGJsLT5pdF9tYXApOworCiAJdGJsLT5pdF9oaW50ID0gMDsKIAl0YmwtPml0X2xhcmdlaGludCA9IHRibC0+aXRfaGFsZnBvaW50OwogCXNwaW5fbG9ja19pbml0KCZ0YmwtPml0X2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggZDI4MWZiNi4uNWMzYzQ2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0zMCw3ICszMCw3IEBACiAKICN1bmRlZiBERUJVRwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCmluZGV4IDRkNTczMWIuLjQ3OTc1MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3ZtLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2t2bS5jCmluZGV4IGIwNmJkYWUuLjM1ZjI3NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3ZtLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rdm0uYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX3BhcmEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbGVnYWN5X3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMKaW5kZXggMmI5N2I4MC4uYzdiNWFmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTQ3LDYgKzQ4LDI0IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGxlZ2FjeV9zZXJpYWxfY291bnQ7CiBzdGF0aWMgaW50IGxlZ2FjeV9zZXJpYWxfY29uc29sZSA9IC0xOwogCitzdGF0aWMgdW5zaWduZWQgaW50IHRzaV9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCW9mZnNldCA9IG9mZnNldCA8PCBwLT5yZWdzaGlmdDsKKwlpZiAob2Zmc2V0ID09IFVBUlRfSUlSKSB7CisJCXRtcCA9IHJlYWRsKHAtPm1lbWJhc2UgKyAoVUFSVF9JSVIgJiB+MykpOworCQlyZXR1cm4gKHRtcCA+PiAxNikgJiAweGZmOyAvKiBVQVJUX0lJUiAlIDQgPT0gMiAqLworCX0gZWxzZQorCQlyZXR1cm4gcmVhZGIocC0+bWVtYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHRzaV9zZXJpYWxfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlvZmZzZXQgPSBvZmZzZXQgPDwgcC0+cmVnc2hpZnQ7CisJaWYgKCEoKG9mZnNldCA9PSBVQVJUX0lFUikgJiYgKHZhbHVlICYgVUFSVF9JRVJfVVVFKSkpCisJCXdyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGFkZF9sZWdhY3lfcG9ydChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgd2FudF9pbmRleCwKIAkJCQkgIGludCBpb3R5cGUsIHBoeXNfYWRkcl90IGJhc2UsCiAJCQkJICBwaHlzX2FkZHJfdCB0YWRkciwgdW5zaWduZWQgbG9uZyBpcnEsCkBAIC0xMDIsNiArMTIxLDcgQEAKIAkJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0uaW9iYXNlID0gYmFzZTsKIAllbHNlCiAJCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLm1hcGJhc2UgPSBiYXNlOworCiAJbGVnYWN5X3NlcmlhbF9wb3J0c1tpbmRleF0uaW90eXBlID0gaW90eXBlOwogCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLnVhcnRjbGsgPSBjbG9jazsKIAlsZWdhY3lfc2VyaWFsX3BvcnRzW2luZGV4XS5pcnEgPSBpcnE7CkBAIC0xMTIsNiArMTMyLDExIEBACiAJbGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0uc3BlZWQgPSBzcGQgPyBiZTMyX3RvX2NwdXAoc3BkKSA6IDA7CiAJbGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0uaXJxX2NoZWNrX3BhcmVudCA9IGlycV9jaGVja19wYXJlbnQ7CiAKKwlpZiAoaW90eXBlID09IFVQSU9fVFNJKSB7CisJCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLnNlcmlhbF9pbiA9IHRzaV9zZXJpYWxfaW47CisJCWxlZ2FjeV9zZXJpYWxfcG9ydHNbaW5kZXhdLnNlcmlhbF9vdXQgPSB0c2lfc2VyaWFsX291dDsKKwl9CisKIAlwcmludGsoS0VSTl9ERUJVRyAiRm91bmQgbGVnYWN5IHNlcmlhbCBwb3J0ICVkIGZvciAlc1xuIiwKIAkgICAgICAgaW5kZXgsIG5wLT5mdWxsX25hbWUpOwogCXByaW50ayhLRVJOX0RFQlVHICIgICVzPSVsbHgsIHRhZGRyPSVsbHgsIGlycT0lbHgsIGNsaz0lZCwgc3BlZWQ9JWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCmluZGV4IDU4M2FmNzAuLjI2Y2NiZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCkBAIC03NCw4ICs3NCw3IEBACiAJfQogCiAJLyogV2UgYWxzbyBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGUgdGNlIHRhYmxlcyAqLwotCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJwY2kiKTsgbm9kZSAhPSBOVUxMOwotCQkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5vZGUsICJwY2kiKSkgeworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShub2RlLCAicGNpIikgewogCQliYXNlcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibGludXgsdGNlLWJhc2UiLCBOVUxMKTsKIAkJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHRjZS1zaXplIiwgTlVMTCk7CiAJCWlmIChiYXNlcCA9PSBOVUxMIHx8IHNpemVwID09IE5VTEwpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCmluZGV4IDk5OGExMDAuLmY3ZDc2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCkBAIC04LDYgKzgsOCBAQAogICoga2V4ZWMgYml0czoKICAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEVyaWMgQmllZGVybWFuICA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgogICogR2FtZUN1YmUvcHBjMzIgcG9ydCBDb3B5cmlnaHQgKEMpIDIwMDQgQWxiZXJ0IEhlcnJhbnoKKyAqIFBQQzQ0eCBwb3J0LiBDb3B5cmlnaHQgKEMpIDIwMTEsICBJQk0gQ29ycG9yYXRpb24KKyAqIAkJQXV0aG9yOiBTdXp1a2kgUG91bG9zZSA8c3V6dWtpQGluLmlibS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTczNiw2ICs3MzgsMTc1IEBACiAJbXIgICAgICByNSwgcjMxCiAKIAlsaQlyMCwgMAorI2VsaWYgZGVmaW5lZChDT05GSUdfNDR4KSAgJiYgIWRlZmluZWQoQ09ORklHXzQ3eCkKKworLyoKKyAqIENvZGUgZm9yIHNldHRpbmcgdXAgMToxIG1hcHBpbmcgZm9yIFBQQzQ0MHggZm9yIEtFWEVDCisgKgorICogV2UgY2Fubm90IHN3aXRjaCBvZmYgdGhlIE1NVSBvbiBQUEM0NHguCisgKiBTbyB3ZToKKyAqIDEpIEludmFsaWRhdGUgYWxsIHRoZSBtYXBwaW5ncyBleGNlcHQgdGhlIG9uZSB3ZSBhcmUgcnVubmluZyBmcm9tLgorICogMikgQ3JlYXRlIGEgdG1wIG1hcHBpbmcgZm9yIG91ciBjb2RlIGluIHRoZSBvdGhlciBhZGRyZXNzIHNwYWNlKFRTKSBhbmQKKyAqICAgIGp1bXAgdG8gaXQuIEludmFsaWRhdGUgdGhlIGVudHJ5IHdlIHN0YXJ0ZWQgaW4uCisgKiAzKSBDcmVhdGUgYSAxOjEgbWFwcGluZyBmb3IgMC0yR2lCIGluIGNodW5rcyBvZiAyNTZNIGluIG9yaWdpbmFsIFRTLgorICogNCkgSnVtcCB0byB0aGUgMToxIG1hcHBpbmcgaW4gb3JpZ2luYWwgVFMuCisgKiA1KSBJbnZhbGlkYXRlIHRoZSB0bXAgbWFwcGluZy4KKyAqCisgKiAtIEJhc2VkIG9uIHRoZSBrZXhlYyBzdXBwb3J0IGNvZGUgZm9yIEZTTCBCb29rRQorICogLSBEb2Vzbid0IHN1cHBvcnQgNDd4IHlldC4KKyAqCisgKi8KKwkvKiBTYXZlIG91ciBwYXJhbWV0ZXJzICovCisJbXIJcjI5LCByMworCW1yCXIzMCwgcjQKKwltcglyMzEsIHI1CisKKwkvKiBMb2FkIG91ciBNU1JfSVMgYW5kIFRJRCB0byBNTVVDUiBmb3IgVExCIHNlYXJjaCAqLworCW1mc3ByCXIzLFNQUk5fUElECisJbWZtc3IJcjQKKwlhbmRpLglyNCxyNCxNU1JfSVNAbAorCWJlcQl3bW11Y3IKKwlvcmlzCXIzLHIzLFBQQzQ0eF9NTVVDUl9TVFNAaAord21tdWNyOgorCW10c3ByCVNQUk5fTU1VQ1IscjMKKwlzeW5jCisKKwkvKgorCSAqIEludmFsaWRhdGUgYWxsIHRoZSBUTEIgZW50cmllcyBleGNlcHQgdGhlIGN1cnJlbnQgZW50cnkKKwkgKiB3aGVyZSB3ZSBhcmUgcnVubmluZyBmcm9tCisJICovCisJYmwJMGYJCQkJLyogRmluZCBvdXIgYWRkcmVzcyAqLworMDoJbWZscglyNQkJCQkvKiBNYWtlIGl0IGFjY2Vzc2libGUgKi8KKwl0bGJzeAlyMjMsMCxyNQkJCS8qIEZpbmQgZW50cnkgd2UgYXJlIGluICovCisJbGkJcjQsMAkJCQkvKiBTdGFydCBhdCBUTEIgZW50cnkgMCAqLworCWxpCXIzLDAJCQkJLyogU2V0IFBBR0VJRCBpbnZhbCB2YWx1ZSAqLworMToJY21wdwlyMjMscjQJCQkJLyogSXMgdGhpcyBvdXIgZW50cnk/ICovCisJYmVxCXNraXAJCQkJLyogSWYgc28sIHNraXAgdGhlIGludmFsICovCisJdGxid2UJcjMscjQsUFBDNDR4X1RMQl9QQUdFSUQJCS8qIElmIG5vdCwgaW52YWwgdGhlIGVudHJ5ICovCitza2lwOgorCWFkZGkJcjQscjQsMQkJCQkvKiBJbmNyZW1lbnQgKi8KKwljbXB3aQlyNCw2NAkJCQkvKiBBcmUgd2UgZG9uZT8JKi8KKwlibmUJMWIJCQkJLyogSWYgbm90LCByZXBlYXQgKi8KKwlpc3luYworCisJLyogQ3JlYXRlIGEgdGVtcCBtYXBwaW5nIGFuZCBqdW1wIHRvIGl0ICovCisJYW5kaS4JcjYsIHIyMywgMQkJLyogRmluZCB0aGUgaW5kZXggdG8gdXNlICovCisJYWRkaQlyMjQsIHI2LCAxCQkvKiByMjQgd2lsbCBjb250YWluIDEgb3IgMiAqLworCisJbWZtc3IJcjkJCQkvKiBnZXQgdGhlIE1TUiAqLworCXJsd2lubQlyNSwgcjksIDI3LCAzMSwgMzEJLyogRXh0cmFjdCB0aGUgTVNSW0lTXSAqLworCXhvcmkJcjcsIHI1LCAxCQkvKiBVc2UgdGhlIG90aGVyIGFkZHJlc3Mgc3BhY2UgKi8KKworCS8qIFJlYWQgdGhlIGN1cnJlbnQgbWFwcGluZyBlbnRyaWVzICovCisJdGxicmUJcjMsIHIyMywgUFBDNDR4X1RMQl9QQUdFSUQKKwl0bGJyZQlyNCwgcjIzLCBQUEM0NHhfVExCX1hMQVQKKwl0bGJyZQlyNSwgcjIzLCBQUEM0NHhfVExCX0FUVFJJQgorCisJLyogU2F2ZSBvdXIgY3VycmVudCBYTEFUIGVudHJ5ICovCisJbXIJcjI1LCByNAorCisJLyogRXh0cmFjdCB0aGUgVExCIFBhZ2VTaXplICovCisJbGkJcjEwLCAxIAkJCS8qIHIxMCB3aWxsIGhvbGQgUGFnZVNpemUgKi8KKwlybHdpbm0JcjExLCByMywgMCwgMjQsIDI3CS8qIGJpdHMgMjQtMjcgKi8KKworCS8qIFhYWDogQXMgb2Ygbm93IHdlIHVzZSAyNTZNLCA0SyBwYWdlcyAqLworCWNtcHdpCXIxMSwgUFBDNDR4X1RMQl8yNTZNCisJYm5lCXRsYl80aworCXJvdGx3aQlyMTAsIHIxMCwgMjgJCS8qIHIxMCA9IDI1Nk0gKi8KKwliCXdyaXRlX291dAordGxiXzRrOgorCWNtcHdpCXIxMSwgUFBDNDR4X1RMQl80SworCWJuZQlkZWZhdWx0CisJcm90bHdpCXIxMCwgcjEwLCAxMgkJLyogcjEwID0gNEsgKi8KKwliCXdyaXRlX291dAorZGVmYXVsdDoKKwlyb3Rsd2kJcjEwLCByMTAsIDEwCQkvKiByMTAgPSAxSyAqLworCit3cml0ZV9vdXQ6CisJLyoKKwkgKiBXcml0ZSBvdXQgdGhlIHRtcCAxOjEgbWFwcGluZyBmb3IgdGhpcyBjb2RlIGluIG90aGVyIGFkZHJlc3Mgc3BhY2UKKwkgKiBGaXh1cCAgRVBOID0gUlBOICwgVFM9b3RoZXIgYWRkcmVzcyBzcGFjZQorCSAqLworCWluc3J3aQlyMywgcjcsIDEsIDIzCQkvKiBCaXQgMjMgaXMgVFMgZm9yIFBBR0VJRCBmaWVsZCAqLworCisJLyogV3JpdGUgb3V0IHRoZSB0bXAgbWFwcGluZyBlbnRyaWVzICovCisJdGxid2UJcjMsIHIyNCwgUFBDNDR4X1RMQl9QQUdFSUQKKwl0bGJ3ZQlyNCwgcjI0LCBQUEM0NHhfVExCX1hMQVQKKwl0bGJ3ZQlyNSwgcjI0LCBQUEM0NHhfVExCX0FUVFJJQgorCisJc3ViaQlyMTEsIHIxMCwgMQkJLyogUGFnZU9mZnNldCBNYXNrID0gUGFnZVNpemUgLSAxICovCisJbm90CXIxMCwgcjExCQkvKiBNYXNrIGZvciBQYWdlTnVtICovCisKKwkvKiBTd2l0Y2ggdG8gb3RoZXIgYWRkcmVzcyBzcGFjZSBpbiBNU1IgKi8KKwlpbnNyd2kJcjksIHI3LCAxLCAyNgkJLyogU2V0IE1TUltJU10gPSByNyAqLworCisJYmwJMWYKKzE6CW1mbHIJcjgKKwlhZGRpCXI4LCByOCwgKDJmLTFiKQkJLyogRmluZCB0aGUgdGFyZ2V0IG9mZnNldCAqLworCisJLyogSnVtcCB0byB0aGUgdG1wIG1hcHBpbmcgKi8KKwltdHNwcglTUFJOX1NSUjAsIHI4CisJbXRzcHIJU1BSTl9TUlIxLCByOQorCXJmaQorCisyOgorCS8qIEludmFsaWRhdGUgdGhlIGVudHJ5IHdlIHdlcmUgZXhlY3V0aW5nIGZyb20gKi8KKwlsaQlyMywgMAorCXRsYndlCXIzLCByMjMsIFBQQzQ0eF9UTEJfUEFHRUlECisKKwkvKiBhdHRyaWJ1dGUgZmllbGRzLiByd3ggZm9yIFNVUEVSVklTT1IgbW9kZSAqLworCWxpCXI1LCAwCisJb3JpCXI1LCByNSwgKFBQQzQ0eF9UTEJfU1cgfCBQUEM0NHhfVExCX1NSIHwgUFBDNDR4X1RMQl9TWCB8IFBQQzQ0eF9UTEJfRykKKworCS8qIENyZWF0ZSAxOjEgbWFwcGluZyBpbiAyNTZNIHBhZ2VzICovCisJeG9yaQlyNywgcjcsIDEJCQkvKiBSZXZlcnQgYmFjayB0byBPcmlnaW5hbCBUUyAqLworCisJbGkJcjgsIDAJCQkJLyogUGFnZU51bWJlciAqLworCWxpCXI2LCAzCQkJCS8qIFRMQiBJbmRleCwgc3RhcnQgYXQgMyAgKi8KKworbmV4dF90bGI6CisJcm90bHdpCXIzLCByOCwgMjgJCQkvKiBDcmVhdGUgRVBOIChiaXRzIDAtMykgKi8KKwltcglyNCwgcjMJCQkJLyogUlBOID0gRVBOICAqLworCW9yaQlyMywgcjMsIChQUEM0NHhfVExCX1ZBTElEIHwgUFBDNDR4X1RMQl8yNTZNKSAvKiBTSVpFID0gMjU2TSwgVmFsaWQgKi8KKwlpbnNyd2kJcjMsIHI3LCAxLCAyMwkJCS8qIFNldCBUUyBmcm9tIHI3ICovCisKKwl0bGJ3ZQlyMywgcjYsIFBQQzQ0eF9UTEJfUEFHRUlECS8qIFBhZ2VJRCBmaWVsZCA6IEVQTiwgViwgU0laRSAqLworCXRsYndlCXI0LCByNiwgUFBDNDR4X1RMQl9YTEFUCQkvKiBBZGRyZXNzIHRyYW5zbGF0aW9uIDogUlBOICAgKi8KKwl0bGJ3ZQlyNSwgcjYsIFBQQzQ0eF9UTEJfQVRUUklCCS8qIEF0dHJpYnV0ZXMgKi8KKworCWFkZGkJcjgsIHI4LCAxCQkJLyogSW5jcmVtZW50IFBOICovCisJYWRkaQlyNiwgcjYsIDEJCQkvKiBJbmNyZW1lbnQgVExCIEluZGV4ICovCisJY21wd2kJcjgsIDgJCQkJLyogQXJlIHdlIGRvbmUgPyAqLworCWJuZQluZXh0X3RsYgorCWlzeW5jCisKKwkvKiBKdW1wIHRvIHRoZSBuZXcgbWFwcGluZyAxOjEgKi8KKwlsaQlyOSwwCisJaW5zcndpCXI5LCByNywgMSwgMjYJCQkvKiBTZXQgTVNSW0lTXSA9IHI3ICovCisKKwlibAkxZgorMToJbWZscglyOAorCWFuZAlyOCwgcjgsIHIxMQkJCS8qIEdldCBvdXIgb2Zmc2V0IHdpdGhpbiBwYWdlICovCisJYWRkaQlyOCwgcjgsICgyZi0xYikKKworCWFuZAlyNSwgcjI1LCByMTAJCQkvKiBHZXQgb3VyIHRhcmdldCBQYWdlTnVtICovCisJb3IJcjgsIHI4LCByNQkJCS8qIFRhcmdldCBqdW1wIGFkZHJlc3MgKi8KKworCW10c3ByCVNQUk5fU1JSMCwgcjgKKwltdHNwcglTUFJOX1NSUjEsIHI5CisJcmZpCisyOgorCS8qIEludmFsaWRhdGUgdGhlIHRtcCBlbnRyeSB3ZSB1c2VkICovCisJbGkJcjMsIDAKKwl0bGJ3ZQlyMywgcjI0LCBQUEM0NHhfVExCX1BBR0VJRAorCXN5bmMKKworCS8qIFJlc3RvcmUgdGhlIHBhcmFtZXRlcnMgKi8KKwltcglyMywgcjI5CisJbXIJcjQsIHIzMAorCW1yCXI1LCByMzEKKworCWxpCXIwLCAwCiAjZWxzZQogCWxpCXIwLCAwCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZS5jCmluZGV4IGExY2Q3MDEuLjJkMjc1NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTYsNyArMTYsNiBAQAogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYwppbmRleCA1OWRiZjZhLi5lMTYxMmRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BhY2EuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCmluZGV4IDBhNWE4OTkuLjQxNDU2ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGFjYS5jCkBAIC04LDcgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDMyNjU2ZjEuLjQ1OGVkM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTE3MzAsNiArMTczMSwxNyBAQAogCiAJaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgPSBwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKKworCS8qIENvbmZpZ3VyZSBQQ0kgRXhwcmVzcyBzZXR0aW5ncyAqLworCWlmIChidXMgJiYgIXBjaV9oYXNfZmxhZyhQQ0lfUFJPQkVfT05MWSkpIHsKKwkJc3RydWN0IHBjaV9idXMgKmNoaWxkOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQkJc3RydWN0IHBjaV9kZXYgKnNlbGYgPSBjaGlsZC0+c2VsZjsKKwkJCWlmICghc2VsZikKKwkJCQljb250aW51ZTsKKwkJCXBjaWVfYnVzX2NvbmZpZ3VyZV9zZXR0aW5ncyhjaGlsZCwgc2VsZi0+cGNpZV9tcHNzKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQgZml4dXBfaGlkZV9ob3N0X3Jlc291cmNlX2ZzbChzdHJ1Y3QgcGNpX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggYmIxNTQ1MS4uZmRkMWEzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggYWIzNDA0Ni4uYmNmNGJmOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKaW5kZXggNDc4ZjhkNzguLjRlNjlkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfb2Zfc2Nhbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfb2Zfc2Nhbi5jCmluZGV4IGZlMGE1YWQuLmIzN2QwYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX29mX3NjYW4uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYwppbmRleCA0NjE0OTliLi5hODQxYTlkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI2LXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKaW5kZXggMDNiOTVlMi4uMGJiYzkwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogICovCiBzdGF0aWMgaW50IHBvd2VyNl9jYWNoZV9ldmVudHNbQyhNQVgpXVtDKE9QX01BWCldW0MoUkVTVUxUX01BWCldID0gewogCVtDKEwxRCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KLQkJW0MoT1BfUkVBRCldID0gewkweDgwMDgyLAkweDgwMDgwCQl9LAotCQlbQyhPUF9XUklURSldID0gewkweDgwMDg2LAkweDgwMDg4CQl9LAorCQlbQyhPUF9SRUFEKV0gPSB7CTB4MjgwMDMwLAkweDgwMDgwCQl9LAorCQlbQyhPUF9XUklURSldID0gewkweDE4MDAzMiwJMHg4MDA4OAkJfSwKIAkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHg4MTBhNCwJMAkJfSwKIAl9LAogCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI3LXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMKaW5kZXggZGU4M2Q2MC4uMTI1MWU0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMKQEAgLTI5Nyw2ICsyOTcsOCBAQAogCiBzdGF0aWMgaW50IHBvd2VyN19nZW5lcmljX2V2ZW50c1tdID0gewogCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdID0gMHgxZSwKKwlbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORF0gPSAweDEwMGY4LCAvKiBHQ1RfTk9TTE9UX0NZQyAqLworCVtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0JBQ0tFTkRdID0gMHg0MDAwYSwgIC8qIENNUExVX1NUQUxMICovCiAJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXSA9IDIsCiAJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10gPSAweGM4ODAsCS8qIExEX1JFRl9MMV9MU1UqLwogCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10gPSAweDQwMGYwLAkJLyogTERfTUlTU19MMQkqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggZjVhZTg3Mi4uZDMxMTRhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA4ZjUzOTU0Li45MDU0Y2E5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbXF1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCAxNzRlMWU5Li5mYTEyMzViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC01NCw2ICs1NCw4IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vcGh5cF9kdW1wLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKwogI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CiAKICNpZmRlZiBERUJVRwpAQCAtNzA3LDExICs3MDksMjMgQEAKIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3J0YXMsIE5VTEwpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKwkvKiBTb21lIG1hY2hpbmVzIG1pZ2h0IG5lZWQgT1BBTCBpbmZvIGZvciBkZWJ1Z2dpbmcsIGdyYWIgaXQgbm93LiAqLworCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fb3BhbCwgTlVMTCk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19QSFlQX0RVTVAKIAkvKiBzY2FuIHRyZWUgdG8gc2VlIGlmIGR1bXAgb2NjdXJyZWQgZHVyaW5nIGxhc3QgYm9vdCAqLwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fcGh5cF9kdW1wLCBOVUxMKTsKICNlbmRpZgogCisJLyogUHJlLWluaXRpYWxpemUgdGhlIGNtZF9saW5lIHdpdGggdGhlIGNvbnRlbnQgb2YgYm9vdF9jb21tbWFuZF9saW5lLAorCSAqIHdoaWNoIHdpbGwgYmUgZW1wdHkgZXhjZXB0IHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHZhcmlhYmxlIGhhcworCSAqIGJlZW4gb3ZlcnJpZGVuIGJ5IGEgYm9vdGxvYWRpbmcgbWVjaGFuaXNtLiBUaGlzIGhhcHBlbnMgdHlwaWNhbGx5CisJICogd2l0aCBIQUwgdGFrZW92ZXIKKwkgKi8KKwlzdHJsY3B5KGNtZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCiAJLyogUmV0cmlldmUgdmFyaW91cyBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgL2Nob3NlbiBub2RlIG9mIHRoZQogCSAqIGRldmljZS10cmVlLCBpbmNsdWRpbmcgdGhlIHBsYXRmb3JtIHR5cGUsIGluaXRyZCBsb2NhdGlvbiBhbmQKIAkgKiBzaXplLCBUQ0UgcmVzZXJ2ZSwgYW5kIG1vcmUgLi4uCkBAIC03MjMsMTIgKzczNywxNSBAQAogCiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9yb290LCBOVUxMKTsKIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX21lbW9yeV9wcGMsIE5VTEwpOwotCXNldHVwX2luaXRpYWxfbWVtb3J5X2xpbWl0KG1lbXN0YXJ0X2FkZHIsIGZpcnN0X21lbWJsb2NrX3NpemUpOwogCiAJLyogU2F2ZSBjb21tYW5kIGxpbmUgZm9yIC9wcm9jL2NtZGxpbmUgYW5kIHRoZW4gcGFyc2UgcGFyYW1ldGVycyAqLwogCXN0cmxjcHkoYm9vdF9jb21tYW5kX2xpbmUsIGNtZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CiAJcGFyc2VfZWFybHlfcGFyYW0oKTsKIAorCS8qIG1ha2Ugc3VyZSB3ZSd2ZSBwYXJzZWQgY21kbGluZSBmb3IgbWVtPSBiZWZvcmUgdGhpcyAqLworCWlmIChtZW1vcnlfbGltaXQpCisJCWZpcnN0X21lbWJsb2NrX3NpemUgPSBtaW4oZmlyc3RfbWVtYmxvY2tfc2l6ZSwgbWVtb3J5X2xpbWl0KTsKKwlzZXR1cF9pbml0aWFsX21lbW9yeV9saW1pdChtZW1zdGFydF9hZGRyLCBmaXJzdF9tZW1ibG9ja19zaXplKTsKIAkvKiBSZXNlcnZlIE1FTUJMT0NLIHJlZ2lvbnMgdXNlZCBieSBrZXJuZWwsIGluaXRyZCwgZHQsIGV0Yy4uLiAqLwogCW1lbWJsb2NrX3Jlc2VydmUoUEhZU0lDQUxfU1RBUlQsIF9fcGEoa2xpbWl0KSAtIFBIWVNJQ0FMX1NUQVJUKTsKIAkvKiBJZiByZWxvY2F0YWJsZSwgcmVzZXJ2ZSBmaXJzdCAzMmsgZm9yIGludGVycnVwdCB2ZWN0b3JzIGV0Yy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IGE5MDlmNGUuLmI0ZmE2NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9idGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD4KIApAQCAtMTM5LDcgKzE0MCw5IEBACiAKIHR5cGVkZWYgdTMyIGNlbGxfdDsKIAotZXh0ZXJuIHZvaWQgX19zdGFydCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1KTsKK2V4dGVybiB2b2lkIF9fc3RhcnQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsIHVuc2lnbmVkIGxvbmcgcjgsCisJCSAgICB1bnNpZ25lZCBsb25nIHI5KTsKIAogI2lmZGVmIENPTkZJR19QUEM2NAogZXh0ZXJuIGludCBlbnRlcl9wcm9tKHN0cnVjdCBwcm9tX2FyZ3MgKmFyZ3MsIHVuc2lnbmVkIGxvbmcgZW50cnkpOwpAQCAtMTg1LDYgKzE4OCw3IEBACiAjZGVmaW5lIFBMQVRGT1JNX0xQQVIJCTB4MDAwMQogI2RlZmluZSBQTEFURk9STV9QT1dFUk1BQwkweDA0MDAKICNkZWZpbmUgUExBVEZPUk1fR0VORVJJQwkweDA1MDAKKyNkZWZpbmUgUExBVEZPUk1fT1BBTAkJMHgwNjAwCiAKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBvZl9wbGF0Zm9ybTsKIApAQCAtNjQ0LDcgKzY0OCw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQogLyoKICAqIFRoZXJlIGFyZSB0d28gbWV0aG9kcyBmb3IgdGVsbGluZyBmaXJtd2FyZSB3aGF0IG91ciBjYXBhYmlsaXRpZXMgYXJlLgogICogTmV3ZXIgbWFjaGluZXMgaGF2ZSBhbiAiaWJtLGNsaWVudC1hcmNoaXRlY3R1cmUtc3VwcG9ydCIgbWV0aG9kIG9uIHRoZQpAQCAtMTI3NCw2ICsxMjc4LDI4NCBAQAogCXByb21fcHJpbnRmKCIgIHJhbV90b3AgICAgICA6ICV4XG4iLCBSRUxPQyhyYW1fdG9wKSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwcm9tX2Nsb3NlX3N0ZGluKHZvaWQpCit7CisJc3RydWN0IHByb21fdCAqX3Byb20gPSAmUkVMT0MocHJvbSk7CisJaWhhbmRsZSB2YWw7CisKKwlpZiAocHJvbV9nZXRwcm9wKF9wcm9tLT5jaG9zZW4sICJzdGRpbiIsICZ2YWwsIHNpemVvZih2YWwpKSA+IDApCisJCWNhbGxfcHJvbSgiY2xvc2UiLCAxLCAwLCB2YWwpOworfQorCisjaWZkZWYgQ09ORklHX1BQQ19QT1dFUk5WCisKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX29wYWxfc2l6ZTsKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX29wYWxfYWxpZ247CitzdGF0aWMgaW50IF9faW5pdGRhdGEgcHJvbV9ydGFzX3N0YXJ0X2NwdTsKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX3J0YXNfZGF0YTsKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX3J0YXNfZW50cnk7CisKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUwKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX29wYWxfYmFzZTsKK3N0YXRpYyB1NjQgX19pbml0ZGF0YSBwcm9tX29wYWxfZW50cnk7CisjZW5kaWYKKworLyogWFhYIERvbid0IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSB3aXRob3V0IHVwZGF0aW5nIG9wYWwtdGFrZW92ZXIuUyAqLworc3RhdGljIHN0cnVjdCBvcGFsX3NlY29uZGFyeV9kYXRhIHsKKwlzNjQJCQkJYWNrOwkvKiAgMCAqLworCXU2NAkJCQlnbzsJLyogIDggKi8KKwlzdHJ1Y3Qgb3BhbF90YWtlb3Zlcl9hcmdzCWFyZ3M7CS8qIDE2ICovCit9IG9wYWxfc2Vjb25kYXJ5X2RhdGE7CisKK2V4dGVybiBjaGFyIG9wYWxfc2Vjb25kYXJ5X2VudHJ5OworCitzdGF0aWMgdm9pZCBwcm9tX3F1ZXJ5X29wYWwodm9pZCkKK3sKKwlsb25nIHJjOworCisJLyogV2UgbXVzdCBub3QgcXVlcnkgZm9yIE9QQUwgcHJlc2VuY2Ugb24gYSBtYWNoaW5lIHRoYXQKKwkgKiBzdXBwb3J0cyBUTksgdGFrZW92ZXIgKDk3MCBibGFkZXMpLCBhcyB0aGlzIHVzZXMgdGhlIHNhbWUKKwkgKiBoLWNhbGwgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzIGFuZCB3aWxsIGNyYXNoCisJICovCisJaWYgKFBIQU5ETEVfVkFMSUQoY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwKKwkJCQkgICAgQUREUigiL3Ruay1tZW1vcnktbWFwIikpKSkgeworCQlwcm9tX3ByaW50ZigiVE5LIHRha2VvdmVyIGRldGVjdGVkLCBza2lwcGluZyBPUEFMIGNoZWNrXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByb21fcHJpbnRmKCJRdWVyeWluZyBmb3IgT1BBTCBwcmVzZW5jZS4uLiAiKTsKKwlyYyA9IG9wYWxfcXVlcnlfdGFrZW92ZXIoJlJFTE9DKHByb21fb3BhbF9zaXplKSwKKwkJCQkgJlJFTE9DKHByb21fb3BhbF9hbGlnbikpOworCXByb21fZGVidWcoIihyYyA9ICVsZCkgIiwgcmMpOworCWlmIChyYyAhPSAwKSB7CisJCXByb21fcHJpbnRmKCJub3QgdGhlcmUuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlSRUxPQyhvZl9wbGF0Zm9ybSkgPSBQTEFURk9STV9PUEFMOworCXByb21fcHJpbnRmKCIgdGhlcmUgIVxuIik7CisJcHJvbV9kZWJ1ZygiICBvcGFsX3NpemUgID0gMHglbHhcbiIsIFJFTE9DKHByb21fb3BhbF9zaXplKSk7CisJcHJvbV9kZWJ1ZygiICBvcGFsX2FsaWduID0gMHglbHhcbiIsIFJFTE9DKHByb21fb3BhbF9hbGlnbikpOworCWlmIChSRUxPQyhwcm9tX29wYWxfYWxpZ24pIDwgMHgxMDAwMCkKKwkJUkVMT0MocHJvbV9vcGFsX2FsaWduKSA9IDB4MTAwMDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvbV9ydGFzX2NhbGwoaW50IHRva2VuLCBpbnQgbmFyZ3MsIGludCBucmV0LCBpbnQgKm91dHB1dHMsIC4uLikKK3sKKwlzdHJ1Y3QgcnRhc19hcmdzIHJ0YXNfYXJnczsKKwl2YV9saXN0IGxpc3Q7CisJaW50IGk7CisKKwlydGFzX2FyZ3MudG9rZW4gPSB0b2tlbjsKKwlydGFzX2FyZ3MubmFyZ3MgPSBuYXJnczsKKwlydGFzX2FyZ3MubnJldCAgPSBucmV0OworCXJ0YXNfYXJncy5yZXRzICA9IChydGFzX2FyZ190ICopJihydGFzX2FyZ3MuYXJnc1tuYXJnc10pOworCXZhX3N0YXJ0KGxpc3QsIG91dHB1dHMpOworCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgKytpKQorCQlydGFzX2FyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCBydGFzX2FyZ190KTsKKwl2YV9lbmQobGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJldDsgKytpKQorCQlydGFzX2FyZ3MucmV0c1tpXSA9IDA7CisKKwlvcGFsX2VudGVyX3J0YXMoJnJ0YXNfYXJncywgUkVMT0MocHJvbV9ydGFzX2RhdGEpLAorCQkJUkVMT0MocHJvbV9ydGFzX2VudHJ5KSk7CisKKwlpZiAobnJldCA+IDEgJiYgb3V0cHV0cyAhPSBOVUxMKQorCQlmb3IgKGkgPSAwOyBpIDwgbnJldC0xOyArK2kpCisJCQlvdXRwdXRzW2ldID0gcnRhc19hcmdzLnJldHNbaSsxXTsKKwlyZXR1cm4gKG5yZXQgPiAwKT8gcnRhc19hcmdzLnJldHNbMF06IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwcm9tX29wYWxfaG9sZF9jcHVzKHZvaWQpCit7CisJaW50IGksIGNudCwgY3B1LCByYzsKKwlsb25nIGo7CisJcGhhbmRsZSBub2RlOworCWNoYXIgdHlwZVs2NF07CisJdTMyIHNlcnZlcnNbOF07CisJc3RydWN0IHByb21fdCAqX3Byb20gPSAmUkVMT0MocHJvbSk7CisJdm9pZCAqZW50cnkgPSAodW5zaWduZWQgbG9uZyAqKSZSRUxPQyhvcGFsX3NlY29uZGFyeV9lbnRyeSk7CisJc3RydWN0IG9wYWxfc2Vjb25kYXJ5X2RhdGEgKmRhdGEgPSAmUkVMT0Mob3BhbF9zZWNvbmRhcnlfZGF0YSk7CisKKwlwcm9tX2RlYnVnKCJwcm9tX29wYWxfaG9sZF9jcHVzOiBzdGFydC4uLlxuIik7CisJcHJvbV9kZWJ1ZygiICAgIC0gZW50cnkgICAgICAgPSAweCV4XG4iLCBlbnRyeSk7CisJcHJvbV9kZWJ1ZygiICAgIC0gZGF0YSAgICAgICAgPSAweCV4XG4iLCBkYXRhKTsKKworCWRhdGEtPmFjayA9IC0xOworCWRhdGEtPmdvID0gMDsKKworCS8qIGxvb2sgZm9yIGNwdXMgKi8KKwlmb3IgKG5vZGUgPSAwOyBwcm9tX25leHRfbm9kZSgmbm9kZSk7ICkgeworCQl0eXBlWzBdID0gMDsKKwkJcHJvbV9nZXRwcm9wKG5vZGUsICJkZXZpY2VfdHlwZSIsIHR5cGUsIHNpemVvZih0eXBlKSk7CisJCWlmIChzdHJjbXAodHlwZSwgUkVMT0MoImNwdSIpKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBub24tY29uZmlndXJlZCBjcHVzLiAqLworCQlpZiAocHJvbV9nZXRwcm9wKG5vZGUsICJzdGF0dXMiLCB0eXBlLCBzaXplb2YodHlwZSkpID4gMCkKKwkJCWlmIChzdHJjbXAodHlwZSwgUkVMT0MoIm9rYXkiKSkgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQljbnQgPSBwcm9tX2dldHByb3Aobm9kZSwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwgc2VydmVycywKKwkJCSAgICAgc2l6ZW9mKHNlcnZlcnMpKTsKKwkJaWYgKGNudCA9PSBQUk9NX0VSUk9SKQorCQkJYnJlYWs7CisJCWNudCA+Pj0gMjsKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCQljcHUgPSBzZXJ2ZXJzW2ldOworCQkJcHJvbV9kZWJ1ZygiQ1BVICVkIC4uLiAiLCBjcHUpOworCQkJaWYgKGNwdSA9PSBfcHJvbS0+Y3B1KSB7CisJCQkJcHJvbV9kZWJ1ZygiYm9vdGVkICFcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcHJvbV9kZWJ1Zygic3RhcnRpbmcgLi4uICIpOworCisJCQkvKiBJbml0IHRoZSBhY2tub3dsZWRnZSB2YXIgd2hpY2ggd2lsbCBiZSByZXNldCBieQorCQkJICogdGhlIHNlY29uZGFyeSBjcHUgd2hlbiBpdCBhd2FrZW5zIGZyb20gaXRzIE9GCisJCQkgKiBzcGlubG9vcC4KKwkJCSAqLworCQkJZGF0YS0+YWNrID0gLTE7CisJCQlyYyA9IHByb21fcnRhc19jYWxsKFJFTE9DKHByb21fcnRhc19zdGFydF9jcHUpLCAzLCAxLAorCQkJCQkgICAgTlVMTCwgY3B1LCBlbnRyeSwgZGF0YSk7CisJCQlwcm9tX2RlYnVnKCJydGFzIHJjPSVkIC4uLiIsIHJjKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDEwMDAwMDAwMCAmJiBkYXRhLT5hY2sgPT0gLTE7IGorKykgeworCQkJCUhNVF9sb3coKTsKKwkJCQltYigpOworCQkJfQorCQkJSE1UX21lZGl1bSgpOworCQkJaWYgKGRhdGEtPmFjayAhPSAtMSkKKwkJCQlwcm9tX2RlYnVnKCJkb25lLCBQSVI9MHgleFxuIiwgZGF0YS0+YWNrKTsKKwkJCWVsc2UKKwkJCQlwcm9tX2RlYnVnKCJ0aW1lb3V0ICFcbiIpOworCQl9CisJfQorCXByb21fZGVidWcoInByb21fb3BhbF9ob2xkX2NwdXM6IGVuZC4uLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByb21fb3BhbF90YWtlb3Zlcih2b2lkKQoreworCXN0cnVjdCBvcGFsX3NlY29uZGFyeV9kYXRhICpkYXRhID0gJlJFTE9DKG9wYWxfc2Vjb25kYXJ5X2RhdGEpOworCXN0cnVjdCBvcGFsX3Rha2VvdmVyX2FyZ3MgKmFyZ3MgPSAmZGF0YS0+YXJnczsKKwl1NjQgYWxpZ24gPSBSRUxPQyhwcm9tX29wYWxfYWxpZ24pOworCXU2NCB0b3BfYWRkciwgb3BhbF9hZGRyOworCisJYXJncy0+a19pbWFnZQk9ICh1NjQpUkVMT0MoX3N0ZXh0KTsKKwlhcmdzLT5rX3NpemUJPSBfZW5kIC0gX3N0ZXh0OworCWFyZ3MtPmtfZW50cnkJPSAwOworCWFyZ3MtPmtfZW50cnkyCT0gMHg2MDsKKworCXRvcF9hZGRyID0gX0FMSUdOX1VQKGFyZ3MtPmtfc2l6ZSwgYWxpZ24pOworCisJaWYgKFJFTE9DKHByb21faW5pdHJkX3N0YXJ0KSAhPSAwKSB7CisJCWFyZ3MtPnJkX2ltYWdlID0gUkVMT0MocHJvbV9pbml0cmRfc3RhcnQpOworCQlhcmdzLT5yZF9zaXplID0gUkVMT0MocHJvbV9pbml0cmRfZW5kKSAtIGFyZ3MtPnJkX2ltYWdlOworCQlhcmdzLT5yZF9sb2MgPSB0b3BfYWRkcjsKKwkJdG9wX2FkZHIgPSBfQUxJR05fVVAoYXJncy0+cmRfbG9jICsgYXJncy0+cmRfc2l6ZSwgYWxpZ24pOworCX0KKworCS8qIFBpY2t1cCBhbiBhZGRyZXNzIGZvciB0aGUgSEFMLiBXZSB3YW50IHRvIGdvIHJlYWxseSBoaWdoCisJICogdXAgdG8gYXZvaWQgcHJvYmxlbSB3aXRoIGZ1dHVyZSBrZXhlY3MuIE9uIHRoZSBvdGhlciBoYW5kCisJICogd2UgZG9uJ3Qgd2FudCB0byBiZSBhbGwgb3ZlciB0aGUgVENFcyBvbiBQNUlPQzIgbWFjaGluZXMKKwkgKiB3aGljaCBhcmUgZ29pbmcgdG8gYmUgdXAgdGhlcmUgdG9vLiBXZSBhc3N1bWUgdGhlIG1hY2hpbmUKKwkgKiBoYXMgcGxlbnR5IG9mIG1lbW9yeSwgYW5kIHdlIGFzayBmb3IgdGhlIEhBTCBmb3Igbm93IHRvCisJICogYmUganVzdCBiZWxvdyB0aGUgMUcgcG9pbnQsIG9yIGFib3ZlIHRoZSBpbml0cmQKKwkgKi8KKwlvcGFsX2FkZHIgPSBfQUxJR05fRE9XTigweDQwMDAwMDAwIC0gUkVMT0MocHJvbV9vcGFsX3NpemUpLCBhbGlnbik7CisJaWYgKG9wYWxfYWRkciA8IHRvcF9hZGRyKQorCQlvcGFsX2FkZHIgPSB0b3BfYWRkcjsKKwlhcmdzLT5oYWxfYWRkciA9IG9wYWxfYWRkcjsKKworCS8qIENvcHkgdGhlIGNvbW1hbmQgbGluZSB0byB0aGUga2VybmVsIGltYWdlICovCisJc3RybGNweShSRUxPQyhib290X2NvbW1hbmRfbGluZSksIFJFTE9DKHByb21fY21kX2xpbmUpLAorCQlDT01NQU5EX0xJTkVfU0laRSk7CisKKwlwcm9tX2RlYnVnKCIgIGtfaW1hZ2UgICAgPSAweCVseFxuIiwgYXJncy0+a19pbWFnZSk7CisJcHJvbV9kZWJ1ZygiICBrX3NpemUgICAgID0gMHglbHhcbiIsIGFyZ3MtPmtfc2l6ZSk7CisJcHJvbV9kZWJ1ZygiICBrX2VudHJ5ICAgID0gMHglbHhcbiIsIGFyZ3MtPmtfZW50cnkpOworCXByb21fZGVidWcoIiAga19lbnRyeTIgICA9IDB4JWx4XG4iLCBhcmdzLT5rX2VudHJ5Mik7CisJcHJvbV9kZWJ1ZygiICBoYWxfYWRkciAgID0gMHglbHhcbiIsIGFyZ3MtPmhhbF9hZGRyKTsKKwlwcm9tX2RlYnVnKCIgIHJkX2ltYWdlICAgPSAweCVseFxuIiwgYXJncy0+cmRfaW1hZ2UpOworCXByb21fZGVidWcoIiAgcmRfc2l6ZSAgICA9IDB4JWx4XG4iLCBhcmdzLT5yZF9zaXplKTsKKwlwcm9tX2RlYnVnKCIgIHJkX2xvYyAgICAgPSAweCVseFxuIiwgYXJncy0+cmRfbG9jKTsKKwlwcm9tX3ByaW50ZigiUGVyZm9ybWluZyBPUEFMIHRha2VvdmVyLHRoaXMgY2FuIHRha2UgYSBmZXcgbWludXRlcy4uXG4iKTsKKwlwcm9tX2Nsb3NlX3N0ZGluKCk7CisJbWIoKTsKKwlkYXRhLT5nbyA9IDE7CisJZm9yICg7OykKKwkJb3BhbF9kb190YWtlb3ZlcihhcmdzKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIHJvb20gZm9yIGFuZCBpbnN0YW50aWF0ZSBPUEFMCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwcm9tX2luc3RhbnRpYXRlX29wYWwodm9pZCkKK3sKKwlwaGFuZGxlIG9wYWxfbm9kZTsKKwlpaGFuZGxlIG9wYWxfaW5zdDsKKwl1NjQgYmFzZSwgZW50cnk7CisJdTY0IHNpemUgPSAwLCBhbGlnbiA9IDB4MTAwMDA7CisJdTMyIHJldHNbMl07CisKKwlwcm9tX2RlYnVnKCJwcm9tX2luc3RhbnRpYXRlX29wYWw6IHN0YXJ0Li4uXG4iKTsKKworCW9wYWxfbm9kZSA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIoIi9pYm0sb3BhbCIpKTsKKwlwcm9tX2RlYnVnKCJvcGFsX25vZGU6ICV4XG4iLCBvcGFsX25vZGUpOworCWlmICghUEhBTkRMRV9WQUxJRChvcGFsX25vZGUpKQorCQlyZXR1cm47CisKKwlwcm9tX2dldHByb3Aob3BhbF9ub2RlLCAib3BhbC1ydW50aW1lLXNpemUiLCAmc2l6ZSwgc2l6ZW9mKHNpemUpKTsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisJcHJvbV9nZXRwcm9wKG9wYWxfbm9kZSwgIm9wYWwtcnVudGltZS1hbGlnbm1lbnQiLCAmYWxpZ24sCisJCSAgICAgc2l6ZW9mKGFsaWduKSk7CisKKwliYXNlID0gYWxsb2NfZG93bihzaXplLCBhbGlnbiwgMCk7CisJaWYgKGJhc2UgPT0gMCkgeworCQlwcm9tX3ByaW50ZigiT1BBTCBhbGxvY2F0aW9uIGZhaWxlZCAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW9wYWxfaW5zdCA9IGNhbGxfcHJvbSgib3BlbiIsIDEsIDEsIEFERFIoIi9pYm0sb3BhbCIpKTsKKwlpZiAoIUlIQU5ETEVfVkFMSUQob3BhbF9pbnN0KSkgeworCQlwcm9tX3ByaW50Zigib3BlbmluZyBvcGFsIHBhY2thZ2UgZmFpbGVkICgleClcbiIsIG9wYWxfaW5zdCk7CisJCXJldHVybjsKKwl9CisKKwlwcm9tX3ByaW50ZigiaW5zdGFudGlhdGluZyBvcGFsIGF0IDB4JXguLi4iLCBiYXNlKTsKKworCWlmIChjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDQsIDMsIHJldHMsCisJCQkgIEFERFIoImxvYWQtb3BhbC1ydW50aW1lIiksCisJCQkgIG9wYWxfaW5zdCwKKwkJCSAgYmFzZSA+PiAzMiwgYmFzZSAmIDB4ZmZmZmZmZmYpICE9IDAKKwkgICAgfHwgKHJldHNbMF0gPT0gMCAmJiByZXRzWzFdID09IDApKSB7CisJCXByb21fcHJpbnRmKCIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwllbnRyeSA9ICgoKHU2NClyZXRzWzBdKSA8PCAzMikgfCByZXRzWzFdOworCisJcHJvbV9wcmludGYoIiBkb25lXG4iKTsKKworCXJlc2VydmVfbWVtKGJhc2UsIHNpemUpOworCisJcHJvbV9kZWJ1Zygib3BhbCBiYXNlICAgICA9IDB4JXhcbiIsIGJhc2UpOworCXByb21fZGVidWcoIm9wYWwgYWxpZ24gICAgPSAweCV4XG4iLCBhbGlnbik7CisJcHJvbV9kZWJ1Zygib3BhbCBlbnRyeSAgICA9IDB4JXhcbiIsIGVudHJ5KTsKKwlwcm9tX2RlYnVnKCJvcGFsIHNpemUgICAgID0gMHgleFxuIiwgKGxvbmcpc2l6ZSk7CisKKwlwcm9tX3NldHByb3Aob3BhbF9ub2RlLCAiL2libSxvcGFsIiwgIm9wYWwtYmFzZS1hZGRyZXNzIiwKKwkJICAgICAmYmFzZSwgc2l6ZW9mKGJhc2UpKTsKKwlwcm9tX3NldHByb3Aob3BhbF9ub2RlLCAiL2libSxvcGFsIiwgIm9wYWwtZW50cnktYWRkcmVzcyIsCisJCSAgICAgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKworI2lmZGVmIENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTAorCVJFTE9DKHByb21fb3BhbF9iYXNlKSA9IGJhc2U7CisJUkVMT0MocHJvbV9vcGFsX2VudHJ5KSA9IGVudHJ5OworI2VuZGlmCisJcHJvbV9kZWJ1ZygicHJvbV9pbnN0YW50aWF0ZV9vcGFsOiBlbmQuLi5cbiIpOworfQorCisjZW5kaWYgLyogQ09ORklHX1BQQ19QT1dFUk5WICovCiAKIC8qCiAgKiBBbGxvY2F0ZSByb29tIGZvciBhbmQgaW5zdGFudGlhdGUgUlRBUwpAQCAtMTMyNiw2ICsxNjA4LDEyIEBACiAJcHJvbV9zZXRwcm9wKHJ0YXNfbm9kZSwgIi9ydGFzIiwgImxpbnV4LHJ0YXMtZW50cnkiLAogCQkgICAgICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CiAKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKKwkvKiBQb3dlclZOIHRha2VvdmVyIGhhY2sgKi8KKwlSRUxPQyhwcm9tX3J0YXNfZGF0YSkgPSBiYXNlOworCVJFTE9DKHByb21fcnRhc19lbnRyeSkgPSBlbnRyeTsKKwlwcm9tX2dldHByb3AocnRhc19ub2RlLCAic3RhcnQtY3B1IiwgJlJFTE9DKHByb21fcnRhc19zdGFydF9jcHUpLCA0KTsKKyNlbmRpZgogCXByb21fZGVidWcoInJ0YXMgYmFzZSAgICAgPSAweCV4XG4iLCBiYXNlKTsKIAlwcm9tX2RlYnVnKCJydGFzIGVudHJ5ICAgID0gMHgleFxuIiwgZW50cnkpOwogCXByb21fZGVidWcoInJ0YXMgc2l6ZSAgICAgPSAweCV4XG4iLCAobG9uZylzaXplKTsKQEAgLTE1NDMsNyArMTgzMSw3IEBACiAJCSphY2tub3dsZWRnZSA9ICh1bnNpZ25lZCBsb25nKS0xOwogCiAJCWlmIChyZWcgIT0gX3Byb20tPmNwdSkgewotCQkJLyogUHJpbWFyeSBUaHJlYWQgb2Ygbm9uLWJvb3QgY3B1ICovCisJCQkvKiBQcmltYXJ5IFRocmVhZCBvZiBub24tYm9vdCBjcHUgb3IgYW55IHRocmVhZCAqLwogCQkJcHJvbV9wcmludGYoInN0YXJ0aW5nIGNwdSBodyBpZHggJWx1Li4uICIsIHJlZyk7CiAJCQljYWxsX3Byb20oInN0YXJ0LWNwdSIsIDMsIDAsIG5vZGUsCiAJCQkJICBzZWNvbmRhcnlfaG9sZCwgcmVnKTsKQEAgLTE2NTIsMTUgKzE5NDAsNiBAQAogCQlwcm9tX3NldHByb3AodmFsLCBwYXRoLCAibGludXgsYm9vdC1kaXNwbGF5IiwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwcm9tX2Nsb3NlX3N0ZGluKHZvaWQpCi17Ci0Jc3RydWN0IHByb21fdCAqX3Byb20gPSAmUkVMT0MocHJvbSk7Ci0JaWhhbmRsZSB2YWw7Ci0KLQlpZiAocHJvbV9nZXRwcm9wKF9wcm9tLT5jaG9zZW4sICJzdGRpbiIsICZ2YWwsIHNpemVvZih2YWwpKSA+IDApCi0JCWNhbGxfcHJvbSgiY2xvc2UiLCAxLCAwLCB2YWwpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwcm9tX2ZpbmRfbWFjaGluZV90eXBlKHZvaWQpCiB7CiAJc3RydWN0IHByb21fdCAqX3Byb20gPSAmUkVMT0MocHJvbSk7CkBAIC0xNjcxLDcgKzE5NTAsNyBAQAogCWludCB4OwogI2VuZGlmCiAKLQkvKiBMb29rIGZvciBhIFBvd2VyTWFjICovCisJLyogTG9vayBmb3IgYSBQb3dlck1hYyBvciBhIENlbGwgKi8KIAlsZW4gPSBwcm9tX2dldHByb3AoX3Byb20tPnJvb3QsICJjb21wYXRpYmxlIiwKIAkJCSAgIGNvbXBhdCwgc2l6ZW9mKGNvbXBhdCktMSk7CiAJaWYgKGxlbiA+IDApIHsKQEAgLTE2OTcsNyArMTk3NiwxMSBAQAogCQl9CiAJfQogI2lmZGVmIENPTkZJR19QUEM2NAotCS8qIElmIG5vdCBhIG1hYywgdHJ5IHRvIGZpZ3VyZSBvdXQgaWYgaXQncyBhbiBJQk0gcFNlcmllcyBvciBhbnkgb3RoZXIKKwkvKiBUcnkgdG8gZGV0ZWN0IE9QQUwgKi8KKwlpZiAoUEhBTkRMRV9WQUxJRChjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBBRERSKCIvaWJtLG9wYWwiKSkpKQorCQlyZXR1cm4gUExBVEZPUk1fT1BBTDsKKworCS8qIFRyeSB0byBmaWd1cmUgb3V0IGlmIGl0J3MgYW4gSUJNIHBTZXJpZXMgb3IgYW55IG90aGVyCiAJICogUEFQUiBjb21wbGlhbnQgcGxhdGZvcm0uIFdlIGFzc3VtZSBpdCBpcyBpZiA6CiAJICogIC0gL2RldmljZV90eXBlIGlzICJjaHJwIiAocGxlYXNlLCBkbyBOT1QgdXNlIHRoYXQgZm9yIGZ1dHVyZQogCSAqICAgIG5vbi1JQk0gZGVzaWducyAhCkBAIC0xOTI0LDcgKzIyMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgc29mZjsKIAl1bnNpZ25lZCBjaGFyICp2YWxwOwogCXN0YXRpYyBjaGFyIHBuYW1lW01BWF9QUk9QRVJUWV9OQU1FXTsKLQlpbnQgbCwgcm9vbTsKKwlpbnQgbCwgcm9vbSwgaGFzX3BoYW5kbGUgPSAwOwogCiAJZHRfcHVzaF90b2tlbihPRl9EVF9CRUdJTl9OT0RFLCBtZW1fc3RhcnQsIG1lbV9lbmQpOwogCkBAIC0yMDA4LDE5ICsyMjkxLDI2IEBACiAJCXZhbHAgPSBtYWtlX3Jvb20obWVtX3N0YXJ0LCBtZW1fZW5kLCBsLCA0KTsKIAkJY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgbm9kZSwgUkVMT0MocG5hbWUpLCB2YWxwLCBsKTsKIAkJKm1lbV9zdGFydCA9IF9BTElHTigqbWVtX3N0YXJ0LCA0KTsKKworCQlpZiAoIXN0cmNtcChSRUxPQyhwbmFtZSksIFJFTE9DKCJwaGFuZGxlIikpKQorCQkJaGFzX3BoYW5kbGUgPSAxOwogCX0KIAotCS8qIEFkZCBhICJsaW51eCxwaGFuZGxlIiBwcm9wZXJ0eS4gKi8KLQlzb2ZmID0gZHRfZmluZF9zdHJpbmcoUkVMT0MoImxpbnV4LHBoYW5kbGUiKSk7Ci0JaWYgKHNvZmYgPT0gMCkKLQkJcHJvbV9wcmludGYoIldBUk5JTkc6IENhbid0IGZpbmQgc3RyaW5nIGluZGV4IGZvciIKLQkJCSAgICAiIDxsaW51eC1waGFuZGxlPiBub2RlICVzXG4iLCBwYXRoKTsKLQllbHNlIHsKLQkJZHRfcHVzaF90b2tlbihPRl9EVF9QUk9QLCBtZW1fc3RhcnQsIG1lbV9lbmQpOwotCQlkdF9wdXNoX3Rva2VuKDQsIG1lbV9zdGFydCwgbWVtX2VuZCk7Ci0JCWR0X3B1c2hfdG9rZW4oc29mZiwgbWVtX3N0YXJ0LCBtZW1fZW5kKTsKLQkJdmFscCA9IG1ha2Vfcm9vbShtZW1fc3RhcnQsIG1lbV9lbmQsIDQsIDQpOwotCQkqKHUzMiAqKXZhbHAgPSBub2RlOworCS8qIEFkZCBhICJsaW51eCxwaGFuZGxlIiBwcm9wZXJ0eSBpZiBubyAicGhhbmRsZSIgcHJvcGVydHkgYWxyZWFkeQorCSAqIGV4aXN0ZWQgKGNhbiBoYXBwZW4gd2l0aCBPUEFMKQorCSAqLworCWlmICghaGFzX3BoYW5kbGUpIHsKKwkJc29mZiA9IGR0X2ZpbmRfc3RyaW5nKFJFTE9DKCJsaW51eCxwaGFuZGxlIikpOworCQlpZiAoc29mZiA9PSAwKQorCQkJcHJvbV9wcmludGYoIldBUk5JTkc6IENhbid0IGZpbmQgc3RyaW5nIGluZGV4IGZvciIKKwkJCQkgICAgIiA8bGludXgtcGhhbmRsZT4gbm9kZSAlc1xuIiwgcGF0aCk7CisJCWVsc2UgeworCQkJZHRfcHVzaF90b2tlbihPRl9EVF9QUk9QLCBtZW1fc3RhcnQsIG1lbV9lbmQpOworCQkJZHRfcHVzaF90b2tlbig0LCBtZW1fc3RhcnQsIG1lbV9lbmQpOworCQkJZHRfcHVzaF90b2tlbihzb2ZmLCBtZW1fc3RhcnQsIG1lbV9lbmQpOworCQkJdmFscCA9IG1ha2Vfcm9vbShtZW1fc3RhcnQsIG1lbV9lbmQsIDQsIDQpOworCQkJKih1MzIgKil2YWxwID0gbm9kZTsKKwkJfQogCX0KIAogCS8qIGRvIGFsbCBvdXIgY2hpbGRyZW4gKi8KQEAgLTI1MDQsNiArMjc5NCw3IEBACiAjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCiB9CiAKKwogLyoKICAqIFdlIGVudGVyIGhlcmUgZWFybHkgb24sIHdoZW4gdGhlIE9wZW4gRmlybXdhcmUgcHJvbSBpcyBzdGlsbAogICogaGFuZGxpbmcgZXhjZXB0aW9ucyBhbmQgdGhlIE1NVSBoYXNoIHRhYmxlIGZvciB1cy4KQEAgLTI1NTMsNiArMjg0NCw3IEBACiAJICogYmV0d2VlbiBwU2VyaWVzIFNNUCBhbmQgcFNlcmllcyBMUEFSCiAJICovCiAJUkVMT0Mob2ZfcGxhdGZvcm0pID0gcHJvbV9maW5kX21hY2hpbmVfdHlwZSgpOworCXByb21fcHJpbnRmKCJEZXRlY3RlZCBtYWNoaW5lIHR5cGU6ICV4XG4iLCBSRUxPQyhvZl9wbGF0Zm9ybSkpOwogCiAjaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCS8qIEJhaWwgaWYgdGhpcyBpcyBhIGtkdW1wIGtlcm5lbC4gKi8KQEAgLTI1NjUsNyArMjg1Nyw3IEBACiAJICovCiAJcHJvbV9jaGVja19pbml0cmQocjMsIHI0KTsKIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE9XRVJOVikKIAkvKgogCSAqIE9uIHBTZXJpZXMsIGluZm9ybSB0aGUgZmlybXdhcmUgYWJvdXQgb3VyIGNhcGFiaWxpdGllcwogCSAqLwpAQCAtMjYxMSwxNCArMjkwMywzMyBAQAogI2VuZGlmCiAKIAkvKgotCSAqIE9uIG5vbi1wb3dlcm1hY3MsIHRyeSB0byBpbnN0YW50aWF0ZSBSVEFTIGFuZCBwdXRzIGFsbCBDUFVzCi0JICogaW4gc3Bpbi1sb29wcy4gUG93ZXJNYWNzIGRvbid0IGhhdmUgYSB3b3JraW5nIFJUQVMgYW5kIHVzZQotCSAqIGEgZGlmZmVyZW50IHdheSB0byBzcGluIENQVXMKKwkgKiBPbiBub24tcG93ZXJtYWNzLCB0cnkgdG8gaW5zdGFudGlhdGUgUlRBUy4gUG93ZXJNYWNzIGRvbid0CisJICogaGF2ZSBhIHVzYWJsZSBSVEFTIGltcGxlbWVudGF0aW9uLgogCSAqLwotCWlmIChSRUxPQyhvZl9wbGF0Zm9ybSkgIT0gUExBVEZPUk1fUE9XRVJNQUMpIHsKKwlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pICE9IFBMQVRGT1JNX1BPV0VSTUFDICYmCisJICAgIFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9PUEFMKQogCQlwcm9tX2luc3RhbnRpYXRlX3J0YXMoKTsKKworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCS8qIERldGVjdCBIQUwgYW5kIHRyeSBpbnN0YW5jaWF0aW5nIGl0ICYgZG9pbmcgdGFrZW92ZXIgKi8KKwlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pID09IFBMQVRGT1JNX1BTRVJJRVNfTFBBUikgeworCQlwcm9tX3F1ZXJ5X29wYWwoKTsKKwkJaWYgKFJFTE9DKG9mX3BsYXRmb3JtKSA9PSBQTEFURk9STV9PUEFMKSB7CisJCQlwcm9tX29wYWxfaG9sZF9jcHVzKCk7CisJCQlwcm9tX29wYWxfdGFrZW92ZXIoKTsKKwkJfQorCX0gZWxzZSBpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pID09IFBMQVRGT1JNX09QQUwpCisJCXByb21faW5zdGFudGlhdGVfb3BhbCgpOworI2VuZGlmCisKKwkvKgorCSAqIE9uIG5vbi1wb3dlcm1hY3MsIHB1dCBhbGwgQ1BVcyBpbiBzcGluLWxvb3BzLgorCSAqCisJICogUG93ZXJNYWNzIHVzZSBhIGRpZmZlcmVudCBtZWNoYW5pc20gdG8gc3BpbiBDUFVzCisJICovCisJaWYgKFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9QT1dFUk1BQyAmJgorCSAgICBSRUxPQyhvZl9wbGF0Zm9ybSkgIT0gUExBVEZPUk1fT1BBTCkKIAkJcHJvbV9ob2xkX2NwdXMoKTsKLQl9CiAKIAkvKgogCSAqIEZpbGwgaW4gc29tZSBpbmZvcyBmb3IgdXNlIGJ5IHRoZSBrZXJuZWwgbGF0ZXIgb24KQEAgLTI2ODUsNyArMjk5NiwxMyBAQAogCXJlbG9jX2dvdDIoLW9mZnNldCk7CiAjZW5kaWYKIAotCV9fc3RhcnQoaGRyLCBrYmFzZSwgMCk7CisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMCisJLyogT1BBTCBlYXJseSBkZWJ1ZyBnZXRzIHRoZSBPUEFMIGJhc2UgJiBlbnRyeSBpbiByOCBhbmQgcjkgKi8KKwlfX3N0YXJ0KGhkciwga2Jhc2UsIDAsIDAsIDAsCisJCVJFTE9DKHByb21fb3BhbF9iYXNlKSwgUkVMT0MocHJvbV9vcGFsX2VudHJ5KSk7CisjZWxzZQorCV9fc3RhcnQoaGRyLCBrYmFzZSwgMCwgMCwgMCwgMCwgMCk7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXRfY2hlY2suc2ggYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdF9jaGVjay5zaAppbmRleCA5ZjgyZjQ5Li43MGY0Mjg2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdF9jaGVjay5zaAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdF9jaGVjay5zaApAQCAtMjAsNyArMjAsOSBAQAogX2VuZCBlbnRlcl9wcm9tIG1lbWNweSBtZW1zZXQgcmVsb2Nfb2Zmc2V0IF9fc2Vjb25kYXJ5X2hvbGQKIF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UgX19zZWNvbmRhcnlfaG9sZF9zcGlubG9vcCBfX3N0YXJ0CiBzdHJjbXAgc3RyY3B5IHN0cmxjcHkgc3RybGVuIHN0cm5jbXAgc3Ryc3RyIGxvZ29fbGludXhfY2x1dDIyNAotcmVsb2NfZ290MiBrZXJuc3RhcnRfYWRkciBtZW1zdGFydF9hZGRyIGxpbnV4X2Jhbm5lciIKK3JlbG9jX2dvdDIga2VybnN0YXJ0X2FkZHIgbWVtc3RhcnRfYWRkciBsaW51eF9iYW5uZXIgX3N0ZXh0CitvcGFsX3F1ZXJ5X3Rha2VvdmVyIG9wYWxfZG9fdGFrZW92ZXIgb3BhbF9lbnRlcl9ydGFzIG9wYWxfc2Vjb25kYXJ5X2VudHJ5Citib290X2NvbW1hbmRfbGluZSIKIAogTk09IiQxIgogT0JKPSIkMiIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggNDcxODdjYy4uNGUxMzMxYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTIsNyArMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCmluZGV4IDA1YjdkZDIuLjVkZTczZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtMzAsOSArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPHRyYWNlL3N5c2NhbGwuaD4KLSNpZmRlZiBDT05GSUdfUFBDMzIKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAKQEAgLTE0OTcsOSArMTQ5NCwxNCBAQAogCQlpZiAoaW5kZXggPCBQVF9GUFIwKSB7CiAJCQl0bXAgPSBwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgKGludCkgaW5kZXgpOwogCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IGZwaWR4ID0gaW5kZXggLSBQVF9GUFIwOworCiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwotCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpCi0JCQkJW1RTX0ZQUldJRFRIICogKGluZGV4IC0gUFRfRlBSMCldOworCQkJaWYgKGZwaWR4IDwgKFBUX0ZQU0NSIC0gUFRfRlBSMCkpCisJCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpCisJCQkJCVtmcGlkeCAqIFRTX0ZQUldJRFRIXTsKKwkJCWVsc2UKKwkJCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmZwc2NyLnZhbDsKIAkJfQogCQlyZXQgPSBwdXRfdXNlcih0bXAsIGRhdGFscCk7CiAJCWJyZWFrOwpAQCAtMTUyNSw5ICsxNTI3LDE0IEBACiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKIAkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBpbmRleCwgZGF0YSk7CiAJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgZnBpZHggPSBpbmRleCAtIFBUX0ZQUjA7CisKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0JCQkoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcikKLQkJCQlbVFNfRlBSV0lEVEggKiAoaW5kZXggLSBQVF9GUFIwKV0gPSBkYXRhOworCQkJaWYgKGZwaWR4IDwgKFBUX0ZQU0NSIC0gUFRfRlBSMCkpCisJCQkJKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpCisJCQkJCVtmcGlkeCAqIFRTX0ZQUldJRFRIXSA9IGRhdGE7CisJCQllbHNlCisJCQkJY2hpbGQtPnRocmVhZC5mcHNjci52YWwgPSBkYXRhOwogCQkJcmV0ID0gMDsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKaW5kZXggZDVjYTgyMy4uNTE3YjFkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggYjFkNzM4ZC4uNzdiYjc3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC0xMiw3ICsxMiw3IEBACiAKICN1bmRlZiBERUJVRwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggMjA5MTM1YS4uYzFjZTg2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAgKiBUaGlzIGlzIGNhbGxlZCB2ZXJ5IGVhcmx5IG9uIHRoZSBib290IHByb2Nlc3MsIGFmdGVyIGEgbWluaW1hbAogICogTU1VIGVudmlyb25tZW50IGhhcyBiZWVuIHNldCB1cCBidXQgYmVmb3JlIE1NVV9pbml0IGlzIGNhbGxlZC4KICAqLwotbm90cmFjZSB2b2lkIF9faW5pdCBtYWNoaW5lX2luaXQodW5zaWduZWQgbG9uZyBkdF9wdHIpCitub3RyYWNlIHZvaWQgX19pbml0IG1hY2hpbmVfaW5pdCh1NjQgZHRfcHRyKQogewogCWxvY2tkZXBfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggYWViZWYxMy4uMWE5ZGVhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMTIsNyArMTIsNyBAQAogCiAjdW5kZWYgREVCVUcKIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjc4LDE0ICsyNzgsMTQgQEAKIAogCURCRygiIC0+IGluaXRpYWxpemVfY2FjaGVfaW5mbygpXG4iKTsKIAotCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgImNwdSIpKTspIHsKKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJjcHUiKSB7CiAJCW51bV9jcHVzICs9IDE7CiAKLQkJLyogV2UncmUgYXNzdW1pbmcgKmFsbCogb2YgdGhlIENQVXMgaGF2ZSB0aGUgc2FtZQorCQkvKgorCQkgKiBXZSdyZSBhc3N1bWluZyAqYWxsKiBvZiB0aGUgQ1BVcyBoYXZlIHRoZSBzYW1lCiAJCSAqIGQtY2FjaGUgYW5kIGktY2FjaGUgc2l6ZXMuLi4gLVBldGVyCiAJCSAqLwotCi0JCWlmICggbnVtX2NwdXMgPT0gMSApIHsKKwkJaWYgKG51bV9jcHVzID09IDEpIHsKIAkJCWNvbnN0IHUzMiAqc2l6ZXAsICpsc2l6ZXA7CiAJCQl1MzIgc2l6ZSwgbHNpemU7CiAKQEAgLTI5NCwxMCArMjk0LDEzIEBACiAJCQlzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImQtY2FjaGUtc2l6ZSIsIE5VTEwpOwogCQkJaWYgKHNpemVwICE9IE5VTEwpCiAJCQkJc2l6ZSA9ICpzaXplcDsKLQkJCWxzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImQtY2FjaGUtYmxvY2stc2l6ZSIsIE5VTEwpOworCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1ibG9jay1zaXplIiwKKwkJCQkJCSBOVUxMKTsKIAkJCS8qIGZhbGxiYWNrIGlmIGJsb2NrIHNpemUgbWlzc2luZyAqLwogCQkJaWYgKGxzaXplcCA9PSBOVUxMKQotCQkJCWxzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImQtY2FjaGUtbGluZS1zaXplIiwgTlVMTCk7CisJCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLAorCQkJCQkJCSAiZC1jYWNoZS1saW5lLXNpemUiLAorCQkJCQkJCSBOVUxMKTsKIAkJCWlmIChsc2l6ZXAgIT0gTlVMTCkKIAkJCQlsc2l6ZSA9ICpsc2l6ZXA7CiAJCQlpZiAoc2l6ZXAgPT0gMCB8fCBsc2l6ZXAgPT0gMCkKQEAgLTMxNCw5ICszMTcsMTIgQEAKIAkJCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1zaXplIiwgTlVMTCk7CiAJCQlpZiAoc2l6ZXAgIT0gTlVMTCkKIAkJCQlzaXplID0gKnNpemVwOwotCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1ibG9jay1zaXplIiwgTlVMTCk7CisJCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpLWNhY2hlLWJsb2NrLXNpemUiLAorCQkJCQkJIE5VTEwpOwogCQkJaWYgKGxzaXplcCA9PSBOVUxMKQotCQkJCWxzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImktY2FjaGUtbGluZS1zaXplIiwgTlVMTCk7CisJCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLAorCQkJCQkJCSAiaS1jYWNoZS1saW5lLXNpemUiLAorCQkJCQkJCSBOVUxMKTsKIAkJCWlmIChsc2l6ZXAgIT0gTlVMTCkKIAkJCQlsc2l6ZSA9ICpsc2l6ZXA7CiAJCQlpZiAoc2l6ZXAgPT0gMCB8fCBsc2l6ZXAgPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IGU5MWM3MzYuLmE1MGI1ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDdiZjIxODcuLjZkZjcwOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtMTgsNyArMTgsNyBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNzAsNiArNzAsMTAgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaWRsZV90aHJlYWRfYXJyYXkpOwogI2RlZmluZSBnZXRfaWRsZV9mb3JfY3B1KHgpICAgICAgKHBlcl9jcHUoaWRsZV90aHJlYWRfYXJyYXksIHgpKQogI2RlZmluZSBzZXRfaWRsZV9mb3JfY3B1KHgsIHApICAgKHBlcl9jcHUoaWRsZV90aHJlYWRfYXJyYXksIHgpID0gKHApKQorCisvKiBTdGF0ZSBvZiBlYWNoIENQVSBkdXJpbmcgaG90cGx1ZyBwaGFzZXMgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSkgPSB7IDAgfTsKKwogI2Vsc2UKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGVfdGhyZWFkX2FycmF5W05SX0NQVVNdIF9fY3B1aW5pdGRhdGEgOwogI2RlZmluZSBnZXRfaWRsZV9mb3JfY3B1KHgpICAgICAgKGlkbGVfdGhyZWFkX2FycmF5Wyh4KV0pCkBAIC0xMDQsMTIgKzEwOCwyNSBAQAogCSAqIGNwdV9zdGFydCBmaWVsZCB0byBiZWNvbWUgbm9uLXplcm8gQWZ0ZXIgd2Ugc2V0IGNwdV9zdGFydCwKIAkgKiB0aGUgcHJvY2Vzc29yIHdpbGwgY29udGludWUgb24gdG8gc2Vjb25kYXJ5X3N0YXJ0CiAJICovCi0JcGFjYVtucl0uY3B1X3N0YXJ0ID0gMTsKLQlzbXBfbWIoKTsKKwlpZiAoIXBhY2FbbnJdLmNwdV9zdGFydCkgeworCQlwYWNhW25yXS5jcHVfc3RhcnQgPSAxOworCQlzbXBfbWIoKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLyoKKwkgKiBPayBpdCdzIG5vdCB0aGVyZSwgc28gaXQgbWlnaHQgYmUgc29mdC11bnBsdWdnZWQsIGxldCdzCisJICogdHJ5IHRvIGJyaW5nIGl0IGJhY2sKKwkgKi8KKwlwZXJfY3B1KGNwdV9zdGF0ZSwgbnIpID0gQ1BVX1VQX1BSRVBBUkU7CisJc21wX3dtYigpOworCXNtcF9zZW5kX3Jlc2NoZWR1bGUobnIpOworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogc3RhdGljIGlycXJldHVybl90IGNhbGxfZnVuY3Rpb25fYWN0aW9uKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CkBAIC0xNzAsNyArMTg3LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogI2VuZGlmCi0JZXJyID0gcmVxdWVzdF9pcnEodmlycSwgc21wX2lwaV9hY3Rpb25bbXNnXSwgSVJRRl9ESVNBQkxFRHxJUlFGX1BFUkNQVSwKKwllcnIgPSByZXF1ZXN0X2lycSh2aXJxLCBzbXBfaXBpX2FjdGlvblttc2ddLCBJUlFGX1BFUkNQVSwKIAkJCSAgc21wX2lwaV9uYW1lW21zZ10sIDApOwogCVdBUk4oZXJyIDwgMCwgInVuYWJsZSB0byByZXF1ZXN0X2lycSAlZCBmb3IgJXMgKHJjICVkKVxuIiwKIAkJdmlycSwgc21wX2lwaV9uYW1lW21zZ10sIGVycik7CkBAIC0zNTcsOCArMzc0LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotLyogU3RhdGUgb2YgZWFjaCBDUFUgZHVyaW5nIGhvdHBsdWcgcGhhc2VzICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBjcHVfc3RhdGUpID0geyAwIH07CiAKIGludCBnZW5lcmljX2NwdV9kaXNhYmxlKHZvaWQpCiB7CkBAIC00MDYsNiArNDIxLDExIEBACiB7CiAJcGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPSBDUFVfREVBRDsKIH0KKworaW50IGdlbmVyaWNfY2hlY2tfY3B1X3Jlc3RhcnQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gcGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPT0gQ1BVX1VQX1BSRVBBUkU7Cit9CiAjZW5kaWYKIAogc3RydWN0IGNyZWF0ZV9pZGxlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggYjBkYmIxZC4uM2QzMGVmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3AuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwLmMKaW5kZXggYWExN2I3Ni4uNjQxZjlhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3AuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcC5jCkBAIC0zMyw2ICszMyw2IEBACiB2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BQQzMyCi0Jc3dpdGNoX21tdV9jb250ZXh0KE5VTEwsIGN1cnJlbnQtPmFjdGl2ZV9tbSk7CisJc3dpdGNoX21tdV9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbSwgY3VycmVudC0+YWN0aXZlX21tKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3BfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwXzY0LmMKaW5kZXggNmYzZjA2OS4uMTY4ZTg4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3BfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcF82NC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiB2b2lkIGRvX2FmdGVyX2NvcHliYWNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggZjBmMjE5OS4uY2UwMzVjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCAwM2IyOWE2Li41MjJiYjFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtMzMsNyArMzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCBmMTlkOTc3Li40ZTU5MDgyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC00NTcsNyArNDU3LDE0IEBACiAKIAlpZiAocmVhc29uICYgTUNTUl9EQ1BFUlJfTUMpIHsKIAkJcHJpbnRrKCJEYXRhIENhY2hlIFBhcml0eSBFcnJvclxuIik7Ci0JCXJlY292ZXJhYmxlID0gMDsKKworCQkvKgorCQkgKiBJbiB3cml0ZSBzaGFkb3cgbW9kZSB3ZSBhdXRvLXJlY292ZXIgZnJvbSB0aGUgZXJyb3IsIGJ1dCBpdAorCQkgKiBtYXkgc3RpbGwgZ2V0IGxvZ2dlZCBhbmQgY2F1c2UgYSBtYWNoaW5lIGNoZWNrLiAgV2Ugc2hvdWxkCisJCSAqIG9ubHkgdHJlYXQgdGhlIG5vbi13cml0ZSBzaGFkb3cgY2FzZSBhcyBub24tcmVjb3ZlcmFibGUuCisJCSAqLworCQlpZiAoIShtZnNwcihTUFJOX0wxQ1NSMikgJiBMMUNTUjJfRENXUykpCisJCQlyZWNvdmVyYWJsZSA9IDA7CiAJfQogCiAJaWYgKHJlYXNvbiAmIE1DU1JfTDJNTVVfTUhJVCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYwppbmRleCBiNDYwN2E5Li41N2ZhMmMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYwpAQCAtNjksNiArNjksMTIgQEAKIAl1ZGJnX2luaXRfd3NwKCk7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfRUFSTFlfREVCVUdfRUhWX0JDKQogCXVkYmdfaW5pdF9laHZfYmMoKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19QUzNHRUxJQykKKwl1ZGJnX2luaXRfcHMzZ2VsaWMoKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX1JBVykKKwl1ZGJnX2luaXRfZGVidWdfb3BhbF9yYXcoKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX0hWU0kpCisJdWRiZ19pbml0X2RlYnVnX29wYWxfaHZzaSgpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IDE0MmFiMTAuLjdkMTRiYjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtOSw3ICs5LDYgQEAKICAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwppbmRleCAxYjY5NWZkLi5mNjVhZjYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKQEAgLTE1LDExICsxNSwxMiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgpAQCAtNjA1LDE1ICs2MDYsMjAgQEAKICAgICAgICAgcmV0dXJuIGRtYV9pb21tdV9vcHMuZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOwogfQogCi1zdHJ1Y3QgZG1hX21hcF9vcHMgdmlvX2RtYV9tYXBwaW5nX29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSB2aW9fZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50ICA9IHZpb19kbWFfaW9tbXVfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NnICAgICAgICAgPSB2aW9fZG1hX2lvbW11X21hcF9zZywKLQkudW5tYXBfc2cgICAgICAgPSB2aW9fZG1hX2lvbW11X3VubWFwX3NnLAotCS5tYXBfcGFnZSAgICAgICA9IHZpb19kbWFfaW9tbXVfbWFwX3BhZ2UsCi0JLnVubWFwX3BhZ2UgICAgID0gdmlvX2RtYV9pb21tdV91bm1hcF9wYWdlLAotCS5kbWFfc3VwcG9ydGVkICA9IHZpb19kbWFfaW9tbXVfZG1hX3N1cHBvcnRlZCwKK3N0YXRpYyB1NjQgdmlvX2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgICAgICAgIHJldHVybiBkbWFfaW9tbXVfb3BzLmdldF9yZXF1aXJlZF9tYXNrKGRldik7Cit9CiAKK3N0cnVjdCBkbWFfbWFwX29wcyB2aW9fZG1hX21hcHBpbmdfb3BzID0geworCS5hbGxvY19jb2hlcmVudCAgICA9IHZpb19kbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgICAgID0gdmlvX2RtYV9pb21tdV9mcmVlX2NvaGVyZW50LAorCS5tYXBfc2cgICAgICAgICAgICA9IHZpb19kbWFfaW9tbXVfbWFwX3NnLAorCS51bm1hcF9zZyAgICAgICAgICA9IHZpb19kbWFfaW9tbXVfdW5tYXBfc2csCisJLm1hcF9wYWdlICAgICAgICAgID0gdmlvX2RtYV9pb21tdV9tYXBfcGFnZSwKKwkudW5tYXBfcGFnZSAgICAgICAgPSB2aW9fZG1hX2lvbW11X3VubWFwX3BhZ2UsCisJLmRtYV9zdXBwb3J0ZWQgICAgID0gdmlvX2RtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAorCS5nZXRfcmVxdWlyZWRfbWFzayA9IHZpb19kbWFfZ2V0X3JlcXVpcmVkX21hc2ssCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vNDR4LmMgYi9hcmNoL3Bvd2VycGMva3ZtLzQ0eC5jCmluZGV4IGRhM2ExMjIuLjdiNjEyYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vNDR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS80NHguYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpAQCAtNzgsNiArNzksOCBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZjcHVfNDR4LT5zaGFkb3dfcmVmcyk7IGkrKykKIAkJdmNwdV80NHgtPnNoYWRvd19yZWZzW2ldLmd0bGJfaW5kZXggPSAtMTsKIAorCXZjcHUtPmFyY2guY3B1X3R5cGUgPSBLVk1fQ1BVXzQ0MDsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQppbmRleCAwODQyOGUyLi4zNjg4YWVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKQEAgLTQzLDE4ICs0MywyMiBAQAogCWZwdS5vIFwKIAlib29rM3NfcGFpcmVkX3NpbmdsZXMubyBcCiAJYm9vazNzX3ByLm8gXAorCWJvb2szc19wcl9wYXByLm8gXAogCWJvb2szc19lbXVsYXRlLm8gXAogCWJvb2szc19pbnRlcnJ1cHRzLm8gXAogCWJvb2szc19tbXVfaHB0ZS5vIFwKIAlib29rM3NfNjRfbW11X2hvc3QubyBcCiAJYm9vazNzXzY0X21tdS5vIFwKIAlib29rM3NfMzJfbW11Lm8KK2t2bS1ib29rM3NfNjQtYnVpbHRpbi1vYmpzLSQoQ09ORklHX0tWTV9CT09LM1NfNjRfUFIpIDo9IFwKKwlib29rM3Nfcm1oYW5kbGVycy5vCiAKIGt2bS1ib29rM3NfNjQtb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hWKSA6PSBcCiAJYm9vazNzX2h2Lm8gXAogCWJvb2szc19odl9pbnRlcnJ1cHRzLm8gXAogCWJvb2szc182NF9tbXVfaHYubwoga3ZtLWJvb2szc182NC1idWlsdGluLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NF9IVikgOj0gXAorCWJvb2szc19odl9ybWhhbmRsZXJzLm8gXAogCWJvb2szc19odl9ybV9tbXUubyBcCiAJYm9vazNzXzY0X3Zpb19odi5vIFwKIAlib29rM3NfaHZfYnVpbHRpbi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwppbmRleCBmNjhhMzRkLi5hNDU5NDc5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3JlZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfc3IuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzMyX3NyLlMKaW5kZXggMzYwODQ3MS4uN2UwNmE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfMzJfc3IuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc18zMl9zci5TCkBAIC0zMSw3ICszMSw3IEBACiAJICogUjEgPSBob3N0IFIxCiAJICogUjIgPSBob3N0IFIyCiAJICogUjMgPSBzaGFkb3cgdmNwdQotCSAqIGFsbCBvdGhlciB2b2xhdGlsZSBHUFJTID0gZnJlZQorCSAqIGFsbCBvdGhlciB2b2xhdGlsZSBHUFJTID0gZnJlZSBleGNlcHQgUjQsIFI2CiAJICogU1ZDUFVbQ1JdICA9IGd1ZXN0IENSCiAJICogU1ZDUFVbWEVSXSA9IGd1ZXN0IFhFUgogCSAqIFNWQ1BVW0NUUl0gPSBndWVzdCBDVFIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X21tdS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMKaW5kZXggYzZkM2UxOS4uYjg3MTcyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfNjRfbW11LmMKQEAgLTEyOCw3ICsxMjgsMTMgQEAKIAlkcHJpbnRrKCJNTVU6IHBhZ2U9MHgleCBzZHIxPTB4JWxseCBwdGVnPTB4JWxseCB2c2lkPTB4JWxseFxuIiwKIAkJcGFnZSwgdmNwdV9ib29rM3MtPnNkcjEsIHB0ZWcsIHNsYmUtPnZzaWQpOwogCi0JciA9IGdmbl90b19odmEodmNwdV9ib29rM3MtPnZjcHUua3ZtLCBwdGVnID4+IFBBR0VfU0hJRlQpOworCS8qIFdoZW4gcnVubmluZyBhIFBBUFIgZ3Vlc3QsIFNEUjEgY29udGFpbnMgYSBIVkEgYWRkcmVzcyBpbnN0ZWFkCisgICAgICAgICAgIG9mIGEgR1BBICovCisJaWYgKHZjcHVfYm9vazNzLT52Y3B1LmFyY2gucGFwcl9lbmFibGVkKQorCQlyID0gcHRlZzsKKwllbHNlCisJCXIgPSBnZm5fdG9faHZhKHZjcHVfYm9vazNzLT52Y3B1Lmt2bSwgcHRlZyA+PiBQQUdFX1NISUZUKTsKKwogCWlmIChrdm1faXNfZXJyb3JfaHZhKHIpKQogCQlyZXR1cm4gcjsKIAlyZXR1cm4gciB8IChwdGVnICYgflBBR0VfTUFTSyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc182NF9zbGIuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TCmluZGV4IDA0ZTdkM2IuLmYyZTZlNDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzXzY0X3NsYi5TCkBAIC01Myw3ICs1Myw3IEBACiAJICogUjEgPSBob3N0IFIxCiAJICogUjIgPSBob3N0IFIyCiAJICogUjMgPSBzaGFkb3cgdmNwdQotCSAqIGFsbCBvdGhlciB2b2xhdGlsZSBHUFJTID0gZnJlZQorCSAqIGFsbCBvdGhlciB2b2xhdGlsZSBHUFJTID0gZnJlZSBleGNlcHQgUjQsIFI2CiAJICogU1ZDUFVbQ1JdICA9IGd1ZXN0IENSCiAJICogU1ZDUFVbWEVSXSA9IGd1ZXN0IFhFUgogCSAqIFNWQ1BVW0NUUl0gPSBndWVzdCBDVFIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2VtdWxhdGUuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2VtdWxhdGUuYwppbmRleCA0NjY4NDY1Li4wYzlkYzYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19lbXVsYXRlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZW11bGF0ZS5jCkBAIC02Myw2ICs2MywyNSBAQAogICogZnVuY3Rpb24gcG9pbnRlcnMsIHNvIGxldCdzIGp1c3QgZGlzYWJsZSB0aGUgZGVmaW5lLiAqLwogI3VuZGVmIG1mc3JpbgogCitlbnVtIHByaXZfbGV2ZWwgeworCVBSSVZfUFJPQkxFTSA9IDAsCisJUFJJVl9TVVBFUiA9IDEsCisJUFJJVl9IWVBFUiA9IDIsCit9OworCitzdGF0aWMgYm9vbCBzcHJfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGVudW0gcHJpdl9sZXZlbCBsZXZlbCkKK3sKKwkvKiBQQVBSIFZNcyBvbmx5IGFjY2VzcyBzdXBlcnZpc29yIFNQUnMgKi8KKwlpZiAodmNwdS0+YXJjaC5wYXByX2VuYWJsZWQgJiYgKGxldmVsID4gUFJJVl9TVVBFUikpCisJCXJldHVybiBmYWxzZTsKKworCS8qIExpbWl0IHVzZXIgc3BhY2UgdG8gaXRzIG93biBzbWFsbCBTUFIgc2V0ICovCisJaWYgKCh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1BSKSAmJiBsZXZlbCA+IFBSSVZfUFJPQkxFTSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIGludCBrdm1wcGNfY29yZV9lbXVsYXRlX29wKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnN0LCBpbnQgKmFkdmFuY2UpCiB7CkBAIC0yOTYsNiArMzE1LDggQEAKIAogCXN3aXRjaCAoc3BybikgewogCWNhc2UgU1BSTl9TRFIxOgorCQlpZiAoIXNwcl9hbGxvd2VkKHZjcHUsIFBSSVZfSFlQRVIpKQorCQkJZ290byB1bnByaXZpbGVnZWQ7CiAJCXRvX2Jvb2szcyh2Y3B1KS0+c2RyMSA9IHNwcl92YWw7CiAJCWJyZWFrOwogCWNhc2UgU1BSTl9EU0lTUjoKQEAgLTM5MCw2ICs0MTEsNyBAQAogCWNhc2UgU1BSTl9QTUM0X0dFS0tPOgogCWNhc2UgU1BSTl9XUEFSX0dFS0tPOgogCQlicmVhazsKK3VucHJpdmlsZWdlZDoKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9JTkZPICJLVk06IGludmFsaWQgU1BSIHdyaXRlOiAlZFxuIiwgc3Bybik7CiAjaWZuZGVmIERFQlVHX1NQUgpAQCAtNDIxLDYgKzQ0Myw4IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIFNQUk5fU0RSMToKKwkJaWYgKCFzcHJfYWxsb3dlZCh2Y3B1LCBQUklWX0hZUEVSKSkKKwkJCWdvdG8gdW5wcml2aWxlZ2VkOwogCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBydCwgdG9fYm9vazNzKHZjcHUpLT5zZHIxKTsKIAkJYnJlYWs7CiAJY2FzZSBTUFJOX0RTSVNSOgpAQCAtNDQ5LDYgKzQ3MywxMCBAQAogCWNhc2UgU1BSTl9ISUQ1OgogCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBydCwgdG9fYm9vazNzKHZjcHUpLT5oaWRbNV0pOwogCQlicmVhazsKKwljYXNlIFNQUk5fQ0ZBUjoKKwljYXNlIFNQUk5fUFVSUjoKKwkJa3ZtcHBjX3NldF9ncHIodmNwdSwgcnQsIDApOworCQlicmVhazsKIAljYXNlIFNQUk5fR1FSMDoKIAljYXNlIFNQUk5fR1FSMToKIAljYXNlIFNQUk5fR1FSMjoKQEAgLTQ3Niw2ICs1MDQsNyBAQAogCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCBydCwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Cit1bnByaXZpbGVnZWQ6CiAJCXByaW50ayhLRVJOX0lORk8gIktWTTogaW52YWxpZCBTUFIgcmVhZDogJWRcbiIsIHNwcm4pOwogI2lmbmRlZiBERUJVR19TUFIKIAkJZW11bGF0ZWQgPSBFTVVMQVRFX0ZBSUw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19leHBvcnRzLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19leHBvcnRzLmMKaW5kZXggODhjOGYyNi4uYTE1MDgxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZXhwb3J0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2V4cG9ydHMuYwpAQCAtMTcsMTUgKzE3LDEzIEBACiAgKiBBdXRob3JzOiBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3MuaD4KIAogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCiBFWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfaHZfZW50cnlfdHJhbXBvbGluZSk7CiAjZWxzZQotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfaGFuZGxlcl9sb3dtZW1fdHJhbXBvbGluZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfcm1jYWxsKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19lbnRyeV90cmFtcG9saW5lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19sb2FkX3VwX2ZwdSk7CiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY19sb2FkX3VwX2FsdGl2ZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKaW5kZXggY2MwZDdmMS4uMGNkYmMwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Fub25faW5vZGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgpAQCAtNjIsNiArNjMsOCBAQAogLyogI2RlZmluZSBFWElUX0RFQlVHX1NJTVBMRSAqLwogLyogI2RlZmluZSBFWElUX0RFQlVHX0lOVCAqLwogCitzdGF0aWMgdm9pZCBrdm1wcGNfZW5kX2NlZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwogdm9pZCBrdm1wcGNfY29yZV92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQogewogCWxvY2FsX3BhY2EtPmt2bV9oc3RhdGUua3ZtX3ZjcHUgPSB2Y3B1OwpAQCAtNzIsNDAgKzc1LDEwIEBACiB7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bXBwY192Y3B1X2Jsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLXN0YXRpYyB2b2lkIGt2bXBwY192Y3B1X3VuYmxvY2tlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotCi12b2lkIGt2bXBwY192Y3B1X2Jsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1NjQgbm93OwotCXVuc2lnbmVkIGxvbmcgZGVjX25zZWM7Ci0KLQlub3cgPSBnZXRfdGIoKTsKLQlpZiAobm93ID49IHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgJiYgIWt2bXBwY19jb3JlX3BlbmRpbmdfZGVjKHZjcHUpKQotCQlrdm1wcGNfY29yZV9xdWV1ZV9kZWModmNwdSk7Ci0JaWYgKHZjcHUtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKQotCQlyZXR1cm47Ci0JaWYgKHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgIT0gfih1NjQpMCkgewotCQlkZWNfbnNlYyA9ICh2Y3B1LT5hcmNoLmRlY19leHBpcmVzIC0gbm93KSAqIE5TRUNfUEVSX1NFQyAvCi0JCQl0Yl90aWNrc19wZXJfc2VjOwotCQlocnRpbWVyX3N0YXJ0KCZ2Y3B1LT5hcmNoLmRlY190aW1lciwga3RpbWVfc2V0KDAsIGRlY19uc2VjKSwKLQkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOwotCX0KLQotCWt2bXBwY192Y3B1X2Jsb2NrZWQodmNwdSk7Ci0KLQlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKLQl2Y3B1LT5zdGF0LmhhbHRfd2FrZXVwKys7Ci0KLQlpZiAodmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAhPSB+KHU2NCkwKQotCQlocnRpbWVyX3RyeV90b19jYW5jZWwoJnZjcHUtPmFyY2guZGVjX3RpbWVyKTsKLQotCWt2bXBwY192Y3B1X3VuYmxvY2tlZCh2Y3B1KTsKLX0KLQogdm9pZCBrdm1wcGNfc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBtc3IpCiB7CiAJdmNwdS0+YXJjaC5zaHJlZ3MubXNyID0gbXNyOworCWt2bXBwY19lbmRfY2VkZSh2Y3B1KTsKIH0KIAogdm9pZCBrdm1wcGNfc2V0X3B2cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBwdnIpCkBAIC0yNTcsMTUgKzIzMCw2IEBACiAKIAlzd2l0Y2ggKHJlcSkgewogCWNhc2UgSF9DRURFOgotCQl2Y3B1LT5hcmNoLnNocmVncy5tc3IgfD0gTVNSX0VFOwotCQl2Y3B1LT5hcmNoLmNlZGVkID0gMTsKLQkJc21wX21iKCk7Ci0JCWlmICghdmNwdS0+YXJjaC5wcm9kZGVkKQotCQkJa3ZtcHBjX3ZjcHVfYmxvY2sodmNwdSk7Ci0JCWVsc2UKLQkJCXZjcHUtPmFyY2gucHJvZGRlZCA9IDA7Ci0JCXNtcF9tYigpOwotCQl2Y3B1LT5hcmNoLmNlZGVkID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBIX1BST0Q6CiAJCXRhcmdldCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDQpOwpAQCAtMzg4LDIwICszNTIsNiBAQAogCQlicmVhazsKIAl9CiAKLQotCWlmICghKHIgJiBSRVNVTUVfSE9TVCkpIHsKLQkJLyogVG8gYXZvaWQgY2xvYmJlcmluZyBleGl0X3JlYXNvbiwgb25seSBjaGVjayBmb3Igc2lnbmFscyBpZgotCQkgKiB3ZSBhcmVuJ3QgYWxyZWFkeSBleGl0aW5nIHRvIHVzZXJzcGFjZSBmb3Igc29tZSBvdGhlcgotCQkgKiByZWFzb24uICovCi0JCWlmIChzaWduYWxfcGVuZGluZyh0c2spKSB7Ci0JCQl2Y3B1LT5zdGF0LnNpZ25hbF9leGl0cysrOwotCQkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7Ci0JCQlyID0gLUVJTlRSOwotCQl9IGVsc2UgewotCQkJa3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHZjcHUpOwotCQl9Ci0JfQotCiAJcmV0dXJuIHI7CiB9CiAKQEAgLTQ3OSwxMyArNDI5LDkgQEAKIAlrdm1wcGNfbW11X2Jvb2szc19odl9pbml0KHZjcHUpOwogCiAJLyoKLQkgKiBTb21lIHZjcHVzIG1heSBzdGFydCBvdXQgaW4gc3RvcHBlZCBzdGF0ZS4gIElmIHdlIGluaXRpYWxpemUKLQkgKiB0aGVtIHRvIGJ1c3ktaW4taG9zdCBzdGF0ZSB0aGV5IHdpbGwgc3RvcCBvdGhlciB2Y3B1cyBpbiB0aGUKLQkgKiB2Y29yZSBmcm9tIHJ1bm5pbmcuICBJbnN0ZWFkIHdlIGluaXRpYWxpemUgdGhlbSB0byBibG9ja2VkCi0JICogc3RhdGUsIGVmZmVjdGl2ZWx5IGNvbnNpZGVyaW5nIHRoZW0gdG8gYmUgc3RvcHBlZCB1bnRpbCB3ZQotCSAqIHNlZSB0aGUgZmlyc3QgcnVuIGlvY3RsIGZvciB0aGVtLgorCSAqIFdlIGNvbnNpZGVyIHRoZSB2Y3B1IHN0b3BwZWQgdW50aWwgd2Ugc2VlIHRoZSBmaXJzdCBydW4gaW9jdGwgZm9yIGl0LgogCSAqLwotCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CTE9DS0VEOworCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9TVE9QUEVEOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdmNwdS0+YXJjaC5jcHVfcnVuKTsKIApAQCAtNDk2LDYgKzQ0Miw3IEBACiAJCWlmICh2Y29yZSkgewogCQkJSU5JVF9MSVNUX0hFQUQoJnZjb3JlLT5ydW5uYWJsZV90aHJlYWRzKTsKIAkJCXNwaW5fbG9ja19pbml0KCZ2Y29yZS0+bG9jayk7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Y29yZS0+d3EpOwogCQl9CiAJCWt2bS0+YXJjaC52Y29yZXNbY29yZV0gPSB2Y29yZTsKIAl9CkBAIC01MDYsMTAgKzQ1MywxMiBAQAogCiAJc3Bpbl9sb2NrKCZ2Y29yZS0+bG9jayk7CiAJKyt2Y29yZS0+bnVtX3RocmVhZHM7Ci0JKyt2Y29yZS0+bl9ibG9ja2VkOwogCXNwaW5fdW5sb2NrKCZ2Y29yZS0+bG9jayk7CiAJdmNwdS0+YXJjaC52Y29yZSA9IHZjb3JlOwogCisJdmNwdS0+YXJjaC5jcHVfdHlwZSA9IEtWTV9DUFVfM1NfNjQ7CisJa3ZtcHBjX3Nhbml0eV9jaGVjayh2Y3B1KTsKKwogCXJldHVybiB2Y3B1OwogCiBmcmVlX3ZjcHU6CkBAIC01MjQsMzAgKzQ3MywzMSBAQAogCWtmcmVlKHZjcHUpOwogfQogCi1zdGF0aWMgdm9pZCBrdm1wcGNfdmNwdV9ibG9ja2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyB2b2lkIGt2bXBwY19zZXRfdGltZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjID0gdmNwdS0+YXJjaC52Y29yZTsKKwl1bnNpZ25lZCBsb25nIGRlY19uc2VjLCBub3c7CiAKLQlzcGluX2xvY2soJnZjLT5sb2NrKTsKLQl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfQkxPQ0tFRDsKLQkrK3ZjLT5uX2Jsb2NrZWQ7Ci0JaWYgKHZjLT5uX3J1bm5hYmxlID4gMCAmJgotCSAgICB2Yy0+bl9ydW5uYWJsZSArIHZjLT5uX2Jsb2NrZWQgPT0gdmMtPm51bV90aHJlYWRzKSB7Ci0JCXZjcHUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2Yy0+cnVubmFibGVfdGhyZWFkcywgc3RydWN0IGt2bV92Y3B1LAotCQkJCQlhcmNoLnJ1bl9saXN0KTsKLQkJd2FrZV91cCgmdmNwdS0+YXJjaC5jcHVfcnVuKTsKKwlub3cgPSBnZXRfdGIoKTsKKwlpZiAobm93ID4gdmNwdS0+YXJjaC5kZWNfZXhwaXJlcykgeworCQkvKiBkZWNyZW1lbnRlciBoYXMgYWxyZWFkeSBnb25lIG5lZ2F0aXZlICovCisJCWt2bXBwY19jb3JlX3F1ZXVlX2RlYyh2Y3B1KTsKKwkJa3ZtcHBjX2NvcmVfZGVsaXZlcl9pbnRlcnJ1cHRzKHZjcHUpOworCQlyZXR1cm47CiAJfQotCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJZGVjX25zZWMgPSAodmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAtIG5vdykgKiBOU0VDX1BFUl9TRUMKKwkJICAgLyB0Yl90aWNrc19wZXJfc2VjOworCWhydGltZXJfc3RhcnQoJnZjcHUtPmFyY2guZGVjX3RpbWVyLCBrdGltZV9zZXQoMCwgZGVjX25zZWMpLAorCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKKwl2Y3B1LT5hcmNoLnRpbWVyX3J1bm5pbmcgPSAxOwogfQogCi1zdGF0aWMgdm9pZCBrdm1wcGNfdmNwdV91bmJsb2NrZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHZvaWQga3ZtcHBjX2VuZF9jZWRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YyA9IHZjcHUtPmFyY2gudmNvcmU7Ci0KLQlzcGluX2xvY2soJnZjLT5sb2NrKTsKLQl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfQlVTWV9JTl9IT1NUOwotCS0tdmMtPm5fYmxvY2tlZDsKLQlzcGluX3VubG9jaygmdmMtPmxvY2spOworCXZjcHUtPmFyY2guY2VkZWQgPSAwOworCWlmICh2Y3B1LT5hcmNoLnRpbWVyX3J1bm5pbmcpIHsKKwkJaHJ0aW1lcl90cnlfdG9fY2FuY2VsKCZ2Y3B1LT5hcmNoLmRlY190aW1lcik7CisJCXZjcHUtPmFyY2gudGltZXJfcnVubmluZyA9IDA7CisJfQogfQogCiBleHRlcm4gaW50IF9fa3ZtcHBjX3Zjb3JlX2VudHJ5KHN0cnVjdCBrdm1fcnVuICprdm1fcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtNTYyLDYgKzUxMiw3IEBACiAJCXJldHVybjsKIAl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfQlVTWV9JTl9IT1NUOwogCS0tdmMtPm5fcnVubmFibGU7CisJKyt2Yy0+bl9idXN5OwogCS8qIGRlY3JlbWVudCB0aGUgcGh5c2ljYWwgdGhyZWFkIGlkIG9mIGVhY2ggZm9sbG93aW5nIHZjcHUgKi8KIAl2ID0gdmNwdTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHYsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkKQEAgLTU3NSwxNSArNTI2LDIwIEBACiAJc3RydWN0IHBhY2Ffc3RydWN0ICp0cGFjYTsKIAlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YyA9IHZjcHUtPmFyY2gudmNvcmU7CiAKKwlpZiAodmNwdS0+YXJjaC50aW1lcl9ydW5uaW5nKSB7CisJCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdmNwdS0+YXJjaC5kZWNfdGltZXIpOworCQl2Y3B1LT5hcmNoLnRpbWVyX3J1bm5pbmcgPSAwOworCX0KIAljcHUgPSB2Yy0+cGNwdSArIHZjcHUtPmFyY2gucHRpZDsKIAl0cGFjYSA9ICZwYWNhW2NwdV07CiAJdHBhY2EtPmt2bV9oc3RhdGUua3ZtX3ZjcHUgPSB2Y3B1OwogCXRwYWNhLT5rdm1faHN0YXRlLmt2bV92Y29yZSA9IHZjOworCXRwYWNhLT5rdm1faHN0YXRlLm5hcHBpbmcgPSAwOworCXZjcHUtPmNwdSA9IHZjLT5wY3B1OwogCXNtcF93bWIoKTsKICNpZmRlZiBDT05GSUdfUFBDX0lDUF9OQVRJVkUKIAlpZiAodmNwdS0+YXJjaC5wdGlkKSB7CiAJCXRwYWNhLT5jcHVfc3RhcnQgPSAweDgwOwotCQl0cGFjYS0+a3ZtX2hzdGF0ZS5pbl9ndWVzdCA9IEtWTV9HVUVTVF9NT0RFX0dVRVNUOwogCQl3bWIoKTsKIAkJeGljc193YWtlX2NwdShjcHUpOwogCQkrK3ZjLT5uX3dva2VuOwpAQCAtNjMxLDkgKzU4NywxMCBAQAogICovCiBzdGF0aWMgaW50IGt2bXBwY19ydW5fY29yZShzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YykKIHsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICp2bmV4dDsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICp2Y3B1MCwgKnZuZXh0OwogCWxvbmcgcmV0OwogCXU2NCBub3c7CisJaW50IHB0aWQ7CiAKIAkvKiBkb24ndCBzdGFydCBpZiBhbnkgdGhyZWFkcyBoYXZlIGEgc2lnbmFsIHBlbmRpbmcgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkKQEAgLTY1MiwyOSArNjA5LDUwIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCS8qCisJICogQXNzaWduIHBoeXNpY2FsIHRocmVhZCBJRHMsIGZpcnN0IHRvIG5vbi1jZWRlZCB2Y3B1cworCSAqIGFuZCB0aGVuIHRvIGNlZGVkIG9uZXMuCisJICovCisJcHRpZCA9IDA7CisJdmNwdTAgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KSB7CisJCWlmICghdmNwdS0+YXJjaC5jZWRlZCkgeworCQkJaWYgKCFwdGlkKQorCQkJCXZjcHUwID0gdmNwdTsKKwkJCXZjcHUtPmFyY2gucHRpZCA9IHB0aWQrKzsKKwkJfQorCX0KKwlpZiAoIXZjcHUwKQorCQlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgdG8gcnVuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpCisJCWlmICh2Y3B1LT5hcmNoLmNlZGVkKQorCQkJdmNwdS0+YXJjaC5wdGlkID0gcHRpZCsrOworCiAJdmMtPm5fd29rZW4gPSAwOwogCXZjLT5uYXBfY291bnQgPSAwOwogCXZjLT5lbnRyeV9leGl0X2NvdW50ID0gMDsKLQl2Yy0+dmNvcmVfcnVubmluZyA9IDE7CisJdmMtPnZjb3JlX3N0YXRlID0gVkNPUkVfUlVOTklORzsKIAl2Yy0+aW5fZ3Vlc3QgPSAwOwogCXZjLT5wY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZjLT5uYXBwaW5nX3RocmVhZHMgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodmNwdSwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQogCQlrdm1wcGNfc3RhcnRfdGhyZWFkKHZjcHUpOwotCXZjcHUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2Yy0+cnVubmFibGVfdGhyZWFkcywgc3RydWN0IGt2bV92Y3B1LAotCQkJCWFyY2gucnVuX2xpc3QpOwotCi0Jc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKIAogCXByZWVtcHRfZGlzYWJsZSgpOwotCWt2bV9ndWVzdF9lbnRlcigpOwotCV9fa3ZtcHBjX3Zjb3JlX2VudHJ5KE5VTEwsIHZjcHUpOworCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CiAKLQkvKiB3YWl0IGZvciBzZWNvbmRhcnkgdGhyZWFkcyB0byBmaW5pc2ggd3JpdGluZyB0aGVpciBzdGF0ZSB0byBtZW1vcnkgKi8KKwlrdm1fZ3Vlc3RfZW50ZXIoKTsKKwlfX2t2bXBwY192Y29yZV9lbnRyeShOVUxMLCB2Y3B1MCk7CisKIAlzcGluX2xvY2soJnZjLT5sb2NrKTsKKwkvKiBkaXNhYmxlIHNlbmRpbmcgb2YgSVBJcyBvbiB2aXJ0dWFsIGV4dGVybmFsIGlycXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkKKwkJdmNwdS0+Y3B1ID0gLTE7CisJLyogd2FpdCBmb3Igc2Vjb25kYXJ5IHRocmVhZHMgdG8gZmluaXNoIHdyaXRpbmcgdGhlaXIgc3RhdGUgdG8gbWVtb3J5ICovCiAJaWYgKHZjLT5uYXBfY291bnQgPCB2Yy0+bl93b2tlbikKIAkJa3ZtcHBjX3dhaXRfZm9yX25hcCh2Yyk7CiAJLyogcHJldmVudCBvdGhlciB2Y3B1IHRocmVhZHMgZnJvbSBkb2luZyBrdm1wcGNfc3RhcnRfdGhyZWFkKCkgbm93ICovCi0JdmMtPnZjb3JlX3J1bm5pbmcgPSAyOworCXZjLT52Y29yZV9zdGF0ZSA9IFZDT1JFX0VYSVRJTkc7CiAJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKIAogCS8qIG1ha2Ugc3VyZSB1cGRhdGVzIHRvIHNlY29uZGFyeSB2Y3B1IHN0cnVjdHMgYXJlIHZpc2libGUgbm93ICovCkBAIC02OTAsMjIgKzY2OCwyNiBAQAogCQlpZiAobm93IDwgdmNwdS0+YXJjaC5kZWNfZXhwaXJlcyAmJgogCQkgICAga3ZtcHBjX2NvcmVfcGVuZGluZ19kZWModmNwdSkpCiAJCQlrdm1wcGNfY29yZV9kZXF1ZXVlX2RlYyh2Y3B1KTsKLQkJaWYgKCF2Y3B1LT5hcmNoLnRyYXApIHsKLQkJCWlmIChzaWduYWxfcGVuZGluZyh2Y3B1LT5hcmNoLnJ1bl90YXNrKSkgewotCQkJCXZjcHUtPmFyY2gua3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJCXZjcHUtPmFyY2gucmV0ID0gLUVJTlRSOwotCQkJfQotCQkJY29udGludWU7CQkvKiBkaWRuJ3QgZ2V0IHRvIHJ1biAqLwotCQl9Ci0JCXJldCA9IGt2bXBwY19oYW5kbGVfZXhpdCh2Y3B1LT5hcmNoLmt2bV9ydW4sIHZjcHUsCi0JCQkJCSB2Y3B1LT5hcmNoLnJ1bl90YXNrKTsKKworCQlyZXQgPSBSRVNVTUVfR1VFU1Q7CisJCWlmICh2Y3B1LT5hcmNoLnRyYXApCisJCQlyZXQgPSBrdm1wcGNfaGFuZGxlX2V4aXQodmNwdS0+YXJjaC5rdm1fcnVuLCB2Y3B1LAorCQkJCQkJIHZjcHUtPmFyY2gucnVuX3Rhc2spOworCiAJCXZjcHUtPmFyY2gucmV0ID0gcmV0OwogCQl2Y3B1LT5hcmNoLnRyYXAgPSAwOworCisJCWlmICh2Y3B1LT5hcmNoLmNlZGVkKSB7CisJCQlpZiAocmV0ICE9IFJFU1VNRV9HVUVTVCkKKwkJCQlrdm1wcGNfZW5kX2NlZGUodmNwdSk7CisJCQllbHNlCisJCQkJa3ZtcHBjX3NldF90aW1lcih2Y3B1KTsKKwkJfQogCX0KIAogCXNwaW5fbG9jaygmdmMtPmxvY2spOwogIG91dDoKLQl2Yy0+dmNvcmVfcnVubmluZyA9IDA7CisJdmMtPnZjb3JlX3N0YXRlID0gVkNPUkVfSU5BQ1RJVkU7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZjcHUsIHZuZXh0LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsCiAJCQkJIGFyY2gucnVuX2xpc3QpIHsKIAkJaWYgKHZjcHUtPmFyY2gucmV0ICE9IFJFU1VNRV9HVUVTVCkgewpAQCAtNzE3LDE2ICs2OTksMTQ1IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQga3ZtcHBjX3J1bl92Y3B1KHN0cnVjdCBrdm1fcnVuICprdm1fcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCisvKgorICogV2FpdCBmb3Igc29tZSBvdGhlciB2Y3B1IHRocmVhZCB0byBleGVjdXRlIHVzLCBhbmQKKyAqIHdha2UgdXMgdXAgd2hlbiB3ZSBuZWVkIHRvIGhhbmRsZSBzb21ldGhpbmcgaW4gdGhlIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkIGt2bXBwY193YWl0X2Zvcl9leGVjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHdhaXRfc3RhdGUpCiB7Ci0JaW50IHB0aWQ7Ci0JaW50IHdhaXRfc3RhdGU7Ci0Jc3RydWN0IGt2bXBwY192Y29yZSAqdmM7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQkvKiBObyBuZWVkIHRvIGdvIGludG8gdGhlIGd1ZXN0IHdoZW4gYWxsIHdlIGRvIGlzIGdvaW5nIG91dCAqLworCXByZXBhcmVfdG9fd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCwgd2FpdF9zdGF0ZSk7CisJaWYgKHZjcHUtPmFyY2guc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEUpCisJCXNjaGVkdWxlKCk7CisJZmluaXNoX3dhaXQoJnZjcHUtPmFyY2guY3B1X3J1biwgJndhaXQpOworfQorCisvKgorICogQWxsIHRoZSB2Y3B1cyBpbiB0aGlzIHZjb3JlIGFyZSBpZGxlLCBzbyB3YWl0IGZvciBhIGRlY3JlbWVudGVyCisgKiBvciBleHRlcm5hbCBpbnRlcnJ1cHQgdG8gb25lIG9mIHRoZSB2Y3B1cy4gIHZjLT5sb2NrIGlzIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGt2bXBwY192Y29yZV9ibG9ja2VkKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCBrdm1fdmNwdSAqdjsKKwlpbnQgYWxsX2lkbGUgPSAxOworCisJcHJlcGFyZV90b193YWl0KCZ2Yy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCXZjLT52Y29yZV9zdGF0ZSA9IFZDT1JFX1NMRUVQSU5HOworCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsIGFyY2gucnVuX2xpc3QpIHsKKwkJaWYgKCF2LT5hcmNoLmNlZGVkIHx8IHYtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKSB7CisJCQlhbGxfaWRsZSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoYWxsX2lkbGUpCisJCXNjaGVkdWxlKCk7CisJZmluaXNoX3dhaXQoJnZjLT53cSwgJndhaXQpOworCXNwaW5fbG9jaygmdmMtPmxvY2spOworCXZjLT52Y29yZV9zdGF0ZSA9IFZDT1JFX0lOQUNUSVZFOworfQorCitzdGF0aWMgaW50IGt2bXBwY19ydW5fdmNwdShzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCBuX2NlZGVkOworCWludCBwcmV2X3N0YXRlOworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjOworCXN0cnVjdCBrdm1fdmNwdSAqdiwgKnZuOworCisJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSAwOworCXZjcHUtPmFyY2gucmV0ID0gUkVTVU1FX0dVRVNUOworCXZjcHUtPmFyY2gudHJhcCA9IDA7CisKKwkvKgorCSAqIFN5bmNocm9uaXplIHdpdGggb3RoZXIgdGhyZWFkcyBpbiB0aGlzIHZpcnR1YWwgY29yZQorCSAqLworCXZjID0gdmNwdS0+YXJjaC52Y29yZTsKKwlzcGluX2xvY2soJnZjLT5sb2NrKTsKKwl2Y3B1LT5hcmNoLmNlZGVkID0gMDsKKwl2Y3B1LT5hcmNoLnJ1bl90YXNrID0gY3VycmVudDsKKwl2Y3B1LT5hcmNoLmt2bV9ydW4gPSBrdm1fcnVuOworCXByZXZfc3RhdGUgPSB2Y3B1LT5hcmNoLnN0YXRlOworCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9SVU5OQUJMRTsKKwlsaXN0X2FkZF90YWlsKCZ2Y3B1LT5hcmNoLnJ1bl9saXN0LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMpOworCSsrdmMtPm5fcnVubmFibGU7CisKKwkvKgorCSAqIFRoaXMgaGFwcGVucyB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCBmb3IgYSB2Y3B1LgorCSAqIElmIHRoZSB2Y29yZSBpcyBhbHJlYWR5IHJ1bm5pbmcsIHdlIG1heSBiZSBhYmxlIHRvIHN0YXJ0CisJICogdGhpcyB0aHJlYWQgc3RyYWlnaHQgYXdheSBhbmQgaGF2ZSBpdCBqb2luIGluLgorCSAqLworCWlmIChwcmV2X3N0YXRlID09IEtWTVBQQ19WQ1BVX1NUT1BQRUQpIHsKKwkJaWYgKHZjLT52Y29yZV9zdGF0ZSA9PSBWQ09SRV9SVU5OSU5HICYmCisJCSAgICBWQ09SRV9FWElUX0NPVU5UKHZjKSA9PSAwKSB7CisJCQl2Y3B1LT5hcmNoLnB0aWQgPSB2Yy0+bl9ydW5uYWJsZSAtIDE7CisJCQlrdm1wcGNfc3RhcnRfdGhyZWFkKHZjcHUpOworCQl9CisKKwl9IGVsc2UgaWYgKHByZXZfc3RhdGUgPT0gS1ZNUFBDX1ZDUFVfQlVTWV9JTl9IT1NUKQorCQktLXZjLT5uX2J1c3k7CisKKwl3aGlsZSAodmNwdS0+YXJjaC5zdGF0ZSA9PSBLVk1QUENfVkNQVV9SVU5OQUJMRSAmJgorCSAgICAgICAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJaWYgKHZjLT5uX2J1c3kgfHwgdmMtPnZjb3JlX3N0YXRlICE9IFZDT1JFX0lOQUNUSVZFKSB7CisJCQlzcGluX3VubG9jaygmdmMtPmxvY2spOworCQkJa3ZtcHBjX3dhaXRfZm9yX2V4ZWModmNwdSwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9jaygmdmMtPmxvY2spOworCQkJY29udGludWU7CisJCX0KKwkJbl9jZWRlZCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodiwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLCBhcmNoLnJ1bl9saXN0KQorCQkJbl9jZWRlZCArPSB2LT5hcmNoLmNlZGVkOworCQlpZiAobl9jZWRlZCA9PSB2Yy0+bl9ydW5uYWJsZSkKKwkJCWt2bXBwY192Y29yZV9ibG9ja2VkKHZjKTsKKwkJZWxzZQorCQkJa3ZtcHBjX3J1bl9jb3JlKHZjKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodiwgdm4sICZ2Yy0+cnVubmFibGVfdGhyZWFkcywKKwkJCQkJIGFyY2gucnVuX2xpc3QpIHsKKwkJCWt2bXBwY19jb3JlX2RlbGl2ZXJfaW50ZXJydXB0cyh2KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyh2LT5hcmNoLnJ1bl90YXNrKSkgeworCQkJCWt2bXBwY19yZW1vdmVfcnVubmFibGUodmMsIHYpOworCQkJCXYtPnN0YXQuc2lnbmFsX2V4aXRzKys7CisJCQkJdi0+YXJjaC5rdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQkJdi0+YXJjaC5yZXQgPSAtRUlOVFI7CisJCQkJd2FrZV91cCgmdi0+YXJjaC5jcHVfcnVuKTsKKwkJCX0KKwkJfQorCX0KKwogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCWlmICh2Yy0+dmNvcmVfc3RhdGUgPT0gVkNPUkVfUlVOTklORyB8fAorCQkgICAgdmMtPnZjb3JlX3N0YXRlID09IFZDT1JFX0VYSVRJTkcpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2Yy0+bG9jayk7CisJCQlrdm1wcGNfd2FpdF9mb3JfZXhlYyh2Y3B1LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2soJnZjLT5sb2NrKTsKKwkJfQorCQlpZiAodmNwdS0+YXJjaC5zdGF0ZSA9PSBLVk1QUENfVkNQVV9SVU5OQUJMRSkgeworCQkJa3ZtcHBjX3JlbW92ZV9ydW5uYWJsZSh2YywgdmNwdSk7CisJCQl2Y3B1LT5zdGF0LnNpZ25hbF9leGl0cysrOworCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOworCQkJdmNwdS0+YXJjaC5yZXQgPSAtRUlOVFI7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmdmMtPmxvY2spOworCXJldHVybiB2Y3B1LT5hcmNoLnJldDsKK30KKworaW50IGt2bXBwY192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IHI7CisKKwlpZiAoIXZjcHUtPmFyY2guc2FuZSkgeworCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5URVJOQUxfRVJST1I7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE5vIG5lZWQgdG8gZ28gaW50byB0aGUgZ3Vlc3Qgd2hlbiBhbGwgd2UnbGwgZG8gaXMgY29tZSBiYWNrIG91dCAqLworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CiAKQEAgLTczNCw3MSArODQ1LDEwIEBACiAJaWYgKCF2Y3B1LT5rdm0tPmFyY2gucm1hICYmIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjAxKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gMDsKLQl2Y3B1LT5hcmNoLnJldCA9IFJFU1VNRV9HVUVTVDsKLQl2Y3B1LT5hcmNoLnRyYXAgPSAwOwotCiAJZmx1c2hfZnBfdG9fdGhyZWFkKGN1cnJlbnQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKGN1cnJlbnQpOwogCWZsdXNoX3ZzeF90b190aHJlYWQoY3VycmVudCk7Ci0KLQkvKgotCSAqIFN5bmNocm9uaXplIHdpdGggb3RoZXIgdGhyZWFkcyBpbiB0aGlzIHZpcnR1YWwgY29yZQotCSAqLwotCXZjID0gdmNwdS0+YXJjaC52Y29yZTsKLQlzcGluX2xvY2soJnZjLT5sb2NrKTsKLQkvKiBUaGlzIGhhcHBlbnMgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgZm9yIGEgdmNwdSAqLwotCWlmICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX0JMT0NLRUQpCi0JCS0tdmMtPm5fYmxvY2tlZDsKLQl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEU7Ci0JcHRpZCA9IHZjLT5uX3J1bm5hYmxlOwotCXZjcHUtPmFyY2gucnVuX3Rhc2sgPSBjdXJyZW50OwotCXZjcHUtPmFyY2gua3ZtX3J1biA9IGt2bV9ydW47Ci0JdmNwdS0+YXJjaC5wdGlkID0gcHRpZDsKLQlsaXN0X2FkZF90YWlsKCZ2Y3B1LT5hcmNoLnJ1bl9saXN0LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMpOwotCSsrdmMtPm5fcnVubmFibGU7Ci0KLQl3YWl0X3N0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXdoaWxlICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKSB7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJaWYgKCF2Yy0+dmNvcmVfcnVubmluZykgewotCQkJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKLQkJCQl2Y3B1LT5hcmNoLnJldCA9IC1FSU5UUjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGhhdmUgdG8gd2FpdCBmb3IgdmNvcmUgdG8gc3RvcCBleGVjdXRpbmcgZ3Vlc3QgKi8KLQkJCXdhaXRfc3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQkJCXNtcF9zZW5kX3Jlc2NoZWR1bGUodmMtPnBjcHUpOwotCQl9Ci0KLQkJaWYgKCF2Yy0+dmNvcmVfcnVubmluZyAmJgotCQkgICAgdmMtPm5fcnVubmFibGUgKyB2Yy0+bl9ibG9ja2VkID09IHZjLT5udW1fdGhyZWFkcykgewotCQkJLyogd2UgY2FuIHJ1biBub3cgKi8KLQkJCWlmIChrdm1wcGNfcnVuX2NvcmUodmMpKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHZjLT52Y29yZV9ydW5uaW5nID09IDEgJiYgVkNPUkVfRVhJVF9DT1VOVCh2YykgPT0gMCkKLQkJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSk7Ci0KLQkJLyogd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBjb21lIGluLCBvciB3YWl0IGZvciB2Y29yZSAqLwotCQlwcmVwYXJlX3RvX3dhaXQoJnZjcHUtPmFyY2guY3B1X3J1biwgJndhaXQsIHdhaXRfc3RhdGUpOwotCQlzcGluX3VubG9jaygmdmMtPmxvY2spOwotCQlzY2hlZHVsZSgpOwotCQlmaW5pc2hfd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCk7Ci0JCXNwaW5fbG9jaygmdmMtPmxvY2spOwotCX0KLQotCWlmICh2Y3B1LT5hcmNoLnN0YXRlID09IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKQotCQlrdm1wcGNfcmVtb3ZlX3J1bm5hYmxlKHZjLCB2Y3B1KTsKLQlzcGluX3VubG9jaygmdmMtPmxvY2spOwotCi0JcmV0dXJuIHZjcHUtPmFyY2gucmV0OwotfQotCi1pbnQga3ZtcHBjX3ZjcHVfcnVuKHN0cnVjdCBrdm1fcnVuICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpbnQgcjsKKwl2Y3B1LT5hcmNoLndxcCA9ICZ2Y3B1LT5hcmNoLnZjb3JlLT53cTsKIAogCWRvIHsKIAkJciA9IGt2bXBwY19ydW5fdmNwdShydW4sIHZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfYnVpbHRpbi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfYnVpbHRpbi5jCmluZGV4IGQ0MzEyMDMuLjI4NmYxM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2J1aWx0aW4uYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1fbW11LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybV9tbXUuYwppbmRleCBmY2ZlNmIwLi5iYWNiMGNmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybV9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybV9tbXUuYwpAQCAtMTEwLDM5ICsxMTAsNiBAQAogCXJldHVybiBIX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbXB1dGVfdGxiaWVfcmIodW5zaWduZWQgbG9uZyB2LCB1bnNpZ25lZCBsb25nIHIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwdGVfaW5kZXgpCi17Ci0JdW5zaWduZWQgbG9uZyByYiwgdmFfbG93OwotCi0JcmIgPSAodiAmIH4weDdmVUwpIDw8IDE2OwkJLyogQVZBIGZpZWxkICovCi0JdmFfbG93ID0gcHRlX2luZGV4ID4+IDM7Ci0JaWYgKHYgJiBIUFRFX1ZfU0VDT05EQVJZKQotCQl2YV9sb3cgPSB+dmFfbG93OwotCS8qIHhvciB2c2lkIGZyb20gQVZBICovCi0JaWYgKCEodiAmIEhQVEVfVl8xVEJfU0VHKSkKLQkJdmFfbG93IF49IHYgPj4gMTI7Ci0JZWxzZQotCQl2YV9sb3cgXj0gdiA+PiAyNDsKLQl2YV9sb3cgJj0gMHg3ZmY7Ci0JaWYgKHYgJiBIUFRFX1ZfTEFSR0UpIHsKLQkJcmIgfD0gMTsJCQkvKiBMIGZpZWxkICovCi0JCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwNikgJiYKLQkJICAgIChyICYgMHhmZjAwMCkpIHsKLQkJCS8qIG5vbi0xNk1CIGxhcmdlIHBhZ2UsIG11c3QgYmUgNjRrICovCi0JCQkvKiAobWFza3MgZGVwZW5kIG9uIHBhZ2Ugc2l6ZSkgKi8KLQkJCXJiIHw9IDB4MTAwMDsJCS8qIHBhZ2UgZW5jb2RpbmcgaW4gTFAgZmllbGQgKi8KLQkJCXJiIHw9ICh2YV9sb3cgJiAweDdmKSA8PCAxNjsgLyogN2Igb2YgVkEgaW4gQVZBL0xQIGZpZWxkICovCi0JCQlyYiB8PSAodmFfbG93ICYgMHhmZSk7CS8qIEFWQUwgZmllbGQgKFA3IGRvZXNuJ3Qgc2VlbSB0byBjYXJlKSAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogNGtCIHBhZ2UgKi8KLQkJcmIgfD0gKHZhX2xvdyAmIDB4N2ZmKSA8PCAxMjsJLyogcmVtYWluaW5nIDExYiBvZiBWQSAqLwotCX0KLQlyYiB8PSAodiA+PiA1NCkgJiAweDMwMDsJCS8qIEIgZmllbGQgKi8KLQlyZXR1cm4gcmI7Ci19Ci0KICNkZWZpbmUgTE9DS19UT0tFTgkoKih1MzIgKikoJmdldF9wYWNhKCktPmxvY2tfdG9rZW4pKQogCiBzdGF0aWMgaW5saW5lIGludCB0cnlfbG9ja190bGJpZSh1bnNpZ25lZCBpbnQgKmxvY2spCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKaW5kZXggZGUyOTUwMS4uNDRkODgyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwpAQCAtMjAsNyArMjAsMTAgQEAKICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KIApAQCAtNDksNyArNTIsNyBAQAogCWIJLgogCiAvKgotICogQ2FsbCBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2VudGVyIGluIHJlYWwgbW9kZS4KKyAqIENhbGwga3ZtcHBjX2h2X2VudHJ5IGluIHJlYWwgbW9kZS4KICAqIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBoYXJkLWRpc2FibGVkLgogICoKICAqIElucHV0IFJlZ2lzdGVyczoKQEAgLTg5LDYgKzkyLDEyIEBACiBrdm1fc3RhcnRfZ3Vlc3Q6CiAJbGQJcjEsUEFDQUVNRVJHU1AocjEzKQogCXN1YmkJcjEscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlsZAlyMixQQUNBVE9DKHIxMykKKworCS8qIHdlcmUgd2UgbmFwcGluZyBkdWUgdG8gY2VkZT8gKi8KKwlsYnoJcjAsSFNUQVRFX05BUFBJTkcocjEzKQorCWNtcHdpCXIwLDAKKwlibmUJa3ZtX2VuZF9jZWRlCiAKIAkvKiBnZXQgdmNwdSBwb2ludGVyICovCiAJbGQJcjQsIEhTVEFURV9LVk1fVkNQVShyMTMpCkBAIC0yNzYsMTUgKzI4NSw5IEBACiAJY21wd2kJcjAsMAogCWJlcQkyMGIKIAotCS8qIFNldCBMUENSLiAgU2V0IHRoZSBNRVIgYml0IGlmIHRoZXJlIGlzIGEgcGVuZGluZyBleHRlcm5hbCBpcnEuICovCisJLyogU2V0IExQQ1IgYW5kIFJNT1IuICovCiAxMDoJbGQJcjgsS1ZNX0xQQ1IocjkpCi0JbGQJcjAsVkNQVV9QRU5ESU5HX0VYQyhyNCkKLQlsaQlyNywoMSA8PCBCT09LM1NfSVJRUFJJT19FWFRFUk5BTCkKLQlvcmlzCXI3LHI3LCgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMX0xFVkVMKUBoCi0JYW5kLglyMCxyMCxyNwotCWJlcQkxMWYKLQlvcmkJcjgscjgsTFBDUl9NRVIKLTExOgltdHNwcglTUFJOX0xQQ1IscjgKKwltdHNwcglTUFJOX0xQQ1IscjgKIAlsZAlyOCxLVk1fUk1PUihyOSkKIAltdHNwcglTUFJOX1JNT1IscjgKIAlpc3luYwpAQCAtNDQ4LDE5ICs0NTEsNTAgQEAKIAltdGN0cglyNgogCW10eGVyCXI3CiAKLQkvKiBNb3ZlIFNSUjAgYW5kIFNSUjEgaW50byB0aGUgcmVzcGVjdGl2ZSByZWdzICovCitrdm1wcGNfY2VkZV9yZWVudHJ5OgkJLyogcjQgPSB2Y3B1LCByMTMgPSBwYWNhICovCiAJbGQJcjYsIFZDUFVfU1JSMChyNCkKIAlsZAlyNywgVkNQVV9TUlIxKHI0KQotCW10c3ByCVNQUk5fU1JSMCwgcjYKLQltdHNwcglTUFJOX1NSUjEsIHI3Ci0KIAlsZAlyMTAsIFZDUFVfUEMocjQpCisJbGQJcjExLCBWQ1BVX01TUihyNCkJLyogcjExID0gdmNwdS0+YXJjaC5tc3IgJiB+TVNSX0hWICovCiAKLQlsZAlyMTEsIFZDUFVfTVNSKHI0KQkvKiByMTAgPSB2Y3B1LT5hcmNoLm1zciAmIH5NU1JfSFYgKi8KIAlybGRpY2wJcjExLCByMTEsIDYzIC0gTVNSX0hWX0xHLCAxCiAJcm90bGRpCXIxMSwgcjExLCAxICsgTVNSX0hWX0xHCiAJb3JpCXIxMSwgcjExLCBNU1JfTUUKIAorCS8qIENoZWNrIGlmIHdlIGNhbiBkZWxpdmVyIGFuIGV4dGVybmFsIG9yIGRlY3JlbWVudGVyIGludGVycnVwdCBub3cgKi8KKwlsZAlyMCxWQ1BVX1BFTkRJTkdfRVhDKHI0KQorCWxpCXI4LCgxIDw8IEJPT0szU19JUlFQUklPX0VYVEVSTkFMKQorCW9yaXMJcjgscjgsKDEgPDwgQk9PSzNTX0lSUVBSSU9fRVhURVJOQUxfTEVWRUwpQGgKKwlhbmQJcjAscjAscjgKKwljbXBkaQljcjEscjAsMAorCWFuZGkuCXIwLHIxMSxNU1JfRUUKKwliZXEJY3IxLDExZgorQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyOCxTUFJOX0xQQ1IKKwlvcmkJcjgscjgsTFBDUl9NRVIKKwltdHNwcglTUFJOX0xQQ1IscjgKKwlpc3luYworRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCisJYmVxCTVmCisJbGkJcjAsQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAorMTI6CW1yCXI2LHIxMAorCW1yCXIxMCxyMAorCW1yCXI3LHIxMQorCWxpCXIxMSwoTVNSX01FIDw8IDEpIHwgMQkvKiBzeW50aGVzaXplIE1TUl9TRiB8IE1TUl9NRSAqLworCXJvdGxkaQlyMTEscjExLDYzCisJYgk1ZgorMTE6CWJlcQk1ZgorCW1mc3ByCXIwLFNQUk5fREVDCisJY21wd2kJcjAsMAorCWxpCXIwLEJPT0szU19JTlRFUlJVUFRfREVDUkVNRU5URVIKKwlibHQJMTJiCisKKwkvKiBNb3ZlIFNSUjAgYW5kIFNSUjEgaW50byB0aGUgcmVzcGVjdGl2ZSByZWdzICovCis1OgltdHNwcglTUFJOX1NSUjAsIHI2CisJbXRzcHIJU1BSTl9TUlIxLCByNworCWxpCXIwLDAKKwlzdGIJcjAsVkNQVV9DRURFRChyNCkJLyogY2FuY2VsIGNlZGUgKi8KKwogZmFzdF9ndWVzdF9yZXR1cm46CiAJbXRzcHIJU1BSTl9IU1JSMCxyMTAKIAltdHNwcglTUFJOX0hTUlIxLHIxMQpAQCAtNTc0LDIxICs2MDgsMjAgQEAKIAkvKiBTZWUgaWYgdGhpcyBpcyBzb21ldGhpbmcgd2UgY2FuIGhhbmRsZSBpbiByZWFsIG1vZGUgKi8KIAljbXB3aQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMCiAJYmVxCWhjYWxsX3RyeV9yZWFsX21vZGUKLWhjYWxsX3JlYWxfY29udDoKIAogCS8qIENoZWNrIGZvciBtZWRpYXRlZCBpbnRlcnJ1cHRzIChjb3VsZCBiZSBkb25lIGVhcmxpZXIgcmVhbGx5IC4uLikgKi8KIEJFR0lOX0ZUUl9TRUNUSU9OCiAJY21wd2kJcjEyLEJPT0szU19JTlRFUlJVUFRfRVhURVJOQUwKIAlibmUrCTFmCi0JbGQJcjUsVkNQVV9LVk0ocjkpCi0JbGQJcjUsS1ZNX0xQQ1IocjUpCiAJYW5kaS4JcjAscjExLE1TUl9FRQogCWJlcQkxZgorCW1mc3ByCXI1LFNQUk5fTFBDUgogCWFuZGkuCXIwLHI1LExQQ1JfTUVSCiAJYm5lCWJvdW5jZV9leHRfaW50ZXJydXB0CiAxOgogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDYpCiAKK2hjYWxsX3JlYWxfY29udDoJCS8qIHI5ID0gdmNwdSwgcjEyID0gdHJhcCwgcjEzID0gcGFjYSAqLwogCS8qIFNhdmUgREVDICovCiAJbWZzcHIJcjUsU1BSTl9ERUMKIAltZnRiCXI2CkBAIC02ODIsNyArNzE1LDcgQEAKIAlzbGJpYQogCXB0ZXN5bmMKIAotaGRlY19zb29uOgoraGRlY19zb29uOgkJCS8qIHI5ID0gdmNwdSwgcjEyID0gdHJhcCwgcjEzID0gcGFjYSAqLwogQkVHSU5fRlRSX1NFQ1RJT04KIAliCTMyZgogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDEpCkBAIC03MDAsNiArNzMzLDcgQEAKIAlhZGRpCXIwLHIzLDB4MTAwCiAJc3R3Y3guCXIwLDAscjYKIAlibmUJNDFiCisJbHdzeW5jCiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbiBpbnRlcnJ1cHQgdGhhdCB3ZSBoYXZlIHRvIHBhc3MKQEAgLTcxMywxOCArNzQ3LDM5IEBACiAJICogaW50ZXJydXB0LCBzaW5jZSB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGFscmVhZHkgYmUgb24gdGhlaXIKIAkgKiB3YXkgaGVyZSBpbiB0aGF0IGNhc2UuCiAJICovCisJY21wd2kJcjMsMHgxMDAJLyogQXJlIHdlIHRoZSBmaXJzdCBoZXJlPyAqLworCWJnZQk0M2YKKwljbXB3aQlyMywxCQkvKiBBcmUgYW55IG90aGVyIHRocmVhZHMgaW4gdGhlIGd1ZXN0PyAqLworCWJsZQk0M2YKIAljbXB3aQlyMTIsQk9PSzNTX0lOVEVSUlVQVF9IVl9ERUNSRU1FTlRFUgogCWJlcQk0MGYKLQljbXB3aQlyMywweDEwMAkvKiBBcmUgd2UgdGhlIGZpcnN0IGhlcmU/ICovCi0JYmdlCTQwZgotCWNtcHdpCXIzLDEKLQlibGUJNDBmCiAJbGkJcjAsMAogCW10c3ByCVNQUk5fSERFQyxyMAogNDA6CisJLyoKKwkgKiBTZW5kIGFuIElQSSB0byBhbnkgbmFwcGluZyB0aHJlYWRzLCBzaW5jZSBhbiBIREVDIGludGVycnVwdAorCSAqIGRvZXNuJ3Qgd2FrZSBDUFVzIHVwIGZyb20gbmFwLgorCSAqLworCWx3eglyMyxWQ09SRV9OQVBQSU5HX1RIUkVBRFMocjUpCisJbHd6CXI0LFZDUFVfUFRJRChyOSkKKwlsaQlyMCwxCisJc2xkaQlyMCxyMCxyNAorCWFuZGMuCXIzLHIzLHIwCQkvKiBubyBzZW5zZSBJUEknaW5nIG91cnNlbHZlcyAqLworCWJlcQk0M2YKKwltdWxsaQlyNCxyNCxQQUNBX1NJWkUJCS8qIGdldCBwYWNhIGZvciB0aHJlYWQgMCAqLworCXN1YmYJcjYscjQscjEzCis0MjoJYW5kaS4JcjAscjMsMQorCWJlcQk0NGYKKwlsZAlyOCxIU1RBVEVfWElDU19QSFlTKHI2KQkvKiBnZXQgdGhyZWFkJ3MgWElDUyByZWcgYWRkciAqLworCWxpCXIwLElQSV9QUklPUklUWQorCWxpCXI3LFhJQ1NfUUlSUgorCXN0YmNpeAlyMCxyNyxyOAkJLyogdHJpZ2dlciB0aGUgSVBJICovCis0NDoJc3JkaS4JcjMscjMsMQorCWFkZGkJcjYscjYsUEFDQV9TSVpFCisJYm5lCTQyYgogCiAJLyogU2Vjb25kYXJ5IHRocmVhZHMgd2FpdCBmb3IgcHJpbWFyeSB0byBkbyBwYXJ0aXRpb24gc3dpdGNoICovCi0JbGQJcjQsVkNQVV9LVk0ocjkpCQkvKiBwb2ludGVyIHRvIHN0cnVjdCBrdm0gKi8KKzQzOglsZAlyNCxWQ1BVX0tWTShyOSkJCS8qIHBvaW50ZXIgdG8gc3RydWN0IGt2bSAqLwogCWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQogCWx3eglyMyxWQ1BVX1BUSUQocjkpCiAJY21wd2kJcjMsMApAQCAtMTA3Nyw3ICsxMTMyLDYgQEAKIGhjYWxsX3JlYWxfZmFsbGJhY2s6CiAJbGkJcjEyLEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAogCWxkCXI5LCBIU1RBVEVfS1ZNX1ZDUFUocjEzKQotCWxkCXIxMSwgVkNQVV9NU1IocjkpCiAKIAliCWhjYWxsX3JlYWxfY29udAogCkBAIC0xMTM5LDcgKzExOTMsNyBAQAogCS5sb25nCTAJCS8qIDB4ZDQgKi8KIAkubG9uZwkwCQkvKiAweGQ4ICovCiAJLmxvbmcJMAkJLyogMHhkYyAqLwotCS5sb25nCTAJCS8qIDB4ZTAgKi8KKwkubG9uZwkua3ZtcHBjX2hfY2VkZSAtIGhjYWxsX3JlYWxfdGFibGUKIAkubG9uZwkwCQkvKiAweGU0ICovCiAJLmxvbmcJMAkJLyogMHhlOCAqLwogCS5sb25nCTAJCS8qIDB4ZWMgKi8KQEAgLTExNjgsNyArMTIyMiw4IEBACiAJbXRzcHIJU1BSTl9TUlIwLHIxMAogCW10c3ByCVNQUk5fU1JSMSxyMTEKIAlsaQlyMTAsQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAotCUxPQURfUkVHX0lNTUVESUFURShyMTEsTVNSX1NGIHwgTVNSX01FKTsKKwlsaQlyMTEsKE1TUl9NRSA8PCAxKSB8IDEJLyogc3ludGhlc2l6ZSBNU1JfU0YgfCBNU1JfTUUgKi8KKwlyb3RsZGkJcjExLHIxMSw2MwogCWIJZmFzdF9ndWVzdF9yZXR1cm4KIAogX0dMT0JBTChrdm1wcGNfaF9zZXRfZGFicikKQEAgLTExNzcsNiArMTIzMiwxNzggQEAKIAlsaQlyMywwCiAJYmxyCiAKK19HTE9CQUwoa3ZtcHBjX2hfY2VkZSkKKwlvcmkJcjExLHIxMSxNU1JfRUUKKwlzdGQJcjExLFZDUFVfTVNSKHIzKQorCWxpCXIwLDEKKwlzdGIJcjAsVkNQVV9DRURFRChyMykKKwlzeW5jCQkJLyogb3JkZXIgc2V0dGluZyBjZWRlZCB2cy4gdGVzdGluZyBwcm9kZGVkICovCisJbGJ6CXI1LFZDUFVfUFJPRERFRChyMykKKwljbXB3aQlyNSwwCisJYm5lCTFmCisJbGkJcjAsMAkJLyogc2V0IHRyYXAgdG8gMCB0byBzYXkgaGNhbGwgaXMgaGFuZGxlZCAqLworCXN0dwlyMCxWQ1BVX1RSQVAocjMpCisJbGkJcjAsSF9TVUNDRVNTCisJc3RkCXIwLFZDUFVfR1BSKHIzKShyMykKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYgkyZgkJLyoganVzdCBzZW5kIGl0IHVwIHRvIGhvc3Qgb24gOTcwICovCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwNikKKworCS8qCisJICogU2V0IG91ciBiaXQgaW4gdGhlIGJpdG1hc2sgb2YgbmFwcGluZyB0aHJlYWRzIHVubGVzcyBhbGwgdGhlCisJICogb3RoZXIgdGhyZWFkcyBhcmUgYWxyZWFkeSBuYXBwaW5nLCBpbiB3aGljaCBjYXNlIHdlIHNlbmQgdGhpcworCSAqIHVwIHRvIHRoZSBob3N0LgorCSAqLworCWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWx3eglyNixWQ1BVX1BUSUQocjMpCisJbHd6CXI4LFZDT1JFX0VOVFJZX0VYSVQocjUpCisJY2xybGRpCXI4LHI4LDU2CisJbGkJcjAsMQorCXNsZAlyMCxyMCxyNgorCWFkZGkJcjYscjUsVkNPUkVfTkFQUElOR19USFJFQURTCiszMToJbHdhcngJcjQsMCxyNgorCW9yCXI0LHI0LHIwCisJUFBDX1BPUENOVFcocjcscjQpCisJY21wdwlyNyxyOAorCWJnZQkyZgorCXN0d2N4LglyNCwwLHI2CisJYm5lCTMxYgorCWxpCXIwLDEKKwlzdGIJcjAsSFNUQVRFX05BUFBJTkcocjEzKQorCS8qIG9yZGVyIG5hcHBpbmdfdGhyZWFkcyB1cGRhdGUgdnMgdGVzdGluZyBlbnRyeV9leGl0X2NvdW50ICovCisJbHdzeW5jCisJbXIJcjQscjMKKwlsd3oJcjcsVkNPUkVfRU5UUllfRVhJVChyNSkKKwljbXB3aQlyNywweDEwMAorCWJnZQkzM2YJCS8qIGFub3RoZXIgdGhyZWFkIGFscmVhZHkgZXhpdGluZyAqLworCisvKgorICogQWx0aG91Z2ggbm90IHNwZWNpZmljYWxseSByZXF1aXJlZCBieSB0aGUgYXJjaGl0ZWN0dXJlLCBQT1dFUjcKKyAqIHByZXNlcnZlcyB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyBpbiBuYXAgbW9kZSwgZXZlbiBpZiBhbiBTTVQgbW9kZQorICogc3dpdGNoIG9jY3VyczogU0xCIGVudHJpZXMsIFBVUlIsIFNQVVJSLCBBTU9SLCBVQU1PUiwgQU1SLCBTUFJHMC0zLAorICogREFSLCBEU0lTUiwgREFCUiwgREFCUlgsIERTQ1IsIFBNQ3gsIE1NQ1J4LCBTSUFSLCBTREFSLgorICovCisJLyogU2F2ZSBub24tdm9sYXRpbGUgR1BScyAqLworCXN0ZAlyMTQsIFZDUFVfR1BSKHIxNCkocjMpCisJc3RkCXIxNSwgVkNQVV9HUFIocjE1KShyMykKKwlzdGQJcjE2LCBWQ1BVX0dQUihyMTYpKHIzKQorCXN0ZAlyMTcsIFZDUFVfR1BSKHIxNykocjMpCisJc3RkCXIxOCwgVkNQVV9HUFIocjE4KShyMykKKwlzdGQJcjE5LCBWQ1BVX0dQUihyMTkpKHIzKQorCXN0ZAlyMjAsIFZDUFVfR1BSKHIyMCkocjMpCisJc3RkCXIyMSwgVkNQVV9HUFIocjIxKShyMykKKwlzdGQJcjIyLCBWQ1BVX0dQUihyMjIpKHIzKQorCXN0ZAlyMjMsIFZDUFVfR1BSKHIyMykocjMpCisJc3RkCXIyNCwgVkNQVV9HUFIocjI0KShyMykKKwlzdGQJcjI1LCBWQ1BVX0dQUihyMjUpKHIzKQorCXN0ZAlyMjYsIFZDUFVfR1BSKHIyNikocjMpCisJc3RkCXIyNywgVkNQVV9HUFIocjI3KShyMykKKwlzdGQJcjI4LCBWQ1BVX0dQUihyMjgpKHIzKQorCXN0ZAlyMjksIFZDUFVfR1BSKHIyOSkocjMpCisJc3RkCXIzMCwgVkNQVV9HUFIocjMwKShyMykKKwlzdGQJcjMxLCBWQ1BVX0dQUihyMzEpKHIzKQorCisJLyogc2F2ZSBGUCBzdGF0ZSAqLworCWJsCS5rdm1wcGNfc2F2ZV9mcAorCisJLyoKKwkgKiBUYWtlIGEgbmFwIHVudGlsIGEgZGVjcmVtZW50ZXIgb3IgZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycywKKwkgKiB3aXRoIFBFQ0UxICh3YWtlIG9uIGRlY3IpIGFuZCBQRUNFMCAod2FrZSBvbiBleHRlcm5hbCkgc2V0IGluIExQQ1IKKwkgKi8KKwlsaQlyMCwweDgwCisJc3RiCXIwLFBBQ0FQUk9DU1RBUlQocjEzKQorCW1mc3ByCXI1LFNQUk5fTFBDUgorCW9yaQlyNSxyNSxMUENSX1BFQ0UwIHwgTFBDUl9QRUNFMQorCW10c3ByCVNQUk5fTFBDUixyNQorCWlzeW5jCisJbGkJcjAsIDAKKwlzdGQJcjAsIEhTVEFURV9TQ1JBVENIMChyMTMpCisJcHRlc3luYworCWxkCXIwLCBIU1RBVEVfU0NSQVRDSDAocjEzKQorMToJY21wZAlyMCwgcjAKKwlibmUJMWIKKwluYXAKKwliCS4KKwora3ZtX2VuZF9jZWRlOgorCS8qIFdva2VuIGJ5IGV4dGVybmFsIG9yIGRlY3JlbWVudGVyIGludGVycnVwdCAqLworCWxkCXIxLCBIU1RBVEVfSE9TVF9SMShyMTMpCisJbGQJcjIsIFBBQ0FUT0MocjEzKQorCisJLyogSWYgd2UncmUgYSBzZWNvbmRhcnkgdGhyZWFkIGFuZCB3ZSBnb3QgaGVyZSBieSBhbiBJUEksIGFjayBpdCAqLworCWxkCXI0LEhTVEFURV9LVk1fVkNQVShyMTMpCisJbHd6CXIzLFZDUFVfUFRJRChyNCkKKwljbXB3aQlyMywwCisJYmVxCTI3ZgorCW1mc3ByCXIzLFNQUk5fU1JSMQorCXJsd2lubQlyMyxyMyw0NC0zMSwweDcJCS8qIGV4dHJhY3Qgd2FrZSByZWFzb24gZmllbGQgKi8KKwljbXB3aQlyMyw0CQkJLyogd2FzIGl0IGFuIGV4dGVybmFsIGludGVycnVwdD8gKi8KKwlibmUJMjdmCisJbGQJcjUsIEhTVEFURV9YSUNTX1BIWVMocjEzKQorCWxpCXIwLDB4ZmYKKwlsaQlyNixYSUNTX1FJUlIKKwlsaQlyNyxYSUNTX1hJUlIKKwlsd3pjaXgJcjgscjUscjcJCS8qIGFjayB0aGUgaW50ZXJydXB0ICovCisJc3luYworCXN0YmNpeAlyMCxyNSxyNgkJLyogY2xlYXIgaXQgKi8KKwlzdHdjaXgJcjgscjUscjcJCS8qIEVPSSBpdCAqLworMjc6CisJLyogbG9hZCB1cCBGUCBzdGF0ZSAqLworCWJsCWt2bXBwY19sb2FkX2ZwCisKKwkvKiBMb2FkIE5WIEdQUlMgKi8KKwlsZAlyMTQsIFZDUFVfR1BSKHIxNCkocjQpCisJbGQJcjE1LCBWQ1BVX0dQUihyMTUpKHI0KQorCWxkCXIxNiwgVkNQVV9HUFIocjE2KShyNCkKKwlsZAlyMTcsIFZDUFVfR1BSKHIxNykocjQpCisJbGQJcjE4LCBWQ1BVX0dQUihyMTgpKHI0KQorCWxkCXIxOSwgVkNQVV9HUFIocjE5KShyNCkKKwlsZAlyMjAsIFZDUFVfR1BSKHIyMCkocjQpCisJbGQJcjIxLCBWQ1BVX0dQUihyMjEpKHI0KQorCWxkCXIyMiwgVkNQVV9HUFIocjIyKShyNCkKKwlsZAlyMjMsIFZDUFVfR1BSKHIyMykocjQpCisJbGQJcjI0LCBWQ1BVX0dQUihyMjQpKHI0KQorCWxkCXIyNSwgVkNQVV9HUFIocjI1KShyNCkKKwlsZAlyMjYsIFZDUFVfR1BSKHIyNikocjQpCisJbGQJcjI3LCBWQ1BVX0dQUihyMjcpKHI0KQorCWxkCXIyOCwgVkNQVV9HUFIocjI4KShyNCkKKwlsZAlyMjksIFZDUFVfR1BSKHIyOSkocjQpCisJbGQJcjMwLCBWQ1BVX0dQUihyMzApKHI0KQorCWxkCXIzMSwgVkNQVV9HUFIocjMxKShyNCkKKworCS8qIGNsZWFyIG91ciBiaXQgaW4gdmNvcmUtPm5hcHBpbmdfdGhyZWFkcyAqLworMzM6CWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQorCWx3eglyMyxWQ1BVX1BUSUQocjQpCisJbGkJcjAsMQorCXNsZAlyMCxyMCxyMworCWFkZGkJcjYscjUsVkNPUkVfTkFQUElOR19USFJFQURTCiszMjoJbHdhcngJcjcsMCxyNgorCWFuZGMJcjcscjcscjAKKwlzdHdjeC4JcjcsMCxyNgorCWJuZQkzMmIKKwlsaQlyMCwwCisJc3RiCXIwLEhTVEFURV9OQVBQSU5HKHIxMykKKworCS8qIHNlZSBpZiBhbnkgb3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgZXhpdGluZyAqLworCWx3eglyMCxWQ09SRV9FTlRSWV9FWElUKHI1KQorCWNtcHdpCXIwLDB4MTAwCisJYmx0CWt2bXBwY19jZWRlX3JlZW50cnkJLyogaWYgbm90IGdvIGJhY2sgdG8gZ3Vlc3QgKi8KKworCS8qIHNvbWUgdGhyZWFkcyBhcmUgZXhpdGluZywgc28gZ28gdG8gdGhlIGd1ZXN0IGV4aXQgcGF0aCAqLworCWIJaGNhbGxfcmVhbF9mYWxsYmFjaworCisJLyogY2VkZSB3aGVuIGFscmVhZHkgcHJldmlvdXNseSBwcm9kZGVkIGNhc2UgKi8KKzE6CWxpCXIwLDAKKwlzdGIJcjAsVkNQVV9QUk9EREVEKHIzKQorCXN5bmMJCQkvKiBvcmRlciB0ZXN0aW5nIHByb2RkZWQgdnMuIGNsZWFyaW5nIGNlZGVkICovCisJc3RiCXIwLFZDUFVfQ0VERUQocjMpCisJbGkJcjMsSF9TVUNDRVNTCisJYmxyCisKKwkvKiB3ZSd2ZSBjZWRlZCBidXQgd2Ugd2FudCB0byBnaXZlIGNvbnRyb2wgdG8gdGhlIGhvc3QgKi8KKzI6CWxpCXIzLEhfVE9PX0hBUkQKKwlibHIKKwogc2Vjb25kYXJ5X3Rvb19sYXRlOgogCWxkCXI1LEhTVEFURV9LVk1fVkNPUkUocjEzKQogCUhNVF9MT1cKQEAgLTExOTQsMTQgKzE0MjEsMjAgQEAKIAlzbGJtdGUJcjYscjUKIDE6CWFkZGkJcjExLHIxMSwxNgogCS5lbmRyCi0JYgk1MGYKIAogc2Vjb25kYXJ5X25hcDoKLQkvKiBDbGVhciBhbnkgcGVuZGluZyBJUEkgKi8KLTUwOglsZAlyNSwgSFNUQVRFX1hJQ1NfUEhZUyhyMTMpCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgSVBJIC0gYXNzdW1lIHdlJ3JlIGEgc2Vjb25kYXJ5IHRocmVhZCAqLworCWxkCXI1LCBIU1RBVEVfWElDU19QSFlTKHIxMykKKwlsaQlyNywgWElDU19YSVJSCisJbHd6Y2l4CXIzLCByNSwgcjcJCS8qIGFjayBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwlybHdpbm0uCXIwLCByMywgMCwgMHhmZmZmZmYJLyogYW55IHBlbmRpbmc/ICovCisJYmVxCTM3ZgorCXN5bmMKIAlsaQlyMCwgMHhmZgogCWxpCXI2LCBYSUNTX1FJUlIKLQlzdGJjaXgJcjAsIHI1LCByNgorCXN0YmNpeAlyMCwgcjUsIHI2CQkvKiBjbGVhciB0aGUgSVBJICovCisJc3R3Y2l4CXIzLCByNSwgcjcJCS8qIEVPSSBpdCAqLworMzc6CXN5bmMKIAogCS8qIGluY3JlbWVudCB0aGUgbmFwIGNvdW50IGFuZCB0aGVuIGdvIHRvIG5hcCBtb2RlICovCiAJbGQJcjQsIEhTVEFURV9LVk1fVkNPUkUocjEzKQpAQCAtMTIxMSwxMyArMTQ0NCwxMiBAQAogCWFkZGkJcjMsIHIzLCAxCiAJc3R3Y3guCXIzLCAwLCByNAogCWJuZQk1MWIKLQlpc3luYwogCisJbGkJcjMsIExQQ1JfUEVDRTAKIAltZnNwcglyNCwgU1BSTl9MUENSCi0JbGkJcjAsIExQQ1JfUEVDRQotCWFuZGMJcjQsIHI0LCByMAotCW9yaQlyNCwgcjQsIExQQ1JfUEVDRTAJLyogZXhpdCBuYXAgb24gaW50ZXJydXB0ICovCisJcmx3aW1pCXI0LCByMywgMCwgTFBDUl9QRUNFMCB8IExQQ1JfUEVDRTEKIAltdHNwcglTUFJOX0xQQ1IsIHI0CisJaXN5bmMKIAlsaQlyMCwgMAogCXN0ZAlyMCwgSFNUQVRFX1NDUkFUQ0gwKHIxMykKIAlwdGVzeW5jCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19pbnRlcnJ1cHRzLlMKaW5kZXggYzU0YjBlMy4uMGE4NTE1YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaW50ZXJydXB0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2ludGVycnVwdHMuUwpAQCAtMjksMjcgKzI5LDExIEBACiAjZGVmaW5lIFVMT05HX1NJWkUgCQk4CiAjZGVmaW5lIEZVTkMobmFtZSkgCQlHTFVFKC4sbmFtZSkKIAotI2RlZmluZSBHRVRfU0hBRE9XX1ZDUFVfUjEzCi0KLSNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTCVwKLQltZm1zciAgIHIwOwkJXAotCXJsZGljbCAgcjAscjAsNDgsMTsJXAotCXJvdGxkaSAgcjAscjAsMTY7CVwKLQltdG1zcmQgIHIwLDE7CQlcCi0KICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1NfMzIpCiAKICNkZWZpbmUgVUxPTkdfU0laRSAgICAgICAgICAgICAgNAogI2RlZmluZSBGVU5DKG5hbWUpCQluYW1lCiAKLSNkZWZpbmUgR0VUX1NIQURPV19WQ1BVX1IxMwlcCi0JbHd6CXIxMywgKFRIUkVBRCArIFRIUkVBRF9LVk1fU1ZDUFUpKHIyKQotCi0jZGVmaW5lIERJU0FCTEVfSU5URVJSVVBUUwlcCi0JbWZtc3IgICByMDsJCVwKLQlybHdpbm0gIHIwLHIwLDAsMTcsMTU7CVwKLQltdG1zciAgIHIwOwkJXAotCiAjZW5kaWYgLyogQ09ORklHX1BQQ19CT09LM1NfWFggKi8KIAogCkBAIC0xMDgsNDQgKzkyLDE3IEBACiAKIGt2bV9zdGFydF9saWdodHdlaWdodDoKIAotCUdFVF9TSEFET1dfVkNQVV9SMTMKLQlQUENfTEwJcjMsIFZDUFVfSElHSE1FTV9IQU5ETEVSKHI0KQotCVBQQ19TVEwJcjMsIEhTVEFURV9WTUhBTkRMRVIocjEzKQotCi0JUFBDX0xMCXIxMCwgVkNQVV9TSEFET1dfTVNSKHI0KQkvKiByMTAgPSB2Y3B1LT5hcmNoLnNoYWRvd19tc3IgKi8KLQotCURJU0FCTEVfSU5URVJSVVBUUwotCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKLQkvKiBTb21lIGd1ZXN0cyBtYXkgbmVlZCB0byBoYXZlIGRjYnogc2V0IHRvIDMyIGJ5dGUgbGVuZ3RoLgotCSAqCi0JICogVXN1YWxseSB3ZSBlbnN1cmUgdGhhdCBieSBwYXRjaGluZyB0aGUgZ3Vlc3QncyBpbnN0cnVjdGlvbnMKLQkgKiB0byB0cmFwIG9uIGRjYnogYW5kIGVtdWxhdGUgaXQgaW4gdGhlIGh5cGVydmlzb3IuCi0JICoKLQkgKiBJZiB3ZSBjYW4sIHdlIHNob3VsZCB0ZWxsIHRoZSBDUFUgdG8gdXNlIDMyIGJ5dGUgZGNieiB0aG91Z2gsCi0JICogYmVjYXVzZSB0aGF0J3MgYSBsb3QgZmFzdGVyLgotCSAqLwotCiAJUFBDX0xMCXIzLCBWQ1BVX0hGTEFHUyhyNCkKLQlybGRpY2wuCXIzLCByMywgMCwgNjMJCS8qIENSID0gKChyMyAmIDEpID09IDApICovCi0JYmVxCW5vX2RjYnozMl9vbgotCi0JbWZzcHIgICByMyxTUFJOX0hJRDUKLQlvcmkgICAgIHIzLCByMywgMHg4MAkJLyogWFhYIEhJRDVfZGNiejMyID0gMHg4MCAqLwotCW10c3ByICAgU1BSTl9ISUQ1LHIzCi0KLW5vX2RjYnozMl9vbjoKLQorCXJsZGljbAlyMywgcjMsIDAsIDYzCQkvKiByMyAmPSAxICovCisJc3RiCXIzLCBIU1RBVEVfUkVTVE9SRV9ISUQ1KHIxMykKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szU182NCAqLwogCi0JUFBDX0xMCXI2LCBWQ1BVX1JNQ0FMTChyNCkKLQltdGN0cglyNgotCi0JUFBDX0xMCXIzLCBWQ1BVX1RSQU1QT0xJTkVfRU5URVIocjQpCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBNU1JfS0VSTkVMICYgfihNU1JfSVIgfCBNU1JfRFIpKQorCVBQQ19MTAlyNCwgVkNQVV9TSEFET1dfTVNSKHI0KQkvKiBnZXQgc2hhZG93X21zciAqLwogCiAJLyogSnVtcCB0byBzZWdtZW50IHBhdGNoaW5nIGhhbmRsZXIgYW5kIGludG8gb3VyIGd1ZXN0ICovCi0JYmN0cgorCWJsCUZVTkMoa3ZtcHBjX2VudHJ5X3RyYW1wb2xpbmUpCisJbm9wCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGluIG1vZHVsZSBtZW1vcnkuIEl0IGdldHMganVtcGVkIGF0IGZyb20gdGhlCkBAIC0xNzAsMjEgKzEyNyw2IEBACiAJLyogUjcgPSB2Y3B1ICovCiAJUFBDX0xMCXI3LCBHUFI0KHIxKQogCi0jaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKLQotCVBQQ19MTAlyNSwgVkNQVV9IRkxBR1MocjcpCi0JcmxkaWNsLglyNSwgcjUsIDAsIDYzCQkvKiBDUiA9ICgocjUgJiAxKSA9PSAwKSAqLwotCWJlcQlub19kY2J6MzJfb2ZmCi0KLQlsaQlyNCwgMAotCW1mc3ByICAgcjUsU1BSTl9ISUQ1Ci0JcmxkaW1pICByNSxyNCw2LDU2Ci0JbXRzcHIgICBTUFJOX0hJRDUscjUKLQotbm9fZGNiejMyX29mZjoKLQotI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNTXzY0ICovCi0KIAlQUENfU1RMCXIxNCwgVkNQVV9HUFIocjE0KShyNykKIAlQUENfU1RMCXIxNSwgVkNQVV9HUFIocjE1KShyNykKIAlQUENfU1RMCXIxNiwgVkNQVV9HUFIocjE2KShyNykKQEAgLTIwNCw2NyArMTQ2LDYgQEAKIAlQUENfU1RMCXIzMCwgVkNQVV9HUFIocjMwKShyNykKIAlQUENfU1RMCXIzMSwgVkNQVV9HUFIocjMxKShyNykKIAotCS8qIFJlc3RvcmUgaG9zdCBtc3IgLT4gU1JSMSAqLwotCVBQQ19MTAlyNiwgVkNQVV9IT1NUX01TUihyNykKLQotCS8qCi0JICogRm9yIHNvbWUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBjYWxsIHRoZSByZWFsIExpbnV4Ci0JICogaGFuZGxlciwgc28gaXQgY2FuIGRvIHdvcmsgZm9yIHVzLiBUaGlzIGhhcyB0byBoYXBwZW4KLQkgKiBhcyBpZiB0aGUgaW50ZXJydXB0IGFycml2ZWQgZnJvbSB0aGUga2VybmVsIHRob3VnaCwKLQkgKiBzbyBsZXQncyBmYWtlIGl0IGhlcmUgd2hlcmUgbW9zdCBzdGF0ZSBpcyByZXN0b3JlZC4KLQkgKgotCSAqIENhbGwgTGludXggZm9yIGhhcmR3YXJlIGludGVycnVwdHMvZGVjcmVtZW50ZXIKLQkgKiByMyA9IGFkZHJlc3Mgb2YgaW50ZXJydXB0IGhhbmRsZXIgKGV4aXQgcmVhc29uKQotCSAqLwotCi0JY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCi0JYmVxCWNhbGxfbGludXhfaGFuZGxlcgotCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9ERUNSRU1FTlRFUgotCWJlcQljYWxsX2xpbnV4X2hhbmRsZXIKLQljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfUEVSRk1PTgotCWJlcQljYWxsX2xpbnV4X2hhbmRsZXIKLQotCS8qIEJhY2sgdG8gRUU9MSAqLwotCW10bXNyCXI2Ci0Jc3luYwotCWIJa3ZtX3JldHVybl9wb2ludAotCi1jYWxsX2xpbnV4X2hhbmRsZXI6Ci0KLQkvKgotCSAqIElmIHdlIGxhbmQgaGVyZSB3ZSBuZWVkIHRvIGp1bXAgYmFjayB0byB0aGUgaGFuZGxlciB3ZQotCSAqIGNhbWUgZnJvbS4KLQkgKgotCSAqIFdlIGhhdmUgYSBwYWdlIHRoYXQgd2UgY2FuIGFjY2VzcyBmcm9tIHJlYWwgbW9kZSwgc28gbGV0J3MKLQkgKiBqdW1wIGJhY2sgdG8gdGhhdCBhbmQgdXNlIGl0IGFzIGEgdHJhbXBvbGluZSB0byBnZXQgYmFjayBpbnRvIHRoZQotCSAqIGludGVycnVwdCBoYW5kbGVyIQotCSAqCi0JICogUjMgc3RpbGwgY29udGFpbnMgdGhlIGV4aXQgY29kZSwKLQkgKiBSNSBWQ1BVX0hPU1RfUkVUSVAgYW5kCi0JICogUjYgVkNQVV9IT1NUX01TUgotCSAqLwotCi0JLyogUmVzdG9yZSBob3N0IElQIC0+IFNSUjAgKi8KLQlQUENfTEwJcjUsIFZDUFVfSE9TVF9SRVRJUChyNykKLQotCS8qIFhYWCBCZXR0ZXIgbW92ZSB0byBhIHNhZmUgZnVuY3Rpb24/Ci0JICogICAgIFdoYXQgaWYgd2UgZ2V0IGFuIEhUQUIgZmx1c2ggaW4gYmV0d2VlbiBtdHNycjAgYW5kIG10c3JyMT8gKi8KLQotCW10bHIJcjEyCi0KLQlQUENfTEwJcjQsIFZDUFVfVFJBTVBPTElORV9MT1dNRU0ocjcpCi0JbXRzcnIwCXI0Ci0JTE9BRF9SRUdfSU1NRURJQVRFKHIzLCBNU1JfS0VSTkVMICYgfihNU1JfSVIgfCBNU1JfRFIpKQotCW10c3JyMQlyMwotCi0JUkZJCi0KLS5nbG9iYWwga3ZtX3JldHVybl9wb2ludAota3ZtX3JldHVybl9wb2ludDoKLQotCS8qIEp1bXAgYmFjayB0byBsaWdodHdlaWdodCBlbnRyeSBpZiB3ZSdyZSBzdXBwb3NlZCB0byAqLwotCS8qIGdvIGJhY2sgaW50byB0aGUgZ3Vlc3QgKi8KLQogCS8qIFBhc3MgdGhlIGV4aXQgbnVtYmVyIGFzIDNyZCBhcmd1bWVudCB0byBrdm1wcGNfaGFuZGxlX2V4aXQgKi8KIAltcglyNSwgcjEyCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wci5jCmluZGV4IDBjMGQzZjIuLmJjNGQ1MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMTUwLDE2ICsxNTEsMjIgQEAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAogCWlmICgocHZyID49IDB4MzMwMDAwKSAmJiAocHZyIDwgMHg3MDMzMDAwMCkpIHsKIAkJa3ZtcHBjX21tdV9ib29rM3NfNjRfaW5pdCh2Y3B1KTsKLQkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gMHhmZmYwMDAwMDsKKwkJaWYgKCF0b19ib29rM3ModmNwdSktPmhpb3Jfc3JlZ3MpCisJCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAweGZmZjAwMDAwOwogCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOworCQl2Y3B1LT5hcmNoLmNwdV90eXBlID0gS1ZNX0NQVV8zU182NDsKIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJa3ZtcHBjX21tdV9ib29rM3NfMzJfaW5pdCh2Y3B1KTsKLQkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gMDsKKwkJaWYgKCF0b19ib29rM3ModmNwdSktPmhpb3Jfc3JlZ3MpCisJCQl0b19ib29rM3ModmNwdSktPmhpb3IgPSAwOwogCQl0b19ib29rM3ModmNwdSktPm1zcl9tYXNrID0gMHhmZmZmZmZmZlVMTDsKKwkJdmNwdS0+YXJjaC5jcHVfdHlwZSA9IEtWTV9DUFVfM1NfMzI7CiAJfQogCisJa3ZtcHBjX3Nhbml0eV9jaGVjayh2Y3B1KTsKKwogCS8qIElmIHdlIGFyZSBpbiBoeXBlcnZpc29yIGxldmVsIG9uIDk3MCwgd2UgY2FuIHRlbGwgdGhlIENQVSB0bwogCSAqIHRyZWF0IERDQlogYXMgMzIgYnl0ZXMgc3RvcmUgKi8KIAl2Y3B1LT5hcmNoLmhmbGFncyAmPSB+Qk9PSzNTX0hGTEFHX0RDQlozMjsKQEAgLTY0Niw3ICs2NTMsMjcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgQk9PSzNTX0lOVEVSUlVQVF9TWVNDQUxMOgotCQlpZiAodmNwdS0+YXJjaC5vc2lfZW5hYmxlZCAmJgorCQlpZiAodmNwdS0+YXJjaC5wYXByX2VuYWJsZWQgJiYKKwkJICAgIChrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KSA9PSAweDQ0MDAwMDIyKSAmJgorCQkgICAgISh2Y3B1LT5hcmNoLnNoYXJlZC0+bXNyICYgTVNSX1BSKSkgeworCQkJLyogU0MgMSBwYXByIGh5cGVyY2FsbHMgKi8KKwkJCXVsb25nIGNtZCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDMpOworCQkJaW50IGk7CisKKwkJCWlmIChrdm1wcGNfaF9wcih2Y3B1LCBjbWQpID09IEVNVUxBVEVfRE9ORSkgeworCQkJCXIgPSBSRVNVTUVfR1VFU1Q7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJ1bi0+cGFwcl9oY2FsbC5uciA9IGNtZDsKKwkJCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpIHsKKwkJCQl1bG9uZyBncHIgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0ICsgaSk7CisJCQkJcnVuLT5wYXByX2hjYWxsLmFyZ3NbaV0gPSBncHI7CisJCQl9CisJCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfUEFQUl9IQ0FMTDsKKwkJCXZjcHUtPmFyY2guaGNhbGxfbmVlZGVkID0gMTsKKwkJCXIgPSBSRVNVTUVfSE9TVDsKKwkJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLm9zaV9lbmFibGVkICYmCiAJCSAgICAoKCh1MzIpa3ZtcHBjX2dldF9ncHIodmNwdSwgMykpID09IE9TSV9TQ19NQUdJQ19SMykgJiYKIAkJICAgICgoKHUzMilrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KSkgPT0gT1NJX1NDX01BR0lDX1I0KSkgewogCQkJLyogTU9MIGh5cGVyY2FsbHMgKi8KQEAgLTc3MCw2ICs3OTcsOSBAQAogCQl9CiAJfQogCisJaWYgKHNyZWdzLT51LnMuZmxhZ3MgJiBLVk1fU1JFR1NfU19ISU9SKQorCQlzcmVncy0+dS5zLmhpb3IgPSB0b19ib29rM3ModmNwdSktPmhpb3I7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODA2LDYgKzgzNiwxMSBAQAogCS8qIEZsdXNoIHRoZSBNTVUgYWZ0ZXIgbWVzc2luZyB3aXRoIHRoZSBzZWdtZW50cyAqLwogCWt2bXBwY19tbXVfcHRlX2ZsdXNoKHZjcHUsIDAsIDApOwogCisJaWYgKHNyZWdzLT51LnMuZmxhZ3MgJiBLVk1fU1JFR1NfU19ISU9SKSB7CisJCXRvX2Jvb2szcyh2Y3B1KS0+aGlvcl9zcmVncyA9IHRydWU7CisJCXRvX2Jvb2szcyh2Y3B1KS0+aGlvciA9IHNyZWdzLT51LnMuaGlvcjsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODQxLDggKzg3Niw2IEBACiAJaWYgKCFwKQogCQlnb3RvIHVuaW5pdF92Y3B1OwogCi0JdmNwdS0+YXJjaC5ob3N0X3JldGlwID0ga3ZtX3JldHVybl9wb2ludDsKLQl2Y3B1LT5hcmNoLmhvc3RfbXNyID0gbWZtc3IoKTsKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAogCS8qIGRlZmF1bHQgdG8gYm9vazNzXzY0ICg5NzBmeCkgKi8KIAl2Y3B1LT5hcmNoLnB2ciA9IDB4M0MwMzAxOwpAQCAtODUzLDE2ICs4ODYsNiBAQAogCWt2bXBwY19zZXRfcHZyKHZjcHUsIHZjcHUtPmFyY2gucHZyKTsKIAl2Y3B1LT5hcmNoLnNsYl9uciA9IDY0OwogCi0JLyogcmVtZW1iZXIgd2hlcmUgc29tZSByZWFsLW1vZGUgaGFuZGxlcnMgYXJlICovCi0JdmNwdS0+YXJjaC50cmFtcG9saW5lX2xvd21lbSA9IF9fcGEoa3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmUpOwotCXZjcHUtPmFyY2gudHJhbXBvbGluZV9lbnRlciA9IF9fcGEoa3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlcik7Ci0JdmNwdS0+YXJjaC5oaWdobWVtX2hhbmRsZXIgPSAodWxvbmcpa3ZtcHBjX2hhbmRsZXJfaGlnaG1lbTsKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAotCXZjcHUtPmFyY2gucm1jYWxsID0gKih1bG9uZyopa3ZtcHBjX3JtY2FsbDsKLSNlbHNlCi0JdmNwdS0+YXJjaC5ybWNhbGwgPSAodWxvbmcpa3ZtcHBjX3JtY2FsbDsKLSNlbmRpZgotCiAJdmNwdS0+YXJjaC5zaGFkb3dfbXNyID0gTVNSX1VTRVI2NDsKIAogCWVyciA9IGt2bXBwY19tbXVfaW5pdCh2Y3B1KTsKQEAgLTkwOCw2ICs5MzEsMTIgQEAKICNlbmRpZgogCXVsb25nIGV4dF9tc3I7CiAKKwkvKiBDaGVjayBpZiB3ZSBjYW4gcnVuIHRoZSB2Y3B1IGF0IGFsbCAqLworCWlmICghdmNwdS0+YXJjaC5zYW5lKSB7CisJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5URVJOQUxfRVJST1I7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIE5vIG5lZWQgdG8gZ28gaW50byB0aGUgZ3Vlc3Qgd2hlbiBhbGwgd2UgZG8gaXMgZ29pbmcgb3V0ICovCiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByX3BhcHIuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByX3BhcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU4OTMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHJfcGFwci5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLiBGcmVlc2NhbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBBbGV4YW5kZXIgR3JhZiA8YWdyYWZAc3VzZS5kZT4KKyAqICAgIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIEh5cGVyY2FsbCBoYW5kbGluZyBmb3IgcnVubmluZyBQQVBSIGd1ZXN0cyBpbiBQUiBLVk0gb24gQm9vayAzUworICogcHJvY2Vzc29ycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2Jvb2szcy5oPgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcHRlZ19hZGRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgbG9uZyBwdGVfaW5kZXgpCit7CisJc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdmNwdV9ib29rM3MgPSB0b19ib29rM3ModmNwdSk7CisJdW5zaWduZWQgbG9uZyBwdGVnX2FkZHI7CisKKwlwdGVfaW5kZXggPDw9IDQ7CisJcHRlX2luZGV4ICY9ICgoMSA8PCAoKHZjcHVfYm9vazNzLT5zZHIxICYgMHgxZikgKyAxMSkpIC0gMSkgPDwgNyB8IDB4NzA7CisJcHRlZ19hZGRyID0gdmNwdV9ib29rM3MtPnNkcjEgJiAweGZmZmZmZmZmZmZmYzAwMDBVTEw7CisJcHRlZ19hZGRyIHw9IHB0ZV9pbmRleDsKKworCXJldHVybiBwdGVnX2FkZHI7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX2hfcHJfZW50ZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWxvbmcgZmxhZ3MgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KTsKKwlsb25nIHB0ZV9pbmRleCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDUpOworCXVuc2lnbmVkIGxvbmcgcHRlZ1syICogOF07CisJdW5zaWduZWQgbG9uZyBwdGVnX2FkZHIsIGksICpocHRlOworCisJcHRlX2luZGV4ICY9IH43VUw7CisJcHRlZ19hZGRyID0gZ2V0X3B0ZWdfYWRkcih2Y3B1LCBwdGVfaW5kZXgpOworCisJY29weV9mcm9tX3VzZXIocHRlZywgKHZvaWQgX191c2VyICopcHRlZ19hZGRyLCBzaXplb2YocHRlZykpOworCWhwdGUgPSBwdGVnOworCisJaWYgKGxpa2VseSgoZmxhZ3MgJiBIX0VYQUNUKSA9PSAwKSkgeworCQlwdGVfaW5kZXggJj0gfjdVTDsKKwkJZm9yIChpID0gMDsgOyArK2kpIHsKKwkJCWlmIChpID09IDgpCisJCQkJcmV0dXJuIEhfUFRFR19GVUxMOworCQkJaWYgKCgqaHB0ZSAmIEhQVEVfVl9WQUxJRCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWhwdGUgKz0gMjsKKwkJfQorCX0gZWxzZSB7CisJCWkgPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA1KSAmIDdVTDsKKwkJaHB0ZSArPSBpICogMjsKKwl9CisKKwlocHRlWzBdID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNik7CisJaHB0ZVsxXSA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDcpOworCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilwdGVnX2FkZHIsIHB0ZWcsIHNpemVvZihwdGVnKSk7CisJa3ZtcHBjX3NldF9ncHIodmNwdSwgMywgSF9TVUNDRVNTKTsKKwlrdm1wcGNfc2V0X2dwcih2Y3B1LCA0LCBwdGVfaW5kZXggfCBpKTsKKworCXJldHVybiBFTVVMQVRFX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX2hfcHJfcmVtb3ZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA0KTsKKwl1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDUpOworCXVuc2lnbmVkIGxvbmcgYXZwbiA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDYpOworCXVuc2lnbmVkIGxvbmcgdiA9IDAsIHB0ZWcsIHJiOworCXVuc2lnbmVkIGxvbmcgcHRlWzJdOworCisJcHRlZyA9IGdldF9wdGVnX2FkZHIodmNwdSwgcHRlX2luZGV4KTsKKwljb3B5X2Zyb21fdXNlcihwdGUsICh2b2lkIF9fdXNlciAqKXB0ZWcsIHNpemVvZihwdGUpKTsKKworCWlmICgocHRlWzBdICYgSFBURV9WX1ZBTElEKSA9PSAwIHx8CisJICAgICgoZmxhZ3MgJiBIX0FWUE4pICYmIChwdGVbMF0gJiB+MHg3ZlVMKSAhPSBhdnBuKSB8fAorCSAgICAoKGZsYWdzICYgSF9BTkRDT05EKSAmJiAocHRlWzBdICYgYXZwbikgIT0gMCkpIHsKKwkJa3ZtcHBjX3NldF9ncHIodmNwdSwgMywgSF9OT1RfRk9VTkQpOworCQlyZXR1cm4gRU1VTEFURV9ET05FOworCX0KKworCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilwdGVnLCAmdiwgc2l6ZW9mKHYpKTsKKworCXJiID0gY29tcHV0ZV90bGJpZV9yYihwdGVbMF0sIHB0ZVsxXSwgcHRlX2luZGV4KTsKKwl2Y3B1LT5hcmNoLm1tdS50bGJpZSh2Y3B1LCByYiwgcmIgJiAxID8gdHJ1ZSA6IGZhbHNlKTsKKworCWt2bXBwY19zZXRfZ3ByKHZjcHUsIDMsIEhfU1VDQ0VTUyk7CisJa3ZtcHBjX3NldF9ncHIodmNwdSwgNCwgcHRlWzBdKTsKKwlrdm1wcGNfc2V0X2dwcih2Y3B1LCA1LCBwdGVbMV0pOworCisJcmV0dXJuIEVNVUxBVEVfRE9ORTsKK30KKworc3RhdGljIGludCBrdm1wcGNfaF9wcl9wcm90ZWN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0ga3ZtcHBjX2dldF9ncHIodmNwdSwgNCk7CisJdW5zaWduZWQgbG9uZyBwdGVfaW5kZXggPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA1KTsKKwl1bnNpZ25lZCBsb25nIGF2cG4gPSBrdm1wcGNfZ2V0X2dwcih2Y3B1LCA2KTsKKwl1bnNpZ25lZCBsb25nIHJiLCBwdGVnLCByLCB2OworCXVuc2lnbmVkIGxvbmcgcHRlWzJdOworCisJcHRlZyA9IGdldF9wdGVnX2FkZHIodmNwdSwgcHRlX2luZGV4KTsKKwljb3B5X2Zyb21fdXNlcihwdGUsICh2b2lkIF9fdXNlciAqKXB0ZWcsIHNpemVvZihwdGUpKTsKKworCWlmICgocHRlWzBdICYgSFBURV9WX1ZBTElEKSA9PSAwIHx8CisJICAgICgoZmxhZ3MgJiBIX0FWUE4pICYmIChwdGVbMF0gJiB+MHg3ZlVMKSAhPSBhdnBuKSkgeworCQlrdm1wcGNfc2V0X2dwcih2Y3B1LCAzLCBIX05PVF9GT1VORCk7CisJCXJldHVybiBFTVVMQVRFX0RPTkU7CisJfQorCisJdiA9IHB0ZVswXTsKKwlyID0gcHRlWzFdOworCXIgJj0gfihIUFRFX1JfUFAwIHwgSFBURV9SX1BQIHwgSFBURV9SX04gfCBIUFRFX1JfS0VZX0hJIHwKKwkgICAgICAgSFBURV9SX0tFWV9MTyk7CisJciB8PSAoZmxhZ3MgPDwgNTUpICYgSFBURV9SX1BQMDsKKwlyIHw9IChmbGFncyA8PCA0OCkgJiBIUFRFX1JfS0VZX0hJOworCXIgfD0gZmxhZ3MgJiAoSFBURV9SX1BQIHwgSFBURV9SX04gfCBIUFRFX1JfS0VZX0xPKTsKKworCXB0ZVsxXSA9IHI7CisKKwlyYiA9IGNvbXB1dGVfdGxiaWVfcmIodiwgciwgcHRlX2luZGV4KTsKKwl2Y3B1LT5hcmNoLm1tdS50bGJpZSh2Y3B1LCByYiwgcmIgJiAxID8gdHJ1ZSA6IGZhbHNlKTsKKwljb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopcHRlZywgcHRlLCBzaXplb2YocHRlKSk7CisKKwlrdm1wcGNfc2V0X2dwcih2Y3B1LCAzLCBIX1NVQ0NFU1MpOworCisJcmV0dXJuIEVNVUxBVEVfRE9ORTsKK30KKworaW50IGt2bXBwY19oX3ByKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhfRU5URVI6CisJCXJldHVybiBrdm1wcGNfaF9wcl9lbnRlcih2Y3B1KTsKKwljYXNlIEhfUkVNT1ZFOgorCQlyZXR1cm4ga3ZtcHBjX2hfcHJfcmVtb3ZlKHZjcHUpOworCWNhc2UgSF9QUk9URUNUOgorCQlyZXR1cm4ga3ZtcHBjX2hfcHJfcHJvdGVjdCh2Y3B1KTsKKwljYXNlIEhfQlVMS19SRU1PVkU6CisJCS8qIFdlIGp1c3QgZmx1c2ggYWxsIFBURXMsIHNvIHVzZXIgc3BhY2UgY2FuCisJCSAgIGhhbmRsZSB0aGUgSFBUIG1vZGlmaWNhdGlvbnMgKi8KKwkJa3ZtcHBjX21tdV9wdGVfZmx1c2godmNwdSwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgSF9DRURFOgorCQlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKKwkJdmNwdS0+c3RhdC5oYWx0X3dha2V1cCsrOworCQlyZXR1cm4gRU1VTEFURV9ET05FOworCX0KKworCXJldHVybiBFTVVMQVRFX0ZBSUw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19ybWhhbmRsZXJzLlMKaW5kZXggYzFmODc3Yy4uMzQxODc1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfcm1oYW5kbGVycy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3JtaGFuZGxlcnMuUwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9hc20uaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKQEAgLTM1LDEwICszNiwxMCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX0JPT0szU182NCkKIAotI2RlZmluZSBMT0FEX1NIQURPV19WQ1BVKHJlZykJR0VUX1BBQ0EocmVnKQkJCQkJCi0jZGVmaW5lIE1TUl9OT0lSUQkJTVNSX0tFUk5FTCAmIH4oTVNSX0lSIHwgTVNSX0RSKQogI2RlZmluZSBGVU5DKG5hbWUpIAkJR0xVRSguLG5hbWUpCisjZGVmaW5lIE1UTVNSX0VFUkkocmVnKQkJbXRtc3JkCShyZWcpLDEKIAorCS5nbG9ibAlrdm1wcGNfc2tpcF9pbnRlcnJ1cHQKIGt2bXBwY19za2lwX2ludGVycnVwdDoKIAkvKgogCSAqIEhlcmUgYWxsIEdQUnMgYXJlIHVuY2hhbmdlZCBmcm9tIHdoZW4gdGhlIGludGVycnVwdCBoYXBwZW5lZApAQCAtNTEsNiArNTIsNyBAQAogCXJmaWQKIAliCS4KIAorCS5nbG9ibAlrdm1wcGNfc2tpcF9IaW50ZXJydXB0CiBrdm1wcGNfc2tpcF9IaW50ZXJydXB0OgogCS8qCiAJICogSGVyZSBhbGwgR1BScyBhcmUgdW5jaGFuZ2VkIGZyb20gd2hlbiB0aGUgaW50ZXJydXB0IGhhcHBlbmVkCkBAIC02NSw4ICs2Nyw4IEBACiAKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1NfMzIpCiAKLSNkZWZpbmUgTVNSX05PSVJRCQlNU1JfS0VSTkVMCiAjZGVmaW5lIEZVTkMobmFtZSkJCW5hbWUKKyNkZWZpbmUgTVRNU1JfRUVSSShyZWcpCQltdG1zcgkocmVnKQogCiAubWFjcm8gSU5URVJSVVBUX1RSQU1QT0xJTkUgaW50bm8KIApAQCAtMTY3LDQwICsxNjksMjQgQEAKICNlbmRpZgogCiAvKgotICogVGhpcyB0cmFtcG9saW5lIGJyaW5ncyB1cyBiYWNrIHRvIGEgcmVhbCBtb2RlIGhhbmRsZXIKKyAqIENhbGwga3ZtcHBjX2hhbmRsZXJfdHJhbXBvbGluZV9lbnRlciBpbiByZWFsIG1vZGUKICAqCi0gKiBJbnB1dCBSZWdpc3RlcnM6Ci0gKgotICogUjUgPSBTUlIwCi0gKiBSNiA9IFNSUjEKLSAqIExSID0gcmVhbC1tb2RlIElQCi0gKgorICogT24gZW50cnksIHI0IGNvbnRhaW5zIHRoZSBndWVzdCBzaGFkb3cgTVNSCiAgKi8KLS5nbG9iYWwga3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmUKLWt2bXBwY19oYW5kbGVyX2xvd21lbV90cmFtcG9saW5lOgorX0dMT0JBTChrdm1wcGNfZW50cnlfdHJhbXBvbGluZSkKKwltZm1zcglyNQorCUxPQURfUkVHX0FERFIocjcsIGt2bXBwY19oYW5kbGVyX3RyYW1wb2xpbmVfZW50ZXIpCisJdG9yZWFsKHI3KQogCi0JbXRzcnIwCXI1CisJbGkJcjksIE1TUl9SSQorCW9yaQlyOSwgcjksIE1TUl9FRQorCWFuZGMJcjksIHI1LCByOQkvKiBDbGVhciBFRSBhbmQgUkkgaW4gTVNSIHZhbHVlICovCisJbGkJcjYsIE1TUl9JUiB8IE1TUl9EUgorCW9yaQlyNiwgcjYsIE1TUl9FRQorCWFuZGMJcjYsIHI1LCByNgkvKiBDbGVhciBFRSwgRFIgYW5kIElSIGluIE1TUiB2YWx1ZSAqLworCU1UTVNSX0VFUkkocjkpCQkvKiBDbGVhciBFRSBhbmQgUkkgaW4gTVNSICovCisJbXRzcnIwCXI3CQkvKiBiZWZvcmUgd2Ugc2V0IHNycjAvMSAqLwogCW10c3JyMQlyNgotCWJscgota3ZtcHBjX2hhbmRsZXJfbG93bWVtX3RyYW1wb2xpbmVfZW5kOgotCi0vKgotICogQ2FsbCBhIGZ1bmN0aW9uIGluIHJlYWwgbW9kZQotICoKLSAqIElucHV0IFJlZ2lzdGVyczoKLSAqCi0gKiBSMyA9IGZ1bmN0aW9uCi0gKiBSNCA9IE1TUgotICogUjUgPSBzY3JhdGNoIHJlZ2lzdGVyCi0gKgotICovCi1fR0xPQkFMKGt2bXBwY19ybWNhbGwpCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI1LCBNU1JfTk9JUlEpCi0JbXRtc3IJcjUJCS8qIERpc2FibGUgcmVsb2NhdGlvbiBhbmQgaW50ZXJydXB0cywgc28gbXRzcnIKLQkJCQkgICBkb2Vzbid0IGdldCBpbnRlcnJ1cHRlZCAqLwotCXN5bmMKLQltdHNycjAJcjMKLQltdHNycjEJcjQKIAlSRkkKIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1NfMzIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19zZWdtZW50LlMKaW5kZXggYWVkMzJlNS4uMDY3NmFlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nfc2VnbWVudC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3NlZ21lbnQuUwpAQCAtMjMsNiArMjMsNyBAQAogCiAjZGVmaW5lIEdFVF9TSEFET1dfVkNQVShyZWcpICAgIFwKIAltcglyZWcsIHIxMworI2RlZmluZSBNVE1TUl9FRVJJKHJlZykJCW10bXNyZAkocmVnKSwxCiAKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM1NfMzIpCiAKQEAgLTMwLDYgKzMxLDcgQEAKIAl0b3BoeXMocmVnLCByMik7ICAgICAgIAkJCVwKIAlsd3ogICAgIHJlZywgKFRIUkVBRCArIFRIUkVBRF9LVk1fU1ZDUFUpKHJlZyk7CVwKIAl0b3BoeXMocmVnLCByZWcpCisjZGVmaW5lIE1UTVNSX0VFUkkocmVnKQkJbXRtc3IJKHJlZykKIAogI2VuZGlmCiAKQEAgLTU3LDEwICs1OSwxMiBAQAogCS8qIFJlcXVpcmVkIHN0YXRlOgogCSAqCiAJICogTVNSID0gfklSfERSCi0JICogUjEzID0gUEFDQQogCSAqIFIxID0gaG9zdCBSMQogCSAqIFIyID0gaG9zdCBSMgotCSAqIFIxMCA9IGd1ZXN0IE1TUgorCSAqIFI0ID0gZ3Vlc3Qgc2hhZG93IE1TUgorCSAqIFI1ID0gbm9ybWFsIGhvc3QgTVNSCisJICogUjYgPSBjdXJyZW50IGhvc3QgTVNSIChFRSwgSVIsIERSIG9mZikKKwkgKiBMUiA9IGhpZ2htZW0gZ3Vlc3QgZXhpdCBjb2RlCiAJICogYWxsIG90aGVyIHZvbGF0aWxlIEdQUlMgPSBmcmVlCiAJICogU1ZDUFVbQ1JdID0gZ3Vlc3QgQ1IKIAkgKiBTVkNQVVtYRVJdID0gZ3Vlc3QgWEVSCkBAIC03MSwxNSArNzUsMTUgQEAKIAkvKiByMyA9IHNoYWRvdyB2Y3B1ICovCiAJR0VUX1NIQURPV19WQ1BVKHIzKQogCisJLyogU2F2ZSBndWVzdCBleGl0IGhhbmRsZXIgYWRkcmVzcyBhbmQgTVNSICovCisJbWZscglyMAorCVBQQ19TVEwJcjAsIEhTVEFURV9WTUhBTkRMRVIocjMpCisJUFBDX1NUTAlyNSwgSFNUQVRFX0hPU1RfTVNSKHIzKQorCiAJLyogU2F2ZSBSMS9SMiBpbiB0aGUgUEFDQSAoNjQtYml0KSBvciBzaGFkb3dfdmNwdSAoMzItYml0KSAqLwogCVBQQ19TVEwJcjEsIEhTVEFURV9IT1NUX1IxKHIzKQogCVBQQ19TVEwJcjIsIEhTVEFURV9IT1NUX1IyKHIzKQogCi0JLyogTW92ZSBTUlIwIGFuZCBTUlIxIGludG8gdGhlIHJlc3BlY3RpdmUgcmVncyAqLwotCVBQQ19MTCAgcjksIFNWQ1BVX1BDKHIzKQotCW10c3JyMAlyOQotCW10c3JyMQlyMTAKLQogCS8qIEFjdGl2YXRlIGd1ZXN0IG1vZGUsIHNvIGZhdWx0cyBnZXQgaGFuZGxlZCBieSBLVk0gKi8KIAlsaQlyMTEsIEtWTV9HVUVTVF9NT0RFX0dVRVNUCiAJc3RiCXIxMSwgSFNUQVRFX0lOX0dVRVNUKHIzKQpAQCAtODcsMTcgKzkxLDQ2IEBACiAJLyogU3dpdGNoIHRvIGd1ZXN0IHNlZ21lbnQuIFRoaXMgaXMgc3ViYXJjaCBzcGVjaWZpYy4gKi8KIAlMT0FEX0dVRVNUX1NFR01FTlRTCiAKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorCS8qIFNvbWUgZ3Vlc3RzIG1heSBuZWVkIHRvIGhhdmUgZGNieiBzZXQgdG8gMzIgYnl0ZSBsZW5ndGguCisJICoKKwkgKiBVc3VhbGx5IHdlIGVuc3VyZSB0aGF0IGJ5IHBhdGNoaW5nIHRoZSBndWVzdCdzIGluc3RydWN0aW9ucworCSAqIHRvIHRyYXAgb24gZGNieiBhbmQgZW11bGF0ZSBpdCBpbiB0aGUgaHlwZXJ2aXNvci4KKwkgKgorCSAqIElmIHdlIGNhbiwgd2Ugc2hvdWxkIHRlbGwgdGhlIENQVSB0byB1c2UgMzIgYnl0ZSBkY2J6IHRob3VnaCwKKwkgKiBiZWNhdXNlIHRoYXQncyBhIGxvdCBmYXN0ZXIuCisJICovCisJbGJ6CXIwLCBIU1RBVEVfUkVTVE9SRV9ISUQ1KHIzKQorCWNtcHdpCXIwLCAwCisJYmVxCW5vX2RjYnozMl9vbgorCisJbWZzcHIgICByMCxTUFJOX0hJRDUKKwlvcmkgICAgIHIwLCByMCwgMHg4MAkJLyogWFhYIEhJRDVfZGNiejMyID0gMHg4MCAqLworCW10c3ByICAgU1BSTl9ISUQ1LHIwCitub19kY2J6MzJfb246CisKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szU182NCAqLworCiAJLyogRW50ZXIgZ3Vlc3QgKi8KIAotCVBQQ19MTAlyNCwgU1ZDUFVfQ1RSKHIzKQotCVBQQ19MTAlyNSwgU1ZDUFVfTFIocjMpCi0JbHd6CXI2LCBTVkNQVV9DUihyMykKLQlsd3oJcjcsIFNWQ1BVX1hFUihyMykKKwlQUENfTEwJcjgsIFNWQ1BVX0NUUihyMykKKwlQUENfTEwJcjksIFNWQ1BVX0xSKHIzKQorCWx3eglyMTAsIFNWQ1BVX0NSKHIzKQorCWx3eglyMTEsIFNWQ1BVX1hFUihyMykKIAotCW10Y3RyCXI0Ci0JbXRscglyNQotCW10Y3IJcjYKLQltdHhlcglyNworCW10Y3RyCXI4CisJbXRscglyOQorCW10Y3IJcjEwCisJbXR4ZXIJcjExCisKKwkvKiBNb3ZlIFNSUjAgYW5kIFNSUjEgaW50byB0aGUgcmVzcGVjdGl2ZSByZWdzICovCisJUFBDX0xMICByOSwgU1ZDUFVfUEMocjMpCisJLyogRmlyc3QgY2xlYXIgUkkgaW4gb3VyIGN1cnJlbnQgTVNSIHZhbHVlICovCisJbGkJcjAsIE1TUl9SSQorCWFuZGMJcjYsIHI2LCByMAorCU1UTVNSX0VFUkkocjYpCisJbXRzcnIwCXI5CisJbXRzcnIxCXI0CiAKIAlQUENfTEwJcjAsIFNWQ1BVX1IwKHIzKQogCVBQQ19MTAlyMSwgU1ZDUFVfUjEocjMpCkBAIC0yMTMsMTEgKzI0NiwxNiBAQAogCWJlcQlsZF9sYXN0X2luc3QKIAljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfUFJPR1JBTQogCWJlcQlsZF9sYXN0X2luc3QKKwljbXB3aQlyMTIsIEJPT0szU19JTlRFUlJVUFRfU1lTQ0FMTAorCWJlcQlsZF9sYXN0X3ByZXZfaW5zdAogCWNtcHdpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9BTElHTk1FTlQKIAliZXEtCWxkX2xhc3RfaW5zdAogCiAJYglub19sZF9sYXN0X2luc3QKIAorbGRfbGFzdF9wcmV2X2luc3Q6CisJYWRkaQlyMywgcjMsIC00CisKIGxkX2xhc3RfaW5zdDoKIAkvKiBTYXZlIG9mZiB0aGUgZ3Vlc3QgaW5zdHJ1Y3Rpb24gd2UncmUgYXQgKi8KIApAQCAtMjU0LDYgKzI5Miw0MyBAQAogCS8qIFN3aXRjaCBiYWNrIHRvIGhvc3QgTU1VICovCiAJTE9BRF9IT1NUX1NFR01FTlRTCiAKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorCisJbGJ6CXI1LCBIU1RBVEVfUkVTVE9SRV9ISUQ1KHIxMykKKwljbXB3aQlyNSwgMAorCWJlcQlub19kY2J6MzJfb2ZmCisKKwlsaQlyNCwgMAorCW1mc3ByICAgcjUsU1BSTl9ISUQ1CisJcmxkaW1pICByNSxyNCw2LDU2CisJbXRzcHIgICBTUFJOX0hJRDUscjUKKworbm9fZGNiejMyX29mZjoKKworI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNTXzY0ICovCisKKwkvKgorCSAqIEZvciBzb21lIGludGVycnVwdHMsIHdlIG5lZWQgdG8gY2FsbCB0aGUgcmVhbCBMaW51eAorCSAqIGhhbmRsZXIsIHNvIGl0IGNhbiBkbyB3b3JrIGZvciB1cy4gVGhpcyBoYXMgdG8gaGFwcGVuCisJICogYXMgaWYgdGhlIGludGVycnVwdCBhcnJpdmVkIGZyb20gdGhlIGtlcm5lbCB0aG91Z2gsCisJICogc28gbGV0J3MgZmFrZSBpdCBoZXJlIHdoZXJlIG1vc3Qgc3RhdGUgaXMgcmVzdG9yZWQuCisJICoKKwkgKiBIYXZpbmcgc2V0IHVwIFNSUjAvMSB3aXRoIHRoZSBhZGRyZXNzIHdoZXJlIHdlIHdhbnQKKwkgKiB0byBjb250aW51ZSB3aXRoIHJlbG9jYXRpb24gb24gKHBvdGVudGlhbGx5IGluIG1vZHVsZQorCSAqIHNwYWNlKSwgd2UgZWl0aGVyIGp1c3QgZ28gc3RyYWlnaHQgdGhlcmUgd2l0aCByZmlbZF0sCisJICogb3Igd2UganVtcCB0byBhbiBpbnRlcnJ1cHQgaGFuZGxlciB3aXRoIGJjdHIgaWYgdGhlcmUKKwkgKiBpcyBhbiBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBmaXJzdC4gIEluIHRoZSBsYXR0ZXIKKwkgKiBjYXNlLCB0aGUgcmZpW2RdIGF0IHRoZSBlbmQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyCisJICogd2lsbCBnZXQgdXMgYmFjayB0byB3aGVyZSB3ZSB3YW50IHRvIGNvbnRpbnVlLgorCSAqLworCisJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisJYmVxCTFmCisJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX0RFQ1JFTUVOVEVSCisJYmVxCTFmCisJY21wd2kJcjEyLCBCT09LM1NfSU5URVJSVVBUX1BFUkZNT04KKzE6CW10Y3RyCXIxMgorCiAJLyogUmVnaXN0ZXIgdXNhZ2UgYXQgdGhpcyBwb2ludDoKIAkgKgogCSAqIFIxICAgICAgID0gaG9zdCBSMQpAQCAtMjY0LDEzICszMzksMTUgQEAKIAkgKgogCSAqLwogCi0JLyogUkZJIGludG8gdGhlIGhpZ2htZW0gaGFuZGxlciAqLwotCW1mbXNyCXI3Ci0Jb3JpCXI3LCByNywgTVNSX0lSfE1TUl9EUnxNU1JfUkl8TVNSX01FCS8qIEVuYWJsZSBwYWdpbmcgKi8KLQltdHNycjEJcjcKLQkvKiBMb2FkIGhpZ2htZW0gaGFuZGxlciBhZGRyZXNzICovCisJUFBDX0xMCXI2LCBIU1RBVEVfSE9TVF9NU1IocjEzKQogCVBQQ19MTAlyOCwgSFNUQVRFX1ZNSEFORExFUihyMTMpCisKKwkvKiBSZXN0b3JlIGhvc3QgbXNyIC0+IFNSUjEgKi8KKwltdHNycjEJcjYKKwkvKiBMb2FkIGhpZ2htZW0gaGFuZGxlciBhZGRyZXNzICovCiAJbXRzcnIwCXI4CiAKKwkvKiBSRkkgaW50byB0aGUgaGlnaG1lbSBoYW5kbGVyLCBvciBqdW1wIHRvIGludGVycnVwdCBoYW5kbGVyICovCisJYmVxY3RyCiAJUkZJCiBrdm1wcGNfaGFuZGxlcl90cmFtcG9saW5lX2V4aXRfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCmluZGV4IGVlNDVmYTAuLmJiNmM5ODggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKQEAgLTMxNiw2ICszMTYsMTEgQEAKIHsKIAlpbnQgcmV0OwogCisJaWYgKCF2Y3B1LT5hcmNoLnNhbmUpIHsKKwkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlrdm1fZ3Vlc3RfZW50ZXIoKTsKIAlyZXQgPSBfX2t2bXBwY192Y3B1X3J1bihrdm1fcnVuLCB2Y3B1KTsKQEAgLTYxOCw2ICs2MjMsNyBAQAogaW50IGt2bV9hcmNoX3ZjcHVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCBpOworCWludCByOwogCiAJdmNwdS0+YXJjaC5wYyA9IDA7CiAJdmNwdS0+YXJjaC5zaGFyZWQtPm1zciA9IDA7CkBAIC02MzQsNyArNjQwLDkgQEAKIAogCWt2bXBwY19pbml0X3RpbWluZ19zdGF0cyh2Y3B1KTsKIAotCXJldHVybiBrdm1wcGNfY29yZV92Y3B1X3NldHVwKHZjcHUpOworCXIgPSBrdm1wcGNfY29yZV92Y3B1X3NldHVwKHZjcHUpOworCWt2bXBwY19zYW5pdHlfY2hlY2sodmNwdSk7CisJcmV0dXJuIHI7CiB9CiAKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYwppbmRleCA3OTdhNzQ0Li4yNmQyMDkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYwpAQCAtNzMsNiArNzMsOCBAQAogCS8qIFNpbmNlIGJvb2tlIGt2bSBvbmx5IHN1cHBvcnQgb25lIGNvcmUsIHVwZGF0ZSBhbGwgdmNwdXMnIFBJUiB0byAwICovCiAJdmNwdS0+dmNwdV9pZCA9IDA7CiAKKwl2Y3B1LT5hcmNoLmNwdV90eXBlID0gS1ZNX0NQVV9FNTAwVjI7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwppbmRleCBhMTA3YzliLi5lZmJmOWFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC0zOSwxMiArMzgsOCBAQAogCiBpbnQga3ZtX2FyY2hfdmNwdV9ydW5uYWJsZShzdHJ1Y3Qga3ZtX3ZjcHUgKnYpCiB7Ci0jaWZuZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCiAJcmV0dXJuICEodi0+YXJjaC5zaGFyZWQtPm1zciAmIE1TUl9XRSkgfHwKIAkgICAgICAgISEodi0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpOwotI2Vsc2UKLQlyZXR1cm4gISh2LT5hcmNoLmNlZGVkKSB8fCAhISh2LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucyk7Ci0jZW5kaWYKIH0KIAogaW50IGt2bXBwY19rdm1fcHYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtOTUsNiArOTAsMzEgQEAKIAlyZXR1cm4gcjsKIH0KIAoraW50IGt2bXBwY19zYW5pdHlfY2hlY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCByID0gZmFsc2U7CisKKwkvKiBXZSBoYXZlIHRvIGtub3cgd2hhdCBDUFUgdG8gdmlydHVhbGl6ZSAqLworCWlmICghdmNwdS0+YXJjaC5wdnIpCisJCWdvdG8gb3V0OworCisJLyogUEFQUiBvbmx5IHdvcmtzIHdpdGggYm9vazNzXzY0ICovCisJaWYgKCh2Y3B1LT5hcmNoLmNwdV90eXBlICE9IEtWTV9DUFVfM1NfNjQpICYmIHZjcHUtPmFyY2gucGFwcl9lbmFibGVkKQorCQlnb3RvIG91dDsKKworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCisJLyogSFYgS1ZNIGNhbiBvbmx5IGRvIFBBUFIgbW9kZSBmb3Igbm93ICovCisJaWYgKCF2Y3B1LT5hcmNoLnBhcHJfZW5hYmxlZCkKKwkJZ290byBvdXQ7CisjZW5kaWYKKworCXIgPSB0cnVlOworCitvdXQ6CisJdmNwdS0+YXJjaC5zYW5lID0gcjsKKwlyZXR1cm4gciA/IDAgOiAtRUlOVkFMOworfQorCiBpbnQga3ZtcHBjX2VtdWxhdGVfbW1pbyhzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOwpAQCAtMTg4LDYgKzIwOCw4IEBACiAJY2FzZSBLVk1fQ0FQX1BQQ19CT09LRV9TUkVHUzoKICNlbHNlCiAJY2FzZSBLVk1fQ0FQX1BQQ19TRUdTVEFURToKKwljYXNlIEtWTV9DQVBfUFBDX0hJT1I6CisJY2FzZSBLVk1fQ0FQX1BQQ19QQVBSOgogI2VuZGlmCiAJY2FzZSBLVk1fQ0FQX1BQQ19VTlNFVF9JUlE6CiAJY2FzZSBLVk1fQ0FQX1BQQ19JUlFfTEVWRUw6CkBAIC0yNTgsNiArMjgwLDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CiAJdmNwdSA9IGt2bXBwY19jb3JlX3ZjcHVfY3JlYXRlKGt2bSwgaWQpOworCXZjcHUtPmFyY2gud3FwID0gJnZjcHUtPndxOwogCWlmICghSVNfRVJSKHZjcHUpKQogCQlrdm1wcGNfY3JlYXRlX3ZjcHVfZGVidWdmcyh2Y3B1LCBpZCk7CiAJcmV0dXJuIHZjcHU7CkBAIC0yODksOCArMzEyLDggQEAKIAogCWt2bXBwY19jb3JlX3F1ZXVlX2RlYyh2Y3B1KTsKIAotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ2Y3B1LT53cSkpIHsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT53cSk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUodmNwdS0+YXJjaC53cXApKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSh2Y3B1LT5hcmNoLndxcCk7CiAJCXZjcHUtPnN0YXQuaGFsdF93YWtldXArKzsKIAl9CiB9CkBAIC01NDMsMTMgKzU2NiwxNSBAQAogCiBpbnQga3ZtX3ZjcHVfaW9jdGxfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pbnRlcnJ1cHQgKmlycSkKIHsKLQlpZiAoaXJxLT5pcnEgPT0gS1ZNX0lOVEVSUlVQVF9VTlNFVCkKKwlpZiAoaXJxLT5pcnEgPT0gS1ZNX0lOVEVSUlVQVF9VTlNFVCkgewogCQlrdm1wcGNfY29yZV9kZXF1ZXVlX2V4dGVybmFsKHZjcHUsIGlycSk7Ci0JZWxzZQotCQlrdm1wcGNfY29yZV9xdWV1ZV9leHRlcm5hbCh2Y3B1LCBpcnEpOworCQlyZXR1cm4gMDsKKwl9CiAKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdS0+d3EpKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNwdS0+d3EpOworCWt2bXBwY19jb3JlX3F1ZXVlX2V4dGVybmFsKHZjcHUsIGlycSk7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh2Y3B1LT5hcmNoLndxcCkpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHZjcHUtPmFyY2gud3FwKTsKIAkJdmNwdS0+c3RhdC5oYWx0X3dha2V1cCsrOwogCX0gZWxzZSBpZiAodmNwdS0+Y3B1ICE9IC0xKSB7CiAJCXNtcF9zZW5kX3Jlc2NoZWR1bGUodmNwdS0+Y3B1KTsKQEAgLTU3MSwxMSArNTk2LDE4IEBACiAJCXIgPSAwOwogCQl2Y3B1LT5hcmNoLm9zaV9lbmFibGVkID0gdHJ1ZTsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1BQQ19QQVBSOgorCQlyID0gMDsKKwkJdmNwdS0+YXJjaC5wYXByX2VuYWJsZWQgPSB0cnVlOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCisJaWYgKCFyKQorCQlyID0ga3ZtcHBjX3Nhbml0eV9jaGVjayh2Y3B1KTsKKwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtX3dyYXBwZXJzXzY0LmMgYi9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtX3dyYXBwZXJzXzY0LmMKaW5kZXggNzY5YjgxNy4uMDhlM2EzMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9jaGVja3N1bV93cmFwcGVyc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fd3JhcHBlcnNfNjQuYwpAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIEF1dGhvcjogQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9kZXZyZXMuYyBiL2FyY2gvcG93ZXJwYy9saWIvZGV2cmVzLmMKaW5kZXggZTkxNjE1YS4uOGRmNTVmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9kZXZyZXMuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL2RldnJlcy5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIGRldnJlc18qKCksIGRldm1faW9yZW1hcF9yZWxlYXNlKCkgKi8KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogaW9yZW1hcF9wcm90KCkgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogRVhQT1JUX1NZTUJPTCgpICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CS8qIEVYUE9SVF9TWU1CT0woKSAqLwogCiAvKioKICAqIGRldm1faW9yZW1hcF9wcm90IC0gTWFuYWdlZCBpb3JlbWFwX3Byb3QoKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jIGIvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCmluZGV4IDliODE4MmUuLmE2ZWJiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvcmhlYXAuYyBiL2FyY2gvcG93ZXJwYy9saWIvcmhlYXAuYwppbmRleCA0NTkwN2MxLi5hMTA2MGE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21hdGgtZW11L21hdGhfZWZwLmMgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWF0aF9lZnAuYwppbmRleCA2MjI3OTIwLi5hNzNmMDg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWF0aF9lZnAuYworKysgYi9hcmNoL3Bvd2VycGMvbWF0aC1lbXUvbWF0aF9lZnAuYwpAQCAtMTcxLDEwICsxNzEsNiBAQAogCWNhc2UgRUZETkFCUzoJcmV0ID0gWEE7CWJyZWFrOwogCWNhc2UgRUZETkVHOglyZXQgPSBYQTsJYnJlYWs7CiAJY2FzZSBFRkRTVUI6CXJldCA9IEFCOwlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiXG5Pb29wcyEgU1BFIGluc3RydWN0aW9uIG5vIHR5cGUgZm91bmQuIik7Ci0JCXByaW50ayhLRVJOX0VSUiAiXG5pbnN0IGNvZGU6ICUwOGx4XG4iLCBzcGVpbnNuKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTk1LDcgKzE5MSw3IEBACiAKIAl0eXBlID0gaW5zbl90eXBlKHNwZWluc24pOwogCWlmICh0eXBlID09IE5PVFlQRSkKLQkJcmV0dXJuIC1FTk9TWVM7CisJCWdvdG8gaWxsZWdhbDsKIAogCWZ1bmMgPSBzcGVpbnNuICYgMHg3ZmY7CiAJZmMgPSAoc3BlaW5zbiA+PiAyMSkgJiAweDFmOwpAQCAtMjEyLDEyICsyMDgsMTAgQEAKIAogCV9fRlBVX0ZQU0NSID0gbWZzcHIoU1BSTl9TUEVGU0NSKTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzcGVpbnNuOiUwOGx4IHNwZWZzY3I6JTA4bHhcbiIsIHNwZWluc24sIF9fRlBVX0ZQU0NSKTsKLQlwcmludGsoInZjOiAlMDh4ICAlMDh4XG4iLCB2Yy53cFswXSwgdmMud3BbMV0pOwotCXByaW50aygidmE6ICUwOHggICUwOHhcbiIsIHZhLndwWzBdLCB2YS53cFsxXSk7Ci0JcHJpbnRrKCJ2YjogJTA4eCAgJTA4eFxuIiwgdmIud3BbMF0sIHZiLndwWzFdKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzcGVpbnNuOiUwOGx4IHNwZWZzY3I6JTA4bHhcbiIsIHNwZWluc24sIF9fRlBVX0ZQU0NSKTsKKwlwcl9kZWJ1ZygidmM6ICUwOHggICUwOHhcbiIsIHZjLndwWzBdLCB2Yy53cFsxXSk7CisJcHJfZGVidWcoInZhOiAlMDh4ICAlMDh4XG4iLCB2YS53cFswXSwgdmEud3BbMV0pOworCXByX2RlYnVnKCJ2YjogJTA4eCAgJTA4eFxuIiwgdmIud3BbMF0sIHZiLndwWzFdKTsKIAogCXN3aXRjaCAoc3JjKSB7CiAJY2FzZSBTUEZQOiB7CkBAIC0yMzUsMTAgKzIyOSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJTQTogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwgU0FfcywgU0FfZiwgU0FfZSwgU0FfYyk7Ci0JCXByaW50aygiU0I6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsIFNCX3MsIFNCX2YsIFNCX2UsIFNCX2MpOwotI2VuZGlmCisJCXByX2RlYnVnKCJTQTogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwgU0FfcywgU0FfZiwgU0FfZSwgU0FfYyk7CisJCXByX2RlYnVnKCJTQjogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwgU0JfcywgU0JfZiwgU0JfZSwgU0JfYyk7CiAKIAkJc3dpdGNoIChmdW5jKSB7CiAJCWNhc2UgRUZTQUJTOgpAQCAtMzA1LDEwICsyOTcsMTAgQEAKIAkJCUZQX0RFQ0xfRChEQik7CiAJCQlGUF9DTEVBUl9FWENFUFRJT05TOwogCQkJRlBfVU5QQUNLX0RQKERCLCB2Yi5kcCk7Ci0jaWZkZWYgREVCVUcKLQkJCXByaW50aygiREI6ICVsZCAlMDhseCAlMDhseCAlbGQgKCVsZClcbiIsCisKKwkJCXByX2RlYnVnKCJEQjogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKIAkJCQkJREJfcywgREJfZjEsIERCX2YwLCBEQl9lLCBEQl9jKTsKLSNlbmRpZgorCiAJCQlGUF9DT05WKFMsIEQsIDEsIDIsIFNSLCBEQik7CiAJCQlnb3RvIHBhY2tfczsKIAkJfQpAQCAtMzMyLDkgKzMyNCw4IEBACiAJCWJyZWFrOwogCiBwYWNrX3M6Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJTUjogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwgU1JfcywgU1JfZiwgU1JfZSwgU1JfYyk7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIlNSOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTUl9zLCBTUl9mLCBTUl9lLCBTUl9jKTsKKwogCQlGUF9QQUNLX1NQKHZjLndwICsgMSwgU1IpOwogCQlnb3RvIHVwZGF0ZV9yZWdzOwogCkBAIC0zNjUsMTIgKzM1NiwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotI2lmZGVmIERFQlVHCi0JCXByaW50aygiREE6ICVsZCAlMDhseCAlMDhseCAlbGQgKCVsZClcbiIsCisJCXByX2RlYnVnKCJEQTogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKIAkJCQlEQV9zLCBEQV9mMSwgREFfZjAsIERBX2UsIERBX2MpOwotCQlwcmludGsoIkRCOiAlbGQgJTA4bHggJTA4bHggJWxkICglbGQpXG4iLAorCQlwcl9kZWJ1ZygiREI6ICVsZCAlMDhseCAlMDhseCAlbGQgKCVsZClcbiIsCiAJCQkJREJfcywgREJfZjEsIERCX2YwLCBEQl9lLCBEQl9jKTsKLSNlbmRpZgogCiAJCXN3aXRjaCAoZnVuYykgewogCQljYXNlIEVGREFCUzoKQEAgLTQzOCwxMCArNDI3LDEwIEBACiAJCQlGUF9ERUNMX1MoU0IpOwogCQkJRlBfQ0xFQVJfRVhDRVBUSU9OUzsKIAkJCUZQX1VOUEFDS19TUChTQiwgdmIud3AgKyAxKTsKLSNpZmRlZiBERUJVRwotCQkJcHJpbnRrKCJTQjogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKworCQkJcHJfZGVidWcoIlNCOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAogCQkJCQlTQl9zLCBTQl9mLCBTQl9lLCBTQl9jKTsKLSNlbmRpZgorCiAJCQlGUF9DT05WKEQsIFMsIDIsIDEsIERSLCBTQik7CiAJCQlnb3RvIHBhY2tfZDsKIAkJfQpAQCAtNDcxLDEwICs0NjAsOSBAQAogCQlicmVhazsKIAogcGFja19kOgotI2lmZGVmIERFQlVHCi0JCXByaW50aygiRFI6ICVsZCAlMDhseCAlMDhseCAlbGQgKCVsZClcbiIsCisJCXByX2RlYnVnKCJEUjogJWxkICUwOGx4ICUwOGx4ICVsZCAoJWxkKVxuIiwKIAkJCQlEUl9zLCBEUl9mMSwgRFJfZjAsIERSX2UsIERSX2MpOwotI2VuZGlmCisKIAkJRlBfUEFDS19EUCh2Yy5kcCwgRFIpOwogCQlnb3RvIHVwZGF0ZV9yZWdzOwogCkBAIC01MTEsMTIgKzQ5OSwxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAotI2lmZGVmIERFQlVHCi0JCXByaW50aygiU0EwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQTBfcywgU0EwX2YsIFNBMF9lLCBTQTBfYyk7Ci0JCXByaW50aygiU0ExOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQTFfcywgU0ExX2YsIFNBMV9lLCBTQTFfYyk7Ci0JCXByaW50aygiU0IwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQjBfcywgU0IwX2YsIFNCMF9lLCBTQjBfYyk7Ci0JCXByaW50aygiU0IxOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTQjFfcywgU0IxX2YsIFNCMV9lLCBTQjFfYyk7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIlNBMDogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJCQlTQTBfcywgU0EwX2YsIFNBMF9lLCBTQTBfYyk7CisJCXByX2RlYnVnKCJTQTE6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsCisJCQkJU0ExX3MsIFNBMV9mLCBTQTFfZSwgU0ExX2MpOworCQlwcl9kZWJ1ZygiU0IwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLAorCQkJCVNCMF9zLCBTQjBfZiwgU0IwX2UsIFNCMF9jKTsKKwkJcHJfZGVidWcoIlNCMTogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJCQlTQjFfcywgU0IxX2YsIFNCMV9lLCBTQjFfYyk7CiAKIAkJc3dpdGNoIChmdW5jKSB7CiAJCWNhc2UgRVZGU0FCUzoKQEAgLTYwNSwxMCArNTk1LDExIEBACiAJCWJyZWFrOwogCiBwYWNrX3ZzOgotI2lmZGVmIERFQlVHCi0JCXByaW50aygiU1IwOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTUjBfcywgU1IwX2YsIFNSMF9lLCBTUjBfYyk7Ci0JCXByaW50aygiU1IxOiAlbGQgJTA4bHggJWxkICglbGQpXG4iLCBTUjFfcywgU1IxX2YsIFNSMV9lLCBTUjFfYyk7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIlNSMDogJWxkICUwOGx4ICVsZCAoJWxkKVxuIiwKKwkJCQlTUjBfcywgU1IwX2YsIFNSMF9lLCBTUjBfYyk7CisJCXByX2RlYnVnKCJTUjE6ICVsZCAlMDhseCAlbGQgKCVsZClcbiIsCisJCQkJU1IxX3MsIFNSMV9mLCBTUjFfZSwgU1IxX2MpOworCiAJCUZQX1BBQ0tfU1AodmMud3AsIFNSMCk7CiAJCUZQX1BBQ0tfU1AodmMud3AgKyAxLCBTUjEpOwogCQlnb3RvIHVwZGF0ZV9yZWdzOwpAQCAtNjQ2LDE0ICs2MzcsMTIgQEAKIAljdXJyZW50LT50aHJlYWQuZXZyW2ZjXSA9IHZjLndwWzBdOwogCXJlZ3MtPmdwcltmY10gPSB2Yy53cFsxXTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJjY3IgPSAlMDhseFxuIiwgcmVncy0+Y2NyKTsKLQlwcmludGsoImN1ciBleGNlcHRpb25zID0gJTA4eCBzcGVmc2NyID0gJTA4bHhcbiIsCisJcHJfZGVidWcoImNjciA9ICUwOGx4XG4iLCByZWdzLT5jY3IpOworCXByX2RlYnVnKCJjdXIgZXhjZXB0aW9ucyA9ICUwOHggc3BlZnNjciA9ICUwOGx4XG4iLAogCQkJRlBfQ1VSX0VYQ0VQVElPTlMsIF9fRlBVX0ZQU0NSKTsKLQlwcmludGsoInZjOiAlMDh4ICAlMDh4XG4iLCB2Yy53cFswXSwgdmMud3BbMV0pOwotCXByaW50aygidmE6ICUwOHggICUwOHhcbiIsIHZhLndwWzBdLCB2YS53cFsxXSk7Ci0JcHJpbnRrKCJ2YjogJTA4eCAgJTA4eFxuIiwgdmIud3BbMF0sIHZiLndwWzFdKTsKLSNlbmRpZgorCXByX2RlYnVnKCJ2YzogJTA4eCAgJTA4eFxuIiwgdmMud3BbMF0sIHZjLndwWzFdKTsKKwlwcl9kZWJ1ZygidmE6ICUwOHggICUwOHhcbiIsIHZhLndwWzBdLCB2YS53cFsxXSk7CisJcHJfZGVidWcoInZiOiAlMDh4ICAlMDh4XG4iLCB2Yi53cFswXSwgdmIud3BbMV0pOwogCiAJcmV0dXJuIDA7CiAKQEAgLTY2MSw5ICs2NTAsNyBAQAogCWlmIChoYXZlX2U1MDBfY3B1X2EwMDVfZXJyYXR1bSkgewogCQkvKiBhY2NvcmRpbmcgdG8gZTUwMCBjcHUgYTAwNSBlcnJhdHVtLCByZWlzc3VlIGVmcCBpbnN0ICovCiAJCXJlZ3MtPm5pcCAtPSA0OwotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJyZS1pc3N1ZSBlZnAgaW5zdDogJTA4bHhcbiIsIHNwZWluc24pOwotI2VuZGlmCisJCXByX2RlYnVnKCJyZS1pc3N1ZSBlZnAgaW5zdDogJTA4bHhcbiIsIHNwZWluc24pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY4NSwxMyArNjcyLDIwIEBACiAJdHlwZSA9IGluc25fdHlwZShzcGVpbnNuICYgMHg3ZmYpOwogCWlmICh0eXBlID09IFhDUikgcmV0dXJuIC1FTk9TWVM7CiAKKwlfX0ZQVV9GUFNDUiA9IG1mc3ByKFNQUk5fU1BFRlNDUik7CisJcHJfZGVidWcoInNwZWluc246JTA4bHggc3BlZnNjcjolMDhseFxuIiwgc3BlaW5zbiwgX19GUFVfRlBTQ1IpOworCisJLyogTm8gbmVlZCB0byByb3VuZCBpZiB0aGUgcmVzdWx0IGlzIGV4YWN0ICovCisJaWYgKCEoX19GUFVfRlBTQ1IgJiBGUF9FWF9JTkVYQUNUKSkKKwkJcmV0dXJuIDA7CisKIAlmYyA9IChzcGVpbnNuID4+IDIxKSAmIDB4MWY7CiAJc19sbyA9IHJlZ3MtPmdwcltmY10gJiBTSUdOX0JJVF9TOwogCXNfaGkgPSBjdXJyZW50LT50aHJlYWQuZXZyW2ZjXSAmIFNJR05fQklUX1M7CiAJZmdwci53cFswXSA9IGN1cnJlbnQtPnRocmVhZC5ldnJbZmNdOwogCWZncHIud3BbMV0gPSByZWdzLT5ncHJbZmNdOwogCi0JX19GUFVfRlBTQ1IgPSBtZnNwcihTUFJOX1NQRUZTQ1IpOworCXByX2RlYnVnKCJyb3VuZCBmZ3ByOiAlMDh4ICAlMDh4XG4iLCBmZ3ByLndwWzBdLCBmZ3ByLndwWzFdKTsKIAogCXN3aXRjaCAoKHNwZWluc24gPj4gNSkgJiAweDcpIHsKIAkvKiBTaW5jZSBTUEUgaW5zdHJ1Y3Rpb25zIG9uIEU1MDAgY29yZSBjYW4gaGFuZGxlIHJvdW5kIHRvIG5lYXJlc3QKQEAgLTczMSw2ICs3MjUsOCBAQAogCWN1cnJlbnQtPnRocmVhZC5ldnJbZmNdID0gZmdwci53cFswXTsKIAlyZWdzLT5ncHJbZmNdID0gZmdwci53cFsxXTsKIAorCXByX2RlYnVnKCIgIHRvIGZncHI6ICUwOHggICUwOHhcbiIsIGZncHIud3BbMF0sIGZncHIud3BbMV0pOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCBiZGNhNDZlLi45OTFlZTgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCkBAIC0yOSw2ICsyOSw3IEBACiBpZmVxICgkKENPTkZJR19IVUdFVExCX1BBR0UpLHkpCiBvYmoteQkJCQkrPSBodWdldGxicGFnZS5vCiBvYmotJChDT05GSUdfUFBDX1NURF9NTVVfNjQpCSs9IGh1Z2V0bGJwYWdlLWhhc2g2NC5vCitvYmotJChDT05GSUdfUFBDX0JPT0szRV9NTVUpCSs9IGh1Z2V0bGJwYWdlLWJvb2szZS5vCiBlbmRpZgogb2JqLSQoQ09ORklHX1BQQ19TVUJQQUdFX1BST1QpCSs9IHN1YnBhZ2UtcHJvdC5vCiBvYmotJChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKSArPSBkbWEtbm9uY29oZXJlbnQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2RtYS1ub25jb2hlcmVudC5jIGIvYXJjaC9wb3dlcnBjL21tL2RtYS1ub25jb2hlcmVudC5jCmluZGV4IGI0MmY3NmMuLjMyOWJlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9kbWEtbm9uY29oZXJlbnQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZG1hLW5vbmNvaGVyZW50LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCmluZGV4IGY3ODAyYzguLjY2YTZmZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwpAQCAtMTAxLDE3ICsxMDEsMTcgQEAKIAogLyoKICAqIFNldCB1cCBhIHZhcmlhYmxlLXNpemUgVExCIGVudHJ5ICh0bGJjYW0pLiBUaGUgcGFyYW1ldGVycyBhcmUgbm90IGNoZWNrZWQ7Ci0gKiBpbiBwYXJ0aWN1bGFyIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDQgYmV0d2VlbiA0ayBhbmQgMjU2TSAob3IgMUcsIGZvciBjcHVzCi0gKiB0aGF0IHN1cHBvcnQgZXh0ZW5kZWQgcGFnZSBzaXplcykuICBOb3RlIHRoYXQgd2hpbGUgc29tZSBjcHVzIHN1cHBvcnQgYQotICogcGFnZSBzaXplIG9mIDRHLCB3ZSBkb24ndCBhbGxvdyBpdHMgdXNlIGhlcmUuCisgKiBpbiBwYXJ0aWN1bGFyIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDQgYmV0d2VlbiA0ayBhbmQgdGhlIG1heCBzdXBwb3J0ZWQgYnkKKyAqIGFuIGltcGxlbWVudGF0aW9uOyBtYXggbWF5IGZ1cnRoZXIgYmUgbGltaXRlZCBieSB3aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbgorICogYW4gdW5zaWduZWQgbG9uZyAoZm9yIGV4YW1wbGUsIDMyLWJpdCBpbXBsZW1lbnRhdGlvbnMgY2Fubm90IHN1cHBvcnQgYSA0R0IKKyAqIHNpemUpLgogICovCiBzdGF0aWMgdm9pZCBzZXR0bGJjYW0oaW50IGluZGV4LCB1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCiAJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgaW50IHBpZCkKIHsKLQl1bnNpZ25lZCBpbnQgdHNpemUsIGx6OworCXVuc2lnbmVkIGludCB0c2l6ZTsKIAotCWFzbSAoUFBDX0NOVExaTCAiJTAsJTEiIDogIj1yIiAobHopIDogInIiIChzaXplKSk7Ci0JdHNpemUgPSAyMSAtIGx6OworCXRzaXplID0gX19pbG9nMihzaXplKSAtIDEwOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWlmICgoZmxhZ3MgJiBfUEFHRV9OT19DQUNIRSkgPT0gMCkKQEAgLTE0NiwyOSArMTQ2LDM2IEBACiAJbG9hZGNhbV9lbnRyeShpbmRleCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgY2FsY19jYW1fc3oodW5zaWduZWQgbG9uZyByYW0sIHVuc2lnbmVkIGxvbmcgdmlydCwKKwkJCSAgcGh5c19hZGRyX3QgcGh5cykKK3sKKwl1bnNpZ25lZCBpbnQgY2Ftc2l6ZSA9IF9faWxvZzIocmFtKSAmIH4xVTsKKwl1bnNpZ25lZCBpbnQgYWxpZ24gPSBfX2Zmcyh2aXJ0IHwgcGh5cykgJiB+MVU7CisJdW5zaWduZWQgbG9uZyBtYXhfY2FtID0gKG1mc3ByKFNQUk5fVExCMUNGRykgPj4gMTYpICYgMHhmOworCisJLyogQ29udmVydCAoNF5tYXgpIGtCIHRvICgyXm1heCkgYnl0ZXMgKi8KKwltYXhfY2FtID0gbWF4X2NhbSAqIDIgKyAxMDsKKworCWlmIChjYW1zaXplID4gYWxpZ24pCisJCWNhbXNpemUgPSBhbGlnbjsKKwlpZiAoY2Ftc2l6ZSA+IG1heF9jYW0pCisJCWNhbXNpemUgPSBtYXhfY2FtOworCisJcmV0dXJuIDFVTCA8PCBjYW1zaXplOworfQorCiB1bnNpZ25lZCBsb25nIG1hcF9tZW1faW5fY2Ftcyh1bnNpZ25lZCBsb25nIHJhbSwgaW50IG1heF9jYW1faWR4KQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgdmlydCA9IFBBR0VfT0ZGU0VUOwogCXBoeXNfYWRkcl90IHBoeXMgPSBtZW1zdGFydF9hZGRyOwogCXVuc2lnbmVkIGxvbmcgYW1vdW50X21hcHBlZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBtYXhfY2FtID0gKG1mc3ByKFNQUk5fVExCMUNGRykgPj4gMTYpICYgMHhmOwotCi0JLyogQ29udmVydCAoNF5tYXgpIGtCIHRvICgyXm1heCkgYnl0ZXMgKi8KLQltYXhfY2FtID0gbWF4X2NhbSAqIDIgKyAxMDsKIAogCS8qIENhbGN1bGF0ZSBDQU0gdmFsdWVzICovCiAJZm9yIChpID0gMDsgcmFtICYmIGkgPCBtYXhfY2FtX2lkeDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBjYW1zaXplID0gX19pbG9nMihyYW0pICYgfjFVOwotCQl1bnNpZ25lZCBpbnQgYWxpZ24gPSBfX2Zmcyh2aXJ0IHwgcGh5cykgJiB+MVU7CiAJCXVuc2lnbmVkIGxvbmcgY2FtX3N6OwogCi0JCWlmIChjYW1zaXplID4gYWxpZ24pCi0JCQljYW1zaXplID0gYWxpZ247Ci0JCWlmIChjYW1zaXplID4gbWF4X2NhbSkKLQkJCWNhbXNpemUgPSBtYXhfY2FtOwotCi0JCWNhbV9zeiA9IDFVTCA8PCBjYW1zaXplOworCQljYW1fc3ogPSBjYWxjX2NhbV9zeihyYW0sIHZpcnQsIHBoeXMpOwogCQlzZXR0bGJjYW0oaSwgdmlydCwgcGh5cywgY2FtX3N6LCBQQUdFX0tFUk5FTF9YLCAwKTsKIAogCQlyYW0gLT0gY2FtX3N6OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2d1cC5jIGIvYXJjaC9wb3dlcnBjL21tL2d1cC5jCmluZGV4IGZlYzEzMjAuLmQ3ZWZkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9ndXAuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMKQEAgLTE2LDE2ICsxNiw2IEBACiAKICNpZmRlZiBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQotewotCS8qCi0JICogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQoKSBjYW5ub3QgcnVuCi0JICogZnJvbSB1bmRlciB1cy4KLQkgKi8KLQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPCAwKTsKLQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwotfQotCiAvKgogICogVGhlIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGxlYWYgZnVuY3Rpb25zIGFyZSBtYWRlIG5vaW5saW5lIG90aGVyd2lzZSBnY2MKICAqIGlubGluZXMgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHdoaWNoIHJlc3VsdHMgaW4gdG9vIG11Y2gKQEAgLTU3LDggKzQ3LDYgQEAKIAkJCXB1dF9wYWdlKHBhZ2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKFBhZ2VUYWlsKHBhZ2UpKQotCQkJZ2V0X2h1Z2VfcGFnZV90YWlsKHBhZ2UpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKIAkJKCpucikrKzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggMjZiMjg3Mi4uMmQyODIxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTA1LDkgKzEwNiw2IEBACiBpbnQgbW11X2hpZ2h1c2VyX3NzaXplID0gTU1VX1NFR1NJWkVfMjU2TTsKIHUxNiBtbXVfc2xiX3NpemUgPSA2NDsKIEVYUE9SVF9TWU1CT0xfR1BMKG1tdV9zbGJfc2l6ZSk7Ci0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotdW5zaWduZWQgaW50IEhQQUdFX1NISUZUOwotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKIGludCBtbXVfY2lfcmVzdHJpY3Rpb25zOwogI2VuZGlmCkBAIC01MzQsMTEgKzUzMiwxMSBAQAogfQogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCi12b2lkIGNyZWF0ZV9zZWN0aW9uX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCitpbnQgY3JlYXRlX3NlY3Rpb25fbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlCVUdfT04oaHRhYl9ib2x0X21hcHBpbmcoc3RhcnQsIGVuZCwgX19wYShzdGFydCksCisJcmV0dXJuIGh0YWJfYm9sdF9tYXBwaW5nKHN0YXJ0LCBlbmQsIF9fcGEoc3RhcnQpLAogCQkJCSBwZ3Byb3RfdmFsKFBBR0VfS0VSTkVMKSwgbW11X2xpbmVhcl9wc2l6ZSwKLQkJCQkgbW11X2tlcm5lbF9zc2l6ZSkpOworCQkJCSBtbXVfa2VybmVsX3NzaXplKTsKIH0KIAogaW50IHJlbW92ZV9zZWN0aW9uX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UtYm9vazNlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UtYm9vazNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzYWQwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS1ib29rM2UuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIFBQQyBIdWdlIFRMQiBQYWdlIFN1cHBvcnQgZm9yIEJvb2szRSBNTVUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQmVja3kgQnJ1Y2UsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IG1tdV9nZXRfdHNpemUoaW50IHBzaXplKQoreworCXJldHVybiBtbXVfcHNpemVfZGVmc1twc2l6ZV0uZW5jOworfQorCitzdGF0aWMgaW5saW5lIGludCBib29rM2VfdGxiX2V4aXN0cyh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIHBpZCkKK3sKKwlpbnQgZm91bmQgPSAwOworCisJbXRzcHIoU1BSTl9NQVM2LCBwaWQgPDwgMTYpOworCWlmIChtbXVfaGFzX2ZlYXR1cmUoTU1VX0ZUUl9VU0VfVExCUlNSVikpIHsKKwkJYXNtIHZvbGF0aWxlKAorCQkJImxpCSUwLDBcbiIKKwkJCSJ0bGJzeC4JMCwlMVxuIgorCQkJImJuZQkxZlxuIgorCQkJImxpCSUwLDFcbiIKKwkJCSIxOlxuIgorCQkJOiAiPSZyIihmb3VuZCkgOiAiciIoZWEpKTsKKwl9IGVsc2UgeworCQlhc20gdm9sYXRpbGUoCisJCQkidGxic3gJMCwlMVxuIgorCQkJIm1mc3ByCSUwLDB4MjcxXG4iCisJCQkic3J3aQklMCwlMCwzMVxuIgorCQkJOiAiPSZyIihmb3VuZCkgOiAiciIoZWEpKTsKKwl9CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3ZvaWQgYm9vazNlX2h1Z2V0bGJfcHJlbG9hZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgcHRlX3QgcHRlKQoreworCXVuc2lnbmVkIGxvbmcgbWFzMSwgbWFzMjsKKwl1NjQgbWFzN18zOworCXVuc2lnbmVkIGxvbmcgcHNpemUsIHRzaXplLCBzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCisJaW50IGluZGV4LCBseiwgbmNhbXM7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisjZW5kaWYKKworCWlmICh1bmxpa2VseShpc19rZXJuZWxfYWRkcihlYSkpKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUworCXBzaXplID0gbW11X2dldF90c2l6ZShnZXRfc2xpY2VfcHNpemUobW0sIGVhKSk7CisJdHNpemUgPSBtbXVfZ2V0X3BzaXplKHBzaXplKTsKKwlzaGlmdCA9IG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdDsKKyNlbHNlCisJdm1hID0gZmluZF92bWEobW0sIGVhKTsKKwlwc2l6ZSA9IHZtYV9tbXVfcGFnZXNpemUodm1hKTsJLyogcmV0dXJucyBhY3R1YWwgc2l6ZSBpbiBieXRlcyAqLworCWFzbSAoUFBDX0NOVExaTCAiJTAsJTEiIDogIj1yIiAobHopIDogInIiIChwc2l6ZSkpOworCXNoaWZ0ID0gMzEgLSBsejsKKwl0c2l6ZSA9IDIxIC0gbHo7CisjZW5kaWYKKworCS8qCisJICogV2UgY2FuJ3QgYmUgaW50ZXJydXB0ZWQgd2hpbGUgd2UncmUgc2V0dGluZyB1cCB0aGUgTUFTCisJICogcmVndXN0ZXJzIG9yIGFmdGVyIHdlJ3ZlIGNvbmZpcm1lZCB0aGF0IG5vIHRsYiBleGlzdHMuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGJvb2szZV90bGJfZXhpc3RzKGVhLCBtbS0+Y29udGV4dC5pZCkpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQorCW5jYW1zID0gbWZzcHIoU1BSTl9UTEIxQ0ZHKSAmIFRMQm5DRkdfTl9FTlRSWTsKKworCS8qIFdlIGhhdmUgdG8gdXNlIHRoZSBDQU0oVExCMSkgb24gRlNMIHBhcnRzIGZvciBodWdlcGFnZXMgKi8KKwlpbmRleCA9IF9fZ2V0X2NwdV92YXIobmV4dF90bGJjYW1faWR4KTsKKwltdHNwcihTUFJOX01BUzAsIE1BUzBfRVNFTChpbmRleCkgfCBNQVMwX1RMQlNFTCgxKSk7CisKKwkvKiBKdXN0IHJvdW5kLXJvYmluIHRoZSBlbnRyaWVzIGFuZCB3cmFwIHdoZW4gd2UgaGl0IHRoZSBlbmQgKi8KKwlpZiAodW5saWtlbHkoaW5kZXggPT0gbmNhbXMgLSAxKSkKKwkJX19nZXRfY3B1X3ZhcihuZXh0X3RsYmNhbV9pZHgpID0gdGxiY2FtX2luZGV4OworCWVsc2UKKwkJX19nZXRfY3B1X3ZhcihuZXh0X3RsYmNhbV9pZHgpKys7CisjZW5kaWYKKwltYXMxID0gTUFTMV9WQUxJRCB8IE1BUzFfVElEKG1tLT5jb250ZXh0LmlkKSB8IE1BUzFfVFNJWkUodHNpemUpOworCW1hczIgPSBlYSAmIH4oKDFVTCA8PCBzaGlmdCkgLSAxKTsKKwltYXMyIHw9IChwdGVfdmFsKHB0ZSkgPj4gUFRFX1dJTUdFX1NISUZUKSAmIE1BUzJfV0lNR0VfTUFTSzsKKwltYXM3XzMgPSAodTY0KXB0ZV9wZm4ocHRlKSA8PCBQQUdFX1NISUZUOworCW1hczdfMyB8PSAocHRlX3ZhbChwdGUpID4+IFBURV9CQVBfU0hJRlQpICYgTUFTM19CQVBfTUFTSzsKKwlpZiAoIXB0ZV9kaXJ0eShwdGUpKQorCQltYXM3XzMgJj0gfihNQVMzX1NXfE1BUzNfVVcpOworCisJbXRzcHIoU1BSTl9NQVMxLCBtYXMxKTsKKwltdHNwcihTUFJOX01BUzIsIG1hczIpOworCisJaWYgKG1tdV9oYXNfZmVhdHVyZShNTVVfRlRSX1VTRV9QQUlSRURfTUFTKSkgeworCQltdHNwcihTUFJOX01BUzdfTUFTMywgbWFzN18zKTsKKwl9IGVsc2UgeworCQltdHNwcihTUFJOX01BUzcsIHVwcGVyXzMyX2JpdHMobWFzN18zKSk7CisJCW10c3ByKFNQUk5fTUFTMywgbG93ZXJfMzJfYml0cyhtYXM3XzMpKTsKKwl9CisKKwlhc20gdm9sYXRpbGUgKCJ0bGJ3ZSIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkIGZsdXNoX2h1Z2V0bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2bWFkZHIpCit7CisJc3RydWN0IGhzdGF0ZSAqaHN0YXRlID0gaHN0YXRlX2ZpbGUodm1hLT52bV9maWxlKTsKKwl1bnNpZ25lZCBsb25nIHRzaXplID0gaHVnZV9wYWdlX3NoaWZ0KGhzdGF0ZSkgLSAxMDsKKworCV9fZmx1c2hfdGxiX3BhZ2Uodm1hID8gdm1hLT52bV9tbSA6IE5VTEwsIHZtYWRkciwgdHNpemUsIDApOworCit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IDBiOWE1YzEuLjU5NjQzNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC0xLDcgKzEsOCBAQAogLyoKLSAqIFBQQzY0IChQT1dFUjQpIEh1Z2UgVExCIFBhZ2UgU3VwcG9ydCBmb3IgS2VybmVsLgorICogUFBDIEh1Z2UgVExCIFBhZ2UgU3VwcG9ydCBmb3IgS2VybmVsLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBCZWNreSBCcnVjZSwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IKICAqCiAgKiBCYXNlZCBvbiB0aGUgSUEtMzIgdmVyc2lvbjoKICAqIENvcHlyaWdodCAoQykgMjAwMiwgUm9oaXQgU2V0aCA8cm9oaXQuc2V0aEBpbnRlbC5jb20+CkBAIC0xMSwyNCArMTIsMzkgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2RlZmluZSBQQUdFX1NISUZUXzY0SwkxNgogI2RlZmluZSBQQUdFX1NISUZUXzE2TQkyNAogI2RlZmluZSBQQUdFX1NISUZUXzE2RwkzNAogCit1bnNpZ25lZCBpbnQgSFBBR0VfU0hJRlQ7CisKKy8qCisgKiBUcmFja3MgZ3BhZ2VzIGFmdGVyIHRoZSBkZXZpY2UgdHJlZSBpcyBzY2FubmVkIGFuZCBiZWZvcmUgdGhlCisgKiBodWdlX2Jvb3RfcGFnZXMgbGlzdCBpcyByZWFkeS4gIE9uIDY0LWJpdCBpbXBsZW1lbnRhdGlvbnMsIHRoaXMgaXMKKyAqIGp1c3QgdXNlZCB0byB0cmFjayAxNkcgcGFnZXMgYW5kIHNvIGlzIGEgc2luZ2xlIGFycmF5LiAgMzItYml0CisgKiBpbXBsZW1lbnRhdGlvbnMgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBncGFnZSBzaXplIGR1ZSB0byBsaW1pdGF0aW9ucworICogb2YgdGhlIG1lbW9yeSBhbGxvY2F0b3JzLCBzbyB3ZSBuZWVkIG11bHRpcGxlIGFycmF5cworICovCisjaWZkZWYgQ09ORklHX1BQQzY0CiAjZGVmaW5lIE1BWF9OVU1CRVJfR1BBR0VTCTEwMjQKLQotLyogVHJhY2tzIHRoZSAxNkcgcGFnZXMgYWZ0ZXIgdGhlIGRldmljZSB0cmVlIGlzIHNjYW5uZWQgYW5kIGJlZm9yZSB0aGUKLSAqIGh1Z2VfYm9vdF9wYWdlcyBsaXN0IGlzIHJlYWR5LiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdwYWdlX2ZyZWVhcnJheVtNQVhfTlVNQkVSX0dQQUdFU107CitzdGF0aWMgdTY0IGdwYWdlX2ZyZWVhcnJheVtNQVhfTlVNQkVSX0dQQUdFU107CiBzdGF0aWMgdW5zaWduZWQgbnJfZ3BhZ2VzOwotCi0vKiBGbGFnIHRvIG1hcmsgaHVnZSBQRCBwb2ludGVycy4gIFRoaXMgbWVhbnMgcG1kX2JhZCgpIGFuZCBwdWRfYmFkKCkKLSAqIHdpbGwgY2hva2Ugb24gcG9pbnRlcnMgdG8gaHVnZXB0ZSB0YWJsZXMsIHdoaWNoIGlzIGhhbmR5IGZvcgotICogY2F0Y2hpbmcgc2NyZXd1cHMgZWFybHkuICovCisjZWxzZQorI2RlZmluZSBNQVhfTlVNQkVSX0dQQUdFUwkxMjgKK3N0cnVjdCBwc2l6ZV9ncGFnZXMgeworCXU2NCBncGFnZV9saXN0W01BWF9OVU1CRVJfR1BBR0VTXTsKKwl1bnNpZ25lZCBpbnQgbnJfZ3BhZ2VzOworfTsKK3N0YXRpYyBzdHJ1Y3QgcHNpemVfZ3BhZ2VzIGdwYWdlX2ZyZWVhcnJheVtNTVVfUEFHRV9DT1VOVF07CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2hpZnRfdG9fbW11X3BzaXplKHVuc2lnbmVkIGludCBzaGlmdCkKIHsKQEAgLTQ5LDI1ICs2NSw2IEBACiAKICNkZWZpbmUgaHVnZXBkX25vbmUoaHBkKQkoKGhwZCkucGQgPT0gMCkKIAotc3RhdGljIGlubGluZSBwdGVfdCAqaHVnZXBkX3BhZ2UoaHVnZXBkX3QgaHBkKQotewotCUJVR19PTighaHVnZXBkX29rKGhwZCkpOwotCXJldHVybiAocHRlX3QgKikoKGhwZC5wZCAmIH5IVUdFUERfU0hJRlRfTUFTSykgfCAweGMwMDAwMDAwMDAwMDAwMDApOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBodWdlcGRfc2hpZnQoaHVnZXBkX3QgaHBkKQotewotCXJldHVybiBocGQucGQgJiBIVUdFUERfU0hJRlRfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCAqaHVnZXB0ZV9vZmZzZXQoaHVnZXBkX3QgKmhwZHAsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgcGRzaGlmdCkKLXsKLQl1bnNpZ25lZCBsb25nIGlkeCA9IChhZGRyICYgKCgxVUwgPDwgcGRzaGlmdCkgLSAxKSkgPj4gaHVnZXBkX3NoaWZ0KCpocGRwKTsKLQlwdGVfdCAqZGlyID0gaHVnZXBkX3BhZ2UoKmhwZHApOwotCi0JcmV0dXJuIGRpciArIGlkeDsKLX0KLQogcHRlX3QgKmZpbmRfbGludXhfcHRlX29yX2h1Z2VwdGUocGdkX3QgKnBnZGlyLCB1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCAqc2hpZnQpCiB7CiAJcGdkX3QgKnBnOwpAQCAtOTMsNyArOTAsNyBAQAogCQkJaWYgKGlzX2h1Z2VwZChwbSkpCiAJCQkJaHBkcCA9IChodWdlcGRfdCAqKXBtOwogCQkJZWxzZSBpZiAoIXBtZF9ub25lKCpwbSkpIHsKLQkJCQlyZXR1cm4gcHRlX29mZnNldF9tYXAocG0sIGVhKTsKKwkJCQlyZXR1cm4gcHRlX29mZnNldF9rZXJuZWwocG0sIGVhKTsKIAkJCX0KIAkJfQogCX0KQEAgLTExNCw4ICsxMTEsMTggQEAKIHN0YXRpYyBpbnQgX19odWdlcHRlX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBodWdlcGRfdCAqaHBkcCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgcGRzaGlmdCwgdW5zaWduZWQgcHNoaWZ0KQogewotCXB0ZV90ICpuZXcgPSBrbWVtX2NhY2hlX3phbGxvYyhQR1RfQ0FDSEUocGRzaGlmdCAtIHBzaGlmdCksCi0JCQkJICAgICAgIEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOworCXB0ZV90ICpuZXc7CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYWNoZXAgPSBQR1RfQ0FDSEUocGRzaGlmdCAtIHBzaGlmdCk7CisjZWxzZQorCWludCBpOworCWludCBudW1faHVnZXBkID0gMSA8PCAocHNoaWZ0IC0gcGRzaGlmdCk7CisJY2FjaGVwID0gaHVnZXB0ZV9jYWNoZTsKKyNlbmRpZgorCisJbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoY2FjaGVwLCBHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CiAKIAlCVUdfT04ocHNoaWZ0ID4gSFVHRVBEX1NISUZUX01BU0spOwogCUJVR19PTigodW5zaWduZWQgbG9uZyluZXcgJiBIVUdFUERfU0hJRlRfTUFTSyk7CkBAIC0xMjQsMTAgKzEzMSwzMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisjaWZkZWYgQ09ORklHX1BQQzY0CiAJaWYgKCFodWdlcGRfbm9uZSgqaHBkcCkpCi0JCWttZW1fY2FjaGVfZnJlZShQR1RfQ0FDSEUocGRzaGlmdCAtIHBzaGlmdCksIG5ldyk7CisJCWttZW1fY2FjaGVfZnJlZShjYWNoZXAsIG5ldyk7CiAJZWxzZQotCQlocGRwLT5wZCA9ICgodW5zaWduZWQgbG9uZyluZXcgJiB+MHg4MDAwMDAwMDAwMDAwMDAwKSB8IHBzaGlmdDsKKwkJaHBkcC0+cGQgPSAoKHVuc2lnbmVkIGxvbmcpbmV3ICYgflBEX0hVR0UpIHwgcHNoaWZ0OworI2Vsc2UKKwkvKgorCSAqIFdlIGhhdmUgbXVsdGlwbGUgaGlnaGVyLWxldmVsIGVudHJpZXMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQorCSAqIGFjdHVhbCBwdGUgbG9jYXRpb24uICBGaWxsIGluIGVhY2ggYXMgd2UgZ28gYW5kIGJhY2t0cmFjayBvbiBlcnJvci4KKwkgKiBXZSBuZWVkIGFsbCBvZiB0aGVzZSBzbyB0aGUgRFRMQiBwZ3RhYmxlIHdhbGsgY29kZSBjYW4gZmluZCB0aGUKKwkgKiByaWdodCBoaWdoZXItbGV2ZWwgZW50cnkgd2l0aG91dCBrbm93aW5nIGlmIGl0J3MgYSBodWdlcGFnZSBvciBub3QuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9odWdlcGQ7IGkrKywgaHBkcCsrKSB7CisJCWlmICh1bmxpa2VseSghaHVnZXBkX25vbmUoKmhwZHApKSkKKwkJCWJyZWFrOworCQllbHNlCisJCQlocGRwLT5wZCA9ICgodW5zaWduZWQgbG9uZyluZXcgJiB+UERfSFVHRSkgfCBwc2hpZnQ7CisJfQorCS8qIElmIHdlIGJhaWxlZCBmcm9tIHRoZSBmb3IgbG9vcCBlYXJseSwgYW4gZXJyb3Igb2NjdXJyZWQsIGNsZWFuIHVwICovCisJaWYgKGkgPCBudW1faHVnZXBkKSB7CisJCWZvciAoaSA9IGkgLSAxIDsgaSA+PSAwOyBpLS0sIGhwZHAtLSkKKwkJCWhwZHAtPnBkID0gMDsKKwkJa21lbV9jYWNoZV9mcmVlKGNhY2hlcCwgbmV3KTsKKwl9CisjZW5kaWYKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNjksMTEgKzE5NywxMzIgQEAKIAlyZXR1cm4gaHVnZXB0ZV9vZmZzZXQoaHBkcCwgYWRkciwgcGRzaGlmdCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDMzIKIC8qIEJ1aWxkIGxpc3Qgb2YgYWRkcmVzc2VzIG9mIGdpZ2FudGljIHBhZ2VzLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGVhcmx5CiAgKiBib290IGJlZm9yZSB0aGUgYnVkZHkgb3IgYm9vdG1lbSBhbGxvY2F0b3IgaXMgc2V0dXAuCiAgKi8KLXZvaWQgYWRkX2dwYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwYWdlX3NpemUsCi0JdW5zaWduZWQgbG9uZyBudW1iZXJfb2ZfcGFnZXMpCit2b2lkIGFkZF9ncGFnZSh1NjQgYWRkciwgdTY0IHBhZ2Vfc2l6ZSwgdW5zaWduZWQgbG9uZyBudW1iZXJfb2ZfcGFnZXMpCit7CisJdW5zaWduZWQgaW50IGlkeCA9IHNoaWZ0X3RvX21tdV9wc2l6ZShfX2ZmcyhwYWdlX3NpemUpKTsKKwlpbnQgaTsKKworCWlmIChhZGRyID09IDApCisJCXJldHVybjsKKworCWdwYWdlX2ZyZWVhcnJheVtpZHhdLm5yX2dwYWdlcyA9IG51bWJlcl9vZl9wYWdlczsKKworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfcGFnZXM7IGkrKykgeworCQlncGFnZV9mcmVlYXJyYXlbaWR4XS5ncGFnZV9saXN0W2ldID0gYWRkcjsKKwkJYWRkciArPSBwYWdlX3NpemU7CisJfQorfQorCisvKgorICogTW92ZXMgdGhlIGdpZ2FudGljIHBhZ2UgYWRkcmVzc2VzIGZyb20gdGhlIHRlbXBvcmFyeSBsaXN0IHRvIHRoZQorICogaHVnZV9ib290X3BhZ2VzIGxpc3QuCisgKi8KK2ludCBhbGxvY19ib290bWVtX2h1Z2VfcGFnZShzdHJ1Y3QgaHN0YXRlICpoc3RhdGUpCit7CisJc3RydWN0IGh1Z2VfYm9vdG1lbV9wYWdlICptOworCWludCBpZHggPSBzaGlmdF90b19tbXVfcHNpemUoaHN0YXRlLT5vcmRlciArIFBBR0VfU0hJRlQpOworCWludCBucl9ncGFnZXMgPSBncGFnZV9mcmVlYXJyYXlbaWR4XS5ucl9ncGFnZXM7CisKKwlpZiAobnJfZ3BhZ2VzID09IDApCisJCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwkvKgorCSAqIElmIGdwYWdlcyBjYW4gYmUgaW4gaGlnaG1lbSB3ZSBjYW4ndCB1c2UgdGhlIHRyaWNrIG9mIHN0b3JpbmcgdGhlCisJICogZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIHBhZ2U7IGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzCisJICovCisJbSA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBodWdlX2Jvb3RtZW1fcGFnZSkpOworCW0tPnBoeXMgPSBncGFnZV9mcmVlYXJyYXlbaWR4XS5ncGFnZV9saXN0Wy0tbnJfZ3BhZ2VzXTsKKyNlbHNlCisJbSA9IHBoeXNfdG9fdmlydChncGFnZV9mcmVlYXJyYXlbaWR4XS5ncGFnZV9saXN0Wy0tbnJfZ3BhZ2VzXSk7CisjZW5kaWYKKworCWxpc3RfYWRkKCZtLT5saXN0LCAmaHVnZV9ib290X3BhZ2VzKTsKKwlncGFnZV9mcmVlYXJyYXlbaWR4XS5ucl9ncGFnZXMgPSBucl9ncGFnZXM7CisJZ3BhZ2VfZnJlZWFycmF5W2lkeF0uZ3BhZ2VfbGlzdFtucl9ncGFnZXNdID0gMDsKKwltLT5oc3RhdGUgPSBoc3RhdGU7CisKKwlyZXR1cm4gMTsKK30KKy8qCisgKiBTY2FuIHRoZSBjb21tYW5kIGxpbmUgaHVnZXBhZ2Vzej0gb3B0aW9ucyBmb3IgZ2lnYW50aWMgcGFnZXM7IHN0b3JlIHRob3NlIGluCisgKiBhIGxpc3QgdGhhdCB3ZSB1c2UgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBvbmNlIGFsbCBvcHRpb25zIGFyZSBwYXJzZWQuCisgKi8KKwordW5zaWduZWQgbG9uZyBncGFnZV9ucGFnZXNbTU1VX1BBR0VfQ09VTlRdOworCitzdGF0aWMgaW50IF9faW5pdCBkb19ncGFnZV9lYXJseV9zZXR1cChjaGFyICpwYXJhbSwgY2hhciAqdmFsKQoreworCXN0YXRpYyBwaHlzX2FkZHJfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCisJLyoKKwkgKiBUaGUgaHVnZXBhZ2VzeiBhbmQgaHVnZXBhZ2VzIGNtZGxpbmUgb3B0aW9ucyBhcmUgaW50ZXJsZWF2ZWQuICBXZQorCSAqIHVzZSB0aGUgc2l6ZSB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHRoaXMgd2FzIGRvbmUKKwkgKiBwcm9wZXJseSBhbmQgc2tpcCBvdmVyIGluc3RhbmNlcyB3aGVyZSBpdCBpcyBpbmNvcnJlY3QuICBPdGhlcgorCSAqIGNvbW1hbmQtbGluZSBwYXJzaW5nIGNvZGUgd2lsbCBpc3N1ZSB3YXJuaW5ncywgc28gd2UgZG9uJ3QgbmVlZCB0by4KKwkgKgorCSAqLworCWlmICgoc3RyY21wKHBhcmFtLCAiZGVmYXVsdF9odWdlcGFnZXN6IikgPT0gMCkgfHwKKwkgICAgKHN0cmNtcChwYXJhbSwgImh1Z2VwYWdlc3oiKSA9PSAwKSkgeworCQlzaXplID0gbWVtcGFyc2UodmFsLCBOVUxMKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChwYXJhbSwgImh1Z2VwYWdlcyIpID09IDApIHsKKwkJaWYgKHNpemUgIT0gMCkgeworCQkJaWYgKHNzY2FuZih2YWwsICIlbHUiLCAmbnBhZ2VzKSA8PSAwKQorCQkJCW5wYWdlcyA9IDA7CisJCQlncGFnZV9ucGFnZXNbc2hpZnRfdG9fbW11X3BzaXplKF9fZmZzKHNpemUpKV0gPSBucGFnZXM7CisJCQlzaXplID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgcGh5c2ljYWwgc3BhY2UgZm9yIHBhZ2VzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZQorICogYnVkZHkgYWxsb2NhdG9yIGNhbiBoYW5kbGUuICBXZSB3YW50IHRvIGFsbG9jYXRlIHRoZXNlIGluIGhpZ2htZW0gYmVjYXVzZQorICogdGhlIGFtb3VudCBvZiBsb3dtZW0gaXMgbGltaXRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGlzIGZ1bmN0aW9uIE1VU1QgYmUKKyAqIGNhbGxlZCBiZWZvcmUgbG93bWVtX2VuZF9hZGRyIGlzIHNldCB1cCBpbiBNTVVfaW5pdCgpIGluIG9yZGVyIGZvciB0aGUgbG1iCisgKiBhbGxvY2F0ZSB0byBncmFiIGhpZ2htZW0uCisgKi8KK3ZvaWQgX19pbml0IHJlc2VydmVfaHVnZXRsYl9ncGFnZXModm9pZCkKK3sKKwlzdGF0aWMgX19pbml0ZGF0YSBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworCXBoeXNfYWRkcl90IHNpemUsIGJhc2U7CisJaW50IGk7CisKKwlzdHJsY3B5KGNtZGxpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJcGFyc2VfYXJncygiaHVnZXRsYiBncGFnZXMiLCBjbWRsaW5lLCBOVUxMLCAwLCAmZG9fZ3BhZ2VfZWFybHlfc2V0dXApOworCisJLyoKKwkgKiBXYWxrIGdwYWdlIGxpc3QgaW4gcmV2ZXJzZSwgYWxsb2NhdGluZyBsYXJnZXIgcGFnZSBzaXplcyBmaXJzdC4KKwkgKiBTa2lwIG92ZXIgdW5zdXBwb3J0ZWQgc2l6ZXMsIG9yIHNpemVzIHRoYXQgaGF2ZSAwIGdwYWdlcyBhbGxvY2F0ZWQuCisJICogV2hlbiB3ZSByZWFjaCB0aGUgcG9pbnQgaW4gdGhlIGxpc3Qgd2hlcmUgcGFnZXMgYXJlIG5vIGxvbmdlcgorCSAqIGNvbnNpZGVyZWQgZ3BhZ2VzLCB3ZSdyZSBkb25lLgorCSAqLworCWZvciAoaSA9IE1NVV9QQUdFX0NPVU5ULTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChtbXVfcHNpemVfZGVmc1tpXS5zaGlmdCA9PSAwIHx8IGdwYWdlX25wYWdlc1tpXSA9PSAwKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKG1tdV9wc2l6ZV90b19zaGlmdChpKSA8IChNQVhfT1JERVIgKyBQQUdFX1NISUZUKSkKKwkJCWJyZWFrOworCisJCXNpemUgPSAocGh5c19hZGRyX3QpKDFVTEwgPDwgbW11X3BzaXplX3RvX3NoaWZ0KGkpKTsKKwkJYmFzZSA9IG1lbWJsb2NrX2FsbG9jX2Jhc2Uoc2l6ZSAqIGdwYWdlX25wYWdlc1tpXSwgc2l6ZSwKKwkJCQkJICAgTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUpOworCQlhZGRfZ3BhZ2UoYmFzZSwgc2l6ZSwgZ3BhZ2VfbnBhZ2VzW2ldKTsKKwl9Cit9CisKKyNlbHNlIC8qIFBQQzY0ICovCisKKy8qIEJ1aWxkIGxpc3Qgb2YgYWRkcmVzc2VzIG9mIGdpZ2FudGljIHBhZ2VzLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGVhcmx5CisgKiBib290IGJlZm9yZSB0aGUgYnVkZHkgb3IgYm9vdG1lbSBhbGxvY2F0b3IgaXMgc2V0dXAuCisgKi8KK3ZvaWQgYWRkX2dwYWdlKHU2NCBhZGRyLCB1NjQgcGFnZV9zaXplLCB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9wYWdlcykKIHsKIAlpZiAoIWFkZHIpCiAJCXJldHVybjsKQEAgLTE5OSwxOSArMzQ4LDc5IEBACiAJbS0+aHN0YXRlID0gaHN0YXRlOwogCXJldHVybiAxOwogfQorI2VuZGlmCiAKIGludCBodWdlX3BtZF91bnNoYXJlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICphZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QUEMzMgorI2RlZmluZSBIVUdFUERfRlJFRUxJU1RfU0laRSBcCisJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCkpIC8gc2l6ZW9mKHB0ZV90KSkKKworc3RydWN0IGh1Z2VwZF9mcmVlbGlzdCB7CisJc3RydWN0IHJjdV9oZWFkCXJjdTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdm9pZCAqcHRlc1swXTsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaHVnZXBkX2ZyZWVsaXN0ICosIGh1Z2VwZF9mcmVlbGlzdF9jdXIpOworCitzdGF0aWMgdm9pZCBodWdlcGRfZnJlZV9yY3VfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBodWdlcGRfZnJlZWxpc3QgKmJhdGNoID0KKwkJY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBodWdlcGRfZnJlZWxpc3QsIHJjdSk7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmF0Y2gtPmluZGV4OyBpKyspCisJCWttZW1fY2FjaGVfZnJlZShodWdlcHRlX2NhY2hlLCBiYXRjaC0+cHRlc1tpXSk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYmF0Y2gpOworfQorCitzdGF0aWMgdm9pZCBodWdlcGRfZnJlZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCB2b2lkICpodWdlcHRlKQoreworCXN0cnVjdCBodWdlcGRfZnJlZWxpc3QgKipiYXRjaHA7CisKKwliYXRjaHAgPSAmX19nZXRfY3B1X3ZhcihodWdlcGRfZnJlZWxpc3RfY3VyKTsKKworCWlmIChhdG9taWNfcmVhZCgmdGxiLT5tbS0+bW1fdXNlcnMpIDwgMiB8fAorCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sodGxiLT5tbSksCisJCQkgIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpIHsKKwkJa21lbV9jYWNoZV9mcmVlKGh1Z2VwdGVfY2FjaGUsIGh1Z2VwdGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKCpiYXRjaHAgPT0gTlVMTCkgeworCQkqYmF0Y2hwID0gKHN0cnVjdCBodWdlcGRfZnJlZWxpc3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisJCSgqYmF0Y2hwKS0+aW5kZXggPSAwOworCX0KKworCSgqYmF0Y2hwKS0+cHRlc1soKmJhdGNocCktPmluZGV4KytdID0gaHVnZXB0ZTsKKwlpZiAoKCpiYXRjaHApLT5pbmRleCA9PSBIVUdFUERfRlJFRUxJU1RfU0laRSkgeworCQljYWxsX3JjdV9zY2hlZCgmKCpiYXRjaHApLT5yY3UsIGh1Z2VwZF9mcmVlX3JjdV9jYWxsYmFjayk7CisJCSpiYXRjaHAgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBmcmVlX2h1Z2VwZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBodWdlcGRfdCAqaHBkcCwgaW50IHBkc2hpZnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxvb3IsIHVuc2lnbmVkIGxvbmcgY2VpbGluZykKIHsKIAlwdGVfdCAqaHVnZXB0ZSA9IGh1Z2VwZF9wYWdlKCpocGRwKTsKLQl1bnNpZ25lZCBzaGlmdCA9IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CisJaW50IGk7CisKIAl1bnNpZ25lZCBsb25nIHBkbWFzayA9IH4oKDFVTCA8PCBwZHNoaWZ0KSAtIDEpOworCXVuc2lnbmVkIGludCBudW1faHVnZXBkID0gMTsKKworI2lmZGVmIENPTkZJR19QUEM2NAorCXVuc2lnbmVkIGludCBzaGlmdCA9IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CisjZWxzZQorCS8qIE5vdGU6IE9uIDMyLWJpdCB0aGUgaHBkcCBtYXkgYmUgdGhlIGZpcnN0IG9mIHNldmVyYWwgKi8KKwludW1faHVnZXBkID0gKDEgPDwgKGh1Z2VwZF9zaGlmdCgqaHBkcCkgLSBwZHNoaWZ0KSk7CisjZW5kaWYKIAogCXN0YXJ0ICY9IHBkbWFzazsKIAlpZiAoc3RhcnQgPCBmbG9vcikKQEAgLTIyNCw5ICs0MzMsMTUgQEAKIAlpZiAoZW5kIC0gMSA+IGNlaWxpbmcgLSAxKQogCQlyZXR1cm47CiAKLQlocGRwLT5wZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9odWdlcGQ7IGkrKywgaHBkcCsrKQorCQlocGRwLT5wZCA9IDA7CisKIAl0bGItPm5lZWRfZmx1c2ggPSAxOworI2lmZGVmIENPTkZJR19QUEM2NAogCXBndGFibGVfZnJlZV90bGIodGxiLCBodWdlcHRlLCBwZHNoaWZ0IC0gc2hpZnQpOworI2Vsc2UKKwlodWdlcGRfZnJlZSh0bGIsIGh1Z2VwdGUpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGh1Z2V0bGJfZnJlZV9wbWRfcmFuZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHVkX3QgKnB1ZCwKQEAgLTMzMSwxOCArNTQ2LDI3IEBACiAJICogdG9vLgogCSAqLwogCi0JcGdkID0gcGdkX29mZnNldCh0bGItPm1tLCBhZGRyKTsKIAlkbyB7CiAJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJcGdkID0gcGdkX29mZnNldCh0bGItPm1tLCBhZGRyKTsKIAkJaWYgKCFpc19odWdlcGQocGdkKSkgewogCQkJaWYgKHBnZF9ub25lX29yX2NsZWFyX2JhZChwZ2QpKQogCQkJCWNvbnRpbnVlOwogCQkJaHVnZXRsYl9mcmVlX3B1ZF9yYW5nZSh0bGIsIHBnZCwgYWRkciwgbmV4dCwgZmxvb3IsIGNlaWxpbmcpOwogCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19QUEMzMgorCQkJLyoKKwkJCSAqIEluY3JlbWVudCBuZXh0IGJ5IHRoZSBzaXplIG9mIHRoZSBodWdlIG1hcHBpbmcgc2luY2UKKwkJCSAqIG9uIDMyLWJpdCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBhdCB0aGUgcGdkCisJCQkgKiBsZXZlbCBmb3IgYSBzaW5nbGUgaHVnZXBhZ2UsIGJ1dCBhbGwgb2YgdGhlbSBwb2ludCB0bworCQkJICogdGhlIHNhbWUga21lbSBjYWNoZSB0aGF0IGhvbGRzIHRoZSBodWdlcHRlLgorCQkJICovCisJCQluZXh0ID0gYWRkciArICgxIDw8IGh1Z2VwZF9zaGlmdCgqKGh1Z2VwZF90ICopcGdkKSk7CisjZW5kaWYKIAkJCWZyZWVfaHVnZXBkX3JhbmdlKHRsYiwgKGh1Z2VwZF90ICopcGdkLCBQR0RJUl9TSElGVCwKIAkJCQkJICBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0KLQl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKKwl9IHdoaWxlIChhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogfQogCiBzdHJ1Y3QgcGFnZSAqCkBAIC0zOTAsNyArNjE0LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAJdW5zaWduZWQgbG9uZyBwdGVfZW5kOwotCXN0cnVjdCBwYWdlICpoZWFkLCAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaGVhZCwgKnBhZ2UsICp0YWlsOwogCXB0ZV90IHB0ZTsKIAlpbnQgcmVmczsKIApAQCAtNDEzLDYgKzYzNyw3IEBACiAJaGVhZCA9IHB0ZV9wYWdlKHB0ZSk7CiAKIAlwYWdlID0gaGVhZCArICgoYWRkciAmIChzei0xKSkgPj4gUEFHRV9TSElGVCk7CisJdGFpbCA9IHBhZ2U7CiAJZG8gewogCQlWTV9CVUdfT04oY29tcG91bmRfaGVhZChwYWdlKSAhPSBoZWFkKTsKIAkJcGFnZXNbKm5yXSA9IHBhZ2U7CkBAIC00MjgsMTAgKzY1MywyMCBAQAogCiAJaWYgKHVubGlrZWx5KHB0ZV92YWwocHRlKSAhPSBwdGVfdmFsKCpwdGVwKSkpIHsKIAkJLyogQ291bGQgYmUgb3B0aW1pemVkIGJldHRlciAqLwotCQl3aGlsZSAoKm5yKSB7Ci0JCQlwdXRfcGFnZShwYWdlKTsKLQkJCSgqbnIpLS07Ci0JCX0KKwkJKm5yIC09IHJlZnM7CisJCXdoaWxlIChyZWZzLS0pCisJCQlwdXRfcGFnZShoZWFkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbnkgdGFpbCBwYWdlIG5lZWQgdGhlaXIgbWFwY291bnQgcmVmZXJlbmNlIHRha2VuIGJlZm9yZSB3ZQorCSAqIHJldHVybi4KKwkgKi8KKwl3aGlsZSAocmVmcy0tKSB7CisJCWlmIChQYWdlVGFpbCh0YWlsKSkKKwkJCWdldF9odWdlX3BhZ2VfdGFpbCh0YWlsKTsKKwkJdGFpbCsrOwogCX0KIAogCXJldHVybiAxOwpAQCAtNDY2LDE3ICs3MDEsMzUgQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CisjaWZkZWYgQ09ORklHX1BQQ19NTV9TTElDRVMKIAlzdHJ1Y3QgaHN0YXRlICpoc3RhdGUgPSBoc3RhdGVfZmlsZShmaWxlKTsKIAlpbnQgbW11X3BzaXplID0gc2hpZnRfdG9fbW11X3BzaXplKGh1Z2VfcGFnZV9zaGlmdChoc3RhdGUpKTsKIAogCXJldHVybiBzbGljZV9nZXRfdW5tYXBwZWRfYXJlYShhZGRyLCBsZW4sIGZsYWdzLCBtbXVfcHNpemUsIDEsIDApOworI2Vsc2UKKwlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOworI2VuZGlmCiB9CiAKIHVuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUwogCXVuc2lnbmVkIGludCBwc2l6ZSA9IGdldF9zbGljZV9wc2l6ZSh2bWEtPnZtX21tLCB2bWEtPnZtX3N0YXJ0KTsKIAogCXJldHVybiAxVUwgPDwgbW11X3BzaXplX3RvX3NoaWZ0KHBzaXplKTsKKyNlbHNlCisJaWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKKwkJcmV0dXJuIFBBR0VfU0laRTsKKworCXJldHVybiBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wb3dlcl9vZl80KHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlpZiAoaXNfcG93ZXJfb2ZfMih4KSkKKwkJcmV0dXJuIChfX2lsb2cyKHgpICUgMikgPyBmYWxzZSA6IHRydWU7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhZGRfaHVnZV9wYWdlX3NpemUodW5zaWduZWQgbG9uZyBsb25nIHNpemUpCkBAIC00ODYsOSArNzM5LDE0IEBACiAKIAkvKiBDaGVjayB0aGF0IGl0IGlzIGEgcGFnZSBzaXplIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgYW5kCiAJICogdGhhdCBpdCBmaXRzIHdpdGhpbiBwYWdldGFibGUgYW5kIHNsaWNlIGxpbWl0cy4gKi8KKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKwlpZiAoKHNpemUgPCBQQUdFX1NJWkUpIHx8ICFpc19wb3dlcl9vZl80KHNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyNlbHNlCiAJaWYgKCFpc19wb3dlcl9vZl8yKHNpemUpCiAJICAgIHx8IChzaGlmdCA+IFNMSUNFX0hJR0hfU0hJRlQpIHx8IChzaGlmdCA8PSBQQUdFX1NISUZUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKIAogCWlmICgobW11X3BzaXplID0gc2hpZnRfdG9fbW11X3BzaXplKHNoaWZ0KSkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUyNSw2ICs3ODMsNDYgQEAKIH0KIF9fc2V0dXAoImh1Z2VwYWdlc3o9IiwgaHVnZXBhZ2Vfc2V0dXBfc3opOwogCisjaWZkZWYgQ09ORklHX0ZTTF9CT09LRQorc3RydWN0IGttZW1fY2FjaGUgKmh1Z2VwdGVfY2FjaGU7CitzdGF0aWMgaW50IF9faW5pdCBodWdldGxicGFnZV9pbml0KHZvaWQpCit7CisJaW50IHBzaXplOworCisJZm9yIChwc2l6ZSA9IDA7IHBzaXplIDwgTU1VX1BBR0VfQ09VTlQ7ICsrcHNpemUpIHsKKwkJdW5zaWduZWQgc2hpZnQ7CisKKwkJaWYgKCFtbXVfcHNpemVfZGVmc1twc2l6ZV0uc2hpZnQpCisJCQljb250aW51ZTsKKworCQlzaGlmdCA9IG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSk7CisKKwkJLyogRG9uJ3QgdHJlYXQgbm9ybWFsIHBhZ2Ugc2l6ZXMgYXMgaHVnZS4uLiAqLworCQlpZiAoc2hpZnQgIT0gUEFHRV9TSElGVCkKKwkJCWlmIChhZGRfaHVnZV9wYWdlX3NpemUoMVVMTCA8PCBzaGlmdCkgPCAwKQorCQkJCWNvbnRpbnVlOworCX0KKworCS8qCisJICogQ3JlYXRlIGEga21lbSBjYWNoZSBmb3IgaHVnZXB0ZXMuICBUaGUgYm90dG9tIGJpdHMgaW4gdGhlIHB0ZSBoYXZlCisJICogc2l6ZSBpbmZvcm1hdGlvbiBlbmNvZGVkIGluIHRoZW0sIHNvIGFsaWduIHRoZW0gdG8gYWxsb3cgdGhpcworCSAqLworCWh1Z2VwdGVfY2FjaGUgPSAga21lbV9jYWNoZV9jcmVhdGUoImh1Z2VwdGUtY2FjaGUiLCBzaXplb2YocHRlX3QpLAorCQkJCQkgICBIVUdFUERfU0hJRlRfTUFTSyArIDEsIDAsIE5VTEwpOworCWlmIChodWdlcHRlX2NhY2hlID09IE5VTEwpCisJCXBhbmljKCIlczogVW5hYmxlIHRvIGNyZWF0ZSBrbWVtIGNhY2hlIGZvciBodWdlcHRlc1xuIiwKKwkJICAgICAgX19mdW5jX18pOworCisJLyogRGVmYXVsdCBocGFnZSBzaXplID0gNE0gKi8KKwlpZiAobW11X3BzaXplX2RlZnNbTU1VX1BBR0VfNE1dLnNoaWZ0KQorCQlIUEFHRV9TSElGVCA9IG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzRNXS5zaGlmdDsKKwllbHNlCisJCXBhbmljKCIlczogVW5hYmxlIHRvIHNldCBkZWZhdWx0IGh1Z2UgcGFnZSBzaXplXG4iLCBfX2Z1bmNfXyk7CisKKworCXJldHVybiAwOworfQorI2Vsc2UKIHN0YXRpYyBpbnQgX19pbml0IGh1Z2V0bGJwYWdlX2luaXQodm9pZCkKIHsKIAlpbnQgcHNpemU7CkBAIC01NjcsMTUgKzg2NSwyMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KKyNlbmRpZgogbW9kdWxlX2luaXQoaHVnZXRsYnBhZ2VfaW5pdCk7CiAKIHZvaWQgZmx1c2hfZGNhY2hlX2ljYWNoZV9odWdlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpbnQgaTsKKwl2b2lkICpzdGFydDsKIAogCUJVR19PTighUGFnZUNvbXBvdW5kKHBhZ2UpKTsKIAotCWZvciAoaSA9IDA7IGkgPCAoMVVMIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpKTsgaSsrKQotCQlfX2ZsdXNoX2RjYWNoZV9pY2FjaGUocGFnZV9hZGRyZXNzKHBhZ2UraSkpOworCWZvciAoaSA9IDA7IGkgPCAoMVVMIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpKTsgaSsrKSB7CisJCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShwYWdlX2FkZHJlc3MocGFnZStpKSk7CisJCX0gZWxzZSB7CisJCQlzdGFydCA9IGttYXBfYXRvbWljKHBhZ2UraSwgS01fUFBDX1NZTkNfSUNBQ0hFKTsKKwkJCV9fZmx1c2hfZGNhY2hlX2ljYWNoZShzdGFydCk7CisJCQlrdW5tYXBfYXRvbWljKHN0YXJ0LCBLTV9QUENfU1lOQ19JQ0FDSEUpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKaW5kZXggYzc3ZmVmNS4uMTYxY2VmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCkBAIC0zMiw2ICszMiw4IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTQ0LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9odWdldGxiLmg+CiAKICNpbmNsdWRlICJtbXVfZGVjbC5oIgogCkBAIC0xMjMsNiArMTI2LDEyIEBACiAJLyogcGFyc2UgYXJncyBmcm9tIGNvbW1hbmQgbGluZSAqLwogCU1NVV9zZXR1cCgpOwogCisJLyoKKwkgKiBSZXNlcnZlIGdpZ2FudGljIHBhZ2VzIGZvciBodWdldGxiLiAgVGhpcyBNVVNUIG9jY3VyIGJlZm9yZQorCSAqIGxvd21lbV9lbmRfYWRkciBpcyBpbml0aWFsaXplZCBiZWxvdy4KKwkgKi8KKwlyZXNlcnZlX2h1Z2V0bGJfZ3BhZ2VzKCk7CisKIAlpZiAobWVtYmxvY2subWVtb3J5LmNudCA+IDEpIHsKICNpZm5kZWYgQ09ORklHX1dJSQogCQltZW1ibG9jay5tZW1vcnkuY250ID0gMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCBjNzgxYmJjLi4yZGQ2YmRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTEyMyw3ICsxMjQsOCBAQAogCXBnZGF0YSA9IE5PREVfREFUQShuaWQpOwogCiAJc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKHN0YXJ0KTsKLQljcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHN0YXJ0LCBzdGFydCArIHNpemUpOworCWlmIChjcmVhdGVfc2VjdGlvbl9tYXBwaW5nKHN0YXJ0LCBzdGFydCArIHNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHRoaXMgc2hvdWxkIHdvcmsgZm9yIG1vc3Qgbm9uLWhpZ2htZW0gcGxhdGZvcm1zICovCiAJem9uZSA9IHBnZGF0YS0+bm9kZV96b25lczsKQEAgLTU0OCw0ICs1NTAsMzggQEAKIAkJcmV0dXJuOwogCWhhc2hfcHJlbG9hZCh2bWEtPnZtX21tLCBhZGRyZXNzLCBhY2Nlc3MsIHRyYXApOwogI2VuZGlmIC8qIENPTkZJR19QUENfU1REX01NVSAqLworI2lmIChkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFXzY0KSB8fCBkZWZpbmVkKENPTkZJR19QUENfRlNMX0JPT0szRSkpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0UpCisJaWYgKGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlib29rM2VfaHVnZXRsYl9wcmVsb2FkKHZtYS0+dm1fbW0sIGFkZHJlc3MsICpwdGVwKTsKKyNlbmRpZgogfQorCisvKgorICogU3lzdGVtIG1lbW9yeSBzaG91bGQgbm90IGJlIGluIC9wcm9jL2lvbWVtIGJ1dCB2YXJpb3VzIHRvb2xzIGV4cGVjdCBpdAorICogKGVnIGtkdW1wKS4KKyAqLworc3RhdGljIGludCBhZGRfc3lzdGVtX3JhbV9yZXNvdXJjZXModm9pZCkKK3sKKwlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWc7CisKKwlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIHJlZykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJdW5zaWduZWQgbG9uZyBiYXNlID0gcmVnLT5iYXNlOworCQl1bnNpZ25lZCBsb25nIHNpemUgPSByZWctPnNpemU7CisKKwkJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJCVdBUk5fT04oIXJlcyk7CisKKwkJaWYgKHJlcykgeworCQkJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOworCQkJcmVzLT5zdGFydCA9IGJhc2U7CisJCQlyZXMtPmVuZCA9IGJhc2UgKyBzaXplIC0gMTsKKwkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJCVdBUk5fT04ocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcykgPCAwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGFkZF9zeXN0ZW1fcmFtX3Jlc291cmNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDMyLmMKaW5kZXggZDBlZTU1NC4uNzhmZWY2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2gzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoMzIuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoNjQuYwppbmRleCAzYmFmYzNkLi5jYTk4OGEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMTM2LDggKzEzNiw4IEBACiAJaWYgKCFtbSB8fCAhYWNvcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBtbV91c2VycyBkb2Vzbid0IGNoYW5nZSAqLwotCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkvKiBUaGUgcGFnZV90YWJsZV9sb2NrIGVuc3VyZXMgbW1fdXNlcnMgd29uJ3QgY2hhbmdlIHVuZGVyIHVzICovCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlzcGluX2xvY2sobW0tPmNvbnRleHQuY29wX2xvY2twKTsKIAogCWlmIChtbS0+Y29udGV4dC5jb3BfcGlkID09IENPUF9QSURfTk9ORSkgewpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIG91dDoKIAlzcGluX3VubG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOwotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4NSw4ICsxODUsOCBAQAogCWlmIChXQVJOX09OX09OQ0UoIW1tKSkKIAkJcmV0dXJuOwogCi0JLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgbW1fdXNlcnMgZG9lc24ndCBjaGFuZ2UgKi8KLQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJLyogVGhlIHBhZ2VfdGFibGVfbG9jayBlbnN1cmVzIG1tX3VzZXJzIHdvbid0IGNoYW5nZSB1bmRlciB1cyAqLworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJc3Bpbl9sb2NrKG1tLT5jb250ZXh0LmNvcF9sb2NrcCk7CiAKIAltbS0+Y29udGV4dC5hY29wICY9IH5hY29wOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJfQogCiAJc3Bpbl91bmxvY2sobW0tPmNvbnRleHQuY29wX2xvY2twKTsKLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRyb3BfY29wKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCmluZGV4IDMzNjgwN2QuLjViNjNiZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKQEAgLTI5Miw2ICsyOTIsMTEgQEAKIAltbS0+Y29udGV4dC5pZCA9IE1NVV9OT19DT05URVhUOwogCW1tLT5jb250ZXh0LmFjdGl2ZSA9IDA7CiAKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUworCWlmIChzbGljZV9tbV9uZXdfY29udGV4dChtbSkpCisJCXNsaWNlX3NldF91c2VyX3BzaXplKG1tLCBtbXVfdmlydHVhbF9wc2l6ZSk7CisjZW5kaWYKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaCBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCmluZGV4IGRkMGEyNTguLjgzZWI1ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCkBAIC0xNDIsNiArMTQyLDggQEAKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX0ZTTF9CT09LM0UpCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXBfbWVtX2luX2NhbXModW5zaWduZWQgbG9uZyByYW0sIGludCBtYXhfY2FtX2lkeCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBjYWxjX2NhbV9zeih1bnNpZ25lZCBsb25nIHJhbSwgdW5zaWduZWQgbG9uZyB2aXJ0LAorCQkJCSBwaHlzX2FkZHJfdCBwaHlzKTsKICNpZmRlZiBDT05GSUdfUFBDMzIKIGV4dGVybiB2b2lkIE1NVV9pbml0X2h3KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW11X21hcGluX3JhbSh1bnNpZ25lZCBsb25nIHRvcCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCAyMTY0MDA2Li5iMjJhODNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC0zMTUsNyArMzE1LDEwIEBACiAJc3RydWN0IGRldmljZV9ub2RlICpyb290OwogCWNvbnN0IGNoYXIgKnZlYzU7CiAKLQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9ydGFzIik7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTCkpCisJCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsIik7CisJZWxzZQorCQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9ydGFzIik7CiAJaWYgKCFyb290KQogCQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIApAQCAtMzQ0LDEyICszNDcsMTkgQEAKIAogI2RlZmluZSBWRUM1X0FGRklOSVRZX0JZVEUJNQogI2RlZmluZSBWRUM1X0FGRklOSVRZCQkweDgwCi0JY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW4iKTsKLQlpZiAoY2hvc2VuKSB7Ci0JCXZlYzUgPSBvZl9nZXRfcHJvcGVydHkoY2hvc2VuLCAiaWJtLGFyY2hpdGVjdHVyZS12ZWMtNSIsIE5VTEwpOwotCQlpZiAodmVjNSAmJiAodmVjNVtWRUM1X0FGRklOSVRZX0JZVEVdICYgVkVDNV9BRkZJTklUWSkpIHsKLQkJCWRiZygiVXNpbmcgZm9ybSAxIGFmZmluaXR5XG4iKTsKLQkJCWZvcm0xX2FmZmluaXR5ID0gMTsKKworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlmb3JtMV9hZmZpbml0eSA9IDE7CisJZWxzZSB7CisJCWNob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuIik7CisJCWlmIChjaG9zZW4pIHsKKwkJCXZlYzUgPSBvZl9nZXRfcHJvcGVydHkoY2hvc2VuLAorCQkJCQkgICAgICAgImlibSxhcmNoaXRlY3R1cmUtdmVjLTUiLCBOVUxMKTsKKwkJCWlmICh2ZWM1ICYmICh2ZWM1W1ZFQzVfQUZGSU5JVFlfQllURV0gJgorCQkJCQkJCVZFQzVfQUZGSU5JVFkpKSB7CisJCQkJZGJnKCJVc2luZyBmb3JtIDEgYWZmaW5pdHlcbiIpOworCQkJCWZvcm0xX2FmZmluaXR5ID0gMTsKKwkJCX0KIAkJfQogCX0KIApAQCAtNzA5LDggKzcxOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX251bWFfcHJvcGVydGllcyh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1ID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICptZW1vcnk7CiAJaW50IGRlZmF1bHRfbmlkID0gMDsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTczMiw2ICs3NDEsNyBAQAogCSAqIGVhY2ggbm9kZSB0byBiZSBvbmxpbmVkIG11c3QgaGF2ZSBOT0RFX0RBVEEgZXRjIGJhY2tpbmcgaXQuCiAJICovCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKIAkJaW50IG5pZDsKIAogCQljcHUgPSBvZl9nZXRfY3B1X25vZGUoaSwgTlVMTCk7CkBAIC03NTAsOCArNzYwLDggQEAKIAl9CiAKIAlnZXRfbl9tZW1fY2VsbHMoJm5fbWVtX2FkZHJfY2VsbHMsICZuX21lbV9zaXplX2NlbGxzKTsKLQltZW1vcnkgPSBOVUxMOwotCXdoaWxlICgobWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5IikpICE9IE5VTEwpIHsKKworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShtZW1vcnksICJtZW1vcnkiKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAkJaW50IG5pZDsKQEAgLTgwMCw4ICs4MTAsOSBAQAogCX0KIAogCS8qCi0JICogTm93IGRvIHRoZSBzYW1lIHRoaW5nIGZvciBlYWNoIE1FTUJMT0NLIGxpc3RlZCBpbiB0aGUgaWJtLGR5bmFtaWMtbWVtb3J5Ci0JICogcHJvcGVydHkgaW4gdGhlIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgbm9kZS4KKwkgKiBOb3cgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGVhY2ggTUVNQkxPQ0sgbGlzdGVkIGluIHRoZQorCSAqIGlibSxkeW5hbWljLW1lbW9yeSBwcm9wZXJ0eSBpbiB0aGUKKwkgKiBpYm0sZHluYW1pYy1yZWNvbmZpZ3VyYXRpb24tbWVtb3J5IG5vZGUuCiAJICovCiAJbWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sZHluYW1pYy1yZWNvbmZpZ3VyYXRpb24tbWVtb3J5Iik7CiAJaWYgKG1lbW9yeSkKQEAgLTExODcsMTAgKzExOTgsMTAgQEAKICAqLwogaW50IGhvdF9hZGRfbm9kZV9zY25fdG9fbmlkKHVuc2lnbmVkIGxvbmcgc2NuX2FkZHIpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICptZW1vcnkgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVtb3J5OwogCWludCBuaWQgPSAtMTsKIAotCXdoaWxlICgobWVtb3J5ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5IikpICE9IE5VTEwpIHsKKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobWVtb3J5LCAibWVtb3J5IikgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplOwogCQlpbnQgcmFuZ2VzOwogCQljb25zdCB1bnNpZ25lZCBpbnQgKm1lbWNlbGxfYnVmOwpAQCAtMTIxNCwxMSArMTIyNSwxMiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlvZl9ub2RlX3B1dChtZW1vcnkpOwogCQlpZiAobmlkID49IDApCiAJCQlicmVhazsKIAl9CiAKKwlvZl9ub2RlX3B1dChtZW1vcnkpOworCiAJcmV0dXJuIG5pZDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKaW5kZXggYWY0MGM4Ny4uMjE0MTMwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CkBAIC0yMTIsNyArMjEzLDcgQEAKIAllbnRyeSA9IHNldF9hY2Nlc3NfZmxhZ3NfZmlsdGVyKGVudHJ5LCB2bWEsIGRpcnR5KTsKIAljaGFuZ2VkID0gIXB0ZV9zYW1lKCoocHRlcCksIGVudHJ5KTsKIAlpZiAoY2hhbmdlZCkgewotCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fSFVHRVRMQikpCisJCWlmICghaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCiAJCQlhc3NlcnRfcHRlX2xvY2tlZCh2bWEtPnZtX21tLCBhZGRyZXNzKTsKIAkJX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3MocHRlcCwgZW50cnkpOwogCQlmbHVzaF90bGJfcGFnZV9ub2hhc2godm1hLCBhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCmluZGV4IDZlNTk1ZjYuLmFkMzZlZGU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9zbGljZS5jCmluZGV4IGJhNTE5NDguLjczNzA5ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9zbGljZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGljZS5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL21tYW4uaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfaGFzaDMyLmMKaW5kZXggOWE0NDVmNi4uNTU4ZTMwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl9oYXNoMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2hhc2gzMi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCmluZGV4IDRlYmIzNGIuLmRjNGE1ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbG93XzY0ZS5TCkBAIC01NTMsMjQgKzU1MywyNCBAQAogCXJsZGljbAlyMTEscjE2LDY0LVZQVEVfUEdEX1NISUZULDY0LVBHRF9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjEwLHIxMSwzCiAJbGR4CXIxNSxyMTAscjE1Ci0JY21wbGRpCWNyMCxyMTUsMAotCWJlcQl2aXJ0X3BhZ2VfdGFibGVfdGxiX21pc3NfZmF1bHQKKwljbXBkaQljcjAscjE1LDAKKwliZ2UJdmlydF9wYWdlX3RhYmxlX3RsYl9taXNzX2ZhdWx0CiAKICNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKIAkvKiBHZXQgdG8gUFVEIGVudHJ5ICovCiAJcmxkaWNsCXIxMSxyMTYsNjQtVlBURV9QVURfU0hJRlQsNjQtUFVEX0lOREVYX1NJWkUtMwogCWNscnJkaQlyMTAscjExLDMKIAlsZHgJcjE1LHIxMCxyMTUKLQljbXBsZGkJY3IwLHIxNSwwCi0JYmVxCXZpcnRfcGFnZV90YWJsZV90bGJfbWlzc19mYXVsdAorCWNtcGRpCWNyMCxyMTUsMAorCWJnZQl2aXJ0X3BhZ2VfdGFibGVfdGxiX21pc3NfZmF1bHQKICNlbmRpZiAvKiBDT05GSUdfUFBDXzY0S19QQUdFUyAqLwogCiAJLyogR2V0IHRvIFBNRCBlbnRyeSAqLwogCXJsZGljbAlyMTEscjE2LDY0LVZQVEVfUE1EX1NISUZULDY0LVBNRF9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjEwLHIxMSwzCiAJbGR4CXIxNSxyMTAscjE1Ci0JY21wbGRpCWNyMCxyMTUsMAotCWJlcQl2aXJ0X3BhZ2VfdGFibGVfdGxiX21pc3NfZmF1bHQKKwljbXBkaQljcjAscjE1LDAKKwliZ2UJdmlydF9wYWdlX3RhYmxlX3RsYl9taXNzX2ZhdWx0CiAKIAkvKiBPaywgd2UncmUgYWxsIHJpZ2h0LCB3ZSBjYW4gbm93IGNyZWF0ZSBhIGtlcm5lbCB0cmFuc2xhdGlvbiBmb3IKIAkgKiBhIDRLIG9yIDY0SyBwYWdlIGZyb20gcjE2IC0+IHIxNS4KQEAgLTgwMiwyNCArODAyLDI0IEBACiAJcmxkaWNsCXIxMSxyMTYsNjQtKFBHRElSX1NISUZULTMpLDY0LVBHRF9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjEwLHIxMSwzCiAJbGR4CXIxNSxyMTAscjE1Ci0JY21wbGRpCWNyMCxyMTUsMAotCWJlcQlodHdfdGxiX21pc3NfZmF1bHQKKwljbXBkaQljcjAscjE1LDAKKwliZ2UJaHR3X3RsYl9taXNzX2ZhdWx0CiAKICNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKIAkvKiBHZXQgdG8gUFVEIGVudHJ5ICovCiAJcmxkaWNsCXIxMSxyMTYsNjQtKFBVRF9TSElGVC0zKSw2NC1QVURfSU5ERVhfU0laRS0zCiAJY2xycmRpCXIxMCxyMTEsMwogCWxkeAlyMTUscjEwLHIxNQotCWNtcGxkaQljcjAscjE1LDAKLQliZXEJaHR3X3RsYl9taXNzX2ZhdWx0CisJY21wZGkJY3IwLHIxNSwwCisJYmdlCWh0d190bGJfbWlzc19mYXVsdAogI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKIAkvKiBHZXQgdG8gUE1EIGVudHJ5ICovCiAJcmxkaWNsCXIxMSxyMTYsNjQtKFBNRF9TSElGVC0zKSw2NC1QTURfSU5ERVhfU0laRS0zCiAJY2xycmRpCXIxMCxyMTEsMwogCWxkeAlyMTUscjEwLHIxNQotCWNtcGxkaQljcjAscjE1LDAKLQliZXEJaHR3X3RsYl9taXNzX2ZhdWx0CisJY21wZGkJY3IwLHIxNSwwCisJYmdlCWh0d190bGJfbWlzc19mYXVsdAogCiAJLyogT2ssIHdlJ3JlIGFsbCByaWdodCwgd2UgY2FuIG5vdyBjcmVhdGUgYW4gaW5kaXJlY3QgZW50cnkgZm9yCiAJICogYSAxTSBvciAyNTZNIHBhZ2UuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwppbmRleCBkMzJlYzY0Li40ZTEzZDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKQEAgLTI4LDYgKzI4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpAQCAtMzYsMTQgKzM3LDQ5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgorI2luY2x1ZGUgPGFzbS9odWdldGxiLmg+CiAKICNpbmNsdWRlICJtbXVfZGVjbC5oIgogCi0jaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKKy8qCisgKiBUaGlzIHN0cnVjdCBsaXN0cyB0aGUgc3ctc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMuICBUaGUgaGFyZGF3cmUgTU1VIG1heSBzdXBwb3J0CisgKiBvdGhlciBzaXplcyBub3QgbGlzdGVkIGhlcmUuICAgVGhlIC5pbmQgZmllbGQgaXMgb25seSB1c2VkIG9uIE1NVXMgdGhhdCBoYXZlCisgKiBpbmRpcmVjdCBwYWdlIHRhYmxlIGVudHJpZXMuCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szRV9NTVUKKyNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCitzdHJ1Y3QgbW11X3BzaXplX2RlZiBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV9DT1VOVF0gPSB7CisJW01NVV9QQUdFXzRLXSA9IHsKKwkJLnNoaWZ0CT0gMTIsCisJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzRLLAorCX0sCisJW01NVV9QQUdFXzRNXSA9IHsKKwkJLnNoaWZ0CT0gMjIsCisJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzRNLAorCX0sCisJW01NVV9QQUdFXzE2TV0gPSB7CisJCS5zaGlmdAk9IDI0LAorCQkuZW5jCT0gQk9PSzNFX1BBR0VTWl8xNk0sCisJfSwKKwlbTU1VX1BBR0VfNjRNXSA9IHsKKwkJLnNoaWZ0CT0gMjYsCisJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzY0TSwKKwl9LAorCVtNTVVfUEFHRV8yNTZNXSA9IHsKKwkJLnNoaWZ0CT0gMjgsCisJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzI1Nk0sCisJfSwKKwlbTU1VX1BBR0VfMUddID0geworCQkuc2hpZnQJPSAzMCwKKwkJLmVuYwk9IEJPT0szRV9QQUdFU1pfMUdCLAorCX0sCit9OworI2Vsc2UKIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXSA9IHsKIAlbTU1VX1BBR0VfNEtdID0gewogCQkuc2hpZnQJPSAxMiwKQEAgLTc3LDYgKzExMyw4IEBACiAJCS5lbmMJPSBCT09LM0VfUEFHRVNaXzFHQiwKIAl9LAogfTsKKyNlbmRpZiAvKiBDT05GSUdfRlNMX0JPT0tFICovCisKIHN0YXRpYyBpbmxpbmUgaW50IG1tdV9nZXRfdHNpemUoaW50IHBzaXplKQogewogCXJldHVybiBtbXVfcHNpemVfZGVmc1twc2l6ZV0uZW5jOwpAQCAtODcsNyArMTI1LDcgQEAKIAkvKiBUaGlzIGlzbid0IHVzZWQgb24gIUJvb2szRSBmb3Igbm93ICovCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRV9NTVUgKi8KIAogLyogVGhlIHZhcmlhYmxlcyBiZWxvdyBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCBvbiA2NC1iaXQgQm9vazNFCiAgKiB0aG91Z2ggdGhpcyB3aWxsIHByb2JhYmx5IGJlIG1hZGUgY29tbW9uIHdpdGggb3RoZXIgbm9oYXNoCkBAIC0yNjYsNiArMzA0LDExIEBACiAKIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQogeworI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCWZsdXNoX2h1Z2V0bGJfcGFnZSh2bWEsIHZtYWRkcik7CisjZW5kaWYKKwogCV9fZmx1c2hfdGxiX3BhZ2Uodm1hID8gdm1hLT52bV9tbSA6IE5VTEwsIHZtYWRkciwKIAkJCSBtbXVfZ2V0X3RzaXplKG1tdV92aXJ0dWFsX3BzaXplKSwgMCk7CiB9CkBAIC02MDAsMTMgKzY0MywyOCBAQAogdm9pZCBzZXR1cF9pbml0aWFsX21lbW9yeV9saW1pdChwaHlzX2FkZHJfdCBmaXJzdF9tZW1ibG9ja19iYXNlLAogCQkJCXBoeXNfYWRkcl90IGZpcnN0X21lbWJsb2NrX3NpemUpCiB7Ci0JLyogT24gRW1iZWRkZWQgNjQtYml0LCB3ZSBhZGp1c3QgdGhlIFJNQSBzaXplIHRvIG1hdGNoCisJLyogT24gbm9uLUZTTCBFbWJlZGRlZCA2NC1iaXQsIHdlIGFkanVzdCB0aGUgUk1BIHNpemUgdG8gbWF0Y2gKIAkgKiB0aGUgYm9sdGVkIFRMQiBlbnRyeS4gV2Uga25vdyBmb3Igbm93IHRoYXQgb25seSAxRwogCSAqIGVudHJpZXMgYXJlIHN1cHBvcnRlZCB0aG91Z2ggdGhhdCBtYXkgZXZlbnR1YWxseQotCSAqIGNoYW5nZS4gV2UgY3JvcCBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgTUVNQkxPQ0sgdG8KKwkgKiBjaGFuZ2UuCisJICoKKwkgKiBvbiBGU0wgRW1iZWRkZWQgNjQtYml0LCB3ZSBhZGp1c3QgdGhlIFJNQSBzaXplIHRvIG1hdGNoIHRoZQorCSAqIGZpcnN0IGJvbHRlZCBUTEIgZW50cnkgc2l6ZS4gIFdlIHN0aWxsIGxpbWl0IG1heCB0byAxRyBldmVuIGlmCisJICogdGhlIFRMQiBjb3VsZCBjb3ZlciBtb3JlLiAgVGhpcyBpcyBkdWUgdG8gd2hhdCB0aGUgZWFybHkgaW5pdAorCSAqIGNvZGUgaXMgc2V0dXAgdG8gZG8uCisJICoKKwkgKiBXZSBjcm9wIGl0IHRvIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBNRU1CTE9DSyB0bwogCSAqIGF2b2lkIGdvaW5nIG92ZXIgdG90YWwgYXZhaWxhYmxlIG1lbW9yeSBqdXN0IGluIGNhc2UuLi4KIAkgKi8KLQlwcGM2NF9ybWFfc2l6ZSA9IG1pbl90KHU2NCwgZmlyc3RfbWVtYmxvY2tfc2l6ZSwgMHg0MDAwMDAwMCk7CisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCisJaWYgKG1tdV9oYXNfZmVhdHVyZShNTVVfRlRSX1RZUEVfRlNMX0UpKSB7CisJCXVuc2lnbmVkIGxvbmcgbGluZWFyX3N6OworCQlsaW5lYXJfc3ogPSBjYWxjX2NhbV9zeihmaXJzdF9tZW1ibG9ja19zaXplLCBQQUdFX09GRlNFVCwKKwkJCQkJZmlyc3RfbWVtYmxvY2tfYmFzZSk7CisJCXBwYzY0X3JtYV9zaXplID0gbWluX3QodTY0LCBsaW5lYXJfc3osIDB4NDAwMDAwMDApOworCX0gZWxzZQorI2VuZGlmCisJCXBwYzY0X3JtYV9zaXplID0gbWluX3QodTY0LCBmaXJzdF9tZW1ibG9ja19zaXplLCAweDQwMDAwMDAwKTsKIAogCS8qIEZpbmFsbHkgbGltaXQgc3Vic2VxdWVudCBhbGxvY2F0aW9ucyAqLwogCW1lbWJsb2NrX3NldF9jdXJyZW50X2xpbWl0KGZpcnN0X21lbWJsb2NrX2Jhc2UgKyBwcGM2NF9ybWFfc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZwppbmRleCBiNWQ4NzA2Li4xNTMwMjI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcKQEAgLTMyLDE0ICszMiw2IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRVA0MDUvRVA0MDVQQyBib2FyZHMuCiAKLWNvbmZpZyBIQ1U0Ci0JYm9vbCAiSGN1NCIKLQlkZXBlbmRzIG9uIDQweAotCWRlZmF1bHQgbgotCXNlbGVjdCA0MDVHUFIKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBOZXN0YWwgTWFzY2hpbmVuIEhDVTQgYm9hcmQuCi0KIGNvbmZpZyBIT1RGT09UCiAgICAgICAgIGJvb2wgIkhvdGZvb3QiCiAJZGVwZW5kcyBvbiA0MHgKQEAgLTExNSwxMSArMTA3LDYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBzaW1wbGUgUG93ZXJQQyA0MHggcGxhdGZvcm0gc3VwcG9ydC4KIAotIyA0MHggc3BlY2lmaWMgQ1BVIG1vZHVsZXMsIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBib2FyZCBhYm92ZS4KLWNvbmZpZyBOUDQwNUgKLQlib29sCi0JI2RlcGVuZHMgb24gQVNICi0KICMgT0FLIGRvZXNuJ3QgZXhpc3QgYnV0IHdhbnRlZCB0byBrZWVwIHRoaXMgYXJvdW5kIGZvciBhbnkgZnV0dXJlIDQwM0dDWCBib2FyZHMKIGNvbmZpZyA0MDNHQ1gKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L01ha2VmaWxlCmluZGV4IDU2ZTg5MDAuLjg4YzIyZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L01ha2VmaWxlCkBAIC0xLDQgKzEsMyBAQAotb2JqLSQoQ09ORklHX0hDVTQpCQkJCSs9IGhjdTQubwogb2JqLSQoQ09ORklHX1dBTE5VVCkJCQkJKz0gd2FsbnV0Lm8KIG9iai0kKENPTkZJR19YSUxJTlhfVklSVEVYX0dFTkVSSUNfQk9BUkQpCSs9IHZpcnRleC5vCiBvYmotJChDT05GSUdfRVA0MDUpCQkJCSs9IGVwNDA1Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L2hjdTQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L2hjdTQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMmFmZS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9oY3U0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQXJjaGl0ZWN0dXJlLSAvIHBsYXRmb3JtLXNwZWNpZmljIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvcgotICogSUJNIFBvd2VyUEMgNHh4IGJhc2VkIGJvYXJkcy4gQWRhcHRlZCBmcm9tIG9yaWdpbmFsCi0gKiBjb2RlIGJ5IEdhcnkgVGhvbWFzLCBDb3J0IERvdWdhbiA8Y29ydEBmc21sYWJzLmNvbT4sIGFuZCBEYW4gTWFsZWsKLSAqIDxkYW5AbmV0NHguY29tPi4KLSAqCi0gKiBDb3B5cmlnaHQoYykgMTk5OS0yMDAwIEdyYW50IEVyaWNrc29uIDxncmFudEBsY3NlLnVtbi5lZHU+Ci0gKgotICogUmV3cml0dGVuIGFuZCBwb3J0ZWQgdG8gdGhlIG1lcmdlZCBwb3dlcnBjIHRyZWU6Ci0gKiBDb3B5cmlnaHQgMjAwNyBJQk0gQ29ycG9yYXRpb24KLSAqIEpvc2ggQm95ZXIgPGp3Ym95ZXJAbGludXgudm5ldC5pYm0uY29tPgotICoKLSAqIDIwMDIgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vdWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYzR4eC5oPgotCi1zdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhjdTRfb2ZfYnVzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiMyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImlibSxlYmMiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaGN1NF9kZXZpY2VfcHJvYmUodm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgaGN1NF9vZl9idXMsIE5VTEwpOwotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoaGN1NCwgaGN1NF9kZXZpY2VfcHJvYmUpOwotCi1zdGF0aWMgaW50IF9faW5pdCBoY3U0X3Byb2JlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIm5ldHN0YWwsaGN1NCIpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1kZWZpbmVfbWFjaGluZShoY3U0KSB7Ci0JLm5hbWUJCQk9ICJIQ1U0IiwKLQkucHJvYmUJCQk9IGhjdTRfcHJvYmUsCi0JLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCi0JLmluaXRfSVJRCQk9IHVpY19pbml0X3RyZWUsCi0JLmdldF9pcnEJCT0gdWljX2dldF9pcnEsCi0JLnJlc3RhcnQJCT0gcHBjNHh4X3Jlc2V0X3N5c3RlbSwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMKaW5kZXggOGY3NzEzOS4uNGNmYTQ5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvd2FycC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCmluZGV4IDI3YjA2NTEuLmIzZWJjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCXNlbGVjdCBQUENfQ0xPQ0sKIAlzZWxlY3QgUFBDX1BDSV9DSE9JQ0UKIAlzZWxlY3QgRlNMX1BDSSBpZiBQQ0kKKwlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAogY29uZmlnIE1QQzUxMjFfQURTCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzUxMjFFIEFEUyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9jbG9jay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMKaW5kZXggM2RjMmE4ZC4uMWQ4NzAwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfc2hhcmVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwppbmRleCBlNDFlYmJkLi5jZmU5NThlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9zaGFyZWQuYwpAQCAtNjYsOCArNjYsOCBAQAogCWJvb2wJCWluX3VzZTsKIH07CiAKLXVuc2lnbmVkIGludCBtcGM1MTJ4X2dldF9waXhlbF9mb3JtYXQodW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsLAotCQkJCSAgICAgIGludCBtb25pdG9yX3BvcnQpCit1MzIgbXBjNTEyeF9nZXRfcGl4ZWxfZm9ybWF0KGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsKQogewogCXN3aXRjaCAoYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDMyOgpAQCAtODAsMTEgKzgwLDEyIEBACiAJcmV0dXJuIDB4MDAwMDA0MDA7CiB9CiAKLXZvaWQgbXBjNTEyeF9zZXRfZ2FtbWFfdGFibGUoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqZ2FtbWFfdGFibGVfYmFzZSkKK3ZvaWQgbXBjNTEyeF9zZXRfZ2FtbWFfdGFibGUoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQkJICAgICBjaGFyICpnYW1tYV90YWJsZV9iYXNlKQogewogfQogCi12b2lkIG1wYzUxMnhfc2V0X21vbml0b3JfcG9ydChpbnQgbW9uaXRvcl9wb3J0KQordm9pZCBtcGM1MTJ4X3NldF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewogfQogCkBAIC0xODIsMTQgKzE4MywxMCBAQAogCWlvdW5tYXAoY2NtKTsKIH0KIAotc3NpemVfdCBtcGM1MTJ4X3Nob3dfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmJ1ZikKK2VudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQKK21wYzUxMnhfdmFsaWRfbW9uaXRvcl9wb3J0KGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCkKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gNTEyMSBMQ0RcbiIpOwotfQotCi1pbnQgbXBjNTEyeF9zZXRfc3lzZnNfbW9uaXRvcl9wb3J0KGludCB2YWwpCi17Ci0JcmV0dXJuIDA7CisJcmV0dXJuIEZTTF9ESVVfUE9SVF9EVkk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnNsX2RpdV9zaGFyZWRfZmIgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDgpKSkgZGl1X3NoYXJlZF9mYjsKQEAgLTI1Niw3ICsyNTMsNyBAQAogCX0KIAogCW1vZGUgPSBpbl9iZTMyKCZkaXVfcmVnLT5kaXVfbW9kZSk7Ci0JaWYgKG1vZGUgIT0gTUZCX01PREUxKSB7CisJaWYgKG1vZGUgPT0gTUZCX01PREUwKSB7CiAJCXByX2luZm8oIiVzOiBESVUgT0ZGXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMzMiw4ICszMjksNyBAQAogCWRpdV9vcHMuc2V0X2dhbW1hX3RhYmxlCQk9IG1wYzUxMnhfc2V0X2dhbW1hX3RhYmxlOwogCWRpdV9vcHMuc2V0X21vbml0b3JfcG9ydAk9IG1wYzUxMnhfc2V0X21vbml0b3JfcG9ydDsKIAlkaXVfb3BzLnNldF9waXhlbF9jbG9jawkJPSBtcGM1MTJ4X3NldF9waXhlbF9jbG9jazsKLQlkaXVfb3BzLnNob3dfbW9uaXRvcl9wb3J0CT0gbXBjNTEyeF9zaG93X21vbml0b3JfcG9ydDsKLQlkaXVfb3BzLnNldF9zeXNmc19tb25pdG9yX3BvcnQJPSBtcGM1MTJ4X3NldF9zeXNmc19tb25pdG9yX3BvcnQ7CisJZGl1X29wcy52YWxpZF9tb25pdG9yX3BvcnQJPSBtcGM1MTJ4X3ZhbGlkX21vbml0b3JfcG9ydDsKIAlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbQkJPSBtcGM1MTJ4X3JlbGVhc2VfYm9vdG1lbTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyMDBfc2ltcGxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYwppbmRleCBlMzZkNmUyLi44NDZiNzg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYwpAQCAtNTAsNiArNTAsNyBAQAogCiAvKiBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgYm9hcmRzICovCiBzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJhbm9uLGNoYXJvbiIsCiAJImludGVyY29udHJvbCxkaWdzeS1tdGMiLAogCSJtYW5yb2xhbmQsbXVjbWM1MiIsCiAJIm1hbnJvbGFuZCx1YzEwMSIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCmluZGV4IDQxZjNhN2UuLjM2OWZkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9ncHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jCmluZGV4IDZjMzliOWMuLmY5NGYwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwdC5jCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2xwYmZpZm8uYwppbmRleCA5OTQwY2U4Li5kNjFmYjFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9scGJmaWZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfbHBiZmlmby5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L2ttODJ4eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L2ttODJ4eC5jCmluZGV4IDQyOGM1ZTAuLjM2NjFiY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9rbTgyeHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgva204Mnh4LmMKQEAgLTQ5LDYgKzQ5LDkgQEAKIH07CiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBjcG1fcGluIGttODJ4eF9waW5zW10gPSB7CisJLyogU01DMSAqLworCXsyLCA0LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKKwl7MiwgNSwgQ1BNX1BJTl9PVVRQVVQgfCBDUE1fUElOX1BSSU1BUll9LAogCiAJLyogU01DMiAqLwogCXswLCA4LCBDUE1fUElOX0lOUFVUIHwgQ1BNX1BJTl9QUklNQVJZfSwKQEAgLTEzNyw2ICsxNDAsNyBAQAogCX0KIAogCWNwbTJfc21jX2Nsa19zZXR1cChDUE1fQ0xLX1NNQzIsIENQTV9CUkc4KTsKKwljcG0yX3NtY19jbGtfc2V0dXAoQ1BNX0NMS19TTUMxLCBDUE1fQlJHNyk7CiAJY3BtMl9jbGtfc2V0dXAoQ1BNX0NMS19TQ0MxLCBDUE1fQ0xLMTEsIENQTV9DTEtfUlgpOwogCWNwbTJfY2xrX3NldHVwKENQTV9DTEtfU0NDMSwgQ1BNX0NMSzExLCBDUE1fQ0xLX1RYKTsKIAljcG0yX2Nsa19zZXR1cChDUE1fQ0xLX1NDQzMsIENQTV9DTEs1LCBDUE1fQ0xLX1JUWCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCmluZGV4IDczZjQxMzVmLi42NzBhMDMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpAQCAtMTE0LDE4ICsxMTQsMjEgQEAKIAogZW5kaWYKIAotIyB1c2VkIGZvciB1c2IKKyMgdXNlZCBmb3IgdXNiICYgZ3BpbwogY29uZmlnIFBQQ19NUEM4MzF4CiAJYm9vbAorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCiAjIHVzZWQgZm9yIG1hdGgtZW11CiBjb25maWcgUFBDX01QQzgzMngKIAlib29sCiAKLSMgdXNlZCBmb3IgdXNiCisjIHVzZWQgZm9yIHVzYiAmIGdwaW8KIGNvbmZpZyBQUENfTVBDODM0eAogCWJvb2wKKwlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAotIyB1c2VkIGZvciB1c2IKKyMgdXNlZCBmb3IgdXNiICYgZ3BpbwogY29uZmlnIFBQQ19NUEM4Mzd4CiAJYm9vbAorCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKaW5kZXggNzA3OThhYy4uZWY2NTM3YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAKQEAgLTMwLDYgKzMyLDcgQEAKICAqLwogI2RlZmluZSBNQ1VfUkVHX0NUUkwJMHgyMAogI2RlZmluZSBNQ1VfQ1RSTF9QT0ZGCTB4NDAKKyNkZWZpbmUgTUNVX0NUUkxfQlROCTB4ODAKIAogI2RlZmluZSBNQ1VfTlVNX0dQSU8JMgogCkBAIC00MiwxMyArNDUsNTUgQEAKIAogc3RhdGljIHN0cnVjdCBtY3UgKmdsb2JfbWN1OwogCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNodXRkb3duX3RocmVhZDsKK3N0YXRpYyBpbnQgc2h1dGRvd25fdGhyZWFkX2ZuKHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbWN1ICptY3UgPSBnbG9iX21jdTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShtY3UtPmNsaWVudCwgTUNVX1JFR19DVFJMKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIk1DVSBzdGF0dXMgcmVnIHJlYWQgZmFpbGVkLlxuIik7CisJCW1jdS0+cmVnX2N0cmwgPSByZXQ7CisKKworCQlpZiAobWN1LT5yZWdfY3RybCAmIE1DVV9DVFJMX0JUTikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShtY3UtPmNsaWVudCwgTUNVX1JFR19DVFJMLAorCQkJCQkJICBtY3UtPnJlZ19jdHJsICYgfk1DVV9DVFJMX0JUTik7CisKKwkJCWN0cmxfYWx0X2RlbCgpOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IG1jdSAqbWN1ID0gZ2xvYl9tY3U7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobWN1LT5jbGllbnQsIE1DVV9SRUdfQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOworCW1jdS0+cmVnX2N0cmwgPSByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlMDJ4XG4iLCByZXQpOworfQorc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgU19JUlVHTywgc2hvd19zdGF0dXMsIE5VTEwpOworCiBzdGF0aWMgdm9pZCBtY3VfcG93ZXJfb2ZmKHZvaWQpCiB7CiAJc3RydWN0IG1jdSAqbWN1ID0gZ2xvYl9tY3U7CiAKIAlwcl9pbmZvKCJTZW5kaW5nIHBvd2VyLW9mZiByZXF1ZXN0IHRvIHRoZSBNQ1UuLi5cbiIpOwogCW11dGV4X2xvY2soJm1jdS0+bG9jayk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShnbG9iX21jdS0+Y2xpZW50LCBNQ1VfUkVHX0NUUkwsCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShtY3UtPmNsaWVudCwgTUNVX1JFR19DVFJMLAogCQkJCSAgbWN1LT5yZWdfY3RybCB8IE1DVV9DVFJMX1BPRkYpOwogCW11dGV4X3VubG9jaygmbWN1LT5sb2NrKTsKIH0KQEAgLTEzMCw2ICsxNzUsMTMgQEAKIAkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAid2lsbCBwcm92aWRlIHBvd2VyLW9mZiBzZXJ2aWNlXG4iKTsKIAl9CiAKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3N0YXR1cykpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJImNvdWxkbid0IGNyZWF0ZSBkZXZpY2UgZmlsZSBmb3Igc3RhdHVzXG4iKTsKKworCXNodXRkb3duX3RocmVhZCA9IGt0aHJlYWRfcnVuKHNodXRkb3duX3RocmVhZF9mbiwgTlVMTCwKKwkJCQkgICAgICAibWN1LWkyYy1zaGRuIik7CisKIAlyZXR1cm4gMDsKIGVycjoKIAlrZnJlZShtY3UpOwpAQCAtMTQxLDYgKzE5MywxMCBAQAogCXN0cnVjdCBtY3UgKm1jdSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCByZXQ7CiAKKwlrdGhyZWFkX3N0b3Aoc2h1dGRvd25fdGhyZWFkKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9zdGF0dXMpOworCiAJaWYgKGdsb2JfbWN1ID09IG1jdSkgewogCQlwcGNfbWQucG93ZXJfb2ZmID0gTlVMTDsKIAkJZ2xvYl9tY3UgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKaW5kZXggMTA0ZmFhOC4uZWRmNjY4NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKaW5kZXggMTJmNTkzMi4uNDUwMjNlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKQEAgLTE3MSwxNyArMTcxLDE4IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgV2luZCBSaXZlciBTQkM4NTYwIGJvYXJkCiAKLWNvbmZpZyBQMjA0MF9SREIKLQlib29sICJGcmVlc2NhbGUgUDIwNDAgUkRCIgorY29uZmlnIFAyMDQxX1JEQgorCWJvb2wgIkZyZWVzY2FsZSBQMjA0MSBSREIiCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCiAJc2VsZWN0IFBQQ19FNTAwTUMKIAlzZWxlY3QgUEhZU182NEJJVAogCXNlbGVjdCBTV0lPVExCCi0Jc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPX01QQzhYWFgKIAlzZWxlY3QgSEFTX1JBUElESU8KIAlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQwogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFAyMDQwIFJEQiBib2FyZAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUDIwNDEgUkRCIGJvYXJkCiAKIGNvbmZpZyBQMzA0MV9EUwogCWJvb2wgIkZyZWVzY2FsZSBQMzA0MSBEUyIKQEAgLTE4OSwxOSArMTkwLDMzIEBACiAJc2VsZWN0IFBQQ19FNTAwTUMKIAlzZWxlY3QgUEhZU182NEJJVAogCXNlbGVjdCBTV0lPVExCCi0Jc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPX01QQzhYWFgKIAlzZWxlY3QgSEFTX1JBUElESU8KIAlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFAzMDQxIERTIGJvYXJkCiAKK2NvbmZpZyBQMzA2MF9RRFMKKwlib29sICJGcmVlc2NhbGUgUDMwNjAgUURTIgorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCXNlbGVjdCBQUENfRTUwME1DCisJc2VsZWN0IFBIWVNfNjRCSVQKKwlzZWxlY3QgU1dJT1RMQgorCXNlbGVjdCBNUEM4eHh4X0dQSU8KKwlzZWxlY3QgSEFTX1JBUElESU8KKwlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFAzMDYwIFFEUyBib2FyZAorCiBjb25maWcgUDQwODBfRFMKIAlib29sICJGcmVlc2NhbGUgUDQwODAgRFMiCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCiAJc2VsZWN0IFBQQ19FNTAwTUMKIAlzZWxlY3QgUEhZU182NEJJVAogCXNlbGVjdCBTV0lPVExCCi0Jc2VsZWN0IE1QQzh4eHhfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPX01QQzhYWFgKIAlzZWxlY3QgSEFTX1JBUElESU8KIAlzZWxlY3QgUFBDX0VQQVBSX0hWX1BJQwogCWhlbHAKQEAgLTIxNiw3ICsyMzEsOCBAQAogCXNlbGVjdCBQUENfRTUwME1DCiAJc2VsZWN0IFBIWVNfNjRCSVQKIAlzZWxlY3QgU1dJT1RMQgotCXNlbGVjdCBNUEM4eHh4X0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlzZWxlY3QgR1BJT19NUEM4WFhYCiAJc2VsZWN0IEhBU19SQVBJRElPCiAJc2VsZWN0IFBQQ19FUEFQUl9IVl9QSUMKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKaW5kZXggYTk3MWIzMi4uYmM1YWNiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQpAQCAtMTMsOCArMTMsOSBAQAogb2JqLSQoQ09ORklHX1AxMDEwX1JEQikgICArPSBwMTAxMHJkYi5vCiBvYmotJChDT05GSUdfUDEwMjJfRFMpICAgICs9IHAxMDIyX2RzLm8KIG9iai0kKENPTkZJR19QMTAyM19SRFMpICAgKz0gcDEwMjNfcmRzLm8KLW9iai0kKENPTkZJR19QMjA0MF9SREIpICAgKz0gcDIwNDBfcmRiLm8gY29yZW5ldF9kcy5vCitvYmotJChDT05GSUdfUDIwNDFfUkRCKSAgICs9IHAyMDQxX3JkYi5vIGNvcmVuZXRfZHMubwogb2JqLSQoQ09ORklHX1AzMDQxX0RTKSAgICArPSBwMzA0MV9kcy5vIGNvcmVuZXRfZHMubworb2JqLSQoQ09ORklHX1AzMDYwX1FEUykgICArPSBwMzA2MF9xZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19QNDA4MF9EUykgICAgKz0gcDQwODBfZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19QNTAyMF9EUykgICAgKz0gcDUwMjBfZHMubyBjb3JlbmV0X2RzLm8KIG9iai0kKENPTkZJR19TVFhfR1AzKQkgICs9IHN0eF9ncDMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwppbmRleCAyYmY5OTc4Li42NmNiOGQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCmluZGV4IDk3M2IzZjQuLmEyM2EzZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKaW5kZXggMjY2YjNhYS4uZmRhMTU3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKQEAgLTkzLDggKzkzLDggQEAKICAqIFRoZSBBcmVhIERlc2NyaXB0b3IgaXMgYSAzMi1iaXQgdmFsdWUgdGhhdCBkZXRlcm1pbmUgd2hpY2ggYml0cyBpbiBlYWNoCiAgKiBwaXhlbCBhcmUgdG8gYmUgdXNlZCBmb3IgZWFjaCBjb2xvci4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwMTAyMmRzX2dldF9waXhlbF9mb3JtYXQodW5zaWduZWQgaW50IGJpdHNfcGVyX3BpeGVsLAotCWludCBtb25pdG9yX3BvcnQpCitzdGF0aWMgdTMyIHAxMDIyZHNfZ2V0X3BpeGVsX2Zvcm1hdChlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCQkJICAgIHVuc2lnbmVkIGludCBiaXRzX3Blcl9waXhlbCkKIHsKIAlzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSAzMjoKQEAgLTExOCw3ICsxMTgsOCBAQAogICogT24gc29tZSBib2FyZHMsIHRoZSBnYW1tYSB0YWJsZSBmb3Igc29tZSBwb3J0cyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KICAqIFRoaXMgaXMgbm90IHRoZSBjYXNlIG9uIHRoZSBQMTAyMkRTLCBzbyB3ZSBkbyBub3RoaW5nLgogKi8KLXN0YXRpYyB2b2lkIHAxMDIyZHNfc2V0X2dhbW1hX3RhYmxlKGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpCitzdGF0aWMgdm9pZCBwMTAyMmRzX3NldF9nYW1tYV90YWJsZShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQsCisJCQkJICAgIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpCiB7CiB9CiAKQEAgLTEyNiwzOCArMTI3LDQzIEBACiAgKiBwMTAyMmRzX3NldF9tb25pdG9yX3BvcnQ6IHN3aXRjaCB0aGUgb3V0cHV0IHRvIGEgZGlmZmVyZW50IG1vbml0b3IgcG9ydAogICoKICAqLwotc3RhdGljIHZvaWQgcDEwMjJkc19zZXRfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQpCitzdGF0aWMgdm9pZCBwMTAyMmRzX3NldF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGl4aXNfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXZvaWQgX19pb21lbSAqcGl4aXM7CiAJdTggX19pb21lbSAqYnJkY2ZnMTsKIAotCXBpeGlzX25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHAxMDIyZHMtcGl4aXMiKTsKLQlpZiAoIXBpeGlzX25vZGUpIHsKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscDEwMjJkcy1mcGdhIik7CisJaWYgKCFucCkKKwkJLyogb2xkZXIgZGV2aWNlIHRyZWVzIHVzZWQgImZzbCxwMTAyMmRzLXBpeGlzIiAqLworCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscDEwMjJkcy1waXhpcyIpOworCWlmICghbnApIHsKIAkJcHJfZXJyKCJwMTAyMmRzOiBtaXNzaW5nIG5nUElYSVMgbm9kZVxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlwaXhpcyA9IG9mX2lvbWFwKHBpeGlzX25vZGUsIDApOworCXBpeGlzID0gb2ZfaW9tYXAobnAsIDApOwogCWlmICghcGl4aXMpIHsKIAkJcHJfZXJyKCJwMTAyMmRzOiBjb3VsZCBub3QgbWFwIG5nUElYSVMgcmVnaXN0ZXJzXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlicmRjZmcxID0gcGl4aXMgKyA5OwkvKiBCUkRDRkcxIGlzIGF0IG9mZnNldCA5IGluIHRoZSBuZ1BJWElTICovCiAKLQlzd2l0Y2ggKG1vbml0b3JfcG9ydCkgewotCWNhc2UgMDogLyogRFZJICovCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSBGU0xfRElVX1BPUlRfRFZJOgorCQlwcmludGsoS0VSTl9JTkZPICIlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJLyogRW5hYmxlIHRoZSBEVkkgcG9ydCwgZGlzYWJsZSB0aGUgREZQIGFuZCB0aGUgYmFja2xpZ2h0ICovCiAJCWNscnNldGJpdHNfOChicmRjZmcxLCBQWF9CUkRDRkcxX0RGUEVOIHwgUFhfQlJEQ0ZHMV9CQUNLTElHSFQsCiAJCQkgICAgIFBYX0JSRENGRzFfRFZJRU4pOwogCQlicmVhazsKLQljYXNlIDE6IC8qIFNpbmdsZSBsaW5rIExWRFMgKi8KKwljYXNlIEZTTF9ESVVfUE9SVF9MVkRTOgorCQlwcmludGsoS0VSTl9JTkZPICIlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJLyogRW5hYmxlIHRoZSBERlAgcG9ydCwgZGlzYWJsZSB0aGUgRFZJIGFuZCB0aGUgYmFja2xpZ2h0ICovCiAJCWNscnNldGJpdHNfOChicmRjZmcxLCBQWF9CUkRDRkcxX0RWSUVOIHwgUFhfQlJEQ0ZHMV9CQUNLTElHSFQsCiAJCQkgICAgIFBYX0JSRENGRzFfREZQRU4pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInAxMDIyZHM6IHVuc3VwcG9ydGVkIG1vbml0b3IgcG9ydCAlaVxuIiwgbW9uaXRvcl9wb3J0KTsKKwkJcHJfZXJyKCJwMTAyMmRzOiB1bnN1cHBvcnRlZCBtb25pdG9yIHBvcnQgJWlcbiIsIHBvcnQpOwogCX0KIAogCWlvdW5tYXAocGl4aXMpOwpAQCAtMjE0LDIzICsyMjAsMTggQEAKIH0KIAogLyoqCi0gKiBwMTAyMmRzX3Nob3dfbW9uaXRvcl9wb3J0OiBzaG93IHRoZSBjdXJyZW50IG1vbml0b3IKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjdXJyZW50IG1vbml0b3IgaXMKLSAqIHNldCB0byBEVkkgb3IgTFZEUy4KKyAqIHAxMDIyZHNfdmFsaWRfbW9uaXRvcl9wb3J0OiBzZXQgdGhlIG1vbml0b3IgcG9ydCBmb3Igc3lzZnMKICAqLwotc3NpemVfdCBwMTAyMmRzX3Nob3dfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmJ1ZikKK2VudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQKK3AxMDIyZHNfdmFsaWRfbW9uaXRvcl9wb3J0KGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCkKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlYzAgLSBEVklcbiVjMSAtIFNpbmdsZSBsaW5rIExWRFNcbiIsCi0JCW1vbml0b3JfcG9ydCA9PSAwID8gJyonIDogJyAnLCBtb25pdG9yX3BvcnQgPT0gMSA/ICcqJyA6ICcgJyk7Ci19Ci0KLS8qKgotICogcDEwMjJkc19zZXRfc3lzZnNfbW9uaXRvcl9wb3J0OiBzZXQgdGhlIG1vbml0b3IgcG9ydCBmb3Igc3lzZnMKLSAqLwotaW50IHAxMDIyZHNfc2V0X3N5c2ZzX21vbml0b3JfcG9ydChpbnQgdmFsKQotewotCXJldHVybiB2YWwgPCAyID8gdmFsIDogMDsKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIEZTTF9ESVVfUE9SVF9EVkk6CisJY2FzZSBGU0xfRElVX1BPUlRfTFZEUzoKKwkJcmV0dXJuIHBvcnQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEZTTF9ESVVfUE9SVF9EVkk7IC8qIER1YWwtbGluayBMVkRTIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwl9CiB9CiAKICNlbmRpZgpAQCAtMzA1LDggKzMwNiw3IEBACiAJZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUJCT0gcDEwMjJkc19zZXRfZ2FtbWFfdGFibGU7CiAJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0CT0gcDEwMjJkc19zZXRfbW9uaXRvcl9wb3J0OwogCWRpdV9vcHMuc2V0X3BpeGVsX2Nsb2NrCQk9IHAxMDIyZHNfc2V0X3BpeGVsX2Nsb2NrOwotCWRpdV9vcHMuc2hvd19tb25pdG9yX3BvcnQJPSBwMTAyMmRzX3Nob3dfbW9uaXRvcl9wb3J0OwotCWRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydAk9IHAxMDIyZHNfc2V0X3N5c2ZzX21vbml0b3JfcG9ydDsKKwlkaXVfb3BzLnZhbGlkX21vbml0b3JfcG9ydAk9IHAxMDIyZHNfdmFsaWRfbW9uaXRvcl9wb3J0OwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDBfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDBfcmRiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjU2YWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AyMDQwX3JkYi5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIFAyMDQwIFJEQiBTZXR1cAotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS9tcGljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KLSNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgotCi0jaW5jbHVkZSAiY29yZW5ldF9kcy5oIgotCi0vKgotICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHAyMDQwX3JkYl9wcm9iZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLSNpZmRlZiBDT05GSUdfU01QCi0JZXh0ZXJuIHN0cnVjdCBzbXBfb3BzX3Qgc21wXzg1eHhfb3BzOwotI2VuZGlmCi0KLQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDIwNDBSREIiKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLwotCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQMjA0MFJEQi1odiIpKSB7Ci0JCXBwY19tZC5pbml0X0lSUSA9IGVodl9waWNfaW5pdDsKLQkJcHBjX21kLmdldF9pcnEgPSBlaHZfcGljX2dldF9pcnE7Ci0JCXBwY19tZC5yZXN0YXJ0ID0gZnNsX2h2X3Jlc3RhcnQ7Ci0JCXBwY19tZC5wb3dlcl9vZmYgPSBmc2xfaHZfaGFsdDsKLQkJcHBjX21kLmhhbHQgPSBmc2xfaHZfaGFsdDsKLSNpZmRlZiBDT05GSUdfU01QCi0JCS8qCi0JCSAqIERpc2FibGUgdGhlIHRpbWViYXNlIHN5bmMgb3BlcmF0aW9ucyBiZWNhdXNlIHdlIGNhbid0IHdyaXRlCi0JCSAqIHRvIHRoZSB0aW1lYmFzZSByZWdpc3RlcnMgdW5kZXIgdGhlIGh5cGVydmlzb3IuCi0JCSAgKi8KLQkJc21wXzg1eHhfb3BzLmdpdmVfdGltZWJhc2UgPSBOVUxMOwotCQlzbXBfODV4eF9vcHMudGFrZV90aW1lYmFzZSA9IE5VTEw7Ci0jZW5kaWYKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWRlZmluZV9tYWNoaW5lKHAyMDQwX3JkYikgewotCS5uYW1lCQkJPSAiUDIwNDAgUkRCIiwKLQkucHJvYmUJCQk9IHAyMDQwX3JkYl9wcm9iZSwKLQkuc2V0dXBfYXJjaAkJPSBjb3JlbmV0X2RzX3NldHVwX2FyY2gsCi0JLmluaXRfSVJRCQk9IGNvcmVuZXRfZHNfcGljX2luaXQsCi0jaWZkZWYgQ09ORklHX1BDSQotCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKLSNlbmRpZgotCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2NvcmVpbnRfaXJxLAotCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAotCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAotCS5wb3dlcl9zYXZlCQk9IGU1MDBfaWRsZSwKLX07Ci0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAyMDQwX3JkYiwgY29yZW5ldF9kc19wdWJsaXNoX2RldmljZXMpOwotCi0jaWZkZWYgQ09ORklHX1NXSU9UTEIKLW1hY2hpbmVfYXJjaF9pbml0Y2FsbChwMjA0MF9yZGIsIHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AyMDQxX3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AyMDQxX3JkYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDIwNDFfcmRiLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFAyMDQxIFJEQiBTZXR1cAorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgorCisjaW5jbHVkZSAiY29yZW5ldF9kcy5oIgorCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHAyMDQxX3JkYl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKyNpZmRlZiBDT05GSUdfU01QCisJZXh0ZXJuIHN0cnVjdCBzbXBfb3BzX3Qgc21wXzg1eHhfb3BzOworI2VuZGlmCisKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDIwNDFSREIiKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciAqLworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxQMjA0MVJEQi1odiIpKSB7CisJCXBwY19tZC5pbml0X0lSUSA9IGVodl9waWNfaW5pdDsKKwkJcHBjX21kLmdldF9pcnEgPSBlaHZfcGljX2dldF9pcnE7CisJCXBwY19tZC5yZXN0YXJ0ID0gZnNsX2h2X3Jlc3RhcnQ7CisJCXBwY19tZC5wb3dlcl9vZmYgPSBmc2xfaHZfaGFsdDsKKwkJcHBjX21kLmhhbHQgPSBmc2xfaHZfaGFsdDsKKyNpZmRlZiBDT05GSUdfU01QCisJCS8qCisJCSAqIERpc2FibGUgdGhlIHRpbWViYXNlIHN5bmMgb3BlcmF0aW9ucyBiZWNhdXNlIHdlIGNhbid0IHdyaXRlCisJCSAqIHRvIHRoZSB0aW1lYmFzZSByZWdpc3RlcnMgdW5kZXIgdGhlIGh5cGVydmlzb3IuCisJCSAgKi8KKwkJc21wXzg1eHhfb3BzLmdpdmVfdGltZWJhc2UgPSBOVUxMOworCQlzbXBfODV4eF9vcHMudGFrZV90aW1lYmFzZSA9IE5VTEw7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2RlZmluZV9tYWNoaW5lKHAyMDQxX3JkYikgeworCS5uYW1lCQkJPSAiUDIwNDEgUkRCIiwKKwkucHJvYmUJCQk9IHAyMDQxX3JkYl9wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBjb3JlbmV0X2RzX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IGNvcmVuZXRfZHNfcGljX2luaXQsCisjaWZkZWYgQ09ORklHX1BDSQorCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKyNlbmRpZgorCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2NvcmVpbnRfaXJxLAorCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorCS5wb3dlcl9zYXZlCQk9IGU1MDBfaWRsZSwKK307CisKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAyMDQxX3JkYiwgY29yZW5ldF9kc19wdWJsaXNoX2RldmljZXMpOworCisjaWZkZWYgQ09ORklHX1NXSU9UTEIKK21hY2hpbmVfYXJjaF9pbml0Y2FsbChwMjA0MV9yZGIsIHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AzMDYwX3Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AzMDYwX3Fkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGNmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDMwNjBfcWRzLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIFAzMDYwIFFEUyBTZXR1cAorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZWh2X3BpYy5oPgorI2luY2x1ZGUgImNvcmVuZXRfZHMuaCIKKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBwMzA2MF9xZHNfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisjaWZkZWYgQ09ORklHX1NNUAorCWV4dGVybiBzdHJ1Y3Qgc21wX29wc190IHNtcF84NXh4X29wczsKKyNlbmRpZgorCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLFAzMDYwUURTIikpCisJCXJldHVybiAxOworCisJLyogQ2hlY2sgaWYgd2UncmUgcnVubmluZyB1bmRlciB0aGUgRnJlZXNjYWxlIGh5cGVydmlzb3IgKi8KKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsUDMwNjBRRFMtaHYiKSkgeworCQlwcGNfbWQuaW5pdF9JUlEgPSBlaHZfcGljX2luaXQ7CisJCXBwY19tZC5nZXRfaXJxID0gZWh2X3BpY19nZXRfaXJxOworCQlwcGNfbWQucmVzdGFydCA9IGZzbF9odl9yZXN0YXJ0OworCQlwcGNfbWQucG93ZXJfb2ZmID0gZnNsX2h2X2hhbHQ7CisJCXBwY19tZC5oYWx0ID0gZnNsX2h2X2hhbHQ7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKgorCQkgKiBEaXNhYmxlIHRoZSB0aW1lYmFzZSBzeW5jIG9wZXJhdGlvbnMgYmVjYXVzZSB3ZSBjYW4ndCB3cml0ZQorCQkgKiB0byB0aGUgdGltZWJhc2UgcmVnaXN0ZXJzIHVuZGVyIHRoZSBoeXBlcnZpc29yLgorCQkgKi8KKwkJc21wXzg1eHhfb3BzLmdpdmVfdGltZWJhc2UgPSBOVUxMOworCQlzbXBfODV4eF9vcHMudGFrZV90aW1lYmFzZSA9IE5VTEw7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2RlZmluZV9tYWNoaW5lKHAzMDYwX3FkcykgeworCS5uYW1lCQkJPSAiUDMwNjAgUURTIiwKKwkucHJvYmUJCQk9IHAzMDYwX3Fkc19wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBjb3JlbmV0X2RzX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IGNvcmVuZXRfZHNfcGljX2luaXQsCisjaWZkZWYgQ09ORklHX1BDSQorCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKKyNlbmRpZgorCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2NvcmVpbnRfaXJxLAorCS5yZXN0YXJ0CQk9IGZzbF9yc3Rjcl9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorCS5wb3dlcl9zYXZlCQk9IGU1MDBfaWRsZSwKK307CisKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAzMDYwX3FkcywgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKworI2lmZGVmIENPTkZJR19TV0lPVExCCittYWNoaW5lX2FyY2hfaW5pdGNhbGwocDMwNjBfcWRzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jCmluZGV4IGQwN2RjYjcuLjE0NjMyYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwppbmRleCAwOWNlZDcyLi5jZWJkNzg2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKQEAgLTI4Myw3ICsyODMsNyBAQAogCiAJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJzYmM4NTYwOiBGb3VuZCBCUlNUQ1IgYXQgaS9vIDB4JXhcbiIsIHJlcy5zdGFydCk7CisJcHJpbnRrKEtFUk5fSU5GTyAic2JjODU2MDogRm91bmQgQlJTVENSIGF0ICVwUlxuIiwgJnJlcyk7CiAKIAlicnN0Y3IgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiAJaWYoIWJyc3RjcikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwppbmRleCA1YjliOTAxLi4yZGY0Nzg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCkBAIC00OCwxMCArNDgsMTEgQEAKIAljb25zdCB1NjQgKmNwdV9yZWxfYWRkcjsKIAlfX2lvbWVtIHUzMiAqYnB0cl92YWRkcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCWludCBuID0gMDsKKwlpbnQgbiA9IDAsIGh3X2NwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQobnIpOwogCWludCBpb3JlbWFwcGFibGU7CiAKLQlXQVJOX09OIChuciA8IDAgfHwgbnIgPj0gTlJfQ1BVUyk7CisJV0FSTl9PTihuciA8IDAgfHwgbnIgPj0gTlJfQ1BVUyk7CisJV0FSTl9PTihod19jcHUgPCAwIHx8IGh3X2NwdSA+PSBOUl9DUFVTKTsKIAogCXByX2RlYnVnKCJzbXBfODV4eF9raWNrX2NwdToga2ljayBDUFUgIyVkXG4iLCBucik7CiAKQEAgLTc5LDcgKzgwLDcgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCW91dF9iZTMyKGJwdHJfdmFkZHIgKyBCT09UX0VOVFJZX1BJUiwgbnIpOworCW91dF9iZTMyKGJwdHJfdmFkZHIgKyBCT09UX0VOVFJZX1BJUiwgaHdfY3B1KTsKICNpZmRlZiBDT05GSUdfUFBDMzIKIAlvdXRfYmUzMihicHRyX3ZhZGRyICsgQk9PVF9FTlRSWV9BRERSX0xPV0VSLCBfX3BhKF9fZWFybHlfc3RhcnQpKTsKIApAQCAtODgsNyArODksNyBAQAogCQkJCSh1bG9uZykoYnB0cl92YWRkciArIFNJWkVfQk9PVF9FTlRSWSkpOwogCiAJLyogV2FpdCBhIGJpdCBmb3IgdGhlIENQVSB0byBhY2suICovCi0Jd2hpbGUgKChfX3NlY29uZGFyeV9ob2xkX2Fja25vd2xlZGdlICE9IG5yKSAmJiAoKytuIDwgMTAwMCkpCisJd2hpbGUgKChfX3NlY29uZGFyeV9ob2xkX2Fja25vd2xlZGdlICE9IGh3X2NwdSkgJiYgKCsrbiA8IDEwMDApKQogCQltZGVsYXkoMSk7CiAjZWxzZQogCXNtcF9nZW5lcmljX2tpY2tfY3B1KG5yKTsKQEAgLTIwNiw3ICsyMDcsNyBAQAogCWlmICggIXRpbWVvdXQgKQogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBicmluZyBkb3duIHNlY29uZGFyeSBjcHUocykiKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fY3B1czsgaSsrKQorCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAl7CiAJCWlmICggaSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkgKSBjb250aW51ZTsKIAkJbXBpY19yZXNldF9jb3JlKGkpOwpAQCAtMjQzLDYgKzI0NCw3IEBACiAJCSAqIElmIGxlZnQgTlVMTCwgLm1lc3NhZ2VfcGFzcyBkZWZhdWx0cyB0bwogCQkgKiBzbXBfbXV4ZWRfaXBpX21lc3NhZ2VfcGFzcwogCQkgKi8KKwkJc21wXzg1eHhfb3BzLm1lc3NhZ2VfcGFzcyA9IE5VTEw7CiAJCXNtcF84NXh4X29wcy5jYXVzZV9pcGkgPSBkb29yYmVsbF9jYXVzZV9pcGk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCmluZGV4IGEwYjU2MzguLjhkNjU5OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCWRlcGVuZHMgb24gNnh4CiAJc2VsZWN0IEZTTF9TT0MKIAlzZWxlY3QgQUxUSVZFQworCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCWhlbHAKIAkgIFRoZSBGcmVlc2NhbGUgRTYwMCBTb0NzIGhhdmUgNzR4eCBjb3Jlcy4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L2dlZl9ncGlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYwppbmRleCA0ZmY3YjFlLi4yYTcwMzM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvZ2VmX2dwaW8uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIEdFRl9HUElPX0RJUkVDVAkJMHgwMAogI2RlZmluZSBHRUZfR1BJT19JTgkJMHgwNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2MTBfaHBjZC5jCmluZGV4IDc0ZTAxOGUuLjEzZmE5YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjEwX2hwY2QuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODYxMF9ocGNkLmMKQEAgLTE1MiwxMCArMTUyLDEwIEBACiAJKGMyIDw8IEFEX0NPTVBfMl9TSElGVCkgfCAoYzEgPDwgQURfQ09NUF8xX1NISUZUKSB8IFwKIAkoYzAgPDwgQURfQ09NUF8wX1NISUZUKSB8IChzaXplIDw8IEFEX1BJWEVMX1NfU0hJRlQpKQogCi11bnNpZ25lZCBpbnQgbXBjODYxMGhwY2RfZ2V0X3BpeGVsX2Zvcm1hdCh1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWwsCi0JCQkJCQlpbnQgbW9uaXRvcl9wb3J0KQordTMyIG1wYzg2MTBocGNkX2dldF9waXhlbF9mb3JtYXQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQkJCSB1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWwpCiB7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcGl4ZWxmb3JtYXRbXVszXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIHBpeGVsZm9ybWF0W11bM10gPSB7CiAJCXsKIAkJCU1BS0VfQUQoMywgMCwgMiwgMSwgMywgOCwgOCwgOCwgOCksCiAJCQlNQUtFX0FEKDQsIDIsIDAsIDEsIDIsIDgsIDgsIDgsIDApLApAQCAtMTcwLDcgKzE3MCw4IEBACiAJdW5zaWduZWQgaW50IGFyY2hfbW9uaXRvcjsKIAogCS8qIFRoZSBEVkkgcG9ydCBpcyBtaXMtd2lyZWQgb24gcmV2aXNpb24gMSBvZiB0aGlzIGJvYXJkLiAqLwotCWFyY2hfbW9uaXRvciA9ICgoKnBpeGlzX2FyY2ggPT0gMHgwMSkgJiYgKG1vbml0b3JfcG9ydCA9PSAwKSk/IDAgOiAxOworCWFyY2hfbW9uaXRvciA9CisJCSgoKnBpeGlzX2FyY2ggPT0gMHgwMSkgJiYgKHBvcnQgPT0gRlNMX0RJVV9QT1JUX0RWSSkpID8gMCA6IDE7CiAKIAlzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSAzMjoKQEAgLTE4NSwxMCArMTg2LDExIEBACiAJfQogfQogCi12b2lkIG1wYzg2MTBocGNkX3NldF9nYW1tYV90YWJsZShpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpnYW1tYV90YWJsZV9iYXNlKQordm9pZCBtcGM4NjEwaHBjZF9zZXRfZ2FtbWFfdGFibGUoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQkJCSBjaGFyICpnYW1tYV90YWJsZV9iYXNlKQogewogCWludCBpOwotCWlmIChtb25pdG9yX3BvcnQgPT0gMikgewkJLyogZHVhbCBsaW5rIExWRFMgKi8KKwlpZiAocG9ydCA9PSBGU0xfRElVX1BPUlRfRExWRFMpIHsKIAkJZm9yIChpID0gMDsgaSA8IDI1NiozOyBpKyspCiAJCQlnYW1tYV90YWJsZV9iYXNlW2ldID0gKGdhbW1hX3RhYmxlX2Jhc2VbaV0gPDwgMikgfAogCQkJCQkgKChnYW1tYV90YWJsZV9iYXNlW2ldID4+IDYpICYgMHgwMyk7CkBAIC0xOTksMTcgKzIwMSwyMSBAQAogI2RlZmluZSBQWF9CUkRDRkcwX0RMSU5LCSgxIDw8IDQpCiAjZGVmaW5lIFBYX0JSRENGRzBfRElVX01BU0sJKFBYX0JSRENGRzBfRFZJU0VMIHwgUFhfQlJEQ0ZHMF9ETElOSykKIAotdm9pZCBtcGM4NjEwaHBjZF9zZXRfbW9uaXRvcl9wb3J0KGludCBtb25pdG9yX3BvcnQpCit2b2lkIG1wYzg2MTBocGNkX3NldF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewotCXN0YXRpYyBjb25zdCB1OCBiZGNmZ1tdID0gewotCQlQWF9CUkRDRkcwX0RWSVNFTCB8IFBYX0JSRENGRzBfRExJTkssCi0JCVBYX0JSRENGRzBfRExJTkssCi0JCTAsCi0JfTsKLQotCWlmIChtb25pdG9yX3BvcnQgPCAzKQorCXN3aXRjaCAocG9ydCkgeworCWNhc2UgRlNMX0RJVV9QT1JUX0RWSToKIAkJY2xyc2V0Yml0c184KHBpeGlzX2JkY2ZnMCwgUFhfQlJEQ0ZHMF9ESVVfTUFTSywKLQkJCSAgICAgYmRjZmdbbW9uaXRvcl9wb3J0XSk7CisJCQkgICAgIFBYX0JSRENGRzBfRFZJU0VMIHwgUFhfQlJEQ0ZHMF9ETElOSyk7CisJCWJyZWFrOworCWNhc2UgRlNMX0RJVV9QT1JUX0xWRFM6CisJCWNscnNldGJpdHNfOChwaXhpc19iZGNmZzAsIFBYX0JSRENGRzBfRElVX01BU0ssCisJCQkgICAgIFBYX0JSRENGRzBfRExJTkspOworCQlicmVhazsKKwljYXNlIEZTTF9ESVVfUE9SVF9ETFZEUzoKKwkJY2xyYml0czgocGl4aXNfYmRjZmcwLCBQWF9CUkRDRkcwX0RJVV9NQVNLKTsKKwkJYnJlYWs7CisJfQogfQogCiAvKioKQEAgLTI2MiwyMCArMjY4LDEwIEBACiAJaW91bm1hcChndXRzKTsKIH0KIAotc3NpemVfdCBtcGM4NjEwaHBjZF9zaG93X21vbml0b3JfcG9ydChpbnQgbW9uaXRvcl9wb3J0LCBjaGFyICpidWYpCitlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0CittcGM4NjEwaHBjZF92YWxpZF9tb25pdG9yX3BvcnQoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KQogewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwKLQkJCSIlYzAgLSBEVklcbiIKLQkJCSIlYzEgLSBTaW5nbGUgbGluayBMVkRTXG4iCi0JCQkiJWMyIC0gRHVhbCBsaW5rIExWRFNcbiIsCi0JCQltb25pdG9yX3BvcnQgPT0gMCA/ICcqJyA6ICcgJywKLQkJCW1vbml0b3JfcG9ydCA9PSAxID8gJyonIDogJyAnLAotCQkJbW9uaXRvcl9wb3J0ID09IDIgPyAnKicgOiAnICcpOwotfQotCi1pbnQgbXBjODYxMGhwY2Rfc2V0X3N5c2ZzX21vbml0b3JfcG9ydChpbnQgdmFsKQotewotCXJldHVybiB2YWwgPCAzID8gdmFsIDogMDsKKwlyZXR1cm4gcG9ydDsKIH0KIAogI2VuZGlmCkBAIC0zMDcsOCArMzAzLDcgQEAKIAlkaXVfb3BzLnNldF9nYW1tYV90YWJsZQkJPSBtcGM4NjEwaHBjZF9zZXRfZ2FtbWFfdGFibGU7CiAJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0CT0gbXBjODYxMGhwY2Rfc2V0X21vbml0b3JfcG9ydDsKIAlkaXVfb3BzLnNldF9waXhlbF9jbG9jawkJPSBtcGM4NjEwaHBjZF9zZXRfcGl4ZWxfY2xvY2s7Ci0JZGl1X29wcy5zaG93X21vbml0b3JfcG9ydAk9IG1wYzg2MTBocGNkX3Nob3dfbW9uaXRvcl9wb3J0OwotCWRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydAk9IG1wYzg2MTBocGNkX3NldF9zeXNmc19tb25pdG9yX3BvcnQ7CisJZGl1X29wcy52YWxpZF9tb25pdG9yX3BvcnQJPSBtcGM4NjEwaHBjZF92YWxpZF9tb25pdG9yX3BvcnQ7CiAjZW5kaWYKIAogCXBpeGlzX25vZGUgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGZwZ2EtcGl4aXMiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L3RxbTh4eF9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvdHFtOHh4X3NldHVwLmMKaW5kZXggYjcxYzY1MC4uNTI4ZTAwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvdHFtOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvdHFtOHh4X3NldHVwLmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKaW5kZXggYjliYTg2MS4uZTQ1ODg3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIG1lbnUgIlBsYXRmb3JtIHN1cHBvcnQiCiAKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWciCkBAIC0zMzMsMTYgKzMzNCw2IEBACiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9LY29uZmlnIgogCi1jb25maWcgTVBDOHh4eF9HUElPCi0JYm9vbCAiTVBDNTEyeC9NUEM4eHh4IEdQSU8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ19NUEM1MTJ4IHx8IFBQQ19NUEM4MzF4IHx8IFBQQ19NUEM4MzR4IHx8IFBQQ19NUEM4Mzd4IHx8IFwKLQkJICAgRlNMX1NPQ19CT09LRSB8fCBQUENfODZ4eAotCXNlbGVjdCBHRU5FUklDX0dQSU8KLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSdyZSBnb2luZyB0byB1c2UgaGFyZHdhcmUgdGhhdCBjb25uZWN0cyB0byB0aGUKLQkgIE1QQzUxMngvODMxeC84MzR4LzgzN3gvODU3Mi84NjEwIEdQSU9zLgotCiBjb25maWcgU0lNUExFX0dQSU8KIAlib29sICJTdXBwb3J0IGZvciBzaW1wbGUsIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycyIKIAlkZXBlbmRzIG9uIFBQQwpAQCAtMzU1LDcgKzM0Niw3IEBACiAJICBvbi1ib2FyZCBwZXJpcGhlcmFscy4KIAogY29uZmlnIE1DVV9NUEM4MzQ5RU1JVFgKLQl0cmlzdGF0ZSAiTVBDODM0OUUtbUlUWCBNQ1UgZHJpdmVyIgorCWJvb2wgIk1QQzgzNDlFLW1JVFggTUNVIGRyaXZlciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBQUENfODN4eAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKaW5kZXggZTA2ZTM5NS4uZmJlY2FlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKQEAgLTY5LDYgKzY5LDcgQEAKIAlib29sICJTZXJ2ZXIgcHJvY2Vzc29ycyIKIAlzZWxlY3QgUFBDX0ZQVQogCXNlbGVjdCBQUENfSEFWRV9QTVVfU1VQUE9SVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSFVHRVRMQkZTCiAKIGNvbmZpZyBQUENfQk9PSzNFXzY0CiAJYm9vbCAiRW1iZWRkZWQgcHJvY2Vzc29ycyIKQEAgLTE3Myw2ICsxNzQsNyBAQAogY29uZmlnIEZTTF9CT09LRQogCWJvb2wKIAlkZXBlbmRzIG9uIChFMjAwIHx8IEU1MDApICYmIFBQQzMyCisJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgUEhZU182NEJJVAogCWRlZmF1bHQgeQogCiAjIHRoaXMgaXMgZm9yIGNvbW1vbiBjb2RlIGJldHdlZW4gUFBDMzIgJiBQUEM2NCBGU0wgQk9PS0UKQEAgLTI4MiwyMSArMjg0LDEzIEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gIVBQQ19TVERfTU1VCiAKLWNvbmZpZyBQUENfTU1VX05PSEFTSF8zMgotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFBQQ19NTVVfTk9IQVNIICYmIFBQQzMyCi0KLWNvbmZpZyBQUENfTU1VX05PSEFTSF82NAotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFBQQ19NTVVfTk9IQVNIICYmIFBQQzY0Ci0KIGNvbmZpZyBQUENfQk9PSzNFX01NVQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEZTTF9CT09LRSB8fCBQUENfQk9PSzNFCiAKIGNvbmZpZyBQUENfTU1fU0xJQ0VTCiAJYm9vbAotCWRlZmF1bHQgeSBpZiBIVUdFVExCX1BBR0UgfHwgKFBQQ19TVERfTU1VXzY0ICYmIFBQQ182NEtfUEFHRVMpCisJZGVmYXVsdCB5IGlmIChQUEM2NCAmJiBIVUdFVExCX1BBR0UpIHx8IChQUENfU1REX01NVV82NCAmJiBQUENfNjRLX1BBR0VTKQogCWRlZmF1bHQgbgogCiBjb25maWcgVklSVF9DUFVfQUNDT1VOVElORwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKaW5kZXggNzNlMjExNi4uMjYzNWEyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfUFBDXzgzeHgpCQkrPSA4M3h4Lwogb2JqLSQoQ09ORklHX0ZTTF9TT0NfQk9PS0UpCSs9IDg1eHgvCiBvYmotJChDT05GSUdfUFBDXzg2eHgpCQkrPSA4Nnh4Lworb2JqLSQoQ09ORklHX1BQQ19QT1dFUk5WKQkrPSBwb3dlcm52Lwogb2JqLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkrPSBwc2VyaWVzLwogb2JqLSQoQ09ORklHX1BQQ19JU0VSSUVTKQkrPSBpc2VyaWVzLwogb2JqLSQoQ09ORklHX1BQQ19NQVBMRSkJCSs9IG1hcGxlLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYwppbmRleCBhYzA2OTAzLi40MGE2ZTM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdC5jCmluZGV4IDQ4YzY5MGUuLjg1MjU5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXQuYwpAQCAtMTgsNyArMTgsNyBAQAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCX0KIAkJZXYtPnZpcnEgPSB2aXJxOwogCi0JCXJjID0gcmVxdWVzdF9pcnEodmlycSwgZXYtPmhhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJCXJjID0gcmVxdWVzdF9pcnEodmlycSwgZXYtPmhhbmRsZXIsIDAsCiAJCQkJICAgICAgZXYtPnR5cGVjb2RlLCBOVUxMKTsKIAkJaWYgKHJjICE9IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiQmVhdDogZmFpbGVkIHRvIHJlcXVlc3QgdmlydHVhbCBJUlEiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9zcHVfcHJpdjEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3NwdV9wcml2MS5jCmluZGV4IGJjYzE3ZjcuLjEzZjUyNTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3NwdV9wcml2MS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3NwdV9wcml2MS5jCkBAIC0xOCw4ICsxOCw2IEBACiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF93cmFwcGVyLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF93cmFwcGVyLmgKaW5kZXggYjQ3ZGZkYS4uYzExMDk5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfd3JhcHBlci5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3dyYXBwZXIuaApAQCAtMjAsNiArMjAsNyBAQAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICAqLwogI2lmbmRlZiBCRUFUX0hDQUxMCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSAiYmVhdF9zeXNjYWxsLmgiCiAKIC8qIGRlZmluZWQgaW4gaHZDYWxsLlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKaW5kZXggYmZhMmMwYy4uZDRjMzllMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BtaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BtaS5jCmluZGV4IDMyMzNmZTguLjYwYTA3YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wbWkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcG1pLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcG93ZXJidXR0b24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcG93ZXJidXR0b24uYwppbmRleCBmNzVhNGRhLi4yYmI4MDMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3Bvd2VyYnV0dG9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9wb3dlcmJ1dHRvbi5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3BtaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jCmluZGV4IGYzOTE3ZTcuLjE0MjhkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19wY2lleC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zY2NfcGNpZXguYwppbmRleCBhZTc5MGFjLi4xNGJlMmJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19wY2lleC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX3BjaWV4LmMKQEAgLTUxNCw3ICs1MTQsNyBAQAogCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKIAkJCQkgICAgIG9pcnEuc2l6ZSk7CiAJaWYgKHJlcXVlc3RfaXJxKHZpcnEsIHBjaWV4X2hhbmRsZV9pbnRlcm5hbF9pcnEsCi0JCQlJUlFGX0RJU0FCTEVELCAicGNpZXgiLCAodm9pZCAqKXBoYikpIHsKKwkJCTAsICJwY2lleCIsICh2b2lkICopcGhiKSkgewogCQlwcl9lcnIoIlBDSUVYQzpGYWlsZWQgdG8gcmVxdWVzdCBpcnFcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2V0dXAuYwppbmRleCBkNThkOWJhLi4xZDVhNGQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zZXR1cC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NwdWZyZXFfc3B1ZGVtYW5kLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYwppbmRleCA3ZjkyMDk2Li4yM2JjOWRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwppbmRleCAzZTRlYmE2Li45NmE0MzNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCkBAIC0zMSw3ICszMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwppbmRleCAyNmEwNjcxLi41OTJjM2Q1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtNDEyLDggKzQxMiw3IEBACiAJCQlJSUNfSVJRX0lPRVhfQVRJIHwgKGlvbW11LT5uaWQgPDwgSUlDX0lSUV9OT0RFX1NISUZUKSk7CiAJQlVHX09OKHZpcnEgPT0gTk9fSVJRKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHZpcnEsIGlvY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JCQlpb21tdS0+bmFtZSwgaW9tbXUpOworCXJldCA9IHJlcXVlc3RfaXJxKHZpcnEsIGlvY19pbnRlcnJ1cHQsIDAsIGlvbW11LT5uYW1lLCBpb21tdSk7CiAJQlVHX09OKHJldCk7CiAKIAkvKiBzZXQgdGhlIElPQyBzZWdtZW50IHRhYmxlIG9yaWdpbiByZWdpc3RlciAoYW5kIHR1cm4gb24gdGhlIGlvbW11KSAqLwpAQCAtMTE1OSw2ICsxMTU4LDI2IEBACiB9CiBfX3NldHVwKCJpb21tdV9maXhlZD0iLCBzZXR1cF9pb21tdV9maXhlZCk7CiAKK3N0YXRpYyB1NjQgY2VsbF9kbWFfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfbWFwX29wcyAqZG1hX29wczsKKworCWlmICghZGV2LT5kbWFfbWFzaykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWlvbW11X2ZpeGVkX2Rpc2FibGVkICYmCisJCQljZWxsX2lvbW11X2dldF9maXhlZF9hZGRyZXNzKGRldikgIT0gT0ZfQkFEX0FERFIpCisJCXJldHVybiBETUFfQklUX01BU0soNjQpOworCisJZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisJaWYgKGRtYV9vcHMtPmdldF9yZXF1aXJlZF9tYXNrKQorCQlyZXR1cm4gZG1hX29wcy0+Z2V0X3JlcXVpcmVkX21hc2soZGV2KTsKKworCVdBUk5fT05DRSgxLCAibm8gZ2V0X3JlcXVpcmVkX21hc2sgaW4gJXAgb3BzIiwgZG1hX29wcyk7CisKKwlyZXR1cm4gRE1BX0JJVF9NQVNLKDY0KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgY2VsbF9pb21tdV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKQEAgLTExNzUsNiArMTE5NCw3IEBACiAKIAkvKiBTZXR1cCB2YXJpb3VzIHBwY19tZC4gY2FsbGJhY2tzICovCiAJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gY2VsbF9wY2lfZG1hX2Rldl9zZXR1cDsKKwlwcGNfbWQuZG1hX2dldF9yZXF1aXJlZF9tYXNrID0gY2VsbF9kbWFfZ2V0X3JlcXVpcmVkX21hc2s7CiAJcHBjX21kLnRjZV9idWlsZCA9IHRjZV9idWlsZF9jZWxsOwogCXBwY19tZC50Y2VfZnJlZSA9IHRjZV9mcmVlX2NlbGw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYwppbmRleCA2OWVkMGQ3Zi4uNTljMWExNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpAQCAtMzkxLDcgKzM5Miw3IEBACiAJCX0KIAogCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgY2JlX3BtX2lycSwKLQkJCQkgSVJRRl9ESVNBQkxFRCwgImNiZS1wbXUtMCIsIE5VTEwpOworCQkJCSAwLCAiY2JlLXBtdS0wIiwgTlVMTCk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKCJFUlJPUjogUmVxdWVzdCBmb3IgaXJxIG9uIG5vZGUgJWQgZmFpbGVkXG4iLAogCQkJICAgICAgIG5vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3FwYWNlX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcXBhY2Vfc2V0dXAuYwppbmRleCA1MWUyOTAxLi43ZjliNjc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcXBhY2Vfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcXBhY2Vfc2V0dXAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwppbmRleCBjNzNjZjRjLi4wZmM5YjcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NtcC5jCmluZGV4IGYyZTFkZmUuLmY1YzVjNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc21wLmMKQEAgLTE1LDcgKzE1LDYgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKaW5kZXggMzY3NWRhNy4uZTk0ZDNlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKQEAgLTQ0Miw4ICs0NDIsNyBAQAogCQlzbnByaW50ZihzcHUtPmlycV9jMCwgc2l6ZW9mIChzcHUtPmlycV9jMCksICJzcGUlMDJkLjAiLAogCQkJIHNwdS0+bnVtYmVyKTsKIAkJcmV0ID0gcmVxdWVzdF9pcnEoc3B1LT5pcnFzWzBdLCBzcHVfaXJxX2NsYXNzXzAsCi0JCQkJICBJUlFGX0RJU0FCTEVELAotCQkJCSAgc3B1LT5pcnFfYzAsIHNwdSk7CisJCQkJICAwLCBzcHUtPmlycV9jMCwgc3B1KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gYmFpbDA7CiAJfQpAQCAtNDUxLDggKzQ1MCw3IEBACiAJCXNucHJpbnRmKHNwdS0+aXJxX2MxLCBzaXplb2YgKHNwdS0+aXJxX2MxKSwgInNwZSUwMmQuMSIsCiAJCQkgc3B1LT5udW1iZXIpOwogCQlyZXQgPSByZXF1ZXN0X2lycShzcHUtPmlycXNbMV0sIHNwdV9pcnFfY2xhc3NfMSwKLQkJCQkgIElSUUZfRElTQUJMRUQsCi0JCQkJICBzcHUtPmlycV9jMSwgc3B1KTsKKwkJCQkgIDAsIHNwdS0+aXJxX2MxLCBzcHUpOwogCQlpZiAocmV0KQogCQkJZ290byBiYWlsMTsKIAl9CkBAIC00NjAsOCArNDU4LDcgQEAKIAkJc25wcmludGYoc3B1LT5pcnFfYzIsIHNpemVvZiAoc3B1LT5pcnFfYzIpLCAic3BlJTAyZC4yIiwKIAkJCSBzcHUtPm51bWJlcik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHNwdS0+aXJxc1syXSwgc3B1X2lycV9jbGFzc18yLAotCQkJCSAgSVJRRl9ESVNBQkxFRCwKLQkJCQkgIHNwdS0+aXJxX2MyLCBzcHUpOworCQkJCSAgMCwgc3B1LT5pcnFfYzIsIHNwdSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGJhaWwyOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jCmluZGV4IGZlYzE0OTUuLjc1ZDYxMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYwpAQCAtNSw3ICs1LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9mYXVsdC5jCmluZGV4IGQwNmJhODcuLjY0MWU3MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2ZhdWx0LmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKaW5kZXggNGU1YzkxNC4uMmJiNjk3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X25vdGlmeS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9ub3RpZnkuYwppbmRleCAzNGQxNTY5Li5hZmRmODU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X25vdGlmeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbm90aWZ5LmMKQEAgLTIxLDcgKzIxLDggQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlICJzcHVmcy9zcHVmcy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3ByaXYxX21taW8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCmluZGV4IDEyMWFlYzMuLjY2ZDMzNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCmluZGV4IDY0ZWIxNWIuLjZlOGE5ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCkBAIC0yMSw3ICsyMSw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKaW5kZXggYmY0ZDQxZC4uOWM2NzkwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCkBAIC0yMiw5ICsyMiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CiAjaW5jbHVkZSAic3B1ZnMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKaW5kZXggNmNmM2VjNi4uMDNjNWZjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKaW5kZXggYTRkZDNhZS4uOGNiNjI2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKQEAgLTIxLDcgKzIxLDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggZmI1OWM0Ni4uMGNmZWNlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwppbmRleCA2NGY4NTQwLi44NjU1YzRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCkBAIC0xOCw3ICsxOCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAzMmNiNGU2Li45NjVkMzgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtMjIsNyArMjIsNiBAQAogCiAjdW5kZWYgREVCVUcKIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCAzZGY5YTM2Li5kZGUzNTU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKaW5kZXggNjA5ZTAxNi4uNzFhNWI1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKQEAgLTEsNiArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwppbmRleCA1MjRkOTcxLi41YThmNTBhOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtODcsMTAgKzg3LDYgQEAKIGNvbmZpZyBNUEMxMFhfT1BFTlBJQwogCWJvb2wKIAotY29uZmlnIE1QQzEwWF9TVE9SRV9HQVRIRVJJTkcKLQlib29sICJFbmFibGUgTVBDMTB4IHN0b3JlIGdhdGhlcmluZyIKLQlkZXBlbmRzIG9uIE1QQzEwWF9CUklER0UKLQogY29uZmlnIEdBTUVDVUJFX0NPTU1PTgogCWJvb2wKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCmluZGV4IDQ4N2JkYTAuLjJlOWJjZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCmluZGV4IDFjYjkwN2MuLmY4ZjMzZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHZscGNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h2bHBjb25maWcuYwppbmRleCBmMDQ3NWYwLi5mNjJhMGM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHZscGNvbmZpZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odmxwY29uZmlnLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9scF9jb25maWcuaD4KICNpbmNsdWRlICJpdF9scF9uYWNhLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKaW5kZXggZDhiNzYzMy4uMmYzZDkxMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2tzeW1zLmMKaW5kZXggMjQzMDg0OC4uOTk3ZTIzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2tzeW1zLmMKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfY2FsbF9zYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwYXJkYXRhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYwppbmRleCA5OGJkMmQzLi4wMGUwZWM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBhcmRhdGEuYwpAQCAtOCw3ICs4LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbHBldmVudHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGV2ZW50cy5jCmluZGV4IGIwZjhhODUuLjIwMmUyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGV2ZW50cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGV2ZW50cy5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCmluZGV4IDYyZGFiZTMuLjI1NGMxZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IGFiMzk2MmIuLmM3NTQxMjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCmluZGV4IGMyNWEwODEuLmVhMGFjYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc21wLmMKaW5kZXggOGJkYTliZS4uN2UyYTU1MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zbXAuYwpAQCAtMTUsNyArMTUsNiBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCmluZGV4IGI2ZGI3Y2UuLjA0YmU2MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW8uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS92aW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCmluZGV4IDIzNzYwNjkuLjQwZGFkMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYwpAQCAtMjcsNyArMjcsNyBAQAogICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwppbmRleCA1YjMzODhiLi40YzM3MjA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKaW5kZXggYzE2NTM3Yi4uOTVkMDAxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvY3B1ZnJlcS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKaW5kZXggNzU2MTIzYi4uZjNkZWZkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYwpAQCAtMTksMTAgKzE5LDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYXNlbWlfZG1hLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCmluZGV4IDdjODU4ZTYuLjZmMzU1ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwppbmRleCBjMmYzZTg2Li5hMDAwOTZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KICNpbmNsdWRlIDxsaW51eC9wbXUuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwppbmRleCBkZjQyMzk5Li42M2Q4MmJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYwppbmRleCBlOWM4YTYwLi45OTZjNWZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbnZyYW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbnZyYW0uYwppbmRleCA2OTU0NDNiLi41NGQyMjcxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL252cmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9udnJhbS5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqICBUb2RvOiAtIGFkZCBzdXBwb3J0IGZvciB0aGUgT0YgcGVyc2lzdGVudCBwcm9wZXJ0aWVzCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCmluZGV4IDc2NjdkYjQuLjkwMWJmYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTI3Myw3ICsyNzIsNiBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBnYXR3aWNrX2Nhc2NhZGVfYWN0aW9uID0gewogCS5oYW5kbGVyCT0gZ2F0d2lja19hY3Rpb24sCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCiAJLm5hbWUJCT0gImNhc2NhZGUiLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IGEwMjhmMDguLjk2NTgwYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwppbmRleCA5YTUyMWRjLi45YjZhODIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCiAJaWYgKHBzdXJnZV9zZWNvbmRhcnlfdmlycSkKIAkJcmMgPSByZXF1ZXN0X2lycShwc3VyZ2Vfc2Vjb25kYXJ5X3ZpcnEsIHBzdXJnZV9pcGlfaW50ciwKLQkJCUlSUUZfRElTQUJMRUR8SVJRRl9QRVJDUFUsICJJUEkiLCBOVUxMKTsKKwkJCUlSUUZfUEVSQ1BVLCAiSVBJIiwgTlVMTCk7CiAKIAlpZiAocmMpCiAJCXByX2VycigiRmFpbGVkIHRvIHNldHVwIHNlY29uZGFyeSBjcHUgSVBJXG4iKTsKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBwc3VyZ2VfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0gcHN1cmdlX2lwaV9pbnRyLAotCS5mbGFncyA9IElSUUZfRElTQUJMRUR8SVJRRl9QRVJDUFUsCisJLmZsYWdzID0gSVJRRl9QRVJDUFUsCiAJLm5hbWUgPSAicHJpbWFyeSBJUEkiLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZlYTVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L0tjb25maWcKQEAgLTAsMCArMSwxNiBAQAorY29uZmlnIFBQQ19QT1dFUk5WCisJZGVwZW5kcyBvbiBQUEM2NCAmJiBQUENfQk9PSzNTCisJYm9vbCAiSUJNIFBvd2VyTlYgKE5vbi1WaXJ0dWFsaXplZCkgcGxhdGZvcm0gc3VwcG9ydCIKKwlzZWxlY3QgUFBDX05BVElWRQorCXNlbGVjdCBQUENfWElDUworCXNlbGVjdCBQUENfSUNQX05BVElWRQorCXNlbGVjdCBQUENfUDdfTkFQCisJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFIGlmIEVNQkVEREVECisJZGVmYXVsdCB5CisKK2NvbmZpZyBQUENfUE9XRVJOVl9SVEFTCisJZGVwZW5kcyBvbiBQUENfUE9XRVJOVgorCWJvb2wgIlN1cHBvcnQgZm9yIFJUQVMgYmFzZWQgUG93ZXJOViBwbGF0Zm9ybXMgc3VjaCBhcyBCTUwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBQQ19JQ1NfUlRBUworCXNlbGVjdCBQUENfUlRBUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODUzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmoteQkJCSs9IHNldHVwLm8gb3BhbC10YWtlb3Zlci5vIG9wYWwtd3JhcHBlcnMubyBvcGFsLm8KK29iai15CQkJKz0gb3BhbC1ydGMubyBvcGFsLW52cmFtLm8KKworb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KK29iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaS1wNWlvYzIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtbnZyYW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLW52cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4M2UxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLW52cmFtLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFBvd2VyTlYgbnZyYW0gY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IG52cmFtX3NpemU7CisKK3N0YXRpYyBzc2l6ZV90IG9wYWxfbnZyYW1fc2l6ZSh2b2lkKQoreworCXJldHVybiBudnJhbV9zaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvcGFsX252cmFtX3JlYWQoY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqaW5kZXgpCit7CisJczY0IHJjOworCWludCBvZmY7CisKKwlpZiAoKmluZGV4ID49IG52cmFtX3NpemUpCisJCXJldHVybiAwOworCW9mZiA9ICppbmRleDsKKwlpZiAoKG9mZiArIGNvdW50KSA+IG52cmFtX3NpemUpCisJCWNvdW50ID0gbnZyYW1fc2l6ZSAtIG9mZjsKKwlyYyA9IG9wYWxfcmVhZF9udnJhbShfX3BhKGJ1ZiksIGNvdW50LCBvZmYpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXJldHVybiAtRUlPOworCSppbmRleCArPSBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9wYWxfbnZyYW1fd3JpdGUoY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqaW5kZXgpCit7CisJczY0IHJjID0gT1BBTF9CVVNZOworCWludCBvZmY7CisKKwlpZiAoKmluZGV4ID49IG52cmFtX3NpemUpCisJCXJldHVybiAwOworCW9mZiA9ICppbmRleDsKKwlpZiAoKG9mZiArIGNvdW50KSA+IG52cmFtX3NpemUpCisJCWNvdW50ID0gbnZyYW1fc2l6ZSAtIG9mZjsKKworCXdoaWxlIChyYyA9PSBPUEFMX0JVU1kgfHwgcmMgPT0gT1BBTF9CVVNZX0VWRU5UKSB7CisJCXJjID0gb3BhbF93cml0ZV9udnJhbShfX3BhKGJ1ZiksIGNvdW50LCBvZmYpOworCQlpZiAocmMgPT0gT1BBTF9CVVNZX0VWRU5UKQorCQkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKKwl9CisJKmluZGV4ICs9IGNvdW50OworCXJldHVybiBjb3VudDsKK30KKwordm9pZCBfX2luaXQgb3BhbF9udnJhbV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljb25zdCB1MzIgKm5ieXRlc19wOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLG9wYWwtbnZyYW0iKTsKKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbmJ5dGVzX3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICIjYnl0ZXMiLCBOVUxMKTsKKwlpZiAoIW5ieXRlc19wKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuOworCX0KKwludnJhbV9zaXplID0gKm5ieXRlc19wOworCisJcHJpbnRrKEtFUk5fSU5GTyAiT1BBTCBudnJhbSBzZXR1cCwgJXUgYnl0ZXNcbiIsIG52cmFtX3NpemUpOworCW9mX25vZGVfcHV0KG5wKTsKKworCXBwY19tZC5udnJhbV9yZWFkID0gb3BhbF9udnJhbV9yZWFkOworCXBwY19tZC5udnJhbV93cml0ZSA9IG9wYWxfbnZyYW1fd3JpdGU7CisJcHBjX21kLm52cmFtX3NpemUgPSBvcGFsX252cmFtX3NpemU7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXJ0Yy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXJ0Yy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBQb3dlck5WIFJlYWwgVGltZSBDbG9jay4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworc3RhdGljIHZvaWQgb3BhbF90b190bSh1MzIgeV9tX2QsIHU2NCBoX21fc19tcywgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl0bS0+dG1feWVhcgk9ICgoYmNkMmJpbih5X21fZCA+PiAyNCkgKiAxMDApICsKKwkJCSAgIGJjZDJiaW4oKHlfbV9kID4+IDE2KSAmIDB4ZmYpKSAtIDE5MDA7CisJdG0tPnRtX21vbgk9IGJjZDJiaW4oKHlfbV9kID4+IDgpICYgMHhmZikgLSAxOworCXRtLT50bV9tZGF5CT0gYmNkMmJpbih5X21fZCAmIDB4ZmYpOworCXRtLT50bV9ob3VyCT0gYmNkMmJpbigoaF9tX3NfbXMgPj4gNTYpICYgMHhmZik7CisJdG0tPnRtX21pbgk9IGJjZDJiaW4oKGhfbV9zX21zID4+IDQ4KSAmIDB4ZmYpOworCXRtLT50bV9zZWMJPSBiY2QyYmluKChoX21fc19tcyA+PiA0MCkgJiAweGZmKTsKKworICAgICAgICBHcmVnb3JpYW5EYXkodG0pOworfQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBvcGFsX2dldF9ib290X3RpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJdTMyIHlfbV9kOworCXU2NCBoX21fc19tczsKKwlsb25nIHJjID0gT1BBTF9CVVNZOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX3J0Y19yZWFkKCZ5X21fZCwgJmhfbV9zX21zKTsKKwkJaWYgKHJjID09IE9QQUxfQlVTWV9FVkVOVCkKKwkJCW9wYWxfcG9sbF9ldmVudHMoTlVMTCk7CisJCWVsc2UKKwkJCW1kZWxheSgxMCk7CisJfQorCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXJldHVybiAwOworCW9wYWxfdG9fdG0oeV9tX2QsIGhfbV9zX21zLCAmdG0pOworCXJldHVybiBta3RpbWUodG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksCisJCSAgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKK30KKwordm9pZCBvcGFsX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWxvbmcgcmMgPSBPUEFMX0JVU1k7CisJdTMyIHlfbV9kOworCXU2NCBoX21fc19tczsKKworCXdoaWxlIChyYyA9PSBPUEFMX0JVU1kgfHwgcmMgPT0gT1BBTF9CVVNZX0VWRU5UKSB7CisJCXJjID0gb3BhbF9ydGNfcmVhZCgmeV9tX2QsICZoX21fc19tcyk7CisJCWlmIChyYyA9PSBPUEFMX0JVU1lfRVZFTlQpCisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCQllbHNlCisJCQltZGVsYXkoMTApOworCX0KKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm47CisJb3BhbF90b190bSh5X21fZCwgaF9tX3NfbXMsIHRtKTsKK30KKworaW50IG9wYWxfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJbG9uZyByYyA9IE9QQUxfQlVTWTsKKwl1MzIgeV9tX2QgPSAwOworCXU2NCBoX21fc19tcyA9IDA7CisKKwl5X21fZCB8PSAoKHUzMiliaW4yYmNkKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKSkgPDwgMjQ7CisJeV9tX2QgfD0gKCh1MzIpYmluMmJjZCgodG0tPnRtX3llYXIgKyAxOTAwKSAlIDEwMCkpIDw8IDE2OworCXlfbV9kIHw9ICgodTMyKWJpbjJiY2QoKHRtLT50bV9tb24gKyAxKSkpIDw8IDg7CisJeV9tX2QgfD0gKCh1MzIpYmluMmJjZCh0bS0+dG1fbWRheSkpOworCisJaF9tX3NfbXMgfD0gKCh1NjQpYmluMmJjZCh0bS0+dG1faG91cikpIDw8IDU2OworCWhfbV9zX21zIHw9ICgodTY0KWJpbjJiY2QodG0tPnRtX21pbikpIDw8IDQ4OworCWhfbV9zX21zIHw9ICgodTY0KWJpbjJiY2QodG0tPnRtX3NlYykpIDw8IDQwOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX3J0Y193cml0ZSh5X21fZCwgaF9tX3NfbXMpOworCQlpZiAocmMgPT0gT1BBTF9CVVNZX0VWRU5UKQorCQkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKKwkJZWxzZQorCQkJbWRlbGF5KDEwKTsKKwl9CisJcmV0dXJuIHJjID09IE9QQUxfU1VDQ0VTUyA/IDAgOiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtdGFrZW92ZXIuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXRha2VvdmVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiNDhiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXRha2VvdmVyLlMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBQb3dlck5WIE9QQUwgdGFrZW92ZXIgYXNzZW1ibHkgY29kZSwgZm9yIHVzZSBieSBwcm9tX2luaXQuYworICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNkZWZpbmUgU1RLX1BBUkFNKGkpCSg0OCArICgoaSktMykqOCkKKworI2RlZmluZSBIX0hBTF9UQUtFT1ZFUgkJCTB4NTEyNAorI2RlZmluZSBIX0hBTF9UQUtFT1ZFUl9RVUVSWV9NQUdJQwktMQorCisJLnRleHQKK19HTE9CQUwob3BhbF9xdWVyeV90YWtlb3ZlcikKKwltZmNyCXIwCisJc3R3CXIwLDgocjEpCisJc3RkCXIzLFNUS19QQVJBTShyMykocjEpCisJc3RkCXI0LFNUS19QQVJBTShyNCkocjEpCisJbGkJcjMsSF9IQUxfVEFLRU9WRVIKKwlsaQlyNCxIX0hBTF9UQUtFT1ZFUl9RVUVSWV9NQUdJQworCUhWU0MKKwlsZAlyMTAsU1RLX1BBUkFNKHIzKShyMSkKKwlzdGQJcjQsMChyMTApCisJbGQJcjEwLFNUS19QQVJBTShyNCkocjEpCisJc3RkCXI1LDAocjEwKQorCWx3eglyMCw4KHIxKQorCW10Y3JmCTB4ZmYscjAKKwlibHIKKworX0dMT0JBTChvcGFsX2RvX3Rha2VvdmVyKQorCW1mY3IJcjAKKwlzdHcJcjAsOChyMSkKKwltZmxyCXIwCisJc3RkCXIwLDE2KHIxKQorCWJsCV9fb3BhbF9kb190YWtlb3ZlcgorCWxkCXIwLDE2KHIxKQorCW10bHIJcjAKKwlsd3oJcjAsOChyMSkKKwltdGNyZgkweGZmLHIwCisJYmxyCisKK19fb3BhbF9kb190YWtlb3ZlcjoKKwlsZAlyNCwwKHIzKQorCWxkCXI1LDB4OChyMykKKwlsZAlyNiwweDEwKHIzKQorCWxkCXI3LDB4MTgocjMpCisJbGQJcjgsMHgyMChyMykKKwlsZAlyOSwweDI4KHIzKQorCWxkCXIxMCwweDMwKHIzKQorCWxkCXIxMSwweDM4KHIzKQorCWxpCXIzLEhfSEFMX1RBS0VPVkVSCisJSFZTQworCWJscgorCisJLmdsb2JsIG9wYWxfc2Vjb25kYXJ5X2VudHJ5CitvcGFsX3NlY29uZGFyeV9lbnRyeToKKwltcglyMzEscjMKKwltZm1zcglyMTEKKwlsaQlyMTIsKE1TUl9TRiB8IE1TUl9JU0YpQGhpZ2hlc3QKKwlzbGRpCXIxMixyMTIsNDgKKwlvcglyMTEscjExLHIxMgorCW10bXNyZAlyMTEKKwlpc3luYworCW1mc3ByCXI0LFNQUk5fUElSCisJc3RkCXI0LDAocjMpCisxOglITVRfTE9XCisJbGQJcjQsOChyMykKKwljbXBsaQljcjAscjQsMAorCWJlcQkxYgorCUhNVF9NRURJVU0KKzE6CWFkZGkJcjMscjMxLDE2CisJYmwJX19vcGFsX2RvX3Rha2VvdmVyCisJYgkxYgorCitfR0xPQkFMKG9wYWxfZW50ZXJfcnRhcykKKwltZmxyCXIwCisJc3RkCXIwLDE2KHIxKQorICAgICAgICBzdGR1CXIxLC1QUk9NX0ZSQU1FX1NJWkUocjEpCS8qIFNhdmUgU1AgYW5kIGNyZWF0ZSBzdGFjayBzcGFjZSAqLworCisJLyogQmVjYXVzZSBQUk9NIGlzIHJ1bm5pbmcgaW4gMzJiIG1vZGUsIGl0IGNsb2JiZXJzIHRoZSBoaWdoIG9yZGVyIGhhbGYKKwkgKiBvZiBhbGwgcmVnaXN0ZXJzIHRoYXQgaXQgc2F2ZXMuICBXZSB0aGVyZWZvcmUgc2F2ZSB0aG9zZSByZWdpc3RlcnMKKwkgKiBQUk9NIG1pZ2h0IHRvdWNoIHRvIHRoZSBzdGFjay4gIChyMCwgcjMtcjEzIGFyZSBjYWxsZXIgc2F2ZWQpCisJKi8KKwlTQVZFX0dQUigyLCByMSkKKwlTQVZFX0dQUigxMywgcjEpCisJU0FWRV84R1BSUygxNCwgcjEpCisJU0FWRV8xMEdQUlMoMjIsIHIxKQorCW1mY3IJcjEwCisJbWZtc3IJcjExCisJc3RkCXIxMCxfQ0NSKHIxKQorCXN0ZAlyMTEsX01TUihyMSkKKworCS8qIEdldCB0aGUgUFJPTSBlbnRyeXBvaW50ICovCisJbXRscglyNQorCisJLyogU3dpdGNoIE1TUiB0byAzMiBiaXRzIG1vZGUKKwkgKi8KKyAgICAgICAgbGkgICAgICByMTIsMQorICAgICAgICBybGRpY3IgIHIxMixyMTIsTVNSX1NGX0xHLCg2My1NU1JfU0ZfTEcpCisgICAgICAgIGFuZGMgICAgcjExLHIxMSxyMTIKKyAgICAgICAgbGkgICAgICByMTIsMQorICAgICAgICBybGRpY3IgIHIxMixyMTIsTVNSX0lTRl9MRywoNjMtTVNSX0lTRl9MRykKKyAgICAgICAgYW5kYyAgICByMTEscjExLHIxMgorICAgICAgICBtdG1zcmQgIHIxMQorICAgICAgICBpc3luYworCisJLyogRW50ZXIgUlRBUyBoZXJlLi4uICovCisJYmxybAorCisJLyogSnVzdCBtYWtlIHN1cmUgdGhhdCByMSB0b3AgMzIgYml0cyBkaWRuJ3QgZ2V0CisJICogY29ycnVwdCBieSBPRgorCSAqLworCXJsZGljbAlyMSxyMSwwLDMyCisKKwkvKiBSZXN0b3JlIHRoZSBNU1IgKGJhY2sgdG8gNjQgYml0cykgKi8KKwlsZAlyMCxfTVNSKHIxKQorCU1UTVNSRChyMCkKKyAgICAgICAgaXN5bmMKKworCS8qIFJlc3RvcmUgb3RoZXIgcmVnaXN0ZXJzICovCisJUkVTVF9HUFIoMiwgcjEpCisJUkVTVF9HUFIoMTMsIHIxKQorCVJFU1RfOEdQUlMoMTQsIHIxKQorCVJFU1RfMTBHUFJTKDIyLCByMSkKKwlsZAlyNCxfQ0NSKHIxKQorCW10Y3IJcjQKKworICAgICAgICBhZGRpCXIxLHIxLFBST01fRlJBTUVfU0laRQorCWxkCXIwLDE2KHIxKQorCW10bHIgICAgcjAKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2Y0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogUG93ZXJOViBPUEFMIEFQSSB3cmFwcGVycworICoKKyAqIENvcHlyaWdodCAyMDExIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKy8qIFRPRE86CisgKgorICogLSBUcmFjZSBpcnFzIGluL29mZiAobmVlZHMgc2F2aW5nL3Jlc3RvcmluZyBhbGwgYXJncywgYXJnaC4uLikKKyAqIC0gR2V0IHIxMSBmZWVkIHVwIGJ5IERhdmUgc28gSSBjYW4gaGF2ZSBiZXR0ZXIgcmVnaXN0ZXIgdXNhZ2UKKyAqLworI2RlZmluZSBPUEFMX0NBTEwobmFtZSwgdG9rZW4pCQlcCisgX0dMT0JBTChuYW1lKTsJCQkJXAorCW1mbHIJcjA7CQkJXAorCW1mY3IJcjEyOwkJCVwKKwlzdGQJcjAsMTYocjEpOwkJXAorCXN0ZAlyMTIsOChyMSk7CQlcCisJc3RkCXIxLFBBQ0FSMShyMTMpOwkJXAorCWxpCXIwLDA7CQkJXAorCW1mbXNyCXIxMjsJCQlcCisJb3JpCXIwLHIwLE1TUl9FRTsJCVwKKwlzdGQJcjEyLFBBQ0FTQVZFRE1TUihyMTMpOwlcCisJYW5kYwlyMTIscjEyLHIwOwkJXAorCW10bXNyZAlyMTIsMTsJCQlcCisJTE9BRF9SRUdfQUREUihyMCwub3BhbF9yZXR1cm4pOwlcCisJbXRscglyMDsJCQlcCisJbGkJcjAsTVNSX0RSfE1TUl9JUjsJXAorCWFuZGMJcjEyLHIxMixyMDsJCVwKKwlsaQlyMCx0b2tlbjsJCVwKKwltdHNwcglTUFJOX0hTUlIxLHIxMjsJCVwKKwlMT0FEX1JFR19BRERSKHIxMSxvcGFsKTsJXAorCWxkCXIxMiw4KHIxMSk7CQlcCisJbGQJcjIsMChyMTEpOwkJXAorCW10c3ByCVNQUk5fSFNSUjAscjEyOwkJXAorCWhyZmlkCisKK19TVEFUSUMob3BhbF9yZXR1cm4pCisJbGQJcjIsUEFDQVRPQyhyMTMpOworCWxkCXI0LDgocjEpOworCWxkCXI1LDE2KHIxKTsKKwlsZAlyNixQQUNBU0FWRURNU1IocjEzKTsKKwltdHNwcglTUFJOX1NSUjAscjU7CisJbXRzcHIJU1BSTl9TUlIxLHI2OworCW10Y3IJcjQ7CisJcmZpZAorCitPUEFMX0NBTEwob3BhbF9jb25zb2xlX3dyaXRlLAkJCU9QQUxfQ09OU09MRV9XUklURSk7CitPUEFMX0NBTEwob3BhbF9jb25zb2xlX3JlYWQsCQkJT1BBTF9DT05TT0xFX1JFQUQpOworT1BBTF9DQUxMKG9wYWxfY29uc29sZV93cml0ZV9idWZmZXJfc3BhY2UsCU9QQUxfQ09OU09MRV9XUklURV9CVUZGRVJfU1BBQ0UpOworT1BBTF9DQUxMKG9wYWxfcnRjX3JlYWQsCQkJT1BBTF9SVENfUkVBRCk7CitPUEFMX0NBTEwob3BhbF9ydGNfd3JpdGUsCQkJT1BBTF9SVENfV1JJVEUpOworT1BBTF9DQUxMKG9wYWxfY2VjX3Bvd2VyX2Rvd24sCQkJT1BBTF9DRUNfUE9XRVJfRE9XTik7CitPUEFMX0NBTEwob3BhbF9jZWNfcmVib290LAkJCU9QQUxfQ0VDX1JFQk9PVCk7CitPUEFMX0NBTEwob3BhbF9yZWFkX252cmFtLAkJCU9QQUxfUkVBRF9OVlJBTSk7CitPUEFMX0NBTEwob3BhbF93cml0ZV9udnJhbSwJCQlPUEFMX1dSSVRFX05WUkFNKTsKK09QQUxfQ0FMTChvcGFsX2hhbmRsZV9pbnRlcnJ1cHQsCQlPUEFMX0hBTkRMRV9JTlRFUlJVUFQpOworT1BBTF9DQUxMKG9wYWxfcG9sbF9ldmVudHMsCQkJT1BBTF9QT0xMX0VWRU5UUyk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X2h1Yl90Y2VfbWVtb3J5LAkJT1BBTF9QQ0lfU0VUX0hVQl9UQ0VfTUVNT1JZKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfcGhiX3RjZV9tZW1vcnksCQlPUEFMX1BDSV9TRVRfUEhCX1RDRV9NRU1PUlkpOworT1BBTF9DQUxMKG9wYWxfcGNpX2NvbmZpZ19yZWFkX2J5dGUsCQlPUEFMX1BDSV9DT05GSUdfUkVBRF9CWVRFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9jb25maWdfcmVhZF9oYWxmX3dvcmQsCU9QQUxfUENJX0NPTkZJR19SRUFEX0hBTEZfV09SRCk7CitPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3JlYWRfd29yZCwJCU9QQUxfUENJX0NPTkZJR19SRUFEX1dPUkQpOworT1BBTF9DQUxMKG9wYWxfcGNpX2NvbmZpZ193cml0ZV9ieXRlLAkJT1BBTF9QQ0lfQ09ORklHX1dSSVRFX0JZVEUpOworT1BBTF9DQUxMKG9wYWxfcGNpX2NvbmZpZ193cml0ZV9oYWxmX3dvcmQsCU9QQUxfUENJX0NPTkZJR19XUklURV9IQUxGX1dPUkQpOworT1BBTF9DQUxMKG9wYWxfcGNpX2NvbmZpZ193cml0ZV93b3JkLAkJT1BBTF9QQ0lfQ09ORklHX1dSSVRFX1dPUkQpOworT1BBTF9DQUxMKG9wYWxfc2V0X3hpdmUsCQkJT1BBTF9TRVRfWElWRSk7CitPUEFMX0NBTEwob3BhbF9nZXRfeGl2ZSwJCQlPUEFMX0dFVF9YSVZFKTsKK09QQUxfQ0FMTChvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyLAlPUEFMX1JFR0lTVEVSX09QQUxfRVhDRVBUSU9OX0hBTkRMRVIpOworT1BBTF9DQUxMKG9wYWxfcGNpX2VlaF9mcmVlemVfc3RhdHVzLAkJT1BBTF9QQ0lfRUVIX0ZSRUVaRV9TVEFUVVMpOworT1BBTF9DQUxMKG9wYWxfcGNpX2VlaF9mcmVlemVfY2xlYXIsCQlPUEFMX1BDSV9FRUhfRlJFRVpFX0NMRUFSKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zaHBjLAkJCU9QQUxfUENJX1NIUEMpOworT1BBTF9DQUxMKG9wYWxfcGNpX3BoYl9tbWlvX2VuYWJsZSwJCU9QQUxfUENJX1BIQl9NTUlPX0VOQUJMRSk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3BoYl9tZW1fd2luZG93LAkJT1BBTF9QQ0lfU0VUX1BIQl9NRU1fV0lORE9XKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9tYXBfcGVfbW1pb193aW5kb3csCQlPUEFMX1BDSV9NQVBfUEVfTU1JT19XSU5ET1cpOworT1BBTF9DQUxMKG9wYWxfcGNpX3NldF9waGJfdGFibGVfbWVtb3J5LAlPUEFMX1BDSV9TRVRfUEhCX1RBQkxFX01FTU9SWSk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3BlLAkJCU9QQUxfUENJX1NFVF9QRSk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3BlbHR2LAkJCU9QQUxfUENJX1NFVF9QRUxUVik7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X212ZSwJCQlPUEFMX1BDSV9TRVRfTVZFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9zZXRfbXZlX2VuYWJsZSwJCU9QQUxfUENJX1NFVF9NVkVfRU5BQkxFKTsKK09QQUxfQ0FMTChvcGFsX3BjaV9nZXRfeGl2ZV9yZWlzc3VlLAkJT1BBTF9QQ0lfR0VUX1hJVkVfUkVJU1NVRSk7CitPUEFMX0NBTEwob3BhbF9wY2lfc2V0X3hpdmVfcmVpc3N1ZSwJCU9QQUxfUENJX1NFVF9YSVZFX1JFSVNTVUUpOworT1BBTF9DQUxMKG9wYWxfcGNpX3NldF94aXZlX3BlLAkJCU9QQUxfUENJX1NFVF9YSVZFX1BFKTsKK09QQUxfQ0FMTChvcGFsX2dldF94aXZlX3NvdXJjZSwJCQlPUEFMX0dFVF9YSVZFX1NPVVJDRSk7CitPUEFMX0NBTEwob3BhbF9nZXRfbXNpXzMyLAkJCU9QQUxfR0VUX01TSV8zMik7CitPUEFMX0NBTEwob3BhbF9nZXRfbXNpXzY0LAkJCU9QQUxfR0VUX01TSV82NCk7CitPUEFMX0NBTEwob3BhbF9zdGFydF9jcHUsCQkJT1BBTF9TVEFSVF9DUFUpOworT1BBTF9DQUxMKG9wYWxfcXVlcnlfY3B1X3N0YXR1cywJCU9QQUxfUVVFUllfQ1BVX1NUQVRVUyk7CitPUEFMX0NBTEwob3BhbF93cml0ZV9vcHBhbmVsLAkJCU9QQUxfV1JJVEVfT1BQQU5FTCk7CitPUEFMX0NBTEwob3BhbF9wY2lfbWFwX3BlX2RtYV93aW5kb3csCQlPUEFMX1BDSV9NQVBfUEVfRE1BX1dJTkRPVyk7CitPUEFMX0NBTEwob3BhbF9wY2lfbWFwX3BlX2RtYV93aW5kb3dfcmVhbCwJT1BBTF9QQ0lfTUFQX1BFX0RNQV9XSU5ET1dfUkVBTCk7CitPUEFMX0NBTEwob3BhbF9wY2lfcmVzZXQsCQkJT1BBTF9QQ0lfUkVTRVQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhMGRiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBQb3dlck5WIE9QQUwgaGlnaCBsZXZlbCBpbnRlcmZhY2VzCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJwb3dlcm52LmgiCisKK3N0cnVjdCBvcGFsIHsKKwl1NjQgYmFzZTsKKwl1NjQgZW50cnk7Cit9IG9wYWw7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWxfbm9kZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sob3BhbF93cml0ZV9sb2NrKTsKK2V4dGVybiB1NjQgb3BhbF9tY19zZWNvbmRhcnlfaGFuZGxlcltdOworCitpbnQgX19pbml0IGVhcmx5X2luaXRfZHRfc2Nhbl9vcGFsKHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLCB2b2lkICpkYXRhKQoreworCWNvbnN0IHZvaWQgKmJhc2VwLCAqZW50cnlwOworCXVuc2lnbmVkIGxvbmcgYmFzZXN6LCBlbnRyeXN6OworCXU2NCBnbHVlOworCisJaWYgKGRlcHRoICE9IDEgfHwgc3RyY21wKHVuYW1lLCAiaWJtLG9wYWwiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWJhc2VwICA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgIm9wYWwtYmFzZS1hZGRyZXNzIiwgJmJhc2Vzeik7CisJZW50cnlwID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAib3BhbC1lbnRyeS1hZGRyZXNzIiwgJmVudHJ5c3opOworCisJaWYgKCFiYXNlcCB8fCAhZW50cnlwKQorCQlyZXR1cm4gMTsKKworCW9wYWwuYmFzZSA9IG9mX3JlYWRfbnVtYmVyKGJhc2VwLCBiYXNlc3ovNCk7CisJb3BhbC5lbnRyeSA9IG9mX3JlYWRfbnVtYmVyKGVudHJ5cCwgZW50cnlzei80KTsKKworCXByX2RlYnVnKCJPUEFMIEJhc2UgID0gMHglbGx4IChiYXNlcD0lcCBiYXNlc3o9JWxkKVxuIiwKKwkJIG9wYWwuYmFzZSwgYmFzZXAsIGJhc2Vzeik7CisJcHJfZGVidWcoIk9QQUwgRW50cnkgPSAweCVsbHggKGVudHJ5cD0lcCBiYXNlc3o9JWxkKVxuIiwKKwkJIG9wYWwuZW50cnksIGVudHJ5cCwgZW50cnlzeik7CisKKwlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfT1BBTDsKKwlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsICJpYm0sb3BhbC12MiIpKSB7CisJCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9PUEFMdjI7CisJCXByaW50aygiT1BBTCBWMiBkZXRlY3RlZCAhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoIk9QQUwgVjEgZGV0ZWN0ZWQgIVxuIik7CisJfQorCisJLyogSG9va3VwIHNvbWUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXZSB1c2UgdGhlIGZ3bm1pIGFyZWEgYXQgMHg3MDAwCisJICogdG8gcHJvdmlkZSB0aGUgZ2x1ZSBzcGFjZSB0byBPUEFMCisJICovCisJZ2x1ZSA9IDB4NzAwMDsKKwlvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyKE9QQUxfTUFDSElORV9DSEVDS19IQU5ETEVSLAorCQkJCQlfX3BhKG9wYWxfbWNfc2Vjb25kYXJ5X2hhbmRsZXJbMF0pLAorCQkJCQlnbHVlKTsKKwlnbHVlICs9IDEyODsKKwlvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyKE9QQUxfSFlQRVJWSVNPUl9NQUlOVEVOQU5DRV9IQU5ETEVSLAorCQkJCQkwLCBnbHVlKTsKKwlnbHVlICs9IDEyODsKKwlvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyKE9QQUxfU09GVFBBVENIX0hBTkRMRVIsIDAsIGdsdWUpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBvcGFsX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzNjQgbGVuLCByYzsKKwl1NjQgZXZ0OworCisJaWYgKCFvcGFsLmVudHJ5KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlvcGFsX3BvbGxfZXZlbnRzKCZldnQpOworCWlmICgoZXZ0ICYgT1BBTF9FVkVOVF9DT05TT0xFX0lOUFVUKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlsZW4gPSBjb3VudDsKKwlyYyA9IG9wYWxfY29uc29sZV9yZWFkKHZ0ZXJtbm8sICZsZW4sIGJ1Zik7CisJaWYgKHJjID09IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIGxlbjsKKwlyZXR1cm4gMDsKK30KKworaW50IG9wYWxfcHV0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNvbnN0IGNoYXIgKmRhdGEsIGludCB0b3RhbF9sZW4pCit7CisJaW50IHdyaXR0ZW4gPSAwOworCXM2NCBsZW4sIHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IGV2dDsKKworCWlmICghb3BhbC5lbnRyeSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXZSB3YW50IHB1dF9jaGFycyB0byBiZSBhdG9taWMgdG8gYXZvaWQgbWFuZ2xpbmcgb2YgaHZzaQorCSAqIHBhY2tldHMuIFRvIGRvIHRoYXQsIHdlIGZpcnN0IHRlc3QgZm9yIHJvb20gYW5kIHJldHVybgorCSAqIC1FQUdBSU4gaWYgdGhlcmUgaXNuJ3QgZW5vdWdoLgorCSAqCisJICogVW5mb3J0dW5hdGVseSwgb3BhbF9jb25zb2xlX3dyaXRlX2J1ZmZlcl9zcGFjZSgpIGRvZXNuJ3QKKwkgKiBhcHBlYXIgdG8gd29yayBvbiBvcGFsIHYxLCBzbyB3ZSBqdXN0IGFzc3VtZSB0aGVyZSBpcworCSAqIGVub3VnaCByb29tIGFuZCBiZSBkb25lIHdpdGggaXQKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3BhbF93cml0ZV9sb2NrLCBmbGFncyk7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkgeworCQlyYyA9IG9wYWxfY29uc29sZV93cml0ZV9idWZmZXJfc3BhY2UodnRlcm1ubywgJmxlbik7CisJCWlmIChyYyB8fCBsZW4gPCB0b3RhbF9sZW4pIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wYWxfd3JpdGVfbG9jaywgZmxhZ3MpOworCQkJLyogQ2xvc2VkIC0+IGRyb3AgY2hhcmFjdGVycyAqLworCQkJaWYgKHJjKQorCQkJCXJldHVybiB0b3RhbF9sZW47CisJCQlvcGFsX3BvbGxfZXZlbnRzKCZldnQpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwkvKiBXZSBzdGlsbCB0cnkgdG8gaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbnMsIHRob3VnaCB0aGV5CisJICogc2hvdWxkIG5vIGxvbmdlciBoYXBwZW4uCisJICovCisJcmMgPSBPUEFMX0JVU1k7CisJd2hpbGUodG90YWxfbGVuID4gMCAmJiAocmMgPT0gT1BBTF9CVVNZIHx8CisJCQkJcmMgPT0gT1BBTF9CVVNZX0VWRU5UIHx8IHJjID09IE9QQUxfU1VDQ0VTUykpIHsKKwkJbGVuID0gdG90YWxfbGVuOworCQlyYyA9IG9wYWxfY29uc29sZV93cml0ZSh2dGVybW5vLCAmbGVuLCBkYXRhKTsKKwkJaWYgKHJjID09IE9QQUxfU1VDQ0VTUykgeworCQkJdG90YWxfbGVuIC09IGxlbjsKKwkJCWRhdGEgKz0gbGVuOworCQkJd3JpdHRlbiArPSBsZW47CisJCX0KKwkJLyogVGhpcyBpcyBhIGJpdCBuYXN0eSBidXQgd2UgbmVlZCB0aGF0IGZvciB0aGUgY29uc29sZSB0bworCQkgKiBmbHVzaCB3aGVuIHRoZXJlIGFyZW4ndCBhbnkgaW50ZXJydXB0cy4gV2Ugd2lsbCBjbGVhbgorCQkgKiB0aGluZ3MgYSBiaXQgbGF0ZXIgdG8gbGltaXQgdGhhdCB0byBzeW5jaHJvbm91cyBwYXRoCisJCSAqIHN1Y2ggYXMgdGhlIGtlcm5lbCBjb25zb2xlIGFuZCB4bW9uL3VkYmcKKwkJICovCisJCWRvCisJCQlvcGFsX3BvbGxfZXZlbnRzKCZldnQpOworCQl3aGlsZShyYyA9PSBPUEFMX1NVQ0NFU1MgJiYgKGV2dCAmIE9QQUxfRVZFTlRfQ09OU09MRV9PVVRQVVQpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BhbF93cml0ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHdyaXR0ZW47Cit9CisKK2ludCBvcGFsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9wYWxfbWFjaGluZV9jaGVja19ldmVudCAqb3BhbF9ldnQgPSBnZXRfcGFjYSgpLT5vcGFsX21jX2V2dDsKKwlzdHJ1Y3Qgb3BhbF9tYWNoaW5lX2NoZWNrX2V2ZW50IGV2dDsKKwljb25zdCBjaGFyICpsZXZlbCwgKnNldnN0ciwgKnN1YnR5cGU7CisJc3RhdGljIGNvbnN0IGNoYXIgKm9wYWxfbWNfdWVfdHlwZXNbXSA9IHsKKwkJIkluZGV0ZXJtaW5hdGUiLAorCQkiSW5zdHJ1Y3Rpb24gZmV0Y2giLAorCQkiUGFnZSB0YWJsZSB3YWxrIGlmZXRjaCIsCisJCSJMb2FkL1N0b3JlIiwKKwkJIlBhZ2UgdGFibGUgd2FsayBMb2FkL1N0b3JlIiwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICpvcGFsX21jX3NsYl90eXBlc1tdID0geworCQkiSW5kZXRlcm1pbmF0ZSIsCisJCSJQYXJpdHkiLAorCQkiTXVsdGloaXQiLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm9wYWxfbWNfZXJhdF90eXBlc1tdID0geworCQkiSW5kZXRlcm1pbmF0ZSIsCisJCSJQYXJpdHkiLAorCQkiTXVsdGloaXQiLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm9wYWxfbWNfdGxiX3R5cGVzW10gPSB7CisJCSJJbmRldGVybWluYXRlIiwKKwkJIlBhcml0eSIsCisJCSJNdWx0aWhpdCIsCisJfTsKKworCS8qIENvcHkgdGhlIGV2ZW50IHN0cnVjdHVyZSBhbmQgcmVsZWFzZSB0aGUgb3JpZ2luYWwgKi8KKwlldnQgPSAqb3BhbF9ldnQ7CisJb3BhbF9ldnQtPmluX3VzZSA9IDA7CisKKwkvKiBQcmludCB0aGluZ3Mgb3V0ICovCisJaWYgKGV2dC52ZXJzaW9uICE9IE9wYWxNQ0VfVjEpIHsKKwkJcHJfZXJyKCJNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiwgVW5rbm93biBldmVudCB2ZXJzaW9uICVkICFcbiIsCisJCSAgICAgICBldnQudmVyc2lvbik7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2goZXZ0LnNldmVyaXR5KSB7CisJY2FzZSBPcGFsTUNFX1NFVl9OT19FUlJPUjoKKwkJbGV2ZWwgPSBLRVJOX0lORk87CisJCXNldnN0ciA9ICJIYXJtbGVzcyI7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9TRVZfV0FSTklORzoKKwkJbGV2ZWwgPSBLRVJOX1dBUk5JTkc7CisJCXNldnN0ciA9ICIiOworCQlicmVhazsKKwljYXNlIE9wYWxNQ0VfU0VWX0VSUk9SX1NZTkM6CisJCWxldmVsID0gS0VSTl9FUlI7CisJCXNldnN0ciA9ICJTZXZlcmUiOworCQlicmVhazsKKwljYXNlIE9wYWxNQ0VfU0VWX0ZBVEFMOgorCWRlZmF1bHQ6CisJCWxldmVsID0gS0VSTl9FUlI7CisJCXNldnN0ciA9ICJGYXRhbCI7CisJCWJyZWFrOworCX0KKworCXByaW50aygiJXMlcyBNYWNoaW5lIGNoZWNrIGludGVycnVwdCBbJXNdXG4iLCBsZXZlbCwgc2V2c3RyLAorCSAgICAgICBldnQuZGlzcG9zaXRpb24gPT0gT3BhbE1DRV9ESVNQT1NJVElPTl9SRUNPVkVSRUQgPworCSAgICAgICAiUmVjb3ZlcmVkIiA6ICJbTm90IHJlY292ZXJlZCIpOworCXByaW50aygiJXMgIEluaXRpYXRvcjogJXNcbiIsIGxldmVsLAorCSAgICAgICBldnQuaW5pdGlhdG9yID09IE9wYWxNQ0VfSU5JVElBVE9SX0NQVSA/ICJDUFUiIDogIlVua25vd24iKTsKKwlzd2l0Y2goZXZ0LmVycm9yX3R5cGUpIHsKKwljYXNlIE9wYWxNQ0VfRVJST1JfVFlQRV9VRToKKwkJc3VidHlwZSA9IGV2dC51LnVlX2Vycm9yLnVlX2Vycm9yX3R5cGUgPAorCQkJQVJSQVlfU0laRShvcGFsX21jX3VlX3R5cGVzKSA/CisJCQlvcGFsX21jX3VlX3R5cGVzW2V2dC51LnVlX2Vycm9yLnVlX2Vycm9yX3R5cGVdCisJCQk6ICJVbmtub3duIjsKKwkJcHJpbnRrKCIlcyAgRXJyb3IgdHlwZTogVUUgWyVzXVxuIiwgbGV2ZWwsIHN1YnR5cGUpOworCQlpZiAoZXZ0LnUudWVfZXJyb3IuZWZmZWN0aXZlX2FkZHJlc3NfcHJvdmlkZWQpCisJCQlwcmludGsoIiVzICAgIEVmZmVjdGl2ZSBhZGRyZXNzOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIGxldmVsLCBldnQudS51ZV9lcnJvci5lZmZlY3RpdmVfYWRkcmVzcyk7CisJCWlmIChldnQudS51ZV9lcnJvci5waHlzaWNhbF9hZGRyZXNzX3Byb3ZpZGVkKQorCQkJcHJpbnRrKCIlcyAgICAgIFBoeXNpYWwgYWRkcmVzczogJTAxNmxseFxuIiwKKwkJCSAgICAgICBsZXZlbCwgZXZ0LnUudWVfZXJyb3IucGh5c2ljYWxfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9FUlJPUl9UWVBFX1NMQjoKKwkJc3VidHlwZSA9IGV2dC51LnNsYl9lcnJvci5zbGJfZXJyb3JfdHlwZSA8CisJCQlBUlJBWV9TSVpFKG9wYWxfbWNfc2xiX3R5cGVzKSA/CisJCQlvcGFsX21jX3NsYl90eXBlc1tldnQudS5zbGJfZXJyb3Iuc2xiX2Vycm9yX3R5cGVdCisJCQk6ICJVbmtub3duIjsKKwkJcHJpbnRrKCIlcyAgRXJyb3IgdHlwZTogU0xCIFslc11cbiIsIGxldmVsLCBzdWJ0eXBlKTsKKwkJaWYgKGV2dC51LnNsYl9lcnJvci5lZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZCkKKwkJCXByaW50aygiJXMgICAgRWZmZWN0aXZlIGFkZHJlc3M6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgbGV2ZWwsIGV2dC51LnNsYl9lcnJvci5lZmZlY3RpdmVfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgT3BhbE1DRV9FUlJPUl9UWVBFX0VSQVQ6CisJCXN1YnR5cGUgPSBldnQudS5lcmF0X2Vycm9yLmVyYXRfZXJyb3JfdHlwZSA8CisJCQlBUlJBWV9TSVpFKG9wYWxfbWNfZXJhdF90eXBlcykgPworCQkJb3BhbF9tY19lcmF0X3R5cGVzW2V2dC51LmVyYXRfZXJyb3IuZXJhdF9lcnJvcl90eXBlXQorCQkJOiAiVW5rbm93biI7CisJCXByaW50aygiJXMgIEVycm9yIHR5cGU6IEVSQVQgWyVzXVxuIiwgbGV2ZWwsIHN1YnR5cGUpOworCQlpZiAoZXZ0LnUuZXJhdF9lcnJvci5lZmZlY3RpdmVfYWRkcmVzc19wcm92aWRlZCkKKwkJCXByaW50aygiJXMgICAgRWZmZWN0aXZlIGFkZHJlc3M6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgbGV2ZWwsIGV2dC51LmVyYXRfZXJyb3IuZWZmZWN0aXZlX2FkZHJlc3MpOworCQlicmVhazsKKwljYXNlIE9wYWxNQ0VfRVJST1JfVFlQRV9UTEI6CisJCXN1YnR5cGUgPSBldnQudS50bGJfZXJyb3IudGxiX2Vycm9yX3R5cGUgPAorCQkJQVJSQVlfU0laRShvcGFsX21jX3RsYl90eXBlcykgPworCQkJb3BhbF9tY190bGJfdHlwZXNbZXZ0LnUudGxiX2Vycm9yLnRsYl9lcnJvcl90eXBlXQorCQkJOiAiVW5rbm93biI7CisJCXByaW50aygiJXMgIEVycm9yIHR5cGU6IFRMQiBbJXNdXG4iLCBsZXZlbCwgc3VidHlwZSk7CisJCWlmIChldnQudS50bGJfZXJyb3IuZWZmZWN0aXZlX2FkZHJlc3NfcHJvdmlkZWQpCisJCQlwcmludGsoIiVzICAgIEVmZmVjdGl2ZSBhZGRyZXNzOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIGxldmVsLCBldnQudS50bGJfZXJyb3IuZWZmZWN0aXZlX2FkZHJlc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgT3BhbE1DRV9FUlJPUl9UWVBFX1VOS05PV046CisJCXByaW50aygiJXMgIEVycm9yIHR5cGU6IFVua25vd25cbiIsIGxldmVsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBldnQuc2V2ZXJpdHkgPT0gT3BhbE1DRV9TRVZfRkFUQUwgPyAwIDogMTsKK30KKworc3RhdGljIGlycXJldHVybl90IG9wYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJdWludDY0X3QgZXZlbnRzOworCisJb3BhbF9oYW5kbGVfaW50ZXJydXB0KHZpcnFfdG9faHcoaXJxKSwgJmV2ZW50cyk7CisKKwkvKiBYWFggVE9ETzogRG8gc29tZXRoaW5nIHdpdGggdGhlIGV2ZW50cyAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvcGFsX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqY29uc29sZXM7CisJY29uc3QgdTMyICppcnFzOworCWludCByYywgaSwgaXJxbGVuOworCisJb3BhbF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbCIpOworCWlmICghb3BhbF9ub2RlKSB7CisJCXByX3dhcm4oIm9wYWw6IE5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUx2MikpCisJCWNvbnNvbGVzID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbC9jb25zb2xlcyIpOworCWVsc2UKKwkJY29uc29sZXMgPSBvZl9ub2RlX2dldChvcGFsX25vZGUpOworCisJLyogUmVnaXN0ZXIgc2VyaWFsIHBvcnRzICovCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShjb25zb2xlcywgbnApIHsKKwkJaWYgKHN0cmNtcChucC0+bmFtZSwgInNlcmlhbCIpKQorCQkJY29udGludWU7CisJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsIE5VTEwsIE5VTEwpOworCX0KKwlvZl9ub2RlX3B1dChjb25zb2xlcyk7CisKKwkvKiBGaW5kIGFsbCBPUEFMIGludGVycnVwdHMgYW5kIHJlcXVlc3QgdGhlbSAqLworCWlycXMgPSBvZl9nZXRfcHJvcGVydHkob3BhbF9ub2RlLCAib3BhbC1pbnRlcnJ1cHRzIiwgJmlycWxlbik7CisJcHJfZGVidWcoIm9wYWw6IEZvdW5kICVkIGludGVycnVwdHMgcmVzZXJ2ZWQgZm9yIE9QQUxcbiIsCisJCSBpcnFzID8gKGlycWxlbiAvIDQpIDogMCk7CisJZm9yIChpID0gMDsgaXJxcyAmJiBpIDwgKGlycWxlbiAvIDQpOyBpKyssIGlycXMrKykgeworCQl1bnNpZ25lZCBpbnQgaHdpcnEgPSBiZTMyX3RvX2NwdXAoaXJxcyk7CisJCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaHdpcnEpOworCQlpZiAoaXJxID09IE5PX0lSUSkgeworCQkJcHJfd2FybmluZygib3BhbDogRmFpbGVkIHRvIG1hcCBpcnEgMHgleFxuIiwgaHdpcnEpOworCQkJY29udGludWU7CisJCX0KKwkJcmMgPSByZXF1ZXN0X2lycShpcnEsIG9wYWxfaW50ZXJydXB0LCAwLCAib3BhbCIsIE5VTEwpOworCQlpZiAocmMpCisJCQlwcl93YXJuaW5nKCJvcGFsOiBFcnJvciAlZCByZXF1ZXN0aW5nIGlycSAlZCIKKwkJCQkgICAiICgweCV4KVxuIiwgcmMsIGlycSwgaHdpcnEpOworCX0KKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbChvcGFsX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1wNWlvYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktcDVpb2MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MGY3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktcDVpb2MyLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBTdXBwb3J0IFBDSS9QQ0llIG9uIFBvd2VyTlYgcGxhdGZvcm1zCisgKgorICogQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgUDVJT0MyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3RjZS5oPgorI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgorCisjaW5jbHVkZSAicG93ZXJudi5oIgorI2luY2x1ZGUgInBjaS5oIgorCisvKiBGb3Igbm93LCB1c2UgYSBmaXhlZCBhbW91bnQgb2YgVENFIG1lbW9yeSBmb3IgZWFjaCBwNWlvYzIKKyAqIGh1YiwgMTZNIHdpbGwgZG8KKyAqLworI2RlZmluZSBQNUlPQzJfVENFX01FTU9SWQkweDAxMDAwMDAwCisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIGludCBwbnZfcGNpX3A1aW9jMl9tc2lfc2V0dXAoc3RydWN0IHBudl9waGIgKnBoYiwgc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IGh3aXJxLCB1bnNpZ25lZCBpbnQgaXNfNjQsCisJCQkJICAgIHN0cnVjdCBtc2lfbXNnICptc2cpCit7CisJaWYgKFdBUk5fT04oIWlzXzY0KSkKKwkJcmV0dXJuIC1FTlhJTzsKKwltc2ctPmRhdGEgPSBod2lycSAtIHBoYi0+bXNpX2Jhc2U7CisJbXNnLT5hZGRyZXNzX2hpID0gMHgxMDAwMDAwMDsKKwltc2ctPmFkZHJlc3NfbG8gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9wY2lfaW5pdF9wNWlvYzJfbXNpcyhzdHJ1Y3QgcG52X3BoYiAqcGhiKQoreworCXVuc2lnbmVkIGludCBibWFwX3NpemU7CisJY29uc3QgX19iZTMyICpwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHBoYi0+aG9zZS0+ZG4sCisJCQkJCSAgICAgImlibSxvcGFsLW1zaS1yYW5nZXMiLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCS8qIERvbid0IGRvIE1TSSdzIG9uIHA1aW9jMiBQQ0ktWCBhcmUgdGhleSBhcmUgbm90IHByb3Blcmx5CisJICogdmVyaWZpZWQgaW4gSFcKKwkgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGhiLT5ob3NlLT5kbiwgImlibSxwNWlvYzItcGNpeCIpKQorCQlyZXR1cm47CisJcGhiLT5tc2lfYmFzZSA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwlwaGItPm1zaV9jb3VudCA9IGJlMzJfdG9fY3B1cChwcm9wICsgMSk7CisJYm1hcF9zaXplID0gQklUU19UT19MT05HUyhwaGItPm1zaV9jb3VudCkgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJcGhiLT5tc2lfbWFwID0gemFsbG9jX21heWJlX2Jvb3RtZW0oYm1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoYi0+bXNpX21hcCkgeworCQlwcl9lcnIoIlBDSSAlZDogRmFpbGVkIHRvIGFsbG9jYXRlIE1TSSBiaXRtYXAgIVxuIiwKKwkJICAgICAgIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlcik7CisJCXJldHVybjsKKwl9CisJcGhiLT5tc2lfc2V0dXAgPSBwbnZfcGNpX3A1aW9jMl9tc2lfc2V0dXA7CisJcGhiLT5tc2kzMl9zdXBwb3J0ID0gMDsKKwlwcl9pbmZvKCIgQWxsb2NhdGVkIGJpdG1hcCBmb3IgJWQgTVNJcyAoYmFzZSBJUlEgMHgleClcbiIsCisJCXBoYi0+bXNpX2NvdW50LCBwaGItPm1zaV9iYXNlKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBwbnZfcGNpX2luaXRfcDVpb2MyX21zaXMoc3RydWN0IHBudl9waGIgKnBoYikgeyB9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9wY2lfcDVpb2MyX2RtYV9kZXZfc2V0dXAoc3RydWN0IHBudl9waGIgKnBoYiwKKwkJCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwaGItPnA1aW9jMi5pb21tdV90YWJsZS5pdF9tYXAgPT0gTlVMTCkKKwkJaW9tbXVfaW5pdF90YWJsZSgmcGhiLT5wNWlvYzIuaW9tbXVfdGFibGUsIHBoYi0+aG9zZS0+bm9kZSk7CisKKwlzZXRfaW9tbXVfdGFibGVfYmFzZSgmcGRldi0+ZGV2LCAmcGhiLT5wNWlvYzIuaW9tbXVfdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcG52X3BjaV9pbml0X3A1aW9jMl9waGIoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgdm9pZCAqdGNlX21lbSwgdTY0IHRjZV9zaXplKQoreworCXN0cnVjdCBwbnZfcGhiICpwaGI7CisJY29uc3QgdTY0ICpwcm9wNjQ7CisJdTY0IHBoYl9pZDsKKwlpbnQ2NF90IHJjOworCXN0YXRpYyBpbnQgcHJpbWFyeSA9IDE7CisKKwlwcl9pbmZvKCIgSW5pdGlhbGl6aW5nIHA1aW9jMiBQSEIgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCisJcHJvcDY0ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLG9wYWwtcGhiaWQiLCBOVUxMKTsKKwlpZiAoIXByb3A2NCkgeworCQlwcl9lcnIoIiAgTWlzc2luZyBcImlibSxvcGFsLXBoYmlkXCIgcHJvcGVydHkgIVxuIik7CisJCXJldHVybjsKKwl9CisJcGhiX2lkID0gYmU2NF90b19jcHVwKHByb3A2NCk7CisJcHJfZGV2ZWwoIiAgUEhCLUlEICA6IDB4JTAxNmxseFxuIiwgcGhiX2lkKTsKKwlwcl9kZXZlbCgiICBUQ0UgQVQgIDogMHglMDE2bHhcbiIsIF9fcGEodGNlX21lbSkpOworCXByX2RldmVsKCIgIFRDRSBTWiAgOiAweCUwMTZsbHhcbiIsIHRjZV9zaXplKTsKKworCXJjID0gb3BhbF9wY2lfc2V0X3BoYl90Y2VfbWVtb3J5KHBoYl9pZCwgX19wYSh0Y2VfbWVtKSwgdGNlX3NpemUpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIgIEZhaWxlZCB0byBzZXQgVENFIG1lbW9yeSwgT1BBTCBlcnJvciAlbGxkXG4iLCByYyk7CisJCXJldHVybjsKKwl9CisKKwlwaGIgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgcG52X3BoYikpOworCWlmIChwaGIpIHsKKwkJbWVtc2V0KHBoYiwgMCwgc2l6ZW9mKHN0cnVjdCBwbnZfcGhiKSk7CisJCXBoYi0+aG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihucCk7CisJfQorCWlmICghcGhiIHx8ICFwaGItPmhvc2UpIHsKKwkJcHJfZXJyKCIgIEZhaWxlZCB0byBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmcGhiLT5sb2NrKTsKKwlwaGItPmhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlwaGItPmhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCXBoYi0+aG9zZS0+cHJpdmF0ZV9kYXRhID0gcGhiOworCXBoYi0+b3BhbF9pZCA9IHBoYl9pZDsKKwlwaGItPnR5cGUgPSBQTlZfUEhCX1A1SU9DMjsKKworCXBoYi0+cmVncyA9IG9mX2lvbWFwKG5wLCAwKTsKKworCWlmIChwaGItPnJlZ3MgPT0gTlVMTCkKKwkJcHJfZXJyKCIgIEZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzICFcbiIpOworCWVsc2UgeworCQlwcl9kZXZlbCgiICBQX0JVSUQgICAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MTAwKSk7CisJCXByX2RldmVsKCIgIFBfSU9TWiAgICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgxYjApKTsKKwkJcHJfZGV2ZWwoIiAgUF9JT19TVCAgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDFlMCkpOworCQlwcl9kZXZlbCgiICBQX01FTTFfSCAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MWEwKSk7CisJCXByX2RldmVsKCIgIFBfTUVNMV9MICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgxOTApKTsKKwkJcHJfZGV2ZWwoIiAgUF9NU1oxX0wgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDFjMCkpOworCQlwcl9kZXZlbCgiICBQX01FTV9TVCAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MWQwKSk7CisJCXByX2RldmVsKCIgIFBfTUVNMl9IICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgyYzApKTsKKwkJcHJfZGV2ZWwoIiAgUF9NRU0yX0wgICA9IDB4JTA4eFxuIiwgaW5fYmUzMihwaGItPnJlZ3MgKyAweDJiMCkpOworCQlwcl9kZXZlbCgiICBQX01TWjJfSCAgID0gMHglMDh4XG4iLCBpbl9iZTMyKHBoYi0+cmVncyArIDB4MmQwKSk7CisJCXByX2RldmVsKCIgIFBfTVNaMl9MICAgPSAweCUwOHhcbiIsIGluX2JlMzIocGhiLT5yZWdzICsgMHgyZTApKTsKKwl9CisKKwkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCisJLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGItPmhvc2UsIG5wLCBwcmltYXJ5KTsKKwlwcmltYXJ5ID0gMDsKKworCXBoYi0+aG9zZS0+b3BzID0gJnBudl9wY2lfb3BzOworCisJLyogU2V0dXAgTVNJIHN1cHBvcnQgKi8KKwlwbnZfcGNpX2luaXRfcDVpb2MyX21zaXMocGhiKTsKKworCS8qIFNldHVwIFRDRXMgKi8KKwlwaGItPmRtYV9kZXZfc2V0dXAgPSBwbnZfcGNpX3A1aW9jMl9kbWFfZGV2X3NldHVwOworCXBudl9wY2lfc2V0dXBfaW9tbXVfdGFibGUoJnBoYi0+cDVpb2MyLmlvbW11X3RhYmxlLAorCQkJCSAgdGNlX21lbSwgdGNlX3NpemUsIDApOworfQorCit2b2lkIF9faW5pdCBwbnZfcGNpX2luaXRfcDVpb2MyX2h1YihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGhibjsKKwljb25zdCB1NjQgKnByb3A2NDsKKwl1NjQgaHViX2lkOworCXZvaWQgKnRjZV9tZW07CisJdWludDY0X3QgdGNlX3Blcl9waGI7CisJaW50NjRfdCByYzsKKwlpbnQgcGhiX2NvdW50ID0gMDsKKworCXByX2luZm8oIlByb2JpbmcgcDVpb2MyIElPLUh1YiAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisKKwlwcm9wNjQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sb3BhbC1odWJpZCIsIE5VTEwpOworCWlmICghcHJvcDY0KSB7CisJCXByX2VycigiIE1pc3NpbmcgXCJpYm0sb3BhbC1odWJpZFwiIHByb3BlcnR5ICFcbiIpOworCQlyZXR1cm47CisJfQorCWh1Yl9pZCA9IGJlNjRfdG9fY3B1cChwcm9wNjQpOworCXByX2luZm8oIiBIVUItSUQgOiAweCUwMTZsbHhcbiIsIGh1Yl9pZCk7CisKKwkvKiBDdXJyZW50bHkgYWxsb2NhdGUgMTZNIG9mIFRDRSBtZW1vcnkgZm9yIGV2ZXJ5IEh1YgorCSAqCisJICogWFhYIFRPRE86IE1ha2UgaXQgY2hpcCBsb2NhbCBpZiBwb3NzaWJsZQorCSAqLworCXRjZV9tZW0gPSBfX2FsbG9jX2Jvb3RtZW0oUDVJT0MyX1RDRV9NRU1PUlksIFA1SU9DMl9UQ0VfTUVNT1JZLAorCQkJCSAgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKKwlpZiAoIXRjZV9tZW0pIHsKKwkJcHJfZXJyKCIgRmFpbGVkIHRvIGFsbG9jYXRlIFRDRSBNZW1vcnkgIVxuIik7CisJCXJldHVybjsKKwl9CisJcHJfZGVidWcoIiBUQ0UgICAgOiAweCUwMTZseC4uMHglMDE2bHhcbiIsCisJCV9fcGEodGNlX21lbSksIF9fcGEodGNlX21lbSkgKyBQNUlPQzJfVENFX01FTU9SWSAtIDEpOworCXJjID0gb3BhbF9wY2lfc2V0X2h1Yl90Y2VfbWVtb3J5KGh1Yl9pZCwgX19wYSh0Y2VfbWVtKSwKKwkJCQkJUDVJT0MyX1RDRV9NRU1PUlkpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIgRmFpbGVkIHRvIGFsbG9jYXRlIFRDRSBtZW1vcnksIE9QQUwgZXJyb3IgJWxsZFxuIiwgcmMpOworCQlyZXR1cm47CisJfQorCisJLyogQ291bnQgY2hpbGQgUEhCcyAqLworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIHBoYm4pIHsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBoYm4sICJpYm0scDVpb2MyLXBjaXgiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGhibiwgImlibSxwNWlvYzItcGNpZXgiKSkKKwkJCXBoYl9jb3VudCsrOworCX0KKworCS8qIENhbGN1bGF0ZSBob3cgbXVjaCBUQ0Ugc3BhY2Ugd2UgY2FuIGdpdmUgcGVyIFBIQiAqLworCXRjZV9wZXJfcGhiID0gX19yb3VuZGRvd25fcG93X29mX3R3byhQNUlPQzJfVENFX01FTU9SWSAvIHBoYl9jb3VudCk7CisJcHJfaW5mbygiIEFsbG9jYXRpbmcgJWxsZCBNQiBvZiBUQ0UgbWVtb3J5IHBlciBQSEJcbiIsCisJCXRjZV9wZXJfcGhiID4+IDIwKTsKKworCS8qIEluaXRpYWxpemUgUEhCcyAqLworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIHBoYm4pIHsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBoYm4sICJpYm0scDVpb2MyLXBjaXgiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGhibiwgImlibSxwNWlvYzItcGNpZXgiKSkgeworCQkJcG52X3BjaV9pbml0X3A1aW9jMl9waGIocGhibiwgdGNlX21lbSwgdGNlX3Blcl9waGIpOworCQkJdGNlX21lbSArPSB0Y2VfcGVyX3BoYjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJiNjZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jCkBAIC0wLDAgKzEsNDI3IEBACisvKgorICogU3VwcG9ydCBQQ0kvUENJZSBvbiBQb3dlck5WIHBsYXRmb3JtcworICoKKyAqIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IFA1SU9DMgorICoKKyAqIENvcHlyaWdodCAyMDExIEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS90Y2UuaD4KKyNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KKworI2luY2x1ZGUgInBvd2VybnYuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworLyogRGVsYXkgaW4gdXNlYyAqLworI2RlZmluZSBQQ0lfUkVTRVRfREVMQVlfVVMJMzAwMDAwMAorCisjZGVmaW5lIGNmZ19kYmcoZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkKKy8vI2RlZmluZSBjZmdfZGJnKGZtdC4uLikJcHJpbnRrKGZtdCkKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgaW50IHBudl9tc2lfY2hlY2tfZGV2aWNlKHN0cnVjdCBwY2lfZGV2KiBwZGV2LCBpbnQgbnZlYywgaW50IHR5cGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisJc3RydWN0IHBudl9waGIgKnBoYiA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiAocGhiICYmIHBoYi0+bXNpX21hcCkgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwbnZfZ2V0X29uZV9tc2koc3RydWN0IHBudl9waGIgKnBoYikKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlzcGluX2xvY2soJnBoYi0+bG9jayk7CisJaWQgPSBmaW5kX25leHRfemVyb19iaXQocGhiLT5tc2lfbWFwLCBwaGItPm1zaV9jb3VudCwgcGhiLT5tc2lfbmV4dCk7CisJaWYgKGlkID49IHBoYi0+bXNpX2NvdW50ICYmIHBoYi0+bXNpX25leHQpCisJCWlkID0gZmluZF9uZXh0X3plcm9fYml0KHBoYi0+bXNpX21hcCwgcGhiLT5tc2lfY291bnQsIDApOworCWlmIChpZCA+PSBwaGItPm1zaV9jb3VudCkgeworCQlzcGluX3VubG9jaygmcGhiLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCV9fc2V0X2JpdChpZCwgcGhiLT5tc2lfbWFwKTsKKwlzcGluX3VubG9jaygmcGhiLT5sb2NrKTsKKwlyZXR1cm4gaWQgKyBwaGItPm1zaV9iYXNlOworfQorCitzdGF0aWMgdm9pZCBwbnZfcHV0X21zaShzdHJ1Y3QgcG52X3BoYiAqcGhiLCB1bnNpZ25lZCBpbnQgaHdpcnEpCit7CisJdW5zaWduZWQgaW50IGlkOworCisJaWYgKFdBUk5fT04oaHdpcnEgPCBwaGItPm1zaV9iYXNlIHx8CisJCSAgICBod2lycSA+PSAocGhiLT5tc2lfYmFzZSArIHBoYi0+bXNpX2NvdW50KSkpCisJCXJldHVybjsKKwlpZCA9IGh3aXJxIC0gcGhiLT5tc2lfYmFzZTsKKwlzcGluX2xvY2soJnBoYi0+bG9jayk7CisJX19jbGVhcl9iaXQoaWQsIHBoYi0+bXNpX21hcCk7CisJc3Bpbl91bmxvY2soJnBoYi0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcG52X3NldHVwX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnZlYywgaW50IHR5cGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisJc3RydWN0IHBudl9waGIgKnBoYiA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCXN0cnVjdCBtc2lfbXNnIG1zZzsKKwl1bnNpZ25lZCBpbnQgaHdpcnEsIHZpcnE7CisJaW50IHJjOworCisJaWYgKFdBUk5fT04oIXBoYikpCisJCXJldHVybiAtRU5PREVWOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnBkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCWlmICghZW50cnktPm1zaV9hdHRyaWIuaXNfNjQgJiYgIXBoYi0+bXNpMzJfc3VwcG9ydCkgeworCQkJcHJfd2FybigiJXM6IFN1cHBvcnRzIG9ubHkgNjQtYml0IE1TSXNcbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlod2lycSA9IHBudl9nZXRfb25lX21zaShwaGIpOworCQlpZiAoIWh3aXJxKSB7CisJCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIGZpbmQgYSBmcmVlIE1TSVxuIiwKKwkJCQlwY2lfbmFtZShwZGV2KSk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3aXJxKTsKKwkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7CisJCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIG1hcCBNU0kgdG8gbGludXggaXJxXG4iLAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJCXBudl9wdXRfbXNpKHBoYiwgaHdpcnEpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcmMgPSBwaGItPm1zaV9zZXR1cChwaGIsIHBkZXYsIGh3aXJxLCBlbnRyeS0+bXNpX2F0dHJpYi5pc182NCwKKwkJCQkgICAgJm1zZyk7CisJCWlmIChyYykgeworCQkJcHJfd2FybigiJXM6IEZhaWxlZCB0byBzZXR1cCBNU0lcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CisJCQlwbnZfcHV0X21zaShwaGIsIGh3aXJxKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpcnFfc2V0X21zaV9kZXNjKHZpcnEsIGVudHJ5KTsKKwkJd3JpdGVfbXNpX21zZyh2aXJxLCAmbXNnKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBudl90ZWFyZG93bl9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7CisKKwlpZiAoV0FSTl9PTighcGhiKSkKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnBkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKKwkJCWNvbnRpbnVlOworCQlpcnFfc2V0X21zaV9kZXNjKGVudHJ5LT5pcnEsIE5VTEwpOworCQlwbnZfcHV0X21zaShwaGIsIHZpcnFfdG9faHcoZW50cnktPmlycSkpOworCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGVudHJ5LT5pcnEpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCitzdGF0aWMgdm9pZCBwbnZfcGNpX2NvbmZpZ19jaGVja19lZWgoc3RydWN0IHBudl9waGIgKnBoYiwgc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQkgICAgIHUzMiBiZGZuKQoreworCXM2NAlyYzsKKwl1OAlmc3RhdGU7CisJdTE2CXBjaWVycjsKKwl1MzIJcGVfbm87CisKKwkvKiBHZXQgUEUjIGlmIHdlIHN1cHBvcnQgSU9EQSAqLworCXBlX25vID0gcGhiLT5iZGZuX3RvX3BlID8gcGhiLT5iZGZuX3RvX3BlKHBoYiwgYnVzLCBiZGZuICYgMHhmZikgOiAwOworCisJLyogUmVhZCBmcmVlemUgc3RhdHVzICovCisJcmMgPSBvcGFsX3BjaV9lZWhfZnJlZXplX3N0YXR1cyhwaGItPm9wYWxfaWQsIHBlX25vLCAmZnN0YXRlLCAmcGNpZXJyLAorCQkJCQlOVUxMKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybmluZygiUENJICVkOiBGYWlsZWQgdG8gcmVhZCBFRUggc3RhdHVzIGZvciBQRSMlZCwiCisJCQkgICAiIGVyciAlbGxkXG4iLCBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIsIHBlX25vLCByYyk7CisJCXJldHVybjsKKwl9CisJY2ZnX2RiZygiIC0+IEVFSCBjaGVjaywgYmRmbj0lMDR4IFBFJWQgZnN0YXRlPSV4XG4iLAorCQliZGZuLCBwZV9ubywgZnN0YXRlKTsKKwlpZiAoZnN0YXRlICE9IDApIHsKKwkJcmMgPSBvcGFsX3BjaV9lZWhfZnJlZXplX2NsZWFyKHBoYi0+b3BhbF9pZCwgcGVfbm8sCisJCQkJCSAgICAgIE9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfQUxMKTsKKwkJaWYgKHJjKSB7CisJCQlwcl93YXJuaW5nKCJQQ0kgJWQ6IEZhaWxlZCB0byBjbGVhciBFRUggZnJlZXplIHN0YXRlIgorCQkJCSAgICIgZm9yIFBFIyVkLCBlcnIgJWxsZFxuIiwKKwkJCQkgICBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIsIHBlX25vLCByYyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgcG52X3BjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBiZGZuID0gKCgodWludDY0X3QpYnVzLT5udW1iZXIpIDw8IDgpIHwgZGV2Zm47CisJczY0IHJjOworCisJaWYgKGhvc2UgPT0gTlVMTCkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMTogeworCQl1OCB2ODsKKwkJcmMgPSBvcGFsX3BjaV9jb25maWdfcmVhZF9ieXRlKHBoYi0+b3BhbF9pZCwgYmRmbiwgd2hlcmUsICZ2OCk7CisJCSp2YWwgPSAocmMgPT0gT1BBTF9TVUNDRVNTKSA/IHY4IDogMHhmZjsKKwkJYnJlYWs7CisJfQorCWNhc2UgMjogeworCQl1MTYgdjE2OworCQlyYyA9IG9wYWxfcGNpX2NvbmZpZ19yZWFkX2hhbGZfd29yZChwaGItPm9wYWxfaWQsIGJkZm4sIHdoZXJlLAorCQkJCQkJICAgJnYxNik7CisJCSp2YWwgPSAocmMgPT0gT1BBTF9TVUNDRVNTKSA/IHYxNiA6IDB4ZmZmZjsKKwkJYnJlYWs7CisJfQorCWNhc2UgNDogeworCQl1MzIgdjMyOworCQlyYyA9IG9wYWxfcGNpX2NvbmZpZ19yZWFkX3dvcmQocGhiLT5vcGFsX2lkLCBiZGZuLCB3aGVyZSwgJnYzMik7CisJCSp2YWwgPSAocmMgPT0gT1BBTF9TVUNDRVNTKSA/IHYzMiA6IDB4ZmZmZmZmZmY7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gUENJQklPU19GVU5DX05PVF9TVVBQT1JURUQ7CisJfQorCWNmZ19kYmcoInBudl9wY2lfcmVhZF9jb25maWcgYnVzOiAleCBkZXZmbjogJXggKyV4LyV4IC0+ICUwOHhcbiIsCisJCWJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsICp2YWwpOworCisJLyogQ2hlY2sgaWYgdGhlIFBIQiBnb3QgZnJvemVuIGR1ZSB0byBhbiBlcnJvciAobm8gcmVzcG9uc2UpICovCisJcG52X3BjaV9jb25maWdfY2hlY2tfZWVoKHBoYiwgYnVzLCBiZGZuKTsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgcG52X3BjaV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQl1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBiZGZuID0gKCgodWludDY0X3QpYnVzLT5udW1iZXIpIDw8IDgpIHwgZGV2Zm47CisKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJY2ZnX2RiZygicG52X3BjaV93cml0ZV9jb25maWcgYnVzOiAleCBkZXZmbjogJXggKyV4LyV4IC0+ICUwOHhcbiIsCisJCWJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbCk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlvcGFsX3BjaV9jb25maWdfd3JpdGVfYnl0ZShwaGItPm9wYWxfaWQsIGJkZm4sIHdoZXJlLCB2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCW9wYWxfcGNpX2NvbmZpZ193cml0ZV9oYWxmX3dvcmQocGhiLT5vcGFsX2lkLCBiZGZuLCB3aGVyZSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlvcGFsX3BjaV9jb25maWdfd3JpdGVfd29yZChwaGItPm9wYWxfaWQsIGJkZm4sIHdoZXJlLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gUENJQklPU19GVU5DX05PVF9TVVBQT1JURUQ7CisJfQorCS8qIENoZWNrIGlmIHRoZSBQSEIgZ290IGZyb3plbiBkdWUgdG8gYW4gZXJyb3IgKG5vIHJlc3BvbnNlKSAqLworCXBudl9wY2lfY29uZmlnX2NoZWNrX2VlaChwaGIsIGJ1cywgYmRmbik7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdHJ1Y3QgcGNpX29wcyBwbnZfcGNpX29wcyA9IHsKKwkucmVhZCA9IHBudl9wY2lfcmVhZF9jb25maWcsCisJLndyaXRlID0gcG52X3BjaV93cml0ZV9jb25maWcsCit9OworCitzdGF0aWMgaW50IHBudl90Y2VfYnVpbGQoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzLAorCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKK3sKKwl1NjQgcHJvdG9fdGNlOworCXU2NCAqdGNlcDsKKwl1NjQgcnBuOworCisJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOyAvLyBSZWFkIGFsbG93ZWQKKworCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKKwkJcHJvdG9fdGNlIHw9IFRDRV9QQ0lfV1JJVEU7CisKKwl0Y2VwID0gKCh1NjQgKil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CisKKwl3aGlsZSAobnBhZ2VzLS0pIHsKKwkJLyogY2FuJ3QgbW92ZSB0aGlzIG91dCBzaW5jZSB3ZSBtaWdodCBjcm9zcyBMTUIgYm91bmRhcnkgKi8KKwkJcnBuID0gKHZpcnRfdG9fYWJzKHVhZGRyKSkgPj4gVENFX1NISUZUOworCQkqdGNlcCA9IHByb3RvX3RjZSB8IChycG4gJiBUQ0VfUlBOX01BU0spIDw8IFRDRV9SUE5fU0hJRlQ7CisKKwkJdWFkZHIgKz0gVENFX1BBR0VfU0laRTsKKwkJdGNlcCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG52X3RjZV9mcmVlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKK3sKKwl1NjQgKnRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKKworCXdoaWxlIChucGFnZXMtLSkKKwkJKih0Y2VwKyspID0gMDsKK30KKwordm9pZCBwbnZfcGNpX3NldHVwX2lvbW11X3RhYmxlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLAorCQkJICAgICAgIHZvaWQgKnRjZV9tZW0sIHU2NCB0Y2Vfc2l6ZSwKKwkJCSAgICAgICB1NjQgZG1hX29mZnNldCkKK3sKKwl0YmwtPml0X2Jsb2Nrc2l6ZSA9IDE2OworCXRibC0+aXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKXRjZV9tZW07CisJdGJsLT5pdF9vZmZzZXQgPSBkbWFfb2Zmc2V0ID4+IElPTU1VX1BBR0VfU0hJRlQ7CisJdGJsLT5pdF9pbmRleCA9IDA7CisJdGJsLT5pdF9zaXplID0gdGNlX3NpemUgPj4gMzsKKwl0YmwtPml0X2J1c25vID0gMDsKKwl0YmwtPml0X3R5cGUgPSBUQ0VfUENJOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X3RhYmxlICogX19kZXZpbml0CitwbnZfcGNpX3NldHVwX2JtbF9pb21tdShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CisJY29uc3QgX19iZTY0ICpiYXNlcDsKKwljb25zdCBfX2JlMzIgKnNpemVwOworCisJYmFzZXAgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJsaW51eCx0Y2UtYmFzZSIsIE5VTEwpOworCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KGhvc2UtPmRuLCAibGludXgsdGNlLXNpemUiLCBOVUxMKTsKKwlpZiAoYmFzZXAgPT0gTlVMTCB8fCBzaXplcCA9PSBOVUxMKSB7CisJCXByX2VycigiUENJOiAlcyBoYXMgbWlzc2luZyB0Y2UgZW50cmllcyAhXG4iLCBob3NlLT5kbi0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRibCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwgR0ZQX0tFUk5FTCwgaG9zZS0+bm9kZSk7CisJaWYgKFdBUk5fT04oIXRibCkpCisJCXJldHVybiBOVUxMOworCXBudl9wY2lfc2V0dXBfaW9tbXVfdGFibGUodGJsLCBfX3ZhKGJlNjRfdG9fY3B1cChiYXNlcCkpLAorCQkJCSAgYmUzMl90b19jcHVwKHNpemVwKSwgMCk7CisJaW9tbXVfaW5pdF90YWJsZSh0YmwsIGhvc2UtPm5vZGUpOworCXJldHVybiB0Ymw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbnZfcGNpX2RtYV9mYWxsYmFja19zZXR1cChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJCQkgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBjaV9idXNfdG9fT0Zfbm9kZShob3NlLT5idXMpOworCXN0cnVjdCBwY2lfZG4gKnBkbjsKKworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm47CisJcGRuID0gUENJX0ROKG5wKTsKKwlpZiAoIXBkbi0+aW9tbXVfdGFibGUpCisJCXBkbi0+aW9tbXVfdGFibGUgPSBwbnZfcGNpX3NldHVwX2JtbF9pb21tdShob3NlKTsKKwlpZiAoIXBkbi0+aW9tbXVfdGFibGUpCisJCXJldHVybjsKKwlzZXRfaW9tbXVfdGFibGVfYmFzZSgmcGRldi0+ZGV2LCBwZG4tPmlvbW11X3RhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9wY2lfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gaG9zZS0+cHJpdmF0ZV9kYXRhOworCisJLyogSWYgd2UgaGF2ZSBubyBwaGIgc3RydWN0dXJlLCB0cnkgdG8gc2V0dXAgYSBmYWxsYmFjayBiYXNlZCBvbgorCSAqIHRoZSBkZXZpY2UtdHJlZSAoUlRBUyBQQ0kgZm9yIGV4YW1wbGUpCisJICovCisJaWYgKHBoYiAmJiBwaGItPmRtYV9kZXZfc2V0dXApCisJCXBoYi0+ZG1hX2Rldl9zZXR1cChwaGIsIHBkZXYpOworCWVsc2UKKwkJcG52X3BjaV9kbWFfZmFsbGJhY2tfc2V0dXAoaG9zZSwgcGRldik7Cit9CisKK3N0YXRpYyBpbnQgcG52X3BjaV9wcm9iZV9tb2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisJY29uc3QgX19iZTY0ICp0c3RhbXA7CisJdTY0IG5vdywgdGFyZ2V0OworCisKKwkvKiBXZSBoaWphY2sgdGhpcyBhcyBhIHdheSB0byBlbnN1cmUgd2UgaGF2ZSB3YWl0ZWQgbG9uZworCSAqIGVub3VnaCBzaW5jZSB0aGUgcmVzZXQgd2FzIGxpZnRlZCBvbiB0aGUgUENJIGJ1cworCSAqLworCWlmIChidXMgIT0gaG9zZS0+YnVzKQorCQlyZXR1cm4gUENJX1BST0JFX05PUk1BTDsKKwl0c3RhbXAgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJyZXNldC1jbGVhci10aW1lc3RhbXAiLCBOVUxMKTsKKwlpZiAoIXRzdGFtcCB8fCAhKnRzdGFtcCkKKwkJcmV0dXJuIFBDSV9QUk9CRV9OT1JNQUw7CisKKwlub3cgPSBtZnRiKCkgLyB0Yl90aWNrc19wZXJfdXNlYzsKKwl0YXJnZXQgPSAoYmU2NF90b19jcHVwKHRzdGFtcCkgLyB0Yl90aWNrc19wZXJfdXNlYykKKwkJKyBQQ0lfUkVTRVRfREVMQVlfVVM7CisKKwlwcl9kZXZlbCgicGNpICUwNGQ6IFJlc2V0IHRhcmdldDogMHglbGx4IG5vdzogMHglbGx4XG4iLAorCQkgaG9zZS0+Z2xvYmFsX251bWJlciwgdGFyZ2V0LCBub3cpOworCisJaWYgKG5vdyA8IHRhcmdldCkKKwkJbXNsZWVwKCh0YXJnZXQgLSBub3cgKyA5OTkpIC8gMTAwMCk7CisKKwlyZXR1cm4gUENJX1BST0JFX05PUk1BTDsKK30KKwordm9pZCBfX2luaXQgcG52X3BjaV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCXBjaV9zZXRfZmxhZ3MoUENJX0NBTl9TS0lQX0lTQV9BTElHTik7CisKKwkvKiBXZSBkbyBub3Qgd2FudCB0byBqdXN0IHByb2JlICovCisJcGNpX3Byb2JlX29ubHkgPSAwOworCisJLyogT1BBTCBhYnNlbnQsIHRyeSBQT1BBTCBmaXJzdCB0aGVuIFJUQVMgZGV0ZWN0aW9uIG9mIFBIQnMgKi8KKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTCkpIHsKKyNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlZfUlRBUworCQlpbml0X3BjaV9jb25maWdfdG9rZW5zKCk7CisJCWZpbmRfYW5kX2luaXRfcGhicygpOworI2VuZGlmIC8qIENPTkZJR19QUENfUE9XRVJOVl9SVEFTICovCisJfSBlbHNlIHsKKwkJLyogT1BBTCBpcyBoZXJlLCBkbyBvdXIgbm9ybWFsIHN0dWZmICovCisKKwkJLyogTG9vayBmb3IgcDVpb2MyIElPLUh1YnMgKi8KKwkJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiaWJtLHA1aW9jMiIpCisJCQlwbnZfcGNpX2luaXRfcDVpb2MyX2h1YihucCk7CisJfQorCisJLyogU2V0dXAgdGhlIGxpbmthZ2UgYmV0d2VlbiBPRiBub2RlcyBhbmQgUEhCcyAqLworCXBjaV9kZXZzX3BoYl9pbml0KCk7CisKKwkvKiBDb25maWd1cmUgSU9NTVUgRE1BIGhvb2tzICovCisJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gcG52X3BjaV9kbWFfZGV2X3NldHVwOworCXBwY19tZC50Y2VfYnVpbGQgPSBwbnZfdGNlX2J1aWxkOworCXBwY19tZC50Y2VfZnJlZSA9IHBudl90Y2VfZnJlZTsKKwlwcGNfbWQucGNpX3Byb2JlX21vZGUgPSBwbnZfcGNpX3Byb2JlX21vZGU7CisJc2V0X3BjaV9kbWFfb3BzKCZkbWFfaW9tbXVfb3BzKTsKKworCS8qIENvbmZpZ3VyZSBNU0lzICovCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlwcGNfbWQubXNpX2NoZWNrX2RldmljZSA9IHBudl9tc2lfY2hlY2tfZGV2aWNlOworCXBwY19tZC5zZXR1cF9tc2lfaXJxcyA9IHBudl9zZXR1cF9tc2lfaXJxczsKKwlwcGNfbWQudGVhcmRvd25fbXNpX2lycXMgPSBwbnZfdGVhcmRvd25fbXNpX2lycXM7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGRiYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX19QT1dFUk5WX1BDSV9ICisjZGVmaW5lIF9fUE9XRVJOVl9QQ0lfSAorCitzdHJ1Y3QgcGNpX2RuOworCitlbnVtIHBudl9waGJfdHlwZSB7CisJUE5WX1BIQl9QNUlPQzIsCisJUE5WX1BIQl9JT0RBMSwKKwlQTlZfUEhCX0lPREEyLAorfTsKKworc3RydWN0IHBudl9waGIgeworCXN0cnVjdCBwY2lfY29udHJvbGxlcgkqaG9zZTsKKwllbnVtIHBudl9waGJfdHlwZQl0eXBlOworCXU2NAkJCW9wYWxfaWQ7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwlzcGlubG9ja190CQlsb2NrOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwl1bnNpZ25lZCBsb25nCQkqbXNpX21hcDsKKwl1bnNpZ25lZCBpbnQJCW1zaV9iYXNlOworCXVuc2lnbmVkIGludAkJbXNpX2NvdW50OworCXVuc2lnbmVkIGludAkJbXNpX25leHQ7CisJdW5zaWduZWQgaW50CQltc2kzMl9zdXBwb3J0OworI2VuZGlmCisJaW50ICgqbXNpX3NldHVwKShzdHJ1Y3QgcG52X3BoYiAqcGhiLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJIHVuc2lnbmVkIGludCBod2lycSwgdW5zaWduZWQgaW50IGlzXzY0LAorCQkJIHN0cnVjdCBtc2lfbXNnICptc2cpOworCXZvaWQgKCpkbWFfZGV2X3NldHVwKShzdHJ1Y3QgcG52X3BoYiAqcGhiLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisJdm9pZCAoKmZpeHVwX3BoYikoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKwl1MzIgKCpiZGZuX3RvX3BlKShzdHJ1Y3QgcG52X3BoYiAqcGhiLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4pOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGlvbW11X3RhYmxlIGlvbW11X3RhYmxlOworCQl9IHA1aW9jMjsKKwl9OworfTsKKworZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHBudl9wY2lfb3BzOworCitleHRlcm4gdm9pZCBwbnZfcGNpX3NldHVwX2lvbW11X3RhYmxlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLAorCQkJCSAgICAgIHZvaWQgKnRjZV9tZW0sIHU2NCB0Y2Vfc2l6ZSwKKwkJCQkgICAgICB1NjQgZG1hX29mZnNldCk7CitleHRlcm4gdm9pZCBwbnZfcGNpX2luaXRfcDVpb2MyX2h1YihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKKworCisjZW5kaWYgLyogX19QT1dFUk5WX1BDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcG93ZXJudi5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3Bvd2VybnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTlkZjdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3Bvd2VybnYuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9QT1dFUk5WX0gKKyNkZWZpbmUgX1BPV0VSTlZfSAorCisjaWZkZWYgQ09ORklHX1NNUAorZXh0ZXJuIHZvaWQgcG52X3NtcF9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbnZfc21wX2luaXQodm9pZCkgeyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiB2b2lkIHBudl9wY2lfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcG52X3BjaV9pbml0KHZvaWQpIHsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfUE9XRVJOVl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2JkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc2V0dXAuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIFBvd2VyTlYgc2V0dXAgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS94aWNzLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS94aWNzLmg+CisKKyNpbmNsdWRlICJwb3dlcm52LmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbnZfc2V0dXBfYXJjaCh2b2lkKQoreworCS8qIEluaXRpYWxpemUgU01QICovCisJcG52X3NtcF9pbml0KCk7CisKKwkvKiBTZXR1cCBQQ0kgKi8KKwlwbnZfcGNpX2luaXQoKTsKKworCS8qIFNldHVwIFJUQyBhbmQgTlZSQU0gY2FsbGJhY2tzICovCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTCkpCisJCW9wYWxfbnZyYW1faW5pdCgpOworCisJLyogRW5hYmxlIE5BUCBtb2RlICovCisJcG93ZXJzYXZlX25hcCA9IDE7CisKKwkvKiBYWFggUE1DUyAqLworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcG52X2luaXRfZWFybHkodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSFZDX09QQUwKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkKKwkJaHZjX29wYWxfaW5pdF9lYXJseSgpOworCWVsc2UKKyNlbmRpZgorCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIDAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcG52X2luaXRfSVJRKHZvaWQpCit7CisJeGljc19pbml0KCk7CisKKwlXQVJOX09OKCFwcGNfbWQuZ2V0X2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdDsKKwljb25zdCBjaGFyICptb2RlbCA9ICIiOworCisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJaWYgKHJvb3QpCisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOworCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiBQb3dlck5WICVzXG4iLCBtb2RlbCk7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkKKwkJc2VxX3ByaW50ZihtLCAiZmlybXdhcmVcdDogT1BBTCB2MlxuIik7CisJZWxzZSBpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkKKwkJc2VxX3ByaW50ZihtLCAiZmlybXdhcmVcdDogT1BBTCB2MVxuIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKG0sICJmaXJtd2FyZVx0OiBCTUxcbiIpOworCW9mX25vZGVfcHV0KHJvb3QpOworfQorCitzdGF0aWMgdm9pZCAgX19ub3JldHVybiBwbnZfcmVzdGFydChjaGFyICpjbWQpCit7CisJbG9uZyByYyA9IE9QQUxfQlVTWTsKKworCXdoaWxlIChyYyA9PSBPUEFMX0JVU1kgfHwgcmMgPT0gT1BBTF9CVVNZX0VWRU5UKSB7CisJCXJjID0gb3BhbF9jZWNfcmVib290KCk7CisJCWlmIChyYyA9PSBPUEFMX0JVU1lfRVZFTlQpCisJCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworCQllbHNlCisJCQltZGVsYXkoMTApOworCX0KKwlmb3IgKDs7KQorCQlvcGFsX3BvbGxfZXZlbnRzKE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX25vcmV0dXJuIHBudl9wb3dlcl9vZmYodm9pZCkKK3sKKwlsb25nIHJjID0gT1BBTF9CVVNZOworCisJd2hpbGUgKHJjID09IE9QQUxfQlVTWSB8fCByYyA9PSBPUEFMX0JVU1lfRVZFTlQpIHsKKwkJcmMgPSBvcGFsX2NlY19wb3dlcl9kb3duKDApOworCQlpZiAocmMgPT0gT1BBTF9CVVNZX0VWRU5UKQorCQkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKKwkJZWxzZQorCQkJbWRlbGF5KDEwKTsKKwl9CisJZm9yICg7OykKKwkJb3BhbF9wb2xsX2V2ZW50cyhOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX19ub3JldHVybiBwbnZfaGFsdCh2b2lkKQoreworCXBudl9wb3dlcl9vZmYoKTsKK30KKworc3RhdGljIHZvaWQgcG52X3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCkKK3sKK30KKworI2lmZGVmIENPTkZJR19LRVhFQworc3RhdGljIHZvaWQgcG52X2tleGVjX2NwdV9kb3duKGludCBjcmFzaF9zaHV0ZG93biwgaW50IHNlY29uZGFyeSkKK3sKKwl4aWNzX2tleGVjX3RlYXJkb3duX2NwdShzZWNvbmRhcnkpOworfQorI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgcG52X3NldHVwX21hY2hkZXBfb3BhbCh2b2lkKQoreworCXBwY19tZC5nZXRfYm9vdF90aW1lID0gb3BhbF9nZXRfYm9vdF90aW1lOworCXBwY19tZC5nZXRfcnRjX3RpbWUgPSBvcGFsX2dldF9ydGNfdGltZTsKKwlwcGNfbWQuc2V0X3J0Y190aW1lID0gb3BhbF9zZXRfcnRjX3RpbWU7CisJcHBjX21kLnJlc3RhcnQgPSBwbnZfcmVzdGFydDsKKwlwcGNfbWQucG93ZXJfb2ZmID0gcG52X3Bvd2VyX29mZjsKKwlwcGNfbWQuaGFsdCA9IHBudl9oYWx0OworCXBwY19tZC5tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiA9IG9wYWxfbWFjaGluZV9jaGVjazsKK30KKworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVl9SVEFTCitzdGF0aWMgdm9pZCBfX2luaXQgcG52X3NldHVwX21hY2hkZXBfcnRhcyh2b2lkKQoreworCWlmIChydGFzX3Rva2VuKCJnZXQtdGltZS1vZi1kYXkiKSAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlwcGNfbWQuZ2V0X2Jvb3RfdGltZSA9IHJ0YXNfZ2V0X2Jvb3RfdGltZTsKKwkJcHBjX21kLmdldF9ydGNfdGltZSA9IHJ0YXNfZ2V0X3J0Y190aW1lOworCQlwcGNfbWQuc2V0X3J0Y190aW1lID0gcnRhc19zZXRfcnRjX3RpbWU7CisJfQorCXBwY19tZC5yZXN0YXJ0ID0gcnRhc19yZXN0YXJ0OworCXBwY19tZC5wb3dlcl9vZmYgPSBydGFzX3Bvd2VyX29mZjsKKwlwcGNfbWQuaGFsdCA9IHJ0YXNfaGFsdDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BPV0VSTlZfUlRBUyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwbnZfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiaWJtLHBvd2VybnYiKSkKKwkJcmV0dXJuIDA7CisKKwlocHRlX2luaXRfbmF0aXZlKCk7CisKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9PUEFMKSkKKwkJcG52X3NldHVwX21hY2hkZXBfb3BhbCgpOworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVl9SVEFTCisJZWxzZSBpZiAocnRhcy5iYXNlKQorCQlwbnZfc2V0dXBfbWFjaGRlcF9ydGFzKCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QT1dFUk5WX1JUQVMgKi8KKworCXByX2RlYnVnKCJQb3dlck5WIGRldGVjdGVkICFcbiIpOworCisJcmV0dXJuIDE7Cit9CisKK2RlZmluZV9tYWNoaW5lKHBvd2VybnYpIHsKKwkubmFtZQkJCT0gIlBvd2VyTlYiLAorCS5wcm9iZQkJCT0gcG52X3Byb2JlLAorCS5pbml0X2Vhcmx5CQk9IHBudl9pbml0X2Vhcmx5LAorCS5zZXR1cF9hcmNoCQk9IHBudl9zZXR1cF9hcmNoLAorCS5pbml0X0lSUQkJPSBwbnZfaW5pdF9JUlEsCisJLnNob3dfY3B1aW5mbwkJPSBwbnZfc2hvd19jcHVpbmZvLAorCS5wcm9ncmVzcwkJPSBwbnZfcHJvZ3Jlc3MsCisJLnBvd2VyX3NhdmUgICAgICAgICAgICAgPSBwb3dlcjdfaWRsZSwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkua2V4ZWNfY3B1X2Rvd24JCT0gcG52X2tleGVjX2NwdV9kb3duLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzczNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBTTVAgc3VwcG9ydCBmb3IgUG93ZXJOViBtYWNoaW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KKyNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9jcHV0aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3hpY3MuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorCisjaW5jbHVkZSAicG93ZXJudi5oIgorCisjaWZkZWYgREVCVUcKKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBwbnZfc21wX3NldHVwX2NwdShpbnQgY3B1KQoreworCWlmIChjcHUgIT0gYm9vdF9jcHVpZCkKKwkJeGljc19zZXR1cF9jcHUoKTsKK30KKworc3RhdGljIGludCBwbnZfc21wX2NwdV9ib290YWJsZSh1bnNpZ25lZCBpbnQgbnIpCit7CisJLyogU3BlY2lhbCBjYXNlIC0gd2UgaW5oaWJpdCBzZWNvbmRhcnkgdGhyZWFkIHN0YXJ0dXAKKwkgKiBkdXJpbmcgYm9vdCBpZiB0aGUgdXNlciByZXF1ZXN0cyBpdC4KKwkgKi8KKwlpZiAoc3lzdGVtX3N0YXRlIDwgU1lTVEVNX1JVTk5JTkcgJiYgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkgeworCQlpZiAoIXNtdF9lbmFibGVkX2F0X2Jvb3QgJiYgY3B1X3RocmVhZF9pbl9jb3JlKG5yKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChzbXRfZW5hYmxlZF9hdF9ib290CisJCSAgICAmJiBjcHVfdGhyZWFkX2luX2NvcmUobnIpID49IHNtdF9lbmFibGVkX2F0X2Jvb3QpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IF9fZGV2aW5pdCBwbnZfc21wX2tpY2tfY3B1KGludCBucikKK3sKKwl1bnNpZ25lZCBpbnQgcGNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQobnIpOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfaGVyZSA9IF9fcGEoKigodW5zaWduZWQgbG9uZyAqKQorCQkJCQkgIGdlbmVyaWNfc2Vjb25kYXJ5X3NtcF9pbml0KSk7CisJbG9uZyByYzsKKworCUJVR19PTihuciA8IDAgfHwgbnIgPj0gTlJfQ1BVUyk7CisKKwkvKiBPbiBPUEFMIHYyIHRoZSBDUFUgYXJlIHN0aWxsIHNwaW5uaW5nIGluc2lkZSBPUEFMIGl0c2VsZiwKKwkgKiBnZXQgdGhlbSBiYWNrIG5vdworCSAqLworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUx2MikpIHsKKwkJcHJfZGV2ZWwoIk9QQUw6IFN0YXJ0aW5nIENQVSAlZCAoSFcgMHgleCkuLi5cbiIsIG5yLCBwY3B1KTsKKwkJcmMgPSBvcGFsX3N0YXJ0X2NwdShwY3B1LCBzdGFydF9oZXJlKTsKKwkJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJCXByX3dhcm4oIk9QQUwgRXJyb3IgJWxkIHN0YXJ0aW5nIENQVSAlZFxuIiwKKwkJCQlyYywgbnIpOworCX0KKwlyZXR1cm4gc21wX2dlbmVyaWNfa2lja19jcHUobnIpOworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisKK3N0YXRpYyBpbnQgcG52X3NtcF9jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwU2VyaWVzLi4uIG1pZ2h0IGNvbnNvbGlkYXRlIGJ5CisJICogbW92aW5nIG1pZ3JhdGVfaXJxc19hd2F5IHRvIGEgcHBjX21kIHdpdGggZGVmYXVsdCB0bworCSAqIHRoZSBnZW5lcmljIGZpeHVwX2lycXMuIC0tQmVuSC4KKwkgKi8KKwlzZXRfY3B1X29ubGluZShjcHUsIGZhbHNlKTsKKwl2ZHNvX2RhdGEtPnByb2Nlc3NvckNvdW50LS07CisJaWYgKGNwdSA9PSBib290X2NwdWlkKQorCQlib290X2NwdWlkID0gY3B1bWFza19hbnkoY3B1X29ubGluZV9tYXNrKTsKKwl4aWNzX21pZ3JhdGVfaXJxc19hd2F5KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9zbXBfY3B1X2tpbGxfc2VsZih2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwkvKiBJZiBwb3dlcnNhdmVfbmFwIGlzIGVuYWJsZWQsIHVzZSBOQVAgbW9kZSwgZWxzZSBqdXN0CisJICogc3BpbiBhaW1sZXNzbHkKKwkgKi8KKwlpZiAoIXBvd2Vyc2F2ZV9uYXApIHsKKwkJZ2VuZXJpY19tYWNoX2NwdV9kaWUoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFN0YW5kYXJkIGhvdCB1bnBsdWcgcHJvY2VkdXJlICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZGxlX3Rhc2tfZXhpdCgpOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9IE5VTEw7IC8qIGZvciBzYW5pdHkgKi8KKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJREJHKCJDUFUlZCBvZmZsaW5lXG4iLCBjcHUpOworCWdlbmVyaWNfc2V0X2NwdV9kZWFkKGNwdSk7CisJc21wX3dtYigpOworCisJLyogV2UgZG9uJ3Qgd2FudCB0byB0YWtlIGRlY3JlbWVudGVyIGludGVycnVwdHMgd2hpbGUgd2UgYXJlIG9mZmxpbmUsCisJICogc28gY2xlYXIgTFBDUjpQRUNFMS4gV2Uga2VlcCBQRUNFMiBlbmFibGVkLgorCSAqLworCW10c3ByKFNQUk5fTFBDUiwgbWZzcHIoU1BSTl9MUENSKSAmIH4odTY0KUxQQ1JfUEVDRTEpOworCXdoaWxlICghZ2VuZXJpY19jaGVja19jcHVfcmVzdGFydChjcHUpKSB7CisJCXBvd2VyN19pZGxlKCk7CisJCWlmICghZ2VuZXJpY19jaGVja19jcHVfcmVzdGFydChjcHUpKSB7CisJCQlEQkcoIkNQVSVkIFVuZXhwZWN0ZWQgZXhpdCB3aGlsZSBvZmZsaW5lICFcbiIsIGNwdSk7CisJCQkvKiBXZSBtYXkgYmUgZ2V0dGluZyBhbiBJUEksIHNvIHdlIHJlLWVuYWJsZQorCQkJICogaW50ZXJydXB0cyB0byBwcm9jZXNzIGl0LCBpdCB3aWxsIGJlIGlnbm9yZWQKKwkJCSAqIHNpbmNlIHdlIGFyZW4ndCBvbmxpbmUgKGhvcGVmdWxseSkKKwkJCSAqLworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJfQorCX0KKwltdHNwcihTUFJOX0xQQ1IsIG1mc3ByKFNQUk5fTFBDUikgfCBMUENSX1BFQ0UxKTsKKwlEQkcoIkNQVSVkIGNvbWluZyBvbmxpbmUuLi5cbiIsIGNwdSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKworc3RhdGljIHN0cnVjdCBzbXBfb3BzX3QgcG52X3NtcF9vcHMgPSB7CisJLm1lc3NhZ2VfcGFzcwk9IHNtcF9tdXhlZF9pcGlfbWVzc2FnZV9wYXNzLAorCS5jYXVzZV9pcGkJPSBOVUxMLAkvKiBGaWxsZWQgYXQgcnVudGltZSBieSB4aWNzX3NtcF9wcm9iZSgpICovCisJLnByb2JlCQk9IHhpY3Nfc21wX3Byb2JlLAorCS5raWNrX2NwdQk9IHBudl9zbXBfa2lja19jcHUsCisJLnNldHVwX2NwdQk9IHBudl9zbXBfc2V0dXBfY3B1LAorCS5jcHVfYm9vdGFibGUJPSBwbnZfc21wX2NwdV9ib290YWJsZSwKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkuY3B1X2Rpc2FibGUJPSBwbnZfc21wX2NwdV9kaXNhYmxlLAorCS5jcHVfZGllCT0gZ2VuZXJpY19jcHVfZGllLAorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworfTsKKworLyogVGhpcyBpcyBjYWxsZWQgdmVyeSBlYXJseSBkdXJpbmcgcGxhdGZvcm0gc2V0dXBfYXJjaCAqLwordm9pZCBfX2luaXQgcG52X3NtcF9pbml0KHZvaWQpCit7CisJc21wX29wcyA9ICZwbnZfc21wX29wczsKKworCS8qIFhYWCBXZSBkb24ndCB5ZXQgaGF2ZSBhIHByb3BlciBlbnRyeSBwb2ludCBmcm9tIEhBTCwgZm9yCisJICogbm93IHdlIHJlbHkgb24ga2V4ZWMtc3R5bGUgZW50cnkgZnJvbSBCTUwKKwkgKi8KKworI2lmZGVmIENPTkZJR19QUENfUlRBUworCS8qIE5vbi1scGFyIGhhcyBhZGRpdGlvbmFsIHRha2UvZ2l2ZSB0aW1lYmFzZSAqLworCWlmIChydGFzX3Rva2VuKCJmcmVlemUtdGltZS1iYXNlIikgIT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpIHsKKwkJc21wX29wcy0+Z2l2ZV90aW1lYmFzZSA9IHJ0YXNfZ2l2ZV90aW1lYmFzZTsKKwkJc21wX29wcy0+dGFrZV90aW1lYmFzZSA9IHJ0YXNfdGFrZV90aW1lYmFzZTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19SVEFTICovCisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlwcGNfbWQuY3B1X2RpZQk9IHBudl9zbXBfY3B1X2tpbGxfc2VsZjsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wcmVwL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZwppbmRleCBmMDUzNmM3Li4xNTQ3ZjY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZwpAQCAtMjEsMTIgKzIxLDMgQEAKIAkgIG9yIHBhc3MgdGhlICdub3Jlc2lkdWFsJyBvcHRpb24gdG8gdGhlIGtlcm5lbC4KIAogCSAgSWYgeW91IGFyZSBydW5uaW5nIGEgUFJlUCBzeXN0ZW0sIHNheSBZIGhlcmUsIG90aGVyd2lzZSBzYXkgTi4KLQotY29uZmlnIFBST0NfUFJFUFJFU0lEVUFMCi0JYm9vbCAiU3VwcG9ydCBmb3IgcmVhZGluZyBvZiBQUmVQIFJlc2lkdWFsIERhdGEgaW4gL3Byb2MiCi0JZGVwZW5kcyBvbiBQUkVQX1JFU0lEVUFMICYmIFBST0NfRlMKLQloZWxwCi0JICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNyZWF0ZSBhIC9wcm9jL3Jlc2lkdWFsIGZpbGUgd2hpY2ggYWxsb3dzCi0JICB5b3UgdG8gZ2V0IGF0IHRoZSByZXNpZHVhbCBkYXRhIG9uIFBSZVAgc3lzdGVtcy4gIFlvdSB3aWxsIG5lZWQgYSB0b29sCi0JICAobHNyZXNpZHVhbCkgdG8gcGFyc2UgaXQuICBJZiB5b3UgYXJlbid0IG9uIGEgUFJlUCBzeXN0ZW0sIHlvdSBkb24ndAotCSAgd2FudCB0aGlzLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKaW5kZXggZGZlMzE2Yi4uNDc2ZDlkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCkBAIC0xNDgsNCArMTQ4LDE2IEBACiAJICBwcm9maWxpbmcgc3VwcG9ydCBvZiB0aGUgQ2VsbCBwcm9jZXNzb3Igd2l0aCBwcm9ncmFtcyBsaWtlCiAJICBvcHJvZmlsZSBhbmQgcGVyZm1vbjIsIHRoZW4gc2F5IFkgb3IgTSwgb3RoZXJ3aXNlIHNheSBOLgogCitjb25maWcgUFMzR0VMSUNfVURCRworCWJvb2wgIlBTMyB1ZGJnIG91dHB1dCB2aWEgVURQIGJyb2FkY2FzdHMgb24gRXRoZXJuZXQiCisJZGVwZW5kcyBvbiBQUENfUFMzCisJaGVscAorCSAgRW5hYmxlcyB1ZGJnIGVhcmx5IGRlYnVnZ2luZyBvdXRwdXQgYnkgc2VuZGluZyBicm9hZGNhc3QgVURQCisJICB2aWEgdGhlIEV0aGVybmV0IHBvcnQgKFVEUCBwb3J0IG51bWJlciAxODE5NCkuCisKKwkgIFRoaXMgZHJpdmVyIHVzZXMgYSB0cml2aWFsIGltcGxlbWVudGF0aW9uIGFuZCBpcyBpbmRlcGVuZGVudAorCSAgZnJvbSB0aGUgbWFpbiBuZXR3b3JrIGRyaXZlci4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKaW5kZXggYWMxYmRmOC4uMDJiOWU2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmoteSArPSBpbnRlcnJ1cHQubyBleHBvcnRzLm8gb3MtYXJlYS5vCiBvYmoteSArPSBzeXN0ZW0tYnVzLm8KIAorb2JqLSQoQ09ORklHX1BTM0dFTElDX1VEQkcpICs9IGdlbGljX3VkYmcubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8KIG9iai0kKENPTkZJR19TUFVfQkFTRSkgKz0gc3B1Lm8KIG9iai15ICs9IGRldmljZS1pbml0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCmluZGV4IDZjNGI1ODMuLjNmMTc1ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwpAQCAtODI1LDcgKzgyNSw3IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LmxvY2spOwogCi0JcmVzID0gcmVxdWVzdF9pcnEoaXJxLCBwczNfbm90aWZpY2F0aW9uX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlyZXMgPSByZXF1ZXN0X2lycShpcnEsIHBzM19ub3RpZmljYXRpb25faW50ZXJydXB0LCAwLAogCQkJICAicHMzX25vdGlmaWNhdGlvbiIsICZkZXYpOwogCWlmIChyZXMpIHsKIAkJcHJfZXJyKCIlczoldTogcmVxdWVzdF9pcnEgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9leHBvcnRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9leHBvcnRzLmMKaW5kZXggYTdlOGZmZC4uN2RmNWI3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9leHBvcnRzLmMKQEAgLTE4LDggKzE4LDYgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjZGVmaW5lIExWMV9DQUxMKG5hbWUsIGluLCBvdXQsIG51bSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZXh0ZXJuIHM2NCBfbHYxXyMjbmFtZShMVjFfIyNpbiMjX0lOXyMjb3V0IyNfT1VUX0FSR19ERUNMKTsgXAogICBFWFBPUlRfU1lNQk9MKF9sdjFfIyNuYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2dlbGljX3VkYmcuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2dlbGljX3VkYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGI0NmExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZ2VsaWNfdWRiZy5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogdWRiZyBkZWJ1ZyBvdXRwdXQgcm91dGluZSB2aWEgR0VMSUMgVURQIGJyb2FkY2FzdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFNvbnkgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxMCBIZWN0b3IgTWFydGluIDxoZWN0b3JAbWFyY2Fuc29mdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW5kcmUgSGVpZGVyIDxhLmhlaWRlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKworI2RlZmluZSBHRUxJQ19CVVNfSUQgMQorI2RlZmluZSBHRUxJQ19ERVZJQ0VfSUQgMAorI2RlZmluZSBHRUxJQ19ERUJVR19QT1JUIDE4MTk0CisjZGVmaW5lIEdFTElDX01BWF9NRVNTQUdFX1NJWkUgMTAwMAorCisjZGVmaW5lIEdFTElDX0xWMV9HRVRfTUFDX0FERFJFU1MgMQorI2RlZmluZSBHRUxJQ19MVjFfR0VUX1ZMQU5fSUQgNAorI2RlZmluZSBHRUxJQ19MVjFfVkxBTl9UWF9FVEhFUk5FVF8wIDIKKworI2RlZmluZSBHRUxJQ19ERVNDUl9ETUFfU1RBVF9NQVNLIDB4ZjAwMDAwMDAKKyNkZWZpbmUgR0VMSUNfREVTQ1JfRE1BX0NBUkRPV05FRCAweGEwMDAwMDAwCisKKyNkZWZpbmUgR0VMSUNfREVTQ1JfVFhfRE1BX0lLRSAweDAwMDgwMDAwCisjZGVmaW5lIEdFTElDX0RFU0NSX1RYX0RNQV9OT19DSEtTVU0gMHgwMDAwMDAwMAorI2RlZmluZSBHRUxJQ19ERVNDUl9UWF9ETUFfRlJBTUVfVEFJTCAweDAwMDQwMDAwCisKKyNkZWZpbmUgR0VMSUNfREVTQ1JfRE1BX0NNRF9OT19DSEtTVU0gKEdFTElDX0RFU0NSX0RNQV9DQVJET1dORUQgfCBcCisJCQkJICAgICAgIEdFTElDX0RFU0NSX1RYX0RNQV9JS0UgfCBcCisJCQkJICAgICAgIEdFTElDX0RFU0NSX1RYX0RNQV9OT19DSEtTVU0pCisKK3N0YXRpYyB1NjQgYnVzX2FkZHI7CisKK3N0cnVjdCBnZWxpY19kZXNjciB7CisJLyogYXMgZGVmaW5lZCBieSB0aGUgaGFyZHdhcmUgKi8KKwlfX2JlMzIgYnVmX2FkZHI7CisJX19iZTMyIGJ1Zl9zaXplOworCV9fYmUzMiBuZXh0X2Rlc2NyX2FkZHI7CisJX19iZTMyIGRtYWNfY21kX3N0YXR1czsKKwlfX2JlMzIgcmVzdWx0X3NpemU7CisJX19iZTMyIHZhbGlkX3NpemU7CS8qIGFsbCB6ZXJvZXMgZm9yIHR4ICovCisJX19iZTMyIGRhdGFfc3RhdHVzOworCV9fYmUzMiBkYXRhX2Vycm9yOwkvKiBhbGwgemVyb2VzIGZvciB0eCAqLworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCitzdHJ1Y3QgZGVidWdfYmxvY2sgeworCXN0cnVjdCBnZWxpY19kZXNjciBkZXNjcjsKKwl1OCBwa3RbMTUyMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZXRoaGRyIHsKKwl1OCBkZXN0WzZdOworCXU4IHNyY1s2XTsKKwl1MTYgdHlwZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2bGFudGFnIHsKKwl1MTYgdmxhbjsKKwl1MTYgc3VidHlwZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpcGhkciB7CisJdTggdmVyX2xlbjsKKwl1OCBkc2NwX2VjbjsKKwl1MTYgdG90YWxfbGVuZ3RoOworCXUxNiBpZGVudDsKKwl1MTYgZnJhZ19vZmZfZmxhZ3M7CisJdTggdHRsOworCXU4IHByb3RvOworCXUxNiBjaGVja3N1bTsKKwl1MzIgc3JjOworCXUzMiBkZXN0OworfSBfX3BhY2tlZDsKKworc3RydWN0IHVkcGhkciB7CisJdTE2IHNyYzsKKwl1MTYgZGVzdDsKKwl1MTYgbGVuOworCXUxNiBjaGVja3N1bTsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyBfX2lvbWVtIHN0cnVjdCBldGhoZHIgKmhfZXRoOworc3RhdGljIF9faW9tZW0gc3RydWN0IHZsYW50YWcgKmhfdmxhbjsKK3N0YXRpYyBfX2lvbWVtIHN0cnVjdCBpcGhkciAqaF9pcDsKK3N0YXRpYyBfX2lvbWVtIHN0cnVjdCB1ZHBoZHIgKmhfdWRwOworCitzdGF0aWMgX19pb21lbSBjaGFyICpwbXNnOworc3RhdGljIF9faW9tZW0gY2hhciAqcG1zZ2M7CisKK3N0YXRpYyBfX2lvbWVtIHN0cnVjdCBkZWJ1Z19ibG9jayBkYmcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKworc3RhdGljIGludCBoZWFkZXJfc2l6ZTsKKworc3RhdGljIHZvaWQgbWFwX2RtYV9tZW0oaW50IGJ1c19pZCwgaW50IGRldl9pZCwgdm9pZCAqc3RhcnQsIHNpemVfdCBsZW4sCisJCQl1NjQgKnJlYWxfYnVzX2FkZHIpCit7CisJczY0IHJlc3VsdDsKKwl1NjQgcmVhbF9hZGRyID0gKCh1NjQpc3RhcnQpICYgMHgwZmZmZmZmZmZmZmZmZmZmVUw7CisJdTY0IHJlYWxfZW5kID0gcmVhbF9hZGRyICsgbGVuOworCXU2NCBtYXBfc3RhcnQgPSByZWFsX2FkZHIgJiB+MHhmZmY7CisJdTY0IG1hcF9lbmQgPSAocmVhbF9lbmQgKyAweGZmZikgJiB+MHhmZmY7CisJdTY0IGJ1c19hZGRyID0gMDsKKworCXU2NCBmbGFncyA9IDB4ZjgwMDAwMDAwMDAwMDAwMFVMOworCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKGJ1c19pZCwgZGV2X2lkLAorCQkJCQkJbWFwX2VuZCAtIG1hcF9zdGFydCwgMTIsIDAsCisJCQkJCQkmYnVzX2FkZHIpOworCWlmIChyZXN1bHQpCisJCWx2MV9wYW5pYygwKTsKKworCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24oYnVzX2lkLCBkZXZfaWQsIG1hcF9zdGFydCwKKwkJCQkJICAgYnVzX2FkZHIsIG1hcF9lbmQgLSBtYXBfc3RhcnQsCisJCQkJCSAgIGZsYWdzKTsKKwlpZiAocmVzdWx0KQorCQlsdjFfcGFuaWMoMCk7CisKKwkqcmVhbF9idXNfYWRkciA9IGJ1c19hZGRyICsgcmVhbF9hZGRyIC0gbWFwX3N0YXJ0OworfQorCitzdGF0aWMgaW50IHVubWFwX2RtYV9tZW0oaW50IGJ1c19pZCwgaW50IGRldl9pZCwgdTY0IGJ1c19hZGRyLCBzaXplX3QgbGVuKQoreworCXM2NCByZXN1bHQ7CisJdTY0IHJlYWxfYnVzX2FkZHI7CisKKwlyZWFsX2J1c19hZGRyID0gYnVzX2FkZHIgJiB+MHhmZmY7CisJbGVuICs9IGJ1c19hZGRyIC0gcmVhbF9idXNfYWRkcjsKKwlsZW4gPSAobGVuICsgMHhmZmYpICYgfjB4ZmZmOworCisJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGJ1c19pZCwgZGV2X2lkLCByZWFsX2J1c19hZGRyLAorCQkJCQkgICAgIGxlbik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJldHVybiBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihidXNfaWQsIGRldl9pZCwgcmVhbF9idXNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbGljX2RlYnVnX2luaXQodm9pZCkKK3sKKwlzNjQgcmVzdWx0OworCXU2NCB2MjsKKwl1NjQgbWFjOworCXU2NCB2bGFuX2lkOworCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKEdFTElDX0JVU19JRCwgR0VMSUNfREVWSUNFX0lELCAwKTsKKwlpZiAocmVzdWx0KQorCQlsdjFfcGFuaWMoMCk7CisKKwltYXBfZG1hX21lbShHRUxJQ19CVVNfSUQsIEdFTElDX0RFVklDRV9JRCwgJmRiZywgc2l6ZW9mKGRiZyksCisJCSAgICAmYnVzX2FkZHIpOworCisJbWVtc2V0KCZkYmcsIDAsIHNpemVvZihkYmcpKTsKKworCWRiZy5kZXNjci5idWZfYWRkciA9IGJ1c19hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGRlYnVnX2Jsb2NrLCBwa3QpOworCisJd21iKCk7CisKKwlyZXN1bHQgPSBsdjFfbmV0X2NvbnRyb2woR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQsCisJCQkJIEdFTElDX0xWMV9HRVRfTUFDX0FERFJFU1MsIDAsIDAsIDAsCisJCQkJICZtYWMsICZ2Mik7CisJaWYgKHJlc3VsdCkKKwkJbHYxX3BhbmljKDApOworCisJbWFjIDw8PSAxNjsKKworCWhfZXRoID0gKHN0cnVjdCBldGhoZHIgKilkYmcucGt0OworCisJbWVtc2V0KCZoX2V0aC0+ZGVzdCwgMHhmZiwgNik7CisJbWVtY3B5KCZoX2V0aC0+c3JjLCAmbWFjLCA2KTsKKworCWhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpOworCisJcmVzdWx0ID0gbHYxX25ldF9jb250cm9sKEdFTElDX0JVU19JRCwgR0VMSUNfREVWSUNFX0lELAorCQkJCSBHRUxJQ19MVjFfR0VUX1ZMQU5fSUQsCisJCQkJIEdFTElDX0xWMV9WTEFOX1RYX0VUSEVSTkVUXzAsIDAsIDAsCisJCQkJICZ2bGFuX2lkLCAmdjIpOworCWlmICghcmVzdWx0KSB7CisJCWhfZXRoLT50eXBlID0gMHg4MTAwOworCisJCWhlYWRlcl9zaXplICs9IHNpemVvZihzdHJ1Y3QgdmxhbnRhZyk7CisJCWhfdmxhbiA9IChzdHJ1Y3QgdmxhbnRhZyAqKShoX2V0aCArIDEpOworCQloX3ZsYW4tPnZsYW4gPSB2bGFuX2lkOworCQloX3ZsYW4tPnN1YnR5cGUgPSAweDA4MDA7CisJCWhfaXAgPSAoc3RydWN0IGlwaGRyICopKGhfdmxhbiArIDEpOworCX0gZWxzZSB7CisJCWhfZXRoLT50eXBlID0gMHgwODAwOworCQloX2lwID0gKHN0cnVjdCBpcGhkciAqKShoX2V0aCArIDEpOworCX0KKworCWhlYWRlcl9zaXplICs9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWhfaXAtPnZlcl9sZW4gPSAweDQ1OworCWhfaXAtPnR0bCA9IDEwOworCWhfaXAtPnByb3RvID0gMHgxMTsKKwloX2lwLT5zcmMgPSAweDAwMDAwMDAwOworCWhfaXAtPmRlc3QgPSAweGZmZmZmZmZmOworCisJaGVhZGVyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWhfdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikoaF9pcCArIDEpOworCWhfdWRwLT5zcmMgPSBHRUxJQ19ERUJVR19QT1JUOworCWhfdWRwLT5kZXN0ID0gR0VMSUNfREVCVUdfUE9SVDsKKworCXBtc2djID0gcG1zZyA9IChjaGFyICopKGhfdWRwICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbGljX2RlYnVnX3NodXRkb3duKHZvaWQpCit7CisJaWYgKGJ1c19hZGRyKQorCQl1bm1hcF9kbWFfbWVtKEdFTElDX0JVU19JRCwgR0VMSUNfREVWSUNFX0lELAorCQkJICAgICAgYnVzX2FkZHIsIHNpemVvZihkYmcpKTsKKwlsdjFfY2xvc2VfZGV2aWNlKEdFTElDX0JVU19JRCwgR0VMSUNfREVWSUNFX0lEKTsKK30KKworc3RhdGljIHZvaWQgZ2VsaWNfc2VuZGJ1ZihpbnQgbXNnc2l6ZSkKK3sKKwl1MTYgKnA7CisJdTMyIHN1bTsKKwlpbnQgaTsKKworCWRiZy5kZXNjci5idWZfc2l6ZSA9IGhlYWRlcl9zaXplICsgbXNnc2l6ZTsKKwloX2lwLT50b3RhbF9sZW5ndGggPSBtc2dzaXplICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJaF91ZHAtPmxlbiA9IG1zZ3NpemUgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisKKwloX2lwLT5jaGVja3N1bSA9IDA7CisJc3VtID0gMDsKKwlwID0gKHUxNiAqKWhfaXA7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJc3VtICs9ICpwKys7CisJaF9pcC0+Y2hlY2tzdW0gPSB+KHN1bSArIChzdW0gPj4gMTYpKTsKKworCWRiZy5kZXNjci5kbWFjX2NtZF9zdGF0dXMgPSBHRUxJQ19ERVNDUl9ETUFfQ01EX05PX0NIS1NVTSB8CisJCQkJICAgIEdFTElDX0RFU0NSX1RYX0RNQV9GUkFNRV9UQUlMOworCWRiZy5kZXNjci5yZXN1bHRfc2l6ZSA9IDA7CisJZGJnLmRlc2NyLmRhdGFfc3RhdHVzID0gMDsKKworCXdtYigpOworCisJbHYxX25ldF9zdGFydF90eF9kbWEoR0VMSUNfQlVTX0lELCBHRUxJQ19ERVZJQ0VfSUQsIGJ1c19hZGRyLCAwKTsKKworCXdoaWxlICgoZGJnLmRlc2NyLmRtYWNfY21kX3N0YXR1cyAmIEdFTElDX0RFU0NSX0RNQV9TVEFUX01BU0spID09CisJICAgICAgIEdFTElDX0RFU0NSX0RNQV9DQVJET1dORUQpCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgdm9pZCBwczNnZWxpY191ZGJnX3B1dGMoY2hhciBjaCkKK3sKKwkqcG1zZ2MrKyA9IGNoOworCWlmIChjaCA9PSAnXG4nIHx8IChwbXNnYy1wbXNnKSA+PSBHRUxJQ19NQVhfTUVTU0FHRV9TSVpFKSB7CisJCWdlbGljX3NlbmRidWYocG1zZ2MtcG1zZyk7CisJCXBtc2djID0gcG1zZzsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9wczNnZWxpYyh2b2lkKQoreworCWdlbGljX2RlYnVnX2luaXQoKTsKKwl1ZGJnX3B1dGMgPSBwczNnZWxpY191ZGJnX3B1dGM7Cit9CisKK3ZvaWQgdWRiZ19zaHV0ZG93bl9wczNnZWxpYyh2b2lkKQoreworCXVkYmdfcHV0YyA9IE5VTEw7CisJZ2VsaWNfZGVidWdfc2h1dGRvd24oKTsKK30KK0VYUE9SVF9TWU1CT0wodWRiZ19zaHV0ZG93bl9wczNnZWxpYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCmluZGV4IDYwMGVkMmMuLjQwNGJjNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCmluZGV4IGMyMDQ1ODguLjcyNzE0YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtMTksNyArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCmluZGV4IDViNzU5YjYuLjU2ZDI2YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKaW5kZXggNWUzMDRjMi4uY2E0MGY2YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJZW51bSBwczNfYnVzX3R5cGUgKmJ1c190eXBlKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLApAQCAtMTk5LDcgKzE5OSw3IEBACiAJdW5zaWduZWQgaW50ICpudW1fZGV2KQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLApAQCAtMjM5LDcgKzIzOSw3IEBACiAJdW5zaWduZWQgaW50IGRldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgKmRldl90eXBlKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLApAQCAtMjU2LDggKzI1Niw4IEBACiAJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgKmludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7Ci0JdTY0IHYyOworCXU2NCB2MSA9IDA7CisJdTY0IHYyID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC0yNzUsNyArMjc1LDcgQEAKIAllbnVtIHBzM19yZWdfdHlwZSAqcmVnX3R5cGUpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC02MTUsNyArNjE1LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgKm51bV9yZWdpb25zKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLApAQCAtNjMxLDcgKzYzMSw3IEBACiAJdW5zaWduZWQgaW50ICpyZWdpb25faWQpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJICAgIG1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCkBAIC03ODYsNyArNzg2LDcgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzZXJ2ZWQodW5zaWduZWQgaW50ICpudW1fc3B1X3Jlc2VydmVkKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKIAkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKQEAgLTgwNSw3ICs4MDUsNyBAQAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgKm51bV9yZXNvdXJjZV9pZCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKKwl1NjQgdjEgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCkBAIC04MjcsOCArODI3LDggQEAKIAllbnVtIHBzM19zcHVfcmVzb3VyY2VfdHlwZSAqcmVzb3VyY2VfdHlwZSwgdW5zaWduZWQgaW50ICpyZXNvdXJjZV9pZCkKIHsKIAlpbnQgcmVzdWx0OwotCXU2NCB2MTsKLQl1NjQgdjI7CisJdTY0IHYxID0gMDsKKwl1NjQgdjIgPSAwOwogCiAJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCkBAIC04NTQsNyArODU0LDcgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X3NpemUodW5zaWduZWQgaW50ICpzaXplKQogewogCWludCByZXN1bHQ7Ci0JdTY0IHYxOworCXU2NCB2MSA9IDA7CiAKIAlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKIAkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKQEAgLTg2OSw3ICs4NjksNyBAQAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfYXZfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLApAQCAtODg0LDcgKzg4NCw3IEBACiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9zeXNtZ3JfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAogCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLApAQCAtOTE5LDcgKzkxOSw3IEBACiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fYmUodW5zaWduZWQgaW50ICpudW1fYmUpCiB7CiAJaW50IHJlc3VsdDsKLQl1NjQgdjE7CisJdTY0IHYxID0gMDsKIAogCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCiAJCW1ha2VfZmlyc3RfZmllbGQoImJlbiIsIDApLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKaW5kZXggMTQ5YmVhMi4uZThlYzFiMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwppbmRleCAzNzVhOWY5Li40NTFmYWQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKaW5kZXggMjMwODNjMy4uODgwZWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNjk1LDEyICs2OTUsMTggQEAKIAlyZXR1cm4gbWFzayA+PSBETUFfQklUX01BU0soMzIpOwogfQogCitzdGF0aWMgdTY0IHBzM19kbWFfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlyZXR1cm4gRE1BX0JJVF9NQVNLKDMyKTsKK30KKwogc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyBwczNfc2JfZG1hX29wcyA9IHsKIAkuYWxsb2NfY29oZXJlbnQgPSBwczNfYWxsb2NfY29oZXJlbnQsCiAJLmZyZWVfY29oZXJlbnQgPSBwczNfZnJlZV9jb2hlcmVudCwKIAkubWFwX3NnID0gcHMzX3NiX21hcF9zZywKIAkudW5tYXBfc2cgPSBwczNfc2JfdW5tYXBfc2csCiAJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZCwKKwkuZ2V0X3JlcXVpcmVkX21hc2sgPSBwczNfZG1hX2dldF9yZXF1aXJlZF9tYXNrLAogCS5tYXBfcGFnZSA9IHBzM19zYl9tYXBfcGFnZSwKIAkudW5tYXBfcGFnZSA9IHBzM191bm1hcF9wYWdlLAogfTsKQEAgLTcxMSw2ICs3MTcsNyBAQAogCS5tYXBfc2cgPSBwczNfaW9jMF9tYXBfc2csCiAJLnVubWFwX3NnID0gcHMzX2lvYzBfdW5tYXBfc2csCiAJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZCwKKwkuZ2V0X3JlcXVpcmVkX21hc2sgPSBwczNfZG1hX2dldF9yZXF1aXJlZF9tYXNrLAogCS5tYXBfcGFnZSA9IHBzM19pb2MwX21hcF9wYWdlLAogCS51bm1hcF9wYWdlID0gcHMzX3VubWFwX3BhZ2UsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwppbmRleCAwNWNmNDc2Li5jODFmNmJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwpAQCAtMTUsNiArMTUsNyBAQAogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfTkFUSVZFCiAJc2VsZWN0IFBQQ19QQ0lfQ0hPSUNFIGlmIEVYUEVSVAorCXNlbGVjdCBaTElCX0RFRkxBVEUKIAlkZWZhdWx0IHkKIAogY29uZmlnIFBQQ19TUExQQVIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKaW5kZXggZTliZTI1Yi4uMGYxYjcwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMKQEAgLTExMiw2ICsxMTIsNyBAQAogCWRscGFyX2ZyZWVfb25lX2NjX25vZGUoZG4pOwogfQogCisjZGVmaW5lIENPTVBMRVRFCTAKICNkZWZpbmUgTkVYVF9TSUJMSU5HICAgIDEKICNkZWZpbmUgTkVYVF9DSElMRCAgICAgIDIKICNkZWZpbmUgTkVYVF9QUk9QRVJUWSAgIDMKQEAgLTE1OCw2ICsxNTksOSBAQAogCQlzcGluX3VubG9jaygmcnRhc19kYXRhX2J1Zl9sb2NrKTsKIAogCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgQ09NUExFVEU6CisJCQlicmVhazsKKwogCQljYXNlIE5FWFRfU0lCTElORzoKIAkJCWRuID0gZGxwYXJfcGFyc2VfY2Nfbm9kZShjY3dhKTsKIAkJCWlmICghZG4pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKaW5kZXggYWRhNmUwNy4uNTY1ODY5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBpbml0X21tICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTI5LDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgpAQCAtMTMzOCw3ICsxMzQwLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGVlaF9pbml0X3Byb2Modm9pZCkKIHsKIAlpZiAobWFjaGluZV9pcyhwc2VyaWVzKSkKLQkJcHJvY19jcmVhdGUoInBwYzY0L2VlaCIsIDAsIE5VTEwsICZwcm9jX2VlaF9vcGVyYXRpb25zKTsKKwkJcHJvY19jcmVhdGUoInBvd2VycGMvZWVoIiwgMCwgTlVMTCwgJnByb2NfZWVoX29wZXJhdGlvbnMpOwogCXJldHVybiAwOwogfQogX19pbml0Y2FsbChlZWhfaW5pdF9wcm9jKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYwppbmRleCAyZWM1MDBjLi5kMjM4M2NmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwppbmRleCAyMzk4MmM3Li5lYjc0NGVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKaW5kZXggODNhM2NhMi4uYzk4NmQwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBpZGxlX3Rhc2tfZXhpdCAqLwogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y29uc29sZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y29uc29sZS5jCmluZGV4IDA0MWU4N2MuLmIzNDRmOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNvbnNvbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjb25zb2xlLmMKQEAgLTI0LDcgKzI0LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgogI2luY2x1ZGUgInBscGFyX3dyYXBwZXJzLmgiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9fZXZlbnRfaXJxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9fZXZlbnRfaXJxLmMKaW5kZXggMmM0ZGQxZi4uMWE3MDliYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvX2V2ZW50X2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb19ldmVudF9pcnEuYwpAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCmluZGV4IDAxZmFhYjkuLmI3MTlkOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3Igc2hvd19zdGFjayAqLwogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CkBAIC05MzksMTQgKzk0MCwxNCBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBkaXJlY3Qgd2luZG93IGZvciAlczogJWRcbiIsCiAJCQkgZG4tPmZ1bGxfbmFtZSwgcmV0KTsKLQkJZ290byBvdXRfY2xlYXJfd2luZG93OworCQlnb3RvIG91dF9mcmVlX3dpbmRvdzsKIAl9CiAKIAlyZXQgPSBwcm9tX2FkZF9wcm9wZXJ0eShwZG4sIHdpbjY0KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5hYmxlIHRvIGFkZCBkbWEgd2luZG93IHByb3BlcnR5IGZvciAlczogJWQiLAogCQkJIHBkbi0+ZnVsbF9uYW1lLCByZXQpOwotCQlnb3RvIG91dF9jbGVhcl93aW5kb3c7CisJCWdvdG8gb3V0X2ZyZWVfd2luZG93OwogCX0KIAogCXdpbmRvdy0+ZGV2aWNlID0gcGRuOwpAQCAtOTU4LDYgKzk1OSw5IEBACiAJZG1hX2FkZHIgPSBvZl9yZWFkX251bWJlcigmY3JlYXRlLmFkZHJfaGksIDIpOwogCWdvdG8gb3V0X3VubG9jazsKIAorb3V0X2ZyZWVfd2luZG93OgorCWtmcmVlKHdpbmRvdyk7CisKIG91dF9jbGVhcl93aW5kb3c6CiAJcmVtb3ZlX2RkdyhwZG4pOwogCkBAIC0xMDc3LDEyICsxMDgxLDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1NjQgZG1hX2dldF9yZXF1aXJlZF9tYXNrX3BTZXJpZXNMUChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gMDsKKworCWlmICghZGlzYWJsZV9kZHcgJiYgZGV2X2lzX3BjaShkZXYpKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCisJCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCisJCS8qIHNlYXJjaCB1cHdhcmRzIGZvciBpYm0sZG1hLXdpbmRvdyAqLworCQlmb3IgKDsgZG4gJiYgUENJX0ROKGRuKSAmJiAhUENJX0ROKGRuKS0+aW9tbXVfdGFibGU7CisJCQkJZG4gPSBkbi0+cGFyZW50KQorCQkJaWYgKG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCkpCisJCQkJYnJlYWs7CisJCS8qIGlmIHRoZXJlIGlzIGEgaWJtLGRkdy1hcHBsaWNhYmxlIHByb3BlcnR5IHJlcXVpcmUgNjQgYml0cyAqLworCQlpZiAoZG4gJiYgUENJX0ROKGRuKSAmJgorCQkJCW9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxkZHctYXBwbGljYWJsZSIsIE5VTEwpKQorCQkJcmV0dXJuIERNQV9CSVRfTUFTSyg2NCk7CisJfQorCisJcmV0dXJuIGRtYV9pb21tdV9vcHMuZ2V0X3JlcXVpcmVkX21hc2soZGV2KTsKK30KKwogI2Vsc2UgIC8qIENPTkZJR19QQ0kgKi8KICNkZWZpbmUgcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllcwlOVUxMCiAjZGVmaW5lIHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXMJTlVMTAogI2RlZmluZSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzTFAJTlVMTAogI2RlZmluZSBwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFAJTlVMTAogI2RlZmluZSBkbWFfc2V0X21hc2tfcFNlcmllc0xQCQlOVUxMCisjZGVmaW5lIGRtYV9nZXRfcmVxdWlyZWRfbWFza19wU2VyaWVzTFAJTlVMTAogI2VuZGlmIC8qICFDT05GSUdfUENJICovCiAKIHN0YXRpYyBpbnQgaW9tbXVfbWVtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLApAQCAtMTE4Niw2ICsxMjE2LDcgQEAKIAkJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllc0xQOwogCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFA7CiAJCXBwY19tZC5kbWFfc2V0X21hc2sgPSBkbWFfc2V0X21hc2tfcFNlcmllc0xQOworCQlwcGNfbWQuZG1hX2dldF9yZXF1aXJlZF9tYXNrID0gZG1hX2dldF9yZXF1aXJlZF9tYXNrX3BTZXJpZXNMUDsKIAl9IGVsc2UgewogCQlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX3BTZXJpZXM7CiAJCXBwY19tZC50Y2VfZnJlZSAgPSB0Y2VfZnJlZV9wU2VyaWVzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKaW5kZXggYzlhMjlkYS4uMjdhNDk1MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21vYmlsaXR5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwppbmRleCAzZTdmNjUxLi4wMjlhNTYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbnZyYW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCmluZGV4IDAwY2MzYTAuLmE3NmIyMjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva21zZ19kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbnZyYW0uaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgpAQCAtNzgsOCArODAsNDEgQEAKICNkZWZpbmUgTlZSQU1fUlRBU19SRUFEX1RJTUVPVVQgNQkJLyogc2Vjb25kcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF91bnJlYWRfcnRhc19ldmVudDsJLyogdGltZXN0YW1wICovCiAKLS8qIFdlIHByZWFsbG9jYXRlIG9vcHNfYnVmIGR1cmluZyBpbml0IHRvIGF2b2lkIGttYWxsb2MgZHVyaW5nIG9vcHMvcGFuaWMuICovCi1zdGF0aWMgY2hhciAqb29wc19idWY7CisvKgorICogRm9yIGNhcHR1cmluZyBhbmQgY29tcHJlc3NpbmcgYW4gb29wcyBvciBwYW5pYyByZXBvcnQuLi4KKworICogYmlnX29vcHNfYnVmW10gaG9sZHMgdGhlIHVuY29tcHJlc3NlZCB0ZXh0IHdlJ3JlIGNhcHR1cmluZy4KKyAqCisgKiBvb3BzX2J1ZltdIGhvbGRzIHRoZSBjb21wcmVzc2VkIHRleHQsIHByZWNlZGVkIGJ5IGEgcHJlZml4LgorICogVGhlIHByZWZpeCBpcyBqdXN0IGEgdTE2IGhvbGRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCogdGV4dC4KKyAqICgqT3IgdW5jb21wcmVzc2VkLCBpZiBjb21wcmVzc2lvbiBmYWlscy4pICBvb3BzX2J1ZltdIGdldHMgd3JpdHRlbgorICogdG8gTlZSQU0uCisgKgorICogb29wc19sZW4gcG9pbnRzIHRvIHRoZSBwcmVmaXguICBvb3BzX2RhdGEgcG9pbnRzIHRvIHRoZSBjb21wcmVzc2VkIHRleHQuCisgKgorICogKy0gb29wc19idWYKKyAqIHwJCSstIG9vcHNfZGF0YQorICogdgkJdgorICogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgbGVuZ3RoCXwgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgKDIgYnl0ZXMpCXwgKG9vcHNfZGF0YV9zeiBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBeCisgKiArLSBvb3BzX2xlbgorICoKKyAqIFdlIHByZWFsbG9jYXRlIHRoZXNlIGJ1ZmZlcnMgZHVyaW5nIGluaXQgdG8gYXZvaWQga21hbGxvYyBkdXJpbmcgb29wcy9wYW5pYy4KKyAqLworc3RhdGljIHNpemVfdCBiaWdfb29wc19idWZfc3o7CitzdGF0aWMgY2hhciAqYmlnX29vcHNfYnVmLCAqb29wc19idWY7CitzdGF0aWMgdTE2ICpvb3BzX2xlbjsKK3N0YXRpYyBjaGFyICpvb3BzX2RhdGE7CitzdGF0aWMgc2l6ZV90IG9vcHNfZGF0YV9zejsKKworLyogQ29tcHJlc3Npb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBDT01QUl9MRVZFTCA2CisjZGVmaW5lIFdJTkRPV19CSVRTIDEyCisjZGVmaW5lIE1FTV9MRVZFTCA0CitzdGF0aWMgc3RydWN0IHpfc3RyZWFtX3Mgc3RyZWFtOwogCiBzdGF0aWMgc3NpemVfdCBwU2VyaWVzX252cmFtX3JlYWQoY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqaW5kZXgpCiB7CkBAIC0zODcsMTEgKzQyMiw0NCBAQAogCQkJCQkJc2l6ZW9mKHJ0YXNfbG9nX3BhcnRpdGlvbikpOwogCX0KIAlvb3BzX2J1ZiA9IGttYWxsb2Mob29wc19sb2dfcGFydGl0aW9uLnNpemUsIEdGUF9LRVJORUwpOworCWlmICghb29wc19idWYpIHsKKwkJcHJfZXJyKCJudnJhbTogTm8gbWVtb3J5IGZvciAlcyBwYXJ0aXRpb25cbiIsCisJCQkJCQlvb3BzX2xvZ19wYXJ0aXRpb24ubmFtZSk7CisJCXJldHVybjsKKwl9CisJb29wc19sZW4gPSAodTE2Kikgb29wc19idWY7CisJb29wc19kYXRhID0gb29wc19idWYgKyBzaXplb2YodTE2KTsKKwlvb3BzX2RhdGFfc3ogPSBvb3BzX2xvZ19wYXJ0aXRpb24uc2l6ZSAtIHNpemVvZih1MTYpOworCisJLyoKKwkgKiBGaWd1cmUgY29tcHJlc3Npb24gKHByZWNlZGVkIGJ5IGVsaW1pbmF0aW9uIG9mIGVhY2ggbGluZSdzIDxuPgorCSAqIHNldmVyaXR5IHByZWZpeCkgd2lsbCByZWR1Y2UgdGhlIG9vcHMvcGFuaWMgcmVwb3J0IHRvIGF0IG1vc3QKKwkgKiA0NSUgb2YgaXRzIG9yaWdpbmFsIHNpemUuCisJICovCisJYmlnX29vcHNfYnVmX3N6ID0gKG9vcHNfZGF0YV9zeiAqIDEwMCkgLyA0NTsKKwliaWdfb29wc19idWYgPSBrbWFsbG9jKGJpZ19vb3BzX2J1Zl9zeiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJpZ19vb3BzX2J1ZikgeworCQlzdHJlYW0ud29ya3NwYWNlID0ga21hbGxvYyh6bGliX2RlZmxhdGVfd29ya3NwYWNlc2l6ZSgKKwkJCQlXSU5ET1dfQklUUywgTUVNX0xFVkVMKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc3RyZWFtLndvcmtzcGFjZSkgeworCQkJcHJfZXJyKCJudnJhbTogTm8gbWVtb3J5IGZvciBjb21wcmVzc2lvbiB3b3Jrc3BhY2U7ICIKKwkJCQkic2tpcHBpbmcgY29tcHJlc3Npb24gb2YgJXMgcGFydGl0aW9uIGRhdGFcbiIsCisJCQkJb29wc19sb2dfcGFydGl0aW9uLm5hbWUpOworCQkJa2ZyZWUoYmlnX29vcHNfYnVmKTsKKwkJCWJpZ19vb3BzX2J1ZiA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlwcl9lcnIoIk5vIG1lbW9yeSBmb3IgdW5jb21wcmVzc2VkICVzIGRhdGE7ICIKKwkJCSJza2lwcGluZyBjb21wcmVzc2lvblxuIiwgb29wc19sb2dfcGFydGl0aW9uLm5hbWUpOworCQlzdHJlYW0ud29ya3NwYWNlID0gTlVMTDsKKwl9CisKIAlyYyA9IGttc2dfZHVtcF9yZWdpc3RlcigmbnZyYW1fa21zZ19kdW1wZXIpOwogCWlmIChyYyAhPSAwKSB7CiAJCXByX2VycigibnZyYW06IGttc2dfZHVtcF9yZWdpc3RlcigpIGZhaWxlZDsgcmV0dXJuZWQgJWRcbiIsIHJjKTsKIAkJa2ZyZWUob29wc19idWYpOwotCQlyZXR1cm47CisJCWtmcmVlKGJpZ19vb3BzX2J1Zik7CisJCWtmcmVlKHN0cmVhbS53b3Jrc3BhY2UpOwogCX0KIH0KIApAQCAtNDczLDcgKzU0MSw4MyBAQAogCQkJCQkJTlZSQU1fUlRBU19SRUFEX1RJTUVPVVQpOwogfQogCi0vKiBvdXIga21zZ19kdW1wIGNhbGxiYWNrICovCisvKiBTcXVlZXplIG91dCBlYWNoIGxpbmUncyA8bj4gc2V2ZXJpdHkgcHJlZml4LiAqLworc3RhdGljIHNpemVfdCBlbGlkZV9zZXZlcml0aWVzKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwljaGFyICppbiwgKm91dCwgKmJ1Zl9lbmQgPSBidWYgKyBsZW47CisJLyogQXNzdW1lIGEgPG4+IGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBtYXJrcyB0aGUgc3RhcnQgb2YgYSBsaW5lLiAqLworCWludCBuZXdsaW5lID0gMTsKKworCWluID0gb3V0ID0gYnVmOworCXdoaWxlIChpbiA8IGJ1Zl9lbmQpIHsKKwkJaWYgKG5ld2xpbmUgJiYgaW4rMyA8PSBidWZfZW5kICYmCisJCQkJKmluID09ICc8JyAmJiBpc2RpZ2l0KGluWzFdKSAmJiBpblsyXSA9PSAnPicpIHsKKwkJCWluICs9IDM7CisJCQluZXdsaW5lID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5ld2xpbmUgPSAoKmluID09ICdcbicpOworCQkJKm91dCsrID0gKmluKys7CisJCX0KKwl9CisJcmV0dXJuIG91dCAtIGJ1ZjsKK30KKworLyogRGVyaXZlZCBmcm9tIGxvZ2ZzX2NvbXByZXNzKCkgKi8KK3N0YXRpYyBpbnQgbnZyYW1fY29tcHJlc3MoY29uc3Qgdm9pZCAqaW4sIHZvaWQgKm91dCwgc2l6ZV90IGlubGVuLAorCQkJCQkJCXNpemVfdCBvdXRsZW4pCit7CisJaW50IGVyciwgcmV0OworCisJcmV0ID0gLUVJTzsKKwllcnIgPSB6bGliX2RlZmxhdGVJbml0Migmc3RyZWFtLCBDT01QUl9MRVZFTCwgWl9ERUZMQVRFRCwgV0lORE9XX0JJVFMsCisJCQkJCQlNRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7CisJaWYgKGVyciAhPSBaX09LKQorCQlnb3RvIGVycm9yOworCisJc3RyZWFtLm5leHRfaW4gPSBpbjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBpbmxlbjsKKwlzdHJlYW0udG90YWxfaW4gPSAwOworCXN0cmVhbS5uZXh0X291dCA9IG91dDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gb3V0bGVuOworCXN0cmVhbS50b3RhbF9vdXQgPSAwOworCisJZXJyID0gemxpYl9kZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKwlpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHpsaWJfZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoZXJyICE9IFpfT0spCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoc3RyZWFtLnRvdGFsX291dCA+PSBzdHJlYW0udG90YWxfaW4pCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBzdHJlYW0udG90YWxfb3V0OworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworLyogQ29tcHJlc3MgdGhlIHRleHQgZnJvbSBiaWdfb29wc19idWYgaW50byBvb3BzX2J1Zi4gKi8KK3N0YXRpYyBpbnQgemlwX29vcHMoc2l6ZV90IHRleHRfbGVuKQoreworCWludCB6aXBwZWRfbGVuID0gbnZyYW1fY29tcHJlc3MoYmlnX29vcHNfYnVmLCBvb3BzX2RhdGEsIHRleHRfbGVuLAorCQkJCQkJCQlvb3BzX2RhdGFfc3opOworCWlmICh6aXBwZWRfbGVuIDwgMCkgeworCQlwcl9lcnIoIm52cmFtOiBjb21wcmVzc2lvbiBmYWlsZWQ7IHJldHVybmVkICVkXG4iLCB6aXBwZWRfbGVuKTsKKwkJcHJfZXJyKCJudnJhbTogbG9nZ2luZyB1bmNvbXByZXNzZWQgb29wcy9wYW5pYyByZXBvcnRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCSpvb3BzX2xlbiA9ICh1MTYpIHppcHBlZF9sZW47CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIG91ciBrbXNnX2R1bXAgY2FsbGJhY2ssIGNhbGxlZCBhZnRlciBhbiBvb3BzIG9yIHBhbmljIHJlcG9ydAorICogaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgcHJpbnRrIGJ1ZmZlci4gIFdlIHdhbnQgdG8gY2FwdHVyZSBhcyBtdWNoCisgKiBvZiB0aGUgcHJpbnRrIGJ1ZmZlciBhcyBwb3NzaWJsZS4gIEZpcnN0LCBjYXB0dXJlIGFzIG11Y2ggYXMgd2UgY2FuCisgKiB0aGF0IHdlIHRoaW5rIHdpbGwgY29tcHJlc3Mgc3VmZmljaWVudGx5IHRvIGZpdCBpbiB0aGUgbG54LG9vcHMtbG9nCisgKiBwYXJ0aXRpb24uICBJZiB0aGF0J3MgdG9vIG11Y2gsIGdvIGJhY2sgYW5kIGNhcHR1cmUgdW5jb21wcmVzc2VkIHRleHQuCisgKi8KIHN0YXRpYyB2b2lkIG9vcHNfdG9fbnZyYW0oc3RydWN0IGttc2dfZHVtcGVyICpkdW1wZXIsCiAJCWVudW0ga21zZ19kdW1wX3JlYXNvbiByZWFzb24sCiAJCWNvbnN0IGNoYXIgKm9sZF9tc2dzLCB1bnNpZ25lZCBsb25nIG9sZF9sZW4sCkBAIC00ODIsNiArNjI2LDggQEAKIAlzdGF0aWMgdW5zaWduZWQgaW50IG9vcHNfY291bnQgPSAwOwogCXN0YXRpYyBib29sIHBhbmlja2luZyA9IGZhbHNlOwogCXNpemVfdCB0ZXh0X2xlbjsKKwl1bnNpZ25lZCBpbnQgZXJyX3R5cGUgPSBFUlJfVFlQRV9LRVJORUxfUEFOSUNfR1o7CisJaW50IHJjID0gLTE7CiAKIAlzd2l0Y2ggKHJlYXNvbikgewogCWNhc2UgS01TR19EVU1QX1JFU1RBUlQ6CkBAIC01MDksOCArNjU1LDE5IEBACiAJaWYgKGNsb2JiZXJpbmdfdW5yZWFkX3J0YXNfZXZlbnQoKSkKIAkJcmV0dXJuOwogCi0JdGV4dF9sZW4gPSBjYXB0dXJlX2xhc3RfbXNncyhvbGRfbXNncywgb2xkX2xlbiwgbmV3X21zZ3MsIG5ld19sZW4sCi0JCQkJCW9vcHNfYnVmLCBvb3BzX2xvZ19wYXJ0aXRpb24uc2l6ZSk7CisJaWYgKGJpZ19vb3BzX2J1ZikgeworCQl0ZXh0X2xlbiA9IGNhcHR1cmVfbGFzdF9tc2dzKG9sZF9tc2dzLCBvbGRfbGVuLAorCQkJbmV3X21zZ3MsIG5ld19sZW4sIGJpZ19vb3BzX2J1ZiwgYmlnX29vcHNfYnVmX3N6KTsKKwkJdGV4dF9sZW4gPSBlbGlkZV9zZXZlcml0aWVzKGJpZ19vb3BzX2J1ZiwgdGV4dF9sZW4pOworCQlyYyA9IHppcF9vb3BzKHRleHRfbGVuKTsKKwl9CisJaWYgKHJjICE9IDApIHsKKwkJdGV4dF9sZW4gPSBjYXB0dXJlX2xhc3RfbXNncyhvbGRfbXNncywgb2xkX2xlbiwKKwkJCQluZXdfbXNncywgbmV3X2xlbiwgb29wc19kYXRhLCBvb3BzX2RhdGFfc3opOworCQllcnJfdHlwZSA9IEVSUl9UWVBFX0tFUk5FTF9QQU5JQzsKKwkJKm9vcHNfbGVuID0gKHUxNikgdGV4dF9sZW47CisJfQorCiAJKHZvaWQpIG52cmFtX3dyaXRlX29zX3BhcnRpdGlvbigmb29wc19sb2dfcGFydGl0aW9uLCBvb3BzX2J1ZiwKLQkJKGludCkgdGV4dF9sZW4sIEVSUl9UWVBFX0tFUk5FTF9QQU5JQywgKytvb3BzX2NvdW50KTsKKwkJKGludCkgKHNpemVvZigqb29wc19sZW4pICsgKm9vcHNfbGVuKSwgZXJyX3R5cGUsICsrb29wc19jb3VudCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKaW5kZXggM2JmNDQ4OC4uNTVkNGVjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwpAQCAtMjYsNiArMjYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IDQxYzI0YzEuLjM0Mjc5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCkBAIC0xLDcgKzEsMTAgQEAKICNpZm5kZWYgX1BTRVJJRVNfUExQQVJfV1JBUFBFUlNfSAogI2RlZmluZSBfUFNFUklFU19QTFBBUl9XUkFQUEVSU19ICiAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKwogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qIEdldCBzdGF0ZSBvZiBwaHlzaWNhbCBDUFUgZnJvbSBxdWVyeV9jcHVfc3RvcHBlZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCAwOTY5ZmQ5Li5jMzQwOGNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKaW5kZXggNGU0NGM0ZC4uMjZlOTNmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwpAQCAtMTQsNyArMTQsNiBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMKaW5kZXggYThjYTI4OS4uZDNkZTA4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvS2NvbmZpZwppbmRleCBjM2M0OGViLi5iZDU2MGM3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWcKQEAgLTEsNSArMSwxMiBAQAogY29uZmlnIFBQQ19XU1AKIAlib29sCisJc2VsZWN0IFBQQ19BMgorCXNlbGVjdCBQUENfU0NPTQorCXNlbGVjdCBQUENfWElDUworCXNlbGVjdCBQUENfSUNQX05BVElWRQorCXNlbGVjdCBQQ0kKKwlzZWxlY3QgUFBDX0lPX1dPUktBUk9VTkRTIGlmIFBDSQorCXNlbGVjdCBQUENfSU5ESVJFQ1RfUElPIGlmIFBDSQogCWRlZmF1bHQgbgogCiBtZW51ICJXU1AgcGxhdGZvcm0gc2VsZWN0aW9uIgpAQCAtNywxMyArMTQsOSBAQAogCiBjb25maWcgUFBDX1BTUjIKIAlib29sICJQU1ItMiBwbGF0Zm9ybSIKLQlzZWxlY3QgUFBDX0EyCiAJc2VsZWN0IEdFTkVSSUNfVEJTWU5DCi0Jc2VsZWN0IFBQQ19TQ09NCiAJc2VsZWN0IEVQQVBSX0JPT1QKIAlzZWxlY3QgUFBDX1dTUAotCXNlbGVjdCBQUENfWElDUwotCXNlbGVjdCBQUENfSUNQX05BVElWRQogCWRlZmF1bHQgeQogCiBlbmRtZW51CkBAIC0yMSw4ICsyNCwzIEBACiBjb25maWcgUFBDX0EyX0REMgogCWJvb2wgIlN1cHBvcnQgZm9yIEREMiBiYXNlZCBBMi9XU1Agc3lzdGVtcyIKIAlkZXBlbmRzIG9uIFBQQ19BMgotCi1jb25maWcgV09SS0FST1VORF9FUlJBVFVNXzQ2MwotCWRlcGVuZHMgb24gUFBDX0EyX0REMgotCWJvb2wgIldvcmthcm91bmQgZXJyYXR1bSA0NjMiCi0JZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCmluZGV4IDA5NWJlNzMuLmExNDg2YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCkBAIC00LDMgKzQsNSBAQAogb2JqLSQoQ09ORklHX1BQQ19QU1IyKQkJKz0gcHNyMi5vIG9wYl9waWMubwogb2JqLSQoQ09ORklHX1BQQ19XU1ApCQkrPSBzY29tX3dzcC5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc2NvbV9zbXAubworb2JqLSQoQ09ORklHX1BDSSkJCSs9IHdzcF9wY2kubworb2JqLSQoQ09ORklHX1BDSV9NU0kpCQkrPSBtc2kubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2ljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmMKaW5kZXggZTUzYmQ5ZS4uNTc2ODc0MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaWNzLmMKQEAgLTcxMCwzICs3MTAsNTEgQEAKIAkvKiBXZSBuZWVkIHRvIHBhdGNoIG91ciBpcnEgY2hpcCdzIEVPSSB0byBwb2ludCB0byB0aGUgcmlnaHQgSUNQICovCiAJd3NwX2lycV9jaGlwLmlycV9lb2kgPSBpY3Bfb3BzLT5lb2k7CiB9CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIHZvaWQgd3NwX2ljc19tc2lfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJd3NwX2NoaXBfdW5tYXNrX2lycShkKTsKKwl1bm1hc2tfbXNpX2lycShkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB3c3BfaWNzX21zaV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl3c3BfaWNzX21zaV91bm1hc2tfaXJxKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3c3BfaWNzX21zaV9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJbWFza19tc2lfaXJxKGQpOworCXdzcF9jaGlwX21hc2tfaXJxKGQpOworfQorCisvKgorICogd2UgZG8gaXQgdGhpcyB3YXkgYmVjYXVzZSB3ZSByZWFzc2luZ2UgZGVmYXVsdCBFT0kgaGFuZGxpbmcgaW4KKyAqIGlycV9pbml0KCkgYWJvdmUKKyAqLworc3RhdGljIHZvaWQgd3NwX2ljc19lb2koc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXdzcF9pcnFfY2hpcC5pcnFfZW9pKGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdzcF9pY3NfbXNpID0geworCS5uYW1lID0gIldTUCBJQ1MgTVNJIiwKKwkuaXJxX3N0YXJ0dXAgPSB3c3BfaWNzX21zaV9zdGFydHVwLAorCS5pcnFfbWFzayA9IHdzcF9pY3NfbXNpX21hc2tfaXJxLAorCS5pcnFfdW5tYXNrID0gd3NwX2ljc19tc2lfdW5tYXNrX2lycSwKKwkuaXJxX2VvaSA9IHdzcF9pY3NfZW9pLAorCS5pcnFfc2V0X2FmZmluaXR5ID0gd3NwX2NoaXBfc2V0X2FmZmluaXR5Cit9OworCit2b2lkIHdzcF9pY3Nfc2V0X21zaV9jaGlwKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX3NldF9jaGlwKGlycSwgJndzcF9pY3NfbXNpKTsKK30KKwordm9pZCB3c3BfaWNzX3NldF9zdGRfY2hpcCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlycV9zZXRfY2hpcChpcnEsICZ3c3BfaXJxX2NoaXApOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9pY3MuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2ljcy5oCmluZGV4IGUzNGQ1MzEuLjA3YjY0NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2ljcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2ljcy5oCkBAIC0xNyw0ICsxNyw5IEBACiBleHRlcm4gaW50IHdzcF9pY3NfYWxsb2NfaXJxKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCBudW0pOwogZXh0ZXJuIHZvaWQgd3NwX2ljc19mcmVlX2lycShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCB1bnNpZ25lZCBpbnQgaXJxKTsKIAorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitleHRlcm4gdm9pZCB3c3BfaWNzX3NldF9tc2lfY2hpcCh1bnNpZ25lZCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIHdzcF9pY3Nfc2V0X3N0ZF9jaGlwKHVuc2lnbmVkIGludCBpcnEpOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKICNlbmRpZiAvKiBfX0lDU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL21zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDg4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAibXNpLmgiCisjaW5jbHVkZSAiaWNzLmgiCisjaW5jbHVkZSAid3NwX3BjaS5oIgorCisvKiBNYWdpYyBhZGRyZXNzZXMgZm9yIDMyICYgNjQtYml0IE1TSXMgd2l0aCBoYXJkY29kZWQgTVZFIDAgKi8KKyNkZWZpbmUgTVNJX0FERFJfMzIJCTB4RkZGRjAwMDB1bAorI2RlZmluZSBNU0lfQUREUl82NAkJMHgxMDAwMDAwMDAwMDAwMDAwdWwKKworaW50IHdzcF9zZXR1cF9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYywgaW50IHR5cGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKwlzdHJ1Y3QgbXNpX21zZyBtc2c7CisJdW5zaWduZWQgaW50IHZpcnE7CisJaW50IGh3aXJxOworCisJcGhiID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlpZiAoIXBoYikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmRldi0+bXNpX2xpc3QsIHN0cnVjdCBtc2lfZGVzYywgbGlzdCk7CisJaWYgKGVudHJ5LT5tc2lfYXR0cmliLmlzXzY0KSB7CisJCW1zZy5hZGRyZXNzX2xvID0gMDsKKwkJbXNnLmFkZHJlc3NfaGkgPSBNU0lfQUREUl82NCA+PiAzMjsKKwl9IGVsc2UgeworCQltc2cuYWRkcmVzc19sbyA9IE1TSV9BRERSXzMyOworCQltc2cuYWRkcmVzc19oaSA9IDA7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaHdpcnEgPSB3c3BfaWNzX2FsbG9jX2lycShwaGItPmRuLCAxKTsKKwkJaWYgKGh3aXJxIDwgMCkgeworCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAid3NwX21zaTogaHdpcnEgYWxsb2MgZmFpbGVkIVxuIik7CisJCQlyZXR1cm4gaHdpcnE7CisJCX0KKworCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3aXJxKTsKKwkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJ3c3BfbXNpOiB2aXJxIGFsbG9jIGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJ3c3BfbXNpOiBhbGxvY2F0ZWQgaXJxICUjeC8lI3hcbiIsCisJCQlod2lycSwgdmlycSk7CisKKwkJd3NwX2ljc19zZXRfbXNpX2NoaXAodmlycSk7CisJCWlycV9zZXRfbXNpX2Rlc2ModmlycSwgZW50cnkpOworCQltc2cuZGF0YSA9IGh3aXJxICYgWElWRV9BRERSX01BU0s7CisJCXdyaXRlX21zaV9tc2codmlycSwgJm1zZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd3NwX3RlYXJkb3duX21zaV9pcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKwlpbnQgaHdpcnE7CisKKwlwaGIgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCisJZGV2X2RiZygmZGV2LT5kZXYsICJ3c3BfbXNpOiB0ZWFyaW5nIGRvd24gbXNpIGlycXNcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT5pcnEgPT0gTk9fSVJRKQorCQkJY29udGludWU7CisKKwkJaXJxX3NldF9tc2lfZGVzYyhlbnRyeS0+aXJxLCBOVUxMKTsKKwkJd3NwX2ljc19zZXRfc3RkX2NoaXAoZW50cnktPmlycSk7CisKKwkJaHdpcnEgPSB2aXJxX3RvX2h3KGVudHJ5LT5pcnEpOworCQkvKiBJbiB0aGlzIG9yZGVyIHRvIGF2b2lkIHJhY2luZyB3aXRoIGlycV9jcmVhdGVfbWFwcGluZygpICovCisJCWlycV9kaXNwb3NlX21hcHBpbmcoZW50cnktPmlycSk7CisJCXdzcF9pY3NfZnJlZV9pcnEocGhiLT5kbiwgaHdpcnEpOworCX0KK30KKwordm9pZCB3c3Bfc2V0dXBfcGhiX21zaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKK3sKKwkvKiBDcmVhdGUgYSBzaW5nbGUgTVZFIGF0IG9mZnNldCAwIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nICovCisJb3V0X2JlNjQocGhiLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfQUREUiwgUENJRV9SRUdfSU9EQV9BRF9UQkxfTVZUKTsKKwlvdXRfYmU2NChwaGItPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9EQVRBMCwgMXVsbCA8PCA2Myk7CisKKwlwcGNfbWQuc2V0dXBfbXNpX2lycXMgPSB3c3Bfc2V0dXBfbXNpX2lycXM7CisJcHBjX21kLnRlYXJkb3duX21zaV9pcnFzID0gd3NwX3RlYXJkb3duX21zaV9pcnFzOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvbXNpLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9tc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWIyN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvbXNpLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19XU1BfTVNJX0gKKyNkZWZpbmUgX19XU1BfTVNJX0gKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitleHRlcm4gdm9pZCB3c3Bfc2V0dXBfcGhiX21zaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHdzcF9zZXR1cF9waGJfbXNpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKSB7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogX19XU1BfTVNJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3BzcjIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3BzcjIuYwppbmRleCA0MGYyODkxLi4xNjZmMmU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvcHNyMi5jCkBAIC02Myw2ICs2MywxMCBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlhMl9zZXR1cF9zbXAoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwl3c3Bfc2V0dXBfcGNpKCk7CisjZW5kaWYKKwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwc3IyX3Byb2JlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5oCmluZGV4IDdjM2UwODcuLjMzNDc5ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5oCkBAIC0zLDYgKzMsOSBAQAogCiAjaW5jbHVkZSA8YXNtL3dzcC5oPgogCisvKiBEZXZ0cmVlIGNvbXBhdGlibGUgc3RyaW5ncyBmb3IgbWFqb3IgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lFX0NPTVBBVElCTEUgICAgICJpYm0sd3NwLXBjaWV4IgorCiBleHRlcm4gdm9pZCB3c3Bfc2V0dXBfcGNpKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2NvbV9pbml0X3dzcCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjYyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmMKQEAgLTAsMCArMSwxMTMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgQmVuIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL2lvLXdvcmthcm91bmRzLmg+CisKKyNpbmNsdWRlICJ3c3AuaCIKKyNpbmNsdWRlICJ3c3BfcGNpLmgiCisjaW5jbHVkZSAibXNpLmgiCisKKworLyogTWF4IG51bWJlciBvZiBUVlRzIGZvciBvbmUgdGFibGUuIE9ubHkgMzItYml0IHRhYmxlcyBjYW4gdXNlCisgKiBtdWx0aXBsZSBUVlRzIGFuZCBzbyB0aGUgbWF4IGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgdGh1cyA4CisgKiBzaW5jZSBvbmx5IDJHIG9mIERNQSBzcGFjZSBpcyBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBNQVhfVEFCTEVfVFZUX0NPVU5UCQk4CisKK3N0cnVjdCB3c3BfZG1hX3RhYmxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CisJc3RydWN0IGlvbW11X3RhYmxlCXRhYmxlOworCXN0cnVjdCB3c3BfcGhiCSpwaGI7CisJc3RydWN0IHBhZ2UJCSp0Y2VzW01BWF9UQUJMRV9UVlRfQ09VTlRdOworfTsKKworLyogV2Ugc3VwcG9ydCBETUEgcmVnaW9ucyBmcm9tIDAuLi4yRyBpbiAzMmJpdCBzcGFjZSAobm8gc3VwcG9ydCBmb3IKKyAqIDY0LWJpdCBETUEganVzdCB5ZXQpLiBFYWNoIGRldmljZSBnZXRzIGEgc2VwYXJhdGUgVENFIHRhYmxlIChUVlQKKyAqIGVudHJ5KSB3aXRoIHZhbGlkYXRpb24gZW5hYmxlZCAodGhvdWdoIG5vdCBzdXBwb3J0ZWQgYnkgU2ltaUNTCisgKiBqdXN0IHlldCkuCisgKgorICogVG8gc2ltcGxpZnkgdGhpbmdzLCB3ZSBkaXZpZGUgdGhpcyAyRyBzcGFjZSBpbnRvIE4gcmVnaW9ucyBiYXNlZAorICogb24gdGhlIGNvbnN0YW50IGJlbG93IHdoaWNoIGNvdWxkIGJlIHR1cm5lZCBpbnRvIGEgdHVuYWJsZSBldmVudHVhbGx5CisgKgorICogV2UgdGhlbiBhc3NpZ24gZHluYW1pY2FsbHkgdGhvc2UgcmVnaW9ucyB0byBkZXZpY2VzIGFzIHRoZXkgc2hvdyB1cC4KKyAqCisgKiBXZSB1c2UgYSBiaXRtYXAgYXMgYW4gYWxsb2NhdG9yIGZvciB0aGVzZS4KKyAqCisgKiBUYWJsZXMgYXJlIGFsbG9jYXRlZC9jcmVhdGVkIGR5bmFtaWNhbGx5IGFzIGRldmljZXMgYXJlIGRpc2NvdmVyZWQsCisgKiBtdWx0aXBsZSBUVlQgZW50cmllcyBhcmUgdXNlZCBpZiBuZWVkZWQKKyAqCisgKiBXaGVuIDY0LWJpdCBETUEgc3VwcG9ydCBpcyBhZGRlZCB3ZSBzaG91bGQgc2ltcGx5IHVzZSBhIHNlcGFyYXRlIHNldAorICogb2YgbGFyZ2VyIHJlZ2lvbnMgKHRoZSBIVyBzdXBwb3J0cyA2NCBUVlQgZW50cmllcykuIFdlIGNhbgorICogYWRkaXRpb25hbGx5IGNyZWF0ZSBhIGJ5cGFzcyByZWdpb24gaW4gNjQtYml0IHNwYWNlIGZvciBwZXJmb3JtYW5jZXMKKyAqIHRob3VnaCB0aGF0IHdvdWxkIGhhdmUgYSBjb3N0IGluIHRlcm0gb2Ygc2VjdXJpdHkuCisgKgorICogSWYgeW91IHNldCBOVU1fRE1BMzJfUkVHSU9OUyB0byAxLCB0aGVuIGEgc2luZ2xlIHRhYmxlIGlzIHNoYXJlZAorICogZm9yIGFsbCBkZXZpY2VzIGFuZCBidXMvZGV2L2ZuIHZhbGlkYXRpb24gaXMgZGlzYWJsZWQKKyAqCisgKiBOb3RlIHRoYXQgYSBETUEzMiByZWdpb24gY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAyNTZNIHNvIHRoZSBtYXgKKyAqIHN1cHBvcnRlZCBoZXJlIGZvciBub3cgaXMgOC4gV2UgZG9uJ3QgeWV0IHN1cHBvcnQgc2hhcmluZyByZWdpb25zCisgKiBiZXR3ZWVuIG11bHRpcGxlIGRldmljZXMgc28gdGhlIG1heCBudW1iZXIgb2YgZGV2aWNlcyBzdXBwb3J0ZWQKKyAqIGlzIE1BWF9UQUJMRV9UVlRfQ09VTlQuCisgKi8KKyNkZWZpbmUgTlVNX0RNQTMyX1JFR0lPTlMJMQorCitzdHJ1Y3Qgd3NwX3BoYiB7CisJc3RydWN0IHBjaV9jb250cm9sbGVyCSpob3NlOworCisJLyogTG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2YgZG1hIHRhYmxlcy4KKwkgKiBJdCBkb2VzIC1ub3QtIHByb3RlY3QgYWdhaW5zdCBkbWFfKiBvcGVyYXRpb25zIG9uCisJICogdGhvc2UgdGFibGVzLCB0aG9zZSBzaG91bGQgYmUgc3RvcHBlZCBiZWZvcmUgYW4gZW50cnkKKwkgKiBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCisJICoKKwkgKiBUaGUgbG9jayBpcyBhbHNvIHVzZWQgZm9yIGVycm9yIGhhbmRsaW5nIG9wZXJhdGlvbnMKKwkgKi8KKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJZG1hX3RhYmxlczsKKwl1bnNpZ25lZCBsb25nCQlkbWEzMl9tYXA7CisJdW5zaWduZWQgbG9uZwkJZG1hMzJfYmFzZTsKKwl1bnNpZ25lZCBpbnQJCWRtYTMyX251bV9yZWdpb25zOworCXVuc2lnbmVkIGxvbmcJCWRtYTMyX3JlZ2lvbl9zaXplOworCisJLyogRGVidWdmcyBzdHVmZiAqLworCXN0cnVjdCBkZW50cnkJCSpkZGlyOworCisJc3RydWN0IGxpc3RfaGVhZAlhbGw7Cit9Oworc3RhdGljIExJU1RfSEVBRCh3c3BfcGhicyk7CisKKy8vI2RlZmluZSBjZmdfZGVidWcoZm10Li4uKQlwcl9kZWJ1ZyhmbXQpCisjZGVmaW5lIGNmZ19kZWJ1ZyhmbXQuLi4pCisKKworc3RhdGljIGludCB3c3BfcGNpZV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJaW50IHN1Ym9mZjsKKwl1NjQgYWRkcjsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCWlmIChvZmZzZXQgPj0gMHgxMDAwKQorCQlyZXR1cm4gIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKwlhZGRyID0gUENJRV9SRUdfQ0FfRU5BQkxFIHwKKwkJKCh1NjQpYnVzLT5udW1iZXIpIDw8IFBDSUVfUkVHX0NBX0JVU19TSElGVCB8CisJCSgodTY0KWRldmZuKSA8PCBQQ0lFX1JFR19DQV9GVU5DX1NISUZUIHwKKwkJKCh1NjQpb2Zmc2V0ICYgfjMpIDw8IFBDSUVfUkVHX0NBX1JFR19TSElGVDsKKwlzdWJvZmYgPSBvZmZzZXQgJiAzOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJYWRkciB8PSAoMHg4dWwgPj4gc3Vib2ZmKSA8PCBQQ0lFX1JFR19DQV9CRV9TSElGVDsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfQUREUkVTUywgYWRkcik7CisJCSp2YWwgPSAoaW5fbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBKQorCQkJPj4gKHN1Ym9mZiA8PCAzKSkgJiAweGZmOworCQljZmdfZGVidWcoInJlYWQgMSAlMDJ4OiUwMng6JTAyeCArICUwMngvJXggYWRkcj0weCVsbHggdmFsPSUwMnhcbiIsCisJCQkgIGJ1cy0+bnVtYmVyLCBkZXZmbiA+PiAzLCBkZXZmbiAmIDcsCisJCQkgIG9mZnNldCwgc3Vib2ZmLCBhZGRyLCAqdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhZGRyIHw9ICgweGN1bCA+PiBzdWJvZmYpIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKKwkJKnZhbCA9IChpbl9sZTMyKGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0RBVEEpCisJCQk+PiAoc3Vib2ZmIDw8IDMpKSAmIDB4ZmZmZjsKKwkJY2ZnX2RlYnVnKCJyZWFkIDIgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDR4XG4iLAorCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAorCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgKnZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFkZHIgfD0gMHhmdWwgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOworCQkqdmFsID0gaW5fbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBKTsKKwkJY2ZnX2RlYnVnKCJyZWFkIDQgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDh4XG4iLAorCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAorCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgKnZhbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHdzcF9wY2llX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJICAgaW50IG9mZnNldCwgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJaW50IHN1Ym9mZjsKKwl1NjQgYWRkcjsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCWlmIChvZmZzZXQgPj0gMHgxMDAwKQorCQlyZXR1cm4gIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKwlhZGRyID0gUENJRV9SRUdfQ0FfRU5BQkxFIHwKKwkJKCh1NjQpYnVzLT5udW1iZXIpIDw8IFBDSUVfUkVHX0NBX0JVU19TSElGVCB8CisJCSgodTY0KWRldmZuKSA8PCBQQ0lFX1JFR19DQV9GVU5DX1NISUZUIHwKKwkJKCh1NjQpb2Zmc2V0ICYgfjMpIDw8IFBDSUVfUkVHX0NBX1JFR19TSElGVDsKKwlzdWJvZmYgPSBvZmZzZXQgJiAzOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCWFkZHIgfD0gKDB4OHVsID4+IHN1Ym9mZikgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7CisJCXZhbCA8PD0gc3Vib2ZmIDw8IDM7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOworCQlvdXRfbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBLCB2YWwpOworCQljZmdfZGVidWcoIndyaXRlIDEgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDJ4XG4iLAorCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAorCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhZGRyIHw9ICgweGN1bCA+PiBzdWJvZmYpIDw8IFBDSUVfUkVHX0NBX0JFX1NISUZUOworCQl2YWwgPDw9IHN1Ym9mZiA8PCAzOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTLCBhZGRyKTsKKwkJb3V0X2xlMzIoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19DT05GSUdfREFUQSwgdmFsKTsKKwkJY2ZnX2RlYnVnKCJ3cml0ZSAyICUwMng6JTAyeDolMDJ4ICsgJTAyeC8leCBhZGRyPTB4JWxseCB2YWw9JTA0eFxuIiwKKwkJCSAgYnVzLT5udW1iZXIsIGRldmZuID4+IDMsIGRldmZuICYgNywKKwkJCSAgb2Zmc2V0LCBzdWJvZmYsIGFkZHIsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFkZHIgfD0gMHhmdWwgPDwgUENJRV9SRUdfQ0FfQkVfU0hJRlQ7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfQ09ORklHX0FERFJFU1MsIGFkZHIpOworCQlvdXRfbGUzMihob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0NPTkZJR19EQVRBLCB2YWwpOworCQljZmdfZGVidWcoIndyaXRlIDQgJTAyeDolMDJ4OiUwMnggKyAlMDJ4LyV4IGFkZHI9MHglbGx4IHZhbD0lMDh4XG4iLAorCQkJICBidXMtPm51bWJlciwgZGV2Zm4gPj4gMywgZGV2Zm4gJiA3LAorCQkJICBvZmZzZXQsIHN1Ym9mZiwgYWRkciwgdmFsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyB3c3BfcGNpZV9wY2lfb3BzID0KK3sKKwkucmVhZCA9IHdzcF9wY2llX3JlYWRfY29uZmlnLAorCS53cml0ZSA9IHdzcF9wY2llX3dyaXRlX2NvbmZpZywKK307CisKKyNkZWZpbmUgVENFX1NISUZUCQkxMgorI2RlZmluZSBUQ0VfUEFHRV9TSVpFCQkoMSA8PCBUQ0VfU0hJRlQpCisjZGVmaW5lIFRDRV9QQ0lfV1JJVEUJCTB4MgkJIC8qIHdyaXRlIGZyb20gUENJIGFsbG93ZWQgKi8KKyNkZWZpbmUgVENFX1BDSV9SRUFECQkweDEJIAkgLyogcmVhZCBmcm9tIFBDSSBhbGxvd2VkICovCisjZGVmaW5lIFRDRV9SUE5fTUFTSwkJMHgzZmZmZmZmZmZmZnVsICAvKiA0Mi1iaXQgUlBOICg0SyBwYWdlcykgKi8KKyNkZWZpbmUgVENFX1JQTl9TSElGVAkJMTIKKworLy8jZGVmaW5lIGRtYV9kZWJ1ZyhmbXQuLi4pCXByX2RlYnVnKGZtdCkKKyNkZWZpbmUgZG1hX2RlYnVnKGZtdC4uLikKKworc3RhdGljIGludCB0Y2VfYnVpbGRfd3NwKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQoreworCXN0cnVjdCB3c3BfZG1hX3RhYmxlICpwdGJsID0gY29udGFpbmVyX29mKHRibCwKKwkJCQkJCSAgICBzdHJ1Y3Qgd3NwX2RtYV90YWJsZSwKKwkJCQkJCSAgICB0YWJsZSk7CisJdTY0IHByb3RvX3RjZTsKKwl1NjQgKnRjZXA7CisJdTY0IHJwbjsKKworCXByb3RvX3RjZSA9IFRDRV9QQ0lfUkVBRDsKKyNpZmRlZiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0REMV9UQ0VfQlVHUworCXByb3RvX3RjZSB8PSBUQ0VfUENJX1dSSVRFOworI2Vsc2UKKwlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCisJCXByb3RvX3RjZSB8PSBUQ0VfUENJX1dSSVRFOworI2VuZGlmCisKKwkvKiBYWFggTWFrZSB0aGlzIGZhc3RlciBieSBmYWN0b3Jpbmcgb3V0IHRoZSBwYWdlIGFkZHJlc3MgZm9yCisJICogd2l0aGluIGEgVENFIHRhYmxlCisJICovCisJd2hpbGUgKG5wYWdlcy0tKSB7CisJCS8qIFdlIGRvbid0IHVzZSBpdC0+YmFzZSBhcyB0aGUgdGFibGUgY2FuIGJlIHNjYXR0ZXJlZCAqLworCQl0Y2VwID0gKHU2NCAqKXBhZ2VfYWRkcmVzcyhwdGJsLT50Y2VzW2luZGV4ID4+IDE2XSk7CisJCXRjZXAgKz0gKGluZGV4ICYgMHhmZmZmKTsKKworCQkvKiBjYW4ndCBtb3ZlIHRoaXMgb3V0IHNpbmNlIHdlIG1pZ2h0IGNyb3NzIExNQiBib3VuZGFyeSAqLworCQlycG4gPSBfX3BhKHVhZGRyKSA+PiBUQ0VfU0hJRlQ7CisJCSp0Y2VwID0gcHJvdG9fdGNlIHwgKHJwbiAmIFRDRV9SUE5fTUFTSykgPDwgVENFX1JQTl9TSElGVDsKKworCQlkbWFfZGVidWcoIltETUFdIFRDRSAlcCBzZXQgdG8gMHglMDE2bGx4IChkbWEgYWRkcjogMHglbHgpXG4iLAorCQkJICB0Y2VwLCAqdGNlcCwgKHRibC0+aXRfb2Zmc2V0ICsgaW5kZXgpIDw8IElPTU1VX1BBR0VfU0hJRlQpOworCisJCXVhZGRyICs9IFRDRV9QQUdFX1NJWkU7CisJCWluZGV4Kys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0Y2VfZnJlZV93c3Aoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzKQoreworCXN0cnVjdCB3c3BfZG1hX3RhYmxlICpwdGJsID0gY29udGFpbmVyX29mKHRibCwKKwkJCQkJCSAgICBzdHJ1Y3Qgd3NwX2RtYV90YWJsZSwKKwkJCQkJCSAgICB0YWJsZSk7CisjaWZuZGVmIENPTkZJR19XU1BfREQxX1dPUktBUk9VTkRfREQxX1RDRV9CVUdTCisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcHRibC0+cGhiLT5ob3NlOworI2VuZGlmCisJdTY0ICp0Y2VwOworCisJLyogWFhYIE1ha2UgdGhpcyBmYXN0ZXIgYnkgZmFjdG9yaW5nIG91dCB0aGUgcGFnZSBhZGRyZXNzIGZvcgorCSAqIHdpdGhpbiBhIFRDRSB0YWJsZS4gQWxzbyB1c2UgbGluZS1raWxsIG9wdGlvbiB0byBraWxsIG11bHRpcGxlCisJICogVENFcyBhdCBvbmNlCisJICovCisJd2hpbGUgKG5wYWdlcy0tKSB7CisJCS8qIFdlIGRvbid0IHVzZSBpdC0+YmFzZSBhcyB0aGUgdGFibGUgY2FuIGJlIHNjYXR0ZXJlZCAqLworCQl0Y2VwID0gKHU2NCAqKXBhZ2VfYWRkcmVzcyhwdGJsLT50Y2VzW2luZGV4ID4+IDE2XSk7CisJCXRjZXAgKz0gKGluZGV4ICYgMHhmZmZmKTsKKwkJZG1hX2RlYnVnKCJbRE1BXSBUQ0UgJXAgY2xlYXJlZFxuIiwgdGNlcCk7CisJCSp0Y2VwID0gMDsKKyNpZm5kZWYgQ09ORklHX1dTUF9ERDFfV09SS0FST1VORF9ERDFfVENFX0JVR1MKKwkJLyogRG9uJ3Qgd3JpdGUgdGhlcmUgc2luY2UgaXQgd291bGQgcG9sbHV0ZSBvdGhlciBNTUlPIGFjY2Vzc2VzICovCisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfVENFX0tJTEwsCisJCQkgUENJRV9SRUdfVENFS0lMTF9TSU5HTEUgfCBQQ0lFX1JFR19UQ0VLSUxMX1BTXzRLIHwKKwkJCSAoX19wYSh0Y2VwKSAmIFBDSUVfUkVHX1RDRUtJTExfQUREUl9NQVNLKSk7CisjZW5kaWYKKwkJaW5kZXgrKzsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd3NwX2RtYV90YWJsZSAqd3NwX3BjaV9jcmVhdGVfZG1hMzJfdGFibGUoc3RydWN0IHdzcF9waGIgKnBoYiwKKwkJCQkJCQkgICAgdW5zaWduZWQgaW50IHJlZ2lvbiwKKwkJCQkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnZhbGlkYXRlKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBoYi0+aG9zZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBwaGItPmRtYTMyX3JlZ2lvbl9zaXplOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHBoYi0+ZG1hMzJfcmVnaW9uX3NpemUgKiByZWdpb24gKyBwaGItPmRtYTMyX2Jhc2U7CisJc3RydWN0IHdzcF9kbWFfdGFibGUgKnRibDsKKwlpbnQgdHZ0c19wZXJfdGFibGUsIGksIHR2dCwgbmlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluaWQgPSBvZl9ub2RlX3RvX25pZChwaGItPmhvc2UtPmRuKTsKKworCS8qIENhbGN1bGF0ZSBob3cgbWFueSBUVlRzIGFyZSBuZWVkZWQgKi8KKwl0dnRzX3Blcl90YWJsZSA9IHNpemUgLyAweDEwMDAwMDAwOworCWlmICh0dnRzX3Blcl90YWJsZSA9PSAwKQorCQl0dnRzX3Blcl90YWJsZSA9IDE7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGJhc2UgVFZUIGluZGV4LiBXZSBrbm93IGFsbCB0YWJsZXMgaGF2ZSB0aGUgc2FtZQorCSAqIHNpemUgc28gd2UganVzdCBkbyBhIHNpbXBsZSBtdWx0aXBseSBoZXJlCisJICovCisJdHZ0ID0gcmVnaW9uICogdHZ0c19wZXJfdGFibGU7CisKKwlwcl9kZWJ1ZygiICAgICAgICAgUmVnaW9uIDogJWRcbiIsIHJlZ2lvbik7CisJcHJfZGVidWcoIiAgICAgIERNQSByYW5nZSA6IDB4JTA4bHguLjB4JTA4bHhcbiIsIGFkZHIsIGFkZHIgKyBzaXplIC0gMSk7CisJcHJfZGVidWcoIiBOdW1iZXIgb2YgVFZUcyA6ICVkXG4iLCB0dnRzX3Blcl90YWJsZSk7CisJcHJfZGVidWcoIiAgICAgICBCYXNlIFRWVCA6ICVkXG4iLCB0dnQpOworCXByX2RlYnVnKCIgICAgICAgICBOb2RlICAgOiAlZFxuIiwgbmlkKTsKKworCXRibCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHdzcF9kbWFfdGFibGUpLCBHRlBfS0VSTkVMLCBuaWQpOworCWlmICghdGJsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl0YmwtPnBoYiA9IHBoYjsKKworCS8qIENyZWF0ZSBhcyBtYW55IFRWVHMgYXMgbmVlZGVkLCBlYWNoIHJlcHJlc2VudHMgMjU2TSBhdCBtb3N0ICovCisJZm9yIChpID0gMDsgaSA8IHR2dHNfcGVyX3RhYmxlOyBpKyspIHsKKwkJdTY0IHR2dF9kYXRhMSwgdHZ0X2RhdGEwOworCisJCS8qIEFsbG9jYXRlIHRhYmxlLiBXZSB1c2UgYSA0SyBUQ0Ugc2l6ZSBmb3Igbm93IGFsd2F5cyBzbworCQkgKiBvbmUgdGFibGUgaXMgYWx3YXlzIDggKiAoMjU4TSAvIDRLKSA9PSA1MTJLCisJCSAqLworCQl0YmwtPnRjZXNbaV0gPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKDB4ODAwMDApKTsKKwkJaWYgKHRibC0+dGNlc1tpXSA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCQltZW1zZXQocGFnZV9hZGRyZXNzKHRibC0+dGNlc1tpXSksIDAsIDB4ODAwMDApOworCisJCXByX2RlYnVnKCIgVENFIHRhYmxlICVkIGF0IDogJXBcbiIsIGksIHBhZ2VfYWRkcmVzcyh0YmwtPnRjZXNbaV0pKTsKKworCQkvKiBUYWJsZSBzaXplLiBXZSBjdXJyZW50bHkgc2V0IGl0IHRvIGJlIHRoZSB3aG9sZSAyNTZNIHJlZ2lvbiAqLworCQl0dnRfZGF0YTAgPSAydWxsIDw8IElPREFfVFZUMF9UQ0VfVEFCTEVfU0laRV9TSElGVDsKKwkJLyogSU8gcGFnZSBzaXplIHNldCB0byA0SyAqLworCQl0dnRfZGF0YTEgPSAxdWxsIDw8IElPREFfVFZUMV9JT19QQUdFX1NJWkVfU0hJRlQ7CisJCS8qIFNoaWZ0IGluIHRoZSBhZGRyZXNzICovCisJCXR2dF9kYXRhMCB8PSBfX3BhKHBhZ2VfYWRkcmVzcyh0YmwtPnRjZXNbaV0pKSA8PCBJT0RBX1RWVDBfVFRBX1NISUZUOworCisJCS8qIFZhbGlkYXRpb24gc3R1ZmYuIFdlIG9ubHkgdmFsaWRhdGUgZnVsbHkgYnVzL2Rldi9mbiBmb3Igbm93CisJCSAqIG9uZSBkYXkgbWF5YmUgd2UgY2FuIGdyb3VwIGRldmljZXMgYnV0IHRoYXQgaXNuJ3QgdGhlIGNhc2UKKwkJICogYXQgdGhlIG1vbWVudAorCQkgKi8KKwkJaWYgKHZhbGlkYXRlKSB7CisJCQl0dnRfZGF0YTAgfD0gSU9EQV9UVlQwX0JVU05VTV9WQUxJRF9NQVNLOworCQkJdHZ0X2RhdGEwIHw9IHZhbGlkYXRlLT5idXMtPm51bWJlcjsKKwkJCXR2dF9kYXRhMSB8PSBJT0RBX1RWVDFfREVWTlVNX1ZBTElEOworCQkJdHZ0X2RhdGExIHw9ICgodTY0KVBDSV9TTE9UKHZhbGlkYXRlLT5kZXZmbikpCisJCQkJPDwgSU9EQV9UVlQxX0RFVk5VTV9WQUxVRV9TSElGVDsKKwkJCXR2dF9kYXRhMSB8PSBJT0RBX1RWVDFfRlVOQ05VTV9WQUxJRDsKKwkJCXR2dF9kYXRhMSB8PSAoKHU2NClQQ0lfRlVOQyh2YWxpZGF0ZS0+ZGV2Zm4pKQorCQkJCTw8IElPREFfVFZUMV9GVU5DTlVNX1ZBTFVFX1NISUZUOworCQl9CisKKwkJLyogWFggUEUgbnVtYmVyIGlzIGFsd2F5cyAwIGZvciBub3cgKi8KKworCQkvKiBQcm9ncmFtIHRoZSB2YWx1ZXMgdXNpbmcgdGhlIFBIQiBsb2NrICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0FERFIsCisJCQkgKHR2dCArIGkpIHwgUENJRV9SRUdfSU9EQV9BRF9UQkxfVFZUKTsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0RBVEExLCB0dnRfZGF0YTEpOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPREFfREFUQTAsIHR2dF9kYXRhMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYi0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIEluaXQgYml0cyBhbmQgcGllY2VzICovCisJdGJsLT50YWJsZS5pdF9ibG9ja3NpemUgPSAxNjsKKwl0YmwtPnRhYmxlLml0X29mZnNldCA9IGFkZHIgPj4gSU9NTVVfUEFHRV9TSElGVDsKKwl0YmwtPnRhYmxlLml0X3NpemUgPSBzaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CisKKwkvKgorCSAqIEl0J3MgYWxyZWFkeSBibGFuayBidXQgd2UgY2xlYXIgaXQgYW55d2F5LgorCSAqIENvbnNpZGVyIGFuIGFkaXRpb25hIGludGVyZmFjZSB0aGF0IG1ha2VzIGNsZWFpbmcgb3B0aW9uYWwKKwkgKi8KKwlpb21tdV9pbml0X3RhYmxlKCZ0YmwtPnRhYmxlLCBuaWQpOworCisJbGlzdF9hZGQoJnRibC0+bGluaywgJnBoYi0+ZG1hX3RhYmxlcyk7CisJcmV0dXJuIHRibDsKKworIGZhaWw6CisJcHJfZGVidWcoIiAgRmFpbGVkIHRvIGFsbG9jYXRlIGEgMjU2TSBUQ0UgdGFibGUgIVxuIik7CisJZm9yIChpID0gMDsgaSA8IHR2dHNfcGVyX3RhYmxlOyBpKyspCisJCWlmICh0YmwtPnRjZXNbaV0pCisJCQlfX2ZyZWVfcGFnZXModGJsLT50Y2VzW2ldLCBnZXRfb3JkZXIoMHg4MDAwMCkpOworCWtmcmVlKHRibCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB3c3BfcGNpX2RtYV9kZXZfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRldl9hcmNoZGF0YSAqYXJjaGRhdGEgPSAmcGRldi0+ZGV2LmFyY2hkYXRhOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOworCXN0cnVjdCB3c3BfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdzcF9kbWFfdGFibGUgKnRhYmxlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogRG9uJ3QgYXNzaWduIGFuIGlvbW11IHRhYmxlIHRvIGEgYnJpZGdlICovCisJaWYgKHBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCisJCXJldHVybjsKKworCXByX2RlYnVnKCIlczogU2V0dGluZyB1cCBETUEuLi5cbiIsIHBjaV9uYW1lKHBkZXYpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIG9ubHkgb25lIHJlZ2lvbiwgY2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdCAqLworCWlmIChwaGItPmRtYTMyX251bV9yZWdpb25zID09IDEpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KCZwaGItPmRtYV90YWJsZXMpKQorCQkJdGFibGUgPSB3c3BfcGNpX2NyZWF0ZV9kbWEzMl90YWJsZShwaGIsIDAsIE5VTEwpOworCQllbHNlCisJCQl0YWJsZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBoYi0+ZG1hX3RhYmxlcywKKwkJCQkJCSBzdHJ1Y3Qgd3NwX2RtYV90YWJsZSwKKwkJCQkJCSBsaW5rKTsKKwl9IGVsc2UgeworCQkvKiBlbHNlIGZpbmQgYSBmcmVlIHJlZ2lvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcGhiLT5kbWEzMl9udW1fcmVnaW9ucyAmJiAhdGFibGU7IGkrKykgeworCQkJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChpLCAmcGhiLT5kbWEzMl9tYXApKQorCQkJCWNvbnRpbnVlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiLT5sb2NrLCBmbGFncyk7CisJCQl0YWJsZSA9IHdzcF9wY2lfY3JlYXRlX2RtYTMyX3RhYmxlKHBoYiwgaSwgcGRldik7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBnb3QgYW4gZXJyb3IgKi8KKwlpZiAoSVNfRVJSKHRhYmxlKSkgeworCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIERNQSB0YWJsZSwgZXJyICVsZCAhXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIFBUUl9FUlIodGFibGUpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9yIGEgdmFsaWQgdGFibGUgKi8KKwlpZiAodGFibGUpIHsKKwkJcHJfaW5mbygiJXM6IFNldHVwIGlvbW11OiAzMi1iaXQgRE1BIHJlZ2lvbiAweCUwOGx4Li4weCUwOGx4XG4iLAorCQkJcGNpX25hbWUocGRldiksCisJCQl0YWJsZS0+dGFibGUuaXRfb2Zmc2V0IDw8IElPTU1VX1BBR0VfU0hJRlQsCisJCQkodGFibGUtPnRhYmxlLml0X29mZnNldCA8PCBJT01NVV9QQUdFX1NISUZUKQorCQkJKyBwaGItPmRtYTMyX3JlZ2lvbl9zaXplIC0gMSk7CisJCWFyY2hkYXRhLT5kbWFfZGF0YS5pb21tdV90YWJsZV9iYXNlID0gJnRhYmxlLT50YWJsZTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9yIG5vIHJvb20gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsKKwlwcl9lcnIoIiVzOiBPdXQgb2YgRE1BIHNwYWNlICFcbiIsIHBjaV9uYW1lKHBkZXYpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHdzcF9wY2llX2NvbmZpZ3VyZV9odyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdTY0IHZhbDsKKwlpbnQgaTsKKworI2RlZmluZSBEVU1QX1JFRyh4KSBcCisJcHJfZGVidWcoIiUtMzBzIDogMHglMDE2bGx4XG4iLCAjeCwgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIHgpKQorCisjaWZkZWYgQ09ORklHX1dTUF9ERDFfV09SS0FST1VORF9CQURfUENJRV9DTEFTUworCS8qIFdTUCBERDEgaGFzIGEgYm9ndXMgY2xhc3MgY29kZSBieSBkZWZhdWx0IGluIHRoZSBQQ0ktRQorCSAqIHJvb3QgY29tcGxleCdzIGJ1aWx0LWluIFAyUCBicmlkZ2UgKi8KKwl2YWwgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfU1lTX0NGRzEpOworCXByX2RlYnVnKCJQQ0ktRSBTWVNfQ0ZHMSA6IDB4JWxseFxuIiwgdmFsKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1NZU19DRkcxLAorCQkgKHZhbCAmIH5QQ0lFX1JFR19TWVNfQ0ZHMV9DTEFTU19DT0RFKSB8IChQQ0lfQ0xBU1NfQlJJREdFX1BDSSA8PCA4KSk7CisJcHJfZGVidWcoIlBDSS1FIFNZU19DRkcxIDogMHglbGx4XG4iLCBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfU1lTX0NGRzEpKTsKKyNlbmRpZiAvKiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0JBRF9QQ0lFX0NMQVNTICovCisKKyNpZmRlZiBDT05GSUdfV1NQX0REMV9XT1JLQVJPVU5EX0REMV9UQ0VfQlVHUworCS8qIFhYWCBEaXNhYmxlIFRDRSBjYWNoaW5nLCBpdCBkb2Vzbid0IHdvcmsgb24gREQxICovCisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGU1MCwKKwkJIGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyAweGU1MCkgfCAoM3VsbCA8PCA2MikpOworCXByaW50aygiUENJLUUgREVCVUcgQ09OVFJPTCA1ID0gMHglbGx4XG4iLCBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgMHhlNTApKTsKKyNlbmRpZgorCisJLyogQ29uZmlndXJlIE0zMkEgYW5kIElPLiBJTyBpcyBoYXJkIHdpcmVkIHRvIGJlIDFNIGZvciBub3cgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPX0JBU0VfQUREUiwgaG9zZS0+aW9fYmFzZV9waHlzKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPX0JBU0VfTUFTSywKKwkJICh+KGhvc2UtPmlvX3Jlc291cmNlLmVuZCAtIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0KSkgJgorCQkgMHgzZmZmZmZmZjAwMHVsKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0lPX1NUQVJUX0FERFIsIDAgfCAxKTsKKworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTTMyQV9CQVNFX0FERFIsCisJCSBob3NlLT5tZW1fcmVzb3VyY2VzWzBdLnN0YXJ0KTsKKwlwcmludGsoIldhbnQgdG8gd3JpdGUgdG8gTTMyQV9CQVNFX01BU0sgOiAweCVsbHhcbiIsCisJCSAofihob3NlLT5tZW1fcmVzb3VyY2VzWzBdLmVuZCAtCisJCSAgICBob3NlLT5tZW1fcmVzb3VyY2VzWzBdLnN0YXJ0KSkgJiAweDNmZmZmZmYwMDAwdWwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTTMyQV9CQVNFX01BU0ssCisJCSAofihob3NlLT5tZW1fcmVzb3VyY2VzWzBdLmVuZCAtCisJCSAgICBob3NlLT5tZW1fcmVzb3VyY2VzWzBdLnN0YXJ0KSkgJiAweDNmZmZmZmYwMDAwdWwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTTMyQV9TVEFSVF9BRERSLAorCQkgKGhvc2UtPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQgLSBob3NlLT5wY2lfbWVtX29mZnNldCkgfCAxKTsKKworCS8qIENsZWFyIGFsbCBUVlQgZW50cmllcworCSAqCisJICogWFggTWlnaHQgZ2V0IFRWVCBjb3VudCBmcm9tIGRldmljZS10cmVlCisJICovCisJZm9yIChpID0gMDsgaSA8IElPREFfVFZUX0NPVU5UOyBpKyspIHsKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19JT0RBX0FERFIsCisJCQkgUENJRV9SRUdfSU9EQV9BRF9UQkxfVFZUIHwgaSk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9EQVRBMSwgMCk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfSU9EQV9EQVRBMCwgMCk7CisJfQorCisJLyogS2lsbCB0aGUgVENFIGNhY2hlICovCisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfQ09ORklHLAorCQkgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9DT05GSUcpIHwKKwkJIFBDSUVfUkVHX1BIQkNfNjRCX1RDRV9FTik7CisKKwkvKiBFbmFibGUgMzIgJiA2NC1iaXQgTVNJcywgSU8gc3BhY2UgYW5kIE0zMkEgKi8KKwl2YWwgPSBQQ0lFX1JFR19QSEJDXzMyQklUX01TSV9FTiB8CisJICAgICAgUENJRV9SRUdfUEhCQ19JT19FTiB8CisJICAgICAgUENJRV9SRUdfUEhCQ182NEJJVF9NU0lfRU4gfAorCSAgICAgIFBDSUVfUkVHX1BIQkNfTTMyQV9FTjsKKwlpZiAoaW9tbXVfaXNfb2ZmKQorCQl2YWwgfD0gUENJRV9SRUdfUEhCQ19ETUFfWExBVEVfQllQQVNTOworCXByX2RlYnVnKCJXaWxsIHdyaXRlIGNvbmZpZzogMHglbGx4XG4iLCB2YWwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0NPTkZJRywgdmFsKTsKKworCS8qIEVuYWJsZSBlcnJvciByZXBvcnRpbmcgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTAwLAorCQkgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIDB4ZTAwKSB8IDB4MDAwODAwMDAwMDAwMDAwMHVsbCk7CisKKwkvKiBNYXNrIGFuIGVycm9yIHRoYXQncyBnZW5lcmF0ZWQgd2hlbiBkb2luZyBjb25maWcgc3BhY2UgcHJvYmUKKwkgKgorCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgb25seSBtYXNrIGl0IGFyb3VuZCBjb25maWcgc3BhY2UgY3ljbGVzLi4uIHRoYXQgb3IKKwkgKiBpZ25vcmUgaXQgd2hlbiB3ZSBrbm93IHdlIGhhZCBhIGNvbmZpZyBzcGFjZSBjeWNsZSByZWNlbnRseSA/CisJICovCisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVU19NQVNLLCAweDgwMDAwMDAwMDAwMDAwMDB1bGwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTX01BU0ssIDB4ODAwMDAwMDAwMDAwMDAwMHVsbCk7CisKKwkvKiBFbmFibGUgVVRMIGVycm9ycywgZm9yIG5vdywgYWxsIG9mIHRoZW0gZ290IHRvIFVUTCBpcnEgMQorCSAqCisJICogV2Ugc2ltaWxhcmlseSBtYXNrIG9uZSBVVEwgZXJyb3IgY2F1c2VkIGFwcGFyZW50bHkgZHVyaW5nIG5vcm1hbAorCSAqIHByb2JpbmcuIFdlIGFsc28gbWFzayB0aGUgbGluayB1cCBlcnJvcgorCSAqLworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfU1lTX0JVU19BR0VOVF9FUlJfU0VWLCAwKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1JDX0VSUl9TRVZFUklUWSwgMCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9QQ0lFX1BPUlRfRVJST1JfU0VWLCAwKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1NZU19CVVNfQUdFTlRfSVJRX0VOLCAweGZmZmZmZmZmMDAwMDAwMDB1bGwpOworCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfUENJRV9QT1JUX0lSUV9FTiwgMHhmZjVmZmZmZjAwMDAwMDAwdWxsKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX0VQX0VSUl9JUlFfRU4sIDB4ZmZmZmZmZmYwMDAwMDAwMHVsbCk7CisKKwlEVU1QX1JFRyhQQ0lFX1JFR19JT19CQVNFX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX0lPX0JBU0VfTUFTSyk7CisJRFVNUF9SRUcoUENJRV9SRUdfSU9fU1RBUlRfQUREUik7CisJRFVNUF9SRUcoUENJRV9SRUdfTTMyQV9CQVNFX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX00zMkFfQkFTRV9NQVNLKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NMzJBX1NUQVJUX0FERFIpOworCURVTVBfUkVHKFBDSUVfUkVHX00zMkJfQkFTRV9BRERSKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NMzJCX0JBU0VfTUFTSyk7CisJRFVNUF9SRUcoUENJRV9SRUdfTTMyQl9TVEFSVF9BRERSKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NNjRfQkFTRV9BRERSKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NNjRfQkFTRV9NQVNLKTsKKwlEVU1QX1JFRyhQQ0lFX1JFR19NNjRfU1RBUlRfQUREUik7CisJRFVNUF9SRUcoUENJRV9SRUdfUEhCX0NPTkZJRyk7Cit9CisKK3N0YXRpYyB2b2lkIHdzcF9wY2lfd2FpdF9pb19pZGxlKHN0cnVjdCB3c3BfcGhiICpwaGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1NjQgdmFsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJdmFsID0gaW5fYmU2NChwaGItPmhvc2UtPmNmZ19kYXRhICsgMHhlMDgpOworCQlpZiAoKHZhbCAmIDB4MTkwMDAwMDAwMDAwMDAwMHVsbCkgPT0gMHgwMTAwMDAwMDAwMDAwMDAwdWxsKQorCQkJcmV0dXJuOworCQl1ZGVsYXkoMSk7CisJfQorCXByX3dhcm5pbmcoIlBDSSBJTyB0aW1lb3V0IG9uIGRvbWFpbiAlZCBwb3J0IDB4JWx4XG4iLAorCQkgICBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIsIHBvcnQpOworfQorCisjZGVmaW5lIERFRl9QQ0lfQUNfUkVUX3BpbyhuYW1lLCByZXQsIGF0LCBhbCwgYWEpCQlcCitzdGF0aWMgcmV0IHdzcF9wY2lfIyNuYW1lIGF0CQkJCQlcCit7CQkJCQkJCQlcCisJc3RydWN0IGlvd2FfYnVzICpidXM7CQkJCQlcCisJc3RydWN0IHdzcF9waGIgKnBoYjsJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJXAorCXJldCBydmFsOwkJCQkJCVwKKwlidXMgPSBpb3dhX3Bpb19maW5kX2J1cyhhYSk7CQkJCVwKKwlXQVJOX09OKCFidXMpOwkJCQkJCVwKKwlwaGIgPSBidXMtPnByaXZhdGU7CQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYi0+bG9jaywgZmxhZ3MpOwkJCVwKKwl3c3BfcGNpX3dhaXRfaW9faWRsZShwaGIsIGFhKTsJCQkJXAorCXJ2YWwgPSBfX2RvXyMjbmFtZSBhbDsJCQkJCVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsJCVwKKwlyZXR1cm4gcnZhbDsJCQkJCQlcCit9CisKKyNkZWZpbmUgREVGX1BDSV9BQ19OT1JFVF9waW8obmFtZSwgYXQsIGFsLCBhYSkJCQlcCitzdGF0aWMgdm9pZCB3c3BfcGNpXyMjbmFtZSBhdAkJCQkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBpb3dhX2J1cyAqYnVzOwkJCQkJXAorCXN0cnVjdCB3c3BfcGhiICpwaGI7CQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKKwlidXMgPSBpb3dhX3Bpb19maW5kX2J1cyhhYSk7CQkJCVwKKwlXQVJOX09OKCFidXMpOwkJCQkJCVwKKwlwaGIgPSBidXMtPnByaXZhdGU7CQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYi0+bG9jaywgZmxhZ3MpOwkJCVwKKwl3c3BfcGNpX3dhaXRfaW9faWRsZShwaGIsIGFhKTsJCQkJXAorCV9fZG9fIyNuYW1lIGFsOwkJCQkJCVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGItPmxvY2ssIGZsYWdzKTsJCVwKK30KKworI2RlZmluZSBERUZfUENJX0FDX1JFVF9tZW0obmFtZSwgcmV0LCBhdCwgYWwsIGFhKQorI2RlZmluZSBERUZfUENJX0FDX05PUkVUX21lbShuYW1lLCBhdCwgYWwsIGFhKQorCisjZGVmaW5lIERFRl9QQ0lfQUNfUkVUKG5hbWUsIHJldCwgYXQsIGFsLCBzcGFjZSwgYWEpCQlcCisJREVGX1BDSV9BQ19SRVRfIyNzcGFjZShuYW1lLCByZXQsIGF0LCBhbCwgYWEpCisKKyNkZWZpbmUgREVGX1BDSV9BQ19OT1JFVChuYW1lLCBhdCwgYWwsIHNwYWNlLCBhYSkJCVwKKwlERUZfUENJX0FDX05PUkVUXyMjc3BhY2UobmFtZSwgYXQsIGFsLCBhYSkJCVwKKworCisjaW5jbHVkZSA8YXNtL2lvLWRlZnMuaD4KKworI3VuZGVmIERFRl9QQ0lfQUNfUkVUCisjdW5kZWYgREVGX1BDSV9BQ19OT1JFVAorCitzdGF0aWMgc3RydWN0IHBwY19wY2lfaW8gd3NwX3BjaV9pb3BzID0geworCS5pbmIgPSB3c3BfcGNpX2luYiwKKwkuaW53ID0gd3NwX3BjaV9pbncsCisJLmlubCA9IHdzcF9wY2lfaW5sLAorCS5vdXRiID0gd3NwX3BjaV9vdXRiLAorCS5vdXR3ID0gd3NwX3BjaV9vdXR3LAorCS5vdXRsID0gd3NwX3BjaV9vdXRsLAorCS5pbnNiID0gd3NwX3BjaV9pbnNiLAorCS5pbnN3ID0gd3NwX3BjaV9pbnN3LAorCS5pbnNsID0gd3NwX3BjaV9pbnNsLAorCS5vdXRzYiA9IHdzcF9wY2lfb3V0c2IsCisJLm91dHN3ID0gd3NwX3BjaV9vdXRzdywKKwkub3V0c2wgPSB3c3BfcGNpX291dHNsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd3NwX3NldHVwX29uZV9waGIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJc3RydWN0IHdzcF9waGIgKnBoYjsKKworCXByX2luZm8oIlBDSTogU2V0dGluZyB1cCBQQ0llIGhvc3QgYnJpZGdlIDB4JXNcbiIsIG5wLT5mdWxsX25hbWUpOworCisJcGhiID0gemFsbG9jX21heWJlX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCB3c3BfcGhiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaGIpCisJCXJldHVybiAtRU5PTUVNOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIobnApOworCWlmICghaG9zZSkgeworCQkvKiBDYW4ndCByZWFsbHkgZnJlZSB0aGUgcGhiICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKwlob3NlLT5wcml2YXRlX2RhdGEgPSBwaGI7CisJcGhiLT5ob3NlID0gaG9zZTsKKworCUlOSVRfTElTVF9IRUFEKCZwaGItPmRtYV90YWJsZXMpOworCXNwaW5fbG9ja19pbml0KCZwaGItPmxvY2spOworCisJLyogWFhYIFVzZSBidXMtcmFuZ2UgcHJvcGVydHkgPyAqLworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFdlIHVzZSBjZmdfZGF0YSBhcyB0aGUgYWRkcmVzcyBmb3IgdGhlIHdob2xlIGJyaWRnZSBNTUlPIHNwYWNlCisJICovCisJaG9zZS0+Y2ZnX2RhdGEgPSBvZl9pb21hcChob3NlLT5kbiwgMCk7CisKKwlwcl9kZWJ1ZygiUENJZSByZWdpc3RlcnMgbWFwcGVkIGF0IDB4JXBcbiIsIGhvc2UtPmNmZ19kYXRhKTsKKworCS8qIEdldCB0aGUgcmFuZ2VzIG9mIHRoZSBkZXZpY2UtdHJlZSAqLworCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgbnAsIDApOworCisJLyogWFhYIEZvcmNlIHJlLWFzc2lnbmluZyBvZiBldmVyeXRoaW5nIGZvciBub3cgKi8KKwlwY2lfYWRkX2ZsYWdzKFBDSV9SRUFTU0lHTl9BTExfQlVTIHwgUENJX1JFQVNTSUdOX0FMTF9SU1JDIHwKKwkJICAgICAgUENJX0VOQUJMRV9QUk9DX0RPTUFJTlMpOworCXBjaV9wcm9iZV9vbmx5ID0gMDsKKworCS8qIENhbGN1bGF0ZSBob3cgdGhlIFRDRSBzcGFjZSBpcyBkaXZpZGVkICovCisJcGhiLT5kbWEzMl9iYXNlCQk9IDA7CisJcGhiLT5kbWEzMl9udW1fcmVnaW9ucwk9IE5VTV9ETUEzMl9SRUdJT05TOworCWlmIChwaGItPmRtYTMyX251bV9yZWdpb25zID4gTUFYX1RBQkxFX1RWVF9DT1VOVCkgeworCQlwcl93YXJuaW5nKCJJT01NVTogQ2xhbXBlZCB0byAlZCBETUEzMiByZWdpb25zXG4iLAorCQkJICAgTUFYX1RBQkxFX1RWVF9DT1VOVCk7CisJCXBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnMgPSBNQVhfVEFCTEVfVFZUX0NPVU5UOworCX0KKwlwaGItPmRtYTMyX3JlZ2lvbl9zaXplCT0gMHg4MDAwMDAwMCAvIHBoYi0+ZG1hMzJfbnVtX3JlZ2lvbnM7CisKKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIocGhiLT5kbWEzMl9yZWdpb25fc2l6ZSkpOworCisJLyogU2V0dXAgY29uZmlnIG9wcyAqLworCWhvc2UtPm9wcyA9ICZ3c3BfcGNpZV9wY2lfb3BzOworCisJLyogQ29uZmlndXJlIHRoZSBIVyAqLworCXdzcF9wY2llX2NvbmZpZ3VyZV9odyhob3NlKTsKKworCS8qIEluc3RhbmNpYXRlIElPIHdvcmthcm91bmRzICovCisJaW93YV9yZWdpc3Rlcl9idXMoaG9zZSwgJndzcF9wY2lfaW9wcywgTlVMTCwgcGhiKTsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXdzcF9zZXR1cF9waGJfbXNpKGhvc2UpOworI2VuZGlmCisKKwkvKiBBZGQgdG8gZ2xvYmFsIGxpc3QgKi8KKwlsaXN0X2FkZCgmcGhiLT5hbGwsICZ3c3BfcGhicyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgd3NwX3NldHVwX3BjaSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJaW50IHJjOworCisJLyogRmluZCBob3N0IGJyaWRnZXMgKi8KKwlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2lleCIsIFBDSUVfQ09NUEFUSUJMRSkgeworCQlyYyA9IHdzcF9zZXR1cF9vbmVfcGhiKG5wKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0dXAgUENJZSBicmlkZ2UgJXMsIHJjPSVkXG4iLAorCQkJICAgICAgIG5wLT5mdWxsX25hbWUsIHJjKTsKKwl9CisKKwkvKiBFc3RhYmxpc2ggZGV2aWNlLXRyZWUgbGlua2FnZSAqLworCXBjaV9kZXZzX3BoYl9pbml0KCk7CisKKwkvKiBTZXQgRE1BIG9wcyB0byB1c2UgVENFcyAqLworCWlmIChpb21tdV9pc19vZmYpIHsKKwkJcHJfaW5mbygiUENJLUU6IERpc2FibGVkIFRDRXMsIHVzaW5nIGRpcmVjdCBETUFcbiIpOworCQlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKKwl9IGVsc2UgeworCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSB3c3BfcGNpX2RtYV9kZXZfc2V0dXA7CisJCXBwY19tZC50Y2VfYnVpbGQgPSB0Y2VfYnVpbGRfd3NwOworCQlwcGNfbWQudGNlX2ZyZWUgPSB0Y2VfZnJlZV93c3A7CisJCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7CisJfQorfQorCisjZGVmaW5lIGVycl9kZWJ1ZyhmbXQuLi4pCXByX2RlYnVnKGZtdCkKKy8vI2RlZmluZSBlcnJfZGVidWcoZm10Li4uKQorCitzdGF0aWMgaW50IF9faW5pdCB3c3BfcGNpX2dldF9lcnJfaXJxX25vX2R0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJY29uc3QgdTMyICpwcm9wOworCWludCBod19pcnE7CisKKwkvKiBPaywgbm8gaW50ZXJydXB0cyBwcm9wZXJ0eSwgbGV0J3MgdHJ5IHRvIGZpbmQgb3VyIGNoaWxkIFAyUCAqLworCW5wID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIE5VTEwpOworCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIEdyYWIgaXQncyBpbnRlcnJ1cHQgbWFwICovCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImludGVycnVwdC1tYXAiLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIEdyYWIgb25lIG9mIHRoZSBpbnRlcnJ1cHRzIGluIHRoZXJlLCBrZWVwIHRoZSBsb3cgNCBiaXRzICovCisJaHdfaXJxID0gcHJvcFs1XSAmIDB4ZjsKKworCS8qIDAuLjQgZm9yIFBIQiAwIGFuZCA1Li45IGZvciBQSEIgMSAqLworCWlmIChod19pcnEgPCA1KQorCQlod19pcnEgPSA0OworCWVsc2UKKwkJaHdfaXJxID0gOTsKKwlod19pcnEgfD0gcHJvcFs1XSAmIH4weGY7CisKKwllcnJfZGVidWcoIlBDSTogVXNpbmcgMHgleCBhcyBlcnJvciBJUlEgZm9yICVzXG4iLAorCQkgIGh3X2lycSwgbnAtPnBhcmVudC0+ZnVsbF9uYW1lKTsKKwlyZXR1cm4gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3X2lycSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXUzMiBvZmZzZXQ7CisJY29uc3QgY2hhciAqbmFtZTsKK30gd3NwX3BjaV9yZWdzW10gPSB7CisjZGVmaW5lIERSRUcoeCkgeyBQQ0lFX1JFR18jI3gsICN4IH0KKyNkZWZpbmUgRFVUTCh4KSB7IFBDSUVfVVRMXyMjeCwgIlVUTF8iICN4IH0KKwkvKiBBcmNoaXRlY3RlZCByZWdpc3RlcnMgZXhjZXB0IENPTkZJR18gYW5kIElPREEKKyAgICAgICAgICogdG8gYXZvaWQgc2lkZSBlZmZlY3RzCisJICovCisJRFJFRyhETUFfQ0hBTl9TVEFUVVMpLAorCURSRUcoQ1BVX0xPQURTVE9SRV9TVEFUVVMpLAorCURSRUcoTE9DSzApLAorCURSRUcoTE9DSzEpLAorCURSRUcoUEhCX0NPTkZJRyksCisJRFJFRyhJT19CQVNFX0FERFIpLAorCURSRUcoSU9fQkFTRV9NQVNLKSwKKwlEUkVHKElPX1NUQVJUX0FERFIpLAorCURSRUcoTTMyQV9CQVNFX0FERFIpLAorCURSRUcoTTMyQV9CQVNFX01BU0spLAorCURSRUcoTTMyQV9TVEFSVF9BRERSKSwKKwlEUkVHKE0zMkJfQkFTRV9BRERSKSwKKwlEUkVHKE0zMkJfQkFTRV9NQVNLKSwKKwlEUkVHKE0zMkJfU1RBUlRfQUREUiksCisJRFJFRyhNNjRfQkFTRV9BRERSKSwKKwlEUkVHKE02NF9CQVNFX01BU0spLAorCURSRUcoTTY0X1NUQVJUX0FERFIpLAorCURSRUcoVENFX0tJTEwpLAorCURSRUcoTE9DSzIpLAorCURSRUcoUEhCX0dFTl9DQVApLAorCURSRUcoUEhCX1RDRV9DQVApLAorCURSRUcoUEhCX0lSUV9DQVApLAorCURSRUcoUEhCX0VFSF9DQVApLAorCURSRUcoUEFQUl9FUlJfSU5KX0NPTlRST0wpLAorCURSRUcoUEFQUl9FUlJfSU5KX0FERFIpLAorCURSRUcoUEFQUl9FUlJfSU5KX01BU0spLAorCisJLyogVVRMIGNvcmUgcmVncyAqLworCURVVEwoU1lTX0JVU19DT05UUk9MKSwKKwlEVVRMKFNUQVRVUyksCisJRFVUTChTWVNfQlVTX0FHRU5UX1NUQVRVUyksCisJRFVUTChTWVNfQlVTX0FHRU5UX0VSUl9TRVYpLAorCURVVEwoU1lTX0JVU19BR0VOVF9JUlFfRU4pLAorCURVVEwoU1lTX0JVU19CVVJTVF9TWl9DT05GKSwKKwlEVVRMKFJFVklTSU9OX0lEKSwKKwlEVVRMKE9VVF9QT1NUX0hEUl9CVUZfQUxMT0MpLAorCURVVEwoT1VUX1BPU1RfREFUX0JVRl9BTExPQyksCisJRFVUTChJTl9QT1NUX0hEUl9CVUZfQUxMT0MpLAorCURVVEwoSU5fUE9TVF9EQVRfQlVGX0FMTE9DKSwKKwlEVVRMKE9VVF9OUF9CVUZfQUxMT0MpLAorCURVVEwoSU5fTlBfQlVGX0FMTE9DKSwKKwlEVVRMKFBDSUVfVEFHU19BTExPQyksCisJRFVUTChHQklGX1JFQURfVEFHU19BTExPQyksCisKKwlEVVRMKFBDSUVfUE9SVF9DT05UUk9MKSwKKwlEVVRMKFBDSUVfUE9SVF9TVEFUVVMpLAorCURVVEwoUENJRV9QT1JUX0VSUk9SX1NFViksCisJRFVUTChQQ0lFX1BPUlRfSVJRX0VOKSwKKwlEVVRMKFJDX1NUQVRVUyksCisJRFVUTChSQ19FUlJfU0VWRVJJVFkpLAorCURVVEwoUkNfSVJRX0VOKSwKKwlEVVRMKEVQX1NUQVRVUyksCisJRFVUTChFUF9FUlJfU0VWRVJJVFkpLAorCURVVEwoRVBfRVJSX0lSUV9FTiksCisJRFVUTChQQ0lfUE1fQ1RSTDEpLAorCURVVEwoUENJX1BNX0NUUkwyKSwKKworCS8qIFBDSWUgc3RhY2sgcmVncyAqLworCURSRUcoU1lTVEVNX0NPTkZJRzEpLAorCURSRUcoU1lTVEVNX0NPTkZJRzIpLAorCURSRUcoRVBfU1lTVEVNX0NPTkZJRyksCisJRFJFRyhFUF9GTFIpLAorCURSRUcoRVBfQkFSX0NPTkZJRyksCisJRFJFRyhMSU5LX0NPTkZJRyksCisJRFJFRyhQTV9DT05GSUcpLAorCURSRUcoRExQX0NPTlRST0wpLAorCURSRUcoRExQX1NUQVRVUyksCisJRFJFRyhFUlJfUkVQT1JUX0NPTlRST0wpLAorCURSRUcoU0xPVF9DT05UUk9MMSksCisJRFJFRyhTTE9UX0NPTlRST0wyKSwKKwlEUkVHKFVUTF9DT05GSUcpLAorCURSRUcoQlVGRkVSU19DT05GSUcpLAorCURSRUcoRVJST1JfSU5KRUNUKSwKKwlEUkVHKFNSSU9WX0NPTkZJRyksCisJRFJFRyhQRjBfU1JJT1ZfU1RBVFVTKSwKKwlEUkVHKFBGMV9TUklPVl9TVEFUVVMpLAorCURSRUcoUE9SVF9OVU1CRVIpLAorCURSRUcoUE9SX1NZU1RFTV9DT05GSUcpLAorCisJLyogSW50ZXJuYWwgbG9naWMgcmVncyAqLworCURSRUcoUEhCX1ZFUlNJT04pLAorCURSRUcoUkVTRVQpLAorCURSRUcoUEhCX0NPTlRST0wpLAorCURSRUcoUEhCX1RJTUVPVVRfQ09OVFJPTDEpLAorCURSRUcoUEhCX1FVSUVTQ0VfRE1BKSwKKwlEUkVHKFBIQl9ETUFfUkVBRF9UQUdfQUNUViksCisJRFJFRyhQSEJfVENFX1JFQURfVEFHX0FDVFYpLAorCisJLyogRklSIHJlZ2lzdGVycyAqLworCURSRUcoTEVNX0ZJUl9BQ0NVTSksCisJRFJFRyhMRU1fRklSX0FORF9NQVNLKSwKKwlEUkVHKExFTV9GSVJfT1JfTUFTSyksCisJRFJFRyhMRU1fQUNUSU9OMCksCisJRFJFRyhMRU1fQUNUSU9OMSksCisJRFJFRyhMRU1fRVJST1JfTUFTSyksCisJRFJFRyhMRU1fRVJST1JfQU5EX01BU0spLAorCURSRUcoTEVNX0VSUk9SX09SX01BU0spLAorCisJLyogRXJyb3IgdHJhcHMgcmVnaXN0ZXJzICovCisJRFJFRyhQSEJfRVJSX1NUQVRVUyksCisJRFJFRyhQSEJfRVJSX1NUQVRVUyksCisJRFJFRyhQSEJfRVJSMV9TVEFUVVMpLAorCURSRUcoUEhCX0VSUl9JTkpFQ1QpLAorCURSRUcoUEhCX0VSUl9MRU1fRU5BQkxFKSwKKwlEUkVHKFBIQl9FUlJfSVJRX0VOQUJMRSksCisJRFJFRyhQSEJfRVJSX0ZSRUVaRV9FTkFCTEUpLAorCURSRUcoUEhCX0VSUl9TSURFX0VOQUJMRSksCisJRFJFRyhQSEJfRVJSX0xPR18wKSwKKwlEUkVHKFBIQl9FUlJfTE9HXzEpLAorCURSRUcoUEhCX0VSUl9TVEFUVVNfTUFTSyksCisJRFJFRyhQSEJfRVJSMV9TVEFUVVNfTUFTSyksCisJRFJFRyhNTUlPX0VSUl9TVEFUVVMpLAorCURSRUcoTU1JT19FUlIxX1NUQVRVUyksCisJRFJFRyhNTUlPX0VSUl9JTkpFQ1QpLAorCURSRUcoTU1JT19FUlJfTEVNX0VOQUJMRSksCisJRFJFRyhNTUlPX0VSUl9JUlFfRU5BQkxFKSwKKwlEUkVHKE1NSU9fRVJSX0ZSRUVaRV9FTkFCTEUpLAorCURSRUcoTU1JT19FUlJfU0lERV9FTkFCTEUpLAorCURSRUcoTU1JT19FUlJfTE9HXzApLAorCURSRUcoTU1JT19FUlJfTE9HXzEpLAorCURSRUcoTU1JT19FUlJfU1RBVFVTX01BU0spLAorCURSRUcoTU1JT19FUlIxX1NUQVRVU19NQVNLKSwKKwlEUkVHKERNQV9FUlJfU1RBVFVTKSwKKwlEUkVHKERNQV9FUlIxX1NUQVRVUyksCisJRFJFRyhETUFfRVJSX0lOSkVDVCksCisJRFJFRyhETUFfRVJSX0xFTV9FTkFCTEUpLAorCURSRUcoRE1BX0VSUl9JUlFfRU5BQkxFKSwKKwlEUkVHKERNQV9FUlJfRlJFRVpFX0VOQUJMRSksCisJRFJFRyhETUFfRVJSX1NJREVfRU5BQkxFKSwKKwlEUkVHKERNQV9FUlJfTE9HXzApLAorCURSRUcoRE1BX0VSUl9MT0dfMSksCisJRFJFRyhETUFfRVJSX1NUQVRVU19NQVNLKSwKKwlEUkVHKERNQV9FUlIxX1NUQVRVU19NQVNLKSwKKworCS8qIERlYnVnIGFuZCBUcmFjZSByZWdpc3RlcnMgKi8KKwlEUkVHKFBIQl9ERUJVR19DT05UUk9MMCksCisJRFJFRyhQSEJfREVCVUdfU1RBVFVTMCksCisJRFJFRyhQSEJfREVCVUdfQ09OVFJPTDEpLAorCURSRUcoUEhCX0RFQlVHX1NUQVRVUzEpLAorCURSRUcoUEhCX0RFQlVHX0NPTlRST0wyKSwKKwlEUkVHKFBIQl9ERUJVR19TVEFUVVMyKSwKKwlEUkVHKFBIQl9ERUJVR19DT05UUk9MMyksCisJRFJFRyhQSEJfREVCVUdfU1RBVFVTMyksCisJRFJFRyhQSEJfREVCVUdfQ09OVFJPTDQpLAorCURSRUcoUEhCX0RFQlVHX1NUQVRVUzQpLAorCURSRUcoUEhCX0RFQlVHX0NPTlRST0w1KSwKKwlEUkVHKFBIQl9ERUJVR19TVEFUVVM1KSwKKworCS8qIERvbid0IHNlZW0gdG8gZXhpc3QgLi4uCisJRFJFRyhQSEJfREVCVUdfQ09OVFJPTDYpLAorCURSRUcoUEhCX0RFQlVHX1NUQVRVUzYpLAorCSovCit9OworCitzdGF0aWMgaW50IHdzcF9wY2lfcmVnc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgd3NwX3BoYiAqcGhiID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwaGItPmhvc2U7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c3BfcGNpX3JlZ3MpOyBpKyspIHsKKwkJLyogU2tpcCB3cml0ZS1vbmx5IHJlZ3MgKi8KKwkJaWYgKHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMDggfHwKKwkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMTAgfHwKKwkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjMzggfHwKKwkJICAgIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQgPT0gMHhjNDApCisJCQljb250aW51ZTsKKwkJc2VxX3ByaW50ZihtLCAiMHglMDN4OiAweCUwMTZsbHggJXNcbiIsCisJCQkgICB3c3BfcGNpX3JlZ3NbaV0ub2Zmc2V0LAorCQkJICAgaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQpLAorCQkJICAgd3NwX3BjaV9yZWdzW2ldLm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c3BfcGNpX3JlZ3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgd3NwX3BjaV9yZWdzX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3c3BfcGNpX3JlZ3NfZm9wcyA9IHsKKwkub3BlbiA9IHdzcF9wY2lfcmVnc19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCB3c3BfcGNpX3JlZ19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlvdXRfYmU2NCgodm9pZCBfX2lvbWVtICopZGF0YSwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3c3BfcGNpX3JlZ19nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJKnZhbCA9IGluX2JlNjQoKHZvaWQgX19pb21lbSAqKWRhdGEpOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURSh3c3BfcGNpX3JlZ19mb3BzLCB3c3BfcGNpX3JlZ19nZXQsIHdzcF9wY2lfcmVnX3NldCwgIjB4JWxseFxuIik7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3c3BfcGNpX2Vycl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB3c3BfcGhiICpwaGIgPSBkZXZfaWQ7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGhiLT5ob3NlOworCWlycXJldHVybl90IGhhbmRsZWQgPSBJUlFfTk9ORTsKKwlzdHJ1Y3Qgd3NwX3BjaWVfZXJyX2xvZ19kYXRhIGVkOworCisJcHJfZXJyKCJQQ0k6IEVycm9yIGludGVycnVwdCBvbiAlcyAoUEhCICVkKVxuIiwKKwkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSwgaG9zZS0+Z2xvYmFsX251bWJlcik7CisgYWdhaW46CisJbWVtc2V0KCZlZCwgMCwgc2l6ZW9mKGVkKSk7CisKKwkvKiBSZWFkIGFuZCBjbGVhciBVVEwgZXJyb3JzICovCisJZWQudXRsX3N5c19lcnIgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9VVExfU1lTX0JVU19BR0VOVF9TVEFUVVMpOworCWlmIChlZC51dGxfc3lzX2VycikKKwkJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX1NUQVRVUywgZWQudXRsX3N5c19lcnIpOworCWVkLnV0bF9wb3J0X2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9QQ0lFX1BPUlRfU1RBVFVTKTsKKwlpZiAoZWQudXRsX3BvcnRfZXJyKQorCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1BDSUVfUE9SVF9TVEFUVVMsIGVkLnV0bF9wb3J0X2Vycik7CisJZWQudXRsX3JjX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1VUTF9SQ19TVEFUVVMpOworCWlmIChlZC51dGxfcmNfZXJyKQorCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfVVRMX1JDX1NUQVRVUywgZWQudXRsX3JjX2Vycik7CisKKwkvKiBSZWFkIGFuZCBjbGVhciBtYWluIHRyYXAgZXJyb3JzICovCisJZWQucGhiX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19QSEJfRVJSX1NUQVRVUyk7CisJaWYgKGVkLnBoYl9lcnIpIHsKKwkJZWQucGhiX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUjFfU1RBVFVTKTsKKwkJZWQucGhiX2xvZzAgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9MT0dfMCk7CisJCWVkLnBoYl9sb2cxID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlJfTE9HXzEpOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlIxX1NUQVRVUywgMCk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfUEhCX0VSUl9TVEFUVVMsIDApOworCX0KKwllZC5tbWlvX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9TVEFUVVMpOworCWlmIChlZC5tbWlvX2VycikgeworCQllZC5tbWlvX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVUyk7CisJCWVkLm1taW9fbG9nMCA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMCk7CisJCWVkLm1taW9fbG9nMSA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMSk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVUywgMCk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfTU1JT19FUlJfU1RBVFVTLCAwKTsKKwl9CisJZWQuZG1hX2VyciA9IGluX2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVUyk7CisJaWYgKGVkLmRtYV9lcnIpIHsKKwkJZWQuZG1hX2VycjEgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUjFfU1RBVFVTKTsKKwkJZWQuZG1hX2xvZzAgPSBpbl9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9MT0dfMCk7CisJCWVkLmRtYV9sb2cxID0gaW5fYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlJfTE9HXzEpOworCQlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX0RNQV9FUlIxX1NUQVRVUywgMCk7CisJCW91dF9iZTY0KGhvc2UtPmNmZ19kYXRhICsgUENJRV9SRUdfRE1BX0VSUl9TVEFUVVMsIDApOworCX0KKworCS8qIE5vdyBwcmludCB0aGluZ3Mgb3V0ICovCisJaWYgKGVkLnBoYl9lcnIpIHsKKwkJcHJfZXJyKCIgICBQSEIgRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLnBoYl9lcnIpOworCQlwcl9lcnIoIiAgIFBIQiBGaXJzdCBFcnJvciBTdGF0dXM6IDB4JTAxNmxseFxuIiwgZWQucGhiX2VycjEpOworCQlwcl9lcnIoIiAgIFBIQiBFcnJvciBMb2cgMCAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQucGhiX2xvZzApOworCQlwcl9lcnIoIiAgIFBIQiBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQucGhiX2xvZzEpOworCX0KKwlpZiAoZWQubW1pb19lcnIpIHsKKwkJcHJfZXJyKCIgIE1NSU8gRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLm1taW9fZXJyKTsKKwkJcHJfZXJyKCIgIE1NSU8gRmlyc3QgRXJyb3IgU3RhdHVzOiAweCUwMTZsbHhcbiIsIGVkLm1taW9fZXJyMSk7CisJCXByX2VycigiICBNTUlPIEVycm9yIExvZyAwICAgICAgIDogMHglMDE2bGx4XG4iLCBlZC5tbWlvX2xvZzApOworCQlwcl9lcnIoIiAgTU1JTyBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQubW1pb19sb2cxKTsKKwl9CisJaWYgKGVkLmRtYV9lcnIpIHsKKwkJcHJfZXJyKCIgICBETUEgRXJyb3IgU3RhdHVzICAgICAgOiAweCUwMTZsbHhcbiIsIGVkLmRtYV9lcnIpOworCQlwcl9lcnIoIiAgIERNQSBGaXJzdCBFcnJvciBTdGF0dXM6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2VycjEpOworCQlwcl9lcnIoIiAgIERNQSBFcnJvciBMb2cgMCAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2xvZzApOworCQlwcl9lcnIoIiAgIERNQSBFcnJvciBMb2cgMSAgICAgICA6IDB4JTAxNmxseFxuIiwgZWQuZG1hX2xvZzEpOworCX0KKwlpZiAoZWQudXRsX3N5c19lcnIpCisJCXByX2VycigiICAgVVRMIFN5cyBFcnJvciBTdGF0dXMgIDogMHglMDE2bGx4XG4iLCBlZC51dGxfc3lzX2Vycik7CisJaWYgKGVkLnV0bF9wb3J0X2VycikKKwkJcHJfZXJyKCIgICBVVEwgUG9ydCBFcnJvciBTdGF0dXMgOiAweCUwMTZsbHhcbiIsIGVkLnV0bF9wb3J0X2Vycik7CisJaWYgKGVkLnV0bF9yY19lcnIpCisJCXByX2VycigiICAgVVRMIFJDIEVycm9yIFN0YXR1cyAgIDogMHglMDE2bGx4XG4iLCBlZC51dGxfcmNfZXJyKTsKKworCS8qIEludGVycnVwdHMgYXJlIGNhdXNlZCBieSB0aGUgZXJyb3IgdHJhcHMuIElmIHdlIGhhZCBhbnkgZXJyb3IgdGhlcmUKKwkgKiB3ZSBsb29wIGFnYWluIGluIGNhc2UgdGhlIFVUTCBidWZmZXJlZCBzb21lIG5ldyBzdHVmZiBiZXR3ZWVuCisJICogZ29pbmcgdGhlcmUgYW5kIGdvaW5nIHRvIHRoZSB0cmFwcworCSAqLworCWlmIChlZC5kbWFfZXJyIHx8IGVkLm1taW9fZXJyIHx8IGVkLnBoYl9lcnIpIHsKKwkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOworCQlnb3RvIGFnYWluOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHdzcF9zZXR1cF9wY2lfZXJyX3JlcG9ydGluZyhzdHJ1Y3Qgd3NwX3BoYiAqcGhiKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBoYi0+aG9zZTsKKwlpbnQgZXJyX2lycSwgaSwgcmM7CisJY2hhciBmbmFtZVsxNl07CisKKwkvKiBDcmVhdGUgYSBkZWJ1Z2ZzIGZpbGUgZm9yIHRoYXQgUEhCICovCisJc3ByaW50ZihmbmFtZSwgInBoYiVkIiwgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwlwaGItPmRkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZm5hbWUsIHBvd2VycGNfZGVidWdmc19yb290KTsKKworCS8qIFNvbWUgdXNlZnVsIGRlYnVnIG91dHB1dCAqLworCWlmIChwaGItPmRkaXIpIHsKKwkJc3RydWN0IGRlbnRyeSAqZCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmVncyIsIHBoYi0+ZGRpcik7CisJCWNoYXIgdG1wWzY0XTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3c3BfcGNpX3JlZ3MpOyBpKyspIHsKKwkJCXNwcmludGYodG1wLCAiJTAzeF8lcyIsIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQsCisJCQkJd3NwX3BjaV9yZWdzW2ldLm5hbWUpOworCQkJZGVidWdmc19jcmVhdGVfZmlsZSh0bXAsIDA2MDAsIGQsCisJCQkJCSAgICBob3NlLT5jZmdfZGF0YSArIHdzcF9wY2lfcmVnc1tpXS5vZmZzZXQsCisJCQkJCSAgICAmd3NwX3BjaV9yZWdfZm9wcyk7CisJCX0KKwkJZGVidWdmc19jcmVhdGVfZmlsZSgiYWxsX3JlZ3MiLCAwNjAwLCBwaGItPmRkaXIsIHBoYiwgJndzcF9wY2lfcmVnc19mb3BzKTsKKwl9CisKKwkvKiBGaW5kIHRoZSBJUlEgbnVtYmVyIGZvciB0aGF0IFBIQiAqLworCWVycl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChob3NlLT5kbiwgMCk7CisJaWYgKGVycl9pcnEgPT0gMCkKKwkJLyogWFhYIEVycm9yIElSUSBsYWNraW5nIGZyb20gZGV2aWNlLXRyZWUgKi8KKwkJZXJyX2lycSA9IHdzcF9wY2lfZ2V0X2Vycl9pcnFfbm9fZHQoaG9zZS0+ZG4pOworCWlmIChlcnJfaXJxID09IDApIHsKKwkJcHJfZXJyKCJQQ0k6IEZhaWxlZCB0byBmZXRjaCBlcnJvciBpbnRlcnJ1cHQgZm9yICVzXG4iLAorCQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJLyogUmVxdWVzdCBpdCAqLworCXJjID0gcmVxdWVzdF9pcnEoZXJyX2lycSwgd3NwX3BjaV9lcnJfaXJxLCAwLCAid3NwX3BjaSBlcnJvciIsIHBoYik7CisJaWYgKHJjKSB7CisJCXByX2VycigiUENJOiBGYWlsZWQgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgZm9yICVzXG4iLAorCQkgICAgICAgaG9zZS0+ZG4tPmZ1bGxfbmFtZSk7CisJfQorCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBhbGwgZXJyb3JzIGZvciBub3cgKi8KKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX1BIQl9FUlJfSVJRX0VOQUJMRSwgMHhmZmZmZmZmZmZmZmZmZmZmdWxsKTsKKwlvdXRfYmU2NChob3NlLT5jZmdfZGF0YSArIFBDSUVfUkVHX01NSU9fRVJSX0lSUV9FTkFCTEUsIDB4ZmZmZmZmZmZmZmZmZmZmZnVsbCk7CisJb3V0X2JlNjQoaG9zZS0+Y2ZnX2RhdGEgKyBQQ0lFX1JFR19ETUFfRVJSX0lSUV9FTkFCTEUsIDB4ZmZmZmZmZmZmZmZmZmZmZnVsbCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBsYXRlciB0byBob29rdXAgd2l0aCB0aGUgZXJyb3IgaW50ZXJydXB0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHdzcF9zZXR1cF9wY2lfbGF0ZSh2b2lkKQoreworCXN0cnVjdCB3c3BfcGhiICpwaGI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBoYiwgJndzcF9waGJzLCBhbGwpCisJCXdzcF9zZXR1cF9wY2lfZXJyX3JlcG9ydGluZyhwaGIpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHdzcF9zZXR1cF9wY2lfbGF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3BfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlOWJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcF9wY2kuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEJlbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19XU1BfUENJX0gKKyNkZWZpbmUgX19XU1BfUENJX0gKKworLyogQXJjaGl0ZWN0ZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSUVfUkVHX0RNQV9DSEFOX1NUQVRVUwkweDExMAorI2RlZmluZSBQQ0lFX1JFR19DUFVfTE9BRFNUT1JFX1NUQVRVUwkweDEyMAorCisjZGVmaW5lIFBDSUVfUkVHX0NPTkZJR19EQVRBCQkweDEzMAorI2RlZmluZSBQQ0lFX1JFR19MT0NLMAkJCTB4MTM4CisjZGVmaW5lIFBDSUVfUkVHX0NPTkZJR19BRERSRVNTCQkweDE0MAorI2RlZmluZSAgIFBDSUVfUkVHX0NBX0VOQUJMRQkJCTB4ODAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZQkgIFBDSUVfUkVHX0NBX0JVU19NQVNLCQkJMHgwZmYwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfQlVTX1NISUZUCQkJKDIwKzMyKQorI2RlZmluZSAgIFBDSUVfUkVHX0NBX0RFVl9NQVNLCQkJMHgwMDBmODAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfREVWX1NISUZUCQkJKDE1KzMyKQorI2RlZmluZSAgIFBDSUVfUkVHX0NBX0ZVTkNfTUFTSwkJCTB4MDAwMDcwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0NBX0ZVTkNfU0hJRlQJCSgxMiszMikKKyNkZWZpbmUgICBQQ0lFX1JFR19DQV9SRUdfTUFTSwkJCTB4MDAwMDBmZmYwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0NBX1JFR19TSElGVAkJCSggMCszMikKKyNkZWZpbmUgICBQQ0lFX1JFR19DQV9CRV9NQVNLCQkJMHgwMDAwMDAwMGYwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfQ0FfQkVfU0hJRlQJCQkoICAgMjgpCisjZGVmaW5lIFBDSUVfUkVHX0xPQ0sxCQkJMHgxNDgKKworI2RlZmluZSBQQ0lFX1JFR19QSEJfQ09ORklHCQkweDE2MAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfNjRCX1RDRV9FTgkJMHgyMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ19NTUlPX0RNQV9GUkVFWkVfRU4JMHgxMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ18zMkJJVF9NU0lfRU4JCTB4MDA4MDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfTTY0X0VOCQkJMHgwMDQwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ19JT19FTgkJCTB4MDAwODAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX1BIQkNfNjRCSVRfTVNJX0VOCQkweDAwMDIwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX00zMkFfRU4JCQkweDAwMDA4MDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX00zMkJfRU4JCQkweDAwMDA0MDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19QSEJDX01TSV9QRV9WQUxJREFURQkJMHgwMDAwMjAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgUENJRV9SRUdfUEhCQ19ETUFfWExBVEVfQllQQVNTCTB4MDAwMDEwMDAwMDAwMDAwMHVsbAorCisjZGVmaW5lIFBDSUVfUkVHX0lPX0JBU0VfQUREUgkJMHgxNzAKKyNkZWZpbmUgUENJRV9SRUdfSU9fQkFTRV9NQVNLCQkweDE3OAorI2RlZmluZSBQQ0lFX1JFR19JT19TVEFSVF9BRERSCQkweDE4MAorCisjZGVmaW5lIFBDSUVfUkVHX00zMkFfQkFTRV9BRERSCQkweDE5MAorI2RlZmluZSBQQ0lFX1JFR19NMzJBX0JBU0VfTUFTSwkJMHgxOTgKKyNkZWZpbmUgUENJRV9SRUdfTTMyQV9TVEFSVF9BRERSCTB4MWEwCisKKyNkZWZpbmUgUENJRV9SRUdfTTMyQl9CQVNFX0FERFIJCTB4MWIwCisjZGVmaW5lIFBDSUVfUkVHX00zMkJfQkFTRV9NQVNLCQkweDFiOAorI2RlZmluZSBQQ0lFX1JFR19NMzJCX1NUQVJUX0FERFIJMHgxYzAKKworI2RlZmluZSBQQ0lFX1JFR19NNjRfQkFTRV9BRERSCQkweDFlMAorI2RlZmluZSBQQ0lFX1JFR19NNjRfQkFTRV9NQVNLCQkweDFlOAorI2RlZmluZSBQQ0lFX1JFR19NNjRfU1RBUlRfQUREUgkJMHgxZjAKKworI2RlZmluZSBQQ0lFX1JFR19UQ0VfS0lMTAkJMHgyMTAKKyNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX1NJTkdMRQkweDgwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX0FERFJfTUFTSwkweDAwMDAwM2ZmZmZmZmZmZjh1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX1BTXzRLCTAKKyNkZWZpbmUgICBQQ0lFX1JFR19UQ0VLSUxMX1BTXzY0SwkxCisjZGVmaW5lICAgUENJRV9SRUdfVENFS0lMTF9QU18xNk0JMgorI2RlZmluZSAgIFBDSUVfUkVHX1RDRUtJTExfUFNfMTZHCTMKKworI2RlZmluZSBQQ0lFX1JFR19JT0RBX0FERFIJCTB4MjIwCisjZGVmaW5lICAgUENJRV9SRUdfSU9EQV9BRF9BVVRPSU5DCTB4ODAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX01WVAkweDAwMDUwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9QRUxUCTB4MDAwNjAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX1BFU1RBCTB4MDAwNzAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX1BFU1RCCTB4MDAwODAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgIFBDSUVfUkVHX0lPREFfQURfVEJMX1RWVAkweDAwMDkwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgICBQQ0lFX1JFR19JT0RBX0FEX1RCTF9UQ0UJMHgwMDBhMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFBDSUVfUkVHX0lPREFfREFUQTAJCTB4MjI4CisjZGVmaW5lIFBDSUVfUkVHX0lPREFfREFUQTEJCTB4MjMwCisKKyNkZWZpbmUgUENJRV9SRUdfTE9DSzIJCQkweDI0MAorCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9HRU5fQ0FQCQkweDI1MAorI2RlZmluZSBQQ0lFX1JFR19QSEJfVENFX0NBUAkJMHgyNTgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0lSUV9DQVAJCTB4MjYwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FRUhfQ0FQCQkweDI2OAorCisjZGVmaW5lIFBDSUVfUkVHX1BBUFJfRVJSX0lOSl9DT05UUk9MCTB4MmIwCisjZGVmaW5lIFBDSUVfUkVHX1BBUFJfRVJSX0lOSl9BRERSCTB4MmI4CisjZGVmaW5lIFBDSUVfUkVHX1BBUFJfRVJSX0lOSl9NQVNLCTB4MmMwCisKKworI2RlZmluZSBQQ0lFX1JFR19TWVNfQ0ZHMQkJMHg2MDAKKyNkZWZpbmUgICBQQ0lFX1JFR19TWVNfQ0ZHMV9DTEFTU19DT0RFCTB4MDAwMDAwMDAwMGZmZmZmZnVsbAorCisjZGVmaW5lIElPREFfVFZUMF9UVEFfTUFTSwkJMHgwMDBmZmZmZmZmZmYwMDAwdWxsCisjZGVmaW5lIElPREFfVFZUMF9UVEFfU0hJRlQJCTQKKyNkZWZpbmUgSU9EQV9UVlQwX0JVU05VTV9WQUxJRF9NQVNLCTB4MDAwMDAwMDAwMDAwZTAwMHVsbAorI2RlZmluZSBJT0RBX1RWVDBfVENFX1RBQkxFX1NJWkVfTUFTSwkweDAwMDAwMDAwMDAwMDFmMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQwX1RDRV9UQUJMRV9TSVpFX1NISUZUCTgKKyNkZWZpbmUgSU9EQV9UVlQwX0JVU05VTV9WQUxVRV9NQVNLCTB4MDAwMDAwMDAwMDAwMDBmZnVsbAorI2RlZmluZSBJT0RBX1RWVDBfQlVTTlVNX1ZBTElEX1NISUZUCTAKKyNkZWZpbmUgSU9EQV9UVlQxX0RFVk5VTV9WQUxJRAkJMHgyMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIElPREFfVFZUMV9ERVZOVU1fVkFMVUVfTUFTSwkweDFmMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX0RFVk5VTV9WQUxVRV9TSElGVAk1NgorI2RlZmluZSBJT0RBX1RWVDFfRlVOQ05VTV9WQUxJRAkJMHgwMDA4MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIElPREFfVFZUMV9GVU5DTlVNX1ZBTFVFX01BU0sJMHgwMDA3MDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIElPREFfVFZUMV9GVU5DTlVNX1ZBTFVFX1NISUZUCTQ4CisjZGVmaW5lIElPREFfVFZUMV9JT19QQUdFX1NJWkVfTUFTSwkweDAwMDAxZjAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgSU9EQV9UVlQxX0lPX1BBR0VfU0laRV9TSElGVAk0MAorI2RlZmluZSBJT0RBX1RWVDFfUEVfTlVNQkVSX01BU0sJMHgwMDAwMDAwMDAwMDAwMDNmdWxsCisjZGVmaW5lIElPREFfVFZUMV9QRV9OVU1CRVJfU0hJRlQJMAorCisjZGVmaW5lIElPREFfVFZUX0NPVU5UCQkJNjQKKworLyogVVRMIENvcmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSUVfVVRMX1NZU19CVVNfQ09OVFJPTAkweDQwMAorI2RlZmluZSBQQ0lFX1VUTF9TVEFUVVMJCQkweDQwOAorI2RlZmluZSBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX1NUQVRVUwkweDQxMAorI2RlZmluZSBQQ0lFX1VUTF9TWVNfQlVTX0FHRU5UX0VSUl9TRVYJMHg0MTgKKyNkZWZpbmUgUENJRV9VVExfU1lTX0JVU19BR0VOVF9JUlFfRU4JMHg0MjAKKyNkZWZpbmUgUENJRV9VVExfU1lTX0JVU19CVVJTVF9TWl9DT05GCTB4NDQwCisjZGVmaW5lIFBDSUVfVVRMX1JFVklTSU9OX0lECQkweDQ0OAorCisjZGVmaW5lIFBDSUVfVVRMX09VVF9QT1NUX0hEUl9CVUZfQUxMT0MJMHg0YzAKKyNkZWZpbmUgUENJRV9VVExfT1VUX1BPU1RfREFUX0JVRl9BTExPQwkweDRkMAorI2RlZmluZSBQQ0lFX1VUTF9JTl9QT1NUX0hEUl9CVUZfQUxMT0MJMHg0ZTAKKyNkZWZpbmUgUENJRV9VVExfSU5fUE9TVF9EQVRfQlVGX0FMTE9DCTB4NGYwCisjZGVmaW5lIFBDSUVfVVRMX09VVF9OUF9CVUZfQUxMT0MJMHg1MDAKKyNkZWZpbmUgUENJRV9VVExfSU5fTlBfQlVGX0FMTE9DCTB4NTEwCisjZGVmaW5lIFBDSUVfVVRMX1BDSUVfVEFHU19BTExPQwkweDUyMAorI2RlZmluZSBQQ0lFX1VUTF9HQklGX1JFQURfVEFHU19BTExPQwkweDUzMAorCisjZGVmaW5lIFBDSUVfVVRMX1BDSUVfUE9SVF9DT05UUk9MCTB4NTQwCisjZGVmaW5lIFBDSUVfVVRMX1BDSUVfUE9SVF9TVEFUVVMJMHg1NDgKKyNkZWZpbmUgUENJRV9VVExfUENJRV9QT1JUX0VSUk9SX1NFVgkweDU1MAorI2RlZmluZSBQQ0lFX1VUTF9QQ0lFX1BPUlRfSVJRX0VOCTB4NTU4CisjZGVmaW5lIFBDSUVfVVRMX1JDX1NUQVRVUwkJMHg1NjAKKyNkZWZpbmUgUENJRV9VVExfUkNfRVJSX1NFVkVSSVRZCTB4NTY4CisjZGVmaW5lIFBDSUVfVVRMX1JDX0lSUV9FTgkJMHg1NzAKKyNkZWZpbmUgUENJRV9VVExfRVBfU1RBVFVTCQkweDU3OAorI2RlZmluZSBQQ0lFX1VUTF9FUF9FUlJfU0VWRVJJVFkJMHg1ODAKKyNkZWZpbmUgUENJRV9VVExfRVBfRVJSX0lSUV9FTgkJMHg1ODgKKworI2RlZmluZSBQQ0lFX1VUTF9QQ0lfUE1fQ1RSTDEJCTB4NTkwCisjZGVmaW5lIFBDSUVfVVRMX1BDSV9QTV9DVFJMMgkJMHg1OTgKKworLyogUENJZSBzdGFjayByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfU1lTVEVNX0NPTkZJRzEJCTB4NjAwCisjZGVmaW5lIFBDSUVfUkVHX1NZU1RFTV9DT05GSUcyCQkweDYwOAorI2RlZmluZSBQQ0lFX1JFR19FUF9TWVNURU1fQ09ORklHCTB4NjE4CisjZGVmaW5lIFBDSUVfUkVHX0VQX0ZMUgkJCTB4NjIwCisjZGVmaW5lIFBDSUVfUkVHX0VQX0JBUl9DT05GSUcJCTB4NjI4CisjZGVmaW5lIFBDSUVfUkVHX0xJTktfQ09ORklHCQkweDYzMAorI2RlZmluZSBQQ0lFX1JFR19QTV9DT05GSUcJCTB4NjQwCisjZGVmaW5lIFBDSUVfUkVHX0RMUF9DT05UUk9MCQkweDY1MAorI2RlZmluZSBQQ0lFX1JFR19ETFBfU1RBVFVTCQkweDY1OAorI2RlZmluZSBQQ0lFX1JFR19FUlJfUkVQT1JUX0NPTlRST0wJMHg2NjAKKyNkZWZpbmUgUENJRV9SRUdfU0xPVF9DT05UUk9MMQkJMHg2NzAKKyNkZWZpbmUgUENJRV9SRUdfU0xPVF9DT05UUk9MMgkJMHg2NzgKKyNkZWZpbmUgUENJRV9SRUdfVVRMX0NPTkZJRwkJMHg2ODAKKyNkZWZpbmUgUENJRV9SRUdfQlVGRkVSU19DT05GSUcJCTB4NjkwCisjZGVmaW5lIFBDSUVfUkVHX0VSUk9SX0lOSkVDVAkJMHg2OTgKKyNkZWZpbmUgUENJRV9SRUdfU1JJT1ZfQ09ORklHCQkweDZhMAorI2RlZmluZSBQQ0lFX1JFR19QRjBfU1JJT1ZfU1RBVFVTCTB4NmE4CisjZGVmaW5lIFBDSUVfUkVHX1BGMV9TUklPVl9TVEFUVVMJMHg2YjAKKyNkZWZpbmUgUENJRV9SRUdfUE9SVF9OVU1CRVIJCTB4NzAwCisjZGVmaW5lIFBDSUVfUkVHX1BPUl9TWVNURU1fQ09ORklHCTB4NzA4CisKKy8qIFBIQiBpbnRlcm5hbCBsb2dpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfUEhCX1ZFUlNJT04JCTB4ODAwCisjZGVmaW5lIFBDSUVfUkVHX1JFU0VUCQkJMHg4MDgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0NPTlRST0wJCTB4ODEwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9USU1FT1VUX0NPTlRST0wxCTB4ODc4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9RVUlFU0NFX0RNQQkweDg4OAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRE1BX1JFQURfVEFHX0FDVFYJMHg5MDAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX1RDRV9SRUFEX1RBR19BQ1RWCTB4OTA4CisKKy8qIEZJUiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfTEVNX0ZJUl9BQ0NVTQkJMHhjMDAKKyNkZWZpbmUgUENJRV9SRUdfTEVNX0ZJUl9BTkRfTUFTSwkweGMwOAorI2RlZmluZSBQQ0lFX1JFR19MRU1fRklSX09SX01BU0sJMHhjMTAKKyNkZWZpbmUgUENJRV9SRUdfTEVNX0FDVElPTjAJCTB4YzE4CisjZGVmaW5lIFBDSUVfUkVHX0xFTV9BQ1RJT04xCQkweGMyMAorI2RlZmluZSBQQ0lFX1JFR19MRU1fRVJST1JfTUFTSwkJMHhjMzAKKyNkZWZpbmUgUENJRV9SRUdfTEVNX0VSUk9SX0FORF9NQVNLCTB4YzM4CisjZGVmaW5lIFBDSUVfUkVHX0xFTV9FUlJPUl9PUl9NQVNLCTB4YzQwCisKKy8qIFBIQiBFcnJvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9TVEFUVVMJCTB4YzgwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlIxX1NUQVRVUwkweGM4OAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0lOSkVDVAkJMHhjOTAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9MRU1fRU5BQkxFCTB4Yzk4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlJfSVJRX0VOQUJMRQkweGNhMAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0ZSRUVaRV9FTkFCTEUJMHhjYTgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0VSUl9TSURFX0VOQUJMRQkweGNiOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0xPR18wCQkweGNjMAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX0xPR18xCQkweGNjOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfRVJSX1NUQVRVU19NQVNLCTB4Y2QwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9FUlIxX1NUQVRVU19NQVNLCTB4Y2Q4CisKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfU1RBVFVTCTB4ZDAwCisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSMV9TVEFUVVMJMHhkMDgKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfSU5KRUNUCTB4ZDEwCisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0xFTV9FTkFCTEUJMHhkMTgKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfSVJRX0VOQUJMRQkweGQyMAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9GUkVFWkVfRU5BQkxFCTB4ZDI4CisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX1NJREVfRU5BQkxFCTB4ZDM4CisjZGVmaW5lIFBDSUVfUkVHX01NSU9fRVJSX0xPR18wCQkweGQ0MAorI2RlZmluZSBQQ0lFX1JFR19NTUlPX0VSUl9MT0dfMQkJMHhkNDgKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlJfU1RBVFVTX01BU0sJMHhkNTAKKyNkZWZpbmUgUENJRV9SRUdfTU1JT19FUlIxX1NUQVRVU19NQVNLCTB4ZDU4CisKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9TVEFUVVMJCTB4ZDgwCisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlIxX1NUQVRVUwkweGQ4OAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0lOSkVDVAkJMHhkOTAKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9MRU1fRU5BQkxFCTB4ZDk4CisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlJfSVJRX0VOQUJMRQkweGRhMAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0ZSRUVaRV9FTkFCTEUJMHhkYTgKKyNkZWZpbmUgUENJRV9SRUdfRE1BX0VSUl9TSURFX0VOQUJMRQkweGRiOAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0xPR18wCQkweGRjMAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX0xPR18xCQkweGRjOAorI2RlZmluZSBQQ0lFX1JFR19ETUFfRVJSX1NUQVRVU19NQVNLCTB4ZGQwCisjZGVmaW5lIFBDSUVfUkVHX0RNQV9FUlIxX1NUQVRVU19NQVNLCTB4ZGQ4CisKKy8qIFNob3J0Y3V0cyBmb3IgYWNjZXNzIHRvIHRoZSBhYm92ZSB1c2luZyB0aGUgUEhCIGRlZmluaXRpb25zCisgKiB3aXRoIGFuIG9mZnNldAorICovCisjZGVmaW5lIFBDSUVfUkVHX0VSUl9QSEJfT0ZGU0VUCQkweDAKKyNkZWZpbmUgUENJRV9SRUdfRVJSX01NSU9fT0ZGU0VUCTB4ODAKKyNkZWZpbmUgUENJRV9SRUdfRVJSX0RNQV9PRkZTRVQJCTB4MTAwCisKKy8qIERlYnVnIGFuZCBUcmFjZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0wwCTB4ZTAwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVMwCTB4ZTA4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MMQkweGUxMAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTMQkweGUxOAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDIJMHhlMjAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzIJMHhlMjgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0wzCTB4ZTMwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVMzCTB4ZTM4CisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19DT05UUk9MNAkweGU0MAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfU1RBVFVTNAkweGU0OAorI2RlZmluZSBQQ0lFX1JFR19QSEJfREVCVUdfQ09OVFJPTDUJMHhlNTAKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX1NUQVRVUzUJMHhlNTgKKyNkZWZpbmUgUENJRV9SRUdfUEhCX0RFQlVHX0NPTlRST0w2CTB4ZTYwCisjZGVmaW5lIFBDSUVfUkVHX1BIQl9ERUJVR19TVEFUVVM2CTB4ZTY4CisKKy8qIERlZmluaXRpb24gZm9yIFBDSWUgZXJyb3JzICovCitzdHJ1Y3Qgd3NwX3BjaWVfZXJyX2xvZ19kYXRhIHsKKwlfX3U2NAlwaGJfZXJyOworCV9fdTY0CXBoYl9lcnIxOworCV9fdTY0CXBoYl9sb2cwOworCV9fdTY0CXBoYl9sb2cxOworCV9fdTY0CW1taW9fZXJyOworCV9fdTY0CW1taW9fZXJyMTsKKwlfX3U2NAltbWlvX2xvZzA7CisJX191NjQJbW1pb19sb2cxOworCV9fdTY0CWRtYV9lcnI7CisJX191NjQJZG1hX2VycjE7CisJX191NjQJZG1hX2xvZzA7CisJX191NjQJZG1hX2xvZzE7CisJX191NjQJdXRsX3N5c19lcnI7CisJX191NjQJdXRsX3BvcnRfZXJyOworCV9fdTY0CXV0bF9yY19lcnI7CisJX191NjQJdW51c2VkOworfTsKKworI2VuZGlmIC8qIF9fV1NQX1BDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCBjZjczNmNhLi44NGUxMzI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDYgQEAKIG9iai0kKENPTkZJR19GU0xfUE1DKQkJKz0gZnNsX3BtYy5vCiBvYmotJChDT05GSUdfRlNMX0xCQykJCSs9IGZzbF9sYmMubwogb2JqLSQoQ09ORklHX0ZTTF9HVE0pCQkrPSBmc2xfZ3RtLm8KLW9iai0kKENPTkZJR19NUEM4eHh4X0dQSU8pCSs9IG1wYzh4eHhfZ3Bpby5vCiBvYmotJChDT05GSUdfRlNMXzg1WFhfQ0FDSEVfU1JBTSkJKz0gZnNsXzg1eHhfbDJjdGxyLm8gZnNsXzg1eHhfY2FjaGVfc3JhbS5vCiBvYmotJChDT05GSUdfU0lNUExFX0dQSU8pCSs9IHNpbXBsZV9ncGlvLm8KIG9iai0kKENPTkZJR19GU0xfUklPKQkJKz0gZnNsX3Jpby5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2F4b25yYW0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCmluZGV4IDI2NWYwZjAuLmJhNDI3MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCkBAIC0xMDQsNyArMTA0LDcgQEAKICAqIGF4b25fcmFtX21ha2VfcmVxdWVzdCAtIG1ha2VfcmVxdWVzdCgpIG1ldGhvZCBmb3IgYmxvY2sgZGV2aWNlCiAgKiBAcXVldWUsIEBiaW86IHNlZSBibGtfcXVldWVfbWFrZV9yZXF1ZXN0KCkKICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGF4b25fcmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYXhvbl9yYW1fYmFuayAqYmFuayA9IGJpby0+YmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwpAQCAtMTEzLDcgKzExMyw2IEBACiAJc3RydWN0IGJpb192ZWMgKnZlYzsKIAl1bnNpZ25lZCBpbnQgdHJhbnNmZXJlZDsKIAl1bnNpZ25lZCBzaG9ydCBpZHg7Ci0JaW50IHJjID0gMDsKIAogCXBoeXNfbWVtID0gYmFuay0+aW9fYWRkciArIChiaW8tPmJpX3NlY3RvciA8PCBBWE9OX1JBTV9TRUNUT1JfU0hJRlQpOwogCXBoeXNfZW5kID0gYmFuay0+aW9fYWRkciArIGJhbmstPnNpemU7CkBAIC0xMjEsOCArMTIwLDcgQEAKIAliaW9fZm9yX2VhY2hfc2VnbWVudCh2ZWMsIGJpbywgaWR4KSB7CiAJCWlmICh1bmxpa2VseShwaHlzX21lbSArIHZlYy0+YnZfbGVuID4gcGh5c19lbmQpKSB7CiAJCQliaW9faW9fZXJyb3IoYmlvKTsKLQkJCXJjID0gLUVSQU5HRTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAKIAkJdXNlcl9tZW0gPSBwYWdlX2FkZHJlc3ModmVjLT5idl9wYWdlKSArIHZlYy0+YnZfb2Zmc2V0OwpAQCAtMTM1LDggKzEzMyw2IEBACiAJCXRyYW5zZmVyZWQgKz0gdmVjLT5idl9sZW47CiAJfQogCWJpb19lbmRpbyhiaW8sIDApOwotCi0JcmV0dXJuIHJjOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vc3JhbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9zcmFtLmMKaW5kZXggMTIyNTAxMi4uYjZkYjIzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9zcmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9zcmFtLmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG1fY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYwppbmRleCBkNTVkMGFkLi5iZjZjN2NjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgogICoKLSAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA4LDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqCiAgKiBTb21lIHBhcnRzIGRlcml2ZWQgZnJvbSBjb21tcHJvYy5jL2NwbTJfY29tbW9uLmMsIHdoaWNoIGlzOgogICogQ29weXJpZ2h0IChjKSAxOTk3IERhbiBlcnJvcl9hY3QgKGRtYWxla0BqbGMubmV0KQpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0xNDYsNiArMTQ3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3BtX211cmFtX2xvY2ssIGZsYWdzKTsKIAljcG1fbXVyYW1faW5mby5hbGlnbm1lbnQgPSBhbGlnbjsKIAlzdGFydCA9IHJoX2FsbG9jKCZjcG1fbXVyYW1faW5mbywgc2l6ZSwgImNvbW1wcm9jIik7CisJbWVtc2V0KGNwbV9tdXJhbV9hZGRyKHN0YXJ0KSwgMCwgc2l6ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3BtX211cmFtX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBzdGFydDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci5jCmluZGV4IGJiNDRhYTkuLjFiZDBlYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYwpAQCAtMjAsNiArMjAsNyBAQAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9kY3IuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfZ3RtLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYwppbmRleCA3ZGQyODg1Li4wMmNmMWU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9mc2xfZ3RtLmg+CiAKICNkZWZpbmUgR1RDRlJfU1RQKHgpCQkoKHgpICYgMSA/IDEgPDwgNSA6IDEgPDwgMSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKaW5kZXggZDkxNzU3My4uYzRkOTZmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwppbmRleCA0MTlhNzcyLi5lNWMzNDRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYwpAQCAtMzAsNyArMzAsNyBAQAogCiBzdHJ1Y3QgZnNsX21zaV9mZWF0dXJlIHsKIAl1MzIgZnNsX3BpY19pcDsKLQl1MzIgbXNpaXJfb2Zmc2V0OworCXUzMiBtc2lpcl9vZmZzZXQ7IC8qIE9mZnNldCBvZiBNU0lJUiwgcmVsYXRpdmUgdG8gc3RhcnQgb2YgTVNJUiBiYW5rICovCiB9OwogCiBzdHJ1Y3QgZnNsX21zaV9jYXNjYWRlX2RhdGEgewpAQCAtMTI2LDEwICsxMjYsMTkgQEAKIHsKIAlzdHJ1Y3QgZnNsX21zaSAqbXNpX2RhdGEgPSBmc2xfbXNpX2RhdGE7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7Ci0JdTY0IGJhc2UgPSBmc2xfcGNpX2ltbXJiYXJfYmFzZShob3NlKTsKKwl1NjQgYWRkcmVzczsgLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTVNJSVIgKi8KKwlpbnQgbGVuOworCWNvbnN0IHU2NCAqcmVnOwogCi0JbXNnLT5hZGRyZXNzX2xvID0gbXNpX2RhdGEtPm1zaV9hZGRyX2xvICsgbG93ZXJfMzJfYml0cyhiYXNlKTsKLQltc2ctPmFkZHJlc3NfaGkgPSBtc2lfZGF0YS0+bXNpX2FkZHJfaGkgKyB1cHBlcl8zMl9iaXRzKGJhc2UpOworCS8qIElmIHRoZSBtc2ktYWRkcmVzcy02NCBwcm9wZXJ0eSBleGlzdHMsIHRoZW4gdXNlIGl0ICovCisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGhvc2UtPmRuLCAibXNpLWFkZHJlc3MtNjQiLCAmbGVuKTsKKwlpZiAocmVnICYmIChsZW4gPT0gc2l6ZW9mKHU2NCkpKQorCQlhZGRyZXNzID0gYmU2NF90b19jcHVwKHJlZyk7CisJZWxzZQorCQlhZGRyZXNzID0gZnNsX3BjaV9pbW1yYmFyX2Jhc2UoaG9zZSkgKyBtc2lfZGF0YS0+bXNpaXJfb2Zmc2V0OworCisJbXNnLT5hZGRyZXNzX2xvID0gbG93ZXJfMzJfYml0cyhhZGRyZXNzKTsKKwltc2ctPmFkZHJlc3NfaGkgPSB1cHBlcl8zMl9iaXRzKGFkZHJlc3MpOwogCiAJbXNnLT5kYXRhID0gaHdpcnE7CiAKQEAgLTI5Niw3ICszMDUsNyBAQAogCX0KIAogCW1zaS0+bXNpX3ZpcnFzW2lycV9pbmRleF0gPSB2aXJ0X21zaXI7Ci0JY2FzY2FkZV9kYXRhLT5pbmRleCA9IG9mZnNldCArIGlycV9pbmRleDsKKwljYXNjYWRlX2RhdGEtPmluZGV4ID0gb2Zmc2V0OwogCWNhc2NhZGVfZGF0YS0+bXNpX2RhdGEgPSBtc2k7CiAJaXJxX3NldF9oYW5kbGVyX2RhdGEodmlydF9tc2lyLCBjYXNjYWRlX2RhdGEpOwogCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHZpcnRfbXNpciwgZnNsX21zaV9jYXNjYWRlKTsKQEAgLTM1OSw4ICszNjgsNyBAQAogCiAJbXNpLT5pcnFob3N0LT5ob3N0X2RhdGEgPSBtc2k7CiAKLQltc2ktPm1zaV9hZGRyX2hpID0gMHgwOwotCW1zaS0+bXNpX2FkZHJfbG8gPSBmZWF0dXJlcy0+bXNpaXJfb2Zmc2V0ICsgKHJlcy5zdGFydCAmIDB4ZmZmZmYpOworCW1zaS0+bXNpaXJfb2Zmc2V0ID0gZmVhdHVyZXMtPm1zaWlyX29mZnNldCArIChyZXMuc3RhcnQgJiAweGZmZmZmKTsKIAogCXJjID0gZnNsX21zaV9pbml0X2FsbG9jYXRvcihtc2kpOwogCWlmIChyYykgewpAQCAtMzc2LDggKzM4NCwxMCBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKLQlpZiAoIXApCisJaWYgKCFwKSB7CiAJCXAgPSBhbGxfYXZhaWw7CisJCWxlbiA9IHNpemVvZihhbGxfYXZhaWwpOworCX0KIAogCWZvciAoaXJxX2luZGV4ID0gMCwgaSA9IDA7IGkgPCBsZW4gLyAoMiAqIHNpemVvZih1MzIpKTsgaSsrKSB7CiAJCWlmIChwW2kgKiAyXSAlIElSUVNfUEVSX01TSV9SRUcgfHwKQEAgLTM5Myw3ICs0MDMsNyBAQAogCQljb3VudCA9IHBbaSAqIDIgKyAxXSAvIElSUVNfUEVSX01TSV9SRUc7CiAKIAkJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyssIGlycV9pbmRleCsrKSB7Ci0JCQllcnIgPSBmc2xfbXNpX3NldHVwX2h3aXJxKG1zaSwgZGV2LCBvZmZzZXQsIGlycV9pbmRleCk7CisJCQllcnIgPSBmc2xfbXNpX3NldHVwX2h3aXJxKG1zaSwgZGV2LCBvZmZzZXQgKyBqLCBpcnFfaW5kZXgpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGVycm9yX291dDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaAppbmRleCA2MjQ1ODBjLi4xMzEzYWJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuaApAQCAtMjgsOCArMjgsNyBAQAogCiAJdW5zaWduZWQgbG9uZyBjYXNjYWRlX2lycTsKIAotCXUzMiBtc2lfYWRkcl9sbzsKLQl1MzIgbXNpX2FkZHJfaGk7CisJdTMyIG1zaWlyX29mZnNldDsgLyogT2Zmc2V0IG9mIE1TSUlSLCByZWxhdGl2ZSB0byBzdGFydCBvZiBDQ1NSICovCiAJdm9pZCBfX2lvbWVtICptc2lfcmVnczsKIAl1MzIgZmVhdHVyZTsKIAlpbnQgbXNpX3ZpcnFzW05SX01TSV9SRUddOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcG1jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYwppbmRleCBmMTIyZTg5Li41OTJhMGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCmluZGV4IGM2NWY3NWEuLjIyZmZjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCkBAIC0xNjA4LDYgKzE2MDgsNyBAQAogCXJldHVybiAwOwogZXJyOgogCWlvdW5tYXAocHJpdi0+cmVnc193aW4pOworCXJlbGVhc2VfcmVzb3VyY2UoJnBvcnQtPmlvcmVzKTsKIGVycl9yZXM6CiAJa2ZyZWUocHJpdik7CiBlcnJfcHJpdjoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKaW5kZXggMmQ2NjI3NS4uZThmMzg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKaW5kZXggMmVjZTAyYi4uYzZkMDA3MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmgKQEAgLTIyLDE1ICsyMiwyNCBAQAogZXh0ZXJuIHZvaWQgZnNsX3JzdGNyX3Jlc3RhcnQoY2hhciAqY21kKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVUpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0ZTTF9ESVVfTU9EVUxFKQorCisvKiBUaGUgZGlmZmVyZW50IHBvcnRzIHRoYXQgdGhlIERJVSBjYW4gYmUgY29ubmVjdGVkIHRvICovCitlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHsKKwlGU0xfRElVX1BPUlRfRFZJLAkvKiBEVkkgKi8KKwlGU0xfRElVX1BPUlRfTFZEUywJLyogU2luZ2xlLWxpbmsgTFZEUyAqLworCUZTTF9ESVVfUE9SVF9ETFZEUwkvKiBEdWFsLWxpbmsgTFZEUyAqLworfTsKKwogc3RydWN0IHBsYXRmb3JtX2RpdV9kYXRhX29wcyB7Ci0JdW5zaWduZWQgaW50ICgqZ2V0X3BpeGVsX2Zvcm1hdCkgKHVuc2lnbmVkIGludCBiaXRzX3Blcl9waXhlbCwKLQkJaW50IG1vbml0b3JfcG9ydCk7Ci0Jdm9pZCAoKnNldF9nYW1tYV90YWJsZSkgKGludCBtb25pdG9yX3BvcnQsIGNoYXIgKmdhbW1hX3RhYmxlX2Jhc2UpOwotCXZvaWQgKCpzZXRfbW9uaXRvcl9wb3J0KSAoaW50IG1vbml0b3JfcG9ydCk7Ci0Jdm9pZCAoKnNldF9waXhlbF9jbG9jaykgKHVuc2lnbmVkIGludCBwaXhjbG9jayk7Ci0Jc3NpemVfdCAoKnNob3dfbW9uaXRvcl9wb3J0KSAoaW50IG1vbml0b3JfcG9ydCwgY2hhciAqYnVmKTsKLQlpbnQgKCpzZXRfc3lzZnNfbW9uaXRvcl9wb3J0KSAoaW50IHZhbCk7Ci0Jdm9pZCAoKnJlbGVhc2VfYm9vdG1lbSkgKHZvaWQpOworCXUzMiAoKmdldF9waXhlbF9mb3JtYXQpKGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgcG9ydCwKKwkJdW5zaWduZWQgaW50IGJwcCk7CisJdm9pZCAoKnNldF9nYW1tYV90YWJsZSkoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0LAorCQljaGFyICpnYW1tYV90YWJsZV9iYXNlKTsKKwl2b2lkICgqc2V0X21vbml0b3JfcG9ydCkoZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0KTsKKwl2b2lkICgqc2V0X3BpeGVsX2Nsb2NrKSh1bnNpZ25lZCBpbnQgcGl4Y2xvY2spOworCWVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgKCp2YWxpZF9tb25pdG9yX3BvcnQpCisJCShlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IHBvcnQpOworCXZvaWQgKCpyZWxlYXNlX2Jvb3RtZW0pKHZvaWQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kaXVfZGF0YV9vcHMgZGl1X29wczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjNXh4eF9jbG9ja3MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjNXh4eF9jbG9ja3MuYwppbmRleCAzNGUxMmY5Li45NmY4MTVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzV4eHhfY2xvY2tzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM1eHh4X2Nsb2Nrcy5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogdW5zaWduZWQgaW50CiBtcGM1eHh4X2dldF9idXNfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKaW5kZXggMjJlNDhlMmQuLjJjYTBhODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4eF9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDk2M2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKgotICogR1BJT3Mgb24gTVBDNTEyeC84MzQ5Lzg1NzIvODYxMCBhbmQgY29tcGF0aWJsZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBQZXRlciBLb3JzZ2FhcmQgPGphY21ldEBzdW5zaXRlLmRrPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKLSAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KLSNkZWZpbmUgTVBDOFhYWF9HUElPX1BJTlMJMzIKLQotI2RlZmluZSBHUElPX0RJUgkJMHgwMAotI2RlZmluZSBHUElPX09EUgkJMHgwNAotI2RlZmluZSBHUElPX0RBVAkJMHgwOAotI2RlZmluZSBHUElPX0lFUgkJMHgwYwotI2RlZmluZSBHUElPX0lNUgkJMHgxMAotI2RlZmluZSBHUElPX0lDUgkJMHgxNAotI2RlZmluZSBHUElPX0lDUjIJCTB4MTgKLQotc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwIHsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOwotCXNwaW5sb2NrX3QgbG9jazsKLQotCS8qCi0JICogc2hhZG93ZWQgZGF0YSByZWdpc3RlciB0byBiZSBhYmxlIHRvIGNsZWFyL3NldCBvdXRwdXQgcGlucyBpbgotCSAqIG9wZW4gZHJhaW4gbW9kZSBzYWZlbHkKLQkgKi8KLQl1MzIgZGF0YTsKLQlzdHJ1Y3QgaXJxX2hvc3QgKmlycTsKLQl2b2lkICpvZl9kZXZfaWRfZGF0YTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG1wYzh4eHhfZ3BpbzJtYXNrKHVuc2lnbmVkIGludCBncGlvKQotewotCXJldHVybiAxdSA8PCAoTVBDOFhYWF9HUElPX1BJTlMgLSAxIC0gZ3Bpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICoKLXRvX21wYzh4eHhfZ3Bpb19jaGlwKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tKQotewotCXJldHVybiBjb250YWluZXJfb2YobW0sIHN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCwgbW1fZ2MpOwotfQotCi1zdGF0aWMgdm9pZCBtcGM4eHh4X2dwaW9fc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKLQotCW1wYzh4eHhfZ2MtPmRhdGEgPSBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpOwotfQotCi0vKiBXb3JrYXJvdW5kIEdQSU8gMSBlcnJhdGEgb24gTVBDODU3Mi9NUEM4NTM2LiBUaGUgc3RhdHVzIG9mIEdQSU9zCi0gKiBkZWZpbmVkIGFzIG91dHB1dCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSByZWFkaW5nIEdQREFUIHJlZ2lzdGVyLAotICogc28gd2UgdXNlIHNoYWRvdyBkYXRhIHJlZ2lzdGVyIGluc3RlYWQuIFRoZSBzdGF0dXMgb2YgaW5wdXQgcGlucwotICogaXMgZGV0ZXJtaW5lZCBieSByZWFkaW5nIEdQREFUIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgaW50IG1wYzg1NzJfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQotewotCXUzMiB2YWw7Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKLQotCXZhbCA9IGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0RBVCkgJiB+aW5fYmUzMihtbS0+cmVncyArIEdQSU9fRElSKTsKLQotCXJldHVybiAodmFsIHwgbXBjOHh4eF9nYy0+ZGF0YSkgJiBtcGM4eHh4X2dwaW8ybWFzayhncGlvKTsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0KLQlyZXR1cm4gaW5fYmUzMihtbS0+cmVncyArIEdQSU9fREFUKSAmIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOwotfQotCi1zdGF0aWMgdm9pZCBtcGM4eHh4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHZhbCkKLQkJbXBjOHh4eF9nYy0+ZGF0YSB8PSBtcGM4eHh4X2dwaW8ybWFzayhncGlvKTsKLQllbHNlCi0JCW1wYzh4eHhfZ2MtPmRhdGEgJj0gfm1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOwotCi0Jb3V0X2JlMzIobW0tPnJlZ3MgKyBHUElPX0RBVCwgbXBjOHh4eF9nYy0+ZGF0YSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQotCWNscmJpdHMzMihtbS0+cmVncyArIEdQSU9fRElSLCBtcGM4eHh4X2dwaW8ybWFzayhncGlvKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9fZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCi17Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXBjOHh4eF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0KLQlzZXRiaXRzMzIobW0tPnJlZ3MgKyBHUElPX0RJUiwgbXBjOHh4eF9ncGlvMm1hc2soZ3BpbykpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7Ci0KLQlpZiAobXBjOHh4eF9nYy0+aXJxICYmIG9mZnNldCA8IE1QQzhYWFhfR1BJT19QSU5TKQotCQlyZXR1cm4gaXJxX2NyZWF0ZV9tYXBwaW5nKG1wYzh4eHhfZ2MtPmlycSwgb2Zmc2V0KTsKLQllbHNlCi0JCXJldHVybiAtRU5YSU87Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19pcnFfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCW1hc2sgPSBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19JRVIpICYgaW5fYmUzMihtbS0+cmVncyArIEdQSU9fSU1SKTsKLQlpZiAobWFzaykKLQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9saW5lYXJfcmV2bWFwKG1wYzh4eHhfZ2MtPmlycSwKLQkJCQkJCSAgICAgMzIgLSBmZnMobWFzaykpKTsKLX0KLQotc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQotCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fSU1SLCBtcGM4eHh4X2dwaW8ybWFzayhpcnFkX3RvX2h3aXJxKGQpKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzh4eHhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCi0JY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19JTVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKLQotCW91dF9iZTMyKG1tLT5yZWdzICsgR1BJT19JRVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN3aXRjaCAoZmxvd190eXBlKSB7Ci0JY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fSUNSLAotCQkJICBtcGM4eHh4X2dwaW8ybWFzayhpcnFkX3RvX2h3aXJxKGQpKSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKLQkJY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19JQ1IsCi0JCQkgIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1wYzUxMnhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKLXsKLQlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKLQl1bnNpZ25lZCBsb25nIGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOwotCXZvaWQgX19pb21lbSAqcmVnOwotCXVuc2lnbmVkIGludCBzaGlmdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGdwaW8gPCAxNikgewotCQlyZWcgPSBtbS0+cmVncyArIEdQSU9fSUNSOwotCQlzaGlmdCA9ICgxNSAtIGdwaW8pICogMjsKLQl9IGVsc2UgewotCQlyZWcgPSBtbS0+cmVncyArIEdQSU9fSUNSMjsKLQkJc2hpZnQgPSAoMTUgLSAoZ3BpbyAlIDE2KSkgKiAyOwotCX0KLQotCXN3aXRjaCAoZmxvd190eXBlKSB7Ci0JY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6Ci0JY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWNscnNldGJpdHNfYmUzMihyZWcsIDMgPDwgc2hpZnQsIDIgPDwgc2hpZnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKLQljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWNscnNldGJpdHNfYmUzMihyZWcsIDMgPDwgc2hpZnQsIDEgPDwgc2hpZnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWNscmJpdHMzMihyZWcsIDMgPDwgc2hpZnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjOHh4eF9pcnFfY2hpcCA9IHsKLQkubmFtZQkJPSAibXBjOHh4eC1ncGlvIiwKLQkuaXJxX3VubWFzawk9IG1wYzh4eHhfaXJxX3VubWFzaywKLQkuaXJxX21hc2sJPSBtcGM4eHh4X2lycV9tYXNrLAotCS5pcnFfYWNrCT0gbXBjOHh4eF9pcnFfYWNrLAotCS5pcnFfc2V0X3R5cGUJPSBtcGM4eHh4X2lycV9zZXRfdHlwZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX2lycV9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKLQkJCQlpcnFfaHdfbnVtYmVyX3QgaHcpCi17Ci0Jc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaC0+aG9zdF9kYXRhOwotCi0JaWYgKG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhKQotCQltcGM4eHh4X2lycV9jaGlwLmlycV9zZXRfdHlwZSA9IG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhOwotCi0JaXJxX3NldF9jaGlwX2RhdGEodmlycSwgaC0+aG9zdF9kYXRhKTsKLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJm1wYzh4eHhfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwotCWlycV9zZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTk9ORSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtcGM4eHh4X2dwaW9faXJxX3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKLQkJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCi0JCQkJICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwKLQkJCQkgIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQotCi17Ci0JLyogaW50ZXJydXB0IHNlbnNlIHZhbHVlcyBjb21pbmcgZnJvbSB0aGUgZGV2aWNlIHRyZWUgZXF1YWwgZWl0aGVyCi0JICogRURHRV9GQUxMSU5HIG9yIEVER0VfQk9USAotCSAqLwotCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOwotCSpvdXRfZmxhZ3MgPSBpbnRzcGVjWzFdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2hvc3Rfb3BzIG1wYzh4eHhfZ3Bpb19pcnFfb3BzID0gewotCS5tYXAJPSBtcGM4eHh4X2dwaW9faXJxX21hcCwKLQkueGxhdGUJPSBtcGM4eHh4X2dwaW9faXJxX3hsYXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjOHh4eF9ncGlvX2lkc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1ncGlvIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZ3BpbyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1ncGlvIiwgLmRhdGEgPSBtcGM1MTJ4X2lycV9zZXRfdHlwZSwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1ncGlvIiwgICB9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjOHh4eF9hZGRfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYzsKLQlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYzsKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKLQl1bnNpZ25lZCBod2lycTsKLQlpbnQgcmV0OwotCi0JbXBjOHh4eF9nYyA9IGt6YWxsb2Moc2l6ZW9mKCptcGM4eHh4X2djKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtcGM4eHh4X2djKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZtcGM4eHh4X2djLT5sb2NrKTsKLQotCW1tX2djID0gJm1wYzh4eHhfZ2MtPm1tX2djOwotCWdjID0gJm1tX2djLT5nYzsKLQotCW1tX2djLT5zYXZlX3JlZ3MgPSBtcGM4eHh4X2dwaW9fc2F2ZV9yZWdzOwotCWdjLT5uZ3BpbyA9IE1QQzhYWFhfR1BJT19QSU5TOwotCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBtcGM4eHh4X2dwaW9fZGlyX2luOwotCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gbXBjOHh4eF9ncGlvX2Rpcl9vdXQ7Ci0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLG1wYzg1NzItZ3BpbyIpKQotCQlnYy0+Z2V0ID0gbXBjODU3Ml9ncGlvX2dldDsKLQllbHNlCi0JCWdjLT5nZXQgPSBtcGM4eHh4X2dwaW9fZ2V0OwotCWdjLT5zZXQgPSBtcGM4eHh4X2dwaW9fc2V0OwotCWdjLT50b19pcnEgPSBtcGM4eHh4X2dwaW9fdG9faXJxOwotCi0JcmV0ID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG5wLCBtbV9nYyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlod2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoaHdpcnEgPT0gTk9fSVJRKQotCQlnb3RvIHNraXBfaXJxOwotCi0JbXBjOHh4eF9nYy0+aXJxID0KLQkJaXJxX2FsbG9jX2hvc3QobnAsIElSUV9IT1NUX01BUF9MSU5FQVIsIE1QQzhYWFhfR1BJT19QSU5TLAotCQkJICAgICAgICZtcGM4eHh4X2dwaW9faXJxX29wcywgTVBDOFhYWF9HUElPX1BJTlMpOwotCWlmICghbXBjOHh4eF9nYy0+aXJxKQotCQlnb3RvIHNraXBfaXJxOwotCi0JaWQgPSBvZl9tYXRjaF9ub2RlKG1wYzh4eHhfZ3Bpb19pZHMsIG5wKTsKLQlpZiAoaWQpCi0JCW1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhID0gaWQtPmRhdGE7Ci0KLQltcGM4eHh4X2djLT5pcnEtPmhvc3RfZGF0YSA9IG1wYzh4eHhfZ2M7Ci0KLQkvKiBhY2sgYW5kIG1hc2sgYWxsIGlycXMgKi8KLQlvdXRfYmUzMihtbV9nYy0+cmVncyArIEdQSU9fSUVSLCAweGZmZmZmZmZmKTsKLQlvdXRfYmUzMihtbV9nYy0+cmVncyArIEdQSU9fSU1SLCAwKTsKLQotCWlycV9zZXRfaGFuZGxlcl9kYXRhKGh3aXJxLCBtcGM4eHh4X2djKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihod2lycSwgbXBjOHh4eF9ncGlvX2lycV9jYXNjYWRlKTsKLQotc2tpcF9pcnE6Ci0JcmV0dXJuOwotCi1lcnI6Ci0JcHJfZXJyKCIlczogcmVnaXN0cmF0aW9uIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkgICAgICAgbnAtPmZ1bGxfbmFtZSwgcmV0KTsKLQlrZnJlZShtcGM4eHh4X2djKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXBjOHh4eF9hZGRfZ3Bpb2NoaXBzKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIG1wYzh4eHhfZ3Bpb19pZHMpCi0JCW1wYzh4eHhfYWRkX2NvbnRyb2xsZXIobnApOwotCi0JcmV0dXJuIDA7Ci19Ci1hcmNoX2luaXRjYWxsKG1wYzh4eHhfYWRkX2dwaW9jaGlwcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCmluZGV4IGQ1ZDNmZjMuLjhjN2U4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCkBAIC04MDAsOCArODAwLDYgQEAKIAkgKiBJUElzIGFyZSBtYXJrZWQgSVJRX1BFUl9DUFUuIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZgogCSAqIHByZXZlbnRpbmcgdGhlIElSUV9QRU5ESU5HL0lSUV9JTlBST0dSRVNTIGxvZ2ljIGZyb20KIAkgKiBhcHBseWluZyB0byB0aGVtLiBXZSBFT0kgdGhlbSBsYXRlIHRvIGF2b2lkIHJlLWVudGVyaW5nLgotCSAqIFdlIG1hcmsgSVBJJ3Mgd2l0aCBJUlFGX0RJU0FCTEVEIGFzIHRoZXkgbXVzdCBydW4gd2l0aAotCSAqIGlycXMgZGlzYWJsZWQuCiAJICovCiAJbXBpY19lb2kobXBpYyk7CiB9CkBAIC0xMjg1LDEzICsxMjgzLDExIEBACiAJCQkgICBtcGljX3JlYWQobXBpYy0+Z3JlZ3MsIE1QSUNfSU5GTyhHUkVHX0dMT0JBTF9DT05GXzApKQogCQkJICAgfCBNUElDX0dSRUdfR0NPTkZfTUNLKTsKIAotCS8qIFJlYWQgZmVhdHVyZSByZWdpc3RlciwgY2FsY3VsYXRlIG51bSBDUFVzIGFuZCwgZm9yIG5vbi1JU1UKLQkgKiBNUElDcywgbnVtIHNvdXJjZXMgYXMgd2VsbC4gT24gSVNVIE1QSUNzLCBzb3VyY2VzIGFyZSBjb3VudGVkCi0JICogYXMgSVNVcyBhcmUgYWRkZWQKKwkvKgorCSAqIFJlYWQgZmVhdHVyZSByZWdpc3Rlci4gIEZvciBub24tSVNVIE1QSUNzLCBudW0gc291cmNlcyBhcyB3ZWxsLiBPbgorCSAqIElTVSBNUElDcywgc291cmNlcyBhcmUgY291bnRlZCBhcyBJU1VzIGFyZSBhZGRlZAogCSAqLwogCWdyZWdfZmVhdHVyZSA9IG1waWNfcmVhZChtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfRkVBVFVSRV8wKSk7Ci0JbXBpYy0+bnVtX2NwdXMgPSAoKGdyZWdfZmVhdHVyZSAmIE1QSUNfR1JFR19GRUFUVVJFX0xBU1RfQ1BVX01BU0spCi0JCQkgID4+IE1QSUNfR1JFR19GRUFUVVJFX0xBU1RfQ1BVX1NISUZUKSArIDE7CiAJaWYgKGlzdV9zaXplID09IDApIHsKIAkJaWYgKGZsYWdzICYgTVBJQ19CUk9LRU5fRlJSX05JUlFTKQogCQkJbXBpYy0+bnVtX3NvdXJjZXMgPSBtcGljLT5pcnFfY291bnQ7CkBAIC0xMzAxLDEwICsxMjk3LDE4IEBACiAJCQkJID4+IE1QSUNfR1JFR19GRUFUVVJFX0xBU1RfU1JDX1NISUZUKSArIDE7CiAJfQogCisJLyoKKwkgKiBUaGUgTVBJQyBkcml2ZXIgd2lsbCBjcmFzaCBpZiB0aGVyZSBhcmUgbW9yZSBjb3JlcyB0aGFuIHdlCisJICogY2FuIGluaXRpYWxpemUsIHNvIHdlIG1heSBhcyB3ZWxsIGNhdGNoIHRoYXQgcHJvYmxlbSBoZXJlLgorCSAqLworCUJVR19PTihudW1fcG9zc2libGVfY3B1cygpID4gTVBJQ19NQVhfQ1BVUyk7CisKIAkvKiBNYXAgdGhlIHBlci1DUFUgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IG1waWMtPm51bV9jcHVzOyBpKyspIHsKLQkJbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT5jcHVyZWdzW2ldLAotCQkJIE1QSUNfSU5GTyhDUFVfQkFTRSkgKyBpICogTVBJQ19JTkZPKENQVV9TVFJJREUpLAorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXVuc2lnbmVkIGludCBjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGkpOworCisJCW1waWNfbWFwKG1waWMsIG5vZGUsIHBhZGRyLCAmbXBpYy0+Y3B1cmVnc1tjcHVdLAorCQkJIE1QSUNfSU5GTyhDUFVfQkFTRSkgKyBjcHUgKiBNUElDX0lORk8oQ1BVX1NUUklERSksCiAJCQkgMHgxMDAwKTsKIAl9CiAKQEAgLTEzNDMsNyArMTM0Nyw3IEBACiAJfQogCXByaW50ayhLRVJOX0lORk8gIm1waWM6IFNldHRpbmcgdXAgTVBJQyBcIiVzXCIgdmVyc2lvbiAlcyBhdCAlbGx4LCIKIAkgICAgICAgIiBtYXggJWQgQ1BVc1xuIiwKLQkgICAgICAgbmFtZSwgdmVycywgKHVuc2lnbmVkIGxvbmcgbG9uZylwYWRkciwgbXBpYy0+bnVtX2NwdXMpOworCSAgICAgICBuYW1lLCB2ZXJzLCAodW5zaWduZWQgbG9uZyBsb25nKXBhZGRyLCBudW1fcG9zc2libGVfY3B1cygpKTsKIAlwcmludGsoS0VSTl9JTkZPICJtcGljOiBJU1Ugc2l6ZTogJWQsIHNoaWZ0OiAlZCwgbWFzazogJXhcbiIsCiAJICAgICAgIG1waWMtPmlzdV9zaXplLCBtcGljLT5pc3Vfc2hpZnQsIG1waWMtPmlzdV9tYXNrKTsKIApAQCAtMTc0Miw2ICsxNzQ2LDcgQEAKIAlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfcHJpbWFyeTsKIAl1MzIgcGlyOwogCWludCBjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKwlpbnQgaTsKIAogCS8qIFNldCB0YXJnZXQgYml0IGZvciBjb3JlIHJlc2V0ICovCiAJcGlyID0gbXBpY19yZWFkKG1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19QUk9DRVNTT1JfSU5JVCkpOwpAQCAtMTc1Myw2ICsxNzU4LDE1IEBACiAJcGlyICY9IH4oMSA8PCBjcHVpZCk7CiAJbXBpY193cml0ZShtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfUFJPQ0VTU09SX0lOSVQpLCBwaXIpOwogCW1waWNfcmVhZChtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfUFJPQ0VTU09SX0lOSVQpKTsKKworCS8qIFBlcmZvcm0gMTUgRU9JIG9uIGVhY2ggcmVzZXQgY29yZSB0byBjbGVhciBwZW5kaW5nIGludGVycnVwdHMuCisJICogVGhpcyBpcyByZXF1aXJlZCBmb3IgRlNMIENvcmVOZXQgYmFzZWQgZGV2aWNlcyAqLworCWlmIChtcGljLT5mbGFncyAmIE1QSUNfRlNMKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCQlfbXBpY193cml0ZShtcGljLT5yZWdfdHlwZSwgJm1waWMtPmNwdXJlZ3NbY3B1aWRdLAorCQkJCSAgICAgIE1QSUNfQ1BVX0VPSSwgMCk7CisJCX0KKwl9CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKaW5kZXggNzdiYjNmNC4uYjAwMzdjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMKaW5kZXggOGNlNGZjMy4uOGYwNDY1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9tc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X21zaS5jCmluZGV4IDM2N2FmMDIuLjFjMmQ3YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X21zaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYwppbmRleCBkYmZlOTZiLi44NjJmMTFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYwpAQCAtODM0LDcgKzgzNCw3IEBACiAJcmV0dXJuIDM7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNDQwc3BlX3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IF9faW5pdCBwcGM0NDBzcGVfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAl1MzIgdmFsID0gMSA8PCAyNDsKIApAQCAtODcyLDEyICs4NzIsMTIgQEAKIAlyZXR1cm4gcHBjNHh4X3BjaWV4X3BvcnRfcmVzZXRfc2RyKHBvcnQpOwogfQogCi1zdGF0aWMgaW50IHBwYzQ0MHNwZUFfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ0MHNwZUFfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKIHsKIAlyZXR1cm4gcHBjNDQwc3BlX3BjaWV4X2luaXRfcG9ydF9odyhwb3J0KTsKIH0KIAotc3RhdGljIGludCBwcGM0NDBzcGVCX3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IF9faW5pdCBwcGM0NDBzcGVCX3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCiB7CiAJaW50IHJjID0gcHBjNDQwc3BlX3BjaWV4X2luaXRfcG9ydF9odyhwb3J0KTsKIApAQCAtOTM2LDcgKzkzNiw3IEBACiAJcmV0dXJuIDI7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNDYwZXhfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQ2MGV4X3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCiB7CiAJdTMyIHZhbDsKIAl1MzIgdXRsc2V0MTsKQEAgLTEwOTIsNiArMTA5MiwxMCBAQAogCW10ZGNyaShTRFIwLCBQRVNEUjFfNDYwU1hfSFNTU0xFVywgMHhGRkZGMDAwMCk7CiAJbXRkY3JpKFNEUjAsIFBFU0RSMl80NjBTWF9IU1NTTEVXLCAweEZGRkYwMDAwKTsKIAorCS8qIFNldCBIU1MgUFJCUyBlbmFibGVkICovCisJbXRkY3JpKFNEUjAsIFBFU0RSMF80NjBTWF9IU1NDVExTRVQsIDB4MDAwMDExMzApOworCW10ZGNyaShTRFIwLCBQRVNEUjJfNDYwU1hfSFNTQ1RMU0VULCAweDAwMDAxMTMwKTsKKwogCXVkZWxheSgxMDApOwogCiAJLyogRGUtYXNzZXJ0IFBMTFJFU0VUICovCkBAIC0xMTIyLDcgKzExMjYsNyBAQAogCXJldHVybiAyOwogfQogCi1zdGF0aWMgaW50IHBwYzQ2MHN4X3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IF9faW5pdCBwcGM0NjBzeF9wY2lleF9pbml0X3BvcnRfaHcoc3RydWN0IHBwYzR4eF9wY2lleF9wb3J0ICpwb3J0KQogewogCiAJaWYgKHBvcnQtPmVuZHBvaW50KQpAQCAtMTEzMiw5ICsxMTM2LDYgQEAKIAkJZGNyaV9jbHJzZXQoU0RSMCwgcG9ydC0+c2RyX2Jhc2UgKyBQRVNEUm5fVVRMU0VUMiwKIAkJCQkwLCAweDAxMDAwMDAwKTsKIAotCS8qR2VuLTEqLwotCW10ZGNyaShTRFIwLCBwb3J0LT5zZHJfYmFzZSArIFBFU0RSbl80NjBTWF9SQ0VJLCAweDA4MDAwMDAwKTsKLQogCWRjcmlfY2xyc2V0KFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgUEVTRFJuX1JDU1NFVCwKIAkJCShQRVNEUnhfUkNTU0VUX1JTVEdVIHwgUEVTRFJ4X1JDU1NFVF9SU1RETCksCiAJCQlQRVNEUnhfUkNTU0VUX1JTVFBZTik7CkBAIC0xMTQ4LDE0ICsxMTQ5LDQyIEBACiB7CiAJLyogTWF4IDEyOCBCeXRlcyAqLwogCW91dF9iZTMyIChwb3J0LT51dGxfYmFzZSArIFBFVVRMX1BCQlNaLCAgIDB4MDAwMDAwMDApOworCS8qIEFzc2VydCBWUkIgYW5kIFRYRSAtIHBlciBkYXRhc2hlZXQgdHVybiBvZmYgYWRkciB2YWxpZGF0aW9uICovCisJb3V0X2JlMzIocG9ydC0+dXRsX2Jhc2UgKyBQRVVUTF9QQ1RMLCAgMHg4MDgwMDAwMCk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwcGM0NjBzeF9wY2lleF9jaGVja19saW5rKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3sKKwl2b2lkIF9faW9tZW0gKm1iYXNlOworCWludCBhdHRlbXB0ID0gNTA7CisKKwlwb3J0LT5saW5rID0gMDsKKworCW1iYXNlID0gaW9yZW1hcChwb3J0LT5jZmdfc3BhY2Uuc3RhcnQgKyAweDEwMDAwMDAwLCAweDEwMDApOworCWlmIChtYmFzZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IG1hcCBpbnRlcm5hbCBjb25maWcgc3BhY2UgISIsCisJCQlwb3J0LT5ub2RlLT5mdWxsX25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJd2hpbGUgKGF0dGVtcHQgJiYgKDAgPT0gKGluX2xlMzIobWJhc2UgKyBQRUNGR180NjBTWF9ETExTVEEpCisJCQkmIFBFQ0ZHXzQ2MFNYX0RMTFNUQV9MSU5LVVApKSkgeworCQlhdHRlbXB0LS07CisJCW1kZWxheSgxMCk7CisJfQorCWlmIChhdHRlbXB0KQorCQlwb3J0LT5saW5rID0gMTsKK2RvbmU6CisJaW91bm1hcChtYmFzZSk7CisKK30KKwogc3RhdGljIHN0cnVjdCBwcGM0eHhfcGNpZXhfaHdvcHMgcHBjNDYwc3hfcGNpZV9od29wcyBfX2luaXRkYXRhID0gewogCS5jb3JlX2luaXQJPSBwcGM0NjBzeF9wY2lleF9jb3JlX2luaXQsCiAJLnBvcnRfaW5pdF9odwk9IHBwYzQ2MHN4X3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDYwc3hfcGNpZXhfaW5pdF91dGwsCi0JLmNoZWNrX2xpbmsJPSBwcGM0eHhfcGNpZXhfY2hlY2tfbGlua19zZHIsCisJLmNoZWNrX2xpbmsJPSBwcGM0NjBzeF9wY2lleF9jaGVja19saW5rLAogfTsKIAogI2VuZGlmIC8qIENPTkZJR180NHggKi8KQEAgLTExODksNyArMTIxOCw3IEBACiAJbXRkY3JpKFNEUjAsIHBvcnQtPnNkcl9iYXNlICsgUEVTRFJuX1JDU1NFVCwgMHgwMDEwMTAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNDA1ZXhfcGNpZXhfaW5pdF9wb3J0X2h3KHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgX19pbml0IHBwYzQwNWV4X3BjaWV4X2luaXRfcG9ydF9odyhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCiB7CiAJdTMyIHZhbDsKIApAQCAtMTMzOCwxNSArMTM2NywxNSBAQAogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAocHBjNHh4X3BjaWV4X2h3b3BzLT5jaGVja19saW5rKQotCQlwcGM0eHhfcGNpZXhfaHdvcHMtPmNoZWNrX2xpbmsocG9ydCk7Ci0KIAkvKgogCSAqIEluaXRpYWxpemUgbWFwcGluZzogZGlzYWJsZSBhbGwgcmVnaW9ucyBhbmQgY29uZmlndXJlCiAJICogQ0ZHIGFuZCBSRUcgcmVnaW9ucyBiYXNlZCBvbiByZXNvdXJjZXMgaW4gdGhlIGRldmljZSB0cmVlCiAJICovCiAJcHBjNHh4X3BjaWV4X3BvcnRfaW5pdF9tYXBwaW5nKHBvcnQpOwogCisJaWYgKHBwYzR4eF9wY2lleF9od29wcy0+Y2hlY2tfbGluaykKKwkJcHBjNHh4X3BjaWV4X2h3b3BzLT5jaGVja19saW5rKHBvcnQpOworCiAJLyoKIAkgKiBNYXAgVVRMCiAJICovCkBAIC0xMzYwLDEzICsxMzg5LDIzIEBACiAJCXBwYzR4eF9wY2lleF9od29wcy0+c2V0dXBfdXRsKHBvcnQpOwogCiAJLyoKLQkgKiBDaGVjayBmb3IgVkMwIGFjdGl2ZSBhbmQgYXNzZXJ0IFJEWS4KKwkgKiBDaGVjayBmb3IgVkMwIGFjdGl2ZSBvciBQTEwgTG9ja2VkIGFuZCBhc3NlcnQgUkRZLgogCSAqLwogCWlmIChwb3J0LT5zZHJfYmFzZSkgewotCQlpZiAocG9ydC0+bGluayAmJgotCQkgICAgcHBjNHh4X3BjaWV4X3dhaXRfb25fc2RyKHBvcnQsIFBFU0RSbl9SQ1NTVFMsCi0JCQkJCSAgICAgMSA8PCAxNiwgMSA8PCAxNiwgNTAwMCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlBDSUUlZDogVkMwIG5vdCBhY3RpdmVcbiIsIHBvcnQtPmluZGV4KTsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBvcnQtPm5vZGUsCisJCQkJImlibSxwbGItcGNpZXgtNDYwc3giKSl7CisJCQlpZiAocG9ydC0+bGluayAmJiBwcGM0eHhfcGNpZXhfd2FpdF9vbl9zZHIocG9ydCwKKwkJCQkJUEVTRFJuX1JDU1NUUywKKwkJCQkJMSA8PCAxMiwgMSA8PCAxMiwgNTAwMCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJQQ0lFJWQ6IFBMTCBub3QgbG9ja2VkXG4iLAorCQkJCQkJcG9ydC0+aW5kZXgpOworCQkJCXBvcnQtPmxpbmsgPSAwOworCQkJfQorCQl9IGVsc2UgaWYgKHBvcnQtPmxpbmsgJiYKKwkJCXBwYzR4eF9wY2lleF93YWl0X29uX3Nkcihwb3J0LCBQRVNEUm5fUkNTU1RTLAorCQkJCTEgPDwgMTYsIDEgPDwgMTYsIDUwMDApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJQQ0lFJWQ6IFZDMCBub3QgYWN0aXZlXG4iLAorCQkJCQlwb3J0LT5pbmRleCk7CiAJCQlwb3J0LT5saW5rID0gMDsKIAkJfQogCkBAIC0xNTczLDggKzE2MTIsMTUgQEAKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMUJBSCwgbGFoKTsKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMUJBTCwgbGFsKTsKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMU1TS0gsIDB4N2ZmZmZmZmYpOwotCQkvKiBOb3RlIHRoYXQgMyBoZXJlIG1lYW5zIGVuYWJsZWQgfCBzaW5nbGUgcmVnaW9uICovCi0JCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjFNU0tMLCBzYSB8IDMpOworCQkvKkVuYWJsZWQgYW5kIHNpbmdsZSByZWdpb24gKi8KKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBvcnQtPm5vZGUsICJpYm0scGxiLXBjaWV4LTQ2MHN4IikpCisJCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxTVNLTCwKKwkJCQlzYSB8IERDUk9fUEVHUExfNDYwU1hfT01SMU1TS0xfVU9UCisJCQkJCXwgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwpOworCQllbHNlCisJCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxTVNLTCwKKwkJCQlzYSB8IERDUk9fUEVHUExfT01SMU1TS0xfVU9UCisJCQkJCXwgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwpOwogCQlicmVhazsKIAljYXNlIDE6CiAJCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUE9NMUxBSCwgcGNpYWgpOwpAQCAtMTU4Miw4ICsxNjI4LDggQEAKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMkJBSCwgbGFoKTsKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMkJBTCwgbGFsKTsKIAkJZGNyX3dyaXRlKHBvcnQtPmRjcnMsIERDUk9fUEVHUExfT01SMk1TS0gsIDB4N2ZmZmZmZmYpOwotCQkvKiBOb3RlIHRoYXQgMyBoZXJlIG1lYW5zIGVuYWJsZWQgfCBzaW5nbGUgcmVnaW9uICovCi0JCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjJNU0tMLCBzYSB8IDMpOworCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIyTVNLTCwKKwkJCQlzYSB8IERDUk9fUEVHUExfT01SeE1TS0xfVkFMKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX1BPTTJMQUgsIHBjaWFoKTsKQEAgLTE1OTIsNyArMTYzOCw5IEBACiAJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjNCQUwsIGxhbCk7CiAJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjNNU0tILCAweDdmZmZmZmZmKTsKIAkJLyogTm90ZSB0aGF0IDMgaGVyZSBtZWFucyBlbmFibGVkIHwgSU8gc3BhY2UgISEhICovCi0JCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjNNU0tMLCBzYSB8IDMpOworCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIzTVNLTCwKKwkJCQlzYSB8IERDUk9fUEVHUExfT01SM01TS0xfSU8KKwkJCQkJfCBEQ1JPX1BFR1BMX09NUnhNU0tMX1ZBTCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTY5Myw2ICsxNzQxLDkgQEAKIAkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQogCQkJc2EgfD0gMHg4OwogCisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwb3J0LT5ub2RlLCAiaWJtLHBsYi1wY2lleC00NjBzeCIpKQorCQkJc2EgfD0gUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDsKKwogCQlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX0JBUjBITVBBLCBSRVNfVE9fVTMyX0hJR0goc2EpKTsKIAkJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19CQVIwTE1QQSwgUkVTX1RPX1UzMl9MT1coc2EpKTsKIApAQCAtMTg1NCw2ICsxOTA1LDEwIEBACiAJfQogCW91dF9sZTE2KG1iYXNlICsgMHgyMDIsIHZhbCk7CiAKKwkvKiBFbmFibGUgQnVzIG1hc3RlciwgbWVtb3J5LCBhbmQgaW8gc3BhY2UgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocG9ydC0+bm9kZSwgImlibSxwbGItcGNpZXgtNDYwc3giKSkKKwkJb3V0X2xlMTYobWJhc2UgKyAweDIwNCwgMHg3KTsKKwogCWlmICghcG9ydC0+ZW5kcG9pbnQpIHsKIAkJLyogU2V0IENsYXNzIENvZGUgdG8gUENJLVBDSSBicmlkZ2UgYW5kIFJldmlzaW9uIElkIHRvIDEgKi8KIAkJb3V0X2xlMzIobWJhc2UgKyAweDIwOCwgMHgwNjA0MDAwMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCmluZGV4IGMzOWExMzQuLjMyY2U3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCkBAIC00NjQsNiArNDY0LDE4IEBACiAjZGVmaW5lIFBFQ0ZHX1BPTTJMQUwJCTB4MzkwCiAjZGVmaW5lIFBFQ0ZHX1BPTTJMQUgJCTB4Mzk0CiAKKy8qIDQ2MHN4IG9ubHkgKi8KKyNkZWZpbmUgUEVDRkdfNDYwU1hfRExMU1RBICAgICAweDNmOAorCisvKiA0NjBzeCBCaXQgTWFwcGluZ3MgKi8KKyNkZWZpbmUgUEVDRkdfNDYwU1hfRExMU1RBX0xJTktVUAkgMHgwMDAwMDAxMAorI2RlZmluZSBEQ1JPX1BFR1BMXzQ2MFNYX09NUjFNU0tMX1VPVAkgMHgwMDAwMDAwNAorCisvKiBQRUdQTCBCaXQgTWFwcGluZ3MgKi8KKyNkZWZpbmUgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwJIDB4MDAwMDAwMDEKKyNkZWZpbmUgRENST19QRUdQTF9PTVIxTVNLTF9VT1QJIDB4MDAwMDAwMDIKKyNkZWZpbmUgRENST19QRUdQTF9PTVIzTVNLTF9JTwkgMHgwMDAwMDAwMgorCiAvKiBTRFIgQml0IE1hcHBpbmdzICovCiAjZGVmaW5lIFBFU0RSeF9SQ1NTRVRfSExEUExCCTB4MTAwMDAwMDAKICNkZWZpbmUgUEVTRFJ4X1JDU1NFVF9SU1RHVQkweDAxMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3NvYy5jCmluZGV4IGQzZDZjZTMuLjBkZWJjYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3NvYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3NvYy5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAl9CiAKIAkvKiBJbnN0YWxsIGVycm9yIGhhbmRsZXIgKi8KLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBsMmNfZXJyb3JfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwgIkwyQyIsIDApIDwgMCkgeworCWlmIChyZXF1ZXN0X2lycShpcnEsIGwyY19lcnJvcl9oYW5kbGVyLCAwLCAiTDJDIiwgMCkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGluc3RhbGwgTDJDIGVycm9yIGhhbmRsZXIiCiAJCSAgICAgICAiLCBjYWNoZSBpcyBub3QgZW5hYmxlZFxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYwppbmRleCAzNmJmODQ1Li5lMjNmMjNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3FlLmg+CiAKIHN0cnVjdCBxZV9ncGlvX2NoaXAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCBmYTU4OWIyLi4wNDY3NzUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCmluZGV4IDI1ZmJiZmEuLmZiYTAyNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2ltbWFwX3FlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYwppbmRleCBlMWQ2YTEzLi41MjRjMGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdXNiLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91c2IuYwppbmRleCA4MTA1NDYyLi45MTYyODI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91c2IuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91c2IuYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgogI2luY2x1ZGUgPGFzbS9xZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCmluZGV4IGMxODc5ZWIuLjlhZmJhOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3J0Y19jbW9zX3NldHVwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3Njb20uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2NvbS5jCmluZGV4IGIyNTkzY2UuLjQ5YTNlY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2NvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2NvbS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zY29tLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYwppbmRleCBiNmRlZmRhLi5mZjVlNzMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA5ZjUxZjk3Li4yMzcwZTFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9NYWtlZmlsZQppbmRleCBiNzVhNjA1Li5jNjA2YWE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogb2JqLSQoQ09ORklHX1BQQ19JQ1BfTkFUSVZFKQkrPSBpY3AtbmF0aXZlLm8KIG9iai0kKENPTkZJR19QUENfSUNQX0hWKQkrPSBpY3AtaHYubwogb2JqLSQoQ09ORklHX1BQQ19JQ1NfUlRBUykJKz0gaWNzLXJ0YXMubworb2JqLSQoQ09ORklHX1BQQ19QT1dFUk5WKQkrPSBpY3Mtb3BhbC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYwppbmRleCA1MGUzMmFmLi40Yzc5YjZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogI2VuZGlmCiB9OwogCi1pbnQgaWNwX25hdGl2ZV9pbml0KHZvaWQpCitpbnQgX19pbml0IGljcF9uYXRpdmVfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJdTMyIGluZHggPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcy1vcGFsLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNzLW9wYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcy1vcGFsLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBJQ1MgYmFja2VuZCBmb3IgT1BBTCBtYW5hZ2VkIGludGVycnVwdHMuCisgKgorICogQ29weXJpZ2h0IDIwMTEgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS94aWNzLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworc3RhdGljIGludCBpY3Nfb3BhbF9tYW5nbGVfc2VydmVyKGludCBzZXJ2ZXIpCit7CisJLyogTm8gbGluayBmb3Igbm93ICovCisJcmV0dXJuIHNlcnZlciA8PCAyOworfQorCitzdGF0aWMgaW50IGljc19vcGFsX3VubWFuZ2xlX3NlcnZlcihpbnQgc2VydmVyKQoreworCS8qIE5vIGxpbmsgZm9yIG5vdyAqLworCXJldHVybiBzZXJ2ZXIgPj4gMjsKK30KKworc3RhdGljIHZvaWQgaWNzX29wYWxfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpaXJxZF90b19od2lycShkKTsKKwlpbnQ2NF90IHJjOworCWludCBzZXJ2ZXI7CisKKwlwcl9kZXZlbCgiaWNzLWhhbDogdW5tYXNrIHZpcnEgJWQgW2h3IDB4JXhdXG4iLCBkLT5pcnEsIGh3X2lycSk7CisKKwlpZiAoaHdfaXJxID09IFhJQ1NfSVBJIHx8IGh3X2lycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKKwkJcmV0dXJuOworCisJc2VydmVyID0geGljc19nZXRfaXJxX3NlcnZlcihkLT5pcnEsIGQtPmFmZmluaXR5LCAwKTsKKwlzZXJ2ZXIgPSBpY3Nfb3BhbF9tYW5nbGVfc2VydmVyKHNlcnZlcik7CisKKwlyYyA9IG9wYWxfc2V0X3hpdmUoaHdfaXJxLCBzZXJ2ZXIsIERFRkFVTFRfUFJJT1JJVFkpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXByX2VycigiJXM6IG9wYWxfc2V0X3hpdmUoaXJxPSVkIFtodyAweCV4XSBzZXJ2ZXI9JXgpIgorCQkgICAgICAgIiBlcnJvciAlbGxkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGQtPmlycSwgaHdfaXJxLCBzZXJ2ZXIsIHJjKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpY3Nfb3BhbF9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCS8qCisJICogVGhlIGdlbmVyaWMgTVNJIGNvZGUgcmV0dXJucyB3aXRoIHRoZSBpbnRlcnJ1cHQgZGlzYWJsZWQgb24gdGhlCisJICogY2FyZCwgdXNpbmcgdGhlIE1TSSBtYXNrIGJpdHMuIEZpcm13YXJlIGRvZXNuJ3QgYXBwZWFyIHRvIHVubWFzaworCSAqIGF0IHRoYXQgbGV2ZWwsIHNvIHdlIGRvIGl0IGhlcmUgYnkgaGFuZC4KKwkgKi8KKwlpZiAoZC0+bXNpX2Rlc2MpCisJCXVubWFza19tc2lfaXJxKGQpOworI2VuZGlmCisKKwkvKiB1bm1hc2sgaXQgKi8KKwlpY3Nfb3BhbF91bm1hc2tfaXJxKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpY3Nfb3BhbF9tYXNrX3JlYWxfaXJxKHVuc2lnbmVkIGludCBod19pcnEpCit7CisJaW50IHNlcnZlciA9IGljc19vcGFsX21hbmdsZV9zZXJ2ZXIoeGljc19kZWZhdWx0X3NlcnZlcik7CisJaW50NjRfdCByYzsKKworCWlmIChod19pcnEgPT0gWElDU19JUEkpCisJCXJldHVybjsKKworCS8qIEhhdmUgdG8gc2V0IFhJVkUgdG8gMHhmZiB0byBiZSBhYmxlIHRvIHJlbW92ZSBhIHNsb3QgKi8KKwlyYyA9IG9wYWxfc2V0X3hpdmUoaHdfaXJxLCBzZXJ2ZXIsIDB4ZmYpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCisJCXByX2VycigiJXM6IG9wYWxfc2V0X3hpdmUoMHhmZikgaXJxPSV1IHJldHVybmVkICVsbGRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgaHdfaXJxLCByYyk7Cit9CisKK3N0YXRpYyB2b2lkIGljc19vcGFsX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOworCisJcHJfZGV2ZWwoImljcy1oYWw6IG1hc2sgdmlycSAlZCBbaHcgMHgleF1cbiIsIGQtPmlycSwgaHdfaXJxKTsKKworCWlmIChod19pcnEgPT0gWElDU19JUEkgfHwgaHdfaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQorCQlyZXR1cm47CisJaWNzX29wYWxfbWFza19yZWFsX2lycShod19pcnEpOworfQorCitzdGF0aWMgaW50IGljc19vcGFsX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmQsCisJCQkJIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrLAorCQkJCSBib29sIGZvcmNlKQoreworCXVuc2lnbmVkIGludCBod19pcnEgPSAodW5zaWduZWQgaW50KWlycWRfdG9faHdpcnEoZCk7CisJaW50MTZfdCBzZXJ2ZXI7CisJaW50OF90IHByaW9yaXR5OworCWludDY0X3QgcmM7CisJaW50IHdhbnRlZF9zZXJ2ZXI7CisKKwlpZiAoaHdfaXJxID09IFhJQ1NfSVBJIHx8IGh3X2lycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKKwkJcmV0dXJuIC0xOworCisJcmMgPSBvcGFsX2dldF94aXZlKGh3X2lycSwgJnNlcnZlciwgJnByaW9yaXR5KTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IG9wYWxfc2V0X3hpdmUoaXJxPSVkIFtodyAweCV4XSBzZXJ2ZXI9JXgpIgorCQkgICAgICAgIiBlcnJvciAlbGxkXG4iLAorCQkgICAgICAgX19mdW5jX18sIGQtPmlycSwgaHdfaXJxLCBzZXJ2ZXIsIHJjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdhbnRlZF9zZXJ2ZXIgPSB4aWNzX2dldF9pcnFfc2VydmVyKGQtPmlycSwgY3B1bWFzaywgMSk7CisJaWYgKHdhbnRlZF9zZXJ2ZXIgPCAwKSB7CisJCWNoYXIgY3B1bGlzdFsxMjhdOworCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOworCQlwcl93YXJuaW5nKCIlczogTm8gb25saW5lIGNwdXMgaW4gdGhlIG1hc2sgJXMgZm9yIGlycSAlZFxuIiwKKwkJCSAgIF9fZnVuY19fLCBjcHVsaXN0LCBkLT5pcnEpOworCQlyZXR1cm4gLTE7CisJfQorCXNlcnZlciA9IGljc19vcGFsX21hbmdsZV9zZXJ2ZXIod2FudGVkX3NlcnZlcik7CisKKwlwcl9kZXZlbCgiaWNzLWhhbDogc2V0LWFmZmluaXR5IGlycSAlZCBbaHcgMHgleF0gc2VydmVyOiAweCV4LzB4JXhcbiIsCisJCSBkLT5pcnEsIGh3X2lycSwgd2FudGVkX3NlcnZlciwgc2VydmVyKTsKKworCXJjID0gb3BhbF9zZXRfeGl2ZShod19pcnEsIHNlcnZlciwgcHJpb3JpdHkpOworCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogb3BhbF9zZXRfeGl2ZShpcnE9JWQgW2h3IDB4JXhdIHNlcnZlcj0leCkiCisJCSAgICAgICAiIGVycm9yICVsbGRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgZC0+aXJxLCBod19pcnEsIHNlcnZlciwgcmMpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGljc19vcGFsX2lycV9jaGlwID0geworCS5uYW1lID0gIk9QQUwgSUNTIiwKKwkuaXJxX3N0YXJ0dXAgPSBpY3Nfb3BhbF9zdGFydHVwLAorCS5pcnFfbWFzayA9IGljc19vcGFsX21hc2tfaXJxLAorCS5pcnFfdW5tYXNrID0gaWNzX29wYWxfdW5tYXNrX2lycSwKKwkuaXJxX2VvaSA9IE5VTEwsIC8qIFBhdGNoZWQgYXQgaW5pdCB0aW1lICovCisJLmlycV9zZXRfYWZmaW5pdHkgPSBpY3Nfb3BhbF9zZXRfYWZmaW5pdHkKK307CisKK3N0YXRpYyBpbnQgaWNzX29wYWxfbWFwKHN0cnVjdCBpY3MgKmljcywgdW5zaWduZWQgaW50IHZpcnEpOworc3RhdGljIHZvaWQgaWNzX29wYWxfbWFza191bmtub3duKHN0cnVjdCBpY3MgKmljcywgdW5zaWduZWQgbG9uZyB2ZWMpOworc3RhdGljIGxvbmcgaWNzX29wYWxfZ2V0X3NlcnZlcihzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGxvbmcgdmVjKTsKKworc3RhdGljIGludCBpY3Nfb3BhbF9ob3N0X21hdGNoKHN0cnVjdCBpY3MgKmljcywgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXJldHVybiAxOworfQorCisvKiBPbmx5IG9uZSBnbG9iYWwgJiBzdGF0ZSBzdHJ1Y3QgaWNzICovCitzdGF0aWMgc3RydWN0IGljcyBpY3NfaGFsID0geworCS5tYXAJCT0gaWNzX29wYWxfbWFwLAorCS5tYXNrX3Vua25vd24JPSBpY3Nfb3BhbF9tYXNrX3Vua25vd24sCisJLmdldF9zZXJ2ZXIJPSBpY3Nfb3BhbF9nZXRfc2VydmVyLAorCS5ob3N0X21hdGNoCT0gaWNzX29wYWxfaG9zdF9tYXRjaCwKK307CisKK3N0YXRpYyBpbnQgaWNzX29wYWxfbWFwKHN0cnVjdCBpY3MgKmljcywgdW5zaWduZWQgaW50IHZpcnEpCit7CisJdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpdmlycV90b19odyh2aXJxKTsKKwlpbnQ2NF90IHJjOworCWludDE2X3Qgc2VydmVyOworCWludDhfdCBwcmlvcml0eTsKKworCWlmIChXQVJOX09OKGh3X2lycSA9PSBYSUNTX0lQSSB8fCBod19pcnEgPT0gWElDU19JUlFfU1BVUklPVVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENoZWNrIGlmIEhBTCBrbm93cyBhYm91dCB0aGlzIGludGVycnVwdCAqLworCXJjID0gb3BhbF9nZXRfeGl2ZShod19pcnEsICZzZXJ2ZXIsICZwcmlvcml0eSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmaWNzX29wYWxfaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgJmljc19oYWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGljc19vcGFsX21hc2tfdW5rbm93bihzdHJ1Y3QgaWNzICppY3MsIHVuc2lnbmVkIGxvbmcgdmVjKQoreworCWludDY0X3QgcmM7CisJaW50MTZfdCBzZXJ2ZXI7CisJaW50OF90IHByaW9yaXR5OworCisJLyogQ2hlY2sgaWYgSEFMIGtub3dzIGFib3V0IHRoaXMgaW50ZXJydXB0ICovCisJcmMgPSBvcGFsX2dldF94aXZlKHZlYywgJnNlcnZlciwgJnByaW9yaXR5KTsKKwlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQorCQlyZXR1cm47CisKKwlpY3Nfb3BhbF9tYXNrX3JlYWxfaXJxKHZlYyk7Cit9CisKK3N0YXRpYyBsb25nIGljc19vcGFsX2dldF9zZXJ2ZXIoc3RydWN0IGljcyAqaWNzLCB1bnNpZ25lZCBsb25nIHZlYykKK3sKKwlpbnQ2NF90IHJjOworCWludDE2X3Qgc2VydmVyOworCWludDhfdCBwcmlvcml0eTsKKworCS8qIENoZWNrIGlmIEhBTCBrbm93cyBhYm91dCB0aGlzIGludGVycnVwdCAqLworCXJjID0gb3BhbF9nZXRfeGl2ZSh2ZWMsICZzZXJ2ZXIsICZwcmlvcml0eSk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcmV0dXJuIC0xOworCXJldHVybiBpY3Nfb3BhbF91bm1hbmdsZV9zZXJ2ZXIoc2VydmVyKTsKK30KKworaW50IF9faW5pdCBpY3Nfb3BhbF9pbml0KHZvaWQpCit7CisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFdlIG5lZWQgdG8gcGF0Y2ggb3VyIGlycSBjaGlwJ3MgRU9JIHRvIHBvaW50IHRvIHRoZQorCSAqIHJpZ2h0IElDUAorCSAqLworCWljc19vcGFsX2lycV9jaGlwLmlycV9lb2kgPSBpY3Bfb3BzLT5lb2k7CisKKwkvKiBSZWdpc3RlciBvdXJzZWx2ZXMgKi8KKwl4aWNzX3JlZ2lzdGVyX2ljcygmaWNzX2hhbCk7CisKKwlwcl9pbmZvKCJJQ1MgT1BBTCBiYWNrZW5kIHJlZ2lzdGVyZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MveGljcy1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCmluZGV4IDQ0NWM1YTAuLjYzNzYyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCkBAIC0xMzQsMTEgKzEzNCwxMCBAQAogCUJVR19PTihpcGkgPT0gTk9fSVJRKTsKIAogCS8qCi0JICogSVBJcyBhcmUgbWFya2VkIElSUUZfRElTQUJMRUQgYXMgdGhleSBtdXN0IHJ1biB3aXRoIGlycXMKLQkgKiBkaXNhYmxlZCwgYW5kIFBFUkNQVS4gIFRoZSBoYW5kbGVyIHdhcyBzZXQgaW4gbWFwLgorCSAqIElQSXMgYXJlIG1hcmtlZCBJUlFGX1BFUkNQVS4gVGhlIGhhbmRsZXIgd2FzIHNldCBpbiBtYXAuCiAJICovCiAJQlVHX09OKHJlcXVlc3RfaXJxKGlwaSwgaWNwX29wcy0+aXBpX2FjdGlvbiwKLQkJCSAgIElSUUZfRElTQUJMRUR8SVJRRl9QRVJDUFUsICJJUEkiLCBOVUxMKSk7CisJCQkgICBJUlFGX1BFUkNQVSwgIklQSSIsIE5VTEwpKTsKIH0KIAogaW50IF9faW5pdCB4aWNzX3NtcF9wcm9iZSh2b2lkKQpAQCAtNDA5LDE0ICs0MDgsMTAgQEAKIAlpbnQgcmMgPSAtMTsKIAogCS8qIEZpc3QgbG9jYXRlIElDUCAqLwotI2lmZGVmIENPTkZJR19QUENfSUNQX0hWCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCiAJCXJjID0gaWNwX2h2X2luaXQoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUENfSUNQX05BVElWRQogCWlmIChyYyA8IDApCiAJCXJjID0gaWNwX25hdGl2ZV9pbml0KCk7Ci0jZW5kaWYKIAlpZiAocmMgPCAwKSB7CiAJCXByX3dhcm5pbmcoIlhJQ1M6IENhbm5vdCBmaW5kIGEgUHJlc2VudGF0aW9uIENvbnRyb2xsZXIgIVxuIik7CiAJCXJldHVybjsKQEAgLTQyOSw5ICs0MjQsOSBAQAogCXhpY3NfaXBpX2NoaXAuaXJxX2VvaSA9IGljcF9vcHMtPmVvaTsKIAogCS8qIE5vdyBsb2NhdGUgSUNTICovCi0jaWZkZWYgQ09ORklHX1BQQ19JQ1NfUlRBUwogCXJjID0gaWNzX3J0YXNfaW5pdCgpOwotI2VuZGlmCisJaWYgKHJjIDwgMCkKKwkJcmMgPSBpY3Nfb3BhbF9pbml0KCk7CiAJaWYgKHJjIDwgMCkKIAkJcHJfd2FybmluZygiWElDUzogQ2Fubm90IGZpbmQgYSBTb3VyY2UgQ29udHJvbGxlciAhXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IDQyNTQxYmIuLjAzYTIxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC0zNDAsOCArMzQwLDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgdW5yZWNvdmVyYWJsZV9leGNwKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmZGVmIENPTkZJR180eHgKLQkvKiBXZSBoYXZlIG5vIE1TUl9SSSBiaXQgb24gNHh4LCBzbyB3ZSBzaW1wbHkgcmV0dXJuIGZhbHNlICovCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19CT09LM0UpCisJLyogV2UgaGF2ZSBubyBNU1JfUkkgYml0IG9uIDR4eCBvciBCb29rM2UsIHNvIHdlIHNpbXBseSByZXR1cm4gZmFsc2UgKi8KIAlyZXR1cm4gMDsKICNlbHNlCiAJcmV0dXJuICgocmVncy0+bXNyICYgTVNSX1JJKSA9PSAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggNmI5OWZjMy4uYTlmYmQ0MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTU2OSw2ICs1NjksMTYgQEAKIAkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CiAJICBidXQgaXMgaW5kZXBlbmRlbnQgb2YgaGFyZHdhcmUvbWljcm9jb2RlIHN1cHBvcnQuCiAKK2NvbmZpZyBDUkFTSF9EVU1QCisJYm9vbCAia2VybmVsIGNyYXNoIGR1bXBzIgorCWRlcGVuZHMgb24gNjRCSVQKKwloZWxwCisJICBHZW5lcmF0ZSBjcmFzaCBkdW1wIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgYnkga2V4ZWMuCisJICBDcmFzaCBkdW1wIGtlcm5lbHMgYXJlIGxvYWRlZCBpbiB0aGUgbWFpbiBrZXJuZWwgd2l0aCBrZXhlYy10b29scworCSAgaW50byBhIHNwZWNpYWxseSByZXNlcnZlZCByZWdpb24gYW5kIHRoZW4gbGF0ZXIgZXhlY3V0ZWQgYWZ0ZXIKKwkgIGEgY3Jhc2ggYnkga2R1bXAva2V4ZWMuCisJICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAorCiBjb25maWcgWkZDUERVTVAKIAlkZWZfYm9vbCBuCiAJcHJvbXB0ICJ6ZmNwZHVtcCBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCAwMjhmMjNlLi40NjVlY2E3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtNjEsNyArNjEsNyBAQAogCiBleHRlcm4gX3NjbHBfcHJpbnRfZWFybHkoY29uc3QgY2hhciAqKTsKIAotaW50IHB1dHMoY29uc3QgY2hhciAqcykKK3N0YXRpYyBpbnQgcHV0cyhjb25zdCBjaGFyICpzKQogewogCV9zY2xwX3ByaW50X2Vhcmx5KHMpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGFfY29tbW9uLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYwppbmRleCA0ODg4NGY4Li5iZDM3ZDA5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInNoYS5oIgogI2luY2x1ZGUgImNyeXB0X3MzOTAuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9kZWZjb25maWcKaW5kZXggMjljODJjNi4uNmNmOGUyNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvZGVmY29uZmlnCkBAIC02OCw3ICs2OCw3IEBACiBDT05GSUdfTkVUX0NMU19BQ1Q9eQogQ09ORklHX05FVF9BQ1RfUE9MSUNFPXkKIENPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCi0jIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT15CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCmluZGV4IDZmZTg3NGYuLjQ4MWY0ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCkBAIC0xMDgsOSArMTA4LDcgQEAKIAkJcmV0LT5pX2dpZCA9IGh5cGZzX2luZm8tPmdpZDsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpZiAobW9kZSAmIFNfSUZESVIpCi0JCQlyZXQtPmlfbmxpbmsgPSAyOwotCQllbHNlCi0JCQlyZXQtPmlfbmxpbmsgPSAxOworCQkJc2V0X25saW5rKHJldCwgMik7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0zNjEsNyArMzU5LDcgQEAKIAl9IGVsc2UgaWYgKG1vZGUgJiBTX0lGRElSKSB7CiAJCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKLQkJcGFyZW50LT5kX2lub2RlLT5pX25saW5rKys7CisJCWluY19ubGluayhwYXJlbnQtPmRfaW5vZGUpOwogCX0gZWxzZQogCQlCVUcoKTsKIAlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jY3dkZXYuaAppbmRleCA2MjNmMmZiLi45MzgxYzkyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2N3ZGV2LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Njd2Rldi5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2ZjeC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogLyogc3RydWN0cyBmcm9tIGFzbS9jaW8uaCAqLwogc3RydWN0IGlyYjsKQEAgLTEyNyw2ICsxMjgsNyBAQAogICogQHJlc3RvcmU6IGNhbGxiYWNrIGZvciByZXN0b3JpbmcgYWZ0ZXIgaGliZXJuYXRpb24KICAqIEB1Y19oYW5kbGVyOiBjYWxsYmFjayBmb3IgdW5pdCBjaGVjayBoYW5kbGVyCiAgKiBAZHJpdmVyOiBlbWJlZGRlZCBkZXZpY2UgZHJpdmVyIHN0cnVjdHVyZQorICogQGludF9jbGFzczogaW50ZXJydXB0aW9uIGNsYXNzIHRvIHVzZSBmb3IgYWNjb3VudGluZyBpbnRlcnJ1cHRzCiAgKi8KIHN0cnVjdCBjY3dfZHJpdmVyIHsKIAlzdHJ1Y3QgY2N3X2RldmljZV9pZCAqaWRzOwpAQCAtMTQ0LDYgKzE0Niw3IEBACiAJaW50ICgqcmVzdG9yZSkoc3RydWN0IGNjd19kZXZpY2UgKik7CiAJZW51bSB1Y190b2RvICgqdWNfaGFuZGxlcikgKHN0cnVjdCBjY3dfZGV2aWNlICosIHN0cnVjdCBpcmIgKik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCWVudW0gaW50ZXJydXB0aW9uX2NsYXNzIGludF9jbGFzczsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgY2N3X2RldmljZSAqZ2V0X2Njd2Rldl9ieV9idXNpZChzdHJ1Y3QgY2N3X2RyaXZlciAqY2RydiwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCBkYTM1OWNhLi4yZTQ5NzQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTIsNiArMTIsNyBAQAogI2RlZmluZSBQU1czMl9NQVNLX0lPCQkweDAyMDAwMDAwVUwKICNkZWZpbmUgUFNXMzJfTUFTS19FWFQJCTB4MDEwMDAwMDBVTAogI2RlZmluZSBQU1czMl9NQVNLX0tFWQkJMHgwMEYwMDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfQkFTRQkJMHgwMDA4MDAwMFVMCS8qIEFsd2F5cyBvbmUgKi8KICNkZWZpbmUgUFNXMzJfTUFTS19NQ0hFQ0sJMHgwMDA0MDAwMFVMCiAjZGVmaW5lIFBTVzMyX01BU0tfV0FJVAkJMHgwMDAyMDAwMFVMCiAjZGVmaW5lIFBTVzMyX01BU0tfUFNUQVRFCTB4MDAwMTAwMDBVTApAQCAtMTksMjEgKzIwLDE5IEBACiAjZGVmaW5lIFBTVzMyX01BU0tfQ0MJCTB4MDAwMDMwMDBVTAogI2RlZmluZSBQU1czMl9NQVNLX1BNCQkweDAwMDAwZjAwVUwKIAotI2RlZmluZSBQU1czMl9BRERSX0FNT0RFMzEJMHg4MDAwMDAwMFVMCisjZGVmaW5lIFBTVzMyX01BU0tfVVNFUgkJMHgwMDAwM0YwMFVMCisKKyNkZWZpbmUgUFNXMzJfQUREUl9BTU9ERQkweDgwMDAwMDAwVUwKICNkZWZpbmUgUFNXMzJfQUREUl9JTlNOCQkweDdGRkZGRkZGVUwKIAotI2RlZmluZSBQU1czMl9CQVNFX0JJVFMJCTB4MDAwODAwMDBVTAorI2RlZmluZSBQU1czMl9ERUZBVUxUX0tFWQkoKCh1MzIpIFBBR0VfREVGQVVMVF9BQ0MpIDw8IDIwKQogCiAjZGVmaW5lIFBTVzMyX0FTQ19QUklNQVJZCTB4MDAwMDAwMDBVTAogI2RlZmluZSBQU1czMl9BU0NfQUNDUkVHCTB4MDAwMDQwMDBVTAogI2RlZmluZSBQU1czMl9BU0NfU0VDT05EQVJZCTB4MDAwMDgwMDBVTAogI2RlZmluZSBQU1czMl9BU0NfSE9NRQkJMHgwMDAwQzAwMFVMCiAKLSNkZWZpbmUgUFNXMzJfTUFTS19NRVJHRShDVVJSRU5ULE5FVykgXAotCSgoKENVUlJFTlQpICYgfihQU1czMl9NQVNLX0NDfFBTVzMyX01BU0tfUE0pKSB8IFwKLQkgKChORVcpICYgKFBTVzMyX01BU0tfQ0N8UFNXMzJfTUFTS19QTSkpKQotCi1leHRlcm4gbG9uZyBwc3czMl91c2VyX2JpdHM7CitleHRlcm4gdTMyIHBzdzMyX3VzZXJfYml0czsKIAogI2RlZmluZSBDT01QQVRfVVNFUl9IWgkJMTAwCiAjZGVmaW5lIENPTVBBVF9VVFNfTUFDSElORQkiczM5MFwwXDBcMFwwIgpAQCAtMTMxLDcgKzEzMCw4IEBACiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJczMyCQlmX25hbWVsZW47CiAJczMyCQlmX2Zyc2l6ZTsKLQlzMzIJCWZfc3BhcmVbNl07CisJczMyCQlmX2ZsYWdzOworCXMzMgkJZl9zcGFyZVs1XTsKIH07CiAKICNkZWZpbmUgQ09NUEFUX1JMSU1fT0xEX0lORklOSVRZCTB4N2ZmZmZmZmYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaAppbmRleCA5N2NjNDQwLi42OTQwYWJmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oCkBAIC0xNjgsNSArMTY4LDYgQEAKIAogZXh0ZXJuIGludCBkaWFnMzA4KHVuc2lnbmVkIGxvbmcgc3ViY29kZSwgdm9pZCAqYWRkcik7CiBleHRlcm4gdm9pZCBkaWFnMzA4X3Jlc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgc3RvcmVfc3RhdHVzKHZvaWQpOwogCiAjZW5kaWYgLyogX0FTTV9TMzkwX0lQTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggYmE3YjAxYy4uYmE2ZDg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaApAQCAtOCw3ICs4LDggQEAKIAlFWFRFUk5BTF9JTlRFUlJVUFQsCiAJSU9fSU5URVJSVVBULAogCUVYVElOVF9DTEssCi0JRVhUSU5UX0lQSSwKKwlFWFRJTlRfRVhDLAorCUVYVElOVF9FTVMsCiAJRVhUSU5UX1RNUiwKIAlFWFRJTlRfVExBLAogCUVYVElOVF9QRkwsCkBAIC0xNyw4ICsxOCw4IEBACiAJRVhUSU5UX1NDUCwKIAlFWFRJTlRfSVVDLAogCUVYVElOVF9DUE0sCisJSU9JTlRfQ0lPLAogCUlPSU5UX1FBSSwKLQlJT0lOVF9RREksCiAJSU9JTlRfREFTLAogCUlPSU5UX0MxNSwKIAlJT0lOVF9DNzAsCkBAIC0yOCw2ICsyOSw3IEBACiAJSU9JTlRfQ0xXLAogCUlPSU5UX0NUQywKIAlJT0lOVF9BUEIsCisJSU9JTlRfQ1NDLAogCU5NSV9OTUksCiAJTlJfSVJRUywKIH07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va2V4ZWMuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rZXhlYy5oCmluZGV4IGJiNzI5YjguLmNmNGU0N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rZXhlYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rZXhlYy5oCkBAIC0zMCw5ICszMCwxNSBAQAogLyogTm90IG1vcmUgdGhhbiAyR0IgKi8KICNkZWZpbmUgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgKDFVTDw8MzEpCiAKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gdXNlIGZvciB0aGUgY3Jhc2ggY29udHJvbCBwYWdlcyAqLworI2RlZmluZSBLRVhFQ19DUkFTSF9DT05UUk9MX01FTU9SWV9MSU1JVCAoLTFVTCkKKwogLyogQWxsb2NhdGUgb25lIHBhZ2UgZm9yIHRoZSBwZHAgYW5kIHRoZSBzZWNvbmQgZm9yIHRoZSBjb2RlICovCiAjZGVmaW5lIEtFWEVDX0NPTlRST0xfUEFHRV9TSVpFIDQwOTYKIAorLyogQWxpZ25tZW50IG9mIGNyYXNoa2VybmVsIG1lbW9yeSAqLworI2RlZmluZSBLRVhFQ19DUkFTSF9NRU1fQUxJR04gSFBBR0VfU0laRQorCiAvKiBUaGUgbmF0aXZlIGFyY2hpdGVjdHVyZSAqLwogI2RlZmluZSBLRVhFQ19BUkNIIEtFWEVDX0FSQ0hfUzM5MAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDAwZmYwMGQuLjI0ZTE4NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xMTksNiArMTE5LDcgQEAKIAl1MzIgaW5zdHJ1Y3Rpb25fbGN0bGc7CiAJdTMyIGV4aXRfcHJvZ3JhbV9pbnRlcnJ1cHRpb247CiAJdTMyIGV4aXRfaW5zdHJfYW5kX3Byb2dyYW07CisJdTMyIGRlbGl2ZXJfZXh0ZXJuYWxfY2FsbDsKIAl1MzIgZGVsaXZlcl9lbWVyZ2VuY3lfc2lnbmFsOwogCXUzMiBkZWxpdmVyX3NlcnZpY2Vfc2lnbmFsOwogCXUzMiBkZWxpdmVyX3ZpcnRpb19pbnRlcnJ1cHQ7CkBAIC0xMzgsMTEgKzEzOSwxMyBAQAogCXUzMiBpbnN0cnVjdGlvbl9zdGZsOwogCXUzMiBpbnN0cnVjdGlvbl90cHJvdDsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZTsKKwl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9leHRlcm5hbF9jYWxsOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeTsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zdG9wOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2FyY2g7CiAJdTMyIGluc3RydWN0aW9uX3NpZ3BfcHJlZml4OwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3Jlc3RhcnQ7CisJdTMyIGRpYWdub3NlXzEwOwogCXUzMiBkaWFnbm9zZV80NDsKIH07CiAKQEAgLTE3NCw2ICsxNzcsMTAgQEAKIAlfX3UzMiBhZGRyZXNzOwogfTsKIAorc3RydWN0IGt2bV9zMzkwX2V4dGNhbGxfaW5mbyB7CisJX191MTYgY29kZTsKK307CisKIHN0cnVjdCBrdm1fczM5MF9lbWVyZ19pbmZvIHsKIAlfX3UxNiBjb2RlOwogfTsKQEAgLTE4Niw2ICsxOTMsNyBAQAogCQlzdHJ1Y3Qga3ZtX3MzOTBfZXh0X2luZm8gZXh0OwogCQlzdHJ1Y3Qga3ZtX3MzOTBfcGdtX2luZm8gcGdtOwogCQlzdHJ1Y3Qga3ZtX3MzOTBfZW1lcmdfaW5mbyBlbWVyZzsKKwkJc3RydWN0IGt2bV9zMzkwX2V4dGNhbGxfaW5mbyBleHRjYWxsOwogCQlzdHJ1Y3Qga3ZtX3MzOTBfcHJlZml4X2luZm8gcHJlZml4OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKaW5kZXggZTg1YzkxMS4uOWUxM2M3ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCkBAIC0xNTEsMTAgKzE1MSw4IEBACiAJICovCiAJX191MzIJaXBpYjsJCQkJLyogMHgwZTAwICovCiAJX191MzIJaXBpYl9jaGVja3N1bTsJCQkvKiAweDBlMDQgKi8KLQotCS8qIDY0IGJpdCBzYXZlIGFyZWEgKi8KLQlfX3U2NAlzYXZlX2FyZWFfNjQ7CQkJLyogMHgwZTA4ICovCi0JX191OAlwYWRfMHgwZTEwWzB4MGYwMC0weDBlMTBdOwkvKiAweDBlMTAgKi8KKwlfX3UzMgl2bWNvcmVfaW5mbzsJCQkvKiAweDBlMDggKi8KKwlfX3U4CXBhZF8weDBlMGNbMHgwZjAwLTB4MGUwY107CS8qIDB4MGUwYyAqLwogCiAJLyogRXh0ZW5kZWQgZmFjaWxpdHkgbGlzdCAqLwogCV9fdTY0CXN0ZmxlX2ZhY19saXN0WzMyXTsJCS8qIDB4MGYwMCAqLwpAQCAtMjkwLDkgKzI4OCw3IEBACiAJICovCiAJX191NjQJaXBpYjsJCQkJLyogMHgwZTAwICovCiAJX191MzIJaXBpYl9jaGVja3N1bTsJCQkvKiAweDBlMDggKi8KLQotCS8qIDY0IGJpdCBzYXZlIGFyZWEgKi8KLQlfX3U2NAlzYXZlX2FyZWFfNjQ7CQkJLyogMHgwZTBjICovCisJX191NjQJdm1jb3JlX2luZm87CQkJLyogMHgwZTBjICovCiAJX191OAlwYWRfMHgwZTE0WzB4MGYwMC0weDBlMTRdOwkvKiAweDBlMTQgKi8KIAogCS8qIEV4dGVuZGVkIGZhY2lsaXR5IGxpc3QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IGFjY2IzNzIuLmY3ZWM1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTc3LDYgKzE3Nyw3IEBACiBzdHJ1Y3QgcGFnZTsKIHZvaWQgYXJjaF9mcmVlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcik7CiB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTsKK3ZvaWQgYXJjaF9zZXRfcGFnZV9zdGF0ZXMoaW50IG1ha2Vfc3RhYmxlKTsKIAogc3RhdGljIGlubGluZSBpbnQgZGV2bWVtX2lzX2FsbG93ZWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBjMGNiNzk0Li4zNGVkZTBlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTY5Niw3ICs2OTYsOSBAQAogaW50IGdtYXBfbWFwX3NlZ21lbnQoc3RydWN0IGdtYXAgKmdtYXAsIHVuc2lnbmVkIGxvbmcgZnJvbSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIGxlbmd0aCk7CiBpbnQgZ21hcF91bm1hcF9zZWdtZW50KHN0cnVjdCBnbWFwICpnbWFwLCB1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIGxlbik7Cit1bnNpZ25lZCBsb25nIF9fZ21hcF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICopOwogdW5zaWduZWQgbG9uZyBnbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKik7Cit2b2lkIGdtYXBfZGlzY2FyZCh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgdG8sIHN0cnVjdCBnbWFwICopOwogCiAvKgogICogQ2VydGFpbiBhcmNoaXRlY3R1cmVzIG5lZWQgdG8gZG8gc3BlY2lhbCB0aGluZ3Mgd2hlbiBQVEVzCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYTRiNjIyOS4uNWYzM2QzNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMzMsNiArMzMsOCBAQAogCiBleHRlcm4gdm9pZCBzMzkwX2FkanVzdF9qaWZmaWVzKHZvaWQpOwogZXh0ZXJuIGludCBnZXRfY3B1X2NhcGFiaWxpdHkodW5zaWduZWQgaW50ICopOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wOworZXh0ZXJuIGludCBzeXNjdGxfaWVlZV9lbXVsYXRpb25fd2FybmluZ3M7CiAKIC8qCiAgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMkdCIGZvciAzMSBiaXQsIDRUQiBvciA4UFQgZm9yIDY0IGJpdC4KQEAgLTExOCwxNyArMTIwLDE3IEBACiAvKgogICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3IHRocmVhZC4KICAqLwotI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BzdywgbmV3X3N0YWNrcCkgZG8gewkJXAotCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXJfYml0czsJCQlcCi0JcmVncy0+cHN3LmFkZHIJPSBuZXdfcHN3IHwgUFNXX0FERFJfQU1PREU7CQlcCi0JcmVncy0+Z3Byc1sxNV0JPSBuZXdfc3RhY2twOwkJCQlcCisjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQkJXAorCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXJfYml0cyB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CVwKKwlyZWdzLT5wc3cuYWRkcgk9IG5ld19wc3cgfCBQU1dfQUREUl9BTU9ERTsJCQlcCisJcmVncy0+Z3Byc1sxNV0JPSBuZXdfc3RhY2twOwkJCQkJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBzdGFydF90aHJlYWQzMShyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQlcCi0JcmVncy0+cHN3Lm1hc2sJPSBwc3dfdXNlcjMyX2JpdHM7CQkJXAotCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJXAotCXJlZ3MtPmdwcnNbMTVdCT0gbmV3X3N0YWNrcDsJCQkJXAotCWNyc3RfdGFibGVfZG93bmdyYWRlKGN1cnJlbnQtPm1tLCAxVUwgPDwgMzEpOwkJXAorI2RlZmluZSBzdGFydF90aHJlYWQzMShyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQkJXAorCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXJfYml0cyB8IFBTV19NQVNLX0JBOwkJCVwKKwlyZWdzLT5wc3cuYWRkcgk9IG5ld19wc3cgfCBQU1dfQUREUl9BTU9ERTsJCQlcCisJcmVncy0+Z3Byc1sxNV0JPSBuZXdfc3RhY2twOwkJCQkJXAorCWNyc3RfdGFibGVfZG93bmdyYWRlKGN1cnJlbnQtPm1tLCAxVUwgPDwgMzEpOwkJCVwKIH0gd2hpbGUgKDApCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24sIGEgc3RyYW5nZSBDIHRoaW5nICovCkBAIC0xODcsNyArMTg5LDYgQEAKICAqIFNldCBQU1cgbWFzayB0byBzcGVjaWZpZWQgdmFsdWUsIHdoaWxlIGxlYXZpbmcgdGhlCiAgKiBQU1cgYWRkciBwb2ludGluZyB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KICAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgX19sb2FkX3Bzd19tYXNrICh1bnNpZ25lZCBsb25nIG1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtMjEyLDI2ICsyMTMsMzcgQEAKIAkJOiAiPSZkIiAoYWRkciksICI9USIgKHBzdykgOiAiUSIgKHBzdykgOiAibWVtb3J5IiwgImNjIik7CiAjZW5kaWYgLyogX19zMzkweF9fICovCiB9Ci0gCi0vKgotICogRnVuY3Rpb24gdG8gc3RvcCBhIHByb2Nlc3NvciB1bnRpbCBhbiBpbnRlcnJ1cHRpb24gb2NjdXJyZWQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZWRfd2FpdCh2b2lkKQotewotCV9fbG9hZF9wc3dfbWFzayhQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfAotCQkJUFNXX01BU0tfTUNIRUNLIHwgUFNXX01BU0tfV0FJVCB8IFBTV19ERUZBVUxUX0tFWSk7Ci19CiAKIC8qCisgKiBSZXdpbmQgUFNXIGluc3RydWN0aW9uIGFkZHJlc3MgYnkgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmV3aW5kX3Bzdyhwc3dfdCBwc3csIHVuc2lnbmVkIGxvbmcgaWxjKQoreworI2lmbmRlZiBfX3MzOTB4X18KKwlpZiAocHN3LmFkZHIgJiBQU1dfQUREUl9BTU9ERSkKKwkJLyogMzEgYml0IG1vZGUgKi8KKwkJcmV0dXJuIChwc3cuYWRkciAtIGlsYykgfCBQU1dfQUREUl9BTU9ERTsKKwkvKiAyNCBiaXQgbW9kZSAqLworCXJldHVybiAocHN3LmFkZHIgLSBpbGMpICYgKCgxVUwgPDwgMjQpIC0gMSk7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCW1hc2sgPSAocHN3Lm1hc2sgJiBQU1dfTUFTS19FQSkgPyAtMVVMIDoKKwkgICAgICAgKHBzdy5tYXNrICYgUFNXX01BU0tfQkEpID8gKDFVTCA8PCAzMSkgLSAxIDoKKwkJCQkJICAoMVVMIDw8IDI0KSAtIDE7CisJcmV0dXJuIChwc3cuYWRkciAtIGlsYykgJiBtYXNrOworI2VuZGlmCit9CisgCisvKgogICogRnVuY3Rpb24gdG8gZHJvcCBhIHByb2Nlc3NvciBpbnRvIGRpc2FibGVkIHdhaXQgc3RhdGUKICAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgQVRUUklCX05PUkVUIGRpc2FibGVkX3dhaXQodW5zaWduZWQgbG9uZyBjb2RlKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIGN0bF9idWY7CiAgICAgICAgIHBzd190IGR3X3BzdzsKIAotICAgICAgICBkd19wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19XQUlUOworCWR3X3Bzdy5tYXNrID0gUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX1dBSVQgfCBQU1dfTUFTS19CQSB8IFBTV19NQVNLX0VBOwogICAgICAgICBkd19wc3cuYWRkciA9IGNvZGU7CiAgICAgICAgIC8qIAogICAgICAgICAgKiBTdG9yZSBzdGF0dXMgYW5kIHRoZW4gbG9hZCBkaXNhYmxlZCB3YWl0IHBzdywKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCA2MmZkODBjLi5hNjU4NDYzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0yMzAsMTcgKzIzMCwyMSBAQAogI2RlZmluZSBQU1dfTUFTS19JTwkJMHgwMjAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0VYVAkJMHgwMTAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0tFWQkJMHgwMEYwMDAwMFVMCisjZGVmaW5lIFBTV19NQVNLX0JBU0UJCTB4MDAwODAwMDBVTAkvKiBhbHdheXMgb25lICovCiAjZGVmaW5lIFBTV19NQVNLX01DSEVDSwkJMHgwMDA0MDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX1dBSVQJCTB4MDAwMjAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19QU1RBVEUJCTB4MDAwMTAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19BU0MJCTB4MDAwMEMwMDBVTAogI2RlZmluZSBQU1dfTUFTS19DQwkJMHgwMDAwMzAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX1BNCQkweDAwMDAwRjAwVUwKKyNkZWZpbmUgUFNXX01BU0tfRUEJCTB4MDAwMDAwMDBVTAorI2RlZmluZSBQU1dfTUFTS19CQQkJMHgwMDAwMDAwMFVMCisKKyNkZWZpbmUgUFNXX01BU0tfVVNFUgkJMHgwMDAwM0YwMFVMCiAKICNkZWZpbmUgUFNXX0FERFJfQU1PREUJCTB4ODAwMDAwMDBVTAogI2RlZmluZSBQU1dfQUREUl9JTlNOCQkweDdGRkZGRkZGVUwKIAotI2RlZmluZSBQU1dfQkFTRV9CSVRTCQkweDAwMDgwMDAwVUwKICNkZWZpbmUgUFNXX0RFRkFVTFRfS0VZCQkoKCh1bnNpZ25lZCBsb25nKSBQQUdFX0RFRkFVTFRfQUNDKSA8PCAyMCkKIAogI2RlZmluZSBQU1dfQVNDX1BSSU1BUlkJCTB4MDAwMDAwMDBVTApAQCAtMjU0LDYgKzI1OCw3IEBACiAjZGVmaW5lIFBTV19NQVNLX0RBVAkJMHgwNDAwMDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfSU8JCTB4MDIwMDAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0VYVAkJMHgwMTAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUFNXX01BU0tfQkFTRQkJMHgwMDAwMDAwMDAwMDAwMDAwVUwKICNkZWZpbmUgUFNXX01BU0tfS0VZCQkweDAwRjAwMDAwMDAwMDAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19NQ0hFQ0sJCTB4MDAwNDAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX1dBSVQJCTB4MDAwMjAwMDAwMDAwMDAwMFVMCkBAIC0yNjEsMTIgKzI2NiwxNCBAQAogI2RlZmluZSBQU1dfTUFTS19BU0MJCTB4MDAwMEMwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19NQVNLX0NDCQkweDAwMDAzMDAwMDAwMDAwMDBVTAogI2RlZmluZSBQU1dfTUFTS19QTQkJMHgwMDAwMEYwMDAwMDAwMDAwVUwKKyNkZWZpbmUgUFNXX01BU0tfRUEJCTB4MDAwMDAwMDEwMDAwMDAwMFVMCisjZGVmaW5lIFBTV19NQVNLX0JBCQkweDAwMDAwMDAwODAwMDAwMDBVTAorCisjZGVmaW5lIFBTV19NQVNLX1VTRVIJCTB4MDAwMDNGMDE4MDAwMDAwMFVMCiAKICNkZWZpbmUgUFNXX0FERFJfQU1PREUJCTB4MDAwMDAwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19BRERSX0lOU04JCTB4RkZGRkZGRkZGRkZGRkZGRlVMCiAKLSNkZWZpbmUgUFNXX0JBU0VfQklUUwkJMHgwMDAwMDAwMTgwMDAwMDAwVUwKLSNkZWZpbmUgUFNXX0JBU0UzMl9CSVRTCQkweDAwMDAwMDAwODAwMDAwMDBVTAogI2RlZmluZSBQU1dfREVGQVVMVF9LRVkJCSgoKHVuc2lnbmVkIGxvbmcpIFBBR0VfREVGQVVMVF9BQ0MpIDw8IDUyKQogCiAjZGVmaW5lIFBTV19BU0NfUFJJTUFSWQkJMHgwMDAwMDAwMDAwMDAwMDAwVUwKQEAgLTI3OSwxOCArMjg2LDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiBleHRlcm4gbG9uZyBwc3dfa2VybmVsX2JpdHM7CiBleHRlcm4gbG9uZyBwc3dfdXNlcl9iaXRzOwotI2lmZGVmIENPTkZJR182NEJJVAotZXh0ZXJuIGxvbmcgcHN3X3VzZXIzMl9iaXRzOwogI2VuZGlmCi0jZW5kaWYKLQotLyogVGhpcyBtYWNybyBtZXJnZXMgYSBORVcgUFNXIG1hc2sgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGludG8KLSAgIHRoZSBjdXJyZW50bHkgYWN0aXZlIFBTVyBtYXNrIENVUlJFTlQsIG1vZGlmeWluZyBvbmx5IHRob3NlCi0gICBiaXRzIGluIENVUlJFTlQgdGhhdCB0aGUgdXNlciBtYXkgYmUgYWxsb3dlZCB0byBjaGFuZ2U6IHRoaXMKLSAgIGlzIHRoZSBjb25kaXRpb24gY29kZSBhbmQgdGhlIHByb2dyYW0gbWFzayBiaXRzLiAgKi8KLSNkZWZpbmUgUFNXX01BU0tfTUVSR0UoQ1VSUkVOVCxORVcpIFwKLQkoKChDVVJSRU5UKSAmIH4oUFNXX01BU0tfQ0N8UFNXX01BU0tfUE0pKSB8IFwKLQkgKChORVcpICYgKFBTV19NQVNLX0NDfFBTV19NQVNLX1BNKSkpCiAKIC8qCiAgKiBUaGUgczM5MF9yZWdzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgZWxmX2dyZWdzZXRfdC4KQEAgLTMyOCw4ICszMjQsNyBAQAogCXBzd190IHBzdzsKIAl1bnNpZ25lZCBsb25nIGdwcnNbTlVNX0dQUlNdOwogCXVuc2lnbmVkIGxvbmcgb3JpZ19ncHIyOwotCXVuc2lnbmVkIHNob3J0IGlsYzsKLQl1bnNpZ25lZCBzaG9ydCBzdmNucjsKKwl1bnNpZ25lZCBpbnQgc3ZjX2NvZGU7CiB9OwogCiAvKgpAQCAtNDg3LDYgKzQ4Miw4IEBACiAjZGVmaW5lIFBUUkFDRV9QT0tFVEVYVF9BUkVBCSAgICAgIDB4NTAwNAogI2RlZmluZSBQVFJBQ0VfUE9LRURBVEFfQVJFQSAJICAgICAgMHg1MDA1CiAjZGVmaW5lIFBUUkFDRV9HRVRfTEFTVF9CUkVBSwkgICAgICAweDUwMDYKKyNkZWZpbmUgUFRSQUNFX1BFRUtfU1lTVEVNX0NBTEwgICAgICAgMHg1MDA3CisjZGVmaW5lIFBUUkFDRV9QT0tFX1NZU1RFTV9DQUxMCSAgICAgIDB4NTAwOAogCiAvKgogICogUFRfUFJPVCBkZWZpbml0aW9uIGlzIGxvb3NlbHkgYmFzZWQgb24gaHBwYSBic2QgZGVmaW5pdGlvbiBpbgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKaW5kZXggMjE5OTM2Mi4uZTYzZDEzZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCkBAIC00Niw2ICs0Niw4IEBACiAJdTMyCSA6IDE2OwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKyNkZWZpbmUgUURSX0FDX01VTFRJX0JVRkZFUl9FTkFCTEUgMHgwMQorCiAvKioKICAqIHN0cnVjdCBxZHIgLSBxdWV1ZSBkZXNjcmlwdGlvbiByZWNvcmQgKFFEUikKICAqIEBxZm10OiBxdWV1ZSBmb3JtYXQKQEAgLTI1Niw2ICsyNTgsOCBAQAogCXU4IHZhbFtRRElPX01BWF9CVUZGRVJTX1BFUl9RXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCgyNTYpKSk7CiAKKyNkZWZpbmUgQ0hTQ19BQzJfTVVMVElfQlVGRkVSX0FWQUlMQUJMRQkweDAwODAKKyNkZWZpbmUgQ0hTQ19BQzJfTVVMVElfQlVGRkVSX0VOQUJMRUQJMHgwMDQwCiAjZGVmaW5lIENIU0NfQUMyX0RBVEFfRElWX0FWQUlMQUJMRQkweDAwMTAKICNkZWZpbmUgQ0hTQ19BQzJfREFUQV9ESVZfRU5BQkxFRAkweDAwMDIKIApAQCAtMzU3LDYgKzM2MSw3IEBACiBzdHJ1Y3QgcWRpb19pbml0aWFsaXplIHsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAl1bnNpZ25lZCBjaGFyIHFfZm9ybWF0OworCXVuc2lnbmVkIGNoYXIgcWRyX2FjOwogCXVuc2lnbmVkIGNoYXIgYWRhcHRlcl9uYW1lWzhdOwogCXVuc2lnbmVkIGludCBxaWJfcGFyYW1fZmllbGRfZm9ybWF0OwogCXVuc2lnbmVkIGNoYXIgKnFpYl9wYXJhbV9maWVsZDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9yZXNldC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Jlc2V0LmgKaW5kZXggZjU4NGY0YS4uM2Q2YWQ0YSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Jlc2V0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Jlc2V0LmgKQEAgLTE3LDUgKzE3LDUgQEAKIAogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfcmVzZXRfY2FsbChzdHJ1Y3QgcmVzZXRfY2FsbCAqcmVzZXQpOwogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9yZXNldF9jYWxsKHN0cnVjdCByZXNldF9jYWxsICpyZXNldCk7Ci1leHRlcm4gdm9pZCBzMzkwX3Jlc2V0X3N5c3RlbSh2b2lkKTsKK2V4dGVybiB2b2lkIHMzOTBfcmVzZXRfc3lzdGVtKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhKTsKICNlbmRpZiAvKiBfQVNNX1MzOTBfUkVTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBkNWUyZWYxLi41YTA5OTcxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMjYsMTUgKzI2LDIxIEBACiAjZGVmaW5lIElQTF9ERVZJQ0UgICAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDA0KSkKICNkZWZpbmUgSU5JVFJEX1NUQVJUICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MEMpKQogI2RlZmluZSBJTklUUkRfU0laRSAgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQxNCkpCisjZGVmaW5lIE9MRE1FTV9CQVNFCSAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MUMpKQorI2RlZmluZSBPTERNRU1fU0laRQkgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDI0KSkKICNlbHNlIC8qIF9fczM5MHhfXyAqLwogI2RlZmluZSBJUExfREVWSUNFICAgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQwMCkpCiAjZGVmaW5lIElOSVRSRF9TVEFSVCAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDA4KSkKICNkZWZpbmUgSU5JVFJEX1NJWkUgICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MTApKQorI2RlZmluZSBPTERNRU1fQkFTRQkgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDE4KSkKKyNkZWZpbmUgT0xETUVNX1NJWkUJICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQyMCkpCiAjZW5kaWYgLyogX19zMzkweF9fICovCiAjZGVmaW5lIENPTU1BTkRfTElORSAgICAgICgoY2hhciAqKSAgICAgICAgICAgICgweDEwNDgwKSkKIAogI2RlZmluZSBDSFVOS19SRUFEX1dSSVRFIDAKICNkZWZpbmUgQ0hVTktfUkVBRF9PTkxZICAxCisjZGVmaW5lIENIVU5LX09MRE1FTQkgNAorI2RlZmluZSBDSFVOS19DUkFTSEsJIDUKIAogc3RydWN0IG1lbV9jaHVuayB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtNDgsNiArNTQsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKIAogdm9pZCBkZXRlY3RfbWVtb3J5X2xheW91dChzdHJ1Y3QgbWVtX2NodW5rIGNodW5rW10pOwordm9pZCBjcmVhdGVfbWVtX2hvbGUoc3RydWN0IG1lbV9jaHVuayBtZW1vcnlfY2h1bmtbXSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHR5cGUpOwogCiAjZGVmaW5lIFBSSU1BUllfU1BBQ0VfTU9ERQkwCiAjZGVmaW5lIEFDQ0VTU19SRUdJU1RFUl9NT0RFCTEKQEAgLTEwNiw2ICsxMTQsNyBAQAogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCiAjZGVmaW5lIFpGQ1BEVU1QX0hTQV9TSVpFCSgzMlVMPDwyMCkKKyNkZWZpbmUgWkZDUERVTVBfSFNBX1NJWkVfTUFYCSg2NFVMPDwyMCkKIAogLyoKICAqIENvbnNvbGUgbW9kZS4gT3ZlcnJpZGUgd2l0aCBjb25tb2RlPQpAQCAtMTM0LDEwICsxNDMsMTQgQEAKICNkZWZpbmUgSVBMX0RFVklDRSAgICAgICAgMHgxMDQwNAogI2RlZmluZSBJTklUUkRfU1RBUlQgICAgICAweDEwNDBDCiAjZGVmaW5lIElOSVRSRF9TSVpFICAgICAgIDB4MTA0MTQKKyNkZWZpbmUgT0xETUVNX0JBU0UJICAweDEwNDFDCisjZGVmaW5lIE9MRE1FTV9TSVpFCSAgMHgxMDQyNAogI2Vsc2UgLyogX19zMzkweF9fICovCiAjZGVmaW5lIElQTF9ERVZJQ0UgICAgICAgIDB4MTA0MDAKICNkZWZpbmUgSU5JVFJEX1NUQVJUICAgICAgMHgxMDQwOAogI2RlZmluZSBJTklUUkRfU0laRSAgICAgICAweDEwNDEwCisjZGVmaW5lIE9MRE1FTV9CQVNFCSAgMHgxMDQxOAorI2RlZmluZSBPTERNRU1fU0laRQkgIDB4MTA0MjAKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KICNkZWZpbmUgQ09NTUFORF9MSU5FICAgICAgMHgxMDQ4MAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2ZwLXV0aWwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCmluZGV4IDBhZGRjNjQuLmNhM2Y4ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCkBAIC03Miw2ICs3Miw2IEBACiAKICNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDAKIAotI2RlZmluZSBhYm9ydCgpIHJldHVybiAwCisjZGVmaW5lIGFib3J0KCkgQlVHKCkKIAogI2RlZmluZSBfX0JZVEVfT1JERVIgX19CSUdfRU5ESUFOCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMDQ1ZTAwOWYuLmFiNDdhNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc21wLmgKQEAgLTMzLDYgKzMzLDcgQEAKIGV4dGVybiB2b2lkIHNtcF9zd2l0Y2hfdG9faXBsX2NwdSh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqKTsKIGV4dGVybiB2b2lkIHNtcF9zd2l0Y2hfdG9fY3B1KHZvaWQgKCopKHZvaWQgKiksIHZvaWQgKiwgdW5zaWduZWQgbG9uZyBzcCwKIAkJCSAgICAgIGludCBmcm9tLCBpbnQgdG8pOworZXh0ZXJuIHZvaWQgc21wX3Jlc3RhcnRfd2l0aF9vbmxpbmVfY3B1KHZvaWQpOwogZXh0ZXJuIHZvaWQgc21wX3Jlc3RhcnRfY3B1KHZvaWQpOwogCiAvKgpAQCAtNjQsNiArNjUsMTAgQEAKIAlmdW5jKGRhdGEpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc21wX3Jlc3RhcnRfd2l0aF9vbmxpbmVfY3B1KHZvaWQpCit7Cit9CisKICNkZWZpbmUgc21wX3ZjcHVfc2NoZWR1bGVkCSgxKQogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCA1NjYxMmZjLi5mZDk0ZGZlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMTMsNiArMTMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKK2V4dGVybiBpbnQgc3Bpbl9yZXRyeTsKKwogc3RhdGljIGlubGluZSBpbnQKIF9yYXdfY29tcGFyZV9hbmRfc3dhcCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmxvY2ssCiAJCSAgICAgIHVuc2lnbmVkIGludCBvbGQsIHVuc2lnbmVkIGludCBuZXcpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzY2FsbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaAppbmRleCA1YzAyNDZiLi5iMjM5ZmY1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzY2FsbC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNkZWZpbmUgX0FTTV9TWVNDQUxMX0gJMQogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCkBAIC0yNSw3ICsyNiw4IEBACiBzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfbnIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JcmV0dXJuIHJlZ3MtPnN2Y25yID8gcmVncy0+c3ZjbnIgOiAtMTsKKwlyZXR1cm4gdGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NZU0NBTEwpID8KKwkJKHJlZ3MtPnN2Y19jb2RlICYgMHhmZmZmKSA6IC0xOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9yb2xsYmFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCkBAIC0zNyw3ICszOSw3IEBACiBzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfZXJyb3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JcmV0dXJuIChyZWdzLT5ncHJzWzJdID49IC00MDk2VUwpID8gLXJlZ3MtPmdwcnNbMl0gOiAwOworCXJldHVybiBJU19FUlJfVkFMVUUocmVncy0+Z3Byc1syXSkgPyByZWdzLT5ncHJzWzJdIDogMDsKIH0KIAogc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X3JldHVybl92YWx1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggNjU4MmY2OS4uZWY1NzNjMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMjAsNiArMjAsOCBAQAogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKK2V4dGVybiBpbnQgc3lzY3RsX3VzZXJwcm9jZXNzX2RlYnVnOworCiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpfX3N3aXRjaF90byh2b2lkICosIHZvaWQgKik7CiBleHRlcm4gdm9pZCB1cGRhdGVfcGVyX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIApAQCAtMTE0LDYgKzExNiw4IEBACiBleHRlcm4gdm9pZCBjbW1hX2luaXQodm9pZCk7CiBleHRlcm4gaW50IG1lbWNweV9yZWFsKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgY29weV90b19hYnNvbHV0ZV96ZXJvKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgY29weV90b191c2VyX3JlYWwodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgY29weV9mcm9tX3VzZXJfcmVhbCh2b2lkICpkZXN0LCB2b2lkIF9fdXNlciAqc3JjLCBzaXplX3QgY291bnQpOwogCiAjZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KSBkbyB7CQkJCQkgICAgIFwKIAlzZXRfZnMoY3VycmVudC0+dGhyZWFkLm1tX3NlZ21lbnQpOwkJCQkgICAgIFwKQEAgLTIxMCw4ICsyMTQsMTAgQEAKIAlfX2xvYWRfcHN3X21hc2sobWFzayB8IChhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSAmIH4oLTFVTCA+PiA4KSkpOwogfQogCi0jZGVmaW5lIGxvY2FsX21jY2tfZW5hYmxlKCkgIF9fc2V0X3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cykKLSNkZWZpbmUgbG9jYWxfbWNja19kaXNhYmxlKCkgX19zZXRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX01DSEVDSykKKyNkZWZpbmUgbG9jYWxfbWNja19lbmFibGUoKSBcCisJX19zZXRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUIHwgUFNXX01BU0tfTUNIRUNLKQorI2RlZmluZSBsb2NhbF9tY2NrX2Rpc2FibGUoKSBcCisJX19zZXRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUKQogCiAjaWZkZWYgQ09ORklHX1NNUAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDFhNWRiYjYuLmEyMzE4MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC00OCw2ICs0OCw3IEBACiAJdW5zaWduZWQgaW50CQljcHU7CQkvKiBjdXJyZW50IENQVSAqLwogCWludAkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrCXJlc3RhcnRfYmxvY2s7CisJdW5zaWduZWQgaW50CQlzeXN0ZW1fY2FsbDsKIAlfX3U2NAkJCXVzZXJfdGltZXI7CiAJX191NjQJCQlzeXN0ZW1fdGltZXI7CiAJdW5zaWduZWQgbG9uZwkJbGFzdF9icmVhazsJLyogbGFzdCBicmVha2luZy1ldmVudC1hZGRyZXNzLiAqLwpAQCAtODQsMTAgKzg1LDEwIEBACiAvKgogICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzIGJpdCBudW1iZXJzCiAgKi8KKyNkZWZpbmUgVElGX1NZU0NBTEwJCTAJLyogaW5zaWRlIGEgc3lzdGVtIGNhbGwgKi8KICNkZWZpbmUgVElGX05PVElGWV9SRVNVTUUJMQkvKiBjYWxsYmFjayBiZWZvcmUgcmV0dXJuaW5nIHRvIHVzZXIgKi8KICNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTIJLyogc2lnbmFsIHBlbmRpbmcgKi8KICNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkzCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KLSNkZWZpbmUgVElGX1JFU1RBUlRfU1ZDCQk0CS8qIHJlc3RhcnQgc3ZjIHdpdGggbmV3IHN2YyBudW1iZXIgKi8KICNkZWZpbmUgVElGX1BFUl9UUkFQCQk2CS8qIGRlbGl2ZXIgc2lndHJhcCBvbiByZXR1cm4gdG8gdXNlciAqLwogI2RlZmluZSBUSUZfTUNDS19QRU5ESU5HCTcJLyogbWFjaGluZSBjaGVjayBoYW5kbGluZyBpcyBwZW5kaW5nICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTgJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KQEAgLTEwMywxMSArMTA0LDExIEBACiAjZGVmaW5lIFRJRl9TSU5HTEVfU1RFUAkJMjAJLyogVGhpcyB0YXNrIGlzIHNpbmdsZSBzdGVwcGVkICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTIxCS8qIHRocmVhZCBpcyBmcmVlemluZyBmb3Igc3VzcGVuZCAqLwogCisjZGVmaW5lIF9USUZfU1lTQ0FMTAkJKDE8PFRJRl9TWVNDQUxMKQogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDE8PFRJRl9OT1RJRllfUkVTVU1FKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQotI2RlZmluZSBfVElGX1JFU1RBUlRfU1ZDCSgxPDxUSUZfUkVTVEFSVF9TVkMpCiAjZGVmaW5lIF9USUZfUEVSX1RSQVAJCSgxPDxUSUZfUEVSX1RSQVApCiAjZGVmaW5lIF9USUZfTUNDS19QRU5ESU5HCSgxPDxUSUZfTUNDS19QRU5ESU5HKQogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtMTE3LDcgKzExOCw3IEBACiAjZGVmaW5lIF9USUZfU0lFCQkoMTw8VElGX1NJRSkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMTw8VElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGXzMxQklUCQkoMTw8VElGXzMxQklUKQotI2RlZmluZSBfVElGX1NJTkdMRV9TVEVQCSgxPDxUSUZfRlJFRVpFKQorI2RlZmluZSBfVElGX1NJTkdMRV9TVEVQCSgxPDxUSUZfU0lOR0xFX1NURVApCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKIAogI2lmZGVmIENPTkZJR182NEJJVApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RpbWV4LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGltZXguaAppbmRleCA4ODgyOWE0Li5kNjEwYmVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGltZXguaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGltZXguaApAQCAtODYsNiArODYsMTcgQEAKIAlhc20gdm9sYXRpbGUoInN0Y2tlICUwIiA6ICI9USIgKCpjbGspIDogOiAiY2MiKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X2Nsb2NrX2Zhc3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xrOworCisJaWYgKHRlc3RfZmFjaWxpdHkoMjUpKQorCQlhc20gdm9sYXRpbGUoIi5pbnNuCXMsMHhiMjdjMDAwMCwlMCIgOiAiPVEiIChjbGspIDogOiAiY2MiKTsKKwllbHNlCisJCWNsayA9IGdldF9jbG9jaygpOworCXJldHVybiBjbGs7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldF9jbG9ja194dCh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgY2xrWzE2XTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMzA0NDQ1My4uMWQ4NjQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTU5LDYgKzU5LDcgQEAKIH0KICNlbHNlCiAjZGVmaW5lIF9fdGxiX2ZsdXNoX2Z1bGwobW0pCV9fdGxiX2ZsdXNoX2xvY2FsKCkKKyNkZWZpbmUgX190bGJfZmx1c2hfZ2xvYmFsKCkJX190bGJfZmx1c2hfbG9jYWwoKQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQppbmRleCBkZjM3MzIyLi5kZDRmMDc2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKQEAgLTQ4LDYgKzQ4LDcgQEAKIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkJKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIpICs9IGZ0cmFjZS5vCiBvYmotJChDT05GSUdfRlRSQUNFX1NZU0NBTExTKSAgKz0gZnRyYWNlLm8KK29iai0kKENPTkZJR19DUkFTSF9EVU1QKQkrPSBjcmFzaF9kdW1wLm8KIAogIyBLZXhlYyBwYXJ0CiBTMzkwX0tFWEVDX09CSlMgOj0gbWFjaGluZV9rZXhlYy5vIGNyYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAyYjQ1NTkxLi43NTEzMTg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00NSw4ICs0NSw3IEBACiAJREVGSU5FKF9fUFRfUFNXLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgcHN3KSk7CiAJREVGSU5FKF9fUFRfR1BSUywgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIGdwcnMpKTsKIAlERUZJTkUoX19QVF9PUklHX0dQUjIsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBvcmlnX2dwcjIpKTsKLQlERUZJTkUoX19QVF9JTEMsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBpbGMpKTsKLQlERUZJTkUoX19QVF9TVkNOUiwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHN2Y25yKSk7CisJREVGSU5FKF9fUFRfU1ZDX0NPREUsIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBzdmNfY29kZSkpOwogCURFRklORShfX1BUX1NJWkUsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwogCUJMQU5LKCk7CiAJREVGSU5FKF9fU0ZfQkFDS0NIQUlOLCBvZmZzZXRvZihzdHJ1Y3Qgc3RhY2tfZnJhbWUsIGJhY2tfY2hhaW4pKTsKQEAgLTE0MSw3ICsxNDAsNiBAQAogCURFRklORShfX0xDX0ZQUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZmxvYXRpbmdfcHRfc2F2ZV9hcmVhKSk7CiAJREVGSU5FKF9fTENfR1BSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBncHJlZ3Nfc2F2ZV9hcmVhKSk7CiAJREVGSU5FKF9fTENfQ1JFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGNyZWdzX3NhdmVfYXJlYSkpOwotCURFRklORShfX0xDX1NBVkVfQVJFQV82NCwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBzYXZlX2FyZWFfNjQpKTsKICNpZmRlZiBDT05GSUdfMzJCSVQKIAlERUZJTkUoU0FWRV9BUkVBX0JBU0UsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIpKTsKICNlbHNlIC8qIENPTkZJR18zMkJJVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMgYi9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUwppbmRleCAyNTU0MzU2Li5mODgyOGQzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUwpAQCAtODYsNiArODYsOCBAQAogRU5UUlkoZGlhZzMwOF9yZXNldCkKIAlsYXJsCSVyNCwuTGN0bHJlZ3MJCSMgU2F2ZSBjb250cm9sIHJlZ2lzdGVycwogCXN0Y3RnCSVjMCwlYzE1LDAoJXI0KQorCWxhcmwJJXI0LC5MZnBjdGwJCSMgRmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlcgorCXN0ZnBjCTAoJXI0KQogCWxhcmwJJXI0LC5McmVzdGFydF9wc3cJIyBTZXR1cCByZXN0YXJ0IFBTVyBhdCBhYnNvbHV0ZSAwCiAJbGdoaQklcjMsMAogCWxnCSVyNCwwKCVyNCkJCSMgU2F2ZSBQU1cKQEAgLTk5LDYgKzEwMSw4IEBACiAJc2FtNjQJCQkJIyBTd2l0Y2ggdG8gNjQgYml0IGFkZHJlc3NpbmcgbW9kZQogCWxhcmwJJXI0LC5MY3RscmVncwkJIyBSZXN0b3JlIGNvbnRyb2wgcmVnaXN0ZXJzCiAJbGN0bGcJJWMwLCVjMTUsMCglcjQpCisJbGFybAklcjQsLkxmcGN0bAkJIyBSZXN0b3JlIGZsb2F0aW5nIHBvaW50IGN0bCByZWdpc3RlcgorCWxmcGMJMCglcjQpCiAJYnIJJXIxNAogLmFsaWduIDE2CiAuTHJlc3RhcnRfcHN3OgpAQCAtMTEwLDYgKzExNCw4IEBACiAJLnJlcHQJMTYKIAkucXVhZAkwCiAJLmVuZHIKKy5MZnBjdGw6CisJLmxvbmcJMAogCS5wcmV2aW91cwogCiAjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDUzYWNhYTguLjg0YTk4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNjAsMTIgKzYwLDkgQEAKIAogI2luY2x1ZGUgImNvbXBhdF9saW51eC5oIgogCi1sb25nIHBzd191c2VyMzJfYml0cwk9IChQU1dfQkFTRTMyX0JJVFMgfCBQU1dfTUFTS19EQVQgfCBQU1dfQVNDX0hPTUUgfAotCQkJICAgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0sgfAotCQkJICAgUFNXX01BU0tfUFNUQVRFIHwgUFNXX0RFRkFVTFRfS0VZKTsKLWxvbmcgcHN3MzJfdXNlcl9iaXRzCT0gKFBTVzMyX0JBU0VfQklUUyB8IFBTVzMyX01BU0tfREFUIHwgUFNXMzJfQVNDX0hPTUUgfAotCQkJICAgUFNXMzJfTUFTS19JTyB8IFBTVzMyX01BU0tfRVhUIHwgUFNXMzJfTUFTS19NQ0hFQ0sgfAotCQkJICAgUFNXMzJfTUFTS19QU1RBVEUpOwordTMyIHBzdzMyX3VzZXJfYml0cyA9IFBTVzMyX01BU0tfREFUIHwgUFNXMzJfTUFTS19JTyB8IFBTVzMyX01BU0tfRVhUIHwKKwkJICAgICAgUFNXMzJfREVGQVVMVF9LRVkgfCBQU1czMl9NQVNLX0JBU0UgfCBQU1czMl9NQVNLX01DSEVDSyB8CisJCSAgICAgIFBTVzMyX01BU0tfUFNUQVRFIHwgUFNXMzJfQVNDX0hPTUU7CiAgCiAvKiBGb3IgdGhpcyBzb3VyY2UgZmlsZSwgd2Ugd2FudCBvdmVyZmxvdyBoYW5kbGluZy4gKi8KIApAQCAtMzY1LDEyICszNjIsNyBAQAogCWlmIChzZXQpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyICgmczMyLCBzZXQsIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7Ci0JCWNhc2UgNDogcy5zaWdbM10gPSBzMzIuc2lnWzZdIHwgKCgobG9uZylzMzIuc2lnWzddKSA8PCAzMik7Ci0JCWNhc2UgMzogcy5zaWdbMl0gPSBzMzIuc2lnWzRdIHwgKCgobG9uZylzMzIuc2lnWzVdKSA8PCAzMik7Ci0JCWNhc2UgMjogcy5zaWdbMV0gPSBzMzIuc2lnWzJdIHwgKCgobG9uZylzMzIuc2lnWzNdKSA8PCAzMik7Ci0JCWNhc2UgMTogcy5zaWdbMF0gPSBzMzIuc2lnWzBdIHwgKCgobG9uZylzMzIuc2lnWzFdKSA8PCAzMik7Ci0JCX0KKwkJcy5zaWdbMF0gPSBzMzIuc2lnWzBdIHwgKCgobG9uZylzMzIuc2lnWzFdKSA8PCAzMik7CiAJfQogCXNldF9mcyAoS0VSTkVMX0RTKTsKIAlyZXQgPSBzeXNfcnRfc2lncHJvY21hc2soaG93LApAQCAtMzgwLDEyICszNzIsOCBAQAogCXNldF9mcyAob2xkX2ZzKTsKIAlpZiAocmV0KSByZXR1cm4gcmV0OwogCWlmIChvc2V0KSB7Ci0JCXN3aXRjaCAoX05TSUdfV09SRFMpIHsKLQkJY2FzZSA0OiBzMzIuc2lnWzddID0gKHMuc2lnWzNdID4+IDMyKTsgczMyLnNpZ1s2XSA9IHMuc2lnWzNdOwotCQljYXNlIDM6IHMzMi5zaWdbNV0gPSAocy5zaWdbMl0gPj4gMzIpOyBzMzIuc2lnWzRdID0gcy5zaWdbMl07Ci0JCWNhc2UgMjogczMyLnNpZ1szXSA9IChzLnNpZ1sxXSA+PiAzMik7IHMzMi5zaWdbMl0gPSBzLnNpZ1sxXTsKLQkJY2FzZSAxOiBzMzIuc2lnWzFdID0gKHMuc2lnWzBdID4+IDMyKTsgczMyLnNpZ1swXSA9IHMuc2lnWzBdOwotCQl9CisJCXMzMi5zaWdbMV0gPSAocy5zaWdbMF0gPj4gMzIpOworCQlzMzIuc2lnWzBdID0gcy5zaWdbMF07CiAJCWlmIChjb3B5X3RvX3VzZXIgKG9zZXQsICZzMzIsIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTQwNCwxMiArMzkyLDggQEAKIAlyZXQgPSBzeXNfcnRfc2lncGVuZGluZygoc2lnc2V0X3QgX19mb3JjZSBfX3VzZXIgKikgJnMsIHNpZ3NldHNpemUpOwogCXNldF9mcyAob2xkX2ZzKTsKIAlpZiAoIXJldCkgewotCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7Ci0JCWNhc2UgNDogczMyLnNpZ1s3XSA9IChzLnNpZ1szXSA+PiAzMik7IHMzMi5zaWdbNl0gPSBzLnNpZ1szXTsKLQkJY2FzZSAzOiBzMzIuc2lnWzVdID0gKHMuc2lnWzJdID4+IDMyKTsgczMyLnNpZ1s0XSA9IHMuc2lnWzJdOwotCQljYXNlIDI6IHMzMi5zaWdbM10gPSAocy5zaWdbMV0gPj4gMzIpOyBzMzIuc2lnWzJdID0gcy5zaWdbMV07Ci0JCWNhc2UgMTogczMyLnNpZ1sxXSA9IChzLnNpZ1swXSA+PiAzMik7IHMzMi5zaWdbMF0gPSBzLnNpZ1swXTsKLQkJfQorCQlzMzIuc2lnWzFdID0gKHMuc2lnWzBdID4+IDMyKTsKKwkJczMyLnNpZ1swXSA9IHMuc2lnWzBdOwogCQlpZiAoY29weV90b191c2VyIChzZXQsICZzMzIsIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKaW5kZXggYTlhMjg1Yi4uNGY2OGM4MSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKQEAgLTE0MSw3ICsxNDEsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgX19TSV9GQVVMVCA+PiAxNjoKIAkJCWVyciB8PSBfX2dldF91c2VyKHRtcCwgJmZyb20tPnNpX2FkZHIpOwotCQkJdG8tPnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKikodTY0KSAodG1wICYgUFNXMzJfQUREUl9JTlNOKTsKKwkJCXRvLT5zaV9hZGRyID0gKHZvaWQgX19mb3JjZSBfX3VzZXIgKikKKwkJCQkodTY0KSAodG1wICYgUFNXMzJfQUREUl9JTlNOKTsKIAkJCWJyZWFrOwogCQljYXNlIF9fU0lfUE9MTCA+PiAxNjoKIAkJCWVyciB8PSBfX2dldF91c2VyKHRvLT5zaV9iYW5kLCAmZnJvbS0+c2lfYmFuZCk7CkBAIC0yMTMsMTYgKzIxNCw4IEBACiAJCXJldCA9IGdldF91c2VyKHNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpOwogCQlyZXQgfD0gX19jb3B5X2Zyb21fdXNlcigmc2V0MzIsICZhY3QtPnNhX21hc2ssCiAJCQkJCXNpemVvZihjb21wYXRfc2lnc2V0X3QpKTsKLQkJc3dpdGNoIChfTlNJR19XT1JEUykgewotCQljYXNlIDQ6IG5ld19rYS5zYS5zYV9tYXNrLnNpZ1szXSA9IHNldDMyLnNpZ1s2XQotCQkJCXwgKCgobG9uZylzZXQzMi5zaWdbN10pIDw8IDMyKTsKLQkJY2FzZSAzOiBuZXdfa2Euc2Euc2FfbWFzay5zaWdbMl0gPSBzZXQzMi5zaWdbNF0KLQkJCQl8ICgoKGxvbmcpc2V0MzIuc2lnWzVdKSA8PCAzMik7Ci0JCWNhc2UgMjogbmV3X2thLnNhLnNhX21hc2suc2lnWzFdID0gc2V0MzIuc2lnWzJdCi0JCQkJfCAoKChsb25nKXNldDMyLnNpZ1szXSkgPDwgMzIpOwotCQljYXNlIDE6IG5ld19rYS5zYS5zYV9tYXNrLnNpZ1swXSA9IHNldDMyLnNpZ1swXQotCQkJCXwgKCgobG9uZylzZXQzMi5zaWdbMV0pIDw8IDMyKTsKLQkJfQorCQluZXdfa2Euc2Euc2FfbWFzay5zaWdbMF0gPQorCQkJc2V0MzIuc2lnWzBdIHwgKCgobG9uZylzZXQzMi5zaWdbMV0pIDw8IDMyKTsKIAkJcmV0IHw9IF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7CiAJCQogCQlpZiAocmV0KQpAQCAtMjMzLDIwICsyMjYsOCBAQAogCXJldCA9IGRvX3NpZ2FjdGlvbihzaWcsIGFjdCA/ICZuZXdfa2EgOiBOVUxMLCBvYWN0ID8gJm9sZF9rYSA6IE5VTEwpOwogCiAJaWYgKCFyZXQgJiYgb2FjdCkgewotCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7Ci0JCWNhc2UgNDoKLQkJCXNldDMyLnNpZ1s3XSA9IChvbGRfa2Euc2Euc2FfbWFzay5zaWdbM10gPj4gMzIpOwotCQkJc2V0MzIuc2lnWzZdID0gb2xkX2thLnNhLnNhX21hc2suc2lnWzNdOwotCQljYXNlIDM6Ci0JCQlzZXQzMi5zaWdbNV0gPSAob2xkX2thLnNhLnNhX21hc2suc2lnWzJdID4+IDMyKTsKLQkJCXNldDMyLnNpZ1s0XSA9IG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1syXTsKLQkJY2FzZSAyOgotCQkJc2V0MzIuc2lnWzNdID0gKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1sxXSA+PiAzMik7Ci0JCQlzZXQzMi5zaWdbMl0gPSBvbGRfa2Euc2Euc2FfbWFzay5zaWdbMV07Ci0JCWNhc2UgMToKLQkJCXNldDMyLnNpZ1sxXSA9IChvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0gPj4gMzIpOwotCQkJc2V0MzIuc2lnWzBdID0gb2xkX2thLnNhLnNhX21hc2suc2lnWzBdOwotCQl9CisJCXNldDMyLnNpZ1sxXSA9IChvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0gPj4gMzIpOworCQlzZXQzMi5zaWdbMF0gPSBvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF07CiAJCXJldCA9IHB1dF91c2VyKCh1bnNpZ25lZCBsb25nKW9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcik7CiAJCXJldCB8PSBfX2NvcHlfdG9fdXNlcigmb2FjdC0+c2FfbWFzaywgJnNldDMyLAogCQkJCSAgICAgIHNpemVvZihjb21wYXRfc2lnc2V0X3QpKTsKQEAgLTMwMCw5ICsyODEsMTAgQEAKIAlfczM5MF9yZWdzX2NvbW1vbjMyIHJlZ3MzMjsKIAlpbnQgZXJyLCBpOwogCi0JcmVnczMyLnBzdy5tYXNrID0gUFNXMzJfTUFTS19NRVJHRShwc3czMl91c2VyX2JpdHMsCi0JCQkJCSAgIChfX3UzMikocmVncy0+cHN3Lm1hc2sgPj4gMzIpKTsKLQlyZWdzMzIucHN3LmFkZHIgPSBQU1czMl9BRERSX0FNT0RFMzEgfCAoX191MzIpIHJlZ3MtPnBzdy5hZGRyOworCXJlZ3MzMi5wc3cubWFzayA9IHBzdzMyX3VzZXJfYml0cyB8CisJCSgoX191MzIpKHJlZ3MtPnBzdy5tYXNrID4+IDMyKSAmIFBTVzMyX01BU0tfVVNFUik7CisJcmVnczMyLnBzdy5hZGRyID0gKF9fdTMyKSByZWdzLT5wc3cuYWRkciB8CisJCShfX3UzMikocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19CQSk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCiAJCXJlZ3MzMi5ncHJzW2ldID0gKF9fdTMyKSByZWdzLT5ncHJzW2ldOwogCXNhdmVfYWNjZXNzX3JlZ3MoY3VycmVudC0+dGhyZWFkLmFjcnMpOwpAQCAtMzI3LDggKzMwOSw5IEBACiAJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmcmVnczMyLCAmc3JlZ3MtPnJlZ3MsIHNpemVvZihyZWdzMzIpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCXJlZ3MtPnBzdy5tYXNrID0gUFNXX01BU0tfTUVSR0UocmVncy0+cHN3Lm1hc2ssCi0JCQkJICAgICAgICAoX191NjQpcmVnczMyLnBzdy5tYXNrIDw8IDMyKTsKKwlyZWdzLT5wc3cubWFzayA9IChyZWdzLT5wc3cubWFzayAmIH5QU1dfTUFTS19VU0VSKSB8CisJCShfX3U2NCkocmVnczMyLnBzdy5tYXNrICYgUFNXMzJfTUFTS19VU0VSKSA8PCAzMiB8CisJCShfX3U2NCkocmVnczMyLnBzdy5hZGRyICYgUFNXMzJfQUREUl9BTU9ERSk7CiAJcmVncy0+cHN3LmFkZHIgPSAoX191NjQpKHJlZ3MzMi5wc3cuYWRkciAmIFBTVzMyX0FERFJfSU5TTik7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCiAJCXJlZ3MtPmdwcnNbaV0gPSAoX191NjQpIHJlZ3MzMi5ncHJzW2ldOwpAQCAtMzQyLDcgKzMyNSw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlyZXN0b3JlX2ZwX3JlZ3MoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzKTsKLQlyZWdzLT5zdmNuciA9IDA7CS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCk7CS8qIE5vIGxvbmdlciBpbiBhIHN5c3RlbSBjYWxsICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5NiwxMSArNDc5LDExIEBACiAJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gIElmIHByb3ZpZGVkLCB1c2UgYSBzdHViCiAJICAgYWxyZWFkeSBpbiB1c2Vyc3BhY2UuICAqLwogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgewotCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkga2EtPnNhLnNhX3Jlc3RvcmVyOworCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkga2EtPnNhLnNhX3Jlc3RvcmVyIHwgUFNXMzJfQUREUl9BTU9ERTsKIAl9IGVsc2UgewotCQlyZWdzLT5ncHJzWzE0XSA9IChfX3U2NCkgZnJhbWUtPnJldGNvZGU7CisJCXJlZ3MtPmdwcnNbMTRdID0gKF9fdTY0KSBmcmFtZS0+cmV0Y29kZSB8IFBTVzMyX0FERFJfQU1PREU7CiAJCWlmIChfX3B1dF91c2VyKFMzOTBfU1lTQ0FMTF9PUENPREUgfCBfX05SX3NpZ3JldHVybiwKLQkJICAgICAgICAgICAgICAgKHUxNiBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUpKSkKKwkJCSAgICAgICAodTE2IF9fZm9yY2UgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKSkpCiAJCQlnb3RvIGdpdmVfc2lnc2VndjsKICAgICAgICAgfQogCkBAIC01MDksMTEgKzQ5MiwxMiBAQAogCQlnb3RvIGdpdmVfc2lnc2VndjsKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCi0JcmVncy0+Z3Byc1sxNV0gPSAoX191NjQpIGZyYW1lOwotCXJlZ3MtPnBzdy5hZGRyID0gKF9fdTY0KSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5ncHJzWzE1XSA9IChfX2ZvcmNlIF9fdTY0KSBmcmFtZTsKKwlyZWdzLT5wc3cubWFzayB8PSBQU1dfTUFTS19CQTsJCS8qIGZvcmNlIGFtb2RlIDMxICovCisJcmVncy0+cHN3LmFkZHIgPSAoX19mb3JjZSBfX3U2NCkga2EtPnNhLnNhX2hhbmRsZXI7CiAKIAlyZWdzLT5ncHJzWzJdID0gbWFwX3NpZ25hbChzaWcpOwotCXJlZ3MtPmdwcnNbM10gPSAoX191NjQpICZmcmFtZS0+c2M7CisJcmVncy0+Z3Byc1szXSA9IChfX2ZvcmNlIF9fdTY0KSAmZnJhbWUtPnNjOwogCiAJLyogV2UgZm9yZ290IHRvIGluY2x1ZGUgdGhlc2UgaW4gdGhlIHNpZ2NvbnRleHQuCiAJICAgVG8gYXZvaWQgYnJlYWtpbmcgYmluYXJ5IGNvbXBhdGliaWxpdHksIHRoZXkgYXJlIHBhc3NlZCBhcyBhcmdzLiAqLwpAQCAtNTIxLDcgKzUwNSw3IEBACiAJcmVncy0+Z3Byc1s1XSA9IGN1cnJlbnQtPnRocmVhZC5wcm90X2FkZHI7CiAKIAkvKiBQbGFjZSBzaWduYWwgbnVtYmVyIG9uIHN0YWNrIHRvIGFsbG93IGJhY2t0cmFjZSBmcm9tIGhhbmRsZXIuICAqLwotCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMl0sIChpbnQgX191c2VyICopICZmcmFtZS0+c2lnbm8pKQorCWlmIChfX3B1dF91c2VyKHJlZ3MtPmdwcnNbMl0sIChpbnQgX19mb3JjZSBfX3VzZXIgKikgJmZyYW1lLT5zaWdubykpCiAJCWdvdG8gZ2l2ZV9zaWdzZWd2OwogCXJldHVybiAwOwogCkBAIC01NjQsMjAgKzU0OCwyMSBAQAogCX0gZWxzZSB7CiAJCXJlZ3MtPmdwcnNbMTRdID0gKF9fdTY0KSBmcmFtZS0+cmV0Y29kZTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoUzM5MF9TWVNDQUxMX09QQ09ERSB8IF9fTlJfcnRfc2lncmV0dXJuLAotCQkgICAgICAgICAgICAgICAgICAodTE2IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSkpOworCQkJCSAgKHUxNiBfX2ZvcmNlIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSkpOwogCX0KIAogCS8qIFNldCB1cCBiYWNrY2hhaW4uICovCi0JaWYgKF9fcHV0X3VzZXIocmVncy0+Z3Byc1sxNV0sICh1bnNpZ25lZCBpbnQgX191c2VyICopIGZyYW1lKSkKKwlpZiAoX19wdXRfdXNlcihyZWdzLT5ncHJzWzE1XSwgKHVuc2lnbmVkIGludCBfX2ZvcmNlIF9fdXNlciAqKSBmcmFtZSkpCiAJCWdvdG8gZ2l2ZV9zaWdzZWd2OwogCiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KLQlyZWdzLT5ncHJzWzE1XSA9IChfX3U2NCkgZnJhbWU7CisJcmVncy0+Z3Byc1sxNV0gPSAoX19mb3JjZSBfX3U2NCkgZnJhbWU7CisJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX01BU0tfQkE7CQkvKiBmb3JjZSBhbW9kZSAzMSAqLwogCXJlZ3MtPnBzdy5hZGRyID0gKF9fdTY0KSBrYS0+c2Euc2FfaGFuZGxlcjsKIAogCXJlZ3MtPmdwcnNbMl0gPSBtYXBfc2lnbmFsKHNpZyk7Ci0JcmVncy0+Z3Byc1szXSA9IChfX3U2NCkgJmZyYW1lLT5pbmZvOwotCXJlZ3MtPmdwcnNbNF0gPSAoX191NjQpICZmcmFtZS0+dWM7CisJcmVncy0+Z3Byc1szXSA9IChfX2ZvcmNlIF9fdTY0KSAmZnJhbWUtPmluZm87CisJcmVncy0+Z3Byc1s0XSA9IChfX2ZvcmNlIF9fdTY0KSAmZnJhbWUtPnVjOwogCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggNzUyNmRiNi4uNTAwNmExZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMTYyMyw4ICsxNjIzLDcgQEAKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWpnCXN5c19zeW5jZnMKIAotCS5nbG9ibAlzeXNfc2V0bnNfd3JhcHBlcgotc3lzX3NldG5zX3dyYXBwZXI6CitFTlRSWShzeXNfc2V0bnNfd3JhcHBlcikKIAlsZ2ZyCSVyMiwlcjIJCQkjIGludAogCWxnZnIJJXIzLCVyMwkJCSMgaW50CiAJamcJc3lzX3NldG5zCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2hfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjhmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIFMzOTAga2R1bXAgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTEKKyAqIEF1dGhvcihzKTogTWljaGFlbCBIb2x6aGV1IDxob2x6aGV1QGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgorI2luY2x1ZGUgPGFzbS9sb3djb3JlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8YXNtL2lwbC5oPgorCisjZGVmaW5lIFBUUl9BREQoeCwgeSkgKCgoY2hhciAqKSAoeCkpICsgKCh1bnNpZ25lZCBsb25nKSAoeSkpKQorI2RlZmluZSBQVFJfU1VCKHgsIHkpICgoKGNoYXIgKikgKHgpKSAtICgodW5zaWduZWQgbG9uZykgKHkpKSkKKyNkZWZpbmUgUFRSX0RJRkYoeCwgeSkgKCh1bnNpZ25lZCBsb25nKSgoKGNoYXIgKikgKHgpKSAtICgodW5zaWduZWQgbG9uZykgKHkpKSkpCisKKy8qCisgKiBDb3B5IG9uZSBwYWdlIGZyb20gIm9sZG1lbSIKKyAqCisgKiBGb3IgdGhlIGtkdW1wIHJlc2VydmVkIG1lbW9yeSB0aGlzIGZ1bmN0aW9ucyBwZXJmb3JtcyBhIHN3YXAgb3BlcmF0aW9uOgorICogIC0gW09MRE1FTV9CQVNFIC0gT0xETUVNX0JBU0UgKyBPTERNRU1fU0laRV0gaXMgbWFwcGVkIHRvIFswIC0gT0xETUVNX1NJWkVdLgorICogIC0gWzAgLSBPTERNRU1fU0laRV0gaXMgbWFwcGVkIHRvIFtPTERNRU1fQkFTRSAtIE9MRE1FTV9CQVNFICsgT0xETUVNX1NJWkVdCisgKi8KK3NzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQoreworCXVuc2lnbmVkIGxvbmcgc3JjOworCisJaWYgKCFjc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcmMgPSAocGZuIDw8IFBBR0VfU0hJRlQpICsgb2Zmc2V0OworCWlmIChzcmMgPCBPTERNRU1fU0laRSkKKwkJc3JjICs9IE9MRE1FTV9CQVNFOworCWVsc2UgaWYgKHNyYyA+IE9MRE1FTV9CQVNFICYmCisJCSBzcmMgPCBPTERNRU1fQkFTRSArIE9MRE1FTV9TSVpFKQorCQlzcmMgLT0gT0xETUVNX0JBU0U7CisJaWYgKHVzZXJidWYpCisJCWNvcHlfdG9fdXNlcl9yZWFsKCh2b2lkIF9fZm9yY2UgX191c2VyICopIGJ1ZiwgKHZvaWQgKikgc3JjLAorCQkJCSAgY3NpemUpOworCWVsc2UKKwkJbWVtY3B5X3JlYWwoYnVmLCAodm9pZCAqKSBzcmMsIGNzaXplKTsKKwlyZXR1cm4gY3NpemU7Cit9CisKKy8qCisgKiBDb3B5IG1lbW9yeSBmcm9tIG9sZCBrZXJuZWwKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fb2xkbWVtKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgY29waWVkID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpIHNyYyA8IE9MRE1FTV9TSVpFKSB7CisJCWNvcGllZCA9IG1pbihjb3VudCwgT0xETUVNX1NJWkUgLSAodW5zaWduZWQgbG9uZykgc3JjKTsKKwkJcmMgPSBtZW1jcHlfcmVhbChkZXN0LCBzcmMgKyBPTERNRU1fQkFTRSwgY29waWVkKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gbWVtY3B5X3JlYWwoZGVzdCArIGNvcGllZCwgc3JjICsgY29waWVkLCBjb3VudCAtIGNvcGllZCk7Cit9CisKKy8qCisgKiBBbGxvYyBtZW1vcnkgYW5kIHBhbmljIGluIGNhc2Ugb2YgRU5PTUVNCisgKi8KK3N0YXRpYyB2b2lkICpremFsbG9jX3BhbmljKGludCBsZW4pCit7CisJdm9pZCAqcmM7CisKKwlyYyA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJjKQorCQlwYW5pYygiczM5MCBrZHVtcCBremFsbG9jICglZCkgZmFpbGVkIiwgbGVuKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBHZXQgbWVtb3J5IGxheW91dCBhbmQgY3JlYXRlIGhvbGUgZm9yIG9sZG1lbQorICovCitzdGF0aWMgc3RydWN0IG1lbV9jaHVuayAqZ2V0X21lbW9yeV9sYXlvdXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtX2NodW5rICpjaHVua19hcnJheTsKKworCWNodW5rX2FycmF5ID0ga3phbGxvY19wYW5pYyhNRU1PUllfQ0hVTktTICogc2l6ZW9mKHN0cnVjdCBtZW1fY2h1bmspKTsKKwlkZXRlY3RfbWVtb3J5X2xheW91dChjaHVua19hcnJheSk7CisJY3JlYXRlX21lbV9ob2xlKGNodW5rX2FycmF5LCBPTERNRU1fQkFTRSwgT0xETUVNX1NJWkUsIENIVU5LX0NSQVNISyk7CisJcmV0dXJuIGNodW5rX2FycmF5OworfQorCisvKgorICogSW5pdGlhbGl6ZSBFTEYgbm90ZQorICovCitzdGF0aWMgdm9pZCAqbnRfaW5pdCh2b2lkICpidWYsIEVsZjY0X1dvcmQgdHlwZSwgdm9pZCAqZGVzYywgaW50IGRfbGVuLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRWxmNjRfTmhkciAqbm90ZTsKKwl1NjQgbGVuOworCisJbm90ZSA9IChFbGY2NF9OaGRyICopYnVmOworCW5vdGUtPm5fbmFtZXN6ID0gc3RybGVuKG5hbWUpICsgMTsKKwlub3RlLT5uX2Rlc2NzeiA9IGRfbGVuOworCW5vdGUtPm5fdHlwZSA9IHR5cGU7CisJbGVuID0gc2l6ZW9mKEVsZjY0X05oZHIpOworCisJbWVtY3B5KGJ1ZiArIGxlbiwgbmFtZSwgbm90ZS0+bl9uYW1lc3opOworCWxlbiA9IHJvdW5kdXAobGVuICsgbm90ZS0+bl9uYW1lc3osIDQpOworCisJbWVtY3B5KGJ1ZiArIGxlbiwgZGVzYywgbm90ZS0+bl9kZXNjc3opOworCWxlbiA9IHJvdW5kdXAobGVuICsgbm90ZS0+bl9kZXNjc3osIDQpOworCisJcmV0dXJuIFBUUl9BREQoYnVmLCBsZW4pOworfQorCisvKgorICogSW5pdGlhbGl6ZSBwcnN0YXR1cyBub3RlCisgKi8KK3N0YXRpYyB2b2lkICpudF9wcnN0YXR1cyh2b2lkICpwdHIsIHN0cnVjdCBzYXZlX2FyZWEgKnNhKQoreworCXN0cnVjdCBlbGZfcHJzdGF0dXMgbnRfcHJzdGF0dXM7CisJc3RhdGljIGludCBjcHVfbnIgPSAxOworCisJbWVtc2V0KCZudF9wcnN0YXR1cywgMCwgc2l6ZW9mKG50X3Byc3RhdHVzKSk7CisJbWVtY3B5KCZudF9wcnN0YXR1cy5wcl9yZWcuZ3Bycywgc2EtPmdwX3JlZ3MsIHNpemVvZihzYS0+Z3BfcmVncykpOworCW1lbWNweSgmbnRfcHJzdGF0dXMucHJfcmVnLnBzdywgc2EtPnBzdywgc2l6ZW9mKHNhLT5wc3cpKTsKKwltZW1jcHkoJm50X3Byc3RhdHVzLnByX3JlZy5hY3JzLCBzYS0+YWNjX3JlZ3MsIHNpemVvZihzYS0+YWNjX3JlZ3MpKTsKKwludF9wcnN0YXR1cy5wcl9waWQgPSBjcHVfbnI7CisJY3B1X25yKys7CisKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1BSU1RBVFVTLCAmbnRfcHJzdGF0dXMsIHNpemVvZihudF9wcnN0YXR1cyksCisJCQkgIkNPUkUiKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgZnByZWdzZXQgKGZsb2F0aW5nIHBvaW50KSBub3RlCisgKi8KK3N0YXRpYyB2b2lkICpudF9mcHJlZ3NldCh2b2lkICpwdHIsIHN0cnVjdCBzYXZlX2FyZWEgKnNhKQoreworCWVsZl9mcHJlZ3NldF90IG50X2ZwcmVnc2V0OworCisJbWVtc2V0KCZudF9mcHJlZ3NldCwgMCwgc2l6ZW9mKG50X2ZwcmVnc2V0KSk7CisJbWVtY3B5KCZudF9mcHJlZ3NldC5mcGMsICZzYS0+ZnBfY3RybF9yZWcsIHNpemVvZihzYS0+ZnBfY3RybF9yZWcpKTsKKwltZW1jcHkoJm50X2ZwcmVnc2V0LmZwcnMsICZzYS0+ZnBfcmVncywgc2l6ZW9mKHNhLT5mcF9yZWdzKSk7CisKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1BSRlBSRUcsICZudF9mcHJlZ3NldCwgc2l6ZW9mKG50X2ZwcmVnc2V0KSwKKwkJICAgICAgICJDT1JFIik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRpbWVyIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X3MzOTBfdGltZXIodm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1MzOTBfVElNRVIsICZzYS0+dGltZXIsIHNpemVvZihzYS0+dGltZXIpLAorCQkJIEtFWEVDX0NPUkVfTk9URV9OQU1FKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgVE9EIGNsb2NrIGNvbXBhcmF0b3Igbm90ZQorICovCitzdGF0aWMgdm9pZCAqbnRfczM5MF90b2RfY21wKHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpCit7CisJcmV0dXJuIG50X2luaXQocHRyLCBOVF9TMzkwX1RPRENNUCwgJnNhLT5jbGtfY21wLAorCQkgICAgICAgc2l6ZW9mKHNhLT5jbGtfY21wKSwgS0VYRUNfQ09SRV9OT1RFX05BTUUpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBUT0QgcHJvZ3JhbW1hYmxlIHJlZ2lzdGVyIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X3MzOTBfdG9kX3ByZWcodm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1MzOTBfVE9EUFJFRywgJnNhLT50b2RfcmVnLAorCQkgICAgICAgc2l6ZW9mKHNhLT50b2RfcmVnKSwgS0VYRUNfQ09SRV9OT1RFX05BTUUpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBjb250cm9sIHJlZ2lzdGVyIG5vdGUKKyAqLworc3RhdGljIHZvaWQgKm50X3MzOTBfY3Rycyh2b2lkICpwdHIsIHN0cnVjdCBzYXZlX2FyZWEgKnNhKQoreworCXJldHVybiBudF9pbml0KHB0ciwgTlRfUzM5MF9DVFJTLCAmc2EtPmN0cmxfcmVncywKKwkJICAgICAgIHNpemVvZihzYS0+Y3RybF9yZWdzKSwgS0VYRUNfQ09SRV9OT1RFX05BTUUpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBwcmVmaXggcmVnaXN0ZXIgbm90ZQorICovCitzdGF0aWMgdm9pZCAqbnRfczM5MF9wcmVmaXgodm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSkKK3sKKwlyZXR1cm4gbnRfaW5pdChwdHIsIE5UX1MzOTBfUFJFRklYLCAmc2EtPnByZWZfcmVnLAorCQkJIHNpemVvZihzYS0+cHJlZl9yZWcpLCBLRVhFQ19DT1JFX05PVEVfTkFNRSk7Cit9CisKKy8qCisgKiBGaWxsIEVMRiBub3RlcyBmb3Igb25lIENQVSB3aXRoIHNhdmUgYXJlYSByZWdpc3RlcnMKKyAqLwordm9pZCAqZmlsbF9jcHVfZWxmX25vdGVzKHZvaWQgKnB0ciwgc3RydWN0IHNhdmVfYXJlYSAqc2EpCit7CisJcHRyID0gbnRfcHJzdGF0dXMocHRyLCBzYSk7CisJcHRyID0gbnRfZnByZWdzZXQocHRyLCBzYSk7CisJcHRyID0gbnRfczM5MF90aW1lcihwdHIsIHNhKTsKKwlwdHIgPSBudF9zMzkwX3RvZF9jbXAocHRyLCBzYSk7CisJcHRyID0gbnRfczM5MF90b2RfcHJlZyhwdHIsIHNhKTsKKwlwdHIgPSBudF9zMzkwX2N0cnMocHRyLCBzYSk7CisJcHRyID0gbnRfczM5MF9wcmVmaXgocHRyLCBzYSk7CisJcmV0dXJuIHB0cjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgcHJwc2luZm8gbm90ZSAobmV3IGtlcm5lbCkKKyAqLworc3RhdGljIHZvaWQgKm50X3BycHNpbmZvKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgZWxmX3BycHNpbmZvIHBycHNpbmZvOworCisJbWVtc2V0KCZwcnBzaW5mbywgMCwgc2l6ZW9mKHBycHNpbmZvKSk7CisJcHJwc2luZm8ucHJfc25hbWUgPSAnUic7CisJc3RyY3B5KHBycHNpbmZvLnByX2ZuYW1lLCAidm1saW51eCIpOworCXJldHVybiBudF9pbml0KHB0ciwgTlRfUFJQU0lORk8sICZwcnBzaW5mbywgc2l6ZW9mKHBycHNpbmZvKSwKKwkJICAgICAgIEtFWEVDX0NPUkVfTk9URV9OQU1FKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdm1jb3JlaW5mbyBub3RlIChuZXcga2VybmVsKQorICovCitzdGF0aWMgdm9pZCAqbnRfdm1jb3JlaW5mbyh2b2lkICpwdHIpCit7CisJY2hhciBudF9uYW1lWzExXSwgKnZtY29yZWluZm87CisJRWxmNjRfTmhkciBub3RlOworCXZvaWQgKmFkZHI7CisKKwlpZiAoY29weV9mcm9tX29sZG1lbSgmYWRkciwgJlMzOTBfbG93Y29yZS52bWNvcmVfaW5mbywgc2l6ZW9mKGFkZHIpKSkKKwkJcmV0dXJuIHB0cjsKKwltZW1zZXQobnRfbmFtZSwgMCwgc2l6ZW9mKG50X25hbWUpKTsKKwlpZiAoY29weV9mcm9tX29sZG1lbSgmbm90ZSwgYWRkciwgc2l6ZW9mKG5vdGUpKSkKKwkJcmV0dXJuIHB0cjsKKwlpZiAoY29weV9mcm9tX29sZG1lbShudF9uYW1lLCBhZGRyICsgc2l6ZW9mKG5vdGUpLCBzaXplb2YobnRfbmFtZSkgLSAxKSkKKwkJcmV0dXJuIHB0cjsKKwlpZiAoc3RyY21wKG50X25hbWUsICJWTUNPUkVJTkZPIikgIT0gMCkKKwkJcmV0dXJuIHB0cjsKKwl2bWNvcmVpbmZvID0ga3phbGxvY19wYW5pYyhub3RlLm5fZGVzY3N6ICsgMSk7CisJaWYgKGNvcHlfZnJvbV9vbGRtZW0odm1jb3JlaW5mbywgYWRkciArIDI0LCBub3RlLm5fZGVzY3N6KSkKKwkJcmV0dXJuIHB0cjsKKwl2bWNvcmVpbmZvW25vdGUubl9kZXNjc3ogKyAxXSA9IDA7CisJcmV0dXJuIG50X2luaXQocHRyLCAwLCB2bWNvcmVpbmZvLCBub3RlLm5fZGVzY3N6LCAiVk1DT1JFSU5GTyIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBFTEYgaGVhZGVyIChuZXcga2VybmVsKQorICovCitzdGF0aWMgdm9pZCAqZWhkcl9pbml0KEVsZjY0X0VoZHIgKmVoZHIsIGludCBtZW1fY2h1bmtfY250KQoreworCW1lbXNldChlaGRyLCAwLCBzaXplb2YoKmVoZHIpKTsKKwltZW1jcHkoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKTsKKwllaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9IEVMRkNMQVNTNjQ7CisJZWhkci0+ZV9pZGVudFtFSV9EQVRBXSA9IEVMRkRBVEEyTVNCOworCWVoZHItPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBFVl9DVVJSRU5UOworCW1lbXNldChlaGRyLT5lX2lkZW50ICsgRUlfUEFELCAwLCBFSV9OSURFTlQgLSBFSV9QQUQpOworCWVoZHItPmVfdHlwZSA9IEVUX0NPUkU7CisJZWhkci0+ZV9tYWNoaW5lID0gRU1fUzM5MDsKKwllaGRyLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworCWVoZHItPmVfcGhvZmYgPSBzaXplb2YoRWxmNjRfRWhkcik7CisJZWhkci0+ZV9laHNpemUgPSBzaXplb2YoRWxmNjRfRWhkcik7CisJZWhkci0+ZV9waGVudHNpemUgPSBzaXplb2YoRWxmNjRfUGhkcik7CisJZWhkci0+ZV9waG51bSA9IG1lbV9jaHVua19jbnQgKyAxOworCXJldHVybiBlaGRyICsgMTsKK30KKworLyoKKyAqIFJldHVybiBDUFUgY291bnQgZm9yIEVMRiBoZWFkZXIgKG5ldyBrZXJuZWwpCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NwdV9jbnQodm9pZCkKK3sKKwlpbnQgaSwgY3B1cyA9IDA7CisKKwlmb3IgKGkgPSAwOyB6ZmNwZHVtcF9zYXZlX2FyZWFzW2ldOyBpKyspIHsKKwkJaWYgKHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0tPnByZWZfcmVnID09IDApCisJCQljb250aW51ZTsKKwkJY3B1cysrOworCX0KKwlyZXR1cm4gY3B1czsKK30KKworLyoKKyAqIFJldHVybiBtZW1vcnkgY2h1bmsgY291bnQgZm9yIEVMRiBoZWFkZXIgKG5ldyBrZXJuZWwpCisgKi8KK3N0YXRpYyBpbnQgZ2V0X21lbV9jaHVua19jbnQodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtX2NodW5rICpjaHVua19hcnJheSwgKm1lbV9jaHVuazsKKwlpbnQgaSwgY250ID0gMDsKKworCWNodW5rX2FycmF5ID0gZ2V0X21lbW9yeV9sYXlvdXQoKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CisJCW1lbV9jaHVuayA9ICZjaHVua19hcnJheVtpXTsKKwkJaWYgKGNodW5rX2FycmF5W2ldLnR5cGUgIT0gQ0hVTktfUkVBRF9XUklURSAmJgorCQkgICAgY2h1bmtfYXJyYXlbaV0udHlwZSAhPSBDSFVOS19SRUFEX09OTFkpCisJCQljb250aW51ZTsKKwkJaWYgKG1lbV9jaHVuay0+c2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWNudCsrOworCX0KKwlrZnJlZShjaHVua19hcnJheSk7CisJcmV0dXJuIGNudDsKK30KKworLyoKKyAqIFJlbG9jYXRlIHBvaW50ZXIgaW4gb3JkZXIgdG8gYWxsb3cgdm1jb3JlIGNvZGUgYWNjZXNzIHRoZSBkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWxvY2F0ZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIE9MRE1FTV9CQVNFICsgYWRkcjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgRUxGIGxvYWRzIChuZXcga2VybmVsKQorICovCitzdGF0aWMgaW50IGxvYWRzX2luaXQoRWxmNjRfUGhkciAqcGhkciwgdTY0IGxvYWRzX29mZnNldCkKK3sKKwlzdHJ1Y3QgbWVtX2NodW5rICpjaHVua19hcnJheSwgKm1lbV9jaHVuazsKKwlpbnQgaTsKKworCWNodW5rX2FycmF5ID0gZ2V0X21lbW9yeV9sYXlvdXQoKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CisJCW1lbV9jaHVuayA9ICZjaHVua19hcnJheVtpXTsKKwkJaWYgKG1lbV9jaHVuay0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChjaHVua19hcnJheVtpXS50eXBlICE9IENIVU5LX1JFQURfV1JJVEUgJiYKKwkJICAgIGNodW5rX2FycmF5W2ldLnR5cGUgIT0gQ0hVTktfUkVBRF9PTkxZKQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCXBoZHItPnBfZmlsZXN6ID0gbWVtX2NodW5rLT5zaXplOworCQlwaGRyLT5wX3R5cGUgPSBQVF9MT0FEOworCQlwaGRyLT5wX29mZnNldCA9IG1lbV9jaHVuay0+YWRkcjsKKwkJcGhkci0+cF92YWRkciA9IG1lbV9jaHVuay0+YWRkcjsKKwkJcGhkci0+cF9wYWRkciA9IG1lbV9jaHVuay0+YWRkcjsKKwkJcGhkci0+cF9tZW1zeiA9IG1lbV9jaHVuay0+c2l6ZTsKKwkJcGhkci0+cF9mbGFncyA9IFBGX1IgfCBQRl9XIHwgUEZfWDsKKwkJcGhkci0+cF9hbGlnbiA9IFBBR0VfU0laRTsKKwkJcGhkcisrOworCX0KKwlrZnJlZShjaHVua19hcnJheSk7CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIG5vdGVzIChuZXcga2VybmVsKQorICovCitzdGF0aWMgdm9pZCAqbm90ZXNfaW5pdChFbGY2NF9QaGRyICpwaGRyLCB2b2lkICpwdHIsIHU2NCBub3Rlc19vZmZzZXQpCit7CisJc3RydWN0IHNhdmVfYXJlYSAqc2E7CisJdm9pZCAqcHRyX3N0YXJ0ID0gcHRyOworCWludCBpOworCisJcHRyID0gbnRfcHJwc2luZm8ocHRyKTsKKworCWZvciAoaSA9IDA7IHpmY3BkdW1wX3NhdmVfYXJlYXNbaV07IGkrKykgeworCQlzYSA9IHpmY3BkdW1wX3NhdmVfYXJlYXNbaV07CisJCWlmIChzYS0+cHJlZl9yZWcgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlwdHIgPSBmaWxsX2NwdV9lbGZfbm90ZXMocHRyLCBzYSk7CisJfQorCXB0ciA9IG50X3ZtY29yZWluZm8ocHRyKTsKKwltZW1zZXQocGhkciwgMCwgc2l6ZW9mKCpwaGRyKSk7CisJcGhkci0+cF90eXBlID0gUFRfTk9URTsKKwlwaGRyLT5wX29mZnNldCA9IHJlbG9jYXRlKG5vdGVzX29mZnNldCk7CisJcGhkci0+cF9maWxlc3ogPSAodW5zaWduZWQgbG9uZykgUFRSX1NVQihwdHIsIHB0cl9zdGFydCk7CisJcGhkci0+cF9tZW1zeiA9IHBoZHItPnBfZmlsZXN6OworCXJldHVybiBwdHI7Cit9CisKKy8qCisgKiBDcmVhdGUgRUxGIGNvcmUgaGVhZGVyIChuZXcga2VybmVsKQorICovCitzdGF0aWMgdm9pZCBzMzkwX2VsZl9jb3JlaGRyX2NyZWF0ZShjaGFyICoqZWxmY29yZWJ1Ziwgc2l6ZV90ICplbGZjb3JlYnVmX3N6KQoreworCUVsZjY0X1BoZHIgKnBoZHJfbm90ZXMsICpwaGRyX2xvYWRzOworCWludCBtZW1fY2h1bmtfY250OworCXZvaWQgKnB0ciwgKmhkcjsKKwl1MzIgYWxsb2Nfc2l6ZTsKKwl1NjQgaGRyX29mZjsKKworCW1lbV9jaHVua19jbnQgPSBnZXRfbWVtX2NodW5rX2NudCgpOworCisJYWxsb2Nfc2l6ZSA9IDB4MTAwMCArIGdldF9jcHVfY250KCkgKiAweDMwMCArCisJCW1lbV9jaHVua19jbnQgKiBzaXplb2YoRWxmNjRfUGhkcik7CisJaGRyID0ga3phbGxvY19wYW5pYyhhbGxvY19zaXplKTsKKwkvKiBJbml0IGVsZiBoZWFkZXIgKi8KKwlwdHIgPSBlaGRyX2luaXQoaGRyLCBtZW1fY2h1bmtfY250KTsKKwkvKiBJbml0IHByb2dyYW0gaGVhZGVycyAqLworCXBoZHJfbm90ZXMgPSBwdHI7CisJcHRyID0gUFRSX0FERChwdHIsIHNpemVvZihFbGY2NF9QaGRyKSk7CisJcGhkcl9sb2FkcyA9IHB0cjsKKwlwdHIgPSBQVFJfQUREKHB0ciwgc2l6ZW9mKEVsZjY0X1BoZHIpICogbWVtX2NodW5rX2NudCk7CisJLyogSW5pdCBub3RlcyAqLworCWhkcl9vZmYgPSBQVFJfRElGRihwdHIsIGhkcik7CisJcHRyID0gbm90ZXNfaW5pdChwaGRyX25vdGVzLCBwdHIsICgodW5zaWduZWQgbG9uZykgaGRyKSArIGhkcl9vZmYpOworCS8qIEluaXQgbG9hZHMgKi8KKwloZHJfb2ZmID0gUFRSX0RJRkYocHRyLCBoZHIpOworCWxvYWRzX2luaXQocGhkcl9sb2FkcywgKCh1bnNpZ25lZCBsb25nKSBoZHIpICsgaGRyX29mZik7CisJKmVsZmNvcmVidWZfc3ogPSBoZHJfb2ZmOworCSplbGZjb3JlYnVmID0gKHZvaWQgKikgcmVsb2NhdGUoKHVuc2lnbmVkIGxvbmcpIGhkcik7CisJQlVHX09OKCplbGZjb3JlYnVmX3N6ID4gYWxsb2Nfc2l6ZSk7Cit9CisKKy8qCisgKiBDcmVhdGUga2R1bXAgRUxGIGNvcmUgaGVhZGVyIGluIG5ldyBrZXJuZWwsIGlmIGl0IGhhcyBub3QgYmVlbiBwYXNzZWQgdmlhCisgKiB0aGUgImVsZmNvcmVoZHIiIGtlcm5lbCBwYXJhbWV0ZXIKKyAqLworc3RhdGljIGludCBzZXR1cF9rZHVtcF9lbGZjb3JlaGRyKHZvaWQpCit7CisJc2l6ZV90IGVsZmNvcmVidWZfc3o7CisJY2hhciAqZWxmY29yZWJ1ZjsKKworCWlmICghT0xETUVNX0JBU0UgfHwgaXNfa2R1bXBfa2VybmVsKCkpCisJCXJldHVybiAtRUlOVkFMOworCXMzOTBfZWxmX2NvcmVoZHJfY3JlYXRlKCZlbGZjb3JlYnVmLCAmZWxmY29yZWJ1Zl9zeik7CisJZWxmY29yZWhkcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgZWxmY29yZWJ1ZjsKKwllbGZjb3JlaGRyX3NpemUgPSBlbGZjb3JlYnVmX3N6OworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwoc2V0dXBfa2R1bXBfZWxmY29yZWhkcik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKaW5kZXggZjI5NzQ1Ni4uMzczOTRiMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwpAQCAtMjUyLDcgKzI1Miw3IEBACiB7CiAJcHN3X3QgcHN3OwogCi0JcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCXBzdy5tYXNrID0gUFNXX01BU0tfQkFTRSB8IFBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7CiAJcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBzMzkwX2Jhc2VfZXh0X2hhbmRsZXI7CiAJUzM5MF9sb3djb3JlLmV4dGVybmFsX25ld19wc3cgPSBwc3c7CiAJcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBzMzkwX2Jhc2VfcGdtX2hhbmRsZXI7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggMDJlYzhmZS4uYjEzMTU3MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtNDMsMTYgKzQzLDE1IEBACiBTUF9SMTQJICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9HUFJTICsgNTYKIFNQX1IxNQkgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX0dQUlMgKyA2MAogU1BfT1JJR19SMiAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX09SSUdfR1BSMgotU1BfSUxDCSAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfSUxDCi1TUF9TVkNOUiAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU1ZDTlIKK1NQX1NWQ19DT0RFICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TVkNfQ09ERQogU1BfU0laRSAgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1NJWkUKIAogX1RJRl9XT1JLX1NWQyA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX05FRURfUkVTQ0hFRCB8IFwKLQkJIF9USUZfTUNDS19QRU5ESU5HIHwgX1RJRl9SRVNUQVJUX1NWQyB8IF9USUZfUEVSX1RSQVAgKQorCQkgX1RJRl9NQ0NLX1BFTkRJTkcgfCBfVElGX1BFUl9UUkFQICkKIF9USUZfV09SS19JTlQgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCiAJCSBfVElGX01DQ0tfUEVORElORykKLV9USUZfU1lTQ0FMTCA9IChfVElGX1NZU0NBTExfVFJBQ0U+PjggfCBfVElGX1NZU0NBTExfQVVESVQ+PjggfCBcCi0JCV9USUZfU0VDQ09NUD4+OCB8IF9USUZfU1lTQ0FMTF9UUkFDRVBPSU5UPj44KQorX1RJRl9UUkFDRSAgICA9IChfVElGX1NZU0NBTExfVFJBQ0UgfCBfVElGX1NZU0NBTExfQVVESVQgfCBfVElGX1NFQ0NPTVAgfCBcCisJCSBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVCkKIAogU1RBQ0tfU0hJRlQgPSBQQUdFX1NISUZUICsgVEhSRUFEX09SREVSCiBTVEFDS19TSVpFICA9IDEgPDwgU1RBQ0tfU0hJRlQKQEAgLTIyOCw5ICsyMjcsMTAgQEAKIHN5c2Nfc2F2ZWFsbDoKIAlTQVZFX0FMTF9TVkMgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCi0JbXZjCVNQX0lMQyg0LCVyMTUpLF9fTENfU1ZDX0lMQwogCWwJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCisJbXZjCVNQX1NWQ19DT0RFKDQsJXIxNSksX19MQ19TVkNfSUxDCisJb2kJX19USV9mbGFncyszKCVyMTIpLF9USUZfU1lTQ0FMTAogc3lzY192dGltZToKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfU1lOQ19FTlRFUl9USU1FUixfX0xDX1VTRVJfVElNRVIKIHN5c2Nfc3RpbWU6CkBAIC0yMzksMTcgKzIzOSwxNyBAQAogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgogc3lzY19kb19zdmM6CiAJeHIJJXI3LCVyNwotCWljbQklcjcsMyxTUF9TVkNOUiglcjE1KQkjIGxvYWQgc3ZjIG51bWJlciBhbmQgdGVzdCBmb3Igc3ZjIDAKKwlpY20JJXI3LDMsU1BfU1ZDX0NPREUrMiglcjE1KSMgbG9hZCBzdmMgbnVtYmVyIGFuZCB0ZXN0IGZvciBzdmMgMAogCWJueglCQVNFRChzeXNjX25yX29rKQkjIHN2YyBudW1iZXIgPiAwCiAJIyBzdmMgMDogc3lzdGVtIGNhbGwgbnVtYmVyIGluICVyMQogCWNsCSVyMSxCQVNFRCguTG5yX3N5c2NhbGxzKQogCWJubAlCQVNFRChzeXNjX25yX29rKQotCXN0aAklcjEsU1BfU1ZDTlIoJXIxNSkKKwlzdGgJJXIxLFNQX1NWQ19DT0RFKzIoJXIxNSkKIAlscgklcjcsJXIxIAkgICMgY29weSBzdmMgbnVtYmVyIHRvICVyNwogc3lzY19ucl9vazoKIAlzbGwJJXI3LDIJCSAgIyBzdmMgbnVtYmVyICo0CiAJbAklcjEwLEJBU0VEKC5Mc3lzY190YWJsZSkKLQl0bQlfX1RJX2ZsYWdzKzIoJXIxMiksX1RJRl9TWVNDQUxMCisJdG0JX19USV9mbGFncysyKCVyMTIpLF9USUZfVFJBQ0UgPj4gOAogCW12YwlTUF9BUkdTKDQsJXIxNSksU1BfUjcoJXIxNSkKIAlsCSVyOCwwKCVyNywlcjEwKQkgICMgZ2V0IHN5c3RlbSBjYWxsIGFkZHIuCiAJYm56CUJBU0VEKHN5c2NfdHJhY2VzeXMpCkBAIC0yNTksMjMgKzI1OSwxOSBAQAogc3lzY19yZXR1cm46CiAJTE9DS0RFUF9TWVNfRVhJVAogc3lzY190aWY6CisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KKwlibm8JQkFTRUQoc3lzY19yZXN0b3JlKQogCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1dPUktfU1ZDCiAJYm56CUJBU0VEKHN5c2Nfd29yaykgICMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQorCW5pCV9fVElfZmxhZ3MrMyglcjEyKSwyNTUtX1RJRl9TWVNDQUxMCiBzeXNjX3Jlc3RvcmU6CiAJUkVTVE9SRV9BTEwgX19MQ19SRVRVUk5fUFNXLDEKIHN5c2NfZG9uZToKIAogIwotIyBUaGVyZSBpcyB3b3JrIHRvIGRvLCBidXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSByZXR1cm4gdG8gdXNlcnNwYWNlLgotIwotc3lzY193b3JrOgotCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/Ci0JYm5vCUJBU0VEKHN5c2NfcmVzdG9yZSkKLQotIwogIyBPbmUgb2YgdGhlIHdvcmsgYml0cyBpcyBvbi4gRmluZCBvdXQgd2hpY2ggb25lLgogIwotc3lzY193b3JrX3RpZjoKK3N5c2Nfd29yazoKIAl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9NQ0NLX1BFTkRJTkcKIAlibwlCQVNFRChzeXNjX21jY2tfcGVuZGluZykKIAl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9ORUVEX1JFU0NIRUQKQEAgLTI4NCw4ICsyODAsNiBAQAogCWJvCUJBU0VEKHN5c2Nfc2lncGVuZGluZykKIAl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9OT1RJRllfUkVTVU1FCiAJYm8JQkFTRUQoc3lzY19ub3RpZnlfcmVzdW1lKQotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1JFU1RBUlRfU1ZDCi0JYm8JQkFTRUQoc3lzY19yZXN0YXJ0KQogCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1BFUl9UUkFQCiAJYm8JQkFTRUQoc3lzY19zaW5nbGVzdGVwKQogCWIJQkFTRUQoc3lzY19yZXR1cm4pCSMgYmV3YXJlIG9mIGNyaXRpY2FsIHNlY3Rpb24gY2xlYW51cApAQCAtMzE0LDExICszMDgsMTQgQEAKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCiAJbAklcjEsQkFTRUQoLkxkb19zaWduYWwpCiAJYmFzcgklcjE0LCVyMQkJIyBjYWxsIGRvX3NpZ25hbAotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1JFU1RBUlRfU1ZDCi0JYm8JQkFTRUQoc3lzY19yZXN0YXJ0KQotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1BFUl9UUkFQCi0JYm8JQkFTRUQoc3lzY19zaW5nbGVzdGVwKQotCWIJQkFTRUQoc3lzY19yZXR1cm4pCisJdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfU1lTQ0FMTAorCWJubwlCQVNFRChzeXNjX3JldHVybikKKwlsbQklcjIsJXI2LFNQX1IyKCVyMTUpCSMgbG9hZCBzdmMgYXJndW1lbnRzCisJeHIJJXI3LCVyNwkJCSMgc3ZjIDAgcmV0dXJucyAtRU5PU1lTCisJY2xjCVNQX1NWQ19DT0RFKzIoMiwlcjE1KSxCQVNFRCguTG5yX3N5c2NhbGxzKzIpCisJYm5sCUJBU0VEKHN5c2NfbnJfb2spCSMgaW52YWxpZCBzdmMgbnVtYmVyIC0+IGRvIHN2YyAwCisJaWNtCSVyNywzLFNQX1NWQ19DT0RFKzIoJXIxNSkjIGxvYWQgbmV3IHN2YyBudW1iZXIKKwliCUJBU0VEKHN5c2NfbnJfb2spCSMgcmVzdGFydCBzdmMKIAogIwogIyBfVElGX05PVElGWV9SRVNVTUUgaXMgc2V0LCBjYWxsIGRvX25vdGlmeV9yZXN1bWUKQEAgLTMyOSwyNCArMzI2LDExIEBACiAJbGEJJXIxNCxCQVNFRChzeXNjX3JldHVybikKIAlicgklcjEJCQkjIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQogCi0KLSMKLSMgX1RJRl9SRVNUQVJUX1NWQyBpcyBzZXQsIHNldCB1cCByZWdpc3RlcnMgYW5kIHJlc3RhcnQgc3ZjCi0jCi1zeXNjX3Jlc3RhcnQ6Ci0JbmkJX19USV9mbGFncyszKCVyMTIpLDI1NS1fVElGX1JFU1RBUlRfU1ZDICMgY2xlYXIgVElGX1JFU1RBUlRfU1ZDCi0JbAklcjcsU1BfUjIoJXIxNSkgCSMgbG9hZCBuZXcgc3ZjIG51bWJlcgotCW12YwlTUF9SMig0LCVyMTUpLFNQX09SSUdfUjIoJXIxNSkgIyByZXN0b3JlIGZpcnN0IGFyZ3VtZW50Ci0JbG0JJXIyLCVyNixTUF9SMiglcjE1KQkjIGxvYWQgc3ZjIGFyZ3VtZW50cwotCXN0aAklcjcsU1BfU1ZDTlIoJXIxNSkKLQliCUJBU0VEKHN5c2NfbnJfb2spCSMgcmVzdGFydCBzdmMKLQogIwogIyBfVElGX1BFUl9UUkFQIGlzIHNldCwgY2FsbCBkb19wZXJfdHJhcAogIwogc3lzY19zaW5nbGVzdGVwOgotCW5pCV9fVElfZmxhZ3MrMyglcjEyKSwyNTUtX1RJRl9QRVJfVFJBUCAjIGNsZWFyIFRJRl9QRVJfVFJBUAotCXhjCVNQX1NWQ05SKDIsJXIxNSksU1BfU1ZDTlIoJXIxNSkJCSMgY2xlYXIgc3ZjIG51bWJlcgorCW5pCV9fVElfZmxhZ3MrMyglcjEyKSwyNTUtKF9USUZfU1lTQ0FMTCB8IF9USUZfUEVSX1RSQVApCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCiAJbAklcjEsQkFTRUQoLkxoYW5kbGVfcGVyKQkjIGxvYWQgYWRyLiBvZiBwZXIgaGFuZGxlcgogCWxhCSVyMTQsQkFTRUQoc3lzY19yZXR1cm4pCSMgbG9hZCBhZHIuIG9mIHN5c3RlbSByZXR1cm4KQEAgLTM2MSw3ICszNDUsNyBAQAogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKIAlsYQklcjMsMAogCXhyCSVyMCwlcjAKLQlpY20JJXIwLDMsU1BfU1ZDTlIoJXIxNSkKKwlpY20JJXIwLDMsU1BfU1ZDX0NPREUoJXIxNSkKIAlzdAklcjAsU1BfUjIoJXIxNSkKIAliYXNyCSVyMTQsJXIxCiAJY2wJJXIyLEJBU0VEKC5MbnJfc3lzY2FsbHMpCkBAIC0zNzYsNyArMzYwLDcgQEAKIAliYXNyCSVyMTQsJXI4CQkjIGNhbGwgc3lzX3h4eAogCXN0CSVyMixTUF9SMiglcjE1KQkJIyBzdG9yZSByZXR1cm4gdmFsdWUKIHN5c2NfdHJhY2Vub2dvOgotCXRtCV9fVElfZmxhZ3MrMiglcjEyKSxfVElGX1NZU0NBTEwKKwl0bQlfX1RJX2ZsYWdzKzIoJXIxMiksX1RJRl9UUkFDRSA+PiA4CiAJYnoJQkFTRUQoc3lzY19yZXR1cm4pCiAJbAklcjEsQkFTRUQoLkx0cmFjZV9leGl0KQogCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKQEAgLTQ1NCw3ICs0MzgsNiBAQAogCWJueglCQVNFRChwZ21fcGVyKQkJIyBnb3QgcGVyIGV4Y2VwdGlvbiAtPiBzcGVjaWFsIGNhc2UKIAlTQVZFX0FMTF9QR00gX19MQ19QR01fT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCXhjCVNQX0lMQyg0LCVyMTUpLFNQX0lMQyglcjE1KQogCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1BHTV9PTERfUFNXCiAJbAklcjEyLF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CiAJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwpAQCAtNTMwLDkgKzUxMywxMCBAQAogcGdtX3N2Y3BlcjoKIAlTQVZFX0FMTF9QR00gX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCi0JbXZjCVNQX0lMQyg0LCVyMTUpLF9fTENfU1ZDX0lMQwogCWwJJXIxMixfX0xDX1RIUkVBRF9JTkZPCSMgbG9hZCBwb2ludGVyIHRvIHRocmVhZF9pbmZvIHN0cnVjdAorCW12YwlTUF9QU1coOCwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCisJbXZjCVNQX1NWQ19DT0RFKDQsJXIxNSksX19MQ19TVkNfSUxDCisJb2kJX19USV9mbGFncyszKCVyMTIpLChfVElGX1NZU0NBTEwgfCBfVElGX1BFUl9UUkFQKQogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgogCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgpAQCAtNTQwLDcgKzUyNCw2IEBACiAJbXZjCV9fVEhSRUFEX3Blcl9jYXVzZSgyLCVyOCksX19MQ19QRVJfQ0FVU0UKIAltdmMJX19USFJFQURfcGVyX2FkZHJlc3MoNCwlcjgpLF9fTENfUEVSX0FERFJFU1MKIAltdmMJX19USFJFQURfcGVyX3BhaWQoMSwlcjgpLF9fTENfUEVSX1BBSUQKLQlvaQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9QRVJfVFJBUCAjIHNldCBUSUZfUEVSX1RSQVAKIAlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCiAJbG0JJXIyLCVyNixTUF9SMiglcjE1KQkjIGxvYWQgc3ZjIGFyZ3VtZW50cwogCWIJQkFTRUQoc3lzY19kb19zdmMpCkBAIC01NTAsNyArNTMzLDYgQEAKICMKIGtlcm5lbF9wZXI6CiAJUkVFTkFCTEVfSVJRUwotCXhjCVNQX1NWQ05SKDIsJXIxNSksU1BfU1ZDTlIoJXIxNSkKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgYWRkcmVzcyBvZiByZWdpc3Rlci1zYXZlIGFyZWEKIAlsCSVyMSxCQVNFRCguTGhhbmRsZV9wZXIpCSMgbG9hZCBhZHIuIG9mIHBlciBoYW5kbGVyCiAJYmFzcgklcjE0LCVyMQkJIyBicmFuY2ggdG8gZG9fc2luZ2xlX3N0ZXAKQEAgLTg1MywxMyArODM1LDEzIEBACiAjIFBTVyByZXN0YXJ0IGludGVycnVwdCBoYW5kbGVyCiAjCiBFTlRSWShwc3dfcmVzdGFydF9pbnRfaGFuZGxlcikKLQlzdAklcjE1LF9fTENfU0FWRV9BUkVBXzY0KCVyMCkJIyBzYXZlIHIxNQorCXN0CSVyMTUsX19MQ19TQVZFX0FSRUErNDgoJXIwKQkjIHNhdmUgcjE1CiAJYmFzcgklcjE1LDAKIDA6CWwJJXIxNSwuTHJlc3RhcnRfc3RhY2stMGIoJXIxNSkJIyBsb2FkIHJlc3RhcnQgc3RhY2sKIAlsCSVyMTUsMCglcjE1KQogCWFoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKIAlzdG0JJXIwLCVyMTQsU1BfUjAoJXIxNSkJCSMgc3RvcmUgZ3BycyAlcjAtJXIxNCB0byBzdGFjawotCW12YwlTUF9SMTUoNCwlcjE1KSxfX0xDX1NBVkVfQVJFQV82NCglcjApIyBzdG9yZSBzYXZlZCAlcjE1IHRvIHN0YWNrCisJbXZjCVNQX1IxNSg0LCVyMTUpLF9fTENfU0FWRV9BUkVBKzQ4KCVyMCkjIHN0b3JlIHNhdmVkICVyMTUgdG8gc3RhY2sKIAltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19SU1RfT0xEX1BTVyglcjApICMgc3RvcmUgcmVzdGFydCBvbGQgcHN3CiAJeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KSAjIHNldCBiYWNrY2hhaW4gdG8gMAogCWJhc3IJJXIxNCwwCkBAIC05NjUsOSArOTQ3LDExIEBACiAJcwklcjE1LEJBU0VEKC5MY19zcHNpemUpCSMgbWFrZSByb29tIGZvciByZWdpc3RlcnMgJiBwc3cKIAlzdAklcjE1LDEyKCVyMTIpCiAJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU0FWRV9BUkVBCi0JbXZjCVNQX1BTVyg4LCVyMTUpLF9fTENfU1ZDX09MRF9QU1cKLQltdmMJU1BfSUxDKDQsJXIxNSksX19MQ19TVkNfSUxDCiAJbXZjCTAoNCwlcjEyKSxfX0xDX1RIUkVBRF9JTkZPCisJbAklcjEyLF9fTENfVEhSRUFEX0lORk8KKwltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19TVkNfT0xEX1BTVworCW12YwlTUF9TVkNfQ09ERSg0LCVyMTUpLF9fTENfU1ZDX0lMQworCW9pCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1NZU0NBTEwKIGNsZWFudXBfdnRpbWU6CiAJY2xjCV9fTENfUkVUVVJOX1BTVys0KDQpLEJBU0VEKGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisxMikKIAliaGUJQkFTRUQoY2xlYW51cF9zdGltZSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaCBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaAppbmRleCA2NjcyOWViLi5lZjhmYjFkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCkBAIC01LDI0ICs1LDMzIEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCisKK2V4dGVybiB2b2lkICgqcGdtX2NoZWNrX3RhYmxlWzEyOF0pKHN0cnVjdCBwdF9yZWdzICosIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgKnJlc3RhcnRfc3RhY2s7CisKK2FzbWxpbmthZ2UgbG9uZyBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2FzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlX2V4aXQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCiB2b2lkIGRvX3Byb3RlY3Rpb25fZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICosIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBkb19kYXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICosIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBkb19hc2NlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIAotZXh0ZXJuIGludCBzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWc7Ci0KIHZvaWQgZG9fcGVyX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBzeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZW50cnlleGl0KTsKIHZvaWQga2VybmVsX3N0YWNrX292ZXJmbG93KHN0cnVjdCBwdF9yZWdzICogcmVncyk7CiB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBpbnQgaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAogCQkgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiB2b2lkIGRvX2V4dGludChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBkb19yZXN0YXJ0KHZvaWQpOwogaW50IF9fY3B1aW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCAqY3B1dm9pZCk7CiB2b2lkIF9faW5pdCBzdGFydHVwX2luaXQodm9pZCk7CiB2b2lkIGRpZShjb25zdCBjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKTsKIAordm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpOworCiBzdHJ1Y3QgczM5MF9tbWFwX2FyZ19zdHJ1Y3Q7CiBzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3M7CiBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbjsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKaW5kZXggNzEzZGEwNy4uODNhOTM3NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTQzLDE5ICs0MywxOCBAQAogU1BfUjE0CSAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDExMgogU1BfUjE1CSAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfR1BSUyArIDEyMAogU1BfT1JJR19SMiAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX09SSUdfR1BSMgotU1BfSUxDCSAgICAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfSUxDCi1TUF9TVkNOUiAgICAgID0JU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1NWQ05SCitTUF9TVkNfQ09ERSAgPQlTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU1ZDX0NPREUKIFNQX1NJWkUgICAgICA9CVNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFCiAKIFNUQUNLX1NISUZUID0gUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUgogU1RBQ0tfU0laRSAgPSAxIDw8IFNUQUNLX1NISUZUCiAKIF9USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9OT1RJRllfUkVTVU1FIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCi0JCSBfVElGX01DQ0tfUEVORElORyB8IF9USUZfUkVTVEFSVF9TVkMgfCBfVElGX1BFUl9UUkFQICkKKwkJIF9USUZfTUNDS19QRU5ESU5HIHwgX1RJRl9QRVJfVFJBUCApCiBfVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAogCQkgX1RJRl9NQ0NLX1BFTkRJTkcpCi1fVElGX1NZU0NBTEwgPSAoX1RJRl9TWVNDQUxMX1RSQUNFPj44IHwgX1RJRl9TWVNDQUxMX0FVRElUPj44IHwgXAotCQlfVElGX1NFQ0NPTVA+PjggfCBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVD4+OCkKK19USUZfVFJBQ0UgICAgPSAoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TWVNDQUxMX0FVRElUIHwgX1RJRl9TRUNDT01QIHwgXAorCQkgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCiBfVElGX0VYSVRfU0lFID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgX1RJRl9NQ0NLX1BFTkRJTkcpCiAKICNkZWZpbmUgQkFTRUQobmFtZSkgbmFtZS1zeXN0ZW1fY2FsbCglcjEzKQpAQCAtMjQ5LDkgKzI0OCwxMCBAQAogc3lzY19zYXZlYWxsOgogCVNBVkVfQUxMX1NWQyBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU0FWRV9BUkVBCi0JbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCi0JbXZjCVNQX0lMQyg0LCVyMTUpLF9fTENfU1ZDX0lMQwogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwltdmMJU1BfUFNXKDE2LCVyMTUpLF9fTENfU1ZDX09MRF9QU1cKKwltdmMJU1BfU1ZDX0NPREUoNCwlcjE1KSxfX0xDX1NWQ19JTEMKKwlvaQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9TWVNDQUxMCiBzeXNjX3Z0aW1lOgogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgogc3lzY19zdGltZToKQEAgLTI2MCwxNCArMjYwLDE0IEBACiAJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19TWU5DX0VOVEVSX1RJTUVSCiAJTEFTVF9CUkVBSwogc3lzY19kb19zdmM6Ci0JbGxnaAklcjcsU1BfU1ZDTlIoJXIxNSkKKwlsbGdoCSVyNyxTUF9TVkNfQ09ERSsyKCVyMTUpCiAJc2xhZwklcjcsJXI3LDIJIyBzaGlmdCBhbmQgdGVzdCBmb3Igc3ZjIDAKIAlqbnoJc3lzY19ucl9vawogCSMgc3ZjIDA6IHN5c3RlbSBjYWxsIG51bWJlciBpbiAlcjEKIAlsbGdmcgklcjEsJXIxCQkjIGNsZWFyIGhpZ2ggd29yZCBpbiByMQogCWNnaGkJJXIxLE5SX3N5c2NhbGxzCiAJam5sCXN5c2NfbnJfb2sKLQlzdGgJJXIxLFNQX1NWQ05SKCVyMTUpCisJc3RoCSVyMSxTUF9TVkNfQ09ERSsyKCVyMTUpCiAJc2xhZwklcjcsJXIxLDIJIyBzaGlmdCBhbmQgdGVzdCBmb3Igc3ZjIDAKIHN5c2NfbnJfb2s6CiAJbGFybAklcjEwLHN5c19jYWxsX3RhYmxlCkBAIC0yNzcsNyArMjc3LDcgQEAKIAlsYXJsCSVyMTAsc3lzX2NhbGxfdGFibGVfZW11ICAjIHVzZSAzMSBiaXQgZW11bGF0aW9uIHN5c3RlbSBjYWxscwogc3lzY19ub2VtdToKICNlbmRpZgotCXRtCV9fVElfZmxhZ3MrNiglcjEyKSxfVElGX1NZU0NBTEwKKwl0bQlfX1RJX2ZsYWdzKzYoJXIxMiksX1RJRl9UUkFDRSA+PiA4CiAJbXZjCVNQX0FSR1MoOCwlcjE1KSxTUF9SNyglcjE1KQogCWxnZgklcjgsMCglcjcsJXIxMCkgIyBsb2FkIGFkZHJlc3Mgb2Ygc3lzdGVtIGNhbGwgcm91dGluZQogCWpueglzeXNjX3RyYWNlc3lzCkBAIC0yODcsMjMgKzI4NywxOSBAQAogc3lzY19yZXR1cm46CiAJTE9DS0RFUF9TWVNfRVhJVAogc3lzY190aWY6CisJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KKwlqbm8Jc3lzY19yZXN0b3JlCiAJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfV09SS19TVkMKIAlqbnoJc3lzY193b3JrCSMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQorCW5pCV9fVElfZmxhZ3MrNyglcjEyKSwyNTUtX1RJRl9TWVNDQUxMCiBzeXNjX3Jlc3RvcmU6CiAJUkVTVE9SRV9BTEwgX19MQ19SRVRVUk5fUFNXLDEKIHN5c2NfZG9uZToKIAogIwotIyBUaGVyZSBpcyB3b3JrIHRvIGRvLCBidXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSByZXR1cm4gdG8gdXNlcnNwYWNlLgotIwotc3lzY193b3JrOgotCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/Ci0Jam5vCXN5c2NfcmVzdG9yZQotCi0jCiAjIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCiAjCi1zeXNjX3dvcmtfdGlmOgorc3lzY193b3JrOgogCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX01DQ0tfUEVORElORwogCWpvCXN5c2NfbWNja19wZW5kaW5nCiAJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfTkVFRF9SRVNDSEVECkBAIC0zMTIsOCArMzA4LDYgQEAKIAlqbwlzeXNjX3NpZ3BlbmRpbmcKIAl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9OT1RJRllfUkVTVU1FCiAJam8Jc3lzY19ub3RpZnlfcmVzdW1lCi0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfUkVTVEFSVF9TVkMKLQlqbwlzeXNjX3Jlc3RhcnQKIAl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9QRVJfVFJBUAogCWpvCXN5c2Nfc2luZ2xlc3RlcAogCWoJc3lzY19yZXR1cm4JCSMgYmV3YXJlIG9mIGNyaXRpY2FsIHNlY3Rpb24gY2xlYW51cApAQCAtMzM5LDExICszMzMsMTUgQEAKIAluaQlfX1RJX2ZsYWdzKzcoJXIxMiksMjU1LV9USUZfUEVSX1RSQVAgIyBjbGVhciBUSUZfUEVSX1RSQVAKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCiAJYnJhc2wJJXIxNCxkb19zaWduYWwJCSMgY2FsbCBkb19zaWduYWwKLQl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9SRVNUQVJUX1NWQwotCWpvCXN5c2NfcmVzdGFydAotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1BFUl9UUkFQCi0Jam8Jc3lzY19zaW5nbGVzdGVwCi0JaglzeXNjX3JldHVybgorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1NZU0NBTEwKKwlqbm8Jc3lzY19yZXR1cm4KKwlsbWcJJXIyLCVyNixTUF9SMiglcjE1KQkjIGxvYWQgc3ZjIGFyZ3VtZW50cworCWxnaGkJJXI3LDAJCQkjIHN2YyAwIHJldHVybnMgLUVOT1NZUworCWxoCSVyMSxTUF9TVkNfQ09ERSsyKCVyMTUpCSMgbG9hZCBuZXcgc3ZjIG51bWJlcgorCWNnaGkJJXIxLE5SX3N5c2NhbGxzCisJam5sCXN5c2NfbnJfb2sJCSMgaW52YWxpZCBzdmMgbnVtYmVyIC0+IGRvIHN2YyAwCisJc2xhZwklcjcsJXIxLDIKKwlqCXN5c2NfbnJfb2sJCSMgcmVzdGFydCBzdmMKIAogIwogIyBfVElGX05PVElGWV9SRVNVTUUgaXMgc2V0LCBjYWxsIGRvX25vdGlmeV9yZXN1bWUKQEAgLTM1NCwyMyArMzUyLDEwIEBACiAJamcJZG9fbm90aWZ5X3Jlc3VtZQkjIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQogCiAjCi0jIF9USUZfUkVTVEFSVF9TVkMgaXMgc2V0LCBzZXQgdXAgcmVnaXN0ZXJzIGFuZCByZXN0YXJ0IHN2YwotIwotc3lzY19yZXN0YXJ0OgotCW5pCV9fVElfZmxhZ3MrNyglcjEyKSwyNTUtX1RJRl9SRVNUQVJUX1NWQyAjIGNsZWFyIFRJRl9SRVNUQVJUX1NWQwotCWxnCSVyNyxTUF9SMiglcjE1KQkJIyBsb2FkIG5ldyBzdmMgbnVtYmVyCi0JbXZjCVNQX1IyKDgsJXIxNSksU1BfT1JJR19SMiglcjE1KSAjIHJlc3RvcmUgZmlyc3QgYXJndW1lbnQKLQlsbWcJJXIyLCVyNixTUF9SMiglcjE1KQkjIGxvYWQgc3ZjIGFyZ3VtZW50cwotCXN0aAklcjcsU1BfU1ZDTlIoJXIxNSkKLQlzbGFnCSVyNywlcjcsMgotCWoJc3lzY19ucl9vawkJIyByZXN0YXJ0IHN2YwotCi0jCiAjIF9USUZfUEVSX1RSQVAgaXMgc2V0LCBjYWxsIGRvX3Blcl90cmFwCiAjCiBzeXNjX3NpbmdsZXN0ZXA6Ci0JbmkJX19USV9mbGFncys3KCVyMTIpLDI1NS1fVElGX1BFUl9UUkFQCSMgY2xlYXIgVElGX1BFUl9UUkFQCi0JeGMJU1BfU1ZDTlIoMiwlcjE1KSxTUF9TVkNOUiglcjE1KQkJIyBjbGVhciBzdmMgbnVtYmVyCisJbmkJX19USV9mbGFncys3KCVyMTIpLDI1NS0oX1RJRl9TWVNDQUxMIHwgX1RJRl9QRVJfVFJBUCkKIAlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgYWRkcmVzcyBvZiByZWdpc3Rlci1zYXZlIGFyZWEKIAlsYXJsCSVyMTQsc3lzY19yZXR1cm4JIyBsb2FkIGFkci4gb2Ygc3lzdGVtIHJldHVybgogCWpnCWRvX3Blcl90cmFwCkBAIC0zODIsNyArMzY3LDcgQEAKIHN5c2NfdHJhY2VzeXM6CiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWxhCSVyMywwCi0JbGxnaAklcjAsU1BfU1ZDTlIoJXIxNSkKKwlsbGdoCSVyMCxTUF9TVkNfQ09ERSsyKCVyMTUpCiAJc3RnCSVyMCxTUF9SMiglcjE1KQogCWJyYXNsCSVyMTQsZG9fc3lzY2FsbF90cmFjZV9lbnRlcgogCWxnaGkJJXIwLE5SX3N5c2NhbGxzCkBAIC0zOTcsNyArMzgyLDcgQEAKIAliYXNyCSVyMTQsJXI4CQkjIGNhbGwgc3lzX3h4eAogCXN0ZwklcjIsU1BfUjIoJXIxNSkJCSMgc3RvcmUgcmV0dXJuIHZhbHVlCiBzeXNjX3RyYWNlbm9nbzoKLQl0bQlfX1RJX2ZsYWdzKzYoJXIxMiksX1RJRl9TWVNDQUxMCisJdG0JX19USV9mbGFncys2KCVyMTIpLF9USUZfVFJBQ0UgPj4gOAogCWp6CXN5c2NfcmV0dXJuCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwogCWxhcmwJJXIxNCxzeXNjX3JldHVybgkjIHJldHVybiBwb2ludCBpcyBzeXNjX3JldHVybgpAQCAtNDcwLDcgKzQ1NSw2IEBACiAJam56CXBnbV9wZXIgCQkgIyBnb3QgcGVyIGV4Y2VwdGlvbiAtPiBzcGVjaWFsIGNhc2UKIAlTQVZFX0FMTF9QR00gX19MQ19QR01fT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCXhjCVNQX0lMQyg0LCVyMTUpLFNQX0lMQyglcjE1KQogCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19QR01fT0xEX1BTVwogCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKIAlIQU5ETEVfU0lFX0lOVEVSQ0VQVApAQCAtNTUwLDkgKzUzNCwxMCBAQAogcGdtX3N2Y3BlcjoKIAlTQVZFX0FMTF9QR00gX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NBVkVfQVJFQQotCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlTUF9JTEMoNCwlcjE1KSxfX0xDX1NWQ19JTEMKIAlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8JIyBsb2FkIHBvaW50ZXIgdG8gdGhyZWFkX2luZm8gc3RydWN0CisJbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCisJbXZjCVNQX1NWQ19DT0RFKDQsJXIxNSksX19MQ19TVkNfSUxDCisJb2kJX19USV9mbGFncys3KCVyMTIpLChfVElGX1NZU0NBTEwgfCBfVElGX1BFUl9UUkFQKQogCVVQREFURV9WVElNRSBfX0xDX0VYSVRfVElNRVIsX19MQ19TWU5DX0VOVEVSX1RJTUVSLF9fTENfVVNFUl9USU1FUgogCVVQREFURV9WVElNRSBfX0xDX0xBU1RfVVBEQVRFX1RJTUVSLF9fTENfRVhJVF9USU1FUixfX0xDX1NZU1RFTV9USU1FUgogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgpAQCAtNTYxLDcgKzU0Niw2IEBACiAJbXZjCV9fVEhSRUFEX3Blcl9jYXVzZSgyLCVyOCksX19MQ19QRVJfQ0FVU0UKIAltdmMJX19USFJFQURfcGVyX2FkZHJlc3MoOCwlcjgpLF9fTENfUEVSX0FERFJFU1MKIAltdmMJX19USFJFQURfcGVyX3BhaWQoMSwlcjgpLF9fTENfUEVSX1BBSUQKLQlvaQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9QRVJfVFJBUCAjIHNldCBUSUZfUEVSX1RSQVAKIAlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCiAJbG1nCSVyMiwlcjYsU1BfUjIoJXIxNSkJIyBsb2FkIHN2YyBhcmd1bWVudHMKIAlqCXN5c2NfZG9fc3ZjCkBAIC01NzEsNyArNTU1LDYgQEAKICMKIGtlcm5lbF9wZXI6CiAJUkVFTkFCTEVfSVJRUwotCXhjCVNQX1NWQ05SKDIsJXIxNSksU1BfU1ZDTlIoJXIxNSkJIyBjbGVhciBzdmMgbnVtYmVyCiAJbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGFkZHJlc3Mgb2YgcmVnaXN0ZXItc2F2ZSBhcmVhCiAJYnJhc2wJJXIxNCxkb19wZXJfdHJhcAogCWoJcGdtX2V4aXQKQEAgLTg2OSwxMiArODUyLDEyIEBACiAjIFBTVyByZXN0YXJ0IGludGVycnVwdCBoYW5kbGVyCiAjCiBFTlRSWShwc3dfcmVzdGFydF9pbnRfaGFuZGxlcikKLQlzdGcJJXIxNSxfX0xDX1NBVkVfQVJFQV82NCglcjApCSMgc2F2ZSByMTUKKwlzdGcJJXIxNSxfX0xDX1NBVkVfQVJFQSsxMjAoJXIwKQkjIHNhdmUgcjE1CiAJbGFybAklcjE1LHJlc3RhcnRfc3RhY2sJCSMgbG9hZCByZXN0YXJ0IHN0YWNrCiAJbGcJJXIxNSwwKCVyMTUpCiAJYWdoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKIAlzdG1nCSVyMCwlcjE0LFNQX1IwKCVyMTUpCQkjIHN0b3JlIGdwcnMgJXIwLSVyMTQgdG8gc3RhY2sKLQltdmMJU1BfUjE1KDgsJXIxNSksX19MQ19TQVZFX0FSRUFfNjQoJXIwKSMgc3RvcmUgc2F2ZWQgJXIxNSB0byBzdGFjaworCW12YwlTUF9SMTUoOCwlcjE1KSxfX0xDX1NBVkVfQVJFQSsxMjAoJXIwKSMgc3RvcmUgc2F2ZWQgJXIxNSB0byBzdGFjawogCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19SU1RfT0xEX1BTVyglcjApIyBzdG9yZSByZXN0YXJ0IG9sZCBwc3cKIAl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpICMgc2V0IGJhY2tjaGFpbiB0byAwCiAJYnJhc2wJJXIxNCxkb19yZXN0YXJ0CkBAIC05NzIsOSArOTU1LDExIEBACiAJc3RnCSVyMTUsMzIoJXIxMikKIAlzdGcJJXIxMSwwKCVyMTIpCiAJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU0FWRV9BUkVBCi0JbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1NWQ19PTERfUFNXCi0JbXZjCVNQX0lMQyg0LCVyMTUpLF9fTENfU1ZDX0lMQwogCW12Ywk4KDgsJXIxMiksX19MQ19USFJFQURfSU5GTworCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTworCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19TVkNfT0xEX1BTVworCW12YwlTUF9TVkNfQ09ERSg0LCVyMTUpLF9fTENfU1ZDX0lMQworCW9pCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1NZU0NBTEwKIGNsZWFudXBfdnRpbWU6CiAJY2xjCV9fTENfUkVUVVJOX1BTVys4KDgpLEJBU0VEKGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisyNCkKIAlqaGUJY2xlYW51cF9zdGltZQpAQCAtMTA5Niw2ICsxMDgxLDcgQEAKIAlsZ2hpCSVyMiwwCiAJYnIJJXIxNAogc2llX2ZhdWx0OgorCWxjdGxnCSVjMSwlYzEsX19MQ19VU0VSX0FTQ0UJCSMgbG9hZCBwcmltYXJ5IGFzY2UKIAlsZwklcjE0LF9fTENfVEhSRUFEX0lORk8JCSMgcG9pbnRlciB0aHJlYWRfaW5mbyBzdHJ1Y3QKIAluaQlfX1RJX2ZsYWdzKzYoJXIxNCksMjU1LShfVElGX1NJRT4+OCkKIAlsZwklcjE0LF9fU0ZfRU1QVFkrOCglcjE1KQkJIyBsb2FkIGd1ZXN0IHJlZ2lzdGVyIHNhdmUgYXJlYQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwppbmRleCAyZDc4MWJhLi45MDAwNjhkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwpAQCAtNDQ5LDEwICs0NDksMjggQEAKICMKIAkub3JnCTB4MTAwMDAKIEVOVFJZKHN0YXJ0dXApCisJagkuTGVwX3N0YXJ0dXBfbm9ybWFsCisJLm9yZwkweDEwMDA4CisjCisjIFRoaXMgaXMgYSBsaXN0IG9mIHMzOTAga2VybmVsIGVudHJ5IHBvaW50cy4gQXQgYWRkcmVzcyAweDEwMDBmIHRoZSBudW1iZXIgb2YKKyMgdmFsaWQgZW50cnkgcG9pbnRzIGlzIHN0b3JlZC4KKyMKKyMgSU1QT1JUQU5UOiBEbyBub3QgY2hhbmdlIHRoaXMgdGFibGUsIGl0IGlzIHMzOTAga2VybmVsIEFCSSEKKyMKKwkuYXNjaWkJIlMzOTBFUCIKKwkuYnl0ZQkweDAwLDB4MDEKKyMKKyMga2R1bXAgc3RhcnR1cC1jb2RlIGF0IDB4MTAwMTAsIHJ1bm5pbmcgaW4gNjQgYml0IGFic29sdXRlIGFkZHJlc3NpbmcgbW9kZQorIworCS5vcmcJMHgxMDAxMAorRU5UUlkoc3RhcnR1cF9rZHVtcCkKKwlqCS5MZXBfc3RhcnR1cF9rZHVtcAorLkxlcF9zdGFydHVwX25vcm1hbDoKIAliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKIC5MUEcwOgogCXhjCTB4MjAwKDI1NiksMHgyMDAJIyBwYXJ0aWFsbHkgY2xlYXIgbG93Y29yZQogCXhjCTB4MzAwKDI1NiksMHgzMDAKKwl4YwkweGUwMCgyNTYpLDB4ZTAwCiAJc3RjawlfX0xDX0xBU1RfVVBEQVRFX0NMT0NLCiAJc3B0CTVmLS5MUEcwKCVyMTMpCiAJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksNWYtLkxQRzAoJXIxMykKQEAgLTUzNCw2ICs1NTIsOCBAQAogCS5hbGlnbgk4CiA1OgkubG9uZwkweDdmZmZmZmZmLDB4ZmZmZmZmZmYKIAorI2luY2x1ZGUgImhlYWRfa2R1bXAuUyIKKwogIwogIyBwYXJhbXMgYXQgMTA0MDAgKHNldHVwLmgpCiAjCkBAIC01NDEsNiArNTYxLDggQEAKIAkubG9uZwkwLDAJCQkjIElQTF9ERVZJQ0UKIAkubG9uZwkwLDAJCQkjIElOSVRSRF9TVEFSVAogCS5sb25nCTAsMAkJCSMgSU5JVFJEX1NJWkUKKwkubG9uZwkwLDAJCQkjIE9MRE1FTV9CQVNFCisJLmxvbmcJMCwwCQkJIyBPTERNRU1fU0laRQogCiAJLm9yZwlDT01NQU5EX0xJTkUKIAkuYnl0ZQkicm9vdD0vZGV2L3JhbTAgcm8iCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUwppbmRleCBmMjE5NTRiLi5kM2YxYWI3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMKQEAgLTkyLDcgKzkyLDcgQEAKIC5MUEczOgogIyBjaGVjayBjb250cm9sIHJlZ2lzdGVycwogCXN0Y3RsCSVjMCwlYzE1LDAoJXIxNSkKLQlvaQkyKCVyMTUpLDB4NDAJCSMgZW5hYmxlIHNpZ3AgZW1lcmdlbmN5IHNpZ25hbAorCW9pCTIoJXIxNSksMHg2MAkJIyBlbmFibGUgc2lncCBlbWVyZ2VuY3kgJiBleHRlcm5hbCBjYWxsCiAJb2kJMCglcjE1KSwweDEwCQkjIHN3aXRjaCBvbiBsb3cgYWRkcmVzcyBwcm90ZWN0aW9uCiAJbGN0bAklYzAsJWMxNSwwKCVyMTUpCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCmluZGV4IGFlNWQ0OTIuLjk5MzQ4YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUwpAQCAtOTAsNyArOTAsNyBAQAogLkxQRzM6CiAjIGNoZWNrIGNvbnRyb2wgcmVnaXN0ZXJzCiAJc3RjdGcJJWMwLCVjMTUsMCglcjE1KQotCW9pCTYoJXIxNSksMHg0MAkJIyBlbmFibGUgc2lncCBlbWVyZ2VuY3kgc2lnbmFsCisJb2kJNiglcjE1KSwweDYwCQkjIGVuYWJsZSBzaWdwIGVtZXJnZW5jeSAmIGV4dGVybmFsIGNhbGwKIAlvaQk0KCVyMTUpLDB4MTAJCSMgc3dpdGNoIG9uIGxvdyBhZGRyZXNzIHByb2N0ZWN0aW9uCiAJbGN0bGcJJWMwLCVjMTUsMCglcjE1KQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZF9rZHVtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWMzODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIFMzOTAga2R1bXAgbG93bGV2ZWwgZnVuY3Rpb25zIChuZXcga2VybmVsKQorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxMQorICogQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAbGludXgudm5ldC5pYm0uY29tPgorICovCisKKyNkZWZpbmUgREFUQU1PVkVSX0FERFIJMHg0MDAwCisjZGVmaW5lIENPUFlfUEFHRV9BRERSCTB4NjAwMAorCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKworIworIyBrZHVtcCBlbnRyeSAobmV3IGtlcm5lbCAtIG5vdCB5ZXQgcmVsb2NhdGVkKQorIworIyBOb3RlOiBUaGlzIGNvZGUgaGFzIHRvIGJlIHBvc2l0aW9uIGluZGVwZW5kZW50CisjCisKKy5hbGlnbiAyCisuTGVwX3N0YXJ0dXBfa2R1bXA6CisJbGhpCSVyMSwyCQkJCSMgbW9kZSAyID0gZXNhbWUgKGR1bXApCisJc2lncAklcjEsJXIwLDB4MTIJCQkjIFN3aXRjaCB0byBlc2FtZSBtb2RlCisJc2FtNjQJCQkJCSMgU3dpdGNoIHRvIDY0IGJpdCBhZGRyZXNzaW5nCisJYmFzcgklcjEzLDAKKy5MYmFzZToKKwlsYXJsCSVyMiwuTGJhc2VfYWRkcgkJCSMgQ2hlY2ssIGlmIHdlIGhhdmUgYmVlbgorCWxnCSVyMiwwKCVyMikJCQkjIGFscmVhZHkgcmVsb2NhdGVkOgorCWNsZ3IJJXIyLCVyMTMJCQkjCisJam5lCS5McmVsb2NhdGUJCQkjIE5vIDogU3RhcnQgZGF0YSBtb3ZlcgorCWxnaGkJJXIyLDAJCQkJIyBZZXM6IFN0YXJ0IGtkdW1wIGtlcm5lbAorCWJyYXNsCSVyMTQsc3RhcnR1cF9rZHVtcF9yZWxvY2F0ZWQKKworLkxyZWxvY2F0ZToKKwlsYXJsCSVyNCxzdGFydHVwCisJbGcJJXIyLDB4NDE4KCVyNCkJCQkjIEdldCBrZHVtcCBiYXNlCisJbGcJJXIzLDB4NDIwKCVyNCkJCQkjIEdldCBrZHVtcCBzaXplCisKKwlsYXJsCSVyMTAsLkxjb3B5X3N0YXJ0CQkjIFNvdXJjZSBvZiBkYXRhIG1vdmVyCisJbGdoaQklcjgsREFUQU1PVkVSX0FERFIJCSMgVGFyZ2V0IG9mIGRhdGEgbW92ZXIKKwltdmMJMCgyNTYsJXI4KSwwKCVyMTApCQkjIENvcHkgZGF0YSBtb3ZlciBjb2RlCisKKwlhZ3IJJXI4LCVyMgkJCQkjIENvcHkgZGF0YSBtb3ZlciB0bworCW12YwkwKDI1NiwlcjgpLDAoJXIxMCkJCSMgcmVzZXJ2ZWQgbWVtCisKKwlsZ2hpCSVyMTQsREFUQU1PVkVSX0FERFIJCSMgSnVtcCB0byBjb3BpZWQgZGF0YSBtb3ZlcgorCWJhc3IJJXIxNCwlcjE0CisuTGJhc2VfYWRkcjoKKwkucXVhZAkuTGJhc2UKKworIworIyBrZHVtcCBkYXRhIG1vdmVyIGNvZGUgKHJ1bnMgYXQgYWRkcmVzcyBEQVRBTU9WRVJfQUREUikKKyMKKyMgcjI6IGtkdW1wIGJhc2UgYWRkcmVzcworIyByMzoga2R1bXAgc2l6ZQorIworLkxjb3B5X3N0YXJ0OgorCWJhc3IJJXIxMywwCQkJCSMgQmFzZQorMDoKKwlsZ3IJJXIxMSwlcjIJCQkjIFNhdmUga2R1bXAgYmFzZSBhZGRyZXNzCisJbGdyCSVyMTIsJXIyCisJYWdyCSVyMTIsJXIzCQkJIyBDb21wdXRlIGtkdW1wIGVuZCBhZGRyZXNzCisKKwlsZ2hpCSVyNSwwCisJbGdoaQklcjEwLENPUFlfUEFHRV9BRERSCQkjIExvYWQgY29weSBwYWdlIGFkZHJlc3MKKzE6CisJbXZjCTAoMjU2LCVyMTApLDAoJXI1KQkJIyBDb3B5IG9sZCBrZXJuZWwgdG8gdG1wCisJbXZjCTAoMjU2LCVyNSksMCglcjExKQkJIyBDb3B5IG5ldyBrZXJuZWwgdG8gb2xkCisJbXZjCTAoMjU2LCVyMTEpLDAoJXIxMCkJCSMgQ29weSB0bXAgdG8gbmV3CisJYWdoaQklcjExLDI1NgorCWFnaGkJJXI1LDI1NgorCWNsZ3IJJXIxMSwlcjEyCisJamwJMWIKKworCWxnCSVyMTQsLkxzdGFydHVwX2tkdW1wLTBiKCVyMTMpCisJYmFzcgklcjE0LCVyMTQJCQkjIFN0YXJ0IHJlbG9jYXRlZCBrZXJuZWwKKy5Mc3RhcnR1cF9rZHVtcDoKKwkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAgKyBzdGFydHVwX2tkdW1wX3JlbG9jYXRlZAorLkxjb3B5X2VuZDoKKworIworIyBTdGFydHVwIG9mIGtkdW1wIChyZWxvY2F0ZWQgbmV3IGtlcm5lbCkKKyMKKy5hbGlnbiAyCitzdGFydHVwX2tkdW1wX3JlbG9jYXRlZDoKKwliYXNyCSVyMTMsMAorMDoKKwltdmMJMCg4LCVyMCksLkxyZXN0YXJ0X3Bzdy0wYiglcjEzKQkjIFNldHVwIHJlc3RhcnQgUFNXCisJbXZjCTQ2NCgxNiwlcjApLC5McGdtX3Bzdy0wYiglcjEzKQkjIFNldHVwIHBnbSBjaGVjayBQU1cKKwlsaGkJJXIxLDEJCQkJIyBTdGFydCBuZXcga2VybmVsCisJZGlhZwklcjEsJXIxLDB4MzA4CQkJIyB3aXRoIGRpYWcgMzA4CisKKy5Mbm9fZGlhZzMwODoJCQkJCSMgTm8gZGlhZyAzMDgKKwlzYW0zMQkJCQkJIyBTd2l0Y2ggdG8gMzEgYml0IGFkZHIgbW9kZQorCXNyCSVyMSwlcjEJCQkJIyBFcmFzZSByZWdpc3RlciByMQorCXNyCSVyMiwlcjIJCQkJIyBFcmFzZSByZWdpc3RlciByMgorCXNpZ3AJJXIxLCVyMiwweDEyCQkJIyBTd2l0Y2ggdG8gMzEgYml0IGFyY2ggbW9kZQorCWxwc3cJMAkJCQkjIFN0YXJ0IG5ldyBrZXJuZWwuLi4KKy5hbGlnbgk4CisuTHJlc3RhcnRfcHN3OgorCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCArIHN0YXJ0dXAKKy5McGdtX3BzdzoKKwkucXVhZAkweDAwMDAwMDAxODAwMDAwMDAsMHgwMDAwMDAwMDAwMDAwMDAwICsgLkxub19kaWFnMzA4CisjZWxzZQorLmFsaWduIDIKKy5MZXBfc3RhcnR1cF9rZHVtcDoKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlsYXJsCSVyMTMsc3RhcnR1cF9rZHVtcF9jcmFzaAorCWxwc3dlCTAoJXIxMykKKy5hbGlnbiA4CitzdGFydHVwX2tkdW1wX2NyYXNoOgorCS5xdWFkCTB4MDAwMjAwMDA4MDAwMDAwMCwweDAwMDAwMDAwMDAwMDAwMDAgKyBzdGFydHVwX2tkdW1wX2NyYXNoCisjZWxzZQorCWJhc3IJJXIxMywwCiswOglscHN3CXN0YXJ0dXBfa2R1bXBfY3Jhc2gtMGIoJXIxMykKKy5hbGlnbiA4CitzdGFydHVwX2tkdW1wX2NyYXNoOgorCS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMCArIHN0YXJ0dXBfa2R1bXBfY3Jhc2gKKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ1JBU0hfRFVNUCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKaW5kZXggNDhjNzEwMi4uYWZmYThlNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtMjYsNiArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS9zY2xwLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlICJlbnRyeS5oIgogCiAjZGVmaW5lIElQTF9QQVJNX0JMT0NLX1ZFUlNJT04gMAogCkBAIC0yNzUsOCArMjc3LDggQEAKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgc3lzX2lwbF90eXBlX2F0dHIgPSBfX0FUVFJfUk8oaXBsX3R5cGUpOwogCiAvKiBWTSBJUEwgUEFSTSByb3V0aW5lcyAqLwotc2l6ZV90IHJlaXBsX2dldF9hc2NpaV92bXBhcm0oY2hhciAqZGVzdCwgc2l6ZV90IHNpemUsCi0JCQkJICAgY29uc3Qgc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKmlwYikKK3N0YXRpYyBzaXplX3QgcmVpcGxfZ2V0X2FzY2lpX3ZtcGFybShjaGFyICpkZXN0LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICppcGIpCiB7CiAJaW50IGk7CiAJc2l6ZV90IGxlbjsKQEAgLTMzOCw4ICszNDAsOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc2l6ZV90IHJlaXBsX2FwcGVuZF9hc2NpaV9zY3BkYXRhKGNoYXIgKmRlc3QsIHNpemVfdCBzaXplLAotCQkJCSAgY29uc3Qgc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKmlwYikKK3N0YXRpYyBzaXplX3QgcmVpcGxfYXBwZW5kX2FzY2lpX3NjcGRhdGEoY2hhciAqZGVzdCwgc2l6ZV90IHNpemUsCisJCQkJCSBjb25zdCBzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqaXBiKQogewogCXNpemVfdCBjb3VudDsKIAlzaXplX3QgaTsKQEAgLTE3MzgsNyArMTc0MCwxMSBAQAogCiB2b2lkIGRvX3Jlc3RhcnQodm9pZCkKIHsKKwlzbXBfcmVzdGFydF93aXRoX29ubGluZV9jcHUoKTsKIAlzbXBfc2VuZF9zdG9wKCk7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwljcmFzaF9rZXhlYyhOVUxMKTsKKyNlbmRpZgogCW9uX3Jlc3RhcnRfdHJpZ2dlci5hY3Rpb24tPmZuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOwogCXN0b3BfcnVuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOwogfQpAQCAtMjAwOSw3ICsyMDE1LDcgQEAKIAogdTMyIGR1bXBfcHJlZml4X3BhZ2U7CiAKLXZvaWQgczM5MF9yZXNldF9zeXN0ZW0odm9pZCkKK3ZvaWQgczM5MF9yZXNldF9zeXN0ZW0odm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IF9sb3djb3JlICpsYzsKIApAQCAtMjAyOCwxNSArMjAzNCwxOSBAQAogCV9fY3RsX2NsZWFyX2JpdCgwLDI4KTsKIAogCS8qIFNldCBuZXcgbWFjaGluZSBjaGVjayBoYW5kbGVyICovCi0JUzM5MF9sb3djb3JlLm1jY2tfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX01DSEVDSzsKKwlTMzkwX2xvd2NvcmUubWNja19uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19EQVQ7CiAJUzM5MF9sb3djb3JlLm1jY2tfbmV3X3Bzdy5hZGRyID0KIAkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgczM5MF9iYXNlX21jY2tfaGFuZGxlcjsKIAogCS8qIFNldCBuZXcgcHJvZ3JhbSBjaGVjayBoYW5kbGVyICovCi0JUzM5MF9sb3djb3JlLnByb2dyYW1fbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX01DSEVDSzsKKwlTMzkwX2xvd2NvcmUucHJvZ3JhbV9uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19EQVQ7CiAJUzM5MF9sb3djb3JlLnByb2dyYW1fbmV3X3Bzdy5hZGRyID0KIAkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgczM5MF9iYXNlX3BnbV9oYW5kbGVyOwogCi0JZG9fcmVzZXRfY2FsbHMoKTsKLX0KKwkvKiBTdG9yZSBzdGF0dXMgYXQgYWJzb2x1dGUgemVybyAqLworCXN0b3JlX3N0YXR1cygpOwogCisJZG9fcmVzZXRfY2FsbHMoKTsKKwlpZiAoZnVuYykKKwkJZnVuYyhkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMgYi9hcmNoL3MzOTAva2VybmVsL2lycS5jCmluZGV4IDFmNDA1MGQuLmI5YTdmZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwpAQCAtMzMsNyArMzMsOCBAQAogCXsubmFtZSA9ICJFWFQiIH0sCiAJey5uYW1lID0gIkkvTyIgfSwKIAl7Lm5hbWUgPSAiQ0xLIiwgLmRlc2MgPSAiW0VYVF0gQ2xvY2sgQ29tcGFyYXRvciIgfSwKLQl7Lm5hbWUgPSAiSVBJIiwgLmRlc2MgPSAiW0VYVF0gU2lnbmFsIFByb2Nlc3NvciIgfSwKKwl7Lm5hbWUgPSAiRVhDIiwgLmRlc2MgPSAiW0VYVF0gRXh0ZXJuYWwgQ2FsbCIgfSwKKwl7Lm5hbWUgPSAiRU1TIiwgLmRlc2MgPSAiW0VYVF0gRW1lcmdlbmN5IFNpZ25hbCIgfSwKIAl7Lm5hbWUgPSAiVE1SIiwgLmRlc2MgPSAiW0VYVF0gQ1BVIFRpbWVyIiB9LAogCXsubmFtZSA9ICJUQUwiLCAuZGVzYyA9ICJbRVhUXSBUaW1pbmcgQWxlcnQiIH0sCiAJey5uYW1lID0gIlBGTCIsIC5kZXNjID0gIltFWFRdIFBzZXVkbyBQYWdlIEZhdWx0IiB9LApAQCAtNDIsOCArNDMsOCBAQAogCXsubmFtZSA9ICJTQ1AiLCAuZGVzYyA9ICJbRVhUXSBTZXJ2aWNlIENhbGwiIH0sCiAJey5uYW1lID0gIklVQyIsIC5kZXNjID0gIltFWFRdIElVQ1YiIH0sCiAJey5uYW1lID0gIkNQTSIsIC5kZXNjID0gIltFWFRdIENQVSBNZWFzdXJlbWVudCIgfSwKKwl7Lm5hbWUgPSAiQ0lPIiwgLmRlc2MgPSAiW0kvT10gQ29tbW9uIEkvTyBMYXllciBJbnRlcnJ1cHQiIH0sCiAJey5uYW1lID0gIlFBSSIsIC5kZXNjID0gIltJL09dIFFESU8gQWRhcHRlciBJbnRlcnJ1cHQiIH0sCi0Jey5uYW1lID0gIlFESSIsIC5kZXNjID0gIltJL09dIFFESU8gSW50ZXJydXB0IiB9LAogCXsubmFtZSA9ICJEQVMiLCAuZGVzYyA9ICJbSS9PXSBEQVNEIiB9LAogCXsubmFtZSA9ICJDMTUiLCAuZGVzYyA9ICJbSS9PXSAzMjE1IiB9LAogCXsubmFtZSA9ICJDNzAiLCAuZGVzYyA9ICJbSS9PXSAzMjcwIiB9LApAQCAtNTMsNiArNTQsNyBAQAogCXsubmFtZSA9ICJDTFciLCAuZGVzYyA9ICJbSS9PXSBDTEFXIiB9LAogCXsubmFtZSA9ICJDVEMiLCAuZGVzYyA9ICJbSS9PXSBDVEMiIH0sCiAJey5uYW1lID0gIkFQQiIsIC5kZXNjID0gIltJL09dIEFQIEJ1cyIgfSwKKwl7Lm5hbWUgPSAiQ1NDIiwgLmRlc2MgPSAiW0kvT10gQ0hTQyBTdWJjaGFubmVsIiB9LAogCXsubmFtZSA9ICJOTUkiLCAuZGVzYyA9ICJbTk1JXSBNYWNoaW5lIENoZWNrIiB9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYwppbmRleCA0NGNjMDZiLi5iOTg3YWIyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMTgsMjYgKzE4LDE1IEBACiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaW5zbl9hcmdzIHsKLQl1bnNpZ25lZCBsb25nICp0YXJnZXQ7Ci0Jc3RydWN0IGluc24gKmluc247Ci0Jc3NpemVfdCBzaXplOworCXN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeTsKKwllbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlOwogfTsKIAotc3RhdGljIGludCBfX2FyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0odm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIF9fanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCSAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGluc25fYXJncyAqYXJncyA9IGRhdGE7Ci0JaW50IHJjOwotCi0JcmMgPSBwcm9iZV9rZXJuZWxfd3JpdGUoYXJncy0+dGFyZ2V0LCBhcmdzLT5pbnNuLCBhcmdzLT5zaXplKTsKLQlXQVJOX09OX09OQ0UocmMgPCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKLQkJCSAgICAgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKQotewotCXN0cnVjdCBpbnNuX2FyZ3MgYXJnczsKIAlzdHJ1Y3QgaW5zbiBpbnNuOworCWludCByYzsKIAogCWlmICh0eXBlID09IEpVTVBfTEFCRUxfRU5BQkxFKSB7CiAJCS8qIGJyY2wgMTUsb2Zmc2V0ICovCkBAIC00OSwxMSArMzgsMzMgQEAKIAkJaW5zbi5vZmZzZXQgPSAwOwogCX0KIAotCWFyZ3MudGFyZ2V0ID0gKHZvaWQgKikgZW50cnktPmNvZGU7Ci0JYXJncy5pbnNuID0gJmluc247Ci0JYXJncy5zaXplID0gSlVNUF9MQUJFTF9OT1BfU0laRTsKKwlyYyA9IHByb2JlX2tlcm5lbF93cml0ZSgodm9pZCAqKWVudHJ5LT5jb2RlLCAmaW5zbiwgSlVNUF9MQUJFTF9OT1BfU0laRSk7CisJV0FSTl9PTl9PTkNFKHJjIDwgMCk7Cit9CiAKLQlzdG9wX21hY2hpbmUoX19hcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtLCAmYXJncywgTlVMTCk7CitzdGF0aWMgaW50IF9fc21fYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbnNuX2FyZ3MgKmFyZ3MgPSBkYXRhOworCisJX19qdW1wX2xhYmVsX3RyYW5zZm9ybShhcmdzLT5lbnRyeSwgYXJncy0+dHlwZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgaW5zbl9hcmdzIGFyZ3M7CisKKwlhcmdzLmVudHJ5ID0gZW50cnk7CisJYXJncy50eXBlID0gdHlwZTsKKworCXN0b3BfbWFjaGluZShfX3NtX2FyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0sICZhcmdzLCBOVUxMKTsKK30KKwordm9pZCBhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtX3N0YXRpYyhzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkJICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKKwlfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDFkMDVkNjYuLjY0Yjc2MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC02MzUsNyArNjM1LDcgQEAKIAlhc20gdm9sYXRpbGUoIi53b3JkIDB4MDAwMiIpOwogfQogCi12b2lkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKQorc3RhdGljIHZvaWQgX191c2VkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKQogewogCWFzbSB2b2xhdGlsZSgiYmNyIDAsMCIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCBiMDliOWM2Li4zY2QwZjI1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMSwxMCArMSwxMSBAQAogLyoKICAqIGFyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCiAgKgotICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1LDIwMDYKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNSwyMDExCiAgKgogICogQXV0aG9yKHMpOiBSb2xmIEFkZWxzYmVyZ2VyLAogICoJICAgICAgSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+CisgKgkgICAgICBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAbGludXgudm5ldC5pYm0uY29tPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTIxLDEyICsyMiwxNjIgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgorI2luY2x1ZGUgPGFzbS9kaWFnLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIHR5cGVkZWYgdm9pZCAoKnJlbG9jYXRlX2tlcm5lbF90KShraW1hZ2VfZW50cnlfdCAqLCB1bnNpZ25lZCBsb25nKTsKIAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfa2VybmVsW107CiBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHJlbG9jYXRlX2tlcm5lbF9sZW47CiAKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCit2b2lkICpmaWxsX2NwdV9lbGZfbm90ZXModm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSk7CisKKy8qCisgKiBDcmVhdGUgRUxGIG5vdGVzIGZvciBvbmUgQ1BVCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9lbGZfbm90ZXMoaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSA9ICh2b2lkICopIDQ2MDggKyBzdG9yZV9wcmVmaXgoKTsKKwl2b2lkICpwdHI7CisKKwltZW1jcHkoKHZvaWQgKikgKDQ2MDhVTCArIHNhLT5wcmVmX3JlZyksIHNhLCBzaXplb2YoKnNhKSk7CisJcHRyID0gKHU2NCAqKSBwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1KTsKKwlwdHIgPSBmaWxsX2NwdV9lbGZfbm90ZXMocHRyLCBzYSk7CisJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCBlbGZfbm90ZSkpOworfQorCisvKgorICogU3RvcmUgc3RhdHVzIG9mIG5leHQgYXZhaWxhYmxlIHBoeXNpY2FsIENQVQorICovCitzdGF0aWMgaW50IHN0b3JlX3N0YXR1c19uZXh0KGludCBzdGFydF9jcHUsIGludCB0aGlzX2NwdSkKK3sKKwlzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSA9ICh2b2lkICopIDQ2MDggKyBzdG9yZV9wcmVmaXgoKTsKKwlpbnQgY3B1LCByYzsKKworCWZvciAoY3B1ID0gc3RhcnRfY3B1OyBjcHUgPCA2NTUzNjsgY3B1KyspIHsKKwkJaWYgKGNwdSA9PSB0aGlzX2NwdSkKKwkJCWNvbnRpbnVlOworCQlkbyB7CisJCQlyYyA9IHJhd19zaWdwKGNwdSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOworCQl9IHdoaWxlIChyYyA9PSBzaWdwX2J1c3kpOworCQlpZiAocmMgIT0gc2lncF9vcmRlcl9jb2RlX2FjY2VwdGVkKQorCQkJY29udGludWU7CisJCWlmIChzYS0+cHJlZl9yZWcpCisJCQlyZXR1cm4gY3B1OworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIENQVSBFTEYgbm90ZXMKKyAqLwordm9pZCBzZXR1cF9yZWdzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzYSA9IFMzOTBfbG93Y29yZS5wcmVmaXhyZWdfc2F2ZV9hcmVhICsgU0FWRV9BUkVBX0JBU0U7CisJaW50IGNwdSwgdGhpc19jcHUsIHBoeXNfY3B1ID0gMCwgZmlyc3QgPSAxOworCisJdGhpc19jcHUgPSBzdGFwKCk7CisKKwlpZiAoIVMzOTBfbG93Y29yZS5wcmVmaXhyZWdfc2F2ZV9hcmVhKQorCQlmaXJzdCA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGZpcnN0KSB7CisJCQlhZGRfZWxmX25vdGVzKGNwdSk7CisJCQlmaXJzdCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlwaHlzX2NwdSA9IHN0b3JlX3N0YXR1c19uZXh0KHBoeXNfY3B1LCB0aGlzX2NwdSk7CisJCWlmIChwaHlzX2NwdSA9PSAtMSkKKwkJCWJyZWFrOworCQlhZGRfZWxmX25vdGVzKGNwdSk7CisJCXBoeXNfY3B1Kys7CisJfQorCS8qIENvcHkgZHVtcCBDUFUgc3RvcmUgc3RhdHVzIGluZm8gdG8gYWJzb2x1dGUgemVybyAqLworCW1lbWNweSgodm9pZCAqKSBTQVZFX0FSRUFfQkFTRSwgKHZvaWQgKikgc2EsIHNpemVvZihzdHJ1Y3Qgc2F2ZV9hcmVhKSk7Cit9CisKKyNlbmRpZgorCisvKgorICogU3RhcnQga2R1bXA6IFdlIGV4cGVjdCBoZXJlIHRoYXQgYSBzdG9yZSBzdGF0dXMgaGFzIGJlZW4gZG9uZSBvbiBvdXIgQ1BVCisgKi8KK3N0YXRpYyB2b2lkIF9fZG9fbWFjaGluZV9rZHVtcCh2b2lkICppbWFnZSkKK3sKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCWludCAoKnN0YXJ0X2tkdW1wKShpbnQpID0gKHZvaWQgKikoKHN0cnVjdCBraW1hZ2UgKikgaW1hZ2UpLT5zdGFydDsKKworCV9fbG9hZF9wc3dfbWFzayhQU1dfTUFTS19CQVNFIHwgUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQSk7CisJc2V0dXBfcmVncygpOworCXN0YXJ0X2tkdW1wKDEpOworI2VuZGlmCit9CisKKy8qCisgKiBDaGVjayBpZiBrZHVtcCBjaGVja3N1bXMgYXJlIHZhbGlkOiBXZSBjYWxsIHB1cmdhdG9yeSB3aXRoIHBhcmFtZXRlciAiMCIKKyAqLworc3RhdGljIGludCBrZHVtcF9jc3VtX3ZhbGlkKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJaW50ICgqc3RhcnRfa2R1bXApKGludCkgPSAodm9pZCAqKWltYWdlLT5zdGFydDsKKwlpbnQgcmM7CisKKwlfX2FyY2hfbG9jYWxfaXJxX3N0bnNtKDB4ZmIpOyAvKiBkaXNhYmxlIERBVCAqLworCXJjID0gc3RhcnRfa2R1bXAoMCk7CisJX19hcmNoX2xvY2FsX2lycV9zdG9zbSgweDA0KTsgLyogZW5hYmxlIERBVCAqLworCXJldHVybiByYyA/IDAgOiAtRUlOVkFMOworI2Vsc2UKKwlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorfQorCisvKgorICogTWFwIG9yIHVubWFwIGNyYXNoa2VybmVsIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBjcmFzaF9tYXBfcGFnZXMoaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSByZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKTsKKworCUJVR19PTihjcmFzaGtfcmVzLnN0YXJ0ICUgS0VYRUNfQ1JBU0hfTUVNX0FMSUdOIHx8CisJICAgICAgIHNpemUgJSBLRVhFQ19DUkFTSF9NRU1fQUxJR04pOworCWlmIChlbmFibGUpCisJCXZtZW1fYWRkX21hcHBpbmcoY3Jhc2hrX3Jlcy5zdGFydCwgc2l6ZSk7CisJZWxzZQorCQl2bWVtX3JlbW92ZV9tYXBwaW5nKGNyYXNoa19yZXMuc3RhcnQsIHNpemUpOworfQorCisvKgorICogTWFwIGNyYXNoa2VybmVsIG1lbW9yeQorICovCit2b2lkIGNyYXNoX21hcF9yZXNlcnZlZF9wYWdlcyh2b2lkKQoreworCWNyYXNoX21hcF9wYWdlcygxKTsKK30KKworLyoKKyAqIFVubWFwIGNyYXNoa2VybmVsIG1lbW9yeQorICovCit2b2lkIGNyYXNoX3VubWFwX3Jlc2VydmVkX3BhZ2VzKHZvaWQpCit7CisJY3Jhc2hfbWFwX3BhZ2VzKDApOworfQorCisvKgorICogR2l2ZSBiYWNrIG1lbW9yeSB0byBoeXBlcnZpc29yIGJlZm9yZSBuZXcga2R1bXAgaXMgbG9hZGVkCisgKi8KK3N0YXRpYyBpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlX2tkdW1wKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwlpZiAoTUFDSElORV9JU19WTSkKKwkJZGlhZzEwX3JhbmdlKFBGTl9ET1dOKGNyYXNoa19yZXMuc3RhcnQpLAorCQkJICAgICBQRk5fRE9XTihjcmFzaGtfcmVzLmVuZCAtIGNyYXNoa19yZXMuc3RhcnQgKyAxKSk7CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRUlOVkFMOworI2VuZGlmCit9CisKIGludCBtYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7CiAJdm9pZCAqcmVib290X2NvZGVfYnVmZmVyOwpAQCAtMzUsNiArMTg2LDkgQEAKIAlpZiAoaXBsX2ZsYWdzICYgSVBMX05TU19WQUxJRCkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKKwlpZiAoaW1hZ2UtPnR5cGUgPT0gS0VYRUNfVFlQRV9DUkFTSCkKKwkJcmV0dXJuIG1hY2hpbmVfa2V4ZWNfcHJlcGFyZV9rZHVtcCgpOworCiAJLyogV2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBidXQgdGhlIGRlZmF1bHQgaW1hZ2UgdHlwZSBmb3Igbm93LiAqLwogCWlmIChpbWFnZS0+dHlwZSAhPSBLRVhFQ19UWVBFX0RFRkFVTFQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTEsMjcgKzIwNSw1MyBAQAogewogfQogCit2b2lkIGFyY2hfY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCit7CisJVk1DT1JFSU5GT19TWU1CT0wobG93Y29yZV9wdHIpOworCVZNQ09SRUlORk9fTEVOR1RIKGxvd2NvcmVfcHRyLCBOUl9DUFVTKTsKK30KKwogdm9pZCBtYWNoaW5lX3NodXRkb3duKHZvaWQpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWFjaGluZV9rZXhlYyh2b2lkICpkYXRhKQorLyoKKyAqIERvIG5vcm1hbCBrZXhlYworICovCitzdGF0aWMgdm9pZCBfX2RvX21hY2hpbmVfa2V4ZWModm9pZCAqZGF0YSkKIHsKIAlyZWxvY2F0ZV9rZXJuZWxfdCBkYXRhX21vdmVyOwogCXN0cnVjdCBraW1hZ2UgKmltYWdlID0gZGF0YTsKIAotCXBmYXVsdF9maW5pKCk7Ci0JczM5MF9yZXNldF9zeXN0ZW0oKTsKLQogCWRhdGFfbW92ZXIgPSAocmVsb2NhdGVfa2VybmVsX3QpIHBhZ2VfdG9fcGh5cyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOwogCiAJLyogQ2FsbCB0aGUgbW92aW5nIHJvdXRpbmUgKi8KIAkoKmRhdGFfbW92ZXIpKCZpbWFnZS0+aGVhZCwgaW1hZ2UtPnN0YXJ0KTsKLQlmb3IgKDs7KTsKIH0KIAorLyoKKyAqIFJlc2V0IHN5c3RlbSBhbmQgY2FsbCBlaXRoZXIga2R1bXAgb3Igbm9ybWFsIGtleGVjCisgKi8KK3N0YXRpYyB2b2lkIF9fbWFjaGluZV9rZXhlYyh2b2lkICpkYXRhKQoreworCXN0cnVjdCBraW1hZ2UgKmltYWdlID0gZGF0YTsKKworCXBmYXVsdF9maW5pKCk7CisJaWYgKGltYWdlLT50eXBlID09IEtFWEVDX1RZUEVfQ1JBU0gpCisJCXMzOTBfcmVzZXRfc3lzdGVtKF9fZG9fbWFjaGluZV9rZHVtcCwgZGF0YSk7CisJZWxzZQorCQlzMzkwX3Jlc2V0X3N5c3RlbShfX2RvX21hY2hpbmVfa2V4ZWMsIGRhdGEpOworCWRpc2FibGVkX3dhaXQoKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKKy8qCisgKiBEbyBlaXRoZXIga2R1bXAgb3Igbm9ybWFsIGtleGVjLiBJbiBjYXNlIG9mIGtkdW1wIHdlIGZpcnN0IGFzaworICogcHVyZ2F0b3J5LCBpZiBrZHVtcCBjaGVja3N1bXMgYXJlIHZhbGlkLgorICovCiB2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7CisJaWYgKGltYWdlLT50eXBlID09IEtFWEVDX1RZUEVfQ1JBU0ggJiYgIWtkdW1wX2NzdW1fdmFsaWQoaW1hZ2UpKQorCQlyZXR1cm47CiAJdHJhY2VyX2Rpc2FibGUoKTsKIAlzbXBfc2VuZF9zdG9wKCk7CiAJc21wX3N3aXRjaF90b19pcGxfY3B1KF9fbWFjaGluZV9rZXhlYywgaW1hZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tZW1fZGV0ZWN0LmMgYi9hcmNoL3MzOTAva2VybmVsL21lbV9kZXRlY3QuYwppbmRleCAwZmJlNGUzLi4xOWI0NTY4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL21lbV9kZXRlY3QuYworKysgYi9hcmNoL3MzOTAva2VybmVsL21lbV9kZXRlY3QuYwpAQCAtNjIsMyArNjIsNzIgQEAKIAlhcmNoX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZGV0ZWN0X21lbW9yeV9sYXlvdXQpOworCisvKgorICogQ3JlYXRlIG1lbW9yeSBob2xlIHdpdGggZ2l2ZW4gYWRkcmVzcywgc2l6ZSwgYW5kIHR5cGUKKyAqLwordm9pZCBjcmVhdGVfbWVtX2hvbGUoc3RydWN0IG1lbV9jaHVuayBjaHVua3NbXSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBuZXdfc2l6ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNRU1PUllfQ0hVTktTOyBpKyspIHsKKwkJaWYgKGNodW5rc1tpXS5zaXplID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGFkZHIgKyBzaXplIDwgY2h1bmtzW2ldLmFkZHIpCisJCQljb250aW51ZTsKKwkJaWYgKGFkZHIgPj0gY2h1bmtzW2ldLmFkZHIgKyBjaHVua3NbaV0uc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlzdGFydCA9IG1heChhZGRyLCBjaHVua3NbaV0uYWRkcik7CisJCWVuZCA9IG1pbihhZGRyICsgc2l6ZSwgY2h1bmtzW2ldLmFkZHIgKyBjaHVua3NbaV0uc2l6ZSk7CisJCW5ld19zaXplID0gZW5kIC0gc3RhcnQ7CisJCWlmIChuZXdfc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChzdGFydCA9PSBjaHVua3NbaV0uYWRkciAmJgorCQkgICAgZW5kID09IGNodW5rc1tpXS5hZGRyICsgY2h1bmtzW2ldLnNpemUpIHsKKwkJCS8qIFJlbW92ZSBjaHVuayAqLworCQkJY2h1bmtzW2ldLnR5cGUgPSB0eXBlOworCQl9IGVsc2UgaWYgKHN0YXJ0ID09IGNodW5rc1tpXS5hZGRyKSB7CisJCQkvKiBNYWtlIGNodW5rIHNtYWxsZXIgYXQgc3RhcnQgKi8KKwkJCWlmIChpID49IE1FTU9SWV9DSFVOS1MgLSAxKQorCQkJCXBhbmljKCJVbmFibGUgdG8gY3JlYXRlIG1lbW9yeSBob2xlIik7CisJCQltZW1tb3ZlKCZjaHVua3NbaSArIDFdLCAmY2h1bmtzW2ldLAorCQkJCXNpemVvZihzdHJ1Y3QgbWVtX2NodW5rKSAqCisJCQkJKE1FTU9SWV9DSFVOS1MgLSAoaSArIDEpKSk7CisJCQljaHVua3NbaSArIDFdLmFkZHIgPSBjaHVua3NbaV0uYWRkciArIG5ld19zaXplOworCQkJY2h1bmtzW2kgKyAxXS5zaXplID0gY2h1bmtzW2ldLnNpemUgLSBuZXdfc2l6ZTsKKwkJCWNodW5rc1tpXS5zaXplID0gbmV3X3NpemU7CisJCQljaHVua3NbaV0udHlwZSA9IHR5cGU7CisJCQlpICs9IDE7CisJCX0gZWxzZSBpZiAoZW5kID09IGNodW5rc1tpXS5hZGRyICsgY2h1bmtzW2ldLnNpemUpIHsKKwkJCS8qIE1ha2UgY2h1bmsgc21hbGxlciBhdCBlbmQgKi8KKwkJCWlmIChpID49IE1FTU9SWV9DSFVOS1MgLSAxKQorCQkJCXBhbmljKCJVbmFibGUgdG8gY3JlYXRlIG1lbW9yeSBob2xlIik7CisJCQltZW1tb3ZlKCZjaHVua3NbaSArIDFdLCAmY2h1bmtzW2ldLAorCQkJCXNpemVvZihzdHJ1Y3QgbWVtX2NodW5rKSAqCisJCQkJKE1FTU9SWV9DSFVOS1MgLSAoaSArIDEpKSk7CisJCQljaHVua3NbaSArIDFdLmFkZHIgPSBzdGFydDsKKwkJCWNodW5rc1tpICsgMV0uc2l6ZSA9IG5ld19zaXplOworCQkJY2h1bmtzW2kgKyAxXS50eXBlID0gdHlwZTsKKwkJCWNodW5rc1tpXS5zaXplIC09IG5ld19zaXplOworCQkJaSArPSAxOworCQl9IGVsc2UgeworCQkJLyogQ3JlYXRlIG1lbW9yeSBob2xlICovCisJCQlpZiAoaSA+PSBNRU1PUllfQ0hVTktTIC0gMikKKwkJCQlwYW5pYygiVW5hYmxlIHRvIGNyZWF0ZSBtZW1vcnkgaG9sZSIpOworCQkJbWVtbW92ZSgmY2h1bmtzW2kgKyAyXSwgJmNodW5rc1tpXSwKKwkJCQlzaXplb2Yoc3RydWN0IG1lbV9jaHVuaykgKgorCQkJCShNRU1PUllfQ0hVTktTIC0gKGkgKyAyKSkpOworCQkJY2h1bmtzW2kgKyAxXS5hZGRyID0gYWRkcjsKKwkJCWNodW5rc1tpICsgMV0uc2l6ZSA9IHNpemU7CisJCQljaHVua3NbaSArIDFdLnR5cGUgPSB0eXBlOworCQkJY2h1bmtzW2kgKyAyXS5hZGRyID0gYWRkciArIHNpemU7CisJCQljaHVua3NbaSArIDJdLnNpemUgPQorCQkJCWNodW5rc1tpXS5hZGRyICsgY2h1bmtzW2ldLnNpemUgLSAoYWRkciArIHNpemUpOworCQkJY2h1bmtzW2kgKyAyXS50eXBlID0gY2h1bmtzW2ldLnR5cGU7CisJCQljaHVua3NbaV0uc2l6ZSA9IGFkZHIgLSBjaHVua3NbaV0uYWRkcjsKKwkJCWkgKz0gMjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNTQxYTc1MC4uOTQ1MWIyMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTExNyw3ICsxMTgsOCBAQAogCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKIAltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7Ci0JcmVncy5wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUOworCXJlZ3MucHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfAorCQlQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8IFBTV19NQVNLX01DSEVDSzsKIAlyZWdzLnBzdy5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGtlcm5lbF90aHJlYWRfc3RhcnRlciB8IFBTV19BRERSX0FNT0RFOwogCXJlZ3MuZ3Byc1s5XSA9ICh1bnNpZ25lZCBsb25nKSBmbjsKIAlyZWdzLmdwcnNbMTBdID0gKHVuc2lnbmVkIGxvbmcpIGFyZzsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzc29yLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3Nvci5jCmluZGV4IDMxMWU5ZDcuLjZlMDA3M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzc29yLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzb3IuYwpAQCAtNzQsNyArNzQsNyBAQAogCiBzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAqcG9zICsgMSkgOiBOVUxMOworCXJldHVybiAqcG9zIDwgbnJfY3B1X2lkcyA/ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAqcG9zICsgMSkgOiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBlZjg2YWQyLi40NTA5MzFhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTQyLDM0ICs0MiwzNyBAQAogCVJFR1NFVF9HRU5FUkFMLAogCVJFR1NFVF9GUCwKIAlSRUdTRVRfTEFTVF9CUkVBSywKKwlSRUdTRVRfU1lTVEVNX0NBTEwsCiAJUkVHU0VUX0dFTkVSQUxfRVhURU5ERUQsCiB9OwogCiB2b2lkIHVwZGF0ZV9wZXJfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwZXJfcmVncyBwZXJfc2luZ2xlX3N0ZXAgPSB7Ci0JCS5jb250cm9sID0gUEVSX0VWRU5UX0lGRVRDSCwKLQkJLnN0YXJ0ID0gMCwKLQkJLmVuZCA9IFBTV19BRERSX0lOU04sCi0JfTsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJnRhc2stPnRocmVhZDsKLQljb25zdCBzdHJ1Y3QgcGVyX3JlZ3MgKm5ldzsKLQlzdHJ1Y3QgcGVyX3JlZ3Mgb2xkOworCXN0cnVjdCBwZXJfcmVncyBvbGQsIG5ldzsKIAotCS8qIFRJRl9TSU5HTEVfU1RFUCBvdmVycmlkZXMgdGhlIHVzZXIgc3BlY2lmaWVkIFBFUiByZWdpc3RlcnMuICovCi0JbmV3ID0gdGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRV9TVEVQKSA/Ci0JCSZwZXJfc2luZ2xlX3N0ZXAgOiAmdGhyZWFkLT5wZXJfdXNlcjsKKwkvKiBDb3B5IHVzZXIgc3BlY2lmaWVkIFBFUiByZWdpc3RlcnMgKi8KKwluZXcuY29udHJvbCA9IHRocmVhZC0+cGVyX3VzZXIuY29udHJvbDsKKwluZXcuc3RhcnQgPSB0aHJlYWQtPnBlcl91c2VyLnN0YXJ0OworCW5ldy5lbmQgPSB0aHJlYWQtPnBlcl91c2VyLmVuZDsKKworCS8qIG1lcmdlIFRJRl9TSU5HTEVfU1RFUCBpbnRvIHVzZXIgc3BlY2lmaWVkIFBFUiByZWdpc3RlcnMuICovCisJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVfU1RFUCkpIHsKKwkJbmV3LmNvbnRyb2wgfD0gUEVSX0VWRU5UX0lGRVRDSDsKKwkJbmV3LnN0YXJ0ID0gMDsKKwkJbmV3LmVuZCA9IFBTV19BRERSX0lOU047CisJfQogCiAJLyogVGFrZSBjYXJlIG9mIHRoZSBQRVIgZW5hYmxlbWVudCBiaXQgaW4gdGhlIFBTVy4gKi8KLQlpZiAoIShuZXctPmNvbnRyb2wgJiBQRVJfRVZFTlRfTUFTSykpIHsKKwlpZiAoIShuZXcuY29udHJvbCAmIFBFUl9FVkVOVF9NQVNLKSkgewogCQlyZWdzLT5wc3cubWFzayAmPSB+UFNXX01BU0tfUEVSOwogCQlyZXR1cm47CiAJfQogCXJlZ3MtPnBzdy5tYXNrIHw9IFBTV19NQVNLX1BFUjsKIAlfX2N0bF9zdG9yZShvbGQsIDksIDExKTsKLQlpZiAobWVtY21wKG5ldywgJm9sZCwgc2l6ZW9mKHN0cnVjdCBwZXJfcmVncykpICE9IDApCi0JCV9fY3RsX2xvYWQoKm5ldywgOSwgMTEpOworCWlmIChtZW1jbXAoJm5ldywgJm9sZCwgc2l6ZW9mKHN0cnVjdCBwZXJfcmVncykpICE9IDApCisJCV9fY3RsX2xvYWQobmV3LCA5LCAxMSk7CiB9CiAKIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMTY2LDggKzE2OSw4IEBACiAJCSAqLwogCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3ICsgYWRkcik7CiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5wc3cubWFzaykKLQkJCS8qIFJlbW92ZSBwZXIgYml0IGZyb20gdXNlciBwc3cuICovCi0JCQl0bXAgJj0gflBTV19NQVNLX1BFUjsKKwkJCS8qIFJldHVybiBhIGNsZWFuIHBzdyBtYXNrLiAqLworCQkJdG1wID0gcHN3X3VzZXJfYml0cyB8ICh0bXAgJiBQU1dfTUFTS19VU0VSKTsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICZkdW1teS0+cmVncy5vcmlnX2dwcjIpIHsKIAkJLyoKQEAgLTI4OSwxOCArMjkyLDE3IEBACiAJCSAqIHBzdyBhbmQgZ3BycyBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjawogCQkgKi8KIAkJaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLnBzdy5tYXNrICYmCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQkgICAgZGF0YSAhPSBQU1dfTUFTS19NRVJHRShwc3dfdXNlcjMyX2JpdHMsIGRhdGEpICYmCi0jZW5kaWYKLQkJICAgIGRhdGEgIT0gUFNXX01BU0tfTUVSR0UocHN3X3VzZXJfYml0cywgZGF0YSkpCisJCSAgICAoKGRhdGEgJiB+UFNXX01BU0tfVVNFUikgIT0gcHN3X3VzZXJfYml0cyB8fAorCQkgICAgICgoZGF0YSAmIFBTV19NQVNLX0VBKSAmJiAhKGRhdGEgJiBQU1dfTUFTS19CQSkpKSkKIAkJCS8qIEludmFsaWQgcHN3IG1hc2suICovCiAJCQlyZXR1cm4gLUVJTlZBTDsKLSNpZm5kZWYgQ09ORklHXzY0QklUCiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5wc3cuYWRkcikKLQkJCS8qIEknZCBsaWtlIHRvIHJlamVjdCBhZGRyZXNzZXMgd2l0aG91dCB0aGUKLQkJCSAgIGhpZ2ggb3JkZXIgYml0IGJ1dCBvbGRlciBnZGIncyByZWx5IG9uIGl0ICovCi0JCQlkYXRhIHw9IFBTV19BRERSX0FNT0RFOwotI2VuZGlmCisJCQkvKgorCQkJICogVGhlIGRlYnVnZ2VyIGNoYW5nZWQgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MsCisJCQkgKiByZXNldCBzeXN0ZW0gY2FsbCByZXN0YXJ0LCBzZWUgc2lnbmFsLmM6ZG9fc2lnbmFsCisJCQkgKi8KKwkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5zeXN0ZW1fY2FsbCA9IDA7CisKIAkJKihhZGRyX3QgKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdyArIGFkZHIpID0gZGF0YTsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSkgewpAQCAtNDk1LDIxICs0OTcsMjEgQEAKIAlfX3UzMiB0bXA7CiAKIAlpZiAoYWRkciA8IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLmFjcnMpIHsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwogCQkvKgogCQkgKiBwc3cgYW5kIGdwcnMgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKIAkJICovCiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5tYXNrKSB7CiAJCQkvKiBGYWtlIGEgMzEgYml0IHBzdyBtYXNrLiAqLwotCQkJdG1wID0gKF9fdTMyKSh0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cubWFzayA+PiAzMik7Ci0JCQl0bXAgPSBQU1czMl9NQVNLX01FUkdFKHBzdzMyX3VzZXJfYml0cywgdG1wKTsKKwkJCXRtcCA9IChfX3UzMikocmVncy0+cHN3Lm1hc2sgPj4gMzIpOworCQkJdG1wID0gcHN3MzJfdXNlcl9iaXRzIHwgKHRtcCAmIFBTVzMyX01BU0tfVVNFUik7CiAJCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cuYWRkcikgewogCQkJLyogRmFrZSBhIDMxIGJpdCBwc3cgYWRkcmVzcy4gKi8KLQkJCXRtcCA9IChfX3UzMikgdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3LmFkZHIgfAotCQkJCVBTVzMyX0FERFJfQU1PREUzMTsKKwkJCXRtcCA9IChfX3UzMikgcmVncy0+cHN3LmFkZHIgfAorCQkJCShfX3UzMikocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19CQSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBncHIgMC0xNSAqLwotCQkJdG1wID0gKihfX3UzMiAqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3ICsKLQkJCQkJIGFkZHIqMiArIDQpOworCQkJdG1wID0gKihfX3UzMiAqKSgoYWRkcl90KSAmcmVncy0+cHN3ICsgYWRkcioyICsgNCk7CiAJCX0KIAl9IGVsc2UgaWYgKGFkZHIgPCAoYWRkcl90KSAoJmR1bW15MzItPnJlZ3Mub3JpZ19ncHIyKSkgewogCQkvKgpAQCAtNTk0LDI0ICs1OTYsMzIgQEAKIAlhZGRyX3Qgb2Zmc2V0OwogCiAJaWYgKGFkZHIgPCAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5hY3JzKSB7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKIAkJLyoKIAkJICogcHN3LCBncHJzLCBhY3JzIGFuZCBvcmlnX2dwcjIgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sKIAkJICovCiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teTMyLT5yZWdzLnBzdy5tYXNrKSB7CiAJCQkvKiBCdWlsZCBhIDY0IGJpdCBwc3cgbWFzayBmcm9tIDMxIGJpdCBtYXNrLiAqLwotCQkJaWYgKHRtcCAhPSBQU1czMl9NQVNLX01FUkdFKHBzdzMyX3VzZXJfYml0cywgdG1wKSkKKwkJCWlmICgodG1wICYgflBTVzMyX01BU0tfVVNFUikgIT0gcHN3MzJfdXNlcl9iaXRzKQogCQkJCS8qIEludmFsaWQgcHN3IG1hc2suICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl0YXNrX3B0X3JlZ3MoY2hpbGQpLT5wc3cubWFzayA9Ci0JCQkJUFNXX01BU0tfTUVSR0UocHN3X3VzZXIzMl9iaXRzLCAoX191NjQpIHRtcCA8PCAzMik7CisJCQlyZWdzLT5wc3cubWFzayA9IChyZWdzLT5wc3cubWFzayAmIH5QU1dfTUFTS19VU0VSKSB8CisJCQkJKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfQkEpIHwKKwkJCQkoX191NjQpKHRtcCAmIFBTVzMyX01BU0tfVVNFUikgPDwgMzI7CiAJCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXkzMi0+cmVncy5wc3cuYWRkcikgewogCQkJLyogQnVpbGQgYSA2NCBiaXQgcHN3IGFkZHJlc3MgZnJvbSAzMSBiaXQgYWRkcmVzcy4gKi8KLQkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnBzdy5hZGRyID0KLQkJCQkoX191NjQpIHRtcCAmIFBTVzMyX0FERFJfSU5TTjsKKwkJCXJlZ3MtPnBzdy5hZGRyID0gKF9fdTY0KSB0bXAgJiBQU1czMl9BRERSX0lOU047CisJCQkvKiBUcmFuc2ZlciAzMSBiaXQgYW1vZGUgYml0IHRvIHBzdyBtYXNrLiAqLworCQkJcmVncy0+cHN3Lm1hc2sgPSAocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfQkEpIHwKKwkJCQkoX191NjQpKHRtcCAmIFBTVzMyX0FERFJfQU1PREUpOworCQkJLyoKKwkJCSAqIFRoZSBkZWJ1Z2dlciBjaGFuZ2VkIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzLAorCQkJICogcmVzZXQgc3lzdGVtIGNhbGwgcmVzdGFydCwgc2VlIHNpZ25hbC5jOmRvX3NpZ25hbAorCQkJICovCisJCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+c3lzdGVtX2NhbGwgPSAwOwogCQl9IGVsc2UgewogCQkJLyogZ3ByIDAtMTUgKi8KLQkJCSooX191MzIqKSgoYWRkcl90KSAmdGFza19wdF9yZWdzKGNoaWxkKS0+cHN3Ci0JCQkJICArIGFkZHIqMiArIDQpID0gdG1wOworCQkJKihfX3UzMiopKChhZGRyX3QpICZyZWdzLT5wc3cgKyBhZGRyKjIgKyA0KSA9IHRtcDsKIAkJfQogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXkzMi0+cmVncy5vcmlnX2dwcjIpKSB7CiAJCS8qCkBAIC03MzUsNyArNzQ1LDcgQEAKIAkJICogZGVidWdnZXIgc3RvcmVkIGFuIGludmFsaWQgc3lzdGVtIGNhbGwgbnVtYmVyLiBTa2lwCiAJCSAqIHRoZSBzeXN0ZW0gY2FsbCBhbmQgdGhlIHN5c3RlbSBjYWxsIHJlc3RhcnQgaGFuZGxpbmcuCiAJCSAqLwotCQlyZWdzLT5zdmNuciA9IDA7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsKIAkJcmV0ID0gLTE7CiAJfQogCkBAIC04OTcsNiArOTA3LDI2IEBACiAKICNlbmRpZgogCitzdGF0aWMgaW50IHMzOTBfc3lzdGVtX2NhbGxfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJCWNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkJCXVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCQl2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgKmRhdGEgPSAmdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT5zeXN0ZW1fY2FsbDsKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgICBkYXRhLCAwLCBzaXplb2YodW5zaWduZWQgaW50KSk7Cit9CisKK3N0YXRpYyBpbnQgczM5MF9zeXN0ZW1fY2FsbF9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQkJdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJCWNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCXVuc2lnbmVkIGludCAqZGF0YSA9ICZ0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPnN5c3RlbV9jYWxsOworCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICBkYXRhLCAwLCBzaXplb2YodW5zaWduZWQgaW50KSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgczM5MF9yZWdzZXRzW10gPSB7CiAJW1JFR1NFVF9HRU5FUkFMXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCkBAIC05MjMsNiArOTUzLDE0IEBACiAJCS5nZXQgPSBzMzkwX2xhc3RfYnJlYWtfZ2V0LAogCX0sCiAjZW5kaWYKKwlbUkVHU0VUX1NZU1RFTV9DQUxMXSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfUzM5MF9TWVNURU1fQ0FMTCwKKwkJLm4gPSAxLAorCQkuc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkuYWxpZ24gPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLmdldCA9IHMzOTBfc3lzdGVtX2NhbGxfZ2V0LAorCQkuc2V0ID0gczM5MF9zeXN0ZW1fY2FsbF9zZXQsCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX3MzOTBfdmlldyA9IHsKQEAgLTExMDIsNiArMTE0MCwxNCBAQAogCQkuYWxpZ24gPSBzaXplb2YobG9uZyksCiAJCS5nZXQgPSBzMzkwX2NvbXBhdF9sYXN0X2JyZWFrX2dldCwKIAl9LAorCVtSRUdTRVRfU1lTVEVNX0NBTExdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9TMzkwX1NZU1RFTV9DQUxMLAorCQkubiA9IDEsCisJCS5zaXplID0gc2l6ZW9mKGNvbXBhdF91aW50X3QpLAorCQkuYWxpZ24gPSBzaXplb2YoY29tcGF0X3VpbnRfdCksCisJCS5nZXQgPSBzMzkwX3N5c3RlbV9jYWxsX2dldCwKKwkJLnNldCA9IHMzOTBfc3lzdGVtX2NhbGxfc2V0LAorCX0sCiAJW1JFR1NFVF9HRU5FUkFMX0VYVEVOREVEXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUzM5MF9ISUdIX0dQUlMsCiAJCS5uID0gc2l6ZW9mKHMzOTBfY29tcGF0X3JlZ3NfaGlnaCkgLyBzaXplb2YoY29tcGF0X2xvbmdfdCksCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKaW5kZXggMzAzZDk2MWMuLmFkNjdjMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKQEAgLTEwLDYgKzEwLDEyIEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICMKKyMgc3RvcmVfc3RhdHVzOiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB1bnRpbCBrZHVtcCBpcyBzdXBwb3J0ZWQgb24gMzEgYml0CisjCitFTlRSWShzdG9yZV9zdGF0dXMpCisJCWJyCSVyMTQKKworIwogIyBkb19yZWlwbF9hc20KICMgUGFyYW1ldGVyOiByMiA9IHNjaGlkIG9mIHJlaXBsIGRldmljZQogIwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUwppbmRleCBlNjkwOTc1Li43MzJhNzkzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUwpAQCAtMTcsMTEgKzE3LDExIEBACiAjCiBFTlRSWShzdG9yZV9zdGF0dXMpCiAJLyogU2F2ZSByZWdpc3RlciBvbmUgYW5kIGxvYWQgc2F2ZSBhcmVhIGJhc2UgKi8KLQlzdGcJJXIxLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkKKwlzdGcJJXIxLF9fTENfU0FWRV9BUkVBKzEyMCglcjApCiAJbGdoaQklcjEsU0FWRV9BUkVBX0JBU0UKIAkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCiAJc3RtZwklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQotCWxnCSVyMixfX0xDX1NBVkVfQVJFQV82NCglcjApCisJbGcJJXIyLF9fTENfU0FWRV9BUkVBKzEyMCglcjApCiAJc3RnCSVyMixfX0xDX0dQUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UrOCglcjEpCiAJLyogQ29udHJvbCByZWdpc3RlcnMgKi8KIAlzdGN0ZwklYzAsJWMxNSxfX0xDX0NSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCkBAIC02Miw4ICs2MiwxMSBAQAogCWxhcmwJJXIyLHN0b3JlX3N0YXR1cwogCXN0ZwklcjIsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgOCglcjEpCiAJYnIJJXIxNAotLmFsaWduCTgKKworCS5zZWN0aW9uIC5ic3MKKwkuYWxpZ24JOAogLkxjbGtjbXA6CS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAorCS5wcmV2aW91cwogCiAjCiAjIGRvX3JlaXBsX2FzbQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDdiMzcxYzMuLjhhYzZiZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTQyLDYgKzQyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogCiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01NywxMiArNjAsMTMgQEAKICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9rdm1fdmlydGlvLmg+CisjaW5jbHVkZSA8YXNtL2RpYWcuaD4KIAotbG9uZyBwc3dfa2VybmVsX2JpdHMJPSAoUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX0RBVCB8IFBTV19BU0NfUFJJTUFSWSB8Ci0JCQkgICBQU1dfTUFTS19NQ0hFQ0sgfCBQU1dfREVGQVVMVF9LRVkpOwotbG9uZyBwc3dfdXNlcl9iaXRzCT0gKFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19EQVQgfCBQU1dfQVNDX0hPTUUgfAotCQkJICAgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0sgfAotCQkJICAgUFNXX01BU0tfUFNUQVRFIHwgUFNXX0RFRkFVTFRfS0VZKTsKK2xvbmcgcHN3X2tlcm5lbF9iaXRzCT0gUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfQkFTRSB8IFBTV19BU0NfUFJJTUFSWSB8CisJCQkgIFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkE7Citsb25nIHBzd191c2VyX2JpdHMJPSBQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8CisJCQkgIFBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0JBU0UgfCBQU1dfTUFTS19NQ0hFQ0sgfAorCQkJICBQU1dfTUFTS19QU1RBVEUgfCBQU1dfQVNDX0hPTUU7CiAKIC8qCiAgKiBVc2VyIGNvcHkgb3BlcmF0aW9ucy4KQEAgLTI3NCwyMiArMjc4LDE0IEBACiB1bnNpZ25lZCBpbnQgdXNlcl9tb2RlID0gSE9NRV9TUEFDRV9NT0RFOwogRVhQT1JUX1NZTUJPTF9HUEwodXNlcl9tb2RlKTsKIAotc3RhdGljIGludCBzZXRfYW1vZGVfYW5kX3VhY2Nlc3ModW5zaWduZWQgbG9uZyB1c2VyX2Ftb2RlLAotCQkJCSB1bnNpZ25lZCBsb25nIHVzZXIzMl9hbW9kZSkKK3N0YXRpYyBpbnQgc2V0X2Ftb2RlX3ByaW1hcnkodm9pZCkKIHsKLQlwc3dfdXNlcl9iaXRzID0gUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX0RBVCB8IHVzZXJfYW1vZGUgfAotCQkJUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0sgfAotCQkJUFNXX01BU0tfUFNUQVRFIHwgUFNXX0RFRkFVTFRfS0VZOworCXBzd19rZXJuZWxfYml0cyA9IChwc3dfa2VybmVsX2JpdHMgJiB+UFNXX01BU0tfQVNDKSB8IFBTV19BU0NfSE9NRTsKKwlwc3dfdXNlcl9iaXRzID0gKHBzd191c2VyX2JpdHMgJiB+UFNXX01BU0tfQVNDKSB8IFBTV19BU0NfUFJJTUFSWTsKICNpZmRlZiBDT05GSUdfQ09NUEFUCi0JcHN3X3VzZXIzMl9iaXRzID0gUFNXX0JBU0UzMl9CSVRTIHwgUFNXX01BU0tfREFUIHwgdXNlcl9hbW9kZSB8Ci0JCQkgIFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLIHwKLQkJCSAgUFNXX01BU0tfUFNUQVRFIHwgUFNXX0RFRkFVTFRfS0VZOwotCXBzdzMyX3VzZXJfYml0cyA9IFBTVzMyX0JBU0VfQklUUyB8IFBTVzMyX01BU0tfREFUIHwgdXNlcjMyX2Ftb2RlIHwKLQkJCSAgUFNXMzJfTUFTS19JTyB8IFBTVzMyX01BU0tfRVhUIHwgUFNXMzJfTUFTS19NQ0hFQ0sgfAotCQkJICBQU1czMl9NQVNLX1BTVEFURTsKKwlwc3czMl91c2VyX2JpdHMgPQorCQkocHN3MzJfdXNlcl9iaXRzICYgflBTVzMyX01BU0tfQVNDKSB8IFBTVzMyX0FTQ19QUklNQVJZOwogI2VuZGlmCi0JcHN3X2tlcm5lbF9iaXRzID0gUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX0RBVCB8IFBTV19BU0NfSE9NRSB8Ci0JCQkgIFBTV19NQVNLX01DSEVDSyB8IFBTV19ERUZBVUxUX0tFWTsKIAogCWlmIChNQUNISU5FX0hBU19NVkNPUykgewogCQltZW1jcHkoJnVhY2Nlc3MsICZ1YWNjZXNzX212Y29zX3N3aXRjaCwgc2l6ZW9mKHVhY2Nlc3MpKTsKQEAgLTMyNSw3ICszMjEsNyBAQAogc3RhdGljIHZvaWQgc2V0dXBfYWRkcmVzc2luZ19tb2RlKHZvaWQpCiB7CiAJaWYgKHVzZXJfbW9kZSA9PSBQUklNQVJZX1NQQUNFX01PREUpIHsKLQkJaWYgKHNldF9hbW9kZV9hbmRfdWFjY2VzcyhQU1dfQVNDX1BSSU1BUlksIFBTVzMyX0FTQ19QUklNQVJZKSkKKwkJaWYgKHNldF9hbW9kZV9wcmltYXJ5KCkpCiAJCQlwcl9pbmZvKCJBZGRyZXNzIHNwYWNlcyBzd2l0Y2hlZCwgIgogCQkJCSJtdmNvcyBhdmFpbGFibGVcbiIpOwogCQllbHNlCkBAIC0zNDQsMjQgKzM0MCwyNSBAQAogCSAqLwogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IF9sb3djb3JlKSAhPSBMQ19QQUdFUyAqIDQwOTYpOwogCWxjID0gX19hbGxvY19ib290bWVtX2xvdyhMQ19QQUdFUyAqIFBBR0VfU0laRSwgTENfUEFHRVMgKiBQQUdFX1NJWkUsIDApOwotCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlsYy0+cmVzdGFydF9wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKIAlsYy0+cmVzdGFydF9wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOwotCWlmICh1c2VyX21vZGUgIT0gSE9NRV9TUEFDRV9NT0RFKQotCQlsYy0+cmVzdGFydF9wc3cubWFzayB8PSBQU1dfQVNDX0hPTUU7Ci0JbGMtPmV4dGVybmFsX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKKwlsYy0+ZXh0ZXJuYWxfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwKKwkJUFNXX01BU0tfREFUIHwgUFNXX01BU0tfTUNIRUNLOwogCWxjLT5leHRlcm5hbF9uZXdfcHN3LmFkZHIgPQogCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBleHRfaW50X2hhbmRsZXI7Ci0JbGMtPnN2Y19uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVDsKKwlsYy0+c3ZjX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyB8CisJCVBTV19NQVNLX0RBVCB8IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLOwogCWxjLT5zdmNfbmV3X3Bzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgc3lzdGVtX2NhbGw7Ci0JbGMtPnByb2dyYW1fbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOworCWxjLT5wcm9ncmFtX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0cyB8CisJCVBTV19NQVNLX0RBVCB8IFBTV19NQVNLX01DSEVDSzsKIAlsYy0+cHJvZ3JhbV9uZXdfcHN3LmFkZHIgPQotCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKXBnbV9jaGVja19oYW5kbGVyOwotCWxjLT5tY2NrX25ld19wc3cubWFzayA9Ci0JCXBzd19rZXJuZWxfYml0cyAmIH5QU1dfTUFTS19NQ0hFQ0sgJiB+UFNXX01BU0tfREFUOworCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwZ21fY2hlY2tfaGFuZGxlcjsKKwlsYy0+bWNja19uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHM7CiAJbGMtPm1jY2tfbmV3X3Bzdy5hZGRyID0KIAkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgbWNja19pbnRfaGFuZGxlcjsKLQlsYy0+aW9fbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOworCWxjLT5pb19uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfAorCQlQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAJbGMtPmlvX25ld19wc3cuYWRkciA9IFBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIGlvX2ludF9oYW5kbGVyOwogCWxjLT5jbG9ja19jb21wYXJhdG9yID0gLTFVTEw7CiAJbGMtPmtlcm5lbF9zdGFjayA9ICgodW5zaWduZWQgbG9uZykgJmluaXRfdGhyZWFkX3VuaW9uKSArIFRIUkVBRF9TSVpFOwpAQCAtNDM1LDEwICs0MzIsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CiAJCWlmICghbWVtb3J5X2NodW5rW2ldLnNpemUpCiAJCQljb250aW51ZTsKKwkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlID09IENIVU5LX09MRE1FTSB8fAorCQkgICAgbWVtb3J5X2NodW5rW2ldLnR5cGUgPT0gQ0hVTktfQ1JBU0hLKQorCQkJY29udGludWU7CiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZigqcmVzKSk7CiAJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTTsKIAkJc3dpdGNoIChtZW1vcnlfY2h1bmtbaV0udHlwZSkgewogCQljYXNlIENIVU5LX1JFQURfV1JJVEU6CisJCWNhc2UgQ0hVTktfQ1JBU0hLOgogCQkJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hVTktfUkVBRF9PTkxZOgpAQCAtNDc5LDYgKzQ4MCw3IEBACiAJdW5zaWduZWQgbG9uZyBtYXhfbWVtOwogCWludCBpOwogCisKICNpZmRlZiBDT05GSUdfWkZDUERVTVAKIAlpZiAoaXBsX2luZm8udHlwZSA9PSBJUExfVFlQRV9GQ1BfRFVNUCkgewogCQltZW1vcnlfZW5kID0gWkZDUERVTVBfSFNBX1NJWkU7CkBAIC01NDUsMTEgKzU0NywyMDEgQEAKIAkgKiBTZXR1cCByZXN0YXJ0IFBTVyBmb3IgYWJzb2x1dGUgemVybyBsb3djb3JlLiBUaGlzIGlzIG5lY2VzYXJ5CiAJICogaWYgUFNXIHJlc3RhcnQgaXMgZG9uZSBvbiBhbiBvZmZsaW5lIENQVSB0aGF0IGhhcyBsb3djb3JlIHplcm8KIAkgKi8KLQlwc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJcHN3Lm1hc2sgPSBQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsKIAlwc3cuYWRkciA9IFBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOwogCWNvcHlfdG9fYWJzb2x1dGVfemVybygmUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3LCAmcHN3LCBzaXplb2YocHN3KSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF92bWNvcmVpbmZvKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJdW5zaWduZWQgbG9uZyBwdHIgPSBwYWRkcl92bWNvcmVpbmZvX25vdGUoKTsKKworCWNvcHlfdG9fYWJzb2x1dGVfemVybygmUzM5MF9sb3djb3JlLnZtY29yZV9pbmZvLCAmcHRyLCBzaXplb2YocHRyKSk7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisKKy8qCisgKiBGaW5kIHN1aXRhYmxlIGxvY2F0aW9uIGZvciBjcmFzaGtlcm5lbCBtZW1vcnkKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfY3Jhc2hfYmFzZSh1bnNpZ25lZCBsb25nIGNyYXNoX3NpemUsCisJCQkJCSAgICBjaGFyICoqbXNnKQoreworCXVuc2lnbmVkIGxvbmcgY3Jhc2hfYmFzZTsKKwlzdHJ1Y3QgbWVtX2NodW5rICpjaHVuazsKKwlpbnQgaTsKKworCWlmIChtZW1vcnlfY2h1bmtbMF0uc2l6ZSA8IGNyYXNoX3NpemUpIHsKKwkJKm1zZyA9ICJmaXJzdCBtZW1vcnkgY2h1bmsgbXVzdCBiZSBhdCBsZWFzdCBjcmFzaGtlcm5lbCBzaXplIjsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpc19rZHVtcF9rZXJuZWwoKSAmJiAoY3Jhc2hfc2l6ZSA9PSBPTERNRU1fU0laRSkpCisJCXJldHVybiBPTERNRU1fQkFTRTsKKworCWZvciAoaSA9IE1FTU9SWV9DSFVOS1MgLSAxOyBpID49IDA7IGktLSkgeworCQljaHVuayA9ICZtZW1vcnlfY2h1bmtbaV07CisJCWlmIChjaHVuay0+c2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChjaHVuay0+dHlwZSAhPSBDSFVOS19SRUFEX1dSSVRFKQorCQkJY29udGludWU7CisJCWlmIChjaHVuay0+c2l6ZSA8IGNyYXNoX3NpemUpCisJCQljb250aW51ZTsKKwkJY3Jhc2hfYmFzZSA9IChjaHVuay0+YWRkciArIGNodW5rLT5zaXplKSAtIGNyYXNoX3NpemU7CisJCWlmIChjcmFzaF9iYXNlIDwgY3Jhc2hfc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3Jhc2hfYmFzZSA8IFpGQ1BEVU1QX0hTQV9TSVpFX01BWCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3Jhc2hfYmFzZSA8ICh1bnNpZ25lZCBsb25nKSBJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gY3Jhc2hfYmFzZTsKKwl9CisJKm1zZyA9ICJubyBzdWl0YWJsZSBhcmVhIGZvdW5kIjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmIGNyYXNoX2Jhc2UgYW5kIGNyYXNoX3NpemUgaXMgdmFsaWQKKyAqLworc3RhdGljIGludCBfX2luaXQgdmVyaWZ5X2NyYXNoX2Jhc2UodW5zaWduZWQgbG9uZyBjcmFzaF9iYXNlLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNyYXNoX3NpemUsCisJCQkJICAgIGNoYXIgKiptc2cpCit7CisJc3RydWN0IG1lbV9jaHVuayAqY2h1bms7CisJaW50IGk7CisKKwkvKgorCSAqIEJlY2F1c2Ugd2UgZG8gdGhlIHN3YXAgdG8gemVybywgd2UgbXVzdCBoYXZlIGF0IGxlYXN0ICdjcmFzaF9zaXplJworCSAqIGJ5dGVzIGZyZWUgc3BhY2UgYmVmb3JlIGNyYXNoX2Jhc2UKKwkgKi8KKwlpZiAoY3Jhc2hfc2l6ZSA+IGNyYXNoX2Jhc2UpIHsKKwkJKm1zZyA9ICJjcmFzaGtlcm5lbCBvZmZzZXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc2l6ZSI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0IG1lbW9yeSBjaHVuayBtdXN0IGJlIGF0IGxlYXN0IGNyYXNoX3NpemUgKi8KKwlpZiAobWVtb3J5X2NodW5rWzBdLnNpemUgPCBjcmFzaF9zaXplKSB7CisJCSptc2cgPSAiZmlyc3QgbWVtb3J5IGNodW5rIG11c3QgYmUgYXQgbGVhc3QgY3Jhc2hrZXJuZWwgc2l6ZSI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBDaGVjayBpZiB3ZSBmaXQgaW50byB0aGUgcmVzcGVjdGl2ZSBtZW1vcnkgY2h1bmsgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CisJCWNodW5rID0gJm1lbW9yeV9jaHVua1tpXTsKKwkJaWYgKGNodW5rLT5zaXplID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNyYXNoX2Jhc2UgPCBjaHVuay0+YWRkcikKKwkJCWNvbnRpbnVlOworCQlpZiAoY3Jhc2hfYmFzZSA+PSBjaHVuay0+YWRkciArIGNodW5rLT5zaXplKQorCQkJY29udGludWU7CisJCS8qIHdlIGhhdmUgZm91bmQgdGhlIG1lbW9yeSBjaHVuayAqLworCQlpZiAoY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgPiBjaHVuay0+YWRkciArIGNodW5rLT5zaXplKSB7CisJCQkqbXNnID0gInNlbGVjdGVkIG1lbW9yeSBjaHVuayBpcyB0b28gc21hbGwgZm9yICIKKwkJCQkiY3Jhc2hrZXJuZWwgbWVtb3J5IjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKwkqbXNnID0gImludmFsaWQgbWVtb3J5IHJhbmdlIHNwZWNpZmllZCI7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBSZXNlcnZlIGtkdW1wIG1lbW9yeSBieSBjcmVhdGluZyBhIG1lbW9yeSBob2xlIGluIHRoZSBtZW1fY2h1bmsgYXJyYXkKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlc2VydmVfa2R1bXBfYm9vdG1lbSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJIGludCB0eXBlKQoreworCisJY3JlYXRlX21lbV9ob2xlKG1lbW9yeV9jaHVuaywgYWRkciwgc2l6ZSwgdHlwZSk7Cit9CisKKy8qCisgKiBXaGVuIGtkdW1wIGlzIGVuYWJsZWQsIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgbm8gbWVtb3J5IGZyb20KKyAqIHRoZSBhcmVhIFswIC0gY3Jhc2hrZXJuZWwgbWVtb3J5IHNpemVdIGFuZAorICogW2NyYXNoa19yZXMuc3RhcnQgLSBjcmFzaGtfcmVzLmVuZF0gaXMgc2V0IG9mZmxpbmUuCisgKi8KK3N0YXRpYyBpbnQga2R1bXBfbWVtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTsKKworCWlmIChhcmctPnN0YXJ0X3BmbiA8IFBGTl9ET1dOKHJlc291cmNlX3NpemUoJmNyYXNoa19yZXMpKSkKKwkJcmV0dXJuIE5PVElGWV9CQUQ7CisJaWYgKGFyZy0+c3RhcnRfcGZuID4gUEZOX0RPV04oY3Jhc2hrX3Jlcy5lbmQpKQorCQlyZXR1cm4gTk9USUZZX09LOworCWlmIChhcmctPnN0YXJ0X3BmbiArIGFyZy0+bnJfcGFnZXMgLSAxIDwgUEZOX0RPV04oY3Jhc2hrX3Jlcy5zdGFydCkpCisJCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIE5PVElGWV9CQUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga2R1bXBfbWVtX25iID0geworCS5ub3RpZmllcl9jYWxsID0ga2R1bXBfbWVtX25vdGlmaWVyLAorfTsKKworI2VuZGlmCisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCBvbGRtZW0sIHdoZXJlIHRoZSBkdW1wIGlzIHN0b3JlZCwgaXMgcHJvdGVjdGVkCisgKi8KK3N0YXRpYyB2b2lkIHJlc2VydmVfb2xkbWVtKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwlpZiAoIU9MRE1FTV9CQVNFKQorCQlyZXR1cm47CisKKwlyZXNlcnZlX2tkdW1wX2Jvb3RtZW0oT0xETUVNX0JBU0UsIE9MRE1FTV9TSVpFLCBDSFVOS19PTERNRU0pOworCXJlc2VydmVfa2R1bXBfYm9vdG1lbShPTERNRU1fU0laRSwgbWVtb3J5X2VuZCAtIE9MRE1FTV9TSVpFLAorCQkJICAgICAgQ0hVTktfT0xETUVNKTsKKwlpZiAoT0xETUVNX0JBU0UgKyBPTERNRU1fU0laRSA9PSByZWFsX21lbW9yeV9zaXplKQorCQlzYXZlZF9tYXhfcGZuID0gUEZOX0RPV04oT0xETUVNX0JBU0UpIC0gMTsKKwllbHNlCisJCXNhdmVkX21heF9wZm4gPSBQRk5fRE9XTihyZWFsX21lbW9yeV9zaXplKSAtIDE7CisjZW5kaWYKK30KKworLyoKKyAqIFJlc2VydmUgbWVtb3J5IGZvciBrZHVtcCBrZXJuZWwgdG8gYmUgbG9hZGVkIHdpdGgga2V4ZWMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlc2VydmVfY3Jhc2hrZXJuZWwodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCXVuc2lnbmVkIGxvbmcgbG9uZyBjcmFzaF9iYXNlLCBjcmFzaF9zaXplOworCWNoYXIgKm1zZzsKKwlpbnQgcmM7CisKKwlyYyA9IHBhcnNlX2NyYXNoa2VybmVsKGJvb3RfY29tbWFuZF9saW5lLCBtZW1vcnlfZW5kLCAmY3Jhc2hfc2l6ZSwKKwkJCSAgICAgICAmY3Jhc2hfYmFzZSk7CisJaWYgKHJjIHx8IGNyYXNoX3NpemUgPT0gMCkKKwkJcmV0dXJuOworCWNyYXNoX2Jhc2UgPSBBTElHTihjcmFzaF9iYXNlLCBLRVhFQ19DUkFTSF9NRU1fQUxJR04pOworCWNyYXNoX3NpemUgPSBBTElHTihjcmFzaF9zaXplLCBLRVhFQ19DUkFTSF9NRU1fQUxJR04pOworCWlmIChyZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoJmtkdW1wX21lbV9uYikpCisJCXJldHVybjsKKwlpZiAoIWNyYXNoX2Jhc2UpCisJCWNyYXNoX2Jhc2UgPSBmaW5kX2NyYXNoX2Jhc2UoY3Jhc2hfc2l6ZSwgJm1zZyk7CisJaWYgKCFjcmFzaF9iYXNlKSB7CisJCXByX2luZm8oImNyYXNoa2VybmVsIHJlc2VydmF0aW9uIGZhaWxlZDogJXNcbiIsIG1zZyk7CisJCXVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKCZrZHVtcF9tZW1fbmIpOworCQlyZXR1cm47CisJfQorCWlmICh2ZXJpZnlfY3Jhc2hfYmFzZShjcmFzaF9iYXNlLCBjcmFzaF9zaXplLCAmbXNnKSkgeworCQlwcl9pbmZvKCJjcmFzaGtlcm5lbCByZXNlcnZhdGlvbiBmYWlsZWQ6ICVzXG4iLCBtc2cpOworCQl1bnJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcigma2R1bXBfbWVtX25iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIU9MRE1FTV9CQVNFICYmIE1BQ0hJTkVfSVNfVk0pCisJCWRpYWcxMF9yYW5nZShQRk5fRE9XTihjcmFzaF9iYXNlKSwgUEZOX0RPV04oY3Jhc2hfc2l6ZSkpOworCWNyYXNoa19yZXMuc3RhcnQgPSBjcmFzaF9iYXNlOworCWNyYXNoa19yZXMuZW5kID0gY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgLSAxOworCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZjcmFzaGtfcmVzKTsKKwlyZXNlcnZlX2tkdW1wX2Jvb3RtZW0oY3Jhc2hfYmFzZSwgY3Jhc2hfc2l6ZSwgQ0hVTktfQ1JBU0hLKTsKKwlwcl9pbmZvKCJSZXNlcnZpbmcgJWxsdU1CIG9mIG1lbW9yeSBhdCAlbGx1TUIgIgorCQkiZm9yIGNyYXNoa2VybmVsIChTeXN0ZW0gUkFNOiAlbHVNQilcbiIsCisJCWNyYXNoX3NpemUgPj4gMjAsIGNyYXNoX2Jhc2UgPj4gMjAsIG1lbW9yeV9lbmQgPj4gMjApOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIF9faW5pdAogc2V0dXBfbWVtb3J5KHZvaWQpCiB7CkBAIC01ODAsNiArNzcyLDE0IEBACiAJCWlmIChQRk5fUEhZUyhzdGFydF9wZm4pICsgYm1hcF9zaXplID4gSU5JVFJEX1NUQVJUKSB7CiAJCQlzdGFydCA9IFBGTl9QSFlTKHN0YXJ0X3BmbikgKyBibWFwX3NpemUgKyBQQUdFX1NJWkU7CiAKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCQkJaWYgKE9MRE1FTV9CQVNFKSB7CisJCQkJLyogTW92ZSBpbml0cmQgYmVoaW5kIGtkdW1wIG9sZG1lbSAqLworCQkJCWlmIChzdGFydCArIElOSVRSRF9TSVpFID4gT0xETUVNX0JBU0UgJiYKKwkJCQkgICAgc3RhcnQgPCBPTERNRU1fQkFTRSArIE9MRE1FTV9TSVpFKQorCQkJCQlzdGFydCA9IE9MRE1FTV9CQVNFICsgT0xETUVNX1NJWkU7CisJCQl9CisjZW5kaWYKIAkJCWlmIChzdGFydCArIElOSVRSRF9TSVpFID4gbWVtb3J5X2VuZCkgewogCQkJCXByX2VycigiaW5pdHJkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiAiCiAJCQkJICAgICAgICJtZW1vcnkgKDB4JTA4bHggPiAweCUwOGx4KSAiCkBAIC02MTAsNyArODEwLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2NodW5rLCBlbmRfY2h1bmssIHBmbjsKIAotCQlpZiAobWVtb3J5X2NodW5rW2ldLnR5cGUgIT0gQ0hVTktfUkVBRF9XUklURSkKKwkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlICE9IENIVU5LX1JFQURfV1JJVEUgJiYKKwkJICAgIG1lbW9yeV9jaHVua1tpXS50eXBlICE9IENIVU5LX0NSQVNISykKIAkJCWNvbnRpbnVlOwogCQlzdGFydF9jaHVuayA9IFBGTl9ET1dOKG1lbW9yeV9jaHVua1tpXS5hZGRyKTsKIAkJZW5kX2NodW5rID0gc3RhcnRfY2h1bmsgKyBQRk5fRE9XTihtZW1vcnlfY2h1bmtbaV0uc2l6ZSk7CkBAIC02NDQsNiArODQ1LDE1IEBACiAJcmVzZXJ2ZV9ib290bWVtKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULCBib290bWFwX3NpemUsCiAJCQlCT09UTUVNX0RFRkFVTFQpOwogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwlpZiAoY3Jhc2hrX3Jlcy5zdGFydCkKKwkJcmVzZXJ2ZV9ib290bWVtKGNyYXNoa19yZXMuc3RhcnQsCisJCQkJY3Jhc2hrX3Jlcy5lbmQgLSBjcmFzaGtfcmVzLnN0YXJ0ICsgMSwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOworCWlmIChpc19rZHVtcF9rZXJuZWwoKSkKKwkJcmVzZXJ2ZV9ib290bWVtKGVsZmNvcmVoZHJfYWRkciAtIE9MRE1FTV9CQVNFLAorCQkJCVBBR0VfQUxJR04oZWxmY29yZWhkcl9zaXplKSwgQk9PVE1FTV9ERUZBVUxUKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCWlmIChJTklUUkRfU1RBUlQgJiYgSU5JVFJEX1NJWkUpIHsKIAkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IG1lbW9yeV9lbmQpIHsKQEAgLTgxMiw4ICsxMDIyLDExIEBACiAJc2V0dXBfaXBsKCk7CiAJc2V0dXBfbWVtb3J5X2VuZCgpOwogCXNldHVwX2FkZHJlc3NpbmdfbW9kZSgpOworCXJlc2VydmVfb2xkbWVtKCk7CisJcmVzZXJ2ZV9jcmFzaGtlcm5lbCgpOwogCXNldHVwX21lbW9yeSgpOwogCXNldHVwX3Jlc291cmNlcygpOworCXNldHVwX3ZtY29yZWluZm8oKTsKIAlzZXR1cF9yZXN0YXJ0X3BzdygpOwogCXNldHVwX2xvd2NvcmUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOWE0MGUxYy4uMDVhODViYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgorI2luY2x1ZGUgPGFzbS9jb21wYXQuaD4KICNpbmNsdWRlICJlbnRyeS5oIgogCiAjZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQpAQCAtMTE2LDcgKzExNyw4IEBACiAKIAkvKiBDb3B5IGEgJ2NsZWFuJyBQU1cgbWFzayB0byB0aGUgdXNlciB0byBhdm9pZCBsZWFraW5nCiAJICAgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBQRVIgaXMgY3VycmVudGx5IG9uLiAgKi8KLQl1c2VyX3NyZWdzLnJlZ3MucHN3Lm1hc2sgPSBQU1dfTUFTS19NRVJHRShwc3dfdXNlcl9iaXRzLCByZWdzLT5wc3cubWFzayk7CisJdXNlcl9zcmVncy5yZWdzLnBzdy5tYXNrID0gcHN3X3VzZXJfYml0cyB8CisJCShyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1VTRVIpOwogCXVzZXJfc3JlZ3MucmVncy5wc3cuYWRkciA9IHJlZ3MtPnBzdy5hZGRyOwogCW1lbWNweSgmdXNlcl9zcmVncy5yZWdzLmdwcnMsICZyZWdzLT5ncHJzLCBzaXplb2Yoc3JlZ3MtPnJlZ3MuZ3BycykpOwogCW1lbWNweSgmdXNlcl9zcmVncy5yZWdzLmFjcnMsIGN1cnJlbnQtPnRocmVhZC5hY3JzLApAQCAtMTQzLDkgKzE0NSwxMyBAQAogCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJnVzZXJfc3JlZ3MsIHNyZWdzLCBzaXplb2YoX3NpZ3JlZ3MpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCXJlZ3MtPnBzdy5tYXNrID0gUFNXX01BU0tfTUVSR0UocmVncy0+cHN3Lm1hc2ssCi0JCQkJCXVzZXJfc3JlZ3MucmVncy5wc3cubWFzayk7Ci0JcmVncy0+cHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8IHVzZXJfc3JlZ3MucmVncy5wc3cuYWRkcjsKKwkvKiBVc2UgcmVncy0+cHN3Lm1hc2sgaW5zdGVhZCBvZiBwc3dfdXNlcl9iaXRzIHRvIHByZXNlcnZlIFBFUiBiaXQuICovCisJcmVncy0+cHN3Lm1hc2sgPSAocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfVVNFUikgfAorCQkodXNlcl9zcmVncy5yZWdzLnBzdy5tYXNrICYgUFNXX01BU0tfVVNFUik7CisJLyogQ2hlY2sgZm9yIGludmFsaWQgYW1vZGUgKi8KKwlpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19FQSkKKwkJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX01BU0tfQkE7CisJcmVncy0+cHN3LmFkZHIgPSB1c2VyX3NyZWdzLnJlZ3MucHN3LmFkZHI7CiAJbWVtY3B5KCZyZWdzLT5ncHJzLCAmdXNlcl9zcmVncy5yZWdzLmdwcnMsIHNpemVvZihzcmVncy0+cmVncy5ncHJzKSk7CiAJbWVtY3B5KCZjdXJyZW50LT50aHJlYWQuYWNycywgJnVzZXJfc3JlZ3MucmVncy5hY3JzLAogCSAgICAgICBzaXplb2Yoc3JlZ3MtPnJlZ3MuYWNycykpOwpAQCAtMTU2LDcgKzE2Miw3IEBACiAJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICY9IEZQQ19WQUxJRF9NQVNLOwogCiAJcmVzdG9yZV9mcF9yZWdzKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncyk7Ci0JcmVncy0+c3ZjbnIgPSAwOwkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOwkvKiBObyBsb25nZXIgaW4gYSBzeXN0ZW0gY2FsbCAqLwogCXJldHVybiAwOwogfQogCkBAIC0yODgsNiArMjk0LDcgQEAKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+Z3Byc1sxNV0gPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsJLyogNjQgYml0IGFtb2RlICovCiAJcmVncy0+cHN3LmFkZHIgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXIgfCBQU1dfQUREUl9BTU9ERTsKIAogCXJlZ3MtPmdwcnNbMl0gPSBtYXBfc2lnbmFsKHNpZyk7CkBAIC0zNTYsNiArMzYzLDcgQEAKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+Z3Byc1sxNV0gPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJcmVncy0+cHN3Lm1hc2sgfD0gUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsJLyogNjQgYml0IGFtb2RlICovCiAJcmVncy0+cHN3LmFkZHIgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXIgfCBQU1dfQUREUl9BTU9ERTsKIAogCXJlZ3MtPmdwcnNbMl0gPSBtYXBfc2lnbmFsKHNpZyk7CkBAIC00MDEsNyArNDA5LDYgQEAKICAqLwogdm9pZCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyByZXR2YWwgPSAwLCBjb250aW51ZV9hZGRyID0gMCwgcmVzdGFydF9hZGRyID0gMDsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7CiAJc3RydWN0IGtfc2lnYWN0aW9uIGthOwpAQCAtNDIxLDU0ICs0MjgsNDUgQEAKIAllbHNlCiAJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOwogCi0JLyogQXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KLQlpZiAocmVncy0+c3ZjbnIpIHsKLQkJY29udGludWVfYWRkciA9IHJlZ3MtPnBzdy5hZGRyOwotCQlyZXN0YXJ0X2FkZHIgPSBjb250aW51ZV9hZGRyIC0gcmVncy0+aWxjOwotCQlyZXR2YWwgPSByZWdzLT5ncHJzWzJdOwotCi0JCS8qIFByZXBhcmUgZm9yIHN5c3RlbSBjYWxsIHJlc3RhcnQuICBXZSBkbyB0aGlzIGhlcmUgc28gdGhhdCBhCi0JCSAgIGRlYnVnZ2VyIHdpbGwgc2VlIHRoZSBhbHJlYWR5IGNoYW5nZWQgUFNXLiAqLwotCQlzd2l0Y2ggKHJldHZhbCkgewotCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKLQkJY2FzZSAtRVJFU1RBUlRTWVM6Ci0JCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgotCQkJcmVncy0+Z3Byc1syXSA9IHJlZ3MtPm9yaWdfZ3ByMjsKLQkJCXJlZ3MtPnBzdy5hZGRyID0gcmVzdGFydF9hZGRyOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKLQkJCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7Ci0JCX0KLQkJcmVncy0+c3ZjbnIgPSAwOwkvKiBEb24ndCBkZWFsIHdpdGggdGhpcyBhZ2Fpbi4gKi8KLQl9Ci0KLQkvKiBHZXQgc2lnbmFsIHRvIGRlbGl2ZXIuICBXaGVuIHJ1bm5pbmcgdW5kZXIgcHRyYWNlLCBhdCB0aGlzIHBvaW50Ci0JICAgdGhlIGRlYnVnZ2VyIG1heSBjaGFuZ2UgYWxsIG91ciByZWdpc3RlcnMgLi4uICovCisJLyoKKwkgKiBHZXQgc2lnbmFsIHRvIGRlbGl2ZXIuIFdoZW4gcnVubmluZyB1bmRlciBwdHJhY2UsIGF0IHRoaXMgcG9pbnQKKwkgKiB0aGUgZGVidWdnZXIgbWF5IGNoYW5nZSBhbGwgb3VyIHJlZ2lzdGVycywgaW5jbHVkaW5nIHRoZSBzeXN0ZW0KKwkgKiBjYWxsIGluZm9ybWF0aW9uLgorCSAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzdGVtX2NhbGwgPQorCQl0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKSA/IHJlZ3MtPnN2Y19jb2RlIDogMDsKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAotCS8qIERlcGVuZGluZyBvbiB0aGUgc2lnbmFsIHNldHRpbmdzIHdlIG1heSBuZWVkIHRvIHJldmVydCB0aGUKLQkgICBkZWNpc2lvbiB0byByZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbC4gKi8KLQlpZiAoc2lnbnIgPiAwICYmIHJlZ3MtPnBzdy5hZGRyID09IHJlc3RhcnRfYWRkcikgewotCQlpZiAocmV0dmFsID09IC1FUkVTVEFSVE5PSEFORAotCQkgICAgfHwgKHJldHZhbCA9PSAtRVJFU1RBUlRTWVMKLQkJCSAmJiAhKGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltzaWduci0xXS5zYS5zYV9mbGFncwotCQkJICAgICAgJiBTQV9SRVNUQVJUKSkpIHsKLQkJCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7Ci0JCQlyZWdzLT5wc3cuYWRkciA9IGNvbnRpbnVlX2FkZHI7Ci0JCX0KLQl9Ci0KIAlpZiAoc2lnbnIgPiAwKSB7CiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwotCQlpbnQgcmV0OwotI2lmZGVmIENPTkZJR19DT01QQVQKLQkJaWYgKGlzX2NvbXBhdF90YXNrKCkpIHsKLQkJCXJldCA9IGhhbmRsZV9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQkgICAgICAgIH0KLQkJZWxzZQotI2VuZGlmCi0JCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCQlpZiAoIXJldCkgeworCQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXN0ZW1fY2FsbCkgeworCQkJcmVncy0+c3ZjX2NvZGUgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c3RlbV9jYWxsOworCQkJLyogQ2hlY2sgZm9yIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuICovCisJCQlzd2l0Y2ggKHJlZ3MtPmdwcnNbMl0pIHsKKwkJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCQlpZiAoIShrYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7CisJCQkJCXJlZ3MtPmdwcnNbMl0gPSAtRUlOVFI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKKwkJCQlyZWdzLT5ncHJzWzJdID0gcmVncy0+b3JpZ19ncHIyOworCQkJCXJlZ3MtPnBzdy5hZGRyID0KKwkJCQkJX19yZXdpbmRfcHN3KHJlZ3MtPnBzdywKKwkJCQkJCSAgICAgcmVncy0+c3ZjX2NvZGUgPj4gMTYpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTm8gbG9uZ2VyIGluIGEgc3lzdGVtIGNhbGwgKi8KKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsKKwkJfQorCisJCWlmICgoaXNfY29tcGF0X3Rhc2soKSA/CisJCSAgICAgaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpIDoKKwkJICAgICBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpKSA9PSAwKSB7CiAJCQkvKgogCQkJICogQSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAogCQkJICogc2lnbWFzayB3aWxsIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIHNpZ25hbCBmcmFtZSwKQEAgLTQ4MiwxMSArNDgwLDMyIEBACiAJCQkgKiBMZXQgdHJhY2luZyBrbm93IHRoYXQgd2UndmUgZG9uZSB0aGUgaGFuZGxlciBzZXR1cC4KIAkJCSAqLwogCQkJdHJhY2Vob29rX3NpZ25hbF9oYW5kbGVyKHNpZ25yLCAmaW5mbywgJmthLCByZWdzLAotCQkJCQl0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVfU1RFUCkpOworCQkJCQkgdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFX1NURVApKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCisJLyogTm8gaGFuZGxlcnMgcHJlc2VudCAtIGNoZWNrIGZvciBzeXN0ZW0gY2FsbCByZXN0YXJ0ICovCisJaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzdGVtX2NhbGwpIHsKKwkJcmVncy0+c3ZjX2NvZGUgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c3RlbV9jYWxsOworCQlzd2l0Y2ggKHJlZ3MtPmdwcnNbMl0pIHsKKwkJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQkJLyogUmVzdGFydCB3aXRoIHN5c19yZXN0YXJ0X3N5c2NhbGwgKi8KKwkJCXJlZ3MtPnN2Y19jb2RlID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQkvKiBSZXN0YXJ0IHN5c3RlbSBjYWxsIHdpdGggbWFnaWMgVElGIGJpdC4gKi8KKwkJCXJlZ3MtPmdwcnNbMl0gPSByZWdzLT5vcmlnX2dwcjI7CisJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKwogCS8qCiAJICogSWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjay4KIAkgKi8KQEAgLTQ5NCwxMyArNTEzLDYgQEAKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CiAJfQotCi0JLyogUmVzdGFydCBhIGRpZmZlcmVudCBzeXN0ZW0gY2FsbC4gKi8KLQlpZiAocmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0sKLQkgICAgJiYgcmVncy0+cHN3LmFkZHIgPT0gY29udGludWVfYWRkcikgewotCQlyZWdzLT5ncHJzWzJdID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7Ci0JCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVEFSVF9TVkMpOwotCX0KIH0KIAogdm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggNmFiMTZhYy4uM2VhODcyOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC05Nyw2ICs5OCwyOSBAQAogCXJldHVybiByYXdfY3B1X3N0b3BwZWQoY3B1X2xvZ2ljYWxfbWFwKGNwdSkpOwogfQogCisvKgorICogRW5zdXJlIHRoYXQgUFNXIHJlc3RhcnQgaXMgZG9uZSBvbiBhbiBvbmxpbmUgQ1BVCisgKi8KK3ZvaWQgc21wX3Jlc3RhcnRfd2l0aF9vbmxpbmVfY3B1KHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChzdGFwKCkgPT0gX19jcHVfbG9naWNhbF9tYXBbY3B1XSkgeworCQkJLyogV2UgYXJlIG9ubGluZTogRW5hYmxlIERBVCBhZ2FpbiBhbmQgcmV0dXJuICovCisJCQlfX2xvYWRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBXZSBhcmUgbm90IG9ubGluZTogRG8gUFNXIHJlc3RhcnQgb24gYW4gb25saW5lIENQVSAqLworCXdoaWxlIChzaWdwKGNwdSwgc2lncF9yZXN0YXJ0KSA9PSBzaWdwX2J1c3kpCisJCWNwdV9yZWxheCgpOworCS8qIEFuZCBzdG9wIG91cnNlbGYgKi8KKwl3aGlsZSAocmF3X3NpZ3Aoc3RhcCgpLCBzaWdwX3N0b3ApID09IHNpZ3BfYnVzeSkKKwkJY3B1X3JlbGF4KCk7CisJZm9yICg7Oyk7Cit9CisKIHZvaWQgc21wX3N3aXRjaF90b19pcGxfY3B1KHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBfbG93Y29yZSAqbGMsICpjdXJyZW50X2xjOwpAQCAtMTA2LDE0ICsxMzAsMTYgQEAKIAogCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkKIAkJZnVuYyhkYXRhKTsKLQlfX2xvYWRfcHN3X21hc2soUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWSk7CisJX19sb2FkX3Bzd19tYXNrKFBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0JBU0UgfAorCQkJUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQSk7CiAJLyogRGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KIAlfX2N0bF9jbGVhcl9iaXQoMCwgMjgpOwogCWN1cnJlbnRfbGMgPSBsb3djb3JlX3B0cltzbXBfcHJvY2Vzc29yX2lkKCldOwogCWxjID0gbG93Y29yZV9wdHJbMF07CiAJaWYgKCFsYykKIAkJbGMgPSBjdXJyZW50X2xjOwotCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlsYy0+cmVzdGFydF9wc3cubWFzayA9CisJCVBTV19ERUZBVUxUX0tFWSB8IFBTV19NQVNLX0JBU0UgfCBQU1dfTUFTS19FQSB8IFBTV19NQVNLX0JBOwogCWxjLT5yZXN0YXJ0X3Bzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgc21wX3Jlc3RhcnRfY3B1OwogCWlmICghY3B1X29ubGluZSgwKSkKIAkJc21wX3N3aXRjaF90b19jcHUoZnVuYywgZGF0YSwgMCwgc3RhcCgpLCBfX2NwdV9sb2dpY2FsX21hcFswXSk7CkBAIC0xMzUsNyArMTYxLDcgQEAKIAlpbnQgY3B1LCByYzsKIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMvbWFjaGluZSBjaGVja3MgKi8KLQlfX2xvYWRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzICYgflBTV19NQVNLX01DSEVDSyk7CisJX19sb2FkX3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX0RBVCk7CiAJdHJhY2VfaGFyZGlycXNfb2ZmKCk7CiAKIAkvKiBzdG9wIGFsbCBwcm9jZXNzb3JzICovCkBAIC0xNjEsNyArMTg3LDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBiaXRzOwogCi0Ja3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tFWFRJTlRfSVBJXSsrOworCWlmIChleHRfaW50X2NvZGUgPT0gMHgxMjAyKQorCQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0VYVElOVF9FWENdKys7CisJZWxzZQorCQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0VYVElOVF9FTVNdKys7CiAJLyoKIAkgKiBoYW5kbGUgYml0IHNpZ25hbCBleHRlcm5hbCBjYWxscwogCSAqLwpAQCAtMTgzLDEyICsyMTIsMTkgQEAKICAqLwogc3RhdGljIHZvaWQgc21wX2V4dF9iaXRjYWxsKGludCBjcHUsIGludCBzaWcpCiB7CisJaW50IG9yZGVyOworCiAJLyoKIAkgKiBTZXQgc2lnbmFsaW5nIGJpdCBpbiBsb3djb3JlIG9mIHRhcmdldCBjcHUgYW5kIGtpY2sgaXQKIAkgKi8KIAlzZXRfYml0KHNpZywgKHVuc2lnbmVkIGxvbmcgKikgJmxvd2NvcmVfcHRyW2NwdV0tPmV4dF9jYWxsX2Zhc3QpOwotCXdoaWxlIChzaWdwKGNwdSwgc2lncF9lbWVyZ2VuY3lfc2lnbmFsKSA9PSBzaWdwX2J1c3kpCisJd2hpbGUgKDEpIHsKKwkJb3JkZXIgPSBzbXBfdmNwdV9zY2hlZHVsZWQoY3B1KSA/CisJCQlzaWdwX2V4dGVybmFsX2NhbGwgOiBzaWdwX2VtZXJnZW5jeV9zaWduYWw7CisJCWlmIChzaWdwKGNwdSwgb3JkZXIpICE9IHNpZ3BfYnVzeSkKKwkJCWJyZWFrOwogCQl1ZGVsYXkoMTApOworCX0KIH0KIAogdm9pZCBhcmNoX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGlfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKQEAgLTI4MSwxMSArMzE3LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHNtcF9jdGxfY2xlYXJfYml0KTsKIAotI2lmZGVmIENPTkZJR19aRkNQRFVNUAorI2lmIGRlZmluZWQoQ09ORklHX1pGQ1BEVU1QKSB8fCBkZWZpbmVkKENPTkZJR19DUkFTSF9EVU1QKQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX2dldF9zYXZlX2FyZWEodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHBoeV9jcHUpCiB7Ci0JaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVApCisJaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVAgJiYgIU9MRE1FTV9CQVNFKQorCQlyZXR1cm47CisJaWYgKGlzX2tkdW1wX2tlcm5lbCgpKQogCQlyZXR1cm47CiAJaWYgKGNwdSA+PSBOUl9DUFVTKSB7CiAJCXByX3dhcm5pbmcoIkNQVSAlaSBleGNlZWRzIHRoZSBtYXhpbXVtICVpIGFuZCBpcyBleGNsdWRlZCBmcm9tICIKQEAgLTQwMyw2ICs0NDEsMTggQEAKIAlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCiAJCXBhbmljKCJzbXBfZGV0ZWN0X2NwdXMgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwlpZiAoT0xETUVNX0JBU0UgJiYgIWlzX2tkdW1wX2tlcm5lbCgpKSB7CisJCXN0cnVjdCBzYXZlX2FyZWEgKnNhdmVfYXJlYTsKKworCQlzYXZlX2FyZWEgPSBrbWFsbG9jKHNpemVvZigqc2F2ZV9hcmVhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2F2ZV9hcmVhKQorCQkJcGFuaWMoImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmUgYXJlYVxuIik7CisJCWNvcHlfb2xkbWVtX3BhZ2UoMSwgKHZvaWQgKikgc2F2ZV9hcmVhLCBzaXplb2YoKnNhdmVfYXJlYSksCisJCQkJIDB4MjAwLCAwKTsKKwkJemZjcGR1bXBfc2F2ZV9hcmVhc1swXSA9IHNhdmVfYXJlYTsKKwl9CisjZW5kaWYKIAkvKiBVc2Ugc2lncCBkZXRlY3Rpb24gYWxnb3JpdGhtIGlmIHNjbHAgZG9lc24ndCB3b3JrLiAqLwogCWlmIChzY2xwX2dldF9jcHVfaW5mbyhpbmZvKSkgewogCQlzbXBfdXNlX3NpZ3BfZGV0ZWN0aW9uID0gMTsKQEAgLTQ2Myw3ICs1MTMsOCBAQAogCXNldF9jcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSwgdHJ1ZSk7CiAJaXBpX2NhbGxfdW5sb2NrKCk7CiAJX19jdGxfY2xlYXJfYml0KDAsIDI4KTsgLyogRGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KLQlTMzkwX2xvd2NvcmUucmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3Lm1hc2sgPQorCQlQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsKIAlTMzkwX2xvd2NvcmUucmVzdGFydF9wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOwogCV9fY3RsX3NldF9iaXQoMCwgMjgpOyAvKiBFbmFibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCkBAIC01MTEsNyArNTYyLDggQEAKIAltZW1zZXQoKGNoYXIgKilsb3djb3JlICsgNTEyLCAwLCBzaXplb2YoKmxvd2NvcmUpIC0gNTEyKTsKIAlsb3djb3JlLT5hc3luY19zdGFjayA9IGFzeW5jX3N0YWNrICsgQVNZTkNfU0laRTsKIAlsb3djb3JlLT5wYW5pY19zdGFjayA9IHBhbmljX3N0YWNrICsgUEFHRV9TSVpFOwotCWxvd2NvcmUtPnJlc3RhcnRfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCWxvd2NvcmUtPnJlc3RhcnRfcHN3Lm1hc2sgPQorCQlQU1dfREVGQVVMVF9LRVkgfCBQU1dfTUFTS19CQVNFIHwgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQTsKIAlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5hZGRyID0KIAkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcmVzdGFydF9pbnRfaGFuZGxlcjsKIAlpZiAodXNlcl9tb2RlICE9IEhPTUVfU1BBQ0VfTU9ERSkKQEAgLTcxMiw2ICs3NjQsOSBAQAogCS8qIHJlcXVlc3QgdGhlIDB4MTIwMSBlbWVyZ2VuY3kgc2lnbmFsIGV4dGVybmFsIGludGVycnVwdCAqLwogCWlmIChyZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHgxMjAxLCBkb19leHRfY2FsbF9pbnRlcnJ1cHQpICE9IDApCiAJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDEyMDEiKTsKKwkvKiByZXF1ZXN0IHRoZSAweDEyMDIgZXh0ZXJuYWwgY2FsbCBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KKwlpZiAocmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MTIwMiwgZG9fZXh0X2NhbGxfaW50ZXJydXB0KSAhPSAwKQorCQlwYW5pYygiQ291bGRuJ3QgcmVxdWVzdCBleHRlcm5hbCBpbnRlcnJ1cHQgMHgxMjAyIik7CiAKIAkvKiBSZWFsbG9jYXRlIGN1cnJlbnQgbG93Y29yZSwgYnV0IGtlZXAgaXRzIGNvbnRlbnRzLiAqLwogCWxvd2NvcmUgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLCBMQ19PUkRFUik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N1c3BlbmQuYyBiL2FyY2gvczM5MC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IGI2ZjlhZmUuLjQ3ZGY3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3VzcGVuZC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3VzcGVuZC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKaW5kZXggNWM5ZTQzOS4uMmE5NGI3NyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkgKi8KIAkJRlBfVU5QQUNLX1NQKFNBLCAmZm1pbCk7CiAJCWlmICgoaW5mby0+Y2FwYWJpbGl0eSA+PiAyMykgPT0gMCkKLQkJCUZQX0ZST01fSU5UX1MoU0IsIGluZm8tPmNhcGFiaWxpdHksIDMyLCBpbnQpOworCQkJRlBfRlJPTV9JTlRfUyhTQiwgKGxvbmcpIGluZm8tPmNhcGFiaWxpdHksIDY0LCBsb25nKTsKIAkJZWxzZQogCQkJRlBfVU5QQUNLX1NQKFNCLCAmaW5mby0+Y2FwYWJpbGl0eSk7CiAJCUZQX0RJVl9TKFNSLCBTQSwgU0IpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCA4ZDY1YmQwLi5lYmJmYWIzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9ldHIuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSAiZW50cnkuaCIKIAogLyogY2hhbmdlIHRoaXMgaWYgeW91IGhhdmUgc29tZSBjb25zdGFudCB0aW1lIGRyaWZ0ICovCiAjZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAgICAgKCh1bnNpZ25lZCBsb25nKSAxMDAwMDAwL0haKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDBjZDM0MGI3Li43N2I4OTQyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCkBAIC0yOTksOCArMjk5LDggQEAKIH0KIF9faW5pdGNhbGwoaW5pdF90b3BvbG9neV91cGRhdGUpOwogCi1zdGF0aWMgdm9pZCBhbGxvY19tYXNrcyhzdHJ1Y3Qgc3lzaW5mb18xNV8xX3ggKmluZm8sIHN0cnVjdCBtYXNrX2luZm8gKm1hc2ssCi0JCQlpbnQgb2Zmc2V0KQorc3RhdGljIHZvaWQgX19pbml0IGFsbG9jX21hc2tzKHN0cnVjdCBzeXNpbmZvXzE1XzFfeCAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgbWFza19pbmZvICptYXNrLCBpbnQgb2Zmc2V0KQogewogCWludCBpLCBucl9tYXNrczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IGZmYWJjZDkuLmE5ODA3ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfUFNUQVRFKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0FTQyksCiAJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19DQyksIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19QTSkpOwogI2lmZGVmIENPTkZJR182NEJJVAotCXByaW50aygiIEVBOiV4IiwgbWFza19iaXRzKHJlZ3MsIFBTV19CQVNFX0JJVFMpKTsKKwlwcmludGsoIiBFQToleCIsIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19FQSB8IFBTV19NQVNLX0JBKSk7CiAjZW5kaWYKIAlwcmludGsoIlxuJXMgR1BSUzogIiBGT1VSTE9ORywgbW9kZSwKIAkgICAgICAgcmVncy0+Z3Byc1swXSwgcmVncy0+Z3Byc1sxXSwgcmVncy0+Z3Byc1syXSwgcmVncy0+Z3Byc1szXSk7CkBAIC0zMzQsNyArMzM0LDggQEAKIAlpbmZvLnNpX3NpZ25vID0gU0lHVFJBUDsKIAlpbmZvLnNpX2Vycm5vID0gMDsKIAlpbmZvLnNpX2NvZGUgPSBUUkFQX0hXQktQVDsKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKSBjdXJyZW50LT50aHJlYWQucGVyX2V2ZW50LmFkZHJlc3M7CisJaW5mby5zaV9hZGRyID0KKwkJKHZvaWQgX19mb3JjZSBfX3VzZXIgKikgY3VycmVudC0+dGhyZWFkLnBlcl9ldmVudC5hZGRyZXNzOwogCWZvcmNlX3NpZ19pbmZvKFNJR1RSQVAsICZpbmZvLCBjdXJyZW50KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCmluZGV4IDJkNjIyOGYuLmJiNDg5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKQEAgLTE3MCw3ICsxNzAsOCBAQAogCXBzd190IHBzdzsKIAogCS8qIFdhaXQgZm9yIGV4dGVybmFsLCBJL08gb3IgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQuICovCi0JcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19XQUlUIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CisJcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19XQUlUIHwKKwkJUFNXX01BU0tfREFUIHwgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAKIAlpZGxlLT5ub2h6X2RlbGF5ID0gMDsKIApAQCAtMTgzLDcgKzE4NCw4IEBACiAJCSAqCXNldF9jcHVfdGltZXIoVlRJTUVSX01BWF9TTElDRSk7CiAJCSAqCWlkbGUtPmlkbGVfZW50ZXIgPSBnZXRfY2xvY2soKTsKIAkJICoJX19sb2FkX3Bzd19tYXNrKHBzd19rZXJuZWxfYml0cyB8IFBTV19NQVNLX1dBSVQgfAotCQkgKgkJCSAgIFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUKTsKKwkJICoJCQkgICBQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19JTyB8CisJCSAqCQkJICAgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfTUNIRUNLKTsKIAkJICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgaW5saW5lIGFzc2VtYmx5IG1ha2VzIHN1cmUgdGhhdAogCQkgKiB0aGUgbGFzdCB0aHJlZSBpbnN0cnVjdGlvbiBhcmUgc3RwdCwgc3RjayBhbmQgbHBzdyBpbiB0aGF0CiAJCSAqIG9yZGVyLiBUaGlzIGlzIGRvbmUgdG8gaW5jcmVhc2UgdGhlIHByZWNpc2lvbi4KQEAgLTIxNiw3ICsyMTgsOCBAQAogCQkgKgl2cS0+aWRsZSA9IGdldF9jcHVfdGltZXIoKTsKIAkJICoJaWRsZS0+aWRsZV9lbnRlciA9IGdldF9jbG9jaygpOwogCQkgKglfX2xvYWRfcHN3X21hc2socHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfV0FJVCB8Ci0JCSAqCQkJICAgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQpOworCQkgKgkJCSAgIFBTV19NQVNLX0RBVCB8IFBTV19NQVNLX0lPIHwKKwkJICoJCQkgICBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0spOwogCQkgKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBpbmxpbmUgYXNzZW1ibHkgbWFrZXMgc3VyZSB0aGF0CiAJCSAqIHRoZSBsYXN0IHRocmVlIGluc3RydWN0aW9uIGFyZSBzdHB0LCBzdGNrIGFuZCBscHN3IGluIHRoYXQKIAkJICogb3JkZXIuIFRoaXMgaXMgZG9uZSB0byBpbmNyZWFzZSB0aGUgcHJlY2lzaW9uLgpAQCAtNDU4LDcgKzQ2MSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFkZF92aXJ0X3RpbWVyX3BlcmlvZGljKTsKIAotaW50IF9fbW9kX3Z0aW1lcihzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyLCBfX3U2NCBleHBpcmVzLCBpbnQgcGVyaW9kaWMpCitzdGF0aWMgaW50IF9fbW9kX3Z0aW1lcihzdHJ1Y3QgdnRpbWVyX2xpc3QgKnRpbWVyLCBfX3U2NCBleHBpcmVzLCBpbnQgcGVyaW9kaWMpCiB7CiAJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZGlhZy5jIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKaW5kZXggOWU0Yzg0MS4uODdjZWRkNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9kaWFnLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogZGlhZy5jIC0gaGFuZGxpbmcgZGlhZ25vc2UgaW5zdHJ1Y3Rpb25zCiAgKgotICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA4CisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDgsMjAxMQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIgb25seSkKQEAgLTE1LDYgKzE1LDM0IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlICJrdm0tczM5MC5oIgogCitzdGF0aWMgaW50IGRpYWdfcmVsZWFzZV9wYWdlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCXVuc2lnbmVkIGxvbmcgcHJlZml4ICA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wcmVmaXg7CisKKwlzdGFydCA9IHZjcHUtPmFyY2guZ3Vlc3RfZ3Byc1sodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYSAmIDB4ZjApID4+IDRdOworCWVuZCA9IHZjcHUtPmFyY2guZ3Vlc3RfZ3Byc1t2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBhICYgMHhmXSArIDQwOTY7CisKKwlpZiAoc3RhcnQgJiB+UEFHRV9NQVNLIHx8IGVuZCAmIH5QQUdFX01BU0sgfHwgc3RhcnQgPiBlbmQKKwkgICAgfHwgc3RhcnQgPCAyICogUEFHRV9TSVpFKQorCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKKworCVZDUFVfRVZFTlQodmNwdSwgNSwgImRpYWcgcmVsZWFzZSBwYWdlcyAlbFggJWxYIiwgc3RhcnQsIGVuZCk7CisJdmNwdS0+c3RhdC5kaWFnbm9zZV8xMCsrOworCisJLyogd2UgY2hlY2tlZCBmb3Igc3RhcnQgPiBlbmQgYWJvdmUgKi8KKwlpZiAoZW5kIDwgcHJlZml4IHx8IHN0YXJ0ID49IHByZWZpeCArIDIgKiBQQUdFX1NJWkUpIHsKKwkJZ21hcF9kaXNjYXJkKHN0YXJ0LCBlbmQsIHZjcHUtPmFyY2guZ21hcCk7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXJ0IDwgcHJlZml4KQorCQkJZ21hcF9kaXNjYXJkKHN0YXJ0LCBwcmVmaXgsIHZjcHUtPmFyY2guZ21hcCk7CisJCWlmIChlbmQgPj0gcHJlZml4KQorCQkJZ21hcF9kaXNjYXJkKHByZWZpeCArIDIgKiBQQUdFX1NJWkUsCisJCQkJICAgICBlbmQsIHZjcHUtPmFyY2guZ21hcCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9fZGlhZ190aW1lX3NsaWNlX2VuZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJVkNQVV9FVkVOVCh2Y3B1LCA1LCAiJXMiLCAiZGlhZyB0aW1lIHNsaWNlIGVuZCIpOwpAQCAtNTcsNiArODUsOCBAQAogCWludCBjb2RlID0gKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgJiAweGZmZjAwMDApID4+IDE2OwogCiAJc3dpdGNoIChjb2RlKSB7CisJY2FzZSAweDEwOgorCQlyZXR1cm4gZGlhZ19yZWxlYXNlX3BhZ2VzKHZjcHUpOwogCWNhc2UgMHg0NDoKIAkJcmV0dXJuIF9fZGlhZ190aW1lX3NsaWNlX2VuZCh2Y3B1KTsKIAljYXNlIDB4MzA4OgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKaW5kZXggYzlhZWI0Yi4uODdjMTY3MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCkBAIC0zOCw2ICszOCwxMSBAQAogCQkJCSAgICAgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKIHsKIAlzd2l0Y2ggKGludGktPnR5cGUpIHsKKwljYXNlIEtWTV9TMzkwX0lOVF9FWFRFUk5BTF9DQUxMOgorCQlpZiAocHN3X2V4dGludF9kaXNhYmxlZCh2Y3B1KSkKKwkJCXJldHVybiAwOworCQlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclswXSAmIDB4MjAwMHVsKQorCQkJcmV0dXJuIDE7CiAJY2FzZSBLVk1fUzM5MF9JTlRfRU1FUkdFTkNZOgogCQlpZiAocHN3X2V4dGludF9kaXNhYmxlZCh2Y3B1KSkKIAkJCXJldHVybiAwOwpAQCAtOTgsNiArMTAzLDcgQEAKIAkJCQkgICAgICBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGkpCiB7CiAJc3dpdGNoIChpbnRpLT50eXBlKSB7CisJY2FzZSBLVk1fUzM5MF9JTlRfRVhURVJOQUxfQ0FMTDoKIAljYXNlIEtWTV9TMzkwX0lOVF9FTUVSR0VOQ1k6CiAJY2FzZSBLVk1fUzM5MF9JTlRfU0VSVklDRToKIAljYXNlIEtWTV9TMzkwX0lOVF9WSVJUSU86CkBAIC0xNDMsNiArMTQ5LDI4IEBACiAJCQlleGNlcHRpb24gPSAxOwogCQlicmVhazsKIAorCWNhc2UgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw6CisJCVZDUFVfRVZFTlQodmNwdSwgNCwgIiVzIiwgImludGVycnVwdDogc2lncCBleHQgY2FsbCIpOworCQl2Y3B1LT5zdGF0LmRlbGl2ZXJfZXh0ZXJuYWxfY2FsbCsrOworCQlyYyA9IHB1dF9ndWVzdF91MTYodmNwdSwgX19MQ19FWFRfSU5UX0NPREUsIDB4MTIwMik7CisJCWlmIChyYyA9PSAtRUZBVUxUKQorCQkJZXhjZXB0aW9uID0gMTsKKworCQlyYyA9IHB1dF9ndWVzdF91MTYodmNwdSwgX19MQ19DUFVfQUREUkVTUywgaW50aS0+ZXh0Y2FsbC5jb2RlKTsKKwkJaWYgKHJjID09IC1FRkFVTFQpCisJCQlleGNlcHRpb24gPSAxOworCisJCXJjID0gY29weV90b19ndWVzdCh2Y3B1LCBfX0xDX0VYVF9PTERfUFNXLAorCQkJICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7CisJCWlmIChyYyA9PSAtRUZBVUxUKQorCQkJZXhjZXB0aW9uID0gMTsKKworCQlyYyA9IGNvcHlfZnJvbV9ndWVzdCh2Y3B1LCAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csCisJCQlfX0xDX0VYVF9ORVdfUFNXLCBzaXplb2YocHN3X3QpKTsKKwkJaWYgKHJjID09IC1FRkFVTFQpCisJCQlleGNlcHRpb24gPSAxOworCQlicmVhazsKKwogCWNhc2UgS1ZNX1MzOTBfSU5UX1NFUlZJQ0U6CiAJCVZDUFVfRVZFTlQodmNwdSwgNCwgImludGVycnVwdDogc2NscCBwYXJtOiV4IiwKIAkJCSAgIGludGktPmV4dC5leHRfcGFyYW1zKTsKQEAgLTUyMiw2ICs1NTAsNyBAQAogCQlicmVhazsKIAljYXNlIEtWTV9TMzkwX1BST0dSQU1fSU5UOgogCWNhc2UgS1ZNX1MzOTBfU0lHUF9TVE9QOgorCWNhc2UgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw6CiAJY2FzZSBLVk1fUzM5MF9JTlRfRU1FUkdFTkNZOgogCWRlZmF1bHQ6CiAJCWtmcmVlKGludGkpOwpAQCAtNTgxLDYgKzYxMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgS1ZNX1MzOTBfU0lHUF9TVE9QOgogCWNhc2UgS1ZNX1MzOTBfUkVTVEFSVDoKKwljYXNlIEtWTV9TMzkwX0lOVF9FWFRFUk5BTF9DQUxMOgogCWNhc2UgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWToKIAkJVkNQVV9FVkVOVCh2Y3B1LCAzLCAiaW5qZWN0OiB0eXBlICV4IiwgczM5MGludC0+dHlwZSk7CiAJCWludGktPnR5cGUgPSBzMzkwaW50LT50eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCmluZGV4IGRjMmI1ODAuLjBiZDNiZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYworKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAl7ICJpbnN0cnVjdGlvbl9sY3RsZyIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9sY3RsZykgfSwKIAl7ICJpbnN0cnVjdGlvbl9sY3RsIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX2xjdGwpIH0sCiAJeyAiZGVsaXZlcl9lbWVyZ2VuY3lfc2lnbmFsIiwgVkNQVV9TVEFUKGRlbGl2ZXJfZW1lcmdlbmN5X3NpZ25hbCkgfSwKKwl7ICJkZWxpdmVyX2V4dGVybmFsX2NhbGwiLCBWQ1BVX1NUQVQoZGVsaXZlcl9leHRlcm5hbF9jYWxsKSB9LAogCXsgImRlbGl2ZXJfc2VydmljZV9zaWduYWwiLCBWQ1BVX1NUQVQoZGVsaXZlcl9zZXJ2aWNlX3NpZ25hbCkgfSwKIAl7ICJkZWxpdmVyX3ZpcnRpb19pbnRlcnJ1cHQiLCBWQ1BVX1NUQVQoZGVsaXZlcl92aXJ0aW9faW50ZXJydXB0KSB9LAogCXsgImRlbGl2ZXJfc3RvcF9zaWduYWwiLCBWQ1BVX1NUQVQoZGVsaXZlcl9zdG9wX3NpZ25hbCkgfSwKQEAgLTY0LDExICs2NSwxMyBAQAogCXsgImluc3RydWN0aW9uX3N0ZmwiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc3RmbCkgfSwKIAl7ICJpbnN0cnVjdGlvbl90cHJvdCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl90cHJvdCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3NlbnNlIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3Bfc2Vuc2UpIH0sCisJeyAiaW5zdHJ1Y3Rpb25fc2lncF9leHRlcm5hbF9jYWxsIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3BfZXh0ZXJuYWxfY2FsbCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeSIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeSkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3N0b3AiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9zdG9wKSB9LAogCXsgImluc3RydWN0aW9uX3NpZ3Bfc2V0X2FyY2giLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9hcmNoKSB9LAogCXsgImluc3RydWN0aW9uX3NpZ3Bfc2V0X3ByZWZpeCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX3ByZWZpeCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3Jlc3RhcnQiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9yZXN0YXJ0KSB9LAorCXsgImRpYWdub3NlXzEwIiwgVkNQVV9TVEFUKGRpYWdub3NlXzEwKSB9LAogCXsgImRpYWdub3NlXzQ0IiwgVkNQVV9TVEFUKGRpYWdub3NlXzQ0KSB9LAogCXsgTlVMTCB9CiB9OwpAQCAtMTc1LDYgKzE3OCw4IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9lcnI7CiAKKwlyYyA9IC1FTk9NRU07CisKIAlrdm0tPmFyY2guc2NhID0gKHN0cnVjdCBzY2FfYmxvY2sgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICgha3ZtLT5hcmNoLnNjYSkKIAkJZ290byBvdXRfZXJyOwpAQCAtMzEyLDExICszMTcsMTcgQEAKIHN0cnVjdCBrdm1fdmNwdSAqa3ZtX2FyY2hfdmNwdV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBpZCkKIHsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX3ZjcHUpLCBHRlBfS0VSTkVMKTsKLQlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlpbnQgcmMgPSAtRUlOVkFMOwogCisJaWYgKGlkID49IEtWTV9NQVhfVkNQVVMpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRU5PTUVNOworCisJdmNwdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fdmNwdSksIEdGUF9LRVJORUwpOwogCWlmICghdmNwdSkKLQkJZ290byBvdXRfbm9tZW07CisJCWdvdG8gb3V0OwogCiAJdmNwdS0+YXJjaC5zaWVfYmxvY2sgPSAoc3RydWN0IGt2bV9zMzkwX3NpZV9ibG9jayAqKQogCQkJCQlnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CkBAIC0zNTIsNyArMzYzLDcgQEAKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHZjcHUtPmFyY2guc2llX2Jsb2NrKSk7CiBvdXRfZnJlZV9jcHU6CiAJa2ZyZWUodmNwdSk7Ci1vdXRfbm9tZW06CitvdXQ6CiAJcmV0dXJuIEVSUl9QVFIocmMpOwogfQogCkBAIC0zODYsNiArMzk3LDcgQEAKIHsKIAltZW1jcHkoJnZjcHUtPmFyY2guZ3Vlc3RfYWNycywgJnNyZWdzLT5hY3JzLCBzaXplb2Yoc3JlZ3MtPmFjcnMpKTsKIAltZW1jcHkoJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3IsICZzcmVncy0+Y3JzLCBzaXplb2Yoc3JlZ3MtPmNycykpOworCXJlc3RvcmVfYWNjZXNzX3JlZ3ModmNwdS0+YXJjaC5ndWVzdF9hY3JzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAxLDYgKzQxMyw3IEBACiB7CiAJbWVtY3B5KCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncy5mcHJzLCAmZnB1LT5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CiAJdmNwdS0+YXJjaC5ndWVzdF9mcHJlZ3MuZnBjID0gZnB1LT5mcGM7CisJcmVzdG9yZV9mcF9yZWdzKCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vc2lncC5jIGIvYXJjaC9zMzkwL2t2bS9zaWdwLmMKaW5kZXggZDZhNTBjMS4uZjgxNTExOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9zaWdwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9zaWdwLmMKQEAgLTg3LDYgKzg3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbnRpLT50eXBlID0gS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWTsKKwlpbnRpLT5lbWVyZy5jb2RlID0gdmNwdS0+dmNwdV9pZDsKIAogCXNwaW5fbG9jaygmZmktPmxvY2spOwogCWxpID0gZmktPmxvY2FsX2ludFtjcHVfYWRkcl07CkBAIC0xMDMsOSArMTA0LDQ3IEBACiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGktPndxKTsKIAlzcGluX3VubG9ja19iaCgmbGktPmxvY2spOwogCXJjID0gMDsgLyogb3JkZXIgYWNjZXB0ZWQgKi8KKwlWQ1BVX0VWRU5UKHZjcHUsIDQsICJzZW50IHNpZ3AgZW1lcmcgdG8gY3B1ICV4IiwgY3B1X2FkZHIpOwogdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7Ci0JVkNQVV9FVkVOVCh2Y3B1LCA0LCAic2VudCBzaWdwIGVtZXJnIHRvIGNwdSAleCIsIGNwdV9hZGRyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19zaWdwX2V4dGVybmFsX2NhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgY3B1X2FkZHIpCit7CisJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSAmdmNwdS0+a3ZtLT5hcmNoLmZsb2F0X2ludDsKKwlzdHJ1Y3Qga3ZtX3MzOTBfbG9jYWxfaW50ZXJydXB0ICpsaTsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGk7CisJaW50IHJjOworCisJaWYgKGNwdV9hZGRyID49IEtWTV9NQVhfVkNQVVMpCisJCXJldHVybiAzOyAvKiBub3Qgb3BlcmF0aW9uYWwgKi8KKworCWludGkgPSBremFsbG9jKHNpemVvZigqaW50aSksIEdGUF9LRVJORUwpOworCWlmICghaW50aSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnRpLT50eXBlID0gS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw7CisJaW50aS0+ZXh0Y2FsbC5jb2RlID0gdmNwdS0+dmNwdV9pZDsKKworCXNwaW5fbG9jaygmZmktPmxvY2spOworCWxpID0gZmktPmxvY2FsX2ludFtjcHVfYWRkcl07CisJaWYgKGxpID09IE5VTEwpIHsKKwkJcmMgPSAzOyAvKiBub3Qgb3BlcmF0aW9uYWwgKi8KKwkJa2ZyZWUoaW50aSk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlzcGluX2xvY2tfYmgoJmxpLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZpbnRpLT5saXN0LCAmbGktPmxpc3QpOworCWF0b21pY19zZXQoJmxpLT5hY3RpdmUsIDEpOworCWF0b21pY19zZXRfbWFzayhDUFVTVEFUX0VYVF9JTlQsIGxpLT5jcHVmbGFncyk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmxpLT53cSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGktPndxKTsKKwlzcGluX3VubG9ja19iaCgmbGktPmxvY2spOworCXJjID0gMDsgLyogb3JkZXIgYWNjZXB0ZWQgKi8KKwlWQ1BVX0VWRU5UKHZjcHUsIDQsICJzZW50IHNpZ3AgZXh0IGNhbGwgdG8gY3B1ICV4IiwgY3B1X2FkZHIpOwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjcsNiArMzA2LDEwIEBACiAJCXJjID0gX19zaWdwX3NlbnNlKHZjcHUsIGNwdV9hZGRyLAogCQkJCSAgJnZjcHUtPmFyY2guZ3Vlc3RfZ3Byc1tyMV0pOwogCQlicmVhazsKKwljYXNlIFNJR1BfRVhURVJOQUxfQ0FMTDoKKwkJdmNwdS0+c3RhdC5pbnN0cnVjdGlvbl9zaWdwX2V4dGVybmFsX2NhbGwrKzsKKwkJcmMgPSBfX3NpZ3BfZXh0ZXJuYWxfY2FsbCh2Y3B1LCBjcHVfYWRkcik7CisJCWJyZWFrOwogCWNhc2UgU0lHUF9FTUVSR0VOQ1k6CiAJCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3krKzsKIAkJcmMgPSBfX3NpZ3BfZW1lcmdlbmN5KHZjcHUsIGNwdV9hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvZGVsYXkuYyBiL2FyY2gvczM5MC9saWIvZGVsYXkuYwppbmRleCBhNjUyMjlkLi5kYjkyZjA0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL2RlbGF5LmMKKysrIGIvYXJjaC9zMzkwL2xpYi9kZWxheS5jCkBAIC0zMiw3ICszMiw4IEBACiAJdTY0IGNsb2NrX3NhdmVkOwogCXU2NCBlbmQ7CiAKLQltYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfV0FJVCB8IFBTV19NQVNLX0VYVDsKKwltYXNrID0gcHN3X2tlcm5lbF9iaXRzIHwgUFNXX01BU0tfREFUIHwgUFNXX01BU0tfV0FJVCB8CisJCVBTV19NQVNLX0VYVCB8IFBTV19NQVNLX01DSEVDSzsKIAllbmQgPSBnZXRfY2xvY2soKSArICh1c2VjcyA8PCAxMik7CiAJY2xvY2tfc2F2ZWQgPSBsb2NhbF90aWNrX2Rpc2FibGUoKTsKIAlfX2N0bF9zdG9yZShjcjBfc2F2ZWQsIDAsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3B0LmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwppbmRleCA3NDgzMzgzLi4zNDJhZTM1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwpAQCAtMzQyLDcgKzM0Miw4IEBACiAJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpCiAJCXJldHVybiBfX2Z1dGV4X2F0b21pY19vcF9wdChvcCwgdWFkZHIsIG9wYXJnLCBvbGQpOwogCXNwaW5fbG9jaygmY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0JdWFkZHIgPSAoaW50IF9fdXNlciAqKSBfX2RhdF91c2VyX2FkZHIoKHVuc2lnbmVkIGxvbmcpIHVhZGRyKTsKKwl1YWRkciA9ICh1MzIgX19mb3JjZSBfX3VzZXIgKikKKwkJX19kYXRfdXNlcl9hZGRyKChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcpIHVhZGRyKTsKIAlpZiAoIXVhZGRyKSB7CiAJCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zNzgsNyArMzc5LDggQEAKIAlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKIAkJcmV0dXJuIF9fZnV0ZXhfYXRvbWljX2NtcHhjaGdfcHQodXZhbCwgdWFkZHIsIG9sZHZhbCwgbmV3dmFsKTsKIAlzcGluX2xvY2soJmN1cnJlbnQtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCXVhZGRyID0gKGludCBfX3VzZXIgKikgX19kYXRfdXNlcl9hZGRyKCh1bnNpZ25lZCBsb25nKSB1YWRkcik7CisJdWFkZHIgPSAodTMyIF9fZm9yY2UgX191c2VyICopCisJCV9fZGF0X3VzZXJfYWRkcigoX19mb3JjZSB1bnNpZ25lZCBsb25nKSB1YWRkcik7CiAJaWYgKCF1YWRkcikgewogCQlzcGluX3VubG9jaygmY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwppbmRleCA5NTY0ZmM3Li4xNzY2ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZmF1bHQuYworKysgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAKICNpZmRlZiBDT05GSUdfUEdTVEUKIAlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJRSkgJiYgUzM5MF9sb3djb3JlLmdtYXApIHsKLQkJYWRkcmVzcyA9IGdtYXBfZmF1bHQoYWRkcmVzcywKKwkJYWRkcmVzcyA9IF9fZ21hcF9mYXVsdChhZGRyZXNzLAogCQkJCSAgICAgKHN0cnVjdCBnbWFwICopIFMzOTBfbG93Y29yZS5nbWFwKTsKIAkJaWYgKGFkZHJlc3MgPT0gLUVGQVVMVCkgewogCQkJZmF1bHQgPSBWTV9GQVVMVF9CQURNQVA7CkBAIC0zOTMsNyArMzkzLDcgQEAKIAlpbnQgZmF1bHQ7CiAKIAkvKiBQcm90ZWN0aW9uIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2luZywgZGVjcmVtZW50IHBzdyBhZGRyZXNzLiAqLwotCXJlZ3MtPnBzdy5hZGRyIC09IChwZ21faW50X2NvZGUgPj4gMTYpOworCXJlZ3MtPnBzdy5hZGRyID0gX19yZXdpbmRfcHN3KHJlZ3MtPnBzdywgcGdtX2ludF9jb2RlID4+IDE2KTsKIAkvKgogCSAqIENoZWNrIGZvciBsb3ctYWRkcmVzcyBwcm90ZWN0aW9uLiAgVGhpcyBuZWVkcyB0byBiZSB0cmVhdGVkCiAJICogYXMgYSBzcGVjaWFsIGNhc2UgYmVjYXVzZSB0aGUgdHJhbnNsYXRpb24gZXhjZXB0aW9uIGNvZGUKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAJaW50IGFjY2VzcywgZmF1bHQ7CiAKLQlyZWdzLnBzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOworCXJlZ3MucHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHMgfCBQU1dfTUFTS19EQVQgfCBQU1dfTUFTS19NQ0hFQ0s7CiAJaWYgKCFpcnFzX2Rpc2FibGVkKCkpCiAJCXJlZ3MucHN3Lm1hc2sgfD0gUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQ7CiAJcmVncy5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZ3VwLmMgYi9hcmNoL3MzOTAvbW0vZ3VwLmMKaW5kZXggNDViNDA1Yy4uNjVjYjA2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2d1cC5jCisrKyBiL2FyY2gvczM5MC9tbS9ndXAuYwpAQCAtNTIsNyArNTIsNyBAQAogCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IHdyaXRlLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm5yKQogewogCXVuc2lnbmVkIGxvbmcgbWFzaywgcmVzdWx0OwotCXN0cnVjdCBwYWdlICpoZWFkLCAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqaGVhZCwgKnBhZ2UsICp0YWlsOwogCWludCByZWZzOwogCiAJcmVzdWx0ID0gd3JpdGUgPyAwIDogX1NFR01FTlRfRU5UUllfUk87CkBAIC02NCw2ICs2NCw3IEBACiAJcmVmcyA9IDA7CiAJaGVhZCA9IHBtZF9wYWdlKHBtZCk7CiAJcGFnZSA9IGhlYWQgKyAoKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQpOworCXRhaWwgPSBwYWdlOwogCWRvIHsKIAkJVk1fQlVHX09OKGNvbXBvdW5kX2hlYWQocGFnZSkgIT0gaGVhZCk7CiAJCXBhZ2VzWypucl0gPSBwYWdlOwpAQCAtODEsNiArODIsMTcgQEAKIAkJKm5yIC09IHJlZnM7CiAJCXdoaWxlIChyZWZzLS0pCiAJCQlwdXRfcGFnZShoZWFkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbnkgdGFpbCBwYWdlIG5lZWQgdGhlaXIgbWFwY291bnQgcmVmZXJlbmNlIHRha2VuIGJlZm9yZSB3ZQorCSAqIHJldHVybi4KKwkgKi8KKwl3aGlsZSAocmVmcy0tKSB7CisJCWlmIChQYWdlVGFpbCh0YWlsKSkKKwkJCWdldF9odWdlX3BhZ2VfdGFpbCh0YWlsKTsKKwkJdGFpbCsrOwogCX0KIAogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2luaXQuYyBiL2FyY2gvczM5MC9tbS9pbml0LmMKaW5kZXggNTliNjYzMS4uZDRiOWZiNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2luaXQuYworKysgYi9hcmNoL3MzOTAvbW0vaW5pdC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCmluZGV4IDVkYmJhYTYuLjFjYjg0MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKKysrIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCkBAIC02MCw2ICs2MSw5IEBACiAJcmV0dXJuIGNvcGllZCA8IDAgPyAtRUZBVUxUIDogMDsKIH0KIAorLyoKKyAqIENvcHkgbWVtb3J5IGluIHJlYWwgbW9kZSAoa2VybmVsIHRvIGtlcm5lbCkKKyAqLwogaW50IG1lbWNweV9yZWFsKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX2Rlc3QgYXNtKCIyIikgPSAodW5zaWduZWQgbG9uZykgZGVzdDsKQEAgLTEwMSwzICsxMDUsNTUgQEAKIAlfX2N0bF9sb2FkKGNyMCwgMCwgMCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KKworLyoKKyAqIENvcHkgbWVtb3J5IGZyb20ga2VybmVsIChyZWFsKSB0byB1c2VyICh2aXJ0dWFsKQorICovCitpbnQgY29weV90b191c2VyX3JlYWwodm9pZCBfX3VzZXIgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQoreworCWludCBvZmZzID0gMCwgc2l6ZSwgcmM7CisJY2hhciAqYnVmOworCisJYnVmID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyYyA9IC1FRkFVTFQ7CisJd2hpbGUgKG9mZnMgPCBjb3VudCkgeworCQlzaXplID0gbWluKFBBR0VfU0laRSwgY291bnQgLSBvZmZzKTsKKwkJaWYgKG1lbWNweV9yZWFsKGJ1Ziwgc3JjICsgb2Zmcywgc2l6ZSkpCisJCQlnb3RvIG91dDsKKwkJaWYgKGNvcHlfdG9fdXNlcihkZXN0ICsgb2ZmcywgYnVmLCBzaXplKSkKKwkJCWdvdG8gb3V0OworCQlvZmZzICs9IHNpemU7CisJfQorCXJjID0gMDsKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJcmV0dXJuIHJjOworfQorCisvKgorICogQ29weSBtZW1vcnkgZnJvbSB1c2VyICh2aXJ0dWFsKSB0byBrZXJuZWwgKHJlYWwpCisgKi8KK2ludCBjb3B5X2Zyb21fdXNlcl9yZWFsKHZvaWQgKmRlc3QsIHZvaWQgX191c2VyICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgb2ZmcyA9IDAsIHNpemUsIHJjOworCWNoYXIgKmJ1ZjsKKworCWJ1ZiA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSAtRUZBVUxUOworCXdoaWxlIChvZmZzIDwgY291bnQpIHsKKwkJc2l6ZSA9IG1pbihQQUdFX1NJWkUsIGNvdW50IC0gb2Zmcyk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHNyYyArIG9mZnMsIHNpemUpKQorCQkJZ290byBvdXQ7CisJCWlmIChtZW1jcHlfcmVhbChkZXN0ICsgb2ZmcywgYnVmLCBzaXplKSkKKwkJCWdvdG8gb3V0OworCQlvZmZzICs9IHNpemU7CisJfQorCXJjID0gMDsKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL21tYXAuYyBiL2FyY2gvczM5MC9tbS9tbWFwLmMKaW5kZXggYzlhOWY3Zi4uZjA5Yzc0OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL21tYXAuYworKysgYi9hcmNoL3MzOTAvbW0vbW1hcC5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCmluZGV4IGQwMTNlZDMuLmIzNjUzN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogc3RhdGljIHZvaWQgY2hhbmdlX3BhZ2VfYXR0cih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcywKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IDVkNTZjMmIuLjMwMWM4NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcsMjAwOQorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3LDIwMTEKICAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgogICovCiAKQEAgLTIyMiw2ICsyMjIsNyBAQAogCiAJLyogRnJlZSBhbGwgc2VnbWVudCAmIHJlZ2lvbiB0YWJsZXMuICovCiAJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCXNwaW5fbG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIG5leHQsICZnbWFwLT5jcnN0X2xpc3QsIGxydSkgewogCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKIAkJaWYgKCgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX1RZUEVfTUFTSykgPT0gMCkKQEAgLTIzMCw2ICsyMzEsNyBAQAogCQkJCWdtYXBfdW5saW5rX3NlZ21lbnQoZ21hcCwgdGFibGUpOwogCQlfX2ZyZWVfcGFnZXMocGFnZSwgQUxMT0NfT1JERVIpOwogCX0KKwlzcGluX3VubG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKIAlsaXN0X2RlbCgmZ21hcC0+bGlzdCk7CiAJa2ZyZWUoZ21hcCk7CkBAIC0yNTYsNiArMjU4LDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdtYXBfZGlzYWJsZSk7CiAKKy8qCisgKiBnbWFwX2FsbG9jX3RhYmxlIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIHdpdGggbW1hcF9zZW0gaGVsZAorICovCiBzdGF0aWMgaW50IGdtYXBfYWxsb2NfdGFibGUoc3RydWN0IGdtYXAgKmdtYXAsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqdGFibGUsIHVuc2lnbmVkIGxvbmcgaW5pdCkKIHsKQEAgLTI2NywxNCArMjcyLDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCW5ldyA9ICh1bnNpZ25lZCBsb25nICopIHBhZ2VfdG9fcGh5cyhwYWdlKTsKIAljcnN0X3RhYmxlX2luaXQobmV3LCBpbml0KTsKLQlkb3duX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CiAJaWYgKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfSU5WKSB7CiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZnbWFwLT5jcnN0X2xpc3QpOwogCQkqdGFibGUgPSAodW5zaWduZWQgbG9uZykgbmV3IHwgX1JFR0lPTl9FTlRSWV9MRU5HVEggfAogCQkJKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfVFlQRV9NQVNLKTsKIAl9IGVsc2UKIAkJX19mcmVlX3BhZ2VzKHBhZ2UsIEFMTE9DX09SREVSKTsKLQl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOwogCXJldHVybiAwOwogfQogCkBAIC0yOTksNiArMzAyLDcgQEAKIAogCWZsdXNoID0gMDsKIAlkb3duX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CisJc3Bpbl9sb2NrKCZnbWFwLT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlmb3IgKG9mZiA9IDA7IG9mZiA8IGxlbjsgb2ZmICs9IFBNRF9TSVpFKSB7CiAJCS8qIFdhbGsgdGhlIGd1ZXN0IGFkZHIgc3BhY2UgcGFnZSB0YWJsZSAqLwogCQl0YWJsZSA9IGdtYXAtPnRhYmxlICsgKCgodG8gKyBvZmYpID4+IDUzKSAmIDB4N2ZmKTsKQEAgLTMyMCw2ICszMjQsNyBAQAogCQkqdGFibGUgPSBfU0VHTUVOVF9FTlRSWV9JTlY7CiAJfQogb3V0OgorCXNwaW5fdW5sb2NrKCZnbWFwLT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKIAl1cF9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOwogCWlmIChmbHVzaCkKIAkJZ21hcF9mbHVzaF90bGIoZ21hcCk7CkBAIC0zNTAsNiArMzU1LDcgQEAKIAogCWZsdXNoID0gMDsKIAlkb3duX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CisJc3Bpbl9sb2NrKCZnbWFwLT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlmb3IgKG9mZiA9IDA7IG9mZiA8IGxlbjsgb2ZmICs9IFBNRF9TSVpFKSB7CiAJCS8qIFdhbGsgdGhlIGdtYXAgYWRkcmVzcyBzcGFjZSBwYWdlIHRhYmxlICovCiAJCXRhYmxlID0gZ21hcC0+dGFibGUgKyAoKCh0byArIG9mZikgPj4gNTMpICYgMHg3ZmYpOwpAQCAtMzczLDE5ICszNzksMjQgQEAKIAkJZmx1c2ggfD0gZ21hcF91bmxpbmtfc2VnbWVudChnbWFwLCB0YWJsZSk7CiAJCSp0YWJsZSA9IF9TRUdNRU5UX0VOVFJZX0lOViB8IF9TRUdNRU5UX0VOVFJZX1JPIHwgKGZyb20gKyBvZmYpOwogCX0KKwlzcGluX3VubG9jaygmZ21hcC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKIAlpZiAoZmx1c2gpCiAJCWdtYXBfZmx1c2hfdGxiKGdtYXApOwogCXJldHVybiAwOwogCiBvdXRfdW5tYXA6CisJc3Bpbl91bmxvY2soJmdtYXAtPm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CiAJZ21hcF91bm1hcF9zZWdtZW50KGdtYXAsIHRvLCBsZW4pOwogCXJldHVybiAtRU5PTUVNOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ21hcF9tYXBfc2VnbWVudCk7CiAKLXVuc2lnbmVkIGxvbmcgZ21hcF9mYXVsdCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBnbWFwICpnbWFwKQorLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQgd2l0aCBtbWFwX3NlbSBoZWxkCisgKi8KK3Vuc2lnbmVkIGxvbmcgX19nbWFwX2ZhdWx0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IGdtYXAgKmdtYXApCiB7CiAJdW5zaWduZWQgbG9uZyAqdGFibGUsIHZtYWRkciwgc2VnbWVudDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKQEAgLTQ0NSwxNiArNDU2LDc1IEBACiAJCXBhZ2UgPSBwbWRfcGFnZSgqcG1kKTsKIAkJbXAgPSAoc3RydWN0IGdtYXBfcGd0YWJsZSAqKSBwYWdlLT5pbmRleDsKIAkJcm1hcC0+ZW50cnkgPSB0YWJsZTsKKwkJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAkJbGlzdF9hZGQoJnJtYXAtPmxpc3QsICZtcC0+bWFwcGVyKTsKKwkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCQkvKiBTZXQgZ21hcCBzZWdtZW50IHRhYmxlIGVudHJ5IHRvIHBhZ2UgdGFibGUuICovCiAJCSp0YWJsZSA9IHBtZF92YWwoKnBtZCkgJiBQQUdFX01BU0s7CiAJCXJldHVybiB2bWFkZHIgfCAoYWRkcmVzcyAmIH5QTURfTUFTSyk7CiAJfQogCXJldHVybiAtRUZBVUxUOworfQogCit1bnNpZ25lZCBsb25nIGdtYXBfZmF1bHQodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgZ21hcCAqZ21hcCkKK3sKKwl1bnNpZ25lZCBsb25nIHJjOworCisJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCXJjID0gX19nbWFwX2ZhdWx0KGFkZHJlc3MsIGdtYXApOworCXVwX3JlYWQoJmdtYXAtPm1tLT5tbWFwX3NlbSk7CisKKwlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnbWFwX2ZhdWx0KTsKIAordm9pZCBnbWFwX2Rpc2NhcmQodW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvLCBzdHJ1Y3QgZ21hcCAqZ21hcCkKK3sKKworCXVuc2lnbmVkIGxvbmcgKnRhYmxlLCBhZGRyZXNzLCBzaXplOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBnbWFwX3BndGFibGUgKm1wOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJZG93bl9yZWFkKCZnbWFwLT5tbS0+bW1hcF9zZW0pOworCWFkZHJlc3MgPSBmcm9tOworCXdoaWxlIChhZGRyZXNzIDwgdG8pIHsKKwkJLyogV2FsayB0aGUgZ21hcCBhZGRyZXNzIHNwYWNlIHBhZ2UgdGFibGUgKi8KKwkJdGFibGUgPSBnbWFwLT50YWJsZSArICgoYWRkcmVzcyA+PiA1MykgJiAweDdmZik7CisJCWlmICh1bmxpa2VseSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX0lOVikpIHsKKwkJCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBNRF9TSVpFKSAmIFBNRF9NQVNLOworCQkJY29udGludWU7CisJCX0KKwkJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSgqdGFibGUgJiBfUkVHSU9OX0VOVFJZX09SSUdJTik7CisJCXRhYmxlID0gdGFibGUgKyAoKGFkZHJlc3MgPj4gNDIpICYgMHg3ZmYpOworCQlpZiAodW5saWtlbHkoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9JTlYpKSB7CisJCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pOworCQl0YWJsZSA9IHRhYmxlICsgKChhZGRyZXNzID4+IDMxKSAmIDB4N2ZmKTsKKwkJaWYgKHVubGlrZWx5KCp0YWJsZSAmIF9SRUdJT05fRU5UUllfSU5WKSkgeworCQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CisJCQljb250aW51ZTsKKwkJfQorCQl0YWJsZSA9ICh1bnNpZ25lZCBsb25nICopKCp0YWJsZSAmIF9SRUdJT05fRU5UUllfT1JJR0lOKTsKKwkJdGFibGUgPSB0YWJsZSArICgoYWRkcmVzcyA+PiAyMCkgJiAweDdmZik7CisJCWlmICh1bmxpa2VseSgqdGFibGUgJiBfU0VHTUVOVF9FTlRSWV9JTlYpKSB7CisJCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBhZ2UgPSBwZm5fdG9fcGFnZSgqdGFibGUgPj4gUEFHRV9TSElGVCk7CisJCW1wID0gKHN0cnVjdCBnbWFwX3BndGFibGUgKikgcGFnZS0+aW5kZXg7CisJCXZtYSA9IGZpbmRfdm1hKGdtYXAtPm1tLCBtcC0+dm1hZGRyKTsKKwkJc2l6ZSA9IG1pbih0byAtIGFkZHJlc3MsIFBNRF9TSVpFIC0gKGFkZHJlc3MgJiB+UE1EX01BU0spKTsKKwkJemFwX3BhZ2VfcmFuZ2Uodm1hLCBtcC0+dm1hZGRyIHwgKGFkZHJlc3MgJiB+UE1EX01BU0spLAorCQkJICAgICAgIHNpemUsIE5VTEwpOworCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKKwl9CisJdXBfcmVhZCgmZ21hcC0+bW0tPm1tYXBfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdtYXBfZGlzY2FyZCk7CisKIHZvaWQgZ21hcF91bm1hcF9ub3RpZmllcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqdGFibGUpCiB7CiAJc3RydWN0IGdtYXBfcm1hcCAqcm1hcCwgKm5leHQ7CkBAIC02NjIsOCArNzMyLDkgQEAKIAogdm9pZCBfX3RsYl9yZW1vdmVfdGFibGUodm9pZCAqX3RhYmxlKQogewotCXZvaWQgKnRhYmxlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpIF90YWJsZSAmIFBBR0VfTUFTSyk7Ci0JdW5zaWduZWQgdHlwZSA9ICh1bnNpZ25lZCBsb25nKSBfdGFibGUgJiB+UEFHRV9NQVNLOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IChGUkFHX01BU0sgPDwgNCkgfCBGUkFHX01BU0s7CisJdm9pZCAqdGFibGUgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgX3RhYmxlICYgfm1hc2spOworCXVuc2lnbmVkIHR5cGUgPSAodW5zaWduZWQgbG9uZykgX3RhYmxlICYgbWFzazsKIAogCWlmICh0eXBlKQogCQlfX3BhZ2VfdGFibGVfZnJlZV9yY3UodGFibGUsIHR5cGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3ZtZW0uYyBiL2FyY2gvczM5MC9tbS92bWVtLmMKaW5kZXggNzgxZmY1MS4uNDc5OTM4MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3ZtZW0uYworKysgYi9hcmNoL3MzOTAvbW0vdm1lbS5jCkBAIC0zMzUsNiArMzM1LDkgQEAKIAlyb19zdGFydCA9ICgodW5zaWduZWQgbG9uZykmX3N0ZXh0KSAmIFBBR0VfTUFTSzsKIAlyb19lbmQgPSBQRk5fQUxJR04oKHVuc2lnbmVkIGxvbmcpJl9lc2hhcmVkKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgeworCQlpZiAobWVtb3J5X2NodW5rW2ldLnR5cGUgPT0gQ0hVTktfQ1JBU0hLIHx8CisJCSAgICBtZW1vcnlfY2h1bmtbaV0udHlwZSA9PSBDSFVOS19PTERNRU0pCisJCQljb250aW51ZTsKIAkJc3RhcnQgPSBtZW1vcnlfY2h1bmtbaV0uYWRkcjsKIAkJZW5kID0gbWVtb3J5X2NodW5rW2ldLmFkZHIgKyBtZW1vcnlfY2h1bmtbaV0uc2l6ZTsKIAkJaWYgKHN0YXJ0ID49IHJvX2VuZCB8fCBlbmQgPD0gcm9fc3RhcnQpCkBAIC0zNjgsNiArMzcxLDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUzsgaSsrKSB7CiAJCWlmICghbWVtb3J5X2NodW5rW2ldLnNpemUpCiAJCQljb250aW51ZTsKKwkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlID09IENIVU5LX0NSQVNISyB8fAorCQkgICAgbWVtb3J5X2NodW5rW2ldLnR5cGUgPT0gQ0hVTktfT0xETUVNKQorCQkJY29udGludWU7CiAJCXNlZyA9IGt6YWxsb2Moc2l6ZW9mKCpzZWcpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzZWcpCiAJCQlwYW5pYygiT3V0IG9mIG1lbW9yeS4uLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvb3Byb2ZpbGUvaHdzYW1wbGVyLmMgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaHdzYW1wbGVyLmMKaW5kZXggNDU1MmNlNC4uZjQzYzBlNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL29wcm9maWxlL2h3c2FtcGxlci5jCisrKyBiL2FyY2gvczM5MC9vcHJvZmlsZS9od3NhbXBsZXIuYwpAQCAtOTk0LDcgKzk5NCw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsICEwIG9uIGZhaWx1cmUuCiAgKi8KLWludCBod3NhbXBsZXJfZGVhbGxvY2F0ZSgpCitpbnQgaHdzYW1wbGVyX2RlYWxsb2NhdGUodm9pZCkKIHsKIAlpbnQgcmM7CiAKQEAgLTEwMzUsNyArMTAzNSw3IEBACiAJcmV0dXJuIGNiLT5zYW1wbGVfb3ZlcmZsb3c7CiB9CiAKLWludCBod3NhbXBsZXJfc2V0dXAoKQoraW50IGh3c2FtcGxlcl9zZXR1cCh2b2lkKQogewogCWludCByYzsKIAlpbnQgY3B1OwpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBod3NhbXBsZXJfc2h1dGRvd24oKQoraW50IGh3c2FtcGxlcl9zaHV0ZG93bih2b2lkKQogewogCWludCByYzsKIApAQCAtMTIwMyw3ICsxMjAzLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgITAgb24gZmFpbHVyZS4KICAqLwotaW50IGh3c2FtcGxlcl9zdG9wX2FsbCgpCitpbnQgaHdzYW1wbGVyX3N0b3BfYWxsKHZvaWQpCiB7CiAJaW50IHRtcF9yYywgcmMsIGNwdTsKIAlzdHJ1Y3QgaHdzX2NwdV9idWZmZXIgKmNiOwpkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9LY29uZmlnIGIvYXJjaC9zY29yZS9LY29uZmlnCmluZGV4IDI4OGFkZDguLmRmMTY5ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUvS2NvbmZpZworKysgYi9hcmNoL3Njb3JlL0tjb25maWcKQEAgLTUyLDE2ICs1Miw2IEBACiBjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUwogCWRlZl9ib29sIHkKIAotY29uZmlnIFNDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUgotCWRlZl9ib29sIHkKLQotY29uZmlnIEdFTkVSSUNfU1lTQ0FMTF9UQUJMRQotCWRlZl9ib29sIHkKLQotY29uZmlnIFNDT1JFX0wxX0NBQ0hFX1NISUZUCi0JaW50Ci0JZGVmYXVsdCAiNCIKLQogbWVudSAiS2VybmVsIHR5cGUiCiAKIGNvbmZpZyAzMkJJVApAQCAtOTYsMTUgKzg2LDYgQEAKIAogc291cmNlICJpbml0L0tjb25maWciCiAKLWNvbmZpZyBQUk9CRV9JTklUUkRfSEVBREVSCi0JYm9vbCAiUHJvYmUgaW5pdHJkIGhlYWRlciBjcmVhdGVkIGJ5IGFkZGluaXRyZCIKLQlkZXBlbmRzIG9uIEJMS19ERVZfSU5JVFJECi0JaGVscAotCSAgUHJvYmUgaW5pdHJkIGhlYWRlciBhdCB0aGUgbGFzdCBwYWdlIG9mIGtlcm5lbCBpbWFnZS4KLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBhcmNoL3Njb3JlL2Jvb3QvYWRkaW5pdHJkLmMgdG8KLQkgIGFkZCBpbml0cmQgb3IgaW5pdHJhbWZzIGltYWdlIHRvIHRoZSBrZXJuZWwgaW1hZ2UuCi0JICBPdGhlcndpc2UsIHNheSBOLgotCiBjb25maWcgTU1VCiAJZGVmX2Jvb2wgeQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggZmY5MTc3Yy4uNTYyOWUyMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTAxLDEwICsxMDEsNiBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFNNUCAmJiBQUkVFTVBUCiAKLWNvbmZpZyBTWVNfU1VQUE9SVFNfUE0KLQlib29sCi0JZGVwZW5kcyBvbiAhU01QCi0KIGNvbmZpZyBBUkNIX1NVU1BFTkRfUE9TU0lCTEUKIAlkZWZfYm9vbCBuCiAKQEAgLTY0OSw3ICs2NDUsNyBAQAogCSAgYSBzcGVjaWFsbHkgcmVzZXJ2ZWQgcmVnaW9uIGFuZCB0aGVuIGxhdGVyIGV4ZWN1dGVkIGFmdGVyCiAJICBhIGNyYXNoIGJ5IGtkdW1wL2tleGVjLiBUaGUgY3Jhc2ggZHVtcCBrZXJuZWwgbXVzdCBiZSBjb21waWxlZAogCSAgdG8gYSBtZW1vcnkgYWRkcmVzcyBub3QgdXNlZCBieSB0aGUgbWFpbiBrZXJuZWwgdXNpbmcKLQkgIE1FTU9SWV9TVEFSVC4KKwkgIFBIWVNJQ0FMX1NUQVJULgogCiAJICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAogCkBAIC02NjAsNiArNjU2LDE3IEBACiAJICBKdW1wIGJldHdlZW4gb3JpZ2luYWwga2VybmVsIGFuZCBrZXhlY2VkIGtlcm5lbCBhbmQgaW52b2tlCiAJICBjb2RlIHZpYSBLRVhFQwogCitjb25maWcgUEhZU0lDQUxfU1RBUlQKKwloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIChFWFBFUlQgfHwgQ1JBU0hfRFVNUCkKKwlkZWZhdWx0IE1FTU9SWV9TVEFSVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZ2l2ZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQKKwkgIGFuZCBpcyBvcmRpbmFyaWx5IHRoZSBzYW1lIGFzIE1FTU9SWV9TVEFSVC4KKworCSAgRGlmZmVyZW50IHZhbHVlcyBhcmUgcHJpbWFyaWx5IHVzZWQgaW4gdGhlIGNhc2Ugb2Yga2V4ZWMgb24gcGFuaWMKKwkgIHdoZXJlIHRoZSBmYWlsIHNhZmUga2VybmVsIG5lZWRzIHRvIHJ1biBhdCBhIGRpZmZlcmVudCBhZGRyZXNzCisJICB0aGFuIHRoZSBwYW5pYy1lZCBrZXJuZWwuCisKIGNvbmZpZyBTRUNDT01QCiAJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgogCWRlcGVuZHMgb24gUFJPQ19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggOTkzODVkMC4uM2ZjMGY0MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC04MCw2ICs4MCw3IEBACiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfVVJRVUVMTCkJCTo9IHVJbWFnZQogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIX01JR09SKQkJCTo9IHVJbWFnZQogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIX0FQMzI1UlhBKQkJOj0gdUltYWdlCitkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfU0g3NzU3TENSKQkJOj0gdUltYWdlCiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfNzcyNF9TT0xVVElPTl9FTkdJTkUpCTo9IHVJbWFnZQogZGVmYXVsdGltYWdlLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQk6PSB2bWxpbnV4CiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUpCTo9IHZtbGludXgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWVzcHQuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWVzcHQuYwppbmRleCA5ZGE5MmFjLi5iM2FlOWQzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lc3B0LmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtZXNwdC5jCkBAIC0xMyw5ICsxMyw5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX2V0aC5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0jaW5jbHVkZSA8YXNtL3NoX2V0aC5oPgogCiAvKiBOT1IgRmxhc2ggKi8KIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBlc3B0X25vcl9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zZWN1cmVlZGdlNTQxMC5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2VjdXJlZWRnZTU0MTAuYwppbmRleCBmOTY4ZjE3Li4wMzgyMGMzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zZWN1cmVlZGdlNTQxMC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNlY3VyZWVkZ2U1NDEwLmMKQEAgLTQxLDggKzQxLDcgQEAKIAlwcmludGsoIlNuYXBHZWFyOiBFcmFzZUNvbmZpZyBpbml0XG4iKTsKIAogCS8qIFNldHVwICJFcmFzZUNvbmZpZyIgc3dpdGNoIG9uIGV4dGVybmFsIElSUSAwICovCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgZXJhc2Vjb25maWdfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAotCQkJCSJFcmFzZSBDb25maWciLCBOVUxMKSkKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBlcmFzZWNvbmZpZ19pbnRlcnJ1cHQsIDAsICJFcmFzZSBDb25maWciLCBOVUxMKSkKIAkJcHJpbnRrKCJTbmFwR2VhcjogZmFpbGVkIHRvIHJlZ2lzdGVyIElSUSVkIGZvciBSZXNldCB3aXRjaFxuIiwKIAkJCQlpcnEpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc1N2xjci5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKaW5kZXggZmEyYTIwOC4uZWM4Yzg0YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zaF9tbWNpZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zaF9tb2JpbGVfc2RoaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX2V0aC5oPgogI2luY2x1ZGUgPGNwdS9zaDc3NTcuaD4KLSNpbmNsdWRlIDxhc20vc2hfZXRoLmg+CiAjaW5jbHVkZSA8YXNtL2hlYXJ0YmVhdC5oPgogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGhlYXJ0YmVhdF9yZXNvdXJjZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwppbmRleCBkMzYyNjU3Li43MDMwZjRjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCkBAIC0zNDUsOSArMzQ1LDEwIEBACiAJCS53aWR0aCA9IDY0MCwKIAkJLmhlaWdodCA9IDQ4MCwKIAl9LAotCS5idXNfcGFyYW0gPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9NQVNURVIgfCBTT0NBTV9EQVRBV0lEVEhfOCB8Ci0JU09DQU1fREFUQV9BQ1RJVkVfSElHSCwKKwkubWJ1c19wYXJhbSA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdILAorCS5tYnVzX3R5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsCiAJLnNldF9jYXB0dXJlID0gY2FtZXJhX3NldF9jYXB0dXJlLAogfTsKIApAQCAtNTAxLDggKzUwMiw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyBvdjc3MjVfaW5mbyA9IHsKLQkuZmxhZ3MJCT0gT1Y3NzJYX0ZMQUdfVkZMSVAgfCBPVjc3MlhfRkxBR19IRkxJUCB8IFwKLQkJCSAgT1Y3NzJYX0ZMQUdfOEJJVCwKKwkuZmxhZ3MJCT0gT1Y3NzJYX0ZMQUdfVkZMSVAgfCBPVjc3MlhfRkxBR19IRkxJUCwKIAkuZWRnZWN0cmwJPSBPVjc3MlhfQVVUT19FREdFQ1RSTCgweGYsIDApLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9pcnEuYwppbmRleCAzMTFiY2ViLi43MjRlOGI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9pcnEuYwpAQCAtNDYsMTMgKzQ2LDExIEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXltYW5fYWN0aW9uX3Ntc2MgPSB7CiAJLm5hbWUJCT0gIkNheW1hbiBTTVNDIE11eCIsCiAJLmhhbmRsZXIJPSBjYXltYW5faW50ZXJydXB0X3Ntc2MsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjYXltYW5fYWN0aW9uX3BjaTIgPSB7CiAJLm5hbWUJCT0gIkNheW1hbiBQQ0kyIE11eCIsCiAJLmhhbmRsZXIJPSBjYXltYW5faW50ZXJydXB0X3BjaTIsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCiB9OwogCiBzdGF0aWMgdm9pZCBlbmFibGVfY2F5bWFuX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKaW5kZXggYjI0ZDY5ZC4uOTJkZGNlNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL21tY19zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CisjaW5jbHVkZSA8bGludXgvc2hfZXRoLmg+CiAjaW5jbHVkZSA8dmlkZW8vc2hfbW9iaWxlX2xjZGMuaD4KICNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KICNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdHc5OTEwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbXQ5dDExMi5oPgogI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KLSNpbmNsdWRlIDxhc20vc2hfZXRoLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzI0Lmg+CkBAIC0yNDgsNiArMjQ4LDEwIEBACiAJLmRyaXZlcl9wYXJhbSA9IHsKIAkJLmJ1c3dhaXRfYndhaXQJCT0gNCwKIAkJLmRldGVjdGlvbl9kZWxheQk9IDUsCisJCS5kMF90eF9pZCA9IFNIRE1BX1NMQVZFX1VTQjFEMF9UWCwKKwkJLmQwX3J4X2lkID0gU0hETUFfU0xBVkVfVVNCMUQwX1JYLAorCQkuZDFfdHhfaWQgPSBTSERNQV9TTEFWRV9VU0IxRDFfVFgsCisJCS5kMV9yeF9pZCA9IFNIRE1BX1NMQVZFX1VTQjFEMV9SWCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1ocDZ4eC9ocDZ4eF9hcG0uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtaHA2eHgvaHA2eHhfYXBtLmMKaW5kZXggYjQ5NTM1Yy4uODY1ZDhkNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1ocDZ4eC9ocDZ4eF9hcG0uYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhwNnh4L2hwNnh4X2FwbS5jCkBAIC04Niw3ICs4Niw3IEBACiAJaW50IHJldDsKIAogCXJldCA9IHJlcXVlc3RfaXJxKEhQNjgwX0JUTl9JUlEsIGhwNngwX2FwbV9pbnRlcnJ1cHQsCi0JCQkgIElSUUZfRElTQUJMRUQsIE1PRE5BTUUsIE5VTEwpOworCQkJICAwLCBNT0ROQU1FLCBOVUxMKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRE5BTUUgIjogSVJRICVkIHJlcXVlc3QgZmFpbGVkXG4iLAogCQkgICAgICAgSFA2ODBfQlROX0lSUSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKaW5kZXggMmQ0YzljOC4uZTRjODExOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYwpAQCAtNDQ4LDkgKzQ0OCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb3Y3NzJ4X2NhbWVyYV9pbmZvIG92NzcyNV9pbmZvID0gewotCS5mbGFncwkJPSBPVjc3MlhfRkxBR184QklULAotfTsKK3N0YXRpYyBzdHJ1Y3Qgb3Y3NzJ4X2NhbWVyYV9pbmZvIG92NzcyNV9pbmZvOwogCiBzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfbGluayBvdjc3MjVfbGluayA9IHsKIAkucG93ZXIJCT0gb3Y3NzI1X3Bvd2VyLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYwppbmRleCBkMDA3NTY3Li5iNzQ3YzBhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvc2V0dXAuYwpAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9yOGE2NjU5Ny5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX2V0aC5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KLSNpbmNsdWRlIDxhc20vc2hfZXRoLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzI0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoNzc2M3JkcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDc3NjNyZHAvc2V0dXAuYwppbmRleCBmM2Q4MjhmLi5kZDAzNmYxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoNzc2M3JkcC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2g3NzYzcmRwL3NldHVwLmMKQEAgLTE3LDggKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaF9ldGguaD4KICNpbmNsdWRlIDxtYWNoL3NoNzc2M3JkcC5oPgotI2luY2x1ZGUgPGFzbS9zaF9ldGguaD4KICNpbmNsdWRlIDxhc20vc2g3NzYwZmIuaD4KIAogLyogTk9SIEZsYXNoICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKaW5kZXggYmE1MTVkOC4uZTRlYTMxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9vdC9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQJPz0gMHgwMDgwMDAwMAogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQJPz0gMHgwMDAwMTAwMAogQ09ORklHX0VOVFJZX09GRlNFVAk/PSAweDAwMDAxMDAwCitDT05GSUdfUEhZU0lDQUxfU1RBUlQJPz0gJChDT05GSUdfTUVNT1JZX1NUQVJUKQogCiBzdWZmaXgteSA6PSBiaW4KIHN1ZmZpeC0kKENPTkZJR19LRVJORUxfR1pJUCkJOj0gZ3oKQEAgLTQ4LDcgKzQ5LDcgQEAKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvcm9taW1hZ2UgJEAKIAogS0VSTkVMX01FTU9SWQk6PSAkKHNoZWxsIC9iaW4vYmFzaCAtYyAncHJpbnRmICIweCUwOHgiIFwKLQkJICAgICAkJFskKENPTkZJR19NRU1PUllfU1RBUlQpICYgMHgxZmZmZmZmZl0nKQorCQkgICAgICQkWyQoQ09ORklHX1BIWVNJQ0FMX1NUQVJUKSAmIDB4MWZmZmZmZmZdJykKIAogS0VSTkVMX0xPQUQJOj0gJChzaGVsbCAvYmluL2Jhc2ggLWMgJ3ByaW50ZiAiMHglMDh4IiBcCiAJCSAgICAgJCRbJChDT05GSUdfUEFHRV9PRkZTRVQpICArIFwKQEAgLTExNCw0ICsxMTUsNSBAQAogCUBlY2hvICcgIEltYWdlICRAIGlzIHJlYWR5JwogCiBleHBvcnQgQ09ORklHX1BBR0VfT0ZGU0VUIENPTkZJR19NRU1PUllfU1RBUlQgQ09ORklHX0JPT1RfTElOS19PRkZTRVQgXAotICAgICAgIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUIENPTkZJR19FTlRSWV9PRkZTRVQgS0VSTkVMX01FTU9SWSBzdWZmaXgteQorICAgICAgIENPTkZJR19QSFlTSUNBTF9TVEFSVCBDT05GSUdfWkVST19QQUdFX09GRlNFVCBDT05GSUdfRU5UUllfT0ZGU0VUIFwKKyAgICAgICBLRVJORUxfTUVNT1JZIHN1ZmZpeC15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYwppbmRleCBhZjdiYjU4Li5iZTljYTdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWcyLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShIV19FVkVOVF9HMl9ETUEsIGcyX2RtYV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoSFdfRVZFTlRfRzJfRE1BLCBnMl9kbWFfaW50ZXJydXB0LCAwLAogCQkJICAiZzIgRE1BIGhhbmRsZXIiLCAmZzJfZG1hX2luZm8pOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYwppbmRleCAzY2VlNThlLi43MDZhMzQzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jCkBAIC03MCw3ICs3MCw2IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBwdnIyX2RtYV9pcnEgPSB7CiAJLm5hbWUJCT0gInB2cjIgRE1BIGhhbmRsZXIiLAogCS5oYW5kbGVyCT0gcHZyMl9kbWFfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVELAogfTsKIAogc3RhdGljIHN0cnVjdCBkbWFfb3BzIHB2cjJfZG1hX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCmluZGV4IDgyNzIwODcuLmE2MGRhNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwpAQCAtOTUsNyArOTUsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NIX0RNQV9JUlFfTVVMVEkpCiAJCQkJSVJRRl9TSEFSRUQsCiAjZWxzZQotCQkJCUlSUUZfRElTQUJMRUQsCisJCQkJMCwKICNlbmRpZgogCQkJCWNoYW4tPmRldl9pZCwgY2hhbik7CiB9CkBAIC0zMDUsNyArMzA1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9ETUFfSVJRX01VTFRJKQogCQkJCUlSUUZfU0hBUkVELAogI2Vsc2UKLQkJCQlJUlFGX0RJU0FCTEVELAorCQkJCTAsCiAjZW5kaWYKIAkJCQlkbWFlX25hbWVbbl0sICh2b2lkICopZG1hZV9uYW1lW25dKTsKIAkJaWYgKHVubGlrZWx5KGkgPCAwKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMKaW5kZXggMWVlNjMxZC4uODNjYzcwNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zeXNmcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWFicmcuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hYnJnLmMKaW5kZXggNmFiOWM0YS4uM2Q2NmEzMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWFicmcuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYWJyZy5jCkBAIC0xNzQsMTcgKzE3NCwxNyBAQAogCW9yID0gX19yYXdfcmVhZGwoRE1BT1IpOwogCV9fcmF3X3dyaXRlbChvciB8IERNQU9SX0JSRyB8IERNQU9SX0RNRU4sIERNQU9SKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKERNQUJSR0kwLCBkbWFicmdfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKERNQUJSR0kwLCBkbWFicmdfaXJxLCAwLAogCQkJIkRNQUJSRyBVU0IgYWRkcmVzcyBlcnJvciIsIE5VTEwpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0MDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKERNQUJSR0kxLCBkbWFicmdfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKERNQUJSR0kxLCBkbWFicmdfaXJxLCAwLAogCQkJIkRNQUJSRyBUcmFuc2ZlciBFbmQiLCBOVUxMKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDE7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMiwgZG1hYnJnX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShETUFCUkdJMiwgZG1hYnJnX2lycSwgMCwKIAkJCSJETUFCUkcgVHJhbnNmZXIgSGFsZiIsIE5VTEwpOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKaW5kZXggMGJmMjk2Yy4uMTZjMWU3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKQEAgLTEwNywxMyArMTA3LDEzIEBACiAJdTMyIHV2YWw7CiAKICAgICAgICAgaWYgKHJlcXVlc3RfaXJxKElSUV9FUlIsIHBjaXNoNV9lcnJfaXJxLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJRRl9ESVNBQkxFRCwgIlBDSSBFcnJvciIsTlVMTCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLCAiUENJIEVycm9yIixOVUxMKSA8IDApIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlBDSVNINTogQ2Fubm90IGhvb2sgUENJX1BFUlIgaW50ZXJydXB0XG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXF1ZXN0X2lycShJUlFfU0VSUiwgcGNpc2g1X3NlcnJfaXJxLAotICAgICAgICAgICAgICAgICAgICAgICAgSVJRRl9ESVNBQkxFRCwgIlBDSSBTRVJSIGludGVycnVwdCIsIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgMCwgIlBDSSBTRVJSIGludGVycnVwdCIsIE5VTEwpIDwgMCkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiUENJU0g1OiBDYW5ub3QgaG9vayBQQ0lfU0VSUiBpbnRlcnJ1cHRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc4MC5jCmluZGV4IGVkYjdjY2EuLmZhN2I5NzhjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCSAgICAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIHwgXAogCQkgICAgIFBDSV9TVEFUVVNfUEFSSVRZLCBob3NlLT5yZWdfYmFzZSArIFBDSV9TVEFUVVMpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaG9zZS0+c2Vycl9pcnEsIHNoNzc4MF9wY2lfc2Vycl9pcnEsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaG9zZS0+c2Vycl9pcnEsIHNoNzc4MF9wY2lfc2Vycl9pcnEsIDAsCiAJCQkgICJQQ0kgU0VSUiBpbnRlcnJ1cHQiLCBob3NlKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRmFpbGVkIGhvb2tpbmcgU0VSUiBJUlFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggMTk0MjMxYy4uYzI2OTFhZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHVuc2lnbmVkIGxvbmcgUENJQklPU19NSU5fSU8gPSAweDAwMDA7CiB1bnNpZ25lZCBsb25nIFBDSUJJT1NfTUlOX01FTSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcHVzaC1zd2l0Y2guYyBiL2FyY2gvc2gvZHJpdmVycy9wdXNoLXN3aXRjaC5jCmluZGV4IGFmYzI0NTUuLjYzN2I3OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wdXNoLXN3aXRjaC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wdXNoLXN3aXRjaC5jCkBAIC02Myw3ICs2Myw3IEBACiAJQlVHX09OKCFwc3dfaW5mbyk7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHBzd19pbmZvLT5pcnFfaGFuZGxlciwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IHBzd19pbmZvLT5pcnFfZmxhZ3MsCisJCQkgIHBzd19pbmZvLT5pcnFfZmxhZ3MsCiAJCQkgIHBzd19pbmZvLT5uYW1lID8gcHN3X2luZm8tPm5hbWUgOiBEUlZfTkFNRSwgcGRldik7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGFnZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggODIyZDYwOC4uMTVkOTcwMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTExMyw2ICsxMTMsMTYgQEAKICNkZWZpbmUgX19NRU1PUllfU0laRQkJQ09ORklHX01FTU9SWV9TSVpFCiAKIC8qCisgKiBQSFlTSUNBTF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBwaHlzaWNhbCBtZW1vcnkgd2hlcmUgdGhlIGJhc2UKKyAqIG9mIHRoZSBrZXJuZWwgaXMgbG9hZGVkLgorICovCisjaWZkZWYgQ09ORklHX1BIWVNJQ0FMX1NUQVJUCisjZGVmaW5lIFBIWVNJQ0FMX09GRlNFVCAoQ09ORklHX1BIWVNJQ0FMX1NUQVJUIC0gX19NRU1PUllfU1RBUlQpCisjZWxzZQorI2RlZmluZSBQSFlTSUNBTF9PRkZTRVQgMAorI2VuZGlmCisKKy8qCiAgKiBQQUdFX09GRlNFVCBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBrZXJuZWwgYWRkcmVzcwogICogc3BhY2UuCiAgKi8KQEAgLTE0MSw4ICsxNTEsMTMgQEAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBDT05GSUdfVU5DQUNIRURfTUFQUElORworI2lmIGRlZmluZWQoQ09ORklHXzI5QklUKQorI2RlZmluZSBVTkNBQ19BRERSKGFkZHIpCVAyU0VHQUREUihhZGRyKQorI2RlZmluZSBDQUNfQUREUihhZGRyKQkJUDFTRUdBRERSKGFkZHIpCisjZWxzZQogI2RlZmluZSBVTkNBQ19BRERSKGFkZHIpCSgoYWRkcikgLSBQQUdFX09GRlNFVCArIHVuY2FjaGVkX3N0YXJ0KQogI2RlZmluZSBDQUNfQUREUihhZGRyKQkJKChhZGRyKSAtIHVuY2FjaGVkX3N0YXJ0ICsgUEFHRV9PRkZTRVQpCisjZW5kaWYKICNlbHNlCiAjZGVmaW5lIFVOQ0FDX0FERFIoYWRkcikJKChhZGRyKSkKICNkZWZpbmUgQ0FDX0FERFIoYWRkcikJCSgoYWRkcikpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAppbmRleCAzNDMyMDA4Li4xNTJiODYyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKQEAgLTM3NSw4ICszNzUsMTAgQEAKICNkZWZpbmUgX19OUl9zeW5jZnMJCTM2MgogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNjMKICNkZWZpbmUgX19OUl9zZXRucwkJMzY0CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNjUKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNjYKIAotI2RlZmluZSBOUl9zeXNjYWxscyAzNjUKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzY3CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCmluZGV4IGVjOTg5ODYuLmMzMzBjMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaApAQCAtMzk2LDEwICszOTYsMTIgQEAKICNkZWZpbmUgX19OUl9zeW5jZnMJCTM3MwogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNzQKICNkZWZpbmUgX19OUl9zZXRucwkJMzc1CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNzYKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNzcKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzNzYKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzc4CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKaW5kZXggYTQzMTI0ZS4uMGJkNzQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKQEAgLTE3NiwxMCArMTc2LDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZTgwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NzY3IJCT0gU0NTQ1JfUklFIHwgU0NTQ1JfVElFIHwgU0NTQ1JfUkUgfCBTQ1NDUl9URSB8CisJCQkgIFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDE5MiwgMTkyLCAxOTIsIDE5MiB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDJfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtMTkzLDEwICsxOTUsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlODgwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY3NjcgkJPSBTQ1NDUl9SSUUgfCBTQ1NDUl9USUUgfCBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwKKwkJCSAgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0gIHsgMTk2LCAxOTYsIDE5NiwgMTk2IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NIMl9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CkBAIC0yMTAsMTAgKzIxNCwxMiBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjc2NyCQk9IFNDU0NSX1JJRSB8IFNDU0NSX1RJRSB8IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfAorCQkJICBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSAgeyAyMDAsIDIwMCwgMjAwLCAyMDAgfSwKKwkucmVndHlwZQk9IFNDSXhfU0gyX1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKQEAgLTIyNywxMCArMjMzLDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZTk4MDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NzY3IJCT0gU0NTQ1JfUklFIHwgU0NTQ1JfVElFIHwgU0NTQ1JfUkUgfCBTQ1NDUl9URSB8CisJCQkgIFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDIwNCwgMjA0LCAyMDQsIDIwNCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDJfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjNfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzU3LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NTcuYwppbmRleCAzYjA5N2IwLi4xOTIyMmRhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NTcuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NTcuYwpAQCAtMTEzLDcgKzExMywxNCBAQAogCiAJLyogTVNUUDMyIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInNkaGkwIiwgJm1zdHBfY2xrc1tNU1RQMDA0XSksCi0JQ0xLREVWX0NPTl9JRCgicmlpYyIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWMwIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCisJQ0xLREVWX0NPTl9JRCgicmlpYzEiLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKKwlDTEtERVZfQ09OX0lEKCJyaWljMiIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWMzIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCisJQ0xLREVWX0NPTl9JRCgicmlpYzQiLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKKwlDTEtERVZfQ09OX0lEKCJyaWljNSIsICZtc3RwX2Nsa3NbTVNUUDAwMF0pLAorCUNMS0RFVl9DT05fSUQoInJpaWM2IiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCisJQ0xLREVWX0NPTl9JRCgicmlpYzciLCAmbXN0cF9jbGtzW01TVFAwMDBdKSwKIAogCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjAiLCAmbXN0cF9jbGtzW01TVFAxMTNdKSwKIAlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tNU1RQMTE0XSksCkBAIC0xMjEsNiArMTI4LDcgQEAKIAlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4xIiwgJm1zdHBfY2xrc1tNU1RQMTExXSksCiAJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDExMF0pLAogCisJQ0xLREVWX0NPTl9JRCgidXNiX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDEwM10pLAogCUNMS0RFVl9DT05fSUQoInVzYjAiLCAmbXN0cF9jbGtzW01TVFAxMDJdKSwKIAlDTEtERVZfQ09OX0lEKCJtbWMwIiwgJm1zdHBfY2xrc1tNU1RQMjIwXSksCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKaW5kZXggZGU4NjVjYS4uMDNmMmI1NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCkBAIC03OSw3ICs3OSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgU01QX01TR19OUjsgaSsrKQogCQlyZXF1ZXN0X2lycSgxMDQgKyBpLCBpcGlfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQkgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfUEVSQ1BVLCAiSVBJIiwgKHZvaWQgKikobG9uZylpKTsKKwkJCSAgICBJUlFGX1BFUkNQVSwgIklQSSIsICh2b2lkICopKGxvbmcpaSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2NwdXM7IGkrKykKIAkJc2V0X2NwdV9wcmVzZW50KGksIHRydWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL2NwdWlkbGUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMKaW5kZXggZTQ0NjllNzIuLjFjYzI1N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL2NwdWlkbGUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2h3YmxrLmg+CkBAIC0yNSwxMSArMjYsMTIgQEAKIH07CiAKIHN0YXRpYyBpbnQgY3B1aWRsZV9zbGVlcF9lbnRlcihzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJaW50IGluZGV4KQogewogCXVuc2lnbmVkIGxvbmcgYWxsb3dlZF9tb2RlID0gYXJjaF9od2Jsa19zbGVlcF9tb2RlKCk7CiAJa3RpbWVfdCBiZWZvcmUsIGFmdGVyOwotCWludCByZXF1ZXN0ZWRfc3RhdGUgPSBzdGF0ZSAtICZkZXYtPnN0YXRlc1swXTsKKwlpbnQgcmVxdWVzdGVkX3N0YXRlID0gaW5kZXg7CiAJaW50IGFsbG93ZWRfc3RhdGU7CiAJaW50IGs7CiAKQEAgLTQ2LDExICs0OCwxMyBAQAogCSAqLwogCWsgPSBtaW5fdChpbnQsIGFsbG93ZWRfc3RhdGUsIHJlcXVlc3RlZF9zdGF0ZSk7CiAKLQlkZXYtPmxhc3Rfc3RhdGUgPSAmZGV2LT5zdGF0ZXNba107CiAJYmVmb3JlID0ga3RpbWVfZ2V0KCk7CiAJc2hfbW9iaWxlX2NhbGxfc3RhbmRieShjcHVpZGxlX21vZGVba10pOwogCWFmdGVyID0ga3RpbWVfZ2V0KCk7Ci0JcmV0dXJuIGt0aW1lX3RvX25zKGt0aW1lX3N1YihhZnRlciwgYmVmb3JlKSkgPj4gMTA7CisKKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gKGludClrdGltZV90b19ucyhrdGltZV9zdWIoYWZ0ZXIsIGJlZm9yZSkpID4+IDEwOworCisJcmV0dXJuIGs7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgY3B1aWRsZV9kZXY7CkBAIC02MiwxOSArNjYsMTkgQEAKIHZvaWQgc2hfbW9iaWxlX3NldHVwX2NwdWlkbGUodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9ICZjcHVpZGxlX2RldjsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9ICZjcHVpZGxlX2RyaXZlcjsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGU7CiAJaW50IGk7CiAKLQljcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmY3B1aWRsZV9kcml2ZXIpOwogCiAJZm9yIChpID0gMDsgaSA8IENQVUlETEVfU1RBVEVfTUFYOyBpKyspIHsKLQkJZGV2LT5zdGF0ZXNbaV0ubmFtZVswXSA9ICdcMCc7Ci0JCWRldi0+c3RhdGVzW2ldLmRlc2NbMF0gPSAnXDAnOworCQlkcnYtPnN0YXRlc1tpXS5uYW1lWzBdID0gJ1wwJzsKKwkJZHJ2LT5zdGF0ZXNbaV0uZGVzY1swXSA9ICdcMCc7CiAJfQogCiAJaSA9IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUOwogCi0Jc3RhdGUgPSAmZGV2LT5zdGF0ZXNbaSsrXTsKKwlzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpKytdOwogCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzEiKTsKIAlzdHJuY3B5KHN0YXRlLT5kZXNjLCAiU3VwZXJIIFNsZWVwIE1vZGUiLCBDUFVJRExFX0RFU0NfTEVOKTsKIAlzdGF0ZS0+ZXhpdF9sYXRlbmN5ID0gMTsKQEAgLTg0LDEwICs4OCwxMCBAQAogCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAlzdGF0ZS0+ZW50ZXIgPSBjcHVpZGxlX3NsZWVwX2VudGVyOwogCi0JZGV2LT5zYWZlX3N0YXRlID0gc3RhdGU7CisJZHJ2LT5zYWZlX3N0YXRlX2luZGV4ID0gaS0xOwogCiAJaWYgKHNoX21vYmlsZV9zbGVlcF9zdXBwb3J0ZWQgJiBTVVNQX1NIX1NGKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVzW2krK107CisJCXN0YXRlID0gJmRydi0+c3RhdGVzW2krK107CiAJCXNucHJpbnRmKHN0YXRlLT5uYW1lLCBDUFVJRExFX05BTUVfTEVOLCAiQzIiKTsKIAkJc3RybmNweShzdGF0ZS0+ZGVzYywgIlN1cGVySCBTbGVlcCBNb2RlIFtTRl0iLAogCQkJQ1BVSURMRV9ERVNDX0xFTik7CkBAIC0xMDAsNyArMTA0LDcgQEAKIAl9CiAKIAlpZiAoc2hfbW9iaWxlX3NsZWVwX3N1cHBvcnRlZCAmIFNVU1BfU0hfU1RBTkRCWSkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlc1tpKytdOworCQlzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpKytdOwogCQlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIkMzIik7CiAJCXN0cm5jcHkoc3RhdGUtPmRlc2MsICJTdXBlckggTW9iaWxlIFN0YW5kYnkgTW9kZSBbU0ZdIiwKIAkJCUNQVUlETEVfREVTQ19MRU4pOwpAQCAtMTEyLDcgKzExNiwxMCBAQAogCQlzdGF0ZS0+ZW50ZXIgPSBjcHVpZGxlX3NsZWVwX2VudGVyOwogCX0KIAorCWRydi0+c3RhdGVfY291bnQgPSBpOwogCWRldi0+c3RhdGVfY291bnQgPSBpOwogCisJY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmNwdWlkbGVfZHJpdmVyKTsKKwogCWNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL3NoL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMmVlMjFhNC4uMTBiMTRlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogc3RydWN0IGNwdV9od19ldmVudHMgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKaW5kZXggNThiZmY0NS4uMWEwZTk0NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCkBAIC0yMTEsMTMgKzIxMSwxNiBAQAogCX0KIAogCS8qCi0JICogIFdlIGRvbid0IGtub3cgd2hpY2ggUkFNIHJlZ2lvbiBjb250YWlucyBrZXJuZWwgZGF0YSwKLQkgKiAgc28gd2UgdHJ5IGl0IHJlcGVhdGVkbHkgYW5kIGxldCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAqICB0ZXN0IGl0LgorCSAqIFdlIGRvbid0IGtub3cgd2hpY2ggUkFNIHJlZ2lvbiBjb250YWlucyBrZXJuZWwgZGF0YSBvcgorCSAqIHRoZSByZXNlcnZlZCBjcmFzaGtlcm5lbCByZWdpb24sIHNvIHRyeSBpdCByZXBlYXRlZGx5CisJICogYW5kIGxldCB0aGUgcmVzb3VyY2UgbWFuYWdlciB0ZXN0IGl0LgogCSAqLwogCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAmY29kZV9yZXNvdXJjZSk7CiAJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZkYXRhX3Jlc291cmNlKTsKIAlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmJzc19yZXNvdXJjZSk7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZjcmFzaGtfcmVzKTsKKyNlbmRpZgogCiAJLyoKIAkgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgUE1CIG1hcHBpbmcgdGhhdCBjb3ZlcnMgdGhpcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzMyLlMKaW5kZXggMjkzZTM5Yy4uZWU1NmE5YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc18zMi5TCkBAIC0zODIsMyArMzgyLDUgQEAKIAkubG9uZyBzeXNfc3luY2ZzCiAJLmxvbmcgc3lzX3NlbmRtbXNnCiAJLmxvbmcgc3lzX3NldG5zCisJLmxvbmcgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYJLyogMzY1ICovCisJLmxvbmcgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfNjQuUwppbmRleCBjZWIzNGI5Li45YWY3ZGUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzY0LlMKQEAgLTQwMiwzICs0MDIsNSBAQAogCS5sb25nIHN5c19zeW5jZnMKIAkubG9uZyBzeXNfc2VuZG1tc2cKIAkubG9uZyBzeXNfc2V0bnMJCQkvKiAzNzUgKi8KKwkubG9uZyBzeXNfcHJvY2Vzc192bV9yZWFkdgorCS5sb25nIHN5c19wcm9jZXNzX3ZtX3dyaXRldgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggMzhlODYyOC4uNDY0OWE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL3NoL2tlcm5lbC90b3BvbG9neS5jCkBAIC0xMSw4ICsxMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNzMxYzEwYy4uYzk4OTA1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0yMyw3ICsyMyw3IEBACiBFTlRSWShfc3RhcnQpCiBTRUNUSU9OUwogewotCS4gPSBQQUdFX09GRlNFVCArIE1FTU9SWV9PRkZTRVQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKKwkuID0gUEFHRV9PRkZTRVQgKyBNRU1PUllfT0ZGU0VUICsgUEhZU0lDQUxfT0ZGU0VUICsgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ7CiAKIAlfdGV4dCA9IC47CQkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2luaXQuYyBiL2FyY2gvc2gvbW0vaW5pdC5jCmluZGV4IDU4YTkzZmIzLi45MzljYTBmIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KQEAgLTI4Nyw2ICsyODgsOCBAQAogc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3Jlc2VydmVfbWVtKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CisJdTMyIHplcm9fYmFzZSA9ICh1MzIpX19NRU1PUllfU1RBUlQgKyAodTMyKVBIWVNJQ0FMX09GRlNFVDsKKwl1MzIgc3RhcnQgPSB6ZXJvX2Jhc2UgKyAodTMyKUNPTkZJR19aRVJPX1BBR0VfT0ZGU0VUOwogCiAJLyoKIAkgKiBQYXJ0aWFsbHkgdXNlZCBwYWdlcyBhcmUgbm90IHVzYWJsZSAtIHRodXMKQEAgLTMwMCwxNSArMzAzLDEzIEBACiAJICogdGhpcyBjYXRjaGVzIHRoZSAoZGVmaW5pdGVseSBidWdneSkgY2FzZSBvZiB1cyBhY2NpZGVudGFsbHkKIAkgKiBpbml0aWFsaXppbmcgdGhlIGJvb3RtZW0gYWxsb2NhdG9yIHdpdGggYW4gaW52YWxpZCBSQU0gYXJlYS4KIAkgKi8KLQltZW1ibG9ja19yZXNlcnZlKF9fTUVNT1JZX1NUQVJUICsgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQsCi0JCSAgICAoUEZOX1BIWVMoc3RhcnRfcGZuKSArIFBBR0VfU0laRSAtIDEpIC0KLQkJICAgIChfX01FTU9SWV9TVEFSVCArIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUKSk7CisJbWVtYmxvY2tfcmVzZXJ2ZShzdGFydCwgKFBGTl9QSFlTKHN0YXJ0X3BmbikgKyBQQUdFX1NJWkUgLSAxKSAtIHN0YXJ0KTsKIAogCS8qCiAJICogUmVzZXJ2ZSBwaHlzaWNhbCBwYWdlcyBiZWxvdyBDT05GSUdfWkVST19QQUdFX09GRlNFVC4KIAkgKi8KIAlpZiAoQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQgIT0gMCkKLQkJbWVtYmxvY2tfcmVzZXJ2ZShfX01FTU9SWV9TVEFSVCwgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQpOworCQltZW1ibG9ja19yZXNlcnZlKHplcm9fYmFzZSwgQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQpOwogCiAJLyoKIAkgKiBIYW5kbGUgYWRkaXRpb25hbCBlYXJseSByZXNlcnZhdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCAxYTZmMjBkLi5mOTI2MDJlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC01NjAsMTIgKzU2MCw3IEBACiAJICBPbmx5IGNob29zZSBOIGlmIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdCB5b3Ugd2lsbCBub3QgbmVlZCB0byBtb2RpZnkKIAkgIE9wZW5QUk9NIHNldHRpbmdzIG9uIHRoZSBydW5uaW5nIHN5c3RlbS4KIAotIyBNYWtlZmlsZSBoZWxwZXJzCi1jb25maWcgU1BBUkMzMl9QQ0kKLQlib29sCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBTUEFSQzMyICYmIFBDSQotCisjIE1ha2VmaWxlIGhlbHBlcgogY29uZmlnIFNQQVJDNjRfUENJCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggNmY1NzMyNS4uYjhiZTIwZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0xMzQsNyArMTM0LDggQEAKIAljb21wYXRfZnNpZF90CWZfZnNpZDsKIAlpbnQJCWZfbmFtZWxlbjsJLyogU3VuT1MgaWdub3JlcyB0aGlzIGZpZWxkLiAqLwogCWludAkJZl9mcnNpemU7Ci0JaW50CQlmX3NwYXJlWzVdOworCWludAkJZl9mbGFnczsKKwlpbnQJCWZfc3BhcmVbNF07CiB9OwogCiAjZGVmaW5lIENPTVBBVF9STElNX0lORklOSVRZIDB4N2ZmZmZmZmYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGVybWlvcy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKaW5kZXggZThiYTk1My4uZTJmNDY3MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKQEAgLTQwLDcgKzQwLDYgQEAKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBjX2NjIGNoYXJhY3RlcnMgaW4gdGhlIHRlcm1pbyBzdHJ1Y3R1cmUuICBPaCwgaG93IEkgbG92ZSBiZWluZwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggNjI2MGQ1ZC4uYzdjYjBhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC00MDYsOCArNDA2LDEwIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkzMzUKICNkZWZpbmUgX19OUl9zZW5kbW1zZwkJMzM2CiAjZGVmaW5lIF9fTlJfc2V0bnMJCTMzNworI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJMzM4CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYJMzM5CiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCTMzOAorI2RlZmluZSBOUl9zeXNjYWxscwkJMzQwCiAKICNpZmRlZiBfXzMyYml0X3N5c2NhbGxfbnVtYmVyc19fCiAvKiBTcGFyYyAzMi1iaXQgb25seSBoYXMgdGhlICJzZXRyZXN1aWQzMiIsICJnZXRyZXN1aWQzMiIgdmFyaWFudHMsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hcGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCmluZGV4IGNhZWY5ZGUuLjgxMmUxMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2FwYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYwppbmRleCBhY2Y1MTUxLi5mN2VhOGYwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYnRleHQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2J0ZXh0LmMKaW5kZXggODlhYTRlYi4uNTcwNzNlNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYnRleHQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9idGV4dC5jCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKICNpbmNsdWRlIDxhc20vYnRleHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NlbnRyYWwuYwppbmRleCA3ZWVmM2Y3Li4zOGQ0OGE1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jZW50cmFsLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY2VudHJhbC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2NwdS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKaW5kZXggYmE5YjFjZS4uMmQxODE5NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMKQEAgLTYsNyArNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9jcHVtYXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCmluZGV4IDkzMjNlYWYuLmU0ZGU3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2NwdW1hcC5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5IEhvbmcgSC4gUGhhbSA8aG9uZy5waGFtQHdpbmRyaXZlci5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9kbWEuYyBiL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCmluZGV4IGUxYmE4ZWUuLmI2NjdhYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2RtYS5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwppbmRleCA3N2RiZjZkLi5lMzA2ZmIwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmFwaS5jCmluZGV4IGMyZDA1NWQuLjg1OTM2NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaHZhcGkuYwpAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwppbmRleCA1MmExNWZlLi45MTY3ZGI0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pZHByb20uYwpAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCmluZGV4IDZmMDFlOGMuLjQ2NDNkNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXUuYwpAQCAtNSw3ICs1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCmluZGV4IDliODlkODQyLi5iMjY2OGFmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYwppbmRleCAwZGQ4NDIyLi5kNDViNzEwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfNjQuYwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OCAgSmFrdWIgSmVsaW5layAgICAoampAdWx0cmEubGludXguY3opCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvanVtcF9sYWJlbC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGVhMmRhZmMuLjk3MWZkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9qdW1wX2xhYmVsLmMKQEAgLTM2LDEyICszNiw0IEBACiAJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKLXZvaWQgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcikKLXsKLQl1MzIgKmluc25fcCA9ICh1MzIgKikgKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0KLQkqaW5zbl9wID0gMHgwMTAwMDAwMDsKLQlmbHVzaGkoaW5zbl9wKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCmluZGV4IDczMmIwYmMuLjQzNWU0MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fa2VybmVsLmMKaW5kZXggZDE3MjU1YS4uYTE5YzhhMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9rZXJuZWwuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX2tlcm5lbC5jCkBAIC00LDcgKzQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCmluZGV4IGE4YTlhMjcuLmYxY2Y2ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbGVvbi5oPgogI2luY2x1ZGUgPGFzbS9sZW9uX3BjaS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCmluZGV4IGZhZDFiZDAuLmIxYmMzODggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpX2dycGNpMi5jCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2xlb24uaD4KICNpbmNsdWRlIDxhc20vdmFkZHJzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwppbmRleCBhY2FlYmI2Li42ZGM3OTYyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTExLDExICsxMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9ubWkuYyBiL2FyY2gvc3BhcmMva2VybmVsL25taS5jCmluZGV4IDMwMGY4MTAuLmM3NmZlMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL25taS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL25taS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25taS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYwppbmRleCBhMzEyYWY0Li40ZWU4Y2UwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfMzIuYwpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKaW5kZXggM2JiMmVhYy4uN2EzYmU2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMKQEAgLTIsMTMgKzIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgogCiAjaW5jbHVkZSAib2ZfZGV2aWNlX2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfY29tbW9uLmMKaW5kZXggY2IxNWJiZi4uZGUxOTliZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV9jb21tb24uYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCA4YWEwZDQ0Li4zMTExMWUzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwpAQCAtOCw3ICs4LDcgQEAKICAqIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucywgc2VlIHRoZXJlIGZvciBjcmVkaXRzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9maXJlLmMKaW5kZXggZDI5YTMyZi4uMTg4ZjkzNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2ZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfZmlyZS5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCA4NmFlMDhkLi5mNGQyOWUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKaW5kZXggZDE4NDBkYi4uM2VmYWE0NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IGYwMzBiMDIuLjEzZDRhYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCBiMDFhMDZlLi5iMjcyY2RhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCmluZGV4IDFhYWY4YzEuLmZjYzE0OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Bjci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKaW5kZXggMzQzYjBmOS4uYTI0MDcyYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL3BpbC5oPgogI2luY2x1ZGUgPGFzbS9wY3IuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAKIC8qIFRoaXMgY29kZSBpcyBzaGFyZWQgYmV0d2VlbiB2YXJpb3VzIHVzZXJzIG9mIHRoZSBwZXJmb3JtYW5jZQogICogY291bnRlcnMuICBVc2VycyB3aWxsIGJlIG9wcm9maWxlLCBwc2V1ZG8tTk1JIHdhdGNoZG9nLCBhbmQgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wbWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCmluZGV4IDZhNTg1ZDMuLjBlMzIwMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BtYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwppbmRleCBjYjRjMGY1Li4wZDM5MDc1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKQEAgLTQsNyArNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBkOTU5Y2QwLi4zNzM5YTA2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fMzIuYwppbmRleCA1Y2UzZDE1Li5iNTFjYmI5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV8zMi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV82NC5jCmluZGV4IDg2NTk3ZDkuLjM0MGM1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21fNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tXzY0LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYwppbmRleCBlZDI1ODM0Li40NjYxNDgwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3JlYm9vdC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKaW5kZXggZWY4OWQzZC4uMDA2YTQyZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcmVib290LmMKQEAgLTQsNyArNCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCmluZGV4IGExNjFiOWMuLjEyNzFiM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDNlM2UyOTEuLmZlMWUzZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCmluZGV4IDRhNDQyYzMuLjc1NjA3NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMKaW5kZXggODNiNDdhYi4uMTJmZjA5OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCkBAIC01LDcgKzUsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggM2UwODE1My4uZTc4Mzg2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyYzMyLmMKaW5kZXggMTcwY2Q4ZS4uMjljNDc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCmluZGV4IDkwOGI0N2EuLjQ0MTUyMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXBjLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3V0cmFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKaW5kZXggMDlkOGVjNC4uNjM0MDJmOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUwpAQCAtODQsNCArODQsNCBAQAogLyozMjAqLwkubG9uZyBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIHN5c19wcmVhZHYKIC8qMzI1Ki8JLmxvbmcgc3lzX3B3cml0ZXYsIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3BlcmZfZXZlbnRfb3Blbiwgc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkubG9uZyBzeXNfZmFub3RpZnlfbWFyaywgc3lzX3BybGltaXQ2NCwgc3lzX25hbWVfdG9faGFuZGxlX2F0LCBzeXNfb3Blbl9ieV9oYW5kbGVfYXQsIHN5c19jbG9ja19hZGp0aW1lCi0vKjMzNSovCS5sb25nIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zCisvKjMzNSovCS5sb25nIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zLCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKaW5kZXggZWRiZWM0NS4uZGI4NmIxYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfNjQuUwpAQCAtODUsNyArODUsNyBAQAogLyozMjAqLwkud29yZCBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIGNvbXBhdF9zeXNfcHJlYWR2CiAJLndvcmQgY29tcGF0X3N5c19wd3JpdGV2LCBjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcGVyZl9ldmVudF9vcGVuLCBjb21wYXRfc3lzX3JlY3ZtbXNnLCBzeXNfZmFub3RpZnlfaW5pdAogLyozMzAqLwkud29yZCBzeXMzMl9mYW5vdGlmeV9tYXJrLCBzeXNfcHJsaW1pdDY0LCBzeXNfbmFtZV90b19oYW5kbGVfYXQsIGNvbXBhdF9zeXNfb3Blbl9ieV9oYW5kbGVfYXQsIGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZQotCS53b3JkIHN5c19zeW5jZnMsIGNvbXBhdF9zeXNfc2VuZG1tc2csIHN5c19zZXRucworCS53b3JkIHN5c19zeW5jZnMsIGNvbXBhdF9zeXNfc2VuZG1tc2csIHN5c19zZXRucywgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2LCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CiAKICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAKQEAgLTE2Miw0ICsxNjIsNCBAQAogLyozMjAqLwkud29yZCBzeXNfZHVwMywgc3lzX3BpcGUyLCBzeXNfaW5vdGlmeV9pbml0MSwgc3lzX2FjY2VwdDQsIHN5c19wcmVhZHYKIAkud29yZCBzeXNfcHdyaXRldiwgc3lzX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcGVyZl9ldmVudF9vcGVuLCBzeXNfcmVjdm1tc2csIHN5c19mYW5vdGlmeV9pbml0CiAvKjMzMCovCS53b3JkIHN5c19mYW5vdGlmeV9tYXJrLCBzeXNfcHJsaW1pdDY0LCBzeXNfbmFtZV90b19oYW5kbGVfYXQsIHN5c19vcGVuX2J5X2hhbmRsZV9hdCwgc3lzX2Nsb2NrX2FkanRpbWUKLQkud29yZCBzeXNfc3luY2ZzLCBzeXNfc2VuZG1tc2csIHN5c19zZXRucworCS53b3JkIHN5c19zeW5jZnMsIHN5c19zZW5kbW1zZywgc3lzX3NldG5zLCBzeXNfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKaW5kZXggMWRiNmIxOC4uZTg2MTA3MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCBjMDQ5MGM3Li41OTFmMjBjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKaW5kZXggN2VmYmIyZi4uNGQwNDNhMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aW8uYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCmluZGV4IDNjYjFkZWYuLmY2N2UyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKaW5kZXggMjkzNDhlYS4uZjhlN2RkNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC92aXNlbXVsLmMKaW5kZXggMzJiNjI2Yy4uNzMzNzA2NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlzZW11bC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpc2VtdWwuYwpAQCAtNzEzLDE3ICs3MTMsMTcgQEAKIAkJCXMxNiBiID0gKHJzMiA+PiAoaSAqIDE2KSkgJiAweGZmZmY7CiAKIAkJCWlmIChhID4gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSA4ID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZDTVBHVDMyX09QRjoKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZjsKLQkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmY7CisJCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKKwkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOwogCiAJCQlpZiAoYSA+IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gMiA+PiBpOwogCQl9CiAJCWJyZWFrOwogCkBAIC03MzMsMTcgKzczMywxNyBAQAogCQkJczE2IGIgPSAocnMyID4+IChpICogMTYpKSAmIDB4ZmZmZjsKIAogCQkJaWYgKGEgPD0gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSA4ID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZDTVBMRTMyX09QRjoKIAkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZjsKLQkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmY7CisJCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKKwkJCXMzMiBiID0gKHJzMiA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOwogCiAJCQlpZiAoYSA8PSBiKQotCQkJCXJkX3ZhbCB8PSAxIDw8IGk7CisJCQkJcmRfdmFsIHw9IDIgPj4gaTsKIAkJfQogCQlicmVhazsKIApAQCAtNzUzLDE3ICs3NTMsMTcgQEAKIAkJCXMxNiBiID0gKHJzMiA+PiAoaSAqIDE2KSkgJiAweGZmZmY7CiAKIAkJCWlmIChhICE9IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gOCA+PiBpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBGQ01QTkUzMl9PUEY6CiAJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXMzMiBhID0gKHJzMSA+PiAoaSAqIDMyKSkgJiAweGZmZmY7Ci0JCQlzMzIgYiA9IChyczIgPj4gKGkgKiAzMikpICYgMHhmZmZmOworCQkJczMyIGEgPSAocnMxID4+IChpICogMzIpKSAmIDB4ZmZmZmZmZmY7CisJCQlzMzIgYiA9IChyczIgPj4gKGkgKiAzMikpICYgMHhmZmZmZmZmZjsKIAogCQkJaWYgKGEgIT0gYikKLQkJCQlyZF92YWwgfD0gMSA8PCBpOworCQkJCXJkX3ZhbCB8PSAyID4+IGk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTc3MywxNyArNzczLDE3IEBACiAJCQlzMTYgYiA9IChyczIgPj4gKGkgKiAxNikpICYgMHhmZmZmOwogCiAJCQlpZiAoYSA9PSBiKQotCQkJCXJkX3ZhbCB8PSAxIDw8IGk7CisJCQkJcmRfdmFsIHw9IDggPj4gaTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgRkNNUEVRMzJfT1BGOgogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlzMzIgYSA9IChyczEgPj4gKGkgKiAzMikpICYgMHhmZmZmOwotCQkJczMyIGIgPSAocnMyID4+IChpICogMzIpKSAmIDB4ZmZmZjsKKwkJCXMzMiBhID0gKHJzMSA+PiAoaSAqIDMyKSkgJiAweGZmZmZmZmZmOworCQkJczMyIGIgPSAocnMyID4+IChpICogMzIpKSAmIDB4ZmZmZmZmZmY7CiAKIAkJCWlmIChhID09IGIpCi0JCQkJcmRfdmFsIHw9IDEgPDwgaTsKKwkJCQlyZF92YWwgfD0gMiA+PiBpOwogCQl9CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL21lbWNweS5TIGIvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKaW5kZXggMzRmZTY1Ny4uNGQ4YzQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKKysrIGIvYXJjaC9zcGFyYy9saWIvbWVtY3B5LlMKQEAgLTcsNDAgKzcsMTIgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NiBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgRlVOQyh4KSAJCQkJCQkJCQkJCVwKKyNkZWZpbmUgRlVOQyh4KSAJCVwKIAkuZ2xvYmwJeDsJCVwKIAkudHlwZQl4LEBmdW5jdGlvbjsJXAotCS5hbGlnbgk0OwkJCQkJCQkJCQkJXAorCS5hbGlnbgk0OwkJXAogeDoKIAotI3VuZGVmIEZBU1RFUl9SRVZFUlNFCi0jdW5kZWYgRkFTVEVSX05PTkFMSUdORUQKLSNkZWZpbmUgRkFTVEVSX0FMSUdORUQKLQotLyogSW4ga2VybmVsIHRoZXNlIGZ1bmN0aW9ucyBkb24ndCByZXR1cm4gYSB2YWx1ZS4KLSAqIE9uZSBzaG91bGQgdXNlIG1hY3JvcyBpbiBhc20vc3RyaW5nLmggZm9yIHRoYXQgcHVycG9zZS4KLSAqIFdlIHJldHVybiAwLCBzbyB0aGF0IGJ1Z3MgYXJlIG1vcmUgYXBwYXJlbnQuCi0gKi8KLSNkZWZpbmUgU0VUVVBfUkVUTAotI2RlZmluZSBSRVRMX0lOU04JY2xyCSVvMAotCi0jZWxzZQotCi0vKiBsaWJjICovCi0KLSNpbmNsdWRlICJERUZTLmgiCi0KLSNkZWZpbmUgRkFTVEVSX1JFVkVSU0UKLSNkZWZpbmUgRkFTVEVSX05PTkFMSUdORUQKLSNkZWZpbmUgRkFTVEVSX0FMSUdORUQKLQotI2RlZmluZSBTRVRVUF9SRVRMCW1vdgklbzAsICVnNgotI2RlZmluZSBSRVRMX0lOU04JbW92CSVnNiwgJW8wCi0KLSNlbmRpZgotCiAvKiBCb3RoIHRoZXNlIG1hY3JvcyBoYXZlIHRvIHN0YXJ0IHdpdGggZXhhY3RseSB0aGUgc2FtZSBpbnNuICovCiAjZGVmaW5lIE1PVkVfQklHQ0hVTksoc3JjLCBkc3QsIG9mZnNldCwgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KSBcCiAJbGRkCVslc3JjICsgKG9mZnNldCkgKyAweDAwXSwgJXQwOyBcCkBAIC0xNjQsMzAgKzEzNiw2IEBACiAJLnRleHQKIAkuYWxpZ24JNAogCi0jaWZkZWYgRkFTVEVSX1JFVkVSU0UKLQotNzA6CS8qIHJkd29yZF9hbGlnbiAqLwotCi0JYW5kY2MJCSVvMSwgMSwgJWcwCi0JYmUJCTRmCi0JIGFuZGNjCQklbzEsIDIsICVnMAotCi0JbGR1YgkJWyVvMSAtIDFdLCAlZzIKLQlzdWIJCSVvMSwgMSwgJW8xCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotCXN1YgkJJW8yLCAxLCAlbzIKLQliZQkJM2YKLQkgc3ViCQklbzAsIDEsICVvMAotNDoKLQlsZHVoCQlbJW8xIC0gMl0sICVnMgotCXN1YgkJJW8xLCAyLCAlbzEKLQlzdGgJCSVnMiwgWyVvMCAtIDJdCi0Jc3ViCQklbzIsIDIsICVvMgotCWIJCTNmCi0JIHN1YgkJJW8wLCAyLCAlbzAKLQotI2VuZGlmIC8qIEZBU1RFUl9SRVZFUlNFICovCi0KIDA6CiAJcmV0bAogCSBub3AJCSEgT25seSBiY29weSByZXR1cm5zIGhlcmUgYW5kIGl0IHJldHVucyB2b2lkLi4uCkBAIC0xOTgsNyArMTQ2LDcgQEAKICNlbmRpZgogRlVOQyhtZW1tb3ZlKQogCWNtcAkJJW8wLCAlbzEKLQlTRVRVUF9SRVRMCisJbW92CQklbzAsICVnNwogCWJsZXUJCTlmCiAJIHN1YgkJJW8wLCAlbzEsICVvNAogCkBAIC0yMDcsOCArMTU1LDYgQEAKIAlibGV1CQkwZgogCSBhbmRjYwkJJW80LCAzLCAlbzUKIAotI2lmbmRlZiBGQVNURVJfUkVWRVJTRQotCiAJYWRkCQklbzEsICVvMiwgJW8xCiAJYWRkCQklbzAsICVvMiwgJW8wCiAJc3ViCQklbzEsIDEsICVvMQpAQCAtMjI0LDI5NSArMTcwLDcgQEAKIAkgc3ViCQklbzAsIDEsICVvMAogCiAJcmV0bAotCSBSRVRMX0lOU04KLQotI2Vsc2UgLyogRkFTVEVSX1JFVkVSU0UgKi8KLQotCWFkZAkJJW8xLCAlbzIsICVvMQotCWFkZAkJJW8wLCAlbzIsICVvMAotCWJuZQkJNzdmCi0JIGNtcAkJJW8yLCAxNQotCWJsZXUJCTkxZgotCSBhbmRjYwkJJW8xLCAzLCAlZzAKLQlibmUJCTcwYgotMzoKLQkgYW5kY2MJCSVvMSwgNCwgJWcwCi0KLQliZQkJMmYKLQkgbW92CQklbzIsICVnMQotCi0JbGQJCVslbzEgLSA0XSwgJW80Ci0Jc3ViCQklZzEsIDQsICVnMQotCXN0CQklbzQsIFslbzAgLSA0XQotCXN1YgkJJW8xLCA0LCAlbzEKLQlzdWIJCSVvMCwgNCwgJW8wCi0yOgotCWFuZGNjCQklZzEsIDB4ZmZmZmZmODAsICVnNwotCWJlCQkzZgotCSBhbmRjYwkJJW8wLCA0LCAlZzAKLQotCWJlCQk3NGYgKyA0Ci01OgotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHgwMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHgyMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg2MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCXN1YmNjCQklZzcsIDEyOCwgJWc3Ci0Jc3ViCQklbzEsIDEyOCwgJW8xCi0JYm5lCQk1YgotCSBzdWIJCSVvMCwgMTI4LCAlbzAKLTM6Ci0JYW5kY2MJCSVnMSwgMHg3MCwgJWc3Ci0JYmUJCTcyZgotCSBhbmRjYwkJJWcxLCA4LCAlZzAKLQotCXNldGhpCQklaGkoNzJmKSwgJW81Ci0Jc3JsCQklZzcsIDEsICVvNAotCWFkZAkJJWc3LCAlbzQsICVvNAotCXN1YgkJJW8xLCAlZzcsICVvMQotCXN1YgkJJW81LCAlbzQsICVvNQotCWptcGwJCSVvNSArICVsbyg3MmYpLCAlZzAKLQkgc3ViCQklbzAsICVnNywgJW8wCi0KLTcxOgkvKiBybWVtY3B5X3RhYmxlICovCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg2MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg1MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHg0MCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfTEFTVENIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUpCi0KLTcyOgkvKiBybWVtY3B5X3RhYmxlX2VuZCAqLwotCi0JYmUJCTczZgotCSBhbmRjYwkJJWcxLCA0LCAlZzAKLQotCWxkZAkJWyVvMSAtIDB4MDhdLCAlZzIKLQlzdWIJCSVvMCwgOCwgJW8wCi0Jc3ViCQklbzEsIDgsICVvMQotCXN0CQklZzIsIFslbzBdCi0Jc3QJCSVnMywgWyVvMCArIDB4MDRdCi0KLTczOgkvKiBybWVtY3B5X2xhc3Q3ICovCi0KLQliZQkJMWYKLQkgYW5kY2MJCSVnMSwgMiwgJWcwCi0KLQlsZAkJWyVvMSAtIDRdLCAlZzIKLQlzdWIJCSVvMSwgNCwgJW8xCi0Jc3QJCSVnMiwgWyVvMCAtIDRdCi0Jc3ViCQklbzAsIDQsICVvMAotMToKLQliZQkJMWYKLQkgYW5kY2MJCSVnMSwgMSwgJWcwCi0KLQlsZHVoCQlbJW8xIC0gMl0sICVnMgotCXN1YgkJJW8xLCAyLCAlbzEKLQlzdGgJCSVnMiwgWyVvMCAtIDJdCi0Jc3ViCQklbzAsIDIsICVvMAotMToKLQliZQkJMWYKLQkgbm9wCi0KLQlsZHViCQlbJW8xIC0gMV0sICVnMgotCXN0YgkJJWcyLCBbJW8wIC0gMV0KLTE6Ci0JcmV0bAotIAkgUkVUTF9JTlNOCi0KLTc0OgkvKiBybGRkX3N0ZCAqLwotCVJNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0JUk1PVkVfQklHQUxJR05DSFVOSyhvMSwgbzAsIDB4MjAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKLQlSTU9WRV9CSUdBTElHTkNIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQotCVJNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKLQlzdWIJCSVvMSwgMTI4LCAlbzEKLQlibmUJCTc0YgotCSBzdWIJCSVvMCwgMTI4LCAlbzAKLQotCWFuZGNjCQklZzEsIDB4NzAsICVnNwotCWJlCQk3MmIKLQkgYW5kY2MJCSVnMSwgOCwgJWcwCi0KLQlzZXRoaQkJJWhpKDcyYiksICVvNQotCXNybAkJJWc3LCAxLCAlbzQKLQlhZGQJCSVnNywgJW80LCAlbzQKLQlzdWIJCSVvMSwgJWc3LCAlbzEKLQlzdWIJCSVvNSwgJW80LCAlbzUKLQlqbXBsCQklbzUgKyAlbG8oNzJiKSwgJWcwCi0JIHN1YgkJJW8wLCAlZzcsICVvMAotCi03NToJLyogcnNob3J0X2VuZCAqLwotCi0JYW5kCQklbzIsIDB4ZSwgJW8zCi0yOgotCXNldGhpCQklaGkoNzZmKSwgJW81Ci0Jc2xsCQklbzMsIDMsICVvNAotCXN1YgkJJW8wLCAlbzMsICVvMAotCXN1YgkJJW81LCAlbzQsICVvNQotCXN1YgkJJW8xLCAlbzMsICVvMQotCWptcGwJCSVvNSArICVsbyg3NmYpLCAlZzAKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCi0KLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwYywgZzIsIGczKQotCVJNT1ZFX1NIT1JUQ0hVTksobzEsIG8wLCAweDBhLCBnMiwgZzMpCi0JUk1PVkVfU0hPUlRDSFVOSyhvMSwgbzAsIDB4MDgsIGcyLCBnMykKLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwNiwgZzIsIGczKQotCVJNT1ZFX1NIT1JUQ0hVTksobzEsIG8wLCAweDA0LCBnMiwgZzMpCi0JUk1PVkVfU0hPUlRDSFVOSyhvMSwgbzAsIDB4MDIsIGcyLCBnMykKLQlSTU9WRV9TSE9SVENIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczKQotCi03NjoJLyogcnNob3J0X3RhYmxlX2VuZCAqLwotCi0JYmUJCTFmCi0JIG5vcAotCWxkdWIJCVslbzEgLSAxXSwgJWcyCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotMToKLQlyZXRsCi0gCSBSRVRMX0lOU04KLQotOTE6CS8qIHJzaG9ydF9hbGlnbmVkX2VuZCAqLwotCi0JYm5lCQk3NWIKLQkgYW5kY2MJCSVvMiwgOCwgJWcwCi0KLQliZQkJMWYKLQkgYW5kY2MJCSVvMiwgNCwgJWcwCi0KLQlsZAkJWyVvMSAtIDB4MDhdLCAlZzIKLQlsZAkJWyVvMSAtIDB4MDRdLCAlZzMKLQlzdWIJCSVvMSwgOCwgJW8xCi0Jc3QJCSVnMiwgWyVvMCAtIDB4MDhdCi0Jc3QJCSVnMywgWyVvMCAtIDB4MDRdCi0Jc3ViCQklbzAsIDgsICVvMAotMToKLQliCQk3M2IKLQkgbW92CQklbzIsICVnMQotCi03NzoJLyogcm5vbl9hbGlnbmVkICovCi0JY21wCQklbzIsIDE1Ci0JYmxldQkJNzViCi0JIGFuZGNjCQklbzAsIDMsICVnMAotCWJlCQk2NGYKLQkgYW5kY2MJCSVvMCwgMSwgJWcwCi0JYmUJCTYzZgotCSBhbmRjYwkJJW8wLCAyLCAlZzAKLQlsZHViCQlbJW8xIC0gMV0sICVnNQotCXN1YgkJJW8xLCAxLCAlbzEKLQlzdGIJCSVnNSwgWyVvMCAtIDFdCi0Jc3ViCQklbzAsIDEsICVvMAotCWJlCQk2NGYKLQkgc3ViCQklbzIsIDEsICVvMgotNjM6Ci0JbGR1YgkJWyVvMSAtIDFdLCAlZzUKLQlzdWIJCSVvMSwgMiwgJW8xCi0Jc3RiCQklZzUsIFslbzAgLSAxXQotCXN1YgkJJW8wLCAyLCAlbzAKLQlsZHViCQlbJW8xXSwgJWc1Ci0Jc3ViCQklbzIsIDIsICVvMgotCXN0YgkJJWc1LCBbJW8wXQotNjQ6CQotCWFuZAkJJW8xLCAzLCAlZzIKLQlhbmQJCSVvMSwgLTQsICVvMQotCWFuZAkJJW8yLCAweGMsICVnMwotCWFkZAkJJW8xLCA0LCAlbzEKLQljbXAJCSVnMywgNAotCXNsbAkJJWcyLCAzLCAlZzQKLQltb3YJCTMyLCAlZzIKLQliZQkJNGYKLQkgc3ViCQklZzIsICVnNCwgJWc3Ci0KLQlibHUJCTNmCi0JIGNtcAkJJWczLCA4Ci0KLQliZQkJMmYKLQkgc3JsCQklbzIsIDIsICVnMwotCi0JbGQJCVslbzEgLSA0XSwgJW8zCi0JYWRkCQklbzAsIC04LCAlbzAKLQlsZAkJWyVvMSAtIDhdLCAlbzQKLQlhZGQJCSVvMSwgLTE2LCAlbzEKLQliCQk3ZgotCSBhZGQJCSVnMywgMSwgJWczCi0yOgotCWxkCQlbJW8xIC0gNF0sICVvNAotCWFkZAkJJW8wLCAtNCwgJW8wCi0JbGQJCVslbzEgLSA4XSwgJWcxCi0JYWRkCQklbzEsIC0xMiwgJW8xCi0JYgkJOGYKLQkgYWRkCQklZzMsIDIsICVnMwotMzoKLQlsZAkJWyVvMSAtIDRdLCAlbzUKLQlhZGQJCSVvMCwgLTEyLCAlbzAKLQlsZAkJWyVvMSAtIDhdLCAlbzMKLQlhZGQJCSVvMSwgLTIwLCAlbzEKLQliCQk2ZgotCSBzcmwJCSVvMiwgMiwgJWczCi00OgotCWxkCQlbJW8xIC0gNF0sICVnMQotCXNybAkJJW8yLCAyLCAlZzMKLQlsZAkJWyVvMSAtIDhdLCAlbzUKLQlhZGQJCSVvMSwgLTI0LCAlbzEKLQlhZGQJCSVvMCwgLTE2LCAlbzAKLQlhZGQJCSVnMywgLTEsICVnMwotCi0JbGQJCVslbzEgKyAxMl0sICVvMwotNToKLQlzbGwJCSVvNSwgJWc0LCAlZzIKLQlzcmwJCSVnMSwgJWc3LCAlZzUKLQlvcgkJJWcyLCAlZzUsICVnMgotCXN0CQklZzIsIFslbzAgKyAxMl0KLTY6Ci0JbGQJCVslbzEgKyA4XSwgJW80Ci0Jc2xsCQklbzMsICVnNCwgJWcyCi0Jc3JsCQklbzUsICVnNywgJWc1Ci0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wICsgOF0KLTc6Ci0JbGQJCVslbzEgKyA0XSwgJWcxCi0Jc2xsCQklbzQsICVnNCwgJWcyCi0Jc3JsCQklbzMsICVnNywgJWc1Ci0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wICsgNF0KLTg6Ci0JbGQJCVslbzFdLCAlbzUKLQlzbGwJCSVnMSwgJWc0LCAlZzIKLQlzcmwJCSVvNCwgJWc3LCAlZzUKLQlhZGRjYwkJJWczLCAtNCwgJWczCi0Jb3IJCSVnMiwgJWc1LCAlZzIKLQlhZGQJCSVvMSwgLTE2LCAlbzEKLQlzdAkJJWcyLCBbJW8wXQotCWFkZAkJJW8wLCAtMTYsICVvMAotCWJuZSxhCQk1YgkKLQkgbGQJCVslbzEgKyAxMl0sICVvMwotCXNsbAkJJW81LCAlZzQsICVnMgotCXNybAkJJWcxLCAlZzcsICVnNQotCXNybAkJJWc0LCAzLCAlZzMKLQlvcgkJJWcyLCAlZzUsICVnMgotCWFkZAkJJW8xLCAlZzMsICVvMQotCWFuZGNjCQklbzIsIDIsICVnMAotCXN0CQklZzIsIFslbzAgKyAxMl0KLQliZQkJMWYKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCi0JCi0JbGR1YgkJWyVvMSArIDE1XSwgJWc1Ci0JYWRkCQklbzEsIC0yLCAlbzEKLQlzdGIJCSVnNSwgWyVvMCArIDExXQotCWFkZAkJJW8wLCAtMiwgJW8wCi0JbGR1YgkJWyVvMSArIDE2XSwgJWc1Ci0Jc3RiCQklZzUsIFslbzAgKyAxMl0KLTE6Ci0JYmUJCTFmCi0JIG5vcAotCWxkdWIJCVslbzEgKyAxNV0sICVnNQotCXN0YgkJJWc1LCBbJW8wICsgMTFdCi0xOgotCXJldGwKLQkgUkVUTF9JTlNOCi0KLSNlbmRpZiAvKiBGQVNURVJfUkVWRVJTRSAqLworCSBtb3YJCSVnNywgJW8wCiAKIC8qIE5PVEU6IFRoaXMgY29kZSBpcyBleGVjdXRlZCBqdXN0IGZvciB0aGUgY2FzZXMsCiAgICAgICAgICB3aGVyZSAlc3JjICg9JW8xKSAmIDMgaXMgIT0gMC4KQEAgLTU0Niw3ICsyMDQsNyBAQAogRlVOQyhtZW1jcHkpCS8qICVvMD1kc3QgJW8xPXNyYyAlbzI9bGVuICovCiAKIAlzdWIJCSVvMCwgJW8xLCAlbzQKLQlTRVRVUF9SRVRMCisJbW92CQklbzAsICVnNwogOToKIAlhbmRjYwkJJW80LCAzLCAlbzUKIDA6CkBAIC01NjksNyArMjI3LDcgQEAKIAlhZGQJCSVvMSwgNCwgJW8xCiAJYWRkCQklbzAsIDQsICVvMAogMjoKLQlhbmRjYwkJJWcxLCAweGZmZmZmZjgwLCAlZzcKKwlhbmRjYwkJJWcxLCAweGZmZmZmZjgwLCAlZzAKIAliZQkJM2YKIAkgYW5kY2MJCSVvMCwgNCwgJWcwCiAKQEAgLTU3OSwyMiArMjM3LDIzIEBACiAJTU9WRV9CSUdDSFVOSyhvMSwgbzAsIDB4MjAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKIAlNT1ZFX0JJR0NIVU5LKG8xLCBvMCwgMHg0MCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQogCU1PVkVfQklHQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKKwlzdWIJCSVnMSwgMTI4LCAlZzEKIAlhZGQJCSVvMSwgMTI4LCAlbzEKLQlibmUJCTViCisJY21wCQklZzEsIDEyOAorCWJnZQkJNWIKIAkgYWRkCQklbzAsIDEyOCwgJW8wCiAzOgotCWFuZGNjCQklZzEsIDB4NzAsICVnNworCWFuZGNjCQklZzEsIDB4NzAsICVnNAogCWJlCQk4MGYKIAkgYW5kY2MJCSVnMSwgOCwgJWcwCiAKIAlzZXRoaQkJJWhpKDgwZiksICVvNQotCXNybAkJJWc3LCAxLCAlbzQKLQlhZGQJCSVnNywgJW80LCAlbzQKLQlhZGQJCSVvMSwgJWc3LCAlbzEKKwlzcmwJCSVnNCwgMSwgJW80CisJYWRkCQklZzQsICVvNCwgJW80CisJYWRkCQklbzEsICVnNCwgJW8xCiAJc3ViCQklbzUsICVvNCwgJW81CiAJam1wbAkJJW81ICsgJWxvKDgwZiksICVnMAotCSBhZGQJCSVvMCwgJWc3LCAlbzAKKwkgYWRkCQklbzAsICVnNCwgJW8wCiAKIDc5OgkvKiBtZW1jcHlfdGFibGUgKi8KIApAQCAtNjQxLDQzICszMDAsMjggQEAKIAlzdGIJCSVnMiwgWyVvMF0KIDE6CiAJcmV0bAotIAkgUkVUTF9JTlNOCisJIG1vdgkJJWc3LCAlbzAKIAogODI6CS8qIGxkZF9zdGQgKi8KIAlNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCiAJTU9WRV9CSUdBTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgbzIsIG8zLCBvNCwgbzUsIGcyLCBnMywgZzQsIGc1KQogCU1PVkVfQklHQUxJR05DSFVOSyhvMSwgbzAsIDB4NDAsIG8yLCBvMywgbzQsIG81LCBnMiwgZzMsIGc0LCBnNSkKIAlNT1ZFX0JJR0FMSUdOQ0hVTksobzEsIG8wLCAweDYwLCBvMiwgbzMsIG80LCBvNSwgZzIsIGczLCBnNCwgZzUpCi0Jc3ViY2MJCSVnNywgMTI4LCAlZzcKKwlzdWJjYwkJJWcxLCAxMjgsICVnMQogCWFkZAkJJW8xLCAxMjgsICVvMQotCWJuZQkJODJiCisJY21wCQklZzEsIDEyOAorCWJnZQkJODJiCiAJIGFkZAkJJW8wLCAxMjgsICVvMAogCi0jaWZuZGVmIEZBU1RFUl9BTElHTkVECi0KLQlhbmRjYwkJJWcxLCAweDcwLCAlZzcKLQliZQkJODBiCi0JIGFuZGNjCQklZzEsIDgsICVnMAotCi0Jc2V0aGkJCSVoaSg4MGIpLCAlbzUKLQlzcmwJCSVnNywgMSwgJW80Ci0JYWRkCQklZzcsICVvNCwgJW80Ci0JYWRkCQklbzEsICVnNywgJW8xCi0Jc3ViCQklbzUsICVvNCwgJW81Ci0Jam1wbAkJJW81ICsgJWxvKDgwYiksICVnMAotCSBhZGQJCSVvMCwgJWc3LCAlbzAKLQotI2Vsc2UgLyogRkFTVEVSX0FMSUdORUQgKi8KLQotCWFuZGNjCQklZzEsIDB4NzAsICVnNworCWFuZGNjCQklZzEsIDB4NzAsICVnNAogCWJlCQk4NGYKIAkgYW5kY2MJCSVnMSwgOCwgJWcwCiAKIAlzZXRoaQkJJWhpKDg0ZiksICVvNQotCWFkZAkJJW8xLCAlZzcsICVvMQotCXN1YgkJJW81LCAlZzcsICVvNQorCWFkZAkJJW8xLCAlZzQsICVvMQorCXN1YgkJJW81LCAlZzQsICVvNQogCWptcGwJCSVvNSArICVsbyg4NGYpLCAlZzAKLQkgYWRkCQklbzAsICVnNywgJW8wCisJIGFkZAkJJW8wLCAlZzQsICVvMAogCiA4MzoJLyogYW1lbWNweV90YWJsZSAqLwogCkBAIC03MjEsMzgyICszNjUsMTMyIEBACiAJc3RiCQklZzIsIFslbzBdCiAxOgogCXJldGwKLSAJIFJFVExfSU5TTgotCi0jZW5kaWYgLyogRkFTVEVSX0FMSUdORUQgKi8KKwkgbW92CQklZzcsICVvMAogCiA4NjoJLyogbm9uX2FsaWduZWQgKi8KIAljbXAJCSVvMiwgNgogCWJsZXUJCTg4ZgorCSBub3AKIAotI2lmZGVmIEZBU1RFUl9OT05BTElHTkVECi0KLQkgY21wCQklbzIsIDI1NgotCWJjYwkJODdmCi0KLSNlbmRpZiAvKiBGQVNURVJfTk9OQUxJR05FRCAqLwotCi0JIGFuZGNjCQklbzAsIDMsICVnMAorCXNhdmUJCSVzcCwgLTk2LCAlc3AKKwlhbmRjYwkJJWkwLCAzLCAlZzAKIAliZQkJNjFmCi0JIGFuZGNjCQklbzAsIDEsICVnMAorCSBhbmRjYwkJJWkwLCAxLCAlZzAKIAliZQkJNjBmCi0JIGFuZGNjCQklbzAsIDIsICVnMAorCSBhbmRjYwkJJWkwLCAyLCAlZzAKIAotCWxkdWIJCVslbzFdLCAlZzUKLQlhZGQJCSVvMSwgMSwgJW8xCi0Jc3RiCQklZzUsIFslbzBdCi0Jc3ViCQklbzIsIDEsICVvMgorCWxkdWIJCVslaTFdLCAlZzUKKwlhZGQJCSVpMSwgMSwgJWkxCisJc3RiCQklZzUsIFslaTBdCisJc3ViCQklaTIsIDEsICVpMgogCWJuZQkJNjFmCi0JIGFkZAkJJW8wLCAxLCAlbzAKKwkgYWRkCQklaTAsIDEsICVpMAogNjA6Ci0JbGR1YgkJWyVvMV0sICVnMwotCWFkZAkJJW8xLCAyLCAlbzEKLQlzdGIJCSVnMywgWyVvMF0KLQlzdWIJCSVvMiwgMiwgJW8yCi0JbGR1YgkJWyVvMSAtIDFdLCAlZzMKLQlhZGQJCSVvMCwgMiwgJW8wCi0Jc3RiCQklZzMsIFslbzAgLSAxXQorCWxkdWIJCVslaTFdLCAlZzMKKwlhZGQJCSVpMSwgMiwgJWkxCisJc3RiCQklZzMsIFslaTBdCisJc3ViCQklaTIsIDIsICVpMgorCWxkdWIJCVslaTEgLSAxXSwgJWczCisJYWRkCQklaTAsIDIsICVpMAorCXN0YgkJJWczLCBbJWkwIC0gMV0KIDYxOgotCWFuZAkJJW8xLCAzLCAlZzIKLQlhbmQJCSVvMiwgMHhjLCAlZzMKLQlhbmQJCSVvMSwgLTQsICVvMQorCWFuZAkJJWkxLCAzLCAlZzIKKwlhbmQJCSVpMiwgMHhjLCAlZzMKKwlhbmQJCSVpMSwgLTQsICVpMQogCWNtcAkJJWczLCA0CiAJc2xsCQklZzIsIDMsICVnNAogCW1vdgkJMzIsICVnMgogCWJlCQk0ZgotCSBzdWIJCSVnMiwgJWc0LCAlZzcKKwkgc3ViCQklZzIsICVnNCwgJWwwCiAJCiAJYmx1CQkzZgogCSBjbXAJCSVnMywgMHg4CiAKIAliZQkJMmYKLQkgc3JsCQklbzIsIDIsICVnMworCSBzcmwJCSVpMiwgMiwgJWczCiAKLQlsZAkJWyVvMV0sICVvMwotCWFkZAkJJW8wLCAtOCwgJW8wCi0JbGQJCVslbzEgKyA0XSwgJW80CisJbGQJCVslaTFdLCAlaTMKKwlhZGQJCSVpMCwgLTgsICVpMAorCWxkCQlbJWkxICsgNF0sICVpNAogCWIJCThmCiAJIGFkZAkJJWczLCAxLCAlZzMKIDI6Ci0JbGQJCVslbzFdLCAlbzQKLQlhZGQJCSVvMCwgLTEyLCAlbzAKLQlsZAkJWyVvMSArIDRdLCAlbzUKKwlsZAkJWyVpMV0sICVpNAorCWFkZAkJJWkwLCAtMTIsICVpMAorCWxkCQlbJWkxICsgNF0sICVpNQogCWFkZAkJJWczLCAyLCAlZzMKIAliCQk5ZgotCSBhZGQJCSVvMSwgLTQsICVvMQorCSBhZGQJCSVpMSwgLTQsICVpMQogMzoKLQlsZAkJWyVvMV0sICVnMQotCWFkZAkJJW8wLCAtNCwgJW8wCi0JbGQJCVslbzEgKyA0XSwgJW8zCi0Jc3JsCQklbzIsIDIsICVnMworCWxkCQlbJWkxXSwgJWcxCisJYWRkCQklaTAsIC00LCAlaTAKKwlsZAkJWyVpMSArIDRdLCAlaTMKKwlzcmwJCSVpMiwgMiwgJWczCiAJYgkJN2YKLQkgYWRkCQklbzEsIDQsICVvMQorCSBhZGQJCSVpMSwgNCwgJWkxCiA0OgotCWxkCQlbJW8xXSwgJW81Ci0JY21wCQklbzIsIDcKLQlsZAkJWyVvMSArIDRdLCAlZzEKLQlzcmwJCSVvMiwgMiwgJWczCisJbGQJCVslaTFdLCAlaTUKKwljbXAJCSVpMiwgNworCWxkCQlbJWkxICsgNF0sICVnMQorCXNybAkJJWkyLCAyLCAlZzMKIAlibGV1CQkxMGYKLQkgYWRkCQklbzEsIDgsICVvMQorCSBhZGQJCSVpMSwgOCwgJWkxCiAKLQlsZAkJWyVvMV0sICVvMworCWxkCQlbJWkxXSwgJWkzCiAJYWRkCQklZzMsIC0xLCAlZzMKIDU6Ci0Jc2xsCQklbzUsICVnNCwgJWcyCi0Jc3JsCQklZzEsICVnNywgJWc1CisJc2xsCQklaTUsICVnNCwgJWcyCisJc3JsCQklZzEsICVsMCwgJWc1CiAJb3IJCSVnMiwgJWc1LCAlZzIKLQlzdAkJJWcyLCBbJW8wXQorCXN0CQklZzIsIFslaTBdCiA3OgotCWxkCQlbJW8xICsgNF0sICVvNAorCWxkCQlbJWkxICsgNF0sICVpNAogCXNsbAkJJWcxLCAlZzQsICVnMgotCXNybAkJJW8zLCAlZzcsICVnNQorCXNybAkJJWkzLCAlbDAsICVnNQogCW9yCQklZzIsICVnNSwgJWcyCi0Jc3QJCSVnMiwgWyVvMCArIDRdCisJc3QJCSVnMiwgWyVpMCArIDRdCiA4OgotCWxkCQlbJW8xICsgOF0sICVvNQotCXNsbAkJJW8zLCAlZzQsICVnMgotCXNybAkJJW80LCAlZzcsICVnNQorCWxkCQlbJWkxICsgOF0sICVpNQorCXNsbAkJJWkzLCAlZzQsICVnMgorCXNybAkJJWk0LCAlbDAsICVnNQogCW9yCQklZzIsICVnNSwgJWcyCi0Jc3QJCSVnMiwgWyVvMCArIDhdCisJc3QJCSVnMiwgWyVpMCArIDhdCiA5OgotCWxkCQlbJW8xICsgMTJdLCAlZzEKLQlzbGwJCSVvNCwgJWc0LCAlZzIKLQlzcmwJCSVvNSwgJWc3LCAlZzUKKwlsZAkJWyVpMSArIDEyXSwgJWcxCisJc2xsCQklaTQsICVnNCwgJWcyCisJc3JsCQklaTUsICVsMCwgJWc1CiAJYWRkY2MJCSVnMywgLTQsICVnMwogCW9yCQklZzIsICVnNSwgJWcyCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlzdAkJJWcyLCBbJW8wICsgMTJdCi0JYWRkCQklbzAsIDE2LCAlbzAKKwlhZGQJCSVpMSwgMTYsICVpMQorCXN0CQklZzIsIFslaTAgKyAxMl0KKwlhZGQJCSVpMCwgMTYsICVpMAogCWJuZSxhCQk1YgotCSBsZAkJWyVvMV0sICVvMworCSBsZAkJWyVpMV0sICVpMwogMTA6Ci0Jc2xsCQklbzUsICVnNCwgJWcyCi0Jc3JsCQklZzEsICVnNywgJWc1Ci0Jc3JsCQklZzcsIDMsICVnMworCXNsbAkJJWk1LCAlZzQsICVnMgorCXNybAkJJWcxLCAlbDAsICVnNQorCXNybAkJJWwwLCAzLCAlZzMKIAlvcgkJJWcyLCAlZzUsICVnMgotCXN1YgkJJW8xLCAlZzMsICVvMQotCWFuZGNjCQklbzIsIDIsICVnMAotCXN0CQklZzIsIFslbzBdCisJc3ViCQklaTEsICVnMywgJWkxCisJYW5kY2MJCSVpMiwgMiwgJWcwCisJc3QJCSVnMiwgWyVpMF0KIAliZQkJMWYKLQkgYW5kY2MJCSVvMiwgMSwgJWcwCisJIGFuZGNjCQklaTIsIDEsICVnMAogCi0JbGR1YgkJWyVvMV0sICVnMgotCWFkZAkJJW8xLCAyLCAlbzEKLQlzdGIJCSVnMiwgWyVvMCArIDRdCi0JYWRkCQklbzAsIDIsICVvMAotCWxkdWIJCVslbzEgLSAxXSwgJWcyCi0Jc3RiCQklZzIsIFslbzAgKyAzXQorCWxkdWIJCVslaTFdLCAlZzIKKwlhZGQJCSVpMSwgMiwgJWkxCisJc3RiCQklZzIsIFslaTAgKyA0XQorCWFkZAkJJWkwLCAyLCAlaTAKKwlsZHViCQlbJWkxIC0gMV0sICVnMgorCXN0YgkJJWcyLCBbJWkwICsgM10KIDE6CiAJYmUJCTFmCiAJIG5vcAotCWxkdWIJCVslbzFdLCAlZzIKLQlzdGIJCSVnMiwgWyVvMCArIDRdCisJbGR1YgkJWyVpMV0sICVnMgorCXN0YgkJJWcyLCBbJWkwICsgNF0KIDE6Ci0JcmV0bAotCSBSRVRMX0lOU04KLQotI2lmZGVmIEZBU1RFUl9OT05BTElHTkVECi0KLTg3OgkvKiBmYXN0ZXJfbm9uYWxpZ25lZCAqLwotCi0JYW5kY2MJCSVvMSwgMywgJWcwCi0JYmUJCTNmCi0JIGFuZGNjCQklbzEsIDEsICVnMAotCi0JYmUJCTRmCi0JIGFuZGNjCQklbzEsIDIsICVnMAotCi0JbGR1YgkJWyVvMV0sICVnMgotCWFkZAkJJW8xLCAxLCAlbzEKLQlzdGIJCSVnMiwgWyVvMF0KLQlzdWIJCSVvMiwgMSwgJW8yCi0JYm5lCQkzZgotCSBhZGQJCSVvMCwgMSwgJW8wCi00OgotCWxkdWgJCVslbzFdLCAlZzIKLQlhZGQJCSVvMSwgMiwgJW8xCi0Jc3JsCQklZzIsIDgsICVnMwotCXN1YgkJJW8yLCAyLCAlbzIKLQlzdGIJCSVnMywgWyVvMF0KLQlhZGQJCSVvMCwgMiwgJW8wCi0Jc3RiCQklZzIsIFslbzAgLSAxXQotMzoKLQkgYW5kY2MJCSVvMSwgNCwgJWcwCi0KLQlibmUJCTJmCi0JIGNtcAkJJW81LCAxCi0KLQlsZAkJWyVvMV0sICVvNAotCXNybAkJJW80LCAyNCwgJWcyCi0Jc3RiCQklZzIsIFslbzBdCi0Jc3JsCQklbzQsIDE2LCAlZzMKLQlzdGIJCSVnMywgWyVvMCArIDFdCi0Jc3JsCQklbzQsIDgsICVnMgotCXN0YgkJJWcyLCBbJW8wICsgMl0KLQlzdWIJCSVvMiwgNCwgJW8yCi0Jc3RiCQklbzQsIFslbzAgKyAzXQotCWFkZAkJJW8xLCA0LCAlbzEKLQlhZGQJCSVvMCwgNCwgJW8wCi0yOgotCWJlCQkzM2YKLQkgY21wCQklbzUsIDIKLQliZQkJMzJmCi0JIHN1YgkJJW8yLCA0LCAlbzIKLTMxOgotCWxkCQlbJW8xXSwgJWcyCi0JYWRkCQklbzEsIDQsICVvMQotCXNybAkJJWcyLCAyNCwgJWczCi0JYW5kCQklbzAsIDcsICVnNQotCXN0YgkJJWczLCBbJW8wXQotCWNtcAkJJWc1LCA3Ci0Jc2xsCQklZzIsIDgsICVnMQotCWFkZAkJJW8wLCA0LCAlbzAKLQliZQkJNDFmCi0JIGFuZAkJJW8yLCAweGZmZmZmZmMwLCAlbzMKLQlsZAkJWyVvMCAtIDddLCAlbzQKLTQ6Ci0JU01PVkVfQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MTAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCA4LCAyNCwgLTMpCi0JU01PVkVfQ0hVTksobzEsIG8wLCAweDMwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlzdWJjYwkJJW8zLCA2NCwgJW8zCi0JYWRkCQklbzEsIDY0LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0KLQlhbmRjYwkJJW8yLCAweDMwLCAlbzMKLQliZSxhCQkxZgotCSBzcmwJCSVnMSwgMTYsICVnMgotNDoKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCXN1YmNjCQklbzMsIDE2LCAlbzMKLQlhZGQJCSVvMSwgMTYsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDE2LCAlbzAKLQotCXNybAkJJWcxLCAxNiwgJWcyCi0xOgotCXN0CQklbzQsIFslbzAgLSA3XQotCXN0aAkJJWcyLCBbJW8wIC0gM10KLQlzcmwJCSVnMSwgOCwgJWc0Ci0JYgkJODhmCi0JIHN0YgkJJWc0LCBbJW8wIC0gMV0KLTMyOgotCWxkCQlbJW8xXSwgJWcyCi0JYWRkCQklbzEsIDQsICVvMQotCXNybAkJJWcyLCAxNiwgJWczCi0JYW5kCQklbzAsIDcsICVnNQotCXN0aAkJJWczLCBbJW8wXQotCWNtcAkJJWc1LCA2Ci0Jc2xsCQklZzIsIDE2LCAlZzEKLQlhZGQJCSVvMCwgNCwgJW8wCi0JYmUJCTQyZgotCSBhbmQJCSVvMiwgMHhmZmZmZmZjMCwgJW8zCi0JbGQJCVslbzAgLSA2XSwgJW80Ci00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDY0LCAlbzAKLQotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDE2LCAlbzMKLQlhZGQJCSVvMSwgMTYsICVvMQotCWJuZQkJNGIKLQkgYWRkCQklbzAsIDE2LCAlbzAKLQotCXNybAkJJWcxLCAxNiwgJWcyCi0xOgotCXN0CQklbzQsIFslbzAgLSA2XQotCWIJCTg4ZgotCSBzdGgJCSVnMiwgWyVvMCAtIDJdCi0zMzoKLQlsZAkJWyVvMV0sICVnMgotCXN1YgkJJW8yLCA0LCAlbzIKLQlzcmwJCSVnMiwgMjQsICVnMwotCWFuZAkJJW8wLCA3LCAlZzUKLQlzdGIJCSVnMywgWyVvMF0KLQljbXAJCSVnNSwgNQotCXNybAkJJWcyLCA4LCAlZzQKLQlzbGwJCSVnMiwgMjQsICVnMQotCXN0aAkJJWc0LCBbJW8wICsgMV0KLQlhZGQJCSVvMSwgNCwgJW8xCi0JYmUJCTQzZgotCSBhbmQJCSVvMiwgMHhmZmZmZmZjMCwgJW8zCi0KLQlsZAkJWyVvMCAtIDFdLCAlbzQKLQlhZGQJCSVvMCwgNCwgJW8wCi00OgotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgLTEpCi0JU01PVkVfQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDI0LCA4LCAtMSkKLQlTTU9WRV9DSFVOSyhvMSwgbzAsIDB4MjAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMjQsIDgsIC0xKQotCVNNT1ZFX0NIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgLTEpCi0Jc3ViY2MJCSVvMywgNjQsICVvMwotCWFkZAkJJW8xLCA2NCwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgNjQsICVvMAotCi0JYW5kY2MJCSVvMiwgMHgzMCwgJW8zCi0JYmUsYQkJMWYKLQkgc3JsCQklZzEsIDI0LCAlZzIKLTQ6Ci0JU01PVkVfQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDI0LCA4LCAtMSkKLQlzdWJjYwkJJW8zLCAxNiwgJW8zCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCAxNiwgJW8wCi0KLQlzcmwJCSVnMSwgMjQsICVnMgotMToKLQlzdAkJJW80LCBbJW8wIC0gNV0KLQliCQk4OGYKLQkgc3RiCQklZzIsIFslbzAgLSAxXQotNDE6Ci0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCA4LCAyNCwgLTMpCi0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MzAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgOCwgMjQsIC0zKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNDFiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0JIAotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDgsIDI0LCAtMykKLQlzdWJjYwkJJW8zLCAxNiwgJW8zCi0JYWRkCQklbzEsIDE2LCAlbzEKLQlibmUJCTRiCi0JIGFkZAkJJW8wLCAxNiwgJW8wCi0KLQlzcmwJCSVnMSwgMTYsICVnMgotMToKLQlzdGgJCSVnMiwgWyVvMCAtIDNdCi0Jc3JsCQklZzEsIDgsICVnNAotCWIJCTg4ZgotCSBzdGIJCSVnNCwgWyVvMCAtIDFdCi00MzoKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgxMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgyMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAyNCwgOCwgMykKLQlzdWJjYwkJJW8zLCA2NCwgJW8zCi0JYWRkCQklbzEsIDY0LCAlbzEKLQlibmUJCTQzYgotCSBhZGQJCSVvMCwgNjQsICVvMAotCi0JYW5kY2MJCSVvMiwgMHgzMCwgJW8zCi0JYmUsYQkJMWYKLQkgc3JsCQklZzEsIDI0LCAlZzIKLTQ6Ci0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MDAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMjQsIDgsIDMpCi0Jc3ViY2MJCSVvMywgMTYsICVvMwotCWFkZAkJJW8xLCAxNiwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgMTYsICVvMAotCi0Jc3JsCQklZzEsIDI0LCAlZzIKLTE6Ci0Jc3RiCQklZzIsIFslbzAgKyAzXQotCWIJCTg4ZgotCSBhZGQJCSVvMCwgNCwgJW8wCi00MjoKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgwMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDEwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDE2LCAxNiwgLTIpCi0JU01PVkVfQUxJR05DSFVOSyhvMSwgbzAsIDB4MjAsIGcyLCBnMywgZzQsIGc1LCBvNCwgbzUsIGc3LCBnMSwgMTYsIDE2LCAtMikKLQlTTU9WRV9BTElHTkNIVU5LKG8xLCBvMCwgMHgzMCwgZzIsIGczLCBnNCwgZzUsIG80LCBvNSwgZzcsIGcxLCAxNiwgMTYsIC0yKQotCXN1YmNjCQklbzMsIDY0LCAlbzMKLQlhZGQJCSVvMSwgNjQsICVvMQotCWJuZQkJNDJiCi0JIGFkZAkJJW8wLCA2NCwgJW8wCi0JIAotCWFuZGNjCQklbzIsIDB4MzAsICVvMwotCWJlLGEJCTFmCi0JIHNybAkJJWcxLCAxNiwgJWcyCi00OgotCVNNT1ZFX0FMSUdOQ0hVTksobzEsIG8wLCAweDAwLCBnMiwgZzMsIGc0LCBnNSwgbzQsIG81LCBnNywgZzEsIDE2LCAxNiwgLTIpCi0Jc3ViY2MJCSVvMywgMTYsICVvMwotCWFkZAkJJW8xLCAxNiwgJW8xCi0JYm5lCQk0YgotCSBhZGQJCSVvMCwgMTYsICVvMAotCi0Jc3JsCQklZzEsIDE2LCAlZzIKLTE6Ci0Jc3RoCQklZzIsIFslbzAgLSAyXQotCi0JLyogRmFsbCB0aHJvdWdoICovCi0JIAotI2VuZGlmIC8qIEZBU1RFUl9OT05BTElHTkVEICovCisJcmV0CisJIHJlc3RvcmUJJWc3LCAlZzAsICVvMAogCiA4ODoJLyogc2hvcnRfZW5kICovCiAKQEAgLTExMjcsNyArNTIxLDcgQEAKIAlzdGIJCSVnMiwgWyVvMF0KIDE6CiAJcmV0bAotIAkgUkVUTF9JTlNOCisJIG1vdgkJJWc3LCAlbzAKIAogOTA6CS8qIHNob3J0X2FsaWduZWRfZW5kICovCiAJYm5lCQk4OGIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYwppbmRleCBhYTFjMWIxLi44MDIzZmQ3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYwppbmRleCBlNjA2N2I3Li42Y2EzOWE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCmluZGV4IDNjYjAwZGYuLjliMzU3ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY182NC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2d1cC5jIGIvYXJjaC9zcGFyYy9tbS9ndXAuYwppbmRleCBhOTg2YjVkLi40MmM1NWRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2d1cC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZ3VwLmMKQEAgLTU2LDYgKzU2LDggQEAKIAkJCXB1dF9wYWdlKGhlYWQpOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJaWYgKGhlYWQgIT0gcGFnZSkKKwkJCWdldF9odWdlX3BhZ2VfdGFpbChwYWdlKTsKIAogCQlwYWdlc1sqbnJdID0gcGFnZTsKIAkJKCpucikrKzsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaGlnaG1lbS5jIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKaW5kZXggNDczMGVhYy4uNzcxNDBhMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBmNGU5NzY0Li4wN2UxNDUzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCkBAIC01LDcgKzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvS2J1aWxkIGIvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwZWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvS2J1aWxkCkBAIC0wLDAgKzEsMTcgQEAKK2hlYWRlci15ICs9IGFiaS5oCitoZWFkZXIteSArPSBjaGlwLmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZTY0LmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZWd4LmgKK2hlYWRlci15ICs9IGNoaXBfdGlsZXByby5oCitoZWFkZXIteSArPSBpY2FjaGUuaAoraGVhZGVyLXkgKz0gaW50ZXJydXB0cy5oCitoZWFkZXIteSArPSBpbnRlcnJ1cHRzXzMyLmgKK2hlYWRlci15ICs9IGludGVycnVwdHNfNjQuaAoraGVhZGVyLXkgKz0gb3Bjb2RlLmgKK2hlYWRlci15ICs9IG9wY29kZV90aWxlZ3guaAoraGVhZGVyLXkgKz0gb3Bjb2RlX3RpbGVwcm8uaAoraGVhZGVyLXkgKz0gc2ltLmgKK2hlYWRlci15ICs9IHNpbV9kZWYuaAoraGVhZGVyLXkgKz0gc3ByX2RlZi5oCitoZWFkZXIteSArPSBzcHJfZGVmXzMyLmgKK2hlYWRlci15ICs9IHNwcl9kZWZfNjQuaApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9hYmkuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvYWJpLmgKaW5kZXggOGFmZmM3Ni4uYzU1YTNkNCAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9hYmkuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL2FiaS5oCkBAIC0xNSwxMyArMTUsNzggQEAKIC8qKgogICogQGZpbGUKICAqCi0gKiBBQkktcmVsYXRlZCByZWdpc3RlciBkZWZpbml0aW9ucyBoZWxwZnVsIHdoZW4gd3JpdGluZyBhc3NlbWJseSBjb2RlLgorICogQUJJLXJlbGF0ZWQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCiAgKi8KIAogI2lmbmRlZiBfX0FSQ0hfQUJJX0hfXwotI2RlZmluZSBfX0FSQ0hfQUJJX0hfXwogCi0jaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjaWYgIWRlZmluZWQgX19uZWVkX2ludF9yZWdfdCAmJiAhZGVmaW5lZCBfX0RPWFlHRU5fXworIyBkZWZpbmUgX19BUkNIX0FCSV9IX18KKyMgaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjZW5kaWYKKworLyogUHJvdmlkZSB0aGUgYmFzaWMgbWFjaGluZSB0eXBlcy4gKi8KKyNpZm5kZWYgX19JTlRfUkVHX0JJVFMKKworLyoqIE51bWJlciBvZiBiaXRzIGluIGEgcmVnaXN0ZXIuICovCisjaWYgZGVmaW5lZCBfX3RpbGVneF9fCisjIGRlZmluZSBfX0lOVF9SRUdfQklUUyA2NAorI2VsaWYgZGVmaW5lZCBfX3RpbGVwcm9fXworIyBkZWZpbmUgX19JTlRfUkVHX0JJVFMgMzIKKyNlbGlmICFkZWZpbmVkIF9fbmVlZF9pbnRfcmVnX3QKKyMgaW5jbHVkZSA8YXJjaC9jaGlwLmg+CisjIGRlZmluZSBfX0lOVF9SRUdfQklUUyBDSElQX1dPUkRfU0laRSgpCisjZWxzZQorIyBlcnJvciBVbnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHdpdGggX19uZWVkX2ludF9yZWdfdAorI2VuZGlmCisKKyNpZiBfX0lOVF9SRUdfQklUUyA9PSA2NAorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdWludF9yZWdfdDsKKworLyoqIFNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgbG9uZyBsb25nIF9faW50X3JlZ190OworI2VuZGlmCisKKy8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCisjZGVmaW5lIF9fSU5UX1JFR19GTVQgImxsIgorCisjZWxzZQorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VpbnRfcmVnX3Q7CisKKy8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCit0eXBlZGVmIGxvbmcgX19pbnRfcmVnX3Q7CisjZW5kaWYKKworLyoqIFN0cmluZyBwcmVmaXggdG8gdXNlIGZvciBwcmludGYoKS4gKi8KKyNkZWZpbmUgX19JTlRfUkVHX0ZNVCAibCIKKworI2VuZGlmCisjZW5kaWYgLyogX19JTlRfUkVHX0JJVFMgKi8KKworCisjaWZuZGVmIF9fbmVlZF9pbnRfcmVnX3QKKworCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKy8qKiBVbnNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KK3R5cGVkZWYgX191aW50X3JlZ190IHVpbnRfcmVnX3Q7CisKKy8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCit0eXBlZGVmIF9faW50X3JlZ190IGludF9yZWdfdDsKKyNlbmRpZgorCisvKiogU3RyaW5nIHByZWZpeCB0byB1c2UgZm9yIHByaW50ZigpLiAqLworI2RlZmluZSBJTlRfUkVHX0ZNVCBfX0lOVF9SRUdfRk1UCisKKy8qKiBOdW1iZXIgb2YgYml0cyBpbiBhIHJlZ2lzdGVyLiAqLworI2RlZmluZSBJTlRfUkVHX0JJVFMgX19JTlRfUkVHX0JJVFMKKwogCiAvKiBSZWdpc3RlcnMgMCAtIDU1IGFyZSAibm9ybWFsIiwgYnV0IHNvbWUgcGVyZm9ybSBzcGVjaWFsIHJvbGVzLiAqLwogCkBAIC01OSw3ICsxMjQsNyBAQAogICogVGhlIEFCSSByZXF1aXJlcyBjYWxsZXJzIHRvIGFsbG9jYXRlIGEgY2FsbGVyIHN0YXRlIHNhdmUgYXJlYSBvZgogICogdGhpcyBtYW55IGJ5dGVzIGF0IHRoZSBib3R0b20gb2YgZWFjaCBzdGFjayBmcmFtZS4KICAqLwotI2RlZmluZSBDX0FCSV9TQVZFX0FSRUFfU0laRSAoMiAqIChDSElQX1dPUkRfU0laRSgpIC8gOCkpCisjZGVmaW5lIENfQUJJX1NBVkVfQVJFQV9TSVpFICgyICogKElOVF9SRUdfQklUUyAvIDgpKQogCiAvKioKICAqIFRoZSBvcGVyYW5kIHRvIGFuICdpbmZvJyBvcGNvZGUgZGlyZWN0aW5nIHRoZSBiYWNrdHJhY2VyIHRvIG5vdApAQCAtNjcsMzAgKzEzMiwxMCBAQAogICovCiAjZGVmaW5lIElORk9fT1BfQ0FOTk9UX0JBQ0tUUkFDRSAyCiAKLSNpZm5kZWYgX19BU1NFTUJMRVJfXwotI2lmIENISVBfV09SRF9TSVpFKCkgPiAzMgogCi0vKiogVW5zaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50X3JlZ190OworI2VuZGlmIC8qICFfX25lZWRfaW50X3JlZ190ICovCiAKLS8qKiBTaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIGxvbmcgbG9uZyBpbnRfcmVnX3Q7Ci0KLS8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCi0jZGVmaW5lIElOVF9SRUdfRk1UICJsbCIKLQotI2VsaWYgIWRlZmluZWQoX19MUDY0X18pICAgLyogYXZvaWQgY29uZnVzaW9uIHdpdGggTFA2NCBjcm9zcy1idWlsZCB0b29scyAqLwotCi0vKiogVW5zaWduZWQgdHlwZSB0aGF0IGNhbiBob2xkIGEgcmVnaXN0ZXIuICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludF9yZWdfdDsKLQotLyoqIFNpZ25lZCB0eXBlIHRoYXQgY2FuIGhvbGQgYSByZWdpc3Rlci4gKi8KLXR5cGVkZWYgbG9uZyBpbnRfcmVnX3Q7Ci0KLS8qKiBTdHJpbmcgcHJlZml4IHRvIHVzZSBmb3IgcHJpbnRmKCkuICovCi0jZGVmaW5lIElOVF9SRUdfRk1UICJsIgotCi0jZW5kaWYKLSNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCisvKiBNYWtlIHN1cmUgd2UgbGF0ZXIgY2FuIGdldCBhbGwgdGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMuICAqLworI3VuZGVmIF9fbmVlZF9pbnRfcmVnX3QKIAogI2VuZGlmIC8qICFfX0FSQ0hfQUJJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9vcGNvZGUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMTUyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWYgZGVmaW5lZChfX3RpbGVwcm9fXykKKyNpbmNsdWRlIDxhcmNoL29wY29kZV90aWxlcHJvLmg+CisjZWxpZiBkZWZpbmVkKF9fdGlsZWd4X18pCisjaW5jbHVkZSA8YXJjaC9vcGNvZGVfdGlsZWd4Lmg+CisjZWxzZQorI2Vycm9yIFVuZXhwZWN0ZWQgVGlsZXJhIGNoaXAgdHlwZQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL29wY29kZV90aWxlZ3guaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVneC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGQwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hcmNoL29wY29kZV90aWxlZ3guaApAQCAtMCwwICsxLDE0MDUgQEAKKy8qIFRJTEUtR3ggb3Bjb2RlIGluZm9ybWF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICoKKyAqCisgKgorICovCisKKyNpZm5kZWYgX19BUkNIX09QQ09ERV9IX18KKyNkZWZpbmUgX19BUkNIX09QQ09ERV9IX18KKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHRpbGVneF9idW5kbGVfYml0czsKKworLyogVGhlc2UgYXJlIHRoZSBiaXRzIHRoYXQgZGV0ZXJtaW5lIGlmIGEgYnVuZGxlIGlzIGluIHRoZSBYIGVuY29kaW5nLiAqLworI2RlZmluZSBUSUxFR1hfQlVORExFX01PREVfTUFTSyAoKHRpbGVneF9idW5kbGVfYml0cykzIDw8IDYyKQorCitlbnVtCit7CisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCisgIFRJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEUgPSAzLAorCisgIC8qIEhvdyBtYW55IGRpZmZlcmVudCBwaXBlbGluZSBlbmNvZGluZ3MgYXJlIHRoZXJlPyBYMCwgWDEsIFkwLCBZMSwgWTIuICovCisgIFRJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRUdYX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMgPSAzLAorCisgIC8qIEluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KKyAgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFR1hfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLiAqLworICBUSUxFR1hfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKKworICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KKyAgVElMRUdYX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQorICAgICgxIDw8IFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMpLAorCisgIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KKyAgVElMRUdYX05VTV9SRUdJU1RFUlMgPSA2NCwKK307CisKKy8qIE1ha2UgYSBmZXcgInRpbGVfIiB2YXJpYWJsZXMgdG8gc2ltcGxpZnkgY29tbW9uIGNvZGUgYmV0d2VlbgorICAgYXJjaGl0ZWN0dXJlcy4gICovCisKK3R5cGVkZWYgdGlsZWd4X2J1bmRsZV9iaXRzIHRpbGVfYnVuZGxlX2JpdHM7CisjZGVmaW5lIFRJTEVfQlVORExFX1NJWkVfSU5fQllURVMgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTCisjZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFR1hfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUworI2RlZmluZSBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBcCisgIFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMKKworLyogNjQtYml0IHBhdHRlcm4gZm9yIGEgeyBicHQgOyBub3AgfSBidW5kbGUuICovCisjZGVmaW5lIFRJTEVHWF9CUFRfQlVORExFIDB4Mjg2YTQ0YWU1MTQ4NTAwMFVMTAorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQkZFbmRfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQkZPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjQpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9CRlN0YXJ0X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyT2ZmX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMWZmYzApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQnJUeXBlX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU0KSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfSW1tOF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDAwMGMwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbTE2X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tMTZfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDIwKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTEpKSAmIDB4ZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tOF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tOF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9KdW1wT2ZmX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDdmZmZmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSnVtcE9wY29kZUV4dGVuc2lvbl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OCkpICYgMHgxKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01GX0ltbTE0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDNmZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTVRfSW1tMTRfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgwMDAwM2ZjMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9Nb2RlKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDYyKSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDI4KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU5KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDI3KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU4KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kyKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgobiA+PiAyNikpICYgMHgwMDAwMDAwMSkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDU2KSkgJiAweDAwMDAwMDAyKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4M2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kyKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDIwKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JEZXN0X1kyKHRpbGVneF9idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNCX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0JfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3NpZ25fZXh0ZW5kKGludCBuLCBpbnQgbnVtX2JpdHMpCit7CisgIGludCBzaGlmdCA9IChpbnQpKHNpemVvZihpbnQpICogOCAtIG51bV9iaXRzKTsKKyAgcmV0dXJuIChuIDw8IHNoaWZ0KSA+PiBzaGlmdDsKK30KKworCisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9CRkVuZF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQkZPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgMjQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQkZTdGFydF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfQnJPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAorICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAxZmZjMCkpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0JyVHlwZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDU0KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0Rlc3RfSW1tOF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8CisgICAgICAgICAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMGMwKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmZmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmZmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0ltbThPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDIwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0ltbThPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA1MSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGZmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0p1bXBPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4N2ZmZmZmZikpIDw8IDMxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX0p1bXBPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDU4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX01GX0ltbTE0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmZmYpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9NVF9JbW0xNF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8CisgICAgICAgICAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAzZmMwKSkgPDwgMzcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfTW9kZShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNjIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDcpIDw8IDI4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHg3KSkgPDwgNTkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGYpIDw8IDI3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfT3Bjb2RlX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDAwMDAwMDAxKSA8PCAyNikgfAorICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAwMikpIDw8IDU2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZmYpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmYpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MykgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfU2hBbXRfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfU2hBbXRfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZmYpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmZikpIDw8IDQ5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0FfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0FfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAyMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCRGVzdF9ZMihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDUxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCitjcmVhdGVfVW5hcnlPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cworY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCisKK2VudW0KK3sKKyAgQURESV9JTU04X09QQ09ERV9YMCA9IDEsCisgIEFERElfSU1NOF9PUENPREVfWDEgPSAxLAorICBBRERJX09QQ09ERV9ZMCA9IDAsCisgIEFERElfT1BDT0RFX1kxID0gMSwKKyAgQURETElfT1BDT0RFX1gwID0gMSwKKyAgQURETElfT1BDT0RFX1gxID0gMCwKKyAgQUREWElfSU1NOF9PUENPREVfWDAgPSAyLAorICBBRERYSV9JTU04X09QQ09ERV9YMSA9IDIsCisgIEFERFhJX09QQ09ERV9ZMCA9IDEsCisgIEFERFhJX09QQ09ERV9ZMSA9IDIsCisgIEFERFhMSV9PUENPREVfWDAgPSAyLAorICBBRERYTElfT1BDT0RFX1gxID0gMSwKKyAgQUREWFNDX1JSUl8wX09QQ09ERV9YMCA9IDEsCisgIEFERFhTQ19SUlJfMF9PUENPREVfWDEgPSAxLAorICBBRERYX1JSUl8wX09QQ09ERV9YMCA9IDIsCisgIEFERFhfUlJSXzBfT1BDT0RFX1gxID0gMiwKKyAgQUREWF9SUlJfMF9PUENPREVfWTAgPSAwLAorICBBRERYX1NQRUNJQUxfMF9PUENPREVfWTEgPSAwLAorICBBRERfUlJSXzBfT1BDT0RFX1gwID0gMywKKyAgQUREX1JSUl8wX09QQ09ERV9YMSA9IDMsCisgIEFERF9SUlJfMF9PUENPREVfWTAgPSAxLAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCisgIEFORElfSU1NOF9PUENPREVfWDAgPSAzLAorICBBTkRJX0lNTThfT1BDT0RFX1gxID0gMywKKyAgQU5ESV9PUENPREVfWTAgPSAyLAorICBBTkRJX09QQ09ERV9ZMSA9IDMsCisgIEFORF9SUlJfMF9PUENPREVfWDAgPSA0LAorICBBTkRfUlJSXzBfT1BDT0RFX1gxID0gNCwKKyAgQU5EX1JSUl81X09QQ09ERV9ZMCA9IDAsCisgIEFORF9SUlJfNV9PUENPREVfWTEgPSAwLAorICBCRVFaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTYsCisgIEJFUVpfQlJBTkNIX09QQ09ERV9YMSA9IDE3LAorICBCRkVYVFNfQkZfT1BDT0RFX1gwID0gNCwKKyAgQkZFWFRVX0JGX09QQ09ERV9YMCA9IDUsCisgIEJGSU5TX0JGX09QQ09ERV9YMCA9IDYsCisgIEJGX09QQ09ERV9YMCA9IDMsCisgIEJHRVpUX0JSQU5DSF9PUENPREVfWDEgPSAxOCwKKyAgQkdFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMTksCisgIEJHVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyMCwKKyAgQkdUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjEsCisgIEJMQkNUX0JSQU5DSF9PUENPREVfWDEgPSAyMiwKKyAgQkxCQ19CUkFOQ0hfT1BDT0RFX1gxID0gMjMsCisgIEJMQlNUX0JSQU5DSF9PUENPREVfWDEgPSAyNCwKKyAgQkxCU19CUkFOQ0hfT1BDT0RFX1gxID0gMjUsCisgIEJMRVpUX0JSQU5DSF9PUENPREVfWDEgPSAyNiwKKyAgQkxFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjcsCisgIEJMVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyOCwKKyAgQkxUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjksCisgIEJORVpUX0JSQU5DSF9PUENPREVfWDEgPSAzMCwKKyAgQk5FWl9CUkFOQ0hfT1BDT0RFX1gxID0gMzEsCisgIEJSQU5DSF9PUENPREVfWDEgPSAyLAorICBDTU9WRVFaX1JSUl8wX09QQ09ERV9YMCA9IDUsCisgIENNT1ZFUVpfUlJSXzRfT1BDT0RFX1kwID0gMCwKKyAgQ01PVk5FWl9SUlJfMF9PUENPREVfWDAgPSA2LAorICBDTU9WTkVaX1JSUl80X09QQ09ERV9ZMCA9IDEsCisgIENNUEVRSV9JTU04X09QQ09ERV9YMCA9IDQsCisgIENNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQsCisgIENNUEVRSV9PUENPREVfWTAgPSAzLAorICBDTVBFUUlfT1BDT0RFX1kxID0gNCwKKyAgQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gNywKKyAgQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNSwKKyAgQ01QRVFfUlJSXzNfT1BDT0RFX1kwID0gMCwKKyAgQ01QRVFfUlJSXzNfT1BDT0RFX1kxID0gMiwKKyAgQ01QRVhDSDRfUlJSXzBfT1BDT0RFX1gxID0gNiwKKyAgQ01QRVhDSF9SUlJfMF9PUENPREVfWDEgPSA3LAorICBDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gOCwKKyAgQ01QTEVTX1JSUl8wX09QQ09ERV9YMSA9IDgsCisgIENNUExFU19SUlJfMl9PUENPREVfWTAgPSAwLAorICBDTVBMRVNfUlJSXzJfT1BDT0RFX1kxID0gMCwKKyAgQ01QTEVVX1JSUl8wX09QQ09ERV9YMCA9IDksCisgIENNUExFVV9SUlJfMF9PUENPREVfWDEgPSA5LAorICBDTVBMRVVfUlJSXzJfT1BDT0RFX1kwID0gMSwKKyAgQ01QTEVVX1JSUl8yX09QQ09ERV9ZMSA9IDEsCisgIENNUExUU0lfSU1NOF9PUENPREVfWDAgPSA1LAorICBDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gNSwKKyAgQ01QTFRTSV9PUENPREVfWTAgPSA0LAorICBDTVBMVFNJX09QQ09ERV9ZMSA9IDUsCisgIENNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMCwKKyAgQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDEwLAorICBDTVBMVFNfUlJSXzJfT1BDT0RFX1kwID0gMiwKKyAgQ01QTFRTX1JSUl8yX09QQ09ERV9ZMSA9IDIsCisgIENNUExUVUlfSU1NOF9PUENPREVfWDAgPSA2LAorICBDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNiwKKyAgQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDExLAorICBDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gMTEsCisgIENNUExUVV9SUlJfMl9PUENPREVfWTAgPSAzLAorICBDTVBMVFVfUlJSXzJfT1BDT0RFX1kxID0gMywKKyAgQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTIsCisgIENNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDEyLAorICBDTVBORV9SUlJfM19PUENPREVfWTAgPSAxLAorICBDTVBORV9SUlJfM19PUENPREVfWTEgPSAzLAorICBDTVVMQUZfUlJSXzBfT1BDT0RFX1gwID0gMTMsCisgIENNVUxBX1JSUl8wX09QQ09ERV9YMCA9IDE0LAorICBDTVVMRlJfUlJSXzBfT1BDT0RFX1gwID0gMTUsCisgIENNVUxGX1JSUl8wX09QQ09ERV9YMCA9IDE2LAorICBDTVVMSFJfUlJSXzBfT1BDT0RFX1gwID0gMTcsCisgIENNVUxIX1JSUl8wX09QQ09ERV9YMCA9IDE4LAorICBDTVVMX1JSUl8wX09QQ09ERV9YMCA9IDE5LAorICBDTlRMWl9VTkFSWV9PUENPREVfWDAgPSAxLAorICBDTlRMWl9VTkFSWV9PUENPREVfWTAgPSAxLAorICBDTlRUWl9VTkFSWV9PUENPREVfWDAgPSAyLAorICBDTlRUWl9VTkFSWV9PUENPREVfWTAgPSAyLAorICBDUkMzMl8zMl9SUlJfMF9PUENPREVfWDAgPSAyMCwKKyAgQ1JDMzJfOF9SUlJfMF9PUENPREVfWDAgPSAyMSwKKyAgREJMQUxJR04yX1JSUl8wX09QQ09ERV9YMCA9IDIyLAorICBEQkxBTElHTjJfUlJSXzBfT1BDT0RFX1gxID0gMTMsCisgIERCTEFMSUdONF9SUlJfMF9PUENPREVfWDAgPSAyMywKKyAgREJMQUxJR040X1JSUl8wX09QQ09ERV9YMSA9IDE0LAorICBEQkxBTElHTjZfUlJSXzBfT1BDT0RFX1gwID0gMjQsCisgIERCTEFMSUdONl9SUlJfMF9PUENPREVfWDEgPSAxNSwKKyAgREJMQUxJR05fUlJSXzBfT1BDT0RFX1gwID0gMjUsCisgIERSQUlOX1VOQVJZX09QQ09ERV9YMSA9IDEsCisgIERUTEJQUl9VTkFSWV9PUENPREVfWDEgPSAyLAorICBFWENINF9SUlJfMF9PUENPREVfWDEgPSAxNiwKKyAgRVhDSF9SUlJfMF9PUENPREVfWDEgPSAxNywKKyAgRkRPVUJMRV9BRERTVUJfUlJSXzBfT1BDT0RFX1gwID0gMjYsCisgIEZET1VCTEVfQUREX0ZMQUdTX1JSUl8wX09QQ09ERV9YMCA9IDI3LAorICBGRE9VQkxFX01VTF9GTEFHU19SUlJfMF9PUENPREVfWDAgPSAyOCwKKyAgRkRPVUJMRV9QQUNLMV9SUlJfMF9PUENPREVfWDAgPSAyOSwKKyAgRkRPVUJMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzMCwKKyAgRkRPVUJMRV9TVUJfRkxBR1NfUlJSXzBfT1BDT0RFX1gwID0gMzEsCisgIEZET1VCTEVfVU5QQUNLX01BWF9SUlJfMF9PUENPREVfWDAgPSAzMiwKKyAgRkRPVUJMRV9VTlBBQ0tfTUlOX1JSUl8wX09QQ09ERV9YMCA9IDMzLAorICBGRVRDSEFERDRfUlJSXzBfT1BDT0RFX1gxID0gMTgsCisgIEZFVENIQURER0VaNF9SUlJfMF9PUENPREVfWDEgPSAxOSwKKyAgRkVUQ0hBRERHRVpfUlJSXzBfT1BDT0RFX1gxID0gMjAsCisgIEZFVENIQUREX1JSUl8wX09QQ09ERV9YMSA9IDIxLAorICBGRVRDSEFORDRfUlJSXzBfT1BDT0RFX1gxID0gMjIsCisgIEZFVENIQU5EX1JSUl8wX09QQ09ERV9YMSA9IDIzLAorICBGRVRDSE9SNF9SUlJfMF9PUENPREVfWDEgPSAyNCwKKyAgRkVUQ0hPUl9SUlJfMF9PUENPREVfWDEgPSAyNSwKKyAgRklOVl9VTkFSWV9PUENPREVfWDEgPSAzLAorICBGTFVTSFdCX1VOQVJZX09QQ09ERV9YMSA9IDQsCisgIEZMVVNIX1VOQVJZX09QQ09ERV9YMSA9IDUsCisgIEZOT1BfVU5BUllfT1BDT0RFX1gwID0gMywKKyAgRk5PUF9VTkFSWV9PUENPREVfWDEgPSA2LAorICBGTk9QX1VOQVJZX09QQ09ERV9ZMCA9IDMsCisgIEZOT1BfVU5BUllfT1BDT0RFX1kxID0gOCwKKyAgRlNJTkdMRV9BREQxX1JSUl8wX09QQ09ERV9YMCA9IDM0LAorICBGU0lOR0xFX0FERFNVQjJfUlJSXzBfT1BDT0RFX1gwID0gMzUsCisgIEZTSU5HTEVfTVVMMV9SUlJfMF9PUENPREVfWDAgPSAzNiwKKyAgRlNJTkdMRV9NVUwyX1JSUl8wX09QQ09ERV9YMCA9IDM3LAorICBGU0lOR0xFX1BBQ0sxX1VOQVJZX09QQ09ERV9YMCA9IDQsCisgIEZTSU5HTEVfUEFDSzFfVU5BUllfT1BDT0RFX1kwID0gNCwKKyAgRlNJTkdMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzOCwKKyAgRlNJTkdMRV9TVUIxX1JSUl8wX09QQ09ERV9YMCA9IDM5LAorICBJQ09IX1VOQVJZX09QQ09ERV9YMSA9IDcsCisgIElMTF9VTkFSWV9PUENPREVfWDEgPSA4LAorICBJTExfVU5BUllfT1BDT0RFX1kxID0gOSwKKyAgSU1NOF9PUENPREVfWDAgPSA0LAorICBJTU04X09QQ09ERV9YMSA9IDMsCisgIElOVl9VTkFSWV9PUENPREVfWDEgPSA5LAorICBJUkVUX1VOQVJZX09QQ09ERV9YMSA9IDEwLAorICBKQUxSUF9VTkFSWV9PUENPREVfWDEgPSAxMSwKKyAgSkFMUlBfVU5BUllfT1BDT0RFX1kxID0gMTAsCisgIEpBTFJfVU5BUllfT1BDT0RFX1gxID0gMTIsCisgIEpBTFJfVU5BUllfT1BDT0RFX1kxID0gMTEsCisgIEpBTF9KVU1QX09QQ09ERV9YMSA9IDAsCisgIEpSUF9VTkFSWV9PUENPREVfWDEgPSAxMywKKyAgSlJQX1VOQVJZX09QQ09ERV9ZMSA9IDEyLAorICBKUl9VTkFSWV9PUENPREVfWDEgPSAxNCwKKyAgSlJfVU5BUllfT1BDT0RFX1kxID0gMTMsCisgIEpVTVBfT1BDT0RFX1gxID0gNCwKKyAgSl9KVU1QX09QQ09ERV9YMSA9IDEsCisgIExEMVNfQUREX0lNTThfT1BDT0RFX1gxID0gNywKKyAgTEQxU19PUENPREVfWTIgPSAwLAorICBMRDFTX1VOQVJZX09QQ09ERV9YMSA9IDE1LAorICBMRDFVX0FERF9JTU04X09QQ09ERV9YMSA9IDgsCisgIExEMVVfT1BDT0RFX1kyID0gMSwKKyAgTEQxVV9VTkFSWV9PUENPREVfWDEgPSAxNiwKKyAgTEQyU19BRERfSU1NOF9PUENPREVfWDEgPSA5LAorICBMRDJTX09QQ09ERV9ZMiA9IDIsCisgIExEMlNfVU5BUllfT1BDT0RFX1gxID0gMTcsCisgIExEMlVfQUREX0lNTThfT1BDT0RFX1gxID0gMTAsCisgIExEMlVfT1BDT0RFX1kyID0gMywKKyAgTEQyVV9VTkFSWV9PUENPREVfWDEgPSAxOCwKKyAgTEQ0U19BRERfSU1NOF9PUENPREVfWDEgPSAxMSwKKyAgTEQ0U19PUENPREVfWTIgPSAxLAorICBMRDRTX1VOQVJZX09QQ09ERV9YMSA9IDE5LAorICBMRDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDEyLAorICBMRDRVX09QQ09ERV9ZMiA9IDIsCisgIExENFVfVU5BUllfT1BDT0RFX1gxID0gMjAsCisgIExETkFfVU5BUllfT1BDT0RFX1gxID0gMjEsCisgIExETlQxU19BRERfSU1NOF9PUENPREVfWDEgPSAxMywKKyAgTEROVDFTX1VOQVJZX09QQ09ERV9YMSA9IDIyLAorICBMRE5UMVVfQUREX0lNTThfT1BDT0RFX1gxID0gMTQsCisgIExETlQxVV9VTkFSWV9PUENPREVfWDEgPSAyMywKKyAgTEROVDJTX0FERF9JTU04X09QQ09ERV9YMSA9IDE1LAorICBMRE5UMlNfVU5BUllfT1BDT0RFX1gxID0gMjQsCisgIExETlQyVV9BRERfSU1NOF9PUENPREVfWDEgPSAxNiwKKyAgTEROVDJVX1VOQVJZX09QQ09ERV9YMSA9IDI1LAorICBMRE5UNFNfQUREX0lNTThfT1BDT0RFX1gxID0gMTcsCisgIExETlQ0U19VTkFSWV9PUENPREVfWDEgPSAyNiwKKyAgTEROVDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDE4LAorICBMRE5UNFVfVU5BUllfT1BDT0RFX1gxID0gMjcsCisgIExETlRfQUREX0lNTThfT1BDT0RFX1gxID0gMTksCisgIExETlRfVU5BUllfT1BDT0RFX1gxID0gMjgsCisgIExEX0FERF9JTU04X09QQ09ERV9YMSA9IDIwLAorICBMRF9PUENPREVfWTIgPSAzLAorICBMRF9VTkFSWV9PUENPREVfWDEgPSAyOSwKKyAgTE5LX1VOQVJZX09QQ09ERV9YMSA9IDMwLAorICBMTktfVU5BUllfT1BDT0RFX1kxID0gMTQsCisgIExXTkFfQUREX0lNTThfT1BDT0RFX1gxID0gMjEsCisgIE1GU1BSX0lNTThfT1BDT0RFX1gxID0gMjIsCisgIE1GX1VOQVJZX09QQ09ERV9YMSA9IDMxLAorICBNTV9CRl9PUENPREVfWDAgPSA3LAorICBNTlpfUlJSXzBfT1BDT0RFX1gwID0gNDAsCisgIE1OWl9SUlJfMF9PUENPREVfWDEgPSAyNiwKKyAgTU5aX1JSUl80X09QQ09ERV9ZMCA9IDIsCisgIE1OWl9SUlJfNF9PUENPREVfWTEgPSAyLAorICBNT0RFX09QQ09ERV9ZQTIgPSAxLAorICBNT0RFX09QQ09ERV9ZQjIgPSAyLAorICBNT0RFX09QQ09ERV9ZQzIgPSAzLAorICBNVFNQUl9JTU04X09QQ09ERV9YMSA9IDIzLAorICBNVUxBWF9SUlJfMF9PUENPREVfWDAgPSA0MSwKKyAgTVVMQVhfUlJSXzNfT1BDT0RFX1kwID0gMiwKKyAgTVVMQV9IU19IU19SUlJfMF9PUENPREVfWDAgPSA0MiwKKyAgTVVMQV9IU19IU19SUlJfOV9PUENPREVfWTAgPSAwLAorICBNVUxBX0hTX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQzLAorICBNVUxBX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDQ0LAorICBNVUxBX0hTX0xVX1JSUl8wX09QQ09ERV9YMCA9IDQ1LAorICBNVUxBX0hVX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQ2LAorICBNVUxBX0hVX0hVX1JSUl85X09QQ09ERV9ZMCA9IDEsCisgIE1VTEFfSFVfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDcsCisgIE1VTEFfSFVfTFVfUlJSXzBfT1BDT0RFX1gwID0gNDgsCisgIE1VTEFfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDksCisgIE1VTEFfTFNfTFNfUlJSXzlfT1BDT0RFX1kwID0gMiwKKyAgTVVMQV9MU19MVV9SUlJfMF9PUENPREVfWDAgPSA1MCwKKyAgTVVMQV9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA1MSwKKyAgTVVMQV9MVV9MVV9SUlJfOV9PUENPREVfWTAgPSAzLAorICBNVUxYX1JSUl8wX09QQ09ERV9YMCA9IDUyLAorICBNVUxYX1JSUl8zX09QQ09ERV9ZMCA9IDMsCisgIE1VTF9IU19IU19SUlJfMF9PUENPREVfWDAgPSA1MywKKyAgTVVMX0hTX0hTX1JSUl84X09QQ09ERV9ZMCA9IDAsCisgIE1VTF9IU19IVV9SUlJfMF9PUENPREVfWDAgPSA1NCwKKyAgTVVMX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDU1LAorICBNVUxfSFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNTYsCisgIE1VTF9IVV9IVV9SUlJfMF9PUENPREVfWDAgPSA1NywKKyAgTVVMX0hVX0hVX1JSUl84X09QQ09ERV9ZMCA9IDEsCisgIE1VTF9IVV9MU19SUlJfMF9PUENPREVfWDAgPSA1OCwKKyAgTVVMX0hVX0xVX1JSUl8wX09QQ09ERV9YMCA9IDU5LAorICBNVUxfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNjAsCisgIE1VTF9MU19MU19SUlJfOF9PUENPREVfWTAgPSAyLAorICBNVUxfTFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNjEsCisgIE1VTF9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA2MiwKKyAgTVVMX0xVX0xVX1JSUl84X09QQ09ERV9ZMCA9IDMsCisgIE1aX1JSUl8wX09QQ09ERV9YMCA9IDYzLAorICBNWl9SUlJfMF9PUENPREVfWDEgPSAyNywKKyAgTVpfUlJSXzRfT1BDT0RFX1kwID0gMywKKyAgTVpfUlJSXzRfT1BDT0RFX1kxID0gMywKKyAgTkFQX1VOQVJZX09QQ09ERV9YMSA9IDMyLAorICBOT1BfVU5BUllfT1BDT0RFX1gwID0gNSwKKyAgTk9QX1VOQVJZX09QQ09ERV9YMSA9IDMzLAorICBOT1BfVU5BUllfT1BDT0RFX1kwID0gNSwKKyAgTk9QX1VOQVJZX09QQ09ERV9ZMSA9IDE1LAorICBOT1JfUlJSXzBfT1BDT0RFX1gwID0gNjQsCisgIE5PUl9SUlJfMF9PUENPREVfWDEgPSAyOCwKKyAgTk9SX1JSUl81X09QQ09ERV9ZMCA9IDEsCisgIE5PUl9SUlJfNV9PUENPREVfWTEgPSAxLAorICBPUklfSU1NOF9PUENPREVfWDAgPSA3LAorICBPUklfSU1NOF9PUENPREVfWDEgPSAyNCwKKyAgT1JfUlJSXzBfT1BDT0RFX1gwID0gNjUsCisgIE9SX1JSUl8wX09QQ09ERV9YMSA9IDI5LAorICBPUl9SUlJfNV9PUENPREVfWTAgPSAyLAorICBPUl9SUlJfNV9PUENPREVfWTEgPSAyLAorICBQQ05UX1VOQVJZX09QQ09ERV9YMCA9IDYsCisgIFBDTlRfVU5BUllfT1BDT0RFX1kwID0gNiwKKyAgUkVWQklUU19VTkFSWV9PUENPREVfWDAgPSA3LAorICBSRVZCSVRTX1VOQVJZX09QQ09ERV9ZMCA9IDcsCisgIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9YMCA9IDgsCisgIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9ZMCA9IDgsCisgIFJPVExJX1NISUZUX09QQ09ERV9YMCA9IDEsCisgIFJPVExJX1NISUZUX09QQ09ERV9YMSA9IDEsCisgIFJPVExJX1NISUZUX09QQ09ERV9ZMCA9IDAsCisgIFJPVExJX1NISUZUX09QQ09ERV9ZMSA9IDAsCisgIFJPVExfUlJSXzBfT1BDT0RFX1gwID0gNjYsCisgIFJPVExfUlJSXzBfT1BDT0RFX1gxID0gMzAsCisgIFJPVExfUlJSXzZfT1BDT0RFX1kwID0gMCwKKyAgUk9UTF9SUlJfNl9PUENPREVfWTEgPSAwLAorICBSUlJfMF9PUENPREVfWDAgPSA1LAorICBSUlJfMF9PUENPREVfWDEgPSA1LAorICBSUlJfMF9PUENPREVfWTAgPSA1LAorICBSUlJfMF9PUENPREVfWTEgPSA2LAorICBSUlJfMV9PUENPREVfWTAgPSA2LAorICBSUlJfMV9PUENPREVfWTEgPSA3LAorICBSUlJfMl9PUENPREVfWTAgPSA3LAorICBSUlJfMl9PUENPREVfWTEgPSA4LAorICBSUlJfM19PUENPREVfWTAgPSA4LAorICBSUlJfM19PUENPREVfWTEgPSA5LAorICBSUlJfNF9PUENPREVfWTAgPSA5LAorICBSUlJfNF9PUENPREVfWTEgPSAxMCwKKyAgUlJSXzVfT1BDT0RFX1kwID0gMTAsCisgIFJSUl81X09QQ09ERV9ZMSA9IDExLAorICBSUlJfNl9PUENPREVfWTAgPSAxMSwKKyAgUlJSXzZfT1BDT0RFX1kxID0gMTIsCisgIFJSUl83X09QQ09ERV9ZMCA9IDEyLAorICBSUlJfN19PUENPREVfWTEgPSAxMywKKyAgUlJSXzhfT1BDT0RFX1kwID0gMTMsCisgIFJSUl85X09QQ09ERV9ZMCA9IDE0LAorICBTSElGVF9PUENPREVfWDAgPSA2LAorICBTSElGVF9PUENPREVfWDEgPSA2LAorICBTSElGVF9PUENPREVfWTAgPSAxNSwKKyAgU0hJRlRfT1BDT0RFX1kxID0gMTQsCisgIFNITDE2SU5TTElfT1BDT0RFX1gwID0gNywKKyAgU0hMMTZJTlNMSV9PUENPREVfWDEgPSA3LAorICBTSEwxQUREWF9SUlJfMF9PUENPREVfWDAgPSA2NywKKyAgU0hMMUFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzEsCisgIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMCA9IDEsCisgIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMSA9IDEsCisgIFNITDFBRERfUlJSXzBfT1BDT0RFX1gwID0gNjgsCisgIFNITDFBRERfUlJSXzBfT1BDT0RFX1gxID0gMzIsCisgIFNITDFBRERfUlJSXzFfT1BDT0RFX1kwID0gMCwKKyAgU0hMMUFERF9SUlJfMV9PUENPREVfWTEgPSAwLAorICBTSEwyQUREWF9SUlJfMF9PUENPREVfWDAgPSA2OSwKKyAgU0hMMkFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzMsCisgIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMCA9IDIsCisgIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMSA9IDIsCisgIFNITDJBRERfUlJSXzBfT1BDT0RFX1gwID0gNzAsCisgIFNITDJBRERfUlJSXzBfT1BDT0RFX1gxID0gMzQsCisgIFNITDJBRERfUlJSXzFfT1BDT0RFX1kwID0gMSwKKyAgU0hMMkFERF9SUlJfMV9PUENPREVfWTEgPSAxLAorICBTSEwzQUREWF9SUlJfMF9PUENPREVfWDAgPSA3MSwKKyAgU0hMM0FERFhfUlJSXzBfT1BDT0RFX1gxID0gMzUsCisgIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMCA9IDMsCisgIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMSA9IDMsCisgIFNITDNBRERfUlJSXzBfT1BDT0RFX1gwID0gNzIsCisgIFNITDNBRERfUlJSXzBfT1BDT0RFX1gxID0gMzYsCisgIFNITDNBRERfUlJSXzFfT1BDT0RFX1kwID0gMiwKKyAgU0hMM0FERF9SUlJfMV9PUENPREVfWTEgPSAyLAorICBTSExJX1NISUZUX09QQ09ERV9YMCA9IDIsCisgIFNITElfU0hJRlRfT1BDT0RFX1gxID0gMiwKKyAgU0hMSV9TSElGVF9PUENPREVfWTAgPSAxLAorICBTSExJX1NISUZUX09QQ09ERV9ZMSA9IDEsCisgIFNITFhJX1NISUZUX09QQ09ERV9YMCA9IDMsCisgIFNITFhJX1NISUZUX09QQ09ERV9YMSA9IDMsCisgIFNITFhfUlJSXzBfT1BDT0RFX1gwID0gNzMsCisgIFNITFhfUlJSXzBfT1BDT0RFX1gxID0gMzcsCisgIFNITF9SUlJfMF9PUENPREVfWDAgPSA3NCwKKyAgU0hMX1JSUl8wX09QQ09ERV9YMSA9IDM4LAorICBTSExfUlJSXzZfT1BDT0RFX1kwID0gMSwKKyAgU0hMX1JSUl82X09QQ09ERV9ZMSA9IDEsCisgIFNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDQsCisgIFNIUlNJX1NISUZUX09QQ09ERV9YMSA9IDQsCisgIFNIUlNJX1NISUZUX09QQ09ERV9ZMCA9IDIsCisgIFNIUlNJX1NISUZUX09QQ09ERV9ZMSA9IDIsCisgIFNIUlNfUlJSXzBfT1BDT0RFX1gwID0gNzUsCisgIFNIUlNfUlJSXzBfT1BDT0RFX1gxID0gMzksCisgIFNIUlNfUlJSXzZfT1BDT0RFX1kwID0gMiwKKyAgU0hSU19SUlJfNl9PUENPREVfWTEgPSAyLAorICBTSFJVSV9TSElGVF9PUENPREVfWDAgPSA1LAorICBTSFJVSV9TSElGVF9PUENPREVfWDEgPSA1LAorICBTSFJVSV9TSElGVF9PUENPREVfWTAgPSAzLAorICBTSFJVSV9TSElGVF9PUENPREVfWTEgPSAzLAorICBTSFJVWElfU0hJRlRfT1BDT0RFX1gwID0gNiwKKyAgU0hSVVhJX1NISUZUX09QQ09ERV9YMSA9IDYsCisgIFNIUlVYX1JSUl8wX09QQ09ERV9YMCA9IDc2LAorICBTSFJVWF9SUlJfMF9PUENPREVfWDEgPSA0MCwKKyAgU0hSVV9SUlJfMF9PUENPREVfWDAgPSA3NywKKyAgU0hSVV9SUlJfMF9PUENPREVfWDEgPSA0MSwKKyAgU0hSVV9SUlJfNl9PUENPREVfWTAgPSAzLAorICBTSFJVX1JSUl82X09QQ09ERV9ZMSA9IDMsCisgIFNIVUZGTEVCWVRFU19SUlJfMF9PUENPREVfWDAgPSA3OCwKKyAgU1QxX0FERF9JTU04X09QQ09ERV9YMSA9IDI1LAorICBTVDFfT1BDT0RFX1kyID0gMCwKKyAgU1QxX1JSUl8wX09QQ09ERV9YMSA9IDQyLAorICBTVDJfQUREX0lNTThfT1BDT0RFX1gxID0gMjYsCisgIFNUMl9PUENPREVfWTIgPSAxLAorICBTVDJfUlJSXzBfT1BDT0RFX1gxID0gNDMsCisgIFNUNF9BRERfSU1NOF9PUENPREVfWDEgPSAyNywKKyAgU1Q0X09QQ09ERV9ZMiA9IDIsCisgIFNUNF9SUlJfMF9PUENPREVfWDEgPSA0NCwKKyAgU1ROVDFfQUREX0lNTThfT1BDT0RFX1gxID0gMjgsCisgIFNUTlQxX1JSUl8wX09QQ09ERV9YMSA9IDQ1LAorICBTVE5UMl9BRERfSU1NOF9PUENPREVfWDEgPSAyOSwKKyAgU1ROVDJfUlJSXzBfT1BDT0RFX1gxID0gNDYsCisgIFNUTlQ0X0FERF9JTU04X09QQ09ERV9YMSA9IDMwLAorICBTVE5UNF9SUlJfMF9PUENPREVfWDEgPSA0NywKKyAgU1ROVF9BRERfSU1NOF9PUENPREVfWDEgPSAzMSwKKyAgU1ROVF9SUlJfMF9PUENPREVfWDEgPSA0OCwKKyAgU1RfQUREX0lNTThfT1BDT0RFX1gxID0gMzIsCisgIFNUX09QQ09ERV9ZMiA9IDMsCisgIFNUX1JSUl8wX09QQ09ERV9YMSA9IDQ5LAorICBTVUJYU0NfUlJSXzBfT1BDT0RFX1gwID0gNzksCisgIFNVQlhTQ19SUlJfMF9PUENPREVfWDEgPSA1MCwKKyAgU1VCWF9SUlJfMF9PUENPREVfWDAgPSA4MCwKKyAgU1VCWF9SUlJfMF9PUENPREVfWDEgPSA1MSwKKyAgU1VCWF9SUlJfMF9PUENPREVfWTAgPSAyLAorICBTVUJYX1JSUl8wX09QQ09ERV9ZMSA9IDIsCisgIFNVQl9SUlJfMF9PUENPREVfWDAgPSA4MSwKKyAgU1VCX1JSUl8wX09QQ09ERV9YMSA9IDUyLAorICBTVUJfUlJSXzBfT1BDT0RFX1kwID0gMywKKyAgU1VCX1JSUl8wX09QQ09ERV9ZMSA9IDMsCisgIFNXSU5UMF9VTkFSWV9PUENPREVfWDEgPSAzNCwKKyAgU1dJTlQxX1VOQVJZX09QQ09ERV9YMSA9IDM1LAorICBTV0lOVDJfVU5BUllfT1BDT0RFX1gxID0gMzYsCisgIFNXSU5UM19VTkFSWV9PUENPREVfWDEgPSAzNywKKyAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1gwID0gOSwKKyAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1kwID0gOSwKKyAgVEJMSURYQjFfVU5BUllfT1BDT0RFX1gwID0gMTAsCisgIFRCTElEWEIxX1VOQVJZX09QQ09ERV9ZMCA9IDEwLAorICBUQkxJRFhCMl9VTkFSWV9PUENPREVfWDAgPSAxMSwKKyAgVEJMSURYQjJfVU5BUllfT1BDT0RFX1kwID0gMTEsCisgIFRCTElEWEIzX1VOQVJZX09QQ09ERV9YMCA9IDEyLAorICBUQkxJRFhCM19VTkFSWV9PUENPREVfWTAgPSAxMiwKKyAgVU5BUllfUlJSXzBfT1BDT0RFX1gwID0gODIsCisgIFVOQVJZX1JSUl8wX09QQ09ERV9YMSA9IDUzLAorICBVTkFSWV9SUlJfMV9PUENPREVfWTAgPSAzLAorICBVTkFSWV9SUlJfMV9PUENPREVfWTEgPSAzLAorICBWMUFERElfSU1NOF9PUENPREVfWDAgPSA4LAorICBWMUFERElfSU1NOF9PUENPREVfWDEgPSAzMywKKyAgVjFBRERVQ19SUlJfMF9PUENPREVfWDAgPSA4MywKKyAgVjFBRERVQ19SUlJfMF9PUENPREVfWDEgPSA1NCwKKyAgVjFBRERfUlJSXzBfT1BDT0RFX1gwID0gODQsCisgIFYxQUREX1JSUl8wX09QQ09ERV9YMSA9IDU1LAorICBWMUFESUZGVV9SUlJfMF9PUENPREVfWDAgPSA4NSwKKyAgVjFBVkdVX1JSUl8wX09QQ09ERV9YMCA9IDg2LAorICBWMUNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDksCisgIFYxQ01QRVFJX0lNTThfT1BDT0RFX1gxID0gMzQsCisgIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gODcsCisgIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNTYsCisgIFYxQ01QTEVTX1JSUl8wX09QQ09ERV9YMCA9IDg4LAorICBWMUNNUExFU19SUlJfMF9PUENPREVfWDEgPSA1NywKKyAgVjFDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gODksCisgIFYxQ01QTEVVX1JSUl8wX09QQ09ERV9YMSA9IDU4LAorICBWMUNNUExUU0lfSU1NOF9PUENPREVfWDAgPSAxMCwKKyAgVjFDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gMzUsCisgIFYxQ01QTFRTX1JSUl8wX09QQ09ERV9YMCA9IDkwLAorICBWMUNNUExUU19SUlJfMF9PUENPREVfWDEgPSA1OSwKKyAgVjFDTVBMVFVJX0lNTThfT1BDT0RFX1gwID0gMTEsCisgIFYxQ01QTFRVSV9JTU04X09QQ09ERV9YMSA9IDM2LAorICBWMUNNUExUVV9SUlJfMF9PUENPREVfWDAgPSA5MSwKKyAgVjFDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNjAsCisgIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gOTIsCisgIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gxID0gNjEsCisgIFYxRERPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjEsCisgIFYxRERPVFBVU0FfUlJSXzBfT1BDT0RFX1gwID0gOTMsCisgIFYxRERPVFBVU19SUlJfMF9PUENPREVfWDAgPSA5NCwKKyAgVjFERE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTYyLAorICBWMURPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDk1LAorICBWMURPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjMsCisgIFYxRE9UUFVTQV9SUlJfMF9PUENPREVfWDAgPSA5NiwKKyAgVjFET1RQVVNfUlJSXzBfT1BDT0RFX1gwID0gOTcsCisgIFYxRE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTY0LAorICBWMURPVFBfUlJSXzBfT1BDT0RFX1gwID0gOTgsCisgIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gwID0gOTksCisgIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gNjIsCisgIFYxSU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTAwLAorICBWMUlOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDYzLAorICBWMU1BWFVJX0lNTThfT1BDT0RFX1gwID0gMTIsCisgIFYxTUFYVUlfSU1NOF9PUENPREVfWDEgPSAzNywKKyAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMCA9IDEwMSwKKyAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMSA9IDY0LAorICBWMU1JTlVJX0lNTThfT1BDT0RFX1gwID0gMTMsCisgIFYxTUlOVUlfSU1NOF9PUENPREVfWDEgPSAzOCwKKyAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMCA9IDEwMiwKKyAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMSA9IDY1LAorICBWMU1OWl9SUlJfMF9PUENPREVfWDAgPSAxMDMsCisgIFYxTU5aX1JSUl8wX09QQ09ERV9YMSA9IDY2LAorICBWMU1VTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEwNCwKKyAgVjFNVUxVU19SUlJfMF9PUENPREVfWDAgPSAxMDUsCisgIFYxTVVMVV9SUlJfMF9PUENPREVfWDAgPSAxMDYsCisgIFYxTVpfUlJSXzBfT1BDT0RFX1gwID0gMTA3LAorICBWMU1aX1JSUl8wX09QQ09ERV9YMSA9IDY3LAorICBWMVNBREFVX1JSUl8wX09QQ09ERV9YMCA9IDEwOCwKKyAgVjFTQURVX1JSUl8wX09QQ09ERV9YMCA9IDEwOSwKKyAgVjFTSExJX1NISUZUX09QQ09ERV9YMCA9IDcsCisgIFYxU0hMSV9TSElGVF9PUENPREVfWDEgPSA3LAorICBWMVNITF9SUlJfMF9PUENPREVfWDAgPSAxMTAsCisgIFYxU0hMX1JSUl8wX09QQ09ERV9YMSA9IDY4LAorICBWMVNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDgsCisgIFYxU0hSU0lfU0hJRlRfT1BDT0RFX1gxID0gOCwKKyAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDExMSwKKyAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDY5LAorICBWMVNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDksCisgIFYxU0hSVUlfU0hJRlRfT1BDT0RFX1gxID0gOSwKKyAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDExMiwKKyAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDcwLAorICBWMVNVQlVDX1JSUl8wX09QQ09ERV9YMCA9IDExMywKKyAgVjFTVUJVQ19SUlJfMF9PUENPREVfWDEgPSA3MSwKKyAgVjFTVUJfUlJSXzBfT1BDT0RFX1gwID0gMTE0LAorICBWMVNVQl9SUlJfMF9PUENPREVfWDEgPSA3MiwKKyAgVjJBRERJX0lNTThfT1BDT0RFX1gwID0gMTQsCisgIFYyQURESV9JTU04X09QQ09ERV9YMSA9IDM5LAorICBWMkFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDExNSwKKyAgVjJBRERTQ19SUlJfMF9PUENPREVfWDEgPSA3MywKKyAgVjJBRERfUlJSXzBfT1BDT0RFX1gwID0gMTE2LAorICBWMkFERF9SUlJfMF9PUENPREVfWDEgPSA3NCwKKyAgVjJBRElGRlNfUlJSXzBfT1BDT0RFX1gwID0gMTE3LAorICBWMkFWR1NfUlJSXzBfT1BDT0RFX1gwID0gMTE4LAorICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDE1LAorICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQwLAorICBWMkNNUEVRX1JSUl8wX09QQ09ERV9YMCA9IDExOSwKKyAgVjJDTVBFUV9SUlJfMF9PUENPREVfWDEgPSA3NSwKKyAgVjJDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gMTIwLAorICBWMkNNUExFU19SUlJfMF9PUENPREVfWDEgPSA3NiwKKyAgVjJDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gMTIxLAorICBWMkNNUExFVV9SUlJfMF9PUENPREVfWDEgPSA3NywKKyAgVjJDTVBMVFNJX0lNTThfT1BDT0RFX1gwID0gMTYsCisgIFYyQ01QTFRTSV9JTU04X09QQ09ERV9YMSA9IDQxLAorICBWMkNNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMjIsCisgIFYyQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDc4LAorICBWMkNNUExUVUlfSU1NOF9PUENPREVfWDAgPSAxNywKKyAgVjJDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNDIsCisgIFYyQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEyMywKKyAgVjJDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNzksCisgIFYyQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTI0LAorICBWMkNNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDgwLAorICBWMkRPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDEyNSwKKyAgVjJET1RQX1JSUl8wX09QQ09ERV9YMCA9IDEyNiwKKyAgVjJJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxMjcsCisgIFYySU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gODEsCisgIFYySU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTI4LAorICBWMklOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDgyLAorICBWMk1BWFNJX0lNTThfT1BDT0RFX1gwID0gMTgsCisgIFYyTUFYU0lfSU1NOF9PUENPREVfWDEgPSA0MywKKyAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMCA9IDEyOSwKKyAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMSA9IDgzLAorICBWMk1JTlNJX0lNTThfT1BDT0RFX1gwID0gMTksCisgIFYyTUlOU0lfSU1NOF9PUENPREVfWDEgPSA0NCwKKyAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMCA9IDEzMCwKKyAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMSA9IDg0LAorICBWMk1OWl9SUlJfMF9PUENPREVfWDAgPSAxMzEsCisgIFYyTU5aX1JSUl8wX09QQ09ERV9YMSA9IDg1LAorICBWMk1VTEZTQ19SUlJfMF9PUENPREVfWDAgPSAxMzIsCisgIFYyTVVMU19SUlJfMF9PUENPREVfWDAgPSAxMzMsCisgIFYyTVVMVFNfUlJSXzBfT1BDT0RFX1gwID0gMTM0LAorICBWMk1aX1JSUl8wX09QQ09ERV9YMCA9IDEzNSwKKyAgVjJNWl9SUlJfMF9PUENPREVfWDEgPSA4NiwKKyAgVjJQQUNLSF9SUlJfMF9PUENPREVfWDAgPSAxMzYsCisgIFYyUEFDS0hfUlJSXzBfT1BDT0RFX1gxID0gODcsCisgIFYyUEFDS0xfUlJSXzBfT1BDT0RFX1gwID0gMTM3LAorICBWMlBBQ0tMX1JSUl8wX09QQ09ERV9YMSA9IDg4LAorICBWMlBBQ0tVQ19SUlJfMF9PUENPREVfWDAgPSAxMzgsCisgIFYyUEFDS1VDX1JSUl8wX09QQ09ERV9YMSA9IDg5LAorICBWMlNBREFTX1JSUl8wX09QQ09ERV9YMCA9IDEzOSwKKyAgVjJTQURBVV9SUlJfMF9PUENPREVfWDAgPSAxNDAsCisgIFYyU0FEU19SUlJfMF9PUENPREVfWDAgPSAxNDEsCisgIFYyU0FEVV9SUlJfMF9PUENPREVfWDAgPSAxNDIsCisgIFYyU0hMSV9TSElGVF9PUENPREVfWDAgPSAxMCwKKyAgVjJTSExJX1NISUZUX09QQ09ERV9YMSA9IDEwLAorICBWMlNITFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0MywKKyAgVjJTSExTQ19SUlJfMF9PUENPREVfWDEgPSA5MCwKKyAgVjJTSExfUlJSXzBfT1BDT0RFX1gwID0gMTQ0LAorICBWMlNITF9SUlJfMF9PUENPREVfWDEgPSA5MSwKKyAgVjJTSFJTSV9TSElGVF9PUENPREVfWDAgPSAxMSwKKyAgVjJTSFJTSV9TSElGVF9PUENPREVfWDEgPSAxMSwKKyAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE0NSwKKyAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDkyLAorICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDEyLAorICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMSA9IDEyLAorICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gwID0gMTQ2LAorICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gxID0gOTMsCisgIFYyU1VCU0NfUlJSXzBfT1BDT0RFX1gwID0gMTQ3LAorICBWMlNVQlNDX1JSUl8wX09QQ09ERV9YMSA9IDk0LAorICBWMlNVQl9SUlJfMF9PUENPREVfWDAgPSAxNDgsCisgIFYyU1VCX1JSUl8wX09QQ09ERV9YMSA9IDk1LAorICBWNEFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0OSwKKyAgVjRBRERTQ19SUlJfMF9PUENPREVfWDEgPSA5NiwKKyAgVjRBRERfUlJSXzBfT1BDT0RFX1gwID0gMTUwLAorICBWNEFERF9SUlJfMF9PUENPREVfWDEgPSA5NywKKyAgVjRJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxNTEsCisgIFY0SU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gOTgsCisgIFY0SU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTUyLAorICBWNElOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDk5LAorICBWNFBBQ0tTQ19SUlJfMF9PUENPREVfWDAgPSAxNTMsCisgIFY0UEFDS1NDX1JSUl8wX09QQ09ERV9YMSA9IDEwMCwKKyAgVjRTSExTQ19SUlJfMF9PUENPREVfWDAgPSAxNTQsCisgIFY0U0hMU0NfUlJSXzBfT1BDT0RFX1gxID0gMTAxLAorICBWNFNITF9SUlJfMF9PUENPREVfWDAgPSAxNTUsCisgIFY0U0hMX1JSUl8wX09QQ09ERV9YMSA9IDEwMiwKKyAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE1NiwKKyAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDEwMywKKyAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDE1NywKKyAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDEwNCwKKyAgVjRTVUJTQ19SUlJfMF9PUENPREVfWDAgPSAxNTgsCisgIFY0U1VCU0NfUlJSXzBfT1BDT0RFX1gxID0gMTA1LAorICBWNFNVQl9SUlJfMF9PUENPREVfWDAgPSAxNTksCisgIFY0U1VCX1JSUl8wX09QQ09ERV9YMSA9IDEwNiwKKyAgV0g2NF9VTkFSWV9PUENPREVfWDEgPSAzOCwKKyAgWE9SSV9JTU04X09QQ09ERV9YMCA9IDIwLAorICBYT1JJX0lNTThfT1BDT0RFX1gxID0gNDUsCisgIFhPUl9SUlJfMF9PUENPREVfWDAgPSAxNjAsCisgIFhPUl9SUlJfMF9PUENPREVfWDEgPSAxMDcsCisgIFhPUl9SUlJfNV9PUENPREVfWTAgPSAzLAorICBYT1JfUlJSXzVfT1BDT0RFX1kxID0gMworfTsKKworCisjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLworCisjZW5kaWYgLyogX19BUkNIX09QQ09ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVwcm8uaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FyY2gvb3Bjb2RlX3RpbGVwcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXJjaC9vcGNvZGVfdGlsZXByby5oCkBAIC0wLDAgKzEsMTQ3MSBAQAorLyogVElMRVBybyBvcGNvZGUgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKgorICoKKyAqCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfT1BDT0RFX0hfXworI2RlZmluZSBfX0FSQ0hfT1BDT0RFX0hfXworCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdGlsZXByb19idW5kbGVfYml0czsKKworLyogVGhpcyBpcyB0aGUgYml0IHRoYXQgZGV0ZXJtaW5lcyBpZiBhIGJ1bmRsZSBpcyBpbiB0aGUgWSBlbmNvZGluZy4gKi8KKyNkZWZpbmUgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLICgodGlsZXByb19idW5kbGVfYml0cykxIDw8IDYzKQorCitlbnVtCit7CisgIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCisgIFRJTEVQUk9fTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFID0gMywKKworICAvKiBIb3cgbWFueSBkaWZmZXJlbnQgcGlwZWxpbmUgZW5jb2RpbmdzIGFyZSB0aGVyZT8gWDAsIFgxLCBZMCwgWTEsIFkyLiAqLworICBUSUxFUFJPX05VTV9QSVBFTElORV9FTkNPRElOR1MgPSA1LAorCisgIC8qIExvZyBiYXNlIDIgb2YgVElMRVBST19CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMywKKworICAvKiBJbnN0cnVjdGlvbnMgdGFrZSB0aGlzIG1hbnkgYnl0ZXMuICovCisgIFRJTEVQUk9fQlVORExFX1NJWkVfSU5fQllURVMgPSAxIDw8IFRJTEVQUk9fTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVQUk9fQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPSAzLAorCisgIC8qIEJ1bmRsZXMgc2hvdWxkIGJlIGFsaWduZWQgbW9kdWxvIHRoaXMgbnVtYmVyIG9mIGJ5dGVzLiAqLworICBUSUxFUFJPX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQorICAgICgxIDw8IFRJTEVQUk9fTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTKSwKKworICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVQUk9fU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUy4gKi8KKyAgVElMRVBST19MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMgPSAxLAorCisgIC8qIFN0YXRpYyBuZXR3b3JrIGluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KKyAgVElMRVBST19TTl9JTlNUUlVDVElPTl9TSVpFX0lOX0JZVEVTID0KKyAgICAoMSA8PCBUSUxFUFJPX0xPRzJfU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUyksCisKKyAgLyogTnVtYmVyIG9mIHJlZ2lzdGVycyAoc29tZSBhcmUgbWFnaWMsIHN1Y2ggYXMgbmV0d29yayBJL08pLiAqLworICBUSUxFUFJPX05VTV9SRUdJU1RFUlMgPSA2NCwKKworICAvKiBOdW1iZXIgb2Ygc3RhdGljIG5ldHdvcmsgcmVnaXN0ZXJzLiAqLworICBUSUxFUFJPX05VTV9TTl9SRUdJU1RFUlMgPSA0Cit9OworCisvKiBNYWtlIGEgZmV3ICJ0aWxlXyIgdmFyaWFibGVzIHRvIHNpbXBsaWZ5IGNvbW1vbiBjb2RlIGJldHdlZW4KKyAgIGFyY2hpdGVjdHVyZXMuICAqLworCit0eXBlZGVmIHRpbGVwcm9fYnVuZGxlX2JpdHMgdGlsZV9idW5kbGVfYml0czsKKyNkZWZpbmUgVElMRV9CVU5ETEVfU0laRV9JTl9CWVRFUyBUSUxFUFJPX0JVTkRMRV9TSVpFX0lOX0JZVEVTCisjZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFUFJPX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMKKyNkZWZpbmUgVElMRV9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgXAorICBUSUxFUFJPX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUworCisvKiA2NC1iaXQgcGF0dGVybiBmb3IgYSB7IGJwdCA7IG5vcCB9IGJ1bmRsZS4gKi8KKyNkZWZpbmUgVElMRVBST19CUFRfQlVORExFIDB4NDAwYjNjYWU3MDE2NjAwMFVMTAorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfQnJPZmZfU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4M2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyT2ZmX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwN2ZmZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDIwKSkgJiAweDAwMDE4MDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0JyVHlwZV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X0ltbThfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MDAwMDAwYzApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9TTih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMikpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0Rlc3RfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfRGVzdF9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9EZXN0X1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW0xNl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW0xNl9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW04X1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbThfWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0ltbU9wY29kZUV4dGVuc2lvbl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjApKSAmIDB4N2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1MSkpICYgMHg3Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9JbW1SUk9wY29kZUV4dGVuc2lvbl9TTih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gOCkpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0pPZmZMb25nX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwN2ZmZikgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDIwKSkgJiAweDAwMDE4MDAwKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMTQpKSAmIDB4MDAxZTAwMDApIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNikpICYgMHgwN2UwMDAwMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDE4MDAwMDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X0pPZmZfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNCkpICYgMHgwMDFlMDAwMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE2KSkgJiAweDA3ZTAwMDAwKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDgwMDAwMDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTUZfSW1tMTVfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDAzZmZmKSB8CisgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDQpKSAmIDB4MDAwMDQwMDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTU1FbmRfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01NRW5kX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NTVN0YXJ0X1gwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyMykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NTVN0YXJ0X1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1NCkpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9NVF9JbW0xNV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgwMDAwM2ZjMCkgfAorICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDQ0KSkgJiAweDAwMDA0MDAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X01vZGUodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDYzKSkgJiAweDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfTm9SZWdPcGNvZGVFeHRlbnNpb25fU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDApKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEwKSkgJiAweDNmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X09wY29kZV9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjgpKSAmIDB4Nyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU5KSkgJiAweGYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfT3Bjb2RlX1kwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyNykpICYgMHhmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X09wY29kZV9ZMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTkpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9PcGNvZGVfWTIodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU2KSkgJiAweDcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJPcGNvZGVFeHRlbnNpb25fU04odGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDQpKSAmIDB4Zik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDFmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDFmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9SUlJPcGNvZGVFeHRlbnNpb25fWTAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgzKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1JvdXRlT3Bjb2RlRXh0ZW5zaW9uX1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TX1gwKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAyNykpICYgMHgxKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NfWDEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU4KSkgJiAweDEpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hBbXRfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NoQW10X1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TaEFtdF9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU2hBbXRfWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1NyY0FfWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDYpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQV9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gNikpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNBX1kyKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKG4gPj4gMjYpKSAmIDB4MDAwMDAwMDEpIHwKKyAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA1MCkpICYgMHgwMDAwMDAzZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9TcmNCRGVzdF9ZMih0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMjApKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9YMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjQl9ZMSh0aWxlcHJvX2J1bmRsZV9iaXRzIG4pCit7CisgIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfU3JjX1NOKHRpbGVwcm9fYnVuZGxlX2JpdHMgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5PcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDEyKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1VuT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgxZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9Vbk9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5PcGNvZGVFeHRlbnNpb25fWTEodGlsZXByb19idW5kbGVfYml0cyBuKQoreworICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAorZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWDAodGlsZXByb19idW5kbGVfYml0cyBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKChuID4+IDE3KSkgJiAweDNmZik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OCkpICYgMHgzZmYpOworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitnZXRfVW5TaE9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlcHJvX2J1bmRsZV9iaXRzIG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKG4gPj4gMTcpKSAmIDB4Nyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKK2dldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVwcm9fYnVuZGxlX2JpdHMgbikKK3sKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OCkpICYgMHg3KTsKK30KKworCitzdGF0aWMgX19pbmxpbmUgaW50CitzaWduX2V4dGVuZChpbnQgbiwgaW50IG51bV9iaXRzKQoreworICBpbnQgc2hpZnQgPSAoaW50KShzaXplb2YoaW50KSAqIDggLSBudW1fYml0cyk7CisgIHJldHVybiAobiA8PCBzaGlmdCkgPj4gc2hpZnQ7Cit9CisKKworCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0JyT2ZmX1NOKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfQnJPZmZfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDA3ZmZmKSkgPDwgNDMpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDE4MDAwKSkgPDwgMjApOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0JyVHlwZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDMxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9EZXN0X0ltbThfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMDNmKSkgPDwgMzEpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMGMwKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0Rlc3RfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MykgPDwgMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfRGVzdF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tMTZfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmZmZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbTE2X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHhmZmZmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbThfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDApOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX0ltbThfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW04X1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweGZmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tOF9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDdmKSA8PCAyMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHg3ZikpIDw8IDUxKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9JbW1SUk9wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCA4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9KT2ZmTG9uZ19YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAxZTAwMDApKSA8PCAxNCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDdlMDAwMDApKSA8PCAxNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MTgwMDAwMDApKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfSk9mZl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAxZTAwMDApKSA8PCAxNCkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDdlMDAwMDApKSA8PCAxNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDgwMDAwMDApKSA8PCAzMSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTUZfSW1tMTVfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAzZmZmKSkgPDwgMzcpIHwKKyAgICAgICAgICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDAwMDA0MDAwKSkgPDwgNDQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX01NRW5kX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDFmKSA8PCAxOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTU1FbmRfWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX01NU3RhcnRfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4MWYpIDw8IDIzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9NTVN0YXJ0X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDU0KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9NVF9JbW0xNV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDNmYzApKSA8PCAzNykgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDQwMDApKSA8PCA0NCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfTW9kZShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDYzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Ob1JlZ09wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHhmKSA8PCAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWDAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4NykgPDwgMjgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWTAoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgMjcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX09wY29kZV9ZMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU5KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9PcGNvZGVfWTIoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDcpKSA8PCA1Nik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJPcGNvZGVFeHRlbnNpb25fU04oaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4ZikgPDwgNCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDFmZikgPDwgMTgpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MWZmKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCAxOCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1JvdXRlT3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU19YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxKSA8PCAyNyk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU19YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MSkpIDw8IDU4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NoQW10X1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TaEFtdF9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NoQW10X1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCA2KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDM3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNBX1kyKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDAwMDAwMDAxKSA8PCAyNikgfAorICAgICAgICAgKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2UpKSA8PCA1MCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQkRlc3RfWTIoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDIwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9TcmNCX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQl9YMShpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKCgodGlsZXByb19idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB0aWxlcHJvX2J1bmRsZV9iaXRzCitjcmVhdGVfU3JjQl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NyY0JfWTEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1NyY19TTihpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgzKSA8PCAwKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Vbk9wY29kZUV4dGVuc2lvbl9YMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9Vbk9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQoreworICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOworICByZXR1cm4gKChuICYgMHgxZikgPDwgMTIpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHgxZikpIDw8IDQzKTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDNmZikgPDwgMTcpOworfQorCitzdGF0aWMgX19pbmxpbmUgdGlsZXByb19idW5kbGVfYml0cworY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKK3sKKyAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKKyAgcmV0dXJuICgoKHRpbGVwcm9fYnVuZGxlX2JpdHMpKG4gJiAweDNmZikpIDw8IDQ4KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKG4gJiAweDcpIDw8IDE3KTsKK30KKworc3RhdGljIF9faW5saW5lIHRpbGVwcm9fYnVuZGxlX2JpdHMKK2NyZWF0ZV9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kxKGludCBudW0pCit7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07CisgIHJldHVybiAoKCh0aWxlcHJvX2J1bmRsZV9iaXRzKShuICYgMHg3KSkgPDwgNDgpOworfQorCisKK2VudW0KK3sKKyAgQUREQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTgsCisgIEFEREJTX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY4LAorICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxLAorICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxLAorICBBRERIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTksCisgIEFEREhTX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2OSwKKyAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMiwKKyAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMiwKKyAgQURESUJfSU1NXzBfT1BDT0RFX1gwID0gMSwKKyAgQURESUJfSU1NXzBfT1BDT0RFX1gxID0gMSwKKyAgQURESUhfSU1NXzBfT1BDT0RFX1gwID0gMiwKKyAgQURESUhfSU1NXzBfT1BDT0RFX1gxID0gMiwKKyAgQURESV9JTU1fMF9PUENPREVfWDAgPSAzLAorICBBRERJX0lNTV8wX09QQ09ERV9YMSA9IDMsCisgIEFERElfSU1NXzFfT1BDT0RFX1NOID0gMSwKKyAgQURESV9PUENPREVfWTAgPSA5LAorICBBRERJX09QQ09ERV9ZMSA9IDcsCisgIEFERExJU19PUENPREVfWDAgPSAxLAorICBBRERMSVNfT1BDT0RFX1gxID0gMiwKKyAgQURETElfT1BDT0RFX1gwID0gMiwKKyAgQURETElfT1BDT0RFX1gxID0gMywKKyAgQUREU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTYsCisgIEFERFNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY2LAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDMsCisgIEFERF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMywKKyAgQUREX1NQRUNJQUxfMF9PUENPREVfWTAgPSAwLAorICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDAsCisgIEFESUZGQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0LAorICBBRElGRkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDUsCisgIEFORElfSU1NXzBfT1BDT0RFX1gwID0gMSwKKyAgQU5ESV9JTU1fMF9PUENPREVfWDEgPSA0LAorICBBTkRJX09QQ09ERV9ZMCA9IDEwLAorICBBTkRJX09QQ09ERV9ZMSA9IDgsCisgIEFORF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNiwKKyAgQU5EX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0LAorICBBTkRfU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDAsCisgIEFORF9TUEVDSUFMXzJfT1BDT0RFX1kxID0gMCwKKyAgQVVMSV9PUENPREVfWDAgPSAzLAorICBBVUxJX09QQ09ERV9YMSA9IDQsCisgIEFWR0JfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNywKKyAgQVZHSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOCwKKyAgQkJOU1RfQlJBTkNIX09QQ09ERV9YMSA9IDE1LAorICBCQk5TX0JSQU5DSF9PUENPREVfWDEgPSAxNCwKKyAgQkJOU19PUENPREVfU04gPSA2MywKKyAgQkJTVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTMsCisgIEJCU19CUkFOQ0hfT1BDT0RFX1gxID0gMTIsCisgIEJCU19PUENPREVfU04gPSA2MiwKKyAgQkdFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDcsCisgIEJHRVpfQlJBTkNIX09QQ09ERV9YMSA9IDYsCisgIEJHRVpfT1BDT0RFX1NOID0gNjEsCisgIEJHWlRfQlJBTkNIX09QQ09ERV9YMSA9IDUsCisgIEJHWl9CUkFOQ0hfT1BDT0RFX1gxID0gNCwKKyAgQkdaX09QQ09ERV9TTiA9IDU4LAorICBCSVRYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDEsCisgIEJJVFhfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMSwKKyAgQkxFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDExLAorICBCTEVaX0JSQU5DSF9PUENPREVfWDEgPSAxMCwKKyAgQkxFWl9PUENPREVfU04gPSA1OSwKKyAgQkxaVF9CUkFOQ0hfT1BDT0RFX1gxID0gOSwKKyAgQkxaX0JSQU5DSF9PUENPREVfWDEgPSA4LAorICBCTFpfT1BDT0RFX1NOID0gNjAsCisgIEJOWlRfQlJBTkNIX09QQ09ERV9YMSA9IDMsCisgIEJOWl9CUkFOQ0hfT1BDT0RFX1gxID0gMiwKKyAgQk5aX09QQ09ERV9TTiA9IDU3LAorICBCUFRfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMSwKKyAgQlJBTkNIX09QQ09ERV9YMSA9IDUsCisgIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDIsCisgIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDIsCisgIEJaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMSwKKyAgQlpfQlJBTkNIX09QQ09ERV9YMSA9IDAsCisgIEJaX09QQ09ERV9TTiA9IDU2LAorICBDTFpfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gMywKKyAgQ0xaX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDMsCisgIENSQzMyXzMyX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5LAorICBDUkMzMl84X1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMCwKKyAgQ1RaX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDQsCisgIENUWl9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA0LAorICBEUkFJTl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxLAorICBEVExCUFJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMiwKKyAgRFdPUkRfQUxJR05fU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDk1LAorICBGSU5WX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDMsCisgIEZMVVNIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDQsCisgIEZOT1BfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMywKKyAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA1LAorICBGTk9QX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDUsCisgIEZOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gNSwKKyAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAxLAorICBIQUxUX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDAsCisgIElDT0hfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gNiwKKyAgSUxMX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDcsCisgIElMTF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAyLAorICBJTU1fMF9PUENPREVfU04gPSAwLAorICBJTU1fMF9PUENPREVfWDAgPSA0LAorICBJTU1fMF9PUENPREVfWDEgPSA2LAorICBJTU1fMV9PUENPREVfU04gPSAxLAorICBJTU1fT1BDT0RFXzBfWDAgPSA1LAorICBJTlRIQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTEsCisgIElOVEhCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1LAorICBJTlRISF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTIsCisgIElOVEhIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2LAorICBJTlRMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTMsCisgIElOVExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3LAorICBJTlRMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTQsCisgIElOVExIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA4LAorICBJTlZfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gOCwKKyAgSVJFVF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSA5LAorICBKQUxCX09QQ09ERV9YMSA9IDEzLAorICBKQUxGX09QQ09ERV9YMSA9IDEyLAorICBKQUxSUF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gOSwKKyAgSkFMUlJfSU1NXzFfT1BDT0RFX1NOID0gMywKKyAgSkFMUl9SUl9JTU1fMF9PUENPREVfU04gPSA1LAorICBKQUxSX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxMCwKKyAgSkJfT1BDT0RFX1gxID0gMTEsCisgIEpGX09QQ09ERV9YMSA9IDEwLAorICBKUlBfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDExLAorICBKUlJfSU1NXzFfT1BDT0RFX1NOID0gMiwKKyAgSlJfUlJfSU1NXzBfT1BDT0RFX1NOID0gNCwKKyAgSlJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDEyLAorICBMQkFERF9JTU1fMF9PUENPREVfWDEgPSAyMiwKKyAgTEJBRERfVV9JTU1fMF9PUENPREVfWDEgPSAyMywKKyAgTEJfT1BDT0RFX1kyID0gMCwKKyAgTEJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTAsCisgIExCX1VfT1BDT0RFX1kyID0gMSwKKyAgTEJfVV9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxMSwKKyAgTEhBRERfSU1NXzBfT1BDT0RFX1gxID0gMjQsCisgIExIQUREX1VfSU1NXzBfT1BDT0RFX1gxID0gMjUsCisgIExIX09QQ09ERV9ZMiA9IDIsCisgIExIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDEyLAorICBMSF9VX09QQ09ERV9ZMiA9IDMsCisgIExIX1VfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTMsCisgIExOS19TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTMsCisgIExXQUREX0lNTV8wX09QQ09ERV9YMSA9IDI2LAorICBMV0FERF9OQV9JTU1fMF9PUENPREVfWDEgPSAyNywKKyAgTFdfTkFfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjQsCisgIExXX09QQ09ERV9ZMiA9IDQsCisgIExXX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE0LAorICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDE1LAorICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE0LAorICBNQVhIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNiwKKyAgTUFYSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTUsCisgIE1BWElCX1VfSU1NXzBfT1BDT0RFX1gwID0gNCwKKyAgTUFYSUJfVV9JTU1fMF9PUENPREVfWDEgPSA1LAorICBNQVhJSF9JTU1fMF9PUENPREVfWDAgPSA1LAorICBNQVhJSF9JTU1fMF9PUENPREVfWDEgPSA2LAorICBNRlNQUl9JTU1fMF9PUENPREVfWDEgPSA3LAorICBNRl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNSwKKyAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNywKKyAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxNiwKKyAgTUlOSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTgsCisgIE1JTkhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE3LAorICBNSU5JQl9VX0lNTV8wX09QQ09ERV9YMCA9IDYsCisgIE1JTklCX1VfSU1NXzBfT1BDT0RFX1gxID0gOCwKKyAgTUlOSUhfSU1NXzBfT1BDT0RFX1gwID0gNywKKyAgTUlOSUhfSU1NXzBfT1BDT0RFX1gxID0gOSwKKyAgTU1fT1BDT0RFX1gwID0gNiwKKyAgTU1fT1BDT0RFX1gxID0gNywKKyAgTU5aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTksCisgIE1OWkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE4LAorICBNTlpIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyMCwKKyAgTU5aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTksCisgIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjEsCisgIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjAsCisgIE1OWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMCwKKyAgTU5aX1NQRUNJQUxfMV9PUENPREVfWTEgPSAxLAorICBNT1ZFSV9JTU1fMV9PUENPREVfU04gPSAwLAorICBNT1ZFX1JSX0lNTV8wX09QQ09ERV9TTiA9IDgsCisgIE1UU1BSX0lNTV8wX09QQ09ERV9YMSA9IDEwLAorICBNVUxISEFfU1NfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDIyLAorICBNVUxISEFfU1NfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhIQV9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjMsCisgIE1VTEhIQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjQsCisgIE1VTEhIQV9VVV9TUEVDSUFMXzdfT1BDT0RFX1kwID0gMSwKKyAgTVVMSEhTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjUsCisgIE1VTEhIX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNiwKKyAgTVVMSEhfU1NfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhIX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNywKKyAgTVVMSEhfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDI4LAorICBNVUxISF9VVV9TUEVDSUFMXzZfT1BDT0RFX1kwID0gMSwKKyAgTVVMSExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyOSwKKyAgTVVMSExBX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMCwKKyAgTVVMSExBX1VTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMSwKKyAgTVVMSExBX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMiwKKyAgTVVMSExTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzMsCisgIE1VTEhMU0FfVVVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDAsCisgIE1VTEhMX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNCwKKyAgTVVMSExfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM1LAorICBNVUxITF9VU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzYsCisgIE1VTEhMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNywKKyAgTVVMTExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzOCwKKyAgTVVMTExBX1NTX1NQRUNJQUxfN19PUENPREVfWTAgPSAyLAorICBNVUxMTEFfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM5LAorICBNVUxMTEFfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQwLAorICBNVUxMTEFfVVVfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDMsCisgIE1VTExMU0FfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQxLAorICBNVUxMTF9TU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDIsCisgIE1VTExMX1NTX1NQRUNJQUxfNl9PUENPREVfWTAgPSAyLAorICBNVUxMTF9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDMsCisgIE1VTExMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0NCwKKyAgTVVMTExfVVVfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDMsCisgIE1WTlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ1LAorICBNVk5aX1NQRUNJQUxfMV9PUENPREVfWTAgPSAxLAorICBNVlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ2LAorICBNVlpfU1BFQ0lBTF8xX09QQ09ERV9ZMCA9IDIsCisgIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDcsCisgIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjEsCisgIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDgsCisgIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjIsCisgIE1aX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0OSwKKyAgTVpfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDIzLAorICBNWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMywKKyAgTVpfU1BFQ0lBTF8xX09QQ09ERV9ZMSA9IDIsCisgIE5BUF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNiwKKyAgTk9QX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDIsCisgIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA2LAorICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTcsCisgIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA2LAorICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kxID0gMywKKyAgTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMCwKKyAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MCwKKyAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNCwKKyAgTk9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAxLAorICBOT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDEsCisgIE9SSV9JTU1fMF9PUENPREVfWDAgPSA4LAorICBPUklfSU1NXzBfT1BDT0RFX1gxID0gMTEsCisgIE9SSV9PUENPREVfWTAgPSAxMSwKKyAgT1JJX09QQ09ERV9ZMSA9IDksCisgIE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MSwKKyAgT1JfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI1LAorICBPUl9TUEVDSUFMXzJfT1BDT0RFX1kwID0gMiwKKyAgT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDIsCisgIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDMsCisgIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MywKKyAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MiwKKyAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNiwKKyAgUEFDS0hTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDIsCisgIFBBQ0tIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzIsCisgIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTMsCisgIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjcsCisgIFBDTlRfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gNywKKyAgUENOVF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA3LAorICBSTElfU0hVTl8wX09QQ09ERV9YMCA9IDEsCisgIFJMSV9TSFVOXzBfT1BDT0RFX1gxID0gMSwKKyAgUkxJX1NIVU5fMF9PUENPREVfWTAgPSAxLAorICBSTElfU0hVTl8wX09QQ09ERV9ZMSA9IDEsCisgIFJMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NCwKKyAgUkxfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI4LAorICBSTF9TUEVDSUFMXzNfT1BDT0RFX1kwID0gMCwKKyAgUkxfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDAsCisgIFJSX0lNTV8wX09QQ09ERV9TTiA9IDAsCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTUsCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjksCisgIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKKyAgUzFBX1NQRUNJQUxfMF9PUENPREVfWTEgPSAxLAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU2LAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMwLAorICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDIsCisgIFMyQV9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMiwKKyAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NywKKyAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMSwKKyAgUzNBX1NQRUNJQUxfNV9PUENPREVfWTAgPSAxLAorICBTM0FfU1BFQ0lBTF81X09QQ09ERV9ZMSA9IDEsCisgIFNBREFCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU4LAorICBTQURBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTksCisgIFNBREFIX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYwLAorICBTQURCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYxLAorICBTQURIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MiwKKyAgU0FESF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MywKKyAgU0JBRERfSU1NXzBfT1BDT0RFX1gxID0gMjgsCisgIFNCX09QQ09ERV9ZMiA9IDUsCisgIFNCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMiwKKyAgU0VRQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjQsCisgIFNFUUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMzLAorICBTRVFIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2NSwKKyAgU0VRSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzQsCisgIFNFUUlCX0lNTV8wX09QQ09ERV9YMCA9IDksCisgIFNFUUlCX0lNTV8wX09QQ09ERV9YMSA9IDEyLAorICBTRVFJSF9JTU1fMF9PUENPREVfWDAgPSAxMCwKKyAgU0VRSUhfSU1NXzBfT1BDT0RFX1gxID0gMTMsCisgIFNFUUlfSU1NXzBfT1BDT0RFX1gwID0gMTEsCisgIFNFUUlfSU1NXzBfT1BDT0RFX1gxID0gMTQsCisgIFNFUUlfT1BDT0RFX1kwID0gMTIsCisgIFNFUUlfT1BDT0RFX1kxID0gMTAsCisgIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjYsCisgIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzUsCisgIFNFUV9TUEVDSUFMXzVfT1BDT0RFX1kwID0gMiwKKyAgU0VRX1NQRUNJQUxfNV9PUENPREVfWTEgPSAyLAorICBTSEFERF9JTU1fMF9PUENPREVfWDEgPSAyOSwKKyAgU0hMOElJX0lNTV8wX09QQ09ERV9TTiA9IDMsCisgIFNITEJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDY3LAorICBTSExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzNiwKKyAgU0hMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjgsCisgIFNITEhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM3LAorICBTSExJQl9TSFVOXzBfT1BDT0RFX1gwID0gMiwKKyAgU0hMSUJfU0hVTl8wX09QQ09ERV9YMSA9IDIsCisgIFNITElIX1NIVU5fMF9PUENPREVfWDAgPSAzLAorICBTSExJSF9TSFVOXzBfT1BDT0RFX1gxID0gMywKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1gwID0gNCwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1gxID0gNCwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1kwID0gMiwKKyAgU0hMSV9TSFVOXzBfT1BDT0RFX1kxID0gMiwKKyAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2OSwKKyAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzOCwKKyAgU0hMX1NQRUNJQUxfM19PUENPREVfWTAgPSAxLAorICBTSExfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDEsCisgIFNIUjFfUlJfSU1NXzBfT1BDT0RFX1NOID0gOSwKKyAgU0hSQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzAsCisgIFNIUkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM5LAorICBTSFJIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MSwKKyAgU0hSSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDAsCisgIFNIUklCX1NIVU5fMF9PUENPREVfWDAgPSA1LAorICBTSFJJQl9TSFVOXzBfT1BDT0RFX1gxID0gNSwKKyAgU0hSSUhfU0hVTl8wX09QQ09ERV9YMCA9IDYsCisgIFNIUklIX1NIVU5fMF9PUENPREVfWDEgPSA2LAorICBTSFJJX1NIVU5fMF9PUENPREVfWDAgPSA3LAorICBTSFJJX1NIVU5fMF9PUENPREVfWDEgPSA3LAorICBTSFJJX1NIVU5fMF9PUENPREVfWTAgPSAzLAorICBTSFJJX1NIVU5fMF9PUENPREVfWTEgPSAzLAorICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDcyLAorICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQxLAorICBTSFJfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDIsCisgIFNIUl9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMiwKKyAgU0hVTl8wX09QQ09ERV9YMCA9IDcsCisgIFNIVU5fMF9PUENPREVfWDEgPSA4LAorICBTSFVOXzBfT1BDT0RFX1kwID0gMTMsCisgIFNIVU5fMF9PUENPREVfWTEgPSAxMSwKKyAgU0hfT1BDT0RFX1kyID0gNiwKKyAgU0hfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQyLAorICBTTFRCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MywKKyAgU0xUQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDMsCisgIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzQsCisgIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDQsCisgIFNMVEVCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NSwKKyAgU0xURUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ1LAorICBTTFRFQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NiwKKyAgU0xURUJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDYsCisgIFNMVEVIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NywKKyAgU0xURUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ3LAorICBTTFRFSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3OCwKKyAgU0xURUhfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDgsCisgIFNMVEVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDc5LAorICBTTFRFX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0OSwKKyAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMCwKKyAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kxID0gMCwKKyAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MCwKKyAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MCwKKyAgU0xURV9VX1NQRUNJQUxfNF9PUENPREVfWTAgPSAxLAorICBTTFRFX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDEsCisgIFNMVEhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDgxLAorICBTTFRIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MSwKKyAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MiwKKyAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MiwKKyAgU0xUSUJfSU1NXzBfT1BDT0RFX1gwID0gMTIsCisgIFNMVElCX0lNTV8wX09QQ09ERV9YMSA9IDE1LAorICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMCA9IDEzLAorICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMSA9IDE2LAorICBTTFRJSF9JTU1fMF9PUENPREVfWDAgPSAxNCwKKyAgU0xUSUhfSU1NXzBfT1BDT0RFX1gxID0gMTcsCisgIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gwID0gMTUsCisgIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gxID0gMTgsCisgIFNMVElfSU1NXzBfT1BDT0RFX1gwID0gMTYsCisgIFNMVElfSU1NXzBfT1BDT0RFX1gxID0gMTksCisgIFNMVElfT1BDT0RFX1kwID0gMTQsCisgIFNMVElfT1BDT0RFX1kxID0gMTIsCisgIFNMVElfVV9JTU1fMF9PUENPREVfWDAgPSAxNywKKyAgU0xUSV9VX0lNTV8wX09QQ09ERV9YMSA9IDIwLAorICBTTFRJX1VfT1BDT0RFX1kwID0gMTUsCisgIFNMVElfVV9PUENPREVfWTEgPSAxMywKKyAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MywKKyAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MywKKyAgU0xUX1NQRUNJQUxfNF9PUENPREVfWTAgPSAyLAorICBTTFRfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDIsCisgIFNMVF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4NCwKKyAgU0xUX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU0LAorICBTTFRfVV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMywKKyAgU0xUX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDMsCisgIFNORUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg1LAorICBTTkVCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1NSwKKyAgU05FSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODYsCisgIFNORUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU2LAorICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg3LAorICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU3LAorICBTTkVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDMsCisgIFNORV9TUEVDSUFMXzVfT1BDT0RFX1kxID0gMywKKyAgU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDAsCisgIFNQRUNJQUxfMF9PUENPREVfWDEgPSAxLAorICBTUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKKyAgU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCisgIFNQRUNJQUxfMV9PUENPREVfWTAgPSAyLAorICBTUEVDSUFMXzFfT1BDT0RFX1kxID0gMiwKKyAgU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDMsCisgIFNQRUNJQUxfMl9PUENPREVfWTEgPSAzLAorICBTUEVDSUFMXzNfT1BDT0RFX1kwID0gNCwKKyAgU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDQsCisgIFNQRUNJQUxfNF9PUENPREVfWTAgPSA1LAorICBTUEVDSUFMXzRfT1BDT0RFX1kxID0gNSwKKyAgU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDYsCisgIFNQRUNJQUxfNV9PUENPREVfWTEgPSA2LAorICBTUEVDSUFMXzZfT1BDT0RFX1kwID0gNywKKyAgU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDgsCisgIFNSQUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg4LAorICBTUkFCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1OCwKKyAgU1JBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODksCisgIFNSQUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU5LAorICBTUkFJQl9TSFVOXzBfT1BDT0RFX1gwID0gOCwKKyAgU1JBSUJfU0hVTl8wX09QQ09ERV9YMSA9IDgsCisgIFNSQUlIX1NIVU5fMF9PUENPREVfWDAgPSA5LAorICBTUkFJSF9TSFVOXzBfT1BDT0RFX1gxID0gOSwKKyAgU1JBSV9TSFVOXzBfT1BDT0RFX1gwID0gMTAsCisgIFNSQUlfU0hVTl8wX09QQ09ERV9YMSA9IDEwLAorICBTUkFJX1NIVU5fMF9PUENPREVfWTAgPSA0LAorICBTUkFJX1NIVU5fMF9PUENPREVfWTEgPSA0LAorICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkwLAorICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYwLAorICBTUkFfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDMsCisgIFNSQV9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMywKKyAgU1VCQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAwLAorICBTVUJCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MCwKKyAgU1VCQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTEsCisgIFNVQkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYxLAorICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAxLAorICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzEsCisgIFNVQkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkyLAorICBTVUJIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2MiwKKyAgU1VCU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTcsCisgIFNVQlNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY3LAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkzLAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYzLAorICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDMsCisgIFNVQl9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMywKKyAgU1dBRERfSU1NXzBfT1BDT0RFX1gxID0gMzAsCisgIFNXSU5UMF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxOCwKKyAgU1dJTlQxX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE5LAorICBTV0lOVDJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjAsCisgIFNXSU5UM19VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAyMSwKKyAgU1dfT1BDT0RFX1kyID0gNywKKyAgU1dfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY0LAorICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA4LAorICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA4LAorICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA5LAorICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA5LAorICBUQkxJRFhCMl9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMCwKKyAgVEJMSURYQjJfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMTAsCisgIFRCTElEWEIzX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDExLAorICBUQkxJRFhCM19VTl8wX1NIVU5fMF9PUENPREVfWTAgPSAxMSwKKyAgVE5TX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDIyLAorICBVTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMSwKKyAgVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTEsCisgIFVOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDUsCisgIFVOXzBfU0hVTl8wX09QQ09ERV9ZMSA9IDUsCisgIFdINjRfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjMsCisgIFhPUklfSU1NXzBfT1BDT0RFX1gwID0gMiwKKyAgWE9SSV9JTU1fMF9PUENPREVfWDEgPSAyMSwKKyAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5NCwKKyAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2NSwKKyAgWE9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAzLAorICBYT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDMKK307CisKKworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KKworI2VuZGlmIC8qIF9fQVJDSF9PUENPREVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBhZWM2MGRjLi4wYmI0MjY0IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNSArMSw3IEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCitoZWFkZXIteSArPSAuLi9hcmNoLworCiBoZWFkZXIteSArPSB1Y29udGV4dC5oCiBoZWFkZXIteSArPSBoYXJkd2FsbC5oCiAKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzg5NTkuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0FTTV9USUxFX09QQ09ERV9USUxFX0gKLSNkZWZpbmUgX0FTTV9USUxFX09QQ09ERV9USUxFX0gKLQotI2luY2x1ZGUgPGFyY2gvY2hpcC5oPgotCi0jaWYgQ0hJUF9XT1JEX1NJWkUoKSA9PSA2NAotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZV82NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGVfMzIuaD4KLSNlbmRpZgotCi0vKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgbm90IGNvcnJlY3QgZm9yIFRJTEU2NCwgc28ganVzdCBhdm9pZCB0aGVtLiAqLwotI3VuZGVmIFRJTEVfRUxGX01BQ0hJTkVfQ09ERQotI3VuZGVmIFRJTEVfRUxGX05BTUUKLQotI2VuZGlmIC8qIF9BU01fVElMRV9PUENPREVfVElMRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlLXRpbGVfMzIuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RmN2IxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMyArMCwwIEBACi0vKiB0aWxlLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJTEUgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBUaWxlcmEgQ29ycC4gKi8KLQotI2lmbmRlZiBvcGNvZGVfdGlsZV9oCi0jZGVmaW5lIG9wY29kZV90aWxlX2gKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdGlsZV9idW5kbGVfYml0czsKLQotCi1lbnVtCi17Ci0gIFRJTEVfTUFYX09QRVJBTkRTID0gNSAvKiBtbSAqLwotfTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFRJTEVfT1BDX0JQVCwKLSAgVElMRV9PUENfSU5GTywKLSAgVElMRV9PUENfSU5GT0wsCi0gIFRJTEVfT1BDX0osCi0gIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfTU9WRSwKLSAgVElMRV9PUENfTU9WRV9TTiwKLSAgVElMRV9PUENfTU9WRUksCi0gIFRJTEVfT1BDX01PVkVJX1NOLAotICBUSUxFX09QQ19NT1ZFTEksCi0gIFRJTEVfT1BDX01PVkVMSV9TTiwKLSAgVElMRV9PUENfTU9WRUxJUywKLSAgVElMRV9PUENfUFJFRkVUQ0gsCi0gIFRJTEVfT1BDX1JBSVNFLAotICBUSUxFX09QQ19BREQsCi0gIFRJTEVfT1BDX0FERF9TTiwKLSAgVElMRV9PUENfQUREQiwKLSAgVElMRV9PUENfQUREQl9TTiwKLSAgVElMRV9PUENfQUREQlNfVSwKLSAgVElMRV9PUENfQUREQlNfVV9TTiwKLSAgVElMRV9PUENfQURESCwKLSAgVElMRV9PUENfQURESF9TTiwKLSAgVElMRV9PUENfQURESFMsCi0gIFRJTEVfT1BDX0FEREhTX1NOLAotICBUSUxFX09QQ19BRERJLAotICBUSUxFX09QQ19BRERJX1NOLAotICBUSUxFX09QQ19BRERJQiwKLSAgVElMRV9PUENfQURESUJfU04sCi0gIFRJTEVfT1BDX0FERElILAotICBUSUxFX09QQ19BRERJSF9TTiwKLSAgVElMRV9PUENfQURETEksCi0gIFRJTEVfT1BDX0FERExJX1NOLAotICBUSUxFX09QQ19BRERMSVMsCi0gIFRJTEVfT1BDX0FERFMsCi0gIFRJTEVfT1BDX0FERFNfU04sCi0gIFRJTEVfT1BDX0FESUZGQl9VLAotICBUSUxFX09QQ19BRElGRkJfVV9TTiwKLSAgVElMRV9PUENfQURJRkZILAotICBUSUxFX09QQ19BRElGRkhfU04sCi0gIFRJTEVfT1BDX0FORCwKLSAgVElMRV9PUENfQU5EX1NOLAotICBUSUxFX09QQ19BTkRJLAotICBUSUxFX09QQ19BTkRJX1NOLAotICBUSUxFX09QQ19BVUxJLAotICBUSUxFX09QQ19BVkdCX1UsCi0gIFRJTEVfT1BDX0FWR0JfVV9TTiwKLSAgVElMRV9PUENfQVZHSCwKLSAgVElMRV9PUENfQVZHSF9TTiwKLSAgVElMRV9PUENfQkJOUywKLSAgVElMRV9PUENfQkJOU19TTiwKLSAgVElMRV9PUENfQkJOU1QsCi0gIFRJTEVfT1BDX0JCTlNUX1NOLAotICBUSUxFX09QQ19CQlMsCi0gIFRJTEVfT1BDX0JCU19TTiwKLSAgVElMRV9PUENfQkJTVCwKLSAgVElMRV9PUENfQkJTVF9TTiwKLSAgVElMRV9PUENfQkdFWiwKLSAgVElMRV9PUENfQkdFWl9TTiwKLSAgVElMRV9PUENfQkdFWlQsCi0gIFRJTEVfT1BDX0JHRVpUX1NOLAotICBUSUxFX09QQ19CR1osCi0gIFRJTEVfT1BDX0JHWl9TTiwKLSAgVElMRV9PUENfQkdaVCwKLSAgVElMRV9PUENfQkdaVF9TTiwKLSAgVElMRV9PUENfQklUWCwKLSAgVElMRV9PUENfQklUWF9TTiwKLSAgVElMRV9PUENfQkxFWiwKLSAgVElMRV9PUENfQkxFWl9TTiwKLSAgVElMRV9PUENfQkxFWlQsCi0gIFRJTEVfT1BDX0JMRVpUX1NOLAotICBUSUxFX09QQ19CTFosCi0gIFRJTEVfT1BDX0JMWl9TTiwKLSAgVElMRV9PUENfQkxaVCwKLSAgVElMRV9PUENfQkxaVF9TTiwKLSAgVElMRV9PUENfQk5aLAotICBUSUxFX09QQ19CTlpfU04sCi0gIFRJTEVfT1BDX0JOWlQsCi0gIFRJTEVfT1BDX0JOWlRfU04sCi0gIFRJTEVfT1BDX0JZVEVYLAotICBUSUxFX09QQ19CWVRFWF9TTiwKLSAgVElMRV9PUENfQlosCi0gIFRJTEVfT1BDX0JaX1NOLAotICBUSUxFX09QQ19CWlQsCi0gIFRJTEVfT1BDX0JaVF9TTiwKLSAgVElMRV9PUENfQ0xaLAotICBUSUxFX09QQ19DTFpfU04sCi0gIFRJTEVfT1BDX0NSQzMyXzMyLAotICBUSUxFX09QQ19DUkMzMl8zMl9TTiwKLSAgVElMRV9PUENfQ1JDMzJfOCwKLSAgVElMRV9PUENfQ1JDMzJfOF9TTiwKLSAgVElMRV9PUENfQ1RaLAotICBUSUxFX09QQ19DVFpfU04sCi0gIFRJTEVfT1BDX0RSQUlOLAotICBUSUxFX09QQ19EVExCUFIsCi0gIFRJTEVfT1BDX0RXT1JEX0FMSUdOLAotICBUSUxFX09QQ19EV09SRF9BTElHTl9TTiwKLSAgVElMRV9PUENfRklOViwKLSAgVElMRV9PUENfRkxVU0gsCi0gIFRJTEVfT1BDX0ZOT1AsCi0gIFRJTEVfT1BDX0lDT0gsCi0gIFRJTEVfT1BDX0lMTCwKLSAgVElMRV9PUENfSU5USEIsCi0gIFRJTEVfT1BDX0lOVEhCX1NOLAotICBUSUxFX09QQ19JTlRISCwKLSAgVElMRV9PUENfSU5USEhfU04sCi0gIFRJTEVfT1BDX0lOVExCLAotICBUSUxFX09QQ19JTlRMQl9TTiwKLSAgVElMRV9PUENfSU5UTEgsCi0gIFRJTEVfT1BDX0lOVExIX1NOLAotICBUSUxFX09QQ19JTlYsCi0gIFRJTEVfT1BDX0lSRVQsCi0gIFRJTEVfT1BDX0pBTEIsCi0gIFRJTEVfT1BDX0pBTEYsCi0gIFRJTEVfT1BDX0pBTFIsCi0gIFRJTEVfT1BDX0pBTFJQLAotICBUSUxFX09QQ19KQiwKLSAgVElMRV9PUENfSkYsCi0gIFRJTEVfT1BDX0pSLAotICBUSUxFX09QQ19KUlAsCi0gIFRJTEVfT1BDX0xCLAotICBUSUxFX09QQ19MQl9TTiwKLSAgVElMRV9PUENfTEJfVSwKLSAgVElMRV9PUENfTEJfVV9TTiwKLSAgVElMRV9PUENfTEJBREQsCi0gIFRJTEVfT1BDX0xCQUREX1NOLAotICBUSUxFX09QQ19MQkFERF9VLAotICBUSUxFX09QQ19MQkFERF9VX1NOLAotICBUSUxFX09QQ19MSCwKLSAgVElMRV9PUENfTEhfU04sCi0gIFRJTEVfT1BDX0xIX1UsCi0gIFRJTEVfT1BDX0xIX1VfU04sCi0gIFRJTEVfT1BDX0xIQURELAotICBUSUxFX09QQ19MSEFERF9TTiwKLSAgVElMRV9PUENfTEhBRERfVSwKLSAgVElMRV9PUENfTEhBRERfVV9TTiwKLSAgVElMRV9PUENfTE5LLAotICBUSUxFX09QQ19MTktfU04sCi0gIFRJTEVfT1BDX0xXLAotICBUSUxFX09QQ19MV19TTiwKLSAgVElMRV9PUENfTFdfTkEsCi0gIFRJTEVfT1BDX0xXX05BX1NOLAotICBUSUxFX09QQ19MV0FERCwKLSAgVElMRV9PUENfTFdBRERfU04sCi0gIFRJTEVfT1BDX0xXQUREX05BLAotICBUSUxFX09QQ19MV0FERF9OQV9TTiwKLSAgVElMRV9PUENfTUFYQl9VLAotICBUSUxFX09QQ19NQVhCX1VfU04sCi0gIFRJTEVfT1BDX01BWEgsCi0gIFRJTEVfT1BDX01BWEhfU04sCi0gIFRJTEVfT1BDX01BWElCX1UsCi0gIFRJTEVfT1BDX01BWElCX1VfU04sCi0gIFRJTEVfT1BDX01BWElILAotICBUSUxFX09QQ19NQVhJSF9TTiwKLSAgVElMRV9PUENfTUYsCi0gIFRJTEVfT1BDX01GU1BSLAotICBUSUxFX09QQ19NSU5CX1UsCi0gIFRJTEVfT1BDX01JTkJfVV9TTiwKLSAgVElMRV9PUENfTUlOSCwKLSAgVElMRV9PUENfTUlOSF9TTiwKLSAgVElMRV9PUENfTUlOSUJfVSwKLSAgVElMRV9PUENfTUlOSUJfVV9TTiwKLSAgVElMRV9PUENfTUlOSUgsCi0gIFRJTEVfT1BDX01JTklIX1NOLAotICBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU5aLAotICBUSUxFX09QQ19NTlpfU04sCi0gIFRJTEVfT1BDX01OWkIsCi0gIFRJTEVfT1BDX01OWkJfU04sCi0gIFRJTEVfT1BDX01OWkgsCi0gIFRJTEVfT1BDX01OWkhfU04sCi0gIFRJTEVfT1BDX01UU1BSLAotICBUSUxFX09QQ19NVUxISF9TUywKLSAgVElMRV9PUENfTVVMSEhfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhIX1NVLAotICBUSUxFX09QQ19NVUxISF9TVV9TTiwKLSAgVElMRV9PUENfTVVMSEhfVVUsCi0gIFRJTEVfT1BDX01VTEhIX1VVX1NOLAotICBUSUxFX09QQ19NVUxISEFfU1MsCi0gIFRJTEVfT1BDX01VTEhIQV9TU19TTiwKLSAgVElMRV9PUENfTVVMSEhBX1NVLAotICBUSUxFX09QQ19NVUxISEFfU1VfU04sCi0gIFRJTEVfT1BDX01VTEhIQV9VVSwKLSAgVElMRV9PUENfTVVMSEhBX1VVX1NOLAotICBUSUxFX09QQ19NVUxISFNBX1VVLAotICBUSUxFX09QQ19NVUxISFNBX1VVX1NOLAotICBUSUxFX09QQ19NVUxITF9TUywKLSAgVElMRV9PUENfTVVMSExfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhMX1NVLAotICBUSUxFX09QQ19NVUxITF9TVV9TTiwKLSAgVElMRV9PUENfTVVMSExfVVMsCi0gIFRJTEVfT1BDX01VTEhMX1VTX1NOLAotICBUSUxFX09QQ19NVUxITF9VVSwKLSAgVElMRV9PUENfTVVMSExfVVVfU04sCi0gIFRJTEVfT1BDX01VTEhMQV9TUywKLSAgVElMRV9PUENfTVVMSExBX1NTX1NOLAotICBUSUxFX09QQ19NVUxITEFfU1UsCi0gIFRJTEVfT1BDX01VTEhMQV9TVV9TTiwKLSAgVElMRV9PUENfTVVMSExBX1VTLAotICBUSUxFX09QQ19NVUxITEFfVVNfU04sCi0gIFRJTEVfT1BDX01VTEhMQV9VVSwKLSAgVElMRV9PUENfTVVMSExBX1VVX1NOLAotICBUSUxFX09QQ19NVUxITFNBX1VVLAotICBUSUxFX09QQ19NVUxITFNBX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTF9TUywKLSAgVElMRV9PUENfTVVMTExfU1NfU04sCi0gIFRJTEVfT1BDX01VTExMX1NVLAotICBUSUxFX09QQ19NVUxMTF9TVV9TTiwKLSAgVElMRV9PUENfTVVMTExfVVUsCi0gIFRJTEVfT1BDX01VTExMX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTEFfU1MsCi0gIFRJTEVfT1BDX01VTExMQV9TU19TTiwKLSAgVElMRV9PUENfTVVMTExBX1NVLAotICBUSUxFX09QQ19NVUxMTEFfU1VfU04sCi0gIFRJTEVfT1BDX01VTExMQV9VVSwKLSAgVElMRV9PUENfTVVMTExBX1VVX1NOLAotICBUSUxFX09QQ19NVUxMTFNBX1VVLAotICBUSUxFX09QQ19NVUxMTFNBX1VVX1NOLAotICBUSUxFX09QQ19NVk5aLAotICBUSUxFX09QQ19NVk5aX1NOLAotICBUSUxFX09QQ19NVlosCi0gIFRJTEVfT1BDX01WWl9TTiwKLSAgVElMRV9PUENfTVosCi0gIFRJTEVfT1BDX01aX1NOLAotICBUSUxFX09QQ19NWkIsCi0gIFRJTEVfT1BDX01aQl9TTiwKLSAgVElMRV9PUENfTVpILAotICBUSUxFX09QQ19NWkhfU04sCi0gIFRJTEVfT1BDX05BUCwKLSAgVElMRV9PUENfTk9QLAotICBUSUxFX09QQ19OT1IsCi0gIFRJTEVfT1BDX05PUl9TTiwKLSAgVElMRV9PUENfT1IsCi0gIFRJTEVfT1BDX09SX1NOLAotICBUSUxFX09QQ19PUkksCi0gIFRJTEVfT1BDX09SSV9TTiwKLSAgVElMRV9PUENfUEFDS0JTX1UsCi0gIFRJTEVfT1BDX1BBQ0tCU19VX1NOLAotICBUSUxFX09QQ19QQUNLSEIsCi0gIFRJTEVfT1BDX1BBQ0tIQl9TTiwKLSAgVElMRV9PUENfUEFDS0hTLAotICBUSUxFX09QQ19QQUNLSFNfU04sCi0gIFRJTEVfT1BDX1BBQ0tMQiwKLSAgVElMRV9PUENfUEFDS0xCX1NOLAotICBUSUxFX09QQ19QQ05ULAotICBUSUxFX09QQ19QQ05UX1NOLAotICBUSUxFX09QQ19STCwKLSAgVElMRV9PUENfUkxfU04sCi0gIFRJTEVfT1BDX1JMSSwKLSAgVElMRV9PUENfUkxJX1NOLAotICBUSUxFX09QQ19TMUEsCi0gIFRJTEVfT1BDX1MxQV9TTiwKLSAgVElMRV9PUENfUzJBLAotICBUSUxFX09QQ19TMkFfU04sCi0gIFRJTEVfT1BDX1MzQSwKLSAgVElMRV9PUENfUzNBX1NOLAotICBUSUxFX09QQ19TQURBQl9VLAotICBUSUxFX09QQ19TQURBQl9VX1NOLAotICBUSUxFX09QQ19TQURBSCwKLSAgVElMRV9PUENfU0FEQUhfU04sCi0gIFRJTEVfT1BDX1NBREFIX1UsCi0gIFRJTEVfT1BDX1NBREFIX1VfU04sCi0gIFRJTEVfT1BDX1NBREJfVSwKLSAgVElMRV9PUENfU0FEQl9VX1NOLAotICBUSUxFX09QQ19TQURILAotICBUSUxFX09QQ19TQURIX1NOLAotICBUSUxFX09QQ19TQURIX1UsCi0gIFRJTEVfT1BDX1NBREhfVV9TTiwKLSAgVElMRV9PUENfU0IsCi0gIFRJTEVfT1BDX1NCQURELAotICBUSUxFX09QQ19TRVEsCi0gIFRJTEVfT1BDX1NFUV9TTiwKLSAgVElMRV9PUENfU0VRQiwKLSAgVElMRV9PUENfU0VRQl9TTiwKLSAgVElMRV9PUENfU0VRSCwKLSAgVElMRV9PUENfU0VRSF9TTiwKLSAgVElMRV9PUENfU0VRSSwKLSAgVElMRV9PUENfU0VRSV9TTiwKLSAgVElMRV9PUENfU0VRSUIsCi0gIFRJTEVfT1BDX1NFUUlCX1NOLAotICBUSUxFX09QQ19TRVFJSCwKLSAgVElMRV9PUENfU0VRSUhfU04sCi0gIFRJTEVfT1BDX1NILAotICBUSUxFX09QQ19TSEFERCwKLSAgVElMRV9PUENfU0hMLAotICBUSUxFX09QQ19TSExfU04sCi0gIFRJTEVfT1BDX1NITEIsCi0gIFRJTEVfT1BDX1NITEJfU04sCi0gIFRJTEVfT1BDX1NITEgsCi0gIFRJTEVfT1BDX1NITEhfU04sCi0gIFRJTEVfT1BDX1NITEksCi0gIFRJTEVfT1BDX1NITElfU04sCi0gIFRJTEVfT1BDX1NITElCLAotICBUSUxFX09QQ19TSExJQl9TTiwKLSAgVElMRV9PUENfU0hMSUgsCi0gIFRJTEVfT1BDX1NITElIX1NOLAotICBUSUxFX09QQ19TSFIsCi0gIFRJTEVfT1BDX1NIUl9TTiwKLSAgVElMRV9PUENfU0hSQiwKLSAgVElMRV9PUENfU0hSQl9TTiwKLSAgVElMRV9PUENfU0hSSCwKLSAgVElMRV9PUENfU0hSSF9TTiwKLSAgVElMRV9PUENfU0hSSSwKLSAgVElMRV9PUENfU0hSSV9TTiwKLSAgVElMRV9PUENfU0hSSUIsCi0gIFRJTEVfT1BDX1NIUklCX1NOLAotICBUSUxFX09QQ19TSFJJSCwKLSAgVElMRV9PUENfU0hSSUhfU04sCi0gIFRJTEVfT1BDX1NMVCwKLSAgVElMRV9PUENfU0xUX1NOLAotICBUSUxFX09QQ19TTFRfVSwKLSAgVElMRV9PUENfU0xUX1VfU04sCi0gIFRJTEVfT1BDX1NMVEIsCi0gIFRJTEVfT1BDX1NMVEJfU04sCi0gIFRJTEVfT1BDX1NMVEJfVSwKLSAgVElMRV9PUENfU0xUQl9VX1NOLAotICBUSUxFX09QQ19TTFRFLAotICBUSUxFX09QQ19TTFRFX1NOLAotICBUSUxFX09QQ19TTFRFX1UsCi0gIFRJTEVfT1BDX1NMVEVfVV9TTiwKLSAgVElMRV9PUENfU0xURUIsCi0gIFRJTEVfT1BDX1NMVEVCX1NOLAotICBUSUxFX09QQ19TTFRFQl9VLAotICBUSUxFX09QQ19TTFRFQl9VX1NOLAotICBUSUxFX09QQ19TTFRFSCwKLSAgVElMRV9PUENfU0xURUhfU04sCi0gIFRJTEVfT1BDX1NMVEVIX1UsCi0gIFRJTEVfT1BDX1NMVEVIX1VfU04sCi0gIFRJTEVfT1BDX1NMVEgsCi0gIFRJTEVfT1BDX1NMVEhfU04sCi0gIFRJTEVfT1BDX1NMVEhfVSwKLSAgVElMRV9PUENfU0xUSF9VX1NOLAotICBUSUxFX09QQ19TTFRJLAotICBUSUxFX09QQ19TTFRJX1NOLAotICBUSUxFX09QQ19TTFRJX1UsCi0gIFRJTEVfT1BDX1NMVElfVV9TTiwKLSAgVElMRV9PUENfU0xUSUIsCi0gIFRJTEVfT1BDX1NMVElCX1NOLAotICBUSUxFX09QQ19TTFRJQl9VLAotICBUSUxFX09QQ19TTFRJQl9VX1NOLAotICBUSUxFX09QQ19TTFRJSCwKLSAgVElMRV9PUENfU0xUSUhfU04sCi0gIFRJTEVfT1BDX1NMVElIX1UsCi0gIFRJTEVfT1BDX1NMVElIX1VfU04sCi0gIFRJTEVfT1BDX1NORSwKLSAgVElMRV9PUENfU05FX1NOLAotICBUSUxFX09QQ19TTkVCLAotICBUSUxFX09QQ19TTkVCX1NOLAotICBUSUxFX09QQ19TTkVILAotICBUSUxFX09QQ19TTkVIX1NOLAotICBUSUxFX09QQ19TUkEsCi0gIFRJTEVfT1BDX1NSQV9TTiwKLSAgVElMRV9PUENfU1JBQiwKLSAgVElMRV9PUENfU1JBQl9TTiwKLSAgVElMRV9PUENfU1JBSCwKLSAgVElMRV9PUENfU1JBSF9TTiwKLSAgVElMRV9PUENfU1JBSSwKLSAgVElMRV9PUENfU1JBSV9TTiwKLSAgVElMRV9PUENfU1JBSUIsCi0gIFRJTEVfT1BDX1NSQUlCX1NOLAotICBUSUxFX09QQ19TUkFJSCwKLSAgVElMRV9PUENfU1JBSUhfU04sCi0gIFRJTEVfT1BDX1NVQiwKLSAgVElMRV9PUENfU1VCX1NOLAotICBUSUxFX09QQ19TVUJCLAotICBUSUxFX09QQ19TVUJCX1NOLAotICBUSUxFX09QQ19TVUJCU19VLAotICBUSUxFX09QQ19TVUJCU19VX1NOLAotICBUSUxFX09QQ19TVUJILAotICBUSUxFX09QQ19TVUJIX1NOLAotICBUSUxFX09QQ19TVUJIUywKLSAgVElMRV9PUENfU1VCSFNfU04sCi0gIFRJTEVfT1BDX1NVQlMsCi0gIFRJTEVfT1BDX1NVQlNfU04sCi0gIFRJTEVfT1BDX1NXLAotICBUSUxFX09QQ19TV0FERCwKLSAgVElMRV9PUENfU1dJTlQwLAotICBUSUxFX09QQ19TV0lOVDEsCi0gIFRJTEVfT1BDX1NXSU5UMiwKLSAgVElMRV9PUENfU1dJTlQzLAotICBUSUxFX09QQ19UQkxJRFhCMCwKLSAgVElMRV9PUENfVEJMSURYQjBfU04sCi0gIFRJTEVfT1BDX1RCTElEWEIxLAotICBUSUxFX09QQ19UQkxJRFhCMV9TTiwKLSAgVElMRV9PUENfVEJMSURYQjIsCi0gIFRJTEVfT1BDX1RCTElEWEIyX1NOLAotICBUSUxFX09QQ19UQkxJRFhCMywKLSAgVElMRV9PUENfVEJMSURYQjNfU04sCi0gIFRJTEVfT1BDX1ROUywKLSAgVElMRV9PUENfVE5TX1NOLAotICBUSUxFX09QQ19XSDY0LAotICBUSUxFX09QQ19YT1IsCi0gIFRJTEVfT1BDX1hPUl9TTiwKLSAgVElMRV9PUENfWE9SSSwKLSAgVElMRV9PUENfWE9SSV9TTiwKLSAgVElMRV9PUENfTk9ORQotfSB0aWxlX21uZW1vbmljOwotCi0vKiA2NC1iaXQgcGF0dGVybiBmb3IgYSB7IGJwdCA7IG5vcCB9IGJ1bmRsZS4gKi8KLSNkZWZpbmUgVElMRV9CUFRfQlVORExFIDB4NDAwYjNjYWU3MDE2NjAwMFVMTAotCi0KLSNkZWZpbmUgVElMRV9FTEZfTUFDSElORV9DT0RFIEVNX1RJTEVQUk8KLQotI2RlZmluZSBUSUxFX0VMRl9OQU1FICJlbGYzMi10aWxlcHJvIgotCi0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Cck9mZl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQnJPZmZfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQnJUeXBlX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0Rlc3RfSW1tOF9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwMDBjMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1NOKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyKSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAwKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0Rlc3RfWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9ZMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tT3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHg3Zik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW1PcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweDdmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbVJST3Bjb2RlRXh0ZW5zaW9uX1NOKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA4KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSk9mZkxvbmdfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDAwMDA3ZmZmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMjApKSAmIDB4MDAwMTgwMDApIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAxNCkpICYgMHgwMDFlMDAwMCkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE2KSkgJiAweDA3ZTAwMDAwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MTgwMDAwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSk9mZl9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MDAwMDdmZmYpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAyMCkpICYgMHgwMDAxODAwMCkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDE0KSkgJiAweDAwMWUwMDAwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMTYpKSAmIDB4MDdlMDAwMDApIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwODAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NRl9JbW0xNV9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMDNmZmYpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0NCkpICYgMHgwMDAwNDAwMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NTUVuZF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTU1FbmRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01NU3RhcnRfWDAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDIzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01NU3RhcnRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDU0KSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01UX0ltbTE1X1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDAzZmMwKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDQpKSAmIDB4MDAwMDQwMDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTW9kZSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNjMpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Ob1JlZ09wY29kZUV4dGVuc2lvbl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfT3Bjb2RlX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyOCkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTkpKSAmIDB4Zik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9PcGNvZGVfWTAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI3KSkgJiAweGYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfT3Bjb2RlX1kxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OSkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMih0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTYpKSAmIDB4Nyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUk9wY29kZUV4dGVuc2lvbl9TTih0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gNCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4MWZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDkpKSAmIDB4MWZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUlJPcGNvZGVFeHRlbnNpb25fWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUm91dGVPcGNvZGVFeHRlbnNpb25fU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NfWDAodGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI3KSkgJiAweDEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU19YMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTgpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaEFtdF9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoQW10X1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaEFtdF9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gNikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNBX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNBX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTIodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgobiA+PiAyNikpICYgMHgwMDAwMDAwMSkgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDUwKSkgJiAweDAwMDAwMDNlKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0JEZXN0X1kyKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kxKHRpbGVfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNfU04odGlsZV9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Vbk9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfVW5PcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDFmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuT3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Vbk9wY29kZUV4dGVuc2lvbl9ZMSh0aWxlX2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfVW5TaE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlX2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTcpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWDEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ4KSkgJiAweDNmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9VblNoT3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxNykpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuU2hPcGNvZGVFeHRlbnNpb25fWTEodGlsZV9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ4KSkgJiAweDcpOwotfQotCi0KLXN0YXRpYyBfX2lubGluZSBpbnQKLXNpZ25fZXh0ZW5kKGludCBuLCBpbnQgbnVtX2JpdHMpCi17Ci0gIGludCBzaGlmdCA9IChpbnQpKHNpemVvZihpbnQpICogOCAtIG51bV9iaXRzKTsKLSAgcmV0dXJuIChuIDw8IHNoaWZ0KSA+PiBzaGlmdDsKLX0KLQotCi0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfQnJPZmZfU04oaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9Cck9mZl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDdmZmYpKSA8PCA0MykgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMTgwMDApKSA8PCAyMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfQnJUeXBlX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgMzEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfSW1tOF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwYzApKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzKSA8PCAyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW0xNl9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZmZmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tMTZfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweGZmZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW1PcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4N2YpIDw8IDIwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW1PcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDdmKSkgPDwgNTEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0ltbVJST3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX0pPZmZMb25nX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwN2ZmZikpIDw8IDQzKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAxODAwMCkpIDw8IDIwKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDFlMDAwMCkpIDw8IDE0KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwN2UwMDAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxODAwMDAwMCkpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwN2ZmZikpIDw8IDQzKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAxODAwMCkpIDw8IDIwKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDFlMDAwMCkpIDw8IDE0KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwN2UwMDAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwODAwMDAwMCkpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NRl9JbW0xNV9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDNmZmYpKSA8PCAzNykgfAotICAgICAgICAgKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MDAwMDQwMDApKSA8PCA0NCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfTU1FbmRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MWYpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NTUVuZF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4MWYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfTU1TdGFydF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgxZikgPDwgMjMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX01NU3RhcnRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNTQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX01UX0ltbTE1X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZikpIDw8IDMxKSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwM2ZjMCkpIDw8IDM3KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwNDAwMCkpIDw8IDQ0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9Nb2RlKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxKSkgPDwgNjMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX05vUmVnT3Bjb2RlRXh0ZW5zaW9uX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGYpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMTApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHg3KSA8PCAyOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfT3Bjb2RlX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCAyNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfT3Bjb2RlX1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHhmKSkgPDwgNTkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4NykpIDw8IDU2KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUk9wY29kZUV4dGVuc2lvbl9TTihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCA0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MWZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxZmYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDMpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfUm91dGVPcGNvZGVFeHRlbnNpb25fU04oaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDEpIDw8IDI3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgxKSkgPDwgNTgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0FfWTIoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4MDAwMDAwMDEpIDw8IDI2KSB8Ci0gICAgICAgICAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDAzZSkpIDw8IDUwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCRGVzdF9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMjApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1NyY0JfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlX2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjX1NOKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5PcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuT3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDFmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5PcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDFmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlX2J1bmRsZV9iaXRzCi1jcmVhdGVfVW5TaE9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZV9idW5kbGVfYml0cykobiAmIDB4M2ZmKSkgPDwgNDgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4NykgPDwgMTcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZV9idW5kbGVfYml0cwotY3JlYXRlX1VuU2hPcGNvZGVFeHRlbnNpb25fWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVfYnVuZGxlX2JpdHMpKG4gJiAweDcpKSA8PCA0OCk7Ci19Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgVElMRV9QSVBFTElORV9YMCwKLSAgVElMRV9QSVBFTElORV9YMSwKLSAgVElMRV9QSVBFTElORV9ZMCwKLSAgVElMRV9QSVBFTElORV9ZMSwKLSAgVElMRV9QSVBFTElORV9ZMiwKLX0gdGlsZV9waXBlbGluZTsKLQotI2RlZmluZSB0aWxlX2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRV9QSVBFTElORV9YMSkKLQotdHlwZWRlZiBlbnVtCi17Ci0gIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwKLSAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwKLSAgVElMRV9PUF9UWVBFX0FERFJFU1MsCi0gIFRJTEVfT1BfVFlQRV9TUFIKLX0gdGlsZV9vcGVyYW5kX3R5cGU7Ci0KLS8qIFRoaXMgaXMgdGhlIGJpdCB0aGF0IGRldGVybWluZXMgaWYgYSBidW5kbGUgaXMgaW4gdGhlIFkgZW5jb2RpbmcuICovCi0jZGVmaW5lIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSyAoKHRpbGVfYnVuZGxlX2JpdHMpMSA8PCA2MykKLQotZW51bQotewotICAvKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gYSBidW5kbGUgKDIgZm9yIFgsIDMgZm9yIFkpLiAqLwotICBUSUxFX01BWF9JTlNUUlVDVElPTlNfUEVSX0JVTkRMRSA9IDMsCi0KLSAgLyogSG93IG1hbnkgZGlmZmVyZW50IHBpcGVsaW5lIGVuY29kaW5ncyBhcmUgdGhlcmU/IFgwLCBYMSwgWTAsIFkxLCBZMi4gKi8KLSAgVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVfQlVORExFX1NJWkVfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUyA9IDMsCi0KLSAgLyogSW5zdHJ1Y3Rpb25zIHRha2UgdGhpcyBtYW55IGJ5dGVzLiAqLwotICBUSUxFX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMsCi0KLSAgLyogTG9nIGJhc2UgMiBvZiBUSUxFX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKLQotICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KLSAgVElMRV9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0KLSAgICAoMSA8PCBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyksCi0KLSAgLyogTG9nIGJhc2UgMiBvZiBUSUxFX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMuICovCi0gIFRJTEVfTE9HMl9TTl9JTlNUUlVDVElPTl9TSVpFX0lOX0JZVEVTID0gMSwKLQotICAvKiBTdGF0aWMgbmV0d29yayBpbnN0cnVjdGlvbnMgdGFrZSB0aGlzIG1hbnkgYnl0ZXMuICovCi0gIFRJTEVfU05fSU5TVFJVQ1RJT05fU0laRV9JTl9CWVRFUyA9Ci0gICAgKDEgPDwgVElMRV9MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMpLAotCi0gIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KLSAgVElMRV9OVU1fUkVHSVNURVJTID0gNjQsCi0KLSAgLyogTnVtYmVyIG9mIHN0YXRpYyBuZXR3b3JrIHJlZ2lzdGVycy4gKi8KLSAgVElMRV9OVU1fU05fUkVHSVNURVJTID0gNAotfTsKLQotCi1zdHJ1Y3QgdGlsZV9vcGVyYW5kCi17Ci0gIC8qIElzIHRoaXMgb3BlcmFuZCBhIHJlZ2lzdGVyLCBpbW1lZGlhdGUgb3IgYWRkcmVzcz8gKi8KLSAgdGlsZV9vcGVyYW5kX3R5cGUgdHlwZTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIHR5cGUgZm9yIHRoaXMgb3BlcmFuZC4gICovCi0gIHNpZ25lZCBpbnQgZGVmYXVsdF9yZWxvYyA6IDE2OwotCi0gIC8qIEhvdyBtYW55IGJpdHMgaXMgdGhpcyB2YWx1ZT8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2JpdHMgOiA1OwotCi0gIC8qIElzIHRoZSB2YWx1ZSBzaWduZWQ/ICh1c2VkIGZvciByYW5nZSBjaGVja2luZykgKi8KLSAgdW5zaWduZWQgaW50IGlzX3NpZ25lZCA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIGEgc291cmNlIHJlZ2lzdGVyPyAqLwotICB1bnNpZ25lZCBpbnQgaXNfc3JjX3JlZyA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIHdyaXR0ZW4/IChpLmUuIGlzIGl0IGEgZGVzdGluYXRpb24gcmVnaXN0ZXIpICovCi0gIHVuc2lnbmVkIGludCBpc19kZXN0X3JlZyA6IDE7Ci0KLSAgLyogSXMgdGhpcyBvcGVyYW5kIFBDLXJlbGF0aXZlPyAqLwotICB1bnNpZ25lZCBpbnQgaXNfcGNfcmVsYXRpdmUgOiAxOwotCi0gIC8qIEJ5IGhvdyBtYW55IGJpdHMgZG8gd2UgcmlnaHQgc2hpZnQgdGhlIHZhbHVlIGJlZm9yZSBpbnNlcnRpbmc/ICovCi0gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0IDogMjsKLQotICAvKiBSZXR1cm4gdGhlIGJpdHMgZm9yIHRoaXMgb3BlcmFuZCB0byBiZSBPUmVkIGludG8gYW4gZXhpc3RpbmcgYnVuZGxlLiAqLwotICB0aWxlX2J1bmRsZV9iaXRzICgqaW5zZXJ0KSAoaW50IG9wKTsKLQotICAvKiBFeHRyYWN0IHRoaXMgb3BlcmFuZCBhbmQgcmV0dXJuIGl0LiAqLwotICB1bnNpZ25lZCBpbnQgKCpleHRyYWN0KSAodGlsZV9idW5kbGVfYml0cyBidW5kbGUpOwotfTsKLQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpbGVfb3BlcmFuZCB0aWxlX29wZXJhbmRzW107Ci0KLS8qIE9uZSBmaW5pdGUtc3RhdGUgbWFjaGluZSBwZXIgcGlwZSBmb3IgcmFwaWQgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcuICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgKiBjb25zdAotdGlsZV9idW5kbGVfZGVjb2Rlcl9mc21zW1RJTEVfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU107Ci0KLQotc3RydWN0IHRpbGVfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbW5lbW9uaWMsIGUuZy4gImFkZCIgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgZW51bSB2YWx1ZSBmb3IgdGhpcyBtbmVtb25pYy4gKi8KLSAgdGlsZV9tbmVtb25pYyBtbmVtb25pYzsKLQotICAvKiBBIGJpdCBtYXNrIG9mIHdoaWNoIG9mIHRoZSBmaXZlIHBpcGVzIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgY29tcGF0aWJsZSB3aXRoOgotICAgICBYMCAgMHgwMQotICAgICBYMSAgMHgwMgotICAgICBZMCAgMHgwNAotICAgICBZMSAgMHgwOAotICAgICBZMiAgMHgxMCAqLwotICB1bnNpZ25lZCBjaGFyIHBpcGVzOwotCi0gIC8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSB0aGVyZT8gKi8KLSAgdW5zaWduZWQgY2hhciBudW1fb3BlcmFuZHM7Ci0KLSAgLyogV2hpY2ggcmVnaXN0ZXIgZG9lcyB0aGlzIHdyaXRlIGltcGxpY2l0bHksIG9yIFRSRUdfWkVSTyBpZiBub25lPyAqLwotICB1bnNpZ25lZCBjaGFyIGltcGxpY2l0bHlfd3JpdHRlbl9yZWdpc3RlcjsKLQotICAvKiBDYW4gdGhpcyBiZSBidW5kbGVkIHdpdGggb3RoZXIgaW5zdHJ1Y3Rpb25zIChhbG1vc3QgYWx3YXlzIHRydWUpLiAqLwotICB1bnNpZ25lZCBjaGFyIGNhbl9idW5kbGU7Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcy4gRWFjaCBvZiB0aGVzZSBpcyBhbgotICAgKiBpbmRleCBpbnRvIHRoZSB0aWxlX29wZXJhbmRzW10gdGFibGUuICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXVtUSUxFX01BWF9PUEVSQU5EU107Ci0KLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgdGlsZV9vcGNvZGVzW107Ci0KLQotLyogVXNlZCBmb3Igbm9uLXRleHR1YWwgZGlzYXNzZW1ibHkgaW50byBzdHJ1Y3RzLiAqLwotc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbgotewotICBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpbGVfb3BlcmFuZCAqb3BlcmFuZHNbVElMRV9NQVhfT1BFUkFORFNdOwotICBpbnQgb3BlcmFuZF92YWx1ZXNbVElMRV9NQVhfT1BFUkFORFNdOwotfTsKLQotCi0vKiBEaXNhc3NlbWJsZSBhIGJ1bmRsZSBpbnRvIGEgc3RydWN0IGZvciBtYWNoaW5lIHByb2Nlc3NpbmcuICovCi1leHRlcm4gaW50IHBhcnNlX2luc25fdGlsZSh0aWxlX2J1bmRsZV9iaXRzIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGlsZV9kZWNvZGVkX2luc3RydWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkW1RJTEVfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFXSk7Ci0KLQotLyogR2l2ZW4gYSBzZXQgb2YgYnVuZGxlIGJpdHMgYW5kIGEgc3BlY2lmaWMgcGlwZSwgcmV0dXJucyB3aGljaAotICogaW5zdHJ1Y3Rpb24gdGhlIGJ1bmRsZSBjb250YWlucyBpbiB0aGF0IHBpcGUuCi0gKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZV9vcGNvZGUgKgotZmluZF9vcGNvZGUodGlsZV9idW5kbGVfYml0cyBiaXRzLCB0aWxlX3BpcGVsaW5lIHBpcGUpOwotCi0KLQotI2VuZGlmIC8qIG9wY29kZV90aWxlX2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGUtdGlsZV82NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlXzY0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjMzNDYuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZS10aWxlXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ4ICswLDAgQEAKLS8qIHRpbGUuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVElMRSBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFRpbGVyYSBDb3JwLiAqLwotCi0jaWZuZGVmIG9wY29kZV90aWxlX2gKLSNkZWZpbmUgb3Bjb2RlX3RpbGVfaAotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB0aWxlZ3hfYnVuZGxlX2JpdHM7Ci0KLQotZW51bQotewotICBUSUxFR1hfTUFYX09QRVJBTkRTID0gNCAvKiBiZmV4dHMgKi8KLX07Ci0KLXR5cGVkZWYgZW51bQotewotICBUSUxFR1hfT1BDX0JQVCwKLSAgVElMRUdYX09QQ19JTkZPLAotICBUSUxFR1hfT1BDX0lORk9MLAotICBUSUxFR1hfT1BDX01PVkUsCi0gIFRJTEVHWF9PUENfTU9WRUksCi0gIFRJTEVHWF9PUENfTU9WRUxJLAotICBUSUxFR1hfT1BDX1BSRUZFVENILAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMSwKLSAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDFfRkFVTFQsCi0gIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wyLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMl9GQVVMVCwKLSAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDMsCi0gIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wzX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wxLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wxX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wyLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wyX0ZBVUxULAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wzLAotICBUSUxFR1hfT1BDX1BSRUZFVENIX0wzX0ZBVUxULAotICBUSUxFR1hfT1BDX1JBSVNFLAotICBUSUxFR1hfT1BDX0FERCwKLSAgVElMRUdYX09QQ19BRERJLAotICBUSUxFR1hfT1BDX0FERExJLAotICBUSUxFR1hfT1BDX0FERFgsCi0gIFRJTEVHWF9PUENfQUREWEksCi0gIFRJTEVHWF9PUENfQUREWExJLAotICBUSUxFR1hfT1BDX0FERFhTQywKLSAgVElMRUdYX09QQ19BTkQsCi0gIFRJTEVHWF9PUENfQU5ESSwKLSAgVElMRUdYX09QQ19CRVFaLAotICBUSUxFR1hfT1BDX0JFUVpULAotICBUSUxFR1hfT1BDX0JGRVhUUywKLSAgVElMRUdYX09QQ19CRkVYVFUsCi0gIFRJTEVHWF9PUENfQkZJTlMsCi0gIFRJTEVHWF9PUENfQkdFWiwKLSAgVElMRUdYX09QQ19CR0VaVCwKLSAgVElMRUdYX09QQ19CR1RaLAotICBUSUxFR1hfT1BDX0JHVFpULAotICBUSUxFR1hfT1BDX0JMQkMsCi0gIFRJTEVHWF9PUENfQkxCQ1QsCi0gIFRJTEVHWF9PUENfQkxCUywKLSAgVElMRUdYX09QQ19CTEJTVCwKLSAgVElMRUdYX09QQ19CTEVaLAotICBUSUxFR1hfT1BDX0JMRVpULAotICBUSUxFR1hfT1BDX0JMVFosCi0gIFRJTEVHWF9PUENfQkxUWlQsCi0gIFRJTEVHWF9PUENfQk5FWiwKLSAgVElMRUdYX09QQ19CTkVaVCwKLSAgVElMRUdYX09QQ19DTFosCi0gIFRJTEVHWF9PUENfQ01PVkVRWiwKLSAgVElMRUdYX09QQ19DTU9WTkVaLAotICBUSUxFR1hfT1BDX0NNUEVRLAotICBUSUxFR1hfT1BDX0NNUEVRSSwKLSAgVElMRUdYX09QQ19DTVBFWENILAotICBUSUxFR1hfT1BDX0NNUEVYQ0g0LAotICBUSUxFR1hfT1BDX0NNUExFUywKLSAgVElMRUdYX09QQ19DTVBMRVUsCi0gIFRJTEVHWF9PUENfQ01QTFRTLAotICBUSUxFR1hfT1BDX0NNUExUU0ksCi0gIFRJTEVHWF9PUENfQ01QTFRVLAotICBUSUxFR1hfT1BDX0NNUExUVUksCi0gIFRJTEVHWF9PUENfQ01QTkUsCi0gIFRJTEVHWF9PUENfQ01VTCwKLSAgVElMRUdYX09QQ19DTVVMQSwKLSAgVElMRUdYX09QQ19DTVVMQUYsCi0gIFRJTEVHWF9PUENfQ01VTEYsCi0gIFRJTEVHWF9PUENfQ01VTEZSLAotICBUSUxFR1hfT1BDX0NNVUxILAotICBUSUxFR1hfT1BDX0NNVUxIUiwKLSAgVElMRUdYX09QQ19DUkMzMl8zMiwKLSAgVElMRUdYX09QQ19DUkMzMl84LAotICBUSUxFR1hfT1BDX0NUWiwKLSAgVElMRUdYX09QQ19EQkxBTElHTiwKLSAgVElMRUdYX09QQ19EQkxBTElHTjIsCi0gIFRJTEVHWF9PUENfREJMQUxJR040LAotICBUSUxFR1hfT1BDX0RCTEFMSUdONiwKLSAgVElMRUdYX09QQ19EUkFJTiwKLSAgVElMRUdYX09QQ19EVExCUFIsCi0gIFRJTEVHWF9PUENfRVhDSCwKLSAgVElMRUdYX09QQ19FWENINCwKLSAgVElMRUdYX09QQ19GRE9VQkxFX0FERF9GTEFHUywKLSAgVElMRUdYX09QQ19GRE9VQkxFX0FERFNVQiwKLSAgVElMRUdYX09QQ19GRE9VQkxFX01VTF9GTEFHUywKLSAgVElMRUdYX09QQ19GRE9VQkxFX1BBQ0sxLAotICBUSUxFR1hfT1BDX0ZET1VCTEVfUEFDSzIsCi0gIFRJTEVHWF9PUENfRkRPVUJMRV9TVUJfRkxBR1MsCi0gIFRJTEVHWF9PUENfRkRPVUJMRV9VTlBBQ0tfTUFYLAotICBUSUxFR1hfT1BDX0ZET1VCTEVfVU5QQUNLX01JTiwKLSAgVElMRUdYX09QQ19GRVRDSEFERCwKLSAgVElMRUdYX09QQ19GRVRDSEFERDQsCi0gIFRJTEVHWF9PUENfRkVUQ0hBRERHRVosCi0gIFRJTEVHWF9PUENfRkVUQ0hBRERHRVo0LAotICBUSUxFR1hfT1BDX0ZFVENIQU5ELAotICBUSUxFR1hfT1BDX0ZFVENIQU5ENCwKLSAgVElMRUdYX09QQ19GRVRDSE9SLAotICBUSUxFR1hfT1BDX0ZFVENIT1I0LAotICBUSUxFR1hfT1BDX0ZJTlYsCi0gIFRJTEVHWF9PUENfRkxVU0gsCi0gIFRJTEVHWF9PUENfRkxVU0hXQiwKLSAgVElMRUdYX09QQ19GTk9QLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfQUREMSwKLSAgVElMRUdYX09QQ19GU0lOR0xFX0FERFNVQjIsCi0gIFRJTEVHWF9PUENfRlNJTkdMRV9NVUwxLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfTVVMMiwKLSAgVElMRUdYX09QQ19GU0lOR0xFX1BBQ0sxLAotICBUSUxFR1hfT1BDX0ZTSU5HTEVfUEFDSzIsCi0gIFRJTEVHWF9PUENfRlNJTkdMRV9TVUIxLAotICBUSUxFR1hfT1BDX0lDT0gsCi0gIFRJTEVHWF9PUENfSUxMLAotICBUSUxFR1hfT1BDX0lOViwKLSAgVElMRUdYX09QQ19JUkVULAotICBUSUxFR1hfT1BDX0osCi0gIFRJTEVHWF9PUENfSkFMLAotICBUSUxFR1hfT1BDX0pBTFIsCi0gIFRJTEVHWF9PUENfSkFMUlAsCi0gIFRJTEVHWF9PUENfSlIsCi0gIFRJTEVHWF9PUENfSlJQLAotICBUSUxFR1hfT1BDX0xELAotICBUSUxFR1hfT1BDX0xEMVMsCi0gIFRJTEVHWF9PUENfTEQxU19BREQsCi0gIFRJTEVHWF9PUENfTEQxVSwKLSAgVElMRUdYX09QQ19MRDFVX0FERCwKLSAgVElMRUdYX09QQ19MRDJTLAotICBUSUxFR1hfT1BDX0xEMlNfQURELAotICBUSUxFR1hfT1BDX0xEMlUsCi0gIFRJTEVHWF9PUENfTEQyVV9BREQsCi0gIFRJTEVHWF9PUENfTEQ0UywKLSAgVElMRUdYX09QQ19MRDRTX0FERCwKLSAgVElMRUdYX09QQ19MRDRVLAotICBUSUxFR1hfT1BDX0xENFVfQURELAotICBUSUxFR1hfT1BDX0xEX0FERCwKLSAgVElMRUdYX09QQ19MRE5BLAotICBUSUxFR1hfT1BDX0xETkFfQURELAotICBUSUxFR1hfT1BDX0xETlQsCi0gIFRJTEVHWF9PUENfTEROVDFTLAotICBUSUxFR1hfT1BDX0xETlQxU19BREQsCi0gIFRJTEVHWF9PUENfTEROVDFVLAotICBUSUxFR1hfT1BDX0xETlQxVV9BREQsCi0gIFRJTEVHWF9PUENfTEROVDJTLAotICBUSUxFR1hfT1BDX0xETlQyU19BREQsCi0gIFRJTEVHWF9PUENfTEROVDJVLAotICBUSUxFR1hfT1BDX0xETlQyVV9BREQsCi0gIFRJTEVHWF9PUENfTEROVDRTLAotICBUSUxFR1hfT1BDX0xETlQ0U19BREQsCi0gIFRJTEVHWF9PUENfTEROVDRVLAotICBUSUxFR1hfT1BDX0xETlQ0VV9BREQsCi0gIFRJTEVHWF9PUENfTEROVF9BREQsCi0gIFRJTEVHWF9PUENfTE5LLAotICBUSUxFR1hfT1BDX01GLAotICBUSUxFR1hfT1BDX01GU1BSLAotICBUSUxFR1hfT1BDX01NLAotICBUSUxFR1hfT1BDX01OWiwKLSAgVElMRUdYX09QQ19NVFNQUiwKLSAgVElMRUdYX09QQ19NVUxfSFNfSFMsCi0gIFRJTEVHWF9PUENfTVVMX0hTX0hVLAotICBUSUxFR1hfT1BDX01VTF9IU19MUywKLSAgVElMRUdYX09QQ19NVUxfSFNfTFUsCi0gIFRJTEVHWF9PUENfTVVMX0hVX0hVLAotICBUSUxFR1hfT1BDX01VTF9IVV9MUywKLSAgVElMRUdYX09QQ19NVUxfSFVfTFUsCi0gIFRJTEVHWF9PUENfTVVMX0xTX0xTLAotICBUSUxFR1hfT1BDX01VTF9MU19MVSwKLSAgVElMRUdYX09QQ19NVUxfTFVfTFUsCi0gIFRJTEVHWF9PUENfTVVMQV9IU19IUywKLSAgVElMRUdYX09QQ19NVUxBX0hTX0hVLAotICBUSUxFR1hfT1BDX01VTEFfSFNfTFMsCi0gIFRJTEVHWF9PUENfTVVMQV9IU19MVSwKLSAgVElMRUdYX09QQ19NVUxBX0hVX0hVLAotICBUSUxFR1hfT1BDX01VTEFfSFVfTFMsCi0gIFRJTEVHWF9PUENfTVVMQV9IVV9MVSwKLSAgVElMRUdYX09QQ19NVUxBX0xTX0xTLAotICBUSUxFR1hfT1BDX01VTEFfTFNfTFUsCi0gIFRJTEVHWF9PUENfTVVMQV9MVV9MVSwKLSAgVElMRUdYX09QQ19NVUxBWCwKLSAgVElMRUdYX09QQ19NVUxYLAotICBUSUxFR1hfT1BDX01aLAotICBUSUxFR1hfT1BDX05BUCwKLSAgVElMRUdYX09QQ19OT1AsCi0gIFRJTEVHWF9PUENfTk9SLAotICBUSUxFR1hfT1BDX09SLAotICBUSUxFR1hfT1BDX09SSSwKLSAgVElMRUdYX09QQ19QQ05ULAotICBUSUxFR1hfT1BDX1JFVkJJVFMsCi0gIFRJTEVHWF9PUENfUkVWQllURVMsCi0gIFRJTEVHWF9PUENfUk9UTCwKLSAgVElMRUdYX09QQ19ST1RMSSwKLSAgVElMRUdYX09QQ19TSEwsCi0gIFRJTEVHWF9PUENfU0hMMTZJTlNMSSwKLSAgVElMRUdYX09QQ19TSEwxQURELAotICBUSUxFR1hfT1BDX1NITDFBRERYLAotICBUSUxFR1hfT1BDX1NITDJBREQsCi0gIFRJTEVHWF9PUENfU0hMMkFERFgsCi0gIFRJTEVHWF9PUENfU0hMM0FERCwKLSAgVElMRUdYX09QQ19TSEwzQUREWCwKLSAgVElMRUdYX09QQ19TSExJLAotICBUSUxFR1hfT1BDX1NITFgsCi0gIFRJTEVHWF9PUENfU0hMWEksCi0gIFRJTEVHWF9PUENfU0hSUywKLSAgVElMRUdYX09QQ19TSFJTSSwKLSAgVElMRUdYX09QQ19TSFJVLAotICBUSUxFR1hfT1BDX1NIUlVJLAotICBUSUxFR1hfT1BDX1NIUlVYLAotICBUSUxFR1hfT1BDX1NIUlVYSSwKLSAgVElMRUdYX09QQ19TSFVGRkxFQllURVMsCi0gIFRJTEVHWF9PUENfU1QsCi0gIFRJTEVHWF9PUENfU1QxLAotICBUSUxFR1hfT1BDX1NUMV9BREQsCi0gIFRJTEVHWF9PUENfU1QyLAotICBUSUxFR1hfT1BDX1NUMl9BREQsCi0gIFRJTEVHWF9PUENfU1Q0LAotICBUSUxFR1hfT1BDX1NUNF9BREQsCi0gIFRJTEVHWF9PUENfU1RfQURELAotICBUSUxFR1hfT1BDX1NUTlQsCi0gIFRJTEVHWF9PUENfU1ROVDEsCi0gIFRJTEVHWF9PUENfU1ROVDFfQURELAotICBUSUxFR1hfT1BDX1NUTlQyLAotICBUSUxFR1hfT1BDX1NUTlQyX0FERCwKLSAgVElMRUdYX09QQ19TVE5UNCwKLSAgVElMRUdYX09QQ19TVE5UNF9BREQsCi0gIFRJTEVHWF9PUENfU1ROVF9BREQsCi0gIFRJTEVHWF9PUENfU1VCLAotICBUSUxFR1hfT1BDX1NVQlgsCi0gIFRJTEVHWF9PUENfU1VCWFNDLAotICBUSUxFR1hfT1BDX1NXSU5UMCwKLSAgVElMRUdYX09QQ19TV0lOVDEsCi0gIFRJTEVHWF9PUENfU1dJTlQyLAotICBUSUxFR1hfT1BDX1NXSU5UMywKLSAgVElMRUdYX09QQ19UQkxJRFhCMCwKLSAgVElMRUdYX09QQ19UQkxJRFhCMSwKLSAgVElMRUdYX09QQ19UQkxJRFhCMiwKLSAgVElMRUdYX09QQ19UQkxJRFhCMywKLSAgVElMRUdYX09QQ19WMUFERCwKLSAgVElMRUdYX09QQ19WMUFEREksCi0gIFRJTEVHWF9PUENfVjFBRERVQywKLSAgVElMRUdYX09QQ19WMUFESUZGVSwKLSAgVElMRUdYX09QQ19WMUFWR1UsCi0gIFRJTEVHWF9PUENfVjFDTVBFUSwKLSAgVElMRUdYX09QQ19WMUNNUEVRSSwKLSAgVElMRUdYX09QQ19WMUNNUExFUywKLSAgVElMRUdYX09QQ19WMUNNUExFVSwKLSAgVElMRUdYX09QQ19WMUNNUExUUywKLSAgVElMRUdYX09QQ19WMUNNUExUU0ksCi0gIFRJTEVHWF9PUENfVjFDTVBMVFUsCi0gIFRJTEVHWF9PUENfVjFDTVBMVFVJLAotICBUSUxFR1hfT1BDX1YxQ01QTkUsCi0gIFRJTEVHWF9PUENfVjFERE9UUFUsCi0gIFRJTEVHWF9PUENfVjFERE9UUFVBLAotICBUSUxFR1hfT1BDX1YxRERPVFBVUywKLSAgVElMRUdYX09QQ19WMURET1RQVVNBLAotICBUSUxFR1hfT1BDX1YxRE9UUCwKLSAgVElMRUdYX09QQ19WMURPVFBBLAotICBUSUxFR1hfT1BDX1YxRE9UUFUsCi0gIFRJTEVHWF9PUENfVjFET1RQVUEsCi0gIFRJTEVHWF9PUENfVjFET1RQVVMsCi0gIFRJTEVHWF9PUENfVjFET1RQVVNBLAotICBUSUxFR1hfT1BDX1YxSU5UX0gsCi0gIFRJTEVHWF9PUENfVjFJTlRfTCwKLSAgVElMRUdYX09QQ19WMU1BWFUsCi0gIFRJTEVHWF9PUENfVjFNQVhVSSwKLSAgVElMRUdYX09QQ19WMU1JTlUsCi0gIFRJTEVHWF9PUENfVjFNSU5VSSwKLSAgVElMRUdYX09QQ19WMU1OWiwKLSAgVElMRUdYX09QQ19WMU1VTFRVLAotICBUSUxFR1hfT1BDX1YxTVVMVSwKLSAgVElMRUdYX09QQ19WMU1VTFVTLAotICBUSUxFR1hfT1BDX1YxTVosCi0gIFRJTEVHWF9PUENfVjFTQURBVSwKLSAgVElMRUdYX09QQ19WMVNBRFUsCi0gIFRJTEVHWF9PUENfVjFTSEwsCi0gIFRJTEVHWF9PUENfVjFTSExJLAotICBUSUxFR1hfT1BDX1YxU0hSUywKLSAgVElMRUdYX09QQ19WMVNIUlNJLAotICBUSUxFR1hfT1BDX1YxU0hSVSwKLSAgVElMRUdYX09QQ19WMVNIUlVJLAotICBUSUxFR1hfT1BDX1YxU1VCLAotICBUSUxFR1hfT1BDX1YxU1VCVUMsCi0gIFRJTEVHWF9PUENfVjJBREQsCi0gIFRJTEVHWF9PUENfVjJBRERJLAotICBUSUxFR1hfT1BDX1YyQUREU0MsCi0gIFRJTEVHWF9PUENfVjJBRElGRlMsCi0gIFRJTEVHWF9PUENfVjJBVkdTLAotICBUSUxFR1hfT1BDX1YyQ01QRVEsCi0gIFRJTEVHWF9PUENfVjJDTVBFUUksCi0gIFRJTEVHWF9PUENfVjJDTVBMRVMsCi0gIFRJTEVHWF9PUENfVjJDTVBMRVUsCi0gIFRJTEVHWF9PUENfVjJDTVBMVFMsCi0gIFRJTEVHWF9PUENfVjJDTVBMVFNJLAotICBUSUxFR1hfT1BDX1YyQ01QTFRVLAotICBUSUxFR1hfT1BDX1YyQ01QTFRVSSwKLSAgVElMRUdYX09QQ19WMkNNUE5FLAotICBUSUxFR1hfT1BDX1YyRE9UUCwKLSAgVElMRUdYX09QQ19WMkRPVFBBLAotICBUSUxFR1hfT1BDX1YySU5UX0gsCi0gIFRJTEVHWF9PUENfVjJJTlRfTCwKLSAgVElMRUdYX09QQ19WMk1BWFMsCi0gIFRJTEVHWF9PUENfVjJNQVhTSSwKLSAgVElMRUdYX09QQ19WMk1JTlMsCi0gIFRJTEVHWF9PUENfVjJNSU5TSSwKLSAgVElMRUdYX09QQ19WMk1OWiwKLSAgVElMRUdYX09QQ19WMk1VTEZTQywKLSAgVElMRUdYX09QQ19WMk1VTFMsCi0gIFRJTEVHWF9PUENfVjJNVUxUUywKLSAgVElMRUdYX09QQ19WMk1aLAotICBUSUxFR1hfT1BDX1YyUEFDS0gsCi0gIFRJTEVHWF9PUENfVjJQQUNLTCwKLSAgVElMRUdYX09QQ19WMlBBQ0tVQywKLSAgVElMRUdYX09QQ19WMlNBREFTLAotICBUSUxFR1hfT1BDX1YyU0FEQVUsCi0gIFRJTEVHWF9PUENfVjJTQURTLAotICBUSUxFR1hfT1BDX1YyU0FEVSwKLSAgVElMRUdYX09QQ19WMlNITCwKLSAgVElMRUdYX09QQ19WMlNITEksCi0gIFRJTEVHWF9PUENfVjJTSExTQywKLSAgVElMRUdYX09QQ19WMlNIUlMsCi0gIFRJTEVHWF9PUENfVjJTSFJTSSwKLSAgVElMRUdYX09QQ19WMlNIUlUsCi0gIFRJTEVHWF9PUENfVjJTSFJVSSwKLSAgVElMRUdYX09QQ19WMlNVQiwKLSAgVElMRUdYX09QQ19WMlNVQlNDLAotICBUSUxFR1hfT1BDX1Y0QURELAotICBUSUxFR1hfT1BDX1Y0QUREU0MsCi0gIFRJTEVHWF9PUENfVjRJTlRfSCwKLSAgVElMRUdYX09QQ19WNElOVF9MLAotICBUSUxFR1hfT1BDX1Y0UEFDS1NDLAotICBUSUxFR1hfT1BDX1Y0U0hMLAotICBUSUxFR1hfT1BDX1Y0U0hMU0MsCi0gIFRJTEVHWF9PUENfVjRTSFJTLAotICBUSUxFR1hfT1BDX1Y0U0hSVSwKLSAgVElMRUdYX09QQ19WNFNVQiwKLSAgVElMRUdYX09QQ19WNFNVQlNDLAotICBUSUxFR1hfT1BDX1dINjQsCi0gIFRJTEVHWF9PUENfWE9SLAotICBUSUxFR1hfT1BDX1hPUkksCi0gIFRJTEVHWF9PUENfTk9ORQotfSB0aWxlZ3hfbW5lbW9uaWM7Ci0KLS8qIDY0LWJpdCBwYXR0ZXJuIGZvciBhIHsgYnB0IDsgbm9wIH0gYnVuZGxlLiAqLwotI2RlZmluZSBUSUxFR1hfQlBUX0JVTkRMRSAweDI4NmE0NGFlNTE0ODUwMDBVTEwKLQotCi0jZGVmaW5lIFRJTEVfRUxGX01BQ0hJTkVfQ09ERSBFTV9USUxFNjQKLQotI2RlZmluZSBUSUxFX0VMRl9OQU1FICJlbGYzMi10aWxlNjQiCi0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JGRW5kX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JGT3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDI0KSkgJiAweGYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfQkZTdGFydF9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9Cck9mZl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgwMDAwMDAzZikgfAotICAgICAgICAgKCgodW5zaWduZWQgaW50KShuID4+IDM3KSkgJiAweDAwMDFmZmMwKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0JyVHlwZV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1NCkpICYgMHgxZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X0ltbThfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzEpKSAmIDB4MDAwMDAwM2YpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHgwMDAwMDBjMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9EZXN0X1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDApKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfRGVzdF9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW0xNl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbTE2X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOE9wY29kZUV4dGVuc2lvbl9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHhmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDUxKSkgJiAweGZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSW1tOF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0MykpICYgMHhmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9JbW04X1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweGZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0ltbThfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfSnVtcE9mZl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzMSkpICYgMHg3ZmZmZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X0p1bXBPcGNvZGVFeHRlbnNpb25fWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNTgpKSAmIDB4MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9NRl9JbW0xNF9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiAzNykpICYgMHgzZmZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X01UX0ltbTE0X1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDMxKSkgJiAweDAwMDAwMDNmKSB8Ci0gICAgICAgICAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4MDAwMDNmYzApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfTW9kZSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA2MikpICYgMHgzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyOCkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OSkpICYgMHg3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyNykpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1OCkpICYgMHhmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X09wY29kZV9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKG4gPj4gMjYpKSAmIDB4MDAwMDAwMDEpIHwKLSAgICAgICAgICgoKHVuc2lnbmVkIGludCkobiA+PiA1NikpICYgMHgwMDAwMDAwMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9SUlJPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1JSUk9wY29kZUV4dGVuc2lvbl9YMSh0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA0OSkpICYgMHgzZmYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDE4KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfUlJST3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWTAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTIpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hBbXRfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDAodGlsZWd4X2J1bmRsZV9iaXRzIG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKG4gPj4gMTgpKSAmIDB4M2ZmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDNmZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxOCkpICYgMHgzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NoaWZ0T3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQ5KSkgJiAweDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9YMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiA2KSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0FfWTEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gMzcpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQV9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAyMCkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCRGVzdF9ZMih0aWxlZ3hfYnVuZGxlX2JpdHMgbikKLXsKLSAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkobiA+PiA1MSkpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1NyY0JfWDEodGlsZWd4X2J1bmRsZV9iaXRzIG4pCi17Ci0gIHJldHVybiAoKCh1bnNpZ25lZCBpbnQpKG4gPj4gNDMpKSAmIDB4M2YpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50Ci1nZXRfU3JjQl9ZMCh0aWxlZ3hfYnVuZGxlX2JpdHMgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgobiA+PiAxMikpICYgMHgzZik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQKLWdldF9TcmNCX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kwKHRpbGVneF9idW5kbGVfYml0cyBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKChuID4+IDEyKSkgJiAweDNmKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAotZ2V0X1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kxKHRpbGVneF9idW5kbGVfYml0cyBuKQotewotICByZXR1cm4gKCgodW5zaWduZWQgaW50KShuID4+IDQzKSkgJiAweDNmKTsKLX0KLQotCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1zaWduX2V4dGVuZChpbnQgbiwgaW50IG51bV9iaXRzKQotewotICBpbnQgc2hpZnQgPSAoaW50KShzaXplb2YoaW50KSAqIDggLSBudW1fYml0cyk7Ci0gIHJldHVybiAobiA8PCBzaGlmdCkgPj4gc2hpZnQ7Ci19Ci0KLQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfQkZFbmRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JGT3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGYpIDw8IDI0KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JGU3RhcnRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0JyT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDAwMDAwMDNmKSkgPDwgMzEpIHwKLSAgICAgICAgICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMWZmYzApKSA8PCAzNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9CclR5cGVfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MWYpKSA8PCA1NCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9EZXN0X0ltbThfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwMDBjMCkpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0Rlc3RfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfRGVzdF9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDMxKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbTE2X1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGZmZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbTE2X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweGZmKSA8PCAyMCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9JbW04T3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweGZmKSkgPDwgNTEpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfSW1tOF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHhmZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4ZmYpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX0ltbThfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZmYpKSA8PCA0Myk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KdW1wT2ZmX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDdmZmZmZmYpKSA8PCAzMSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9KdW1wT3Bjb2RlRXh0ZW5zaW9uX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDEpKSA8PCA1OCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9NRl9JbW0xNF9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmZmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfTVRfSW1tMTRfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwM2YpKSA8PCAzMSkgfAotICAgICAgICAgKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgwMDAwM2ZjMCkpIDw8IDM3KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX01vZGUoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MykpIDw8IDYyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHg3KSA8PCAyOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9PcGNvZGVfWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4NykpIDw8IDU5KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHhmKSA8PCAyNyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9PcGNvZGVfWTEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4ZikpIDw8IDU4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX09wY29kZV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgwMDAwMDAwMSkgPDwgMjYpIHwKLSAgICAgICAgICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4MDAwMDAwMDIpKSA8PCA1Nik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9SUlJPcGNvZGVFeHRlbnNpb25fWDEoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2ZmKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfUlJST3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDMpIDw8IDE4KTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1JSUk9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hBbXRfWTAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2YpIDw8IDEyKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1NoQW10X1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU2hpZnRPcGNvZGVFeHRlbnNpb25fWDAoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgobiAmIDB4M2ZmKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZmYpKSA8PCA0OSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzKSA8PCAxOCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TaGlmdE9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzKSkgPDwgNDkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9YMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgNik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNBX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgNik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNBX1kxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgMzcpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQV9ZMihpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMjApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQkRlc3RfWTIoaW50IG51bSkKLXsKLSAgY29uc3QgdW5zaWduZWQgaW50IG4gPSAodW5zaWduZWQgaW50KW51bTsKLSAgcmV0dXJuICgoKHRpbGVneF9idW5kbGVfYml0cykobiAmIDB4M2YpKSA8PCA1MSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9TcmNCX1gxKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKCh0aWxlZ3hfYnVuZGxlX2JpdHMpKG4gJiAweDNmKSkgPDwgNDMpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMChpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKChuICYgMHgzZikgPDwgMTIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdGlsZWd4X2J1bmRsZV9iaXRzCi1jcmVhdGVfU3JjQl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1gwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9VbmFyeU9wY29kZUV4dGVuc2lvbl9YMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHRpbGVneF9idW5kbGVfYml0cwotY3JlYXRlX1VuYXJ5T3Bjb2RlRXh0ZW5zaW9uX1kwKGludCBudW0pCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuID0gKHVuc2lnbmVkIGludCludW07Ci0gIHJldHVybiAoKG4gJiAweDNmKSA8PCAxMik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB0aWxlZ3hfYnVuZGxlX2JpdHMKLWNyZWF0ZV9VbmFyeU9wY29kZUV4dGVuc2lvbl9ZMShpbnQgbnVtKQotewotICBjb25zdCB1bnNpZ25lZCBpbnQgbiA9ICh1bnNpZ25lZCBpbnQpbnVtOwotICByZXR1cm4gKCgodGlsZWd4X2J1bmRsZV9iaXRzKShuICYgMHgzZikpIDw8IDQzKTsKLX0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgVElMRUdYX1BJUEVMSU5FX1gwLAotICBUSUxFR1hfUElQRUxJTkVfWDEsCi0gIFRJTEVHWF9QSVBFTElORV9ZMCwKLSAgVElMRUdYX1BJUEVMSU5FX1kxLAotICBUSUxFR1hfUElQRUxJTkVfWTIsCi19IHRpbGVneF9waXBlbGluZTsKLQotI2RlZmluZSB0aWxlZ3hfaXNfeF9waXBlbGluZShwKSAoKGludCkocCkgPD0gKGludClUSUxFR1hfUElQRUxJTkVfWDEpCi0KLXR5cGVkZWYgZW51bQotewotICBUSUxFR1hfT1BfVFlQRV9SRUdJU1RFUiwKLSAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLAotICBUSUxFR1hfT1BfVFlQRV9BRERSRVNTLAotICBUSUxFR1hfT1BfVFlQRV9TUFIKLX0gdGlsZWd4X29wZXJhbmRfdHlwZTsKLQotLyogVGhlc2UgYXJlIHRoZSBiaXRzIHRoYXQgZGV0ZXJtaW5lIGlmIGEgYnVuZGxlIGlzIGluIHRoZSBYIGVuY29kaW5nLiAqLwotI2RlZmluZSBUSUxFR1hfQlVORExFX01PREVfTUFTSyAoKHRpbGVneF9idW5kbGVfYml0cykzIDw8IDYyKQotCi1lbnVtCi17Ci0gIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiBhIGJ1bmRsZSAoMiBmb3IgWCwgMyBmb3IgWSkuICovCi0gIFRJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEUgPSAzLAotCi0gIC8qIEhvdyBtYW55IGRpZmZlcmVudCBwaXBlbGluZSBlbmNvZGluZ3MgYXJlIHRoZXJlPyBYMCwgWDEsIFkwLCBZMSwgWTIuICovCi0gIFRJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTID0gNSwKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfU0laRV9JTl9CWVRFUy4gKi8KLSAgVElMRUdYX0xPRzJfQlVORExFX1NJWkVfSU5fQllURVMgPSAzLAotCi0gIC8qIEluc3RydWN0aW9ucyB0YWtlIHRoaXMgbWFueSBieXRlcy4gKi8KLSAgVElMRUdYX0JVTkRMRV9TSVpFX0lOX0JZVEVTID0gMSA8PCBUSUxFR1hfTE9HMl9CVU5ETEVfU0laRV9JTl9CWVRFUywKLQotICAvKiBMb2cgYmFzZSAyIG9mIFRJTEVHWF9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLiAqLwotICBUSUxFR1hfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTID0gMywKLQotICAvKiBCdW5kbGVzIHNob3VsZCBiZSBhbGlnbmVkIG1vZHVsbyB0aGlzIG51bWJlciBvZiBieXRlcy4gKi8KLSAgVElMRUdYX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMgPQotICAgICgxIDw8IFRJTEVHWF9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMpLAotCi0gIC8qIE51bWJlciBvZiByZWdpc3RlcnMgKHNvbWUgYXJlIG1hZ2ljLCBzdWNoIGFzIG5ldHdvcmsgSS9PKS4gKi8KLSAgVElMRUdYX05VTV9SRUdJU1RFUlMgPSA2NCwKLX07Ci0KLQotc3RydWN0IHRpbGVneF9vcGVyYW5kCi17Ci0gIC8qIElzIHRoaXMgb3BlcmFuZCBhIHJlZ2lzdGVyLCBpbW1lZGlhdGUgb3IgYWRkcmVzcz8gKi8KLSAgdGlsZWd4X29wZXJhbmRfdHlwZSB0eXBlOwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KLSAgc2lnbmVkIGludCBkZWZhdWx0X3JlbG9jIDogMTY7Ci0KLSAgLyogSG93IG1hbnkgYml0cyBpcyB0aGlzIHZhbHVlPyAodXNlZCBmb3IgcmFuZ2UgY2hlY2tpbmcpICovCi0gIHVuc2lnbmVkIGludCBudW1fYml0cyA6IDU7Ci0KLSAgLyogSXMgdGhlIHZhbHVlIHNpZ25lZD8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLwotICB1bnNpZ25lZCBpbnQgaXNfc2lnbmVkIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgYSBzb3VyY2UgcmVnaXN0ZXI/ICovCi0gIHVuc2lnbmVkIGludCBpc19zcmNfcmVnIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgd3JpdHRlbj8gKGkuZS4gaXMgaXQgYSBkZXN0aW5hdGlvbiByZWdpc3RlcikgKi8KLSAgdW5zaWduZWQgaW50IGlzX2Rlc3RfcmVnIDogMTsKLQotICAvKiBJcyB0aGlzIG9wZXJhbmQgUEMtcmVsYXRpdmU/ICovCi0gIHVuc2lnbmVkIGludCBpc19wY19yZWxhdGl2ZSA6IDE7Ci0KLSAgLyogQnkgaG93IG1hbnkgYml0cyBkbyB3ZSByaWdodCBzaGlmdCB0aGUgdmFsdWUgYmVmb3JlIGluc2VydGluZz8gKi8KLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgOiAyOwotCi0gIC8qIFJldHVybiB0aGUgYml0cyBmb3IgdGhpcyBvcGVyYW5kIHRvIGJlIE9SZWQgaW50byBhbiBleGlzdGluZyBidW5kbGUuICovCi0gIHRpbGVneF9idW5kbGVfYml0cyAoKmluc2VydCkgKGludCBvcCk7Ci0KLSAgLyogRXh0cmFjdCB0aGlzIG9wZXJhbmQgYW5kIHJldHVybiBpdC4gKi8KLSAgdW5zaWduZWQgaW50ICgqZXh0cmFjdCkgKHRpbGVneF9idW5kbGVfYml0cyBidW5kbGUpOwotfTsKLQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHRpbGVneF9vcGVyYW5kIHRpbGVneF9vcGVyYW5kc1tdOwotCi0vKiBPbmUgZmluaXRlLXN0YXRlIG1hY2hpbmUgcGVyIHBpcGUgZm9yIHJhcGlkIGluc3RydWN0aW9uIGRlY29kaW5nLiAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0ICogY29uc3QKLXRpbGVneF9idW5kbGVfZGVjb2Rlcl9mc21zW1RJTEVHWF9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXTsKLQotCi1zdHJ1Y3QgdGlsZWd4X29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG1uZW1vbmljLCBlLmcuICJhZGQiICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIGVudW0gdmFsdWUgZm9yIHRoaXMgbW5lbW9uaWMuICovCi0gIHRpbGVneF9tbmVtb25pYyBtbmVtb25pYzsKLQotICAvKiBBIGJpdCBtYXNrIG9mIHdoaWNoIG9mIHRoZSBmaXZlIHBpcGVzIHRoaXMgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgY29tcGF0aWJsZSB3aXRoOgotICAgICBYMCAgMHgwMQotICAgICBYMSAgMHgwMgotICAgICBZMCAgMHgwNAotICAgICBZMSAgMHgwOAotICAgICBZMiAgMHgxMCAqLwotICB1bnNpZ25lZCBjaGFyIHBpcGVzOwotCi0gIC8qIEhvdyBtYW55IG9wZXJhbmRzIGFyZSB0aGVyZT8gKi8KLSAgdW5zaWduZWQgY2hhciBudW1fb3BlcmFuZHM7Ci0KLSAgLyogV2hpY2ggcmVnaXN0ZXIgZG9lcyB0aGlzIHdyaXRlIGltcGxpY2l0bHksIG9yIFRSRUdfWkVSTyBpZiBub25lPyAqLwotICB1bnNpZ25lZCBjaGFyIGltcGxpY2l0bHlfd3JpdHRlbl9yZWdpc3RlcjsKLQotICAvKiBDYW4gdGhpcyBiZSBidW5kbGVkIHdpdGggb3RoZXIgaW5zdHJ1Y3Rpb25zIChhbG1vc3QgYWx3YXlzIHRydWUpLiAqLwotICB1bnNpZ25lZCBjaGFyIGNhbl9idW5kbGU7Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYW5kcy4gRWFjaCBvZiB0aGVzZSBpcyBhbgotICAgKiBpbmRleCBpbnRvIHRoZSB0aWxlZ3hfb3BlcmFuZHNbXSB0YWJsZS4gKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1tUSUxFR1hfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU11bVElMRUdYX01BWF9PUEVSQU5EU107Ci0KLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZWd4X29wY29kZSB0aWxlZ3hfb3Bjb2Rlc1tdOwotCi0vKiBVc2VkIGZvciBub24tdGV4dHVhbCBkaXNhc3NlbWJseSBpbnRvIHN0cnVjdHMuICovCi1zdHJ1Y3QgdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KLXsKLSAgY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHRpbGVneF9vcGVyYW5kICpvcGVyYW5kc1tUSUxFR1hfTUFYX09QRVJBTkRTXTsKLSAgbG9uZyBsb25nIG9wZXJhbmRfdmFsdWVzW1RJTEVHWF9NQVhfT1BFUkFORFNdOwotfTsKLQotCi0vKiBEaXNhc3NlbWJsZSBhIGJ1bmRsZSBpbnRvIGEgc3RydWN0IGZvciBtYWNoaW5lIHByb2Nlc3NpbmcuICovCi1leHRlcm4gaW50IHBhcnNlX2luc25fdGlsZWd4KHRpbGVneF9idW5kbGVfYml0cyBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aWxlZ3hfZGVjb2RlZF9pbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkW1RJTEVHWF9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKTsKLQotCi0KLSNlbmRpZiAvKiBvcGNvZGVfdGlsZWd4X2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGVfY29uc3RhbnRzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E5ZjI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9vcGNvZGVfY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICAgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0FTTV9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfQVNNX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19ICi0KLSNpbmNsdWRlIDxhcmNoL2NoaXAuaD4KLQotI2lmIENISVBfV09SRF9TSVpFKCkgPT0gNjQKLSNpbmNsdWRlIDxhc20vb3Bjb2RlX2NvbnN0YW50c182NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oPgotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVNNX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZV9jb25zdGFudHNfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3ZDAzMy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c18zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMCBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogICBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUtZ2VuZXJhdGVkOyBETyBOT1QgRURJVCEgKi8KLQotCi0jaWZuZGVmIF9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfVElMRV9PUENPREVfQ09OU1RBTlRTX0gKLWVudW0KLXsKLSAgQUREQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTgsCi0gIEFEREJTX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY4LAotICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxLAotICBBRERCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxLAotICBBRERIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTksCi0gIEFEREhTX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2OSwKLSAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMiwKLSAgQURESF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMiwKLSAgQURESUJfSU1NXzBfT1BDT0RFX1gwID0gMSwKLSAgQURESUJfSU1NXzBfT1BDT0RFX1gxID0gMSwKLSAgQURESUhfSU1NXzBfT1BDT0RFX1gwID0gMiwKLSAgQURESUhfSU1NXzBfT1BDT0RFX1gxID0gMiwKLSAgQURESV9JTU1fMF9PUENPREVfWDAgPSAzLAotICBBRERJX0lNTV8wX09QQ09ERV9YMSA9IDMsCi0gIEFERElfSU1NXzFfT1BDT0RFX1NOID0gMSwKLSAgQURESV9PUENPREVfWTAgPSA5LAotICBBRERJX09QQ09ERV9ZMSA9IDcsCi0gIEFERExJU19PUENPREVfWDAgPSAxLAotICBBRERMSVNfT1BDT0RFX1gxID0gMiwKLSAgQURETElfT1BDT0RFX1gwID0gMiwKLSAgQURETElfT1BDT0RFX1gxID0gMywKLSAgQUREU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTYsCi0gIEFERFNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY2LAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDMsCi0gIEFERF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMywKLSAgQUREX1NQRUNJQUxfMF9PUENPREVfWTAgPSAwLAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDAsCi0gIEFESUZGQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0LAotICBBRElGRkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDUsCi0gIEFORElfSU1NXzBfT1BDT0RFX1gwID0gMSwKLSAgQU5ESV9JTU1fMF9PUENPREVfWDEgPSA0LAotICBBTkRJX09QQ09ERV9ZMCA9IDEwLAotICBBTkRJX09QQ09ERV9ZMSA9IDgsCi0gIEFORF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNiwKLSAgQU5EX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0LAotICBBTkRfU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDAsCi0gIEFORF9TUEVDSUFMXzJfT1BDT0RFX1kxID0gMCwKLSAgQVVMSV9PUENPREVfWDAgPSAzLAotICBBVUxJX09QQ09ERV9YMSA9IDQsCi0gIEFWR0JfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNywKLSAgQVZHSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOCwKLSAgQkJOU1RfQlJBTkNIX09QQ09ERV9YMSA9IDE1LAotICBCQk5TX0JSQU5DSF9PUENPREVfWDEgPSAxNCwKLSAgQkJOU19PUENPREVfU04gPSA2MywKLSAgQkJTVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTMsCi0gIEJCU19CUkFOQ0hfT1BDT0RFX1gxID0gMTIsCi0gIEJCU19PUENPREVfU04gPSA2MiwKLSAgQkdFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDcsCi0gIEJHRVpfQlJBTkNIX09QQ09ERV9YMSA9IDYsCi0gIEJHRVpfT1BDT0RFX1NOID0gNjEsCi0gIEJHWlRfQlJBTkNIX09QQ09ERV9YMSA9IDUsCi0gIEJHWl9CUkFOQ0hfT1BDT0RFX1gxID0gNCwKLSAgQkdaX09QQ09ERV9TTiA9IDU4LAotICBCSVRYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDEsCi0gIEJJVFhfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMSwKLSAgQkxFWlRfQlJBTkNIX09QQ09ERV9YMSA9IDExLAotICBCTEVaX0JSQU5DSF9PUENPREVfWDEgPSAxMCwKLSAgQkxFWl9PUENPREVfU04gPSA1OSwKLSAgQkxaVF9CUkFOQ0hfT1BDT0RFX1gxID0gOSwKLSAgQkxaX0JSQU5DSF9PUENPREVfWDEgPSA4LAotICBCTFpfT1BDT0RFX1NOID0gNjAsCi0gIEJOWlRfQlJBTkNIX09QQ09ERV9YMSA9IDMsCi0gIEJOWl9CUkFOQ0hfT1BDT0RFX1gxID0gMiwKLSAgQk5aX09QQ09ERV9TTiA9IDU3LAotICBCUFRfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMSwKLSAgQlJBTkNIX09QQ09ERV9YMSA9IDUsCi0gIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDIsCi0gIEJZVEVYX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDIsCi0gIEJaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMSwKLSAgQlpfQlJBTkNIX09QQ09ERV9YMSA9IDAsCi0gIEJaX09QQ09ERV9TTiA9IDU2LAotICBDTFpfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gMywKLSAgQ0xaX1VOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDMsCi0gIENSQzMyXzMyX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5LAotICBDUkMzMl84X1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMCwKLSAgQ1RaX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDQsCi0gIENUWl9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA0LAotICBEUkFJTl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxLAotICBEVExCUFJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMiwKLSAgRFdPUkRfQUxJR05fU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDk1LAotICBGSU5WX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDMsCi0gIEZMVVNIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDQsCi0gIEZOT1BfTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMywKLSAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA1LAotICBGTk9QX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDUsCi0gIEZOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gNSwKLSAgRk5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAxLAotICBIQUxUX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDAsCi0gIElDT0hfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gNiwKLSAgSUxMX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDcsCi0gIElMTF9VTl8wX1NIVU5fMF9PUENPREVfWTEgPSAyLAotICBJTU1fMF9PUENPREVfU04gPSAwLAotICBJTU1fMF9PUENPREVfWDAgPSA0LAotICBJTU1fMF9PUENPREVfWDEgPSA2LAotICBJTU1fMV9PUENPREVfU04gPSAxLAotICBJTU1fT1BDT0RFXzBfWDAgPSA1LAotICBJTlRIQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTEsCi0gIElOVEhCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1LAotICBJTlRISF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTIsCi0gIElOVEhIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2LAotICBJTlRMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTMsCi0gIElOVExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3LAotICBJTlRMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTQsCi0gIElOVExIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA4LAotICBJTlZfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gOCwKLSAgSVJFVF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSA5LAotICBKQUxCX09QQ09ERV9YMSA9IDEzLAotICBKQUxGX09QQ09ERV9YMSA9IDEyLAotICBKQUxSUF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gOSwKLSAgSkFMUlJfSU1NXzFfT1BDT0RFX1NOID0gMywKLSAgSkFMUl9SUl9JTU1fMF9PUENPREVfU04gPSA1LAotICBKQUxSX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxMCwKLSAgSkJfT1BDT0RFX1gxID0gMTEsCi0gIEpGX09QQ09ERV9YMSA9IDEwLAotICBKUlBfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDExLAotICBKUlJfSU1NXzFfT1BDT0RFX1NOID0gMiwKLSAgSlJfUlJfSU1NXzBfT1BDT0RFX1NOID0gNCwKLSAgSlJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDEyLAotICBMQkFERF9JTU1fMF9PUENPREVfWDEgPSAyMiwKLSAgTEJBRERfVV9JTU1fMF9PUENPREVfWDEgPSAyMywKLSAgTEJfT1BDT0RFX1kyID0gMCwKLSAgTEJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTAsCi0gIExCX1VfT1BDT0RFX1kyID0gMSwKLSAgTEJfVV9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxMSwKLSAgTEhBRERfSU1NXzBfT1BDT0RFX1gxID0gMjQsCi0gIExIQUREX1VfSU1NXzBfT1BDT0RFX1gxID0gMjUsCi0gIExIX09QQ09ERV9ZMiA9IDIsCi0gIExIX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDEyLAotICBMSF9VX09QQ09ERV9ZMiA9IDMsCi0gIExIX1VfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTMsCi0gIExOS19TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTMsCi0gIExXQUREX0lNTV8wX09QQ09ERV9YMSA9IDI2LAotICBMV0FERF9OQV9JTU1fMF9PUENPREVfWDEgPSAyNywKLSAgTFdfTkFfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjQsCi0gIExXX09QQ09ERV9ZMiA9IDQsCi0gIExXX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE0LAotICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDE1LAotICBNQVhCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE0LAotICBNQVhIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNiwKLSAgTUFYSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTUsCi0gIE1BWElCX1VfSU1NXzBfT1BDT0RFX1gwID0gNCwKLSAgTUFYSUJfVV9JTU1fMF9PUENPREVfWDEgPSA1LAotICBNQVhJSF9JTU1fMF9PUENPREVfWDAgPSA1LAotICBNQVhJSF9JTU1fMF9PUENPREVfWDEgPSA2LAotICBNRlNQUl9JTU1fMF9PUENPREVfWDEgPSA3LAotICBNRl9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNSwKLSAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxNywKLSAgTUlOQl9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSAxNiwKLSAgTUlOSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTgsCi0gIE1JTkhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE3LAotICBNSU5JQl9VX0lNTV8wX09QQ09ERV9YMCA9IDYsCi0gIE1JTklCX1VfSU1NXzBfT1BDT0RFX1gxID0gOCwKLSAgTUlOSUhfSU1NXzBfT1BDT0RFX1gwID0gNywKLSAgTUlOSUhfSU1NXzBfT1BDT0RFX1gxID0gOSwKLSAgTU1fT1BDT0RFX1gwID0gNiwKLSAgTU1fT1BDT0RFX1gxID0gNywKLSAgTU5aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTksCi0gIE1OWkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDE4LAotICBNTlpIX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyMCwKLSAgTU5aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMTksCi0gIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjEsCi0gIE1OWl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjAsCi0gIE1OWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMCwKLSAgTU5aX1NQRUNJQUxfMV9PUENPREVfWTEgPSAxLAotICBNT1ZFSV9JTU1fMV9PUENPREVfU04gPSAwLAotICBNT1ZFX1JSX0lNTV8wX09QQ09ERV9TTiA9IDgsCi0gIE1UU1BSX0lNTV8wX09QQ09ERV9YMSA9IDEwLAotICBNVUxISEFfU1NfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDIyLAotICBNVUxISEFfU1NfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhIQV9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjMsCi0gIE1VTEhIQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjQsCi0gIE1VTEhIQV9VVV9TUEVDSUFMXzdfT1BDT0RFX1kwID0gMSwKLSAgTVVMSEhTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMjUsCi0gIE1VTEhIX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNiwKLSAgTVVMSEhfU1NfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhIX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyNywKLSAgTVVMSEhfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDI4LAotICBNVUxISF9VVV9TUEVDSUFMXzZfT1BDT0RFX1kwID0gMSwKLSAgTVVMSExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAyOSwKLSAgTVVMSExBX1NVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMCwKLSAgTVVMSExBX1VTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMSwKLSAgTVVMSExBX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzMiwKLSAgTVVMSExTQV9VVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzMsCi0gIE1VTEhMU0FfVVVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDAsCi0gIE1VTEhMX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNCwKLSAgTVVMSExfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM1LAotICBNVUxITF9VU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMzYsCi0gIE1VTEhMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzNywKLSAgTVVMTExBX1NTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAzOCwKLSAgTVVMTExBX1NTX1NQRUNJQUxfN19PUENPREVfWTAgPSAyLAotICBNVUxMTEFfU1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDM5LAotICBNVUxMTEFfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQwLAotICBNVUxMTEFfVVVfU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDMsCi0gIE1VTExMU0FfVVVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQxLAotICBNVUxMTF9TU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDIsCi0gIE1VTExMX1NTX1NQRUNJQUxfNl9PUENPREVfWTAgPSAyLAotICBNVUxMTF9TVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDMsCi0gIE1VTExMX1VVX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0NCwKLSAgTVVMTExfVVVfU1BFQ0lBTF82X09QQ09ERV9ZMCA9IDMsCi0gIE1WTlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ1LAotICBNVk5aX1NQRUNJQUxfMV9PUENPREVfWTAgPSAxLAotICBNVlpfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDQ2LAotICBNVlpfU1BFQ0lBTF8xX09QQ09ERV9ZMCA9IDIsCi0gIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDcsCi0gIE1aQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjEsCi0gIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNDgsCi0gIE1aSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjIsCi0gIE1aX1NQRUNJQUxfMF9PUENPREVfWDAgPSA0OSwKLSAgTVpfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDIzLAotICBNWl9TUEVDSUFMXzFfT1BDT0RFX1kwID0gMywKLSAgTVpfU1BFQ0lBTF8xX09QQ09ERV9ZMSA9IDIsCi0gIE5BUF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxNiwKLSAgTk9QX05PUkVHX1JSX0lNTV8wX09QQ09ERV9TTiA9IDIsCi0gIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA2LAotICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTcsCi0gIE5PUF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA2LAotICBOT1BfVU5fMF9TSFVOXzBfT1BDT0RFX1kxID0gMywKLSAgTk9SRUdfUlJfSU1NXzBfT1BDT0RFX1NOID0gMCwKLSAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MCwKLSAgTk9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNCwKLSAgTk9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAxLAotICBOT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDEsCi0gIE9SSV9JTU1fMF9PUENPREVfWDAgPSA4LAotICBPUklfSU1NXzBfT1BDT0RFX1gxID0gMTEsCi0gIE9SSV9PUENPREVfWTAgPSAxMSwKLSAgT1JJX09QQ09ERV9ZMSA9IDksCi0gIE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MSwKLSAgT1JfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI1LAotICBPUl9TUEVDSUFMXzJfT1BDT0RFX1kwID0gMiwKLSAgT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDIsCi0gIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDMsCi0gIFBBQ0tCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MywKLSAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1MiwKLSAgUEFDS0hCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAyNiwKLSAgUEFDS0hTX1NQRUNJQUxfMF9PUENPREVfWDAgPSAxMDIsCi0gIFBBQ0tIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzIsCi0gIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTMsCi0gIFBBQ0tMQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjcsCi0gIFBDTlRfVU5fMF9TSFVOXzBfT1BDT0RFX1gwID0gNywKLSAgUENOVF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA3LAotICBSTElfU0hVTl8wX09QQ09ERV9YMCA9IDEsCi0gIFJMSV9TSFVOXzBfT1BDT0RFX1gxID0gMSwKLSAgUkxJX1NIVU5fMF9PUENPREVfWTAgPSAxLAotICBSTElfU0hVTl8wX09QQ09ERV9ZMSA9IDEsCi0gIFJMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NCwKLSAgUkxfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDI4LAotICBSTF9TUEVDSUFMXzNfT1BDT0RFX1kwID0gMCwKLSAgUkxfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDAsCi0gIFJSX0lNTV8wX09QQ09ERV9TTiA9IDAsCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTUsCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMjksCi0gIFMxQV9TUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKLSAgUzFBX1NQRUNJQUxfMF9PUENPREVfWTEgPSAxLAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU2LAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMwLAotICBTMkFfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDIsCi0gIFMyQV9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMiwKLSAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDAgPSA1NywKLSAgUzNBX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMSwKLSAgUzNBX1NQRUNJQUxfNV9PUENPREVfWTAgPSAxLAotICBTM0FfU1BFQ0lBTF81X09QQ09ERV9ZMSA9IDEsCi0gIFNBREFCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDU4LAotICBTQURBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNTksCi0gIFNBREFIX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYwLAotICBTQURCX1VfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDYxLAotICBTQURIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MiwKLSAgU0FESF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2MywKLSAgU0JBRERfSU1NXzBfT1BDT0RFX1gxID0gMjgsCi0gIFNCX09QQ09ERV9ZMiA9IDUsCi0gIFNCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzMiwKLSAgU0VRQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjQsCi0gIFNFUUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDMzLAotICBTRVFIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2NSwKLSAgU0VRSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzQsCi0gIFNFUUlCX0lNTV8wX09QQ09ERV9YMCA9IDksCi0gIFNFUUlCX0lNTV8wX09QQ09ERV9YMSA9IDEyLAotICBTRVFJSF9JTU1fMF9PUENPREVfWDAgPSAxMCwKLSAgU0VRSUhfSU1NXzBfT1BDT0RFX1gxID0gMTMsCi0gIFNFUUlfSU1NXzBfT1BDT0RFX1gwID0gMTEsCi0gIFNFUUlfSU1NXzBfT1BDT0RFX1gxID0gMTQsCi0gIFNFUUlfT1BDT0RFX1kwID0gMTIsCi0gIFNFUUlfT1BDT0RFX1kxID0gMTAsCi0gIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjYsCi0gIFNFUV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gMzUsCi0gIFNFUV9TUEVDSUFMXzVfT1BDT0RFX1kwID0gMiwKLSAgU0VRX1NQRUNJQUxfNV9PUENPREVfWTEgPSAyLAotICBTSEFERF9JTU1fMF9PUENPREVfWDEgPSAyOSwKLSAgU0hMOElJX0lNTV8wX09QQ09ERV9TTiA9IDMsCi0gIFNITEJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDY3LAotICBTSExCX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzNiwKLSAgU0hMSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNjgsCi0gIFNITEhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM3LAotICBTSExJQl9TSFVOXzBfT1BDT0RFX1gwID0gMiwKLSAgU0hMSUJfU0hVTl8wX09QQ09ERV9YMSA9IDIsCi0gIFNITElIX1NIVU5fMF9PUENPREVfWDAgPSAzLAotICBTSExJSF9TSFVOXzBfT1BDT0RFX1gxID0gMywKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1gwID0gNCwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1gxID0gNCwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1kwID0gMiwKLSAgU0hMSV9TSFVOXzBfT1BDT0RFX1kxID0gMiwKLSAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDAgPSA2OSwKLSAgU0hMX1NQRUNJQUxfMF9PUENPREVfWDEgPSAzOCwKLSAgU0hMX1NQRUNJQUxfM19PUENPREVfWTAgPSAxLAotICBTSExfU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDEsCi0gIFNIUjFfUlJfSU1NXzBfT1BDT0RFX1NOID0gOSwKLSAgU0hSQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzAsCi0gIFNIUkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDM5LAotICBTSFJIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MSwKLSAgU0hSSF9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDAsCi0gIFNIUklCX1NIVU5fMF9PUENPREVfWDAgPSA1LAotICBTSFJJQl9TSFVOXzBfT1BDT0RFX1gxID0gNSwKLSAgU0hSSUhfU0hVTl8wX09QQ09ERV9YMCA9IDYsCi0gIFNIUklIX1NIVU5fMF9PUENPREVfWDEgPSA2LAotICBTSFJJX1NIVU5fMF9PUENPREVfWDAgPSA3LAotICBTSFJJX1NIVU5fMF9PUENPREVfWDEgPSA3LAotICBTSFJJX1NIVU5fMF9PUENPREVfWTAgPSAzLAotICBTSFJJX1NIVU5fMF9PUENPREVfWTEgPSAzLAotICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDcyLAotICBTSFJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQxLAotICBTSFJfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDIsCi0gIFNIUl9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMiwKLSAgU0hVTl8wX09QQ09ERV9YMCA9IDcsCi0gIFNIVU5fMF9PUENPREVfWDEgPSA4LAotICBTSFVOXzBfT1BDT0RFX1kwID0gMTMsCi0gIFNIVU5fMF9PUENPREVfWTEgPSAxMSwKLSAgU0hfT1BDT0RFX1kyID0gNiwKLSAgU0hfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQyLAotICBTTFRCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3MywKLSAgU0xUQl9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDMsCi0gIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gNzQsCi0gIFNMVEJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDQsCi0gIFNMVEVCX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NSwKLSAgU0xURUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ1LAotICBTTFRFQl9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NiwKLSAgU0xURUJfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDYsCi0gIFNMVEVIX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3NywKLSAgU0xURUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDQ3LAotICBTTFRFSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA3OCwKLSAgU0xURUhfVV9TUEVDSUFMXzBfT1BDT0RFX1gxID0gNDgsCi0gIFNMVEVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDc5LAotICBTTFRFX1NQRUNJQUxfMF9PUENPREVfWDEgPSA0OSwKLSAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMCwKLSAgU0xURV9TUEVDSUFMXzRfT1BDT0RFX1kxID0gMCwKLSAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MCwKLSAgU0xURV9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MCwKLSAgU0xURV9VX1NQRUNJQUxfNF9PUENPREVfWTAgPSAxLAotICBTTFRFX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDEsCi0gIFNMVEhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDgxLAotICBTTFRIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MSwKLSAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MiwKLSAgU0xUSF9VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MiwKLSAgU0xUSUJfSU1NXzBfT1BDT0RFX1gwID0gMTIsCi0gIFNMVElCX0lNTV8wX09QQ09ERV9YMSA9IDE1LAotICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMCA9IDEzLAotICBTTFRJQl9VX0lNTV8wX09QQ09ERV9YMSA9IDE2LAotICBTTFRJSF9JTU1fMF9PUENPREVfWDAgPSAxNCwKLSAgU0xUSUhfSU1NXzBfT1BDT0RFX1gxID0gMTcsCi0gIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gwID0gMTUsCi0gIFNMVElIX1VfSU1NXzBfT1BDT0RFX1gxID0gMTgsCi0gIFNMVElfSU1NXzBfT1BDT0RFX1gwID0gMTYsCi0gIFNMVElfSU1NXzBfT1BDT0RFX1gxID0gMTksCi0gIFNMVElfT1BDT0RFX1kwID0gMTQsCi0gIFNMVElfT1BDT0RFX1kxID0gMTIsCi0gIFNMVElfVV9JTU1fMF9PUENPREVfWDAgPSAxNywKLSAgU0xUSV9VX0lNTV8wX09QQ09ERV9YMSA9IDIwLAotICBTTFRJX1VfT1BDT0RFX1kwID0gMTUsCi0gIFNMVElfVV9PUENPREVfWTEgPSAxMywKLSAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4MywKLSAgU0xUX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1MywKLSAgU0xUX1NQRUNJQUxfNF9PUENPREVfWTAgPSAyLAotICBTTFRfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDIsCi0gIFNMVF9VX1NQRUNJQUxfMF9PUENPREVfWDAgPSA4NCwKLSAgU0xUX1VfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU0LAotICBTTFRfVV9TUEVDSUFMXzRfT1BDT0RFX1kwID0gMywKLSAgU0xUX1VfU1BFQ0lBTF80X09QQ09ERV9ZMSA9IDMsCi0gIFNORUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg1LAotICBTTkVCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1NSwKLSAgU05FSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODYsCi0gIFNORUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU2LAotICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg3LAotICBTTkVfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU3LAotICBTTkVfU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDMsCi0gIFNORV9TUEVDSUFMXzVfT1BDT0RFX1kxID0gMywKLSAgU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDAsCi0gIFNQRUNJQUxfMF9PUENPREVfWDEgPSAxLAotICBTUEVDSUFMXzBfT1BDT0RFX1kwID0gMSwKLSAgU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCi0gIFNQRUNJQUxfMV9PUENPREVfWTAgPSAyLAotICBTUEVDSUFMXzFfT1BDT0RFX1kxID0gMiwKLSAgU1BFQ0lBTF8yX09QQ09ERV9ZMCA9IDMsCi0gIFNQRUNJQUxfMl9PUENPREVfWTEgPSAzLAotICBTUEVDSUFMXzNfT1BDT0RFX1kwID0gNCwKLSAgU1BFQ0lBTF8zX09QQ09ERV9ZMSA9IDQsCi0gIFNQRUNJQUxfNF9PUENPREVfWTAgPSA1LAotICBTUEVDSUFMXzRfT1BDT0RFX1kxID0gNSwKLSAgU1BFQ0lBTF81X09QQ09ERV9ZMCA9IDYsCi0gIFNQRUNJQUxfNV9PUENPREVfWTEgPSA2LAotICBTUEVDSUFMXzZfT1BDT0RFX1kwID0gNywKLSAgU1BFQ0lBTF83X09QQ09ERV9ZMCA9IDgsCi0gIFNSQUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDg4LAotICBTUkFCX1NQRUNJQUxfMF9PUENPREVfWDEgPSA1OCwKLSAgU1JBSF9TUEVDSUFMXzBfT1BDT0RFX1gwID0gODksCi0gIFNSQUhfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDU5LAotICBTUkFJQl9TSFVOXzBfT1BDT0RFX1gwID0gOCwKLSAgU1JBSUJfU0hVTl8wX09QQ09ERV9YMSA9IDgsCi0gIFNSQUlIX1NIVU5fMF9PUENPREVfWDAgPSA5LAotICBTUkFJSF9TSFVOXzBfT1BDT0RFX1gxID0gOSwKLSAgU1JBSV9TSFVOXzBfT1BDT0RFX1gwID0gMTAsCi0gIFNSQUlfU0hVTl8wX09QQ09ERV9YMSA9IDEwLAotICBTUkFJX1NIVU5fMF9PUENPREVfWTAgPSA0LAotICBTUkFJX1NIVU5fMF9PUENPREVfWTEgPSA0LAotICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkwLAotICBTUkFfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYwLAotICBTUkFfU1BFQ0lBTF8zX09QQ09ERV9ZMCA9IDMsCi0gIFNSQV9TUEVDSUFMXzNfT1BDT0RFX1kxID0gMywKLSAgU1VCQlNfVV9TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAwLAotICBTVUJCU19VX1NQRUNJQUxfMF9PUENPREVfWDEgPSA3MCwKLSAgU1VCQl9TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTEsCi0gIFNVQkJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYxLAotICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gMTAxLAotICBTVUJIU19TUEVDSUFMXzBfT1BDT0RFX1gxID0gNzEsCi0gIFNVQkhfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkyLAotICBTVUJIX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2MiwKLSAgU1VCU19TUEVDSUFMXzBfT1BDT0RFX1gwID0gOTcsCi0gIFNVQlNfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY3LAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMCA9IDkzLAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDYzLAotICBTVUJfU1BFQ0lBTF8wX09QQ09ERV9ZMCA9IDMsCi0gIFNVQl9TUEVDSUFMXzBfT1BDT0RFX1kxID0gMywKLSAgU1dBRERfSU1NXzBfT1BDT0RFX1gxID0gMzAsCi0gIFNXSU5UMF9VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAxOCwKLSAgU1dJTlQxX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDE5LAotICBTV0lOVDJfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjAsCi0gIFNXSU5UM19VTl8wX1NIVU5fMF9PUENPREVfWDEgPSAyMSwKLSAgU1dfT1BDT0RFX1kyID0gNywKLSAgU1dfU1BFQ0lBTF8wX09QQ09ERV9YMSA9IDY0LAotICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA4LAotICBUQkxJRFhCMF9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA4LAotICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSA5LAotICBUQkxJRFhCMV9VTl8wX1NIVU5fMF9PUENPREVfWTAgPSA5LAotICBUQkxJRFhCMl9VTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMCwKLSAgVEJMSURYQjJfVU5fMF9TSFVOXzBfT1BDT0RFX1kwID0gMTAsCi0gIFRCTElEWEIzX1VOXzBfU0hVTl8wX09QQ09ERV9YMCA9IDExLAotICBUQkxJRFhCM19VTl8wX1NIVU5fMF9PUENPREVfWTAgPSAxMSwKLSAgVE5TX1VOXzBfU0hVTl8wX09QQ09ERV9YMSA9IDIyLAotICBVTl8wX1NIVU5fMF9PUENPREVfWDAgPSAxMSwKLSAgVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMTEsCi0gIFVOXzBfU0hVTl8wX09QQ09ERV9ZMCA9IDUsCi0gIFVOXzBfU0hVTl8wX09QQ09ERV9ZMSA9IDUsCi0gIFdINjRfVU5fMF9TSFVOXzBfT1BDT0RFX1gxID0gMjMsCi0gIFhPUklfSU1NXzBfT1BDT0RFX1gwID0gMiwKLSAgWE9SSV9JTU1fMF9PUENPREVfWDEgPSAyMSwKLSAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDAgPSA5NCwKLSAgWE9SX1NQRUNJQUxfMF9PUENPREVfWDEgPSA2NSwKLSAgWE9SX1NQRUNJQUxfMl9PUENPREVfWTAgPSAzLAotICBYT1JfU1BFQ0lBTF8yX09QQ09ERV9ZMSA9IDMKLX07Ci0KLSNlbmRpZiAvKiAhX1RJTEVfT1BDT0RFX0NPTlNUQU5UU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c182NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL29wY29kZV9jb25zdGFudHNfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwMTkyOC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vb3Bjb2RlX2NvbnN0YW50c182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogICBtb3JlIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUtZ2VuZXJhdGVkOyBETyBOT1QgRURJVCEgKi8KLQotCi0jaWZuZGVmIF9USUxFX09QQ09ERV9DT05TVEFOVFNfSAotI2RlZmluZSBfVElMRV9PUENPREVfQ09OU1RBTlRTX0gKLWVudW0KLXsKLSAgQURESV9JTU04X09QQ09ERV9YMCA9IDEsCi0gIEFERElfSU1NOF9PUENPREVfWDEgPSAxLAotICBBRERJX09QQ09ERV9ZMCA9IDAsCi0gIEFERElfT1BDT0RFX1kxID0gMSwKLSAgQURETElfT1BDT0RFX1gwID0gMSwKLSAgQURETElfT1BDT0RFX1gxID0gMCwKLSAgQUREWElfSU1NOF9PUENPREVfWDAgPSAyLAotICBBRERYSV9JTU04X09QQ09ERV9YMSA9IDIsCi0gIEFERFhJX09QQ09ERV9ZMCA9IDEsCi0gIEFERFhJX09QQ09ERV9ZMSA9IDIsCi0gIEFERFhMSV9PUENPREVfWDAgPSAyLAotICBBRERYTElfT1BDT0RFX1gxID0gMSwKLSAgQUREWFNDX1JSUl8wX09QQ09ERV9YMCA9IDEsCi0gIEFERFhTQ19SUlJfMF9PUENPREVfWDEgPSAxLAotICBBRERYX1JSUl8wX09QQ09ERV9YMCA9IDIsCi0gIEFERFhfUlJSXzBfT1BDT0RFX1gxID0gMiwKLSAgQUREWF9SUlJfMF9PUENPREVfWTAgPSAwLAotICBBRERYX1NQRUNJQUxfMF9PUENPREVfWTEgPSAwLAotICBBRERfUlJSXzBfT1BDT0RFX1gwID0gMywKLSAgQUREX1JSUl8wX09QQ09ERV9YMSA9IDMsCi0gIEFERF9SUlJfMF9PUENPREVfWTAgPSAxLAotICBBRERfU1BFQ0lBTF8wX09QQ09ERV9ZMSA9IDEsCi0gIEFORElfSU1NOF9PUENPREVfWDAgPSAzLAotICBBTkRJX0lNTThfT1BDT0RFX1gxID0gMywKLSAgQU5ESV9PUENPREVfWTAgPSAyLAotICBBTkRJX09QQ09ERV9ZMSA9IDMsCi0gIEFORF9SUlJfMF9PUENPREVfWDAgPSA0LAotICBBTkRfUlJSXzBfT1BDT0RFX1gxID0gNCwKLSAgQU5EX1JSUl81X09QQ09ERV9ZMCA9IDAsCi0gIEFORF9SUlJfNV9PUENPREVfWTEgPSAwLAotICBCRVFaVF9CUkFOQ0hfT1BDT0RFX1gxID0gMTYsCi0gIEJFUVpfQlJBTkNIX09QQ09ERV9YMSA9IDE3LAotICBCRkVYVFNfQkZfT1BDT0RFX1gwID0gNCwKLSAgQkZFWFRVX0JGX09QQ09ERV9YMCA9IDUsCi0gIEJGSU5TX0JGX09QQ09ERV9YMCA9IDYsCi0gIEJGX09QQ09ERV9YMCA9IDMsCi0gIEJHRVpUX0JSQU5DSF9PUENPREVfWDEgPSAxOCwKLSAgQkdFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMTksCi0gIEJHVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyMCwKLSAgQkdUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjEsCi0gIEJMQkNUX0JSQU5DSF9PUENPREVfWDEgPSAyMiwKLSAgQkxCQ19CUkFOQ0hfT1BDT0RFX1gxID0gMjMsCi0gIEJMQlNUX0JSQU5DSF9PUENPREVfWDEgPSAyNCwKLSAgQkxCU19CUkFOQ0hfT1BDT0RFX1gxID0gMjUsCi0gIEJMRVpUX0JSQU5DSF9PUENPREVfWDEgPSAyNiwKLSAgQkxFWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjcsCi0gIEJMVFpUX0JSQU5DSF9PUENPREVfWDEgPSAyOCwKLSAgQkxUWl9CUkFOQ0hfT1BDT0RFX1gxID0gMjksCi0gIEJORVpUX0JSQU5DSF9PUENPREVfWDEgPSAzMCwKLSAgQk5FWl9CUkFOQ0hfT1BDT0RFX1gxID0gMzEsCi0gIEJSQU5DSF9PUENPREVfWDEgPSAyLAotICBDTU9WRVFaX1JSUl8wX09QQ09ERV9YMCA9IDUsCi0gIENNT1ZFUVpfUlJSXzRfT1BDT0RFX1kwID0gMCwKLSAgQ01PVk5FWl9SUlJfMF9PUENPREVfWDAgPSA2LAotICBDTU9WTkVaX1JSUl80X09QQ09ERV9ZMCA9IDEsCi0gIENNUEVRSV9JTU04X09QQ09ERV9YMCA9IDQsCi0gIENNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQsCi0gIENNUEVRSV9PUENPREVfWTAgPSAzLAotICBDTVBFUUlfT1BDT0RFX1kxID0gNCwKLSAgQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gNywKLSAgQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNSwKLSAgQ01QRVFfUlJSXzNfT1BDT0RFX1kwID0gMCwKLSAgQ01QRVFfUlJSXzNfT1BDT0RFX1kxID0gMiwKLSAgQ01QRVhDSDRfUlJSXzBfT1BDT0RFX1gxID0gNiwKLSAgQ01QRVhDSF9SUlJfMF9PUENPREVfWDEgPSA3LAotICBDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gOCwKLSAgQ01QTEVTX1JSUl8wX09QQ09ERV9YMSA9IDgsCi0gIENNUExFU19SUlJfMl9PUENPREVfWTAgPSAwLAotICBDTVBMRVNfUlJSXzJfT1BDT0RFX1kxID0gMCwKLSAgQ01QTEVVX1JSUl8wX09QQ09ERV9YMCA9IDksCi0gIENNUExFVV9SUlJfMF9PUENPREVfWDEgPSA5LAotICBDTVBMRVVfUlJSXzJfT1BDT0RFX1kwID0gMSwKLSAgQ01QTEVVX1JSUl8yX09QQ09ERV9ZMSA9IDEsCi0gIENNUExUU0lfSU1NOF9PUENPREVfWDAgPSA1LAotICBDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gNSwKLSAgQ01QTFRTSV9PUENPREVfWTAgPSA0LAotICBDTVBMVFNJX09QQ09ERV9ZMSA9IDUsCi0gIENNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMCwKLSAgQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDEwLAotICBDTVBMVFNfUlJSXzJfT1BDT0RFX1kwID0gMiwKLSAgQ01QTFRTX1JSUl8yX09QQ09ERV9ZMSA9IDIsCi0gIENNUExUVUlfSU1NOF9PUENPREVfWDAgPSA2LAotICBDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNiwKLSAgQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDExLAotICBDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gMTEsCi0gIENNUExUVV9SUlJfMl9PUENPREVfWTAgPSAzLAotICBDTVBMVFVfUlJSXzJfT1BDT0RFX1kxID0gMywKLSAgQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTIsCi0gIENNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDEyLAotICBDTVBORV9SUlJfM19PUENPREVfWTAgPSAxLAotICBDTVBORV9SUlJfM19PUENPREVfWTEgPSAzLAotICBDTVVMQUZfUlJSXzBfT1BDT0RFX1gwID0gMTMsCi0gIENNVUxBX1JSUl8wX09QQ09ERV9YMCA9IDE0LAotICBDTVVMRlJfUlJSXzBfT1BDT0RFX1gwID0gMTUsCi0gIENNVUxGX1JSUl8wX09QQ09ERV9YMCA9IDE2LAotICBDTVVMSFJfUlJSXzBfT1BDT0RFX1gwID0gMTcsCi0gIENNVUxIX1JSUl8wX09QQ09ERV9YMCA9IDE4LAotICBDTVVMX1JSUl8wX09QQ09ERV9YMCA9IDE5LAotICBDTlRMWl9VTkFSWV9PUENPREVfWDAgPSAxLAotICBDTlRMWl9VTkFSWV9PUENPREVfWTAgPSAxLAotICBDTlRUWl9VTkFSWV9PUENPREVfWDAgPSAyLAotICBDTlRUWl9VTkFSWV9PUENPREVfWTAgPSAyLAotICBDUkMzMl8zMl9SUlJfMF9PUENPREVfWDAgPSAyMCwKLSAgQ1JDMzJfOF9SUlJfMF9PUENPREVfWDAgPSAyMSwKLSAgREJMQUxJR04yX1JSUl8wX09QQ09ERV9YMCA9IDIyLAotICBEQkxBTElHTjJfUlJSXzBfT1BDT0RFX1gxID0gMTMsCi0gIERCTEFMSUdONF9SUlJfMF9PUENPREVfWDAgPSAyMywKLSAgREJMQUxJR040X1JSUl8wX09QQ09ERV9YMSA9IDE0LAotICBEQkxBTElHTjZfUlJSXzBfT1BDT0RFX1gwID0gMjQsCi0gIERCTEFMSUdONl9SUlJfMF9PUENPREVfWDEgPSAxNSwKLSAgREJMQUxJR05fUlJSXzBfT1BDT0RFX1gwID0gMjUsCi0gIERSQUlOX1VOQVJZX09QQ09ERV9YMSA9IDEsCi0gIERUTEJQUl9VTkFSWV9PUENPREVfWDEgPSAyLAotICBFWENINF9SUlJfMF9PUENPREVfWDEgPSAxNiwKLSAgRVhDSF9SUlJfMF9PUENPREVfWDEgPSAxNywKLSAgRkRPVUJMRV9BRERTVUJfUlJSXzBfT1BDT0RFX1gwID0gMjYsCi0gIEZET1VCTEVfQUREX0ZMQUdTX1JSUl8wX09QQ09ERV9YMCA9IDI3LAotICBGRE9VQkxFX01VTF9GTEFHU19SUlJfMF9PUENPREVfWDAgPSAyOCwKLSAgRkRPVUJMRV9QQUNLMV9SUlJfMF9PUENPREVfWDAgPSAyOSwKLSAgRkRPVUJMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzMCwKLSAgRkRPVUJMRV9TVUJfRkxBR1NfUlJSXzBfT1BDT0RFX1gwID0gMzEsCi0gIEZET1VCTEVfVU5QQUNLX01BWF9SUlJfMF9PUENPREVfWDAgPSAzMiwKLSAgRkRPVUJMRV9VTlBBQ0tfTUlOX1JSUl8wX09QQ09ERV9YMCA9IDMzLAotICBGRVRDSEFERDRfUlJSXzBfT1BDT0RFX1gxID0gMTgsCi0gIEZFVENIQURER0VaNF9SUlJfMF9PUENPREVfWDEgPSAxOSwKLSAgRkVUQ0hBRERHRVpfUlJSXzBfT1BDT0RFX1gxID0gMjAsCi0gIEZFVENIQUREX1JSUl8wX09QQ09ERV9YMSA9IDIxLAotICBGRVRDSEFORDRfUlJSXzBfT1BDT0RFX1gxID0gMjIsCi0gIEZFVENIQU5EX1JSUl8wX09QQ09ERV9YMSA9IDIzLAotICBGRVRDSE9SNF9SUlJfMF9PUENPREVfWDEgPSAyNCwKLSAgRkVUQ0hPUl9SUlJfMF9PUENPREVfWDEgPSAyNSwKLSAgRklOVl9VTkFSWV9PUENPREVfWDEgPSAzLAotICBGTFVTSFdCX1VOQVJZX09QQ09ERV9YMSA9IDQsCi0gIEZMVVNIX1VOQVJZX09QQ09ERV9YMSA9IDUsCi0gIEZOT1BfVU5BUllfT1BDT0RFX1gwID0gMywKLSAgRk5PUF9VTkFSWV9PUENPREVfWDEgPSA2LAotICBGTk9QX1VOQVJZX09QQ09ERV9ZMCA9IDMsCi0gIEZOT1BfVU5BUllfT1BDT0RFX1kxID0gOCwKLSAgRlNJTkdMRV9BREQxX1JSUl8wX09QQ09ERV9YMCA9IDM0LAotICBGU0lOR0xFX0FERFNVQjJfUlJSXzBfT1BDT0RFX1gwID0gMzUsCi0gIEZTSU5HTEVfTVVMMV9SUlJfMF9PUENPREVfWDAgPSAzNiwKLSAgRlNJTkdMRV9NVUwyX1JSUl8wX09QQ09ERV9YMCA9IDM3LAotICBGU0lOR0xFX1BBQ0sxX1VOQVJZX09QQ09ERV9YMCA9IDQsCi0gIEZTSU5HTEVfUEFDSzFfVU5BUllfT1BDT0RFX1kwID0gNCwKLSAgRlNJTkdMRV9QQUNLMl9SUlJfMF9PUENPREVfWDAgPSAzOCwKLSAgRlNJTkdMRV9TVUIxX1JSUl8wX09QQ09ERV9YMCA9IDM5LAotICBJQ09IX1VOQVJZX09QQ09ERV9YMSA9IDcsCi0gIElMTF9VTkFSWV9PUENPREVfWDEgPSA4LAotICBJTExfVU5BUllfT1BDT0RFX1kxID0gOSwKLSAgSU1NOF9PUENPREVfWDAgPSA0LAotICBJTU04X09QQ09ERV9YMSA9IDMsCi0gIElOVl9VTkFSWV9PUENPREVfWDEgPSA5LAotICBJUkVUX1VOQVJZX09QQ09ERV9YMSA9IDEwLAotICBKQUxSUF9VTkFSWV9PUENPREVfWDEgPSAxMSwKLSAgSkFMUlBfVU5BUllfT1BDT0RFX1kxID0gMTAsCi0gIEpBTFJfVU5BUllfT1BDT0RFX1gxID0gMTIsCi0gIEpBTFJfVU5BUllfT1BDT0RFX1kxID0gMTEsCi0gIEpBTF9KVU1QX09QQ09ERV9YMSA9IDAsCi0gIEpSUF9VTkFSWV9PUENPREVfWDEgPSAxMywKLSAgSlJQX1VOQVJZX09QQ09ERV9ZMSA9IDEyLAotICBKUl9VTkFSWV9PUENPREVfWDEgPSAxNCwKLSAgSlJfVU5BUllfT1BDT0RFX1kxID0gMTMsCi0gIEpVTVBfT1BDT0RFX1gxID0gNCwKLSAgSl9KVU1QX09QQ09ERV9YMSA9IDEsCi0gIExEMVNfQUREX0lNTThfT1BDT0RFX1gxID0gNywKLSAgTEQxU19PUENPREVfWTIgPSAwLAotICBMRDFTX1VOQVJZX09QQ09ERV9YMSA9IDE1LAotICBMRDFVX0FERF9JTU04X09QQ09ERV9YMSA9IDgsCi0gIExEMVVfT1BDT0RFX1kyID0gMSwKLSAgTEQxVV9VTkFSWV9PUENPREVfWDEgPSAxNiwKLSAgTEQyU19BRERfSU1NOF9PUENPREVfWDEgPSA5LAotICBMRDJTX09QQ09ERV9ZMiA9IDIsCi0gIExEMlNfVU5BUllfT1BDT0RFX1gxID0gMTcsCi0gIExEMlVfQUREX0lNTThfT1BDT0RFX1gxID0gMTAsCi0gIExEMlVfT1BDT0RFX1kyID0gMywKLSAgTEQyVV9VTkFSWV9PUENPREVfWDEgPSAxOCwKLSAgTEQ0U19BRERfSU1NOF9PUENPREVfWDEgPSAxMSwKLSAgTEQ0U19PUENPREVfWTIgPSAxLAotICBMRDRTX1VOQVJZX09QQ09ERV9YMSA9IDE5LAotICBMRDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDEyLAotICBMRDRVX09QQ09ERV9ZMiA9IDIsCi0gIExENFVfVU5BUllfT1BDT0RFX1gxID0gMjAsCi0gIExETkFfVU5BUllfT1BDT0RFX1gxID0gMjEsCi0gIExETlQxU19BRERfSU1NOF9PUENPREVfWDEgPSAxMywKLSAgTEROVDFTX1VOQVJZX09QQ09ERV9YMSA9IDIyLAotICBMRE5UMVVfQUREX0lNTThfT1BDT0RFX1gxID0gMTQsCi0gIExETlQxVV9VTkFSWV9PUENPREVfWDEgPSAyMywKLSAgTEROVDJTX0FERF9JTU04X09QQ09ERV9YMSA9IDE1LAotICBMRE5UMlNfVU5BUllfT1BDT0RFX1gxID0gMjQsCi0gIExETlQyVV9BRERfSU1NOF9PUENPREVfWDEgPSAxNiwKLSAgTEROVDJVX1VOQVJZX09QQ09ERV9YMSA9IDI1LAotICBMRE5UNFNfQUREX0lNTThfT1BDT0RFX1gxID0gMTcsCi0gIExETlQ0U19VTkFSWV9PUENPREVfWDEgPSAyNiwKLSAgTEROVDRVX0FERF9JTU04X09QQ09ERV9YMSA9IDE4LAotICBMRE5UNFVfVU5BUllfT1BDT0RFX1gxID0gMjcsCi0gIExETlRfQUREX0lNTThfT1BDT0RFX1gxID0gMTksCi0gIExETlRfVU5BUllfT1BDT0RFX1gxID0gMjgsCi0gIExEX0FERF9JTU04X09QQ09ERV9YMSA9IDIwLAotICBMRF9PUENPREVfWTIgPSAzLAotICBMRF9VTkFSWV9PUENPREVfWDEgPSAyOSwKLSAgTE5LX1VOQVJZX09QQ09ERV9YMSA9IDMwLAotICBMTktfVU5BUllfT1BDT0RFX1kxID0gMTQsCi0gIExXTkFfQUREX0lNTThfT1BDT0RFX1gxID0gMjEsCi0gIE1GU1BSX0lNTThfT1BDT0RFX1gxID0gMjIsCi0gIE1GX1VOQVJZX09QQ09ERV9YMSA9IDMxLAotICBNTV9CRl9PUENPREVfWDAgPSA3LAotICBNTlpfUlJSXzBfT1BDT0RFX1gwID0gNDAsCi0gIE1OWl9SUlJfMF9PUENPREVfWDEgPSAyNiwKLSAgTU5aX1JSUl80X09QQ09ERV9ZMCA9IDIsCi0gIE1OWl9SUlJfNF9PUENPREVfWTEgPSAyLAotICBNT0RFX09QQ09ERV9ZQTIgPSAxLAotICBNT0RFX09QQ09ERV9ZQjIgPSAyLAotICBNT0RFX09QQ09ERV9ZQzIgPSAzLAotICBNVFNQUl9JTU04X09QQ09ERV9YMSA9IDIzLAotICBNVUxBWF9SUlJfMF9PUENPREVfWDAgPSA0MSwKLSAgTVVMQVhfUlJSXzNfT1BDT0RFX1kwID0gMiwKLSAgTVVMQV9IU19IU19SUlJfMF9PUENPREVfWDAgPSA0MiwKLSAgTVVMQV9IU19IU19SUlJfOV9PUENPREVfWTAgPSAwLAotICBNVUxBX0hTX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQzLAotICBNVUxBX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDQ0LAotICBNVUxBX0hTX0xVX1JSUl8wX09QQ09ERV9YMCA9IDQ1LAotICBNVUxBX0hVX0hVX1JSUl8wX09QQ09ERV9YMCA9IDQ2LAotICBNVUxBX0hVX0hVX1JSUl85X09QQ09ERV9ZMCA9IDEsCi0gIE1VTEFfSFVfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDcsCi0gIE1VTEFfSFVfTFVfUlJSXzBfT1BDT0RFX1gwID0gNDgsCi0gIE1VTEFfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNDksCi0gIE1VTEFfTFNfTFNfUlJSXzlfT1BDT0RFX1kwID0gMiwKLSAgTVVMQV9MU19MVV9SUlJfMF9PUENPREVfWDAgPSA1MCwKLSAgTVVMQV9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA1MSwKLSAgTVVMQV9MVV9MVV9SUlJfOV9PUENPREVfWTAgPSAzLAotICBNVUxYX1JSUl8wX09QQ09ERV9YMCA9IDUyLAotICBNVUxYX1JSUl8zX09QQ09ERV9ZMCA9IDMsCi0gIE1VTF9IU19IU19SUlJfMF9PUENPREVfWDAgPSA1MywKLSAgTVVMX0hTX0hTX1JSUl84X09QQ09ERV9ZMCA9IDAsCi0gIE1VTF9IU19IVV9SUlJfMF9PUENPREVfWDAgPSA1NCwKLSAgTVVMX0hTX0xTX1JSUl8wX09QQ09ERV9YMCA9IDU1LAotICBNVUxfSFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNTYsCi0gIE1VTF9IVV9IVV9SUlJfMF9PUENPREVfWDAgPSA1NywKLSAgTVVMX0hVX0hVX1JSUl84X09QQ09ERV9ZMCA9IDEsCi0gIE1VTF9IVV9MU19SUlJfMF9PUENPREVfWDAgPSA1OCwKLSAgTVVMX0hVX0xVX1JSUl8wX09QQ09ERV9YMCA9IDU5LAotICBNVUxfTFNfTFNfUlJSXzBfT1BDT0RFX1gwID0gNjAsCi0gIE1VTF9MU19MU19SUlJfOF9PUENPREVfWTAgPSAyLAotICBNVUxfTFNfTFVfUlJSXzBfT1BDT0RFX1gwID0gNjEsCi0gIE1VTF9MVV9MVV9SUlJfMF9PUENPREVfWDAgPSA2MiwKLSAgTVVMX0xVX0xVX1JSUl84X09QQ09ERV9ZMCA9IDMsCi0gIE1aX1JSUl8wX09QQ09ERV9YMCA9IDYzLAotICBNWl9SUlJfMF9PUENPREVfWDEgPSAyNywKLSAgTVpfUlJSXzRfT1BDT0RFX1kwID0gMywKLSAgTVpfUlJSXzRfT1BDT0RFX1kxID0gMywKLSAgTkFQX1VOQVJZX09QQ09ERV9YMSA9IDMyLAotICBOT1BfVU5BUllfT1BDT0RFX1gwID0gNSwKLSAgTk9QX1VOQVJZX09QQ09ERV9YMSA9IDMzLAotICBOT1BfVU5BUllfT1BDT0RFX1kwID0gNSwKLSAgTk9QX1VOQVJZX09QQ09ERV9ZMSA9IDE1LAotICBOT1JfUlJSXzBfT1BDT0RFX1gwID0gNjQsCi0gIE5PUl9SUlJfMF9PUENPREVfWDEgPSAyOCwKLSAgTk9SX1JSUl81X09QQ09ERV9ZMCA9IDEsCi0gIE5PUl9SUlJfNV9PUENPREVfWTEgPSAxLAotICBPUklfSU1NOF9PUENPREVfWDAgPSA3LAotICBPUklfSU1NOF9PUENPREVfWDEgPSAyNCwKLSAgT1JfUlJSXzBfT1BDT0RFX1gwID0gNjUsCi0gIE9SX1JSUl8wX09QQ09ERV9YMSA9IDI5LAotICBPUl9SUlJfNV9PUENPREVfWTAgPSAyLAotICBPUl9SUlJfNV9PUENPREVfWTEgPSAyLAotICBQQ05UX1VOQVJZX09QQ09ERV9YMCA9IDYsCi0gIFBDTlRfVU5BUllfT1BDT0RFX1kwID0gNiwKLSAgUkVWQklUU19VTkFSWV9PUENPREVfWDAgPSA3LAotICBSRVZCSVRTX1VOQVJZX09QQ09ERV9ZMCA9IDcsCi0gIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9YMCA9IDgsCi0gIFJFVkJZVEVTX1VOQVJZX09QQ09ERV9ZMCA9IDgsCi0gIFJPVExJX1NISUZUX09QQ09ERV9YMCA9IDEsCi0gIFJPVExJX1NISUZUX09QQ09ERV9YMSA9IDEsCi0gIFJPVExJX1NISUZUX09QQ09ERV9ZMCA9IDAsCi0gIFJPVExJX1NISUZUX09QQ09ERV9ZMSA9IDAsCi0gIFJPVExfUlJSXzBfT1BDT0RFX1gwID0gNjYsCi0gIFJPVExfUlJSXzBfT1BDT0RFX1gxID0gMzAsCi0gIFJPVExfUlJSXzZfT1BDT0RFX1kwID0gMCwKLSAgUk9UTF9SUlJfNl9PUENPREVfWTEgPSAwLAotICBSUlJfMF9PUENPREVfWDAgPSA1LAotICBSUlJfMF9PUENPREVfWDEgPSA1LAotICBSUlJfMF9PUENPREVfWTAgPSA1LAotICBSUlJfMF9PUENPREVfWTEgPSA2LAotICBSUlJfMV9PUENPREVfWTAgPSA2LAotICBSUlJfMV9PUENPREVfWTEgPSA3LAotICBSUlJfMl9PUENPREVfWTAgPSA3LAotICBSUlJfMl9PUENPREVfWTEgPSA4LAotICBSUlJfM19PUENPREVfWTAgPSA4LAotICBSUlJfM19PUENPREVfWTEgPSA5LAotICBSUlJfNF9PUENPREVfWTAgPSA5LAotICBSUlJfNF9PUENPREVfWTEgPSAxMCwKLSAgUlJSXzVfT1BDT0RFX1kwID0gMTAsCi0gIFJSUl81X09QQ09ERV9ZMSA9IDExLAotICBSUlJfNl9PUENPREVfWTAgPSAxMSwKLSAgUlJSXzZfT1BDT0RFX1kxID0gMTIsCi0gIFJSUl83X09QQ09ERV9ZMCA9IDEyLAotICBSUlJfN19PUENPREVfWTEgPSAxMywKLSAgUlJSXzhfT1BDT0RFX1kwID0gMTMsCi0gIFJSUl85X09QQ09ERV9ZMCA9IDE0LAotICBTSElGVF9PUENPREVfWDAgPSA2LAotICBTSElGVF9PUENPREVfWDEgPSA2LAotICBTSElGVF9PUENPREVfWTAgPSAxNSwKLSAgU0hJRlRfT1BDT0RFX1kxID0gMTQsCi0gIFNITDE2SU5TTElfT1BDT0RFX1gwID0gNywKLSAgU0hMMTZJTlNMSV9PUENPREVfWDEgPSA3LAotICBTSEwxQUREWF9SUlJfMF9PUENPREVfWDAgPSA2NywKLSAgU0hMMUFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzEsCi0gIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMCA9IDEsCi0gIFNITDFBRERYX1JSUl83X09QQ09ERV9ZMSA9IDEsCi0gIFNITDFBRERfUlJSXzBfT1BDT0RFX1gwID0gNjgsCi0gIFNITDFBRERfUlJSXzBfT1BDT0RFX1gxID0gMzIsCi0gIFNITDFBRERfUlJSXzFfT1BDT0RFX1kwID0gMCwKLSAgU0hMMUFERF9SUlJfMV9PUENPREVfWTEgPSAwLAotICBTSEwyQUREWF9SUlJfMF9PUENPREVfWDAgPSA2OSwKLSAgU0hMMkFERFhfUlJSXzBfT1BDT0RFX1gxID0gMzMsCi0gIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMCA9IDIsCi0gIFNITDJBRERYX1JSUl83X09QQ09ERV9ZMSA9IDIsCi0gIFNITDJBRERfUlJSXzBfT1BDT0RFX1gwID0gNzAsCi0gIFNITDJBRERfUlJSXzBfT1BDT0RFX1gxID0gMzQsCi0gIFNITDJBRERfUlJSXzFfT1BDT0RFX1kwID0gMSwKLSAgU0hMMkFERF9SUlJfMV9PUENPREVfWTEgPSAxLAotICBTSEwzQUREWF9SUlJfMF9PUENPREVfWDAgPSA3MSwKLSAgU0hMM0FERFhfUlJSXzBfT1BDT0RFX1gxID0gMzUsCi0gIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMCA9IDMsCi0gIFNITDNBRERYX1JSUl83X09QQ09ERV9ZMSA9IDMsCi0gIFNITDNBRERfUlJSXzBfT1BDT0RFX1gwID0gNzIsCi0gIFNITDNBRERfUlJSXzBfT1BDT0RFX1gxID0gMzYsCi0gIFNITDNBRERfUlJSXzFfT1BDT0RFX1kwID0gMiwKLSAgU0hMM0FERF9SUlJfMV9PUENPREVfWTEgPSAyLAotICBTSExJX1NISUZUX09QQ09ERV9YMCA9IDIsCi0gIFNITElfU0hJRlRfT1BDT0RFX1gxID0gMiwKLSAgU0hMSV9TSElGVF9PUENPREVfWTAgPSAxLAotICBTSExJX1NISUZUX09QQ09ERV9ZMSA9IDEsCi0gIFNITFhJX1NISUZUX09QQ09ERV9YMCA9IDMsCi0gIFNITFhJX1NISUZUX09QQ09ERV9YMSA9IDMsCi0gIFNITFhfUlJSXzBfT1BDT0RFX1gwID0gNzMsCi0gIFNITFhfUlJSXzBfT1BDT0RFX1gxID0gMzcsCi0gIFNITF9SUlJfMF9PUENPREVfWDAgPSA3NCwKLSAgU0hMX1JSUl8wX09QQ09ERV9YMSA9IDM4LAotICBTSExfUlJSXzZfT1BDT0RFX1kwID0gMSwKLSAgU0hMX1JSUl82X09QQ09ERV9ZMSA9IDEsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDQsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9YMSA9IDQsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9ZMCA9IDIsCi0gIFNIUlNJX1NISUZUX09QQ09ERV9ZMSA9IDIsCi0gIFNIUlNfUlJSXzBfT1BDT0RFX1gwID0gNzUsCi0gIFNIUlNfUlJSXzBfT1BDT0RFX1gxID0gMzksCi0gIFNIUlNfUlJSXzZfT1BDT0RFX1kwID0gMiwKLSAgU0hSU19SUlJfNl9PUENPREVfWTEgPSAyLAotICBTSFJVSV9TSElGVF9PUENPREVfWDAgPSA1LAotICBTSFJVSV9TSElGVF9PUENPREVfWDEgPSA1LAotICBTSFJVSV9TSElGVF9PUENPREVfWTAgPSAzLAotICBTSFJVSV9TSElGVF9PUENPREVfWTEgPSAzLAotICBTSFJVWElfU0hJRlRfT1BDT0RFX1gwID0gNiwKLSAgU0hSVVhJX1NISUZUX09QQ09ERV9YMSA9IDYsCi0gIFNIUlVYX1JSUl8wX09QQ09ERV9YMCA9IDc2LAotICBTSFJVWF9SUlJfMF9PUENPREVfWDEgPSA0MCwKLSAgU0hSVV9SUlJfMF9PUENPREVfWDAgPSA3NywKLSAgU0hSVV9SUlJfMF9PUENPREVfWDEgPSA0MSwKLSAgU0hSVV9SUlJfNl9PUENPREVfWTAgPSAzLAotICBTSFJVX1JSUl82X09QQ09ERV9ZMSA9IDMsCi0gIFNIVUZGTEVCWVRFU19SUlJfMF9PUENPREVfWDAgPSA3OCwKLSAgU1QxX0FERF9JTU04X09QQ09ERV9YMSA9IDI1LAotICBTVDFfT1BDT0RFX1kyID0gMCwKLSAgU1QxX1JSUl8wX09QQ09ERV9YMSA9IDQyLAotICBTVDJfQUREX0lNTThfT1BDT0RFX1gxID0gMjYsCi0gIFNUMl9PUENPREVfWTIgPSAxLAotICBTVDJfUlJSXzBfT1BDT0RFX1gxID0gNDMsCi0gIFNUNF9BRERfSU1NOF9PUENPREVfWDEgPSAyNywKLSAgU1Q0X09QQ09ERV9ZMiA9IDIsCi0gIFNUNF9SUlJfMF9PUENPREVfWDEgPSA0NCwKLSAgU1ROVDFfQUREX0lNTThfT1BDT0RFX1gxID0gMjgsCi0gIFNUTlQxX1JSUl8wX09QQ09ERV9YMSA9IDQ1LAotICBTVE5UMl9BRERfSU1NOF9PUENPREVfWDEgPSAyOSwKLSAgU1ROVDJfUlJSXzBfT1BDT0RFX1gxID0gNDYsCi0gIFNUTlQ0X0FERF9JTU04X09QQ09ERV9YMSA9IDMwLAotICBTVE5UNF9SUlJfMF9PUENPREVfWDEgPSA0NywKLSAgU1ROVF9BRERfSU1NOF9PUENPREVfWDEgPSAzMSwKLSAgU1ROVF9SUlJfMF9PUENPREVfWDEgPSA0OCwKLSAgU1RfQUREX0lNTThfT1BDT0RFX1gxID0gMzIsCi0gIFNUX09QQ09ERV9ZMiA9IDMsCi0gIFNUX1JSUl8wX09QQ09ERV9YMSA9IDQ5LAotICBTVUJYU0NfUlJSXzBfT1BDT0RFX1gwID0gNzksCi0gIFNVQlhTQ19SUlJfMF9PUENPREVfWDEgPSA1MCwKLSAgU1VCWF9SUlJfMF9PUENPREVfWDAgPSA4MCwKLSAgU1VCWF9SUlJfMF9PUENPREVfWDEgPSA1MSwKLSAgU1VCWF9SUlJfMF9PUENPREVfWTAgPSAyLAotICBTVUJYX1JSUl8wX09QQ09ERV9ZMSA9IDIsCi0gIFNVQl9SUlJfMF9PUENPREVfWDAgPSA4MSwKLSAgU1VCX1JSUl8wX09QQ09ERV9YMSA9IDUyLAotICBTVUJfUlJSXzBfT1BDT0RFX1kwID0gMywKLSAgU1VCX1JSUl8wX09QQ09ERV9ZMSA9IDMsCi0gIFNXSU5UMF9VTkFSWV9PUENPREVfWDEgPSAzNCwKLSAgU1dJTlQxX1VOQVJZX09QQ09ERV9YMSA9IDM1LAotICBTV0lOVDJfVU5BUllfT1BDT0RFX1gxID0gMzYsCi0gIFNXSU5UM19VTkFSWV9PUENPREVfWDEgPSAzNywKLSAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1gwID0gOSwKLSAgVEJMSURYQjBfVU5BUllfT1BDT0RFX1kwID0gOSwKLSAgVEJMSURYQjFfVU5BUllfT1BDT0RFX1gwID0gMTAsCi0gIFRCTElEWEIxX1VOQVJZX09QQ09ERV9ZMCA9IDEwLAotICBUQkxJRFhCMl9VTkFSWV9PUENPREVfWDAgPSAxMSwKLSAgVEJMSURYQjJfVU5BUllfT1BDT0RFX1kwID0gMTEsCi0gIFRCTElEWEIzX1VOQVJZX09QQ09ERV9YMCA9IDEyLAotICBUQkxJRFhCM19VTkFSWV9PUENPREVfWTAgPSAxMiwKLSAgVU5BUllfUlJSXzBfT1BDT0RFX1gwID0gODIsCi0gIFVOQVJZX1JSUl8wX09QQ09ERV9YMSA9IDUzLAotICBVTkFSWV9SUlJfMV9PUENPREVfWTAgPSAzLAotICBVTkFSWV9SUlJfMV9PUENPREVfWTEgPSAzLAotICBWMUFERElfSU1NOF9PUENPREVfWDAgPSA4LAotICBWMUFERElfSU1NOF9PUENPREVfWDEgPSAzMywKLSAgVjFBRERVQ19SUlJfMF9PUENPREVfWDAgPSA4MywKLSAgVjFBRERVQ19SUlJfMF9PUENPREVfWDEgPSA1NCwKLSAgVjFBRERfUlJSXzBfT1BDT0RFX1gwID0gODQsCi0gIFYxQUREX1JSUl8wX09QQ09ERV9YMSA9IDU1LAotICBWMUFESUZGVV9SUlJfMF9PUENPREVfWDAgPSA4NSwKLSAgVjFBVkdVX1JSUl8wX09QQ09ERV9YMCA9IDg2LAotICBWMUNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDksCi0gIFYxQ01QRVFJX0lNTThfT1BDT0RFX1gxID0gMzQsCi0gIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gwID0gODcsCi0gIFYxQ01QRVFfUlJSXzBfT1BDT0RFX1gxID0gNTYsCi0gIFYxQ01QTEVTX1JSUl8wX09QQ09ERV9YMCA9IDg4LAotICBWMUNNUExFU19SUlJfMF9PUENPREVfWDEgPSA1NywKLSAgVjFDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gODksCi0gIFYxQ01QTEVVX1JSUl8wX09QQ09ERV9YMSA9IDU4LAotICBWMUNNUExUU0lfSU1NOF9PUENPREVfWDAgPSAxMCwKLSAgVjFDTVBMVFNJX0lNTThfT1BDT0RFX1gxID0gMzUsCi0gIFYxQ01QTFRTX1JSUl8wX09QQ09ERV9YMCA9IDkwLAotICBWMUNNUExUU19SUlJfMF9PUENPREVfWDEgPSA1OSwKLSAgVjFDTVBMVFVJX0lNTThfT1BDT0RFX1gwID0gMTEsCi0gIFYxQ01QTFRVSV9JTU04X09QQ09ERV9YMSA9IDM2LAotICBWMUNNUExUVV9SUlJfMF9PUENPREVfWDAgPSA5MSwKLSAgVjFDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNjAsCi0gIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gOTIsCi0gIFYxQ01QTkVfUlJSXzBfT1BDT0RFX1gxID0gNjEsCi0gIFYxRERPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjEsCi0gIFYxRERPVFBVU0FfUlJSXzBfT1BDT0RFX1gwID0gOTMsCi0gIFYxRERPVFBVU19SUlJfMF9PUENPREVfWDAgPSA5NCwKLSAgVjFERE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTYyLAotICBWMURPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDk1LAotICBWMURPVFBVQV9SUlJfMF9PUENPREVfWDAgPSAxNjMsCi0gIFYxRE9UUFVTQV9SUlJfMF9PUENPREVfWDAgPSA5NiwKLSAgVjFET1RQVVNfUlJSXzBfT1BDT0RFX1gwID0gOTcsCi0gIFYxRE9UUFVfUlJSXzBfT1BDT0RFX1gwID0gMTY0LAotICBWMURPVFBfUlJSXzBfT1BDT0RFX1gwID0gOTgsCi0gIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gwID0gOTksCi0gIFYxSU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gNjIsCi0gIFYxSU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTAwLAotICBWMUlOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDYzLAotICBWMU1BWFVJX0lNTThfT1BDT0RFX1gwID0gMTIsCi0gIFYxTUFYVUlfSU1NOF9PUENPREVfWDEgPSAzNywKLSAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMCA9IDEwMSwKLSAgVjFNQVhVX1JSUl8wX09QQ09ERV9YMSA9IDY0LAotICBWMU1JTlVJX0lNTThfT1BDT0RFX1gwID0gMTMsCi0gIFYxTUlOVUlfSU1NOF9PUENPREVfWDEgPSAzOCwKLSAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMCA9IDEwMiwKLSAgVjFNSU5VX1JSUl8wX09QQ09ERV9YMSA9IDY1LAotICBWMU1OWl9SUlJfMF9PUENPREVfWDAgPSAxMDMsCi0gIFYxTU5aX1JSUl8wX09QQ09ERV9YMSA9IDY2LAotICBWMU1VTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEwNCwKLSAgVjFNVUxVU19SUlJfMF9PUENPREVfWDAgPSAxMDUsCi0gIFYxTVVMVV9SUlJfMF9PUENPREVfWDAgPSAxMDYsCi0gIFYxTVpfUlJSXzBfT1BDT0RFX1gwID0gMTA3LAotICBWMU1aX1JSUl8wX09QQ09ERV9YMSA9IDY3LAotICBWMVNBREFVX1JSUl8wX09QQ09ERV9YMCA9IDEwOCwKLSAgVjFTQURVX1JSUl8wX09QQ09ERV9YMCA9IDEwOSwKLSAgVjFTSExJX1NISUZUX09QQ09ERV9YMCA9IDcsCi0gIFYxU0hMSV9TSElGVF9PUENPREVfWDEgPSA3LAotICBWMVNITF9SUlJfMF9PUENPREVfWDAgPSAxMTAsCi0gIFYxU0hMX1JSUl8wX09QQ09ERV9YMSA9IDY4LAotICBWMVNIUlNJX1NISUZUX09QQ09ERV9YMCA9IDgsCi0gIFYxU0hSU0lfU0hJRlRfT1BDT0RFX1gxID0gOCwKLSAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDExMSwKLSAgVjFTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDY5LAotICBWMVNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDksCi0gIFYxU0hSVUlfU0hJRlRfT1BDT0RFX1gxID0gOSwKLSAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDExMiwKLSAgVjFTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDcwLAotICBWMVNVQlVDX1JSUl8wX09QQ09ERV9YMCA9IDExMywKLSAgVjFTVUJVQ19SUlJfMF9PUENPREVfWDEgPSA3MSwKLSAgVjFTVUJfUlJSXzBfT1BDT0RFX1gwID0gMTE0LAotICBWMVNVQl9SUlJfMF9PUENPREVfWDEgPSA3MiwKLSAgVjJBRERJX0lNTThfT1BDT0RFX1gwID0gMTQsCi0gIFYyQURESV9JTU04X09QQ09ERV9YMSA9IDM5LAotICBWMkFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDExNSwKLSAgVjJBRERTQ19SUlJfMF9PUENPREVfWDEgPSA3MywKLSAgVjJBRERfUlJSXzBfT1BDT0RFX1gwID0gMTE2LAotICBWMkFERF9SUlJfMF9PUENPREVfWDEgPSA3NCwKLSAgVjJBRElGRlNfUlJSXzBfT1BDT0RFX1gwID0gMTE3LAotICBWMkFWR1NfUlJSXzBfT1BDT0RFX1gwID0gMTE4LAotICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMCA9IDE1LAotICBWMkNNUEVRSV9JTU04X09QQ09ERV9YMSA9IDQwLAotICBWMkNNUEVRX1JSUl8wX09QQ09ERV9YMCA9IDExOSwKLSAgVjJDTVBFUV9SUlJfMF9PUENPREVfWDEgPSA3NSwKLSAgVjJDTVBMRVNfUlJSXzBfT1BDT0RFX1gwID0gMTIwLAotICBWMkNNUExFU19SUlJfMF9PUENPREVfWDEgPSA3NiwKLSAgVjJDTVBMRVVfUlJSXzBfT1BDT0RFX1gwID0gMTIxLAotICBWMkNNUExFVV9SUlJfMF9PUENPREVfWDEgPSA3NywKLSAgVjJDTVBMVFNJX0lNTThfT1BDT0RFX1gwID0gMTYsCi0gIFYyQ01QTFRTSV9JTU04X09QQ09ERV9YMSA9IDQxLAotICBWMkNNUExUU19SUlJfMF9PUENPREVfWDAgPSAxMjIsCi0gIFYyQ01QTFRTX1JSUl8wX09QQ09ERV9YMSA9IDc4LAotICBWMkNNUExUVUlfSU1NOF9PUENPREVfWDAgPSAxNywKLSAgVjJDTVBMVFVJX0lNTThfT1BDT0RFX1gxID0gNDIsCi0gIFYyQ01QTFRVX1JSUl8wX09QQ09ERV9YMCA9IDEyMywKLSAgVjJDTVBMVFVfUlJSXzBfT1BDT0RFX1gxID0gNzksCi0gIFYyQ01QTkVfUlJSXzBfT1BDT0RFX1gwID0gMTI0LAotICBWMkNNUE5FX1JSUl8wX09QQ09ERV9YMSA9IDgwLAotICBWMkRPVFBBX1JSUl8wX09QQ09ERV9YMCA9IDEyNSwKLSAgVjJET1RQX1JSUl8wX09QQ09ERV9YMCA9IDEyNiwKLSAgVjJJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxMjcsCi0gIFYySU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gODEsCi0gIFYySU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTI4LAotICBWMklOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDgyLAotICBWMk1BWFNJX0lNTThfT1BDT0RFX1gwID0gMTgsCi0gIFYyTUFYU0lfSU1NOF9PUENPREVfWDEgPSA0MywKLSAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMCA9IDEyOSwKLSAgVjJNQVhTX1JSUl8wX09QQ09ERV9YMSA9IDgzLAotICBWMk1JTlNJX0lNTThfT1BDT0RFX1gwID0gMTksCi0gIFYyTUlOU0lfSU1NOF9PUENPREVfWDEgPSA0NCwKLSAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMCA9IDEzMCwKLSAgVjJNSU5TX1JSUl8wX09QQ09ERV9YMSA9IDg0LAotICBWMk1OWl9SUlJfMF9PUENPREVfWDAgPSAxMzEsCi0gIFYyTU5aX1JSUl8wX09QQ09ERV9YMSA9IDg1LAotICBWMk1VTEZTQ19SUlJfMF9PUENPREVfWDAgPSAxMzIsCi0gIFYyTVVMU19SUlJfMF9PUENPREVfWDAgPSAxMzMsCi0gIFYyTVVMVFNfUlJSXzBfT1BDT0RFX1gwID0gMTM0LAotICBWMk1aX1JSUl8wX09QQ09ERV9YMCA9IDEzNSwKLSAgVjJNWl9SUlJfMF9PUENPREVfWDEgPSA4NiwKLSAgVjJQQUNLSF9SUlJfMF9PUENPREVfWDAgPSAxMzYsCi0gIFYyUEFDS0hfUlJSXzBfT1BDT0RFX1gxID0gODcsCi0gIFYyUEFDS0xfUlJSXzBfT1BDT0RFX1gwID0gMTM3LAotICBWMlBBQ0tMX1JSUl8wX09QQ09ERV9YMSA9IDg4LAotICBWMlBBQ0tVQ19SUlJfMF9PUENPREVfWDAgPSAxMzgsCi0gIFYyUEFDS1VDX1JSUl8wX09QQ09ERV9YMSA9IDg5LAotICBWMlNBREFTX1JSUl8wX09QQ09ERV9YMCA9IDEzOSwKLSAgVjJTQURBVV9SUlJfMF9PUENPREVfWDAgPSAxNDAsCi0gIFYyU0FEU19SUlJfMF9PUENPREVfWDAgPSAxNDEsCi0gIFYyU0FEVV9SUlJfMF9PUENPREVfWDAgPSAxNDIsCi0gIFYyU0hMSV9TSElGVF9PUENPREVfWDAgPSAxMCwKLSAgVjJTSExJX1NISUZUX09QQ09ERV9YMSA9IDEwLAotICBWMlNITFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0MywKLSAgVjJTSExTQ19SUlJfMF9PUENPREVfWDEgPSA5MCwKLSAgVjJTSExfUlJSXzBfT1BDT0RFX1gwID0gMTQ0LAotICBWMlNITF9SUlJfMF9PUENPREVfWDEgPSA5MSwKLSAgVjJTSFJTSV9TSElGVF9PUENPREVfWDAgPSAxMSwKLSAgVjJTSFJTSV9TSElGVF9PUENPREVfWDEgPSAxMSwKLSAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE0NSwKLSAgVjJTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDkyLAotICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMCA9IDEyLAotICBWMlNIUlVJX1NISUZUX09QQ09ERV9YMSA9IDEyLAotICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gwID0gMTQ2LAotICBWMlNIUlVfUlJSXzBfT1BDT0RFX1gxID0gOTMsCi0gIFYyU1VCU0NfUlJSXzBfT1BDT0RFX1gwID0gMTQ3LAotICBWMlNVQlNDX1JSUl8wX09QQ09ERV9YMSA9IDk0LAotICBWMlNVQl9SUlJfMF9PUENPREVfWDAgPSAxNDgsCi0gIFYyU1VCX1JSUl8wX09QQ09ERV9YMSA9IDk1LAotICBWNEFERFNDX1JSUl8wX09QQ09ERV9YMCA9IDE0OSwKLSAgVjRBRERTQ19SUlJfMF9PUENPREVfWDEgPSA5NiwKLSAgVjRBRERfUlJSXzBfT1BDT0RFX1gwID0gMTUwLAotICBWNEFERF9SUlJfMF9PUENPREVfWDEgPSA5NywKLSAgVjRJTlRfSF9SUlJfMF9PUENPREVfWDAgPSAxNTEsCi0gIFY0SU5UX0hfUlJSXzBfT1BDT0RFX1gxID0gOTgsCi0gIFY0SU5UX0xfUlJSXzBfT1BDT0RFX1gwID0gMTUyLAotICBWNElOVF9MX1JSUl8wX09QQ09ERV9YMSA9IDk5LAotICBWNFBBQ0tTQ19SUlJfMF9PUENPREVfWDAgPSAxNTMsCi0gIFY0UEFDS1NDX1JSUl8wX09QQ09ERV9YMSA9IDEwMCwKLSAgVjRTSExTQ19SUlJfMF9PUENPREVfWDAgPSAxNTQsCi0gIFY0U0hMU0NfUlJSXzBfT1BDT0RFX1gxID0gMTAxLAotICBWNFNITF9SUlJfMF9PUENPREVfWDAgPSAxNTUsCi0gIFY0U0hMX1JSUl8wX09QQ09ERV9YMSA9IDEwMiwKLSAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMCA9IDE1NiwKLSAgVjRTSFJTX1JSUl8wX09QQ09ERV9YMSA9IDEwMywKLSAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMCA9IDE1NywKLSAgVjRTSFJVX1JSUl8wX09QQ09ERV9YMSA9IDEwNCwKLSAgVjRTVUJTQ19SUlJfMF9PUENPREVfWDAgPSAxNTgsCi0gIFY0U1VCU0NfUlJSXzBfT1BDT0RFX1gxID0gMTA1LAotICBWNFNVQl9SUlJfMF9PUENPREVfWDAgPSAxNTksCi0gIFY0U1VCX1JSUl8wX09QQ09ERV9YMSA9IDEwNiwKLSAgV0g2NF9VTkFSWV9PUENPREVfWDEgPSAzOCwKLSAgWE9SSV9JTU04X09QQ09ERV9YMCA9IDIwLAotICBYT1JJX0lNTThfT1BDT0RFX1gxID0gNDUsCi0gIFhPUl9SUlJfMF9PUENPREVfWDAgPSAxNjAsCi0gIFhPUl9SUlJfMF9PUENPREVfWDEgPSAxMDcsCi0gIFhPUl9SUlJfNV9PUENPREVfWTAgPSAzLAotICBYT1JfUlJSXzVfT1BDT0RFX1kxID0gMwotfTsKLQotI2VuZGlmIC8qICFfVElMRV9PUENPREVfQ09OU1RBTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IDVlMmQwMzMuLjYzNDhlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApAQCAtMTUsNiArMTUsOCBAQAogI2lmbmRlZiBfQVNNX1RJTEVfU0lHQ09OVEVYVF9ICiAjZGVmaW5lIF9BU01fVElMRV9TSUdDT05URVhUX0gKIAorLyogRG9uJ3QgcG9sbHV0ZSB0aGUgbmFtZXNwYWNlIHNpbmNlIDxzaWduYWwuaD4gaW5jbHVkZXMgdGhpcyBmaWxlLiAqLworI2RlZmluZSBfX25lZWRfaW50X3JlZ190CiAjaW5jbHVkZSA8YXJjaC9hYmkuaD4KIAogLyoKQEAgLTIyLDE0ICsyNCwxNCBAQAogICogYnV0IGlzIHNpbXBsaWZpZWQgc2luY2Ugd2Uga25vdyB0aGUgZmF1bHQgaXMgZnJvbSB1c2Vyc3BhY2UuCiAgKi8KIHN0cnVjdCBzaWdjb250ZXh0IHsKLQl1aW50X3JlZ190IGdyZWdzWzUzXTsJLyogR2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gICovCi0JdWludF9yZWdfdCB0cDsJCS8qIEFsaWFzZXMgZ3JlZ3NbVFJFR19UUF0uICAqLwotCXVpbnRfcmVnX3Qgc3A7CQkvKiBBbGlhc2VzIGdyZWdzW1RSRUdfU1BdLiAgKi8KLQl1aW50X3JlZ190IGxyOwkJLyogQWxpYXNlcyBncmVnc1tUUkVHX0xSXS4gICovCi0JdWludF9yZWdfdCBwYzsJCS8qIFByb2dyYW0gY291bnRlci4gICovCi0JdWludF9yZWdfdCBpY3M7CQkvKiBJbiBJbnRlcnJ1cHQgQ3JpdGljYWwgU2VjdGlvbj8gICovCi0JdWludF9yZWdfdCBmYXVsdG51bTsJLyogRmF1bHQgbnVtYmVyLiAgKi8KLQl1aW50X3JlZ190IHBhZFs1XTsKKwlfX3VpbnRfcmVnX3QgZ3JlZ3NbNTNdOwkvKiBHZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgKi8KKwlfX3VpbnRfcmVnX3QgdHA7CS8qIEFsaWFzZXMgZ3JlZ3NbVFJFR19UUF0uICAqLworCV9fdWludF9yZWdfdCBzcDsJLyogQWxpYXNlcyBncmVnc1tUUkVHX1NQXS4gICovCisJX191aW50X3JlZ190IGxyOwkvKiBBbGlhc2VzIGdyZWdzW1RSRUdfTFJdLiAgKi8KKwlfX3VpbnRfcmVnX3QgcGM7CS8qIFByb2dyYW0gY291bnRlci4gICovCisJX191aW50X3JlZ190IGljczsJLyogSW4gSW50ZXJydXB0IENyaXRpY2FsIFNlY3Rpb24/ICAqLworCV9fdWludF9yZWdfdCBmYXVsdG51bTsJLyogRmF1bHQgbnVtYmVyLiAgKi8KKwlfX3VpbnRfcmVnX3QgcGFkWzVdOwogfTsKIAogI2VuZGlmIC8qIF9BU01fVElMRV9TSUdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2MuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg0OWJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzYy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX3RpbGVneF9fCisjaW5jbHVkZSA8YXNtL3RpbGUtZGVzY18zMi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vdGlsZS1kZXNjXzY0Lmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2NfMzIuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aWxlLWRlc2NfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDljNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY18zMi5oCkBAIC0wLDAgKzEsNTUzIEBACisvKiBUSUxFUHJvIG9wY29kZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqCisgKgorICoKKyAqLworCisjaWZuZGVmIG9wY29kZV90aWxlcHJvX2gKKyNkZWZpbmUgb3Bjb2RlX3RpbGVwcm9faAorCisjaW5jbHVkZSA8YXJjaC9vcGNvZGUuaD4KKworCitlbnVtCit7CisgIFRJTEVQUk9fTUFYX09QRVJBTkRTID0gNSAvKiBtbSAqLworfTsKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVQUk9fT1BDX0JQVCwKKyAgVElMRVBST19PUENfSU5GTywKKyAgVElMRVBST19PUENfSU5GT0wsCisgIFRJTEVQUk9fT1BDX0osCisgIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfTU9WRSwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfTU9WRUksCisgIFRJTEVQUk9fT1BDX01PVkVJX1NOLAorICBUSUxFUFJPX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX01PVkVMSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUxJUywKKyAgVElMRVBST19PUENfUFJFRkVUQ0gsCisgIFRJTEVQUk9fT1BDX1JBSVNFLAorICBUSUxFUFJPX09QQ19BREQsCisgIFRJTEVQUk9fT1BDX0FERF9TTiwKKyAgVElMRVBST19PUENfQUREQiwKKyAgVElMRVBST19PUENfQUREQl9TTiwKKyAgVElMRVBST19PUENfQUREQlNfVSwKKyAgVElMRVBST19PUENfQUREQlNfVV9TTiwKKyAgVElMRVBST19PUENfQURESCwKKyAgVElMRVBST19PUENfQURESF9TTiwKKyAgVElMRVBST19PUENfQURESFMsCisgIFRJTEVQUk9fT1BDX0FEREhTX1NOLAorICBUSUxFUFJPX09QQ19BRERJLAorICBUSUxFUFJPX09QQ19BRERJX1NOLAorICBUSUxFUFJPX09QQ19BRERJQiwKKyAgVElMRVBST19PUENfQURESUJfU04sCisgIFRJTEVQUk9fT1BDX0FERElILAorICBUSUxFUFJPX09QQ19BRERJSF9TTiwKKyAgVElMRVBST19PUENfQURETEksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLAorICBUSUxFUFJPX09QQ19BRERMSVMsCisgIFRJTEVQUk9fT1BDX0FERFMsCisgIFRJTEVQUk9fT1BDX0FERFNfU04sCisgIFRJTEVQUk9fT1BDX0FESUZGQl9VLAorICBUSUxFUFJPX09QQ19BRElGRkJfVV9TTiwKKyAgVElMRVBST19PUENfQURJRkZILAorICBUSUxFUFJPX09QQ19BRElGRkhfU04sCisgIFRJTEVQUk9fT1BDX0FORCwKKyAgVElMRVBST19PUENfQU5EX1NOLAorICBUSUxFUFJPX09QQ19BTkRJLAorICBUSUxFUFJPX09QQ19BTkRJX1NOLAorICBUSUxFUFJPX09QQ19BVUxJLAorICBUSUxFUFJPX09QQ19BVkdCX1UsCisgIFRJTEVQUk9fT1BDX0FWR0JfVV9TTiwKKyAgVElMRVBST19PUENfQVZHSCwKKyAgVElMRVBST19PUENfQVZHSF9TTiwKKyAgVElMRVBST19PUENfQkJOUywKKyAgVElMRVBST19PUENfQkJOU19TTiwKKyAgVElMRVBST19PUENfQkJOU1QsCisgIFRJTEVQUk9fT1BDX0JCTlNUX1NOLAorICBUSUxFUFJPX09QQ19CQlMsCisgIFRJTEVQUk9fT1BDX0JCU19TTiwKKyAgVElMRVBST19PUENfQkJTVCwKKyAgVElMRVBST19PUENfQkJTVF9TTiwKKyAgVElMRVBST19PUENfQkdFWiwKKyAgVElMRVBST19PUENfQkdFWl9TTiwKKyAgVElMRVBST19PUENfQkdFWlQsCisgIFRJTEVQUk9fT1BDX0JHRVpUX1NOLAorICBUSUxFUFJPX09QQ19CR1osCisgIFRJTEVQUk9fT1BDX0JHWl9TTiwKKyAgVElMRVBST19PUENfQkdaVCwKKyAgVElMRVBST19PUENfQkdaVF9TTiwKKyAgVElMRVBST19PUENfQklUWCwKKyAgVElMRVBST19PUENfQklUWF9TTiwKKyAgVElMRVBST19PUENfQkxFWiwKKyAgVElMRVBST19PUENfQkxFWl9TTiwKKyAgVElMRVBST19PUENfQkxFWlQsCisgIFRJTEVQUk9fT1BDX0JMRVpUX1NOLAorICBUSUxFUFJPX09QQ19CTFosCisgIFRJTEVQUk9fT1BDX0JMWl9TTiwKKyAgVElMRVBST19PUENfQkxaVCwKKyAgVElMRVBST19PUENfQkxaVF9TTiwKKyAgVElMRVBST19PUENfQk5aLAorICBUSUxFUFJPX09QQ19CTlpfU04sCisgIFRJTEVQUk9fT1BDX0JOWlQsCisgIFRJTEVQUk9fT1BDX0JOWlRfU04sCisgIFRJTEVQUk9fT1BDX0JZVEVYLAorICBUSUxFUFJPX09QQ19CWVRFWF9TTiwKKyAgVElMRVBST19PUENfQlosCisgIFRJTEVQUk9fT1BDX0JaX1NOLAorICBUSUxFUFJPX09QQ19CWlQsCisgIFRJTEVQUk9fT1BDX0JaVF9TTiwKKyAgVElMRVBST19PUENfQ0xaLAorICBUSUxFUFJPX09QQ19DTFpfU04sCisgIFRJTEVQUk9fT1BDX0NSQzMyXzMyLAorICBUSUxFUFJPX09QQ19DUkMzMl8zMl9TTiwKKyAgVElMRVBST19PUENfQ1JDMzJfOCwKKyAgVElMRVBST19PUENfQ1JDMzJfOF9TTiwKKyAgVElMRVBST19PUENfQ1RaLAorICBUSUxFUFJPX09QQ19DVFpfU04sCisgIFRJTEVQUk9fT1BDX0RSQUlOLAorICBUSUxFUFJPX09QQ19EVExCUFIsCisgIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLAorICBUSUxFUFJPX09QQ19EV09SRF9BTElHTl9TTiwKKyAgVElMRVBST19PUENfRklOViwKKyAgVElMRVBST19PUENfRkxVU0gsCisgIFRJTEVQUk9fT1BDX0ZOT1AsCisgIFRJTEVQUk9fT1BDX0lDT0gsCisgIFRJTEVQUk9fT1BDX0lMTCwKKyAgVElMRVBST19PUENfSU5USEIsCisgIFRJTEVQUk9fT1BDX0lOVEhCX1NOLAorICBUSUxFUFJPX09QQ19JTlRISCwKKyAgVElMRVBST19PUENfSU5USEhfU04sCisgIFRJTEVQUk9fT1BDX0lOVExCLAorICBUSUxFUFJPX09QQ19JTlRMQl9TTiwKKyAgVElMRVBST19PUENfSU5UTEgsCisgIFRJTEVQUk9fT1BDX0lOVExIX1NOLAorICBUSUxFUFJPX09QQ19JTlYsCisgIFRJTEVQUk9fT1BDX0lSRVQsCisgIFRJTEVQUk9fT1BDX0pBTEIsCisgIFRJTEVQUk9fT1BDX0pBTEYsCisgIFRJTEVQUk9fT1BDX0pBTFIsCisgIFRJTEVQUk9fT1BDX0pBTFJQLAorICBUSUxFUFJPX09QQ19KQiwKKyAgVElMRVBST19PUENfSkYsCisgIFRJTEVQUk9fT1BDX0pSLAorICBUSUxFUFJPX09QQ19KUlAsCisgIFRJTEVQUk9fT1BDX0xCLAorICBUSUxFUFJPX09QQ19MQl9TTiwKKyAgVElMRVBST19PUENfTEJfVSwKKyAgVElMRVBST19PUENfTEJfVV9TTiwKKyAgVElMRVBST19PUENfTEJBREQsCisgIFRJTEVQUk9fT1BDX0xCQUREX1NOLAorICBUSUxFUFJPX09QQ19MQkFERF9VLAorICBUSUxFUFJPX09QQ19MQkFERF9VX1NOLAorICBUSUxFUFJPX09QQ19MSCwKKyAgVElMRVBST19PUENfTEhfU04sCisgIFRJTEVQUk9fT1BDX0xIX1UsCisgIFRJTEVQUk9fT1BDX0xIX1VfU04sCisgIFRJTEVQUk9fT1BDX0xIQURELAorICBUSUxFUFJPX09QQ19MSEFERF9TTiwKKyAgVElMRVBST19PUENfTEhBRERfVSwKKyAgVElMRVBST19PUENfTEhBRERfVV9TTiwKKyAgVElMRVBST19PUENfTE5LLAorICBUSUxFUFJPX09QQ19MTktfU04sCisgIFRJTEVQUk9fT1BDX0xXLAorICBUSUxFUFJPX09QQ19MV19TTiwKKyAgVElMRVBST19PUENfTFdfTkEsCisgIFRJTEVQUk9fT1BDX0xXX05BX1NOLAorICBUSUxFUFJPX09QQ19MV0FERCwKKyAgVElMRVBST19PUENfTFdBRERfU04sCisgIFRJTEVQUk9fT1BDX0xXQUREX05BLAorICBUSUxFUFJPX09QQ19MV0FERF9OQV9TTiwKKyAgVElMRVBST19PUENfTUFYQl9VLAorICBUSUxFUFJPX09QQ19NQVhCX1VfU04sCisgIFRJTEVQUk9fT1BDX01BWEgsCisgIFRJTEVQUk9fT1BDX01BWEhfU04sCisgIFRJTEVQUk9fT1BDX01BWElCX1UsCisgIFRJTEVQUk9fT1BDX01BWElCX1VfU04sCisgIFRJTEVQUk9fT1BDX01BWElILAorICBUSUxFUFJPX09QQ19NQVhJSF9TTiwKKyAgVElMRVBST19PUENfTUYsCisgIFRJTEVQUk9fT1BDX01GU1BSLAorICBUSUxFUFJPX09QQ19NSU5CX1UsCisgIFRJTEVQUk9fT1BDX01JTkJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSCwKKyAgVElMRVBST19PUENfTUlOSF9TTiwKKyAgVElMRVBST19PUENfTUlOSUJfVSwKKyAgVElMRVBST19PUENfTUlOSUJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSUgsCisgIFRJTEVQUk9fT1BDX01JTklIX1NOLAorICBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU5aLAorICBUSUxFUFJPX09QQ19NTlpfU04sCisgIFRJTEVQUk9fT1BDX01OWkIsCisgIFRJTEVQUk9fT1BDX01OWkJfU04sCisgIFRJTEVQUk9fT1BDX01OWkgsCisgIFRJTEVQUk9fT1BDX01OWkhfU04sCisgIFRJTEVQUk9fT1BDX01UU1BSLAorICBUSUxFUFJPX09QQ19NVUxISF9TUywKKyAgVElMRVBST19PUENfTVVMSEhfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIX1NVLAorICBUSUxFUFJPX09QQ19NVUxISF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSEhfVVUsCisgIFRJTEVQUk9fT1BDX01VTEhIX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TU19TTiwKKyAgVElMRVBST19PUENfTVVMSEhBX1NVLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1VfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIQV9VVSwKKyAgVElMRVBST19PUENfTVVMSEhBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITF9TUywKKyAgVElMRVBST19PUENfTVVMSExfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1NVLAorICBUSUxFUFJPX09QQ19NVUxITF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSExfVVMsCisgIFRJTEVQUk9fT1BDX01VTEhMX1VTX1NOLAorICBUSUxFUFJPX09QQ19NVUxITF9VVSwKKyAgVElMRVBST19PUENfTVVMSExfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TUywKKyAgVElMRVBST19PUENfTVVMSExBX1NTX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfU1UsCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMSExBX1VTLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9VVSwKKyAgVElMRVBST19PUENfTVVMSExBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxITFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTF9TUywKKyAgVElMRVBST19PUENfTVVMTExfU1NfU04sCisgIFRJTEVQUk9fT1BDX01VTExMX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTF9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMTExfVVUsCisgIFRJTEVQUk9fT1BDX01VTExMX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTExMQV9TU19TTiwKKyAgVElMRVBST19PUENfTVVMTExBX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTEFfU1VfU04sCisgIFRJTEVQUk9fT1BDX01VTExMQV9VVSwKKyAgVElMRVBST19PUENfTVVMTExBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxMTFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVk5aLAorICBUSUxFUFJPX09QQ19NVk5aX1NOLAorICBUSUxFUFJPX09QQ19NVlosCisgIFRJTEVQUk9fT1BDX01WWl9TTiwKKyAgVElMRVBST19PUENfTVosCisgIFRJTEVQUk9fT1BDX01aX1NOLAorICBUSUxFUFJPX09QQ19NWkIsCisgIFRJTEVQUk9fT1BDX01aQl9TTiwKKyAgVElMRVBST19PUENfTVpILAorICBUSUxFUFJPX09QQ19NWkhfU04sCisgIFRJTEVQUk9fT1BDX05BUCwKKyAgVElMRVBST19PUENfTk9QLAorICBUSUxFUFJPX09QQ19OT1IsCisgIFRJTEVQUk9fT1BDX05PUl9TTiwKKyAgVElMRVBST19PUENfT1IsCisgIFRJTEVQUk9fT1BDX09SX1NOLAorICBUSUxFUFJPX09QQ19PUkksCisgIFRJTEVQUk9fT1BDX09SSV9TTiwKKyAgVElMRVBST19PUENfUEFDS0JTX1UsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLAorICBUSUxFUFJPX09QQ19QQUNLSEIsCisgIFRJTEVQUk9fT1BDX1BBQ0tIQl9TTiwKKyAgVElMRVBST19PUENfUEFDS0hTLAorICBUSUxFUFJPX09QQ19QQUNLSFNfU04sCisgIFRJTEVQUk9fT1BDX1BBQ0tMQiwKKyAgVElMRVBST19PUENfUEFDS0xCX1NOLAorICBUSUxFUFJPX09QQ19QQ05ULAorICBUSUxFUFJPX09QQ19QQ05UX1NOLAorICBUSUxFUFJPX09QQ19STCwKKyAgVElMRVBST19PUENfUkxfU04sCisgIFRJTEVQUk9fT1BDX1JMSSwKKyAgVElMRVBST19PUENfUkxJX1NOLAorICBUSUxFUFJPX09QQ19TMUEsCisgIFRJTEVQUk9fT1BDX1MxQV9TTiwKKyAgVElMRVBST19PUENfUzJBLAorICBUSUxFUFJPX09QQ19TMkFfU04sCisgIFRJTEVQUk9fT1BDX1MzQSwKKyAgVElMRVBST19PUENfUzNBX1NOLAorICBUSUxFUFJPX09QQ19TQURBQl9VLAorICBUSUxFUFJPX09QQ19TQURBQl9VX1NOLAorICBUSUxFUFJPX09QQ19TQURBSCwKKyAgVElMRVBST19PUENfU0FEQUhfU04sCisgIFRJTEVQUk9fT1BDX1NBREFIX1UsCisgIFRJTEVQUk9fT1BDX1NBREFIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NBREJfVSwKKyAgVElMRVBST19PUENfU0FEQl9VX1NOLAorICBUSUxFUFJPX09QQ19TQURILAorICBUSUxFUFJPX09QQ19TQURIX1NOLAorICBUSUxFUFJPX09QQ19TQURIX1UsCisgIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwKKyAgVElMRVBST19PUENfU0IsCisgIFRJTEVQUk9fT1BDX1NCQURELAorICBUSUxFUFJPX09QQ19TRVEsCisgIFRJTEVQUk9fT1BDX1NFUV9TTiwKKyAgVElMRVBST19PUENfU0VRQiwKKyAgVElMRVBST19PUENfU0VRQl9TTiwKKyAgVElMRVBST19PUENfU0VRSCwKKyAgVElMRVBST19PUENfU0VRSF9TTiwKKyAgVElMRVBST19PUENfU0VRSSwKKyAgVElMRVBST19PUENfU0VRSV9TTiwKKyAgVElMRVBST19PUENfU0VRSUIsCisgIFRJTEVQUk9fT1BDX1NFUUlCX1NOLAorICBUSUxFUFJPX09QQ19TRVFJSCwKKyAgVElMRVBST19PUENfU0VRSUhfU04sCisgIFRJTEVQUk9fT1BDX1NILAorICBUSUxFUFJPX09QQ19TSEFERCwKKyAgVElMRVBST19PUENfU0hMLAorICBUSUxFUFJPX09QQ19TSExfU04sCisgIFRJTEVQUk9fT1BDX1NITEIsCisgIFRJTEVQUk9fT1BDX1NITEJfU04sCisgIFRJTEVQUk9fT1BDX1NITEgsCisgIFRJTEVQUk9fT1BDX1NITEhfU04sCisgIFRJTEVQUk9fT1BDX1NITEksCisgIFRJTEVQUk9fT1BDX1NITElfU04sCisgIFRJTEVQUk9fT1BDX1NITElCLAorICBUSUxFUFJPX09QQ19TSExJQl9TTiwKKyAgVElMRVBST19PUENfU0hMSUgsCisgIFRJTEVQUk9fT1BDX1NITElIX1NOLAorICBUSUxFUFJPX09QQ19TSFIsCisgIFRJTEVQUk9fT1BDX1NIUl9TTiwKKyAgVElMRVBST19PUENfU0hSQiwKKyAgVElMRVBST19PUENfU0hSQl9TTiwKKyAgVElMRVBST19PUENfU0hSSCwKKyAgVElMRVBST19PUENfU0hSSF9TTiwKKyAgVElMRVBST19PUENfU0hSSSwKKyAgVElMRVBST19PUENfU0hSSV9TTiwKKyAgVElMRVBST19PUENfU0hSSUIsCisgIFRJTEVQUk9fT1BDX1NIUklCX1NOLAorICBUSUxFUFJPX09QQ19TSFJJSCwKKyAgVElMRVBST19PUENfU0hSSUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVCwKKyAgVElMRVBST19PUENfU0xUX1NOLAorICBUSUxFUFJPX09QQ19TTFRfVSwKKyAgVElMRVBST19PUENfU0xUX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVEIsCisgIFRJTEVQUk9fT1BDX1NMVEJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEJfVSwKKyAgVElMRVBST19PUENfU0xUQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFLAorICBUSUxFUFJPX09QQ19TTFRFX1NOLAorICBUSUxFUFJPX09QQ19TTFRFX1UsCisgIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwKKyAgVElMRVBST19PUENfU0xURUIsCisgIFRJTEVQUk9fT1BDX1NMVEVCX1NOLAorICBUSUxFUFJPX09QQ19TTFRFQl9VLAorICBUSUxFUFJPX09QQ19TTFRFQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFSCwKKyAgVElMRVBST19PUENfU0xURUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVIX1UsCisgIFRJTEVQUk9fT1BDX1NMVEVIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVEgsCisgIFRJTEVQUk9fT1BDX1NMVEhfU04sCisgIFRJTEVQUk9fT1BDX1NMVEhfVSwKKyAgVElMRVBST19PUENfU0xUSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJLAorICBUSUxFUFJPX09QQ19TTFRJX1NOLAorICBUSUxFUFJPX09QQ19TTFRJX1UsCisgIFRJTEVQUk9fT1BDX1NMVElfVV9TTiwKKyAgVElMRVBST19PUENfU0xUSUIsCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLAorICBUSUxFUFJPX09QQ19TTFRJQl9VLAorICBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJSCwKKyAgVElMRVBST19PUENfU0xUSUhfU04sCisgIFRJTEVQUk9fT1BDX1NMVElIX1UsCisgIFRJTEVQUk9fT1BDX1NMVElIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NORSwKKyAgVElMRVBST19PUENfU05FX1NOLAorICBUSUxFUFJPX09QQ19TTkVCLAorICBUSUxFUFJPX09QQ19TTkVCX1NOLAorICBUSUxFUFJPX09QQ19TTkVILAorICBUSUxFUFJPX09QQ19TTkVIX1NOLAorICBUSUxFUFJPX09QQ19TUkEsCisgIFRJTEVQUk9fT1BDX1NSQV9TTiwKKyAgVElMRVBST19PUENfU1JBQiwKKyAgVElMRVBST19PUENfU1JBQl9TTiwKKyAgVElMRVBST19PUENfU1JBSCwKKyAgVElMRVBST19PUENfU1JBSF9TTiwKKyAgVElMRVBST19PUENfU1JBSSwKKyAgVElMRVBST19PUENfU1JBSV9TTiwKKyAgVElMRVBST19PUENfU1JBSUIsCisgIFRJTEVQUk9fT1BDX1NSQUlCX1NOLAorICBUSUxFUFJPX09QQ19TUkFJSCwKKyAgVElMRVBST19PUENfU1JBSUhfU04sCisgIFRJTEVQUk9fT1BDX1NVQiwKKyAgVElMRVBST19PUENfU1VCX1NOLAorICBUSUxFUFJPX09QQ19TVUJCLAorICBUSUxFUFJPX09QQ19TVUJCX1NOLAorICBUSUxFUFJPX09QQ19TVUJCU19VLAorICBUSUxFUFJPX09QQ19TVUJCU19VX1NOLAorICBUSUxFUFJPX09QQ19TVUJILAorICBUSUxFUFJPX09QQ19TVUJIX1NOLAorICBUSUxFUFJPX09QQ19TVUJIUywKKyAgVElMRVBST19PUENfU1VCSFNfU04sCisgIFRJTEVQUk9fT1BDX1NVQlMsCisgIFRJTEVQUk9fT1BDX1NVQlNfU04sCisgIFRJTEVQUk9fT1BDX1NXLAorICBUSUxFUFJPX09QQ19TV0FERCwKKyAgVElMRVBST19PUENfU1dJTlQwLAorICBUSUxFUFJPX09QQ19TV0lOVDEsCisgIFRJTEVQUk9fT1BDX1NXSU5UMiwKKyAgVElMRVBST19PUENfU1dJTlQzLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMCwKKyAgVElMRVBST19PUENfVEJMSURYQjBfU04sCisgIFRJTEVQUk9fT1BDX1RCTElEWEIxLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwKKyAgVElMRVBST19PUENfVEJMSURYQjIsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIyX1NOLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMywKKyAgVElMRVBST19PUENfVEJMSURYQjNfU04sCisgIFRJTEVQUk9fT1BDX1ROUywKKyAgVElMRVBST19PUENfVE5TX1NOLAorICBUSUxFUFJPX09QQ19XSDY0LAorICBUSUxFUFJPX09QQ19YT1IsCisgIFRJTEVQUk9fT1BDX1hPUl9TTiwKKyAgVElMRVBST19PUENfWE9SSSwKKyAgVElMRVBST19PUENfWE9SSV9TTiwKKyAgVElMRVBST19PUENfTk9ORQorfSB0aWxlcHJvX21uZW1vbmljOworCisKKworCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRVBST19QSVBFTElORV9YMCwKKyAgVElMRVBST19QSVBFTElORV9YMSwKKyAgVElMRVBST19QSVBFTElORV9ZMCwKKyAgVElMRVBST19QSVBFTElORV9ZMSwKKyAgVElMRVBST19QSVBFTElORV9ZMiwKK30gdGlsZXByb19waXBlbGluZTsKKworI2RlZmluZSB0aWxlcHJvX2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRVBST19QSVBFTElORV9YMSkKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwKKyAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwKKyAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsCisgIFRJTEVQUk9fT1BfVFlQRV9TUFIKK30gdGlsZXByb19vcGVyYW5kX3R5cGU7CisKK3N0cnVjdCB0aWxlcHJvX29wZXJhbmQKK3sKKyAgLyogSXMgdGhpcyBvcGVyYW5kIGEgcmVnaXN0ZXIsIGltbWVkaWF0ZSBvciBhZGRyZXNzPyAqLworICB0aWxlcHJvX29wZXJhbmRfdHlwZSB0eXBlOworCisgIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KKyAgc2lnbmVkIGludCBkZWZhdWx0X3JlbG9jIDogMTY7CisKKyAgLyogSG93IG1hbnkgYml0cyBpcyB0aGlzIHZhbHVlPyAodXNlZCBmb3IgcmFuZ2UgY2hlY2tpbmcpICovCisgIHVuc2lnbmVkIGludCBudW1fYml0cyA6IDU7CisKKyAgLyogSXMgdGhlIHZhbHVlIHNpZ25lZD8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLworICB1bnNpZ25lZCBpbnQgaXNfc2lnbmVkIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgYSBzb3VyY2UgcmVnaXN0ZXI/ICovCisgIHVuc2lnbmVkIGludCBpc19zcmNfcmVnIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgd3JpdHRlbj8gKGkuZS4gaXMgaXQgYSBkZXN0aW5hdGlvbiByZWdpc3RlcikgKi8KKyAgdW5zaWduZWQgaW50IGlzX2Rlc3RfcmVnIDogMTsKKworICAvKiBJcyB0aGlzIG9wZXJhbmQgUEMtcmVsYXRpdmU/ICovCisgIHVuc2lnbmVkIGludCBpc19wY19yZWxhdGl2ZSA6IDE7CisKKyAgLyogQnkgaG93IG1hbnkgYml0cyBkbyB3ZSByaWdodCBzaGlmdCB0aGUgdmFsdWUgYmVmb3JlIGluc2VydGluZz8gKi8KKyAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgOiAyOworCisgIC8qIFJldHVybiB0aGUgYml0cyBmb3IgdGhpcyBvcGVyYW5kIHRvIGJlIE9SZWQgaW50byBhbiBleGlzdGluZyBidW5kbGUuICovCisgIHRpbGVwcm9fYnVuZGxlX2JpdHMgKCppbnNlcnQpIChpbnQgb3ApOworCisgIC8qIEV4dHJhY3QgdGhpcyBvcGVyYW5kIGFuZCByZXR1cm4gaXQuICovCisgIHVuc2lnbmVkIGludCAoKmV4dHJhY3QpICh0aWxlcHJvX2J1bmRsZV9iaXRzIGJ1bmRsZSk7Cit9OworCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGVyYW5kIHRpbGVwcm9fb3BlcmFuZHNbXTsKKworLyogT25lIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIHBlciBwaXBlIGZvciByYXBpZCBpbnN0cnVjdGlvbiBkZWNvZGluZy4gKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Cit0aWxlcHJvX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRVBST19OVU1fUElQRUxJTkVfRU5DT0RJTkdTXTsKKworCitzdHJ1Y3QgdGlsZXByb19vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBtbmVtb25pYywgZS5nLiAiYWRkIiAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBlbnVtIHZhbHVlIGZvciB0aGlzIG1uZW1vbmljLiAqLworICB0aWxlcHJvX21uZW1vbmljIG1uZW1vbmljOworCisgIC8qIEEgYml0IG1hc2sgb2Ygd2hpY2ggb2YgdGhlIGZpdmUgcGlwZXMgdGhpcyBpbnN0cnVjdGlvbgorICAgICBpcyBjb21wYXRpYmxlIHdpdGg6CisgICAgIFgwICAweDAxCisgICAgIFgxICAweDAyCisgICAgIFkwICAweDA0CisgICAgIFkxICAweDA4CisgICAgIFkyICAweDEwICovCisgIHVuc2lnbmVkIGNoYXIgcGlwZXM7CisKKyAgLyogSG93IG1hbnkgb3BlcmFuZHMgYXJlIHRoZXJlPyAqLworICB1bnNpZ25lZCBjaGFyIG51bV9vcGVyYW5kczsKKworICAvKiBXaGljaCByZWdpc3RlciBkb2VzIHRoaXMgd3JpdGUgaW1wbGljaXRseSwgb3IgVFJFR19aRVJPIGlmIG5vbmU/ICovCisgIHVuc2lnbmVkIGNoYXIgaW1wbGljaXRseV93cml0dGVuX3JlZ2lzdGVyOworCisgIC8qIENhbiB0aGlzIGJlIGJ1bmRsZWQgd2l0aCBvdGhlciBpbnN0cnVjdGlvbnMgKGFsbW9zdCBhbHdheXMgdHJ1ZSkuICovCisgIHVuc2lnbmVkIGNoYXIgY2FuX2J1bmRsZTsKKworICAvKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhbmRzLiBFYWNoIG9mIHRoZXNlIGlzIGFuCisgICAqIGluZGV4IGludG8gdGhlIHRpbGVwcm9fb3BlcmFuZHNbXSB0YWJsZS4gKi8KKyAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1tUSUxFUFJPX05VTV9QSVBFTElORV9FTkNPRElOR1NdW1RJTEVQUk9fTUFYX09QRVJBTkRTXTsKKworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSB0aWxlcHJvX29wY29kZXNbXTsKKworCisvKiBVc2VkIGZvciBub24tdGV4dHVhbCBkaXNhc3NlbWJseSBpbnRvIHN0cnVjdHMuICovCitzdHJ1Y3QgdGlsZXByb19kZWNvZGVkX2luc3RydWN0aW9uCit7CisgIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSAqb3Bjb2RlOworICBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGVyYW5kICpvcGVyYW5kc1tUSUxFUFJPX01BWF9PUEVSQU5EU107CisgIGludCBvcGVyYW5kX3ZhbHVlc1tUSUxFUFJPX01BWF9PUEVSQU5EU107Cit9OworCisKKy8qIERpc2Fzc2VtYmxlIGEgYnVuZGxlIGludG8gYSBzdHJ1Y3QgZm9yIG1hY2hpbmUgcHJvY2Vzc2luZy4gKi8KK2V4dGVybiBpbnQgcGFyc2VfaW5zbl90aWxlcHJvKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aWxlcHJvX2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRVBST19NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKTsKKworCisvKiBHaXZlbiBhIHNldCBvZiBidW5kbGUgYml0cyBhbmQgYSBzcGVjaWZpYyBwaXBlLCByZXR1cm5zIHdoaWNoCisgKiBpbnN0cnVjdGlvbiB0aGUgYnVuZGxlIGNvbnRhaW5zIGluIHRoYXQgcGlwZS4KKyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSAqCitmaW5kX29wY29kZSh0aWxlcHJvX2J1bmRsZV9iaXRzIGJpdHMsIHRpbGVwcm9fcGlwZWxpbmUgcGlwZSk7CisKKworCisjZW5kaWYgLyogb3Bjb2RlX3RpbGVwcm9faCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY182NC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3RpbGUtZGVzY182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTllZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGlsZS1kZXNjXzY0LmgKQEAgLTAsMCArMSw0ODMgQEAKKy8qIFRJTEUtR3ggb3Bjb2RlIGluZm9ybWF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICoKKyAqCisgKgorICovCisKKyNpZm5kZWYgb3Bjb2RlX3RpbGVfaAorI2RlZmluZSBvcGNvZGVfdGlsZV9oCisKKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgorCisKK2VudW0KK3sKKyAgVElMRUdYX01BWF9PUEVSQU5EUyA9IDQgLyogYmZleHRzICovCit9OworCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRUdYX09QQ19CUFQsCisgIFRJTEVHWF9PUENfSU5GTywKKyAgVElMRUdYX09QQ19JTkZPTCwKKyAgVElMRUdYX09QQ19NT1ZFLAorICBUSUxFR1hfT1BDX01PVkVJLAorICBUSUxFR1hfT1BDX01PVkVMSSwKKyAgVElMRUdYX09QQ19QUkVGRVRDSCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDEsCisgIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wxX0ZBVUxULAorICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MMiwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9BRERfTDJfRkFVTFQsCisgIFRJTEVHWF9PUENfUFJFRkVUQ0hfQUREX0wzLAorICBUSUxFR1hfT1BDX1BSRUZFVENIX0FERF9MM19GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMSwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMV9GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMiwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMl9GQVVMVCwKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MMywKKyAgVElMRUdYX09QQ19QUkVGRVRDSF9MM19GQVVMVCwKKyAgVElMRUdYX09QQ19SQUlTRSwKKyAgVElMRUdYX09QQ19BREQsCisgIFRJTEVHWF9PUENfQURESSwKKyAgVElMRUdYX09QQ19BRERMSSwKKyAgVElMRUdYX09QQ19BRERYLAorICBUSUxFR1hfT1BDX0FERFhJLAorICBUSUxFR1hfT1BDX0FERFhMSSwKKyAgVElMRUdYX09QQ19BRERYU0MsCisgIFRJTEVHWF9PUENfQU5ELAorICBUSUxFR1hfT1BDX0FOREksCisgIFRJTEVHWF9PUENfQkVRWiwKKyAgVElMRUdYX09QQ19CRVFaVCwKKyAgVElMRUdYX09QQ19CRkVYVFMsCisgIFRJTEVHWF9PUENfQkZFWFRVLAorICBUSUxFR1hfT1BDX0JGSU5TLAorICBUSUxFR1hfT1BDX0JHRVosCisgIFRJTEVHWF9PUENfQkdFWlQsCisgIFRJTEVHWF9PUENfQkdUWiwKKyAgVElMRUdYX09QQ19CR1RaVCwKKyAgVElMRUdYX09QQ19CTEJDLAorICBUSUxFR1hfT1BDX0JMQkNULAorICBUSUxFR1hfT1BDX0JMQlMsCisgIFRJTEVHWF9PUENfQkxCU1QsCisgIFRJTEVHWF9PUENfQkxFWiwKKyAgVElMRUdYX09QQ19CTEVaVCwKKyAgVElMRUdYX09QQ19CTFRaLAorICBUSUxFR1hfT1BDX0JMVFpULAorICBUSUxFR1hfT1BDX0JORVosCisgIFRJTEVHWF9PUENfQk5FWlQsCisgIFRJTEVHWF9PUENfQ0xaLAorICBUSUxFR1hfT1BDX0NNT1ZFUVosCisgIFRJTEVHWF9PUENfQ01PVk5FWiwKKyAgVElMRUdYX09QQ19DTVBFUSwKKyAgVElMRUdYX09QQ19DTVBFUUksCisgIFRJTEVHWF9PUENfQ01QRVhDSCwKKyAgVElMRUdYX09QQ19DTVBFWENINCwKKyAgVElMRUdYX09QQ19DTVBMRVMsCisgIFRJTEVHWF9PUENfQ01QTEVVLAorICBUSUxFR1hfT1BDX0NNUExUUywKKyAgVElMRUdYX09QQ19DTVBMVFNJLAorICBUSUxFR1hfT1BDX0NNUExUVSwKKyAgVElMRUdYX09QQ19DTVBMVFVJLAorICBUSUxFR1hfT1BDX0NNUE5FLAorICBUSUxFR1hfT1BDX0NNVUwsCisgIFRJTEVHWF9PUENfQ01VTEEsCisgIFRJTEVHWF9PUENfQ01VTEFGLAorICBUSUxFR1hfT1BDX0NNVUxGLAorICBUSUxFR1hfT1BDX0NNVUxGUiwKKyAgVElMRUdYX09QQ19DTVVMSCwKKyAgVElMRUdYX09QQ19DTVVMSFIsCisgIFRJTEVHWF9PUENfQ1JDMzJfMzIsCisgIFRJTEVHWF9PUENfQ1JDMzJfOCwKKyAgVElMRUdYX09QQ19DVFosCisgIFRJTEVHWF9PUENfREJMQUxJR04sCisgIFRJTEVHWF9PUENfREJMQUxJR04yLAorICBUSUxFR1hfT1BDX0RCTEFMSUdONCwKKyAgVElMRUdYX09QQ19EQkxBTElHTjYsCisgIFRJTEVHWF9PUENfRFJBSU4sCisgIFRJTEVHWF9PUENfRFRMQlBSLAorICBUSUxFR1hfT1BDX0VYQ0gsCisgIFRJTEVHWF9PUENfRVhDSDQsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9BRERfRkxBR1MsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9BRERTVUIsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9NVUxfRkxBR1MsCisgIFRJTEVHWF9PUENfRkRPVUJMRV9QQUNLMSwKKyAgVElMRUdYX09QQ19GRE9VQkxFX1BBQ0syLAorICBUSUxFR1hfT1BDX0ZET1VCTEVfU1VCX0ZMQUdTLAorICBUSUxFR1hfT1BDX0ZET1VCTEVfVU5QQUNLX01BWCwKKyAgVElMRUdYX09QQ19GRE9VQkxFX1VOUEFDS19NSU4sCisgIFRJTEVHWF9PUENfRkVUQ0hBREQsCisgIFRJTEVHWF9PUENfRkVUQ0hBREQ0LAorICBUSUxFR1hfT1BDX0ZFVENIQURER0VaLAorICBUSUxFR1hfT1BDX0ZFVENIQURER0VaNCwKKyAgVElMRUdYX09QQ19GRVRDSEFORCwKKyAgVElMRUdYX09QQ19GRVRDSEFORDQsCisgIFRJTEVHWF9PUENfRkVUQ0hPUiwKKyAgVElMRUdYX09QQ19GRVRDSE9SNCwKKyAgVElMRUdYX09QQ19GSU5WLAorICBUSUxFR1hfT1BDX0ZMVVNILAorICBUSUxFR1hfT1BDX0ZMVVNIV0IsCisgIFRJTEVHWF9PUENfRk5PUCwKKyAgVElMRUdYX09QQ19GU0lOR0xFX0FERDEsCisgIFRJTEVHWF9PUENfRlNJTkdMRV9BRERTVUIyLAorICBUSUxFR1hfT1BDX0ZTSU5HTEVfTVVMMSwKKyAgVElMRUdYX09QQ19GU0lOR0xFX01VTDIsCisgIFRJTEVHWF9PUENfRlNJTkdMRV9QQUNLMSwKKyAgVElMRUdYX09QQ19GU0lOR0xFX1BBQ0syLAorICBUSUxFR1hfT1BDX0ZTSU5HTEVfU1VCMSwKKyAgVElMRUdYX09QQ19JQ09ILAorICBUSUxFR1hfT1BDX0lMTCwKKyAgVElMRUdYX09QQ19JTlYsCisgIFRJTEVHWF9PUENfSVJFVCwKKyAgVElMRUdYX09QQ19KLAorICBUSUxFR1hfT1BDX0pBTCwKKyAgVElMRUdYX09QQ19KQUxSLAorICBUSUxFR1hfT1BDX0pBTFJQLAorICBUSUxFR1hfT1BDX0pSLAorICBUSUxFR1hfT1BDX0pSUCwKKyAgVElMRUdYX09QQ19MRCwKKyAgVElMRUdYX09QQ19MRDFTLAorICBUSUxFR1hfT1BDX0xEMVNfQURELAorICBUSUxFR1hfT1BDX0xEMVUsCisgIFRJTEVHWF9PUENfTEQxVV9BREQsCisgIFRJTEVHWF9PUENfTEQyUywKKyAgVElMRUdYX09QQ19MRDJTX0FERCwKKyAgVElMRUdYX09QQ19MRDJVLAorICBUSUxFR1hfT1BDX0xEMlVfQURELAorICBUSUxFR1hfT1BDX0xENFMsCisgIFRJTEVHWF9PUENfTEQ0U19BREQsCisgIFRJTEVHWF9PUENfTEQ0VSwKKyAgVElMRUdYX09QQ19MRDRVX0FERCwKKyAgVElMRUdYX09QQ19MRF9BREQsCisgIFRJTEVHWF9PUENfTEROQSwKKyAgVElMRUdYX09QQ19MRE5BX0FERCwKKyAgVElMRUdYX09QQ19MRE5ULAorICBUSUxFR1hfT1BDX0xETlQxUywKKyAgVElMRUdYX09QQ19MRE5UMVNfQURELAorICBUSUxFR1hfT1BDX0xETlQxVSwKKyAgVElMRUdYX09QQ19MRE5UMVVfQURELAorICBUSUxFR1hfT1BDX0xETlQyUywKKyAgVElMRUdYX09QQ19MRE5UMlNfQURELAorICBUSUxFR1hfT1BDX0xETlQyVSwKKyAgVElMRUdYX09QQ19MRE5UMlVfQURELAorICBUSUxFR1hfT1BDX0xETlQ0UywKKyAgVElMRUdYX09QQ19MRE5UNFNfQURELAorICBUSUxFR1hfT1BDX0xETlQ0VSwKKyAgVElMRUdYX09QQ19MRE5UNFVfQURELAorICBUSUxFR1hfT1BDX0xETlRfQURELAorICBUSUxFR1hfT1BDX0xOSywKKyAgVElMRUdYX09QQ19NRiwKKyAgVElMRUdYX09QQ19NRlNQUiwKKyAgVElMRUdYX09QQ19NTSwKKyAgVElMRUdYX09QQ19NTlosCisgIFRJTEVHWF9PUENfTVRTUFIsCisgIFRJTEVHWF9PUENfTVVMX0hTX0hTLAorICBUSUxFR1hfT1BDX01VTF9IU19IVSwKKyAgVElMRUdYX09QQ19NVUxfSFNfTFMsCisgIFRJTEVHWF9PUENfTVVMX0hTX0xVLAorICBUSUxFR1hfT1BDX01VTF9IVV9IVSwKKyAgVElMRUdYX09QQ19NVUxfSFVfTFMsCisgIFRJTEVHWF9PUENfTVVMX0hVX0xVLAorICBUSUxFR1hfT1BDX01VTF9MU19MUywKKyAgVElMRUdYX09QQ19NVUxfTFNfTFUsCisgIFRJTEVHWF9PUENfTVVMX0xVX0xVLAorICBUSUxFR1hfT1BDX01VTEFfSFNfSFMsCisgIFRJTEVHWF9PUENfTVVMQV9IU19IVSwKKyAgVElMRUdYX09QQ19NVUxBX0hTX0xTLAorICBUSUxFR1hfT1BDX01VTEFfSFNfTFUsCisgIFRJTEVHWF9PUENfTVVMQV9IVV9IVSwKKyAgVElMRUdYX09QQ19NVUxBX0hVX0xTLAorICBUSUxFR1hfT1BDX01VTEFfSFVfTFUsCisgIFRJTEVHWF9PUENfTVVMQV9MU19MUywKKyAgVElMRUdYX09QQ19NVUxBX0xTX0xVLAorICBUSUxFR1hfT1BDX01VTEFfTFVfTFUsCisgIFRJTEVHWF9PUENfTVVMQVgsCisgIFRJTEVHWF9PUENfTVVMWCwKKyAgVElMRUdYX09QQ19NWiwKKyAgVElMRUdYX09QQ19OQVAsCisgIFRJTEVHWF9PUENfTk9QLAorICBUSUxFR1hfT1BDX05PUiwKKyAgVElMRUdYX09QQ19PUiwKKyAgVElMRUdYX09QQ19PUkksCisgIFRJTEVHWF9PUENfUENOVCwKKyAgVElMRUdYX09QQ19SRVZCSVRTLAorICBUSUxFR1hfT1BDX1JFVkJZVEVTLAorICBUSUxFR1hfT1BDX1JPVEwsCisgIFRJTEVHWF9PUENfUk9UTEksCisgIFRJTEVHWF9PUENfU0hMLAorICBUSUxFR1hfT1BDX1NITDE2SU5TTEksCisgIFRJTEVHWF9PUENfU0hMMUFERCwKKyAgVElMRUdYX09QQ19TSEwxQUREWCwKKyAgVElMRUdYX09QQ19TSEwyQURELAorICBUSUxFR1hfT1BDX1NITDJBRERYLAorICBUSUxFR1hfT1BDX1NITDNBREQsCisgIFRJTEVHWF9PUENfU0hMM0FERFgsCisgIFRJTEVHWF9PUENfU0hMSSwKKyAgVElMRUdYX09QQ19TSExYLAorICBUSUxFR1hfT1BDX1NITFhJLAorICBUSUxFR1hfT1BDX1NIUlMsCisgIFRJTEVHWF9PUENfU0hSU0ksCisgIFRJTEVHWF9PUENfU0hSVSwKKyAgVElMRUdYX09QQ19TSFJVSSwKKyAgVElMRUdYX09QQ19TSFJVWCwKKyAgVElMRUdYX09QQ19TSFJVWEksCisgIFRJTEVHWF9PUENfU0hVRkZMRUJZVEVTLAorICBUSUxFR1hfT1BDX1NULAorICBUSUxFR1hfT1BDX1NUMSwKKyAgVElMRUdYX09QQ19TVDFfQURELAorICBUSUxFR1hfT1BDX1NUMiwKKyAgVElMRUdYX09QQ19TVDJfQURELAorICBUSUxFR1hfT1BDX1NUNCwKKyAgVElMRUdYX09QQ19TVDRfQURELAorICBUSUxFR1hfT1BDX1NUX0FERCwKKyAgVElMRUdYX09QQ19TVE5ULAorICBUSUxFR1hfT1BDX1NUTlQxLAorICBUSUxFR1hfT1BDX1NUTlQxX0FERCwKKyAgVElMRUdYX09QQ19TVE5UMiwKKyAgVElMRUdYX09QQ19TVE5UMl9BREQsCisgIFRJTEVHWF9PUENfU1ROVDQsCisgIFRJTEVHWF9PUENfU1ROVDRfQURELAorICBUSUxFR1hfT1BDX1NUTlRfQURELAorICBUSUxFR1hfT1BDX1NVQiwKKyAgVElMRUdYX09QQ19TVUJYLAorICBUSUxFR1hfT1BDX1NVQlhTQywKKyAgVElMRUdYX09QQ19TV0lOVDAsCisgIFRJTEVHWF9PUENfU1dJTlQxLAorICBUSUxFR1hfT1BDX1NXSU5UMiwKKyAgVElMRUdYX09QQ19TV0lOVDMsCisgIFRJTEVHWF9PUENfVEJMSURYQjAsCisgIFRJTEVHWF9PUENfVEJMSURYQjEsCisgIFRJTEVHWF9PUENfVEJMSURYQjIsCisgIFRJTEVHWF9PUENfVEJMSURYQjMsCisgIFRJTEVHWF9PUENfVjFBREQsCisgIFRJTEVHWF9PUENfVjFBRERJLAorICBUSUxFR1hfT1BDX1YxQUREVUMsCisgIFRJTEVHWF9PUENfVjFBRElGRlUsCisgIFRJTEVHWF9PUENfVjFBVkdVLAorICBUSUxFR1hfT1BDX1YxQ01QRVEsCisgIFRJTEVHWF9PUENfVjFDTVBFUUksCisgIFRJTEVHWF9PUENfVjFDTVBMRVMsCisgIFRJTEVHWF9PUENfVjFDTVBMRVUsCisgIFRJTEVHWF9PUENfVjFDTVBMVFMsCisgIFRJTEVHWF9PUENfVjFDTVBMVFNJLAorICBUSUxFR1hfT1BDX1YxQ01QTFRVLAorICBUSUxFR1hfT1BDX1YxQ01QTFRVSSwKKyAgVElMRUdYX09QQ19WMUNNUE5FLAorICBUSUxFR1hfT1BDX1YxRERPVFBVLAorICBUSUxFR1hfT1BDX1YxRERPVFBVQSwKKyAgVElMRUdYX09QQ19WMURET1RQVVMsCisgIFRJTEVHWF9PUENfVjFERE9UUFVTQSwKKyAgVElMRUdYX09QQ19WMURPVFAsCisgIFRJTEVHWF9PUENfVjFET1RQQSwKKyAgVElMRUdYX09QQ19WMURPVFBVLAorICBUSUxFR1hfT1BDX1YxRE9UUFVBLAorICBUSUxFR1hfT1BDX1YxRE9UUFVTLAorICBUSUxFR1hfT1BDX1YxRE9UUFVTQSwKKyAgVElMRUdYX09QQ19WMUlOVF9ILAorICBUSUxFR1hfT1BDX1YxSU5UX0wsCisgIFRJTEVHWF9PUENfVjFNQVhVLAorICBUSUxFR1hfT1BDX1YxTUFYVUksCisgIFRJTEVHWF9PUENfVjFNSU5VLAorICBUSUxFR1hfT1BDX1YxTUlOVUksCisgIFRJTEVHWF9PUENfVjFNTlosCisgIFRJTEVHWF9PUENfVjFNVUxUVSwKKyAgVElMRUdYX09QQ19WMU1VTFUsCisgIFRJTEVHWF9PUENfVjFNVUxVUywKKyAgVElMRUdYX09QQ19WMU1aLAorICBUSUxFR1hfT1BDX1YxU0FEQVUsCisgIFRJTEVHWF9PUENfVjFTQURVLAorICBUSUxFR1hfT1BDX1YxU0hMLAorICBUSUxFR1hfT1BDX1YxU0hMSSwKKyAgVElMRUdYX09QQ19WMVNIUlMsCisgIFRJTEVHWF9PUENfVjFTSFJTSSwKKyAgVElMRUdYX09QQ19WMVNIUlUsCisgIFRJTEVHWF9PUENfVjFTSFJVSSwKKyAgVElMRUdYX09QQ19WMVNVQiwKKyAgVElMRUdYX09QQ19WMVNVQlVDLAorICBUSUxFR1hfT1BDX1YyQURELAorICBUSUxFR1hfT1BDX1YyQURESSwKKyAgVElMRUdYX09QQ19WMkFERFNDLAorICBUSUxFR1hfT1BDX1YyQURJRkZTLAorICBUSUxFR1hfT1BDX1YyQVZHUywKKyAgVElMRUdYX09QQ19WMkNNUEVRLAorICBUSUxFR1hfT1BDX1YyQ01QRVFJLAorICBUSUxFR1hfT1BDX1YyQ01QTEVTLAorICBUSUxFR1hfT1BDX1YyQ01QTEVVLAorICBUSUxFR1hfT1BDX1YyQ01QTFRTLAorICBUSUxFR1hfT1BDX1YyQ01QTFRTSSwKKyAgVElMRUdYX09QQ19WMkNNUExUVSwKKyAgVElMRUdYX09QQ19WMkNNUExUVUksCisgIFRJTEVHWF9PUENfVjJDTVBORSwKKyAgVElMRUdYX09QQ19WMkRPVFAsCisgIFRJTEVHWF9PUENfVjJET1RQQSwKKyAgVElMRUdYX09QQ19WMklOVF9ILAorICBUSUxFR1hfT1BDX1YySU5UX0wsCisgIFRJTEVHWF9PUENfVjJNQVhTLAorICBUSUxFR1hfT1BDX1YyTUFYU0ksCisgIFRJTEVHWF9PUENfVjJNSU5TLAorICBUSUxFR1hfT1BDX1YyTUlOU0ksCisgIFRJTEVHWF9PUENfVjJNTlosCisgIFRJTEVHWF9PUENfVjJNVUxGU0MsCisgIFRJTEVHWF9PUENfVjJNVUxTLAorICBUSUxFR1hfT1BDX1YyTVVMVFMsCisgIFRJTEVHWF9PUENfVjJNWiwKKyAgVElMRUdYX09QQ19WMlBBQ0tILAorICBUSUxFR1hfT1BDX1YyUEFDS0wsCisgIFRJTEVHWF9PUENfVjJQQUNLVUMsCisgIFRJTEVHWF9PUENfVjJTQURBUywKKyAgVElMRUdYX09QQ19WMlNBREFVLAorICBUSUxFR1hfT1BDX1YyU0FEUywKKyAgVElMRUdYX09QQ19WMlNBRFUsCisgIFRJTEVHWF9PUENfVjJTSEwsCisgIFRJTEVHWF9PUENfVjJTSExJLAorICBUSUxFR1hfT1BDX1YyU0hMU0MsCisgIFRJTEVHWF9PUENfVjJTSFJTLAorICBUSUxFR1hfT1BDX1YyU0hSU0ksCisgIFRJTEVHWF9PUENfVjJTSFJVLAorICBUSUxFR1hfT1BDX1YyU0hSVUksCisgIFRJTEVHWF9PUENfVjJTVUIsCisgIFRJTEVHWF9PUENfVjJTVUJTQywKKyAgVElMRUdYX09QQ19WNEFERCwKKyAgVElMRUdYX09QQ19WNEFERFNDLAorICBUSUxFR1hfT1BDX1Y0SU5UX0gsCisgIFRJTEVHWF9PUENfVjRJTlRfTCwKKyAgVElMRUdYX09QQ19WNFBBQ0tTQywKKyAgVElMRUdYX09QQ19WNFNITCwKKyAgVElMRUdYX09QQ19WNFNITFNDLAorICBUSUxFR1hfT1BDX1Y0U0hSUywKKyAgVElMRUdYX09QQ19WNFNIUlUsCisgIFRJTEVHWF9PUENfVjRTVUIsCisgIFRJTEVHWF9PUENfVjRTVUJTQywKKyAgVElMRUdYX09QQ19XSDY0LAorICBUSUxFR1hfT1BDX1hPUiwKKyAgVElMRUdYX09QQ19YT1JJLAorICBUSUxFR1hfT1BDX05PTkUKK30gdGlsZWd4X21uZW1vbmljOworCisKKwordHlwZWRlZiBlbnVtCit7CisgIFRJTEVHWF9QSVBFTElORV9YMCwKKyAgVElMRUdYX1BJUEVMSU5FX1gxLAorICBUSUxFR1hfUElQRUxJTkVfWTAsCisgIFRJTEVHWF9QSVBFTElORV9ZMSwKKyAgVElMRUdYX1BJUEVMSU5FX1kyLAorfSB0aWxlZ3hfcGlwZWxpbmU7CisKKyNkZWZpbmUgdGlsZWd4X2lzX3hfcGlwZWxpbmUocCkgKChpbnQpKHApIDw9IChpbnQpVElMRUdYX1BJUEVMSU5FX1gxKQorCit0eXBlZGVmIGVudW0KK3sKKyAgVElMRUdYX09QX1RZUEVfUkVHSVNURVIsCisgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwKKyAgVElMRUdYX09QX1RZUEVfQUREUkVTUywKKyAgVElMRUdYX09QX1RZUEVfU1BSCit9IHRpbGVneF9vcGVyYW5kX3R5cGU7CisKK3N0cnVjdCB0aWxlZ3hfb3BlcmFuZAoreworICAvKiBJcyB0aGlzIG9wZXJhbmQgYSByZWdpc3RlciwgaW1tZWRpYXRlIG9yIGFkZHJlc3M/ICovCisgIHRpbGVneF9vcGVyYW5kX3R5cGUgdHlwZTsKKworICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIHR5cGUgZm9yIHRoaXMgb3BlcmFuZC4gICovCisgIHNpZ25lZCBpbnQgZGVmYXVsdF9yZWxvYyA6IDE2OworCisgIC8qIEhvdyBtYW55IGJpdHMgaXMgdGhpcyB2YWx1ZT8gKHVzZWQgZm9yIHJhbmdlIGNoZWNraW5nKSAqLworICB1bnNpZ25lZCBpbnQgbnVtX2JpdHMgOiA1OworCisgIC8qIElzIHRoZSB2YWx1ZSBzaWduZWQ/ICh1c2VkIGZvciByYW5nZSBjaGVja2luZykgKi8KKyAgdW5zaWduZWQgaW50IGlzX3NpZ25lZCA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIGEgc291cmNlIHJlZ2lzdGVyPyAqLworICB1bnNpZ25lZCBpbnQgaXNfc3JjX3JlZyA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIHdyaXR0ZW4/IChpLmUuIGlzIGl0IGEgZGVzdGluYXRpb24gcmVnaXN0ZXIpICovCisgIHVuc2lnbmVkIGludCBpc19kZXN0X3JlZyA6IDE7CisKKyAgLyogSXMgdGhpcyBvcGVyYW5kIFBDLXJlbGF0aXZlPyAqLworICB1bnNpZ25lZCBpbnQgaXNfcGNfcmVsYXRpdmUgOiAxOworCisgIC8qIEJ5IGhvdyBtYW55IGJpdHMgZG8gd2UgcmlnaHQgc2hpZnQgdGhlIHZhbHVlIGJlZm9yZSBpbnNlcnRpbmc/ICovCisgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0IDogMjsKKworICAvKiBSZXR1cm4gdGhlIGJpdHMgZm9yIHRoaXMgb3BlcmFuZCB0byBiZSBPUmVkIGludG8gYW4gZXhpc3RpbmcgYnVuZGxlLiAqLworICB0aWxlZ3hfYnVuZGxlX2JpdHMgKCppbnNlcnQpIChpbnQgb3ApOworCisgIC8qIEV4dHJhY3QgdGhpcyBvcGVyYW5kIGFuZCByZXR1cm4gaXQuICovCisgIHVuc2lnbmVkIGludCAoKmV4dHJhY3QpICh0aWxlZ3hfYnVuZGxlX2JpdHMgYnVuZGxlKTsKK307CisKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3BlcmFuZCB0aWxlZ3hfb3BlcmFuZHNbXTsKKworLyogT25lIGZpbml0ZS1zdGF0ZSBtYWNoaW5lIHBlciBwaXBlIGZvciByYXBpZCBpbnN0cnVjdGlvbiBkZWNvZGluZy4gKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Cit0aWxlZ3hfYnVuZGxlX2RlY29kZXJfZnNtc1tUSUxFR1hfTlVNX1BJUEVMSU5FX0VOQ09ESU5HU107CisKKworc3RydWN0IHRpbGVneF9vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBtbmVtb25pYywgZS5nLiAiYWRkIiAqLworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIFRoZSBlbnVtIHZhbHVlIGZvciB0aGlzIG1uZW1vbmljLiAqLworICB0aWxlZ3hfbW5lbW9uaWMgbW5lbW9uaWM7CisKKyAgLyogQSBiaXQgbWFzayBvZiB3aGljaCBvZiB0aGUgZml2ZSBwaXBlcyB0aGlzIGluc3RydWN0aW9uCisgICAgIGlzIGNvbXBhdGlibGUgd2l0aDoKKyAgICAgWDAgIDB4MDEKKyAgICAgWDEgIDB4MDIKKyAgICAgWTAgIDB4MDQKKyAgICAgWTEgIDB4MDgKKyAgICAgWTIgIDB4MTAgKi8KKyAgdW5zaWduZWQgY2hhciBwaXBlczsKKworICAvKiBIb3cgbWFueSBvcGVyYW5kcyBhcmUgdGhlcmU/ICovCisgIHVuc2lnbmVkIGNoYXIgbnVtX29wZXJhbmRzOworCisgIC8qIFdoaWNoIHJlZ2lzdGVyIGRvZXMgdGhpcyB3cml0ZSBpbXBsaWNpdGx5LCBvciBUUkVHX1pFUk8gaWYgbm9uZT8gKi8KKyAgdW5zaWduZWQgY2hhciBpbXBsaWNpdGx5X3dyaXR0ZW5fcmVnaXN0ZXI7CisKKyAgLyogQ2FuIHRoaXMgYmUgYnVuZGxlZCB3aXRoIG90aGVyIGluc3RydWN0aW9ucyAoYWxtb3N0IGFsd2F5cyB0cnVlKS4gKi8KKyAgdW5zaWduZWQgY2hhciBjYW5fYnVuZGxlOworCisgIC8qIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMuIEVhY2ggb2YgdGhlc2UgaXMgYW4KKyAgICogaW5kZXggaW50byB0aGUgdGlsZWd4X29wZXJhbmRzW10gdGFibGUuICovCisgIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbVElMRUdYX05VTV9QSVBFTElORV9FTkNPRElOR1NdW1RJTEVHWF9NQVhfT1BFUkFORFNdOworCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgdGlsZWd4X29wY29kZXNbXTsKKworLyogVXNlZCBmb3Igbm9uLXRleHR1YWwgZGlzYXNzZW1ibHkgaW50byBzdHJ1Y3RzLiAqLworc3RydWN0IHRpbGVneF9kZWNvZGVkX2luc3RydWN0aW9uCit7CisgIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3Bjb2RlICpvcGNvZGU7CisgIGNvbnN0IHN0cnVjdCB0aWxlZ3hfb3BlcmFuZCAqb3BlcmFuZHNbVElMRUdYX01BWF9PUEVSQU5EU107CisgIGxvbmcgbG9uZyBvcGVyYW5kX3ZhbHVlc1tUSUxFR1hfTUFYX09QRVJBTkRTXTsKK307CisKKworLyogRGlzYXNzZW1ibGUgYSBidW5kbGUgaW50byBhIHN0cnVjdCBmb3IgbWFjaGluZSBwcm9jZXNzaW5nLiAqLworZXh0ZXJuIGludCBwYXJzZV9pbnNuX3RpbGVneCh0aWxlZ3hfYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFtUSUxFR1hfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFXSk7CisKKworCisjZW5kaWYgLyogb3Bjb2RlX3RpbGVneF9oICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL2JhY2t0cmFjZS5jIGIvYXJjaC90aWxlL2tlcm5lbC9iYWNrdHJhY2UuYwppbmRleCAxZGM3MWVhLi45MDkyY2U4IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvYmFja3RyYWNlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMTAgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMTUsMTMgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2JhY2t0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZS5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KICNpbmNsdWRlIDxhcmNoL2FiaS5oPgogCiAjaWZkZWYgX190aWxlZ3hfXwotI2RlZmluZSB0aWxlX2J1bmRsZV9iaXRzIHRpbGVneF9idW5kbGVfYml0cwogI2RlZmluZSBUSUxFX01BWF9JTlNUUlVDVElPTlNfUEVSX0JVTkRMRSBUSUxFR1hfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFCi0jZGVmaW5lIFRJTEVfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUyBUSUxFR1hfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUwogI2RlZmluZSB0aWxlX2RlY29kZWRfaW5zdHJ1Y3Rpb24gdGlsZWd4X2RlY29kZWRfaW5zdHJ1Y3Rpb24KICNkZWZpbmUgdGlsZV9tbmVtb25pYyB0aWxlZ3hfbW5lbW9uaWMKICNkZWZpbmUgcGFyc2VfaW5zbl90aWxlIHBhcnNlX2luc25fdGlsZWd4CkBAIC0zNSw3ICszMywxOCBAQAogI2RlZmluZSBPUENPREVfU1RPUkUgVElMRUdYX09QQ19TVAogdHlwZWRlZiBsb25nIGxvbmcgYnRfaW50X3JlZ190OwogI2Vsc2UKLSNkZWZpbmUgT1BDT0RFX1NUT1JFIFRJTEVfT1BDX1NXCisjZGVmaW5lIFRJTEVfTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFIFRJTEVQUk9fTUFYX0lOU1RSVUNUSU9OU19QRVJfQlVORExFCisjZGVmaW5lIHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbiB0aWxlcHJvX2RlY29kZWRfaW5zdHJ1Y3Rpb24KKyNkZWZpbmUgdGlsZV9tbmVtb25pYyB0aWxlcHJvX21uZW1vbmljCisjZGVmaW5lIHBhcnNlX2luc25fdGlsZSBwYXJzZV9pbnNuX3RpbGVwcm8KKyNkZWZpbmUgVElMRV9PUENfSVJFVCBUSUxFUFJPX09QQ19JUkVUCisjZGVmaW5lIFRJTEVfT1BDX0FEREkgVElMRVBST19PUENfQURESQorI2RlZmluZSBUSUxFX09QQ19BRERMSSBUSUxFUFJPX09QQ19BRERMSQorI2RlZmluZSBUSUxFX09QQ19JTkZPIFRJTEVQUk9fT1BDX0lORk8KKyNkZWZpbmUgVElMRV9PUENfSU5GT0wgVElMRVBST19PUENfSU5GT0wKKyNkZWZpbmUgVElMRV9PUENfSlJQIFRJTEVQUk9fT1BDX0pSUAorI2RlZmluZSBUSUxFX09QQ19NT1ZFIFRJTEVQUk9fT1BDX01PVkUKKyNkZWZpbmUgT1BDT0RFX1NUT1JFIFRJTEVQUk9fT1BDX1NXCiB0eXBlZGVmIGludCBidF9pbnRfcmVnX3Q7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvdGlsZS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMjhmYTZlYy4uYjkwYWI5OSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3RpbGUva2VybmVsL21vZHVsZS5jCkBAIC0yMCw5ICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9ob21lY2FjaGUuaD4KKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgogCiAjaWZkZWYgX190aWxlZ3hfXwogIyBkZWZpbmUgRWxmX1JlbGEgRWxmNjRfUmVsYQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9zaW5nbGVfc3RlcC5jIGIvYXJjaC90aWxlL2tlcm5lbC9zaW5nbGVfc3RlcC5jCmluZGV4IDQwMzJjYTguLmI3YTg3OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvc2luZ2xlX3N0ZXAuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3NpbmdsZV9zdGVwLmMKQEAgLTI1LDkgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZS10aWxlLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZV9jb25zdGFudHMuaD4KICNpbmNsdWRlIDxhcmNoL2FiaS5oPgorI2luY2x1ZGUgPGFyY2gvb3Bjb2RlLmg+CiAKICNkZWZpbmUgc2lnbkV4dGVuZDE3KHZhbCkgc2lnbl9leHRlbmQoKHZhbCksIDE3KQogI2RlZmluZSBUSUxFX1gxX01BU0sgKDB4ZmZmZmZmZmZVTEwgPDwgMzEpCkBAIC0xMTgsNyArMTE3LDcgQEAKIAlpbnQgdmFsX3JlZywgYWRkcl9yZWcsIGVyciwgdmFsOwogCiAJLyogR2V0IGFkZHJlc3MgYW5kIHZhbHVlIHJlZ2lzdGVycyAqLwotCWlmIChidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spIHsKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSB7CiAJCWFkZHJfcmVnID0gZ2V0X1NyY0FfWTIoYnVuZGxlKTsKIAkJdmFsX3JlZyA9IGdldF9TcmNCRGVzdF9ZMihidW5kbGUpOwogCX0gZWxzZSBpZiAobWVtX29wID09IE1FTU9QX0xPQUQgfHwgbWVtX29wID09IE1FTU9QX0xPQURfUE9TVElOQ1IpIHsKQEAgLTIyOSw3ICsyMjgsNyBAQAogCX0KIAkrK3VuYWxpZ25lZF9maXh1cF9jb3VudDsKIAotCWlmIChidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spIHsKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSB7CiAJCS8qIENvbnZlcnQgdGhlIFkyIGluc3RydWN0aW9uIHRvIGEgcHJlZmV0Y2guICovCiAJCWJ1bmRsZSAmPSB+KGNyZWF0ZV9TcmNCRGVzdF9ZMigtMSkgfAogCQkJICAgIGNyZWF0ZV9PcGNvZGVfWTIoLTEpKTsKQEAgLTM4OSw3ICszODgsNyBAQAogCXN0YXRlLT5icmFuY2hfbmV4dF9wYyA9IDA7CiAJc3RhdGUtPnVwZGF0ZSA9IDA7CiAKLQlpZiAoIShidW5kbGUgJiBUSUxFX0JVTkRMRV9ZX0VOQ09ESU5HX01BU0spKSB7CisJaWYgKCEoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSkgewogCQkvKiB0d28gd2lkZSwgY2hlY2sgZm9yIGNvbnRyb2wgZmxvdyAqLwogCQlpbnQgb3Bjb2RlID0gZ2V0X09wY29kZV9YMShidW5kbGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RpbGUtZGVzY18zMi5jIGIvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfMzIuYwppbmRleCA3ZTMxYTEyLi5kZDdiZDFkIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3RpbGUtZGVzY18zMi5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzMyLmMKQEAgLTEsMyArMSwyMyBAQAorLyogVElMRVBybyBvcGNvZGUgaW5mb3JtYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKgorICoKKyAqCisgKi8KKwogLyogVGhpcyBkZWZpbmUgaXMgQkZEX1JFTE9DXyMjeCBmb3IgcmVhbCBiZmQsIG9yIC0xIGZvciBldmVyeW9uZSBlbHNlLiAqLwogI2RlZmluZSBCRkRfUkVMT0MoeCkgLTEKIApAQCAtNiwxMjE3ICsyNiwxMjE3IEBACiAjZGVmaW5lIFRSRUdfU04gNTYKICNkZWZpbmUgVFJFR19aRVJPIDYzCiAKLS8qIEZJWE1FOiBSZW5hbWUgdGhpcy4gKi8KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGUuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KIAotY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlIHRpbGVfb3Bjb2Rlc1szOTVdID0KK2NvbnN0IHN0cnVjdCB0aWxlcHJvX29wY29kZSB0aWxlcHJvX29wY29kZXNbMzk1XSA9CiB7Ci0geyAiYnB0IiwgVElMRV9PUENfQlBULCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyB7ICJicHQiLCBUSUxFUFJPX09QQ19CUFQsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAogICAgIHsgeyAwLCB9LCB7ICB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImluZm8iLCBUSUxFX09QQ19JTkZPLCAweGYsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW5mbyIsIFRJTEVQUk9fT1BDX0lORk8sIDB4ZiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwIH0sIHsgMSB9LCB7IDIgfSwgeyAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbmZvbCIsIFRJTEVfT1BDX0lORk9MLCAweDMsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW5mb2wiLCBUSUxFUFJPX09QQ19JTkZPTCwgMHgzLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDQgfSwgeyA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaiIsIFRJTEVfT1BDX0osIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqIiwgVElMRVBST19PUENfSiwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImphbCIsIFRJTEVfT1BDX0pBTCwgMHgyLCAxLCBUUkVHX0xSLCAxLAorICB7ICJqYWwiLCBUSUxFUFJPX09QQ19KQUwsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyA2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZSIsIFRJTEVfT1BDX01PVkUsIDB4ZiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJtb3ZlIiwgVElMRVBST19PUENfTU9WRSwgMHhmLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDggfSwgeyA5LCAxMCB9LCB7IDExLCAxMiB9LCB7IDEzLCAxNCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZS5zbiIsIFRJTEVfT1BDX01PVkVfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKKyAgeyAibW92ZS5zbiIsIFRJTEVQUk9fT1BDX01PVkVfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDksIDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZWkiLCBUSUxFX09QQ19NT1ZFSSwgMHhmLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1vdmVpIiwgVElMRVBST19PUENfTU9WRUksIDB4ZiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCAwIH0sIHsgOSwgMSB9LCB7IDExLCAyIH0sIHsgMTMsIDMgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVpLnNuIiwgVElMRV9PUENfTU9WRUlfU04sIDB4MywgMiwgVFJFR19TTiwgMSwKKyAgeyAibW92ZWkuc24iLCBUSUxFUFJPX09QQ19NT1ZFSV9TTiwgMHgzLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCAwIH0sIHsgOSwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVsaSIsIFRJTEVfT1BDX01PVkVMSSwgMHgzLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1vdmVsaSIsIFRJTEVQUk9fT1BDX01PVkVMSSwgMHgzLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDQgfSwgeyA5LCA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW92ZWxpLnNuIiwgVElMRV9PUENfTU9WRUxJX1NOLCAweDMsIDIsIFRSRUdfU04sIDEsCisgIHsgIm1vdmVsaS5zbiIsIFRJTEVQUk9fT1BDX01PVkVMSV9TTiwgMHgzLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA0IH0sIHsgOSwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1vdmVsaXMiLCBUSUxFX09QQ19NT1ZFTElTLCAweDMsIDIsIFRSRUdfU04sIDEsCisgIHsgIm1vdmVsaXMiLCBUSUxFUFJPX09QQ19NT1ZFTElTLCAweDMsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDQgfSwgeyA5LCA1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicHJlZmV0Y2giLCBUSUxFX09QQ19QUkVGRVRDSCwgMHgxMiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJwcmVmZXRjaCIsIFRJTEVQUk9fT1BDX1BSRUZFVENILCAweDEyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMTUgfSB9LAogICB9LAotICB7ICJyYWlzZSIsIFRJTEVfT1BDX1JBSVNFLCAweDIsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAicmFpc2UiLCBUSUxFUFJPX09QQ19SQUlTRSwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkIiwgVElMRV9PUENfQURELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkIiwgVElMRVBST19PUENfQURELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkLnNuIiwgVElMRV9PUENfQUREX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZC5zbiIsIFRJTEVQUk9fT1BDX0FERF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGIiLCBUSUxFX09QQ19BRERCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkYiIsIFRJTEVQUk9fT1BDX0FEREIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGIuc24iLCBUSUxFX09QQ19BRERCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZGIuc24iLCBUSUxFUFJPX09QQ19BRERCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkYnNfdSIsIFRJTEVfT1BDX0FEREJTX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGRic191IiwgVElMRVBST19PUENfQUREQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRkYnNfdS5zbiIsIFRJTEVfT1BDX0FEREJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkYnNfdS5zbiIsIFRJTEVQUk9fT1BDX0FEREJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRoIiwgVElMRV9PUENfQURESCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkZGgiLCBUSUxFUFJPX09QQ19BRERILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRoLnNuIiwgVElMRV9PUENfQURESF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGRoLnNuIiwgVElMRVBST19PUENfQURESF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGhzIiwgVElMRV9PUENfQURESFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGRocyIsIFRJTEVQUk9fT1BDX0FEREhTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRocy5zbiIsIFRJTEVfT1BDX0FEREhTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZGhzLnNuIiwgVElMRVBST19PUENfQURESFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpIiwgVElMRV9PUENfQURESSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkZGkiLCBUSUxFUFJPX09QQ19BRERJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpLnNuIiwgVElMRV9PUENfQURESV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGRpLnNuIiwgVElMRVBST19PUENfQURESV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpYiIsIFRJTEVfT1BDX0FERElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkaWIiLCBUSUxFUFJPX09QQ19BRERJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGliLnNuIiwgVElMRV9PUENfQURESUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkaWIuc24iLCBUSUxFUFJPX09QQ19BRERJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRpaCIsIFRJTEVfT1BDX0FERElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkaWgiLCBUSUxFUFJPX09QQ19BRERJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGloLnNuIiwgVElMRV9PUENfQURESUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkaWguc24iLCBUSUxFUFJPX09QQ19BRERJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRsaSIsIFRJTEVfT1BDX0FERExJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkbGkiLCBUSUxFUFJPX09QQ19BRERMSSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDQgfSwgeyA5LCAxMCwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZGxpLnNuIiwgVElMRV9PUENfQURETElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkbGkuc24iLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCA0IH0sIHsgOSwgMTAsIDUgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGRsaXMiLCBUSUxFX09QQ19BRERMSVMsIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiYWRkbGlzIiwgVElMRVBST19PUENfQURETElTLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDQgfSwgeyA5LCAxMCwgNSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZHMiLCBUSUxFX09QQ19BRERTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYWRkcyIsIFRJTEVQUk9fT1BDX0FERFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFkZHMuc24iLCBUSUxFX09QQ19BRERTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkZHMuc24iLCBUSUxFUFJPX09QQ19BRERTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZiX3UiLCBUSUxFX09QQ19BRElGRkJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImFkaWZmYl91IiwgVElMRVBST19PUENfQURJRkZCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZiX3Uuc24iLCBUSUxFX09QQ19BRElGRkJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhZGlmZmJfdS5zbiIsIFRJTEVQUk9fT1BDX0FESUZGQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhZGlmZmgiLCBUSUxFX09QQ19BRElGRkgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhZGlmZmgiLCBUSUxFUFJPX09QQ19BRElGRkgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYWRpZmZoLnNuIiwgVElMRV9PUENfQURJRkZIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImFkaWZmaC5zbiIsIFRJTEVQUk9fT1BDX0FESUZGSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYW5kIiwgVElMRV9PUENfQU5ELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYW5kIiwgVElMRVBST19PUENfQU5ELCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYW5kLnNuIiwgVElMRV9PUENfQU5EX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFuZC5zbiIsIFRJTEVQUk9fT1BDX0FORF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFuZGkiLCBUSUxFX09QQ19BTkRJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYW5kaSIsIFRJTEVQUk9fT1BDX0FOREksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAxMSwgMTIsIDIgfSwgeyAxMywgMTQsIDMgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImFuZGkuc24iLCBUSUxFX09QQ19BTkRJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImFuZGkuc24iLCBUSUxFUFJPX09QQ19BTkRJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImF1bGkiLCBUSUxFX09QQ19BVUxJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiYXVsaSIsIFRJTEVQUk9fT1BDX0FVTEksIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCA0IH0sIHsgOSwgMTAsIDUgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhdmdiX3UiLCBUSUxFX09QQ19BVkdCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhdmdiX3UiLCBUSUxFUFJPX09QQ19BVkdCX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYXZnYl91LnNuIiwgVElMRV9PUENfQVZHQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImF2Z2JfdS5zbiIsIFRJTEVQUk9fT1BDX0FWR0JfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYXZnaCIsIFRJTEVfT1BDX0FWR0gsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJhdmdoIiwgVElMRVBST19PUENfQVZHSCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJhdmdoLnNuIiwgVElMRV9PUENfQVZHSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJhdmdoLnNuIiwgVElMRVBST19PUENfQVZHSF9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJucyIsIFRJTEVfT1BDX0JCTlMsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiYm5zIiwgVElMRVBST19PUENfQkJOUywgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJucy5zbiIsIFRJTEVfT1BDX0JCTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJucy5zbiIsIFRJTEVQUk9fT1BDX0JCTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiYm5zdCIsIFRJTEVfT1BDX0JCTlNULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmJuc3QiLCBUSUxFUFJPX09QQ19CQk5TVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJuc3Quc24iLCBUSUxFX09QQ19CQk5TVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiYm5zdC5zbiIsIFRJTEVQUk9fT1BDX0JCTlNUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzIiwgVElMRV9PUENfQkJTLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmJzIiwgVElMRVBST19PUENfQkJTLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiYnMuc24iLCBUSUxFX09QQ19CQlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJzLnNuIiwgVElMRVBST19PUENfQkJTX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzdCIsIFRJTEVfT1BDX0JCU1QsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiYnN0IiwgVElMRVBST19PUENfQkJTVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmJzdC5zbiIsIFRJTEVfT1BDX0JCU1RfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmJzdC5zbiIsIFRJTEVQUk9fT1BDX0JCU1RfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6IiwgVElMRV9PUENfQkdFWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJnZXoiLCBUSUxFUFJPX09QQ19CR0VaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6LnNuIiwgVElMRV9PUENfQkdFWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ2V6LnNuIiwgVElMRVBST19PUENfQkdFWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJnZXp0IiwgVElMRV9PUENfQkdFWlQsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiZ2V6dCIsIFRJTEVQUk9fT1BDX0JHRVpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ2V6dC5zbiIsIFRJTEVfT1BDX0JHRVpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImJnZXp0LnNuIiwgVElMRVBST19PUENfQkdFWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3oiLCBUSUxFX09QQ19CR1osIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJiZ3oiLCBUSUxFUFJPX09QQ19CR1osIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJnei5zbiIsIFRJTEVfT1BDX0JHWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ3ouc24iLCBUSUxFUFJPX09QQ19CR1pfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3p0IiwgVElMRV9PUENfQkdaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJnenQiLCBUSUxFUFJPX09QQ19CR1pULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJiZ3p0LnNuIiwgVElMRV9PUENfQkdaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiZ3p0LnNuIiwgVElMRVBST19PUENfQkdaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJpdHgiLCBUSUxFX09QQ19CSVRYLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYml0eCIsIFRJTEVQUk9fT1BDX0JJVFgsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAxMSwgMTIgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYml0eC5zbiIsIFRJTEVfT1BDX0JJVFhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYml0eC5zbiIsIFRJTEVQUk9fT1BDX0JJVFhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxleiIsIFRJTEVfT1BDX0JMRVosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibGV6IiwgVElMRVBST19PUENfQkxFWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxlei5zbiIsIFRJTEVfT1BDX0JMRVpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmxlei5zbiIsIFRJTEVQUk9fT1BDX0JMRVpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibGV6dCIsIFRJTEVfT1BDX0JMRVpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmxlenQiLCBUSUxFUFJPX09QQ19CTEVaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmxlenQuc24iLCBUSUxFX09QQ19CTEVaVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibGV6dC5zbiIsIFRJTEVQUk9fT1BDX0JMRVpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6IiwgVElMRV9PUENfQkxaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYmx6IiwgVElMRVBST19PUENfQkxaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibHouc24iLCBUSUxFX09QQ19CTFpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmx6LnNuIiwgVElMRVBST19PUENfQkxaX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6dCIsIFRJTEVfT1BDX0JMWlQsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibHp0IiwgVElMRVBST19PUENfQkxaVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYmx6dC5zbiIsIFRJTEVfT1BDX0JMWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYmx6dC5zbiIsIFRJTEVQUk9fT1BDX0JMWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnoiLCBUSUxFX09QQ19CTlosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJibnoiLCBUSUxFUFJPX09QQ19CTlosIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJuei5zbiIsIFRJTEVfT1BDX0JOWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibnouc24iLCBUSUxFUFJPX09QQ19CTlpfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnp0IiwgVElMRV9PUENfQk5aVCwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImJuenQiLCBUSUxFUFJPX09QQ19CTlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJibnp0LnNuIiwgVElMRV9PUENfQk5aVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJibnp0LnNuIiwgVElMRVBST19PUENfQk5aVF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAyMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJ5dGV4IiwgVElMRV9PUENfQllURVgsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJieXRleCIsIFRJTEVQUk9fT1BDX0JZVEVYLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMTEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImJ5dGV4LnNuIiwgVElMRV9PUENfQllURVhfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYnl0ZXguc24iLCBUSUxFUFJPX09QQ19CWVRFWF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJieiIsIFRJTEVfT1BDX0JaLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYnoiLCBUSUxFUFJPX09QQ19CWiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYnouc24iLCBUSUxFX09QQ19CWl9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJiei5zbiIsIFRJTEVQUk9fT1BDX0JaX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiYnp0IiwgVElMRV9PUENfQlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiYnp0IiwgVElMRVBST19PUENfQlpULCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMjAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJienQuc24iLCBUSUxFX09QQ19CWlRfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAiYnp0LnNuIiwgVElMRVBST19PUENfQlpUX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDIwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY2x6IiwgVElMRV9PUENfQ0xaLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAiY2x6IiwgVElMRVBST19PUENfQ0xaLCAweDUsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMTEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImNsei5zbiIsIFRJTEVfT1BDX0NMWl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAorICB7ICJjbHouc24iLCBUSUxFUFJPX09QQ19DTFpfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3JjMzJfMzIiLCBUSUxFX09QQ19DUkMzMl8zMiwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImNyYzMyXzMyIiwgVElMRVBST19PUENfQ1JDMzJfMzIsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3JjMzJfMzIuc24iLCBUSUxFX09QQ19DUkMzMl8zMl9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJjcmMzMl8zMi5zbiIsIFRJTEVQUk9fT1BDX0NSQzMyXzMyX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJjcmMzMl84IiwgVElMRV9PUENfQ1JDMzJfOCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImNyYzMyXzgiLCBUSUxFUFJPX09QQ19DUkMzMl84LCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImNyYzMyXzguc24iLCBUSUxFX09QQ19DUkMzMl84X1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImNyYzMyXzguc24iLCBUSUxFUFJPX09QQ19DUkMzMl84X1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJjdHoiLCBUSUxFX09QQ19DVFosIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJjdHoiLCBUSUxFUFJPX09QQ19DVFosIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAxMSwgMTIgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiY3R6LnNuIiwgVElMRV9PUENfQ1RaX1NOLCAweDEsIDIsIFRSRUdfU04sIDEsCisgIHsgImN0ei5zbiIsIFRJTEVQUk9fT1BDX0NUWl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJkcmFpbiIsIFRJTEVfT1BDX0RSQUlOLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAiZHJhaW4iLCBUSUxFUFJPX09QQ19EUkFJTiwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiZHRsYnByIiwgVElMRV9PUENfRFRMQlBSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiZHRsYnByIiwgVElMRVBST19PUENfRFRMQlBSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImR3b3JkX2FsaWduIiwgVElMRV9PUENfRFdPUkRfQUxJR04sIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJkd29yZF9hbGlnbiIsIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJkd29yZF9hbGlnbi5zbiIsIFRJTEVfT1BDX0RXT1JEX0FMSUdOX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgImR3b3JkX2FsaWduLnNuIiwgVElMRVBST19PUENfRFdPUkRfQUxJR05fU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJmaW52IiwgVElMRV9PUENfRklOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImZpbnYiLCBUSUxFUFJPX09QQ19GSU5WLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImZsdXNoIiwgVElMRV9PUENfRkxVU0gsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJmbHVzaCIsIFRJTEVQUk9fT1BDX0ZMVVNILCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImZub3AiLCBUSUxFX09QQ19GTk9QLCAweGYsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAiZm5vcCIsIFRJTEVQUk9fT1BDX0ZOT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAgfSwgeyAgfSwgeyAgfSwgeyAgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImljb2giLCBUSUxFX09QQ19JQ09ILCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAiaWNvaCIsIFRJTEVQUk9fT1BDX0lDT0gsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaWxsIiwgVElMRV9PUENfSUxMLCAweGEsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAiaWxsIiwgVElMRVBST19PUENfSUxMLCAweGEsIDAsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7ICB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50aGIiLCBUSUxFX09QQ19JTlRIQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImludGhiIiwgVElMRVBST19PUENfSU5USEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGhiLnNuIiwgVElMRV9PUENfSU5USEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiaW50aGIuc24iLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGhoIiwgVElMRV9PUENfSU5USEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJpbnRoaCIsIFRJTEVQUk9fT1BDX0lOVEhILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbnRoaC5zbiIsIFRJTEVfT1BDX0lOVEhIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgImludGhoLnNuIiwgVElMRVBST19PUENfSU5USEhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpbnRsYiIsIFRJTEVfT1BDX0lOVExCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiaW50bGIiLCBUSUxFUFJPX09QQ19JTlRMQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50bGIuc24iLCBUSUxFX09QQ19JTlRMQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJpbnRsYi5zbiIsIFRJTEVQUk9fT1BDX0lOVExCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiaW50bGgiLCBUSUxFX09QQ19JTlRMSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImludGxoIiwgVElMRVBST19PUENfSU5UTEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludGxoLnNuIiwgVElMRV9PUENfSU5UTEhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiaW50bGguc24iLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImludiIsIFRJTEVfT1BDX0lOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImludiIsIFRJTEVQUk9fT1BDX0lOViwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJpcmV0IiwgVElMRV9PUENfSVJFVCwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCisgIHsgImlyZXQiLCBUSUxFUFJPX09QQ19JUkVULCAweDIsIDAsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJqYWxiIiwgVElMRV9PUENfSkFMQiwgMHgyLCAxLCBUUkVHX0xSLCAxLAorICB7ICJqYWxiIiwgVElMRVBST19PUENfSkFMQiwgMHgyLCAxLCBUUkVHX0xSLCAxLAogICAgIHsgeyAwLCB9LCB7IDIyIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiamFsZiIsIFRJTEVfT1BDX0pBTEYsIDB4MiwgMSwgVFJFR19MUiwgMSwKKyAgeyAiamFsZiIsIFRJTEVQUk9fT1BDX0pBTEYsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImphbHIiLCBUSUxFX09QQ19KQUxSLCAweDIsIDEsIFRSRUdfTFIsIDEsCisgIHsgImphbHIiLCBUSUxFUFJPX09QQ19KQUxSLCAweDIsIDEsIFRSRUdfTFIsIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJqYWxycCIsIFRJTEVfT1BDX0pBTFJQLCAweDIsIDEsIFRSRUdfTFIsIDEsCisgIHsgImphbHJwIiwgVElMRVBST19PUENfSkFMUlAsIDB4MiwgMSwgVFJFR19MUiwgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpiIiwgVElMRV9PUENfSkIsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqYiIsIFRJTEVQUk9fT1BDX0pCLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpmIiwgVElMRV9PUENfSkYsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqZiIsIFRJTEVQUk9fT1BDX0pGLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyMiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpyIiwgVElMRV9PUENfSlIsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAorICB7ICJqciIsIFRJTEVQUk9fT1BDX0pSLCAweDIsIDEsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImpycCIsIFRJTEVfT1BDX0pSUCwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImpycCIsIFRJTEVQUk9fT1BDX0pSUCwgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsYiIsIFRJTEVfT1BDX0xCLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImxiIiwgVElMRVBST19PUENfTEIsIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAyMywgMTUgfSB9LAogICB9LAotICB7ICJsYi5zbiIsIFRJTEVfT1BDX0xCX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImxiLnNuIiwgVElMRVBST19PUENfTEJfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiX3UiLCBUSUxFX09QQ19MQl9VLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgImxiX3UiLCBUSUxFUFJPX09QQ19MQl9VLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibGJfdS5zbiIsIFRJTEVfT1BDX0xCX1VfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKKyAgeyAibGJfdS5zbiIsIFRJTEVQUk9fT1BDX0xCX1VfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiYWRkIiwgVElMRV9PUENfTEJBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsYmFkZCIsIFRJTEVQUk9fT1BDX0xCQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxiYWRkLnNuIiwgVElMRV9PUENfTEJBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibGJhZGQuc24iLCBUSUxFUFJPX09QQ19MQkFERF9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGJhZGRfdSIsIFRJTEVfT1BDX0xCQUREX1UsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsYmFkZF91IiwgVElMRVBST19PUENfTEJBRERfVSwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsYmFkZF91LnNuIiwgVElMRV9PUENfTEJBRERfVV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAorICB7ICJsYmFkZF91LnNuIiwgVElMRVBST19PUENfTEJBRERfVV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGgiLCBUSUxFX09QQ19MSCwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsaCIsIFRJTEVQUk9fT1BDX0xILCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibGguc24iLCBUSUxFX09QQ19MSF9TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJsaC5zbiIsIFRJTEVQUk9fT1BDX0xIX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaF91IiwgVElMRV9PUENfTEhfVSwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsaF91IiwgVElMRVBST19PUENfTEhfVSwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDIzLCAxNSB9IH0sCiAgIH0sCi0gIHsgImxoX3Uuc24iLCBUSUxFX09QQ19MSF9VX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImxoX3Uuc24iLCBUSUxFUFJPX09QQ19MSF9VX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaGFkZCIsIFRJTEVfT1BDX0xIQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibGhhZGQiLCBUSUxFUFJPX09QQ19MSEFERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsaGFkZC5zbiIsIFRJTEVfT1BDX0xIQUREX1NOLCAweDIsIDMsIFRSRUdfU04sIDEsCisgIHsgImxoYWRkLnNuIiwgVElMRVBST19PUENfTEhBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxoYWRkX3UiLCBUSUxFX09QQ19MSEFERF9VLCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibGhhZGRfdSIsIFRJTEVQUk9fT1BDX0xIQUREX1UsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibGhhZGRfdS5zbiIsIFRJTEVfT1BDX0xIQUREX1VfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibGhhZGRfdS5zbiIsIFRJTEVQUk9fT1BDX0xIQUREX1VfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxuayIsIFRJTEVfT1BDX0xOSywgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCisgIHsgImxuayIsIFRJTEVQUk9fT1BDX0xOSywgMHgyLCAxLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImxuay5zbiIsIFRJTEVfT1BDX0xOS19TTiwgMHgyLCAxLCBUUkVHX1NOLCAxLAorICB7ICJsbmsuc24iLCBUSUxFUFJPX09QQ19MTktfU04sIDB4MiwgMSwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHciLCBUSUxFX09QQ19MVywgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJsdyIsIFRJTEVQUk9fT1BDX0xXLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMjMsIDE1IH0gfSwKICAgfSwKLSAgeyAibHcuc24iLCBUSUxFX09QQ19MV19TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJsdy5zbiIsIFRJTEVQUk9fT1BDX0xXX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsd19uYSIsIFRJTEVfT1BDX0xXX05BLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAibHdfbmEiLCBUSUxFUFJPX09QQ19MV19OQSwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJsd19uYS5zbiIsIFRJTEVfT1BDX0xXX05BX1NOLCAweDIsIDIsIFRSRUdfU04sIDEsCisgIHsgImx3X25hLnNuIiwgVElMRVBST19PUENfTFdfTkFfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImx3YWRkIiwgVElMRV9PUENfTFdBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJsd2FkZCIsIFRJTEVQUk9fT1BDX0xXQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAyNCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgImx3YWRkLnNuIiwgVElMRV9PUENfTFdBRERfU04sIDB4MiwgMywgVFJFR19TTiwgMSwKKyAgeyAibHdhZGQuc24iLCBUSUxFUFJPX09QQ19MV0FERF9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHdhZGRfbmEiLCBUSUxFX09QQ19MV0FERF9OQSwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgImx3YWRkX25hIiwgVElMRVBST19PUENfTFdBRERfTkEsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI0LCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibHdhZGRfbmEuc24iLCBUSUxFX09QQ19MV0FERF9OQV9TTiwgMHgyLCAzLCBUUkVHX1NOLCAxLAorICB7ICJsd2FkZF9uYS5zbiIsIFRJTEVQUk9fT1BDX0xXQUREX05BX1NOLCAweDIsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDAsIH0sIHsgOSwgMjQsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhiX3UiLCBUSUxFX09QQ19NQVhCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtYXhiX3UiLCBUSUxFUFJPX09QQ19NQVhCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGJfdS5zbiIsIFRJTEVfT1BDX01BWEJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhiX3Uuc24iLCBUSUxFUFJPX09QQ19NQVhCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhoIiwgVElMRV9PUENfTUFYSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1heGgiLCBUSUxFUFJPX09QQ19NQVhILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhoLnNuIiwgVElMRV9PUENfTUFYSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhoLnNuIiwgVElMRVBST19PUENfTUFYSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGliX3UiLCBUSUxFX09QQ19NQVhJQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWF4aWJfdSIsIFRJTEVQUk9fT1BDX01BWElCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhpYl91LnNuIiwgVElMRV9PUENfTUFYSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtYXhpYl91LnNuIiwgVElMRVBST19PUENfTUFYSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtYXhpaCIsIFRJTEVfT1BDX01BWElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWF4aWgiLCBUSUxFUFJPX09QQ19NQVhJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm1heGloLnNuIiwgVElMRV9PUENfTUFYSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWF4aWguc24iLCBUSUxFUFJPX09QQ19NQVhJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtZiIsIFRJTEVfT1BDX01GLCAweDIsIDAsIFRSRUdfWkVSTywgMSwKKyAgeyAibWYiLCBUSUxFUFJPX09QQ19NRiwgMHgyLCAwLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWZzcHIiLCBUSUxFX09QQ19NRlNQUiwgMHgyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1mc3ByIiwgVElMRVBST19PUENfTUZTUFIsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDksIDI1IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluYl91IiwgVElMRV9PUENfTUlOQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibWluYl91IiwgVElMRVBST19PUENfTUlOQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5iX3Uuc24iLCBUSUxFX09QQ19NSU5CX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluYl91LnNuIiwgVElMRVBST19PUENfTUlOQl9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaCIsIFRJTEVfT1BDX01JTkgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtaW5oIiwgVElMRVBST19PUENfTUlOSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaC5zbiIsIFRJTEVfT1BDX01JTkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluaC5zbiIsIFRJTEVQUk9fT1BDX01JTkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5pYl91IiwgVElMRV9PUENfTUlOSUJfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1pbmliX3UiLCBUSUxFUFJPX09QQ19NSU5JQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaWJfdS5zbiIsIFRJTEVfT1BDX01JTklCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibWluaWJfdS5zbiIsIFRJTEVQUk9fT1BDX01JTklCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibWluaWgiLCBUSUxFX09QQ19NSU5JSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1pbmloIiwgVElMRVBST19PUENfTUlOSUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtaW5paC5zbiIsIFRJTEVfT1BDX01JTklIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgIm1pbmloLnNuIiwgVElMRVBST19PUENfTUlOSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW0iLCBUSUxFX09QQ19NTSwgMHgzLCA1LCBUUkVHX1pFUk8sIDEsCisgIHsgIm1tIiwgVElMRVBST19PUENfTU0sIDB4MywgNSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiwgMjYsIDI3IH0sIHsgOSwgMTAsIDE3LCAyOCwgMjkgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnoiLCBUSUxFX09QQ19NTlosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtbnoiLCBUSUxFUFJPX09QQ19NTlosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnouc24iLCBUSUxFX09QQ19NTlpfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibW56LnNuIiwgVElMRVBST19PUENfTU5aX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW56YiIsIFRJTEVfT1BDX01OWkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJtbnpiIiwgVElMRVBST19PUENfTU5aQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibW56Yi5zbiIsIFRJTEVfT1BDX01OWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibW56Yi5zbiIsIFRJTEVQUk9fT1BDX01OWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnpoIiwgVElMRV9PUENfTU5aSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm1uemgiLCBUSUxFUFJPX09QQ19NTlpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtbnpoLnNuIiwgVElMRV9PUENfTU5aSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtbnpoLnNuIiwgVElMRVBST19PUENfTU5aSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm10c3ByIiwgVElMRV9PUENfTVRTUFIsIDB4MiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJtdHNwciIsIFRJTEVQUk9fT1BDX01UU1BSLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAzMCwgMTAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaF9zcyIsIFRJTEVfT1BDX01VTEhIX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhfc3MiLCBUSUxFUFJPX09QQ19NVUxISF9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoX3NzLnNuIiwgVElMRV9PUENfTVVMSEhfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGhfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxISF9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhfc3UiLCBUSUxFX09QQ19NVUxISF9TVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhoX3N1IiwgVElMRVBST19PUENfTVVMSEhfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhfc3Uuc24iLCBUSUxFX09QQ19NVUxISF9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaF9zdS5zbiIsIFRJTEVQUk9fT1BDX01VTEhIX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaF91dSIsIFRJTEVfT1BDX01VTEhIX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhfdXUiLCBUSUxFUFJPX09QQ19NVUxISF9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoX3V1LnNuIiwgVElMRV9PUENfTVVMSEhfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGhfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxISF9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhhX3NzIiwgVElMRV9PUENfTVVMSEhBX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhhX3NzIiwgVElMRVBST19PUENfTVVMSEhBX1NTLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoYV9zcy5zbiIsIFRJTEVfT1BDX01VTEhIQV9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaGFfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxISEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaGFfc3UiLCBUSUxFX09QQ19NVUxISEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxoaGFfc3UiLCBUSUxFUFJPX09QQ19NVUxISEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoYV9zdS5zbiIsIFRJTEVfT1BDX01VTEhIQV9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxoaGFfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxISEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxoaGFfdXUiLCBUSUxFX09QQ19NVUxISEFfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxoaGFfdXUiLCBUSUxFUFJPX09QQ19NVUxISEFfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGhhX3V1LnNuIiwgVElMRV9PUENfTVVMSEhBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhoYV91dS5zbiIsIFRJTEVQUk9fT1BDX01VTEhIQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoc2FfdXUiLCBUSUxFX09QQ19NVUxISFNBX1VVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGhzYV91dSIsIFRJTEVQUk9fT1BDX01VTEhIU0FfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhoc2FfdXUuc24iLCBUSUxFX09QQ19NVUxISFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhoc2FfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxISFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfc3MiLCBUSUxFX09QQ19NVUxITF9TUywgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsX3NzIiwgVElMRVBST19PUENfTVVMSExfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfc3Muc24iLCBUSUxFX09QQ19NVUxITF9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobF9zcy5zbiIsIFRJTEVQUk9fT1BDX01VTEhMX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobF9zdSIsIFRJTEVfT1BDX01VTEhMX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsaGxfc3UiLCBUSUxFUFJPX09QQ19NVUxITF9TVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobF9zdS5zbiIsIFRJTEVfT1BDX01VTEhMX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhsX3N1LnNuIiwgVElMRVBST19PUENfTVVMSExfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsX3VzIiwgVElMRV9PUENfTVVMSExfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobF91cyIsIFRJTEVQUk9fT1BDX01VTEhMX1VTLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsX3VzLnNuIiwgVElMRV9PUENfTVVMSExfVVNfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsaGxfdXMuc24iLCBUSUxFUFJPX09QQ19NVUxITF9VU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfdXUiLCBUSUxFX09QQ19NVUxITF9VVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsX3V1IiwgVElMRVBST19PUENfTVVMSExfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsaGxfdXUuc24iLCBUSUxFX09QQ19NVUxITF9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobF91dS5zbiIsIFRJTEVQUk9fT1BDX01VTEhMX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfc3MiLCBUSUxFX09QQ19NVUxITEFfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfc3MiLCBUSUxFUFJPX09QQ19NVUxITEFfU1MsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV9zcy5zbiIsIFRJTEVfT1BDX01VTEhMQV9TU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfc3Muc24iLCBUSUxFUFJPX09QQ19NVUxITEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfc3UiLCBUSUxFX09QQ19NVUxITEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfc3UiLCBUSUxFUFJPX09QQ19NVUxITEFfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV9zdS5zbiIsIFRJTEVfT1BDX01VTEhMQV9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfdXMiLCBUSUxFX09QQ19NVUxITEFfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfdXMiLCBUSUxFUFJPX09QQ19NVUxITEFfVVMsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV91cy5zbiIsIFRJTEVfT1BDX01VTEhMQV9VU19TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfdXMuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobGFfdXUiLCBUSUxFX09QQ19NVUxITEFfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxobGFfdXUiLCBUSUxFUFJPX09QQ19NVUxITEFfVVUsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsYV91dS5zbiIsIFRJTEVfT1BDX01VTEhMQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxobGFfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxITEFfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxobHNhX3V1IiwgVElMRV9PUENfTVVMSExTQV9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGhsc2FfdXUiLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGhsc2FfdXUuc24iLCBUSUxFX09QQ19NVUxITFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGhsc2FfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxfc3MiLCBUSUxFX09QQ19NVUxMTF9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsX3NzIiwgVElMRVBST19PUENfTVVMTExfU1MsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMTEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbF9zcy5zbiIsIFRJTEVfT1BDX01VTExMX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGxsX3NzLnNuIiwgVElMRVBST19PUENfTVVMTExfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsX3N1IiwgVElMRV9PUENfTVVMTExfU1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdWxsbF9zdSIsIFRJTEVQUk9fT1BDX01VTExMX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsX3N1LnNuIiwgVElMRV9PUENfTVVMTExfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxfc3Uuc24iLCBUSUxFUFJPX09QQ19NVUxMTF9TVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxfdXUiLCBUSUxFX09QQ19NVUxMTF9VVSwgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsX3V1IiwgVElMRVBST19PUENfTVVMTExfVVUsIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMTEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbF91dS5zbiIsIFRJTEVfT1BDX01VTExMX1VVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm11bGxsX3V1LnNuIiwgVElMRVBST19PUENfTVVMTExfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsYV9zcyIsIFRJTEVfT1BDX01VTExMQV9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsYV9zcyIsIFRJTEVQUk9fT1BDX01VTExMQV9TUywgMHg1LCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMzEsIDEyLCAxOCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbGFfc3Muc24iLCBUSUxFX09QQ19NVUxMTEFfU1NfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxhX3NzLnNuIiwgVElMRVBST19PUENfTVVMTExBX1NTX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxhX3N1IiwgVElMRV9PUENfTVVMTExBX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsbGxhX3N1IiwgVElMRVBST19PUENfTVVMTExBX1NVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbGFfc3Uuc24iLCBUSUxFX09QQ19NVUxMTEFfU1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXVsbGxhX3N1LnNuIiwgVElMRVBST19PUENfTVVMTExBX1NVX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDIxLCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXVsbGxhX3V1IiwgVElMRV9PUENfTVVMTExBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXVsbGxhX3V1IiwgVElMRVBST19PUENfTVVMTExBX1VVLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAzMSwgMTIsIDE4IH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm11bGxsYV91dS5zbiIsIFRJTEVfT1BDX01VTExMQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxsbGFfdXUuc24iLCBUSUxFUFJPX09QQ19NVUxMTEFfVVVfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbHNhX3V1IiwgVElMRV9PUENfTVVMTExTQV9VVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm11bGxsc2FfdXUiLCBUSUxFUFJPX09QQ19NVUxMTFNBX1VVLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdWxsbHNhX3V1LnNuIiwgVElMRV9PUENfTVVMTExTQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtdWxsbHNhX3V1LnNuIiwgVElMRVBST19PUENfTVVMTExTQV9VVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm12bnoiLCBUSUxFX09QQ19NVk5aLCAweDUsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXZueiIsIFRJTEVQUk9fT1BDX01WTlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXZuei5zbiIsIFRJTEVfT1BDX01WTlpfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAibXZuei5zbiIsIFRJTEVQUk9fT1BDX01WTlpfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtdnoiLCBUSUxFX09QQ19NVlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJtdnoiLCBUSUxFUFJPX09QQ19NVlosIDB4NSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDMxLCAxMiwgMTggfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXZ6LnNuIiwgVElMRV9PUENfTVZaX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgIm12ei5zbiIsIFRJTEVQUk9fT1BDX01WWl9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm16IiwgVElMRV9PUENfTVosIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJteiIsIFRJTEVQUk9fT1BDX01aLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXouc24iLCBUSUxFX09QQ19NWl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJtei5zbiIsIFRJTEVQUk9fT1BDX01aX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXpiIiwgVElMRV9PUENfTVpCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXpiIiwgVElMRVBST19PUENfTVpCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtemIuc24iLCBUSUxFX09QQ19NWkJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibXpiLnNuIiwgVElMRVBST19PUENfTVpCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibXpoIiwgVElMRV9PUENfTVpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAibXpoIiwgVElMRVBST19PUENfTVpILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJtemguc24iLCBUSUxFX09QQ19NWkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAibXpoLnNuIiwgVElMRVBST19PUENfTVpIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAibmFwIiwgVElMRV9PUENfTkFQLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAibmFwIiwgVElMRVBST19PUENfTkFQLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJub3AiLCBUSUxFX09QQ19OT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAorICB7ICJub3AiLCBUSUxFUFJPX09QQ19OT1AsIDB4ZiwgMCwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAgfSwgeyAgfSwgeyAgfSwgeyAgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm5vciIsIFRJTEVfT1BDX05PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm5vciIsIFRJTEVQUk9fT1BDX05PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm5vci5zbiIsIFRJTEVfT1BDX05PUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJub3Iuc24iLCBUSUxFUFJPX09QQ19OT1JfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJvciIsIFRJTEVfT1BDX09SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAib3IiLCBUSUxFUFJPX09QQ19PUiwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm9yLnNuIiwgVElMRV9PUENfT1JfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAib3Iuc24iLCBUSUxFUFJPX09QQ19PUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIm9yaSIsIFRJTEVfT1BDX09SSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgIm9yaSIsIFRJTEVQUk9fT1BDX09SSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDExLCAxMiwgMiB9LCB7IDEzLCAxNCwgMyB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAib3JpLnNuIiwgVElMRV9PUENfT1JJX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgIm9yaS5zbiIsIFRJTEVQUk9fT1BDX09SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNrYnNfdSIsIFRJTEVfT1BDX1BBQ0tCU19VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2JzX3UiLCBUSUxFUFJPX09QQ19QQUNLQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2JzX3Uuc24iLCBUSUxFX09QQ19QQUNLQlNfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJwYWNrYnNfdS5zbiIsIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2hiIiwgVElMRV9PUENfUEFDS0hCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2hiIiwgVElMRVBST19PUENfUEFDS0hCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNraGIuc24iLCBUSUxFX09QQ19QQUNLSEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2hiLnNuIiwgVElMRVBST19PUENfUEFDS0hCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2hzIiwgVElMRV9PUENfUEFDS0hTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2hzIiwgVElMRVBST19PUENfUEFDS0hTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNraHMuc24iLCBUSUxFX09QQ19QQUNLSFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2hzLnNuIiwgVElMRVBST19PUENfUEFDS0hTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGFja2xiIiwgVElMRV9PUENfUEFDS0xCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicGFja2xiIiwgVElMRVBST19PUENfUEFDS0xCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwYWNrbGIuc24iLCBUSUxFX09QQ19QQUNLTEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicGFja2xiLnNuIiwgVElMRVBST19PUENfUEFDS0xCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAicGNudCIsIFRJTEVfT1BDX1BDTlQsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJwY250IiwgVElMRVBST19PUENfUENOVCwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDggfSwgeyAwLCB9LCB7IDExLCAxMiB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJwY250LnNuIiwgVElMRV9PUENfUENOVF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAorICB7ICJwY250LnNuIiwgVElMRVBST19PUENfUENOVF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJybCIsIFRJTEVfT1BDX1JMLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAicmwiLCBUSUxFUFJPX09QQ19STCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsLnNuIiwgVElMRV9PUENfUkxfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAicmwuc24iLCBUSUxFUFJPX09QQ19STF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsaSIsIFRJTEVfT1BDX1JMSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInJsaSIsIFRJTEVQUk9fT1BDX1JMSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMTEsIDEyLCAzNCB9LCB7IDEzLCAxNCwgMzUgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInJsaS5zbiIsIFRJTEVfT1BDX1JMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJybGkuc24iLCBUSUxFUFJPX09QQ19STElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzMWEiLCBUSUxFX09QQ19TMUEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzMWEiLCBUSUxFUFJPX09QQ19TMUEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzMWEuc24iLCBUSUxFX09QQ19TMUFfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAiczFhLnNuIiwgVElMRVBST19PUENfUzFBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiczJhIiwgVElMRV9PUENfUzJBLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAiczJhIiwgVElMRVBST19PUENfUzJBLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAiczJhLnNuIiwgVElMRV9PUENfUzJBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInMyYS5zbiIsIFRJTEVQUk9fT1BDX1MyQV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInMzYSIsIFRJTEVfT1BDX1MzQSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInMzYSIsIFRJTEVQUk9fT1BDX1MzQSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInMzYS5zbiIsIFRJTEVfT1BDX1MzQV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzM2Euc24iLCBUSUxFUFJPX09QQ19TM0FfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhYl91IiwgVElMRV9PUENfU0FEQUJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGFiX3UiLCBUSUxFUFJPX09QQ19TQURBQl9VLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhYl91LnNuIiwgVElMRV9PUENfU0FEQUJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzYWRhYl91LnNuIiwgVElMRVBST19PUENfU0FEQUJfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGFoIiwgVElMRV9PUENfU0FEQUgsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYWRhaCIsIFRJTEVQUk9fT1BDX1NBREFILCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaC5zbiIsIFRJTEVfT1BDX1NBREFIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGFoLnNuIiwgVElMRVBST19PUENfU0FEQUhfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaF91IiwgVElMRV9PUENfU0FEQUhfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGFoX3UiLCBUSUxFUFJPX09QQ19TQURBSF9VLCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMjEsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRhaF91LnNuIiwgVElMRV9PUENfU0FEQUhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzYWRhaF91LnNuIiwgVElMRVBST19PUENfU0FEQUhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGJfdSIsIFRJTEVfT1BDX1NBREJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGJfdSIsIFRJTEVQUk9fT1BDX1NBREJfVSwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRiX3Uuc24iLCBUSUxFX09QQ19TQURCX1VfU04sIDB4MSwgMywgVFJFR19TTiwgMSwKKyAgeyAic2FkYl91LnNuIiwgVElMRVBST19PUENfU0FEQl9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRoIiwgVElMRV9PUENfU0FESCwgMHgxLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNhZGgiLCBUSUxFUFJPX09QQ19TQURILCAweDEsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNhZGguc24iLCBUSUxFX09QQ19TQURIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGguc24iLCBUSUxFUFJPX09QQ19TQURIX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzYWRoX3UiLCBUSUxFX09QQ19TQURIX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYWRoX3UiLCBUSUxFUFJPX09QQ19TQURIX1UsIDB4MSwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2FkaF91LnNuIiwgVElMRV9PUENfU0FESF9VX1NOLCAweDEsIDMsIFRSRUdfU04sIDEsCisgIHsgInNhZGhfdS5zbiIsIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwgMHgxLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2IiLCBUSUxFX09QQ19TQiwgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAorICB7ICJzYiIsIFRJTEVQUk9fT1BDX1NCLCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDE1LCAzNiB9IH0sCiAgIH0sCi0gIHsgInNiYWRkIiwgVElMRV9PUENfU0JBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzYmFkZCIsIFRJTEVQUk9fT1BDX1NCQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAyNCwgMTcsIDM3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxIiwgVElMRV9PUENfU0VRLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxIiwgVElMRVBST19PUENfU0VRLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxLnNuIiwgVElMRV9PUENfU0VRX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNlcS5zbiIsIFRJTEVQUk9fT1BDX1NFUV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWIiLCBUSUxFX09QQ19TRVFCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxYiIsIFRJTEVQUk9fT1BDX1NFUUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWIuc24iLCBUSUxFX09QQ19TRVFCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNlcWIuc24iLCBUSUxFUFJPX09QQ19TRVFCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxaCIsIFRJTEVfT1BDX1NFUUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzZXFoIiwgVElMRVBST19PUENfU0VRSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2VxaC5zbiIsIFRJTEVfT1BDX1NFUUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaC5zbiIsIFRJTEVQUk9fT1BDX1NFUUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpIiwgVElMRV9PUENfU0VRSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNlcWkiLCBUSUxFUFJPX09QQ19TRVFJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpLnNuIiwgVElMRV9PUENfU0VRSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzZXFpLnNuIiwgVElMRVBST19PUENfU0VRSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpYiIsIFRJTEVfT1BDX1NFUUlCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxaWIiLCBUSUxFUFJPX09QQ19TRVFJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWliLnNuIiwgVElMRV9PUENfU0VRSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaWIuc24iLCBUSUxFUFJPX09QQ19TRVFJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzZXFpaCIsIFRJTEVfT1BDX1NFUUlILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2VxaWgiLCBUSUxFUFJPX09QQ19TRVFJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNlcWloLnNuIiwgVElMRV9PUENfU0VRSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2VxaWguc24iLCBUSUxFUFJPX09QQ19TRVFJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaCIsIFRJTEVfT1BDX1NILCAweDEyLCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInNoIiwgVElMRVBST19PUENfU0gsIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMTUsIDM2IH0gfSwKICAgfSwKLSAgeyAic2hhZGQiLCBUSUxFX09QQ19TSEFERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNoYWRkIiwgVElMRVBST19PUENfU0hBREQsIDB4MiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDI0LCAxNywgMzcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGwiLCBUSUxFX09QQ19TSEwsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGwiLCBUSUxFUFJPX09QQ19TSEwsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGwuc24iLCBUSUxFX09QQ19TSExfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hsLnNuIiwgVElMRVBST19PUENfU0hMX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsYiIsIFRJTEVfT1BDX1NITEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGxiIiwgVElMRVBST19PUENfU0hMQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsYi5zbiIsIFRJTEVfT1BDX1NITEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hsYi5zbiIsIFRJTEVQUk9fT1BDX1NITEJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxoIiwgVElMRV9PUENfU0hMSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNobGgiLCBUSUxFUFJPX09QQ19TSExILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxoLnNuIiwgVElMRV9PUENfU0hMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxoLnNuIiwgVElMRVBST19PUENfU0hMSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNobGkiLCBUSUxFX09QQ19TSExJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hsaSIsIFRJTEVQUk9fT1BDX1NITEksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDExLCAxMiwgMzQgfSwgeyAxMywgMTQsIDM1IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpLnNuIiwgVElMRV9PUENfU0hMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxpLnNuIiwgVElMRVBST19PUENfU0hMSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNobGliIiwgVElMRV9PUENfU0hMSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaGxpYiIsIFRJTEVQUk9fT1BDX1NITElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpYi5zbiIsIFRJTEVfT1BDX1NITElCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNobGliLnNuIiwgVElMRVBST19PUENfU0hMSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaGxpaCIsIFRJTEVfT1BDX1NITElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hsaWgiLCBUSUxFUFJPX09QQ19TSExJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hsaWguc24iLCBUSUxFX09QQ19TSExJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaGxpaC5zbiIsIFRJTEVQUk9fT1BDX1NITElIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyIiwgVElMRV9PUENfU0hSLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyIiwgVElMRVBST19PUENfU0hSLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyLnNuIiwgVElMRV9PUENfU0hSX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNoci5zbiIsIFRJTEVQUk9fT1BDX1NIUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmIiLCBUSUxFX09QQ19TSFJCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyYiIsIFRJTEVQUk9fT1BDX1NIUkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmIuc24iLCBUSUxFX09QQ19TSFJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNocmIuc24iLCBUSUxFUFJPX09QQ19TSFJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaCIsIFRJTEVfT1BDX1NIUkgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzaHJoIiwgVElMRVBST19PUENfU0hSSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaC5zbiIsIFRJTEVfT1BDX1NIUkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaC5zbiIsIFRJTEVQUk9fT1BDX1NIUkhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaHJpIiwgVElMRV9PUENfU0hSSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNocmkiLCBUSUxFUFJPX09QQ19TSFJJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAxMSwgMTIsIDM0IH0sIHsgMTMsIDE0LCAzNSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaS5zbiIsIFRJTEVfT1BDX1NIUklfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaS5zbiIsIFRJTEVQUk9fT1BDX1NIUklfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzaHJpYiIsIFRJTEVfT1BDX1NIUklCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2hyaWIiLCBUSUxFUFJPX09QQ19TSFJJQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaWIuc24iLCBUSUxFX09QQ19TSFJJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzaHJpYi5zbiIsIFRJTEVQUk9fT1BDX1NIUklCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2hyaWgiLCBUSUxFX09QQ19TSFJJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNocmloIiwgVElMRVBST19PUENfU0hSSUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNocmloLnNuIiwgVElMRV9PUENfU0hSSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2hyaWguc24iLCBUSUxFUFJPX09QQ19TSFJJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdCIsIFRJTEVfT1BDX1NMVCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdCIsIFRJTEVQUk9fT1BDX1NMVCwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdC5zbiIsIFRJTEVfT1BDX1NMVF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHQuc24iLCBUSUxFUFJPX09QQ19TTFRfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRfdSIsIFRJTEVfT1BDX1NMVF9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0X3UiLCBUSUxFUFJPX09QQ19TTFRfVSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdF91LnNuIiwgVElMRV9PUENfU0xUX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0X3Uuc24iLCBUSUxFUFJPX09QQ19TTFRfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGIiLCBUSUxFX09QQ19TTFRCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0YiIsIFRJTEVQUk9fT1BDX1NMVEIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGIuc24iLCBUSUxFX09QQ19TTFRCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGIuc24iLCBUSUxFUFJPX09QQ19TTFRCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0Yl91IiwgVElMRV9PUENfU0xUQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0Yl91IiwgVElMRVBST19PUENfU0xUQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRiX3Uuc24iLCBUSUxFX09QQ19TTFRCX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0Yl91LnNuIiwgVElMRVBST19PUENfU0xUQl9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZSIsIFRJTEVfT1BDX1NMVEUsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlIiwgVElMRVBST19PUENfU0xURSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMTEsIDEyLCAxOCB9LCB7IDEzLCAxNCwgMTkgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGUuc24iLCBUSUxFX09QQ19TTFRFX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGUuc24iLCBUSUxFUFJPX09QQ19TTFRFX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZV91IiwgVElMRV9PUENfU0xURV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0ZV91IiwgVElMRVBST19PUENfU0xURV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0ZV91LnNuIiwgVElMRV9PUENfU0xURV9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGVfdS5zbiIsIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGViIiwgVElMRV9PUENfU0xURUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlYiIsIFRJTEVQUk9fT1BDX1NMVEVCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYi5zbiIsIFRJTEVfT1BDX1NMVEVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGViLnNuIiwgVElMRVBST19PUENfU0xURUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYl91IiwgVElMRV9PUENfU0xURUJfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGViX3UiLCBUSUxFUFJPX09QQ19TTFRFQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlYl91LnNuIiwgVElMRV9PUENfU0xURUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRlYl91LnNuIiwgVElMRVBST19PUENfU0xURUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGVoIiwgVElMRV9PUENfU0xURUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRlaCIsIFRJTEVQUk9fT1BDX1NMVEVILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaC5zbiIsIFRJTEVfT1BDX1NMVEVIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGVoLnNuIiwgVElMRVBST19PUENfU0xURUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaF91IiwgVElMRV9PUENfU0xURUhfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGVoX3UiLCBUSUxFUFJPX09QQ19TTFRFSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRlaF91LnNuIiwgVElMRV9PUENfU0xURUhfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRlaF91LnNuIiwgVElMRVBST19PUENfU0xURUhfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGgiLCBUSUxFX09QQ19TTFRILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aCIsIFRJTEVQUk9fT1BDX1NMVEgsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGguc24iLCBUSUxFX09QQ19TTFRIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNsdGguc24iLCBUSUxFUFJPX09QQ19TTFRIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aF91IiwgVElMRV9PUENfU0xUSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aF91IiwgVElMRVBST19PUENfU0xUSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRoX3Uuc24iLCBUSUxFX09QQ19TTFRIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aF91LnNuIiwgVElMRVBST19PUENfU0xUSF9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aSIsIFRJTEVfT1BDX1NMVEksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRpIiwgVElMRVBST19PUENfU0xUSSwgMHhmLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDExLCAxMiwgMiB9LCB7IDEzLCAxNCwgMyB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aS5zbiIsIFRJTEVfT1BDX1NMVElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aS5zbiIsIFRJTEVQUk9fT1BDX1NMVElfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aV91IiwgVElMRV9PUENfU0xUSV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aV91IiwgVElMRVBST19PUENfU0xUSV9VLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMTEsIDEyLCAyIH0sIHsgMTMsIDE0LCAzIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpX3Uuc24iLCBUSUxFX09QQ19TTFRJX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aV91LnNuIiwgVElMRVBST19PUENfU0xUSV9VX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGliIiwgVElMRV9PUENfU0xUSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbHRpYiIsIFRJTEVQUk9fT1BDX1NMVElCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aWIuc24iLCBUSUxFX09QQ19TTFRJQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRpYi5zbiIsIFRJTEVQUk9fT1BDX1NMVElCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGliX3UiLCBUSUxFX09QQ19TTFRJQl9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aWJfdSIsIFRJTEVQUk9fT1BDX1NMVElCX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpYl91LnNuIiwgVElMRV9PUENfU0xUSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzbHRpYl91LnNuIiwgVElMRVBST19PUENfU0xUSUJfVV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpaCIsIFRJTEVfT1BDX1NMVElILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic2x0aWgiLCBUSUxFUFJPX09QQ19TTFRJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDAgfSwgeyA5LCAxMCwgMSB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNsdGloLnNuIiwgVElMRV9PUENfU0xUSUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aWguc24iLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzbHRpaF91IiwgVElMRV9PUENfU0xUSUhfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNsdGloX3UiLCBUSUxFUFJPX09QQ19TTFRJSF9VLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic2x0aWhfdS5zbiIsIFRJTEVfT1BDX1NMVElIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic2x0aWhfdS5zbiIsIFRJTEVQUk9fT1BDX1NMVElIX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMCB9LCB7IDksIDEwLCAxIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25lIiwgVElMRV9PUENfU05FLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic25lIiwgVElMRVBST19PUENfU05FLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25lLnNuIiwgVElMRV9PUENfU05FX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNuZS5zbiIsIFRJTEVQUk9fT1BDX1NORV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNuZWIiLCBUSUxFX09QQ19TTkVCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic25lYiIsIFRJTEVQUk9fT1BDX1NORUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNuZWIuc24iLCBUSUxFX09QQ19TTkVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNuZWIuc24iLCBUSUxFUFJPX09QQ19TTkVCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25laCIsIFRJTEVfT1BDX1NORUgsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzbmVoIiwgVElMRVBST19PUENfU05FSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic25laC5zbiIsIFRJTEVfT1BDX1NORUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic25laC5zbiIsIFRJTEVQUk9fT1BDX1NORUhfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmEiLCBUSUxFX09QQ19TUkEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmEiLCBUSUxFUFJPX09QQ19TUkEsIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDExLCAxMiwgMTggfSwgeyAxMywgMTQsIDE5IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmEuc24iLCBUSUxFX09QQ19TUkFfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3JhLnNuIiwgVElMRVBST19PUENfU1JBX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhYiIsIFRJTEVfT1BDX1NSQUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmFiIiwgVElMRVBST19PUENfU1JBQiwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhYi5zbiIsIFRJTEVfT1BDX1NSQUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3JhYi5zbiIsIFRJTEVQUk9fT1BDX1NSQUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFoIiwgVElMRV9PUENfU1JBSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInNyYWgiLCBUSUxFUFJPX09QQ19TUkFILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFoLnNuIiwgVElMRV9PUENfU1JBSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFoLnNuIiwgVElMRVBST19PUENfU1JBSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNyYWkiLCBUSUxFX09QQ19TUkFJLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3JhaSIsIFRJTEVQUk9fT1BDX1NSQUksIDB4ZiwgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDExLCAxMiwgMzQgfSwgeyAxMywgMTQsIDM1IH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpLnNuIiwgVElMRV9PUENfU1JBSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFpLnNuIiwgVElMRVBST19PUENfU1JBSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAzMiB9LCB7IDksIDEwLCAzMyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInNyYWliIiwgVElMRV9PUENfU1JBSUIsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzcmFpYiIsIFRJTEVQUk9fT1BDX1NSQUlCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpYi5zbiIsIFRJTEVfT1BDX1NSQUlCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInNyYWliLnNuIiwgVElMRVBST19PUENfU1JBSUJfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMzIgfSwgeyA5LCAxMCwgMzMgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzcmFpaCIsIFRJTEVfT1BDX1NSQUlILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3JhaWgiLCBUSUxFUFJPX09QQ19TUkFJSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3JhaWguc24iLCBUSUxFX09QQ19TUkFJSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzcmFpaC5zbiIsIFRJTEVQUk9fT1BDX1NSQUlIX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDMyIH0sIHsgOSwgMTAsIDMzIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViIiwgVElMRV9PUENfU1VCLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ViIiwgVElMRVBST19PUENfU1VCLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViLnNuIiwgVElMRV9PUENfU1VCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1Yi5zbiIsIFRJTEVQUk9fT1BDX1NVQl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmIiLCBUSUxFX09QQ19TVUJCLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ViYiIsIFRJTEVQUk9fT1BDX1NVQkIsIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmIuc24iLCBUSUxFX09QQ19TVUJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1YmIuc24iLCBUSUxFUFJPX09QQ19TVUJCX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViYnNfdSIsIFRJTEVfT1BDX1NVQkJTX1UsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzdWJic191IiwgVElMRVBST19PUENfU1VCQlNfVSwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDcsIDgsIDE2IH0sIHsgOSwgMTAsIDE3IH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3ViYnNfdS5zbiIsIFRJTEVfT1BDX1NVQkJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKKyAgeyAic3ViYnNfdS5zbiIsIFRJTEVQUk9fT1BDX1NVQkJTX1VfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJoIiwgVElMRV9PUENfU1VCSCwgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInN1YmgiLCBUSUxFUFJPX09QQ19TVUJILCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJoLnNuIiwgVElMRV9PUENfU1VCSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzdWJoLnNuIiwgVElMRVBST19PUENfU1VCSF9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN1YmhzIiwgVElMRV9PUENfU1VCSFMsIDB4MywgMywgVFJFR19aRVJPLCAxLAorICB7ICJzdWJocyIsIFRJTEVQUk9fT1BDX1NVQkhTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJocy5zbiIsIFRJTEVfT1BDX1NVQkhTX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInN1YmhzLnNuIiwgVElMRVBST19PUENfU1VCSFNfU04sIDB4MywgMywgVFJFR19TTiwgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJzIiwgVElMRV9PUENfU1VCUywgMHgzLCAzLCBUUkVHX1pFUk8sIDEsCisgIHsgInN1YnMiLCBUSUxFUFJPX09QQ19TVUJTLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzdWJzLnNuIiwgVElMRV9PUENfU1VCU19TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJzdWJzLnNuIiwgVElMRVBST19PUENfU1VCU19TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3IiwgVElMRV9PUENfU1csIDB4MTIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAic3ciLCBUSUxFUFJPX09QQ19TVywgMHgxMiwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAxNSwgMzYgfSB9LAogICB9LAotICB7ICJzd2FkZCIsIFRJTEVfT1BDX1NXQURELCAweDIsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAic3dhZGQiLCBUSUxFUFJPX09QQ19TV0FERCwgMHgyLCAzLCBUUkVHX1pFUk8sIDEsCiAgICAgeyB7IDAsIH0sIHsgMjQsIDE3LCAzNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3aW50MCIsIFRJTEVfT1BDX1NXSU5UMCwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCisgIHsgInN3aW50MCIsIFRJTEVQUk9fT1BDX1NXSU5UMCwgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAic3dpbnQxIiwgVElMRV9PUENfU1dJTlQxLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKKyAgeyAic3dpbnQxIiwgVElMRVBST19PUENfU1dJTlQxLCAweDIsIDAsIFRSRUdfWkVSTywgMCwKICAgICB7IHsgMCwgfSwgeyAgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJzd2ludDIiLCBUSUxFX09QQ19TV0lOVDIsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAorICB7ICJzd2ludDIiLCBUSUxFUFJPX09QQ19TV0lOVDIsIDB4MiwgMCwgVFJFR19aRVJPLCAwLAogICAgIHsgeyAwLCB9LCB7ICB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInN3aW50MyIsIFRJTEVfT1BDX1NXSU5UMywgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCisgIHsgInN3aW50MyIsIFRJTEVQUk9fT1BDX1NXSU5UMywgMHgyLCAwLCBUUkVHX1pFUk8sIDAsCiAgICAgeyB7IDAsIH0sIHsgIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjAiLCBUSUxFX09QQ19UQkxJRFhCMCwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIwIiwgVElMRVBST19PUENfVEJMSURYQjAsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIwLnNuIiwgVElMRV9PUENfVEJMSURYQjBfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjAuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMF9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjEiLCBUSUxFX09QQ19UQkxJRFhCMSwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIxIiwgVElMRVBST19PUENfVEJMSURYQjEsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIxLnNuIiwgVElMRV9PUENfVEJMSURYQjFfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjEuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjIiLCBUSUxFX09QQ19UQkxJRFhCMiwgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIyIiwgVElMRVBST19PUENfVEJMSURYQjIsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIyLnNuIiwgVElMRV9PUENfVEJMSURYQjJfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjIuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCMl9TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidGJsaWR4YjMiLCBUSUxFX09QQ19UQkxJRFhCMywgMHg1LCAyLCBUUkVHX1pFUk8sIDEsCisgIHsgInRibGlkeGIzIiwgVElMRVBST19PUENfVEJMSURYQjMsIDB4NSwgMiwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMzEsIDEyIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRibGlkeGIzLnNuIiwgVElMRV9PUENfVEJMSURYQjNfU04sIDB4MSwgMiwgVFJFR19TTiwgMSwKKyAgeyAidGJsaWR4YjMuc24iLCBUSUxFUFJPX09QQ19UQkxJRFhCM19TTiwgMHgxLCAyLCBUUkVHX1NOLCAxLAogICAgIHsgeyAyMSwgOCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAidG5zIiwgVElMRV9PUENfVE5TLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKKyAgeyAidG5zIiwgVElMRVBST19PUENfVE5TLCAweDIsIDIsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInRucy5zbiIsIFRJTEVfT1BDX1ROU19TTiwgMHgyLCAyLCBUUkVHX1NOLCAxLAorICB7ICJ0bnMuc24iLCBUSUxFUFJPX09QQ19UTlNfU04sIDB4MiwgMiwgVFJFR19TTiwgMSwKICAgICB7IHsgMCwgfSwgeyA5LCAxMCB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgIndoNjQiLCBUSUxFX09QQ19XSDY0LCAweDIsIDEsIFRSRUdfWkVSTywgMSwKKyAgeyAid2g2NCIsIFRJTEVQUk9fT1BDX1dINjQsIDB4MiwgMSwgVFJFR19aRVJPLCAxLAogICAgIHsgeyAwLCB9LCB7IDEwIH0sIHsgMCwgfSwgeyAwLCB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAieG9yIiwgVElMRV9PUENfWE9SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAieG9yIiwgVElMRVBST19PUENfWE9SLCAweGYsIDMsIFRSRUdfWkVSTywgMSwKICAgICB7IHsgNywgOCwgMTYgfSwgeyA5LCAxMCwgMTcgfSwgeyAxMSwgMTIsIDE4IH0sIHsgMTMsIDE0LCAxOSB9LCB7IDAsIH0gfSwKICAgfSwKLSAgeyAieG9yLnNuIiwgVElMRV9PUENfWE9SX1NOLCAweDMsIDMsIFRSRUdfU04sIDEsCisgIHsgInhvci5zbiIsIFRJTEVQUk9fT1BDX1hPUl9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAxNiB9LCB7IDksIDEwLCAxNyB9LCB7IDAsIH0sIHsgMCwgfSwgeyAwLCB9IH0sCiAgIH0sCi0gIHsgInhvcmkiLCBUSUxFX09QQ19YT1JJLCAweDMsIDMsIFRSRUdfWkVSTywgMSwKKyAgeyAieG9yaSIsIFRJTEVQUk9fT1BDX1hPUkksIDB4MywgMywgVFJFR19aRVJPLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7ICJ4b3JpLnNuIiwgVElMRV9PUENfWE9SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAorICB7ICJ4b3JpLnNuIiwgVElMRVBST19PUENfWE9SSV9TTiwgMHgzLCAzLCBUUkVHX1NOLCAxLAogICAgIHsgeyA3LCA4LCAwIH0sIHsgOSwgMTAsIDEgfSwgeyAwLCB9LCB7IDAsIH0sIHsgMCwgfSB9LAogICB9LAotICB7IE5VTEwsIFRJTEVfT1BDX05PTkUsIDAsIDAsIFRSRUdfWkVSTywgMCwgeyB7IDAsIH0gfSwKKyAgeyBOVUxMLCBUSUxFUFJPX09QQ19OT05FLCAwLCAwLCBUUkVHX1pFUk8sIDAsIHsgeyAwLCB9IH0sCiAgIH0KIH07CiAjZGVmaW5lIEJJVEZJRUxEKHN0YXJ0LCBzaXplKSAoKHN0YXJ0KSB8ICgoKDEgPDwgKHNpemUpKSAtIDEpIDw8IDYpKQotI2RlZmluZSBDSElMRChhcnJheV9pbmRleCkgKFRJTEVfT1BDX05PTkUgKyAoYXJyYXlfaW5kZXgpKQorI2RlZmluZSBDSElMRChhcnJheV9pbmRleCkgKFRJTEVQUk9fT1BDX05PTkUgKyAoYXJyYXlfaW5kZXgpKQogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGVjb2RlX1gwX2ZzbVsxMTUzXSA9CiB7CiAgIEJJVEZJRUxEKDIyLCA5KSAvKiBpbmRleCAwICovLAogICBDSElMRCg1MTMpLCBDSElMRCg1MzApLCBDSElMRCg1NDcpLCBDSElMRCg1NjQpLCBDSElMRCg1OTYpLCBDSElMRCg2MTMpLAotICBDSElMRCg2MzApLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBDSElMRCg2NjMpLCBDSElMRCg2ODApLCBDSElMRCg2OTcpLCBDSElMRCg3MTQpLCBDSElMRCg3NDYpLAotICBDSElMRCg3NjMpLCBDSElMRCg3ODApLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAorICBDSElMRCg2MzApLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg2NjMpLCBDSElMRCg2ODApLCBDSElMRCg2OTcpLAorICBDSElMRCg3MTQpLCBDSElMRCg3NDYpLCBDSElMRCg3NjMpLCBDSElMRCg3ODApLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLAogICBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLCBDSElMRCg4MTMpLApAQCAtMTIyNyw3ICsxMjQ3LDcgQEAKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKICAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwKLSAgQ0hJTEQoODEzKSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKKyAgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODEzKSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKICAgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwgQ0hJTEQoODI4KSwKQEAgLTEyMzcsNyArMTI1Nyw4IEBACiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCiAgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCi0gIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDg0MyksCisgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDgyOCksCisgIENISUxEKDgyOCksIENISUxEKDgyOCksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCiAgIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksIENISUxEKDg0MyksCkBAIC0xMjQ4LDMzMyArMTI2OSwzNzEgQEAKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKLSAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODczKSwgQ0hJTEQoODc4KSwgQ0hJTEQoODgzKSwKLSAgQ0hJTEQoOTAzKSwgQ0hJTEQoOTA4KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTEzKSwKLSAgQ0hJTEQoOTE4KSwgQ0hJTEQoOTIzKSwgQ0hJTEQoOTQzKSwgQ0hJTEQoOTQ4KSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTUzKSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTg4KSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIENISUxEKDk5MyksCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDEwNzYpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg4NzMpLCBDSElMRCg4NzgpLCBDSElMRCg4ODMpLCBDSElMRCg5MDMpLCBDSElMRCg5MDgpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5MTMpLAorICBDSElMRCg5MTgpLCBDSElMRCg5MjMpLCBDSElMRCg5NDMpLCBDSElMRCg5NDgpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5NTMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBDSElMRCg5ODgpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgQ0hJTEQoOTkzKSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgQ0hJTEQoMTA3NiksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1MTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FEREIsIFRJTEVfT1BDX0FEREgsIFRJTEVfT1BDX0FERCwKLSAgVElMRV9PUENfQURJRkZCX1UsIFRJTEVfT1BDX0FESUZGSCwgVElMRV9PUENfQU5ELCBUSUxFX09QQ19BVkdCX1UsCi0gIFRJTEVfT1BDX0FWR0gsIFRJTEVfT1BDX0NSQzMyXzMyLCBUSUxFX09QQ19DUkMzMl84LCBUSUxFX09QQ19JTlRIQiwKLSAgVElMRV9PUENfSU5USEgsIFRJTEVfT1BDX0lOVExCLCBUSUxFX09QQ19JTlRMSCwgVElMRV9PUENfTUFYQl9VLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERCLCBUSUxFUFJPX09QQ19BRERILCBUSUxFUFJPX09QQ19BREQsCisgIFRJTEVQUk9fT1BDX0FESUZGQl9VLCBUSUxFUFJPX09QQ19BRElGRkgsIFRJTEVQUk9fT1BDX0FORCwKKyAgVElMRVBST19PUENfQVZHQl9VLCBUSUxFUFJPX09QQ19BVkdILCBUSUxFUFJPX09QQ19DUkMzMl8zMiwKKyAgVElMRVBST19PUENfQ1JDMzJfOCwgVElMRVBST19PUENfSU5USEIsIFRJTEVQUk9fT1BDX0lOVEhILAorICBUSUxFUFJPX09QQ19JTlRMQiwgVElMRVBST19PUENfSU5UTEgsIFRJTEVQUk9fT1BDX01BWEJfVSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDUzMCAqLywKLSAgVElMRV9PUENfTUFYSCwgVElMRV9PUENfTUlOQl9VLCBUSUxFX09QQ19NSU5ILCBUSUxFX09QQ19NTlpCLCBUSUxFX09QQ19NTlpILAotICBUSUxFX09QQ19NTlosIFRJTEVfT1BDX01VTEhIQV9TUywgVElMRV9PUENfTVVMSEhBX1NVLCBUSUxFX09QQ19NVUxISEFfVVUsCi0gIFRJTEVfT1BDX01VTEhIU0FfVVUsIFRJTEVfT1BDX01VTEhIX1NTLCBUSUxFX09QQ19NVUxISF9TVSwKLSAgVElMRV9PUENfTVVMSEhfVVUsIFRJTEVfT1BDX01VTEhMQV9TUywgVElMRV9PUENfTVVMSExBX1NVLAotICBUSUxFX09QQ19NVUxITEFfVVMsCisgIFRJTEVQUk9fT1BDX01BWEgsIFRJTEVQUk9fT1BDX01JTkJfVSwgVElMRVBST19PUENfTUlOSCwgVElMRVBST19PUENfTU5aQiwKKyAgVElMRVBST19PUENfTU5aSCwgVElMRVBST19PUENfTU5aLCBUSUxFUFJPX09QQ19NVUxISEFfU1MsCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TVSwgVElMRVBST19PUENfTVVMSEhBX1VVLCBUSUxFUFJPX09QQ19NVUxISFNBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISF9TUywgVElMRVBST19PUENfTVVMSEhfU1UsIFRJTEVQUk9fT1BDX01VTEhIX1VVLAorICBUSUxFUFJPX09QQ19NVUxITEFfU1MsIFRJTEVQUk9fT1BDX01VTEhMQV9TVSwgVElMRVBST19PUENfTVVMSExBX1VTLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNTQ3ICovLAotICBUSUxFX09QQ19NVUxITEFfVVUsIFRJTEVfT1BDX01VTEhMU0FfVVUsIFRJTEVfT1BDX01VTEhMX1NTLAotICBUSUxFX09QQ19NVUxITF9TVSwgVElMRV9PUENfTVVMSExfVVMsIFRJTEVfT1BDX01VTEhMX1VVLCBUSUxFX09QQ19NVUxMTEFfU1MsCi0gIFRJTEVfT1BDX01VTExMQV9TVSwgVElMRV9PUENfTVVMTExBX1VVLCBUSUxFX09QQ19NVUxMTFNBX1VVLAotICBUSUxFX09QQ19NVUxMTF9TUywgVElMRV9PUENfTVVMTExfU1UsIFRJTEVfT1BDX01VTExMX1VVLCBUSUxFX09QQ19NVk5aLAotICBUSUxFX09QQ19NVlosIFRJTEVfT1BDX01aQiwKKyAgVElMRVBST19PUENfTVVMSExBX1VVLCBUSUxFUFJPX09QQ19NVUxITFNBX1VVLCBUSUxFUFJPX09QQ19NVUxITF9TUywKKyAgVElMRVBST19PUENfTVVMSExfU1UsIFRJTEVQUk9fT1BDX01VTEhMX1VTLCBUSUxFUFJPX09QQ19NVUxITF9VVSwKKyAgVElMRVBST19PUENfTVVMTExBX1NTLCBUSUxFUFJPX09QQ19NVUxMTEFfU1UsIFRJTEVQUk9fT1BDX01VTExMQV9VVSwKKyAgVElMRVBST19PUENfTVVMTExTQV9VVSwgVElMRVBST19PUENfTVVMTExfU1MsIFRJTEVQUk9fT1BDX01VTExMX1NVLAorICBUSUxFUFJPX09QQ19NVUxMTF9VVSwgVElMRVBST19PUENfTVZOWiwgVElMRVBST19PUENfTVZaLCBUSUxFUFJPX09QQ19NWkIsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1NjQgKi8sCi0gIFRJTEVfT1BDX01aSCwgVElMRV9PUENfTVosIFRJTEVfT1BDX05PUiwgQ0hJTEQoNTgxKSwgVElMRV9PUENfUEFDS0hCLAotICBUSUxFX09QQ19QQUNLTEIsIFRJTEVfT1BDX1JMLCBUSUxFX09QQ19TMUEsIFRJTEVfT1BDX1MyQSwgVElMRV9PUENfUzNBLAotICBUSUxFX09QQ19TQURBQl9VLCBUSUxFX09QQ19TQURBSCwgVElMRV9PUENfU0FEQUhfVSwgVElMRV9PUENfU0FEQl9VLAotICBUSUxFX09QQ19TQURILCBUSUxFX09QQ19TQURIX1UsCisgIFRJTEVQUk9fT1BDX01aSCwgVElMRVBST19PUENfTVosIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoNTgxKSwKKyAgVElMRVBST19PUENfUEFDS0hCLCBUSUxFUFJPX09QQ19QQUNLTEIsIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TMUEsCisgIFRJTEVQUk9fT1BDX1MyQSwgVElMRVBST19PUENfUzNBLCBUSUxFUFJPX09QQ19TQURBQl9VLCBUSUxFUFJPX09QQ19TQURBSCwKKyAgVElMRVBST19PUENfU0FEQUhfVSwgVElMRVBST19PUENfU0FEQl9VLCBUSUxFUFJPX09QQ19TQURILAorICBUSUxFUFJPX09QQ19TQURIX1UsCiAgIEJJVEZJRUxEKDEyLCAyKSAvKiBpbmRleCA1ODEgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDU4NiksCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIENISUxEKDU4NiksCiAgIEJJVEZJRUxEKDE0LCAyKSAvKiBpbmRleCA1ODYgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDU5MSksCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIENISUxEKDU5MSksCiAgIEJJVEZJRUxEKDE2LCAyKSAvKiBpbmRleCA1OTEgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX01PVkUsCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX01PVkUsCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA1OTYgKi8sCi0gIFRJTEVfT1BDX1NFUUIsIFRJTEVfT1BDX1NFUUgsIFRJTEVfT1BDX1NFUSwgVElMRV9PUENfU0hMQiwgVElMRV9PUENfU0hMSCwKLSAgVElMRV9PUENfU0hMLCBUSUxFX09QQ19TSFJCLCBUSUxFX09QQ19TSFJILCBUSUxFX09QQ19TSFIsIFRJTEVfT1BDX1NMVEIsCi0gIFRJTEVfT1BDX1NMVEJfVSwgVElMRV9PUENfU0xURUIsIFRJTEVfT1BDX1NMVEVCX1UsIFRJTEVfT1BDX1NMVEVILAotICBUSUxFX09QQ19TTFRFSF9VLCBUSUxFX09QQ19TTFRFLAorICBUSUxFUFJPX09QQ19TRVFCLCBUSUxFUFJPX09QQ19TRVFILCBUSUxFUFJPX09QQ19TRVEsIFRJTEVQUk9fT1BDX1NITEIsCisgIFRJTEVQUk9fT1BDX1NITEgsIFRJTEVQUk9fT1BDX1NITCwgVElMRVBST19PUENfU0hSQiwgVElMRVBST19PUENfU0hSSCwKKyAgVElMRVBST19PUENfU0hSLCBUSUxFUFJPX09QQ19TTFRCLCBUSUxFUFJPX09QQ19TTFRCX1UsIFRJTEVQUk9fT1BDX1NMVEVCLAorICBUSUxFUFJPX09QQ19TTFRFQl9VLCBUSUxFUFJPX09QQ19TTFRFSCwgVElMRVBST19PUENfU0xURUhfVSwKKyAgVElMRVBST19PUENfU0xURSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDYxMyAqLywKLSAgVElMRV9PUENfU0xURV9VLCBUSUxFX09QQ19TTFRILCBUSUxFX09QQ19TTFRIX1UsIFRJTEVfT1BDX1NMVCwKLSAgVElMRV9PUENfU0xUX1UsIFRJTEVfT1BDX1NORUIsIFRJTEVfT1BDX1NORUgsIFRJTEVfT1BDX1NORSwgVElMRV9PUENfU1JBQiwKLSAgVElMRV9PUENfU1JBSCwgVElMRV9PUENfU1JBLCBUSUxFX09QQ19TVUJCLCBUSUxFX09QQ19TVUJILCBUSUxFX09QQ19TVUIsCi0gIFRJTEVfT1BDX1hPUiwgVElMRV9PUENfRFdPUkRfQUxJR04sCisgIFRJTEVQUk9fT1BDX1NMVEVfVSwgVElMRVBST19PUENfU0xUSCwgVElMRVBST19PUENfU0xUSF9VLCBUSUxFUFJPX09QQ19TTFQsCisgIFRJTEVQUk9fT1BDX1NMVF9VLCBUSUxFUFJPX09QQ19TTkVCLCBUSUxFUFJPX09QQ19TTkVILCBUSUxFUFJPX09QQ19TTkUsCisgIFRJTEVQUk9fT1BDX1NSQUIsIFRJTEVQUk9fT1BDX1NSQUgsIFRJTEVQUk9fT1BDX1NSQSwgVElMRVBST19PUENfU1VCQiwKKyAgVElMRVBST19PUENfU1VCSCwgVElMRVBST19PUENfU1VCLCBUSUxFUFJPX09QQ19YT1IsIFRJTEVQUk9fT1BDX0RXT1JEX0FMSUdOLAogICBCSVRGSUVMRCgxOCwgMykgLyogaW5kZXggNjMwICovLAogICBDSElMRCg2MzkpLCBDSElMRCg2NDIpLCBDSElMRCg2NDUpLCBDSElMRCg2NDgpLCBDSElMRCg2NTEpLCBDSElMRCg2NTQpLAogICBDSElMRCg2NTcpLCBDSElMRCg2NjApLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjM5ICovLAotICBUSUxFX09QQ19BRERTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQyICovLAotICBUSUxFX09QQ19TVUJTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQ1ICovLAotICBUSUxFX09QQ19BRERCU19VLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERCU19VLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggNjQ4ICovLAotICBUSUxFX09QQ19BRERIUywgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQURESFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NTEgKi8sCi0gIFRJTEVfT1BDX1NVQkJTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkJTX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NTQgKi8sCi0gIFRJTEVfT1BDX1NVQkhTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDY1NyAqLywKLSAgVElMRV9PUENfUEFDS0hTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQUNLSFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA2NjAgKi8sCi0gIFRJTEVfT1BDX1BBQ0tCU19VLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQUNLQlNfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDY2MyAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfQUREQl9TTiwgVElMRV9PUENfQURESF9TTiwgVElMRV9PUENfQUREX1NOLAotICBUSUxFX09QQ19BRElGRkJfVV9TTiwgVElMRV9PUENfQURJRkZIX1NOLCBUSUxFX09QQ19BTkRfU04sCi0gIFRJTEVfT1BDX0FWR0JfVV9TTiwgVElMRV9PUENfQVZHSF9TTiwgVElMRV9PUENfQ1JDMzJfMzJfU04sCi0gIFRJTEVfT1BDX0NSQzMyXzhfU04sIFRJTEVfT1BDX0lOVEhCX1NOLCBUSUxFX09QQ19JTlRISF9TTiwKLSAgVElMRV9PUENfSU5UTEJfU04sIFRJTEVfT1BDX0lOVExIX1NOLCBUSUxFX09QQ19NQVhCX1VfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FEREJfU04sIFRJTEVQUk9fT1BDX0FEREhfU04sCisgIFRJTEVQUk9fT1BDX0FERF9TTiwgVElMRVBST19PUENfQURJRkZCX1VfU04sIFRJTEVQUk9fT1BDX0FESUZGSF9TTiwKKyAgVElMRVBST19PUENfQU5EX1NOLCBUSUxFUFJPX09QQ19BVkdCX1VfU04sIFRJTEVQUk9fT1BDX0FWR0hfU04sCisgIFRJTEVQUk9fT1BDX0NSQzMyXzMyX1NOLCBUSUxFUFJPX09QQ19DUkMzMl84X1NOLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwKKyAgVElMRVBST19PUENfSU5USEhfU04sIFRJTEVQUk9fT1BDX0lOVExCX1NOLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwKKyAgVElMRVBST19PUENfTUFYQl9VX1NOLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNjgwICovLAotICBUSUxFX09QQ19NQVhIX1NOLCBUSUxFX09QQ19NSU5CX1VfU04sIFRJTEVfT1BDX01JTkhfU04sIFRJTEVfT1BDX01OWkJfU04sCi0gIFRJTEVfT1BDX01OWkhfU04sIFRJTEVfT1BDX01OWl9TTiwgVElMRV9PUENfTVVMSEhBX1NTX1NOLAotICBUSUxFX09QQ19NVUxISEFfU1VfU04sIFRJTEVfT1BDX01VTEhIQV9VVV9TTiwgVElMRV9PUENfTVVMSEhTQV9VVV9TTiwKLSAgVElMRV9PUENfTVVMSEhfU1NfU04sIFRJTEVfT1BDX01VTEhIX1NVX1NOLCBUSUxFX09QQ19NVUxISF9VVV9TTiwKLSAgVElMRV9PUENfTVVMSExBX1NTX1NOLCBUSUxFX09QQ19NVUxITEFfU1VfU04sIFRJTEVfT1BDX01VTEhMQV9VU19TTiwKKyAgVElMRVBST19PUENfTUFYSF9TTiwgVElMRVBST19PUENfTUlOQl9VX1NOLCBUSUxFUFJPX09QQ19NSU5IX1NOLAorICBUSUxFUFJPX09QQ19NTlpCX1NOLCBUSUxFUFJPX09QQ19NTlpIX1NOLCBUSUxFUFJPX09QQ19NTlpfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIQV9TU19TTiwgVElMRVBST19PUENfTVVMSEhBX1NVX1NOLAorICBUSUxFUFJPX09QQ19NVUxISEFfVVVfU04sIFRJTEVQUk9fT1BDX01VTEhIU0FfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhIX1NTX1NOLCBUSUxFUFJPX09QQ19NVUxISF9TVV9TTiwgVElMRVBST19PUENfTVVMSEhfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMQV9TU19TTiwgVElMRVBST19PUENfTVVMSExBX1NVX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVNfU04sCiAgIEJJVEZJRUxEKDE4LCA0KSAvKiBpbmRleCA2OTcgKi8sCi0gIFRJTEVfT1BDX01VTEhMQV9VVV9TTiwgVElMRV9PUENfTVVMSExTQV9VVV9TTiwgVElMRV9PUENfTVVMSExfU1NfU04sCi0gIFRJTEVfT1BDX01VTEhMX1NVX1NOLCBUSUxFX09QQ19NVUxITF9VU19TTiwgVElMRV9PUENfTVVMSExfVVVfU04sCi0gIFRJTEVfT1BDX01VTExMQV9TU19TTiwgVElMRV9PUENfTVVMTExBX1NVX1NOLCBUSUxFX09QQ19NVUxMTEFfVVVfU04sCi0gIFRJTEVfT1BDX01VTExMU0FfVVVfU04sIFRJTEVfT1BDX01VTExMX1NTX1NOLCBUSUxFX09QQ19NVUxMTF9TVV9TTiwKLSAgVElMRV9PUENfTVVMTExfVVVfU04sIFRJTEVfT1BDX01WTlpfU04sIFRJTEVfT1BDX01WWl9TTiwgVElMRV9PUENfTVpCX1NOLAorICBUSUxFUFJPX09QQ19NVUxITEFfVVVfU04sIFRJTEVQUk9fT1BDX01VTEhMU0FfVVVfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1NTX1NOLCBUSUxFUFJPX09QQ19NVUxITF9TVV9TTiwgVElMRVBST19PUENfTVVMSExfVVNfU04sCisgIFRJTEVQUk9fT1BDX01VTEhMX1VVX1NOLCBUSUxFUFJPX09QQ19NVUxMTEFfU1NfU04sIFRJTEVQUk9fT1BDX01VTExMQV9TVV9TTiwKKyAgVElMRVBST19PUENfTVVMTExBX1VVX1NOLCBUSUxFUFJPX09QQ19NVUxMTFNBX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVUxMTF9TU19TTiwgVElMRVBST19PUENfTVVMTExfU1VfU04sIFRJTEVQUk9fT1BDX01VTExMX1VVX1NOLAorICBUSUxFUFJPX09QQ19NVk5aX1NOLCBUSUxFUFJPX09QQ19NVlpfU04sIFRJTEVQUk9fT1BDX01aQl9TTiwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDcxNCAqLywKLSAgVElMRV9PUENfTVpIX1NOLCBUSUxFX09QQ19NWl9TTiwgVElMRV9PUENfTk9SX1NOLCBDSElMRCg3MzEpLAotICBUSUxFX09QQ19QQUNLSEJfU04sIFRJTEVfT1BDX1BBQ0tMQl9TTiwgVElMRV9PUENfUkxfU04sIFRJTEVfT1BDX1MxQV9TTiwKLSAgVElMRV9PUENfUzJBX1NOLCBUSUxFX09QQ19TM0FfU04sIFRJTEVfT1BDX1NBREFCX1VfU04sIFRJTEVfT1BDX1NBREFIX1NOLAotICBUSUxFX09QQ19TQURBSF9VX1NOLCBUSUxFX09QQ19TQURCX1VfU04sIFRJTEVfT1BDX1NBREhfU04sCi0gIFRJTEVfT1BDX1NBREhfVV9TTiwKKyAgVElMRVBST19PUENfTVpIX1NOLCBUSUxFUFJPX09QQ19NWl9TTiwgVElMRVBST19PUENfTk9SX1NOLCBDSElMRCg3MzEpLAorICBUSUxFUFJPX09QQ19QQUNLSEJfU04sIFRJTEVQUk9fT1BDX1BBQ0tMQl9TTiwgVElMRVBST19PUENfUkxfU04sCisgIFRJTEVQUk9fT1BDX1MxQV9TTiwgVElMRVBST19PUENfUzJBX1NOLCBUSUxFUFJPX09QQ19TM0FfU04sCisgIFRJTEVQUk9fT1BDX1NBREFCX1VfU04sIFRJTEVQUk9fT1BDX1NBREFIX1NOLCBUSUxFUFJPX09QQ19TQURBSF9VX1NOLAorICBUSUxFUFJPX09QQ19TQURCX1VfU04sIFRJTEVQUk9fT1BDX1NBREhfU04sIFRJTEVQUk9fT1BDX1NBREhfVV9TTiwKICAgQklURklFTEQoMTIsIDIpIC8qIGluZGV4IDczMSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNzM2KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNzM2KSwKICAgQklURklFTEQoMTQsIDIpIC8qIGluZGV4IDczNiAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNzQxKSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNzQxKSwKICAgQklURklFTEQoMTYsIDIpIC8qIGluZGV4IDc0MSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgVElMRV9PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKICAgQklURklFTEQoMTgsIDQpIC8qIGluZGV4IDc0NiAqLywKLSAgVElMRV9PUENfU0VRQl9TTiwgVElMRV9PUENfU0VRSF9TTiwgVElMRV9PUENfU0VRX1NOLCBUSUxFX09QQ19TSExCX1NOLAotICBUSUxFX09QQ19TSExIX1NOLCBUSUxFX09QQ19TSExfU04sIFRJTEVfT1BDX1NIUkJfU04sIFRJTEVfT1BDX1NIUkhfU04sCi0gIFRJTEVfT1BDX1NIUl9TTiwgVElMRV9PUENfU0xUQl9TTiwgVElMRV9PUENfU0xUQl9VX1NOLCBUSUxFX09QQ19TTFRFQl9TTiwKLSAgVElMRV9PUENfU0xURUJfVV9TTiwgVElMRV9PUENfU0xURUhfU04sIFRJTEVfT1BDX1NMVEVIX1VfU04sCi0gIFRJTEVfT1BDX1NMVEVfU04sCisgIFRJTEVQUk9fT1BDX1NFUUJfU04sIFRJTEVQUk9fT1BDX1NFUUhfU04sIFRJTEVQUk9fT1BDX1NFUV9TTiwKKyAgVElMRVBST19PUENfU0hMQl9TTiwgVElMRVBST19PUENfU0hMSF9TTiwgVElMRVBST19PUENfU0hMX1NOLAorICBUSUxFUFJPX09QQ19TSFJCX1NOLCBUSUxFUFJPX09QQ19TSFJIX1NOLCBUSUxFUFJPX09QQ19TSFJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEJfU04sIFRJTEVQUk9fT1BDX1NMVEJfVV9TTiwgVElMRVBST19PUENfU0xURUJfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVCX1VfU04sIFRJTEVQUk9fT1BDX1NMVEVIX1NOLCBUSUxFUFJPX09QQ19TTFRFSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRFX1NOLAogICBCSVRGSUVMRCgxOCwgNCkgLyogaW5kZXggNzYzICovLAotICBUSUxFX09QQ19TTFRFX1VfU04sIFRJTEVfT1BDX1NMVEhfU04sIFRJTEVfT1BDX1NMVEhfVV9TTiwgVElMRV9PUENfU0xUX1NOLAotICBUSUxFX09QQ19TTFRfVV9TTiwgVElMRV9PUENfU05FQl9TTiwgVElMRV9PUENfU05FSF9TTiwgVElMRV9PUENfU05FX1NOLAotICBUSUxFX09QQ19TUkFCX1NOLCBUSUxFX09QQ19TUkFIX1NOLCBUSUxFX09QQ19TUkFfU04sIFRJTEVfT1BDX1NVQkJfU04sCi0gIFRJTEVfT1BDX1NVQkhfU04sIFRJTEVfT1BDX1NVQl9TTiwgVElMRV9PUENfWE9SX1NOLCBUSUxFX09QQ19EV09SRF9BTElHTl9TTiwKKyAgVElMRVBST19PUENfU0xURV9VX1NOLCBUSUxFUFJPX09QQ19TTFRIX1NOLCBUSUxFUFJPX09QQ19TTFRIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVF9TTiwgVElMRVBST19PUENfU0xUX1VfU04sIFRJTEVQUk9fT1BDX1NORUJfU04sCisgIFRJTEVQUk9fT1BDX1NORUhfU04sIFRJTEVQUk9fT1BDX1NORV9TTiwgVElMRVBST19PUENfU1JBQl9TTiwKKyAgVElMRVBST19PUENfU1JBSF9TTiwgVElMRVBST19PUENfU1JBX1NOLCBUSUxFUFJPX09QQ19TVUJCX1NOLAorICBUSUxFUFJPX09QQ19TVUJIX1NOLCBUSUxFUFJPX09QQ19TVUJfU04sIFRJTEVQUk9fT1BDX1hPUl9TTiwKKyAgVElMRVBST19PUENfRFdPUkRfQUxJR05fU04sCiAgIEJJVEZJRUxEKDE4LCAzKSAvKiBpbmRleCA3ODAgKi8sCiAgIENISUxEKDc4OSksIENISUxEKDc5MiksIENISUxEKDc5NSksIENISUxEKDc5OCksIENISUxEKDgwMSksIENISUxEKDgwNCksCiAgIENISUxEKDgwNyksIENISUxEKDgxMCksCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3ODkgKi8sCi0gIFRJTEVfT1BDX0FERFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FERFNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTIgKi8sCi0gIFRJTEVfT1BDX1NVQlNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQlNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTUgKi8sCi0gIFRJTEVfT1BDX0FEREJTX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREJTX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIxLCAxKSAvKiBpbmRleCA3OTggKi8sCi0gIFRJTEVfT1BDX0FEREhTX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERIU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgwMSAqLywKLSAgVElMRV9PUENfU1VCQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCQlNfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgwNCAqLywKLSAgVElMRV9PUENfU1VCSFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkhTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMSwgMSkgLyogaW5kZXggODA3ICovLAotICBUSUxFX09QQ19QQUNLSFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tIU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMjEsIDEpIC8qIGluZGV4IDgxMCAqLywKLSAgVElMRV9PUENfUEFDS0JTX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg2LCAyKSAvKiBpbmRleCA4MTMgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDgxOCksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDgxOCksCiAgIEJJVEZJRUxEKDgsIDIpIC8qIGluZGV4IDgxOCAqLywKLSAgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgQ0hJTEQoODIzKSwKKyAgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwKKyAgQ0hJTEQoODIzKSwKICAgQklURklFTEQoMTAsIDIpIC8qIGluZGV4IDgyMyAqLywKLSAgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfTU9WRUxJX1NOLAorICBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLAorICBUSUxFUFJPX09QQ19NT1ZFTElfU04sCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDgyOCAqLywKLSAgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19BRERMSSwgQ0hJTEQoODMzKSwKKyAgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgQ0hJTEQoODMzKSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggODMzICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg4MzgpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg4MzgpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggODM4ICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX01PVkVMSSwKICAgQklURklFTEQoMCwgMikgLyogaW5kZXggODQzICovLAotICBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBDSElMRCg4NDgpLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBDSElMRCg4NDgpLAogICBCSVRGSUVMRCgyLCAyKSAvKiBpbmRleCA4NDggKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIENISUxEKDg1MyksCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIENISUxEKDg1MyksCiAgIEJJVEZJRUxEKDQsIDIpIC8qIGluZGV4IDg1MyAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODU4KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODU4KSwKICAgQklURklFTEQoNiwgMikgLyogaW5kZXggODU4ICovLAotICBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBUSUxFX09QQ19BVUxJLCBDSElMRCg4NjMpLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBDSElMRCg4NjMpLAogICBCSVRGSUVMRCg4LCAyKSAvKiBpbmRleCA4NjMgKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIENISUxEKDg2OCksCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIENISUxEKDg2OCksCiAgIEJJVEZJRUxEKDEwLCAyKSAvKiBpbmRleCA4NjggKi8sCi0gIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0FVTEksIFRJTEVfT1BDX0lORk9MLAorICBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19BVUxJLCBUSUxFUFJPX09QQ19JTkZPTCwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDg3MyAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfQURESUIsIFRJTEVfT1BDX0FERElILCBUSUxFX09QQ19BRERJLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERJQiwgVElMRVBST19PUENfQURESUgsIFRJTEVQUk9fT1BDX0FEREksCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA4NzggKi8sCi0gIFRJTEVfT1BDX01BWElCX1UsIFRJTEVfT1BDX01BWElILCBUSUxFX09QQ19NSU5JQl9VLCBUSUxFX09QQ19NSU5JSCwKKyAgVElMRVBST19PUENfTUFYSUJfVSwgVElMRVBST19PUENfTUFYSUgsIFRJTEVQUk9fT1BDX01JTklCX1UsCisgIFRJTEVQUk9fT1BDX01JTklILAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggODgzICovLAotICBDSElMRCg4ODgpLCBUSUxFX09QQ19TRVFJQiwgVElMRV9PUENfU0VRSUgsIFRJTEVfT1BDX1NFUUksCisgIENISUxEKDg4OCksIFRJTEVQUk9fT1BDX1NFUUlCLCBUSUxFUFJPX09QQ19TRVFJSCwgVElMRVBST19PUENfU0VRSSwKICAgQklURklFTEQoNiwgMikgLyogaW5kZXggODg4ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCg4OTMpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCg4OTMpLAogICBCSVRGSUVMRCg4LCAyKSAvKiBpbmRleCA4OTMgKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDg5OCksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDg5OCksCiAgIEJJVEZJRUxEKDEwLCAyKSAvKiBpbmRleCA4OTggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX01PVkVJLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19NT1ZFSSwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkwMyAqLywKLSAgVElMRV9PUENfU0xUSUIsIFRJTEVfT1BDX1NMVElCX1UsIFRJTEVfT1BDX1NMVElILCBUSUxFX09QQ19TTFRJSF9VLAorICBUSUxFUFJPX09QQ19TTFRJQiwgVElMRVBST19PUENfU0xUSUJfVSwgVElMRVBST19PUENfU0xUSUgsCisgIFRJTEVQUk9fT1BDX1NMVElIX1UsCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5MDggKi8sCi0gIFRJTEVfT1BDX1NMVEksIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0xUSSwgVElMRVBST19PUENfU0xUSV9VLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTEzICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERJQl9TTiwgVElMRV9PUENfQURESUhfU04sIFRJTEVfT1BDX0FERElfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FERElCX1NOLCBUSUxFUFJPX09QQ19BRERJSF9TTiwKKyAgVElMRVBST19PUENfQURESV9TTiwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkxOCAqLywKLSAgVElMRV9PUENfTUFYSUJfVV9TTiwgVElMRV9PUENfTUFYSUhfU04sIFRJTEVfT1BDX01JTklCX1VfU04sCi0gIFRJTEVfT1BDX01JTklIX1NOLAorICBUSUxFUFJPX09QQ19NQVhJQl9VX1NOLCBUSUxFUFJPX09QQ19NQVhJSF9TTiwgVElMRVBST19PUENfTUlOSUJfVV9TTiwKKyAgVElMRVBST19PUENfTUlOSUhfU04sCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5MjMgKi8sCi0gIENISUxEKDkyOCksIFRJTEVfT1BDX1NFUUlCX1NOLCBUSUxFX09QQ19TRVFJSF9TTiwgVElMRV9PUENfU0VRSV9TTiwKKyAgQ0hJTEQoOTI4KSwgVElMRVBST19PUENfU0VRSUJfU04sIFRJTEVQUk9fT1BDX1NFUUlIX1NOLCBUSUxFUFJPX09QQ19TRVFJX1NOLAogICBCSVRGSUVMRCg2LCAyKSAvKiBpbmRleCA5MjggKi8sCi0gIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIENISUxEKDkzMyksCisgIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIENISUxEKDkzMyksCiAgIEJJVEZJRUxEKDgsIDIpIC8qIGluZGV4IDkzMyAqLywKLSAgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgQ0hJTEQoOTM4KSwKKyAgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgQ0hJTEQoOTM4KSwKICAgQklURklFTEQoMTAsIDIpIC8qIGluZGV4IDkzOCAqLywKLSAgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfTU9WRUlfU04sCisgIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sCisgIFRJTEVQUk9fT1BDX01PVkVJX1NOLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTQzICovLAotICBUSUxFX09QQ19TTFRJQl9TTiwgVElMRV9PUENfU0xUSUJfVV9TTiwgVElMRV9PUENfU0xUSUhfU04sCi0gIFRJTEVfT1BDX1NMVElIX1VfU04sCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLCBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwKKyAgVElMRVBST19PUENfU0xUSUhfVV9TTiwKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDk0OCAqLywKLSAgVElMRV9PUENfU0xUSV9TTiwgVElMRV9PUENfU0xUSV9VX1NOLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TTFRJX1NOLCBUSUxFUFJPX09QQ19TTFRJX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDIwLCAyKSAvKiBpbmRleCA5NTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDk1OCksIFRJTEVfT1BDX1hPUkksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDk1OCksIFRJTEVQUk9fT1BDX1hPUkksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDAsIDIpIC8qIGluZGV4IDk1OCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoOTYzKSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTYzKSwKICAgQklURklFTEQoMiwgMikgLyogaW5kZXggOTYzICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5NjgpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg5NjgpLAogICBCSVRGSUVMRCg0LCAyKSAvKiBpbmRleCA5NjggKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDk3MyksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDk3MyksCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDk3MyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoOTc4KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTc4KSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggOTc4ICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5ODMpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg5ODMpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggOTgzICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19JTkZPLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19JTkZPLAogICBCSVRGSUVMRCgyMCwgMikgLyogaW5kZXggOTg4ICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BTkRJX1NOLCBUSUxFX09QQ19YT1JJX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BTkRJX1NOLCBUSUxFUFJPX09QQ19YT1JJX1NOLAorICBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNywgNSkgLyogaW5kZXggOTkzICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19STEksIFRJTEVfT1BDX1NITElCLCBUSUxFX09QQ19TSExJSCwgVElMRV9PUENfU0hMSSwKLSAgVElMRV9PUENfU0hSSUIsIFRJTEVfT1BDX1NIUklILCBUSUxFX09QQ19TSFJJLCBUSUxFX09QQ19TUkFJQiwKLSAgVElMRV9PUENfU1JBSUgsIFRJTEVfT1BDX1NSQUksIENISUxEKDEwMjYpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19STEksIFRJTEVQUk9fT1BDX1NITElCLCBUSUxFUFJPX09QQ19TSExJSCwKKyAgVElMRVBST19PUENfU0hMSSwgVElMRVBST19PUENfU0hSSUIsIFRJTEVQUk9fT1BDX1NIUklILCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJQiwgVElMRVBST19PUENfU1JBSUgsIFRJTEVQUk9fT1BDX1NSQUksIENISUxEKDEwMjYpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxMiwgNCkgLyogaW5kZXggMTAyNiAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTA0MyksIENISUxEKDEwNDYpLCBDSElMRCgxMDQ5KSwgQ0hJTEQoMTA1MiksCisgIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDEwNDMpLCBDSElMRCgxMDQ2KSwgQ0hJTEQoMTA0OSksIENISUxEKDEwNTIpLAogICBDSElMRCgxMDU1KSwgQ0hJTEQoMTA1OCksIENISUxEKDEwNjEpLCBDSElMRCgxMDY0KSwgQ0hJTEQoMTA2NyksCi0gIENISUxEKDEwNzApLCBDSElMRCgxMDczKSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTA3MCksIENISUxEKDEwNzMpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA0MyAqLywKLSAgVElMRV9PUENfQklUWCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQklUWCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDEwNDYgKi8sCi0gIFRJTEVfT1BDX0JZVEVYLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19CWVRFWCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDEwNDkgKi8sCi0gIFRJTEVfT1BDX0NMWiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQ0xaLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA1MiAqLywKLSAgVElMRV9PUENfQ1RaLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19DVFosIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMDU1ICovLAotICBUSUxFX09QQ19GTk9QLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA1OCAqLywKLSAgVElMRV9PUENfTk9QLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMDYxICovLAotICBUSUxFX09QQ19QQ05ULCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19QQ05ULCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA2NCAqLywKLSAgVElMRV9PUENfVEJMSURYQjAsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIwLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA2NyAqLywKLSAgVElMRV9PUENfVEJMSURYQjEsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIxLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA3MCAqLywKLSAgVElMRV9PUENfVEJMSURYQjIsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIyLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTA3MyAqLywKLSAgVElMRV9PUENfVEJMSURYQjMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1RCTElEWEIzLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNywgNSkgLyogaW5kZXggMTA3NiAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfUkxJX1NOLCBUSUxFX09QQ19TSExJQl9TTiwgVElMRV9PUENfU0hMSUhfU04sCi0gIFRJTEVfT1BDX1NITElfU04sIFRJTEVfT1BDX1NIUklCX1NOLCBUSUxFX09QQ19TSFJJSF9TTiwgVElMRV9PUENfU0hSSV9TTiwKLSAgVElMRV9PUENfU1JBSUJfU04sIFRJTEVfT1BDX1NSQUlIX1NOLCBUSUxFX09QQ19TUkFJX1NOLCBDSElMRCgxMTA5KSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfUkxJX1NOLCBUSUxFUFJPX09QQ19TSExJQl9TTiwKKyAgVElMRVBST19PUENfU0hMSUhfU04sIFRJTEVQUk9fT1BDX1NITElfU04sIFRJTEVQUk9fT1BDX1NIUklCX1NOLAorICBUSUxFUFJPX09QQ19TSFJJSF9TTiwgVElMRVBST19PUENfU0hSSV9TTiwgVElMRVBST19PUENfU1JBSUJfU04sCisgIFRJTEVQUk9fT1BDX1NSQUlIX1NOLCBUSUxFUFJPX09QQ19TUkFJX1NOLCBDSElMRCgxMTA5KSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTIsIDQpIC8qIGluZGV4IDExMDkgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDExMjYpLCBDSElMRCgxMTI5KSwgQ0hJTEQoMTEzMiksIENISUxEKDExMzUpLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMTI2KSwgQ0hJTEQoMTEyOSksIENISUxEKDExMzIpLCBDSElMRCgxMTM1KSwKICAgQ0hJTEQoMTA1NSksIENISUxEKDEwNTgpLCBDSElMRCgxMTM4KSwgQ0hJTEQoMTE0MSksIENISUxEKDExNDQpLAotICBDSElMRCgxMTQ3KSwgQ0hJTEQoMTE1MCksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDExNDcpLCBDSElMRCgxMTUwKSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExMjYgKi8sCi0gIFRJTEVfT1BDX0JJVFhfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0JJVFhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMTI5ICovLAotICBUSUxFX09QQ19CWVRFWF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQllURVhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDE2LCAxKSAvKiBpbmRleCAxMTMyICovLAotICBUSUxFX09QQ19DTFpfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0NMWl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExMzUgKi8sCi0gIFRJTEVfT1BDX0NUWl9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQ1RaX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxNiwgMSkgLyogaW5kZXggMTEzOCAqLywKLSAgVElMRV9PUENfUENOVF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUENOVF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDEgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIwX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDQgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIxX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNDcgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIyX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMTYsIDEpIC8qIGluZGV4IDExNTAgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIzX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCM19TTiwgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWDFfZnNtWzE1NDBdID0KIHsKICAgQklURklFTEQoNTQsIDkpIC8qIGluZGV4IDAgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDUxMyksIENISUxEKDU2MSksIENISUxEKDU5NCksCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDY0MSksIENISUxEKDY4OSksCi0gIENISUxEKDcyMiksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIENISUxEKDc2NiksCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIENISUxEKDUxMyksIENISUxEKDU2MSksIENISUxEKDU5NCksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDY0MSksCisgIENISUxEKDY4OSksIENISUxEKDcyMiksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCiAgIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksIENISUxEKDc2NiksCkBAIC0xNTk2LDU5NCArMTY1NSw2NDEgQEAKICAgQ0hJTEQoODI2KSwgQ0hJTEQoODI2KSwgQ0hJTEQoODI2KSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKICAgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwgQ0hJTEQoODQzKSwKLSAgQ0hJTEQoODQzKSwgQ0hJTEQoODYwKSwgQ0hJTEQoODk5KSwgQ0hJTEQoOTIzKSwgQ0hJTEQoOTMyKSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoOTQxKSwgQ0hJTEQoOTUwKSwgQ0hJTEQoOTc0KSwgQ0hJTEQoOTgzKSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwKLSAgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLAotICBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sCi0gIFRJTEVfT1BDX01NLCBUSUxFX09QQ19NTSwgVElMRV9PUENfTU0sIFRJTEVfT1BDX01NLCBDSElMRCg5OTIpLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBDSElMRCgxMzM0KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSiwKLSAgVElMRV9PUENfSiwgVElMRV9PUENfSiwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsCi0gIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLAotICBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwgVElMRV9PUENfSkFMLCBUSUxFX09QQ19KQUwsIFRJTEVfT1BDX0pBTCwKLSAgVElMRV9PUENfSkFMLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg4NDMpLCBDSElMRCg4NjApLCBDSElMRCg4OTkpLCBDSElMRCg5MjMpLCBDSElMRCg5MzIpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBDSElMRCg5NDEpLCBDSElMRCg5NTApLCBDSElMRCg5NzQpLCBDSElMRCg5ODMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLAorICBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwKKyAgVElMRVBST19PUENfTU0sIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sCisgIFRJTEVQUk9fT1BDX01NLCBUSUxFUFJPX09QQ19NTSwgVElMRVBST19PUENfTU0sIENISUxEKDk5MiksCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIENISUxEKDEzMzQpLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLAorICBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwKKyAgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLAorICBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsCisgIFRJTEVQUk9fT1BDX0pBTCwgVElMRVBST19PUENfSkFMLCBUSUxFUFJPX09QQ19KQUwsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ5LCA1KSAvKiBpbmRleCA1MTMgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FEREIsIFRJTEVfT1BDX0FEREgsIFRJTEVfT1BDX0FERCwgVElMRV9PUENfQU5ELAotICBUSUxFX09QQ19JTlRIQiwgVElMRV9PUENfSU5USEgsIFRJTEVfT1BDX0lOVExCLCBUSUxFX09QQ19JTlRMSCwKLSAgVElMRV9PUENfSkFMUlAsIFRJTEVfT1BDX0pBTFIsIFRJTEVfT1BDX0pSUCwgVElMRV9PUENfSlIsIFRJTEVfT1BDX0xOSywKLSAgVElMRV9PUENfTUFYQl9VLCBUSUxFX09QQ19NQVhILCBUSUxFX09QQ19NSU5CX1UsIFRJTEVfT1BDX01JTkgsCi0gIFRJTEVfT1BDX01OWkIsIFRJTEVfT1BDX01OWkgsIFRJTEVfT1BDX01OWiwgVElMRV9PUENfTVpCLCBUSUxFX09QQ19NWkgsCi0gIFRJTEVfT1BDX01aLCBUSUxFX09QQ19OT1IsIENISUxEKDU0NiksIFRJTEVfT1BDX1BBQ0tIQiwgVElMRV9PUENfUEFDS0xCLAotICBUSUxFX09QQ19STCwgVElMRV9PUENfUzFBLCBUSUxFX09QQ19TMkEsIFRJTEVfT1BDX1MzQSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQUREQiwgVElMRVBST19PUENfQURESCwgVElMRVBST19PUENfQURELAorICBUSUxFUFJPX09QQ19BTkQsIFRJTEVQUk9fT1BDX0lOVEhCLCBUSUxFUFJPX09QQ19JTlRISCwgVElMRVBST19PUENfSU5UTEIsCisgIFRJTEVQUk9fT1BDX0lOVExILCBUSUxFUFJPX09QQ19KQUxSUCwgVElMRVBST19PUENfSkFMUiwgVElMRVBST19PUENfSlJQLAorICBUSUxFUFJPX09QQ19KUiwgVElMRVBST19PUENfTE5LLCBUSUxFUFJPX09QQ19NQVhCX1UsIFRJTEVQUk9fT1BDX01BWEgsCisgIFRJTEVQUk9fT1BDX01JTkJfVSwgVElMRVBST19PUENfTUlOSCwgVElMRVBST19PUENfTU5aQiwgVElMRVBST19PUENfTU5aSCwKKyAgVElMRVBST19PUENfTU5aLCBUSUxFUFJPX09QQ19NWkIsIFRJTEVQUk9fT1BDX01aSCwgVElMRVBST19PUENfTVosCisgIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoNTQ2KSwgVElMRVBST19PUENfUEFDS0hCLCBUSUxFUFJPX09QQ19QQUNLTEIsCisgIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TMUEsIFRJTEVQUk9fT1BDX1MyQSwgVElMRVBST19PUENfUzNBLAogICBCSVRGSUVMRCg0MywgMikgLyogaW5kZXggNTQ2ICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBDSElMRCg1NTEpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg1NTEpLAogICBCSVRGSUVMRCg0NSwgMikgLyogaW5kZXggNTUxICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBDSElMRCg1NTYpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg1NTYpLAogICBCSVRGSUVMRCg0NywgMikgLyogaW5kZXggNTU2ICovLAotICBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19NT1ZFLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19NT1ZFLAogICBCSVRGSUVMRCg0OSwgNSkgLyogaW5kZXggNTYxICovLAotICBUSUxFX09QQ19TQiwgVElMRV9PUENfU0VRQiwgVElMRV9PUENfU0VRSCwgVElMRV9PUENfU0VRLCBUSUxFX09QQ19TSExCLAotICBUSUxFX09QQ19TSExILCBUSUxFX09QQ19TSEwsIFRJTEVfT1BDX1NIUkIsIFRJTEVfT1BDX1NIUkgsIFRJTEVfT1BDX1NIUiwKLSAgVElMRV9PUENfU0gsIFRJTEVfT1BDX1NMVEIsIFRJTEVfT1BDX1NMVEJfVSwgVElMRV9PUENfU0xURUIsCi0gIFRJTEVfT1BDX1NMVEVCX1UsIFRJTEVfT1BDX1NMVEVILCBUSUxFX09QQ19TTFRFSF9VLCBUSUxFX09QQ19TTFRFLAotICBUSUxFX09QQ19TTFRFX1UsIFRJTEVfT1BDX1NMVEgsIFRJTEVfT1BDX1NMVEhfVSwgVElMRV9PUENfU0xULAotICBUSUxFX09QQ19TTFRfVSwgVElMRV9PUENfU05FQiwgVElMRV9PUENfU05FSCwgVElMRV9PUENfU05FLCBUSUxFX09QQ19TUkFCLAotICBUSUxFX09QQ19TUkFILCBUSUxFX09QQ19TUkEsIFRJTEVfT1BDX1NVQkIsIFRJTEVfT1BDX1NVQkgsIFRJTEVfT1BDX1NVQiwKKyAgVElMRVBST19PUENfU0IsIFRJTEVQUk9fT1BDX1NFUUIsIFRJTEVQUk9fT1BDX1NFUUgsIFRJTEVQUk9fT1BDX1NFUSwKKyAgVElMRVBST19PUENfU0hMQiwgVElMRVBST19PUENfU0hMSCwgVElMRVBST19PUENfU0hMLCBUSUxFUFJPX09QQ19TSFJCLAorICBUSUxFUFJPX09QQ19TSFJILCBUSUxFUFJPX09QQ19TSFIsIFRJTEVQUk9fT1BDX1NILCBUSUxFUFJPX09QQ19TTFRCLAorICBUSUxFUFJPX09QQ19TTFRCX1UsIFRJTEVQUk9fT1BDX1NMVEVCLCBUSUxFUFJPX09QQ19TTFRFQl9VLAorICBUSUxFUFJPX09QQ19TTFRFSCwgVElMRVBST19PUENfU0xURUhfVSwgVElMRVBST19PUENfU0xURSwKKyAgVElMRVBST19PUENfU0xURV9VLCBUSUxFUFJPX09QQ19TTFRILCBUSUxFUFJPX09QQ19TTFRIX1UsIFRJTEVQUk9fT1BDX1NMVCwKKyAgVElMRVBST19PUENfU0xUX1UsIFRJTEVQUk9fT1BDX1NORUIsIFRJTEVQUk9fT1BDX1NORUgsIFRJTEVQUk9fT1BDX1NORSwKKyAgVElMRVBST19PUENfU1JBQiwgVElMRVBST19PUENfU1JBSCwgVElMRVBST19PUENfU1JBLCBUSUxFUFJPX09QQ19TVUJCLAorICBUSUxFUFJPX09QQ19TVUJILCBUSUxFUFJPX09QQ19TVUIsCiAgIEJJVEZJRUxEKDQ5LCA0KSAvKiBpbmRleCA1OTQgKi8sCiAgIENISUxEKDYxMSksIENISUxEKDYxNCksIENISUxEKDYxNyksIENISUxEKDYyMCksIENISUxEKDYyMyksIENISUxEKDYyNiksCi0gIENISUxEKDYyOSksIENISUxEKDYzMiksIENISUxEKDYzNSksIENISUxEKDYzOCksIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDYyOSksIENISUxEKDYzMiksIENISUxEKDYzNSksIENISUxEKDYzOCksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MTEgKi8sCi0gIFRJTEVfT1BDX1NXLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYxNCAqLywKLSAgVElMRV9PUENfWE9SLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19YT1IsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MTcgKi8sCi0gIFRJTEVfT1BDX0FERFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FERFMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjAgKi8sCi0gIFRJTEVfT1BDX1NVQlMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQlMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjMgKi8sCi0gIFRJTEVfT1BDX0FEREJTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREJTX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA2MjYgKi8sCi0gIFRJTEVfT1BDX0FEREhTLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19BRERIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYyOSAqLywKLSAgVElMRV9PUENfU1VCQlNfVSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCQlNfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYzMiAqLywKLSAgVElMRV9PUENfU1VCSFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NVQkhTLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNjM1ICovLAotICBUSUxFX09QQ19QQUNLSFMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tIUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDYzOCAqLywKLSAgVElMRV9PUENfUEFDS0JTX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1BBQ0tCU19VLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0OSwgNSkgLyogaW5kZXggNjQxICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERCX1NOLCBUSUxFX09QQ19BRERIX1NOLCBUSUxFX09QQ19BRERfU04sCi0gIFRJTEVfT1BDX0FORF9TTiwgVElMRV9PUENfSU5USEJfU04sIFRJTEVfT1BDX0lOVEhIX1NOLCBUSUxFX09QQ19JTlRMQl9TTiwKLSAgVElMRV9PUENfSU5UTEhfU04sIFRJTEVfT1BDX0pBTFJQLCBUSUxFX09QQ19KQUxSLCBUSUxFX09QQ19KUlAsIFRJTEVfT1BDX0pSLAotICBUSUxFX09QQ19MTktfU04sIFRJTEVfT1BDX01BWEJfVV9TTiwgVElMRV9PUENfTUFYSF9TTiwgVElMRV9PUENfTUlOQl9VX1NOLAotICBUSUxFX09QQ19NSU5IX1NOLCBUSUxFX09QQ19NTlpCX1NOLCBUSUxFX09QQ19NTlpIX1NOLCBUSUxFX09QQ19NTlpfU04sCi0gIFRJTEVfT1BDX01aQl9TTiwgVElMRV9PUENfTVpIX1NOLCBUSUxFX09QQ19NWl9TTiwgVElMRV9PUENfTk9SX1NOLAotICBDSElMRCg2NzQpLCBUSUxFX09QQ19QQUNLSEJfU04sIFRJTEVfT1BDX1BBQ0tMQl9TTiwgVElMRV9PUENfUkxfU04sCi0gIFRJTEVfT1BDX1MxQV9TTiwgVElMRV9PUENfUzJBX1NOLCBUSUxFX09QQ19TM0FfU04sCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX0FEREJfU04sIFRJTEVQUk9fT1BDX0FEREhfU04sCisgIFRJTEVQUk9fT1BDX0FERF9TTiwgVElMRVBST19PUENfQU5EX1NOLCBUSUxFUFJPX09QQ19JTlRIQl9TTiwKKyAgVElMRVBST19PUENfSU5USEhfU04sIFRJTEVQUk9fT1BDX0lOVExCX1NOLCBUSUxFUFJPX09QQ19JTlRMSF9TTiwKKyAgVElMRVBST19PUENfSkFMUlAsIFRJTEVQUk9fT1BDX0pBTFIsIFRJTEVQUk9fT1BDX0pSUCwgVElMRVBST19PUENfSlIsCisgIFRJTEVQUk9fT1BDX0xOS19TTiwgVElMRVBST19PUENfTUFYQl9VX1NOLCBUSUxFUFJPX09QQ19NQVhIX1NOLAorICBUSUxFUFJPX09QQ19NSU5CX1VfU04sIFRJTEVQUk9fT1BDX01JTkhfU04sIFRJTEVQUk9fT1BDX01OWkJfU04sCisgIFRJTEVQUk9fT1BDX01OWkhfU04sIFRJTEVQUk9fT1BDX01OWl9TTiwgVElMRVBST19PUENfTVpCX1NOLAorICBUSUxFUFJPX09QQ19NWkhfU04sIFRJTEVQUk9fT1BDX01aX1NOLCBUSUxFUFJPX09QQ19OT1JfU04sIENISUxEKDY3NCksCisgIFRJTEVQUk9fT1BDX1BBQ0tIQl9TTiwgVElMRVBST19PUENfUEFDS0xCX1NOLCBUSUxFUFJPX09QQ19STF9TTiwKKyAgVElMRVBST19PUENfUzFBX1NOLCBUSUxFUFJPX09QQ19TMkFfU04sIFRJTEVQUk9fT1BDX1MzQV9TTiwKICAgQklURklFTEQoNDMsIDIpIC8qIGluZGV4IDY3NCAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNjc5KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNjc5KSwKICAgQklURklFTEQoNDUsIDIpIC8qIGluZGV4IDY3OSAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgQ0hJTEQoNjg0KSwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwgQ0hJTEQoNjg0KSwKICAgQklURklFTEQoNDcsIDIpIC8qIGluZGV4IDY4NCAqLywKLSAgVElMRV9PUENfT1JfU04sIFRJTEVfT1BDX09SX1NOLCBUSUxFX09QQ19PUl9TTiwgVElMRV9PUENfTU9WRV9TTiwKKyAgVElMRVBST19PUENfT1JfU04sIFRJTEVQUk9fT1BDX09SX1NOLCBUSUxFUFJPX09QQ19PUl9TTiwKKyAgVElMRVBST19PUENfTU9WRV9TTiwKICAgQklURklFTEQoNDksIDUpIC8qIGluZGV4IDY4OSAqLywKLSAgVElMRV9PUENfU0IsIFRJTEVfT1BDX1NFUUJfU04sIFRJTEVfT1BDX1NFUUhfU04sIFRJTEVfT1BDX1NFUV9TTiwKLSAgVElMRV9PUENfU0hMQl9TTiwgVElMRV9PUENfU0hMSF9TTiwgVElMRV9PUENfU0hMX1NOLCBUSUxFX09QQ19TSFJCX1NOLAotICBUSUxFX09QQ19TSFJIX1NOLCBUSUxFX09QQ19TSFJfU04sIFRJTEVfT1BDX1NILCBUSUxFX09QQ19TTFRCX1NOLAotICBUSUxFX09QQ19TTFRCX1VfU04sIFRJTEVfT1BDX1NMVEVCX1NOLCBUSUxFX09QQ19TTFRFQl9VX1NOLAotICBUSUxFX09QQ19TTFRFSF9TTiwgVElMRV9PUENfU0xURUhfVV9TTiwgVElMRV9PUENfU0xURV9TTiwKLSAgVElMRV9PUENfU0xURV9VX1NOLCBUSUxFX09QQ19TTFRIX1NOLCBUSUxFX09QQ19TTFRIX1VfU04sIFRJTEVfT1BDX1NMVF9TTiwKLSAgVElMRV9PUENfU0xUX1VfU04sIFRJTEVfT1BDX1NORUJfU04sIFRJTEVfT1BDX1NORUhfU04sIFRJTEVfT1BDX1NORV9TTiwKLSAgVElMRV9PUENfU1JBQl9TTiwgVElMRV9PUENfU1JBSF9TTiwgVElMRV9PUENfU1JBX1NOLCBUSUxFX09QQ19TVUJCX1NOLAotICBUSUxFX09QQ19TVUJIX1NOLCBUSUxFX09QQ19TVUJfU04sCisgIFRJTEVQUk9fT1BDX1NCLCBUSUxFUFJPX09QQ19TRVFCX1NOLCBUSUxFUFJPX09QQ19TRVFIX1NOLAorICBUSUxFUFJPX09QQ19TRVFfU04sIFRJTEVQUk9fT1BDX1NITEJfU04sIFRJTEVQUk9fT1BDX1NITEhfU04sCisgIFRJTEVQUk9fT1BDX1NITF9TTiwgVElMRVBST19PUENfU0hSQl9TTiwgVElMRVBST19PUENfU0hSSF9TTiwKKyAgVElMRVBST19PUENfU0hSX1NOLCBUSUxFUFJPX09QQ19TSCwgVElMRVBST19PUENfU0xUQl9TTiwKKyAgVElMRVBST19PUENfU0xUQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRFQl9TTiwgVElMRVBST19PUENfU0xURUJfVV9TTiwKKyAgVElMRVBST19PUENfU0xURUhfU04sIFRJTEVQUk9fT1BDX1NMVEVIX1VfU04sIFRJTEVQUk9fT1BDX1NMVEVfU04sCisgIFRJTEVQUk9fT1BDX1NMVEVfVV9TTiwgVElMRVBST19PUENfU0xUSF9TTiwgVElMRVBST19PUENfU0xUSF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRfU04sIFRJTEVQUk9fT1BDX1NMVF9VX1NOLCBUSUxFUFJPX09QQ19TTkVCX1NOLAorICBUSUxFUFJPX09QQ19TTkVIX1NOLCBUSUxFUFJPX09QQ19TTkVfU04sIFRJTEVQUk9fT1BDX1NSQUJfU04sCisgIFRJTEVQUk9fT1BDX1NSQUhfU04sIFRJTEVQUk9fT1BDX1NSQV9TTiwgVElMRVBST19PUENfU1VCQl9TTiwKKyAgVElMRVBST19PUENfU1VCSF9TTiwgVElMRVBST19PUENfU1VCX1NOLAogICBCSVRGSUVMRCg0OSwgNCkgLyogaW5kZXggNzIyICovLAogICBDSElMRCg2MTEpLCBDSElMRCg3MzkpLCBDSElMRCg3NDIpLCBDSElMRCg3NDUpLCBDSElMRCg3NDgpLCBDSElMRCg3NTEpLAotICBDSElMRCg3NTQpLCBDSElMRCg3NTcpLCBDSElMRCg3NjApLCBDSElMRCg3NjMpLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCg3NTQpLCBDSElMRCg3NTcpLCBDSElMRCg3NjApLCBDSElMRCg3NjMpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzM5ICovLAotICBUSUxFX09QQ19YT1JfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1hPUl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0MiAqLywKLSAgVElMRV9PUENfQUREU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQUREU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0NSAqLywKLSAgVElMRV9PUENfU1VCU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc0OCAqLywKLSAgVElMRV9PUENfQUREQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfQUREQlNfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDc1MSAqLywKLSAgVElMRV9PUENfQURESFNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0FEREhTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzU0ICovLAotICBUSUxFX09QQ19TVUJCU19VX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TVUJCU19VX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzU3ICovLAotICBUSUxFX09QQ19TVUJIU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1VCSFNfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCA3NjAgKi8sCi0gIFRJTEVfT1BDX1BBQ0tIU19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUEFDS0hTX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggNzYzICovLAotICBUSUxFX09QQ19QQUNLQlNfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUEFDS0JTX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA3NjYgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDc3MSksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDc3MSksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA3NzEgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIENISUxEKDc3NiksCisgIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwgVElMRVBST19PUENfQURETElfU04sCisgIENISUxEKDc3NiksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA3NzYgKi8sCi0gIFRJTEVfT1BDX0FERExJX1NOLCBUSUxFX09QQ19BRERMSV9TTiwgVElMRV9PUENfQURETElfU04sIFRJTEVfT1BDX01PVkVMSV9TTiwKKyAgVElMRVBST19PUENfQURETElfU04sIFRJTEVQUk9fT1BDX0FERExJX1NOLCBUSUxFUFJPX09QQ19BRERMSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUxJX1NOLAogICBCSVRGSUVMRCgzNywgMikgLyogaW5kZXggNzgxICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg3ODYpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg3ODYpLAogICBCSVRGSUVMRCgzOSwgMikgLyogaW5kZXggNzg2ICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBDSElMRCg3OTEpLAorICBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX0FERExJLCBDSElMRCg3OTEpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggNzkxICovLAotICBUSUxFX09QQ19BRERMSSwgVElMRV9PUENfQURETEksIFRJTEVfT1BDX0FERExJLCBUSUxFX09QQ19NT1ZFTEksCisgIFRJTEVQUk9fT1BDX0FERExJLCBUSUxFUFJPX09QQ19BRERMSSwgVElMRVBST19PUENfQURETEksIFRJTEVQUk9fT1BDX01PVkVMSSwKICAgQklURklFTEQoMzEsIDIpIC8qIGluZGV4IDc5NiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODAxKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODAxKSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDgwMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODA2KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODA2KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDgwNiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODExKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODExKSwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDgxMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODE2KSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODE2KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDgxNiAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgQ0hJTEQoODIxKSwKKyAgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgVElMRVBST19PUENfQVVMSSwgQ0hJTEQoODIxKSwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDgyMSAqLywKLSAgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfQVVMSSwgVElMRV9PUENfSU5GT0wsCisgIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0FVTEksIFRJTEVQUk9fT1BDX0lORk9MLAogICBCSVRGSUVMRCgzMSwgNCkgLyogaW5kZXggODI2ICovLAotICBUSUxFX09QQ19CWiwgVElMRV9PUENfQlpULCBUSUxFX09QQ19CTlosIFRJTEVfT1BDX0JOWlQsIFRJTEVfT1BDX0JHWiwKLSAgVElMRV9PUENfQkdaVCwgVElMRV9PUENfQkdFWiwgVElMRV9PUENfQkdFWlQsIFRJTEVfT1BDX0JMWiwgVElMRV9PUENfQkxaVCwKLSAgVElMRV9PUENfQkxFWiwgVElMRV9PUENfQkxFWlQsIFRJTEVfT1BDX0JCUywgVElMRV9PUENfQkJTVCwgVElMRV9PUENfQkJOUywKLSAgVElMRV9PUENfQkJOU1QsCisgIFRJTEVQUk9fT1BDX0JaLCBUSUxFUFJPX09QQ19CWlQsIFRJTEVQUk9fT1BDX0JOWiwgVElMRVBST19PUENfQk5aVCwKKyAgVElMRVBST19PUENfQkdaLCBUSUxFUFJPX09QQ19CR1pULCBUSUxFUFJPX09QQ19CR0VaLCBUSUxFUFJPX09QQ19CR0VaVCwKKyAgVElMRVBST19PUENfQkxaLCBUSUxFUFJPX09QQ19CTFpULCBUSUxFUFJPX09QQ19CTEVaLCBUSUxFUFJPX09QQ19CTEVaVCwKKyAgVElMRVBST19PUENfQkJTLCBUSUxFUFJPX09QQ19CQlNULCBUSUxFUFJPX09QQ19CQk5TLCBUSUxFUFJPX09QQ19CQk5TVCwKICAgQklURklFTEQoMzEsIDQpIC8qIGluZGV4IDg0MyAqLywKLSAgVElMRV9PUENfQlpfU04sIFRJTEVfT1BDX0JaVF9TTiwgVElMRV9PUENfQk5aX1NOLCBUSUxFX09QQ19CTlpUX1NOLAotICBUSUxFX09QQ19CR1pfU04sIFRJTEVfT1BDX0JHWlRfU04sIFRJTEVfT1BDX0JHRVpfU04sIFRJTEVfT1BDX0JHRVpUX1NOLAotICBUSUxFX09QQ19CTFpfU04sIFRJTEVfT1BDX0JMWlRfU04sIFRJTEVfT1BDX0JMRVpfU04sIFRJTEVfT1BDX0JMRVpUX1NOLAotICBUSUxFX09QQ19CQlNfU04sIFRJTEVfT1BDX0JCU1RfU04sIFRJTEVfT1BDX0JCTlNfU04sIFRJTEVfT1BDX0JCTlNUX1NOLAorICBUSUxFUFJPX09QQ19CWl9TTiwgVElMRVBST19PUENfQlpUX1NOLCBUSUxFUFJPX09QQ19CTlpfU04sCisgIFRJTEVQUk9fT1BDX0JOWlRfU04sIFRJTEVQUk9fT1BDX0JHWl9TTiwgVElMRVBST19PUENfQkdaVF9TTiwKKyAgVElMRVBST19PUENfQkdFWl9TTiwgVElMRVBST19PUENfQkdFWlRfU04sIFRJTEVQUk9fT1BDX0JMWl9TTiwKKyAgVElMRVBST19PUENfQkxaVF9TTiwgVElMRVBST19PUENfQkxFWl9TTiwgVElMRVBST19PUENfQkxFWlRfU04sCisgIFRJTEVQUk9fT1BDX0JCU19TTiwgVElMRVBST19PUENfQkJTVF9TTiwgVElMRVBST19PUENfQkJOU19TTiwKKyAgVElMRVBST19PUENfQkJOU1RfU04sCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA4NjAgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX0FERElCLCBUSUxFX09QQ19BRERJSCwgVElMRV9PUENfQURESSwgQ0hJTEQoODY5KSwKLSAgVElMRV9PUENfTUFYSUJfVSwgVElMRV9PUENfTUFYSUgsIFRJTEVfT1BDX01GU1BSLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19BRERJQiwgVElMRVBST19PUENfQURESUgsIFRJTEVQUk9fT1BDX0FEREksCisgIENISUxEKDg2OSksIFRJTEVQUk9fT1BDX01BWElCX1UsIFRJTEVQUk9fT1BDX01BWElILCBUSUxFUFJPX09QQ19NRlNQUiwKICAgQklURklFTEQoMzEsIDIpIC8qIGluZGV4IDg2OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODc0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODc0KSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDg3NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODc5KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODc5KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDg3OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODg0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODg0KSwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDg4NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODg5KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODg5KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDg4OSAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODk0KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODk0KSwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDg5NCAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfSU5GTywKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfSU5GTywKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDg5OSAqLywKLSAgVElMRV9PUENfTUlOSUJfVSwgVElMRV9PUENfTUlOSUgsIFRJTEVfT1BDX01UU1BSLCBDSElMRCg5MDgpLAotICBUSUxFX09QQ19TRVFJQiwgVElMRV9PUENfU0VRSUgsIFRJTEVfT1BDX1NFUUksIFRJTEVfT1BDX1NMVElCLAorICBUSUxFUFJPX09QQ19NSU5JQl9VLCBUSUxFUFJPX09QQ19NSU5JSCwgVElMRVBST19PUENfTVRTUFIsIENISUxEKDkwOCksCisgIFRJTEVQUk9fT1BDX1NFUUlCLCBUSUxFUFJPX09QQ19TRVFJSCwgVElMRVBST19PUENfU0VRSSwgVElMRVBST19PUENfU0xUSUIsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA5MDggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDkxMyksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDkxMyksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA5MTMgKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIENISUxEKDkxOCksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDkxOCksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA5MTggKi8sCi0gIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX01PVkVJLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19NT1ZFSSwKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDkyMyAqLywKLSAgVElMRV9PUENfU0xUSUJfVSwgVElMRV9PUENfU0xUSUgsIFRJTEVfT1BDX1NMVElIX1UsIFRJTEVfT1BDX1NMVEksCi0gIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfWE9SSSwgVElMRV9PUENfTEJBREQsIFRJTEVfT1BDX0xCQUREX1UsCisgIFRJTEVQUk9fT1BDX1NMVElCX1UsIFRJTEVQUk9fT1BDX1NMVElILCBUSUxFUFJPX09QQ19TTFRJSF9VLAorICBUSUxFUFJPX09QQ19TTFRJLCBUSUxFUFJPX09QQ19TTFRJX1UsIFRJTEVQUk9fT1BDX1hPUkksIFRJTEVQUk9fT1BDX0xCQURELAorICBUSUxFUFJPX09QQ19MQkFERF9VLAogICBCSVRGSUVMRCg1MSwgMykgLyogaW5kZXggOTMyICovLAotICBUSUxFX09QQ19MSEFERCwgVElMRV9PUENfTEhBRERfVSwgVElMRV9PUENfTFdBREQsIFRJTEVfT1BDX0xXQUREX05BLAotICBUSUxFX09QQ19TQkFERCwgVElMRV9PUENfU0hBREQsIFRJTEVfT1BDX1NXQURELCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSEFERCwgVElMRVBST19PUENfTEhBRERfVSwgVElMRVBST19PUENfTFdBREQsCisgIFRJTEVQUk9fT1BDX0xXQUREX05BLCBUSUxFUFJPX09QQ19TQkFERCwgVElMRVBST19PUENfU0hBREQsCisgIFRJTEVQUk9fT1BDX1NXQURELCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MSwgMykgLyogaW5kZXggOTQxICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19BRERJQl9TTiwgVElMRV9PUENfQURESUhfU04sIFRJTEVfT1BDX0FERElfU04sCi0gIFRJTEVfT1BDX0FORElfU04sIFRJTEVfT1BDX01BWElCX1VfU04sIFRJTEVfT1BDX01BWElIX1NOLCBUSUxFX09QQ19NRlNQUiwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQURESUJfU04sIFRJTEVQUk9fT1BDX0FERElIX1NOLAorICBUSUxFUFJPX09QQ19BRERJX1NOLCBUSUxFUFJPX09QQ19BTkRJX1NOLCBUSUxFUFJPX09QQ19NQVhJQl9VX1NOLAorICBUSUxFUFJPX09QQ19NQVhJSF9TTiwgVElMRVBST19PUENfTUZTUFIsCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA5NTAgKi8sCi0gIFRJTEVfT1BDX01JTklCX1VfU04sIFRJTEVfT1BDX01JTklIX1NOLCBUSUxFX09QQ19NVFNQUiwgQ0hJTEQoOTU5KSwKLSAgVElMRV9PUENfU0VRSUJfU04sIFRJTEVfT1BDX1NFUUlIX1NOLCBUSUxFX09QQ19TRVFJX1NOLCBUSUxFX09QQ19TTFRJQl9TTiwKKyAgVElMRVBST19PUENfTUlOSUJfVV9TTiwgVElMRVBST19PUENfTUlOSUhfU04sIFRJTEVQUk9fT1BDX01UU1BSLCBDSElMRCg5NTkpLAorICBUSUxFUFJPX09QQ19TRVFJQl9TTiwgVElMRVBST19PUENfU0VRSUhfU04sIFRJTEVQUk9fT1BDX1NFUUlfU04sCisgIFRJTEVQUk9fT1BDX1NMVElCX1NOLAogICBCSVRGSUVMRCgzNywgMikgLyogaW5kZXggOTU5ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBDSElMRCg5NjQpLAorICBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBDSElMRCg5NjQpLAogICBCSVRGSUVMRCgzOSwgMikgLyogaW5kZXggOTY0ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBDSElMRCg5NjkpLAorICBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwgVElMRVBST19PUENfT1JJX1NOLCBDSElMRCg5NjkpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggOTY5ICovLAotICBUSUxFX09QQ19PUklfU04sIFRJTEVfT1BDX09SSV9TTiwgVElMRV9PUENfT1JJX1NOLCBUSUxFX09QQ19NT1ZFSV9TTiwKKyAgVElMRVBST19PUENfT1JJX1NOLCBUSUxFUFJPX09QQ19PUklfU04sIFRJTEVQUk9fT1BDX09SSV9TTiwKKyAgVElMRVBST19PUENfTU9WRUlfU04sCiAgIEJJVEZJRUxEKDUxLCAzKSAvKiBpbmRleCA5NzQgKi8sCi0gIFRJTEVfT1BDX1NMVElCX1VfU04sIFRJTEVfT1BDX1NMVElIX1NOLCBUSUxFX09QQ19TTFRJSF9VX1NOLAotICBUSUxFX09QQ19TTFRJX1NOLCBUSUxFX09QQ19TTFRJX1VfU04sIFRJTEVfT1BDX1hPUklfU04sIFRJTEVfT1BDX0xCQUREX1NOLAotICBUSUxFX09QQ19MQkFERF9VX1NOLAorICBUSUxFUFJPX09QQ19TTFRJQl9VX1NOLCBUSUxFUFJPX09QQ19TTFRJSF9TTiwgVElMRVBST19PUENfU0xUSUhfVV9TTiwKKyAgVElMRVBST19PUENfU0xUSV9TTiwgVElMRVBST19PUENfU0xUSV9VX1NOLCBUSUxFUFJPX09QQ19YT1JJX1NOLAorICBUSUxFUFJPX09QQ19MQkFERF9TTiwgVElMRVBST19PUENfTEJBRERfVV9TTiwKICAgQklURklFTEQoNTEsIDMpIC8qIGluZGV4IDk4MyAqLywKLSAgVElMRV9PUENfTEhBRERfU04sIFRJTEVfT1BDX0xIQUREX1VfU04sIFRJTEVfT1BDX0xXQUREX1NOLAotICBUSUxFX09QQ19MV0FERF9OQV9TTiwgVElMRV9PUENfU0JBREQsIFRJTEVfT1BDX1NIQURELCBUSUxFX09QQ19TV0FERCwKLSAgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEhBRERfU04sIFRJTEVQUk9fT1BDX0xIQUREX1VfU04sIFRJTEVQUk9fT1BDX0xXQUREX1NOLAorICBUSUxFUFJPX09QQ19MV0FERF9OQV9TTiwgVElMRVBST19PUENfU0JBREQsIFRJTEVQUk9fT1BDX1NIQURELAorICBUSUxFUFJPX09QQ19TV0FERCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDYsIDcpIC8qIGluZGV4IDk5MiAqLywKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTEyMSksCi0gIENISUxEKDExMjEpLCBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyMSksIENISUxEKDExMjQpLCBDSElMRCgxMTI0KSwKLSAgQ0hJTEQoMTEyNCksIENISUxEKDExMjQpLCBDSElMRCgxMTI3KSwgQ0hJTEQoMTEyNyksIENISUxEKDExMjcpLAotICBDSElMRCgxMTI3KSwgQ0hJTEQoMTEzMCksIENISUxEKDExMzApLCBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMCksCi0gIENISUxEKDExMzMpLCBDSElMRCgxMTMzKSwgQ0hJTEQoMTEzMyksIENISUxEKDExMzMpLCBDSElMRCgxMTM2KSwKLSAgQ0hJTEQoMTEzNiksIENISUxEKDExMzYpLCBDSElMRCgxMTM2KSwgQ0hJTEQoMTEzOSksIENISUxEKDExMzkpLAotICBDSElMRCgxMTM5KSwgQ0hJTEQoMTEzOSksIENISUxEKDExNDIpLCBDSElMRCgxMTQyKSwgQ0hJTEQoMTE0MiksCi0gIENISUxEKDExNDIpLCBDSElMRCgxMTQ1KSwgQ0hJTEQoMTE0NSksIENISUxEKDExNDUpLCBDSElMRCgxMTQ1KSwKLSAgQ0hJTEQoMTE0OCksIENISUxEKDExNDgpLCBDSElMRCgxMTQ4KSwgQ0hJTEQoMTE0OCksIENISUxEKDExNTEpLAotICBDSElMRCgxMjQyKSwgQ0hJTEQoMTI5MCksIENISUxEKDEzMjMpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyMSksIENISUxEKDExMjEpLCBDSElMRCgxMTIxKSwgQ0hJTEQoMTEyNCksCisgIENISUxEKDExMjQpLCBDSElMRCgxMTI0KSwgQ0hJTEQoMTEyNCksIENISUxEKDExMjcpLCBDSElMRCgxMTI3KSwKKyAgQ0hJTEQoMTEyNyksIENISUxEKDExMjcpLCBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMCksIENISUxEKDExMzApLAorICBDSElMRCgxMTMwKSwgQ0hJTEQoMTEzMyksIENISUxEKDExMzMpLCBDSElMRCgxMTMzKSwgQ0hJTEQoMTEzMyksCisgIENISUxEKDExMzYpLCBDSElMRCgxMTM2KSwgQ0hJTEQoMTEzNiksIENISUxEKDExMzYpLCBDSElMRCgxMTM5KSwKKyAgQ0hJTEQoMTEzOSksIENISUxEKDExMzkpLCBDSElMRCgxMTM5KSwgQ0hJTEQoMTE0MiksIENISUxEKDExNDIpLAorICBDSElMRCgxMTQyKSwgQ0hJTEQoMTE0MiksIENISUxEKDExNDUpLCBDSElMRCgxMTQ1KSwgQ0hJTEQoMTE0NSksCisgIENISUxEKDExNDUpLCBDSElMRCgxMTQ4KSwgQ0hJTEQoMTE0OCksIENISUxEKDExNDgpLCBDSElMRCgxMTQ4KSwKKyAgQ0hJTEQoMTE1MSksIENISUxEKDEyNDIpLCBDSElMRCgxMjkwKSwgQ0hJTEQoMTMyMyksIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTIxICovLAotICBUSUxFX09QQ19STEksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1JMSSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMjQgKi8sCi0gIFRJTEVfT1BDX1NITElCLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSExJQiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMjcgKi8sCi0gIFRJTEVfT1BDX1NITElILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSExJSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExMzAgKi8sCi0gIFRJTEVfT1BDX1NITEksIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITEksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTMzICovLAotICBUSUxFX09QQ19TSFJJQiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hSSUIsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTM2ICovLAotICBUSUxFX09QQ19TSFJJSCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hSSUgsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTM5ICovLAotICBUSUxFX09QQ19TSFJJLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0MiAqLywKLSAgVElMRV9PUENfU1JBSUIsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NSQUlCLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0NSAqLywKLSAgVElMRV9PUENfU1JBSUgsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NSQUlILCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE0OCAqLywKLSAgVElMRV9PUENfU1JBSSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDMsIDMpIC8qIGluZGV4IDExNTEgKi8sCi0gIFRJTEVfT1BDX05PTkUsIENISUxEKDExNjApLCBDSElMRCgxMTYzKSwgQ0hJTEQoMTE2NiksIENISUxEKDExNjkpLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMTYwKSwgQ0hJTEQoMTE2MyksIENISUxEKDExNjYpLCBDSElMRCgxMTY5KSwKICAgQ0hJTEQoMTE3MiksIENISUxEKDExNzUpLCBDSElMRCgxMTc4KSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjAgKi8sCi0gIFRJTEVfT1BDX0RSQUlOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19EUkFJTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjMgKi8sCi0gIFRJTEVfT1BDX0RUTEJQUiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfRFRMQlBSLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTE2NiAqLywKLSAgVElMRV9PUENfRklOViwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfRklOViwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNjkgKi8sCi0gIFRJTEVfT1BDX0ZMVVNILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTFVTSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDExNzIgKi8sCi0gIFRJTEVfT1BDX0ZOT1AsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0ZOT1AsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTc1ICovLAotICBUSUxFX09QQ19JQ09ILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JQ09ILCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgzMSwgMikgLyogaW5kZXggMTE3OCAqLywKICAgQ0hJTEQoMTE4MyksIENISUxEKDEyMTEpLCBDSElMRCgxMjM5KSwgQ0hJTEQoMTIzOSksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMTgzICovLAotICBDSElMRCgxMTg2KSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTE4NiksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDMzLCAyKSAvKiBpbmRleCAxMTg2ICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBDSElMRCgxMTkxKSwKKyAgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgQ0hJTEQoMTE5MSksCiAgIEJJVEZJRUxEKDM1LCAyKSAvKiBpbmRleCAxMTkxICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDExOTYpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMTk2KSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCAxMTk2ICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDEyMDEpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjAxKSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCAxMjAxICovLAotICBUSUxFX09QQ19JTEwsIENISUxEKDEyMDYpLCBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwKKyAgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjA2KSwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19JTEwsCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCAxMjA2ICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfQlBULCBUSUxFX09QQ19JTEwsCisgIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19CUFQsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyMTEgKi8sCi0gIENISUxEKDEyMTQpLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxMjE0KSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoMzMsIDIpIC8qIGluZGV4IDEyMTQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBUSUxFX09QQ19JTEwsIENISUxEKDEyMTkpLAorICBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfSUxMLCBDSElMRCgxMjE5KSwKICAgQklURklFTEQoMzUsIDIpIC8qIGluZGV4IDEyMTkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIyNCksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMjQpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDEyMjQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIyOSksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMjkpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDEyMjkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgQ0hJTEQoMTIzNCksIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIENISUxEKDEyMzQpLCBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNDEsIDIpIC8qIGluZGV4IDEyMzQgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfSUxMLCBUSUxFX09QQ19SQUlTRSwgVElMRV9PUENfSUxMLAorICBUSUxFUFJPX09QQ19JTEwsIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfUkFJU0UsIFRJTEVQUk9fT1BDX0lMTCwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyMzkgKi8sCi0gIFRJTEVfT1BDX0lMTCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfSUxMLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTI0MiAqLywKICAgQ0hJTEQoMTI1MSksIENISUxEKDEyNTQpLCBDSElMRCgxMjU3KSwgQ0hJTEQoMTI3NSksIENISUxEKDEyNzgpLAogICBDSElMRCgxMjgxKSwgQ0hJTEQoMTI4NCksIENISUxEKDEyODcpLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI1MSAqLywKLSAgVElMRV9PUENfSU5WLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JTlYsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjU0ICovLAotICBUSUxFX09QQ19JUkVULCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19JUkVULCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI1NyAqLywKLSAgQ0hJTEQoMTI2MCksIFRJTEVfT1BDX05PTkUsCisgIENISUxEKDEyNjApLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgzMSwgMikgLyogaW5kZXggMTI2MCAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgQ0hJTEQoMTI2NSksCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIENISUxEKDEyNjUpLAogICBCSVRGSUVMRCgzMywgMikgLyogaW5kZXggMTI2NSAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgQ0hJTEQoMTI3MCksCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIENISUxEKDEyNzApLAogICBCSVRGSUVMRCgzNSwgMikgLyogaW5kZXggMTI3MCAqLywKLSAgVElMRV9PUENfTEIsIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfUFJFRkVUQ0gsCisgIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX1BSRUZFVENILAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTI3NSAqLywKLSAgVElMRV9PUENfTEJfVSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEJfVSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyNzggKi8sCi0gIFRJTEVfT1BDX0xILCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEyODEgKi8sCi0gIFRJTEVfT1BDX0xIX1UsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xIX1UsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjg0ICovLAotICBUSUxFX09QQ19MVywgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFcsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjg3ICovLAotICBUSUxFX09QQ19NRiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTUYsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAzKSAvKiBpbmRleCAxMjkwICovLAogICBDSElMRCgxMjk5KSwgQ0hJTEQoMTMwMiksIENISUxEKDEzMDUpLCBDSElMRCgxMzA4KSwgQ0hJTEQoMTMxMSksCiAgIENISUxEKDEzMTQpLCBDSElMRCgxMzE3KSwgQ0hJTEQoMTMyMCksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMjk5ICovLAotICBUSUxFX09QQ19OQVAsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05BUCwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMDIgKi8sCi0gIFRJTEVfT1BDX05PUCwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9QLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTMwNSAqLywKLSAgVElMRV9PUENfU1dJTlQwLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TV0lOVDAsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzA4ICovLAotICBUSUxFX09QQ19TV0lOVDEsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NXSU5UMSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMTEgKi8sCi0gIFRJTEVfT1BDX1NXSU5UMiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1dJTlQyLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTMxNCAqLywKLSAgVElMRV9PUENfU1dJTlQzLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TV0lOVDMsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzE3ICovLAotICBUSUxFX09QQ19UTlMsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1ROUywgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDEzMjAgKi8sCi0gIFRJTEVfT1BDX1dINjQsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1dINjQsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAyKSAvKiBpbmRleCAxMzIzICovLAotICBDSElMRCgxMzI4KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTMyOCksIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ1LCAxKSAvKiBpbmRleCAxMzI4ICovLAotICBDSElMRCgxMzMxKSwgVElMRV9PUENfTk9ORSwKKyAgQ0hJTEQoMTMzMSksIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxMzMxICovLAotICBUSUxFX09QQ19MV19OQSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFdfTkEsIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQ2LCA3KSAvKiBpbmRleCAxMzM0ICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBDSElMRCgxNDYzKSwKLSAgQ0hJTEQoMTQ2MyksIENISUxEKDE0NjMpLCBDSElMRCgxNDYzKSwgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjYpLAotICBDSElMRCgxNDY2KSwgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjkpLCBDSElMRCgxNDY5KSwgQ0hJTEQoMTQ2OSksCi0gIENISUxEKDE0NjkpLCBDSElMRCgxNDcyKSwgQ0hJTEQoMTQ3MiksIENISUxEKDE0NzIpLCBDSElMRCgxNDcyKSwKLSAgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzUpLCBDSElMRCgxNDc1KSwgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzgpLAotICBDSElMRCgxNDc4KSwgQ0hJTEQoMTQ3OCksIENISUxEKDE0NzgpLCBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4MSksCi0gIENISUxEKDE0ODEpLCBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4NCksIENISUxEKDE0ODQpLCBDSElMRCgxNDg0KSwKLSAgQ0hJTEQoMTQ4NCksIENISUxEKDE0ODcpLCBDSElMRCgxNDg3KSwgQ0hJTEQoMTQ4NyksIENISUxEKDE0ODcpLAotICBDSElMRCgxNDkwKSwgQ0hJTEQoMTQ5MCksIENISUxEKDE0OTApLCBDSElMRCgxNDkwKSwgQ0hJTEQoMTE1MSksCi0gIENISUxEKDE0OTMpLCBDSElMRCgxNTE3KSwgQ0hJTEQoMTUyOSksIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCisgIENISUxEKDE0NjMpLCBDSElMRCgxNDYzKSwgQ0hJTEQoMTQ2MyksIENISUxEKDE0NjMpLCBDSElMRCgxNDY2KSwKKyAgQ0hJTEQoMTQ2NiksIENISUxEKDE0NjYpLCBDSElMRCgxNDY2KSwgQ0hJTEQoMTQ2OSksIENISUxEKDE0NjkpLAorICBDSElMRCgxNDY5KSwgQ0hJTEQoMTQ2OSksIENISUxEKDE0NzIpLCBDSElMRCgxNDcyKSwgQ0hJTEQoMTQ3MiksCisgIENISUxEKDE0NzIpLCBDSElMRCgxNDc1KSwgQ0hJTEQoMTQ3NSksIENISUxEKDE0NzUpLCBDSElMRCgxNDc1KSwKKyAgQ0hJTEQoMTQ3OCksIENISUxEKDE0NzgpLCBDSElMRCgxNDc4KSwgQ0hJTEQoMTQ3OCksIENISUxEKDE0ODEpLAorICBDSElMRCgxNDgxKSwgQ0hJTEQoMTQ4MSksIENISUxEKDE0ODEpLCBDSElMRCgxNDg0KSwgQ0hJTEQoMTQ4NCksCisgIENISUxEKDE0ODQpLCBDSElMRCgxNDg0KSwgQ0hJTEQoMTQ4NyksIENISUxEKDE0ODcpLCBDSElMRCgxNDg3KSwKKyAgQ0hJTEQoMTQ4NyksIENISUxEKDE0OTApLCBDSElMRCgxNDkwKSwgQ0hJTEQoMTQ5MCksIENISUxEKDE0OTApLAorICBDSElMRCgxMTUxKSwgQ0hJTEQoMTQ5MyksIENISUxEKDE1MTcpLCBDSElMRCgxNTI5KSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NjMgKi8sCi0gIFRJTEVfT1BDX1JMSV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfUkxJX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ2NiAqLywKLSAgVElMRV9PUENfU0hMSUJfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITElCX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ2OSAqLywKLSAgVElMRV9PUENfU0hMSUhfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NITElIX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTQ3MiAqLywKLSAgVElMRV9PUENfU0hMSV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU0hMSV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NzUgKi8sCi0gIFRJTEVfT1BDX1NIUklCX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJQl9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0NzggKi8sCi0gIFRJTEVfT1BDX1NIUklIX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TSFJJSF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE0ODEgKi8sCi0gIFRJTEVfT1BDX1NIUklfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1NIUklfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDg0ICovLAotICBUSUxFX09QQ19TUkFJQl9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSUJfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDg3ICovLAotICBUSUxFX09QQ19TUkFJSF9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfU1JBSUhfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNDkwICovLAotICBUSUxFX09QQ19TUkFJX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19TUkFJX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTQ5MyAqLywKICAgQ0hJTEQoMTI1MSksIENISUxEKDEyNTQpLCBDSElMRCgxNTAyKSwgQ0hJTEQoMTUwNSksIENISUxEKDE1MDgpLAogICBDSElMRCgxNTExKSwgQ0hJTEQoMTUxNCksIENISUxEKDEyODcpLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTUwMiAqLywKLSAgVElMRV9PUENfTEJfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xCX1NOLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg1MywgMSkgLyogaW5kZXggMTUwNSAqLywKLSAgVElMRV9PUENfTEJfVV9TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTEJfVV9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MDggKi8sCi0gIFRJTEVfT1BDX0xIX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MSF9TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MTEgKi8sCi0gIFRJTEVfT1BDX0xIX1VfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0xIX1VfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNTE0ICovLAotICBUSUxFX09QQ19MV19TTiwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTFdfU04sIFRJTEVQUk9fT1BDX05PTkUsCiAgIEJJVEZJRUxEKDQzLCAzKSAvKiBpbmRleCAxNTE3ICovLAogICBDSElMRCgxMjk5KSwgQ0hJTEQoMTMwMiksIENISUxEKDEzMDUpLCBDSElMRCgxMzA4KSwgQ0hJTEQoMTMxMSksCiAgIENISUxEKDEzMTQpLCBDSElMRCgxNTI2KSwgQ0hJTEQoMTMyMCksCiAgIEJJVEZJRUxEKDUzLCAxKSAvKiBpbmRleCAxNTI2ICovLAotICBUSUxFX09QQ19UTlNfU04sIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX1ROU19TTiwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDMsIDIpIC8qIGluZGV4IDE1MjkgKi8sCi0gIENISUxEKDE1MzQpLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxNTM0KSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDUsIDEpIC8qIGluZGV4IDE1MzQgKi8sCi0gIENISUxEKDE1MzcpLCBUSUxFX09QQ19OT05FLAorICBDSElMRCgxNTM3KSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNTMsIDEpIC8qIGluZGV4IDE1MzcgKi8sCi0gIFRJTEVfT1BDX0xXX05BX1NOLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19MV19OQV9TTiwgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWTBfZnNtWzE2OF0gPQogewogICBCSVRGSUVMRCgyNywgNCkgLyogaW5kZXggMCAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCi0gIENISUxEKDU3KSwgQ0hJTEQoNjIpLCBDSElMRCg2NyksIFRJTEVfT1BDX0FEREksIENISUxEKDcyKSwgQ0hJTEQoMTAyKSwKLSAgVElMRV9PUENfU0VRSSwgQ0hJTEQoMTE3KSwgVElMRV9PUENfU0xUSSwgVElMRV9PUENfU0xUSV9VLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxNyksIENISUxEKDIyKSwgQ0hJTEQoMjcpLCBDSElMRCg0NyksIENISUxEKDUyKSwKKyAgQ0hJTEQoNTcpLCBDSElMRCg2MiksIENISUxEKDY3KSwgVElMRVBST19PUENfQURESSwgQ0hJTEQoNzIpLCBDSElMRCgxMDIpLAorICBUSUxFUFJPX09QQ19TRVFJLCBDSElMRCgxMTcpLCBUSUxFUFJPX09QQ19TTFRJLCBUSUxFUFJPX09QQ19TTFRJX1UsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAxNyAqLywKLSAgVElMRV9PUENfQURELCBUSUxFX09QQ19TMUEsIFRJTEVfT1BDX1MyQSwgVElMRV9PUENfU1VCLAorICBUSUxFUFJPX09QQ19BREQsIFRJTEVQUk9fT1BDX1MxQSwgVElMRVBST19PUENfUzJBLCBUSUxFUFJPX09QQ19TVUIsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAyMiAqLywKLSAgVElMRV9PUENfTU5aLCBUSUxFX09QQ19NVk5aLCBUSUxFX09QQ19NVlosIFRJTEVfT1BDX01aLAorICBUSUxFUFJPX09QQ19NTlosIFRJTEVQUk9fT1BDX01WTlosIFRJTEVQUk9fT1BDX01WWiwgVElMRVBST19PUENfTVosCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCAyNyAqLywKLSAgVElMRV9PUENfQU5ELCBUSUxFX09QQ19OT1IsIENISUxEKDMyKSwgVElMRV9PUENfWE9SLAorICBUSUxFUFJPX09QQ19BTkQsIFRJTEVQUk9fT1BDX05PUiwgQ0hJTEQoMzIpLCBUSUxFUFJPX09QQ19YT1IsCiAgIEJJVEZJRUxEKDEyLCAyKSAvKiBpbmRleCAzMiAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgQ0hJTEQoMzcpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCgzNyksCiAgIEJJVEZJRUxEKDE0LCAyKSAvKiBpbmRleCAzNyAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgQ0hJTEQoNDIpLAorICBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBDSElMRCg0MiksCiAgIEJJVEZJRUxEKDE2LCAyKSAvKiBpbmRleCA0MiAqLywKLSAgVElMRV9PUENfT1IsIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfTU9WRSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfTU9WRSwKICAgQklURklFTEQoMTgsIDIpIC8qIGluZGV4IDQ3ICovLAotICBUSUxFX09QQ19STCwgVElMRV9PUENfU0hMLCBUSUxFX09QQ19TSFIsIFRJTEVfT1BDX1NSQSwKKyAgVElMRVBST19PUENfUkwsIFRJTEVQUk9fT1BDX1NITCwgVElMRVBST19PUENfU0hSLCBUSUxFUFJPX09QQ19TUkEsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA1MiAqLywKLSAgVElMRV9PUENfU0xURSwgVElMRV9PUENfU0xURV9VLCBUSUxFX09QQ19TTFQsIFRJTEVfT1BDX1NMVF9VLAorICBUSUxFUFJPX09QQ19TTFRFLCBUSUxFUFJPX09QQ19TTFRFX1UsIFRJTEVQUk9fT1BDX1NMVCwgVElMRVBST19PUENfU0xUX1UsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA1NyAqLywKLSAgVElMRV9PUENfTVVMSExTQV9VVSwgVElMRV9PUENfUzNBLCBUSUxFX09QQ19TRVEsIFRJTEVfT1BDX1NORSwKKyAgVElMRVBST19PUENfTVVMSExTQV9VVSwgVElMRVBST19PUENfUzNBLCBUSUxFUFJPX09QQ19TRVEsIFRJTEVQUk9fT1BDX1NORSwKICAgQklURklFTEQoMTgsIDIpIC8qIGluZGV4IDYyICovLAotICBUSUxFX09QQ19NVUxISF9TUywgVElMRV9PUENfTVVMSEhfVVUsIFRJTEVfT1BDX01VTExMX1NTLCBUSUxFX09QQ19NVUxMTF9VVSwKKyAgVElMRVBST19PUENfTVVMSEhfU1MsIFRJTEVQUk9fT1BDX01VTEhIX1VVLCBUSUxFUFJPX09QQ19NVUxMTF9TUywKKyAgVElMRVBST19PUENfTVVMTExfVVUsCiAgIEJJVEZJRUxEKDE4LCAyKSAvKiBpbmRleCA2NyAqLywKLSAgVElMRV9PUENfTVVMSEhBX1NTLCBUSUxFX09QQ19NVUxISEFfVVUsIFRJTEVfT1BDX01VTExMQV9TUywKLSAgVElMRV9PUENfTVVMTExBX1VVLAorICBUSUxFUFJPX09QQ19NVUxISEFfU1MsIFRJTEVQUk9fT1BDX01VTEhIQV9VVSwgVElMRVBST19PUENfTVVMTExBX1NTLAorICBUSUxFUFJPX09QQ19NVUxMTEFfVVUsCiAgIEJJVEZJRUxEKDAsIDIpIC8qIGluZGV4IDcyICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg3NyksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDc3KSwKICAgQklURklFTEQoMiwgMikgLyogaW5kZXggNzcgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDgyKSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoODIpLAogICBCSVRGSUVMRCg0LCAyKSAvKiBpbmRleCA4MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4NyksCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDg3ICovLAotICBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBUSUxFX09QQ19BTkRJLCBDSElMRCg5MiksCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIENISUxEKDkyKSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggOTIgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIENISUxEKDk3KSwKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgQ0hJTEQoOTcpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggOTcgKi8sCi0gIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0FOREksIFRJTEVfT1BDX0lORk8sCisgIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0FOREksIFRJTEVQUk9fT1BDX0lORk8sCiAgIEJJVEZJRUxEKDYsIDIpIC8qIGluZGV4IDEwMiAqLywKLSAgVElMRV9PUENfT1JJLCBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgQ0hJTEQoMTA3KSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgQ0hJTEQoMTA3KSwKICAgQklURklFTEQoOCwgMikgLyogaW5kZXggMTA3ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCgxMTIpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCgxMTIpLAogICBCSVRGSUVMRCgxMCwgMikgLyogaW5kZXggMTEyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19NT1ZFSSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfTU9WRUksCiAgIEJJVEZJRUxEKDE1LCA1KSAvKiBpbmRleCAxMTcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1JMSSwKLSAgVElMRV9PUENfUkxJLCBUSUxFX09QQ19STEksIFRJTEVfT1BDX1JMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hMSSwKLSAgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU0hSSSwKLSAgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwgVElMRV9PUENfU1JBSSwKLSAgQ0hJTEQoMTUwKSwgQ0hJTEQoMTU5KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKLSAgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfUkxJLCBUSUxFUFJPX09QQ19STEksIFRJTEVQUk9fT1BDX1JMSSwgVElMRVBST19PUENfUkxJLAorICBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSExJLAorICBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLCBUSUxFUFJPX09QQ19TUkFJLAorICBDSElMRCgxNTApLCBDSElMRCgxNTkpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCgxMiwgMykgLyogaW5kZXggMTUwICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19CSVRYLCBUSUxFX09QQ19CWVRFWCwgVElMRV9PUENfQ0xaLCBUSUxFX09QQ19DVFosCi0gIFRJTEVfT1BDX0ZOT1AsIFRJTEVfT1BDX05PUCwgVElMRV9PUENfUENOVCwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfQklUWCwgVElMRVBST19PUENfQllURVgsIFRJTEVQUk9fT1BDX0NMWiwKKyAgVElMRVBST19PUENfQ1RaLCBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX1BDTlQsCiAgIEJJVEZJRUxEKDEyLCAzKSAvKiBpbmRleCAxNTkgKi8sCi0gIFRJTEVfT1BDX1RCTElEWEIwLCBUSUxFX09QQ19UQkxJRFhCMSwgVElMRV9PUENfVEJMSURYQjIsIFRJTEVfT1BDX1RCTElEWEIzLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMCwgVElMRVBST19PUENfVEJMSURYQjEsIFRJTEVQUk9fT1BDX1RCTElEWEIyLAorICBUSUxFUFJPX09QQ19UQkxJRFhCMywgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZWNvZGVfWTFfZnNtWzE0MF0gPQogewogICBCSVRGSUVMRCg1OSwgNCkgLyogaW5kZXggMCAqLywKLSAgVElMRV9PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCi0gIENISUxEKDU3KSwgVElMRV9PUENfQURESSwgQ0hJTEQoNjIpLCBDSElMRCg5MiksIFRJTEVfT1BDX1NFUUksIENISUxEKDEwNyksCi0gIFRJTEVfT1BDX1NMVEksIFRJTEVfT1BDX1NMVElfVSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgQ0hJTEQoMTcpLCBDSElMRCgyMiksIENISUxEKDI3KSwgQ0hJTEQoNDcpLCBDSElMRCg1MiksCisgIENISUxEKDU3KSwgVElMRVBST19PUENfQURESSwgQ0hJTEQoNjIpLCBDSElMRCg5MiksIFRJTEVQUk9fT1BDX1NFUUksCisgIENISUxEKDEwNyksIFRJTEVQUk9fT1BDX1NMVEksIFRJTEVQUk9fT1BDX1NMVElfVSwgVElMRVBST19PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDksIDIpIC8qIGluZGV4IDE3ICovLAotICBUSUxFX09QQ19BREQsIFRJTEVfT1BDX1MxQSwgVElMRV9PUENfUzJBLCBUSUxFX09QQ19TVUIsCisgIFRJTEVQUk9fT1BDX0FERCwgVElMRVBST19PUENfUzFBLCBUSUxFUFJPX09QQ19TMkEsIFRJTEVQUk9fT1BDX1NVQiwKICAgQklURklFTEQoNDksIDIpIC8qIGluZGV4IDIyICovLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19NTlosIFRJTEVfT1BDX01aLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19NTlosIFRJTEVQUk9fT1BDX01aLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggMjcgKi8sCi0gIFRJTEVfT1BDX0FORCwgVElMRV9PUENfTk9SLCBDSElMRCgzMiksIFRJTEVfT1BDX1hPUiwKKyAgVElMRVBST19PUENfQU5ELCBUSUxFUFJPX09QQ19OT1IsIENISUxEKDMyKSwgVElMRVBST19PUENfWE9SLAogICBCSVRGSUVMRCg0MywgMikgLyogaW5kZXggMzIgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDM3KSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgQ0hJTEQoMzcpLAogICBCSVRGSUVMRCg0NSwgMikgLyogaW5kZXggMzcgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIENISUxEKDQyKSwKKyAgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgQ0hJTEQoNDIpLAogICBCSVRGSUVMRCg0NywgMikgLyogaW5kZXggNDIgKi8sCi0gIFRJTEVfT1BDX09SLCBUSUxFX09QQ19PUiwgVElMRV9PUENfT1IsIFRJTEVfT1BDX01PVkUsCisgIFRJTEVQUk9fT1BDX09SLCBUSUxFUFJPX09QQ19PUiwgVElMRVBST19PUENfT1IsIFRJTEVQUk9fT1BDX01PVkUsCiAgIEJJVEZJRUxEKDQ5LCAyKSAvKiBpbmRleCA0NyAqLywKLSAgVElMRV9PUENfUkwsIFRJTEVfT1BDX1NITCwgVElMRV9PUENfU0hSLCBUSUxFX09QQ19TUkEsCisgIFRJTEVQUk9fT1BDX1JMLCBUSUxFUFJPX09QQ19TSEwsIFRJTEVQUk9fT1BDX1NIUiwgVElMRVBST19PUENfU1JBLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggNTIgKi8sCi0gIFRJTEVfT1BDX1NMVEUsIFRJTEVfT1BDX1NMVEVfVSwgVElMRV9PUENfU0xULCBUSUxFX09QQ19TTFRfVSwKKyAgVElMRVBST19PUENfU0xURSwgVElMRVBST19PUENfU0xURV9VLCBUSUxFUFJPX09QQ19TTFQsIFRJTEVQUk9fT1BDX1NMVF9VLAogICBCSVRGSUVMRCg0OSwgMikgLyogaW5kZXggNTcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1MzQSwgVElMRV9PUENfU0VRLCBUSUxFX09QQ19TTkUsCisgIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX1MzQSwgVElMRVBST19PUENfU0VRLCBUSUxFUFJPX09QQ19TTkUsCiAgIEJJVEZJRUxEKDMxLCAyKSAvKiBpbmRleCA2MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNjcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg2NyksCiAgIEJJVEZJRUxEKDMzLCAyKSAvKiBpbmRleCA2NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNzIpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg3MiksCiAgIEJJVEZJRUxEKDM1LCAyKSAvKiBpbmRleCA3MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoNzcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg3NyksCiAgIEJJVEZJRUxEKDM3LCAyKSAvKiBpbmRleCA3NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODIpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4MiksCiAgIEJJVEZJRUxEKDM5LCAyKSAvKiBpbmRleCA4MiAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgQ0hJTEQoODcpLAorICBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBUSUxFUFJPX09QQ19BTkRJLCBDSElMRCg4NyksCiAgIEJJVEZJRUxEKDQxLCAyKSAvKiBpbmRleCA4NyAqLywKLSAgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfQU5ESSwgVElMRV9PUENfSU5GTywKKyAgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfQU5ESSwgVElMRVBST19PUENfSU5GTywKICAgQklURklFTEQoMzcsIDIpIC8qIGluZGV4IDkyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCg5NyksCisgIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIENISUxEKDk3KSwKICAgQklURklFTEQoMzksIDIpIC8qIGluZGV4IDk3ICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBDSElMRCgxMDIpLAorICBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfT1JJLCBDSElMRCgxMDIpLAogICBCSVRGSUVMRCg0MSwgMikgLyogaW5kZXggMTAyICovLAotICBUSUxFX09QQ19PUkksIFRJTEVfT1BDX09SSSwgVElMRV9PUENfT1JJLCBUSUxFX09QQ19NT1ZFSSwKKyAgVElMRVBST19PUENfT1JJLCBUSUxFUFJPX09QQ19PUkksIFRJTEVQUk9fT1BDX09SSSwgVElMRVBST19PUENfTU9WRUksCiAgIEJJVEZJRUxEKDQ4LCAzKSAvKiBpbmRleCAxMDcgKi8sCi0gIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX1JMSSwgVElMRV9PUENfU0hMSSwgVElMRV9PUENfU0hSSSwgVElMRV9PUENfU1JBSSwKLSAgQ0hJTEQoMTE2KSwgVElMRV9PUENfTk9ORSwgVElMRV9PUENfTk9ORSwKKyAgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfUkxJLCBUSUxFUFJPX09QQ19TSExJLCBUSUxFUFJPX09QQ19TSFJJLAorICBUSUxFUFJPX09QQ19TUkFJLCBDSElMRCgxMTYpLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0MywgMykgLyogaW5kZXggMTE2ICovLAotICBUSUxFX09QQ19OT05FLCBDSElMRCgxMjUpLCBDSElMRCgxMzApLCBDSElMRCgxMzUpLCBUSUxFX09QQ19OT05FLAotICBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBDSElMRCgxMjUpLCBDSElMRCgxMzApLCBDSElMRCgxMzUpLCBUSUxFUFJPX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0NiwgMikgLyogaW5kZXggMTI1ICovLAotICBUSUxFX09QQ19GTk9QLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19GTk9QLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLCBUSUxFUFJPX09QQ19OT05FLAogICBCSVRGSUVMRCg0NiwgMikgLyogaW5kZXggMTMwICovLAotICBUSUxFX09QQ19JTEwsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsIFRJTEVfT1BDX05PTkUsCisgIFRJTEVQUk9fT1BDX0lMTCwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwgVElMRVBST19PUENfTk9ORSwKICAgQklURklFTEQoNDYsIDIpIC8qIGluZGV4IDEzNSAqLywKLSAgVElMRV9PUENfTk9QLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLCBUSUxFX09QQ19OT05FLAorICBUSUxFUFJPX09QQ19OT1AsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsIFRJTEVQUk9fT1BDX05PTkUsCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGVjb2RlX1kyX2ZzbVsyNF0gPQogewogICBCSVRGSUVMRCg1NiwgMykgLyogaW5kZXggMCAqLywKLSAgQ0hJTEQoOSksIFRJTEVfT1BDX0xCX1UsIFRJTEVfT1BDX0xILCBUSUxFX09QQ19MSF9VLCBUSUxFX09QQ19MVywKLSAgVElMRV9PUENfU0IsIFRJTEVfT1BDX1NILCBUSUxFX09QQ19TVywKKyAgQ0hJTEQoOSksIFRJTEVQUk9fT1BDX0xCX1UsIFRJTEVQUk9fT1BDX0xILCBUSUxFUFJPX09QQ19MSF9VLAorICBUSUxFUFJPX09QQ19MVywgVElMRVBST19PUENfU0IsIFRJTEVQUk9fT1BDX1NILCBUSUxFUFJPX09QQ19TVywKICAgQklURklFTEQoMjAsIDIpIC8qIGluZGV4IDkgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIENISUxEKDE0KSwKKyAgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgQ0hJTEQoMTQpLAogICBCSVRGSUVMRCgyMiwgMikgLyogaW5kZXggMTQgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIENISUxEKDE5KSwKKyAgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19MQiwgQ0hJTEQoMTkpLAogICBCSVRGSUVMRCgyNCwgMikgLyogaW5kZXggMTkgKi8sCi0gIFRJTEVfT1BDX0xCLCBUSUxFX09QQ19MQiwgVElMRV9PUENfTEIsIFRJTEVfT1BDX1BSRUZFVENILAorICBUSUxFUFJPX09QQ19MQiwgVElMRVBST19PUENfTEIsIFRJTEVQUk9fT1BDX0xCLCBUSUxFUFJPX09QQ19QUkVGRVRDSCwKIH07CiAKICN1bmRlZiBCSVRGSUVMRAogI3VuZGVmIENISUxECiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0Ci10aWxlX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRV9OVU1fUElQRUxJTkVfRU5DT0RJTkdTXSA9Cit0aWxlcHJvX2J1bmRsZV9kZWNvZGVyX2ZzbXNbVElMRVBST19OVU1fUElQRUxJTkVfRU5DT0RJTkdTXSA9CiB7CiAgIGRlY29kZV9YMF9mc20sCiAgIGRlY29kZV9YMV9mc20sCkBAIC0yMTkxLDIyMCArMjI5NywyMjAgQEAKICAgZGVjb2RlX1kxX2ZzbSwKICAgZGVjb2RlX1kyX2ZzbQogfTsKLWNvbnN0IHN0cnVjdCB0aWxlX29wZXJhbmQgdGlsZV9vcGVyYW5kc1s0M10gPQorY29uc3Qgc3RydWN0IHRpbGVwcm9fb3BlcmFuZCB0aWxlcHJvX29wZXJhbmRzWzQzXSA9CiB7CiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9JTU04X1gwKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19JTU04X1gwKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1gwLCBnZXRfSW1tOF9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NOF9YMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fSU1NOF9YMSksCiAgICAgOCwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tOF9YMSwgZ2V0X0ltbThfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX0lNTThfWTApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTThfWTApLAogICAgIDgsIDEsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX0ltbThfWTAsIGdldF9JbW04X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9JTU04X1kxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19JTU04X1kxKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1kxLCBnZXRfSW1tOF9ZMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NMTZfWDApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTTE2X1gwKSwKICAgICAxNiwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tMTZfWDAsIGdldF9JbW0xNl9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfSU1NMTZfWDEpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX0lNTTE2X1gxKSwKICAgICAxNiwgMSwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tMTZfWDEsIGdldF9JbW0xNl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFX0pPRkZMT05HX1gxKSwKLSAgICAyOSwgMSwgMCwgMCwgMSwgVElMRV9MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMsCisgICAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFUFJPX0pPRkZMT05HX1gxKSwKKyAgICAyOSwgMSwgMCwgMCwgMSwgVElMRVBST19MT0cyX0JVTkRMRV9BTElHTk1FTlRfSU5fQllURVMsCiAgICAgY3JlYXRlX0pPZmZMb25nX1gxLCBnZXRfSk9mZkxvbmdfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDAsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWDAsIGdldF9EZXN0X1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNBX1gwLCBnZXRfU3JjQV9YMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9YMSwgZ2V0X0Rlc3RfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0FfWDEsIGdldF9TcmNBX1gxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAwLCAxLCAwLCAwLAogICAgIGNyZWF0ZV9EZXN0X1kwLCBnZXRfRGVzdF9ZMAogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9ZMCwgZ2V0X1NyY0FfWTAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDAsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWTEsIGdldF9EZXN0X1kxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNBX1kxLCBnZXRfU3JjQV9ZMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9ZMiwgZ2V0X1NyY0FfWTIKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JfWDAsIGdldF9TcmNCX1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfUkVHSVNURVIsIEJGRF9SRUxPQyhOT05FKSwKICAgICA2LCAwLCAxLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TcmNCX1gxLCBnZXRfU3JjQl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMCwgMCwgMCwKICAgICBjcmVhdGVfU3JjQl9ZMCwgZ2V0X1NyY0JfWTAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JfWTEsIGdldF9TcmNCX1kxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfQUREUkVTUywgQkZEX1JFTE9DKFRJTEVfQlJPRkZfWDEpLAotICAgIDE3LCAxLCAwLCAwLCAxLCBUSUxFX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUywKKyAgICBUSUxFUFJPX09QX1RZUEVfQUREUkVTUywgQkZEX1JFTE9DKFRJTEVQUk9fQlJPRkZfWDEpLAorICAgIDE3LCAxLCAwLCAwLCAxLCBUSUxFUFJPX0xPRzJfQlVORExFX0FMSUdOTUVOVF9JTl9CWVRFUywKICAgICBjcmVhdGVfQnJPZmZfWDEsIGdldF9Cck9mZl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9YMCwgZ2V0X0Rlc3RfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9BRERSRVNTLCBCRkRfUkVMT0MoTk9ORSksCi0gICAgMjgsIDEsIDAsIDAsIDEsIFRJTEVfTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLAorICAgIFRJTEVQUk9fT1BfVFlQRV9BRERSRVNTLCBCRkRfUkVMT0MoTk9ORSksCisgICAgMjgsIDEsIDAsIDAsIDEsIFRJTEVQUk9fTE9HMl9CVU5ETEVfQUxJR05NRU5UX0lOX0JZVEVTLAogICAgIGNyZWF0ZV9KT2ZmX1gxLCBnZXRfSk9mZl9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfU3JjQkRlc3RfWTIsIGdldF9TcmNCRGVzdF9ZMgogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgNiwgMCwgMSwgMSwgMCwgMCwKICAgICBjcmVhdGVfU3JjQV9YMSwgZ2V0X1NyY0FfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9TUFIsIEJGRF9SRUxPQyhUSUxFX01GX0lNTTE1X1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfU1BSLCBCRkRfUkVMT0MoVElMRVBST19NRl9JTU0xNV9YMSksCiAgICAgMTUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01GX0ltbTE1X1gxLCBnZXRfTUZfSW1tMTVfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX01NU1RBUlRfWDApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX01NU1RBUlRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NU3RhcnRfWDAsIGdldF9NTVN0YXJ0X1gwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9NTUVORF9YMCksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fTU1FTkRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NRW5kX1gwLCBnZXRfTU1FbmRfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX01NU1RBUlRfWDEpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX01NU1RBUlRfWDEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NU3RhcnRfWDEsIGdldF9NTVN0YXJ0X1gxCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9NTUVORF9YMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fTU1FTkRfWDEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01NRW5kX1gxLCBnZXRfTU1FbmRfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9TUFIsIEJGRF9SRUxPQyhUSUxFX01UX0lNTTE1X1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfU1BSLCBCRkRfUkVMT0MoVElMRVBST19NVF9JTU0xNV9YMSksCiAgICAgMTUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX01UX0ltbTE1X1gxLCBnZXRfTVRfSW1tMTVfWDEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDEsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfWTAsIGdldF9EZXN0X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9TSEFNVF9YMCksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fU0hBTVRfWDApLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NoQW10X1gwLCBnZXRfU2hBbXRfWDAKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NIQU1UX1gxKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19TSEFNVF9YMSksCiAgICAgNSwgMCwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfU2hBbXRfWDEsIGdldF9TaEFtdF9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVfU0hBTVRfWTApLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFUFJPX1NIQU1UX1kwKSwKICAgICA1LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9TaEFtdF9ZMCwgZ2V0X1NoQW10X1kwCiAgIH0sCiAgIHsKLSAgICBUSUxFX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRV9TSEFNVF9ZMSksCisgICAgVElMRVBST19PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVQUk9fU0hBTVRfWTEpLAogICAgIDUsIDAsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NoQW10X1kxLCBnZXRfU2hBbXRfWTEKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDYsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY0JEZXN0X1kyLCBnZXRfU3JjQkRlc3RfWTIKICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhOT05FKSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRVBST19ERVNUX0lNTThfWDEpLAogICAgIDgsIDEsIDAsIDAsIDAsIDAsCiAgICAgY3JlYXRlX0Rlc3RfSW1tOF9YMSwgZ2V0X0Rlc3RfSW1tOF9YMQogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhUSUxFX1NOX0JST0ZGKSwKLSAgICAxMCwgMSwgMCwgMCwgMSwgVElMRV9MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMsCisgICAgVElMRVBST19PUF9UWVBFX0FERFJFU1MsIEJGRF9SRUxPQyhOT05FKSwKKyAgICAxMCwgMSwgMCwgMCwgMSwgVElMRVBST19MT0cyX1NOX0lOU1RSVUNUSU9OX1NJWkVfSU5fQllURVMsCiAgICAgY3JlYXRlX0JyT2ZmX1NOLCBnZXRfQnJPZmZfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NOX1VJTU04KSwKKyAgICBUSUxFUFJPX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgOCwgMCwgMCwgMCwgMCwgMCwKICAgICBjcmVhdGVfSW1tOF9TTiwgZ2V0X0ltbThfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhUSUxFX1NOX0lNTTgpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9JTU1FRElBVEUsIEJGRF9SRUxPQyhOT05FKSwKICAgICA4LCAxLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9JbW04X1NOLCBnZXRfSW1tOF9TTgogICB9LAogICB7Ci0gICAgVElMRV9PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRVBST19PUF9UWVBFX1JFR0lTVEVSLCBCRkRfUkVMT0MoTk9ORSksCiAgICAgMiwgMCwgMCwgMSwgMCwgMCwKICAgICBjcmVhdGVfRGVzdF9TTiwgZ2V0X0Rlc3RfU04KICAgfSwKICAgewotICAgIFRJTEVfT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVQUk9fT1BfVFlQRV9SRUdJU1RFUiwgQkZEX1JFTE9DKE5PTkUpLAogICAgIDIsIDAsIDEsIDAsIDAsIDAsCiAgICAgY3JlYXRlX1NyY19TTiwgZ2V0X1NyY19TTgogICB9CkBAIC0yNDE2LDEwICsyNTIyLDEwIEBACiAvKiBHaXZlbiBhIHNldCBvZiBidW5kbGUgYml0cyBhbmQgYSBzcGVjaWZpYyBwaXBlLCByZXR1cm5zIHdoaWNoCiAgKiBpbnN0cnVjdGlvbiB0aGUgYnVuZGxlIGNvbnRhaW5zIGluIHRoYXQgcGlwZS4KICAqLwotY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlKHRpbGVfYnVuZGxlX2JpdHMgYml0cywgdGlsZV9waXBlbGluZSBwaXBlKQorY29uc3Qgc3RydWN0IHRpbGVwcm9fb3Bjb2RlICoKK2ZpbmRfb3Bjb2RlKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywgdGlsZXByb19waXBlbGluZSBwaXBlKQogewotICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqdGFibGUgPSB0aWxlX2J1bmRsZV9kZWNvZGVyX2ZzbXNbcGlwZV07CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp0YWJsZSA9IHRpbGVwcm9fYnVuZGxlX2RlY29kZXJfZnNtc1twaXBlXTsKICAgaW50IGluZGV4ID0gMDsKIAogICB3aGlsZSAoMSkKQEAgLTI0MjksNTEgKzI1MzUsNTEgQEAKICAgICAgICgodW5zaWduZWQgaW50KShiaXRzID4+IChiaXRzcGVjICYgNjMpKSkgJiAoYml0c3BlYyA+PiA2KTsKIAogICAgIHVuc2lnbmVkIHNob3J0IG5leHQgPSB0YWJsZVtpbmRleCArIDEgKyBiaXRmaWVsZF07Ci0gICAgaWYgKG5leHQgPD0gVElMRV9PUENfTk9ORSkKLSAgICAgIHJldHVybiAmdGlsZV9vcGNvZGVzW25leHRdOworICAgIGlmIChuZXh0IDw9IFRJTEVQUk9fT1BDX05PTkUpCisgICAgICByZXR1cm4gJnRpbGVwcm9fb3Bjb2Rlc1tuZXh0XTsKIAotICAgIGluZGV4ID0gbmV4dCAtIFRJTEVfT1BDX05PTkU7CisgICAgaW5kZXggPSBuZXh0IC0gVElMRVBST19PUENfTk9ORTsKICAgfQogfQogCiAKIGludAotcGFyc2VfaW5zbl90aWxlKHRpbGVfYnVuZGxlX2JpdHMgYml0cywKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCi0gICAgICAgICAgICAgICAgc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRV9NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKQorcGFyc2VfaW5zbl90aWxlcHJvKHRpbGVwcm9fYnVuZGxlX2JpdHMgYml0cywKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGMsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbGVwcm9fZGVjb2RlZF9pbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgIGRlY29kZWRbVElMRVBST19NQVhfSU5TVFJVQ1RJT05TX1BFUl9CVU5ETEVdKQogewogICBpbnQgbnVtX2luc3RydWN0aW9ucyA9IDA7CiAgIGludCBwaXBlOwogCiAgIGludCBtaW5fcGlwZSwgbWF4X3BpcGU7Ci0gIGlmICgoYml0cyAmIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSykgPT0gMCkKKyAgaWYgKChiaXRzICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKSA9PSAwKQogICB7Ci0gICAgbWluX3BpcGUgPSBUSUxFX1BJUEVMSU5FX1gwOwotICAgIG1heF9waXBlID0gVElMRV9QSVBFTElORV9YMTsKKyAgICBtaW5fcGlwZSA9IFRJTEVQUk9fUElQRUxJTkVfWDA7CisgICAgbWF4X3BpcGUgPSBUSUxFUFJPX1BJUEVMSU5FX1gxOwogICB9CiAgIGVsc2UKICAgewotICAgIG1pbl9waXBlID0gVElMRV9QSVBFTElORV9ZMDsKLSAgICBtYXhfcGlwZSA9IFRJTEVfUElQRUxJTkVfWTI7CisgICAgbWluX3BpcGUgPSBUSUxFUFJPX1BJUEVMSU5FX1kwOworICAgIG1heF9waXBlID0gVElMRVBST19QSVBFTElORV9ZMjsKICAgfQogCiAgIC8qIEZvciBlYWNoIHBpcGUsIGZpbmQgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBmaXRzLiAqLwogICBmb3IgKHBpcGUgPSBtaW5fcGlwZTsgcGlwZSA8PSBtYXhfcGlwZTsgcGlwZSsrKQogICB7Ci0gICAgY29uc3Qgc3RydWN0IHRpbGVfb3Bjb2RlICpvcGM7Ci0gICAgc3RydWN0IHRpbGVfZGVjb2RlZF9pbnN0cnVjdGlvbiAqZDsKKyAgICBjb25zdCBzdHJ1Y3QgdGlsZXByb19vcGNvZGUgKm9wYzsKKyAgICBzdHJ1Y3QgdGlsZXByb19kZWNvZGVkX2luc3RydWN0aW9uICpkOwogICAgIGludCBpOwogCiAgICAgZCA9ICZkZWNvZGVkW251bV9pbnN0cnVjdGlvbnMrK107Ci0gICAgb3BjID0gZmluZF9vcGNvZGUgKGJpdHMsICh0aWxlX3BpcGVsaW5lKXBpcGUpOworICAgIG9wYyA9IGZpbmRfb3Bjb2RlIChiaXRzLCAodGlsZXByb19waXBlbGluZSlwaXBlKTsKICAgICBkLT5vcGNvZGUgPSBvcGM7CiAKICAgICAvKiBEZWNvZGUgZWFjaCBvcGVyYW5kLCBzaWduIGV4dGVuZGluZywgZXRjLiBhcyBhcHByb3ByaWF0ZS4gKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgb3BjLT5udW1fb3BlcmFuZHM7IGkrKykKICAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgdGlsZV9vcGVyYW5kICpvcCA9Ci0gICAgICAgICZ0aWxlX29wZXJhbmRzW29wYy0+b3BlcmFuZHNbcGlwZV1baV1dOworICAgICAgY29uc3Qgc3RydWN0IHRpbGVwcm9fb3BlcmFuZCAqb3AgPQorICAgICAgICAmdGlsZXByb19vcGVyYW5kc1tvcGMtPm9wZXJhbmRzW3BpcGVdW2ldXTsKICAgICAgIGludCBvcHZhbCA9IG9wLT5leHRyYWN0IChiaXRzKTsKICAgICAgIGlmIChvcC0+aXNfc2lnbmVkKQogICAgICAgewpAQCAtMjQ4Myw5ICsyNTg5LDkgQEAKICAgICAgIH0KIAogICAgICAgLyogQWRqdXN0IFBDLXJlbGF0aXZlIHNjYWxlZCBicmFuY2ggb2Zmc2V0cy4gKi8KLSAgICAgIGlmIChvcC0+dHlwZSA9PSBUSUxFX09QX1RZUEVfQUREUkVTUykKKyAgICAgIGlmIChvcC0+dHlwZSA9PSBUSUxFUFJPX09QX1RZUEVfQUREUkVTUykKICAgICAgIHsKLSAgICAgICAgb3B2YWwgKj0gVElMRV9CVU5ETEVfU0laRV9JTl9CWVRFUzsKKyAgICAgICAgb3B2YWwgKj0gVElMRVBST19CVU5ETEVfU0laRV9JTl9CWVRFUzsKICAgICAgICAgb3B2YWwgKz0gKGludClwYzsKICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfNjQuYyBiL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzY0LmMKaW5kZXggZDU3MDA3YmUuLjY1YjVmOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvdGlsZS1kZXNjXzY0LmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC90aWxlLWRlc2NfNjQuYwpAQCAtMSwzICsxLDIzIEBACisvKiBUSUxFLUd4IG9wY29kZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqCisgKgorICoKKyAqLworCiAvKiBUaGlzIGRlZmluZSBpcyBCRkRfUkVMT0NfIyN4IGZvciByZWFsIGJmZCwgb3IgLTEgZm9yIGV2ZXJ5b25lIGVsc2UuICovCiAjZGVmaW5lIEJGRF9SRUxPQyh4KSAtMQogCkBAIC02LDEwICsyNiw4IEBACiAjZGVmaW5lIFRSRUdfU04gNTYKICNkZWZpbmUgVFJFR19aRVJPIDYzCiAKLS8qIEZJWE1FOiBSZW5hbWUgdGhpcy4gKi8KLSNpbmNsdWRlIDxhc20vb3Bjb2RlLXRpbGVfNjQuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGFzbS90aWxlLWRlc2MuaD4KIAogY29uc3Qgc3RydWN0IHRpbGVneF9vcGNvZGUgdGlsZWd4X29wY29kZXNbMzM0XSA9CiB7CkBAIC0yMDQwLDEyICsyMDU4LDEyIEBACiAgICAgY3JlYXRlX0JyT2ZmX1gxLCBnZXRfQnJPZmZfWDEKICAgfSwKICAgewotICAgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKE5PTkUpLAorICAgIFRJTEVHWF9PUF9UWVBFX0lNTUVESUFURSwgQkZEX1JFTE9DKFRJTEVHWF9NTVNUQVJUX1gwKSwKICAgICA2LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9CRlN0YXJ0X1gwLCBnZXRfQkZTdGFydF9YMAogICB9LAogICB7Ci0gICAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoTk9ORSksCisgICAgVElMRUdYX09QX1RZUEVfSU1NRURJQVRFLCBCRkRfUkVMT0MoVElMRUdYX01NRU5EX1gwKSwKICAgICA2LCAwLCAwLCAwLCAwLCAwLAogICAgIGNyZWF0ZV9CRkVuZF9YMCwgZ2V0X0JGRW5kX1gwCiAgIH0sCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RyYXBzLmMgYi9hcmNoL3RpbGUva2VybmVsL3RyYXBzLmMKaW5kZXggZjk4MDNkZi4uNGY0N2I4YSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdHJhcHMuYwpAQCAtMTksMTMgKzE5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGUtdGlsZS5oPgotI2luY2x1ZGUgPGFzbS9vcGNvZGVfY29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNpbmNsdWRlIDxhcmNoL2ludGVycnVwdHMuaD4KICNpbmNsdWRlIDxhcmNoL3Nwcl9kZWYuaD4KKyNpbmNsdWRlIDxhcmNoL29wY29kZS5oPgogCiB2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKIHsKQEAgLTEzNSw3ICsxMzQsNyBAQAogCWlmIChnZXRfVW5hcnlPcGNvZGVFeHRlbnNpb25fWDEoYnVuZGxlKSAhPSBJTExfVU5BUllfT1BDT0RFX1gxKQogCQlyZXR1cm4gMDsKICNlbHNlCi0JaWYgKGJ1bmRsZSAmIFRJTEVfQlVORExFX1lfRU5DT0RJTkdfTUFTSykKKwlpZiAoYnVuZGxlICYgVElMRVBST19CVU5ETEVfWV9FTkNPRElOR19NQVNLKQogCQlyZXR1cm4gMDsKIAlpZiAoZ2V0X09wY29kZV9YMShidW5kbGUpICE9IFNIVU5fMF9PUENPREVfWDEpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2xpYi9leHBvcnRzLmMgYi9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYwppbmRleCA0OTI4NGZhLi5hODdkMmE4IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYworKysgYi9hcmNoL3RpbGUvbGliL2V4cG9ydHMuYwpAQCAtNzksOCArNzksNiBAQAogaW50NjRfdCBfX21vZGRpMyhpbnQ2NF90IGRpdmlkZW5kLCBpbnQ2NF90IGRpdmlzb3IpOwogRVhQT1JUX1NZTUJPTChfX21vZGRpMyk7CiAjaWZuZGVmIF9fdGlsZWd4X18KLXVpbnQ2NF90IF9fbGxfbXVsKHVpbnQ2NF90IG4wLCB1aW50NjRfdCBuMSk7Ci1FWFBPUlRfU1lNQk9MKF9fbGxfbXVsKTsKIGludDY0X3QgX19tdWxkaTMoaW50NjRfdCwgaW50NjRfdCk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKIHVpbnQ2NF90IF9fbHNocmRpMyh1aW50NjRfdCwgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5jaGFyIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKaW5kZXggNzBkYWJkMS4uYjlkN2M0MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmNoYXIKKysrIGIvYXJjaC91bS9LY29uZmlnLmNoYXIKQEAgLTEsNSArMSw0IEBACi0KLW1lbnUgIkNoYXJhY3RlciBEZXZpY2VzIgorbWVudSAiVU1MIENoYXJhY3RlciBEZXZpY2VzIgogCiBjb25maWcgU1RERVJSX0NPTlNPTEUKIAlib29sICJzdGRlcnIgY29uc29sZSIKQEAgLTEwNSw5MiArMTA0LDYgQEAKICAgICAgICAgICB0aGlzIGlmIHlvdSBleHBlY3QgdGhlIFVNTCB0aGF0IHlvdSBidWlsZCB0byBiZSBydW4gaW4gZW52aXJvbm1lbnRzCiAgICAgICAgICAgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCBvZiAvZGV2L3B0eSogZGV2aWNlcy4KIAotY29uZmlnIFVOSVg5OF9QVFlTCi0JYm9vbCAiVW5peDk4IFBUWSBzdXBwb3J0IgotCWhlbHAKLQkgIEEgcHNldWRvIHRlcm1pbmFsIChQVFkpIGlzIGEgc29mdHdhcmUgZGV2aWNlIGNvbnNpc3Rpbmcgb2YgdHdvCi0JICBoYWx2ZXM6IGEgbWFzdGVyIGFuZCBhIHNsYXZlLiBUaGUgc2xhdmUgZGV2aWNlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsOyB0aGUgbWFzdGVyIGRldmljZSBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0bwotCSAgcmVhZCBkYXRhIGZyb20gYW5kIHdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlLCB0aGVyZWJ5IGVtdWxhdGluZyBhCi0JICB0ZXJtaW5hbC4gVHlwaWNhbCBwcm9ncmFtcyBmb3IgdGhlIG1hc3RlciBzaWRlIGFyZSB0ZWxuZXQgc2VydmVycwotCSAgYW5kIHh0ZXJtcy4KLQotCSAgTGludXggaGFzIHRyYWRpdGlvbmFsbHkgdXNlZCB0aGUgQlNELWxpa2UgbmFtZXMgL2Rldi9wdHl4eCBmb3IKLQkgIG1hc3RlcnMgYW5kIC9kZXYvdHR5eHggZm9yIHNsYXZlcyBvZiBwc2V1ZG8gdGVybWluYWxzLiBUaGlzIHNjaGVtZQotCSAgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLiBUaGUgR05VIEMgbGlicmFyeSBnbGliYyAyLjEgYW5kIGxhdGVyLAotCSAgaG93ZXZlciwgc3VwcG9ydHMgdGhlIFVuaXg5OCBuYW1pbmcgc3RhbmRhcmQ6IGluIG9yZGVyIHRvIGFjcXVpcmUgYQotCSAgcHNldWRvIHRlcm1pbmFsLCBhIHByb2Nlc3Mgb3BlbnMgL2Rldi9wdG14OyB0aGUgbnVtYmVyIG9mIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIGlzIHRoZW4gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgYW5kIHRoZSBwc2V1ZG8KLQkgIHRlcm1pbmFsIHNsYXZlIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3B0cy88bnVtYmVyPi4gV2hhdCB3YXMKLQkgIHRyYWRpdGlvbmFsbHkgL2Rldi90dHlwMiB3aWxsIHRoZW4gYmUgL2Rldi9wdHMvMiwgZm9yIGV4YW1wbGUuCi0KLQkgIEFsbCBtb2Rlcm4gTGludXggc3lzdGVtcyB1c2UgdGhlIFVuaXg5OCBwdHlzLiAgU2F5IFkgdW5sZXNzCi0JICB5b3UncmUgb24gYW4gZW1iZWRkZWQgc3lzdGVtIGFuZCB3YW50IHRvIGNvbnNlcnZlIG1lbW9yeS4KLQotY29uZmlnIExFR0FDWV9QVFlTCi0JYm9vbCAiTGVnYWN5IChCU0QpIFBUWSBzdXBwb3J0IgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEEgcHNldWRvIHRlcm1pbmFsIChQVFkpIGlzIGEgc29mdHdhcmUgZGV2aWNlIGNvbnNpc3Rpbmcgb2YgdHdvCi0JICBoYWx2ZXM6IGEgbWFzdGVyIGFuZCBhIHNsYXZlLiBUaGUgc2xhdmUgZGV2aWNlIGJlaGF2ZXMgaWRlbnRpY2FsIHRvCi0JICBhIHBoeXNpY2FsIHRlcm1pbmFsOyB0aGUgbWFzdGVyIGRldmljZSBpcyB1c2VkIGJ5IGEgcHJvY2VzcyB0bwotCSAgcmVhZCBkYXRhIGZyb20gYW5kIHdyaXRlIGRhdGEgdG8gdGhlIHNsYXZlLCB0aGVyZWJ5IGVtdWxhdGluZyBhCi0JICB0ZXJtaW5hbC4gVHlwaWNhbCBwcm9ncmFtcyBmb3IgdGhlIG1hc3RlciBzaWRlIGFyZSB0ZWxuZXQgc2VydmVycwotCSAgYW5kIHh0ZXJtcy4KLQotCSAgTGludXggaGFzIHRyYWRpdGlvbmFsbHkgdXNlZCB0aGUgQlNELWxpa2UgbmFtZXMgL2Rldi9wdHl4eAotCSAgZm9yIG1hc3RlcnMgYW5kIC9kZXYvdHR5eHggZm9yIHNsYXZlcyBvZiBwc2V1ZG8KLQkgIHRlcm1pbmFscy4gVGhpcyBzY2hlbWUgaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLCBpbmNsdWRpbmcKLQkgIHNlY3VyaXR5LiAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGVzZSBsZWdhY3kgZGV2aWNlczsgb24gbW9zdAotCSAgc3lzdGVtcywgaXQgaXMgc2FmZSB0byBzYXkgTi4KLQotY29uZmlnIFJBV19EUklWRVIKLSAgICAgICAgdHJpc3RhdGUgIlJBVyBkcml2ZXIgKC9kZXYvcmF3L3Jhd04pIgotCWRlcGVuZHMgb24gQkxPQ0sKLSAgICAgICAgaGVscAotICAgICAgICAgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLgotICAgICAgICAgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4KLSAgICAgICAgICBTZWUgdGhlIHJhdyg4KSBtYW5wYWdlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICAgICAgICBBcHBsaWNhdGlvbnMgc2hvdWxkIHByZWZlcmFibHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCi0gICAgICAgICAgd2l0aCB0aGUgT19ESVJFQ1QgZmxhZy4KLQotY29uZmlnIE1BWF9SQVdfREVWUwotICAgICAgICBpbnQgIk1heGltdW0gbnVtYmVyIG9mIFJBVyBkZXZpY2VzIHRvIHN1cHBvcnQgKDEtODE5MikiCi0gICAgICAgIGRlcGVuZHMgb24gUkFXX0RSSVZFUgotICAgICAgICBkZWZhdWx0ICIyNTYiCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgUkFXIGRldmljZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgIERlZmF1bHQgaXMgMjU2LiBJbmNyZWFzZSB0aGlzIG51bWJlciBpbiBjYXNlIHlvdSBuZWVkIGxvdHMgb2YKLSAgICAgICAgICByYXcgZGV2aWNlcy4KLQotY29uZmlnIExFR0FDWV9QVFlfQ09VTlQKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFkgaW4gdXNlIgotCWRlcGVuZHMgb24gTEVHQUNZX1BUWVMKLQlkZWZhdWx0ICIyNTYiCi0JaGVscAotCSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxlZ2FjeSBQVFlzIHRoYXQgY2FuIGJlIHVzZWQgYXQgYW55IG9uZSB0aW1lLgotCSAgVGhlIGRlZmF1bHQgaXMgMjU2LCBhbmQgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guICBFbWJlZGRlZAotCSAgc3lzdGVtcyBtYXkgd2FudCB0byByZWR1Y2UgdGhpcyB0byBzYXZlIG1lbW9yeS4KLQotCSAgV2hlbiBub3QgaW4gdXNlLCBlYWNoIGxlZ2FjeSBQVFkgb2NjdXBpZXMgMTIgYnl0ZXMgb24gMzItYml0Ci0JICBhcmNoaXRlY3R1cmVzIGFuZCAyNCBieXRlcyBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4KLQotY29uZmlnIFdBVENIRE9HCi0JYm9vbCAiV2F0Y2hkb2cgVGltZXIgU3VwcG9ydCIKLQotY29uZmlnIFdBVENIRE9HX05PV0FZT1VUCi0JYm9vbCAiRGlzYWJsZSB3YXRjaGRvZyBzaHV0ZG93biBvbiBjbG9zZSIKLQlkZXBlbmRzIG9uIFdBVENIRE9HCi0KLWNvbmZpZyBTT0ZUX1dBVENIRE9HCi0JdHJpc3RhdGUgIlNvZnR3YXJlIFdhdGNoZG9nIgotCWRlcGVuZHMgb24gV0FUQ0hET0cKLQotY29uZmlnIFVNTF9XQVRDSERPRwotCXRyaXN0YXRlICJVTUwgd2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBXQVRDSERPRwotCiBjb25maWcgVU1MX1NPVU5ECiAJdHJpc3RhdGUgIlNvdW5kIHN1cHBvcnQiCiAJaGVscApAQCAtMjExLDI5ICsxMjQsNCBAQAogCXRyaXN0YXRlCiAJZGVmYXVsdCBVTUxfU09VTkQKIAotI0l0IGlzIHNlbGVjdGVkIGVsc2V3aGVyZSwgc28ga2NvbmZpZyB3b3VsZCB3YXJuIHdpdGhvdXQgdGhpcy4KLWNvbmZpZyBIV19SQU5ET00KLQl0cmlzdGF0ZQotCWRlZmF1bHQgbgotCi1jb25maWcgVU1MX1JBTkRPTQotCXRyaXN0YXRlICJIYXJkd2FyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIFVNTCdzICJoYXJkd2FyZSIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBJdAotCSAgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBob3N0J3MgL2Rldi9yYW5kb20sIHN1cHBseWluZyBhcyBtdWNoIGVudHJvcHkKLQkgIGFzIHRoZSBob3N0IGhhcywgcmF0aGVyIHRoYW4gdGhlIHNtYWxsIGFtb3VudCB0aGUgVU1MIGdldHMgZnJvbSBpdHMKLQkgIG93biBkcml2ZXJzLiAgSXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyBhIHN0YW5kYXJkIGhhcmR3YXJlIHJhbmRvbSBudW1iZXIKLQkgIGdlbmVyYXRvciwgbWFqb3IgMTAsIG1pbm9yIDE4MywgYW5kIHRoZSBjYW5vbmljYWwgZGV2aWNlIG5hbWUgaXMKLQkgIC9kZXYvaHdybmcuCi0JICBUaGUgd2F5IHRvIG1ha2UgdXNlIG9mIHRoaXMgaXMgdG8gaW5zdGFsbCB0aGUgcm5nLXRvb2xzIHBhY2thZ2UKLQkgIChjaGVjayB5b3VyIGRpc3Rybywgb3IgZG93bmxvYWQgZnJvbQotCSAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9na2VybmVsLykuICBybmdkIHBlcmlvZGljYWxseSByZWFkcwotCSAgL2Rldi9od3JuZyBhbmQgaW5qZWN0cyB0aGUgZW50cm9weSBpbnRvIC9kZXYvcmFuZG9tLgotCi1jb25maWcgTU1BUFBFUgotCXRyaXN0YXRlICJpb21lbSBlbXVsYXRpb24gZHJpdmVyIgotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIGFsbG93cyBhIGhvc3QgZmlsZSB0byBiZSB1c2VkIGFzIGVtdWxhdGVkIElPIG1lbW9yeSBpbnNpZGUKLQkgIFVNTC4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLnJlc3QgYi9hcmNoL3VtL0tjb25maWcucmVzdAppbmRleCAwY2NhZDBmLi41NjdlYjVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcucmVzdAorKysgYi9hcmNoL3VtL0tjb25maWcucmVzdApAQCAtMiwyMCArMiwxNCBAQAogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCiAKLXNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgotCiBzb3VyY2UgImFyY2gvdW0vS2NvbmZpZy5jaGFyIgogCi1zb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAibmV0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLm5ldCIKIAotc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvY29ubmVjdG9yL0tjb25maWciCi0KIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAogc291cmNlICJzZWN1cml0eS9LY29uZmlnIgpAQCAtMjQsMTkgKzE4LDQgQEAKIAogc291cmNlICJsaWIvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3Njc2kvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL21kL0tjb25maWciCi0KLWlmIEJST0tFTgotCXNvdXJjZSAiZHJpdmVycy9tdGQvS2NvbmZpZyIKLWVuZGlmCi0KLXNvdXJjZSAiZHJpdmVycy9sZWRzL0tjb25maWciCi0KLSNUaGlzIGlzIGp1c3QgdG8gc2h1dCB1cCBzb21lIEtjb25maWcgd2FybmluZ3MsIHNvIG5vIHByb21wdC4KLWNvbmZpZyBJTlBVVAotCXRyaXN0YXRlCi0JZGVmYXVsdCBuCi0KIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnLmRlYnVnIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLnVtIGIvYXJjaC91bS9LY29uZmlnLnVtCmluZGV4IGI1ZTY3NWUuLjcwZmQ2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy51bQorKysgYi9hcmNoL3VtL0tjb25maWcudW0KQEAgLTE0OCw1ICsxNDgsMTEgQEAKIAkgIGJlIDEgPDwgb3JkZXIgcGFnZXMuICBUaGUgZGVmYXVsdCBpcyBPSyB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgVmFsZ3JpbmQKIAkgIG9uIFVNTCwgaW4gd2hpY2ggY2FzZSwgc2V0IHRoaXMgdG8gMy4KIAorY29uZmlnIE1NQVBQRVIKKwl0cmlzdGF0ZSAiaW9tZW0gZW11bGF0aW9uIGRyaXZlciIKKwloZWxwCisJICBUaGlzIGRyaXZlciBhbGxvd3MgYSBob3N0IGZpbGUgdG8gYmUgdXNlZCBhcyBlbXVsYXRlZCBJTyBtZW1vcnkgaW5zaWRlCisJICBVTUwuCisKIGNvbmZpZyBOT19ETUEKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcueDg2IGIvYXJjaC91bS9LY29uZmlnLng4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZWJlNi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL0tjb25maWcueDg2CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotbWFpbm1lbnUgIlVzZXIgTW9kZSBMaW51eC8kU1VCQVJDSCAkS0VSTkVMVkVSU0lPTiBLZXJuZWwgQ29uZmlndXJhdGlvbiIKLQotc291cmNlICJhcmNoL3VtL0tjb25maWcuY29tbW9uIgotCi1tZW51ICJVTUwtc3BlY2lmaWMgb3B0aW9ucyIKLQotbWVudSAiSG9zdCBwcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCi0KLWNvbmZpZyBDTVBYQ0hHX0xPQ0FMCi0JYm9vbAotCWRlZmF1bHQgbgotCi1jb25maWcgQ01QWENIR19ET1VCTEUKLQlib29sCi0JZGVmYXVsdCBuCi0KLXNvdXJjZSAiYXJjaC94ODYvS2NvbmZpZy5jcHUiCi0KLWVuZG1lbnUKLQotY29uZmlnIFVNTF9YODYKLQlkZWZfYm9vbCB5Ci0Jc2VsZWN0IEdFTkVSSUNfRklORF9GSVJTVF9CSVQKLQotY29uZmlnIDY0QklUCi0JYm9vbAotCWRlZmF1bHQgU1VCQVJDSCA9ICJ4ODZfNjQiCi0KLWNvbmZpZyBYODZfMzIKLQlkZWZfYm9vbCAhNjRCSVQKLQlzZWxlY3QgSEFWRV9BT1VUCi0KLWNvbmZpZyBYODZfNjQKLQlkZWZfYm9vbCA2NEJJVAotCi1jb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KLQlkZWZfYm9vbCBYODZfWEFERCAmJiA2NEJJVAotCi1jb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwotCWRlZl9ib29sICFSV1NFTV9YQ0hHQUREX0FMR09SSVRITQotCi1jb25maWcgM19MRVZFTF9QR1RBQkxFUwotCWJvb2wgIlRocmVlLWxldmVsIHBhZ2V0YWJsZXMgKEVYUEVSSU1FTlRBTCkiIGlmICE2NEJJVAotCWRlZmF1bHQgNjRCSVQKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWhlbHAKLQlUaHJlZS1sZXZlbCBwYWdldGFibGVzIHdpbGwgbGV0IFVNTCBoYXZlIG1vcmUgdGhhbiA0RyBvZiBwaHlzaWNhbAotCW1lbW9yeS4gIEFsbCB0aGUgbWVtb3J5IHRoYXQgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHdpbGwgYmUgdHJlYXRlZAotCWFzIGhpZ2ggbWVtb3J5LgotCi0JSG93ZXZlciwgdGhpcyBpdCBleHBlcmltZW50YWwgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIHNvIGlmIHVuc3VyZSBzYXkKLQlOIChvbiB4ODYtNjQgaXQncyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQsIGluc3RlYWQsIGFzIGl0J3Mgc2FmZSB0aGVyZSkuCi0KLWNvbmZpZyBBUkNIX0hBU19TQ19TSUdOQUxTCi0JZGVmX2Jvb2wgITY0QklUCi0KLWNvbmZpZyBBUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQQotCWRlZl9ib29sICE2NEJJVAotCi1jb25maWcgU01QX0JST0tFTgotCWRlZl9ib29sIDY0QklUCi0KLWNvbmZpZyBHRU5FUklDX0hXRUlHSFQKLQlkZWZfYm9vbCB5Ci0KLXNvdXJjZSAiYXJjaC91bS9LY29uZmlnLnVtIgotCi1lbmRtZW51Ci0KLXNvdXJjZSAiYXJjaC91bS9LY29uZmlnLnJlc3QiCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCBjMGY3MTJjLi43NzMwYWY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTIwLDE1ICsyMCwyNyBAQAogCiBNT0RFX0lOQ0xVREUJKz0gLUkkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL3NrYXMKIAorSEVBREVSX0FSQ0ggCTo9ICQoU1VCQVJDSCkKKworIyBBZGRpdGlvbmFsIEFSQ0ggc2V0dGluZ3MgZm9yIHg4NgoraWZlcSAoJChTVUJBUkNIKSxpMzg2KQorICAgICAgICBIRUFERVJfQVJDSCA6PSB4ODYKK2VuZGlmCitpZmVxICgkKFNVQkFSQ0gpLHg4Nl82NCkKKyAgICAgICAgSEVBREVSX0FSQ0ggOj0geDg2CitlbmRpZgorCitIT1NUX0RJUiA6PSBhcmNoLyQoSEVBREVSX0FSQ0gpCisKIGluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS1za2FzCitpbmNsdWRlICQoc3JjdHJlZSkvJChIT1NUX0RJUikvTWFrZWZpbGUudW0KKworY29yZS15ICs9ICQoSE9TVF9ESVIpL3VtLwogCiBTSEFSRURfSEVBREVSUwk6PSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZAogQVJDSF9JTkNMVURFCTo9IC1JJChzcmN0cmVlKS8kKFNIQVJFRF9IRUFERVJTKQotQVJDSF9JTkNMVURFCSs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS9zaGFyZWQKLWlmbmVxICgkKEtCVUlMRF9TUkMpLCkKLUFSQ0hfSU5DTFVERQkrPSAtSSQoU0hBUkVEX0hFQURFUlMpCi1lbmRpZgotS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKQorQVJDSF9JTkNMVURFCSs9IC1JJChzcmN0cmVlKS8kKEhPU1RfRElSKS91bS9zaGFyZWQKK0tCVUlMRF9DUFBGTEFHUyArPSAtSSQoc3JjdHJlZSkvJChIT1NUX0RJUikvdW0KIAogIyAtRHZtYXA9a2VybmVsX3ZtYXAgcHJldmVudHMgYW55dGhpbmcgZnJvbSByZWZlcmVuY2luZyB0aGUgbGlicGNhcC5vIHN5bWJvbCBzbwogIyBuYW1lZCAtIGl0J3MgYSBjb21tb24gc3ltYm9sIGluIGxpYnBjYXAsIHNvIHdlIGdldCBhIGJpbmFyeSB3aGljaCBjcmFzaGVzLgpAQCAtNDcsMTQgKzU5LDEyIEBACiAKIFVTRVJfQ0ZMQUdTID0gJChwYXRzdWJzdCAkKEtFUk5FTF9ERUZJTkVTKSwsJChwYXRzdWJzdCAtRF9fS0VSTkVMX18sLFwKIAkkKHBhdHN1YnN0IC1JJSwsJChLQlVJTERfQ0ZMQUdTKSkpKSAkKEFSQ0hfSU5DTFVERSkgJChNT0RFX0lOQ0xVREUpIFwKLQkkKGZpbHRlciAtSSUsJChDRkxBR1MpKSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0Ci0KLWluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCisJJChmaWx0ZXIgLUklLCQoQ0ZMQUdTKSkgLURfRklMRV9PRkZTRVRfQklUUz02NCAtaWRpcmFmdGVyIGluY2x1ZGUKIAogI1RoaXMgd2lsbCBhZGp1c3QgKkZMQUdTIGFjY29yZGluZ2x5IHRvIHRoZSBwbGF0Zm9ybS4KIGluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS1vcy0kKE9TKQogCi1LQlVJTERfQ1BQRkxBR1MgKz0gLUkkKHNyY3RyZWUpL2FyY2gvJChIRUFERVJfQVJDSCkvaW5jbHVkZQorS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEhPU1RfRElSKS9pbmNsdWRlCiAKICMgLURlcnJubz1rZXJuZWxfZXJybm8gLSBUaGlzIHR1cm5zIGFsbCBrZXJuZWwgcmVmZXJlbmNlcyB0byBlcnJubyBpbnRvCiAjIGtlcm5lbF9lcnJubyB0byBzZXBhcmF0ZSB0aGVtIGZyb20gdGhlIGxpYmMgZXJybm8uICBUaGlzIGFsbG93cyAtZm5vLWNvbW1vbgpAQCAtODQsMTAgKzk0LDkgQEAKICAgZWNobyAnCQkgICBmaW5kIGluIHRoZSBrZXJuZWwgcm9vdC4nCiBlbmRlZgogCi1LQlVJTERfS0NPTkZJRyA6PSBhcmNoL3VtL0tjb25maWcuJChIRUFERVJfQVJDSCkKK0tCVUlMRF9LQ09ORklHIDo9ICQoSE9TVF9ESVIpL3VtL0tjb25maWcKIAotYXJjaHByZXBhcmU6ICQoU0hBUkVEX0hFQURFUlMpL3VzZXJfY29uc3RhbnRzLmgKLWFyY2hwcmVwYXJlOiAkKFNIQVJFRF9IRUFERVJTKS9rZXJuX2NvbnN0YW50cy5oCithcmNocHJlcGFyZTogaW5jbHVkZS9nZW5lcmF0ZWQvdXNlcl9jb25zdGFudHMuaAogCiBMSU5LLSQoQ09ORklHX0xEX1NDUklQVF9TVEFUSUMpICs9IC1zdGF0aWMKIExJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliCkBAIC0xMTgsOSArMTI3LDcgQEAKIAogIyBXaGVuIGNsZWFuaW5nIHdlIGRvbid0IGluY2x1ZGUgLmNvbmZpZywgc28gd2UgZG9uJ3QgaW5jbHVkZQogIyBUVCBvciBza2FzIG1ha2VmaWxlcyBhbmQgZG9uJ3QgY2xlYW4gc2thc19wdHJlZ3MuaC4KLUNMRUFOX0ZJTEVTICs9IGxpbnV4IHguaSBnbW9uLm91dCBcCi0JJChTSEFSRURfSEVBREVSUykvdXNlcl9jb25zdGFudHMuaCBcCi0JJChTSEFSRURfSEVBREVSUykva2Vybl9jb25zdGFudHMuaAorQ0xFQU5fRklMRVMgKz0gbGludXggeC5pIGdtb24ub3V0CiAKIGFyY2hjbGVhbjoKIAlAZmluZCAuIFwoIC1uYW1lICcqLmJiJyAtbyAtbmFtZSAnKi5iYmcnIC1vIC1uYW1lICcqLmRhJyBcCkBAIC0xMjgsOCArMTM1LDggQEAKIAogIyBHZW5lcmF0ZWQgZmlsZXMKIAotJChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkvdXNlci1vZmZzZXRzLnM6IEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChBUkNIX0RJUikvc3lzLSQoU1VCQVJDSCkgJEAKKyQoSE9TVF9ESVIpL3VtL3VzZXItb2Zmc2V0cy5zOiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoSE9TVF9ESVIpL3VtICRACiAKIGRlZmluZSBmaWxlY2hrX2dlbi1hc20tb2Zmc2V0cwogICAgICAgICAoc2V0IC1lOyBcCkBAIC0xNDQsMTEgKzE1MSw3IEBACiAgICAgICAgICBlY2hvICIiOyApCiBlbmRlZgogCi0kKFNIQVJFRF9IRUFERVJTKS91c2VyX2NvbnN0YW50cy5oOiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS91c2VyLW9mZnNldHMucworaW5jbHVkZS9nZW5lcmF0ZWQvdXNlcl9jb25zdGFudHMuaDogJChIT1NUX0RJUikvdW0vdXNlci1vZmZzZXRzLnMKIAkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCiAKLSQoU0hBUkVEX0hFQURFUlMpL2tlcm5fY29uc3RhbnRzLmg6Ci0JJChRKW1rZGlyIC1wICQoZGlyICRAKQotCSQoUSllY2hvICcjaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9nZW5lcmF0ZWQvYXNtLW9mZnNldHMuaCInID4kQAotCi1leHBvcnQgU1VCQVJDSCBVU0VSX0NGTEFHUyBDRkxBR1NfTk9fSEFSREVOSU5HIE9TIEhFQURFUl9BUkNIIERFVl9OVUxMX1BBVEgKK2V4cG9ydCBTVUJBUkNIIFVTRVJfQ0ZMQUdTIENGTEFHU19OT19IQVJERU5JTkcgT1MgREVWX05VTExfUEFUSApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2IGIvYXJjaC91bS9NYWtlZmlsZS1pMzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDJjYmU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWNvcmUteSArPSBhcmNoL3VtL3N5cy1pMzg2LyBhcmNoL3g4Ni9jcnlwdG8vCi0KLVRPUF9BRERSIDo9ICQoQ09ORklHX1RPUF9BRERSKQotCi1TVEFSVCA6PSAweDgwNDgwMDAKLQotTERGTEFHUwkJCSs9IC1tIGVsZl9pMzg2Ci1FTEZfQVJDSAkJOj0gJChTVUJBUkNIKQotRUxGX0ZPUk1BVCAJCTo9IGVsZjMyLSQoU1VCQVJDSCkKLU9CSkNPUFlGTEFHUyAgCQk6PSAtTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVMKLUhFQURFUl9BUkNICQk6PSB4ODYKLUNIRUNLRkxBR1MJKz0gLURfX2kzODZfXwotCi1pZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKLWlmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQotS0JVSUxEX0NGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotS0JVSUxEX0FGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotTElOSy15CQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQotVU1MX09CSkNPUFlGTEFHUwkrPSAtRiAkKEVMRl9GT1JNQVQpCi0KLWV4cG9ydCBMREZMQUdTIEhPU1RDRkxBR1MgSE9TVExERkxBR1MgVU1MX09CSkNPUFlGTEFHUwotZW5kaWYKLWVuZGlmCi0KLSMgRmlyc3Qgb2YgYWxsLCB0dW5lIENGTEFHUyBmb3IgdGhlIHNwZWNpZmljIENQVS4gVGhpcyBhY3R1YWxseSBzZXRzIGNmbGFncy15LgotaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQotCi0jIHByZXZlbnQgZ2NjIGZyb20ga2VlcGluZyB0aGUgc3RhY2sgMTYgYnl0ZSBhbGlnbmVkLiBUYWtlbiBmcm9tIGkzODYuCi1jZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCi0KLSMgUHJldmVudCBzcHJpbnRmIGluIG5mc2QgZnJvbSBiZWluZyBjb252ZXJ0ZWQgdG8gc3RyY3B5IGFuZCByZXN1bHRpbmcgaW4KLSMgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UuCi1jZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZwotCi0jIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSBvbiBwcmUtZ2NjLTQuMCBjb21waWxlcnMsIGl0IG1ha2VzIGdjYyB1c2UKLSMgYSBsb3QgbW9yZSBzdGFjayBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHMuICBBbHNvLCBnY2MKLSMgNC4zLjAgbmVlZHMgLWZ1bml0LWF0LWEtdGltZSBmb3IgZXh0ZXJuIGlubGluZSBmdW5jdGlvbnMuCi1LQlVJTERfQ0ZMQUdTICs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gXAotCQkJZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBcCi0JCQllbHNlIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKTsgZmkgOykKLQotS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljZDdlNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDMgLSAyMDA0IFBhdGhzY2FsZSwgSW5jCi0jIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKLQotY29yZS15ICs9IGFyY2gvdW0vc3lzLXg4Nl82NC8gYXJjaC94ODYvY3J5cHRvLwotU1RBUlQgOj0gMHg2MDAwMDAwMAotCi1fZXh0cmFfZmxhZ3NfID0gLWZuby1idWlsdGluIC1tNjQKLQotS0JVSUxEX0NGTEFHUyArPSAkKF9leHRyYV9mbGFnc18pCi0KLUNIRUNLRkxBR1MgICs9IC1tNjQgLURfX3g4Nl82NF9fCi1LQlVJTERfQUZMQUdTICs9IC1tNjQKLUxERkxBR1MgKz0gLW0gZWxmX3g4Nl82NAotS0JVSUxEX0NQUEZMQUdTICs9IC1tNjQKLQotRUxGX0FSQ0ggOj0gaTM4Njp4ODYtNjQKLUVMRl9GT1JNQVQgOj0gZWxmNjQteDg2LTY0Ci1IRUFERVJfQVJDSCA6PSB4ODYKLQotIyBOb3Qgb24gYWxsIDY0LWJpdCBkaXN0cm9zIC9saWIgaXMgYSBzeW1saW5rIHRvIC9saWI2NC4gUExEIGlzIGFuIGV4YW1wbGUuCi0KLUxJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliNjQKLUxJTksteSArPSAtbTY0Ci0KLSMgRG8gdW5pdC1hdC1hLXRpbWUgdW5jb25kaXRpb25hbGx5IG9uIHg4Nl82NCwgZm9sbG93aW5nIHRoZSBob3N0Ci1LQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bml0LWF0LWEtdGltZSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuLmggYi9hcmNoL3VtL2RyaXZlcnMvY2hhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjBmZDkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW4uaApAQCAtMCwwICsxLDUwIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX0NIQU5fS0VSTl9IX18KKyNkZWZpbmUgX19DSEFOX0tFUk5fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgImNoYW5fdXNlci5oIgorI2luY2x1ZGUgImxpbmUuaCIKKworc3RydWN0IGNoYW4geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGluZSAqbGluZTsKKwljaGFyICpkZXY7CisJdW5zaWduZWQgaW50IHByaW1hcnk6MTsKKwl1bnNpZ25lZCBpbnQgaW5wdXQ6MTsKKwl1bnNpZ25lZCBpbnQgb3V0cHV0OjE7CisJdW5zaWduZWQgaW50IG9wZW5lZDoxOworCXVuc2lnbmVkIGludCBlbmFibGVkOjE7CisJaW50IGZkOworCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOworCXZvaWQgKmRhdGE7Cit9OworCitleHRlcm4gdm9pZCBjaGFuX2ludGVycnVwdChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IGRlbGF5ZWRfd29yayAqdGFzaywKKwkJCSAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpcnEpOworZXh0ZXJuIGludCBwYXJzZV9jaGFuX3BhaXIoY2hhciAqc3RyLCBzdHJ1Y3QgbGluZSAqbGluZSwgaW50IGRldmljZSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMsIGNoYXIgKiplcnJvcl9vdXQpOworZXh0ZXJuIGludCB3cml0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sCisJCQkgICAgIGludCB3cml0ZV9pcnEpOworZXh0ZXJuIGludCBjb25zb2xlX3dyaXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGNvbnN0IGNoYXIgKmJ1ZiwgCisJCQkgICAgICBpbnQgbGVuKTsKK2V4dGVybiBpbnQgY29uc29sZV9vcGVuX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUsIHN0cnVjdCBjb25zb2xlICpjbyk7CitleHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOworZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKK2V4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOworZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKK2V4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCisJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCisJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpjb2xzX291dCk7CitleHRlcm4gaW50IGNoYW5fY29uZmlnX3N0cmluZyhzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgY2hhciAqc3RyLCBpbnQgc2l6ZSwKKwkJCSAgICAgIGNoYXIgKiplcnJvcl9vdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwppbmRleCBkNDE5MWZlLi40MjBlMmM4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgImNoYW5fa2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJvcy5oIgogCiAjaWZkZWYgQ09ORklHX05PQ09ORklHX0NIQU4KQEAgLTM1OCwxMSArMzU4LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfb25lX2NoYW4oc3RydWN0IGNoYW4gKmNoYW4sIGludCBkZWxheV9mcmVlX2lycSkKK3N0YXRpYyB2b2lkIGZyZWVfb25lX2NoYW4oc3RydWN0IGNoYW4gKmNoYW4pCiB7CiAJbGlzdF9kZWwoJmNoYW4tPmxpc3QpOwogCi0JY2xvc2Vfb25lX2NoYW4oY2hhbiwgZGVsYXlfZnJlZV9pcnEpOworCWNsb3NlX29uZV9jaGFuKGNoYW4sIDApOwogCiAJaWYgKGNoYW4tPm9wcy0+ZnJlZSAhPSBOVUxMKQogCQkoKmNoYW4tPm9wcy0+ZnJlZSkoY2hhbi0+ZGF0YSk7CkBAIC0zNzIsMTQgKzM3MiwxNCBAQAogCWtmcmVlKGNoYW4pOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBkZWxheV9mcmVlX2lycSkKK3N0YXRpYyB2b2lkIGZyZWVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbGUsICpuZXh0OwogCXN0cnVjdCBjaGFuICpjaGFuOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgY2hhbnMpIHsKIAkJY2hhbiA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3QgY2hhbiwgbGlzdCk7Ci0JCWZyZWVfb25lX2NoYW4oY2hhbiwgZGVsYXlfZnJlZV9pcnEpOworCQlmcmVlX29uZV9jaGFuKGNoYW4pOwogCX0KIH0KIApAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJY2hhciAqaW4sICpvdXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoY2hhbnMpKSB7Ci0JCWZyZWVfY2hhbihjaGFucywgMCk7CisJCWZyZWVfY2hhbihjaGFucyk7CiAJCUlOSVRfTElTVF9IRUFEKGNoYW5zKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwppbmRleCBjZmViM2Y0Li5mMTgwODEzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCkBAIC0xMSwxMCArMTEsOCBAQAogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiB2b2lkIGdlbmVyaWNfY2xvc2UoaW50IGZkLCB2b2lkICp1bnVzZWQpCiB7CkBAIC0yODMsNyArMjgxLDEyIEBACiAJCXJldHVybjsKIAogCXBpZCA9IHRjZ2V0cGdycChmZCk7Ci0JaWYgKCFpc19za2FzX3dpbmNoKHBpZCwgZmQsIHR0eSkgJiYgKHBpZCA9PSAtMSkpIHsKKwlpZiAoaXNfc2thc193aW5jaChwaWQsIGZkLCB0dHkpKSB7CisJCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCB0dHksIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKHBpZCA9PSAtMSkgewogCQl0aHJlYWQgPSB3aW5jaF90cmFtcChmZCwgdHR5LCAmdGhyZWFkX2ZkLCAmc3RhY2spOwogCQlpZiAodGhyZWFkIDwgMCkKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl91c2VyLmggYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl91c2VyLmgKcmVuYW1lIHRvIGFyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaCBiL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKaW5kZXggZjU3MDFmZC4uN2YyZWQwYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaAorKysgYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY293X21hbGxvYyhpbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggZjhlODVlMC4uYTRmZDdiYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBlbnVtIHJlcXVlc3RfdHlwZSB7IFJFUV9ORVdfQ09OVFJPTCB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZmQuYyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCmluZGV4IGY1YTk4MWEuLjViODFkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9mZC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCkBAIC05LDEwICs5LDggQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdHJ1Y3QgZmRfY2hhbiB7CiAJaW50IGZkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IDg0ZGNlM2YuLjAzNDVkNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IGRvZ19kYXRhIHsKIAlpbnQgc3RkaW47CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCAzNjRjOGExLi5jMWNmMjIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSAibGludXgva2QuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKLSNpbmNsdWRlICJjaGFuX2tlcm4uaCIKKyNpbmNsdWRlICJjaGFuLmgiCiAjaW5jbHVkZSAiaXJxX2tlcm4uaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9saW5lLmggYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xpbmUuaApyZW5hbWUgdG8gYXJjaC91bS9kcml2ZXJzL2xpbmUuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tY29uc29sZS5oIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9zaGFyZWQvbWNvbnNvbGUuaApyZW5hbWUgdG8gYXJjaC91bS9kcml2ZXJzL21jb25zb2xlLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvbWNvbnNvbGVfa2Vybi5oIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tY29uc29sZV9rZXJuLmgKcmVuYW1lIHRvIGFyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCmluZGV4IGY4Y2Y0YzguLjk5MjA5ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwpAQCAtMTAsOSArMTAsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8c3lzL3VuLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJtY29uc29sZS5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIHN0cnVjdCBtY29uc29sZV9jb21tYW5kIGNvbW1hbmRzW10gPSB7CiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKaW5kZXggNTIwMTE4OC4uMDUwOTBjMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBpbnQgdGFwX29wZW5fY29tbW9uKHZvaWQgKmRldiwgY2hhciAqZ2F0ZV9hZGRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDVmOTAzNTguLjcwMmE3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTksOSArOSw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKICNpbmNsdWRlICJwY2FwX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBQQ0FQX0ZEKHApICgqKGludCAqKShwKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IGI0OWJmNTYuLjdiMDEwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTEwLDExICsxMCw5IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJwb3J0LmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdHJ1Y3QgcG9ydF9jaGFuIHsKIAlpbnQgcmF3OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3B0eS5jIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCmluZGV4IDExMTM5MTEuLmNmZjJiNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKIAl2b2lkICgqYW5ub3VuY2UpKGNoYXIgKmRldl9uYW1lLCBpbnQgZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwppbmRleCBjYmFjZmM0Li45MzJiNGQ2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCkBAIC0xMSwxMiArMTEsMTAgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdGVybWlvcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAic2xpcC5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIGludCBzbGlwX3VzZXJfaW5pdCh2b2lkICpkYXRhLCB2b2lkICpkZXYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCBhMGFkYThmLi5kYjRhZGI2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTcsMTEgKzcsOSBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm5ldF91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzbGlycC5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RhdGljIGludCBzbGlycF91c2VyX2luaXQodm9pZCAqZGF0YSwgdm9pZCAqZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NzbC5jIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCmluZGV4IGYxNzg2ZTYuLjlkOGMyMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKQEAgLTEyLDEwICsxMiw4IEBACiAjaW5jbHVkZSAibGludXgvY29uc29sZS5oIgogI2luY2x1ZGUgImFzbS90ZXJtYml0cy5oIgogI2luY2x1ZGUgImFzbS9pcnEuaCIKLSNpbmNsdWRlICJsaW5lLmgiCiAjaW5jbHVkZSAic3NsLmgiCi0jaW5jbHVkZSAiY2hhbl9rZXJuLmgiCi0jaW5jbHVkZSAia2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJtY29uc29sZV9rZXJuLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwppbmRleCA0OTI2NmY2Li4wODg3NzZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKQEAgLTIwLDggKzIwLDcgQEAKICNpbmNsdWRlICJhc20vY3VycmVudC5oIgogI2luY2x1ZGUgImFzbS9pcnEuaCIKICNpbmNsdWRlICJzdGRpb19jb25zb2xlLmgiCi0jaW5jbHVkZSAibGluZS5oIgotI2luY2x1ZGUgImNoYW5fa2Vybi5oIgorI2luY2x1ZGUgImNoYW4uaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgogI2luY2x1ZGUgIm1jb25zb2xlX2tlcm4uaCIKICNpbmNsdWRlICJpbml0LmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKaW5kZXggNDk1ODU4YS4uYTk3MzkxZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwpAQCAtNywxMCArNyw4IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogc3RydWN0IHR0eV9jaGFuIHsKIAljaGFyICpkZXY7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IDYyMGY1YjcuLjk0NDQ1M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAiYXNtL3RsYmZsdXNoLmgiCiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKLSNpbmNsdWRlICJrZXJuLmgiCiAjaW5jbHVkZSAibWNvbnNvbGVfa2Vybi5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJpcnFfdXNlci5oIgpAQCAtNTQsNyArNTMsNiBAQAogI2luY2x1ZGUgInViZF91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJtZW0uaCIKLSNpbmNsdWRlICJtZW1fa2Vybi5oIgogI2luY2x1ZGUgImNvdy5oIgogCiBlbnVtIHViZF9yZXEgeyBVQkRfUkVBRCwgVUJEX1dSSVRFIH07CkBAIC01MTMsOCArNTExLDM3IEBACiBzdGF0aWMgaW5saW5lIGludCB1YmRfZmlsZV9zaXplKHN0cnVjdCB1YmQgKnViZF9kZXYsIF9fdTY0ICpzaXplX291dCkKIHsKIAljaGFyICpmaWxlOworCWludCBmZDsKKwlpbnQgZXJyOwogCi0JZmlsZSA9IHViZF9kZXYtPmNvdy5maWxlID8gdWJkX2Rldi0+Y293LmZpbGUgOiB1YmRfZGV2LT5maWxlOworCV9fdTMyIHZlcnNpb247CisJX191MzIgYWxpZ247CisJY2hhciAqYmFja2luZ19maWxlOworCXRpbWVfdCBtdGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwlpbnQgc2VjdG9yX3NpemU7CisJaW50IGJpdG1hcF9vZmZzZXQ7CisKKwlpZiAodWJkX2Rldi0+ZmlsZSAmJiB1YmRfZGV2LT5jb3cuZmlsZSkgeworCQlmaWxlID0gdWJkX2Rldi0+Y293LmZpbGU7CisKKwkJZ290byBvdXQ7CisJfQorCisJZmQgPSBvc19vcGVuX2ZpbGUodWJkX2Rldi0+ZmlsZSwgZ2xvYmFsX29wZW5mbGFncywgMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJZXJyID0gcmVhZF9jb3dfaGVhZGVyKGZpbGVfcmVhZGVyLCAmZmQsICZ2ZXJzaW9uLCAmYmFja2luZ19maWxlLCBcCisJCSZtdGltZSwgJnNpemUsICZzZWN0b3Jfc2l6ZSwgJmFsaWduLCAmYml0bWFwX29mZnNldCk7CisJb3NfY2xvc2VfZmlsZShmZCk7CisKKwlpZihlcnIgPT0gLUVJTlZBTCkKKwkJZmlsZSA9IHViZF9kZXYtPmZpbGU7CisJZWxzZQorCQlmaWxlID0gYmFja2luZ19maWxlOworCitvdXQ6CiAJcmV0dXJuIG9zX2ZpbGVfc2l6ZShmaWxlLCBzaXplX291dCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKaW5kZXggYjU5MWJiOS4uMDA3Yjk0ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogI2luY2x1ZGUgImFzbS90eXBlcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ1YmRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAiY293LmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3ViZF91c2VyLmggYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91YmRfdXNlci5oCnJlbmFtZSB0byBhcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3VtY2FzdF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYwppbmRleCA1OWM1NmZkLi4wMTBmYTJkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdW1jYXN0X3VzZXIuYwpAQCAtMTUsMTEgKzE1LDkgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInVtY2FzdC5oIgogI2luY2x1ZGUgIm5ldF91c2VyLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luICpuZXdfYWRkcihjaGFyICphZGRyLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ZkZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYwppbmRleCBjNWM0MzI1Li5iOGMyODY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdmRlX3VzZXIuYwpAQCAtNiwxMCArNiw4IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaWJ2ZGVwbHVnLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgInVtX21hbGxvYy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ2ZGUuaCIKIAogc3RhdGljIGludCB2ZGVfdXNlcl9pbml0KHZvaWQgKmRhdGEsIHZvaWQgKmRldikKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKaW5kZXggMmUxZGU1Ny4uOTY5MTEwZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTExLDEwICsxMSw4IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAieHRlcm0uaCIKIAogc3RydWN0IHh0ZXJtX2NoYW4gewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFmNDUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTAsMCArMSwzIEBACitnZW5lcmljLXkgKz0gYnVnLmggY3B1dGltZS5oIGRldmljZS5oIGVtZXJnZW5jeS1yZXN0YXJ0LmggZnV0ZXguaCBoYXJkaXJxLmgKK2dlbmVyaWMteSArPSBod19pcnEuaCBpcnFfcmVncy5oIGtkZWJ1Zy5oIHBlcmNwdS5oIHNlY3Rpb25zLmggdG9wb2xvZ3kuaCB4b3IuaAorZ2VuZXJpYy15ICs9IGZ0cmFjZS5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2J1Zy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9idWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzM2I4Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2J1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fVU1fQlVHX0gKLSNkZWZpbmUgX19VTV9CVUdfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwMTM2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1VNX0NIRUNLU1VNX0gKLSNkZWZpbmUgX19VTV9DSEVDS1NVTV9ICi0KLSNpbmNsdWRlICJzeXNkZXAvY2hlY2tzdW0uaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vY3B1dGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRhY2JhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9fVU1fQ1BVVElNRV9ICi0jZGVmaW5lIF9fVU1fQ1BVVElNRV9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+Ci0KLSNlbmRpZiAvKiBfX1VNX0NQVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9kZXZpY2UuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Zjk4NzIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9kZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyoKLSAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCi0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgotICovCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+Ci0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4ZDhjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9FTUVSR0VOQ1lfUkVTVEFSVF9ICi0jZGVmaW5lIF9BU01fRU1FUkdFTkNZX1JFU1RBUlRfSAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZW1lcmdlbmN5LXJlc3RhcnQuaD4KLQotI2VuZGlmIC8qIF9BU01fRU1FUkdFTkNZX1JFU1RBUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9mdXRleC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9mdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTMzMmE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vZnV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX0ZVVEVYX0gKLSNkZWZpbmUgX0FTTV9GVVRFWF9ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2MwNWEuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaGFyZGlycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vaHdfaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjg0Y2YuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9od19pcnEuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1VNX0hXX0lSUV9ICi0jZGVmaW5lIF9BU01fVU1fSFdfSVJRX0gKLQotI2luY2x1ZGUgImFzbS9pcnEuaCIKLSNpbmNsdWRlICJhc20vYXJjaHBhcmFtLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ5YzBiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaXJxX3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCmluZGV4IDY1OWI5YWIuLmM3ODBkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKQEAgLTEsNiArMSw0MiBAQAogI2lmbmRlZiBfX1VNX0lSUUZMQUdTX0gKICNkZWZpbmUgX19VTV9JUlFGTEFHU19ICiAKLS8qIEVtcHR5IGZvciBub3cgKi8KK2V4dGVybiBpbnQgZ2V0X3NpZ25hbHModm9pZCk7CitleHRlcm4gaW50IHNldF9zaWduYWxzKGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKTsKK2V4dGVybiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQoreworCXJldHVybiBnZXRfc2lnbmFscygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXNldF9zaWduYWxzKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQoreworCXVuYmxvY2tfc2lnbmFscygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQoreworCWJsb2NrX3NpZ25hbHMoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWZsYWdzID0gYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKCk7CisJYXJjaF9sb2NhbF9pcnFfZGlzYWJsZSgpOworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSBib29sIGFyY2hfaXJxc19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKSA9PSAwOworfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlMWIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMva2RlYnVnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCBjZjI1OWRlLi4zMDUwOWI5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vbW11LmgKQEAgLTEsMTIgKzEsMjQgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpZm5kZWYgX19NTVVfSAotI2RlZmluZSBfX01NVV9ICisjaWZuZGVmIF9fQVJDSF9VTV9NTVVfSAorI2RlZmluZSBfX0FSQ0hfVU1fTU1VX0gKIAotI2luY2x1ZGUgInVtX21tdS5oIgorI2luY2x1ZGUgIm1tX2lkLmgiCisjaW5jbHVkZSA8YXNtL21tX2NvbnRleHQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgbW1fY29udGV4dCB7CisJc3RydWN0IG1tX2lkIGlkOworCXN0cnVjdCB1bWxfYXJjaF9tbV9jb250ZXh0IGFyY2g7CisJc3RydWN0IHBhZ2UgKipzdHViX3BhZ2VzOworfSBtbV9jb250ZXh0X3Q7CisKK2V4dGVybiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7CisKKy8qIEF2b2lkIHRhbmdsZWQgaW5jbHVzaW9uIHdpdGggYXNtL2xkdC5oICovCitleHRlcm4gbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKnRvX21tLCBzdHJ1Y3QgbW1fY29udGV4dCAqZnJvbV9tbSk7CitleHRlcm4gdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pOwogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDM0ZDgxMzAuLjU5MWIzZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTYsMTUgKzYsMTIgQEAKICNpZm5kZWYgX19VTV9NTVVfQ09OVEVYVF9ICiAjZGVmaW5lIF9fVU1fTU1VX0NPTlRFWFRfSAogCi0jaW5jbHVkZSAibGludXgvc2NoZWQuaCIKLSNpbmNsdWRlICJ1bV9tbXUuaCIKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAogZXh0ZXJuIHZvaWQgYXJjaF9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHZvaWQgYXJjaF9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCi0jZGVmaW5lIGdldF9tbXVfY29udGV4dCh0YXNrKSBkbyA7IHdoaWxlKDApCi0jZGVmaW5lIGFjdGl2YXRlX2NvbnRleHQodHNrKSBkbyA7IHdoaWxlKDApCi0KICNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCWRvIHsgfSB3aGlsZSAoMCkKIAogZXh0ZXJuIHZvaWQgZm9yY2VfZmx1c2hfYWxsKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCA0Y2M5YjZjLi43Y2ZjM2NlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTksNyArMTksNyBAQAogc3RydWN0IHBhZ2U7CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHN5c2RlcC92bS1mbGFncy5oPgorI2luY2x1ZGUgPGFzbS92bS1mbGFncy5oPgogCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxNjhkZi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVyAodW1sX3BoeXNtZW0pCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BkYS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wZGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjZDc3NC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BkYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fUERBX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fUERBX1g4Nl82NF9ICi0KLS8qIFhYWCAqLwotc3RydWN0IGZvbyB7Ci0JdW5zaWduZWQgaW50IF9fc29mdGlycV9wZW5kaW5nOwotCXVuc2lnbmVkIGludCBfX25taV9jb3VudDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZm9vIG1lOwotCi0jZGVmaW5lIHJlYWRfcGRhKG1lKSAoJm1lKQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcGVyY3B1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTc1MDguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1VNX1BFUkNQVV9ICi0jZGVmaW5lIF9fVU1fUEVSQ1BVX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BlcmNwdS5oPgotCi0jZW5kaWYgLyogX19VTV9QRVJDUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wdHJhY2UtZ2VuZXJpYy5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wdHJhY2UtZ2VuZXJpYy5oCmluZGV4IDFhN2QyNzUuLmY2MDVkM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vcHRyYWNlLWdlbmVyaWMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3B0cmFjZS1nZW5lcmljLmgKQEAgLTIzLDE3ICsyMywxMCBAQAogI2RlZmluZSBQVF9SRUdTX0lQKHIpIFVQVF9JUCgmKHIpLT5yZWdzKQogI2RlZmluZSBQVF9SRUdTX1NQKHIpIFVQVF9TUCgmKHIpLT5yZWdzKQogCi0jZGVmaW5lIFBUX1JFRyhyLCByZWcpIFVQVF9SRUcoJihyKS0+cmVncywgcmVnKQotI2RlZmluZSBQVF9SRUdTX1NFVChyLCByZWcsIHZhbCkgVVBUX1NFVCgmKHIpLT5yZWdzLCByZWcsIHZhbCkKLQotI2RlZmluZSBQVF9SRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihyLCByZXMpIFwKLQlVUFRfU0VUX1NZU0NBTExfUkVUVVJOKCYociktPnJlZ3MsIHJlcykKICNkZWZpbmUgUFRfUkVHU19SRVNUQVJUX1NZU0NBTEwocikgVVBUX1JFU1RBUlRfU1lTQ0FMTCgmKHIpLT5yZWdzKQogCiAjZGVmaW5lIFBUX1JFR1NfU1lTQ0FMTF9OUihyKSBVUFRfU1lTQ0FMTF9OUigmKHIpLT5yZWdzKQogCi0jZGVmaW5lIFBUX1JFR1NfU0MocikgVVBUX1NDKCYociktPnJlZ3MpCi0KICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSBQVF9SRUdTX0lQKHJlZ3MpCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VjdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwMjMxZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX1VNX1NFQ1RJT05TX0gKLSNkZWZpbmUgX1VNX1NFQ1RJT05TX0gKLQotLyogbm90aGluZyB0byBzZWUsIG1vdmUgYWxvbmcgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE5MGVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaWZuZGVmIF9fVU1fU1lTVEVNX0dFTkVSSUNfSAotI2RlZmluZSBfX1VNX1NZU1RFTV9HRU5FUklDX0gKLQotI2luY2x1ZGUgInN5c2RlcC9zeXN0ZW0uaCIKLQotZXh0ZXJuIGludCBnZXRfc2lnbmFscyh2b2lkKTsKLWV4dGVybiBpbnQgc2V0X3NpZ25hbHMoaW50IGVuYWJsZSk7Ci1leHRlcm4gdm9pZCBibG9ja19zaWduYWxzKHZvaWQpOwotZXh0ZXJuIHZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9zYXZlX2ZsYWdzKHZvaWQpCi17Ci0JcmV0dXJuIGdldF9zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc2V0X3NpZ25hbHMoZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCi17Ci0JdW5ibG9ja19zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCi17Ci0JYmxvY2tfc2lnbmFscygpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXJjaF9sb2NhbF9pcnFfc2F2ZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZmxhZ3MgPSBhcmNoX2xvY2FsX3NhdmVfZmxhZ3MoKTsKLQlhcmNoX2xvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0dXJuIGZsYWdzOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9pcnFzX2Rpc2FibGVkKHZvaWQpCi17Ci0JcmV0dXJuIGFyY2hfbG9jYWxfc2F2ZV9mbGFncygpID09IDA7Ci19Ci0KLWV4dGVybiB2b2lkICpfc3dpdGNoX3RvKHZvaWQgKnByZXYsIHZvaWQgKm5leHQsIHZvaWQgKmxhc3QpOwotI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkgcHJldiA9IF9zd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDVlNGYuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fVU1fVE9QT0xPR1lfSAotI2RlZmluZSBfQVNNX1VNX1RPUE9MT0dZX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBiOWE4OTVkLi4zZjIyZmJmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtNiwxNSArNiwxNSBAQAogI2lmbmRlZiBfX1VNX1VBQ0NFU1NfSAogI2RlZmluZSBfX1VNX1VBQ0NFU1NfSAogCi0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCiAvKiB0aHJlYWRfaW5mbyBoYXMgYSBtbV9zZWdtZW50X3QgaW4gaXQsIHNvIHB1dCB0aGUgZGVmaW5pdGlvbiB1cCBoZXJlICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CiB9IG1tX3NlZ21lbnRfdDsKIAotI2luY2x1ZGUgImxpbnV4L3RocmVhZF9pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAKICNkZWZpbmUgVkVSSUZZX1JFQUQgMAogI2RlZmluZSBWRVJJRllfV1JJVEUgMQpAQCAtMzgsNyArMzgsODYgQEAKIAogI2RlZmluZSBzZWdtZW50X2VxKGEsIGIpICgoYSkuc2VnID09IChiKS5zZWcpCiAKLSNpbmNsdWRlICJ1bV91YWNjZXNzLmgiCisjZGVmaW5lIF9fdW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIFwKKwkoKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgPCBUQVNLX1NJWkUpICYmIFwKKwkgKCgodW5zaWduZWQgbG9uZykgKGFkZHIpICsgKHNpemUpKSA8IFRBU0tfU0laRSkpCisKKyNkZWZpbmUgX19hY2Nlc3Nfb2tfdnN5c2NhbGwodHlwZSwgYWRkciwgc2l6ZSkgXAorCSAoKHR5cGUgPT0gVkVSSUZZX1JFQUQpICYmIFwKKwkgICgodW5zaWduZWQgbG9uZykgKGFkZHIpID49IEZJWEFERFJfVVNFUl9TVEFSVCkgJiYgXAorCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPD0gRklYQUREUl9VU0VSX0VORCkgJiYgXAorCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkgPj0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSkKKworI2RlZmluZSBfX2FkZHJfcmFuZ2Vfbm93cmFwKGFkZHIsIHNpemUpIFwKKwkoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8PSAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSkpCisKKyNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpIFwKKwkoX19hZGRyX3JhbmdlX25vd3JhcChhZGRyLCBzaXplKSAmJiBcCisJIChfX3VuZGVyX3Rhc2tfc2l6ZShhZGRyLCBzaXplKSB8fCBcCisJICBfX2FjY2Vzc19va192c3lzY2FsbCh0eXBlLCBhZGRyLCBzaXplKSB8fCBcCisJICBzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSkKKworZXh0ZXJuIGludCBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGludCBuKTsKK2V4dGVybiBpbnQgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IG4pOworCisvKgorICogc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KKyAqIEBkc3Q6ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLiAgVGhpcyBidWZmZXIgbXVzdCBiZSBhdAorICogICAgICAgICBsZWFzdCBAY291bnQgYnl0ZXMgbG9uZy4KKyAqIEBzcmM6ICAgU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLgorICoKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworCitleHRlcm4gaW50IHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKKworLyoKKyAqIF9fY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgorICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byB6ZXJvLgorICoKKyAqIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCisgKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjbGVhcmVkLgorICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCisgKi8KK2V4dGVybiBpbnQgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIGludCBsZW4pOworCisvKgorICogY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCisgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gemVyby4KKyAqCisgKiBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY2xlYXJlZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICovCitleHRlcm4gaW50IGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7CisKKy8qCisgKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KKyAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KKyAqIEBuOiAgIFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAorICoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgorICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KKyAqLworZXh0ZXJuIGludCBzdHJubGVuX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7CiAKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20veG9yLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3hvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlkYjNlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20veG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX19VTV9YT1JfSAotI2RlZmluZSBfX1VNX1hPUl9ICi0KLSNpbmNsdWRlICJhc20tZ2VuZXJpYy94b3IuaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2FzLWxheW91dC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9hcy1sYXlvdXQuaAppbmRleCBhOTJiNjc4Li44OTZlMTY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2FzLWxheW91dC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvYXMtbGF5b3V0LmgKQEAgLTYsNyArNiw3IEBACiAjaWZuZGVmIF9fU1RBUlRfSF9fCiAjZGVmaW5lIF9fU1RBUlRfSF9fCiAKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgPGdlbmVyYXRlZC9hc20tb2Zmc2V0cy5oPgogCiAvKgogICogU3RvbGVuIGZyb20gbGludXgvY29uc3QuaCwgd2hpY2ggY2FuJ3QgYmUgZGlyZWN0bHkgaW5jbHVkZWQgc2luY2UKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2NoYW5fa2Vybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTY1MTQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY2hhbl9rZXJuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX0NIQU5fS0VSTl9IX18KLSNkZWZpbmUgX19DSEFOX0tFUk5fSF9fCi0KLSNpbmNsdWRlICJsaW51eC90dHkuaCIKLSNpbmNsdWRlICJsaW51eC9saXN0LmgiCi0jaW5jbHVkZSAibGludXgvY29uc29sZS5oIgotI2luY2x1ZGUgImNoYW5fdXNlci5oIgotI2luY2x1ZGUgImxpbmUuaCIKLQotc3RydWN0IGNoYW4gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQlzdHJ1Y3QgbGluZSAqbGluZTsKLQljaGFyICpkZXY7Ci0JdW5zaWduZWQgaW50IHByaW1hcnk6MTsKLQl1bnNpZ25lZCBpbnQgaW5wdXQ6MTsKLQl1bnNpZ25lZCBpbnQgb3V0cHV0OjE7Ci0JdW5zaWduZWQgaW50IG9wZW5lZDoxOwotCXVuc2lnbmVkIGludCBlbmFibGVkOjE7Ci0JaW50IGZkOwotCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOwotCXZvaWQgKmRhdGE7Ci19OwotCi1leHRlcm4gdm9pZCBjaGFuX2ludGVycnVwdChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IGRlbGF5ZWRfd29yayAqdGFzaywKLQkJCSAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpcnEpOwotZXh0ZXJuIGludCBwYXJzZV9jaGFuX3BhaXIoY2hhciAqc3RyLCBzdHJ1Y3QgbGluZSAqbGluZSwgaW50IGRldmljZSwKLQkJCSAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMsIGNoYXIgKiplcnJvcl9vdXQpOwotZXh0ZXJuIGludCB3cml0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sCi0JCQkgICAgIGludCB3cml0ZV9pcnEpOwotZXh0ZXJuIGludCBjb25zb2xlX3dyaXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGNvbnN0IGNoYXIgKmJ1ZiwgCi0JCQkgICAgICBpbnQgbGVuKTsKLWV4dGVybiBpbnQgY29uc29sZV9vcGVuX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUsIHN0cnVjdCBjb25zb2xlICpjbyk7Ci1leHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwotZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKLWV4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOwotZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKLWV4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCi0JCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCi0JCQkgICAgIHVuc2lnbmVkIHNob3J0ICpjb2xzX291dCk7Ci1leHRlcm4gaW50IGNoYW5fY29uZmlnX3N0cmluZyhzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgY2hhciAqc3RyLCBpbnQgc2l6ZSwKLQkJCSAgICAgIGNoYXIgKiplcnJvcl9vdXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvY29tbW9uLW9mZnNldHMuaAppbmRleCA3MjAwOWM3Li5kN2ZlNTYzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2NvbW1vbi1vZmZzZXRzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9jb21tb24tb2Zmc2V0cy5oCkBAIC0yLDcgKzIsNiBAQAogCiBERUZJTkUoS0VSTkVMX01BRFZfUkVNT1ZFLCBNQURWX1JFTU9WRSk7CiAKLU9GRlNFVChIT1NUX1RBU0tfUkVHUywgdGFza19zdHJ1Y3QsIHRocmVhZC5yZWdzKTsKIE9GRlNFVChIT1NUX1RBU0tfUElELCB0YXNrX3N0cnVjdCwgcGlkKTsKIAogREVGSU5FKFVNX0tFUk5fUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9pbml0cmQuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvaW5pdHJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjczYmMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9pbml0cmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19JTklUUkRfVVNFUl9IX18KLSNkZWZpbmUgX19JTklUUkRfVVNFUl9IX18KLQotZXh0ZXJuIGludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCmluZGV4IDRjZTNmYzYuLjZjZDAxMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybi5oCkBAIC0xMywyOCArMTMsMTAgQEAKICAqIGluY2x1ZGVzLgogICovCiAKLWV4dGVybiBpbnQgZXJybm87Ci0KLWV4dGVybiBpbnQgY2xvbmUoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqc3AsIGludCBmbGFncywgdm9pZCAqZGF0YSk7Ci1leHRlcm4gaW50IHNsZWVwKGludCk7CiBleHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gY2hhciAqc3RyZXJyb3IoaW50IGVycm51bSk7Ci1leHRlcm4gY2hhciAqcHRzbmFtZShpbnQgX19mZCk7Ci1leHRlcm4gaW50IG11bm1hcCh2b2lkICosIGludCk7CiBleHRlcm4gdm9pZCAqc2JyayhpbnQgaW5jcmVtZW50KTsKLWV4dGVybiB2b2lkICptYWxsb2MoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgcGVycm9yKGNoYXIgKmVycik7Ci1leHRlcm4gaW50IGtpbGwoaW50IHBpZCwgaW50IHNpZyk7Ci1leHRlcm4gaW50IGdldHVpZCh2b2lkKTsKLWV4dGVybiBpbnQgZ2V0Z2lkKHZvaWQpOwogZXh0ZXJuIGludCBwYXVzZSh2b2lkKTsKLWV4dGVybiBpbnQgd3JpdGUoaW50LCBjb25zdCB2b2lkICosIGludCk7CiBleHRlcm4gdm9pZCBleGl0KGludCk7Ci1leHRlcm4gaW50IGNsb3NlKGludCk7Ci1leHRlcm4gaW50IHJlYWQodW5zaWduZWQgaW50LCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IHBpcGUoaW50ICopOwotZXh0ZXJuIGludCBzY2hlZF95aWVsZCh2b2lkKTsKLWV4dGVybiBpbnQgcHRyYWNlKGludCBvcCwgaW50IHBpZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9rZXJuX3V0aWwuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQva2Vybl91dGlsLmgKaW5kZXggM2MzNDEyMi4uMGYxNDgzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9rZXJuX3V0aWwuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2tlcm5fdXRpbC5oCkBAIC0yMSw3ICsyMSw2IEBACiBleHRlcm4gdm9pZCBmcmVlX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3RhY2ssIGludCBvcmRlcik7CiAKIGV4dGVybiBpbnQgZG9fc2lnbmFsKHZvaWQpOwotZXh0ZXJuIHZvaWQgY29weV9zYyhzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MsIHZvaWQgKmZyb20pOwogZXh0ZXJuIHZvaWQgaW50ZXJydXB0X2VuZCh2b2lkKTsKIGV4dGVybiB2b2lkIHJlbGF5X3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xkdC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9sZHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmOTk5YS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2xkdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+Ci0gKi8KLQotI2lmbmRlZiBfX0FTTV9MRFRfSAotI2RlZmluZSBfX0FTTV9MRFRfSAotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxzeXNkZXAvaG9zdF9sZHQuaD4KLQotZXh0ZXJuIHZvaWQgbGR0X2hvc3RfaW5mbyh2b2lkKTsKLQotI2RlZmluZSBMRFRfUEFHRVNfTUFYIFwKLQkoKExEVF9FTlRSSUVTICogTERUX0VOVFJZX1NJWkUpL1BBR0VfU0laRSkKLSNkZWZpbmUgTERUX0VOVFJJRVNfUEVSX1BBR0UgXAotCShQQUdFX1NJWkUvTERUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExEVF9ESVJFQ1RfRU5UUklFUyBcCi0JKChMRFRfUEFHRVNfTUFYKnNpemVvZih2b2lkICopKS9MRFRfRU5UUllfU0laRSkKLQotc3RydWN0IGxkdF9lbnRyeSB7Ci0JX191MzIgYTsKLQlfX3UzMiBiOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgdW1sX2xkdCB7Ci0JaW50IGVudHJ5X2NvdW50OwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXVuaW9uIHsKLQkJc3RydWN0IGxkdF9lbnRyeSAqIHBhZ2VzW0xEVF9QQUdFU19NQVhdOwotCQlzdHJ1Y3QgbGR0X2VudHJ5IGVudHJpZXNbTERUX0RJUkVDVF9FTlRSSUVTXTsKLQl9IHU7Ci19IHVtbF9sZHRfdDsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL21lbV9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL21lbV9rZXJuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmUwZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9tZW1fa2Vybi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19NRU1fS0VSTl9IX18KLSNkZWZpbmUgX19NRU1fS0VSTl9IX18KLQotI2luY2x1ZGUgImxpbnV4L2xpc3QuaCIKLSNpbmNsdWRlICJsaW51eC90eXBlcy5oIgotCi1zdHJ1Y3QgcmVtYXBwZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgKCpwcm9jKShpbnQsIHVuc2lnbmVkIGxvbmcsIGludCwgX191NjQpOwotfTsKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfcmVtYXBwZXIoc3RydWN0IHJlbWFwcGVyICppbmZvKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaAppbmRleCA4M2M3YzJlLi44OWI2ODZjMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgImlycV91c2VyLmgiCiAjaW5jbHVkZSAibG9uZ2ptcC5oIgogI2luY2x1ZGUgIm1tX2lkLmgiCi0jaW5jbHVkZSAic3lzZGVwL3Rscy5oIgogCiAjZGVmaW5lIENBVENIX0VJTlRSKGV4cHIpIHdoaWxlICgoZXJybm8gPSAwLCAoKGV4cHIpIDwgMCkpICYmIChlcnJubyA9PSBFSU5UUikpCiAKQEAgLTIwMywxMiArMjAyLDYgQEAKIGV4dGVybiBpbnQgY2FuX2Ryb3BfbWVtb3J5KHZvaWQpOwogZXh0ZXJuIHZvaWQgb3NfZmx1c2hfc3Rkb3V0KHZvaWQpOwogCi0vKiB1YWNjZXNzLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fZG9fdXNlcl9jb3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJCQkgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyLAotCQkJCSAgICB2b2lkICgqb3ApKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAotCQkJCQkgICAgICAgaW50IG4pLCBpbnQgKmZhdWx0ZWRfb3V0KTsKLQogLyogZXhlY3ZwLmMgKi8KIGV4dGVybiBpbnQgZXhlY3ZwX25vYWxsb2MoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pOwogLyogaGVscGVyLmMgKi8KQEAgLTIxOCwxMCArMjExLDYgQEAKIGV4dGVybiBpbnQgaGVscGVyX3dhaXQoaW50IHBpZCk7CiAKIAotLyogdGxzLmMgKi8KLWV4dGVybiBpbnQgb3Nfc2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKTsKLWV4dGVybiBpbnQgb3NfZ2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKTsKLQogLyogdW1pZC5jICovCiBleHRlcm4gaW50IHVtaWRfZmlsZV9uYW1lKGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CiBleHRlcm4gaW50IHNldF91bWlkKGNoYXIgKm5hbWUpOwpAQCAtMjMxLDcgKzIyMCw3IEBACiBleHRlcm4gdm9pZCB0aW1lcl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0X3NpZ3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgcmVtb3ZlX3NpZ3N0YWNrKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKTsKK2V4dGVybiB2b2lkIHNldF9oYW5kbGVyKGludCBzaWcpOwogZXh0ZXJuIGludCBjaGFuZ2Vfc2lnKGludCBzaWduYWwsIGludCBvbik7CiBleHRlcm4gdm9pZCBibG9ja19zaWduYWxzKHZvaWQpOwogZXh0ZXJuIHZvaWQgdW5ibG9ja19zaWduYWxzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wcm9jZXNzLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Byb2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4NzNhNS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Byb2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1BST0NFU1NfSF9fCi0jZGVmaW5lIF9fUFJPQ0VTU19IX18KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiBDb3BpZWQgZnJvbSBsaW51eC9jb21waWxlci1nY2MuaCBzaW5jZSB3ZSBjYW4ndCBpbmNsdWRlIGl0IGRpcmVjdGx5ICovCi0jZGVmaW5lIGJhcnJpZXIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpCi0KLWV4dGVybiB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7Ci1leHRlcm4gdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wdHJhY2VfdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9wdHJhY2VfdXNlci5oCmluZGV4IDdmZDg1MzkuLjU2YjJmMjggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvcHRyYWNlX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3B0cmFjZV91c2VyLmgKQEAgLTYsNyArNiw4IEBACiAjaWZuZGVmIF9fUFRSQUNFX1VTRVJfSF9fCiAjZGVmaW5lIF9fUFRSQUNFX1VTRVJfSF9fCiAKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlX3VzZXIuaCIKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CiAKIGV4dGVybiBpbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KTsKIGV4dGVybiBpbnQgcHRyYWNlX3NldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3NfaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzX3B0cmVncy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzX3B0cmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMTllLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thc19wdHJlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfX1NLQVNfUFRfUkVHU18KLSNkZWZpbmUgX19TS0FTX1BUX1JFR1NfCi0KLSNpbmNsdWRlIDx1c2VyX2NvbnN0YW50cy5oPgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc3lzY2FsbC5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9zeXNjYWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTFkZjkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9zeXNjYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTQ0FMTF9VU0VSX0gKLSNkZWZpbmUgX19TWVNDQUxMX1VTRVJfSAotCi1leHRlcm4gaW50IHJlY29yZF9zeXNjYWxsX3N0YXJ0KGludCBzeXNjYWxsKTsKLWV4dGVybiB2b2lkIHJlY29yZF9zeXNjYWxsX2VuZChpbnQgaW5kZXgsIGxvbmcgcmVzdWx0KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3Rhc2suaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdGFzay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmU3MjZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdGFzay5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9fVEFTS19ICi0jZGVmaW5lIF9fVEFTS19ICi0KLSNpbmNsdWRlIDxrZXJuX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIFRBU0tfUkVHUyh0YXNrKSAoKHN0cnVjdCB1bWxfcHRfcmVncyAqKSAmKCgoY2hhciAqKSAodGFzaykpW0hPU1RfVEFTS19SRUdTXSkpCi0jZGVmaW5lIFRBU0tfUElEKHRhc2spICooKGludCAqKSAmKCgoY2hhciAqKSAodGFzaykpW0hPU1RfVEFTS19QSURdKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3RsYi5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC90bGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkMjI2NS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3RsYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19UTEJfSF9fCi0jZGVmaW5lIF9fVExCX0hfXwotCi0jaW5jbHVkZSAidW1fbW11LmgiCi0KLWV4dGVybiB2b2lkIGZvcmNlX2ZsdXNoX2FsbCh2b2lkKTsKLWV4dGVybiBpbnQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21hbGxvYy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV9tYWxsb2MuaAppbmRleCBjNTU0ZDcwLi42Mzk1ZmVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdW1fbWFsbG9jLmgKQEAgLTYsNyArNiw3IEBACiAjaWZuZGVmIF9fVU1fTUFMTE9DX0hfXwogI2RlZmluZSBfX1VNX01BTExPQ19IX18KIAotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2FzbS1vZmZzZXRzLmg+CiAKIGV4dGVybiB2b2lkICp1bWxfa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKnB0cik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21tdS5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV9tbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhN2U0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VtX21tdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fQVJDSF9VTV9NTVVfSAotI2RlZmluZSBfX0FSQ0hfVU1fTU1VX0gKLQotI2luY2x1ZGUgIm1tX2lkLmgiCi0jaW5jbHVkZSAibGR0LmgiCi0KLXR5cGVkZWYgc3RydWN0IG1tX2NvbnRleHQgewotCXN0cnVjdCBtbV9pZCBpZDsKLQlzdHJ1Y3QgdW1sX2xkdCBsZHQ7Ci0Jc3RydWN0IHBhZ2UgKipzdHViX3BhZ2VzOwotfSBtbV9jb250ZXh0X3Q7Ci0KLWV4dGVybiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7Ci0KLS8qIEF2b2lkIHRhbmdsZWQgaW5jbHVzaW9uIHdpdGggYXNtL2xkdC5oICovCi1leHRlcm4gbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKnRvX21tLCBzdHJ1Y3QgbW1fY29udGV4dCAqZnJvbV9tbSk7Ci1leHRlcm4gdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvdW1fdWFjY2Vzcy5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV91YWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzA0OTkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91bV91YWNjZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19BUkNIX1VNX1VBQ0NFU1NfSAotI2RlZmluZSBfX0FSQ0hfVU1fVUFDQ0VTU19ICi0KLSNpbmNsdWRlIDxhc20vZWxmLmg+Ci0jaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgotI2luY2x1ZGUgInN5c2RlcC9hcmNoc2V0am1wLmgiCi0KLSNkZWZpbmUgX191bmRlcl90YXNrX3NpemUoYWRkciwgc2l6ZSkgXAotCSgoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSA8IFRBU0tfU0laRSkgJiYgXAotCSAoKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgKyAoc2l6ZSkpIDwgVEFTS19TSVpFKSkKLQotI2RlZmluZSBfX2FjY2Vzc19va192c3lzY2FsbCh0eXBlLCBhZGRyLCBzaXplKSBcCi0JICgodHlwZSA9PSBWRVJJRllfUkVBRCkgJiYgXAotCSAgKCh1bnNpZ25lZCBsb25nKSAoYWRkcikgPj0gRklYQUREUl9VU0VSX1NUQVJUKSAmJiBcCi0JICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA8PSBGSVhBRERSX1VTRVJfRU5EKSAmJiBcCi0JICAoKHVuc2lnbmVkIGxvbmcpIChhZGRyKSArIChzaXplKSA+PSAodW5zaWduZWQgbG9uZykoYWRkcikpKQotCi0jZGVmaW5lIF9fYWRkcl9yYW5nZV9ub3dyYXAoYWRkciwgc2l6ZSkgXAotCSgodW5zaWduZWQgbG9uZykgKGFkZHIpIDw9ICgodW5zaWduZWQgbG9uZykgKGFkZHIpICsgKHNpemUpKSkKLQotI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSwgYWRkciwgc2l6ZSkgXAotCShfX2FkZHJfcmFuZ2Vfbm93cmFwKGFkZHIsIHNpemUpICYmIFwKLQkgKF9fdW5kZXJfdGFza19zaXplKGFkZHIsIHNpemUpIHx8IFwKLQkgIF9fYWNjZXNzX29rX3ZzeXNjYWxsKHR5cGUsIGFkZHIsIHNpemUpIHx8IFwKLQkgIHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpKQotCi1leHRlcm4gaW50IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgaW50IG4pOwotZXh0ZXJuIGludCBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbik7Ci0KLWV4dGVybiBpbnQgX19kb19jb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuLAotCQkJICAgICB2b2lkICoqZmF1bHRfYWRkciwgam1wX2J1ZiAqKmZhdWx0X2NhdGNoZXIpOwotCi0vKgotICogc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KLSAqIEBkc3Q6ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4ga2VybmVsIHNwYWNlLiAgVGhpcyBidWZmZXIgbXVzdCBiZSBhdAotICogICAgICAgICBsZWFzdCBAY291bnQgYnl0ZXMgbG9uZy4KLSAqIEBzcmM6ICAgU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCi0gKiBAY291bnQ6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHksIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLgotICoKLSAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCi0gKgotICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCi0gKiBOVUwpLgotICoKLSAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KLSAqIGNvcGllZCkuCi0gKgotICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKLSAqIGFuZCByZXR1cm5zIEBjb3VudC4KLSAqLwotCi1leHRlcm4gaW50IHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvdW50KTsKLQotLyoKLSAqIF9fY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UsIHdpdGggbGVzcyBjaGVja2luZy4KLSAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiB1c2VyIHNwYWNlLgotICogQG46ICAgIE51bWJlciBvZiBieXRlcyB0byB6ZXJvLgotICoKLSAqIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZS4gIENhbGxlciBtdXN0IGNoZWNrCi0gKiB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjbGVhcmVkLgotICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCi0gKi8KLWV4dGVybiBpbnQgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIGludCBsZW4pOwotCi0vKgotICogY2xlYXJfdXNlcjogLSBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCi0gKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KLSAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gemVyby4KLSAqCi0gKiBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5IGluIHVzZXIgc3BhY2UuCi0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY2xlYXJlZC4KLSAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgotICovCi1leHRlcm4gaW50IGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgaW50IGxlbik7Ci0KLS8qCi0gKiBzdHJsZW5fdXNlcjogLSBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgaW4gdXNlciBzcGFjZS4KLSAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KLSAqIEBuOiAgIFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAotICoKLSAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgotICoKLSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KLSAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgotICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KLSAqLwotZXh0ZXJuIGludCBzdHJubGVuX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnN0ciwgaW50IGxlbik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaAppbmRleCAyOTNmN2M3Li40ZmE4MmMwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3VzZXIuaApAQCAtNiw3ICs2LDcgQEAKICNpZm5kZWYgX19VU0VSX0hfXwogI2RlZmluZSBfX1VTRVJfSF9fCiAKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgPGdlbmVyYXRlZC9hc20tb2Zmc2V0cy5oPgogCiAvKgogICogVGhlIHVzdWFsIGRlZmluaXRpb24gLSBjb3BpZWQgaGVyZSBiZWNhdXNlIHRoZSBrZXJuZWwgcHJvdmlkZXMgaXRzIG93biwKQEAgLTM2LDEwICszNiwxMSBAQAogfQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIHNjaGVkdWxlKHZvaWQpOwogZXh0ZXJuIGludCBpbl9hdG9uKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IG9wZW5fZ2RiX2NoYW4odm9pZCk7CiBleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiBleHRlcm4gc2l6ZV90IHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiAKKy8qIENvcGllZCBmcm9tIGxpbnV4L2NvbXBpbGVyLWdjYy5oIHNpbmNlIHdlIGNhbid0IGluY2x1ZGUgaXQgZGlyZWN0bHkgKi8KKyNkZWZpbmUgYmFycmllcigpIF9fYXNtX18gX192b2xhdGlsZV9fKCIiOiA6IDoibWVtb3J5IikKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCmluZGV4IGM0NDkxYzEuLmJjNDk0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvdW0va2VybmVsL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw3IEBACiAKIG9iai15ID0gY29uZmlnLm8gZXhlYy5vIGV4aXRjb2RlLm8gaW5pdF90YXNrLm8gaXJxLm8ga3N5bXMubyBtZW0ubyBcCiAJcGh5c21lbS5vIHByb2Nlc3MubyBwdHJhY2UubyByZWJvb3QubyBzaWdpby5vIFwKLQlzaWduYWwubyBzbXAubyBzeXNjYWxsLm8gc3lzcnEubyB0aW1lLm8gdGxiLm8gdHJhcC5vIHVhY2Nlc3MubyBcCisJc2lnbmFsLm8gc21wLm8gc3lzY2FsbC5vIHN5c3JxLm8gdGltZS5vIHRsYi5vIHRyYXAubyBcCiAJdW1fYXJjaC5vIHVtaWQubyBza2FzLwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICs9IGluaXRyZC5vCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKaW5kZXggOTM5YTRhNi4uNmNhZGU5MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZXhlYy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2V4ZWMuYwpAQCAtMywxNCArMywxNSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlICJsaW51eC9zdGRkZWYuaCIKLSNpbmNsdWRlICJsaW51eC9mcy5oIgotI2luY2x1ZGUgImxpbnV4L3B0cmFjZS5oIgotI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCi0jaW5jbHVkZSAibGludXgvc2xhYi5oIgotI2luY2x1ZGUgImFzbS9jdXJyZW50LmgiCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci5oIgotI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImFzLWxheW91dC5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAic2thcy5oIgpAQCAtNDEsNiArNDIsNyBAQAogCVBUX1JFR1NfSVAocmVncykgPSBlaXA7CiAJUFRfUkVHU19TUChyZWdzKSA9IGVzcDsKIH0KK0VYUE9SVF9TWU1CT0woc3RhcnRfdGhyZWFkKTsKIAogc3RhdGljIGxvbmcgZXhlY3ZlMShjb25zdCBjaGFyICpmaWxlLAogCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmNvbnN0IF9fdXNlciAqYXJndiwKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwvZ21vbl9zeW1zLmMKaW5kZXggNzJlY2NkMi4uZTliY2YyNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCkBAIC03LDE4ICs3LDMgQEAKIAogZXh0ZXJuIHZvaWQgX19iYl9pbml0X2Z1bmModm9pZCAqKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOwogRVhQT1JUX1NZTUJPTChfX2JiX2luaXRfZnVuYyk7Ci0KLS8qCi0gKiBUaGlzIGlzIGRlZmluZWQgKGFuZCByZWZlcnJlZCB0byBpbiBwcm9maWxpbmcgc3R1YiBjb2RlKSBvbmx5IGJ5IHNvbWUgR0NDCi0gKiB2ZXJzaW9ucyBpbiBsaWJnY292LgotICoKLSAqIFNpbmNlIFN1U0UgYmFja3BvcnRlZCB0aGUgZml4LCB3ZSBjYW5ub3QgaGFuZGxlIGl0IGRlcGVuZGluZyBvbiBHQ0MgdmVyc2lvbi4KLSAqIFNvLCB1bmNvbmRpdGlvbmFsbHkgZXhwb3J0IGl0LiBCdXQgYWxzbyBnaXZlIGl0IGEgd2VhayBkZWNsYXJhdGlvbiwgd2hpY2gKLSAqIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBhbnkgb3RoZXIgb25lLgotICovCi0KLWV4dGVybiB2b2lkIF9fZ2Nvdl9pbml0KHZvaWQgKikgX19hdHRyaWJ1dGVfXygod2VhaykpOwotRVhQT1JUX1NZTUJPTChfX2djb3ZfaW5pdCk7Ci0KLWV4dGVybiB2b2lkIF9fZ2Nvdl9tZXJnZV9hZGQodm9pZCAqKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1FWFBPUlRfU1lNQk9MKF9fZ2Nvdl9tZXJnZV9hZGQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaW5pdHJkLmMgYi9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYwppbmRleCBkMzg2Yzc1Li4xMGNjMThmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pbml0cmQuYwpAQCAtNywxMiArNywxMiBAQAogI2luY2x1ZGUgImxpbnV4L2Jvb3RtZW0uaCIKICNpbmNsdWRlICJsaW51eC9pbml0cmQuaCIKICNpbmNsdWRlICJhc20vdHlwZXMuaCIKLSNpbmNsdWRlICJpbml0cmQuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAib3MuaCIKIAogLyogQ2hhbmdlZCBieSB1bWxfaW5pdHJkX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCiBzdGF0aWMgY2hhciAqaW5pdHJkIF9faW5pdGRhdGEgPSBOVUxMOworc3RhdGljIGludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlYWRfaW5pdHJkKHZvaWQpCiB7CkBAIC02Miw3ICs2Miw3IEBACiAiICAgIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW1hZ2UuXG5cbiIKICk7CiAKLWludCBsb2FkX2luaXRyZChjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgbG9hZF9pbml0cmQoY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCiB7CiAJaW50IGZkLCBuOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IDllNDg1YzcuLjcxYjhjOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0yNTgsNiArMjU4LDcgQEAKIAogCWlnbm9yZV9zaWdpb19mZChmZCk7CiB9CitFWFBPUlRfU1lNQk9MKGRlYWN0aXZhdGVfZmQpOwogCiAvKgogICogQ2FsbGVkIGp1c3QgYmVmb3JlIHNodXRkb3duIGluIG9yZGVyIHRvIHByb3ZpZGUgYSBjbGVhbiBleGVjCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwva3N5bXMuYwppbmRleCAwYWUwZGZjLi5lMTdiZWEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKQEAgLTMsMzMgKzMsMTEgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvbW9kdWxlLmgiCi0jaW5jbHVkZSAibGludXgvc3lzY2FsbHMuaCIKLSNpbmNsdWRlICJhc20vdGxiZmx1c2guaCIKLSNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgotI2luY2x1ZGUgImFzLWxheW91dC5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAib3MuaCIKIAotRVhQT1JUX1NZTUJPTCh1bWxfcGh5c21lbSk7CiBFWFBPUlRfU1lNQk9MKHNldF9zaWduYWxzKTsKIEVYUE9SVF9TWU1CT0woZ2V0X3NpZ25hbHMpOwotRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woc3lzX3dhaXRwaWQpOwotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcmFuZ2UpOwotCi1FWFBPUlRfU1lNQk9MKGhpZ2hfcGh5c21lbSk7Ci1FWFBPUlRfU1lNQk9MKGVtcHR5X3plcm9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGhhbmRsZV9wYWdlX2ZhdWx0KTsKLUVYUE9SVF9TWU1CT0woZmluZF9pb21lbSk7Ci0KLUVYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKLUVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOwotRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcik7Ci1FWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXIpOwotRVhQT1JUX1NZTUJPTCh1bWxfc3RyZHVwKTsKIAogRVhQT1JUX1NZTUJPTChvc19zdGF0X2ZkKTsKIEVYUE9SVF9TWU1CT0wob3Nfc3RhdF9maWxlKTsKQEAgLTU3LDI0ICszNSwxMCBAQAogRVhQT1JUX1NZTUJPTChvc19hY2NlcHRfY29ubmVjdGlvbik7CiBFWFBPUlRfU1lNQk9MKG9zX3Jjdl9mZCk7CiBFWFBPUlRfU1lNQk9MKHJ1bl9oZWxwZXIpOwotRVhQT1JUX1NZTUJPTChzdGFydF90aHJlYWQpOwogRVhQT1JUX1NZTUJPTChvc19tYWpvcik7CiBFWFBPUlRfU1lNQk9MKG9zX21pbm9yKTsKIEVYUE9SVF9TWU1CT0wob3NfbWFrZWRldik7CiAKIEVYUE9SVF9TWU1CT0woYWRkX3NpZ2lvX2ZkKTsKIEVYUE9SVF9TWU1CT0woaWdub3JlX3NpZ2lvX2ZkKTsKLUVYUE9SVF9TWU1CT0woZGVhY3RpdmF0ZV9mZCk7CiBFWFBPUlRfU1lNQk9MKHNpZ2lvX2Jyb2tlbik7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLS8qIHJlcXVpcmVkIGZvciBTTVAgKi8KLQotZXh0ZXJuIHZvaWQgX193cml0ZV9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpOwotRVhQT1JUX1NZTUJPTChfX3dyaXRlX2xvY2tfZmFpbGVkKTsKLQotZXh0ZXJuIHZvaWQgX19yZWFkX2xvY2tfZmFpbGVkKHJ3bG9ja190ICpydyk7Ci1FWFBPUlRfU1lNQk9MKF9fcmVhZF9sb2NrX2ZhaWxlZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwppbmRleCA4MTM3Y2NjLi5lYmI4NmIyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9tZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwpAQCAtNCw2ICs0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMjAsNiArMjEsNyBAQAogCiAvKiBhbGxvY2F0ZWQgaW4gcGFnaW5nX2luaXQsIHplcm9lZCBpbiBtZW1faW5pdCwgYW5kIHVuY2hhbmdlZCB0aGVyZWFmdGVyICovCiB1bnNpZ25lZCBsb25nICplbXB0eV96ZXJvX3BhZ2UgPSBOVUxMOworRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOwogLyogYWxsb2NhdGVkIGluIHBhZ2luZ19pbml0IGFuZCB1bmNoYW5nZWQgdGhlcmVhZnRlciAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKmVtcHR5X2JhZF9wYWdlID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IGExYTkwOTAuLmYxMTZkYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTMsMjAgKzMsMjIgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvYm9vdG1lbS5oIgotI2luY2x1ZGUgImxpbnV4L21tLmgiCi0jaW5jbHVkZSAibGludXgvcGZuLmgiCi0jaW5jbHVkZSAiYXNtL3BhZ2UuaCIKLSNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybi5oIgotI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzLWxheW91dC5oPgorI2luY2x1ZGUgPGluaXQuaD4KKyNpbmNsdWRlIDxrZXJuLmg+CisjaW5jbHVkZSA8bWVtX3VzZXIuaD4KKyNpbmNsdWRlIDxvcy5oPgogCiBzdGF0aWMgaW50IHBoeXNtZW1fZmQgPSAtMTsKIAogLyogQ2hhbmdlZCBkdXJpbmcgZWFybHkgYm9vdCAqLwogdW5zaWduZWQgbG9uZyBoaWdoX3BoeXNtZW07CitFWFBPUlRfU1lNQk9MKGhpZ2hfcGh5c21lbSk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c21lbV9zaXplOwogCkBAIC0xODQsNiArMTg2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChmaW5kX2lvbWVtKTsKIAogc3RhdGljIGludCBzZXR1cF9pb21lbSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDIxYzFhZTcuLmM1MzM4MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInNrYXMuaCIKLSNpbmNsdWRlICJ0bGIuaCIKIAogLyoKICAqIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKQEAgLTc4LDYgKzc4LDcgQEAKIAkJICAgICAgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAwLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gcGlkOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9jdXJyZW50KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKQEAgLTI4Niw2ICsyODcsNyBAQAogewogCXJldHVybiBrc3RyZHVwKHN0cmluZywgR0ZQX0tFUk5FTCk7CiB9CitFWFBPUlRfU1lNQk9MKHVtbF9zdHJkdXApOwogCiBpbnQgY29weV90b191c2VyX3Byb2Modm9pZCBfX3VzZXIgKnRvLCB2b2lkICpmcm9tLCBpbnQgc2l6ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYjVjMDk0Yy4uZThiODg5ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2lnbmFsLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAiZnJhbWVfa2Vybi5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgotI2luY2x1ZGUgPHN5c2RlcC9zaWdjb250ZXh0Lmg+CiAKIEVYUE9SVF9TWU1CT0woYmxvY2tfc2lnbmFscyk7CiBFWFBPUlRfU1lNQk9MKHVuYmxvY2tfc2lnbmFscyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2Nsb25lLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2Nsb25lLmMKaW5kZXggMmM4NTgzYy4uZTFmZDA2NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9jbG9uZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAic3R1Yi1kYXRhLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdWFjY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKaW5kZXggNjk2NjM0Mi4uOWZlZmQ5MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy91YWNjZXNzLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNDksNiArMTUwLDcgQEAKIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSBmcm9tLCBuLCAwLCBjb3B5X2NodW5rX2Zyb21fdXNlciwgJnRvKToKIAkgICAgICAgbjsKIH0KK0VYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOwogCiBzdGF0aWMgaW50IGNvcHlfY2h1bmtfdG9fdXNlcih1bnNpZ25lZCBsb25nIHRvLCBpbnQgbGVuLCB2b2lkICphcmcpCiB7CkBAIC0xNzAsNiArMTcyLDcgQEAKIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSB0bywgbiwgMSwgY29weV9jaHVua190b191c2VyLCAmZnJvbSkgOgogCSAgICAgICBuOwogfQorRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOwogCiBzdGF0aWMgaW50IHN0cm5jcHlfY2h1bmtfZnJvbV91c2VyKHVuc2lnbmVkIGxvbmcgZnJvbSwgaW50IGxlbiwgdm9pZCAqYXJnKQogewpAQCAtMjA0LDYgKzIwNyw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBzdHJubGVuKGRzdCwgY291bnQpOwogfQorRVhQT1JUX1NZTUJPTChzdHJuY3B5X2Zyb21fdXNlcik7CiAKIHN0YXRpYyBpbnQgY2xlYXJfY2h1bmsodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuLCB2b2lkICp1bnVzZWQpCiB7CkBAIC0yMjYsNiArMjMwLDcgQEAKIAlyZXR1cm4gYWNjZXNzX29rKFZFUklGWV9XUklURSwgbWVtLCBsZW4pID8KIAkgICAgICAgYnVmZmVyX29wKCh1bnNpZ25lZCBsb25nKSBtZW0sIGxlbiwgMSwgY2xlYXJfY2h1bmssIE5VTEwpIDogbGVuOwogfQorRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyKTsKIAogc3RhdGljIGludCBzdHJubGVuX2NodW5rKHVuc2lnbmVkIGxvbmcgc3RyLCBpbnQgbGVuLCB2b2lkICphcmcpCiB7CkBAIC0yNTEsMyArMjU2LDQgQEAKIAkJcmV0dXJuIGNvdW50ICsgMTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK0VYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RsYi5jIGIvYXJjaC91bS9rZXJuZWwvdGxiLmMKaW5kZXggZDE3NWQwNS4uN2YzZDRkODYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RsYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3RsYi5jCkBAIC00LDYgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KQEAgLTExLDcgKzEyLDYgQEAKICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgInRsYi5oIgogCiBzdHJ1Y3QgaG9zdF92bV9jaGFuZ2UgewogCXN0cnVjdCBob3N0X3ZtX29wIHsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCX0KIH0KIAotaW50IGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQorc3RhdGljIGludCBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlwZ2RfdCAqcGdkOwpAQCAtNDk5LDYgKzQ5OSw3IEBACiAJCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uKHN0YXJ0LCBlbmQpOwogCWVsc2UgZml4X3JhbmdlKHZtYS0+dm1fbW0sIHN0YXJ0LCBlbmQsIDApOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcmFuZ2UpOwogCiB2b2lkIGZsdXNoX3RsYl9tbV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCXVuc2lnbmVkIGxvbmcgZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcC5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCmluZGV4IDhjN2I4ODIuLmRhZmM5NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC0xNCw3ICsxNSw2IEBACiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJza2FzLmgiCi0jaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKIAogLyoKICAqIE5vdGUgdGhpcyBpcyBjb25zdHJhaW5lZCB0byByZXR1cm4gMCwgLUVGQVVMVCwgLUVBQ0NFU1MsIC1FTk9NRU0gYnkKQEAgLTExMiw2ICsxMTIsNyBAQAogCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGhhbmRsZV9wYWdlX2ZhdWx0KTsKIAogc3RhdGljIHZvaWQgc2hvd19zZWd2X2luZm8oc3RydWN0IHVtbF9wdF9yZWdzICpyZWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdWFjY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvdWFjY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDMzZjA0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3VhY2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXMgRW1lcnNvbiAoY2VtZXJzb25AY2hpYXJrLmdyZWVuZW5kLm9yZy51aykKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLS8qCi0gKiBUaGVzZSBhcmUgaGVyZSByYXRoZXIgdGhhbiB0dC91YWNjZXNzLmMgYmVjYXVzZSBza2FzIG1vZGUgbmVlZHMgdGhlbSBpbgotICogb3JkZXIgdG8gZG8gU0lHQlVTIHJlY292ZXJ5IHdoZW4gYSB0bXBmcyBtb3VudCBydW5zIG91dCBvZiByb29tLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJvcy5oIgotCi1zdGF0aWMgdm9pZCBfX2RvX2NvcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBuKQotewotCW1lbWNweSh0bywgZnJvbSwgbik7Ci19Ci0KLQotaW50IF9fZG9fY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJICAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyKQotewotCXVuc2lnbmVkIGxvbmcgZmF1bHQ7Ci0JaW50IGZhdWx0ZWQ7Ci0KLQlmYXVsdCA9IF9fZG9fdXNlcl9jb3B5KHRvLCBmcm9tLCBuLCBmYXVsdF9hZGRyLCBmYXVsdF9jYXRjaGVyLAotCQkJICAgICAgIF9fZG9fY29weSwgJmZhdWx0ZWQpOwotCWlmICghZmF1bHRlZCkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gbiAtIChmYXVsdCAtICh1bnNpZ25lZCBsb25nKSB0byk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKaW5kZXggOGQ4NDI1MC4uYmEwMGVhZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYwpAQCAtMTAyLDYgKzEwMiw4IEBACiAKIC8qIFNldCBpbiBsaW51eF9tYWluICovCiB1bnNpZ25lZCBsb25nIHVtbF9waHlzbWVtOworRVhQT1JUX1NZTUJPTCh1bWxfcGh5c21lbSk7CisKIHVuc2lnbmVkIGxvbmcgdW1sX3Jlc2VydmVkOyAvKiBBbHNvIG1vZGlmaWVkIGluIG1lbV9pbml0ICovCiB1bnNpZ25lZCBsb25nIHN0YXJ0X3ZtOwogdW5zaWduZWQgbG9uZyBlbmRfdm07CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQppbmRleCBiMzNmNGRmLi5kZDc2NDEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKQEAgLTQsMTQgKzQsMTQgQEAKICMKIAogb2JqLXkgPSBhaW8ubyBleGVjdnAubyBmaWxlLm8gaGVscGVyLm8gaXJxLm8gbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBcCi0JcmVnaXN0ZXJzLm8gc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dHkubyB1YWNjZXNzLm8gXAotCXVtaWQubyB0bHMubyB1c2VyX3N5bXMubyB1dGlsLm8gZHJpdmVycy8gc3lzLSQoU1VCQVJDSCkvIHNrYXMvCisJcmVnaXN0ZXJzLm8gc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0dHkubyBcCisJdW1pZC5vIHVzZXJfc3ltcy5vIHV0aWwubyBkcml2ZXJzLyBza2FzLwogCiBvYmotJChDT05GSUdfQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEpICs9IGVsZl9hdXgubwogCiBVU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgYWlvLm8gZWxmX2F1eC5vIGV4ZWN2cC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBcCiAJbWFpbi5vIG1lbS5vIHByb2Nlc3MubyByZWdpc3RlcnMubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIFwKLQl0dHkubyB0bHMubyB1YWNjZXNzLm8gdW1pZC5vIHV0aWwubworCXR0eS5vIHVtaWQubyB1dGlsLm8KIAogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCmluZGV4IDU3ZTNkNDYuLmM1ZDAzOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwpAQCAtMTEsMTAgKzExLDggQEAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAiYWlvLmgiCiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBhaW9fdGhyZWFkX3JlcSB7CiAJZW51bSBhaW9fdHlwZSB0eXBlOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggY2M3MmNiMi4uZGIzZDY0OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC0xMywxMSArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgImV0YXAuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAibmV0X3VzZXIuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKICNkZWZpbmUgTUFYX1BBQ0tFVCBFVEhfTUFYX1BBQ0tFVAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCmluZGV4IDI0NDhiZTAuLmEyYWFjZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCkBAIC0xMywxMSArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidHVudGFwLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiBzdGF0aWMgaW50IHR1bnRhcF91c2VyX2luaXQodm9pZCAqZGF0YSwgdm9pZCAqZGV2KQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9lbGZfYXV4LmMgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwppbmRleCA5NTMzMjM3Li5kODk1MjcxIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2VsZl9hdXguYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJlbGZfdXNlci5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCi0jaW5jbHVkZSA8a2Vybl9jb25zdGFudHMuaD4KIAogdHlwZWRlZiBFbGYzMl9hdXh2X3QgZWxmX2F1eHZfdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9maWxlLmMgYi9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYwppbmRleCAxNDBlNTg3Li5iMDQ5YTYzIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2ZpbGUuYwpAQCAtMTMsOSArMTMsNyBAQAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0YXRpYyB2b2lkIGNvcHlfc3RhdChzdHJ1Y3QgdW1sX3N0YXQgKmRzdCwgY29uc3Qgc3RydWN0IHN0YXQ2NCAqc3JjKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKaW5kZXggZmVmZjIyZC4uY2YyNmM0YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCkBAIC0xMCwxMSArMTAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBoZWxwZXJfZGF0YSB7CiAJdm9pZCAoKnByZV9leGVjKSh2b2lkKik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2ludGVybmFsLmggYi9hcmNoL3VtL29zLUxpbnV4L2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzYzNlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vb3MtTGludXgvaW50ZXJuYWwuaApAQCAtMCwwICsxIEBACit2b2lkIGFsYXJtX2hhbmRsZXIoaW50LCBtY29udGV4dF90ICopOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9pcnEuYyBiL2FyY2gvdW0vb3MtTGludXgvaXJxLmMKaW5kZXggMDM0OGI5Ny4uOWE0OTkwOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9pcnEuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2lycS5jCkBAIC05LDExICs5LDggQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJpcnFfdXNlci5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiAvKgogICogTG9ja2VkIGJ5IGlycV9sb2NrIGluIGFyY2gvdW0va2VybmVsL2lycS5jLiAgQ2hhbmdlZCBieSBvc19jcmVhdGVfcG9sbGZkCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCmluZGV4IDg0NzFiODEuLjdhODZkZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMgYi9hcmNoL3VtL29zLUxpbnV4L21lbS5jCmluZGV4IDYyODc4Y2YuLjhlNDIxZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvbWVtLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9tZW0uYwpAQCAtMTQsOSArMTQsNyBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIC8qIE1vZGlmaWVkIGJ5IHdoaWNoX3RtcGRpciwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyBlYXJseSBib290ICovCiBzdGF0aWMgY2hhciAqZGVmYXVsdF90bXBkaXIgPSAiL3RtcCI7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCmluZGV4IDBjNDVkYzguLjMwN2YxNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jCkBAIC0xMywxMiArMTMsOSBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgImluaXQuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImxvbmdqbXAuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBBUkJJVFJBUllfQUREUiAtMQogI2RlZmluZSBGQUlMVVJFX1BJRCAgICAtMQpAQCAtMjM3LDIxICsyMzQsMTMgQEAKIAogdm9pZCBpbml0X25ld190aHJlYWRfc2lnbmFscyh2b2lkKQogewotCXNldF9oYW5kbGVyKFNJR1NFR1YsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR1RSQVAsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOwotCXNldF9oYW5kbGVyKFNJR0ZQRSwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwgU0FfT05TVEFDSywKLQkJICAgIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgU0lHVlRBTFJNLCAtMSk7Ci0Jc2V0X2hhbmRsZXIoU0lHSUxMLCAoX19zaWdoYW5kbGVyX3QpIHNpZ19oYW5kbGVyLCBTQV9PTlNUQUNLLAotCQkgICAgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdWVEFMUk0sIC0xKTsKLQlzZXRfaGFuZGxlcihTSUdCVVMsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsIFNBX09OU1RBQ0ssCi0JCSAgICBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsIFNJR1ZUQUxSTSwgLTEpOworCXNldF9oYW5kbGVyKFNJR1NFR1YpOworCXNldF9oYW5kbGVyKFNJR1RSQVApOworCXNldF9oYW5kbGVyKFNJR0ZQRSk7CisJc2V0X2hhbmRsZXIoU0lHSUxMKTsKKwlzZXRfaGFuZGxlcihTSUdCVVMpOwogCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotCi0Jc2V0X2hhbmRsZXIoU0lHSU8sIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsCi0JCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILCBTSUdBTFJNLAotCQkgICAgU0lHVlRBTFJNLCAtMSk7CisJc2V0X2hhbmRsZXIoU0lHSU8pOwogCXNpZ25hbChTSUdXSU5DSCwgU0lHX0lHTik7CiAJc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCmluZGV4IDYzZDI5OWQuLjNjMTYxMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKQEAgLTExLDE0ICsxMSwxMSBAQAogI2luY2x1ZGUgPHNjaGVkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAic2lnaW8uaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIC8qCiAgKiBQcm90ZWN0ZWQgYnkgc2lnaW9fbG9jaygpLCBhbHNvIHVzZWQgYnkgc2lnaW9fY2xlYW51cCwgd2hpY2ggaXMgYW4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCmluZGV4IDZhZTE4MDcuLjJkMjJmMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwpAQCAtMTIsMTMgKzEyLDcgQEAKICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJzeXNkZXAvYmFycmllci5oIgotI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCi0jaW5jbHVkZSAidXNlci5oIgotCi0vKiBDb3BpZWQgZnJvbSBsaW51eC9jb21waWxlci1nY2MuaCBzaW5jZSB3ZSBjYW4ndCBpbmNsdWRlIGl0IGRpcmVjdGx5ICovCi0jZGVmaW5lIGJhcnJpZXIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpCisjaW5jbHVkZSAic3lzZGVwL21jb250ZXh0LmgiCiAKIHZvaWQgKCpzaWdfaW5mb1tOU0lHXSkoaW50LCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKikgPSB7CiAJW1NJR1RSQVBdCT0gcmVsYXlfc2lnbmFsLApAQCAtMzAsNyArMjQsNyBAQAogCVtTSUdJT10JCT0gc2lnaW9faGFuZGxlciwKIAlbU0lHVlRBTFJNXQk9IHRpbWVyX2hhbmRsZXIgfTsKIAotc3RhdGljIHZvaWQgc2lnX2hhbmRsZXJfY29tbW9uKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyX2NvbW1vbihpbnQgc2lnLCBtY29udGV4dF90ICptYykKIHsKIAlzdHJ1Y3QgdW1sX3B0X3JlZ3MgcjsKIAlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwpAQCAtMzgsOCArMzIsOCBAQAogCXIuaXNfdXNlciA9IDA7CiAJaWYgKHNpZyA9PSBTSUdTRUdWKSB7CiAJCS8qIEZvciBzZWdmYXVsdHMsIHdlIHdhbnQgdGhlIGRhdGEgZnJvbSB0aGUgc2lnY29udGV4dC4gKi8KLQkJY29weV9zYygmciwgc2MpOwotCQlHRVRfRkFVTFRJTkZPX0ZST01fU0Moci5mYXVsdGluZm8sIHNjKTsKKwkJZ2V0X3JlZ3NfZnJvbV9tYygmciwgbWMpOworCQlHRVRfRkFVTFRJTkZPX0ZST01fTUMoci5mYXVsdGluZm8sIG1jKTsKIAl9CiAKIAkvKiBlbmFibGUgc2lnbmFscyBpZiBzaWcgaXNuJ3QgSVJRIHNpZ25hbCAqLwpAQCAtNjYsNyArNjAsNyBAQAogc3RhdGljIGludCBzaWduYWxzX2VuYWJsZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHNpZ25hbHNfcGVuZGluZzsKIAotdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCit2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcsIG1jb250ZXh0X3QgKm1jKQogewogCWludCBlbmFibGVkOwogCkBAIC03OCwyMyArNzIsMjMgQEAKIAogCWJsb2NrX3NpZ25hbHMoKTsKIAotCXNpZ19oYW5kbGVyX2NvbW1vbihzaWcsIHNjKTsKKwlzaWdfaGFuZGxlcl9jb21tb24oc2lnLCBtYyk7CiAKIAlzZXRfc2lnbmFscyhlbmFibGVkKTsKIH0KIAotc3RhdGljIHZvaWQgcmVhbF9hbGFybV9oYW5kbGVyKHN0cnVjdCBzaWdjb250ZXh0ICpzYykKK3N0YXRpYyB2b2lkIHJlYWxfYWxhcm1faGFuZGxlcihtY29udGV4dF90ICptYykKIHsKIAlzdHJ1Y3QgdW1sX3B0X3JlZ3MgcmVnczsKIAotCWlmIChzYyAhPSBOVUxMKQotCQljb3B5X3NjKCZyZWdzLCBzYyk7CisJaWYgKG1jICE9IE5VTEwpCisJCWdldF9yZWdzX2Zyb21fbWMoJnJlZ3MsIG1jKTsKIAlyZWdzLmlzX3VzZXIgPSAwOwogCXVuYmxvY2tfc2lnbmFscygpOwogCXRpbWVyX2hhbmRsZXIoU0lHVlRBTFJNLCAmcmVncyk7CiB9CiAKLXZvaWQgYWxhcm1faGFuZGxlcihpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCit2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZywgbWNvbnRleHRfdCAqbWMpCiB7CiAJaW50IGVuYWJsZWQ7CiAKQEAgLTEwNiwxNCArMTAwLDEzIEBACiAKIAlibG9ja19zaWduYWxzKCk7CiAKLQlyZWFsX2FsYXJtX2hhbmRsZXIoc2MpOworCXJlYWxfYWxhcm1faGFuZGxlcihtYyk7CiAJc2V0X3NpZ25hbHMoZW5hYmxlZCk7CiB9CiAKIHZvaWQgdGltZXJfaW5pdCh2b2lkKQogewotCXNldF9oYW5kbGVyKFNJR1ZUQUxSTSwgKF9fc2lnaGFuZGxlcl90KSBhbGFybV9oYW5kbGVyLAotCQkgICAgU0FfT05TVEFDSyB8IFNBX1JFU1RBUlQsIFNJR1VTUjEsIFNJR0lPLCBTSUdXSU5DSCwgLTEpOworCXNldF9oYW5kbGVyKFNJR1ZUQUxSTSk7CiB9CiAKIHZvaWQgc2V0X3NpZ3N0YWNrKHZvaWQgKnNpZ19zdGFjaywgaW50IHNpemUpCkBAIC0xMjYsMTAgKzExOSwyMyBAQAogCQlwYW5pYygiZW5hYmxpbmcgc2lnbmFsIHN0YWNrIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogfQogCi1zdGF0aWMgdm9pZCAoKmhhbmRsZXJzW19OU0lHXSkoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKTsKK3N0YXRpYyB2b2lkICgqaGFuZGxlcnNbX05TSUddKShpbnQgc2lnLCBtY29udGV4dF90ICptYykgPSB7CisJW1NJR1NFR1ZdID0gc2lnX2hhbmRsZXIsCisJW1NJR0JVU10gPSBzaWdfaGFuZGxlciwKKwlbU0lHSUxMXSA9IHNpZ19oYW5kbGVyLAorCVtTSUdGUEVdID0gc2lnX2hhbmRsZXIsCisJW1NJR1RSQVBdID0gc2lnX2hhbmRsZXIsCiAKLXZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpCisJW1NJR0lPXSA9IHNpZ19oYW5kbGVyLAorCVtTSUdXSU5DSF0gPSBzaWdfaGFuZGxlciwKKwlbU0lHVlRBTFJNXSA9IGFsYXJtX2hhbmRsZXIKK307CisKKworc3RhdGljIHZvaWQgaGFyZF9oYW5kbGVyKGludCBzaWcsIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqcCkKIHsKKwlzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcDsKKwltY29udGV4dF90ICptYyA9ICZ1Yy0+dWNfbWNvbnRleHQ7CiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nID0gMVVMIDw8IHNpZzsKIAogCWRvIHsKQEAgLTE1NSw3ICsxNjEsNyBAQAogCQl3aGlsZSAoKHNpZyA9IGZmcyhwZW5kaW5nKSkgIT0gMCl7CiAJCQlzaWctLTsKIAkJCXBlbmRpbmcgJj0gfigxIDw8IHNpZyk7Ci0JCQkoKmhhbmRsZXJzW3NpZ10pKHNpZywgc2MpOworCQkJKCpoYW5kbGVyc1tzaWddKShzaWcsIG1jKTsKIAkJfQogCiAJCS8qCkBAIC0xNjksMjggKzE3NSwyNiBAQAogCX0gd2hpbGUgKHBlbmRpbmcpOwogfQogCi1leHRlcm4gdm9pZCBoYXJkX2hhbmRsZXIoaW50IHNpZyk7Ci0KLXZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKQordm9pZCBzZXRfaGFuZGxlcihpbnQgc2lnKQogewogCXN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotCXZhX2xpc3QgYXA7CisJaW50IGZsYWdzID0gU0FfU0lHSU5GTyB8IFNBX09OU1RBQ0s7CiAJc2lnc2V0X3Qgc2lnX21hc2s7Ci0JaW50IG1hc2s7CiAKLQloYW5kbGVyc1tzaWddID0gKHZvaWQgKCopKGludCwgc3RydWN0IHNpZ2NvbnRleHQgKikpIGhhbmRsZXI7Ci0JYWN0aW9uLnNhX2hhbmRsZXIgPSBoYXJkX2hhbmRsZXI7CisJYWN0aW9uLnNhX3NpZ2FjdGlvbiA9IGhhcmRfaGFuZGxlcjsKIAorCS8qIGJsb2NrIGlycSBvbmVzICovCiAJc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLQotCXZhX3N0YXJ0KGFwLCBmbGFncyk7Ci0Jd2hpbGUgKChtYXNrID0gdmFfYXJnKGFwLCBpbnQpKSAhPSAtMSkKLQkJc2lnYWRkc2V0KCZhY3Rpb24uc2FfbWFzaywgbWFzayk7Ci0JdmFfZW5kKGFwKTsKKwlzaWdhZGRzZXQoJmFjdGlvbi5zYV9tYXNrLCBTSUdWVEFMUk0pOworCXNpZ2FkZHNldCgmYWN0aW9uLnNhX21hc2ssIFNJR0lPKTsKKwlzaWdhZGRzZXQoJmFjdGlvbi5zYV9tYXNrLCBTSUdXSU5DSCk7CiAKIAlpZiAoc2lnID09IFNJR1NFR1YpCiAJCWZsYWdzIHw9IFNBX05PREVGRVI7CiAKKwlpZiAoc2lnaXNtZW1iZXIoJmFjdGlvbi5zYV9tYXNrLCBzaWcpKQorCQlmbGFncyB8PSBTQV9SRVNUQVJUOyAvKiBpZiBpdCdzIGFuIGlycSBzaWduYWwgKi8KKwogCWFjdGlvbi5zYV9mbGFncyA9IGZsYWdzOwogCWFjdGlvbi5zYV9yZXN0b3JlciA9IE5VTEw7CiAJaWYgKHNpZ2FjdGlvbihzaWcsICZhY3Rpb24sIE5VTEwpIDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9tZW0uYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9tZW0uYwppbmRleCBlNzcxMzk4Li5jMGFmZmY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NrYXMvbWVtLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL21lbS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSAiaW5pdC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAjaW5jbHVkZSAibW1faWQuaCIKICNpbmNsdWRlICJvcy5oIgpAQCAtMTcsNyArMTYsNiBAQAogI2luY2x1ZGUgInB0cmFjZV91c2VyLmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCiAjaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKaW5kZXggZGVlMGU4Yy4uY2Q2NTcyNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC05LDMxICs5LDIzIEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJtZW0uaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJwcm9jX21tLmgiCiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKICNpbmNsdWRlICJza2FzLmgiCiAjaW5jbHVkZSAic2thc19wdHJhY2UuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKIAogaW50IGlzX3NrYXNfd2luY2goaW50IHBpZCwgaW50IGZkLCB2b2lkICpkYXRhKQogewotCWlmIChwaWQgIT0gZ2V0cGdycCgpKQotCQlyZXR1cm4gMDsKLQotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhLCAwKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gcGlkID09IGdldHBncnAoKTsKIH0KIAogc3RhdGljIGludCBwdHJhY2VfZHVtcF9yZWdzKGludCBwaWQpCkBAIC0xNjksNyArMTYxLDcgQEAKIAogCWlmICghbG9jYWxfdXNpbmdfc3lzZW11KQogCXsKLQkJZXJyID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAorCQllcnIgPSBwdHJhY2UoUFRSQUNFX1BPS0VVU0VSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAogCQkJICAgICBfX05SX2dldHBpZCk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcmludGsoVU1fS0VSTl9FUlIgImhhbmRsZV90cmFwIC0gbnVsbGlmeWluZyBzeXNjYWxsICIKQEAgLTI1Nyw4ICsyNDksOCBAQAogCiAJCXNldF9zaWdzdGFjaygodm9pZCAqKSBTVFVCX0RBVEEsIFVNX0tFUk5fUEFHRV9TSVpFKTsKIAkJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotCQlzYS5zYV9mbGFncyA9IFNBX09OU1RBQ0sgfCBTQV9OT0RFRkVSOwotCQlzYS5zYV9oYW5kbGVyID0gKHZvaWQgKikgdjsKKwkJc2Euc2FfZmxhZ3MgPSBTQV9PTlNUQUNLIHwgU0FfTk9ERUZFUiB8IFNBX1NJR0lORk87CisJCXNhLnNhX3NpZ2FjdGlvbiA9ICh2b2lkICopIHY7CiAJCXNhLnNhX3Jlc3RvcmVyID0gTlVMTDsKIAkJaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkgewogCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJ1c2Vyc3BhY2VfdHJhbXAgLSBzZXR0aW5nIFNJR1NFR1YgIgpAQCAtNjYxLDggKzY1Myw3IEBACiB7CiAJaW50IG47CiAKLQlzZXRfaGFuZGxlcihTSUdXSU5DSCwgKF9fc2lnaGFuZGxlcl90KSBzaWdfaGFuZGxlciwKLQkJICAgIFNBX09OU1RBQ0sgfCBTQV9SRVNUQVJULCBTSUdVU1IxLCBTSUdJTywgU0lHVlRBTFJNLCAtMSk7CisJc2V0X2hhbmRsZXIoU0lHV0lOQ0gpOwogCiAJLyoKIAkgKiBDYW4ndCB1c2UgVU1MX1NFVEpNUCBvciBVTUxfTE9OR0pNUCBoZXJlIGJlY2F1c2UgdGhleSBzYXZlCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMKaW5kZXggMDJlZTlhZC4uNDI1MTYyZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3RhcnRfdXAuYwpAQCAtMTMsMTIgKzEzLDEwIEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgIm1lbV91c2VyLmgiCiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKQEAgLTIyNSw3ICsyMjMsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JbiA9IHB0cmFjZShQVFJBQ0VfUE9LRVVTUiwgcGlkLCBQVF9TWVNDQUxMX1JFVF9PRkZTRVQsIG9zX2dldHBpZCgpKTsKKwluID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNFUiwgcGlkLCBQVF9TWVNDQUxMX1JFVF9PRkZTRVQsIG9zX2dldHBpZCgpKTsKIAlpZiAobiA8IDApIHsKIAkJbm9uX2ZhdGFsKCJjaGVja19zeXNlbXUgOiBmYWlsZWQgdG8gbW9kaWZ5IHN5c3RlbSBjYWxsICIKIAkJCSAgInJldHVybiIpOwpAQCAtMjYxLDcgKzI1OSw3IEBACiAJCQkJCSAgImRvZXNuJ3Qgc2luZ2xlc3RlcCIpOwogCQkJCWdvdG8gZmFpbDsKIAkJCX0KLQkJCW4gPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VULAorCQkJbiA9IHB0cmFjZShQVFJBQ0VfUE9LRVVTRVIsIHBpZCwgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VULAogCQkJCSAgIG9zX2dldHBpZCgpKTsKIAkJCWlmIChuIDwgMCkKIAkJCQlmYXRhbF9wZXJyb3IoImNoZWNrX3N5c2VtdSA6IGZhaWxlZCB0byBtb2RpZnkgIgpAQCAtMzE3LDEwICszMTUsMTAgQEAKIAkJCWZhdGFsKCJjaGVja19wdHJhY2UgOiBleHBlY3RlZCAoU0lHVFJBUHwweDgwKSwgIgogCQkJICAgICAgICJnb3Qgc3RhdHVzID0gJWQiLCBzdGF0dXMpOwogCi0JCXN5c2NhbGwgPSBwdHJhY2UoUFRSQUNFX1BFRUtVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCisJCXN5c2NhbGwgPSBwdHJhY2UoUFRSQUNFX1BFRUtVU0VSLCBwaWQsIFBUX1NZU0NBTExfTlJfT0ZGU0VULAogCQkJCSAwKTsKIAkJaWYgKHN5c2NhbGwgPT0gX19OUl9nZXRwaWQpIHsKLQkJCW4gPSBwdHJhY2UoUFRSQUNFX1BPS0VVU1IsIHBpZCwgUFRfU1lTQ0FMTF9OUl9PRkZTRVQsCisJCQluID0gcHRyYWNlKFBUUkFDRV9QT0tFVVNFUiwgcGlkLCBQVF9TWVNDQUxMX05SX09GRlNFVCwKIAkJCQkgICBfX05SX2dldHBwaWQpOwogCQkJaWYgKG4gPCAwKQogCQkJCWZhdGFsX3BlcnJvcigiY2hlY2tfcHRyYWNlIDogZmFpbGVkIHRvIG1vZGlmeSAiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiYzZhYy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotIwotCi1vYmoteSA9IHJlZ2lzdGVycy5vIHNpZ25hbC5vIHRhc2tfc2l6ZS5vIHRscy5vCi0KLVVTRVJfT0JKUyA6PSAkKG9iai15KQotCi1pbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWY3YTUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGF0aFNjYWxlLCBJbmMKLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlX3VzZXIuaCIKLQotaW50IHNhdmVfZnBfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfR0VURlBSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VURlBSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHNhdmVfZnB4X3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAwOwotfQotCi1pbnQgcmVzdG9yZV9mcHhfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VURlBYUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQotewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBFSVA6Ci0JCXJldHVybiBidWZbMF0tPl9fZWlwOwotCWNhc2UgVUVTUDoKLQkJcmV0dXJuIGJ1ZlswXS0+X19lc3A7Ci0JY2FzZSBFQlA6Ci0JCXJldHVybiBidWZbMF0tPl9fZWJwOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhVTV9LRVJOX0VSUiAiZ2V0X3RocmVhZF9yZWdzIC0gdW5rbm93biByZWdpc3RlciAlZFxuIiwKLQkJICAgICAgIHJlZyk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotaW50IGhhdmVfZnB4X3JlZ3MgPSAxOwotCi1pbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCWlmIChoYXZlX2ZweF9yZWdzKQotCQlyZXR1cm4gc2F2ZV9mcHhfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Ci0JZWxzZQotCQlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKLX0KLQotaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKLXsKLQlpZiAoaGF2ZV9mcHhfcmVncykKLQkJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotCWVsc2UKLQkJcmV0dXJuIHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Ci19Ci0KLXZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKQotewotCXN0cnVjdCB1c2VyX2ZweHJlZ3Nfc3RydWN0IGZweF9yZWdzOwotCWludCBlcnI7Ci0KLQllcnIgPSBwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgJmZweF9yZWdzKTsKLQlpZiAoIWVycikKLQkJcmV0dXJuOwotCi0JaWYgKGVycm5vICE9IEVJTykKLQkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IFBUUkFDRV9HRVRGUFhSRUdTIGZhaWxlZCwgZXJybm8gPSAlZCIsCi0JCSAgICAgIGVycm5vKTsKLQotCWhhdmVfZnB4X3JlZ3MgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9zaWduYWwuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTE2MDkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9zaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotZXh0ZXJuIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpOwotCi12b2lkIGhhcmRfaGFuZGxlcihpbnQgc2lnKQotewotCWhhbmRsZV9zaWduYWwoc2lnLCAoc3RydWN0IHNpZ2NvbnRleHQgKikgKCZzaWcgKyAxKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rhc2tfc2l6ZS5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90YXNrX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwNGMxZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rhc2tfc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0KLXN0YXRpYyBqbXBfYnVmIGJ1ZjsKLQotc3RhdGljIHZvaWQgc2VnZmF1bHQoaW50IHNpZykKLXsKLQlsb25nam1wKGJ1ZiwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGFnZV9vayh1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JdW5zaWduZWQgbG9uZyAqYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nICopIChwYWdlIDw8IFVNX0tFUk5fUEFHRV9TSElGVCk7Ci0JdW5zaWduZWQgbG9uZyBuID0gfjBVTDsKLQl2b2lkICptYXBwZWQgPSBOVUxMOwotCWludCBvayA9IDA7Ci0KLQkvKgotCSAqIEZpcnN0IHNlZSBpZiB0aGUgcGFnZSBpcyByZWFkYWJsZS4gIElmIGl0IGlzLCBpdCBtYXkgc3RpbGwKLQkgKiBiZSBhIFZEU08sIHNvIHdlIGdvIG9uIHRvIHNlZSBpZiBpdCdzIHdyaXRhYmxlLiAgSWYgbm90Ci0JICogdGhlbiB0cnkgbWFwcGluZyBtZW1vcnkgdGhlcmUuICBJZiB0aGF0IGZhaWxzLCB0aGVuIHdlJ3JlCi0JICogc3RpbGwgaW4gdGhlIGtlcm5lbCBhcmVhLiAgQXMgYSBzYW5pdHkgY2hlY2ssIHdlJ2xsIGZhaWwgaWYKLQkgKiB0aGUgbW1hcCBzdWNjZWVkcywgYnV0IGdpdmVzIHVzIGFuIGFkZHJlc3MgZGlmZmVyZW50IGZyb20KLQkgKiB3aGF0IHdlIHdhbnRlZC4KLQkgKi8KLQlpZiAoc2V0am1wKGJ1ZikgPT0gMCkKLQkJbiA9ICphZGRyZXNzOwotCWVsc2UgewotCQltYXBwZWQgPSBtbWFwKGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAotCQkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOwotCQlpZiAobWFwcGVkID09IE1BUF9GQUlMRUQpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKG1hcHBlZCAhPSBhZGRyZXNzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBOb3csIGlzIGl0IHdyaXRlYWJsZT8gIElmIHNvLCB0aGVuIHdlJ3JlIGluIHVzZXIgYWRkcmVzcwotCSAqIHNwYWNlLiAgSWYgbm90LCB0aGVuIHRyeSBtcHJvdGVjdGluZyBpdCBhbmQgdHJ5IHRoZSB3cml0ZQotCSAqIGFnYWluLgotCSAqLwotCWlmIChzZXRqbXAoYnVmKSA9PSAwKSB7Ci0JCSphZGRyZXNzID0gbjsKLQkJb2sgPSAxOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKG1wcm90ZWN0KGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAotCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpICE9IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKHNldGptcChidWYpID09IDApIHsKLQkJKmFkZHJlc3MgPSBuOwotCQlvayA9IDE7Ci0JfQotCi0gb3V0OgotCWlmIChtYXBwZWQgIT0gTlVMTCkKLQkJbXVubWFwKG1hcHBlZCwgVU1fS0VSTl9QQUdFX1NJWkUpOwotCXJldHVybiBvazsKLX0KLQotdW5zaWduZWQgbG9uZyBvc19nZXRfdG9wX2FkZHJlc3Modm9pZCkKLXsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBib3R0b20gPSAwOwotCS8qCi0JICogQSAzMi1iaXQgVU1MIG9uIGEgNjQtYml0IGhvc3QgZ2V0cyBjb25mdXNlZCBhYm91dCB0aGUgVkRTTyBhdAotCSAqIDB4ZmZmZmUwMDAuICBJdCBpcyBtYXBwZWQsIGlzIHJlYWRhYmxlLCBjYW4gYmUgcmVwcm90ZWN0ZWQgd3JpdGVhYmxlCi0JICogYW5kIHdyaXR0ZW4uICBIb3dldmVyLCBleGVjIGRpc2NvdmVycyBsYXRlciB0aGF0IGl0IGNhbid0IGJlCi0JICogdW5tYXBwZWQuICBTbywganVzdCBzZXQgdGhlIGhpZ2hlc3QgYWRkcmVzcyB0byBiZSBjaGVja2VkIHRvIGp1c3QKLQkgKiBiZWxvdyBpdC4gIFRoaXMgbWlnaHQgd2FzdGUgc29tZSBhZGRyZXNzIHNwYWNlIG9uIDRHLzRHIDMyLWJpdAotCSAqIGhvc3RzLCBidXQgc2hvdWxkbid0IGh1cnQgb3RoZXJ3aXNlLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgdG9wID0gMHhmZmZmZDAwMCA+PiBVTV9LRVJOX1BBR0VfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyB0ZXN0LCBvcmlnaW5hbDsKLQotCXByaW50ZigiTG9jYXRpbmcgdGhlIGJvdHRvbSBvZiB0aGUgYWRkcmVzcyBzcGFjZSAuLi4gIik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0KLQkvKgotCSAqIFdlJ3JlIGdvaW5nIHRvIGJlIGxvbmdqbXBpbmcgb3V0IG9mIHRoZSBzaWduYWwgaGFuZGxlciwgc28KLQkgKiBTQV9ERUZFUiBuZWVkcyB0byBiZSBzZXQuCi0JICovCi0Jc2Euc2FfaGFuZGxlciA9IHNlZ2ZhdWx0OwotCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLQlzYS5zYV9mbGFncyA9IFNBX05PREVGRVI7Ci0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsICZvbGQpKSB7Ci0JCXBlcnJvcigib3NfZ2V0X3RvcF9hZGRyZXNzIik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JLyogTWFudWFsbHkgc2NhbiB0aGUgYWRkcmVzcyBzcGFjZSwgYm90dG9tLXVwLCB1bnRpbCB3ZSBmaW5kCi0JICogdGhlIGZpcnN0IHZhbGlkIHBhZ2UgKG9yIHJ1biBvdXQgb2YgdGhlbSkuCi0JICovCi0JZm9yIChib3R0b20gPSAwOyBib3R0b20gPCB0b3A7IGJvdHRvbSsrKSB7Ci0JCWlmIChwYWdlX29rKGJvdHRvbSkpCi0JCQlicmVhazsKLQl9Ci0KLQkvKiBJZiB3ZSd2ZSBnb3QgdGhpcyBmYXIsIHdlIHJhbiBvdXQgb2YgcGFnZXMuICovCi0JaWYgKGJvdHRvbSA9PSB0b3ApIHsKLQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZGV0ZXJtaW5lIGJvdHRvbSBvZiBhZGRyZXNzICIKLQkJCSJzcGFjZS5cbiIpOwotCQlleGl0KDEpOwotCX0KLQotCXByaW50ZigiMHgleFxuIiwgYm90dG9tIDw8IFVNX0tFUk5fUEFHRV9TSElGVCk7Ci0JcHJpbnRmKCJMb2NhdGluZyB0aGUgdG9wIG9mIHRoZSBhZGRyZXNzIHNwYWNlIC4uLiAiKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQotCW9yaWdpbmFsID0gYm90dG9tOwotCi0JLyogVGhpcyBjb3VsZCBoYXBwZW4gd2l0aCBhIDRHLzRHIHNwbGl0ICovCi0JaWYgKHBhZ2Vfb2sodG9wKSkKLQkJZ290byBvdXQ7Ci0KLQlkbyB7Ci0JCXRlc3QgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvIDI7Ci0JCWlmIChwYWdlX29rKHRlc3QpKQotCQkJYm90dG9tID0gdGVzdDsKLQkJZWxzZQotCQkJdG9wID0gdGVzdDsKLQl9IHdoaWxlICh0b3AgLSBib3R0b20gPiAxKTsKLQotb3V0OgotCS8qIFJlc3RvcmUgdGhlIG9sZCBTSUdTRUdWIGhhbmRsaW5nICovCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmb2xkLCBOVUxMKSkgewotCQlwZXJyb3IoIm9zX2dldF90b3BfYWRkcmVzcyIpOwotCQlleGl0KDEpOwotCX0KLQl0b3AgPDw9IFVNX0tFUk5fUEFHRV9TSElGVDsKLQlwcmludGYoIjB4JXhcbiIsIHRvcCk7Ci0KLQlyZXR1cm4gdG9wOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWQ0MWUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLS8qIENoZWNrcyB3aGV0aGVyIGhvc3Qgc3VwcG9ydHMgVExTLCBhbmQgc2V0cyAqdGxzX21pbiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCi0gKiB2YWxpZCBvbiB0aGUgaG9zdC4KLSAqIGkzODYgaG9zdCBoYXZlIGl0ID09IDY7IHg4Nl82NCBob3N0IGhhdmUgaXQgPT0gMTIsIGZvciBpMzg2IGVtdWxhdGlvbi4gKi8KLXZvaWQgY2hlY2tfaG9zdF9zdXBwb3J0c190bHMoaW50ICpzdXBwb3J0c190bHMsIGludCAqdGxzX21pbikgewotCS8qIFZhbHVlcyBmb3IgeDg2IGFuZCB4ODZfNjQuKi8KLQlpbnQgdmFsW10gPSB7R0RUX0VOVFJZX1RMU19NSU5fSTM4NiwgR0RUX0VOVFJZX1RMU19NSU5fWDg2XzY0fTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbCk7IGkrKykgewotCQl1c2VyX2Rlc2NfdCBpbmZvOwotCQlpbmZvLmVudHJ5X251bWJlciA9IHZhbFtpXTsKLQotCQlpZiAoc3lzY2FsbChfX05SX2dldF90aHJlYWRfYXJlYSwgJmluZm8pID09IDApIHsKLQkJCSp0bHNfbWluID0gdmFsW2ldOwotCQkJKnN1cHBvcnRzX3RscyA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXJybm8gPT0gRUlOVkFMKQotCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAoZXJybm8gPT0gRU5PU1lTKQotCQkJCSpzdXBwb3J0c190bHMgPSAwOwotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCSpzdXBwb3J0c190bHMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRhNDdmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSMKLQotb2JqLXkgPSByZWdpc3RlcnMubyBwcmN0bC5vIHNpZ25hbC5vIHRhc2tfc2l6ZS5vCi0KLVVTRVJfT0JKUyA6PSAkKG9iai15KQotCi1pbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRkOTdhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+Ci0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgImxvbmdqbXAuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLWludCBzYXZlX2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVEZQUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCByZXN0b3JlX2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX1NFVEZQUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCi0JCXJldHVybiAtZXJybm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQotewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBSSVA6Ci0JCXJldHVybiBidWZbMF0tPl9fcmlwOwotCWNhc2UgUlNQOgotCQlyZXR1cm4gYnVmWzBdLT5fX3JzcDsKLQljYXNlIFJCUDoKLQkJcmV0dXJuIGJ1ZlswXS0+X19yYnA7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRfdGhyZWFkX3JlZ3MgLSB1bmtub3duIHJlZ2lzdGVyICVkXG4iLAotCQkgICAgICAgcmVnKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1pbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCXJldHVybiBzYXZlX2ZwX3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotfQotCi1pbnQgcHV0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCXJldHVybiByZXN0b3JlX2ZwX3JlZ2lzdGVycyhwaWQsIHJlZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3NpZ25hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEzODg4Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9zaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotZXh0ZXJuIHZvaWQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpOwotCi12b2lkIGhhcmRfaGFuZGxlcihpbnQgc2lnKQotewotCXN0cnVjdCB1Y29udGV4dCAqdWM7Ci0JYXNtKCJtb3ZxICUlcmR4LCAlMCIgOiAiPXIiICh1YykpOwotCi0JaGFuZGxlX3NpZ25hbChzaWcsIChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAmdWMtPnVjX21jb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC90YXNrX3NpemUuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC90YXNrX3NpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhMGRkMS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvdGFza19zaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXVuc2lnbmVkIGxvbmcgb3NfZ2V0X3RvcF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgc2hpZnQpCi17Ci0JLyogVGhlIG9sZCB2YWx1ZSBvZiBDT05GSUdfVE9QX0FERFIgKi8KLQlyZXR1cm4gMHg3ZmMwMDAwMDAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC90aW1lLmMgYi9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYwppbmRleCA2ZTMzNTlkLi45MTA0OTlkIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3RpbWUuYwpAQCAtOCwxMSArOCw5IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogaW50IHNldF9pbnRlcnZhbCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC90bHMuYyBiL2FyY2gvdW0vb3MtTGludXgvdGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjc3ODAuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC90bHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCi0KLS8qIFRMUyBzdXBwb3J0IC0gd2UgYmFzaWNhbGx5IHJlbHkgb24gdGhlIGhvc3QncyBvbmUuKi8KLQotI2lmbmRlZiBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCi0jZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgMjUKLSNlbmRpZgotCi0jaWZuZGVmIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEKLSNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAyNgotI2VuZGlmCi0KLWludCBvc19zZXRfdGhyZWFkX2FyZWEodXNlcl9kZXNjX3QgKmluZm8sIGludCBwaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHB0cmFjZShQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBLCBwaWQsIGluZm8tPmVudHJ5X251bWJlciwKLQkJICAgICAodW5zaWduZWQgbG9uZykgaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldCA9IC1lcnJubzsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgb3NfZ2V0X3RocmVhZF9hcmVhKHVzZXJfZGVzY190ICppbmZvLCBpbnQgcGlkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwdHJhY2UoUFRSQUNFX0dFVF9USFJFQURfQVJFQSwgcGlkLCBpbmZvLT5lbnRyeV9udW1iZXIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlyZXQgPSAtZXJybm87Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdHR5LmMgYi9hcmNoL3VtL29zLUxpbnV4L3R0eS5jCmluZGV4IGIwOWZmNjYuLmRkMTJiOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdHR5LmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90dHkuYwpAQCAtNywxMCArNyw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAKIHN0cnVjdCBncmFudHB0X2luZm8gewogCWludCBmZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jIGIvYXJjaC91bS9vcy1MaW51eC91YWNjZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2VkNzQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9vcy1MaW51eC91YWNjZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAxIENocmlzIEVtZXJzb24gKGNlbWVyc29uQGNoaWFyay5ncmVlbmVuZC5vcmcudWspCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSAibG9uZ2ptcC5oIgotCi11bnNpZ25lZCBsb25nIF9fZG9fdXNlcl9jb3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbiwKLQkJCSAgICAgdm9pZCAqKmZhdWx0X2FkZHIsIGptcF9idWYgKipmYXVsdF9jYXRjaGVyLAotCQkJICAgICB2b2lkICgqb3ApKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAotCQkJCQlpbnQgbiksIGludCAqZmF1bHRlZF9vdXQpCi17Ci0JdW5zaWduZWQgbG9uZyAqZmFkZHJwID0gKHVuc2lnbmVkIGxvbmcgKikgZmF1bHRfYWRkciwgcmV0OwotCi0Jam1wX2J1ZiBqYnVmOwotCSpmYXVsdF9jYXRjaGVyID0gJmpidWY7Ci0JaWYgKFVNTF9TRVRKTVAoJmpidWYpID09IDApIHsKLQkJKCpvcCkodG8sIGZyb20sIG4pOwotCQlyZXQgPSAwOwotCQkqZmF1bHRlZF9vdXQgPSAwOwotCX0KLQllbHNlIHsKLQkJcmV0ID0gKmZhZGRycDsKLQkJKmZhdWx0ZWRfb3V0ID0gMTsKLQl9Ci0JKmZhdWx0X2FkZHIgPSBOVUxMOwotCSpmYXVsdF9jYXRjaGVyID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VtaWQuYyBiL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCmluZGV4IGEyN2RlZmIuLjQ4MzJlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdW1pZC5jCkBAIC0xMyw5ICsxMyw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKIAogI2RlZmluZSBVTUxfRElSICJ+Ly51bWwvIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3V0aWwuYyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCmluZGV4IDU4MDNiMTguLjllM2I0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCkBAIC0xMyw5ICsxMyw3IEBACiAjaW5jbHVkZSA8d2FpdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAidXNlci5oIgogCiB2b2lkIHN0YWNrX3Byb3RlY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwppbmRleCA2MTEwN2I2Li4yZWIyODQzIDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCkBAIC04LDcgKzgsNyBAQAogVVNFUl9PQkpTIDo9ICQoZm9yZWFjaCBmaWxlLCQoVVNFUl9PQkpTKSwkKG9iaikvJChmaWxlKSkKIAogJChVU0VSX09CSlM6Lm89LiUpOiBcCi0JY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKSAkKENGTEFHU18kKGJhc2V0YXJnZXQpLm8pCisJY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKSAtaW5jbHVkZSB1c2VyLmggJChDRkxBR1NfJChiYXNldGFyZ2V0KS5vKQogJChVU0VSX09CSlMpIDogQ0hFQ0tGTEFHUyA6PSAtRF9fbGludXhfXyAtRGxpbnV4IC1EX19TVERDX18gXAogCS1EdW5peCAtRF9fdW5peF9fIC1EX18kKFNVQkFSQ0gpX18gJChDRikKIApAQCAtMjUsOCArMjUsMyBAQAogZGVmaW5lIHVucHJvZmlsZQogCSQocGF0c3Vic3QgLXBnLCwkKHBhdHN1YnN0IC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSwsJCgxKSkpCiBlbmRlZgotCi1pZmRlZiBzdWJhcmNoLW9iai15Ci1vYmoteSArPSBzdWJhcmNoLm8KLXN1YmFyY2gteSA9ICQoYWRkcHJlZml4IC4uLy4uLyQoSEVBREVSX0FSQ0gpLywkKHN1YmFyY2gtb2JqLXkpKQotZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzY2ZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotIwotCi1vYmoteSA9IGJ1Zy5vIGJ1Z3MubyBjaGVja3N1bS5vIGRlbGF5Lm8gZmF1bHQubyBrc3ltcy5vIGxkdC5vIHB0cmFjZS5vIFwKLQlwdHJhY2VfdXNlci5vIHNldGptcC5vIHNpZ25hbC5vIHN0dWIubyBzdHViX3NlZ3YubyBzeXNjYWxscy5vIHN5c3JxLm8gXAotCXN5c19jYWxsX3RhYmxlLm8gdGxzLm8gYXRvbWljNjRfY3g4XzMyLm8gbWVtLm8KLQotb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYpICs9IGVsZmNvcmUubwotCi1zdWJhcmNoLW9iai15ID0gbGliL3N0cmluZ18zMi5vCi1zdWJhcmNoLW9iai0kKENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSkgKz0gbGliL3J3c2VtLm8KLXN1YmFyY2gtb2JqLSQoQ09ORklHX0hJR0hNRU0pICs9IG1tL2hpZ2htZW1fMzIubwotc3ViYXJjaC1vYmotJChDT05GSUdfTU9EVUxFUykgKz0ga2VybmVsL21vZHVsZS5vCi0KLVVTRVJfT0JKUyA6PSBidWdzLm8gcHRyYWNlX3VzZXIubyBmYXVsdC5vCi0KLVVTRVJfT0JKUyArPSB1c2VyLW9mZnNldHMucwotZXh0cmEteSArPSB1c2VyLW9mZnNldHMucwotCi1VTlBST0ZJTEVfT0JKUyA6PSBzdHViX3NlZ3YubwotQ0ZMQUdTX3N0dWJfc2Vndi5vIDo9ICQoQ0ZMQUdTX05PX0hBUkRFTklORykKLQotaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC91bS9zeXMtaTM4Ni9hc20vYXJjaHBhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMThhODguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9hc20vYXJjaHBhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDMgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fQVJDSFBBUkFNX0kzODZfSAotI2RlZmluZSBfX1VNX0FSQ0hQQVJBTV9JMzg2X0gKLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi0jZGVmaW5lIExBU1RfUEtNQVAgNTEyCi0jZWxzZQotI2RlZmluZSBMQVNUX1BLTUFQIDEwMjQKLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9hc20vZWxmLmggYi9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMDU1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLSNpZm5kZWYgX19VTV9FTEZfSTM4Nl9ICi0jZGVmaW5lIF9fVU1fRUxGX0kzODZfSAotCi0jaW5jbHVkZSA8YXNtL3VzZXIuaD4KLSNpbmNsdWRlICJza2FzLmgiCi0KLSNkZWZpbmUgUl8zODZfTk9ORQkwCi0jZGVmaW5lIFJfMzg2XzMyCTEKLSNkZWZpbmUgUl8zODZfUEMzMgkyCi0jZGVmaW5lIFJfMzg2X0dPVDMyCTMKLSNkZWZpbmUgUl8zODZfUExUMzIJNAotI2RlZmluZSBSXzM4Nl9DT1BZCTUKLSNkZWZpbmUgUl8zODZfR0xPQl9EQVQJNgotI2RlZmluZSBSXzM4Nl9KTVBfU0xPVAk3Ci0jZGVmaW5lIFJfMzg2X1JFTEFUSVZFCTgKLSNkZWZpbmUgUl8zODZfR09UT0ZGCTkKLSNkZWZpbmUgUl8zODZfR09UUEMJMTAKLSNkZWZpbmUgUl8zODZfTlVNCTExCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OwotCi0jZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YoZWxmX2dyZWdfdCkpCi10eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwotCi10eXBlZGVmIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGVsZl9mcHJlZ3NldF90OwotCi0vKgotICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KLSAqLwotI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSBcCi0JKCgoeCktPmVfbWFjaGluZSA9PSBFTV8zODYpIHx8ICgoeCktPmVfbWFjaGluZSA9PSBFTV80ODYpKQotCi0jZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzMyCi0jZGVmaW5lIEVMRl9EQVRBICAgICAgICBFTEZEQVRBMkxTQgotI2RlZmluZSBFTEZfQVJDSCAgICAgICAgRU1fMzg2Ci0KLSNkZWZpbmUgRUxGX1BMQVRfSU5JVChyZWdzLCBsb2FkX2FkZHIpIGRvIHsgXAotCVBUX1JFR1NfRUJYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUNYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRURYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRVNJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRURJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUJQKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfRUFYKHJlZ3MpID0gMDsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRSA0MDk2Ci0KLSNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICgyICogVEFTS19TSVpFIC8gMykKLQotLyogU2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9lbGYuaCAqLwotCi0jZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhwcl9yZWcsIHJlZ3MpIGRvIHsJXAotCXByX3JlZ1swXSA9IFBUX1JFR1NfRUJYKHJlZ3MpOwkJXAotCXByX3JlZ1sxXSA9IFBUX1JFR1NfRUNYKHJlZ3MpOwkJXAotCXByX3JlZ1syXSA9IFBUX1JFR1NfRURYKHJlZ3MpOwkJXAotCXByX3JlZ1szXSA9IFBUX1JFR1NfRVNJKHJlZ3MpOwkJXAotCXByX3JlZ1s0XSA9IFBUX1JFR1NfRURJKHJlZ3MpOwkJXAotCXByX3JlZ1s1XSA9IFBUX1JFR1NfRUJQKHJlZ3MpOwkJXAotCXByX3JlZ1s2XSA9IFBUX1JFR1NfRUFYKHJlZ3MpOwkJXAotCXByX3JlZ1s3XSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCi0JcHJfcmVnWzhdID0gUFRfUkVHU19FUyhyZWdzKTsJCVwKLQkvKiBmYWtlIG9uY2UgdXNlZCBmcyBhbmQgZ3Mgc2VsZWN0b3JzPyAqLwlcCi0JcHJfcmVnWzldID0gUFRfUkVHU19EUyhyZWdzKTsJCVwKLQlwcl9yZWdbMTBdID0gUFRfUkVHU19EUyhyZWdzKTsJCVwKLQlwcl9yZWdbMTFdID0gUFRfUkVHU19TWVNDQUxMX05SKHJlZ3MpOwlcCi0JcHJfcmVnWzEyXSA9IFBUX1JFR1NfSVAocmVncyk7CQlcCi0JcHJfcmVnWzEzXSA9IFBUX1JFR1NfQ1MocmVncyk7CQlcCi0JcHJfcmVnWzE0XSA9IFBUX1JFR1NfRUZMQUdTKHJlZ3MpOwlcCi0JcHJfcmVnWzE1XSA9IFBUX1JFR1NfU1AocmVncyk7CQlcCi0JcHJfcmVnWzE2XSA9IFBUX1JFR1NfU1MocmVncyk7CQlcCi19IHdoaWxlICgwKTsKLQotI2RlZmluZSB0YXNrX3B0X3JlZ3ModCkgKCYodCktPnRocmVhZC5yZWdzKQotCi1zdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci0KLWV4dGVybiBpbnQgZWxmX2NvcmVfY29weV9mcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0LCBlbGZfZnByZWdzZXRfdCAqZnB1KTsKLQotI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0LCBmcHUpIGVsZl9jb3JlX2NvcHlfZnByZWdzKHQsIGZwdSkKLQotZXh0ZXJuIGxvbmcgZWxmX2F1eF9od2NhcDsKLSNkZWZpbmUgRUxGX0hXQ0FQIChlbGZfYXV4X2h3Y2FwKQotCi1leHRlcm4gY2hhciAqIGVsZl9hdXhfcGxhdGZvcm07Ci0jZGVmaW5lIEVMRl9QTEFURk9STSAoZWxmX2F1eF9wbGF0Zm9ybSkKLQotI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIHsgfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnN5c2NhbGxfZWhkcjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZzeXNjYWxsX2VuZDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fa2VybmVsX3ZzeXNjYWxsOwotCi0jZGVmaW5lIFZTWVNDQUxMX0JBU0UgdnN5c2NhbGxfZWhkcgotI2RlZmluZSBWU1lTQ0FMTF9FTkQgdnN5c2NhbGxfZW5kCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGlzIHJlYWRhYmxlIGJ5IHVzZXIgbW9kZSwgYW5kIHRoaW5ncwotICogYWN0aW5nIGxpa2UgdXNlciBtb2RlIHN1Y2ggYXMgZ2V0X3VzZXJfcGFnZXMuCi0gKi8KLSNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUICAgICAgVlNZU0NBTExfQkFTRQotI2RlZmluZSBGSVhBRERSX1VTRVJfRU5EICAgICAgICBWU1lTQ0FMTF9FTkQKLQotI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEgMQotCi0vKgotICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KLSAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KLSAqLwotI2RlZmluZSBBVF9TWVNJTkZPCQkzMgotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCi0KLSNkZWZpbmUgQVJDSF9ETElORk8JCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKCB2c3lzY2FsbF9laGRyICkgewkJCQkJXAotCQlORVdfQVVYX0VOVChBVF9TWVNJTkZPLAlfX2tlcm5lbF92c3lzY2FsbCk7CVwKLQkJTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB2c3lzY2FsbF9laGRyKTsJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9tb2R1bGUuaCBiL2FyY2gvdW0vc3lzLWkzODYvYXNtL21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFkNGEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL21vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfX1VNX01PRFVMRV9JMzg2X0gKLSNkZWZpbmUgX19VTV9NT0RVTEVfSTM4Nl9ICi0KLS8qIFVNTCBpcyBzaW1wbGUgKi8KLXN0cnVjdCBtb2RfYXJjaF9zcGVjaWZpYwotewotfTsKLQotI2RlZmluZSBFbGZfU2hkciBFbGYzMl9TaGRyCi0jZGVmaW5lIEVsZl9TeW0gRWxmMzJfU3ltCi0jZGVmaW5lIEVsZl9FaGRyIEVsZjMyX0VoZHIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvdW0vc3lzLWkzODYvYXNtL3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmE5MDYxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvYXNtL3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX1BST0NFU1NPUl9JMzg2X0gKLSNkZWZpbmUgX19VTV9QUk9DRVNTT1JfSTM4Nl9ICi0KLSNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKLSNpbmNsdWRlIDxzeXNkZXAvaG9zdF9sZHQuaD4KLSNpbmNsdWRlICJhc20vc2VnbWVudC5oIgotCi1leHRlcm4gaW50IGhvc3RfaGFzX2Ntb3Y7Ci0KLS8qIGluY2x1ZGUgZmF1bHRpbmZvIHN0cnVjdHVyZSAqLwotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotc3RydWN0IHVtbF90bHNfc3RydWN0IHsKLQlzdHJ1Y3QgdXNlcl9kZXNjIHRsczsKLQl1bnNpZ25lZCBmbHVzaGVkOjE7Ci0JdW5zaWduZWQgcHJlc2VudDoxOwotfTsKLQotc3RydWN0IGFyY2hfdGhyZWFkIHsKLQlzdHJ1Y3QgdW1sX3Rsc19zdHJ1Y3QgdGxzX2FycmF5W0dEVF9FTlRSWV9UTFNfRU5UUklFU107Ci0JdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07Ci0JaW50IGRlYnVncmVnc19zZXE7Ci0Jc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87Ci19OwotCi0jZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyBcCi0JLnRsc19hcnJheSAgCQk9IHsgWyAwIC4uLiBHRFRfRU5UUllfVExTX0VOVFJJRVMgLSAxIF0gPSBcCi0JCQkJICAgIHsgLnByZXNlbnQgPSAwLCAuZmx1c2hlZCA9IDAgfSB9LCBcCi0JLmRlYnVncmVncyAgCQk9IHsgWyAwIC4uLiA3IF0gPSAwIH0sIFwKLQkuZGVidWdyZWdzX3NlcQkJPSAwLCBcCi0JLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSBcCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKLXsKLQkvKiBDbGVhciBhbnkgVExTIHN0aWxsIGhhbmdpbmcgKi8KLQltZW1zZXQoJnRocmVhZC0+dGxzX2FycmF5LCAwLCBzaXplb2YodGhyZWFkLT50bHNfYXJyYXkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKLXsKLSAgICAgICAgbWVtY3B5KCZ0by0+dGxzX2FycmF5LCAmZnJvbS0+dGxzX2FycmF5LCBzaXplb2YoZnJvbS0+dGxzX2FycmF5KSk7Ci19Ci0KLSNpbmNsdWRlIDxhc20vdXNlci5oPgotCi0vKiBSRVAgTk9QIChQQVVTRSkgaXMgYSBnb29kIHRoaW5nIHRvIGluc2VydCBpbnRvIGJ1c3ktd2FpdCBsb29wcy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXBfbm9wKHZvaWQpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJlcDtub3AiOiA6IDoibWVtb3J5Iik7Ci19Ci0KLSNkZWZpbmUgY3B1X3JlbGF4KCkJcmVwX25vcCgpCi0KLS8qCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50Ci0gKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuIFN0b2xlbgotICogZnJvbSBhc20taTM4Ni9wcm9jZXNzb3IuaAotICovCi0jZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAotCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZsICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQotCi0jZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKLSAgICAgICAoYWRkcmVzcyArIDMyID49IFVQVF9TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncykpCi0KLSNkZWZpbmUgS1NUS19FSVAodHNrKSBLU1RLX1JFRyh0c2ssIEVJUCkKLSNkZWZpbmUgS1NUS19FU1AodHNrKSBLU1RLX1JFRyh0c2ssIFVFU1ApCi0jZGVmaW5lIEtTVEtfRUJQKHRzaykgS1NUS19SRUcodHNrLCBFQlApCi0KLSNpbmNsdWRlICJhc20vcHJvY2Vzc29yLWdlbmVyaWMuaCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2F0b21pYzY0X2N4OF8zMi5TIGIvYXJjaC91bS9zeXMtaTM4Ni9hdG9taWM2NF9jeDhfMzIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDFkMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L2F0b21pYzY0X2N4OF8zMi5TCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBhdG9taWM2NF90IGZvciA1ODYrCi0gKgotICogQ29waWVkIGZyb20gYXJjaC94ODYvbGliL2F0b21pYzY0X2N4OF8zMi5TCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMTAgIEx1Y2EgQmFyYmllcmkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KLSNpbmNsdWRlIDxhc20vZHdhcmYyLmg+Ci0KLS5tYWNybyBTQVZFIHJlZwotCXB1c2hsX2NmaSAlXHJlZwotCUNGSV9SRUxfT0ZGU0VUIFxyZWcsIDAKLS5lbmRtCi0KLS5tYWNybyBSRVNUT1JFIHJlZwotCXBvcGxfY2ZpICVccmVnCi0JQ0ZJX1JFU1RPUkUgXHJlZwotLmVuZG0KLQotLm1hY3JvIHJlYWQ2NCByZWcKLQltb3ZsICVlYngsICVlYXgKLQltb3ZsICVlY3gsICVlZHgKLS8qIHdlIG5lZWQgTE9DS19QUkVGSVggc2luY2Ugb3RoZXJ3aXNlIGNtcHhjaGc4YiBhbHdheXMgZG9lcyB0aGUgd3JpdGUgKi8KLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoXHJlZykKLS5lbmRtCi0KLUVOVFJZKGF0b21pYzY0X3JlYWRfY3g4KQotCUNGSV9TVEFSVFBST0MKLQotCXJlYWQ2NCAlZWN4Ci0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORFBST0MoYXRvbWljNjRfcmVhZF9jeDgpCi0KLUVOVFJZKGF0b21pYzY0X3NldF9jeDgpCi0JQ0ZJX1NUQVJUUFJPQwotCi0xOgotLyogd2UgZG9uJ3QgbmVlZCBMT0NLX1BSRUZJWCBzaW5jZSBhbGlnbmVkIDY0LWJpdCB3cml0ZXMKLSAqIGFyZSBhdG9taWMgb24gNTg2IGFuZCBuZXdlciAqLwotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotCXJldAotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X3NldF9jeDgpCi0KLUVOVFJZKGF0b21pYzY0X3hjaGdfY3g4KQotCUNGSV9TVEFSVFBST0MKLQotCW1vdmwgJWVieCwgJWVheAotCW1vdmwgJWVjeCwgJWVkeAotMToKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotCXJldAotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X3hjaGdfY3g4KQotCi0ubWFjcm8gYWRkc3ViX3JldHVybiBmdW5jIGlucyBpbnNjCi1FTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVicAotCVNBVkUgZWJ4Ci0JU0FWRSBlc2kKLQlTQVZFIGVkaQotCi0JbW92bCAlZWF4LCAlZXNpCi0JbW92bCAlZWR4LCAlZWRpCi0JbW92bCAlZWN4LCAlZWJwCi0KLQlyZWFkNjQgJWVicAotMToKLQltb3ZsICVlYXgsICVlYngKLQltb3ZsICVlZHgsICVlY3gKLQlcaW5zXCgpbCAlZXNpLCAlZWJ4Ci0JXGluc2NcKClsICVlZGksICVlY3gKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVicCkKLQlqbmUgMWIKLQotMTA6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlZGkKLQlSRVNUT1JFIGVzaQotCVJFU1RPUkUgZWJ4Ci0JUkVTVE9SRSBlYnAKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotLmVuZG0KLQotYWRkc3ViX3JldHVybiBhZGQgYWRkIGFkYwotYWRkc3ViX3JldHVybiBzdWIgc3ViIHNiYgotCi0ubWFjcm8gaW5jZGVjX3JldHVybiBmdW5jIGlucyBpbnNjCi1FTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0JXGluc1woKWwgJDEsICVlYngKLQlcaW5zY1woKWwgJDAsICVlY3gKLQlMT0NLX1BSRUZJWAotCWNtcHhjaGc4YiAoJWVzaSkKLQlqbmUgMWIKLQotMTA6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlYngKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQotLmVuZG0KLQotaW5jZGVjX3JldHVybiBpbmMgYWRkIGFkYwotaW5jZGVjX3JldHVybiBkZWMgc3ViIHNiYgotCi1FTlRSWShhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVfY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0Jc3VibCAkMSwgJWVieAotCXNiYiAkMCwgJWVjeAotCWpzIDJmCi0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlc2kpCi0Jam5lIDFiCi0KLTI6Ci0JbW92bCAlZWJ4LCAlZWF4Ci0JbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlYngKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVfY3g4KQotCi1FTlRSWShhdG9taWM2NF9hZGRfdW5sZXNzX2N4OCkKLQlDRklfU1RBUlRQUk9DCi0JU0FWRSBlYnAKLQlTQVZFIGVieAotLyogdGhlc2UganVzdCBwdXNoIHRoZXNlIHR3byBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayAqLwotCVNBVkUgZWRpCi0JU0FWRSBlc2kKLQotCW1vdmwgJWVjeCwgJWVicAotCW1vdmwgJWVheCwgJWVzaQotCW1vdmwgJWVkeCwgJWVkaQotCi0JcmVhZDY0ICVlYnAKLTE6Ci0JY21wbCAlZWF4LCAwKCVlc3ApCi0JamUgNGYKLTI6Ci0JbW92bCAlZWF4LCAlZWJ4Ci0JbW92bCAlZWR4LCAlZWN4Ci0JYWRkbCAlZXNpLCAlZWJ4Ci0JYWRjbCAlZWRpLCAlZWN4Ci0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlYnApCi0Jam5lIDFiCi0KLQltb3ZsICQxLCAlZWF4Ci0zOgotCWFkZGwgJDgsICVlc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKLQlSRVNUT1JFIGVieAotCVJFU1RPUkUgZWJwCi0JcmV0Ci00OgotCWNtcGwgJWVkeCwgNCglZXNwKQotCWpuZSAyYgotCXhvcmwgJWVheCwgJWVheAotCWptcCAzYgotCUNGSV9FTkRQUk9DCi1FTkRQUk9DKGF0b21pYzY0X2FkZF91bmxlc3NfY3g4KQotCi1FTlRSWShhdG9taWM2NF9pbmNfbm90X3plcm9fY3g4KQotCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAotCi0JcmVhZDY0ICVlc2kKLTE6Ci0JdGVzdGwgJWVheCwgJWVheAotCWplIDRmCi0yOgotCW1vdmwgJWVheCwgJWVieAotCW1vdmwgJWVkeCwgJWVjeAotCWFkZGwgJDEsICVlYngKLQlhZGNsICQwLCAlZWN4Ci0JTE9DS19QUkVGSVgKLQljbXB4Y2hnOGIgKCVlc2kpCi0Jam5lIDFiCi0KLQltb3ZsICQxLCAlZWF4Ci0zOgotCVJFU1RPUkUgZWJ4Ci0JcmV0Ci00OgotCXRlc3RsICVlZHgsICVlZHgKLQlqbmUgMmIKLQlqbXAgM2IKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhhdG9taWM2NF9pbmNfbm90X3plcm9fY3g4KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9idWcuYyBiL2FyY2gvdW0vc3lzLWkzODYvYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGYyNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9idWcuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgVjIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0vKiBNb3N0bHkgY29waWVkIGZyb20gaTM4Ni94ODZfODYgLSBlbGltaW5hdGVkIHRoZSBlaXAgPCBQQUdFX09GRlNFVCBiZWNhdXNlCi0gKiB0aGF0J3Mgbm90IHJlbGV2YW50IGluIHNrYXMgbW9kZS4KLSAqLwotCi1pbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGVpcCkKLXsKLQl1bnNpZ25lZCBzaG9ydCB1ZDI7Ci0KLQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKWVpcCwgdWQyKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gdWQyID09IDB4MGIwZjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvYnVncy5jIGIvYXJjaC91bS9zeXMtaTM4Ni9idWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmQwZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9idWdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAibG9uZ2ptcC5oIgotI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgotCi0vKiBTZXQgZHVyaW5nIGVhcmx5IGJvb3QgKi8KLXN0YXRpYyBpbnQgaG9zdF9oYXNfY21vdiA9IDE7Ci1zdGF0aWMgam1wX2J1ZiBjbW92X3Rlc3RfcmV0dXJuOwotCi1zdGF0aWMgdm9pZCBjbW92X3NpZ2lsbF90ZXN0X2hhbmRsZXIoaW50IHNpZykKLXsKLQlob3N0X2hhc19jbW92ID0gMDsKLQlsb25nam1wKGNtb3ZfdGVzdF9yZXR1cm4sIDEpOwotfQotCi12b2lkIGFyY2hfY2hlY2tfYnVncyh2b2lkKQotewotCXN0cnVjdCBzaWdhY3Rpb24gb2xkLCBuZXc7Ci0KLQlwcmludGsoVU1fS0VSTl9JTkZPICJDaGVja2luZyBmb3IgaG9zdCBwcm9jZXNzb3IgY21vdiBzdXBwb3J0Li4uIik7Ci0JbmV3LnNhX2hhbmRsZXIgPSBjbW92X3NpZ2lsbF90ZXN0X2hhbmRsZXI7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCBTSUdJTEwgaXMgZW5hYmxlZCBhZnRlciB0aGUgaGFuZGxlciBsb25nam1wcyBiYWNrICovCi0JbmV3LnNhX2ZsYWdzID0gU0FfTk9ERUZFUjsKLQlzaWdlbXB0eXNldCgmbmV3LnNhX21hc2spOwotCXNpZ2FjdGlvbihTSUdJTEwsICZuZXcsICZvbGQpOwotCi0JaWYgKHNldGptcChjbW92X3Rlc3RfcmV0dXJuKSA9PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZm9vID0gMDsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImNtb3Z6ICUwLCAlMSIgOiAiPXIiIChmb28pIDogIjAiIChmb28pKTsKLQkJcHJpbnRrKFVNX0tFUk5fQ09OVCAiWWVzXG4iKTsKLQl9IGVsc2UKLQkJcHJpbnRrKFVNX0tFUk5fQ09OVCAiTm9cbiIpOwotCi0Jc2lnYWN0aW9uKFNJR0lMTCwgJm9sZCwgJm5ldyk7Ci19Ci0KLXZvaWQgYXJjaF9leGFtaW5lX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciB0bXBbMl07Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGVzdGluZyBmb3IgYSBjbW92ICgweDBmIDB4NHgpIGluc3RydWN0aW9uIGNhdXNpbmcgYQotCSAqIFNJR0lMTCBpbiBpbml0LgotCSAqLwotCWlmICgoc2lnICE9IFNJR0lMTCkgfHwgKFRBU0tfUElEKGdldF9jdXJyZW50KCkpICE9IDEpKQotCQlyZXR1cm47Ci0KLQlpZiAoY29weV9mcm9tX3VzZXJfcHJvYyh0bXAsICh2b2lkICopIFVQVF9JUChyZWdzKSwgMikpIHsKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgaW4gaW5pdCwgY291bGQgbm90IHJlYWQgIgotCQkgICAgICAgImluc3RydWN0aW9ucyFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCh0bXBbMF0gIT0gMHgwZikgfHwgKCh0bXBbMV0gJiAweGYwKSAhPSAweDQwKSkKLQkJcmV0dXJuOwotCi0JaWYgKGhvc3RfaGFzX2Ntb3YgPT0gMCkKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgY2F1c2VkIGJ5IGNtb3YsIHdoaWNoIHRoaXMgIgotCQkgICAgICAgInByb2Nlc3NvciBkb2Vzbid0IGltcGxlbWVudC4gIEJvb3QgYSBmaWxlc3lzdGVtICIKLQkJICAgICAgICJjb21waWxlZCBmb3Igb2xkZXIgcHJvY2Vzc29ycyIpOwotCWVsc2UgaWYgKGhvc3RfaGFzX2Ntb3YgPT0gMSkKLQkJcHJpbnRrKFVNX0tFUk5fRVJSICJTSUdJTEwgY2F1c2VkIGJ5IGNtb3YsIHdoaWNoIHRoaXMgIgotCQkgICAgICAgInByb2Nlc3NvciBjbGFpbXMgdG8gaW1wbGVtZW50Iik7Ci0JZWxzZQotCQlwcmludGsoVU1fS0VSTl9FUlIgIkJhZCB2YWx1ZSBmb3IgaG9zdF9oYXNfY21vdiAoJWQpIiwKLQkJCWhvc3RfaGFzX2Ntb3YpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9rc3ltcy5jIGIvYXJjaC91bS9zeXMtaTM4Ni9rc3ltcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJlZmQzLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYva3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI2luY2x1ZGUgImxpbnV4L21vZHVsZS5oIgotI2luY2x1ZGUgImFzbS9jaGVja3N1bS5oIgotCi0vKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMgYi9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJiZjIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInByb2NfbW0uaCIKLSNpbmNsdWRlICJza2FzLmgiCi0jaW5jbHVkZSAic2thc19wdHJhY2UuaCIKLSNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCi0KLWV4dGVybiBpbnQgbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCk7Ci0KLXN0YXRpYyBsb25nIHdyaXRlX2xkdF9lbnRyeShzdHJ1Y3QgbW1faWQgKm1tX2lkcCwgaW50IGZ1bmMsCi0JCSAgICAgc3RydWN0IHVzZXJfZGVzYyAqZGVzYywgdm9pZCAqKmFkZHIsIGludCBkb25lKQotewotCWxvbmcgcmVzOwotCi0JaWYgKHByb2NfbW0pIHsKLQkJLyoKLQkJICogVGhpcyBpcyBhIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBjYXNlLCB0aGF0IHRoZSBtbSB0bwotCQkgKiBtb2RpZnkgaXNuJ3QgY3VycmVudC0+YWN0aXZlX21tLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBkaXJlY3RseSBieSBtb2RpZnlfbGR0LAotCQkgKiAgICAgKGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5za2FzLnUgPT0gbW1faWRwKQotCQkgKiB3aWxsIGJlIHRydWUuIFNvIG5vIGNhbGwgdG8gX19zd2l0Y2hfbW0obW1faWRwKSBpcyBkb25lLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBpbiBjYXNlIG9mIGluaXRfbmV3X2xkdCBvciBQVFJBQ0VfTERULAotCQkgKiBtbV9pZHAgd29uJ3QgYmVsb25nIHRvIGN1cnJlbnQtPmFjdGl2ZV9tbSwgYnV0IGNoaWxkLT5tbS4KLQkJICogU28gd2UgbmVlZCB0byBzd2l0Y2ggY2hpbGQncyBtbSBpbnRvIG91ciB1c2Vyc3BhY2UsIHRoZW4KLQkJICogbGF0ZXIgc3dpdGNoIGJhY2suCi0JCSAqCi0JCSAqIE5vdGU6IEknbSB1bnN1cmU6IHNob3VsZCBpbnRlcnJ1cHRzIGJlIGRpc2FibGVkIGhlcmU/Ci0JCSAqLwotCQlpZiAoIWN1cnJlbnQtPmFjdGl2ZV9tbSB8fCBjdXJyZW50LT5hY3RpdmVfbW0gPT0gJmluaXRfbW0gfHwKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0obW1faWRwKTsKLQl9Ci0KLQlpZiAocHRyYWNlX2xkdCkgewotCQlzdHJ1Y3QgcHRyYWNlX2xkdCBsZHRfb3AgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gZnVuYywKLQkJCS5wdHIgPSBkZXNjLAotCQkJLmJ5dGVjb3VudCA9IHNpemVvZigqZGVzYyl9OwotCQl1MzIgY3B1OwotCQlpbnQgcGlkOwotCi0JCWlmICghcHJvY19tbSkKLQkJCXBpZCA9IG1tX2lkcC0+dS5waWQ7Ci0JCWVsc2UgewotCQkJY3B1ID0gZ2V0X2NwdSgpOwotCQkJcGlkID0gdXNlcnNwYWNlX3BpZFtjcHVdOwotCQl9Ci0KLQkJcmVzID0gb3NfcHRyYWNlX2xkdChwaWQsIDAsICh1bnNpZ25lZCBsb25nKSAmbGR0X29wKTsKLQotCQlpZiAocHJvY19tbSkKLQkJCXB1dF9jcHUoKTsKLQl9Ci0JZWxzZSB7Ci0JCXZvaWQgKnN0dWJfYWRkcjsKLQkJcmVzID0gc3lzY2FsbF9zdHViX2RhdGEobW1faWRwLCAodW5zaWduZWQgbG9uZyAqKWRlc2MsCi0JCQkJCShzaXplb2YoKmRlc2MpICsgc2l6ZW9mKGxvbmcpIC0gMSkgJgotCQkJCQkgICAgfihzaXplb2YobG9uZykgLSAxKSwKLQkJCQkJYWRkciwgJnN0dWJfYWRkcik7Ci0JCWlmICghcmVzKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgZnVuYywKLQkJCQkJCSAodW5zaWduZWQgbG9uZylzdHViX2FkZHIsCi0JCQkJCQkgc2l6ZW9mKCpkZXNjKSwKLQkJCQkJCSAwLCAwLCAwIH07Ci0JCQlyZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tb2RpZnlfbGR0LCBhcmdzLAotCQkJCQkgICAgICAgMCwgYWRkciwgZG9uZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHJvY19tbSkgewotCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFydCBvZiBzcGVjaWFsIGhhbmRsaW5nLCB0aGF0IG1ha2VzCi0JCSAqIFBUUkFDRV9MRFQgcG9zc2libGUgdG8gaW1wbGVtZW50LgotCQkgKi8KLQkJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSAmJiBjdXJyZW50LT5hY3RpdmVfbW0gIT0gJmluaXRfbW0gJiYKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0oJmN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5pZCk7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGxvbmcgcmVhZF9sZHRfZnJvbV9ob3N0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKLXsKLQlpbnQgcmVzLCBuOwotCXN0cnVjdCBwdHJhY2VfbGR0IHB0cmFjZV9sZHQgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gMCwKLQkJCS5ieXRlY291bnQgPSBieXRlY291bnQsCi0JCQkucHRyID0ga21hbGxvYyhieXRlY291bnQsIEdGUF9LRVJORUwpfTsKLQl1MzIgY3B1OwotCi0JaWYgKHB0cmFjZV9sZHQucHRyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHN5c19tb2RpZnlfbGR0IG9ubHksIHNvIHVzZXJzcGFjZV9waWQgZ2l2ZXMKLQkgKiB1cyB0aGUgcmlnaHQgbnVtYmVyCi0JICovCi0KLQljcHUgPSBnZXRfY3B1KCk7Ci0JcmVzID0gb3NfcHRyYWNlX2xkdCh1c2Vyc3BhY2VfcGlkW2NwdV0sIDAsICh1bnNpZ25lZCBsb25nKSAmcHRyYWNlX2xkdCk7Ci0JcHV0X2NwdSgpOwotCWlmIChyZXMgPCAwKQotCQlnb3RvIG91dDsKLQotCW4gPSBjb3B5X3RvX3VzZXIocHRyLCBwdHJhY2VfbGR0LnB0ciwgcmVzKTsKLQlpZiAobiAhPSAwKQotCQlyZXMgPSAtRUZBVUxUOwotCi0gIG91dDoKLQlrZnJlZShwdHJhY2VfbGR0LnB0cik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogSW4gc2thcyBtb2RlLCB3ZSBob2xkIG91ciBvd24gbGR0IGRhdGEgaW4gVU1MLgotICogVGh1cywgdGhlIGNvZGUgaW1wbGVtZW50aW5nIHN5c19tb2RpZnlfbGR0X3NrYXMKLSAqIGlzIHZlcnkgc2ltaWxhciB0byAoYW5kIG1vc3RseSBzdG9sZW4gZnJvbSkgc3lzX21vZGlmeV9sZHQKLSAqIGZvciBhcmNoL2kzODYva2VybmVsL2xkdC5jCi0gKiBUaGUgcm91dGluZXMgY29waWVkIGFuZCBtb2RpZmllZCBpbiBwYXJ0IGFyZToKLSAqIC0gcmVhZF9sZHQKLSAqIC0gcmVhZF9kZWZhdWx0X2xkdAotICogLSB3cml0ZV9sZHQKLSAqIC0gc3lzX21vZGlmeV9sZHRfc2thcwotICovCi0KLXN0YXRpYyBpbnQgcmVhZF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotewotCWludCBpLCBlcnIgPSAwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bWxfbGR0X3QgKiBsZHQgPSAmY3VycmVudC0+bW0tPmNvbnRleHQubGR0OwotCi0JaWYgKCFsZHQtPmVudHJ5X2NvdW50KQotCQlnb3RvIG91dDsKLQlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCi0JCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOwotCWVyciA9IGJ5dGVjb3VudDsKLQotCWlmIChwdHJhY2VfbGR0KQotCQlyZXR1cm4gcmVhZF9sZHRfZnJvbV9ob3N0KHB0ciwgYnl0ZWNvdW50KTsKLQotCW11dGV4X2xvY2soJmxkdC0+bG9jayk7Ci0JaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKSB7Ci0JCXNpemUgPSBMRFRfRU5UUllfU0laRSpMRFRfRElSRUNUX0VOVFJJRVM7Ci0JCWlmIChzaXplID4gYnl0ZWNvdW50KQotCQkJc2l6ZSA9IGJ5dGVjb3VudDsKLQkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGxkdC0+dS5lbnRyaWVzLCBzaXplKSkKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCWJ5dGVjb3VudCAtPSBzaXplOwotCQlwdHIgKz0gc2l6ZTsKLQl9Ci0JZWxzZSB7Ci0JCWZvciAoaT0wOyBpPGxkdC0+ZW50cnlfY291bnQvTERUX0VOVFJJRVNfUEVSX1BBR0UgJiYgYnl0ZWNvdW50OwotCQkgICAgIGkrKykgewotCQkJc2l6ZSA9IFBBR0VfU0laRTsKLQkJCWlmIChzaXplID4gYnl0ZWNvdW50KQotCQkJCXNpemUgPSBieXRlY291bnQ7Ci0JCQlpZiAoY29weV90b191c2VyKHB0ciwgbGR0LT51LnBhZ2VzW2ldLCBzaXplKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlieXRlY291bnQgLT0gc2l6ZTsKLQkJCXB0ciArPSBzaXplOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKLQotCWlmIChieXRlY291bnQgPT0gMCB8fCBlcnIgPT0gLUVGQVVMVCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoY2xlYXJfdXNlcihwdHIsIGJ5dGVjb3VudCkpCi0JCWVyciA9IC1FRkFVTFQ7Ci0KLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQotewotCWludCBlcnI7Ci0KLQlpZiAoYnl0ZWNvdW50ID4gNSpMRFRfRU5UUllfU0laRSkKLQkJYnl0ZWNvdW50ID0gNSpMRFRfRU5UUllfU0laRTsKLQotCWVyciA9IGJ5dGVjb3VudDsKLQkvKgotCSAqIFVNTCBkb2Vzbid0IHN1cHBvcnQgbGNhbGw3IGFuZCBsY2FsbDI3LgotCSAqIFNvLCB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIGRlZmF1bHQgbGR0LCBidXQgZW11bGF0ZQotCSAqIGFuIGVtcHR5IGxkdCBvZiBjb21tb24gaG9zdCBkZWZhdWx0IGxkdCBzaXplLgotCSAqLwotCWlmIChjbGVhcl91c2VyKHB0ciwgYnl0ZWNvdW50KSkKLQkJZXJyID0gLUVGQVVMVDsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IGZ1bmMpCi17Ci0JdW1sX2xkdF90ICogbGR0ID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmxkdDsKLQlzdHJ1Y3QgbW1faWQgKiBtbV9pZHAgPSAmY3VycmVudC0+bW0tPmNvbnRleHQuaWQ7Ci0JaW50IGksIGVycjsKLQlzdHJ1Y3QgdXNlcl9kZXNjIGxkdF9pbmZvOwotCXN0cnVjdCBsZHRfZW50cnkgZW50cnkwLCAqbGR0X3A7Ci0Jdm9pZCAqYWRkciA9IE5VTEw7Ci0KLQllcnIgPSAtRUlOVkFMOwotCWlmIChieXRlY291bnQgIT0gc2l6ZW9mKGxkdF9pbmZvKSkKLQkJZ290byBvdXQ7Ci0JZXJyID0gLUVGQVVMVDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmxkdF9pbmZvLCBwdHIsIHNpemVvZihsZHRfaW5mbykpKQotCQlnb3RvIG91dDsKLQotCWVyciA9IC1FSU5WQUw7Ci0JaWYgKGxkdF9pbmZvLmVudHJ5X251bWJlciA+PSBMRFRfRU5UUklFUykKLQkJZ290byBvdXQ7Ci0JaWYgKGxkdF9pbmZvLmNvbnRlbnRzID09IDMpIHsKLQkJaWYgKGZ1bmMgPT0gMSkKLQkJCWdvdG8gb3V0OwotCQlpZiAobGR0X2luZm8uc2VnX25vdF9wcmVzZW50ID09IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIXB0cmFjZV9sZHQpCi0JCW11dGV4X2xvY2soJmxkdC0+bG9jayk7Ci0KLQllcnIgPSB3cml0ZV9sZHRfZW50cnkobW1faWRwLCBmdW5jLCAmbGR0X2luZm8sICZhZGRyLCAxKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JZWxzZSBpZiAocHRyYWNlX2xkdCkgewotCQkvKiBXaXRoIFBUUkFDRV9MRFQgYXZhaWxhYmxlLCB0aGlzIGlzIHVzZWQgYXMgYSBmbGFnIG9ubHkgKi8KLQkJbGR0LT5lbnRyeV9jb3VudCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gbGR0LT5lbnRyeV9jb3VudCAmJgotCSAgICBsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gTERUX0RJUkVDVF9FTlRSSUVTKSB7Ci0JCWZvciAoaT1sZHQtPmVudHJ5X2NvdW50L0xEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQkgICAgIGkqTERUX0VOVFJJRVNfUEVSX1BBR0UgPD0gbGR0X2luZm8uZW50cnlfbnVtYmVyOwotCQkgICAgIGkrKykgewotCQkJaWYgKGkgPT0gMCkKLQkJCQltZW1jcHkoJmVudHJ5MCwgbGR0LT51LmVudHJpZXMsCi0JCQkJICAgICAgIHNpemVvZihlbnRyeTApKTsKLQkJCWxkdC0+dS5wYWdlc1tpXSA9IChzdHJ1Y3QgbGR0X2VudHJ5ICopCi0JCQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfWkVSTyk7Ci0JCQlpZiAoIWxkdC0+dS5wYWdlc1tpXSkgewotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJLyogVW5kbyB0aGUgY2hhbmdlIGluIGhvc3QgKi8KLQkJCQltZW1zZXQoJmxkdF9pbmZvLCAwLCBzaXplb2YobGR0X2luZm8pKTsKLQkJCQl3cml0ZV9sZHRfZW50cnkobW1faWRwLCAxLCAmbGR0X2luZm8sICZhZGRyLCAxKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9Ci0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJbWVtY3B5KGxkdC0+dS5wYWdlc1swXSwgJmVudHJ5MCwKLQkJCQkgICAgICAgc2l6ZW9mKGVudHJ5MCkpOwotCQkJCW1lbWNweShsZHQtPnUucGFnZXNbMF0rMSwgbGR0LT51LmVudHJpZXMrMSwKLQkJCQkgICAgICAgc2l6ZW9mKGVudHJ5MCkqKExEVF9ESVJFQ1RfRU5UUklFUy0xKSk7Ci0JCQl9Ci0JCQlsZHQtPmVudHJ5X2NvdW50ID0gKGkgKyAxKSAqIExEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQl9Ci0JfQotCWlmIChsZHQtPmVudHJ5X2NvdW50IDw9IGxkdF9pbmZvLmVudHJ5X251bWJlcikKLQkJbGR0LT5lbnRyeV9jb3VudCA9IGxkdF9pbmZvLmVudHJ5X251bWJlciArIDE7Ci0KLQlpZiAobGR0LT5lbnRyeV9jb3VudCA8PSBMRFRfRElSRUNUX0VOVFJJRVMpCi0JCWxkdF9wID0gbGR0LT51LmVudHJpZXMgKyBsZHRfaW5mby5lbnRyeV9udW1iZXI7Ci0JZWxzZQotCQlsZHRfcCA9IGxkdC0+dS5wYWdlc1tsZHRfaW5mby5lbnRyeV9udW1iZXIvTERUX0VOVFJJRVNfUEVSX1BBR0VdICsKLQkJCWxkdF9pbmZvLmVudHJ5X251bWJlciVMRFRfRU5UUklFU19QRVJfUEFHRTsKLQotCWlmIChsZHRfaW5mby5iYXNlX2FkZHIgPT0gMCAmJiBsZHRfaW5mby5saW1pdCA9PSAwICYmCi0JICAgKGZ1bmMgPT0gMSB8fCBMRFRfZW1wdHkoJmxkdF9pbmZvKSkpIHsKLQkJbGR0X3AtPmEgPSAwOwotCQlsZHRfcC0+YiA9IDA7Ci0JfQotCWVsc2V7Ci0JCWlmIChmdW5jID09IDEpCi0JCQlsZHRfaW5mby51c2VhYmxlID0gMDsKLQkJbGR0X3AtPmEgPSBMRFRfZW50cnlfYSgmbGR0X2luZm8pOwotCQlsZHRfcC0+YiA9IExEVF9lbnRyeV9iKCZsZHRfaW5mbyk7Ci0JfQotCWVyciA9IDA7Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsZHQtPmxvY2spOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBsb25nIGRvX21vZGlmeV9sZHRfc2thcyhpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKLXsKLQlpbnQgcmV0ID0gLUVOT1NZUzsKLQotCXN3aXRjaCAoZnVuYykgewotCQljYXNlIDA6Ci0JCQlyZXQgPSByZWFkX2xkdChwdHIsIGJ5dGVjb3VudCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQljYXNlIDB4MTE6Ci0JCQlyZXQgPSB3cml0ZV9sZHQocHRyLCBieXRlY291bnQsIGZ1bmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXJldCA9IHJlYWRfZGVmYXVsdF9sZHQocHRyLCBieXRlY291bnQpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zdF9sZHRfbG9jayk7Ci1zdGF0aWMgc2hvcnQgZHVtbXlfbGlzdFs5XSA9IHswLCAtMX07Ci1zdGF0aWMgc2hvcnQgKiBob3N0X2xkdF9lbnRyaWVzID0gTlVMTDsKLQotc3RhdGljIHZvaWQgbGR0X2dldF9ob3N0X2luZm8odm9pZCkKLXsKLQlsb25nIHJldDsKLQlzdHJ1Y3QgbGR0X2VudHJ5ICogbGR0OwotCXNob3J0ICp0bXA7Ci0JaW50IGksIHNpemUsIGssIG9yZGVyOwotCi0Jc3Bpbl9sb2NrKCZob3N0X2xkdF9sb2NrKTsKLQotCWlmIChob3N0X2xkdF9lbnRyaWVzICE9IE5VTEwpIHsKLQkJc3Bpbl91bmxvY2soJmhvc3RfbGR0X2xvY2spOwotCQlyZXR1cm47Ci0JfQotCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0KzE7Ci0KLQlzcGluX3VubG9jaygmaG9zdF9sZHRfbG9jayk7Ci0KLQlmb3IgKGkgPSBMRFRfUEFHRVNfTUFYLTEsIG9yZGVyPTA7IGk7IGk+Pj0xLCBvcmRlcisrKQotCQk7Ci0KLQlsZHQgPSAoc3RydWN0IGxkdF9lbnRyeSAqKQotCSAgICAgIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLCBvcmRlcik7Ci0JaWYgKGxkdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibGR0X2dldF9ob3N0X2luZm86IGNvdWxkbid0IGFsbG9jYXRlIGJ1ZmZlciAiCi0JCSAgICAgICAiZm9yIGhvc3QgbGR0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IG1vZGlmeV9sZHQoMCwgbGR0LCAoMTw8b3JkZXIpKlBBR0VfU0laRSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsZHRfZ2V0X2hvc3RfaW5mbzogY291bGRuJ3QgcmVhZCBob3N0IGxkdFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCWlmIChyZXQgPT0gMCkgewotCQkvKiBkZWZhdWx0X2xkdCBpcyBhY3RpdmUsIHNpbXBseSB3cml0ZSBhbiBlbXB0eSBlbnRyeSAwICovCi0JCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0OwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWZvciAoaT0wLCBzaXplPTA7IGk8cmV0L0xEVF9FTlRSWV9TSVpFOyBpKyspIHsKLQkJaWYgKGxkdFtpXS5hICE9IDAgfHwgbGR0W2ldLmIgIT0gMCkKLQkJCXNpemUrKzsKLQl9Ci0KLQlpZiAoc2l6ZSA8IEFSUkFZX1NJWkUoZHVtbXlfbGlzdCkpCi0JCWhvc3RfbGR0X2VudHJpZXMgPSBkdW1teV9saXN0OwotCWVsc2UgewotCQlzaXplID0gKHNpemUgKyAxKSAqIHNpemVvZihkdW1teV9saXN0WzBdKTsKLQkJdG1wID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImxkdF9nZXRfaG9zdF9pbmZvOiBjb3VsZG4ndCBhbGxvY2F0ZSAiCi0JCQkgICAgICAgImhvc3QgbGR0IGxpc3RcbiIpOwotCQkJZ290byBvdXRfZnJlZTsKLQkJfQotCQlob3N0X2xkdF9lbnRyaWVzID0gdG1wOwotCX0KLQotCWZvciAoaT0wLCBrPTA7IGk8cmV0L0xEVF9FTlRSWV9TSVpFOyBpKyspIHsKLQkJaWYgKGxkdFtpXS5hICE9IDAgfHwgbGR0W2ldLmIgIT0gMCkKLQkJCWhvc3RfbGR0X2VudHJpZXNbaysrXSA9IGk7Ci0JfQotCWhvc3RfbGR0X2VudHJpZXNba10gPSAtMTsKLQotb3V0X2ZyZWU6Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylsZHQsIG9yZGVyKTsKLX0KLQotbG9uZyBpbml0X25ld19sZHQoc3RydWN0IG1tX2NvbnRleHQgKm5ld19tbSwgc3RydWN0IG1tX2NvbnRleHQgKmZyb21fbW0pCi17Ci0Jc3RydWN0IHVzZXJfZGVzYyBkZXNjOwotCXNob3J0ICogbnVtX3A7Ci0JaW50IGk7Ci0JbG9uZyBwYWdlLCBlcnI9MDsKLQl2b2lkICphZGRyID0gTlVMTDsKLQlzdHJ1Y3QgcHJvY19tbV9vcCBjb3B5OwotCi0KLQlpZiAoIXB0cmFjZV9sZHQpCi0JCW11dGV4X2luaXQoJm5ld19tbS0+bGR0LmxvY2spOwotCi0JaWYgKCFmcm9tX21tKSB7Ci0JCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKLQkJLyoKLQkJICogV2UgaGF2ZSB0byBpbml0aWFsaXplIGEgY2xlYW4gbGR0LgotCQkgKi8KLQkJaWYgKHByb2NfbW0pIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgbmV3IG1tIHdhcyBjcmVhdGVkIHVzaW5nIHByb2NfbW0sIGhvc3QncwotCQkJICogZGVmYXVsdC1sZHQgY3VycmVudGx5IGlzIGFzc2lnbmVkLCB3aGljaCBub3JtYWxseQotCQkJICogY29udGFpbnMgdGhlIGNhbGwtZ2F0ZXMgZm9yIGxjYWxsNyBhbmQgbGNhbGwyNy4KLQkJCSAqIFRvIHJlbW92ZSB0aGVzZSBnYXRlcywgd2Ugc2ltcGx5IHdyaXRlIGFuIGVtcHR5Ci0JCQkgKiBlbnRyeSBhcyBudW1iZXIgMCB0byB0aGUgaG9zdC4KLQkJCSAqLwotCQkJZXJyID0gd3JpdGVfbGR0X2VudHJ5KCZuZXdfbW0tPmlkLCAxLCAmZGVzYywgJmFkZHIsIDEpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvKgotCQkJICogTm93IHdlIHRyeSB0byByZXRyaWV2ZSBpbmZvIGFib3V0IHRoZSBsZHQsIHdlCi0JCQkgKiBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdC4gQWxsIGxkdC1lbnRyaWVzIGZvdW5kCi0JCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAotCQkJICovCi0JCQlsZHRfZ2V0X2hvc3RfaW5mbygpOwotCQkJZm9yIChudW1fcD1ob3N0X2xkdF9lbnRyaWVzOyAqbnVtX3AgIT0gLTE7IG51bV9wKyspIHsKLQkJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKLQkJCQllcnIgPSB3cml0ZV9sZHRfZW50cnkoJm5ld19tbS0+aWQsIDEsICZkZXNjLAotCQkJCQkJICAgICAgJmFkZHIsICoobnVtX3AgKyAxKSA9PSAtMSk7Ci0JCQkJaWYgKGVycikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbmV3X21tLT5sZHQuZW50cnlfY291bnQgPSAwOwotCi0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChwcm9jX21tKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgYSB2YWxpZCBmcm9tX21tLCBzbyB3ZSBub3cgaGF2ZSB0byBjb3B5IHRoZSBMRFQgb2YKLQkJICogZnJvbV9tbSB0byBuZXdfbW0sIGJlY2F1c2UgdXNpbmcgcHJvY19tbSBhbiBuZXcgbW0gd2l0aAotCQkgKiBhbiBlbXB0eS9kZWZhdWx0IExEVCB3YXMgY3JlYXRlZCBpbiBuZXdfbW0oKQotCQkgKi8KLQkJY29weSA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX0NPUFlfU0VHTUVOVFMsCi0JCQkJCSAgICAgIC51IAk9Ci0JCQkJCSAgICAgIHsgLmNvcHlfc2VnbWVudHMgPQotCQkJCQkJCWZyb21fbW0tPmlkLnUubW1fZmQgfSB9ICk7Ci0JCWkgPSBvc193cml0ZV9maWxlKG5ld19tbS0+aWQudS5tbV9mZCwgJmNvcHksIHNpemVvZihjb3B5KSk7Ci0JCWlmIChpICE9IHNpemVvZihjb3B5KSkKLQkJCXByaW50ayhLRVJOX0VSUiAibmV3X21tIDogL3Byb2MvbW0gY29weV9zZWdtZW50cyAiCi0JCQkgICAgICAgImZhaWxlZCwgZXJyID0gJWRcbiIsIC1pKTsKLQl9Ci0KLQlpZiAoIXB0cmFjZV9sZHQpIHsKLQkJLyoKLQkJICogT3VyIGxvY2FsIExEVCBpcyB1c2VkIHRvIHN1cHBseSB0aGUgZGF0YSBmb3IKLQkJICogbW9kaWZ5X2xkdChSRUFETERUKSwgaWYgUFRSQUNFX0xEVCBpc24ndCBhdmFpbGFibGUsCi0JCSAqIGkuZS4sIHdlIGhhdmUgdG8gdXNlIHRoZSBzdHViIGZvciBtb2RpZnlfbGR0LCB3aGljaAotCQkgKiBjYW4ndCBoYW5kbGUgdGhlIGJpZyByZWFkIGJ1ZmZlciBvZiB1cCB0byA2NGtCLgotCQkgKi8KLQkJbXV0ZXhfbG9jaygmZnJvbV9tbS0+bGR0LmxvY2spOwotCQlpZiAoZnJvbV9tbS0+bGR0LmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykKLQkJCW1lbWNweShuZXdfbW0tPmxkdC51LmVudHJpZXMsIGZyb21fbW0tPmxkdC51LmVudHJpZXMsCi0JCQkgICAgICAgc2l6ZW9mKG5ld19tbS0+bGR0LnUuZW50cmllcykpOwotCQllbHNlIHsKLQkJCWkgPSBmcm9tX21tLT5sZHQuZW50cnlfY291bnQgLyBMRFRfRU5UUklFU19QRVJfUEFHRTsKLQkJCXdoaWxlIChpLS0+MCkgewotCQkJCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPKTsKLQkJCQlpZiAoIXBhZ2UpIHsKLQkJCQkJZXJyID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5ld19tbS0+bGR0LnUucGFnZXNbaV0gPQotCQkJCQkoc3RydWN0IGxkdF9lbnRyeSAqKSBwYWdlOwotCQkJCW1lbWNweShuZXdfbW0tPmxkdC51LnBhZ2VzW2ldLAotCQkJCSAgICAgICBmcm9tX21tLT5sZHQudS5wYWdlc1tpXSwgUEFHRV9TSVpFKTsKLQkJCX0KLQkJfQotCQluZXdfbW0tPmxkdC5lbnRyeV9jb3VudCA9IGZyb21fbW0tPmxkdC5lbnRyeV9jb3VudDsKLQkJbXV0ZXhfdW5sb2NrKCZmcm9tX21tLT5sZHQubG9jayk7Ci0JfQotCi0gICAgb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLQotdm9pZCBmcmVlX2xkdChzdHJ1Y3QgbW1fY29udGV4dCAqbW0pCi17Ci0JaW50IGk7Ci0KLQlpZiAoIXB0cmFjZV9sZHQgJiYgbW0tPmxkdC5lbnRyeV9jb3VudCA+IExEVF9ESVJFQ1RfRU5UUklFUykgewotCQlpID0gbW0tPmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOwotCQl3aGlsZSAoaS0tID4gMCkKLQkJCWZyZWVfcGFnZSgobG9uZykgbW0tPmxkdC51LnBhZ2VzW2ldKTsKLQl9Ci0JbW0tPmxkdC5lbnRyeV9jb3VudCA9IDA7Ci19Ci0KLWludCBzeXNfbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCBfX3VzZXIgKnB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCi17Ci0JcmV0dXJuIGRvX21vZGlmeV9sZHRfc2thcyhmdW5jLCBwdHIsIGJ5dGVjb3VudCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZS5jIGIvYXJjaC91bS9zeXMtaTM4Ni9wdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NWMyNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSAibGludXgvbW0uaCIKLSNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgotI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCi0jaW5jbHVkZSAic2thcy5oIgotCi1leHRlcm4gaW50IGFyY2hfc3dpdGNoX3RscyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvKTsKLQotdm9pZCBhcmNoX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvKQotewotCWludCBlcnIgPSBhcmNoX3N3aXRjaF90bHModG8pOwotCWlmICghZXJyKQotCQlyZXR1cm47Ci0KLQlpZiAoZXJyICE9IC1FSU5WQUwpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFyY2hfc3dpdGNoX3RscyBmYWlsZWQsIGVycm5vICVkLCAiCi0JCSAgICAgICAibm90IEVJTlZBTFxuIiwgLWVycik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmNoX3N3aXRjaF90bHMgZmFpbGVkLCBlcnJubyA9IEVJTlZBTFxuIik7Ci19Ci0KLWludCBpc19zeXNjYWxsKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnN0cjsKLQlpbnQgbjsKLQotCW4gPSBjb3B5X2Zyb21fdXNlcigmaW5zdHIsICh2b2lkIF9fdXNlciAqKSBhZGRyLCBzaXplb2YoaW5zdHIpKTsKLQlpZiAobikgewotCQkvKiBhY2Nlc3NfcHJvY2Vzc192bSgpIGdyYW50cyBhY2Nlc3MgdG8gdnN5c2NhbGwgYW5kIHN0dWIsCi0JCSAqIHdoaWxlIGNvcHlfZnJvbV91c2VyIGRvZXNuJ3QuIE1heWJlIGFjY2Vzc19wcm9jZXNzX3ZtIGlzCi0JCSAqIHNsb3csIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyLCBzaW5jZSBpdCB3aWxsIGJlIGNhbGxlZCBvbmx5Ci0JCSAqIGluIGNhc2Ugb2Ygc2luZ2xlc3RlcHBpbmcsIGlmIGNvcHlfZnJvbV91c2VyIGZhaWxlZC4KLQkJICovCi0JCW4gPSBhY2Nlc3NfcHJvY2Vzc192bShjdXJyZW50LCBhZGRyLCAmaW5zdHIsIHNpemVvZihpbnN0ciksIDApOwotCQlpZiAobiAhPSBzaXplb2YoaW5zdHIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzX3N5c2NhbGwgOiBmYWlsZWQgdG8gcmVhZCAiCi0JCQkgICAgICAgImluc3RydWN0aW9uIGZyb20gMHglbHhcbiIsIGFkZHIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JLyogaW50IDB4ODAgb3Igc3lzZW50ZXIgKi8KLQlyZXR1cm4gKGluc3RyID09IDB4ODBjZCkgfHwgKGluc3RyID09IDB4MzQwZik7Ci19Ci0KLS8qIGRldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gKi8KLS8qIDEgPSBhY2Nlc3MgMCA9IG5vIGFjY2VzcyAqLwotI2RlZmluZSBGTEFHX01BU0sgMHgwMDA0NGRkNQotCi1pbnQgcHV0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQlyZWdubyA+Pj0gMjsKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCi0JCQlyZXR1cm4gLUVJTzsKLQkJUFRfUkVHU19GUygmY2hpbGQtPnRocmVhZC5yZWdzKSA9IHZhbHVlOwotCQlyZXR1cm4gMDsKLQljYXNlIEdTOgotCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKLQkJCXJldHVybiAtRUlPOwotCQlQVF9SRUdTX0dTKCZjaGlsZC0+dGhyZWFkLnJlZ3MpID0gdmFsdWU7Ci0JCXJldHVybiAwOwotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCi0JCQlyZXR1cm4gLUVJTzsKLQkJdmFsdWUgJj0gMHhmZmZmOwotCQlicmVhazsKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCWlmICgodmFsdWUgJiAzKSAhPSAzKQotCQkJcmV0dXJuIC1FSU87Ci0JCXZhbHVlICY9IDB4ZmZmZjsKLQkJYnJlYWs7Ci0JY2FzZSBFRkw6Ci0JCXZhbHVlICY9IEZMQUdfTUFTSzsKLQkJdmFsdWUgfD0gUFRfUkVHU19FRkxBR1MoJmNoaWxkLT50aHJlYWQucmVncyk7Ci0JCWJyZWFrOwotCX0KLQlQVF9SRUdTX1NFVCgmY2hpbGQtPnRocmVhZC5yZWdzLCByZWdubywgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1pbnQgcG9rZV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotewotCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCi0JCXJldHVybiBwdXRyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwotCWVsc2UgaWYgKChhZGRyID49IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKSkgJiYKLQkJIChhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKLQkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7Ci0JCWFkZHIgPSBhZGRyID4+IDI7Ci0JCWlmICgoYWRkciA9PSA0KSB8fCAoYWRkciA9PSA1KSkKLQkJCXJldHVybiAtRUlPOwotCQljaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdID0gZGF0YTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlPOwotfQotCi11bnNpZ25lZCBsb25nIGdldHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8pCi17Ci0JdW5zaWduZWQgbG9uZyByZXR2YWwgPSB+MFVMOwotCi0JcmVnbm8gPj49IDI7Ci0Jc3dpdGNoIChyZWdubykgewotCWNhc2UgRlM6Ci0JY2FzZSBHUzoKLQljYXNlIERTOgotCWNhc2UgRVM6Ci0JY2FzZSBTUzoKLQljYXNlIENTOgotCQlyZXR2YWwgPSAweGZmZmY7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JCXJldHZhbCAmPSBQVF9SRUcoJmNoaWxkLT50aHJlYWQucmVncywgcmVnbm8pOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KLWludCBwZWVrX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCi0JaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkgewotCQl0bXAgPSBnZXRyZWcoY2hpbGQsIGFkZHIpOwotCX0KLQllbHNlIGlmICgoYWRkciA+PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSkpICYmCi0JCSAoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOwotCX0KLQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnByZWdzOwotCi0JZXJyID0gc2F2ZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbiA9IGNvcHlfdG9fdXNlcihidWYsICZmcHJlZ3MsIHNpemVvZihmcHJlZ3MpKTsKLQlpZihuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnByZWdzOwotCi0JbiA9IGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLAotCQkJCSAgICAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKLX0KLQotc3RhdGljIGludCBnZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0Jc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwotCi0JZXJyID0gc2F2ZV9mcHhfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCW4gPSBjb3B5X3RvX3VzZXIoYnVmLCAmZnByZWdzLCBzaXplb2YoZnByZWdzKSk7Ci0JaWYobiA+IDApCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2ZweHJlZ3Moc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKLQlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHJlZ3M7Ci0KLQluID0gY29weV9mcm9tX3VzZXIoJmZwcmVncywgYnVmLCBzaXplb2YoZnByZWdzKSk7Ci0JaWYgKG4gPiAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiByZXN0b3JlX2ZweF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLAotCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7Ci19Ci0KLWxvbmcgc3ViYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LAotCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JaW50IHJldCA9IC1FSU87Ci0Jdm9pZCBfX3VzZXIgKmRhdGFwID0gKHZvaWQgX191c2VyICopIGRhdGE7Ci0Jc3dpdGNoIChyZXF1ZXN0KSB7Ci0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7Ci0JCWJyZWFrOwotCWNhc2UgUFRSQUNFX0dFVEZQWFJFR1M6IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBnZXRfZnB4cmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFhSRUdTOiAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gc2V0X2ZweHJlZ3MoZGF0YXAsIGNoaWxkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvcHRyYWNlX3VzZXIuYyBiL2FyY2gvdW0vc3lzLWkzODYvcHRyYWNlX3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMGMzZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZV91c2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi1pbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgcmVnc19vdXQpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB0cmFjZV9zZXRyZWdzKGxvbmcgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQotewotCWlmIChwdHJhY2UoUFRSQUNFX1NFVFJFR1MsIHBpZCwgMCwgcmVncykgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9iYXJyaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGQ1MmMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAotI2RlZmluZSBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAotCi0vKiBDb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2IGZvciB1c2UgYnkgdXNlcnNwYWNlLiAgaTM4NiBoYXMgdGhlIG9wdGlvbgotICogb2YgdXNpbmcgbWZlbmNlLCBidXQgSSdtIGp1c3QgdXNpbmcgdGhpcywgd2hpY2ggd29ya3MgZXZlcnl3aGVyZSwgZm9yIG5vdy4KLSAqLwotI2RlZmluZSBtYigpIGFzbSB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCVlc3ApIikKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvY2hlY2tzdW0uaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQ3NDQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19VTV9TWVNERVBfQ0hFQ0tTVU1fSAotI2RlZmluZSBfX1VNX1NZU0RFUF9DSEVDS1NVTV9ICi0KLSNpbmNsdWRlICJsaW51eC9pbjYuaCIKLSNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAotICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKLSAqCi0gKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgotICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKLSAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAotICoKLSAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQotICovCi1fX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwotCi0vKgotICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQotICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgotICoKLSAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCi0gKglhY2Nlc3Nfb2soKS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXwotX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCi0JCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCi17Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Ci19Ci0KLS8qCi0gKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKLSAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KLSAqCi0gKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KLSAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5Ci0gKi8KLQotc3RhdGljIF9faW5saW5lX18KLV9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAotCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQotewotCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkgewotCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7Ci0JfQotCi0JcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKLX0KLQotLyoKLSAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKLSAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCi0gKgotICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQotICoJQXJudCBHdWxicmFuZHNlbi4KLSAqLwotc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCi17Ci0JdW5zaWduZWQgaW50IHN1bTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSAgICAibW92bCAoJTEpLCAlMAk7XG4iCi0JICAgICJzdWJsICQ0LCAlMgk7XG4iCi0JICAgICJqYmUgMmYJCTtcbiIKLQkgICAgImFkZGwgNCglMSksICUwCTtcbiIKLQkgICAgImFkY2wgOCglMSksICUwCTtcbiIKLQkgICAgImFkY2wgMTIoJTEpLCAlMAk7XG4iCi0iMToJICAgIGFkY2wgMTYoJTEpLCAlMAk7XG4iCi0JICAgICJsZWEgNCglMSksICUxCTtcbiIKLQkgICAgImRlY2wgJTIJCTtcbiIKLQkgICAgImpuZSAxYgkJO1xuIgotCSAgICAiYWRjbCAkMCwgJTAJO1xuIgotCSAgICAibW92bCAlMCwgJTIJO1xuIgotCSAgICAic2hybCAkMTYsICUwCTtcbiIKLQkgICAgImFkZHcgJXcyLCAldzAJO1xuIgotCSAgICAiYWRjbCAkMCwgJTAJO1xuIgotCSAgICAibm90bCAlMAkJO1xuIgotIjI6CQkJCTtcbiIKLQkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlwbAotCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKLQkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLwotCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQotCTogIjEiIChpcGgpLCAiMiIgKGlobCkKLQk6ICJtZW1vcnkiKTsKLQlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Ci19Ci0KLS8qCi0gKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQotICovCi0KLXN0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKLXsKLQlfX2FzbV9fKAotCQkiYWRkbCAlMSwgJTAJCTtcbiIKLQkJImFkY2wgJDB4ZmZmZiwgJTAJO1xuIgotCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAotCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCi0JKTsKLQlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIF9fd3N1bSBzdW0pCi17Ci0gICAgX19hc21fXygKLQkiYWRkbCAlMSwgJTAJO1xuIgotCSJhZGNsICUyLCAlMAk7XG4iCi0JImFkY2wgJTMsICUwCTtcbiIKLQkiYWRjbCAkMCwgJTAJO1xuIgotCTogIj1yIiAoc3VtKQotCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIoc3VtKSk7Ci0gICAgcmV0dXJuIHN1bTsKLX0KLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCi0gKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAotICovCi1zdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIF9fd3N1bSBzdW0pCi17Ci0JcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwotfQotCi0vKgotICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQotICogaW4gaWNtcC5jCi0gKi8KLQotc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQotewotICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKLX0KLQotI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgX193c3VtIHN1bSkKLXsKLQlfX2FzbV9fKAotCQkiYWRkbCAwKCUxKSwgJTAJCTtcbiIKLQkJImFkY2wgNCglMSksICUwCQk7XG4iCi0JCSJhZGNsIDgoJTEpLCAlMAkJO1xuIgotCQkiYWRjbCAxMiglMSksICUwCTtcbiIKLQkJImFkY2wgMCglMiksICUwCQk7XG4iCi0JCSJhZGNsIDQoJTIpLCAlMAkJO1xuIgotCQkiYWRjbCA4KCUyKSwgJTAJCTtcbiIKLQkJImFkY2wgMTIoJTIpLCAlMAk7XG4iCi0JCSJhZGNsICUzLCAlMAkJO1xuIgotCQkiYWRjbCAlNCwgJTAJCTtcbiIKLQkJImFkY2wgJDAsICUwCQk7XG4iCi0JCTogIj0mciIgKHN1bSkKLQkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCi0JCSAgInIiKGh0b25sKGxlbikpLCAiciIoaHRvbmwocHJvdG8pKSwgIjAiKHN1bSkpOwotCi0JcmV0dXJuIGNzdW1fZm9sZChzdW0pOwotfQotCi0vKgotICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgotICovCi0jZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAotCQkJCQkJICAgICB2b2lkIF9fdXNlciAqZHN0LAotCQkJCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkgewotCQlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7Ci0JCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwotCQl9Ci0KLQkJcmV0dXJuIGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKLQl9Ci0KLQlpZiAobGVuKQotCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCi19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDM3Y2MuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKLSAqIEF1dGhvcjogQm9kbyBTdHJvZXNzZXIgPGJzdHJvZXNzZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fRkFVTFRJTkZPX0kzODZfSAotI2RlZmluZSBfX0ZBVUxUSU5GT19JMzg2X0gKLQotLyogdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgYXJjaC1zcGVjaWZpYyBmYXVsdGluZm8KLSAqIGZyb20gdGhlIHRyYXBzLgotICogT24gaTM4NiwgcHRyYWNlX2ZhdWx0aW5mbyB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QgcHJvdmlkZQotICogYWxsIHRoZSBpbmZvLCBzaW5jZSB0cmFwX25vIGlzIG1pc3NpbmcuCi0gKiBBbGwgY29tbW9uIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluCi0gKiBib3RoIHN0cnVjdHVyZXMsIHRodXMgbWFraW5nIGl0IGVhc3kgdG8gY29weSB0aGUKLSAqIGNvbnRlbnRzIHdpdGhvdXQga25vd2xlZGdlIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMuCi0gKi8KLXN0cnVjdCBmYXVsdGluZm8gewotICAgICAgICBpbnQgZXJyb3JfY29kZTsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBtaXNsZWFkaW5nbHkgY2FsbGVkIGlzX3dyaXRlICovCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgY3IyOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIGNhbGxlZCBhZGRyICovCi0gICAgICAgIGludCB0cmFwX25vOyAvKiBtaXNzaW5nIGluIHB0cmFjZV9mYXVsdGluZm8gKi8KLX07Ci0KLSNkZWZpbmUgRkFVTFRfV1JJVEUoZmkpICgoZmkpLmVycm9yX2NvZGUgJiAyKQotI2RlZmluZSBGQVVMVF9BRERSRVNTKGZpKSAoKGZpKS5jcjIpCi0KLSNkZWZpbmUgUFRSQUNFX0ZVTExfRkFVTFRJTkZPIDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvaG9zdF9sZHQuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUzY2M0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9IT1NUX0xEVF9JMzg2X0gKLSNkZWZpbmUgX19BU01fSE9TVF9MRFRfSTM4Nl9ICi0KLSNpbmNsdWRlIDxhc20vbGR0Lmg+Ci0KLS8qCi0gKiBtYWNyb3Mgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKLSAqLwotI2RlZmluZSBMRFRfZW50cnlfYShpbmZvKSBcCi0JKCgoKGluZm8pLT5iYXNlX2FkZHIgJiAweDAwMDBmZmZmKSA8PCAxNikgfCAoKGluZm8pLT5saW1pdCAmIDB4MGZmZmYpKQotCi0jZGVmaW5lIExEVF9lbnRyeV9iKGluZm8pIFwKLQkoKChpbmZvKS0+YmFzZV9hZGRyICYgMHhmZjAwMDAwMCkgfCBcCi0JKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4MDBmZjAwMDApID4+IDE2KSB8IFwKLQkoKGluZm8pLT5saW1pdCAmIDB4ZjAwMDApIHwgXAotCSgoKGluZm8pLT5yZWFkX2V4ZWNfb25seSBeIDEpIDw8IDkpIHwgXAotCSgoaW5mbyktPmNvbnRlbnRzIDw8IDEwKSB8IFwKLQkoKChpbmZvKS0+c2VnX25vdF9wcmVzZW50IF4gMSkgPDwgMTUpIHwgXAotCSgoaW5mbyktPnNlZ18zMmJpdCA8PCAyMikgfCBcCi0JKChpbmZvKS0+bGltaXRfaW5fcGFnZXMgPDwgMjMpIHwgXAotCSgoaW5mbyktPnVzZWFibGUgPDwgMjApIHwgXAotCTB4NzAwMCkKLQotI2RlZmluZSBMRFRfZW1wdHkoaW5mbykgKFwKLQkoaW5mbyktPmJhc2VfYWRkcgk9PSAwCSYmIFwKLQkoaW5mbyktPmxpbWl0CQk9PSAwCSYmIFwKLQkoaW5mbyktPmNvbnRlbnRzCT09IDAJJiYgXAotCShpbmZvKS0+cmVhZF9leGVjX29ubHkJPT0gMQkmJiBcCi0JKGluZm8pLT5zZWdfMzJiaXQJPT0gMAkmJiBcCi0JKGluZm8pLT5saW1pdF9pbl9wYWdlcwk9PSAwCSYmIFwKLQkoaW5mbyktPnNlZ19ub3RfcHJlc2VudAk9PSAxCSYmIFwKLQkoaW5mbyktPnVzZWFibGUJCT09IDAJKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OGE1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfSTM4Nl9QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9JMzg2X1BUUkFDRV9ICi0KLSNpbmNsdWRlICJ1c2VyX2NvbnN0YW50cy5oIgotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotI2RlZmluZSBNQVhfUkVHX05SIChVTV9GUkFNRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotI2RlZmluZSBNQVhfUkVHX09GRlNFVCAoVU1fRlJBTUVfU0laRSkKLQotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9kZWJ1Z3JlZ3MoaW50IHNlcSkge30KLQotLyogc3lzY2FsbCBlbXVsYXRpb24gcGF0aCBpbiBwdHJhY2UgKi8KLQotI2lmbmRlZiBQVFJBQ0VfU1lTRU1VCi0jZGVmaW5lIFBUUkFDRV9TWVNFTVUgMzEKLSNlbmRpZgotCi12b2lkIHNldF91c2luZ19zeXNlbXUoaW50IHZhbHVlKTsKLWludCBnZXRfdXNpbmdfc3lzZW11KHZvaWQpOwotZXh0ZXJuIGludCBzeXNlbXVfc3VwcG9ydGVkOwotCi0jaW5jbHVkZSAic2thc19wdHJlZ3MuaCIKLQotI2RlZmluZSBSRUdTX0lQKHIpICgocilbSE9TVF9JUF0pCi0jZGVmaW5lIFJFR1NfU1AocikgKChyKVtIT1NUX1NQXSkKLSNkZWZpbmUgUkVHU19FRkxBR1MocikgKChyKVtIT1NUX0VGTEFHU10pCi0jZGVmaW5lIFJFR1NfRUFYKHIpICgocilbSE9TVF9FQVhdKQotI2RlZmluZSBSRUdTX0VCWChyKSAoKHIpW0hPU1RfRUJYXSkKLSNkZWZpbmUgUkVHU19FQ1gocikgKChyKVtIT1NUX0VDWF0pCi0jZGVmaW5lIFJFR1NfRURYKHIpICgocilbSE9TVF9FRFhdKQotI2RlZmluZSBSRUdTX0VTSShyKSAoKHIpW0hPU1RfRVNJXSkKLSNkZWZpbmUgUkVHU19FREkocikgKChyKVtIT1NUX0VESV0pCi0jZGVmaW5lIFJFR1NfRUJQKHIpICgocilbSE9TVF9FQlBdKQotI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCi0jZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKLSNkZWZpbmUgUkVHU19EUyhyKSAoKHIpW0hPU1RfRFNdKQotI2RlZmluZSBSRUdTX0VTKHIpICgocilbSE9TVF9FU10pCi0jZGVmaW5lIFJFR1NfRlMocikgKChyKVtIT1NUX0ZTXSkKLSNkZWZpbmUgUkVHU19HUyhyKSAoKHIpW0hPU1RfR1NdKQotCi0jZGVmaW5lIFJFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHIsIHJlcykgUkVHU19FQVgocikgPSAocmVzKQotCi0jZGVmaW5lIFJFR1NfUkVTVEFSVF9TWVNDQUxMKHIpIElQX1JFU1RBUlRfU1lTQ0FMTChSRUdTX0lQKHIpKQotCi0jaWZuZGVmIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUAotI2RlZmluZSBQVFJBQ0VfU1lTRU1VX1NJTkdMRVNURVAgMzIKLSNlbmRpZgotCi1zdHJ1Y3QgdW1sX3B0X3JlZ3MgewotCXVuc2lnbmVkIGxvbmcgZ3BbTUFYX1JFR19OUl07Ci0JdW5zaWduZWQgbG9uZyBmcFtIT1NUX0ZQWF9TSVpFXTsKLQlzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLQlsb25nIHN5c2NhbGw7Ci0JaW50IGlzX3VzZXI7Ci19OwotCi0jZGVmaW5lIEVNUFRZX1VNTF9QVF9SRUdTIHsgfQotCi0jZGVmaW5lIFVQVF9JUChyKSBSRUdTX0lQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9TUChyKSBSRUdTX1NQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FRkxBR1MocikgUkVHU19FRkxBR1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VBWChyKSBSRUdTX0VBWCgociktPmdwKQotI2RlZmluZSBVUFRfRUJYKHIpIFJFR1NfRUJYKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FQ1gocikgUkVHU19FQ1goKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VEWChyKSBSRUdTX0VEWCgociktPmdwKQotI2RlZmluZSBVUFRfRVNJKHIpIFJFR1NfRVNJKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9FREkocikgUkVHU19FREkoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VCUChyKSBSRUdTX0VCUCgociktPmdwKQotI2RlZmluZSBVUFRfT1JJR19FQVgocikgKChyKS0+c3lzY2FsbCkKLSNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1NTKHIpIFJFR1NfU1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0RTKHIpIFJFR1NfRFMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0VTKHIpIFJFR1NfRVMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0ZTKHIpIFJFR1NfRlMoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0dTKHIpIFJFR1NfR1MoKHIpLT5ncCkKLQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcxKHIpIFVQVF9FQlgocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMihyKSBVUFRfRUNYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzMocikgVVBUX0VEWChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc0KHIpIFVQVF9FU0kocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNShyKSBVUFRfRURJKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzYocikgVVBUX0VCUChyKQotCi1leHRlcm4gaW50IHVzZXJfY29udGV4dCh1bnNpZ25lZCBsb25nIHNwKTsKLQotI2RlZmluZSBVUFRfSVNfVVNFUihyKSAoKHIpLT5pc191c2VyKQotCi1zdHJ1Y3Qgc3lzY2FsbF9hcmdzIHsKLQl1bnNpZ25lZCBsb25nIGFyZ3NbNl07Ci19OwotCi0jZGVmaW5lIFNZU0NBTExfQVJHUyhyKSAoKHN0cnVjdCBzeXNjYWxsX2FyZ3MpIFwKLQkJCSB7IC5hcmdzID0geyBVUFRfU1lTQ0FMTF9BUkcxKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkcyKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkczKHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc0KHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc1KHIpLAlcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc2KHIpIH0gfSApCi0KLSNkZWZpbmUgVVBUX1JFRyhyZWdzLCByZWcpIFwKLQkoewl1bnNpZ25lZCBsb25nIHZhbDsgXAotCQlzd2l0Y2gocmVnKXsgXAotCQljYXNlIEVJUDogdmFsID0gVVBUX0lQKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIFVFU1A6IHZhbCA9IFVQVF9TUChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFQVg6IHZhbCA9IFVQVF9FQVgocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRUJYOiB2YWwgPSBVUFRfRUJYKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEVDWDogdmFsID0gVVBUX0VDWChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFRFg6IHZhbCA9IFVQVF9FRFgocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRVNJOiB2YWwgPSBVUFRfRVNJKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEVESTogdmFsID0gVVBUX0VESShyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFQlA6IHZhbCA9IFVQVF9FQlAocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgT1JJR19FQVg6IHZhbCA9IFVQVF9PUklHX0VBWChyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBDUzogdmFsID0gVVBUX0NTKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIFNTOiB2YWwgPSBVUFRfU1MocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgRFM6IHZhbCA9IFVQVF9EUyhyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFUzogdmFsID0gVVBUX0VTKHJlZ3MpOyBicmVhazsgXAotCQljYXNlIEZTOiB2YWwgPSBVUFRfRlMocmVncyk7IGJyZWFrOyBcCi0JCWNhc2UgR1M6IHZhbCA9IFVQVF9HUyhyZWdzKTsgYnJlYWs7IFwKLQkJY2FzZSBFRkw6IHZhbCA9IFVQVF9FRkxBR1MocmVncyk7IGJyZWFrOyBcCi0JCWRlZmF1bHQgOiAgXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfUkVHIDogJWRcbiIsIHJlZyk7ICBcCi0JCQl2YWwgPSAtMTsgXAotCQl9IFwKLQkgICAgICAgIHZhbDsgXAotCX0pCi0KLSNkZWZpbmUgVVBUX1NFVChyZWdzLCByZWcsIHZhbCkgXAotCWRvIHsgXAotCQlzd2l0Y2gocmVnKXsgXAotCQljYXNlIEVJUDogVVBUX0lQKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFVFU1A6IFVQVF9TUChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFQVg6IFVQVF9FQVgocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRUJYOiBVUFRfRUJYKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEVDWDogVVBUX0VDWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFRFg6IFVQVF9FRFgocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRVNJOiBVUFRfRVNJKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEVESTogVVBUX0VESShyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFQlA6IFVQVF9FQlAocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgT1JJR19FQVg6IFVQVF9PUklHX0VBWChyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIFNTOiBVUFRfU1MocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgRFM6IFVQVF9EUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFUzogVVBUX0VTKHJlZ3MpID0gdmFsOyBicmVhazsgXAotCQljYXNlIEZTOiBVUFRfRlMocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWNhc2UgR1M6IFVQVF9HUyhyZWdzKSA9IHZhbDsgYnJlYWs7IFwKLQkJY2FzZSBFRkw6IFVQVF9FRkxBR1MocmVncykgPSB2YWw7IGJyZWFrOyBcCi0JCWRlZmF1bHQgOiAgXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfU0VUIDogJWRcbiIsIHJlZyk7ICBcCi0JCQlicmVhazsgXAotCQl9IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVQVF9TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBcCi0JUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4oKHIpLT5yZWdzLCAocmVzKSkKLQotI2RlZmluZSBVUFRfUkVTVEFSVF9TWVNDQUxMKHIpIFJFR1NfUkVTVEFSVF9TWVNDQUxMKChyKS0+Z3ApCi0KLSNkZWZpbmUgVVBUX09SSUdfU1lTQ0FMTChyKSBVUFRfRUFYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX05SKHIpIFVQVF9PUklHX0VBWChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX0VBWChyKQotCi0jZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKLQotZXh0ZXJuIHZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2MjQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfSTM4Nl9QVFJBQ0VfVVNFUl9IX18KLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9QVFJBQ0VfVVNFUl9IX18KLQotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSAidXNlcl9jb25zdGFudHMuaCIKLQotI2RlZmluZSBQVF9PRkZTRVQocikgKChyKSAqIHNpemVvZihsb25nKSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX05SKHJlZ3MpICgocmVncylbT1JJR19FQVhdKQotI2RlZmluZSBQVF9TWVNDQUxMX05SX09GRlNFVCBQVF9PRkZTRVQoT1JJR19FQVgpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkcxX09GRlNFVCBQVF9PRkZTRVQoRUJYKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzJfT0ZGU0VUIFBUX09GRlNFVChFQ1gpCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHM19PRkZTRVQgUFRfT0ZGU0VUKEVEWCkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc0X09GRlNFVCBQVF9PRkZTRVQoRVNJKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzVfT0ZGU0VUIFBUX09GRlNFVChFREkpCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNl9PRkZTRVQgUFRfT0ZGU0VUKEVCUCkKLQotI2RlZmluZSBQVF9TWVNDQUxMX1JFVF9PRkZTRVQgUFRfT0ZGU0VUKEVBWCkKLQotI2RlZmluZSBSRUdTX1NZU0NBTExfTlIgRUFYIC8qIFRoaXMgaXMgdXNlZCBiZWZvcmUgYSBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMSBFQlgKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzIgRUNYCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIEVEWAotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNCBFU0kKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzUgRURJCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkc2IEVCUAotCi0jZGVmaW5lIFJFR1NfSVBfSU5ERVggRUlQCi0jZGVmaW5lIFJFR1NfU1BfSU5ERVggVUVTUAotCi0jZGVmaW5lIFBUX0lQX09GRlNFVCBQVF9PRkZTRVQoRUlQKQotI2RlZmluZSBQVF9JUChyZWdzKSAoKHJlZ3MpW0VJUF0pCi0jZGVmaW5lIFBUX1NQX09GRlNFVCBQVF9PRkZTRVQoVUVTUCkKLSNkZWZpbmUgUFRfU1AocmVncykgKChyZWdzKVtVRVNQXSkKLQotI2RlZmluZSBGUF9TSVpFICgoSE9TVF9GUFhfU0laRSA+IEhPU1RfRlBfU0laRSkgPyBIT1NUX0ZQWF9TSVpFIDogSE9TVF9GUF9TSVpFKQotCi0jaWZuZGVmIEZSQU1FX1NJWkUKLSNkZWZpbmUgRlJBTUVfU0laRSAoMTcpCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2MuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdkMTc4Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X1NDX0gKLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9TQ19ICi0KLSNpbmNsdWRlIDx1c2VyX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIFNDX09GRlNFVChzYywgZmllbGQpIFwKLQkqKCh1bnNpZ25lZCBsb25nICopICYoKChjaGFyICopIChzYykpW0hPU1RfIyNmaWVsZF0pKQotI2RlZmluZSBTQ19GUF9PRkZTRVQoc2MsIGZpZWxkKSBcCi0JKigodW5zaWduZWQgbG9uZyAqKSAmKCgoY2hhciAqKSAoU0NfRlBTVEFURShzYykpKVtIT1NUXyMjZmllbGRdKSkKLSNkZWZpbmUgU0NfRlBfT0ZGU0VUX1BUUihzYywgZmllbGQsIHR5cGUpIFwKLQkoKHR5cGUgKikgJigoKGNoYXIgKikgKFNDX0ZQU1RBVEUoc2MpKSlbSE9TVF8jI2ZpZWxkXSkpCi0KLSNkZWZpbmUgU0NfSVAoc2MpIFNDX09GRlNFVChzYywgU0NfSVApCi0jZGVmaW5lIFNDX1NQKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NQKQotI2RlZmluZSBTQ19GUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19GUykKLSNkZWZpbmUgU0NfR1Moc2MpIFNDX09GRlNFVChzYywgU0NfR1MpCi0jZGVmaW5lIFNDX0RTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0RTKQotI2RlZmluZSBTQ19FUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19FUykKLSNkZWZpbmUgU0NfU1Moc2MpIFNDX09GRlNFVChzYywgU0NfU1MpCi0jZGVmaW5lIFNDX0NTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0NTKQotI2RlZmluZSBTQ19FRkxBR1Moc2MpIFNDX09GRlNFVChzYywgU0NfRUZMQUdTKQotI2RlZmluZSBTQ19FQVgoc2MpIFNDX09GRlNFVChzYywgU0NfRUFYKQotI2RlZmluZSBTQ19FQlgoc2MpIFNDX09GRlNFVChzYywgU0NfRUJYKQotI2RlZmluZSBTQ19FQ1goc2MpIFNDX09GRlNFVChzYywgU0NfRUNYKQotI2RlZmluZSBTQ19FRFgoc2MpIFNDX09GRlNFVChzYywgU0NfRURYKQotI2RlZmluZSBTQ19FREkoc2MpIFNDX09GRlNFVChzYywgU0NfRURJKQotI2RlZmluZSBTQ19FU0koc2MpIFNDX09GRlNFVChzYywgU0NfRVNJKQotI2RlZmluZSBTQ19FQlAoc2MpIFNDX09GRlNFVChzYywgU0NfRUJQKQotI2RlZmluZSBTQ19UUkFQTk8oc2MpIFNDX09GRlNFVChzYywgU0NfVFJBUE5PKQotI2RlZmluZSBTQ19FUlIoc2MpIFNDX09GRlNFVChzYywgU0NfRVJSKQotI2RlZmluZSBTQ19DUjIoc2MpIFNDX09GRlNFVChzYywgU0NfQ1IyKQotI2RlZmluZSBTQ19GUFNUQVRFKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0ZQU1RBVEUpCi0jZGVmaW5lIFNDX1NJR01BU0soc2MpIFNDX09GRlNFVChzYywgU0NfU0lHTUFTSykKLSNkZWZpbmUgU0NfRlBfQ1coc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfQ1cpCi0jZGVmaW5lIFNDX0ZQX1NXKHNjKSBTQ19GUF9PRkZTRVQoc2MsIFNDX0ZQX1NXKQotI2RlZmluZSBTQ19GUF9UQUcoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfVEFHKQotI2RlZmluZSBTQ19GUF9JUE9GRihzYykgU0NfRlBfT0ZGU0VUKHNjLCBTQ19GUF9JUE9GRikKLSNkZWZpbmUgU0NfRlBfQ1NTRUwoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfQ1NTRUwpCi0jZGVmaW5lIFNDX0ZQX0RBVEFPRkYoc2MpIFNDX0ZQX09GRlNFVChzYywgU0NfRlBfREFUQU9GRikKLSNkZWZpbmUgU0NfRlBfREFUQVNFTChzYykgU0NfRlBfT0ZGU0VUKHNjLCBTQ19GUF9EQVRBU0VMKQotI2RlZmluZSBTQ19GUF9TVChzYykgU0NfRlBfT0ZGU0VUX1BUUihzYywgU0NfRlBfU1QsIHN0cnVjdCBfZnBzdGF0ZSkKLSNkZWZpbmUgU0NfRlhTUl9FTlYoc2MpIFNDX0ZQX09GRlNFVF9QVFIoc2MsIFNDX0ZYU1JfRU5WLCB2b2lkKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2lnY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgzYzg3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNfU0lHQ09OVEVYVF9JMzg2X0gKLSNkZWZpbmUgX19TWVNfU0lHQ09OVEVYVF9JMzg2X0gKLQotI2luY2x1ZGUgInN5c2RlcC9zYy5oIgotCi0jZGVmaW5lIElQX1JFU1RBUlRfU1lTQ0FMTChpcCkgKChpcCkgLT0gMikKLQotI2RlZmluZSBHRVRfRkFVTFRJTkZPX0ZST01fU0MoZmksIHNjKSBcCi0JeyBcCi0JCShmaSkuY3IyID0gU0NfQ1IyKHNjKTsgXAotCQkoZmkpLmVycm9yX2NvZGUgPSBTQ19FUlIoc2MpOyBcCi0JCShmaSkudHJhcF9ubyA9IFNDX1RSQVBOTyhzYyk7IFwKLQl9Ci0KLS8qIFRoaXMgaXMgUGFnZSBGYXVsdCAqLwotI2RlZmluZSBTRUdWX0lTX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDE0KQotCi0vKiBTS0FTMyBoYXMgbm8gdHJhcF9ubyBvbiBpMzg2LCBidXQgZ2V0X3NrYXNfZmF1bHRpbmZvKCkgc2V0cyBpdCB0byAwLiAqLwotI2RlZmluZSBTRUdWX01BWUJFX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDAgJiYgcHRyYWNlX2ZhdWx0aW5mbykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc2thc19wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdiOGE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9JMzg2X1NLQVNfUFRSQUNFX0gKLSNkZWZpbmUgX19TWVNERVBfSTM4Nl9TS0FTX1BUUkFDRV9ICi0KLXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIHsKLSAgICAgICAgaW50IGlzX3dyaXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci19OwotCi1zdHJ1Y3QgcHRyYWNlX2xkdCB7Ci0gICAgICAgIGludCBmdW5jOwotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50OwotfTsKLQotI2RlZmluZSBQVFJBQ0VfTERUIDU0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N0dWIuaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2RlZGQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9TVFVCX0gKLSNkZWZpbmUgX19TWVNERVBfU1RVQl9ICi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSAiYXMtbGF5b3V0LmgiCi0jaW5jbHVkZSAic3R1Yi1kYXRhLmgiCi0jaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKLQotZXh0ZXJuIHZvaWQgc3R1Yl9zZWd2X2hhbmRsZXIoaW50IHNpZyk7Ci1leHRlcm4gdm9pZCBzdHViX2Nsb25lX2hhbmRsZXIodm9pZCk7Ci0KLSNkZWZpbmUgU1RVQl9TWVNDQUxMX1JFVCBFQVgKLSNkZWZpbmUgU1RVQl9NTUFQX05SIF9fTlJfbW1hcDIKLSNkZWZpbmUgTU1BUF9PRkZTRVQobykgKChvKSA+PiBVTV9LRVJOX1BBR0VfU0hJRlQpCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwwKGxvbmcgc3lzY2FsbCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDEobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwyKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMyhsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSwgImQiIChhcmczKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCi0JCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpLCAiUyIgKGFyZzQpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw1KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKLQkJCQkgbG9uZyBhcmc0LCBsb25nIGFyZzUpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlICgiaW50ICQweDgwIiA6ICI9YSIgKHJldCkgOiAiMCIgKHN5c2NhbGwpLCAiYiIgKGFyZzEpLAotCQkJImMiIChhcmcyKSwgImQiIChhcmczKSwgIlMiIChhcmc0KSwgIkQiIChhcmc1KSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhcF9teXNlbGYodm9pZCkKLXsKLQlfX2FzbSgiaW50MyIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfc3RhY2soaW50IGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlfX2FzbV9fIHZvbGF0aWxlICgibW92bCAlJWVheCwlJWVicCA7IG1vdmwgJTAsJSVlYXggOyBpbnQgJDB4ODAgOyIKLQkJCSAgIm1vdmwgJTcsICUlZWJ4IDsgbW92bCAlJWVheCwgKCUlZWJ4KSIKLQkJCSAgOiA6ICJnIiAoU1RVQl9NTUFQX05SKSwgImIiIChTVFVCX0RBVEEpLAotCQkJICAgICJjIiAoVU1fS0VSTl9QQUdFX1NJWkUpLAotCQkJICAgICJkIiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSksCi0JCQkgICAgIlMiIChNQVBfRklYRUQgfCBNQVBfU0hBUkVEKSwgIkQiIChmZCksCi0JCQkgICAgImEiIChvZmZzZXQpLAotCQkJICAgICJpIiAoJigoc3RydWN0IHN0dWJfZGF0YSAqKSBTVFVCX0RBVEEpLT5lcnIpCi0JCQkgIDogIm1lbW9yeSIpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaCBiL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTNjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9TWVNURU1fSF8KLSNkZWZpbmUgX0FTTV9YODZfU1lTVEVNX0hfCi0KLSNpbmNsdWRlIDxhc20vYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9jbXB4Y2hnLmg+Ci0jaW5jbHVkZSA8YXNtL25vcHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+Ci0KLS8qIGVudHJpZXMgaW4gQVJDSF9ETElORk86ICovCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0jIGRlZmluZSBBVF9WRUNUT1JfU0laRV9BUkNIIDIKLSNlbHNlCi0jIGRlZmluZSBBVF9WRUNUT1JfU0laRV9BUkNIIDEKLSNlbmRpZgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApOwotCi12b2lkIGRlZmF1bHRfaWRsZSh2b2lkKTsKLQotLyoKLSAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCi0gKiBBbmQgeWVzLCB0aGlzIGlzIHJlcXVpcmVkIG9uIFVQIHRvbyB3aGVuIHdlJ3JlIHRhbGtpbmcKLSAqIHRvIGRldmljZXMuCi0gKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0vKgotICogU29tZSBub24tSW50ZWwgY2xvbmVzIHN1cHBvcnQgb3V0IG9mIG9yZGVyIHN0b3JlLiB3bWIoKSBjZWFzZXMgdG8gYmUgYQotICogbm9wIGZvciB0aGVzZS4KLSAqLwotI2RlZmluZSBtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgIm1mZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTTIpCi0jZGVmaW5lIHJtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgImxmZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTTIpCi0jZGVmaW5lIHdtYigpIGFsdGVybmF0aXZlKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIiwgInNmZW5jZSIsIFg4Nl9GRUFUVVJFX1hNTSkKLSNlbHNlCi0jZGVmaW5lIG1iKCkgCWFzbSB2b2xhdGlsZSgibWZlbmNlIjo6OiJtZW1vcnkiKQotI2RlZmluZSBybWIoKQlhc20gdm9sYXRpbGUoImxmZW5jZSI6OjoibWVtb3J5IikKLSNkZWZpbmUgd21iKCkJYXNtIHZvbGF0aWxlKCJzZmVuY2UiIDo6OiAibWVtb3J5IikKLSNlbmRpZgotCi0vKioKLSAqIHJlYWRfYmFycmllcl9kZXBlbmRzIC0gRmx1c2ggYWxsIHBlbmRpbmcgcmVhZHMgdGhhdCBzdWJzZXF1ZW50cyByZWFkcwotICogZGVwZW5kIG9uLgotICoKLSAqIE5vIGRhdGEtZGVwZW5kZW50IHJlYWRzIGZyb20gbWVtb3J5LWxpa2UgcmVnaW9ucyBhcmUgZXZlciByZW9yZGVyZWQKLSAqIG92ZXIgdGhpcyBiYXJyaWVyLiAgQWxsIHJlYWRzIHByZWNlZGluZyB0aGlzIHByaW1pdGl2ZSBhcmUgZ3VhcmFudGVlZAotICogdG8gYWNjZXNzIG1lbW9yeSAoYnV0IG5vdCBuZWNlc3NhcmlseSBvdGhlciBDUFVzJyBjYWNoZXMpIGJlZm9yZSBhbnkKLSAqIHJlYWRzIGZvbGxvd2luZyB0aGlzIHByaW1pdGl2ZSB0aGF0IGRlcGVuZCBvbiB0aGUgZGF0YSByZXR1cm4gYnkKLSAqIGFueSBvZiB0aGUgcHJlY2VkaW5nIHJlYWRzLiAgVGhpcyBwcmltaXRpdmUgaXMgbXVjaCBsaWdodGVyIHdlaWdodCB0aGFuCi0gKiBybWIoKSBvbiBtb3N0IENQVXMsIGFuZCBpcyBuZXZlciBoZWF2aWVyIHdlaWdodCB0aGFuIGlzCi0gKiBybWIoKS4KLSAqCi0gKiBUaGVzZSBvcmRlcmluZyBjb25zdHJhaW50cyBhcmUgcmVzcGVjdGVkIGJ5IGJvdGggdGhlIGxvY2FsIENQVQotICogYW5kIHRoZSBjb21waWxlci4KLSAqCi0gKiBPcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCBieSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIHByaW1pdGl2ZXMsCi0gKiBub3QgZXZlbiBieSBkYXRhIGRlcGVuZGVuY2llcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKLSAqIG1lbW9yeV9iYXJyaWVyKCkgZm9yIGV4YW1wbGVzIGFuZCBVUkxzIHRvIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBmb3JjZSBvcmRlcmluZyAodGhlIGluaXRpYWwKLSAqIHZhbHVlIG9mICJhIiBpcyB6ZXJvLCAiYiIgaXMgb25lLCBhbmQgInAiIGlzICImYSIpOgotICoKLSAqIDxwcm9ncmFtbGlzdGluZz4KLSAqCUNQVSAwCQkJCUNQVSAxCi0gKgotICoJYiA9IDI7Ci0gKgltZW1vcnlfYmFycmllcigpOwotICoJcCA9ICZiOwkJCQlxID0gcDsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCWQgPSAqcTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogYmVjYXVzZSB0aGUgcmVhZCBvZiAiKnEiIGRlcGVuZHMgb24gdGhlIHJlYWQgb2YgInAiIGFuZCB0aGVzZQotICogdHdvIHJlYWRzIGFyZSBzZXBhcmF0ZWQgYnkgYSByZWFkX2JhcnJpZXJfZGVwZW5kcygpLiAgSG93ZXZlciwKLSAqIHRoZSBmb2xsb3dpbmcgY29kZSwgd2l0aCB0aGUgc2FtZSBpbml0aWFsIHZhbHVlcyBmb3IgImEiIGFuZCAiYiI6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKglhID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKgliID0gMzsJCQkJeSA9IGI7Ci0gKgkJCQkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLSAqCQkJCQl4ID0gYTsKLSAqIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gKgotICogZG9lcyBub3QgZW5mb3JjZSBvcmRlcmluZywgc2luY2UgdGhlcmUgaXMgbm8gZGF0YSBkZXBlbmRlbmN5IGJldHdlZW4KLSAqIHRoZSByZWFkIG9mICJhIiBhbmQgdGhlIHJlYWQgb2YgImIiLiAgVGhlcmVmb3JlLCBvbiBzb21lIENQVXMsIHN1Y2gKLSAqIGFzIEFscGhhLCAieSIgY291bGQgYmUgc2V0IHRvIDMgYW5kICJ4IiB0byAwLiAgVXNlIHJtYigpCi0gKiBpbiBjYXNlcyBsaWtlIHRoaXMgd2hlcmUgdGhlcmUgYXJlIG5vIGRhdGEgZGVwZW5kZW5jaWVzLgotICoqLwotCi0jZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQotCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzbXBfbWIoKQltYigpCi0jaWZkZWYgQ09ORklHX1g4Nl9QUFJPX0ZFTkNFCi0jIGRlZmluZSBzbXBfcm1iKCkJcm1iKCkKLSNlbHNlCi0jIGRlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2X09PU1RPUkUKLSMgZGVmaW5lIHNtcF93bWIoKSAJd21iKCkKLSNlbHNlCi0jIGRlZmluZSBzbXBfd21iKCkJYmFycmllcigpCi0jZW5kaWYKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCl4Y2hnKCZ2YXIsIHZhbHVlKTsgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyB2YXIgPSB2YWx1ZTsgYmFycmllcigpOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLS8qCi0gKiBTdG9wIFJEVFNDIHNwZWN1bGF0aW9uLiBUaGlzIGlzIG5lZWRlZCB3aGVuIHlvdSBuZWVkIHRvIHVzZSBSRFRTQwotICogKG9yIGdldF9jeWNsZXMgb3IgdnJlYWQgdGhhdCBwb3NzaWJseSBhY2Nlc3NlcyB0aGUgVFNDKSBpbiBhIGRlZmluZWQKLSAqIGNvZGUgcmVnaW9uLgotICoKLSAqIChDb3VsZCB1c2UgYW4gYWx0ZXJuYXRpdmUgdGhyZWUgd2F5IGZvciB0aGlzIGlmIHRoZXJlIHdhcyBvbmUuKQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmR0c2NfYmFycmllcih2b2lkKQotewotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDKTsKLQlhbHRlcm5hdGl2ZShBU01fTk9QMywgImxmZW5jZSIsIFg4Nl9GRUFUVVJFX0xGRU5DRV9SRFRTQyk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3Rscy5oIGIvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU1MDc1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC90bHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNpZm5kZWYgX1NZU0RFUF9UTFNfSAotI2RlZmluZSBfU1lTREVQX1RMU19ICi0KLSMgaWZuZGVmIF9fS0VSTkVMX18KLQotLyogQ2hhbmdlIG5hbWUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIG9yaWdpbmFsIG9uZSBmcm9tIDxhc20vbGR0Lmg+LCB3aGljaAotICogbWF5IGJlIG5hbWVkIHVzZXJfZGVzYyAoYnV0IGluIDIuNCBhbmQgaW4gaGVhZGVyIG1hdGNoaW5nIGl0cyBBUEkgd2FzIG5hbWVkCi0gKiBtb2RpZnlfbGR0X2xkdF9zKS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgdW1fZHVwX3VzZXJfZGVzYyB7Ci0JdW5zaWduZWQgaW50ICBlbnRyeV9udW1iZXI7Ci0JdW5zaWduZWQgaW50ICBiYXNlX2FkZHI7Ci0JdW5zaWduZWQgaW50ICBsaW1pdDsKLQl1bnNpZ25lZCBpbnQgIHNlZ18zMmJpdDoxOwotCXVuc2lnbmVkIGludCAgY29udGVudHM6MjsKLQl1bnNpZ25lZCBpbnQgIHJlYWRfZXhlY19vbmx5OjE7Ci0JdW5zaWduZWQgaW50ICBsaW1pdF9pbl9wYWdlczoxOwotCXVuc2lnbmVkIGludCAgc2VnX25vdF9wcmVzZW50OjE7Ci0JdW5zaWduZWQgaW50ICB1c2VhYmxlOjE7Ci19IHVzZXJfZGVzY190OwotCi0jIGVsc2UgLyogX19LRVJORUxfXyAqLwotCi0jICBpbmNsdWRlIDxsZHQuaD4KLXR5cGVkZWYgc3RydWN0IHVzZXJfZGVzYyB1c2VyX2Rlc2NfdDsKLQotIyBlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU5fSTM4NiA2Ci0jZGVmaW5lIEdEVF9FTlRSWV9UTFNfTUlOX1g4Nl82NCAxMgotCi0jZW5kaWYgLyogX1NZU0RFUF9UTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmggYi9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBkMjRjNS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVk1fRkxBR1NfSTM4Nl9ICi0jZGVmaW5lIF9fVk1fRkxBR1NfSTM4Nl9ICi0KLSNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKLQkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAotCSgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBSRUFEX0lNUExJRVNfRVhFQykgPyBWTV9FWEVDIDogMCApIHwgXAotCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jIGIvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhNDY2Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+Ci0jaW5jbHVkZSAiZnJhbWVfa2Vybi5oIgotI2luY2x1ZGUgInNrYXMuaCIKLQotdm9pZCBjb3B5X3NjKHN0cnVjdCB1bWxfcHRfcmVncyAqcmVncywgdm9pZCAqZnJvbSkKLXsKLQlzdHJ1Y3Qgc2lnY29udGV4dCAqc2MgPSBmcm9tOwotCi0JUkVHU19HUyhyZWdzLT5ncCkgPSBzYy0+Z3M7Ci0JUkVHU19GUyhyZWdzLT5ncCkgPSBzYy0+ZnM7Ci0JUkVHU19FUyhyZWdzLT5ncCkgPSBzYy0+ZXM7Ci0JUkVHU19EUyhyZWdzLT5ncCkgPSBzYy0+ZHM7Ci0JUkVHU19FREkocmVncy0+Z3ApID0gc2MtPmRpOwotCVJFR1NfRVNJKHJlZ3MtPmdwKSA9IHNjLT5zaTsKLQlSRUdTX0VCUChyZWdzLT5ncCkgPSBzYy0+YnA7Ci0JUkVHU19TUChyZWdzLT5ncCkgPSBzYy0+c3A7Ci0JUkVHU19FQlgocmVncy0+Z3ApID0gc2MtPmJ4OwotCVJFR1NfRURYKHJlZ3MtPmdwKSA9IHNjLT5keDsKLQlSRUdTX0VDWChyZWdzLT5ncCkgPSBzYy0+Y3g7Ci0JUkVHU19FQVgocmVncy0+Z3ApID0gc2MtPmF4OwotCVJFR1NfSVAocmVncy0+Z3ApID0gc2MtPmlwOwotCVJFR1NfQ1MocmVncy0+Z3ApID0gc2MtPmNzOwotCVJFR1NfRUZMQUdTKHJlZ3MtPmdwKSA9IHNjLT5mbGFnczsKLQlSRUdTX1NTKHJlZ3MtPmdwKSA9IHNjLT5zczsKLX0KLQotLyoKLSAqIEZQVSB0YWcgd29yZCBjb252ZXJzaW9ucy4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHR3ZF9pMzg3X3RvX2Z4c3IodW5zaWduZWQgc2hvcnQgdHdkKQotewotCXVuc2lnbmVkIGludCB0bXA7IC8qIHRvIGF2b2lkIDE2IGJpdCBwcmVmaXhlcyBpbiB0aGUgY29kZSAqLwotCi0JLyogVHJhbnNmb3JtIGVhY2ggcGFpciBvZiBiaXRzIGludG8gMDEgKHZhbGlkKSBvciAwMCAoZW1wdHkpICovCi0JdG1wID0gfnR3ZDsKLQl0bXAgPSAodG1wIHwgKHRtcD4+MSkpICYgMHg1NTU1OyAvKiAwVjBWMFYwVjBWMFYwVjBWICovCi0JLyogYW5kIG1vdmUgdGhlIHZhbGlkIGJpdHMgdG8gdGhlIGxvd2VyIGJ5dGUuICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gMSkpICYgMHgzMzMzOyAvKiAwMFZWMDBWVjAwVlYwMFZWICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gMikpICYgMHgwZjBmOyAvKiAwMDAwVlZWVjAwMDBWVlZWICovCi0JdG1wID0gKHRtcCB8ICh0bXAgPj4gNCkpICYgMHgwMGZmOyAvKiAwMDAwMDAwMFZWVlZWVlZWICovCi0JcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHR3ZF9meHNyX3RvX2kzODcoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSkKLXsKLQlzdHJ1Y3QgX2ZweHJlZyAqc3QgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgdHdkID0gKHVuc2lnbmVkIGxvbmcpIGZ4c2F2ZS0+dHdkOwotCXVuc2lnbmVkIGxvbmcgdGFnOwotCXVuc2lnbmVkIGxvbmcgcmV0ID0gMHhmZmZmMDAwMDsKLQlpbnQgaTsKLQotI2RlZmluZSBGUFJFR19BRERSKGYsIG4pCSgoY2hhciAqKSYoZiktPnN0X3NwYWNlICsgKG4pICogMTYpCi0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICh0d2QgJiAweDEpIHsKLQkJCXN0ID0gKHN0cnVjdCBfZnB4cmVnICopIEZQUkVHX0FERFIoZnhzYXZlLCBpKTsKLQotCQkJc3dpdGNoIChzdC0+ZXhwb25lbnQgJiAweDdmZmYpIHsKLQkJCWNhc2UgMHg3ZmZmOgotCQkJCXRhZyA9IDI7CQkvKiBTcGVjaWFsICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MDAwMDoKLQkJCQlpZiAoICFzdC0+c2lnbmlmaWNhbmRbMF0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMV0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbMl0gJiYKLQkJCQkgICAgICFzdC0+c2lnbmlmaWNhbmRbM10gKSB7Ci0JCQkJCXRhZyA9IDE7CS8qIFplcm8gKi8KLQkJCQl9IGVsc2UgewotCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoc3QtPnNpZ25pZmljYW5kWzNdICYgMHg4MDAwKSB7Ci0JCQkJCXRhZyA9IDA7CS8qIFZhbGlkICovCi0JCQkJfSBlbHNlIHsKLQkJCQkJdGFnID0gMjsJLyogU3BlY2lhbCAqLwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRhZyA9IDM7CQkJLyogRW1wdHkgKi8KLQkJfQotCQlyZXQgfD0gKHRhZyA8PCAoMiAqIGkpKTsKLQkJdHdkID0gdHdkID4+IDE7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29udmVydF9meHNyX3RvX3VzZXIoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmLAotCQkJCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmeHNhdmUpCi17Ci0JdW5zaWduZWQgbG9uZyBlbnZbN107Ci0Jc3RydWN0IF9mcHJlZyBfX3VzZXIgKnRvOwotCXN0cnVjdCBfZnB4cmVnICpmcm9tOwotCWludCBpOwotCi0JZW52WzBdID0gKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5jd2QgfCAweGZmZmYwMDAwdWw7Ci0JZW52WzFdID0gKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5zd2QgfCAweGZmZmYwMDAwdWw7Ci0JZW52WzJdID0gdHdkX2Z4c3JfdG9faTM4NyhmeHNhdmUpOwotCWVudlszXSA9IGZ4c2F2ZS0+ZmlwOwotCWVudls0XSA9IGZ4c2F2ZS0+ZmNzIHwgKCh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+Zm9wIDw8IDE2KTsKLQllbnZbNV0gPSBmeHNhdmUtPmZvbzsKLQllbnZbNl0gPSBmeHNhdmUtPmZvczsKLQotCWlmIChfX2NvcHlfdG9fdXNlcihidWYsIGVudiwgNyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCi0JCXJldHVybiAxOwotCi0JdG8gPSAmYnVmLT5fc3RbMF07Ci0JZnJvbSA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCB0bysrLCBmcm9tKyspIHsKLQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnQgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil0bzsKLQkJdW5zaWduZWQgbG9uZyAqZiA9ICh1bnNpZ25lZCBsb25nICopZnJvbTsKLQotCQlpZiAoX19wdXRfdXNlcigqZiwgdCkgfHwKLQkJCQlfX3B1dF91c2VyKCooZiArIDEpLCB0ICsgMSkgfHwKLQkJCQlfX3B1dF91c2VyKGZyb20tPmV4cG9uZW50LCAmdG8tPmV4cG9uZW50KSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmeHNhdmUsCi0JCQkJICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBlbnZbN107Ci0Jc3RydWN0IF9mcHhyZWcgKnRvOwotCXN0cnVjdCBfZnByZWcgX191c2VyICpmcm9tOwotCWludCBpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCBlbnYsIGJ1ZiwgNyAqIHNpemVvZihsb25nKSkpCi0JCXJldHVybiAxOwotCi0JZnhzYXZlLT5jd2QgPSAodW5zaWduZWQgc2hvcnQpKGVudlswXSAmIDB4ZmZmZik7Ci0JZnhzYXZlLT5zd2QgPSAodW5zaWduZWQgc2hvcnQpKGVudlsxXSAmIDB4ZmZmZik7Ci0JZnhzYXZlLT50d2QgPSB0d2RfaTM4N190b19meHNyKCh1bnNpZ25lZCBzaG9ydCkoZW52WzJdICYgMHhmZmZmKSk7Ci0JZnhzYXZlLT5maXAgPSBlbnZbM107Ci0JZnhzYXZlLT5mb3AgPSAodW5zaWduZWQgc2hvcnQpKChlbnZbNF0gJiAweGZmZmYwMDAwdWwpID4+IDE2KTsKLQlmeHNhdmUtPmZjcyA9IChlbnZbNF0gJiAweGZmZmYpOwotCWZ4c2F2ZS0+Zm9vID0gZW52WzVdOwotCWZ4c2F2ZS0+Zm9zID0gZW52WzZdOwotCi0JdG8gPSAoc3RydWN0IF9mcHhyZWcgKikgJmZ4c2F2ZS0+c3Rfc3BhY2VbMF07Ci0JZnJvbSA9ICZidWYtPl9zdFswXTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCB0bysrLCBmcm9tKyspIHsKLQkJdW5zaWduZWQgbG9uZyAqdCA9ICh1bnNpZ25lZCBsb25nICopdG87Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICpmID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopZnJvbTsKLQotCQlpZiAoX19nZXRfdXNlcigqdCwgZikgfHwKLQkJICAgIF9fZ2V0X3VzZXIoKih0ICsgMSksIGYgKyAxKSB8fAotCQkgICAgX19nZXRfdXNlcih0by0+ZXhwb25lbnQsICZmcm9tLT5leHBvbmVudCkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbnQgaGF2ZV9mcHhfcmVnczsKLQotc3RhdGljIGludCBjb3B5X3NjX2Zyb21fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpmcm9tKQotewotCXN0cnVjdCBzaWdjb250ZXh0IHNjOwotCWludCBlcnIsIHBpZDsKLQotCWVyciA9IGNvcHlfZnJvbV91c2VyKCZzYywgZnJvbSwgc2l6ZW9mKHNjKSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOwotCWNvcHlfc2MoJnJlZ3MtPnJlZ3MsICZzYyk7Ci0JaWYgKGhhdmVfZnB4X3JlZ3MpIHsKLQkJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnB4OwotCi0JCWVyciA9IGNvcHlfZnJvbV91c2VyKCZmcHgsCi0JCQkmKChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopc2MuZnBzdGF0ZSktPl9meHNyX2VudlswXSwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIDE7Ci0KLQkJZXJyID0gY29udmVydF9meHNyX2Zyb21fdXNlcigmZnB4LCBzYy5mcHN0YXRlKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciA9IHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsICh1bnNpZ25lZCBsb25nICopICZmcHgpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtICIKLQkJCSAgICAgICAicmVzdG9yZV9mcHhfcmVnaXN0ZXJzIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCSAgICAgICAtZXJyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCWVsc2UgewotCQlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcDsKLQotCQllcnIgPSBjb3B5X2Zyb21fdXNlcigmZnAsIHNjLmZwc3RhdGUsCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciA9IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZwKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY29weV9zY19mcm9tX3VzZXIgLSAiCi0JCQkgICAgICAgInJlc3RvcmVfZnBfcmVnaXN0ZXJzIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKLQkJCSAgICAgICAtZXJyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9zY190b191c2VyKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdG8sCi0JCQkgICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICp0b19mcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICB1bnNpZ25lZCBsb25nIHNwKQotewotCXN0cnVjdCBzaWdjb250ZXh0IHNjOwotCXN0cnVjdCBmYXVsdGluZm8gKiBmaSA9ICZjdXJyZW50LT50aHJlYWQuYXJjaC5mYXVsdGluZm87Ci0JaW50IGVyciwgcGlkOwotCi0Jc2MuZ3MgPSBSRUdTX0dTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmZzID0gUkVHU19GUyhyZWdzLT5yZWdzLmdwKTsKLQlzYy5lcyA9IFJFR1NfRVMocmVncy0+cmVncy5ncCk7Ci0Jc2MuZHMgPSBSRUdTX0RTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmRpID0gUkVHU19FREkocmVncy0+cmVncy5ncCk7Ci0Jc2Muc2kgPSBSRUdTX0VTSShyZWdzLT5yZWdzLmdwKTsKLQlzYy5icCA9IFJFR1NfRUJQKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLnNwID0gc3A7Ci0Jc2MuYnggPSBSRUdTX0VCWChyZWdzLT5yZWdzLmdwKTsKLQlzYy5keCA9IFJFR1NfRURYKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmN4ID0gUkVHU19FQ1gocmVncy0+cmVncy5ncCk7Ci0Jc2MuYXggPSBSRUdTX0VBWChyZWdzLT5yZWdzLmdwKTsKLQlzYy5pcCA9IFJFR1NfSVAocmVncy0+cmVncy5ncCk7Ci0Jc2MuY3MgPSBSRUdTX0NTKHJlZ3MtPnJlZ3MuZ3ApOwotCXNjLmZsYWdzID0gUkVHU19FRkxBR1MocmVncy0+cmVncy5ncCk7Ci0Jc2Muc3BfYXRfc2lnbmFsID0gcmVncy0+cmVncy5ncFtVRVNQXTsKLQlzYy5zcyA9IHJlZ3MtPnJlZ3MuZ3BbU1NdOwotCXNjLmNyMiA9IGZpLT5jcjI7Ci0Jc2MuZXJyID0gZmktPmVycm9yX2NvZGU7Ci0Jc2MudHJhcG5vID0gZmktPnRyYXBfbm87Ci0KLQl0b19mcCA9ICh0b19mcCA/IHRvX2ZwIDogKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKikgKHRvICsgMSkpOwotCXNjLmZwc3RhdGUgPSB0b19mcDsKLQotCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOwotCWlmIChoYXZlX2ZweF9yZWdzKSB7Ci0JCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZweDsKLQotCQllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnB4KTsKLQkJaWYgKGVyciA8IDApewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX3RvX3VzZXIgLSBzYXZlX2ZweF9yZWdpc3RlcnMgIgotCQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWVyciA9IGNvbnZlcnRfZnhzcl90b191c2VyKHRvX2ZwLCAmZnB4KTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAxOwotCi0JCWVyciB8PSBfX3B1dF91c2VyKGZweC5zd2QsICZ0b19mcC0+c3RhdHVzKTsKLQkJZXJyIHw9IF9fcHV0X3VzZXIoWDg2X0ZYU1JfTUFHSUMsICZ0b19mcC0+bWFnaWMpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIDE7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigmdG9fZnAtPl9meHNyX2VudlswXSwgJmZweCwKLQkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSB7Ci0JCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwOwotCi0JCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZwKTsKLQkJaWYgKGNvcHlfdG9fdXNlcih0b19mcCwgJmZwLCBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKSkKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiBjb3B5X3RvX3VzZXIodG8sICZzYywgc2l6ZW9mKHNjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV91Y29udGV4dF90b191c2VyKHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLAotCQkJCSBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpmcCwgc2lnc2V0X3QgKnNldCwKLQkJCQkgdW5zaWduZWQgbG9uZyBzcCkKLXsKLQlpbnQgZXJyID0gMDsKLQotCWVyciB8PSBwdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc3AsICZ1Yy0+dWNfc3RhY2suc3Nfc3ApOwotCWVyciB8PSBwdXRfdXNlcihzYXNfc3NfZmxhZ3Moc3ApLCAmdWMtPnVjX3N0YWNrLnNzX2ZsYWdzKTsKLQllcnIgfD0gcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZ1Yy0+dWNfc3RhY2suc3Nfc2l6ZSk7Ci0JZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmdWMtPnVjX21jb250ZXh0LCBmcCwgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCBzcCk7Ci0JZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdHJ1Y3Qgc2lnZnJhbWUKLXsKLQljaGFyIF9fdXNlciAqcHJldGNvZGU7Ci0JaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKLQlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKLQljaGFyIHJldGNvZGVbOF07Ci19OwotCi1zdHJ1Y3QgcnRfc2lnZnJhbWUKLXsKLQljaGFyIF9fdXNlciAqcHJldGNvZGU7Ci0JaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOwotCXZvaWQgX191c2VyICpwdWM7Ci0Jc3RydWN0IHNpZ2luZm8gaW5mbzsKLQlzdHJ1Y3QgdWNvbnRleHQgdWM7Ci0Jc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7Ci0JY2hhciByZXRjb2RlWzhdOwotfTsKLQotaW50IHNldHVwX3NpZ25hbF9zdGFja19zYyh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKLQkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgIHNpZ3NldF90ICptYXNrKQotewotCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCXZvaWQgX191c2VyICpyZXN0b3JlcjsKLQl1bnNpZ25lZCBsb25nIHNhdmVfc3AgPSBQVF9SRUdTX1NQKHJlZ3MpOwotCWludCBlcnIgPSAwOwotCi0JLyogVGhpcyBpcyB0aGUgc2FtZSBjYWxjdWxhdGlvbiBhcyBpMzg2IC0gKChzcCArIDQpICYgMTUpID09IDAgKi8KLQlzdGFja190b3AgPSAoKHN0YWNrX3RvcCArIDQpICYgLTE2VUwpIC0gNDsKLQlmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopIHN0YWNrX3RvcCAtIDE7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQotCQlyZXR1cm4gMTsKLQotCXJlc3RvcmVyID0gZnJhbWUtPnJldGNvZGU7Ci0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQotCQlyZXN0b3JlciA9IGthLT5zYS5zYV9yZXN0b3JlcjsKLQotCS8qIFVwZGF0ZSBTUCBub3cgYmVjYXVzZSB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyIHJlZnVzZXMgdG8gZXh0ZW5kCi0JICogdGhlIHN0YWNrIGlmIHRoZSBmYXVsdGluZyBhZGRyZXNzIGlzIHRvbyBmYXIgYmVsb3cgdGhlIGN1cnJlbnQKLQkgKiBTUCwgd2hpY2ggZnJhbWUgbm93IGNlcnRhaW5seSBpcy4gIElmIHRoZXJlJ3MgYW4gZXJyb3IsIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIHJlc3RvcmVkIG9uIHRoZSB3YXkgb3V0LgotCSAqIFdoZW4gd3JpdGluZyB0aGUgc2lnY29udGV4dCB0byB0aGUgc3RhY2ssIHdlIGhhdmUgdG8gd3JpdGUgdGhlCi0JICogb3JpZ2luYWwgdmFsdWUsIHNvIHRoYXQncyBwYXNzZWQgdG8gY29weV9zY190b191c2VyLCB3aGljaCBkb2VzCi0JICogdGhlIHJpZ2h0IHRoaW5nIHdpdGggaXQuCi0JICovCi0JUFRfUkVHU19TUChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKLQotCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKLQllcnIgfD0gX19wdXRfdXNlcihzaWcsICZmcmFtZS0+c2lnKTsKLQllcnIgfD0gY29weV9zY190b191c2VyKCZmcmFtZS0+c2MsIE5VTEwsIHJlZ3MsIHNhdmVfc3ApOwotCWVyciB8PSBfX3B1dF91c2VyKG1hc2stPnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKTsKLQlpZiAoX05TSUdfV09SRFMgPiAxKQotCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT5leHRyYW1hc2ssICZtYXNrLT5zaWdbMV0sCi0JCQkJICAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKTsKLQotCS8qCi0JICogVGhpcyBpcyBwb3BsICVlYXggOyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAotCSAqCi0JICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAotCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCi0JICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgotCSAqLwotCWVyciB8PSBfX3B1dF91c2VyKDB4Yjg1OCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzIpKTsKLQllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNikpOwotCi0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlQVF9SRUdTX1NQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwotCVBUX1JFR1NfSVAocmVncykgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7Ci0JUFRfUkVHU19FQVgocmVncykgPSAodW5zaWduZWQgbG9uZykgc2lnOwotCVBUX1JFR1NfRURYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIDA7Ci0JUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgMDsKLQotCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlQVF9SRUdTX1NQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgc2V0dXBfc2lnbmFsX3N0YWNrX3NpKHVuc2lnbmVkIGxvbmcgc3RhY2tfdG9wLCBpbnQgc2lnLAotCQkJICBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCSAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqbWFzaykKLXsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQl2b2lkIF9fdXNlciAqcmVzdG9yZXI7Ci0JdW5zaWduZWQgbG9uZyBzYXZlX3NwID0gUFRfUkVHU19TUChyZWdzKTsKLQlpbnQgZXJyID0gMDsKLQotCXN0YWNrX3RvcCAmPSAtOFVMOwotCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgc3RhY2tfdG9wIC0gMTsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCXJldHVybiAxOwotCi0JcmVzdG9yZXIgPSBmcmFtZS0+cmV0Y29kZTsKLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCi0JCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOwotCi0JLyogU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgd2h5IHRoaXMgaXMgaGVyZSAqLwotCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0KLQllcnIgfD0gX19wdXRfdXNlcihyZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKLQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7Ci0JZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7Ci0JZXJyIHw9IGNvcHlfdWNvbnRleHRfdG9fdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPmZwc3RhdGUsIG1hc2ssCi0JCQkJICAgICBzYXZlX3NwKTsKLQotCS8qCi0JICogVGhpcyBpcyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAotCSAqCi0JICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAotCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCi0JICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgotCSAqLwotCWVyciB8PSBfX3B1dF91c2VyKDB4YjgsIChjaGFyIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzEpKTsKLQllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNSkpOwotCi0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlQVF9SRUdTX0lQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwotCVBUX1JFR1NfRUFYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIHNpZzsKLQlQVF9SRUdTX0VEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87Ci0JUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT51YzsKLQotCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlQVF9SRUdTX1NQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1sb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikoc3AgLSA4KTsKLQlzaWdzZXRfdCBzZXQ7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYyA9ICZmcmFtZS0+c2M7Ci0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKm9sZG1hc2sgPSAmc2MtPm9sZG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKmV4dHJhbWFzayA9IGZyYW1lLT5leHRyYW1hc2s7Ci0JaW50IHNpZ19zaXplID0gKF9OU0lHX1dPUkRTIC0gMSkgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMF0sIG9sZG1hc2ssIHNpemVvZihzZXQuc2lnWzBdKSkgfHwKLQkgICAgY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sIGV4dHJhbWFzaywgc2lnX3NpemUpKQotCQlnb3RvIHNlZ2ZhdWx0OwotCi0Jc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0KLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQotCWlmIChjb3B5X3NjX2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLnJlZ3MsIHNjKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQotCi1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0KLQkJKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgKHNwIC0gNCk7Ci0Jc2lnc2V0X3Qgc2V0OwotCXN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjID0gJmZyYW1lLT51YzsKLQlpbnQgc2lnX3NpemUgPSBfTlNJR19XT1JEUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCAmdWMtPnVjX3NpZ21hc2ssIHNpZ19zaXplKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAmdWMtPnVjX21jb250ZXh0KSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yl9zZWd2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2NmNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKLSNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgotCi12b2lkIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXyAoIi5fX3N5c2NhbGxfc3R1YiIpKSkKLXN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpCi17Ci0Jc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gKHN0cnVjdCBzaWdjb250ZXh0ICopICgmc2lnICsgMSk7Ci0KLQlHRVRfRkFVTFRJTkZPX0ZST01fU0MoKigoc3RydWN0IGZhdWx0aW5mbyAqKSBTVFVCX0RBVEEpLCBzYyk7Ci0KLQl0cmFwX215c2VsZigpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zeXNfY2FsbF90YWJsZS5TIGIvYXJjaC91bS9zeXMtaTM4Ni9zeXNfY2FsbF90YWJsZS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI3NDA3MS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3N5c19jYWxsX3RhYmxlLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotLyogU3RlYWwgaTM4NiBzeXNjYWxsIHRhYmxlIGZvciBvdXIgcHVycG9zZXMsIGJ1dCB3aXRoIHNvbWUgc2xpZ2h0IGNoYW5nZXMuKi8KLQotI2RlZmluZSBzeXNfaW9wbCBzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfaW9wZXJtIHN5c19uaV9zeXNjYWxsCi0KLSNkZWZpbmUgc3lzX3ZtODZvbGQgc3lzX25pX3N5c2NhbGwKLSNkZWZpbmUgc3lzX3ZtODYgc3lzX25pX3N5c2NhbGwKLQotI2RlZmluZSBvbGRfbW1hcCBzeXNfb2xkX21tYXAKLQotI2RlZmluZSBwdHJlZ3NfZm9yayBzeXNfZm9yawotI2RlZmluZSBwdHJlZ3NfZXhlY3ZlIHN5c19leGVjdmUKLSNkZWZpbmUgcHRyZWdzX2lvcGwgc3lzX2lvcGwKLSNkZWZpbmUgcHRyZWdzX3ZtODZvbGQgc3lzX3ZtODZvbGQKLSNkZWZpbmUgcHRyZWdzX3NpZ3JldHVybiBzeXNfc2lncmV0dXJuCi0jZGVmaW5lIHB0cmVnc19jbG9uZSBzeXNfY2xvbmUKLSNkZWZpbmUgcHRyZWdzX3ZtODYgc3lzX3ZtODYKLSNkZWZpbmUgcHRyZWdzX3J0X3NpZ3JldHVybiBzeXNfcnRfc2lncmV0dXJuCi0jZGVmaW5lIHB0cmVnc19zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKLSNkZWZpbmUgcHRyZWdzX3Zmb3JrIHN5c192Zm9yawotCi0uc2VjdGlvbiAucm9kYXRhLCJhIgotCi0jaW5jbHVkZSAiLi4vLi4veDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMiCi0KLUVOVFJZKHN5c2NhbGxfdGFibGVfc2l6ZSkKLS5sb25nIC4tc3lzX2NhbGxfdGFibGUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvdXNlci1vZmZzZXRzLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3VzZXItb2Zmc2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg4M2JmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWkzODYvdXNlci1vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCi0KLSNkZWZpbmUgREVGSU5FX0xPTkdTKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbC9zaXplb2YodW5zaWduZWQgbG9uZykpKQotCi0jZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCi0JREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7Ci0KLXZvaWQgZm9vKHZvaWQpCi17Ci0JT0ZGU0VUKEhPU1RfU0NfVFJBUE5PLCBzaWdjb250ZXh0LCB0cmFwbm8pOwotCU9GRlNFVChIT1NUX1NDX0VSUiwgc2lnY29udGV4dCwgZXJyKTsKLQlPRkZTRVQoSE9TVF9TQ19DUjIsIHNpZ2NvbnRleHQsIGNyMik7Ci0KLQlERUZJTkVfTE9OR1MoSE9TVF9GUF9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdCkpOwotCURFRklORV9MT05HUyhIT1NUX0ZQWF9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfZnB4cmVnc19zdHJ1Y3QpKTsKLQotCURFRklORShIT1NUX0lQLCBFSVApOwotCURFRklORShIT1NUX1NQLCBVRVNQKTsKLQlERUZJTkUoSE9TVF9FRkxBR1MsIEVGTCk7Ci0JREVGSU5FKEhPU1RfRUFYLCBFQVgpOwotCURFRklORShIT1NUX0VCWCwgRUJYKTsKLQlERUZJTkUoSE9TVF9FQ1gsIEVDWCk7Ci0JREVGSU5FKEhPU1RfRURYLCBFRFgpOwotCURFRklORShIT1NUX0VTSSwgRVNJKTsKLQlERUZJTkUoSE9TVF9FREksIEVESSk7Ci0JREVGSU5FKEhPU1RfRUJQLCBFQlApOwotCURFRklORShIT1NUX0NTLCBDUyk7Ci0JREVGSU5FKEhPU1RfU1MsIFNTKTsKLQlERUZJTkUoSE9TVF9EUywgRFMpOwotCURFRklORShIT1NUX0ZTLCBGUyk7Ci0JREVGSU5FKEhPU1RfRVMsIEVTKTsKLQlERUZJTkUoSE9TVF9HUywgR1MpOwotCURFRklORShVTV9GUkFNRV9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpKTsKLQotCS8qIFhYWCBEdXBsaWNhdGVkIGJldHdlZW4gaTM4NiBhbmQgeDg2XzY0ICovCi0JREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKLQlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7Ci0JREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOwotCi0JREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKLQlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7Ci0JREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0ZDFkMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0jCi0KLW9iai15ID0gYnVnLm8gYnVncy5vIGRlbGF5Lm8gZmF1bHQubyBsZHQubyBwdHJhY2UubyBwdHJhY2VfdXNlci5vIG1lbS5vIFwKLQlzZXRqbXAubyBzaWduYWwubyBzdHViLm8gc3R1Yl9zZWd2Lm8gc3lzY2FsbHMubyBzeXNjYWxsX3RhYmxlLm8gXAotCXN5c3JxLm8ga3N5bXMubyB0bHMubwotCi1vYmoteSArPSB2ZHNvLwotCi1zdWJhcmNoLW9iai15ID0gbGliL2NzdW0tcGFydGlhbF82NC5vIGxpYi9tZW1jcHlfNjQubyBsaWIvdGh1bmtfNjQubyBcCi0JCWxpYi9yd3NlbS5vCi1zdWJhcmNoLW9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrZXJuZWwvbW9kdWxlLm8KLQotbGR0LXkgPSAuLi9zeXMtaTM4Ni9sZHQubwotCi1VU0VSX09CSlMgOj0gcHRyYWNlX3VzZXIubwotCi1VU0VSX09CSlMgKz0gdXNlci1vZmZzZXRzLnMKLWV4dHJhLXkgKz0gdXNlci1vZmZzZXRzLnMKLQotVU5QUk9GSUxFX09CSlMgOj0gc3R1Yl9zZWd2Lm8KLUNGTEFHU19zdHViX3NlZ3YubyA6PSAkKENGTEFHU19OT19IQVJERU5JTkcpCi0KLWluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9hcmNocGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwODM2Ni4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2FyY2hwYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fQVJDSFBBUkFNX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fQVJDSFBBUkFNX1g4Nl82NF9ICi0KLQotLyogTm8gdXNlci1hY2Nlc3NpYmxlIGZpeG1hcCBhZGRyZXNzZXMsIGkuZS4gdnN5c2NhbGwgKi8KLSNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUCTAKLSNkZWZpbmUgRklYQUREUl9VU0VSX0VORAkwCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMmJmYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL2VsZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotI2lmbmRlZiBfX1VNX0VMRl9YODZfNjRfSAotI2RlZmluZSBfX1VNX0VMRl9YODZfNjRfSAotCi0jaW5jbHVkZSA8YXNtL3VzZXIuaD4KLSNpbmNsdWRlICJza2FzLmgiCi0KLS8qIHg4Ni02NCByZWxvY2F0aW9uIHR5cGVzLCB0YWtlbiBmcm9tIGFzbS14ODZfNjQvZWxmLmggKi8KLSNkZWZpbmUgUl9YODZfNjRfTk9ORQkJMAkvKiBObyByZWxvYyAqLwotI2RlZmluZSBSX1g4Nl82NF82NAkJMQkvKiBEaXJlY3QgNjQgYml0ICAqLwotI2RlZmluZSBSX1g4Nl82NF9QQzMyCQkyCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaWduZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfR09UMzIJCTMJLyogMzIgYml0IEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9QTFQzMgkJNAkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KLSNkZWZpbmUgUl9YODZfNjRfQ09QWQkJNQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0jZGVmaW5lIFJfWDg2XzY0X0dMT0JfREFUCTYJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotI2RlZmluZSBSX1g4Nl82NF9KVU1QX1NMT1QJNwkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0jZGVmaW5lIFJfWDg2XzY0X1JFTEFUSVZFCTgJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTAk5CS8qIDMyIGJpdCBzaWduZWQgcGMgcmVsYXRpdmUKLQkJCQkJICAgb2Zmc2V0IHRvIEdPVCAqLwotI2RlZmluZSBSX1g4Nl82NF8zMgkJMTAJLyogRGlyZWN0IDMyIGJpdCB6ZXJvIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzMyUwkJMTEJLyogRGlyZWN0IDMyIGJpdCBzaWduIGV4dGVuZGVkICovCi0jZGVmaW5lIFJfWDg2XzY0XzE2CQkxMgkvKiBEaXJlY3QgMTYgYml0IHplcm8gZXh0ZW5kZWQgKi8KLSNkZWZpbmUgUl9YODZfNjRfUEMxNgkJMTMJLyogMTYgYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KLSNkZWZpbmUgUl9YODZfNjRfOAkJMTQJLyogRGlyZWN0IDggYml0IHNpZ24gZXh0ZW5kZWQgICovCi0jZGVmaW5lIFJfWDg2XzY0X1BDOAkJMTUJLyogOCBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLwotCi0jZGVmaW5lIFJfWDg2XzY0X05VTQkJMTYKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7Ci0KLSNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKLXR5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107Ci0KLXR5cGVkZWYgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7Ci0KLS8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlLgotICovCi0jZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpIFwKLQkoKHgpLT5lX21hY2hpbmUgPT0gRU1fWDg2XzY0KQotCi0jZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzY0Ci0jZGVmaW5lIEVMRl9EQVRBICAgICAgICBFTEZEQVRBMkxTQgotI2RlZmluZSBFTEZfQVJDSCAgICAgICAgRU1fWDg2XzY0Ci0KLSNkZWZpbmUgRUxGX1BMQVRfSU5JVChyZWdzLCBsb2FkX2FkZHIpICAgIGRvIHsgXAotCVBUX1JFR1NfUkJYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkNYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkRYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUlNJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkRJKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkJQKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsgXAotCVBUX1JFR1NfUjgocmVncykgPSAwOyBcCi0JUFRfUkVHU19SOShyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMChyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMShyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMihyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxMyhyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxNChyZWdzKSA9IDA7IFwKLQlQVF9SRUdTX1IxNShyZWdzKSA9IDA7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKHByX3JlZywgX3JlZ3MpCQlcCi0JKHByX3JlZylbMF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzBdOwkJCVwKLQkocHJfcmVnKVsxXSA9IChfcmVncyktPnJlZ3MuZ3BbMV07CQkJXAotCShwcl9yZWcpWzJdID0gKF9yZWdzKS0+cmVncy5ncFsyXTsJCQlcCi0JKHByX3JlZylbM10gPSAoX3JlZ3MpLT5yZWdzLmdwWzNdOwkJCVwKLQkocHJfcmVnKVs0XSA9IChfcmVncyktPnJlZ3MuZ3BbNF07CQkJXAotCShwcl9yZWcpWzVdID0gKF9yZWdzKS0+cmVncy5ncFs1XTsJCQlcCi0JKHByX3JlZylbNl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzZdOwkJCVwKLQkocHJfcmVnKVs3XSA9IChfcmVncyktPnJlZ3MuZ3BbN107CQkJXAotCShwcl9yZWcpWzhdID0gKF9yZWdzKS0+cmVncy5ncFs4XTsJCQlcCi0JKHByX3JlZylbOV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzldOwkJCVwKLQkocHJfcmVnKVsxMF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzEwXTsJCQlcCi0JKHByX3JlZylbMTFdID0gKF9yZWdzKS0+cmVncy5ncFsxMV07CQkJXAotCShwcl9yZWcpWzEyXSA9IChfcmVncyktPnJlZ3MuZ3BbMTJdOwkJCVwKLQkocHJfcmVnKVsxM10gPSAoX3JlZ3MpLT5yZWdzLmdwWzEzXTsJCQlcCi0JKHByX3JlZylbMTRdID0gKF9yZWdzKS0+cmVncy5ncFsxNF07CQkJXAotCShwcl9yZWcpWzE1XSA9IChfcmVncyktPnJlZ3MuZ3BbMTVdOwkJCVwKLQkocHJfcmVnKVsxNl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE2XTsJCQlcCi0JKHByX3JlZylbMTddID0gKF9yZWdzKS0+cmVncy5ncFsxN107CQkJXAotCShwcl9yZWcpWzE4XSA9IChfcmVncyktPnJlZ3MuZ3BbMThdOwkJCVwKLQkocHJfcmVnKVsxOV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE5XTsJCQlcCi0JKHByX3JlZylbMjBdID0gKF9yZWdzKS0+cmVncy5ncFsyMF07CQkJXAotCShwcl9yZWcpWzIxXSA9IGN1cnJlbnQtPnRocmVhZC5hcmNoLmZzOwkJCVwKLQkocHJfcmVnKVsyMl0gPSAwOwkJCQkJXAotCShwcl9yZWcpWzIzXSA9IDA7CQkJCQlcCi0JKHByX3JlZylbMjRdID0gMDsJCQkJCVwKLQkocHJfcmVnKVsyNV0gPSAwOwkJCQkJXAotCShwcl9yZWcpWzI2XSA9IDA7Ci0KLSNkZWZpbmUgdGFza19wdF9yZWdzKHQpICgmKHQpLT50aHJlYWQucmVncykKLQotc3RydWN0IHRhc2tfc3RydWN0OwotCi1leHRlcm4gaW50IGVsZl9jb3JlX2NvcHlfZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZwcmVnc2V0X3QgKmZwdSk7Ci0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9GUFJFR1ModCwgZnB1KSBlbGZfY29yZV9jb3B5X2ZwcmVncyh0LCBmcHUpCi0KLSNpZmRlZiBUSUZfSUEzMiAvKiBYWFggKi8KLSNlcnJvciBYWFgsIGluZGVlZAotICAgICAgICBjbGVhcl90aHJlYWRfZmxhZyhUSUZfSUEzMik7Ci0jZW5kaWYKLQotI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRSA0MDk2Ci0KLSNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICgyICogVEFTS19TSVpFIC8gMykKLQotZXh0ZXJuIGxvbmcgZWxmX2F1eF9od2NhcDsKLSNkZWZpbmUgRUxGX0hXQ0FQIChlbGZfYXV4X2h3Y2FwKQotCi0jZGVmaW5lIEVMRl9QTEFURk9STSAieDg2XzY0IgotCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgZG8gOyB3aGlsZSgwKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX0dBVEVfQVJFQSAxCi0jZGVmaW5lIEFSQ0hfSEFTX1NFVFVQX0FERElUSU9OQUxfUEFHRVMgMQotc3RydWN0IGxpbnV4X2JpbnBybTsKLWV4dGVybiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCi0JaW50IHVzZXNfaW50ZXJwKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW1fdmRzb19hZGRyOwotI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIgMzMKLSNkZWZpbmUgQVJDSF9ETElORk8JTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB1bV92ZHNvX2FkZHIpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9tb2R1bGUuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9hc20vbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjc5YzIuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9tb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX01PRFVMRV9YODZfNjRfSAotI2RlZmluZSBfX1VNX01PRFVMRV9YODZfNjRfSAotCi0vKiBVTUwgaXMgc2ltcGxlICovCi1zdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMKLXsKLX07Ci0KLSNkZWZpbmUgRWxmX1NoZHIgRWxmNjRfU2hkcgotI2RlZmluZSBFbGZfU3ltIEVsZjY0X1N5bQotI2RlZmluZSBFbGZfRWhkciBFbGY2NF9FaGRyCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1YTI2YS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvYXNtL3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fVU1fUFJPQ0VTU09SX1g4Nl82NF9ICi0jZGVmaW5lIF9fVU1fUFJPQ0VTU09SX1g4Nl82NF9ICi0KLS8qIGluY2x1ZGUgZmF1bHRpbmZvIHN0cnVjdHVyZSAqLwotI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKLQotc3RydWN0IGFyY2hfdGhyZWFkIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07Ci0gICAgICAgIGludCBkZWJ1Z3JlZ3Nfc2VxOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZzOwotICAgICAgICBzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLX07Ci0KLS8qIFJFUCBOT1AgKFBBVVNFKSBpcyBhIGdvb2QgdGhpbmcgdG8gaW5zZXJ0IGludG8gYnVzeS13YWl0IGxvb3BzLiAqLwotc3RhdGljIGlubGluZSB2b2lkIHJlcF9ub3Aodm9pZCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmVwO25vcCI6IDogOiJtZW1vcnkiKTsKLX0KLQotI2RlZmluZSBjcHVfcmVsYXgoKSAgIHJlcF9ub3AoKQotCi0jZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyAuZGVidWdyZWdzICAJCT0geyBbIDAgLi4uIDcgXSA9IDAgfSwgXAotCQkJICAgLmRlYnVncmVnc19zZXEJPSAwLCBcCi0JCQkgICAuZnMJCQk9IDAsIFwKLQkJCSAgIC5mYXVsdGluZm8JCT0geyAwLCAwLCAwIH0gfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9mbHVzaF90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICp0aHJlYWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2NvcHlfdGhyZWFkKHN0cnVjdCBhcmNoX3RocmVhZCAqZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhcmNoX3RocmVhZCAqdG8pCi17Ci0JdG8tPmZzID0gZnJvbS0+ZnM7Ci19Ci0KLSNpbmNsdWRlIDxhc20vdXNlci5oPgotCi0jZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAotCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZxICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQotCi0jZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKLSAgICAgICAgKGFkZHJlc3MgKyAxMjggPj0gVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSkKLQotI2RlZmluZSBLU1RLX0VJUCh0c2spIEtTVEtfUkVHKHRzaywgUklQKQotI2RlZmluZSBLU1RLX0VTUCh0c2spIEtTVEtfUkVHKHRzaywgUlNQKQotCi0jaW5jbHVkZSAiYXNtL3Byb2Nlc3Nvci1nZW5lcmljLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9hc20vcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDhjNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2FzbS9wdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1VNX1BUUkFDRV9YODZfNjRfSAotI2RlZmluZSBfX1VNX1BUUkFDRV9YODZfNjRfSAotCi0jaW5jbHVkZSAibGludXgvY29tcGlsZXIuaCIKLSNpbmNsdWRlICJhc20vZXJybm8uaCIKLQotI2RlZmluZSBfX0ZSQU1FX09GRlNFVFMgLyogTmVlZGVkIHRvIGdldCB0aGUgUiogbWFjcm9zICovCi0jaW5jbHVkZSAiYXNtL3B0cmFjZS1nZW5lcmljLmgiCi0KLSNkZWZpbmUgSE9TVF9BVURJVF9BUkNIIEFVRElUX0FSQ0hfWDg2XzY0Ci0KLSNkZWZpbmUgUFRfUkVHU19SQlgocikgVVBUX1JCWCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1JDWChyKSBVUFRfUkNYKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUkRYKHIpIFVQVF9SRFgoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SU0kocikgVVBUX1JTSSgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1JESShyKSBVUFRfUkRJKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUkJQKHIpIFVQVF9SQlAoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SQVgocikgVVBUX1JBWCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1I4KHIpIFVQVF9SOCgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1I5KHIpIFVQVF9SOSgmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1IxMChyKSBVUFRfUjEwKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUjExKHIpIFVQVF9SMTEoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SMTIocikgVVBUX1IxMigmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX1IxMyhyKSBVUFRfUjEzKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUjE0KHIpIFVQVF9SMTQoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SMTUocikgVVBUX1IxNSgmKHIpLT5yZWdzKQotCi0jZGVmaW5lIFBUX1JFR1NfRlMocikgVVBUX0ZTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfR1MocikgVVBUX0dTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfRFMocikgVVBUX0RTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfRVMocikgVVBUX0VTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfU1MocikgVVBUX1NTKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfQ1MocikgVVBUX0NTKCYociktPnJlZ3MpCi0KLSNkZWZpbmUgUFRfUkVHU19PUklHX1JBWChyKSBVUFRfT1JJR19SQVgoJihyKS0+cmVncykKLSNkZWZpbmUgUFRfUkVHU19SSVAocikgVVBUX0lQKCYociktPnJlZ3MpCi0jZGVmaW5lIFBUX1JFR1NfUlNQKHIpIFVQVF9TUCgmKHIpLT5yZWdzKQotCi0jZGVmaW5lIFBUX1JFR1NfRUZMQUdTKHIpIFVQVF9FRkxBR1MoJihyKS0+cmVncykKLQotLyogWFhYICovCi0jZGVmaW5lIHVzZXJfbW9kZShyKSBVUFRfSVNfVVNFUigmKHIpLT5yZWdzKQotI2RlZmluZSBQVF9SRUdTX09SSUdfU1lTQ0FMTChyKSBQVF9SRUdTX1JBWChyKQotI2RlZmluZSBQVF9SRUdTX1NZU0NBTExfUkVUKHIpIFBUX1JFR1NfUkFYKHIpCi0KLSNkZWZpbmUgUFRfRklYX0VYRUNfU1RBQ0soc3ApIGRvIDsgd2hpbGUoMCkKLQotI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIFBUX1JFR1NfSVAocmVncykKLQotc3RydWN0IHVzZXJfZGVzYzsKLQotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdXNlcl9kZXNjKQotewotICAgICAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdXNlcl9kZXNjKQotewotICAgICAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotZXh0ZXJuIGxvbmcgYXJjaF9wcmN0bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjb2RlLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFkZHIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvZGVsYXkuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZlMWE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9kZWxheS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNoYXJkIFdlaW5iZXJnZXIgPHJpY2hyZEBub2QuYXQ+Ci0gKiBNb3N0bHkgY29waWVkIGZyb20gYXJjaC94ODYvbGliL2RlbGF5LmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgotCi12b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKLXsKLQlhc20gdm9sYXRpbGUoCi0JCSJ0ZXN0ICUwLCUwXG4iCi0JCSJqeiAzZlxuIgotCQkiam1wIDFmXG4iCi0KLQkJIi5hbGlnbiAxNlxuIgotCQkiMTogam1wIDJmXG4iCi0KLQkJIi5hbGlnbiAxNlxuIgotCQkiMjogZGVjICUwXG4iCi0JCSIgam56IDJiXG4iCi0JCSIzOiBkZWMgJTBcbiIKLQotCQk6IC8qIHdlIGRvbid0IG5lZWQgb3V0cHV0ICovCi0JCTogImEiIChsb29wcykKLQkpOwotfQotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQotaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCi17Ci0JaW50IGQwOwotCi0JeGxvb3BzICo9IDQ7Ci0JYXNtKCJtdWxsICUlZWR4IgotCQk6ICI9ZCIgKHhsb29wcyksICI9JmEiIChkMCkKLQkJOiAiMSIgKHhsb29wcyksICIwIgotCQkobG9vcHNfcGVyX2ppZmZ5ICogKEhaLzQpKSk7Ci0KLQlfX2RlbGF5KCsreGxvb3BzKTsKLX0KLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotCi12b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCi17Ci0JX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgLyogMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLwotfQotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci0KLXZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyBuc2VjcykKLXsKLQlfX2NvbnN0X3VkZWxheShuc2VjcyAqIDB4MDAwMDUpOyAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCi19Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9mYXVsdC5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2ZhdWx0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODUxMTcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L2ZhdWx0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCi0KLS8qIFRoZXNlIHR3byBhcmUgZnJvbSBhc20tdW0vdWFjY2Vzcy5oIGFuZCBsaW51eC9tb2R1bGUuaCwgY2hlY2sgdGhlbS4gKi8KLXN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkKLXsKLQl1bnNpZ25lZCBsb25nIGluc247Ci0JdW5zaWduZWQgbG9uZyBmaXh1cDsKLX07Ci0KLWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnNlYXJjaF9leGNlcHRpb25fdGFibGVzKHVuc2lnbmVkIGxvbmcgYWRkKTsKLQotaW50IGFyY2hfZml4dXAodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MpCi17Ci0JY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7Ci0KLQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKGFkZHJlc3MpOwotCWlmIChmaXh1cCAhPSAwKSB7Ci0JCVVQVF9JUChyZWdzKSA9IGZpeHVwLT5maXh1cDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2tzeW1zLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQva3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiMmZjZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQva3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0KLS8qWFhYOiB3ZSBuZWVkIHRoZW0gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGV4cG9ydGVkIGJ5IHg4Nl82NCAqLwotI2lmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpIHx8IF9fR05VQ19fID4gNAotRVhQT1JUX1NZTUJPTChtZW1jcHkpOwotI2Vsc2UKLUVYUE9SVF9TWU1CT0woX19tZW1jcHkpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDU1MDYuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3B0cmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0vKgotICogZGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvLgotICogMSA9IGFjY2VzcyAwID0gbm8gYWNjZXNzCi0gKi8KLSNkZWZpbmUgRkxBR19NQVNLIDB4NDRkZDVVTAotCi1pbnQgcHV0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotI2lmZGVmIFRJRl9JQTMyCi0JLyoKLQkgKiBTb21lIGNvZGUgaW4gdGhlIDY0Yml0IGVtdWxhdGlvbiBtYXkgbm90IGJlIDY0Yml0IGNsZWFuLgotCSAqIERvbid0IHRha2UgYW55IGNoYW5jZXMuCi0JICovCi0JaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfSUEzMikpCi0JCXZhbHVlICY9IDB4ZmZmZmZmZmY7Ci0jZW5kaWYKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQljYXNlIEdTOgotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQotCQkJcmV0dXJuIC1FSU87Ci0JCXZhbHVlICY9IDB4ZmZmZjsKLQkJYnJlYWs7Ci0KLQljYXNlIEZTX0JBU0U6Ci0JY2FzZSBHU19CQVNFOgotCQlpZiAoISgodmFsdWUgPj4gNDgpID09IDAgfHwgKHZhbHVlID4+IDQ4KSA9PSAweGZmZmYpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOwotCi0JY2FzZSBFRkxBR1M6Ci0JCXZhbHVlICY9IEZMQUdfTUFTSzsKLQkJdG1wID0gUFRfUkVHU19FRkxBR1MoJmNoaWxkLT50aHJlYWQucmVncykgJiB+RkxBR19NQVNLOwotCQl2YWx1ZSB8PSB0bXA7Ci0JCWJyZWFrOwotCX0KLQotCVBUX1JFR1NfU0VUKCZjaGlsZC0+dGhyZWFkLnJlZ3MsIHJlZ25vLCB2YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwb2tlX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCi17Ci0JaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkKLQkJcmV0dXJuIHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7Ci0JZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgotCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQlpZiAoKGFkZHIgPT0gNCkgfHwgKGFkZHIgPT0gNSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJY2hpbGQtPnRocmVhZC5hcmNoLmRlYnVncmVnc1thZGRyXSA9IGRhdGE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTzsKLX0KLQotdW5zaWduZWQgbG9uZyBnZXRyZWcoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IHJlZ25vKQotewotCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gfjBVTDsKLQlzd2l0Y2ggKHJlZ25vKSB7Ci0JY2FzZSBGUzoKLQljYXNlIEdTOgotCWNhc2UgRFM6Ci0JY2FzZSBFUzoKLQljYXNlIFNTOgotCWNhc2UgQ1M6Ci0JCXJldHZhbCA9IDB4ZmZmZjsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJcmV0dmFsICY9IFBUX1JFRygmY2hpbGQtPnRocmVhZC5yZWdzLCByZWdubyk7Ci0jaWZkZWYgVElGX0lBMzIKLQkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfSUEzMikpCi0JCQlyZXR2YWwgJj0gMHhmZmZmZmZmZjsKLSNlbmRpZgotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgcGVla191c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotewotCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIGNvbmRpdGlvbiAqLwotCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCi0JCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7Ci0JZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgotCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOwotCX0KLQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLX0KLQotLyogWFhYIE1vc3RseSBjb3BpZWQgZnJvbSBzeXMtaTM4NiAqLwotaW50IGlzX3N5c2NhbGwodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXVuc2lnbmVkIHNob3J0IGluc3RyOwotCWludCBuOwotCi0JbiA9IGNvcHlfZnJvbV91c2VyKCZpbnN0ciwgKHZvaWQgX191c2VyICopIGFkZHIsIHNpemVvZihpbnN0cikpOwotCWlmIChuKSB7Ci0JCS8qCi0JCSAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZ3JhbnRzIGFjY2VzcyB0byB2c3lzY2FsbCBhbmQgc3R1YiwKLQkJICogd2hpbGUgY29weV9mcm9tX3VzZXIgZG9lc24ndC4gTWF5YmUgYWNjZXNzX3Byb2Nlc3Nfdm0gaXMKLQkJICogc2xvdywgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIGl0IHdpbGwgYmUgY2FsbGVkIG9ubHkKLQkJICogaW4gY2FzZSBvZiBzaW5nbGVzdGVwcGluZywgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgotCQkgKi8KLQkJbiA9IGFjY2Vzc19wcm9jZXNzX3ZtKGN1cnJlbnQsIGFkZHIsICZpbnN0ciwgc2l6ZW9mKGluc3RyKSwgMCk7Ci0JCWlmIChuICE9IHNpemVvZihpbnN0cikpIHsKLQkJCXByaW50aygiaXNfc3lzY2FsbCA6IGZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIGZyb20gIgotCQkJICAgICAgICIweCVseFxuIiwgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQkvKiBzeXNlbnRlciAqLwotCXJldHVybiBpbnN0ciA9PSAweDA1MGY7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0JbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKLQotCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOwotCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgZnByZWdzKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbiA9IGNvcHlfdG9fdXNlcihidWYsIGZwcmVncywgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQotewotCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7Ci0JbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKLQotCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOwotCW4gPSBjb3B5X2Zyb21fdXNlcihmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwotCWlmIChuID4gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCBmcHJlZ3MpOwotfQotCi1sb25nIHN1YmFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKLQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCWludCByZXQgPSAtRUlPOwotCXZvaWQgX191c2VyICpkYXRhcCA9ICh2b2lkIF9fdXNlciAqKSBkYXRhOwotCi0Jc3dpdGNoIChyZXF1ZXN0KSB7Ci0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KLQkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOwotCQlicmVhazsKLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLwotCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7Ci0JCWJyZWFrOwotCWNhc2UgUFRSQUNFX0FSQ0hfUFJDVEw6Ci0JCS8qIFhYWCBDYWxscyBwdHJhY2Ugb24gdGhlIGhvc3QgLSBuZWVkcyBzb21lIFNNUCB0aGlua2luZyAqLwotCQlyZXQgPSBhcmNoX3ByY3RsKGNoaWxkLCBkYXRhLCAodm9pZCBfX3VzZXIgKikgYWRkcik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvcHRyYWNlX3VzZXIuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9wdHJhY2VfdXNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdhNDk2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9wdHJhY2VfdXNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgotCi1pbnQgcHRyYWNlX2dldHJlZ3MobG9uZyBwaWQsIHVuc2lnbmVkIGxvbmcgKnJlZ3Nfb3V0KQotewotCWlmIChwdHJhY2UoUFRSQUNFX0dFVFJFR1MsIHBpZCwgMCwgcmVnc19vdXQpIDwgMCkKLQkJcmV0dXJuIC1lcnJubzsKLQlyZXR1cm4oMCk7Ci19Ci0KLWludCBwdHJhY2Vfc2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVnc19vdXQpCi17Ci0JaWYgKHB0cmFjZShQVFJBQ0VfU0VUUkVHUywgcGlkLCAwLCByZWdzX291dCkgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2JhcnJpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2MTBiZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9iYXJyaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX19TWVNERVBfWDg2XzY0X0JBUlJJRVJfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfQkFSUklFUl9ICi0KLS8qIENvcGllZCBmcm9tIGluY2x1ZGUvYXNtLXg4Nl82NCBmb3IgdXNlIGJ5IHVzZXJzcGFjZS4gKi8KLSNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MTdiMC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBHbWJICi0gKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+Ci0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX0ZBVUxUSU5GT19YODZfNjRfSAotI2RlZmluZSBfX0ZBVUxUSU5GT19YODZfNjRfSAotCi0vKiB0aGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZnVsbCBhcmNoLXNwZWNpZmljIGZhdWx0aW5mbwotICogZnJvbSB0aGUgdHJhcHMuCi0gKiBPbiBpMzg2LCBwdHJhY2VfZmF1bHRpbmZvIHVuZm9ydHVuYXRlbHkgZG9lc24ndCBwcm92aWRlCi0gKiBhbGwgdGhlIGluZm8sIHNpbmNlIHRyYXBfbm8gaXMgbWlzc2luZy4KLSAqIEFsbCBjb21tb24gZWxlbWVudHMgYXJlIGRlZmluZWQgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4KLSAqIGJvdGggc3RydWN0dXJlcywgdGh1cyBtYWtpbmcgaXQgZWFzeSB0byBjb3B5IHRoZQotICogY29udGVudHMgd2l0aG91dCBrbm93bGVkZ2UgYWJvdXQgdGhlIHN0cnVjdHVyZSBlbGVtZW50cy4KLSAqLwotc3RydWN0IGZhdWx0aW5mbyB7Ci0gICAgICAgIGludCBlcnJvcl9jb2RlOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIG1pc2xlYWRpbmdseSBjYWxsZWQgaXNfd3JpdGUgKi8KLSAgICAgICAgdW5zaWduZWQgbG9uZyBjcjI7IC8qIGluIHB0cmFjZV9mYXVsdGluZm8gY2FsbGVkIGFkZHIgKi8KLSAgICAgICAgaW50IHRyYXBfbm87IC8qIG1pc3NpbmcgaW4gcHRyYWNlX2ZhdWx0aW5mbyAqLwotfTsKLQotI2RlZmluZSBGQVVMVF9XUklURShmaSkgKChmaSkuZXJyb3JfY29kZSAmIDIpCi0jZGVmaW5lIEZBVUxUX0FERFJFU1MoZmkpICgoZmkpLmNyMikKLQotI2RlZmluZSBQVFJBQ0VfRlVMTF9GQVVMVElORk8gMQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2hvc3RfbGR0LmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9ob3N0X2xkdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxYmUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2hvc3RfbGR0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX0hPU1RfTERUX1g4Nl82NF9ICi0jZGVmaW5lIF9fQVNNX0hPU1RfTERUX1g4Nl82NF9ICi0KLSNpbmNsdWRlIDxhc20vbGR0Lmg+Ci0KLS8qCi0gKiBtYWNyb3Mgc3RvbGVuIGZyb20gaW5jbHVkZS9hc20teDg2XzY0L2Rlc2MuaAotICovCi0jZGVmaW5lIExEVF9lbnRyeV9hKGluZm8pIFwKLQkoKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4MDAwMGZmZmYpIDw8IDE2KSB8ICgoaW5mbyktPmxpbWl0ICYgMHgwZmZmZikpCi0KLS8qIERvbid0IGFsbG93IHNldHRpbmcgb2YgdGhlIGxtIGJpdC4gSXQgaXMgdXNlbGVzcyBhbnl3YXlzIGJlY2F1c2UKLSAqIDY0Yml0IHN5c3RlbSBjYWxscyByZXF1aXJlIF9fVVNFUl9DUy4gKi8KLSNkZWZpbmUgTERUX2VudHJ5X2IoaW5mbykgXAotCSgoKGluZm8pLT5iYXNlX2FkZHIgJiAweGZmMDAwMDAwKSB8IFwKLQkoKChpbmZvKS0+YmFzZV9hZGRyICYgMHgwMGZmMDAwMCkgPj4gMTYpIHwgXAotCSgoaW5mbyktPmxpbWl0ICYgMHhmMDAwMCkgfCBcCi0JKCgoaW5mbyktPnJlYWRfZXhlY19vbmx5IF4gMSkgPDwgOSkgfCBcCi0JKChpbmZvKS0+Y29udGVudHMgPDwgMTApIHwgXAotCSgoKGluZm8pLT5zZWdfbm90X3ByZXNlbnQgXiAxKSA8PCAxNSkgfCBcCi0JKChpbmZvKS0+c2VnXzMyYml0IDw8IDIyKSB8IFwKLQkoKGluZm8pLT5saW1pdF9pbl9wYWdlcyA8PCAyMykgfCBcCi0JKChpbmZvKS0+dXNlYWJsZSA8PCAyMCkgfCBcCi0JLyogKChpbmZvKS0+bG0gPDwgMjEpIHwgKi8gXAotCTB4NzAwMCkKLQotI2RlZmluZSBMRFRfZW1wdHkoaW5mbykgKFwKLQkoaW5mbyktPmJhc2VfYWRkcgk9PSAwCSYmIFwKLQkoaW5mbyktPmxpbWl0CQk9PSAwCSYmIFwKLQkoaW5mbyktPmNvbnRlbnRzCT09IDAJJiYgXAotCShpbmZvKS0+cmVhZF9leGVjX29ubHkJPT0gMQkmJiBcCi0JKGluZm8pLT5zZWdfMzJiaXQJPT0gMAkmJiBcCi0JKGluZm8pLT5saW1pdF9pbl9wYWdlcwk9PSAwCSYmIFwKLQkoaW5mbyktPnNlZ19ub3RfcHJlc2VudAk9PSAxCSYmIFwKLQkoaW5mbyktPnVzZWFibGUJCT09IDAJJiYgXAotCShpbmZvKS0+bG0gICAgICAgICAgICAgID09IDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2tlcm5lbC1vZmZzZXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDcyMzcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9tbWFuLmg+Ci0KLSNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCi0JYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCi0KLSNkZWZpbmUgREVGSU5FX1NUUjEoeCkgI3gKLSNkZWZpbmUgREVGSU5FX1NUUihzeW0sIHZhbCkgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgIiBERUZJTkVfU1RSMSh2YWwpICIgIiAjdmFsOiA6ICkKLQotI2RlZmluZSBCTEFOSygpIGFzbSB2b2xhdGlsZSgiXG4tPiIgOiA6ICkKLQotI2RlZmluZSBPRkZTRVQoc3ltLCBzdHIsIG1lbSkgXAotCURFRklORShzeW0sIG9mZnNldG9mKHN0cnVjdCBzdHIsIG1lbSkpOwotCi12b2lkIGZvbyh2b2lkKQotewotI2luY2x1ZGUgPGNvbW1vbi1vZmZzZXRzLmg+Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU4ZjhlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfUFRSQUNFX0gKLQotI2luY2x1ZGUgInVzZXJfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgotCi0jZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQotI2RlZmluZSBNQVhfUkVHX05SICgoTUFYX1JFR19PRkZTRVQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCi0jaW5jbHVkZSAic2thc19wdHJlZ3MuaCIKLQotI2RlZmluZSBSRUdTX0lQKHIpICgocilbSE9TVF9JUF0pCi0jZGVmaW5lIFJFR1NfU1AocikgKChyKVtIT1NUX1NQXSkKLQotI2RlZmluZSBSRUdTX1JCWChyKSAoKHIpW0hPU1RfUkJYXSkKLSNkZWZpbmUgUkVHU19SQ1gocikgKChyKVtIT1NUX1JDWF0pCi0jZGVmaW5lIFJFR1NfUkRYKHIpICgocilbSE9TVF9SRFhdKQotI2RlZmluZSBSRUdTX1JTSShyKSAoKHIpW0hPU1RfUlNJXSkKLSNkZWZpbmUgUkVHU19SREkocikgKChyKVtIT1NUX1JESV0pCi0jZGVmaW5lIFJFR1NfUkJQKHIpICgocilbSE9TVF9SQlBdKQotI2RlZmluZSBSRUdTX1JBWChyKSAoKHIpW0hPU1RfUkFYXSkKLSNkZWZpbmUgUkVHU19SOChyKSAoKHIpW0hPU1RfUjhdKQotI2RlZmluZSBSRUdTX1I5KHIpICgocilbSE9TVF9SOV0pCi0jZGVmaW5lIFJFR1NfUjEwKHIpICgocilbSE9TVF9SMTBdKQotI2RlZmluZSBSRUdTX1IxMShyKSAoKHIpW0hPU1RfUjExXSkKLSNkZWZpbmUgUkVHU19SMTIocikgKChyKVtIT1NUX1IxMl0pCi0jZGVmaW5lIFJFR1NfUjEzKHIpICgocilbSE9TVF9SMTNdKQotI2RlZmluZSBSRUdTX1IxNChyKSAoKHIpW0hPU1RfUjE0XSkKLSNkZWZpbmUgUkVHU19SMTUocikgKChyKVtIT1NUX1IxNV0pCi0jZGVmaW5lIFJFR1NfQ1MocikgKChyKVtIT1NUX0NTXSkKLSNkZWZpbmUgUkVHU19FRkxBR1MocikgKChyKVtIT1NUX0VGTEFHU10pCi0jZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKLQotI2RlZmluZSBIT1NUX0ZTX0JBU0UgMjEKLSNkZWZpbmUgSE9TVF9HU19CQVNFIDIyCi0jZGVmaW5lIEhPU1RfRFMgMjMKLSNkZWZpbmUgSE9TVF9FUyAyNAotI2RlZmluZSBIT1NUX0ZTIDI1Ci0jZGVmaW5lIEhPU1RfR1MgMjYKLQotLyogQWxzbyBkZWZpbmVkIGluIGFzbS9wdHJhY2UteDg2XzY0LmgsIGJ1dCBub3QgaW4gbGliYyBoZWFkZXJzLiAgU28sIHRoZXNlCi0gKiBhcmUgYWxyZWFkeSBkZWZpbmVkIGZvciBrZXJuZWwgY29kZSwgYnV0IG5vdCBmb3IgdXNlcnNwYWNlIGNvZGUuCi0gKi8KLSNpZm5kZWYgRlNfQkFTRQotLyogVGhlc2UgYXJlbid0IGRlZmluZWQgaW4gcHRyYWNlLmgsIGJ1dCBleGlzdCBpbiBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCwKLSAqIHdoaWNoIGlzIHdoYXQgeDg2XzY0IHB0cmFjZSBhY3R1YWxseSB1c2VzLgotICovCi0jZGVmaW5lIEZTX0JBU0UgKEhPU1RfRlNfQkFTRSAqIHNpemVvZihsb25nKSkKLSNkZWZpbmUgR1NfQkFTRSAoSE9TVF9HU19CQVNFICogc2l6ZW9mKGxvbmcpKQotI2RlZmluZSBEUyAoSE9TVF9EUyAqIHNpemVvZihsb25nKSkKLSNkZWZpbmUgRVMgKEhPU1RfRVMgKiBzaXplb2YobG9uZykpCi0jZGVmaW5lIEZTIChIT1NUX0ZTICogc2l6ZW9mKGxvbmcpKQotI2RlZmluZSBHUyAoSE9TVF9HUyAqIHNpemVvZihsb25nKSkKLSNlbmRpZgotCi0jZGVmaW5lIFJFR1NfRlNfQkFTRShyKSAoKHIpW0hPU1RfRlNfQkFTRV0pCi0jZGVmaW5lIFJFR1NfR1NfQkFTRShyKSAoKHIpW0hPU1RfR1NfQkFTRV0pCi0jZGVmaW5lIFJFR1NfRFMocikgKChyKVtIT1NUX0RTXSkKLSNkZWZpbmUgUkVHU19FUyhyKSAoKHIpW0hPU1RfRVNdKQotI2RlZmluZSBSRUdTX0ZTKHIpICgocilbSE9TVF9GU10pCi0jZGVmaW5lIFJFR1NfR1MocikgKChyKVtIT1NUX0dTXSkKLQotI2RlZmluZSBSRUdTX09SSUdfUkFYKHIpICgocilbSE9TVF9PUklHX1JBWF0pCi0KLSNkZWZpbmUgUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBSRUdTX1JBWChyKSA9IChyZXMpCi0KLSNkZWZpbmUgUkVHU19SRVNUQVJUX1NZU0NBTEwocikgSVBfUkVTVEFSVF9TWVNDQUxMKFJFR1NfSVAocikpCi0KLSNkZWZpbmUgUkVHU19TRUdWX0lTX0ZJWEFCTEUocikgU0VHVl9JU19GSVhBQkxFKChyKS0+dHJhcF90eXBlKQotCi0jZGVmaW5lIFJFR1NfRkFVTFRfQUREUihyKSAoKHIpLT5mYXVsdF9hZGRyKQotCi0jZGVmaW5lIFJFR1NfRkFVTFRfV1JJVEUocikgRkFVTFRfV1JJVEUoKHIpLT5mYXVsdF90eXBlKQotCi0jZGVmaW5lIFJFR1NfVFJBUChyKSAoKHIpLT50cmFwX3R5cGUpCi0KLSNkZWZpbmUgUkVHU19FUlIocikgKChyKS0+ZmF1bHRfdHlwZSkKLQotc3RydWN0IHVtbF9wdF9yZWdzIHsKLQl1bnNpZ25lZCBsb25nIGdwW01BWF9SRUdfTlJdOwotCXVuc2lnbmVkIGxvbmcgZnBbSE9TVF9GUF9TSVpFXTsKLQlzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKLQlsb25nIHN5c2NhbGw7Ci0JaW50IGlzX3VzZXI7Ci19OwotCi0jZGVmaW5lIEVNUFRZX1VNTF9QVF9SRUdTIHsgfQotCi0jZGVmaW5lIFVQVF9SQlgocikgUkVHU19SQlgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1JDWChyKSBSRUdTX1JDWCgociktPmdwKQotI2RlZmluZSBVUFRfUkRYKHIpIFJFR1NfUkRYKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SU0kocikgUkVHU19SU0koKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1JESShyKSBSRUdTX1JESSgociktPmdwKQotI2RlZmluZSBVUFRfUkJQKHIpIFJFR1NfUkJQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SQVgocikgUkVHU19SQVgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1I4KHIpIFJFR1NfUjgoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1I5KHIpIFJFR1NfUjkoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1IxMChyKSBSRUdTX1IxMCgociktPmdwKQotI2RlZmluZSBVUFRfUjExKHIpIFJFR1NfUjExKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SMTIocikgUkVHU19SMTIoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX1IxMyhyKSBSRUdTX1IxMygociktPmdwKQotI2RlZmluZSBVUFRfUjE0KHIpIFJFR1NfUjE0KChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9SMTUocikgUkVHU19SMTUoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKLSNkZWZpbmUgVVBUX0ZTX0JBU0UocikgUkVHU19GU19CQVNFKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9GUyhyKSBSRUdTX0ZTKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9HU19CQVNFKHIpIFJFR1NfR1NfQkFTRSgociktPmdwKQotI2RlZmluZSBVUFRfR1MocikgUkVHU19HUygociktPmdwKQotI2RlZmluZSBVUFRfRFMocikgUkVHU19EUygociktPmdwKQotI2RlZmluZSBVUFRfRVMocikgUkVHU19FUygociktPmdwKQotI2RlZmluZSBVUFRfQ1MocikgUkVHU19DUygociktPmdwKQotI2RlZmluZSBVUFRfU1MocikgUkVHU19TUygociktPmdwKQotI2RlZmluZSBVUFRfT1JJR19SQVgocikgUkVHU19PUklHX1JBWCgociktPmdwKQotCi0jZGVmaW5lIFVQVF9JUChyKSBSRUdTX0lQKChyKS0+Z3ApCi0jZGVmaW5lIFVQVF9TUChyKSBSRUdTX1NQKChyKS0+Z3ApCi0KLSNkZWZpbmUgVVBUX0VGTEFHUyhyKSBSRUdTX0VGTEFHUygociktPmdwKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9OUihyKSAoKHIpLT5zeXNjYWxsKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX1JBWChyKQotCi1leHRlcm4gaW50IHVzZXJfY29udGV4dCh1bnNpZ25lZCBsb25nIHNwKTsKLQotI2RlZmluZSBVUFRfSVNfVVNFUihyKSAoKHIpLT5pc191c2VyKQotCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzEocikgVVBUX1JESShyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcyKHIpIFVQVF9SU0kocikKLSNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMyhyKSBVUFRfUkRYKHIpCi0jZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzQocikgVVBUX1IxMChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc1KHIpIFVQVF9SOChyKQotI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc2KHIpIFVQVF9SOShyKQotCi1zdHJ1Y3Qgc3lzY2FsbF9hcmdzIHsKLQl1bnNpZ25lZCBsb25nIGFyZ3NbNl07Ci19OwotCi0jZGVmaW5lIFNZU0NBTExfQVJHUyhyKSAoKHN0cnVjdCBzeXNjYWxsX2FyZ3MpIFwKLQkJCSB7IC5hcmdzID0geyBVUFRfU1lTQ0FMTF9BUkcxKHIpLAkgXAotCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHMihyKSwJIFwKLQkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzMociksCSBcCi0JCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc0KHIpLAkgXAotCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHNShyKSwJIFwKLQkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzYocikgfSB9ICkKLQotI2RlZmluZSBVUFRfUkVHKHJlZ3MsIHJlZykgXAotCSh7ICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CQlcCi0JCXN3aXRjaChyZWcpewkJCQkJCVwKLQkJY2FzZSBSODogdmFsID0gVVBUX1I4KHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgUjk6IHZhbCA9IFVQVF9SOShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMDogdmFsID0gVVBUX1IxMChyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMTogdmFsID0gVVBUX1IxMShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMjogdmFsID0gVVBUX1IxMihyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxMzogdmFsID0gVVBUX1IxMyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxNDogdmFsID0gVVBUX1IxNChyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFIxNTogdmFsID0gVVBUX1IxNShyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIFJJUDogdmFsID0gVVBUX0lQKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgUlNQOiB2YWwgPSBVUFRfU1AocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQVg6IHZhbCA9IFVQVF9SQVgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQlg6IHZhbCA9IFVQVF9SQlgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQ1g6IHZhbCA9IFVQVF9SQ1gocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSRFg6IHZhbCA9IFVQVF9SRFgocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSU0k6IHZhbCA9IFVQVF9SU0kocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSREk6IHZhbCA9IFVQVF9SREkocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBSQlA6IHZhbCA9IFVQVF9SQlAocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBPUklHX1JBWDogdmFsID0gVVBUX09SSUdfUkFYKHJlZ3MpOyBicmVhazsJCVwKLQkJY2FzZSBDUzogdmFsID0gVVBUX0NTKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgU1M6IHZhbCA9IFVQVF9TUyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIEZTX0JBU0U6IHZhbCA9IFVQVF9GU19CQVNFKHJlZ3MpOyBicmVhazsJCVwKLQkJY2FzZSBHU19CQVNFOiB2YWwgPSBVUFRfR1NfQkFTRShyZWdzKTsgYnJlYWs7CQlcCi0JCWNhc2UgRFM6IHZhbCA9IFVQVF9EUyhyZWdzKTsgYnJlYWs7CQkJXAotCQljYXNlIEVTOiB2YWwgPSBVUFRfRVMocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBGUyA6IHZhbCA9IFVQVF9GUyAocmVncyk7IGJyZWFrOwkJCVwKLQkJY2FzZSBHUzogdmFsID0gVVBUX0dTKHJlZ3MpOyBicmVhazsJCQlcCi0JCWNhc2UgRUZMQUdTOiB2YWwgPSBVUFRfRUZMQUdTKHJlZ3MpOyBicmVhazsJCVwKLQkJZGVmYXVsdCA6CQkJCQkJXAotCQkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfUkVHIDogJWRcbiIsIHJlZyk7CVwKLQkJCXZhbCA9IC0xOwkJCQkJXAotCQl9CQkJCQkJCVwKLQkJdmFsOwkJCQkJCQlcCi0JfSkKLQotCi0jZGVmaW5lIFVQVF9TRVQocmVncywgcmVnLCB2YWwpIFwKLQkoeyAgICAgIHVuc2lnbmVkIGxvbmcgX191cHRfdmFsID0gdmFsOwlcCi0JCXN3aXRjaChyZWcpewkJCQkJCVwKLQkJY2FzZSBSODogVVBUX1I4KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSOTogVVBUX1I5KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSMTA6IFVQVF9SMTAocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFIxMTogVVBUX1IxMShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUjEyOiBVUFRfUjEyKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSMTM6IFVQVF9SMTMocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFIxNDogVVBUX1IxNChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUjE1OiBVUFRfUjE1KHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSSVA6IFVQVF9JUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUlNQOiBVUFRfU1AocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJBWDogVVBUX1JBWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUkJYOiBVUFRfUkJYKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSQ1g6IFVQVF9SQ1gocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJEWDogVVBUX1JEWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgUlNJOiBVUFRfUlNJKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBSREk6IFVQVF9SREkocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwkJXAotCQljYXNlIFJCUDogVVBUX1JCUChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CQlcCi0JCWNhc2UgT1JJR19SQVg6IFVQVF9PUklHX1JBWChyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBDUzogVVBUX0NTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBTUzogVVBUX1NTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBGU19CQVNFOiBVUFRfRlNfQkFTRShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBHU19CQVNFOiBVUFRfR1NfQkFTRShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7CVwKLQkJY2FzZSBEUzogVVBUX0RTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBFUzogVVBUX0VTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBGUzogVVBUX0ZTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBHUzogVVBUX0dTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsJCVwKLQkJY2FzZSBFRkxBR1M6IFVQVF9FRkxBR1MocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOwlcCi0JCWRlZmF1bHQgOgkJCQkJCVwKLQkJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gVVBUX1NFVCA6ICVkXG4iLCByZWcpOwlcCi0JCQlicmVhazsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlfX3VwdF92YWw7CQkJCQkJXAotCX0pCi0KLSNkZWZpbmUgVVBUX1NFVF9TWVNDQUxMX1JFVFVSTihyLCByZXMpIFwKLQlSRUdTX1NFVF9TWVNDQUxMX1JFVFVSTigociktPnJlZ3MsIChyZXMpKQotCi0jZGVmaW5lIFVQVF9SRVNUQVJUX1NZU0NBTEwocikgUkVHU19SRVNUQVJUX1NZU0NBTEwoKHIpLT5ncCkKLQotI2RlZmluZSBVUFRfU0VHVl9JU19GSVhBQkxFKHIpIFJFR1NfU0VHVl9JU19GSVhBQkxFKCZyLT5za2FzKQotCi0jZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKLQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaW5pdF9yZWdpc3RlcnMoaW50IHBpZCkKLXsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiY2NkYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9wdHJhY2VfdXNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfVVNFUl9IX18KLSNkZWZpbmUgX19TWVNERVBfWDg2XzY0X1BUUkFDRV9VU0VSX0hfXwotCi0jZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUwotI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jdW5kZWYgX19GUkFNRV9PRkZTRVRTCi0jaW5jbHVkZSAidXNlcl9jb25zdGFudHMuaCIKLQotI2RlZmluZSBQVF9JTkRFWChvZmYpICgob2ZmKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX05SKHJlZ3MpICgocmVncylbUFRfSU5ERVgoT1JJR19SQVgpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9OUl9PRkZTRVQgKE9SSUdfUkFYKQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHMShyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUkRJKV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHMV9PRkZTRVQgKFJESSkKLQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzIocmVncykgKCgodW5zaWduZWQgbG9uZyAqKSAocmVncykpW1BUX0lOREVYKFJTSSldKQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzJfT0ZGU0VUIChSU0kpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczKHJlZ3MpICgoKHVuc2lnbmVkIGxvbmcgKikgKHJlZ3MpKVtQVF9JTkRFWChSRFgpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczX09GRlNFVCAoUkRYKQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNChyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUkNYKV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNF9PRkZTRVQgKFJDWCkKLQotI2RlZmluZSBQVF9TWVNDQUxMX0FSRzUocmVncykgKCgodW5zaWduZWQgbG9uZyAqKSAocmVncykpW1BUX0lOREVYKFI4KV0pCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNV9PRkZTRVQgKFI4KQotCi0jZGVmaW5lIFBUX1NZU0NBTExfQVJHNihyZWdzKSAoKCh1bnNpZ25lZCBsb25nICopIChyZWdzKSlbUFRfSU5ERVgoUjkpXSkKLSNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc2X09GRlNFVCAoUjkpCi0KLSNkZWZpbmUgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VUIChSQVgpCi0KLSNkZWZpbmUgUFRfSVBfT0ZGU0VUIChSSVApCi0jZGVmaW5lIFBUX0lQKHJlZ3MpICgocmVncylbUFRfSU5ERVgoUklQKV0pCi0KLSNkZWZpbmUgUFRfU1BfT0ZGU0VUIChSU1ApCi0jZGVmaW5lIFBUX1NQKHJlZ3MpICgocmVncylbUFRfSU5ERVgoUlNQKV0pCi0KLSNkZWZpbmUgUFRfT1JJR19SQVhfT0ZGU0VUIChPUklHX1JBWCkKLSNkZWZpbmUgUFRfT1JJR19SQVgocmVncykgKChyZWdzKVtQVF9JTkRFWChPUklHX1JBWCldKQotCi0vKgotICogeDg2XzY0IEZDMyBkb2Vzbid0IGRlZmluZSB0aGlzIGluIC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBldmVuIHRob3VnaAotICogaXQncyBkZWZpbmVkIGluIHRoZSBrZXJuZWwncyBpbmNsdWRlL2xpbnV4L3B0cmFjZS5oLiBBZGRpdGlvbmFsbHksIHVzZSB0aGUKLSAqIDIuNCBuYW1lIGFuZCB2YWx1ZSBmb3IgMi40IGhvc3QgY29tcGF0aWJpbGl0eS4KLSAqLwotI2lmbmRlZiBQVFJBQ0VfT0xEU0VUT1BUSU9OUwotI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQotI2VuZGlmCi0KLS8qCi0gKiBUaGVzZSBhcmUgYmVmb3JlIHRoZSBzeXN0ZW0gY2FsbCwgc28gdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBSQVgKLSAqIHJhdGhlciB0aGFuIE9SSUdfUkFYLCBhbmQgYXJnNCBpcyBSMTAgcmF0aGVyIHRoYW4gUkNYCi0gKi8KLSNkZWZpbmUgUkVHU19TWVNDQUxMX05SIFBUX0lOREVYKFJBWCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzEgUFRfSU5ERVgoUkRJKQotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBQVF9JTkRFWChSU0kpCi0jZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIFBUX0lOREVYKFJEWCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzQgUFRfSU5ERVgoUjEwKQotI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBQVF9JTkRFWChSOCkKLSNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgUFRfSU5ERVgoUjkpCi0KLSNkZWZpbmUgUkVHU19JUF9JTkRFWCBQVF9JTkRFWChSSVApCi0jZGVmaW5lIFJFR1NfU1BfSU5ERVggUFRfSU5ERVgoUlNQKQotCi0jZGVmaW5lIEZQX1NJWkUgKEhPU1RfRlBfU0laRSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zYy5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFlZTQ1Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotI2lmbmRlZiBfX1NZU0RFUF9YODZfNjRfU0NfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfU0NfSAotCi0vKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA0IFBhdGhTY2FsZSwgSW5jCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHVzZXJfY29uc3RhbnRzLmg+Ci0KLSNkZWZpbmUgU0NfT0ZGU0VUKHNjLCBmaWVsZCkgXAotCSAqKCh1bnNpZ25lZCBsb25nICopICYoKChjaGFyICopIChzYykpW0hPU1RfIyNmaWVsZF0pKQotCi0jZGVmaW5lIFNDX1JCWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQlgpCi0jZGVmaW5lIFNDX1JDWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQ1gpCi0jZGVmaW5lIFNDX1JEWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SRFgpCi0jZGVmaW5lIFNDX1JTSShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SU0kpCi0jZGVmaW5lIFNDX1JESShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SREkpCi0jZGVmaW5lIFNDX1JCUChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQlApCi0jZGVmaW5lIFNDX1JBWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19SQVgpCi0jZGVmaW5lIFNDX1I4KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1I4KQotI2RlZmluZSBTQ19SOShzYykgU0NfT0ZGU0VUKHNjLCBTQ19SOSkKLSNkZWZpbmUgU0NfUjEwKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMCkKLSNkZWZpbmUgU0NfUjExKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMSkKLSNkZWZpbmUgU0NfUjEyKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMikKLSNkZWZpbmUgU0NfUjEzKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxMykKLSNkZWZpbmUgU0NfUjE0KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxNCkKLSNkZWZpbmUgU0NfUjE1KHNjKSBTQ19PRkZTRVQoc2MsIFNDX1IxNSkKLSNkZWZpbmUgU0NfSVAoc2MpIFNDX09GRlNFVChzYywgU0NfSVApCi0jZGVmaW5lIFNDX1NQKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NQKQotI2RlZmluZSBTQ19DUjIoc2MpIFNDX09GRlNFVChzYywgU0NfQ1IyKQotI2RlZmluZSBTQ19FUlIoc2MpIFNDX09GRlNFVChzYywgU0NfRVJSKQotI2RlZmluZSBTQ19UUkFQTk8oc2MpIFNDX09GRlNFVChzYywgU0NfVFJBUE5PKQotI2RlZmluZSBTQ19DUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19DUykKLSNkZWZpbmUgU0NfRlMoc2MpIFNDX09GRlNFVChzYywgU0NfRlMpCi0jZGVmaW5lIFNDX0dTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0dTKQotI2RlZmluZSBTQ19FRkxBR1Moc2MpIFNDX09GRlNFVChzYywgU0NfRUZMQUdTKQotI2RlZmluZSBTQ19TSUdNQVNLKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NJR01BU0spCi0jZGVmaW5lIFNDX1NTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX1NTKQotI2lmIDAKLSNkZWZpbmUgU0NfT1JJR19SQVgoc2MpIFNDX09GRlNFVChzYywgU0NfT1JJR19SQVgpCi0jZGVmaW5lIFNDX0RTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0RTKQotI2RlZmluZSBTQ19FUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19FUykKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NTEzMy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNERVBfWDg2XzY0X1NJR0NPTlRFWFRfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfU0lHQ09OVEVYVF9ICi0KLSNpbmNsdWRlIDxzeXNkZXAvc2MuaD4KLQotI2RlZmluZSBJUF9SRVNUQVJUX1NZU0NBTEwoaXApICgoaXApIC09IDIpCi0KLSNkZWZpbmUgR0VUX0ZBVUxUSU5GT19GUk9NX1NDKGZpLCBzYykgXAotCXsgXAotCQkoZmkpLmNyMiA9IFNDX0NSMihzYyk7IFwKLQkJKGZpKS5lcnJvcl9jb2RlID0gU0NfRVJSKHNjKTsgXAotCQkoZmkpLnRyYXBfbm8gPSBTQ19UUkFQTk8oc2MpOyBcCi0JfQotCi0vKiBUaGlzIGlzIFBhZ2UgRmF1bHQgKi8KLSNkZWZpbmUgU0VHVl9JU19GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAxNCkKLQotLyogTm8gYnJva2VuIFNLQVMgQVBJLCB3aGljaCBkb2Vzbid0IHBhc3MgdHJhcF9ubywgaGVyZS4gKi8KLSNkZWZpbmUgU0VHVl9NQVlCRV9GSVhBQkxFKGZpKQkwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc2thc19wdHJhY2UuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGI0YmU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9TS0FTX1BUUkFDRV9ICi0jZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9TS0FTX1BUUkFDRV9ICi0KLXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIHsKLSAgICAgICAgaW50IGlzX3dyaXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci19OwotCi1zdHJ1Y3QgcHRyYWNlX2xkdCB7Ci0gICAgICAgIGludCBmdW5jOwotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50OwotfTsKLQotI2RlZmluZSBQVFJBQ0VfTERUIDU0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3R1Yi5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMyYWEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9TVFVCX0gKLSNkZWZpbmUgX19TWVNERVBfU1RVQl9ICi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlX3VzZXIuaD4KLSNpbmNsdWRlICJhcy1sYXlvdXQuaCIKLSNpbmNsdWRlICJzdHViLWRhdGEuaCIKLSNpbmNsdWRlICJrZXJuX2NvbnN0YW50cy5oIgotCi1leHRlcm4gdm9pZCBzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKTsKLWV4dGVybiB2b2lkIHN0dWJfY2xvbmVfaGFuZGxlcih2b2lkKTsKLQotI2RlZmluZSBTVFVCX1NZU0NBTExfUkVUIFBUX0lOREVYKFJBWCkKLSNkZWZpbmUgU1RVQl9NTUFQX05SIF9fTlJfbW1hcAotI2RlZmluZSBNTUFQX09GRlNFVChvKSAobykKLQotI2RlZmluZSBfX3N5c2NhbGxfY2xvYmJlciAicjExIiwicmN4IiwibWVtb3J5IgotI2RlZmluZSBfX3N5c2NhbGwgInN5c2NhbGwiCi0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwwKGxvbmcgc3lzY2FsbCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKF9fc3lzY2FsbAotCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKHN5c2NhbGwpIDogX19zeXNjYWxsX2Nsb2JiZXIgKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwyKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMyhsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMpCi17Ci0JbG9uZyByZXQ7Ci0KLQlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKQotCQk6IF9fc3lzY2FsbF9jbG9iYmVyICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCkKLXsKLQlsb25nIHJldDsKLQotCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgIiBfX3N5c2NhbGwKLQkJOiAiPWEiIChyZXQpCi0JCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKSwKLQkJICAiZyIgKGFyZzQpCi0JCTogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNShsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCi0JCQkJIGxvbmcgYXJnNCwgbG9uZyBhcmc1KQotewotCWxvbmcgcmV0OwotCi0JX19hc21fXyB2b2xhdGlsZSAoIm1vdnEgJTUsJSVyMTAgOyBtb3ZxICU2LCUlcjggOyAiIF9fc3lzY2FsbAotCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKHN5c2NhbGwpLCAiRCIgKGFyZzEpLCAiUyIgKGFyZzIpLCAiZCIgKGFyZzMpLAotCQkgICJnIiAoYXJnNCksICJnIiAoYXJnNSkKLQkJOiBfX3N5c2NhbGxfY2xvYmJlciwgInIxMCIsICJyOCIgKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQotewotCV9fYXNtKCJpbnQzIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9zdGFjayhsb25nIGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlfX2FzbV9fIHZvbGF0aWxlICgibW92cSAlNCwlJXIxMCA7IG1vdnEgJTUsJSVyOCA7ICIKLQkJCSAgIm1vdnEgJTYsICUlcjk7ICIgX19zeXNjYWxsICI7IG1vdnEgJTcsICUlcmJ4IDsgIgotCQkJICAibW92cSAlJXJheCwgKCUlcmJ4KSI6Ci0JCQkgIDogImEiIChTVFVCX01NQVBfTlIpLCAiRCIgKFNUVUJfREFUQSksCi0JCQkgICAgIlMiIChVTV9LRVJOX1BBR0VfU0laRSksCi0JCQkgICAgImQiIChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQpLCAiZyIgKGZkKSwKLQkJCSAgICAiZyIgKG9mZnNldCksCi0JCQkgICAgImkiICgmKChzdHJ1Y3Qgc3R1Yl9kYXRhICopIFNUVUJfREFUQSktPmVycikKLQkJCSAgOiBfX3N5c2NhbGxfY2xvYmJlciwgInIxMCIsICJyOCIsICJyOSIgKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oIGIvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYjBiMDguLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9YODZfNjRfU1lTQ0FMTFNfSF9fCi0jZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9TWVNDQUxMU19IX18KLQotI2luY2x1ZGUgPGxpbnV4L21zZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NobS5oPgotI2luY2x1ZGUgPGtlcm5fY29uc3RhbnRzLmg+Ci0KLXR5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKLQotZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICpzeXNfY2FsbF90YWJsZVtdOwotCi0jZGVmaW5lIEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSBcCi0JKCgobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZykpIFwKLQkgICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShVUFRfU1lTQ0FMTF9BUkcxKCZyZWdzLT5yZWdzKSwgXAotCQkgCQkgICAgICBVUFRfU1lTQ0FMTF9BUkcyKCZyZWdzLT5yZWdzKSwgXAotCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzMoJnJlZ3MtPnJlZ3MpLCBcCi0JCQkJICAgICAgVVBUX1NZU0NBTExfQVJHNCgmcmVncy0+cmVncyksIFwKLQkJCQkgICAgICBVUFRfU1lTQ0FMTF9BUkc1KCZyZWdzLT5yZWdzKSwgXAotCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzYoJnJlZ3MtPnJlZ3MpKSkKLQotZXh0ZXJuIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7Ci1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21vZGlmeV9sZHQ7Ci1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX2FyY2hfcHJjdGw7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvc3lzdGVtLmggYi9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTNjNC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9zeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1NZU1RFTV9IXwotI2RlZmluZSBfQVNNX1g4Nl9TWVNURU1fSF8KLQotI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KLSNpbmNsdWRlIDxhc20vbm9wcy5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KLQotLyogZW50cmllcyBpbiBBUkNIX0RMSU5GTzogKi8KLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLSMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMgotI2Vsc2UKLSMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMQotI2VuZGlmCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7Ci0KLXZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOwotCi0vKgotICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KLSAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZwotICogdG8gZGV2aWNlcy4KLSAqLwotI2lmZGVmIENPTkZJR19YODZfMzIKLS8qCi0gKiBTb21lIG5vbi1JbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCi0gKiBub3AgZm9yIHRoZXNlLgotICovCi0jZGVmaW5lIG1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKLSNkZWZpbmUgcm1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKLSNkZWZpbmUgd21iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAic2ZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NKQotI2Vsc2UKLSNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCi0jZGVmaW5lIHJtYigpCWFzbSB2b2xhdGlsZSgibGZlbmNlIjo6OiJtZW1vcnkiKQotI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUoInNmZW5jZSIgOjo6ICJtZW1vcnkiKQotI2VuZGlmCi0KLS8qKgotICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCi0gKiBkZXBlbmQgb24uCi0gKgotICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAotICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCi0gKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQotICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQotICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KLSAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKLSAqIHJtYigpLgotICoKLSAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCi0gKiBhbmQgdGhlIGNvbXBpbGVyLgotICoKLSAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKLSAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAotICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKgliID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKglwID0gJmI7CQkJCXEgPSBwOwotICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0gKgkJCQkJZCA9ICpxOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCi0gKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAotICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKLSAqCi0gKiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gKglDUFUgMAkJCQlDUFUgMQotICoKLSAqCWEgPSAyOwotICoJbWVtb3J5X2JhcnJpZXIoKTsKLSAqCWIgPSAzOwkJCQl5ID0gYjsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCXggPSBhOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgotICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAotICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKLSAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCi0gKiovCi0KLSNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNtcF9tYigpCW1iKCkKLSNpZmRlZiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UKLSMgZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2Vsc2UKLSMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQotIyBkZWZpbmUgc21wX3dtYigpIAl3bWIoKQotI2Vsc2UKLSMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKLSNlbmRpZgotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHZhciA9IHZhbHVlOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotLyoKLSAqIFN0b3AgUkRUU0Mgc3BlY3VsYXRpb24uIFRoaXMgaXMgbmVlZGVkIHdoZW4geW91IG5lZWQgdG8gdXNlIFJEVFNDCi0gKiAob3IgZ2V0X2N5Y2xlcyBvciB2cmVhZCB0aGF0IHBvc3NpYmx5IGFjY2Vzc2VzIHRoZSBUU0MpIGluIGEgZGVmaW5lZAotICogY29kZSByZWdpb24uCi0gKgotICogKENvdWxkIHVzZSBhbiBhbHRlcm5hdGl2ZSB0aHJlZSB3YXkgZm9yIHRoaXMgaWYgdGhlcmUgd2FzIG9uZS4pCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZHRzY19iYXJyaWVyKHZvaWQpCi17Ci0JYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MpOwotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC90bHMuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMwMDBkLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3Rscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI2lmbmRlZiBfU1lTREVQX1RMU19ICi0jZGVmaW5lIF9TWVNERVBfVExTX0gKLQotIyBpZm5kZWYgX19LRVJORUxfXwotCi0vKiBDaGFuZ2UgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgb3JpZ2luYWwgb25lIGZyb20gPGFzbS9sZHQuaD4sIHdoaWNoCi0gKiBtYXkgYmUgbmFtZWQgdXNlcl9kZXNjIChidXQgaW4gMi40IGFuZCBpbiBoZWFkZXIgbWF0Y2hpbmcgaXRzIEFQSSB3YXMgbmFtZWQKLSAqIG1vZGlmeV9sZHRfbGR0X3MpLiAqLwotCi10eXBlZGVmIHN0cnVjdCB1bV9kdXBfdXNlcl9kZXNjIHsKLQl1bnNpZ25lZCBpbnQgIGVudHJ5X251bWJlcjsKLQl1bnNpZ25lZCBpbnQgIGJhc2VfYWRkcjsKLQl1bnNpZ25lZCBpbnQgIGxpbWl0OwotCXVuc2lnbmVkIGludCAgc2VnXzMyYml0OjE7Ci0JdW5zaWduZWQgaW50ICBjb250ZW50czoyOwotCXVuc2lnbmVkIGludCAgcmVhZF9leGVjX29ubHk6MTsKLQl1bnNpZ25lZCBpbnQgIGxpbWl0X2luX3BhZ2VzOjE7Ci0JdW5zaWduZWQgaW50ICBzZWdfbm90X3ByZXNlbnQ6MTsKLQl1bnNpZ25lZCBpbnQgIHVzZWFibGU6MTsKLQl1bnNpZ25lZCBpbnQgIGxtOjE7Ci19IHVzZXJfZGVzY190OwotCi0jIGVsc2UgLyogX19LRVJORUxfXyAqLwotCi0jICBpbmNsdWRlIDxsZHQuaD4KLXR5cGVkZWYgc3RydWN0IHVzZXJfZGVzYyB1c2VyX2Rlc2NfdDsKLQotIyBlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX1NZU0RFUF9UTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaCBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL3ZtLWZsYWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzhlNTUuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvdm0tZmxhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKLSAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19WTV9GTEFHU19YODZfNjRfSAotI2RlZmluZSBfX1ZNX0ZMQUdTX1g4Nl82NF9ICi0KLSNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIChWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXAotCVZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCi0jZGVmaW5lIFZNX1NUQUNLX0RFRkFVTFRfRkxBR1MgKFZNX0dST1dTRE9XTiB8IFZNX1JFQUQgfCBWTV9XUklURSB8IFwKLQlWTV9FWEVDIHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc2lnbmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjY1YzcuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3NpZ25hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGF0aFNjYWxlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KLSNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCi0jaW5jbHVkZSAic2thcy5oIgotCi12b2lkIGNvcHlfc2Moc3RydWN0IHVtbF9wdF9yZWdzICpyZWdzLCB2b2lkICpmcm9tKQotewotCXN0cnVjdCBzaWdjb250ZXh0ICpzYyA9IGZyb207Ci0KLSNkZWZpbmUgR0VUUkVHKHJlZ3MsIHJlZ25vLCBzYywgcmVnbmFtZSkJCQkJXAotCShyZWdzKS0+Z3BbKHJlZ25vKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKV0gPSAoc2MpLT5yZWduYW1lCi0KLQlHRVRSRUcocmVncywgUjgsIHNjLCByOCk7Ci0JR0VUUkVHKHJlZ3MsIFI5LCBzYywgcjkpOwotCUdFVFJFRyhyZWdzLCBSMTAsIHNjLCByMTApOwotCUdFVFJFRyhyZWdzLCBSMTEsIHNjLCByMTEpOwotCUdFVFJFRyhyZWdzLCBSMTIsIHNjLCByMTIpOwotCUdFVFJFRyhyZWdzLCBSMTMsIHNjLCByMTMpOwotCUdFVFJFRyhyZWdzLCBSMTQsIHNjLCByMTQpOwotCUdFVFJFRyhyZWdzLCBSMTUsIHNjLCByMTUpOwotCUdFVFJFRyhyZWdzLCBSREksIHNjLCBkaSk7Ci0JR0VUUkVHKHJlZ3MsIFJTSSwgc2MsIHNpKTsKLQlHRVRSRUcocmVncywgUkJQLCBzYywgYnApOwotCUdFVFJFRyhyZWdzLCBSQlgsIHNjLCBieCk7Ci0JR0VUUkVHKHJlZ3MsIFJEWCwgc2MsIGR4KTsKLQlHRVRSRUcocmVncywgUkFYLCBzYywgYXgpOwotCUdFVFJFRyhyZWdzLCBSQ1gsIHNjLCBjeCk7Ci0JR0VUUkVHKHJlZ3MsIFJTUCwgc2MsIHNwKTsKLQlHRVRSRUcocmVncywgUklQLCBzYywgaXApOwotCUdFVFJFRyhyZWdzLCBFRkxBR1MsIHNjLCBmbGFncyk7Ci0JR0VUUkVHKHJlZ3MsIENTLCBzYywgY3MpOwotCi0jdW5kZWYgR0VUUkVHCi19Ci0KLXN0YXRpYyBpbnQgY29weV9zY19mcm9tX3VzZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICAgIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqZnJvbSwKLQkJCSAgICAgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnBwKQotewotCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwOwotCWludCBlcnIgPSAwOwotCi0jZGVmaW5lIEdFVFJFRyhyZWdzLCByZWdubywgc2MsIHJlZ25hbWUpCQkJCVwKLQlfX2dldF91c2VyKChyZWdzKS0+cmVncy5ncFsocmVnbm8pIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSwJXAotCQkgICAmKHNjKS0+cmVnbmFtZSkKLQotCWVyciB8PSBHRVRSRUcocmVncywgUjgsIGZyb20sIHI4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFI5LCBmcm9tLCByOSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTAsIGZyb20sIHIxMCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTEsIGZyb20sIHIxMSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTIsIGZyb20sIHIxMik7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTMsIGZyb20sIHIxMyk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTQsIGZyb20sIHIxNCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSMTUsIGZyb20sIHIxNSk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSREksIGZyb20sIGRpKTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJTSSwgZnJvbSwgc2kpOwotCWVyciB8PSBHRVRSRUcocmVncywgUkJQLCBmcm9tLCBicCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSQlgsIGZyb20sIGJ4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJEWCwgZnJvbSwgZHgpOwotCWVyciB8PSBHRVRSRUcocmVncywgUkFYLCBmcm9tLCBheCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBSQ1gsIGZyb20sIGN4KTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIFJTUCwgZnJvbSwgc3ApOwotCWVyciB8PSBHRVRSRUcocmVncywgUklQLCBmcm9tLCBpcCk7Ci0JZXJyIHw9IEdFVFJFRyhyZWdzLCBFRkxBR1MsIGZyb20sIGZsYWdzKTsKLQllcnIgfD0gR0VUUkVHKHJlZ3MsIENTLCBmcm9tLCBjcyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIDE7Ci0KLSN1bmRlZiBHRVRSRUcKLQotCWVyciA9IGNvcHlfZnJvbV91c2VyKCZmcCwgZnBwLCBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCWVyciA9IHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdLAotCQkJCSAgICh1bnNpZ25lZCBsb25nICopICZmcCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtICIKLQkJICAgICAgICJyZXN0b3JlX2ZwX3JlZ2lzdGVycyBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgICAtZXJyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9zY190b191c2VyKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdG8sCi0JCQkgICBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICp0b19mcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICB1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgc3ApCi17Ci0Jc3RydWN0IGZhdWx0aW5mbyAqIGZpID0gJmN1cnJlbnQtPnRocmVhZC5hcmNoLmZhdWx0aW5mbzsKLQlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcDsKLQlpbnQgZXJyID0gMDsKLQotCWVyciB8PSBfX3B1dF91c2VyKDAsICZ0by0+Z3MpOwotCWVyciB8PSBfX3B1dF91c2VyKDAsICZ0by0+ZnMpOwotCi0jZGVmaW5lIFBVVFJFRyhyZWdzLCByZWdubywgc2MsIHJlZ25hbWUpCQkJCVwKLQlfX3B1dF91c2VyKChyZWdzKS0+cmVncy5ncFsocmVnbm8pIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSwJXAotCQkgICAmKHNjKS0+cmVnbmFtZSkKLQotCWVyciB8PSBQVVRSRUcocmVncywgUkRJLCB0bywgZGkpOwotCWVyciB8PSBQVVRSRUcocmVncywgUlNJLCB0bywgc2kpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkJQLCB0bywgYnApOwotCS8qCi0JICogTXVzdCB1c2Ugb3JpZ2luYWwgUlNQLCB3aGljaCBpcyBwYXNzZWQgaW4sIHJhdGhlciB0aGFuIHdoYXQncyBpbgotCSAqIHRoZSBwdF9yZWdzLCBiZWNhdXNlIHRoYXQncyBhbHJlYWR5IGJlZW4gdXBkYXRlZCB0byBwb2ludCBhdCB0aGUKLQkgKiBzaWduYWwgZnJhbWUuCi0JICovCi0JZXJyIHw9IF9fcHV0X3VzZXIoc3AsICZ0by0+c3ApOwotCWVyciB8PSBQVVRSRUcocmVncywgUkJYLCB0bywgYngpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkRYLCB0bywgZHgpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkNYLCB0bywgY3gpOwotCWVyciB8PSBQVVRSRUcocmVncywgUkFYLCB0bywgYXgpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjgsIHRvLCByOCk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSOSwgdG8sIHI5KTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIFIxMCwgdG8sIHIxMCk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSMTEsIHRvLCByMTEpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjEyLCB0bywgcjEyKTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIFIxMywgdG8sIHIxMyk7Ci0JZXJyIHw9IFBVVFJFRyhyZWdzLCBSMTQsIHRvLCByMTQpOwotCWVyciB8PSBQVVRSRUcocmVncywgUjE1LCB0bywgcjE1KTsKLQllcnIgfD0gUFVUUkVHKHJlZ3MsIENTLCB0bywgY3MpOyAvKiBYWFggeDg2XzY0IGRvZXNuJ3QgZG8gdGhpcyAqLwotCi0JZXJyIHw9IF9fcHV0X3VzZXIoZmktPmNyMiwgJnRvLT5jcjIpOwotCWVyciB8PSBfX3B1dF91c2VyKGZpLT5lcnJvcl9jb2RlLCAmdG8tPmVycik7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoZmktPnRyYXBfbm8sICZ0by0+dHJhcG5vKTsKLQotCWVyciB8PSBQVVRSRUcocmVncywgUklQLCB0bywgaXApOwotCWVyciB8PSBQVVRSRUcocmVncywgRUZMQUdTLCB0bywgZmxhZ3MpOwotI3VuZGVmIFBVVFJFRwotCi0JZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnRvLT5vbGRtYXNrKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gMTsKLQotCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdLAotCQkJCSh1bnNpZ25lZCBsb25nICopICZmcCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX2Zyb21fdXNlciAtIHJlc3RvcmVfZnBfcmVnaXN0ZXJzICIKLQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIC1lcnIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoY29weV90b191c2VyKHRvX2ZwLCAmZnAsIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0cnVjdCBydF9zaWdmcmFtZQotewotCWNoYXIgX191c2VyICpwcmV0Y29kZTsKLQlzdHJ1Y3QgdWNvbnRleHQgdWM7Ci0Jc3RydWN0IHNpZ2luZm8gaW5mbzsKLQlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKLX07Ci0KLWludCBzZXR1cF9zaWduYWxfc3RhY2tfc2kodW5zaWduZWQgbG9uZyBzdGFja190b3AsIGludCBzaWcsCi0JCQkgIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICogcmVncywKLQkJCSAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqc2V0KQotewotCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgc2F2ZV9zcCA9IFBUX1JFR1NfUlNQKHJlZ3MpOwotCWludCBlcnIgPSAwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwotCi0JZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKQotCQlyb3VuZF9kb3duKHN0YWNrX3RvcCAtIHNpemVvZihzdHJ1Y3QgcnRfc2lnZnJhbWUpLCAxNik7Ci0JLyogU3VidHJhY3QgMTI4IGZvciBhIHJlZCB6b25lIGFuZCA4IGZvciBwcm9wZXIgYWxpZ25tZW50ICovCi0JZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKSAoKHVuc2lnbmVkIGxvbmcpIGZyYW1lIC0gMTI4IC0gOCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pIHsKLQkJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZSBTUCBub3cgYmVjYXVzZSB0aGUgcGFnZSBmYXVsdCBoYW5kbGVyIHJlZnVzZXMgdG8gZXh0ZW5kCi0JICogdGhlIHN0YWNrIGlmIHRoZSBmYXVsdGluZyBhZGRyZXNzIGlzIHRvbyBmYXIgYmVsb3cgdGhlIGN1cnJlbnQKLQkgKiBTUCwgd2hpY2ggZnJhbWUgbm93IGNlcnRhaW5seSBpcy4gIElmIHRoZXJlJ3MgYW4gZXJyb3IsIHRoZSBvcmlnaW5hbAotCSAqIHZhbHVlIGlzIHJlc3RvcmVkIG9uIHRoZSB3YXkgb3V0LgotCSAqIFdoZW4gd3JpdGluZyB0aGUgc2lnY29udGV4dCB0byB0aGUgc3RhY2ssIHdlIGhhdmUgdG8gd3JpdGUgdGhlCi0JICogb3JpZ2luYWwgdmFsdWUsIHNvIHRoYXQncyBwYXNzZWQgdG8gY29weV9zY190b191c2VyLCB3aGljaCBkb2VzCi0JICogdGhlIHJpZ2h0IHRoaW5nIHdpdGggaXQuCi0JICovCi0JUFRfUkVHU19SU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0KLQkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKG1lLT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwotCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhzYXZlX3NwKSwKLQkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIobWUtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOwotCWVyciB8PSBjb3B5X3NjX3RvX3VzZXIoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5mcHN0YXRlLCByZWdzLAotCQkJICAgICAgIHNldC0+c2lnWzBdLCBzYXZlX3NwKTsKLQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmZwc3RhdGUsICZmcmFtZS0+dWMudWNfbWNvbnRleHQuZnBzdGF0ZSk7Ci0JaWYgKHNpemVvZigqc2V0KSA9PSAxNikgewotCQlfX3B1dF91c2VyKHNldC0+c2lnWzBdLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2suc2lnWzBdKTsKLQkJX19wdXRfdXNlcihzZXQtPnNpZ1sxXSwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLnNpZ1sxXSk7Ci0JfQotCWVsc2UKLQkJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LAotCQkJCSAgICAgIHNpemVvZigqc2V0KSk7Ci0KLQkvKgotCSAqIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YgotCSAqIGFscmVhZHkgaW4gdXNlcnNwYWNlLgotCSAqLwotCS8qIHg4Ni02NCBzaG91bGQgYWx3YXlzIHVzZSBTQV9SRVNUT1JFUi4gKi8KLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCi0JCWVyciB8PSBfX3B1dF91c2VyKGthLT5zYS5zYV9yZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7Ci0JZWxzZQotCQkvKiBjb3VsZCB1c2UgYSB2c3R1YiBoZXJlICovCi0JCWdvdG8gcmVzdG9yZV9zcDsKLQotCWlmIChlcnIpCi0JCWdvdG8gcmVzdG9yZV9zcDsKLQotCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCi0JewotCQlzdHJ1Y3QgZXhlY19kb21haW4gKmVkID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbjsKLQkJaWYgKHVubGlrZWx5KGVkICYmIGVkLT5zaWduYWxfaW52bWFwICYmIHNpZyA8IDMyKSkKLQkJCXNpZyA9IGVkLT5zaWduYWxfaW52bWFwW3NpZ107Ci0JfQotCi0JUFRfUkVHU19SREkocmVncykgPSBzaWc7Ci0JLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLwotCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsKLQotCS8qCi0JICogVGhpcyBhbHNvIHdvcmtzIGZvciBub24gU0FfU0lHSU5GTyBoYW5kbGVycyBiZWNhdXNlIHRoZXkgZXhwZWN0IHRoZQotCSAqIG5leHQgYXJndW1lbnQgYWZ0ZXIgdGhlIHNpZ25hbCBudW1iZXIgb24gdGhlIHN0YWNrLgotCSAqLwotCVBUX1JFR1NfUlNJKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKLQlQVF9SRUdTX1JEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOwotCVBUX1JFR1NfUklQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwotIG91dDoKLQlyZXR1cm4gZXJyOwotCi1yZXN0b3JlX3NwOgotCVBUX1JFR1NfUlNQKHJlZ3MpID0gc2F2ZV9zcDsKLQlyZXR1cm4gZXJyOwotfQotCi1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBzcCA9IFBUX1JFR1NfU1AoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9Ci0JCShzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHNwIC0gOCk7Ci0Jc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMgPSAmZnJhbWUtPnVjOwotCXNpZ3NldF90IHNldDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0LCAmdWMtPnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAmdWMtPnVjX21jb250ZXh0LAotCQkJICAgICAgJmZyYW1lLT5mcHN0YXRlKSkKLQkJZ290byBzZWdmYXVsdDsKLQotCS8qIEF2b2lkIEVSRVNUQVJUIGhhbmRsaW5nICovCi0JUFRfUkVHU19TWVNDQUxMX05SKCZjdXJyZW50LT50aHJlYWQucmVncykgPSAtMTsKLQlyZXR1cm4gUFRfUkVHU19TWVNDQUxMX1JFVCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwotCi0gc2VnZmF1bHQ6Ci0JZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQwNTFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAiYXMtbGF5b3V0LmgiCi0jaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKLSNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCi0jaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKLQotdm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCi1zdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQotewotCXN0cnVjdCB1Y29udGV4dCAqdWM7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92cSAlJXJkeCwgJTAiIDogIj1nIiAodWMpIDopOwotCUdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFNUVUJfREFUQSksCi0JCQkgICAgICAmdWMtPnVjX21jb250ZXh0KTsKLQl0cmFwX215c2VsZigpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbF90YWJsZS5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxfdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNDY5ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbF90YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBVTUwveDg2LTY0LCBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvc3lzY2FsbC5jCi0gKiB3aXRoIHNvbWUgY2hhbmdlcyBmb3IgVU1MLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxrZXJuX2NvbnN0YW50cy5oPgotCi0jZGVmaW5lIF9fTk9fU1RVQlMKLQotLyoKLSAqIEJlbG93IHlvdSBjYW4gc2VlLCBpbiB0ZXJtcyBvZiAjZGVmaW5lJ3MsIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB4ODYtNjQKLSAqIGFuZCB0aGUgVU1MIHN5c2NhbGwgdGFibGUuCi0gKi8KLQotLyogTm90IGdvaW5nIHRvIGJlIGltcGxlbWVudGVkIGJ5IFVNTCwgc2luY2Ugd2UgaGF2ZSBubyBoYXJkd2FyZS4gKi8KLSNkZWZpbmUgc3R1Yl9pb3BsIHN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19pb3Blcm0gc3lzX25pX3N5c2NhbGwKLQotLyoKLSAqIFRoZSBVTUwgVExTIHByb2JsZW0uIE5vdGUgdGhhdCB4ODZfNjQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMsIHNvIHRoZSBiZWxvdwotICogaXMgbmVlZGVkIG9ubHkgZm9yIHRoZSBpYTMyIGNvbXBhdGliaWxpdHkuCi0gKi8KLQotLyogT24gVU1MIHdlIGNhbGwgaXQgdGhpcyB3YXkgKCJvbGQiIG1lYW5zIGl0J3Mgbm90IG1tYXAyKSAqLwotI2RlZmluZSBzeXNfbW1hcCBvbGRfbW1hcAotCi0jZGVmaW5lIHN0dWJfY2xvbmUgc3lzX2Nsb25lCi0jZGVmaW5lIHN0dWJfZm9yayBzeXNfZm9yawotI2RlZmluZSBzdHViX3Zmb3JrIHN5c192Zm9yawotI2RlZmluZSBzdHViX2V4ZWN2ZSBzeXNfZXhlY3ZlCi0jZGVmaW5lIHN0dWJfcnRfc2lnc3VzcGVuZCBzeXNfcnRfc2lnc3VzcGVuZAotI2RlZmluZSBzdHViX3NpZ2FsdHN0YWNrIHN5c19zaWdhbHRzdGFjawotI2RlZmluZSBzdHViX3J0X3NpZ3JldHVybiBzeXNfcnRfc2lncmV0dXJuCi0KLSNkZWZpbmUgX19TWVNDQUxMKG5yLCBzeW0pIGV4dGVybiBhc21saW5rYWdlIHZvaWQgc3ltKHZvaWQpIDsKLSN1bmRlZiBfQVNNX1g4Nl9VTklTVERfNjRfSAotI2luY2x1ZGUgIi4uLy4uL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaCIKLQotI3VuZGVmIF9fU1lTQ0FMTAotI2RlZmluZSBfX1NZU0NBTEwobnIsIHN5bSkgWyBuciBdID0gc3ltLAotI3VuZGVmIF9BU01fWDg2X1VOSVNURF82NF9ICi0KLXR5cGVkZWYgdm9pZCAoKnN5c19jYWxsX3B0cl90KSh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgc3lzX25pX3N5c2NhbGwodm9pZCk7Ci0KLS8qCi0gKiBXZSB1c2VkIHRvIGhhdmUgYSB0cmljayBoZXJlIHdoaWNoIG1hZGUgc3VyZSB0aGF0IGhvbGVzIGluIHRoZQotICogeDg2XzY0IHRhYmxlIHdlcmUgZmlsbGVkIGluIHdpdGggc3lzX25pX3N5c2NhbGwsIGJ1dCBhIGNvbW1lbnQgaW4KLSAqIHVuaXN0ZF82NC5oIHNheXMgdGhhdCBob2xlcyBhcmVuJ3QgYWxsb3dlZCwgc28gdGhlIHRyaWNrIHdhcwotICogcmVtb3ZlZC4KLSAqIFRoZSB0cmljayBsb29rZWQgbGlrZSB0aGlzCi0gKglbMCAuLi4gVU1fTlJfc3lzY2FsbF9tYXhdID0gJnN5c19uaV9zeXNjYWxsCi0gKiBiZWZvcmUgaW5jbHVkaW5nIHVuaXN0ZF82NC5oIC0gdGhlIGxhdGVyIGluaXRpYWxpemF0aW9ucyBvdmVyd3JvdGUKLSAqIHRoZSBzeXNfbmlfc3lzY2FsbCBmaWxsZXIuCi0gKi8KLQotc3lzX2NhbGxfcHRyX3Qgc3lzX2NhbGxfdGFibGVbXSBfX2NhY2hlbGluZV9hbGlnbmVkID0gewotI2luY2x1ZGUgIi4uLy4uL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaCIKLX07Ci0KLWludCBzeXNjYWxsX3RhYmxlX3NpemUgPSBzaXplb2Yoc3lzX2NhbGxfdGFibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c3JxLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3lzcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmODJiZS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgInN5c3JxLmgiCi0KLXZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcHJpbnRrKCJcbiIpOwotCXByaW50X21vZHVsZXMoKTsKLQlwcmludGsoS0VSTl9JTkZPICJQaWQ6ICVkLCBjb21tOiAlLjIwcyAlcyAlc1xuIiwgdGFza19waWRfbnIoY3VycmVudCksCi0JCWN1cnJlbnQtPmNvbW0sIHByaW50X3RhaW50ZWQoKSwgaW5pdF91dHNuYW1lKCktPnJlbGVhc2UpOwotCXByaW50ayhLRVJOX0lORk8gIlJJUDogJTA0bHg6WzwlMDE2bHg+XVxuIiwgUFRfUkVHU19DUyhyZWdzKSAmIDB4ZmZmZiwKLQkgICAgICAgUFRfUkVHU19SSVAocmVncykpOwotCXByaW50ayhLRVJOX0lORk8gIlJTUDogJTAxNmx4ICBFRkxBR1M6ICUwOGx4XG4iLCBQVF9SRUdTX1JTUChyZWdzKSwKLQkgICAgICAgUFRfUkVHU19FRkxBR1MocmVncykpOwotCXByaW50ayhLRVJOX0lORk8gIlJBWDogJTAxNmx4IFJCWDogJTAxNmx4IFJDWDogJTAxNmx4XG4iLAotCSAgICAgICBQVF9SRUdTX1JBWChyZWdzKSwgUFRfUkVHU19SQlgocmVncyksIFBUX1JFR1NfUkNYKHJlZ3MpKTsKLQlwcmludGsoS0VSTl9JTkZPICJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKLQkgICAgICAgUFRfUkVHU19SRFgocmVncyksIFBUX1JFR1NfUlNJKHJlZ3MpLCBQVF9SRUdTX1JESShyZWdzKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUkJQOiAlMDE2bHggUjA4OiAlMDE2bHggUjA5OiAlMDE2bHhcbiIsCi0JICAgICAgIFBUX1JFR1NfUkJQKHJlZ3MpLCBQVF9SRUdTX1I4KHJlZ3MpLCBQVF9SRUdTX1I5KHJlZ3MpKTsKLQlwcmludGsoS0VSTl9JTkZPICJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKLQkgICAgICAgUFRfUkVHU19SMTAocmVncyksIFBUX1JFR1NfUjExKHJlZ3MpLCBQVF9SRUdTX1IxMihyZWdzKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCi0JICAgICAgIFBUX1JFR1NfUjEzKHJlZ3MpLCBQVF9SRUdTX1IxNChyZWdzKSwgUFRfUkVHU19SMTUocmVncykpOwotfQotCi12b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlfX3Nob3dfcmVncyhyZWdzKTsKLQlzaG93X3RyYWNlKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopICZyZWdzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLXg4Nl82NC91c2VyLW9mZnNldHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNTg1NC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvdXNlci1vZmZzZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3VzZXIuaD4KLSNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAotICAgICAgICBhc20gdm9sYXRpbGUoIlxuLT4iICNzeW0gIiAlMCAiICN2YWwgOiA6ICJpIiAodmFsKSkKLQotI2RlZmluZSBERUZJTkVfTE9OR1Moc3ltLCB2YWwpIFwKLSAgICAgICAgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbC9zaXplb2YodW5zaWduZWQgbG9uZykpKQotCi0jZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCi0JREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7Ci0KLXZvaWQgZm9vKHZvaWQpCi17Ci0JT0ZGU0VUKEhPU1RfU0NfQ1IyLCBzaWdjb250ZXh0LCBjcjIpOwotCU9GRlNFVChIT1NUX1NDX0VSUiwgc2lnY29udGV4dCwgZXJyKTsKLQlPRkZTRVQoSE9TVF9TQ19UUkFQTk8sIHNpZ2NvbnRleHQsIHRyYXBubyk7Ci0KLQlERUZJTkUoSE9TVF9GUF9TSVpFLCBzaXplb2Yoc3RydWN0IF9mcHN0YXRlKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUkJYLCBSQlgpOwotCURFRklORV9MT05HUyhIT1NUX1JDWCwgUkNYKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SREksIFJESSk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUlNJLCBSU0kpOwotCURFRklORV9MT05HUyhIT1NUX1JEWCwgUkRYKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SQlAsIFJCUCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUkFYLCBSQVgpOwotCURFRklORV9MT05HUyhIT1NUX1I4LCBSOCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjksIFI5KTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SMTAsIFIxMCk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjExLCBSMTEpOwotCURFRklORV9MT05HUyhIT1NUX1IxMiwgUjEyKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9SMTMsIFIxMyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfUjE0LCBSMTQpOwotCURFRklORV9MT05HUyhIT1NUX1IxNSwgUjE1KTsKLQlERUZJTkVfTE9OR1MoSE9TVF9PUklHX1JBWCwgT1JJR19SQVgpOwotCURFRklORV9MT05HUyhIT1NUX0NTLCBDUyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfU1MsIFNTKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9FRkxBR1MsIEVGTEFHUyk7Ci0jaWYgMAotCURFRklORV9MT05HUyhIT1NUX0ZTLCBGUyk7Ci0JREVGSU5FX0xPTkdTKEhPU1RfR1MsIEdTKTsKLQlERUZJTkVfTE9OR1MoSE9TVF9EUywgRFMpOwotCURFRklORV9MT05HUyhIT1NUX0VTLCBFUyk7Ci0jZW5kaWYKLQotCURFRklORV9MT05HUyhIT1NUX0lQLCBSSVApOwotCURFRklORV9MT05HUyhIT1NUX1NQLCBSU1ApOwotCURFRklORShVTV9GUkFNRV9TSVpFLCBzaXplb2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpKTsKLQotCS8qIFhYWCBEdXBsaWNhdGVkIGJldHdlZW4gaTM4NiBhbmQgeDg2XzY0ICovCi0JREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKLQlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7Ci0JREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOwotCi0JREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKLQlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7Ci0JREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL01ha2VmaWxlIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmZlNmQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0jCi0jIEJ1aWxkaW5nIHZEU08gaW1hZ2VzIGZvciB4ODYuCi0jCi0KLVZEU082NC15CQk6PSB5Ci0KLXZkc28taW5zdGFsbC0kKFZEU082NC15KQkrPSB2ZHNvLnNvCi0KLQotIyBmaWxlcyB0byBsaW5rIGludG8gdGhlIHZkc28KLXZvYmpzLXkgOj0gdmRzby1ub3RlLm8gdW1fdmRzby5vCi0KLSMgZmlsZXMgdG8gbGluayBpbnRvIGtlcm5lbAotb2JqLSQoVkRTTzY0LXkpCQkJKz0gdmRzby5vIHZtYS5vCi0KLXZvYmpzIDo9ICQoZm9yZWFjaCBGLCQodm9ianMteSksJChvYmopLyRGKQotCi0kKG9iaikvdmRzby5vOiAkKG9iaikvdmRzby5zbwotCi10YXJnZXRzICs9IHZkc28uc28gdmRzby5zby5kYmcgdmRzby5sZHMgJCh2b2Jqcy15KQotCi1leHBvcnQgQ1BQRkxBR1NfdmRzby5sZHMgKz0gLVAgLUMKLQotVkRTT19MREZMQUdTX3Zkc28ubGRzID0gLW02NCAtV2wsLXNvbmFtZT1saW51eC12ZHNvLnNvLjEgXAotICAgICAgIC1XbCwteixtYXgtcGFnZS1zaXplPTQwOTYgLVdsLC16LGNvbW1vbi1wYWdlLXNpemU9NDA5NgotCi0kKG9iaikvdmRzby5vOiAkKHNyYykvdmRzby5TICQob2JqKS92ZHNvLnNvCi0KLSQob2JqKS92ZHNvLnNvLmRiZzogJChzcmMpL3Zkc28ubGRzICQodm9ianMpIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsdmRzbykKLQotJChvYmopLyUuc286IE9CSkNPUFlGTEFHUyA6PSAtUwotJChvYmopLyUuc286ICQob2JqKS8lLnNvLmRiZyBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCi0KLSMKLSMgRG9uJ3Qgb21pdCBmcmFtZSBwb2ludGVycyBmb3IgZWFzZSBvZiB1c2Vyc3BhY2UgZGVidWdnaW5nLCBidXQgZG8KLSMgb3B0aW1pemUgc2libGluZyBjYWxscy4KLSMKLUNGTCA6PSAkKFBST0ZJTElORykgLW1jbW9kZWw9c21hbGwgLWZQSUMgLU8yIC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCBcCi0gICAgICAgJChmaWx0ZXIgLWclLCQoS0JVSUxEX0NGTEFHUykpICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKSBcCi0gICAgICAgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZvcHRpbWl6ZS1zaWJsaW5nLWNhbGxzCi0KLSQodm9ianMpOiBLQlVJTERfQ0ZMQUdTICs9ICQoQ0ZMKQotCi0jCi0jIHZEU08gY29kZSBydW5zIGluIHVzZXJzcGFjZSBhbmQgLXBnIGRvZXNuJ3QgaGVscCB3aXRoIHByb2ZpbGluZyBhbnl3YXkuCi0jCi1DRkxBR1NfUkVNT1ZFX3Zkc28tbm90ZS5vID0gLXBnCi1DRkxBR1NfUkVNT1ZFX3VtX3Zkc28ubyA9IC1wZwotCi10YXJnZXRzICs9IHZkc28tc3ltcy5sZHMKLW9iai0kKFZEU082NC15KQkJCSs9IHZkc28tc3ltcy5sZHMKLQotIwotIyBNYXRjaCBzeW1ib2xzIGluIHRoZSBEU08gdGhhdCBsb29rIGxpa2UgVkRTTyo7IHByb2R1Y2UgYSBmaWxlIG9mIGNvbnN0YW50cy4KLSMKLXNlZC12ZHNvc3ltIDo9IC1lICdzL14wMCovMC8nIFwKLQktZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoVkRTT1thLXpBLVowLTlfXSpcKSQkL1wyID0gMHhcMTsvcCcKLXF1aWV0X2NtZF92ZHNvc3ltID0gVkRTT1NZTSAkQAotZGVmaW5lIGNtZF92ZHNvc3ltCi0JJChOTSkgJDwgfCBMQ19BTEw9QyBzZWQgLW4gJChzZWQtdmRzb3N5bSkgfCBMQ19BTEw9QyBzb3J0ID4gJEAKLWVuZGVmCi0KLSQob2JqKS8lLXN5bXMubGRzOiAkKG9iaikvJS5zby5kYmcgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvc3ltKQotCi0jCi0jIFRoZSBEU08gaW1hZ2VzIGFyZSBidWlsdCB1c2luZyBhIHNwZWNpYWwgbGlua2VyIHNjcmlwdC4KLSMKLXF1aWV0X2NtZF92ZHNvID0gVkRTTyAgICAkQAotICAgICAgY21kX3Zkc28gPSAkKENDKSAtbm9zdGRsaWIgLW8gJEAgXAotCQkgICAgICAgJChWRFNPX0xERkxBR1MpICQoVkRTT19MREZMQUdTXyQoZmlsdGVyICUubGRzLCQoXkYpKSkgXAotCQkgICAgICAgLVdsLC1ULCQoZmlsdGVyICUubGRzLCReKSAkKGZpbHRlciAlLm8sJF4pICYmIFwKLQkJIHNoICQoc3JjdHJlZSkvJChzcmMpL2NoZWNrdW5kZWYuc2ggJyQoTk0pJyAnJEAnCi0KLVZEU09fTERGTEFHUyA9IC1mUElDIC1zaGFyZWQgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1zeXN2KQotR0NPVl9QUk9GSUxFIDo9IG4KLQotIwotIyBJbnN0YWxsIHRoZSB1bnN0cmlwcGVkIGNvcHkgb2YgdmRzbyouc28gbGlzdGVkIGluICQodmRzby1pbnN0YWxsLXkpLgotIwotcXVpZXRfY21kX3Zkc29faW5zdGFsbCA9IElOU1RBTEwgJEAKLSAgICAgIGNtZF92ZHNvX2luc3RhbGwgPSBjcCAkKG9iaikvJEAuZGJnICQoTU9ETElCKS92ZHNvLyRACi0kKHZkc28taW5zdGFsbC15KTogJS5zbzogJChvYmopLyUuc28uZGJnIEZPUkNFCi0JQG1rZGlyIC1wICQoTU9ETElCKS92ZHNvCi0JJChjYWxsIGNtZCx2ZHNvX2luc3RhbGwpCi0KLVBIT05ZICs9IHZkc29faW5zdGFsbCAkKHZkc28taW5zdGFsbC15KQotdmRzb19pbnN0YWxsOiAkKHZkc28taW5zdGFsbC15KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5TIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzgyYzE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28uUworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLV9fSU5JVERBVEEKLQotCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAotdmRzb19zdGFydDoKLQkuaW5jYmluICJhcmNoL3VtL3N5cy14ODZfNjQvdmRzby92ZHNvLnNvIgotdmRzb19lbmQ6Ci0KLV9fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3ZtYS5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OTVjOGQuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdm1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2hhcmQgV2VpbmJlcmdlciA8cmljaHJkQG5vZC5hdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi11bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSB2ZHNvX2VuYWJsZWQgPSAxOwotdW5zaWduZWQgbG9uZyB1bV92ZHNvX2FkZHI7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKLWV4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKLQotc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb3A7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzbyh2b2lkKQotewotCXN0cnVjdCBwYWdlICp1bV92ZHNvOwotCi0JQlVHX09OKHZkc29fZW5kIC0gdmRzb19zdGFydCA+IFBBR0VfU0laRSk7Ci0KLQl1bV92ZHNvX2FkZHIgPSB0YXNrX3NpemUgLSBQQUdFX1NJWkU7Ci0KLQl2ZHNvcCA9IGttYWxsb2MoR0ZQX0tFUk5FTCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKLQlpZiAoIXZkc29wKQotCQlnb3RvIG9vbTsKLQotCXVtX3Zkc28gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCWlmICghdW1fdmRzbykgewotCQlrZnJlZSh2ZHNvcCk7Ci0KLQkJZ290byBvb207Ci0JfQotCi0JY29weV9wYWdlKHBhZ2VfYWRkcmVzcyh1bV92ZHNvKSwgdmRzb19zdGFydCk7Ci0JKnZkc29wID0gdW1fdmRzbzsKLQotCXJldHVybiAwOwotCi1vb206Ci0JcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgdmRzb1xuIik7Ci0JdmRzb19lbmFibGVkID0gMDsKLQotCXJldHVybiAtRU5PTUVNOwotfQotc3Vic3lzX2luaXRjYWxsKGluaXRfdmRzbyk7Ci0KLWludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IHVzZXNfaW50ZXJwKQotewotCWludCBlcnI7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQotCWlmICghdmRzb19lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KLQllcnIgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgdW1fdmRzb19hZGRyLCBQQUdFX1NJWkUsCi0JCVZNX1JFQUR8Vk1fRVhFQ3wKLQkJVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDfAotCQlWTV9BTFdBWVNEVU1QLAotCQl2ZHNvcCk7Ci0KLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMgYi9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMKaW5kZXggMmQzZTcxMS4uM2IzNzljZCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvdW5pY29yZTMyL21tL2luaXQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGY0OTc2NzcuLmNiOWExMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMTk0LDkgKzE5NCw2IEBACiBjb25maWcgTkVFRF9QRVJfQ1BVX1BBR0VfRklSU1RfQ0hVTksKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBIQVZFX0NQVU1BU0tfT0ZfQ1BVX01BUAotCWRlZl9ib29sIFg4Nl82NF9TTVAKLQogY29uZmlnIEFSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEUKIAlkZWZfYm9vbCB5CiAKQEAgLTE0NTQsNiArMTQ1MSwxNSBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl9QQVQKIAorY29uZmlnIEFSQ0hfUkFORE9NCisJZGVmX2Jvb2wgeQorCXByb21wdCAieDg2IGFyY2hpdGVjdHVyYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiIGlmIEVYUEVSVAorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGUgeDg2IGFyY2hpdGVjdHVyYWwgUkRSQU5EIGluc3RydWN0aW9uCisJICAoSW50ZWwgQnVsbCBNb3VudGFpbiB0ZWNobm9sb2d5KSB0byBnZW5lcmF0ZSByYW5kb20gbnVtYmVycy4KKwkgIElmIHN1cHBvcnRlZCwgdGhpcyBpcyBhIGhpZ2ggYmFuZHdpZHRoLCBjcnlwdG9ncmFwaGljYWxseQorCSAgc2VjdXJlIGhhcmR3YXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorCiBjb25maWcgRUZJCiAJYm9vbCAiRUZJIHJ1bnRpbWUgc2VydmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQUNQSQpAQCAtMjA2Niw2ICsyMDcyLDIwIEBACiAJICAgLSBBQyBhZGFwdGVyIHN0YXR1cyB1cGRhdGVzCiAJICAgLSBCYXR0ZXJ5IHN0YXR1cyB1cGRhdGVzCiAKK2NvbmZpZyBBTElYCisJYm9vbCAiUENFbmdpbmVzIEFMSVggU3lzdGVtIFN1cHBvcnQgKExFRCBzZXR1cCkiCisJc2VsZWN0IEdQSU9MSUIKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN5c3RlbSBzdXBwb3J0IGZvciB0aGUgUENFbmdpbmVzIEFMSVguCisJICBBdCBwcmVzZW50IHRoaXMganVzdCBzZXRzIHVwIExFRHMgZm9yIEdQSU8gY29udHJvbCBvbgorCSAgQUxJWDIvMy82IGJvYXJkcy4gIEhvd2V2ZXIsIG90aGVyIHN5c3RlbSBzcGVjaWZpYyBzZXR1cCBzaG91bGQKKwkgIGdldCBhZGRlZCBoZXJlLgorCisJICBOb3RlOiBZb3UgbXVzdCBzdGlsbCBlbmFibGUgdGhlIGRyaXZlcnMgZm9yIEdQSU8gYW5kIExFRCBzdXBwb3J0CisJICAoR1BJT19DUzU1MzUgJiBMRURTX0dQSU8pIHRvIGFjdHVhbGx5IHVzZSB0aGUgTEVEcworCisJICBOb3RlOiBZb3UgaGF2ZSB0byBzZXQgYWxpeC5mb3JjZT0xIGZvciBib2FyZHMgd2l0aCBBd2FyZCBCSU9TLgorCiBlbmRpZiAjIFg4Nl8zMgogCiBjb25maWcgQU1EX05CCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZS51bSBiL2FyY2gveDg2L01ha2VmaWxlLnVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGRlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9NYWtlZmlsZS51bQpAQCAtMCwwICsxLDYxIEBACitjb3JlLXkgKz0gYXJjaC94ODYvY3J5cHRvLworCitpZmVxICgkKENPTkZJR19YODZfMzIpLHkpCitTVEFSVCA6PSAweDgwNDgwMDAKKworTERGTEFHUwkJCSs9IC1tIGVsZl9pMzg2CitFTEZfQVJDSAkJOj0gaTM4NgorRUxGX0ZPUk1BVCAJCTo9IGVsZjMyLWkzODYKK0NIRUNLRkxBR1MJKz0gLURfX2kzODZfXworCitpZmVxICgiJChvcmlnaW4gU1VCQVJDSCkiLCAiY29tbWFuZCBsaW5lIikKK2lmbmVxICgiJChzaGVsbCB1bmFtZSAtbSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8pIiwgIiQoU1VCQVJDSCkiKQorS0JVSUxEX0NGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorS0JVSUxEX0FGTEFHUwkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorTElOSy15CQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTMyKQorCitleHBvcnQgTERGTEFHUworZW5kaWYKK2VuZGlmCisKKyMgRmlyc3Qgb2YgYWxsLCB0dW5lIENGTEFHUyBmb3IgdGhlIHNwZWNpZmljIENQVS4gVGhpcyBhY3R1YWxseSBzZXRzIGNmbGFncy15LgoraW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQorCisjIHByZXZlbnQgZ2NjIGZyb20ga2VlcGluZyB0aGUgc3RhY2sgMTYgYnl0ZSBhbGlnbmVkLiBUYWtlbiBmcm9tIGkzODYuCitjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCisKKyMgUHJldmVudCBzcHJpbnRmIGluIG5mc2QgZnJvbSBiZWluZyBjb252ZXJ0ZWQgdG8gc3RyY3B5IGFuZCByZXN1bHRpbmcgaW4KKyMgYW4gdW5yZXNvbHZlZCByZWZlcmVuY2UuCitjZmxhZ3MteSArPSAtZmZyZWVzdGFuZGluZworCisjIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSBvbiBwcmUtZ2NjLTQuMCBjb21waWxlcnMsIGl0IG1ha2VzIGdjYyB1c2UKKyMgYSBsb3QgbW9yZSBzdGFjayBkdWUgdG8gdGhlIGxhY2sgb2Ygc2hhcmluZyBvZiBzdGFja2xvdHMuICBBbHNvLCBnY2MKKyMgNC4zLjAgbmVlZHMgLWZ1bml0LWF0LWEtdGltZSBmb3IgZXh0ZXJuIGlubGluZSBmdW5jdGlvbnMuCitLQlVJTERfQ0ZMQUdTICs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gXAorCQkJZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBcCisJCQllbHNlIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKTsgZmkgOykKKworS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQorCitlbHNlCisKK1NUQVJUIDo9IDB4NjAwMDAwMDAKKworS0JVSUxEX0NGTEFHUyArPSAtZm5vLWJ1aWx0aW4gLW02NCAKKworQ0hFQ0tGTEFHUyAgKz0gLW02NCAtRF9feDg2XzY0X18KK0tCVUlMRF9BRkxBR1MgKz0gLW02NAorTERGTEFHUyArPSAtbSBlbGZfeDg2XzY0CitLQlVJTERfQ1BQRkxBR1MgKz0gLW02NAorCitFTEZfQVJDSCA6PSBpMzg2Ong4Ni02NAorRUxGX0ZPUk1BVCA6PSBlbGY2NC14ODYtNjQKKworIyBOb3Qgb24gYWxsIDY0LWJpdCBkaXN0cm9zIC9saWIgaXMgYSBzeW1saW5rIHRvIC9saWI2NC4gUExEIGlzIGFuIGV4YW1wbGUuCisKK0xJTkstJChDT05GSUdfTERfU0NSSVBUX0RZTikgKz0gLVdsLC1ycGF0aCwvbGliNjQKK0xJTksteSArPSAtbTY0CisKKyMgRG8gdW5pdC1hdC1hLXRpbWUgdW5jb25kaXRpb25hbGx5IG9uIHg4Nl82NCwgZm9sbG93aW5nIHRoZSBob3N0CitLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bml0LWF0LWEtdGltZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL3g4Ni9jcnlwdG8vTWFrZWZpbGUKaW5kZXggYzA0ZjFiNy4uMzUzN2Q0YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2NyeXB0by9NYWtlZmlsZQpAQCAtNywyMSArNywzMyBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19TQUxTQTIwXzU4NikgKz0gc2Fsc2EyMC1pNTg2Lm8KIAogb2JqLSQoQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0KSArPSBhZXMteDg2XzY0Lm8KK29iai0kKENPTkZJR19DUllQVE9fQkxPV0ZJU0hfWDg2XzY0KSArPSBibG93ZmlzaC14ODZfNjQubwogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NCkgKz0gdHdvZmlzaC14ODZfNjQubworb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NF8zV0FZKSArPSB0d29maXNoLXg4Nl82NC0zd2F5Lm8KIG9iai0kKENPTkZJR19DUllQVE9fU0FMU0EyMF9YODZfNjQpICs9IHNhbHNhMjAteDg2XzY0Lm8KIG9iai0kKENPTkZJR19DUllQVE9fQUVTX05JX0lOVEVMKSArPSBhZXNuaS1pbnRlbC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0dIQVNIX0NMTVVMX05JX0lOVEVMKSArPSBnaGFzaC1jbG11bG5pLWludGVsLm8KIAogb2JqLSQoQ09ORklHX0NSWVBUT19DUkMzMkNfSU5URUwpICs9IGNyYzMyYy1pbnRlbC5vCitvYmotJChDT05GSUdfQ1JZUFRPX1NIQTFfU1NTRTMpICs9IHNoYTEtc3NzZTMubwogCiBhZXMtaTU4Ni15IDo9IGFlcy1pNTg2LWFzbV8zMi5vIGFlc19nbHVlLm8KIHR3b2Zpc2gtaTU4Ni15IDo9IHR3b2Zpc2gtaTU4Ni1hc21fMzIubyB0d29maXNoX2dsdWUubwogc2Fsc2EyMC1pNTg2LXkgOj0gc2Fsc2EyMC1pNTg2LWFzbV8zMi5vIHNhbHNhMjBfZ2x1ZS5vCiAKIGFlcy14ODZfNjQteSA6PSBhZXMteDg2XzY0LWFzbV82NC5vIGFlc19nbHVlLm8KK2Jsb3dmaXNoLXg4Nl82NC15IDo9IGJsb3dmaXNoLXg4Nl82NC1hc21fNjQubyBibG93ZmlzaF9nbHVlLm8KIHR3b2Zpc2gteDg2XzY0LXkgOj0gdHdvZmlzaC14ODZfNjQtYXNtXzY0Lm8gdHdvZmlzaF9nbHVlLm8KK3R3b2Zpc2gteDg2XzY0LTN3YXkteSA6PSB0d29maXNoLXg4Nl82NC1hc21fNjQtM3dheS5vIHR3b2Zpc2hfZ2x1ZV8zd2F5Lm8KIHNhbHNhMjAteDg2XzY0LXkgOj0gc2Fsc2EyMC14ODZfNjQtYXNtXzY0Lm8gc2Fsc2EyMF9nbHVlLm8KIAogYWVzbmktaW50ZWwteSA6PSBhZXNuaS1pbnRlbF9hc20ubyBhZXNuaS1pbnRlbF9nbHVlLm8gZnB1Lm8KIAogZ2hhc2gtY2xtdWxuaS1pbnRlbC15IDo9IGdoYXNoLWNsbXVsbmktaW50ZWxfYXNtLm8gZ2hhc2gtY2xtdWxuaS1pbnRlbF9nbHVlLm8KKworIyBlbmFibGUgQVZYIHN1cHBvcnQgb25seSB3aGVuICQoQVMpIGNhbiBhY3R1YWxseSBhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb25zCitpZmVxICgkKGNhbGwgYXMtaW5zdHIsdnB4b3IgJXhtbTAkKGNvbW1hKSV4bW0xJChjb21tYSkleG1tMix5ZXMsbm8pLHllcykKK0FGTEFHU19zaGExX3Nzc2UzX2FzbS5vICs9IC1EU0hBMV9FTkFCTEVfQVZYX1NVUFBPUlQKK0NGTEFHU19zaGExX3Nzc2UzX2dsdWUubyArPSAtRFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCitlbmRpZgorc2hhMS1zc3NlMy15IDo9IHNoYTFfc3NzZTNfYXNtLm8gc2hhMV9zc3NlM19nbHVlLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9hZXNfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKaW5kZXggNDlhZTlmZS4uOGVmY2Y0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Flc19nbHVlLmMKQEAgLTMsNyArMyw5IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8YXNtL2Flcy5oPgogCiBhc21saW5rYWdlIHZvaWQgYWVzX2VuY19ibGsoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7CiBhc21saW5rYWdlIHZvaWQgYWVzX2RlY19ibGsoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYwppbmRleCBmZWVlOGZmLi41NDVkMGNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoLXg4Nl82NC1hc21fNjQuUyBiL2FyY2gveDg2L2NyeXB0by9ibG93ZmlzaC14ODZfNjQtYXNtXzY0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZDI0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2NyeXB0by9ibG93ZmlzaC14ODZfNjQtYXNtXzY0LlMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtICh4ODZfNjQpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworLmZpbGUgImJsb3dmaXNoLXg4Nl82NC1hc20uUyIKKy50ZXh0CisKKy8qIHN0cnVjdHVyZSBvZiBjcnlwdG8gY29udGV4dCAqLworI2RlZmluZSBwCTAKKyNkZWZpbmUgczAJKCgxNiArIDIpICogNCkKKyNkZWZpbmUgczEJKCgxNiArIDIgKyAoMSAqIDI1NikpICogNCkKKyNkZWZpbmUgczIJKCgxNiArIDIgKyAoMiAqIDI1NikpICogNCkKKyNkZWZpbmUgczMJKCgxNiArIDIgKyAoMyAqIDI1NikpICogNCkKKworLyogcmVnaXN0ZXIgbWFjcm9zICovCisjZGVmaW5lIENUWCAlcmRpCisjZGVmaW5lIFJJTyAlcnNpCisKKyNkZWZpbmUgUlgwICVyYXgKKyNkZWZpbmUgUlgxICVyYngKKyNkZWZpbmUgUlgyICVyY3gKKyNkZWZpbmUgUlgzICVyZHgKKworI2RlZmluZSBSWDBkICVlYXgKKyNkZWZpbmUgUlgxZCAlZWJ4CisjZGVmaW5lIFJYMmQgJWVjeAorI2RlZmluZSBSWDNkICVlZHgKKworI2RlZmluZSBSWDBibCAlYWwKKyNkZWZpbmUgUlgxYmwgJWJsCisjZGVmaW5lIFJYMmJsICVjbAorI2RlZmluZSBSWDNibCAlZGwKKworI2RlZmluZSBSWDBiaCAlYWgKKyNkZWZpbmUgUlgxYmggJWJoCisjZGVmaW5lIFJYMmJoICVjaAorI2RlZmluZSBSWDNiaCAlZGgKKworI2RlZmluZSBSVDAgJXJicAorI2RlZmluZSBSVDEgJXJzaQorI2RlZmluZSBSVDIgJXI4CisjZGVmaW5lIFJUMyAlcjkKKworI2RlZmluZSBSVDBkICVlYnAKKyNkZWZpbmUgUlQxZCAlZXNpCisjZGVmaW5lIFJUMmQgJXI4ZAorI2RlZmluZSBSVDNkICVyOWQKKworI2RlZmluZSBSS0VZICVyMTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAxLXdheSBibG93ZmlzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGKCkgXAorCXJvcnEgJDE2LAkJUlgwOyBcCisJbW92emJsIFJYMGJoLAkJUlQwZDsgXAorCW1vdnpibCBSWDBibCwJCVJUMWQ7IFwKKwlyb2xxICQxNiwJCVJYMDsgXAorCW1vdmwgczAoQ1RYLFJUMCw0KSwJUlQwZDsgXAorCWFkZGwgczEoQ1RYLFJUMSw0KSwJUlQwZDsgXAorCW1vdnpibCBSWDBiaCwJCVJUMWQ7IFwKKwltb3Z6YmwgUlgwYmwsCQlSVDJkOyBcCisJcm9scSAkMzIsCQlSWDA7IFwKKwl4b3JsIHMyKENUWCxSVDEsNCksCVJUMGQ7IFwKKwlhZGRsIHMzKENUWCxSVDIsNCksCVJUMGQ7IFwKKwl4b3JxIFJUMCwJCVJYMDsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZW5jKG4pIFwKKwl4b3JxIHArNCoobikoQ1RYKSwgCVJYMDsKKworI2RlZmluZSByb3VuZF9lbmMobikgXAorCWFkZF9yb3VuZGtleV9lbmMobik7IFwKKwlcCisJRigpOyBcCisJRigpOworCisjZGVmaW5lIGFkZF9yb3VuZGtleV9kZWMobikgXAorCW1vdnEgcCs0KihuLTEpKENUWCksCVJUMDsgXAorCXJvcnEgJDMyLAkJUlQwOyBcCisJeG9ycSBSVDAsCQlSWDA7CisKKyNkZWZpbmUgcm91bmRfZGVjKG4pIFwKKwlhZGRfcm91bmRrZXlfZGVjKG4pOyBcCisJXAorCUYoKTsgXAorCUYoKTsgXAorCisjZGVmaW5lIHJlYWRfYmxvY2soKSBcCisJbW92cSAoUklPKSwgCQlSWDA7IFwKKwlyb3JxICQzMiwgCQlSWDA7IFwKKwlic3dhcHEgCQkJUlgwOworCisjZGVmaW5lIHdyaXRlX2Jsb2NrKCkgXAorCWJzd2FwcSAJCQlSWDA7IFwKKwltb3ZxIFJYMCwgCQkoUklPKTsKKworI2RlZmluZSB4b3JfYmxvY2soKSBcCisJYnN3YXBxIAkJCVJYMDsgXAorCXhvcnEgUlgwLCAJCShSSU8pOworCisuYWxpZ24gOAorLmdsb2JhbCBfX2Jsb3dmaXNoX2VuY19ibGsKKy50eXBlICAgX19ibG93ZmlzaF9lbmNfYmxrLEBmdW5jdGlvbjsKKworX19ibG93ZmlzaF9lbmNfYmxrOgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjCisJICoJJXJjeDogYm9vbCwgaWYgdHJ1ZTogeG9yIG91dHB1dAorCSAqLworCW1vdnEgJXJicCwgJXIxMTsKKworCW1vdnEgJXJzaSwgJXIxMDsKKwltb3ZxICVyZHgsIFJJTzsKKworCXJlYWRfYmxvY2soKTsKKworCXJvdW5kX2VuYygwKTsKKwlyb3VuZF9lbmMoMik7CisJcm91bmRfZW5jKDQpOworCXJvdW5kX2VuYyg2KTsKKwlyb3VuZF9lbmMoOCk7CisJcm91bmRfZW5jKDEwKTsKKwlyb3VuZF9lbmMoMTIpOworCXJvdW5kX2VuYygxNCk7CisJYWRkX3JvdW5ka2V5X2VuYygxNik7CisKKwltb3ZxICVyMTEsICVyYnA7CisKKwltb3ZxICVyMTAsIFJJTzsKKwl0ZXN0ICVjbCwgJWNsOworCWpueiBfX2VuY194b3I7CisKKwl3cml0ZV9ibG9jaygpOworCXJldDsKK19fZW5jX3hvcjoKKwl4b3JfYmxvY2soKTsKKwlyZXQ7CisKKy5hbGlnbiA4CisuZ2xvYmFsIGJsb3dmaXNoX2RlY19ibGsKKy50eXBlICAgYmxvd2Zpc2hfZGVjX2JsayxAZnVuY3Rpb247CisKK2Jsb3dmaXNoX2RlY19ibGs6CisJLyogaW5wdXQ6CisJICoJJXJkaTogY3R4LCBDVFgKKwkgKgklcnNpOiBkc3QKKwkgKgklcmR4OiBzcmMKKwkgKi8KKwltb3ZxICVyYnAsICVyMTE7CisKKwltb3ZxICVyc2ksICVyMTA7CisJbW92cSAlcmR4LCBSSU87CisKKwlyZWFkX2Jsb2NrKCk7CisKKwlyb3VuZF9kZWMoMTcpOworCXJvdW5kX2RlYygxNSk7CisJcm91bmRfZGVjKDEzKTsKKwlyb3VuZF9kZWMoMTEpOworCXJvdW5kX2RlYyg5KTsKKwlyb3VuZF9kZWMoNyk7CisJcm91bmRfZGVjKDUpOworCXJvdW5kX2RlYygzKTsKKwlhZGRfcm91bmRrZXlfZGVjKDEpOworCisJbW92cSAlcjEwLCBSSU87CisJd3JpdGVfYmxvY2soKTsKKworCW1vdnEgJXIxMSwgJXJicDsKKworCXJldDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgNC13YXkgYmxvd2Zpc2gsIGZvdXIgYmxvY2tzIHBhcmFsbGVsCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRigpIGZvciA0LXdheS4gU2xvd2VyIHdoZW4gdXNlZCBhbG9uZS8xLXdheSwgYnV0IGZhc3RlciB3aGVuIHVzZWQKKyAqIHBhcmFsbGVsLzQtd2F5ICh0ZXN0ZWQgb24gQU1EIFBoZW5vbSBJSSAmIEludGVsIFhlb24gRTczMzApLgorICovCisjZGVmaW5lIEY0KHgpIFwKKwltb3Z6YmwgeCAjIyBiaCwJCVJUMWQ7IFwKKwltb3Z6YmwgeCAjIyBibCwJCVJUM2Q7IFwKKwlyb3JxICQxNiwJCXg7IFwKKwltb3Z6YmwgeCAjIyBiaCwJCVJUMGQ7IFwKKwltb3Z6YmwgeCAjIyBibCwJCVJUMmQ7IFwKKwlyb3JxICQxNiwJCXg7IFwKKwltb3ZsIHMwKENUWCxSVDAsNCksCVJUMGQ7IFwKKwlhZGRsIHMxKENUWCxSVDIsNCksCVJUMGQ7IFwKKwl4b3JsIHMyKENUWCxSVDEsNCksCVJUMGQ7IFwKKwlhZGRsIHMzKENUWCxSVDMsNCksCVJUMGQ7IFwKKwl4b3JxIFJUMCwJCXg7CisKKyNkZWZpbmUgYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKSBcCisJeG9ycSBSS0VZLAkJUlgwOyBcCisJeG9ycSBSS0VZLAkJUlgxOyBcCisJeG9ycSBSS0VZLAkJUlgyOyBcCisJeG9ycSBSS0VZLAkJUlgzOworCisjZGVmaW5lIHByZWxvYWRfcm91bmRrZXlfZW5jKG4pIFwKKwltb3ZxIHArNCoobikoQ1RYKSwJUktFWTsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZW5jNChuKSBcCisJYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKTsgXAorCXByZWxvYWRfcm91bmRrZXlfZW5jKG4gKyAyKTsKKworI2RlZmluZSByb3VuZF9lbmM0KG4pIFwKKwlhZGRfcm91bmRrZXlfZW5jNChuKTsgXAorCVwKKwlGNChSWDApOyBcCisJRjQoUlgxKTsgXAorCUY0KFJYMik7IFwKKwlGNChSWDMpOyBcCisJXAorCUY0KFJYMCk7IFwKKwlGNChSWDEpOyBcCisJRjQoUlgyKTsgXAorCUY0KFJYMyk7CisKKyNkZWZpbmUgcHJlbG9hZF9yb3VuZGtleV9kZWMobikgXAorCW1vdnEgcCs0KigobiktMSkoQ1RYKSwJUktFWTsgXAorCXJvcnEgJDMyLAkJUktFWTsKKworI2RlZmluZSBhZGRfcm91bmRrZXlfZGVjNChuKSBcCisJYWRkX3ByZWxvYWRlZF9yb3VuZGtleTQoKTsgXAorCXByZWxvYWRfcm91bmRrZXlfZGVjKG4gLSAyKTsKKworI2RlZmluZSByb3VuZF9kZWM0KG4pIFwKKwlhZGRfcm91bmRrZXlfZGVjNChuKTsgXAorCVwKKwlGNChSWDApOyBcCisJRjQoUlgxKTsgXAorCUY0KFJYMik7IFwKKwlGNChSWDMpOyBcCisJXAorCUY0KFJYMCk7IFwKKwlGNChSWDEpOyBcCisJRjQoUlgyKTsgXAorCUY0KFJYMyk7CisKKyNkZWZpbmUgcmVhZF9ibG9jazQoKSBcCisJbW92cSAoUklPKSwJCVJYMDsgXAorCXJvcnEgJDMyLAkJUlgwOyBcCisJYnN3YXBxIAkJCVJYMDsgXAorCVwKKwltb3ZxIDgoUklPKSwJCVJYMTsgXAorCXJvcnEgJDMyLAkJUlgxOyBcCisJYnN3YXBxIAkJCVJYMTsgXAorCVwKKwltb3ZxIDE2KFJJTyksCQlSWDI7IFwKKwlyb3JxICQzMiwJCVJYMjsgXAorCWJzd2FwcSAJCQlSWDI7IFwKKwlcCisJbW92cSAyNChSSU8pLAkJUlgzOyBcCisJcm9ycSAkMzIsCQlSWDM7IFwKKwlic3dhcHEgCQkJUlgzOworCisjZGVmaW5lIHdyaXRlX2Jsb2NrNCgpIFwKKwlic3dhcHEgCQkJUlgwOyBcCisJbW92cSBSWDAsCQkoUklPKTsgXAorCVwKKwlic3dhcHEgCQkJUlgxOyBcCisJbW92cSBSWDEsCQk4KFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMjsgXAorCW1vdnEgUlgyLAkJMTYoUklPKTsgXAorCVwKKwlic3dhcHEgCQkJUlgzOyBcCisJbW92cSBSWDMsCQkyNChSSU8pOworCisjZGVmaW5lIHhvcl9ibG9jazQoKSBcCisJYnN3YXBxIAkJCVJYMDsgXAorCXhvcnEgUlgwLAkJKFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMTsgXAorCXhvcnEgUlgxLAkJOChSSU8pOyBcCisJXAorCWJzd2FwcSAJCQlSWDI7IFwKKwl4b3JxIFJYMiwJCTE2KFJJTyk7IFwKKwlcCisJYnN3YXBxIAkJCVJYMzsgXAorCXhvcnEgUlgzLAkJMjQoUklPKTsKKworLmFsaWduIDgKKy5nbG9iYWwgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkKKy50eXBlICAgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXksQGZ1bmN0aW9uOworCitfX2Jsb3dmaXNoX2VuY19ibGtfNHdheToKKwkvKiBpbnB1dDoKKwkgKgklcmRpOiBjdHgsIENUWAorCSAqCSVyc2k6IGRzdAorCSAqCSVyZHg6IHNyYworCSAqCSVyY3g6IGJvb2wsIGlmIHRydWU6IHhvciBvdXRwdXQKKwkgKi8KKwlwdXNocSAlcmJwOworCXB1c2hxICVyYng7CisJcHVzaHEgJXJjeDsKKworCXByZWxvYWRfcm91bmRrZXlfZW5jKDApOworCisJbW92cSAlcnNpLCAlcjExOworCW1vdnEgJXJkeCwgUklPOworCisJcmVhZF9ibG9jazQoKTsKKworCXJvdW5kX2VuYzQoMCk7CisJcm91bmRfZW5jNCgyKTsKKwlyb3VuZF9lbmM0KDQpOworCXJvdW5kX2VuYzQoNik7CisJcm91bmRfZW5jNCg4KTsKKwlyb3VuZF9lbmM0KDEwKTsKKwlyb3VuZF9lbmM0KDEyKTsKKwlyb3VuZF9lbmM0KDE0KTsKKwlhZGRfcHJlbG9hZGVkX3JvdW5ka2V5NCgpOworCisJcG9wcSAlcmJwOworCW1vdnEgJXIxMSwgUklPOworCisJdGVzdCAlYnBsLCAlYnBsOworCWpueiBfX2VuY194b3I0OworCisJd3JpdGVfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXJldDsKKworX19lbmNfeG9yNDoKKwl4b3JfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXJldDsKKworLmFsaWduIDgKKy5nbG9iYWwgYmxvd2Zpc2hfZGVjX2Jsa180d2F5CisudHlwZSAgIGJsb3dmaXNoX2RlY19ibGtfNHdheSxAZnVuY3Rpb247CisKK2Jsb3dmaXNoX2RlY19ibGtfNHdheToKKwkvKiBpbnB1dDoKKwkgKgklcmRpOiBjdHgsIENUWAorCSAqCSVyc2k6IGRzdAorCSAqCSVyZHg6IHNyYworCSAqLworCXB1c2hxICVyYnA7CisJcHVzaHEgJXJieDsKKwlwcmVsb2FkX3JvdW5ka2V5X2RlYygxNyk7CisKKwltb3ZxICVyc2ksICVyMTE7CisJbW92cSAlcmR4LCBSSU87CisKKwlyZWFkX2Jsb2NrNCgpOworCisJcm91bmRfZGVjNCgxNyk7CisJcm91bmRfZGVjNCgxNSk7CisJcm91bmRfZGVjNCgxMyk7CisJcm91bmRfZGVjNCgxMSk7CisJcm91bmRfZGVjNCg5KTsKKwlyb3VuZF9kZWM0KDcpOworCXJvdW5kX2RlYzQoNSk7CisJcm91bmRfZGVjNCgzKTsKKwlhZGRfcHJlbG9hZGVkX3JvdW5ka2V5NCgpOworCisJbW92cSAlcjExLCBSSU87CisJd3JpdGVfYmxvY2s0KCk7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCisJcmV0OworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vYmxvd2Zpc2hfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoX2dsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDVhYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Jsb3dmaXNoX2dsdWUuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIEdsdWUgQ29kZSBmb3IgYXNzZW1ibGVyIG9wdGltaXplZCB2ZXJzaW9uIG9mIEJsb3dmaXNoCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIENCQyAmIEVDQiBwYXJ0cyBiYXNlZCBvbiBjb2RlIChjcnlwdG8vY2JjLmMsZWNiLmMpIGJ5OgorICogICBDb3B5cmlnaHQgKGMpIDIwMDYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ1RSIHBhcnQgYmFzZWQgb24gY29kZSAoY3J5cHRvL2N0ci5jKSBieToKKyAqICAgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNyAtIEpveSBMYXR0ZW4gPGxhdHRlbkB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9ibG93ZmlzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKworLyogcmVndWxhciBibG9jayBjaXBoZXIgZnVuY3Rpb25zICovCithc21saW5rYWdlIHZvaWQgX19ibG93ZmlzaF9lbmNfYmxrKHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkgICBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgYmxvd2Zpc2hfZGVjX2JsayhzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworCisvKiA0LXdheSBwYXJhbGxlbCBjaXBoZXIgZnVuY3Rpb25zICovCithc21saW5rYWdlIHZvaWQgX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkoc3RydWN0IGJmX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQljb25zdCB1OCAqc3JjLCBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgYmxvd2Zpc2hfZGVjX2Jsa180d2F5KHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQkgICAgICBjb25zdCB1OCAqc3JjKTsKKworc3RhdGljIGlubGluZSB2b2lkIGJsb3dmaXNoX2VuY19ibGsoc3RydWN0IGJmX2N0eCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCV9fYmxvd2Zpc2hfZW5jX2JsayhjdHgsIGRzdCwgc3JjLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibG93ZmlzaF9lbmNfYmxrX3hvcihzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJCWNvbnN0IHU4ICpzcmMpCit7CisJX19ibG93ZmlzaF9lbmNfYmxrKGN0eCwgZHN0LCBzcmMsIHRydWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxvd2Zpc2hfZW5jX2Jsa180d2F5KHN0cnVjdCBiZl9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQkJIGNvbnN0IHU4ICpzcmMpCit7CisJX19ibG93ZmlzaF9lbmNfYmxrXzR3YXkoY3R4LCBkc3QsIHNyYywgZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxvd2Zpc2hfZW5jX2Jsa194b3JfNHdheShzdHJ1Y3QgYmZfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJICAgICAgY29uc3QgdTggKnNyYykKK3sKKwlfX2Jsb3dmaXNoX2VuY19ibGtfNHdheShjdHgsIGRzdCwgc3JjLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgYmxvd2Zpc2hfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWJsb3dmaXNoX2VuY19ibGsoY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOworfQorCitzdGF0aWMgdm9pZCBibG93ZmlzaF9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJYmxvd2Zpc2hfZGVjX2JsayhjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBiZl9hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJibG93ZmlzaCIsCisJLmNyYV9kcml2ZXJfbmFtZQk9CSJibG93ZmlzaC1hc20iLAorCS5jcmFfcHJpb3JpdHkJCT0JMjAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlCRl9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGJmX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMywKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYmZfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlCRl9NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQkZfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0JYmxvd2Zpc2hfc2V0a2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWJsb3dmaXNoX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JYmxvd2Zpc2hfZGVjcnlwdCwKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQgZWNiX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrLAorCQkgICAgIHZvaWQgKCpmbikoc3RydWN0IGJmX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSwKKwkJICAgICB2b2lkICgqZm5fNHdheSkoc3RydWN0IGJmX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSkKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKwlpbnQgZXJyOworCisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSkgeworCQl1OCAqd3NyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJCXU4ICp3ZHN0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKworCQkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwkJaWYgKG5ieXRlcyA+PSBic2l6ZSAqIDQpIHsKKwkJCWRvIHsKKwkJCQlmbl80d2F5KGN0eCwgd2RzdCwgd3NyYyk7CisKKwkJCQl3c3JjICs9IGJzaXplICogNDsKKwkJCQl3ZHN0ICs9IGJzaXplICogNDsKKwkJCQluYnl0ZXMgLT0gYnNpemUgKiA0OworCQkJfSB3aGlsZSAobmJ5dGVzID49IGJzaXplICogNCk7CisKKwkJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJCWRvIHsKKwkJCWZuKGN0eCwgd2RzdCwgd3NyYyk7CisKKwkJCXdzcmMgKz0gYnNpemU7CisJCQl3ZHN0ICs9IGJzaXplOworCQkJbmJ5dGVzIC09IGJzaXplOworCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCitkb25lOgorCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlY2JfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwlyZXR1cm4gZWNiX2NyeXB0KGRlc2MsICZ3YWxrLCBibG93ZmlzaF9lbmNfYmxrLCBibG93ZmlzaF9lbmNfYmxrXzR3YXkpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIGJsb3dmaXNoX2RlY19ibGssIGJsb3dmaXNoX2RlY19ibGtfNHdheSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfZWNiX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImVjYihibG93ZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiZWNiLWJsb3dmaXNoLWFzbSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSAwLAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChibGtfZWNiX2FsZy5jcmFfbGlzdCksCisJLmNyYV91ID0geworCQkuYmxrY2lwaGVyID0geworCQkJLm1pbl9rZXlzaXplCT0gQkZfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplCT0gQkZfTUFYX0tFWV9TSVpFLAorCQkJLnNldGtleQkJPSBibG93ZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGVjYl9lbmNyeXB0LAorCQkJLmRlY3J5cHQJPSBlY2JfZGVjcnlwdCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBfX2NiY19lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1NjQgKnNyYyA9ICh1NjQgKil3YWxrLT5zcmMudmlydC5hZGRyOworCXU2NCAqZHN0ID0gKHU2NCAqKXdhbGstPmRzdC52aXJ0LmFkZHI7CisJdTY0ICppdiA9ICh1NjQgKil3YWxrLT5pdjsKKworCWRvIHsKKwkJKmRzdCA9ICpzcmMgXiAqaXY7CisJCWJsb3dmaXNoX2VuY19ibGsoY3R4LCAodTggKilkc3QsICh1OCAqKWRzdCk7CisJCWl2ID0gZHN0OworCisJCXNyYyArPSAxOworCQlkc3QgKz0gMTsKKwkJbmJ5dGVzIC09IGJzaXplOworCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSk7CisKKwkqKHU2NCAqKXdhbGstPml2ID0gKml2OworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2VuY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IGJmX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBCRl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTY0ICpzcmMgPSAodTY0ICopd2Fsay0+c3JjLnZpcnQuYWRkcjsKKwl1NjQgKmRzdCA9ICh1NjQgKil3YWxrLT5kc3QudmlydC5hZGRyOworCXU2NCBpdnNbNCAtIDFdOworCXU2NCBsYXN0X2l2OworCisJLyogU3RhcnQgb2YgdGhlIGxhc3QgYmxvY2suICovCisJc3JjICs9IG5ieXRlcyAvIGJzaXplIC0gMTsKKwlkc3QgKz0gbmJ5dGVzIC8gYnNpemUgLSAxOworCisJbGFzdF9pdiA9ICpzcmM7CisKKwkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogNCkgeworCQlkbyB7CisJCQluYnl0ZXMgLT0gYnNpemUgKiA0IC0gYnNpemU7CisJCQlzcmMgLT0gNCAtIDE7CisJCQlkc3QgLT0gNCAtIDE7CisKKwkJCWl2c1swXSA9IHNyY1swXTsKKwkJCWl2c1sxXSA9IHNyY1sxXTsKKwkJCWl2c1syXSA9IHNyY1syXTsKKworCQkJYmxvd2Zpc2hfZGVjX2Jsa180d2F5KGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCQlkc3RbMV0gXj0gaXZzWzBdOworCQkJZHN0WzJdIF49IGl2c1sxXTsKKwkJCWRzdFszXSBePSBpdnNbMl07CisKKwkJCW5ieXRlcyAtPSBic2l6ZTsKKwkJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCSpkc3QgXj0gKihzcmMgLSAxKTsKKwkJCXNyYyAtPSAxOworCQkJZHN0IC09IDE7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSAqIDQpOworCisJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJZm9yICg7OykgeworCQlibG93ZmlzaF9kZWNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJYnJlYWs7CisKKwkJKmRzdCBePSAqKHNyYyAtIDEpOworCQlzcmMgLT0gMTsKKwkJZHN0IC09IDE7CisJfQorCitkb25lOgorCSpkc3QgXj0gKih1NjQgKil3YWxrLT5pdjsKKwkqKHU2NCAqKXdhbGstPml2ID0gbGFzdF9pdjsKKworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2RlY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfY2JjX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImNiYyhibG93ZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjLWJsb3dmaXNoLWFzbSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSAwLAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChibGtfY2JjX2FsZy5jcmFfbGlzdCksCisJLmNyYV91ID0geworCQkuYmxrY2lwaGVyID0geworCQkJLm1pbl9rZXlzaXplCT0gQkZfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplCT0gQkZfTUFYX0tFWV9TSVpFLAorCQkJLml2c2l6ZQkJPSBCRl9CTE9DS19TSVpFLAorCQkJLnNldGtleQkJPSBibG93ZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGNiY19lbmNyeXB0LAorCQkJLmRlY3J5cHQJPSBjYmNfZGVjcnlwdCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgY3RyX2NyeXB0X2ZpbmFsKHN0cnVjdCBiZl9jdHggKmN0eCwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQoreworCXU4ICpjdHJibGsgPSB3YWxrLT5pdjsKKwl1OCBrZXlzdHJlYW1bQkZfQkxPQ0tfU0laRV07CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKmRzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKworCWJsb3dmaXNoX2VuY19ibGsoY3R4LCBrZXlzdHJlYW0sIGN0cmJsayk7CisJY3J5cHRvX3hvcihrZXlzdHJlYW0sIHNyYywgbmJ5dGVzKTsKKwltZW1jcHkoZHN0LCBrZXlzdHJlYW0sIG5ieXRlcyk7CisKKwljcnlwdG9faW5jKGN0cmJsaywgQkZfQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jdHJfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IEJGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1NjQgKnNyYyA9ICh1NjQgKil3YWxrLT5zcmMudmlydC5hZGRyOworCXU2NCAqZHN0ID0gKHU2NCAqKXdhbGstPmRzdC52aXJ0LmFkZHI7CisJdTY0IGN0cmJsayA9IGJlNjRfdG9fY3B1KCooX19iZTY0ICopd2Fsay0+aXYpOworCV9fYmU2NCBjdHJibG9ja3NbNF07CisKKwkvKiBQcm9jZXNzIGZvdXIgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogNCkgeworCQlkbyB7CisJCQlpZiAoZHN0ICE9IHNyYykgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJCWRzdFszXSA9IHNyY1szXTsKKwkJCX0KKworCQkJLyogY3JlYXRlIGN0cmJsa3MgZm9yIHBhcmFsbGVsIGVuY3J5cHQgKi8KKwkJCWN0cmJsb2Nrc1swXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1sxXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1syXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKwkJCWN0cmJsb2Nrc1szXSA9IGNwdV90b19iZTY0KGN0cmJsaysrKTsKKworCQkJYmxvd2Zpc2hfZW5jX2Jsa194b3JfNHdheShjdHgsICh1OCAqKWRzdCwKKwkJCQkJCSAgKHU4ICopY3RyYmxvY2tzKTsKKworCQkJc3JjICs9IDQ7CisJCQlkc3QgKz0gNDsKKwkJfSB3aGlsZSAoKG5ieXRlcyAtPSBic2l6ZSAqIDQpID49IGJzaXplICogNCk7CisKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJZ290byBkb25lOworCX0KKworCS8qIEhhbmRsZSBsZWZ0b3ZlcnMgKi8KKwlkbyB7CisJCWlmIChkc3QgIT0gc3JjKQorCQkJKmRzdCA9ICpzcmM7CisKKwkJY3RyYmxvY2tzWzBdID0gY3B1X3RvX2JlNjQoY3RyYmxrKyspOworCisJCWJsb3dmaXNoX2VuY19ibGtfeG9yKGN0eCwgKHU4ICopZHN0LCAodTggKiljdHJibG9ja3MpOworCisJCXNyYyArPSAxOworCQlkc3QgKz0gMTsKKwl9IHdoaWxlICgobmJ5dGVzIC09IGJzaXplKSA+PSBic2l6ZSk7CisKK2RvbmU6CisJKihfX2JlNjQgKil3YWxrLT5pdiA9IGNwdV90b19iZTY0KGN0cmJsayk7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIGludCBjdHJfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwlpbnQgZXJyOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydF9ibG9jayhkZXNjLCAmd2FsaywgQkZfQkxPQ0tfU0laRSk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSA+PSBCRl9CTE9DS19TSVpFKSB7CisJCW5ieXRlcyA9IF9fY3RyX2NyeXB0KGRlc2MsICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlpZiAod2Fsay5uYnl0ZXMpIHsKKwkJY3RyX2NyeXB0X2ZpbmFsKGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSksICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgMCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGJsa19jdHJfYWxnID0geworCS5jcmFfbmFtZQkJPSAiY3RyKGJsb3dmaXNoKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjdHItYmxvd2Zpc2gtYXNtIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBiZl9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19jdHJfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBCRl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBCRl9NQVhfS0VZX1NJWkUsCisJCQkuaXZzaXplCQk9IEJGX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQk9IGJsb3dmaXNoX3NldGtleSwKKwkJCS5lbmNyeXB0CT0gY3RyX2NyeXB0LAorCQkJLmRlY3J5cHQJPSBjdHJfY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmZfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGJmX2VycjsKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CisJaWYgKGVycikKKwkJZ290byBlY2JfZXJyOworCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNiY19lcnI7CisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmxrX2N0cl9hbGcpOworCWlmIChlcnIpCisJCWdvdG8gY3RyX2VycjsKKworCXJldHVybiAwOworCitjdHJfZXJyOgorCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2NiY19hbGcpOworY2JjX2VycjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19lY2JfYWxnKTsKK2VjYl9lcnI6CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZiZl9hbGcpOworYmZfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY3RyX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY2JjX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZiZl9hbGcpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsb3dmaXNoIENpcGhlciBBbGdvcml0aG0sIGFzbSBvcHRpbWl6ZWQiKTsKK01PRFVMRV9BTElBUygiYmxvd2Zpc2giKTsKK01PRFVMRV9BTElBUygiYmxvd2Zpc2gtYXNtIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGExX3Nzc2UzX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzJmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19hc20uUwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIFRoaXMgaXMgYSBTSU1EIFNIQS0xIGltcGxlbWVudGF0aW9uLiBJdCByZXF1aXJlcyB0aGUgSW50ZWwoUikgU3VwcGxlbWVudGFsCisgKiBTU0UzIGluc3RydWN0aW9uIHNldCBleHRlbnNpb25zIGludHJvZHVjZWQgaW4gSW50ZWwgQ29yZSBNaWNyb2FyY2hpdGVjdHVyZQorICogcHJvY2Vzc29ycy4gQ1BVcyBzdXBwb3J0aW5nIEludGVsKFIpIEFWWCBleHRlbnNpb25zIHdpbGwgZ2V0IGFuIGFkZGl0aW9uYWwKKyAqIGJvb3N0LgorICoKKyAqIFRoaXMgd29yayB3YXMgaW5zcGlyZWQgYnkgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gb2YgRGVhbiBHYXVkZXQuCisgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGl0IGNhbiBiZSBmb3VuZCBhdDoKKyAqICAgIGh0dHA6Ly93d3cuYXJjdGljLm9yZy9+ZGVhbi9jcnlwdG8vc2hhMS5odG1sCisgKgorICogSXQgd2FzIGltcHJvdmVkIHVwb24gd2l0aCBtb3JlIGVmZmljaWVudCB2ZWN0b3JpemF0aW9uIG9mIHRoZSBtZXNzYWdlCisgKiBzY2hlZHVsaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBhbHNvIGJlZW4gb3B0aW1pemVkIGZvciBhbGwgY3VycmVudCBhbmQKKyAqIHNldmVyYWwgZnV0dXJlIGdlbmVyYXRpb25zIG9mIEludGVsIENQVXMuCisgKgorICogU2VlIHRoaXMgYXJ0aWNsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqICAgaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbXByb3ZpbmctdGhlLXBlcmZvcm1hbmNlLW9mLXRoZS1zZWN1cmUtaGFzaC1hbGdvcml0aG0tMS8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVsIENvcnAuCisgKiAgIEF1dGhvcnM6IE1heGltIExvY2t0eXVraGluIDxtYXhpbS5sb2NrdHl1a2hpbkBpbnRlbC5jb20+CisgKiAgICAgICAgICAgIFJvbmVuIFpvaGFyIDxyb25lbi56b2hhckBpbnRlbC5jb20+CisgKgorICogQ29udmVydGVkIHRvIEFUJlQgc3ludGF4IGFuZCBhZGFwdGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIExpbnV4IGtlcm5lbDoKKyAqICAgQXV0aG9yOiBNYXRoaWFzIEtyYXVzZSA8bWluaXBsaUBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgQ1RYCSVyZGkJLy8gYXJnMQorI2RlZmluZSBCVUYJJXJzaQkvLyBhcmcyCisjZGVmaW5lIENOVAklcmR4CS8vIGFyZzMKKworI2RlZmluZSBSRUdfQQklZWN4CisjZGVmaW5lIFJFR19CCSVlc2kKKyNkZWZpbmUgUkVHX0MJJWVkaQorI2RlZmluZSBSRUdfRAklZWJwCisjZGVmaW5lIFJFR19FCSVlZHgKKworI2RlZmluZSBSRUdfVDEJJWVheAorI2RlZmluZSBSRUdfVDIJJWVieAorCisjZGVmaW5lIEtfQkFTRQkJJXI4CisjZGVmaW5lIEhBU0hfUFRSCSVyOQorI2RlZmluZSBCVUZGRVJfUFRSCSVyMTAKKyNkZWZpbmUgQlVGRkVSX0VORAklcjExCisKKyNkZWZpbmUgV19UTVAxCSV4bW0wCisjZGVmaW5lIFdfVE1QMgkleG1tOQorCisjZGVmaW5lIFcwCSV4bW0xCisjZGVmaW5lIFc0CSV4bW0yCisjZGVmaW5lIFc4CSV4bW0zCisjZGVmaW5lIFcxMgkleG1tNAorI2RlZmluZSBXMTYJJXhtbTUKKyNkZWZpbmUgVzIwCSV4bW02CisjZGVmaW5lIFcyNAkleG1tNworI2RlZmluZSBXMjgJJXhtbTgKKworI2RlZmluZSBYTU1fU0hVRkJfQlNXQVAJJXhtbTEwCisKKy8qIHdlIGtlZXAgd2luZG93IG9mIDY0IHdbaV0rSyBwcmUtY2FsY3VsYXRlZCB2YWx1ZXMgaW4gYSBjaXJjdWxhciBidWZmZXIgKi8KKyNkZWZpbmUgV0sodCkJKCgodCkgJiAxNSkgKiA0KSglcnNwKQorI2RlZmluZSBXX1BSRUNBTENfQUhFQUQJMTYKKworLyoKKyAqIFRoaXMgbWFjcm8gaW1wbGVtZW50cyB0aGUgU0hBLTEgZnVuY3Rpb24ncyBib2R5IGZvciBzaW5nbGUgNjQtYnl0ZSBibG9jaworICogcGFyYW06IGZ1bmN0aW9uJ3MgbmFtZQorICovCisubWFjcm8gU0hBMV9WRUNUT1JfQVNNICBuYW1lCisJLmdsb2JhbAlcbmFtZQorCS50eXBlCVxuYW1lLCBAZnVuY3Rpb24KKwkuYWxpZ24gMzIKK1xuYW1lOgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCisJbW92CSVyc3AsICVyMTIKKwlzdWIJJDY0LCAlcnNwCQkjIGFsbG9jYXRlIHdvcmtzcGFjZQorCWFuZAkkfjE1LCAlcnNwCQkjIGFsaWduIHN0YWNrCisKKwltb3YJQ1RYLCBIQVNIX1BUUgorCW1vdglCVUYsIEJVRkZFUl9QVFIKKworCXNobAkkNiwgQ05UCQkJIyBtdWx0aXBseSBieSA2NAorCWFkZAlCVUYsIENOVAorCW1vdglDTlQsIEJVRkZFUl9FTkQKKworCWxlYQlLX1hNTV9BUiglcmlwKSwgS19CQVNFCisJeG1tX21vdglCU1dBUF9TSFVGQl9DVEwoJXJpcCksIFhNTV9TSFVGQl9CU1dBUAorCisJU0hBMV9QSVBFTElORURfTUFJTl9CT0RZCisKKwkjIGNsZWFudXAgd29ya3NwYWNlCisJbW92CSQ4LCAlZWN4CisJbW92CSVyc3AsICVyZGkKKwl4b3IJJXJheCwgJXJheAorCXJlcCBzdG9zcQorCisJbW92CSVyMTIsICVyc3AJCSMgZGVhbGxvY2F0ZSB3b3Jrc3BhY2UKKworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXJldAorCisJLnNpemUJXG5hbWUsIC4tXG5hbWUKKy5lbmRtCisKKy8qCisgKiBUaGlzIG1hY3JvIGltcGxlbWVudHMgODAgcm91bmRzIG9mIFNIQS0xIGZvciBvbmUgNjQtYnl0ZSBibG9jaworICovCisubWFjcm8gU0hBMV9QSVBFTElORURfTUFJTl9CT0RZCisJSU5JVF9SRUdBTExPQworCisJbW92CSAgKEhBU0hfUFRSKSwgQQorCW1vdgkgNChIQVNIX1BUUiksIEIKKwltb3YJIDgoSEFTSF9QVFIpLCBDCisJbW92CTEyKEhBU0hfUFRSKSwgRAorCW1vdgkxNihIQVNIX1BUUiksIEUKKworICAuc2V0IGksIDAKKyAgLnJlcHQgV19QUkVDQUxDX0FIRUFECisJV19QUkVDQUxDIGkKKyAgICAuc2V0IGksIChpKzEpCisgIC5lbmRyCisKKy5hbGlnbiA0CisxOgorCVJSIEYxLEEsQixDLEQsRSwwCisJUlIgRjEsRCxFLEEsQixDLDIKKwlSUiBGMSxCLEMsRCxFLEEsNAorCVJSIEYxLEUsQSxCLEMsRCw2CisJUlIgRjEsQyxELEUsQSxCLDgKKworCVJSIEYxLEEsQixDLEQsRSwxMAorCVJSIEYxLEQsRSxBLEIsQywxMgorCVJSIEYxLEIsQyxELEUsQSwxNAorCVJSIEYxLEUsQSxCLEMsRCwxNgorCVJSIEYxLEMsRCxFLEEsQiwxOAorCisJUlIgRjIsQSxCLEMsRCxFLDIwCisJUlIgRjIsRCxFLEEsQixDLDIyCisJUlIgRjIsQixDLEQsRSxBLDI0CisJUlIgRjIsRSxBLEIsQyxELDI2CisJUlIgRjIsQyxELEUsQSxCLDI4CisKKwlSUiBGMixBLEIsQyxELEUsMzAKKwlSUiBGMixELEUsQSxCLEMsMzIKKwlSUiBGMixCLEMsRCxFLEEsMzQKKwlSUiBGMixFLEEsQixDLEQsMzYKKwlSUiBGMixDLEQsRSxBLEIsMzgKKworCVJSIEYzLEEsQixDLEQsRSw0MAorCVJSIEYzLEQsRSxBLEIsQyw0MgorCVJSIEYzLEIsQyxELEUsQSw0NAorCVJSIEYzLEUsQSxCLEMsRCw0NgorCVJSIEYzLEMsRCxFLEEsQiw0OAorCisJUlIgRjMsQSxCLEMsRCxFLDUwCisJUlIgRjMsRCxFLEEsQixDLDUyCisJUlIgRjMsQixDLEQsRSxBLDU0CisJUlIgRjMsRSxBLEIsQyxELDU2CisJUlIgRjMsQyxELEUsQSxCLDU4CisKKwlhZGQJJDY0LCBCVUZGRVJfUFRSCQkjIG1vdmUgdG8gdGhlIG5leHQgNjQtYnl0ZSBibG9jaworCWNtcAlCVUZGRVJfRU5ELCBCVUZGRVJfUFRSCSMgaWYgdGhlIGN1cnJlbnQgaXMgdGhlIGxhc3Qgb25lIHVzZQorCWNtb3ZhZQlLX0JBU0UsIEJVRkZFUl9QVFIJIyBkdW1teSBzb3VyY2UgdG8gYXZvaWQgYnVmZmVyIG92ZXJydW4KKworCVJSIEY0LEEsQixDLEQsRSw2MAorCVJSIEY0LEQsRSxBLEIsQyw2MgorCVJSIEY0LEIsQyxELEUsQSw2NAorCVJSIEY0LEUsQSxCLEMsRCw2NgorCVJSIEY0LEMsRCxFLEEsQiw2OAorCisJUlIgRjQsQSxCLEMsRCxFLDcwCisJUlIgRjQsRCxFLEEsQixDLDcyCisJUlIgRjQsQixDLEQsRSxBLDc0CisJUlIgRjQsRSxBLEIsQyxELDc2CisJUlIgRjQsQyxELEUsQSxCLDc4CisKKwlVUERBVEVfSEFTSCAgIChIQVNIX1BUUiksIEEKKwlVUERBVEVfSEFTSCAgNChIQVNIX1BUUiksIEIKKwlVUERBVEVfSEFTSCAgOChIQVNIX1BUUiksIEMKKwlVUERBVEVfSEFTSCAxMihIQVNIX1BUUiksIEQKKwlVUERBVEVfSEFTSCAxNihIQVNIX1BUUiksIEUKKworCVJFU1RPUkVfUkVOQU1FRF9SRUdTCisJY21wCUtfQkFTRSwgQlVGRkVSX1BUUgkjIEtfQkFTRSBtZWFucywgd2UgcmVhY2hlZCB0aGUgZW5kCisJam5lCTFiCisuZW5kbQorCisubWFjcm8gSU5JVF9SRUdBTExPQworICAuc2V0IEEsIFJFR19BCisgIC5zZXQgQiwgUkVHX0IKKyAgLnNldCBDLCBSRUdfQworICAuc2V0IEQsIFJFR19ECisgIC5zZXQgRSwgUkVHX0UKKyAgLnNldCBUMSwgUkVHX1QxCisgIC5zZXQgVDIsIFJFR19UMgorLmVuZG0KKworLm1hY3JvIFJFU1RPUkVfUkVOQU1FRF9SRUdTCisJIyBvcmRlciBpcyBpbXBvcnRhbnQgKFJFR19DIGlzIHdoZXJlIGl0IHNob3VsZCBiZSkKKwltb3YJQiwgUkVHX0IKKwltb3YJRCwgUkVHX0QKKwltb3YJQSwgUkVHX0EKKwltb3YJRSwgUkVHX0UKKy5lbmRtCisKKy5tYWNybyBTV0FQX1JFR19OQU1FUyAgYSwgYgorICAuc2V0IF9ULCBcYQorICAuc2V0IFxhLCBcYgorICAuc2V0IFxiLCBfVAorLmVuZG0KKworLm1hY3JvIEYxICBiLCBjLCBkCisJbW92CVxjLCBUMQorCVNXQVBfUkVHX05BTUVTIFxjLCBUMQorCXhvcglcZCwgVDEKKwlhbmQJXGIsIFQxCisJeG9yCVxkLCBUMQorLmVuZG0KKworLm1hY3JvIEYyICBiLCBjLCBkCisJbW92CVxkLCBUMQorCVNXQVBfUkVHX05BTUVTIFxkLCBUMQorCXhvcglcYywgVDEKKwl4b3IJXGIsIFQxCisuZW5kbQorCisubWFjcm8gRjMgIGIsIGMgLGQKKwltb3YJXGMsIFQxCisJU1dBUF9SRUdfTkFNRVMgXGMsIFQxCisJbW92CVxiLCBUMgorCW9yCVxiLCBUMQorCWFuZAlcYywgVDIKKwlhbmQJXGQsIFQxCisJb3IJVDIsIFQxCisuZW5kbQorCisubWFjcm8gRjQgIGIsIGMsIGQKKwlGMiBcYiwgXGMsIFxkCisuZW5kbQorCisubWFjcm8gVVBEQVRFX0hBU0ggIGhhc2gsIHZhbAorCWFkZAlcaGFzaCwgXHZhbAorCW1vdglcdmFsLCBcaGFzaAorLmVuZG0KKworLyoKKyAqIFJSIGRvZXMgdHdvIHJvdW5kcyBvZiBTSEEtMSBiYWNrIHRvIGJhY2sgd2l0aCBXW10gcHJlLWNhbGMKKyAqICAgdDEgPSBGKGIsIGMsIGQpOyAgIGUgKz0gdyhpKQorICogICBlICs9IHQxOyAgICAgICAgICAgYiA8PD0gMzA7ICAgZCAgKz0gdyhpKzEpOworICogICB0MSA9IEYoYSwgYiwgYyk7CisgKiAgIGQgKz0gdDE7ICAgICAgICAgICBhIDw8PSA1OworICogICBlICs9IGE7CisgKiAgIHQxID0gZTsgICAgICAgICAgICBhID4+PSA3OworICogICB0MSA8PD0gNTsKKyAqICAgZCArPSB0MTsKKyAqLworLm1hY3JvIFJSICBGLCBhLCBiLCBjLCBkLCBlLCByb3VuZAorCWFkZAlXSyhccm91bmQpLCBcZQorCVxGICAgXGIsIFxjLCBcZAkJIyB0MSA9IEYoYiwgYywgZCk7CisJV19QUkVDQUxDIChccm91bmQgKyBXX1BSRUNBTENfQUhFQUQpCisJcm9sCSQzMCwgXGIKKwlhZGQJVDEsIFxlCisJYWRkCVdLKFxyb3VuZCArIDEpLCBcZAorCisJXEYgICBcYSwgXGIsIFxjCisJV19QUkVDQUxDIChccm91bmQgKyBXX1BSRUNBTENfQUhFQUQgKyAxKQorCXJvbAkkNSwgXGEKKwlhZGQJXGEsIFxlCisJYWRkCVQxLCBcZAorCXJvcgkkNywgXGEJCSMgKGEgPDxyIDUpID4+ciA3KSA9PiBhIDw8ciAzMCkKKworCW1vdglcZSwgVDEKKwlTV0FQX1JFR19OQU1FUyBcZSwgVDEKKworCXJvbAkkNSwgVDEKKwlhZGQJVDEsIFxkCisKKwkjIHdyaXRlOiAgXGEsIFxiCisJIyByb3RhdGU6IFxhPD1cZCwgXGI8PVxlLCBcYzw9XGEsIFxkPD1cYiwgXGU8PVxjCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDICByCisgIC5zZXQgaSwgXHIKKworICAuaWYgKGkgPCAyMCkKKyAgICAuc2V0IEtfWE1NLCAwCisgIC5lbHNlaWYgKGkgPCA0MCkKKyAgICAuc2V0IEtfWE1NLCAxNgorICAuZWxzZWlmIChpIDwgNjApCisgICAgLnNldCBLX1hNTSwgMzIKKyAgLmVsc2VpZiAoaSA8IDgwKQorICAgIC5zZXQgS19YTU0sIDQ4CisgIC5lbmRpZgorCisgIC5pZiAoKGkgPCAxNikgfHwgKChpID49IDgwKSAmJiAoaSA8ICg4MCArIFdfUFJFQ0FMQ19BSEVBRCkpKSkKKyAgICAuc2V0IGksICgoXHIpICUgODApCSAgICAjIHByZS1jb21wdXRlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICAuaWYgKGkgPT0gMCkKKwlXX1BSRUNBTENfUkVTRVQKKyAgICAuZW5kaWYKKwlXX1BSRUNBTENfMDBfMTUKKyAgLmVsc2VpZiAoaTwzMikKKwlXX1BSRUNBTENfMTZfMzEKKyAgLmVsc2VpZiAoaSA8IDgwKSAgIC8vIHJvdW5kcyAzMi03OQorCVdfUFJFQ0FMQ18zMl83OQorICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBXX1BSRUNBTENfUkVTRVQKKyAgLnNldCBXLCAgICAgICAgICBXMAorICAuc2V0IFdfbWludXNfMDQsIFc0CisgIC5zZXQgV19taW51c18wOCwgVzgKKyAgLnNldCBXX21pbnVzXzEyLCBXMTIKKyAgLnNldCBXX21pbnVzXzE2LCBXMTYKKyAgLnNldCBXX21pbnVzXzIwLCBXMjAKKyAgLnNldCBXX21pbnVzXzI0LCBXMjQKKyAgLnNldCBXX21pbnVzXzI4LCBXMjgKKyAgLnNldCBXX21pbnVzXzMyLCBXCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDX1JPVEFURQorICAuc2V0IFdfbWludXNfMzIsIFdfbWludXNfMjgKKyAgLnNldCBXX21pbnVzXzI4LCBXX21pbnVzXzI0CisgIC5zZXQgV19taW51c18yNCwgV19taW51c18yMAorICAuc2V0IFdfbWludXNfMjAsIFdfbWludXNfMTYKKyAgLnNldCBXX21pbnVzXzE2LCBXX21pbnVzXzEyCisgIC5zZXQgV19taW51c18xMiwgV19taW51c18wOAorICAuc2V0IFdfbWludXNfMDgsIFdfbWludXNfMDQKKyAgLnNldCBXX21pbnVzXzA0LCBXCisgIC5zZXQgVywgICAgICAgICAgV19taW51c18zMgorLmVuZG0KKworLm1hY3JvIFdfUFJFQ0FMQ19TU1NFMworCisubWFjcm8gV19QUkVDQUxDXzAwXzE1CisJV19QUkVDQUxDXzAwXzE1X1NTU0UzCisuZW5kbQorLm1hY3JvIFdfUFJFQ0FMQ18xNl8zMQorCVdfUFJFQ0FMQ18xNl8zMV9TU1NFMworLmVuZG0KKy5tYWNybyBXX1BSRUNBTENfMzJfNzkKKwlXX1BSRUNBTENfMzJfNzlfU1NTRTMKKy5lbmRtCisKKy8qIG1lc3NhZ2Ugc2NoZWR1bGluZyBwcmUtY29tcHV0ZSBmb3Igcm91bmRzIDAtMTUgKi8KKy5tYWNybyBXX1BSRUNBTENfMDBfMTVfU1NTRTMKKyAgLmlmICgoaSAmIDMpID09IDApCisJbW92ZHF1CShpKjQpKEJVRkZFUl9QVFIpLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAxKQorCXBzaHVmYglYTU1fU0hVRkJfQlNXQVAsIFdfVE1QMQorCW1vdmRxYQlXX1RNUDEsIFcKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBhZGRkCShLX0JBU0UpLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCW1vdmRxYSAgV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisvKiBtZXNzYWdlIHNjaGVkdWxpbmcgcHJlLWNvbXB1dGUgZm9yIHJvdW5kcyAxNi0zMQorICoKKyAqIC0gY2FsY3VsYXRpbmcgbGFzdCAzMiB3W2ldIHZhbHVlcyBpbiA4IFhNTSByZWdpc3RlcnMKKyAqIC0gcHJlLWNhbGN1bGF0ZSBLK3dbaV0gdmFsdWVzIGFuZCBzdG9yZSB0byBtZW0sIGZvciBsYXRlciBsb2FkIGJ5IEFMVSBhZGQKKyAqICAgaW5zdHJ1Y3Rpb24KKyAqCisgKiBzb21lICJoZWF2eS1saWZ0aW5nIiB2ZWN0b3JpemF0aW9uIGZvciByb3VuZHMgMTYtMzEgZHVlIHRvIHdbaV0tPndbaS0zXQorICogZGVwZW5kZW5jeSwgYnV0IGltcHJvdmVzIGZvciAzMi03OQorICovCisubWFjcm8gV19QUkVDQUxDXzE2XzMxX1NTU0UzCisgICMgYmxlbmRlZCBzY2hlZHVsaW5nIG9mIHZlY3RvciBhbmQgc2NhbGFyIGluc3RydWN0aW9uIHN0cmVhbXMsIG9uZSA0LXdpZGUKKyAgIyB2ZWN0b3IgaXRlcmF0aW9uIC8gNCBzY2FsYXIgcm91bmRzCisgIC5pZiAoKGkgJiAzKSA9PSAwKQorCW1vdmRxYQlXX21pbnVzXzEyLCBXCisJcGFsaWducgkkOCwgV19taW51c18xNiwgVwkjIHdbaS0xNF0KKwltb3ZkcWEJV19taW51c18wNCwgV19UTVAxCisJcHNybGRxCSQ0LCBXX1RNUDEJCSMgd1tpLTNdCisJcHhvcglXX21pbnVzXzA4LCBXCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwlweG9yCVdfbWludXNfMTYsIFdfVE1QMQorCXB4b3IJV19UTVAxLCBXCisJbW92ZHFhCVcsIFdfVE1QMgorCW1vdmRxYQlXLCBXX1RNUDEKKwlwc2xsZHEJJDEyLCBXX1RNUDIKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBzcmxkCSQzMSwgVworCXBzbGxkCSQxLCBXX1RNUDEKKwlwb3IJVywgV19UTVAxCisJbW92ZHFhCVdfVE1QMiwgVworCXBzcmxkCSQzMCwgV19UTVAyCisJcHNsbGQJJDIsIFcKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCXB4b3IJVywgV19UTVAxCisJcHhvcglXX1RNUDIsIFdfVE1QMQorCW1vdmRxYQlXX1RNUDEsIFcKKwlwYWRkZAlLX1hNTShLX0JBU0UpLCBXX1RNUDEKKwltb3ZkcWEJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisvKiBtZXNzYWdlIHNjaGVkdWxpbmcgcHJlLWNvbXB1dGUgZm9yIHJvdW5kcyAzMi03OQorICoKKyAqIGluIFNIQS0xIHNwZWNpZmljYXRpb246IHdbaV0gPSAod1tpLTNdIF4gd1tpLThdICBeIHdbaS0xNF0gXiB3W2ktMTZdKSByb2wgMQorICogaW5zdGVhZCB3ZSBkbyBlcXVhbDogICAgd1tpXSA9ICh3W2ktNl0gXiB3W2ktMTZdIF4gd1tpLTI4XSBeIHdbaS0zMl0pIHJvbCAyCisgKiBhbGxvd3MgbW9yZSBlZmZpY2llbnQgdmVjdG9yaXphdGlvbiBzaW5jZSB3W2ldPT53W2ktM10gZGVwZW5kZW5jeSBpcyBicm9rZW4KKyAqLworLm1hY3JvIFdfUFJFQ0FMQ18zMl83OV9TU1NFMworICAuaWYgKChpICYgMykgPT0gMCkKKwltb3ZkcWEJV19taW51c18wNCwgV19UTVAxCisJcHhvcglXX21pbnVzXzI4LCBXCQkjIFcgaXMgV19taW51c18zMiBiZWZvcmUgeG9yCisJcGFsaWducgkkOCwgV19taW51c18wOCwgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwlweG9yCVdfbWludXNfMTYsIFcKKwlweG9yCVdfVE1QMSwgVworCW1vdmRxYQlXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXBzcmxkCSQzMCwgVworCXBzbGxkCSQyLCBXX1RNUDEKKwlwb3IJVywgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMykKKwltb3ZkcWEJV19UTVAxLCBXCisJcGFkZGQJS19YTU0oS19CQVNFKSwgV19UTVAxCisJbW92ZHFhCVdfVE1QMSwgV0soaSZ+MykKKwlXX1BSRUNBTENfUk9UQVRFCisgIC5lbmRpZgorLmVuZG0KKworLmVuZG0JCS8vIFdfUFJFQ0FMQ19TU1NFMworCisKKyNkZWZpbmUgSzEJMHg1YTgyNzk5OQorI2RlZmluZSBLMgkweDZlZDllYmExCisjZGVmaW5lIEszCTB4OGYxYmJjZGMKKyNkZWZpbmUgSzQJMHhjYTYyYzFkNgorCisuc2VjdGlvbiAucm9kYXRhCisuYWxpZ24gMTYKKworS19YTU1fQVI6CisJLmxvbmcgSzEsIEsxLCBLMSwgSzEKKwkubG9uZyBLMiwgSzIsIEsyLCBLMgorCS5sb25nIEszLCBLMywgSzMsIEszCisJLmxvbmcgSzQsIEs0LCBLNCwgSzQKKworQlNXQVBfU0hVRkJfQ1RMOgorCS5sb25nIDB4MDAwMTAyMDMKKwkubG9uZyAweDA0MDUwNjA3CisJLmxvbmcgMHgwODA5MGEwYgorCS5sb25nIDB4MGMwZDBlMGYKKworCisuc2VjdGlvbiAudGV4dAorCitXX1BSRUNBTENfU1NTRTMKKy5tYWNybyB4bW1fbW92IGEsIGIKKwltb3ZkcXUJXGEsXGIKKy5lbmRtCisKKy8qIFNTU0UzIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbjoKKyAqICBleHRlcm4gIkMiIHZvaWQgc2hhMV90cmFuc2Zvcm1fc3NzZTModTMyICpkaWdlc3QsIGNvbnN0IGNoYXIgKmRhdGEsIHUzMiAqd3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByb3VuZHMpOworICovCitTSEExX1ZFQ1RPUl9BU00gICAgIHNoYTFfdHJhbnNmb3JtX3Nzc2UzCisKKyNpZmRlZiBTSEExX0VOQUJMRV9BVlhfU1VQUE9SVAorCisubWFjcm8gV19QUkVDQUxDX0FWWAorCisucHVyZ2VtIFdfUFJFQ0FMQ18wMF8xNQorLm1hY3JvICBXX1BSRUNBTENfMDBfMTUKKyAgICBXX1BSRUNBTENfMDBfMTVfQVZYCisuZW5kbQorLnB1cmdlbSBXX1BSRUNBTENfMTZfMzEKKy5tYWNybyAgV19QUkVDQUxDXzE2XzMxCisgICAgV19QUkVDQUxDXzE2XzMxX0FWWAorLmVuZG0KKy5wdXJnZW0gV19QUkVDQUxDXzMyXzc5CisubWFjcm8gIFdfUFJFQ0FMQ18zMl83OQorICAgIFdfUFJFQ0FMQ18zMl83OV9BVlgKKy5lbmRtCisKKy5tYWNybyBXX1BSRUNBTENfMDBfMTVfQVZYCisgIC5pZiAoKGkgJiAzKSA9PSAwKQorCXZtb3ZkcXUJKGkqNCkoQlVGRkVSX1BUUiksIFdfVE1QMQorICAuZWxzZWlmICgoaSAmIDMpID09IDEpCisJdnBzaHVmYglYTU1fU0hVRkJfQlNXQVAsIFdfVE1QMSwgVworICAuZWxzZWlmICgoaSAmIDMpID09IDIpCisJdnBhZGRkCShLX0JBU0UpLCBXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAzKQorCXZtb3ZkcWEJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisubWFjcm8gV19QUkVDQUxDXzE2XzMxX0FWWAorICAuaWYgKChpICYgMykgPT0gMCkKKwl2cGFsaWduciAkOCwgV19taW51c18xNiwgV19taW51c18xMiwgVwkjIHdbaS0xNF0KKwl2cHNybGRxCSQ0LCBXX21pbnVzXzA0LCBXX1RNUDEJCSMgd1tpLTNdCisJdnB4b3IJV19taW51c18wOCwgVywgVworCXZweG9yCVdfbWludXNfMTYsIFdfVE1QMSwgV19UTVAxCisgIC5lbHNlaWYgKChpICYgMykgPT0gMSkKKwl2cHhvcglXX1RNUDEsIFcsIFcKKwl2cHNsbGRxCSQxMiwgVywgV19UTVAyCisJdnBzbGxkCSQxLCBXLCBXX1RNUDEKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAyKQorCXZwc3JsZAkkMzEsIFcsIFcKKwl2cG9yCVcsIFdfVE1QMSwgV19UTVAxCisJdnBzbGxkCSQyLCBXX1RNUDIsIFcKKwl2cHNybGQJJDMwLCBXX1RNUDIsIFdfVE1QMgorICAuZWxzZWlmICgoaSAmIDMpID09IDMpCisJdnB4b3IJVywgV19UTVAxLCBXX1RNUDEKKwl2cHhvcglXX1RNUDIsIFdfVE1QMSwgVworCXZwYWRkZAlLX1hNTShLX0JBU0UpLCBXLCBXX1RNUDEKKwl2bW92ZHF1CVdfVE1QMSwgV0soaSZ+MykKKwlXX1BSRUNBTENfUk9UQVRFCisgIC5lbmRpZgorLmVuZG0KKworLm1hY3JvIFdfUFJFQ0FMQ18zMl83OV9BVlgKKyAgLmlmICgoaSAmIDMpID09IDApCisJdnBhbGlnbnIgJDgsIFdfbWludXNfMDgsIFdfbWludXNfMDQsIFdfVE1QMQorCXZweG9yCVdfbWludXNfMjgsIFcsIFcJCSMgVyBpcyBXX21pbnVzXzMyIGJlZm9yZSB4b3IKKyAgLmVsc2VpZiAoKGkgJiAzKSA9PSAxKQorCXZweG9yCVdfbWludXNfMTYsIFdfVE1QMSwgV19UTVAxCisJdnB4b3IJV19UTVAxLCBXLCBXCisgIC5lbHNlaWYgKChpICYgMykgPT0gMikKKwl2cHNsbGQJJDIsIFcsIFdfVE1QMQorCXZwc3JsZAkkMzAsIFcsIFcKKwl2cG9yCVcsIFdfVE1QMSwgVworICAuZWxzZWlmICgoaSAmIDMpID09IDMpCisJdnBhZGRkCUtfWE1NKEtfQkFTRSksIFcsIFdfVE1QMQorCXZtb3ZkcXUJV19UTVAxLCBXSyhpJn4zKQorCVdfUFJFQ0FMQ19ST1RBVEUKKyAgLmVuZGlmCisuZW5kbQorCisuZW5kbSAgICAvLyBXX1BSRUNBTENfQVZYCisKK1dfUFJFQ0FMQ19BVlgKKy5wdXJnZW0geG1tX21vdgorLm1hY3JvIHhtbV9tb3YgYSwgYgorCXZtb3ZkcXUJXGEsXGIKKy5lbmRtCisKKworLyogQVZYIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbjoKKyAqICBleHRlcm4gIkMiIHZvaWQgc2hhMV90cmFuc2Zvcm1fYXZ4KHUzMiAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLCB1MzIgKndzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJvdW5kcyk7CisgKi8KK1NIQTFfVkVDVE9SX0FTTSAgICAgc2hhMV90cmFuc2Zvcm1fYXZ4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTY0OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBHbHVlIGNvZGUgZm9yIHRoZSBTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24gdXNpbmcKKyAqIFN1cHBsZW1lbnRhbCBTU0UzIGluc3RydWN0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gc2hhMV9nZW5lcmljLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIEFsYW4gU21pdGhlZS4KKyAqIENvcHlyaWdodCAoYykgQW5kcmV3IE1jRG9uYWxkIDxhbmRyZXdAbWNkb25hbGQub3JnLnVrPgorICogQ29weXJpZ2h0IChjKSBKZWFuLUZyYW5jb2lzIERpdmUgPGplZkBsaW51eGJlLm9yZz4KKyAqIENvcHlyaWdodCAoYykgTWF0aGlhcyBLcmF1c2UgPG1pbmlwbGlAZ29vZ2xlbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL3hjci5oPgorI2luY2x1ZGUgPGFzbS94c2F2ZS5oPgorCisKK2FzbWxpbmthZ2Ugdm9pZCBzaGExX3RyYW5zZm9ybV9zc3NlMyh1MzIgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByb3VuZHMpOworI2lmZGVmIFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCithc21saW5rYWdlIHZvaWQgc2hhMV90cmFuc2Zvcm1fYXZ4KHUzMiAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLAorCQkJCSAgIHVuc2lnbmVkIGludCByb3VuZHMpOworI2VuZGlmCisKK3N0YXRpYyBhc21saW5rYWdlIHZvaWQgKCpzaGExX3RyYW5zZm9ybV9hc20pKHUzMiAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CisKKworc3RhdGljIGludCBzaGExX3Nzc2UzX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCSpzY3R4ID0gKHN0cnVjdCBzaGExX3N0YXRlKXsKKwkJLnN0YXRlID0geyBTSEExX0gwLCBTSEExX0gxLCBTSEExX0gyLCBTSEExX0gzLCBTSEExX0g0IH0sCisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc2hhMV9zc3NlM191cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBwYXJ0aWFsKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJc2N0eC0+Y291bnQgKz0gbGVuOworCisJaWYgKHBhcnRpYWwpIHsKKwkJZG9uZSA9IFNIQTFfQkxPQ0tfU0laRSAtIHBhcnRpYWw7CisJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBkb25lKTsKKwkJc2hhMV90cmFuc2Zvcm1fYXNtKHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsIDEpOworCX0KKworCWlmIChsZW4gLSBkb25lID49IFNIQTFfQkxPQ0tfU0laRSkgeworCQljb25zdCB1bnNpZ25lZCBpbnQgcm91bmRzID0gKGxlbiAtIGRvbmUpIC8gU0hBMV9CTE9DS19TSVpFOworCisJCXNoYTFfdHJhbnNmb3JtX2FzbShzY3R4LT5zdGF0ZSwgZGF0YSArIGRvbmUsIHJvdW5kcyk7CisJCWRvbmUgKz0gcm91bmRzICogU0hBMV9CTE9DS19TSVpFOworCX0KKworCW1lbWNweShzY3R4LT5idWZmZXIsIGRhdGEgKyBkb25lLCBsZW4gLSBkb25lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYTFfc3NzZTNfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7CisJaW50IHJlczsKKworCS8qIEhhbmRsZSB0aGUgZmFzdCBjYXNlIHJpZ2h0IGhlcmUgKi8KKwlpZiAocGFydGlhbCArIGxlbiA8IFNIQTFfQkxPQ0tfU0laRSkgeworCQlzY3R4LT5jb3VudCArPSBsZW47CisJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBsZW4pOworCisJCXJldHVybiAwOworCX0KKworCWlmICghaXJxX2ZwdV91c2FibGUoKSkgeworCQlyZXMgPSBjcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgZGF0YSwgbGVuKTsKKwl9IGVsc2UgeworCQlrZXJuZWxfZnB1X2JlZ2luKCk7CisJCXJlcyA9IF9fc2hhMV9zc3NlM191cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBwYXJ0aWFsKTsKKwkJa2VybmVsX2ZwdV9lbmQoKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLworc3RhdGljIGludCBzaGExX3Nzc2UzX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJdW5zaWduZWQgaW50IGksIGluZGV4LCBwYWRsZW47CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCV9fYmU2NCBiaXRzOworCXN0YXRpYyBjb25zdCB1OCBwYWRkaW5nW1NIQTFfQkxPQ0tfU0laRV0gPSB7IDB4ODAsIH07CisKKwliaXRzID0gY3B1X3RvX2JlNjQoc2N0eC0+Y291bnQgPDwgMyk7CisKKwkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCBhbmQgYXBwZW5kIGxlbmd0aCAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7CisJcGFkbGVuID0gKGluZGV4IDwgNTYpID8gKDU2IC0gaW5kZXgpIDogKChTSEExX0JMT0NLX1NJWkUrNTYpIC0gaW5kZXgpOworCWlmICghaXJxX2ZwdV91c2FibGUoKSkgeworCQljcnlwdG9fc2hhMV91cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuKTsKKwkJY3J5cHRvX3NoYTFfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOworCX0gZWxzZSB7CisJCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwkJLyogV2UgbmVlZCB0byBmaWxsIGEgd2hvbGUgYmxvY2sgZm9yIF9fc2hhMV9zc3NlM191cGRhdGUoKSAqLworCQlpZiAocGFkbGVuIDw9IDU2KSB7CisJCQlzY3R4LT5jb3VudCArPSBwYWRsZW47CisJCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgaW5kZXgsIHBhZGRpbmcsIHBhZGxlbik7CisJCX0gZWxzZSB7CisJCQlfX3NoYTFfc3NzZTNfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZGxlbiwgaW5kZXgpOworCQl9CisJCV9fc2hhMV9zc3NlM191cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopJmJpdHMsIHNpemVvZihiaXRzKSwgNTYpOworCQlrZXJuZWxfZnB1X2VuZCgpOworCX0KKworCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKKworCS8qIFdpcGUgY29udGV4dCAqLworCW1lbXNldChzY3R4LCAwLCBzaXplb2YoKnNjdHgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYTFfc3NzZTNfZXhwb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB2b2lkICpvdXQpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9zc3NlM19pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwltZW1jcHkoc2N0eCwgaW4sIHNpemVvZigqc2N0eCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGFsZyA9IHsKKwkuZGlnZXN0c2l6ZQk9CVNIQTFfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jc2hhMV9zc3NlM19pbml0LAorCS51cGRhdGUJCT0Jc2hhMV9zc3NlM191cGRhdGUsCisJLmZpbmFsCQk9CXNoYTFfc3NzZTNfZmluYWwsCisJLmV4cG9ydAkJPQlzaGExX3Nzc2UzX2V4cG9ydCwKKwkuaW1wb3J0CQk9CXNoYTFfc3NzZTNfaW1wb3J0LAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCisJLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMSIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJzaGExLXNzc2UzIiwKKwkJLmNyYV9wcmlvcml0eQk9CTE1MCwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEExX0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfTsKKworI2lmZGVmIFNIQTFfRU5BQkxFX0FWWF9TVVBQT1JUCitzdGF0aWMgYm9vbCBfX2luaXQgYXZ4X3VzYWJsZSh2b2lkKQoreworCXU2NCB4Y3IwOworCisJaWYgKCFjcHVfaGFzX2F2eCB8fCAhY3B1X2hhc19vc3hzYXZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwl4Y3IwID0geGdldGJ2KFhDUl9YRkVBVFVSRV9FTkFCTEVEX01BU0spOworCWlmICgoeGNyMCAmIChYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTSkpICE9IChYU1RBVEVfU1NFIHwgWFNUQVRFX1lNTSkpIHsKKwkJcHJfaW5mbygiQVZYIGRldGVjdGVkIGJ1dCB1bnVzYWJsZS5cbiIpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBzaGExX3Nzc2UzX21vZF9pbml0KHZvaWQpCit7CisJLyogdGVzdCBmb3IgU1NTRTMgZmlyc3QgKi8KKwlpZiAoY3B1X2hhc19zc3NlMykKKwkJc2hhMV90cmFuc2Zvcm1fYXNtID0gc2hhMV90cmFuc2Zvcm1fc3NzZTM7CisKKyNpZmRlZiBTSEExX0VOQUJMRV9BVlhfU1VQUE9SVAorCS8qIGFsbG93IEFWWCB0byBvdmVycmlkZSBTU1NFMywgaXQncyBhIGxpdHRsZSBmYXN0ZXIgKi8KKwlpZiAoYXZ4X3VzYWJsZSgpKQorCQlzaGExX3RyYW5zZm9ybV9hc20gPSBzaGExX3RyYW5zZm9ybV9hdng7CisjZW5kaWYKKworCWlmIChzaGExX3RyYW5zZm9ybV9hc20pIHsKKwkJcHJfaW5mbygiVXNpbmcgJXMgb3B0aW1pemVkIFNIQS0xIGltcGxlbWVudGF0aW9uXG4iLAorCQkgICAgICAgIHNoYTFfdHJhbnNmb3JtX2FzbSA9PSBzaGExX3RyYW5zZm9ybV9zc3NlMyA/ICJTU1NFMyIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQVZYIik7CisJCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJmFsZyk7CisJfQorCXByX2luZm8oIk5laXRoZXIgQVZYIG5vciBTU1NFMyBpcyBhdmFpbGFibGUvdXNhYmxlLlxuIik7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYTFfc3NzZTNfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKK30KKworbW9kdWxlX2luaXQoc2hhMV9zc3NlM19tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzaGExX3Nzc2UzX21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU3VwcGxlbWVudGFsIFNTRTMgYWNjZWxlcmF0ZWQiKTsKKworTU9EVUxFX0FMSUFTKCJzaGExIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC1pNTg2LWFzbV8zMi5TIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gtaTU4Ni1hc21fMzIuUwppbmRleCA1NzUzMzFjLi42NThhZjRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC1pNTg2LWFzbV8zMi5TCisrKyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLWk1ODYtYXNtXzMyLlMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2RlZmluZSBpbl9ibGsgICAgMTIgIC8qIGlucHV0IGJ5dGUgYXJyYXkgYWRkcmVzcyBwYXJhbWV0ZXIqLwogI2RlZmluZSBvdXRfYmxrICAgOCAgLyogb3V0cHV0IGJ5dGUgYXJyYXkgYWRkcmVzcyBwYXJhbWV0ZXIqLwotI2RlZmluZSB0Zm0gICAgICAgNCAgLyogVHdvZmlzaCBjb250ZXh0IHN0cnVjdHVyZSAqLworI2RlZmluZSBjdHggICAgICAgNCAgLyogVHdvZmlzaCBjb250ZXh0IHN0cnVjdHVyZSAqLwogCiAjZGVmaW5lIGFfb2Zmc2V0CTAKICNkZWZpbmUgYl9vZmZzZXQJNApAQCAtMjI5LDggKzIyOSw4IEBACiAJcHVzaCAgICAlZXNpCiAJcHVzaCAgICAlZWRpCiAKLQltb3YJdGZtICsgMTYoJWVzcCksCSVlYnAJLyogYWJ1c2UgdGhlIGJhc2UgcG9pbnRlcjogc2V0IG5ldyBiYXNlIGJvaW50ZXIgdG8gdGhlIGNyeXB0byB0Zm0gKi8KLQlhZGQJJGNyeXB0b190Zm1fY3R4X29mZnNldCwgJWVicAkvKiBjdHggYWRkcmVzcyAqLworCW1vdgljdHggKyAxNiglZXNwKSwJJWVicAkvKiBhYnVzZSB0aGUgYmFzZSBwb2ludGVyOiBzZXQgbmV3IGJhc2UKKwkJCQkJICogcG9pbnRlciB0byB0aGUgY3R4IGFkZHJlc3MgKi8KIAltb3YgICAgIGluX2JsaysxNiglZXNwKSwlZWRpCS8qIGlucHV0IGFkZHJlc3MgaW4gZWRpICovCiAKIAltb3YJKCVlZGkpLAkJJWVheApAQCAtMjg1LDggKzI4NSw4IEBACiAJcHVzaCAgICAlZWRpCiAKIAotCW1vdgl0Zm0gKyAxNiglZXNwKSwJJWVicAkvKiBhYnVzZSB0aGUgYmFzZSBwb2ludGVyOiBzZXQgbmV3IGJhc2UgYm9pbnRlciB0byB0aGUgY3J5cHRvIHRmbSAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlZWJwCS8qIGN0eCBhZGRyZXNzICovCisJbW92CWN0eCArIDE2KCVlc3ApLAklZWJwCS8qIGFidXNlIHRoZSBiYXNlIHBvaW50ZXI6IHNldCBuZXcgYmFzZQorCQkJCQkgKiBwb2ludGVyIHRvIHRoZSBjdHggYWRkcmVzcyAqLwogCW1vdiAgICAgaW5fYmxrKzE2KCVlc3ApLCVlZGkJLyogaW5wdXQgYWRkcmVzcyBpbiBlZGkgKi8KIAogCW1vdgkoJWVkaSksCQklZWF4CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LTN3YXkuUyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLXg4Nl82NC1hc21fNjQtM3dheS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDEyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LTN3YXkuUwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIFR3b2Zpc2ggQ2lwaGVyIDMtd2F5IHBhcmFsbGVsIGFsZ29yaXRobSAoeDg2XzY0KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKdXNzaSBLaXZpbGlubmEgPGp1c3NpLmtpdmlsaW5uYUBtYm5ldC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogVVNBCisgKgorICovCisKKy5maWxlICJ0d29maXNoLXg4Nl82NC1hc20tM3dheS5TIgorLnRleHQKKworLyogc3RydWN0dXJlIG9mIGNyeXB0byBjb250ZXh0ICovCisjZGVmaW5lIHMwCTAKKyNkZWZpbmUgczEJMTAyNAorI2RlZmluZSBzMgkyMDQ4CisjZGVmaW5lIHMzCTMwNzIKKyNkZWZpbmUgdwk0MDk2CisjZGVmaW5lIGsJNDEyOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAzLXdheSB0d29maXNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1RYICVyZGkKKyNkZWZpbmUgUklPICVyZHgKKworI2RlZmluZSBSQUIwICVyYXgKKyNkZWZpbmUgUkFCMSAlcmJ4CisjZGVmaW5lIFJBQjIgJXJjeAorCisjZGVmaW5lIFJBQjBkICVlYXgKKyNkZWZpbmUgUkFCMWQgJWVieAorI2RlZmluZSBSQUIyZCAlZWN4CisKKyNkZWZpbmUgUkFCMGJoICVhaAorI2RlZmluZSBSQUIxYmggJWJoCisjZGVmaW5lIFJBQjJiaCAlY2gKKworI2RlZmluZSBSQUIwYmwgJWFsCisjZGVmaW5lIFJBQjFibCAlYmwKKyNkZWZpbmUgUkFCMmJsICVjbAorCisjZGVmaW5lIFJDRDAgJXI4CisjZGVmaW5lIFJDRDEgJXI5CisjZGVmaW5lIFJDRDIgJXIxMAorCisjZGVmaW5lIFJDRDBkICVyOGQKKyNkZWZpbmUgUkNEMWQgJXI5ZAorI2RlZmluZSBSQ0QyZCAlcjEwZAorCisjZGVmaW5lIFJYMCAlcmJwCisjZGVmaW5lIFJYMSAlcjExCisjZGVmaW5lIFJYMiAlcjEyCisKKyNkZWZpbmUgUlgwZCAlZWJwCisjZGVmaW5lIFJYMWQgJXIxMWQKKyNkZWZpbmUgUlgyZCAlcjEyZAorCisjZGVmaW5lIFJZMCAlcjEzCisjZGVmaW5lIFJZMSAlcjE0CisjZGVmaW5lIFJZMiAlcjE1CisKKyNkZWZpbmUgUlkwZCAlcjEzZAorI2RlZmluZSBSWTFkICVyMTRkCisjZGVmaW5lIFJZMmQgJXIxNWQKKworI2RlZmluZSBSVDAgJXJkeAorI2RlZmluZSBSVDEgJXJzaQorCisjZGVmaW5lIFJUMGQgJWVkeAorI2RlZmluZSBSVDFkICVlc2kKKworI2RlZmluZSBkbzE2Yml0X3Jvcihyb3QsIG9wMSwgb3AyLCBUMCwgVDEsIHRtcDEsIHRtcDIsIGFiLCBkc3QpIFwKKwltb3Z6YmwgYWIgIyMgYmwsCQl0bXAyICMjIGQ7IFwKKwltb3Z6YmwgYWIgIyMgYmgsCQl0bXAxICMjIGQ7IFwKKwlyb3JxICQocm90KSwJCQlhYjsgXAorCW9wMSMjbCBUMChDVFgsIHRtcDIsIDQpLAlkc3QgIyMgZDsgXAorCW9wMiMjbCBUMShDVFgsIHRtcDEsIDQpLAlkc3QgIyMgZDsKKworLyoKKyAqIENvbWJpbmVkIEcxICYgRzIgZnVuY3Rpb24uIFJlb3JkZXJlZCB3aXRoIGhlbHAgb2Ygcm90YXRlcyB0byBoYXZlIG1vdmVzCisgKiBhdCBiZWdpbmluZy4KKyAqLworI2RlZmluZSBnMWcyXzMoYWIsIGNkLCBUeDAsIFR4MSwgVHgyLCBUeDMsIFR5MCwgVHkxLCBUeTIsIFR5MywgeCwgeSkgXAorCS8qIEcxLDEgJiYgRzIsMSAqLyBcCisJZG8xNmJpdF9yb3IoMzIsIG1vdiwgeG9yLCBUeDAsIFR4MSwgUlQwLCB4ICMjIDAsIGFiICMjIDAsIHggIyMgMCk7IFwKKwlkbzE2Yml0X3Jvcig0OCwgbW92LCB4b3IsIFR5MSwgVHkyLCBSVDAsIHkgIyMgMCwgYWIgIyMgMCwgeSAjIyAwKTsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgbW92LCB4b3IsIFR4MCwgVHgxLCBSVDAsIHggIyMgMSwgYWIgIyMgMSwgeCAjIyAxKTsgXAorCWRvMTZiaXRfcm9yKDQ4LCBtb3YsIHhvciwgVHkxLCBUeTIsIFJUMCwgeSAjIyAxLCBhYiAjIyAxLCB5ICMjIDEpOyBcCisJXAorCWRvMTZiaXRfcm9yKDMyLCBtb3YsIHhvciwgVHgwLCBUeDEsIFJUMCwgeCAjIyAyLCBhYiAjIyAyLCB4ICMjIDIpOyBcCisJZG8xNmJpdF9yb3IoNDgsIG1vdiwgeG9yLCBUeTEsIFR5MiwgUlQwLCB5ICMjIDIsIGFiICMjIDIsIHkgIyMgMik7IFwKKwlcCisJLyogRzEsMiAmJiBHMiwyICovIFwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMCwgeCAjIyAwKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAwLCB5ICMjIDApOyBcCisJeGNoZ3EgY2QgIyMgMCwgYWIgIyMgMDsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMSwgeCAjIyAxKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAxLCB5ICMjIDEpOyBcCisJeGNoZ3EgY2QgIyMgMSwgYWIgIyMgMTsgXAorCVwKKwlkbzE2Yml0X3JvcigzMiwgeG9yLCB4b3IsIFR4MiwgVHgzLCBSVDAsIFJUMSwgYWIgIyMgMiwgeCAjIyAyKTsgXAorCWRvMTZiaXRfcm9yKDE2LCB4b3IsIHhvciwgVHkzLCBUeTAsIFJUMCwgUlQxLCBhYiAjIyAyLCB5ICMjIDIpOyBcCisJeGNoZ3EgY2QgIyMgMiwgYWIgIyMgMjsKKworI2RlZmluZSBlbmNfcm91bmRfZW5kKGFiLCB4LCB5LCBuKSBcCisJYWRkbCB5ICMjIGQsCQkJeCAjIyBkOyBcCisJYWRkbCB4ICMjIGQsCQkJeSAjIyBkOyBcCisJYWRkbCBrKzQqKDIqKG4pKShDVFgpLAkJeCAjIyBkOyBcCisJeG9ybCBhYiAjIyBkLAkJCXggIyMgZDsgXAorCWFkZGwgays0KigyKihuKSsxKShDVFgpLAl5ICMjIGQ7IFwKKwlzaHJxICQzMiwJCQlhYjsgXAorCXJvbGwgJDEsCQkJYWIgIyMgZDsgXAorCXhvcmwgeSAjIyBkLAkJCWFiICMjIGQ7IFwKKwlzaGxxICQzMiwJCQlhYjsgXAorCXJvcmwgJDEsCQkJeCAjIyBkOyBcCisJb3JxIHgsCQkJCWFiOworCisjZGVmaW5lIGRlY19yb3VuZF9lbmQoYmEsIHgsIHksIG4pIFwKKwlhZGRsIHkgIyMgZCwJCQl4ICMjIGQ7IFwKKwlhZGRsIHggIyMgZCwJCQl5ICMjIGQ7IFwKKwlhZGRsIGsrNCooMioobikpKENUWCksCQl4ICMjIGQ7IFwKKwlhZGRsIGsrNCooMioobikrMSkoQ1RYKSwJeSAjIyBkOyBcCisJeG9ybCBiYSAjIyBkLAkJCXkgIyMgZDsgXAorCXNocnEgJDMyLAkJCWJhOyBcCisJcm9sbCAkMSwJCQliYSAjIyBkOyBcCisJeG9ybCB4ICMjIGQsCQkJYmEgIyMgZDsgXAorCXNobHEgJDMyLAkJCWJhOyBcCisJcm9ybCAkMSwJCQl5ICMjIGQ7IFwKKwlvcnEgeSwJCQkJYmE7CisKKyNkZWZpbmUgZW5jcnlwdF9yb3VuZDMoYWIsIGNkLCBuKSBcCisJZzFnMl8zKGFiLCBjZCwgczAsIHMxLCBzMiwgczMsIHMwLCBzMSwgczIsIHMzLCBSWCwgUlkpOyBcCisJXAorCWVuY19yb3VuZF9lbmQoYWIgIyMgMCwgUlgwLCBSWTAsIG4pOyBcCisJZW5jX3JvdW5kX2VuZChhYiAjIyAxLCBSWDEsIFJZMSwgbik7IFwKKwllbmNfcm91bmRfZW5kKGFiICMjIDIsIFJYMiwgUlkyLCBuKTsKKworI2RlZmluZSBkZWNyeXB0X3JvdW5kMyhiYSwgZGMsIG4pIFwKKwlnMWcyXzMoYmEsIGRjLCBzMSwgczIsIHMzLCBzMCwgczMsIHMwLCBzMSwgczIsIFJZLCBSWCk7IFwKKwlcCisJZGVjX3JvdW5kX2VuZChiYSAjIyAwLCBSWDAsIFJZMCwgbik7IFwKKwlkZWNfcm91bmRfZW5kKGJhICMjIDEsIFJYMSwgUlkxLCBuKTsgXAorCWRlY19yb3VuZF9lbmQoYmEgIyMgMiwgUlgyLCBSWTIsIG4pOworCisjZGVmaW5lIGVuY3J5cHRfY3ljbGUzKGFiLCBjZCwgbikgXAorCWVuY3J5cHRfcm91bmQzKGFiLCBjZCwgbioyKTsgXAorCWVuY3J5cHRfcm91bmQzKGFiLCBjZCwgKG4qMikrMSk7CisKKyNkZWZpbmUgZGVjcnlwdF9jeWNsZTMoYmEsIGRjLCBuKSBcCisJZGVjcnlwdF9yb3VuZDMoYmEsIGRjLCAobioyKSsxKTsgXAorCWRlY3J5cHRfcm91bmQzKGJhLCBkYywgKG4qMikpOworCisjZGVmaW5lIGlucGFjazMoaW4sIG4sIHh5LCBtKSBcCisJbW92cSA0KihuKShpbiksCQkJeHkgIyMgMDsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDA7IFwKKwlcCisJbW92cSA0Kig0KyhuKSkoaW4pLAkJeHkgIyMgMTsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDE7IFwKKwlcCisJbW92cSA0Kig4KyhuKSkoaW4pLAkJeHkgIyMgMjsgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDI7CisKKyNkZWZpbmUgb3V0dW5wYWNrMyhvcCwgb3V0LCBuLCB4eSwgbSkgXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDA7IFwKKwlvcCAjIyBxIHh5ICMjIDAsCQk0KihuKShvdXQpOyBcCisJXAorCXhvcnEgdys0Km0oQ1RYKSwJCXh5ICMjIDE7IFwKKwlvcCAjIyBxIHh5ICMjIDEsCQk0Kig0KyhuKSkob3V0KTsgXAorCVwKKwl4b3JxIHcrNCptKENUWCksCQl4eSAjIyAyOyBcCisJb3AgIyMgcSB4eSAjIyAyLAkJNCooOCsobikpKG91dCk7CisKKyNkZWZpbmUgaW5wYWNrX2VuYzMoKSBcCisJaW5wYWNrMyhSSU8sIDAsIFJBQiwgMCk7IFwKKwlpbnBhY2szKFJJTywgMiwgUkNELCAyKTsKKworI2RlZmluZSBvdXR1bnBhY2tfZW5jMyhvcCkgXAorCW91dHVucGFjazMob3AsIFJJTywgMiwgUkFCLCA2KTsgXAorCW91dHVucGFjazMob3AsIFJJTywgMCwgUkNELCA0KTsKKworI2RlZmluZSBpbnBhY2tfZGVjMygpIFwKKwlpbnBhY2szKFJJTywgMCwgUkFCLCA0KTsgXAorCXJvcnEgJDMyLAkJCVJBQjA7IFwKKwlyb3JxICQzMiwJCQlSQUIxOyBcCisJcm9ycSAkMzIsCQkJUkFCMjsgXAorCWlucGFjazMoUklPLCAyLCBSQ0QsIDYpOyBcCisJcm9ycSAkMzIsCQkJUkNEMDsgXAorCXJvcnEgJDMyLAkJCVJDRDE7IFwKKwlyb3JxICQzMiwJCQlSQ0QyOworCisjZGVmaW5lIG91dHVucGFja19kZWMzKCkgXAorCXJvcnEgJDMyLAkJCVJDRDA7IFwKKwlyb3JxICQzMiwJCQlSQ0QxOyBcCisJcm9ycSAkMzIsCQkJUkNEMjsgXAorCW91dHVucGFjazMobW92LCBSSU8sIDAsIFJDRCwgMCk7IFwKKwlyb3JxICQzMiwJCQlSQUIwOyBcCisJcm9ycSAkMzIsCQkJUkFCMTsgXAorCXJvcnEgJDMyLAkJCVJBQjI7IFwKKwlvdXR1bnBhY2szKG1vdiwgUklPLCAyLCBSQUIsIDIpOworCisuYWxpZ24gOAorLmdsb2JhbCBfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5CisudHlwZSAgIF9fdHdvZmlzaF9lbmNfYmxrXzN3YXksQGZ1bmN0aW9uOworCitfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5OgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjLCBSSU8KKwkgKgklcmN4OiBib29sLCBpZiB0cnVlOiB4b3Igb3V0cHV0CisJICovCisJcHVzaHEgJXIxNTsKKwlwdXNocSAlcjE0OworCXB1c2hxICVyMTM7CisJcHVzaHEgJXIxMjsKKwlwdXNocSAlcmJwOworCXB1c2hxICVyYng7CisKKwlwdXNocSAlcmN4OyAvKiBib29sIHhvciAqLworCXB1c2hxICVyc2k7IC8qIGRzdCAqLworCisJaW5wYWNrX2VuYzMoKTsKKworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAwKTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMSk7CisJZW5jcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDIpOworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAzKTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNCk7CisJZW5jcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDUpOworCWVuY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA2KTsKKwllbmNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNyk7CisKKwlwb3BxIFJJTzsgLyogZHN0ICovCisJcG9wcSAlcmJwOyAvKiBib29sIHhvciAqLworCisJdGVzdGIgJWJwbCwgJWJwbDsKKwlqbnogX19lbmNfeG9yMzsKKworCW91dHVucGFja19lbmMzKG1vdik7CisKKwlwb3BxICVyYng7CisJcG9wcSAlcmJwOworCXBvcHEgJXIxMjsKKwlwb3BxICVyMTM7CisJcG9wcSAlcjE0OworCXBvcHEgJXIxNTsKKwlyZXQ7CisKK19fZW5jX3hvcjM6CisJb3V0dW5wYWNrX2VuYzMoeG9yKTsKKworCXBvcHEgJXJieDsKKwlwb3BxICVyYnA7CisJcG9wcSAlcjEyOworCXBvcHEgJXIxMzsKKwlwb3BxICVyMTQ7CisJcG9wcSAlcjE1OworCXJldDsKKworLmdsb2JhbCB0d29maXNoX2RlY19ibGtfM3dheQorLnR5cGUgICB0d29maXNoX2RlY19ibGtfM3dheSxAZnVuY3Rpb247CisKK3R3b2Zpc2hfZGVjX2Jsa18zd2F5OgorCS8qIGlucHV0OgorCSAqCSVyZGk6IGN0eCwgQ1RYCisJICoJJXJzaTogZHN0CisJICoJJXJkeDogc3JjLCBSSU8KKwkgKi8KKwlwdXNocSAlcjE1OworCXB1c2hxICVyMTQ7CisJcHVzaHEgJXIxMzsKKwlwdXNocSAlcjEyOworCXB1c2hxICVyYnA7CisJcHVzaHEgJXJieDsKKworCXB1c2hxICVyc2k7IC8qIGRzdCAqLworCisJaW5wYWNrX2RlYzMoKTsKKworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA3KTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgNik7CisJZGVjcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDUpOworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCA0KTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMyk7CisJZGVjcnlwdF9jeWNsZTMoUkFCLCBSQ0QsIDIpOworCWRlY3J5cHRfY3ljbGUzKFJBQiwgUkNELCAxKTsKKwlkZWNyeXB0X2N5Y2xlMyhSQUIsIFJDRCwgMCk7CisKKwlwb3BxIFJJTzsgLyogZHN0ICovCisKKwlvdXR1bnBhY2tfZGVjMygpOworCisJcG9wcSAlcmJ4OworCXBvcHEgJXJicDsKKwlwb3BxICVyMTI7CisJcG9wcSAlcjEzOworCXBvcHEgJXIxNDsKKwlwb3BxICVyMTU7CisJcmV0OworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LlMgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LlMKaW5kZXggNTczYWExMC4uN2JjZjNmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gteDg2XzY0LWFzbV82NC5TCisrKyBiL2FyY2gveDg2L2NyeXB0by90d29maXNoLXg4Nl82NC1hc21fNjQuUwpAQCAtMjIxLDEwICsyMjEsOSBAQAogdHdvZmlzaF9lbmNfYmxrOgogCXB1c2hxICAgIFIxCiAKLQkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjcnlwdG8gdGZtIGFkZHJlc3MgKi8KKwkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjdHggYWRkcmVzcyAqLwogCS8qICVyc2kgY29udGFpbnMgdGhlIG91dHB1dCBhZGRyZXNzICovCiAJLyogJXJkeCBjb250YWlucyB0aGUgaW5wdXQgYWRkcmVzcyAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlcmRpCS8qIHNldCBjdHggYWRkcmVzcyAqLwogCS8qIGN0eCBhZGRyZXNzIGlzIG1vdmVkIHRvIGZyZWUgb25lIG5vbi1yZXggcmVnaXN0ZXIKIAlhcyB0YXJnZXQgZm9yIHRoZSA4Yml0IGhpZ2ggb3BlcmF0aW9ucyAqLwogCW1vdgklcmRpLAkJJXIxMQpAQCAtMjc0LDEwICsyNzMsOSBAQAogdHdvZmlzaF9kZWNfYmxrOgogCXB1c2hxICAgIFIxCiAKLQkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjcnlwdG8gdGZtIGFkZHJlc3MgKi8KKwkvKiAlcmRpIGNvbnRhaW5zIHRoZSBjdHggYWRkcmVzcyAqLwogCS8qICVyc2kgY29udGFpbnMgdGhlIG91dHB1dCBhZGRyZXNzICovCiAJLyogJXJkeCBjb250YWlucyB0aGUgaW5wdXQgYWRkcmVzcyAqLwotCWFkZAkkY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCAlcmRpCS8qIHNldCBjdHggYWRkcmVzcyAqLwogCS8qIGN0eCBhZGRyZXNzIGlzIG1vdmVkIHRvIGZyZWUgb25lIG5vbi1yZXggcmVnaXN0ZXIKIAlhcyB0YXJnZXQgZm9yIHRoZSA4Yml0IGhpZ2ggb3BlcmF0aW9ucyAqLwogCW1vdgklcmRpLAkJJXIxMQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZS5jCmluZGV4IGNlZmFmOGIuLmRjNmIzZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by90d29maXNoX2dsdWUuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaF9nbHVlLmMKQEAgLTQ0LDE3ICs0NCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCB0d29maXNoX2VuY19ibGsoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Ci1hc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworYXNtbGlua2FnZSB2b2lkIHR3b2Zpc2hfZW5jX2JsayhzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHR3b2Zpc2hfZW5jX2Jsayk7Cithc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrKHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCWNvbnN0IHU4ICpzcmMpOworRVhQT1JUX1NZTUJPTF9HUEwodHdvZmlzaF9kZWNfYmxrKTsKIAogc3RhdGljIHZvaWQgdHdvZmlzaF9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JdHdvZmlzaF9lbmNfYmxrKHRmbSwgZHN0LCBzcmMpOworCXR3b2Zpc2hfZW5jX2JsayhjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7CiB9CiAKIHN0YXRpYyB2b2lkIHR3b2Zpc2hfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCXR3b2Zpc2hfZGVjX2Jsayh0Zm0sIGRzdCwgc3JjKTsKKwl0d29maXNoX2RlY19ibGsoY3J5cHRvX3RmbV9jdHgodGZtKSwgZHN0LCBzcmMpOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWxnID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZV8zd2F5LmMgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaF9nbHVlXzN3YXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRlOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfZ2x1ZV8zd2F5LmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBHbHVlIENvZGUgZm9yIDMtd2F5IHBhcmFsbGVsIGFzc2VtYmxlciBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBUd29maXNoCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIEp1c3NpIEtpdmlsaW5uYSA8anVzc2kua2l2aWxpbm5hQG1ibmV0LmZpPgorICoKKyAqIENCQyAmIEVDQiBwYXJ0cyBiYXNlZCBvbiBjb2RlIChjcnlwdG8vY2JjLmMsZWNiLmMpIGJ5OgorICogICBDb3B5cmlnaHQgKGMpIDIwMDYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ1RSIHBhcnQgYmFzZWQgb24gY29kZSAoY3J5cHRvL2N0ci5jKSBieToKKyAqICAgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNyAtIEpveSBMYXR0ZW4gPGxhdHRlbkB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlIDxjcnlwdG8vdHdvZmlzaC5oPgorI2luY2x1ZGUgPGNyeXB0by9iMTI4b3BzLmg+CisKKy8qIHJlZ3VsYXIgYmxvY2sgY2lwaGVyIGZ1bmN0aW9ucyBmcm9tIHR3b2Zpc2hfeDg2XzY0IG1vZHVsZSAqLworYXNtbGlua2FnZSB2b2lkIHR3b2Zpc2hfZW5jX2JsayhzdHJ1Y3QgdHdvZmlzaF9jdHggKmN0eCwgdTggKmRzdCwKKwkJCQljb25zdCB1OCAqc3JjKTsKK2FzbWxpbmthZ2Ugdm9pZCB0d29maXNoX2RlY19ibGsoc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJY29uc3QgdTggKnNyYyk7CisKKy8qIDMtd2F5IHBhcmFsbGVsIGNpcGhlciBmdW5jdGlvbnMgKi8KK2FzbWxpbmthZ2Ugdm9pZCBfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCSAgICAgICBjb25zdCB1OCAqc3JjLCBib29sIHhvcik7Cithc21saW5rYWdlIHZvaWQgdHdvZmlzaF9kZWNfYmxrXzN3YXkoc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHgsIHU4ICpkc3QsCisJCQkJICAgICBjb25zdCB1OCAqc3JjKTsKKworc3RhdGljIGlubGluZSB2b2lkIHR3b2Zpc2hfZW5jX2Jsa18zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQljb25zdCB1OCAqc3JjKQoreworCV9fdHdvZmlzaF9lbmNfYmxrXzN3YXkoY3R4LCBkc3QsIHNyYywgZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHdvZmlzaF9lbmNfYmxrX3hvcl8zd2F5KHN0cnVjdCB0d29maXNoX2N0eCAqY3R4LCB1OCAqZHN0LAorCQkJCQkgICAgY29uc3QgdTggKnNyYykKK3sKKwlfX3R3b2Zpc2hfZW5jX2Jsa18zd2F5KGN0eCwgZHN0LCBzcmMsIHRydWUpOworfQorCitzdGF0aWMgaW50IGVjYl9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaywKKwkJICAgICB2b2lkICgqZm4pKHN0cnVjdCB0d29maXNoX2N0eCAqLCB1OCAqLCBjb25zdCB1OCAqKSwKKwkJICAgICB2b2lkICgqZm5fM3dheSkoc3RydWN0IHR3b2Zpc2hfY3R4ICosIHU4ICosIGNvbnN0IHU4ICopKQoreworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBURl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXM7CisJaW50IGVycjsKKworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykpIHsKKwkJdTggKndzcmMgPSB3YWxrLT5zcmMudmlydC5hZGRyOworCQl1OCAqd2RzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisKKwkJLyogUHJvY2VzcyB0aHJlZSBibG9jayBiYXRjaCAqLworCQlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQkJZG8geworCQkJCWZuXzN3YXkoY3R4LCB3ZHN0LCB3c3JjKTsKKworCQkJCXdzcmMgKz0gYnNpemUgKiAzOworCQkJCXdkc3QgKz0gYnNpemUgKiAzOworCQkJCW5ieXRlcyAtPSBic2l6ZSAqIDM7CisJCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUgKiAzKTsKKworCQkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIEhhbmRsZSBsZWZ0b3ZlcnMgKi8KKwkJZG8geworCQkJZm4oY3R4LCB3ZHN0LCB3c3JjKTsKKworCQkJd3NyYyArPSBic2l6ZTsKKwkJCXdkc3QgKz0gYnNpemU7CisJCQluYnl0ZXMgLT0gYnNpemU7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSk7CisKK2RvbmU6CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVjYl9lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIHR3b2Zpc2hfZW5jX2JsaywgdHdvZmlzaF9lbmNfYmxrXzN3YXkpOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBlY2JfY3J5cHQoZGVzYywgJndhbGssIHR3b2Zpc2hfZGVjX2JsaywgdHdvZmlzaF9kZWNfYmxrXzN3YXkpOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYmxrX2VjYl9hbGcgPSB7CisJLmNyYV9uYW1lCQk9ICJlY2IodHdvZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiZWNiLXR3b2Zpc2gtM3dheSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19lY2JfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBURl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBURl9NQVhfS0VZX1NJWkUsCisJCQkuc2V0a2V5CQk9IHR3b2Zpc2hfc2V0a2V5LAorCQkJLmVuY3J5cHQJPSBlY2JfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CT0gZWNiX2RlY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IFRGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1MTI4ICpzcmMgPSAodTEyOCAqKXdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTEyOCAqZHN0ID0gKHUxMjggKil3YWxrLT5kc3QudmlydC5hZGRyOworCXUxMjggKml2ID0gKHUxMjggKil3YWxrLT5pdjsKKworCWRvIHsKKwkJdTEyOF94b3IoZHN0LCBzcmMsIGl2KTsKKwkJdHdvZmlzaF9lbmNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilkc3QpOworCQlpdiA9IGRzdDsKKworCQlzcmMgKz0gMTsKKwkJZHN0ICs9IDE7CisJCW5ieXRlcyAtPSBic2l6ZTsKKwl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCisJdTEyOF94b3IoKHUxMjggKil3YWxrLT5pdiwgKHUxMjggKil3YWxrLT5pdiwgaXYpOworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnI7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW5ieXRlcyA9IF9fY2JjX2VuY3J5cHQoZGVzYywgJndhbGspOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBic2l6ZSA9IFRGX0JMT0NLX1NJWkU7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1MTI4ICpzcmMgPSAodTEyOCAqKXdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTEyOCAqZHN0ID0gKHUxMjggKil3YWxrLT5kc3QudmlydC5hZGRyOworCXUxMjggaXZzWzMgLSAxXTsKKwl1MTI4IGxhc3RfaXY7CisKKwkvKiBTdGFydCBvZiB0aGUgbGFzdCBibG9jay4gKi8KKwlzcmMgKz0gbmJ5dGVzIC8gYnNpemUgLSAxOworCWRzdCArPSBuYnl0ZXMgLyBic2l6ZSAtIDE7CisKKwlsYXN0X2l2ID0gKnNyYzsKKworCS8qIFByb2Nlc3MgdGhyZWUgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQlkbyB7CisJCQluYnl0ZXMgLT0gYnNpemUgKiAoMyAtIDEpOworCQkJc3JjIC09IDMgLSAxOworCQkJZHN0IC09IDMgLSAxOworCisJCQlpdnNbMF0gPSBzcmNbMF07CisJCQlpdnNbMV0gPSBzcmNbMV07CisKKwkJCXR3b2Zpc2hfZGVjX2Jsa18zd2F5KGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCQl1MTI4X3hvcihkc3QgKyAxLCBkc3QgKyAxLCBpdnMgKyAwKTsKKwkJCXUxMjhfeG9yKGRzdCArIDIsIGRzdCArIDIsIGl2cyArIDEpOworCisJCQluYnl0ZXMgLT0gYnNpemU7CisJCQlpZiAobmJ5dGVzIDwgYnNpemUpCisJCQkJZ290byBkb25lOworCisJCQl1MTI4X3hvcihkc3QsIGRzdCwgc3JjIC0gMSk7CisJCQlzcmMgLT0gMTsKKwkJCWRzdCAtPSAxOworCQl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUgKiAzKTsKKworCQlpZiAobmJ5dGVzIDwgYnNpemUpCisJCQlnb3RvIGRvbmU7CisJfQorCisJLyogSGFuZGxlIGxlZnRvdmVycyAqLworCWZvciAoOzspIHsKKwkJdHdvZmlzaF9kZWNfYmxrKGN0eCwgKHU4ICopZHN0LCAodTggKilzcmMpOworCisJCW5ieXRlcyAtPSBic2l6ZTsKKwkJaWYgKG5ieXRlcyA8IGJzaXplKQorCQkJYnJlYWs7CisKKwkJdTEyOF94b3IoZHN0LCBkc3QsIHNyYyAtIDEpOworCQlzcmMgLT0gMTsKKwkJZHN0IC09IDE7CisJfQorCitkb25lOgorCXUxMjhfeG9yKGRzdCwgZHN0LCAodTEyOCAqKXdhbGstPml2KTsKKwkqKHUxMjggKil3YWxrLT5pdiA9IGxhc3RfaXY7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50IGNiY19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwlpbnQgZXJyOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQluYnl0ZXMgPSBfX2NiY19kZWNyeXB0KGRlc2MsICZ3YWxrKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYmxrX2NiY19hbGcgPSB7CisJLmNyYV9uYW1lCQk9ICJjYmModHdvZmlzaCkiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjLXR3b2Zpc2gtM3dheSIsCisJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9IExJU1RfSEVBRF9JTklUKGJsa19jYmNfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJPSBURl9NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUJPSBURl9NQVhfS0VZX1NJWkUsCisJCQkuaXZzaXplCQk9IFRGX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQk9IHR3b2Zpc2hfc2V0a2V5LAorCQkJLmVuY3J5cHQJPSBjYmNfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CT0gY2JjX2RlY3J5cHQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTI4X3RvX2JlMTI4KGJlMTI4ICpkc3QsIGNvbnN0IHUxMjggKnNyYykKK3sKKwlkc3QtPmEgPSBjcHVfdG9fYmU2NChzcmMtPmEpOworCWRzdC0+YiA9IGNwdV90b19iZTY0KHNyYy0+Yik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTEyOF90b191MTI4KHUxMjggKmRzdCwgY29uc3QgYmUxMjggKnNyYykKK3sKKwlkc3QtPmEgPSBiZTY0X3RvX2NwdShzcmMtPmEpOworCWRzdC0+YiA9IGJlNjRfdG9fY3B1KHNyYy0+Yik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTI4X2luYyh1MTI4ICppKQoreworCWktPmIrKzsKKwlpZiAoIWktPmIpCisJCWktPmErKzsKK30KKworc3RhdGljIHZvaWQgY3RyX2NyeXB0X2ZpbmFsKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHR3b2Zpc2hfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXU4ICpjdHJibGsgPSB3YWxrLT5pdjsKKwl1OCBrZXlzdHJlYW1bVEZfQkxPQ0tfU0laRV07CisJdTggKnNyYyA9IHdhbGstPnNyYy52aXJ0LmFkZHI7CisJdTggKmRzdCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKworCXR3b2Zpc2hfZW5jX2JsayhjdHgsIGtleXN0cmVhbSwgY3RyYmxrKTsKKwljcnlwdG9feG9yKGtleXN0cmVhbSwgc3JjLCBuYnl0ZXMpOworCW1lbWNweShkc3QsIGtleXN0cmVhbSwgbmJ5dGVzKTsKKworCWNyeXB0b19pbmMoY3RyYmxrLCBURl9CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cl9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQoreworCXN0cnVjdCB0d29maXNoX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSBURl9CTE9DS19TSVpFOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdTEyOCAqc3JjID0gKHUxMjggKil3YWxrLT5zcmMudmlydC5hZGRyOworCXUxMjggKmRzdCA9ICh1MTI4ICopd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKwl1MTI4IGN0cmJsazsKKwliZTEyOCBjdHJibG9ja3NbM107CisKKwliZTEyOF90b191MTI4KCZjdHJibGssIChiZTEyOCAqKXdhbGstPml2KTsKKworCS8qIFByb2Nlc3MgdGhyZWUgYmxvY2sgYmF0Y2ggKi8KKwlpZiAobmJ5dGVzID49IGJzaXplICogMykgeworCQlkbyB7CisJCQlpZiAoZHN0ICE9IHNyYykgeworCQkJCWRzdFswXSA9IHNyY1swXTsKKwkJCQlkc3RbMV0gPSBzcmNbMV07CisJCQkJZHN0WzJdID0gc3JjWzJdOworCQkJfQorCisJCQkvKiBjcmVhdGUgY3RyYmxrcyBmb3IgcGFyYWxsZWwgZW5jcnlwdCAqLworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzBdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzFdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCQkJdTEyOF90b19iZTEyOCgmY3RyYmxvY2tzWzJdLCAmY3RyYmxrKTsKKwkJCXUxMjhfaW5jKCZjdHJibGspOworCisJCQl0d29maXNoX2VuY19ibGtfeG9yXzN3YXkoY3R4LCAodTggKilkc3QsCisJCQkJCQkgKHU4ICopY3RyYmxvY2tzKTsKKworCQkJc3JjICs9IDM7CisJCQlkc3QgKz0gMzsKKwkJCW5ieXRlcyAtPSBic2l6ZSAqIDM7CisJCX0gd2hpbGUgKG5ieXRlcyA+PSBic2l6ZSAqIDMpOworCisJCWlmIChuYnl0ZXMgPCBic2l6ZSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBIYW5kbGUgbGVmdG92ZXJzICovCisJZG8geworCQlpZiAoZHN0ICE9IHNyYykKKwkJCSpkc3QgPSAqc3JjOworCisJCXUxMjhfdG9fYmUxMjgoJmN0cmJsb2Nrc1swXSwgJmN0cmJsayk7CisJCXUxMjhfaW5jKCZjdHJibGspOworCisJCXR3b2Zpc2hfZW5jX2JsayhjdHgsICh1OCAqKWN0cmJsb2NrcywgKHU4ICopY3RyYmxvY2tzKTsKKwkJdTEyOF94b3IoZHN0LCBkc3QsICh1MTI4ICopY3RyYmxvY2tzKTsKKworCQlzcmMgKz0gMTsKKwkJZHN0ICs9IDE7CisJCW5ieXRlcyAtPSBic2l6ZTsKKwl9IHdoaWxlIChuYnl0ZXMgPj0gYnNpemUpOworCitkb25lOgorCXUxMjhfdG9fYmUxMjgoKGJlMTI4ICopd2Fsay0+aXYsICZjdHJibGspOworCXJldHVybiBuYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgY3RyX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJaW50IGVycjsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgJndhbGssIFRGX0JMT0NLX1NJWkUpOworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLm5ieXRlcykgPj0gVEZfQkxPQ0tfU0laRSkgeworCQluYnl0ZXMgPSBfX2N0cl9jcnlwdChkZXNjLCAmd2Fsayk7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIG5ieXRlcyk7CisJfQorCisJaWYgKHdhbGsubmJ5dGVzKSB7CisJCWN0cl9jcnlwdF9maW5hbChkZXNjLCAmd2Fsayk7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIDApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBibGtfY3RyX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gImN0cih0d29maXNoKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjdHItdHdvZmlzaC0zd2F5IiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCB0d29maXNoX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gMCwKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0gTElTVF9IRUFEX0lOSVQoYmxrX2N0cl9hbGcuY3JhX2xpc3QpLAorCS5jcmFfdSA9IHsKKwkJLmJsa2NpcGhlciA9IHsKKwkJCS5taW5fa2V5c2l6ZQk9IFRGX01JTl9LRVlfU0laRSwKKwkJCS5tYXhfa2V5c2l6ZQk9IFRGX01BWF9LRVlfU0laRSwKKwkJCS5pdnNpemUJCT0gVEZfQkxPQ0tfU0laRSwKKwkJCS5zZXRrZXkJCT0gdHdvZmlzaF9zZXRrZXksCisJCQkuZW5jcnlwdAk9IGN0cl9jcnlwdCwKKwkJCS5kZWNyeXB0CT0gY3RyX2NyeXB0LAorCQl9LAorCX0sCit9OworCitpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYmxrX2VjYl9hbGcpOworCWlmIChlcnIpCisJCWdvdG8gZWNiX2VycjsKKwllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZibGtfY2JjX2FsZyk7CisJaWYgKGVycikKKwkJZ290byBjYmNfZXJyOworCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jdHJfYWxnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGN0cl9lcnI7CisKKwlyZXR1cm4gMDsKKworY3RyX2VycjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKK2NiY19lcnI6CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfZWNiX2FsZyk7CitlY2JfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jdHJfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19lY2JfYWxnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUd29maXNoIENpcGhlciBBbGdvcml0aG0sIDMtd2F5IHBhcmFsbGVsIGFzbSBvcHRpbWl6ZWQiKTsKK01PRFVMRV9BTElBUygidHdvZmlzaCIpOworTU9EVUxFX0FMSUFTKCJ0d29maXNoLWFzbSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNTRlZGIyMDcuLmE2MjUzZWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwpAQCAtODUwLDQgKzg1MCw2IEBACiAJLnF1YWQgc3lzX3N5bmNmcwogCS5xdWFkIGNvbXBhdF9zeXNfc2VuZG1tc2cJLyogMzQ1ICovCiAJLnF1YWQgc3lzX3NldG5zCisJLnF1YWQgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3JlYWR2CisJLnF1YWQgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldgogaWEzMl9zeXNjYWxsX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9uYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKaW5kZXggNjdmODdmMi4uOGU0MTA3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKQEAgLTE5LDkgKzE5LDE1IEBACiBleHRlcm4gaW50IGFtZF9nZXRfc3ViY2FjaGVzKGludCk7CiBleHRlcm4gaW50IGFtZF9zZXRfc3ViY2FjaGVzKGludCwgaW50KTsKIAorc3RydWN0IGFtZF9sM19jYWNoZSB7CisJdW5zaWduZWQgaW5kaWNlczsKKwl1OAkgc3ViY2FjaGVzWzRdOworfTsKKwogc3RydWN0IGFtZF9ub3J0aGJyaWRnZSB7CiAJc3RydWN0IHBjaV9kZXYgKm1pc2M7CiAJc3RydWN0IHBjaV9kZXYgKmxpbms7CisJc3RydWN0IGFtZF9sM19jYWNoZSBsM19jYWNoZTsKIH07CiAKIHN0cnVjdCBhbWRfbm9ydGhicmlkZ2VfaW5mbyB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmgKaW5kZXggMzQ1OTVkNS4uMzkyNWQ4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaApAQCAtMTAwLDcgKzEwMCw5IEBACiAjZGVmaW5lCQlBUElDX1RJTUVSX0JBU0VfQ0xLSU4JCTB4MAogI2RlZmluZQkJQVBJQ19USU1FUl9CQVNFX1RNQkFTRQkJMHgxCiAjZGVmaW5lCQlBUElDX1RJTUVSX0JBU0VfRElWCQkweDIKKyNkZWZpbmUJCUFQSUNfTFZUX1RJTUVSX09ORVNIT1QJCSgwIDw8IDE3KQogI2RlZmluZQkJQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMJCSgxIDw8IDE3KQorI2RlZmluZQkJQVBJQ19MVlRfVElNRVJfVFNDREVBRExJTkUJKDIgPDwgMTcpCiAjZGVmaW5lCQlBUElDX0xWVF9NQVNLRUQJCQkoMSA8PCAxNikKICNkZWZpbmUJCUFQSUNfTFZUX0xFVkVMX1RSSUdHRVIJCSgxIDw8IDE1KQogI2RlZmluZQkJQVBJQ19MVlRfUkVNT1RFX0lSUgkJKDEgPDwgMTQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcmNocmFuZG9tLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcmNocmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FyY2hyYW5kb20uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiBGZW5naHVhIFl1IDxmZW5naHVhLnl1QGludGVsLmNvbT4sCisgKiAgICAgICAgICBILiBQZXRlciBBbnZpbiA8aHBhQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEFTTV9YODZfQVJDSFJBTkRPTV9ICisjZGVmaW5lIEFTTV9YODZfQVJDSFJBTkRPTV9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KKyNpbmNsdWRlIDxhc20vbm9wcy5oPgorCisjZGVmaW5lIFJEUkFORF9SRVRSWV9MT09QUwkxMAorCisjZGVmaW5lIFJEUkFORF9JTlQJIi5ieXRlIDB4MGYsMHhjNywweGYwIgorI2lmZGVmIENPTkZJR19YODZfNjQKKyMgZGVmaW5lIFJEUkFORF9MT05HCSIuYnl0ZSAweDQ4LDB4MGYsMHhjNywweGYwIgorI2Vsc2UKKyMgZGVmaW5lIFJEUkFORF9MT05HCVJEUkFORF9JTlQKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisKKyNkZWZpbmUgR0VUX1JBTkRPTShuYW1lLCB0eXBlLCByZHJhbmQsIG5vcCkJCQlcCitzdGF0aWMgaW5saW5lIGludCBuYW1lKHR5cGUgKnYpCQkJCQlcCit7CQkJCQkJCQlcCisJaW50IG9rOwkJCQkJCQlcCisJYWx0ZXJuYXRpdmVfaW8oIm1vdmwgJDAsICUwXG5cdCIJCQlcCisJCSAgICAgICBub3AsCQkJCQlcCisJCSAgICAgICAiXG4xOiAiIHJkcmFuZCAiXG5cdCIJCQlcCisJCSAgICAgICAiamMgMmZcblx0IgkJCQlcCisJCSAgICAgICAiZGVjbCAlMFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAgICJqbnogMWJcblx0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgICAgIjI6IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSAgICAgICBYODZfRkVBVFVSRV9SRFJBTkQsICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAgIEFTTV9PVVRQVVQyKCI9ciIgKG9rKSwgIj1hIiAoKnYpKSwgICAgICAgXAorCQkgICAgICAgIjAiIChSRFJBTkRfUkVUUllfTE9PUFMpKTsJCVwKKwlyZXR1cm4gb2s7CQkJCQkJXAorfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCitHRVRfUkFORE9NKGFyY2hfZ2V0X3JhbmRvbV9sb25nLCB1bnNpZ25lZCBsb25nLCBSRFJBTkRfTE9ORywgQVNNX05PUDUpOworR0VUX1JBTkRPTShhcmNoX2dldF9yYW5kb21faW50LCB1bnNpZ25lZCBpbnQsIFJEUkFORF9JTlQsIEFTTV9OT1A0KTsKKworI2Vsc2UKKworR0VUX1JBTkRPTShhcmNoX2dldF9yYW5kb21fbG9uZywgdW5zaWduZWQgbG9uZywgUkRSQU5EX0xPTkcsIEFTTV9OT1AzKTsKK0dFVF9SQU5ET00oYXJjaF9nZXRfcmFuZG9tX2ludCwgdW5zaWduZWQgaW50LCBSRFJBTkRfSU5ULCBBU01fTk9QMyk7CisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCisKKyNlbmRpZiAgLyogQ09ORklHX0FSQ0hfUkFORE9NICovCisKK2V4dGVybiB2b2lkIHg4Nl9pbml0X3JkcmFuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCisjZW5kaWYgLyogQVNNX1g4Nl9BUkNIUkFORE9NX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMTA1NzJlMy4uNThjYjZkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE3MiwxOCArMTcyLDE0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKLQlpbnQgX19pOwogI2lmZGVmIENPTkZJR19NMzg2CisJaW50IF9faTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlmICh1bmxpa2VseShib290X2NwdV9kYXRhLng4NiA8PSAzKSkKIAkJZ290byBub194YWRkOwogI2VuZGlmCiAJLyogTW9kZXJuIDQ4NisgcHJvY2Vzc29yICovCi0JX19pID0gaTsKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInhhZGRsICUwLCAlMSIKLQkJICAgICA6ICIrciIgKGkpLCAiK20iICh2LT5jb3VudGVyKQotCQkgICAgIDogOiAibWVtb3J5Iik7Ci0JcmV0dXJuIGkgKyBfX2k7CisJcmV0dXJuIGkgKyB4YWRkKCZ2LT5jb3VudGVyLCBpKTsKIAogI2lmZGVmIENPTkZJR19NMzg2CiBub194YWRkOiAvKiBMZWdhY3kgMzg2IHByb2Nlc3NvciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljNjRfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYzY0XzY0LmgKaW5kZXggMDE3NTk0ZC4uMGUxY2JmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljNjRfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWM2NF82NC5oCkBAIC0xNzAsMTEgKzE3MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9hZGRfcmV0dXJuKGxvbmcgaSwgYXRvbWljNjRfdCAqdikKIHsKLQlsb25nIF9faSA9IGk7Ci0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJ4YWRkcSAlMCwgJTE7IgotCQkgICAgIDogIityIiAoaSksICIrbSIgKHYtPmNvdW50ZXIpCi0JCSAgICAgOiA6ICJtZW1vcnkiKTsKLQlyZXR1cm4gaSArIF9faTsKKwlyZXR1cm4gaSArIHhhZGQoJnYtPmNvdW50ZXIsIGkpOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgYXRvbWljNjRfc3ViX3JldHVybihsb25nIGksIGF0b21pYzY0X3QgKnYpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggYTQ2MGZhMC4uNWQzYWNkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaApAQCAtMSw1ICsxLDIxMCBAQAorI2lmbmRlZiBBU01fWDg2X0NNUFhDSEdfSAorI2RlZmluZSBBU01fWDg2X0NNUFhDSEdfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4gLyogUHJvdmlkZXMgTE9DS19QUkVGSVggKi8KKworLyoKKyAqIE5vbi1leGlzdGFudCBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdXNhZ2UgZXJyb3JzIGF0IGxpbmsgdGltZQorICogKG9yIGNvbXBpbGUtdGltZSBpZiB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBfX2NvbXBpbGV0aW1lX2Vycm9yKCkuCisgKi8KK2V4dGVybiB2b2lkIF9feGNoZ193cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIHhjaGciKTsKK2V4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIGNtcHhjaGciKTsKK2V4dGVybiB2b2lkIF9feGFkZF93cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIHhhZGQiKTsKKworLyoKKyAqIENvbnN0YW50cyBmb3Igb3BlcmF0aW9uIHNpemVzLiBPbiAzMi1iaXQsIHRoZSA2NC1iaXQgc2l6ZSBpdCBzZXQgdG8KKyAqIC0xIGJlY2F1c2Ugc2l6ZW9mIHdpbGwgbmV2ZXIgcmV0dXJuIC0xLCB0aGVyZWJ5IG1ha2luZyB0aG9zZSBzd2l0Y2gKKyAqIGNhc2Ugc3RhdGVtZW50cyBndWFyYW50ZWVlZCBkZWFkIGNvZGUgd2hpY2ggdGhlIGNvbXBpbGVyIHdpbGwKKyAqIGVsaW1pbmF0ZSwgYW5kIGFsbG93aW5nIHRoZSAibWlzc2luZyBzeW1ib2wgaW4gdGhlIGRlZmF1bHQgY2FzZSIgdG8KKyAqIGluZGljYXRlIGEgdXNhZ2UgZXJyb3IuCisgKi8KKyNkZWZpbmUgX19YODZfQ0FTRV9CCTEKKyNkZWZpbmUgX19YODZfQ0FTRV9XCTIKKyNkZWZpbmUgX19YODZfQ0FTRV9MCTQKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgX19YODZfQ0FTRV9RCTgKKyNlbHNlCisjZGVmaW5lCV9fWDg2X0NBU0VfUQktMQkJLyogc2l6ZW9mIHdpbGwgbmV2ZXIgcmV0dXJuIC0xICovCisjZW5kaWYKKworLyoKKyAqIE5vdGU6IG5vICJsb2NrIiBwcmVmaXggZXZlbiBvbiBTTVA6IHhjaGcgYWx3YXlzIGltcGxpZXMgbG9jayBhbnl3YXkuCisgKiBTaW5jZSB0aGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIHByb3RlY3Qgb3RoZXIgbWVtb3J5IGluZm9ybWF0aW9uLCB3ZQorICogdXNlICJhc20gdm9sYXRpbGUiIGFuZCAibWVtb3J5IiBjbG9iYmVycyB0byBwcmV2ZW50IGdjYyBmcm9tIG1vdmluZworICogaW5mb3JtYXRpb24gYXJvdW5kLgorICovCisjZGVmaW5lIF9feGNoZyh4LCBwdHIsIHNpemUpCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJX190eXBlb2YoKihwdHIpKSBfX3ggPSAoeCk7CQkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hnYiAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9cSIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MTYgKl9fcHRyID0gKHZvbGF0aWxlIHUxNiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUoInhjaGd3ICUwLCUxIgkJCQlcCisJCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICIwIiAoX194KQkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWNhc2UgX19YODZfQ0FTRV9MOgkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZSgieGNoZ2wgJTAsJTEiCQkJCVwKKwkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogIjAiIChfX3gpCQkJCVwKKwkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTY0ICpfX3B0ciA9ICh2b2xhdGlsZSB1NjQgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKCJ4Y2hncSAlMCwlMSIJCQkJXAorCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlkZWZhdWx0OgkJCQkJCQlcCisJCV9feGNoZ193cm9uZ19zaXplKCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCV9feDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgeGNoZyhwdHIsIHYpCQkJCQkJCVwKKwlfX3hjaGcoKHYpLCAocHRyKSwgc2l6ZW9mKCpwdHIpKQorCisvKgorICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKKyAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcworICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCisgKi8KKyNkZWZpbmUgX19yYXdfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplLCBsb2NrKQkJCVwKKyh7CQkJCQkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3JldDsJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQgPSAob2xkKTsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdiICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAicSIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWNhc2UgX19YODZfQ0FTRV9XOgkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCisJCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAlMiwlMSIJCQlcCisJCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCisJCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAorCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCQlcCisJewkJCQkJCQkJXAorCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAorCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2wgJTIsJTEiCQkJXAorCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAorCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKKwkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJdm9sYXRpbGUgdTY0ICpfX3B0ciA9ICh2b2xhdGlsZSB1NjQgKikocHRyKTsJCVwKKwkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdxICUyLCUxIgkJCVwKKwkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKKwkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCisJCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkJX19jbXB4Y2hnX3dyb25nX3NpemUoKTsJCQkJCVwKKwl9CQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQkJXAorCV9fcmF3X2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgKHNpemUpLCBMT0NLX1BSRUZJWCkKKworI2RlZmluZSBfX3N5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQlcCisJX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksICJsb2NrOyAiKQorCisjZGVmaW5lIF9fY21weGNoZ19sb2NhbChwdHIsIG9sZCwgbmV3LCBzaXplKQkJCQlcCisJX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksICIiKQorCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogIyBpbmNsdWRlICJjbXB4Y2hnXzMyLmgiCiAjZWxzZQogIyBpbmNsdWRlICJjbXB4Y2hnXzY0LmgiCiAjZW5kaWYKKworI2lmZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKKyNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKKwlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQorCisjZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAorCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKKworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCisJX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKKyNlbmRpZgorCisjZGVmaW5lIF9feGFkZChwdHIsIGluYywgbG9jaykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkgICAgICAgIF9fdHlwZW9mX18gKCoocHRyKSkgX19yZXQgPSAoaW5jKTsJCQlcCisJCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGIgJWIwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZHcgJXcwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGwgJTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJXAorCQkJYXNtIHZvbGF0aWxlIChsb2NrICJ4YWRkcSAlcTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWRlZmF1bHQ6CQkJCQkJXAorCQkJX194YWRkX3dyb25nX3NpemUoKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJX19yZXQ7CQkJCQkJCVwKKwl9KQorCisvKgorICogeGFkZCgpIGFkZHMgImluYyIgdG8gIipwdHIiIGFuZCBhdG9taWNhbGx5IHJldHVybnMgdGhlIHByZXZpb3VzCisgKiB2YWx1ZSBvZiAiKnB0ciIuCisgKgorICogeGFkZCgpIGlzIGxvY2tlZCB3aGVuIG11bHRpcGxlIENQVXMgYXJlIG9ubGluZQorICogeGFkZF9zeW5jKCkgaXMgYWx3YXlzIGxvY2tlZAorICogeGFkZF9sb2NhbCgpIGlzIG5ldmVyIGxvY2tlZAorICovCisjZGVmaW5lIHhhZGQocHRyLCBpbmMpCQlfX3hhZGQoKHB0ciksIChpbmMpLCBMT0NLX1BSRUZJWCkKKyNkZWZpbmUgeGFkZF9zeW5jKHB0ciwgaW5jKQlfX3hhZGQoKHB0ciksIChpbmMpLCAibG9jazsgIikKKyNkZWZpbmUgeGFkZF9sb2NhbChwdHIsIGluYykJX194YWRkKChwdHIpLCAoaW5jKSwgIiIpCisKKyNlbmRpZgkvKiBBU01fWDg2X0NNUFhDSEdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCmluZGV4IDNkZWI3MjUuLmZiZWJiMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKQEAgLTEsNjEgKzEsMTEgQEAKICNpZm5kZWYgX0FTTV9YODZfQ01QWENIR18zMl9ICiAjZGVmaW5lIF9BU01fWDg2X0NNUFhDSEdfMzJfSAogCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+IC8qIGZvciBMT0NLX1BSRUZJWCAqLwotCiAvKgogICogTm90ZTogaWYgeW91IHVzZSBzZXQ2NF9iaXQoKSwgX19jbXB4Y2hnNjQoKSwgb3IgdGhlaXIgdmFyaWFudHMsIHlvdQogICogICAgICAgeW91IG5lZWQgdG8gdGVzdCBmb3IgdGhlIGZlYXR1cmUgaW4gYm9vdF9jcHVfZGF0YS4KICAqLwogCi1leHRlcm4gdm9pZCBfX3hjaGdfd3Jvbmdfc2l6ZSh2b2lkKTsKLQotLyoKLSAqIE5vdGU6IG5vICJsb2NrIiBwcmVmaXggZXZlbiBvbiBTTVA6IHhjaGcgYWx3YXlzIGltcGxpZXMgbG9jayBhbnl3YXkuCi0gKiBTaW5jZSB0aGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIHByb3RlY3Qgb3RoZXIgbWVtb3J5IGluZm9ybWF0aW9uLCB3ZQotICogdXNlICJhc20gdm9sYXRpbGUiIGFuZCAibWVtb3J5IiBjbG9iYmVycyB0byBwcmV2ZW50IGdjYyBmcm9tIG1vdmluZwotICogaW5mb3JtYXRpb24gYXJvdW5kLgotICovCi0jZGVmaW5lIF9feGNoZyh4LCBwdHIsIHNpemUpCQkJCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2YoKihwdHIpKSBfX3ggPSAoeCk7CQkJCQlcCi0Jc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKCJ4Y2hnYiAlMCwlMSIJCQkJXAotCQkJICAgICA6ICI9cSIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDI6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1MTYgKl9fcHRyID0gKHZvbGF0aWxlIHUxNiAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGd3ICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgNDoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ2wgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX3hjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3g7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHhjaGcocHRyLCB2KQkJCQkJCQlcCi0JX194Y2hnKCh2KSwgKHB0ciksIHNpemVvZigqcHRyKSkKLQogLyoKICAqIENNUFhDSEc4QiBvbmx5IHdyaXRlcyB0byB0aGUgdGFyZ2V0IGlmIHdlIGhhZCB0aGUgcHJldmlvdXMKICAqIHZhbHVlIGluIHJlZ2lzdGVycywgb3RoZXJ3aXNlIGl0IGFjdHMgYXMgYSByZWFkIGFuZCBnaXZlcyB1cyB0aGUKQEAgLTg0LDcyICszNCw4IEBACiAJCSAgICAgOiAibWVtb3J5Iik7CiB9CiAKLWV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwotCi0vKgotICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKLSAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcwotICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCi0gKi8KLSNkZWZpbmUgX19yYXdfY21weGNoZyhwdHIsIG9sZCwgbmV3LCBzaXplLCBsb2NrKQkJCVwKLSh7CQkJCQkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX3JldDsJCQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQgPSAob2xkKTsJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldyA9IChuZXcpOwkJCQlcCi0Jc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1OCAqX19wdHIgPSAodm9sYXRpbGUgdTggKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGdiICUyLCUxIgkJCVwKLQkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAicSIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgMjoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hndyAlMiwlMSIJCQlcCi0JCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDQ6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2wgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX2NtcHhjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCQlcCi0JX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksIExPQ0tfUFJFRklYKQotCi0jZGVmaW5lIF9fc3luY19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgImxvY2s7ICIpCi0KLSNkZWZpbmUgX19jbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgIiIpCi0KICNpZmRlZiBDT05GSUdfWDg2X0NNUFhDSEcKICNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCi0KLSNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKLQlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQotCi0jZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAotCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCi0JX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9DTVBYQ0hHNjQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaAppbmRleCA3Y2Y1YzBhLi4yODVkYTAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oCkBAIC0xLDE0NCArMSwxMyBAQAogI2lmbmRlZiBfQVNNX1g4Nl9DTVBYQ0hHXzY0X0gKICNkZWZpbmUgX0FTTV9YODZfQ01QWENIR182NF9ICiAKLSNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4gLyogUHJvdmlkZXMgTE9DS19QUkVGSVggKi8KLQogc3RhdGljIGlubGluZSB2b2lkIHNldF82NGJpdCh2b2xhdGlsZSB1NjQgKnB0ciwgdTY0IHZhbCkKIHsKIAkqcHRyID0gdmFsOwogfQogCi1leHRlcm4gdm9pZCBfX3hjaGdfd3Jvbmdfc2l6ZSh2b2lkKTsKLWV4dGVybiB2b2lkIF9fY21weGNoZ193cm9uZ19zaXplKHZvaWQpOwotCi0vKgotICogTm90ZTogbm8gImxvY2siIHByZWZpeCBldmVuIG9uIFNNUDogeGNoZyBhbHdheXMgaW1wbGllcyBsb2NrIGFueXdheS4KLSAqIFNpbmNlIHRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gcHJvdGVjdCBvdGhlciBtZW1vcnkgaW5mb3JtYXRpb24sIHdlCi0gKiB1c2UgImFzbSB2b2xhdGlsZSIgYW5kICJtZW1vcnkiIGNsb2JiZXJzIHRvIHByZXZlbnQgZ2NjIGZyb20gbW92aW5nCi0gKiBpbmZvcm1hdGlvbiBhcm91bmQuCi0gKi8KLSNkZWZpbmUgX194Y2hnKHgsIHB0ciwgc2l6ZSkJCQkJCQlcCi0oewkJCQkJCQkJCVwKLQlfX3R5cGVvZigqKHB0cikpIF9feCA9ICh4KTsJCQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHU4ICpfX3B0ciA9ICh2b2xhdGlsZSB1OCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdiICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1xIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgMjoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUxNiAqX19wdHIgPSAodm9sYXRpbGUgdTE2ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ3cgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2FzZSA0OgkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTMyICpfX3B0ciA9ICh2b2xhdGlsZSB1MzIgKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKCJ4Y2hnbCAlMCwlMSIJCQkJXAotCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDg6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1NjQgKl9fcHRyID0gKHZvbGF0aWxlIHU2NCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdxICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWRlZmF1bHQ6CQkJCQkJCVwKLQkJX194Y2hnX3dyb25nX3NpemUoKTsJCQkJCVwKLQl9CQkJCQkJCQlcCi0JX194OwkJCQkJCQkJXAotfSkKLQotI2RlZmluZSB4Y2hnKHB0ciwgdikJCQkJCQkJXAotCV9feGNoZygodiksIChwdHIpLCBzaXplb2YoKnB0cikpCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCiAKLS8qCi0gKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAotICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCi0gKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KLSAqLwotI2RlZmluZSBfX3Jhd19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUsIGxvY2spCQkJXAotKHsJCQkJCQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fcmV0OwkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZCA9IChvbGQpOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fbmV3ID0gKG5ldyk7CQkJCVwKLQlzd2l0Y2ggKHNpemUpIHsJCQkJCQkJXAotCWNhc2UgMToJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHU4ICpfX3B0ciA9ICh2b2xhdGlsZSB1OCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ2IgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJxIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2FzZSAyOgkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKGxvY2sgImNtcHhjaGd3ICUyLCUxIgkJCVwKLQkJCSAgICAgOiAiPWEiIChfX3JldCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiciIgKF9fbmV3KSwgIjAiIChfX29sZCkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgNDoJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHUzMiAqX19wdHIgPSAodm9sYXRpbGUgdTMyICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZShsb2NrICJjbXB4Y2hnbCAlMiwlMSIJCQlcCi0JCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogInIiIChfX25ldyksICIwIiAoX19vbGQpCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIDg6CQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1NjQgKl9fcHRyID0gKHZvbGF0aWxlIHU2NCAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUobG9jayAiY21weGNoZ3EgJTIsJTEiCQkJXAotCQkJICAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICJyIiAoX19uZXcpLCAiMCIgKF9fb2xkKQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX2NtcHhjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCQlcCi0JX19yYXdfY21weGNoZygocHRyKSwgKG9sZCksIChuZXcpLCAoc2l6ZSksIExPQ0tfUFJFRklYKQotCi0jZGVmaW5lIF9fc3luY19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgImxvY2s7ICIpCi0KLSNkZWZpbmUgX19jbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcsIHNpemUpCQkJCVwKLQlfX3Jhd19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIChzaXplKSwgIiIpCi0KLSNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJCVwKLQlfX2NtcHhjaGcoKHB0ciksIChvbGQpLCAobmV3KSwgc2l6ZW9mKCpwdHIpKQotCi0jZGVmaW5lIHN5bmNfY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJCQkJXAotCV9fc3luY19jbXB4Y2hnKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgb2xkLCBuZXcpCQkJCQlcCi0JX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKLQogI2RlZmluZSBjbXB4Y2hnNjQocHRyLCBvLCBuKQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaAppbmRleCAxZDljZDI3Li4zMGQ3MzdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaApAQCAtMTA4LDcgKzEwOCw4IEBACiAJY29tcGF0X2ZzaWRfdAlmX2ZzaWQ7CiAJaW50CQlmX25hbWVsZW47CS8qIFN1bk9TIGlnbm9yZXMgdGhpcyBmaWVsZC4gKi8KIAlpbnQJCWZfZnJzaXplOwotCWludAkJZl9zcGFyZVs1XTsKKwlpbnQJCWZfZmxhZ3M7CisJaW50CQlmX3NwYXJlWzRdOwogfTsKIAogI2RlZmluZSBDT01QQVRfUkxJTV9PTERfSU5GSU5JVFkJMHg3ZmZmZmZmZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IDg4YjIzYTQuLmYzNDQ0ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTExNCwxMiArMTE0LDE0IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYMTYJKDQqMzIrMTMpIC8qIENNUFhDSEcxNkIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFRQUgkoNCozMisxNCkgLyogU2VuZCBUYXNrIFByaW9yaXR5IE1lc3NhZ2VzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BEQ00JKDQqMzIrMTUpIC8qIFBlcmZvcm1hbmNlIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQ0lECSg0KjMyKzE3KSAvKiBQcm9jZXNzIENvbnRleHQgSWRlbnRpZmllcnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRENBCQkoNCozMisxOCkgLyogRGlyZWN0IENhY2hlIEFjY2VzcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU00XzEJKDQqMzIrMTkpIC8qICJzc2U0XzEiIFNTRS00LjEgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8yCSg0KjMyKzIwKSAvKiAic3NlNF8yIiBTU0UtNC4yICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1gyQVBJQwkoNCozMisyMSkgLyogeDJBUElDICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01PVkJFCSg0KjMyKzIyKSAvKiBNT1ZCRSBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9QT1BDTlQgICAgICAoNCozMisyMykgLyogUE9QQ05UIGluc3RydWN0aW9uICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQ19ERUFETElORV9USU1FUgkoNCozMisyNCkgLyogVHNjIGRlYWRsaW5lIHRpbWVyICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FFUwkJKDQqMzIrMjUpIC8qIEFFUyBpbnN0cnVjdGlvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNBVkUJKDQqMzIrMjYpIC8qIFhTQVZFL1hSU1RPUi9YU0VUQlYvWEdFVEJWICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX09TWFNBVkUJKDQqMzIrMjcpIC8qICIiIFhTQVZFIGVuYWJsZWQgaW4gdGhlIE9TICovCkBAIC0yNTcsNyArMjU5LDkgQEAKICNkZWZpbmUgY3B1X2hhc194bW0JCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9YTU0pCiAjZGVmaW5lIGNwdV9oYXNfeG1tMgkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTIpCiAjZGVmaW5lIGNwdV9oYXNfeG1tMwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTMpCisjZGVmaW5lIGNwdV9oYXNfc3NzZTMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TU1NFMykKICNkZWZpbmUgY3B1X2hhc19hZXMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BRVMpCisjZGVmaW5lIGNwdV9oYXNfYXZ4CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYKQogI2RlZmluZSBjcHVfaGFzX2h0CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSFQpCiAjZGVmaW5lIGNwdV9oYXNfbXAJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9NUCkKICNkZWZpbmUgY3B1X2hhc19ueAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05YKQpAQCAtMjg1LDYgKzI4OSw3IEBACiAjZGVmaW5lIGNwdV9oYXNfeG1tNF8yCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWE1NNF8yKQogI2RlZmluZSBjcHVfaGFzX3gyYXBpYwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1gyQVBJQykKICNkZWZpbmUgY3B1X2hhc194c2F2ZQkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hTQVZFKQorI2RlZmluZSBjcHVfaGFzX29zeHNhdmUJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9PU1hTQVZFKQogI2RlZmluZSBjcHVfaGFzX2h5cGVydmlzb3IJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0hZUEVSVklTT1IpCiAjZGVmaW5lIGNwdV9oYXNfcGNsbXVscWRxCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QQ0xNVUxRRFEpCiAjZGVmaW5lIGNwdV9oYXNfcGVyZmN0cl9jb3JlCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QRVJGQ1RSX0NPUkUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGYyYWQyMTYuLjVmOTYyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCkBAIC00LDYgKzQsNyBAQAogLyoKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS91c2VyLmg+CkBAIC0zMjAsNCArMzIxLDM0IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCiAKKy8qCisgKiBUcnVlIG9uIFg4Nl8zMiBvciB3aGVuIGVtdWxhdGluZyBJQTMyIG9uIFg4Nl82NAorICovCitzdGF0aWMgaW5saW5lIGludCBtbWFwX2lzX2lhMzIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJcmV0dXJuIDE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBmaXJzdCB0d28gdmFsdWVzIGFyZSBzcGVjaWFsLCBkbyBub3QgY2hhbmdlLiBTZWUgYWxpZ25fYWRkcigpICovCitlbnVtIGFsaWduX2ZsYWdzIHsKKwlBTElHTl9WQV8zMgk9IEJJVCgwKSwKKwlBTElHTl9WQV82NAk9IEJJVCgxKSwKKwlBTElHTl9WRFNPCT0gQklUKDIpLAorCUFMSUdOX1RPUERPV04JPSBCSVQoMyksCit9OworCitzdHJ1Y3QgdmFfYWxpZ25tZW50IHsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXNrOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK2V4dGVybiBzdHJ1Y3QgdmFfYWxpZ25tZW50IHZhX2FsaWduOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkcih1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZmlsZSAqLCBlbnVtIGFsaWduX2ZsYWdzKTsKICNlbmRpZiAvKiBfQVNNX1g4Nl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCmluZGV4IDI5ZjY2NzkuLjQ0MjA5OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KICNkZWZpbmUgIF9BU01fWDg2X0lOVEVMX1NDVV9JUENfSF8KIAorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKICNkZWZpbmUgSVBDTVNHX1ZSVEMJMHhGQQkgLyogU2V0IHZSVEMgZGV2aWNlICovCiAKIC8qIENvbW1hbmQgaWQgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2UgSVBDTVNHX1ZSVEMgKi8KQEAgLTQ0LDQgKzQ2LDI0IEBACiAvKiBVcGRhdGUgRlcgdmVyc2lvbiAqLwogaW50IGludGVsX3NjdV9pcGNfZndfdXBkYXRlKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpOwogCitleHRlcm4gc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgaW50ZWxfc2N1X25vdGlmaWVyOworCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfc2N1X25vdGlmaWVyX2FkZChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpbnRlbF9zY3Vfbm90aWZpZXIsIG5iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX3NjdV9ub3RpZmllcl9yZW1vdmUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZpbnRlbF9zY3Vfbm90aWZpZXIsIG5iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW50ZWxfc2N1X25vdGlmaWVyX3Bvc3QodW5zaWduZWQgbG9uZyB2LCB2b2lkICpwKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZpbnRlbF9zY3Vfbm90aWZpZXIsIHYsIHApOworfQorCisjZGVmaW5lCQlTQ1VfQVZBSUxBQkxFCQkxCisjZGVmaW5lCQlTQ1VfRE9XTgkJMgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCmluZGV4IDYwNDBkMTEuLmEwMjY1MDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaApAQCAtMjYyLDcgKzI2Miw3IEBACiAJc3RydWN0IG9wZXJhbmQgZHN0OwogCWJvb2wgaGFzX3NlZ19vdmVycmlkZTsKIAl1OCBzZWdfb3ZlcnJpZGU7Ci0JdW5zaWduZWQgaW50IGQ7CisJdTY0IGQ7CiAJaW50ICgqZXhlY3V0ZSkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpOwogCWludCAoKmNoZWNrX3Blcm0pKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KTsKIAkvKiBtb2RybSAqLwpAQCAtMjc1LDYgKzI3NSw4IEBACiAJdW5zaWduZWQgbG9uZyBfZWlwOwogCS8qIEZpZWxkcyBhYm92ZSByZWdzIGFyZSBjbGVhcmVkIHRvZ2V0aGVyLiAqLwogCXVuc2lnbmVkIGxvbmcgcmVnc1tOUl9WQ1BVX1JFR1NdOworCXN0cnVjdCBvcGVyYW5kIG1lbW9wOworCXN0cnVjdCBvcGVyYW5kICptZW1vcHA7CiAJc3RydWN0IGZldGNoX2NhY2hlIGZldGNoOwogCXN0cnVjdCByZWFkX2NhY2hlIGlvX3JlYWQ7CiAJc3RydWN0IHJlYWRfY2FjaGUgbWVtX3JlYWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBkZDUxYzgzLi5iNDk3M2Y0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTI2LDcgKzI2LDggQEAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KIAotI2RlZmluZSBLVk1fTUFYX1ZDUFVTIDY0CisjZGVmaW5lIEtWTV9NQVhfVkNQVVMgMjU0CisjZGVmaW5lIEtWTV9TT0ZUX01BWF9WQ1BVUyA2NAogI2RlZmluZSBLVk1fTUVNT1JZX1NMT1RTIDMyCiAvKiBtZW1vcnkgc2xvdHMgdGhhdCBkb2VzIG5vdCBleHBvc2VkIHRvIHVzZXJzcGFjZSAqLwogI2RlZmluZSBLVk1fUFJJVkFURV9NRU1fU0xPVFMgNApAQCAtMjY0LDYgKzI2NSw3IEBACiAJdm9pZCAoKm5ld19jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnNldF9jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByb290KTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X2NyMykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl1NjQgKCpnZXRfcGRwdHIpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGluZGV4KTsKIAlpbnQgKCpwYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgdTMyIGVyciwKIAkJCSAgYm9vbCBwcmVmYXVsdCk7CiAJdm9pZCAoKmluamVjdF9wYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC00MTEsOCArNDEzLDkgQEAKIAl1MzIgIHRzY19jYXRjaHVwX211bHQ7CiAJczggICB0c2NfY2F0Y2h1cF9zaGlmdDsKIAotCWJvb2wgbm1pX3BlbmRpbmc7Ci0JYm9vbCBubWlfaW5qZWN0ZWQ7CisJYXRvbWljX3Qgbm1pX3F1ZXVlZDsgIC8qIHVucHJvY2Vzc2VkIGFzeW5jaHJvbm91cyBOTUlzICovCisJdW5zaWduZWQgbm1pX3BlbmRpbmc7IC8qIE5NSSBxdWV1ZWQgYWZ0ZXIgY3VycmVudGx5IHJ1bm5pbmcgaGFuZGxlciAqLworCWJvb2wgbm1pX2luamVjdGVkOyAgICAvKiBUcnlpbmcgdG8gaW5qZWN0IGFuIE5NSSB0aGlzIGVudHJ5ICovCiAKIAlzdHJ1Y3QgbXRycl9zdGF0ZV90eXBlIG10cnJfc3RhdGU7CiAJdTMyIHBhdDsKQEAgLTYyOCwxNCArNjMxLDEzIEBACiAJdm9pZCAoKndyaXRlX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCk7CiAKIAl1NjQgKCpjb21wdXRlX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHRhcmdldF90c2MpOworCXU2NCAoKnJlYWRfbDFfdHNjKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAJdm9pZCAoKmdldF9leGl0X2luZm8pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICppbmZvMSwgdTY0ICppbmZvMik7CiAKIAlpbnQgKCpjaGVja19pbnRlcmNlcHQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICAgICBzdHJ1Y3QgeDg2X2luc3RydWN0aW9uX2luZm8gKmluZm8sCiAJCQkgICAgICAgZW51bSB4ODZfaW50ZXJjZXB0X3N0YWdlIHN0YWdlKTsKLQotCWNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqZXhpdF9yZWFzb25zX3N0cjsKIH07CiAKIHN0cnVjdCBrdm1fYXJjaF9hc3luY19wZiB7CkBAIC02NzIsNiArNjc0LDggQEAKIAogZXh0ZXJuIGJvb2wgdGRwX2VuYWJsZWQ7CiAKK3U2NCB2Y3B1X3RzY19raHooc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwogLyogY29udHJvbCBvZiBndWVzdCB0c2MgcmF0ZSBzdXBwb3J0ZWQ/ICovCiBleHRlcm4gYm9vbCBrdm1faGFzX3RzY19jb250cm9sOwogLyogbWluaW11bSBzdXBwb3J0ZWQgdHNjX2toeiBmb3IgZ3Vlc3RzICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCmluZGV4IGQ1MjYwOWEuLmE2OTYyZDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci1pbmRleC5oCkBAIC0yMjksNiArMjI5LDggQEAKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFCSgxPDwxMSkKICNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRQkJKDB4ZmZmZmY8PDEyKQogCisjZGVmaW5lIE1TUl9JQTMyX1RTQ0RFQURMSU5FCQkweDAwMDAwNmUwCisKICNkZWZpbmUgTVNSX0lBMzJfVUNPREVfV1JJVEUJCTB4MDAwMDAwNzkKICNkZWZpbmUgTVNSX0lBMzJfVUNPREVfUkVWCQkweDAwMDAwMDhiCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaAppbmRleCA3MDQ1MjY3Li5lMzgxOTc4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCkBAIC05OSwxMCArOTksMTAgQEAKIAkJCQkJCWludCByZWcsIGludCBsZW4sIHUzMiB2YWwpOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfcmF3X29wcyAqcmF3X3BjaV9vcHM7Ci1leHRlcm4gc3RydWN0IHBjaV9yYXdfb3BzICpyYXdfcGNpX2V4dF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICpyYXdfcGNpX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfZXh0X29wczsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxOwogZXh0ZXJuIGJvb2wgcG9ydF9jZjlfc2FmZTsKIAogLyogYXJjaF9pbml0Y2FsbCBsZXZlbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAwZDExNzFjLi5iNjUwNDM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTExLDYgKzExMSw3IEBACiAJLyogSW5kZXggaW50byBwZXJfY3B1IGxpc3Q6ICovCiAJdTE2CQkJY3B1X2luZGV4OwogI2VuZGlmCisJdTMyCQkJbWljcm9jb2RlOwogfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhTTVBfQ0FDSEVfQllURVMpKSk7CiAKICNkZWZpbmUgWDg2X1ZFTkRPUl9JTlRFTAkwCkBAIC0xNzksNyArMTgwLDggQEAKIAkgICAgICAiPWIiICgqZWJ4KSwKIAkgICAgICAiPWMiICgqZWN4KSwKIAkgICAgICAiPWQiICgqZWR4KQotCSAgICA6ICIwIiAoKmVheCksICIyIiAoKmVjeCkpOworCSAgICA6ICIwIiAoKmVheCksICIyIiAoKmVjeCkKKwkgICAgOiAibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2NyMyhwZ2RfdCAqcGdkaXIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaAppbmRleCBkZjRjZDMyLi4yZGJlNGE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKQEAgLTIwNCwxMyArMjA0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBsb25nIHJ3c2VtX2F0b21pY191cGRhdGUobG9uZyBkZWx0YSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewotCWxvbmcgdG1wID0gZGVsdGE7Ci0KLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInhhZGQgJTAsJTEiCi0JCSAgICAgOiAiK3IiICh0bXApLCAiK20iIChzZW0tPmNvdW50KQotCQkgICAgIDogOiAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gdG1wICsgZGVsdGE7CisJcmV0dXJuIGRlbHRhICsgeGFkZCgmc2VtLT5jb3VudCwgZGVsdGEpOwogfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggZWU2N2VkZi4uOTcyYzI2MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC00OSwxMDkgKzQ5LDQ5IEBACiAgKiBpc3N1ZXMgYW5kIHNob3VsZCBiZSBvcHRpbWFsIGZvciB0aGUgdW5jb250ZW5kZWQgY2FzZS4gTm90ZSB0aGUgdGFpbCBtdXN0IGJlCiAgKiBpbiB0aGUgaGlnaCBwYXJ0LCBiZWNhdXNlIGEgd2lkZSB4YWRkIGluY3JlbWVudCBvZiB0aGUgbG93IHBhcnQgd291bGQgY2FycnkKICAqIHVwIGFuZCBjb250YW1pbmF0ZSB0aGUgaGlnaCBwYXJ0LgotICoKLSAqIFdpdGggZmV3ZXIgdGhhbiAyXjggcG9zc2libGUgQ1BVcywgd2UgY2FuIHVzZSB4ODYncyBwYXJ0aWFsIHJlZ2lzdGVycyB0bwotICogc2F2ZSBzb21lIGluc3RydWN0aW9ucyBhbmQgbWFrZSB0aGUgY29kZSBtb3JlIGVsZWdhbnQuIFRoZXJlIHJlYWxseSBpc24ndAotICogbXVjaCBiZXR3ZWVuIHRoZW0gaW4gcGVyZm9ybWFuY2UgdGhvdWdoLCBlc3BlY2lhbGx5IGFzIGxvY2tzIGFyZSBvdXQgb2YgbGluZS4KICAqLwotI2lmIChOUl9DUFVTIDwgMjU2KQotI2RlZmluZSBUSUNLRVRfU0hJRlQgOAotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl9sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlzaG9ydCBpbmMgPSAweDAxMDA7CisJcmVnaXN0ZXIgc3RydWN0IF9fcmF3X3RpY2tldHMgaW5jID0geyAudGFpbCA9IDEgfTsKIAotCWFzbSB2b2xhdGlsZSAoCi0JCUxPQ0tfUFJFRklYICJ4YWRkdyAldzAsICUxXG4iCi0JCSIxOlx0IgotCQkiY21wYiAlaDAsICViMFxuXHQiCi0JCSJqZSAyZlxuXHQiCi0JCSJyZXAgOyBub3Bcblx0IgotCQkibW92YiAlMSwgJWIwXG5cdCIKLQkJLyogZG9uJ3QgbmVlZCBsZmVuY2UgaGVyZSwgYmVjYXVzZSBsb2FkcyBhcmUgaW4tb3JkZXIgKi8KLQkJImptcCAxYlxuIgotCQkiMjoiCi0JCTogIitRIiAoaW5jKSwgIittIiAobG9jay0+c2xvY2spCi0JCToKLQkJOiAibWVtb3J5IiwgImNjIik7CisJaW5jID0geGFkZCgmbG9jay0+dGlja2V0cywgaW5jKTsKKworCWZvciAoOzspIHsKKwkJaWYgKGluYy5oZWFkID09IGluYy50YWlsKQorCQkJYnJlYWs7CisJCWNwdV9yZWxheCgpOworCQlpbmMuaGVhZCA9IEFDQ0VTU19PTkNFKGxvY2stPnRpY2tldHMuaGVhZCk7CisJfQorCWJhcnJpZXIoKTsJCS8qIG1ha2Ugc3VyZSBub3RoaW5nIGNyZWVwcyBiZWZvcmUgdGhlIGxvY2sgaXMgdGFrZW4gKi8KIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX190aWNrZXRfc3Bpbl90cnlsb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlpbnQgdG1wLCBuZXc7CisJYXJjaF9zcGlubG9ja190IG9sZCwgbmV3OwogCi0JYXNtIHZvbGF0aWxlKCJtb3Z6d2wgJTIsICUwXG5cdCIKLQkJICAgICAiY21wYiAlaDAsJWIwXG5cdCIKLQkJICAgICAibGVhbCAweDEwMCglIiBSRUdfUFRSX01PREUgIjApLCAlMVxuXHQiCi0JCSAgICAgImpuZSAxZlxuXHQiCi0JCSAgICAgTE9DS19QUkVGSVggImNtcHhjaGd3ICV3MSwlMlxuXHQiCi0JCSAgICAgIjE6IgotCQkgICAgICJzZXRlICViMVxuXHQiCi0JCSAgICAgIm1vdnpibCAlYjEsJTBcblx0IgotCQkgICAgIDogIj0mYSIgKHRtcCksICI9JnEiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7CisJb2xkLnRpY2tldHMgPSBBQ0NFU1NfT05DRShsb2NrLT50aWNrZXRzKTsKKwlpZiAob2xkLnRpY2tldHMuaGVhZCAhPSBvbGQudGlja2V0cy50YWlsKQorCQlyZXR1cm4gMDsKIAotCXJldHVybiB0bXA7CisJbmV3LmhlYWRfdGFpbCA9IG9sZC5oZWFkX3RhaWwgKyAoMSA8PCBUSUNLRVRfU0hJRlQpOworCisJLyogY21weGNoZyBpcyBhIGZ1bGwgYmFycmllciwgc28gbm90aGluZyBjYW4gbW92ZSBiZWZvcmUgaXQgKi8KKwlyZXR1cm4gY21weGNoZygmbG9jay0+aGVhZF90YWlsLCBvbGQuaGVhZF90YWlsLCBuZXcuaGVhZF90YWlsKSA9PSBvbGQuaGVhZF90YWlsOwogfQogCisjaWYgKE5SX0NQVVMgPCAyNTYpCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQogewogCWFzbSB2b2xhdGlsZShVTkxPQ0tfTE9DS19QUkVGSVggImluY2IgJTAiCi0JCSAgICAgOiAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICIrbSIgKGxvY2stPmhlYWRfdGFpbCkKIAkJICAgICA6CiAJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CiB9CiAjZWxzZQotI2RlZmluZSBUSUNLRVRfU0hJRlQgMTYKLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fdGlja2V0X3NwaW5fbG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IGluYyA9IDB4MDAwMTAwMDA7Ci0JaW50IHRtcDsKLQotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAieGFkZGwgJTAsICUxXG4iCi0JCSAgICAgIm1vdnp3bCAldzAsICUyXG5cdCIKLQkJICAgICAic2hybCAkMTYsICUwXG5cdCIKLQkJICAgICAiMTpcdCIKLQkJICAgICAiY21wbCAlMCwgJTJcblx0IgotCQkgICAgICJqZSAyZlxuXHQiCi0JCSAgICAgInJlcCA7IG5vcFxuXHQiCi0JCSAgICAgIm1vdnp3bCAlMSwgJTJcblx0IgotCQkgICAgIC8qIGRvbid0IG5lZWQgbGZlbmNlIGhlcmUsIGJlY2F1c2UgbG9hZHMgYXJlIGluLW9yZGVyICovCi0JCSAgICAgImptcCAxYlxuIgotCQkgICAgICIyOiIKLQkJICAgICA6ICIrciIgKGluYyksICIrbSIgKGxvY2stPnNsb2NrKSwgIj0mciIgKHRtcCkKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fdGlja2V0X3NwaW5fdHJ5bG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IHRtcDsKLQlpbnQgbmV3OwotCi0JYXNtIHZvbGF0aWxlKCJtb3ZsICUyLCUwXG5cdCIKLQkJICAgICAibW92bCAlMCwlMVxuXHQiCi0JCSAgICAgInJvbGwgJDE2LCAlMFxuXHQiCi0JCSAgICAgImNtcGwgJTAsJTFcblx0IgotCQkgICAgICJsZWFsIDB4MDAwMTAwMDAoJSIgUkVHX1BUUl9NT0RFICIwKSwgJTFcblx0IgotCQkgICAgICJqbmUgMWZcblx0IgotCQkgICAgIExPQ0tfUFJFRklYICJjbXB4Y2hnbCAlMSwlMlxuXHQiCi0JCSAgICAgIjE6IgotCQkgICAgICJzZXRlICViMVxuXHQiCi0JCSAgICAgIm1vdnpibCAlYjEsJTBcblx0IgotCQkgICAgIDogIj0mYSIgKHRtcCksICI9JnEiIChuZXcpLCAiK20iIChsb2NrLT5zbG9jaykKLQkJICAgICA6Ci0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7Ci0KLQlyZXR1cm4gdG1wOwotfQotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQogewogCWFzbSB2b2xhdGlsZShVTkxPQ0tfTE9DS19QUkVGSVggImluY3cgJTAiCi0JCSAgICAgOiAiK20iIChsb2NrLT5zbG9jaykKKwkJICAgICA6ICIrbSIgKGxvY2stPmhlYWRfdGFpbCkKIAkJICAgICA6CiAJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CiB9CkBAIC0xNTksMTYgKzk5LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fdGlja2V0X3NwaW5faXNfbG9ja2VkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlpbnQgdG1wID0gQUNDRVNTX09OQ0UobG9jay0+c2xvY2spOworCXN0cnVjdCBfX3Jhd190aWNrZXRzIHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnRpY2tldHMpOwogCi0JcmV0dXJuICEhKCgodG1wID4+IFRJQ0tFVF9TSElGVCkgXiB0bXApICYgKCgxIDw8IFRJQ0tFVF9TSElGVCkgLSAxKSk7CisJcmV0dXJuICEhKHRtcC50YWlsIF4gdG1wLmhlYWQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2NvbnRlbmRlZChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0JaW50IHRtcCA9IEFDQ0VTU19PTkNFKGxvY2stPnNsb2NrKTsKKwlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBBQ0NFU1NfT05DRShsb2NrLT50aWNrZXRzKTsKIAotCXJldHVybiAoKCh0bXAgPj4gVElDS0VUX1NISUZUKSAtIHRtcCkgJiAoKDEgPDwgVElDS0VUX1NISUZUKSAtIDEpKSA+IDE7CisJcmV0dXJuICgodG1wLnRhaWwgLSB0bXAuaGVhZCkgJiBUSUNLRVRfTUFTSykgPiAxOwogfQogCiAjaWZuZGVmIENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IDdjN2E0ODYuLjhlYmQ1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtNSwxMSArNSwyOSBAQAogIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgogI2VuZGlmCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaWYgKENPTkZJR19OUl9DUFVTIDwgMjU2KQordHlwZWRlZiB1OCAgX190aWNrZXRfdDsKK3R5cGVkZWYgdTE2IF9fdGlja2V0cGFpcl90OworI2Vsc2UKK3R5cGVkZWYgdTE2IF9fdGlja2V0X3Q7Cit0eXBlZGVmIHUzMiBfX3RpY2tldHBhaXJfdDsKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tFVF9TSElGVAkoc2l6ZW9mKF9fdGlja2V0X3QpICogOCkKKyNkZWZpbmUgVElDS0VUX01BU0sJKChfX3RpY2tldF90KSgoMSA8PCBUSUNLRVRfU0hJRlQpIC0gMSkpCisKIHR5cGVkZWYgc3RydWN0IGFyY2hfc3BpbmxvY2sgewotCXVuc2lnbmVkIGludCBzbG9jazsKKwl1bmlvbiB7CisJCV9fdGlja2V0cGFpcl90IGhlYWRfdGFpbDsKKwkJc3RydWN0IF9fcmF3X3RpY2tldHMgeworCQkJX190aWNrZXRfdCBoZWFkLCB0YWlsOworCQl9IHRpY2tldHM7CisJfTsKIH0gYXJjaF9zcGlubG9ja190OwogCi0jZGVmaW5lIF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQJeyAwIH0KKyNkZWZpbmUgX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMCB9IH0KIAogI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAppbmRleCA1OTM0ODViMy4uNTk5Yzc3ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKQEAgLTM1MiwxMCArMzUyLDEyIEBACiAjZGVmaW5lIF9fTlJfc3luY2ZzICAgICAgICAgICAgIDM0NAogI2RlZmluZSBfX05SX3NlbmRtbXNnCQkzNDUKICNkZWZpbmUgX19OUl9zZXRucwkJMzQ2CisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV9yZWFkdgkzNDcKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3dyaXRldgkzNDgKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzNDcKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzQ5CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKaW5kZXggMGE2YmEzMy4uMDQzMWYxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKQEAgLTY4Miw2ICs2ODIsMTAgQEAKIF9fU1lTQ0FMTChfX05SX3NldG5zLCBzeXNfc2V0bnMpCiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkJCTMwOQogX19TWVNDQUxMKF9fTlJfZ2V0Y3B1LCBzeXNfZ2V0Y3B1KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fcmVhZHYJCQkzMTAKK19fU1lTQ0FMTChfX05SX3Byb2Nlc3Nfdm1fcmVhZHYsIHN5c19wcm9jZXNzX3ZtX3JlYWR2KQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CQkJMzExCitfX1NZU0NBTEwoX19OUl9wcm9jZXNzX3ZtX3dyaXRldiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KQogCiAjaWZuZGVmIF9fTk9fU1RVQlMKICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKaW5kZXggMzdkMzY5OC4uOGU4NjJhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKQEAgLTU1LDYgKzU1LDcgQEAKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0RJUgkJInNnaV91diIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0ZJTEUJCSJiYXVfdHVuYWJsZXMiCiAjZGVmaW5lIFdISVRFU1BBQ0UJCQkiIFx0XG4iCisjZGVmaW5lIHV2X21tYXNrCQkJKCgxVUwgPDwgdXZfaHViX2luZm8tPm1fdmFsKSAtIDEpCiAjZGVmaW5lIHV2X3BoeXNub2RlYWRkcih4KQkJKChfX3BhKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB1dl9tbWFzaykpCiAjZGVmaW5lIGNwdWJpdF9pc3NldChjcHUsIGJhdV9sb2NhbF9jcHVtYXNrKSBcCiAJdGVzdF9iaXQoKGNwdSksIChiYXVfbG9jYWxfY3B1bWFzaykuYml0cykKQEAgLTY1NiwxMSArNjU3LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgYXRvbV9hc3Ioc2hvcnQgaSwgc3RydWN0IGF0b21pY19zaG9ydCAqdikKIHsKLQlzaG9ydCBfX2kgPSBpOwotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAieGFkZHcgJTAsICUxIgotCQkJOiAiK3IiIChpKSwgIittIiAodi0+Y291bnRlcikKLQkJCTogOiAibWVtb3J5Iik7Ci0JcmV0dXJuIGkgKyBfX2k7CisJcmV0dXJuIGkgKyB4YWRkKCZ2LT5jb3VudGVyLCBpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2h1Yi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKaW5kZXggZjI2NTQ0YS4uNTRhMTNhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKQEAgLTQ2LDYgKzQ2LDEzIEBACiAgKglQTk9ERSAgIC0gdGhlIGxvdyBOIGJpdHMgb2YgdGhlIEdOT0RFLiBUaGUgUE5PREUgaXMgdGhlIG1vc3QgdXNlZnVsIHZhcmlhbnQKICAqCQkgIG9mIHRoZSBuYXNpZCBmb3Igc29ja2V0IHVzYWdlLgogICoKKyAqCUdQQQktIChnbG9iYWwgcGh5c2ljYWwgYWRkcmVzcykgYSBzb2NrZXQgcGh5c2ljYWwgYWRkcmVzcyBjb252ZXJ0ZWQKKyAqCQkgIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIEdSVSBhcyBhIGdsb2JhbCBhZGRyZXNzLiBTb2NrZXQKKyAqCQkgIHBoeXNpY2FsIGFkZHJlc3NlcyAxKSBuZWVkIGFkZGl0aW9uYWwgTkFTSUQgKG5vZGUpIGJpdHMgYWRkZWQKKyAqCQkgIHRvIHRoZSBoaWdoIGVuZCBvZiB0aGUgYWRkcmVzcywgYW5kIDIpIHVuYWxpYXNlZCBpZiB0aGUKKyAqCQkgIHBhcnRpdGlvbiBkb2VzIG5vdCBoYXZlIGEgcGh5c2ljYWwgYWRkcmVzcyAwLiBJbiBhZGRpdGlvbiwgb24KKyAqCQkgIFVWMiByZXYgMSwgR1BBcyBuZWVkIHRoZSBnbm9kZSBsZWZ0IHNoaWZ0ZWQgdG8gYml0cyAzOSBvciA0MC4KKyAqCiAgKgogICogIE51bWFMaW5rIEdsb2JhbCBQaHlzaWNhbCBBZGRyZXNzIEZvcm1hdDoKICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpAQCAtMTQxLDYgKzE0OCw4IEBACiAJdW5zaWduZWQgaW50CQlnbm9kZV9leHRyYTsKIAl1bnNpZ25lZCBjaGFyCQlodWJfcmV2aXNpb247CiAJdW5zaWduZWQgY2hhcgkJYXBpY19wbm9kZV9zaGlmdDsKKwl1bnNpZ25lZCBjaGFyCQltX3NoaWZ0OworCXVuc2lnbmVkIGNoYXIJCW5fbHNoaWZ0OwogCXVuc2lnbmVkIGxvbmcJCWdub2RlX3VwcGVyOwogCXVuc2lnbmVkIGxvbmcJCWxvd21lbV9yZW1hcF90b3A7CiAJdW5zaWduZWQgbG9uZwkJbG93bWVtX3JlbWFwX2Jhc2U7CkBAIC0xNzcsNiArMTg2LDE2IEBACiAJcmV0dXJuIHV2X2h1Yl9pbmZvLT5odWJfcmV2aXNpb24gPj0gVVYyX0hVQl9SRVZJU0lPTl9CQVNFOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc191djJfMV9odWIodm9pZCkKK3sKKwlyZXR1cm4gdXZfaHViX2luZm8tPmh1Yl9yZXZpc2lvbiA9PSBVVjJfSFVCX1JFVklTSU9OX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3V2Ml8yX2h1Yih2b2lkKQoreworCXJldHVybiB1dl9odWJfaW5mby0+aHViX3JldmlzaW9uID09IFVWMl9IVUJfUkVWSVNJT05fQkFTRSArIDE7Cit9CisKIHVuaW9uIHV2aF9hcGljaWQgewogICAgIHVuc2lnbmVkIGxvbmcgICAgICAgdjsKICAgICBzdHJ1Y3QgdXZoX2FwaWNpZF9zIHsKQEAgLTI3Niw3ICsyOTUsMTAgQEAKIHsKIAlpZiAocGFkZHIgPCB1dl9odWJfaW5mby0+bG93bWVtX3JlbWFwX3RvcCkKIAkJcGFkZHIgfD0gdXZfaHViX2luZm8tPmxvd21lbV9yZW1hcF9iYXNlOwotCXJldHVybiBwYWRkciB8IHV2X2h1Yl9pbmZvLT5nbm9kZV91cHBlcjsKKwlwYWRkciB8PSB1dl9odWJfaW5mby0+Z25vZGVfdXBwZXI7CisJcGFkZHIgPSAoKHBhZGRyIDw8IHV2X2h1Yl9pbmZvLT5tX3NoaWZ0KSA+PiB1dl9odWJfaW5mby0+bV9zaGlmdCkgfAorCQkoKHBhZGRyID4+IHV2X2h1Yl9pbmZvLT5tX3ZhbCkgPDwgdXZfaHViX2luZm8tPm5fbHNoaWZ0KTsKKwlyZXR1cm4gcGFkZHI7CiB9CiAKIApAQCAtMzAwLDE2ICszMjIsMTkgQEAKIAl1bnNpZ25lZCBsb25nIHJlbWFwX2Jhc2UgPSB1dl9odWJfaW5mby0+bG93bWVtX3JlbWFwX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyByZW1hcF90b3AgPSAgdXZfaHViX2luZm8tPmxvd21lbV9yZW1hcF90b3A7CiAKKwlncGEgPSAoKGdwYSA8PCB1dl9odWJfaW5mby0+bV9zaGlmdCkgPj4gdXZfaHViX2luZm8tPm1fc2hpZnQpIHwKKwkJKChncGEgPj4gdXZfaHViX2luZm8tPm5fbHNoaWZ0KSA8PCB1dl9odWJfaW5mby0+bV92YWwpOworCWdwYSA9IGdwYSAmIHV2X2h1Yl9pbmZvLT5ncGFfbWFzazsKIAlpZiAocGFkZHIgPj0gcmVtYXBfYmFzZSAmJiBwYWRkciA8IHJlbWFwX2Jhc2UgKyByZW1hcF90b3ApCiAJCXBhZGRyIC09IHJlbWFwX2Jhc2U7CiAJcmV0dXJuIHBhZGRyOwogfQogCiAKLS8qIGdub2RlIC0+IHBub2RlICovCisvKiBncGEgLT4gcG5vZGUgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dl9ncGFfdG9fZ25vZGUodW5zaWduZWQgbG9uZyBncGEpCiB7Ci0JcmV0dXJuIGdwYSA+PiB1dl9odWJfaW5mby0+bV92YWw7CisJcmV0dXJuIGdwYSA+PiB1dl9odWJfaW5mby0+bl9sc2hpZnQ7CiB9CiAKIC8qIGdwYSAtPiBwbm9kZSAqLwpAQCAtMzIwLDYgKzM0NSwxMiBAQAogCXJldHVybiB1dl9ncGFfdG9fZ25vZGUoZ3BhKSAmIG5fbWFzazsKIH0KIAorLyogZ3BhIC0+IG5vZGUgb2Zmc2V0Ki8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dl9ncGFfdG9fb2Zmc2V0KHVuc2lnbmVkIGxvbmcgZ3BhKQoreworCXJldHVybiAoZ3BhIDw8IHV2X2h1Yl9pbmZvLT5tX3NoaWZ0KSA+PiB1dl9odWJfaW5mby0+bV9zaGlmdDsKK30KKwogLyogcG5vZGUsIG9mZnNldCAtLT4gc29ja2V0IHZpcnR1YWwgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqdXZfcG5vZGVfb2Zmc2V0X3RvX3ZhZGRyKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCmluZGV4IDJjYWYyOTAuLjMxZjE4MGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCkBAIC0zNTAsNiArMzUwLDE4IEBACiAjZGVmaW5lIERFQlVHX1JFR19BQ0NFU1NfUkVHKGVxKSAgICAgICAgKCgoZXEpID4+IDgpICYgMHhmKSAvKiAxMTo4LCBnZW5lcmFsIHB1cnBvc2UgcmVnLiAqLwogCiAKKy8qCisgKiBFeGl0IFF1YWxpZmljYXRpb25zIGZvciBBUElDLUFjY2VzcworICovCisjZGVmaW5lIEFQSUNfQUNDRVNTX09GRlNFVCAgICAgICAgICAgICAgMHhmZmYgICAvKiAxMTowLCBvZmZzZXQgd2l0aGluIHRoZSBBUElDIHBhZ2UgKi8KKyNkZWZpbmUgQVBJQ19BQ0NFU1NfVFlQRSAgICAgICAgICAgICAgICAweGYwMDAgIC8qIDE1OjEyLCBhY2Nlc3MgdHlwZSAqLworI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfUkVBRCAgICAgICgwIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfV1JJVEUgICAgICgxIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0lOU1RfRkVUQ0ggICAgICgyIDw8IDEyKQorI2RlZmluZSBUWVBFX0xJTkVBUl9BUElDX0VWRU5UICAgICAgICAgICgzIDw8IDEyKQorI2RlZmluZSBUWVBFX1BIWVNJQ0FMX0FQSUNfRVZFTlQgICAgICAgICgxMCA8PCAxMikKKyNkZWZpbmUgVFlQRV9QSFlTSUNBTF9BUElDX0lOU1QgICAgICAgICAoMTUgPDwgMTIpCisKIC8qIHNlZ21lbnQgQVIgKi8KICNkZWZpbmUgU0VHTUVOVF9BUl9MX01BU0sgKDEgPDwgMTMpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9ncmFudF90YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYmJiNDUuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2dyYW50X3RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfWEVOX0dSQU5UX1RBQkxFX0gKLSNkZWZpbmUgX0FTTV9YODZfWEVOX0dSQU5UX1RBQkxFX0gKLQotI2RlZmluZSB4ZW5fYWxsb2Nfdm1fYXJlYShzaXplKQlhbGxvY192bV9hcmVhKHNpemUpCi0jZGVmaW5lIHhlbl9mcmVlX3ZtX2FyZWEoYXJlYSkJZnJlZV92bV9hcmVhKGFyZWEpCi0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9YRU5fR1JBTlRfVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVyY2FsbC5oCmluZGV4IDQxNzc3N2QuLjU3Mjg4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcmNhbGwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJjYWxsLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2Uvc2NoZWQuaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BoeXNkZXYuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BsYXRmb3JtLmg+CiAKIC8qCiAgKiBUaGUgaHlwZXJjYWxsIGFzbXMgaGF2ZSB0byBtZWV0IHNldmVyYWwgY29uc3RyYWludHM6CkBAIC0zMDEsNiArMzAyLDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CitIWVBFUlZJU09SX2RvbTBfb3Aoc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCAqcGxhdGZvcm1fb3ApCit7CisJcGxhdGZvcm1fb3AtPmludGVyZmFjZV92ZXJzaW9uID0gWEVOUEZfSU5URVJGQUNFX1ZFUlNJT047CisJcmV0dXJuIF9oeXBlcmNhbGwxKGludCwgZG9tMF9vcCwgcGxhdGZvcm1fb3ApOworfQorCitzdGF0aWMgaW5saW5lIGludAogSFlQRVJWSVNPUl9zZXRfZGVidWdyZWcoaW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKIAlyZXR1cm4gX2h5cGVyY2FsbDIoaW50LCBzZXRfZGVidWdyZWcsIHJlZywgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2ludGVyZmFjZS5oCmluZGV4IDVkNDkyMmEuLmExZjJkYjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9pbnRlcmZhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaW50ZXJmYWNlLmgKQEAgLTU1LDYgKzU1LDcgQEAKIERFRklORV9HVUVTVF9IQU5ETEUoaW50KTsKIERFRklORV9HVUVTVF9IQU5ETEUobG9uZyk7CiBERUZJTkVfR1VFU1RfSEFORExFKHZvaWQpOworREVGSU5FX0dVRVNUX0hBTkRMRSh1aW50NjRfdCk7CiAjZW5kaWYKIAogI2lmbmRlZiBIWVBFUlZJU09SX1ZJUlRfU1RBUlQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IDc1YmUwMGUuLjYyYWUzMDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtODIwLDYgKzgyMCwxMCBAQAogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+YXBpY19wbm9kZV9zaGlmdCA9IHV2aF9hcGljaWQucy5wbm9kZV9zaGlmdDsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmh1Yl9yZXZpc2lvbiA9IHV2X2h1Yl9pbmZvLT5odWJfcmV2aXNpb247CiAKKwkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPm1fc2hpZnQgPSA2NCAtIG1fdmFsOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+bl9sc2hpZnQgPSBpc191djJfMV9odWIoKSA/CisJCQkJKG1fdmFsID09IDQwID8gNDAgOiAzOSkgOiBtX3ZhbDsKKwogCQlwbm9kZSA9IHV2X2FwaWNpZF90b19wbm9kZShhcGljaWQpOwogCQlibGFkZSA9IGJvb3RfcG5vZGVfdG9fYmxhZGUocG5vZGUpOwogCQlsY3B1ID0gdXZfYmxhZGVfaW5mb1tibGFkZV0ubnJfcG9zc2libGVfY3B1czsKQEAgLTg1MCw4ICs4NTQsNyBAQAogCQlpZiAodXZfbm9kZV90b19ibGFkZVtuaWRdID49IDApCiAJCQljb250aW51ZTsKIAkJcGFkZHIgPSBub2RlX3N0YXJ0X3BmbihuaWQpIDw8IFBBR0VfU0hJRlQ7Ci0JCXBhZGRyID0gdXZfc29jX3BoeXNfcmFtX3RvX2dwYShwYWRkcik7Ci0JCXBub2RlID0gKHBhZGRyID4+IG1fdmFsKSAmIHBub2RlX21hc2s7CisJCXBub2RlID0gdXZfZ3BhX3RvX3Bub2RlKHV2X3NvY19waHlzX3JhbV90b19ncGEocGFkZHIpKTsKIAkJYmxhZGUgPSBib290X3Bub2RlX3RvX2JsYWRlKHBub2RlKTsKIAkJdXZfbm9kZV90b19ibGFkZVtuaWRdID0gYmxhZGU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKaW5kZXggZmU2ZWIxOS4uMjVmMjRkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiBvYmoteQkJCTo9IGludGVsX2NhY2hlaW5mby5vIHNjYXR0ZXJlZC5vIHRvcG9sb2d5Lm8KIG9iai15CQkJKz0gcHJvYy5vIGNhcGZsYWdzLm8gcG93ZXJmbGFncy5vIGNvbW1vbi5vCiBvYmoteQkJCSs9IHZtd2FyZS5vIGh5cGVydmlzb3IubyBzY2hlZC5vIG1zaHlwZXJ2Lm8KK29iai15CQkJKz0gcmRyYW5kLm8KIAogb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gYnVncy5vCiBvYmotJChDT05GSUdfWDg2XzY0KQkrPSBidWdzXzY0Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGIxM2VkMzkuLmM3ZTQ2Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtMSw1ICsxLDcgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CkBAIC00MTAsOCArNDEyLDM4IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgX19jcHVpbml0IGJzcF9pbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKSkgeworCisJCWlmIChjLT54ODYgPiAweDEwIHx8CisJCSAgICAoYy0+eDg2ID09IDB4MTAgJiYgYy0+eDg2X21vZGVsID49IDB4MikpIHsKKwkJCXU2NCB2YWw7CisKKwkJCXJkbXNybChNU1JfSzdfSFdDUiwgdmFsKTsKKwkJCWlmICghKHZhbCAmIEJJVCgyNCkpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRldfQlVHICJUU0MgZG9lc24ndCBjb3VudCAiCisJCQkJCSJ3aXRoIFAwIGZyZXF1ZW5jeSFcbiIpOworCQl9CisJfQorCisJaWYgKGMtPng4NiA9PSAweDE1KSB7CisJCXVuc2lnbmVkIGxvbmcgdXBwZXJiaXQ7CisJCXUzMiBjcHVpZCwgYXNzb2M7CisKKwkJY3B1aWQJID0gY3B1aWRfZWR4KDB4ODAwMDAwMDUpOworCQlhc3NvYwkgPSBjcHVpZCA+PiAxNiAmIDB4ZmY7CisJCXVwcGVyYml0ID0gKChjcHVpZCA+PiAyNCkgPDwgMTApIC8gYXNzb2M7CisKKwkJdmFfYWxpZ24ubWFzawkgID0gKHVwcGVyYml0IC0gMSkgJiBQQUdFX01BU0s7CisJCXZhX2FsaWduLmZsYWdzICAgID0gQUxJR05fVkFfMzIgfCBBTElHTl9WQV82NDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBlYXJseV9pbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJdTMyIGR1bW15OworCiAJZWFybHlfaW5pdF9hbWRfbWMoYyk7CiAKIAkvKgpAQCAtNDQyLDIyICs0NzQsNyBAQAogCX0KICNlbmRpZgogCi0JLyogV2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIG9ubHkgb25jZSAqLwotCWlmIChjICE9ICZib290X2NwdV9kYXRhKQotCQlyZXR1cm47Ci0KLQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKSB7Ci0KLQkJaWYgKGMtPng4NiA+IDB4MTAgfHwKLQkJICAgIChjLT54ODYgPT0gMHgxMCAmJiBjLT54ODZfbW9kZWwgPj0gMHgyKSkgewotCQkJdTY0IHZhbDsKLQotCQkJcmRtc3JsKE1TUl9LN19IV0NSLCB2YWwpOwotCQkJaWYgKCEodmFsICYgQklUKDI0KSkpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyBGV19CVUcgIlRTQyBkb2Vzbid0IGNvdW50ICIKLQkJCQkJIndpdGggUDAgZnJlcXVlbmN5IVxuIik7Ci0JCX0KLQl9CisJcmRtc3Jfc2FmZShNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsICZjLT5taWNyb2NvZGUsICZkdW1teSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC02NzksNiArNjk2LDcgQEAKIAkuY19zaXplX2NhY2hlCT0gYW1kX3NpemVfY2FjaGUsCiAjZW5kaWYKIAkuY19lYXJseV9pbml0ICAgPSBlYXJseV9pbml0X2FtZCwKKwkuY19ic3BfaW5pdAk9IGJzcF9pbml0X2FtZCwKIAkuY19pbml0CQk9IGluaXRfYW1kLAogCS5jX3g4Nl92ZW5kb3IJPSBYODZfVkVORE9SX0FNRCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA2MjE4NDM5Li5hYTAwM2IxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vc3RhY2twcm90ZWN0b3IuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9hcmNocmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC02ODEsNiArNjgyLDkgQEAKIAlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwogCiAJc2V0dXBfc21lcChjKTsKKworCWlmICh0aGlzX2NwdS0+Y19ic3BfaW5pdCkKKwkJdGhpc19jcHUtPmNfYnNwX2luaXQoYyk7CiB9CiAKIHZvaWQgX19pbml0IGVhcmx5X2NwdV9pbml0KHZvaWQpCkBAIC04NTcsNiArODYxLDcgQEAKICNlbmRpZgogCiAJaW5pdF9oeXBlcnZpc29yKGMpOworCXg4Nl9pbml0X3JkcmFuZChjKTsKIAogCS8qCiAJICogQ2xlYXIvU2V0IGFsbCBmbGFncyBvdmVycmlkZW4gYnkgb3B0aW9ucywgbmVlZCBkbyBpdApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1LmgKaW5kZXggZTc2NTYzMy4uMWIyMmRjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdS5oCkBAIC0xOCw2ICsxOCw3IEBACiAJc3RydWN0CQljcHVfbW9kZWxfaW5mbyBjX21vZGVsc1s0XTsKIAogCXZvaWQgICAgICAgICAgICAoKmNfZWFybHlfaW5pdCkoc3RydWN0IGNwdWluZm9feDg2ICopOworCXZvaWQJCSgqY19ic3BfaW5pdCkoc3RydWN0IGNwdWluZm9feDg2ICopOwogCXZvaWQJCSgqY19pbml0KShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiAJdm9pZAkJKCpjX2lkZW50aWZ5KShzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiAJdW5zaWduZWQgaW50CSgqY19zaXplX2NhY2hlKShzdHJ1Y3QgY3B1aW5mb194ODYgKiwgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCBlZDYwODZlLi41MjMxMzEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC00Nyw2ICs0NywxNSBAQAogCQkoYy0+eDg2ID09IDB4NiAmJiBjLT54ODZfbW9kZWwgPj0gMHgwZSkpCiAJCXNldF9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQyk7CiAKKwlpZiAoYy0+eDg2ID49IDYgJiYgIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfSUE2NCkpIHsKKwkJdW5zaWduZWQgbG93ZXJfd29yZDsKKworCQl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOworCQkvKiBSZXF1aXJlZCBieSB0aGUgU0RNICovCisJCXN5bmNfY29yZSgpOworCQlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIGxvd2VyX3dvcmQsIGMtPm1pY3JvY29kZSk7CisJfQorCiAJLyoKIAkgKiBBdG9tIGVycmF0dW0gQUFFNDQvQUFGNDAvQUFHMzgvQUFINDE6CiAJICoKQEAgLTU1LDE3ICs2NCwxMCBAQAogCSAqIG5lZWQgdGhlIG1pY3JvY29kZSB0byBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuLi4gc28gaWYgaXQgaXMKIAkgKiBub3QsIHJlY29tbWVuZCBhIEJJT1MgdXBkYXRlIGFuZCBkaXNhYmxlIGxhcmdlIHBhZ2VzLgogCSAqLwotCWlmIChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPT0gMHgxYyAmJiBjLT54ODZfbWFzayA8PSAyKSB7Ci0JCXUzMiB1Y29kZSwganVuazsKLQotCQl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwotCQlzeW5jX2NvcmUoKTsKLQkJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCBqdW5rLCB1Y29kZSk7Ci0KLQkJaWYgKHVjb2RlIDwgMHgyMGUpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0b20gUFNFIGVycmF0dW0gZGV0ZWN0ZWQsIEJJT1MgbWljcm9jb2RlIHVwZGF0ZSByZWNvbW1lbmRlZFxuIik7Ci0JCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BTRSk7Ci0JCX0KKwlpZiAoYy0+eDg2ID09IDYgJiYgYy0+eDg2X21vZGVsID09IDB4MWMgJiYgYy0+eDg2X21hc2sgPD0gMiAmJgorCSAgICBjLT5taWNyb2NvZGUgPCAweDIwZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdG9tIFBTRSBlcnJhdHVtIGRldGVjdGVkLCBCSU9TIG1pY3JvY29kZSB1cGRhdGUgcmVjb21tZW5kZWRcbiIpOworCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1BTRSk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1g4Nl82NApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKaW5kZXggYzEwNWM1My4uYTNiMDgxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0xNTEsMjggKzE1MSwxNyBAQAogCXUzMiBmdWxsOwogfTsKIAotc3RydWN0IGFtZF9sM19jYWNoZSB7Ci0Jc3RydWN0CSBhbWRfbm9ydGhicmlkZ2UgKm5iOwotCXVuc2lnbmVkIGluZGljZXM7Ci0JdTgJIHN1YmNhY2hlc1s0XTsKLX07Ci0KLXN0cnVjdCBfY3B1aWQ0X2luZm8gewotCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXggZWF4OwotCXVuaW9uIF9jcHVpZDRfbGVhZl9lYnggZWJ4OwotCXVuaW9uIF9jcHVpZDRfbGVhZl9lY3ggZWN4OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzdHJ1Y3QgYW1kX2wzX2NhY2hlICpsMzsKLQlERUNMQVJFX0JJVE1BUChzaGFyZWRfY3B1X21hcCwgTlJfQ1BVUyk7Ci19OwotCi0vKiBzdWJzZXQgb2YgYWJvdmUgX2NwdWlkNF9pbmZvIHcvbyBzaGFyZWRfY3B1X21hcCAqLwogc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzIHsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IGVheDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IGVieDsKIAl1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IGVjeDsKIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jc3RydWN0IGFtZF9sM19jYWNoZSAqbDM7CisJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmI7Cit9OworCitzdHJ1Y3QgX2NwdWlkNF9pbmZvIHsKKwlzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgYmFzZTsKKwlERUNMQVJFX0JJVE1BUChzaGFyZWRfY3B1X21hcCwgTlJfQ1BVUyk7CiB9OwogCiB1bnNpZ25lZCBzaG9ydAkJCW51bV9jYWNoZV9sZWF2ZXM7CkBAIC0zMTQsMTYgKzMwMywyMyBAQAogLyoKICAqIEwzIGNhY2hlIGRlc2NyaXB0b3JzCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBhbWRfY2FsY19sM19pbmRpY2VzKHN0cnVjdCBhbWRfbDNfY2FjaGUgKmwzKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGFtZF9jYWxjX2wzX2luZGljZXMoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIpCiB7CisJc3RydWN0IGFtZF9sM19jYWNoZSAqbDMgPSAmbmItPmwzX2NhY2hlOwogCXVuc2lnbmVkIGludCBzYzAsIHNjMSwgc2MyLCBzYzM7CiAJdTMyIHZhbCA9IDA7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQobDMtPm5iLT5taXNjLCAweDFDNCwgJnZhbCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG5iLT5taXNjLCAweDFDNCwgJnZhbCk7CiAKIAkvKiBjYWxjdWxhdGUgc3ViY2FjaGUgc2l6ZXMgKi8KIAlsMy0+c3ViY2FjaGVzWzBdID0gc2MwID0gISh2YWwgJiBCSVQoMCkpOwogCWwzLT5zdWJjYWNoZXNbMV0gPSBzYzEgPSAhKHZhbCAmIEJJVCg0KSk7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxNSkgeworCQlsMy0+c3ViY2FjaGVzWzBdID0gc2MwICs9ICEodmFsICYgQklUKDEpKTsKKwkJbDMtPnN1YmNhY2hlc1sxXSA9IHNjMSArPSAhKHZhbCAmIEJJVCg1KSk7CisJfQorCiAJbDMtPnN1YmNhY2hlc1syXSA9IHNjMiA9ICEodmFsICYgQklUKDgpKSAgKyAhKHZhbCAmIEJJVCg5KSk7CiAJbDMtPnN1YmNhY2hlc1szXSA9IHNjMyA9ICEodmFsICYgQklUKDEyKSkgKyAhKHZhbCAmIEJJVCgxMykpOwogCkBAIC0zMzMsMzMgKzMyOSwxNiBAQAogc3RhdGljIHZvaWQgX19jcHVpbml0IGFtZF9pbml0X2wzX2NhY2hlKHN0cnVjdCBfY3B1aWQ0X2luZm9fcmVncyAqdGhpc19sZWFmLAogCQkJCQlpbnQgaW5kZXgpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhbWRfbDNfY2FjaGUgKl9fY3B1aW5pdGRhdGEgbDNfY2FjaGVzOwogCWludCBub2RlOwogCiAJLyogb25seSBmb3IgTDMsIGFuZCBub3QgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzICovCi0JaWYgKGluZGV4IDwgMyB8fCBhbWRfbmJfbnVtKCkgPT0gMCkKKwlpZiAoaW5kZXggPCAzKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIFN0cmljdGx5IHNwZWFraW5nLCB0aGUgYW1vdW50IGluIEBzaXplIGJlbG93IGlzIGxlYWtlZCBzaW5jZSBpdCBpcwotCSAqIG5ldmVyIGZyZWVkIGJ1dCB0aGlzIGlzIGRvbmUgb25seSBvbiBzaHV0ZG93biBzbyBpdCBkb2Vzbid0IG1hdHRlci4KLQkgKi8KLQlpZiAoIWwzX2NhY2hlcykgewotCQlpbnQgc2l6ZSA9IGFtZF9uYl9udW0oKSAqIHNpemVvZihzdHJ1Y3QgYW1kX2wzX2NhY2hlKTsKLQotCQlsM19jYWNoZXMgPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWwzX2NhY2hlcykKLQkJCXJldHVybjsKLQl9Ci0KIAlub2RlID0gYW1kX2dldF9uYl9pZChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCi0JaWYgKCFsM19jYWNoZXNbbm9kZV0ubmIpIHsKLQkJbDNfY2FjaGVzW25vZGVdLm5iID0gbm9kZV90b19hbWRfbmIobm9kZSk7Ci0JCWFtZF9jYWxjX2wzX2luZGljZXMoJmwzX2NhY2hlc1tub2RlXSk7Ci0JfQotCi0JdGhpc19sZWFmLT5sMyA9ICZsM19jYWNoZXNbbm9kZV07CisJdGhpc19sZWFmLT5uYiA9IG5vZGVfdG9fYW1kX25iKG5vZGUpOworCWlmICh0aGlzX2xlYWYtPm5iICYmICF0aGlzX2xlYWYtPm5iLT5sM19jYWNoZS5pbmRpY2VzKQorCQlhbWRfY2FsY19sM19pbmRpY2VzKHRoaXNfbGVhZi0+bmIpOwogfQogCiAvKgpAQCAtMzY5LDExICszNDgsMTEgQEAKICAqCiAgKiBAcmV0dXJuczogdGhlIGRpc2FibGVkIGluZGV4IGlmIHVzZWQgb3IgbmVnYXRpdmUgdmFsdWUgaWYgc2xvdCBmcmVlLgogICovCi1pbnQgYW1kX2dldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9sM19jYWNoZSAqbDMsIHVuc2lnbmVkIHNsb3QpCitpbnQgYW1kX2dldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIsIHVuc2lnbmVkIHNsb3QpCiB7CiAJdW5zaWduZWQgaW50IHJlZyA9IDA7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQobDMtPm5iLT5taXNjLCAweDFCQyArIHNsb3QgKiA0LCAmcmVnKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsICZyZWcpOwogCiAJLyogY2hlY2sgd2hldGhlciB0aGlzIHNsb3QgaXMgYWN0aXZhdGVkIGFscmVhZHkgKi8KIAlpZiAocmVnICYgKDNVTCA8PCAzMCkpCkBAIC0zODcsMTEgKzM2NiwxMCBAQAogewogCWludCBpbmRleDsKIAotCWlmICghdGhpc19sZWFmLT5sMyB8fAotCSAgICAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKKwlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpbmRleCA9IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KHRoaXNfbGVhZi0+bDMsIHNsb3QpOworCWluZGV4ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QodGhpc19sZWFmLT5iYXNlLm5iLCBzbG90KTsKIAlpZiAoaW5kZXggPj0gMCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluZGV4KTsKIApAQCAtNDA4LDcgKzM4Niw3IEBACiBTSE9XX0NBQ0hFX0RJU0FCTEUoMCkKIFNIT1dfQ0FDSEVfRElTQUJMRSgxKQogCi1zdGF0aWMgdm9pZCBhbWRfbDNfZGlzYWJsZV9pbmRleChzdHJ1Y3QgYW1kX2wzX2NhY2hlICpsMywgaW50IGNwdSwKK3N0YXRpYyB2b2lkIGFtZF9sM19kaXNhYmxlX2luZGV4KHN0cnVjdCBhbWRfbm9ydGhicmlkZ2UgKm5iLCBpbnQgY3B1LAogCQkJCSB1bnNpZ25lZCBzbG90LCB1bnNpZ25lZCBsb25nIGlkeCkKIHsKIAlpbnQgaTsKQEAgLTQyMSwxMCArMzk5LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl1MzIgcmVnID0gaWR4IHwgKGkgPDwgMjApOwogCi0JCWlmICghbDMtPnN1YmNhY2hlc1tpXSkKKwkJaWYgKCFuYi0+bDNfY2FjaGUuc3ViY2FjaGVzW2ldKQogCQkJY29udGludWU7CiAKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChsMy0+bmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsIHJlZyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmItPm1pc2MsIDB4MUJDICsgc2xvdCAqIDQsIHJlZyk7CiAKIAkJLyoKIAkJICogV2UgbmVlZCB0byBXQklOVkQgb24gYSBjb3JlIG9uIHRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIEwzCkBAIC00MzQsNyArNDEyLDcgQEAKIAkJd2JpbnZkX29uX2NwdShjcHUpOwogCiAJCXJlZyB8PSBCSVQoMzEpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGwzLT5uYi0+bWlzYywgMHgxQkMgKyBzbG90ICogNCwgcmVnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChuYi0+bWlzYywgMHgxQkMgKyBzbG90ICogNCwgcmVnKTsKIAl9CiB9CiAKQEAgLTQ0OCwyNCArNDI2LDI0IEBACiAgKgogICogQHJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBzdGF0dXMgb24gZmFpbHVyZQogICovCi1pbnQgYW1kX3NldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9sM19jYWNoZSAqbDMsIGludCBjcHUsIHVuc2lnbmVkIHNsb3QsCitpbnQgYW1kX3NldF9sM19kaXNhYmxlX3Nsb3Qoc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIsIGludCBjcHUsIHVuc2lnbmVkIHNsb3QsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAlpbnQgcmV0ID0gMDsKIAogCS8qICBjaGVjayBpZiBAc2xvdCBpcyBhbHJlYWR5IHVzZWQgb3IgdGhlIGluZGV4IGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KLQlyZXQgPSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdChsMywgc2xvdCk7CisJcmV0ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QobmIsIHNsb3QpOwogCWlmIChyZXQgPj0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaW5kZXggPiBsMy0+aW5kaWNlcykKKwlpZiAoaW5kZXggPiBuYi0+bDNfY2FjaGUuaW5kaWNlcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBjaGVjayB3aGV0aGVyIHRoZSBvdGhlciBzbG90IGhhcyBkaXNhYmxlZCB0aGUgc2FtZSBpbmRleCBhbHJlYWR5ICovCi0JaWYgKGluZGV4ID09IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KGwzLCAhc2xvdCkpCisJaWYgKGluZGV4ID09IGFtZF9nZXRfbDNfZGlzYWJsZV9zbG90KG5iLCAhc2xvdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYW1kX2wzX2Rpc2FibGVfaW5kZXgobDMsIGNwdSwgc2xvdCwgaW5kZXgpOworCWFtZF9sM19kaXNhYmxlX2luZGV4KG5iLCBjcHUsIHNsb3QsIGluZGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDgwLDggKzQ1OCw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCF0aGlzX2xlYWYtPmwzIHx8Ci0JICAgICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQorCWlmICghdGhpc19sZWFmLT5iYXNlLm5iIHx8ICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNwdSA9IGNwdW1hc2tfZmlyc3QodG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CkBAIC00ODksNyArNDY2LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IGFtZF9zZXRfbDNfZGlzYWJsZV9zbG90KHRoaXNfbGVhZi0+bDMsIGNwdSwgc2xvdCwgdmFsKTsKKwllcnIgPSBhbWRfc2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmJhc2UubmIsIGNwdSwgc2xvdCwgdmFsKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkwzIGRpc2FibGUgc2xvdCAlZCBpbiB1c2UhXG4iLApAQCAtNTE4LDcgKzQ5NSw3IEBACiBzdGF0aWMgc3NpemVfdAogc2hvd19zdWJjYWNoZXMoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaWYgKCF0aGlzX2xlYWYtPmwzIHx8ICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX1BBUlRJVElPTklORykpCisJaWYgKCF0aGlzX2xlYWYtPmJhc2UubmIgfHwgIWFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgYW1kX2dldF9zdWJjYWNoZXMoY3B1KSk7CkBAIC01MzMsNyArNTEwLDcgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXRoaXNfbGVhZi0+bDMgfHwgIWFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKKwlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdmFsKSA8IDApCkBAIC03NjksNyArNzQ2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpbmRleCk7Ci0JbnVtX3RocmVhZHNfc2hhcmluZyA9IDEgKyB0aGlzX2xlYWYtPmVheC5zcGxpdC5udW1fdGhyZWFkc19zaGFyaW5nOworCW51bV90aHJlYWRzX3NoYXJpbmcgPSAxICsgdGhpc19sZWFmLT5iYXNlLmVheC5zcGxpdC5udW1fdGhyZWFkc19zaGFyaW5nOwogCiAJaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gMSkKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgdG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CkBAIC04MjAsMjkgKzc5NywxOSBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspCiAJCWNhY2hlX3JlbW92ZV9zaGFyZWRfY3B1X21hcChjcHUsIGkpOwogCi0Ja2ZyZWUocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSktPmwzKTsKIAlrZnJlZShwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSk7CiAJcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50Ci1fX2NwdWluaXQgY3B1aWQ0X2NhY2hlX2xvb2t1cChpbnQgaW5kZXgsIHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZikKLXsKLQlzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKmxlYWZfcmVncyA9Ci0JCShzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKil0aGlzX2xlYWY7Ci0KLQlyZXR1cm4gY3B1aWQ0X2NhY2hlX2xvb2t1cF9yZWdzKGluZGV4LCBsZWFmX3JlZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2V0X2NwdV9sZWF2ZXModm9pZCAqX3JldHZhbCkKIHsKIAlpbnQgaiwgKnJldHZhbCA9IF9yZXR2YWwsIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qIERvIGNwdWlkIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyAqLwogCWZvciAoaiA9IDA7IGogPCBudW1fY2FjaGVfbGVhdmVzOyBqKyspIHsKLQkJc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmOwotCQl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBqKTsKLQkJKnJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXAoaiwgdGhpc19sZWFmKTsKKwkJc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGNwdSwgaik7CisKKwkJKnJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXBfcmVncyhqLCAmdGhpc19sZWFmLT5iYXNlKTsKIAkJaWYgKHVubGlrZWx5KCpyZXR2YWwgPCAwKSkgewogCQkJaW50IGk7CiAKQEAgLTkwMCwxNiArODY3LDE2IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZyl0aGlzX2xlYWYtPm9iamVjdCArIHZhbCk7IFwKIH0KIAotc2hvd19vbmVfcGx1cyhsZXZlbCwgZWF4LnNwbGl0LmxldmVsLCAwKTsKLXNob3dfb25lX3BsdXMoY29oZXJlbmN5X2xpbmVfc2l6ZSwgZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOwotc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgZWJ4LnNwbGl0LnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uLCAxKTsKLXNob3dfb25lX3BsdXMod2F5c19vZl9hc3NvY2lhdGl2aXR5LCBlYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5LCAxKTsKLXNob3dfb25lX3BsdXMobnVtYmVyX29mX3NldHMsIGVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7CitzaG93X29uZV9wbHVzKGxldmVsLCBiYXNlLmVheC5zcGxpdC5sZXZlbCwgMCk7CitzaG93X29uZV9wbHVzKGNvaGVyZW5jeV9saW5lX3NpemUsIGJhc2UuZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOworc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgYmFzZS5lYnguc3BsaXQucGh5c2ljYWxfbGluZV9wYXJ0aXRpb24sIDEpOworc2hvd19vbmVfcGx1cyh3YXlzX29mX2Fzc29jaWF0aXZpdHksIGJhc2UuZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSwgMSk7CitzaG93X29uZV9wbHVzKG51bWJlcl9vZl9zZXRzLCBiYXNlLmVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2l6ZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKIAkJCSB1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+c2l6ZSAvIDEwMjQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+YmFzZS5zaXplIC8gMTAyNCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfc2hhcmVkX2NwdV9tYXBfZnVuYyhzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsCkBAIC05NDYsNyArOTEzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKIAkJCSB1bnNpZ25lZCBpbnQgY3B1KQogewotCXN3aXRjaCAodGhpc19sZWFmLT5lYXguc3BsaXQudHlwZSkgeworCXN3aXRjaCAodGhpc19sZWFmLT5iYXNlLmVheC5zcGxpdC50eXBlKSB7CiAJY2FzZSBDQUNIRV9UWVBFX0RBVEE6CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkRhdGFcbiIpOwogCWNhc2UgQ0FDSEVfVFlQRV9JTlNUOgpAQCAtMTEzNSw3ICsxMTAyLDcgQEAKIAogCQlrdHlwZV9jYWNoZS5kZWZhdWx0X2F0dHJzID0gZGVmYXVsdF9hdHRyczsKICNpZmRlZiBDT05GSUdfQU1EX05CCi0JCWlmICh0aGlzX2xlYWYtPmwzKQorCQlpZiAodGhpc19sZWFmLT5iYXNlLm5iKQogCQkJa3R5cGVfY2FjaGUuZGVmYXVsdF9hdHRycyA9IGFtZF9sM19hdHRycygpOwogI2VuZGlmCiAJCXJldHZhbCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCYodGhpc19vYmplY3QtPmtvYmopLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWFwZWkuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1hcGVpLmMKaW5kZXggODM5MzBkZS4uNTA3ZWE1OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWFwZWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtYXBlaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9jcGVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IGZjZTUxYWQxLi4zNjIwNTZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtMzYsOCArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZWRhY19tY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFfd29yay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KQEAgLTE0NCwyMyArMTQ0LDIwIEBACiB2b2lkIG1jZV9sb2coc3RydWN0IG1jZSAqbWNlKQogewogCXVuc2lnbmVkIG5leHQsIGVudHJ5OworCWludCByZXQgPSAwOwogCiAJLyogRW1pdCB0aGUgdHJhY2UgcmVjb3JkOiAqLwogCXRyYWNlX21jZV9yZWNvcmQobWNlKTsKIAorCXJldCA9IGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsIG1jZSk7CisJaWYgKHJldCA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCiAJbWNlLT5maW5pc2hlZCA9IDA7CiAJd21iKCk7CiAJZm9yICg7OykgewogCQllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVja19tY2UobWNlbG9nLm5leHQpOwogCQlmb3IgKDs7KSB7Ci0JCQkvKgotCQkJICogSWYgZWRhY19tY2UgaXMgZW5hYmxlZCwgaXQgd2lsbCBjaGVjayB0aGUgZXJyb3IgdHlwZQotCQkJICogYW5kIHdpbGwgcHJvY2VzcyBpdCwgaWYgaXQgaXMgYSBrbm93biBlcnJvci4KLQkJCSAqIE90aGVyd2lzZSwgdGhlIGVycm9yIHdpbGwgYmUgc2VudCB0aHJvdWdoIG1jZWxvZwotCQkJICogaW50ZXJmYWNlCi0JCQkgKi8KLQkJCWlmIChlZGFjX21jZV9wYXJzZShtY2UpKQotCQkJCXJldHVybjsKIAogCQkJLyoKIAkJCSAqIFdoZW4gdGhlIGJ1ZmZlciBmaWxscyB1cCBkaXNjYXJkIG5ldyBlbnRyaWVzLgpAQCAtMjE3LDggKzIxNCwxMyBAQAogCQlwcl9jb250KCJNSVNDICVsbHggIiwgbS0+bWlzYyk7CiAKIAlwcl9jb250KCJcbiIpOwotCXByX2VtZXJnKEhXX0VSUiAiUFJPQ0VTU09SICV1OiV4IFRJTUUgJWxsdSBTT0NLRVQgJXUgQVBJQyAleFxuIiwKLQkJbS0+Y3B1dmVuZG9yLCBtLT5jcHVpZCwgbS0+dGltZSwgbS0+c29ja2V0aWQsIG0tPmFwaWNpZCk7CisJLyoKKwkgKiBOb3RlIHRoaXMgb3V0cHV0IGlzIHBhcnNlZCBieSBleHRlcm5hbCB0b29scyBhbmQgb2xkIGZpZWxkcworCSAqIHNob3VsZCBub3QgYmUgY2hhbmdlZC4KKwkgKi8KKwlwcl9lbWVyZyhIV19FUlIgIlBST0NFU1NPUiAldToleCBUSU1FICVsbHUgU09DS0VUICV1IEFQSUMgJXggbWljcm9jb2RlICV4XG4iLAorCQltLT5jcHV2ZW5kb3IsIG0tPmNwdWlkLCBtLT50aW1lLCBtLT5zb2NrZXRpZCwgbS0+YXBpY2lkLAorCQljcHVfZGF0YShtLT5leHRjcHUpLm1pY3JvY29kZSk7CiAKIAkvKgogCSAqIFByaW50IG91dCBodW1hbi1yZWFkYWJsZSBkZXRhaWxzIGFib3V0IHRoZSBNQ0UgZXJyb3IsCkBAIC01NTEsMTAgKzU1Myw4IEBACiAJCSAqIERvbid0IGdldCB0aGUgSVAgaGVyZSBiZWNhdXNlIGl0J3MgdW5saWtlbHkgdG8KIAkJICogaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgZXJyb3IgbG9jYXRpb24uCiAJCSAqLwotCQlpZiAoIShmbGFncyAmIE1DUF9ET05UTE9HKSAmJiAhbWNlX2RvbnRfbG9nX2NlKSB7CisJCWlmICghKGZsYWdzICYgTUNQX0RPTlRMT0cpICYmICFtY2VfZG9udF9sb2dfY2UpCiAJCQltY2VfbG9nKCZtKTsKLQkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsICZtKTsKLQkJfQogCiAJCS8qCiAJCSAqIENsZWFyIHN0YXRlIGZvciB0aGlzIGJhbmsuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwppbmRleCAyN2M2MjUxLi43ODdlMDZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21zaHlwZXJ2LmMKaW5kZXggZDk0NGJmNi4uMGE2MzBkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tc2h5cGVydi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXNoeXBlcnYuYwpAQCAtMTEsNiArMTEsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgpAQCAtMzYsNiArMzgsMjUgQEAKIAkJIW1lbWNtcCgiTWljcm9zb2Z0IEh2IiwgaHlwX3NpZ25hdHVyZSwgMTIpOwogfQogCitzdGF0aWMgY3ljbGVfdCByZWFkX2h2X2Nsb2NrKHN0cnVjdCBjbG9ja3NvdXJjZSAqYXJnKQoreworCWN5Y2xlX3QgY3VycmVudF90aWNrOworCS8qCisJICogUmVhZCB0aGUgcGFydGl0aW9uIGNvdW50ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHRpY2sgY291bnQuIFRoaXMgY291bnQKKwkgKiBpcyBzZXQgdG8gMCB3aGVuIHRoZSBwYXJ0aXRpb24gaXMgY3JlYXRlZCBhbmQgaXMgaW5jcmVtZW50ZWQgaW4KKwkgKiAxMDAgbmFub3NlY29uZCB1bml0cy4KKwkgKi8KKwlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKKwlyZXR1cm4gY3VycmVudF90aWNrOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVydl9jcyA9IHsKKwkubmFtZQkJPSAiaHlwZXJ2X2Nsb2Nrc291cmNlIiwKKwkucmF0aW5nCQk9IDQwMCwgLyogdXNlIHRoaXMgd2hlbiBydW5uaW5nIG9uIEh5cGVydiovCisJLnJlYWQJCT0gcmVhZF9odl9jbG9jaywKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBtc19oeXBlcnZfaW5pdF9wbGF0Zm9ybSh2b2lkKQogewogCS8qCkBAIC00Niw2ICs2Nyw4IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJIeXBlclY6IGZlYXR1cmVzIDB4JXgsIGhpbnRzIDB4JXhcbiIsCiAJICAgICAgIG1zX2h5cGVydi5mZWF0dXJlcywgbXNfaHlwZXJ2LmhpbnRzKTsKKworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZoeXBlcnZfY3MsIE5TRUNfUEVSX1NFQy8xMDApOwogfQogCiBjb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfbXNfaHlwZXJ2ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwppbmRleCBlMDljYTIwLi4yYmU1ZWJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3Byb2MuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCmluZGV4IDYyYWM4Y2IuLjE0YjIzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCkBAIC04NSw2ICs4NSw4IEBACiAJCXNlcV9wcmludGYobSwgInN0ZXBwaW5nXHQ6ICVkXG4iLCBjLT54ODZfbWFzayk7CiAJZWxzZQogCQlzZXFfcHJpbnRmKG0sICJzdGVwcGluZ1x0OiB1bmtub3duXG4iKTsKKwlpZiAoYy0+bWljcm9jb2RlKQorCQlzZXFfcHJpbnRmKG0sICJtaWNyb2NvZGVcdDogMHgleFxuIiwgYy0+bWljcm9jb2RlKTsKIAogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RTQykpIHsKIAkJdW5zaWduZWQgaW50IGZyZXEgPSBjcHVmcmVxX3F1aWNrX2dldChjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9yZHJhbmQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcmRyYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYTI4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcmRyYW5kLmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+LAorICogICAgICAgICAgSC4gUGV0ZXIgQW52aW4gPGhwYUBsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYXJjaHJhbmRvbS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCitzdGF0aWMgaW50IF9faW5pdCB4ODZfcmRyYW5kX3NldHVwKGNoYXIgKnMpCit7CisJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9SRFJBTkQpOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9yZHJhbmQiLCB4ODZfcmRyYW5kX3NldHVwKTsKKworLyogV2UgY2FuJ3QgdXNlIGFyY2hfZ2V0X3JhbmRvbV9sb25nKCkgaGVyZSBzaW5jZSBhbHRlcm5hdGl2ZXMgaGF2ZW4ndCBydW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJkcmFuZF9sb25nKHVuc2lnbmVkIGxvbmcgKnYpCit7CisJaW50IG9rOworCWFzbSB2b2xhdGlsZSgiMTogIiBSRFJBTkRfTE9ORyAiXG5cdCIKKwkJICAgICAiamMgMmZcblx0IgorCQkgICAgICJkZWNsICUwXG5cdCIKKwkJICAgICAiam56IDFiXG5cdCIKKwkJICAgICAiMjoiCisJCSAgICAgOiAiPXIiIChvayksICI9YSIgKCp2KQorCQkgICAgIDogIjAiIChSRFJBTkRfUkVUUllfTE9PUFMpKTsKKwlyZXR1cm4gb2s7Cit9CisKKy8qCisgKiBGb3JjZSBhIHJlc2VlZCBjeWNsZTsgd2UgYXJlIGFyY2hpdGVjdHVyYWxseSBndWFyYW50ZWVkIGEgcmVzZWVkCisgKiBhZnRlciBubyBtb3JlIHRoYW4gNTEyIDEyOC1iaXQgY2h1bmtzIG9mIHJhbmRvbSBkYXRhLiAgVGhpcyBhbHNvCisgKiBhY3RzIGFzIGEgdGVzdCBvZiB0aGUgQ1BVIGNhcGFiaWxpdHkuCisgKi8KKyNkZWZpbmUgUkVTRUVEX0xPT1AgKCg1MTIqMTI4KS9zaXplb2YodW5zaWduZWQgbG9uZykpCisKK3ZvaWQgX19jcHVpbml0IHg4Nl9pbml0X3JkcmFuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGksIGNvdW50LCBvazsKKworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9SRFJBTkQpKQorCQlyZXR1cm47CQkvKiBOb3RoaW5nIHRvIGRvICovCisKKwlmb3IgKGNvdW50ID0gaSA9IDA7IGkgPCBSRVNFRURfTE9PUDsgaSsrKSB7CisJCW9rID0gcmRyYW5kX2xvbmcoJnRtcCk7CisJCWlmIChvaykKKwkJCWNvdW50Kys7CisJfQorCisJaWYgKGNvdW50ICE9IFJFU0VFRF9MT09QKQorCQljbGVhcl9jcHVfY2FwKGMsIFg4Nl9GRUFUVVJFX1JEUkFORCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCmluZGV4IGE2MjFmMzQuLjUyODIxNzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYwpAQCAtMiw2ICsyLDcgQEAKICAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBPRiBjYWxsYmFja3MuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCAzZTJlZjg0Li4zMDNhMGU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDRhZWNjNTQuLmI5NDZhOWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggNmMwODAyZS4uNDI5ZTBjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9qdW1wX2xhYmVsLmMKaW5kZXggY2FjZGQ0Ni4uZWE5ZDVmMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMjQsOCArMjQsOSBAQAogCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiB9OwogCi12b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAotCQkJICAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCitzdGF0aWMgdm9pZCBfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKKwkJCQkgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlLAorCQkJCSAgIHZvaWQgKigqcG9rZXIpKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpKQogewogCXVuaW9uIGp1bXBfY29kZV91bmlvbiBjb2RlOwogCkBAIC0zNSwxNyArMzYsMjQgQEAKIAkJCQkoZW50cnktPmNvZGUgKyBKVU1QX0xBQkVMX05PUF9TSVpFKTsKIAl9IGVsc2UKIAkJbWVtY3B5KCZjb2RlLCBpZGVhbF9ub3BzW05PUF9BVE9NSUM1XSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7CisKKwkoKnBva2VyKSgodm9pZCAqKWVudHJ5LT5jb2RlLCAmY29kZSwgSlVNUF9MQUJFTF9OT1BfU0laRSk7Cit9CisKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybShzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkgICAgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKK3sKIAlnZXRfb25saW5lX2NwdXMoKTsKIAltdXRleF9sb2NrKCZ0ZXh0X211dGV4KTsKLQl0ZXh0X3Bva2Vfc21wKCh2b2lkICopZW50cnktPmNvZGUsICZjb2RlLCBKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwlfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlLCB0ZXh0X3Bva2Vfc21wKTsKIAltdXRleF91bmxvY2soJnRleHRfbXV0ZXgpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi12b2lkIF9faW5pdF9vcl9tb2R1bGUgYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShqdW1wX2xhYmVsX3QgYWRkcikKK3ZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCSAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpCiB7Ci0JdGV4dF9wb2tlX2Vhcmx5KCh2b2lkICopYWRkciwgaWRlYWxfbm9wc1tOT1BfQVRPTUlDNV0sCi0JCQlKVU1QX0xBQkVMX05PUF9TSVpFKTsKKwlfX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlLCB0ZXh0X3Bva2VfZWFybHkpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCmluZGV4IDU5MWJlMGUuLmQ0OTQ3OTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYwpAQCAtNzQsMTQgKzc0LDEzIEBACiBzdGF0aWMgaW50IGNvbGxlY3RfY3B1X2luZm9fYW1kKGludCBjcHUsIHN0cnVjdCBjcHVfc2lnbmF0dXJlICpjc2lnKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwotCXUzMiBkdW1teTsKIAogCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EIHx8IGMtPng4NiA8IDB4MTApIHsKIAkJcHJfd2FybmluZygiQ1BVJWQ6IGZhbWlseSAlZCBub3Qgc3VwcG9ydGVkXG4iLCBjcHUsIGMtPng4Nik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZG1zcihNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsIGNzaWctPnJldiwgZHVtbXkpOworCWNzaWctPnJldiA9IGMtPm1pY3JvY29kZTsKIAlwcl9pbmZvKCJDUFUlZDogcGF0Y2hfbGV2ZWw9MHglMDh4XG4iLCBjcHUsIGNzaWctPnJldik7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMCw2ICsxMjksNyBAQAogCWludCBjcHVfbnVtID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKIAlzdHJ1Y3QgbWljcm9jb2RlX2FtZCAqbWNfYW1kID0gdWNpLT5tYzsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKIAogCS8qIFdlIHNob3VsZCBiaW5kIHRoZSB0YXNrIHRvIHRoZSBDUFUgKi8KIAlCVUdfT04oY3B1X251bSAhPSBjcHUpOwpAQCAtMTUwLDYgKzE1MCw3IEBACiAKIAlwcl9pbmZvKCJDUFUlZDogbmV3IHBhdGNoX2xldmVsPTB4JTA4eFxuIiwgY3B1LCByZXYpOwogCXVjaS0+Y3B1X3NpZy5yZXYgPSByZXY7CisJYy0+bWljcm9jb2RlID0gcmV2OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCmluZGV4IGY5MjQyODAuLmYyZDJhNjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfY29yZS5jCkBAIC00ODMsNyArNDgzLDEzIEBACiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOwogCQlwcl9kZWJ1ZygiQ1BVJWQgcmVtb3ZlZFxuIiwgY3B1KTsKIAkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKKworCS8qCisJICogV2hlbiBhIENQVSBnb2VzIG9mZmxpbmUsIGRvbid0IGZyZWUgdXAgb3IgaW52YWxpZGF0ZSB0aGUgY29weSBvZgorCSAqIHRoZSBtaWNyb2NvZGUgaW4ga2VybmVsIG1lbW9yeSwgc28gdGhhdCB3ZSBjYW4gcmV1c2UgaXQgd2hlbiB0aGUKKwkgKiBDUFUgY29tZXMgYmFjayBvbmxpbmUgd2l0aG91dCB1bm5lY2Vzc2FyaWx5IHJlcXVlc3RpbmcgdGhlIHVzZXJzcGFjZQorCSAqIGZvciBpdCBhZ2Fpbi4KKwkgKi8KIAljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46CiAJCS8qIFRoZSBDUFUgcmVmdXNlZCB0byBjb21lIHVwIGR1cmluZyBhIHN5c3RlbSByZXN1bWUgKi8KIAkJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKaW5kZXggMWExYjYwNi4uM2NhNDJkMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwpAQCAtMTYxLDEyICsxNjEsNyBAQAogCQljc2lnLT5wZiA9IDEgPDwgKCh2YWxbMV0gPj4gMTgpICYgNyk7CiAJfQogCi0Jd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKLQkvKiBzZWUgbm90ZXMgYWJvdmUgZm9yIHJldmlzaW9uIDEuMDcuICBBcHBhcmVudCBjaGlwIGJ1ZyAqLwotCXN5bmNfY29yZSgpOwotCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCi0JcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIGNzaWctPnJldik7Ci0KKwljc2lnLT5yZXYgPSBjLT5taWNyb2NvZGU7CiAJcHJfaW5mbygiQ1BVJWQgc2lnPTB4JXgsIHBmPTB4JXgsIHJldmlzaW9uPTB4JXhcbiIsCiAJCWNwdV9udW0sIGNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CiAKQEAgLTI5OSw5ICsyOTQsOSBAQAogCXN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKm1jX2ludGVsOwogCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpOwogCXVuc2lnbmVkIGludCB2YWxbMl07Ci0JaW50IGNwdV9udW07CisJaW50IGNwdV9udW0gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHVfbnVtKTsKIAotCWNwdV9udW0gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCW1jX2ludGVsID0gdWNpLT5tYzsKIApAQCAtMzE3LDcgKzMxMiw3IEBACiAJICAgICAgKHVuc2lnbmVkIGxvbmcpIG1jX2ludGVsLT5iaXRzID4+IDE2ID4+IDE2KTsKIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwogCi0JLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KKwkvKiBBcyBkb2N1bWVudGVkIGluIHRoZSBTRE06IERvIGEgQ1BVSUQgMSBoZXJlICovCiAJc3luY19jb3JlKCk7CiAKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwpAQCAtMzM1LDYgKzMzMCw3IEBACiAJCShtY19pbnRlbC0+aGRyLmRhdGUgPj4gMTYpICYgMHhmZik7CiAKIAl1Y2ktPmNwdV9zaWcucmV2ID0gdmFsWzFdOworCWMtPm1pY3JvY29kZSA9IHZhbFsxXTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL25taS5jIGIvYXJjaC94ODYva2VybmVsL25taS5jCmluZGV4IDdlYzViZDEuLmI5Yzg2MjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tY2EuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggNjIyODcyMC4uODBkYzc5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvYmVfcm9tcy5jCmluZGV4IDYzMjI4MDMuLjM0ZTA2ZTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9iZV9yb21zLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2JlX3JvbXMuYwpAQCAtMTAsOSArMTAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCiAjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KLQotCiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KICNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKaW5kZXggY2NkYmMxNi4uMzQ4Y2UwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3J0Yy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ydGMuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKaW5kZXggMDEzZTdlYi4uMTYyMDRkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKaW5kZXggZmYxNGE1MC4uMDUxNDg5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCkBAIC0xNCwxMCArMTQsNzMgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKKy8qCisgKiBBbGlnbiBhIHZpcnR1YWwgYWRkcmVzcyB0byBhdm9pZCBhbGlhc2luZyBpbiB0aGUgSSQgb24gQU1EIEYxNWguCisgKgorICogQGZsYWdzIGRlbm90ZXMgdGhlIGFsbG9jYXRpb24gZGlyZWN0aW9uIC0gYm90dG9tdXAgb3IgdG9wZG93biAtCisgKiBvciB2RFNPOyBzZWUgY2FsbCBzaXRlcyBiZWxvdy4KKyAqLwordW5zaWduZWQgbG9uZyBhbGlnbl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgZW51bSBhbGlnbl9mbGFncyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIHRtcF9hZGRyOworCisJLyogaGFuZGxlIDMyLSBhbmQgNjQtYml0IGNhc2Ugd2l0aCBhIHNpbmdsZSBjb25kaXRpb25hbCAqLworCWlmICh2YV9hbGlnbi5mbGFncyA8IDAgfHwgISh2YV9hbGlnbi5mbGFncyAmICgyIC0gbW1hcF9pc19pYTMyKCkpKSkKKwkJcmV0dXJuIGFkZHI7CisKKwlpZiAoIShjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkpCisJCXJldHVybiBhZGRyOworCisJaWYgKCEoKGZsYWdzICYgQUxJR05fVkRTTykgfHwgZmlscCkpCisJCXJldHVybiBhZGRyOworCisJdG1wX2FkZHIgPSBhZGRyOworCisJLyoKKwkgKiBXZSBuZWVkIGFuIGFkZHJlc3Mgd2hpY2ggaXMgPD0gdGhhbiB0aGUgb3JpZ2luYWwKKwkgKiBvbmUgb25seSB3aGVuIGluIHRvcGRvd24gZGlyZWN0aW9uLgorCSAqLworCWlmICghKGZsYWdzICYgQUxJR05fVE9QRE9XTikpCisJCXRtcF9hZGRyICs9IHZhX2FsaWduLm1hc2s7CisKKwl0bXBfYWRkciAmPSB+dmFfYWxpZ24ubWFzazsKKworCXJldHVybiB0bXBfYWRkcjsKK30KKworc3RhdGljIGludCBfX2luaXQgY29udHJvbF92YV9hZGRyX2FsaWdubWVudChjaGFyICpzdHIpCit7CisJLyogZ3VhcmQgYWdhaW5zdCBlbmFibGluZyB0aGlzIG9uIG90aGVyIENQVSBmYW1pbGllcyAqLworCWlmICh2YV9hbGlnbi5mbGFncyA8IDApCisJCXJldHVybiAxOworCisJaWYgKCpzdHIgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKnN0ciA9PSAnPScpCisJCXN0cisrOworCisJaWYgKCFzdHJjbXAoc3RyLCAiMzIiKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSBBTElHTl9WQV8zMjsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIjY0IikpCisJCXZhX2FsaWduLmZsYWdzID0gQUxJR05fVkFfNjQ7CisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKKwkJdmFfYWxpZ24uZmxhZ3MgPSBBTElHTl9WQV8zMiB8IEFMSUdOX1ZBXzY0OworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFsaWduX3ZhX2FkZHIiLCBjb250cm9sX3ZhX2FkZHJfYWxpZ25tZW50KTsKKwogU1lTQ0FMTF9ERUZJTkU2KG1tYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIGxlbiwKIAkJdW5zaWduZWQgbG9uZywgcHJvdCwgdW5zaWduZWQgbG9uZywgZmxhZ3MsCiAJCXVuc2lnbmVkIGxvbmcsIGZkLCB1bnNpZ25lZCBsb25nLCBvZmYpCkBAIC05Miw2ICsxNTUsOSBAQAogCXN0YXJ0X2FkZHIgPSBhZGRyOwogCiBmdWxsX3NlYXJjaDoKKworCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIGZpbHAsIDApOworCiAJZm9yICh2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7IDsgdm1hID0gdm1hLT52bV9uZXh0KSB7CiAJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtYSB8fCBhZGRyIDwgdm1hLT52bV9lbmQpLiAqLwogCQlpZiAoZW5kIC0gbGVuIDwgYWRkcikgewpAQCAtMTE3LDYgKzE4Myw3IEBACiAJCQltbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IHZtYS0+dm1fc3RhcnQgLSBhZGRyOwogCiAJCWFkZHIgPSB2bWEtPnZtX2VuZDsKKwkJYWRkciA9IGFsaWduX2FkZHIoYWRkciwgZmlscCwgMCk7CiAJfQogfQogCkBAIC0xNjEsMTAgKzIyOCwxMyBAQAogCiAJLyogbWFrZSBzdXJlIGl0IGNhbiBmaXQgaW4gdGhlIHJlbWFpbmluZyBhZGRyZXNzIHNwYWNlICovCiAJaWYgKGFkZHIgPiBsZW4pIHsKLQkJdm1hID0gZmluZF92bWEobW0sIGFkZHItbGVuKTsKLQkJaWYgKCF2bWEgfHwgYWRkciA8PSB2bWEtPnZtX3N0YXJ0KQorCQl1bnNpZ25lZCBsb25nIHRtcF9hZGRyID0gYWxpZ25fYWRkcihhZGRyIC0gbGVuLCBmaWxwLAorCQkJCQkJICAgIEFMSUdOX1RPUERPV04pOworCisJCXZtYSA9IGZpbmRfdm1hKG1tLCB0bXBfYWRkcik7CisJCWlmICghdm1hIHx8IHRtcF9hZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQpCiAJCQkvKiByZW1lbWJlciB0aGUgYWRkcmVzcyBhcyBhIGhpbnQgZm9yIG5leHQgdGltZSAqLwotCQkJcmV0dXJuIG1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyLWxlbjsKKwkJCXJldHVybiBtbS0+ZnJlZV9hcmVhX2NhY2hlID0gdG1wX2FkZHI7CiAJfQogCiAJaWYgKG1tLT5tbWFwX2Jhc2UgPCBsZW4pCkBAIC0xNzMsNiArMjQzLDggQEAKIAlhZGRyID0gbW0tPm1tYXBfYmFzZS1sZW47CiAKIAlkbyB7CisJCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIGZpbHAsIEFMSUdOX1RPUERPV04pOworCiAJCS8qCiAJCSAqIExvb2t1cCBmYWlsdXJlIG1lYW5zIG5vIHZtYSBpcyBhYm92ZSB0aGlzIGFkZHJlc3MsCiAJCSAqIGVsc2UgaWYgbmV3IHJlZ2lvbiBmaXRzIGJlbG93IHZtYS0+dm1fc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUwppbmRleCBiYzE5YmUzLi45YTBlMzEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKQEAgLTM0NiwzICszNDYsNSBAQAogCS5sb25nIHN5c19zeW5jZnMKIAkubG9uZyBzeXNfc2VuZG1tc2cJCS8qIDM0NSAqLwogCS5sb25nIHN5c19zZXRucworCS5sb25nIHN5c19wcm9jZXNzX3ZtX3JlYWR2CisJLmxvbmcgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCmluZGV4IGUwN2EyZmMuLmUyNDEwZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hX3JlbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDVhNjRkMDUuLmRkNWZiZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2k4MjUzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21jYS5oPgogCiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDg5Mjc0ODYuLjc2ZWU5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90b3BvbG9neS5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgogICovCiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF82NC5jCmluZGV4IGI1NmM2NWRlLi5lNGQ0YTIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKaW5kZXggOGI0Y2M1Zi4uZjFlM2JlMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKKysrIGIvYXJjaC94ODYva3ZtL2VtdWxhdGUuYwpAQCAtMjksNiArMjksMzkgQEAKICNpbmNsdWRlICJ0c3MuaCIKIAogLyoKKyAqIE9wZXJhbmQgdHlwZXMKKyAqLworI2RlZmluZSBPcE5vbmUgICAgICAgICAgICAgMHVsbAorI2RlZmluZSBPcEltcGxpY2l0ICAgICAgICAgMXVsbCAgLyogTm8gZ2VuZXJpYyBkZWNvZGUgKi8KKyNkZWZpbmUgT3BSZWcgICAgICAgICAgICAgIDJ1bGwgIC8qIFJlZ2lzdGVyICovCisjZGVmaW5lIE9wTWVtICAgICAgICAgICAgICAzdWxsICAvKiBNZW1vcnkgKi8KKyNkZWZpbmUgT3BBY2MgICAgICAgICAgICAgIDR1bGwgIC8qIEFjY3VtdWxhdG9yOiBBTC9BWC9FQVgvUkFYICovCisjZGVmaW5lIE9wREkgICAgICAgICAgICAgICA1dWxsICAvKiBFUzpESS9FREkvUkRJICovCisjZGVmaW5lIE9wTWVtNjQgICAgICAgICAgICA2dWxsICAvKiBNZW1vcnksIDY0LWJpdCAqLworI2RlZmluZSBPcEltbVVCeXRlICAgICAgICAgN3VsbCAgLyogWmVyby1leHRlbmRlZCA4LWJpdCBpbW1lZGlhdGUgKi8KKyNkZWZpbmUgT3BEWCAgICAgICAgICAgICAgIDh1bGwgIC8qIERYIHJlZ2lzdGVyICovCisjZGVmaW5lIE9wQ0wgICAgICAgICAgICAgICA5dWxsICAvKiBDTCByZWdpc3RlciAoZm9yIHNoaWZ0cykgKi8KKyNkZWZpbmUgT3BJbW1CeXRlICAgICAgICAgMTB1bGwgIC8qIDgtYml0IHNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlICovCisjZGVmaW5lIE9wT25lICAgICAgICAgICAgIDExdWxsICAvKiBJbXBsaWVkIDEgKi8KKyNkZWZpbmUgT3BJbW0gICAgICAgICAgICAgMTJ1bGwgIC8qIFNpZ24gZXh0ZW5kZWQgaW1tZWRpYXRlICovCisjZGVmaW5lIE9wTWVtMTYgICAgICAgICAgIDEzdWxsICAvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KKyNkZWZpbmUgT3BNZW0zMiAgICAgICAgICAgMTR1bGwgIC8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLworI2RlZmluZSBPcEltbVUgICAgICAgICAgICAxNXVsbCAgLyogSW1tZWRpYXRlIG9wZXJhbmQsIHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgT3BTSSAgICAgICAgICAgICAgMTZ1bGwgIC8qIFNJL0VTSS9SU0kgKi8KKyNkZWZpbmUgT3BJbW1GQWRkciAgICAgICAgMTd1bGwgIC8qIEltbWVkaWF0ZSBmYXIgYWRkcmVzcyAqLworI2RlZmluZSBPcE1lbUZBZGRyICAgICAgICAxOHVsbCAgLyogRmFyIGFkZHJlc3MgaW4gbWVtb3J5ICovCisjZGVmaW5lIE9wSW1tVTE2ICAgICAgICAgIDE5dWxsICAvKiBJbW1lZGlhdGUgb3BlcmFuZCwgMTYgYml0cywgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBPcEVTICAgICAgICAgICAgICAyMHVsbCAgLyogRVMgKi8KKyNkZWZpbmUgT3BDUyAgICAgICAgICAgICAgMjF1bGwgIC8qIENTICovCisjZGVmaW5lIE9wU1MgICAgICAgICAgICAgIDIydWxsICAvKiBTUyAqLworI2RlZmluZSBPcERTICAgICAgICAgICAgICAyM3VsbCAgLyogRFMgKi8KKyNkZWZpbmUgT3BGUyAgICAgICAgICAgICAgMjR1bGwgIC8qIEZTICovCisjZGVmaW5lIE9wR1MgICAgICAgICAgICAgIDI1dWxsICAvKiBHUyAqLworCisjZGVmaW5lIE9wQml0cyAgICAgICAgICAgICA1ICAvKiBXaWR0aCBvZiBvcGVyYW5kIGZpZWxkICovCisjZGVmaW5lIE9wTWFzayAgICAgICAgICAgICAoKDF1bGwgPDwgT3BCaXRzKSAtIDEpCisKKy8qCiAgKiBPcGNvZGUgZWZmZWN0aXZlLWFkZHJlc3MgZGVjb2RlIHRhYmxlcy4KICAqIE5vdGUgdGhhdCB3ZSBvbmx5IGVtdWxhdGUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgbWVtb3J5CiAgKiBvcGVyYW5kIChleGNsdWRpbmcgaW1wbGljaXQgc3RhY2sgcmVmZXJlbmNlcykuIFdlIGFzc3VtZSB0aGF0IHN0YWNrCkBAIC00MCwzNyArNzMsMzUgQEAKIC8qIE9wZXJhbmQgc2l6ZXM6IDgtYml0IG9wZXJhbmRzIG9yIHNwZWNpZmllZC9vdmVycmlkZGVuIHNpemUuICovCiAjZGVmaW5lIEJ5dGVPcCAgICAgICgxPDwwKQkvKiA4LWJpdCBvcGVyYW5kcy4gKi8KIC8qIERlc3RpbmF0aW9uIG9wZXJhbmQgdHlwZS4gKi8KLSNkZWZpbmUgSW1wbGljaXRPcHMgKDE8PDEpCS8qIEltcGxpY2l0IGluIG9wY29kZS4gTm8gZ2VuZXJpYyBkZWNvZGUuICovCi0jZGVmaW5lIERzdFJlZyAgICAgICgyPDwxKQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwotI2RlZmluZSBEc3RNZW0gICAgICAoMzw8MSkJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIERzdEFjYyAgICAgICg0PDwxKQkvKiBEZXN0aW5hdGlvbiBBY2N1bXVsYXRvciAqLwotI2RlZmluZSBEc3RESSAgICAgICAoNTw8MSkJLyogRGVzdGluYXRpb24gaXMgaW4gRVM6KEUpREkgKi8KLSNkZWZpbmUgRHN0TWVtNjQgICAgKDY8PDEpCS8qIDY0Yml0IG1lbW9yeSBvcGVyYW5kICovCi0jZGVmaW5lIERzdEltbVVCeXRlICg3PDwxKQkvKiA4LWJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZCAqLwotI2RlZmluZSBEc3REWCAgICAgICAoODw8MSkJLyogRGVzdGluYXRpb24gaXMgaW4gRFggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRHN0TWFzayAgICAgKDB4Zjw8MSkKKyNkZWZpbmUgRHN0U2hpZnQgICAgMQorI2RlZmluZSBJbXBsaWNpdE9wcyAoT3BJbXBsaWNpdCA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0UmVnICAgICAgKE9wUmVnIDw8IERzdFNoaWZ0KQorI2RlZmluZSBEc3RNZW0gICAgICAoT3BNZW0gPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdEFjYyAgICAgIChPcEFjYyA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0REkgICAgICAgKE9wREkgPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdE1lbTY0ICAgIChPcE1lbTY0IDw8IERzdFNoaWZ0KQorI2RlZmluZSBEc3RJbW1VQnl0ZSAoT3BJbW1VQnl0ZSA8PCBEc3RTaGlmdCkKKyNkZWZpbmUgRHN0RFggICAgICAgKE9wRFggPDwgRHN0U2hpZnQpCisjZGVmaW5lIERzdE1hc2sgICAgIChPcE1hc2sgPDwgRHN0U2hpZnQpCiAvKiBTb3VyY2Ugb3BlcmFuZCB0eXBlLiAqLwotI2RlZmluZSBTcmNOb25lICAgICAoMDw8NSkJLyogTm8gc291cmNlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY1JlZyAgICAgICgxPDw1KQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNNZW0gICAgICAoMjw8NSkJLyogTWVtb3J5IG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY01lbTE2ICAgICgzPDw1KQkvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KLSNkZWZpbmUgU3JjTWVtMzIgICAgKDQ8PDUpCS8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLwotI2RlZmluZSBTcmNJbW0gICAgICAoNTw8NSkJLyogSW1tZWRpYXRlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY0ltbUJ5dGUgICg2PDw1KQkvKiA4LWJpdCBzaWduLWV4dGVuZGVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLwotI2RlZmluZSBTcmNPbmUgICAgICAoNzw8NSkJLyogSW1wbGllZCAnMScgKi8KLSNkZWZpbmUgU3JjSW1tVUJ5dGUgKDg8PDUpICAgICAgLyogOC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQuICovCi0jZGVmaW5lIFNyY0ltbVUgICAgICg5PDw1KSAgICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kLCB1bnNpZ25lZCAqLwotI2RlZmluZSBTcmNTSSAgICAgICAoMHhhPDw1KQkvKiBTb3VyY2UgaXMgaW4gdGhlIERTOlJTSSAqLwotI2RlZmluZSBTcmNJbW1GQWRkciAoMHhiPDw1KQkvKiBTb3VyY2UgaXMgaW1tZWRpYXRlIGZhciBhZGRyZXNzICovCi0jZGVmaW5lIFNyY01lbUZBZGRyICgweGM8PDUpCS8qIFNvdXJjZSBpcyBmYXIgYWRkcmVzcyBpbiBtZW1vcnkgKi8KLSNkZWZpbmUgU3JjQWNjICAgICAgKDB4ZDw8NSkJLyogU291cmNlIEFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNyY0ltbVUxNiAgICgweGU8PDUpICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kLCB1bnNpZ25lZCwgMTYgYml0cyAqLwotI2RlZmluZSBTcmNEWCAgICAgICAoMHhmPDw1KQkvKiBTb3VyY2UgaXMgaW4gRFggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NSkKLS8qIEdlbmVyaWMgTW9kUk0gZGVjb2RlLiAqLwotI2RlZmluZSBNb2RSTSAgICAgICAoMTw8OSkKLS8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KLSNkZWZpbmUgTW92ICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBTcmNTaGlmdCAgICA2CisjZGVmaW5lIFNyY05vbmUgICAgIChPcE5vbmUgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY1JlZyAgICAgIChPcFJlZyA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjTWVtICAgICAgKE9wTWVtIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNZW0xNiAgICAoT3BNZW0xNiA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjTWVtMzIgICAgKE9wTWVtMzIgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0ltbSAgICAgIChPcEltbSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjSW1tQnl0ZSAgKE9wSW1tQnl0ZSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjT25lICAgICAgKE9wT25lIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNJbW1VQnl0ZSAoT3BJbW1VQnl0ZSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjSW1tVSAgICAgKE9wSW1tVSA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjU0kgICAgICAgKE9wU0kgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0ltbUZBZGRyIChPcEltbUZBZGRyIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNZW1GQWRkciAoT3BNZW1GQWRkciA8PCBTcmNTaGlmdCkKKyNkZWZpbmUgU3JjQWNjICAgICAgKE9wQWNjIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNJbW1VMTYgICAoT3BJbW1VMTYgPDwgU3JjU2hpZnQpCisjZGVmaW5lIFNyY0RYICAgICAgIChPcERYIDw8IFNyY1NoaWZ0KQorI2RlZmluZSBTcmNNYXNrICAgICAoT3BNYXNrIDw8IFNyY1NoaWZ0KQogI2RlZmluZSBCaXRPcCAgICAgICAoMTw8MTEpCiAjZGVmaW5lIE1lbUFicyAgICAgICgxPDwxMikgICAgICAvKiBNZW1vcnkgb3BlcmFuZCBpcyBhYnNvbHV0ZSBkaXNwbGFjZW1lbnQgKi8KICNkZWZpbmUgU3RyaW5nICAgICAgKDE8PDEzKSAgICAgLyogU3RyaW5nIGluc3RydWN0aW9uIChyZXAgY2FwYWJsZSkgKi8KQEAgLTgxLDYgKzExMiwxMCBAQAogI2RlZmluZSBQcmVmaXggICAgICAoMzw8MTUpICAgICAvKiBJbnN0cnVjdGlvbiB2YXJpZXMgd2l0aCA2Ni9mMi9mMyBwcmVmaXggKi8KICNkZWZpbmUgUk1FeHQgICAgICAgKDQ8PDE1KSAgICAgLyogT3Bjb2RlIGV4dGVuc2lvbiBpbiBNb2RSTSByL20gaWYgbW9kID09IDMgKi8KICNkZWZpbmUgU3NlICAgICAgICAgKDE8PDE4KSAgICAgLyogU1NFIFZlY3RvciBpbnN0cnVjdGlvbiAqLworLyogR2VuZXJpYyBNb2RSTSBkZWNvZGUuICovCisjZGVmaW5lIE1vZFJNICAgICAgICgxPDwxOSkKKy8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDIwKQogLyogTWlzYyBmbGFncyAqLwogI2RlZmluZSBQcm90ICAgICAgICAoMTw8MjEpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjVUQgaWYgbm90IGluIHByb3QtbW9kZSAqLwogI2RlZmluZSBWZW5kb3JTcGVjaWZpYyAoMTw8MjIpIC8qIFZlbmRvciBzcGVjaWZpYyBpbnN0cnVjdGlvbiAqLwpAQCAtOTEsMTIgKzEyNiwxOSBAQAogI2RlZmluZSBQcml2ICAgICAgICAoMTw8MjcpIC8qIGluc3RydWN0aW9uIGdlbmVyYXRlcyAjR1AgaWYgY3VycmVudCBDUEwgIT0gMCAqLwogI2RlZmluZSBObzY0CSAgICAoMTw8MjgpCiAvKiBTb3VyY2UgMiBvcGVyYW5kIHR5cGUgKi8KLSNkZWZpbmUgU3JjMk5vbmUgICAgKDA8PDI5KQotI2RlZmluZSBTcmMyQ0wgICAgICAoMTw8MjkpCi0jZGVmaW5lIFNyYzJJbW1CeXRlICgyPDwyOSkKLSNkZWZpbmUgU3JjMk9uZSAgICAgKDM8PDI5KQotI2RlZmluZSBTcmMySW1tICAgICAoNDw8MjkpCi0jZGVmaW5lIFNyYzJNYXNrICAgICg3PDwyOSkKKyNkZWZpbmUgU3JjMlNoaWZ0ICAgKDI5KQorI2RlZmluZSBTcmMyTm9uZSAgICAoT3BOb25lIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkNMICAgICAgKE9wQ0wgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMySW1tQnl0ZSAoT3BJbW1CeXRlIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMk9uZSAgICAgKE9wT25lIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkltbSAgICAgKE9wSW1tIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkVTICAgICAgKE9wRVMgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMyQ1MgICAgICAoT3BDUyA8PCBTcmMyU2hpZnQpCisjZGVmaW5lIFNyYzJTUyAgICAgIChPcFNTIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMkRTICAgICAgKE9wRFMgPDwgU3JjMlNoaWZ0KQorI2RlZmluZSBTcmMyRlMgICAgICAoT3BGUyA8PCBTcmMyU2hpZnQpCisjZGVmaW5lIFNyYzJHUyAgICAgIChPcEdTIDw8IFNyYzJTaGlmdCkKKyNkZWZpbmUgU3JjMk1hc2sgICAgKE9wTWFzayA8PCBTcmMyU2hpZnQpCiAKICNkZWZpbmUgWDIoeC4uLikgeCwgeAogI2RlZmluZSBYMyh4Li4uKSBYMih4KSwgeApAQCAtMTA4LDggKzE1MCw4IEBACiAjZGVmaW5lIFgxNih4Li4uKSBYOCh4KSwgWDgoeCkKIAogc3RydWN0IG9wY29kZSB7Ci0JdTMyIGZsYWdzOwotCXU4IGludGVyY2VwdDsKKwl1NjQgZmxhZ3MgOiA1NjsKKwl1NjQgaW50ZXJjZXB0IDogODsKIAl1bmlvbiB7CiAJCWludCAoKmV4ZWN1dGUpKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KTsKIAkJc3RydWN0IG9wY29kZSAqZ3JvdXA7CkBAIC0yMDUsMTA1ICsyNDcsMTAwIEBACiAjZGVmaW5lIE9ONjQoeCkKICNlbmRpZgogCi0jZGVmaW5lIF9fX19lbXVsYXRlXzJvcChfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsIF94LCBfeSwgX3N1ZmZpeCwgX2RzdHR5cGUpIFwKKyNkZWZpbmUgX19fX2VtdWxhdGVfMm9wKGN0eHQsIF9vcCwgX3gsIF95LCBfc3VmZml4LCBfZHN0dHlwZSkJXAogCWRvIHsJCQkJCQkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJXAogCQkJX1BSRV9FRkxBR1MoIjAiLCAiNCIsICIyIikJCQlcCiAJCQlfb3AgX3N1ZmZpeCAiICUiX3giMywlMTsgIgkJCVwKIAkJCV9QT1NUX0VGTEFHUygiMCIsICI0IiwgIjIiKQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICIrcSIgKCooX2RzdHR5cGUqKSYoX2RzdCkudmFsKSxcCisJCQk6ICI9bSIgKChjdHh0KS0+ZWZsYWdzKSwJCQlcCisJCQkgICIrcSIgKCooX2RzdHR5cGUqKSYoY3R4dCktPmRzdC52YWwpLAkJXAogCQkJICAiPSZyIiAoX3RtcCkJCQkJCVwKLQkJCTogX3kgKChfc3JjKS52YWwpLCAiaSIgKEVGTEFHU19NQVNLKSk7CQlcCisJCQk6IF95ICgoY3R4dCktPnNyYy52YWwpLCAiaSIgKEVGTEFHU19NQVNLKSk7CVwKIAl9IHdoaWxlICgwKQogCiAKIC8qIFJhdyBlbXVsYXRpb246IGluc3RydWN0aW9uIGhhcyB0d28gZXhwbGljaXQgb3BlcmFuZHMuICovCi0jZGVmaW5lIF9fZW11bGF0ZV8yb3Bfbm9ieXRlKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfd3gsX3d5LF9seCxfbHksX3F4LF9xeSkgXAorI2RlZmluZSBfX2VtdWxhdGVfMm9wX25vYnl0ZShjdHh0LF9vcCxfd3gsX3d5LF9seCxfbHksX3F4LF9xeSkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCVwKIAkJCQkJCQkJCVwKLQkJc3dpdGNoICgoX2RzdCkuYnl0ZXMpIHsJCQkJCVwKKwkJc3dpdGNoICgoY3R4dCktPmRzdC5ieXRlcykgewkJCQlcCiAJCWNhc2UgMjoJCQkJCQkJXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfd3gsX3d5LCJ3Iix1MTYpO1wKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfd3gsX3d5LCJ3Iix1MTYpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgNDoJCQkJCQkJXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfbHgsX2x5LCJsIix1MzIpO1wKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfbHgsX2x5LCJsIix1MzIpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgODoJCQkJCQkJXAotCQkJT042NChfX19fZW11bGF0ZV8yb3AoX29wLF9zcmMsX2RzdCxfZWZsYWdzLF9xeCxfcXksInEiLHU2NCkpOyBcCisJCQlPTjY0KF9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfcXgsX3F5LCJxIix1NjQpKTsgXAogCQkJYnJlYWs7CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9fZW11bGF0ZV8yb3AoX29wLF9zcmMsX2RzdCxfZWZsYWdzLF9ieCxfYnksX3d4LF93eSxfbHgsX2x5LF9xeCxfcXkpIFwKKyNkZWZpbmUgX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfYngsX2J5LF93eCxfd3ksX2x4LF9seSxfcXgsX3F5KQkJICAgICBcCiAJZG8gewkJCQkJCQkJICAgICBcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCSAgICAgXAotCQlzd2l0Y2ggKChfZHN0KS5ieXRlcykgewkJCQkgICAgICAgICAgICAgXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCSAgICAgXAogCQljYXNlIDE6CQkJCQkJCSAgICAgXAotCQkJX19fX2VtdWxhdGVfMm9wKF9vcCxfc3JjLF9kc3QsX2VmbGFncyxfYngsX2J5LCJiIix1OCk7IFwKKwkJCV9fX19lbXVsYXRlXzJvcChjdHh0LF9vcCxfYngsX2J5LCJiIix1OCk7CSAgICAgXAogCQkJYnJlYWs7CQkJCQkJICAgICBcCiAJCWRlZmF1bHQ6CQkJCQkJICAgICBcCi0JCQlfX2VtdWxhdGVfMm9wX25vYnl0ZShfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsCSAgICAgXAorCQkJX19lbXVsYXRlXzJvcF9ub2J5dGUoY3R4dCwgX29wLAkJCSAgICAgXAogCQkJCQkgICAgIF93eCwgX3d5LCBfbHgsIF9seSwgX3F4LCBfcXkpOyAgXAogCQkJYnJlYWs7CQkJCQkJICAgICBcCiAJCX0JCQkJCQkJICAgICBcCiAJfSB3aGlsZSAoMCkKIAogLyogU291cmNlIG9wZXJhbmQgaXMgYnl0ZS1zaXplZCBhbmQgbWF5IGJlIHJlc3RyaWN0ZWQgdG8ganVzdCAlY2wuICovCi0jZGVmaW5lIGVtdWxhdGVfMm9wX1NyY0IoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzKSAgICAgICAgICAgICAgICAgICAgICBcCi0JX19lbXVsYXRlXzJvcChfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsCQkJCVwKLQkJICAgICAgImIiLCAiYyIsICJiIiwgImMiLCAiYiIsICJjIiwgImIiLCAiYyIpCisjZGVmaW5lIGVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgX29wKQkJCQkJXAorCV9fZW11bGF0ZV8yb3AoY3R4dCwgX29wLCAiYiIsICJjIiwgImIiLCAiYyIsICJiIiwgImMiLCAiYiIsICJjIikKIAogLyogU291cmNlIG9wZXJhbmQgaXMgYnl0ZSwgd29yZCwgbG9uZyBvciBxdWFkIHNpemVkLiAqLwotI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICAgICAgICAgXAotCV9fZW11bGF0ZV8yb3AoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAkJCQlcCi0JCSAgICAgICJiIiwgInEiLCAidyIsICJyIiwgX0xPMzIsICJyIiwgIiIsICJyIikKKyNkZWZpbmUgZW11bGF0ZV8yb3BfU3JjVihjdHh0LCBfb3ApCQkJCQlcCisJX19lbXVsYXRlXzJvcChjdHh0LCBfb3AsICJiIiwgInEiLCAidyIsICJyIiwgX0xPMzIsICJyIiwgIiIsICJyIikKIAogLyogU291cmNlIG9wZXJhbmQgaXMgd29yZCwgbG9uZyBvciBxdWFkIHNpemVkLiAqLwotI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MpICAgICAgICAgICAgICAgXAotCV9fZW11bGF0ZV8yb3Bfbm9ieXRlKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncywJCQlcCi0JCQkgICAgICJ3IiwgInIiLCBfTE8zMiwgInIiLCAiIiwgInIiKQorI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCBfb3ApCQkJCVwKKwlfX2VtdWxhdGVfMm9wX25vYnl0ZShjdHh0LCBfb3AsICJ3IiwgInIiLCBfTE8zMiwgInIiLCAiIiwgInIiKQogCiAvKiBJbnN0cnVjdGlvbiBoYXMgdGhyZWUgb3BlcmFuZHMgYW5kIG9uZSBvcGVyYW5kIGlzIHN0b3JlZCBpbiBFQ1ggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgX19lbXVsYXRlXzJvcF9jbChfb3AsIF9jbCwgX3NyYywgX2RzdCwgX2VmbGFncywgX3N1ZmZpeCwgX3R5cGUpCVwKKyNkZWZpbmUgX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsIF9zdWZmaXgsIF90eXBlKQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJXAotCQlfdHlwZSBfY2x2ICA9IChfY2wpLnZhbDsJCQkJXAotCQlfdHlwZSBfc3JjdiA9IChfc3JjKS52YWw7CQkJCVwKLQkJX3R5cGUgX2RzdHYgPSAoX2RzdCkudmFsOwkJCQlcCisJCV90eXBlIF9jbHYgID0gKGN0eHQpLT5zcmMyLnZhbDsJCQkJXAorCQlfdHlwZSBfc3JjdiA9IChjdHh0KS0+c3JjLnZhbDsJCQkJXAorCQlfdHlwZSBfZHN0diA9IChjdHh0KS0+ZHN0LnZhbDsJCQkJXAogCQkJCQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCiAJCQlfUFJFX0VGTEFHUygiMCIsICI1IiwgIjIiKQkJCVwKIAkJCV9vcCBfc3VmZml4ICIgJTQsJTEgXG4iCQkJCVwKIAkJCV9QT1NUX0VGTEFHUygiMCIsICI1IiwgIjIiKQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICIrciIgKF9kc3R2KSwgIj0mciIgKF90bXApCVwKKwkJCTogIj1tIiAoKGN0eHQpLT5lZmxhZ3MpLCAiK3IiIChfZHN0diksICI9JnIiIChfdG1wKSBcCiAJCQk6ICJjIiAoX2NsdikgLCAiciIgKF9zcmN2KSwgImkiIChFRkxBR1NfTUFTSykJXAogCQkJKTsJCQkJCQlcCiAJCQkJCQkJCQlcCi0JCShfY2wpLnZhbCAgPSAodW5zaWduZWQgbG9uZykgX2NsdjsJCQlcCi0JCShfc3JjKS52YWwgPSAodW5zaWduZWQgbG9uZykgX3NyY3Y7CQkJXAotCQkoX2RzdCkudmFsID0gKHVuc2lnbmVkIGxvbmcpIF9kc3R2OwkJCVwKKwkJKGN0eHQpLT5zcmMyLnZhbCAgPSAodW5zaWduZWQgbG9uZykgX2NsdjsJCVwKKwkJKGN0eHQpLT5zcmMyLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBfc3JjdjsJCVwKKwkJKGN0eHQpLT5kc3QudmFsID0gKHVuc2lnbmVkIGxvbmcpIF9kc3R2OwkJXAogCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgZW11bGF0ZV8yb3BfY2woX29wLCBfY2wsIF9zcmMsIF9kc3QsIF9lZmxhZ3MpCQkJXAorI2RlZmluZSBlbXVsYXRlXzJvcF9jbChjdHh0LCBfb3ApCQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQlzd2l0Y2ggKChfZHN0KS5ieXRlcykgewkJCQkJXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCVwKIAkJY2FzZSAyOgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMm9wX2NsKF9vcCwgX2NsLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAlcCi0JCQkJCSAidyIsIHVuc2lnbmVkIHNob3J0KTsgICAgICAgICAJXAorCQkJX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJ3IiwgdTE2KTsJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMm9wX2NsKF9vcCwgX2NsLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAlcCi0JCQkJCSAibCIsIHVuc2lnbmVkIGludCk7ICAgICAgICAgICAJXAorCQkJX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJsIiwgdTMyKTsJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA4OgkJCQkJCQlcCi0JCQlPTjY0KF9fZW11bGF0ZV8yb3BfY2woX29wLCBfY2wsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsIFwKLQkJCQkJICAgICAgInEiLCB1bnNpZ25lZCBsb25nKSk7CVwKKwkJCU9ONjQoX19lbXVsYXRlXzJvcF9jbChjdHh0LCBfb3AsICJxIiwgdWxvbmcpKTsJXAogCQkJYnJlYWs7CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0jZGVmaW5lIF9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCBfc3VmZml4KQkJCVwKKyNkZWZpbmUgX19lbXVsYXRlXzFvcChjdHh0LCBfb3AsIF9zdWZmaXgpCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTMxMSwzOSArMzQ4LDI3IEBACiAJCQlfUFJFX0VGTEFHUygiMCIsICIzIiwgIjIiKQkJCVwKIAkJCV9vcCBfc3VmZml4ICIgJTE7ICIJCQkJXAogCQkJX1BPU1RfRUZMQUdTKCIwIiwgIjMiLCAiMiIpCQkJXAotCQkJOiAiPW0iIChfZWZsYWdzKSwgIittIiAoKF9kc3QpLnZhbCksCQlcCisJCQk6ICI9bSIgKChjdHh0KS0+ZWZsYWdzKSwgIittIiAoKGN0eHQpLT5kc3QudmFsKSwgXAogCQkJICAiPSZyIiAoX3RtcCkJCQkJCVwKIAkJCTogImkiIChFRkxBR1NfTUFTSykpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAogLyogSW5zdHJ1Y3Rpb24gaGFzIG9ubHkgb25lIGV4cGxpY2l0IG9wZXJhbmQgKG5vIHNvdXJjZSBvcGVyYW5kKS4gKi8KLSNkZWZpbmUgZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgZW11bGF0ZV8xb3AoY3R4dCwgX29wKQkJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCXN3aXRjaCAoKF9kc3QpLmJ5dGVzKSB7CQkJCSAgICAgICAgXAotCQljYXNlIDE6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAiYiIpOyBicmVhazsJXAotCQljYXNlIDI6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAidyIpOyBicmVhazsJXAotCQljYXNlIDQ6CV9fZW11bGF0ZV8xb3AoX29wLCBfZHN0LCBfZWZsYWdzLCAibCIpOyBicmVhazsJXAotCQljYXNlIDg6CU9ONjQoX19lbXVsYXRlXzFvcChfb3AsIF9kc3QsIF9lZmxhZ3MsICJxIikpOyBicmVhazsgXAorCQlzd2l0Y2ggKChjdHh0KS0+ZHN0LmJ5dGVzKSB7CQkJCVwKKwkJY2FzZSAxOglfX2VtdWxhdGVfMW9wKGN0eHQsIF9vcCwgImIiKTsgYnJlYWs7CQlcCisJCWNhc2UgMjoJX19lbXVsYXRlXzFvcChjdHh0LCBfb3AsICJ3Iik7IGJyZWFrOwkJXAorCQljYXNlIDQ6CV9fZW11bGF0ZV8xb3AoY3R4dCwgX29wLCAibCIpOyBicmVhazsJCVwKKwkJY2FzZSA4OglPTjY0KF9fZW11bGF0ZV8xb3AoY3R4dCwgX29wLCAicSIpKTsgYnJlYWs7CVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBfX2VtdWxhdGVfMW9wX3JheF9yZHgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBfZWZsYWdzLCBfc3VmZml4KQkJXAorI2RlZmluZSBfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCBfc3VmZml4LCBfZXgpCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJXAotCQkJCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQlcCi0JCQlfUFJFX0VGTEFHUygiMCIsICI0IiwgIjEiKQkJCVwKLQkJCV9vcCBfc3VmZml4ICIgJTU7ICIJCQkJXAotCQkJX1BPU1RfRUZMQUdTKCIwIiwgIjQiLCAiMSIpCQkJXAotCQkJOiAiPW0iIChfZWZsYWdzKSwgIj0mciIgKF90bXApLAkJCVwKLQkJCSAgIithIiAoX3JheCksICIrZCIgKF9yZHgpCQkJXAotCQkJOiAiaSIgKEVGTEFHU19NQVNLKSwgIm0iICgoX3NyYykudmFsKSwJCVwKLQkJCSAgImEiIChfcmF4KSwgImQiIChfcmR4KSk7CQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19lbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgX2VmbGFncywgX3N1ZmZpeCwgX2V4KSBcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIF90bXA7CQkJCQlcCisJCXVsb25nICpyYXggPSAmKGN0eHQpLT5yZWdzW1ZDUFVfUkVHU19SQVhdOwkJXAorCQl1bG9uZyAqcmR4ID0gJihjdHh0KS0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsJCVwKIAkJCQkJCQkJCVwKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJXAogCQkJX1BSRV9FRkxBR1MoIjAiLCAiNSIsICIxIikJCQlcCkBAIC0zNTYsNTMgKzM4MSwyNyBAQAogCQkJImptcCAyYiBcblx0IgkJCQkJXAogCQkJIi5wb3BzZWN0aW9uIFxuXHQiCQkJCVwKIAkJCV9BU01fRVhUQUJMRSgxYiwgM2IpCQkJCVwKLQkJCTogIj1tIiAoX2VmbGFncyksICI9JnIiIChfdG1wKSwJCQlcCi0JCQkgICIrYSIgKF9yYXgpLCAiK2QiIChfcmR4KSwgIitxbSIoX2V4KQkJXAotCQkJOiAiaSIgKEVGTEFHU19NQVNLKSwgIm0iICgoX3NyYykudmFsKSwJCVwKLQkJCSAgImEiIChfcmF4KSwgImQiIChfcmR4KSk7CQkJXAorCQkJOiAiPW0iICgoY3R4dCktPmVmbGFncyksICI9JnIiIChfdG1wKSwJCVwKKwkJCSAgIithIiAoKnJheCksICIrZCIgKCpyZHgpLCAiK3FtIihfZXgpCQlcCisJCQk6ICJpIiAoRUZMQUdTX01BU0spLCAibSIgKChjdHh0KS0+c3JjLnZhbCksCVwKKwkJCSAgImEiICgqcmF4KSwgImQiICgqcmR4KSk7CQkJXAogCX0gd2hpbGUgKDApCiAKIC8qIGluc3RydWN0aW9uIGhhcyBvbmx5IG9uZSBzb3VyY2Ugb3BlcmFuZCwgZGVzdGluYXRpb24gaXMgaW1wbGljaXQgKGUuZy4gbXVsLCBkaXYsIGltdWwsIGlkaXYpICovCi0jZGVmaW5lIGVtdWxhdGVfMW9wX3JheF9yZHgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBfZWZsYWdzKQkJXAorI2RlZmluZSBlbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgX2V4KQlcCiAJZG8gewkJCQkJCQkJXAotCQlzd2l0Y2goKF9zcmMpLmJ5dGVzKSB7CQkJCQlcCisJCXN3aXRjaCgoY3R4dCktPnNyYy5ieXRlcykgewkJCQlcCiAJCWNhc2UgMToJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAiYiIpOwkJXAorCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgImIiLCBfZXgpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgMjoJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAidyIpOwkJXAorCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsIF9vcCwgInciLCBfZXgpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCWNhc2UgNDoJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkgICAgICBfZWZsYWdzLCAibCIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIDg6CQkJCQkJCVwKLQkJCU9ONjQoX19lbXVsYXRlXzFvcF9yYXhfcmR4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgXAotCQkJCQkJICAgX2VmbGFncywgInEiKSk7CVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBlbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwgX2VmbGFncywgX2V4KQlcCi0JZG8gewkJCQkJCQkJXAotCQlzd2l0Y2goKF9zcmMpLmJ5dGVzKSB7CQkJCQlcCi0JCWNhc2UgMToJCQkJCQkJXAotCQkJX19lbXVsYXRlXzFvcF9yYXhfcmR4X2V4KF9vcCwgX3NyYywgX3JheCwgX3JkeCwJXAotCQkJCQkJIF9lZmxhZ3MsICJiIiwgX2V4KTsJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIDI6CQkJCQkJCVwKLQkJCV9fZW11bGF0ZV8xb3BfcmF4X3JkeF9leChfb3AsIF9zcmMsIF9yYXgsIF9yZHgsIFwKLQkJCQkJCSBfZWZsYWdzLCAidyIsIF9leCk7CVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2VtdWxhdGVfMW9wX3JheF9yZHhfZXgoX29wLCBfc3JjLCBfcmF4LCBfcmR4LCBcCi0JCQkJCQkgX2VmbGFncywgImwiLCBfZXgpOwlcCisJCQlfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCAibCIsIF9leCk7CVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJY2FzZSA4OiBPTjY0KAkJCQkJCVwKLQkJCV9fZW11bGF0ZV8xb3BfcmF4X3JkeF9leChfb3AsIF9zcmMsIF9yYXgsIF9yZHgsIFwKLQkJCQkJCSBfZWZsYWdzLCAicSIsIF9leCkpOwlcCisJCQlfX2VtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgX29wLCAicSIsIF9leCkpOwlcCiAJCQlicmVhazsJCQkJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC02NTEsNDEgKzY1MCw1MCBAQAogCXJldHVybiBjdHh0LT5vcHMtPnJlYWRfc3RkKGN0eHQsIGxpbmVhciwgZGF0YSwgc2l6ZSwgJmN0eHQtPmV4Y2VwdGlvbik7CiB9CiAKLXN0YXRpYyBpbnQgZG9faW5zbl9mZXRjaF9ieXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBlaXAsIHU4ICpkZXN0KQorLyoKKyAqIEZldGNoIHRoZSBuZXh0IGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkIHdoaWNoIGlzIHBvaW50ZWQgdG8KKyAqIGJ5IGN0eHQtPl9laXAsIHRoZW4gaW5jcmVtZW50IGN0eHQtPl9laXAuCisgKgorICogQWxzbyBwcmVmZXRjaCB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbiB3aXRob3V0IGNyb3NzaW5nIHBhZ2UKKyAqIGJvdW5kYXJ5IGlmIHRoZXkgYXJlIG5vdCBpbiBmZXRjaF9jYWNoZSB5ZXQuCisgKi8KK3N0YXRpYyBpbnQgZG9faW5zbl9mZXRjaF9ieXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1OCAqZGVzdCkKIHsKIAlzdHJ1Y3QgZmV0Y2hfY2FjaGUgKmZjID0gJmN0eHQtPmZldGNoOwogCWludCByYzsKIAlpbnQgc2l6ZSwgY3VyX3NpemU7CiAKLQlpZiAoZWlwID09IGZjLT5lbmQpIHsKKwlpZiAoY3R4dC0+X2VpcCA9PSBmYy0+ZW5kKSB7CiAJCXVuc2lnbmVkIGxvbmcgbGluZWFyOwotCQlzdHJ1Y3Qgc2VnbWVudGVkX2FkZHJlc3MgYWRkciA9IHsgLnNlZz1WQ1BVX1NSRUdfQ1MsIC5lYT1laXB9OworCQlzdHJ1Y3Qgc2VnbWVudGVkX2FkZHJlc3MgYWRkciA9IHsgLnNlZyA9IFZDUFVfU1JFR19DUywKKwkJCQkJCSAgLmVhICA9IGN0eHQtPl9laXAgfTsKIAkJY3VyX3NpemUgPSBmYy0+ZW5kIC0gZmMtPnN0YXJ0OwotCQlzaXplID0gbWluKDE1VUwgLSBjdXJfc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoZWlwKSk7CisJCXNpemUgPSBtaW4oMTVVTCAtIGN1cl9zaXplLAorCQkJICAgUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoY3R4dC0+X2VpcCkpOwogCQlyYyA9IF9fbGluZWFyaXplKGN0eHQsIGFkZHIsIHNpemUsIGZhbHNlLCB0cnVlLCAmbGluZWFyKTsKLQkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCisJCWlmICh1bmxpa2VseShyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSkKIAkJCXJldHVybiByYzsKIAkJcmMgPSBjdHh0LT5vcHMtPmZldGNoKGN0eHQsIGxpbmVhciwgZmMtPmRhdGEgKyBjdXJfc2l6ZSwKIAkJCQkgICAgICBzaXplLCAmY3R4dC0+ZXhjZXB0aW9uKTsKLQkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCisJCWlmICh1bmxpa2VseShyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSkKIAkJCXJldHVybiByYzsKIAkJZmMtPmVuZCArPSBzaXplOwogCX0KLQkqZGVzdCA9IGZjLT5kYXRhW2VpcCAtIGZjLT5zdGFydF07CisJKmRlc3QgPSBmYy0+ZGF0YVtjdHh0LT5fZWlwIC0gZmMtPnN0YXJ0XTsKKwljdHh0LT5fZWlwKys7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZG9faW5zbl9mZXRjaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSB1bnNpZ25lZCBsb25nIGVpcCwgdm9pZCAqZGVzdCwgdW5zaWduZWQgc2l6ZSkKKwkJCSB2b2lkICpkZXN0LCB1bnNpZ25lZCBzaXplKQogewogCWludCByYzsKIAogCS8qIHg4NiBpbnN0cnVjdGlvbnMgYXJlIGxpbWl0ZWQgdG8gMTUgYnl0ZXMuICovCi0JaWYgKGVpcCArIHNpemUgLSBjdHh0LT5laXAgPiAxNSkKKwlpZiAodW5saWtlbHkoY3R4dC0+X2VpcCArIHNpemUgLSBjdHh0LT5laXAgPiAxNSkpCiAJCXJldHVybiBYODZFTVVMX1VOSEFORExFQUJMRTsKIAl3aGlsZSAoc2l6ZS0tKSB7Ci0JCXJjID0gZG9faW5zbl9mZXRjaF9ieXRlKGN0eHQsIGVpcCsrLCBkZXN0KyspOworCQlyYyA9IGRvX2luc25fZmV0Y2hfYnl0ZShjdHh0LCBkZXN0KyspOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAl9CkBAIC02OTMsMjAgKzcwMSwxOCBAQAogfQogCiAvKiBGZXRjaCBuZXh0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkLiAqLwotI2RlZmluZSBpbnNuX2ZldGNoKF90eXBlLCBfc2l6ZSwgX2VpcCkJCQkJCVwKKyNkZWZpbmUgaW5zbl9mZXRjaChfdHlwZSwgX2N0eHQpCQkJCQlcCiAoewl1bnNpZ25lZCBsb25nIF94OwkJCQkJCVwKLQlyYyA9IGRvX2luc25fZmV0Y2goY3R4dCwgKF9laXApLCAmX3gsIChfc2l6ZSkpOwkJCVwKKwlyYyA9IGRvX2luc25fZmV0Y2goX2N0eHQsICZfeCwgc2l6ZW9mKF90eXBlKSk7CQkJXAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAogCQlnb3RvIGRvbmU7CQkJCQkJXAotCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKIAkoX3R5cGUpX3g7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgaW5zbl9mZXRjaF9hcnIoX2FyciwgX3NpemUsIF9laXApCQkJCVwKLSh7CXJjID0gZG9faW5zbl9mZXRjaChjdHh0LCAoX2VpcCksIF9hcnIsIChfc2l6ZSkpOwkJXAorI2RlZmluZSBpbnNuX2ZldGNoX2FycihfYXJyLCBfc2l6ZSwgX2N0eHQpCQkJCVwKKyh7CXJjID0gZG9faW5zbl9mZXRjaChfY3R4dCwgX2FyciwgKF9zaXplKSk7CQkJXAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQkJCQkJXAogCQlnb3RvIGRvbmU7CQkJCQkJXAotCShfZWlwKSArPSAoX3NpemUpOwkJCQkJCVwKIH0pCiAKIC8qCkBAIC04OTQsNyArOTAwLDcgQEAKIAkJY3R4dC0+bW9kcm1fcm0gPSBiYXNlX3JlZyA9IChjdHh0LT5yZXhfcHJlZml4ICYgMSkgPDwgMzsgLyogUkVHLkIgKi8KIAl9CiAKLQljdHh0LT5tb2RybSA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOworCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJY3R4dC0+bW9kcm1fbW9kIHw9IChjdHh0LT5tb2RybSAmIDB4YzApID4+IDY7CiAJY3R4dC0+bW9kcm1fcmVnIHw9IChjdHh0LT5tb2RybSAmIDB4MzgpID4+IDM7CiAJY3R4dC0+bW9kcm1fcm0gfD0gKGN0eHQtPm1vZHJtICYgMHgwNyk7CkBAIC05MjgsMTMgKzkzNCwxMyBAQAogCQlzd2l0Y2ggKGN0eHQtPm1vZHJtX21vZCkgewogCQljYXNlIDA6CiAJCQlpZiAoY3R4dC0+bW9kcm1fcm0gPT0gNikKLQkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHUxNiwgMiwgY3R4dC0+X2VpcCk7CisJCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIGN0eHQpOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczgsIDEsIGN0eHQtPl9laXApOworCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzOCwgY3R4dCk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIDIsIGN0eHQtPl9laXApOworCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIGN0eHQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3dpdGNoIChjdHh0LT5tb2RybV9ybSkgewpAQCAtOTcxLDEzICs5NzcsMTMgQEAKIAl9IGVsc2UgewogCQkvKiAzMi82NC1iaXQgTW9kUi9NIGRlY29kZS4gKi8KIAkJaWYgKChjdHh0LT5tb2RybV9ybSAmIDcpID09IDQpIHsKLQkJCXNpYiA9IGluc25fZmV0Y2godTgsIDEsIGN0eHQtPl9laXApOworCQkJc2liID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQlpbmRleF9yZWcgfD0gKHNpYiA+PiAzKSAmIDc7CiAJCQliYXNlX3JlZyB8PSBzaWIgJiA3OwogCQkJc2NhbGUgPSBzaWIgPj4gNjsKIAogCQkJaWYgKChiYXNlX3JlZyAmIDcpID09IDUgJiYgY3R4dC0+bW9kcm1fbW9kID09IDApCi0JCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOworCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCBjdHh0KTsKIAkJCWVsc2UKIAkJCQltb2RybV9lYSArPSBjdHh0LT5yZWdzW2Jhc2VfcmVnXTsKIAkJCWlmIChpbmRleF9yZWcgIT0gNCkKQEAgLTk5MCwxMyArOTk2LDEzIEBACiAJCXN3aXRjaCAoY3R4dC0+bW9kcm1fbW9kKSB7CiAJCWNhc2UgMDoKIAkJCWlmIChjdHh0LT5tb2RybV9ybSA9PSA1KQotCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBjdHh0LT5fZWlwKTsKKwkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgY3R4dCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaChzOCwgMSwgY3R4dC0+X2VpcCk7CisJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHM4LCBjdHh0KTsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgNCwgY3R4dC0+X2VpcCk7CisJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgY3R4dCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEwMTMsMTMgKzEwMTksMTMgQEAKIAlvcC0+dHlwZSA9IE9QX01FTTsKIAlzd2l0Y2ggKGN0eHQtPmFkX2J5dGVzKSB7CiAJY2FzZSAyOgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHUxNiwgMiwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTE2LCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHUzMiwgNCwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTMyLCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHU2NCwgOCwgY3R4dC0+X2VpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTY0LCBjdHh0KTsKIAkJYnJlYWs7CiAJfQogZG9uZToKQEAgLTE0NTIsMTUgKzE0NTgsMTggQEAKIAlyZXR1cm4gZW11bGF0ZV9wb3BmKGN0eHQsICZjdHh0LT5kc3QudmFsLCBjdHh0LT5vcF9ieXRlcyk7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0ZV9wdXNoX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBzZWcpCitzdGF0aWMgaW50IGVtX3B1c2hfc3JlZyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKKwlpbnQgc2VnID0gY3R4dC0+c3JjMi52YWw7CisKIAljdHh0LT5zcmMudmFsID0gZ2V0X3NlZ21lbnRfc2VsZWN0b3IoY3R4dCwgc2VnKTsKIAogCXJldHVybiBlbV9wdXNoKGN0eHQpOwogfQogCi1zdGF0aWMgaW50IGVtdWxhdGVfcG9wX3NyZWcoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBzZWcpCitzdGF0aWMgaW50IGVtX3BvcF9zcmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogeworCWludCBzZWcgPSBjdHh0LT5zcmMyLnZhbDsKIAl1bnNpZ25lZCBsb25nIHNlbGVjdG9yOwogCWludCByYzsKIApAQCAtMTY3NCw2NCArMTY4Myw3NCBAQAogewogCXN3aXRjaCAoY3R4dC0+bW9kcm1fcmVnKSB7CiAJY2FzZSAwOgkvKiByb2wgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigicm9sIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInJvbCIpOwogCQlicmVhazsKIAljYXNlIDE6CS8qIHJvciAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJyb3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQihjdHh0LCAicm9yIik7CiAJCWJyZWFrOwogCWNhc2UgMjoJLyogcmNsICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInJjbCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKGN0eHQsICJyY2wiKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgkvKiByY3IgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigicmNyIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInJjciIpOwogCQlicmVhazsKIAljYXNlIDQ6CS8qIHNhbC9zaGwgKi8KIAljYXNlIDY6CS8qIHNhbC9zaGwgKi8KLQkJZW11bGF0ZV8yb3BfU3JjQigic2FsIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY0IoY3R4dCwgInNhbCIpOwogCQlicmVhazsKIAljYXNlIDU6CS8qIHNociAqLwotCQllbXVsYXRlXzJvcF9TcmNCKCJzaHIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjQihjdHh0LCAic2hyIik7CiAJCWJyZWFrOwogCWNhc2UgNzoJLyogc2FyICovCi0JCWVtdWxhdGVfMm9wX1NyY0IoInNhciIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNCKGN0eHQsICJzYXIiKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCi1zdGF0aWMgaW50IGVtX2dycDMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitzdGF0aWMgaW50IGVtX25vdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQl1bnNpZ25lZCBsb25nICpyYXggPSAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkFYXTsKLQl1bnNpZ25lZCBsb25nICpyZHggPSAmY3R4dC0+cmVnc1tWQ1BVX1JFR1NfUkRYXTsKKwljdHh0LT5kc3QudmFsID0gfmN0eHQtPmRzdC52YWw7CisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW1fbmVnKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCWVtdWxhdGVfMW9wKGN0eHQsICJuZWciKTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9tdWxfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdTggZXggPSAwOworCisJZW11bGF0ZV8xb3BfcmF4X3JkeChjdHh0LCAibXVsIiwgZXgpOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IGVtX2ltdWxfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdTggZXggPSAwOworCisJZW11bGF0ZV8xb3BfcmF4X3JkeChjdHh0LCAiaW11bCIsIGV4KTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9kaXZfZXgoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CiAJdTggZGUgPSAwOwogCi0Jc3dpdGNoIChjdHh0LT5tb2RybV9yZWcpIHsKLQljYXNlIDAgLi4uIDE6CS8qIHRlc3QgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVigidGVzdCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOwotCQlicmVhazsKLQljYXNlIDI6CS8qIG5vdCAqLwotCQljdHh0LT5kc3QudmFsID0gfmN0eHQtPmRzdC52YWw7Ci0JCWJyZWFrOwotCWNhc2UgMzoJLyogbmVnICovCi0JCWVtdWxhdGVfMW9wKCJuZWciLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgNDogLyogbXVsICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHgoIm11bCIsIGN0eHQtPnNyYywgKnJheCwgKnJkeCwgY3R4dC0+ZWZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OiAvKiBpbXVsICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHgoImltdWwiLCBjdHh0LT5zcmMsICpyYXgsICpyZHgsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgNjogLyogZGl2ICovCi0JCWVtdWxhdGVfMW9wX3JheF9yZHhfZXgoImRpdiIsIGN0eHQtPnNyYywgKnJheCwgKnJkeCwKLQkJCQkgICAgICAgY3R4dC0+ZWZsYWdzLCBkZSk7Ci0JCWJyZWFrOwotCWNhc2UgNzogLyogaWRpdiAqLwotCQllbXVsYXRlXzFvcF9yYXhfcmR4X2V4KCJpZGl2IiwgY3R4dC0+c3JjLCAqcmF4LCAqcmR4LAotCQkJCSAgICAgICBjdHh0LT5lZmxhZ3MsIGRlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotCX0KKwllbXVsYXRlXzFvcF9yYXhfcmR4KGN0eHQsICJkaXYiLCBkZSk7CisJaWYgKGRlKQorCQlyZXR1cm4gZW11bGF0ZV9kZShjdHh0KTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworc3RhdGljIGludCBlbV9pZGl2X2V4KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCXU4IGRlID0gMDsKKworCWVtdWxhdGVfMW9wX3JheF9yZHgoY3R4dCwgImlkaXYiLCBkZSk7CiAJaWYgKGRlKQogCQlyZXR1cm4gZW11bGF0ZV9kZShjdHh0KTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTE3NDMsMTAgKzE3NjIsMTAgQEAKIAogCXN3aXRjaCAoY3R4dC0+bW9kcm1fcmVnKSB7CiAJY2FzZSAwOgkvKiBpbmMgKi8KLQkJZW11bGF0ZV8xb3AoImluYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoY3R4dCwgImluYyIpOwogCQlicmVhazsKIAljYXNlIDE6CS8qIGRlYyAqLwotCQllbXVsYXRlXzFvcCgiZGVjIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcChjdHh0LCAiZGVjIik7CiAJCWJyZWFrOwogCWNhc2UgMjogLyogY2FsbCBuZWFyIGFicyAqLyB7CiAJCWxvbmcgaW50IG9sZF9laXA7CkBAIC0xODEyLDggKzE4MzEsOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBlbXVsYXRlX2xvYWRfc2VnbWVudChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IHNlZykKK3N0YXRpYyBpbnQgZW1fbHNlZyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKKwlpbnQgc2VnID0gY3R4dC0+c3JjMi52YWw7CiAJdW5zaWduZWQgc2hvcnQgc2VsOwogCWludCByYzsKIApAQCAtMjQ1Miw3ICsyNDcyLDcgQEAKIAljdHh0LT5zcmMudHlwZSA9IE9QX0lNTTsKIAljdHh0LT5zcmMudmFsID0gMDsKIAljdHh0LT5zcmMuYnl0ZXMgPSAxOwotCWVtdWxhdGVfMm9wX1NyY1YoIm9yIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAib3IiKTsKIAljdHh0LT5lZmxhZ3MgJj0gfihYODZfRUZMQUdTX0FGIHwgWDg2X0VGTEFHU19DRik7CiAJaWYgKGNmKQogCQljdHh0LT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19DRjsKQEAgLTI1MDIsNDkgKzI1MjIsNDkgQEAKIAogc3RhdGljIGludCBlbV9hZGQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAiYWRkIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fb3Ioc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigib3IiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJvciIpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX2FkYyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJhZGMiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJhZGMiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV9zYmIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigic2JiIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAic2JiIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fYW5kKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1YoImFuZCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImFuZCIpOwogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50IGVtX3N1YihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJzdWIiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwllbXVsYXRlXzJvcF9TcmNWKGN0eHQsICJzdWIiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludCBlbV94b3Ioc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV8yb3BfU3JjVigieG9yIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAieG9yIik7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CiAKIHN0YXRpYyBpbnQgZW1fY21wKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1YoImNtcCIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImNtcCIpOwogCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTI1NTIsNyArMjU3Miw5IEBACiAKIHN0YXRpYyBpbnQgZW1fdGVzdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAidGVzdCIpOworCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIApAQCAtMjU3MCw3ICsyNTkyLDcgQEAKIAogc3RhdGljIGludCBlbV9pbXVsKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQogewotCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKCJpbXVsIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoY3R4dCwgImltdWwiKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIApAQCAtMzAyNSw5ICszMDQ3LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG9wY29kZSBncm91cDNbXSA9IHsKLQlEKERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNKSwgRChEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSksCi0JRChEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrKSwgRChEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrKSwKLQlYNChEKFNyY01lbSB8IE1vZFJNKSksCisJSShEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgZW1fdGVzdCksCisJSShEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgZW1fdGVzdCksCisJSShEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0gfCBMb2NrLCBlbV9ub3QpLAorCUkoRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTG9jaywgZW1fbmVnKSwKKwlJKFNyY01lbSB8IE1vZFJNLCBlbV9tdWxfZXgpLAorCUkoU3JjTWVtIHwgTW9kUk0sIGVtX2ltdWxfZXgpLAorCUkoU3JjTWVtIHwgTW9kUk0sIGVtX2Rpdl9leCksCisJSShTcmNNZW0gfCBNb2RSTSwgZW1faWRpdl9leCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG9wY29kZSBncm91cDRbXSA9IHsKQEAgLTMwOTAsMTYgKzMxMTcsMjAgQEAKIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlIG9wY29kZV90YWJsZVsyNTZdID0gewogCS8qIDB4MDAgLSAweDA3ICovCiAJSTZBTFUoTG9jaywgZW1fYWRkKSwKLQlEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJFUywgZW1fcHVzaF9zcmVnKSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMkVTLCBlbV9wb3Bfc3JlZyksCiAJLyogMHgwOCAtIDB4MEYgKi8KIAlJNkFMVShMb2NrLCBlbV9vciksCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksIE4sCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJDUywgZW1fcHVzaF9zcmVnKSwKKwlOLAogCS8qIDB4MTAgLSAweDE3ICovCiAJSTZBTFUoTG9jaywgZW1fYWRjKSwKLQlEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCksCisJSShJbXBsaWNpdE9wcyB8IFN0YWNrIHwgTm82NCB8IFNyYzJTUywgZW1fcHVzaF9zcmVnKSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMlNTLCBlbV9wb3Bfc3JlZyksCiAJLyogMHgxOCAtIDB4MUYgKi8KIAlJNkFMVShMb2NrLCBlbV9zYmIpLAotCUQoSW1wbGljaXRPcHMgfCBTdGFjayB8IE5vNjQpLCBEKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0KSwKKwlJKEltcGxpY2l0T3BzIHwgU3RhY2sgfCBObzY0IHwgU3JjMkRTLCBlbV9wdXNoX3NyZWcpLAorCUkoSW1wbGljaXRPcHMgfCBTdGFjayB8IE5vNjQgfCBTcmMyRFMsIGVtX3BvcF9zcmVnKSwKIAkvKiAweDIwIC0gMHgyNyAqLwogCUk2QUxVKExvY2ssIGVtX2FuZCksIE4sIE4sCiAJLyogMHgyOCAtIDB4MkYgKi8KQEAgLTMxNjcsNyArMzE5OCw4IEBACiAJRDJidihEc3RNZW0gfCBTcmNJbW1CeXRlIHwgTW9kUk0pLAogCUkoSW1wbGljaXRPcHMgfCBTdGFjayB8IFNyY0ltbVUxNiwgZW1fcmV0X25lYXJfaW1tKSwKIAlJKEltcGxpY2l0T3BzIHwgU3RhY2ssIGVtX3JldCksCi0JRChEc3RSZWcgfCBTcmNNZW1GQWRkciB8IE1vZFJNIHwgTm82NCksIEQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQgfCBTcmMyRVMsIGVtX2xzZWcpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IE5vNjQgfCBTcmMyRFMsIGVtX2xzZWcpLAogCUcoQnl0ZU9wLCBncm91cDExKSwgRygwLCBncm91cDExKSwKIAkvKiAweEM4IC0gMHhDRiAqLwogCU4sIE4sIE4sIEkoSW1wbGljaXRPcHMgfCBTdGFjaywgZW1fcmV0X2ZhciksCkBAIC0zMjQyLDIwICszMjc0LDIyIEBACiAJLyogMHg5MCAtIDB4OUYgKi8KIAlYMTYoRChCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk18IE1vdikpLAogCS8qIDB4QTAgLSAweEE3ICovCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwKKwlJKFN0YWNrIHwgU3JjMkZTLCBlbV9wdXNoX3NyZWcpLCBJKFN0YWNrIHwgU3JjMkZTLCBlbV9wb3Bfc3JlZyksCiAJREkoSW1wbGljaXRPcHMsIGNwdWlkKSwgRChEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IEJpdE9wKSwKIAlEKERzdE1lbSB8IFNyY1JlZyB8IFNyYzJJbW1CeXRlIHwgTW9kUk0pLAogCUQoRHN0TWVtIHwgU3JjUmVnIHwgU3JjMkNMIHwgTW9kUk0pLCBOLCBOLAogCS8qIDB4QTggLSAweEFGICovCi0JRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwgRChJbXBsaWNpdE9wcyB8IFN0YWNrKSwKKwlJKFN0YWNrIHwgU3JjMkdTLCBlbV9wdXNoX3NyZWcpLCBJKFN0YWNrIHwgU3JjMkdTLCBlbV9wb3Bfc3JlZyksCiAJREkoSW1wbGljaXRPcHMsIHJzbSksIEQoRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBCaXRPcCB8IExvY2spLAogCUQoRHN0TWVtIHwgU3JjUmVnIHwgU3JjMkltbUJ5dGUgfCBNb2RSTSksCiAJRChEc3RNZW0gfCBTcmNSZWcgfCBTcmMyQ0wgfCBNb2RSTSksCiAJRChNb2RSTSksIEkoRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sIGVtX2ltdWwpLAogCS8qIDB4QjAgLSAweEI3ICovCiAJRDJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IExvY2spLAotCUQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksIEQoRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0gfCBCaXRPcCB8IExvY2spLAotCUQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksIEQoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSksCisJSShEc3RSZWcgfCBTcmNNZW1GQWRkciB8IE1vZFJNIHwgU3JjMlNTLCBlbV9sc2VnKSwKKwlEKERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgQml0T3AgfCBMb2NrKSwKKwlJKERzdFJlZyB8IFNyY01lbUZBZGRyIHwgTW9kUk0gfCBTcmMyRlMsIGVtX2xzZWcpLAorCUkoRHN0UmVnIHwgU3JjTWVtRkFkZHIgfCBNb2RSTSB8IFNyYzJHUywgZW1fbHNlZyksCiAJRChCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiksIEQoRHN0UmVnIHwgU3JjTWVtMTYgfCBNb2RSTSB8IE1vdiksCiAJLyogMHhCOCAtIDB4QkYgKi8KIAlOLCBOLApAQCAtMzMwOSwxMyArMzM0MywxMyBAQAogCS8qIE5CLiBJbW1lZGlhdGVzIGFyZSBzaWduLWV4dGVuZGVkIGFzIG5lY2Vzc2FyeS4gKi8KIAlzd2l0Y2ggKG9wLT5ieXRlcykgewogCWNhc2UgMToKLQkJb3AtPnZhbCA9IGluc25fZmV0Y2goczgsIDEsIGN0eHQtPl9laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzOCwgY3R4dCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJb3AtPnZhbCA9IGluc25fZmV0Y2goczE2LCAyLCBjdHh0LT5fZWlwKTsKKwkJb3AtPnZhbCA9IGluc25fZmV0Y2goczE2LCBjdHh0KTsKIAkJYnJlYWs7CiAJY2FzZSA0OgotCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzMzIsIDQsIGN0eHQtPl9laXApOworCQlvcC0+dmFsID0gaW5zbl9mZXRjaChzMzIsIGN0eHQpOwogCQlicmVhazsKIAl9CiAJaWYgKCFzaWduX2V4dGVuc2lvbikgewpAQCAtMzMzNSw2ICszMzY5LDEyNSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfb3BlcmFuZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgc3RydWN0IG9wZXJhbmQgKm9wLAorCQkJICB1bnNpZ25lZCBkKQoreworCWludCByYyA9IFg4NkVNVUxfQ09OVElOVUU7CisKKwlzd2l0Y2ggKGQpIHsKKwljYXNlIE9wUmVnOgorCQlkZWNvZGVfcmVnaXN0ZXJfb3BlcmFuZChjdHh0LCBvcCwKKwkJCSBvcCA9PSAmY3R4dC0+ZHN0ICYmCisJCQkgY3R4dC0+dHdvYnl0ZSAmJiAoY3R4dC0+YiA9PSAweGI2IHx8IGN0eHQtPmIgPT0gMHhiNykpOworCQlicmVhazsKKwljYXNlIE9wSW1tVUJ5dGU6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMSwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wTWVtOgorCQljdHh0LT5tZW1vcC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwltZW1fY29tbW9uOgorCQkqb3AgPSBjdHh0LT5tZW1vcDsKKwkJY3R4dC0+bWVtb3BwID0gb3A7CisJCWlmICgoY3R4dC0+ZCAmIEJpdE9wKSAmJiBvcCA9PSAmY3R4dC0+ZHN0KQorCQkJZmV0Y2hfYml0X29wZXJhbmQoY3R4dCk7CisJCW9wLT5vcmlnX3ZhbCA9IG9wLT52YWw7CisJCWJyZWFrOworCWNhc2UgT3BNZW02NDoKKwkJY3R4dC0+bWVtb3AuYnl0ZXMgPSA4OworCQlnb3RvIG1lbV9jb21tb247CisJY2FzZSBPcEFjYzoKKwkJb3AtPnR5cGUgPSBPUF9SRUc7CisJCW9wLT5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKKwkJb3AtPmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CisJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQob3ApOworCQlvcC0+b3JpZ192YWwgPSBvcC0+dmFsOworCQlicmVhazsKKwljYXNlIE9wREk6CisJCW9wLT50eXBlID0gT1BfTUVNOworCQlvcC0+Ynl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCW9wLT5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOworCQlvcC0+YWRkci5tZW0uc2VnID0gVkNQVV9TUkVHX0VTOworCQlvcC0+dmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcERYOgorCQlvcC0+dHlwZSA9IE9QX1JFRzsKKwkJb3AtPmJ5dGVzID0gMjsKKwkJb3AtPmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JEWF07CisJCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQob3ApOworCQlicmVhazsKKwljYXNlIE9wQ0w6CisJCW9wLT5ieXRlcyA9IDE7CisJCW9wLT52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBPcEltbUJ5dGU6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMSwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgT3BPbmU6CisJCW9wLT5ieXRlcyA9IDE7CisJCW9wLT52YWwgPSAxOworCQlicmVhazsKKwljYXNlIE9wSW1tOgorCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgb3AsIGltbV9zaXplKGN0eHQpLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBPcE1lbTE2OgorCQljdHh0LT5tZW1vcC5ieXRlcyA9IDI7CisJCWdvdG8gbWVtX2NvbW1vbjsKKwljYXNlIE9wTWVtMzI6CisJCWN0eHQtPm1lbW9wLmJ5dGVzID0gNDsKKwkJZ290byBtZW1fY29tbW9uOworCWNhc2UgT3BJbW1VMTY6CisJCXJjID0gZGVjb2RlX2ltbShjdHh0LCBvcCwgMiwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wSW1tVToKKwkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsIG9wLCBpbW1fc2l6ZShjdHh0KSwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIE9wU0k6CisJCW9wLT50eXBlID0gT1BfTUVNOworCQlvcC0+Ynl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7CisJCW9wLT5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOworCQlvcC0+YWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOworCQlvcC0+dmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcEltbUZBZGRyOgorCQlvcC0+dHlwZSA9IE9QX0lNTTsKKwkJb3AtPmFkZHIubWVtLmVhID0gY3R4dC0+X2VpcDsKKwkJb3AtPmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXMgKyAyOworCQlpbnNuX2ZldGNoX2FycihvcC0+dmFscHRyLCBvcC0+Ynl0ZXMsIGN0eHQpOworCQlicmVhazsKKwljYXNlIE9wTWVtRkFkZHI6CisJCWN0eHQtPm1lbW9wLmJ5dGVzID0gY3R4dC0+b3BfYnl0ZXMgKyAyOworCQlnb3RvIG1lbV9jb21tb247CisJY2FzZSBPcEVTOgorCQlvcC0+dmFsID0gVkNQVV9TUkVHX0VTOworCQlicmVhazsKKwljYXNlIE9wQ1M6CisJCW9wLT52YWwgPSBWQ1BVX1NSRUdfQ1M7CisJCWJyZWFrOworCWNhc2UgT3BTUzoKKwkJb3AtPnZhbCA9IFZDUFVfU1JFR19TUzsKKwkJYnJlYWs7CisJY2FzZSBPcERTOgorCQlvcC0+dmFsID0gVkNQVV9TUkVHX0RTOworCQlicmVhazsKKwljYXNlIE9wRlM6CisJCW9wLT52YWwgPSBWQ1BVX1NSRUdfRlM7CisJCWJyZWFrOworCWNhc2UgT3BHUzoKKwkJb3AtPnZhbCA9IFZDUFVfU1JFR19HUzsKKwkJYnJlYWs7CisJY2FzZSBPcEltcGxpY2l0OgorCQkvKiBTcGVjaWFsIGluc3RydWN0aW9ucyBkbyB0aGVpciBvd24gb3BlcmFuZCBkZWNvZGluZy4gKi8KKwlkZWZhdWx0OgorCQlvcC0+dHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCQlicmVhazsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJjOworfQorCiBpbnQgeDg2X2RlY29kZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pCiB7CiAJaW50IHJjID0gWDg2RU1VTF9DT05USU5VRTsKQEAgLTMzNDIsOCArMzQ5NSw5IEBACiAJaW50IGRlZl9vcF9ieXRlcywgZGVmX2FkX2J5dGVzLCBnb2Zmc2V0LCBzaW1kX3ByZWZpeDsKIAlib29sIG9wX3ByZWZpeCA9IGZhbHNlOwogCXN0cnVjdCBvcGNvZGUgb3Bjb2RlOwotCXN0cnVjdCBvcGVyYW5kIG1lbW9wID0geyAudHlwZSA9IE9QX05PTkUgfSwgKm1lbW9wcCA9IE5VTEw7CiAKKwljdHh0LT5tZW1vcC50eXBlID0gT1BfTk9ORTsKKwljdHh0LT5tZW1vcHAgPSBOVUxMOwogCWN0eHQtPl9laXAgPSBjdHh0LT5laXA7CiAJY3R4dC0+ZmV0Y2guc3RhcnQgPSBjdHh0LT5fZWlwOwogCWN0eHQtPmZldGNoLmVuZCA9IGN0eHQtPmZldGNoLnN0YXJ0ICsgaW5zbl9sZW47CkBAIC0zMzY2LDcgKzM1MjAsNyBAQAogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIEVNVUxBVElPTl9GQUlMRUQ7CiAJfQogCiAJY3R4dC0+b3BfYnl0ZXMgPSBkZWZfb3BfYnl0ZXM7CkBAIC0zMzc0LDcgKzM1MjgsNyBAQAogCiAJLyogTGVnYWN5IHByZWZpeGVzLiAqLwogCWZvciAoOzspIHsKLQkJc3dpdGNoIChjdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCkpIHsKKwkJc3dpdGNoIChjdHh0LT5iID0gaW5zbl9mZXRjaCh1OCwgY3R4dCkpIHsKIAkJY2FzZSAweDY2OgkvKiBvcGVyYW5kLXNpemUgb3ZlcnJpZGUgKi8KIAkJCW9wX3ByZWZpeCA9IHRydWU7CiAJCQkvKiBzd2l0Y2ggYmV0d2VlbiAyLzQgYnl0ZXMgKi8KQEAgLTM0MzAsNyArMzU4NCw3IEBACiAJLyogVHdvLWJ5dGUgb3Bjb2RlPyAqLwogCWlmIChjdHh0LT5iID09IDB4MGYpIHsKIAkJY3R4dC0+dHdvYnl0ZSA9IDE7Ci0JCWN0eHQtPmIgPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJY3R4dC0+YiA9IGluc25fZmV0Y2godTgsIGN0eHQpOwogCQlvcGNvZGUgPSB0d29ieXRlX3RhYmxlW2N0eHQtPmJdOwogCX0KIAljdHh0LT5kID0gb3Bjb2RlLmZsYWdzOwpAQCAtMzQzOCwxMyArMzU5MiwxMyBAQAogCXdoaWxlIChjdHh0LT5kICYgR3JvdXBNYXNrKSB7CiAJCXN3aXRjaCAoY3R4dC0+ZCAmIEdyb3VwTWFzaykgewogCQljYXNlIEdyb3VwOgotCQkJY3R4dC0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQktLWN0eHQtPl9laXA7CiAJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKIAkJCW9wY29kZSA9IG9wY29kZS51Lmdyb3VwW2dvZmZzZXRdOwogCQkJYnJlYWs7CiAJCWNhc2UgR3JvdXBEdWFsOgotCQkJY3R4dC0+bW9kcm0gPSBpbnNuX2ZldGNoKHU4LCAxLCBjdHh0LT5fZWlwKTsKKwkJCWN0eHQtPm1vZHJtID0gaW5zbl9mZXRjaCh1OCwgY3R4dCk7CiAJCQktLWN0eHQtPl9laXA7CiAJCQlnb2Zmc2V0ID0gKGN0eHQtPm1vZHJtID4+IDMpICYgNzsKIAkJCWlmICgoY3R4dC0+bW9kcm0gPj4gNikgPT0gMykKQEAgLTM0NTgsNyArMzYxMiw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBQcmVmaXg6CiAJCQlpZiAoY3R4dC0+cmVwX3ByZWZpeCAmJiBvcF9wcmVmaXgpCi0JCQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCQkJCXJldHVybiBFTVVMQVRJT05fRkFJTEVEOwogCQkJc2ltZF9wcmVmaXggPSBvcF9wcmVmaXggPyAweDY2IDogY3R4dC0+cmVwX3ByZWZpeDsKIAkJCXN3aXRjaCAoc2ltZF9wcmVmaXgpIHsKIAkJCWNhc2UgMHgwMDogb3Bjb2RlID0gb3Bjb2RlLnUuZ3ByZWZpeC0+cGZ4X25vOyBicmVhazsKQEAgLTM0NjgsMTAgKzM2MjIsMTAgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCQkJcmV0dXJuIEVNVUxBVElPTl9GQUlMRUQ7CiAJCX0KIAotCQljdHh0LT5kICY9IH5Hcm91cE1hc2s7CisJCWN0eHQtPmQgJj0gfih1NjQpR3JvdXBNYXNrOwogCQljdHh0LT5kIHw9IG9wY29kZS5mbGFnczsKIAl9CiAKQEAgLTM0ODEsMTAgKzM2MzUsMTAgQEAKIAogCS8qIFVucmVjb2duaXNlZD8gKi8KIAlpZiAoY3R4dC0+ZCA9PSAwIHx8IChjdHh0LT5kICYgVW5kZWZpbmVkKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gRU1VTEFUSU9OX0ZBSUxFRDsKIAogCWlmICghKGN0eHQtPmQgJiBWZW5kb3JTcGVjaWZpYykgJiYgY3R4dC0+b25seV92ZW5kb3Jfc3BlY2lmaWNfaW5zbikKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gRU1VTEFUSU9OX0ZBSUxFRDsKIAogCWlmIChtb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQgJiYgKGN0eHQtPmQgJiBTdGFjaykpCiAJCWN0eHQtPm9wX2J5dGVzID0gODsKQEAgLTM1MDEsOTYgKzM2NTUsMjcgQEAKIAogCS8qIE1vZFJNIGFuZCBTSUIgYnl0ZXMuICovCiAJaWYgKGN0eHQtPmQgJiBNb2RSTSkgewotCQlyYyA9IGRlY29kZV9tb2RybShjdHh0LCAmbWVtb3ApOworCQlyYyA9IGRlY29kZV9tb2RybShjdHh0LCAmY3R4dC0+bWVtb3ApOwogCQlpZiAoIWN0eHQtPmhhc19zZWdfb3ZlcnJpZGUpCiAJCQlzZXRfc2VnX292ZXJyaWRlKGN0eHQsIGN0eHQtPm1vZHJtX3NlZyk7CiAJfSBlbHNlIGlmIChjdHh0LT5kICYgTWVtQWJzKQotCQlyYyA9IGRlY29kZV9hYnMoY3R4dCwgJm1lbW9wKTsKKwkJcmMgPSBkZWNvZGVfYWJzKGN0eHQsICZjdHh0LT5tZW1vcCk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCWdvdG8gZG9uZTsKIAogCWlmICghY3R4dC0+aGFzX3NlZ19vdmVycmlkZSkKIAkJc2V0X3NlZ19vdmVycmlkZShjdHh0LCBWQ1BVX1NSRUdfRFMpOwogCi0JbWVtb3AuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOworCWN0eHQtPm1lbW9wLmFkZHIubWVtLnNlZyA9IHNlZ19vdmVycmlkZShjdHh0KTsKIAotCWlmIChtZW1vcC50eXBlID09IE9QX01FTSAmJiBjdHh0LT5hZF9ieXRlcyAhPSA4KQotCQltZW1vcC5hZGRyLm1lbS5lYSA9ICh1MzIpbWVtb3AuYWRkci5tZW0uZWE7CisJaWYgKGN0eHQtPm1lbW9wLnR5cGUgPT0gT1BfTUVNICYmIGN0eHQtPmFkX2J5dGVzICE9IDgpCisJCWN0eHQtPm1lbW9wLmFkZHIubWVtLmVhID0gKHUzMiljdHh0LT5tZW1vcC5hZGRyLm1lbS5lYTsKIAogCS8qCiAJICogRGVjb2RlIGFuZCBmZXRjaCB0aGUgc291cmNlIG9wZXJhbmQ6IHJlZ2lzdGVyLCBtZW1vcnkKIAkgKiBvciBpbW1lZGlhdGUuCiAJICovCi0Jc3dpdGNoIChjdHh0LT5kICYgU3JjTWFzaykgewotCWNhc2UgU3JjTm9uZToKLQkJYnJlYWs7Ci0JY2FzZSBTcmNSZWc6Ci0JCWRlY29kZV9yZWdpc3Rlcl9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMsIDApOwotCQlicmVhazsKLQljYXNlIFNyY01lbTE2OgotCQltZW1vcC5ieXRlcyA9IDI7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQljYXNlIFNyY01lbTMyOgotCQltZW1vcC5ieXRlcyA9IDQ7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQljYXNlIFNyY01lbToKLQkJbWVtb3AuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDoKLQkJCQkJCQkgICBjdHh0LT5vcF9ieXRlczsKLQlzcmNtZW1fY29tbW9uOgotCQljdHh0LT5zcmMgPSBtZW1vcDsKLQkJbWVtb3BwID0gJmN0eHQtPnNyYzsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1VMTY6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCAyLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWNhc2UgU3JjSW1tOgotCQlyYyA9IGRlY29kZV9pbW0oY3R4dCwgJmN0eHQtPnNyYywgaW1tX3NpemUoY3R4dCksIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNyY0ltbVU6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCBpbW1fc2l6ZShjdHh0KSwgZmFsc2UpOwotCQlicmVhazsKLQljYXNlIFNyY0ltbUJ5dGU6Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjLCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1VQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMsIDEsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNBY2M6Ci0JCWN0eHQtPnNyYy50eXBlID0gT1BfUkVHOwotCQljdHh0LT5zcmMuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPnNyYy5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5zcmMpOwotCQlicmVhazsKLQljYXNlIFNyY09uZToKLQkJY3R4dC0+c3JjLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjLnZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU3JjU0k6Ci0JCWN0eHQtPnNyYy50eXBlID0gT1BfTUVNOwotCQljdHh0LT5zcmMuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPnNyYy5hZGRyLm1lbS5lYSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOwotCQljdHh0LT5zcmMuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQpOwotCQljdHh0LT5zcmMudmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNJbW1GQWRkcjoKLQkJY3R4dC0+c3JjLnR5cGUgPSBPUF9JTU07Ci0JCWN0eHQtPnNyYy5hZGRyLm1lbS5lYSA9IGN0eHQtPl9laXA7Ci0JCWN0eHQtPnNyYy5ieXRlcyA9IGN0eHQtPm9wX2J5dGVzICsgMjsKLQkJaW5zbl9mZXRjaF9hcnIoY3R4dC0+c3JjLnZhbHB0ciwgY3R4dC0+c3JjLmJ5dGVzLCBjdHh0LT5fZWlwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNNZW1GQWRkcjoKLQkJbWVtb3AuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlcyArIDI7Ci0JCWdvdG8gc3JjbWVtX2NvbW1vbjsKLQkJYnJlYWs7Ci0JY2FzZSBTcmNEWDoKLQkJY3R4dC0+c3JjLnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPnNyYy5ieXRlcyA9IDI7Ci0JCWN0eHQtPnNyYy5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5zcmMpOwotCQlicmVhazsKLQl9Ci0KKwlyYyA9IGRlY29kZV9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMsIChjdHh0LT5kID4+IFNyY1NoaWZ0KSAmIE9wTWFzayk7CiAJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCWdvdG8gZG9uZTsKIApAQCAtMzU5OCw4NSArMzY4MywxOCBAQAogCSAqIERlY29kZSBhbmQgZmV0Y2ggdGhlIHNlY29uZCBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQogCSAqIG9yIGltbWVkaWF0ZS4KIAkgKi8KLQlzd2l0Y2ggKGN0eHQtPmQgJiBTcmMyTWFzaykgewotCWNhc2UgU3JjMk5vbmU6Ci0JCWJyZWFrOwotCWNhc2UgU3JjMkNMOgotCQljdHh0LT5zcmMyLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjMi52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSBTcmMySW1tQnl0ZToKLQkJcmMgPSBkZWNvZGVfaW1tKGN0eHQsICZjdHh0LT5zcmMyLCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTcmMyT25lOgotCQljdHh0LT5zcmMyLmJ5dGVzID0gMTsKLQkJY3R4dC0+c3JjMi52YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNyYzJJbW06Ci0JCXJjID0gZGVjb2RlX2ltbShjdHh0LCAmY3R4dC0+c3JjMiwgaW1tX3NpemUoY3R4dCksIHRydWUpOwotCQlicmVhazsKLQl9Ci0KKwlyYyA9IGRlY29kZV9vcGVyYW5kKGN0eHQsICZjdHh0LT5zcmMyLCAoY3R4dC0+ZCA+PiBTcmMyU2hpZnQpICYgT3BNYXNrKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJZ290byBkb25lOwogCiAJLyogRGVjb2RlIGFuZCBmZXRjaCB0aGUgZGVzdGluYXRpb24gb3BlcmFuZDogcmVnaXN0ZXIgb3IgbWVtb3J5LiAqLwotCXN3aXRjaCAoY3R4dC0+ZCAmIERzdE1hc2spIHsKLQljYXNlIERzdFJlZzoKLQkJZGVjb2RlX3JlZ2lzdGVyX29wZXJhbmQoY3R4dCwgJmN0eHQtPmRzdCwKLQkJCSBjdHh0LT50d29ieXRlICYmIChjdHh0LT5iID09IDB4YjYgfHwgY3R4dC0+YiA9PSAweGI3KSk7Ci0JCWJyZWFrOwotCWNhc2UgRHN0SW1tVUJ5dGU6Ci0JCWN0eHQtPmRzdC50eXBlID0gT1BfSU1NOwotCQljdHh0LT5kc3QuYWRkci5tZW0uZWEgPSBjdHh0LT5fZWlwOwotCQljdHh0LT5kc3QuYnl0ZXMgPSAxOwotCQljdHh0LT5kc3QudmFsID0gaW5zbl9mZXRjaCh1OCwgMSwgY3R4dC0+X2VpcCk7Ci0JCWJyZWFrOwotCWNhc2UgRHN0TWVtOgotCWNhc2UgRHN0TWVtNjQ6Ci0JCWN0eHQtPmRzdCA9IG1lbW9wOwotCQltZW1vcHAgPSAmY3R4dC0+ZHN0OwotCQlpZiAoKGN0eHQtPmQgJiBEc3RNYXNrKSA9PSBEc3RNZW02NCkKLQkJCWN0eHQtPmRzdC5ieXRlcyA9IDg7Ci0JCWVsc2UKLQkJCWN0eHQtPmRzdC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKLQkJaWYgKGN0eHQtPmQgJiBCaXRPcCkKLQkJCWZldGNoX2JpdF9vcGVyYW5kKGN0eHQpOwotCQljdHh0LT5kc3Qub3JpZ192YWwgPSBjdHh0LT5kc3QudmFsOwotCQlicmVhazsKLQljYXNlIERzdEFjYzoKLQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPmRzdC5ieXRlcyA9IChjdHh0LT5kICYgQnl0ZU9wKSA/IDEgOiBjdHh0LT5vcF9ieXRlczsKLQkJY3R4dC0+ZHN0LmFkZHIucmVnID0gJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07Ci0JCWZldGNoX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPmRzdCk7Ci0JCWN0eHQtPmRzdC5vcmlnX3ZhbCA9IGN0eHQtPmRzdC52YWw7Ci0JCWJyZWFrOwotCWNhc2UgRHN0REk6Ci0JCWN0eHQtPmRzdC50eXBlID0gT1BfTUVNOwotCQljdHh0LT5kc3QuYnl0ZXMgPSAoY3R4dC0+ZCAmIEJ5dGVPcCkgPyAxIDogY3R4dC0+b3BfYnl0ZXM7Ci0JCWN0eHQtPmRzdC5hZGRyLm1lbS5lYSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGN0eHQsIGN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JESV0pOwotCQljdHh0LT5kc3QuYWRkci5tZW0uc2VnID0gVkNQVV9TUkVHX0VTOwotCQljdHh0LT5kc3QudmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBEc3REWDoKLQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9SRUc7Ci0JCWN0eHQtPmRzdC5ieXRlcyA9IDI7Ci0JCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICZjdHh0LT5yZWdzW1ZDUFVfUkVHU19SRFhdOwotCQlmZXRjaF9yZWdpc3Rlcl9vcGVyYW5kKCZjdHh0LT5kc3QpOwotCQlicmVhazsKLQljYXNlIEltcGxpY2l0T3BzOgotCQkvKiBTcGVjaWFsIGluc3RydWN0aW9ucyBkbyB0aGVpciBvd24gb3BlcmFuZCBkZWNvZGluZy4gKi8KLQlkZWZhdWx0OgotCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7IC8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCQlicmVhazsKLQl9CisJcmMgPSBkZWNvZGVfb3BlcmFuZChjdHh0LCAmY3R4dC0+ZHN0LCAoY3R4dC0+ZCA+PiBEc3RTaGlmdCkgJiBPcE1hc2spOwogCiBkb25lOgotCWlmIChtZW1vcHAgJiYgbWVtb3BwLT50eXBlID09IE9QX01FTSAmJiBjdHh0LT5yaXBfcmVsYXRpdmUpCi0JCW1lbW9wcC0+YWRkci5tZW0uZWEgKz0gY3R4dC0+X2VpcDsKKwlpZiAoY3R4dC0+bWVtb3BwICYmIGN0eHQtPm1lbW9wcC0+dHlwZSA9PSBPUF9NRU0gJiYgY3R4dC0+cmlwX3JlbGF0aXZlKQorCQljdHh0LT5tZW1vcHAtPmFkZHIubWVtLmVhICs9IGN0eHQtPl9laXA7CiAKLQlyZXR1cm4gKHJjID09IFg4NkVNVUxfVU5IQU5ETEVBQkxFKSA/IEVNVUxBVElPTl9GQUlMRUQgOiBFTVVMQVRJT05fT0s7CisJcmV0dXJuIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKSA/IEVNVUxBVElPTl9GQUlMRUQgOiBFTVVMQVRJT05fT0s7CiB9CiAKIHN0YXRpYyBib29sIHN0cmluZ19pbnNuX2NvbXBsZXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKQEAgLTM4MjUsMzIgKzM4NDMsMTEgQEAKIAkJZ290byB0d29ieXRlX2luc247CiAKIAlzd2l0Y2ggKGN0eHQtPmIpIHsKLQljYXNlIDB4MDY6CQkvKiBwdXNoIGVzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0VTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA3OgkJLyogcG9wIGVzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRVMpOwotCQlicmVhazsKLQljYXNlIDB4MGU6CQkvKiBwdXNoIGNzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0NTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDE2OgkJLyogcHVzaCBzcyAqLwotCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19TUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHgxNzoJCS8qIHBvcCBzcyAqLwotCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgVkNQVV9TUkVHX1NTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDFlOgkJLyogcHVzaCBkcyAqLwotCQlyYyA9IGVtdWxhdGVfcHVzaF9zcmVnKGN0eHQsIFZDUFVfU1JFR19EUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHgxZjoJCS8qIHBvcCBkcyAqLwotCQlyYyA9IGVtdWxhdGVfcG9wX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0RTKTsKLQkJYnJlYWs7CiAJY2FzZSAweDQwIC4uLiAweDQ3OiAvKiBpbmMgcjE2L3IzMiAqLwotCQllbXVsYXRlXzFvcCgiaW5jIiwgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzFvcChjdHh0LCAiaW5jIik7CiAJCWJyZWFrOwogCWNhc2UgMHg0OCAuLi4gMHg0ZjogLyogZGVjIHIxNi9yMzIgKi8KLQkJZW11bGF0ZV8xb3AoImRlYyIsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8xb3AoY3R4dCwgImRlYyIpOwogCQlicmVhazsKIAljYXNlIDB4NjM6CQkvKiBtb3ZzeGQgKi8KIAkJaWYgKGN0eHQtPm1vZGUgIT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkKQEAgLTM4OTEsMTIgKzM4ODgsNiBAQAogCWNhc2UgMHhjMCAuLi4gMHhjMToKIAkJcmMgPSBlbV9ncnAyKGN0eHQpOwogCQlicmVhazsKLQljYXNlIDB4YzQ6CQkvKiBsZXMgKi8KLQkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBWQ1BVX1NSRUdfRVMpOwotCQlicmVhazsKLQljYXNlIDB4YzU6CQkvKiBsZHMgKi8KLQkJcmMgPSBlbXVsYXRlX2xvYWRfc2VnbWVudChjdHh0LCBWQ1BVX1NSRUdfRFMpOwotCQlicmVhazsKIAljYXNlIDB4Y2M6CQkvKiBpbnQzICovCiAJCXJjID0gZW11bGF0ZV9pbnQoY3R4dCwgMyk7CiAJCWJyZWFrOwpAQCAtMzk1Myw5ICszOTQ0LDYgQEAKIAkJLyogY29tcGxlbWVudCBjYXJyeSBmbGFnIGZyb20gZWZsYWdzIHJlZyAqLwogCQljdHh0LT5lZmxhZ3MgXj0gRUZMR19DRjsKIAkJYnJlYWs7Ci0JY2FzZSAweGY2IC4uLiAweGY3OgkvKiBHcnAzICovCi0JCXJjID0gZW1fZ3JwMyhjdHh0KTsKLQkJYnJlYWs7CiAJY2FzZSAweGY4OiAvKiBjbGMgKi8KIAkJY3R4dC0+ZWZsYWdzICY9IH5FRkxHX0NGOwogCQlicmVhazsKQEAgLTQxMDMsMzYgKzQwOTEsMjQgQEAKIAljYXNlIDB4OTAgLi4uIDB4OWY6ICAgICAvKiBzZXRjYyByL204ICovCiAJCWN0eHQtPmRzdC52YWwgPSB0ZXN0X2NjKGN0eHQtPmIsIGN0eHQtPmVmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgMHhhMDoJICAvKiBwdXNoIGZzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0ZTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGExOgkgLyogcG9wIGZzICovCi0JCXJjID0gZW11bGF0ZV9wb3Bfc3JlZyhjdHh0LCBWQ1BVX1NSRUdfRlMpOwotCQlicmVhazsKIAljYXNlIDB4YTM6CiAJICAgICAgYnQ6CQkvKiBidCAqLwogCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCS8qIG9ubHkgc3Vid29yZCBvZmZzZXQgKi8KIAkJY3R4dC0+c3JjLnZhbCAmPSAoY3R4dC0+ZHN0LmJ5dGVzIDw8IDMpIC0gMTsKLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0IiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKGN0eHQsICJidCIpOwogCQlicmVhazsKIAljYXNlIDB4YTQ6IC8qIHNobGQgaW1tOCwgciwgci9tICovCiAJY2FzZSAweGE1OiAvKiBzaGxkIGNsLCByLCByL20gKi8KLQkJZW11bGF0ZV8yb3BfY2woInNobGQiLCBjdHh0LT5zcmMyLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGE4OgkvKiBwdXNoIGdzICovCi0JCXJjID0gZW11bGF0ZV9wdXNoX3NyZWcoY3R4dCwgVkNQVV9TUkVHX0dTKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGE5OgkvKiBwb3AgZ3MgKi8KLQkJcmMgPSBlbXVsYXRlX3BvcF9zcmVnKGN0eHQsIFZDUFVfU1JFR19HUyk7CisJCWVtdWxhdGVfMm9wX2NsKGN0eHQsICJzaGxkIik7CiAJCWJyZWFrOwogCWNhc2UgMHhhYjoKIAkgICAgICBidHM6CQkvKiBidHMgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0cyIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCAiYnRzIik7CiAJCWJyZWFrOwogCWNhc2UgMHhhYzogLyogc2hyZCBpbW04LCByLCByL20gKi8KIAljYXNlIDB4YWQ6IC8qIHNocmQgY2wsIHIsIHIvbSAqLwotCQllbXVsYXRlXzJvcF9jbCgic2hyZCIsIGN0eHQtPnNyYzIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9jbChjdHh0LCAic2hyZCIpOwogCQlicmVhazsKIAljYXNlIDB4YWU6ICAgICAgICAgICAgICAvKiBjbGZsdXNoICovCiAJCWJyZWFrOwpAQCAtNDE0Myw3ICs0MTE5LDcgQEAKIAkJICovCiAJCWN0eHQtPnNyYy5vcmlnX3ZhbCA9IGN0eHQtPnNyYy52YWw7CiAJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5yZWdzW1ZDUFVfUkVHU19SQVhdOwotCQllbXVsYXRlXzJvcF9TcmNWKCJjbXAiLCBjdHh0LT5zcmMsIGN0eHQtPmRzdCwgY3R4dC0+ZWZsYWdzKTsKKwkJZW11bGF0ZV8yb3BfU3JjVihjdHh0LCAiY21wIik7CiAJCWlmIChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSB7CiAJCQkvKiBTdWNjZXNzOiB3cml0ZSBiYWNrIHRvIG1lbW9yeS4gKi8KIAkJCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMub3JpZ192YWw7CkBAIC00MTUzLDE4ICs0MTI5LDkgQEAKIAkJCWN0eHQtPmRzdC5hZGRyLnJlZyA9ICh1bnNpZ25lZCBsb25nICopJmN0eHQtPnJlZ3NbVkNQVV9SRUdTX1JBWF07CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSAweGIyOgkJLyogbHNzICovCi0JCXJjID0gZW11bGF0ZV9sb2FkX3NlZ21lbnQoY3R4dCwgVkNQVV9TUkVHX1NTKTsKLQkJYnJlYWs7CiAJY2FzZSAweGIzOgogCSAgICAgIGJ0cjoJCS8qIGJ0ciAqLwotCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRyIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhiNDoJCS8qIGxmcyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19GUyk7Ci0JCWJyZWFrOwotCWNhc2UgMHhiNToJCS8qIGxncyAqLwotCQlyYyA9IGVtdWxhdGVfbG9hZF9zZWdtZW50KGN0eHQsIFZDUFVfU1JFR19HUyk7CisJCWVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKGN0eHQsICJidHIiKTsKIAkJYnJlYWs7CiAJY2FzZSAweGI2IC4uLiAweGI3OgkvKiBtb3Z6eCAqLwogCQljdHh0LT5kc3QuYnl0ZXMgPSBjdHh0LT5vcF9ieXRlczsKQEAgLTQxODUsNyArNDE1Miw3IEBACiAJCWJyZWFrOwogCWNhc2UgMHhiYjoKIAkgICAgICBidGM6CQkvKiBidGMgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0YyIsIGN0eHQtPnNyYywgY3R4dC0+ZHN0LCBjdHh0LT5lZmxhZ3MpOworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZShjdHh0LCAiYnRjIik7CiAJCWJyZWFrOwogCWNhc2UgMHhiYzogewkJLyogYnNmICovCiAJCXU4IHpmOwpAQCAtNDIxNyw3ICs0MTg0LDcgQEAKIAkJCQkJCQkoczE2KSBjdHh0LT5zcmMudmFsOwogCQlicmVhazsKIAljYXNlIDB4YzAgLi4uIDB4YzE6CS8qIHhhZGQgKi8KLQkJZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgY3R4dC0+c3JjLCBjdHh0LT5kc3QsIGN0eHQtPmVmbGFncyk7CisJCWVtdWxhdGVfMm9wX1NyY1YoY3R4dCwgImFkZCIpOwogCQkvKiBXcml0ZSBiYWNrIHRoZSByZWdpc3RlciBzb3VyY2UuICovCiAJCWN0eHQtPnNyYy52YWwgPSBjdHh0LT5kc3Qub3JpZ192YWw7CiAJCXdyaXRlX3JlZ2lzdGVyX29wZXJhbmQoJmN0eHQtPnNyYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCmluZGV4IGVmYWQ3MjMuLjc2ZTNmMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1NC5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCkBAIC03MTMsMTQgKzcxMywxNiBAQAogCWt2bV9yZWdpc3Rlcl9pcnFfbWFza19ub3RpZmllcihrdm0sIDAsICZwaXQtPm1hc2tfbm90aWZpZXIpOwogCiAJa3ZtX2lvZGV2aWNlX2luaXQoJnBpdC0+ZGV2LCAmcGl0X2Rldl9vcHMpOwotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZwaXQtPmRldik7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywgS1ZNX1BJVF9CQVNFX0FERFJFU1MsCisJCQkJICAgICAgS1ZNX1BJVF9NRU1fTEVOR1RILCAmcGl0LT5kZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWw7CiAKIAlpZiAoZmxhZ3MgJiBLVk1fUElUX1NQRUFLRVJfRFVNTVkpIHsKIAkJa3ZtX2lvZGV2aWNlX2luaXQoJnBpdC0+c3BlYWtlcl9kZXYsICZzcGVha2VyX2Rldl9vcHMpOwogCQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLAotCQkJCQkJJnBpdC0+c3BlYWtlcl9kZXYpOworCQkJCQkgICAgICBLVk1fU1BFQUtFUl9CQVNFX0FERFJFU1MsIDQsCisJCQkJCSAgICAgICZwaXQtPnNwZWFrZXJfZGV2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGZhaWxfdW5yZWdpc3RlcjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTkuYyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCmluZGV4IDE5ZmU4NTUuLmNhYzQ3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1OS5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCkBAIC0zNCw2ICszNCw5IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlICJ0cmFjZS5oIgogCisjZGVmaW5lIHByX3BpY191bmltcGwoZm10LCAuLi4pCVwKKwlwcl9lcnJfcmF0ZWxpbWl0ZWQoImt2bTogcGljOiAiIGZtdCwgIyMgX19WQV9BUkdTX18pCisKIHN0YXRpYyB2b2lkIHBpY19pcnFfcmVxdWVzdChzdHJ1Y3Qga3ZtICprdm0sIGludCBsZXZlbCk7CiAKIHN0YXRpYyB2b2lkIHBpY19sb2NrKHN0cnVjdCBrdm1fcGljICpzKQpAQCAtMzA2LDEwICszMDksMTAgQEAKIAkJCX0KIAkJCXMtPmluaXRfc3RhdGUgPSAxOwogCQkJaWYgKHZhbCAmIDB4MDIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJzaW5nbGUgbW9kZSBub3Qgc3VwcG9ydGVkIik7CisJCQkJcHJfcGljX3VuaW1wbCgic2luZ2xlIG1vZGUgbm90IHN1cHBvcnRlZCIpOwogCQkJaWYgKHZhbCAmIDB4MDgpCi0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJsZXZlbCBzZW5zaXRpdmUgaXJxIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCQlwcl9waWNfdW5pbXBsKAorCQkJCQkibGV2ZWwgc2Vuc2l0aXZlIGlycSBub3Qgc3VwcG9ydGVkIik7CiAJCX0gZWxzZSBpZiAodmFsICYgMHgwOCkgewogCQkJaWYgKHZhbCAmIDB4MDQpCiAJCQkJcy0+cG9sbCA9IDE7CkBAIC00NTksMjIgKzQ2MiwxNSBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtX3BpYyAqdG9fcGljKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXYpOwotfQotCi1zdGF0aWMgaW50IHBpY2Rldl93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKK3N0YXRpYyBpbnQgcGljZGV2X3dyaXRlKHN0cnVjdCBrdm1fcGljICpzLAogCQkJIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKLQlzdHJ1Y3Qga3ZtX3BpYyAqcyA9IHRvX3BpYyh0aGlzKTsKIAl1bnNpZ25lZCBjaGFyIGRhdGEgPSAqKHVuc2lnbmVkIGNoYXIgKil2YWw7CiAJaWYgKCFwaWNkZXZfaW5fcmFuZ2UoYWRkcikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChsZW4gIT0gMSkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJQSUM6IG5vbiBieXRlIHdyaXRlXG4iKTsKKwkJcHJfcGljX3VuaW1wbCgibm9uIGJ5dGUgd3JpdGVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcGljX2xvY2socyk7CkBAIC00OTQsMTcgKzQ5MCwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBpY2Rldl9yZWFkKHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAorc3RhdGljIGludCBwaWNkZXZfcmVhZChzdHJ1Y3Qga3ZtX3BpYyAqcywKIAkJICAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKIHsKLQlzdHJ1Y3Qga3ZtX3BpYyAqcyA9IHRvX3BpYyh0aGlzKTsKIAl1bnNpZ25lZCBjaGFyIGRhdGEgPSAwOwogCWlmICghcGljZGV2X2luX3JhbmdlKGFkZHIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAobGVuICE9IDEpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiUElDOiBub24gYnl0ZSByZWFkXG4iKTsKKwkJcHJfcGljX3VuaW1wbCgibm9uIGJ5dGUgcmVhZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlwaWNfbG9jayhzKTsKQEAgLTUyNSw2ICs1MTksNDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwaWNkZXZfbWFzdGVyX3dyaXRlKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgICAgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQoreworCXJldHVybiBwaWNkZXZfd3JpdGUoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfbWFzdGVyX3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKKwkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKK3sKKwlyZXR1cm4gcGljZGV2X3JlYWQoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfc2xhdmVfd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKKwkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKK3sKKwlyZXR1cm4gcGljZGV2X3dyaXRlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfc2xhdmUpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfc2xhdmVfcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorCQkJICAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHBpY2Rldl9yZWFkKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfc2xhdmUpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfZWNscl93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorCQkJICAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHBpY2Rldl93cml0ZShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qga3ZtX3BpYywgZGV2X2VjbHIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKworc3RhdGljIGludCBwaWNkZXZfZWNscl9yZWFkKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgdm9pZCAqdmFsKQoreworCXJldHVybiBwaWNkZXZfcmVhZChjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qga3ZtX3BpYywgZGV2X2VjbHIpLAorCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKK30KKwogLyoKICAqIGNhbGxiYWNrIHdoZW4gUElDMCBpcnEgc3RhdHVzIGNoYW5nZWQKICAqLwpAQCAtNTM3LDkgKzU3MywxOSBAQAogCXMtPm91dHB1dCA9IGxldmVsOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzIHBpY2Rldl9vcHMgPSB7Ci0JLnJlYWQgICAgID0gcGljZGV2X3JlYWQsCi0JLndyaXRlICAgID0gcGljZGV2X3dyaXRlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBrdm1faW9fZGV2aWNlX29wcyBwaWNkZXZfbWFzdGVyX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfbWFzdGVyX3JlYWQsCisJLndyaXRlICAgID0gcGljZGV2X21hc3Rlcl93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga3ZtX2lvX2RldmljZV9vcHMgcGljZGV2X3NsYXZlX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfc2xhdmVfcmVhZCwKKwkud3JpdGUgICAgPSBwaWNkZXZfc2xhdmVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzIHBpY2Rldl9lY2xyX29wcyA9IHsKKwkucmVhZCAgICAgPSBwaWNkZXZfZWNscl9yZWFkLAorCS53cml0ZSAgICA9IHBpY2Rldl9lY2xyX3dyaXRlLAogfTsKIAogc3RydWN0IGt2bV9waWMgKmt2bV9jcmVhdGVfcGljKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTU2MCwxNiArNjA2LDM5IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIFBJTyBkZXZpY2UKIAkgKi8KLQlrdm1faW9kZXZpY2VfaW5pdCgmcy0+ZGV2LCAmcGljZGV2X29wcyk7CisJa3ZtX2lvZGV2aWNlX2luaXQoJnMtPmRldl9tYXN0ZXIsICZwaWNkZXZfbWFzdGVyX29wcyk7CisJa3ZtX2lvZGV2aWNlX2luaXQoJnMtPmRldl9zbGF2ZSwgJnBpY2Rldl9zbGF2ZV9vcHMpOworCWt2bV9pb2RldmljZV9pbml0KCZzLT5kZXZfZWNsciwgJnBpY2Rldl9lY2xyX29wcyk7CiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmcy0+ZGV2KTsKKwlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAweDIwLCAyLAorCQkJCSAgICAgICZzLT5kZXZfbWFzdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsX3VubG9jazsKKworCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsIDB4YTAsIDIsICZzLT5kZXZfc2xhdmUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWxfdW5yZWdfMjsKKworCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsIDB4NGQwLCAyLCAmcy0+ZGV2X2VjbHIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWxfdW5yZWdfMTsKKwogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAocmV0IDwgMCkgewotCQlrZnJlZShzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIHM7CisKK2ZhaWxfdW5yZWdfMToKKwlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZzLT5kZXZfc2xhdmUpOworCitmYWlsX3VucmVnXzI6CisJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmcy0+ZGV2X21hc3Rlcik7CisKK2ZhaWxfdW5sb2NrOgorCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKKworCWtmcmVlKHMpOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIHZvaWQga3ZtX2Rlc3Ryb3lfcGljKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTU3Nyw3ICs2NDYsOSBAQAogCXN0cnVjdCBrdm1fcGljICp2cGljID0ga3ZtLT5hcmNoLnZwaWM7CiAKIAlpZiAodnBpYykgewotCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZ2cGljLT5kZXYpOworCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX1BJT19CVVMsICZ2cGljLT5kZXZfbWFzdGVyKTsKKwkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmdnBpYy0+ZGV2X3NsYXZlKTsKKwkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9QSU9fQlVTLCAmdnBpYy0+ZGV2X2VjbHIpOwogCQlrdm0tPmFyY2gudnBpYyA9IE5VTEw7CiAJCWtmcmVlKHZwaWMpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pcnEuaCBiL2FyY2gveDg2L2t2bS9pcnEuaAppbmRleCA1M2UyZDA4Li4yMDg2ZjJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaXJxLmgKKysrIGIvYXJjaC94ODYva3ZtL2lycS5oCkBAIC02Niw3ICs2Niw5IEBACiAJc3RydWN0IGt2bSAqa3ZtOwogCXN0cnVjdCBrdm1fa3BpY19zdGF0ZSBwaWNzWzJdOyAvKiAwIGlzIG1hc3RlciBwaWMsIDEgaXMgc2xhdmUgcGljICovCiAJaW50IG91dHB1dDsJCS8qIGludHIgZnJvbSBtYXN0ZXIgUElDICovCi0Jc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2OworCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldl9tYXN0ZXI7CisJc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2X3NsYXZlOworCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldl9lY2xyOwogCXZvaWQgKCphY2tfbm90aWZpZXIpKHZvaWQgKm9wYXF1ZSwgaW50IGlycSk7CiAJdW5zaWduZWQgbG9uZyBpcnFfc3RhdGVzWzE2XTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0va3ZtX2NhY2hlX3JlZ3MuaCBiL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCmluZGV4IDMzNzdkNTMuLjU0NDA3NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCisrKyBiL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oCkBAIC00NSwxMyArNDUsNiBAQAogCXJldHVybiB2Y3B1LT5hcmNoLndhbGtfbW11LT5wZHB0cnNbaW5kZXhdOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBrdm1fcGRwdHJfcmVhZF9tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdSAqbW11LCBpbnQgaW5kZXgpCi17Ci0JbG9hZF9wZHB0cnModmNwdSwgbW11LCBtbXUtPmdldF9jcjModmNwdSkpOwotCi0JcmV0dXJuIG1tdS0+cGRwdHJzW2luZGV4XTsKLX0KLQogc3RhdGljIGlubGluZSB1bG9uZyBrdm1fcmVhZF9jcjBfYml0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVsb25nIG1hc2spCiB7CiAJdWxvbmcgdG1hc2sgPSBtYXNrICYgS1ZNX1BPU1NJQkxFX0NSMF9HVUVTVF9CSVRTOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2t2bV90aW1lci5oIGIvYXJjaC94ODYva3ZtL2t2bV90aW1lci5oCmluZGV4IDY0YmM2ZWEuLjQ5N2RiYWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9rdm1fdGltZXIuaAorKysgYi9hcmNoL3g4Ni9rdm0va3ZtX3RpbWVyLmgKQEAgLTIsNiArMiw4IEBACiBzdHJ1Y3Qga3ZtX3RpbWVyIHsKIAlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKIAlzNjQgcGVyaW9kOyAJCQkJLyogdW5pdDogbnMgKi8KKwl1MzIgdGltZXJfbW9kZV9tYXNrOworCXU2NCB0c2NkZWFkbGluZTsKIAlhdG9taWNfdCBwZW5kaW5nOwkJCS8qIGFjY3VtdWxhdGVkIHRyaWdnZXJlZCB0aW1lcnMgKi8KIAlib29sIHJlaW5qZWN0OwogCXN0cnVjdCBrdm1fdGltZXJfb3BzICp0X29wczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9sYXBpYy5jIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKaW5kZXggNTdkY2JkNC4uNTRhYmI0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2xhcGljLmMKKysrIGIvYXJjaC94ODYva3ZtL2xhcGljLmMKQEAgLTY4LDYgKzY4LDkgQEAKICNkZWZpbmUgVkVDX1BPUyh2KSAoKHYpICYgKDMyIC0gMSkpCiAjZGVmaW5lIFJFR19QT1ModikgKCgodikgPj4gNSkgPDwgNCkKIAorc3RhdGljIHVuc2lnbmVkIGludCBtaW5fdGltZXJfcGVyaW9kX3VzID0gNTAwOworbW9kdWxlX3BhcmFtKG1pbl90aW1lcl9wZXJpb2RfdXMsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKwogc3RhdGljIGlubGluZSB1MzIgYXBpY19nZXRfcmVnKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIGludCByZWdfb2ZmKQogewogCXJldHVybiAqKCh1MzIgKikgKGFwaWMtPnJlZ3MgKyByZWdfb2ZmKSk7CkBAIC0xMzUsOSArMTM4LDIzIEBACiAJcmV0dXJuIGFwaWNfZ2V0X3JlZyhhcGljLCBsdnRfdHlwZSkgJiBBUElDX1ZFQ1RPUl9NQVNLOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhcGljX2x2dHRfb25lc2hvdChzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQoreworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PSBBUElDX0xWVF9USU1FUl9PTkVTSE9UKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXBpY19sdnR0X3BlcmlvZChzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQogewotCXJldHVybiBhcGljX2dldF9yZWcoYXBpYywgQVBJQ19MVlRUKSAmIEFQSUNfTFZUX1RJTUVSX1BFUklPRElDOworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwaWNfbHZ0dF90c2NkZWFkbGluZShzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQoreworCXJldHVybiAoKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xWVFQpICYKKwkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSA9PQorCQkJQVBJQ19MVlRfVElNRVJfVFNDREVBRExJTkUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhcGljX2x2dF9ubWlfbW9kZSh1MzIgbHZ0X3ZhbCkKQEAgLTE2Niw3ICsxODMsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGFwaWNfbHZ0X21hc2tbQVBJQ19MVlRfTlVNXSA9IHsKLQlMVlRfTUFTSyB8IEFQSUNfTFZUX1RJTUVSX1BFUklPRElDLAkvKiBMVlRUICovCisJTFZUX01BU0sgLCAgICAgIC8qIHBhcnQgTFZUVCBtYXNrLCB0aW1lciBtb2RlIG1hc2sgYWRkZWQgYXQgcnVudGltZSAqLwogCUxWVF9NQVNLIHwgQVBJQ19NT0RFX01BU0ssCS8qIExWVFRITVIgKi8KIAlMVlRfTUFTSyB8IEFQSUNfTU9ERV9NQVNLLAkvKiBMVlRQQyAqLwogCUxJTlRfTUFTSywgTElOVF9NQVNLLAkvKiBMVlQwLTEgKi8KQEAgLTMxNiw4ICszMzMsOCBAQAogCQkJcmVzdWx0ID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIERGUiB2Y3B1ICVkOiAlMDh4XG4iLAotCQkgICAgICAgYXBpYy0+dmNwdS0+dmNwdV9pZCwgYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfREZSKSk7CisJCWFwaWNfZGVidWcoIkJhZCBERlIgdmNwdSAlZDogJTA4eFxuIiwKKwkJCSAgIGFwaWMtPnZjcHUtPnZjcHVfaWQsIGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0RGUikpOwogCQlicmVhazsKIAl9CiAKQEAgLTM1NCw4ICszNzEsOCBAQAogCQlyZXN1bHQgPSAodGFyZ2V0ICE9IHNvdXJjZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBkZXN0IHNob3J0aGFuZCB2YWx1ZSAleFxuIiwKLQkJICAgICAgIHNob3J0X2hhbmQpOworCQlhcGljX2RlYnVnKCJrdm06IGFwaWM6IEJhZCBkZXN0IHNob3J0aGFuZCB2YWx1ZSAleFxuIiwKKwkJCSAgIHNob3J0X2hhbmQpOwogCQlicmVhazsKIAl9CiAKQEAgLTQwMSwxMSArNDE4LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBBUElDX0RNX1JFTVJEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSWdub3JpbmcgZGVsaXZlcnkgbW9kZSAzXG4iKTsKKwkJYXBpY19kZWJ1ZygiSWdub3JpbmcgZGVsaXZlcnkgbW9kZSAzXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRE1fU01JOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSWdub3JpbmcgZ3Vlc3QgU01JXG4iKTsKKwkJYXBpY19kZWJ1ZygiSWdub3JpbmcgZ3Vlc3QgU01JXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRE1fTk1JOgpAQCAtNTY1LDExICs1ODIsMTMgQEAKIAkJCXZhbCA9IGt2bV9hcGljX2lkKGFwaWMpIDw8IDI0OwogCQlicmVhazsKIAljYXNlIEFQSUNfQVJCUFJJOgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBY2Nlc3MgQVBJQyBBUkJQUkkgcmVnaXN0ZXIgIgotCQkgICAgICAgIndoaWNoIGlzIGZvciBQNlxuIik7CisJCWFwaWNfZGVidWcoIkFjY2VzcyBBUElDIEFSQlBSSSByZWdpc3RlciB3aGljaCBpcyBmb3IgUDZcbiIpOwogCQlicmVhazsKIAogCWNhc2UgQVBJQ19UTUNDVDoJLyogVGltZXIgQ0NSICovCisJCWlmIChhcGljX2x2dHRfdHNjZGVhZGxpbmUoYXBpYykpCisJCQlyZXR1cm4gMDsKKwogCQl2YWwgPSBhcGljX2dldF90bWNjdChhcGljKTsKIAkJYnJlYWs7CiAKQEAgLTY2NCwyOSArNjgzLDQwIEBACiAKIHN0YXRpYyB2b2lkIHN0YXJ0X2FwaWNfdGltZXIoc3RydWN0IGt2bV9sYXBpYyAqYXBpYykKIHsKLQlrdGltZV90IG5vdyA9IGFwaWMtPmxhcGljX3RpbWVyLnRpbWVyLmJhc2UtPmdldF90aW1lKCk7Ci0KLQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSAodTY0KWFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSAqCi0JCSAgICBBUElDX0JVU19DWUNMRV9OUyAqIGFwaWMtPmRpdmlkZV9jb3VudDsKKwlrdGltZV90IG5vdzsKIAlhdG9taWNfc2V0KCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nLCAwKTsKIAotCWlmICghYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKQotCQlyZXR1cm47Ci0JLyoKLQkgKiBEbyBub3QgYWxsb3cgdGhlIGd1ZXN0IHRvIHByb2dyYW0gcGVyaW9kaWMgdGltZXJzIHdpdGggc21hbGwKLQkgKiBpbnRlcnZhbCwgc2luY2UgdGhlIGhydGltZXJzIGFyZSBub3QgdGhyb3R0bGVkIGJ5IHRoZSBob3N0Ci0JICogc2NoZWR1bGVyLgotCSAqLwotCWlmIChhcGljX2x2dHRfcGVyaW9kKGFwaWMpKSB7Ci0JCWlmIChhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPCBOU0VDX1BFUl9NU0VDLzIpCi0JCQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSBOU0VDX1BFUl9NU0VDLzI7Ci0JfQorCWlmIChhcGljX2x2dHRfcGVyaW9kKGFwaWMpIHx8IGFwaWNfbHZ0dF9vbmVzaG90KGFwaWMpKSB7CisJCS8qIGxhcGljIHRpbWVyIGluIG9uZXNob3Qgb3IgcGVyb2lkaWMgbW9kZSAqLworCQlub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOworCQlhcGljLT5sYXBpY190aW1lci5wZXJpb2QgPSAodTY0KWFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKQorCQkJICAgICogQVBJQ19CVVNfQ1lDTEVfTlMgKiBhcGljLT5kaXZpZGVfY291bnQ7CiAKLQlocnRpbWVyX3N0YXJ0KCZhcGljLT5sYXBpY190aW1lci50aW1lciwKLQkJICAgICAga3RpbWVfYWRkX25zKG5vdywgYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKSwKLQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisJCWlmICghYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKQorCQkJcmV0dXJuOworCQkvKgorCQkgKiBEbyBub3QgYWxsb3cgdGhlIGd1ZXN0IHRvIHByb2dyYW0gcGVyaW9kaWMgdGltZXJzIHdpdGggc21hbGwKKwkJICogaW50ZXJ2YWwsIHNpbmNlIHRoZSBocnRpbWVycyBhcmUgbm90IHRocm90dGxlZCBieSB0aGUgaG9zdAorCQkgKiBzY2hlZHVsZXIuCisJCSAqLworCQlpZiAoYXBpY19sdnR0X3BlcmlvZChhcGljKSkgeworCQkJczY0IG1pbl9wZXJpb2QgPSBtaW5fdGltZXJfcGVyaW9kX3VzICogMTAwMExMOwogCi0JYXBpY19kZWJ1ZygiJXM6IGJ1cyBjeWNsZSBpcyAlIiBQUklkNjQgIm5zLCBub3cgMHglMDE2IgorCQkJaWYgKGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCA8IG1pbl9wZXJpb2QpIHsKKwkJCQlwcl9pbmZvX3JhdGVsaW1pdGVkKAorCQkJCSAgICAia3ZtOiB2Y3B1ICVpOiByZXF1ZXN0ZWQgJWxsZCBucyAiCisJCQkJICAgICJsYXBpYyB0aW1lciBwZXJpb2QgbGltaXRlZCB0byAlbGxkIG5zXG4iLAorCQkJCSAgICBhcGljLT52Y3B1LT52Y3B1X2lkLAorCQkJCSAgICBhcGljLT5sYXBpY190aW1lci5wZXJpb2QsIG1pbl9wZXJpb2QpOworCQkJCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCA9IG1pbl9wZXJpb2Q7CisJCQl9CisJCX0KKworCQlocnRpbWVyX3N0YXJ0KCZhcGljLT5sYXBpY190aW1lci50aW1lciwKKwkJCSAgICAgIGt0aW1lX2FkZF9ucyhub3csIGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCksCisJCQkgICAgICBIUlRJTUVSX01PREVfQUJTKTsKKworCQlhcGljX2RlYnVnKCIlczogYnVzIGN5Y2xlIGlzICUiIFBSSWQ2NCAibnMsIG5vdyAweCUwMTYiCiAJCQkgICBQUkl4NjQgIiwgIgogCQkJICAgInRpbWVyIGluaXRpYWwgY291bnQgMHgleCwgcGVyaW9kICVsbGRucywgIgogCQkJICAgImV4cGlyZSBAIDB4JTAxNiIgUFJJeDY0ICIuXG4iLCBfX2Z1bmNfXywKQEAgLTY5NSw2ICs3MjUsMzAgQEAKIAkJCSAgIGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCwKIAkJCSAgIGt0aW1lX3RvX25zKGt0aW1lX2FkZF9ucyhub3csCiAJCQkJCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCkpKTsKKwl9IGVsc2UgaWYgKGFwaWNfbHZ0dF90c2NkZWFkbGluZShhcGljKSkgeworCQkvKiBsYXBpYyB0aW1lciBpbiB0c2MgZGVhZGxpbmUgbW9kZSAqLworCQl1NjQgZ3Vlc3RfdHNjLCB0c2NkZWFkbGluZSA9IGFwaWMtPmxhcGljX3RpbWVyLnRzY2RlYWRsaW5lOworCQl1NjQgbnMgPSAwOworCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBhcGljLT52Y3B1OworCQl1bnNpZ25lZCBsb25nIHRoaXNfdHNjX2toeiA9IHZjcHVfdHNjX2toeih2Y3B1KTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAodW5saWtlbHkoIXRzY2RlYWRsaW5lIHx8ICF0aGlzX3RzY19raHopKQorCQkJcmV0dXJuOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOworCQlndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CisJCWlmIChsaWtlbHkodHNjZGVhZGxpbmUgPiBndWVzdF90c2MpKSB7CisJCQlucyA9ICh0c2NkZWFkbGluZSAtIGd1ZXN0X3RzYykgKiAxMDAwMDAwVUxMOworCQkJZG9fZGl2KG5zLCB0aGlzX3RzY19raHopOworCQl9CisJCWhydGltZXJfc3RhcnQoJmFwaWMtPmxhcGljX3RpbWVyLnRpbWVyLAorCQkJa3RpbWVfYWRkX25zKG5vdywgbnMpLCBIUlRJTUVSX01PREVfQUJTKTsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhcGljX21hbmFnZV9ubWlfd2F0Y2hkb2coc3RydWN0IGt2bV9sYXBpYyAqYXBpYywgdTMyIGx2dDBfdmFsKQpAQCAtNzgyLDcgKzgzNiw2IEBACiAKIAljYXNlIEFQSUNfTFZUMDoKIAkJYXBpY19tYW5hZ2Vfbm1pX3dhdGNoZG9nKGFwaWMsIHZhbCk7Ci0JY2FzZSBBUElDX0xWVFQ6CiAJY2FzZSBBUElDX0xWVFRITVI6CiAJY2FzZSBBUElDX0xWVFBDOgogCWNhc2UgQVBJQ19MVlQxOgpAQCAtNzk2LDcgKzg0OSwyMiBAQAogCiAJCWJyZWFrOwogCisJY2FzZSBBUElDX0xWVFQ6CisJCWlmICgoYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfTFZUVCkgJgorCQkgICAgYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSAhPQorCQkgICAodmFsICYgYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrKSkKKwkJCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CisKKwkJaWYgKCFhcGljX3N3X2VuYWJsZWQoYXBpYykpCisJCQl2YWwgfD0gQVBJQ19MVlRfTUFTS0VEOworCQl2YWwgJj0gKGFwaWNfbHZ0X21hc2tbMF0gfCBhcGljLT5sYXBpY190aW1lci50aW1lcl9tb2RlX21hc2spOworCQlhcGljX3NldF9yZWcoYXBpYywgQVBJQ19MVlRULCB2YWwpOworCQlicmVhazsKKwogCWNhc2UgQVBJQ19UTUlDVDoKKwkJaWYgKGFwaWNfbHZ0dF90c2NkZWFkbGluZShhcGljKSkKKwkJCWJyZWFrOworCiAJCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CiAJCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX1RNSUNULCB2YWwpOwogCQlzdGFydF9hcGljX3RpbWVyKGFwaWMpOwpAQCAtODA0LDE0ICs4NzIsMTQgQEAKIAogCWNhc2UgQVBJQ19URENSOgogCQlpZiAodmFsICYgNCkKLQkJCXByaW50ayhLRVJOX0VSUiAiS1ZNX1dSSVRFOlREQ1IgJXhcbiIsIHZhbCk7CisJCQlhcGljX2RlYnVnKCJLVk1fV1JJVEU6VERDUiAleFxuIiwgdmFsKTsKIAkJYXBpY19zZXRfcmVnKGFwaWMsIEFQSUNfVERDUiwgdmFsKTsKIAkJdXBkYXRlX2RpdmlkZV9jb3VudChhcGljKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRVNSOgogCQlpZiAoYXBpY194MmFwaWNfbW9kZShhcGljKSAmJiB2YWwgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJLVk1fV1JJVEU6RVNSIG5vdCB6ZXJvICV4XG4iLCB2YWwpOworCQkJYXBpY19kZWJ1ZygiS1ZNX1dSSVRFOkVTUiBub3QgemVybyAleFxuIiwgdmFsKTsKIAkJCXJldCA9IDE7CiAJCX0KIAkJYnJlYWs7CkBAIC04NjQsNiArOTMyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQga3ZtX2xhcGljX3NldF9lb2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7CisKKwlpZiAoYXBpYykKKwkJYXBpY19yZWdfd3JpdGUodmNwdS0+YXJjaC5hcGljLCBBUElDX0VPSSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fbGFwaWNfc2V0X2VvaSk7CisKIHZvaWQga3ZtX2ZyZWVfbGFwaWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWlmICghdmNwdS0+YXJjaC5hcGljKQpAQCAtODgzLDYgKzk2MCwzMiBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAordTY0IGt2bV9nZXRfbGFwaWNfdHNjZGVhZGxpbmVfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOworCWlmICghYXBpYykKKwkJcmV0dXJuIDA7CisKKwlpZiAoYXBpY19sdnR0X29uZXNob3QoYXBpYykgfHwgYXBpY19sdnR0X3BlcmlvZChhcGljKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXBpYy0+bGFwaWNfdGltZXIudHNjZGVhZGxpbmU7Cit9CisKK3ZvaWQga3ZtX3NldF9sYXBpY190c2NkZWFkbGluZV9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOworCWlmICghYXBpYykKKwkJcmV0dXJuOworCisJaWYgKGFwaWNfbHZ0dF9vbmVzaG90KGFwaWMpIHx8IGFwaWNfbHZ0dF9wZXJpb2QoYXBpYykpCisJCXJldHVybjsKKworCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CisJYXBpYy0+bGFwaWNfdGltZXIudHNjZGVhZGxpbmUgPSBkYXRhOworCXN0YXJ0X2FwaWNfdGltZXIoYXBpYyk7Cit9CisKIHZvaWQga3ZtX2xhcGljX3NldF90cHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyOCkKIHsKIAlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmggYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaAppbmRleCA1MmM5ZTZiLi4xMzhlOGNjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuaAorKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuaApAQCAtMjYsNiArMjYsNyBAQAogdm9pZCBrdm1fbGFwaWNfcmVzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHU2NCBrdm1fbGFwaWNfZ2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbGFwaWNfc2V0X3RwcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I4KTsKK3ZvaWQga3ZtX2xhcGljX3NldF9lb2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX2xhcGljX3NldF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHZhbHVlKTsKIHU2NCBrdm1fbGFwaWNfZ2V0X2Jhc2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX2FwaWNfc2V0X3ZlcnNpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTQxLDYgKzQyLDkgQEAKIGJvb2wga3ZtX2FwaWNfcHJlc2VudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9sYXBpY19maW5kX2hpZ2hlc3RfaXJyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK3U2NCBrdm1fZ2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fc2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBkYXRhKTsKKwogdm9pZCBrdm1fbGFwaWNfc2V0X3ZhcGljX2FkZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCB2YXBpY19hZGRyKTsKIHZvaWQga3ZtX2xhcGljX3N5bmNfZnJvbV92YXBpYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbGFwaWNfc3luY190b192YXBpYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IDhlOGRhNzkuLmYxYjM2Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTI3NzAsNyArMjc3MCw3IEBACiAKIAkJQVNTRVJUKCFWQUxJRF9QQUdFKHJvb3QpKTsKIAkJaWYgKHZjcHUtPmFyY2gubW11LnJvb3RfbGV2ZWwgPT0gUFQzMkVfUk9PVF9MRVZFTCkgewotCQkJcGRwdHIgPSBrdm1fcGRwdHJfcmVhZF9tbXUodmNwdSwgJnZjcHUtPmFyY2gubW11LCBpKTsKKwkJCXBkcHRyID0gdmNwdS0+YXJjaC5tbXUuZ2V0X3BkcHRyKHZjcHUsIGkpOwogCQkJaWYgKCFpc19wcmVzZW50X2dwdGUocGRwdHIpKSB7CiAJCQkJdmNwdS0+YXJjaC5tbXUucGFlX3Jvb3RbaV0gPSAwOwogCQkJCWNvbnRpbnVlOwpAQCAtMzMxOCw2ICszMzE4LDcgQEAKIAljb250ZXh0LT5kaXJlY3RfbWFwID0gdHJ1ZTsKIAljb250ZXh0LT5zZXRfY3IzID0ga3ZtX3g4Nl9vcHMtPnNldF90ZHBfY3IzOwogCWNvbnRleHQtPmdldF9jcjMgPSBnZXRfY3IzOworCWNvbnRleHQtPmdldF9wZHB0ciA9IGt2bV9wZHB0cl9yZWFkOwogCWNvbnRleHQtPmluamVjdF9wYWdlX2ZhdWx0ID0ga3ZtX2luamVjdF9wYWdlX2ZhdWx0OwogCWNvbnRleHQtPm54ID0gaXNfbngodmNwdSk7CiAKQEAgLTMzNzYsNiArMzM3Nyw3IEBACiAKIAl2Y3B1LT5hcmNoLndhbGtfbW11LT5zZXRfY3IzICAgICAgICAgICA9IGt2bV94ODZfb3BzLT5zZXRfY3IzOwogCXZjcHUtPmFyY2gud2Fsa19tbXUtPmdldF9jcjMgICAgICAgICAgID0gZ2V0X2NyMzsKKwl2Y3B1LT5hcmNoLndhbGtfbW11LT5nZXRfcGRwdHIgICAgICAgICA9IGt2bV9wZHB0cl9yZWFkOwogCXZjcHUtPmFyY2gud2Fsa19tbXUtPmluamVjdF9wYWdlX2ZhdWx0ID0ga3ZtX2luamVjdF9wYWdlX2ZhdWx0OwogCiAJcmV0dXJuIHI7CkBAIC0zMzg2LDYgKzMzODgsNyBAQAogCXN0cnVjdCBrdm1fbW11ICpnX2NvbnRleHQgPSAmdmNwdS0+YXJjaC5uZXN0ZWRfbW11OwogCiAJZ19jb250ZXh0LT5nZXRfY3IzICAgICAgICAgICA9IGdldF9jcjM7CisJZ19jb250ZXh0LT5nZXRfcGRwdHIgICAgICAgICA9IGt2bV9wZHB0cl9yZWFkOwogCWdfY29udGV4dC0+aW5qZWN0X3BhZ2VfZmF1bHQgPSBrdm1faW5qZWN0X3BhZ2VfZmF1bHQ7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jIGIvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jCmluZGV4IDI0NjBhMjYuLjc0NmVjMjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXVfYXVkaXQuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMKQEAgLTEyMSwxNiArMTIxLDE2IEBACiAKIHN0YXRpYyB2b2lkIGluc3BlY3Rfc3B0ZV9oYXNfcm1hcChzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXApCiB7CisJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUocmF0ZWxpbWl0X3N0YXRlLCA1ICogSFosIDEwKTsKIAl1bnNpZ25lZCBsb25nICpybWFwcDsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpyZXZfc3A7CiAJZ2ZuX3QgZ2ZuOwogCi0KIAlyZXZfc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNwdGVwKSk7CiAJZ2ZuID0ga3ZtX21tdV9wYWdlX2dldF9nZm4ocmV2X3NwLCBzcHRlcCAtIHJldl9zcC0+c3B0KTsKIAogCWlmICghZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBnZm4pKSB7Ci0JCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlpZiAoIV9fcmF0ZWxpbWl0KCZyYXRlbGltaXRfc3RhdGUpKQogCQkJcmV0dXJuOwogCQlhdWRpdF9wcmludGsoa3ZtLCAibm8gbWVtc2xvdCBmb3IgZ2ZuICVsbHhcbiIsIGdmbik7CiAJCWF1ZGl0X3ByaW50ayhrdm0sICJpbmRleCAlbGQgb2Ygc3AgKGdmbj0lbGx4KVxuIiwKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAJcm1hcHAgPSBnZm5fdG9fcm1hcChrdm0sIGdmbiwgcmV2X3NwLT5yb2xlLmxldmVsKTsKIAlpZiAoISpybWFwcCkgewotCQlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJaWYgKCFfX3JhdGVsaW1pdCgmcmF0ZWxpbWl0X3N0YXRlKSkKIAkJCXJldHVybjsKIAkJYXVkaXRfcHJpbnRrKGt2bSwgIm5vIHJtYXAgZm9yIHdyaXRhYmxlIHNwdGUgJWxseFxuIiwKIAkJCSAgICAgKnNwdGVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggNTA3ZTJiOC4uOTI5OTQxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWdmbl90IHRhYmxlX2dmbjsKIAl1bnNpZ25lZCBpbmRleCwgcHRfYWNjZXNzLCB1bmluaXRpYWxpemVkX3ZhcihwdGVfYWNjZXNzKTsKIAlncGFfdCBwdGVfZ3BhOwotCWJvb2wgZXBlcm07CisJYm9vbCBlcGVybSwgbGFzdF9ncHRlOwogCWludCBvZmZzZXQ7CiAJY29uc3QgaW50IHdyaXRlX2ZhdWx0ID0gYWNjZXNzICYgUEZFUlJfV1JJVEVfTUFTSzsKIAljb25zdCBpbnQgdXNlcl9mYXVsdCAgPSBhY2Nlc3MgJiBQRkVSUl9VU0VSX01BU0s7CkBAIC0xNjMsNyArMTYzLDcgQEAKIAogI2lmIFBUVFlQRSA9PSA2NAogCWlmICh3YWxrZXItPmxldmVsID09IFBUMzJFX1JPT1RfTEVWRUwpIHsKLQkJcHRlID0ga3ZtX3BkcHRyX3JlYWRfbW11KHZjcHUsIG1tdSwgKGFkZHIgPj4gMzApICYgMyk7CisJCXB0ZSA9IG1tdS0+Z2V0X3BkcHRyKHZjcHUsIChhZGRyID4+IDMwKSAmIDMpOwogCQl0cmFjZV9rdm1fbW11X3BhZ2luZ19lbGVtZW50KHB0ZSwgd2Fsa2VyLT5sZXZlbCk7CiAJCWlmICghaXNfcHJlc2VudF9ncHRlKHB0ZSkpCiAJCQlnb3RvIGVycm9yOwpAQCAtMjIxLDYgKzIyMSwxNyBAQAogCQkJZXBlcm0gPSB0cnVlOwogI2VuZGlmCiAKKwkJbGFzdF9ncHRlID0gRk5BTUUoaXNfbGFzdF9ncHRlKSh3YWxrZXIsIHZjcHUsIG1tdSwgcHRlKTsKKwkJaWYgKGxhc3RfZ3B0ZSkgeworCQkJcHRlX2FjY2VzcyA9IHB0X2FjY2VzcyAmCisJCQkJICAgICBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgcHRlLCB0cnVlKTsKKwkJCS8qIGNoZWNrIGlmIHRoZSBrZXJuZWwgaXMgZmV0Y2hpbmcgZnJvbSB1c2VyIHBhZ2UgKi8KKwkJCWlmICh1bmxpa2VseShwdGVfYWNjZXNzICYgUFRfVVNFUl9NQVNLKSAmJgorCQkJICAgIGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfU01FUCkpCisJCQkJaWYgKGZldGNoX2ZhdWx0ICYmICF1c2VyX2ZhdWx0KQorCQkJCQllcGVybSA9IHRydWU7CisJCX0KKwogCQlpZiAoIWVwZXJtICYmIHVubGlrZWx5KCEocHRlICYgUFRfQUNDRVNTRURfTUFTSykpKSB7CiAJCQlpbnQgcmV0OwogCQkJdHJhY2Vfa3ZtX21tdV9zZXRfYWNjZXNzZWRfYml0KHRhYmxlX2dmbiwgaW5kZXgsCkBAIC0yMzgsMTggKzI0OSwxMiBAQAogCiAJCXdhbGtlci0+cHRlc1t3YWxrZXItPmxldmVsIC0gMV0gPSBwdGU7CiAKLQkJaWYgKEZOQU1FKGlzX2xhc3RfZ3B0ZSkod2Fsa2VyLCB2Y3B1LCBtbXUsIHB0ZSkpIHsKKwkJaWYgKGxhc3RfZ3B0ZSkgewogCQkJaW50IGx2bCA9IHdhbGtlci0+bGV2ZWw7CiAJCQlncGFfdCByZWFsX2dwYTsKIAkJCWdmbl90IGdmbjsKIAkJCXUzMiBhYzsKIAotCQkJLyogY2hlY2sgaWYgdGhlIGtlcm5lbCBpcyBmZXRjaGluZyBmcm9tIHVzZXIgcGFnZSAqLwotCQkJaWYgKHVubGlrZWx5KHB0ZV9hY2Nlc3MgJiBQVF9VU0VSX01BU0spICYmCi0JCQkgICAga3ZtX3JlYWRfY3I0X2JpdHModmNwdSwgWDg2X0NSNF9TTUVQKSkKLQkJCQlpZiAoZmV0Y2hfZmF1bHQgJiYgIXVzZXJfZmF1bHQpCi0JCQkJCWVwZXJtID0gdHJ1ZTsKLQogCQkJZ2ZuID0gZ3B0ZV90b19nZm5fbHZsKHB0ZSwgbHZsKTsKIAkJCWdmbiArPSAoYWRkciAmIFBUX0xWTF9PRkZTRVRfTUFTSyhsdmwpKSA+PiBQQUdFX1NISUZUOwogCkBAIC0yOTUsNyArMzAwLDYgQEAKIAkJd2Fsa2VyLT5wdGVzW3dhbGtlci0+bGV2ZWwgLSAxXSA9IHB0ZTsKIAl9CiAKLQlwdGVfYWNjZXNzID0gcHRfYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIHB0ZSwgdHJ1ZSk7CiAJd2Fsa2VyLT5wdF9hY2Nlc3MgPSBwdF9hY2Nlc3M7CiAJd2Fsa2VyLT5wdGVfYWNjZXNzID0gcHRlX2FjY2VzczsKIAlwZ3ByaW50aygiJXM6IHB0ZSAlbGx4IHB0ZV9hY2Nlc3MgJXggcHRfYWNjZXNzICV4XG4iLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IDQ3NWQxYzkuLmUzMjI0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTEwODQsNyArMTA4NCw2IEBACiAJaWYgKG5wdF9lbmFibGVkKSB7CiAJCS8qIFNldHVwIFZNQ0IgZm9yIE5lc3RlZCBQYWdpbmcgKi8KIAkJY29udHJvbC0+bmVzdGVkX2N0bCA9IDE7Ci0JCWNscl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpOwogCQljbHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lOVkxQRyk7CiAJCWNscl9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgUEZfVkVDVE9SKTsKIAkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjNfUkVBRCk7CkBAIC0xODQ0LDYgKzE4NDMsMjAgQEAKIAlyZXR1cm4gc3ZtLT5uZXN0ZWQubmVzdGVkX2NyMzsKIH0KIAorc3RhdGljIHU2NCBuZXN0ZWRfc3ZtX2dldF90ZHBfcGRwdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisJdTY0IGNyMyA9IHN2bS0+bmVzdGVkLm5lc3RlZF9jcjM7CisJdTY0IHBkcHRlOworCWludCByZXQ7CisKKwlyZXQgPSBrdm1fcmVhZF9ndWVzdF9wYWdlKHZjcHUtPmt2bSwgZ3BhX3RvX2dmbihjcjMpLCAmcGRwdGUsCisJCQkJICBvZmZzZXRfaW5fcGFnZShjcjMpICsgaW5kZXggKiA4LCA4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcGRwdGU7Cit9CisKIHN0YXRpYyB2b2lkIG5lc3RlZF9zdm1fc2V0X3RkcF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgcm9vdCkKIHsKQEAgLTE4NzUsNiArMTg4OCw3IEBACiAKIAl2Y3B1LT5hcmNoLm1tdS5zZXRfY3IzICAgICAgICAgICA9IG5lc3RlZF9zdm1fc2V0X3RkcF9jcjM7CiAJdmNwdS0+YXJjaC5tbXUuZ2V0X2NyMyAgICAgICAgICAgPSBuZXN0ZWRfc3ZtX2dldF90ZHBfY3IzOworCXZjcHUtPmFyY2gubW11LmdldF9wZHB0ciAgICAgICAgID0gbmVzdGVkX3N2bV9nZXRfdGRwX3BkcHRyOwogCXZjcHUtPmFyY2gubW11LmluamVjdF9wYWdlX2ZhdWx0ID0gbmVzdGVkX3N2bV9pbmplY3RfbnBmX2V4aXQ7CiAJdmNwdS0+YXJjaC5tbXUuc2hhZG93X3Jvb3RfbGV2ZWwgPSBnZXRfbnB0X2xldmVsKCk7CiAJdmNwdS0+YXJjaC53YWxrX21tdSAgICAgICAgICAgICAgPSAmdmNwdS0+YXJjaC5uZXN0ZWRfbW11OwpAQCAtMjE4Miw3ICsyMTk2LDggQEAKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2luZm9fMSwKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2luZm9fMiwKIAkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvLAotCQkJCSAgICAgICB2bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyKTsKKwkJCQkgICAgICAgdm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvX2VyciwKKwkJCQkgICAgICAgS1ZNX0lTQV9TVk0pOwogCiAJbmVzdGVkX3ZtY2IgPSBuZXN0ZWRfc3ZtX21hcChzdm0sIHN2bS0+bmVzdGVkLnZtY2IsICZwYWdlKTsKIAlpZiAoIW5lc3RlZF92bWNiKQpAQCAtMjg5NCwxNSArMjkwOSwyMCBAQAogCXJldHVybiAwOwogfQogCit1NjQgc3ZtX3JlYWRfbDFfdHNjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IGdldF9ob3N0X3ZtY2IodG9fc3ZtKHZjcHUpKTsKKwlyZXR1cm4gdm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICsKKwkJc3ZtX3NjYWxlX3RzYyh2Y3B1LCBuYXRpdmVfcmVhZF90c2MoKSk7Cit9CisKIHN0YXRpYyBpbnQgc3ZtX2dldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBlY3gsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAogCXN3aXRjaCAoZWN4KSB7CiAJY2FzZSBNU1JfSUEzMl9UU0M6IHsKLQkJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7Ci0KLQkJKmRhdGEgPSB2bWNiLT5jb250cm9sLnRzY19vZmZzZXQgKworCQkqZGF0YSA9IHN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICsKIAkJCXN2bV9zY2FsZV90c2ModmNwdSwgbmF0aXZlX3JlYWRfdHNjKCkpOwogCiAJCWJyZWFrOwpAQCAtMzMxNCw4ICszMzM0LDYgQEAKIAlzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biA9IHZjcHUtPnJ1bjsKIAl1MzIgZXhpdF9jb2RlID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZTsKIAotCXRyYWNlX2t2bV9leGl0KGV4aXRfY29kZSwgdmNwdSwgS1ZNX0lTQV9TVk0pOwotCiAJaWYgKCFpc19jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1IwX1dSSVRFKSkKIAkJdmNwdS0+YXJjaC5jcjAgPSBzdm0tPnZtY2ItPnNhdmUuY3IwOwogCWlmIChucHRfZW5hYmxlZCkKQEAgLTMzMzUsNyArMzM1Myw4IEBACiAJCQkJCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMSwKIAkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18yLAogCQkJCQlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbywKLQkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyKTsKKwkJCQkJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm9fZXJyLAorCQkJCQlLVk1fSVNBX1NWTSk7CiAKIAkJdm1leGl0ID0gbmVzdGVkX3N2bV9leGl0X3NwZWNpYWwoc3ZtKTsKIApAQCAtMzc2OCw2ICszNzg3LDggQEAKIAl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBzdm0tPnZtY2ItPnNhdmUucnNwOwogCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUklQXSA9IHN2bS0+dm1jYi0+c2F2ZS5yaXA7CiAKKwl0cmFjZV9rdm1fZXhpdChzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlLCB2Y3B1LCBLVk1fSVNBX1NWTSk7CisKIAlpZiAodW5saWtlbHkoc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZSA9PSBTVk1fRVhJVF9OTUkpKQogCQlrdm1fYmVmb3JlX2hhbmRsZV9ubWkoJnN2bS0+dmNwdSk7CiAKQEAgLTM4OTcsNjAgKzM5MTgsNiBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyBzdm1fZXhpdF9yZWFzb25zX3N0cltdID0gewotCXsgU1ZNX0VYSVRfUkVBRF9DUjAsCQkJInJlYWRfY3IwIiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjMsCQkJInJlYWRfY3IzIiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjQsCQkJInJlYWRfY3I0IiB9LAotCXsgU1ZNX0VYSVRfUkVBRF9DUjgsCQkJInJlYWRfY3I4IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfQ1IwLAkJCSJ3cml0ZV9jcjAiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9DUjMsCQkJIndyaXRlX2NyMyIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0NSNCwJCQkid3JpdGVfY3I0IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfQ1I4LAkJCSJ3cml0ZV9jcjgiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMCwJCQkicmVhZF9kcjAiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMSwJCQkicmVhZF9kcjEiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMiwJCQkicmVhZF9kcjIiIH0sCi0JeyBTVk1fRVhJVF9SRUFEX0RSMywJCQkicmVhZF9kcjMiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9EUjAsCQkJIndyaXRlX2RyMCIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0RSMSwJCQkid3JpdGVfZHIxIiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfRFIyLAkJCSJ3cml0ZV9kcjIiIH0sCi0JeyBTVk1fRVhJVF9XUklURV9EUjMsCQkJIndyaXRlX2RyMyIgfSwKLQl7IFNWTV9FWElUX1dSSVRFX0RSNSwJCQkid3JpdGVfZHI1IiB9LAotCXsgU1ZNX0VYSVRfV1JJVEVfRFI3LAkJCSJ3cml0ZV9kcjciIH0sCi0JeyBTVk1fRVhJVF9FWENQX0JBU0UgKyBEQl9WRUNUT1IsCSJEQiBleGNwIiB9LAotCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgQlBfVkVDVE9SLAkiQlAgZXhjcCIgfSwKLQl7IFNWTV9FWElUX0VYQ1BfQkFTRSArIFVEX1ZFQ1RPUiwJIlVEIGV4Y3AiIH0sCi0JeyBTVk1fRVhJVF9FWENQX0JBU0UgKyBQRl9WRUNUT1IsCSJQRiBleGNwIiB9LAotCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTk1fVkVDVE9SLAkiTk0gZXhjcCIgfSwKLQl7IFNWTV9FWElUX0VYQ1BfQkFTRSArIE1DX1ZFQ1RPUiwJIk1DIGV4Y3AiIH0sCi0JeyBTVk1fRVhJVF9JTlRSLAkJCSJpbnRlcnJ1cHQiIH0sCi0JeyBTVk1fRVhJVF9OTUksCQkJCSJubWkiIH0sCi0JeyBTVk1fRVhJVF9TTUksCQkJCSJzbWkiIH0sCi0JeyBTVk1fRVhJVF9JTklULAkJCSJpbml0IiB9LAotCXsgU1ZNX0VYSVRfVklOVFIsCQkJInZpbnRyIiB9LAotCXsgU1ZNX0VYSVRfQ1BVSUQsCQkJImNwdWlkIiB9LAotCXsgU1ZNX0VYSVRfSU5WRCwJCQkiaW52ZCIgfSwKLQl7IFNWTV9FWElUX0hMVCwJCQkJImhsdCIgfSwKLQl7IFNWTV9FWElUX0lOVkxQRywJCQkiaW52bHBnIiB9LAotCXsgU1ZNX0VYSVRfSU5WTFBHQSwJCQkiaW52bHBnYSIgfSwKLQl7IFNWTV9FWElUX0lPSU8sCQkJImlvIiB9LAotCXsgU1ZNX0VYSVRfTVNSLAkJCQkibXNyIiB9LAotCXsgU1ZNX0VYSVRfVEFTS19TV0lUQ0gsCQkJInRhc2tfc3dpdGNoIiB9LAotCXsgU1ZNX0VYSVRfU0hVVERPV04sCQkJInNodXRkb3duIiB9LAotCXsgU1ZNX0VYSVRfVk1SVU4sCQkJInZtcnVuIiB9LAotCXsgU1ZNX0VYSVRfVk1NQ0FMTCwJCQkiaHlwZXJjYWxsIiB9LAotCXsgU1ZNX0VYSVRfVk1MT0FELAkJCSJ2bWxvYWQiIH0sCi0JeyBTVk1fRVhJVF9WTVNBVkUsCQkJInZtc2F2ZSIgfSwKLQl7IFNWTV9FWElUX1NUR0ksCQkJInN0Z2kiIH0sCi0JeyBTVk1fRVhJVF9DTEdJLAkJCSJjbGdpIiB9LAotCXsgU1ZNX0VYSVRfU0tJTklULAkJCSJza2luaXQiIH0sCi0JeyBTVk1fRVhJVF9XQklOVkQsCQkJIndiaW52ZCIgfSwKLQl7IFNWTV9FWElUX01PTklUT1IsCQkJIm1vbml0b3IiIH0sCi0JeyBTVk1fRVhJVF9NV0FJVCwJCQkibXdhaXQiIH0sCi0JeyBTVk1fRVhJVF9YU0VUQlYsCQkJInhzZXRidiIgfSwKLQl7IFNWTV9FWElUX05QRiwJCQkJIm5wZiIgfSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KIHN0YXRpYyBpbnQgc3ZtX2dldF9scGFnZV9sZXZlbCh2b2lkKQogewogCXJldHVybiBQVF9QRFBFX0xFVkVMOwpAQCAtNDIyMyw3ICs0MTkwLDYgQEAKIAkuZ2V0X210X21hc2sgPSBzdm1fZ2V0X210X21hc2ssCiAKIAkuZ2V0X2V4aXRfaW5mbyA9IHN2bV9nZXRfZXhpdF9pbmZvLAotCS5leGl0X3JlYXNvbnNfc3RyID0gc3ZtX2V4aXRfcmVhc29uc19zdHIsCiAKIAkuZ2V0X2xwYWdlX2xldmVsID0gc3ZtX2dldF9scGFnZV9sZXZlbCwKIApAQCAtNDIzOSw2ICs0MjA1LDcgQEAKIAkud3JpdGVfdHNjX29mZnNldCA9IHN2bV93cml0ZV90c2Nfb2Zmc2V0LAogCS5hZGp1c3RfdHNjX29mZnNldCA9IHN2bV9hZGp1c3RfdHNjX29mZnNldCwKIAkuY29tcHV0ZV90c2Nfb2Zmc2V0ID0gc3ZtX2NvbXB1dGVfdHNjX29mZnNldCwKKwkucmVhZF9sMV90c2MgPSBzdm1fcmVhZF9sMV90c2MsCiAKIAkuc2V0X3RkcF9jcjMgPSBzZXRfdGRwX2NyMywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3RyYWNlLmggYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaAppbmRleCAzZmY4OThjLi45MTFkMjY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaApAQCAtMiw2ICsyLDggQEAKICNkZWZpbmUgX1RSQUNFX0tWTV9ICiAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8YXNtL3ZteC5oPgorI2luY2x1ZGUgPGFzbS9zdm0uaD4KIAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0ga3ZtCkBAIC0xODEsNiArMTgzLDk1IEBACiAjZGVmaW5lIEtWTV9JU0FfVk1YICAgMQogI2RlZmluZSBLVk1fSVNBX1NWTSAgIDIKIAorI2RlZmluZSBWTVhfRVhJVF9SRUFTT05TIFwKKwl7IEVYSVRfUkVBU09OX0VYQ0VQVElPTl9OTUksCQkiRVhDRVBUSU9OX05NSSIgfSwgXAorCXsgRVhJVF9SRUFTT05fRVhURVJOQUxfSU5URVJSVVBULAkiRVhURVJOQUxfSU5URVJSVVBUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9UUklQTEVfRkFVTFQsCQkiVFJJUExFX0ZBVUxUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9QRU5ESU5HX0lOVEVSUlVQVCwJIlBFTkRJTkdfSU5URVJSVVBUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9OTUlfV0lORE9XLAkJIk5NSV9XSU5ET1ciIH0sIFwKKwl7IEVYSVRfUkVBU09OX1RBU0tfU1dJVENILAkJIlRBU0tfU1dJVENIIiB9LCBcCisJeyBFWElUX1JFQVNPTl9DUFVJRCwJCQkiQ1BVSUQiIH0sIFwKKwl7IEVYSVRfUkVBU09OX0hMVCwJCQkiSExUIiB9LCBcCisJeyBFWElUX1JFQVNPTl9JTlZMUEcsCQkJIklOVkxQRyIgfSwgXAorCXsgRVhJVF9SRUFTT05fUkRQTUMsCQkJIlJEUE1DIiB9LCBcCisJeyBFWElUX1JFQVNPTl9SRFRTQywJCQkiUkRUU0MiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNQ0FMTCwJCQkiVk1DQUxMIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTUNMRUFSLAkJCSJWTUNMRUFSIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTUxBVU5DSCwJCQkiVk1MQVVOQ0giIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUFRSTEQsCQkJIlZNUFRSTEQiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUFRSU1QsCQkJIlZNUFRSU1QiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNUkVBRCwJCQkiVk1SRUFEIiB9LCBcCisJeyBFWElUX1JFQVNPTl9WTVJFU1VNRSwJCQkiVk1SRVNVTUUiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNV1JJVEUsCQkJIlZNV1JJVEUiIH0sIFwKKwl7IEVYSVRfUkVBU09OX1ZNT0ZGLAkJCSJWTU9GRiIgfSwgXAorCXsgRVhJVF9SRUFTT05fVk1PTiwJCQkiVk1PTiIgfSwgXAorCXsgRVhJVF9SRUFTT05fQ1JfQUNDRVNTLAkJIkNSX0FDQ0VTUyIgfSwgXAorCXsgRVhJVF9SRUFTT05fRFJfQUNDRVNTLAkJIkRSX0FDQ0VTUyIgfSwgXAorCXsgRVhJVF9SRUFTT05fSU9fSU5TVFJVQ1RJT04sCQkiSU9fSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX01TUl9SRUFELAkJCSJNU1JfUkVBRCIgfSwgXAorCXsgRVhJVF9SRUFTT05fTVNSX1dSSVRFLAkJIk1TUl9XUklURSIgfSwgXAorCXsgRVhJVF9SRUFTT05fTVdBSVRfSU5TVFJVQ1RJT04sCSJNV0FJVF9JTlNUUlVDVElPTiIgfSwgXAorCXsgRVhJVF9SRUFTT05fTU9OSVRPUl9JTlNUUlVDVElPTiwJIk1PTklUT1JfSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX1BBVVNFX0lOU1RSVUNUSU9OLAkiUEFVU0VfSU5TVFJVQ1RJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX01DRV9EVVJJTkdfVk1FTlRSWSwJIk1DRV9EVVJJTkdfVk1FTlRSWSIgfSwgXAorCXsgRVhJVF9SRUFTT05fVFBSX0JFTE9XX1RIUkVTSE9MRCwJIlRQUl9CRUxPV19USFJFU0hPTEQiIH0sCVwKKwl7IEVYSVRfUkVBU09OX0FQSUNfQUNDRVNTLAkJIkFQSUNfQUNDRVNTIiB9LCBcCisJeyBFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OLAkJIkVQVF9WSU9MQVRJT04iIH0sIFwKKwl7IEVYSVRfUkVBU09OX0VQVF9NSVNDT05GSUcsCQkiRVBUX01JU0NPTkZJRyIgfSwgXAorCXsgRVhJVF9SRUFTT05fV0JJTlZELAkJCSJXQklOVkQiIH0KKworI2RlZmluZSBTVk1fRVhJVF9SRUFTT05TIFwKKwl7IFNWTV9FWElUX1JFQURfQ1IwLAkJCSJyZWFkX2NyMCIgfSwgXAorCXsgU1ZNX0VYSVRfUkVBRF9DUjMsCQkJInJlYWRfY3IzIiB9LCBcCisJeyBTVk1fRVhJVF9SRUFEX0NSNCwJCQkicmVhZF9jcjQiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfQ1I4LAkJCSJyZWFkX2NyOCIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfQ1IwLAkJCSJ3cml0ZV9jcjAiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0NSMywJCQkid3JpdGVfY3IzIiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9DUjQsCQkJIndyaXRlX2NyNCIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfQ1I4LAkJCSJ3cml0ZV9jcjgiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfRFIwLAkJCSJyZWFkX2RyMCIgfSwgXAorCXsgU1ZNX0VYSVRfUkVBRF9EUjEsCQkJInJlYWRfZHIxIiB9LCBcCisJeyBTVk1fRVhJVF9SRUFEX0RSMiwJCQkicmVhZF9kcjIiIH0sIFwKKwl7IFNWTV9FWElUX1JFQURfRFIzLAkJCSJyZWFkX2RyMyIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfRFIwLAkJCSJ3cml0ZV9kcjAiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0RSMSwJCQkid3JpdGVfZHIxIiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9EUjIsCQkJIndyaXRlX2RyMiIgfSwgXAorCXsgU1ZNX0VYSVRfV1JJVEVfRFIzLAkJCSJ3cml0ZV9kcjMiIH0sIFwKKwl7IFNWTV9FWElUX1dSSVRFX0RSNSwJCQkid3JpdGVfZHI1IiB9LCBcCisJeyBTVk1fRVhJVF9XUklURV9EUjcsCQkJIndyaXRlX2RyNyIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgREJfVkVDVE9SLAkiREIgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgQlBfVkVDVE9SLAkiQlAgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgVURfVkVDVE9SLAkiVUQgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SLAkiUEYgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTk1fVkVDVE9SLAkiTk0gZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTUNfVkVDVE9SLAkiTUMgZXhjcCIgfSwgXAorCXsgU1ZNX0VYSVRfSU5UUiwJCQkiaW50ZXJydXB0IiB9LCBcCisJeyBTVk1fRVhJVF9OTUksCQkJCSJubWkiIH0sIFwKKwl7IFNWTV9FWElUX1NNSSwJCQkJInNtaSIgfSwgXAorCXsgU1ZNX0VYSVRfSU5JVCwJCQkiaW5pdCIgfSwgXAorCXsgU1ZNX0VYSVRfVklOVFIsCQkJInZpbnRyIiB9LCBcCisJeyBTVk1fRVhJVF9DUFVJRCwJCQkiY3B1aWQiIH0sIFwKKwl7IFNWTV9FWElUX0lOVkQsCQkJImludmQiIH0sIFwKKwl7IFNWTV9FWElUX0hMVCwJCQkJImhsdCIgfSwgXAorCXsgU1ZNX0VYSVRfSU5WTFBHLAkJCSJpbnZscGciIH0sIFwKKwl7IFNWTV9FWElUX0lOVkxQR0EsCQkJImludmxwZ2EiIH0sIFwKKwl7IFNWTV9FWElUX0lPSU8sCQkJImlvIiB9LCBcCisJeyBTVk1fRVhJVF9NU1IsCQkJCSJtc3IiIH0sIFwKKwl7IFNWTV9FWElUX1RBU0tfU1dJVENILAkJCSJ0YXNrX3N3aXRjaCIgfSwgXAorCXsgU1ZNX0VYSVRfU0hVVERPV04sCQkJInNodXRkb3duIiB9LCBcCisJeyBTVk1fRVhJVF9WTVJVTiwJCQkidm1ydW4iIH0sIFwKKwl7IFNWTV9FWElUX1ZNTUNBTEwsCQkJImh5cGVyY2FsbCIgfSwgXAorCXsgU1ZNX0VYSVRfVk1MT0FELAkJCSJ2bWxvYWQiIH0sIFwKKwl7IFNWTV9FWElUX1ZNU0FWRSwJCQkidm1zYXZlIiB9LCBcCisJeyBTVk1fRVhJVF9TVEdJLAkJCSJzdGdpIiB9LCBcCisJeyBTVk1fRVhJVF9DTEdJLAkJCSJjbGdpIiB9LCBcCisJeyBTVk1fRVhJVF9TS0lOSVQsCQkJInNraW5pdCIgfSwgXAorCXsgU1ZNX0VYSVRfV0JJTlZELAkJCSJ3YmludmQiIH0sIFwKKwl7IFNWTV9FWElUX01PTklUT1IsCQkJIm1vbml0b3IiIH0sIFwKKwl7IFNWTV9FWElUX01XQUlULAkJCSJtd2FpdCIgfSwgXAorCXsgU1ZNX0VYSVRfWFNFVEJWLAkJCSJ4c2V0YnYiIH0sIFwKKwl7IFNWTV9FWElUX05QRiwJCQkJIm5wZiIgfQorCiAvKgogICogVHJhY2Vwb2ludCBmb3Iga3ZtIGd1ZXN0IGV4aXQ6CiAgKi8KQEAgLTIwNSw4ICsyOTYsOSBAQAogCSksCiAKIAlUUF9wcmludGsoInJlYXNvbiAlcyByaXAgMHglbHggaW5mbyAlbGx4ICVsbHgiLAotCQkgZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHAsIF9fZW50cnktPmV4aXRfcmVhc29uLAotCQkJCQkgIGt2bV94ODZfb3BzLT5leGl0X3JlYXNvbnNfc3RyKSwKKwkJIChfX2VudHJ5LT5pc2EgPT0gS1ZNX0lTQV9WTVgpID8KKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9yZWFzb24sIFZNWF9FWElUX1JFQVNPTlMpIDoKKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9yZWFzb24sIFNWTV9FWElUX1JFQVNPTlMpLAogCQkgX19lbnRyeS0+Z3Vlc3RfcmlwLCBfX2VudHJ5LT5pbmZvMSwgX19lbnRyeS0+aW5mbzIpCiApOwogCkBAIC00ODYsOSArNTc4LDkgQEAKIFRSQUNFX0VWRU5UKGt2bV9uZXN0ZWRfdm1leGl0LAogCSAgICBUUF9QUk9UTyhfX3U2NCByaXAsIF9fdTMyIGV4aXRfY29kZSwKIAkJICAgICBfX3U2NCBleGl0X2luZm8xLCBfX3U2NCBleGl0X2luZm8yLAotCQkgICAgIF9fdTMyIGV4aXRfaW50X2luZm8sIF9fdTMyIGV4aXRfaW50X2luZm9fZXJyKSwKKwkJICAgICBfX3UzMiBleGl0X2ludF9pbmZvLCBfX3UzMiBleGl0X2ludF9pbmZvX2VyciwgX191MzIgaXNhKSwKIAkgICAgVFBfQVJHUyhyaXAsIGV4aXRfY29kZSwgZXhpdF9pbmZvMSwgZXhpdF9pbmZvMiwKLQkJICAgIGV4aXRfaW50X2luZm8sIGV4aXRfaW50X2luZm9fZXJyKSwKKwkJICAgIGV4aXRfaW50X2luZm8sIGV4aXRfaW50X2luZm9fZXJyLCBpc2EpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJX191NjQsCQlyaXAJCQkpCkBAIC00OTcsNiArNTg5LDcgQEAKIAkJX19maWVsZCgJX191NjQsCQlleGl0X2luZm8yCQkpCiAJCV9fZmllbGQoCV9fdTMyLAkJZXhpdF9pbnRfaW5mbwkJKQogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfaW50X2luZm9fZXJyCSkKKwkJX19maWVsZCgJX191MzIsCQlpc2EJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNTA2LDEyICs1OTksMTQgQEAKIAkJX19lbnRyeS0+ZXhpdF9pbmZvMgkJPSBleGl0X2luZm8yOwogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvCQk9IGV4aXRfaW50X2luZm87CiAJCV9fZW50cnktPmV4aXRfaW50X2luZm9fZXJyCT0gZXhpdF9pbnRfaW5mb19lcnI7CisJCV9fZW50cnktPmlzYQkJCT0gaXNhOwogCSksCiAJVFBfcHJpbnRrKCJyaXA6IDB4JTAxNmxseCByZWFzb246ICVzIGV4dF9pbmYxOiAweCUwMTZsbHggIgogCQkgICJleHRfaW5mMjogMHglMDE2bGx4IGV4dF9pbnQ6IDB4JTA4eCBleHRfaW50X2VycjogMHglMDh4IiwKIAkJICBfX2VudHJ5LT5yaXAsCi0JCSAgZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHAsIF9fZW50cnktPmV4aXRfY29kZSwKLQkJCQkJICAga3ZtX3g4Nl9vcHMtPmV4aXRfcmVhc29uc19zdHIpLAorCQkgKF9fZW50cnktPmlzYSA9PSBLVk1fSVNBX1ZNWCkgPworCQkgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5leGl0X2NvZGUsIFZNWF9FWElUX1JFQVNPTlMpIDoKKwkJIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+ZXhpdF9jb2RlLCBTVk1fRVhJVF9SRUFTT05TKSwKIAkJICBfX2VudHJ5LT5leGl0X2luZm8xLCBfX2VudHJ5LT5leGl0X2luZm8yLAogCQkgIF9fZW50cnktPmV4aXRfaW50X2luZm8sIF9fZW50cnktPmV4aXRfaW50X2luZm9fZXJyKQogKTsKQEAgLTUyMiw5ICs2MTcsOSBAQAogVFJBQ0VfRVZFTlQoa3ZtX25lc3RlZF92bWV4aXRfaW5qZWN0LAogCSAgICBUUF9QUk9UTyhfX3UzMiBleGl0X2NvZGUsCiAJCSAgICAgX191NjQgZXhpdF9pbmZvMSwgX191NjQgZXhpdF9pbmZvMiwKLQkJICAgICBfX3UzMiBleGl0X2ludF9pbmZvLCBfX3UzMiBleGl0X2ludF9pbmZvX2VyciksCisJCSAgICAgX191MzIgZXhpdF9pbnRfaW5mbywgX191MzIgZXhpdF9pbnRfaW5mb19lcnIsIF9fdTMyIGlzYSksCiAJICAgIFRQX0FSR1MoZXhpdF9jb2RlLCBleGl0X2luZm8xLCBleGl0X2luZm8yLAotCQkgICAgZXhpdF9pbnRfaW5mbywgZXhpdF9pbnRfaW5mb19lcnIpLAorCQkgICAgZXhpdF9pbnRfaW5mbywgZXhpdF9pbnRfaW5mb19lcnIsIGlzYSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfY29kZQkJKQpAQCAtNTMyLDYgKzYyNyw3IEBACiAJCV9fZmllbGQoCV9fdTY0LAkJZXhpdF9pbmZvMgkJKQogCQlfX2ZpZWxkKAlfX3UzMiwJCWV4aXRfaW50X2luZm8JCSkKIAkJX19maWVsZCgJX191MzIsCQlleGl0X2ludF9pbmZvX2VycgkpCisJCV9fZmllbGQoCV9fdTMyLAkJaXNhCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTU0MCwxMiArNjM2LDE0IEBACiAJCV9fZW50cnktPmV4aXRfaW5mbzIJCT0gZXhpdF9pbmZvMjsKIAkJX19lbnRyeS0+ZXhpdF9pbnRfaW5mbwkJPSBleGl0X2ludF9pbmZvOwogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvX2Vycgk9IGV4aXRfaW50X2luZm9fZXJyOworCQlfX2VudHJ5LT5pc2EJCQk9IGlzYTsKIAkpLAogCiAJVFBfcHJpbnRrKCJyZWFzb246ICVzIGV4dF9pbmYxOiAweCUwMTZsbHggIgogCQkgICJleHRfaW5mMjogMHglMDE2bGx4IGV4dF9pbnQ6IDB4JTA4eCBleHRfaW50X2VycjogMHglMDh4IiwKLQkJICBmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEocCwgX19lbnRyeS0+ZXhpdF9jb2RlLAotCQkJCQkgICBrdm1feDg2X29wcy0+ZXhpdF9yZWFzb25zX3N0ciksCisJCSAoX19lbnRyeS0+aXNhID09IEtWTV9JU0FfVk1YKSA/CisJCSBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPmV4aXRfY29kZSwgVk1YX0VYSVRfUkVBU09OUykgOgorCQkgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5leGl0X2NvZGUsIFNWTV9FWElUX1JFQVNPTlMpLAogCQlfX2VudHJ5LT5leGl0X2luZm8xLCBfX2VudHJ5LT5leGl0X2luZm8yLAogCQlfX2VudHJ5LT5leGl0X2ludF9pbmZvLCBfX2VudHJ5LT5leGl0X2ludF9pbmZvX2VycikKICk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggZTY1YTE1OC4uYTBkNmJkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtNzEsNiArNzEsOSBAQAogc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IHlpZWxkX29uX2hsdCA9IDE7CiBtb2R1bGVfcGFyYW0oeWllbGRfb25faGx0LCBib29sLCBTX0lSVUdPKTsKIAorc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGZhc3Rlb2kgPSAxOworbW9kdWxlX3BhcmFtKGZhc3Rlb2ksIGJvb2wsIFNfSVJVR08pOworCiAvKgogICogSWYgbmVzdGVkPTEsIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBpcyBzdXBwb3J0ZWQsIGkuZS4sIGd1ZXN0cyBtYXkgdXNlCiAgKiBWTVggYW5kIGJlIGEgaHlwZXJ2aXNvciBmb3IgaXRzIG93biBndWVzdHMuIElmIG5lc3RlZD0wLCBndWVzdHMgbWF5IG5vdApAQCAtMTc0OCw2ICsxNzUxLDIxIEBACiB9CiAKIC8qCisgKiBMaWtlIGd1ZXN0X3JlYWRfdHNjLCBidXQgYWx3YXlzIHJldHVybnMgTDEncyBub3Rpb24gb2YgdGhlIHRpbWVzdGFtcAorICogY291bnRlciwgZXZlbiBpZiBhIG5lc3RlZCBndWVzdCAoTDIpIGlzIGN1cnJlbnRseSBydW5uaW5nLgorICovCit1NjQgdm14X3JlYWRfbDFfdHNjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1NjQgaG9zdF90c2MsIHRzY19vZmZzZXQ7CisKKwlyZHRzY2xsKGhvc3RfdHNjKTsKKwl0c2Nfb2Zmc2V0ID0gaXNfZ3Vlc3RfbW9kZSh2Y3B1KSA/CisJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0IDoKKwkJdm1jc19yZWFkNjQoVFNDX09GRlNFVCk7CisJcmV0dXJuIGhvc3RfdHNjICsgdHNjX29mZnNldDsKK30KKworLyoKICAqIEVtcHR5IGNhbGwtYmFjay4gTmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgd2hlbiBWTVggZW5hYmxlcyB0aGUgU0VUX1RTQ19LSFoKICAqIGlvY3RsLiBJbiB0aGlzIGNhc2UgdGhlIGNhbGwtYmFjayBzaG91bGQgdXBkYXRlIGludGVybmFsIHZteCBzdGF0ZSB0byBtYWtlCiAgKiB0aGUgY2hhbmdlcyBlZmZlY3RpdmUuCkBAIC0xNzYyLDE1ICsxNzgwLDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHZteF93cml0ZV90c2Nfb2Zmc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCkKIHsKLQl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgb2Zmc2V0KTsKLQlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgewogCQkvKgotCQkgKiBXZSdyZSBoZXJlIGlmIEwxIGNob3NlIG5vdCB0byB0cmFwIHRoZSBUU0MgTVNSLiBTaW5jZQotCQkgKiBwcmVwYXJlX3ZtY3MxMigpIGRvZXMgbm90IGNvcHkgdHNjX29mZnNldCwgd2UgbmVlZCB0byBhbHNvCi0JCSAqIHNldCB0aGUgdm1jczEyIGZpZWxkIGhlcmUuCisJCSAqIFdlJ3JlIGhlcmUgaWYgTDEgY2hvc2Ugbm90IHRvIHRyYXAgV1JNU1IgdG8gVFNDLiBBY2NvcmRpbmcKKwkJICogdG8gdGhlIHNwZWMsIHRoaXMgc2hvdWxkIHNldCBMMSdzIFRTQzsgVGhlIG9mZnNldCB0aGF0IEwxCisJCSAqIHNldCBmb3IgTDIgcmVtYWlucyB1bmNoYW5nZWQsIGFuZCBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZAorCQkgKiB0byB0aGUgbmV3bHkgc2V0IFRTQyB0byBnZXQgTDIncyBUU0MuCiAJCSAqLwotCQlnZXRfdm1jczEyKHZjcHUpLT50c2Nfb2Zmc2V0ID0gb2Zmc2V0IC0KLQkJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0OworCQlzdHJ1Y3Qgdm1jczEyICp2bWNzMTI7CisJCXRvX3ZteCh2Y3B1KS0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0ID0gb2Zmc2V0OworCQkvKiByZWNhbGN1bGF0ZSB2bWNzMDIuVFNDX09GRlNFVDogKi8KKwkJdm1jczEyID0gZ2V0X3ZtY3MxMih2Y3B1KTsKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIG9mZnNldCArCisJCQkobmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcpID8KKwkJCSB2bWNzMTItPnRzY19vZmZzZXQgOiAwKSk7CisJfSBlbHNlIHsKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIG9mZnNldCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB2bXhfYWRqdXN0X3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzNjQgYWRqdXN0bWVudCkKQEAgLTI3MzYsOCArMjc2Miw4IEBACiAKIAlndWVzdF90cl9hciA9IHZtY3NfcmVhZDMyKEdVRVNUX1RSX0FSX0JZVEVTKTsKIAlpZiAoKGd1ZXN0X3RyX2FyICYgQVJfVFlQRV9NQVNLKSAhPSBBUl9UWVBFX0JVU1lfNjRfVFNTKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogdHNzIGZpeHVwIGZvciBsb25nIG1vZGUuIFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoIiVzOiB0c3MgZml4dXAgZm9yIGxvbmcgbW9kZS4gXG4iLAorCQkJCSAgICAgX19mdW5jX18pOwogCQl2bWNzX3dyaXRlMzIoR1VFU1RfVFJfQVJfQllURVMsCiAJCQkgICAgIChndWVzdF90cl9hciAmIH5BUl9UWVBFX01BU0spCiAJCQkgICAgIHwgQVJfVFlQRV9CVVNZXzY0X1RTUyk7CkBAIC00MTE1LDggKzQxNDEsNyBAQAogCQllcnJvcl9jb2RlID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUpOwogCWlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKIAkJLyogRVBUIHdvbid0IGNhdXNlIHBhZ2UgZmF1bHQgZGlyZWN0bHkgKi8KLQkJaWYgKGVuYWJsZV9lcHQpCi0JCQlCVUcoKTsKKwkJQlVHX09OKGVuYWJsZV9lcHQpOwogCQljcjIgPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAJCXRyYWNlX2t2bV9wYWdlX2ZhdWx0KGNyMiwgZXJyb3JfY29kZSk7CiAKQEAgLTQ1MTgsNiArNDU0MywyNCBAQAogCiBzdGF0aWMgaW50IGhhbmRsZV9hcGljX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJaWYgKGxpa2VseShmYXN0ZW9pKSkgeworCQl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwkJaW50IGFjY2Vzc190eXBlLCBvZmZzZXQ7CisKKwkJYWNjZXNzX3R5cGUgPSBleGl0X3F1YWxpZmljYXRpb24gJiBBUElDX0FDQ0VTU19UWVBFOworCQlvZmZzZXQgPSBleGl0X3F1YWxpZmljYXRpb24gJiBBUElDX0FDQ0VTU19PRkZTRVQ7CisJCS8qCisJCSAqIFNhbmUgZ3Vlc3QgdXNlcyBNT1YgdG8gd3JpdGUgRU9JLCB3aXRoIHdyaXR0ZW4gdmFsdWUKKwkJICogbm90IGNhcmVkLiBTbyBtYWtlIGEgc2hvcnQtY2lyY3VpdCBoZXJlIGJ5IGF2b2lkaW5nCisJCSAqIGhlYXZ5IGluc3RydWN0aW9uIGVtdWxhdGlvbi4KKwkJICovCisJCWlmICgoYWNjZXNzX3R5cGUgPT0gVFlQRV9MSU5FQVJfQVBJQ19JTlNUX1dSSVRFKSAmJgorCQkgICAgKG9mZnNldCA9PSBBUElDX0VPSSkpIHsKKwkJCWt2bV9sYXBpY19zZXRfZW9pKHZjcHUpOworCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCXJldHVybiAxOworCQl9CisJfQogCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORTsKIH0KIApAQCAtNTU5MSw4ICs1NjM0LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcyBmYWlsZWQgdm0gZW50cnkgJXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpKTsKKwkJcHJfaW5mb19yYXRlbGltaXRlZCgiJXMgZmFpbGVkIHZtIGVudHJ5ICV4XG4iLCBfX2Z1bmNfXywKKwkJCQkgICAgdm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC01Njk2LDggKzU3MzksNiBAQAogCXUzMiBleGl0X3JlYXNvbiA9IHZteC0+ZXhpdF9yZWFzb247CiAJdTMyIHZlY3RvcmluZ19pbmZvID0gdm14LT5pZHRfdmVjdG9yaW5nX2luZm87CiAKLQl0cmFjZV9rdm1fZXhpdChleGl0X3JlYXNvbiwgdmNwdSwgS1ZNX0lTQV9WTVgpOwotCiAJLyogSWYgZ3Vlc3Qgc3RhdGUgaXMgaW52YWxpZCwgc3RhcnQgZW11bGF0aW5nICovCiAJaWYgKHZteC0+ZW11bGF0aW9uX3JlcXVpcmVkICYmIGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSkKIAkJcmV0dXJuIGhhbmRsZV9pbnZhbGlkX2d1ZXN0X3N0YXRlKHZjcHUpOwpAQCAtNjEwMSw2ICs2MTQyLDcgQEAKIAl2bXgtPmxvYWRlZF92bWNzLT5sYXVuY2hlZCA9IDE7CiAKIAl2bXgtPmV4aXRfcmVhc29uID0gdm1jc19yZWFkMzIoVk1fRVhJVF9SRUFTT04pOworCXRyYWNlX2t2bV9leGl0KHZteC0+ZXhpdF9yZWFzb24sIHZjcHUsIEtWTV9JU0FfVk1YKTsKIAogCXZteF9jb21wbGV0ZV9hdG9taWNfZXhpdCh2bXgpOwogCXZteF9yZWNvdmVyX25taV9ibG9ja2luZyh2bXgpOwpAQCAtNjI0MSw0OSArNjI4Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBfRVIoeCkgeyBFWElUX1JFQVNPTl8jI3gsICN4IH0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyB2bXhfZXhpdF9yZWFzb25zX3N0cltdID0gewotCV9FUihFWENFUFRJT05fTk1JKSwKLQlfRVIoRVhURVJOQUxfSU5URVJSVVBUKSwKLQlfRVIoVFJJUExFX0ZBVUxUKSwKLQlfRVIoUEVORElOR19JTlRFUlJVUFQpLAotCV9FUihOTUlfV0lORE9XKSwKLQlfRVIoVEFTS19TV0lUQ0gpLAotCV9FUihDUFVJRCksCi0JX0VSKEhMVCksCi0JX0VSKElOVkxQRyksCi0JX0VSKFJEUE1DKSwKLQlfRVIoUkRUU0MpLAotCV9FUihWTUNBTEwpLAotCV9FUihWTUNMRUFSKSwKLQlfRVIoVk1MQVVOQ0gpLAotCV9FUihWTVBUUkxEKSwKLQlfRVIoVk1QVFJTVCksCi0JX0VSKFZNUkVBRCksCi0JX0VSKFZNUkVTVU1FKSwKLQlfRVIoVk1XUklURSksCi0JX0VSKFZNT0ZGKSwKLQlfRVIoVk1PTiksCi0JX0VSKENSX0FDQ0VTUyksCi0JX0VSKERSX0FDQ0VTUyksCi0JX0VSKElPX0lOU1RSVUNUSU9OKSwKLQlfRVIoTVNSX1JFQUQpLAotCV9FUihNU1JfV1JJVEUpLAotCV9FUihNV0FJVF9JTlNUUlVDVElPTiksCi0JX0VSKE1PTklUT1JfSU5TVFJVQ1RJT04pLAotCV9FUihQQVVTRV9JTlNUUlVDVElPTiksCi0JX0VSKE1DRV9EVVJJTkdfVk1FTlRSWSksCi0JX0VSKFRQUl9CRUxPV19USFJFU0hPTEQpLAotCV9FUihBUElDX0FDQ0VTUyksCi0JX0VSKEVQVF9WSU9MQVRJT04pLAotCV9FUihFUFRfTUlTQ09ORklHKSwKLQlfRVIoV0JJTlZEKSwKLQl7IC0xLCBOVUxMIH0KLX07Ci0KLSN1bmRlZiBfRVIKLQogc3RhdGljIGludCB2bXhfZ2V0X2xwYWdlX2xldmVsKHZvaWQpCiB7CiAJaWYgKGVuYWJsZV9lcHQgJiYgIWNwdV9oYXNfdm14X2VwdF8xZ19wYWdlKCkpCkBAIC02NTE0LDggKzY1MTMsMTEgQEAKIAogCXNldF9jcjRfZ3Vlc3RfaG9zdF9tYXNrKHZteCk7CiAKLQl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwKLQkJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgKyB2bWNzMTItPnRzY19vZmZzZXQpOworCWlmICh2bWNzMTItPmNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgJiBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcpCisJCXZtY3Nfd3JpdGU2NChUU0NfT0ZGU0VULAorCQkJdm14LT5uZXN0ZWQudm1jczAxX3RzY19vZmZzZXQgKyB2bWNzMTItPnRzY19vZmZzZXQpOworCWVsc2UKKwkJdm1jc193cml0ZTY0KFRTQ19PRkZTRVQsIHZteC0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0KTsKIAogCWlmIChlbmFibGVfdnBpZCkgewogCQkvKgpAQCAtNjYxMCw5ICs2NjEyLDggQEAKIAlpZiAodm1jczEyLT52bV9lbnRyeV9tc3JfbG9hZF9jb3VudCA+IDAgfHwKIAkgICAgdm1jczEyLT52bV9leGl0X21zcl9sb2FkX2NvdW50ID4gMCB8fAogCSAgICB2bWNzMTItPnZtX2V4aXRfbXNyX3N0b3JlX2NvdW50ID4gMCkgewotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAiJXM6IFZNQ1MgTVNSX3tMT0FELFNUT1JFfSB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCQlwcl93YXJuX3JhdGVsaW1pdGVkKCIlczogVk1DUyBNU1Jfe0xPQUQsU1RPUkV9IHVuc3VwcG9ydGVkXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CiAJCW5lc3RlZF92bXhfZmFpbFZhbGlkKHZjcHUsIFZNWEVSUl9FTlRSWV9JTlZBTElEX0NPTlRST0xfRklFTEQpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC02OTIyLDcgKzY5MjMsNyBAQAogCiAJbG9hZF92bWNzMTJfaG9zdF9zdGF0ZSh2Y3B1LCB2bWNzMTIpOwogCi0JLyogVXBkYXRlIFRTQ19PRkZTRVQgaWYgdm14X2FkanVzdF90c2Nfb2Zmc2V0KCkgd2FzIHVzZWQgd2hpbGUgTDIgcmFuICovCisJLyogVXBkYXRlIFRTQ19PRkZTRVQgaWYgVFNDIHdhcyBjaGFuZ2VkIHdoaWxlIEwyIHJhbiAqLwogCXZtY3Nfd3JpdGU2NChUU0NfT0ZGU0VULCB2bXgtPm5lc3RlZC52bWNzMDFfdHNjX29mZnNldCk7CiAKIAkvKiBUaGlzIGlzIG5lZWRlZCBmb3Igc2FtZSByZWFzb24gYXMgaXQgd2FzIG5lZWRlZCBpbiBwcmVwYXJlX3ZtY3MwMiAqLwpAQCAtNzAzOSw3ICs3MDQwLDYgQEAKIAkuZ2V0X210X21hc2sgPSB2bXhfZ2V0X210X21hc2ssCiAKIAkuZ2V0X2V4aXRfaW5mbyA9IHZteF9nZXRfZXhpdF9pbmZvLAotCS5leGl0X3JlYXNvbnNfc3RyID0gdm14X2V4aXRfcmVhc29uc19zdHIsCiAKIAkuZ2V0X2xwYWdlX2xldmVsID0gdm14X2dldF9scGFnZV9sZXZlbCwKIApAQCAtNzA1NSw2ICs3MDU1LDcgQEAKIAkud3JpdGVfdHNjX29mZnNldCA9IHZteF93cml0ZV90c2Nfb2Zmc2V0LAogCS5hZGp1c3RfdHNjX29mZnNldCA9IHZteF9hZGp1c3RfdHNjX29mZnNldCwKIAkuY29tcHV0ZV90c2Nfb2Zmc2V0ID0gdm14X2NvbXB1dGVfdHNjX29mZnNldCwKKwkucmVhZF9sMV90c2MgPSB2bXhfcmVhZF9sMV90c2MsCiAKIAkuc2V0X3RkcF9jcjMgPSB2bXhfc2V0X2NyMywKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IDg0YTI4ZWEuLmMzOGVmZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMva3ZtLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwpAQCAtODMsNiArODQsNyBAQAogc3RhdGljIHZvaWQgdXBkYXRlX2NyOF9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHN0YXRpYyBpbnQga3ZtX2Rldl9pb2N0bF9nZXRfc3VwcG9ydGVkX2NwdWlkKHN0cnVjdCBrdm1fY3B1aWQyICpjcHVpZCwKIAkJCQkgICAgc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgX191c2VyICplbnRyaWVzKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIHN0cnVjdCBrdm1feDg2X29wcyAqa3ZtX3g4Nl9vcHM7CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1feDg2X29wcyk7CkBAIC0zNTksOCArMzYxLDggQEAKIAogdm9pZCBrdm1faW5qZWN0X25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Ja3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0VWRU5ULCB2Y3B1KTsKLQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gMTsKKwlhdG9taWNfaW5jKCZ2Y3B1LT5hcmNoLm5taV9xdWV1ZWQpOworCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9OTUksIHZjcHUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2luamVjdF9ubWkpOwogCkBAIC01OTksNiArNjAxLDggQEAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7CisJc3RydWN0IGt2bV9sYXBpYyAqYXBpYyA9IHZjcHUtPmFyY2guYXBpYzsKKwl1MzIgdGltZXJfbW9kZV9tYXNrOwogCiAJYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDEsIDApOwogCWlmICghYmVzdCkKQEAgLTYxMCw2ICs2MTQsMTYgQEAKIAkJaWYgKGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIFg4Nl9DUjRfT1NYU0FWRSkpCiAJCQliZXN0LT5lY3ggfD0gYml0KFg4Nl9GRUFUVVJFX09TWFNBVkUpOwogCX0KKworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAmJgorCQliZXN0LT5mdW5jdGlvbiA9PSAweDEpIHsKKwkJYmVzdC0+ZWN4IHw9IGJpdChYODZfRkVBVFVSRV9UU0NfREVBRExJTkVfVElNRVIpOworCQl0aW1lcl9tb2RlX21hc2sgPSAzIDw8IDE3OworCX0gZWxzZQorCQl0aW1lcl9tb2RlX21hc2sgPSAxIDw8IDE3OworCisJaWYgKGFwaWMpCisJCWFwaWMtPmxhcGljX3RpbWVyLnRpbWVyX21vZGVfbWFzayA9IHRpbWVyX21vZGVfbWFzazsKIH0KIAogaW50IGt2bV9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCkBAIC04MjUsNiArODM5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBudW1fbXNyc190b19zYXZlOwogCiBzdGF0aWMgdTMyIGVtdWxhdGVkX21zcnNbXSA9IHsKKwlNU1JfSUEzMl9UU0NERUFETElORSwKIAlNU1JfSUEzMl9NSVNDX0VOQUJMRSwKIAlNU1JfSUEzMl9NQ0dfU1RBVFVTLAogCU1TUl9JQTMyX01DR19DVEwsCkBAIC0xMDAwLDcgKzEwMTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1NjQgdmNwdV90c2Nfa2h6KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3U2NCB2Y3B1X3RzY19raHooc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWlmICh2Y3B1LT5hcmNoLnZpcnR1YWxfdHNjX2toeikKIAkJcmV0dXJuIHZjcHUtPmFyY2gudmlydHVhbF90c2Nfa2h6OwpAQCAtMTA5OCw3ICsxMTEzLDcgQEAKIAogCS8qIEtlZXAgaXJxIGRpc2FibGVkIHRvIHByZXZlbnQgY2hhbmdlcyB0byB0aGUgY2xvY2sgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Ja3ZtX2dldF9tc3IodiwgTVNSX0lBMzJfVFNDLCAmdHNjX3RpbWVzdGFtcCk7CisJdHNjX3RpbWVzdGFtcCA9IGt2bV94ODZfb3BzLT5yZWFkX2wxX3RzYyh2KTsKIAlrZXJuZWxfbnMgPSBnZXRfa2VybmVsX25zKCk7CiAJdGhpc190c2Nfa2h6ID0gdmNwdV90c2Nfa2h6KHYpOwogCWlmICh1bmxpa2VseSh0aGlzX3RzY19raHogPT0gMCkpIHsKQEAgLTE1NjQsNiArMTU3OSw5IEBACiAJCWJyZWFrOwogCWNhc2UgQVBJQ19CQVNFX01TUiAuLi4gQVBJQ19CQVNFX01TUiArIDB4M2ZmOgogCQlyZXR1cm4ga3ZtX3gyYXBpY19tc3Jfd3JpdGUodmNwdSwgbXNyLCBkYXRhKTsKKwljYXNlIE1TUl9JQTMyX1RTQ0RFQURMSU5FOgorCQlrdm1fc2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcih2Y3B1LCBkYXRhKTsKKwkJYnJlYWs7CiAJY2FzZSBNU1JfSUEzMl9NSVNDX0VOQUJMRToKIAkJdmNwdS0+YXJjaC5pYTMyX21pc2NfZW5hYmxlX21zciA9IGRhdGE7CiAJCWJyZWFrOwpAQCAtMTgyNSw2ICsxODQzLDkgQEAKIAkJcmV0dXJuIGt2bV9odl92YXBpY19tc3JfcmVhZCh2Y3B1LCBBUElDX0lDUiwgcGRhdGEpOwogCWNhc2UgSFZfWDY0X01TUl9UUFI6CiAJCXJldHVybiBrdm1faHZfdmFwaWNfbXNyX3JlYWQodmNwdSwgQVBJQ19UQVNLUFJJLCBwZGF0YSk7CisJY2FzZSBIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0U6CisJCWRhdGEgPSB2Y3B1LT5hcmNoLmh2X3ZhcGljOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl91bmltcGwodmNwdSwgIkh5cGVyLVYgdW5oYW5kbGVkIHJkbXNyOiAweCV4XG4iLCBtc3IpOwogCQlyZXR1cm4gMTsKQEAgLTE4MzksNyArMTg2MCw2IEBACiAKIAlzd2l0Y2ggKG1zcikgewogCWNhc2UgTVNSX0lBMzJfUExBVEZPUk1fSUQ6Ci0JY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CiAJY2FzZSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjoKIAljYXNlIE1TUl9JQTMyX0RFQlVHQ1RMTVNSOgogCWNhc2UgTVNSX0lBMzJfTEFTVEJSQU5DSEZST01JUDoKQEAgLTE4NjAsNiArMTg4MCw5IEBACiAJY2FzZSBNU1JfRkFNMTBIX01NSU9fQ09ORl9CQVNFOgogCQlkYXRhID0gMDsKIAkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CisJCWRhdGEgPSAweDEwMDAwMDAwMFVMTDsKKwkJYnJlYWs7CiAJY2FzZSBNU1JfTVRSUmNhcDoKIAkJZGF0YSA9IDB4NTAwIHwgS1ZNX05SX1ZBUl9NVFJSOwogCQlicmVhazsKQEAgLTE4ODgsNiArMTkxMSw5IEBACiAJY2FzZSBBUElDX0JBU0VfTVNSIC4uLiBBUElDX0JBU0VfTVNSICsgMHgzZmY6CiAJCXJldHVybiBrdm1feDJhcGljX21zcl9yZWFkKHZjcHUsIG1zciwgcGRhdGEpOwogCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1RTQ0RFQURMSU5FOgorCQlkYXRhID0ga3ZtX2dldF9sYXBpY190c2NkZWFkbGluZV9tc3IodmNwdSk7CisJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfTUlTQ19FTkFCTEU6CiAJCWRhdGEgPSB2Y3B1LT5hcmNoLmlhMzJfbWlzY19lbmFibGVfbXNyOwogCQlicmVhazsKQEAgLTIwODYsNiArMjExMiw5IEBACiAJCXIgPSAha3ZtX3g4Nl9vcHMtPmNwdV9oYXNfYWNjZWxlcmF0ZWRfdHByKCk7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9OUl9WQ1BVUzoKKwkJciA9IEtWTV9TT0ZUX01BWF9WQ1BVUzsKKwkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX01BWF9WQ1BVUzoKIAkJciA9IEtWTV9NQVhfVkNQVVM7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9OUl9NRU1TTE9UUzoKQEAgLTIwOTUsNyArMjEyNCw3IEBACiAJCXIgPSAwOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfSU9NTVU6Ci0JCXIgPSBpb21tdV9mb3VuZCgpOworCQlyID0gaW9tbXVfcHJlc2VudCgmcGNpX2J1c190eXBlKTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX01DRToKIAkJciA9IEtWTV9NQVhfTUNFX0JBTktTOwpAQCAtMjIxMCw3ICsyMjM5LDcgQEAKIAkJczY0IHRzY19kZWx0YTsKIAkJdTY0IHRzYzsKIAotCQlrdm1fZ2V0X21zcih2Y3B1LCBNU1JfSUEzMl9UU0MsICZ0c2MpOworCQl0c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiAJCXRzY19kZWx0YSA9ICF2Y3B1LT5hcmNoLmxhc3RfZ3Vlc3RfdHNjID8gMCA6CiAJCQkgICAgIHRzYyAtIHZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2M7CiAKQEAgLTIyMzQsNyArMjI2Myw3IEBACiB7CiAJa3ZtX3g4Nl9vcHMtPnZjcHVfcHV0KHZjcHUpOwogCWt2bV9wdXRfZ3Vlc3RfZnB1KHZjcHUpOwotCWt2bV9nZXRfbXNyKHZjcHUsIE1TUl9JQTMyX1RTQywgJnZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MpOworCXZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiB9CiAKIHN0YXRpYyBpbnQgaXNfZWZlcl9ueCh2b2lkKQpAQCAtMjgxOSw2ICsyODQ4LDcgQEAKIHN0YXRpYyB2b2lkIGt2bV92Y3B1X2lvY3RsX3g4Nl9nZXRfdmNwdV9ldmVudHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1X2V2ZW50cyAqZXZlbnRzKQogeworCXByb2Nlc3Nfbm1pKHZjcHUpOwogCWV2ZW50cy0+ZXhjZXB0aW9uLmluamVjdGVkID0KIAkJdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyAmJgogCQkha3ZtX2V4Y2VwdGlvbl9pc19zb2Z0KHZjcHUtPmFyY2guZXhjZXB0aW9uLm5yKTsKQEAgLTI4MzYsNyArMjg2Niw3IEBACiAJCQlLVk1fWDg2X1NIQURPV19JTlRfTU9WX1NTIHwgS1ZNX1g4Nl9TSEFET1dfSU5UX1NUSSk7CiAKIAlldmVudHMtPm5taS5pbmplY3RlZCA9IHZjcHUtPmFyY2gubm1pX2luamVjdGVkOwotCWV2ZW50cy0+bm1pLnBlbmRpbmcgPSB2Y3B1LT5hcmNoLm5taV9wZW5kaW5nOworCWV2ZW50cy0+bm1pLnBlbmRpbmcgPSB2Y3B1LT5hcmNoLm5taV9wZW5kaW5nICE9IDA7CiAJZXZlbnRzLT5ubWkubWFza2VkID0ga3ZtX3g4Nl9vcHMtPmdldF9ubWlfbWFzayh2Y3B1KTsKIAlldmVudHMtPm5taS5wYWQgPSAwOwogCkBAIC0yODU2LDYgKzI4ODYsNyBAQAogCQkJICAgICAgfCBLVk1fVkNQVUVWRU5UX1ZBTElEX1NIQURPVykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcHJvY2Vzc19ubWkodmNwdSk7CiAJdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZyA9IGV2ZW50cy0+ZXhjZXB0aW9uLmluamVjdGVkOwogCXZjcHUtPmFyY2guZXhjZXB0aW9uLm5yID0gZXZlbnRzLT5leGNlcHRpb24ubnI7CiAJdmNwdS0+YXJjaC5leGNlcHRpb24uaGFzX2Vycm9yX2NvZGUgPSBldmVudHMtPmV4Y2VwdGlvbi5oYXNfZXJyb3JfY29kZTsKQEAgLTM1NTYsNyArMzU4NywxMSBAQAogCQkJaWYgKHIpIHsKIAkJCQltdXRleF9sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKLQkJCQkJCQkgICZ2cGljLT5kZXYpOworCQkJCQkJCSAgJnZwaWMtPmRldl9tYXN0ZXIpOworCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKKwkJCQkJCQkgICZ2cGljLT5kZXZfc2xhdmUpOworCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKKwkJCQkJCQkgICZ2cGljLT5kZXZfZWNscik7CiAJCQkJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQkJCWtmcmVlKHZwaWMpOwogCQkJCWdvdG8gY3JlYXRlX2lycWNoaXBfdW5sb2NrOwpAQCAtNDA0NSw2MiArNDA4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgIHZvaWQgKnZhbCwKLQkJCQkgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCQkgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCi17Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZW11bF90b192Y3B1KGN0eHQpOwotCWdwYV90IGdwYTsKLQlpbnQgaGFuZGxlZCwgcmV0OwotCi0JaWYgKHZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQpIHsKLQkJbWVtY3B5KHZhbCwgdmNwdS0+bW1pb19kYXRhLCBieXRlcyk7Ci0JCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1JFQUQsIGJ5dGVzLAotCQkJICAgICAgIHZjcHUtPm1taW9fcGh5c19hZGRyLCAqKHU2NCAqKXZhbCk7Ci0JCXZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQgPSAwOwotCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKLQl9Ci0KLQlyZXQgPSB2Y3B1X21taW9fZ3ZhX3RvX2dwYSh2Y3B1LCBhZGRyLCAmZ3BhLCBleGNlcHRpb24sIGZhbHNlKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0KLQlpZiAocmV0KQotCQlnb3RvIG1taW87Ci0KLQlpZiAoa3ZtX3JlYWRfZ3Vlc3RfdmlydChjdHh0LCBhZGRyLCB2YWwsIGJ5dGVzLCBleGNlcHRpb24pCi0JICAgID09IFg4NkVNVUxfQ09OVElOVUUpCi0JCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwotCi1tbWlvOgotCS8qCi0JICogSXMgdGhpcyBNTUlPIGhhbmRsZWQgbG9jYWxseT8KLQkgKi8KLQloYW5kbGVkID0gdmNwdV9tbWlvX3JlYWQodmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKLQotCWlmIChoYW5kbGVkID09IGJ5dGVzKQotCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKLQotCWdwYSArPSBoYW5kbGVkOwotCWJ5dGVzIC09IGhhbmRsZWQ7Ci0JdmFsICs9IGhhbmRsZWQ7Ci0KLQl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFEX1VOU0FUSVNGSUVELCBieXRlcywgZ3BhLCAwKTsKLQotCXZjcHUtPm1taW9fbmVlZGVkID0gMTsKLQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKLQl2Y3B1LT5ydW4tPm1taW8ucGh5c19hZGRyID0gdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7Ci0JdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7Ci0JdmNwdS0+cnVuLT5tbWlvLmxlbiA9IG1pbih2Y3B1LT5tbWlvX3NpemUsIDgpOwotCXZjcHUtPnJ1bi0+bW1pby5pc193cml0ZSA9IHZjcHUtPm1taW9faXNfd3JpdGUgPSAwOwotCXZjcHUtPm1taW9faW5kZXggPSAwOwotCi0JcmV0dXJuIFg4NkVNVUxfSU9fTkVFREVEOwotfQotCiBpbnQgZW11bGF0b3Jfd3JpdGVfcGh5cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKIAkJCWNvbnN0IHZvaWQgKnZhbCwgaW50IGJ5dGVzKQogewpAQCAtNDExMywxNiArNDA5Miw5MyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCQkgICBjb25zdCB2b2lkICp2YWwsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCQkJICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKLQkJCQkJICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RydWN0IHJlYWRfd3JpdGVfZW11bGF0b3Jfb3BzIHsKKwlpbnQgKCpyZWFkX3dyaXRlX3ByZXBhcmUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdm9pZCAqdmFsLAorCQkJCSAgaW50IGJ5dGVzKTsKKwlpbnQgKCpyZWFkX3dyaXRlX2VtdWxhdGUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJCSAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpOworCWludCAoKnJlYWRfd3JpdGVfbW1pbykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsCisJCQkgICAgICAgaW50IGJ5dGVzLCB2b2lkICp2YWwpOworCWludCAoKnJlYWRfd3JpdGVfZXhpdF9tbWlvKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKKwkJCQkgICAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpOworCWJvb2wgd3JpdGU7Cit9OworCitzdGF0aWMgaW50IHJlYWRfcHJlcGFyZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKnZhbCwgaW50IGJ5dGVzKQoreworCWlmICh2Y3B1LT5tbWlvX3JlYWRfY29tcGxldGVkKSB7CisJCW1lbWNweSh2YWwsIHZjcHUtPm1taW9fZGF0YSwgYnl0ZXMpOworCQl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFELCBieXRlcywKKwkJCSAgICAgICB2Y3B1LT5tbWlvX3BoeXNfYWRkciwgKih1NjQgKil2YWwpOworCQl2Y3B1LT5tbWlvX3JlYWRfY29tcGxldGVkID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9lbXVsYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJdm9pZCAqdmFsLCBpbnQgYnl0ZXMpCit7CisJcmV0dXJuICFrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGdwYSwgdmFsLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZW11bGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwKKwkJCSB2b2lkICp2YWwsIGludCBieXRlcykKK3sKKwlyZXR1cm4gZW11bGF0b3Jfd3JpdGVfcGh5cyh2Y3B1LCBncGEsIHZhbCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW50IHdyaXRlX21taW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsIGludCBieXRlcywgdm9pZCAqdmFsKQoreworCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1dSSVRFLCBieXRlcywgZ3BhLCAqKHU2NCAqKXZhbCk7CisJcmV0dXJuIHZjcHVfbW1pb193cml0ZSh2Y3B1LCBncGEsIGJ5dGVzLCB2YWwpOworfQorCitzdGF0aWMgaW50IHJlYWRfZXhpdF9tbWlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJICB2b2lkICp2YWwsIGludCBieXRlcykKK3sKKwl0cmFjZV9rdm1fbW1pbyhLVk1fVFJBQ0VfTU1JT19SRUFEX1VOU0FUSVNGSUVELCBieXRlcywgZ3BhLCAwKTsKKwlyZXR1cm4gWDg2RU1VTF9JT19ORUVERUQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXhpdF9tbWlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLAorCQkJICAgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpCit7CisJbWVtY3B5KHZjcHUtPm1taW9fZGF0YSwgdmFsLCBieXRlcyk7CisJbWVtY3B5KHZjcHUtPnJ1bi0+bW1pby5kYXRhLCB2Y3B1LT5tbWlvX2RhdGEsIDgpOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgc3RydWN0IHJlYWRfd3JpdGVfZW11bGF0b3Jfb3BzIHJlYWRfZW11bHRvciA9IHsKKwkucmVhZF93cml0ZV9wcmVwYXJlID0gcmVhZF9wcmVwYXJlLAorCS5yZWFkX3dyaXRlX2VtdWxhdGUgPSByZWFkX2VtdWxhdGUsCisJLnJlYWRfd3JpdGVfbW1pbyA9IHZjcHVfbW1pb19yZWFkLAorCS5yZWFkX3dyaXRlX2V4aXRfbW1pbyA9IHJlYWRfZXhpdF9tbWlvLAorfTsKKworc3RhdGljIHN0cnVjdCByZWFkX3dyaXRlX2VtdWxhdG9yX29wcyB3cml0ZV9lbXVsdG9yID0geworCS5yZWFkX3dyaXRlX2VtdWxhdGUgPSB3cml0ZV9lbXVsYXRlLAorCS5yZWFkX3dyaXRlX21taW8gPSB3cml0ZV9tbWlvLAorCS5yZWFkX3dyaXRlX2V4aXRfbW1pbyA9IHdyaXRlX2V4aXRfbW1pbywKKwkud3JpdGUgPSB0cnVlLAorfTsKKworc3RhdGljIGludCBlbXVsYXRvcl9yZWFkX3dyaXRlX29uZXBhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICp2YWwsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKKwkJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgICBzdHJ1Y3QgcmVhZF93cml0ZV9lbXVsYXRvcl9vcHMgKm9wcykKIHsKIAlncGFfdCBncGE7CiAJaW50IGhhbmRsZWQsIHJldDsKKwlib29sIHdyaXRlID0gb3BzLT53cml0ZTsKIAotCXJldCA9IHZjcHVfbW1pb19ndmFfdG9fZ3BhKHZjcHUsIGFkZHIsICZncGEsIGV4Y2VwdGlvbiwgdHJ1ZSk7CisJaWYgKG9wcy0+cmVhZF93cml0ZV9wcmVwYXJlICYmCisJCSAgb3BzLT5yZWFkX3dyaXRlX3ByZXBhcmUodmNwdSwgdmFsLCBieXRlcykpCisJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworCisJcmV0ID0gdmNwdV9tbWlvX2d2YV90b19ncGEodmNwdSwgYWRkciwgJmdwYSwgZXhjZXB0aW9uLCB3cml0ZSk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwpAQCAtNDEzMSwxNSArNDE4NywxNCBAQAogCWlmIChyZXQpCiAJCWdvdG8gbW1pbzsKIAotCWlmIChlbXVsYXRvcl93cml0ZV9waHlzKHZjcHUsIGdwYSwgdmFsLCBieXRlcykpCisJaWYgKG9wcy0+cmVhZF93cml0ZV9lbXVsYXRlKHZjcHUsIGdwYSwgdmFsLCBieXRlcykpCiAJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogCiBtbWlvOgotCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1dSSVRFLCBieXRlcywgZ3BhLCAqKHU2NCAqKXZhbCk7CiAJLyoKIAkgKiBJcyB0aGlzIE1NSU8gaGFuZGxlZCBsb2NhbGx5PwogCSAqLwotCWhhbmRsZWQgPSB2Y3B1X21taW9fd3JpdGUodmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKKwloYW5kbGVkID0gb3BzLT5yZWFkX3dyaXRlX21taW8odmNwdSwgZ3BhLCBieXRlcywgdmFsKTsKIAlpZiAoaGFuZGxlZCA9PSBieXRlcykKIAkJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiAKQEAgLTQxNDgsMjMgKzQyMDMsMjAgQEAKIAl2YWwgKz0gaGFuZGxlZDsKIAogCXZjcHUtPm1taW9fbmVlZGVkID0gMTsKLQltZW1jcHkodmNwdS0+bW1pb19kYXRhLCB2YWwsIGJ5dGVzKTsKIAl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfTU1JTzsKIAl2Y3B1LT5ydW4tPm1taW8ucGh5c19hZGRyID0gdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7CiAJdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7CiAJdmNwdS0+cnVuLT5tbWlvLmxlbiA9IG1pbih2Y3B1LT5tbWlvX3NpemUsIDgpOwotCXZjcHUtPnJ1bi0+bW1pby5pc193cml0ZSA9IHZjcHUtPm1taW9faXNfd3JpdGUgPSAxOwotCW1lbWNweSh2Y3B1LT5ydW4tPm1taW8uZGF0YSwgdmNwdS0+bW1pb19kYXRhLCA4KTsKKwl2Y3B1LT5ydW4tPm1taW8uaXNfd3JpdGUgPSB2Y3B1LT5tbWlvX2lzX3dyaXRlID0gd3JpdGU7CiAJdmNwdS0+bW1pb19pbmRleCA9IDA7CiAKLQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKKwlyZXR1cm4gb3BzLT5yZWFkX3dyaXRlX2V4aXRfbW1pbyh2Y3B1LCBncGEsIHZhbCwgYnl0ZXMpOwogfQogCi1pbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgIGNvbnN0IHZvaWQgKnZhbCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKK2ludCBlbXVsYXRvcl9yZWFkX3dyaXRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQl2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKKwkJCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24sCisJCQlzdHJ1Y3QgcmVhZF93cml0ZV9lbXVsYXRvcl9vcHMgKm9wcykKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBlbXVsX3RvX3ZjcHUoY3R4dCk7CiAKQEAgLTQxNzMsMTYgKzQyMjUsMzggQEAKIAkJaW50IHJjLCBub3c7CiAKIAkJbm93ID0gLWFkZHIgJiB+UEFHRV9NQVNLOwotCQlyYyA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBub3csIGV4Y2VwdGlvbiwKLQkJCQkJCSAgICAgdmNwdSk7CisJCXJjID0gZW11bGF0b3JfcmVhZF93cml0ZV9vbmVwYWdlKGFkZHIsIHZhbCwgbm93LCBleGNlcHRpb24sCisJCQkJCQkgdmNwdSwgb3BzKTsKKwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJYWRkciArPSBub3c7CiAJCXZhbCArPSBub3c7CiAJCWJ5dGVzIC09IG5vdzsKIAl9Ci0JcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBieXRlcywgZXhjZXB0aW9uLAotCQkJCQkgICAgICAgdmNwdSk7CisKKwlyZXR1cm4gZW11bGF0b3JfcmVhZF93cml0ZV9vbmVwYWdlKGFkZHIsIHZhbCwgYnl0ZXMsIGV4Y2VwdGlvbiwKKwkJCQkJICAgdmNwdSwgb3BzKTsKK30KKworc3RhdGljIGludCBlbXVsYXRvcl9yZWFkX2VtdWxhdGVkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgdm9pZCAqdmFsLAorCQkJCSAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCSAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKK3sKKwlyZXR1cm4gZW11bGF0b3JfcmVhZF93cml0ZShjdHh0LCBhZGRyLCB2YWwsIGJ5dGVzLAorCQkJCSAgIGV4Y2VwdGlvbiwgJnJlYWRfZW11bHRvcik7Cit9CisKK2ludCBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgY29uc3Qgdm9pZCAqdmFsLAorCQkJICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCSAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQoreworCXJldHVybiBlbXVsYXRvcl9yZWFkX3dyaXRlKGN0eHQsIGFkZHIsICh2b2lkICopdmFsLCBieXRlcywKKwkJCQkgICBleGNlcHRpb24sICZ3cml0ZV9lbXVsdG9yKTsKIH0KIAogI2RlZmluZSBDTVBYQ0hHX1RZUEUodCwgcHRyLCBvbGQsIG5ldykgXApAQCAtNDcxMiw3ICs0Nzg2LDcgQEAKIAlrdm1fc2V0X3JmbGFncyh2Y3B1LCBjdHh0LT5lZmxhZ3MpOwogCiAJaWYgKGlycSA9PSBOTUlfVkVDVE9SKQotCQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CisJCXZjcHUtPmFyY2gubm1pX3BlbmRpbmcgPSAwOwogCWVsc2UKIAkJdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZyA9IGZhbHNlOwogCkBAIC00Nzg4LDcgKzQ4NjIsNyBAQAogCiAJCXRyYWNlX2t2bV9lbXVsYXRlX2luc25fc3RhcnQodmNwdSk7CiAJCSsrdmNwdS0+c3RhdC5pbnNuX2VtdWxhdGlvbjsKLQkJaWYgKHIpICB7CisJCWlmIChyICE9IEVNVUxBVElPTl9PSykgIHsKIAkJCWlmIChlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX1RSQVBfVUQpCiAJCQkJcmV0dXJuIEVNVUxBVEVfRkFJTDsKIAkJCWlmIChyZWV4ZWN1dGVfaW5zdHJ1Y3Rpb24odmNwdSwgY3IyKSkKQEAgLTU1MjEsNyArNTU5NSw3IEBACiAJLyogdHJ5IHRvIGluamVjdCBuZXcgZXZlbnQgaWYgcGVuZGluZyAqLwogCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKSB7CiAJCWlmIChrdm1feDg2X29wcy0+bm1pX2FsbG93ZWQodmNwdSkpIHsKLQkJCXZjcHUtPmFyY2gubm1pX3BlbmRpbmcgPSBmYWxzZTsKKwkJCS0tdmNwdS0+YXJjaC5ubWlfcGVuZGluZzsKIAkJCXZjcHUtPmFyY2gubm1pX2luamVjdGVkID0gdHJ1ZTsKIAkJCWt2bV94ODZfb3BzLT5zZXRfbm1pKHZjcHUpOwogCQl9CkBAIC01NTUzLDEwICs1NjI3LDI2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBwcm9jZXNzX25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbGltaXQgPSAyOworCisJLyoKKwkgKiB4ODYgaXMgbGltaXRlZCB0byBvbmUgTk1JIHJ1bm5pbmcsIGFuZCBvbmUgTk1JIHBlbmRpbmcgYWZ0ZXIgaXQuCisJICogSWYgYW4gTk1JIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGxpbWl0IGZ1cnRoZXIgTk1JcyB0byBqdXN0IG9uZS4KKwkgKiBPdGhlcndpc2UsIGFsbG93IHR3byAoYW5kIHdlJ2xsIGluamVjdCB0aGUgZmlyc3Qgb25lIGltbWVkaWF0ZWx5KS4KKwkgKi8KKwlpZiAoa3ZtX3g4Nl9vcHMtPmdldF9ubWlfbWFzayh2Y3B1KSB8fCB2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCkKKwkJbGltaXQgPSAxOworCisJdmNwdS0+YXJjaC5ubWlfcGVuZGluZyArPSBhdG9taWNfeGNoZygmdmNwdS0+YXJjaC5ubWlfcXVldWVkLCAwKTsKKwl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gbWluKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcsIGxpbWl0KTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpOworfQorCiBzdGF0aWMgaW50IHZjcHVfZW50ZXJfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCByOwotCWJvb2wgbm1pX3BlbmRpbmc7CiAJYm9vbCByZXFfaW50X3dpbiA9ICFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pICYmCiAJCXZjcHUtPnJ1bi0+cmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93OwogCkBAIC01NTk2LDYgKzU2ODYsOCBAQAogCQl9CiAJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1NURUFMX1VQREFURSwgdmNwdSkpCiAJCQlyZWNvcmRfc3RlYWxfdGltZSh2Y3B1KTsKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfTk1JLCB2Y3B1KSkKKwkJCXByb2Nlc3Nfbm1pKHZjcHUpOwogCiAJfQogCkBAIC01NjAzLDE5ICs1Njk1LDExIEBACiAJaWYgKHVubGlrZWx5KHIpKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogQW4gTk1JIGNhbiBiZSBpbmplY3RlZCBiZXR3ZWVuIGxvY2FsIG5taV9wZW5kaW5nIHJlYWQgYW5kCi0JICogdmNwdS0+YXJjaC5ubWlfcGVuZGluZyByZWFkIGluc2lkZSBpbmplY3RfcGVuZGluZ19ldmVudCgpLgotCSAqIEJ1dCBpbiB0aGF0IGNhc2UsIEtWTV9SRVFfRVZFTlQgd2lsbCBiZSBzZXQsIHdoaWNoIG1ha2VzCi0JICogdGhlIHJhY2UgZGVzY3JpYmVkIGFib3ZlIGJlbmlnbi4KLQkgKi8KLQlubWlfcGVuZGluZyA9IEFDQ0VTU19PTkNFKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcpOwotCiAJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpIHx8IHJlcV9pbnRfd2luKSB7CiAJCWluamVjdF9wZW5kaW5nX2V2ZW50KHZjcHUpOwogCiAJCS8qIGVuYWJsZSBOTUkvSVJRIHdpbmRvdyBvcGVuIGV4aXRzIGlmIG5lZWRlZCAqLwotCQlpZiAobm1pX3BlbmRpbmcpCisJCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKQogCQkJa3ZtX3g4Nl9vcHMtPmVuYWJsZV9ubWlfd2luZG93KHZjcHUpOwogCQllbHNlIGlmIChrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkgfHwgcmVxX2ludF93aW4pCiAJCQlrdm1feDg2X29wcy0+ZW5hYmxlX2lycV93aW5kb3codmNwdSk7CkBAIC01Njc4LDcgKzU3NjIsNyBAQAogCWlmIChod19icmVha3BvaW50X2FjdGl2ZSgpKQogCQlod19icmVha3BvaW50X3Jlc3RvcmUoKTsKIAotCWt2bV9nZXRfbXNyKHZjcHUsIE1TUl9JQTMyX1RTQywgJnZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MpOworCXZjcHUtPmFyY2gubGFzdF9ndWVzdF90c2MgPSBrdm1feDg2X29wcy0+cmVhZF9sMV90c2ModmNwdSk7CiAKIAl2Y3B1LT5tb2RlID0gT1VUU0lERV9HVUVTVF9NT0RFOwogCXNtcF93bWIoKTsKQEAgLTYzMjMsNyArNjQwNyw4IEBACiAKIGludCBrdm1fYXJjaF92Y3B1X3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7CisJYXRvbWljX3NldCgmdmNwdS0+YXJjaC5ubWlfcXVldWVkLCAwKTsKKwl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gMDsKIAl2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCA9IGZhbHNlOwogCiAJdmNwdS0+YXJjaC5zd2l0Y2hfZGJfcmVncyA9IDA7CkBAIC02NTk4LDcgKzY2ODMsNyBAQAogCQkhdmNwdS0+YXJjaC5hcGYuaGFsdGVkKQogCQl8fCAhbGlzdF9lbXB0eV9jYXJlZnVsKCZ2Y3B1LT5hc3luY19wZi5kb25lKQogCQl8fCB2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVECi0JCXx8IHZjcHUtPmFyY2gubm1pX3BlbmRpbmcgfHwKKwkJfHwgYXRvbWljX3JlYWQoJnZjcHUtPmFyY2gubm1pX3F1ZXVlZCkgfHwKIAkJKGt2bV9hcmNoX2ludGVycnVwdF9hbGxvd2VkKHZjcHUpICYmCiAJCSBrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggMTNlZTI1OC4uY2Y0NjAzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbGd1ZXN0X2xhdW5jaGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2xndWVzdC5oPgogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgpAQCAtNzAsNiArNzEsNyBAQAogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrcHJvdGVjdG9yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgkJLyogZm9yIHN0cnVjdCBtYWNoaW5lX29wcyAqLworI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgogCiAvKkc6MDEwCiAgKiBXZWxjb21lIHRvIHRoZSBHdWVzdCEKQEAgLTQ1NSw2ICs0NTcsMTUgQEAKIAkJKmF4ICY9IDB4RkZGRkYwRkY7CiAJCSpheCB8PSAweDAwMDAwNTAwOwogCQlicmVhazsKKworCS8qCisJICogVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEtWTS4gIFdlIG1pZ2h0IGJlLAorCSAqIGJ1dCB0aGF0J3MgYSBIb3N0IG1hdHRlciwgbm90IHVzLiAgU28gc2F5IHdlJ3JlIG5vdC4KKwkgKi8KKwljYXNlIEtWTV9DUFVJRF9TSUdOQVRVUkU6CisJCSpieCA9ICpjeCA9ICpkeCA9IDA7CisJCWJyZWFrOworCiAJLyoKIAkgKiAweDgwMDAwMDAwIHJldHVybnMgdGhlIGhpZ2hlc3QgRXh0ZW5kZWQgRnVuY3Rpb24sIHNvIHdlIGZ1dHVyZXByb29mCiAJICogbGlrZSB3ZSBkbyBhYm92ZSBieSBsaW1pdGluZyBpdCB0byBrbm93biBmaWVsZHMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA5YzczNzhkLi41ZGIwNDkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4JCQkvKiBkb3RyYXBsaW5rYWdlLCAuLi4JCSovCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4JCS8qIHBnZF8qKCksIC4uLgkJCSovCiAjaW5jbHVkZSA8YXNtL2ttZW1jaGVjay5oPgkJLyoga21lbWNoZWNrXyooKSwgLi4uCQkqLwotI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4JCQkvKiBWU1lTQ0FMTF9TVEFSVAkJKi8KIAogLyoKICAqIFBhZ2UgZmF1bHQgZXJyb3IgY29kZSBiaXRzOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZ3VwLmMgYi9hcmNoL3g4Ni9tbS9ndXAuYwppbmRleCBkYmUzNGI5Li5lYTMwNTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9ndXAuYworKysgYi9hcmNoL3g4Ni9tbS9ndXAuYwpAQCAtMTA4LDE2ICsxMDgsNiBAQAogCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQotewotCS8qCi0JICogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQoKSBjYW5ub3QgcnVuCi0JICogZnJvbSB1bmRlciB1cy4KLQkgKi8KLQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPCAwKTsKLQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwotfQotCiBzdGF0aWMgbm9pbmxpbmUgaW50IGd1cF9odWdlX3BtZChwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJdW5zaWduZWQgbG9uZyBlbmQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50ICpucikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21tYXAuYyBiL2FyY2gveDg2L21tL21tYXAuYwppbmRleCAxZGFiNTE5Li40YjViYTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vbW1hcC5jCkBAIC0zMSw2ICszMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogCitzdHJ1Y3QgX19yZWFkX21vc3RseSB2YV9hbGlnbm1lbnQgdmFfYWxpZ24gPSB7CisJLmZsYWdzID0gLTEsCit9OworCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YWNrX21heHJhbmRvbV9zaXplKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IG1heCA9IDA7CkBAIC00Miw3ICs0Niw2IEBACiAJcmV0dXJuIG1heDsKIH0KIAotCiAvKgogICogVG9wIG9mIG1tYXAgYXJlYSAoanVzdCBiZWxvdyB0aGUgcHJvY2VzcyBzdGFjaykuCiAgKgpAQCAtNTEsMjEgKzU0LDYgQEAKICNkZWZpbmUgTUlOX0dBUCAoMTI4KjEwMjQqMTAyNFVMICsgc3RhY2tfbWF4cmFuZG9tX3NpemUoKSkKICNkZWZpbmUgTUFYX0dBUCAoVEFTS19TSVpFLzYqNSkKIAotLyoKLSAqIFRydWUgb24gWDg2XzMyIG9yIHdoZW4gZW11bGF0aW5nIElBMzIgb24gWDg2XzY0Ci0gKi8KLXN0YXRpYyBpbnQgbW1hcF9pc19pYTMyKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXJldHVybiAxOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpKQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG1tYXBfaXNfbGVnYWN5KHZvaWQpCiB7CiAJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9DT01QQVRfTEFZT1VUKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NlNDEwMC5jIGIvYXJjaC94ODYvcGNpL2NlNDEwMC5jCmluZGV4IDk5MTc2MDkuLjQxYmQyYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jZTQxMDAuYworKysgYi9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMKQEAgLTMwNCw3ICszMDQsNyBAQAogCXJldHVybiBwY2lfZGlyZWN0X2NvbmYxLndyaXRlKHNlZywgYnVzLCBkZXZmbiwgcmVnLCBsZW4sIHZhbHVlKTsKIH0KIAotc3RydWN0IHBjaV9yYXdfb3BzIGNlNDEwMF9wY2lfY29uZiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgY2U0MTAwX3BjaV9jb25mID0gewogCS5yZWFkID0JY2U0MTAwX2NvbmZfcmVhZCwKIAkud3JpdGUgPSBjZTQxMDBfY29uZl93cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggOTJkZjMyMi4uNzk2MmNjYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtMzMsOCArMzMsOCBAQAogaW50IHBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIHVuc2lnbmVkIGxvbmcgcGlycV90YWJsZV9hZGRyOwogc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1czsKLXN0cnVjdCBwY2lfcmF3X29wcyAqcmF3X3BjaV9vcHM7Ci1zdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfZXh0X29wczsKK2NvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyAqX19yZWFkX21vc3RseSByYXdfcGNpX29wczsKK2NvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyAqX19yZWFkX21vc3RseSByYXdfcGNpX2V4dF9vcHM7CiAKIGludCByYXdfcGNpX3JlYWQodW5zaWduZWQgaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuLAogCQkJCQkJaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMgYi9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMKaW5kZXggNGYyYzcwNC4uMTU0NjA1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2RpcmVjdC5jCisrKyBiL2FyY2gveDg2L3BjaS9kaXJlY3QuYwpAQCAtNzksNyArNzksNyBAQAogCiAjdW5kZWYgUENJX0NPTkYxX0FERFJFU1MKIAotc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjEgPSB7Citjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMSA9IHsKIAkucmVhZCA9CQlwY2lfY29uZjFfcmVhZCwKIAkud3JpdGUgPQlwY2lfY29uZjFfd3JpdGUsCiB9OwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKICN1bmRlZiBQQ0lfQ09ORjJfQUREUkVTUwogCi1zdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMiA9IHsKIAkucmVhZCA9CQlwY2lfY29uZjJfcmVhZCwKIAkud3JpdGUgPQlwY2lfY29uZjJfd3JpdGUsCiB9OwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgKiBUaGlzIHNob3VsZCBiZSBjbG9zZSB0byB0cml2aWFsLCBidXQgaXQgaXNuJ3QsIGJlY2F1c2UgdGhlcmUgYXJlIGJ1Z2d5CiAgKiBjaGlwc2V0cyAoeWVzLCB5b3UgZ3Vlc3NlZCBpdCwgYnkgSW50ZWwgYW5kIENvbXBhcSkgdGhhdCBoYXZlIG5vIGNsYXNzIElELgogICovCi1zdGF0aWMgaW50IF9faW5pdCBwY2lfc2FuaXR5X2NoZWNrKHN0cnVjdCBwY2lfcmF3X29wcyAqbykKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zYW5pdHlfY2hlY2soY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICpvKQogewogCXUzMiB4ID0gMDsKIAlpbnQgeWVhciwgZGV2Zm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jIGIvYXJjaC94ODYvcGNpL2kzODYuYwppbmRleCA0OTRmMmU3Li43OTRiMDkyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC94ODYvcGNpL2xlZ2FjeS5jCmluZGV4IGM4OTI2NmIuLjJjMmFlYWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9sZWdhY3kuYworKysgYi9hcmNoL3g4Ni9wY2kvbGVnYWN5LmMKQEAgLTIsNiArMiw3IEBACiAgKiBsZWdhY3kuYyAtIHRyYWRpdGlvbmFsLCBvbGQgc2Nob29sIFBDSSBidXMgcHJvYmluZwogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ18zMi5jIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKaW5kZXggYTNkOWM1NC4uNTM3MmU4NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKKysrIGIvYXJjaC94ODYvcGNpL21tY29uZmlnXzMyLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9tbWNmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX21tY2ZnID0gewogCS5yZWFkID0JCXBjaV9tbWNmZ19yZWFkLAogCS53cml0ZSA9CXBjaV9tbWNmZ193cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvbW1jb25maWdfNjQuYyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCmluZGV4IGU3ODM4NDEuLjkxNWE0OTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCisrKyBiL2FyY2gveDg2L3BjaS9tbWNvbmZpZ182NC5jCkBAIC04MSw3ICs4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX21tY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfbW1jZmcgPSB7CiAJLnJlYWQgPQkJcGNpX21tY2ZnX3JlYWQsCiAJLndyaXRlID0JcGNpX21tY2ZnX3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9udW1hcV8zMi5jIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKaW5kZXggNTEyYTg4Yy4uNTFhYmYwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKKysrIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCiAjdW5kZWYgUENJX0NPTkYxX01RX0FERFJFU1MKIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxX21xID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxX21xID0gewogCS5yZWFkCT0gcGNpX2NvbmYxX21xX3JlYWQsCiAJLndyaXRlCT0gcGNpX2NvbmYxX21xX3dyaXRlCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL29scGMuYyBiL2FyY2gveDg2L3BjaS9vbHBjLmMKaW5kZXggNTI2MjYwMy4uNzA0M2E0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL29scGMuYworKysgYi9hcmNoL3g4Ni9wY2kvb2xwYy5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfb2xwY19jb25mID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfb2xwY19jb25mID0gewogCS5yZWFkID0JcGNpX29scGNfcmVhZCwKIAkud3JpdGUgPSBwY2lfb2xwY193cml0ZSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKaW5kZXggZjY4NTUzNS4uZGIwZTlhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jCisrKyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAgKiBGdW5jdGlvbiB0YWJsZSBmb3IgQklPUzMyIGFjY2VzcwogICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2Jpb3NfYWNjZXNzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfYmlvc19hY2Nlc3MgPSB7CiAJLnJlYWQgPQkJcGNpX2Jpb3NfcmVhZCwKIAkud3JpdGUgPQlwY2lfYmlvc193cml0ZQogfTsKQEAgLTMxMiw3ICszMTIsNyBAQAogICogVHJ5IHRvIGZpbmQgUENJIEJJT1MuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyAqIF9fZGV2aW5pdCBwY2lfZmluZF9iaW9zKHZvaWQpCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9yYXdfb3BzICogX19kZXZpbml0IHBjaV9maW5kX2Jpb3Modm9pZCkKIHsKIAl1bmlvbiBiaW9zMzIgKmNoZWNrOwogCXVuc2lnbmVkIGNoYXIgc3VtOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQppbmRleCAwMjFlZWU5Li44ZDg3NDM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKICMgUGxhdGZvcm0gc3BlY2lmaWMgY29kZSBnb2VzIGhlcmUKIG9iai15CSs9IGNlNDEwMC8KIG9iai15CSs9IGVmaS8KK29iai15CSs9IGdlb2RlLwogb2JqLXkJKz0gaXJpcy8KIG9iai15CSs9IG1yc3QvCiBvYmoteQkrPSBvbHBjLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vY2U0MTAwL2NlNDEwMC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vY2U0MTAwL2NlNDEwMC5jCmluZGV4IDI4MDcxYmIuLjRjNjFiNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2NlNDEwMC9jZTQxMDAuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9jZTQxMDAvY2U0MTAwLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNkdl9zZXJpYWxfZml4dXAodm9pZCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2R2X3NlcmlhbF9maXh1cCh2b2lkKSB7fTsKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2R2X2FyY2hfc2V0dXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAzYWU0MTI4Li4zNzcxOGYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKaW5kZXggNWNhYjQ4ZS4uZTM2YmY3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2dlb2RlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzljZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQUxJWCkJCSs9IGFsaXgubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZ2VvZGUvYWxpeC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZ2VvZGUvYWxpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTk3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9nZW9kZS9hbGl4LmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBTeXN0ZW0gU3BlY2lmaWMgc2V0dXAgZm9yIFBDRW5naW5lcyBBTElYLgorICogQXQgdGhlIG1vbWVudCB0aGlzIG1lYW5zIHNldHVwIG9mIEdQSU8gY29udHJvbCBvZiBMRURzCisgKiBvbiBBbGl4LjIvMy82IGJvYXJkcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbnN0YW50aW4gQmFyYW5vdiA8Y29uc3RAbWltYXMucnU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRWQgV2lsZGdvb3NlIDxrZXJuZWxAd2lsZGdvb3Nlcy5jb20+CisgKgorICogVE9ETzogVGhlcmUgYXJlIGxhcmdlIHNpbWlsYXJpdGllcyB3aXRoIGxlZHMtbmV0NTUwMS5jCisgKiBieSBBbGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4KKyAqIEluIHRoZSBmdXR1cmUgbGVkcy1uZXQ1NTAxLmMgc2hvdWxkIGJlIG1pZ3JhdGVkIG92ZXIgdG8gcGxhdGZvcm0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CisKK3N0YXRpYyBpbnQgZm9yY2UgPSAwOworbW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwNDQ0KTsKKy8qIEZJWE1FOiBBd2FyZCBiaW9zIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGFzIEFsaXggcGxhdGZvcm0gKi8KK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBkZXRlY3Rpb24gYXMgQUxJWC4yL0FMSVguMyBwbGF0Zm9ybSIpOworCitzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGFsaXhfbGVkc1tdID0geworCXsKKwkJLm5hbWUgPSAiYWxpeDoxIiwKKwkJLmdwaW8gPSA2LAorCQkuZGVmYXVsdF90cmlnZ2VyID0gImRlZmF1bHQtb24iLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gImFsaXg6MiIsCisJCS5ncGlvID0gMjUsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vZmYiLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gImFsaXg6MyIsCisJCS5ncGlvID0gMjcsCisJCS5kZWZhdWx0X3RyaWdnZXIgPSAiZGVmYXVsdC1vZmYiLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBhbGl4X2xlZHNfZGF0YSA9IHsKKwkubnVtX2xlZHMgPSBBUlJBWV9TSVpFKGFsaXhfbGVkcyksCisJLmxlZHMgPSBhbGl4X2xlZHMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhbGl4X2xlZHNfZGV2ID0geworCS5uYW1lID0gImxlZHMtZ3BpbyIsCisJLmlkID0gLTEsCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmFsaXhfbGVkc19kYXRhLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHJlZ2lzdGVyX2FsaXgodm9pZCkKK3sKKwkvKiBTZXR1cCBMRUQgY29udHJvbCB0aHJvdWdoIGxlZHMtZ3BpbyBkcml2ZXIgKi8KKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmFsaXhfbGVkc19kZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbGl4X3ByZXNlbnQodW5zaWduZWQgbG9uZyBiaW9zX3BoeXMsCisJCQkJY29uc3QgY2hhciAqYWxpeF9zaWcsCisJCQkJc2l6ZV90IGFsaXhfc2lnX2xlbikKK3sKKwljb25zdCBzaXplX3QgYmlvc19sZW4gPSAweDAwMDEwMDAwOworCWNvbnN0IGNoYXIgKmJpb3NfdmlydDsKKwljb25zdCBjaGFyICpzY2FuX2VuZDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgbmFtZVs2NF07CisKKwlpZiAoZm9yY2UpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZm9yY2VkIHRvIHNraXAgQklPUyB0ZXN0LCAiCisJCSAgICAgICAiYXNzdW1lIHN5c3RlbSBpcyBBTElYLjIvQUxJWC4zXG4iLAorCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOworCQlyZXR1cm4gMTsKKwl9CisKKwliaW9zX3ZpcnQgPSBwaHlzX3RvX3ZpcnQoYmlvc19waHlzKTsKKwlzY2FuX2VuZCA9IGJpb3NfdmlydCArIGJpb3NfbGVuIC0gKGFsaXhfc2lnX2xlbiArIDIpOworCWZvciAocCA9IGJpb3NfdmlydDsgcCA8IHNjYW5fZW5kOyBwKyspIHsKKwkJY29uc3QgY2hhciAqdGFpbDsKKwkJY2hhciAqYTsKKworCQlpZiAobWVtY21wKHAsIGFsaXhfc2lnLCBhbGl4X3NpZ19sZW4pICE9IDApCisJCQljb250aW51ZTsKKworCQltZW1jcHkobmFtZSwgcCwgc2l6ZW9mKG5hbWUpKTsKKworCQkvKiByZW1vdmUgdGhlIGZpcnN0IFwwIGNoYXJhY3RlciBmcm9tIHN0cmluZyAqLworCQlhID0gc3RyY2hyKG5hbWUsICdcMCcpOworCQlpZiAoYSkKKwkJCSphID0gJyAnOworCisJCS8qIGN1dCB0aGUgc3RyaW5nIGF0IGEgbmV3bGluZSAqLworCQlhID0gc3RyY2hyKG5hbWUsICdccicpOworCQlpZiAoYSkKKwkJCSphID0gJ1wwJzsKKworCQl0YWlsID0gcCArIGFsaXhfc2lnX2xlbjsKKwkJaWYgKCh0YWlsWzBdID09ICcyJyB8fCB0YWlsWzBdID09ICczJykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHN5c3RlbSBpcyByZWNvZ25pemVkIGFzIFwiJXNcIlxuIiwKKwkJCSAgICAgICBLQlVJTERfTU9ETkFNRSwgbmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhbGl4X2luaXQodm9pZCkKK3sKKwljb25zdCBjaGFyIHRpbnliaW9zX3NpZ1tdID0gIlBDIEVuZ2luZXMgQUxJWC4iOworCWNvbnN0IGNoYXIgY29yZWJvb3Rfc2lnW10gPSAiUEMgRW5naW5lc1wwQUxJWC4iOworCisJaWYgKCFpc19nZW9kZSgpKQorCQlyZXR1cm4gMDsKKworCWlmIChhbGl4X3ByZXNlbnQoMHhmMDAwMCwgdGlueWJpb3Nfc2lnLCBzaXplb2YodGlueWJpb3Nfc2lnKSAtIDEpIHx8CisJICAgIGFsaXhfcHJlc2VudCgweDUwMCwgY29yZWJvb3Rfc2lnLCBzaXplb2YoY29yZWJvb3Rfc2lnKSAtIDEpKQorCQlyZWdpc3Rlcl9hbGl4KCk7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoYWxpeF9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiRWQgV2lsZGdvb3NlIDxrZXJuZWxAd2lsZGdvb3Nlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRW5naW5lcyBBTElYIFN5c3RlbSBTZXR1cCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9tcnN0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYwppbmRleCBlNjM3OTUyLi41NDEwMjBkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2ludGVsX21zaWMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWNfZGVmLmg+CkBAIC00ODMsNyArNDg1LDEzMCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UsCisJCS5lbmQJPSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UgKyA2NCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSBtc2ljX3BkYXRhOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc2ljX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaW50ZWxfbXNpYyIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtc2ljX3BkYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG1zaWNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtc2ljX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtcnN0X2hhc19tc2ljKHZvaWQpCit7CisJcmV0dXJuIG1yc3RfaWRlbnRpZnlfY3B1KCkgPT0gTVJTVF9DUFVfQ0hJUF9QRU5XRUxMOworfQorCitzdGF0aWMgaW50IG1zaWNfc2N1X3N0YXR1c19jaGFuZ2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoY29kZSA9PSBTQ1VfRE9XTikgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmbXNpY19kZXZpY2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtc2ljX2RldmljZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1zaWNfaW5pdCh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbXNpY19zY3Vfbm90aWZpZXIgPSB7CisJCS5ub3RpZmllcl9jYWxsCT0gbXNpY19zY3Vfc3RhdHVzX2NoYW5nZSwKKwl9OworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgU0NVIElQQyBpcyByZWFkeSBiZWZvcmUgTVNJQyBkZXZpY2UKKwkgKiBjYW4gYmUgcmVnaXN0ZXJlZC4KKwkgKi8KKwlpZiAobXJzdF9oYXNfbXNpYygpKQorCQlpbnRlbF9zY3Vfbm90aWZpZXJfYWRkKCZtc2ljX3NjdV9ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXNpY19pbml0KTsKKworLyoKKyAqIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhIC0gc2V0cyBnZW5lcmljIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBibG9jaworICogQGluZm86IHBvaW50ZXIgdG8gdGhlIFNGSSBkZXZpY2UgdGFibGUgZW50cnkgZm9yIHRoaXMgYmxvY2sKKyAqIEBibG9jazogTVNJQyBibG9jaworICoKKyAqIEZ1bmN0aW9uIHNldHMgSVJRIG51bWJlciBmcm9tIHRoZSBTRkkgdGFibGUgZW50cnkgZm9yIGdpdmVuIGRldmljZSB0bworICogdGhlIE1TSUMgcGxhdGZvcm0gZGF0YS4KKyAqLworc3RhdGljIHZvaWQgKm1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8sIGVudW0gaW50ZWxfbXNpY19ibG9jayBibG9jaykKK3sKKwlzdHJ1Y3Qgc2ZpX2RldmljZV90YWJsZV9lbnRyeSAqZW50cnkgPSBpbmZvOworCisJQlVHX09OKGJsb2NrIDwgMCB8fCBibG9jayA+PSBJTlRFTF9NU0lDX0JMT0NLX0xBU1QpOworCW1zaWNfcGRhdGEuaXJxW2Jsb2NrXSA9IGVudHJ5LT5pcnE7CisKKwlyZXR1cm4gbm9fcGxhdGZvcm1fZGF0YShpbmZvKTsKK30KKworc3RhdGljIHZvaWQgKm1zaWNfYmF0dGVyeV9wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJcmV0dXJuIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKGluZm8sIElOVEVMX01TSUNfQkxPQ0tfQkFUVEVSWSk7Cit9CisKK3N0YXRpYyB2b2lkICptc2ljX2dwaW9fcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvKQoreworCXN0YXRpYyBzdHJ1Y3QgaW50ZWxfbXNpY19ncGlvX3BkYXRhIHBkYXRhOworCWludCBncGlvID0gZ2V0X2dwaW9fYnlfbmFtZSgibXNpY19ncGlvX2Jhc2UiKTsKKworCWlmIChncGlvIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwZGF0YS5ncGlvX2Jhc2UgPSBncGlvOworCW1zaWNfcGRhdGEuZ3BpbyA9ICZwZGF0YTsKKworCXJldHVybiBtc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YShpbmZvLCBJTlRFTF9NU0lDX0JMT0NLX0dQSU8pOworfQorCitzdGF0aWMgdm9pZCAqbXNpY19hdWRpb19wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzc3QtcGxhdGZvcm0iLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgYXVkaW8gcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG1zaWNfZ2VuZXJpY19wbGF0Zm9ybV9kYXRhKGluZm8sIElOVEVMX01TSUNfQkxPQ0tfQVVESU8pOworfQorCitzdGF0aWMgdm9pZCAqbXNpY19wb3dlcl9idG5fcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvKQoreworCXJldHVybiBtc2ljX2dlbmVyaWNfcGxhdGZvcm1fZGF0YShpbmZvLCBJTlRFTF9NU0lDX0JMT0NLX1BPV0VSX0JUTik7Cit9CisKK3N0YXRpYyB2b2lkICptc2ljX29jZF9wbGF0Zm9ybV9kYXRhKHZvaWQgKmluZm8pCit7CisJc3RhdGljIHN0cnVjdCBpbnRlbF9tc2ljX29jZF9wZGF0YSBwZGF0YTsKKwlpbnQgZ3BpbyA9IGdldF9ncGlvX2J5X25hbWUoIm9jZF9ncGlvIik7CisKKwlpZiAoZ3BpbyA8IDApCisJCXJldHVybiBOVUxMOworCisJcGRhdGEuZ3BpbyA9IGdwaW87CisJbXNpY19wZGF0YS5vY2QgPSAmcGRhdGE7CisKKwlyZXR1cm4gbXNpY19nZW5lcmljX3BsYXRmb3JtX2RhdGEoaW5mbywgSU5URUxfTVNJQ19CTE9DS19PQ0QpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldnNfaWQgX19pbml0Y29uc3QgZGV2aWNlX2lkc1tdID0geworCXsiYm1hMDIzIiwgU0ZJX0RFVl9UWVBFX0kyQywgMSwgJm5vX3BsYXRmb3JtX2RhdGF9LAogCXsicG1pY19ncGlvIiwgU0ZJX0RFVl9UWVBFX1NQSSwgMSwgJnBtaWNfZ3Bpb19wbGF0Zm9ybV9kYXRhfSwKIAl7InNwaV9tYXgzMTExIiwgU0ZJX0RFVl9UWVBFX1NQSSwgMCwgJm1heDMxMTFfcGxhdGZvcm1fZGF0YX0sCiAJeyJpMmNfbWF4NzMxNSIsIFNGSV9ERVZfVFlQRV9JMkMsIDEsICZtYXg3MzE1X3BsYXRmb3JtX2RhdGF9LApAQCAtNDkxLDcgKzYxNiwxNCBAQAogCXsiZW1jMTQwMyIsIFNGSV9ERVZfVFlQRV9JMkMsIDEsICZlbWMxNDAzX3BsYXRmb3JtX2RhdGF9LAogCXsiaTJjX2FjY2VsIiwgU0ZJX0RFVl9UWVBFX0kyQywgMCwgJmxpczMzMWRsX3BsYXRmb3JtX2RhdGF9LAogCXsicG1pY19hdWRpbyIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZub19wbGF0Zm9ybV9kYXRhfSwKLQl7Im1zaWNfYXVkaW8iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbm9fcGxhdGZvcm1fZGF0YX0sCisKKwkvKiBNU0lDIHN1YmRldmljZXMgKi8KKwl7Im1zaWNfYmF0dGVyeSIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX2JhdHRlcnlfcGxhdGZvcm1fZGF0YX0sCisJeyJtc2ljX2dwaW8iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbXNpY19ncGlvX3BsYXRmb3JtX2RhdGF9LAorCXsibXNpY19hdWRpbyIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX2F1ZGlvX3BsYXRmb3JtX2RhdGF9LAorCXsibXNpY19wb3dlcl9idG4iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbXNpY19wb3dlcl9idG5fcGxhdGZvcm1fZGF0YX0sCisJeyJtc2ljX29jZCIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX29jZF9wbGF0Zm9ybV9kYXRhfSwKKwogCXt9LAogfTsKIApAQCAtNTU4LDYgKzY5MCw5IEBACiAJaTJjX2RldnNbaTJjX25leHRfZGV2KytdID0gbmV3X2RldjsKIH0KIAorQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChpbnRlbF9zY3Vfbm90aWZpZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfc2N1X25vdGlmaWVyKTsKKwogLyogQ2FsbGVkIGJ5IElQQyBkcml2ZXIgKi8KIHZvaWQgaW50ZWxfc2N1X2RldmljZXNfY3JlYXRlKHZvaWQpCiB7CkBAIC01ODIsNiArNzE3LDcgQEAKIAkJfSBlbHNlCiAJCQlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbyhpMmNfYnVzW2ldLCBpMmNfZGV2c1tpXSwgMSk7CiAJfQorCWludGVsX3NjdV9ub3RpZmllcl9wb3N0KFNDVV9BVkFJTEFCTEUsIDBMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGludGVsX3NjdV9kZXZpY2VzX2NyZWF0ZSk7CiAKQEAgLTU5MCw2ICs3MjYsOCBAQAogewogCWludCBpOwogCisJaW50ZWxfc2N1X25vdGlmaWVyX3Bvc3QoU0NVX0RPV04sIDBMKTsKKwogCWZvciAoaSA9IDA7IGkgPCBpcGNfbmV4dF9kZXY7IGkrKykKIAkJcGxhdGZvcm1fZGV2aWNlX2RlbChpcGNfZGV2c1tpXSk7CiB9CkBAIC02MDYsMTkgKzc0NCwzNyBAQAogCXBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2ZpX2hhbmRsZV9pcGNfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBfX2luaXQgc2ZpX2hhbmRsZV9pcGNfZGV2KHN0cnVjdCBzZmlfZGV2aWNlX3RhYmxlX2VudHJ5ICplbnRyeSkKIHsKIAljb25zdCBzdHJ1Y3QgZGV2c19pZCAqZGV2ID0gZGV2aWNlX2lkczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXZvaWQgKnBkYXRhID0gTlVMTDsKIAogCXdoaWxlIChkZXYtPm5hbWVbMF0pIHsKIAkJaWYgKGRldi0+dHlwZSA9PSBTRklfREVWX1RZUEVfSVBDICYmCi0JCQkhc3RybmNtcChkZXYtPm5hbWUsIHBkZXYtPm5hbWUsIFNGSV9OQU1FX0xFTikpIHsKLQkJCXBkYXRhID0gZGV2LT5nZXRfcGxhdGZvcm1fZGF0YShwZGV2KTsKKwkJCSFzdHJuY21wKGRldi0+bmFtZSwgZW50cnktPm5hbWUsIFNGSV9OQU1FX0xFTikpIHsKKwkJCXBkYXRhID0gZGV2LT5nZXRfcGxhdGZvcm1fZGF0YShlbnRyeSk7CiAJCQlicmVhazsKIAkJfQogCQlkZXYrKzsKIAl9CisKKwkvKgorCSAqIE9uIE1lZGZpZWxkIHRoZSBwbGF0Zm9ybSBkZXZpY2UgY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgTVNJQworCSAqIE1GRCBkcml2ZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBpdCBoZXJlLgorCSAqLworCWlmIChtcnN0X2hhc19tc2ljKCkpCisJCXJldHVybjsKKworCS8qIElEIGFzIElSUSBpcyBhIGhhY2sgdGhhdCB3aWxsIGdvIGF3YXkgKi8KKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGVudHJ5LT5uYW1lLCBlbnRyeS0+aXJxKTsKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCXByX2Vycigib3V0IG9mIG1lbW9yeSBmb3IgU0ZJIHBsYXRmb3JtIGRldmljZSAnJXMnLlxuIiwKKwkJCWVudHJ5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpbnN0YWxsX2lycV9yZXNvdXJjZShwZGV2LCBlbnRyeS0+aXJxKTsKKwogCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAJaW50ZWxfc2N1X2RldmljZV9yZWdpc3RlcihwZGV2KTsKIH0KQEAgLTY3MSw3ICs4MjcsNiBAQAogCXN0cnVjdCBzZmlfZGV2aWNlX3RhYmxlX2VudHJ5ICpwZW50cnk7CiAJc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9pbmZvOwogCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfaW5mbzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCWludCBudW0sIGksIGJ1czsKIAlpbnQgaW9hcGljOwogCXN0cnVjdCBpb19hcGljX2lycV9hdHRyIGlycV9hdHRyOwpAQCAtNjk5LDE3ICs4NTQsOSBAQAogCiAJCXN3aXRjaCAocGVudHJ5LT50eXBlKSB7CiAJCWNhc2UgU0ZJX0RFVl9UWVBFX0lQQzoKLQkJCS8qIElEIGFzIElSUSBpcyBhIGhhY2sgdGhhdCB3aWxsIGdvIGF3YXkgKi8KLQkJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MocGVudHJ5LT5uYW1lLCBpcnEpOwotCQkJaWYgKHBkZXYgPT0gTlVMTCkgewotCQkJCXByX2Vycigib3V0IG9mIG1lbW9yeSBmb3IgU0ZJIHBsYXRmb3JtIGRldmljZSAnJXMnLlxuIiwKLQkJCQkJCQlwZW50cnktPm5hbWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW5zdGFsbF9pcnFfcmVzb3VyY2UocGRldiwgaXJxKTsKIAkJCXByX2RlYnVnKCJpbmZvWyUyZF06IElQQyBidXMsIG5hbWUgPSAlMTYuMTZzLCAiCi0JCQkJImlycSA9IDB4JTJ4XG4iLCBpLCBwZW50cnktPm5hbWUsIGlycSk7Ci0JCQlzZmlfaGFuZGxlX2lwY19kZXYocGRldik7CisJCQkJImlycSA9IDB4JTJ4XG4iLCBpLCBwZW50cnktPm5hbWUsIHBlbnRyeS0+aXJxKTsKKwkJCXNmaV9oYW5kbGVfaXBjX2RldihwZW50cnkpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0ZJX0RFVl9UWVBFX1NQSToKIAkJCW1lbXNldCgmc3BpX2luZm8sIDAsIHNpemVvZihzcGlfaW5mbykpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKaW5kZXggOTI4MWRhNy4uYzBhYzA2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5jCkBAIC03MCw3ICs3MCw3IEBACiAvKiAyNCAqLyB7IDB4NDExMCwgMCB9LAkJCS8qIExpbmNyb2Z0ICovCiB9OwogCi0vKiBuLmIuIFdlIGlnbm9yZSBQQ0ktaWQgMHg4MTUgaW4gTFNTOSBiL2MgTWVlR28gaGFzIG5vIGRyaXZlciBmb3IgaXQgKi8KKy8qIG4uYi4gV2UgaWdub3JlIFBDSS1pZCAweDgxNSBpbiBMU1M5IGIvYyBMaW51eCBoYXMgbm8gZHJpdmVyIGZvciBpdCAqLwogc3RhdGljIHUxNiBtcnN0X2xzczlfcGNpX2lkc1tdID0gezB4MDgwYSwgMHgwODE0LCAwfTsKIHN0YXRpYyB1MTYgbXJzdF9sc3MxMF9wY2lfaWRzW10gPSB7MHgwODAwLCAweDA4MDEsIDB4MDgwMiwgMHgwODAzLAogCQkJCQkweDA4MDQsIDB4MDgwNSwgMHgwODBmLCAwfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvdnJ0Yy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKaW5kZXggNmQ1ZGJjZC4uMjI1YmQwZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC92cnRjLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNzUsOCArNzYsOCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAotCS8qIHZSVEMgWUVBUiByZWcgY29udGFpbnMgdGhlIG9mZnNldCB0byAxOTYwICovCi0JeWVhciArPSAxOTYwOworCS8qIHZSVEMgWUVBUiByZWcgY29udGFpbnMgdGhlIG9mZnNldCB0byAxOTcyICovCisJeWVhciArPSAxOTcyOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAidlJUQzogc2VjOiAlZCBtaW46ICVkIGhvdXI6ICVkIGRheTogJWQgIgogCQkibW9uOiAlZCB5ZWFyOiAlZFxuIiwgc2VjLCBtaW4sIGhvdXIsIG1kYXksIG1vbiwgeWVhcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMKaW5kZXggNmYzODU1YS4uMGNlODYxNmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy14bzEtcG0uYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXBtLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NzNTUzNS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMKaW5kZXggOGJjNTdiYS4uNzY2NjEyMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvYmlvc191di5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vdXYvYmlvcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYwppbmRleCBkYjhiOTE1Li41YjU1MjE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS91di90bGJfdXYuYwpAQCAtMTE1LDkgKzExNSw2IEBACiAKIC8qIGJhc2UgcG5vZGUgaW4gdGhpcyBwYXJ0aXRpb24gKi8KIHN0YXRpYyBpbnQgdXZfYmFzZV9wbm9kZSBfX3JlYWRfbW9zdGx5OwotLyogcG9zaXRpb24gb2YgcG5vZGUgKHdoaWNoIGlzIG5hc2lkPj4xKTogKi8KLXN0YXRpYyBpbnQgdXZfbnNoaWZ0IF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB1dl9tbWFzayBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHB0Y19zdGF0cywgcHRjc3RhdHMpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBiYXVfY29udHJvbCwgYmF1X2NvbnRyb2wpOwpAQCAtMTQzNSw3ICsxNDMyLDcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgcGE7CisJdW5zaWduZWQgbG9uZyBncGE7CiAJdW5zaWduZWQgbG9uZyBtOwogCXVuc2lnbmVkIGxvbmcgbjsKIAlzaXplX3QgZHNpemU7CkBAIC0xNDUxLDkgKzE0NDgsOSBAQAogCWJhdV9kZXNjID0ga21hbGxvY19ub2RlKGRzaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKIAlCVUdfT04oIWJhdV9kZXNjKTsKIAotCXBhID0gdXZfZ3BhKGJhdV9kZXNjKTsgLyogbmVlZCB0aGUgcmVhbCBuYXNpZCovCi0JbiA9IHBhID4+IHV2X25zaGlmdDsKLQltID0gcGEgJiB1dl9tbWFzazsKKwlncGEgPSB1dl9ncGEoYmF1X2Rlc2MpOworCW4gPSB1dl9ncGFfdG9fZ25vZGUoZ3BhKTsKKwltID0gdXZfZ3BhX3RvX29mZnNldChncGEpOwogCiAJLyogdGhlIDE0LWJpdCBwbm9kZSAqLwogCXdyaXRlX21tcl9kZXNjcmlwdG9yX2Jhc2UocG5vZGUsIChuIDw8IFVWX0RFU0NfUFNISUZUIHwgbSkpOwpAQCAtMTUyNSw5ICsxNTIyLDkgQEAKIAkJYmNwLT5xdWV1ZV9sYXN0CQk9IHBxcCArIChERVNUX1FfU0laRSAtIDEpOwogCX0KIAkvKgotCSAqIG5lZWQgdGhlIHBub2RlIG9mIHdoZXJlIHRoZSBtZW1vcnkgd2FzIHJlYWxseSBhbGxvY2F0ZWQKKwkgKiBuZWVkIHRoZSBnbm9kZSBvZiB3aGVyZSB0aGUgbWVtb3J5IHdhcyByZWFsbHkgYWxsb2NhdGVkCiAJICovCi0JcG4gPSB1dl9ncGEocHFwKSA+PiB1dl9uc2hpZnQ7CisJcG4gPSB1dl9ncGFfdG9fZ25vZGUodXZfZ3BhKHBxcCkpOwogCWZpcnN0ID0gdXZfcGh5c25vZGVhZGRyKHBxcCk7CiAJcG5fZmlyc3QgPSAoKHVuc2lnbmVkIGxvbmcpcG4gPDwgVVZfUEFZTE9BRFFfUE5PREVfU0hJRlQpIHwgZmlyc3Q7CiAJbGFzdCA9IHV2X3BoeXNub2RlYWRkcihwcXAgKyAoREVTVF9RX1NJWkUgLSAxKSk7CkBAIC0xODM3LDggKzE4MzQsNiBAQAogCQl6YWxsb2NfY3B1bWFza192YXJfbm9kZShtYXNrLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjdXJfY3B1KSk7CiAJfQogCi0JdXZfbnNoaWZ0ID0gdXZfaHViX2luZm8tPm1fdmFsOwotCXV2X21tYXNrID0gKDFVTCA8PCB1dl9odWJfaW5mby0+bV92YWwpIC0gMTsKIAludXZodWJzID0gdXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpOwogCXNwaW5fbG9ja19pbml0KCZkaXNhYmxlX2xvY2spOwogCWNvbmdlc3RlZF9jeWNsZXMgPSB1c2VjXzJfY3ljbGVzKGNvbmdlc3RlZF9yZXNwbnNfdXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcG93ZXIvY3B1LmMgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwppbmRleCA4N2JiMzVlLi5mMTBjMGFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL0tjb25maWcgYi9hcmNoL3g4Ni91bS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTdiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9LY29uZmlnCkBAIC0wLDAgKzEsNjcgQEAKK21haW5tZW51ICJVc2VyIE1vZGUgTGludXgvJFNVQkFSQ0ggJEtFUk5FTFZFUlNJT04gS2VybmVsIENvbmZpZ3VyYXRpb24iCisKK3NvdXJjZSAiYXJjaC91bS9LY29uZmlnLmNvbW1vbiIKKworbWVudSAiVU1MLXNwZWNpZmljIG9wdGlvbnMiCisKK21lbnUgIkhvc3QgcHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgorCitjb25maWcgQ01QWENIR19MT0NBTAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIENNUFhDSEdfRE9VQkxFCisJYm9vbAorCWRlZmF1bHQgbgorCitzb3VyY2UgImFyY2gveDg2L0tjb25maWcuY3B1IgorCitlbmRtZW51CisKK2NvbmZpZyBVTUxfWDg2CisJZGVmX2Jvb2wgeQorCXNlbGVjdCBHRU5FUklDX0ZJTkRfRklSU1RfQklUCisKK2NvbmZpZyA2NEJJVAorCWJvb2wKKwlkZWZhdWx0IFNVQkFSQ0ggPSAieDg2XzY0IgorCitjb25maWcgWDg2XzMyCisJZGVmX2Jvb2wgITY0QklUCisJc2VsZWN0IEhBVkVfQU9VVAorCitjb25maWcgWDg2XzY0CisJZGVmX2Jvb2wgNjRCSVQKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJZGVmX2Jvb2wgWDg2X1hBREQgJiYgNjRCSVQKKworY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKKwlkZWZfYm9vbCAhUldTRU1fWENIR0FERF9BTEdPUklUSE0KKworY29uZmlnIDNfTEVWRUxfUEdUQUJMRVMKKwlib29sICJUaHJlZS1sZXZlbCBwYWdldGFibGVzIChFWFBFUklNRU5UQUwpIiBpZiAhNjRCSVQKKwlkZWZhdWx0IDY0QklUCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJVGhyZWUtbGV2ZWwgcGFnZXRhYmxlcyB3aWxsIGxldCBVTUwgaGF2ZSBtb3JlIHRoYW4gNEcgb2YgcGh5c2ljYWwKKwltZW1vcnkuICBBbGwgdGhlIG1lbW9yeSB0aGF0IGNhbid0IGJlIG1hcHBlZCBkaXJlY3RseSB3aWxsIGJlIHRyZWF0ZWQKKwlhcyBoaWdoIG1lbW9yeS4KKworCUhvd2V2ZXIsIHRoaXMgaXQgZXhwZXJpbWVudGFsIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBzbyBpZiB1bnN1cmUgc2F5CisJTiAob24geDg2LTY0IGl0J3MgYXV0b21hdGljYWxseSBlbmFibGVkLCBpbnN0ZWFkLCBhcyBpdCdzIHNhZmUgdGhlcmUpLgorCitjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUworCWRlZl9ib29sICE2NEJJVAorCitjb25maWcgQVJDSF9SRVVTRV9IT1NUX1ZTWVNDQUxMX0FSRUEKKwlkZWZfYm9vbCAhNjRCSVQKKworY29uZmlnIEdFTkVSSUNfSFdFSUdIVAorCWRlZl9ib29sIHkKKworc291cmNlICJhcmNoL3VtL0tjb25maWcudW0iCisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL3VtL0tjb25maWcucmVzdCIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL01ha2VmaWxlIGIvYXJjaC94ODYvdW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiNTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisjCisKK2lmZXEgKCQoQ09ORklHX1g4Nl8zMikseSkKKwlCSVRTIDo9IDMyCitlbHNlCisJQklUUyA6PSA2NAorZW5kaWYKKworb2JqLXkgPSBidWcubyBidWdzXyQoQklUUykubyBkZWxheS5vIGZhdWx0Lm8ga3N5bXMubyBsZHQubyBcCisJcHRyYWNlXyQoQklUUykubyBwdHJhY2VfdXNlci5vIHNldGptcF8kKEJJVFMpLm8gc2lnbmFsLm8gXAorCXN0dWJfJChCSVRTKS5vIHN0dWJfc2Vndi5vIHN5c2NhbGxzXyQoQklUUykubyBcCisJc3lzX2NhbGxfdGFibGVfJChCSVRTKS5vIHN5c3JxXyQoQklUUykubyB0bHNfJChCSVRTKS5vIFwKKwltZW1fJChCSVRTKS5vIHN1YmFyY2gubyBvcy0kKE9TKS8KKworaWZlcSAoJChDT05GSUdfWDg2XzMyKSx5KQorCitvYmoteSArPSBjaGVja3N1bV8zMi5vCitvYmotJChDT05GSUdfQklORk1UX0VMRikgKz0gZWxmY29yZS5vCisKK3N1YmFyY2gteSA9IC4uL2xpYi9zdHJpbmdfMzIubyAuLi9saWIvYXRvbWljNjRfMzIubyAuLi9saWIvYXRvbWljNjRfY3g4XzMyLm8KK3N1YmFyY2gtJChDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0pICs9IC4uL2xpYi9yd3NlbS5vCitzdWJhcmNoLSQoQ09ORklHX0hJR0hNRU0pICs9IC4uL21tL2hpZ2htZW1fMzIubworCitlbHNlCisKK29iai15ICs9IHZkc28vCisKK3N1YmFyY2gteSA9IC4uL2xpYi9jc3VtLXBhcnRpYWxfNjQubyAuLi9saWIvbWVtY3B5XzY0Lm8gLi4vbGliL3RodW5rXzY0Lm8gXAorCQkuLi9saWIvcndzZW0ubworCitlbmRpZgorCitzdWJhcmNoLSQoQ09ORklHX01PRFVMRVMpICs9IC4uL2tlcm5lbC9tb2R1bGUubworCitVU0VSX09CSlMgOj0gYnVnc18kKEJJVFMpLm8gcHRyYWNlX3VzZXIubyBmYXVsdC5vCisKK2V4dHJhLXkgKz0gdXNlci1vZmZzZXRzLnMKKyQob2JqKS91c2VyLW9mZnNldHMuczogY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKFVTRVJfQ0ZMQUdTKQorCitVTlBST0ZJTEVfT0JKUyA6PSBzdHViX3NlZ3YubworQ0ZMQUdTX3N0dWJfc2Vndi5vIDo9ICQoQ0ZMQUdTX05PX0hBUkRFTklORykKKworaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vYXBpYy5oIGIvYXJjaC94ODYvdW0vYXNtL2FwaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9hcGljLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9hcGljLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmggYi9hcmNoL3g4Ni91bS9hc20vYXJjaF9od2VpZ2h0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vYXJjaF9od2VpZ2h0LmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9hcmNoX2h3ZWlnaHQuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC94ODYvdW0vYXNtL2FyY2hwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2NmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vYXJjaHBhcmFtLmgKQEAgLTAsMCArMSwyMCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDAzIEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fQVJDSFBBUkFNX0gKKyNkZWZpbmUgX19VTV9BUkNIUEFSQU1fSAorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKyNkZWZpbmUgTEFTVF9QS01BUCA1MTIKKyNlbHNlCisjZGVmaW5lIExBU1RfUEtNQVAgMTAyNAorI2VuZGlmCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bS5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlZmUyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19VTV9DSEVDS1NVTV9ICisjZGVmaW5lIF9fVU1fQ0hFQ0tTVU1fSAorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorIyBpbmNsdWRlICJjaGVja3N1bV8zMi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAiY2hlY2tzdW1fNjQuaCIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bV8zMi5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhYjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9jaGVja3N1bV8zMi5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19VTV9TWVNERVBfQ0hFQ0tTVU1fSAorI2RlZmluZSBfX1VNX1NZU0RFUF9DSEVDS1NVTV9ICisKKyNpbmNsdWRlICJsaW51eC9pbjYuaCIKKyNpbmNsdWRlICJsaW51eC9zdHJpbmcuaCIKKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAorICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKKyAqCisgKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgorICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKKyAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAorICoKKyAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQorICovCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOworCisvKgorICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQorICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgorICoKKyAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlCisgKglhY2Nlc3Nfb2soKS4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCit7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Cit9CisKKy8qCisgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKKyAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KKyAqCisgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KKyAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CisgKi8KKworc3RhdGljIF9faW5saW5lX18KK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkgeworCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisJCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7CisJfQorCisJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKK30KKworLyoKKyAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKKyAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCisgKgorICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQorICoJQXJudCBHdWxicmFuZHNlbi4KKyAqLworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJdW5zaWduZWQgaW50IHN1bTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSAgICAibW92bCAoJTEpLCAlMAk7XG4iCisJICAgICJzdWJsICQ0LCAlMgk7XG4iCisJICAgICJqYmUgMmYJCTtcbiIKKwkgICAgImFkZGwgNCglMSksICUwCTtcbiIKKwkgICAgImFkY2wgOCglMSksICUwCTtcbiIKKwkgICAgImFkY2wgMTIoJTEpLCAlMAk7XG4iCisiMToJICAgIGFkY2wgMTYoJTEpLCAlMAk7XG4iCisJICAgICJsZWEgNCglMSksICUxCTtcbiIKKwkgICAgImRlY2wgJTIJCTtcbiIKKwkgICAgImpuZSAxYgkJO1xuIgorCSAgICAiYWRjbCAkMCwgJTAJO1xuIgorCSAgICAibW92bCAlMCwgJTIJO1xuIgorCSAgICAic2hybCAkMTYsICUwCTtcbiIKKwkgICAgImFkZHcgJXcyLCAldzAJO1xuIgorCSAgICAiYWRjbCAkMCwgJTAJO1xuIgorCSAgICAibm90bCAlMAkJO1xuIgorIjI6CQkJCTtcbiIKKwkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlwbAorCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKKwkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLworCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQorCTogIjEiIChpcGgpLCAiMiIgKGlobCkKKwk6ICJtZW1vcnkiKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Cit9CisKKy8qCisgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQorICovCisKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKK3sKKwlfX2FzbV9fKAorCQkiYWRkbCAlMSwgJTAJCTtcbiIKKwkJImFkY2wgJDB4ZmZmZiwgJTAJO1xuIgorCQk6ICI9ciIgKHN1bSkKKwkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAorCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCisJKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOworfQorCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCit7CisgICAgX19hc21fXygKKwkiYWRkbCAlMSwgJTAJO1xuIgorCSJhZGNsICUyLCAlMAk7XG4iCisJImFkY2wgJTMsICUwCTtcbiIKKwkiYWRjbCAkMCwgJTAJO1xuIgorCTogIj1yIiAoc3VtKQorCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIoc3VtKSk7CisgICAgcmV0dXJuIHN1bTsKK30KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCisgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAorICovCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCit7CisJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQorICogaW4gaWNtcC5jCisgKi8KKworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKK30KKworI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKK3sKKwlfX2FzbV9fKAorCQkiYWRkbCAwKCUxKSwgJTAJCTtcbiIKKwkJImFkY2wgNCglMSksICUwCQk7XG4iCisJCSJhZGNsIDgoJTEpLCAlMAkJO1xuIgorCQkiYWRjbCAxMiglMSksICUwCTtcbiIKKwkJImFkY2wgMCglMiksICUwCQk7XG4iCisJCSJhZGNsIDQoJTIpLCAlMAkJO1xuIgorCQkiYWRjbCA4KCUyKSwgJTAJCTtcbiIKKwkJImFkY2wgMTIoJTIpLCAlMAk7XG4iCisJCSJhZGNsICUzLCAlMAkJO1xuIgorCQkiYWRjbCAlNCwgJTAJCTtcbiIKKwkJImFkY2wgJDAsICUwCQk7XG4iCisJCTogIj0mciIgKHN1bSkKKwkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCisJCSAgInIiKGh0b25sKGxlbikpLCAiciIoaHRvbmwocHJvdG8pKSwgIjAiKHN1bSkpOworCisJcmV0dXJuIGNzdW1fZm9sZChzdW0pOworfQorCisvKgorICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgorICovCisjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAorCQkJCQkJICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkgeworCQlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7CisJCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOworCQl9CisKKwkJcmV0dXJuIGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKKwl9CisKKwlpZiAobGVuKQorCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9jaGVja3N1bS5oIGIvYXJjaC94ODYvdW0vYXNtL2NoZWNrc3VtXzY0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9zaGFyZWQvc3lzZGVwL2NoZWNrc3VtLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9jaGVja3N1bV82NC5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2Rlc2MuaCBiL2FyY2gveDg2L3VtL2FzbS9kZXNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vZGVzYy5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9hc20vZGVzYy5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9hc20vZWxmLmggYi9hcmNoL3g4Ni91bS9hc20vZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMDYzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9lbGYuaApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisjaWZuZGVmIF9fVU1fRUxGX1g4Nl9ICisjZGVmaW5lIF9fVU1fRUxGX1g4Nl9ICisKKyNpbmNsdWRlIDxhc20vdXNlci5oPgorI2luY2x1ZGUgInNrYXMuaCIKKworI2lmZGVmIENPTkZJR19YODZfMzIKKworI2RlZmluZSBSXzM4Nl9OT05FCTAKKyNkZWZpbmUgUl8zODZfMzIJMQorI2RlZmluZSBSXzM4Nl9QQzMyCTIKKyNkZWZpbmUgUl8zODZfR09UMzIJMworI2RlZmluZSBSXzM4Nl9QTFQzMgk0CisjZGVmaW5lIFJfMzg2X0NPUFkJNQorI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAk2CisjZGVmaW5lIFJfMzg2X0pNUF9TTE9UCTcKKyNkZWZpbmUgUl8zODZfUkVMQVRJVkUJOAorI2RlZmluZSBSXzM4Nl9HT1RPRkYJOQorI2RlZmluZSBSXzM4Nl9HT1RQQwkxMAorI2RlZmluZSBSXzM4Nl9OVU0JMTEKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCisgKi8KKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgXAorCSgoKHgpLT5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoKHgpLT5lX21hY2hpbmUgPT0gRU1fNDg2KSkKKworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgorI2RlZmluZSBFTEZfREFUQSAgICAgICAgRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0ggICAgICAgIEVNXzM4NgorCisjZGVmaW5lIEVMRl9QTEFUX0lOSVQocmVncywgbG9hZF9hZGRyKSBkbyB7IFwKKwlQVF9SRUdTX0VCWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VDWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VEWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VTSShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VESShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VCUChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX0VBWChyZWdzKSA9IDA7IFwKK30gd2hpbGUgKDApCisKKy8qIFNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvZWxmLmggKi8KKworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1JFR1MocHJfcmVnLCByZWdzKSBkbyB7CVwKKwlwcl9yZWdbMF0gPSBQVF9SRUdTX0VCWChyZWdzKTsJCVwKKwlwcl9yZWdbMV0gPSBQVF9SRUdTX0VDWChyZWdzKTsJCVwKKwlwcl9yZWdbMl0gPSBQVF9SRUdTX0VEWChyZWdzKTsJCVwKKwlwcl9yZWdbM10gPSBQVF9SRUdTX0VTSShyZWdzKTsJCVwKKwlwcl9yZWdbNF0gPSBQVF9SRUdTX0VESShyZWdzKTsJCVwKKwlwcl9yZWdbNV0gPSBQVF9SRUdTX0VCUChyZWdzKTsJCVwKKwlwcl9yZWdbNl0gPSBQVF9SRUdTX0VBWChyZWdzKTsJCVwKKwlwcl9yZWdbN10gPSBQVF9SRUdTX0RTKHJlZ3MpOwkJXAorCXByX3JlZ1s4XSA9IFBUX1JFR1NfRVMocmVncyk7CQlcCisJLyogZmFrZSBvbmNlIHVzZWQgZnMgYW5kIGdzIHNlbGVjdG9ycz8gKi8JXAorCXByX3JlZ1s5XSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCisJcHJfcmVnWzEwXSA9IFBUX1JFR1NfRFMocmVncyk7CQlcCisJcHJfcmVnWzExXSA9IFBUX1JFR1NfU1lTQ0FMTF9OUihyZWdzKTsJXAorCXByX3JlZ1sxMl0gPSBQVF9SRUdTX0lQKHJlZ3MpOwkJXAorCXByX3JlZ1sxM10gPSBQVF9SRUdTX0NTKHJlZ3MpOwkJXAorCXByX3JlZ1sxNF0gPSBQVF9SRUdTX0VGTEFHUyhyZWdzKTsJXAorCXByX3JlZ1sxNV0gPSBQVF9SRUdTX1NQKHJlZ3MpOwkJXAorCXByX3JlZ1sxNl0gPSBQVF9SRUdTX1NTKHJlZ3MpOwkJXAorfSB3aGlsZSAoMCk7CisKK2V4dGVybiBjaGFyICogZWxmX2F1eF9wbGF0Zm9ybTsKKyNkZWZpbmUgRUxGX1BMQVRGT1JNIChlbGZfYXV4X3BsYXRmb3JtKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyB2c3lzY2FsbF9laGRyOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnN5c2NhbGxfZW5kOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19rZXJuZWxfdnN5c2NhbGw7CisKKy8qCisgKiBUaGlzIGlzIHRoZSByYW5nZSB0aGF0IGlzIHJlYWRhYmxlIGJ5IHVzZXIgbW9kZSwgYW5kIHRoaW5ncworICogYWN0aW5nIGxpa2UgdXNlciBtb2RlIHN1Y2ggYXMgZ2V0X3VzZXJfcGFnZXMuCisgKi8KKyNkZWZpbmUgRklYQUREUl9VU0VSX1NUQVJUICAgICAgdnN5c2NhbGxfZWhkcgorI2RlZmluZSBGSVhBRERSX1VTRVJfRU5EICAgICAgICB2c3lzY2FsbF9lbmQKKworCisvKgorICogQXJjaGl0ZWN0dXJlLW5ldXRyYWwgQVRfIHZhbHVlcyBpbiAwLTE3LCBsZWF2ZSBzb21lIHJvb20KKyAqIGZvciBtb3JlIG9mIHRoZW0sIHN0YXJ0IHRoZSB4ODYtc3BlY2lmaWMgb25lcyBhdCAzMi4KKyAqLworI2RlZmluZSBBVF9TWVNJTkZPCQkzMgorI2RlZmluZSBBVF9TWVNJTkZPX0VIRFIJCTMzCisKKyNkZWZpbmUgQVJDSF9ETElORk8JCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKCB2c3lzY2FsbF9laGRyICkgewkJCQkJXAorCQlORVdfQVVYX0VOVChBVF9TWVNJTkZPLAlfX2tlcm5lbF92c3lzY2FsbCk7CVwKKwkJTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLCB2c3lzY2FsbF9laGRyKTsJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKworLyogeDg2LTY0IHJlbG9jYXRpb24gdHlwZXMsIHRha2VuIGZyb20gYXNtLXg4Nl82NC9lbGYuaCAqLworI2RlZmluZSBSX1g4Nl82NF9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfWDg2XzY0XzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMzIJCTIJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNpZ25lZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1QzMgkJMwkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVDMyCQk0CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1g4Nl82NF9DT1BZCQk1CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9YODZfNjRfR0xPQl9EQVQJNgkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0pVTVBfU0xPVAk3CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkUJOAkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMCTkJLyogMzIgYml0IHNpZ25lZCBwYyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0XzMyCQkxMAkvKiBEaXJlY3QgMzIgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzJTCQkxMQkvKiBEaXJlY3QgMzIgYml0IHNpZ24gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMTYJCTEyCS8qIERpcmVjdCAxNiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QQzE2CQkxMwkvKiAxNiBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF84CQkxNAkvKiBEaXJlY3QgOCBiaXQgc2lnbiBleHRlbmRlZCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM4CQkxNQkvKiA4IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisKKyNkZWZpbmUgUl9YODZfNjRfTlVNCQkxNgorCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSBcCisJKCh4KS0+ZV9tYWNoaW5lID09IEVNX1g4Nl82NCkKKworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1M2NAorI2RlZmluZSBFTEZfREFUQSAgICAgICAgRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0ggICAgICAgIEVNX1g4Nl82NAorCisjZGVmaW5lIEVMRl9QTEFUX0lOSVQocmVncywgbG9hZF9hZGRyKSAgICBkbyB7IFwKKwlQVF9SRUdTX1JCWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JDWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JEWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JTSShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JESShyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JCUChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1JBWChyZWdzKSA9IDA7IFwKKwlQVF9SRUdTX1I4KHJlZ3MpID0gMDsgXAorCVBUX1JFR1NfUjkocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTAocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTEocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTIocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTMocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTQocmVncykgPSAwOyBcCisJUFRfUkVHU19SMTUocmVncykgPSAwOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhwcl9yZWcsIF9yZWdzKQkJXAorCShwcl9yZWcpWzBdID0gKF9yZWdzKS0+cmVncy5ncFswXTsJCQlcCisJKHByX3JlZylbMV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzFdOwkJCVwKKwkocHJfcmVnKVsyXSA9IChfcmVncyktPnJlZ3MuZ3BbMl07CQkJXAorCShwcl9yZWcpWzNdID0gKF9yZWdzKS0+cmVncy5ncFszXTsJCQlcCisJKHByX3JlZylbNF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzRdOwkJCVwKKwkocHJfcmVnKVs1XSA9IChfcmVncyktPnJlZ3MuZ3BbNV07CQkJXAorCShwcl9yZWcpWzZdID0gKF9yZWdzKS0+cmVncy5ncFs2XTsJCQlcCisJKHByX3JlZylbN10gPSAoX3JlZ3MpLT5yZWdzLmdwWzddOwkJCVwKKwkocHJfcmVnKVs4XSA9IChfcmVncyktPnJlZ3MuZ3BbOF07CQkJXAorCShwcl9yZWcpWzldID0gKF9yZWdzKS0+cmVncy5ncFs5XTsJCQlcCisJKHByX3JlZylbMTBdID0gKF9yZWdzKS0+cmVncy5ncFsxMF07CQkJXAorCShwcl9yZWcpWzExXSA9IChfcmVncyktPnJlZ3MuZ3BbMTFdOwkJCVwKKwkocHJfcmVnKVsxMl0gPSAoX3JlZ3MpLT5yZWdzLmdwWzEyXTsJCQlcCisJKHByX3JlZylbMTNdID0gKF9yZWdzKS0+cmVncy5ncFsxM107CQkJXAorCShwcl9yZWcpWzE0XSA9IChfcmVncyktPnJlZ3MuZ3BbMTRdOwkJCVwKKwkocHJfcmVnKVsxNV0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE1XTsJCQlcCisJKHByX3JlZylbMTZdID0gKF9yZWdzKS0+cmVncy5ncFsxNl07CQkJXAorCShwcl9yZWcpWzE3XSA9IChfcmVncyktPnJlZ3MuZ3BbMTddOwkJCVwKKwkocHJfcmVnKVsxOF0gPSAoX3JlZ3MpLT5yZWdzLmdwWzE4XTsJCQlcCisJKHByX3JlZylbMTldID0gKF9yZWdzKS0+cmVncy5ncFsxOV07CQkJXAorCShwcl9yZWcpWzIwXSA9IChfcmVncyktPnJlZ3MuZ3BbMjBdOwkJCVwKKwkocHJfcmVnKVsyMV0gPSBjdXJyZW50LT50aHJlYWQuYXJjaC5mczsJCQlcCisJKHByX3JlZylbMjJdID0gMDsJCQkJCVwKKwkocHJfcmVnKVsyM10gPSAwOwkJCQkJXAorCShwcl9yZWcpWzI0XSA9IDA7CQkJCQlcCisJKHByX3JlZylbMjVdID0gMDsJCQkJCVwKKwkocHJfcmVnKVsyNl0gPSAwOworCisjZGVmaW5lIEVMRl9QTEFURk9STSAieDg2XzY0IgorCisvKiBObyB1c2VyLWFjY2Vzc2libGUgZml4bWFwIGFkZHJlc3NlcywgaS5lLiB2c3lzY2FsbCAqLworI2RlZmluZSBGSVhBRERSX1VTRVJfU1RBUlQgICAgICAwCisjZGVmaW5lIEZJWEFERFJfVVNFUl9FTkQgICAgICAgIDAKKworI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKK3N0cnVjdCBsaW51eF9iaW5wcm07CitleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCWludCB1c2VzX2ludGVycCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHVtX3Zkc29fYWRkcjsKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSIDMzCisjZGVmaW5lIEFSQ0hfRExJTkZPCU5FV19BVVhfRU5UKEFUX1NZU0lORk9fRUhEUiwgdW1fdmRzb19hZGRyKQorCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKK3R5cGVkZWYgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZWxmX2ZwcmVnc2V0X3Q7CisKKyNkZWZpbmUgdGFza19wdF9yZWdzKHQpICgmKHQpLT50aHJlYWQucmVncykKKworc3RydWN0IHRhc2tfc3RydWN0OworCitleHRlcm4gaW50IGVsZl9jb3JlX2NvcHlfZnByZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgZWxmX2ZwcmVnc2V0X3QgKmZwdSk7CisKKyNkZWZpbmUgRUxGX0NPUkVfQ09QWV9GUFJFR1ModCwgZnB1KSBlbGZfY29yZV9jb3B5X2ZwcmVncyh0LCBmcHUpCisKKyNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUgNDA5NgorCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAoMiAqIFRBU0tfU0laRSAvIDMpCisKK2V4dGVybiBsb25nIGVsZl9hdXhfaHdjYXA7CisjZGVmaW5lIEVMRl9IV0NBUCAoZWxmX2F1eF9od2NhcCkKKworI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpIGRvIDsgd2hpbGUoMCkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfR0FURV9BUkVBIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmggYi9hcmNoL3g4Ni91bS9hc20vaXJxX3ZlY3RvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9hc20vaXJxX3ZlY3RvcnMuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL21tX2NvbnRleHQuaCBiL2FyY2gveDg2L3VtL2FzbS9tbV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3M2Q2MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9tbV9jb250ZXh0LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzIEdtYkgKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqCisgKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKi8KKworI2lmbmRlZiBfX0FTTV9MRFRfSAorI2RlZmluZSBfX0FTTV9MRFRfSAorCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisKK2V4dGVybiB2b2lkIGxkdF9ob3N0X2luZm8odm9pZCk7CisKKyNkZWZpbmUgTERUX1BBR0VTX01BWCBcCisJKChMRFRfRU5UUklFUyAqIExEVF9FTlRSWV9TSVpFKS9QQUdFX1NJWkUpCisjZGVmaW5lIExEVF9FTlRSSUVTX1BFUl9QQUdFIFwKKwkoUEFHRV9TSVpFL0xEVF9FTlRSWV9TSVpFKQorI2RlZmluZSBMRFRfRElSRUNUX0VOVFJJRVMgXAorCSgoTERUX1BBR0VTX01BWCpzaXplb2Yodm9pZCAqKSkvTERUX0VOVFJZX1NJWkUpCisKK3N0cnVjdCBsZHRfZW50cnkgeworCV9fdTMyIGE7CisJX191MzIgYjsKK307CisKK3R5cGVkZWYgc3RydWN0IHVtbF9sZHQgeworCWludCBlbnRyeV9jb3VudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1bmlvbiB7CisJCXN0cnVjdCBsZHRfZW50cnkgKiBwYWdlc1tMRFRfUEFHRVNfTUFYXTsKKwkJc3RydWN0IGxkdF9lbnRyeSBlbnRyaWVzW0xEVF9ESVJFQ1RfRU5UUklFU107CisJfSB1OworfSB1bWxfbGR0X3Q7CisKKyNkZWZpbmUgTERUX2VudHJ5X2EoaW5mbykgXAorCSgoKChpbmZvKS0+YmFzZV9hZGRyICYgMHgwMDAwZmZmZikgPDwgMTYpIHwgKChpbmZvKS0+bGltaXQgJiAweDBmZmZmKSkKKworI2RlZmluZSBMRFRfZW50cnlfYihpbmZvKSBcCisJKCgoaW5mbyktPmJhc2VfYWRkciAmIDB4ZmYwMDAwMDApIHwgXAorCSgoKGluZm8pLT5iYXNlX2FkZHIgJiAweDAwZmYwMDAwKSA+PiAxNikgfCBcCisJKChpbmZvKS0+bGltaXQgJiAweGYwMDAwKSB8IFwKKwkoKChpbmZvKS0+cmVhZF9leGVjX29ubHkgXiAxKSA8PCA5KSB8IFwKKwkoKGluZm8pLT5jb250ZW50cyA8PCAxMCkgfCBcCisJKCgoaW5mbyktPnNlZ19ub3RfcHJlc2VudCBeIDEpIDw8IDE1KSB8IFwKKwkoKGluZm8pLT5zZWdfMzJiaXQgPDwgMjIpIHwgXAorCSgoaW5mbyktPmxpbWl0X2luX3BhZ2VzIDw8IDIzKSB8IFwKKwkoKGluZm8pLT51c2VhYmxlIDw8IDIwKSB8IFwKKwkweDcwMDApCisKKyNkZWZpbmUgX0xEVF9lbXB0eShpbmZvKSAoXAorCShpbmZvKS0+YmFzZV9hZGRyCT09IDAJJiYgXAorCShpbmZvKS0+bGltaXQJCT09IDAJJiYgXAorCShpbmZvKS0+Y29udGVudHMJPT0gMAkmJiBcCisJKGluZm8pLT5yZWFkX2V4ZWNfb25seQk9PSAxCSYmIFwKKwkoaW5mbyktPnNlZ18zMmJpdAk9PSAwCSYmIFwKKwkoaW5mbyktPmxpbWl0X2luX3BhZ2VzCT09IDAJJiYgXAorCShpbmZvKS0+c2VnX25vdF9wcmVzZW50CT09IDEJJiYgXAorCShpbmZvKS0+dXNlYWJsZQkJPT0gMAkpCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisjZGVmaW5lIExEVF9lbXB0eShpbmZvKSAoX0xEVF9lbXB0eShpbmZvKSAmJiAoKGluZm8pLT5sbSA9PSAwKSkKKyNlbHNlCisjZGVmaW5lIExEVF9lbXB0eShpbmZvKSAoX0xEVF9lbXB0eShpbmZvKSkKKyNlbmRpZgorCitzdHJ1Y3QgdW1sX2FyY2hfbW1fY29udGV4dCB7CisJdW1sX2xkdF90IGxkdDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL21vZHVsZS5oIGIvYXJjaC94ODYvdW0vYXNtL21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWY4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vbW9kdWxlLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX1VNX01PRFVMRV9ICisjZGVmaW5lIF9fVU1fTU9EVUxFX0gKKworLyogVU1MIGlzIHNpbXBsZSAqLworc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljCit7Cit9OworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisjZGVmaW5lIEVsZl9TaGRyIEVsZjMyX1NoZHIKKyNkZWZpbmUgRWxmX1N5bSBFbGYzMl9TeW0KKyNkZWZpbmUgRWxmX0VoZHIgRWxmMzJfRWhkcgorCisjZWxzZQorCisjZGVmaW5lIEVsZl9TaGRyIEVsZjY0X1NoZHIKKyNkZWZpbmUgRWxmX1N5bSBFbGY2NF9TeW0KKyNkZWZpbmUgRWxmX0VoZHIgRWxmNjRfRWhkcgorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni91bS9hc20vcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzE0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fVU1fUFJPQ0VTU09SX0gKKyNkZWZpbmUgX19VTV9QUk9DRVNTT1JfSAorCisvKiBpbmNsdWRlIGZhdWx0aW5mbyBzdHJ1Y3R1cmUgKi8KKyNpbmNsdWRlIDxzeXNkZXAvZmF1bHRpbmZvLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjIGluY2x1ZGUgInByb2Nlc3Nvcl8zMi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicHJvY2Vzc29yXzY0LmgiCisjZW5kaWYKKworI2RlZmluZSBLU1RLX0VJUCh0c2spIEtTVEtfUkVHKHRzaywgSE9TVF9JUCkKKyNkZWZpbmUgS1NUS19FU1AodHNrKSBLU1RLX1JFRyh0c2ssIEhPU1RfSVApCisjZGVmaW5lIEtTVEtfRUJQKHRzaykgS1NUS19SRUcodHNrLCBIT1NUX0JQKQorCisjZGVmaW5lIEFSQ0hfSVNfU1RBQ0tHUk9XKGFkZHJlc3MpIFwKKyAgICAgICAoYWRkcmVzcyArIDY1NTM2ICsgMzIgKiBzaXplb2YodW5zaWduZWQgbG9uZykgPj0gVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSkKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZ2VuZXJpYy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfMzIuaCBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThmNzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3Byb2Nlc3Nvcl8zMi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19VTV9QUk9DRVNTT1JfSTM4Nl9ICisjZGVmaW5lIF9fVU1fUFJPQ0VTU09SX0kzODZfSAorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisKK2V4dGVybiBpbnQgaG9zdF9oYXNfY21vdjsKKworc3RydWN0IHVtbF90bHNfc3RydWN0IHsKKwlzdHJ1Y3QgdXNlcl9kZXNjIHRsczsKKwl1bnNpZ25lZCBmbHVzaGVkOjE7CisJdW5zaWduZWQgcHJlc2VudDoxOworfTsKKworc3RydWN0IGFyY2hfdGhyZWFkIHsKKwlzdHJ1Y3QgdW1sX3Rsc19zdHJ1Y3QgdGxzX2FycmF5W0dEVF9FTlRSWV9UTFNfRU5UUklFU107CisJdW5zaWduZWQgbG9uZyBkZWJ1Z3JlZ3NbOF07CisJaW50IGRlYnVncmVnc19zZXE7CisJc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87Cit9OworCisjZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyBcCisJLnRsc19hcnJheSAgCQk9IHsgWyAwIC4uLiBHRFRfRU5UUllfVExTX0VOVFJJRVMgLSAxIF0gPSBcCisJCQkJICAgIHsgLnByZXNlbnQgPSAwLCAuZmx1c2hlZCA9IDAgfSB9LCBcCisJLmRlYnVncmVncyAgCQk9IHsgWyAwIC4uLiA3IF0gPSAwIH0sIFwKKwkuZGVidWdyZWdzX3NlcQkJPSAwLCBcCisJLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSBcCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKK3sKKwkvKiBDbGVhciBhbnkgVExTIHN0aWxsIGhhbmdpbmcgKi8KKwltZW1zZXQoJnRocmVhZC0+dGxzX2FycmF5LCAwLCBzaXplb2YodGhyZWFkLT50bHNfYXJyYXkpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKK3sKKyAgICAgICAgbWVtY3B5KCZ0by0+dGxzX2FycmF5LCAmZnJvbS0+dGxzX2FycmF5LCBzaXplb2YoZnJvbS0+dGxzX2FycmF5KSk7Cit9CisKKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCisvKiBSRVAgTk9QIChQQVVTRSkgaXMgYSBnb29kIHRoaW5nIHRvIGluc2VydCBpbnRvIGJ1c3ktd2FpdCBsb29wcy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXBfbm9wKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJlcDtub3AiOiA6IDoibWVtb3J5Iik7Cit9CisKKyNkZWZpbmUgY3B1X3JlbGF4KCkJcmVwX25vcCgpCisKKy8qCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50CisgKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuIFN0b2xlbgorICogZnJvbSBhc20taTM4Ni9wcm9jZXNzb3IuaAorICovCisjZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgXAorCSh7IHZvaWQgKnBjOyBfX2FzbV9fKCJtb3ZsICQxZiwlMFxuMToiOiI9ZyIgKHBjKSk7IHBjOyB9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfNjQuaCBiL2FyY2gveDg2L3VtL2FzbS9wcm9jZXNzb3JfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRlOTJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3Byb2Nlc3Nvcl82NC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1VNX1BST0NFU1NPUl9YODZfNjRfSAorI2RlZmluZSBfX1VNX1BST0NFU1NPUl9YODZfNjRfSAorCitzdHJ1Y3QgYXJjaF90aHJlYWQgeworICAgICAgICB1bnNpZ25lZCBsb25nIGRlYnVncmVnc1s4XTsKKyAgICAgICAgaW50IGRlYnVncmVnc19zZXE7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZnM7CisgICAgICAgIHN0cnVjdCBmYXVsdGluZm8gZmF1bHRpbmZvOworfTsKKworLyogUkVQIE5PUCAoUEFVU0UpIGlzIGEgZ29vZCB0aGluZyB0byBpbnNlcnQgaW50byBidXN5LXdhaXQgbG9vcHMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwX25vcCh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZXA7bm9wIjogOiA6Im1lbW9yeSIpOworfQorCisjZGVmaW5lIGNwdV9yZWxheCgpICAgcmVwX25vcCgpCisKKyNkZWZpbmUgSU5JVF9BUkNIX1RIUkVBRCB7IC5kZWJ1Z3JlZ3MgIAkJPSB7IFsgMCAuLi4gNyBdID0gMCB9LCBcCisJCQkgICAuZGVidWdyZWdzX3NlcQk9IDAsIFwKKwkJCSAgIC5mcwkJCT0gMCwgXAorCQkJICAgLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZsdXNoX3RocmVhZChzdHJ1Y3QgYXJjaF90aHJlYWQgKnRocmVhZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV90aHJlYWQoc3RydWN0IGFyY2hfdGhyZWFkICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFyY2hfdGhyZWFkICp0bykKK3sKKwl0by0+ZnMgPSBmcm9tLT5mczsKK30KKworI2luY2x1ZGUgPGFzbS91c2VyLmg+CisKKyNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSBcCisJKHsgdm9pZCAqcGM7IF9fYXNtX18oIm1vdnEgJDFmLCUwXG4xOiI6Ij1nIiAocGMpKTsgcGM7IH0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgQ09ORklHX1g4Nl8zMgorIyBpbmNsdWRlICJwdHJhY2VfMzIuaCIKKyNlbHNlCisjIGluY2x1ZGUgInB0cmFjZV82NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2FzbS9wdHJhY2UuaCBiL2FyY2gveDg2L3VtL2FzbS9wdHJhY2VfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9hc20vcHRyYWNlLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9wdHJhY2VfMzIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL3B0cmFjZV82NC5oIGIvYXJjaC94ODYvdW0vYXNtL3B0cmFjZV82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNmEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9hc20vcHRyYWNlXzY0LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fUFRSQUNFX1g4Nl82NF9ICisjZGVmaW5lIF9fVU1fUFRSQUNFX1g4Nl82NF9ICisKKyNpbmNsdWRlICJsaW51eC9jb21waWxlci5oIgorI2luY2x1ZGUgImFzbS9lcnJuby5oIgorCisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUyAvKiBOZWVkZWQgdG8gZ2V0IHRoZSBSKiBtYWNyb3MgKi8KKyNpbmNsdWRlICJhc20vcHRyYWNlLWdlbmVyaWMuaCIKKworI2RlZmluZSBIT1NUX0FVRElUX0FSQ0ggQVVESVRfQVJDSF9YODZfNjQKKworI2RlZmluZSBQVF9SRUdTX1JCWChyKSBVUFRfUkJYKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUkNYKHIpIFVQVF9SQ1goJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SRFgocikgVVBUX1JEWCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JTSShyKSBVUFRfUlNJKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUkRJKHIpIFVQVF9SREkoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SQlAocikgVVBUX1JCUCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JBWChyKSBVUFRfUkFYKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjgocikgVVBUX1I4KCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjkocikgVVBUX1I5KCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjEwKHIpIFVQVF9SMTAoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SMTEocikgVVBUX1IxMSgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1IxMihyKSBVUFRfUjEyKCYociktPnJlZ3MpCisjZGVmaW5lIFBUX1JFR1NfUjEzKHIpIFVQVF9SMTMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19SMTQocikgVVBUX1IxNCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1IxNShyKSBVUFRfUjE1KCYociktPnJlZ3MpCisKKyNkZWZpbmUgUFRfUkVHU19GUyhyKSBVUFRfRlMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19HUyhyKSBVUFRfR1MoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19EUyhyKSBVUFRfRFMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19FUyhyKSBVUFRfRVMoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19TUyhyKSBVUFRfU1MoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19DUyhyKSBVUFRfQ1MoJihyKS0+cmVncykKKworI2RlZmluZSBQVF9SRUdTX09SSUdfUkFYKHIpIFVQVF9PUklHX1JBWCgmKHIpLT5yZWdzKQorI2RlZmluZSBQVF9SRUdTX1JJUChyKSBVUFRfSVAoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19TUChyKSBVUFRfU1AoJihyKS0+cmVncykKKworI2RlZmluZSBQVF9SRUdTX0VGTEFHUyhyKSBVUFRfRUZMQUdTKCYociktPnJlZ3MpCisKKy8qIFhYWCAqLworI2RlZmluZSB1c2VyX21vZGUocikgVVBUX0lTX1VTRVIoJihyKS0+cmVncykKKyNkZWZpbmUgUFRfUkVHU19PUklHX1NZU0NBTEwocikgUFRfUkVHU19SQVgocikKKyNkZWZpbmUgUFRfUkVHU19TWVNDQUxMX1JFVChyKSBQVF9SRUdTX1JBWChyKQorCisjZGVmaW5lIFBUX0ZJWF9FWEVDX1NUQUNLKHNwKSBkbyA7IHdoaWxlKDApCisKKyNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBQVF9SRUdTX0lQKHJlZ3MpCisKK3N0cnVjdCB1c2VyX2Rlc2M7CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9nZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgaW50IGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKK2V4dGVybiBsb25nIGFyY2hfcHJjdGwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY29kZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICphZGRyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9yZXF1aXJlZC1mZWF0dXJlcy5oIGIvYXJjaC94ODYvdW0vYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaApyZW5hbWUgdG8gYXJjaC94ODYvdW0vYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc2VnbWVudC5oIGIvYXJjaC94ODYvdW0vYXNtL3NlZ21lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9pbmNsdWRlL2FzbS9zZWdtZW50LmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2FzbS9zZWdtZW50LmgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS9zeXN0ZW0uaCBiL2FyY2gveDg2L3VtL2FzbS9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU5ZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYXNtL3N5c3RlbS5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIF9BU01fWDg2X1NZU1RFTV9IXworI2RlZmluZSBfQVNNX1g4Nl9TWVNURU1fSF8KKworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KKyNpbmNsdWRlIDxhc20vbm9wcy5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKworLyogZW50cmllcyBpbiBBUkNIX0RMSU5GTzogKi8KKyNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KKyMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMgorI2Vsc2UKKyMgZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0FSQ0ggMQorI2VuZGlmCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CisKK3ZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCisvKgorICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KKyAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZworICogdG8gZGV2aWNlcy4KKyAqLworI2lmZGVmIENPTkZJR19YODZfMzIKKy8qCisgKiBTb21lIG5vbi1JbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCisgKiBub3AgZm9yIHRoZXNlLgorICovCisjZGVmaW5lIG1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKKyNkZWZpbmUgcm1iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NMikKKyNkZWZpbmUgd21iKCkgYWx0ZXJuYXRpdmUoImxvY2s7IGFkZGwgJDAsMCglJWVzcCkiLCAic2ZlbmNlIiwgWDg2X0ZFQVRVUkVfWE1NKQorI2Vsc2UKKyNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCWFzbSB2b2xhdGlsZSgibGZlbmNlIjo6OiJtZW1vcnkiKQorI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUoInNmZW5jZSIgOjo6ICJtZW1vcnkiKQorI2VuZGlmCisKKy8qKgorICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCisgKiBkZXBlbmQgb24uCisgKgorICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAorICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCisgKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQorICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQorICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KKyAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKKyAqIHJtYigpLgorICoKKyAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCisgKiBhbmQgdGhlIGNvbXBpbGVyLgorICoKKyAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKKyAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAorICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6CisgKgorICogPHByb2dyYW1saXN0aW5nPgorICoJQ1BVIDAJCQkJQ1BVIDEKKyAqCisgKgliID0gMjsKKyAqCW1lbW9yeV9iYXJyaWVyKCk7CisgKglwID0gJmI7CQkJCXEgPSBwOworICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7CisgKgkJCQkJZCA9ICpxOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCisgKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAorICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKKyAqCisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKglDUFUgMAkJCQlDUFUgMQorICoKKyAqCWEgPSAyOworICoJbWVtb3J5X2JhcnJpZXIoKTsKKyAqCWIgPSAzOwkJCQl5ID0gYjsKKyAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOworICoJCQkJCXggPSBhOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgorICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAorICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKKyAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCisgKiovCisKKyNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIHNtcF9tYigpCW1iKCkKKyNpZmRlZiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UKKyMgZGVmaW5lIHNtcF9ybWIoKQlybWIoKQorI2Vsc2UKKyMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorIyBkZWZpbmUgc21wX3dtYigpIAl3bWIoKQorI2Vsc2UKKyMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKKyNlbmRpZgorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHZhciA9IHZhbHVlOyBiYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFN0b3AgUkRUU0Mgc3BlY3VsYXRpb24uIFRoaXMgaXMgbmVlZGVkIHdoZW4geW91IG5lZWQgdG8gdXNlIFJEVFNDCisgKiAob3IgZ2V0X2N5Y2xlcyBvciB2cmVhZCB0aGF0IHBvc3NpYmx5IGFjY2Vzc2VzIHRoZSBUU0MpIGluIGEgZGVmaW5lZAorICogY29kZSByZWdpb24uCisgKgorICogKENvdWxkIHVzZSBhbiBhbHRlcm5hdGl2ZSB0aHJlZSB3YXkgZm9yIHRoaXMgaWYgdGhlcmUgd2FzIG9uZS4pCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZHRzY19iYXJyaWVyKHZvaWQpCit7CisJYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MpOworCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKK30KKworZXh0ZXJuIHZvaWQgKl9zd2l0Y2hfdG8odm9pZCAqcHJldiwgdm9pZCAqbmV4dCwgdm9pZCAqbGFzdCk7CisjZGVmaW5lIHN3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KSBwcmV2ID0gX3N3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2FzbS92bS1mbGFncy5oIGIvYXJjaC94ODYvdW0vYXNtL3ZtLWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyOTdlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2FzbS92bS1mbGFncy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19WTV9GTEFHU19YODZfSAorI2RlZmluZSBfX1ZNX0ZMQUdTX1g4Nl9ICisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKKyNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKKwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAorCSgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBSRUFEX0lNUExJRVNfRVhFQykgPyBWTV9FWEVDIDogMCApIHwgXAorCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKworI2Vsc2UKKworI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCisJVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKyNkZWZpbmUgVk1fU1RBQ0tfREVGQVVMVF9GTEFHUyAoVk1fR1JPV1NET1dOIHwgVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAorCVZNX0VYRUMgfCBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2J1Zy5jIGIvYXJjaC94ODYvdW0vYnVnLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9idWcuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vYnVnLmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2J1Z3NfMzIuYyBiL2FyY2gveDg2L3VtL2J1Z3NfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWZiYTVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vYnVnc18zMi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAibG9uZ2ptcC5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKKyNpbmNsdWRlIDxnZW5lcmF0ZWQvYXNtLW9mZnNldHMuaD4KKworLyogU2V0IGR1cmluZyBlYXJseSBib290ICovCitzdGF0aWMgaW50IGhvc3RfaGFzX2Ntb3YgPSAxOworc3RhdGljIGptcF9idWYgY21vdl90ZXN0X3JldHVybjsKKworI2RlZmluZSBUQVNLX1BJRCh0YXNrKSAqKChpbnQgKikgJigoKGNoYXIgKikgKHRhc2spKVtIT1NUX1RBU0tfUElEXSkpCisKK3N0YXRpYyB2b2lkIGNtb3Zfc2lnaWxsX3Rlc3RfaGFuZGxlcihpbnQgc2lnKQoreworCWhvc3RfaGFzX2Ntb3YgPSAwOworCWxvbmdqbXAoY21vdl90ZXN0X3JldHVybiwgMSk7Cit9CisKK3ZvaWQgYXJjaF9jaGVja19idWdzKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBvbGQsIG5ldzsKKworCXByaW50ayhVTV9LRVJOX0lORk8gIkNoZWNraW5nIGZvciBob3N0IHByb2Nlc3NvciBjbW92IHN1cHBvcnQuLi4iKTsKKwluZXcuc2FfaGFuZGxlciA9IGNtb3Zfc2lnaWxsX3Rlc3RfaGFuZGxlcjsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IFNJR0lMTCBpcyBlbmFibGVkIGFmdGVyIHRoZSBoYW5kbGVyIGxvbmdqbXBzIGJhY2sgKi8KKwluZXcuc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworCXNpZ2VtcHR5c2V0KCZuZXcuc2FfbWFzayk7CisJc2lnYWN0aW9uKFNJR0lMTCwgJm5ldywgJm9sZCk7CisKKwlpZiAoc2V0am1wKGNtb3ZfdGVzdF9yZXR1cm4pID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmb28gPSAwOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY21vdnogJTAsICUxIiA6ICI9ciIgKGZvbykgOiAiMCIgKGZvbykpOworCQlwcmludGsoVU1fS0VSTl9DT05UICJZZXNcbiIpOworCX0gZWxzZQorCQlwcmludGsoVU1fS0VSTl9DT05UICJOb1xuIik7CisKKwlzaWdhY3Rpb24oU0lHSUxMLCAmb2xkLCAmbmV3KTsKK30KKwordm9pZCBhcmNoX2V4YW1pbmVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCB1bWxfcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyXTsKKworCS8qCisJICogVGhpcyBpcyB0ZXN0aW5nIGZvciBhIGNtb3YgKDB4MGYgMHg0eCkgaW5zdHJ1Y3Rpb24gY2F1c2luZyBhCisJICogU0lHSUxMIGluIGluaXQuCisJICovCisJaWYgKChzaWcgIT0gU0lHSUxMKSB8fCAoVEFTS19QSUQoZ2V0X2N1cnJlbnQoKSkgIT0gMSkpCisJCXJldHVybjsKKworCWlmIChjb3B5X2Zyb21fdXNlcl9wcm9jKHRtcCwgKHZvaWQgKikgVVBUX0lQKHJlZ3MpLCAyKSkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBpbiBpbml0LCBjb3VsZCBub3QgcmVhZCAiCisJCSAgICAgICAiaW5zdHJ1Y3Rpb25zIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHRtcFswXSAhPSAweDBmKSB8fCAoKHRtcFsxXSAmIDB4ZjApICE9IDB4NDApKQorCQlyZXR1cm47CisKKwlpZiAoaG9zdF9oYXNfY21vdiA9PSAwKQorCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBjYXVzZWQgYnkgY21vdiwgd2hpY2ggdGhpcyAiCisJCSAgICAgICAicHJvY2Vzc29yIGRvZXNuJ3QgaW1wbGVtZW50LiAgQm9vdCBhIGZpbGVzeXN0ZW0gIgorCQkgICAgICAgImNvbXBpbGVkIGZvciBvbGRlciBwcm9jZXNzb3JzIik7CisJZWxzZSBpZiAoaG9zdF9oYXNfY21vdiA9PSAxKQorCQlwcmludGsoVU1fS0VSTl9FUlIgIlNJR0lMTCBjYXVzZWQgYnkgY21vdiwgd2hpY2ggdGhpcyAiCisJCSAgICAgICAicHJvY2Vzc29yIGNsYWltcyB0byBpbXBsZW1lbnQiKTsKKwllbHNlCisJCXByaW50ayhVTV9LRVJOX0VSUiAiQmFkIHZhbHVlIGZvciBob3N0X2hhc19jbW92ICglZCkiLAorCQkJaG9zdF9oYXNfY21vdik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvYnVncy5jIGIvYXJjaC94ODYvdW0vYnVnc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvYnVncy5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9idWdzXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvY2hlY2tzdW0uUyBiL2FyY2gveDg2L3VtL2NoZWNrc3VtXzMyLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvY2hlY2tzdW0uUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vY2hlY2tzdW1fMzIuUwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jIGIvYXJjaC94ODYvdW0vZGVsYXkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9kZWxheS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9kZWxheS5jCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L2VsZmNvcmUuYyBiL2FyY2gveDg2L3VtL2VsZmNvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9lbGZjb3JlLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL2VsZmNvcmUuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9mYXVsdC5jIGIvYXJjaC94ODYvdW0vZmF1bHQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9mYXVsdC5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9mYXVsdC5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9rc3ltcy5jIGIvYXJjaC94ODYvdW0va3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThmNDNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0va3N5bXMuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorCisjaWZuZGVmIENPTkZJR19YODZfMzIKKy8qWFhYOiB3ZSBuZWVkIHRoZW0gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGV4cG9ydGVkIGJ5IHg4Nl82NCAqLworI2lmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpIHx8IF9fR05VQ19fID4gNAorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0woX19tZW1jcHkpOworI2VuZGlmCisjZW5kaWYKK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2xkdC5jIGIvYXJjaC94ODYvdW0vbGR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiMGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL2xkdC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAicHJvY19tbS5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgorI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKKworZXh0ZXJuIGludCBtb2RpZnlfbGR0KGludCBmdW5jLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KTsKKworc3RhdGljIGxvbmcgd3JpdGVfbGR0X2VudHJ5KHN0cnVjdCBtbV9pZCAqbW1faWRwLCBpbnQgZnVuYywKKwkJICAgICBzdHJ1Y3QgdXNlcl9kZXNjICpkZXNjLCB2b2lkICoqYWRkciwgaW50IGRvbmUpCit7CisJbG9uZyByZXM7CisKKwlpZiAocHJvY19tbSkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIGNhc2UsIHRoYXQgdGhlIG1tIHRvCisJCSAqIG1vZGlmeSBpc24ndCBjdXJyZW50LT5hY3RpdmVfbW0uCisJCSAqIElmIHRoaXMgaXMgY2FsbGVkIGRpcmVjdGx5IGJ5IG1vZGlmeV9sZHQsCisJCSAqICAgICAoY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LnNrYXMudSA9PSBtbV9pZHApCisJCSAqIHdpbGwgYmUgdHJ1ZS4gU28gbm8gY2FsbCB0byBfX3N3aXRjaF9tbShtbV9pZHApIGlzIGRvbmUuCisJCSAqIElmIHRoaXMgaXMgY2FsbGVkIGluIGNhc2Ugb2YgaW5pdF9uZXdfbGR0IG9yIFBUUkFDRV9MRFQsCisJCSAqIG1tX2lkcCB3b24ndCBiZWxvbmcgdG8gY3VycmVudC0+YWN0aXZlX21tLCBidXQgY2hpbGQtPm1tLgorCQkgKiBTbyB3ZSBuZWVkIHRvIHN3aXRjaCBjaGlsZCdzIG1tIGludG8gb3VyIHVzZXJzcGFjZSwgdGhlbgorCQkgKiBsYXRlciBzd2l0Y2ggYmFjay4KKwkJICoKKwkJICogTm90ZTogSSdtIHVuc3VyZTogc2hvdWxkIGludGVycnVwdHMgYmUgZGlzYWJsZWQgaGVyZT8KKwkJICovCisJCWlmICghY3VycmVudC0+YWN0aXZlX21tIHx8IGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSAmaW5pdF9tbSB8fAorCQkgICAgbW1faWRwICE9ICZjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQpCisJCQlfX3N3aXRjaF9tbShtbV9pZHApOworCX0KKworCWlmIChwdHJhY2VfbGR0KSB7CisJCXN0cnVjdCBwdHJhY2VfbGR0IGxkdF9vcCA9IChzdHJ1Y3QgcHRyYWNlX2xkdCkgeworCQkJLmZ1bmMgPSBmdW5jLAorCQkJLnB0ciA9IGRlc2MsCisJCQkuYnl0ZWNvdW50ID0gc2l6ZW9mKCpkZXNjKX07CisJCXUzMiBjcHU7CisJCWludCBwaWQ7CisKKwkJaWYgKCFwcm9jX21tKQorCQkJcGlkID0gbW1faWRwLT51LnBpZDsKKwkJZWxzZSB7CisJCQljcHUgPSBnZXRfY3B1KCk7CisJCQlwaWQgPSB1c2Vyc3BhY2VfcGlkW2NwdV07CisJCX0KKworCQlyZXMgPSBvc19wdHJhY2VfbGR0KHBpZCwgMCwgKHVuc2lnbmVkIGxvbmcpICZsZHRfb3ApOworCisJCWlmIChwcm9jX21tKQorCQkJcHV0X2NwdSgpOworCX0KKwllbHNlIHsKKwkJdm9pZCAqc3R1Yl9hZGRyOworCQlyZXMgPSBzeXNjYWxsX3N0dWJfZGF0YShtbV9pZHAsICh1bnNpZ25lZCBsb25nICopZGVzYywKKwkJCQkJKHNpemVvZigqZGVzYykgKyBzaXplb2YobG9uZykgLSAxKSAmCisJCQkJCSAgICB+KHNpemVvZihsb25nKSAtIDEpLAorCQkJCQlhZGRyLCAmc3R1Yl9hZGRyKTsKKwkJaWYgKCFyZXMpIHsKKwkJCXVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyBmdW5jLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKXN0dWJfYWRkciwKKwkJCQkJCSBzaXplb2YoKmRlc2MpLAorCQkJCQkJIDAsIDAsIDAgfTsKKwkJCXJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21vZGlmeV9sZHQsIGFyZ3MsCisJCQkJCSAgICAgICAwLCBhZGRyLCBkb25lKTsKKwkJfQorCX0KKworCWlmIChwcm9jX21tKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXJ0IG9mIHNwZWNpYWwgaGFuZGxpbmcsIHRoYXQgbWFrZXMKKwkJICogUFRSQUNFX0xEVCBwb3NzaWJsZSB0byBpbXBsZW1lbnQuCisJCSAqLworCQlpZiAoY3VycmVudC0+YWN0aXZlX21tICYmIGN1cnJlbnQtPmFjdGl2ZV9tbSAhPSAmaW5pdF9tbSAmJgorCQkgICAgbW1faWRwICE9ICZjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQpCisJCQlfX3N3aXRjaF9tbSgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgbG9uZyByZWFkX2xkdF9mcm9tX2hvc3Qodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCByZXMsIG47CisJc3RydWN0IHB0cmFjZV9sZHQgcHRyYWNlX2xkdCA9IChzdHJ1Y3QgcHRyYWNlX2xkdCkgeworCQkJLmZ1bmMgPSAwLAorCQkJLmJ5dGVjb3VudCA9IGJ5dGVjb3VudCwKKwkJCS5wdHIgPSBrbWFsbG9jKGJ5dGVjb3VudCwgR0ZQX0tFUk5FTCl9OworCXUzMiBjcHU7CisKKwlpZiAocHRyYWNlX2xkdC5wdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gc3lzX21vZGlmeV9sZHQgb25seSwgc28gdXNlcnNwYWNlX3BpZCBnaXZlcworCSAqIHVzIHRoZSByaWdodCBudW1iZXIKKwkgKi8KKworCWNwdSA9IGdldF9jcHUoKTsKKwlyZXMgPSBvc19wdHJhY2VfbGR0KHVzZXJzcGFjZV9waWRbY3B1XSwgMCwgKHVuc2lnbmVkIGxvbmcpICZwdHJhY2VfbGR0KTsKKwlwdXRfY3B1KCk7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0OworCisJbiA9IGNvcHlfdG9fdXNlcihwdHIsIHB0cmFjZV9sZHQucHRyLCByZXMpOworCWlmIChuICE9IDApCisJCXJlcyA9IC1FRkFVTFQ7CisKKyAgb3V0OgorCWtmcmVlKHB0cmFjZV9sZHQucHRyKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBJbiBza2FzIG1vZGUsIHdlIGhvbGQgb3VyIG93biBsZHQgZGF0YSBpbiBVTUwuCisgKiBUaHVzLCB0aGUgY29kZSBpbXBsZW1lbnRpbmcgc3lzX21vZGlmeV9sZHRfc2thcworICogaXMgdmVyeSBzaW1pbGFyIHRvIChhbmQgbW9zdGx5IHN0b2xlbiBmcm9tKSBzeXNfbW9kaWZ5X2xkdAorICogZm9yIGFyY2gvaTM4Ni9rZXJuZWwvbGR0LmMKKyAqIFRoZSByb3V0aW5lcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGluIHBhcnQgYXJlOgorICogLSByZWFkX2xkdAorICogLSByZWFkX2RlZmF1bHRfbGR0CisgKiAtIHdyaXRlX2xkdAorICogLSBzeXNfbW9kaWZ5X2xkdF9za2FzCisgKi8KKworc3RhdGljIGludCByZWFkX2xkdCh2b2lkIF9fdXNlciAqIHB0ciwgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCit7CisJaW50IGksIGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVtbF9sZHRfdCAqbGR0ID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmFyY2gubGR0OworCisJaWYgKCFsZHQtPmVudHJ5X2NvdW50KQorCQlnb3RvIG91dDsKKwlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCisJCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOworCWVyciA9IGJ5dGVjb3VudDsKKworCWlmIChwdHJhY2VfbGR0KQorCQlyZXR1cm4gcmVhZF9sZHRfZnJvbV9ob3N0KHB0ciwgYnl0ZWNvdW50KTsKKworCW11dGV4X2xvY2soJmxkdC0+bG9jayk7CisJaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKSB7CisJCXNpemUgPSBMRFRfRU5UUllfU0laRSpMRFRfRElSRUNUX0VOVFJJRVM7CisJCWlmIChzaXplID4gYnl0ZWNvdW50KQorCQkJc2l6ZSA9IGJ5dGVjb3VudDsKKwkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGxkdC0+dS5lbnRyaWVzLCBzaXplKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJ5dGVjb3VudCAtPSBzaXplOworCQlwdHIgKz0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCWZvciAoaT0wOyBpPGxkdC0+ZW50cnlfY291bnQvTERUX0VOVFJJRVNfUEVSX1BBR0UgJiYgYnl0ZWNvdW50OworCQkgICAgIGkrKykgeworCQkJc2l6ZSA9IFBBR0VfU0laRTsKKwkJCWlmIChzaXplID4gYnl0ZWNvdW50KQorCQkJCXNpemUgPSBieXRlY291bnQ7CisJCQlpZiAoY29weV90b191c2VyKHB0ciwgbGR0LT51LnBhZ2VzW2ldLCBzaXplKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlieXRlY291bnQgLT0gc2l6ZTsKKwkJCXB0ciArPSBzaXplOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKKworCWlmIChieXRlY291bnQgPT0gMCB8fCBlcnIgPT0gLUVGQVVMVCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY2xlYXJfdXNlcihwdHIsIGJ5dGVjb3VudCkpCisJCWVyciA9IC1FRkFVTFQ7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisKKwlpZiAoYnl0ZWNvdW50ID4gNSpMRFRfRU5UUllfU0laRSkKKwkJYnl0ZWNvdW50ID0gNSpMRFRfRU5UUllfU0laRTsKKworCWVyciA9IGJ5dGVjb3VudDsKKwkvKgorCSAqIFVNTCBkb2Vzbid0IHN1cHBvcnQgbGNhbGw3IGFuZCBsY2FsbDI3LgorCSAqIFNvLCB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhIGRlZmF1bHQgbGR0LCBidXQgZW11bGF0ZQorCSAqIGFuIGVtcHR5IGxkdCBvZiBjb21tb24gaG9zdCBkZWZhdWx0IGxkdCBzaXplLgorCSAqLworCWlmIChjbGVhcl91c2VyKHB0ciwgYnl0ZWNvdW50KSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IGZ1bmMpCit7CisJdW1sX2xkdF90ICpsZHQgPSAmY3VycmVudC0+bW0tPmNvbnRleHQuYXJjaC5sZHQ7CisJc3RydWN0IG1tX2lkICogbW1faWRwID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LmlkOworCWludCBpLCBlcnI7CisJc3RydWN0IHVzZXJfZGVzYyBsZHRfaW5mbzsKKwlzdHJ1Y3QgbGR0X2VudHJ5IGVudHJ5MCwgKmxkdF9wOworCXZvaWQgKmFkZHIgPSBOVUxMOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoYnl0ZWNvdW50ICE9IHNpemVvZihsZHRfaW5mbykpCisJCWdvdG8gb3V0OworCWVyciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZsZHRfaW5mbywgcHRyLCBzaXplb2YobGR0X2luZm8pKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmIChsZHRfaW5mby5lbnRyeV9udW1iZXIgPj0gTERUX0VOVFJJRVMpCisJCWdvdG8gb3V0OworCWlmIChsZHRfaW5mby5jb250ZW50cyA9PSAzKSB7CisJCWlmIChmdW5jID09IDEpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxkdF9pbmZvLnNlZ19ub3RfcHJlc2VudCA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKCFwdHJhY2VfbGR0KQorCQltdXRleF9sb2NrKCZsZHQtPmxvY2spOworCisJZXJyID0gd3JpdGVfbGR0X2VudHJ5KG1tX2lkcCwgZnVuYywgJmxkdF9pbmZvLCAmYWRkciwgMSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCWVsc2UgaWYgKHB0cmFjZV9sZHQpIHsKKwkJLyogV2l0aCBQVFJBQ0VfTERUIGF2YWlsYWJsZSwgdGhpcyBpcyB1c2VkIGFzIGEgZmxhZyBvbmx5ICovCisJCWxkdC0+ZW50cnlfY291bnQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGR0X2luZm8uZW50cnlfbnVtYmVyID49IGxkdC0+ZW50cnlfY291bnQgJiYKKwkgICAgbGR0X2luZm8uZW50cnlfbnVtYmVyID49IExEVF9ESVJFQ1RfRU5UUklFUykgeworCQlmb3IgKGk9bGR0LT5lbnRyeV9jb3VudC9MRFRfRU5UUklFU19QRVJfUEFHRTsKKwkJICAgICBpKkxEVF9FTlRSSUVTX1BFUl9QQUdFIDw9IGxkdF9pbmZvLmVudHJ5X251bWJlcjsKKwkJICAgICBpKyspIHsKKwkJCWlmIChpID09IDApCisJCQkJbWVtY3B5KCZlbnRyeTAsIGxkdC0+dS5lbnRyaWVzLAorCQkJCSAgICAgICBzaXplb2YoZW50cnkwKSk7CisJCQlsZHQtPnUucGFnZXNbaV0gPSAoc3RydWN0IGxkdF9lbnRyeSAqKQorCQkJCV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCQkJaWYgKCFsZHQtPnUucGFnZXNbaV0pIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCS8qIFVuZG8gdGhlIGNoYW5nZSBpbiBob3N0ICovCisJCQkJbWVtc2V0KCZsZHRfaW5mbywgMCwgc2l6ZW9mKGxkdF9pbmZvKSk7CisJCQkJd3JpdGVfbGR0X2VudHJ5KG1tX2lkcCwgMSwgJmxkdF9pbmZvLCAmYWRkciwgMSk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCW1lbWNweShsZHQtPnUucGFnZXNbMF0sICZlbnRyeTAsCisJCQkJICAgICAgIHNpemVvZihlbnRyeTApKTsKKwkJCQltZW1jcHkobGR0LT51LnBhZ2VzWzBdKzEsIGxkdC0+dS5lbnRyaWVzKzEsCisJCQkJICAgICAgIHNpemVvZihlbnRyeTApKihMRFRfRElSRUNUX0VOVFJJRVMtMSkpOworCQkJfQorCQkJbGR0LT5lbnRyeV9jb3VudCA9IChpICsgMSkgKiBMRFRfRU5UUklFU19QRVJfUEFHRTsKKwkJfQorCX0KKwlpZiAobGR0LT5lbnRyeV9jb3VudCA8PSBsZHRfaW5mby5lbnRyeV9udW1iZXIpCisJCWxkdC0+ZW50cnlfY291bnQgPSBsZHRfaW5mby5lbnRyeV9udW1iZXIgKyAxOworCisJaWYgKGxkdC0+ZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKQorCQlsZHRfcCA9IGxkdC0+dS5lbnRyaWVzICsgbGR0X2luZm8uZW50cnlfbnVtYmVyOworCWVsc2UKKwkJbGR0X3AgPSBsZHQtPnUucGFnZXNbbGR0X2luZm8uZW50cnlfbnVtYmVyL0xEVF9FTlRSSUVTX1BFUl9QQUdFXSArCisJCQlsZHRfaW5mby5lbnRyeV9udW1iZXIlTERUX0VOVFJJRVNfUEVSX1BBR0U7CisKKwlpZiAobGR0X2luZm8uYmFzZV9hZGRyID09IDAgJiYgbGR0X2luZm8ubGltaXQgPT0gMCAmJgorCSAgIChmdW5jID09IDEgfHwgTERUX2VtcHR5KCZsZHRfaW5mbykpKSB7CisJCWxkdF9wLT5hID0gMDsKKwkJbGR0X3AtPmIgPSAwOworCX0KKwllbHNleworCQlpZiAoZnVuYyA9PSAxKQorCQkJbGR0X2luZm8udXNlYWJsZSA9IDA7CisJCWxkdF9wLT5hID0gTERUX2VudHJ5X2EoJmxkdF9pbmZvKTsKKwkJbGR0X3AtPmIgPSBMRFRfZW50cnlfYigmbGR0X2luZm8pOworCX0KKwllcnIgPSAwOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmbGR0LT5sb2NrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9uZyBkb19tb2RpZnlfbGR0X3NrYXMoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBieXRlY291bnQpCit7CisJaW50IHJldCA9IC1FTk9TWVM7CisKKwlzd2l0Y2ggKGZ1bmMpIHsKKwkJY2FzZSAwOgorCQkJcmV0ID0gcmVhZF9sZHQocHRyLCBieXRlY291bnQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJY2FzZSAweDExOgorCQkJcmV0ID0gd3JpdGVfbGR0KHB0ciwgYnl0ZWNvdW50LCBmdW5jKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZXQgPSByZWFkX2RlZmF1bHRfbGR0KHB0ciwgYnl0ZWNvdW50KTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhvc3RfbGR0X2xvY2spOworc3RhdGljIHNob3J0IGR1bW15X2xpc3RbOV0gPSB7MCwgLTF9Oworc3RhdGljIHNob3J0ICogaG9zdF9sZHRfZW50cmllcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGxkdF9nZXRfaG9zdF9pbmZvKHZvaWQpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IGxkdF9lbnRyeSAqIGxkdDsKKwlzaG9ydCAqdG1wOworCWludCBpLCBzaXplLCBrLCBvcmRlcjsKKworCXNwaW5fbG9jaygmaG9zdF9sZHRfbG9jayk7CisKKwlpZiAoaG9zdF9sZHRfZW50cmllcyAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZob3N0X2xkdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdCsxOworCisJc3Bpbl91bmxvY2soJmhvc3RfbGR0X2xvY2spOworCisJZm9yIChpID0gTERUX1BBR0VTX01BWC0xLCBvcmRlcj0wOyBpOyBpPj49MSwgb3JkZXIrKykKKwkJOworCisJbGR0ID0gKHN0cnVjdCBsZHRfZW50cnkgKikKKwkgICAgICBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfWkVSTywgb3JkZXIpOworCWlmIChsZHQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxkdF9nZXRfaG9zdF9pbmZvOiBjb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgIgorCQkgICAgICAgImZvciBob3N0IGxkdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlyZXQgPSBtb2RpZnlfbGR0KDAsIGxkdCwgKDE8PG9yZGVyKSpQQUdFX1NJWkUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGR0X2dldF9ob3N0X2luZm86IGNvdWxkbid0IHJlYWQgaG9zdCBsZHRcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJLyogZGVmYXVsdF9sZHQgaXMgYWN0aXZlLCBzaW1wbHkgd3JpdGUgYW4gZW1wdHkgZW50cnkgMCAqLworCQlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlmb3IgKGk9MCwgc2l6ZT0wOyBpPHJldC9MRFRfRU5UUllfU0laRTsgaSsrKSB7CisJCWlmIChsZHRbaV0uYSAhPSAwIHx8IGxkdFtpXS5iICE9IDApCisJCQlzaXplKys7CisJfQorCisJaWYgKHNpemUgPCBBUlJBWV9TSVpFKGR1bW15X2xpc3QpKQorCQlob3N0X2xkdF9lbnRyaWVzID0gZHVtbXlfbGlzdDsKKwllbHNlIHsKKwkJc2l6ZSA9IChzaXplICsgMSkgKiBzaXplb2YoZHVtbXlfbGlzdFswXSk7CisJCXRtcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJsZHRfZ2V0X2hvc3RfaW5mbzogY291bGRuJ3QgYWxsb2NhdGUgIgorCQkJICAgICAgICJob3N0IGxkdCBsaXN0XG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaG9zdF9sZHRfZW50cmllcyA9IHRtcDsKKwl9CisKKwlmb3IgKGk9MCwgaz0wOyBpPHJldC9MRFRfRU5UUllfU0laRTsgaSsrKSB7CisJCWlmIChsZHRbaV0uYSAhPSAwIHx8IGxkdFtpXS5iICE9IDApCisJCQlob3N0X2xkdF9lbnRyaWVzW2srK10gPSBpOworCX0KKwlob3N0X2xkdF9lbnRyaWVzW2tdID0gLTE7CisKK291dF9mcmVlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbGR0LCBvcmRlcik7Cit9CisKK2xvbmcgaW5pdF9uZXdfbGR0KHN0cnVjdCBtbV9jb250ZXh0ICpuZXdfbW0sIHN0cnVjdCBtbV9jb250ZXh0ICpmcm9tX21tKQoreworCXN0cnVjdCB1c2VyX2Rlc2MgZGVzYzsKKwlzaG9ydCAqIG51bV9wOworCWludCBpOworCWxvbmcgcGFnZSwgZXJyPTA7CisJdm9pZCAqYWRkciA9IE5VTEw7CisJc3RydWN0IHByb2NfbW1fb3AgY29weTsKKworCisJaWYgKCFwdHJhY2VfbGR0KQorCQltdXRleF9pbml0KCZuZXdfbW0tPmFyY2gubGR0LmxvY2spOworCisJaWYgKCFmcm9tX21tKSB7CisJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBpbml0aWFsaXplIGEgY2xlYW4gbGR0LgorCQkgKi8KKwkJaWYgKHByb2NfbW0pIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbmV3IG1tIHdhcyBjcmVhdGVkIHVzaW5nIHByb2NfbW0sIGhvc3QncworCQkJICogZGVmYXVsdC1sZHQgY3VycmVudGx5IGlzIGFzc2lnbmVkLCB3aGljaCBub3JtYWxseQorCQkJICogY29udGFpbnMgdGhlIGNhbGwtZ2F0ZXMgZm9yIGxjYWxsNyBhbmQgbGNhbGwyNy4KKwkJCSAqIFRvIHJlbW92ZSB0aGVzZSBnYXRlcywgd2Ugc2ltcGx5IHdyaXRlIGFuIGVtcHR5CisJCQkgKiBlbnRyeSBhcyBudW1iZXIgMCB0byB0aGUgaG9zdC4KKwkJCSAqLworCQkJZXJyID0gd3JpdGVfbGR0X2VudHJ5KCZuZXdfbW0tPmlkLCAxLCAmZGVzYywgJmFkZHIsIDEpOworCQl9CisJCWVsc2V7CisJCQkvKgorCQkJICogTm93IHdlIHRyeSB0byByZXRyaWV2ZSBpbmZvIGFib3V0IHRoZSBsZHQsIHdlCisJCQkgKiBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdC4gQWxsIGxkdC1lbnRyaWVzIGZvdW5kCisJCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAorCQkJICovCisJCQlsZHRfZ2V0X2hvc3RfaW5mbygpOworCQkJZm9yIChudW1fcD1ob3N0X2xkdF9lbnRyaWVzOyAqbnVtX3AgIT0gLTE7IG51bV9wKyspIHsKKwkJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKKwkJCQllcnIgPSB3cml0ZV9sZHRfZW50cnkoJm5ld19tbS0+aWQsIDEsICZkZXNjLAorCQkJCQkJICAgICAgJmFkZHIsICoobnVtX3AgKyAxKSA9PSAtMSk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmV3X21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCA9IDA7CisKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHByb2NfbW0pIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHZhbGlkIGZyb21fbW0sIHNvIHdlIG5vdyBoYXZlIHRvIGNvcHkgdGhlIExEVCBvZgorCQkgKiBmcm9tX21tIHRvIG5ld19tbSwgYmVjYXVzZSB1c2luZyBwcm9jX21tIGFuIG5ldyBtbSB3aXRoCisJCSAqIGFuIGVtcHR5L2RlZmF1bHQgTERUIHdhcyBjcmVhdGVkIGluIG5ld19tbSgpCisJCSAqLworCQljb3B5ID0gKChzdHJ1Y3QgcHJvY19tbV9vcCkgeyAub3AgCT0gTU1fQ09QWV9TRUdNRU5UUywKKwkJCQkJICAgICAgLnUgCT0KKwkJCQkJICAgICAgeyAuY29weV9zZWdtZW50cyA9CisJCQkJCQkJZnJvbV9tbS0+aWQudS5tbV9mZCB9IH0gKTsKKwkJaSA9IG9zX3dyaXRlX2ZpbGUobmV3X21tLT5pZC51Lm1tX2ZkLCAmY29weSwgc2l6ZW9mKGNvcHkpKTsKKwkJaWYgKGkgIT0gc2l6ZW9mKGNvcHkpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJuZXdfbW0gOiAvcHJvYy9tbSBjb3B5X3NlZ21lbnRzICIKKwkJCSAgICAgICAiZmFpbGVkLCBlcnIgPSAlZFxuIiwgLWkpOworCX0KKworCWlmICghcHRyYWNlX2xkdCkgeworCQkvKgorCQkgKiBPdXIgbG9jYWwgTERUIGlzIHVzZWQgdG8gc3VwcGx5IHRoZSBkYXRhIGZvcgorCQkgKiBtb2RpZnlfbGR0KFJFQURMRFQpLCBpZiBQVFJBQ0VfTERUIGlzbid0IGF2YWlsYWJsZSwKKwkJICogaS5lLiwgd2UgaGF2ZSB0byB1c2UgdGhlIHN0dWIgZm9yIG1vZGlmeV9sZHQsIHdoaWNoCisJCSAqIGNhbid0IGhhbmRsZSB0aGUgYmlnIHJlYWQgYnVmZmVyIG9mIHVwIHRvIDY0a0IuCisJCSAqLworCQltdXRleF9sb2NrKCZmcm9tX21tLT5hcmNoLmxkdC5sb2NrKTsKKwkJaWYgKGZyb21fbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykKKwkJCW1lbWNweShuZXdfbW0tPmFyY2gubGR0LnUuZW50cmllcywgZnJvbV9tbS0+YXJjaC5sZHQudS5lbnRyaWVzLAorCQkJICAgICAgIHNpemVvZihuZXdfbW0tPmFyY2gubGR0LnUuZW50cmllcykpOworCQllbHNlIHsKKwkJCWkgPSBmcm9tX21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOworCQkJd2hpbGUgKGktLT4wKSB7CisJCQkJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCQkJCWlmICghcGFnZSkgeworCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbmV3X21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldID0KKwkJCQkJKHN0cnVjdCBsZHRfZW50cnkgKikgcGFnZTsKKwkJCQltZW1jcHkobmV3X21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldLAorCQkJCSAgICAgICBmcm9tX21tLT5hcmNoLmxkdC51LnBhZ2VzW2ldLCBQQUdFX1NJWkUpOworCQkJfQorCQl9CisJCW5ld19tbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPSBmcm9tX21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudDsKKwkJbXV0ZXhfdW5sb2NrKCZmcm9tX21tLT5hcmNoLmxkdC5sb2NrKTsKKwl9CisKKyAgICBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCit2b2lkIGZyZWVfbGR0KHN0cnVjdCBtbV9jb250ZXh0ICptbSkKK3sKKwlpbnQgaTsKKworCWlmICghcHRyYWNlX2xkdCAmJiBtbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPiBMRFRfRElSRUNUX0VOVFJJRVMpIHsKKwkJaSA9IG1tLT5hcmNoLmxkdC5lbnRyeV9jb3VudCAvIExEVF9FTlRSSUVTX1BFUl9QQUdFOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCWZyZWVfcGFnZSgobG9uZykgbW0tPmFyY2gubGR0LnUucGFnZXNbaV0pOworCX0KKwltbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPSAwOworfQorCitpbnQgc3lzX21vZGlmeV9sZHQoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCXJldHVybiBkb19tb2RpZnlfbGR0X3NrYXMoZnVuYywgcHRyLCBieXRlY291bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9tZW0uYyBiL2FyY2gveDg2L3VtL21lbV8zMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L21lbS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9tZW1fMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L21lbS5jIGIvYXJjaC94ODYvdW0vbWVtXzY0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC9tZW0uYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vbWVtXzY0LmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL29zLUxpbnV4L01ha2VmaWxlIGIvYXJjaC94ODYvdW0vb3MtTGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyMKKworb2JqLXkgPSByZWdpc3RlcnMubyB0YXNrX3NpemUubyBtY29udGV4dC5vCisKK29iai0kKENPTkZJR19YODZfMzIpICs9IHRscy5vCitvYmotJChDT05GSUdfNjRCSVQpICs9IHByY3RsLm8KKworVVNFUl9PQkpTIDo9ICQob2JqLXkpCisKK2luY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9vcy1MaW51eC9tY29udGV4dC5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvbWNvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMzZDcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vb3MtTGludXgvbWNvbnRleHQuYwpAQCAtMCwwICsxLDMxIEBACisjaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlLmg+CisKK3ZvaWQgZ2V0X3JlZ3NfZnJvbV9tYyhzdHJ1Y3QgdW1sX3B0X3JlZ3MgKnJlZ3MsIG1jb250ZXh0X3QgKm1jKQoreworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIENPUFkyKFgsWSkgcmVncy0+Z3BbWF0gPSBtYy0+Z3JlZ3NbUkVHXyMjWV0KKyNkZWZpbmUgQ09QWShYKSByZWdzLT5ncFtYXSA9IG1jLT5ncmVnc1tSRUdfIyNYXQorI2RlZmluZSBDT1BZX1NFRyhYKSByZWdzLT5ncFtYXSA9IG1jLT5ncmVnc1tSRUdfIyNYXSAmIDB4ZmZmZjsKKyNkZWZpbmUgQ09QWV9TRUdfQ1BMMyhYKSByZWdzLT5ncFtYXSA9IChtYy0+Z3JlZ3NbUkVHXyMjWF0gJiAweGZmZmYpIHwgMzsKKwlDT1BZX1NFRyhHUyk7IENPUFlfU0VHKEZTKTsgQ09QWV9TRUcoRVMpOyBDT1BZX1NFRyhEUyk7CisJQ09QWShFREkpOyBDT1BZKEVTSSk7IENPUFkoRUJQKTsKKwlDT1BZMihVRVNQLCBFU1ApOyAvKiBzaWMgKi8KKwlDT1BZKEVCWCk7IENPUFkoRURYKTsgQ09QWShFQ1gpOyBDT1BZKEVBWCk7CisJQ09QWShFSVApOyBDT1BZX1NFR19DUEwzKENTKTsgQ09QWShFRkwpOyBDT1BZX1NFR19DUEwzKFNTKTsKKyNlbHNlCisjZGVmaW5lIENPUFkyKFgsWSkgcmVncy0+Z3BbWC9zaXplb2YodW5zaWduZWQgbG9uZyldID0gbWMtPmdyZWdzW1JFR18jI1ldCisjZGVmaW5lIENPUFkoWCkgcmVncy0+Z3BbWC9zaXplb2YodW5zaWduZWQgbG9uZyldID0gbWMtPmdyZWdzW1JFR18jI1hdCisJQ09QWShSOCk7IENPUFkoUjkpOyBDT1BZKFIxMCk7IENPUFkoUjExKTsKKwlDT1BZKFIxMik7IENPUFkoUjEzKTsgQ09QWShSMTQpOyBDT1BZKFIxNSk7CisJQ09QWShSREkpOyBDT1BZKFJTSSk7IENPUFkoUkJQKTsgQ09QWShSQlgpOworCUNPUFkoUkRYKTsgQ09QWShSQVgpOyBDT1BZKFJDWCk7IENPUFkoUlNQKTsKKwlDT1BZKFJJUCk7CisJQ09QWTIoRUZMQUdTLCBFRkwpOworCUNPUFkyKENTLCBDU0dTRlMpOworCXJlZ3MtPmdwW0NTIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXSAmPSAweGZmZmY7CisJcmVncy0+Z3BbQ1MgLyBzaXplb2YodW5zaWduZWQgbG9uZyldIHw9IDM7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9wcmN0bC5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvcHJjdGwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3ByY3RsLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL29zLUxpbnV4L3ByY3RsLmMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL29zLUxpbnV4L3JlZ2lzdGVycy5jIGIvYXJjaC94ODYvdW0vb3MtTGludXgvcmVnaXN0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkYmI4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L3JlZ2lzdGVycy5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBhdGhTY2FsZSwgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2VuZGlmCisjaW5jbHVkZSAibG9uZ2ptcC5oIgorI2luY2x1ZGUgInN5c2RlcC9wdHJhY2VfdXNlci5oIgorCitpbnQgc2F2ZV9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCitpbnQgcmVzdG9yZV9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9TRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCisjaWZkZWYgX19pMzg2X18KK2ludCBoYXZlX2ZweF9yZWdzID0gMTsKK2ludCBzYXZlX2ZweF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqZnBfcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRGUFhSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKwlyZXR1cm4gMDsKK30KKworaW50IHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQoreworCWlmIChwdHJhY2UoUFRSQUNFX1NFVEZQWFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzKQoreworCWlmIChoYXZlX2ZweF9yZWdzKQorCQlyZXR1cm4gc2F2ZV9mcHhfcmVnaXN0ZXJzKHBpZCwgcmVncyk7CisJZWxzZQorCQlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlpZiAoaGF2ZV9mcHhfcmVncykKKwkJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyhwaWQsIHJlZ3MpOworCWVsc2UKKwkJcmV0dXJuIHJlc3RvcmVfZnBfcmVnaXN0ZXJzKHBpZCwgcmVncyk7Cit9CisKK3ZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKQoreworCXN0cnVjdCB1c2VyX2ZweHJlZ3Nfc3RydWN0IGZweF9yZWdzOworCWludCBlcnI7CisKKwllcnIgPSBwdHJhY2UoUFRSQUNFX0dFVEZQWFJFR1MsIHBpZCwgMCwgJmZweF9yZWdzKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuOworCisJaWYgKGVycm5vICE9IEVJTykKKwkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IFBUUkFDRV9HRVRGUFhSRUdTIGZhaWxlZCwgZXJybm8gPSAlZCIsCisJCSAgICAgIGVycm5vKTsKKworCWhhdmVfZnB4X3JlZ3MgPSAwOworfQorI2Vsc2UKKworaW50IGdldF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlyZXR1cm4gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworaW50IHB1dF9mcF9yZWdpc3RlcnMoaW50IHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnMocGlkLCByZWdzKTsKK30KKworI2VuZGlmCisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3RocmVhZF9yZWcoaW50IHJlZywgam1wX2J1ZiAqYnVmKQoreworCXN3aXRjaCAocmVnKSB7CisjaWZkZWYgX19pMzg2X18KKwljYXNlIEhPU1RfSVA6CisJCXJldHVybiBidWZbMF0tPl9fZWlwOworCWNhc2UgSE9TVF9TUDoKKwkJcmV0dXJuIGJ1ZlswXS0+X19lc3A7CisJY2FzZSBIT1NUX0JQOgorCQlyZXR1cm4gYnVmWzBdLT5fX2VicDsKKyNlbHNlCisJY2FzZSBIT1NUX0lQOgorCQlyZXR1cm4gYnVmWzBdLT5fX3JpcDsKKwljYXNlIEhPU1RfU1A6CisJCXJldHVybiBidWZbMF0tPl9fcnNwOworCWNhc2UgSE9TVF9CUDoKKwkJcmV0dXJuIGJ1ZlswXS0+X19yYnA7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGsoVU1fS0VSTl9FUlIgImdldF90aHJlYWRfcmVncyAtIHVua25vd24gcmVnaXN0ZXIgJWRcbiIsCisJCSAgICAgICByZWcpOworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9vcy1MaW51eC90YXNrX3NpemUuYyBiL2FyY2gveDg2L3VtL29zLUxpbnV4L3Rhc2tfc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9vcy1MaW51eC90YXNrX3NpemUuYwpAQCAtMCwwICsxLDE1MCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJsb25nam1wLmgiCisKKyNpZmRlZiBfX2kzODZfXworCitzdGF0aWMgam1wX2J1ZiBidWY7CisKK3N0YXRpYyB2b2lkIHNlZ2ZhdWx0KGludCBzaWcpCit7CisJbG9uZ2ptcChidWYsIDEpOworfQorCitzdGF0aWMgaW50IHBhZ2Vfb2sodW5zaWduZWQgbG9uZyBwYWdlKQoreworCXVuc2lnbmVkIGxvbmcgKmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyAqKSAocGFnZSA8PCBVTV9LRVJOX1BBR0VfU0hJRlQpOworCXVuc2lnbmVkIGxvbmcgbiA9IH4wVUw7CisJdm9pZCAqbWFwcGVkID0gTlVMTDsKKwlpbnQgb2sgPSAwOworCisJLyoKKwkgKiBGaXJzdCBzZWUgaWYgdGhlIHBhZ2UgaXMgcmVhZGFibGUuICBJZiBpdCBpcywgaXQgbWF5IHN0aWxsCisJICogYmUgYSBWRFNPLCBzbyB3ZSBnbyBvbiB0byBzZWUgaWYgaXQncyB3cml0YWJsZS4gIElmIG5vdAorCSAqIHRoZW4gdHJ5IG1hcHBpbmcgbWVtb3J5IHRoZXJlLiAgSWYgdGhhdCBmYWlscywgdGhlbiB3ZSdyZQorCSAqIHN0aWxsIGluIHRoZSBrZXJuZWwgYXJlYS4gIEFzIGEgc2FuaXR5IGNoZWNrLCB3ZSdsbCBmYWlsIGlmCisJICogdGhlIG1tYXAgc3VjY2VlZHMsIGJ1dCBnaXZlcyB1cyBhbiBhZGRyZXNzIGRpZmZlcmVudCBmcm9tCisJICogd2hhdCB3ZSB3YW50ZWQuCisJICovCisJaWYgKHNldGptcChidWYpID09IDApCisJCW4gPSAqYWRkcmVzczsKKwllbHNlIHsKKwkJbWFwcGVkID0gbW1hcChhZGRyZXNzLCBVTV9LRVJOX1BBR0VfU0laRSwKKwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKwkJaWYgKG1hcHBlZCA9PSBNQVBfRkFJTEVEKQorCQkJcmV0dXJuIDA7CisJCWlmIChtYXBwZWQgIT0gYWRkcmVzcykKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTm93LCBpcyBpdCB3cml0ZWFibGU/ICBJZiBzbywgdGhlbiB3ZSdyZSBpbiB1c2VyIGFkZHJlc3MKKwkgKiBzcGFjZS4gIElmIG5vdCwgdGhlbiB0cnkgbXByb3RlY3RpbmcgaXQgYW5kIHRyeSB0aGUgd3JpdGUKKwkgKiBhZ2Fpbi4KKwkgKi8KKwlpZiAoc2V0am1wKGJ1ZikgPT0gMCkgeworCQkqYWRkcmVzcyA9IG47CisJCW9rID0gMTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChtcHJvdGVjdChhZGRyZXNzLCBVTV9LRVJOX1BBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmIChzZXRqbXAoYnVmKSA9PSAwKSB7CisJCSphZGRyZXNzID0gbjsKKwkJb2sgPSAxOworCX0KKworIG91dDoKKwlpZiAobWFwcGVkICE9IE5VTEwpCisJCW11bm1hcChtYXBwZWQsIFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlyZXR1cm4gb2s7Cit9CisKK3Vuc2lnbmVkIGxvbmcgb3NfZ2V0X3RvcF9hZGRyZXNzKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYSwgb2xkOworCXVuc2lnbmVkIGxvbmcgYm90dG9tID0gMDsKKwkvKgorCSAqIEEgMzItYml0IFVNTCBvbiBhIDY0LWJpdCBob3N0IGdldHMgY29uZnVzZWQgYWJvdXQgdGhlIFZEU08gYXQKKwkgKiAweGZmZmZlMDAwLiAgSXQgaXMgbWFwcGVkLCBpcyByZWFkYWJsZSwgY2FuIGJlIHJlcHJvdGVjdGVkIHdyaXRlYWJsZQorCSAqIGFuZCB3cml0dGVuLiAgSG93ZXZlciwgZXhlYyBkaXNjb3ZlcnMgbGF0ZXIgdGhhdCBpdCBjYW4ndCBiZQorCSAqIHVubWFwcGVkLiAgU28sIGp1c3Qgc2V0IHRoZSBoaWdoZXN0IGFkZHJlc3MgdG8gYmUgY2hlY2tlZCB0byBqdXN0CisJICogYmVsb3cgaXQuICBUaGlzIG1pZ2h0IHdhc3RlIHNvbWUgYWRkcmVzcyBzcGFjZSBvbiA0Ry80RyAzMi1iaXQKKwkgKiBob3N0cywgYnV0IHNob3VsZG4ndCBodXJ0IG90aGVyd2lzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHRvcCA9IDB4ZmZmZmQwMDAgPj4gVU1fS0VSTl9QQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgdGVzdCwgb3JpZ2luYWw7CisKKwlwcmludGYoIkxvY2F0aW5nIHRoZSBib3R0b20gb2YgdGhlIGFkZHJlc3Mgc3BhY2UgLi4uICIpOworCWZmbHVzaChzdGRvdXQpOworCisJLyoKKwkgKiBXZSdyZSBnb2luZyB0byBiZSBsb25nam1waW5nIG91dCBvZiB0aGUgc2lnbmFsIGhhbmRsZXIsIHNvCisJICogU0FfREVGRVIgbmVlZHMgdG8gYmUgc2V0LgorCSAqLworCXNhLnNhX2hhbmRsZXIgPSBzZWdmYXVsdDsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJc2Euc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCAmb2xkKSkgeworCQlwZXJyb3IoIm9zX2dldF90b3BfYWRkcmVzcyIpOworCQlleGl0KDEpOworCX0KKworCS8qIE1hbnVhbGx5IHNjYW4gdGhlIGFkZHJlc3Mgc3BhY2UsIGJvdHRvbS11cCwgdW50aWwgd2UgZmluZAorCSAqIHRoZSBmaXJzdCB2YWxpZCBwYWdlIChvciBydW4gb3V0IG9mIHRoZW0pLgorCSAqLworCWZvciAoYm90dG9tID0gMDsgYm90dG9tIDwgdG9wOyBib3R0b20rKykgeworCQlpZiAocGFnZV9vayhib3R0b20pKQorCQkJYnJlYWs7CisJfQorCisJLyogSWYgd2UndmUgZ290IHRoaXMgZmFyLCB3ZSByYW4gb3V0IG9mIHBhZ2VzLiAqLworCWlmIChib3R0b20gPT0gdG9wKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRldGVybWluZSBib3R0b20gb2YgYWRkcmVzcyAiCisJCQkic3BhY2UuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIjB4JXhcbiIsIGJvdHRvbSA8PCBVTV9LRVJOX1BBR0VfU0hJRlQpOworCXByaW50ZigiTG9jYXRpbmcgdGhlIHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSAuLi4gIik7CisJZmZsdXNoKHN0ZG91dCk7CisKKwlvcmlnaW5hbCA9IGJvdHRvbTsKKworCS8qIFRoaXMgY291bGQgaGFwcGVuIHdpdGggYSA0Ry80RyBzcGxpdCAqLworCWlmIChwYWdlX29rKHRvcCkpCisJCWdvdG8gb3V0OworCisJZG8geworCQl0ZXN0ID0gYm90dG9tICsgKHRvcCAtIGJvdHRvbSkgLyAyOworCQlpZiAocGFnZV9vayh0ZXN0KSkKKwkJCWJvdHRvbSA9IHRlc3Q7CisJCWVsc2UKKwkJCXRvcCA9IHRlc3Q7CisJfSB3aGlsZSAodG9wIC0gYm90dG9tID4gMSk7CisKK291dDoKKwkvKiBSZXN0b3JlIHRoZSBvbGQgU0lHU0VHViBoYW5kbGluZyAqLworCWlmIChzaWdhY3Rpb24oU0lHU0VHViwgJm9sZCwgTlVMTCkpIHsKKwkJcGVycm9yKCJvc19nZXRfdG9wX2FkZHJlc3MiKTsKKwkJZXhpdCgxKTsKKwl9CisJdG9wIDw8PSBVTV9LRVJOX1BBR0VfU0hJRlQ7CisJcHJpbnRmKCIweCV4XG4iLCB0b3ApOworCisJcmV0dXJuIHRvcDsKK30KKworI2Vsc2UKKwordW5zaWduZWQgbG9uZyBvc19nZXRfdG9wX2FkZHJlc3Modm9pZCkKK3sKKwkvKiBUaGUgb2xkIHZhbHVlIG9mIENPTkZJR19UT1BfQUREUiAqLworCXJldHVybiAweDdmYzAwMDAwMDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vb3MtTGludXgvdGxzLmMgYi9hcmNoL3g4Ni91bS9vcy1MaW51eC90bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjI3NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vb3MtTGludXgvdGxzLmMKQEAgLTAsMCArMSw2NyBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInN5c2RlcC90bHMuaCIKKworI2lmbmRlZiBQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBCisjZGVmaW5lIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUEgMjUKKyNlbmRpZgorCisjaWZuZGVmIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEKKyNkZWZpbmUgUFRSQUNFX1NFVF9USFJFQURfQVJFQSAyNgorI2VuZGlmCisKKy8qIENoZWNrcyB3aGV0aGVyIGhvc3Qgc3VwcG9ydHMgVExTLCBhbmQgc2V0cyAqdGxzX21pbiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCisgKiB2YWxpZCBvbiB0aGUgaG9zdC4KKyAqIGkzODYgaG9zdCBoYXZlIGl0ID09IDY7IHg4Nl82NCBob3N0IGhhdmUgaXQgPT0gMTIsIGZvciBpMzg2IGVtdWxhdGlvbi4gKi8KK3ZvaWQgY2hlY2tfaG9zdF9zdXBwb3J0c190bHMoaW50ICpzdXBwb3J0c190bHMsIGludCAqdGxzX21pbikKK3sKKwkvKiBWYWx1ZXMgZm9yIHg4NiBhbmQgeDg2XzY0LiovCisJaW50IHZhbFtdID0ge0dEVF9FTlRSWV9UTFNfTUlOX0kzODYsIEdEVF9FTlRSWV9UTFNfTUlOX1g4Nl82NH07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWwpOyBpKyspIHsKKwkJdXNlcl9kZXNjX3QgaW5mbzsKKwkJaW5mby5lbnRyeV9udW1iZXIgPSB2YWxbaV07CisKKwkJaWYgKHN5c2NhbGwoX19OUl9nZXRfdGhyZWFkX2FyZWEsICZpbmZvKSA9PSAwKSB7CisJCQkqdGxzX21pbiA9IHZhbFtpXTsKKwkJCSpzdXBwb3J0c190bHMgPSAxOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKGVycm5vID09IEVJTlZBTCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKGVycm5vID09IEVOT1NZUykKKwkJCQkqc3VwcG9ydHNfdGxzID0gMDsKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwkqc3VwcG9ydHNfdGxzID0gMDsKK30KKworaW50IG9zX3NldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHRyYWNlKFBUUkFDRV9TRVRfVEhSRUFEX0FSRUEsIHBpZCwgaW5mby0+ZW50cnlfbnVtYmVyLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gLWVycm5vOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvc19nZXRfdGhyZWFkX2FyZWEodXNlcl9kZXNjX3QgKmluZm8sIGludCBwaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHB0cmFjZShQVFJBQ0VfR0VUX1RIUkVBRF9BUkVBLCBwaWQsIGluZm8tPmVudHJ5X251bWJlciwKKwkJICAgICAodW5zaWduZWQgbG9uZykgaW5mbyk7CisJaWYgKHJldCA8IDApCisJCXJldCA9IC1lcnJubzsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzMyLmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0OWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgImxpbnV4L21tLmgiCisjaW5jbHVkZSAibGludXgvc2NoZWQuaCIKKyNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgorI2luY2x1ZGUgInNrYXMuaCIKKworZXh0ZXJuIGludCBhcmNoX3N3aXRjaF90bHMoc3RydWN0IHRhc2tfc3RydWN0ICp0byk7CisKK3ZvaWQgYXJjaF9zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICp0bykKK3sKKwlpbnQgZXJyID0gYXJjaF9zd2l0Y2hfdGxzKHRvKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuOworCisJaWYgKGVyciAhPSAtRUlOVkFMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmNoX3N3aXRjaF90bHMgZmFpbGVkLCBlcnJubyAlZCwgIgorCQkgICAgICAgIm5vdCBFSU5WQUxcbiIsIC1lcnIpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJjaF9zd2l0Y2hfdGxzIGZhaWxlZCwgZXJybm8gPSBFSU5WQUxcbiIpOworfQorCitpbnQgaXNfc3lzY2FsbCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgaW5zdHI7CisJaW50IG47CisKKwluID0gY29weV9mcm9tX3VzZXIoJmluc3RyLCAodm9pZCBfX3VzZXIgKikgYWRkciwgc2l6ZW9mKGluc3RyKSk7CisJaWYgKG4pIHsKKwkJLyogYWNjZXNzX3Byb2Nlc3Nfdm0oKSBncmFudHMgYWNjZXNzIHRvIHZzeXNjYWxsIGFuZCBzdHViLAorCQkgKiB3aGlsZSBjb3B5X2Zyb21fdXNlciBkb2Vzbid0LiBNYXliZSBhY2Nlc3NfcHJvY2Vzc192bSBpcworCQkgKiBzbG93LCBidXQgdGhhdCBkb2Vzbid0IG1hdHRlciwgc2luY2UgaXQgd2lsbCBiZSBjYWxsZWQgb25seQorCQkgKiBpbiBjYXNlIG9mIHNpbmdsZXN0ZXBwaW5nLCBpZiBjb3B5X2Zyb21fdXNlciBmYWlsZWQuCisJCSAqLworCQluID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY3VycmVudCwgYWRkciwgJmluc3RyLCBzaXplb2YoaW5zdHIpLCAwKTsKKwkJaWYgKG4gIT0gc2l6ZW9mKGluc3RyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpc19zeXNjYWxsIDogZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgICAgICJpbnN0cnVjdGlvbiBmcm9tIDB4JWx4XG4iLCBhZGRyKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIGludCAweDgwIG9yIHN5c2VudGVyICovCisJcmV0dXJuIChpbnN0ciA9PSAweDgwY2QpIHx8IChpbnN0ciA9PSAweDM0MGYpOworfQorCisvKiBkZXRlcm1pbmVzIHdoaWNoIGZsYWdzIHRoZSB1c2VyIGhhcyBhY2Nlc3MgdG8uICovCisvKiAxID0gYWNjZXNzIDAgPSBubyBhY2Nlc3MgKi8KKyNkZWZpbmUgRkxBR19NQVNLIDB4MDAwNDRkZDUKKworc3RhdGljIGNvbnN0IGludCByZWdfb2Zmc2V0c1tdID0geworCVtFQlhdID0gSE9TVF9CWCwKKwlbRUNYXSA9IEhPU1RfQ1gsCisJW0VEWF0gPSBIT1NUX0RYLAorCVtFU0ldID0gSE9TVF9TSSwKKwlbRURJXSA9IEhPU1RfREksCisJW0VCUF0gPSBIT1NUX0JQLAorCVtFQVhdID0gSE9TVF9BWCwKKwlbRFNdID0gSE9TVF9EUywKKwlbRVNdID0gSE9TVF9FUywKKwlbRlNdID0gSE9TVF9GUywKKwlbR1NdID0gSE9TVF9HUywKKwlbRUlQXSA9IEhPU1RfSVAsCisJW0NTXSA9IEhPU1RfQ1MsCisJW0VGTF0gPSBIT1NUX0VGTEFHUywKKwlbVUVTUF0gPSBIT1NUX1NQLAorCVtTU10gPSBIT1NUX1NTLAorfTsKKworaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJcmVnbm8gPj49IDI7CisJc3dpdGNoIChyZWdubykgeworCWNhc2UgRUJYOgorCWNhc2UgRUNYOgorCWNhc2UgRURYOgorCWNhc2UgRVNJOgorCWNhc2UgRURJOgorCWNhc2UgRUJQOgorCWNhc2UgRUFYOgorCWNhc2UgRUlQOgorCWNhc2UgVUVTUDoKKwkJYnJlYWs7CisJY2FzZSBGUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBHUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKKwkJCXJldHVybiAtRUlPOworCQl2YWx1ZSAmPSAweGZmZmY7CisJCWJyZWFrOworCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJaWYgKCh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJdmFsdWUgJj0gMHhmZmZmOworCQlicmVhazsKKwljYXNlIEVGTDoKKwkJdmFsdWUgJj0gRkxBR19NQVNLOworCQljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtIT1NUX0VGTEFHU10gfD0gdmFsdWU7CisJCXJldHVybiAwOworCWNhc2UgT1JJR19FQVg6CisJCWNoaWxkLT50aHJlYWQucmVncy5yZWdzLnN5c2NhbGwgPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdCA6CisJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gcHV0cmVnKCkgOiAlZFxuIiwgcmVnbm8pOworCX0KKwljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtyZWdfb2Zmc2V0c1tyZWdub11dID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwb2tlX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKGFkZHIgPCBNQVhfUkVHX09GRlNFVCkKKwkJcmV0dXJuIHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7CisJZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgorCQkgKGFkZHIgPD0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbN10pKSkgeworCQlhZGRyIC09IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKTsKKwkJYWRkciA9IGFkZHIgPj4gMjsKKwkJaWYgKChhZGRyID09IDQpIHx8IChhZGRyID09IDUpKQorCQkJcmV0dXJuIC1FSU87CisJCWNoaWxkLT50aHJlYWQuYXJjaC5kZWJ1Z3JlZ3NbYWRkcl0gPSBkYXRhOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGludCByZWdubykKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSB+MFVMOworCisJcmVnbm8gPj49IDI7CisJc3dpdGNoIChyZWdubykgeworCWNhc2UgT1JJR19FQVg6CisJCXJldHVybiBjaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5zeXNjYWxsOworCWNhc2UgRlM6CisJY2FzZSBHUzoKKwljYXNlIERTOgorCWNhc2UgRVM6CisJY2FzZSBTUzoKKwljYXNlIENTOgorCQltYXNrID0gMHhmZmZmOworCQlicmVhazsKKwljYXNlIEVJUDoKKwljYXNlIFVFU1A6CisJY2FzZSBFQVg6CisJY2FzZSBFQlg6CisJY2FzZSBFQ1g6CisJY2FzZSBFRFg6CisJY2FzZSBFU0k6CisJY2FzZSBFREk6CisJY2FzZSBFQlA6CisJY2FzZSBFRkw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gZ2V0cmVnKCkgOiAlZFxuIiwgcmVnbm8pOworCX0KKwlyZXR1cm4gbWFzayAmIGNoaWxkLT50aHJlYWQucmVncy5yZWdzLmdwW3JlZ19vZmZzZXRzW3JlZ25vXV07Cit9CisKKy8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworaW50IHBlZWtfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXRtcCA9IDA7ICAvKiBEZWZhdWx0IHJldHVybiBjb25kaXRpb24gKi8KKwlpZiAoYWRkciA8IE1BWF9SRUdfT0ZGU0VUKSB7CisJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJfQorCWVsc2UgaWYgKChhZGRyID49IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKSkgJiYKKwkJIChhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKKwkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7CisJCWFkZHIgPSBhZGRyID4+IDI7CisJCXRtcCA9IGNoaWxkLT50aHJlYWQuYXJjaC5kZWJ1Z3JlZ3NbYWRkcl07CisJfQorCXJldHVybiBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKK30KKworc3RhdGljIGludCBnZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CisKKwllcnIgPSBzYXZlX2ZwX3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sICh1bnNpZ25lZCBsb25nICopICZmcHJlZ3MpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwluID0gY29weV90b191c2VyKGJ1ZiwgJmZwcmVncywgc2l6ZW9mKGZwcmVncykpOworCWlmKG4gPiAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHNldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CisKKwluID0gY29weV9mcm9tX3VzZXIoJmZwcmVncywgYnVmLCBzaXplb2YoZnByZWdzKSk7CisJaWYgKG4gPiAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXN0b3JlX2ZwX3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sCisJCQkJICAgICh1bnNpZ25lZCBsb25nICopICZmcHJlZ3MpOworfQorCitzdGF0aWMgaW50IGdldF9mcHhyZWdzKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHJlZ3M7CisKKwllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbiA9IGNvcHlfdG9fdXNlcihidWYsICZmcHJlZ3MsIHNpemVvZihmcHJlZ3MpKTsKKwlpZihuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlpbnQgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZwcmVnczsKKworCW4gPSBjb3B5X2Zyb21fdXNlcigmZnByZWdzLCBidWYsIHNpemVvZihmcHJlZ3MpKTsKKwlpZiAobiA+IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJlc3RvcmVfZnB4X3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sCisJCQkJICAgICAodW5zaWduZWQgbG9uZyAqKSAmZnByZWdzKTsKK30KKworbG9uZyBzdWJhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCisJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVJTzsKKwl2b2lkIF9fdXNlciAqZGF0YXAgPSAodm9pZCBfX3VzZXIgKikgZGF0YTsKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBnZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogLyogU2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldCA9IHNldF9mcHJlZ3MoZGF0YXAsIGNoaWxkKTsKKwkJYnJlYWs7CisJY2FzZSBQVFJBQ0VfR0VURlBYUkVHUzogLyogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldCA9IGdldF9mcHhyZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX1NFVEZQWFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBzZXRfZnB4cmVncyhkYXRhcCwgY2hpbGQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlPOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUyYmYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMyBQYXRoU2NhbGUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjZGVmaW5lIF9fRlJBTUVfT0ZGU0VUUworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogZGV0ZXJtaW5lcyB3aGljaCBmbGFncyB0aGUgdXNlciBoYXMgYWNjZXNzIHRvLgorICogMSA9IGFjY2VzcyAwID0gbm8gYWNjZXNzCisgKi8KKyNkZWZpbmUgRkxBR19NQVNLIDB4NDRkZDVVTAorCitzdGF0aWMgY29uc3QgaW50IHJlZ19vZmZzZXRzW10gPQoreworCVtSOCA+PiAzXSA9IEhPU1RfUjgsCisJW1I5ID4+IDNdID0gSE9TVF9SOSwKKwlbUjEwID4+IDNdID0gSE9TVF9SMTAsCisJW1IxMSA+PiAzXSA9IEhPU1RfUjExLAorCVtSMTIgPj4gM10gPSBIT1NUX1IxMiwKKwlbUjEzID4+IDNdID0gSE9TVF9SMTMsCisJW1IxNCA+PiAzXSA9IEhPU1RfUjE0LAorCVtSMTUgPj4gM10gPSBIT1NUX1IxNSwKKwlbUklQID4+IDNdID0gSE9TVF9JUCwKKwlbUlNQID4+IDNdID0gSE9TVF9TUCwKKwlbUkFYID4+IDNdID0gSE9TVF9BWCwKKwlbUkJYID4+IDNdID0gSE9TVF9CWCwKKwlbUkNYID4+IDNdID0gSE9TVF9DWCwKKwlbUkRYID4+IDNdID0gSE9TVF9EWCwKKwlbUlNJID4+IDNdID0gSE9TVF9TSSwKKwlbUkRJID4+IDNdID0gSE9TVF9ESSwKKwlbUkJQID4+IDNdID0gSE9TVF9CUCwKKwlbQ1MgPj4gM10gPSBIT1NUX0NTLAorCVtTUyA+PiAzXSA9IEhPU1RfU1MsCisJW0ZTX0JBU0UgPj4gM10gPSBIT1NUX0ZTX0JBU0UsCisJW0dTX0JBU0UgPj4gM10gPSBIT1NUX0dTX0JBU0UsCisJW0RTID4+IDNdID0gSE9TVF9EUywKKwlbRVMgPj4gM10gPSBIT1NUX0VTLAorCVtGUyA+PiAzXSA9IEhPU1RfRlMsCisJW0dTID4+IDNdID0gSE9TVF9HUywKKwlbRUZMQUdTID4+IDNdID0gSE9TVF9FRkxBR1MsCisJW09SSUdfUkFYID4+IDNdID0gSE9TVF9PUklHX0FYLAorfTsKKworaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisjaWZkZWYgVElGX0lBMzIKKwkvKgorCSAqIFNvbWUgY29kZSBpbiB0aGUgNjRiaXQgZW11bGF0aW9uIG1heSBub3QgYmUgNjRiaXQgY2xlYW4uCisJICogRG9uJ3QgdGFrZSBhbnkgY2hhbmNlcy4KKwkgKi8KKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9JQTMyKSkKKwkJdmFsdWUgJj0gMHhmZmZmZmZmZjsKKyNlbmRpZgorCXN3aXRjaCAocmVnbm8pIHsKKwljYXNlIFI4OgorCWNhc2UgUjk6CisJY2FzZSBSMTA6CisJY2FzZSBSMTE6CisJY2FzZSBSMTI6CisJY2FzZSBSMTM6CisJY2FzZSBSMTQ6CisJY2FzZSBSMTU6CisJY2FzZSBSSVA6CisJY2FzZSBSU1A6CisJY2FzZSBSQVg6CisJY2FzZSBSQlg6CisJY2FzZSBSQ1g6CisJY2FzZSBSRFg6CisJY2FzZSBSU0k6CisJY2FzZSBSREk6CisJY2FzZSBSQlA6CisJY2FzZSBPUklHX1JBWDoKKwkJYnJlYWs7CisKKwljYXNlIEZTOgorCWNhc2UgR1M6CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQlyZXR1cm4gLUVJTzsKKwkJdmFsdWUgJj0gMHhmZmZmOworCQlicmVhazsKKworCWNhc2UgRlNfQkFTRToKKwljYXNlIEdTX0JBU0U6CisJCWlmICghKCh2YWx1ZSA+PiA0OCkgPT0gMCB8fCAodmFsdWUgPj4gNDgpID09IDB4ZmZmZikpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIEVGTEFHUzoKKwkJdmFsdWUgJj0gRkxBR19NQVNLOworCQljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtIT1NUX0VGTEFHU10gfD0gdmFsdWU7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBwdXRyZWcoKTogJWRcbiIsIHJlZ25vKTsKKwl9CisKKwljaGlsZC0+dGhyZWFkLnJlZ3MucmVncy5ncFtyZWdfb2Zmc2V0c1tyZWdubyA+PiAzXV0gPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBva2VfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoYWRkciA8IE1BWF9SRUdfT0ZGU0VUKQorCQlyZXR1cm4gcHV0cmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKKwllbHNlIGlmICgoYWRkciA+PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSkpICYmCisJCShhZGRyIDw9IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzddKSkpIHsKKwkJYWRkciAtPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1swXSk7CisJCWFkZHIgPSBhZGRyID4+IDI7CisJCWlmICgoYWRkciA9PSA0KSB8fCAoYWRkciA9PSA1KSkKKwkJCXJldHVybiAtRUlPOworCQljaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdID0gZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlPOworfQorCit1bnNpZ25lZCBsb25nIGdldHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBpbnQgcmVnbm8pCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gfjBVTDsKKyNpZmRlZiBUSUZfSUEzMgorCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0lBMzIpKQorCQltYXNrID0gMHhmZmZmZmZmZjsKKyNlbmRpZgorCXN3aXRjaCAocmVnbm8pIHsKKwljYXNlIFI4OgorCWNhc2UgUjk6CisJY2FzZSBSMTA6CisJY2FzZSBSMTE6CisJY2FzZSBSMTI6CisJY2FzZSBSMTM6CisJY2FzZSBSMTQ6CisJY2FzZSBSMTU6CisJY2FzZSBSSVA6CisJY2FzZSBSU1A6CisJY2FzZSBSQVg6CisJY2FzZSBSQlg6CisJY2FzZSBSQ1g6CisJY2FzZSBSRFg6CisJY2FzZSBSU0k6CisJY2FzZSBSREk6CisJY2FzZSBSQlA6CisJY2FzZSBPUklHX1JBWDoKKwljYXNlIEVGTEFHUzoKKwljYXNlIEZTX0JBU0U6CisJY2FzZSBHU19CQVNFOgorCQlicmVhazsKKwljYXNlIEZTOgorCWNhc2UgR1M6CisJY2FzZSBEUzoKKwljYXNlIEVTOgorCWNhc2UgU1M6CisJY2FzZSBDUzoKKwkJbWFzayA9IDB4ZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoIkJhZCByZWdpc3RlciBpbiBnZXRyZWc6ICVkXG4iLCByZWdubyk7CisJfQorCXJldHVybiBtYXNrICYgY2hpbGQtPnRocmVhZC5yZWdzLnJlZ3MuZ3BbcmVnX29mZnNldHNbcmVnbm8gPj4gM11dOworfQorCitpbnQgcGVla191c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDApCisJCXJldHVybiAtRUlPOworCisJdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIGNvbmRpdGlvbiAqLworCWlmIChhZGRyIDwgTUFYX1JFR19PRkZTRVQpCisJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJZWxzZSBpZiAoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgorCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKSB7CisJCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOworCQlhZGRyID0gYWRkciA+PiAyOworCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKK30KKworLyogWFhYIE1vc3RseSBjb3BpZWQgZnJvbSBzeXMtaTM4NiAqLworaW50IGlzX3N5c2NhbGwodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIHNob3J0IGluc3RyOworCWludCBuOworCisJbiA9IGNvcHlfZnJvbV91c2VyKCZpbnN0ciwgKHZvaWQgX191c2VyICopIGFkZHIsIHNpemVvZihpbnN0cikpOworCWlmIChuKSB7CisJCS8qCisJCSAqIGFjY2Vzc19wcm9jZXNzX3ZtKCkgZ3JhbnRzIGFjY2VzcyB0byB2c3lzY2FsbCBhbmQgc3R1YiwKKwkJICogd2hpbGUgY29weV9mcm9tX3VzZXIgZG9lc24ndC4gTWF5YmUgYWNjZXNzX3Byb2Nlc3Nfdm0gaXMKKwkJICogc2xvdywgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsIHNpbmNlIGl0IHdpbGwgYmUgY2FsbGVkIG9ubHkKKwkJICogaW4gY2FzZSBvZiBzaW5nbGVzdGVwcGluZywgaWYgY29weV9mcm9tX3VzZXIgZmFpbGVkLgorCQkgKi8KKwkJbiA9IGFjY2Vzc19wcm9jZXNzX3ZtKGN1cnJlbnQsIGFkZHIsICZpbnN0ciwgc2l6ZW9mKGluc3RyKSwgMCk7CisJCWlmIChuICE9IHNpemVvZihpbnN0cikpIHsKKwkJCXByaW50aygiaXNfc3lzY2FsbCA6IGZhaWxlZCB0byByZWFkIGluc3RydWN0aW9uIGZyb20gIgorCQkJICAgICAgICIweCVseFxuIiwgYWRkcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKiBzeXNlbnRlciAqLworCXJldHVybiBpbnN0ciA9PSAweDA1MGY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZwcmVncyhzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKKworCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOworCWVyciA9IHNhdmVfZnBfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgZnByZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbiA9IGNvcHlfdG9fdXNlcihidWYsIGZwcmVncywgc2l6ZW9mKGZwcmVncykpOworCWlmIChuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJbG9uZyBmcHJlZ3NbSE9TVF9GUF9TSVpFXTsKKworCUJVR19PTihzaXplb2YoKmJ1ZikgIT0gc2l6ZW9mKGZwcmVncykpOworCW4gPSBjb3B5X2Zyb21fdXNlcihmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOworCWlmIChuID4gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcmVzdG9yZV9mcF9yZWdpc3RlcnModXNlcnNwYWNlX3BpZFtjcHVdLCBmcHJlZ3MpOworfQorCitsb25nIHN1YmFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCByZXQgPSAtRUlPOworCXZvaWQgX191c2VyICpkYXRhcCA9ICh2b2lkIF9fdXNlciAqKSBkYXRhOworCisJc3dpdGNoIChyZXF1ZXN0KSB7CisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJcmV0ID0gZ2V0X2ZwcmVncyhkYXRhcCwgY2hpbGQpOworCQlicmVhazsKKwljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlyZXQgPSBzZXRfZnByZWdzKGRhdGFwLCBjaGlsZCk7CisJCWJyZWFrOworCWNhc2UgUFRSQUNFX0FSQ0hfUFJDVEw6CisJCS8qIFhYWCBDYWxscyBwdHJhY2Ugb24gdGhlIGhvc3QgLSBuZWVkcyBzb21lIFNNUCB0aGlua2luZyAqLworCQlyZXQgPSBhcmNoX3ByY3RsKGNoaWxkLCBkYXRhLCAodm9pZCBfX3VzZXIgKikgYWRkcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9wdHJhY2VfdXNlci5jIGIvYXJjaC94ODYvdW0vcHRyYWNlX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTYwY2ExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vcHRyYWNlX3VzZXIuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKKworaW50IHB0cmFjZV9nZXRyZWdzKGxvbmcgcGlkLCB1bnNpZ25lZCBsb25nICpyZWdzX291dCkKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9HRVRSRUdTLCBwaWQsIDAsIHJlZ3Nfb3V0KSA8IDApCisJCXJldHVybiAtZXJybm87CisJcmV0dXJuIDA7Cit9CisKK2ludCBwdHJhY2Vfc2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwlpZiAocHRyYWNlKFBUUkFDRV9TRVRSRUdTLCBwaWQsIDAsIHJlZ3MpIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2V0am1wLlMgYi9hcmNoL3g4Ni91bS9zZXRqbXBfMzIuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zZXRqbXAuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc2V0am1wXzMyLlMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zZXRqbXAuUyBiL2FyY2gveDg2L3VtL3NldGptcF82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc2V0am1wLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NldGptcF82NC5TCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXAuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzc2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDUgQEAKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgImFyY2hzZXRqbXBfMzIuaCIKKyNlbHNlCisjaW5jbHVkZSAiYXJjaHNldGptcF82NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wXzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcF8zMi5oCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc2hhcmVkL3N5c2RlcC9hcmNoc2V0am1wLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXBfNjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3NoYXJlZC9zeXNkZXAvYXJjaHNldGptcC5oCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2FyY2hzZXRqbXBfNjQuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm8uaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyZWNiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlICJmYXVsdGluZm9fMzIuaCIKKyNlbHNlCisjaW5jbHVkZSAiZmF1bHRpbmZvXzY0LmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvXzMyLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb18zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjA4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb18zMi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgRnVqaXRzdSBTaWVtZW5zIENvbXB1dGVycyBHbWJICisgKiBBdXRob3I6IEJvZG8gU3Ryb2Vzc2VyIDxic3Ryb2Vzc2VyQGZ1aml0c3Utc2llbWVucy5jb20+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX0ZBVUxUSU5GT19JMzg2X0gKKyNkZWZpbmUgX19GQVVMVElORk9fSTM4Nl9ICisKKy8qIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBmdWxsIGFyY2gtc3BlY2lmaWMgZmF1bHRpbmZvCisgKiBmcm9tIHRoZSB0cmFwcy4KKyAqIE9uIGkzODYsIHB0cmFjZV9mYXVsdGluZm8gdW5mb3J0dW5hdGVseSBkb2Vzbid0IHByb3ZpZGUKKyAqIGFsbCB0aGUgaW5mbywgc2luY2UgdHJhcF9ubyBpcyBtaXNzaW5nLgorICogQWxsIGNvbW1vbiBlbGVtZW50cyBhcmUgZGVmaW5lZCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbgorICogYm90aCBzdHJ1Y3R1cmVzLCB0aHVzIG1ha2luZyBpdCBlYXN5IHRvIGNvcHkgdGhlCisgKiBjb250ZW50cyB3aXRob3V0IGtub3dsZWRnZSBhYm91dCB0aGUgc3RydWN0dXJlIGVsZW1lbnRzLgorICovCitzdHJ1Y3QgZmF1bHRpbmZvIHsKKyAgICAgICAgaW50IGVycm9yX2NvZGU7IC8qIGluIHB0cmFjZV9mYXVsdGluZm8gbWlzbGVhZGluZ2x5IGNhbGxlZCBpc193cml0ZSAqLworICAgICAgICB1bnNpZ25lZCBsb25nIGNyMjsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBjYWxsZWQgYWRkciAqLworICAgICAgICBpbnQgdHJhcF9ubzsgLyogbWlzc2luZyBpbiBwdHJhY2VfZmF1bHRpbmZvICovCit9OworCisjZGVmaW5lIEZBVUxUX1dSSVRFKGZpKSAoKGZpKS5lcnJvcl9jb2RlICYgMikKKyNkZWZpbmUgRkFVTFRfQUREUkVTUyhmaSkgKChmaSkuY3IyKQorCisvKiBUaGlzIGlzIFBhZ2UgRmF1bHQgKi8KKyNkZWZpbmUgU0VHVl9JU19GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAxNCkKKworLyogU0tBUzMgaGFzIG5vIHRyYXBfbm8gb24gaTM4NiwgYnV0IGdldF9za2FzX2ZhdWx0aW5mbygpIHNldHMgaXQgdG8gMC4gKi8KKyNkZWZpbmUgU0VHVl9NQVlCRV9GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAwICYmIHB0cmFjZV9mYXVsdGluZm8pCisKKyNkZWZpbmUgUFRSQUNFX0ZVTExfRkFVTFRJTkZPIDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb182NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODExY2JlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEZ1aml0c3UgU2llbWVucyBDb21wdXRlcnMgR21iSAorICogQXV0aG9yOiBCb2RvIFN0cm9lc3NlciA8YnN0cm9lc3NlckBmdWppdHN1LXNpZW1lbnMuY29tPgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19GQVVMVElORk9fWDg2XzY0X0gKKyNkZWZpbmUgX19GQVVMVElORk9fWDg2XzY0X0gKKworLyogdGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgYXJjaC1zcGVjaWZpYyBmYXVsdGluZm8KKyAqIGZyb20gdGhlIHRyYXBzLgorICogT24gaTM4NiwgcHRyYWNlX2ZhdWx0aW5mbyB1bmZvcnR1bmF0ZWx5IGRvZXNuJ3QgcHJvdmlkZQorICogYWxsIHRoZSBpbmZvLCBzaW5jZSB0cmFwX25vIGlzIG1pc3NpbmcuCisgKiBBbGwgY29tbW9uIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluCisgKiBib3RoIHN0cnVjdHVyZXMsIHRodXMgbWFraW5nIGl0IGVhc3kgdG8gY29weSB0aGUKKyAqIGNvbnRlbnRzIHdpdGhvdXQga25vd2xlZGdlIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMuCisgKi8KK3N0cnVjdCBmYXVsdGluZm8geworICAgICAgICBpbnQgZXJyb3JfY29kZTsgLyogaW4gcHRyYWNlX2ZhdWx0aW5mbyBtaXNsZWFkaW5nbHkgY2FsbGVkIGlzX3dyaXRlICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgY3IyOyAvKiBpbiBwdHJhY2VfZmF1bHRpbmZvIGNhbGxlZCBhZGRyICovCisgICAgICAgIGludCB0cmFwX25vOyAvKiBtaXNzaW5nIGluIHB0cmFjZV9mYXVsdGluZm8gKi8KK307CisKKyNkZWZpbmUgRkFVTFRfV1JJVEUoZmkpICgoZmkpLmVycm9yX2NvZGUgJiAyKQorI2RlZmluZSBGQVVMVF9BRERSRVNTKGZpKSAoKGZpKS5jcjIpCisKKy8qIFRoaXMgaXMgUGFnZSBGYXVsdCAqLworI2RlZmluZSBTRUdWX0lTX0ZJWEFCTEUoZmkpCSgoZmkpLT50cmFwX25vID09IDE0KQorCisvKiBObyBicm9rZW4gU0tBUyBBUEksIHdoaWNoIGRvZXNuJ3QgcGFzcyB0cmFwX25vLCBoZXJlLiAqLworI2RlZmluZSBTRUdWX01BWUJFX0ZJWEFCTEUoZmkpCTAKKworI2RlZmluZSBQVFJBQ0VfRlVMTF9GQVVMVElORk8gMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAva2VybmVsLW9mZnNldHMuaApyZW5hbWUgdG8gYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9rZXJuZWwtb2Zmc2V0cy5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL21jb250ZXh0LmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL21jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyNGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvbWNvbnRleHQuaApAQCAtMCwwICsxLDMxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNfU0lHQ09OVEVYVF9YODZfSAorI2RlZmluZSBfX1NZU19TSUdDT05URVhUX1g4Nl9ICisKK2V4dGVybiB2b2lkIGdldF9yZWdzX2Zyb21fbWMoc3RydWN0IHVtbF9wdF9yZWdzICosIG1jb250ZXh0X3QgKik7CisKKyNpZmRlZiBfX2kzODZfXworCisjZGVmaW5lIEdFVF9GQVVMVElORk9fRlJPTV9NQyhmaSwgbWMpIFwKKwl7IFwKKwkJKGZpKS5jcjIgPSAobWMpLT5jcjI7IFwKKwkJKGZpKS5lcnJvcl9jb2RlID0gKG1jKS0+Z3JlZ3NbUkVHX0VSUl07IFwKKwkJKGZpKS50cmFwX25vID0gKG1jKS0+Z3JlZ3NbUkVHX1RSQVBOT107IFwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUgR0VUX0ZBVUxUSU5GT19GUk9NX01DKGZpLCBtYykgXAorCXsgXAorCQkoZmkpLmNyMiA9IChtYyktPmdyZWdzW1JFR19DUjJdOyBcCisJCShmaSkuZXJyb3JfY29kZSA9IChtYyktPmdyZWdzW1JFR19FUlJdOyBcCisJCShmaSkudHJhcF9ubyA9IChtYyktPmdyZWdzW1JFR19UUkFQTk9dOyBcCisJfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFiMTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApAQCAtMCwwICsxLDUgQEAKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgInB0cmFjZV8zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJwdHJhY2VfNjQuaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfMzIuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmZDFkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlXzMyLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX0kzODZfUFRSQUNFX0gKKyNkZWZpbmUgX19TWVNERVBfSTM4Nl9QVFJBQ0VfSAorCisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisjaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgorCisjZGVmaW5lIE1BWF9SRUdfTlIgKFVNX0ZSQU1FX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCisjZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2RlYnVncmVncyhpbnQgc2VxKSB7fQorCisvKiBzeXNjYWxsIGVtdWxhdGlvbiBwYXRoIGluIHB0cmFjZSAqLworCisjaWZuZGVmIFBUUkFDRV9TWVNFTVUKKyNkZWZpbmUgUFRSQUNFX1NZU0VNVSAzMQorI2VuZGlmCisKK3ZvaWQgc2V0X3VzaW5nX3N5c2VtdShpbnQgdmFsdWUpOworaW50IGdldF91c2luZ19zeXNlbXUodm9pZCk7CitleHRlcm4gaW50IHN5c2VtdV9zdXBwb3J0ZWQ7CisKKyNkZWZpbmUgUkVHU19JUChyKSAoKHIpW0hPU1RfSVBdKQorI2RlZmluZSBSRUdTX1NQKHIpICgocilbSE9TVF9TUF0pCisjZGVmaW5lIFJFR1NfRUZMQUdTKHIpICgocilbSE9TVF9FRkxBR1NdKQorI2RlZmluZSBSRUdTX0VBWChyKSAoKHIpW0hPU1RfQVhdKQorI2RlZmluZSBSRUdTX0VCWChyKSAoKHIpW0hPU1RfQlhdKQorI2RlZmluZSBSRUdTX0VDWChyKSAoKHIpW0hPU1RfQ1hdKQorI2RlZmluZSBSRUdTX0VEWChyKSAoKHIpW0hPU1RfRFhdKQorI2RlZmluZSBSRUdTX0VTSShyKSAoKHIpW0hPU1RfU0ldKQorI2RlZmluZSBSRUdTX0VESShyKSAoKHIpW0hPU1RfREldKQorI2RlZmluZSBSRUdTX0VCUChyKSAoKHIpW0hPU1RfQlBdKQorI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCisjZGVmaW5lIFJFR1NfU1MocikgKChyKVtIT1NUX1NTXSkKKyNkZWZpbmUgUkVHU19EUyhyKSAoKHIpW0hPU1RfRFNdKQorI2RlZmluZSBSRUdTX0VTKHIpICgocilbSE9TVF9FU10pCisjZGVmaW5lIFJFR1NfRlMocikgKChyKVtIT1NUX0ZTXSkKKyNkZWZpbmUgUkVHU19HUyhyKSAoKHIpW0hPU1RfR1NdKQorCisjZGVmaW5lIFJFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHIsIHJlcykgUkVHU19FQVgocikgPSAocmVzKQorCisjZGVmaW5lIElQX1JFU1RBUlRfU1lTQ0FMTChpcCkgKChpcCkgLT0gMikKKyNkZWZpbmUgUkVHU19SRVNUQVJUX1NZU0NBTEwocikgSVBfUkVTVEFSVF9TWVNDQUxMKFJFR1NfSVAocikpCisKKyNpZm5kZWYgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQCisjZGVmaW5lIFBUUkFDRV9TWVNFTVVfU0lOR0xFU1RFUCAzMgorI2VuZGlmCisKK3N0cnVjdCB1bWxfcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyBncFtNQVhfUkVHX05SXTsKKwl1bnNpZ25lZCBsb25nIGZwW0hPU1RfRlBYX1NJWkVdOworCXN0cnVjdCBmYXVsdGluZm8gZmF1bHRpbmZvOworCWxvbmcgc3lzY2FsbDsKKwlpbnQgaXNfdXNlcjsKK307CisKKyNkZWZpbmUgRU1QVFlfVU1MX1BUX1JFR1MgeyB9CisKKyNkZWZpbmUgVVBUX0lQKHIpIFJFR1NfSVAoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NQKHIpIFJFR1NfU1AoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VGTEFHUyhyKSBSRUdTX0VGTEFHUygociktPmdwKQorI2RlZmluZSBVUFRfRUFYKHIpIFJFR1NfRUFYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9FQlgocikgUkVHU19FQlgoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VDWChyKSBSRUdTX0VDWCgociktPmdwKQorI2RlZmluZSBVUFRfRURYKHIpIFJFR1NfRURYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9FU0kocikgUkVHU19FU0koKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VESShyKSBSRUdTX0VESSgociktPmdwKQorI2RlZmluZSBVUFRfRUJQKHIpIFJFR1NfRUJQKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9PUklHX0VBWChyKSAoKHIpLT5zeXNjYWxsKQorI2RlZmluZSBVUFRfQ1MocikgUkVHU19DUygociktPmdwKQorI2RlZmluZSBVUFRfU1MocikgUkVHU19TUygociktPmdwKQorI2RlZmluZSBVUFRfRFMocikgUkVHU19EUygociktPmdwKQorI2RlZmluZSBVUFRfRVMocikgUkVHU19FUygociktPmdwKQorI2RlZmluZSBVUFRfRlMocikgUkVHU19GUygociktPmdwKQorI2RlZmluZSBVUFRfR1MocikgUkVHU19HUygociktPmdwKQorCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzEocikgVVBUX0VCWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcyKHIpIFVQVF9FQ1gocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMyhyKSBVUFRfRURYKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzQocikgVVBUX0VTSShyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc1KHIpIFVQVF9FREkocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNihyKSBVUFRfRUJQKHIpCisKK2V4dGVybiBpbnQgdXNlcl9jb250ZXh0KHVuc2lnbmVkIGxvbmcgc3ApOworCisjZGVmaW5lIFVQVF9JU19VU0VSKHIpICgociktPmlzX3VzZXIpCisKK3N0cnVjdCBzeXNjYWxsX2FyZ3MgeworCXVuc2lnbmVkIGxvbmcgYXJnc1s2XTsKK307CisKKyNkZWZpbmUgU1lTQ0FMTF9BUkdTKHIpICgoc3RydWN0IHN5c2NhbGxfYXJncykgXAorCQkJIHsgLmFyZ3MgPSB7IFVQVF9TWVNDQUxMX0FSRzEociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzIociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzMociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzQociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzUociksCVwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzYocikgfSB9ICkKKworI2RlZmluZSBVUFRfUkVTVEFSVF9TWVNDQUxMKHIpIFJFR1NfUkVTVEFSVF9TWVNDQUxMKChyKS0+Z3ApCisKKyNkZWZpbmUgVVBUX09SSUdfU1lTQ0FMTChyKSBVUFRfRUFYKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX05SKHIpIFVQVF9PUklHX0VBWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9SRVQocikgVVBUX0VBWChyKQorCisjZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKKworZXh0ZXJuIHZvaWQgYXJjaF9pbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV82NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFlZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9wdHJhY2VfNjQuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNERVBfWDg2XzY0X1BUUkFDRV9ICisjZGVmaW5lIF9fU1lTREVQX1g4Nl82NF9QVFJBQ0VfSAorCisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisjaW5jbHVkZSAic3lzZGVwL2ZhdWx0aW5mby5oIgorCisjZGVmaW5lIE1BWF9SRUdfT0ZGU0VUIChVTV9GUkFNRV9TSVpFKQorI2RlZmluZSBNQVhfUkVHX05SICgoTUFYX1JFR19PRkZTRVQpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjZGVmaW5lIFJFR1NfSVAocikgKChyKVtIT1NUX0lQXSkKKyNkZWZpbmUgUkVHU19TUChyKSAoKHIpW0hPU1RfU1BdKQorCisjZGVmaW5lIFJFR1NfUkJYKHIpICgocilbSE9TVF9CWF0pCisjZGVmaW5lIFJFR1NfUkNYKHIpICgocilbSE9TVF9DWF0pCisjZGVmaW5lIFJFR1NfUkRYKHIpICgocilbSE9TVF9EWF0pCisjZGVmaW5lIFJFR1NfUlNJKHIpICgocilbSE9TVF9TSV0pCisjZGVmaW5lIFJFR1NfUkRJKHIpICgocilbSE9TVF9ESV0pCisjZGVmaW5lIFJFR1NfUkJQKHIpICgocilbSE9TVF9CUF0pCisjZGVmaW5lIFJFR1NfUkFYKHIpICgocilbSE9TVF9BWF0pCisjZGVmaW5lIFJFR1NfUjgocikgKChyKVtIT1NUX1I4XSkKKyNkZWZpbmUgUkVHU19SOShyKSAoKHIpW0hPU1RfUjldKQorI2RlZmluZSBSRUdTX1IxMChyKSAoKHIpW0hPU1RfUjEwXSkKKyNkZWZpbmUgUkVHU19SMTEocikgKChyKVtIT1NUX1IxMV0pCisjZGVmaW5lIFJFR1NfUjEyKHIpICgocilbSE9TVF9SMTJdKQorI2RlZmluZSBSRUdTX1IxMyhyKSAoKHIpW0hPU1RfUjEzXSkKKyNkZWZpbmUgUkVHU19SMTQocikgKChyKVtIT1NUX1IxNF0pCisjZGVmaW5lIFJFR1NfUjE1KHIpICgocilbSE9TVF9SMTVdKQorI2RlZmluZSBSRUdTX0NTKHIpICgocilbSE9TVF9DU10pCisjZGVmaW5lIFJFR1NfRUZMQUdTKHIpICgocilbSE9TVF9FRkxBR1NdKQorI2RlZmluZSBSRUdTX1NTKHIpICgocilbSE9TVF9TU10pCisKKyNkZWZpbmUgSE9TVF9GU19CQVNFIDIxCisjZGVmaW5lIEhPU1RfR1NfQkFTRSAyMgorI2RlZmluZSBIT1NUX0RTIDIzCisjZGVmaW5lIEhPU1RfRVMgMjQKKyNkZWZpbmUgSE9TVF9GUyAyNQorI2RlZmluZSBIT1NUX0dTIDI2CisKKy8qIEFsc28gZGVmaW5lZCBpbiBhc20vcHRyYWNlLXg4Nl82NC5oLCBidXQgbm90IGluIGxpYmMgaGVhZGVycy4gIFNvLCB0aGVzZQorICogYXJlIGFscmVhZHkgZGVmaW5lZCBmb3Iga2VybmVsIGNvZGUsIGJ1dCBub3QgZm9yIHVzZXJzcGFjZSBjb2RlLgorICovCisjaWZuZGVmIEZTX0JBU0UKKy8qIFRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIHB0cmFjZS5oLCBidXQgZXhpc3QgaW4gc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsCisgKiB3aGljaCBpcyB3aGF0IHg4Nl82NCBwdHJhY2UgYWN0dWFsbHkgdXNlcy4KKyAqLworI2RlZmluZSBGU19CQVNFIChIT1NUX0ZTX0JBU0UgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEdTX0JBU0UgKEhPU1RfR1NfQkFTRSAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgRFMgKEhPU1RfRFMgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEVTIChIT1NUX0VTICogc2l6ZW9mKGxvbmcpKQorI2RlZmluZSBGUyAoSE9TVF9GUyAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgR1MgKEhPU1RfR1MgKiBzaXplb2YobG9uZykpCisjZW5kaWYKKworI2RlZmluZSBSRUdTX0ZTX0JBU0UocikgKChyKVtIT1NUX0ZTX0JBU0VdKQorI2RlZmluZSBSRUdTX0dTX0JBU0UocikgKChyKVtIT1NUX0dTX0JBU0VdKQorI2RlZmluZSBSRUdTX0RTKHIpICgocilbSE9TVF9EU10pCisjZGVmaW5lIFJFR1NfRVMocikgKChyKVtIT1NUX0VTXSkKKyNkZWZpbmUgUkVHU19GUyhyKSAoKHIpW0hPU1RfRlNdKQorI2RlZmluZSBSRUdTX0dTKHIpICgocilbSE9TVF9HU10pCisKKyNkZWZpbmUgUkVHU19PUklHX1JBWChyKSAoKHIpW0hPU1RfT1JJR19BWF0pCisKKyNkZWZpbmUgUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ociwgcmVzKSBSRUdTX1JBWChyKSA9IChyZXMpCisKKyNkZWZpbmUgSVBfUkVTVEFSVF9TWVNDQUxMKGlwKSAoKGlwKSAtPSAyKQorI2RlZmluZSBSRUdTX1JFU1RBUlRfU1lTQ0FMTChyKSBJUF9SRVNUQVJUX1NZU0NBTEwoUkVHU19JUChyKSkKKworI2RlZmluZSBSRUdTX0ZBVUxUX0FERFIocikgKChyKS0+ZmF1bHRfYWRkcikKKworI2RlZmluZSBSRUdTX0ZBVUxUX1dSSVRFKHIpIEZBVUxUX1dSSVRFKChyKS0+ZmF1bHRfdHlwZSkKKworI2RlZmluZSBSRUdTX1RSQVAocikgKChyKS0+dHJhcF90eXBlKQorCisjZGVmaW5lIFJFR1NfRVJSKHIpICgociktPmZhdWx0X3R5cGUpCisKK3N0cnVjdCB1bWxfcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyBncFtNQVhfUkVHX05SXTsKKwl1bnNpZ25lZCBsb25nIGZwW0hPU1RfRlBfU0laRV07CisJc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87CisJbG9uZyBzeXNjYWxsOworCWludCBpc191c2VyOworfTsKKworI2RlZmluZSBFTVBUWV9VTUxfUFRfUkVHUyB7IH0KKworI2RlZmluZSBVUFRfUkJYKHIpIFJFR1NfUkJYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SQ1gocikgUkVHU19SQ1goKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1JEWChyKSBSRUdTX1JEWCgociktPmdwKQorI2RlZmluZSBVUFRfUlNJKHIpIFJFR1NfUlNJKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SREkocikgUkVHU19SREkoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1JCUChyKSBSRUdTX1JCUCgociktPmdwKQorI2RlZmluZSBVUFRfUkFYKHIpIFJFR1NfUkFYKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SOChyKSBSRUdTX1I4KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SOShyKSBSRUdTX1I5KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SMTAocikgUkVHU19SMTAoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1IxMShyKSBSRUdTX1IxMSgociktPmdwKQorI2RlZmluZSBVUFRfUjEyKHIpIFJFR1NfUjEyKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9SMTMocikgUkVHU19SMTMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1IxNChyKSBSRUdTX1IxNCgociktPmdwKQorI2RlZmluZSBVUFRfUjE1KHIpIFJFR1NfUjE1KChyKS0+Z3ApCisjZGVmaW5lIFVQVF9DUyhyKSBSRUdTX0NTKChyKS0+Z3ApCisjZGVmaW5lIFVQVF9GU19CQVNFKHIpIFJFR1NfRlNfQkFTRSgociktPmdwKQorI2RlZmluZSBVUFRfRlMocikgUkVHU19GUygociktPmdwKQorI2RlZmluZSBVUFRfR1NfQkFTRShyKSBSRUdTX0dTX0JBU0UoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0dTKHIpIFJFR1NfR1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0RTKHIpIFJFR1NfRFMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0VTKHIpIFJFR1NfRVMoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX0NTKHIpIFJFR1NfQ1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NTKHIpIFJFR1NfU1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX09SSUdfUkFYKHIpIFJFR1NfT1JJR19SQVgoKHIpLT5ncCkKKworI2RlZmluZSBVUFRfSVAocikgUkVHU19JUCgociktPmdwKQorI2RlZmluZSBVUFRfU1AocikgUkVHU19TUCgociktPmdwKQorCisjZGVmaW5lIFVQVF9FRkxBR1MocikgUkVHU19FRkxBR1MoKHIpLT5ncCkKKyNkZWZpbmUgVVBUX1NZU0NBTExfTlIocikgKChyKS0+c3lzY2FsbCkKKyNkZWZpbmUgVVBUX1NZU0NBTExfUkVUKHIpIFVQVF9SQVgocikKKworZXh0ZXJuIGludCB1c2VyX2NvbnRleHQodW5zaWduZWQgbG9uZyBzcCk7CisKKyNkZWZpbmUgVVBUX0lTX1VTRVIocikgKChyKS0+aXNfdXNlcikKKworI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkcxKHIpIFVQVF9SREkocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHMihyKSBVUFRfUlNJKHIpCisjZGVmaW5lIFVQVF9TWVNDQUxMX0FSRzMocikgVVBUX1JEWChyKQorI2RlZmluZSBVUFRfU1lTQ0FMTF9BUkc0KHIpIFVQVF9SMTAocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNShyKSBVUFRfUjgocikKKyNkZWZpbmUgVVBUX1NZU0NBTExfQVJHNihyKSBVUFRfUjkocikKKworc3RydWN0IHN5c2NhbGxfYXJncyB7CisJdW5zaWduZWQgbG9uZyBhcmdzWzZdOworfTsKKworI2RlZmluZSBTWVNDQUxMX0FSR1MocikgKChzdHJ1Y3Qgc3lzY2FsbF9hcmdzKSBcCisJCQkgeyAuYXJncyA9IHsgVVBUX1NZU0NBTExfQVJHMShyKSwJIFwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzIociksCSBcCisJCQkJICAgICBVUFRfU1lTQ0FMTF9BUkczKHIpLAkgXAorCQkJCSAgICAgVVBUX1NZU0NBTExfQVJHNChyKSwJIFwKKwkJCQkgICAgIFVQVF9TWVNDQUxMX0FSRzUociksCSBcCisJCQkJICAgICBVUFRfU1lTQ0FMTF9BUkc2KHIpIH0gfSApCisKKyNkZWZpbmUgVVBUX1JFU1RBUlRfU1lTQ0FMTChyKSBSRUdTX1JFU1RBUlRfU1lTQ0FMTCgociktPmdwKQorCisjZGVmaW5lIFVQVF9GQVVMVElORk8ocikgKCYociktPmZhdWx0aW5mbykKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaW5pdF9yZWdpc3RlcnMoaW50IHBpZCkKK3sKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV91c2VyLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3B0cmFjZV91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZDZiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvcHRyYWNlX3VzZXIuaApAQCAtMCwwICsxLDI3IEBACisjaW5jbHVkZSA8Z2VuZXJhdGVkL3VzZXJfY29uc3RhbnRzLmg+CisKKyNkZWZpbmUgUFRfT0ZGU0VUKHIpICgocikgKiBzaXplb2YobG9uZykpCisKKyNkZWZpbmUgUFRfU1lTQ0FMTF9OUihyZWdzKSAoKHJlZ3MpW0hPU1RfT1JJR19BWF0pCisjZGVmaW5lIFBUX1NZU0NBTExfTlJfT0ZGU0VUIFBUX09GRlNFVChIT1NUX09SSUdfQVgpCisKKyNkZWZpbmUgUFRfU1lTQ0FMTF9SRVRfT0ZGU0VUIFBUX09GRlNFVChIT1NUX0FYKQorCisjZGVmaW5lIFJFR1NfSVBfSU5ERVggSE9TVF9JUAorI2RlZmluZSBSRUdTX1NQX0lOREVYIEhPU1RfU1AKKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIEZQX1NJWkUgKChIT1NUX0ZQWF9TSVpFID4gSE9TVF9GUF9TSVpFKSA/IEhPU1RfRlBYX1NJWkUgOiBIT1NUX0ZQX1NJWkUpCisjZWxzZQorI2RlZmluZSBGUF9TSVpFIEhPU1RfRlBfU0laRQorCisvKgorICogeDg2XzY0IEZDMyBkb2Vzbid0IGRlZmluZSB0aGlzIGluIC91c3IvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBldmVuIHRob3VnaAorICogaXQncyBkZWZpbmVkIGluIHRoZSBrZXJuZWwncyBpbmNsdWRlL2xpbnV4L3B0cmFjZS5oLiBBZGRpdGlvbmFsbHksIHVzZSB0aGUKKyAqIDIuNCBuYW1lIGFuZCB2YWx1ZSBmb3IgMi40IGhvc3QgY29tcGF0aWJpbGl0eS4KKyAqLworI2lmbmRlZiBQVFJBQ0VfT0xEU0VUT1BUSU9OUworI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2ZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAorI2RlZmluZSBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAorCitzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyB7CisgICAgICAgIGludCBpc193cml0ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworc3RydWN0IHB0cmFjZV9sZHQgeworICAgICAgICBpbnQgZnVuYzsKKyAgICAgICAgdm9pZCAqcHRyOworICAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudDsKK307CisKKyNkZWZpbmUgUFRSQUNFX0xEVCA1NAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yi5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxNjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJhcy1sYXlvdXQuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKworI2lmZGVmIF9faTM4Nl9fCisjaW5jbHVkZSAic3R1Yl8zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzdHViXzY0LmgiCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc3R1Yl9zZWd2X2hhbmRsZXIoaW50LCBzaWdpbmZvX3QgKiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIHN0dWJfY2xvbmVfaGFuZGxlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yl8zMi5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmZDI1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3R1Yl8zMi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworI2RlZmluZSBTVFVCX1NZU0NBTExfUkVUIEVBWAorI2RlZmluZSBTVFVCX01NQVBfTlIgX19OUl9tbWFwMgorI2RlZmluZSBNTUFQX09GRlNFVChvKSAoKG8pID4+IFVNX0tFUk5fUEFHRV9TSElGVCkKKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDAobG9uZyBzeXNjYWxsKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoImludCAkMHg4MCIgOiAiPWEiIChyZXQpIDogIjAiIChzeXNjYWxsKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMShsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDIobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMikKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwzKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMykKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw0KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0KQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoImludCAkMHg4MCIgOiAiPWEiIChyZXQpIDogIjAiIChzeXNjYWxsKSwgImIiIChhcmcxKSwKKwkJCSJjIiAoYXJnMiksICJkIiAoYXJnMyksICJTIiAoYXJnNCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDUobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQsIGxvbmcgYXJnNSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJpbnQgJDB4ODAiIDogIj1hIiAocmV0KSA6ICIwIiAoc3lzY2FsbCksICJiIiAoYXJnMSksCisJCQkiYyIgKGFyZzIpLCAiZCIgKGFyZzMpLCAiUyIgKGFyZzQpLCAiRCIgKGFyZzUpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQoreworCV9fYXNtKCJpbnQzIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9zdGFjayhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZsICUlZWF4LCUlZWJwIDsgbW92bCAlMCwlJWVheCA7IGludCAkMHg4MCA7IgorCQkJICAibW92bCAlNywgJSVlYnggOyBtb3ZsICUlZWF4LCAoJSVlYngpIgorCQkJICA6IDogImciIChTVFVCX01NQVBfTlIpLCAiYiIgKFNUVUJfREFUQSksCisJCQkgICAgImMiIChVTV9LRVJOX1BBR0VfU0laRSksCisJCQkgICAgImQiIChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSwKKwkJCSAgICAiUyIgKE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQpLCAiRCIgKGZkKSwKKwkJCSAgICAiYSIgKG9mZnNldCksCisJCQkgICAgImkiICgmKChzdHJ1Y3Qgc3R1Yl9kYXRhICopIFNUVUJfREFUQSktPmVycikKKwkJCSAgOiAibWVtb3J5Iik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzY0LmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N0dWJfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRkZjkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zdHViXzY0LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpZm5kZWYgX19TWVNERVBfU1RVQl9ICisjZGVmaW5lIF9fU1lTREVQX1NUVUJfSAorCisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CisKKyNkZWZpbmUgU1RVQl9TWVNDQUxMX1JFVCBQVF9JTkRFWChSQVgpCisjZGVmaW5lIFNUVUJfTU1BUF9OUiBfX05SX21tYXAKKyNkZWZpbmUgTU1BUF9PRkZTRVQobykgKG8pCisKKyNkZWZpbmUgX19zeXNjYWxsX2Nsb2JiZXIgInIxMSIsInJjeCIsIm1lbW9yeSIKKyNkZWZpbmUgX19zeXNjYWxsICJzeXNjYWxsIgorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMChsb25nIHN5c2NhbGwpCit7CisJbG9uZyByZXQ7CisKKwlfX2FzbV9fIHZvbGF0aWxlIChfX3N5c2NhbGwKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChzeXNjYWxsKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMikgOiBfX3N5c2NhbGxfY2xvYmJlciApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDMobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKQoreworCWxvbmcgcmV0OworCisJX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMiksICJkIiAoYXJnMykKKwkJOiBfX3N5c2NhbGxfY2xvYmJlciApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDQobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQpCit7CisJbG9uZyByZXQ7CisKKwlfX2FzbV9fIHZvbGF0aWxlICgibW92cSAlNSwlJXIxMCA7ICIgX19zeXNjYWxsCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoc3lzY2FsbCksICJEIiAoYXJnMSksICJTIiAoYXJnMiksICJkIiAoYXJnMyksCisJCSAgImciIChhcmc0KQorCQk6IF9fc3lzY2FsbF9jbG9iYmVyLCAicjEwIiApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDUobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLAorCQkJCSBsb25nIGFyZzQsIGxvbmcgYXJnNSkKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgbW92cSAlNiwlJXI4IDsgIiBfX3N5c2NhbGwKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChzeXNjYWxsKSwgIkQiIChhcmcxKSwgIlMiIChhcmcyKSwgImQiIChhcmczKSwKKwkJICAiZyIgKGFyZzQpLCAiZyIgKGFyZzUpCisJCTogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiLCAicjgiICk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhcF9teXNlbGYodm9pZCkKK3sKKwlfX2FzbSgiaW50MyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfc3RhY2sobG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIm1vdnEgJTQsJSVyMTAgOyBtb3ZxICU1LCUlcjggOyAiCisJCQkgICJtb3ZxICU2LCAlJXI5OyAiIF9fc3lzY2FsbCAiOyBtb3ZxICU3LCAlJXJieCA7ICIKKwkJCSAgIm1vdnEgJSVyYXgsICglJXJieCkiOgorCQkJICA6ICJhIiAoU1RVQl9NTUFQX05SKSwgIkQiIChTVFVCX0RBVEEpLAorCQkJICAgICJTIiAoVU1fS0VSTl9QQUdFX1NJWkUpLAorCQkJICAgICJkIiAoUFJPVF9SRUFEIHwgUFJPVF9XUklURSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChNQVBfRklYRUQgfCBNQVBfU0hBUkVEKSwgImciIChmZCksCisJCQkgICAgImciIChvZmZzZXQpLAorCQkJICAgICJpIiAoJigoc3RydWN0IHN0dWJfZGF0YSAqKSBTVFVCX0RBVEEpLT5lcnIpCisJCQkgIDogX19zeXNjYWxsX2Nsb2JiZXIsICJyMTAiLCAicjgiLCAicjkiICk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWE4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKQEAgLTAsMCArMSw1IEBACisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlICJzeXNjYWxsc18zMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzeXNjYWxsc182NC5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3NoYXJlZC9zeXNkZXAvc3lzY2FsbHMuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3lzY2FsbHNfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvc3lzY2FsbHNfMzIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxsc182NC5oIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9zeXNjYWxsc182NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhN2Q1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzXzY0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1g4Nl82NF9TWVNDQUxMU19IX18KKyNkZWZpbmUgX19TWVNERVBfWDg2XzY0X1NZU0NBTExTX0hfXworCisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisKK3R5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKKworZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICpzeXNfY2FsbF90YWJsZVtdOworCisjZGVmaW5lIEVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSBcCisJKCgobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZykpIFwKKwkgICgqc3lzX2NhbGxfdGFibGVbc3lzY2FsbF0pKShVUFRfU1lTQ0FMTF9BUkcxKCZyZWdzLT5yZWdzKSwgXAorCQkgCQkgICAgICBVUFRfU1lTQ0FMTF9BUkcyKCZyZWdzLT5yZWdzKSwgXAorCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzMoJnJlZ3MtPnJlZ3MpLCBcCisJCQkJICAgICAgVVBUX1NZU0NBTExfQVJHNCgmcmVncy0+cmVncyksIFwKKwkJCQkgICAgICBVUFRfU1lTQ0FMTF9BUkc1KCZyZWdzLT5yZWdzKSwgXAorCQkJCSAgICAgIFVQVF9TWVNDQUxMX0FSRzYoJnJlZ3MtPnJlZ3MpKSkKKworZXh0ZXJuIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCSAgICAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZik7CitleHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21vZGlmeV9sZHQ7CitleHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX2FyY2hfcHJjdGw7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC90bHMuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjY2UwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvdGxzLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfU1lTREVQX1RMU19ICisjZGVmaW5lIF9TWVNERVBfVExTX0gKKworIyBpZm5kZWYgX19LRVJORUxfXworCisvKiBDaGFuZ2UgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgb3JpZ2luYWwgb25lIGZyb20gPGFzbS9sZHQuaD4sIHdoaWNoCisgKiBtYXkgYmUgbmFtZWQgdXNlcl9kZXNjIChidXQgaW4gMi40IGFuZCBpbiBoZWFkZXIgbWF0Y2hpbmcgaXRzIEFQSSB3YXMgbmFtZWQKKyAqIG1vZGlmeV9sZHRfbGR0X3MpLiAqLworCit0eXBlZGVmIHN0cnVjdCB1bV9kdXBfdXNlcl9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgIGVudHJ5X251bWJlcjsKKwl1bnNpZ25lZCBpbnQgIGJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0OworCXVuc2lnbmVkIGludCAgc2VnXzMyYml0OjE7CisJdW5zaWduZWQgaW50ICBjb250ZW50czoyOworCXVuc2lnbmVkIGludCAgcmVhZF9leGVjX29ubHk6MTsKKwl1bnNpZ25lZCBpbnQgIGxpbWl0X2luX3BhZ2VzOjE7CisJdW5zaWduZWQgaW50ICBzZWdfbm90X3ByZXNlbnQ6MTsKKwl1bnNpZ25lZCBpbnQgIHVzZWFibGU6MTsKKyNpZmRlZiBfX3g4Nl82NF9fCisJdW5zaWduZWQgaW50ICBsbToxOworI2VuZGlmCit9IHVzZXJfZGVzY190OworCisjIGVsc2UgLyogX19LRVJORUxfXyAqLworCit0eXBlZGVmIHN0cnVjdCB1c2VyX2Rlc2MgdXNlcl9kZXNjX3Q7CisKKyMgZW5kaWYgLyogX19LRVJORUxfXyAqLworCitleHRlcm4gaW50IG9zX3NldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCk7CitleHRlcm4gaW50IG9zX2dldF90aHJlYWRfYXJlYSh1c2VyX2Rlc2NfdCAqaW5mbywgaW50IHBpZCk7CisKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBHRFRfRU5UUllfVExTX01JTl9JMzg2IDYKKyNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU5fWDg2XzY0IDEyCisjZW5kaWYKKworI2VuZGlmIC8qIF9TWVNERVBfVExTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NpZ25hbC5jIGIvYXJjaC94ODYvdW0vc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4M2I5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3NpZ25hbC5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBhdGhTY2FsZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlICJmcmFtZV9rZXJuLmgiCisjaW5jbHVkZSAic2thcy5oIgorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisvKgorICogRlBVIHRhZyB3b3JkIGNvbnZlcnNpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgdHdkX2kzODdfdG9fZnhzcih1bnNpZ25lZCBzaG9ydCB0d2QpCit7CisJdW5zaWduZWQgaW50IHRtcDsgLyogdG8gYXZvaWQgMTYgYml0IHByZWZpeGVzIGluIHRoZSBjb2RlICovCisKKwkvKiBUcmFuc2Zvcm0gZWFjaCBwYWlyIG9mIGJpdHMgaW50byAwMSAodmFsaWQpIG9yIDAwIChlbXB0eSkgKi8KKwl0bXAgPSB+dHdkOworCXRtcCA9ICh0bXAgfCAodG1wPj4xKSkgJiAweDU1NTU7IC8qIDBWMFYwVjBWMFYwVjBWMFYgKi8KKwkvKiBhbmQgbW92ZSB0aGUgdmFsaWQgYml0cyB0byB0aGUgbG93ZXIgYnl0ZS4gKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiAxKSkgJiAweDMzMzM7IC8qIDAwVlYwMFZWMDBWVjAwVlYgKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiAyKSkgJiAweDBmMGY7IC8qIDAwMDBWVlZWMDAwMFZWVlYgKi8KKwl0bXAgPSAodG1wIHwgKHRtcCA+PiA0KSkgJiAweDAwZmY7IC8qIDAwMDAwMDAwVlZWVlZWVlYgKi8KKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdHdkX2Z4c3JfdG9faTM4NyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCAqZnhzYXZlKQoreworCXN0cnVjdCBfZnB4cmVnICpzdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB0d2QgPSAodW5zaWduZWQgbG9uZykgZnhzYXZlLT50d2Q7CisJdW5zaWduZWQgbG9uZyB0YWc7CisJdW5zaWduZWQgbG9uZyByZXQgPSAweGZmZmYwMDAwOworCWludCBpOworCisjZGVmaW5lIEZQUkVHX0FERFIoZiwgbikJKChjaGFyICopJihmKS0+c3Rfc3BhY2UgKyAobikgKiAxNikKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHR3ZCAmIDB4MSkgeworCQkJc3QgPSAoc3RydWN0IF9mcHhyZWcgKikgRlBSRUdfQUREUihmeHNhdmUsIGkpOworCisJCQlzd2l0Y2ggKHN0LT5leHBvbmVudCAmIDB4N2ZmZikgeworCQkJY2FzZSAweDdmZmY6CisJCQkJdGFnID0gMjsJCS8qIFNwZWNpYWwgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDAwOgorCQkJCWlmICggIXN0LT5zaWduaWZpY2FuZFswXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsxXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsyXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFszXSApIHsKKwkJCQkJdGFnID0gMTsJLyogWmVybyAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmIChzdC0+c2lnbmlmaWNhbmRbM10gJiAweDgwMDApIHsKKwkJCQkJdGFnID0gMDsJLyogVmFsaWQgKi8KKwkJCQl9IGVsc2UgeworCQkJCQl0YWcgPSAyOwkvKiBTcGVjaWFsICovCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdGFnID0gMzsJCQkvKiBFbXB0eSAqLworCQl9CisJCXJldCB8PSAodGFnIDw8ICgyICogaSkpOworCQl0d2QgPSB0d2QgPj4gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfdG9fdXNlcihzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYsCisJCQkJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZwcmVnIF9fdXNlciAqdG87CisJc3RydWN0IF9mcHhyZWcgKmZyb207CisJaW50IGk7CisKKwllbnZbMF0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPmN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMV0gPSAodW5zaWduZWQgbG9uZylmeHNhdmUtPnN3ZCB8IDB4ZmZmZjAwMDB1bDsKKwllbnZbMl0gPSB0d2RfZnhzcl90b19pMzg3KGZ4c2F2ZSk7CisJZW52WzNdID0gZnhzYXZlLT5maXA7CisJZW52WzRdID0gZnhzYXZlLT5mY3MgfCAoKHVuc2lnbmVkIGxvbmcpZnhzYXZlLT5mb3AgPDwgMTYpOworCWVudls1XSA9IGZ4c2F2ZS0+Zm9vOworCWVudls2XSA9IGZ4c2F2ZS0+Zm9zOworCisJaWYgKF9fY29weV90b191c2VyKGJ1ZiwgZW52LCA3ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwkJcmV0dXJuIDE7CisKKwl0byA9ICZidWYtPl9zdFswXTsKKwlmcm9tID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHRvKyssIGZyb20rKykgeworCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKXRvOworCQl1bnNpZ25lZCBsb25nICpmID0gKHVuc2lnbmVkIGxvbmcgKilmcm9tOworCisJCWlmIChfX3B1dF91c2VyKCpmLCB0KSB8fAorCQkJCV9fcHV0X3VzZXIoKihmICsgMSksIHQgKyAxKSB8fAorCQkJCV9fcHV0X3VzZXIoZnJvbS0+ZXhwb25lbnQsICZ0by0+ZXhwb25lbnQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfZnhzcl9mcm9tX3VzZXIoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgKmZ4c2F2ZSwKKwkJCQkgIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZweHJlZyAqdG87CisJc3RydWN0IF9mcHJlZyBfX3VzZXIgKmZyb207CisJaW50IGk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoIGVudiwgYnVmLCA3ICogc2l6ZW9mKGxvbmcpKSkKKwkJcmV0dXJuIDE7CisKKwlmeHNhdmUtPmN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzBdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnN3ZCA9ICh1bnNpZ25lZCBzaG9ydCkoZW52WzFdICYgMHhmZmZmKTsKKwlmeHNhdmUtPnR3ZCA9IHR3ZF9pMzg3X3RvX2Z4c3IoKHVuc2lnbmVkIHNob3J0KShlbnZbMl0gJiAweGZmZmYpKTsKKwlmeHNhdmUtPmZpcCA9IGVudlszXTsKKwlmeHNhdmUtPmZvcCA9ICh1bnNpZ25lZCBzaG9ydCkoKGVudls0XSAmIDB4ZmZmZjAwMDB1bCkgPj4gMTYpOworCWZ4c2F2ZS0+ZmNzID0gKGVudls0XSAmIDB4ZmZmZik7CisJZnhzYXZlLT5mb28gPSBlbnZbNV07CisJZnhzYXZlLT5mb3MgPSBlbnZbNl07CisKKwl0byA9IChzdHJ1Y3QgX2ZweHJlZyAqKSAmZnhzYXZlLT5zdF9zcGFjZVswXTsKKwlmcm9tID0gJmJ1Zi0+X3N0WzBdOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHRvKyssIGZyb20rKykgeworCQl1bnNpZ25lZCBsb25nICp0ID0gKHVuc2lnbmVkIGxvbmcgKil0bzsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmYgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilmcm9tOworCisJCWlmIChfX2dldF91c2VyKCp0LCBmKSB8fAorCQkgICAgX19nZXRfdXNlcigqKHQgKyAxKSwgZiArIDEpIHx8CisJCSAgICBfX2dldF91c2VyKHRvLT5leHBvbmVudCwgJmZyb20tPmV4cG9uZW50KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBoYXZlX2ZweF9yZWdzOworCisjZW5kaWYKKworc3RhdGljIGludCBjb3B5X3NjX2Zyb21fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpmcm9tKQoreworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCWludCBlcnIsIHBpZDsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZzYywgZnJvbSwgc2l6ZW9mKHNjKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworI2RlZmluZSBHRVRSRUcocmVnbm8sIHJlZ25hbWUpIHJlZ3MtPnJlZ3MuZ3BbSE9TVF8jI3JlZ25vXSA9IHNjLnJlZ25hbWUKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlHRVRSRUcoR1MsIGdzKTsKKwlHRVRSRUcoRlMsIGZzKTsKKwlHRVRSRUcoRVMsIGVzKTsKKwlHRVRSRUcoRFMsIGRzKTsKKyNlbmRpZgorCUdFVFJFRyhESSwgZGkpOworCUdFVFJFRyhTSSwgc2kpOworCUdFVFJFRyhCUCwgYnApOworCUdFVFJFRyhTUCwgc3ApOworCUdFVFJFRyhCWCwgYngpOworCUdFVFJFRyhEWCwgZHgpOworCUdFVFJFRyhDWCwgY3gpOworCUdFVFJFRyhBWCwgYXgpOworCUdFVFJFRyhJUCwgaXApOworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCUdFVFJFRyhSOCwgcjgpOworCUdFVFJFRyhSOSwgcjkpOworCUdFVFJFRyhSMTAsIHIxMCk7CisJR0VUUkVHKFIxMSwgcjExKTsKKwlHRVRSRUcoUjEyLCByMTIpOworCUdFVFJFRyhSMTMsIHIxMyk7CisJR0VUUkVHKFIxNCwgcjE0KTsKKwlHRVRSRUcoUjE1LCByMTUpOworI2VuZGlmCisKKwlHRVRSRUcoQ1MsIGNzKTsKKwlHRVRSRUcoRUZMQUdTLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCUdFVFJFRyhTUywgc3MpOworI2VuZGlmCisKKyN1bmRlZiBHRVRSRUcKKworCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOworI2lmZGVmIENPTkZJR19YODZfMzIKKwlpZiAoaGF2ZV9mcHhfcmVncykgeworCQlzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBmcHg7CisKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJmZweCwKKwkJCSYoKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilzYy5mcHN0YXRlKS0+X2Z4c3JfZW52WzBdLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gMTsKKworCQllcnIgPSBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKCZmcHgsIHNjLmZwc3RhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDE7CisKKwkJZXJyID0gcmVzdG9yZV9mcHhfcmVnaXN0ZXJzKHBpZCwgKHVuc2lnbmVkIGxvbmcgKikgJmZweCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNvcHlfc2NfZnJvbV91c2VyIC0gIgorCQkJICAgICAgICJyZXN0b3JlX2ZweF9yZWdpc3RlcnMgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIC1lcnIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnA7CisKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJmZwLCBzYy5mcHN0YXRlLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gMTsKKworCQllcnIgPSByZXN0b3JlX2ZwX3JlZ2lzdGVycyhwaWQsICh1bnNpZ25lZCBsb25nICopICZmcCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNvcHlfc2NfZnJvbV91c2VyIC0gIgorCQkJICAgICAgICJyZXN0b3JlX2ZwX3JlZ2lzdGVycyBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCQkgICAgICAgLWVycik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X3NjX3RvX3VzZXIoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICp0bywKKwkJCSAgIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKnRvX2ZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgZmF1bHRpbmZvICogZmkgPSAmY3VycmVudC0+dGhyZWFkLmFyY2guZmF1bHRpbmZvOworCWludCBlcnIsIHBpZDsKKwltZW1zZXQoJnNjLCAwLCBzaXplb2Yoc3RydWN0IHNpZ2NvbnRleHQpKTsKKworI2RlZmluZSBQVVRSRUcocmVnbm8sIHJlZ25hbWUpIHNjLnJlZ25hbWUgPSByZWdzLT5yZWdzLmdwW0hPU1RfIyNyZWdub10KKworI2lmZGVmIENPTkZJR19YODZfMzIKKwlQVVRSRUcoR1MsIGdzKTsKKwlQVVRSRUcoRlMsIGZzKTsKKwlQVVRSRUcoRVMsIGVzKTsKKwlQVVRSRUcoRFMsIGRzKTsKKyNlbmRpZgorCVBVVFJFRyhESSwgZGkpOworCVBVVFJFRyhTSSwgc2kpOworCVBVVFJFRyhCUCwgYnApOworCVBVVFJFRyhTUCwgc3ApOworCVBVVFJFRyhCWCwgYngpOworCVBVVFJFRyhEWCwgZHgpOworCVBVVFJFRyhDWCwgY3gpOworCVBVVFJFRyhBWCwgYXgpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwlQVVRSRUcoUjgsIHI4KTsKKwlQVVRSRUcoUjksIHI5KTsKKwlQVVRSRUcoUjEwLCByMTApOworCVBVVFJFRyhSMTEsIHIxMSk7CisJUFVUUkVHKFIxMiwgcjEyKTsKKwlQVVRSRUcoUjEzLCByMTMpOworCVBVVFJFRyhSMTQsIHIxNCk7CisJUFVUUkVHKFIxNSwgcjE1KTsKKyNlbmRpZgorCisJc2MuY3IyID0gZmktPmNyMjsKKwlzYy5lcnIgPSBmaS0+ZXJyb3JfY29kZTsKKwlzYy50cmFwbm8gPSBmaS0+dHJhcF9ubzsKKwlQVVRSRUcoSVAsIGlwKTsKKwlQVVRSRUcoQ1MsIGNzKTsKKwlQVVRSRUcoRUZMQUdTLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCVBVVFJFRyhTUCwgc3BfYXRfc2lnbmFsKTsKKwlQVVRSRUcoU1MsIHNzKTsKKyNlbmRpZgorI3VuZGVmIFBVVFJFRworCXNjLm9sZG1hc2sgPSBtYXNrOworCXNjLmZwc3RhdGUgPSB0b19mcDsKKworCWVyciA9IGNvcHlfdG9fdXNlcih0bywgJnNjLCBzaXplb2Yoc3RydWN0IHNpZ2NvbnRleHQpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCXBpZCA9IHVzZXJzcGFjZV9waWRbY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVdOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWlmIChoYXZlX2ZweF9yZWdzKSB7CisJCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZweDsKKworCQllcnIgPSBzYXZlX2ZweF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnB4KTsKKwkJaWYgKGVyciA8IDApeworCQkJcHJpbnRrKEtFUk5fRVJSICJjb3B5X3NjX3RvX3VzZXIgLSBzYXZlX2ZweF9yZWdpc3RlcnMgIgorCQkJICAgICAgICJmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWVyciA9IGNvbnZlcnRfZnhzcl90b191c2VyKHRvX2ZwLCAmZnB4KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAxOworCisJCWVyciB8PSBfX3B1dF91c2VyKGZweC5zd2QsICZ0b19mcC0+c3RhdHVzKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoWDg2X0ZYU1JfTUFHSUMsICZ0b19mcC0+bWFnaWMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigmdG9fZnAtPl9meHNyX2VudlswXSwgJmZweCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnA7CisKKwkJZXJyID0gc2F2ZV9mcF9yZWdpc3RlcnMocGlkLCAodW5zaWduZWQgbG9uZyAqKSAmZnApOworCQlpZiAoY29weV90b191c2VyKHRvX2ZwLCAmZnAsIHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCitzdGF0aWMgaW50IGNvcHlfdWNvbnRleHRfdG9fdXNlcihzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywKKwkJCQkgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqZnAsIHNpZ3NldF90ICpzZXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgc3ApCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgfD0gcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NwLCAmdWMtPnVjX3N0YWNrLnNzX3NwKTsKKwllcnIgfD0gcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHNwKSwgJnVjLT51Y19zdGFjay5zc19mbGFncyk7CisJZXJyIHw9IHB1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmdWMtPnVjX3N0YWNrLnNzX3NpemUpOworCWVyciB8PSBjb3B5X3NjX3RvX3VzZXIoJnVjLT51Y19tY29udGV4dCwgZnAsICZjdXJyZW50LT50aHJlYWQucmVncywgMCk7CisJZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3Qgc2lnZnJhbWUKK3sKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKKwljaGFyIHJldGNvZGVbOF07Cit9OworCitzdHJ1Y3QgcnRfc2lnZnJhbWUKK3sKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOworCXZvaWQgX191c2VyICpwdWM7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKwlzdHJ1Y3QgdWNvbnRleHQgdWM7CisJc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJY2hhciByZXRjb2RlWzhdOworfTsKKworaW50IHNldHVwX3NpZ25hbF9zdGFja19zYyh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKKwkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgIHNpZ3NldF90ICptYXNrKQoreworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXZvaWQgX191c2VyICpyZXN0b3JlcjsKKwlpbnQgZXJyID0gMDsKKworCS8qIFRoaXMgaXMgdGhlIHNhbWUgY2FsY3VsYXRpb24gYXMgaTM4NiAtICgoc3AgKyA0KSAmIDE1KSA9PSAwICovCisJc3RhY2tfdG9wID0gKChzdGFja190b3AgKyA0KSAmIC0xNlVMKSAtIDQ7CisJZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSBzdGFja190b3AgLSAxOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXN0b3JlciA9IGZyYW1lLT5yZXRjb2RlOworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikKKwkJcmVzdG9yZXIgPSBrYS0+c2Euc2FfcmVzdG9yZXI7CisKKwllcnIgfD0gX19wdXRfdXNlcihyZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZyk7CisJZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmZnJhbWUtPnNjLCAmZnJhbWUtPmZwc3RhdGUsIHJlZ3MsIG1hc2stPnNpZ1swXSk7CisJaWYgKF9OU0lHX1dPUkRTID4gMSkKKwkJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+ZXh0cmFtYXNrLCAmbWFzay0+c2lnWzFdLAorCQkJCSAgICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSk7CisKKwkvKgorCSAqIFRoaXMgaXMgcG9wbCAlZWF4IDsgbW92bCAkLCVlYXggOyBpbnQgJDB4ODAKKwkgKgorCSAqIFdFIERPIE5PVCBVU0UgSVQgQU5ZIE1PUkUhIEl0J3Mgb25seSBsZWZ0IGhlcmUgZm9yIGhpc3RvcmljYWwKKwkgKiByZWFzb25zIGFuZCBiZWNhdXNlIGdkYiB1c2VzIGl0IGFzIGEgc2lnbmF0dXJlIHRvIG5vdGljZQorCSAqIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGZyYW1lcy4KKwkgKi8KKwllcnIgfD0gX19wdXRfdXNlcigweGI4NTgsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMCkpOworCWVyciB8PSBfX3B1dF91c2VyKF9fTlJfc2lncmV0dXJuLCAoaW50IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSsyKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoMHg4MGNkLCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzYpKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlQVF9SRUdTX1NQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCVBUX1JFR1NfSVAocmVncykgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CisJUFRfUkVHU19FQVgocmVncykgPSAodW5zaWduZWQgbG9uZykgc2lnOworCVBUX1JFR1NfRURYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIDA7CisJUFRfUkVHU19FQ1gocmVncykgPSAodW5zaWduZWQgbG9uZykgMDsKKworCWlmICgoY3VycmVudC0+cHRyYWNlICYgUFRfRFRSQUNFKSAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXR1cF9zaWduYWxfc3RhY2tfc2kodW5zaWduZWQgbG9uZyBzdGFja190b3AsIGludCBzaWcsCisJCQkgIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICptYXNrKQoreworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXZvaWQgX191c2VyICpyZXN0b3JlcjsKKwlpbnQgZXJyID0gMDsKKworCXN0YWNrX3RvcCAmPSAtOFVMOworCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikgc3RhY2tfdG9wIC0gMTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCXJldHVybiAxOworCisJcmVzdG9yZXIgPSBmcmFtZS0+cmV0Y29kZTsKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOworCisJZXJyIHw9IF9fcHV0X3VzZXIocmVzdG9yZXIsICZmcmFtZS0+cHJldGNvZGUpOworCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpOworCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pOworCWVyciB8PSBjb3B5X3Vjb250ZXh0X3RvX3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5mcHN0YXRlLCBtYXNrLAorCQkJCQlQVF9SRUdTX1NQKHJlZ3MpKTsKKworCS8qCisJICogVGhpcyBpcyBtb3ZsICQsJWVheCA7IGludCAkMHg4MAorCSAqCisJICogV0UgRE8gTk9UIFVTRSBJVCBBTlkgTU9SRSEgSXQncyBvbmx5IGxlZnQgaGVyZSBmb3IgaGlzdG9yaWNhbAorCSAqIHJlYXNvbnMgYW5kIGJlY2F1c2UgZ2RiIHVzZXMgaXQgYXMgYSBzaWduYXR1cmUgdG8gbm90aWNlCisJICogc2lnbmFsIGhhbmRsZXIgc3RhY2sgZnJhbWVzLgorCSAqLworCWVyciB8PSBfX3B1dF91c2VyKDB4YjgsIChjaGFyIF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSswKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoX19OUl9ydF9zaWdyZXR1cm4sIChpbnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzEpKTsKKwllcnIgfD0gX19wdXRfdXNlcigweDgwY2QsIChzaG9ydCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrNSkpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJUFRfUkVHU19JUChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlQVF9SRUdTX0VBWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSBzaWc7CisJUFRfUkVHU19FRFgocmVncykgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOworCVBUX1JFR1NfRUNYKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisKKwlpZiAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX0RUUkFDRSkgJiYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCXJldHVybiAwOworfQorCitsb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBzcCA9IFBUX1JFR1NfU1AoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHNwIC0gOCk7CisJc2lnc2V0X3Qgc2V0OworCXN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MgPSAmZnJhbWUtPnNjOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpvbGRtYXNrID0gJnNjLT5vbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpleHRyYW1hc2sgPSBmcmFtZS0+ZXh0cmFtYXNrOworCWludCBzaWdfc2l6ZSA9IChfTlNJR19XT1JEUyAtIDEpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzBdLCBvbGRtYXNrLCBzaXplb2Yoc2V0LnNpZ1swXSkpIHx8CisJICAgIGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzFdLCBleHRyYW1hc2ssIHNpZ19zaXplKSkKKwkJZ290byBzZWdmYXVsdDsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CisKKwlpZiAoY29weV9zY19mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5yZWdzLCBzYykpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwkvKiBBdm9pZCBFUkVTVEFSVCBoYW5kbGluZyAqLworCVBUX1JFR1NfU1lTQ0FMTF9OUigmY3VycmVudC0+dGhyZWFkLnJlZ3MpID0gLTE7CisJcmV0dXJuIFBUX1JFR1NfU1lTQ0FMTF9SRVQoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKworIHNlZ2ZhdWx0OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RydWN0IHJ0X3NpZ2ZyYW1lCit7CisJY2hhciBfX3VzZXIgKnByZXRjb2RlOworCXN0cnVjdCB1Y29udGV4dCB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCXN0cnVjdCBfZnBzdGF0ZSBmcHN0YXRlOworfTsKKworaW50IHNldHVwX3NpZ25hbF9zdGFja19zaSh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgaW50IHNpZywKKwkJCSAgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpzZXQpCit7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CisKKwlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopCisJCXJvdW5kX2Rvd24oc3RhY2tfdG9wIC0gc2l6ZW9mKHN0cnVjdCBydF9zaWdmcmFtZSksIDE2KTsKKwkvKiBTdWJ0cmFjdCAxMjggZm9yIGEgcmVkIHpvbmUgYW5kIDggZm9yIHByb3BlciBhbGlnbm1lbnQgKi8KKwlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopICgodW5zaWduZWQgbG9uZykgZnJhbWUgLSAxMjggLSA4KTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgeworCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIobWUtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKFBUX1JFR1NfU1AocmVncykpLAorCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcihtZS0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CisJZXJyIHw9IGNvcHlfc2NfdG9fdXNlcigmZnJhbWUtPnVjLnVjX21jb250ZXh0LCAmZnJhbWUtPmZwc3RhdGUsIHJlZ3MsCisJCQkgICAgICAgc2V0LT5zaWdbMF0pOworCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+ZnBzdGF0ZSwgJmZyYW1lLT51Yy51Y19tY29udGV4dC5mcHN0YXRlKTsKKwlpZiAoc2l6ZW9mKCpzZXQpID09IDE2KSB7CisJCV9fcHV0X3VzZXIoc2V0LT5zaWdbMF0sICZmcmFtZS0+dWMudWNfc2lnbWFzay5zaWdbMF0pOworCQlfX3B1dF91c2VyKHNldC0+c2lnWzFdLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2suc2lnWzFdKTsKKwl9CisJZWxzZQorCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsCisJCQkJICAgICAgc2l6ZW9mKCpzZXQpKTsKKworCS8qCisJICogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gIElmIHByb3ZpZGVkLCB1c2UgYSBzdHViCisJICogYWxyZWFkeSBpbiB1c2Vyc3BhY2UuCisJICovCisJLyogeDg2LTY0IHNob3VsZCBhbHdheXMgdXNlIFNBX1JFU1RPUkVSLiAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2EtPnNhLnNhX3Jlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwllbHNlCisJCS8qIGNvdWxkIHVzZSBhIHZzdHViIGhlcmUgKi8KKwkJcmV0dXJuIGVycjsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLworCXsKKwkJc3RydWN0IGV4ZWNfZG9tYWluICplZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW47CisJCWlmICh1bmxpa2VseShlZCAmJiBlZC0+c2lnbmFsX2ludm1hcCAmJiBzaWcgPCAzMikpCisJCQlzaWcgPSBlZC0+c2lnbmFsX2ludm1hcFtzaWddOworCX0KKworCVBUX1JFR1NfU1AocmVncykgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7CisJUFRfUkVHU19SREkocmVncykgPSBzaWc7CisJLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLworCVBUX1JFR1NfUkFYKHJlZ3MpID0gMDsKKworCS8qCisJICogVGhpcyBhbHNvIHdvcmtzIGZvciBub24gU0FfU0lHSU5GTyBoYW5kbGVycyBiZWNhdXNlIHRoZXkgZXhwZWN0IHRoZQorCSAqIG5leHQgYXJndW1lbnQgYWZ0ZXIgdGhlIHNpZ25hbCBudW1iZXIgb24gdGhlIHN0YWNrLgorCSAqLworCVBUX1JFR1NfUlNJKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKKwlQVF9SRUdTX1JEWChyZWdzKSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCVBUX1JFR1NfUklQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworIG91dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2xvbmcgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gUFRfUkVHU19TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MpOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0KKwkJKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikoc3AgLSBzaXplb2YobG9uZykpOworCXN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjID0gJmZyYW1lLT51YzsKKwlzaWdzZXRfdCBzZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNldCwgJnVjLT51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOworCisJaWYgKGNvcHlfc2NfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQucmVncywgJnVjLT51Y19tY29udGV4dCkpCisJCWdvdG8gc2VnZmF1bHQ7CisKKwkvKiBBdm9pZCBFUkVTVEFSVCBoYW5kbGluZyAqLworCVBUX1JFR1NfU1lTQ0FMTF9OUigmY3VycmVudC0+dGhyZWFkLnJlZ3MpID0gLTE7CisJcmV0dXJuIFBUX1JFR1NfU1lTQ0FMTF9SRVQoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKworIHNlZ2ZhdWx0OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19YODZfMzIKK2xvbmcgcHRyZWdzX3NpZ3JldHVybih2b2lkKQoreworCXJldHVybiBzeXNfc2lncmV0dXJuKE5VTEwpOworfQorbG9uZyBwdHJlZ3NfcnRfc2lncmV0dXJuKHZvaWQpCit7CisJcmV0dXJuIHN5c19ydF9zaWdyZXR1cm4oTlVMTCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3R1Yi5TIGIvYXJjaC94ODYvdW0vc3R1Yl8zMi5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy1pMzg2L3N0dWIuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3R1Yl8zMi5TCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TIGIvYXJjaC94ODYvdW0vc3R1Yl82NC5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zdHViXzY0LlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3N0dWJfc2Vndi5jIGIvYXJjaC94ODYvdW0vc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3N0dWJfc2Vndi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKyNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCisjaW5jbHVkZSAic3lzZGVwL21jb250ZXh0LmgiCisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLl9fc3lzY2FsbF9zdHViIikpKQorc3R1Yl9zZWd2X2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190ICppbmZvLCB2b2lkICpwKQoreworCXN0cnVjdCB1Y29udGV4dCAqdWMgPSBwOworCisJR0VUX0ZBVUxUSU5GT19GUk9NX01DKCooKHN0cnVjdCBmYXVsdGluZm8gKikgU1RVQl9EQVRBKSwKKwkJCSAgICAgICZ1Yy0+dWNfbWNvbnRleHQpOworCXRyYXBfbXlzZWxmKCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzMyLlMgYi9hcmNoL3g4Ni91bS9zeXNfY2FsbF90YWJsZV8zMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2E4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS9zeXNfY2FsbF90YWJsZV8zMi5TCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisvKiBTdGVhbCBpMzg2IHN5c2NhbGwgdGFibGUgZm9yIG91ciBwdXJwb3NlcywgYnV0IHdpdGggc29tZSBzbGlnaHQgY2hhbmdlcy4qLworCisjZGVmaW5lIHN5c19pb3BsIHN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19pb3Blcm0gc3lzX25pX3N5c2NhbGwKKworI2RlZmluZSBzeXNfdm04Nm9sZCBzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfdm04NiBzeXNfbmlfc3lzY2FsbAorCisjZGVmaW5lIG9sZF9tbWFwIHN5c19vbGRfbW1hcAorCisjZGVmaW5lIHB0cmVnc19mb3JrIHN5c19mb3JrCisjZGVmaW5lIHB0cmVnc19leGVjdmUgc3lzX2V4ZWN2ZQorI2RlZmluZSBwdHJlZ3NfaW9wbCBzeXNfaW9wbAorI2RlZmluZSBwdHJlZ3Nfdm04Nm9sZCBzeXNfdm04Nm9sZAorI2RlZmluZSBwdHJlZ3NfY2xvbmUgc3lzX2Nsb25lCisjZGVmaW5lIHB0cmVnc192bTg2IHN5c192bTg2CisjZGVmaW5lIHB0cmVnc19zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKKyNkZWZpbmUgcHRyZWdzX3Zmb3JrIHN5c192Zm9yaworCisuc2VjdGlvbiAucm9kYXRhLCJhIgorCisjaW5jbHVkZSAiLi4va2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUyIKKworRU5UUlkoc3lzY2FsbF90YWJsZV9zaXplKQorLmxvbmcgLi1zeXNfY2FsbF90YWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc3lzX2NhbGxfdGFibGVfNjQuYyBiL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MjJmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBVTUwveDg2LTY0LCBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvc3lzY2FsbC5jCisgKiB3aXRoIHNvbWUgY2hhbmdlcyBmb3IgVU1MLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKworI2RlZmluZSBfX05PX1NUVUJTCisKKy8qCisgKiBCZWxvdyB5b3UgY2FuIHNlZSwgaW4gdGVybXMgb2YgI2RlZmluZSdzLCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgeDg2LTY0CisgKiBhbmQgdGhlIFVNTCBzeXNjYWxsIHRhYmxlLgorICovCisKKy8qIE5vdCBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCBieSBVTUwsIHNpbmNlIHdlIGhhdmUgbm8gaGFyZHdhcmUuICovCisjZGVmaW5lIHN0dWJfaW9wbCBzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfaW9wZXJtIHN5c19uaV9zeXNjYWxsCisKKy8qCisgKiBUaGUgVU1MIFRMUyBwcm9ibGVtLiBOb3RlIHRoYXQgeDg2XzY0IGRvZXMgbm90IGltcGxlbWVudCB0aGlzLCBzbyB0aGUgYmVsb3cKKyAqIGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgaWEzMiBjb21wYXRpYmlsaXR5LgorICovCisKKy8qIE9uIFVNTCB3ZSBjYWxsIGl0IHRoaXMgd2F5ICgib2xkIiBtZWFucyBpdCdzIG5vdCBtbWFwMikgKi8KKyNkZWZpbmUgc3lzX21tYXAgb2xkX21tYXAKKworI2RlZmluZSBzdHViX2Nsb25lIHN5c19jbG9uZQorI2RlZmluZSBzdHViX2Zvcmsgc3lzX2ZvcmsKKyNkZWZpbmUgc3R1Yl92Zm9yayBzeXNfdmZvcmsKKyNkZWZpbmUgc3R1Yl9leGVjdmUgc3lzX2V4ZWN2ZQorI2RlZmluZSBzdHViX3J0X3NpZ3N1c3BlbmQgc3lzX3J0X3NpZ3N1c3BlbmQKKyNkZWZpbmUgc3R1Yl9zaWdhbHRzdGFjayBzeXNfc2lnYWx0c3RhY2sKKyNkZWZpbmUgc3R1Yl9ydF9zaWdyZXR1cm4gc3lzX3J0X3NpZ3JldHVybgorCisjZGVmaW5lIF9fU1lTQ0FMTChuciwgc3ltKSBleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5bSh2b2lkKSA7CisjdW5kZWYgX0FTTV9YODZfVU5JU1REXzY0X0gKKyNpbmNsdWRlICIuLi8uLi94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgiCisKKyN1bmRlZiBfX1NZU0NBTEwKKyNkZWZpbmUgX19TWVNDQUxMKG5yLCBzeW0pIFsgbnIgXSA9IHN5bSwKKyN1bmRlZiBfQVNNX1g4Nl9VTklTVERfNjRfSAorCit0eXBlZGVmIHZvaWQgKCpzeXNfY2FsbF9wdHJfdCkodm9pZCk7CisKK2V4dGVybiB2b2lkIHN5c19uaV9zeXNjYWxsKHZvaWQpOworCisvKgorICogV2UgdXNlZCB0byBoYXZlIGEgdHJpY2sgaGVyZSB3aGljaCBtYWRlIHN1cmUgdGhhdCBob2xlcyBpbiB0aGUKKyAqIHg4Nl82NCB0YWJsZSB3ZXJlIGZpbGxlZCBpbiB3aXRoIHN5c19uaV9zeXNjYWxsLCBidXQgYSBjb21tZW50IGluCisgKiB1bmlzdGRfNjQuaCBzYXlzIHRoYXQgaG9sZXMgYXJlbid0IGFsbG93ZWQsIHNvIHRoZSB0cmljayB3YXMKKyAqIHJlbW92ZWQuCisgKiBUaGUgdHJpY2sgbG9va2VkIGxpa2UgdGhpcworICoJWzAgLi4uIFVNX05SX3N5c2NhbGxfbWF4XSA9ICZzeXNfbmlfc3lzY2FsbAorICogYmVmb3JlIGluY2x1ZGluZyB1bmlzdGRfNjQuaCAtIHRoZSBsYXRlciBpbml0aWFsaXphdGlvbnMgb3Zlcndyb3RlCisgKiB0aGUgc3lzX25pX3N5c2NhbGwgZmlsbGVyLgorICovCisKK3N5c19jYWxsX3B0cl90IHN5c19jYWxsX3RhYmxlW10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKKyNpbmNsdWRlIDxhc20vdW5pc3RkXzY0Lmg+Cit9OworCitpbnQgc3lzY2FsbF90YWJsZV9zaXplID0gc2l6ZW9mKHN5c19jYWxsX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYyBiL2FyY2gveDg2L3VtL3N5c2NhbGxzXzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3lzY2FsbHNfMzIuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxzLmMgYi9hcmNoL3g4Ni91bS9zeXNjYWxsc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vc3lzY2FsbHNfNjQuYwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zeXNycS5jIGIvYXJjaC94ODYvdW0vc3lzcnFfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni9zeXNycS5jCnJlbmFtZSB0byBhcmNoL3g4Ni91bS9zeXNycV8zMi5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zeXNycV82NC5jIGIvYXJjaC94ODYvdW0vc3lzcnFfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkxMzQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vc3lzcnFfNjQuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlICJzeXNycS5oIgorCit2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50aygiXG4iKTsKKwlwcmludF9tb2R1bGVzKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUGlkOiAlZCwgY29tbTogJS4yMHMgJXMgJXNcbiIsIHRhc2tfcGlkX25yKGN1cnJlbnQpLAorCQljdXJyZW50LT5jb21tLCBwcmludF90YWludGVkKCksIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlKTsKKwlwcmludGsoS0VSTl9JTkZPICJSSVA6ICUwNGx4Ols8JTAxNmx4Pl1cbiIsIFBUX1JFR1NfQ1MocmVncykgJiAweGZmZmYsCisJICAgICAgIFBUX1JFR1NfUklQKHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSU1A6ICUwMTZseCAgRUZMQUdTOiAlMDhseFxuIiwgUFRfUkVHU19TUChyZWdzKSwKKwkgICAgICAgUFRfUkVHU19FRkxBR1MocmVncykpOworCXByaW50ayhLRVJOX0lORk8gIlJBWDogJTAxNmx4IFJCWDogJTAxNmx4IFJDWDogJTAxNmx4XG4iLAorCSAgICAgICBQVF9SRUdTX1JBWChyZWdzKSwgUFRfUkVHU19SQlgocmVncyksIFBUX1JFR1NfUkNYKHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSRFg6ICUwMTZseCBSU0k6ICUwMTZseCBSREk6ICUwMTZseFxuIiwKKwkgICAgICAgUFRfUkVHU19SRFgocmVncyksIFBUX1JFR1NfUlNJKHJlZ3MpLCBQVF9SRUdTX1JESShyZWdzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUkJQOiAlMDE2bHggUjA4OiAlMDE2bHggUjA5OiAlMDE2bHhcbiIsCisJICAgICAgIFBUX1JFR1NfUkJQKHJlZ3MpLCBQVF9SRUdTX1I4KHJlZ3MpLCBQVF9SRUdTX1I5KHJlZ3MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJSMTA6ICUwMTZseCBSMTE6ICUwMTZseCBSMTI6ICUwMTZseFxuIiwKKwkgICAgICAgUFRfUkVHU19SMTAocmVncyksIFBUX1JFR1NfUjExKHJlZ3MpLCBQVF9SRUdTX1IxMihyZWdzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUjEzOiAlMDE2bHggUjE0OiAlMDE2bHggUjE1OiAlMDE2bHhcbiIsCisJICAgICAgIFBUX1JFR1NfUjEzKHJlZ3MpLCBQVF9SRUdTX1IxNChyZWdzKSwgUFRfUkVHU19SMTUocmVncykpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlfX3Nob3dfcmVncyhyZWdzKTsKKwlzaG93X3RyYWNlKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopICZyZWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvdGxzLmMgYi9hcmNoL3g4Ni91bS90bHNfMzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMtaTM4Ni90bHMuYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdGxzXzMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC90bHMuYyBiL2FyY2gveDg2L3VtL3Rsc182NC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3VtL3N5cy14ODZfNjQvdGxzLmMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Rsc182NC5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS91c2VyLW9mZnNldHMuYyBiL2FyY2gveDg2L3VtL3VzZXItb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDliZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS91c2VyLW9mZnNldHMuYwpAQCAtMCwwICsxLDgwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIERFRklORShzeW0sIHZhbCkgXAorCWFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwpKQorCisjZGVmaW5lIERFRklORV9MT05HUyhzeW0sIHZhbCkgXAorCWFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKKwordm9pZCBmb28odm9pZCkKK3sKKyNpZmRlZiBfX2kzODZfXworCURFRklORV9MT05HUyhIT1NUX0ZQX1NJWkUsIHNpemVvZihzdHJ1Y3QgdXNlcl9mcHJlZ3Nfc3RydWN0KSk7CisJREVGSU5FX0xPTkdTKEhPU1RfRlBYX1NJWkUsIHNpemVvZihzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdCkpOworCisJREVGSU5FKEhPU1RfSVAsIEVJUCk7CisJREVGSU5FKEhPU1RfU1AsIFVFU1ApOworCURFRklORShIT1NUX0VGTEFHUywgRUZMKTsKKwlERUZJTkUoSE9TVF9BWCwgRUFYKTsKKwlERUZJTkUoSE9TVF9CWCwgRUJYKTsKKwlERUZJTkUoSE9TVF9DWCwgRUNYKTsKKwlERUZJTkUoSE9TVF9EWCwgRURYKTsKKwlERUZJTkUoSE9TVF9TSSwgRVNJKTsKKwlERUZJTkUoSE9TVF9ESSwgRURJKTsKKwlERUZJTkUoSE9TVF9CUCwgRUJQKTsKKwlERUZJTkUoSE9TVF9DUywgQ1MpOworCURFRklORShIT1NUX1NTLCBTUyk7CisJREVGSU5FKEhPU1RfRFMsIERTKTsKKwlERUZJTkUoSE9TVF9GUywgRlMpOworCURFRklORShIT1NUX0VTLCBFUyk7CisJREVGSU5FKEhPU1RfR1MsIEdTKTsKKwlERUZJTkUoSE9TVF9PUklHX0FYLCBPUklHX0VBWCk7CisjZWxzZQorCURFRklORShIT1NUX0ZQX1NJWkUsIHNpemVvZihzdHJ1Y3QgX2Zwc3RhdGUpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9CWCwgUkJYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9DWCwgUkNYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9ESSwgUkRJKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9TSSwgUlNJKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9EWCwgUkRYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9CUCwgUkJQKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9BWCwgUkFYKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SOCwgUjgpOworCURFRklORV9MT05HUyhIT1NUX1I5LCBSOSk7CisJREVGSU5FX0xPTkdTKEhPU1RfUjEwLCBSMTApOworCURFRklORV9MT05HUyhIT1NUX1IxMSwgUjExKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SMTIsIFIxMik7CisJREVGSU5FX0xPTkdTKEhPU1RfUjEzLCBSMTMpOworCURFRklORV9MT05HUyhIT1NUX1IxNCwgUjE0KTsKKwlERUZJTkVfTE9OR1MoSE9TVF9SMTUsIFIxNSk7CisJREVGSU5FX0xPTkdTKEhPU1RfT1JJR19BWCwgT1JJR19SQVgpOworCURFRklORV9MT05HUyhIT1NUX0NTLCBDUyk7CisJREVGSU5FX0xPTkdTKEhPU1RfU1MsIFNTKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9FRkxBR1MsIEVGTEFHUyk7CisjaWYgMAorCURFRklORV9MT05HUyhIT1NUX0ZTLCBGUyk7CisJREVGSU5FX0xPTkdTKEhPU1RfR1MsIEdTKTsKKwlERUZJTkVfTE9OR1MoSE9TVF9EUywgRFMpOworCURFRklORV9MT05HUyhIT1NUX0VTLCBFUyk7CisjZW5kaWYKKworCURFRklORV9MT05HUyhIT1NUX0lQLCBSSVApOworCURFRklORV9MT05HUyhIT1NUX1NQLCBSU1ApOworI2VuZGlmCisKKwlERUZJTkUoVU1fRlJBTUVfU0laRSwgc2l6ZW9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSk7CisJREVGSU5FKFVNX1BPTExJTiwgUE9MTElOKTsKKwlERUZJTkUoVU1fUE9MTFBSSSwgUE9MTFBSSSk7CisJREVGSU5FKFVNX1BPTExPVVQsIFBPTExPVVQpOworCisJREVGSU5FKFVNX1BST1RfUkVBRCwgUFJPVF9SRUFEKTsKKwlERUZJTkUoVU1fUFJPVF9XUklURSwgUFJPVF9XUklURSk7CisJREVGSU5FKFVNX1BST1RfRVhFQywgUFJPVF9FWEVDKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3Zkc28vTWFrZWZpbGUgYi9hcmNoL3g4Ni91bS92ZHNvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODAzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni91bS92ZHNvL01ha2VmaWxlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgQnVpbGRpbmcgdkRTTyBpbWFnZXMgZm9yIHg4Ni4KKyMKKworVkRTTzY0LXkJCTo9IHkKKwordmRzby1pbnN0YWxsLSQoVkRTTzY0LXkpCSs9IHZkc28uc28KKworCisjIGZpbGVzIHRvIGxpbmsgaW50byB0aGUgdmRzbwordm9ianMteSA6PSB2ZHNvLW5vdGUubyB1bV92ZHNvLm8KKworIyBmaWxlcyB0byBsaW5rIGludG8ga2VybmVsCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLm8gdm1hLm8KKwordm9ianMgOj0gJChmb3JlYWNoIEYsJCh2b2Jqcy15KSwkKG9iaikvJEYpCisKKyQob2JqKS92ZHNvLm86ICQob2JqKS92ZHNvLnNvCisKK3RhcmdldHMgKz0gdmRzby5zbyB2ZHNvLnNvLmRiZyB2ZHNvLmxkcyAkKHZvYmpzLXkpCisKK2V4cG9ydCBDUFBGTEFHU192ZHNvLmxkcyArPSAtUCAtQworCitWRFNPX0xERkxBR1NfdmRzby5sZHMgPSAtbTY0IC1XbCwtc29uYW1lPWxpbnV4LXZkc28uc28uMSBcCisgICAgICAgLVdsLC16LG1heC1wYWdlLXNpemU9NDA5NiAtV2wsLXosY29tbW9uLXBhZ2Utc2l6ZT00MDk2CisKKyQob2JqKS92ZHNvLm86ICQoc3JjKS92ZHNvLlMgJChvYmopL3Zkc28uc28KKworJChvYmopL3Zkc28uc28uZGJnOiAkKHNyYykvdmRzby5sZHMgJCh2b2JqcykgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvKQorCiskKG9iaikvJS5zbzogT0JKQ09QWUZMQUdTIDo9IC1TCiskKG9iaikvJS5zbzogJChvYmopLyUuc28uZGJnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworIworIyBEb24ndCBvbWl0IGZyYW1lIHBvaW50ZXJzIGZvciBlYXNlIG9mIHVzZXJzcGFjZSBkZWJ1Z2dpbmcsIGJ1dCBkbworIyBvcHRpbWl6ZSBzaWJsaW5nIGNhbGxzLgorIworQ0ZMIDo9ICQoUFJPRklMSU5HKSAtbWNtb2RlbD1zbWFsbCAtZlBJQyAtTzIgLWZhc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IFwKKyAgICAgICAkKGZpbHRlciAtZyUsJChLQlVJTERfQ0ZMQUdTKSkgJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IpIFwKKyAgICAgICAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm9wdGltaXplLXNpYmxpbmctY2FsbHMKKworJCh2b2Jqcyk6IEtCVUlMRF9DRkxBR1MgKz0gJChDRkwpCisKKyMKKyMgdkRTTyBjb2RlIHJ1bnMgaW4gdXNlcnNwYWNlIGFuZCAtcGcgZG9lc24ndCBoZWxwIHdpdGggcHJvZmlsaW5nIGFueXdheS4KKyMKK0NGTEFHU19SRU1PVkVfdmRzby1ub3RlLm8gPSAtcGcgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlCitDRkxBR1NfUkVNT1ZFX3VtX3Zkc28ubyA9IC1wZyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UKKwordGFyZ2V0cyArPSB2ZHNvLXN5bXMubGRzCitvYmotJChWRFNPNjQteSkJCQkrPSB2ZHNvLXN5bXMubGRzCisKKyMKKyMgTWF0Y2ggc3ltYm9scyBpbiB0aGUgRFNPIHRoYXQgbG9vayBsaWtlIFZEU08qOyBwcm9kdWNlIGEgZmlsZSBvZiBjb25zdGFudHMuCisjCitzZWQtdmRzb3N5bSA6PSAtZSAncy9eMDAqLzAvJyBcCisJLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKFZEU09bYS16QS1aMC05X10qXCkkJC9cMiA9IDB4XDE7L3AnCitxdWlldF9jbWRfdmRzb3N5bSA9IFZEU09TWU0gJEAKK2RlZmluZSBjbWRfdmRzb3N5bQorCSQoTk0pICQ8IHwgTENfQUxMPUMgc2VkIC1uICQoc2VkLXZkc29zeW0pIHwgTENfQUxMPUMgc29ydCA+ICRACitlbmRlZgorCiskKG9iaikvJS1zeW1zLmxkczogJChvYmopLyUuc28uZGJnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdmRzb3N5bSkKKworIworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCisjCitxdWlldF9jbWRfdmRzbyA9IFZEU08gICAgJEAKKyAgICAgIGNtZF92ZHNvID0gJChDQykgLW5vc3RkbGliIC1vICRAIFwKKwkJICAgICAgICQoVkRTT19MREZMQUdTKSAkKFZEU09fTERGTEFHU18kKGZpbHRlciAlLmxkcywkKF5GKSkpIFwKKwkJICAgICAgIC1XbCwtVCwkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSAmJiBcCisJCSBzaCAkKHNyY3RyZWUpLyQoc3JjKS9jaGVja3VuZGVmLnNoICckKE5NKScgJyRAJworCitWRFNPX0xERkxBR1MgPSAtZlBJQyAtc2hhcmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKK0dDT1ZfUFJPRklMRSA6PSBuCisKKyMKKyMgSW5zdGFsbCB0aGUgdW5zdHJpcHBlZCBjb3B5IG9mIHZkc28qLnNvIGxpc3RlZCBpbiAkKHZkc28taW5zdGFsbC15KS4KKyMKK3F1aWV0X2NtZF92ZHNvX2luc3RhbGwgPSBJTlNUQUxMICRACisgICAgICBjbWRfdmRzb19pbnN0YWxsID0gY3AgJChvYmopLyRALmRiZyAkKE1PRExJQikvdmRzby8kQAorJCh2ZHNvLWluc3RhbGwteSk6ICUuc286ICQob2JqKS8lLnNvLmRiZyBGT1JDRQorCUBta2RpciAtcCAkKE1PRExJQikvdmRzbworCSQoY2FsbCBjbWQsdmRzb19pbnN0YWxsKQorCitQSE9OWSArPSB2ZHNvX2luc3RhbGwgJCh2ZHNvLWluc3RhbGwteSkKK3Zkc29faW5zdGFsbDogJCh2ZHNvLWluc3RhbGwteSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL2NoZWNrdW5kZWYuc2ggYi9hcmNoL3g4Ni91bS92ZHNvL2NoZWNrdW5kZWYuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL2NoZWNrdW5kZWYuc2gKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vY2hlY2t1bmRlZi5zaApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdW1fdmRzby5jIGIvYXJjaC94ODYvdW0vdmRzby91bV92ZHNvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3VtX3Zkc28uYwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdmRzby91bV92ZHNvLmMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28tbGF5b3V0Lmxkcy5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLWxheW91dC5sZHMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1sYXlvdXQubGRzLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vdmRzby1sYXlvdXQubGRzLlMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC92ZHNvL3Zkc28tbm90ZS5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLW5vdGUuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby1ub3RlLlMKcmVuYW1lIHRvIGFyY2gveDg2L3VtL3Zkc28vdmRzby1ub3RlLlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3Zkc28vdmRzby5TIGIvYXJjaC94ODYvdW0vdmRzby92ZHNvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3VtL3Zkc28vdmRzby5TCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK19fSU5JVERBVEEKKworCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAordmRzb19zdGFydDoKKwkuaW5jYmluICJhcmNoL3g4Ni91bS92ZHNvL3Zkc28uc28iCit2ZHNvX2VuZDoKKworX19GSU5JVApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUyBiL2FyY2gveDg2L3VtL3Zkc28vdmRzby5sZHMuUwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC91bS9zeXMteDg2XzY0L3Zkc28vdmRzby5sZHMuUwpyZW5hbWUgdG8gYXJjaC94ODYvdW0vdmRzby92ZHNvLmxkcy5TCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdW0vdmRzby92bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY0ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvdW0vdmRzby92bWEuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2hhcmQgV2VpbmJlcmdlciA8cmljaHJkQG5vZC5hdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSB2ZHNvX2VuYWJsZWQgPSAxOwordW5zaWduZWQgbG9uZyB1bV92ZHNvX2FkZHI7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKK2V4dGVybiBjaGFyIHZkc29fc3RhcnRbXSwgdmRzb19lbmRbXTsKKworc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb3A7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzbyh2b2lkKQoreworCXN0cnVjdCBwYWdlICp1bV92ZHNvOworCisJQlVHX09OKHZkc29fZW5kIC0gdmRzb19zdGFydCA+IFBBR0VfU0laRSk7CisKKwl1bV92ZHNvX2FkZHIgPSB0YXNrX3NpemUgLSBQQUdFX1NJWkU7CisKKwl2ZHNvcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkc29wKQorCQlnb3RvIG9vbTsKKworCXVtX3Zkc28gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghdW1fdmRzbykgeworCQlrZnJlZSh2ZHNvcCk7CisKKwkJZ290byBvb207CisJfQorCisJY29weV9wYWdlKHBhZ2VfYWRkcmVzcyh1bV92ZHNvKSwgdmRzb19zdGFydCk7CisJKnZkc29wID0gdW1fdmRzbzsKKworCXJldHVybiAwOworCitvb206CisJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWxsb2NhdGUgdmRzb1xuIik7CisJdmRzb19lbmFibGVkID0gMDsKKworCXJldHVybiAtRU5PTUVNOworfQorc3Vic3lzX2luaXRjYWxsKGluaXRfdmRzbyk7CisKK2ludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgaW50IHVzZXNfaW50ZXJwKQoreworCWludCBlcnI7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKworCWlmICghdmRzb19lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwllcnIgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgdW1fdmRzb19hZGRyLCBQQUdFX1NJWkUsCisJCVZNX1JFQUR8Vk1fRVhFQ3wKKwkJVk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDfAorCQlWTV9BTFdBWVNEVU1QLAorCQl2ZHNvcCk7CisKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdmRzby92bWEuYwppbmRleCAzMTZmYmNhLi4xNTM0MDdjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKQEAgLTg5LDYgKzg5LDE1IEBACiAJYWRkciA9IHN0YXJ0ICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKIAlpZiAoYWRkciA+PSBlbmQpCiAJCWFkZHIgPSBlbmQ7CisKKwkvKgorCSAqIHBhZ2UtYWxpZ24gaXQgaGVyZSBzbyB0aGF0IGdldF91bm1hcHBlZF9hcmVhIGRvZXNuJ3QKKwkgKiBhbGlnbiBpdCB3cm9uZ2Z1bGx5IGFnYWluIHRvIHRoZSBuZXh0IHBhZ2UuIGFkZHIgY2FuIGNvbWUgaW4gNEsKKwkgKiB1bmFsaWduZWQgaGVyZSBhcyBhIHJlc3VsdCBvZiBzdGFjayBzdGFydCByYW5kb21pemF0aW9uLgorCSAqLworCWFkZHIgPSBQQUdFX0FMSUdOKGFkZHIpOworCWFkZHIgPSBhbGlnbl9hZGRyKGFkZHIsIE5VTEwsIEFMSUdOX1ZEU08pOworCiAJcmV0dXJuIGFkZHI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3ZpZGVvL2ZiZGV2LmMgYi9hcmNoL3g4Ni92aWRlby9mYmRldi5jCmluZGV4IDY5NTI3NjguLmM1ZmZiNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3ZpZGVvL2ZiZGV2LmMKKysrIGIvYXJjaC94ODYvdmlkZW8vZmJkZXYuYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggNDliYTliNS4uNmJiZmQ3YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvYXJjaC94ODYveGVuL2dyYW50LXRhYmxlLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogCWlmIChzaGFyZWQgPT0gTlVMTCkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhID0KLQkJCXhlbl9hbGxvY192bV9hcmVhKFBBR0VfU0laRSAqIG1heF9ucl9nZnJhbWVzKTsKKwkJCWFsbG9jX3ZtX2FyZWEoUEFHRV9TSVpFICogbWF4X25yX2dmcmFtZXMpOwogCQlCVUdfT04oYXJlYSA9PSBOVUxMKTsKIAkJc2hhcmVkID0gYXJlYS0+YWRkcjsKIAkJKl9fc2hhcmVkID0gc2hhcmVkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3RpbWUuYyBiL2FyY2gveDg2L3hlbi90aW1lLmMKaW5kZXggMTYzYjQ2Ny4uMDI5NmE5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3RpbWUuYworKysgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCkBAIC0yMDEsOCArMjAxLDIyIEBACiAKIHN0YXRpYyBpbnQgeGVuX3NldF93YWxsY2xvY2sodW5zaWduZWQgbG9uZyBub3cpCiB7CisJc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCBvcDsKKwlpbnQgcmM7CisKIAkvKiBkbyBub3RoaW5nIGZvciBkb21VICovCi0JcmV0dXJuIC0xOworCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCisJCXJldHVybiAtMTsKKworCW9wLmNtZCA9IFhFTlBGX3NldHRpbWU7CisJb3AudS5zZXR0aW1lLnNlY3MgPSBub3c7CisJb3AudS5zZXR0aW1lLm5zZWNzID0gMDsKKwlvcC51LnNldHRpbWUuc3lzdGVtX3RpbWUgPSB4ZW5fY2xvY2tzb3VyY2VfcmVhZCgpOworCisJcmMgPSBIWVBFUlZJU09SX2RvbTBfb3AoJm9wKTsKKwlXQVJOKHJjICE9IDAsICJYRU5QRl9zZXR0aW1lIGZhaWxlZDogbm93PSVsZFxuIiwgbm93KTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSB4ZW5fY2xvY2tzb3VyY2UgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jZ3JvdXAuYyBiL2Jsb2NrL2Jsay1jZ3JvdXAuYwppbmRleCBiNTk2ZTU0Li44ZjYzMGNlIDEwMDY0NAotLS0gYS9ibG9jay9ibGstY2dyb3VwLmMKKysrIGIvYmxvY2svYmxrLWNncm91cC5jCkBAIC03NjgsMjUgKzc2OCwxNCBAQAogCXJldHVybiBkaXNrX3RvdGFsOwogfQogCi1zdGF0aWMgaW50IGJsa2lvX2NoZWNrX2Rldl9udW0oZGV2X3QgZGV2KQotewotCWludCBwYXJ0ID0gMDsKLQlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQotCWRpc2sgPSBnZXRfZ2VuZGlzayhkZXYsICZwYXJ0KTsKLQlpZiAoIWRpc2sgfHwgcGFydCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBibGtpb19wb2xpY3lfcGFyc2VfYW5kX3NldChjaGFyICpidWYsCiAJc3RydWN0IGJsa2lvX3BvbGljeV9ub2RlICpuZXdwbiwgZW51bSBibGtpb19wb2xpY3lfaWQgcGxpZCwgaW50IGZpbGVpZCkKIHsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IE5VTEw7CiAJY2hhciAqc1s0XSwgKnAsICptYWpvcl9zID0gTlVMTCwgKm1pbm9yX3MgPSBOVUxMOwotCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBtYWpvciwgbWlub3I7Ci0JaW50IGkgPSAwOworCWludCBpID0gMCwgcmV0ID0gLUVJTlZBTDsKKwlpbnQgcGFydDsKIAlkZXZfdCBkZXY7CiAJdTY0IHRlbXA7CiAKQEAgLTgwNCwzNyArNzkzLDM2IEBACiAJfQogCiAJaWYgKGkgIT0gMikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCiAJcCA9IHN0cnNlcCgmc1swXSwgIjoiKTsKIAlpZiAocCAhPSBOVUxMKQogCQltYWpvcl9zID0gcDsKIAllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKIAogCW1pbm9yX3MgPSBzWzBdOwogCWlmICghbWlub3JfcykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwobWFqb3JfcywgMTAsICZtYWpvcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmljdF9zdHJ0b3VsKG1ham9yX3MsIDEwLCAmbWFqb3IpKQorCQlnb3RvIG91dDsKIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsKG1pbm9yX3MsIDEwLCAmbWlub3IpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJpY3Rfc3RydG91bChtaW5vcl9zLCAxMCwgJm1pbm9yKSkKKwkJZ290byBvdXQ7CiAKIAlkZXYgPSBNS0RFVihtYWpvciwgbWlub3IpOwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWxsKHNbMV0sIDEwLCAmdGVtcCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmljdF9zdHJ0b3VsbChzWzFdLCAxMCwgJnRlbXApKQorCQlnb3RvIG91dDsKIAogCS8qIEZvciBydWxlIHJlbW92YWwsIGRvIG5vdCBjaGVjayBmb3IgZGV2aWNlIHByZXNlbmNlLiAqLwogCWlmICh0ZW1wKSB7Ci0JCXJldCA9IGJsa2lvX2NoZWNrX2Rldl9udW0oZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWRpc2sgPSBnZXRfZ2VuZGlzayhkZXYsICZwYXJ0KTsKKwkJaWYgKCFkaXNrIHx8IHBhcnQpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCW5ld3BuLT5kZXYgPSBkZXY7CkBAIC04NDMsNyArODMxLDcgQEAKIAljYXNlIEJMS0lPX1BPTElDWV9QUk9QOgogCQlpZiAoKHRlbXAgPCBCTEtJT19XRUlHSFRfTUlOICYmIHRlbXAgPiAwKSB8fAogCQkgICAgIHRlbXAgPiBCTEtJT19XRUlHSFRfTUFYKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAogCQluZXdwbi0+cGxpZCA9IHBsaWQ7CiAJCW5ld3BuLT5maWxlaWQgPSBmaWxlaWQ7CkBAIC04NjAsNyArODQ4LDcgQEAKIAkJY2FzZSBCTEtJT19USFJPVExfcmVhZF9pb3BzX2RldmljZToKIAkJY2FzZSBCTEtJT19USFJPVExfd3JpdGVfaW9wc19kZXZpY2U6CiAJCQlpZiAodGVtcCA+IFRIUk9UTF9JT1BTX01BWCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKIAogCQkJbmV3cG4tPnBsaWQgPSBwbGlkOwogCQkJbmV3cG4tPmZpbGVpZCA9IGZpbGVpZDsKQEAgLTg3MSw2OCArODU5LDk2IEBACiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQotCi0JcmV0dXJuIDA7CisJcmV0ID0gMDsKK291dDoKKwlwdXRfZGlzayhkaXNrKTsKKwlyZXR1cm4gcmV0OwogfQogCiB1bnNpZ25lZCBpbnQgYmxrY2dfZ2V0X3dlaWdodChzdHJ1Y3QgYmxraW9fY2dyb3VwICpibGtjZywKIAkJCSAgICAgIGRldl90IGRldikKIHsKIAlzdHJ1Y3QgYmxraW9fcG9saWN5X25vZGUgKnBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHdlaWdodDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGtjZy0+bG9jaywgZmxhZ3MpOwogCiAJcG4gPSBibGtpb19wb2xpY3lfc2VhcmNoX25vZGUoYmxrY2csIGRldiwgQkxLSU9fUE9MSUNZX1BST1AsCiAJCQkJQkxLSU9fUFJPUF93ZWlnaHRfZGV2aWNlKTsKIAlpZiAocG4pCi0JCXJldHVybiBwbi0+dmFsLndlaWdodDsKKwkJd2VpZ2h0ID0gcG4tPnZhbC53ZWlnaHQ7CiAJZWxzZQotCQlyZXR1cm4gYmxrY2ctPndlaWdodDsKKwkJd2VpZ2h0ID0gYmxrY2ctPndlaWdodDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gd2VpZ2h0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrY2dfZ2V0X3dlaWdodCk7CiAKIHVpbnQ2NF90IGJsa2NnX2dldF9yZWFkX2JwcyhzdHJ1Y3QgYmxraW9fY2dyb3VwICpibGtjZywgZGV2X3QgZGV2KQogewogCXN0cnVjdCBibGtpb19wb2xpY3lfbm9kZSAqcG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBicHMgPSAtMTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZibGtjZy0+bG9jaywgZmxhZ3MpOwogCXBuID0gYmxraW9fcG9saWN5X3NlYXJjaF9ub2RlKGJsa2NnLCBkZXYsIEJMS0lPX1BPTElDWV9USFJPVEwsCiAJCQkJQkxLSU9fVEhST1RMX3JlYWRfYnBzX2RldmljZSk7CiAJaWYgKHBuKQotCQlyZXR1cm4gcG4tPnZhbC5icHM7Ci0JZWxzZQotCQlyZXR1cm4gLTE7CisJCWJwcyA9IHBuLT52YWwuYnBzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYnBzOwogfQogCiB1aW50NjRfdCBibGtjZ19nZXRfd3JpdGVfYnBzKHN0cnVjdCBibGtpb19jZ3JvdXAgKmJsa2NnLCBkZXZfdCBkZXYpCiB7CiAJc3RydWN0IGJsa2lvX3BvbGljeV9ub2RlICpwbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQ2NF90IGJwcyA9IC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CiAJcG4gPSBibGtpb19wb2xpY3lfc2VhcmNoX25vZGUoYmxrY2csIGRldiwgQkxLSU9fUE9MSUNZX1RIUk9UTCwKIAkJCQlCTEtJT19USFJPVExfd3JpdGVfYnBzX2RldmljZSk7CiAJaWYgKHBuKQotCQlyZXR1cm4gcG4tPnZhbC5icHM7Ci0JZWxzZQotCQlyZXR1cm4gLTE7CisJCWJwcyA9IHBuLT52YWwuYnBzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYnBzOwogfQogCiB1bnNpZ25lZCBpbnQgYmxrY2dfZ2V0X3JlYWRfaW9wcyhzdHJ1Y3QgYmxraW9fY2dyb3VwICpibGtjZywgZGV2X3QgZGV2KQogewogCXN0cnVjdCBibGtpb19wb2xpY3lfbm9kZSAqcG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaW9wcyA9IC0xOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CiAJcG4gPSBibGtpb19wb2xpY3lfc2VhcmNoX25vZGUoYmxrY2csIGRldiwgQkxLSU9fUE9MSUNZX1RIUk9UTCwKIAkJCQlCTEtJT19USFJPVExfcmVhZF9pb3BzX2RldmljZSk7CiAJaWYgKHBuKQotCQlyZXR1cm4gcG4tPnZhbC5pb3BzOwotCWVsc2UKLQkJcmV0dXJuIC0xOworCQlpb3BzID0gcG4tPnZhbC5pb3BzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaW9wczsKIH0KIAogdW5zaWduZWQgaW50IGJsa2NnX2dldF93cml0ZV9pb3BzKHN0cnVjdCBibGtpb19jZ3JvdXAgKmJsa2NnLCBkZXZfdCBkZXYpCiB7CiAJc3RydWN0IGJsa2lvX3BvbGljeV9ub2RlICpwbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpb3BzID0gLTE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxrY2ctPmxvY2ssIGZsYWdzKTsKIAlwbiA9IGJsa2lvX3BvbGljeV9zZWFyY2hfbm9kZShibGtjZywgZGV2LCBCTEtJT19QT0xJQ1lfVEhST1RMLAogCQkJCUJMS0lPX1RIUk9UTF93cml0ZV9pb3BzX2RldmljZSk7CiAJaWYgKHBuKQotCQlyZXR1cm4gcG4tPnZhbC5pb3BzOwotCWVsc2UKLQkJcmV0dXJuIC0xOworCQlpb3BzID0gcG4tPnZhbC5pb3BzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2NnLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaW9wczsKIH0KIAogLyogQ2hlY2tzIHdoZXRoZXIgdXNlciBhc2tlZCBmb3IgZGVsZXRpbmcgYSBwb2xpY3kgcnVsZSAqLwpAQCAtMTA4NSw2ICsxMTAxLDcgQEAKIAogCWlmIChibGtpb19kZWxldGVfcnVsZV9jb21tYW5kKG5ld3BuKSkgewogCQlibGtpb19wb2xpY3lfZGVsZXRlX25vZGUocG4pOworCQlrZnJlZShwbik7CiAJCXNwaW5fdW5sb2NrX2lycSgmYmxrY2ctPmxvY2spOwogCQlnb3RvIHVwZGF0ZV9pb19ncm91cDsKIAl9CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY2dyb3VwLmggYi9ibG9jay9ibGstY2dyb3VwLmgKaW5kZXggYTcxZDI5MC4uNmYzYWNlNyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNncm91cC5oCisrKyBiL2Jsb2NrL2Jsay1jZ3JvdXAuaApAQCAtMTg4LDcgKzE4OCw3IEBACiAJdW5pb24gewogCQl1bnNpZ25lZCBpbnQgd2VpZ2h0OwogCQkvKgotCQkgKiBSYXRlIHJlYWQvd3JpdGUgaW4gdGVybXMgb2YgYnlwdGVzIHBlciBzZWNvbmQKKwkJICogUmF0ZSByZWFkL3dyaXRlIGluIHRlcm1zIG9mIGJ5dGVzIHBlciBzZWNvbmQKIAkJICogV2hldGhlciB0aGlzIHJhdGUgcmVwcmVzZW50cyByZWFkIG9yIHdyaXRlIGlzIGRldGVybWluZWQKIAkJICogYnkgZmlsZSB0eXBlICJmaWxlaWQiLgogCQkgKi8KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGQzNDQzM2EuLmY0M2M4YTUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0X3NvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KQEAgLTM4LDggKzM5LDYgQEAKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfcnFfcmVtYXApOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChibG9ja19iaW9fY29tcGxldGUpOwogCi1zdGF0aWMgaW50IF9fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwotCiAvKgogICogRm9yIHRoZSBhbGxvY2F0ZWQgcmVxdWVzdCB0YWJsZXMKICAqLwpAQCAtMzQ3LDMwICszNDYsODAgQEAKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3B1dF9xdWV1ZSk7CiAKLS8qCi0gKiBOb3RlOiBJZiBhIGRyaXZlciBzdXBwbGllZCB0aGUgcXVldWUgbG9jaywgaXQgaXMgZGlzY29ubmVjdGVkCi0gKiBieSB0aGlzIGZ1bmN0aW9uLiBUaGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBsb2NrIGRvZXNuJ3QgbWF0dGVyCi0gKiBoZXJlIGFzIHRoZSByZXF1ZXN0X3F1ZXVlIGlzbid0IGFjY2Vzc2libGUgYWZ0ZXIgdGhpcyBwb2ludAotICogKFFVRVVFX0ZMQUdfREVBRCBpcyBzZXQpIGFuZCBubyBvdGhlciByZXF1ZXN0cyB3aWxsIGJlIHF1ZXVlZC4KKy8qKgorICogYmxrX2RyYWluX3F1ZXVlIC0gZHJhaW4gcmVxdWVzdHMgZnJvbSByZXF1ZXN0X3F1ZXVlCisgKiBAcTogcXVldWUgdG8gZHJhaW4KKyAqIEBkcmFpbl9hbGw6IHdoZXRoZXIgdG8gZHJhaW4gYWxsIHJlcXVlc3RzIG9yIG9ubHkgdGhlIG9uZXMgdy8gRUxWUFJJVgorICoKKyAqIERyYWluIHJlcXVlc3RzIGZyb20gQHEuICBJZiBAZHJhaW5fYWxsIGlzIHNldCwgYWxsIHJlcXVlc3RzIGFyZSBkcmFpbmVkLgorICogSWYgbm90LCBvbmx5IEVMVlBSSVYgcmVxdWVzdHMgYXJlIGRyYWluZWQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgZW5zdXJpbmcgdGhhdCBubyBuZXcgcmVxdWVzdHMgd2hpY2ggbmVlZCB0byBiZSBkcmFpbmVkIGFyZSBxdWV1ZWQuCisgKi8KK3ZvaWQgYmxrX2RyYWluX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBib29sIGRyYWluX2FsbCkKK3sKKwl3aGlsZSAodHJ1ZSkgeworCQlpbnQgbnJfcnFzOworCisJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisKKwkJZWx2X2RyYWluX2VsZXZhdG9yKHEpOworCQlpZiAoZHJhaW5fYWxsKQorCQkJYmxrX3Rocm90bF9kcmFpbihxKTsKKworCQlfX2Jsa19ydW5fcXVldWUocSk7CisKKwkJaWYgKGRyYWluX2FsbCkKKwkJCW5yX3JxcyA9IHEtPnJxLmNvdW50WzBdICsgcS0+cnEuY291bnRbMV07CisJCWVsc2UKKwkJCW5yX3JxcyA9IHEtPnJxLmVsdnByaXY7CisKKwkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCisJCWlmICghbnJfcnFzKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMCk7CisJfQorfQorCisvKioKKyAqIGJsa19jbGVhbnVwX3F1ZXVlIC0gc2h1dGRvd24gYSByZXF1ZXN0IHF1ZXVlCisgKiBAcTogcmVxdWVzdCBxdWV1ZSB0byBzaHV0ZG93bgorICoKKyAqIE1hcmsgQHEgREVBRCwgZHJhaW4gYWxsIHBlbmRpbmcgcmVxdWVzdHMsIGRlc3Ryb3kgYW5kIHB1dCBpdC4gIEFsbAorICogZnV0dXJlIHJlcXVlc3RzIHdpbGwgYmUgZmFpbGVkIGltbWVkaWF0ZWx5IHdpdGggLUVOT0RFVi4KICAqLwogdm9pZCBibGtfY2xlYW51cF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKLQkvKgotCSAqIFdlIGtub3cgd2UgaGF2ZSBwcm9jZXNzIGNvbnRleHQgaGVyZSwgc28gd2UgY2FuIGJlIGEgbGl0dGxlCi0JICogY2F1dGlvdXMgYW5kIGVuc3VyZSB0aGF0IHBlbmRpbmcgYmxvY2sgYWN0aW9ucyBvbiB0aGlzIGRldmljZQotCSAqIGFyZSBkb25lIGJlZm9yZSBtb3Zpbmcgb24uIEdvaW5nIGludG8gdGhpcyBmdW5jdGlvbiwgd2Ugc2hvdWxkCi0JICogbm90IGhhdmUgcHJvY2Vzc2VzIGRvaW5nIElPIHRvIHRoaXMgZGV2aWNlLgotCSAqLwotCWJsa19zeW5jX3F1ZXVlKHEpOworCXNwaW5sb2NrX3QgKmxvY2sgPSBxLT5xdWV1ZV9sb2NrOwogCi0JZGVsX3RpbWVyX3N5bmMoJnEtPmJhY2tpbmdfZGV2X2luZm8ubGFwdG9wX21vZGVfd2JfdGltZXIpOworCS8qIG1hcmsgQHEgREVBRCwgbm8gbmV3IHJlcXVlc3Qgb3IgbWVyZ2VzIHdpbGwgYmUgYWxsb3dlZCBhZnRlcndhcmRzICovCiAJbXV0ZXhfbG9jaygmcS0+c3lzZnNfbG9jayk7CiAJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ERUFELCBxKTsKLQltdXRleF91bmxvY2soJnEtPnN5c2ZzX2xvY2spOworCisJc3Bpbl9sb2NrX2lycShsb2NrKTsKKwlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX05PTUVSR0VTLCBxKTsKKwlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX05PWE1FUkdFUywgcSk7CisJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19ERUFELCBxKTsKIAogCWlmIChxLT5xdWV1ZV9sb2NrICE9ICZxLT5fX3F1ZXVlX2xvY2spCiAJCXEtPnF1ZXVlX2xvY2sgPSAmcS0+X19xdWV1ZV9sb2NrOwogCisJc3Bpbl91bmxvY2tfaXJxKGxvY2spOworCW11dGV4X3VubG9jaygmcS0+c3lzZnNfbG9jayk7CisKKwkvKgorCSAqIERyYWluIGFsbCByZXF1ZXN0cyBxdWV1ZWQgYmVmb3JlIERFQUQgbWFya2luZy4gIFRoZSBjYWxsZXIgbWlnaHQKKwkgKiBiZSB0cnlpbmcgdG8gdGVhciBkb3duIEBxIGJlZm9yZSBpdHMgZWxldmF0b3IgaXMgaW5pdGlhbGl6ZWQsIGluCisJICogd2hpY2ggY2FzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgaW50byBkcmFpbmluZy4KKwkgKi8KKwlpZiAocS0+ZWxldmF0b3IpCisJCWJsa19kcmFpbl9xdWV1ZShxLCB0cnVlKTsKKworCS8qIEBxIHdvbid0IHByb2Nlc3MgYW55IG1vcmUgcmVxdWVzdCwgZmx1c2ggYXN5bmMgYWN0aW9ucyAqLworCWRlbF90aW1lcl9zeW5jKCZxLT5iYWNraW5nX2Rldl9pbmZvLmxhcHRvcF9tb2RlX3diX3RpbWVyKTsKKwlibGtfc3luY19xdWV1ZShxKTsKKworCS8qIEBxIGlzIGFuZCB3aWxsIHN0YXkgZW1wdHksIHNodXRkb3duIGFuZCBwdXQgKi8KIAlibGtfcHV0X3F1ZXVlKHEpOwogfQogRVhQT1JUX1NZTUJPTChibGtfY2xlYW51cF9xdWV1ZSk7CkBAIC01NDEsNyArNTkwLDcgQEAKIAkvKgogCSAqIFRoaXMgYWxzbyBzZXRzIGh3L3BoeXMgc2VnbWVudHMsIGJvdW5kYXJ5IGFuZCBzaXplCiAJICovCi0JYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChxLCBfX21ha2VfcmVxdWVzdCk7CisJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChxLCBibGtfcXVldWVfYmlvKTsKIAogCXEtPnNnX3Jlc2VydmVkX3NpemUgPSBJTlRfTUFYOwogCkBAIC01NzYsNyArNjI1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKLWJsa19hbGxvY19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgZmxhZ3MsIGludCBwcml2LCBnZnBfdCBnZnBfbWFzaykKK2Jsa19hbGxvY19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IG1lbXBvb2xfYWxsb2MocS0+cnEucnFfcG9vbCwgZ2ZwX21hc2spOwogCkBAIC01ODcsMTIgKzYzNiwxMCBAQAogCiAJcnEtPmNtZF9mbGFncyA9IGZsYWdzIHwgUkVRX0FMTE9DRUQ7CiAKLQlpZiAocHJpdikgewotCQlpZiAodW5saWtlbHkoZWx2X3NldF9yZXF1ZXN0KHEsIHJxLCBnZnBfbWFzaykpKSB7Ci0JCQltZW1wb29sX2ZyZWUocnEsIHEtPnJxLnJxX3Bvb2wpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfRUxWUFJJVjsKKwlpZiAoKGZsYWdzICYgUkVRX0VMVlBSSVYpICYmCisJICAgIHVubGlrZWx5KGVsdl9zZXRfcmVxdWVzdChxLCBycSwgZ2ZwX21hc2spKSkgeworCQltZW1wb29sX2ZyZWUocnEsIHEtPnJxLnJxX3Bvb2wpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcnE7CkBAIC02NTEsMTIgKzY5OCwxMyBAQAogICogQSByZXF1ZXN0IGhhcyBqdXN0IGJlZW4gcmVsZWFzZWQuICBBY2NvdW50IGZvciBpdCwgdXBkYXRlIHRoZSBmdWxsIGFuZAogICogY29uZ2VzdGlvbiBzdGF0dXMsIHdha2UgdXAgYW55IHdhaXRlcnMuICAgQ2FsbGVkIHVuZGVyIHEtPnF1ZXVlX2xvY2suCiAgKi8KLXN0YXRpYyB2b2lkIGZyZWVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBzeW5jLCBpbnQgcHJpdikKK3N0YXRpYyB2b2lkIGZyZWVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKKwlpbnQgc3luYyA9IHJ3X2lzX3N5bmMoZmxhZ3MpOwogCiAJcmwtPmNvdW50W3N5bmNdLS07Ci0JaWYgKHByaXYpCisJaWYgKGZsYWdzICYgUkVRX0VMVlBSSVYpCiAJCXJsLT5lbHZwcml2LS07CiAKIAlfX2ZyZWVkX3JlcXVlc3QocSwgc3luYyk7CkBAIC02ODQsMTAgKzczMiwxOSBAQAogCXJldHVybiB0cnVlOwogfQogCi0vKgotICogR2V0IGEgZnJlZSByZXF1ZXN0LCBxdWV1ZV9sb2NrIG11c3QgYmUgaGVsZC4KLSAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLCB3aXRoIHF1ZXVlX2xvY2sgaGVsZC4KLSAqIFJldHVybnMgIU5VTEwgb24gc3VjY2Vzcywgd2l0aCBxdWV1ZV9sb2NrICpub3QgaGVsZCouCisvKioKKyAqIGdldF9yZXF1ZXN0IC0gZ2V0IGEgZnJlZSByZXF1ZXN0CisgKiBAcTogcmVxdWVzdF9xdWV1ZSB0byBhbGxvY2F0ZSByZXF1ZXN0IGZyb20KKyAqIEByd19mbGFnczogUlcgYW5kIFNZTkMgZmxhZ3MKKyAqIEBiaW86IGJpbyB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciAoY2FuIGJlICVOVUxMKQorICogQGdmcF9tYXNrOiBhbGxvY2F0aW9uIG1hc2sKKyAqCisgKiBHZXQgYSBmcmVlIHJlcXVlc3QgZnJvbSBAcS4gIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgdW5kZXIgbWVtb3J5CisgKiBwcmVzc3VyZSBvciBpZiBAcSBpcyBkZWFkLgorICoKKyAqIE11c3QgYmUgY2FsbGxlZCB3aXRoIEBxLT5xdWV1ZV9sb2NrIGhlbGQgYW5kLAorICogUmV0dXJucyAlTlVMTCBvbiBmYWlsdXJlLCB3aXRoIEBxLT5xdWV1ZV9sb2NrIGhlbGQuCisgKiBSZXR1cm5zICElTlVMTCBvbiBzdWNjZXNzLCB3aXRoIEBxLT5xdWV1ZV9sb2NrICpub3QgaGVsZCouCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCByd19mbGFncywKIAkJCQkgICBzdHJ1Y3QgYmlvICpiaW8sIGdmcF90IGdmcF9tYXNrKQpAQCAtNjk2LDcgKzc1MywxMCBAQAogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBOVUxMOwogCWNvbnN0IGJvb2wgaXNfc3luYyA9IHJ3X2lzX3N5bmMocndfZmxhZ3MpICE9IDA7Ci0JaW50IG1heV9xdWV1ZSwgcHJpdiA9IDA7CisJaW50IG1heV9xdWV1ZTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKQorCQlyZXR1cm4gTlVMTDsKIAogCW1heV9xdWV1ZSA9IGVsdl9tYXlfcXVldWUocSwgcndfZmxhZ3MpOwogCWlmIChtYXlfcXVldWUgPT0gRUxWX01RVUVVRV9OTykKQEAgLTc0MCwxNyArODAwLDE3IEBACiAJcmwtPmNvdW50W2lzX3N5bmNdKys7CiAJcmwtPnN0YXJ2ZWRbaXNfc3luY10gPSAwOwogCi0JaWYgKGJsa19ycV9zaG91bGRfaW5pdF9lbGV2YXRvcihiaW8pKSB7Ci0JCXByaXYgPSAhdGVzdF9iaXQoUVVFVUVfRkxBR19FTFZTV0lUQ0gsICZxLT5xdWV1ZV9mbGFncyk7Ci0JCWlmIChwcml2KQotCQkJcmwtPmVsdnByaXYrKzsKKwlpZiAoYmxrX3JxX3Nob3VsZF9pbml0X2VsZXZhdG9yKGJpbykgJiYKKwkgICAgIXRlc3RfYml0KFFVRVVFX0ZMQUdfRUxWU1dJVENILCAmcS0+cXVldWVfZmxhZ3MpKSB7CisJCXJ3X2ZsYWdzIHw9IFJFUV9FTFZQUklWOworCQlybC0+ZWx2cHJpdisrOwogCX0KIAogCWlmIChibGtfcXVldWVfaW9fc3RhdChxKSkKIAkJcndfZmxhZ3MgfD0gUkVRX0lPX1NUQVQ7CiAJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCi0JcnEgPSBibGtfYWxsb2NfcmVxdWVzdChxLCByd19mbGFncywgcHJpdiwgZ2ZwX21hc2spOworCXJxID0gYmxrX2FsbG9jX3JlcXVlc3QocSwgcndfZmxhZ3MsIGdmcF9tYXNrKTsKIAlpZiAodW5saWtlbHkoIXJxKSkgewogCQkvKgogCQkgKiBBbGxvY2F0aW9uIGZhaWxlZCBwcmVzdW1hYmx5IGR1ZSB0byBtZW1vcnkuIFVuZG8gYW55dGhpbmcKQEAgLTc2MCw3ICs4MjAsNyBAQAogCQkgKiB3YWl0IHF1ZXVlLCBidXQgdGhpcyBpcyBwcmV0dHkgcmFyZS4KIAkJICovCiAJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCWZyZWVkX3JlcXVlc3QocSwgaXNfc3luYywgcHJpdik7CisJCWZyZWVkX3JlcXVlc3QocSwgcndfZmxhZ3MpOwogCiAJCS8qCiAJCSAqIGluIHRoZSB2ZXJ5IHVubGlrZWx5IGV2ZW50IHRoYXQgYWxsb2NhdGlvbiBmYWlsZWQgYW5kIG5vCkBAIC03OTAsMTEgKzg1MCwxOCBAQAogCXJldHVybiBycTsKIH0KIAotLyoKLSAqIE5vIGF2YWlsYWJsZSByZXF1ZXN0cyBmb3IgdGhpcyBxdWV1ZSwgd2FpdCBmb3Igc29tZSByZXF1ZXN0cyB0byBiZWNvbWUKLSAqIGF2YWlsYWJsZS4KKy8qKgorICogZ2V0X3JlcXVlc3Rfd2FpdCAtIGdldCBhIGZyZWUgcmVxdWVzdCB3aXRoIHJldHJ5CisgKiBAcTogcmVxdWVzdF9xdWV1ZSB0byBhbGxvY2F0ZSByZXF1ZXN0IGZyb20KKyAqIEByd19mbGFnczogUlcgYW5kIFNZTkMgZmxhZ3MKKyAqIEBiaW86IGJpbyB0byBhbGxvY2F0ZSByZXF1ZXN0IGZvciAoY2FuIGJlICVOVUxMKQogICoKLSAqIENhbGxlZCB3aXRoIHEtPnF1ZXVlX2xvY2sgaGVsZCwgYW5kIHJldHVybnMgd2l0aCBpdCB1bmxvY2tlZC4KKyAqIEdldCBhIGZyZWUgcmVxdWVzdCBmcm9tIEBxLiAgVGhpcyBmdW5jdGlvbiBrZWVwcyByZXRyeWluZyB1bmRlciBtZW1vcnkKKyAqIHByZXNzdXJlIGFuZCBmYWlscyBpZmYgQHEgaXMgZGVhZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxsZWQgd2l0aCBAcS0+cXVldWVfbG9jayBoZWxkIGFuZCwKKyAqIFJldHVybnMgJU5VTEwgb24gZmFpbHVyZSwgd2l0aCBAcS0+cXVldWVfbG9jayBoZWxkLgorICogUmV0dXJucyAhJU5VTEwgb24gc3VjY2Vzcywgd2l0aCBAcS0+cXVldWVfbG9jayAqbm90IGhlbGQqLgogICovCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0X3dhaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCByd19mbGFncywKIAkJCQkJc3RydWN0IGJpbyAqYmlvKQpAQCAtODA4LDYgKzg3NSw5IEBACiAJCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAJCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCisJCWlmICh1bmxpa2VseSh0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKQorCQkJcmV0dXJuIE5VTEw7CisKIAkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgmcmwtPndhaXRbaXNfc3luY10sICZ3YWl0LAogCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIApAQCAtODM4LDE5ICs5MDgsMTUgQEAKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAKLQlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlCVUdfT04ocncgIT0gUkVBRCAmJiBydyAhPSBXUklURSk7CiAKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCWlmIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpIHsKKwlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKQogCQlycSA9IGdldF9yZXF1ZXN0X3dhaXQocSwgcncsIE5VTEwpOwotCX0gZWxzZSB7CisJZWxzZQogCQlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBOVUxMLCBnZnBfbWFzayk7Ci0JCWlmICghcnEpCi0JCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JfQorCWlmICghcnEpCisJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAkvKiBxLT5xdWV1ZV9sb2NrIGlzIHVubG9ja2VkIGF0IHRoaXMgcG9pbnQgKi8KIAogCXJldHVybiBycTsKQEAgLTEwNTIsMTQgKzExMTgsMTMgQEAKIAkgKiBpdCBkaWRuJ3QgY29tZSBvdXQgb2Ygb3VyIHJlc2VydmVkIHJxIHBvb2xzCiAJICovCiAJaWYgKHJlcS0+Y21kX2ZsYWdzICYgUkVRX0FMTE9DRUQpIHsKLQkJaW50IGlzX3N5bmMgPSBycV9pc19zeW5jKHJlcSkgIT0gMDsKLQkJaW50IHByaXYgPSByZXEtPmNtZF9mbGFncyAmIFJFUV9FTFZQUklWOworCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSByZXEtPmNtZF9mbGFnczsKIAogCQlCVUdfT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWVsaXN0KSk7CiAJCUJVR19PTighaGxpc3RfdW5oYXNoZWQoJnJlcS0+aGFzaCkpOwogCiAJCWJsa19mcmVlX3JlcXVlc3QocSwgcmVxKTsKLQkJZnJlZWRfcmVxdWVzdChxLCBpc19zeW5jLCBwcml2KTsKKwkJZnJlZWRfcmVxdWVzdChxLCBmbGFncyk7CiAJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19ibGtfcHV0X3JlcXVlc3QpOwpAQCAtMTE2MSwxOCArMTIyNiwzMiBAQAogCXJldHVybiB0cnVlOwogfQogCi0vKgotICogQXR0ZW1wdHMgdG8gbWVyZ2Ugd2l0aCB0aGUgcGx1Z2dlZCBsaXN0IGluIHRoZSBjdXJyZW50IHByb2Nlc3MuIFJldHVybnMKLSAqIHRydWUgaWYgbWVyZ2Ugd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KKy8qKgorICogYXR0ZW1wdF9wbHVnX21lcmdlIC0gdHJ5IHRvIG1lcmdlIHdpdGggJWN1cnJlbnQncyBwbHVnZ2VkIGxpc3QKKyAqIEBxOiByZXF1ZXN0X3F1ZXVlIG5ldyBiaW8gaXMgYmVpbmcgcXVldWVkIGF0CisgKiBAYmlvOiBuZXcgYmlvIGJlaW5nIHF1ZXVlZAorICogQHJlcXVlc3RfY291bnQ6IG91dCBwYXJhbWV0ZXIgZm9yIG51bWJlciBvZiB0cmF2ZXJzZWQgcGx1Z2dlZCByZXF1ZXN0cworICoKKyAqIERldGVybWluZSB3aGV0aGVyIEBiaW8gYmVpbmcgcXVldWVkIG9uIEBxIGNhbiBiZSBtZXJnZWQgd2l0aCBhIHJlcXVlc3QKKyAqIG9uICVjdXJyZW50J3MgcGx1Z2dlZCBsaXN0LiAgUmV0dXJucyAldHJ1ZSBpZiBtZXJnZSB3YXMgc3VjY2Vzc2Z1bCwKKyAqIG90aGVyd2lzZSAlZmFsc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBAcS0+cXVldWVfbG9jazsgaG93ZXZlciwgZWxldmF0b3IgaXMKKyAqIGFjY2Vzc2VkIGlmZiB0aGVyZSBhbHJlYWR5IGFyZSByZXF1ZXN0cyBvbiB0aGUgcGx1Z2dlZCBsaXN0IHdoaWNoIGluCisgKiB0dXJuIGd1YXJhbnRlZXMgdmFsaWRpdHkgb2YgdGhlIGVsZXZhdG9yLgorICoKKyAqIE5vdGUgdGhhdCwgb24gc3VjY2Vzc2Z1bCBtZXJnZSwgZWxldmF0b3Igb3BlcmF0aW9uCisgKiBlbGV2YXRvcl9iaW9fbWVyZ2VkX2ZuKCkgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBxdWV1ZSBsb2NrLiAgRWxldmF0b3IKKyAqIG11c3QgYmUgcmVhZHkgZm9yIHRoaXMuCiAgKi8KLXN0YXRpYyBib29sIGF0dGVtcHRfcGx1Z19tZXJnZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCi0JCQkgICAgICAgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgKnJlcXVlc3RfY291bnQpCitzdGF0aWMgYm9vbCBhdHRlbXB0X3BsdWdfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJlcXVlc3RfY291bnQpCiB7CiAJc3RydWN0IGJsa19wbHVnICpwbHVnOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlib29sIHJldCA9IGZhbHNlOwogCi0JcGx1ZyA9IHRzay0+cGx1ZzsKKwlwbHVnID0gY3VycmVudC0+cGx1ZzsKIAlpZiAoIXBsdWcpCiAJCWdvdG8gb3V0OwogCSpyZXF1ZXN0X2NvdW50ID0gMDsKQEAgLTEyMDIsNyArMTI4MSw2IEBACiAKIHZvaWQgaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlyZXEtPmNwdSA9IGJpby0+YmlfY29tcF9jcHU7CiAJcmVxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0ZTOwogCiAJcmVxLT5jbWRfZmxhZ3MgfD0gYmlvLT5iaV9ydyAmIFJFUV9DT01NT05fTUFTSzsKQEAgLTEyMTUsNyArMTI5Myw3IEBACiAJYmxrX3JxX2Jpb19wcmVwKHJlcS0+cSwgcmVxLCBiaW8pOwogfQogCi1zdGF0aWMgaW50IF9fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit2b2lkIGJsa19xdWV1ZV9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAljb25zdCBib29sIHN5bmMgPSAhIShiaW8tPmJpX3J3ICYgUkVRX1NZTkMpOwogCXN0cnVjdCBibGtfcGx1ZyAqcGx1ZzsKQEAgLTEyNDAsOCArMTMxOCw4IEBACiAJICogQ2hlY2sgaWYgd2UgY2FuIG1lcmdlIHdpdGggdGhlIHBsdWdnZWQgbGlzdCBiZWZvcmUgZ3JhYmJpbmcKIAkgKiBhbnkgbG9ja3MuCiAJICovCi0JaWYgKGF0dGVtcHRfcGx1Z19tZXJnZShjdXJyZW50LCBxLCBiaW8sICZyZXF1ZXN0X2NvdW50KSkKLQkJZ290byBvdXQ7CisJaWYgKGF0dGVtcHRfcGx1Z19tZXJnZShxLCBiaW8sICZyZXF1ZXN0X2NvdW50KSkKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIApAQCAtMTI3NSw2ICsxMzUzLDEwIEBACiAJICogUmV0dXJucyB3aXRoIHRoZSBxdWV1ZSB1bmxvY2tlZC4KIAkgKi8KIAlyZXEgPSBnZXRfcmVxdWVzdF93YWl0KHEsIHJ3X2ZsYWdzLCBiaW8pOworCWlmICh1bmxpa2VseSghcmVxKSkgeworCQliaW9fZW5kaW8oYmlvLCAtRU5PREVWKTsJLyogQHEgaXMgZGVhZCAqLworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCiAJLyoKIAkgKiBBZnRlciBkcm9wcGluZyB0aGUgbG9jayBhbmQgcG9zc2libHkgc2xlZXBpbmcgaGVyZSwgb3VyIHJlcXVlc3QKQEAgLTEyODQsOCArMTM2Niw3IEBACiAJICovCiAJaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHJlcSwgYmlvKTsKIAotCWlmICh0ZXN0X2JpdChRVUVVRV9GTEFHX1NBTUVfQ09NUCwgJnEtPnF1ZXVlX2ZsYWdzKSB8fAotCSAgICBiaW9fZmxhZ2dlZChiaW8sIEJJT19DUFVfQUZGSU5FKSkKKwlpZiAodGVzdF9iaXQoUVVFVUVfRkxBR19TQU1FX0NPTVAsICZxLT5xdWV1ZV9mbGFncykpCiAJCXJlcS0+Y3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXBsdWcgPSBjdXJyZW50LT5wbHVnOwpAQCAtMTMxNiw5ICsxMzk3LDggQEAKIG91dF91bmxvY2s6CiAJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAl9Ci1vdXQ6Ci0JcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfcXVldWVfYmlvKTsJLyogZm9yIGRldmljZSBtYXBwZXIgb25seSAqLwogCiAvKgogICogSWYgYmlvLT5iaV9kZXYgaXMgYSBwYXJ0aXRpb24sIHJlbWFwIHRoZSBsb2NhdGlvbgpAQCAtMTQxNyw2ICsxNDk3LDg5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgYm9vbAorZ2VuZXJpY19tYWtlX3JlcXVlc3RfY2hlY2tzKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKKwlpbnQgbnJfc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7CisJaW50IGVyciA9IC1FSU87CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisKKwltaWdodF9zbGVlcCgpOworCisJaWYgKGJpb19jaGVja19lb2QoYmlvLCBucl9zZWN0b3JzKSkKKwkJZ290byBlbmRfaW87CisKKwlxID0gYmRldl9nZXRfcXVldWUoYmlvLT5iaV9iZGV2KTsKKwlpZiAodW5saWtlbHkoIXEpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImdlbmVyaWNfbWFrZV9yZXF1ZXN0OiBUcnlpbmcgdG8gYWNjZXNzICIKKwkJCSJub25leGlzdGVudCBibG9jay1kZXZpY2UgJXMgKCVMdSlcbiIsCisJCQliZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAorCQkJKGxvbmcgbG9uZykgYmlvLT5iaV9zZWN0b3IpOworCQlnb3RvIGVuZF9pbzsKKwl9CisKKwlpZiAodW5saWtlbHkoIShiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpICYmCisJCSAgICAgbnJfc2VjdG9ycyA+IHF1ZXVlX21heF9od19zZWN0b3JzKHEpKSkgeworCQlwcmludGsoS0VSTl9FUlIgImJpbyB0b28gYmlnIGRldmljZSAlcyAoJXUgPiAldSlcbiIsCisJCSAgICAgICBiZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAorCQkgICAgICAgYmlvX3NlY3RvcnMoYmlvKSwKKwkJICAgICAgIHF1ZXVlX21heF9od19zZWN0b3JzKHEpKTsKKwkJZ290byBlbmRfaW87CisJfQorCisJcGFydCA9IGJpby0+YmlfYmRldi0+YmRfcGFydDsKKwlpZiAoc2hvdWxkX2ZhaWxfcmVxdWVzdChwYXJ0LCBiaW8tPmJpX3NpemUpIHx8CisJICAgIHNob3VsZF9mYWlsX3JlcXVlc3QoJnBhcnRfdG9fZGlzayhwYXJ0KS0+cGFydDAsCisJCQkJYmlvLT5iaV9zaXplKSkKKwkJZ290byBlbmRfaW87CisKKwkvKgorCSAqIElmIHRoaXMgZGV2aWNlIGhhcyBwYXJ0aXRpb25zLCByZW1hcCBibG9jayBuCisJICogb2YgcGFydGl0aW9uIHAgdG8gYmxvY2sgbitzdGFydChwKSBvZiB0aGUgZGlzay4KKwkgKi8KKwlibGtfcGFydGl0aW9uX3JlbWFwKGJpbyk7CisKKwlpZiAoYmlvX2ludGVncml0eV9lbmFibGVkKGJpbykgJiYgYmlvX2ludGVncml0eV9wcmVwKGJpbykpCisJCWdvdG8gZW5kX2lvOworCisJaWYgKGJpb19jaGVja19lb2QoYmlvLCBucl9zZWN0b3JzKSkKKwkJZ290byBlbmRfaW87CisKKwkvKgorCSAqIEZpbHRlciBmbHVzaCBiaW8ncyBlYXJseSBzbyB0aGF0IG1ha2VfcmVxdWVzdCBiYXNlZAorCSAqIGRyaXZlcnMgd2l0aG91dCBmbHVzaCBzdXBwb3J0IGRvbid0IGhhdmUgdG8gd29ycnkKKwkgKiBhYm91dCB0aGVtLgorCSAqLworCWlmICgoYmlvLT5iaV9ydyAmIChSRVFfRkxVU0ggfCBSRVFfRlVBKSkgJiYgIXEtPmZsdXNoX2ZsYWdzKSB7CisJCWJpby0+YmlfcncgJj0gfihSRVFfRkxVU0ggfCBSRVFfRlVBKTsKKwkJaWYgKCFucl9zZWN0b3JzKSB7CisJCQllcnIgPSAwOworCQkJZ290byBlbmRfaW87CisJCX0KKwl9CisKKwlpZiAoKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgJiYKKwkgICAgKCFibGtfcXVldWVfZGlzY2FyZChxKSB8fAorCSAgICAgKChiaW8tPmJpX3J3ICYgUkVRX1NFQ1VSRSkgJiYKKwkgICAgICAhYmxrX3F1ZXVlX3NlY2Rpc2NhcmQocSkpKSkgeworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBlbmRfaW87CisJfQorCisJaWYgKGJsa190aHJvdGxfYmlvKHEsIGJpbykpCisJCXJldHVybiBmYWxzZTsJLyogdGhyb3R0bGVkLCB3aWxsIGJlIHJlc3VibWl0dGVkIGxhdGVyICovCisKKwl0cmFjZV9ibG9ja19iaW9fcXVldWUocSwgYmlvKTsKKwlyZXR1cm4gdHJ1ZTsKKworZW5kX2lvOgorCWJpb19lbmRpbyhiaW8sIGVycik7CisJcmV0dXJuIGZhbHNlOworfQorCiAvKioKICAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IC0gaGFuZCBhIGJ1ZmZlciB0byBpdHMgZGV2aWNlIGRyaXZlciBmb3IgSS9PCiAgKiBAYmlvOiAgVGhlIGJpbyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBpbiBtZW1vcnkgYW5kIG9uIHRoZSBkZXZpY2UuCkBAIC0xNDM3LDE0NSArMTYwMCwzMiBAQAogICogY29tcGxldGlvbiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHNpZ25hbGVkLgogICoKICAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IGFuZCB0aGUgZHJpdmVycyBpdCBjYWxscyBtYXkgdXNlIGJpX25leHQgaWYgdGhpcwotICogYmlvIGhhcHBlbnMgdG8gYmUgbWVyZ2VkIHdpdGggc29tZW9uZSBlbHNlLCBhbmQgbWF5IGNoYW5nZSBiaV9kZXYgYW5kCi0gKiBiaV9zZWN0b3IgZm9yIHJlbWFwcyBhcyBpdCBzZWVzIGZpdC4gIFNvIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzCi0gKiBzaG91bGQgTk9UIGJlIGRlcGVuZGVkIG9uIGFmdGVyIHRoZSBjYWxsIHRvIGdlbmVyaWNfbWFrZV9yZXF1ZXN0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19nZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pCi17Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7Ci0Jc2VjdG9yX3Qgb2xkX3NlY3RvcjsKLQlpbnQgcmV0LCBucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQlkZXZfdCBvbGRfZGV2OwotCWludCBlcnIgPSAtRUlPOwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCWlmIChiaW9fY2hlY2tfZW9kKGJpbywgbnJfc2VjdG9ycykpCi0JCWdvdG8gZW5kX2lvOwotCi0JLyoKLQkgKiBSZXNvbHZlIHRoZSBtYXBwaW5nIHVudGlsIGZpbmlzaGVkLiAoZHJpdmVycyBhcmUKLQkgKiBzdGlsbCBmcmVlIHRvIGltcGxlbWVudC9yZXNvbHZlIHRoZWlyIG93biBzdGFja2luZwotCSAqIGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIDApCi0JICoKLQkgKiBOT1RFOiB3ZSBkb24ndCByZXBlYXQgdGhlIGJsa19zaXplIGNoZWNrIGZvciBlYWNoIG5ldyBkZXZpY2UuCi0JICogU3RhY2tpbmcgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nLgotCSAqLwotCW9sZF9zZWN0b3IgPSAtMTsKLQlvbGRfZGV2ID0gMDsKLQlkbyB7Ci0JCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQkJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKLQotCQlxID0gYmRldl9nZXRfcXVldWUoYmlvLT5iaV9iZGV2KTsKLQkJaWYgKHVubGlrZWx5KCFxKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImdlbmVyaWNfbWFrZV9yZXF1ZXN0OiBUcnlpbmcgdG8gYWNjZXNzICIKLQkJCQkibm9uZXhpc3RlbnQgYmxvY2stZGV2aWNlICVzICglTHUpXG4iLAotCQkJCWJkZXZuYW1lKGJpby0+YmlfYmRldiwgYiksCi0JCQkJKGxvbmcgbG9uZykgYmlvLT5iaV9zZWN0b3IpOwotCQkJZ290byBlbmRfaW87Ci0JCX0KLQotCQlpZiAodW5saWtlbHkoIShiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpICYmCi0JCQkgICAgIG5yX3NlY3RvcnMgPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmlvIHRvbyBiaWcgZGV2aWNlICVzICgldSA+ICV1KVxuIiwKLQkJCSAgICAgICBiZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAotCQkJICAgICAgIGJpb19zZWN0b3JzKGJpbyksCi0JCQkgICAgICAgcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpOwotCQkJZ290byBlbmRfaW87Ci0JCX0KLQotCQlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkKLQkJCWdvdG8gZW5kX2lvOwotCi0JCXBhcnQgPSBiaW8tPmJpX2JkZXYtPmJkX3BhcnQ7Ci0JCWlmIChzaG91bGRfZmFpbF9yZXF1ZXN0KHBhcnQsIGJpby0+Ymlfc2l6ZSkgfHwKLQkJICAgIHNob3VsZF9mYWlsX3JlcXVlc3QoJnBhcnRfdG9fZGlzayhwYXJ0KS0+cGFydDAsCi0JCQkJCWJpby0+Ymlfc2l6ZSkpCi0JCQlnb3RvIGVuZF9pbzsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGRldmljZSBoYXMgcGFydGl0aW9ucywgcmVtYXAgYmxvY2sgbgotCQkgKiBvZiBwYXJ0aXRpb24gcCB0byBibG9jayBuK3N0YXJ0KHApIG9mIHRoZSBkaXNrLgotCQkgKi8KLQkJYmxrX3BhcnRpdGlvbl9yZW1hcChiaW8pOwotCi0JCWlmIChiaW9faW50ZWdyaXR5X2VuYWJsZWQoYmlvKSAmJiBiaW9faW50ZWdyaXR5X3ByZXAoYmlvKSkKLQkJCWdvdG8gZW5kX2lvOwotCi0JCWlmIChvbGRfc2VjdG9yICE9IC0xKQotCQkJdHJhY2VfYmxvY2tfYmlvX3JlbWFwKHEsIGJpbywgb2xkX2Rldiwgb2xkX3NlY3Rvcik7Ci0KLQkJb2xkX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwotCQlvbGRfZGV2ID0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7Ci0KLQkJaWYgKGJpb19jaGVja19lb2QoYmlvLCBucl9zZWN0b3JzKSkKLQkJCWdvdG8gZW5kX2lvOwotCi0JCS8qCi0JCSAqIEZpbHRlciBmbHVzaCBiaW8ncyBlYXJseSBzbyB0aGF0IG1ha2VfcmVxdWVzdCBiYXNlZAotCQkgKiBkcml2ZXJzIHdpdGhvdXQgZmx1c2ggc3VwcG9ydCBkb24ndCBoYXZlIHRvIHdvcnJ5Ci0JCSAqIGFib3V0IHRoZW0uCi0JCSAqLwotCQlpZiAoKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpICYmICFxLT5mbHVzaF9mbGFncykgewotCQkJYmlvLT5iaV9ydyAmPSB+KFJFUV9GTFVTSCB8IFJFUV9GVUEpOwotCQkJaWYgKCFucl9zZWN0b3JzKSB7Ci0JCQkJZXJyID0gMDsKLQkJCQlnb3RvIGVuZF9pbzsKLQkJCX0KLQkJfQotCi0JCWlmICgoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSAmJgotCQkgICAgKCFibGtfcXVldWVfZGlzY2FyZChxKSB8fAotCQkgICAgICgoYmlvLT5iaV9ydyAmIFJFUV9TRUNVUkUpICYmCi0JCSAgICAgICFibGtfcXVldWVfc2VjZGlzY2FyZChxKSkpKSB7Ci0JCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJCWdvdG8gZW5kX2lvOwotCQl9Ci0KLQkJaWYgKGJsa190aHJvdGxfYmlvKHEsICZiaW8pKQotCQkJZ290byBlbmRfaW87Ci0KLQkJLyoKLQkJICogSWYgYmlvID0gTlVMTCwgYmlvIGhhcyBiZWVuIHRocm90dGxlZCBhbmQgd2lsbCBiZSBzdWJtaXR0ZWQKLQkJICogbGF0ZXIuCi0JCSAqLwotCQlpZiAoIWJpbykKLQkJCWJyZWFrOwotCi0JCXRyYWNlX2Jsb2NrX2Jpb19xdWV1ZShxLCBiaW8pOwotCi0JCXJldCA9IHEtPm1ha2VfcmVxdWVzdF9mbihxLCBiaW8pOwotCX0gd2hpbGUgKHJldCk7Ci0KLQlyZXR1cm47Ci0KLWVuZF9pbzoKLQliaW9fZW5kaW8oYmlvLCBlcnIpOwotfQotCi0vKgotICogV2Ugb25seSB3YW50IG9uZSAtPm1ha2VfcmVxdWVzdF9mbiB0byBiZSBhY3RpdmUgYXQgYSB0aW1lLAotICogZWxzZSBzdGFjayB1c2FnZSB3aXRoIHN0YWNrZWQgZGV2aWNlcyBjb3VsZCBiZSBhIHByb2JsZW0uCi0gKiBTbyB1c2UgY3VycmVudC0+YmlvX2xpc3QgdG8ga2VlcCBhIGxpc3Qgb2YgcmVxdWVzdHMKLSAqIHN1Ym1pdGVkIGJ5IGEgbWFrZV9yZXF1ZXN0X2ZuIGZ1bmN0aW9uLgotICogY3VycmVudC0+YmlvX2xpc3QgaXMgYWxzbyB1c2VkIGFzIGEgZmxhZyB0byBzYXkgaWYKLSAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IGlzIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhpcyB0YXNrIG9yIG5vdC4KLSAqIElmIGl0IGlzIE5VTEwsIHRoZW4gbm8gbWFrZV9yZXF1ZXN0IGlzIGFjdGl2ZS4gIElmIGl0IGlzIG5vbi1OVUxMLAotICogdGhlbiBhIG1ha2VfcmVxdWVzdCBpcyBhY3RpdmUsIGFuZCBuZXcgcmVxdWVzdHMgc2hvdWxkIGJlIGFkZGVkCi0gKiBhdCB0aGUgdGFpbAorICogYmlvIGhhcHBlbnMgdG8gYmUgbWVyZ2VkIHdpdGggc29tZW9uZSBlbHNlLCBhbmQgbWF5IHJlc3VibWl0IHRoZSBiaW8gdG8KKyAqIGEgbG93ZXIgZGV2aWNlIGJ5IGNhbGxpbmcgaW50byBnZW5lcmljX21ha2VfcmVxdWVzdCByZWN1cnNpdmVseSwgd2hpY2gKKyAqIG1lYW5zIHRoZSBiaW8gc2hvdWxkIE5PVCBiZSB0b3VjaGVkIGFmdGVyIHRoZSBjYWxsIHRvIC0+bWFrZV9yZXF1ZXN0X2ZuLgogICovCiB2b2lkIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX2xpc3QgYmlvX2xpc3Rfb25fc3RhY2s7CiAKKwlpZiAoIWdlbmVyaWNfbWFrZV9yZXF1ZXN0X2NoZWNrcyhiaW8pKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIG9ubHkgd2FudCBvbmUgLT5tYWtlX3JlcXVlc3RfZm4gdG8gYmUgYWN0aXZlIGF0IGEgdGltZSwgZWxzZQorCSAqIHN0YWNrIHVzYWdlIHdpdGggc3RhY2tlZCBkZXZpY2VzIGNvdWxkIGJlIGEgcHJvYmxlbS4gIFNvIHVzZQorCSAqIGN1cnJlbnQtPmJpb19saXN0IHRvIGtlZXAgYSBsaXN0IG9mIHJlcXVlc3RzIHN1Ym1pdGVkIGJ5IGEKKwkgKiBtYWtlX3JlcXVlc3RfZm4gZnVuY3Rpb24uICBjdXJyZW50LT5iaW9fbGlzdCBpcyBhbHNvIHVzZWQgYXMgYQorCSAqIGZsYWcgdG8gc2F5IGlmIGdlbmVyaWNfbWFrZV9yZXF1ZXN0IGlzIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhpcworCSAqIHRhc2sgb3Igbm90LiAgSWYgaXQgaXMgTlVMTCwgdGhlbiBubyBtYWtlX3JlcXVlc3QgaXMgYWN0aXZlLiAgSWYKKwkgKiBpdCBpcyBub24tTlVMTCwgdGhlbiBhIG1ha2VfcmVxdWVzdCBpcyBhY3RpdmUsIGFuZCBuZXcgcmVxdWVzdHMKKwkgKiBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIHRhaWwKKwkgKi8KIAlpZiAoY3VycmVudC0+YmlvX2xpc3QpIHsKLQkJLyogbWFrZV9yZXF1ZXN0IGlzIGFjdGl2ZSAqLwogCQliaW9fbGlzdF9hZGQoY3VycmVudC0+YmlvX2xpc3QsIGJpbyk7CiAJCXJldHVybjsKIAl9CisKIAkvKiBmb2xsb3dpbmcgbG9vcCBtYXkgYmUgYSBiaXQgbm9uLW9idmlvdXMsIGFuZCBzbyBkZXNlcnZlcyBzb21lCiAJICogZXhwbGFuYXRpb24uCiAJICogQmVmb3JlIGVudGVyaW5nIHRoZSBsb29wLCBiaW8tPmJpX25leHQgaXMgTlVMTCAoYXMgYWxsIGNhbGxlcnMKQEAgLTE1ODMsMjIgKzE2MzMsMjEgQEAKIAkgKiBXZSBwcmV0ZW5kIHRoYXQgd2UgaGF2ZSBqdXN0IHRha2VuIGl0IG9mZiBhIGxvbmdlciBsaXN0LCBzbwogCSAqIHdlIGFzc2lnbiBiaW9fbGlzdCB0byBhIHBvaW50ZXIgdG8gdGhlIGJpb19saXN0X29uX3N0YWNrLAogCSAqIHRodXMgaW5pdGlhbGlzaW5nIHRoZSBiaW9fbGlzdCBvZiBuZXcgYmlvcyB0byBiZQotCSAqIGFkZGVkLiAgX19nZW5lcmljX21ha2VfcmVxdWVzdCBtYXkgaW5kZWVkIGFkZCBzb21lIG1vcmUgYmlvcworCSAqIGFkZGVkLiAgLT5tYWtlX3JlcXVlc3QoKSBtYXkgaW5kZWVkIGFkZCBzb21lIG1vcmUgYmlvcwogCSAqIHRocm91Z2ggYSByZWN1cnNpdmUgY2FsbCB0byBnZW5lcmljX21ha2VfcmVxdWVzdC4gIElmIGl0CiAJICogZGlkLCB3ZSBmaW5kIGEgbm9uLU5VTEwgdmFsdWUgaW4gYmlvX2xpc3QgYW5kIHJlLWVudGVyIHRoZSBsb29wCiAJICogZnJvbSB0aGUgdG9wLiAgSW4gdGhpcyBjYXNlIHdlIHJlYWxseSBkaWQganVzdCB0YWtlIHRoZSBiaW8KIAkgKiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0IChubyBwcmV0ZW5kaW5nKSBhbmQgc28gcmVtb3ZlIGl0IGZyb20KLQkgKiBiaW9fbGlzdCwgYW5kIGNhbGwgaW50byBfX2dlbmVyaWNfbWFrZV9yZXF1ZXN0IGFnYWluLgotCSAqCi0JICogVGhlIGxvb3Agd2FzIHN0cnVjdHVyZWQgbGlrZSB0aGlzIHRvIG1ha2Ugb25seSBvbmUgY2FsbCB0bwotCSAqIF9fZ2VuZXJpY19tYWtlX3JlcXVlc3QgKHdoaWNoIGlzIGltcG9ydGFudCBhcyBpdCBpcyBsYXJnZSBhbmQKLQkgKiBpbmxpbmVkKSBhbmQgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpbXBsZS4KKwkgKiBiaW9fbGlzdCwgYW5kIGNhbGwgaW50byAtPm1ha2VfcmVxdWVzdCgpIGFnYWluLgogCSAqLwogCUJVR19PTihiaW8tPmJpX25leHQpOwogCWJpb19saXN0X2luaXQoJmJpb19saXN0X29uX3N0YWNrKTsKIAljdXJyZW50LT5iaW9fbGlzdCA9ICZiaW9fbGlzdF9vbl9zdGFjazsKIAlkbyB7Ci0JCV9fZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpOworCisJCXEtPm1ha2VfcmVxdWVzdF9mbihxLCBiaW8pOworCiAJCWJpbyA9IGJpb19saXN0X3BvcChjdXJyZW50LT5iaW9fbGlzdCk7CiAJfSB3aGlsZSAoYmlvKTsKIAljdXJyZW50LT5iaW9fbGlzdCA9IE5VTEw7IC8qIGRlYWN0aXZhdGUgKi8KQEAgLTE3MjUsNiArMTc3NCw4IEBACiAJCXdoZXJlID0gRUxFVkFUT1JfSU5TRVJUX0ZMVVNIOwogCiAJYWRkX2FjY3RfcmVxdWVzdChxLCBycSwgd2hlcmUpOworCWlmICh3aGVyZSA9PSBFTEVWQVRPUl9JTlNFUlRfRkxVU0gpCisJCV9fYmxrX3J1bl9xdWV1ZShxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMjYyOCw2ICsyNjc5LDIwIEBACiAKICNkZWZpbmUgUExVR19NQUdJQwkweDkxODI3MzY0CiAKKy8qKgorICogYmxrX3N0YXJ0X3BsdWcgLSBpbml0aWFsaXplIGJsa19wbHVnIGFuZCB0cmFjayBpdCBpbnNpZGUgdGhlIHRhc2tfc3RydWN0CisgKiBAcGx1ZzoJVGhlICZzdHJ1Y3QgYmxrX3BsdWcgdGhhdCBuZWVkcyB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUcmFja2luZyBibGtfcGx1ZyBpbnNpZGUgdGhlIHRhc2tfc3RydWN0IHdpbGwgaGVscCB3aXRoIGF1dG8tZmx1c2hpbmcgdGhlCisgKiAgIHBlbmRpbmcgSS9PIHNob3VsZCB0aGUgdGFzayBlbmQgdXAgYmxvY2tpbmcgYmV0d2VlbiBibGtfc3RhcnRfcGx1ZygpIGFuZAorICogICBibGtfZmluaXNoX3BsdWcoKS4gVGhpcyBpcyBpbXBvcnRhbnQgZnJvbSBhIHBlcmZvcm1hbmNlIHBlcnNwZWN0aXZlLCBidXQKKyAqICAgYWxzbyBlbnN1cmVzIHRoYXQgd2UgZG9uJ3QgZGVhZGxvY2suIEZvciBpbnN0YW5jZSwgaWYgdGhlIHRhc2sgaXMgYmxvY2tpbmcKKyAqICAgZm9yIGEgbWVtb3J5IGFsbG9jYXRpb24sIG1lbW9yeSByZWNsYWltIGNvdWxkIGVuZCB1cCB3YW50aW5nIHRvIGZyZWUgYQorICogICBwYWdlIGJlbG9uZ2luZyB0byB0aGF0IHJlcXVlc3QgdGhhdCBpcyBjdXJyZW50bHkgcmVzaWRpbmcgaW4gb3VyIHByaXZhdGUKKyAqICAgcGx1Zy4gQnkgZmx1c2hpbmcgdGhlIHBlbmRpbmcgSS9PIHdoZW4gdGhlIHByb2Nlc3MgZ29lcyB0byBzbGVlcCwgd2UgYXZvaWQKKyAqICAgdGhpcyBraW5kIG9mIGRlYWRsb2NrLgorICovCiB2b2lkIGJsa19zdGFydF9wbHVnKHN0cnVjdCBibGtfcGx1ZyAqcGx1ZykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstZmx1c2guYyBiL2Jsb2NrL2Jsay1mbHVzaC5jCmluZGV4IDQ5MWViMzAuLjcyMGFkNjAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1mbHVzaC5jCisrKyBiL2Jsb2NrL2Jsay1mbHVzaC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCUJVR19PTighcnEtPmJpbyB8fCBycS0+YmlvICE9IHJxLT5iaW90YWlsKTsKKwlCVUdfT04ocnEtPmJpbyAhPSBycS0+YmlvdGFpbCk7IC8qYXNzdW1lcyB6ZXJvIG9yIHNpbmdsZSBiaW8gcnEgKi8KIAogCS8qCiAJICogSWYgdGhlcmUncyBkYXRhIGJ1dCBmbHVzaCBpcyBub3QgbmVjZXNzYXJ5LCB0aGUgcmVxdWVzdCBjYW4gYmUKQEAgLTMzMCw3ICszMzAsNiBAQAogCWlmICgocG9saWN5ICYgUkVRX0ZTRVFfREFUQSkgJiYKIAkgICAgIShwb2xpY3kgJiAoUkVRX0ZTRVFfUFJFRkxVU0ggfCBSRVFfRlNFUV9QT1NURkxVU0gpKSkgewogCQlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmcS0+cXVldWVfaGVhZCk7Ci0JCWJsa19ydW5fcXVldWVfYXN5bmMocSk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYyBiL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYwppbmRleCAxMjliOWUyLi5kYTJhODE4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstaW50ZWdyaXR5LmMKKysrIGIvYmxvY2svYmxrLWludGVncml0eS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiYmxrLmgiCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc3lzZnMuYyBiL2Jsb2NrL2Jsay1zeXNmcy5jCmluZGV4IDYwZmRhODguLmU3ZjlmNjUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1zeXNmcy5jCkBAIC00NTcsMTEgKzQ1NywxMSBAQAogfQogCiAvKioKLSAqIGJsa19jbGVhbnVwX3F1ZXVlOiAtIHJlbGVhc2UgYSAmc3RydWN0IHJlcXVlc3RfcXVldWUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkCi0gKiBAa29iajogICAgdGhlIGtvYmogYmVsb25naW5nIG9mIHRoZSByZXF1ZXN0IHF1ZXVlIHRvIGJlIHJlbGVhc2VkCisgKiBibGtfcmVsZWFzZV9xdWV1ZTogLSByZWxlYXNlIGEgJnN0cnVjdCByZXF1ZXN0X3F1ZXVlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICogQGtvYmo6ICAgIHRoZSBrb2JqIGJlbG9uZ2luZyB0byB0aGUgcmVxdWVzdCBxdWV1ZSB0byBiZSByZWxlYXNlZAogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgIGJsa19jbGVhbnVwX3F1ZXVlIGlzIHRoZSBwYWlyIHRvIGJsa19pbml0X3F1ZXVlKCkgb3IKKyAqICAgICBibGtfcmVsZWFzZV9xdWV1ZSBpcyB0aGUgcGFpciB0byBibGtfaW5pdF9xdWV1ZSgpIG9yCiAgKiAgICAgYmxrX3F1ZXVlX21ha2VfcmVxdWVzdCgpLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgcmVxdWVzdCBxdWV1ZSBpcwogICogICAgIGJlaW5nIHJlbGVhc2VkOyB0eXBpY2FsbHkgd2hlbiBhIGJsb2NrIGRldmljZSBpcyBiZWluZyBkZS1yZWdpc3RlcmVkLgogICogICAgIEN1cnJlbnRseSwgaXRzIHByaW1hcnkgdGFzayBpdCB0byBmcmVlIGFsbCB0aGUgJnN0cnVjdCByZXF1ZXN0CkBAIC00OTAsNiArNDkwLDcgQEAKIAlpZiAocS0+cXVldWVfdGFncykKIAkJX19ibGtfcXVldWVfZnJlZV90YWdzKHEpOwogCisJYmxrX3Rocm90bF9yZWxlYXNlKHEpOwogCWJsa190cmFjZV9zaHV0ZG93bihxKTsKIAogCWJkaV9kZXN0cm95KCZxLT5iYWNraW5nX2Rldl9pbmZvKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10YWcuYyBiL2Jsb2NrL2Jsay10YWcuYwppbmRleCBlY2U2NWZjLi5lNzRkNmQxIDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGFnLmMKKysrIGIvYmxvY2svYmxrLXRhZy5jCkBAIC0yODYsMTIgKzI4NiwxNCBAQAogCiAJQlVHX09OKHRhZyA9PSAtMSk7CiAKLQlpZiAodW5saWtlbHkodGFnID49IGJxdC0+cmVhbF9tYXhfZGVwdGgpKQorCWlmICh1bmxpa2VseSh0YWcgPj0gYnF0LT5tYXhfZGVwdGgpKSB7CiAJCS8qCiAJCSAqIFRoaXMgY2FuIGhhcHBlbiBhZnRlciB0YWcgZGVwdGggaGFzIGJlZW4gcmVkdWNlZC4KLQkJICogRklYTUU6IGhvdyBhYm91dCBhIHdhcm5pbmcgb3IgaW5mbyBtZXNzYWdlIGhlcmU/CisJCSAqIEJ1dCB0YWcgc2hvdWxkbid0IGJlIGxhcmdlciB0aGFuIHJlYWxfbWF4X2RlcHRoLgogCQkgKi8KKwkJV0FSTl9PTih0YWcgPj0gYnF0LT5yZWFsX21heF9kZXB0aCk7CiAJCXJldHVybjsKKwl9CiAKIAlsaXN0X2RlbF9pbml0KCZycS0+cXVldWVsaXN0KTsKIAlycS0+Y21kX2ZsYWdzICY9IH5SRVFfUVVFVUVEOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRocm90dGxlLmMgYi9ibG9jay9ibGstdGhyb3R0bGUuYwppbmRleCBhMTlmNThjLi40NTUzMjQ1IDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGhyb3R0bGUuYworKysgYi9ibG9jay9ibGstdGhyb3R0bGUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgogI2luY2x1ZGUgImJsay1jZ3JvdXAuaCIKKyNpbmNsdWRlICJibGsuaCIKIAogLyogTWF4IGRpc3BhdGNoIGZyb20gYSBncm91cCBpbiAxIHJvdW5kICovCiBzdGF0aWMgaW50IHRocm90bF9ncnBfcXVhbnR1bSA9IDg7CkBAIC0zMDIsMTYgKzMwMywxNiBAQAogCXJldHVybiB0ZzsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aXRoIHF1ZXVlIGxvY2sgdW5sb2NrZWQgaW4gY2FzZSBvZiBlcnJvciwgbGlrZQotICogcmVxdWVzdCBxdWV1ZSBpcyBubyBtb3JlCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgdGhyb3RsX2dycCAqIHRocm90bF9nZXRfdGcoc3RydWN0IHRocm90bF9kYXRhICp0ZCkKIHsKIAlzdHJ1Y3QgdGhyb3RsX2dycCAqdGcgPSBOVUxMLCAqX190ZyA9IE5VTEw7CiAJc3RydWN0IGJsa2lvX2Nncm91cCAqYmxrY2c7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSB0ZC0+cXVldWU7CiAKKwkvKiBubyB0aHJvdHRsaW5nIGZvciBkZWFkIHF1ZXVlICovCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSkpCisJCXJldHVybiBOVUxMOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWJsa2NnID0gdGFza19ibGtpb19jZ3JvdXAoY3VycmVudCk7CiAJdGcgPSB0aHJvdGxfZmluZF90Zyh0ZCwgYmxrY2cpOwpAQCAtMzIzLDMyICszMjQsMjIgQEAKIAkvKgogCSAqIE5lZWQgdG8gYWxsb2NhdGUgYSBncm91cC4gQWxsb2NhdGlvbiBvZiBncm91cCBhbHNvIG5lZWRzIGFsbG9jYXRpb24KIAkgKiBvZiBwZXIgY3B1IHN0YXRzIHdoaWNoIGluLXR1cm4gdGFrZXMgYSBtdXRleCgpIGFuZCBjYW4gYmxvY2suIEhlbmNlCi0JICogd2UgbmVlZCB0byBkcm9wIHJjdSBsb2NrIGFuZCBxdWV1ZV9sb2NrIGJlZm9yZSB3ZSBjYWxsIGFsbG9jCi0JICoKLQkgKiBUYWtlIHRoZSByZXF1ZXN0IHF1ZXVlIHJlZmVyZW5jZSB0byBtYWtlIHN1cmUgcXVldWUgZG9lcyBub3QKLQkgKiBnbyBhd2F5IG9uY2Ugd2UgcmV0dXJuIGZyb20gYWxsb2NhdGlvbi4KKwkgKiB3ZSBuZWVkIHRvIGRyb3AgcmN1IGxvY2sgYW5kIHF1ZXVlX2xvY2sgYmVmb3JlIHdlIGNhbGwgYWxsb2MuCiAJICovCi0JYmxrX2dldF9xdWV1ZShxKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAl0ZyA9IHRocm90bF9hbGxvY190Zyh0ZCk7Ci0JLyoKLQkgKiBXZSBtaWdodCBoYXZlIHNsZXB0IGluIGdyb3VwIGFsbG9jYXRpb24uIE1ha2Ugc3VyZSBxdWV1ZSBpcyBub3QKLQkgKiBkZWFkCi0JICovCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKSkpIHsKLQkJYmxrX3B1dF9xdWV1ZShxKTsKLQkJaWYgKHRnKQotCQkJa2ZyZWUodGcpOwotCi0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQlibGtfcHV0X3F1ZXVlKHEpOwogCiAJLyogR3JvdXAgYWxsb2NhdGVkIGFuZCBxdWV1ZSBpcyBzdGlsbCBhbGl2ZS4gdGFrZSB0aGUgbG9jayAqLwogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKKwkvKiBNYWtlIHN1cmUgQHEgaXMgc3RpbGwgYWxpdmUgKi8KKwlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkgeworCQlrZnJlZSh0Zyk7CisJCXJldHVybiBOVUxMOworCX0KKwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgbmV3IGdyb3VwLiBBZnRlciBzbGVlcGluZywgcmVhZCB0aGUgYmxrY2cgYWdhaW4uCiAJICovCkBAIC0xMDE0LDExICsxMDA1LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHRocm90bF90ZF9mcmVlKHN0cnVjdCB0aHJvdGxfZGF0YSAqdGQpCi17Ci0Ja2ZyZWUodGQpOwotfQotCiAvKgogICogQmxrIGNncm91cCBjb250cm9sbGVyIG5vdGlmaWNhdGlvbiBzYXlpbmcgdGhhdCBibGtpb19ncm91cCBvYmplY3QgaXMgYmVpbmcKICAqIGRlbGlua2VkIGFzIGFzc29jaWF0ZWQgY2dyb3VwIG9iamVjdCBpcyBnb2luZyBhd2F5LiBUaGF0IGFsc28gbWVhbnMgdGhhdApAQCAtMTEyMywxNyArMTEwOSwxNyBAQAogCS5wbGlkID0gQkxLSU9fUE9MSUNZX1RIUk9UTCwKIH07CiAKLWludCBibGtfdGhyb3RsX2JpbyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqKmJpb3ApCitib29sIGJsa190aHJvdGxfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IHRocm90bF9kYXRhICp0ZCA9IHEtPnRkOwogCXN0cnVjdCB0aHJvdGxfZ3JwICp0ZzsKLQlzdHJ1Y3QgYmlvICpiaW8gPSAqYmlvcDsKIAlib29sIHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyksIHVwZGF0ZV9kaXNwdGltZSA9IHRydWU7CiAJc3RydWN0IGJsa2lvX2Nncm91cCAqYmxrY2c7CisJYm9vbCB0aHJvdHRsZWQgPSBmYWxzZTsKIAogCWlmIChiaW8tPmJpX3J3ICYgUkVRX1RIUk9UVExFRCkgewogCQliaW8tPmJpX3J3ICY9IH5SRVFfVEhST1RUTEVEOwotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTExNTIsNyArMTEzOCw3IEBACiAJCQlibGtpb2NnX3VwZGF0ZV9kaXNwYXRjaF9zdGF0cygmdGctPmJsa2csIGJpby0+Ymlfc2l6ZSwKIAkJCQkJcncsIHJ3X2lzX3N5bmMoYmlvLT5iaV9ydykpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTE2MSwxOCArMTE0NywxMCBAQAogCSAqIEVpdGhlciBncm91cCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCBvciBpdCBpcyBub3QgYW4gdW5saW1pdGVkCiAJICogSU8gZ3JvdXAKIAkgKi8KLQogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJdGcgPSB0aHJvdGxfZ2V0X3RnKHRkKTsKLQotCWlmIChJU19FUlIodGcpKSB7Ci0JCWlmIChQVFJfRVJSKHRnKQk9PSAtRU5PREVWKSB7Ci0JCQkvKgotCQkJICogUXVldWUgaXMgZ29uZS4gTm8gcXVldWUgbG9jayBoZWxkIGhlcmUuCi0JCQkgKi8KLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQorCWlmICh1bmxpa2VseSghdGcpKQorCQlnb3RvIG91dF91bmxvY2s7CiAKIAlpZiAodGctPm5yX3F1ZXVlZFtyd10pIHsKIAkJLyoKQEAgLTEyMDAsNyArMTE3OCw3IEBACiAJCSAqIFNvIGtlZXAgb24gdHJpbW1pbmcgc2xpY2UgZXZlbiBpZiBiaW8gaXMgbm90IHF1ZXVlZC4KIAkJICovCiAJCXRocm90bF90cmltX3NsaWNlKHRkLCB0ZywgcncpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogcXVldWVfYmlvOgpAQCAtMTIxMiwxNiArMTE5MCw1MiBAQAogCQkJdGctPm5yX3F1ZXVlZFtSRUFEXSwgdGctPm5yX3F1ZXVlZFtXUklURV0pOwogCiAJdGhyb3RsX2FkZF9iaW9fdGcocS0+dGQsIHRnLCBiaW8pOwotCSpiaW9wID0gTlVMTDsKKwl0aHJvdHRsZWQgPSB0cnVlOwogCiAJaWYgKHVwZGF0ZV9kaXNwdGltZSkgewogCQl0Z191cGRhdGVfZGlzcHRpbWUodGQsIHRnKTsKIAkJdGhyb3RsX3NjaGVkdWxlX25leHRfZGlzcGF0Y2godGQpOwogCX0KIAotb3V0Ogorb3V0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIHRocm90dGxlZDsKK30KKworLyoqCisgKiBibGtfdGhyb3RsX2RyYWluIC0gZHJhaW4gdGhyb3R0bGVkIGJpb3MKKyAqIEBxOiByZXF1ZXN0X3F1ZXVlIHRvIGRyYWluIHRocm90dGxlZCBiaW9zIGZvcgorICoKKyAqIERpc3BhdGNoIGFsbCBjdXJyZW50bHkgdGhyb3R0bGVkIGJpb3Mgb24gQHEgdGhyb3VnaCAtPm1ha2VfcmVxdWVzdF9mbigpLgorICovCit2b2lkIGJsa190aHJvdGxfZHJhaW4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCisJX19yZWxlYXNlcyhxLT5xdWV1ZV9sb2NrKSBfX2FjcXVpcmVzKHEtPnF1ZXVlX2xvY2spCit7CisJc3RydWN0IHRocm90bF9kYXRhICp0ZCA9IHEtPnRkOworCXN0cnVjdCB0aHJvdGxfcmJfcm9vdCAqc3QgPSAmdGQtPnRnX3NlcnZpY2VfdHJlZTsKKwlzdHJ1Y3QgdGhyb3RsX2dycCAqdGc7CisJc3RydWN0IGJpb19saXN0IGJsOworCXN0cnVjdCBiaW8gKmJpbzsKKworCVdBUk5fT05fT05DRSghcXVldWVfaXNfbG9ja2VkKHEpKTsKKworCWJpb19saXN0X2luaXQoJmJsKTsKKworCXdoaWxlICgodGcgPSB0aHJvdGxfcmJfZmlyc3Qoc3QpKSkgeworCQl0aHJvdGxfZGVxdWV1ZV90Zyh0ZCwgdGcpOworCisJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcGVlaygmdGctPmJpb19saXN0c1tSRUFEXSkpKQorCQkJdGdfZGlzcGF0Y2hfb25lX2Jpbyh0ZCwgdGcsIGJpb19kYXRhX2RpcihiaW8pLCAmYmwpOworCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BlZWsoJnRnLT5iaW9fbGlzdHNbV1JJVEVdKSkpCisJCQl0Z19kaXNwYXRjaF9vbmVfYmlvKHRkLCB0ZywgYmlvX2RhdGFfZGlyKGJpbyksICZibCk7CisJfQorCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKworCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZibCkpKQorCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworCisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIH0KIAogaW50IGJsa190aHJvdGxfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKQEAgLTEyOTYsNyArMTMxMCwxMSBAQAogCSAqIGl0LgogCSAqLwogCXRocm90bF9zaHV0ZG93bl93cShxKTsKLQl0aHJvdGxfdGRfZnJlZSh0ZCk7Cit9CisKK3ZvaWQgYmxrX3Rocm90bF9yZWxlYXNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCWtmcmVlKHEtPnRkKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgdGhyb3RsX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay5oIGIvYmxvY2svYmxrLmgKaW5kZXggMjBiOTAwYS4uM2Y2NTUxYiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLmgKKysrIGIvYmxvY2svYmxrLmgKQEAgLTE1LDYgKzE1LDcgQEAKIAkJCXN0cnVjdCBiaW8gKmJpbyk7CiBpbnQgYmxrX3JxX2FwcGVuZF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJICAgICAgc3RydWN0IGJpbyAqYmlvKTsKK3ZvaWQgYmxrX2RyYWluX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBib29sIGRyYWluX2FsbCk7CiB2b2lkIGJsa19kZXF1ZXVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxKTsKIHZvaWQgX19ibGtfcXVldWVfZnJlZV90YWdzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIGJvb2wgX19ibGtfZW5kX2JpZGlfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwKQEAgLTE4OCw0ICsxODksMjEgQEAKIAkgICAgICAgIChycS0+Y21kX2ZsYWdzICYgUkVRX0RJU0NBUkQpKTsKIH0KIAotI2VuZGlmCisjaWZkZWYgQ09ORklHX0JMS19ERVZfVEhST1RUTElORworZXh0ZXJuIGJvb2wgYmxrX3Rocm90bF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CitleHRlcm4gdm9pZCBibGtfdGhyb3RsX2RyYWluKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiBpbnQgYmxrX3Rocm90bF9pbml0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiB2b2lkIGJsa190aHJvdGxfZXhpdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gdm9pZCBibGtfdGhyb3RsX3JlbGVhc2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworI2Vsc2UgLyogQ09ORklHX0JMS19ERVZfVEhST1RUTElORyAqLworc3RhdGljIGlubGluZSBib29sIGJsa190aHJvdGxfYmlvKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuIGZhbHNlOworfQorc3RhdGljIGlubGluZSB2b2lkIGJsa190aHJvdGxfZHJhaW4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpIHsgfQorc3RhdGljIGlubGluZSBpbnQgYmxrX3Rocm90bF9pbml0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYmxrX3Rocm90bF9leGl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBibGtfdGhyb3RsX3JlbGVhc2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpIHsgfQorI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX1RIUk9UVExJTkcgKi8KKworI2VuZGlmIC8qIEJMS19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9ibG9jay9ic2ctbGliLmMgYi9ibG9jay9ic2ctbGliLmMKaW5kZXggNjY5MGU2ZS4uN2FkNDljOCAxMDA2NDQKLS0tIGEvYmxvY2svYnNnLWxpYi5jCisrKyBiL2Jsb2NrL2JzZy1saWIuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9ic2ctbGliLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KIAogLyoqCmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCBhM2I2NGJjLi42NjM0M2Q2IDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtMTgyLDcgKzE4MSw3IEBACiAJZXEtPmVsZXZhdG9yX2RhdGEgPSBkYXRhOwogfQogCi1zdGF0aWMgY2hhciBjaG9zZW5fZWxldmF0b3JbMTZdOworc3RhdGljIGNoYXIgY2hvc2VuX2VsZXZhdG9yW0VMVl9OQU1FX01BWF07CiAKIHN0YXRpYyBpbnQgX19pbml0IGVsZXZhdG9yX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTYwNiw0MyArNjA1LDM1IEBACiB2b2lkIGVsdl9kcmFpbl9lbGV2YXRvcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKHEtPnF1ZXVlX2xvY2spOworCiAJd2hpbGUgKHEtPmVsZXZhdG9yLT5vcHMtPmVsZXZhdG9yX2Rpc3BhdGNoX2ZuKHEsIDEpKQogCQk7Ci0JaWYgKHEtPm5yX3NvcnRlZCA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKHByaW50ZWQrKyA8IDEwKSB7CisJaWYgKHEtPm5yX3NvcnRlZCAmJiBwcmludGVkKysgPCAxMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmb3JjZWQgZGlzcGF0Y2hpbmcgaXMgYnJva2VuICIKIAkJICAgICAgICIobnJfc29ydGVkPSV1KSwgcGxlYXNlIHJlcG9ydCB0aGlzXG4iLAogCQkgICAgICAgcS0+ZWxldmF0b3ItPmVsZXZhdG9yX3R5cGUtPmVsZXZhdG9yX25hbWUsIHEtPm5yX3NvcnRlZCk7CiAJfQogfQogCi0vKgotICogQ2FsbCB3aXRoIHF1ZXVlIGxvY2sgaGVsZCwgaW50ZXJydXB0cyBkaXNhYmxlZAotICovCiB2b2lkIGVsdl9xdWllc2NlX3N0YXJ0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlmICghcS0+ZWxldmF0b3IpCiAJCXJldHVybjsKIAorCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19FTFZTV0lUQ0gsIHEpOworCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCS8qCi0JICogbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55IHJlcXVlc3RzIGluIGZsaWdodAotCSAqLwotCWVsdl9kcmFpbl9lbGV2YXRvcihxKTsKLQl3aGlsZSAocS0+cnEuZWx2cHJpdikgewotCQlfX2Jsa19ydW5fcXVldWUocSk7Ci0JCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQkJbXNsZWVwKDEwKTsKLQkJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQkJZWx2X2RyYWluX2VsZXZhdG9yKHEpOwotCX0KKwlibGtfZHJhaW5fcXVldWUocSwgZmFsc2UpOwogfQogCiB2b2lkIGVsdl9xdWllc2NlX2VuZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19FTFZTV0lUQ0gsIHEpOworCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIH0KIAogdm9pZCBfX2Vsdl9hZGRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgd2hlcmUpCkBAIC05NzIsNyArOTYzLDYgQEAKIAkvKgogCSAqIFR1cm4gb24gQllQQVNTIGFuZCBkcmFpbiBhbGwgcmVxdWVzdHMgdy8gZWxldmF0b3IgcHJpdmF0ZSBkYXRhCiAJICovCi0Jc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAllbHZfcXVpZXNjZV9zdGFydChxKTsKIAogCS8qCkBAIC05ODMsOCArOTczLDggQEAKIAkvKgogCSAqIGF0dGFjaCBhbmQgc3RhcnQgbmV3IGVsZXZhdG9yCiAJICovCisJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAllbGV2YXRvcl9hdHRhY2gocSwgZSwgZGF0YSk7Ci0KIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAlpZiAob2xkX2VsZXZhdG9yLT5yZWdpc3RlcmVkKSB7CkBAIC05OTksOSArOTg5LDcgQEAKIAkgKiBmaW5hbGx5IGV4aXQgb2xkIGVsZXZhdG9yIGFuZCB0dXJuIG9mZiBCWVBBU1MuCiAJICovCiAJZWxldmF0b3JfZXhpdChvbGRfZWxldmF0b3IpOwotCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJZWx2X3F1aWVzY2VfZW5kKHEpOwotCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCWJsa19hZGRfdHJhY2VfbXNnKHEsICJlbHYgc3dpdGNoOiAlcyIsIGUtPmVsZXZhdG9yX3R5cGUtPmVsZXZhdG9yX25hbWUpOwogCkBAIC0xMDE1LDEwICsxMDAzLDcgQEAKIAllbGV2YXRvcl9leGl0KGUpOwogCXEtPmVsZXZhdG9yID0gb2xkX2VsZXZhdG9yOwogCWVsdl9yZWdpc3Rlcl9xdWV1ZShxKTsKLQotCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JcXVldWVfZmxhZ19jbGVhcihRVUVVRV9GTEFHX0VMVlNXSVRDSCwgcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCWVsdl9xdWllc2NlX2VuZChxKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9ibG9jay9nZW5oZC5jIGIvYmxvY2svZ2VuaGQuYwppbmRleCBlMmY2NzkwLi45MjUzODM5IDEwMDY0NAotLS0gYS9ibG9jay9nZW5oZC5jCisrKyBiL2Jsb2NrL2dlbmhkLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSAiYmxrLmgiCiAKQEAgLTUzNiw3ICs1MzcsNyBAQAogCWRpc2stPnNsYXZlX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInNsYXZlcyIsICZkZGV2LT5rb2JqKTsKIAogCS8qIE5vIG1pbm9ycyB0byB1c2UgZm9yIHBhcnRpdGlvbnMgKi8KLQlpZiAoIWRpc2tfcGFydGl0aW9uYWJsZShkaXNrKSkKKwlpZiAoIWRpc2tfcGFydF9zY2FuX2VuYWJsZWQoZGlzaykpCiAJCWdvdG8gZXhpdDsKIAogCS8qIE5vIHN1Y2ggZGV2aWNlIChlLmcuLCBtZWRpYSB3ZXJlIGp1c3QgcmVtb3ZlZCkgKi8KQEAgLTYxMSw2ICs2MTIsMTIgQEAKIAlyZWdpc3Rlcl9kaXNrKGRpc2spOwogCWJsa19yZWdpc3Rlcl9xdWV1ZShkaXNrKTsKIAorCS8qCisJICogVGFrZSBhbiBleHRyYSByZWYgb24gcXVldWUgd2hpY2ggd2lsbCBiZSBwdXQgb24gZGlza19yZWxlYXNlKCkKKwkgKiBzbyB0aGF0IGl0IHN0aWNrcyBhcm91bmQgYXMgbG9uZyBhcyBAZGlzayBpcyB0aGVyZS4KKwkgKi8KKwlXQVJOX09OX09OQ0UoYmxrX2dldF9xdWV1ZShkaXNrLT5xdWV1ZSkpOworCiAJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLCAmYmRpLT5kZXYtPmtvYmosCiAJCQkJICAgImJkaSIpOwogCVdBUk5fT04ocmV0dmFsKTsKQEAgLTg0MSw3ICs4NDgsNyBAQAogCWNoYXIgYnVmW0JERVZOQU1FX1NJWkVdOwogCiAJLyogRG9uJ3Qgc2hvdyBub24tcGFydGl0aW9uYWJsZSByZW1vdmVhYmxlIGRldmljZXMgb3IgZW1wdHkgZGV2aWNlcyAqLwotCWlmICghZ2V0X2NhcGFjaXR5KHNncCkgfHwgKCFkaXNrX3BhcnRpdGlvbmFibGUoc2dwKSAmJgorCWlmICghZ2V0X2NhcGFjaXR5KHNncCkgfHwgKCFkaXNrX21heF9wYXJ0cyhzZ3ApICYmCiAJCQkJICAgKHNncC0+ZmxhZ3MgJiBHRU5IRF9GTF9SRU1PVkFCTEUpKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHNncC0+ZmxhZ3MgJiBHRU5IRF9GTF9TVVBQUkVTU19QQVJUSVRJT05fSU5GTykKQEAgLTkwOSw2ICs5MTYsNzQgQEAKIAogc3Vic3lzX2luaXRjYWxsKGdlbmhkX2RldmljZV9pbml0KTsKIAorc3RhdGljIHNzaXplX3QgYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJc3NpemVfdCByZXQgPSAwOworCisJaWYgKGRpc2stPmFsaWFzKQorCQlyZXQgPSBzbnByaW50ZihidWYsIEFMSUFTX0xFTiwgIiVzXG4iLCBkaXNrLT5hbGlhcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWxpYXNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKKwljaGFyICphbGlhczsKKwljaGFyICplbnZwW10gPSB7IE5VTEwsIE5VTEwgfTsKKwl1bnNpZ25lZCBjaGFyIGM7CisJaW50IGk7CisJc3NpemVfdCByZXQgPSBjb3VudDsKKworCWlmICghY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvdW50ID49IEFMSUFTX0xFTikgeworCQlwcmludGsoS0VSTl9FUlIgImFsaWFzOiBhbGlhcyBpcyB0b28gbG9uZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFZhbGlkYXRpb24gY2hlY2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljID0gYnVmW2ldOworCQlpZiAoaSA9PSBjb3VudCAtIDEgJiYgYyA9PSAnXG4nKQorCQkJYnJlYWs7CisJCWlmICghaXNhbG51bShjKSAmJiBjICE9ICdfJyAmJiBjICE9ICctJykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhbGlhczogaW52YWxpZCBhbGlhc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkaXNrLT5hbGlhcykgeworCQlwcmludGsoS0VSTl9JTkZPICJhbGlhczogJXMgaXMgYWxyZWFkeSBhc3NpZ25lZCAoJXMpXG4iLAorCQkgICAgICAgZGlzay0+ZGlza19uYW1lLCBkaXNrLT5hbGlhcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFsaWFzID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGJ1Zik7CisJaWYgKCFhbGlhcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWxpYXNbY291bnQgLSAxXSA9PSAnXG4nKQorCQlhbGlhc1tjb3VudCAtIDFdID0gJ1wwJzsKKworCWVudnBbMF0gPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIkFMSUFTPSVzIiwgYWxpYXMpOworCWlmICghZW52cFswXSkgeworCQlrZnJlZShhbGlhcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRpc2stPmFsaWFzID0gYWxpYXM7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWxpYXM6IGFzc2lnbmVkICVzIHRvICVzXG4iLCBhbGlhcywgZGlzay0+ZGlza19uYW1lKTsKKworCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5rb2JqLCBLT0JKX0FERCwgZW52cCk7CisKKwlrZnJlZShlbnZwWzBdKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3NpemVfdCBkaXNrX3JhbmdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC05NjgsNiArMTA0Myw3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHF1ZXVlX2Rpc2NhcmRfYWxpZ25tZW50KGRpc2stPnF1ZXVlKSk7CiB9CiAKK3N0YXRpYyBERVZJQ0VfQVRUUihhbGlhcywgU19JUlVHT3xTX0lXVVNSLCBhbGlhc19zaG93LCBhbGlhc19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocmFuZ2UsIFNfSVJVR08sIGRpc2tfcmFuZ2Vfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZXh0X3JhbmdlLCBTX0lSVUdPLCBkaXNrX2V4dF9yYW5nZV9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihyZW1vdmFibGUsIFNfSVJVR08sIGRpc2tfcmVtb3ZhYmxlX3Nob3csIE5VTEwpOwpAQCAtOTkwLDYgKzEwNjYsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkaXNrX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2FsaWFzLmF0dHIsCiAJJmRldl9hdHRyX3JhbmdlLmF0dHIsCiAJJmRldl9hdHRyX2V4dF9yYW5nZS5hdHRyLAogCSZkZXZfYXR0cl9yZW1vdmFibGUuYXR0ciwKQEAgLTEwOTUsNiArMTE3Miw4IEBACiAJZGlza19yZXBsYWNlX3BhcnRfdGJsKGRpc2ssIE5VTEwpOwogCWZyZWVfcGFydF9zdGF0cygmZGlzay0+cGFydDApOwogCWZyZWVfcGFydF9pbmZvKCZkaXNrLT5wYXJ0MCk7CisJaWYgKGRpc2stPnF1ZXVlKQorCQlibGtfcHV0X3F1ZXVlKGRpc2stPnF1ZXVlKTsKIAlrZnJlZShkaXNrKTsKIH0KIHN0cnVjdCBjbGFzcyBibG9ja19jbGFzcyA9IHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IDExMjRjZDIuLmNhOTM5ZmMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgpAQCAtMTAxLDcgKzEwMiw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCWludCByZXM7CiAKLQlpZiAoIWRpc2tfcGFydGl0aW9uYWJsZShkaXNrKSB8fCBiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQorCWlmICghZGlza19wYXJ0X3NjYW5fZW5hYmxlZChkaXNrKSB8fCBiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOwpkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IDRmNDIzMGIuLmZiZGYwZDggMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTU2NSw3ICs1NjUsNyBAQAogewogCWludCBlcnI7CiAKLQlpZiAoIXEgfHwgYmxrX2dldF9xdWV1ZShxKSkKKwlpZiAoIXEpCiAJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtNjg2LDcgKzY4Niw2IEBACiAJCQllcnIgPSAtRU5PVFRZOwogCX0KIAotCWJsa19wdXRfcXVldWUocSk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9jbWRfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCBhZTI3Yjc1My4uNTI3YTg1NyAxMDA2NDQKLS0tIGEvY3J5cHRvL0tjb25maWcKKysrIGIvY3J5cHRvL0tjb25maWcKQEAgLTEwMCw2ICsxMDAsMTQgQEAKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUjIKIAlzZWxlY3QgQ1JZUFRPX1BDT01QMgogCitjb25maWcgQ1JZUFRPX1VTRVIKKwl0cmlzdGF0ZSAiVXNlcnNwYWNlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGNvbmZpZ3VyYXRpb24iCisJZGVwZW5kcyBvbiBORVQKKwlzZWxlY3QgQ1JZUFRPX01BTkFHRVIKKwloZWxwCisJICBVc2VyYXBhY2UgY29uZmlndXJhdGlvbiBmb3IgY3J5cHRvZ3JhcGhpYyBpbnN0YW50aWF0aW9ucyBzdWNoIGFzCisJICBjYmMoYWVzKS4KKwogY29uZmlnIENSWVBUT19NQU5BR0VSX0RJU0FCTEVfVEVTVFMKIAlib29sICJEaXNhYmxlIHJ1bi10aW1lIHNlbGYgdGVzdHMiCiAJZGVmYXVsdCB5CkBAIC00MDcsNiArNDE1LDE2IEBACiAJaGVscAogCSAgU0hBLTEgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKEZJUFMgMTgwLTEvREZJUFMgMTgwLTIpLgogCitjb25maWcgQ1JZUFRPX1NIQTFfU1NTRTMKKwl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChTU1NFMy9BVlgpIgorCWRlcGVuZHMgb24gWDg2ICYmIDY0QklUCisJc2VsZWN0IENSWVBUT19TSEExCisJc2VsZWN0IENSWVBUT19IQVNICisJaGVscAorCSAgU0hBLTEgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKEZJUFMgMTgwLTEvREZJUFMgMTgwLTIpIGltcGxlbWVudGVkCisJICB1c2luZyBTdXBwbGVtZW50YWwgU1NFMyAoU1NTRTMpIGluc3RydWN0aW9ucyBvciBBZHZhbmNlZCBWZWN0b3IKKwkgIEV4dGVuc2lvbnMgKEFWWCksIHdoZW4gYXZhaWxhYmxlLgorCiBjb25maWcgQ1JZUFRPX1NIQTI1NgogCXRyaXN0YXRlICJTSEEyMjQgYW5kIFNIQTI1NiBkaWdlc3QgYWxnb3JpdGhtIgogCXNlbGVjdCBDUllQVE9fSEFTSApAQCAtNTkwLDYgKzYwOCw3IEBACiBjb25maWcgQ1JZUFRPX0JMT1dGSVNICiAJdHJpc3RhdGUgIkJsb3dmaXNoIGNpcGhlciBhbGdvcml0aG0iCiAJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0JMT1dGSVNIX0NPTU1PTgogCWhlbHAKIAkgIEJsb3dmaXNoIGNpcGhlciBhbGdvcml0aG0sIGJ5IEJydWNlIFNjaG5laWVyLgogCkBAIC02MDAsNiArNjE5LDMwIEBACiAJICBTZWUgYWxzbzoKIAkgIDxodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9ibG93ZmlzaC5odG1sPgogCitjb25maWcgQ1JZUFRPX0JMT1dGSVNIX0NPTU1PTgorCXRyaXN0YXRlCisJaGVscAorCSAgQ29tbW9uIHBhcnRzIG9mIHRoZSBCbG93ZmlzaCBjaXBoZXIgYWxnb3JpdGhtIHNoYXJlZCBieSB0aGUKKwkgIGdlbmVyaWMgYyBhbmQgdGhlIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbnMuCisKKwkgIFNlZSBhbHNvOgorCSAgPGh0dHA6Ly93d3cuc2NobmVpZXIuY29tL2Jsb3dmaXNoLmh0bWw+CisKK2NvbmZpZyBDUllQVE9fQkxPV0ZJU0hfWDg2XzY0CisJdHJpc3RhdGUgIkJsb3dmaXNoIGNpcGhlciBhbGdvcml0aG0gKHg4Nl82NCkiCisJZGVwZW5kcyBvbiAoWDg2IHx8IFVNTF9YODYpICYmIDY0QklUCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0JMT1dGSVNIX0NPTU1PTgorCWhlbHAKKwkgIEJsb3dmaXNoIGNpcGhlciBhbGdvcml0aG0gKHg4Nl82NCksIGJ5IEJydWNlIFNjaG5laWVyLgorCisJICBUaGlzIGlzIGEgdmFyaWFibGUga2V5IGxlbmd0aCBjaXBoZXIgd2hpY2ggY2FuIHVzZSBrZXlzIGZyb20gMzIKKwkgIGJpdHMgdG8gNDQ4IGJpdHMgaW4gbGVuZ3RoLiAgSXQncyBmYXN0LCBzaW1wbGUgYW5kIHNwZWNpZmljYWxseQorCSAgZGVzaWduZWQgZm9yIHVzZSBvbiAibGFyZ2UgbWljcm9wcm9jZXNzb3JzIi4KKworCSAgU2VlIGFsc286CisJICA8aHR0cDovL3d3dy5zY2huZWllci5jb20vYmxvd2Zpc2guaHRtbD4KKwogY29uZmlnIENSWVBUT19DQU1FTExJQQogCXRyaXN0YXRlICJDYW1lbGxpYSBjaXBoZXIgYWxnb3JpdGhtcyIKIAlkZXBlbmRzIG9uIENSWVBUTwpAQCAtNzkzLDYgKzgzNiwyNiBAQAogCSAgU2VlIGFsc286CiAJICA8aHR0cDovL3d3dy5zY2huZWllci5jb20vdHdvZmlzaC5odG1sPgogCitjb25maWcgQ1JZUFRPX1RXT0ZJU0hfWDg2XzY0XzNXQVkKKwl0cmlzdGF0ZSAiVHdvZmlzaCBjaXBoZXIgYWxnb3JpdGhtICh4ODZfNjQsIDMtd2F5IHBhcmFsbGVsKSIKKwlkZXBlbmRzIG9uIChYODYgfHwgVU1MX1g4NikgJiYgNjRCSVQKKwlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCXNlbGVjdCBDUllQVE9fVFdPRklTSF9DT01NT04KKwlzZWxlY3QgQ1JZUFRPX1RXT0ZJU0hfWDg2XzY0CisJaGVscAorCSAgVHdvZmlzaCBjaXBoZXIgYWxnb3JpdGhtICh4ODZfNjQsIDMtd2F5IHBhcmFsbGVsKS4KKworCSAgVHdvZmlzaCB3YXMgc3VibWl0dGVkIGFzIGFuIEFFUyAoQWR2YW5jZWQgRW5jcnlwdGlvbiBTdGFuZGFyZCkKKwkgIGNhbmRpZGF0ZSBjaXBoZXIgYnkgcmVzZWFyY2hlcnMgYXQgQ291bnRlclBhbmUgU3lzdGVtcy4gIEl0IGlzIGEKKwkgIDE2IHJvdW5kIGJsb2NrIGNpcGhlciBzdXBwb3J0aW5nIGtleSBzaXplcyBvZiAxMjgsIDE5MiwgYW5kIDI1NgorCSAgYml0cy4KKworCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgVHdvZmlzaCBjaXBoZXIgYWxnb3JpdGhtIHRoYXQgcHJvY2Vzc2VzIHRocmVlCisJICBibG9ja3MgcGFyYWxsZWwsIHV0aWxpemluZyByZXNvdXJjZXMgb2Ygb3V0LW9mLW9yZGVyIENQVXMgYmV0dGVyLgorCisJICBTZWUgYWxzbzoKKwkgIDxodHRwOi8vd3d3LnNjaG5laWVyLmNvbS90d29maXNoLmh0bWw+CisKIGNvbW1lbnQgIkNvbXByZXNzaW9uIgogCiBjb25maWcgQ1JZUFRPX0RFRkxBVEUKZGlmZiAtLWdpdCBhL2NyeXB0by9NYWtlZmlsZSBiL2NyeXB0by9NYWtlZmlsZQppbmRleCBjZTVhODEzLi45ZTZlZWUyIDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKKysrIGIvY3J5cHRvL01ha2VmaWxlCkBAIC0zMSw2ICszMSw3IEBACiBjcnlwdG9tZ3IteSA6PSBhbGdib3NzLm8gdGVzdG1nci5vCiAKIG9iai0kKENPTkZJR19DUllQVE9fTUFOQUdFUjIpICs9IGNyeXB0b21nci5vCitvYmotJChDT05GSUdfQ1JZUFRPX1VTRVIpICs9IGNyeXB0b191c2VyLm8KIG9iai0kKENPTkZJR19DUllQVE9fSE1BQykgKz0gaG1hYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1ZNQUMpICs9IHZtYWMubwogb2JqLSQoQ09ORklHX0NSWVBUT19YQ0JDKSArPSB4Y2JjLm8KQEAgLTYwLDcgKzYxLDggQEAKIG9iai0kKENPTkZJR19DUllQVE9fQ1JZUFREKSArPSBjcnlwdGQubwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVMpICs9IGRlc19nZW5lcmljLm8KIG9iai0kKENPTkZJR19DUllQVE9fRkNSWVBUKSArPSBmY3J5cHQubwotb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSCkgKz0gYmxvd2Zpc2gubworb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSCkgKz0gYmxvd2Zpc2hfZ2VuZXJpYy5vCitvYmotJChDT05GSUdfQ1JZUFRPX0JMT1dGSVNIX0NPTU1PTikgKz0gYmxvd2Zpc2hfY29tbW9uLm8KIG9iai0kKENPTkZJR19DUllQVE9fVFdPRklTSCkgKz0gdHdvZmlzaF9nZW5lcmljLm8KIG9iai0kKENPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT04pICs9IHR3b2Zpc2hfY29tbW9uLm8KIG9iai0kKENPTkZJR19DUllQVE9fU0VSUEVOVCkgKz0gc2VycGVudC5vCmRpZmYgLS1naXQgYS9jcnlwdG8vYWJsa2NpcGhlci5jIGIvY3J5cHRvL2FibGtjaXBoZXIuYwppbmRleCBmZGM2N2QzLi5hMGY3NjhjIDEwMDY0NAotLS0gYS9jcnlwdG8vYWJsa2NpcGhlci5jCisrKyBiL2NyeXB0by9hYmxrY2lwaGVyLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b3VzZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSA8Y3J5cHRvL3NjYXR0ZXJ3YWxrLmg+CiAKQEAgLTM4MSw2ICszODMsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX2FibGtjaXBoZXJfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyIHJibGtjaXBoZXI7CisKKwlzbnByaW50ZihyYmxrY2lwaGVyLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJhYmxrY2lwaGVyIik7CisJc25wcmludGYocmJsa2NpcGhlci5nZW5pdiwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwKKwkJIGFsZy0+Y3JhX2FibGtjaXBoZXIuZ2VuaXYgPzogIjxkZWZhdWx0PiIpOworCisJcmJsa2NpcGhlci5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmJsa2NpcGhlci5taW5fa2V5c2l6ZSA9IGFsZy0+Y3JhX2FibGtjaXBoZXIubWluX2tleXNpemU7CisJcmJsa2NpcGhlci5tYXhfa2V5c2l6ZSA9IGFsZy0+Y3JhX2FibGtjaXBoZXIubWF4X2tleXNpemU7CisJcmJsa2NpcGhlci5pdnNpemUgPSBhbGctPmNyYV9hYmxrY2lwaGVyLml2c2l6ZTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9CTEtDSVBIRVIsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIpLCAmcmJsa2NpcGhlcik7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fYWJsa2NpcGhlcl9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fYWJsa2NpcGhlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKIAlfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CiBzdGF0aWMgdm9pZCBjcnlwdG9fYWJsa2NpcGhlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTQwMyw2ICs0MzQsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fYWJsa2NpcGhlcl9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcG9ydCwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWJsa2NpcGhlcl90eXBlKTsKIApAQCAtNDMyLDYgKzQ2NCwzNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05FVAorc3RhdGljIGludCBjcnlwdG9fZ2l2Y2lwaGVyX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X2Jsa2NpcGhlciByYmxrY2lwaGVyOworCisJc25wcmludGYocmJsa2NpcGhlci50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAiZ2l2Y2lwaGVyIik7CisJc25wcmludGYocmJsa2NpcGhlci5nZW5pdiwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwKKwkJIGFsZy0+Y3JhX2FibGtjaXBoZXIuZ2VuaXYgPzogIjxidWlsdC1pbj4iKTsKKworCXJibGtjaXBoZXIuYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJibGtjaXBoZXIubWluX2tleXNpemUgPSBhbGctPmNyYV9hYmxrY2lwaGVyLm1pbl9rZXlzaXplOworCXJibGtjaXBoZXIubWF4X2tleXNpemUgPSBhbGctPmNyYV9hYmxrY2lwaGVyLm1heF9rZXlzaXplOworCXJibGtjaXBoZXIuaXZzaXplID0gYWxnLT5jcmFfYWJsa2NpcGhlci5pdnNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQkxLQ0lQSEVSLAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfYmxrY2lwaGVyKSwgJnJibGtjaXBoZXIpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX2dpdmNpcGhlcl9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fZ2l2Y2lwaGVyX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19naXZjaXBoZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCkBAIC00NTQsNiArNTE1LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93ID0gY3J5cHRvX2dpdmNpcGhlcl9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19naXZjaXBoZXJfcmVwb3J0LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19naXZjaXBoZXJfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9hZWFkLmMgYi9jcnlwdG8vYWVhZC5jCmluZGV4IDY3MjllOGYuLjA0YWRkM2RjIDEwMDY0NAotLS0gYS9jcnlwdG8vYWVhZC5jCisrKyBiL2NyeXB0by9hZWFkLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b3VzZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTA5LDYgKzExMSwzNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05FVAorc3RhdGljIGludCBjcnlwdG9fYWVhZF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9hZWFkIHJhZWFkOworCXN0cnVjdCBhZWFkX2FsZyAqYWVhZCA9ICZhbGctPmNyYV9hZWFkOworCisJc25wcmludGYocmFlYWQudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImFlYWQiKTsKKwlzbnByaW50ZihyYWVhZC5nZW5pdiwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwKKwkJIGFlYWQtPmdlbml2ID86ICI8YnVpbHQtaW4+Iik7CisKKwlyYWVhZC5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmFlYWQubWF4YXV0aHNpemUgPSBhZWFkLT5tYXhhdXRoc2l6ZTsKKwlyYWVhZC5pdnNpemUgPSBhZWFkLT5pdnNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQUVBRCwKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2FlYWQpLCAmcmFlYWQpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX2FlYWRfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgY3J5cHRvX2FlYWRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX2FlYWRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCkBAIC0xMzAsNiArMTYxLDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS5zaG93ID0gY3J5cHRvX2FlYWRfc2hvdywKICNlbmRpZgorCS5yZXBvcnQgPSBjcnlwdG9fYWVhZF9yZXBvcnQsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FlYWRfdHlwZSk7CiAKQEAgLTE2NSw2ICsxOTcsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX25pdmFlYWRfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfYWVhZCByYWVhZDsKKwlzdHJ1Y3QgYWVhZF9hbGcgKmFlYWQgPSAmYWxnLT5jcmFfYWVhZDsKKworCXNucHJpbnRmKHJhZWFkLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJuaXZhZWFkIik7CisJc25wcmludGYocmFlYWQuZ2VuaXYsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsIGFlYWQtPmdlbml2KTsKKworCXJhZWFkLmJsb2Nrc2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlyYWVhZC5tYXhhdXRoc2l6ZSA9IGFlYWQtPm1heGF1dGhzaXplOworCXJhZWFkLml2c2l6ZSA9IGFlYWQtPml2c2l6ZTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9BRUFELAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfYWVhZCksICZyYWVhZCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fbml2YWVhZF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCisKIHN0YXRpYyB2b2lkIGNyeXB0b19uaXZhZWFkX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19uaXZhZWFkX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtMTg2LDYgKzI0Nyw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkuc2hvdyA9IGNyeXB0b19uaXZhZWFkX3Nob3csCiAjZW5kaWYKKwkucmVwb3J0ID0gY3J5cHRvX25pdmFlYWRfcmVwb3J0LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19uaXZhZWFkX3R5cGUpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vYWhhc2guYyBiL2NyeXB0by9haGFzaC5jCmluZGV4IGY2Njk4MjIuLmFjOTNjOTkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9haGFzaC5jCisrKyBiL2NyeXB0by9haGFzaC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG91c2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTM5Nyw2ICszOTksMzEgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fc2hhc2ggKik7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19haGFzaF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoIHJoYXNoOworCisJc25wcmludGYocmhhc2gudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImFoYXNoIik7CisKKwlyaGFzaC5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmhhc2guZGlnZXN0c2l6ZSA9IF9fY3J5cHRvX2hhc2hfYWxnX2NvbW1vbihhbGcpLT5kaWdlc3RzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX0hBU0gsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoKSwgJnJoYXNoKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19haGFzaF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fYWhhc2hfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX2FoYXNoX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtNDE1LDYgKzQ0Miw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkuc2hvdyA9IGNyeXB0b19haGFzaF9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19haGFzaF9yZXBvcnQsCiAJLm1hc2tjbGVhciA9IH5DUllQVE9fQUxHX1RZUEVfTUFTSywKIAkubWFza3NldCA9IENSWVBUT19BTEdfVFlQRV9BSEFTSF9NQVNLLAogCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FsZ2FwaS5jIGIvY3J5cHRvL2FsZ2FwaS5jCmluZGV4IGMzY2YxYTYuLjU0ZGQ0ZTMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbGdhcGkuYworKysgYi9jcnlwdG8vYWxnYXBpLmMKQEAgLTIyLDggKzIyLDYgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXN0YXRpYyB2b2lkIGNyeXB0b19yZW1vdmVfZmluYWwoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7Ci0KIHN0YXRpYyBMSVNUX0hFQUQoY3J5cHRvX3RlbXBsYXRlX2xpc3QpOwogCiB2b2lkIGNyeXB0b19sYXJ2YWxfZXJyb3IoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQpAQCAtMTI5LDkgKzEyNyw4IEBACiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbnN0LT5hbGcuY3JhX3VzZXJzKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNyeXB0b19yZW1vdmVfc3Bhd25zKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCi0JCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkJIHN0cnVjdCBjcnlwdG9fYWxnICpuYWxnKQordm9pZCBjcnlwdG9fcmVtb3ZlX3NwYXducyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJICBzdHJ1Y3QgY3J5cHRvX2FsZyAqbmFsZykKIHsKIAl1MzIgbmV3X3R5cGUgPSAobmFsZyA/OiBhbGcpLT5jcmFfZmxhZ3M7CiAJc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24sICpuOwpAQCAtMTc3LDYgKzE3NCw3IEBACiAJCQljcnlwdG9fcmVtb3ZlX3NwYXduKHNwYXduLCBsaXN0KTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fcmVtb3ZlX3NwYXducyk7CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqX19jcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiB7CkBAIC0zMjEsNyArMzE5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGdfdGVzdGVkKTsKIAotc3RhdGljIHZvaWQgY3J5cHRvX3JlbW92ZV9maW5hbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQordm9pZCBjcnlwdG9fcmVtb3ZlX2ZpbmFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqbjsKQEAgLTMzMSw2ICszMjksNyBAQAogCQljcnlwdG9fYWxnX3B1dChhbGcpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19yZW1vdmVfZmluYWwpOwogCiBzdGF0aWMgdm9pZCBjcnlwdG9fd2FpdF9mb3JfdGVzdChzdHJ1Y3QgY3J5cHRvX2xhcnZhbCAqbGFydmFsKQogewpAQCAtNDkzLDYgKzQ5Miw3IEBACiAJCWdvdG8gZXJyOwogCiAJaW5zdC0+YWxnLmNyYV9tb2R1bGUgPSB0bXBsLT5tb2R1bGU7CisJaW5zdC0+YWxnLmNyYV9mbGFncyB8PSBDUllQVE9fQUxHX0lOU1RBTkNFOwogCiAJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtY3B5LmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfbWVtY3B5LmMKaW5kZXggNTE4YzIyYi4uMGQ1YTkwYyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX21lbWNweS5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY19tZW1jcHkuYwpAQCAtMjUsNiArMjUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luY190eC5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3BxLmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYwppbmRleCBmZGQ4MjU3Li45MWQ1ZDM4IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYworKysgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY19yYWlkNl9yZWNvdi5jIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3JhaWQ2X3JlY292LmMKaW5kZXggY2UwMzhkOC4uYTlmMDhhNiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3JhaWQ2X3JlY292LmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3JhaWQ2X3JlY292LmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCmluZGV4IDdmMmMwMGEuLjg0MjEyMDkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY194b3IuYyBiL2NyeXB0by9hc3luY190eC9hc3luY194b3IuYwppbmRleCBiYzI4MzM3Li4xNTRjYzg0IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfeG9yLmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3hvci5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC94b3IuaD4KZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9yYWlkNnRlc3QuYyBiL2NyeXB0by9hc3luY190eC9yYWlkNnRlc3QuYwppbmRleCBjODhmZjllLi5hYTJiMDI3IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvcmFpZDZ0ZXN0LmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L3JhaWQ2dGVzdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI3VuZGVmIHByCiAjZGVmaW5lIHByKGZtdCwgYXJncy4uLikgcHJfaW5mbygicmFpZDZ0ZXN0OiAiIGZtdCwgIyNhcmdzKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsa2NpcGhlci5jIGIvY3J5cHRvL2Jsa2NpcGhlci5jCmluZGV4IDdhNzIxOTIuLjFlNjFkMWEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG91c2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTQ5Miw2ICs0OTQsMzUgQEAKIAkJcmV0dXJuIGNyeXB0b19pbml0X2Jsa2NpcGhlcl9vcHNfYXN5bmModGZtKTsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIgcmJsa2NpcGhlcjsKKworCXNucHJpbnRmKHJibGtjaXBoZXIudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImJsa2NpcGhlciIpOworCXNucHJpbnRmKHJibGtjaXBoZXIuZ2VuaXYsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsCisJCSBhbGctPmNyYV9ibGtjaXBoZXIuZ2VuaXYgPzogIjxkZWZhdWx0PiIpOworCisJcmJsa2NpcGhlci5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmJsa2NpcGhlci5taW5fa2V5c2l6ZSA9IGFsZy0+Y3JhX2Jsa2NpcGhlci5taW5fa2V5c2l6ZTsKKwlyYmxrY2lwaGVyLm1heF9rZXlzaXplID0gYWxnLT5jcmFfYmxrY2lwaGVyLm1heF9rZXlzaXplOworCXJibGtjaXBoZXIuaXZzaXplID0gYWxnLT5jcmFfYmxrY2lwaGVyLml2c2l6ZTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9CTEtDSVBIRVIsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIpLCAmcmJsa2NpcGhlcik7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisjZWxzZQorc3RhdGljIGludCBjcnlwdG9fYmxrY2lwaGVyX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIGNyeXB0b19ibGtjaXBoZXJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKQEAgLTUxMSw2ICs1NDIsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fYmxrY2lwaGVyX3Nob3csCiAjZW5kaWYKKwkucmVwb3J0ID0gY3J5cHRvX2Jsa2NpcGhlcl9yZXBvcnQsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2Jsa2NpcGhlcl90eXBlKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsb3dmaXNoLmMgYi9jcnlwdG8vYmxvd2Zpc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZDUyZS4uMDAwMDAwMAotLS0gYS9jcnlwdG8vYmxvd2Zpc2guYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKgotICogQ3J5cHRvZ3JhcGhpYyBBUEkuCi0gKgotICogQmxvd2Zpc2ggQ2lwaGVyIEFsZ29yaXRobSwgYnkgQnJ1Y2UgU2NobmVpZXIuCi0gKiBodHRwOi8vd3d3LmNvdW50ZXJwYW5lLmNvbS9ibG93ZmlzaC5odG1sCi0gKgotICogQWRhcHRlZCBmcm9tIEtlcm5lbGkgaW1wbGVtZW50YXRpb24uCi0gKgotICogQ29weXJpZ2h0IChjKSBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KLSAqIENvcHlyaWdodCAoYykgS3lsZSBNY01hcnRpbiA8a3lsZUBkZWJpYW4ub3JnPgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNkZWZpbmUgQkZfQkxPQ0tfU0laRSA4Ci0jZGVmaW5lIEJGX01JTl9LRVlfU0laRSA0Ci0jZGVmaW5lIEJGX01BWF9LRVlfU0laRSA1NgotCi1zdHJ1Y3QgYmZfY3R4IHsKLQl1MzIgcFsxOF07Ci0JdTMyIHNbMTAyNF07Ci19OwotCi1zdGF0aWMgY29uc3QgdTMyIGJmX3Bib3hbMTYgKyAyXSA9IHsKLQkweDI0M2Y2YTg4LCAweDg1YTMwOGQzLCAweDEzMTk4YTJlLCAweDAzNzA3MzQ0LAotCTB4YTQwOTM4MjIsIDB4Mjk5ZjMxZDAsIDB4MDgyZWZhOTgsIDB4ZWM0ZTZjODksCi0JMHg0NTI4MjFlNiwgMHgzOGQwMTM3NywgMHhiZTU0NjZjZiwgMHgzNGU5MGM2YywKLQkweGMwYWMyOWI3LCAweGM5N2M1MGRkLCAweDNmODRkNWI1LCAweGI1NDcwOTE3LAotCTB4OTIxNmQ1ZDksIDB4ODk3OWZiMWIsCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGJmX3Nib3hbMjU2ICogNF0gPSB7Ci0JMHhkMTMxMGJhNiwgMHg5OGRmYjVhYywgMHgyZmZkNzJkYiwgMHhkMDFhZGZiNywKLQkweGI4ZTFhZmVkLCAweDZhMjY3ZTk2LCAweGJhN2M5MDQ1LCAweGYxMmM3Zjk5LAotCTB4MjRhMTk5NDcsIDB4YjM5MTZjZjcsIDB4MDgwMWYyZTIsIDB4ODU4ZWZjMTYsCi0JMHg2MzY5MjBkOCwgMHg3MTU3NGU2OSwgMHhhNDU4ZmVhMywgMHhmNDkzM2Q3ZSwKLQkweDBkOTU3NDhmLCAweDcyOGViNjU4LCAweDcxOGJjZDU4LCAweDgyMTU0YWVlLAotCTB4N2I1NGE0MWQsIDB4YzI1YTU5YjUsIDB4OWMzMGQ1MzksIDB4MmFmMjYwMTMsCi0JMHhjNWQxYjAyMywgMHgyODYwODVmMCwgMHhjYTQxNzkxOCwgMHhiOGRiMzhlZiwKLQkweDhlNzlkY2IwLCAweDYwM2ExODBlLCAweDZjOWUwZThiLCAweGIwMWU4YTNlLAotCTB4ZDcxNTc3YzEsIDB4YmQzMTRiMjcsIDB4NzhhZjJmZGEsIDB4NTU2MDVjNjAsCi0JMHhlNjU1MjVmMywgMHhhYTU1YWI5NCwgMHg1NzQ4OTg2MiwgMHg2M2U4MTQ0MCwKLQkweDU1Y2EzOTZhLCAweDJhYWIxMGI2LCAweGI0Y2M1YzM0LCAweDExNDFlOGNlLAotCTB4YTE1NDg2YWYsIDB4N2M3MmU5OTMsIDB4YjNlZTE0MTEsIDB4NjM2ZmJjMmEsCi0JMHgyYmE5YzU1ZCwgMHg3NDE4MzFmNiwgMHhjZTVjM2UxNiwgMHg5Yjg3OTMxZSwKLQkweGFmZDZiYTMzLCAweDZjMjRjZjVjLCAweDdhMzI1MzgxLCAweDI4OTU4Njc3LAotCTB4M2I4ZjQ4OTgsIDB4NmI0YmI5YWYsIDB4YzRiZmU4MWIsIDB4NjYyODIxOTMsCi0JMHg2MWQ4MDljYywgMHhmYjIxYTk5MSwgMHg0ODdjYWM2MCwgMHg1ZGVjODAzMiwKLQkweGVmODQ1ZDVkLCAweGU5ODU3NWIxLCAweGRjMjYyMzAyLCAweGViNjUxYjg4LAotCTB4MjM4OTNlODEsIDB4ZDM5NmFjYzUsIDB4MGY2ZDZmZjMsIDB4ODNmNDQyMzksCi0JMHgyZTBiNDQ4MiwgMHhhNDg0MjAwNCwgMHg2OWM4ZjA0YSwgMHg5ZTFmOWI1ZSwKLQkweDIxYzY2ODQyLCAweGY2ZTk2YzlhLCAweDY3MGM5YzYxLCAweGFiZDM4OGYwLAotCTB4NmE1MWEwZDIsIDB4ZDg1NDJmNjgsIDB4OTYwZmE3MjgsIDB4YWI1MTMzYTMsCi0JMHg2ZWVmMGI2YywgMHgxMzdhM2JlNCwgMHhiYTNiZjA1MCwgMHg3ZWZiMmE5OCwKLQkweGExZjE2NTFkLCAweDM5YWYwMTc2LCAweDY2Y2E1OTNlLCAweDgyNDMwZTg4LAotCTB4OGNlZTg2MTksIDB4NDU2ZjlmYjQsIDB4N2Q4NGE1YzMsIDB4M2I4YjVlYmUsCi0JMHhlMDZmNzVkOCwgMHg4NWMxMjA3MywgMHg0MDFhNDQ5ZiwgMHg1NmMxNmFhNiwKLQkweDRlZDNhYTYyLCAweDM2M2Y3NzA2LCAweDFiZmVkZjcyLCAweDQyOWIwMjNkLAotCTB4MzdkMGQ3MjQsIDB4ZDAwYTEyNDgsIDB4ZGIwZmVhZDMsIDB4NDlmMWMwOWIsCi0JMHgwNzUzNzJjOSwgMHg4MDk5MWI3YiwgMHgyNWQ0NzlkOCwgMHhmNmU4ZGVmNywKLQkweGUzZmU1MDFhLCAweGI2Nzk0YzNiLCAweDk3NmNlMGJkLCAweDA0YzAwNmJhLAotCTB4YzFhOTRmYjYsIDB4NDA5ZjYwYzQsIDB4NWU1YzllYzIsIDB4MTk2YTI0NjMsCi0JMHg2OGZiNmZhZiwgMHgzZTZjNTNiNSwgMHgxMzM5YjJlYiwgMHgzYjUyZWM2ZiwKLQkweDZkZmM1MTFmLCAweDliMzA5NTJjLCAweGNjODE0NTQ0LCAweGFmNWViZDA5LAotCTB4YmVlM2QwMDQsIDB4ZGUzMzRhZmQsIDB4NjYwZjI4MDcsIDB4MTkyZTRiYjMsCi0JMHhjMGNiYTg1NywgMHg0NWM4NzQwZiwgMHhkMjBiNWYzOSwgMHhiOWQzZmJkYiwKLQkweDU1NzljMGJkLCAweDFhNjAzMjBhLCAweGQ2YTEwMGM2LCAweDQwMmM3Mjc5LAotCTB4Njc5ZjI1ZmUsIDB4ZmIxZmEzY2MsIDB4OGVhNWU5ZjgsIDB4ZGIzMjIyZjgsCi0JMHgzYzc1MTZkZiwgMHhmZDYxNmIxNSwgMHgyZjUwMWVjOCwgMHhhZDA1NTJhYiwKLQkweDMyM2RiNWZhLCAweGZkMjM4NzYwLCAweDUzMzE3YjQ4LCAweDNlMDBkZjgyLAotCTB4OWU1YzU3YmIsIDB4Y2E2ZjhjYTAsIDB4MWE4NzU2MmUsIDB4ZGYxNzY5ZGIsCi0JMHhkNTQyYThmNiwgMHgyODdlZmZjMywgMHhhYzY3MzJjNiwgMHg4YzRmNTU3MywKLQkweDY5NWIyN2IwLCAweGJiY2E1OGM4LCAweGUxZmZhMzVkLCAweGI4ZjAxMWEwLAotCTB4MTBmYTNkOTgsIDB4ZmQyMTgzYjgsIDB4NGFmY2I1NmMsIDB4MmRkMWQzNWIsCi0JMHg5YTUzZTQ3OSwgMHhiNmY4NDU2NSwgMHhkMjhlNDliYywgMHg0YmZiOTc5MCwKLQkweGUxZGRmMmRhLCAweGE0Y2I3ZTMzLCAweDYyZmIxMzQxLCAweGNlZTRjNmU4LAotCTB4ZWYyMGNhZGEsIDB4MzY3NzRjMDEsIDB4ZDA3ZTllZmUsIDB4MmJmMTFmYjQsCi0JMHg5NWRiZGE0ZCwgMHhhZTkwOTE5OCwgMHhlYWFkOGU3MSwgMHg2YjkzZDVhMCwKLQkweGQwOGVkMWQwLCAweGFmYzcyNWUwLCAweDhlM2M1YjJmLCAweDhlNzU5NGI3LAotCTB4OGZmNmUyZmIsIDB4ZjIxMjJiNjQsIDB4ODg4OGI4MTIsIDB4OTAwZGYwMWMsCi0JMHg0ZmFkNWVhMCwgMHg2ODhmYzMxYywgMHhkMWNmZjE5MSwgMHhiM2E4YzFhZCwKLQkweDJmMmYyMjE4LCAweGJlMGUxNzc3LCAweGVhNzUyZGZlLCAweDhiMDIxZmExLAotCTB4ZTVhMGNjMGYsIDB4YjU2Zjc0ZTgsIDB4MThhY2YzZDYsIDB4Y2U4OWUyOTksCi0JMHhiNGE4NGZlMCwgMHhmZDEzZTBiNywgMHg3Y2M0M2I4MSwgMHhkMmFkYThkOSwKLQkweDE2NWZhMjY2LCAweDgwOTU3NzA1LCAweDkzY2M3MzE0LCAweDIxMWExNDc3LAotCTB4ZTZhZDIwNjUsIDB4NzdiNWZhODYsIDB4Yzc1NDQyZjUsIDB4ZmI5ZDM1Y2YsCi0JMHhlYmNkYWYwYywgMHg3YjNlODlhMCwgMHhkNjQxMWJkMywgMHhhZTFlN2U0OSwKLQkweDAwMjUwZTJkLCAweDIwNzFiMzVlLCAweDIyNjgwMGJiLCAweDU3YjhlMGFmLAotCTB4MjQ2NDM2OWIsIDB4ZjAwOWI5MWUsIDB4NTU2MzkxMWQsIDB4NTlkZmE2YWEsCi0JMHg3OGMxNDM4OSwgMHhkOTVhNTM3ZiwgMHgyMDdkNWJhMiwgMHgwMmU1YjljNSwKLQkweDgzMjYwMzc2LCAweDYyOTVjZmE5LCAweDExYzgxOTY4LCAweDRlNzM0YTQxLAotCTB4YjM0NzJkY2EsIDB4N2IxNGE5NGEsIDB4MWI1MTAwNTIsIDB4OWE1MzI5MTUsCi0JMHhkNjBmNTczZiwgMHhiYzliYzZlNCwgMHgyYjYwYTQ3NiwgMHg4MWU2NzQwMCwKLQkweDA4YmE2ZmI1LCAweDU3MWJlOTFmLCAweGYyOTZlYzZiLCAweDJhMGRkOTE1LAotCTB4YjY2MzY1MjEsIDB4ZTdiOWY5YjYsIDB4ZmYzNDA1MmUsIDB4YzU4NTU2NjQsCi0JMHg1M2IwMmQ1ZCwgMHhhOTlmOGZhMSwgMHgwOGJhNDc5OSwgMHg2ZTg1MDc2YSwKLQkweDRiN2E3MGU5LCAweGI1YjMyOTQ0LCAweGRiNzUwOTJlLCAweGM0MTkyNjIzLAotCTB4YWQ2ZWE2YjAsIDB4NDlhN2RmN2QsIDB4OWNlZTYwYjgsIDB4OGZlZGIyNjYsCi0JMHhlY2FhOGM3MSwgMHg2OTlhMTdmZiwgMHg1NjY0NTI2YywgMHhjMmIxOWVlMSwKLQkweDE5MzYwMmE1LCAweDc1MDk0YzI5LCAweGEwNTkxMzQwLCAweGU0MTgzYTNlLAotCTB4M2Y1NDk4OWEsIDB4NWI0MjlkNjUsIDB4NmI4ZmU0ZDYsIDB4OTlmNzNmZDYsCi0JMHhhMWQyOWMwNywgMHhlZmU4MzBmNSwgMHg0ZDJkMzhlNiwgMHhmMDI1NWRjMSwKLQkweDRjZGQyMDg2LCAweDg0NzBlYjI2LCAweDYzODJlOWM2LCAweDAyMWVjYzVlLAotCTB4MDk2ODZiM2YsIDB4M2ViYWVmYzksIDB4M2M5NzE4MTQsIDB4NmI2YTcwYTEsCi0JMHg2ODdmMzU4NCwgMHg1MmEwZTI4NiwgMHhiNzljNTMwNSwgMHhhYTUwMDczNywKLQkweDNlMDc4NDFjLCAweDdmZGVhZTVjLCAweDhlN2Q0NGVjLCAweDU3MTZmMmI4LAotCTB4YjAzYWRhMzcsIDB4ZjA1MDBjMGQsIDB4ZjAxYzFmMDQsIDB4MDIwMGIzZmYsCi0JMHhhZTBjZjUxYSwgMHgzY2I1NzRiMiwgMHgyNTgzN2E1OCwgMHhkYzA5MjFiZCwKLQkweGQxOTExM2Y5LCAweDdjYTkyZmY2LCAweDk0MzI0NzczLCAweDIyZjU0NzAxLAotCTB4M2FlNWU1ODEsIDB4MzdjMmRhZGMsIDB4YzhiNTc2MzQsIDB4OWFmM2RkYTcsCi0JMHhhOTQ0NjE0NiwgMHgwZmQwMDMwZSwgMHhlY2M4YzczZSwgMHhhNDc1MWU0MSwKLQkweGUyMzhjZDk5LCAweDNiZWEwZTJmLCAweDMyODBiYmExLCAweDE4M2ViMzMxLAotCTB4NGU1NDhiMzgsIDB4NGY2ZGI5MDgsIDB4NmY0MjBkMDMsIDB4ZjYwYTA0YmYsCi0JMHgyY2I4MTI5MCwgMHgyNDk3N2M3OSwgMHg1Njc5YjA3MiwgMHhiY2FmODlhZiwKLQkweGRlOWE3NzFmLCAweGQ5OTMwODEwLCAweGIzOGJhZTEyLCAweGRjY2YzZjJlLAotCTB4NTUxMjcyMWYsIDB4MmU2YjcxMjQsIDB4NTAxYWRkZTYsIDB4OWY4NGNkODcsCi0JMHg3YTU4NDcxOCwgMHg3NDA4ZGExNywgMHhiYzlmOWFiYywgMHhlOTRiN2Q4YywKLQkweGVjN2FlYzNhLCAweGRiODUxZGZhLCAweDYzMDk0MzY2LCAweGM0NjRjM2QyLAotCTB4ZWYxYzE4NDcsIDB4MzIxNWQ5MDgsIDB4ZGQ0MzNiMzcsIDB4MjRjMmJhMTYsCi0JMHgxMmExNGQ0MywgMHgyYTY1YzQ1MSwgMHg1MDk0MDAwMiwgMHgxMzNhZTRkZCwKLQkweDcxZGZmODllLCAweDEwMzE0ZTU1LCAweDgxYWM3N2Q2LCAweDVmMTExOTliLAotCTB4MDQzNTU2ZjEsIDB4ZDdhM2M3NmIsIDB4M2MxMTE4M2IsIDB4NTkyNGE1MDksCi0JMHhmMjhmZTZlZCwgMHg5N2YxZmJmYSwgMHg5ZWJhYmYyYywgMHgxZTE1M2M2ZSwKLQkweDg2ZTM0NTcwLCAweGVhZTk2ZmIxLCAweDg2MGU1ZTBhLCAweDVhM2UyYWIzLAotCTB4NzcxZmU3MWMsIDB4NGUzZDA2ZmEsIDB4Mjk2NWRjYjksIDB4OTllNzFkMGYsCi0JMHg4MDNlODlkNiwgMHg1MjY2YzgyNSwgMHgyZTRjYzk3OCwgMHg5YzEwYjM2YSwKLQkweGM2MTUwZWJhLCAweDk0ZTJlYTc4LCAweGE1ZmMzYzUzLCAweDFlMGEyZGY0LAotCTB4ZjJmNzRlYTcsIDB4MzYxZDJiM2QsIDB4MTkzOTI2MGYsIDB4MTljMjc5NjAsCi0JMHg1MjIzYTcwOCwgMHhmNzEzMTJiNiwgMHhlYmFkZmU2ZSwgMHhlYWMzMWY2NiwKLQkweGUzYmM0NTk1LCAweGE2N2JjODgzLCAweGIxN2YzN2QxLCAweDAxOGNmZjI4LAotCTB4YzMzMmRkZWYsIDB4YmU2YzVhYTUsIDB4NjU1ODIxODUsIDB4NjhhYjk4MDIsCi0JMHhlZWNlYTUwZiwgMHhkYjJmOTUzYiwgMHgyYWVmN2RhZCwgMHg1YjZlMmY4NCwKLQkweDE1MjFiNjI4LCAweDI5MDc2MTcwLCAweGVjZGQ0Nzc1LCAweDYxOWYxNTEwLAotCTB4MTNjY2E4MzAsIDB4ZWI2MWJkOTYsIDB4MDMzNGZlMWUsIDB4YWEwMzYzY2YsCi0JMHhiNTczNWM5MCwgMHg0YzcwYTIzOSwgMHhkNTllOWUwYiwgMHhjYmFhZGUxNCwKLQkweGVlY2M4NmJjLCAweDYwNjIyY2E3LCAweDljYWI1Y2FiLCAweGIyZjM4NDZlLAotCTB4NjQ4YjFlYWYsIDB4MTliZGYwY2EsIDB4YTAyMzY5YjksIDB4NjU1YWJiNTAsCi0JMHg0MDY4NWEzMiwgMHgzYzJhYjRiMywgMHgzMTllZTlkNSwgMHhjMDIxYjhmNywKLQkweDliNTQwYjE5LCAweDg3NWZhMDk5LCAweDk1Zjc5OTdlLCAweDYyM2Q3ZGE4LAotCTB4ZjgzNzg4OWEsIDB4OTdlMzJkNzcsIDB4MTFlZDkzNWYsIDB4MTY2ODEyODEsCi0JMHgwZTM1ODgyOSwgMHhjN2U2MWZkNiwgMHg5NmRlZGZhMSwgMHg3ODU4YmE5OSwKLQkweDU3ZjU4NGE1LCAweDFiMjI3MjYzLCAweDliODNjM2ZmLCAweDFhYzI0Njk2LAotCTB4Y2RiMzBhZWIsIDB4NTMyZTMwNTQsIDB4OGZkOTQ4ZTQsIDB4NmRiYzMxMjgsCi0JMHg1OGViZjJlZiwgMHgzNGM2ZmZlYSwgMHhmZTI4ZWQ2MSwgMHhlZTdjM2M3MywKLQkweDVkNGExNGQ5LCAweGU4NjRiN2UzLCAweDQyMTA1ZDE0LCAweDIwM2UxM2UwLAotCTB4NDVlZWUyYjYsIDB4YTNhYWFiZWEsIDB4ZGI2YzRmMTUsIDB4ZmFjYjRmZDAsCi0JMHhjNzQyZjQ0MiwgMHhlZjZhYmJiNSwgMHg2NTRmM2IxZCwgMHg0MWNkMjEwNSwKLQkweGQ4MWU3OTllLCAweDg2ODU0ZGM3LCAweGU0NGI0NzZhLCAweDNkODE2MjUwLAotCTB4Y2Y2MmExZjIsIDB4NWI4ZDI2NDYsIDB4ZmM4ODgzYTAsIDB4YzFjN2I2YTMsCi0JMHg3ZjE1MjRjMywgMHg2OWNiNzQ5MiwgMHg0Nzg0OGEwYiwgMHg1NjkyYjI4NSwKLQkweDA5NWJiZjAwLCAweGFkMTk0ODlkLCAweDE0NjJiMTc0LCAweDIzODIwZTAwLAotCTB4NTg0MjhkMmEsIDB4MGM1NWY1ZWEsIDB4MWRhZGY0M2UsIDB4MjMzZjcwNjEsCi0JMHgzMzcyZjA5MiwgMHg4ZDkzN2U0MSwgMHhkNjVmZWNmMSwgMHg2YzIyM2JkYiwKLQkweDdjZGUzNzU5LCAweGNiZWU3NDYwLCAweDQwODVmMmE3LCAweGNlNzczMjZlLAotCTB4YTYwNzgwODQsIDB4MTlmODUwOWUsIDB4ZThlZmQ4NTUsIDB4NjFkOTk3MzUsCi0JMHhhOTY5YTdhYSwgMHhjNTBjMDZjMiwgMHg1YTA0YWJmYywgMHg4MDBiY2FkYywKLQkweDllNDQ3YTJlLCAweGMzNDUzNDg0LCAweGZkZDU2NzA1LCAweDBlMWU5ZWM5LAotCTB4ZGI3M2RiZDMsIDB4MTA1NTg4Y2QsIDB4Njc1ZmRhNzksIDB4ZTM2NzQzNDAsCi0JMHhjNWM0MzQ2NSwgMHg3MTNlMzhkOCwgMHgzZDI4Zjg5ZSwgMHhmMTZkZmYyMCwKLQkweDE1M2UyMWU3LCAweDhmYjAzZDRhLCAweGU2ZTM5ZjJiLCAweGRiODNhZGY3LAotCTB4ZTkzZDVhNjgsIDB4OTQ4MTQwZjcsIDB4ZjY0YzI2MWMsIDB4OTQ2OTI5MzQsCi0JMHg0MTE1MjBmNywgMHg3NjAyZDRmNywgMHhiY2Y0NmIyZSwgMHhkNGEyMDA2OCwKLQkweGQ0MDgyNDcxLCAweDMzMjBmNDZhLCAweDQzYjdkNGI3LCAweDUwMDA2MWFmLAotCTB4MWUzOWY2MmUsIDB4OTcyNDQ1NDYsIDB4MTQyMTRmNzQsIDB4YmY4Yjg4NDAsCi0JMHg0ZDk1ZmMxZCwgMHg5NmI1OTFhZiwgMHg3MGY0ZGRkMywgMHg2NmEwMmY0NSwKLQkweGJmYmMwOWVjLCAweDAzYmQ5Nzg1LCAweDdmYWM2ZGQwLCAweDMxY2I4NTA0LAotCTB4OTZlYjI3YjMsIDB4NTVmZDM5NDEsIDB4ZGEyNTQ3ZTYsIDB4YWJjYTBhOWEsCi0JMHgyODUwNzgyNSwgMHg1MzA0MjlmNCwgMHgwYTJjODZkYSwgMHhlOWI2NmRmYiwKLQkweDY4ZGMxNDYyLCAweGQ3NDg2OTAwLCAweDY4MGVjMGE0LCAweDI3YTE4ZGVlLAotCTB4NGYzZmZlYTIsIDB4ZTg4N2FkOGMsIDB4YjU4Y2UwMDYsIDB4N2FmNGQ2YjYsCi0JMHhhYWNlMWU3YywgMHhkMzM3NWZlYywgMHhjZTc4YTM5OSwgMHg0MDZiMmE0MiwKLQkweDIwZmU5ZTM1LCAweGQ5ZjM4NWI5LCAweGVlMzlkN2FiLCAweDNiMTI0ZThiLAotCTB4MWRjOWZhZjcsIDB4NGI2ZDE4NTYsIDB4MjZhMzY2MzEsIDB4ZWFlMzk3YjIsCi0JMHgzYTZlZmE3NCwgMHhkZDViNDMzMiwgMHg2ODQxZTdmNywgMHhjYTc4MjBmYiwKLQkweGZiMGFmNTRlLCAweGQ4ZmViMzk3LCAweDQ1NDA1NmFjLCAweGJhNDg5NTI3LAotCTB4NTU1MzNhM2EsIDB4MjA4MzhkODcsIDB4ZmU2YmE5YjcsIDB4ZDA5Njk1NGIsCi0JMHg1NWE4NjdiYywgMHhhMTE1OWE1OCwgMHhjY2E5Mjk2MywgMHg5OWUxZGIzMywKLQkweGE2MmE0YTU2LCAweDNmMzEyNWY5LCAweDVlZjQ3ZTFjLCAweDkwMjkzMTdjLAotCTB4ZmRmOGU4MDIsIDB4MDQyNzJmNzAsIDB4ODBiYjE1NWMsIDB4MDUyODJjZTMsCi0JMHg5NWMxMTU0OCwgMHhlNGM2NmQyMiwgMHg0OGMxMTMzZiwgMHhjNzBmODZkYywKLQkweDA3ZjljOWVlLCAweDQxMDQxZjBmLCAweDQwNDc3OWE0LCAweDVkODg2ZTE3LAotCTB4MzI1ZjUxZWIsIDB4ZDU5YmMwZDEsIDB4ZjJiY2MxOGYsIDB4NDExMTM1NjQsCi0JMHgyNTdiNzgzNCwgMHg2MDJhOWM2MCwgMHhkZmY4ZThhMywgMHgxZjYzNmMxYiwKLQkweDBlMTJiNGMyLCAweDAyZTEzMjllLCAweGFmNjY0ZmQxLCAweGNhZDE4MTE1LAotCTB4NmIyMzk1ZTAsIDB4MzMzZTkyZTEsIDB4M2IyNDBiNjIsIDB4ZWViZWI5MjIsCi0JMHg4NWIyYTIwZSwgMHhlNmJhMGQ5OSwgMHhkZTcyMGM4YywgMHgyZGEyZjcyOCwKLQkweGQwMTI3ODQ1LCAweDk1Yjc5NGZkLCAweDY0N2QwODYyLCAweGU3Y2NmNWYwLAotCTB4NTQ0OWEzNmYsIDB4ODc3ZDQ4ZmEsIDB4YzM5ZGZkMjcsIDB4ZjMzZThkMWUsCi0JMHgwYTQ3NjM0MSwgMHg5OTJlZmY3NCwgMHgzYTZmNmVhYiwgMHhmNGY4ZmQzNywKLQkweGE4MTJkYzYwLCAweGExZWJkZGY4LCAweDk5MWJlMTRjLCAweGRiNmU2YjBkLAotCTB4YzY3YjU1MTAsIDB4NmQ2NzJjMzcsIDB4Mjc2NWQ0M2IsIDB4ZGNkMGU4MDQsCi0JMHhmMTI5MGRjNywgMHhjYzAwZmZhMywgMHhiNTM5MGY5MiwgMHg2OTBmZWQwYiwKLQkweDY2N2I5ZmZiLCAweGNlZGI3ZDljLCAweGEwOTFjZjBiLCAweGQ5MTU1ZWEzLAotCTB4YmIxMzJmODgsIDB4NTE1YmFkMjQsIDB4N2I5NDc5YmYsIDB4NzYzYmQ2ZWIsCi0JMHgzNzM5MmViMywgMHhjYzExNTk3OSwgMHg4MDI2ZTI5NywgMHhmNDJlMzEyZCwKLQkweDY4NDJhZGE3LCAweGM2NmEyYjNiLCAweDEyNzU0Y2NjLCAweDc4MmVmMTFjLAotCTB4NmExMjQyMzcsIDB4Yjc5MjUxZTcsIDB4MDZhMWJiZTYsIDB4NGJmYjYzNTAsCi0JMHgxYTZiMTAxOCwgMHgxMWNhZWRmYSwgMHgzZDI1YmRkOCwgMHhlMmUxYzNjOSwKLQkweDQ0NDIxNjU5LCAweDBhMTIxMzg2LCAweGQ5MGNlYzZlLCAweGQ1YWJlYTJhLAotCTB4NjRhZjY3NGUsIDB4ZGE4NmE4NWYsIDB4YmViZmU5ODgsIDB4NjRlNGMzZmUsCi0JMHg5ZGJjODA1NywgMHhmMGY3YzA4NiwgMHg2MDc4N2JmOCwgMHg2MDAzNjA0ZCwKLQkweGQxZmQ4MzQ2LCAweGY2MzgxZmIwLCAweDc3NDVhZTA0LCAweGQ3MzZmY2NjLAotCTB4ODM0MjZiMzMsIDB4ZjAxZWFiNzEsIDB4YjA4MDQxODcsIDB4M2MwMDVlNWYsCi0JMHg3N2EwNTdiZSwgMHhiZGU4YWUyNCwgMHg1NTQ2NDI5OSwgMHhiZjU4MmU2MSwKLQkweDRlNThmNDhmLCAweGYyZGRmZGEyLCAweGY0NzRlZjM4LCAweDg3ODliZGMyLAotCTB4NTM2NmY5YzMsIDB4YzhiMzhlNzQsIDB4YjQ3NWYyNTUsIDB4NDZmY2Q5YjksCi0JMHg3YWViMjY2MSwgMHg4YjFkZGY4NCwgMHg4NDZhMGU3OSwgMHg5MTVmOTVlMiwKLQkweDQ2NmU1OThlLCAweDIwYjQ1NzcwLCAweDhjZDU1NTkxLCAweGM5MDJkZTRjLAotCTB4YjkwYmFjZTEsIDB4YmI4MjA1ZDAsIDB4MTFhODYyNDgsIDB4NzU3NGE5OWUsCi0JMHhiNzdmMTliNiwgMHhlMGE5ZGMwOSwgMHg2NjJkMDlhMSwgMHhjNDMyNDYzMywKLQkweGU4NWExZjAyLCAweDA5ZjBiZThjLCAweDRhOTlhMDI1LCAweDFkNmVmZTEwLAotCTB4MWFiOTNkMWQsIDB4MGJhNWE0ZGYsIDB4YTE4NmYyMGYsIDB4Mjg2OGYxNjksCi0JMHhkY2I3ZGE4MywgMHg1NzM5MDZmZSwgMHhhMWUyY2U5YiwgMHg0ZmNkN2Y1MiwKLQkweDUwMTE1ZTAxLCAweGE3MDY4M2ZhLCAweGEwMDJiNWM0LCAweDBkZTZkMDI3LAotCTB4OWFmODhjMjcsIDB4NzczZjg2NDEsIDB4YzM2MDRjMDYsIDB4NjFhODA2YjUsCi0JMHhmMDE3N2EyOCwgMHhjMGY1ODZlMCwgMHgwMDYwNThhYSwgMHgzMGRjN2Q2MiwKLQkweDExZTY5ZWQ3LCAweDIzMzhlYTYzLCAweDUzYzJkZDk0LCAweGMyYzIxNjM0LAotCTB4YmJjYmVlNTYsIDB4OTBiY2I2ZGUsIDB4ZWJmYzdkYTEsIDB4Y2U1OTFkNzYsCi0JMHg2ZjA1ZTQwOSwgMHg0YjdjMDE4OCwgMHgzOTcyMGEzZCwgMHg3YzkyN2MyNCwKLQkweDg2ZTM3MjVmLCAweDcyNGQ5ZGI5LCAweDFhYzE1YmI0LCAweGQzOWViOGZjLAotCTB4ZWQ1NDU1NzgsIDB4MDhmY2E1YjUsIDB4ZDgzZDdjZDMsIDB4NGRhZDBmYzQsCi0JMHgxZTUwZWY1ZSwgMHhiMTYxZTZmOCwgMHhhMjg1MTRkOSwgMHg2YzUxMTMzYywKLQkweDZmZDVjN2U3LCAweDU2ZTE0ZWM0LCAweDM2MmFiZmNlLCAweGRkYzZjODM3LAotCTB4ZDc5YTMyMzQsIDB4OTI2MzgyMTIsIDB4NjcwZWZhOGUsIDB4NDA2MDAwZTAsCi0JMHgzYTM5Y2UzNywgMHhkM2ZhZjVjZiwgMHhhYmMyNzczNywgMHg1YWM1MmQxYiwKLQkweDVjYjA2NzllLCAweDRmYTMzNzQyLCAweGQzODIyNzQwLCAweDk5YmM5YmJlLAotCTB4ZDUxMThlOWQsIDB4YmYwZjczMTUsIDB4ZDYyZDFjN2UsIDB4YzcwMGM0N2IsCi0JMHhiNzhjMWI2YiwgMHgyMWExOTA0NSwgMHhiMjZlYjFiZSwgMHg2YTM2NmViNCwKLQkweDU3NDhhYjJmLCAweGJjOTQ2ZTc5LCAweGM2YTM3NmQyLCAweDY1NDljMmM4LAotCTB4NTMwZmY4ZWUsIDB4NDY4ZGRlN2QsIDB4ZDU3MzBhMWQsIDB4NGNkMDRkYzYsCi0JMHgyOTM5YmJkYiwgMHhhOWJhNDY1MCwgMHhhYzk1MjZlOCwgMHhiZTVlZTMwNCwKLQkweGExZmFkNWYwLCAweDZhMmQ1MTlhLCAweDYzZWY4Y2UyLCAweDlhODZlZTIyLAotCTB4YzA4OWMyYjgsIDB4NDMyNDJlZjYsIDB4YTUxZTAzYWEsIDB4OWNmMmQwYTQsCi0JMHg4M2MwNjFiYSwgMHg5YmU5NmE0ZCwgMHg4ZmU1MTU1MCwgMHhiYTY0NWJkNiwKLQkweDI4MjZhMmY5LCAweGE3M2EzYWUxLCAweDRiYTk5NTg2LCAweGVmNTU2MmU5LAotCTB4YzcyZmVmZDMsIDB4Zjc1MmY3ZGEsIDB4M2YwNDZmNjksIDB4NzdmYTBhNTksCi0JMHg4MGU0YTkxNSwgMHg4N2IwODYwMSwgMHg5YjA5ZTZhZCwgMHgzYjNlZTU5MywKLQkweGU5OTBmZDVhLCAweDllMzRkNzk3LCAweDJjZjBiN2Q5LCAweDAyMmI4YjUxLAotCTB4OTZkNWFjM2EsIDB4MDE3ZGE2N2QsIDB4ZDFjZjNlZDYsIDB4N2M3ZDJkMjgsCi0JMHgxZjlmMjVjZiwgMHhhZGYyYjg5YiwgMHg1YWQ2YjQ3MiwgMHg1YTg4ZjU0YywKLQkweGUwMjlhYzcxLCAweGUwMTlhNWU2LCAweDQ3YjBhY2ZkLCAweGVkOTNmYTliLAotCTB4ZThkM2M0OGQsIDB4MjgzYjU3Y2MsIDB4ZjhkNTY2MjksIDB4NzkxMzJlMjgsCi0JMHg3ODVmMDE5MSwgMHhlZDc1NjA1NSwgMHhmNzk2MGU0NCwgMHhlM2QzNWU4YywKLQkweDE1MDU2ZGQ0LCAweDg4ZjQ2ZGJhLCAweDAzYTE2MTI1LCAweDA1NjRmMGJkLAotCTB4YzNlYjllMTUsIDB4M2M5MDU3YTIsIDB4OTcyNzFhZWMsIDB4YTkzYTA3MmEsCi0JMHgxYjNmNmQ5YiwgMHgxZTYzMjFmNSwgMHhmNTljNjZmYiwgMHgyNmRjZjMxOSwKLQkweDc1MzNkOTI4LCAweGIxNTVmZGY1LCAweDAzNTYzNDgyLCAweDhhYmEzY2JiLAotCTB4Mjg1MTc3MTEsIDB4YzIwYWQ5ZjgsIDB4YWJjYzUxNjcsIDB4Y2NhZDkyNWYsCi0JMHg0ZGU4MTc1MSwgMHgzODMwZGM4ZSwgMHgzNzlkNTg2MiwgMHg5MzIwZjk5MSwKLQkweGVhN2E5MGMyLCAweGZiM2U3YmNlLCAweDUxMjFjZTY0LCAweDc3NGZiZTMyLAotCTB4YThiNmUzN2UsIDB4YzMyOTNkNDYsIDB4NDhkZTUzNjksIDB4NjQxM2U2ODAsCi0JMHhhMmFlMDgxMCwgMHhkZDZkYjIyNCwgMHg2OTg1MmRmZCwgMHgwOTA3MjE2NiwKLQkweGIzOWE0NjBhLCAweDY0NDVjMGRkLCAweDU4NmNkZWNmLCAweDFjMjBjOGFlLAotCTB4NWJiZWY3ZGQsIDB4MWI1ODhkNDAsIDB4Y2NkMjAxN2YsIDB4NmJiNGUzYmIsCi0JMHhkZGEyNmE3ZSwgMHgzYTU5ZmY0NSwgMHgzZTM1MGE0NCwgMHhiY2I0Y2RkNSwKLQkweDcyZWFjZWE4LCAweGZhNjQ4NGJiLCAweDhkNjYxMmFlLCAweGJmM2M2ZjQ3LAotCTB4ZDI5YmU0NjMsIDB4NTQyZjVkOWUsIDB4YWVjMjc3MWIsIDB4ZjY0ZTYzNzAsCi0JMHg3NDBlMGQ4ZCwgMHhlNzViMTM1NywgMHhmODcyMTY3MSwgMHhhZjUzN2Q1ZCwKLQkweDQwNDBjYjA4LCAweDRlYjRlMmNjLCAweDM0ZDI0NjZhLCAweDAxMTVhZjg0LAotCTB4ZTFiMDA0MjgsIDB4OTU5ODNhMWQsIDB4MDZiODlmYjQsIDB4Y2U2ZWEwNDgsCi0JMHg2ZjNmM2I4MiwgMHgzNTIwYWI4MiwgMHgwMTFhMWQ0YiwgMHgyNzcyMjdmOCwKLQkweDYxMTU2MGIxLCAweGU3OTMzZmRjLCAweGJiM2E3OTJiLCAweDM0NDUyNWJkLAotCTB4YTA4ODM5ZTEsIDB4NTFjZTc5NGIsIDB4MmYzMmM5YjcsIDB4YTAxZmJhYzksCi0JMHhlMDFjYzg3ZSwgMHhiY2M3ZDFmNiwgMHhjZjAxMTFjMywgMHhhMWU4YWFjNywKLQkweDFhOTA4NzQ5LCAweGQ0NGZiZDlhLCAweGQwZGFkZWNiLCAweGQ1MGFkYTM4LAotCTB4MDMzOWMzMmEsIDB4YzY5MTM2NjcsIDB4OGRmOTMxN2MsIDB4ZTBiMTJiNGYsCi0JMHhmNzllNTliNywgMHg0M2Y1YmIzYSwgMHhmMmQ1MTlmZiwgMHgyN2Q5NDU5YywKLQkweGJmOTcyMjJjLCAweDE1ZTZmYzJhLCAweDBmOTFmYzcxLCAweDliOTQxNTI1LAotCTB4ZmFlNTkzNjEsIDB4Y2ViNjljZWIsIDB4YzJhODY0NTksIDB4MTJiYWE4ZDEsCi0JMHhiNmMxMDc1ZSwgMHhlMzA1NmEwYywgMHgxMGQyNTA2NSwgMHhjYjAzYTQ0MiwKLQkweGUwZWM2ZTBlLCAweDE2OThkYjNiLCAweDRjOThhMGJlLCAweDMyNzhlOTY0LAotCTB4OWYxZjk1MzIsIDB4ZTBkMzkyZGYsIDB4ZDNhMDM0MmIsIDB4ODk3MWYyMWUsCi0JMHgxYjBhNzQ0MSwgMHg0YmEzMzQ4YywgMHhjNWJlNzEyMCwgMHhjMzc2MzJkOCwKLQkweGRmMzU5ZjhkLCAweDliOTkyZjJlLCAweGU2MGI2ZjQ3LCAweDBmZTNmMTFkLAotCTB4ZTU0Y2RhNTQsIDB4MWVkYWQ4OTEsIDB4Y2U2Mjc5Y2YsIDB4Y2QzZTdlNmYsCi0JMHgxNjE4YjE2NiwgMHhmZDJjMWQwNSwgMHg4NDhmZDJjNSwgMHhmNmZiMjI5OSwKLQkweGY1MjNmMzU3LCAweGE2MzI3NjIzLCAweDkzYTgzNTMxLCAweDU2Y2NjZDAyLAotCTB4YWNmMDgxNjIsIDB4NWE3NWViYjUsIDB4NmUxNjM2OTcsIDB4ODhkMjczY2MsCi0JMHhkZTk2NjI5MiwgMHg4MWI5NDlkMCwgMHg0YzUwOTAxYiwgMHg3MWM2NTYxNCwKLQkweGU2YzZjN2JkLCAweDMyN2ExNDBhLCAweDQ1ZTFkMDA2LCAweGMzZjI3YjlhLAotCTB4YzlhYTUzZmQsIDB4NjJhODBmMDAsIDB4YmIyNWJmZTIsIDB4MzViZGQyZjYsCi0JMHg3MTEyNjkwNSwgMHhiMjA0MDIyMiwgMHhiNmNiY2Y3YywgMHhjZDc2OWMyYiwKLQkweDUzMTEzZWMwLCAweDE2NDBlM2QzLCAweDM4YWJiZDYwLCAweDI1NDdhZGYwLAotCTB4YmEzODIwOWMsIDB4Zjc0NmNlNzYsIDB4NzdhZmExYzUsIDB4MjA3NTYwNjAsCi0JMHg4NWNiZmU0ZSwgMHg4YWU4OGRkOCwgMHg3YWFhZjliMCwgMHg0Y2Y5YWE3ZSwKLQkweDE5NDhjMjVjLCAweDAyZmI4YThjLCAweDAxYzM2YWU0LCAweGQ2ZWJlMWY5LAotCTB4OTBkNGY4NjksIDB4YTY1Y2RlYTAsIDB4M2YwOTI1MmQsIDB4YzIwOGU2OWYsCi0JMHhiNzRlNjEzMiwgMHhjZTc3ZTI1YiwgMHg1NzhmZGZlMywgMHgzYWMzNzJlNiwKLX07Ci0KLS8qCi0gKiBSb3VuZCBsb29wIHVucm9sbGluZyBtYWNyb3MsIFMgaXMgYSBwb2ludGVyIHRvIGEgUy1Cb3ggYXJyYXkKLSAqIG9yZ2FuaXplZCBpbiA0IHVuc2lnbmVkIGxvbmdzIGF0IGEgcm93LgotICovCi0jZGVmaW5lIEdFVDMyXzMoeCkgKCgoeCkgJiAweGZmKSkKLSNkZWZpbmUgR0VUMzJfMih4KSAoKCh4KSA+PiAoOCkpICYgKDB4ZmYpKQotI2RlZmluZSBHRVQzMl8xKHgpICgoKHgpID4+ICgxNikpICYgKDB4ZmYpKQotI2RlZmluZSBHRVQzMl8wKHgpICgoKHgpID4+ICgyNCkpICYgKDB4ZmYpKQotCi0jZGVmaW5lIGJmX0YoeCkgKCgoU1tHRVQzMl8wKHgpXSArIFNbMjU2ICsgR0VUMzJfMSh4KV0pIF4gXAotICAgICAgICAgIFNbNTEyICsgR0VUMzJfMih4KV0pICsgU1s3NjggKyBHRVQzMl8zKHgpXSkKLQotI2RlZmluZSBST1VORChhLCBiLCBuKSAgYiBePSBQW25dOyBhIF49IGJmX0YgKGIpCi0KLS8qCi0gKiBUaGUgYmxvd2Zpc2ggZW5jaXBoZXIsIHByb2Nlc3NlcyA2NC1iaXQgYmxvY2tzLgotICogTk9URTogVGhpcyBmdW5jdGlvbiBNVVNUTidUIHJlc3BlY3QgZW5kaWFuZXNzCi0gKi8KLXN0YXRpYyB2b2lkIGVuY3J5cHRfYmxvY2soc3RydWN0IGJmX2N0eCAqYmN0eCwgdTMyICpkc3QsIHUzMiAqc3JjKQotewotCWNvbnN0IHUzMiAqUCA9IGJjdHgtPnA7Ci0JY29uc3QgdTMyICpTID0gYmN0eC0+czsKLQl1MzIgeWwgPSBzcmNbMF07Ci0JdTMyIHlyID0gc3JjWzFdOwotCi0JUk9VTkQoeXIsIHlsLCAwKTsKLQlST1VORCh5bCwgeXIsIDEpOwotCVJPVU5EKHlyLCB5bCwgMik7Ci0JUk9VTkQoeWwsIHlyLCAzKTsKLQlST1VORCh5ciwgeWwsIDQpOwotCVJPVU5EKHlsLCB5ciwgNSk7Ci0JUk9VTkQoeXIsIHlsLCA2KTsKLQlST1VORCh5bCwgeXIsIDcpOwotCVJPVU5EKHlyLCB5bCwgOCk7Ci0JUk9VTkQoeWwsIHlyLCA5KTsKLQlST1VORCh5ciwgeWwsIDEwKTsKLQlST1VORCh5bCwgeXIsIDExKTsKLQlST1VORCh5ciwgeWwsIDEyKTsKLQlST1VORCh5bCwgeXIsIDEzKTsKLQlST1VORCh5ciwgeWwsIDE0KTsKLQlST1VORCh5bCwgeXIsIDE1KTsKLQotCXlsIF49IFBbMTZdOwotCXlyIF49IFBbMTddOwotCi0JZHN0WzBdID0geXI7Ci0JZHN0WzFdID0geWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKLXsKLQljb25zdCBfX2JlMzIgKmluX2JsayA9IChjb25zdCBfX2JlMzIgKilzcmM7Ci0JX19iZTMyICpjb25zdCBvdXRfYmxrID0gKF9fYmUzMiAqKWRzdDsKLQl1MzIgaW4zMlsyXSwgb3V0MzJbMl07Ci0KLQlpbjMyWzBdID0gYmUzMl90b19jcHUoaW5fYmxrWzBdKTsKLQlpbjMyWzFdID0gYmUzMl90b19jcHUoaW5fYmxrWzFdKTsKLQllbmNyeXB0X2Jsb2NrKGNyeXB0b190Zm1fY3R4KHRmbSksIG91dDMyLCBpbjMyKTsKLQlvdXRfYmxrWzBdID0gY3B1X3RvX2JlMzIob3V0MzJbMF0pOwotCW91dF9ibGtbMV0gPSBjcHVfdG9fYmUzMihvdXQzMlsxXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKLXsKLQlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCWNvbnN0IF9fYmUzMiAqaW5fYmxrID0gKGNvbnN0IF9fYmUzMiAqKXNyYzsKLQlfX2JlMzIgKmNvbnN0IG91dF9ibGsgPSAoX19iZTMyICopZHN0OwotCWNvbnN0IHUzMiAqUCA9IGN0eC0+cDsKLQljb25zdCB1MzIgKlMgPSBjdHgtPnM7Ci0JdTMyIHlsID0gYmUzMl90b19jcHUoaW5fYmxrWzBdKTsKLQl1MzIgeXIgPSBiZTMyX3RvX2NwdShpbl9ibGtbMV0pOwotCi0JUk9VTkQoeXIsIHlsLCAxNyk7Ci0JUk9VTkQoeWwsIHlyLCAxNik7Ci0JUk9VTkQoeXIsIHlsLCAxNSk7Ci0JUk9VTkQoeWwsIHlyLCAxNCk7Ci0JUk9VTkQoeXIsIHlsLCAxMyk7Ci0JUk9VTkQoeWwsIHlyLCAxMik7Ci0JUk9VTkQoeXIsIHlsLCAxMSk7Ci0JUk9VTkQoeWwsIHlyLCAxMCk7Ci0JUk9VTkQoeXIsIHlsLCA5KTsKLQlST1VORCh5bCwgeXIsIDgpOwotCVJPVU5EKHlyLCB5bCwgNyk7Ci0JUk9VTkQoeWwsIHlyLCA2KTsKLQlST1VORCh5ciwgeWwsIDUpOwotCVJPVU5EKHlsLCB5ciwgNCk7Ci0JUk9VTkQoeXIsIHlsLCAzKTsKLQlST1VORCh5bCwgeXIsIDIpOwotCi0JeWwgXj0gUFsxXTsKLQl5ciBePSBQWzBdOwotCi0Jb3V0X2Jsa1swXSA9IGNwdV90b19iZTMyKHlyKTsKLQlvdXRfYmxrWzFdID0gY3B1X3RvX2JlMzIoeWwpOwotfQotCi0vKgotICogQ2FsY3VsYXRlcyB0aGUgYmxvd2Zpc2ggUyBhbmQgUCBib3hlcyBmb3IgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbi4KLSAqLwotc3RhdGljIGludCBiZl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKLXsKLQlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCXUzMiAqUCA9IGN0eC0+cDsKLQl1MzIgKlMgPSBjdHgtPnM7Ci0Jc2hvcnQgaSwgaiwgY291bnQ7Ci0JdTMyIGRhdGFbMl0sIHRlbXA7Ci0KLQkvKiBDb3B5IHRoZSBpbml0aWFsaXphdGlvbiBzLWJveGVzICovCi0JZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgMjU2OyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyssIGNvdW50KyspCi0JCQlTW2NvdW50XSA9IGJmX3Nib3hbY291bnRdOwotCi0JLyogU2V0IHRoZSBwLWJveGVzICovCi0JZm9yIChpID0gMDsgaSA8IDE2ICsgMjsgaSsrKQotCQlQW2ldID0gYmZfcGJveFtpXTsKLQotCS8qIEFjdHVhbCBzdWJrZXkgZ2VuZXJhdGlvbiAqLwotCWZvciAoaiA9IDAsIGkgPSAwOyBpIDwgMTYgKyAyOyBpKyspIHsKLQkJdGVtcCA9ICgoKHUzMilrZXlbal0gPDwgMjQpIHwKLQkJCSgodTMyKWtleVsoaiArIDEpICUga2V5bGVuXSA8PCAxNikgfAotCQkJKCh1MzIpa2V5WyhqICsgMikgJSBrZXlsZW5dIDw8IDgpIHwKLQkJCSgodTMyKWtleVsoaiArIDMpICUga2V5bGVuXSkpOwotCi0JCVBbaV0gPSBQW2ldIF4gdGVtcDsKLQkJaiA9IChqICsgNCkgJSBrZXlsZW47Ci0JfQotCi0JZGF0YVswXSA9IDB4MDAwMDAwMDA7Ci0JZGF0YVsxXSA9IDB4MDAwMDAwMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTYgKyAyOyBpICs9IDIpIHsKLQkJZW5jcnlwdF9ibG9jaygoc3RydWN0IGJmX2N0eCAqKWN0eCwgZGF0YSwgZGF0YSk7Ci0KLQkJUFtpXSA9IGRhdGFbMF07Ci0JCVBbaSArIDFdID0gZGF0YVsxXTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWZvciAoaiA9IDAsIGNvdW50ID0gaSAqIDI1NjsgaiA8IDI1NjsgaiArPSAyLCBjb3VudCArPSAyKSB7Ci0JCQllbmNyeXB0X2Jsb2NrKChzdHJ1Y3QgYmZfY3R4ICopY3R4LCBkYXRhLCBkYXRhKTsKLQotCQkJU1tjb3VudF0gPSBkYXRhWzBdOwotCQkJU1tjb3VudCArIDFdID0gZGF0YVsxXTsKLQkJfQotCX0KLQotCS8qIEJydWNlIHNheXMgbm90IHRvIGJvdGhlciB3aXRoIHRoZSB3ZWFrIGtleSBjaGVjay4gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFsZyA9IHsKLQkuY3JhX25hbWUJCT0JImJsb3dmaXNoIiwKLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCi0JLmNyYV9ibG9ja3NpemUJCT0JQkZfQkxPQ0tfU0laRSwKLQkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBiZl9jdHgpLAotCS5jcmFfYWxpZ25tYXNrCQk9CTMsCi0JLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCi0JLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCi0JLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7Ci0JLmNpYV9taW5fa2V5c2l6ZQk9CUJGX01JTl9LRVlfU0laRSwKLQkuY2lhX21heF9rZXlzaXplCT0JQkZfTUFYX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5ICAgCQk9IAliZl9zZXRrZXksCi0JLmNpYV9lbmNyeXB0IAkJPQliZl9lbmNyeXB0LAotCS5jaWFfZGVjcnlwdCAgCQk9CWJmX2RlY3J5cHQgfSB9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBibG93ZmlzaF9tb2RfaW5pdCh2b2lkKQotewotCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhbGcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYmxvd2Zpc2hfbW9kX2Zpbmkodm9pZCkKLXsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFsZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGJsb3dmaXNoX21vZF9pbml0KTsKLW1vZHVsZV9leGl0KGJsb3dmaXNoX21vZF9maW5pKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYmxvd2Zpc2hfY29tbW9uLmMgYi9jcnlwdG8vYmxvd2Zpc2hfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzNmFhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYmxvd2Zpc2hfY29tbW9uLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb21tb24gQmxvd2Zpc2ggYWxnb3JpdGhtIHBhcnRzIHNoYXJlZCBiZXR3ZWVuIHRoZSBjIGFuZCBhc3NlbWJsZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtLCBieSBCcnVjZSBTY2huZWllci4KKyAqIGh0dHA6Ly93d3cuY291bnRlcnBhbmUuY29tL2Jsb3dmaXNoLmh0bWwKKyAqCisgKiBBZGFwdGVkIGZyb20gS2VybmVsaSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgorICogQ29weXJpZ2h0IChjKSBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYmxvd2Zpc2guaD4KKworc3RhdGljIGNvbnN0IHUzMiBiZl9wYm94WzE2ICsgMl0gPSB7CisJMHgyNDNmNmE4OCwgMHg4NWEzMDhkMywgMHgxMzE5OGEyZSwgMHgwMzcwNzM0NCwKKwkweGE0MDkzODIyLCAweDI5OWYzMWQwLCAweDA4MmVmYTk4LCAweGVjNGU2Yzg5LAorCTB4NDUyODIxZTYsIDB4MzhkMDEzNzcsIDB4YmU1NDY2Y2YsIDB4MzRlOTBjNmMsCisJMHhjMGFjMjliNywgMHhjOTdjNTBkZCwgMHgzZjg0ZDViNSwgMHhiNTQ3MDkxNywKKwkweDkyMTZkNWQ5LCAweDg5NzlmYjFiLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBiZl9zYm94WzI1NiAqIDRdID0geworCTB4ZDEzMTBiYTYsIDB4OThkZmI1YWMsIDB4MmZmZDcyZGIsIDB4ZDAxYWRmYjcsCisJMHhiOGUxYWZlZCwgMHg2YTI2N2U5NiwgMHhiYTdjOTA0NSwgMHhmMTJjN2Y5OSwKKwkweDI0YTE5OTQ3LCAweGIzOTE2Y2Y3LCAweDA4MDFmMmUyLCAweDg1OGVmYzE2LAorCTB4NjM2OTIwZDgsIDB4NzE1NzRlNjksIDB4YTQ1OGZlYTMsIDB4ZjQ5MzNkN2UsCisJMHgwZDk1NzQ4ZiwgMHg3MjhlYjY1OCwgMHg3MThiY2Q1OCwgMHg4MjE1NGFlZSwKKwkweDdiNTRhNDFkLCAweGMyNWE1OWI1LCAweDljMzBkNTM5LCAweDJhZjI2MDEzLAorCTB4YzVkMWIwMjMsIDB4Mjg2MDg1ZjAsIDB4Y2E0MTc5MTgsIDB4YjhkYjM4ZWYsCisJMHg4ZTc5ZGNiMCwgMHg2MDNhMTgwZSwgMHg2YzllMGU4YiwgMHhiMDFlOGEzZSwKKwkweGQ3MTU3N2MxLCAweGJkMzE0YjI3LCAweDc4YWYyZmRhLCAweDU1NjA1YzYwLAorCTB4ZTY1NTI1ZjMsIDB4YWE1NWFiOTQsIDB4NTc0ODk4NjIsIDB4NjNlODE0NDAsCisJMHg1NWNhMzk2YSwgMHgyYWFiMTBiNiwgMHhiNGNjNWMzNCwgMHgxMTQxZThjZSwKKwkweGExNTQ4NmFmLCAweDdjNzJlOTkzLCAweGIzZWUxNDExLCAweDYzNmZiYzJhLAorCTB4MmJhOWM1NWQsIDB4NzQxODMxZjYsIDB4Y2U1YzNlMTYsIDB4OWI4NzkzMWUsCisJMHhhZmQ2YmEzMywgMHg2YzI0Y2Y1YywgMHg3YTMyNTM4MSwgMHgyODk1ODY3NywKKwkweDNiOGY0ODk4LCAweDZiNGJiOWFmLCAweGM0YmZlODFiLCAweDY2MjgyMTkzLAorCTB4NjFkODA5Y2MsIDB4ZmIyMWE5OTEsIDB4NDg3Y2FjNjAsIDB4NWRlYzgwMzIsCisJMHhlZjg0NWQ1ZCwgMHhlOTg1NzViMSwgMHhkYzI2MjMwMiwgMHhlYjY1MWI4OCwKKwkweDIzODkzZTgxLCAweGQzOTZhY2M1LCAweDBmNmQ2ZmYzLCAweDgzZjQ0MjM5LAorCTB4MmUwYjQ0ODIsIDB4YTQ4NDIwMDQsIDB4NjljOGYwNGEsIDB4OWUxZjliNWUsCisJMHgyMWM2Njg0MiwgMHhmNmU5NmM5YSwgMHg2NzBjOWM2MSwgMHhhYmQzODhmMCwKKwkweDZhNTFhMGQyLCAweGQ4NTQyZjY4LCAweDk2MGZhNzI4LCAweGFiNTEzM2EzLAorCTB4NmVlZjBiNmMsIDB4MTM3YTNiZTQsIDB4YmEzYmYwNTAsIDB4N2VmYjJhOTgsCisJMHhhMWYxNjUxZCwgMHgzOWFmMDE3NiwgMHg2NmNhNTkzZSwgMHg4MjQzMGU4OCwKKwkweDhjZWU4NjE5LCAweDQ1NmY5ZmI0LCAweDdkODRhNWMzLCAweDNiOGI1ZWJlLAorCTB4ZTA2Zjc1ZDgsIDB4ODVjMTIwNzMsIDB4NDAxYTQ0OWYsIDB4NTZjMTZhYTYsCisJMHg0ZWQzYWE2MiwgMHgzNjNmNzcwNiwgMHgxYmZlZGY3MiwgMHg0MjliMDIzZCwKKwkweDM3ZDBkNzI0LCAweGQwMGExMjQ4LCAweGRiMGZlYWQzLCAweDQ5ZjFjMDliLAorCTB4MDc1MzcyYzksIDB4ODA5OTFiN2IsIDB4MjVkNDc5ZDgsIDB4ZjZlOGRlZjcsCisJMHhlM2ZlNTAxYSwgMHhiNjc5NGMzYiwgMHg5NzZjZTBiZCwgMHgwNGMwMDZiYSwKKwkweGMxYTk0ZmI2LCAweDQwOWY2MGM0LCAweDVlNWM5ZWMyLCAweDE5NmEyNDYzLAorCTB4NjhmYjZmYWYsIDB4M2U2YzUzYjUsIDB4MTMzOWIyZWIsIDB4M2I1MmVjNmYsCisJMHg2ZGZjNTExZiwgMHg5YjMwOTUyYywgMHhjYzgxNDU0NCwgMHhhZjVlYmQwOSwKKwkweGJlZTNkMDA0LCAweGRlMzM0YWZkLCAweDY2MGYyODA3LCAweDE5MmU0YmIzLAorCTB4YzBjYmE4NTcsIDB4NDVjODc0MGYsIDB4ZDIwYjVmMzksIDB4YjlkM2ZiZGIsCisJMHg1NTc5YzBiZCwgMHgxYTYwMzIwYSwgMHhkNmExMDBjNiwgMHg0MDJjNzI3OSwKKwkweDY3OWYyNWZlLCAweGZiMWZhM2NjLCAweDhlYTVlOWY4LCAweGRiMzIyMmY4LAorCTB4M2M3NTE2ZGYsIDB4ZmQ2MTZiMTUsIDB4MmY1MDFlYzgsIDB4YWQwNTUyYWIsCisJMHgzMjNkYjVmYSwgMHhmZDIzODc2MCwgMHg1MzMxN2I0OCwgMHgzZTAwZGY4MiwKKwkweDllNWM1N2JiLCAweGNhNmY4Y2EwLCAweDFhODc1NjJlLCAweGRmMTc2OWRiLAorCTB4ZDU0MmE4ZjYsIDB4Mjg3ZWZmYzMsIDB4YWM2NzMyYzYsIDB4OGM0ZjU1NzMsCisJMHg2OTViMjdiMCwgMHhiYmNhNThjOCwgMHhlMWZmYTM1ZCwgMHhiOGYwMTFhMCwKKwkweDEwZmEzZDk4LCAweGZkMjE4M2I4LCAweDRhZmNiNTZjLCAweDJkZDFkMzViLAorCTB4OWE1M2U0NzksIDB4YjZmODQ1NjUsIDB4ZDI4ZTQ5YmMsIDB4NGJmYjk3OTAsCisJMHhlMWRkZjJkYSwgMHhhNGNiN2UzMywgMHg2MmZiMTM0MSwgMHhjZWU0YzZlOCwKKwkweGVmMjBjYWRhLCAweDM2Nzc0YzAxLCAweGQwN2U5ZWZlLCAweDJiZjExZmI0LAorCTB4OTVkYmRhNGQsIDB4YWU5MDkxOTgsIDB4ZWFhZDhlNzEsIDB4NmI5M2Q1YTAsCisJMHhkMDhlZDFkMCwgMHhhZmM3MjVlMCwgMHg4ZTNjNWIyZiwgMHg4ZTc1OTRiNywKKwkweDhmZjZlMmZiLCAweGYyMTIyYjY0LCAweDg4ODhiODEyLCAweDkwMGRmMDFjLAorCTB4NGZhZDVlYTAsIDB4Njg4ZmMzMWMsIDB4ZDFjZmYxOTEsIDB4YjNhOGMxYWQsCisJMHgyZjJmMjIxOCwgMHhiZTBlMTc3NywgMHhlYTc1MmRmZSwgMHg4YjAyMWZhMSwKKwkweGU1YTBjYzBmLCAweGI1NmY3NGU4LCAweDE4YWNmM2Q2LCAweGNlODllMjk5LAorCTB4YjRhODRmZTAsIDB4ZmQxM2UwYjcsIDB4N2NjNDNiODEsIDB4ZDJhZGE4ZDksCisJMHgxNjVmYTI2NiwgMHg4MDk1NzcwNSwgMHg5M2NjNzMxNCwgMHgyMTFhMTQ3NywKKwkweGU2YWQyMDY1LCAweDc3YjVmYTg2LCAweGM3NTQ0MmY1LCAweGZiOWQzNWNmLAorCTB4ZWJjZGFmMGMsIDB4N2IzZTg5YTAsIDB4ZDY0MTFiZDMsIDB4YWUxZTdlNDksCisJMHgwMDI1MGUyZCwgMHgyMDcxYjM1ZSwgMHgyMjY4MDBiYiwgMHg1N2I4ZTBhZiwKKwkweDI0NjQzNjliLCAweGYwMDliOTFlLCAweDU1NjM5MTFkLCAweDU5ZGZhNmFhLAorCTB4NzhjMTQzODksIDB4ZDk1YTUzN2YsIDB4MjA3ZDViYTIsIDB4MDJlNWI5YzUsCisJMHg4MzI2MDM3NiwgMHg2Mjk1Y2ZhOSwgMHgxMWM4MTk2OCwgMHg0ZTczNGE0MSwKKwkweGIzNDcyZGNhLCAweDdiMTRhOTRhLCAweDFiNTEwMDUyLCAweDlhNTMyOTE1LAorCTB4ZDYwZjU3M2YsIDB4YmM5YmM2ZTQsIDB4MmI2MGE0NzYsIDB4ODFlNjc0MDAsCisJMHgwOGJhNmZiNSwgMHg1NzFiZTkxZiwgMHhmMjk2ZWM2YiwgMHgyYTBkZDkxNSwKKwkweGI2NjM2NTIxLCAweGU3YjlmOWI2LCAweGZmMzQwNTJlLCAweGM1ODU1NjY0LAorCTB4NTNiMDJkNWQsIDB4YTk5ZjhmYTEsIDB4MDhiYTQ3OTksIDB4NmU4NTA3NmEsCisJMHg0YjdhNzBlOSwgMHhiNWIzMjk0NCwgMHhkYjc1MDkyZSwgMHhjNDE5MjYyMywKKwkweGFkNmVhNmIwLCAweDQ5YTdkZjdkLCAweDljZWU2MGI4LCAweDhmZWRiMjY2LAorCTB4ZWNhYThjNzEsIDB4Njk5YTE3ZmYsIDB4NTY2NDUyNmMsIDB4YzJiMTllZTEsCisJMHgxOTM2MDJhNSwgMHg3NTA5NGMyOSwgMHhhMDU5MTM0MCwgMHhlNDE4M2EzZSwKKwkweDNmNTQ5ODlhLCAweDViNDI5ZDY1LCAweDZiOGZlNGQ2LCAweDk5ZjczZmQ2LAorCTB4YTFkMjljMDcsIDB4ZWZlODMwZjUsIDB4NGQyZDM4ZTYsIDB4ZjAyNTVkYzEsCisJMHg0Y2RkMjA4NiwgMHg4NDcwZWIyNiwgMHg2MzgyZTljNiwgMHgwMjFlY2M1ZSwKKwkweDA5Njg2YjNmLCAweDNlYmFlZmM5LCAweDNjOTcxODE0LCAweDZiNmE3MGExLAorCTB4Njg3ZjM1ODQsIDB4NTJhMGUyODYsIDB4Yjc5YzUzMDUsIDB4YWE1MDA3MzcsCisJMHgzZTA3ODQxYywgMHg3ZmRlYWU1YywgMHg4ZTdkNDRlYywgMHg1NzE2ZjJiOCwKKwkweGIwM2FkYTM3LCAweGYwNTAwYzBkLCAweGYwMWMxZjA0LCAweDAyMDBiM2ZmLAorCTB4YWUwY2Y1MWEsIDB4M2NiNTc0YjIsIDB4MjU4MzdhNTgsIDB4ZGMwOTIxYmQsCisJMHhkMTkxMTNmOSwgMHg3Y2E5MmZmNiwgMHg5NDMyNDc3MywgMHgyMmY1NDcwMSwKKwkweDNhZTVlNTgxLCAweDM3YzJkYWRjLCAweGM4YjU3NjM0LCAweDlhZjNkZGE3LAorCTB4YTk0NDYxNDYsIDB4MGZkMDAzMGUsIDB4ZWNjOGM3M2UsIDB4YTQ3NTFlNDEsCisJMHhlMjM4Y2Q5OSwgMHgzYmVhMGUyZiwgMHgzMjgwYmJhMSwgMHgxODNlYjMzMSwKKwkweDRlNTQ4YjM4LCAweDRmNmRiOTA4LCAweDZmNDIwZDAzLCAweGY2MGEwNGJmLAorCTB4MmNiODEyOTAsIDB4MjQ5NzdjNzksIDB4NTY3OWIwNzIsIDB4YmNhZjg5YWYsCisJMHhkZTlhNzcxZiwgMHhkOTkzMDgxMCwgMHhiMzhiYWUxMiwgMHhkY2NmM2YyZSwKKwkweDU1MTI3MjFmLCAweDJlNmI3MTI0LCAweDUwMWFkZGU2LCAweDlmODRjZDg3LAorCTB4N2E1ODQ3MTgsIDB4NzQwOGRhMTcsIDB4YmM5ZjlhYmMsIDB4ZTk0YjdkOGMsCisJMHhlYzdhZWMzYSwgMHhkYjg1MWRmYSwgMHg2MzA5NDM2NiwgMHhjNDY0YzNkMiwKKwkweGVmMWMxODQ3LCAweDMyMTVkOTA4LCAweGRkNDMzYjM3LCAweDI0YzJiYTE2LAorCTB4MTJhMTRkNDMsIDB4MmE2NWM0NTEsIDB4NTA5NDAwMDIsIDB4MTMzYWU0ZGQsCisJMHg3MWRmZjg5ZSwgMHgxMDMxNGU1NSwgMHg4MWFjNzdkNiwgMHg1ZjExMTk5YiwKKwkweDA0MzU1NmYxLCAweGQ3YTNjNzZiLCAweDNjMTExODNiLCAweDU5MjRhNTA5LAorCTB4ZjI4ZmU2ZWQsIDB4OTdmMWZiZmEsIDB4OWViYWJmMmMsIDB4MWUxNTNjNmUsCisJMHg4NmUzNDU3MCwgMHhlYWU5NmZiMSwgMHg4NjBlNWUwYSwgMHg1YTNlMmFiMywKKwkweDc3MWZlNzFjLCAweDRlM2QwNmZhLCAweDI5NjVkY2I5LCAweDk5ZTcxZDBmLAorCTB4ODAzZTg5ZDYsIDB4NTI2NmM4MjUsIDB4MmU0Y2M5NzgsIDB4OWMxMGIzNmEsCisJMHhjNjE1MGViYSwgMHg5NGUyZWE3OCwgMHhhNWZjM2M1MywgMHgxZTBhMmRmNCwKKwkweGYyZjc0ZWE3LCAweDM2MWQyYjNkLCAweDE5MzkyNjBmLCAweDE5YzI3OTYwLAorCTB4NTIyM2E3MDgsIDB4ZjcxMzEyYjYsIDB4ZWJhZGZlNmUsIDB4ZWFjMzFmNjYsCisJMHhlM2JjNDU5NSwgMHhhNjdiYzg4MywgMHhiMTdmMzdkMSwgMHgwMThjZmYyOCwKKwkweGMzMzJkZGVmLCAweGJlNmM1YWE1LCAweDY1NTgyMTg1LCAweDY4YWI5ODAyLAorCTB4ZWVjZWE1MGYsIDB4ZGIyZjk1M2IsIDB4MmFlZjdkYWQsIDB4NWI2ZTJmODQsCisJMHgxNTIxYjYyOCwgMHgyOTA3NjE3MCwgMHhlY2RkNDc3NSwgMHg2MTlmMTUxMCwKKwkweDEzY2NhODMwLCAweGViNjFiZDk2LCAweDAzMzRmZTFlLCAweGFhMDM2M2NmLAorCTB4YjU3MzVjOTAsIDB4NGM3MGEyMzksIDB4ZDU5ZTllMGIsIDB4Y2JhYWRlMTQsCisJMHhlZWNjODZiYywgMHg2MDYyMmNhNywgMHg5Y2FiNWNhYiwgMHhiMmYzODQ2ZSwKKwkweDY0OGIxZWFmLCAweDE5YmRmMGNhLCAweGEwMjM2OWI5LCAweDY1NWFiYjUwLAorCTB4NDA2ODVhMzIsIDB4M2MyYWI0YjMsIDB4MzE5ZWU5ZDUsIDB4YzAyMWI4ZjcsCisJMHg5YjU0MGIxOSwgMHg4NzVmYTA5OSwgMHg5NWY3OTk3ZSwgMHg2MjNkN2RhOCwKKwkweGY4Mzc4ODlhLCAweDk3ZTMyZDc3LCAweDExZWQ5MzVmLCAweDE2NjgxMjgxLAorCTB4MGUzNTg4MjksIDB4YzdlNjFmZDYsIDB4OTZkZWRmYTEsIDB4Nzg1OGJhOTksCisJMHg1N2Y1ODRhNSwgMHgxYjIyNzI2MywgMHg5YjgzYzNmZiwgMHgxYWMyNDY5NiwKKwkweGNkYjMwYWViLCAweDUzMmUzMDU0LCAweDhmZDk0OGU0LCAweDZkYmMzMTI4LAorCTB4NThlYmYyZWYsIDB4MzRjNmZmZWEsIDB4ZmUyOGVkNjEsIDB4ZWU3YzNjNzMsCisJMHg1ZDRhMTRkOSwgMHhlODY0YjdlMywgMHg0MjEwNWQxNCwgMHgyMDNlMTNlMCwKKwkweDQ1ZWVlMmI2LCAweGEzYWFhYmVhLCAweGRiNmM0ZjE1LCAweGZhY2I0ZmQwLAorCTB4Yzc0MmY0NDIsIDB4ZWY2YWJiYjUsIDB4NjU0ZjNiMWQsIDB4NDFjZDIxMDUsCisJMHhkODFlNzk5ZSwgMHg4Njg1NGRjNywgMHhlNDRiNDc2YSwgMHgzZDgxNjI1MCwKKwkweGNmNjJhMWYyLCAweDViOGQyNjQ2LCAweGZjODg4M2EwLCAweGMxYzdiNmEzLAorCTB4N2YxNTI0YzMsIDB4NjljYjc0OTIsIDB4NDc4NDhhMGIsIDB4NTY5MmIyODUsCisJMHgwOTViYmYwMCwgMHhhZDE5NDg5ZCwgMHgxNDYyYjE3NCwgMHgyMzgyMGUwMCwKKwkweDU4NDI4ZDJhLCAweDBjNTVmNWVhLCAweDFkYWRmNDNlLCAweDIzM2Y3MDYxLAorCTB4MzM3MmYwOTIsIDB4OGQ5MzdlNDEsIDB4ZDY1ZmVjZjEsIDB4NmMyMjNiZGIsCisJMHg3Y2RlMzc1OSwgMHhjYmVlNzQ2MCwgMHg0MDg1ZjJhNywgMHhjZTc3MzI2ZSwKKwkweGE2MDc4MDg0LCAweDE5Zjg1MDllLCAweGU4ZWZkODU1LCAweDYxZDk5NzM1LAorCTB4YTk2OWE3YWEsIDB4YzUwYzA2YzIsIDB4NWEwNGFiZmMsIDB4ODAwYmNhZGMsCisJMHg5ZTQ0N2EyZSwgMHhjMzQ1MzQ4NCwgMHhmZGQ1NjcwNSwgMHgwZTFlOWVjOSwKKwkweGRiNzNkYmQzLCAweDEwNTU4OGNkLCAweDY3NWZkYTc5LCAweGUzNjc0MzQwLAorCTB4YzVjNDM0NjUsIDB4NzEzZTM4ZDgsIDB4M2QyOGY4OWUsIDB4ZjE2ZGZmMjAsCisJMHgxNTNlMjFlNywgMHg4ZmIwM2Q0YSwgMHhlNmUzOWYyYiwgMHhkYjgzYWRmNywKKwkweGU5M2Q1YTY4LCAweDk0ODE0MGY3LCAweGY2NGMyNjFjLCAweDk0NjkyOTM0LAorCTB4NDExNTIwZjcsIDB4NzYwMmQ0ZjcsIDB4YmNmNDZiMmUsIDB4ZDRhMjAwNjgsCisJMHhkNDA4MjQ3MSwgMHgzMzIwZjQ2YSwgMHg0M2I3ZDRiNywgMHg1MDAwNjFhZiwKKwkweDFlMzlmNjJlLCAweDk3MjQ0NTQ2LCAweDE0MjE0Zjc0LCAweGJmOGI4ODQwLAorCTB4NGQ5NWZjMWQsIDB4OTZiNTkxYWYsIDB4NzBmNGRkZDMsIDB4NjZhMDJmNDUsCisJMHhiZmJjMDllYywgMHgwM2JkOTc4NSwgMHg3ZmFjNmRkMCwgMHgzMWNiODUwNCwKKwkweDk2ZWIyN2IzLCAweDU1ZmQzOTQxLCAweGRhMjU0N2U2LCAweGFiY2EwYTlhLAorCTB4Mjg1MDc4MjUsIDB4NTMwNDI5ZjQsIDB4MGEyYzg2ZGEsIDB4ZTliNjZkZmIsCisJMHg2OGRjMTQ2MiwgMHhkNzQ4NjkwMCwgMHg2ODBlYzBhNCwgMHgyN2ExOGRlZSwKKwkweDRmM2ZmZWEyLCAweGU4ODdhZDhjLCAweGI1OGNlMDA2LCAweDdhZjRkNmI2LAorCTB4YWFjZTFlN2MsIDB4ZDMzNzVmZWMsIDB4Y2U3OGEzOTksIDB4NDA2YjJhNDIsCisJMHgyMGZlOWUzNSwgMHhkOWYzODViOSwgMHhlZTM5ZDdhYiwgMHgzYjEyNGU4YiwKKwkweDFkYzlmYWY3LCAweDRiNmQxODU2LCAweDI2YTM2NjMxLCAweGVhZTM5N2IyLAorCTB4M2E2ZWZhNzQsIDB4ZGQ1YjQzMzIsIDB4Njg0MWU3ZjcsIDB4Y2E3ODIwZmIsCisJMHhmYjBhZjU0ZSwgMHhkOGZlYjM5NywgMHg0NTQwNTZhYywgMHhiYTQ4OTUyNywKKwkweDU1NTMzYTNhLCAweDIwODM4ZDg3LCAweGZlNmJhOWI3LCAweGQwOTY5NTRiLAorCTB4NTVhODY3YmMsIDB4YTExNTlhNTgsIDB4Y2NhOTI5NjMsIDB4OTllMWRiMzMsCisJMHhhNjJhNGE1NiwgMHgzZjMxMjVmOSwgMHg1ZWY0N2UxYywgMHg5MDI5MzE3YywKKwkweGZkZjhlODAyLCAweDA0MjcyZjcwLCAweDgwYmIxNTVjLCAweDA1MjgyY2UzLAorCTB4OTVjMTE1NDgsIDB4ZTRjNjZkMjIsIDB4NDhjMTEzM2YsIDB4YzcwZjg2ZGMsCisJMHgwN2Y5YzllZSwgMHg0MTA0MWYwZiwgMHg0MDQ3NzlhNCwgMHg1ZDg4NmUxNywKKwkweDMyNWY1MWViLCAweGQ1OWJjMGQxLCAweGYyYmNjMThmLCAweDQxMTEzNTY0LAorCTB4MjU3Yjc4MzQsIDB4NjAyYTljNjAsIDB4ZGZmOGU4YTMsIDB4MWY2MzZjMWIsCisJMHgwZTEyYjRjMiwgMHgwMmUxMzI5ZSwgMHhhZjY2NGZkMSwgMHhjYWQxODExNSwKKwkweDZiMjM5NWUwLCAweDMzM2U5MmUxLCAweDNiMjQwYjYyLCAweGVlYmViOTIyLAorCTB4ODViMmEyMGUsIDB4ZTZiYTBkOTksIDB4ZGU3MjBjOGMsIDB4MmRhMmY3MjgsCisJMHhkMDEyNzg0NSwgMHg5NWI3OTRmZCwgMHg2NDdkMDg2MiwgMHhlN2NjZjVmMCwKKwkweDU0NDlhMzZmLCAweDg3N2Q0OGZhLCAweGMzOWRmZDI3LCAweGYzM2U4ZDFlLAorCTB4MGE0NzYzNDEsIDB4OTkyZWZmNzQsIDB4M2E2ZjZlYWIsIDB4ZjRmOGZkMzcsCisJMHhhODEyZGM2MCwgMHhhMWViZGRmOCwgMHg5OTFiZTE0YywgMHhkYjZlNmIwZCwKKwkweGM2N2I1NTEwLCAweDZkNjcyYzM3LCAweDI3NjVkNDNiLCAweGRjZDBlODA0LAorCTB4ZjEyOTBkYzcsIDB4Y2MwMGZmYTMsIDB4YjUzOTBmOTIsIDB4NjkwZmVkMGIsCisJMHg2NjdiOWZmYiwgMHhjZWRiN2Q5YywgMHhhMDkxY2YwYiwgMHhkOTE1NWVhMywKKwkweGJiMTMyZjg4LCAweDUxNWJhZDI0LCAweDdiOTQ3OWJmLCAweDc2M2JkNmViLAorCTB4MzczOTJlYjMsIDB4Y2MxMTU5NzksIDB4ODAyNmUyOTcsIDB4ZjQyZTMxMmQsCisJMHg2ODQyYWRhNywgMHhjNjZhMmIzYiwgMHgxMjc1NGNjYywgMHg3ODJlZjExYywKKwkweDZhMTI0MjM3LCAweGI3OTI1MWU3LCAweDA2YTFiYmU2LCAweDRiZmI2MzUwLAorCTB4MWE2YjEwMTgsIDB4MTFjYWVkZmEsIDB4M2QyNWJkZDgsIDB4ZTJlMWMzYzksCisJMHg0NDQyMTY1OSwgMHgwYTEyMTM4NiwgMHhkOTBjZWM2ZSwgMHhkNWFiZWEyYSwKKwkweDY0YWY2NzRlLCAweGRhODZhODVmLCAweGJlYmZlOTg4LCAweDY0ZTRjM2ZlLAorCTB4OWRiYzgwNTcsIDB4ZjBmN2MwODYsIDB4NjA3ODdiZjgsIDB4NjAwMzYwNGQsCisJMHhkMWZkODM0NiwgMHhmNjM4MWZiMCwgMHg3NzQ1YWUwNCwgMHhkNzM2ZmNjYywKKwkweDgzNDI2YjMzLCAweGYwMWVhYjcxLCAweGIwODA0MTg3LCAweDNjMDA1ZTVmLAorCTB4NzdhMDU3YmUsIDB4YmRlOGFlMjQsIDB4NTU0NjQyOTksIDB4YmY1ODJlNjEsCisJMHg0ZTU4ZjQ4ZiwgMHhmMmRkZmRhMiwgMHhmNDc0ZWYzOCwgMHg4Nzg5YmRjMiwKKwkweDUzNjZmOWMzLCAweGM4YjM4ZTc0LCAweGI0NzVmMjU1LCAweDQ2ZmNkOWI5LAorCTB4N2FlYjI2NjEsIDB4OGIxZGRmODQsIDB4ODQ2YTBlNzksIDB4OTE1Zjk1ZTIsCisJMHg0NjZlNTk4ZSwgMHgyMGI0NTc3MCwgMHg4Y2Q1NTU5MSwgMHhjOTAyZGU0YywKKwkweGI5MGJhY2UxLCAweGJiODIwNWQwLCAweDExYTg2MjQ4LCAweDc1NzRhOTllLAorCTB4Yjc3ZjE5YjYsIDB4ZTBhOWRjMDksIDB4NjYyZDA5YTEsIDB4YzQzMjQ2MzMsCisJMHhlODVhMWYwMiwgMHgwOWYwYmU4YywgMHg0YTk5YTAyNSwgMHgxZDZlZmUxMCwKKwkweDFhYjkzZDFkLCAweDBiYTVhNGRmLCAweGExODZmMjBmLCAweDI4NjhmMTY5LAorCTB4ZGNiN2RhODMsIDB4NTczOTA2ZmUsIDB4YTFlMmNlOWIsIDB4NGZjZDdmNTIsCisJMHg1MDExNWUwMSwgMHhhNzA2ODNmYSwgMHhhMDAyYjVjNCwgMHgwZGU2ZDAyNywKKwkweDlhZjg4YzI3LCAweDc3M2Y4NjQxLCAweGMzNjA0YzA2LCAweDYxYTgwNmI1LAorCTB4ZjAxNzdhMjgsIDB4YzBmNTg2ZTAsIDB4MDA2MDU4YWEsIDB4MzBkYzdkNjIsCisJMHgxMWU2OWVkNywgMHgyMzM4ZWE2MywgMHg1M2MyZGQ5NCwgMHhjMmMyMTYzNCwKKwkweGJiY2JlZTU2LCAweDkwYmNiNmRlLCAweGViZmM3ZGExLCAweGNlNTkxZDc2LAorCTB4NmYwNWU0MDksIDB4NGI3YzAxODgsIDB4Mzk3MjBhM2QsIDB4N2M5MjdjMjQsCisJMHg4NmUzNzI1ZiwgMHg3MjRkOWRiOSwgMHgxYWMxNWJiNCwgMHhkMzllYjhmYywKKwkweGVkNTQ1NTc4LCAweDA4ZmNhNWI1LCAweGQ4M2Q3Y2QzLCAweDRkYWQwZmM0LAorCTB4MWU1MGVmNWUsIDB4YjE2MWU2ZjgsIDB4YTI4NTE0ZDksIDB4NmM1MTEzM2MsCisJMHg2ZmQ1YzdlNywgMHg1NmUxNGVjNCwgMHgzNjJhYmZjZSwgMHhkZGM2YzgzNywKKwkweGQ3OWEzMjM0LCAweDkyNjM4MjEyLCAweDY3MGVmYThlLCAweDQwNjAwMGUwLAorCTB4M2EzOWNlMzcsIDB4ZDNmYWY1Y2YsIDB4YWJjMjc3MzcsIDB4NWFjNTJkMWIsCisJMHg1Y2IwNjc5ZSwgMHg0ZmEzMzc0MiwgMHhkMzgyMjc0MCwgMHg5OWJjOWJiZSwKKwkweGQ1MTE4ZTlkLCAweGJmMGY3MzE1LCAweGQ2MmQxYzdlLCAweGM3MDBjNDdiLAorCTB4Yjc4YzFiNmIsIDB4MjFhMTkwNDUsIDB4YjI2ZWIxYmUsIDB4NmEzNjZlYjQsCisJMHg1NzQ4YWIyZiwgMHhiYzk0NmU3OSwgMHhjNmEzNzZkMiwgMHg2NTQ5YzJjOCwKKwkweDUzMGZmOGVlLCAweDQ2OGRkZTdkLCAweGQ1NzMwYTFkLCAweDRjZDA0ZGM2LAorCTB4MjkzOWJiZGIsIDB4YTliYTQ2NTAsIDB4YWM5NTI2ZTgsIDB4YmU1ZWUzMDQsCisJMHhhMWZhZDVmMCwgMHg2YTJkNTE5YSwgMHg2M2VmOGNlMiwgMHg5YTg2ZWUyMiwKKwkweGMwODljMmI4LCAweDQzMjQyZWY2LCAweGE1MWUwM2FhLCAweDljZjJkMGE0LAorCTB4ODNjMDYxYmEsIDB4OWJlOTZhNGQsIDB4OGZlNTE1NTAsIDB4YmE2NDViZDYsCisJMHgyODI2YTJmOSwgMHhhNzNhM2FlMSwgMHg0YmE5OTU4NiwgMHhlZjU1NjJlOSwKKwkweGM3MmZlZmQzLCAweGY3NTJmN2RhLCAweDNmMDQ2ZjY5LCAweDc3ZmEwYTU5LAorCTB4ODBlNGE5MTUsIDB4ODdiMDg2MDEsIDB4OWIwOWU2YWQsIDB4M2IzZWU1OTMsCisJMHhlOTkwZmQ1YSwgMHg5ZTM0ZDc5NywgMHgyY2YwYjdkOSwgMHgwMjJiOGI1MSwKKwkweDk2ZDVhYzNhLCAweDAxN2RhNjdkLCAweGQxY2YzZWQ2LCAweDdjN2QyZDI4LAorCTB4MWY5ZjI1Y2YsIDB4YWRmMmI4OWIsIDB4NWFkNmI0NzIsIDB4NWE4OGY1NGMsCisJMHhlMDI5YWM3MSwgMHhlMDE5YTVlNiwgMHg0N2IwYWNmZCwgMHhlZDkzZmE5YiwKKwkweGU4ZDNjNDhkLCAweDI4M2I1N2NjLCAweGY4ZDU2NjI5LCAweDc5MTMyZTI4LAorCTB4Nzg1ZjAxOTEsIDB4ZWQ3NTYwNTUsIDB4Zjc5NjBlNDQsIDB4ZTNkMzVlOGMsCisJMHgxNTA1NmRkNCwgMHg4OGY0NmRiYSwgMHgwM2ExNjEyNSwgMHgwNTY0ZjBiZCwKKwkweGMzZWI5ZTE1LCAweDNjOTA1N2EyLCAweDk3MjcxYWVjLCAweGE5M2EwNzJhLAorCTB4MWIzZjZkOWIsIDB4MWU2MzIxZjUsIDB4ZjU5YzY2ZmIsIDB4MjZkY2YzMTksCisJMHg3NTMzZDkyOCwgMHhiMTU1ZmRmNSwgMHgwMzU2MzQ4MiwgMHg4YWJhM2NiYiwKKwkweDI4NTE3NzExLCAweGMyMGFkOWY4LCAweGFiY2M1MTY3LCAweGNjYWQ5MjVmLAorCTB4NGRlODE3NTEsIDB4MzgzMGRjOGUsIDB4Mzc5ZDU4NjIsIDB4OTMyMGY5OTEsCisJMHhlYTdhOTBjMiwgMHhmYjNlN2JjZSwgMHg1MTIxY2U2NCwgMHg3NzRmYmUzMiwKKwkweGE4YjZlMzdlLCAweGMzMjkzZDQ2LCAweDQ4ZGU1MzY5LCAweDY0MTNlNjgwLAorCTB4YTJhZTA4MTAsIDB4ZGQ2ZGIyMjQsIDB4Njk4NTJkZmQsIDB4MDkwNzIxNjYsCisJMHhiMzlhNDYwYSwgMHg2NDQ1YzBkZCwgMHg1ODZjZGVjZiwgMHgxYzIwYzhhZSwKKwkweDViYmVmN2RkLCAweDFiNTg4ZDQwLCAweGNjZDIwMTdmLCAweDZiYjRlM2JiLAorCTB4ZGRhMjZhN2UsIDB4M2E1OWZmNDUsIDB4M2UzNTBhNDQsIDB4YmNiNGNkZDUsCisJMHg3MmVhY2VhOCwgMHhmYTY0ODRiYiwgMHg4ZDY2MTJhZSwgMHhiZjNjNmY0NywKKwkweGQyOWJlNDYzLCAweDU0MmY1ZDllLCAweGFlYzI3NzFiLCAweGY2NGU2MzcwLAorCTB4NzQwZTBkOGQsIDB4ZTc1YjEzNTcsIDB4Zjg3MjE2NzEsIDB4YWY1MzdkNWQsCisJMHg0MDQwY2IwOCwgMHg0ZWI0ZTJjYywgMHgzNGQyNDY2YSwgMHgwMTE1YWY4NCwKKwkweGUxYjAwNDI4LCAweDk1OTgzYTFkLCAweDA2Yjg5ZmI0LCAweGNlNmVhMDQ4LAorCTB4NmYzZjNiODIsIDB4MzUyMGFiODIsIDB4MDExYTFkNGIsIDB4Mjc3MjI3ZjgsCisJMHg2MTE1NjBiMSwgMHhlNzkzM2ZkYywgMHhiYjNhNzkyYiwgMHgzNDQ1MjViZCwKKwkweGEwODgzOWUxLCAweDUxY2U3OTRiLCAweDJmMzJjOWI3LCAweGEwMWZiYWM5LAorCTB4ZTAxY2M4N2UsIDB4YmNjN2QxZjYsIDB4Y2YwMTExYzMsIDB4YTFlOGFhYzcsCisJMHgxYTkwODc0OSwgMHhkNDRmYmQ5YSwgMHhkMGRhZGVjYiwgMHhkNTBhZGEzOCwKKwkweDAzMzljMzJhLCAweGM2OTEzNjY3LCAweDhkZjkzMTdjLCAweGUwYjEyYjRmLAorCTB4Zjc5ZTU5YjcsIDB4NDNmNWJiM2EsIDB4ZjJkNTE5ZmYsIDB4MjdkOTQ1OWMsCisJMHhiZjk3MjIyYywgMHgxNWU2ZmMyYSwgMHgwZjkxZmM3MSwgMHg5Yjk0MTUyNSwKKwkweGZhZTU5MzYxLCAweGNlYjY5Y2ViLCAweGMyYTg2NDU5LCAweDEyYmFhOGQxLAorCTB4YjZjMTA3NWUsIDB4ZTMwNTZhMGMsIDB4MTBkMjUwNjUsIDB4Y2IwM2E0NDIsCisJMHhlMGVjNmUwZSwgMHgxNjk4ZGIzYiwgMHg0Yzk4YTBiZSwgMHgzMjc4ZTk2NCwKKwkweDlmMWY5NTMyLCAweGUwZDM5MmRmLCAweGQzYTAzNDJiLCAweDg5NzFmMjFlLAorCTB4MWIwYTc0NDEsIDB4NGJhMzM0OGMsIDB4YzViZTcxMjAsIDB4YzM3NjMyZDgsCisJMHhkZjM1OWY4ZCwgMHg5Yjk5MmYyZSwgMHhlNjBiNmY0NywgMHgwZmUzZjExZCwKKwkweGU1NGNkYTU0LCAweDFlZGFkODkxLCAweGNlNjI3OWNmLCAweGNkM2U3ZTZmLAorCTB4MTYxOGIxNjYsIDB4ZmQyYzFkMDUsIDB4ODQ4ZmQyYzUsIDB4ZjZmYjIyOTksCisJMHhmNTIzZjM1NywgMHhhNjMyNzYyMywgMHg5M2E4MzUzMSwgMHg1NmNjY2QwMiwKKwkweGFjZjA4MTYyLCAweDVhNzVlYmI1LCAweDZlMTYzNjk3LCAweDg4ZDI3M2NjLAorCTB4ZGU5NjYyOTIsIDB4ODFiOTQ5ZDAsIDB4NGM1MDkwMWIsIDB4NzFjNjU2MTQsCisJMHhlNmM2YzdiZCwgMHgzMjdhMTQwYSwgMHg0NWUxZDAwNiwgMHhjM2YyN2I5YSwKKwkweGM5YWE1M2ZkLCAweDYyYTgwZjAwLCAweGJiMjViZmUyLCAweDM1YmRkMmY2LAorCTB4NzExMjY5MDUsIDB4YjIwNDAyMjIsIDB4YjZjYmNmN2MsIDB4Y2Q3NjljMmIsCisJMHg1MzExM2VjMCwgMHgxNjQwZTNkMywgMHgzOGFiYmQ2MCwgMHgyNTQ3YWRmMCwKKwkweGJhMzgyMDljLCAweGY3NDZjZTc2LCAweDc3YWZhMWM1LCAweDIwNzU2MDYwLAorCTB4ODVjYmZlNGUsIDB4OGFlODhkZDgsIDB4N2FhYWY5YjAsIDB4NGNmOWFhN2UsCisJMHgxOTQ4YzI1YywgMHgwMmZiOGE4YywgMHgwMWMzNmFlNCwgMHhkNmViZTFmOSwKKwkweDkwZDRmODY5LCAweGE2NWNkZWEwLCAweDNmMDkyNTJkLCAweGMyMDhlNjlmLAorCTB4Yjc0ZTYxMzIsIDB4Y2U3N2UyNWIsIDB4NTc4ZmRmZTMsIDB4M2FjMzcyZTYsCit9OworCisvKgorICogUm91bmQgbG9vcCB1bnJvbGxpbmcgbWFjcm9zLCBTIGlzIGEgcG9pbnRlciB0byBhIFMtQm94IGFycmF5CisgKiBvcmdhbml6ZWQgaW4gNCB1bnNpZ25lZCBsb25ncyBhdCBhIHJvdy4KKyAqLworI2RlZmluZSBHRVQzMl8zKHgpICgoKHgpICYgMHhmZikpCisjZGVmaW5lIEdFVDMyXzIoeCkgKCgoeCkgPj4gKDgpKSAmICgweGZmKSkKKyNkZWZpbmUgR0VUMzJfMSh4KSAoKCh4KSA+PiAoMTYpKSAmICgweGZmKSkKKyNkZWZpbmUgR0VUMzJfMCh4KSAoKCh4KSA+PiAoMjQpKSAmICgweGZmKSkKKworI2RlZmluZSBiZl9GKHgpICgoKFNbR0VUMzJfMCh4KV0gKyBTWzI1NiArIEdFVDMyXzEoeCldKSBeIFwKKwkJU1s1MTIgKyBHRVQzMl8yKHgpXSkgKyBTWzc2OCArIEdFVDMyXzMoeCldKQorCisjZGVmaW5lIFJPVU5EKGEsIGIsIG4pICh7IGIgXj0gUFtuXTsgYSBePSBiZl9GKGIpOyB9KQorCisvKgorICogVGhlIGJsb3dmaXNoIGVuY2lwaGVyLCBwcm9jZXNzZXMgNjQtYml0IGJsb2Nrcy4KKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gTVVTVE4nVCByZXNwZWN0IGVuZGlhbmVzcworICovCitzdGF0aWMgdm9pZCBlbmNyeXB0X2Jsb2NrKHN0cnVjdCBiZl9jdHggKmJjdHgsIHUzMiAqZHN0LCB1MzIgKnNyYykKK3sKKwljb25zdCB1MzIgKlAgPSBiY3R4LT5wOworCWNvbnN0IHUzMiAqUyA9IGJjdHgtPnM7CisJdTMyIHlsID0gc3JjWzBdOworCXUzMiB5ciA9IHNyY1sxXTsKKworCVJPVU5EKHlyLCB5bCwgMCk7CisJUk9VTkQoeWwsIHlyLCAxKTsKKwlST1VORCh5ciwgeWwsIDIpOworCVJPVU5EKHlsLCB5ciwgMyk7CisJUk9VTkQoeXIsIHlsLCA0KTsKKwlST1VORCh5bCwgeXIsIDUpOworCVJPVU5EKHlyLCB5bCwgNik7CisJUk9VTkQoeWwsIHlyLCA3KTsKKwlST1VORCh5ciwgeWwsIDgpOworCVJPVU5EKHlsLCB5ciwgOSk7CisJUk9VTkQoeXIsIHlsLCAxMCk7CisJUk9VTkQoeWwsIHlyLCAxMSk7CisJUk9VTkQoeXIsIHlsLCAxMik7CisJUk9VTkQoeWwsIHlyLCAxMyk7CisJUk9VTkQoeXIsIHlsLCAxNCk7CisJUk9VTkQoeWwsIHlyLCAxNSk7CisKKwl5bCBePSBQWzE2XTsKKwl5ciBePSBQWzE3XTsKKworCWRzdFswXSA9IHlyOworCWRzdFsxXSA9IHlsOworfQorCisvKgorICogQ2FsY3VsYXRlcyB0aGUgYmxvd2Zpc2ggUyBhbmQgUCBib3hlcyBmb3IgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbi4KKyAqLworaW50IGJsb3dmaXNoX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBiZl9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJdTMyICpQID0gY3R4LT5wOworCXUzMiAqUyA9IGN0eC0+czsKKwlzaG9ydCBpLCBqLCBjb3VudDsKKwl1MzIgZGF0YVsyXSwgdGVtcDsKKworCS8qIENvcHkgdGhlIGluaXRpYWxpemF0aW9uIHMtYm94ZXMgKi8KKwlmb3IgKGkgPSAwLCBjb3VudCA9IDA7IGkgPCAyNTY7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKywgY291bnQrKykKKwkJCVNbY291bnRdID0gYmZfc2JveFtjb3VudF07CisKKwkvKiBTZXQgdGhlIHAtYm94ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTYgKyAyOyBpKyspCisJCVBbaV0gPSBiZl9wYm94W2ldOworCisJLyogQWN0dWFsIHN1YmtleSBnZW5lcmF0aW9uICovCisJZm9yIChqID0gMCwgaSA9IDA7IGkgPCAxNiArIDI7IGkrKykgeworCQl0ZW1wID0gKCgodTMyKWtleVtqXSA8PCAyNCkgfAorCQkJKCh1MzIpa2V5WyhqICsgMSkgJSBrZXlsZW5dIDw8IDE2KSB8CisJCQkoKHUzMilrZXlbKGogKyAyKSAlIGtleWxlbl0gPDwgOCkgfAorCQkJKCh1MzIpa2V5WyhqICsgMykgJSBrZXlsZW5dKSk7CisKKwkJUFtpXSA9IFBbaV0gXiB0ZW1wOworCQlqID0gKGogKyA0KSAlIGtleWxlbjsKKwl9CisKKwlkYXRhWzBdID0gMHgwMDAwMDAwMDsKKwlkYXRhWzFdID0gMHgwMDAwMDAwMDsKKworCWZvciAoaSA9IDA7IGkgPCAxNiArIDI7IGkgKz0gMikgeworCQllbmNyeXB0X2Jsb2NrKChzdHJ1Y3QgYmZfY3R4ICopY3R4LCBkYXRhLCBkYXRhKTsKKworCQlQW2ldID0gZGF0YVswXTsKKwkJUFtpICsgMV0gPSBkYXRhWzFdOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZm9yIChqID0gMCwgY291bnQgPSBpICogMjU2OyBqIDwgMjU2OyBqICs9IDIsIGNvdW50ICs9IDIpIHsKKwkJCWVuY3J5cHRfYmxvY2soKHN0cnVjdCBiZl9jdHggKiljdHgsIGRhdGEsIGRhdGEpOworCisJCQlTW2NvdW50XSA9IGRhdGFbMF07CisJCQlTW2NvdW50ICsgMV0gPSBkYXRhWzFdOworCQl9CisJfQorCisJLyogQnJ1Y2Ugc2F5cyBub3QgdG8gYm90aGVyIHdpdGggdGhlIHdlYWsga2V5IGNoZWNrLiAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxvd2Zpc2hfc2V0a2V5KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG93ZmlzaCBDaXBoZXIgY29tbW9uIGZ1bmN0aW9ucyIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsb3dmaXNoX2dlbmVyaWMuYyBiL2NyeXB0by9ibG93ZmlzaF9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyNjliNQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9ibG93ZmlzaF9nZW5lcmljLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtLCBieSBCcnVjZSBTY2huZWllci4KKyAqIGh0dHA6Ly93d3cuY291bnRlcnBhbmUuY29tL2Jsb3dmaXNoLmh0bWwKKyAqCisgKiBBZGFwdGVkIGZyb20gS2VybmVsaSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgorICogQ29weXJpZ2h0IChjKSBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYmxvd2Zpc2guaD4KKworLyoKKyAqIFJvdW5kIGxvb3AgdW5yb2xsaW5nIG1hY3JvcywgUyBpcyBhIHBvaW50ZXIgdG8gYSBTLUJveCBhcnJheQorICogb3JnYW5pemVkIGluIDQgdW5zaWduZWQgbG9uZ3MgYXQgYSByb3cuCisgKi8KKyNkZWZpbmUgR0VUMzJfMyh4KSAoKCh4KSAmIDB4ZmYpKQorI2RlZmluZSBHRVQzMl8yKHgpICgoKHgpID4+ICg4KSkgJiAoMHhmZikpCisjZGVmaW5lIEdFVDMyXzEoeCkgKCgoeCkgPj4gKDE2KSkgJiAoMHhmZikpCisjZGVmaW5lIEdFVDMyXzAoeCkgKCgoeCkgPj4gKDI0KSkgJiAoMHhmZikpCisKKyNkZWZpbmUgYmZfRih4KSAoKChTW0dFVDMyXzAoeCldICsgU1syNTYgKyBHRVQzMl8xKHgpXSkgXiBcCisJCVNbNTEyICsgR0VUMzJfMih4KV0pICsgU1s3NjggKyBHRVQzMl8zKHgpXSkKKworI2RlZmluZSBST1VORChhLCBiLCBuKSAoeyBiIF49IFBbbl07IGEgXj0gYmZfRihiKTsgfSkKKworc3RhdGljIHZvaWQgYmZfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCXN0cnVjdCBiZl9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJY29uc3QgX19iZTMyICppbl9ibGsgPSAoY29uc3QgX19iZTMyICopc3JjOworCV9fYmUzMiAqY29uc3Qgb3V0X2JsayA9IChfX2JlMzIgKilkc3Q7CisJY29uc3QgdTMyICpQID0gY3R4LT5wOworCWNvbnN0IHUzMiAqUyA9IGN0eC0+czsKKwl1MzIgeWwgPSBiZTMyX3RvX2NwdShpbl9ibGtbMF0pOworCXUzMiB5ciA9IGJlMzJfdG9fY3B1KGluX2Jsa1sxXSk7CisKKwlST1VORCh5ciwgeWwsIDApOworCVJPVU5EKHlsLCB5ciwgMSk7CisJUk9VTkQoeXIsIHlsLCAyKTsKKwlST1VORCh5bCwgeXIsIDMpOworCVJPVU5EKHlyLCB5bCwgNCk7CisJUk9VTkQoeWwsIHlyLCA1KTsKKwlST1VORCh5ciwgeWwsIDYpOworCVJPVU5EKHlsLCB5ciwgNyk7CisJUk9VTkQoeXIsIHlsLCA4KTsKKwlST1VORCh5bCwgeXIsIDkpOworCVJPVU5EKHlyLCB5bCwgMTApOworCVJPVU5EKHlsLCB5ciwgMTEpOworCVJPVU5EKHlyLCB5bCwgMTIpOworCVJPVU5EKHlsLCB5ciwgMTMpOworCVJPVU5EKHlyLCB5bCwgMTQpOworCVJPVU5EKHlsLCB5ciwgMTUpOworCisJeWwgXj0gUFsxNl07CisJeXIgXj0gUFsxN107CisKKwlvdXRfYmxrWzBdID0gY3B1X3RvX2JlMzIoeXIpOworCW91dF9ibGtbMV0gPSBjcHVfdG9fYmUzMih5bCk7Cit9CisKK3N0YXRpYyB2b2lkIGJmX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKwlzdHJ1Y3QgYmZfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IF9fYmUzMiAqaW5fYmxrID0gKGNvbnN0IF9fYmUzMiAqKXNyYzsKKwlfX2JlMzIgKmNvbnN0IG91dF9ibGsgPSAoX19iZTMyICopZHN0OworCWNvbnN0IHUzMiAqUCA9IGN0eC0+cDsKKwljb25zdCB1MzIgKlMgPSBjdHgtPnM7CisJdTMyIHlsID0gYmUzMl90b19jcHUoaW5fYmxrWzBdKTsKKwl1MzIgeXIgPSBiZTMyX3RvX2NwdShpbl9ibGtbMV0pOworCisJUk9VTkQoeXIsIHlsLCAxNyk7CisJUk9VTkQoeWwsIHlyLCAxNik7CisJUk9VTkQoeXIsIHlsLCAxNSk7CisJUk9VTkQoeWwsIHlyLCAxNCk7CisJUk9VTkQoeXIsIHlsLCAxMyk7CisJUk9VTkQoeWwsIHlyLCAxMik7CisJUk9VTkQoeXIsIHlsLCAxMSk7CisJUk9VTkQoeWwsIHlyLCAxMCk7CisJUk9VTkQoeXIsIHlsLCA5KTsKKwlST1VORCh5bCwgeXIsIDgpOworCVJPVU5EKHlyLCB5bCwgNyk7CisJUk9VTkQoeWwsIHlyLCA2KTsKKwlST1VORCh5ciwgeWwsIDUpOworCVJPVU5EKHlsLCB5ciwgNCk7CisJUk9VTkQoeXIsIHlsLCAzKTsKKwlST1VORCh5bCwgeXIsIDIpOworCisJeWwgXj0gUFsxXTsKKwl5ciBePSBQWzBdOworCisJb3V0X2Jsa1swXSA9IGNwdV90b19iZTMyKHlyKTsKKwlvdXRfYmxrWzFdID0gY3B1X3RvX2JlMzIoeWwpOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWxnID0geworCS5jcmFfbmFtZQkJPQkiYmxvd2Zpc2giLAorCS5jcmFfZHJpdmVyX25hbWUJPQkiYmxvd2Zpc2gtZ2VuZXJpYyIsCisJLmNyYV9wcmlvcml0eQkJPQkxMDAsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9CUJGX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYmZfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQkzLAorCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPQlMSVNUX0hFQURfSU5JVChhbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0geworCS5jaWFfbWluX2tleXNpemUJPQlCRl9NSU5fS0VZX1NJWkUsCisJLmNpYV9tYXhfa2V5c2l6ZQk9CUJGX01BWF9LRVlfU0laRSwKKwkuY2lhX3NldGtleQkJPQlibG93ZmlzaF9zZXRrZXksCisJLmNpYV9lbmNyeXB0CQk9CWJmX2VuY3J5cHQsCisJLmNpYV9kZWNyeXB0CQk9CWJmX2RlY3J5cHQgfSB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBibG93ZmlzaF9tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmxvd2Zpc2hfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFsZyk7Cit9CisKK21vZHVsZV9pbml0KGJsb3dmaXNoX21vZF9pbml0KTsKK21vZHVsZV9leGl0KGJsb3dmaXNoX21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG93ZmlzaCBDaXBoZXIgQWxnb3JpdGhtIik7CitNT0RVTEVfQUxJQVMoImJsb3dmaXNoIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vY3J5cHRkLmMgYi9jcnlwdG8vY3J5cHRkLmMKaW5kZXggZTQ2ZDIxYS4uNjcxZDRkNiAxMDA2NDQKLS0tIGEvY3J5cHRvL2NyeXB0ZC5jCisrKyBiL2NyeXB0by9jcnlwdGQuYwpAQCAtOTQ1LDcgKzk0NSw3IEBACiAJY3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoJmNyeXB0ZF90bXBsKTsKIH0KIAotbW9kdWxlX2luaXQoY3J5cHRkX2luaXQpOworc3Vic3lzX2luaXRjYWxsKGNyeXB0ZF9pbml0KTsKIG1vZHVsZV9leGl0KGNyeXB0ZF9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b191c2VyLmMgYi9jcnlwdG8vY3J5cHRvX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjA1YTJiCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2NyeXB0b191c2VyLmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDcnlwdG8gdXNlciBjb25maWd1cmF0aW9uIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgc2VjdW5ldCBTZWN1cml0eSBOZXR3b3JrcyBBRworICogQ29weXJpZ2h0IChDKSAyMDExIFN0ZWZmZW4gS2xhc3NlcnQgPHN0ZWZmZW4ua2xhc3NlcnRAc2VjdW5ldC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK0RFRklORV9NVVRFWChjcnlwdG9fY2ZnX211dGV4KTsKKworLyogVGhlIGNyeXB0byBuZXRsaW5rIHNvY2tldCAqLworc3RhdGljIHN0cnVjdCBzb2NrICpjcnlwdG9fbmxzazsKKworc3RydWN0IGNyeXB0b19kdW1wX2luZm8geworCXN0cnVjdCBza19idWZmICppbl9za2I7CisJc3RydWN0IHNrX2J1ZmYgKm91dF9za2I7CisJdTMyIG5sbXNnX3NlcTsKKwl1MTYgbmxtc2dfZmxhZ3M7Cit9OworCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbWF0Y2goc3RydWN0IGNyeXB0b191c2VyX2FsZyAqcCwgaW50IGV4YWN0KQoreworCXN0cnVjdCBjcnlwdG9fYWxnICpxLCAqYWxnID0gTlVMTDsKKworCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgeworCQlpbnQgbWF0Y2ggPSAwOworCisJCWlmICgocS0+Y3JhX2ZsYWdzIF4gcC0+Y3J1X3R5cGUpICYgcC0+Y3J1X21hc2spCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybGVuKHAtPmNydV9kcml2ZXJfbmFtZSkpCisJCQltYXRjaCA9ICFzdHJjbXAocS0+Y3JhX2RyaXZlcl9uYW1lLAorCQkJCQlwLT5jcnVfZHJpdmVyX25hbWUpOworCQllbHNlIGlmICghZXhhY3QpCisJCQltYXRjaCA9ICFzdHJjbXAocS0+Y3JhX25hbWUsIHAtPmNydV9uYW1lKTsKKworCQlpZiAobWF0Y2gpIHsKKwkJCWFsZyA9IHE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXVwX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKworCXJldHVybiBhbGc7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3JlcG9ydF9jaXBoZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jaXBoZXIgcmNpcGhlcjsKKworCXNucHJpbnRmKHJjaXBoZXIudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImNpcGhlciIpOworCisJcmNpcGhlci5ibG9ja3NpemUgPSBhbGctPmNyYV9ibG9ja3NpemU7CisJcmNpcGhlci5taW5fa2V5c2l6ZSA9IGFsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7CisJcmNpcGhlci5tYXhfa2V5c2l6ZSA9IGFsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfQ0lQSEVSLAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfY2lwaGVyKSwgJnJjaXBoZXIpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZXBvcnRfY29tcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X2NvbXAgcmNvbXA7CisKKwlzbnByaW50ZihyY29tcC50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAiY29tcHJlc3Npb24iKTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9DT01QUkVTUywKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2NvbXApLCAmcmNvbXApOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZXBvcnRfb25lKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCisJCQkgICAgIHN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnVhbGcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJbWVtY3B5KCZ1YWxnLT5jcnVfbmFtZSwgJmFsZy0+Y3JhX25hbWUsIHNpemVvZih1YWxnLT5jcnVfbmFtZSkpOworCW1lbWNweSgmdWFsZy0+Y3J1X2RyaXZlcl9uYW1lLCAmYWxnLT5jcmFfZHJpdmVyX25hbWUsCisJICAgICAgIHNpemVvZih1YWxnLT5jcnVfZHJpdmVyX25hbWUpKTsKKwltZW1jcHkoJnVhbGctPmNydV9tb2R1bGVfbmFtZSwgbW9kdWxlX25hbWUoYWxnLT5jcmFfbW9kdWxlKSwKKwkgICAgICAgQ1JZUFRPX01BWF9BTEdfTkFNRSk7CisKKwl1YWxnLT5jcnVfZmxhZ3MgPSBhbGctPmNyYV9mbGFnczsKKwl1YWxnLT5jcnVfcmVmY250ID0gYXRvbWljX3JlYWQoJmFsZy0+Y3JhX3JlZmNudCk7CisKKwlOTEFfUFVUX1UzMihza2IsIENSWVBUT0NGR0FfUFJJT1JJVFlfVkFMLCBhbGctPmNyYV9wcmlvcml0eSk7CisKKwlpZiAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX0xBUlZBTCkgeworCQlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9sYXJ2YWwgcmw7CisKKwkJc25wcmludGYocmwudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgImxhcnZhbCIpOworCisJCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9MQVJWQUwsCisJCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfbGFydmFsKSwgJnJsKTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWxnLT5jcmFfdHlwZSAmJiBhbGctPmNyYV90eXBlLT5yZXBvcnQpIHsKKwkJaWYgKGFsZy0+Y3JhX3R5cGUtPnJlcG9ydChza2IsIGFsZykpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGFsZy0+Y3JhX2ZsYWdzICYgKENSWVBUT19BTEdfVFlQRV9NQVNLIHwgQ1JZUFRPX0FMR19MQVJWQUwpKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQlpZiAoY3J5cHRvX3JlcG9ydF9jaXBoZXIoc2tiLCBhbGcpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJYnJlYWs7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1M6CisJCWlmIChjcnlwdG9fcmVwb3J0X2NvbXAoc2tiLCBhbGcpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGNyeXB0b19yZXBvcnRfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCisJCQkgICAgIHN0cnVjdCBjcnlwdG9fZHVtcF9pbmZvICppbmZvKQoreworCXN0cnVjdCBza19idWZmICppbl9za2IgPSBpbmZvLT5pbl9za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGluZm8tPm91dF9za2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IGNyeXB0b191c2VyX2FsZyAqdWFsZzsKKwlpbnQgZXJyID0gMDsKKworCW5saCA9IG5sbXNnX3B1dChza2IsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsIGluZm8tPm5sbXNnX3NlcSwKKwkJCUNSWVBUT19NU0dfR0VUQUxHLCBzaXplb2YoKnVhbGcpLCBpbmZvLT5ubG1zZ19mbGFncyk7CisJaWYgKCFubGgpIHsKKwkJZXJyID0gLUVNU0dTSVpFOworCQlnb3RvIG91dDsKKwl9CisKKwl1YWxnID0gbmxtc2dfZGF0YShubGgpOworCisJZXJyID0gY3J5cHRvX3JlcG9ydF9vbmUoYWxnLCB1YWxnLCBza2IpOworCWlmIChlcnIpIHsKKwkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmxtc2dfZW5kKHNrYiwgbmxoKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKmluX25saCwKKwkJCSBzdHJ1Y3QgbmxhdHRyICoqYXR0cnMpCit7CisJc3RydWN0IGNyeXB0b191c2VyX2FsZyAqcCA9IG5sbXNnX2RhdGEoaW5fbmxoKTsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNyeXB0b19kdW1wX2luZm8gaW5mbzsKKwlpbnQgZXJyOworCisJaWYgKCFwLT5jcnVfZHJpdmVyX25hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJYWxnID0gY3J5cHRvX2FsZ19tYXRjaChwLCAxKTsKKwlpZiAoIWFsZykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlza2IgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLmluX3NrYiA9IGluX3NrYjsKKwlpbmZvLm91dF9za2IgPSBza2I7CisJaW5mby5ubG1zZ19zZXEgPSBpbl9ubGgtPm5sbXNnX3NlcTsKKwlpbmZvLm5sbXNnX2ZsYWdzID0gMDsKKworCWVyciA9IGNyeXB0b19yZXBvcnRfYWxnKGFsZywgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbmxtc2dfdW5pY2FzdChjcnlwdG9fbmxzaywgc2tiLCBORVRMSU5LX0NCKGluX3NrYikucGlkKTsKK30KKworc3RhdGljIGludCBjcnlwdG9fZHVtcF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJc3RydWN0IGNyeXB0b19kdW1wX2luZm8gaW5mbzsKKwlpbnQgZXJyOworCisJaWYgKGNiLT5hcmdzWzBdKQorCQlnb3RvIG91dDsKKworCWNiLT5hcmdzWzBdID0gMTsKKworCWluZm8uaW5fc2tiID0gY2ItPnNrYjsKKwlpbmZvLm91dF9za2IgPSBza2I7CisJaW5mby5ubG1zZ19zZXEgPSBjYi0+bmxoLT5ubG1zZ19zZXE7CisJaW5mby5ubG1zZ19mbGFncyA9IE5MTV9GX01VTFRJOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhbGcsICZjcnlwdG9fYWxnX2xpc3QsIGNyYV9saXN0KSB7CisJCWVyciA9IGNyeXB0b19yZXBvcnRfYWxnKGFsZywgJmluZm8pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZXJyOworCX0KKworb3V0OgorCXJldHVybiBza2ItPmxlbjsKK291dF9lcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjcnlwdG9fZHVtcF9yZXBvcnRfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3VwZGF0ZV9hbGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICAgIHN0cnVjdCBubGF0dHIgKiphdHRycykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXN0cnVjdCBjcnlwdG9fdXNlcl9hbGcgKnAgPSBubG1zZ19kYXRhKG5saCk7CisJc3RydWN0IG5sYXR0ciAqcHJpb3JpdHkgPSBhdHRyc1tDUllQVE9DRkdBX1BSSU9SSVRZX1ZBTF07CisJTElTVF9IRUFEKGxpc3QpOworCisJaWYgKHByaW9yaXR5ICYmICFzdHJsZW4ocC0+Y3J1X2RyaXZlcl9uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhbGcgPSBjcnlwdG9fYWxnX21hdGNoKHAsIDEpOworCWlmICghYWxnKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKworCWNyeXB0b19yZW1vdmVfc3Bhd25zKGFsZywgJmxpc3QsIE5VTEwpOworCisJaWYgKHByaW9yaXR5KQorCQlhbGctPmNyYV9wcmlvcml0eSA9IG5sYV9nZXRfdTMyKHByaW9yaXR5KTsKKworCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisKKwljcnlwdG9fcmVtb3ZlX2ZpbmFsKCZsaXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0b19kZWxfYWxnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJICBzdHJ1Y3QgbmxhdHRyICoqYXR0cnMpCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKKwlzdHJ1Y3QgY3J5cHRvX3VzZXJfYWxnICpwID0gbmxtc2dfZGF0YShubGgpOworCisJYWxnID0gY3J5cHRvX2FsZ19tYXRjaChwLCAxKTsKKwlpZiAoIWFsZykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiBXZSBjYW4gbm90IHVucmVnaXN0ZXIgY29yZSBhbGdvcml0aG1zIHN1Y2ggYXMgYWVzLWdlbmVyaWMuCisJICogV2Ugd291bGQgbG9vc2UgdGhlIHJlZmVyZW5jZSBpbiB0aGUgY3J5cHRvX2FsZ19saXN0IHRvIHRoaXMgYWxnb3JpdGhtCisJICogaWYgd2UgdHJ5IHRvIHVucmVnaXN0ZXIuIFVucmVnaXN0ZXJpbmcgc3VjaCBhbiBhbGdvcml0aG0gd2l0aG91dAorCSAqIHJlbW92aW5nIHRoZSBtb2R1bGUgaXMgbm90IHBvc3NpYmxlLCBzbyB3ZSByZXN0cmljdCB0byBjcnlwdG8KKwkgKiBpbnN0YW5jZXMgdGhhdCBhcmUgYnVpbGQgZnJvbSB0ZW1wbGF0ZXMuICovCisJaWYgKCEoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX0lOU1RBTkNFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYXRvbWljX3JlYWQoJmFsZy0+Y3JhX3JlZmNudCkgIT0gMSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoYWxnKTsKK30KKworc3RhdGljIGludCBjcnlwdG9fYWRkX2FsZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCSAgc3RydWN0IG5sYXR0ciAqKmF0dHJzKQoreworCWludCBleGFjdDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJc3RydWN0IGNyeXB0b191c2VyX2FsZyAqcCA9IG5sbXNnX2RhdGEobmxoKTsKKwlzdHJ1Y3QgbmxhdHRyICpwcmlvcml0eSA9IGF0dHJzW0NSWVBUT0NGR0FfUFJJT1JJVFlfVkFMXTsKKworCWlmIChzdHJsZW4ocC0+Y3J1X2RyaXZlcl9uYW1lKSkKKwkJZXhhY3QgPSAxOworCisJaWYgKHByaW9yaXR5ICYmICFleGFjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhbGcgPSBjcnlwdG9fYWxnX21hdGNoKHAsIGV4YWN0KTsKKwlpZiAoYWxnKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmIChzdHJsZW4ocC0+Y3J1X2RyaXZlcl9uYW1lKSkKKwkJbmFtZSA9IHAtPmNydV9kcml2ZXJfbmFtZTsKKwllbHNlCisJCW5hbWUgPSBwLT5jcnVfbmFtZTsKKworCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lLCBwLT5jcnVfdHlwZSwgcC0+Y3J1X21hc2spOworCWlmIChJU19FUlIoYWxnKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWxnKTsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKworCWlmIChwcmlvcml0eSkKKwkJYWxnLT5jcmFfcHJpb3JpdHkgPSBubGFfZ2V0X3UzMihwcmlvcml0eSk7CisKKwl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCisJY3J5cHRvX21vZF9wdXQoYWxnKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1TR1NJWkUodHlwZSkgc2l6ZW9mKHN0cnVjdCB0eXBlKQorCitzdGF0aWMgY29uc3QgaW50IGNyeXB0b19tc2dfbWluW0NSWVBUT19OUl9NU0dUWVBFU10gPSB7CisJW0NSWVBUT19NU0dfTkVXQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IE1TR1NJWkUoY3J5cHRvX3VzZXJfYWxnKSwKKwlbQ1JZUFRPX01TR19ERUxBTEcJLSBDUllQVE9fTVNHX0JBU0VdID0gTVNHU0laRShjcnlwdG9fdXNlcl9hbGcpLAorCVtDUllQVE9fTVNHX1VQREFURUFMRwktIENSWVBUT19NU0dfQkFTRV0gPSBNU0dTSVpFKGNyeXB0b191c2VyX2FsZyksCisJW0NSWVBUT19NU0dfR0VUQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IE1TR1NJWkUoY3J5cHRvX3VzZXJfYWxnKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBjcnlwdG9fcG9saWN5W0NSWVBUT0NGR0FfTUFYKzFdID0geworCVtDUllQVE9DRkdBX1BSSU9SSVRZX1ZBTF0gICA9IHsgLnR5cGUgPSBOTEFfVTMyfSwKK307CisKKyN1bmRlZiBNU0dTSVpFCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2xpbmsgeworCWludCAoKmRvaXQpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBubG1zZ2hkciAqLCBzdHJ1Y3QgbmxhdHRyICoqKTsKKwlpbnQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqKTsKKwlpbnQgKCpkb25lKShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqKTsKK30gY3J5cHRvX2Rpc3BhdGNoW0NSWVBUT19OUl9NU0dUWVBFU10gPSB7CisJW0NSWVBUT19NU0dfTkVXQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IHsgLmRvaXQgPSBjcnlwdG9fYWRkX2FsZ30sCisJW0NSWVBUT19NU0dfREVMQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IHsgLmRvaXQgPSBjcnlwdG9fZGVsX2FsZ30sCisJW0NSWVBUT19NU0dfVVBEQVRFQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IHsgLmRvaXQgPSBjcnlwdG9fdXBkYXRlX2FsZ30sCisJW0NSWVBUT19NU0dfR0VUQUxHCS0gQ1JZUFRPX01TR19CQVNFXSA9IHsgLmRvaXQgPSBjcnlwdG9fcmVwb3J0LAorCQkJCQkJICAgICAgIC5kdW1wID0gY3J5cHRvX2R1bXBfcmVwb3J0LAorCQkJCQkJICAgICAgIC5kb25lID0gY3J5cHRvX2R1bXBfcmVwb3J0X2RvbmV9LAorfTsKKworc3RhdGljIGludCBjcnlwdG9fdXNlcl9yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXN0cnVjdCBubGF0dHIgKmF0dHJzW0NSWVBUT0NGR0FfTUFYKzFdOworCXN0cnVjdCBjcnlwdG9fbGluayAqbGluazsKKwlpbnQgdHlwZSwgZXJyOworCisJdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKKwlpZiAodHlwZSA+IENSWVBUT19NU0dfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR5cGUgLT0gQ1JZUFRPX01TR19CQVNFOworCWxpbmsgPSAmY3J5cHRvX2Rpc3BhdGNoW3R5cGVdOworCisJaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCh0eXBlID09IChDUllQVE9fTVNHX0dFVEFMRyAtIENSWVBUT19NU0dfQkFTRSkgJiYKKwkgICAgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSkpIHsKKwkJaWYgKGxpbmstPmR1bXAgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoY3J5cHRvX25sc2ssIHNrYiwgbmxoLAorCQkJCQkgIGxpbmstPmR1bXAsIGxpbmstPmRvbmUsIDApOworCX0KKworCWVyciA9IG5sbXNnX3BhcnNlKG5saCwgY3J5cHRvX21zZ19taW5bdHlwZV0sIGF0dHJzLCBDUllQVE9DRkdBX01BWCwKKwkJCSAgY3J5cHRvX3BvbGljeSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAobGluay0+ZG9pdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBsaW5rLT5kb2l0KHNrYiwgbmxoLCBhdHRycyk7Cit9CisKK3N0YXRpYyB2b2lkIGNyeXB0b19uZXRsaW5rX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCW11dGV4X2xvY2soJmNyeXB0b19jZmdfbXV0ZXgpOworCW5ldGxpbmtfcmN2X3NrYihza2IsICZjcnlwdG9fdXNlcl9yY3ZfbXNnKTsKKwltdXRleF91bmxvY2soJmNyeXB0b19jZmdfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcnlwdG9fdXNlcl9pbml0KHZvaWQpCit7CisJY3J5cHRvX25sc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoJmluaXRfbmV0LCBORVRMSU5LX0NSWVBUTywKKwkJCQkJICAgIDAsIGNyeXB0b19uZXRsaW5rX3JjdiwKKwkJCQkJICAgIE5VTEwsIFRISVNfTU9EVUxFKTsKKwlpZiAoIWNyeXB0b19ubHNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3J5cHRvX3VzZXJfZXhpdCh2b2lkKQoreworCW5ldGxpbmtfa2VybmVsX3JlbGVhc2UoY3J5cHRvX25sc2spOworfQorCittb2R1bGVfaW5pdChjcnlwdG9fdXNlcl9pbml0KTsKK21vZHVsZV9leGl0KGNyeXB0b191c2VyX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU3RlZmZlbiBLbGFzc2VydCA8c3RlZmZlbi5rbGFzc2VydEBzZWN1bmV0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3J5cHRvIHVzZXJzcGFjZSBjb25maWd1cmF0aW9uIEFQSSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b193cS5jIGIvY3J5cHRvL2NyeXB0b193cS5jCmluZGV4IGI5ODBlZTEuLmFkYWQ5MmEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jcnlwdG9fd3EuYworKysgYi9jcnlwdG8vY3J5cHRvX3dxLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgogI2luY2x1ZGUgPGNyeXB0by9jcnlwdG9fd3EuaD4KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2ludGVybmFsLmggYi9jcnlwdG8vaW50ZXJuYWwuaAppbmRleCBkNDM4NGIwLi5iODY1Y2ExIDEwMDY0NAotLS0gYS9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9jcnlwdG8vaW50ZXJuYWwuaApAQCAtODYsNiArODYsOSBAQAogdm9pZCBjcnlwdG9fbGFydmFsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiB2b2lkIGNyeXB0b19hbGdfdGVzdGVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlcnIpOwogCit2b2lkIGNyeXB0b19yZW1vdmVfc3Bhd25zKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkgIHN0cnVjdCBjcnlwdG9fYWxnICpuYWxnKTsKK3ZvaWQgY3J5cHRvX3JlbW92ZV9maW5hbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKIHZvaWQgY3J5cHRvX3Nob290X2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKIHN0cnVjdCBjcnlwdG9fdGZtICpfX2NyeXB0b19hbGxvY190Zm0oc3RydWN0IGNyeXB0b19hbGcgKmFsZywgdTMyIHR5cGUsCiAJCQkJICAgICAgdTMyIG1hc2spOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL21kNC5jIGIvY3J5cHRvL21kNC5jCmluZGV4IDdmY2ExZjU5Li4wNDc3YTZhIDEwMDY0NAotLS0gYS9jcnlwdG8vbWQ0LmMKKysrIGIvY3J5cHRvL21kNC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CmRpZmYgLS1naXQgYS9jcnlwdG8vcGNvbXByZXNzLmMgYi9jcnlwdG8vcGNvbXByZXNzLmMKaW5kZXggZjdjNGE3ZC4uMmU0NThlNSAxMDA2NDQKLS0tIGEvY3J5cHRvL3Bjb21wcmVzcy5jCisrKyBiL2NyeXB0by9wY29tcHJlc3MuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlIDxjcnlwdG8vY29tcHJlc3MuaD4KICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvY29tcHJlc3MuaD4KQEAgLTQ2LDYgKzQ4LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19wY29tcF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jb21wIHJwY29tcDsKKworCXNucHJpbnRmKHJwY29tcC50eXBlLCBDUllQVE9fTUFYX0FMR19OQU1FLCAiJXMiLCAicGNvbXAiKTsKKworCU5MQV9QVVQoc2tiLCBDUllQVE9DRkdBX1JFUE9SVF9DT01QUkVTUywKKwkJc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcmVwb3J0X2NvbXApLCAmcnBjb21wKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19wY29tcF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fcGNvbXBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX3Bjb21wX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtNjAsNiArODQsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cJCT0gY3J5cHRvX3Bjb21wX3Nob3csCiAjZW5kaWYKKwkucmVwb3J0CQk9IGNyeXB0b19wY29tcF9yZXBvcnQsCiAJLm1hc2tjbGVhcgk9IH5DUllQVE9fQUxHX1RZUEVfTUFTSywKIAkubWFza3NldAk9IENSWVBUT19BTEdfVFlQRV9NQVNLLAogCS50eXBlCQk9IENSWVBUT19BTEdfVFlQRV9QQ09NUFJFU1MsCmRpZmYgLS1naXQgYS9jcnlwdG8vcHJvYy5jIGIvY3J5cHRvL3Byb2MuYwppbmRleCAzODA4Njk3Li40YTBhN2FhIDEwMDY0NAotLS0gYS9jcnlwdG8vcHJvYy5jCisrKyBiL2NyeXB0by9wcm9jLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIGZvciBtb2R1bGVfbmFtZSgpICovCiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2NyeXB0by9ybmcuYyBiL2NyeXB0by9ybmcuYwppbmRleCA0NTIyOWFlLi42NGY4NjRmIDEwMDY0NAotLS0gYS9jcnlwdG8vcm5nLmMKKysrIGIvY3J5cHRvL3JuZy5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvdXNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY3J5cHRvX2RlZmF1bHRfcm5nX2xvY2spOwogc3RydWN0IGNyeXB0b19ybmcgKmNyeXB0b19kZWZhdWx0X3JuZzsKQEAgLTU4LDYgKzYwLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGNyeXB0b19ybmdfcmVwb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJc3RydWN0IGNyeXB0b19yZXBvcnRfcm5nIHJybmc7CisKKwlzbnByaW50Zihycm5nLnR5cGUsIENSWVBUT19NQVhfQUxHX05BTUUsICIlcyIsICJybmciKTsKKworCXJybmcuc2VlZHNpemUgPSBhbGctPmNyYV9ybmcuc2VlZHNpemU7CisKKwlOTEFfUFVUKHNrYiwgQ1JZUFRPQ0ZHQV9SRVBPUlRfUk5HLAorCQlzaXplb2Yoc3RydWN0IGNyeXB0b19yZXBvcnRfcm5nKSwgJnJybmcpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgY3J5cHRvX3JuZ19yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fcm5nX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQogCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKIHN0YXRpYyB2b2lkIGNyeXB0b19ybmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCkBAIC03OCw2ICsxMDQsNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLnNob3cgPSBjcnlwdG9fcm5nX3Nob3csCiAjZW5kaWYKKwkucmVwb3J0ID0gY3J5cHRvX3JuZ19yZXBvcnQsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JuZ190eXBlKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jIGIvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jCmluZGV4IDAwYWU2MGUuLjQyNzk0ODAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9zaGExX2dlbmVyaWMuYworKysgYi9jcnlwdG8vc2hhMV9nZW5lcmljLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCitpbnQgY3J5cHRvX3NoYTFfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKIAkJCXVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKQEAgLTcxLDYgKzcxLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChjcnlwdG9fc2hhMV91cGRhdGUpOwogCiAKIC8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLwpAQCAtODcsMTAgKzg4LDEwIEBACiAJLyogUGFkIG91dCB0byA1NiBtb2QgNjQgKi8KIAlpbmRleCA9IHNjdHgtPmNvdW50ICYgMHgzZjsKIAlwYWRsZW4gPSAoaW5kZXggPCA1NikgPyAoNTYgLSBpbmRleCkgOiAoKDY0KzU2KSAtIGluZGV4KTsKLQlzaGExX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4pOworCWNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4pOwogCiAJLyogQXBwZW5kIGxlbmd0aCAqLwotCXNoYTFfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOworCWNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKIAogCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCkBAIC0xMjEsNyArMTIyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGFsZyA9IHsKIAkuZGlnZXN0c2l6ZQk9CVNIQTFfRElHRVNUX1NJWkUsCiAJLmluaXQJCT0Jc2hhMV9pbml0LAotCS51cGRhdGUJCT0Jc2hhMV91cGRhdGUsCisJLnVwZGF0ZQkJPQljcnlwdG9fc2hhMV91cGRhdGUsCiAJLmZpbmFsCQk9CXNoYTFfZmluYWwsCiAJLmV4cG9ydAkJPQlzaGExX2V4cG9ydCwKIAkuaW1wb3J0CQk9CXNoYTFfaW1wb3J0LApkaWZmIC0tZ2l0IGEvY3J5cHRvL3NoYXNoLmMgYi9jcnlwdG8vc2hhc2guYwppbmRleCA3NmY3NGI5Li45MTAwOTEyNyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYXNoLmMKKysrIGIvY3J5cHRvL3NoYXNoLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG91c2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTUyMiw2ICs1MjQsMzEgQEAKIAlyZXR1cm4gYWxnLT5jcmFfY3R4c2l6ZTsKIH0KIAorI2lmZGVmIENPTkZJR19ORVQKK3N0YXRpYyBpbnQgY3J5cHRvX3NoYXNoX3JlcG9ydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCXN0cnVjdCBjcnlwdG9fcmVwb3J0X2hhc2ggcmhhc2g7CisJc3RydWN0IHNoYXNoX2FsZyAqc2FsZyA9IF9fY3J5cHRvX3NoYXNoX2FsZyhhbGcpOworCisJc25wcmludGYocmhhc2gudHlwZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwgInNoYXNoIik7CisJcmhhc2guYmxvY2tzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCXJoYXNoLmRpZ2VzdHNpemUgPSBzYWxnLT5kaWdlc3RzaXplOworCisJTkxBX1BVVChza2IsIENSWVBUT0NGR0FfUkVQT1JUX0hBU0gsCisJCXNpemVvZihzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9oYXNoKSwgJnJoYXNoKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNyeXB0b19zaGFzaF9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBjcnlwdG9fc2hhc2hfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCiAJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgY3J5cHRvX3NoYXNoX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQpAQCAtNTQxLDYgKzU2OCw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAkuc2hvdyA9IGNyeXB0b19zaGFzaF9zaG93LAogI2VuZGlmCisJLnJlcG9ydCA9IGNyeXB0b19zaGFzaF9yZXBvcnQsCiAJLm1hc2tjbGVhciA9IH5DUllQVE9fQUxHX1RZUEVfTUFTSywKIAkubWFza3NldCA9IENSWVBUT19BTEdfVFlQRV9NQVNLLAogCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX1NIQVNILApkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5jIGIvY3J5cHRvL3RjcnlwdC5jCmluZGV4IDIyMjI2MTcuLjBjNGU4MGYgMTAwNjQ0Ci0tLSBhL2NyeXB0by90Y3J5cHQuYworKysgYi9jcnlwdG8vdGNyeXB0LmMKQEAgLTc4MiwxMSArNzgyLDEzIEBACiAJY2FzZSA3OgogCQlyZXQgKz0gdGNyeXB0X3Rlc3QoImVjYihibG93ZmlzaCkiKTsKIAkJcmV0ICs9IHRjcnlwdF90ZXN0KCJjYmMoYmxvd2Zpc2gpIik7CisJCXJldCArPSB0Y3J5cHRfdGVzdCgiY3RyKGJsb3dmaXNoKSIpOwogCQlicmVhazsKIAogCWNhc2UgODoKIAkJcmV0ICs9IHRjcnlwdF90ZXN0KCJlY2IodHdvZmlzaCkiKTsKIAkJcmV0ICs9IHRjcnlwdF90ZXN0KCJjYmModHdvZmlzaCkiKTsKKwkJcmV0ICs9IHRjcnlwdF90ZXN0KCJjdHIodHdvZmlzaCkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIDk6CkBAIC0xMDM5LDYgKzEwNDEsMTAgQEAKIAkJCQlzcGVlZF90ZW1wbGF0ZV8xNl8yNF8zMik7CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJjYmModHdvZmlzaCkiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCiAJCQkJc3BlZWRfdGVtcGxhdGVfMTZfMjRfMzIpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgiY3RyKHR3b2Zpc2gpIiwgRU5DUllQVCwgc2VjLCBOVUxMLCAwLAorCQkJCXNwZWVkX3RlbXBsYXRlXzE2XzI0XzMyKTsKKwkJdGVzdF9jaXBoZXJfc3BlZWQoImN0cih0d29maXNoKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQlzcGVlZF90ZW1wbGF0ZV8xNl8yNF8zMik7CiAJCWJyZWFrOwogCiAJY2FzZSAyMDM6CkBAIC0xMDUwLDYgKzEwNTYsMTAgQEAKIAkJCQkgIHNwZWVkX3RlbXBsYXRlXzhfMzIpOwogCQl0ZXN0X2NpcGhlcl9zcGVlZCgiY2JjKGJsb3dmaXNoKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKIAkJCQkgIHNwZWVkX3RlbXBsYXRlXzhfMzIpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgiY3RyKGJsb3dmaXNoKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQkgIHNwZWVkX3RlbXBsYXRlXzhfMzIpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgiY3RyKGJsb3dmaXNoKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQkgIHNwZWVkX3RlbXBsYXRlXzhfMzIpOwogCQlicmVhazsKIAogCWNhc2UgMjA0OgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuYyBiL2NyeXB0by90ZXN0bWdyLmMKaW5kZXggYjZiOTNkNC4uZTkxYzFlYiAxMDA2NDQKLS0tIGEvY3J5cHRvL3Rlc3RtZ3IuYworKysgYi9jcnlwdG8vdGVzdG1nci5jCkBAIC0xNzU2LDYgKzE3NTYsMzYgQEAKIAkJCX0KIAkJfQogCX0sIHsKKwkJLmFsZyA9ICJjdHIoYmxvd2Zpc2gpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKKwkJLnN1aXRlID0geworCQkJLmNpcGhlciA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGJmX2N0cl9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEJGX0NUUl9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGJmX2N0cl9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEJGX0NUUl9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCQkuYWxnID0gImN0cih0d29maXNoKSIsCisJCS50ZXN0ID0gYWxnX3Rlc3Rfc2tjaXBoZXIsCisJCS5zdWl0ZSA9IHsKKwkJCS5jaXBoZXIgPSB7CisJCQkJLmVuYyA9IHsKKwkJCQkJLnZlY3MgPSB0Zl9jdHJfZW5jX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBURl9DVFJfRU5DX1RFU1RfVkVDVE9SUworCQkJCX0sCisJCQkJLmRlYyA9IHsKKwkJCQkJLnZlY3MgPSB0Zl9jdHJfZGVjX3R2X3RlbXBsYXRlLAorCQkJCQkuY291bnQgPSBURl9DVFJfREVDX1RFU1RfVkVDVE9SUworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHsKIAkJLmFsZyA9ICJjdHMoY2JjKGFlcykpIiwKIAkJLnRlc3QgPSBhbGdfdGVzdF9za2NpcGhlciwKIAkJLnN1aXRlID0gewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuaCBiL2NyeXB0by90ZXN0bWdyLmgKaW5kZXggMjdhZGM5Mi4uMzdiNGQ4ZiAxMDA2NDQKLS0tIGEvY3J5cHRvL3Rlc3RtZ3IuaAorKysgYi9jcnlwdG8vdGVzdG1nci5oCkBAIC0yMzkxLDEwICsyMzkxLDEyIEBACiAvKgogICogQmxvd2Zpc2ggdGVzdCB2ZWN0b3JzLgogICovCi0jZGVmaW5lIEJGX0VOQ19URVNUX1ZFQ1RPUlMJNgotI2RlZmluZSBCRl9ERUNfVEVTVF9WRUNUT1JTCTYKLSNkZWZpbmUgQkZfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMJMQotI2RlZmluZSBCRl9DQkNfREVDX1RFU1RfVkVDVE9SUwkxCisjZGVmaW5lIEJGX0VOQ19URVNUX1ZFQ1RPUlMJNworI2RlZmluZSBCRl9ERUNfVEVTVF9WRUNUT1JTCTcKKyNkZWZpbmUgQkZfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMJMgorI2RlZmluZSBCRl9DQkNfREVDX1RFU1RfVkVDVE9SUwkyCisjZGVmaW5lIEJGX0NUUl9FTkNfVEVTVF9WRUNUT1JTCTIKKyNkZWZpbmUgQkZfQ1RSX0RFQ19URVNUX1ZFQ1RPUlMJMgogCiBzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGJmX2VuY190dl90ZW1wbGF0ZVtdID0gewogCXsgLyogREVTIHRlc3QgdmVjdG9ycyBmcm9tIE9wZW5TU0wgKi8KQEAgLTI0NDgsNiArMjQ1MCwyNCBAQAogCQkuaWxlbgk9IDgsCiAJCS5yZXN1bHQJPSAiXHhjMFx4NDVceDA0XHgwMVx4MmVceDRlXHgxZlx4NTMiLAogCQkucmxlbgk9IDgsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiLAorCQkuaWxlbgk9IDQwLAorCQkucmVzdWx0CT0gIlx4OTZceDg3XHgzRFx4MENceDdCXHhGQlx4QkRceDFGIgorCQkJICAiXHhFM1x4QzFceDk5XHg2RFx4MzlceEQ0XHhDMlx4N0QiCisJCQkgICJceEQ3XHg4N1x4QTFceEYyXHhERlx4NTFceDcxXHgyNiIKKwkJCSAgIlx4QzJceEY0XHg2RFx4RkZceEY2XHhDRFx4NkJceDQwIgorCQkJICAiXHhFMVx4QjNceEJGXHhENFx4MzhceDJCXHhDOFx4M0IiLAorCQkucmxlbgk9IDQwLAogCX0sCiB9OwogCkBAIC0yNTAzLDYgKzI1MjMsMjQgQEAKIAkJLmlsZW4JPSA4LAogCQkucmVzdWx0CT0gIlx4ZmVceGRjXHhiYVx4OThceDc2XHg1NFx4MzJceDEwIiwKIAkJLnJsZW4JPSA4LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pbnB1dAk9ICJceDk2XHg4N1x4M0RceDBDXHg3Qlx4RkJceEJEXHgxRiIKKwkJCSAgIlx4RTNceEMxXHg5OVx4NkRceDM5XHhENFx4QzJceDdEIgorCQkJICAiXHhEN1x4ODdceEExXHhGMlx4REZceDUxXHg3MVx4MjYiCisJCQkgICJceEMyXHhGNFx4NkRceEZGXHhGNlx4Q0RceDZCXHg0MCIKKwkJCSAgIlx4RTFceEIzXHhCRlx4RDRceDM4XHgyQlx4QzhceDNCIiwKKwkJLmlsZW4JPSA0MCwKKwkJLnJlc3VsdAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IiwKKwkJLnJsZW4JPSA0MCwKIAl9LAogfTsKIApAQCAtMjUyMiw2ICsyNTYwLDI1IEBACiAJCQkgICJceDU4XHhkZVx4YjlceGU3XHgxNVx4NDZceDE2XHhkOSIKIAkJCSAgIlx4NTlceGYxXHg2NVx4MmJceGQ1XHhmZlx4OTJceGNjIiwKIAkJLnJsZW4JPSAzMiwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIsCisJCS5pbGVuCT0gNDAsCisJCS5yZXN1bHQJPSAiXHhCNFx4RkVceEE1XHhCQlx4M0RceDJDXHgyN1x4MDYiCisJCQkgICJceDA2XHgyQlx4M0FceDkyXHhCMlx4RjVceDVFXHg2MiIKKwkJCSAgIlx4ODRceENEXHhGN1x4NjZceDdFXHg0MVx4NkNceDhFIgorCQkJICAiXHgxQlx4RDlceDAyXHhCNlx4NDhceEIwXHg4N1x4MjUiCisJCQkgICJceDAxXHg5Q1x4OTNceDYzXHg1MVx4NjBceDgyXHhEMiIsCisJCS5ybGVuCT0gNDAsCiAJfSwKIH07CiAKQEAgLTI1NDEsMTYgKzI1OTgsMTI1IEBACiAJCQkgICJceDY4XHg2NVx4MjBceDc0XHg2OVx4NmRceDY1XHgyMCIKIAkJCSAgIlx4NjZceDZmXHg3Mlx4MjBceDAwXHgwMFx4MDBceDAwIiwKIAkJLnJsZW4JPSAzMiwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHhCNFx4RkVceEE1XHhCQlx4M0RceDJDXHgyN1x4MDYiCisJCQkgICJceDA2XHgyQlx4M0FceDkyXHhCMlx4RjVceDVFXHg2MiIKKwkJCSAgIlx4ODRceENEXHhGN1x4NjZceDdFXHg0MVx4NkNceDhFIgorCQkJICAiXHgxQlx4RDlceDAyXHhCNlx4NDhceEIwXHg4N1x4MjUiCisJCQkgICJceDAxXHg5Q1x4OTNceDYzXHg1MVx4NjBceDgyXHhEMiIsCisJCS5pbGVuCT0gNDAsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIsCisJCS5ybGVuCT0gNDAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfY3RyX2VuY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IiwKKwkJLmlsZW4JPSA0MCwKKwkJLnJlc3VsdAk9ICJceEM3XHhBM1x4REZceEI5XHgwNVx4RjRceDlFXHg4RCIKKwkJCSAgIlx4OUVceERGXHgzOFx4MThceDgzXHgwN1x4RUZceEMxIgorCQkJICAiXHg5M1x4M0NceEFBXHhBQVx4RkVceDA2XHg0Mlx4Q0MiCisJCQkgICJceDBEXHg3MFx4ODZceDVBXHg0NFx4QURceDg1XHgxNyIKKwkJCSAgIlx4RTRceDFGXHg1RVx4QTVceDg5XHhBQ1x4MzJceEJDIiwKKwkJLnJsZW4JPSA0MCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5QiIsCisJCS5pbGVuCT0gNDMsCisJCS5yZXN1bHQJPSAiXHhDN1x4QTNceERGXHhCOVx4MDVceEY0XHg5RVx4OEQiCisJCQkgICJceDlFXHhERlx4MzhceDE4XHg4M1x4MDdceEVGXHhDMSIKKwkJCSAgIlx4OTNceDNDXHhBQVx4QUFceEZFXHgwNlx4NDJceENDIgorCQkJICAiXHgwRFx4NzBceDg2XHg1QVx4NDRceEFEXHg4NVx4MTciCisJCQkgICJceEU0XHgxRlx4NUVceEE1XHg4OVx4QUNceDMyXHhCQyIKKwkJCSAgIlx4M0RceEE3XHhFOSIsCisJCS5ybGVuCT0gNDMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgYmZfY3RyX2RlY190dl90ZW1wbGF0ZVtdID0geworCXsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIsCisJCS5pbnB1dAk9ICJceEM3XHhBM1x4REZceEI5XHgwNVx4RjRceDlFXHg4RCIKKwkJCSAgIlx4OUVceERGXHgzOFx4MThceDgzXHgwN1x4RUZceEMxIgorCQkJICAiXHg5M1x4M0NceEFBXHhBQVx4RkVceDA2XHg0Mlx4Q0MiCisJCQkgICJceDBEXHg3MFx4ODZceDVBXHg0NFx4QURceDg1XHgxNyIKKwkJCSAgIlx4RTRceDFGXHg1RVx4QTVceDg5XHhBQ1x4MzJceEJDIiwKKwkJLmlsZW4JPSA0MCwKKwkJLnJlc3VsdAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IiwKKwkJLnJsZW4JPSA0MCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiLAorCQkuaW5wdXQJPSAiXHhDN1x4QTNceERGXHhCOVx4MDVceEY0XHg5RVx4OEQiCisJCQkgICJceDlFXHhERlx4MzhceDE4XHg4M1x4MDdceEVGXHhDMSIKKwkJCSAgIlx4OTNceDNDXHhBQVx4QUFceEZFXHgwNlx4NDJceENDIgorCQkJICAiXHgwRFx4NzBceDg2XHg1QVx4NDRceEFEXHg4NVx4MTciCisJCQkgICJceEU0XHgxRlx4NUVceEE1XHg4OVx4QUNceDMyXHhCQyIKKwkJCSAgIlx4M0RceEE3XHhFOSIsCisJCS5pbGVuCT0gNDMsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5QiIsCisJCS5ybGVuCT0gNDMsCiAJfSwKIH07CiAKIC8qCiAgKiBUd29maXNoIHRlc3QgdmVjdG9ycy4KICAqLwotI2RlZmluZSBURl9FTkNfVEVTVF9WRUNUT1JTCQkzCi0jZGVmaW5lIFRGX0RFQ19URVNUX1ZFQ1RPUlMJCTMKLSNkZWZpbmUgVEZfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMJCTQKLSNkZWZpbmUgVEZfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMJCTQKKyNkZWZpbmUgVEZfRU5DX1RFU1RfVkVDVE9SUwkJNAorI2RlZmluZSBURl9ERUNfVEVTVF9WRUNUT1JTCQk0CisjZGVmaW5lIFRGX0NCQ19FTkNfVEVTVF9WRUNUT1JTCQk1CisjZGVmaW5lIFRGX0NCQ19ERUNfVEVTVF9WRUNUT1JTCQk1CisjZGVmaW5lIFRGX0NUUl9FTkNfVEVTVF9WRUNUT1JTCQkyCisjZGVmaW5lIFRGX0NUUl9ERUNfVEVTVF9WRUNUT1JTCQkyCiAKIHN0YXRpYyBzdHJ1Y3QgY2lwaGVyX3Rlc3R2ZWMgdGZfZW5jX3R2X3RlbXBsYXRlW10gPSB7CiAJewpAQCAtMjU4Miw2ICsyNzQ4LDMwIEBACiAJCS5yZXN1bHQJPSAiXHgzN1x4NTJceDdiXHhlMFx4MDVceDIzXHgzNFx4YjgiCiAJCQkgICJceDlmXHgwY1x4ZmNceGNhXHhlOFx4N2NceGZhXHgyMCIsCiAJCS5ybGVuCT0gMTYsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4M0ZceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDIgorCQkJICAiXHhGOVx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkQiCisJCQkgICJceDRBXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRSIKKwkJCSAgIlx4OUJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4ODhceENCXHgxRVx4QzJceEFGXHg4QVx4OTdceEZGIgorCQkJICAiXHhGNlx4OTBceDQ2XHg5Q1x4NEFceDBGXHgwOFx4REMiCisJCQkgICJceERFXHhBQlx4QURceEZBXHhGQ1x4QThceEMyXHgzRCIKKwkJCSAgIlx4RTBceEU0XHg4Qlx4M0ZceEQ1XHhBM1x4RjdceDE0IgorCQkJICAiXHgzNFx4OUVceEI2XHgwOFx4QjJceEREXHhBOFx4RjUiCisJCQkgICJceERGXHhGQVx4QzdceEU4XHgwOVx4NTBceDc2XHgwOCIKKwkJCSAgIlx4QTJceEI2XHg2QVx4NTlceEMwXHgyQlx4NkRceDA1IgorCQkJICAiXHg4OVx4RjZceDgyXHhGMFx4RDNceERCXHgwNlx4MDIiLAorCQkucmxlbgk9IDY0LAogCX0sCiB9OwogCkBAIC0yNjE1LDYgKzI4MDUsMzAgQEAKIAkJLmlsZW4JPSAxNiwKIAkJLnJlc3VsdAk9IHplcm9lZF9zdHJpbmcsCiAJCS5ybGVuCT0gMTYsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4M0ZceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDIgorCQkJICAiXHhGOVx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkQiCisJCQkgICJceDRBXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRSIKKwkJCSAgIlx4OUJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGIiwKKwkJLmtsZW4JPSAzMiwKKwkJLmlucHV0CT0gIlx4ODhceENCXHgxRVx4QzJceEFGXHg4QVx4OTdceEZGIgorCQkJICAiXHhGNlx4OTBceDQ2XHg5Q1x4NEFceDBGXHgwOFx4REMiCisJCQkgICJceERFXHhBQlx4QURceEZBXHhGQ1x4QThceEMyXHgzRCIKKwkJCSAgIlx4RTBceEU0XHg4Qlx4M0ZceEQ1XHhBM1x4RjdceDE0IgorCQkJICAiXHgzNFx4OUVceEI2XHgwOFx4QjJceEREXHhBOFx4RjUiCisJCQkgICJceERGXHhGQVx4QzdceEU4XHgwOVx4NTBceDc2XHgwOCIKKwkJCSAgIlx4QTJceEI2XHg2QVx4NTlceEMwXHgyQlx4NkRceDA1IgorCQkJICAiXHg4OVx4RjZceDgyXHhGMFx4RDNceERCXHgwNlx4MDIiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiLAorCQkucmxlbgk9IDY0LAogCX0sCiB9OwogCkBAIC0yNjYxLDYgKzI4NzUsMzIgQEAKIAkJCSAgIlx4MDVceGVmXHg4Y1x4NjFceGE4XHgxMVx4NThceDI2IgogCQkJICAiXHgzNFx4YmFceDVjXHhiN1x4MTBceDZhXHhhNlx4NDEiLAogCQkucmxlbgk9IDQ4LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIKKwkJCSAgIlx4QzRceDI5XHg4RVx4RjNceDM1XHg5QVx4RkZceDY0IiwKKwkJLmlucHV0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4QzhceEZGXHhGMlx4NTNceEE2XHgyN1x4MDlceEQxIgorCQkJICAiXHgzM1x4MzhceEMyXHhDMFx4MENceDE0XHg3RVx4QjUiCisJCQkgICJceDI2XHgxQlx4MDVceDBDXHgwNVx4MTJceDNGXHhDMCIKKwkJCSAgIlx4RjlceDFDXHgwMlx4MjhceDQwXHg5Nlx4NkZceEQwIgorCQkJICAiXHgzRFx4MzJceERGXHhEQVx4NTZceDAwXHg2RVx4RUUiCisJCQkgICJceDVCXHgyQVx4NzJceDlEXHhDMlx4NERceDE5XHhCQyIKKwkJCSAgIlx4OENceDUzXHhGQVx4ODdceDZGXHhERFx4ODFceEEzIgorCQkJICAiXHhCMVx4RDNceDQ0XHg2NVx4REZceEU3XHg2M1x4MzgiLAorCQkucmxlbgk9IDY0LAogCX0sCiB9OwogCkBAIC0yNzA3LDYgKzI5NDcsMTQ4IEBACiAJCS5pbGVuCT0gNDgsCiAJCS5yZXN1bHQJPSB6ZXJvZWRfc3RyaW5nLAogCQkucmxlbgk9IDQ4LAorCX0sIHsgLyogR2VuZXJhdGVkIHdpdGggQ3J5cHRvKysgKi8KKwkJLmtleQk9ICJceDg1XHg2Mlx4M0ZceDFDXHhGOVx4RDZceDFDXHhGOSIKKwkJCSAgIlx4RDZceEIzXHg5MFx4NkRceDRBXHg5MFx4NkRceDRBIgorCQkJICAiXHgyN1x4MDRceEUxXHgyN1x4MDRceEUxXHhCRVx4OUIiCisJCQkgICJceDc4XHhCRVx4OUJceDc4XHg1NVx4MzJceDBGXHg1NSIsCisJCS5rbGVuCT0gMzIsCisJCS5pdgk9ICJceEUyXHgyNFx4ODlceEVFXHg1M1x4QjhceDFEXHg1RiIKKwkJCSAgIlx4QzRceDI5XHg4RVx4RjNceDM1XHg5QVx4RkZceDY0IiwKKwkJLmlucHV0CT0gIlx4QzhceEZGXHhGMlx4NTNceEE2XHgyN1x4MDlceEQxIgorCQkJICAiXHgzM1x4MzhceEMyXHhDMFx4MENceDE0XHg3RVx4QjUiCisJCQkgICJceDI2XHgxQlx4MDVceDBDXHgwNVx4MTJceDNGXHhDMCIKKwkJCSAgIlx4RjlceDFDXHgwMlx4MjhceDQwXHg5Nlx4NkZceEQwIgorCQkJICAiXHgzRFx4MzJceERGXHhEQVx4NTZceDAwXHg2RVx4RUUiCisJCQkgICJceDVCXHgyQVx4NzJceDlEXHhDMlx4NERceDE5XHhCQyIKKwkJCSAgIlx4OENceDUzXHhGQVx4ODdceDZGXHhERFx4ODFceEEzIgorCQkJICAiXHhCMVx4RDNceDQ0XHg2NVx4REZceEU3XHg2M1x4MzgiLAorCQkuaWxlbgk9IDY0LAorCQkucmVzdWx0CT0gIlx4NTZceEVEXHg4NFx4MUJceDhGXHgyNlx4QkRceDMxIgorCQkJICAiXHhDOFx4NUZceEY2XHg2QVx4MDFceDk4XHgwQ1x4QTMiCisJCQkgICJceDNBXHhEMVx4NDVceERDXHg3M1x4MEFceDdFXHgxNSIKKwkJCSAgIlx4QUNceDIwXHhCN1x4NEVceEU1XHg1OVx4RjBceDg3IgorCQkJICAiXHgxRVx4OTJceDI5XHhDMFx4MzRceENCXHg2Mlx4RjkiCisJCQkgICJceDZEXHgwNFx4OUJceDBGXHhBNlx4M0RceEQ0XHg0OCIKKwkJCSAgIlx4REZceDc2XHgwRFx4ODFceDE4XHhBRlx4MjNceEJBIgorCQkJICAiXHg1MVx4RThceDVDXHhGM1x4OEFceDIxXHg5NVx4MkMiLAorCQkucmxlbgk9IDY0LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIHRmX2N0cl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKwl7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiCisJCQkgICJceEM0XHgyOVx4OEVceEYzXHgzNVx4OUFceEZGXHg2NCIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIiwKKwkJLmlsZW4JPSA2NCwKKwkJLnJlc3VsdAk9ICJceERGXHhERFx4NjlceEZBXHhCMFx4MkVceEZEXHhGRSIKKwkJCSAgIlx4NzBceDlFXHhDNVx4NEJceEM5XHhENFx4QTFceDMwIgorCQkJICAiXHgyNlx4OUJceDg5XHhBMVx4RUVceDQzXHhFMFx4NTIiCisJCQkgICJceDU1XHgxN1x4NEVceEM3XHgwRVx4MzNceDFGXHhGMSIKKwkJCSAgIlx4OUZceDhEXHg0MFx4OUZceDI0XHhGRFx4OTJceEEwIgorCQkJICAiXHhCQ1x4OEZceDM1XHhERFx4NjdceDM4XHhEOFx4QUEiCisJCQkgICJceENGXHhGOFx4NDhceENBXHhGQlx4RTRceDVDXHg2MCIKKwkJCSAgIlx4MDFceDQxXHgyMVx4MTJceDM4XHhBQlx4NTJceDRGIiwKKwkJLnJsZW4JPSA2NCwKKwl9LCB7IC8qIEdlbmVyYXRlZCB3aXRoIENyeXB0bysrICovCisJCS5rZXkJPSAiXHg4NVx4NjJceDNGXHgxQ1x4RjlceEQ2XHgxQ1x4RjkiCisJCQkgICJceEQ2XHhCM1x4OTBceDZEXHg0QVx4OTBceDZEXHg0QSIKKwkJCSAgIlx4MjdceDA0XHhFMVx4MjdceDA0XHhFMVx4QkVceDlCIgorCQkJICAiXHg3OFx4QkVceDlCXHg3OFx4NTVceDMyXHgwRlx4NTUiLAorCQkua2xlbgk9IDMyLAorCQkuaXYJPSAiXHhFMlx4MjRceDg5XHhFRVx4NTNceEI4XHgxRFx4NUYiCisJCQkgICJceEM0XHgyOVx4OEVceEYzXHgzNVx4OUFceEZGXHg2NCIsCisJCS5pbnB1dAk9ICJceDU2XHhFRFx4ODRceDFCXHg4Rlx4MjZceEJEXHgzMSIKKwkJCSAgIlx4QzhceDVGXHhGNlx4NkFceDAxXHg5OFx4MENceEEzIgorCQkJICAiXHgzQVx4RDFceDQ1XHhEQ1x4NzNceDBBXHg3RVx4MTUiCisJCQkgICJceEFDXHgyMFx4QjdceDRFXHhFNVx4NTlceEYwXHg4NyIKKwkJCSAgIlx4MUVceDkyXHgyOVx4QzBceDM0XHhDQlx4NjJceEY5IgorCQkJICAiXHg2RFx4MDRceDlCXHgwRlx4QTZceDNEXHhENFx4NDgiCisJCQkgICJceERGXHg3Nlx4MERceDgxXHgxOFx4QUZceDIzXHhCQSIKKwkJCSAgIlx4NTFceEU4XHg1Q1x4RjNceDhBXHgyMVx4OTVceDJDIgorCQkJICAiXHhDM1x4MzdceENFIiwKKwkJLmlsZW4JPSA2NywKKwkJLnJlc3VsdAk9ICJceERGXHhERFx4NjlceEZBXHhCMFx4MkVceEZEXHhGRSIKKwkJCSAgIlx4NzBceDlFXHhDNVx4NEJceEM5XHhENFx4QTFceDMwIgorCQkJICAiXHgyNlx4OUJceDg5XHhBMVx4RUVceDQzXHhFMFx4NTIiCisJCQkgICJceDU1XHgxN1x4NEVceEM3XHgwRVx4MzNceDFGXHhGMSIKKwkJCSAgIlx4OUZceDhEXHg0MFx4OUZceDI0XHhGRFx4OTJceEEwIgorCQkJICAiXHhCQ1x4OEZceDM1XHhERFx4NjdceDM4XHhEOFx4QUEiCisJCQkgICJceENGXHhGOFx4NDhceENBXHhGQlx4RTRceDVDXHg2MCIKKwkJCSAgIlx4MDFceDQxXHgyMVx4MTJceDM4XHhBQlx4NTJceDRGIgorCQkJICAiXHhBOFx4NTdceDIwIiwKKwkJLnJsZW4JPSA2NywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB0Zl9jdHJfZGVjX3R2X3RlbXBsYXRlW10gPSB7CisJeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIgorCQkJICAiXHhDNFx4MjlceDhFXHhGM1x4MzVceDlBXHhGRlx4NjQiLAorCQkuaW5wdXQJPSAiXHhERlx4RERceDY5XHhGQVx4QjBceDJFXHhGRFx4RkUiCisJCQkgICJceDcwXHg5RVx4QzVceDRCXHhDOVx4RDRceEExXHgzMCIKKwkJCSAgIlx4MjZceDlCXHg4OVx4QTFceEVFXHg0M1x4RTBceDUyIgorCQkJICAiXHg1NVx4MTdceDRFXHhDN1x4MEVceDMzXHgxRlx4RjEiCisJCQkgICJceDlGXHg4RFx4NDBceDlGXHgyNFx4RkRceDkyXHhBMCIKKwkJCSAgIlx4QkNceDhGXHgzNVx4RERceDY3XHgzOFx4RDhceEFBIgorCQkJICAiXHhDRlx4RjhceDQ4XHhDQVx4RkJceEU0XHg1Q1x4NjAiCisJCQkgICJceDAxXHg0MVx4MjFceDEyXHgzOFx4QUJceDUyXHg0RiIsCisJCS5pbGVuCT0gNjQsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5Qlx4MEZceEE2XHgzRFx4RDRceDQ4IgorCQkJICAiXHhERlx4NzZceDBEXHg4MVx4MThceEFGXHgyM1x4QkEiCisJCQkgICJceDUxXHhFOFx4NUNceEYzXHg4QVx4MjFceDk1XHgyQyIsCisJCS5ybGVuCT0gNjQsCisJfSwgeyAvKiBHZW5lcmF0ZWQgd2l0aCBDcnlwdG8rKyAqLworCQkua2V5CT0gIlx4ODVceDYyXHgzRlx4MUNceEY5XHhENlx4MUNceEY5IgorCQkJICAiXHhENlx4QjNceDkwXHg2RFx4NEFceDkwXHg2RFx4NEEiCisJCQkgICJceDI3XHgwNFx4RTFceDI3XHgwNFx4RTFceEJFXHg5QiIKKwkJCSAgIlx4NzhceEJFXHg5Qlx4NzhceDU1XHgzMlx4MEZceDU1IiwKKwkJLmtsZW4JPSAzMiwKKwkJLml2CT0gIlx4RTJceDI0XHg4OVx4RUVceDUzXHhCOFx4MURceDVGIgorCQkJICAiXHhDNFx4MjlceDhFXHhGM1x4MzVceDlBXHhGRlx4NjQiLAorCQkuaW5wdXQJPSAiXHhERlx4RERceDY5XHhGQVx4QjBceDJFXHhGRFx4RkUiCisJCQkgICJceDcwXHg5RVx4QzVceDRCXHhDOVx4RDRceEExXHgzMCIKKwkJCSAgIlx4MjZceDlCXHg4OVx4QTFceEVFXHg0M1x4RTBceDUyIgorCQkJICAiXHg1NVx4MTdceDRFXHhDN1x4MEVceDMzXHgxRlx4RjEiCisJCQkgICJceDlGXHg4RFx4NDBceDlGXHgyNFx4RkRceDkyXHhBMCIKKwkJCSAgIlx4QkNceDhGXHgzNVx4RERceDY3XHgzOFx4RDhceEFBIgorCQkJICAiXHhDRlx4RjhceDQ4XHhDQVx4RkJceEU0XHg1Q1x4NjAiCisJCQkgICJceDAxXHg0MVx4MjFceDEyXHgzOFx4QUJceDUyXHg0RiIKKwkJCSAgIlx4QThceDU3XHgyMCIsCisJCS5pbGVuCT0gNjcsCisJCS5yZXN1bHQJPSAiXHg1Nlx4RURceDg0XHgxQlx4OEZceDI2XHhCRFx4MzEiCisJCQkgICJceEM4XHg1Rlx4RjZceDZBXHgwMVx4OThceDBDXHhBMyIKKwkJCSAgIlx4M0FceEQxXHg0NVx4RENceDczXHgwQVx4N0VceDE1IgorCQkJICAiXHhBQ1x4MjBceEI3XHg0RVx4RTVceDU5XHhGMFx4ODciCisJCQkgICJceDFFXHg5Mlx4MjlceEMwXHgzNFx4Q0JceDYyXHhGOSIKKwkJCSAgIlx4NkRceDA0XHg5Qlx4MEZceEE2XHgzRFx4RDRceDQ4IgorCQkJICAiXHhERlx4NzZceDBEXHg4MVx4MThceEFGXHgyM1x4QkEiCisJCQkgICJceDUxXHhFOFx4NUNceEYzXHg4QVx4MjFceDk1XHgyQyIKKwkJCSAgIlx4QzNceDM3XHhDRSIsCisJCS5ybGVuCT0gNjcsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2NyeXB0by92bWFjLmMgYi9jcnlwdG8vdm1hYy5jCmluZGV4IGYzNWZmOGEuLjQyNDM5MDUgMTAwNjQ0Ci0tLSBhL2NyeXB0by92bWFjLmMKKysrIGIvY3J5cHRvL3ZtYWMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGNyeXB0by9zY2F0dGVyd2Fsay5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3dwNTEyLmMgYi9jcnlwdG8vd3A1MTIuYwppbmRleCA3MjM0MjcyLi43MTcxOWEyIDEwMDY0NAotLS0gYS9jcnlwdG8vd3A1MTIuYworKysgYi9jcnlwdG8vd3A1MTIuYwpAQCAtNzYyLDExICs3NjIsMTcgQEAKIAkweDg2MjI4NjQ0YTQxMWMyODZVTEwsCiB9OwogCi1zdGF0aWMgY29uc3QgdTY0IHJjW1dISVJMUE9PTF9ST1VORFMgKyAxXSA9IHsKLQkweDAwMDAwMDAwMDAwMDAwMDBVTEwsIDB4MTgyM2M2ZTg4N2I4MDE0ZlVMTCwgMHgzNmE2ZDJmNTc5NmY5MTUyVUxMLAotCTB4NjBiYzliOGVhMzBjN2IzNVVMTCwgMHgxZGUwZDdjMjJlNGJmZTU3VUxMLCAweDE1NzczN2U1OWZmMDRhZGFVTEwsCi0JMHg1OGM5MjkwYWIxYTA2Yjg1VUxMLCAweGJkNWQxMGY0Y2IzZTA1NjdVTEwsIDB4ZTQyNzQxOGJhNzdkOTVkOFVMTCwKLQkweGZiZWU3YzY2ZGQxNzQ3OWVVTEwsIDB4Y2EyZGJmMDdhZDVhODMzM1VMTCwKK3N0YXRpYyBjb25zdCB1NjQgcmNbV0hJUkxQT09MX1JPVU5EU10gPSB7CisJMHgxODIzYzZlODg3YjgwMTRmVUxMLAorCTB4MzZhNmQyZjU3OTZmOTE1MlVMTCwKKwkweDYwYmM5YjhlYTMwYzdiMzVVTEwsCisJMHgxZGUwZDdjMjJlNGJmZTU3VUxMLAorCTB4MTU3NzM3ZTU5ZmYwNGFkYVVMTCwKKwkweDU4YzkyOTBhYjFhMDZiODVVTEwsCisJMHhiZDVkMTBmNGNiM2UwNTY3VUxMLAorCTB4ZTQyNzQxOGJhNzdkOTVkOFVMTCwKKwkweGZiZWU3YzY2ZGQxNzQ3OWVVTEwsCisJMHhjYTJkYmYwN2FkNWE4MzMzVUxMLAogfTsKIAogLyoqCkBAIC03OTMsNyArNzk5LDcgQEAKIAlzdGF0ZVs2XSA9IGJsb2NrWzZdIF4gKEtbNl0gPSB3Y3R4LT5oYXNoWzZdKTsKIAlzdGF0ZVs3XSA9IGJsb2NrWzddIF4gKEtbN10gPSB3Y3R4LT5oYXNoWzddKTsKIAotCWZvciAociA9IDE7IHIgPD0gV0hJUkxQT09MX1JPVU5EUzsgcisrKSB7CisJZm9yIChyID0gMDsgciA8IFdISVJMUE9PTF9ST1VORFM7IHIrKykgewogCiAJCUxbMF0gPSBDMFsoaW50KShLWzBdID4+IDU2KSAgICAgICBdIF4KIAkJCSAgIEMxWyhpbnQpKEtbN10gPj4gNDgpICYgMHhmZl0gXgpkaWZmIC0tZ2l0IGEvY3J5cHRvL3hjYmMuYyBiL2NyeXB0by94Y2JjLmMKaW5kZXggYmI3YjY3Zi4uYTVmYmRmMyAxMDA2NDQKLS0tIGEvY3J5cHRvL3hjYmMuYworKysgYi9jcnlwdG8veGNiYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHVfaW50MzJfdCBrc1sxMl0gPSB7MHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwKIAkJCSAgIDB4MDIwMjAyMDIsIDB4MDIwMjAyMDIsIDB4MDIwMjAyMDIsIDB4MDIwMjAyMDIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCmluZGV4IGUxMTQxNDAuLmY0ZjUyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmV2bnQuYwppbmRleCBjNTdiNWM3Li4yMDUxNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZ3BlLmMKaW5kZXggNTJhYWZmMy4uZjA2YTNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZ3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZ3BlLmMKQEAgLTQxLDYgKzQxLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY2V2ZW50cy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jCmluZGV4IDAwY2Q5NTYuLmFlZTg4N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZnJlZ24uYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZyZWduLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdyZWdzLmMKaW5kZXggNTVhY2NiNy4uY2M3MGYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cmVncy5jCkBAIC0yNjksMTYgKzI2OSwxNyBAQAogCiAJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCiAJCQkJCUFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQorCisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWdvdG8gZXhpdDsKIAogCS8qIENsZWFyIHRoZSBHUEUgQml0cyBpbiBhbGwgR1BFIHJlZ2lzdGVycyBpbiBhbGwgR1BFIGJsb2NrcyAqLwogCiAJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrLCBOVUxMKTsKIAotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGxvY2tfZmxhZ3MpOworZXhpdDoKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYwppbmRleCAyYWMyOGJiLi5kNTJkYTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKICNpbmNsdWRlIDxsaW51eC90Ym9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQogQUNQSV9NT0RVTEVfTkFNRSgiaHdzbGVlcCIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dGltZXIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd0aW1lci5jCmluZGV4IDljOGViNzEuLjUwZDIxYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd0aW1lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd0aW1lci5jCkBAIC00Miw2ICs0Miw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKaW5kZXggZjc1ZjgxYS4uYzI3OTNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jCmluZGV4IGM1M2YwMDQuLmU3ZjAxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZldmFsLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jCmluZGV4IDNmZDQ1MjYuLjgzYmY5MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4Zm5hbWUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZuYW1lLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZvYmouYwppbmRleCBkYjc2NjBmLi41N2U2ZDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZvYmouYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZvYmouYwpAQCAtNDIsNiArNDIsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjbmFtZXNwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCmluZGV4IDJmZjY1N2EuLmZlODZiMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnN4ZmFjZS5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNyZXNyYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwppbmRleCA0YjcwODVkLi5lN2QxM2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwpAQCAtNDIsNiArNDIsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjbmFtZXNwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWJ1Zy5jCmluZGV4IGE5YmNkODEuLmExZjhkNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWJ1Zy5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYwppbmRleCA5N2NiMzZmLi44YjA4N2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jCkBAIC00MSw2ICs0MSw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYwppbmRleCA4MzNhMzhhLi5mZmJhMGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jCkBAIC00Myw2ICs0Myw3IEBACiAKICNkZWZpbmUgREVGSU5FX0FDUElfR0xPQkFMUwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYwppbmRleCA5OGFkMTI1Li40MjBlYmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYwpAQCAtNDEsNiArNDEsNyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjZXZlbnRzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZlcnJvci5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmZXJyb3IuYwppbmRleCA5MTZhZTA5Li44ZDAyNDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZlcnJvci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmVycm9yLmMKQEAgLTQxLDYgKzQxLDcgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCmluZGV4IDJjYTU5ZGMuLjEyNzQwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKQEAgLTkzMyw3ICs5MzMsNyBAQAogc3RhdGljIGludCBlcnN0X2Nsb3NlX3BzdG9yZShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiBzdGF0aWMgc3NpemVfdCBlcnN0X3JlYWRlcih1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAogCQkJICAgc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7Ci1zdGF0aWMgdTY0IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCitzdGF0aWMgaW50IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0ICppZCwgdW5zaWduZWQgaW50IHBhcnQsCiAJCSAgICAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogc3RhdGljIGludCBlcnN0X2NsZWFyZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCiAJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CkBAIC0xMDQwLDExICsxMDQwLDEyIEBACiAJcmV0dXJuIChyYyA8IDApID8gcmMgOiAobGVuIC0gc2l6ZW9mKCpyY2QpKTsKIH0KIAotc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorc3RhdGljIGludCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCAqaWQsIHVuc2lnbmVkIGludCBwYXJ0LAogCQkgICAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCXN0cnVjdCBjcGVyX3BzdG9yZV9yZWNvcmQgKnJjZCA9IChzdHJ1Y3QgY3Blcl9wc3RvcmVfcmVjb3JkICopCiAJCQkJCShlcnN0X2luZm8uYnVmIC0gc2l6ZW9mKCpyY2QpKTsKKwlpbnQgcmV0OwogCiAJbWVtc2V0KHJjZCwgMCwgc2l6ZW9mKCpyY2QpKTsKIAltZW1jcHkocmNkLT5oZHIuc2lnbmF0dXJlLCBDUEVSX1NJR19SRUNPUkQsIENQRVJfU0lHX1NJWkUpOwpAQCAtMTA3OSw5ICsxMDgwLDEwIEBACiAJfQogCXJjZC0+c2VjX2hkci5zZWN0aW9uX3NldmVyaXR5ID0gQ1BFUl9TRVZfRkFUQUw7CiAKLQllcnN0X3dyaXRlKCZyY2QtPmhkcik7CisJcmV0ID0gZXJzdF93cml0ZSgmcmNkLT5oZHIpOworCSppZCA9IHJjZC0+aGRyLnJlY29yZF9pZDsKIAotCXJldHVybiByY2QtPmhkci5yZWNvcmRfaWQ7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBlcnN0X2NsZWFyZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCkBAIC0xMTY1LDcgKzExNjcsNyBAQAogCQlnb3RvIGVycl9yZWxlYXNlX2VyYW5nZTsKIAogCWJ1ZiA9IGttYWxsb2MoZXJzdF9lcmFuZ2Uuc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JbXV0ZXhfaW5pdCgmZXJzdF9pbmZvLmJ1Zl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmVyc3RfaW5mby5idWZfbG9jayk7CiAJaWYgKGJ1ZikgewogCQllcnN0X2luZm8uYnVmID0gYnVmICsgc2l6ZW9mKHN0cnVjdCBjcGVyX3BzdG9yZV9yZWNvcmQpOwogCQllcnN0X2luZm8uYnVmc2l6ZSA9IGVyc3RfZXJhbmdlLnNpemUgLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2F0b21pY2lvLmMgYi9kcml2ZXJzL2FjcGkvYXRvbWljaW8uYwppbmRleCA3NDg5Yjg5YzMuLmNmYzBjYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hdG9taWNpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9hdG9taWNpby5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTc2LDcgKzc2LDcgQEAKIHsKIAlzdHJ1Y3QgYWNwaV9pb21hcCAqbWFwOwogCi0JbWFwID0gX19hY3BpX2ZpbmRfaW9tYXAocGFkZHIsIHNpemUpOworCW1hcCA9IF9fYWNwaV9maW5kX2lvbWFwKHBhZGRyLCBzaXplLzgpOwogCWlmIChtYXApCiAJCXJldHVybiBtYXAtPnZhZGRyICsgKHBhZGRyIC0gbWFwLT5wYWRkcik7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCmluZGV4IGFmMzA4ZDAuLmNiOTYyOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKQEAgLTI4LDcgKzI4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggNDM3ZGRiZi4uOWVjZWM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtOTExLDEwICs5MTEsNyBAQAogCX0KICNlbmRpZgogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtKH4KLQkJCQkgIChBQ1BJX05PX0hBUkRXQVJFX0lOSVQgfAotCQkJCSAgIEFDUElfTk9fQUNQSV9FTkFCTEUpKTsKKwlzdGF0dXMgPSBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0ofkFDUElfTk9fQUNQSV9FTkFCTEUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gZW5hYmxlIEFDUElcbiIpOwogCQlnb3RvIGVycm9yMDsKQEAgLTkzNSw4ICs5MzIsNyBAQAogCiAJYWNwaV9vc19pbml0aWFsaXplMSgpOwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtKEFDUElfTk9fSEFSRFdBUkVfSU5JVCB8IEFDUElfTk9fQUNQSV9FTkFCTEUpOworCXN0YXR1cyA9IGFjcGlfZW5hYmxlX3N1YnN5c3RlbShBQ1BJX05PX0FDUElfRU5BQkxFKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkgICAgICAgIlVuYWJsZSB0byBzdGFydCB0aGUgQUNQSSBJbnRlcnByZXRlclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGVidWdmcy5jIGIvZHJpdmVycy9hY3BpL2RlYnVnZnMuYwppbmRleCAxODJhOWZjLi5iNTVkNmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kZWJ1Z2ZzLmMKQEAgLTIsNiArMiw3IEBACiAgKiBkZWJ1Z2ZzLmMgLSBBQ1BJIGRlYnVnZnMgaW50ZXJmYWNlIHRvIHVzZXJzcGFjZS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjX3N5cy5jIGIvZHJpdmVycy9hY3BpL2VjX3N5cy5jCmluZGV4IDIyZjkxOGIuLjZjNDdhZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lY19zeXMuYworKysgYi9kcml2ZXJzL2FjcGkvZWNfc3lzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCmluZGV4IDg1ZDkwODkuLjE0NDI3MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCkBAIC03LDYgKzcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggN2M0N2VkNS4uMjlhNGE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC02LDYgKzYsNyBAQAogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IGZhMzJmNTguLmYzMWM1YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTgwLDcgKzgwLDggQEAKIHN0YXRpYyB2b2lkICphY3BpX2lycV9jb250ZXh0Owogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprYWNwaWRfd3E7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmthY3BpX25vdGlmeV93cTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlfaG90cGx1Z193cTsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprYWNwaV9ob3RwbHVnX3dxOworRVhQT1JUX1NZTUJPTChrYWNwaV9ob3RwbHVnX3dxKTsKIAogc3RydWN0IGFjcGlfcmVzX2xpc3QgewogCXJlc291cmNlX3NpemVfdCBzdGFydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCmluZGV4IGY1Zjk4NjkuLjI1MWM3YjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jLmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IDAyZDJhNGMuLjNhMDQyOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC03LDYgKzcsNyBAQAogICoJVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+CiAgKgktIEFkZGVkIF9QREMgZm9yIHBsYXRmb3JtcyB3aXRoIEludGVsIENQVXMKICAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKaW5kZXggYTRlMGYxYi4uOWQ3YmM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCkBAIC00MjYsNyArNDI2LDcgQEAKIAogCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSAmJiBwcikgewogCQlhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQocHIsIDApOwotCQlhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQocHIpOworCQlhY3BpX3Byb2Nlc3Nvcl9ob3RwbHVnKHByKTsKIAkJYWNwaV9wcm9jZXNzb3JfcmVldmFsdWF0ZV90c3RhdGUocHIsIGFjdGlvbik7CiAJCWFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChwcik7CiAJfQpAQCAtNTAzLDggKzUwMyw3IEBACiAJYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfaW5mbyhwcik7CiAJYWNwaV9wcm9jZXNzb3JfZ2V0X2xpbWl0X2luZm8ocHIpOwogCi0KLQlpZiAoY3B1aWRsZV9nZXRfZHJpdmVyKCkgPT0gJmFjcGlfaWRsZV9kcml2ZXIpCisJaWYgKCFjcHVpZGxlX2dldF9kcml2ZXIoKSB8fCBjcHVpZGxlX2dldF9kcml2ZXIoKSA9PSAmYWNwaV9pZGxlX2RyaXZlcikKIAkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwciwgZGV2aWNlKTsKIAogCXByLT5jZGV2ID0gdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcigiUHJvY2Vzc29yIiwgZGV2aWNlLApAQCAtODAwLDE3ICs3OTksOSBAQAogCiAJbWVtc2V0KCZlcnJhdGEsIDAsIHNpemVvZihlcnJhdGEpKTsKIAotCWlmICghY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfaWRsZV9kcml2ZXIpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJOiAlcyByZWdpc3RlcmVkIHdpdGggY3B1aWRsZVxuIiwKLQkJCWFjcGlfaWRsZV9kcml2ZXIubmFtZSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFDUEk6IGFjcGlfaWRsZSB5aWVsZGluZyB0byAlc1xuIiwKLQkJCWNwdWlkbGVfZ2V0X2RyaXZlcigpLT5uYW1lKTsKLQl9Ci0KIAlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcHJvY2Vzc29yX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApCi0JCWdvdG8gb3V0X2NwdWlkbGU7CisJCXJldHVybiByZXN1bHQ7CiAKIAlhY3BpX3Byb2Nlc3Nvcl9pbnN0YWxsX2hvdHBsdWdfbm90aWZ5KCk7CiAKQEAgLTgyMSwxMSArODEyLDYgQEAKIAlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQoKTsKIAogCXJldHVybiAwOwotCi1vdXRfY3B1aWRsZToKLQljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKTsKLQotCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3Byb2Nlc3Nvcl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDliODhmOTguLjBlOGUyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0yMjQsNyArMjI0LDYgQEAKIC8qCiAgKiBTdXNwZW5kIC8gcmVzdW1lIGNvbnRyb2wKICAqLwotc3RhdGljIGludCBhY3BpX2lkbGVfc3VzcGVuZDsKIHN0YXRpYyB1MzIgc2F2ZWRfYm1fcmxkOwogCiBzdGF0aWMgdm9pZCBhY3BpX2lkbGVfYm1fcmxkX3NhdmUodm9pZCkKQEAgLTI0MywyMSArMjQyLDEzIEBACiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCWlmIChhY3BpX2lkbGVfc3VzcGVuZCA9PSAxKQotCQlyZXR1cm4gMDsKLQogCWFjcGlfaWRsZV9ibV9ybGRfc2F2ZSgpOwotCWFjcGlfaWRsZV9zdXNwZW5kID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogaW50IGFjcGlfcHJvY2Vzc29yX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpCiB7Ci0JaWYgKGFjcGlfaWRsZV9zdXNwZW5kID09IDApCi0JCXJldHVybiAwOwotCiAJYWNwaV9pZGxlX2JtX3JsZF9yZXN0b3JlKCk7Ci0JYWNwaV9pZGxlX3N1c3BlbmQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC03NDEsNjYgKzczMiw2NSBAQAogLyoqCiAgKiBhY3BpX2lkbGVfZW50ZXJfYzEgLSBlbnRlcnMgYW4gQUNQSSBDMSBzdGF0ZS10eXBlCiAgKiBAZGV2OiB0aGUgdGFyZ2V0IENQVQotICogQHN0YXRlOiB0aGUgc3RhdGUgZGF0YQorICogQGRydjogY3B1aWRsZSBkcml2ZXIgY29udGFpbmluZyBjcHVpZGxlIHN0YXRlIGluZm8KKyAqIEBpbmRleDogaW5kZXggb2YgdGFyZ2V0IHN0YXRlCiAgKgogICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBIQUxUIGluc3RydWN0aW9uLgogICovCiBzdGF0aWMgaW50IGFjcGlfaWRsZV9lbnRlcl9jMShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCkKIHsKIAlrdGltZV90ICBrdDEsIGt0MjsKIAlzNjQgaWRsZV90aW1lOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlX3VzYWdlKTsKIAogCXByID0gX190aGlzX2NwdV9yZWFkKHByb2Nlc3NvcnMpOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFwcikpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQkvKiBEbyBub3QgYWNjZXNzIGFueSBBQ1BJIElPIHBvcnRzIGluIHN1c3BlbmQgcGF0aCAqLwotCWlmIChhY3BpX2lkbGVfc3VzcGVuZCkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCWNwdV9yZWxheCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlsYXBpY190aW1lcl9zdGF0ZV9icm9hZGNhc3QocHIsIGN4LCAxKTsKIAlrdDEgPSBrdGltZV9nZXRfcmVhbCgpOwogCWFjcGlfaWRsZV9kb19lbnRyeShjeCk7CiAJa3QyID0ga3RpbWVfZ2V0X3JlYWwoKTsKIAlpZGxlX3RpbWUgPSAga3RpbWVfdG9fdXMoa3RpbWVfc3ViKGt0Miwga3QxKSk7CiAKKwkvKiBVcGRhdGUgZGV2aWNlIGxhc3RfcmVzaWRlbmN5Ki8KKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gKGludClpZGxlX3RpbWU7CisKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJY3gtPnVzYWdlKys7CiAJbGFwaWNfdGltZXJfc3RhdGVfYnJvYWRjYXN0KHByLCBjeCwgMCk7CiAKLQlyZXR1cm4gaWRsZV90aW1lOworCXJldHVybiBpbmRleDsKIH0KIAogLyoqCiAgKiBhY3BpX2lkbGVfZW50ZXJfc2ltcGxlIC0gZW50ZXJzIGFuIEFDUEkgc3RhdGUgd2l0aG91dCBCTSBoYW5kbGluZwogICogQGRldjogdGhlIHRhcmdldCBDUFUKLSAqIEBzdGF0ZTogdGhlIHN0YXRlIGRhdGEKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyIHdpdGggY3B1aWRsZSBzdGF0ZSBpbmZvcm1hdGlvbgorICogQGluZGV4OiB0aGUgaW5kZXggb2Ygc3VnZ2VzdGVkIHN0YXRlCiAgKi8KIHN0YXRpYyBpbnQgYWNwaV9pZGxlX2VudGVyX3NpbXBsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKKwkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSA9ICZkZXYtPnN0YXRlc191c2FnZVtpbmRleF07CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZV91c2FnZSk7CiAJa3RpbWVfdCAga3QxLCBrdDI7CiAJczY0IGlkbGVfdGltZV9uczsKIAlzNjQgaWRsZV90aW1lOwogCiAJcHIgPSBfX3RoaXNfY3B1X3JlYWQocHJvY2Vzc29ycyk7CisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IDA7CiAKIAlpZiAodW5saWtlbHkoIXByKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYWNwaV9pZGxlX3N1c3BlbmQpCi0JCXJldHVybihhY3BpX2lkbGVfZW50ZXJfYzEoZGV2LCBzdGF0ZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKQEAgLTgxNSw3ICs4MDUsNyBAQAogCQlpZiAodW5saWtlbHkobmVlZF9yZXNjaGVkKCkpKSB7CiAJCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIApAQCAtODM3LDYgKzgyNyw5IEBACiAJaWRsZV90aW1lID0gaWRsZV90aW1lX25zOwogCWRvX2RpdihpZGxlX3RpbWUsIE5TRUNfUEVSX1VTRUMpOwogCisJLyogVXBkYXRlIGRldmljZSBsYXN0X3Jlc2lkZW5jeSovCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IChpbnQpaWRsZV90aW1lOworCiAJLyogVGVsbCB0aGUgc2NoZWR1bGVyIGhvdyBtdWNoIHdlIGlkbGVkOiAqLwogCXNjaGVkX2Nsb2NrX2lkbGVfd2FrZXVwX2V2ZW50KGlkbGVfdGltZV9ucyk7CiAKQEAgLTg0OCw3ICs4NDEsNyBAQAogCiAJbGFwaWNfdGltZXJfc3RhdGVfYnJvYWRjYXN0KHByLCBjeCwgMCk7CiAJY3gtPnRpbWUgKz0gaWRsZV90aW1lOwotCXJldHVybiBpZGxlX3RpbWU7CisJcmV0dXJuIGluZGV4OwogfQogCiBzdGF0aWMgaW50IGMzX2NwdV9jb3VudDsKQEAgLTg1NywzNyArODUwLDM3IEBACiAvKioKICAqIGFjcGlfaWRsZV9lbnRlcl9ibSAtIGVudGVycyBDMyB3aXRoIHByb3BlciBCTSBoYW5kbGluZwogICogQGRldjogdGhlIHRhcmdldCBDUFUKLSAqIEBzdGF0ZTogdGhlIHN0YXRlIGRhdGEKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyIGNvbnRhaW5pbmcgc3RhdGUgZGF0YQorICogQGluZGV4OiB0aGUgaW5kZXggb2Ygc3VnZ2VzdGVkIHN0YXRlCiAgKgogICogSWYgQk0gaXMgZGV0ZWN0ZWQsIHRoZSBkZWVwZXN0IG5vbi1DMyBpZGxlIHN0YXRlIGlzIGVudGVyZWQgaW5zdGVhZC4KICAqLwogc3RhdGljIGludCBhY3BpX2lkbGVfZW50ZXJfYm0oc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCisJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gY3B1aWRsZV9nZXRfc3RhdGVkYXRhKHN0YXRlKTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UgPSAmZGV2LT5zdGF0ZXNfdXNhZ2VbaW5kZXhdOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBjcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGVfdXNhZ2UpOwogCWt0aW1lX3QgIGt0MSwga3QyOwogCXM2NCBpZGxlX3RpbWVfbnM7CiAJczY0IGlkbGVfdGltZTsKIAogCiAJcHIgPSBfX3RoaXNfY3B1X3JlYWQocHJvY2Vzc29ycyk7CisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IDA7CiAKIAlpZiAodW5saWtlbHkoIXByKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYWNwaV9pZGxlX3N1c3BlbmQpCi0JCXJldHVybihhY3BpX2lkbGVfZW50ZXJfYzEoZGV2LCBzdGF0ZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghY3gtPmJtX3N0c19za2lwICYmIGFjcGlfaWRsZV9ibV9jaGVjaygpKSB7Ci0JCWlmIChkZXYtPnNhZmVfc3RhdGUpIHsKLQkJCWRldi0+bGFzdF9zdGF0ZSA9IGRldi0+c2FmZV9zdGF0ZTsKLQkJCXJldHVybiBkZXYtPnNhZmVfc3RhdGUtPmVudGVyKGRldiwgZGV2LT5zYWZlX3N0YXRlKTsKKwkJaWYgKGRydi0+c2FmZV9zdGF0ZV9pbmRleCA+PSAwKSB7CisJCQlyZXR1cm4gZHJ2LT5zdGF0ZXNbZHJ2LT5zYWZlX3N0YXRlX2luZGV4XS5lbnRlcihkZXYsCisJCQkJCQlkcnYsIGRydi0+c2FmZV9zdGF0ZV9pbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJYWNwaV9zYWZlX2hhbHQoKTsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKQEAgLTkwNCw3ICs4OTcsNyBAQAogCQlpZiAodW5saWtlbHkobmVlZF9yZXNjaGVkKCkpKSB7CiAJCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIApAQCAtOTU0LDYgKzk0Nyw5IEBACiAJaWRsZV90aW1lID0gaWRsZV90aW1lX25zOwogCWRvX2RpdihpZGxlX3RpbWUsIE5TRUNfUEVSX1VTRUMpOwogCisJLyogVXBkYXRlIGRldmljZSBsYXN0X3Jlc2lkZW5jeSovCisJZGV2LT5sYXN0X3Jlc2lkZW5jeSA9IChpbnQpaWRsZV90aW1lOworCiAJLyogVGVsbCB0aGUgc2NoZWR1bGVyIGhvdyBtdWNoIHdlIGlkbGVkOiAqLwogCXNjaGVkX2Nsb2NrX2lkbGVfd2FrZXVwX2V2ZW50KGlkbGVfdGltZV9ucyk7CiAKQEAgLTk2NSw3ICs5NjEsNyBAQAogCiAJbGFwaWNfdGltZXJfc3RhdGVfYnJvYWRjYXN0KHByLCBjeCwgMCk7CiAJY3gtPnRpbWUgKz0gaWRsZV90aW1lOwotCXJldHVybiBpZGxlX3RpbWU7CisJcmV0dXJuIGluZGV4OwogfQogCiBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgYWNwaV9pZGxlX2RyaXZlciA9IHsKQEAgLTk3NCwxNCArOTcwLDE2IEBACiB9OwogCiAvKioKLSAqIGFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGUgLSBwcmVwYXJlcyBhbmQgY29uZmlndXJlcyBDUFVJRExFCisgKiBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX2N4IC0gcHJlcGFyZXMgYW5kIGNvbmZpZ3VyZXMgQ1BVSURMRQorICogZGV2aWNlIGkuZS4gcGVyLWNwdSBkYXRhCisgKgogICogQHByOiB0aGUgQUNQSSBwcm9jZXNzb3IKICAqLwotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGVfY3goc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgaSwgY291bnQgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4OwotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2U7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSAmcHItPnBvd2VyLmRldjsKIAogCWlmICghcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUpCkBAIC05OTIsMTcgKzk5MCwxMyBAQAogCX0KIAogCWRldi0+Y3B1ID0gcHItPmlkOwotCWZvciAoaSA9IDA7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7Ci0JCWRldi0+c3RhdGVzW2ldLm5hbWVbMF0gPSAnXDAnOwotCQlkZXYtPnN0YXRlc1tpXS5kZXNjWzBdID0gJ1wwJzsKLQl9CiAKIAlpZiAobWF4X2NzdGF0ZSA9PSAwKQogCQltYXhfY3N0YXRlID0gMTsKIAogCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgJiYgaSA8PSBtYXhfY3N0YXRlOyBpKyspIHsKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tpXTsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZXNbY291bnRdOworCQlzdGF0ZV91c2FnZSA9ICZkZXYtPnN0YXRlc191c2FnZVtjb3VudF07CiAKIAkJaWYgKCFjeC0+dmFsaWQpCiAJCQljb250aW51ZTsKQEAgLTEwMTMsOCArMTAwNyw2NCBAQAogCQkgICAgIShhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX0MyX01QX1NVUFBPUlRFRCkpCiAJCQljb250aW51ZTsKICNlbmRpZgotCQljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGUsIGN4KTsKIAorCQljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGVfdXNhZ2UsIGN4KTsKKworCQljb3VudCsrOworCQlpZiAoY291bnQgPT0gQ1BVSURMRV9TVEFURV9NQVgpCisJCQlicmVhazsKKwl9CisKKwlkZXYtPnN0YXRlX2NvdW50ID0gY291bnQ7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGUgc3RhdGVzLSBwcmVwYXJlcyBhbmQgY29uZmlndXJlcyBjcHVpZGxlCisgKiBnbG9iYWwgc3RhdGUgZGF0YSBpLmUuIGlkbGUgcm91dGluZXMKKyAqCisgKiBAcHI6IHRoZSBBQ1BJIHByb2Nlc3NvcgorICovCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGVfc3RhdGVzKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJaW50IGksIGNvdW50ID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeDsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmYWNwaV9pZGxlX2RyaXZlcjsKKworCWlmICghcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHByLT5mbGFncy5wb3dlciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7CisJCWRydi0+c3RhdGVzW2ldLm5hbWVbMF0gPSAnXDAnOworCQlkcnYtPnN0YXRlc1tpXS5kZXNjWzBdID0gJ1wwJzsKKwl9CisKKwlpZiAobWF4X2NzdGF0ZSA9PSAwKQorCQltYXhfY3N0YXRlID0gMTsKKworCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIgJiYgaSA8PSBtYXhfY3N0YXRlOyBpKyspIHsKKwkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tpXTsKKworCQlpZiAoIWN4LT52YWxpZCkKKwkJCWNvbnRpbnVlOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJCWlmICgoY3gtPnR5cGUgIT0gQUNQSV9TVEFURV9DMSkgJiYgKG51bV9vbmxpbmVfY3B1cygpID4gMSkgJiYKKwkJICAgICFwci0+ZmxhZ3MuaGFzX2NzdCAmJgorCQkgICAgIShhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX0MyX01QX1NVUFBPUlRFRCkpCisJCQljb250aW51ZTsKKyNlbmRpZgorCisJCXN0YXRlID0gJmRydi0+c3RhdGVzW2NvdW50XTsKIAkJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDJWQiLCBpKTsKIAkJc3RybmNweShzdGF0ZS0+ZGVzYywgY3gtPmRlc2MsIENQVUlETEVfREVTQ19MRU4pOwogCQlzdGF0ZS0+ZXhpdF9sYXRlbmN5ID0gY3gtPmxhdGVuY3k7CkBAIC0xMDI3LDEzICsxMDc3LDEzIEBACiAJCQkJc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwogCiAJCQlzdGF0ZS0+ZW50ZXIgPSBhY3BpX2lkbGVfZW50ZXJfYzE7Ci0JCQlkZXYtPnNhZmVfc3RhdGUgPSBzdGF0ZTsKKwkJCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IGNvdW50OwogCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9TVEFURV9DMjoKIAkJCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAkJCXN0YXRlLT5lbnRlciA9IGFjcGlfaWRsZV9lbnRlcl9zaW1wbGU7Ci0JCQlkZXYtPnNhZmVfc3RhdGUgPSBzdGF0ZTsKKwkJCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IGNvdW50OwogCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9TVEFURV9DMzoKQEAgLTEwNDksNyArMTA5OSw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlkZXYtPnN0YXRlX2NvdW50ID0gY291bnQ7CisJZHJ2LT5zdGF0ZV9jb3VudCA9IGNvdW50OwogCiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDU3LDcgKzExMDcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYWNwaV9wcm9jZXNzb3JfY3N0X2hhc19jaGFuZ2VkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitpbnQgYWNwaV9wcm9jZXNzb3JfaG90cGx1ZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCWludCByZXQgPSAwOwogCkBAIC0xMDc4LDcgKzExMjgsNyBAQAogCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoJnByLT5wb3dlci5kZXYpOwogCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvKHByKTsKIAlpZiAocHItPmZsYWdzLnBvd2VyKSB7Ci0JCWFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGUocHIpOworCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX2N4KHByKTsKIAkJcmV0ID0gY3B1aWRsZV9lbmFibGVfZGV2aWNlKCZwci0+cG93ZXIuZGV2KTsKIAl9CiAJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwpAQCAtMTA4NiwxMCArMTEzNiw3MiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3sKKwlpbnQgY3B1OworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqX3ByOworCisJaWYgKGRpc2FibGVkX2J5X2lkbGVfYm9vdF9wYXJhbSgpKQorCQlyZXR1cm4gMDsKKworCWlmICghcHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5vY3N0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBGSVhNRTogIERlc2lnbiB0aGUgQUNQSSBub3RpZmljYXRpb24gdG8gbWFrZSBpdCBvbmNlIHBlcgorCSAqIHN5c3RlbSBpbnN0ZWFkIG9mIG9uY2UgcGVyLWNwdS4gIFRoaXMgY29uZGl0aW9uIGlzIGEgaGFjaworCSAqIHRvIG1ha2UgdGhlIGNvZGUgdGhhdCB1cGRhdGVzIEMtU3RhdGVzIGJlIGNhbGxlZCBvbmNlLgorCSAqLworCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSA9PSAwICYmCisJCQljcHVpZGxlX2dldF9kcml2ZXIoKSA9PSAmYWNwaV9pZGxlX2RyaXZlcikgeworCisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJLyogUHJvdGVjdCBhZ2FpbnN0IGNwdS1ob3RwbHVnICovCisJCWdldF9vbmxpbmVfY3B1cygpOworCisJCS8qIERpc2FibGUgYWxsIGNwdWlkbGUgZGV2aWNlcyAqLworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQkJX3ByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOworCQkJaWYgKCFfcHIgfHwgIV9wci0+ZmxhZ3MucG93ZXJfc2V0dXBfZG9uZSkKKwkJCQljb250aW51ZTsKKwkJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoJl9wci0+cG93ZXIuZGV2KTsKKwkJfQorCisJCS8qIFBvcHVsYXRlIFVwZGF0ZWQgQy1zdGF0ZSBpbmZvcm1hdGlvbiAqLworCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX3N0YXRlcyhwcik7CisKKwkJLyogRW5hYmxlIGFsbCBjcHVpZGxlIGRldmljZXMgKi8KKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCV9wciA9IHBlcl9jcHUocHJvY2Vzc29ycywgY3B1KTsKKwkJCWlmICghX3ByIHx8ICFfcHItPmZsYWdzLnBvd2VyX3NldHVwX2RvbmUpCisJCQkJY29udGludWU7CisJCQlhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mbyhfcHIpOworCQkJaWYgKF9wci0+ZmxhZ3MucG93ZXIpIHsKKwkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX2N4KF9wcik7CisJCQkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKCZfcHItPnBvd2VyLmRldik7CisJCQl9CisJCX0KKwkJcHV0X29ubGluZV9jcHVzKCk7CisJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9yZWdpc3RlcmVkOworCiBpbnQgX19jcHVpbml0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKIAkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CisJaW50IHJldHZhbDsKIAlzdGF0aWMgaW50IGZpcnN0X3J1bjsKIAogCWlmIChkaXNhYmxlZF9ieV9pZGxlX2Jvb3RfcGFyYW0oKSkKQEAgLTExMjYsOSArMTIzOCwyNiBAQAogCSAqIHBsYXRmb3JtcyB0aGF0IG9ubHkgc3VwcG9ydCBDMS4KIAkgKi8KIAlpZiAocHItPmZsYWdzLnBvd2VyKSB7Ci0JCWFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGUocHIpOwotCQlpZiAoY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoJnByLT5wb3dlci5kZXYpKQotCQkJcmV0dXJuIC1FSU87CisJCS8qIFJlZ2lzdGVyIGFjcGlfaWRsZV9kcml2ZXIgaWYgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCQlpZiAoIWFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyZWQpIHsKKwkJCWFjcGlfcHJvY2Vzc29yX3NldHVwX2NwdWlkbGVfc3RhdGVzKHByKTsKKwkJCXJldHZhbCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJOiAlcyByZWdpc3RlcmVkIHdpdGggY3B1aWRsZVxuIiwKKwkJCQkJYWNwaV9pZGxlX2RyaXZlci5uYW1lKTsKKwkJfQorCQkvKiBSZWdpc3RlciBwZXItY3B1IGNwdWlkbGVfZGV2aWNlLiBDcHVpZGxlIGRyaXZlcgorCQkgKiBtdXN0IGFscmVhZHkgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgcmVnaXN0ZXJpbmcgZGV2aWNlCisJCSAqLworCQlhY3BpX3Byb2Nlc3Nvcl9zZXR1cF9jcHVpZGxlX2N4KHByKTsKKwkJcmV0dmFsID0gY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UoJnByLT5wb3dlci5kZXYpOworCQlpZiAocmV0dmFsKSB7CisJCQlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJlZCA9PSAwKQorCQkJCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfaWRsZV9kcml2ZXIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlhY3BpX3Byb2Nlc3Nvcl9yZWdpc3RlcmVkKys7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTEzOSw4ICsxMjY4LDEzIEBACiAJaWYgKGRpc2FibGVkX2J5X2lkbGVfYm9vdF9wYXJhbSgpKQogCQlyZXR1cm4gMDsKIAotCWNwdWlkbGVfdW5yZWdpc3Rlcl9kZXZpY2UoJnByLT5wb3dlci5kZXYpOwotCXByLT5mbGFncy5wb3dlcl9zZXR1cF9kb25lID0gMDsKKwlpZiAocHItPmZsYWdzLnBvd2VyKSB7CisJCWNwdWlkbGVfdW5yZWdpc3Rlcl9kZXZpY2UoJnByLT5wb3dlci5kZXYpOworCQlhY3BpX3Byb2Nlc3Nvcl9yZWdpc3RlcmVkLS07CisJCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3RlcmVkID09IDApCisJCQljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKTsKKwl9CiAKKwlwci0+ZmxhZ3MucG93ZXJfc2V0dXBfZG9uZSA9IDA7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzaGMuYyBiL2RyaXZlcnMvYWNwaS9zYnNoYy5jCmluZGV4IGY4YmUyM2IuLmY4ZDJhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zYnNoYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnNoYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgInNic2hjLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDQ0OWM1NTYuLjhhYjgwYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMTA2MiwxMyArMTA2MiwxMiBAQAogCWlmICghaWQpCiAJCXJldHVybjsKIAotCWlkLT5pZCA9IGttYWxsb2Moc3RybGVuKGRldl9pZCkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZC0+aWQgPSBrc3RyZHVwKGRldl9pZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZC0+aWQpIHsKIAkJa2ZyZWUoaWQpOwogCQlyZXR1cm47CiAJfQogCi0Jc3RyY3B5KGlkLT5pZCwgZGV2X2lkKTsKIAlsaXN0X2FkZF90YWlsKCZpZC0+bGlzdCwgJmRldmljZS0+cG5wLmlkcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKaW5kZXggMGU0NmZhZS4uNmQ5YTNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKQEAgLTM5OCw2ICszOTgsMTQgQEAKIAl9LAogCXsKIAkuY2FsbGJhY2sgPSBpbml0X252c19ub3NhdmUsCisJLmlkZW50ID0gIlNvbnkgVmFpbyBWUENFQjE3RlgiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVlBDRUIxN0ZYIiksCisJCX0sCisJfSwKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9udnNfbm9zYXZlLAogCS5pZGVudCA9ICJTb255IFZhaW8gVkdOLVNSMTFNIiwKIAkubWF0Y2hlcyA9IHsKIAkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCBjNTM4ZDBlLi45ZjY2MTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtNzA2LDExICs3MDYsMjMgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBzc2l6ZV90CithY3BpX3Nob3dfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYWNwaV9nYmxfRkFEVC5wcmVmZXJyZWRfcHJvZmlsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwbV9wcm9maWxlX2F0dHIgPQorCV9fQVRUUihwbV9wcm9maWxlLCBTX0lSVUdPLCBhY3BpX3Nob3dfcHJvZmlsZSwgTlVMTCk7CisKIGludCBfX2luaXQgYWNwaV9zeXNmc19pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IGFjcGlfdGFibGVzX3N5c2ZzX2luaXQoKTsKLQorCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoYWNwaV9rb2JqLCAmcG1fcHJvZmlsZV9hdHRyLmF0dHIpOwogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKaW5kZXggNWFmMzQ3OS4uZjNmMGZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYwpAQCAtMzMsNiArMzMsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbWJhL2J1cy5jIGIvZHJpdmVycy9hbWJhL2J1cy5jCmluZGV4IGQ3NDkyNmUuLmJkMjMwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW1iYS9idXMuYworKysgYi9kcml2ZXJzL2FtYmEvYnVzLmMKQEAgLTM2NSw2ICszNjUsNDAgQEAKIAogI2VuZGlmIC8qICFDT05GSUdfSElCRVJOQVRFX0NBTExCQUNLUyAqLwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKy8qCisgKiBIb29rcyB0byBwcm92aWRlIHJ1bnRpbWUgUE0gb2YgdGhlIHBjbGsgKGJ1cyBjbG9jaykuICBJdCBpcyBzYWZlIHRvCisgKiBlbmFibGUvZGlzYWJsZSB0aGUgYnVzIGNsb2NrIGF0IHJ1bnRpbWUgUE0gc3VzcGVuZC9yZXN1bWUgYXMgdGhpcworICogZG9lcyBub3QgcmVzdWx0IGluIGxvc3Mgb2YgY29udGV4dC4gIEhvd2V2ZXIsIGRpc2FibGluZyB2Y29yZSBwb3dlcgorICogd291bGQgZG8sIHNvIHdlIGxlYXZlIHRoYXQgdG8gdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBhbWJhX3BtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisJaW50IHJldCA9IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kKGRldik7CisKKwlpZiAocmV0ID09IDAgJiYgZGV2LT5kcml2ZXIpCisJCWNsa19kaXNhYmxlKHBjZGV2LT5wY2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1iYV9wbV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisJaW50IHJldDsKKworCWlmIChkZXYtPmRyaXZlcikgeworCQlyZXQgPSBjbGtfZW5hYmxlKHBjZGV2LT5wY2xrKTsKKwkJLyogRmFpbHVyZSBpcyBwcm9iYWJseSBmYXRhbCB0byB0aGUgc3lzdGVtLCBidXQuLi4gKi8KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoZGV2KTsKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BNCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhbWJhX3BtID0gewpAQCAtMzgzLDggKzQxNyw4IEBACiAJLnBvd2Vyb2ZmX25vaXJxCT0gYW1iYV9wbV9wb3dlcm9mZl9ub2lycSwKIAkucmVzdG9yZV9ub2lycQk9IGFtYmFfcG1fcmVzdG9yZV9ub2lycSwKIAlTRVRfUlVOVElNRV9QTV9PUFMoCi0JCXBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kLAotCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAorCQlhbWJhX3BtX3J1bnRpbWVfc3VzcGVuZCwKKwkJYW1iYV9wbV9ydW50aW1lX3Jlc3VtZSwKIAkJcG1fZ2VuZXJpY19ydW50aW1lX2lkbGUKIAkpCiB9OwpAQCAtNDI2LDkgKzQ2MCwxNyBAQAogCWlmIChJU19FUlIocGNsaykpCiAJCXJldHVybiBQVFJfRVJSKHBjbGspOwogCi0JcmV0ID0gY2xrX2VuYWJsZShwY2xrKTsKLQlpZiAocmV0KQorCXJldCA9IGNsa19wcmVwYXJlKHBjbGspOworCWlmIChyZXQpIHsKIAkJY2xrX3B1dChwY2xrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjbGtfZW5hYmxlKHBjbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3VucHJlcGFyZShwY2xrKTsKKwkJY2xrX3B1dChwY2xrKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDM4LDYgKzQ4MCw3IEBACiAJc3RydWN0IGNsayAqcGNsayA9IHBjZGV2LT5wY2xrOwogCiAJY2xrX2Rpc2FibGUocGNsayk7CisJY2xrX3VucHJlcGFyZShwY2xrKTsKIAljbGtfcHV0KHBjbGspOwogfQogCkBAIC00OTQsMTAgKzUzNywxOCBAQAogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAKKwkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKIAkJcmV0ID0gcGNkcnYtPnByb2JlKHBjZGV2LCBpZCk7CiAJCWlmIChyZXQgPT0gMCkKIAkJCWJyZWFrOwogCisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisKIAkJYW1iYV9wdXRfZGlzYWJsZV9wY2xrKHBjZGV2KTsKIAkJYW1iYV9wdXRfZGlzYWJsZV92Y29yZShwY2Rldik7CiAJfSB3aGlsZSAoMCk7CkBAIC01MDksNyArNTYwLDE2IEBACiB7CiAJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CiAJc3RydWN0IGFtYmFfZHJpdmVyICpkcnYgPSB0b19hbWJhX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaW50IHJldCA9IGRydi0+cmVtb3ZlKHBjZGV2KTsKKwlpbnQgcmV0OworCisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCXJldCA9IGRydi0+cmVtb3ZlKHBjZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKworCS8qIFVuZG8gdGhlIHJ1bnRpbWUgUE0gc2V0dGluZ3MgaW4gYW1iYV9wcm9iZSgpICovCisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CiAKIAlhbWJhX3B1dF9kaXNhYmxlX3BjbGsocGNkZXYpOwogCWFtYmFfcHV0X2Rpc2FibGVfdmNvcmUocGNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggNTk4N2UwYi4uNmJkZWRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC04MjAsNyArODIwLDcgQEAKIAogY29uZmlnIFBBVEFfT0ZfUExBVEZPUk0KIAl0cmlzdGF0ZSAiT3BlbkZpcm13YXJlIHBsYXRmb3JtIGRldmljZSBQQVRBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQVRBX1BMQVRGT1JNICYmIFBQQ19PRgorCWRlcGVuZHMgb24gUEFUQV9QTEFURk9STSAmJiBPRgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZ2VuZXJpYyBkaXJlY3RseSBjb25uZWN0ZWQgQVRBCiAJICBkZXZpY2VzIGNvbW1vbmx5IGZvdW5kIG9uIGVtYmVkZGVkIHN5c3RlbXMgd2l0aCBPcGVuRmlybXdhcmUKQEAgLTgzMSw2ICs4MzEsNyBAQAogY29uZmlnIFBBVEFfUURJCiAJdHJpc3RhdGUgIlFESSBWTEIgUEFUQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBCisJc2VsZWN0IFBBVEFfTEVHQUNZCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUURJIDY1MDAgYW5kIDY1ODAgUEFUQSBjb250cm9sbGVycyBvbiBWRVNBIGxvY2FsIGJ1cy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvTWFrZWZpbGUgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQppbmRleCA5NTUwZDY5Li42ZWNlNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQpAQCAtODgsNyArODgsNiBAQAogb2JqLSQoQ09ORklHX1BBVEFfUEFMTUxEKQkrPSBwYXRhX3BhbG1sZC5vCiBvYmotJChDT05GSUdfUEFUQV9QTEFURk9STSkJKz0gcGF0YV9wbGF0Zm9ybS5vCiBvYmotJChDT05GSUdfUEFUQV9PRl9QTEFURk9STSkJKz0gcGF0YV9vZl9wbGF0Zm9ybS5vCi1vYmotJChDT05GSUdfUEFUQV9RREkpCQkrPSBwYXRhX3FkaS5vCiBvYmotJChDT05GSUdfUEFUQV9SQjUzMikJKz0gcGF0YV9yYjUzMl9jZi5vCiBvYmotJChDT05GSUdfUEFUQV9SWjEwMDApCSs9IHBhdGFfcnoxMDAwLm8KIG9iai0kKENPTkZJR19QQVRBX1NBTVNVTkdfQ0YpCSs9IHBhdGFfc2Ftc3VuZ19jZi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggZmI3YjkwYi4uY2YyNjIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMzkwLDYgKzM5MCw5IEBACiAJLyogUHJvbWlzZSAqLwogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzZjIwKSwgYm9hcmRfYWhjaSB9LAkvKiBQREM0MjgxOSAqLwogCisJLyogQXNtZWRpYSAqLworCXsgUENJX1ZERVZJQ0UoQVNNRURJQSwgMHgwNjEyKSwgYm9hcmRfYWhjaSB9LAkvKiBBU00xMDYxICovCisKIAkvKiBHZW5lcmljLCBQQ0kgY2xhc3MgY29kZSBmb3IgQUhDSSAqLwogCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkgIFBDSV9DTEFTU19TVE9SQUdFX1NBVEFfQUhDSSwgMHhmZmZmZmYsIGJvYXJkX2FoY2kgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYwppbmRleCA2ZmVmMWZhLi5lYzU1NTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCkBAIC0yMyw2ICsyMyw0MSBAQAogI2luY2x1ZGUgPGxpbnV4L2FoY2lfcGxhdGZvcm0uaD4KICNpbmNsdWRlICJhaGNpLmgiCiAKK2VudW0gYWhjaV90eXBlIHsKKwlBSENJLAkJLyogc3RhbmRhcmQgcGxhdGZvcm0gYWhjaSAqLworCUlNWDUzX0FIQ0ksCS8qIGFoY2kgb24gaS5teDUzICovCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhaGNpX2RldnR5cGVbXSA9IHsKKwl7CisJCS5uYW1lID0gImFoY2kiLAorCQkuZHJpdmVyX2RhdGEgPSBBSENJLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14NTMtYWhjaSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDUzX0FIQ0ksCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBhaGNpX2RldnR5cGUpOworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mb1tdID0geworCS8qIGJ5IGZlYXR1cmVzICovCisJW0FIQ0ldID0geworCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCisJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCisJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKKwl9LAorCVtJTVg1M19BSENJXSA9IHsKKwkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCisJCS5waW9fbWFzawk9IEFUQV9QSU80LAorCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCQkucG9ydF9vcHMJPSAmYWhjaV9wbXBfcmV0cnlfc3JzdF9vcHMsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFoY2lfcGxhdGZvcm1fc2h0ID0gewogCUFIQ0lfU0hUKCJhaGNpX3BsYXRmb3JtIiksCiB9OwpAQCAtMzAsMTMgKzY1LDkgQEAKIHN0YXRpYyBpbnQgX19pbml0IGFoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gewotCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKLQkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCi0JCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCi0JCS5wb3J0X29wcwk9ICZhaGNpX29wcywKLQl9OworCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KTsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IGFoY2lfcG9ydF9pbmZvW2lkLT5kcml2ZXJfZGF0YV07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTE2MCw3ICsxOTEsNyBAQAogc3RhdGljIGludCBfX2RldmV4aXQgYWhjaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJYXRhX2hvc3RfZGV0YWNoKGhvc3QpOwpAQCAtMTcxLDEyICsyMDIsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWhjaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1haGNpIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhaGNpX29mX21hdGNoKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWhjaV9kcml2ZXIgPSB7CiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFoY2lfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhaGNpIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFoY2lfb2ZfbWF0Y2gsCiAJfSwKKwkuaWRfdGFibGUJPSBhaGNpX2RldnR5cGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhaGNpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCmluZGV4IDQzMTA3ZTkuLjY5YWMzNzNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xMTMsNiArMTEzLDggQEAKIAlQSUlYX1BBVEFfRkxBR1MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAlQSUlYX1NBVEFfRkxBR1MJCT0gQVRBX0ZMQUdfU0FUQSB8IFBJSVhfRkxBR19DSEVDS0lOVFIsCiAKKwlQSUlYX0ZMQUdfUElPMTYJCT0gKDEgPDwgMzApLCAvKnN1cHBvcnQgMTZiaXQgUElPIG9ubHkqLworCiAJUElJWF84MENfUFJJCQk9ICgxIDw8IDUpIHwgKDEgPDwgNCksCiAJUElJWF84MENfU0VDCQk9ICgxIDw8IDcpIHwgKDEgPDwgNiksCiAKQEAgLTE0Nyw2ICsxNDksNyBAQAogCWljaDhtX2FwcGxlX3NhdGEsCS8qIGxvY2tzIHVwIG9uIHNlY29uZCBwb3J0IGVuYWJsZSAqLwogCXRvbGFwYWlfc2F0YSwKIAlwaWl4X3BhdGFfdm13LAkJCS8qIFBJSVg0IGZvciBWTXdhcmUsIHNwdXJpb3VzIERNQV9FUlIgKi8KKwlpY2g4X3NhdGFfc25iLAogfTsKIAogc3RydWN0IHBpaXhfbWFwX2RiIHsKQEAgLTE3Nyw2ICsxODAsNyBAQAogc3RhdGljIGludCBwaWl4X3NpZHByX3NldF9scG0oc3RydWN0IGF0YV9saW5rICpsaW5rLCBlbnVtIGF0YV9scG1fcG9saWN5IHBvbGljeSwKIAkJCSAgICAgIHVuc2lnbmVkIGhpbnRzKTsKIHN0YXRpYyBib29sIHBpaXhfaXJxX2NoZWNrKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwaWl4X3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBpaXhfcGNpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZyk7CiBzdGF0aWMgaW50IHBpaXhfcGNpX2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwpAQCAtMjk4LDIxICszMDIsMjEgQEAKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChQQ0gpICovCiAJeyAweDgwODYsIDB4M2IyZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoQ1BUKSAqLwotCXsgMHg4MDg2LCAweDFjMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAorCXsgMHg4MDg2LCAweDFjMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YV9zbmIgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChDUFQpICovCi0JeyAweDgwODYsIDB4MWMwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhIH0sCisJeyAweDgwODYsIDB4MWMwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF9zYXRhX3NuYiB9LAogCS8qIFNBVEEgQ29udHJvbGxlciBJREUgKENQVCkgKi8KIAl7IDB4ODA4NiwgMHgxYzA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4XzJwb3J0X3NhdGEgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChDUFQpICovCiAJeyAweDgwODYsIDB4MWMwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF8ycG9ydF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUEJHKSAqLwotCXsgMHg4MDg2LCAweDFkMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YSB9LAorCXsgMHg4MDg2LCAweDFkMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDhfc2F0YV9zbmIgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChQQkcpICovCiAJeyAweDgwODYsIDB4MWQwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoOF8ycG9ydF9zYXRhIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUGFudGhlciBQb2ludCkgKi8KLQl7IDB4ODA4NiwgMHgxZTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGEgfSwKKwl7IDB4ODA4NiwgMHgxZTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGFfc25iIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUGFudGhlciBQb2ludCkgKi8KLQl7IDB4ODA4NiwgMHgxZTAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGEgfSwKKwl7IDB4ODA4NiwgMHgxZTAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4X3NhdGFfc25iIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIElERSAoUGFudGhlciBQb2ludCkgKi8KIAl7IDB4ODA4NiwgMHgxZTA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g4XzJwb3J0X3NhdGEgfSwKIAkvKiBTQVRBIENvbnRyb2xsZXIgSURFIChQYW50aGVyIFBvaW50KSAqLwpAQCAtMzM4LDYgKzM0Miw3IEBACiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9zYXRhX29wcyA9IHsKIAkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5zZmZfaXJxX2NoZWNrCQk9IHBpaXhfaXJxX2NoZWNrLAorCS5wb3J0X3N0YXJ0CQk9IHBpaXhfcG9ydF9zdGFydCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBwaWl4X3BhdGFfb3BzID0gewpAQCAtNDc4LDYgKzQ4Myw3IEBACiAJW2ljaDhfMnBvcnRfc2F0YV0JPSAmaWNoOF8ycG9ydF9tYXBfZGIsCiAJW2ljaDhtX2FwcGxlX3NhdGFdCT0gJmljaDhtX2FwcGxlX21hcF9kYiwKIAlbdG9sYXBhaV9zYXRhXQkJPSAmdG9sYXBhaV9tYXBfZGIsCisJW2ljaDhfc2F0YV9zbmJdCQk9ICZpY2g4X21hcF9kYiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaWl4X3BvcnRfaW5mb1tdID0gewpAQCAtNjA2LDYgKzYxMiwxOSBAQAogCQkucG9ydF9vcHMJPSAmcGlpeF92bXdfb3BzLAogCX0sCiAKKwkvKgorCSAqIHNvbWUgU2FuZHlicmlkZ2UgY2hpcHNldHMgaGF2ZSBicm9rZW4gMzIgbW9kZSB1cCB0byBub3csCisJICogc2VlIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDA1OTIKKwkgKi8KKwlbaWNoOF9zYXRhX3NuYl0gPQorCXsKKwkJLmZsYWdzCQk9IFBJSVhfU0FUQV9GTEFHUyB8IFBJSVhfRkxBR19TSURQUiB8IFBJSVhfRkxBR19QSU8xNiwKKwkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCisJCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwKKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCisJfSwKKwogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfYml0cyBwaWl4X2VuYWJsZV9iaXRzW10gPSB7CkBAIC02NDksNiArNjY4LDE0IEBACiAJeyAwLCB9CiB9OwogCitzdGF0aWMgaW50IHBpaXhfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWlmICghKGFwLT5mbGFncyAmIFBJSVhfRkxBR19QSU8xNikpCisJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX1BJTzMyIHwgQVRBX1BGTEFHX1BJTzMyQ0hBTkdFOworCisJcmV0dXJuIGF0YV9ibWRtYV9wb3J0X3N0YXJ0KGFwKTsKK30KKwogLyoqCiAgKglpY2hfcGF0YV9jYWJsZV9kZXRlY3QgLSBQcm9iZSBob3N0IGNvbnRyb2xsZXIgY2FibGUgZGV0ZWN0IGluZm8KICAqCUBhcDogUG9ydCBmb3Igd2hpY2ggY2FibGUgZGV0ZWN0IGluZm8gaXMgZGVzaXJlZApAQCAtNzA0LDIyICs3MzEsMTEgQEAKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhwaWl4X2xvY2spOwogCi0vKioKLSAqCXBpaXhfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCi0gKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKLSAqCUBhZGV2OiB1bQotICoKLSAqCVNldCBQSU8gbW9kZSBmb3IgZGV2aWNlLCBpbiBob3N0IGNvbnRyb2xsZXIgUENJIGNvbmZpZyBzcGFjZS4KLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KLSAqLwotCi1zdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQorc3RhdGljIHZvaWQgcGlpeF9zZXRfdGltaW5ncyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwKKwkJCSAgICAgdTggcGlvKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHBpbwk9IGFkZXYtPnBpb19tb2RlIC0gWEZFUl9QSU9fMDsKIAl1bnNpZ25lZCBpbnQgaXNfc2xhdmUJPSAoYWRldi0+ZGV2bm8gIT0gMCk7CiAJdW5zaWduZWQgaW50IG1hc3Rlcl9wb3J0PSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOwogCXVuc2lnbmVkIGludCBzbGF2ZV9wb3J0CT0gMHg0NDsKQEAgLTc0NCwxMCArNzYwLDE2IEBACiAJCWNvbnRyb2wgfD0gMTsJLyogVElNRTEgZW5hYmxlICovCiAJaWYgKGF0YV9waW9fbmVlZF9pb3JkeShhZGV2KSkKIAkJY29udHJvbCB8PSAyOwkvKiBJRSBlbmFibGUgKi8KLQogCS8qIEludGVsIHNwZWNpZmllcyB0aGF0IHRoZSBQUEUgZnVuY3Rpb25hbGl0eSBpcyBmb3IgZGlzayBvbmx5ICovCiAJaWYgKGFkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKQogCQljb250cm9sIHw9IDQ7CS8qIFBQRSBlbmFibGUgKi8KKwkvKgorCSAqIElmIHRoZSBkcml2ZSBNV0RNQSBpcyBmYXN0ZXIgdGhhbiBpdCBjYW4gZG8gUElPIHRoZW4KKwkgKiB3ZSBtdXN0IGZvcmNlIFBJTyBpbnRvIFBJTzAKKwkgKi8KKwlpZiAoYWRldi0+cGlvX21vZGUgPCBYRkVSX1BJT18wICsgcGlvKQorCQkvKiBFbmFibGUgRE1BIHRpbWluZyBvbmx5ICovCisJCWNvbnRyb2wgfD0gODsJLyogUElPIGN5Y2xlcyBpbiBQSU8wICovCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGlpeF9sb2NrLCBmbGFncyk7CiAKQEAgLTc1OSw4ICs3ODEsNiBAQAogCWlmIChpc19zbGF2ZSkgewogCQkvKiBjbGVhciBUSU1FMXxJRTF8UFBFMXxEVEUxICovCiAJCW1hc3Rlcl9kYXRhICY9IDB4ZmYwZjsKLQkJLyogRW5hYmxlIFNJVFJFIChzZXBhcmF0ZSBzbGF2ZSB0aW1pbmcgcmVnaXN0ZXIpICovCi0JCW1hc3Rlcl9kYXRhIHw9IDB4NDAwMDsKIAkJLyogZW5hYmxlIFBQRTEsIElFMSBhbmQgVElNRTEgYXMgbmVlZGVkICovCiAJCW1hc3Rlcl9kYXRhIHw9IChjb250cm9sIDw8IDQpOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsICZzbGF2ZV9kYXRhKTsKQEAgLTc3OCw2ICs3OTgsOSBAQAogCQkJKHRpbWluZ3NbcGlvXVswXSA8PCAxMikgfAogCQkJKHRpbWluZ3NbcGlvXVsxXSA8PCA4KTsKIAl9CisKKwkvKiBFbmFibGUgU0lUUkUgKHNlcGFyYXRlIHNsYXZlIHRpbWluZyByZWdpc3RlcikgKi8KKwltYXN0ZXJfZGF0YSB8PSAweDQwMDA7CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsIG1hc3Rlcl9kYXRhKTsKIAlpZiAoaXNfc2xhdmUpCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHNsYXZlX3BvcnQsIHNsYXZlX2RhdGEpOwpAQCAtNzk1LDYgKzgxOCwyMiBAQAogfQogCiAvKioKKyAqCXBpaXhfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCisgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKKyAqCUBhZGV2OiBEcml2ZSBpbiBxdWVzdGlvbgorICoKKyAqCVNldCBQSU8gbW9kZSBmb3IgZGV2aWNlLCBpbiBob3N0IGNvbnRyb2xsZXIgUENJIGNvbmZpZyBzcGFjZS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KKyAqLworCitzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQoreworCXBpaXhfc2V0X3RpbWluZ3MoYXAsIGFkZXYsIGFkZXYtPnBpb19tb2RlIC0gWEZFUl9QSU9fMCk7Cit9CisKKy8qKgogICoJZG9fcGF0YV9zZXRfZG1hbW9kZSAtIEluaXRpYWxpemUgaG9zdCBjb250cm9sbGVyIFBBVEEgUElPIHRpbWluZ3MKICAqCUBhcDogUG9ydCB3aG9zZSB0aW1pbmdzIHdlIGFyZSBjb25maWd1cmluZwogICoJQGFkZXY6IERyaXZlIGluIHF1ZXN0aW9uCkBAIC04MTAsMzEgKzg0OSwyMCBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggbWFzdGVyX3BvcnQJCT0gYXAtPnBvcnRfbm8gPyAweDQyIDogMHg0MDsKLQl1MTYgbWFzdGVyX2RhdGE7CiAJdTggc3BlZWQJCT0gYWRldi0+ZG1hX21vZGU7CiAJaW50IGRldmlkCQk9IGFkZXYtPmRldm5vICsgMiAqIGFwLT5wb3J0X25vOwogCXU4IHVkbWFfZW5hYmxlCQk9IDA7CiAKLQlzdGF0aWMgY29uc3QJIC8qIElTUCAgUlRDICovCi0JdTggdGltaW5nc1tdWzJdCT0geyB7IDAsIDAgfSwKLQkJCSAgICB7IDAsIDAgfSwKLQkJCSAgICB7IDEsIDAgfSwKLQkJCSAgICB7IDIsIDEgfSwKLQkJCSAgICB7IDIsIDMgfSwgfTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwaWl4X2xvY2ssIGZsYWdzKTsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7Ci0JaWYgKGFwLT51ZG1hX21hc2spCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgJnVkbWFfZW5hYmxlKTsKLQogCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgewotCQl1bnNpZ25lZCBpbnQgdWRtYSA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9VRE1BXzA7CisJCXVuc2lnbmVkIGludCB1ZG1hID0gc3BlZWQgLSBYRkVSX1VETUFfMDsKIAkJdTE2IHVkbWFfdGltaW5nOwogCQl1MTYgaWRlY29uZjsKIAkJaW50IHVfY2xvY2ssIHVfc3BlZWQ7CiAKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBpaXhfbG9jaywgZmxhZ3MpOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgJnVkbWFfZW5hYmxlKTsKKwogCQkvKgogCQkgKiBVRE1BIGlzIGhhbmRsZWQgYnkgYSBjb21iaW5hdGlvbiBvZiBjbG9jayBzd2l0Y2hpbmcgYW5kCiAJCSAqIHNlbGVjdGlvbiBvZiBkaXZpZGVycwpAQCAtODY3LDU2ICs4OTUsMjEgQEAKIAkJCSAgIHBlcmZvcm1hbmNlIChXUl9QaW5nUG9uZ19FbikgKi8KIAkJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTQsIGlkZWNvbmYpOwogCQl9CisKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgdWRtYV9lbmFibGUpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpaXhfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE1XRE1BIGlzIGRyaXZlbiBieSB0aGUgUElPIHRpbWluZ3MuIFdlIG11c3QgYWxzbyBlbmFibGUKLQkJICogSU9SRFkgdW5jb25kaXRpb25hbGx5IGFsb25nIHdpdGggVElNRTEuIFBQRSBoYXMgYWxyZWFkeQotCQkgKiBiZWVuIHNldCB3aGVuIHRoZSBQSU8gdGltaW5nIHdhcyBzZXQuCi0JCSAqLwotCQl1bnNpZ25lZCBpbnQgbXdkbWEJPSBhZGV2LT5kbWFfbW9kZSAtIFhGRVJfTVdfRE1BXzA7Ci0JCXVuc2lnbmVkIGludCBjb250cm9sOwotCQl1OCBzbGF2ZV9kYXRhOworCQkvKiBNV0RNQSBpcyBkcml2ZW4gYnkgdGhlIFBJTyB0aW1pbmdzLiAqLworCQl1bnNpZ25lZCBpbnQgbXdkbWEgPSBzcGVlZCAtIFhGRVJfTVdfRE1BXzA7CiAJCWNvbnN0IHVuc2lnbmVkIGludCBuZWVkZWRfcGlvWzNdID0gewogCQkJWEZFUl9QSU9fMCwgWEZFUl9QSU9fMywgWEZFUl9QSU9fNAogCQl9OwogCQlpbnQgcGlvID0gbmVlZGVkX3Bpb1ttd2RtYV0gLSBYRkVSX1BJT18wOwogCi0JCWNvbnRyb2wgPSAzOwkvKiBJT1JEWXxUSU1FMSAqLwotCi0JCS8qIElmIHRoZSBkcml2ZSBNV0RNQSBpcyBmYXN0ZXIgdGhhbiBpdCBjYW4gZG8gUElPIHRoZW4KLQkJICAgd2UgbXVzdCBmb3JjZSBQSU8gaW50byBQSU8wICovCi0KLQkJaWYgKGFkZXYtPnBpb19tb2RlIDwgbmVlZGVkX3Bpb1ttd2RtYV0pCi0JCQkvKiBFbmFibGUgRE1BIHRpbWluZyBvbmx5ICovCi0JCQljb250cm9sIHw9IDg7CS8qIFBJTyBjeWNsZXMgaW4gUElPMCAqLwotCi0JCWlmIChhZGV2LT5kZXZubykgewkvKiBTbGF2ZSAqLwotCQkJbWFzdGVyX2RhdGEgJj0gMHhGRjRGOyAgLyogTWFzayBvdXQgSU9SRFl8VElNRTF8RE1BT05MWSAqLwotCQkJbWFzdGVyX2RhdGEgfD0gY29udHJvbCA8PCA0OwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAmc2xhdmVfZGF0YSk7Ci0JCQlzbGF2ZV9kYXRhICY9IChhcC0+cG9ydF9ubyA/IDB4MGYgOiAweGYwKTsKLQkJCS8qIExvYWQgdGhlIG1hdGNoaW5nIHRpbWluZyAqLwotCQkJc2xhdmVfZGF0YSB8PSAoKHRpbWluZ3NbcGlvXVswXSA8PCAyKSB8IHRpbWluZ3NbcGlvXVsxXSkgPDwgKGFwLT5wb3J0X25vID8gNCA6IDApOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0NCwgc2xhdmVfZGF0YSk7Ci0JCX0gZWxzZSB7IAkvKiBNYXN0ZXIgKi8KLQkJCW1hc3Rlcl9kYXRhICY9IDB4Q0NGNDsJLyogTWFzayBvdXQgSU9SRFl8VElNRTF8RE1BT05MWQotCQkJCQkJICAgYW5kIG1hc3RlciB0aW1pbmcgYml0cyAqLwotCQkJbWFzdGVyX2RhdGEgfD0gY29udHJvbDsKLQkJCW1hc3Rlcl9kYXRhIHw9Ci0JCQkJKHRpbWluZ3NbcGlvXVswXSA8PCAxMikgfAotCQkJCSh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7Ci0JCX0KLQotCQlpZiAoYXAtPnVkbWFfbWFzaykKLQkJCXVkbWFfZW5hYmxlICY9IH4oMSA8PCBkZXZpZCk7Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsIG1hc3Rlcl9kYXRhKTsKKwkJLyogWEZFUl9QSU9fMCBpcyBuZXZlciB1c2VkIGN1cnJlbnRseSAqLworCQlwaWl4X3NldF90aW1pbmdzKGFwLCBhZGV2LCBwaW8pOwogCX0KLQkvKiBEb24ndCBzY3JpYmJsZSBvbiAweDQ4IGlmIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgVURNQSAqLwotCWlmIChhcC0+dWRtYV9tYXNrKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCB1ZG1hX2VuYWJsZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaWl4X2xvY2ssIGZsYWdzKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCA0YTNhNWFlLi5jMDRhZDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTI5MzgsNyArMjkzOCw3IEBACiAJaWYgKGlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CS8qIEVJREUgZHJpdmUgKi8KIAkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwogCi0JCWlmIChzcGVlZCA+PSBYRkVSX1BJT18wICYmIHNwZWVkIDw9IFhGRVJfU1dfRE1BXzApIHsKKwkJaWYgKHNwZWVkID49IFhGRVJfUElPXzAgJiYgc3BlZWQgPCBYRkVSX1NXX0RNQV8wKSB7CiAJCQlpZiAoc3BlZWQgPD0gWEZFUl9QSU9fMikKIAkJCQlwLmN5Y2xlID0gcC5jeWM4YiA9IGlkW0FUQV9JRF9FSURFX1BJT107CiAJCQllbHNlIGlmICgoc3BlZWQgPD0gWEZFUl9QSU9fNCkgfHwKQEAgLTY3MTMsNiArNjcxMyw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9zbGF2ZV9jb25maWcpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfc2xhdmVfZGVzdHJveSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgpOworRVhQT1JUX1NZTUJPTF9HUEwoX19hdGFfY2hhbmdlX3F1ZXVlX2RlcHRoKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc2NyX3ZhbGlkKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc2NyX3JlYWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zY3Jfd3JpdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCBlZDE2ZmJlLi5hOWIyODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTI1MzIsOCArMjUzMyw3IEBACiAJcmV0dXJuIHJlc2V0KGxpbmssIGNsYXNzZXMsIGRlYWRsaW5lKTsKIH0KIAotc3RhdGljIGludCBhdGFfZWhfZm9sbG93dXBfc3JzdF9uZWVkZWQoc3RydWN0IGF0YV9saW5rICpsaW5rLAotCQkJCSAgICAgICBpbnQgcmMsIGNvbnN0IHVuc2lnbmVkIGludCAqY2xhc3NlcykKK3N0YXRpYyBpbnQgYXRhX2VoX2ZvbGxvd3VwX3Nyc3RfbmVlZGVkKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJjKQogewogCWlmICgobGluay0+ZmxhZ3MgJiBBVEFfTEZMQUdfTk9fU1JTVCkgfHwgYXRhX2xpbmtfb2ZmbGluZShsaW5rKSkKIAkJcmV0dXJuIDA7CkBAIC0yNzI2LDcgKzI3MjYsNyBAQAogCiAJCS8qIHBlcmZvcm0gZm9sbG93LXVwIFNSU1QgaWYgbmVjZXNzYXJ5ICovCiAJCWlmIChyZXNldCA9PSBoYXJkcmVzZXQgJiYKLQkJICAgIGF0YV9laF9mb2xsb3d1cF9zcnN0X25lZWRlZChsaW5rLCByYywgY2xhc3NlcykpIHsKKwkJICAgIGF0YV9laF9mb2xsb3d1cF9zcnN0X25lZWRlZChsaW5rLCByYykpIHsKIAkJCXJlc2V0ID0gc29mdHJlc2V0OwogCiAJCQlpZiAoIXJlc2V0KSB7CkBAIC0yODgzLDcgKzI4ODMsNyBAQAogCSAgICBzYXRhX3Njcl9yZWFkKGxpbmssIFNDUl9TVEFUVVMsICZzc3RhdHVzKSkKIAkJcmMgPSAtRVJFU1RBUlQ7CiAKLQlpZiAocmMgPT0gLUVSRVNUQVJUIHx8IHRyeSA+PSBtYXhfdHJpZXMpIHsKKwlpZiAodHJ5ID49IG1heF90cmllcykgewogCQkvKgogCQkgKiBUaGF3IGhvc3QgcG9ydCBldmVuIGlmIHJlc2V0IGZhaWxlZCwgc28gdGhhdCB0aGUgcG9ydAogCQkgKiBjYW4gYmUgcmV0cmllZCBvbiB0aGUgbmV4dCBwaHkgZXZlbnQuICBUaGlzIHJpc2tzCkBAIC0yOTA5LDYgKzI5MDksMTYgQEAKIAkJYXRhX2VoX2FjcXVpcmUoYXApOwogCX0KIAorCS8qCisJICogV2hpbGUgZGlza3Mgc3BpbnVwIGJlaGluZCBQTVAsIHNvbWUgY29udHJvbGxlcnMgZmFpbCBzZW5kaW5nIFNSU1QuCisJICogVGhleSBuZWVkIHRvIGJlIHJlc2V0IC0gYXMgd2VsbCBhcyB0aGUgUE1QIC0gYmVmb3JlIHJldHJ5aW5nLgorCSAqLworCWlmIChyYyA9PSAtRVJFU1RBUlQpIHsKKwkJaWYgKGF0YV9pc19ob3N0X2xpbmsobGluaykpCisJCQlhdGFfZWhfdGhhd19wb3J0KGFwKTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKHRyeSA9PSBtYXhfdHJpZXMgLSAxKSB7CiAJCXNhdGFfZG93bl9zcGRfbGltaXQobGluaywgMCk7CiAJCWlmIChzbGF2ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1wbXAuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1wbXAuYwppbmRleCAzZWIyYjgxLi4yMWI4MGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtcG1wLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXBtcC5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibGliYXRhLmgiCkBAIC0zODgsMTIgKzM4OSw5IEBACiAJCQkvKiBsaW5rIHJlcG9ydHMgb2ZmbGluZSBhZnRlciBMUE0gKi8KIAkJCWxpbmstPmZsYWdzIHw9IEFUQV9MRkxBR19OT19MUE07CiAKLQkJCS8qIENsYXNzIGNvZGUgcmVwb3J0IGlzIHVucmVsaWFibGUgYW5kIFNSU1QKLQkJCSAqIHRpbWVzIG91dCB1bmRlciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLgotCQkJICovCisJCQkvKiBDbGFzcyBjb2RlIHJlcG9ydCBpcyB1bnJlbGlhYmxlLiAqLwogCQkJaWYgKGxpbmstPnBtcCA8IDUpCi0JCQkJbGluay0+ZmxhZ3MgfD0gQVRBX0xGTEFHX05PX1NSU1QgfAotCQkJCQkgICAgICAgQVRBX0xGTEFHX0FTU1VNRV9BVEE7CisJCQkJbGluay0+ZmxhZ3MgfD0gQVRBX0xGTEFHX0FTU1VNRV9BVEE7CiAKIAkJCS8qIHBvcnQgNSBpcyBmb3IgU0VNQiBkZXZpY2UgYW5kIGl0IGRvZXNuJ3QgbGlrZSBTUlNUICovCiAJCQlpZiAobGluay0+cG1wID09IDUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCA0NmQwODdmLi4yYTU0MTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTEyMTUsMjUgKzEyMTYsMTkgQEAKIH0KIAogLyoqCi0gKglhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGggLSBTQ1NJIGNhbGxiYWNrIGZvciBxdWV1ZSBkZXB0aCBjb25maWcKKyAqCV9fYXRhX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIGhlbHBlciBmb3IgYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoCisgKglAYXA6IEFUQSBwb3J0IHRvIHdoaWNoIHRoZSBkZXZpY2UgY2hhbmdlIHRoZSBxdWV1ZSBkZXB0aAogICoJQHNkZXY6IFNDU0kgZGV2aWNlIHRvIGNvbmZpZ3VyZSBxdWV1ZSBkZXB0aCBmb3IKICAqCUBxdWV1ZV9kZXB0aDogbmV3IHF1ZXVlIGRlcHRoCiAgKglAcmVhc29uOiBjYWxsaW5nIGNvbnRleHQKICAqCi0gKglUaGlzIGlzIGxpYmF0YSBzdGFuZGFyZCBob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoIGNhbGxiYWNrLgotICoJU0NTSSB3aWxsIGNhbGwgaW50byB0aGlzIGNhbGxiYWNrIHdoZW4gdXNlciB0cmllcyB0byBzZXQgcXVldWUKLSAqCWRlcHRoIHZpYSBzeXNmcy4KKyAqCWxpYnNhcyBhbmQgbGliYXRhIGhhdmUgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGFzc29jaWF0aW5nIGEgc2RldiB0bworICoJaXRzIGF0YV9wb3J0LgogICoKLSAqCUxPQ0tJTkc6Ci0gKglTQ1NJIGxheWVyICh3ZSBkb24ndCBjYXJlKQotICoKLSAqCVJFVFVSTlM6Ci0gKglOZXdseSBjb25maWd1cmVkIHF1ZXVlIGRlcHRoLgogICovCi1pbnQgYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoLAotCQkJCWludCByZWFzb24pCitpbnQgX19hdGFfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKKwkJCSAgICAgaW50IHF1ZXVlX2RlcHRoLCBpbnQgcmVhc29uKQogewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChzZGV2LT5ob3N0KTsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyNjksNiArMTI2NCwzMCBAQAogfQogCiAvKioKKyAqCWF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCAtIFNDU0kgY2FsbGJhY2sgZm9yIHF1ZXVlIGRlcHRoIGNvbmZpZworICoJQHNkZXY6IFNDU0kgZGV2aWNlIHRvIGNvbmZpZ3VyZSBxdWV1ZSBkZXB0aCBmb3IKKyAqCUBxdWV1ZV9kZXB0aDogbmV3IHF1ZXVlIGRlcHRoCisgKglAcmVhc29uOiBjYWxsaW5nIGNvbnRleHQKKyAqCisgKglUaGlzIGlzIGxpYmF0YSBzdGFuZGFyZCBob3N0dC0+Y2hhbmdlX3F1ZXVlX2RlcHRoIGNhbGxiYWNrLgorICoJU0NTSSB3aWxsIGNhbGwgaW50byB0aGlzIGNhbGxiYWNrIHdoZW4gdXNlciB0cmllcyB0byBzZXQgcXVldWUKKyAqCWRlcHRoIHZpYSBzeXNmcy4KKyAqCisgKglMT0NLSU5HOgorICoJU0NTSSBsYXllciAod2UgZG9uJ3QgY2FyZSkKKyAqCisgKglSRVRVUk5TOgorICoJTmV3bHkgY29uZmlndXJlZCBxdWV1ZSBkZXB0aC4KKyAqLworaW50IGF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBxdWV1ZV9kZXB0aCwKKwkJCQlpbnQgcmVhc29uKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChzZGV2LT5ob3N0KTsKKworCXJldHVybiBfX2F0YV9jaGFuZ2VfcXVldWVfZGVwdGgoYXAsIHNkZXYsIHF1ZXVlX2RlcHRoLCByZWFzb24pOworfQorCisvKioKICAqCWF0YV9zY3NpX3N0YXJ0X3N0b3BfeGxhdCAtIFRyYW5zbGF0ZSBTQ1NJIFNUQVJUIFNUT1AgVU5JVCBjb21tYW5kCiAgKglAcWM6IFN0b3JhZ2UgZm9yIHRyYW5zbGF0ZWQgQVRBIHRhc2tmaWxlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IGMyNDEyN2QuLjYzZDUzMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKQEAgLTU2OSw3ICs1NzAsNyBAQAogCiAJLyogVHJhbnNmZXIgdHJhaWxpbmcgYnl0ZSwgaWYgYW55LiAqLwogCWlmICh1bmxpa2VseShidWZsZW4gJiAweDAxKSkgewotCQl1bnNpZ25lZCBjaGFyIHBhZFsyXTsKKwkJdW5zaWduZWQgY2hhciBwYWRbMl0gPSB7IH07CiAKIAkJLyogUG9pbnQgYnVmIHRvIHRoZSB0YWlsIG9mIGJ1ZmZlciAqLwogCQlidWYgKz0gYnVmbGVuIC0gMTsKQEAgLTYyOCw3ICs2MjksNyBAQAogCiAJLyogVHJhbnNmZXIgdHJhaWxpbmcgYnl0ZXMsIGlmIGFueSAqLwogCWlmICh1bmxpa2VseShzbG9wKSkgewotCQl1bnNpZ25lZCBjaGFyIHBhZFs0XTsKKwkJdW5zaWduZWQgY2hhciBwYWRbNF0gPSB7IH07CiAKIAkJLyogUG9pbnQgYnVmIHRvIHRoZSB0YWlsIG9mIGJ1ZmZlciAqLwogCQlidWYgKz0gYnVmbGVuIC0gc2xvcDsKQEAgLTY3OCw3ICs2NzksNyBAQAogCXVuc2lnbmVkIGludCBjb25zdW1lZDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljb25zdW1lZCA9IGF0YV9zZmZfZGF0YV94ZmVyKGRldiwgYnVmLCBidWZsZW4sIHJ3KTsKKwljb25zdW1lZCA9IGF0YV9zZmZfZGF0YV94ZmVyMzIoZGV2LCBidWYsIGJ1ZmxlbiwgcncpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCXJldHVybiBjb25zdW1lZDsKQEAgLTI1MDcsNiArMjUwOCw1NiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGF0YV9wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKnBwaSwKKwkJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCB2b2lkICpob3N0X3ByaXYsCisJCWludCBoZmxhZ3MsIGJvb2wgYm1kbWEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGk7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gTlVMTDsKKwlpbnQgcmM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlwaSA9IGF0YV9zZmZfZmluZF92YWxpZF9waShwcGkpOworCWlmICghcGkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gdmFsaWQgcG9ydF9pbmZvIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZGV2LCBOVUxMLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJaWYgKGJtZG1hKQorCQkvKiBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBCTURNQSBob3N0ICovCisJCXJjID0gYXRhX3BjaV9ibWRtYV9wcmVwYXJlX2hvc3QocGRldiwgcHBpLCAmaG9zdCk7CisJZWxzZQorCQkvKiBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBTRkYgaG9zdCAqLworCQlyYyA9IGF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdChwZGV2LCBwcGksICZob3N0KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhvc3RfcHJpdjsKKwlob3N0LT5mbGFncyB8PSBoZmxhZ3M7CisKKwlpZiAoYm1kbWEpIHsKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCXJjID0gYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdChob3N0LCBhdGFfYm1kbWFfaW50ZXJydXB0LCBzaHQpOworCX0gZWxzZQorCQlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsIHNodCk7CitvdXQ6CisJaWYgKHJjID09IDApCisJCWRldnJlc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7CisJZWxzZQorCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKKworCXJldHVybiByYzsKK30KKwogLyoqCiAgKglhdGFfcGNpX3NmZl9pbml0X29uZSAtIEluaXRpYWxpemUvcmVnaXN0ZXIgUElPLW9ubHkgUENJIElERSBjb250cm9sbGVyCiAgKglAcGRldjogQ29udHJvbGxlciB0byBiZSBpbml0aWFsaXplZApAQCAtMjUzMyw0MSArMjU4NCw3IEBACiAJCSBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICpwcGksCiAJCSBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQsIHZvaWQgKmhvc3RfcHJpdiwgaW50IGhmbGFnKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpOwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IE5VTEw7Ci0JaW50IHJjOwotCi0JRFBSSU5USygiRU5URVJcbiIpOwotCi0JcGkgPSBhdGFfc2ZmX2ZpbmRfdmFsaWRfcGkocHBpKTsKLQlpZiAoIXBpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIHBvcnRfaW5mbyBzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWRldnJlc19vcGVuX2dyb3VwKGRldiwgTlVMTCwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQotCS8qIHByZXBhcmUgYW5kIGFjdGl2YXRlIFNGRiBob3N0ICovCi0JcmMgPSBhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3QocGRldiwgcHBpLCAmaG9zdCk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQlob3N0LT5wcml2YXRlX2RhdGEgPSBob3N0X3ByaXY7Ci0JaG9zdC0+ZmxhZ3MgfD0gaGZsYWc7Ci0KLQlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsIHNodCk7Ci1vdXQ6Ci0JaWYgKHJjID09IDApCi0JCWRldnJlc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7Ci0JZWxzZQotCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGksIHNodCwgaG9zdF9wcml2LCBoZmxhZywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9pbml0X29uZSk7CiAKQEAgLTMyODYsNDIgKzMzMDMsNyBAQAogCQkJICAgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCB2b2lkICpob3N0X3ByaXYsCiAJCQkgICBpbnQgaGZsYWdzKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpOwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IE5VTEw7Ci0JaW50IHJjOwotCi0JRFBSSU5USygiRU5URVJcbiIpOwotCi0JcGkgPSBhdGFfc2ZmX2ZpbmRfdmFsaWRfcGkocHBpKTsKLQlpZiAoIXBpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZhbGlkIHBvcnRfaW5mbyBzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWRldnJlc19vcGVuX2dyb3VwKGRldiwgTlVMTCwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQotCS8qIHByZXBhcmUgYW5kIGFjdGl2YXRlIEJNRE1BIGhvc3QgKi8KLQlyYyA9IGF0YV9wY2lfYm1kbWFfcHJlcGFyZV9ob3N0KHBkZXYsIHBwaSwgJmhvc3QpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0JaG9zdC0+cHJpdmF0ZV9kYXRhID0gaG9zdF9wcml2OwotCWhvc3QtPmZsYWdzIHw9IGhmbGFnczsKLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCXJjID0gYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdChob3N0LCBhdGFfYm1kbWFfaW50ZXJydXB0LCBzaHQpOwotIG91dDoKLQlpZiAocmMgPT0gMCkKLQkJZGV2cmVzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKLQllbHNlCi0JCWRldnJlc19yZWxlYXNlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSwgc2h0LCBob3N0X3ByaXYsIGhmbGFncywgMSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2JtZG1hX2luaXRfb25lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKaW5kZXggY2FkZDY3OS4uNjFkYTA2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCkBAIC01Niw3ICs1Niw3IEBACiAJCX0sCiAJfSwKIAl7Ci0JCS5pZGVudCA9ICJUb3NoaWJhIFNhdGVsaXRlIFMxODAwLTgxNCIsCisJCS5pZGVudCA9ICJUb3NoaWJhIFNhdGVsbGl0ZSBTMTgwMC04MTQiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzE4MDAtODE0IiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcmFzYW5fY2YuYwppbmRleCA3MTliYjczLi5lODU3NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FyYXNhbl9jZi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJhc2FuX2NmLmMKQEAgLTkyMiw4ICs5MjIsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBhcmFzYW5fY2Zfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYXJhc2FuX2NmX2RldiAqYWNkZXYgPSBob3N0LT5wb3J0c1swXS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGFjZGV2LT5kbWFfY2hhbikgewpAQCAtOTM3LDggKzkzNiw3IEBACiAKIHN0YXRpYyBpbnQgYXJhc2FuX2NmX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYXJhc2FuX2NmX2RldiAqYWNkZXYgPSBob3N0LT5wb3J0c1swXS0+cHJpdmF0ZV9kYXRhOwogCiAJY2ZfaW5pdChhY2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggNzhhOTNiNi4uNGI4YjIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMiw3ICsyLDcgQEAKICAqICAgIHBhdGFfYXJ0b3AuYyAtIEFSVE9QIEFUQSBjb250cm9sbGVyIGRyaXZlcgogICoKICAqCShDKSAyMDA2IFJlZCBIYXQKLSAqCShDKSAyMDA3IEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKKyAqCShDKSAyMDA3LDIwMTEgQmFydGxvbWllaiBab2xuaWVya2lld2ljegogICoKICAqICAgIEJhc2VkIGluIHBhcnQgb24gZHJpdmVycy9pZGUvcGNpL2FlYzYyeHguYwogICoJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9hcnRvcCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC41IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjYiCiAKIC8qCiAgKglUaGUgQVJUT1AgaGFzIDMzIE1oeiBhbmQgIm92ZXIgY2xvY2tlZCIgdGltaW5nIHRhYmxlcy4gVW50aWwgd2UKQEAgLTM5LDMxICszOSwxNSBAQAogCiBzdGF0aWMgaW50IGNsb2NrID0gMDsKIAotc3RhdGljIGludCBhcnRvcDYyMTBfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCWNvbnN0IHN0cnVjdCBwY2lfYml0cyBhcnRvcF9lbmFibGVfYml0c1tdID0gewotCQl7IDB4NEFVLCAxVSwgMHgwMlVMLCAweDAyVUwgfSwJLyogcG9ydCAwICovCi0JCXsgMHg0QVUsIDFVLCAweDA0VUwsIDB4MDRVTCB9LAkvKiBwb3J0IDEgKi8KLQl9OwotCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXJ0b3BfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlyZXR1cm4gYXRhX3NmZl9wcmVyZXNldChsaW5rLCBkZWFkbGluZSk7Ci19Ci0KIC8qKgotICoJYXJ0b3A2MjYwX3ByZV9yZXNldAktCWNoZWNrIGZvciA0MC84MCBwaW4KKyAqCWFydG9wNjJ4MF9wcmVfcmVzZXQJLQlwcm9iZSBiZWdpbgogICoJQGxpbms6IGxpbmsKICAqCUBkZWFkbGluZTogZGVhZGxpbmUgamlmZmllcyBmb3IgdGhlIG9wZXJhdGlvbgogICoKLSAqCVRoZSBBUlRPUCBoYXJkd2FyZSByZXBvcnRzIHRoZSBjYWJsZSBkZXRlY3QgYml0cyBpbiByZWdpc3RlciAweDQ5LgogICoJTm90aGluZyBjb21wbGljYXRlZCBuZWVkZWQgaGVyZS4KICAqLwogCi1zdGF0aWMgaW50IGFydG9wNjI2MF9wcmVfcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQorc3RhdGljIGludCBhcnRvcDYyeDBfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGFydG9wX2VuYWJsZV9iaXRzW10gPSB7CiAJCXsgMHg0QVUsIDFVLCAweDAyVUwsIDB4MDJVTCB9LAkvKiBwb3J0IDAgKi8KQEAgLTczLDcgKzU3LDcgQEAKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCi0JLyogT2RkIG51bWJlcmVkIGRldmljZSBpZHMgYXJlIHRoZSB1bml0cyB3aXRoIGVuYWJsZSBiaXRzICh0aGUgLVIgY2FyZHMpICovCisJLyogT2RkIG51bWJlcmVkIGRldmljZSBpZHMgYXJlIHRoZSB1bml0cyB3aXRoIGVuYWJsZSBiaXRzLiAqLwogCWlmICgocGRldi0+ZGV2aWNlICYgMSkgJiYKIAkgICAgIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhcnRvcF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTMxNyw3ICszMDEsNyBAQAogCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJCT0gYXJ0b3A2MjEwX3NldF9waW9tb2RlLAogCS5zZXRfZG1hbW9kZQkJPSBhcnRvcDYyMTBfc2V0X2RtYW1vZGUsCi0JLnByZXJlc2V0CQk9IGFydG9wNjIxMF9wcmVfcmVzZXQsCisJLnByZXJlc2V0CQk9IGFydG9wNjJ4MF9wcmVfcmVzZXQsCiAJLnFjX2RlZmVyCQk9IGFydG9wNjIxMF9xY19kZWZlciwKIH07CiAKQEAgLTMyNiw5ICszMTAsMzYgQEAKIAkuY2FibGVfZGV0ZWN0CQk9IGFydG9wNjI2MF9jYWJsZV9kZXRlY3QsCiAJLnNldF9waW9tb2RlCQk9IGFydG9wNjI2MF9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJCT0gYXJ0b3A2MjYwX3NldF9kbWFtb2RlLAotCS5wcmVyZXNldAkJPSBhcnRvcDYyNjBfcHJlX3Jlc2V0LAorCS5wcmVyZXNldAkJPSBhcnRvcDYyeDBfcHJlX3Jlc2V0LAogfTsKIAorc3RhdGljIHZvaWQgYXRwOHh4X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChwZGV2LT5kZXZpY2UgPT0gMHgwMDA1KQorCQkvKiBCSU9TIG1heSBoYXZlIGxlZnQgdXMgaW4gVURNQSwgY2xlYXIgaXQgYmVmb3JlIGxpYmF0YSBwcm9iZSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1NCwgMCk7CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IDB4MDAwOCB8fCBwZGV2LT5kZXZpY2UgPT0gMHgwMDA5KSB7CisJCXU4IHJlZzsKKworCQkvKiBNYWMgc3lzdGVtcyBjb21lIHVwIHdpdGggc29tZSByZWdpc3RlcnMgbm90IHNldCBhcyB3ZQorCQkgICB3aWxsIG5lZWQgdGhlbSAqLworCisJCS8qIENsZWFyIHJlc2V0ICYgdGVzdCBiaXRzICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDksICZyZWcpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0OSwgcmVnICYgfjB4MzApOworCisJCS8qIFBDSSBsYXRlbmN5IG11c3QgYmUgPiAweDgwIGZvciBidXJzdCBtb2RlLCB0d2VhayBpdAorCQkgKiBpZiByZXF1aXJlZC4KKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmcmVnKTsKKwkJaWYgKHJlZyA8PSAweDgwKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDkwKTsKKworCQkvKiBFbmFibGUgSVJRIG91dHB1dCBhbmQgYnVyc3QgbW9kZSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRhLCAmcmVnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NGEsIChyZWcgJiB+MHgwMSkgfCAweDgwKTsKKwl9Cit9CiAKIC8qKgogICoJYXJ0b3BfaW5pdF9vbmUgLSBSZWdpc3RlciBBUlRPUCBBVEEgUENJIGRldmljZSB3aXRoIGtlcm5lbCBzZXJ2aWNlcwpAQCAtMzgzLDQyICszOTQsMjIgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMCkgewkvKiA2MjEwIHZhcmlhbnQgKi8KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IDApCS8qIDYyMTAgdmFyaWFudCAqLwogCQlwcGlbMF0gPSAmaW5mb182MjEwOwotCQkvKiBCSU9TIG1heSBoYXZlIGxlZnQgdXMgaW4gVURNQSwgY2xlYXIgaXQgYmVmb3JlIGxpYmF0YSBwcm9iZSAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1NCwgMCk7Ci0JfQogCWVsc2UgaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAxKQkvKiA2MjYwICovCiAJCXBwaVswXSA9ICZpbmZvXzYyNng7CiAJZWxzZSBpZiAoaWQtPmRyaXZlcl9kYXRhID09IDIpCXsgLyogNjI4MCBvciA2MjgwICsgZmFzdCAqLwogCQl1bnNpZ25lZCBsb25nIGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOwotCQl1OCByZWc7CiAKIAkJcHBpWzBdID0gJmluZm9fNjI4eDsKIAkJaWYgKGluYihpbykgJiAweDEwKQogCQkJcHBpWzBdID0gJmluZm9fNjI4eF9mYXN0OwotCQkvKiBNYWMgc3lzdGVtcyBjb21lIHVwIHdpdGggc29tZSByZWdpc3RlcnMgbm90IHNldCBhcyB3ZQotCQkgICB3aWxsIG5lZWQgdGhlbSAqLwotCi0JCS8qIENsZWFyIHJlc2V0ICYgdGVzdCBiaXRzICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDksICZyZWcpOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0OSwgcmVnICYgfiAweDMwKTsKLQotCQkvKiBQQ0kgbGF0ZW5jeSBtdXN0IGJlID4gMHg4MCBmb3IgYnVyc3QgbW9kZSwgdHdlYWsgaXQKLQkJICogaWYgcmVxdWlyZWQuCi0JCSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnJlZyk7Ci0JCWlmIChyZWcgPD0gMHg4MCkKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg5MCk7Ci0KLQkJLyogRW5hYmxlIElSUSBvdXRwdXQgYW5kIGJ1cnN0IG1vZGUgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0YSwgJnJlZyk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRhLCAocmVnICYgfjB4MDEpIHwgMHg4MCk7Ci0KIAl9CiAKIAlCVUdfT04ocHBpWzBdID09IE5VTEwpOwogCisJYXRwOHh4X2ZpeHVwKHBkZXYpOworCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmYXJ0b3Bfc2h0LCBOVUxMLCAwKTsKIH0KIApAQCAtNDMyLDExICs0MjMsMzIgQEAKIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXRwOHh4X3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByYzsKKworCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJYXRwOHh4X2ZpeHVwKHBkZXYpOworCisJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhcnRvcF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJCT0gYXJ0b3BfcGNpX3RibCwKIAkucHJvYmUJCQk9IGFydG9wX2luaXRfb25lLAogCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGF0cDh4eF9yZWluaXRfb25lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhcnRvcF9pbml0KHZvaWQpCkBAIC00NTIsOSArNDY0LDggQEAKIG1vZHVsZV9pbml0KGFydG9wX2luaXQpOwogbW9kdWxlX2V4aXQoYXJ0b3BfZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCwgQmFydGxvbWllaiBab2xuaWVya2lld2ljeiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIGxvdy1sZXZlbCBkcml2ZXIgZm9yIEFSVE9QIFBBVEEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhcnRvcF9wY2lfdGJsKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdDkxLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwppbmRleCA5NjBjNzI1Li5hNzZmMjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0OTEuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2RlZmluZSBEUlZfTkFNRQkJInBhdGFfYXQ5MSIKICNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjMiCkBAIC00MTQsMTAgKzQxNCwxMyBAQAogCiAJaG9zdC0+cHJpdmF0ZV9kYXRhID0gaW5mbzsKIAotCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEgPyBncGlvX3RvX2lycShpcnEpIDogMCwKKwlyZXQgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEgPyBncGlvX3RvX2lycShpcnEpIDogMCwKIAkJCWlycSA/IGF0YV9zZmZfaW50ZXJydXB0IDogTlVMTCwKIAkJCWlycV9mbGFncywgJnBhdGFfYXQ5MV9zaHQpOwogCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCiBlcnJfcHV0OgogCWNsa19wdXQoaW5mby0+bWNrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKaW5kZXggNDM3NTU2MS4uYmUxYWExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCkBAIC00OSw2ICs0OSwzMSBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhhdGlpeHBfbG9jayk7CiAKIC8qKgorICoJYXRpaXhwX3ByZXJlc2V0CS0JcGVyZm9ybSByZXNldCBoYW5kbGluZworICoJQGxpbms6IEFUQSBsaW5rCisgKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KKyAqCisgKglSZXNldCBzZXF1ZW5jZSBjaGVja2luZyBlbmFibGUgYml0cyB0byBzZWUgd2hpY2ggcG9ydHMgYXJlCisgKglhY3RpdmUuCisgKi8KKworc3RhdGljIGludCBhdGlpeHBfcHJlcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgYXRpaXhwX2VuYWJsZV9iaXRzW10gPSB7CisJCXsgMHg0OCwgMSwgMHgwMSwgMHgwMCB9LAorCQl7IDB4NDgsIDEsIDB4MDgsIDB4MDAgfQorCX07CisKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXRpaXhwX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0dXJuIGF0YV9zZmZfcHJlcmVzZXQobGluaywgZGVhZGxpbmUpOworfQorCisvKioKICAqCWF0aWl4cF9zZXRfcGlvX3RpbWluZwktCXNldCBpbml0aWFsIFBJTyBtb2RlIGRhdGEKICAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQGFkZXY6IEFUQSBkZXZpY2UKQEAgLTIyMSw2ICsyNDYsNyBAQAogCS5ibWRtYV9zdGFydCAJPSBhdGlpeHBfYm1kbWFfc3RhcnQsCiAJLmJtZG1hX3N0b3AJPSBhdGlpeHBfYm1kbWFfc3RvcCwKIAorCS5wcmVyZXNldAk9IGF0aWl4cF9wcmVyZXNldCwKIAkuY2FibGVfZGV0ZWN0CT0gYXRpaXhwX2NhYmxlX2RldGVjdCwKIAkuc2V0X3Bpb21vZGUJPSBhdGlpeHBfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCT0gYXRpaXhwX3NldF9kbWFtb2RlLApAQCAtMjM1LDE2ICsyNjEsNyBAQAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAogCQkucG9ydF9vcHMgPSAmYXRpaXhwX3BvcnRfb3BzCiAJfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGF0aWl4cF9lbmFibGVfYml0c1tdID0gewotCQl7IDB4NDgsIDEsIDB4MDEsIDB4MDAgfSwKLQkJeyAweDQ4LCAxLCAweDA4LCAweDAwIH0KLQl9OwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sICZpbmZvIH07Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhdGlpeHBfZW5hYmxlX2JpdHNbaV0pKQotCQkJcHBpW2ldID0gJmF0YV9kdW1teV9wb3J0X2luZm87CiAKIAlyZXR1cm4gYXRhX3BjaV9ibWRtYV9pbml0X29uZShwZGV2LCBwcGksICZhdGlpeHBfc2h0LCBOVUxMLAogCQkJCSAgICAgIEFUQV9IT1NUX1BBUkFMTEVMX1NDQU4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKaW5kZXggN2JhZmMxNi4uZTFmYjM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiAKIC8qKgotICoJY21kNjR4X3NldF9waW9tb2RlCS0Jc2V0IFBJTyBhbmQgTVdETUEgdGltaW5nCisgKgljbWQ2NHhfc2V0X3RpbWluZwktCXNldCBQSU8gYW5kIE1XRE1BIHRpbWluZwogICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoJQG1vZGU6IG1vZGUKQEAgLTI4OCw2ICsyODgsMjIgQEAKIAkuY2FibGVfZGV0ZWN0CT0gY21kNjQ4X2NhYmxlX2RldGVjdCwKIH07CiAKK3N0YXRpYyB2b2lkIGNtZDY0eF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OCBtcmRtb2RlOworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgJm1yZG1vZGUpOworCW1yZG1vZGUgJj0gfjB4MzA7CS8qIElSUSBzZXQgdXAgKi8KKwltcmRtb2RlIHw9IDB4MDI7CS8qIE1lbW9yeSByZWFkIGxpbmUgZW5hYmxlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIE1SRE1PREUsIG1yZG1vZGUpOworCisJLyogUFBDIHNwZWNpZmljIGZpeHVwIGNvcGllZCBmcm9tIG9sZCBkcml2ZXIgKi8KKyNpZmRlZiBDT05GSUdfUFBDCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFVESURFVENSMCwgMHhGMCk7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBjbWQ2NHhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gY21kX2luZm9bNl0gPSB7CkBAIC0zMzYsNyArMzUyLDcgQEAKIAkJJmNtZF9pbmZvW2lkLT5kcml2ZXJfZGF0YV0sCiAJCU5VTEwKIAl9OwotCXU4IG1yZG1vZGUsIHJlZzsKKwl1OCByZWc7CiAJaW50IHJjOwogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBwZGV2LT5idXMtPnNlbGY7CiAJLyogbW9iaWxpdHkgc3BsaXQgYnJpZGdlcyBkb24ndCByZXBvcnQgZW5hYmxlZCBwb3J0cyBjb3JyZWN0bHkgKi8KQEAgLTM2OCwxMSArMzg0LDcgQEAKIAkJCWNudHJsX2NoMF9vayA9IDA7CiAJfQogCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgJm1yZG1vZGUpOwotCW1yZG1vZGUgJj0gfiAweDMwOwkvKiBJUlEgc2V0IHVwICovCi0JbXJkbW9kZSB8PSAweDAyOwkvKiBNZW1vcnkgcmVhZCBsaW5lIGVuYWJsZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBNUkRNT0RFLCBtcmRtb2RlKTsKKwljbWQ2NHhfZml4dXAocGRldik7CiAKIAkvKiBjaGVjayBmb3IgZW5hYmxlZCBwb3J0cyAqLwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIENOVFJMLCAmcmVnKTsKQEAgLTM4OCwxMyArNDAwLDYgQEAKIAkJcHBpWzFdID0gJmF0YV9kdW1teV9wb3J0X2luZm87CiAJfQogCi0JLyogRm9yY2UgUElPIDAgaGVyZS4uICovCi0KLQkvKiBQUEMgc3BlY2lmaWMgZml4dXAgY29waWVkIGZyb20gb2xkIGRyaXZlciAqLwotI2lmZGVmIENPTkZJR19QUEMKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVURJREVUQ1IwLCAweEYwKTsKLSNlbmRpZgotCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmY21kNjR4X3NodCwgTlVMTCwgMCk7CiB9CiAKQEAgLTQwMiwyMSArNDA3LDE0IEBACiBzdGF0aWMgaW50IGNtZDY0eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQl1OCBtcmRtb2RlOwogCWludCByYzsKIAogCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCA2NCk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgJm1yZG1vZGUpOwotCW1yZG1vZGUgJj0gfiAweDMwOwkvKiBJUlEgc2V0IHVwICovCi0JbXJkbW9kZSB8PSAweDAyOwkvKiBNZW1vcnkgcmVhZCBsaW5lIGVuYWJsZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBNUkRNT0RFLCBtcmRtb2RlKTsKLSNpZmRlZiBDT05GSUdfUFBDCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFVESURFVENSMCwgMHhGMCk7Ci0jZW5kaWYKKwljbWQ2NHhfZml4dXAocGRldik7CisKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYwppbmRleCAwM2E5MzE4Li5hMGI0NjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CiAKLSNkZWZpbmUgRFJWX05BTUUJImNzNTUzNSIKKyNkZWZpbmUgRFJWX05BTUUJInBhdGFfY3M1NTM1IgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yLjEyIgogCiAvKgpAQCAtNjcsOCArNjcsNiBAQAogCiAjZGVmaW5lIENTNTUzNV9DQUJMRV9ERVRFQ1QgICAgMHg0OAogCi0jZGVmaW5lIENTNTUzNV9CQURfUElPKHRpbWluZ3MpICggKHRpbWluZ3MmfjB4ODAwMDAwMDBVTCk9PTB4MDAwMDkxNzIgKQotCiAvKioKICAqCWNzNTUzNV9jYWJsZV9kZXRlY3QJLQlkZXRlY3QgY2FibGUgdHlwZQogICoJQGFwOiBQb3J0IHRvIGRldGVjdCBvbgpAQCAtMTg4LDE2ICsxODYsNiBAQAogCX07CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgJmF0YV9kdW1teV9wb3J0X2luZm8gfTsKIAotCXUzMiB0aW1pbmdzLCBkdW1teTsKLQotCS8qIENoZWNrIHRoZSBCSU9TIHNldCB0aGUgaW5pdGlhbCB0aW1pbmcgY2xvY2suIElmIG5vdCBzZXQgdGhlCi0JICAgdGltaW5ncyBmb3IgUElPMCAqLwotCXJkbXNyKEFUQUNfQ0gwRDBfUElPLCB0aW1pbmdzLCBkdW1teSk7Ci0JaWYgKENTNTUzNV9CQURfUElPKHRpbWluZ3MpKQotCQl3cm1zcihBVEFDX0NIMEQwX1BJTywgMHhGN0Y0RjdGNFVMLCAwKTsKLQlyZG1zcihBVEFDX0NIMEQxX1BJTywgdGltaW5ncywgZHVtbXkpOwotCWlmIChDUzU1MzVfQkFEX1BJTyh0aW1pbmdzKSkKLQkJd3Jtc3IoQVRBQ19DSDBEMV9QSU8sIDB4RjdGNEY3RjRVTCwgMCk7CiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUoZGV2LCBwcGksICZjczU1MzVfc2h0LCBOVUxMLCAwKTsKIH0KIApAQCAtMjMwLDcgKzIxOCw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIkFsYW4gQ294LCBKZW5zIEFsdG1hbm4sIFdvbGZnYW4gWnVsZWdlciwgQWxleGFuZGVyIEtpYXVzY2giKTsKLU1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgdGhlIE5TL0FNRCA1NTMwIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHRoZSBOUy9BTUQgNTUzNSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNTUzNSk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCmluZGV4IGFjYTQ3ZTQuLmYwMjQzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCkBAIC03Myw3ICs3Myw3IEBACiAvKioKICAqCWVmYXJfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCiAgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKLSAqCUBhZGV2OiB1bQorICoJQGFkZXY6IERldmljZSB0byBwcm9ncmFtCiAgKgogICoJU2V0IFBJTyBtb2RlIGZvciBkZXZpY2UsIGluIGhvc3QgY29udHJvbGxlciBQQ0kgY29uZmlnIHNwYWNlLgogICoKQEAgLTg1LDkgKzg1LDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcGlvCT0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXVuc2lnbmVkIGludCBpZGV0bV9wb3J0PSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOworCXVuc2lnbmVkIGludCBtYXN0ZXJfcG9ydCA9IGFwLT5wb3J0X25vID8gMHg0MiA6IDB4NDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MTYgaWRldG1fZGF0YTsKKwl1MTYgbWFzdGVyX2RhdGE7CiAJdTggdWRtYV9lbmFibGU7CiAJaW50IGNvbnRyb2wgPSAwOwogCkBAIC0xMTMsMjAgKzExMywyMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVmYXJfbG9jaywgZmxhZ3MpOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBpZGV0bV9wb3J0LCAmaWRldG1fZGF0YSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtYXN0ZXJfcG9ydCwgJm1hc3Rlcl9kYXRhKTsKIAogCS8qIFNldCBQUEUsIElFLCBhbmQgVElNRSBhcyBhcHByb3ByaWF0ZSAqLwogCWlmIChhZGV2LT5kZXZubyA9PSAwKSB7Ci0JCWlkZXRtX2RhdGEgJj0gMHhDQ0YwOwotCQlpZGV0bV9kYXRhIHw9IGNvbnRyb2w7Ci0JCWlkZXRtX2RhdGEgfD0gKHRpbWluZ3NbcGlvXVswXSA8PCAxMikgfAorCQltYXN0ZXJfZGF0YSAmPSAweENDRjA7CisJCW1hc3Rlcl9kYXRhIHw9IGNvbnRyb2w7CisJCW1hc3Rlcl9kYXRhIHw9ICh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKIAkJCSh0aW1pbmdzW3Bpb11bMV0gPDwgOCk7CiAJfSBlbHNlIHsKIAkJaW50IHNoaWZ0ID0gNCAqIGFwLT5wb3J0X25vOwogCQl1OCBzbGF2ZV9kYXRhOwogCi0JCWlkZXRtX2RhdGEgJj0gMHhGRjBGOwotCQlpZGV0bV9kYXRhIHw9IChjb250cm9sIDw8IDQpOworCQltYXN0ZXJfZGF0YSAmPSAweEZGMEY7CisJCW1hc3Rlcl9kYXRhIHw9IChjb250cm9sIDw8IDQpOwogCiAJCS8qIFNsYXZlIHRpbWluZyBpbiBzZXBhcmF0ZSByZWdpc3RlciAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDQsICZzbGF2ZV9kYXRhKTsKQEAgLTEzNSw4ICsxMzUsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCBzbGF2ZV9kYXRhKTsKIAl9CiAKLQlpZGV0bV9kYXRhIHw9IDB4NDAwMDsJLyogRW5zdXJlIFNJVFJFIGlzIHNldCAqLwotCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGlkZXRtX3BvcnQsIGlkZXRtX2RhdGEpOworCW1hc3Rlcl9kYXRhIHw9IDB4NDAwMDsJLyogRW5zdXJlIFNJVFJFIGlzIHNldCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZ1ZG1hX2VuYWJsZSk7CiAJdWRtYV9lbmFibGUgJj0gfigxIDw8ICgyICogYXAtPnBvcnRfbm8gKyBhZGV2LT5kZXZubykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggNmM3N2Q2OC4uNDJjZmZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0xMTEsNiArMTExLDI4IEBACiAJewkwLAkJMHgwMTIwODU4NQl9CiB9OwogCisvKioKKyAqCWhwdDM2eF9maW5kX21vZGUJLQlmaW5kIHRoZSBocHQzNnggdGltaW5nCisgKglAYXA6IEFUQSBwb3J0CisgKglAc3BlZWQ6IHRyYW5zZmVyIG1vZGUKKyAqCisgKglSZXR1cm4gdGhlIDMyYml0IHJlZ2lzdGVyIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIGNoYW5uZWwKKyAqCXRoYXQgbWF0Y2hlcyB0aGUgc3BlZWQgcHJvdmlkZWQuCisgKi8KKworc3RhdGljIHUzMiBocHQzNnhfZmluZF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgaHB0X2Nsb2NrICpjbG9ja3MgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCisJd2hpbGUgKGNsb2Nrcy0+eGZlcl9tb2RlKSB7CisJCWlmIChjbG9ja3MtPnhmZXJfbW9kZSA9PSBzcGVlZCkKKwkJCXJldHVybiBjbG9ja3MtPnRpbWluZzsKKwkJY2xvY2tzKys7CisJfQorCUJVRygpOworCXJldHVybiAweGZmZmZmZmZmVTsJLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCit9CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTMzW10gPSB7CiAJIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwKIAkiTWF4dG9yIDkwODQ1VTMiLCAiTWF4dG9yIDkwNjUwVTIiLApAQCAtMjEwLDEwICsyMzIsOSBAQAogc3RhdGljIHZvaWQgaHB0MzY2X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LAogCQkJICAgIHU4IG1vZGUpCiB7Ci0Jc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTMyIGFkZHIgPSAweDQwICsgNCAqIGFkZXYtPmRldm5vOwotCXUzMiBtYXNrLCByZWc7CisJdTMyIG1hc2ssIHJlZywgdDsKIAogCS8qIGRldGVybWluZSB0aW1pbmcgbWFzayBhbmQgZmluZCBtYXRjaGluZyBjbG9jayBlbnRyeSAqLwogCWlmIChtb2RlIDwgWEZFUl9NV19ETUFfMCkKQEAgLTIyMywxMyArMjQ0LDcgQEAKIAllbHNlCiAJCW1hc2sgPSAweDMwMDcwMDAwOwogCi0Jd2hpbGUgKGNsb2Nrcy0+eGZlcl9tb2RlKSB7Ci0JCWlmIChjbG9ja3MtPnhmZXJfbW9kZSA9PSBtb2RlKQotCQkJYnJlYWs7Ci0JCWNsb2NrcysrOwotCX0KLQlpZiAoIWNsb2Nrcy0+eGZlcl9tb2RlKQotCQlCVUcoKTsKKwl0ID0gaHB0MzZ4X2ZpbmRfbW9kZShhcCwgbW9kZSk7CiAKIAkvKgogCSAqIENvbWJpbmUgbmV3IG1vZGUgYml0cyB3aXRoIG9sZCBjb25maWcgYml0cyBhbmQgZGlzYWJsZQpAQCAtMjM3LDcgKzI1Miw3IEBACiAJICogcHJvYmxlbXMgaGFuZGxpbmcgSS9PIGVycm9ycyBsYXRlci4KIAkgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYWRkciwgJnJlZyk7Ci0JcmVnID0gKChyZWcgJiB+bWFzaykgfCAoY2xvY2tzLT50aW1pbmcgJiBtYXNrKSkgJiB+MHhjMDAwMDAwMDsKKwlyZWcgPSAoKHJlZyAmIH5tYXNrKSB8ICh0ICYgbWFzaykpICYgfjB4YzAwMDAwMDA7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyLCByZWcpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwppbmRleCA5OThhZjBlLi5jZjkxNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKQEAgLTc2LDggKzc2LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgcGlvCT0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXVuc2lnbmVkIGludCBpZGV0bV9wb3J0PSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOwotCXUxNiBpZGV0bV9kYXRhOworCXVuc2lnbmVkIGludCBtYXN0ZXJfcG9ydCA9IGFwLT5wb3J0X25vID8gMHg0MiA6IDB4NDA7CisJdTE2IG1hc3Rlcl9kYXRhOwogCWludCBjb250cm9sID0gMDsKIAogCS8qCkBAIC0xMDAsMTkgKzEwMCwxOSBAQAogCWlmIChhZGV2LT5jbGFzcyAhPSBBVEFfREVWX0FUQSkKIAkJY29udHJvbCB8PSA0OwkvKiBQUEUgKi8KIAotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgaWRldG1fcG9ydCwgJmlkZXRtX2RhdGEpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsICZtYXN0ZXJfZGF0YSk7CiAKIAkvKiBTZXQgUFBFLCBJRSwgYW5kIFRJTUUgYXMgYXBwcm9wcmlhdGUgKi8KIAlpZiAoYWRldi0+ZGV2bm8gPT0gMCkgewotCQlpZGV0bV9kYXRhICY9IDB4Q0NGMDsKLQkJaWRldG1fZGF0YSB8PSBjb250cm9sOwotCQlpZGV0bV9kYXRhIHw9ICh0aW1pbmdzW3Bpb11bMF0gPDwgMTIpIHwKKwkJbWFzdGVyX2RhdGEgJj0gMHhDQ0YwOworCQltYXN0ZXJfZGF0YSB8PSBjb250cm9sOworCQltYXN0ZXJfZGF0YSB8PSAodGltaW5nc1twaW9dWzBdIDw8IDEyKSB8CiAJCQkodGltaW5nc1twaW9dWzFdIDw8IDgpOwogCX0gZWxzZSB7CiAJCXU4IHNsYXZlX2RhdGE7CiAKLQkJaWRldG1fZGF0YSAmPSAweEZGMEY7Ci0JCWlkZXRtX2RhdGEgfD0gKGNvbnRyb2wgPDwgNCk7CisJCW1hc3Rlcl9kYXRhICY9IDB4RkYwRjsKKwkJbWFzdGVyX2RhdGEgfD0gKGNvbnRyb2wgPDwgNCk7CiAKIAkJLyogU2xhdmUgdGltaW5nIGluIHNlcGFyYXRlIHJlZ2lzdGVyICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0NCwgJnNsYXZlX2RhdGEpOwpAQCAtMTIxLDggKzEyMSw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDQsIHNsYXZlX2RhdGEpOwogCX0KIAotCWlkZXRtX2RhdGEgfD0gMHg0MDAwOwkvKiBFbnN1cmUgU0lUUkUgaXMgc2V0ICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgaWRldG1fcG9ydCwgaWRldG1fZGF0YSk7CisJbWFzdGVyX2RhdGEgfD0gMHg0MDAwOwkvKiBFbnN1cmUgU0lUUkUgaXMgc2V0ICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbWFzdGVyX3BvcnQsIG1hc3Rlcl9kYXRhKTsKIH0KIAogLyoqCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCQkvKiBDbG9ja3MgZm9sbG93IHRoZSBQSUlYIHN0eWxlICovCiAJCXVfc3BlZWQgPSBtaW4oMiAtICh1ZG1hICYgMSksIHVkbWEpOwotCQlpZiAodWRtYSA9PSA1KQorCQlpZiAodWRtYSA+IDQpCiAJCQl1X2Nsb2NrID0gMHgxMDAwOwkvKiAxMDBNaHogKi8KIAkJZWxzZSBpZiAodWRtYSA+IDIpCiAJCQl1X2Nsb2NrID0gMTsJCS8qIDY2TWh6ICovCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LAogCQkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTEyX09OTFksCi0JCS51ZG1hX21hc2sgCT0gQVRBX1VETUE0LCAvKiBGSVhNRTogd2FudCBVRE1BIDEwMD8gKi8KKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKIAkJLnBvcnRfb3BzCT0gJml0ODIxM19vcHMsCiAJfTsKIAkvKiBDdXJyZW50IElUODIxMyBzdHVmZiBpcyBzaW5nbGUgcG9ydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKaW5kZXggZDk2MGY4ZS4uMzVhY2E3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCkBAIC03OSwxNSArNzksNiBAQAogbW9kdWxlX3BhcmFtKGFsbCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsLCAiR3JhYiBhbGwgbGVnYWN5IHBvcnQgZGV2aWNlcywgZXZlbiBpZiBQQ0koMD1vZmYsIDE9b24pIik7CiAKLXN0cnVjdCBsZWdhY3lfZGF0YSB7Ci0JdW5zaWduZWQgbG9uZyB0aW1pbmc7Ci0JdTggY2xvY2tbMl07Ci0JdTggbGFzdDsKLQlpbnQgZmFzdDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXY7Ci0KLX07Ci0KIGVudW0gY29udHJvbGxlciB7CiAJQklPUyA9IDAsCiAJU05PT1AgPSAxLApAQCAtMTA0LDYgKzk1LDE0IEBACiAJVU5LTk9XTiA9IC0xCiB9OwogCitzdHJ1Y3QgbGVnYWN5X2RhdGEgeworCXVuc2lnbmVkIGxvbmcgdGltaW5nOworCXU4IGNsb2NrWzJdOworCXU4IGxhc3Q7CisJaW50IGZhc3Q7CisJZW51bSBjb250cm9sbGVyIHR5cGU7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworfTsKIAogc3RydWN0IGxlZ2FjeV9wcm9iZSB7CiAJdW5zaWduZWQgY2hhciAqbmFtZTsKQEAgLTEzNywxMSArMTM2LDE3IEBACiBzdGF0aWMgaW50IGh0NjU2MGI7CQkvKiBIVCA2NTYwQSBvbiBwcmltYXJ5IDEsIHNlY29uZCAyLCBib3RoIDMgKi8KIHN0YXRpYyBpbnQgb3B0aTgyYzYxMWE7CQkvKiBPcHRpODJjNjExQSBvbiBwcmltYXJ5IDEsIHNlYyAyLCBib3RoIDMgKi8KIHN0YXRpYyBpbnQgb3B0aTgyYzQ2eDsJCS8qIE9wdGkgODJjNDY1TVYgcHJlc2VudChwcmkvc2VjIGF1dG9kZXRlY3QpICovCi1zdGF0aWMgaW50IHFkaTsJCQkvKiBTZXQgdG8gcHJvYmUgUURJIGNvbnRyb2xsZXJzICovCiBzdGF0aWMgaW50IGF1dG9zcGVlZDsJCS8qIENoaXAgcHJlc2VudCB3aGljaCBzbm9vcHMgc3BlZWQgY2hhbmdlcyAqLwogc3RhdGljIGludCBwaW9fbWFzayA9IEFUQV9QSU80OwkvKiBQSU8gcmFuZ2UgZm9yIGF1dG9zcGVlZCBkZXZpY2VzICovCiBzdGF0aWMgaW50IGlvcmR5X21hc2sgPSAweEZGRkZGRkZGOwkvKiBVc2UgaW9yZHkgaWYgYXZhaWxhYmxlICovCiAKKy8qIFNldCB0byBwcm9iZSBRREkgY29udHJvbGxlcnMgKi8KKyNpZmRlZiBDT05GSUdfUEFUQV9RRElfTU9EVUxFCitzdGF0aWMgaW50IHFkaSA9IDE7CisjZWxzZQorc3RhdGljIGludCBxZGk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19QQVRBX1dJTkJPTkRfVkxCX01PRFVMRQogc3RhdGljIGludCB3aW5ib25kID0gMTsJCS8qIFNldCB0byBwcm9iZSBXaW5ib25kIGNvbnRyb2xsZXJzLAogCQkJCQlnaXZlIEkvTyBwb3J0IGlmIG5vbiBzdGFuZGFyZCAqLwpAQCAtNjMxLDc3ICs2MzYsMjAgQEAKIAkucWNfaXNzdWUJPSBvcHRpODJjNDZ4X3FjX2lzc3VlLAogfTsKIAotc3RhdGljIHZvaWQgcWRpNjUwMF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgYXRhX3RpbWluZyB0OwotCXN0cnVjdCBsZWdhY3lfZGF0YSAqbGRfcWRpID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQlpbnQgYWN0aXZlLCByZWNvdmVyeTsKLQl1OCB0aW1pbmc7Ci0KLQkvKiBHZXQgdGhlIHRpbWluZyBkYXRhIGluIGN5Y2xlcyAqLwotCWF0YV90aW1pbmdfY29tcHV0ZShhZGV2LCBhZGV2LT5waW9fbW9kZSwgJnQsIDMwMzAzLCAxMDAwKTsKLQotCWlmIChsZF9xZGktPmZhc3QpIHsKLQkJYWN0aXZlID0gOCAtIGNsYW1wX3ZhbCh0LmFjdGl2ZSwgMSwgOCk7Ci0JCXJlY292ZXJ5ID0gMTggLSBjbGFtcF92YWwodC5yZWNvdmVyLCAzLCAxOCk7Ci0JfSBlbHNlIHsKLQkJYWN0aXZlID0gOSAtIGNsYW1wX3ZhbCh0LmFjdGl2ZSwgMiwgOSk7Ci0JCXJlY292ZXJ5ID0gMTUgLSBjbGFtcF92YWwodC5yZWNvdmVyLCAwLCAxNSk7Ci0JfQotCXRpbWluZyA9IChyZWNvdmVyeSA8PCA0KSB8IGFjdGl2ZSB8IDB4MDg7Ci0KLQlsZF9xZGktPmNsb2NrW2FkZXYtPmRldm5vXSA9IHRpbWluZzsKLQotCW91dGIodGltaW5nLCBsZF9xZGktPnRpbWluZyk7Ci19Ci0KIC8qKgotICoJcWRpNjU4MGRwX3NldF9waW9tb2RlCQktCVBJTyBzZXR1cCBmb3IgZHVhbCBjaGFubmVsCi0gKglAYXA6IFBvcnQKLSAqCUBhZGV2OiBEZXZpY2UKLSAqCi0gKglJbiBkdWFsIGNoYW5uZWwgbW9kZSB0aGUgNjU4MCBoYXMgb25lIGNsb2NrIHBlciBjaGFubmVsIGFuZCB3ZSBoYXZlCi0gKgl0byBzb2Z0d2FyZSBjbG9ja3N3aXRjaCBpbiBxY19pc3N1ZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBxZGk2NTgwZHBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGF0YV90aW1pbmcgdDsKLQlzdHJ1Y3QgbGVnYWN5X2RhdGEgKmxkX3FkaSA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0JaW50IGFjdGl2ZSwgcmVjb3Zlcnk7Ci0JdTggdGltaW5nOwotCi0JLyogR2V0IHRoZSB0aW1pbmcgZGF0YSBpbiBjeWNsZXMgKi8KLQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZ0LCAzMDMwMywgMTAwMCk7Ci0KLQlpZiAobGRfcWRpLT5mYXN0KSB7Ci0JCWFjdGl2ZSA9IDggLSBjbGFtcF92YWwodC5hY3RpdmUsIDEsIDgpOwotCQlyZWNvdmVyeSA9IDE4IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMywgMTgpOwotCX0gZWxzZSB7Ci0JCWFjdGl2ZSA9IDkgLSBjbGFtcF92YWwodC5hY3RpdmUsIDIsIDkpOwotCQlyZWNvdmVyeSA9IDE1IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMCwgMTUpOwotCX0KLQl0aW1pbmcgPSAocmVjb3ZlcnkgPDwgNCkgfCBhY3RpdmUgfCAweDA4OwotCi0JbGRfcWRpLT5jbG9ja1thZGV2LT5kZXZub10gPSB0aW1pbmc7Ci0KLQlvdXRiKHRpbWluZywgbGRfcWRpLT50aW1pbmcgKyAyICogYXAtPnBvcnRfbm8pOwotCS8qIENsZWFyIHRoZSBGSUZPICovCi0JaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQotCQlvdXRiKDB4NUYsIChsZF9xZGktPnRpbWluZyAmIDB4RkZGMCkgKyAzKTsKLX0KLQotLyoqCi0gKglxZGk2NTgwX3NldF9waW9tb2RlCQktCVBJTyBzZXR1cCBmb3Igc2luZ2xlIGNoYW5uZWwKKyAqCXFkaTY1eDBfc2V0X3Bpb21vZGUJCS0JUElPIHNldHVwIGZvciBRREk2NXgwCiAgKglAYXA6IFBvcnQKICAqCUBhZGV2OiBEZXZpY2UKICAqCiAgKglJbiBzaW5nbGUgY2hhbm5lbCBtb2RlIHRoZSA2NTgwIGhhcyBvbmUgY2xvY2sgcGVyIGRldmljZSBhbmQgd2UgY2FuCiAgKglhdm9pZCB0aGUgcmVxdWlyZW1lbnQgdG8gY2xvY2sgc3dpdGNoLiBXZSBhbHNvIGhhdmUgdG8gbG9hZCB0aGUgdGltaW5nCiAgKglpbnRvIHRoZSByaWdodCBjbG9jayBhY2NvcmRpbmcgdG8gd2hldGhlciB3ZSBhcmUgbWFzdGVyIG9yIHNsYXZlLgorICoKKyAqCUluIGR1YWwgY2hhbm5lbCBtb2RlIHRoZSA2NTgwIGhhcyBvbmUgY2xvY2sgcGVyIGNoYW5uZWwgYW5kIHdlIGhhdmUKKyAqCXRvIHNvZnR3YXJlIGNsb2Nrc3dpdGNoIGluIHFjX2lzc3VlLgogICovCiAKLXN0YXRpYyB2b2lkIHFkaTY1ODBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCitzdGF0aWMgdm9pZCBxZGk2NXgwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBhdGFfdGltaW5nIHQ7CiAJc3RydWN0IGxlZ2FjeV9kYXRhICpsZF9xZGkgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwpAQCAtNzIwLDkgKzY2OCwxNCBAQAogCX0KIAl0aW1pbmcgPSAocmVjb3ZlcnkgPDwgNCkgfCBhY3RpdmUgfCAweDA4OwogCWxkX3FkaS0+Y2xvY2tbYWRldi0+ZGV2bm9dID0gdGltaW5nOwotCW91dGIodGltaW5nLCBsZF9xZGktPnRpbWluZyArIDIgKiBhZGV2LT5kZXZubyk7CisKKwlpZiAobGRfcWRpLT50eXBlID09IFFESTY1ODApCisJCW91dGIodGltaW5nLCBsZF9xZGktPnRpbWluZyArIDIgKiBhZGV2LT5kZXZubyk7CisJZWxzZQorCQlvdXRiKHRpbWluZywgbGRfcWRpLT50aW1pbmcgKyAyICogYXAtPnBvcnRfbm8pOworCiAJLyogQ2xlYXIgdGhlIEZJRk8gKi8KLQlpZiAoYWRldi0+Y2xhc3MgIT0gQVRBX0RFVl9BVEEpCisJaWYgKGxkX3FkaS0+dHlwZSAhPSBRREk2NTAwICYmIGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQogCQlvdXRiKDB4NUYsIChsZF9xZGktPnRpbWluZyAmIDB4RkZGMCkgKyAzKTsKIH0KIApAQCAtNzg5LDIwICs3NDIsMjAgQEAKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFkaTY1MDBfcG9ydF9vcHMgPSB7CiAJLmluaGVyaXRzCT0gJmxlZ2FjeV9iYXNlX3BvcnRfb3BzLAotCS5zZXRfcGlvbW9kZQk9IHFkaTY1MDBfc2V0X3Bpb21vZGUsCisJLnNldF9waW9tb2RlCT0gcWRpNjV4MF9zZXRfcGlvbW9kZSwKIAkucWNfaXNzdWUJPSBxZGlfcWNfaXNzdWUsCiAJLnNmZl9kYXRhX3hmZXIJPSB2bGIzMl9kYXRhX3hmZXIsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcWRpNjU4MF9wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJPSAmbGVnYWN5X2Jhc2VfcG9ydF9vcHMsCi0JLnNldF9waW9tb2RlCT0gcWRpNjU4MF9zZXRfcGlvbW9kZSwKKwkuc2V0X3Bpb21vZGUJPSBxZGk2NXgwX3NldF9waW9tb2RlLAogCS5zZmZfZGF0YV94ZmVyCT0gdmxiMzJfZGF0YV94ZmVyLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFkaTY1ODBkcF9wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJPSAmbGVnYWN5X2Jhc2VfcG9ydF9vcHMsCi0JLnNldF9waW9tb2RlCT0gcWRpNjU4MGRwX3NldF9waW9tb2RlLAorCS5zZXRfcGlvbW9kZQk9IHFkaTY1eDBfc2V0X3Bpb21vZGUsCiAJLnFjX2lzc3VlCT0gcWRpX3FjX2lzc3VlLAogCS5zZmZfZGF0YV94ZmVyCT0gdmxiMzJfZGF0YV94ZmVyLAogfTsKQEAgLTg3OSwyOSArODMyLDI5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGxlZ2FjeV9jb250cm9sbGVyIGNvbnRyb2xsZXJzW10gPSB7Ci0JeyJCSU9TIiwJJmxlZ2FjeV9wb3J0X29wcywgCTB4MUYsCisJeyJCSU9TIiwJJmxlZ2FjeV9wb3J0X29wcywgCUFUQV9QSU80LAogCQkJQVRBX0ZMQUdfTk9fSU9SRFksCTAsCQkJTlVMTCB9LAotCXsiU25vb3BpbmciLCAJJnNpbXBsZV9wb3J0X29wcywgCTB4MUYsCisJeyJTbm9vcGluZyIsIAkmc2ltcGxlX3BvcnRfb3BzLCAJQVRBX1BJTzQsCiAJCQkwLAkJCTAsCQkJTlVMTCB9LAotCXsiUERDMjAyMzAiLAkmcGRjMjAyMzBfcG9ydF9vcHMsCTB4NywKKwl7IlBEQzIwMjMwIiwJJnBkYzIwMjMwX3BvcnRfb3BzLAlBVEFfUElPMiwKIAkJCUFUQV9GTEFHX05PX0lPUkRZLAogCQkJQVRBX1BGTEFHX1BJTzMyIHwgQVRBX1BGTEFHX1BJTzMyQ0hBTkdFLAlOVUxMIH0sCi0JeyJIVDY1NjBBIiwJJmh0NjU2MGFfcG9ydF9vcHMsCTB4MDcsCisJeyJIVDY1NjBBIiwJJmh0NjU2MGFfcG9ydF9vcHMsCUFUQV9QSU8yLAogCQkJQVRBX0ZMQUdfTk9fSU9SRFksCTAsCQkJTlVMTCB9LAotCXsiSFQ2NTYwQiIsCSZodDY1NjBiX3BvcnRfb3BzLAkweDFGLAorCXsiSFQ2NTYwQiIsCSZodDY1NjBiX3BvcnRfb3BzLAlBVEFfUElPNCwKIAkJCUFUQV9GTEFHX05PX0lPUkRZLAkwLAkJCU5VTEwgfSwKLQl7Ik9QVEk4MkM2MTFBIiwJJm9wdGk4MmM2MTFhX3BvcnRfb3BzLAkweDBGLAorCXsiT1BUSTgyQzYxMUEiLAkmb3B0aTgyYzYxMWFfcG9ydF9vcHMsCUFUQV9QSU8zLAogCQkJMCwJCQkwLAkJCU5VTEwgfSwKLQl7Ik9QVEk4MkM0NlgiLAkmb3B0aTgyYzQ2eF9wb3J0X29wcywJMHgwRiwKKwl7Ik9QVEk4MkM0NlgiLAkmb3B0aTgyYzQ2eF9wb3J0X29wcywJQVRBX1BJTzMsCiAJCQkwLAkJCTAsCQkJTlVMTCB9LAotCXsiUURJNjUwMCIsCSZxZGk2NTAwX3BvcnRfb3BzLAkweDA3LAorCXsiUURJNjUwMCIsCSZxZGk2NTAwX3BvcnRfb3BzLAlBVEFfUElPMiwKIAkJCUFUQV9GTEFHX05PX0lPUkRZLAogCQkJQVRBX1BGTEFHX1BJTzMyIHwgQVRBX1BGTEFHX1BJTzMyQ0hBTkdFLCAgICBxZGlfcG9ydCB9LAotCXsiUURJNjU4MCIsCSZxZGk2NTgwX3BvcnRfb3BzLAkweDFGLAorCXsiUURJNjU4MCIsCSZxZGk2NTgwX3BvcnRfb3BzLAlBVEFfUElPNCwKIAkJCTAsIEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRSwgcWRpX3BvcnQgfSwKLQl7IlFESTY1ODBEUCIsCSZxZGk2NTgwZHBfcG9ydF9vcHMsCTB4MUYsCisJeyJRREk2NTgwRFAiLAkmcWRpNjU4MGRwX3BvcnRfb3BzLAlBVEFfUElPNCwKIAkJCTAsIEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRSwgcWRpX3BvcnQgfSwKLQl7Ilc4Mzc1OUEiLAkmd2luYm9uZF9wb3J0X29wcywJMHgxRiwKKwl7Ilc4Mzc1OUEiLAkmd2luYm9uZF9wb3J0X29wcywJQVRBX1BJTzQsCiAJCQkwLCBBVEFfUEZMQUdfUElPMzIgfCBBVEFfUEZMQUdfUElPMzJDSEFOR0UsCiAJCQkJCQkJCXdpbmJvbmRfcG9ydCB9CiB9OwpAQCAtMTAyMiw2ICs5NzUsNyBAQAogCWN0cmxfYWRkciA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBpbyArIDB4MDIwNiwgMSk7CiAJaWYgKCFpb19hZGRyIHx8ICFjdHJsX2FkZHIpCiAJCWdvdG8gZmFpbDsKKwlsZC0+dHlwZSA9IHByb2JlLT50eXBlOwogCWlmIChjb250cm9sbGVyLT5zZXR1cCkKIAkJaWYgKGNvbnRyb2xsZXItPnNldHVwKHBkZXYsIHByb2JlLCBsZCkgPCAwKQogCQkJZ290byBmYWlsOwpAQCAtMTMwNiw2ICsxMjYwLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgbGVnYWN5IEFUQSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FMSUFTKCJwYXRhX3FkaSIpOwogTU9EVUxFX0FMSUFTKCJwYXRhX3dpbmJvbmQiKTsKIAogbW9kdWxlX3BhcmFtKHByb2JlX2FsbCwgaW50LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tcGM1Mnh4LmMKaW5kZXggMmZjYWM1MS4uM2UxNzQ2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9tcGM1Mnh4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGM1Mnh4LmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogCX0KIAogCXRhc2tfaXJxID0gYmNvbV9nZXRfdGFza19pcnEoZG1hdHNrKTsKLQlyZXQgPSByZXF1ZXN0X2lycSh0YXNrX2lycSwgJm1wYzUyeHhfYXRhX3Rhc2tfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKHRhc2tfaXJxLCAmbXBjNTJ4eF9hdGFfdGFza19pcnEsIDAsCiAJCQkJIkFUQSB0YXNrIiwgcHJpdik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZvcC0+ZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBETUEgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb2ZfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfb2ZfcGxhdGZvcm0uYwppbmRleCBmMzA1NDAwLi4yYTQ3MmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29mX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9vZl9wbGF0Zm9ybS5jCkBAIC0xMSw2ICsxMSw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KIApAQCAtNTAsMTggKzUyLDE4IEBACiAJfQogCiAJcmV0ID0gb2ZfaXJxX3RvX3Jlc291cmNlKGRuLCAwLCAmaXJxX3Jlcyk7Ci0JaWYgKHJldCA9PSBOT19JUlEpCisJaWYgKCFyZXQpCiAJCWlycV9yZXMuc3RhcnQgPSBpcnFfcmVzLmVuZCA9IDA7CiAJZWxzZQogCQlpcnFfcmVzLmZsYWdzID0gMDsKIAogCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJyZWctc2hpZnQiLCBOVUxMKTsKIAlpZiAocHJvcCkKLQkJcmVnX3NoaWZ0ID0gKnByb3A7CisJCXJlZ19zaGlmdCA9IGJlMzJfdG9fY3B1cChwcm9wKTsKIAogCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJwaW8tbW9kZSIsIE5VTEwpOwogCWlmIChwcm9wKSB7Ci0JCXBpb19tb2RlID0gKnByb3A7CisJCXBpb19tb2RlID0gYmUzMl90b19jcHVwKHByb3ApOwogCQlpZiAocGlvX21vZGUgPiA2KSB7CiAJCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiaW52YWxpZCBwaW8tbW9kZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYwppbmRleCBiMTUxMWYzLi43ZDYzZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCkBAIC02Myw2ICs2Myw3IEBACiB9OwogCiBzdGF0aWMgaW50IHBkYzIwMjd4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpbnQgcGRjMjAyN3hfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBzdGF0aWMgaW50IHBkYzIwMjd4X3ByZXJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSk7CiBzdGF0aWMgdm9pZCBwZGMyMDI3eF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBwZGMyMDI3eF9zZXRfZG1hbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CkBAIC0xMjYsNiArMTI3LDEwIEBACiAJLmlkX3RhYmxlCQk9IHBkYzIwMjd4X3BjaV90YmwsCiAJLnByb2JlCQkJPSBwZGMyMDI3eF9pbml0X29uZSwKIAkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBwZGMyMDI3eF9yZWluaXRfb25lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwZGMyMDI3eF9zaHQgPSB7CkBAIC03NTQsNiArNzU5LDMxIEBACiAJCQkJIElSUUZfU0hBUkVELCAmcGRjMjAyN3hfc2h0KTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwZGMyMDI3eF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4OworCWludCByYzsKKworCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNjggfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3MCkKKwkJYm9hcmRfaWR4ID0gUERDX1VETUFfMTAwOworCWVsc2UKKwkJYm9hcmRfaWR4ID0gUERDX1VETUFfMTMzOworCisJaWYgKHBkY19oYXJkd2FyZV9pbml0KGhvc3QsIGJvYXJkX2lkeCkpCisJCXJldHVybiAtRUlPOworCisJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qKgogICogcGRjMjAyN3hfaW5pdCAtIENhbGxlZCBhZnRlciB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW50byB0aGUga2VybmVsLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4NzlkYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qCi0gKiAgICBwYXRhX3FkaS5jIC0gUURJIFZMQiBBVEEgY29udHJvbGxlcnMKLSAqCShDKSAyMDA2IFJlZCBIYXQKLSAqCi0gKiBUaGlzIGRyaXZlciBtb3N0bHkgZXhpc3RzIGFzIGEgcHJvb2Ygb2YgY29uY2VwdCBmb3Igbm9uIFBDSSBkZXZpY2VzIHVuZGVyCi0gKiBsaWJhdGEuIFdoaWxlIHRoZSBRREk2NTgwIHdhcyAnbmVhdCcgaW4gMTk5MyBpdCBpcyBubyBsb25nZXIgdGVycmlibHkKLSAqIHVzZWZ1bC4KLSAqCi0gKiBUdW5pbmcgY29kZSB3cml0dGVuIGZyb20gdGhlIGRvY3VtZW50YXRpb24gYXQKLSAqIGh0dHA6Ly93d3cucnlzdG9uLmN6L3BldHIvdmxiL3FkNjUwMC5odG1sCi0gKiBodHRwOi8vd3d3LnJ5c3Rvbi5jei9wZXRyL3ZsYi9xZDY1ODAuaHRtbAotICoKLSAqIFByb2JlIGNvZGUgYmFzZWQgb24gZHJpdmVycy9pZGUvbGVnYWN5L3FkNjV4eC5jCi0gKiBSZXdyaXR0ZW4gZnJvbSB0aGUgd29yayBvZiBDb2x0ZW4gRWR3YXJkcyA8cGplMTIwQGNzLnVzYXNrLmNhPiBieQotICogU2FtdWVsIFRoaWJhdWx0IDxzYW11ZWwudGhpYmF1bHRAZW5zLWx5b24ub3JnPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jZGVmaW5lIERSVl9OQU1FICJwYXRhX3FkaSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4xIgotCi0jZGVmaW5lIE5SX0hPU1QgNAkvKiBUd28gNjU4MHMgKi8KLQotc3RydWN0IHFkaV9kYXRhIHsKLQl1bnNpZ25lZCBsb25nIHRpbWluZzsKLQl1OCBjbG9ja1syXTsKLQl1OCBsYXN0OwotCWludCBmYXN0OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldjsKLQotfTsKLQotc3RhdGljIHN0cnVjdCBhdGFfaG9zdCAqcWRpX2hvc3RbTlJfSE9TVF07Ci1zdGF0aWMgc3RydWN0IHFkaV9kYXRhIHFkaV9kYXRhW05SX0hPU1RdOwotc3RhdGljIGludCBucl9xZGlfaG9zdDsKLQotI2lmZGVmIE1PRFVMRQotc3RhdGljIGludCBwcm9iZV9xZGkgPSAxOwotI2Vsc2UKLXN0YXRpYyBpbnQgcHJvYmVfcWRpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHFkaTY1MDBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGF0YV90aW1pbmcgdDsKLQlzdHJ1Y3QgcWRpX2RhdGEgKnFkaSA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0JaW50IGFjdGl2ZSwgcmVjb3Zlcnk7Ci0JdTggdGltaW5nOwotCi0JLyogR2V0IHRoZSB0aW1pbmcgZGF0YSBpbiBjeWNsZXMgKi8KLQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZ0LCAzMDMwMywgMTAwMCk7Ci0KLQlpZiAocWRpLT5mYXN0KSB7Ci0JCWFjdGl2ZSA9IDggLSBjbGFtcF92YWwodC5hY3RpdmUsIDEsIDgpOwotCQlyZWNvdmVyeSA9IDE4IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMywgMTgpOwotCX0gZWxzZSB7Ci0JCWFjdGl2ZSA9IDkgLSBjbGFtcF92YWwodC5hY3RpdmUsIDIsIDkpOwotCQlyZWNvdmVyeSA9IDE1IC0gY2xhbXBfdmFsKHQucmVjb3ZlciwgMCwgMTUpOwotCX0KLQl0aW1pbmcgPSAocmVjb3ZlcnkgPDwgNCkgfCBhY3RpdmUgfCAweDA4OwotCi0JcWRpLT5jbG9ja1thZGV2LT5kZXZub10gPSB0aW1pbmc7Ci0KLQlvdXRiKHRpbWluZywgcWRpLT50aW1pbmcpOwotfQotCi1zdGF0aWMgdm9pZCBxZGk2NTgwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBhdGFfdGltaW5nIHQ7Ci0Jc3RydWN0IHFkaV9kYXRhICpxZGkgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwotCWludCBhY3RpdmUsIHJlY292ZXJ5OwotCXU4IHRpbWluZzsKLQotCS8qIEdldCB0aGUgdGltaW5nIGRhdGEgaW4gY3ljbGVzICovCi0JYXRhX3RpbWluZ19jb21wdXRlKGFkZXYsIGFkZXYtPnBpb19tb2RlLCAmdCwgMzAzMDMsIDEwMDApOwotCi0JaWYgKHFkaS0+ZmFzdCkgewotCQlhY3RpdmUgPSA4IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAxLCA4KTsKLQkJcmVjb3ZlcnkgPSAxOCAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDMsIDE4KTsKLQl9IGVsc2UgewotCQlhY3RpdmUgPSA5IC0gY2xhbXBfdmFsKHQuYWN0aXZlLCAyLCA5KTsKLQkJcmVjb3ZlcnkgPSAxNSAtIGNsYW1wX3ZhbCh0LnJlY292ZXIsIDAsIDE1KTsKLQl9Ci0JdGltaW5nID0gKHJlY292ZXJ5IDw8IDQpIHwgYWN0aXZlIHwgMHgwODsKLQotCXFkaS0+Y2xvY2tbYWRldi0+ZGV2bm9dID0gdGltaW5nOwotCi0Jb3V0Yih0aW1pbmcsIHFkaS0+dGltaW5nKTsKLQotCS8qIENsZWFyIHRoZSBGSUZPICovCi0JaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKQotCQlvdXRiKDB4NUYsIChxZGktPnRpbWluZyAmIDB4RkZGMCkgKyAzKTsKLX0KLQotLyoqCi0gKglxZGlfcWNfaXNzdWUJCS0JY29tbWFuZCBpc3N1ZQotICoJQHFjOiBjb21tYW5kIHBlbmRpbmcKLSAqCi0gKglDYWxsZWQgd2hlbiB0aGUgbGliYXRhIGxheWVyIGlzIGFib3V0IHRvIGlzc3VlIGEgY29tbWFuZC4gV2Ugd3JhcAotICoJdGhpcyBpbnRlcmZhY2Ugc28gdGhhdCB3ZSBjYW4gbG9hZCB0aGUgY29ycmVjdCBBVEEgdGltaW5ncy4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHFkaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQotewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYgPSBxYy0+ZGV2OwotCXN0cnVjdCBxZGlfZGF0YSAqcWRpID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQotCWlmIChxZGktPmNsb2NrW2FkZXYtPmRldm5vXSAhPSBxZGktPmxhc3QpIHsKLQkJaWYgKGFkZXYtPnBpb19tb2RlKSB7Ci0JCQlxZGktPmxhc3QgPSBxZGktPmNsb2NrW2FkZXYtPmRldm5vXTsKLQkJCW91dGIocWRpLT5jbG9ja1thZGV2LT5kZXZub10sIHFkaS0+dGltaW5nKTsKLQkJfQotCX0KLQlyZXR1cm4gYXRhX3NmZl9xY19pc3N1ZShxYyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcWRpX2RhdGFfeGZlcihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkJICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpCi17Ci0JaWYgKGF0YV9pZF9oYXNfZHdvcmRfaW8oZGV2LT5pZCkpIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+bGluay0+YXA7Ci0JCWludCBzbG9wID0gYnVmbGVuICYgMzsKLQotCQlpZiAocncgPT0gUkVBRCkKLQkJCWlvcmVhZDMyX3JlcChhcC0+aW9hZGRyLmRhdGFfYWRkciwgYnVmLCBidWZsZW4gPj4gMik7Ci0JCWVsc2UKLQkJCWlvd3JpdGUzMl9yZXAoYXAtPmlvYWRkci5kYXRhX2FkZHIsIGJ1ZiwgYnVmbGVuID4+IDIpOwotCi0JCWlmICh1bmxpa2VseShzbG9wKSkgewotCQkJX19sZTMyIHBhZDsKLQkJCWlmIChydyA9PSBSRUFEKSB7Ci0JCQkJcGFkID0gY3B1X3RvX2xlMzIoaW9yZWFkMzIoYXAtPmlvYWRkci5kYXRhX2FkZHIpKTsKLQkJCQltZW1jcHkoYnVmICsgYnVmbGVuIC0gc2xvcCwgJnBhZCwgc2xvcCk7Ci0JCQl9IGVsc2UgewotCQkJCW1lbWNweSgmcGFkLCBidWYgKyBidWZsZW4gLSBzbG9wLCBzbG9wKTsKLQkJCQlpb3dyaXRlMzIobGUzMl90b19jcHUocGFkKSwgYXAtPmlvYWRkci5kYXRhX2FkZHIpOwotCQkJfQotCQkJYnVmbGVuICs9IDQgLSBzbG9wOwotCQl9Ci0JfSBlbHNlCi0JCWJ1ZmxlbiA9IGF0YV9zZmZfZGF0YV94ZmVyKGRldiwgYnVmLCBidWZsZW4sIHJ3KTsKLQotCXJldHVybiBidWZsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFkaV9zaHQgPSB7Ci0JQVRBX1BJT19TSFQoRFJWX05BTUUpLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFkaTY1MDBfcG9ydF9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmF0YV9zZmZfcG9ydF9vcHMsCi0JLnFjX2lzc3VlCT0gcWRpX3FjX2lzc3VlLAotCS5zZmZfZGF0YV94ZmVyCT0gcWRpX2RhdGFfeGZlciwKLQkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKLQkuc2V0X3Bpb21vZGUJPSBxZGk2NTAwX3NldF9waW9tb2RlLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHFkaTY1ODBfcG9ydF9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJnFkaTY1MDBfcG9ydF9vcHMsCi0JLnNldF9waW9tb2RlCT0gcWRpNjU4MF9zZXRfcGlvbW9kZSwKLX07Ci0KLS8qKgotICoJcWRpX2luaXRfb25lCQktCWF0dGFjaCBhIHFkaSBpbnRlcmZhY2UKLSAqCUB0eXBlOiBUeXBlIHRvIGRpc3BsYXkKLSAqCUBpbzogSS9PIHBvcnQgc3RhcnQKLSAqCUBpcnE6IGludGVycnVwdCBsaW5lCi0gKglAZmFzdDogVHJ1ZSBpZiBvbiBhID4gMzNNaHogVkxCCi0gKgotICoJUmVnaXN0ZXIgYW4gSVNBIGJ1cyBJREUgaW50ZXJmYWNlLiBTdWNoIGludGVyZmFjZXMgYXJlIFBJTyBhbmQgd2UKLSAqCWFzc3VtZSBkbyBub3Qgc3VwcG9ydCBJUlEgc2hhcmluZy4KLSAqLwotCi1zdGF0aWMgX19pbml0IGludCBxZGlfaW5pdF9vbmUodW5zaWduZWQgbG9uZyBwb3J0LCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBpbywgaW50IGlycSwgaW50IGZhc3QpCi17Ci0JdW5zaWduZWQgbG9uZyBjdGwgPSBpbyArIDB4MjA2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0OwotCXN0cnVjdCBhdGFfcG9ydCAqYXA7Ci0Jdm9pZCBfX2lvbWVtICppb19hZGRyLCAqY3RsX2FkZHI7Ci0JaW50IHJldDsKLQotCS8qCi0JICoJRmlsbCBpbiBhIHByb2JlIHN0cnVjdHVyZSBmaXJzdCBvZiBhbGwKLQkgKi8KLQotCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLCBucl9xZGlfaG9zdCwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihwZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIocGRldik7Ci0KLQlyZXQgPSAtRU5PTUVNOwotCWlvX2FkZHIgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgaW8sIDgpOwotCWN0bF9hZGRyID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIGN0bCwgMSk7Ci0JaWYgKCFpb19hZGRyIHx8ICFjdGxfYWRkcikKLQkJZ290byBmYWlsOwotCi0JcmV0ID0gLUVOT01FTTsKLQlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJnBkZXYtPmRldiwgMSk7Ci0JaWYgKCFob3N0KQotCQlnb3RvIGZhaWw7Ci0JYXAgPSBob3N0LT5wb3J0c1swXTsKLQotCWlmICh0eXBlID09IDY1ODApIHsKLQkJYXAtPm9wcyA9ICZxZGk2NTgwX3BvcnRfb3BzOwotCQlhcC0+cGlvX21hc2sgPSBBVEFfUElPNDsKLQkJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7Ci0JfSBlbHNlIHsKLQkJYXAtPm9wcyA9ICZxZGk2NTAwX3BvcnRfb3BzOwotCQlhcC0+cGlvX21hc2sgPSBBVEFfUElPMjsgLyogQWN0dWFsbHkgUElPMyAhSU9SRFkgaXMgcG9zc2libGUgKi8KLQkJYXAtPmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX05PX0lPUkRZOwotCX0KLQotCWFwLT5pb2FkZHIuY21kX2FkZHIgPSBpb19hZGRyOwotCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKLQlhcC0+aW9hZGRyLmN0bF9hZGRyID0gY3RsX2FkZHI7Ci0JYXRhX3NmZl9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOwotCi0JYXRhX3BvcnRfZGVzYyhhcCwgImNtZCAlbHggY3RsICVseCIsIGlvLCBjdGwpOwotCi0JLyoKLQkgKglIb29rIGluIGEgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBwZXIgY2hhbm5lbAotCSAqLwotCWFwLT5wcml2YXRlX2RhdGEgPSAmcWRpX2RhdGFbbnJfcWRpX2hvc3RdOwotCi0JcWRpX2RhdGFbbnJfcWRpX2hvc3RdLnRpbWluZyA9IHBvcnQ7Ci0JcWRpX2RhdGFbbnJfcWRpX2hvc3RdLmZhc3QgPSBmYXN0OwotCXFkaV9kYXRhW25yX3FkaV9ob3N0XS5wbGF0Zm9ybV9kZXYgPSBwZGV2OwotCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSI6IHFkJWQgYXQgMHglbHguXG4iLCB0eXBlLCBpbyk7Ci0KLQkvKiBhY3RpdmF0ZSAqLwotCXJldCA9IGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIGlycSwgYXRhX3NmZl9pbnRlcnJ1cHQsIDAsICZxZGlfc2h0KTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWw7Ci0KLQlxZGlfaG9zdFtucl9xZGlfaG9zdCsrXSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLQotIGZhaWw6Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKglxZGlfaW5pdAkJLQlhdHRhY2ggcWRpIGludGVyZmFjZXMKLSAqCi0gKglBdHRhY2ggcWRpIElERSBpbnRlcmZhY2VzIGJ5IHNjYW5uaW5nIHRoZSBwb3J0cyBpdCBtYXkgb2NjdXB5LgotICovCi0KLXN0YXRpYyBfX2luaXQgaW50IHFkaV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBxZF9wb3J0WzJdID0geyAweDMwLCAweEIwIH07Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgaWRlX3BvcnRbMl0gPSB7IDB4MTcwLCAweDFGMCB9OwotCXN0YXRpYyBjb25zdCBpbnQgaWRlX2lycVsyXSA9IHsgMTQsIDE1IH07Ci0KLQlpbnQgY3QgPSAwOwotCWludCBpOwotCi0JaWYgKHByb2JlX3FkaSA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qCi0gCSAqCUNoZWNrIGVhY2ggcG9zc2libGUgUUQ2NXh4IGJhc2UgYWRkcmVzcwotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHBvcnQgPSBxZF9wb3J0W2ldOwotCQl1OCByLCByZXM7Ci0KLQotCQlpZiAocmVxdWVzdF9yZWdpb24ocG9ydCwgMiwgInBhdGFfcWRpIikpIHsKLQkJCS8qIENoZWNrIGZvciBhIGNhcmQgKi8KLQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCXIgPSBpbmJfcChwb3J0KTsKLQkJCW91dGJfcCgweDE5LCBwb3J0KTsKLQkJCXJlcyA9IGluYl9wKHBvcnQpOwotCQkJb3V0Yl9wKHIsIHBvcnQpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JCQkvKiBGYWlsICovCi0JCQlpZiAocmVzID09IDB4MTkpCi0JCQl7Ci0JCQkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFBhc3NlcyB0aGUgcHJlc2VuY2UgdGVzdCAqLwotCQkJciA9IGluYl9wKHBvcnQgKyAxKTsJLyogQ2hlY2sgcG9ydCBhZ3JlZXMgd2l0aCBwb3J0IHNldCAqLwotCQkJaWYgKChyICYgMikgPj4gMSAhPSBpKSB7Ci0JCQkJcmVsZWFzZV9yZWdpb24ocG9ydCwgMik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIGNhcmQgdHlwZSAqLwotCQkJaWYgKChyICYgMHhGMCkgPT0gMHhDMCkgewotCQkJCS8qIFFENjUwMDogc2luZ2xlIGNoYW5uZWwgKi8KLQkJCQlpZiAociAmIDgpIHsKLQkJCQkJLyogRGlzYWJsZWQgPyAqLwotCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChxZGlfaW5pdF9vbmUocG9ydCwgNjUwMCwgaWRlX3BvcnRbciAmIDB4MDFdLCBpZGVfaXJxW3IgJiAweDAxXSwgciAmIDB4MDQpID09IDApCi0JCQkJCWN0Kys7Ci0JCQl9Ci0JCQlpZiAoKChyICYgMHhGMCkgPT0gMHhBMCkgfHwgKHIgJiAweEYwKSA9PSAweDUwKSB7Ci0JCQkJLyogUUQ2NTgwOiBkdWFsIGNoYW5uZWwgKi8KLQkJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnQgKyAyICwgMiwgInBhdGFfcWRpIikpCi0JCQkJewotCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlcyA9IGluYihwb3J0ICsgMyk7Ci0JCQkJaWYgKHJlcyAmIDEpIHsKLQkJCQkJLyogU2luZ2xlIGNoYW5uZWwgbW9kZSAqLwotCQkJCQlpZiAocWRpX2luaXRfb25lKHBvcnQsIDY1ODAsIGlkZV9wb3J0W3IgJiAweDAxXSwgaWRlX2lycVtyICYgMHgwMV0sIHIgJiAweDA0KSA9PSAwKQotCQkJCQkJY3QrKzsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBEdWFsIGNoYW5uZWwgbW9kZSAqLwotCQkJCQlpZiAocWRpX2luaXRfb25lKHBvcnQsIDY1ODAsIDB4MUYwLCAxNCwgciAmIDB4MDQpID09IDApCi0JCQkJCQljdCsrOwotCQkJCQlpZiAocWRpX2luaXRfb25lKHBvcnQgKyAyLCA2NTgwLCAweDE3MCwgMTUsIHIgJiAweDA0KSA9PSAwKQotCQkJCQkJY3QrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKGN0ICE9IDApCi0JCXJldHVybiAwOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgX19leGl0IHZvaWQgcWRpX2V4aXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9xZGlfaG9zdDsgaSsrKSB7Ci0JCWF0YV9ob3N0X2RldGFjaChxZGlfaG9zdFtpXSk7Ci0JCS8qIEZyZWUgdGhlIGNvbnRyb2wgcmVzb3VyY2UuIFRoZSA2NTgwIGR1YWwgY2hhbm5lbCBoYXMgdGhlIHJlc291cmNlcwotCQkgKiBjbGFpbWVkIGFzIGEgcGFpciBvZiAyIGJ5dGUgcmVzb3VyY2VzIHNvIHdlIG5lZWQgbm8gc3BlY2lhbCBjYXNlcy4uLgotCQkgKi8KLQkJcmVsZWFzZV9yZWdpb24ocWRpX2RhdGFbaV0udGltaW5nLCAyKTsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocWRpX2RhdGFbaV0ucGxhdGZvcm1fZGV2KTsKLQl9Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHFkaSBBVEEiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLQotbW9kdWxlX2luaXQocWRpX2luaXQpOwotbW9kdWxlX2V4aXQocWRpX2V4aXQpOwotCi1tb2R1bGVfcGFyYW0ocHJvYmVfcWRpLCBpbnQsIDApOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jIGIvZHJpdmVycy9hdGEvcGF0YV9yZGMuYwppbmRleCA0ZDMxOGY4Li5lNmEyZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3JkYy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcmRjLmMKQEAgLTg2LDYgKzg2LDggQEAKIAlyZXR1cm4gYXRhX3NmZl9wcmVyZXNldChsaW5rLCBkZWFkbGluZSk7CiB9CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socmRjX2xvY2spOworCiAvKioKICAqCXJkY19zZXRfcGlvbW9kZSAtIEluaXRpYWxpemUgaG9zdCBjb250cm9sbGVyIFBBVEEgUElPIHRpbWluZ3MKICAqCUBhcDogUG9ydCB3aG9zZSB0aW1pbmdzIHdlIGFyZSBjb25maWd1cmluZwpAQCAtMTAxLDYgKzEwMyw3IEBACiB7CiAJdW5zaWduZWQgaW50IHBpbwk9IGFkZXYtPnBpb19tb2RlIC0gWEZFUl9QSU9fMDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpc19zbGF2ZQk9IChhZGV2LT5kZXZubyAhPSAwKTsKIAl1bnNpZ25lZCBpbnQgbWFzdGVyX3BvcnQ9IGFwLT5wb3J0X25vID8gMHg0MiA6IDB4NDA7CiAJdW5zaWduZWQgaW50IHNsYXZlX3BvcnQJPSAweDQ0OwpAQCAtMTI0LDYgKzEyNyw4IEBACiAJaWYgKGFkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKQogCQljb250cm9sIHw9IDQ7CS8qIFBQRSBlbmFibGUgKi8KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZyZGNfbG9jaywgZmxhZ3MpOworCiAJLyogUElPIGNvbmZpZ3VyYXRpb24gY2xlYXJzIERURSB1bmNvbmRpdGlvbmFsbHkuICBJdCB3aWxsIGJlCiAJICogcHJvZ3JhbW1lZCBpbiBzZXRfZG1hbW9kZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZAogCSAqIGFmdGVyIHNldF9waW9tb2RlIGlmIGFueSBETUEgbW9kZSBpcyBhdmFpbGFibGUuCkBAIC0xNjEsNiArMTY2LDggQEAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDgsICZ1ZG1hX2VuYWJsZSk7CiAJdWRtYV9lbmFibGUgJj0gfigxIDw8ICgyICogYXAtPnBvcnRfbm8gKyBhZGV2LT5kZXZubykpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHVkbWFfZW5hYmxlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkY19sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMTc3LDYgKzE4NCw3IEBACiBzdGF0aWMgdm9pZCByZGNfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBtYXN0ZXJfcG9ydAkJPSBhcC0+cG9ydF9ubyA/IDB4NDIgOiAweDQwOwogCXUxNiBtYXN0ZXJfZGF0YTsKIAl1OCBzcGVlZAkJPSBhZGV2LT5kbWFfbW9kZTsKQEAgLTE5MCw2ICsxOTgsOCBAQAogCQkJICAgIHsgMiwgMSB9LAogCQkJICAgIHsgMiwgMyB9LCB9OwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkY19sb2NrLCBmbGFncyk7CisKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCAmbWFzdGVyX2RhdGEpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0OCwgJnVkbWFfZW5hYmxlKTsKIApAQCAtMjcxLDYgKzI4MSw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIG1hc3Rlcl9wb3J0LCBtYXN0ZXJfZGF0YSk7CiAJfQogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHVkbWFfZW5hYmxlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkY19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyByZGNfcGF0YV9vcHMgPSB7CkBAIC0zNzUsNiArMzg3LDEwIEBACiAJLmlkX3RhYmxlCQk9IHJkY19wY2lfdGJsLAogCS5wcm9iZQkJCT0gcmRjX2luaXRfb25lLAogCS5yZW1vdmUJCQk9IHJkY19yZW1vdmVfb25lLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCQk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAorI2VuZGlmCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCmluZGV4IGUyYzE4MjUuLmMwZTYwM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKLSNkZWZpbmUgRFJWX05BTUUJInNjMTIwMCIKKyNkZWZpbmUgRFJWX05BTUUJInBhdGFfc2MxMjAwIgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yLjYiCiAKICNkZWZpbmUgU0MxMjAwX1JFVl9BCTB4MDAKQEAgLTg2LDEwICs4NiwxNCBAQAogc3RhdGljIHZvaWQgc2MxMjAwX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCXN0YXRpYyBjb25zdCB1MzIgcGlvX3RpbWluZ3NbNF1bNV0gPSB7Ci0JCXsweDAwMDA5MTcyLCAweDAwMDEyMTcxLCAweDAwMDIwMDgwLCAweDAwMDMyMDEwLCAweDAwMDQwMDEwfSwJLy8gZm9ybWF0MCAgMzNNaHoKLQkJezB4ZDEzMjkxNzIsIDB4NzEyMTIxNzEsIDB4MzAyMDAwODAsIDB4MjAxMDIwMTAsIDB4MDAxMDAwMTB9LAkvLyBmb3JtYXQxLCAzM01oegotCQl7MHhmYWEzZjRmMywgMHhjMjMyMzJiMiwgMHg1MTMxMDFjMSwgMHgzMTIxMzEyMSwgMHgxMDIxMTAyMX0sCS8vIGZvcm1hdDEsIDQ4TWh6Ci0JCXsweGZmZjRmZmY0LCAweGYzNTM1M2QzLCAweDgxNDEwMmYxLCAweDQyMzE0MjMxLCAweDExMzExMTMxfQkvLyBmb3JtYXQxLCA2Nk1oegorCQkvKiBmb3JtYXQwLCAzM01oeiAqLworCQl7IDB4MDAwMDkxNzIsIDB4MDAwMTIxNzEsIDB4MDAwMjAwODAsIDB4MDAwMzIwMTAsIDB4MDAwNDAwMTAgfSwKKwkJLyogZm9ybWF0MSwgMzNNaHogKi8KKwkJeyAweGQxMzI5MTcyLCAweDcxMjEyMTcxLCAweDMwMjAwMDgwLCAweDIwMTAyMDEwLCAweDAwMTAwMDEwIH0sCisJCS8qIGZvcm1hdDEsIDQ4TWh6ICovCisJCXsgMHhmYWEzZjRmMywgMHhjMjMyMzJiMiwgMHg1MTMxMDFjMSwgMHgzMTIxMzEyMSwgMHgxMDIxMTAyMSB9LAorCQkvKiBmb3JtYXQxLCA2Nk1oeiAqLworCQl7IDB4ZmZmNGZmZjQsIDB4ZjM1MzUzZDMsIDB4ODE0MTAyZjEsIDB4NDIzMTQyMzEsIDB4MTEzMTExMzEgfQogCX07CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zY2MuYwppbmRleCBlYjc0OGUzLi5lMjY1ZjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKQEAgLTgyNiwxOCArODI2LDYgQEAKIH0KIAogLyoqCi0gKglzY2NfcGF0YV9wcmVyZXNldCAtIHByZXBhcmUgZm9yIHJlc2V0Ci0gKglAYXA6IEFUQSBwb3J0IHRvIGJlIHJlc2V0Ci0gKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KLSAqLwotCi1zdGF0aWMgaW50IHNjY19wYXRhX3ByZXJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKLXsKLQlsaW5rLT5hcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7Ci0JcmV0dXJuIGF0YV9zZmZfcHJlcmVzZXQobGluaywgZGVhZGxpbmUpOwotfQotCi0vKioKICAqCXNjY19wb3N0cmVzZXQgLSBzdGFuZGFyZCBwb3N0cmVzZXQgY2FsbGJhY2sKICAqCUBhcDogdGhlIHRhcmdldCBhdGFfcG9ydAogICoJQGNsYXNzZXM6IGNsYXNzZXMgb2YgYXR0YWNoZWQgZGV2aWNlcwpAQCAtOTQ2LDcgKzkzNCw3IEBACiAJLmJtZG1hX3N0YXR1cwkJPSBzY2NfYm1kbWFfc3RhdHVzLAogCS5zZmZfZGF0YV94ZmVyCQk9IHNjY19kYXRhX3hmZXIsCiAKLQkucHJlcmVzZXQJCT0gc2NjX3BhdGFfcHJlcmVzZXQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfODB3aXJlLAogCS5zb2Z0cmVzZXQJCT0gc2NjX3NvZnRyZXNldCwKIAkucG9zdHJlc2V0CQk9IHNjY19wb3N0cmVzZXQsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwppbmRleCA4NmRkNzE0ZS4uNzFlYWYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYwpAQCAtNTgsMTQgKzU4LDE1IEBACiB9OwogCiAvKioKLSAqCWRlbGxfY2FibGUJLQlEZWxsIHNlcnZlcndvcmtzIGNhYmxlIGRldGVjdGlvbgorICoJb2VtX2NhYmxlCS0JRGVsbC9TdW4gc2VydmVyd29ya3MgY2FibGUgZGV0ZWN0aW9uCiAgKglAYXA6IEFUQSBwb3J0IHRvIGRvIGNhYmxlIGRldGVjdAogICoKLSAqCURlbGwgaGlkZSB0aGUgNDAvODAgcGluIHNlbGVjdCBmb3IgdGhlaXIgaW50ZXJmYWNlcyBpbiB0aGUgdG9wIHR3bwotICoJYml0cyBvZiB0aGUgc3Vic3lzdGVtIElELgorICoJRGVsbCBQb3dlckVkZ2UgYW5kIFN1biBDb2JhbHQgJ0FscGluZScgaGlkZSB0aGUgNDAvODAgcGluIHNlbGVjdAorICoJZm9yIHRoZWlyIGludGVyZmFjZXMgaW4gdGhlIHRvcCB0d28gYml0cyBvZiB0aGUgc3Vic3lzdGVtIElELgogICovCiAKLXN0YXRpYyBpbnQgZGVsbF9jYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKSB7CitzdGF0aWMgaW50IG9lbV9jYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAogCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgKDEgPDwgKGFwLT5wb3J0X25vICsgMTQpKSkKQEAgLTczLDY2ICs3NCwyMSBAQAogCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIH0KIAotLyoqCi0gKglzdW5fY2FibGUJLQlTdW4gQ29iYWx0ICdBbHBpbmUnIGNhYmxlIGRldGVjdGlvbgotICoJQGFwOiBBVEEgcG9ydCB0byBkbyBjYWJsZSBzZWxlY3QKLSAqCi0gKglDb2JhbHQgQ1NCNSBJREUgaGlkZXMgdGhlIDQwLzgwcGluIGluIHRoZSB0b3AgdHdvIGJpdHMgb2YgdGhlCi0gKglzdWJzeXN0ZW0gSUQgdGhlIHNhbWUgYXMgZGVsbC4gV2UgY291bGQgdXNlIG9uZSBmdW5jdGlvbiBidXQgd2UgbWF5Ci0gKgluZWVkIHRvIGV4dGVuZCB0aGUgRGVsbCBvbmUgaW4gZnV0dXJlCi0gKi8KLQotc3RhdGljIGludCBzdW5fY2FibGUoc3RydWN0IGF0YV9wb3J0ICphcCkgewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQotCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgKDEgPDwgKGFwLT5wb3J0X25vICsgMTQpKSkKLQkJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOwotCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKLX0KLQotLyoqCi0gKglvc2I0X2NhYmxlCS0JT1NCNCBjYWJsZSBkZXRlY3QKLSAqCUBhcDogQVRBIHBvcnQgdG8gY2hlY2sKLSAqCi0gKglUaGUgT1NCNCBpc24ndCBVRE1BNjYgY2FwYWJsZSBzbyB0aGlzIGlzIGVhc3kKLSAqLwotCi1zdGF0aWMgaW50IG9zYjRfY2FibGUoc3RydWN0IGF0YV9wb3J0ICphcCkgewotCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKLX0KLQotLyoqCi0gKgljc2JfY2FibGUJLQlDU0I1LzYgY2FibGUgZGV0ZWN0Ci0gKglAYXA6IEFUQSBwb3J0IHRvIGNoZWNrCi0gKgotICoJU2VydmVyd29ya3MgZGVmYXVsdCBhcnJhbmdlbWVudCBpcyB0byB1c2UgdGhlIGRyaXZlIHNpZGUgZGV0ZWN0aW9uCi0gKglvbmx5LgotICovCi0KLXN0YXRpYyBpbnQgY3NiX2NhYmxlKHN0cnVjdCBhdGFfcG9ydCAqYXApIHsKLQlyZXR1cm4gQVRBX0NCTF9QQVRBX1VOSzsKLX0KLQogc3RydWN0IHN2X2NhYmxlX3RhYmxlIHsKIAlpbnQgZGV2aWNlOwogCWludCBzdWJ2ZW5kb3I7CiAJaW50ICgqY2FibGVfZGV0ZWN0KShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIH07CiAKLS8qCi0gKglOb3RlIHRoYXQgd2UgZG9uJ3QgY29weSB0aGUgb2xkIHNlcnZlcndvcmtzIGNvZGUgYmVjYXVzZSB0aGUgb2xkCi0gKgljb2RlIGNvbnRhaW5zIG9idmlvdXMgbWlzdGFrZXMKLSAqLwotCiBzdGF0aWMgc3RydWN0IHN2X2NhYmxlX3RhYmxlIGNhYmxlX2RldGVjdFtdID0gewotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCBQQ0lfVkVORE9SX0lEX0RFTEwsIGRlbGxfY2FibGUgfSwKLQl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSwgUENJX1ZFTkRPUl9JRF9ERUxMLCBkZWxsX2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIFBDSV9WRU5ET1JfSURfU1VOLCAgc3VuX2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREUsIFBDSV9BTllfSUQsIG9zYjRfY2FibGUgfSwKLQl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgUENJX0FOWV9JRCwgY3NiX2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LAotCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMiwgUENJX0FOWV9JRCwgY3NiX2NhYmxlIH0sCi0JeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERSwgUENJX0FOWV9JRCwgY3NiX2NhYmxlIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsICAgUENJX1ZFTkRPUl9JRF9ERUxMLCBvZW1fY2FibGUgfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERSwgICBQQ0lfVkVORE9SX0lEX0RFTEwsIG9lbV9jYWJsZSB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCAgIFBDSV9WRU5ET1JfSURfU1VOLCAgb2VtX2NhYmxlIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREUsICAgUENJX0FOWV9JRCwgYXRhX2NhYmxlXzQwd2lyZSAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgICBQQ0lfQU5ZX0lELCBhdGFfY2FibGVfdW5rbm93biB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFLCAgIFBDSV9BTllfSUQsIGF0YV9jYWJsZV91bmtub3duIH0sCisJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyLCAgUENJX0FOWV9JRCwgYXRhX2NhYmxlX3Vua25vd24gfSwKKwl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSFQxMDAwSURFLCBQQ0lfQU5ZX0lELCBhdGFfY2FibGVfdW5rbm93biB9LAogCXsgfQogfTsKIApAQCAtMzkzLDYgKzM0OSwzMSBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDVBLCBidHIpOwogfQogCitzdGF0aWMgaW50IHNlcnZlcndvcmtzX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByYyA9IDA7CisKKwkvKiBGb3JjZSBtYXN0ZXIgbGF0ZW5jeSB0aW1lciB0byA2NCBQQ0kgY2xvY2tzICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREU6CisJCXJjID0gc2VydmVyd29ya3NfZml4dXBfb3NiNChwZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREU6CisJCWF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleChwZGV2KTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyOgorCQlyYyA9IHNlcnZlcndvcmtzX2ZpeHVwX2NzYihwZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERToKKwkJc2VydmVyd29ya3NfZml4dXBfaHQxMDAwKHBkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CiAKIHN0YXRpYyBpbnQgc2VydmVyd29ya3NfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKQEAgLTQzMCwxMyArNDExLDEyIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQkvKiBGb3JjZSBtYXN0ZXIgbGF0ZW5jeSB0aW1lciB0byA2NCBQQ0kgY2xvY2tzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKwlyYyA9IHNlcnZlcndvcmtzX2ZpeHVwKHBkZXYpOwogCiAJLyogT1NCNCA6IFNvdXRoIEJyaWRnZSBhbmQgSURFICovCiAJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREUpIHsKIAkJLyogU2VsZWN0IG5vbiBVRE1BIGNhcGFibGUgT1NCNCBpZiB3ZSBjYW4ndCBkbyBmaXh1cHMgKi8KLQkJaWYgKCBzZXJ2ZXJ3b3Jrc19maXh1cF9vc2I0KHBkZXYpIDwgMCkKKwkJaWYgKHJjIDwgMCkKIAkJCXBwaVswXSA9ICZpbmZvWzFdOwogCX0KIAkvKiBzZXR1cCBDU0I1L0NTQjYgOiBTb3V0aCBCcmlkZ2UgYW5kIElERSBvcHRpb24gUkFJRCAqLwpAQCAtNDQ2LDE5ICs0MjYsMTMgQEAKIAogCQkgLyogSWYgdGhlIHJldHVybmVkIGJ0ciBpcyB0aGUgbmV3ZXIgcmV2aXNpb24gdGhlbgogCQkgICAgc2VsZWN0IHRoZSByaWdodCBpbmZvIGJsb2NrICovCi0JCSBpZiAoc2VydmVyd29ya3NfZml4dXBfY3NiKHBkZXYpID09IDMpCisJCSBpZiAocmMgPT0gMykKIAkJIAlwcGlbMF0gPSAmaW5mb1szXTsKIAogCQkvKiBJcyB0aGlzIHRoZSAzcmQgY2hhbm5lbCBDU0I2IElERSA/ICovCiAJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFMikKIAkJCXBwaVsxXSA9ICZhdGFfZHVtbXlfcG9ydF9pbmZvOwogCX0KLQkvKiBzZXR1cCBIVDEwMDBFICovCi0JZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSFQxMDAwSURFKQotCQlzZXJ2ZXJ3b3Jrc19maXh1cF9odDEwMDAocGRldik7Ci0KLQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSkKLQkJYXRhX3BjaV9ibWRtYV9jbGVhcl9zaW1wbGV4KHBkZXYpOwogCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUocGRldiwgcHBpLCAmc2VydmVyd29ya3Nfc2h0LCBOVUxMLCAwKTsKIH0KQEAgLTQ3MywyNCArNDQ3LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCS8qIEZvcmNlIG1hc3RlciBsYXRlbmN5IHRpbWVyIHRvIDY0IFBDSSBjbG9ja3MgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NDApOwotCi0Jc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjRJREU6Ci0JCQlzZXJ2ZXJ3b3Jrc19maXh1cF9vc2I0KHBkZXYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFOgotCQkJYXRhX3BjaV9ibWRtYV9jbGVhcl9zaW1wbGV4KHBkZXYpOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFOgotCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTI6Ci0JCQlzZXJ2ZXJ3b3Jrc19maXh1cF9jc2IocGRldik7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMTAwMElERToKLQkJCXNlcnZlcndvcmtzX2ZpeHVwX2h0MTAwMChwZGV2KTsKLQkJCWJyZWFrOwotCX0KKwkodm9pZClzZXJ2ZXJ3b3Jrc19maXh1cChwZGV2KTsKIAogCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCmluZGV4IDMxZjc1OWIuLmI5MmVhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwpAQCAtMzgsMTEgKzM4LDEyIEBACiAKIC8qKgogICoJc2lsNjgwX3NlbHJlZwkJLQlyZXR1cm4gcmVnaXN0ZXIgYmFzZQotICoJQGh3aWY6IGludGVyZmFjZQorICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAcjogY29uZmlnIG9mZnNldAogICoKLSAqCVR1cm4gYSBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0IGludG8gdGhlIHJpZ2h0IGFkZHJlc3MgaW4gZWl0aGVyCi0gKglQQ0kgc3BhY2Ugb3IgTU1JTyBzcGFjZSB0byBhY2Nlc3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW4gcXVlc3Rpb24KKyAqCVR1cm4gYSBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0IGludG8gdGhlIHJpZ2h0IGFkZHJlc3MgaW4gUENJIHNwYWNlCisgKgl0byBhY2Nlc3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW4gcXVlc3Rpb24uCisgKgogICoJVGhhbmtmdWxseSB0aGlzIGlzIGEgY29uZmlndXJhdGlvbiBvcGVyYXRpb24gc28gaXNuJ3QgcGVyZm9ybWFuY2UKICAqCWNyaXRpY2lhbC4KICAqLwpAQCAtNTYsMTIgKzU3LDEyIEBACiAKIC8qKgogICoJc2lsNjgwX3NlbGRldgkJLQlyZXR1cm4gcmVnaXN0ZXIgYmFzZQotICoJQGh3aWY6IGludGVyZmFjZQorICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAcjogY29uZmlnIG9mZnNldAogICoKLSAqCVR1cm4gYSBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0IGludG8gdGhlIHJpZ2h0IGFkZHJlc3MgaW4gZWl0aGVyCi0gKglQQ0kgc3BhY2Ugb3IgTU1JTyBzcGFjZSB0byBhY2Nlc3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW4gcXVlc3Rpb24KLSAqCWluY2x1ZGluZyBhY2NvdW50aW5nIGZvciB0aGUgdW5pdCBzaGlmdC4KKyAqCVR1cm4gYSBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0IGludG8gdGhlIHJpZ2h0IGFkZHJlc3MgaW4gUENJIHNwYWNlCisgKgl0byBhY2Nlc3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW4gcXVlc3Rpb24gaW5jbHVkaW5nIGFjY291bnRpbmcgZm9yCisgKgl0aGUgdW5pdCBzaGlmdC4KICAqLwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzaWw2ODBfc2VsZGV2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCBpbnQgcikKQEAgLTgxLDcgKzgyLDggQEAKICAqCXNwYWNlIGZvciB1cy4KICAqLwogCi1zdGF0aWMgaW50IHNpbDY4MF9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkgeworc3RhdGljIGludCBzaWw2ODBfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHNpbDY4MF9zZWxyZWcoYXAsIDApOwogCXU4IGF0YTY2OwpAQCAtOTMsNyArOTUsNyBAQAogfQogCiAvKioKLSAqCXNpbDY4MF9zZXRfcGlvbW9kZQktCXNldCBpbml0aWFsIFBJTyBtb2RlIGRhdGEKKyAqCXNpbDY4MF9zZXRfcGlvbW9kZQktCXNldCBQSU8gbW9kZSBkYXRhCiAgKglAYXA6IEFUQSBpbnRlcmZhY2UKICAqCUBhZGV2OiBBVEEgZGV2aWNlCiAgKgpAQCAtMTA0LDggKzEwNiwxMiBAQAogCiBzdGF0aWMgdm9pZCBzaWw2ODBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RhdGljIHUxNiBzcGVlZF9wWzVdID0geyAweDMyOEEsIDB4MjI4MywgMHgxMTA0LCAweDEwQzMsIDB4MTBDMSB9OwotCXN0YXRpYyB1MTYgc3BlZWRfdFs1XSA9IHsgMHgzMjhBLCAweDIyODMsIDB4MTI4MSwgMHgxMEMzLCAweDEwQzEgfTsKKwlzdGF0aWMgY29uc3QgdTE2IHNwZWVkX3BbNV0gPSB7CisJCTB4MzI4QSwgMHgyMjgzLCAweDExMDQsIDB4MTBDMywgMHgxMEMxCisJfTsKKwlzdGF0aWMgY29uc3QgdTE2IHNwZWVkX3RbNV0gPSB7CisJCTB4MzI4QSwgMHgyMjgzLCAweDEyODEsIDB4MTBDMywgMHgxMEMxCisJfTsKIAogCXVuc2lnbmVkIGxvbmcgdGZhZGRyID0gc2lsNjgwX3NlbHJlZyhhcCwgMHgwMik7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gc2lsNjgwX3NlbGRldihhcCwgYWRldiwgMHgwNCk7CkBAIC0xNDAsMjIgKzE0NiwyMyBAQAogfQogCiAvKioKLSAqCXNpbDY4MF9zZXRfZG1hbW9kZQktCXNldCBpbml0aWFsIERNQSBtb2RlIGRhdGEKKyAqCXNpbDY4MF9zZXRfZG1hbW9kZQktCXNldCBETUEgbW9kZSBkYXRhCiAgKglAYXA6IEFUQSBpbnRlcmZhY2UKICAqCUBhZGV2OiBBVEEgZGV2aWNlCiAgKgotICoJUHJvZ3JhbSB0aGUgTVdETUEvVURNQSBtb2RlcyBmb3IgdGhlIHNpbDY4MCBrCi0gKgljaGlwc2V0LiBUaGUgTVdETUEgbW9kZSB2YWx1ZXMgYXJlIHB1bGxlZCBmcm9tIGEgbG9va3VwIHRhYmxlCisgKglQcm9ncmFtIHRoZSBNV0RNQS9VRE1BIG1vZGVzIGZvciB0aGUgc2lsNjgwIGNoaXBzZXQuCisgKgorICoJVGhlIE1XRE1BIG1vZGUgdmFsdWVzIGFyZSBwdWxsZWQgZnJvbSBhIGxvb2t1cCB0YWJsZQogICoJd2hpbGUgdGhlIGNoaXBzZXQgdXNlcyBtb2RlIG51bWJlciBmb3IgVURNQS4KICAqLwogCiBzdGF0aWMgdm9pZCBzaWw2ODBfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RhdGljIHU4IHVsdHJhX3RhYmxlWzJdWzddID0geworCXN0YXRpYyBjb25zdCB1OCB1bHRyYV90YWJsZVsyXVs3XSA9IHsKIAkJeyAweDBDLCAweDA3LCAweDA1LCAweDA0LCAweDAyLCAweDAxLCAweEZGIH0sCS8qIDEwME1IeiAqLwogCQl7IDB4MEYsIDB4MEIsIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDEgfSwJLyogMTMzTWh6ICovCiAJfTsKLQlzdGF0aWMgdTE2IGRtYV90YWJsZVszXSA9IHsgMHgyMjA4LCAweDEwQzIsIDB4MTBDMSB9OworCXN0YXRpYyBjb25zdCB1MTYgZG1hX3RhYmxlWzNdID0geyAweDIyMDgsIDB4MTBDMiwgMHgxMEMxIH07CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdW5zaWduZWQgbG9uZyBtYSA9IHNpbDY4MF9zZWxkZXYoYXAsIGFkZXYsIDB4MDgpOwpAQCAtMTc1LDcgKzE4Miw3IEBACiAJbW9kZSAmPSB+KDB4MDMgPDwgcG9ydF9zaGlmdCk7CiAKIAkvKiBFeHRyYWN0IHNjc2MgKi8KLQlzY3NjID0gKHNjc2MgJiAweDMwKSA/IDE6IDA7CisJc2NzYyA9IChzY3NjICYgMHgzMCkgPyAxIDogMDsKIAogCWlmIChhZGV2LT5kbWFfbW9kZSA+PSBYRkVSX1VETUFfMCkgewogCQltdWx0aSA9IDB4MTBDMTsKQEAgLTI0OCw3ICsyNTUsNyBAQAogewogCXU4IHRtcGJ5dGUJPSAwOwogCi0gICAgICAgIC8qIEZJWE1FOiBkb3VibGUgY2hlY2sgKi8KKwkvKiBGSVhNRTogZG91YmxlIGNoZWNrICovCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCiAJCQkgICAgICBwZGV2LT5yZXZpc2lvbiA/IDEgOiAyNTUpOwogCkBAIC0yNjYsMjIgKzI3MywyMiBAQAogCQkqdHJ5X21taW8gPSAodG1wYnl0ZSAmIDEpIHx8IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KTsKICNlbmRpZgogCi0Jc3dpdGNoKHRtcGJ5dGUgJiAweDMwKSB7Ci0JCWNhc2UgMHgwMDoKLQkJCS8qIDEzMyBjbG9jayBhdHRlbXB0IHRvIGZvcmNlIGl0IG9uICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4QSwgdG1wYnl0ZXwweDEwKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MzA6Ci0JCQkvKiBpZiBjbG9ja2luZyBpcyBkaXNhYmxlZCAqLwotCQkJLyogMTMzIGNsb2NrIGF0dGVtcHQgdG8gZm9yY2UgaXQgb24gKi8KLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDhBLCB0bXBieXRlICYgfjB4MjApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgxMDoKLQkJCS8qIDEzMyBhbHJlYWR5ICovCi0JCQlicmVhazsKLQkJY2FzZSAweDIwOgotCQkJLyogQklPUyBzZXQgUENJIHgyIGNsb2NraW5nICovCi0JCQlicmVhazsKKwlzd2l0Y2ggKHRtcGJ5dGUgJiAweDMwKSB7CisJY2FzZSAweDAwOgorCQkvKiAxMzMgY2xvY2sgYXR0ZW1wdCB0byBmb3JjZSBpdCBvbiAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4QSwgdG1wYnl0ZXwweDEwKTsKKwkJYnJlYWs7CisJY2FzZSAweDMwOgorCQkvKiBpZiBjbG9ja2luZyBpcyBkaXNhYmxlZCAqLworCQkvKiAxMzMgY2xvY2sgYXR0ZW1wdCB0byBmb3JjZSBpdCBvbiAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg4QSwgdG1wYnl0ZSAmIH4weDIwKTsKKwkJYnJlYWs7CisJY2FzZSAweDEwOgorCQkvKiAxMzMgYWxyZWFkeSAqLworCQlicmVhazsKKwljYXNlIDB4MjA6CisJCS8qIEJJT1Mgc2V0IFBDSSB4MiBjbG9ja2luZyAqLworCQlicmVhazsKIAl9CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAgIDB4OEEsICZ0bXBieXRlKTsKQEAgLTI5OSwxMiArMzA2LDE5IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweEI4LCAweDQzOTI0MzkyKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4QkMsIDB4NDAwOTQwMDkpOwogCi0Jc3dpdGNoKHRtcGJ5dGUgJiAweDMwKSB7Ci0JCWNhc2UgMHgwMDogcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiAxMDBNSHogY2xvY2suXG4iKTticmVhazsKLQkJY2FzZSAweDEwOiBwcmludGsoS0VSTl9JTkZPICJzaWw2ODA6IDEzM01IeiBjbG9jay5cbiIpO2JyZWFrOwotCQljYXNlIDB4MjA6IHByaW50ayhLRVJOX0lORk8gInNpbDY4MDogVXNpbmcgUENJIGNsb2NrLlxuIik7YnJlYWs7Ci0JCS8qIFRoaXMgbGFzdCBjYXNlIGlzIF9OT1RfIG9rICovCi0JCWNhc2UgMHgzMDogcHJpbnRrKEtFUk5fRVJSICJzaWw2ODA6IENsb2NrIGRpc2FibGVkID9cbiIpOworCXN3aXRjaCAodG1wYnl0ZSAmIDB4MzApIHsKKwljYXNlIDB4MDA6CisJCXByaW50ayhLRVJOX0lORk8gInNpbDY4MDogMTAwTUh6IGNsb2NrLlxuIik7CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lsNjgwOiAxMzNNSHogY2xvY2suXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDIwOgorCQlwcmludGsoS0VSTl9JTkZPICJzaWw2ODA6IFVzaW5nIFBDSSBjbG9jay5cbiIpOworCQlicmVhazsKKwkvKiBUaGlzIGxhc3QgY2FzZSBpcyBfTk9UXyBvayAqLworCWNhc2UgMHgzMDoKKwkJcHJpbnRrKEtFUk5fRVJSICJzaWw2ODA6IENsb2NrIGRpc2FibGVkID9cbiIpOwogCX0KIAlyZXR1cm4gdG1wYnl0ZSAmIDB4MzA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwppbmRleCA1MzNmMmFlLi5iMGVkYzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAkvKiBkZXZpZCwgc3VidmVuZG9yLCBzdWJkZXYgKi8KIAl7IDB4NTUxMywgMHgxMDQzLCAweDExMDcgfSwJLyogQVNVUyBBNksgKi8KIAl7IDB4NTUxMywgMHgxNzM0LCAweDEwNUYgfSwJLyogRlNDIEFtaWxvIEExNjMwICovCi0JeyAweDU1MTMsIDB4MTA3MSwgMHg4NjQwIH0sICAgICAvKiBFYXN5Tm90ZSBLNTMwNSAqLworCXsgMHg1NTEzLCAweDEwNzEsIDB4ODY0MCB9LAkvKiBFYXN5Tm90ZSBLNTMwNSAqLwogCS8qIGVuZCBtYXJrZXIgKi8KIAl7IDAsIH0KIH07CkBAIC03Niw3ICs3Niw3IEBACiB9CiAKIC8qKgotICoJc2lzX29sZF9wb3J0X2Jhc2UJCS0JcmV0dXJuIFBDSSBjb25maWd1cmF0aW9uIGJhc2UgZm9yIGRldgorICoJc2lzX29sZF9wb3J0X2Jhc2UgLSByZXR1cm4gUENJIGNvbmZpZ3VyYXRpb24gYmFzZSBmb3IgZGV2CiAgKglAYWRldjogZGV2aWNlCiAgKgogICoJUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZvciB0aGlzIHBvcnQKQEAgLTg1LDExICs4NSwzNCBAQAogCiBzdGF0aWMgaW50IHNpc19vbGRfcG9ydF9iYXNlKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXJldHVybiAgMHg0MCArICg0ICogYWRldi0+bGluay0+YXAtPnBvcnRfbm8pICsgICgyICogYWRldi0+ZGV2bm8pOworCXJldHVybiAweDQwICsgKDQgKiBhZGV2LT5saW5rLT5hcC0+cG9ydF9ubykgKyAoMiAqIGFkZXYtPmRldm5vKTsKIH0KIAogLyoqCi0gKglzaXNfMTMzX2NhYmxlX2RldGVjdAktCWNoZWNrIGZvciA0MC84MCBwaW4KKyAqCXNpc19wb3J0X2Jhc2UgLSByZXR1cm4gUENJIGNvbmZpZ3VyYXRpb24gYmFzZSBmb3IgZGV2CisgKglAYWRldjogZGV2aWNlCisgKgorICoJUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZvciB0aGlzIHBvcnQKKyAqCW51bWJlci4KKyAqLworCitzdGF0aWMgaW50IHNpc19wb3J0X2Jhc2Uoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGFkZXYtPmxpbmstPmFwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlpbnQgcG9ydCA9IDB4NDA7CisJdTMyIHJlZzU0OworCisJLyogSWYgYml0IDMwIGlzIHNldCB0aGVuIHRoZSByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAweDcwIG5vdCAweDQwICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTQsICZyZWc1NCk7CisJaWYgKHJlZzU0ICYgMHg0MDAwMDAwMCkKKwkJcG9ydCA9IDB4NzA7CisKKwlyZXR1cm4gcG9ydCArICg4ICogYXAtPnBvcnRfbm8pICsgKDQgKiBhZGV2LT5kZXZubyk7Cit9CisKKy8qKgorICoJc2lzXzEzM19jYWJsZV9kZXRlY3QgLSBjaGVjayBmb3IgNDAvODAgcGluCiAgKglAYXA6IFBvcnQKICAqCUBkZWFkbGluZTogZGVhZGxpbmUgamlmZmllcyBmb3IgdGhlIG9wZXJhdGlvbgogICoKQEAgLTExMCw3ICsxMzMsNyBAQAogfQogCiAvKioKLSAqCXNpc182Nl9jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglzaXNfNjZfY2FibGVfZGV0ZWN0IC0gY2hlY2sgZm9yIDQwLzgwIHBpbgogICoJQGFwOiBQb3J0CiAgKgogICoJUGVyZm9ybSBjYWJsZSBkZXRlY3Rpb24gb24gdGhlIFVETUE2NiwgVURNQTEwMCBhbmQgZWFybHkgVURNQTEzMwpAQCAtMTMyLDcgKzE1NSw3IEBACiAKIAogLyoqCi0gKglzaXNfcHJlX3Jlc2V0CQktCXByb2JlIGJlZ2luCisgKglzaXNfcHJlX3Jlc2V0IC0gcHJvYmUgYmVnaW4KICAqCUBsaW5rOiBBVEEgbGluawogICoJQGRlYWRsaW5lOiBkZWFkbGluZSBqaWZmaWVzIGZvciB0aGUgb3BlcmF0aW9uCiAgKgpAQCAtMTYwLDcgKzE4Myw3IEBACiAKIAogLyoqCi0gKglzaXNfc2V0X2ZpZm8JLQlTZXQgUldQIGZpZm8gYml0cyBmb3IgdGhpcyBkZXZpY2UKKyAqCXNpc19zZXRfZmlmbyAtIFNldCBSV1AgZmlmbyBiaXRzIGZvciB0aGlzIGRldmljZQogICoJQGFwOiBQb3J0CiAgKglAYWRldjogRGV2aWNlCiAgKgpAQCAtMjAzLDEzICsyMjYsMTMgQEAKIAogc3RhdGljIHZvaWQgc2lzX29sZF9zZXRfcGlvbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlpbnQgcG9ydCA9IHNpc19vbGRfcG9ydF9iYXNlKGFkZXYpOwogCXU4IHQxLCB0MjsKIAlpbnQgc3BlZWQgPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CiAKLQljb25zdCB1OCBhY3RpdmVbXSAgID0geyAweDAwLCAweDA3LCAweDA0LCAweDAzLCAweDAxIH07Ci0JY29uc3QgdTggcmVjb3ZlcnlbXSA9IHsgMHgwMCwgMHgwNiwgMHgwNCwgMHgwMywgMHgwMyB9OworCXN0YXRpYyBjb25zdCB1OCBhY3RpdmVbXSAgID0geyAweDAwLCAweDA3LCAweDA0LCAweDAzLCAweDAxIH07CisJc3RhdGljIGNvbnN0IHU4IHJlY292ZXJ5W10gPSB7IDB4MDAsIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDMgfTsKIAogCXNpc19zZXRfZmlmbyhhcCwgYWRldik7CiAKQEAgLTI0MCwxMSArMjYzLDExIEBACiAKIHN0YXRpYyB2b2lkIHNpc18xMDBfc2V0X3Bpb21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHBvcnQgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAlpbnQgc3BlZWQgPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CiAKLQljb25zdCB1OCBhY3RyZWNbXSA9IHsgMHgwMCwgMHg2NywgMHg0NCwgMHgzMywgMHgzMSB9OworCXN0YXRpYyBjb25zdCB1OCBhY3RyZWNbXSA9IHsgMHgwMCwgMHg2NywgMHg0NCwgMHgzMywgMHgzMSB9OwogCiAJc2lzX3NldF9maWZvKGFwLCBhZGV2KTsKIApAQCAtMjY1LDIwICsyODgsMTkgQEAKIAogc3RhdGljIHZvaWQgc2lzXzEzM19zZXRfcGlvbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCWludCBwb3J0ID0gMHg0MDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJaW50IHBvcnQ7CiAJdTMyIHQxOwotCXUzMiByZWc1NDsKIAlpbnQgc3BlZWQgPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7CiAKLQljb25zdCB1MzIgdGltaW5nMTMzW10gPSB7CisJc3RhdGljIGNvbnN0IHUzMiB0aW1pbmcxMzNbXSA9IHsKIAkJMHgyODI2OTAwMCwJLyogUmVjb3ZlcnkgPDwgMjQgfCBBY3QgPDwgMTYgfCBJbmkgPDwgMTIgKi8KIAkJMHgwQzI2NjAwMCwKIAkJMHgwNDI2MzAwMCwKIAkJMHgwQzBBMzAwMCwKIAkJMHgwNTA5MzAwMAogCX07Ci0JY29uc3QgdTMyIHRpbWluZzEwMFtdID0geworCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nMTAwW10gPSB7CiAJCTB4MUUxQzYwMDAsCS8qIFJlY292ZXJ5IDw8IDI0IHwgQWN0IDw8IDE2IHwgSW5pIDw8IDEyICovCiAJCTB4MDkxQzQwMDAsCiAJCTB4MDMxQzIwMDAsCkBAIC0yODgsMTIgKzMxMCw3IEBACiAKIAlzaXNfc2V0X2ZpZm8oYXAsIGFkZXYpOwogCi0JLyogSWYgYml0IDE0IGlzIHNldCB0aGVuIHRoZSByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAweDcwIG5vdCAweDQwICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTQsICZyZWc1NCk7Ci0JaWYgKHJlZzU0ICYgMHg0MDAwMDAwMCkKLQkJcG9ydCA9IDB4NzA7Ci0JcG9ydCArPSA4ICogYXAtPnBvcnRfbm8gKyAgNCAqIGFkZXYtPmRldm5vOwotCisJcG9ydCA9IHNpc19wb3J0X2Jhc2UoYWRldik7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcnQsICZ0MSk7CiAJdDEgJj0gMHhDMEMwMEZGRjsJLyogTWFzayBvdXQgdGltaW5nICovCiAKQEAgLTMxOSwxMyArMzM2LDEzIEBACiAKIHN0YXRpYyB2b2lkIHNpc19vbGRfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwogCWludCBkcml2ZV9wY2kgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAl1MTYgdGltaW5nOwogCi0JY29uc3QgdTE2IG13ZG1hX2JpdHNbXSA9IHsgMHgwMDgsIDB4MzAyLCAweDMwMSB9OwotCWNvbnN0IHUxNiB1ZG1hX2JpdHNbXSAgPSB7IDB4RTAwMCwgMHhDMDAwLCAweEEwMDAgfTsKKwlzdGF0aWMgY29uc3QgdTE2IG13ZG1hX2JpdHNbXSA9IHsgMHgwMDgsIDB4MzAyLCAweDMwMSB9OworCXN0YXRpYyBjb25zdCB1MTYgdWRtYV9iaXRzW10gID0geyAweEUwMDAsIDB4QzAwMCwgMHhBMDAwIH07CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBkcml2ZV9wY2ksICZ0aW1pbmcpOwogCkBAIC0zNTgsMTQgKzM3NSwxNCBAQAogCiBzdGF0aWMgdm9pZCBzaXNfNjZfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwogCWludCBkcml2ZV9wY2kgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAl1MTYgdGltaW5nOwogCiAJLyogTVdETUEgMC0yIGFuZCBVRE1BIDAtNSAqLwotCWNvbnN0IHUxNiBtd2RtYV9iaXRzW10gPSB7IDB4MDA4LCAweDMwMiwgMHgzMDEgfTsKLQljb25zdCB1MTYgdWRtYV9iaXRzW10gID0geyAweEYwMDAsIDB4RDAwMCwgMHhCMDAwLCAweEEwMDAsIDB4OTAwMCwgMHg4MDAwIH07CisJc3RhdGljIGNvbnN0IHUxNiBtd2RtYV9iaXRzW10gPSB7IDB4MDA4LCAweDMwMiwgMHgzMDEgfTsKKwlzdGF0aWMgY29uc3QgdTE2IHVkbWFfYml0c1tdICA9IHsgMHhGMDAwLCAweEQwMDAsIDB4QjAwMCwgMHhBMDAwLCAweDkwMDAsIDB4ODAwMCB9OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgZHJpdmVfcGNpLCAmdGltaW5nKTsKIApAQCAtMzk3LDEyICs0MTQsMTIgQEAKIAogc3RhdGljIHZvaWQgc2lzXzEwMF9zZXRfZG1hbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYJPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlpbnQgc3BlZWQgPSBhZGV2LT5kbWFfbW9kZSAtIFhGRVJfTVdfRE1BXzA7CiAJaW50IGRyaXZlX3BjaSA9IHNpc19vbGRfcG9ydF9iYXNlKGFkZXYpOwogCXU4IHRpbWluZzsKIAotCWNvbnN0IHU4IHVkbWFfYml0c1tdICA9IHsgMHg4QiwgMHg4NywgMHg4NSwgMHg4MywgMHg4MiwgMHg4MX07CisJc3RhdGljIGNvbnN0IHU4IHVkbWFfYml0c1tdICA9IHsgMHg4QiwgMHg4NywgMHg4NSwgMHg4MywgMHg4MiwgMHg4MX07CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBkcml2ZV9wY2kgKyAxLCAmdGltaW5nKTsKIApAQCAtNDMxLDcgKzQ0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHNpc18xMzNfZWFybHlfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2CT0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwogCWludCBkcml2ZV9wY2kgPSBzaXNfb2xkX3BvcnRfYmFzZShhZGV2KTsKIAl1OCB0aW1pbmc7CkBAIC00NjQsMzIgKzQ4MSwzNCBAQAogCiBzdGF0aWMgdm9pZCBzaXNfMTMzX3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldgk9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOwotCWludCBwb3J0ID0gMHg0MDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJaW50IHBvcnQ7CiAJdTMyIHQxOwotCXUzMiByZWc1NDsKIAotCS8qIGJpdHMgNC0gY3ljbGUgdGltZSA4IC0gY3ZzIHRpbWUgKi8KLQlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTAwW10gPSB7IDB4NkIwLCAweDQ3MCwgMHgzNTAsIDB4MTQwLCAweDEyMCwgMHgxMTAsIDB4MDAwIH07Ci0Jc3RhdGljIGNvbnN0IHUzMiB0aW1pbmdfdTEzM1tdID0geyAweDlGMCwgMHg2QTAsIDB4NDcwLCAweDI1MCwgMHgyMzAsIDB4MjIwLCAweDIxMCB9OwotCi0JLyogSWYgYml0IDE0IGlzIHNldCB0aGVuIHRoZSByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAweDcwIG5vdCAweDQwICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTQsICZyZWc1NCk7Ci0JaWYgKHJlZzU0ICYgMHg0MDAwMDAwMCkKLQkJcG9ydCA9IDB4NzA7Ci0JcG9ydCArPSAoOCAqIGFwLT5wb3J0X25vKSArICAoNCAqIGFkZXYtPmRldm5vKTsKLQorCXBvcnQgPSBzaXNfcG9ydF9iYXNlKGFkZXYpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3J0LCAmdDEpOwogCiAJaWYgKGFkZXYtPmRtYV9tb2RlIDwgWEZFUl9VRE1BXzApIHsKKwkJLyogUmVjb3ZlcnkgPDwgMjQgfCBBY3QgPDwgMTYgfCBJbmkgPDwgMTIsIGxpa2UgUElPIG1vZGVzICovCisJCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nX3UxMDBbXSA9IHsgMHgxOTE1NDAwMCwgMHgwNjA3MjAwMCwgMHgwNDA2MjAwMCB9OworCQlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTMzW10gPSB7IDB4MjIxQzYwMDAsIDB4MEMwQTMwMDAsIDB4MDUwOTMwMDAgfTsKKwkJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RNQV8wOworCisJCXQxICY9IDB4QzBDMDBGRkY7CisJCS8qIGRpc2FibGUgVURNQSAqLwogCQl0MSAmPSB+MHgwMDAwMDAwNDsKLQkJLyogRklYTUU6IG5lZWQgZGF0YSBzaGVldCB0byBhZGQgTVdETUEgaGVyZS4gQWxzbyBsYWNraW5nIG9uCi0JCSAgIGlkZS9wY2kgZHJpdmVyICovCisJCWlmICh0MSAmIDB4MDgpCisJCQl0MSB8PSB0aW1pbmdfdTEzM1tzcGVlZF07CisJCWVsc2UKKwkJCXQxIHw9IHRpbWluZ191MTAwW3NwZWVkXTsKIAl9IGVsc2UgewotCQlzcGVlZCA9IGFkZXYtPmRtYV9tb2RlIC0gWEZFUl9VRE1BXzA7Ci0JCS8qIGlmICYgOCBubyBVRE1BMTMzIC0gbmVlZCBpbmZvIGZvciAuLi4gKi8KKwkJLyogYml0cyA0LSBjeWNsZSB0aW1lIDggLSBjdnMgdGltZSAqLworCQlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTAwW10gPSB7IDB4NkIwLCAweDQ3MCwgMHgzNTAsIDB4MTQwLCAweDEyMCwgMHgxMTAsIDB4MDAwIH07CisJCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nX3UxMzNbXSA9IHsgMHg5RjAsIDB4NkEwLCAweDQ3MCwgMHgyNTAsIDB4MjMwLCAweDIyMCwgMHgyMTAgfTsKKwkJaW50IHNwZWVkID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX1VETUFfMDsKKwogCQl0MSAmPSB+MHgwMDAwMEZGMDsKKwkJLyogZW5hYmxlIFVETUEgKi8KIAkJdDEgfD0gMHgwMDAwMDAwNDsKIAkJaWYgKHQxICYgMHgwOCkKIAkJCXQxIHw9IHRpbWluZ191MTMzW3NwZWVkXTsKQEAgLTQ5OSw2ICs1MTgsMjcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBvcnQsIHQxKTsKIH0KIAorLyoqCisgKglzaXNfMTMzX21vZGVfZmlsdGVyIC0gbW9kZSBzZWxlY3Rpb24gZmlsdGVyCisgKglAYWRldjogQVRBIGRldmljZQorICoKKyAqCUJsb2NrIFVETUE2IG9uIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaXNfMTMzX21vZGVfZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGFkZXYtPmxpbmstPmFwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwlpbnQgcG9ydCA9IHNpc19wb3J0X2Jhc2UoYWRldik7CisJdTMyIHQxOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcnQsICZ0MSk7CisJLyogaWYgQVRBMTMzIGlzIGRpc2FibGVkLCBtYXNrIGl0IG91dCAqLworCWlmICghKHQxICYgMHgwOCkpCisJCW1hc2sgJj0gfigweEMwIDw8IEFUQV9TSElGVF9VRE1BKTsKKwlyZXR1cm4gbWFzazsKK30KKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2lzX3NodCA9IHsKIAlBVEFfQk1ETUFfU0hUKERSVl9OQU1FKSwKIH07CkBAIC01MjAsNiArNTYwLDcgQEAKIAkuc2V0X3Bpb21vZGUJCT0gc2lzXzEzM19zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJCT0gc2lzXzEzM19zZXRfZG1hbW9kZSwKIAkuY2FibGVfZGV0ZWN0CQk9IHNpc18xMzNfY2FibGVfZGV0ZWN0LAorCS5tb2RlX2ZpbHRlcgkJPSBzaXNfMTMzX21vZGVfZmlsdGVyLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNpc18xMzNfZWFybHlfb3BzID0gewpAQCAtNTg4LDcgKzYyOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzMgPSB7CiAJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJLnBpb19tYXNrCT0gQVRBX1BJTzQsCi0JLyogTm8gTVdETUEgKi8KKwkubXdkbWFfbWFzawk9IEFUQV9NV0RNQTIsCiAJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKIAkucG9ydF9vcHMJPSAmc2lzXzEzM19vcHMsCiB9OwpAQCAtNjY5LDcgKzcxMCw3IEBACiAgKglAcGRldjogUENJIGRldmljZSB0byByZWdpc3RlcgogICoJQGVudDogRW50cnkgaW4gc2lzX3BjaV90YmwgbWF0Y2hpbmcgd2l0aCBAcGRldgogICoKLSAqCUNhbGxlZCBmcm9tIGtlcm5lbCBQQ0kgbGF5ZXIuICBXZSBwcm9iZSBmb3IgY29tYmluZWQgbW9kZSAoc2lnaCksCisgKglDYWxsZWQgZnJvbSBrZXJuZWwgUENJIGxheWVyLiBXZSBwcm9iZSBmb3IgY29tYmluZWQgbW9kZSAoc2lnaCksCiAgKglhbmQgdGhlbiBoYW5kIG92ZXIgY29udHJvbCB0byBsaWJhdGEsIGZvciBpdCB0byBkbyB0aGUgcmVzdC4KICAqCiAgKglMT0NLSU5HOgpAQCAtNzY5LDE3ICs4MTAsMjAgQEAKIAogCQlzd2l0Y2godHJ1ZWlkKSB7CiAJCWNhc2UgMHg1NTE4OgkvKiBTSVMgOTYyLzk2MyAqLworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIlNpUyA5NjIvOTYzIE11VElPTCBJREUgVURNQTEzMyBjb250cm9sbGVyXG4iKTsKIAkJCWNoaXBzZXQgPSAmc2lzMTMzOwogCQkJaWYgKChpZGVtaXNjICYgMHg0MDAwMDAwMCkgPT0gMCkgewogCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1NCwgaWRlbWlzYyB8IDB4NDAwMDAwMDApOwotCQkJCXByaW50ayhLRVJOX0lORk8gIlNJUzU1MTM6IFN3aXRjaGluZyB0byA1NTEzIHJlZ2lzdGVyIG1hcHBpbmdcbiIpOworCQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJCSAiU3dpdGNoaW5nIHRvIDU1MTMgcmVnaXN0ZXIgbWFwcGluZ1xuIik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAweDAxODA6CS8qIFNJUyA5NjUvOTY1TCAqLwotCQkJY2hpcHNldCA9ICAmc2lzMTMzOworCQkJY2hpcHNldCA9ICZzaXMxMzM7CiAJCQlicmVhazsKIAkJY2FzZSAweDExODA6CS8qIFNJUyA5NjYvOTY2TCAqLwotCQkJY2hpcHNldCA9ICAmc2lzMTMzOworCQkJY2hpcHNldCA9ICZzaXMxMzM7CiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwppbmRleCBjMDZjZThjLi4yNGNmMjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIHBhdGFfc2w4MmMxMDUuYyAJLSBTTDgyQzEwNSBQQVRBIGZvciBuZXcgQVRBIGxheWVyCiAgKgkJCSAgKEMpIDIwMDUgUmVkIEhhdCBJbmMKKyAqCQkJICAoQykgMjAxMSBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CiAgKgogICogQmFzZWQgaW4gcGFydCBvbiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwogICogCQlTTDgyQzEwNS9XaW5ib25kIDU1MyBJREUgZHJpdmVyCkBAIC0yODksNiArMjkwLDE0IEBACiAJcmV0dXJuIGJyaWRnZS0+cmV2aXNpb247CiB9CiAKK3N0YXRpYyB2b2lkIHNsODJjMTA1X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUzMiB2YWw7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7CisJdmFsIHw9IENUUkxfUDBFTiB8IENUUkxfUDBGMTYgfCBDVFJMX1AxRjE2OworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgdmFsKTsKK30KIAogc3RhdGljIGludCBzbDgyYzEwNV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zMDYsNyArMzE1LDYgQEAKIAkvKiBmb3Igbm93IHVzZSBvbmx5IHRoZSBmaXJzdCBwb3J0ICovCiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mb19lYXJseSwKIAkJCQkJICAgICAgIE5VTEwgfTsKLQl1MzIgdmFsOwogCWludCByZXY7CiAJaW50IHJjOwogCkBAIC0zMjUsMTMgKzMzMywyOCBAQAogCWVsc2UKIAkJcHBpWzBdID0gJmluZm9fZG1hOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnZhbCk7Ci0JdmFsIHw9IENUUkxfUDBFTiB8IENUUkxfUDBGMTYgfCBDVFJMX1AxRjE2OwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCB2YWwpOworCXNsODJjMTA1X2ZpeHVwKGRldik7CiAKIAlyZXR1cm4gYXRhX3BjaV9ibWRtYV9pbml0X29uZShkZXYsIHBwaSwgJnNsODJjMTA1X3NodCwgTlVMTCwgMCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc2w4MmMxMDVfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJaW50IHJjOworCisJcmMgPSBhdGFfcGNpX2RldmljZV9kb19yZXN1bWUocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzbDgyYzEwNV9maXh1cChwZGV2KTsKKworCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2w4MmMxMDVbXSA9IHsKIAl7IFBDSV9WREVWSUNFKFdJTkJPTkQsIFBDSV9ERVZJQ0VfSURfV0lOQk9ORF84MkMxMDUpLCB9LAogCkBAIC0zNDIsNyArMzY1LDExIEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IHNsODJjMTA1LAogCS5wcm9iZSAJCT0gc2w4MmMxMDVfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzbDgyYzEwNV9yZWluaXRfb25lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzbDgyYzEwNV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwppbmRleCA4ZTlmNTA0Li4yNTVmMzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKQEAgLTUwOSw2ICs1MDksMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHZpYV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHZpYV9pc2FfYnJpZGdlICpjb25maWcpCit7CisJdTMyIHRpbWluZzsKKworCS8qIEluaXRpYWxpc2UgdGhlIEZJRk8gZm9yIHRoZSBlbmFibGVkIGNoYW5uZWxzLiAqLworCXZpYV9jb25maWdfZmlmbyhwZGV2LCBjb25maWctPmZsYWdzKTsKKworCWlmIChjb25maWctPnVkbWFfbWFzayA9PSBBVEFfVURNQTQpIHsKKwkJLyogVGhlIDY2IE1IeiBkZXZpY2VzIHJlcXVpcmUgd2UgZW5hYmxlIHRoZSBjbG9jayAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnRpbWluZyk7CisJCXRpbWluZyB8PSAweDgwMDA4OworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsIHRpbWluZyk7CisJfQorCWlmIChjb25maWctPmZsYWdzICYgVklBX0JBRF9DTEs2NikgeworCQkvKiBEaXNhYmxlIHRoZSA2Nk1IeiBjbG9jayBvbiBwcm9ibGVtIGRldmljZXMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZ0aW1pbmcpOworCQl0aW1pbmcgJj0gfjB4ODAwMDg7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgdGltaW5nKTsKKwl9Cit9CisKIC8qKgogICoJdmlhX2luaXRfb25lCQktCWRpc2NvdmVyeSBjYWxsYmFjawogICoJQHBkZXY6IFBDSSBkZXZpY2UKQEAgLTU3MCw3ICs1OTEsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICppc2E7CiAJY29uc3Qgc3RydWN0IHZpYV9pc2FfYnJpZGdlICpjb25maWc7CiAJdTggZW5hYmxlOwotCXUzMiB0aW1pbmc7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpbnQgcmM7CiAKQEAgLTYwOSw5ICs2MjksNiBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogSW5pdGlhbGlzZSB0aGUgRklGTyBmb3IgdGhlIGVuYWJsZWQgY2hhbm5lbHMuICovCi0JdmlhX2NvbmZpZ19maWZvKHBkZXYsIGNvbmZpZy0+ZmxhZ3MpOwotCiAJLyogQ2xvY2sgc2V0IHVwICovCiAJc3dpdGNoIChjb25maWctPnVkbWFfbWFzaykgewogCWNhc2UgMHgwMDoKQEAgLTYzNywxMiArNjU0LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAgCX0KIAotCWlmIChjb25maWctPmZsYWdzICYgVklBX0JBRF9DTEs2NikgewotCQkvKiBEaXNhYmxlIHRoZSA2Nk1IeiBjbG9jayBvbiBwcm9ibGVtIGRldmljZXMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZ0aW1pbmcpOwotCQl0aW1pbmcgJj0gfjB4ODAwMDg7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgdGltaW5nKTsKLQl9CisJdmlhX2ZpeHVwKHBkZXYsIGNvbmZpZyk7CiAKIAkvKiBXZSBoYXZlIGVzdGFibGlzaGVkIHRoZSBkZXZpY2UgdHlwZSwgbm93IGZpcmUgaXQgdXAgKi8KIAlyZXR1cm4gYXRhX3BjaV9ibWRtYV9pbml0X29uZShwZGV2LCBwcGksICZ2aWFfc2h0LCAodm9pZCAqKWNvbmZpZywgMCk7CkBAIC02NjEsMjkgKzY3MywxNCBAQAogCiBzdGF0aWMgaW50IHZpYV9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXUzMiB0aW1pbmc7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCWNvbnN0IHN0cnVjdCB2aWFfaXNhX2JyaWRnZSAqY29uZmlnID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogCWludCByYzsKIAogCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JdmlhX2NvbmZpZ19maWZvKHBkZXYsIGNvbmZpZy0+ZmxhZ3MpOwotCi0JaWYgKGNvbmZpZy0+dWRtYV9tYXNrID09IEFUQV9VRE1BNCkgewotCQkvKiBUaGUgNjYgTUh6IGRldmljZXMgcmVxdWlyZSB3ZSBlbmFibGUgdGhlIGNsb2NrICovCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmdGltaW5nKTsKLQkJdGltaW5nIHw9IDB4ODAwMDg7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgdGltaW5nKTsKLQl9Ci0JaWYgKGNvbmZpZy0+ZmxhZ3MgJiBWSUFfQkFEX0NMSzY2KSB7Ci0JCS8qIERpc2FibGUgdGhlIDY2TUh6IGNsb2NrIG9uIHByb2JsZW0gZGV2aWNlcyAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnRpbWluZyk7Ci0JCXRpbWluZyAmPSB+MHg4MDAwODsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCB0aW1pbmcpOwotCX0KKwl2aWFfZml4dXAocGRldiwgaG9zdC0+cHJpdmF0ZV9kYXRhKTsKIAogCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwppbmRleCA0YjZiMjA5Li4wYjhiOGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCkBAIC00MDg3LDggKzQwODcsMTEgQEAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAic2xvdHMgJXUgcG9ydHMgJWRcbiIsCiAJCSAodW5zaWduZWQpTVZfTUFYX1FfREVQVEgsIGhvc3QtPm5fcG9ydHMpOwogCi0JcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIG12X2ludGVycnVwdCwKLQkJCQkgSVJRRl9TSEFSRUQsICZtdjZfc2h0KTsKKwlyYyA9IGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIG12X2ludGVycnVwdCwKKwkJCSAgICAgICBJUlFGX1NIQVJFRCwgJm12Nl9zaHQpOworCWlmICghcmMpCisJCXJldHVybiAwOworCiBlcnI6CiAjaWYgZGVmaW5lZChDT05GSUdfSEFWRV9DTEspCiAJaWYgKCFJU19FUlIoaHByaXYtPmNsaykpIHsKQEAgLTQxMTAsOCArNDExMyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IG12X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAjaWYgZGVmaW5lZChDT05GSUdfSEFWRV9DTEspCiAJc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CiAjZW5kaWYKQEAgLTQxMjksNyArNDEzMSw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IG12X3BsYXRmb3JtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpZiAoaG9zdCkKIAkJcmV0dXJuIGF0YV9ob3N0X3N1c3BlbmQoaG9zdCwgc3RhdGUpOwogCWVsc2UKQEAgLTQxMzgsNyArNDE0MCw3IEBACiAKIHN0YXRpYyBpbnQgbXZfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCByZXQ7CiAKIAlpZiAoaG9zdCkgewpAQCAtNDM1Myw3ICs0MzU1LDcgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgbXZfcGNpX2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgcmM7CiAKIAlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwppbmRleCA1NTQ3MGYzLi4xZTkxNDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlzdHJ1Y3Qgc2lsMjRfYXRhcGlfYmxvY2sgYXRhcGk7CiB9OwogCi1zdGF0aWMgc3RydWN0IHNpbDI0X2NlcnJfaW5mbyB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNpbDI0X2NlcnJfaW5mbyB7CiAJdW5zaWduZWQgaW50IGVycl9tYXNrLCBhY3Rpb247CiAJY29uc3QgY2hhciAqZGVzYzsKIH0gc2lsMjRfY2Vycl9kYltdID0gewpAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAogCS8qIGRlYWwgd2l0aCBjb21tYW5kIGVycm9yICovCiAJaWYgKGlycV9zdGF0ICYgUE9SVF9JUlFfRVJST1IpIHsKLQkJc3RydWN0IHNpbDI0X2NlcnJfaW5mbyAqY2kgPSBOVUxMOworCQljb25zdCBzdHJ1Y3Qgc2lsMjRfY2Vycl9pbmZvICpjaSA9IE5VTEw7CiAJCXVuc2lnbmVkIGludCBlcnJfbWFzayA9IDAsIGFjdGlvbiA9IDA7CiAJCXUzMiBjb250ZXh0LCBjZXJyOwogCQlpbnQgcG1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKaW5kZXggNDQ3ZDljMC4uOTVlYzQzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIH07CiAKIE1PRFVMRV9BVVRIT1IoIlV3ZSBLb3ppb2xlayIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBTaWxpY29uIEludGVncmF0YWQgU3lzdGVtcyBTQVRBIGNvbnRyb2xsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgU0FUQSBjb250cm9sbGVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lzX3BjaV90YmwpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggYTM0ZGNhMC4uMjFjMWI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKIC8qKgogICogc3RydWN0IHN1YnN5c19wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBidXNfdHlwZS9jbGFzcyBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMgYi9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKaW5kZXggZjM2OWUyNy4uYmIwMDI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYwpAQCAtNCw2ICs0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiBzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCmluZGV4IDc2M2Q1OWMuLjZmMzY3NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2h5cGVydmlzb3IuYyBiL2RyaXZlcnMvYmFzZS9oeXBlcnZpc29yLmMKaW5kZXggNjQyOGNiYS4uNGY4Yjc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2h5cGVydmlzb3IuYworKysgYi9kcml2ZXJzL2Jhc2UvaHlwZXJ2aXNvci5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCiBzdHJ1Y3Qga29iamVjdCAqaHlwZXJ2aXNvcl9rb2JqOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2NvbW1vbi5jCmluZGV4IDI5ODIwYzMuLjRhZjdjMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9jb21tb24uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvY29tbW9uLmMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX2Nsb2NrLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKaW5kZXggOTUwOGRmNy4uMjY1YTBlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCmluZGV4IDU5ZjhhYjIuLjdmYTA5ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCmluZGV4IDQzNGE2YzAuLjk1NzA2ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCXN0cnVjdCBkZXZpY2Vfb3BwICpkZXZfb3BwID0gZmluZF9kZXZpY2Vfb3BwKGRldik7CiAKIAlpZiAoSVNfRVJSKGRldl9vcHApKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGRldl9vcHApKTsgLyogbWF0Y2hpbmcgdHlwZSAqLworCQlyZXR1cm4gRVJSX0NBU1QoZGV2X29wcCk7IC8qIG1hdGNoaW5nIHR5cGUgKi8KIAogCXJldHVybiAmZGV2X29wcC0+aGVhZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9xb3MuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9xb3MuYwppbmRleCA5MWUwNjE0Li4zMGE5NGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcW9zLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Fvcy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIAogc3RhdGljIERFRklORV9NVVRFWChkZXZfcG1fcW9zX210eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwppbmRleCA2YmIzYWFmLi44Yzc4NDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ycG0uaD4KICNpbmNsdWRlICJwb3dlci5oIgpAQCAtMjksMTMgKzMwLDEwIEBACiB2b2lkIHVwZGF0ZV9wbV9ydW50aW1lX2FjY291bnRpbmcoc3RydWN0IGRldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlpbnQgZGVsdGE7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKIAogCWRlbHRhID0gbm93IC0gZGV2LT5wb3dlci5hY2NvdW50aW5nX3RpbWVzdGFtcDsKIAotCWlmIChkZWx0YSA8IDApCi0JCWRlbHRhID0gMDsKLQogCWRldi0+cG93ZXIuYWNjb3VudGluZ190aW1lc3RhbXAgPSBub3c7CiAKIAlpZiAoZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoID4gMCkKQEAgLTI5Niw2ICsyOTQsOSBAQAogICogdGhlIGNhbGxiYWNrIHdhcyBydW5uaW5nIHRoZW4gY2FycnkgaXQgb3V0LCBvdGhlcndpc2Ugc2VuZCBhbiBpZGxlCiAgKiBub3RpZmljYXRpb24gZm9yIGl0cyBwYXJlbnQgKGlmIHRoZSBzdXNwZW5kIHN1Y2NlZWRlZCBhbmQgYm90aAogICogaWdub3JlX2NoaWxkcmVuIG9mIHBhcmVudC0+cG93ZXIgYW5kIGlycV9zYWZlIG9mIGRldi0+cG93ZXIgYXJlIG5vdCBzZXQpLgorICogSWYgLT5ydW50aW1lX3N1c3BlbmQgZmFpbGVkIHdpdGggLUVBR0FJTiBvciAtRUJVU1ksIGFuZCBpZiB0aGUgUlBNX0FVVE8KKyAqIGZsYWcgaXMgc2V0IGFuZCB0aGUgbmV4dCBhdXRvc3VzcGVuZC1kZWxheSBleHBpcmF0aW9uIHRpbWUgaXMgaW4gdGhlCisgKiBmdXR1cmUsIHNjaGVkdWxlIGFub3RoZXIgYXV0b3N1c3BlbmQgYXR0ZW1wdC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHVuZGVyIGRldi0+cG93ZXIubG9jayB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KQEAgLTQxNiwxMCArNDE3LDIxIEBACiAJaWYgKHJldHZhbCkgewogCQlfX3VwZGF0ZV9ydW50aW1lX3N0YXR1cyhkZXYsIFJQTV9BQ1RJVkUpOwogCQlkZXYtPnBvd2VyLmRlZmVycmVkX3Jlc3VtZSA9IGZhbHNlOwotCQlpZiAocmV0dmFsID09IC1FQUdBSU4gfHwgcmV0dmFsID09IC1FQlVTWSkKKwkJaWYgKHJldHZhbCA9PSAtRUFHQUlOIHx8IHJldHZhbCA9PSAtRUJVU1kpIHsKIAkJCWRldi0+cG93ZXIucnVudGltZV9lcnJvciA9IDA7Ci0JCWVsc2UKKworCQkJLyoKKwkJCSAqIElmIHRoZSBjYWxsYmFjayByb3V0aW5lIGZhaWxlZCBhbiBhdXRvc3VzcGVuZCwgYW5kCisJCQkgKiBpZiB0aGUgbGFzdF9idXN5IHRpbWUgaGFzIGJlZW4gdXBkYXRlZCBzbyB0aGF0IHRoZXJlCisJCQkgKiBpcyBhIG5ldyBhdXRvc3VzcGVuZCBleHBpcmF0aW9uIHRpbWUsIGF1dG9tYXRpY2FsbHkKKwkJCSAqIHJlc2NoZWR1bGUgYW5vdGhlciBhdXRvc3VzcGVuZC4KKwkJCSAqLworCQkJaWYgKChycG1mbGFncyAmIFJQTV9BVVRPKSAmJgorCQkJICAgIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmRfZXhwaXJhdGlvbihkZXYpICE9IDApCisJCQkJZ290byByZXBlYXQ7CisJCX0gZWxzZSB7CiAJCQlwbV9ydW50aW1lX2NhbmNlbF9wZW5kaW5nKGRldik7CisJCX0KIAkJd2FrZV91cF9hbGwoJmRldi0+cG93ZXIud2FpdF9xdWV1ZSk7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3N5c2ZzLmMKaW5kZXggMTdiNzkzNC4uYWRmNDFiZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCkBAIC00LDYgKzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMKaW5kZXggYWYxMGFiZS4uZDk0YTFmNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCkBAIC04LDYgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9yZXN1bWUtdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KIAogI2luY2x1ZGUgPGFzbS9ydGMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwppbmRleCAxNGVlMDdlLi5jYWY5OTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBhZmNmZWY4Li42NjZmNmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS90cmFuc3BvcnRfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS90cmFuc3BvcnRfY2xhc3MuYwppbmRleCA4NDk5N2VmLi5mNmM0NTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKiB0cmFuc3BvcnQgY2xhc3MgaXMgZnJhbWVkIGVudGlyZWx5IGluIHRlcm1zIG9mIGdlbmVyaWMgZGV2aWNlcyB0bwogICogYWxsb3cgaXQgdG8gYmUgdXNlZCBieSBhbnkgcGh5c2ljYWwgSEJBIGluIHRoZSBzeXN0ZW0uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhbnNwb3J0X2NsYXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaCBiL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaAppbmRleCAzMGEzMDg1Li5mZGE1NmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvYmNtYV9wcml2YXRlLmgKKysrIGIvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oCkBAIC0xOCw2ICsxOCw5IEBACiBpbnQgX19pbml0IGJjbWFfYnVzX2Vhcmx5X3JlZ2lzdGVyKHN0cnVjdCBiY21hX2J1cyAqYnVzLAogCQkJCSAgIHN0cnVjdCBiY21hX2RldmljZSAqY29yZV9jYywKIAkJCQkgICBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmVfbWlwcyk7CisjaWZkZWYgQ09ORklHX1BNCitpbnQgYmNtYV9idXNfcmVzdW1lKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKKyNlbmRpZgogCiAvKiBzY2FuLmMgKi8KIGludCBiY21hX2J1c19zY2FuKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9jb3JlLmMgYi9kcml2ZXJzL2JjbWEvY29yZS5jCmluZGV4IDE4OWE5N2IuLjg5M2Y2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9jb3JlLmMKKysrIGIvZHJpdmVycy9iY21hL2NvcmUuYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAKIGJvb2wgYmNtYV9jb3JlX2lzX2VuYWJsZWQoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYwppbmRleCA0N2NjZTlkLi5lOWYxYjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYworKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGJjbWFfY2Nfd3JpdGUzMl9tYXNrZWQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYywgdTE2IG9mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbl9wbXUuYwppbmRleCAyOTY4ZDgwLi44MDAxNjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KIAogc3RhdGljIHUzMiBiY21hX2NoaXBjb19wbGxfcmVhZChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjLCB1MzIgb2Zmc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9wY2kuYyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMKaW5kZXggODFmM2QwYS4uNGZkZTYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9wY2kuYworKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaS5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYyBiL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCmluZGV4IGFjNGJjNjIuLjQ0M2I4M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCisrKyBiL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHZvaWQgYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpCiB7CkBAIC0yMCw0OCArMjEsNTggQEAKIAlwcl9kZWJ1ZygiU3dpdGNoZWQgdG8gY29yZTogMHglWFxuIiwgY29yZS0+aWQuaWQpOwogfQogCi1zdGF0aWMgdTggYmNtYV9ob3N0X3BjaV9yZWFkOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCisvKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCBjb3JlLiBSZXR1cm5zIGJhc2Ugb2Zmc2V0IHRoYXQgaGFzIHRvIGJlCisgKiB1c2VkLiBJdCBtYWtlcyB1c2Ugb2YgZml4ZWQgd2luZG93cyB3aGVuIHBvc3NpYmxlLiAqLworc3RhdGljIHUxNiBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQogeworCXN3aXRjaCAoY29yZS0+aWQuaWQpIHsKKwljYXNlIEJDTUFfQ09SRV9DSElQQ09NTU9OOgorCQlyZXR1cm4gMyAqIEJDTUFfQ09SRV9TSVpFOworCWNhc2UgQkNNQV9DT1JFX1BDSUU6CisJCXJldHVybiAyICogQkNNQV9DT1JFX1NJWkU7CisJfQorCiAJaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKIAkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IGJjbWFfaG9zdF9wY2lfcmVhZDgoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0KQoreworCW9mZnNldCArPSBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoY29yZSk7CiAJcmV0dXJuIGlvcmVhZDgoY29yZS0+YnVzLT5tbWlvICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHUxNiBiY21hX2hvc3RfcGNpX3JlYWQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCiB7Ci0JaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKLQkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlvZmZzZXQgKz0gYmNtYV9ob3N0X3BjaV9wcm92aWRlX2FjY2Vzc190b19jb3JlKGNvcmUpOwogCXJldHVybiBpb3JlYWQxNihjb3JlLT5idXMtPm1taW8gKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgdTMyIGJjbWFfaG9zdF9wY2lfcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKLQlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQotCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCW9mZnNldCArPSBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoY29yZSk7CiAJcmV0dXJuIGlvcmVhZDMyKGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbWFfaG9zdF9wY2lfd3JpdGU4KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCwKIAkJCQkgdTggdmFsdWUpCiB7Ci0JaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKLQkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlvZmZzZXQgKz0gYmNtYV9ob3N0X3BjaV9wcm92aWRlX2FjY2Vzc190b19jb3JlKGNvcmUpOwogCWlvd3JpdGU4KHZhbHVlLCBjb3JlLT5idXMtPm1taW8gKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgdm9pZCBiY21hX2hvc3RfcGNpX3dyaXRlMTYoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LAogCQkJCSB1MTYgdmFsdWUpCiB7Ci0JaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKLQkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlvZmZzZXQgKz0gYmNtYV9ob3N0X3BjaV9wcm92aWRlX2FjY2Vzc190b19jb3JlKGNvcmUpOwogCWlvd3JpdGUxNih2YWx1ZSwgY29yZS0+YnVzLT5tbWlvICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgYmNtYV9ob3N0X3BjaV93cml0ZTMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCwKIAkJCQkgdTMyIHZhbHVlKQogewotCWlmIChjb3JlLT5idXMtPm1hcHBlZF9jb3JlICE9IGNvcmUpCi0JCWJjbWFfaG9zdF9wY2lfc3dpdGNoX2NvcmUoY29yZSk7CisJb2Zmc2V0ICs9IGJjbWFfaG9zdF9wY2lfcHJvdmlkZV9hY2Nlc3NfdG9fY29yZShjb3JlKTsKIAlpb3dyaXRlMzIodmFsdWUsIGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldCk7CiB9CiAKQEAgLTIyMyw2ICsyMzQsNDEgQEAKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBiY21hX2hvc3RfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCS8qIEhvc3Qgc3BlY2lmaWMgKi8KKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbWFfaG9zdF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGJjbWFfYnVzICpidXMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJLyogSG9zdCBzcGVjaWZpYyAqLworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCAwKTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKworCS8qIEJ1cyBzcGVjaWZpYyAqLworCWVyciA9IGJjbWFfYnVzX3Jlc3VtZShidXMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qIENPTkZJR19QTSAqLworIyBkZWZpbmUgYmNtYV9ob3N0X3BjaV9zdXNwZW5kCU5VTEwKKyMgZGVmaW5lIGJjbWFfaG9zdF9wY2lfcmVzdW1lCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJjbWFfcGNpX2JyaWRnZV90YmwpID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDA1NzYpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDMzMSkgfSwKQEAgLTIzOCw2ICsyODQsOCBAQAogCS5pZF90YWJsZSA9IGJjbWFfcGNpX2JyaWRnZV90YmwsCiAJLnByb2JlID0gYmNtYV9ob3N0X3BjaV9wcm9iZSwKIAkucmVtb3ZlID0gYmNtYV9ob3N0X3BjaV9yZW1vdmUsCisJLnN1c3BlbmQgPSBiY21hX2hvc3RfcGNpX3N1c3BlbmQsCisJLnJlc3VtZSA9IGJjbWFfaG9zdF9wY2lfcmVzdW1lLAogfTsKIAogaW50IF9faW5pdCBiY21hX2hvc3RfcGNpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9tYWluLmMgYi9kcml2ZXJzL2JjbWEvbWFpbi5jCmluZGV4IDhjMDljM2UuLjEwZjkyYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9tYWluLmMKKysrIGIvZHJpdmVycy9iY21hL21haW4uYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC0yMzksNiArMjQwLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBiY21hX2J1c19yZXN1bWUoc3RydWN0IGJjbWFfYnVzICpidXMpCit7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOworCisJLyogSW5pdCBDQyBjb3JlICovCisJY29yZSA9IGJjbWFfZmluZF9jb3JlKGJ1cywgQkNNQV9DT1JFX0NISVBDT01NT04pOworCWlmIChjb3JlKSB7CisJCWJ1cy0+ZHJ2X2NjLnNldHVwX2RvbmUgPSBmYWxzZTsKKwkJYmNtYV9jb3JlX2NoaXBjb21tb25faW5pdCgmYnVzLT5kcnZfY2MpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKIGludCBfX2JjbWFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBiY21hX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKIHsKIAlkcnYtPmRydi5uYW1lID0gZHJ2LT5uYW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL3Nwcm9tLmMgYi9kcml2ZXJzL2JjbWEvc3Byb20uYwppbmRleCBkNzI5MjM5Li42ZjIzMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvc3Byb20uYworKysgYi9kcml2ZXJzL2JjbWEvc3Byb20uYwpAQCAtMTI5LDYgKzEyOSw5IEBACiAJdTE2IHY7CiAJaW50IGk7CiAKKwlidXMtPnNwcm9tLnJldmlzaW9uID0gc3Byb21bU1NCX1NQUk9NU0laRV9XT1JEU19SNCAtIDFdICYKKwkJU1NCX1NQUk9NX1JFVklTSU9OX1JFVjsKKwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJdiA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfSUwwTUFDKSArIGldOwogCQkqKCgoX19iZTE2ICopYnVzLT5zcHJvbS5pbDBtYWMpICsgaSkgPSBjcHVfdG9fYmUxNih2KTsKQEAgLTEzNiwxMiArMTM5LDcwIEBACiAKIAlidXMtPnNwcm9tLmJvYXJkX3JldiA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQk9BUkRSRVYpXTsKIAorCWJ1cy0+c3Byb20udHhwaWQyZ1swXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElEMkcwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQyRzApID4+IFNTQl9TUFJPTTRfVFhQSUQyRzBfU0hJRlQ7CisJYnVzLT5zcHJvbS50eHBpZDJnWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQyRzAxKV0gJgorCSAgICAgU1NCX1NQUk9NNF9UWFBJRDJHMSkgPj4gU1NCX1NQUk9NNF9UWFBJRDJHMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkMmdbMl0gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NNF9UWFBJRDJHMjMpXSAmCisJICAgICBTU0JfU1BST000X1RYUElEMkcyKSA+PiBTU0JfU1BST000X1RYUElEMkcyX1NISUZUOworCWJ1cy0+c3Byb20udHhwaWQyZ1szXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElEMkcyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQyRzMpID4+IFNTQl9TUFJPTTRfVFhQSUQyRzNfU0hJRlQ7CisKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzBdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wwKSA+PiBTU0JfU1BST000X1RYUElENUdMMF9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wxKSA+PiBTU0JfU1BST000X1RYUElENUdMMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzJdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wyKSA+PiBTU0JfU1BST000X1RYUElENUdMMl9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzNdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wzKSA+PiBTU0JfU1BST000X1RYUElENUdMM19TSElGVDsKKworCWJ1cy0+c3Byb20udHhwaWQ1Z1swXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElENUcwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1RzApID4+IFNTQl9TUFJPTTRfVFhQSUQ1RzBfU0hJRlQ7CisJYnVzLT5zcHJvbS50eHBpZDVnWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1RzAxKV0gJgorCSAgICAgU1NCX1NQUk9NNF9UWFBJRDVHMSkgPj4gU1NCX1NQUk9NNF9UWFBJRDVHMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdbMl0gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NNF9UWFBJRDVHMjMpXSAmCisJICAgICBTU0JfU1BST000X1RYUElENUcyKSA+PiBTU0JfU1BST000X1RYUElENUcyX1NISUZUOworCWJ1cy0+c3Byb20udHhwaWQ1Z1szXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElENUcyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1RzMpID4+IFNTQl9TUFJPTTRfVFhQSUQ1RzNfU0hJRlQ7CisKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzBdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gwKSA+PiBTU0JfU1BST000X1RYUElENUdIMF9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gxKSA+PiBTU0JfU1BST000X1RYUElENUdIMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzJdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gyKSA+PiBTU0JfU1BST000X1RYUElENUdIMl9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzNdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gzKSA+PiBTU0JfU1BST000X1RYUElENUdIM19TSElGVDsKKwogCWJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMTE8pXTsKIAlidXMtPnNwcm9tLmJvYXJkZmxhZ3NfaGkgPSBzcHJvbVtTUE9GRihTU0JfU1BST004X0JGTEhJKV07CiAJYnVzLT5zcHJvbS5ib2FyZGZsYWdzMl9sbyA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMMkxPKV07CiAJYnVzLT5zcHJvbS5ib2FyZGZsYWdzMl9oaSA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMMkhJKV07CiAKIAlidXMtPnNwcm9tLmNvdW50cnlfY29kZSA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQ0NPREUpXTsKKworCWJ1cy0+c3Byb20uZmVtLmdoejIudHNzaXBvcyA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTJHKV0gJgorCQlTU0JfU1JPTThfRkVNX1RTU0lQT1MpID4+IFNTQl9TUk9NOF9GRU1fVFNTSVBPU19TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHoyLmV4dHBhX2dhaW4gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NOF9GRU0yRyldICYKKwkJU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOKSA+PiBTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU5fU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6Mi5wZGV0X3JhbmdlID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRSkgPj4gU1NCX1NST004X0ZFTV9QREVUX1JBTkdFX1NISUZUOworCWJ1cy0+c3Byb20uZmVtLmdoejIudHJfaXNvID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fVFJfSVNPKSA+PiBTU0JfU1JPTThfRkVNX1RSX0lTT19TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHoyLmFudHN3bHV0ID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fQU5UU1dMVVQpID4+IFNTQl9TUk9NOF9GRU1fQU5UU1dMVVRfU0hJRlQ7CisKKwlidXMtPnNwcm9tLmZlbS5naHo1LnRzc2lwb3MgPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NOF9GRU01RyldICYKKwkJU1NCX1NST004X0ZFTV9UU1NJUE9TKSA+PiBTU0JfU1JPTThfRkVNX1RTU0lQT1NfU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6NS5leHRwYV9nYWluID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNNUcpXSAmCisJCVNTQl9TUk9NOF9GRU1fRVhUUEFfR0FJTikgPj4gU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOX1NISUZUOworCWJ1cy0+c3Byb20uZmVtLmdoejUucGRldF9yYW5nZSA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX1BERVRfUkFOR0UpID4+IFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRV9TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHo1LnRyX2lzbyA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX1RSX0lTTykgPj4gU1NCX1NST004X0ZFTV9UUl9JU09fU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6NS5hbnRzd2x1dCA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX0FOVFNXTFVUKSA+PiBTU0JfU1JPTThfRkVNX0FOVFNXTFVUX1NISUZUOwogfQogCiBpbnQgYmNtYV9zcHJvbV9nZXQoc3RydWN0IGJjbWFfYnVzICpidXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCmluZGV4IDUyOGY2MzEuLjMyMWRlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImFvZS5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGFvZWJsa19tdXRleCk7CkBAIC0xNTksNyArMTYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGFvZWJsa19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOwpAQCAtMTcyLDI1ICsxNzMsMjUgQEAKIAlpZiAoYmlvID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGJpbyBpcyBOVUxMXG4iKTsKIAkJQlVHKCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCWQgPSBiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlpZiAoZCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBiZF9kaXNrLT5wcml2YXRlX2RhdGEgaXMgTlVMTFxuIik7CiAJCUJVRygpOwogCQliaW9fZW5kaW8oYmlvLCAtRU5YSU8pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0gZWxzZSBpZiAoYmlvLT5iaV9pb192ZWMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImFvZTogYmlfaW9fdmVjIGlzIE5VTExcbiIpOwogCQlCVUcoKTsKIAkJYmlvX2VuZGlvKGJpbywgLUVOWElPKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJYnVmID0gbWVtcG9vbF9hbGxvYyhkLT5idWZwb29sLCBHRlBfTk9JTyk7CiAJaWYgKGJ1ZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFvZTogYnVmIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CiAJCWJpb19lbmRpbyhiaW8sIC1FTk9NRU0pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwogCUlOSVRfTElTVF9IRUFEKCZidWYtPmJ1ZnMpOwpAQCAtMjExLDcgKzIxMiw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJbWVtcG9vbF9mcmVlKGJ1ZiwgZC0+YnVmcG9vbCk7CiAJCWJpb19lbmRpbyhiaW8sIC1FTlhJTyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5idWZzLCAmZC0+YnVmcSk7CkBAIC0yMjIsOCArMjIzLDYgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAlhb2VuZXRfeG1pdCgmcXVldWUpOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKaW5kZXggMTQ2Mjk2Yy4uNWY4ZTM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJhb2UuaCIKIAogZW51bSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2JyZC5jIGIvZHJpdmVycy9ibG9jay9icmQuYwppbmRleCBkYmExYzMyLi5kMjIxMTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2JyZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKQEAgLTMyMyw3ICszMjMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgYnJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHZvaWQgYnJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiaW8tPmJpX2JkZXY7CiAJc3RydWN0IGJyZF9kZXZpY2UgKmJyZCA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKQEAgLTM1OSw4ICszNTksNiBAQAogCiBvdXQ6CiAJYmlvX2VuZGlvKGJpbywgZXJyKTsKLQotCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfWElQCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggOGY0ZWY2NS4uNDg2Zjk0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtNjgsNiArNjgsMTAgQEAKIG1vZHVsZV9wYXJhbShjY2lzc190YXBlX2NtZHMsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaXNzX3RhcGVfY21kcywKIAkibnVtYmVyIG9mIGNvbW1hbmRzIHRvIGFsbG9jYXRlIGZvciB0YXBlIGRldmljZXMgKGRlZmF1bHQ6IDYpIik7CitzdGF0aWMgaW50IGNjaXNzX3NpbXBsZV9tb2RlOworbW9kdWxlX3BhcmFtKGNjaXNzX3NpbXBsZV9tb2RlLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGNjaXNzX3NpbXBsZV9tb2RlLAorCSJVc2UgJ3NpbXBsZSBtb2RlJyByYXRoZXIgdGhhbiAncGVyZm9ybWFudCBtb2RlJyIpOwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNjaXNzX211dGV4KTsKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfY2Npc3M7CkBAIC0xNzYsNiArMTgwLDcgQEAKIAkJCXVuc2lnbmVkIGludCBibG9ja19zaXplLCBJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmLAogCQkJCSAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnYpOwogc3RhdGljIHZvaWQgX19kZXZpbml0IGNjaXNzX2ludGVycnVwdF9tb2RlKGN0bHJfaW5mb190ICopOworc3RhdGljIGludCBfX2RldmluaXQgY2Npc3NfZW50ZXJfc2ltcGxlX21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgdm9pZCBzdGFydF9pbyhjdGxyX2luZm9fdCAqaCk7CiBzdGF0aWMgaW50IHNlbmRjbWRfd2l0aGlycShjdGxyX2luZm9fdCAqaCwgX191OCBjbWQsIHZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLAogCQkJX191OCBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sCkBAIC0zODgsNyArMzkzLDcgQEAKIAkJaC0+cHJvZHVjdF9uYW1lLAogCQkodW5zaWduZWQgbG9uZyloLT5ib2FyZF9pZCwKIAkJaC0+ZmlybV92ZXJbMF0sIGgtPmZpcm1fdmVyWzFdLCBoLT5maXJtX3ZlclsyXSwKLQkJaC0+ZmlybV92ZXJbM10sICh1bnNpZ25lZCBpbnQpaC0+aW50cltQRVJGX01PREVfSU5UXSwKKwkJaC0+ZmlybV92ZXJbM10sICh1bnNpZ25lZCBpbnQpaC0+aW50cltoLT5pbnRyX21vZGVdLAogCQloLT5udW1fbHVucywKIAkJaC0+UWRlcHRoLCBoLT5jb21tYW5kc19vdXRzdGFuZGluZywKIAkJaC0+bWF4UXNpbmNlaW5pdCwgaC0+bWF4X291dHN0YW5kaW5nLCBoLT5tYXhTRyk7CkBAIC02MzYsNiArNjQxLDE4IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIocmVzY2FuLCBTX0lXVVNSLCBOVUxMLCBob3N0X3N0b3JlX3Jlc2Nhbik7CiAKK3N0YXRpYyBzc2l6ZV90IGhvc3Rfc2hvd190cmFuc3BvcnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHRvX2hiYShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMjAsICIlc1xuIiwKKwkJaC0+dHJhbnNNZXRob2QgJiBDRkdUQkxfVHJhbnNfUGVyZm9ybWFudCA/CisJCQkicGVyZm9ybWFudCIgOiAic2ltcGxlIik7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodHJhbnNwb3J0X21vZGUsIFNfSVJVR08sIGhvc3Rfc2hvd190cmFuc3BvcnRfbW9kZSwgTlVMTCk7CisKIHN0YXRpYyBzc2l6ZV90IGRldl9zaG93X3VuaXF1ZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSBjaGFyICpidWYpCkBAIC04MDgsNiArODI1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjY2lzc19ob3N0X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3Jlc2Nhbi5hdHRyLAogCSZkZXZfYXR0cl9yZXNldHRhYmxlLmF0dHIsCisJJmRldl9hdHRyX3RyYW5zcG9ydF9tb2RlLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtMzk4NCw2ICs0MDAyLDkgQEAKIHsKIAlfX3UzMiB0cmFuc19zdXBwb3J0OwogCisJaWYgKGNjaXNzX3NpbXBsZV9tb2RlKQorCQlyZXR1cm47CisKIAlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICJUcnlpbmcgdG8gcHV0IGJvYXJkIGludG8gUGVyZm9ybWFudCBtb2RlXG4iKTsKIAkvKiBBdHRlbXB0IHRvIHB1dCBjb250cm9sbGVyIGludG8gcGVyZm9ybWFudCBtb2RlIGlmIHN1cHBvcnRlZCAqLwogCS8qIERvZXMgYm9hcmQgc3VwcG9ydCBwZXJmb3JtYW50IG1vZGU/ICovCkBAIC00MDgxLDcgKzQxMDIsNyBAQAogZGVmYXVsdF9pbnRfbW9kZToKICNlbmRpZgkJCQkvKiBDT05GSUdfUENJX01TSSAqLwogCS8qIGlmIHdlIGdldCBoZXJlIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbW9kZSAqLwotCWgtPmludHJbUEVSRl9NT0RFX0lOVF0gPSBoLT5wZGV2LT5pcnE7CisJaC0+aW50cltoLT5pbnRyX21vZGVdID0gaC0+cGRldi0+aXJxOwogCXJldHVybjsKIH0KIApAQCAtNDM0MSw2ICs0MzYyLDkgQEAKIAl9CiAJY2Npc3NfZW5hYmxlX3Njc2lfcHJlZmV0Y2goaCk7CiAJY2Npc3NfcDYwMF9kbWFfcHJlZmV0Y2hfcXVpcmsoaCk7CisJZXJyID0gY2Npc3NfZW50ZXJfc2ltcGxlX21vZGUoaCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwogCWNjaXNzX3B1dF9jb250cm9sbGVyX2ludG9fcGVyZm9ybWFudF9tb2RlKGgpOwogCXJldHVybiAwOwogCkBAIC00NTMzLDYgKzQ1NTcsMTMgQEAKIAkJcG1jc3IgJj0gflBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CiAJCXBtY3NyIHw9IFBDSV9EMDsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCBwbWNzcik7CisKKwkJLyoKKwkJICogVGhlIFA2MDAgcmVxdWlyZXMgYSBzbWFsbCBkZWxheSB3aGVuIGNoYW5naW5nIHN0YXRlcy4KKwkJICogT3RoZXJ3aXNlIHdlIG1heSB0aGluayB0aGUgYm9hcmQgZGlkIG5vdCByZXNldCBhbmQgd2UgYmFpbC4KKwkJICogVGhpcyBmb3Iga2R1bXAgb25seSBhbmQgaXMgcGFydGljdWxhciB0byB0aGUgUDYwMC4KKwkJICovCisJCW1zbGVlcCg1MDApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ4NDMsMjAgKzQ4NzQsMjAgQEAKIAlpcnFyZXR1cm5fdCAoKmludHhoYW5kbGVyKShpbnQsIHZvaWQgKikpCiB7CiAJaWYgKGgtPm1zaXhfdmVjdG9yIHx8IGgtPm1zaV92ZWN0b3IpIHsKLQkJaWYgKCFyZXF1ZXN0X2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBtc2l4aGFuZGxlciwKKwkJaWYgKCFyZXF1ZXN0X2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIG1zaXhoYW5kbGVyLAogCQkJCUlSUUZfRElTQUJMRUQsIGgtPmRldm5hbWUsIGgpKQogCQkJcmV0dXJuIDA7CiAJCWRldl9lcnIoJmgtPnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgbXNpIGlycSAlZCIKLQkJCSIgZm9yICVzXG4iLCBoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLAorCQkJIiBmb3IgJXNcbiIsIGgtPmludHJbaC0+aW50cl9tb2RlXSwKIAkJCWgtPmRldm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBpbnR4aGFuZGxlciwKKwlpZiAoIXJlcXVlc3RfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwgaW50eGhhbmRsZXIsCiAJCQlJUlFGX0RJU0FCTEVELCBoLT5kZXZuYW1lLCBoKSkKIAkJcmV0dXJuIDA7CiAJZGV2X2VycigmaC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBpcnEgJWQgZm9yICVzXG4iLAotCQloLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoLT5kZXZuYW1lKTsKKwkJaC0+aW50cltoLT5pbnRyX21vZGVdLCBoLT5kZXZuYW1lKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQ4ODcsNyArNDkxOCw3IEBACiB7CiAJaW50IGN0bHIgPSBoLT5jdGxyOwogCi0JZnJlZV9pcnEoaC0+aW50cltQRVJGX01PREVfSU5UXSwgaCk7CisJZnJlZV9pcnEoaC0+aW50cltoLT5pbnRyX21vZGVdLCBoKTsKICNpZmRlZiBDT05GSUdfUENJX01TSQogCWlmIChoLT5tc2l4X3ZlY3RvcikKIAkJcGNpX2Rpc2FibGVfbXNpeChoLT5wZGV2KTsKQEAgLTQ5NTMsNiArNDk4NCw3IEBACiAJaCA9IGhiYVtpXTsKIAloLT5wZGV2ID0gcGRldjsKIAloLT5idXN5X2luaXRpYWxpemluZyA9IDE7CisJaC0+aW50cl9tb2RlID0gY2Npc3Nfc2ltcGxlX21vZGUgPyBTSU1QTEVfTU9ERV9JTlQgOiBQRVJGX01PREVfSU5UOwogCUlOSVRfTElTVF9IRUFEKCZoLT5jbXBRKTsKIAlJTklUX0xJU1RfSEVBRCgmaC0+cmVxUSk7CiAJbXV0ZXhfaW5pdCgmaC0+YnVzeV9zaHV0dGluZ19kb3duKTsKQEAgLTUwMDksNyArNTA0MSw3IEBACiAKIAlkZXZfaW5mbygmaC0+cGRldi0+ZGV2LCAiJXM6IDwweCV4PiBhdCBQQ0kgJXMgSVJRICVkJXMgdXNpbmcgREFDXG4iLAogCSAgICAgICBoLT5kZXZuYW1lLCBwZGV2LT5kZXZpY2UsIHBjaV9uYW1lKHBkZXYpLAotCSAgICAgICBoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBkYWMgPyAiIiA6ICIgbm90Iik7CisJICAgICAgIGgtPmludHJbaC0+aW50cl9tb2RlXSwgZGFjID8gIiIgOiAiIG5vdCIpOwogCiAJaWYgKGNjaXNzX2FsbG9jYXRlX2NtZF9wb29sKGgpKQogCQlnb3RvIGNsZWFuNDsKQEAgLTUwNTYsNyArNTA4OCw3IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CiAJCWgtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGgsIENDSVNTX0lOVFJfT0ZGKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOwotCQlmcmVlX2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoKTsKKwkJZnJlZV9pcnEoaC0+aW50cltoLT5pbnRyX21vZGVdLCBoKTsKIAkJcmMgPSBjY2lzc19yZXF1ZXN0X2lycShoLCBjY2lzc19tc2l4X2Rpc2NhcmRfY29tcGxldGlvbnMsCiAJCQkJCWNjaXNzX2ludHhfZGlzY2FyZF9jb21wbGV0aW9ucyk7CiAJCWlmIChyYykgewpAQCAtNTEzMyw3ICs1MTY1LDcgQEAKIAljY2lzc19mcmVlX2NtZF9wb29sKGgpOwogCWNjaXNzX2ZyZWVfc2NhdHRlcmxpc3RzKGgpOwogCWNjaXNzX2ZyZWVfc2dfY2hhaW5fYmxvY2tzKGgtPmNtZF9zZ19saXN0LCBoLT5ucl9jbWRzKTsKLQlmcmVlX2lycShoLT5pbnRyW1BFUkZfTU9ERV9JTlRdLCBoKTsKKwlmcmVlX2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIGgpOwogY2xlYW4yOgogCXVucmVnaXN0ZXJfYmxrZGV2KGgtPm1ham9yLCBoLT5kZXZuYW1lKTsKIGNsZWFuMToKQEAgLTUxNzIsOSArNTIwNCwzMSBAQAogCWlmIChyZXR1cm5fY29kZSAhPSBJT19PSykKIAkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIkVycm9yIGZsdXNoaW5nIGNhY2hlXG4iKTsKIAloLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhoLCBDQ0lTU19JTlRSX09GRik7Ci0JZnJlZV9pcnEoaC0+aW50cltQRVJGX01PREVfSU5UXSwgaCk7CisJZnJlZV9pcnEoaC0+aW50cltoLT5pbnRyX21vZGVdLCBoKTsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgY2Npc3NfZW50ZXJfc2ltcGxlX21vZGUoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwl1MzIgdHJhbnNfc3VwcG9ydDsKKworCXRyYW5zX3N1cHBvcnQgPSByZWFkbCgmKGgtPmNmZ3RhYmxlLT5UcmFuc3BvcnRTdXBwb3J0KSk7CisJaWYgKCEodHJhbnNfc3VwcG9ydCAmIFNJTVBMRV9NT0RFKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWgtPm1heF9jb21tYW5kcyA9IHJlYWRsKCYoaC0+Y2ZndGFibGUtPkNtZHNPdXRNYXgpKTsKKwl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgJihoLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgaC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCWNjaXNzX3dhaXRfZm9yX21vZGVfY2hhbmdlX2FjayhoKTsKKwlwcmludF9jZmdfdGFibGUoaCk7CisJaWYgKCEocmVhZGwoJihoLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkgeworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIHNpbXBsZSBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWgtPnRyYW5zTWV0aG9kID0gQ0ZHVEJMX1RyYW5zX1NpbXBsZTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2Npc3NfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAljdGxyX2luZm9fdCAqaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaCBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaAppbmRleCBjMDQ5NTQ4Li43ZmRhMzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCkBAIC05Miw2ICs5Miw3IEBACiAJdW5zaWduZWQgaW50IGludHJbNF07CiAJdW5zaWduZWQgaW50IG1zaXhfdmVjdG9yOwogCXVuc2lnbmVkIGludCBtc2lfdmVjdG9yOworCWludAlpbnRyX21vZGU7CiAJaW50IAljY2lzc19tYXhfc2VjdG9yczsKIAlCWVRFCWNjaXNzX3JlYWQ7CiAJQllURQljY2lzc193cml0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwppbmRleCBiMmZjZWI1Li45MTI1YmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKKysrIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCkBAIC02MjAsNiArNjIwLDcgQEAKIAl9CiAJdmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOwogCWRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKKwlyZXZpc2lvbiAgPSBwZGV2LT5yZXZpc2lvbjsKIAlpcnEgPSBwZGV2LT5pcnE7CiAKIAlmb3IoaT0wOyBpPDY7IGkrKykKQEAgLTYzMiw3ICs2MzMsNiBAQAogCX0KIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZjYWNoZV9saW5lX3NpemUpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0ZW5jeV90aW1lcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX2ludC5oIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmgKaW5kZXggMTcwNmQ2MC4uOWNmMjAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmgKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmgKQEAgLTE1MDYsNyArMTUwNiw3IEBACiBleHRlcm4gaW50IHByb2NfZGV0YWlsczsKIAogLyogZHJiZF9yZXEgKi8KLWV4dGVybiBpbnQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CitleHRlcm4gdm9pZCBkcmJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKIGV4dGVybiBpbnQgZHJiZF9yZWFkX3JlbW90ZShzdHJ1Y3QgZHJiZF9jb25mICptZGV2LCBzdHJ1Y3QgZHJiZF9yZXF1ZXN0ICpyZXEpOwogZXh0ZXJuIGludCBkcmJkX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBidmVjX21lcmdlX2RhdGEgKmJ2bSwgc3RydWN0IGJpb192ZWMgKmJ2ZWMpOwogZXh0ZXJuIGludCBpc192YWxpZF9hcl9oYW5kbGUoc3RydWN0IGRyYmRfcmVxdWVzdCAqLCBzZWN0b3JfdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZXEuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jCmluZGV4IDM0MjRkNjcuLjRhMGYzMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX3JlcS5jCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3ZvaWQgZHJiZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAl1bnNpZ25lZCBpbnQgc19lbnIsIGVfZW5yOwogCXN0cnVjdCBkcmJkX2NvbmYgKm1kZXYgPSAoc3RydWN0IGRyYmRfY29uZiAqKSBxLT5xdWV1ZWRhdGE7CkBAIC0xMDgxLDcgKzEwODEsNyBAQAogCiAJaWYgKGRyYmRfZmFpbF9yZXF1ZXN0X2Vhcmx5KG1kZXYsIGJpb19kYXRhX2RpcihiaW8pICYgV1JJVEUpKSB7CiAJCWJpb19lbmRpbyhiaW8sIC1FUEVSTSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJc3RhcnRfdGltZSA9IGppZmZpZXM7CkBAIC0xMTAwLDcgKzExMDAsOCBAQAogCiAJaWYgKGxpa2VseShzX2VuciA9PSBlX2VucikpIHsKIAkJaW5jX2FwX2JpbyhtZGV2LCAxKTsKLQkJcmV0dXJuIGRyYmRfbWFrZV9yZXF1ZXN0X2NvbW1vbihtZGV2LCBiaW8sIHN0YXJ0X3RpbWUpOworCQlkcmJkX21ha2VfcmVxdWVzdF9jb21tb24obWRldiwgYmlvLCBzdGFydF90aW1lKTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIGNhbiB0aGlzIGJpbyBiZSBzcGxpdCBnZW5lcmljYWxseT8KQEAgLTExNDgsNyArMTE0OSw2IEBACiAKIAkJYmlvX3BhaXJfcmVsZWFzZShicCk7CiAJfQotCXJldHVybiAwOwogfQogCiAvKiBUaGlzIGlzIGNhbGxlZCBieSBiaW9fYWRkX3BhZ2UoKS4gIFdpdGggdGhpcyBmdW5jdGlvbiB3ZSByZWR1Y2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggNDcyMGM3YS4uM2Q4MDY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTc2LDYgKzc2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zcGxpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KKwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIHN0YXRpYyBERUZJTkVfSURSKGxvb3BfaW5kZXhfaWRyKTsKQEAgLTIwMyw3NCArMjA1LDYgQEAKIH0KIAogLyoqCi0gKiBkb19sb19zZW5kX2FvcHMgLSBoZWxwZXIgZm9yIHdyaXRpbmcgZGF0YSB0byBhIGxvb3AgZGV2aWNlCi0gKgotICogVGhpcyBpcyB0aGUgZmFzdCB2ZXJzaW9uIGZvciBiYWNraW5nIGZpbGVzeXN0ZW1zIHdoaWNoIGltcGxlbWVudCB0aGUgYWRkcmVzcwotICogc3BhY2Ugb3BlcmF0aW9ucyB3cml0ZV9iZWdpbiBhbmQgd3JpdGVfZW5kLgotICovCi1zdGF0aWMgaW50IGRvX2xvX3NlbmRfYW9wcyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKLQkJbG9mZl90IHBvcywgc3RydWN0IHBhZ2UgKnVudXNlZCkKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7IC8qIGt1ZG9zIHRvIE5Gc2NraW5nUyAqLwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwotCXBnb2ZmX3QgaW5kZXg7Ci0JdW5zaWduZWQgb2Zmc2V0LCBidl9vZmZzOwotCWludCBsZW4sIHJldDsKLQotCW11dGV4X2xvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwotCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0Jb2Zmc2V0ID0gcG9zICYgKChwZ29mZl90KVBBR0VfQ0FDSEVfU0laRSAtIDEpOwotCWJ2X29mZnMgPSBidmVjLT5idl9vZmZzZXQ7Ci0JbGVuID0gYnZlYy0+YnZfbGVuOwotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCXNlY3Rvcl90IElWOwotCQl1bnNpZ25lZCBzaXplLCBjb3BpZWQ7Ci0JCWludCB0cmFuc2Zlcl9yZXN1bHQ7Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCQl2b2lkICpmc2RhdGE7Ci0KLQkJSVYgPSAoKHNlY3Rvcl90KWluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpKyhvZmZzZXQgPj4gOSk7Ci0JCXNpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7Ci0JCWlmIChzaXplID4gbGVuKQotCQkJc2l6ZSA9IGxlbjsKLQotCQlyZXQgPSBwYWdlY2FjaGVfd3JpdGVfYmVnaW4oZmlsZSwgbWFwcGluZywgcG9zLCBzaXplLCAwLAotCQkJCQkJCSZwYWdlLCAmZnNkYXRhKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZmFpbDsKLQotCQlmaWxlX3VwZGF0ZV90aW1lKGZpbGUpOwotCi0JCXRyYW5zZmVyX3Jlc3VsdCA9IGxvX2RvX3RyYW5zZmVyKGxvLCBXUklURSwgcGFnZSwgb2Zmc2V0LAotCQkJCWJ2ZWMtPmJ2X3BhZ2UsIGJ2X29mZnMsIHNpemUsIElWKTsKLQkJY29waWVkID0gc2l6ZTsKLQkJaWYgKHVubGlrZWx5KHRyYW5zZmVyX3Jlc3VsdCkpCi0JCQljb3BpZWQgPSAwOwotCi0JCXJldCA9IHBhZ2VjYWNoZV93cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBzaXplLCBjb3BpZWQsCi0JCQkJCQkJcGFnZSwgZnNkYXRhKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IGNvcGllZCkKLQkJCWdvdG8gZmFpbDsKLQotCQlpZiAodW5saWtlbHkodHJhbnNmZXJfcmVzdWx0KSkKLQkJCWdvdG8gZmFpbDsKLQotCQlidl9vZmZzICs9IGNvcGllZDsKLQkJbGVuIC09IGNvcGllZDsKLQkJb2Zmc2V0ID0gMDsKLQkJaW5kZXgrKzsKLQkJcG9zICs9IGNvcGllZDsKLQl9Ci0JcmV0ID0gMDsKLW91dDoKLQltdXRleF91bmxvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci1mYWlsOgotCXJldCA9IC0xOwotCWdvdG8gb3V0OwotfQotCi0vKioKICAqIF9fZG9fbG9fc2VuZF93cml0ZSAtIGhlbHBlciBmb3Igd3JpdGluZyBkYXRhIHRvIGEgbG9vcCBkZXZpY2UKICAqCiAgKiBUaGlzIGhlbHBlciBqdXN0IGZhY3RvcnMgb3V0IGNvbW1vbiBjb2RlIGJldHdlZW4gZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGUoKQpAQCAtMjk3LDEwICsyMzEsOCBAQAogLyoqCiAgKiBkb19sb19zZW5kX2RpcmVjdF93cml0ZSAtIGhlbHBlciBmb3Igd3JpdGluZyBkYXRhIHRvIGEgbG9vcCBkZXZpY2UKICAqCi0gKiBUaGlzIGlzIHRoZSBmYXN0LCBub24tdHJhbnNmb3JtaW5nIHZlcnNpb24gZm9yIGJhY2tpbmcgZmlsZXN5c3RlbXMgd2hpY2ggZG8KLSAqIG5vdCBpbXBsZW1lbnQgdGhlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyB3cml0ZV9iZWdpbiBhbmQgd3JpdGVfZW5kLgotICogSXQgdXNlcyB0aGUgd3JpdGUgZmlsZSBvcGVyYXRpb24gd2hpY2ggc2hvdWxkIGJlIHByZXNlbnQgb24gYWxsIHdyaXRlYWJsZQotICogZmlsZXN5c3RlbXMuCisgKiBUaGlzIGlzIHRoZSBmYXN0LCBub24tdHJhbnNmb3JtaW5nIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBuZWVkIGRvdWJsZQorICogYnVmZmVyaW5nLgogICovCiBzdGF0aWMgaW50IGRvX2xvX3NlbmRfZGlyZWN0X3dyaXRlKHN0cnVjdCBsb29wX2RldmljZSAqbG8sCiAJCXN0cnVjdCBiaW9fdmVjICpidmVjLCBsb2ZmX3QgcG9zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTMxNiwxNSArMjQ4LDkgQEAKIC8qKgogICogZG9fbG9fc2VuZF93cml0ZSAtIGhlbHBlciBmb3Igd3JpdGluZyBkYXRhIHRvIGEgbG9vcCBkZXZpY2UKICAqCi0gKiBUaGlzIGlzIHRoZSBzbG93LCB0cmFuc2Zvcm1pbmcgdmVyc2lvbiBmb3IgZmlsZXN5c3RlbXMgd2hpY2ggZG8gbm90Ci0gKiBpbXBsZW1lbnQgdGhlIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyB3cml0ZV9iZWdpbiBhbmQgd3JpdGVfZW5kLiAgSXQKLSAqIHVzZXMgdGhlIHdyaXRlIGZpbGUgb3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50IG9uIGFsbCB3cml0ZWFibGUKLSAqIGZpbGVzeXN0ZW1zLgotICoKLSAqIFVzaW5nIGZvcHMtPndyaXRlIGlzIHNsb3dlciB0aGFuIHVzaW5nIGFvcHMtPntwcmVwYXJlLGNvbW1pdH1fd3JpdGUgaW4gdGhlCi0gKiB0cmFuc2Zvcm1pbmcgY2FzZSBiZWNhdXNlIHdlIG5lZWQgdG8gZG91YmxlIGJ1ZmZlciB0aGUgZGF0YSBhcyB3ZSBjYW5ub3QgZG8KLSAqIHRoZSB0cmFuc2Zvcm1hdGlvbnMgaW4gcGxhY2UgYXMgd2UgZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUKLSAqIGRlc3RpbmF0aW9uIHBhZ2VzIG9mIHRoZSBiYWNraW5nIGZpbGUuCisgKiBUaGlzIGlzIHRoZSBzbG93LCB0cmFuc2Zvcm1pbmcgdmVyc2lvbiB0aGF0IG5lZWRzIHRvIGRvdWJsZSBidWZmZXIgdGhlCisgKiBkYXRhIGFzIGl0IGNhbm5vdCBkbyB0aGUgdHJhbnNmb3JtYXRpb25zIGluIHBsYWNlIHdpdGhvdXQgaGF2aW5nIGRpcmVjdAorICogYWNjZXNzIHRvIHRoZSBkZXN0aW5hdGlvbiBwYWdlcyBvZiB0aGUgYmFja2luZyBmaWxlLgogICovCiBzdGF0aWMgaW50IGRvX2xvX3NlbmRfd3JpdGUoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCiAJCWxvZmZfdCBwb3MsIHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMzUwLDE3ICsyNzYsMTYgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJaW50IGksIHJldCA9IDA7CiAKLQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF9hb3BzOwotCWlmICghKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSkgeworCWlmIChsby0+dHJhbnNmZXIgIT0gdHJhbnNmZXJfbm9uZSkgeworCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0pOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKQorCQkJZ290byBmYWlsOworCQlrbWFwKHBhZ2UpOworCQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF93cml0ZTsKKwl9IGVsc2UgewogCQlkb19sb19zZW5kID0gZG9fbG9fc2VuZF9kaXJlY3Rfd3JpdGU7Ci0JCWlmIChsby0+dHJhbnNmZXIgIT0gdHJhbnNmZXJfbm9uZSkgewotCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PSU8gfCBfX0dGUF9ISUdITUVNKTsKLQkJCWlmICh1bmxpa2VseSghcGFnZSkpCi0JCQkJZ290byBmYWlsOwotCQkJa21hcChwYWdlKTsKLQkJCWRvX2xvX3NlbmQgPSBkb19sb19zZW5kX3dyaXRlOwotCQl9CiAJfQorCiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CiAJCXJldCA9IGRvX2xvX3NlbmQobG8sIGJ2ZWMsIHBvcywgcGFnZSk7CiAJCWlmIChyZXQgPCAwKQpAQCAtNDg0LDYgKzQwOSwyOSBAQAogCQkJfQogCQl9CiAKKwkJLyoKKwkJICogV2UgdXNlIHB1bmNoIGhvbGUgdG8gcmVjbGFpbSB0aGUgZnJlZSBzcGFjZSB1c2VkIGJ5IHRoZQorCQkgKiBpbWFnZSBhLmsuYS4gZGlzY2FyZC4gSG93ZXZlciB3ZSBkbyBzdXBwb3J0IGRpc2NhcmQgaWYKKwkJICogZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBiZWNhdXNlIGl0IG1heSBnaXZlIGFuIGF0dGFja2VyCisJCSAqIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKwkJICovCisJCWlmIChiaW8tPmJpX3J3ICYgUkVRX0RJU0NBUkQpIHsKKwkJCXN0cnVjdCBmaWxlICpmaWxlID0gbG8tPmxvX2JhY2tpbmdfZmlsZTsKKwkJCWludCBtb2RlID0gRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpFOworCisJCQlpZiAoKCFmaWxlLT5mX29wLT5mYWxsb2NhdGUpIHx8CisJCQkgICAgbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGZpbGUtPmZfb3AtPmZhbGxvY2F0ZShmaWxlLCBtb2RlLCBwb3MsCisJCQkJCQkgICAgYmlvLT5iaV9zaXplKTsKKwkJCWlmICh1bmxpa2VseShyZXQgJiYgcmV0ICE9IC1FSU5WQUwgJiYKKwkJCQkgICAgIHJldCAhPSAtRU9QTk9UU1VQUCkpCisJCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJcmV0ID0gbG9fc2VuZChsbywgYmlvLCBwb3MpOwogCiAJCWlmICgoYmlvLT5iaV9ydyAmIFJFUV9GVUEpICYmICFyZXQpIHsKQEAgLTUxNCw3ICs0NjIsNyBAQAogCXJldHVybiBiaW9fbGlzdF9wb3AoJmxvLT5sb19iaW9fbGlzdCk7CiB9CiAKLXN0YXRpYyBpbnQgbG9vcF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKm9sZF9iaW8pCitzdGF0aWMgdm9pZCBsb29wX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqb2xkX2JpbykKIHsKIAlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gcS0+cXVldWVkYXRhOwogCWludCBydyA9IGJpb19ydyhvbGRfYmlvKTsKQEAgLTUzMiwxMiArNDgwLDExIEBACiAJbG9vcF9hZGRfYmlvKGxvLCBvbGRfYmlvKTsKIAl3YWtlX3VwKCZsby0+bG9fZXZlbnQpOwogCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwotCXJldHVybiAwOworCXJldHVybjsKIAogb3V0OgogCXNwaW5fdW5sb2NrX2lycSgmbG8tPmxvX2xvY2spOwogCWJpb19pb19lcnJvcihvbGRfYmlvKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHN3aXRjaF9yZXF1ZXN0IHsKQEAgLTcwMCw3ICs2NDcsNyBAQAogCQlnb3RvIG91dF9wdXRmOwogCiAJZnB1dChvbGRfZmlsZSk7Ci0JaWYgKG1heF9wYXJ0ID4gMCkKKwlpZiAobG8tPmxvX2ZsYWdzICYgTE9fRkxBR1NfUEFSVFNDQU4pCiAJCWlvY3RsX2J5X2JkZXYoYmRldiwgQkxLUlJQQVJULCAwKTsKIAlyZXR1cm4gMDsKIApAQCAtNzc3LDE2ICs3MjQsMjUgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgYXV0b2NsZWFyID8gIjEiIDogIjAiKTsKIH0KIAorc3RhdGljIHNzaXplX3QgbG9vcF9hdHRyX3BhcnRzY2FuX3Nob3coc3RydWN0IGxvb3BfZGV2aWNlICpsbywgY2hhciAqYnVmKQoreworCWludCBwYXJ0c2NhbiA9IChsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19QQVJUU0NBTik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcGFydHNjYW4gPyAiMSIgOiAiMCIpOworfQorCiBMT09QX0FUVFJfUk8oYmFja2luZ19maWxlKTsKIExPT1BfQVRUUl9STyhvZmZzZXQpOwogTE9PUF9BVFRSX1JPKHNpemVsaW1pdCk7CiBMT09QX0FUVFJfUk8oYXV0b2NsZWFyKTsKK0xPT1BfQVRUUl9STyhwYXJ0c2Nhbik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsb29wX2F0dHJzW10gPSB7CiAJJmxvb3BfYXR0cl9iYWNraW5nX2ZpbGUuYXR0ciwKIAkmbG9vcF9hdHRyX29mZnNldC5hdHRyLAogCSZsb29wX2F0dHJfc2l6ZWxpbWl0LmF0dHIsCiAJJmxvb3BfYXR0cl9hdXRvY2xlYXIuYXR0ciwKKwkmbG9vcF9hdHRyX3BhcnRzY2FuLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTgwNyw2ICs3NjMsMzUgQEAKIAkJCSAgICZsb29wX2F0dHJpYnV0ZV9ncm91cCk7CiB9CiAKK3N0YXRpYyB2b2lkIGxvb3BfY29uZmlnX2Rpc2NhcmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGxvLT5sb19xdWV1ZTsKKworCS8qCisJICogV2UgdXNlIHB1bmNoIGhvbGUgdG8gcmVjbGFpbSB0aGUgZnJlZSBzcGFjZSB1c2VkIGJ5IHRoZQorCSAqIGltYWdlIGEuay5hLiBkaXNjYXJkLiBIb3dldmVyIHdlIGRvIHN1cHBvcnQgZGlzY2FyZCBpZgorCSAqIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgYmVjYXVzZSBpdCBtYXkgZ2l2ZSBhbiBhdHRhY2tlcgorCSAqIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpZiAoKCFmaWxlLT5mX29wLT5mYWxsb2NhdGUpIHx8CisJICAgIGxvLT5sb19lbmNyeXB0X2tleV9zaXplKSB7CisJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gMDsKKwkJcS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50ID0gMDsKKwkJcS0+bGltaXRzLm1heF9kaXNjYXJkX3NlY3RvcnMgPSAwOworCQlxLT5saW1pdHMuZGlzY2FyZF96ZXJvZXNfZGF0YSA9IDA7CisJCXF1ZXVlX2ZsYWdfY2xlYXJfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBxKTsKKwkJcmV0dXJuOworCX0KKworCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycyA9IFVJTlRfTUFYID4+IDk7CisJcS0+bGltaXRzLmRpc2NhcmRfemVyb2VzX2RhdGEgPSAxOworCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgcSk7Cit9CisKIHN0YXRpYyBpbnQgbG9vcF9zZXRfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgZm1vZGVfdCBtb2RlLAogCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGFyZykKIHsKQEAgLTg0OSwzNiArODM0LDI0IEBACiAJbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKIAlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAKLQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1JFQURfT05MWTsKLQogCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7Ci0JCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgKmFvcHMgPSBtYXBwaW5nLT5hX29wczsKLQotCQlpZiAoYW9wcy0+d3JpdGVfYmVnaW4pCi0JCQlsb19mbGFncyB8PSBMT19GTEFHU19VU0VfQU9QUzsKLQkJaWYgKCEobG9fZmxhZ3MgJiBMT19GTEFHU19VU0VfQU9QUykgJiYgIWZpbGUtPmZfb3AtPndyaXRlKQotCQkJbG9fZmxhZ3MgfD0gTE9fRkxBR1NfUkVBRF9PTkxZOwotCi0JCWxvX2Jsb2Nrc2l6ZSA9IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgPwotCQkJaW5vZGUtPmlfYmRldi0+YmRfYmxvY2tfc2l6ZSA6IFBBR0VfU0laRTsKLQotCQllcnJvciA9IDA7Ci0JfSBlbHNlIHsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0X3B1dGY7Ci0JfQogCi0Jc2l6ZSA9IGdldF9sb29wX3NpemUobG8sIGZpbGUpOwotCi0JaWYgKChsb2ZmX3QpKHNlY3Rvcl90KXNpemUgIT0gc2l6ZSkgewotCQllcnJvciA9IC1FRkJJRzsKLQkJZ290byBvdXRfcHV0ZjsKLQl9Ci0KLQlpZiAoIShtb2RlICYgRk1PREVfV1JJVEUpKQorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB8fCAhKG1vZGUgJiBGTU9ERV9XUklURSkgfHwKKwkgICAgIWZpbGUtPmZfb3AtPndyaXRlKQogCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CiAKKwlsb19ibG9ja3NpemUgPSBTX0lTQkxLKGlub2RlLT5pX21vZGUpID8KKwkJaW5vZGUtPmlfYmRldi0+YmRfYmxvY2tfc2l6ZSA6IFBBR0VfU0laRTsKKworCWVycm9yID0gLUVGQklHOworCXNpemUgPSBnZXRfbG9vcF9zaXplKGxvLCBmaWxlKTsKKwlpZiAoKGxvZmZfdCkoc2VjdG9yX3Qpc2l6ZSAhPSBzaXplKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSAwOworCiAJc2V0X2RldmljZV9ybyhiZGV2LCAobG9fZmxhZ3MgJiBMT19GTEFHU19SRUFEX09OTFkpICE9IDApOwogCiAJbG8tPmxvX2Jsb2Nrc2l6ZSA9IGxvX2Jsb2Nrc2l6ZTsKQEAgLTkxOSw3ICs4OTIsOSBAQAogCX0KIAlsby0+bG9fc3RhdGUgPSBMb19ib3VuZDsKIAl3YWtlX3VwX3Byb2Nlc3MobG8tPmxvX3RocmVhZCk7Ci0JaWYgKG1heF9wYXJ0ID4gMCkKKwlpZiAocGFydF9zaGlmdCkKKwkJbG8tPmxvX2ZsYWdzIHw9IExPX0ZMQUdTX1BBUlRTQ0FOOworCWlmIChsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19QQVJUU0NBTikKIAkJaW9jdGxfYnlfYmRldihiZGV2LCBCTEtSUlBBUlQsIDApOwogCXJldHVybiAwOwogCkBAIC05ODAsMTAgKzk1NSwxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbG9vcF9jbHJfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3N0YXRpYyBpbnQgbG9vcF9jbHJfZmQoc3RydWN0IGxvb3BfZGV2aWNlICpsbykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CiAJZ2ZwX3QgZ2ZwID0gbG8tPm9sZF9nZnBfbWFzazsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gbG8tPmxvX2RldmljZTsKIAogCWlmIChsby0+bG9fc3RhdGUgIT0gTG9fYm91bmQpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMDEyLDcgKzk4OCw2IEBACiAJbG8tPmxvX29mZnNldCA9IDA7CiAJbG8tPmxvX3NpemVsaW1pdCA9IDA7CiAJbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSAwOwotCWxvLT5sb19mbGFncyA9IDA7CiAJbG8tPmxvX3RocmVhZCA9IE5VTEw7CiAJbWVtc2V0KGxvLT5sb19lbmNyeXB0X2tleSwgMCwgTE9fS0VZX1NJWkUpOwogCW1lbXNldChsby0+bG9fY3J5cHRfbmFtZSwgMCwgTE9fTkFNRV9TSVpFKTsKQEAgLTEwMzAsOCArMTAwNSwxMSBAQAogCWxvLT5sb19zdGF0ZSA9IExvX3VuYm91bmQ7CiAJLyogVGhpcyBpcyBzYWZlOiBvcGVuKCkgaXMgc3RpbGwgaG9sZGluZyBhIHJlZmVyZW5jZS4gKi8KIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQlpZiAobWF4X3BhcnQgPiAwICYmIGJkZXYpCisJaWYgKGxvLT5sb19mbGFncyAmIExPX0ZMQUdTX1BBUlRTQ0FOICYmIGJkZXYpCiAJCWlvY3RsX2J5X2JkZXYoYmRldiwgQkxLUlJQQVJULCAwKTsKKwlsby0+bG9fZmxhZ3MgPSAwOworCWlmICghcGFydF9zaGlmdCkKKwkJbG8tPmxvX2Rpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX05PX1BBUlRfU0NBTjsKIAltdXRleF91bmxvY2soJmxvLT5sb19jdGxfbXV0ZXgpOwogCS8qCiAJICogTmVlZCBub3QgaG9sZCBsb19jdGxfbXV0ZXggdG8gZnB1dCBiYWNraW5nIGZpbGUuCkBAIC0xMDg1LDYgKzEwNjMsNyBAQAogCQlpZiAoZmlndXJlX2xvb3Bfc2l6ZShsbykpCiAJCQlyZXR1cm4gLUVGQklHOwogCX0KKwlsb29wX2NvbmZpZ19kaXNjYXJkKGxvKTsKIAogCW1lbWNweShsby0+bG9fZmlsZV9uYW1lLCBpbmZvLT5sb19maWxlX25hbWUsIExPX05BTUVfU0laRSk7CiAJbWVtY3B5KGxvLT5sb19jcnlwdF9uYW1lLCBpbmZvLT5sb19jcnlwdF9uYW1lLCBMT19OQU1FX1NJWkUpOwpAQCAtMTEwMCw2ICsxMDc5LDEzIEBACiAJICAgICAoaW5mby0+bG9fZmxhZ3MgJiBMT19GTEFHU19BVVRPQ0xFQVIpKQogCQlsby0+bG9fZmxhZ3MgXj0gTE9fRkxBR1NfQVVUT0NMRUFSOwogCisJaWYgKChpbmZvLT5sb19mbGFncyAmIExPX0ZMQUdTX1BBUlRTQ0FOKSAmJgorCSAgICAgIShsby0+bG9fZmxhZ3MgJiBMT19GTEFHU19QQVJUU0NBTikpIHsKKwkJbG8tPmxvX2ZsYWdzIHw9IExPX0ZMQUdTX1BBUlRTQ0FOOworCQlsby0+bG9fZGlzay0+ZmxhZ3MgJj0gfkdFTkhEX0ZMX05PX1BBUlRfU0NBTjsKKwkJaW9jdGxfYnlfYmRldihsby0+bG9fZGV2aWNlLCBCTEtSUlBBUlQsIDApOworCX0KKwogCWxvLT5sb19lbmNyeXB0X2tleV9zaXplID0gaW5mby0+bG9fZW5jcnlwdF9rZXlfc2l6ZTsKIAlsby0+bG9faW5pdFswXSA9IGluZm8tPmxvX2luaXRbMF07CiAJbG8tPmxvX2luaXRbMV0gPSBpbmZvLT5sb19pbml0WzFdOwpAQCAtMTI5Myw3ICsxMjc5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBMT09QX0NMUl9GRDoKIAkJLyogbG9vcF9jbHJfZmQgd291bGQgaGF2ZSB1bmxvY2tlZCBsb19jdGxfbXV0ZXggb24gc3VjY2VzcyAqLwotCQllcnIgPSBsb29wX2Nscl9mZChsbywgYmRldik7CisJCWVyciA9IGxvb3BfY2xyX2ZkKGxvKTsKIAkJaWYgKCFlcnIpCiAJCQlnb3RvIG91dF91bmxvY2tlZDsKIAkJYnJlYWs7CkBAIC0xNTEzLDcgKzE0OTksNyBAQAogCQkgKiBJbiBhdXRvY2xlYXIgbW9kZSwgc3RvcCB0aGUgbG9vcCB0aHJlYWQKIAkJICogYW5kIHJlbW92ZSBjb25maWd1cmF0aW9uIGFmdGVyIGxhc3QgY2xvc2UuCiAJCSAqLwotCQllcnIgPSBsb29wX2Nscl9mZChsbywgTlVMTCk7CisJCWVyciA9IGxvb3BfY2xyX2ZkKGxvKTsKIAkJaWYgKCFlcnIpCiAJCQlnb3RvIG91dF91bmxvY2tlZDsKIAl9IGVsc2UgewpAQCAtMTYzNSw2ICsxNjIxLDI3IEBACiAJaWYgKCFkaXNrKQogCQlnb3RvIG91dF9mcmVlX3F1ZXVlOwogCisJLyoKKwkgKiBEaXNhYmxlIHBhcnRpdGlvbiBzY2FubmluZyBieSBkZWZhdWx0LiBUaGUgaW4ta2VybmVsIHBhcnRpdGlvbgorCSAqIHNjYW5uaW5nIGNhbiBiZSByZXF1ZXN0ZWQgaW5kaXZpZHVhbGx5IHBlci1kZXZpY2UgZHVyaW5nIGl0cworCSAqIHNldHVwLiBVc2Vyc3BhY2UgY2FuIGFsd2F5cyBhZGQgYW5kIHJlbW92ZSBwYXJ0aXRpb25zIGZyb20gYWxsCisJICogZGV2aWNlcy4gVGhlIG5lZWRlZCBwYXJ0aXRpb24gbWlub3JzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUKKwkgKiBleHRlbmRlZCBtaW5vciBzcGFjZSwgdGhlIG1haW4gbG9vcCBkZXZpY2UgbnVtYmVycyB3aWxsIGNvbnRpbnVlCisJICogdG8gbWF0Y2ggdGhlIGxvb3AgbWlub3JzLCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucworCSAqIHVzZWQuCisJICoKKwkgKiBJZiBtYXhfcGFydCBpcyBnaXZlbiwgcGFydGl0aW9uIHNjYW5uaW5nIGlzIGdsb2JhbGx5IGVuYWJsZWQgZm9yCisJICogYWxsIGxvb3AgZGV2aWNlcy4gVGhlIG1pbm9ycyBmb3IgdGhlIG1haW4gbG9vcCBkZXZpY2VzIHdpbGwgYmUKKwkgKiBtdWx0aXBsZXMgb2YgbWF4X3BhcnQuCisJICoKKwkgKiBOb3RlOiBHbG9iYWwtZm9yLWFsbC1kZXZpY2VzLCBzZXQtb25seS1hdC1pbml0LCByZWFkLW9ubHkgbW9kdWxlCisJICogcGFyYW1ldGV0ZXJzIGxpa2UgJ21heF9sb29wJyBhbmQgJ21heF9wYXJ0JyBtYWtlIHRoaW5ncyBuZWVkbGVzc2x5CisJICogY29tcGxpY2F0ZWQsIGFyZSB0b28gc3RhdGljLCBpbmZsZXhpYmxlIGFuZCBtYXkgc3VycHJpc2UKKwkgKiB1c2Vyc3BhY2UgdG9vbHMuIFBhcmFtZXRlcnMgbGlrZSB0aGlzIGluIGdlbmVyYWwgc2hvdWxkIGJlIGF2b2lkZWQuCisJICovCisJaWYgKCFwYXJ0X3NoaWZ0KQorCQlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9OT19QQVJUX1NDQU47CisJZGlzay0+ZmxhZ3MgfD0gR0VOSERfRkxfRVhUX0RFVlQ7CiAJbXV0ZXhfaW5pdCgmbG8tPmxvX2N0bF9tdXRleCk7CiAJbG8tPmxvX251bWJlcgkJPSBpOwogCWxvLT5sb190aHJlYWQJCT0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbmJkLmMgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCmluZGV4IGY1MzNmMzMuLmMzZjBlZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9uYmQuYwpAQCAtMTI3LDggKzEyNyw3IEBACiAJaWYgKGxvY2spCiAJCW11dGV4X2xvY2soJmxvLT50eF9sb2NrKTsKIAlpZiAobG8tPnNvY2spIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNodXR0aW5nIGRvd24gc29ja2V0XG4iLAotCQkJbG8tPmRpc2stPmRpc2tfbmFtZSk7CisJCWRldl93YXJuKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgInNodXR0aW5nIGRvd24gc29ja2V0XG4iKTsKIAkJa2VybmVsX3NvY2tfc2h1dGRvd24obG8tPnNvY2ssIFNIVVRfUkRXUik7CiAJCWxvLT5zb2NrID0gTlVMTDsKIAl9CkBAIC0xNTgsOCArMTU3LDkgQEAKIAlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CiAKIAlpZiAodW5saWtlbHkoIXNvY2spKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEF0dGVtcHRlZCAlcyBvbiBjbG9zZWQgc29ja2V0IGluIHNvY2tfeG1pdFxuIiwKLQkJICAgICAgIGxvLT5kaXNrLT5kaXNrX25hbWUsIChzZW5kID8gInNlbmQiIDogInJlY3YiKSk7CisJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJIkF0dGVtcHRlZCAlcyBvbiBjbG9zZWQgc29ja2V0IGluIHNvY2tfeG1pdFxuIiwKKwkJCShzZW5kID8gInNlbmQiIDogInJlY3YiKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjUwLDggKzI1MCw4IEBACiAJcmVzdWx0ID0gc29ja194bWl0KGxvLCAxLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAogCQkJKG5iZF9jbWQocmVxKSA9PSBOQkRfQ01EX1dSSVRFKSA/IE1TR19NT1JFIDogMCk7CiAJaWYgKHJlc3VsdCA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFNlbmQgY29udHJvbCBmYWlsZWQgKHJlc3VsdCAlZClcbiIsCi0JCQkJbG8tPmRpc2stPmRpc2tfbmFtZSwgcmVzdWx0KTsKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkiU2VuZCBjb250cm9sIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwgcmVzdWx0KTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCkBAIC0yNzAsOCArMjcwLDkgQEAKIAkJCQkJbG8tPmRpc2stPmRpc2tfbmFtZSwgcmVxLCBidmVjLT5idl9sZW4pOwogCQkJcmVzdWx0ID0gc29ja19zZW5kX2J2ZWMobG8sIGJ2ZWMsIGZsYWdzKTsKIAkJCWlmIChyZXN1bHQgPD0gMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNlbmQgZGF0YSBmYWlsZWQgKHJlc3VsdCAlZClcbiIsCi0JCQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXN1bHQpOworCQkJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJCQkiU2VuZCBkYXRhIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKKwkJCQkJcmVzdWx0KTsKIAkJCQlnb3RvIGVycm9yX291dDsKIAkJCX0KIAkJfQpAQCAtMzI4LDE0ICszMjksMTMgQEAKIAlyZXBseS5tYWdpYyA9IDA7CiAJcmVzdWx0ID0gc29ja194bWl0KGxvLCAwLCAmcmVwbHksIHNpemVvZihyZXBseSksIE1TR19XQUlUQUxMKTsKIAlpZiAocmVzdWx0IDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBjb250cm9sIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXN1bHQpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwKKwkJCSJSZWNlaXZlIGNvbnRyb2wgZmFpbGVkIChyZXN1bHQgJWQpXG4iLCByZXN1bHQpOwogCQlnb3RvIGhhcmRlcnJvcjsKIAl9CiAKIAlpZiAobnRvaGwocmVwbHkubWFnaWMpICE9IE5CRF9SRVBMWV9NQUdJQykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXcm9uZyBtYWdpYyAoMHglbHgpXG4iLAotCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUsCisJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLCAiV3JvbmcgbWFnaWMgKDB4JWx4KVxuIiwKIAkJCQkodW5zaWduZWQgbG9uZyludG9obChyZXBseS5tYWdpYykpOwogCQlyZXN1bHQgPSAtRVBST1RPOwogCQlnb3RvIGhhcmRlcnJvcjsKQEAgLTM0NywxNSArMzQ3LDE1IEBACiAJCWlmIChyZXN1bHQgIT0gLUVOT0VOVCkKIAkJCWdvdG8gaGFyZGVycm9yOwogCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuZXhwZWN0ZWQgcmVwbHkgKCVwKVxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXBseS5oYW5kbGUpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgIlVuZXhwZWN0ZWQgcmVwbHkgKCVwKVxuIiwKKwkJCXJlcGx5LmhhbmRsZSk7CiAJCXJlc3VsdCA9IC1FQkFEUjsKIAkJZ290byBoYXJkZXJyb3I7CiAJfQogCiAJaWYgKG50b2hsKHJlcGx5LmVycm9yKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdGhlciBzaWRlIHJldHVybmVkIGVycm9yICglZClcbiIsCi0JCQkJbG8tPmRpc2stPmRpc2tfbmFtZSwgbnRvaGwocmVwbHkuZXJyb3IpKTsKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksICJPdGhlciBzaWRlIHJldHVybmVkIGVycm9yICglZClcbiIsCisJCQludG9obChyZXBseS5lcnJvcikpOwogCQlyZXEtPmVycm9ycysrOwogCQlyZXR1cm4gcmVxOwogCX0KQEAgLTM2OSw4ICszNjksOCBAQAogCQlycV9mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIHJlcSwgaXRlcikgewogCQkJcmVzdWx0ID0gc29ja19yZWN2X2J2ZWMobG8sIGJ2ZWMpOwogCQkJaWYgKHJlc3VsdCA8PSAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBkYXRhIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKLQkJCQkJCWxvLT5kaXNrLT5kaXNrX25hbWUsIHJlc3VsdCk7CisJCQkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksICJSZWNlaXZlIGRhdGEgZmFpbGVkIChyZXN1bHQgJWQpXG4iLAorCQkJCQlyZXN1bHQpOwogCQkJCXJlcS0+ZXJyb3JzKys7CiAJCQkJcmV0dXJuIHJlcTsKIAkJCX0KQEAgLTQwNSwxMCArNDA1LDEwIEBACiAKIAlCVUdfT04obG8tPm1hZ2ljICE9IExPX01BR0lDKTsKIAotCWxvLT5waWQgPSBjdXJyZW50LT5waWQ7Ci0JcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRpc2tfdG9fZGV2KGxvLT5kaXNrKS0+a29iaiwgJnBpZF9hdHRyLmF0dHIpOworCWxvLT5waWQgPSB0YXNrX3BpZF9ucihjdXJyZW50KTsKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGlza190b19kZXYobG8tPmRpc2spLCAmcGlkX2F0dHIpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJuYmQ6IHN5c2ZzX2NyZWF0ZV9maWxlIGZhaWxlZCEiKTsKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksICJkZXZpY2VfY3JlYXRlX2ZpbGUgZmFpbGVkIVxuIik7CiAJCWxvLT5waWQgPSAwOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTQxNiw3ICs0MTYsNyBAQAogCXdoaWxlICgocmVxID0gbmJkX3JlYWRfc3RhdChsbykpICE9IE5VTEwpCiAJCW5iZF9lbmRfcmVxdWVzdChyZXEpOwogCi0Jc3lzZnNfcmVtb3ZlX2ZpbGUoJmRpc2tfdG9fZGV2KGxvLT5kaXNrKS0+a29iaiwgJnBpZF9hdHRyLmF0dHIpOworCWRldmljZV9yZW1vdmVfZmlsZShkaXNrX3RvX2Rldihsby0+ZGlzayksICZwaWRfYXR0cik7CiAJbG8tPnBpZCA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC00NTcsOCArNDU3LDggQEAKIAlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkgewogCQluYmRfY21kKHJlcSkgPSBOQkRfQ01EX1dSSVRFOwogCQlpZiAobG8tPmZsYWdzICYgTkJEX1JFQURfT05MWSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JpdGUgb24gcmVhZC1vbmx5XG4iLAotCQkJCQlsby0+ZGlzay0+ZGlza19uYW1lKTsKKwkJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJCSJXcml0ZSBvbiByZWFkLW9ubHlcbiIpOwogCQkJZ290byBlcnJvcl9vdXQ7CiAJCX0KIAl9CkBAIC00NjgsMTYgKzQ2OCwxNSBAQAogCW11dGV4X2xvY2soJmxvLT50eF9sb2NrKTsKIAlpZiAodW5saWtlbHkoIWxvLT5zb2NrKSkgewogCQltdXRleF91bmxvY2soJmxvLT50eF9sb2NrKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQXR0ZW1wdGVkIHNlbmQgb24gY2xvc2VkIHNvY2tldFxuIiwKLQkJICAgICAgIGxvLT5kaXNrLT5kaXNrX25hbWUpOworCQlkZXZfZXJyKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwKKwkJCSJBdHRlbXB0ZWQgc2VuZCBvbiBjbG9zZWQgc29ja2V0XG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJbG8tPmFjdGl2ZV9yZXEgPSByZXE7CiAKIAlpZiAobmJkX3NlbmRfcmVxKGxvLCByZXEpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVxdWVzdCBzZW5kIGZhaWxlZFxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lKTsKKwkJZGV2X2VycihkaXNrX3RvX2Rldihsby0+ZGlzayksICJSZXF1ZXN0IHNlbmQgZmFpbGVkXG4iKTsKIAkJcmVxLT5lcnJvcnMrKzsKIAkJbmJkX2VuZF9yZXF1ZXN0KHJlcSk7CiAJfSBlbHNlIHsKQEAgLTU0OSw4ICs1NDgsOCBAQAogCQlCVUdfT04obG8tPm1hZ2ljICE9IExPX01BR0lDKTsKIAogCQlpZiAodW5saWtlbHkoIWxvLT5zb2NrKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQXR0ZW1wdGVkIHNlbmQgb24gY2xvc2VkIHNvY2tldFxuIiwKLQkJCQlsby0+ZGlzay0+ZGlza19uYW1lKTsKKwkJCWRldl9lcnIoZGlza190b19kZXYobG8tPmRpc2spLAorCQkJCSJBdHRlbXB0ZWQgc2VuZCBvbiBjbG9zZWQgc29ja2V0XG4iKTsKIAkJCXJlcS0+ZXJyb3JzKys7CiAJCQluYmRfZW5kX3JlcXVlc3QocmVxKTsKIAkJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CkBAIC01NzYsNyArNTc1LDcgQEAKIAljYXNlIE5CRF9ESVNDT05ORUNUOiB7CiAJCXN0cnVjdCByZXF1ZXN0IHNyZXE7CiAKLQkgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBOQkRfRElTQ09OTkVDVFxuIiwgbG8tPmRpc2stPmRpc2tfbmFtZSk7CisJCWRldl9pbmZvKGRpc2tfdG9fZGV2KGxvLT5kaXNrKSwgIk5CRF9ESVNDT05ORUNUXG4iKTsKIAogCQlibGtfcnFfaW5pdChOVUxMLCAmc3JlcSk7CiAJCXNyZXEuY21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwpAQCAtNjc0LDcgKzY3Myw3IEBACiAJCWZpbGUgPSBsby0+ZmlsZTsKIAkJbG8tPmZpbGUgPSBOVUxMOwogCQluYmRfY2xlYXJfcXVlKGxvKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHF1ZXVlIGNsZWFyZWRcbiIsIGxvLT5kaXNrLT5kaXNrX25hbWUpOworCQlkZXZfd2FybihkaXNrX3RvX2Rldihsby0+ZGlzayksICJxdWV1ZSBjbGVhcmVkXG4iKTsKIAkJaWYgKGZpbGUpCiAJCQlmcHV0KGZpbGUpOwogCQlsby0+Ynl0ZXNpemUgPSAwOwpAQCAtNjk0LDggKzY5Myw4IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBOQkRfUFJJTlRfREVCVUc6Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBuZXh0ID0gJXAsIHByZXYgPSAlcCwgaGVhZCA9ICVwXG4iLAotCQkJYmRldi0+YmRfZGlzay0+ZGlza19uYW1lLAorCQlkZXZfaW5mbyhkaXNrX3RvX2Rldihsby0+ZGlzayksCisJCQkibmV4dCA9ICVwLCBwcmV2ID0gJXAsIGhlYWQgPSAlcFxuIiwKIAkJCWxvLT5xdWV1ZV9oZWFkLm5leHQsIGxvLT5xdWV1ZV9oZWFkLnByZXYsCiAJCQkmbG8tPnF1ZXVlX2hlYWQpOwogCQlyZXR1cm4gMDsKQEAgLTc0NSw3ICs3NDQsNyBAQAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IG5iZF9yZXF1ZXN0KSAhPSAyOCk7CiAKIAlpZiAobWF4X3BhcnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIm5iZDogbWF4X3BhcnQgbXVzdCBiZSA+PSAwXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuYmQ6IG1heF9wYXJ0IG11c3QgYmUgPj0gMFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwppbmRleCBlMTMzZjA5Li5hNjNiMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwpAQCAtMjQ0NCw3ICsyNDQ0LDcgQEAKIAlwa3RfYmlvX2ZpbmlzaGVkKHBkKTsKIH0KIAotc3RhdGljIGludCBwa3RfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBwa3RfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZDsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0yNDczLDcgKzI0NzMsNyBAQAogCQljbG9uZWRfYmlvLT5iaV9lbmRfaW8gPSBwa3RfZW5kX2lvX3JlYWRfY2xvbmVkOwogCQlwZC0+c3RhdHMuc2Vjc19yICs9IGJpby0+Ymlfc2l6ZSA+PiA5OwogCQlwa3RfcXVldWVfYmlvKHBkLCBjbG9uZWRfYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAlpZiAoIXRlc3RfYml0KFBBQ0tFVF9XUklUQUJMRSwgJnBkLT5mbGFncykpIHsKQEAgLTI1MDksNyArMjUwOSw3IEBACiAJCQlwa3RfbWFrZV9yZXF1ZXN0KHEsICZicC0+YmlvMSk7CiAJCQlwa3RfbWFrZV9yZXF1ZXN0KHEsICZicC0+YmlvMik7CiAJCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuOwogCQl9CiAJfQogCkBAIC0yNTMzLDcgKzI1MzMsNyBAQAogCQkJCX0KIAkJCQlzcGluX3VubG9jaygmcGt0LT5sb2NrKTsKIAkJCQlzcGluX3VubG9jaygmcGQtPmNkcncuYWN0aXZlX2xpc3RfbG9jayk7Ci0JCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuOwogCQkJfSBlbHNlIHsKIAkJCQlibG9ja2VkX2JpbyA9IDE7CiAJCQl9CkBAIC0yNTg0LDEwICsyNTg0LDkgQEAKIAkJICovCiAJCXdha2VfdXAoJnBkLT53cXVldWUpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm47CiBlbmRfaW86CiAJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wczNkaXNrLmMgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwppbmRleCA4ZTFjZTJlLi5kYTBhYmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYworKysgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcHMzdnJhbS5jIGIvZHJpdmVycy9ibG9jay9wczN2cmFtLmMKaW5kZXggYjNiZGI4YS4uZjU4Y2RjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wczN2cmFtLmMKKysrIGIvZHJpdmVycy9ibG9jay9wczN2cmFtLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTk2LDcgKzU5Nyw3IEBACiAJcmV0dXJuIG5leHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzdnJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBwczNfc3lzdGVtX2J1c19nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtNjEwLDEzICs2MTEsMTEgQEAKIAlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCiAJaWYgKGJ1c3kpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlkbyB7CiAJCWJpbyA9IHBzM3ZyYW1fZG9fYmlvKGRldiwgYmlvKTsKIAl9IHdoaWxlIChiaW8pOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBzM3ZyYW1fcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9yYmQuYyBiL2RyaXZlcnMvYmxvY2svcmJkLmMKaW5kZXggZmUzYzMyNC4uNjVjYzQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9yYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JiZC5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAlrcmVmX2luaXQoJnJiZGMtPmtyZWYpOwogCUlOSVRfTElTVF9IRUFEKCZyYmRjLT5ub2RlKTsKIAotCXJiZGMtPmNsaWVudCA9IGNlcGhfY3JlYXRlX2NsaWVudChvcHQsIHJiZGMpOworCXJiZGMtPmNsaWVudCA9IGNlcGhfY3JlYXRlX2NsaWVudChvcHQsIHJiZGMsIDAsIDApOwogCWlmIChJU19FUlIocmJkYy0+Y2xpZW50KSkKIAkJZ290byBvdXRfcmJkYzsKIAlvcHQgPSBOVUxMOyAvKiBOb3cgcmJkYy0+Y2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBvcHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdW1lbS5jIGIvZHJpdmVycy9ibG9jay91bWVtLmMKaW5kZXggMDMxY2E3Mi4uYWEyNzEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91bWVtLmMKKysrIGIvZHJpdmVycy9ibG9jay91bWVtLmMKQEAgLTUxMyw3ICs1MTMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBtbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIG1tX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IHEtPnF1ZXVlZGF0YTsKIAlwcl9kZWJ1ZygibW1fbWFrZV9yZXF1ZXN0ICVsbHUgJXVcbiIsCkBAIC01MjUsNyArNTI1LDcgQEAKIAljYXJkLT5iaW90YWlsID0gJmJpby0+YmlfbmV4dDsKIAlzcGluX3VubG9ja19pcnEoJmNhcmQtPmxvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbW1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9fY2FyZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKaW5kZXggMDc5YzA4OC4uNGQwYjcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKQEAgLTMsMTUgKzMsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fYmxrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAKICNkZWZpbmUgUEFSVF9CSVRTIDQKIAotc3RhdGljIGludCBtYWpvciwgaW5kZXg7CitzdGF0aWMgaW50IG1ham9yOworc3RhdGljIERFRklORV9JREEodmRfaW5kZXhfaWRhKTsKKwogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnZpcnRibGtfd3E7CiAKIHN0cnVjdCB2aXJ0aW9fYmxrCkBAIC0zNSw2ICszOSw5IEBACiAJLyogV2hhdCBob3N0IHRlbGxzIHVzLCBwbHVzIDIgZm9yIGhlYWRlciAmIHRhaWxlci4gKi8KIAl1bnNpZ25lZCBpbnQgc2dfZWxlbXM7CiAKKwkvKiBJZGEgaW5kZXggLSB1c2VkIHRvIHRyYWNrIG1pbm9yIG51bWJlciBhbGxvY2F0aW9ucy4gKi8KKwlpbnQgaW5kZXg7CisKIAkvKiBTY2F0dGVybGlzdDogY2FuIGJlIHRvbyBiaWcgZm9yIHN0YWNrLiAqLwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1svKnNnX2VsZW1zKi9dOwogfTsKQEAgLTI3Niw2ICsyODMsMTEgQEAKIAlyZXR1cm4gaW5kZXggPDwgUEFSVF9CSVRTOwogfQogCitzdGF0aWMgaW50IG1pbm9yX3RvX2luZGV4KGludCBtaW5vcikKK3sKKwlyZXR1cm4gbWlub3IgPj4gUEFSVF9CSVRTOworfQorCiBzdGF0aWMgc3NpemVfdCB2aXJ0YmxrX3NlcmlhbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMzQxLDE0ICszNTMsMTcgQEAKIHsKIAlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsazsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKLQlpbnQgZXJyOworCWludCBlcnIsIGluZGV4OwogCXU2NCBjYXA7CiAJdTMyIHYsIGJsa19zaXplLCBzZ19lbGVtcywgb3B0X2lvX3NpemU7CiAJdTE2IG1pbl9pb19zaXplOwogCXU4IHBoeXNpY2FsX2Jsb2NrX2V4cCwgYWxpZ25tZW50X29mZnNldDsKIAotCWlmIChpbmRleF90b19taW5vcihpbmRleCkgPj0gMSA8PCBNSU5PUkJJVFMpCi0JCXJldHVybiAtRU5PU1BDOworCWVyciA9IGlkYV9zaW1wbGVfZ2V0KCZ2ZF9pbmRleF9pZGEsIDAsIG1pbm9yX3RvX2luZGV4KDEgPDwgTUlOT1JCSVRTKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWluZGV4ID0gZXJyOwogCiAJLyogV2UgbmVlZCB0byBrbm93IGhvdyBtYW55IHNlZ21lbnRzIGJlZm9yZSB3ZSBhbGxvY2F0ZS4gKi8KIAllcnIgPSB2aXJ0aW9fY29uZmlnX3ZhbCh2ZGV2LCBWSVJUSU9fQkxLX0ZfU0VHX01BWCwKQEAgLTM2NSw3ICszODAsNyBAQAogCQkJCSAgICBzaXplb2YodmJsay0+c2dbMF0pICogc2dfZWxlbXMsIEdGUF9LRVJORUwpOwogCWlmICghdmJsaykgewogCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZnJlZV9pbmRleDsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmdmJsay0+cmVxcyk7CkBAIC00MjEsNyArNDM2LDcgQEAKIAl2YmxrLT5kaXNrLT5wcml2YXRlX2RhdGEgPSB2YmxrOwogCXZibGstPmRpc2stPmZvcHMgPSAmdmlydGJsa19mb3BzOwogCXZibGstPmRpc2stPmRyaXZlcmZzX2RldiA9ICZ2ZGV2LT5kZXY7Ci0JaW5kZXgrKzsKKwl2YmxrLT5pbmRleCA9IGluZGV4OwogCiAJLyogY29uZmlndXJlIHF1ZXVlIGZsdXNoIHN1cHBvcnQgKi8KIAlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19CTEtfRl9GTFVTSCkpCkBAIC01MTYsNiArNTMxLDggQEAKIAl2ZGV2LT5jb25maWctPmRlbF92cXModmRldik7CiBvdXRfZnJlZV92YmxrOgogCWtmcmVlKHZibGspOworb3V0X2ZyZWVfaW5kZXg6CisJaWRhX3NpbXBsZV9yZW1vdmUoJnZkX2luZGV4X2lkYSwgaW5kZXgpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC01MjMsNiArNTQwLDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aXJ0YmxrX3JlbW92ZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKIHsKIAlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IHZkZXYtPnByaXY7CisJaW50IGluZGV4ID0gdmJsay0+aW5kZXg7CiAKIAlmbHVzaF93b3JrKCZ2YmxrLT5jb25maWdfd29yayk7CiAKQEAgLTUzOCw2ICs1NTYsNyBAQAogCW1lbXBvb2xfZGVzdHJveSh2YmxrLT5wb29sKTsKIAl2ZGV2LT5jb25maWctPmRlbF92cXModmRldik7CiAJa2ZyZWUodmJsayk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJnZkX2luZGV4X2lkYSwgaW5kZXgpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZpcnRpb19kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXggMTU0MDc5Mi4uMTVlYzRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKQEAgLTM5LDYgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvbG9vcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KQEAgLTI1OCwxMyArMjYxLDE2IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3N0YXRzKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmKQogewotCXByX2luZm8oInhlbi1ibGtiYWNrICglcyk6IG9vICUzZCAgfCAgcmQgJTRkICB8ICB3ciAlNGQgIHwgIGYgJTRkXG4iLAorCXByX2luZm8oInhlbi1ibGtiYWNrICglcyk6IG9vICUzZCAgfCAgcmQgJTRkICB8ICB3ciAlNGQgIHwgIGYgJTRkIgorCQkgIiAgfCAgZHMgJTRkXG4iLAogCQkgY3VycmVudC0+Y29tbSwgYmxraWYtPnN0X29vX3JlcSwKLQkJIGJsa2lmLT5zdF9yZF9yZXEsIGJsa2lmLT5zdF93cl9yZXEsIGJsa2lmLT5zdF9mX3JlcSk7CisJCSBibGtpZi0+c3RfcmRfcmVxLCBibGtpZi0+c3Rfd3JfcmVxLAorCQkgYmxraWYtPnN0X2ZfcmVxLCBibGtpZi0+c3RfZHNfcmVxKTsKIAlibGtpZi0+c3RfcHJpbnQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCAqIDEwMDApOwogCWJsa2lmLT5zdF9yZF9yZXEgPSAwOwogCWJsa2lmLT5zdF93cl9yZXEgPSAwOwogCWJsa2lmLT5zdF9vb19yZXEgPSAwOworCWJsa2lmLT5zdF9kc19yZXEgPSAwOwogfQogCiBpbnQgeGVuX2Jsa2lmX3NjaGVkdWxlKHZvaWQgKmFyZykKQEAgLTQxMCw2ICs0MTYsNTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCB4ZW5fYmxrX2Rpc2NhcmQoc3RydWN0IHhlbl9ibGtpZiAqYmxraWYsIHN0cnVjdCBibGtpZl9yZXF1ZXN0ICpyZXEpCit7CisJaW50IGVyciA9IDA7CisJaW50IHN0YXR1cyA9IEJMS0lGX1JTUF9PS0FZOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7CisKKwlpZiAoYmxraWYtPmJsa19iYWNrZW5kX3R5cGUgPT0gQkxLSUZfQkFDS0VORF9QSFkpCisJCS8qIGp1c3QgZm9yd2FyZCB0aGUgZGlzY2FyZCByZXF1ZXN0ICovCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEtPnUuZGlzY2FyZC5ucl9zZWN0b3JzLAorCQkJCUdGUF9LRVJORUwsIDApOworCWVsc2UgaWYgKGJsa2lmLT5ibGtfYmFja2VuZF90eXBlID09IEJMS0lGX0JBQ0tFTkRfRklMRSkgeworCQkvKiBwdW5jaCBhIGhvbGUgaW4gdGhlIGJhY2tpbmcgZmlsZSAqLworCQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGxvLT5sb19iYWNraW5nX2ZpbGU7CisKKwkJaWYgKGZpbGUtPmZfb3AtPmZhbGxvY2F0ZSkKKwkJCWVyciA9IGZpbGUtPmZfb3AtPmZhbGxvY2F0ZShmaWxlLAorCQkJCUZBTExPQ19GTF9LRUVQX1NJWkUgfCBGQUxMT0NfRkxfUFVOQ0hfSE9MRSwKKwkJCQlyZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyIDw8IDksCisJCQkJcmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycyA8PCA5KTsKKwkJZWxzZQorCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJfSBlbHNlCisJCWVyciA9IC1FT1BOT1RTVVBQOworCisJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgeworCQlwcl9kZWJ1ZyhEUlZfUEZYICJkaXNjYXJkIG9wIGZhaWxlZCwgbm90IHN1cHBvcnRlZFxuIik7CisJCXN0YXR1cyA9IEJMS0lGX1JTUF9FT1BOT1RTVVBQOworCX0gZWxzZSBpZiAoZXJyKQorCQlzdGF0dXMgPSBCTEtJRl9SU1BfRVJST1I7CisKKwltYWtlX3Jlc3BvbnNlKGJsa2lmLCByZXEtPmlkLCByZXEtPm9wZXJhdGlvbiwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2Jsa19kcmFpbl9pbyhzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZikKK3sKKwlhdG9taWNfc2V0KCZibGtpZi0+ZHJhaW4sIDEpOworCWRvIHsKKwkJLyogVGhlIGluaXRpYWwgdmFsdWUgaXMgb25lLCBhbmQgb25lIHJlZmNudCB0YWtlbiBhdCB0aGUKKwkJICogc3RhcnQgb2YgdGhlIHhlbl9ibGtpZl9zY2hlZHVsZSB0aHJlYWQuICovCisJCWlmIChhdG9taWNfcmVhZCgmYmxraWYtPnJlZmNudCkgPD0gMikKKwkJCWJyZWFrOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkmYmxraWYtPmRyYWluX2NvbXBsZXRlLCBIWik7CisKKwkJaWYgKCFhdG9taWNfcmVhZCgmYmxraWYtPmRyYWluKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCWF0b21pY19zZXQoJmJsa2lmLT5kcmFpbiwgMCk7Cit9CisKIC8qCiAgKiBDb21wbGV0aW9uIGNhbGxiYWNrIG9uIHRoZSBiaW8ncy4gQ2FsbGVkIGFzIGJoLT5iX2VuZF9pbygpCiAgKi8KQEAgLTQyMiw2ICs0ODEsMTEgQEAKIAkJcHJfZGVidWcoRFJWX1BGWCAiZmx1c2ggZGlza2NhY2hlIG9wIGZhaWxlZCwgbm90IHN1cHBvcnRlZFxuIik7CiAJCXhlbl9ibGtia19mbHVzaF9kaXNrY2FjaGUoWEJUX05JTCwgcGVuZGluZ19yZXEtPmJsa2lmLT5iZSwgMCk7CiAJCXBlbmRpbmdfcmVxLT5zdGF0dXMgPSBCTEtJRl9SU1BfRU9QTk9UU1VQUDsKKwl9IGVsc2UgaWYgKChwZW5kaW5nX3JlcS0+b3BlcmF0aW9uID09IEJMS0lGX09QX1dSSVRFX0JBUlJJRVIpICYmCisJCSAgICAoZXJyb3IgPT0gLUVPUE5PVFNVUFApKSB7CisJCXByX2RlYnVnKERSVl9QRlggIndyaXRlIGJhcnJpZXIgb3AgZmFpbGVkLCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJeGVuX2Jsa2JrX2JhcnJpZXIoWEJUX05JTCwgcGVuZGluZ19yZXEtPmJsa2lmLT5iZSwgMCk7CisJCXBlbmRpbmdfcmVxLT5zdGF0dXMgPSBCTEtJRl9SU1BfRU9QTk9UU1VQUDsKIAl9IGVsc2UgaWYgKGVycm9yKSB7CiAJCXByX2RlYnVnKERSVl9QRlggIkJ1ZmZlciBub3QgdXAtdG8tZGF0ZSBhdCBlbmQgb2Ygb3BlcmF0aW9uLCIKIAkJCSAiIGVycm9yPSVkXG4iLCBlcnJvcik7CkBAIC00MzgsNiArNTAyLDEwIEBACiAJCW1ha2VfcmVzcG9uc2UocGVuZGluZ19yZXEtPmJsa2lmLCBwZW5kaW5nX3JlcS0+aWQsCiAJCQkgICAgICBwZW5kaW5nX3JlcS0+b3BlcmF0aW9uLCBwZW5kaW5nX3JlcS0+c3RhdHVzKTsKIAkJeGVuX2Jsa2lmX3B1dChwZW5kaW5nX3JlcS0+YmxraWYpOworCQlpZiAoYXRvbWljX3JlYWQoJnBlbmRpbmdfcmVxLT5ibGtpZi0+cmVmY250KSA8PSAyKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnBlbmRpbmdfcmVxLT5ibGtpZi0+ZHJhaW4pKQorCQkJCWNvbXBsZXRlKCZwZW5kaW5nX3JlcS0+YmxraWYtPmRyYWluX2NvbXBsZXRlKTsKKwkJfQogCQlmcmVlX3JlcShwZW5kaW5nX3JlcSk7CiAJfQogfQpAQCAtNTMyLDcgKzYwMCw2IEBACiAKIAlyZXR1cm4gbW9yZV90b19kbzsKIH0KLQogLyoKICAqIFRyYW5zbXV0YXRpb24gb2YgdGhlICdzdHJ1Y3QgYmxraWZfcmVxdWVzdCcgdG8gYSBwcm9wZXIgJ3N0cnVjdCBiaW8nCiAgKiBhbmQgY2FsbCB0aGUgJ3N1Ym1pdF9iaW8nIHRvIHBhc3MgaXQgdG8gdGhlIHVuZGVybHlpbmcgc3RvcmFnZS4KQEAgLTU0OSw2ICs2MTYsNyBAQAogCWludCBpLCBuYmlvID0gMDsKIAlpbnQgb3BlcmF0aW9uOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOworCWJvb2wgZHJhaW4gPSBmYWxzZTsKIAogCXN3aXRjaCAocmVxLT5vcGVyYXRpb24pIHsKIAljYXNlIEJMS0lGX09QX1JFQUQ6CkBAIC01NTksMTEgKzYyNywxNiBAQAogCQlibGtpZi0+c3Rfd3JfcmVxKys7CiAJCW9wZXJhdGlvbiA9IFdSSVRFX09ESVJFQ1Q7CiAJCWJyZWFrOworCWNhc2UgQkxLSUZfT1BfV1JJVEVfQkFSUklFUjoKKwkJZHJhaW4gPSB0cnVlOwogCWNhc2UgQkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgogCQlibGtpZi0+c3RfZl9yZXErKzsKIAkJb3BlcmF0aW9uID0gV1JJVEVfRkxVU0g7CiAJCWJyZWFrOwotCWNhc2UgQkxLSUZfT1BfV1JJVEVfQkFSUklFUjoKKwljYXNlIEJMS0lGX09QX0RJU0NBUkQ6CisJCWJsa2lmLT5zdF9kc19yZXErKzsKKwkJb3BlcmF0aW9uID0gUkVRX0RJU0NBUkQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW9wZXJhdGlvbiA9IDA7IC8qIG1ha2UgZ2NjIGhhcHB5ICovCiAJCWdvdG8gZmFpbF9yZXNwb25zZTsKQEAgLTU3Miw3ICs2NDUsOCBAQAogCiAJLyogQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGlzIHNhbmUuICovCiAJbnNlZyA9IHJlcS0+bnJfc2VnbWVudHM7Ci0JaWYgKHVubGlrZWx5KG5zZWcgPT0gMCAmJiBvcGVyYXRpb24gIT0gV1JJVEVfRkxVU0gpIHx8CisJaWYgKHVubGlrZWx5KG5zZWcgPT0gMCAmJiBvcGVyYXRpb24gIT0gV1JJVEVfRkxVU0ggJiYKKwkJCQlvcGVyYXRpb24gIT0gUkVRX0RJU0NBUkQpIHx8CiAJICAgIHVubGlrZWx5KG5zZWcgPiBCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1QpKSB7CiAJCXByX2RlYnVnKERSVl9QRlggIkJhZCBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcmVxdWVzdCAoJWQpXG4iLAogCQkJIG5zZWcpOwpAQCAtNjIxLDE2ICs2OTUsMjUgQEAKIAkJfQogCX0KIAorCS8qIFdhaXQgb24gYWxsIG91dHN0YW5kaW5nIEkvTydzIGFuZCBvbmNlIHRoYXQgaGFzIGJlZW4gY29tcGxldGVkCisJICogaXNzdWUgdGhlIFdSSVRFX0ZMVVNILgorCSAqLworCWlmIChkcmFpbikKKwkJeGVuX2Jsa19kcmFpbl9pbyhwZW5kaW5nX3JlcS0+YmxraWYpOworCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIGZhaWxlZCBhdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVuZG8gdGhlIE0yUCBvdmVycmlkZSwKIAkgKiBzZXQgZ250dGFiX3NldF91bm1hcF9vcCBvbiBhbGwgb2YgdGhlIGdyYW50IHJlZmVyZW5jZXMgYW5kIHBlcmZvcm0KIAkgKiB0aGUgaHlwZXJjYWxsIHRvIHVubWFwIHRoZSBncmFudHMgLSB0aGF0IGlzIGFsbCBkb25lIGluCiAJICogeGVuX2Jsa2JrX3VubWFwLgogCSAqLwotCWlmICh4ZW5fYmxrYmtfbWFwKHJlcSwgcGVuZGluZ19yZXEsIHNlZykpCisJaWYgKG9wZXJhdGlvbiAhPSBSRVFfRElTQ0FSRCAmJiB4ZW5fYmxrYmtfbWFwKHJlcSwgcGVuZGluZ19yZXEsIHNlZykpCiAJCWdvdG8gZmFpbF9mbHVzaDsKIAotCS8qIFRoaXMgY29ycmVzcG9uZGluZyB4ZW5fYmxraWZfcHV0IGlzIGRvbmUgaW4gX19lbmRfYmxvY2tfaW9fb3AgKi8KKwkvKgorCSAqIFRoaXMgY29ycmVzcG9uZGluZyB4ZW5fYmxraWZfcHV0IGlzIGRvbmUgaW4gX19lbmRfYmxvY2tfaW9fb3AsIG9yCisJICogYmVsb3cgKGluICIhYmlvIikgaWYgd2UgYXJlIGhhbmRsaW5nIGEgQkxLSUZfT1BfRElTQ0FSRC4KKwkgKi8KIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuc2VnOyBpKyspIHsKQEAgLTY1NCwxOCArNzM3LDI1IEBACiAJCXByZXEuc2VjdG9yX251bWJlciArPSBzZWdbaV0ubnNlYzsKIAl9CiAKLQkvKiBUaGlzIHdpbGwgYmUgaGl0IGlmIHRoZSBvcGVyYXRpb24gd2FzIGEgZmx1c2guICovCisJLyogVGhpcyB3aWxsIGJlIGhpdCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBhIGZsdXNoIG9yIGRpc2NhcmQuICovCiAJaWYgKCFiaW8pIHsKLQkJQlVHX09OKG9wZXJhdGlvbiAhPSBXUklURV9GTFVTSCk7CisJCUJVR19PTihvcGVyYXRpb24gIT0gV1JJVEVfRkxVU0ggJiYgb3BlcmF0aW9uICE9IFJFUV9ESVNDQVJEKTsKIAotCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgMCk7Ci0JCWlmICh1bmxpa2VseShiaW8gPT0gTlVMTCkpCi0JCQlnb3RvIGZhaWxfcHV0X2JpbzsKKwkJaWYgKG9wZXJhdGlvbiA9PSBXUklURV9GTFVTSCkgeworCQkJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIDApOworCQkJaWYgKHVubGlrZWx5KGJpbyA9PSBOVUxMKSkKKwkJCQlnb3RvIGZhaWxfcHV0X2JpbzsKIAotCQliaW9saXN0W25iaW8rK10gPSBiaW87Ci0JCWJpby0+YmlfYmRldiAgICA9IHByZXEuYmRldjsKLQkJYmlvLT5iaV9wcml2YXRlID0gcGVuZGluZ19yZXE7Ci0JCWJpby0+YmlfZW5kX2lvICA9IGVuZF9ibG9ja19pb19vcDsKKwkJCWJpb2xpc3RbbmJpbysrXSA9IGJpbzsKKwkJCWJpby0+YmlfYmRldiAgICA9IHByZXEuYmRldjsKKwkJCWJpby0+YmlfcHJpdmF0ZSA9IHBlbmRpbmdfcmVxOworCQkJYmlvLT5iaV9lbmRfaW8gID0gZW5kX2Jsb2NrX2lvX29wOworCQl9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBSRVFfRElTQ0FSRCkgeworCQkJeGVuX2Jsa19kaXNjYXJkKGJsa2lmLCByZXEpOworCQkJeGVuX2Jsa2lmX3B1dChibGtpZik7CisJCQlmcmVlX3JlcShwZW5kaW5nX3JlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAogCS8qCkBAIC02ODUsNyArNzc1LDcgQEAKIAogCWlmIChvcGVyYXRpb24gPT0gUkVBRCkKIAkJYmxraWYtPnN0X3JkX3NlY3QgKz0gcHJlcS5ucl9zZWN0czsKLQllbHNlIGlmIChvcGVyYXRpb24gPT0gV1JJVEUgfHwgb3BlcmF0aW9uID09IFdSSVRFX0ZMVVNIKQorCWVsc2UgaWYgKG9wZXJhdGlvbiAmIFdSSVRFKQogCQlibGtpZi0+c3Rfd3Jfc2VjdCArPSBwcmVxLm5yX3NlY3RzOwogCiAJcmV0dXJuIDA7CkBAIC03NjUsOSArODU1LDkgQEAKIAogCW1tYXBfcGFnZXMgPSB4ZW5fYmxraWZfcmVxcyAqIEJMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVDsKIAotCWJsa2JrLT5wZW5kaW5nX3JlcXMgICAgICAgICAgPSBrbWFsbG9jKHNpemVvZihibGtiay0+cGVuZGluZ19yZXFzWzBdKSAqCisJYmxrYmstPnBlbmRpbmdfcmVxcyAgICAgICAgICA9IGt6YWxsb2Moc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX3JlcXNbMF0pICoKIAkJCQkJeGVuX2Jsa2lmX3JlcXMsIEdGUF9LRVJORUwpOwotCWJsa2JrLT5wZW5kaW5nX2dyYW50X2hhbmRsZXMgPSBremFsbG9jKHNpemVvZihibGtiay0+cGVuZGluZ19ncmFudF9oYW5kbGVzWzBdKSAqCisJYmxrYmstPnBlbmRpbmdfZ3JhbnRfaGFuZGxlcyA9IGttYWxsb2Moc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX2dyYW50X2hhbmRsZXNbMF0pICoKIAkJCQkJbW1hcF9wYWdlcywgR0ZQX0tFUk5FTCk7CiAJYmxrYmstPnBlbmRpbmdfcGFnZXMgICAgICAgICA9IGt6YWxsb2Moc2l6ZW9mKGJsa2JrLT5wZW5kaW5nX3BhZ2VzWzBdKSAqCiAJCQkJCW1tYXBfcGFnZXMsIEdGUF9LRVJORUwpOwpAQCAtNzkwLDggKzg4MCw2IEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWxlZF9pbml0OwogCi0JbWVtc2V0KGJsa2JrLT5wZW5kaW5nX3JlcXMsIDAsIHNpemVvZihibGtiay0+cGVuZGluZ19yZXFzKSk7Ci0KIAlJTklUX0xJU1RfSEVBRCgmYmxrYmstPnBlbmRpbmdfZnJlZSk7CiAJc3Bpbl9sb2NrX2luaXQoJmJsa2JrLT5wZW5kaW5nX2ZyZWVfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYmxrYmstPnBlbmRpbmdfZnJlZV93cSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2NvbW1vbi5oIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9jb21tb24uaAppbmRleCBjNGJkMzQwLi5kZmIxYjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svY29tbW9uLmgKQEAgLTYyLDEzICs2MiwyNiBAQAogCiAvKiBpMzg2IHByb3RvY29sIHZlcnNpb24gKi8KICNwcmFnbWEgcGFjayhwdXNoLCA0KQorCitzdHJ1Y3QgYmxraWZfeDg2XzMyX3JlcXVlc3RfcncgeworCWJsa2lmX3NlY3Rvcl90IHNlY3Rvcl9udW1iZXI7Lyogc3RhcnQgc2VjdG9yIGlkeCBvbiBkaXNrIChyL3cgb25seSkgICovCisJc3RydWN0IGJsa2lmX3JlcXVlc3Rfc2VnbWVudCBzZWdbQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUXTsKK307CisKK3N0cnVjdCBibGtpZl94ODZfMzJfcmVxdWVzdF9kaXNjYXJkIHsKKwlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOy8qIHN0YXJ0IHNlY3RvciBpZHggb24gZGlzayAoci93IG9ubHkpICAqLworCXVpbnQ2NF90IG5yX3NlY3RvcnM7Cit9OworCiBzdHJ1Y3QgYmxraWZfeDg2XzMyX3JlcXVlc3QgewogCXVpbnQ4X3QgICAgICAgIG9wZXJhdGlvbjsgICAgLyogQkxLSUZfT1BfPz8/ICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJdWludDhfdCAgICAgICAgbnJfc2VnbWVudHM7ICAvKiBudW1iZXIgb2Ygc2VnbWVudHMgICAgICAgICAgICAgICAgICAgKi8KIAlibGtpZl92ZGV2X3QgICBoYW5kbGU7ICAgICAgIC8qIG9ubHkgZm9yIHJlYWQvd3JpdGUgcmVxdWVzdHMgICAgICAgICAqLwogCXVpbnQ2NF90ICAgICAgIGlkOyAgICAgICAgICAgLyogcHJpdmF0ZSBndWVzdCB2YWx1ZSwgZWNob2VkIGluIHJlc3AgICovCi0JYmxraWZfc2VjdG9yX3Qgc2VjdG9yX251bWJlcjsvKiBzdGFydCBzZWN0b3IgaWR4IG9uIGRpc2sgKHIvdyBvbmx5KSAgKi8KLQlzdHJ1Y3QgYmxraWZfcmVxdWVzdF9zZWdtZW50IHNlZ1tCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOworCXVuaW9uIHsKKwkJc3RydWN0IGJsa2lmX3g4Nl8zMl9yZXF1ZXN0X3J3IHJ3OworCQlzdHJ1Y3QgYmxraWZfeDg2XzMyX3JlcXVlc3RfZGlzY2FyZCBkaXNjYXJkOworCX0gdTsKIH07CiBzdHJ1Y3QgYmxraWZfeDg2XzMyX3Jlc3BvbnNlIHsKIAl1aW50NjRfdCAgICAgICAgaWQ7ICAgICAgICAgICAgICAvKiBjb3BpZWQgZnJvbSByZXF1ZXN0ICovCkBAIC03OCwxMyArOTEsMjYgQEAKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8qIHg4Nl82NCBwcm90b2NvbCB2ZXJzaW9uICovCisKK3N0cnVjdCBibGtpZl94ODZfNjRfcmVxdWVzdF9ydyB7CisJYmxraWZfc2VjdG9yX3Qgc2VjdG9yX251bWJlcjsvKiBzdGFydCBzZWN0b3IgaWR4IG9uIGRpc2sgKHIvdyBvbmx5KSAgKi8KKwlzdHJ1Y3QgYmxraWZfcmVxdWVzdF9zZWdtZW50IHNlZ1tCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOworfTsKKworc3RydWN0IGJsa2lmX3g4Nl82NF9yZXF1ZXN0X2Rpc2NhcmQgeworCWJsa2lmX3NlY3Rvcl90IHNlY3Rvcl9udW1iZXI7Lyogc3RhcnQgc2VjdG9yIGlkeCBvbiBkaXNrIChyL3cgb25seSkgICovCisJdWludDY0X3QgbnJfc2VjdG9yczsKK307CisKIHN0cnVjdCBibGtpZl94ODZfNjRfcmVxdWVzdCB7CiAJdWludDhfdCAgICAgICAgb3BlcmF0aW9uOyAgICAvKiBCTEtJRl9PUF8/Pz8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1aW50OF90ICAgICAgICBucl9zZWdtZW50czsgIC8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgICAgICAgICAqLwogCWJsa2lmX3ZkZXZfdCAgIGhhbmRsZTsgICAgICAgLyogb25seSBmb3IgcmVhZC93cml0ZSByZXF1ZXN0cyAgICAgICAgICovCiAJdWludDY0X3QgICAgICAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oOCkpKSBpZDsKLQlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOy8qIHN0YXJ0IHNlY3RvciBpZHggb24gZGlzayAoci93IG9ubHkpICAqLwotCXN0cnVjdCBibGtpZl9yZXF1ZXN0X3NlZ21lbnQgc2VnW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07CisJdW5pb24geworCQlzdHJ1Y3QgYmxraWZfeDg2XzY0X3JlcXVlc3Rfcncgcnc7CisJCXN0cnVjdCBibGtpZl94ODZfNjRfcmVxdWVzdF9kaXNjYXJkIGRpc2NhcmQ7CisJfSB1OwogfTsKIHN0cnVjdCBibGtpZl94ODZfNjRfcmVzcG9uc2UgewogCXVpbnQ2NF90ICAgICAgIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSkgaWQ7CkBAIC0xMTIsNiArMTM4LDExIEBACiAJQkxLSUZfUFJPVE9DT0xfWDg2XzY0ID0gMywKIH07CiAKK2VudW0gYmxraWZfYmFja2VuZF90eXBlIHsKKwlCTEtJRl9CQUNLRU5EX1BIWSAgPSAxLAorCUJMS0lGX0JBQ0tFTkRfRklMRSA9IDIsCit9OworCiBzdHJ1Y3QgeGVuX3ZiZCB7CiAJLyogV2hhdCB0aGUgZG9tYWluIHJlZmVycyB0byB0aGlzIHZiZCBhcy4gKi8KIAlibGtpZl92ZGV2X3QJCWhhbmRsZTsKQEAgLTEzNyw4ICsxNjgsOSBAQAogCXVuc2lnbmVkIGludAkJaXJxOwogCS8qIENvbW1zIGluZm9ybWF0aW9uLiAqLwogCWVudW0gYmxraWZfcHJvdG9jb2wJYmxrX3Byb3RvY29sOworCWVudW0gYmxraWZfYmFja2VuZF90eXBlIGJsa19iYWNrZW5kX3R5cGU7CiAJdW5pb24gYmxraWZfYmFja19yaW5ncwlibGtfcmluZ3M7Ci0Jc3RydWN0IHZtX3N0cnVjdAkqYmxrX3JpbmdfYXJlYTsKKwl2b2lkCQkJKmJsa19yaW5nOwogCS8qIFRoZSBWQkQgYXR0YWNoZWQgdG8gdGhpcyBpbnRlcmZhY2UuICovCiAJc3RydWN0IHhlbl92YmQJCXZiZDsKIAkvKiBCYWNrIHBvaW50ZXIgdG8gdGhlIGJhY2tlbmRfaW5mby4gKi8KQEAgLTE0OCw2ICsxODAsOSBAQAogCWF0b21pY190CQlyZWZjbnQ7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdAl3cTsKKwkvKiBmb3IgYmFycmllciAoZHJhaW4pIHJlcXVlc3RzICovCisJc3RydWN0IGNvbXBsZXRpb24JZHJhaW5fY29tcGxldGU7CisJYXRvbWljX3QJCWRyYWluOwogCS8qIE9uZSB0aHJlYWQgcGVyIG9uZSBibGtpZi4gKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnhlbmJsa2Q7CiAJdW5zaWduZWQgaW50CQl3YWl0aW5nX3JlcXM7CkBAIC0xNTgsMTMgKzE5MywxMSBAQAogCWludAkJCXN0X3dyX3JlcTsKIAlpbnQJCQlzdF9vb19yZXE7CiAJaW50CQkJc3RfZl9yZXE7CisJaW50CQkJc3RfZHNfcmVxOwogCWludAkJCXN0X3JkX3NlY3Q7CiAJaW50CQkJc3Rfd3Jfc2VjdDsKIAogCXdhaXRfcXVldWVfaGVhZF90CXdhaXRpbmdfdG9fZnJlZTsKLQotCWdyYW50X2hhbmRsZV90CQlzaG1lbV9oYW5kbGU7Ci0JZ3JhbnRfcmVmX3QJCXNobWVtX3JlZjsKIH07CiAKIApAQCAtMTgxLDcgKzIxNCw3IEBACiAKIHN0cnVjdCBwaHlzX3JlcSB7CiAJdW5zaWduZWQgc2hvcnQJCWRldjsKLQl1bnNpZ25lZCBzaG9ydAkJbnJfc2VjdHM7CisJYmxraWZfc2VjdG9yX3QJCW5yX3NlY3RzOwogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXY7CiAJYmxraWZfc2VjdG9yX3QJCXNlY3Rvcl9udW1iZXI7CiB9OwpAQCAtMTk1LDYgKzIyOCw4IEBACiBpbnQgeGVuX2Jsa2JrX2ZsdXNoX2Rpc2tjYWNoZShzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidCwKIAkJCSAgICAgIHN0cnVjdCBiYWNrZW5kX2luZm8gKmJlLCBpbnQgc3RhdGUpOwogCitpbnQgeGVuX2Jsa2JrX2JhcnJpZXIoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB4YnQsCisJCSAgICAgIHN0cnVjdCBiYWNrZW5kX2luZm8gKmJlLCBpbnQgc3RhdGUpOwogc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbl9ibGtia194ZW5idXMoc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYmxraWZfZ2V0X3g4Nl8zMl9yZXEoc3RydWN0IGJsa2lmX3JlcXVlc3QgKmRzdCwKQEAgLTIwNSwxMiArMjQwLDI1IEBACiAJZHN0LT5ucl9zZWdtZW50cyA9IHNyYy0+bnJfc2VnbWVudHM7CiAJZHN0LT5oYW5kbGUgPSBzcmMtPmhhbmRsZTsKIAlkc3QtPmlkID0gc3JjLT5pZDsKLQlkc3QtPnUucncuc2VjdG9yX251bWJlciA9IHNyYy0+c2VjdG9yX251bWJlcjsKLQliYXJyaWVyKCk7Ci0JaWYgKG4gPiBkc3QtPm5yX3NlZ21lbnRzKQotCQluID0gZHN0LT5ucl9zZWdtZW50czsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlkc3QtPnUucncuc2VnW2ldID0gc3JjLT5zZWdbaV07CisJc3dpdGNoIChzcmMtPm9wZXJhdGlvbikgeworCWNhc2UgQkxLSUZfT1BfUkVBRDoKKwljYXNlIEJMS0lGX09QX1dSSVRFOgorCWNhc2UgQkxLSUZfT1BfV1JJVEVfQkFSUklFUjoKKwljYXNlIEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKKwkJZHN0LT51LnJ3LnNlY3Rvcl9udW1iZXIgPSBzcmMtPnUucncuc2VjdG9yX251bWJlcjsKKwkJYmFycmllcigpOworCQlpZiAobiA+IGRzdC0+bnJfc2VnbWVudHMpCisJCQluID0gZHN0LT5ucl9zZWdtZW50czsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWRzdC0+dS5ydy5zZWdbaV0gPSBzcmMtPnUucncuc2VnW2ldOworCQlicmVhazsKKwljYXNlIEJMS0lGX09QX0RJU0NBUkQ6CisJCWRzdC0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIgPSBzcmMtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyOworCQlkc3QtPnUuZGlzY2FyZC5ucl9zZWN0b3JzID0gc3JjLT51LmRpc2NhcmQubnJfc2VjdG9yczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYmxraWZfZ2V0X3g4Nl82NF9yZXEoc3RydWN0IGJsa2lmX3JlcXVlc3QgKmRzdCwKQEAgLTIyMSwxMiArMjY5LDI1IEBACiAJZHN0LT5ucl9zZWdtZW50cyA9IHNyYy0+bnJfc2VnbWVudHM7CiAJZHN0LT5oYW5kbGUgPSBzcmMtPmhhbmRsZTsKIAlkc3QtPmlkID0gc3JjLT5pZDsKLQlkc3QtPnUucncuc2VjdG9yX251bWJlciA9IHNyYy0+c2VjdG9yX251bWJlcjsKLQliYXJyaWVyKCk7Ci0JaWYgKG4gPiBkc3QtPm5yX3NlZ21lbnRzKQotCQluID0gZHN0LT5ucl9zZWdtZW50czsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlkc3QtPnUucncuc2VnW2ldID0gc3JjLT5zZWdbaV07CisJc3dpdGNoIChzcmMtPm9wZXJhdGlvbikgeworCWNhc2UgQkxLSUZfT1BfUkVBRDoKKwljYXNlIEJMS0lGX09QX1dSSVRFOgorCWNhc2UgQkxLSUZfT1BfV1JJVEVfQkFSUklFUjoKKwljYXNlIEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKKwkJZHN0LT51LnJ3LnNlY3Rvcl9udW1iZXIgPSBzcmMtPnUucncuc2VjdG9yX251bWJlcjsKKwkJYmFycmllcigpOworCQlpZiAobiA+IGRzdC0+bnJfc2VnbWVudHMpCisJCQluID0gZHN0LT5ucl9zZWdtZW50czsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCWRzdC0+dS5ydy5zZWdbaV0gPSBzcmMtPnUucncuc2VnW2ldOworCQlicmVhazsKKwljYXNlIEJMS0lGX09QX0RJU0NBUkQ6CisJCWRzdC0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIgPSBzcmMtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyOworCQlkc3QtPnUuZGlzY2FyZC5ucl9zZWN0b3JzID0gc3JjLT51LmRpc2NhcmQubnJfc2VjdG9yczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogfQogCiAjZW5kaWYgLyogX19YRU5fQkxLSUZfX0JBQ0tFTkRfX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jCmluZGV4IDVmZDIwMTAuLmY3NTlhZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYwpAQCAtMTE0LDQ0ICsxMTQsMTQgQEAKIAlzcGluX2xvY2tfaW5pdCgmYmxraWYtPmJsa19yaW5nX2xvY2spOwogCWF0b21pY19zZXQoJmJsa2lmLT5yZWZjbnQsIDEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsa2lmLT53cSk7CisJaW5pdF9jb21wbGV0aW9uKCZibGtpZi0+ZHJhaW5fY29tcGxldGUpOworCWF0b21pY19zZXQoJmJsa2lmLT5kcmFpbiwgMCk7CiAJYmxraWYtPnN0X3ByaW50ID0gamlmZmllczsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibGtpZi0+d2FpdGluZ190b19mcmVlKTsKIAogCXJldHVybiBibGtpZjsKIH0KIAotc3RhdGljIGludCBtYXBfZnJvbnRlbmRfcGFnZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZSkKLXsKLQlzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgb3A7Ci0KLQlnbnR0YWJfc2V0X21hcF9vcCgmb3AsICh1bnNpZ25lZCBsb25nKWJsa2lmLT5ibGtfcmluZ19hcmVhLT5hZGRyLAotCQkJICBHTlRNQVBfaG9zdF9tYXAsIHNoYXJlZF9wYWdlLCBibGtpZi0+ZG9taWQpOwotCi0JaWYgKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfbWFwX2dyYW50X3JlZiwgJm9wLCAxKSkKLQkJQlVHKCk7Ci0KLQlpZiAob3Auc3RhdHVzKSB7Ci0JCURQUklOVEsoIkdyYW50IHRhYmxlIG9wZXJhdGlvbiBmYWlsdXJlICFcbiIpOwotCQlyZXR1cm4gb3Auc3RhdHVzOwotCX0KLQotCWJsa2lmLT5zaG1lbV9yZWYgPSBzaGFyZWRfcGFnZTsKLQlibGtpZi0+c2htZW1faGFuZGxlID0gb3AuaGFuZGxlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHVubWFwX2Zyb250ZW5kX3BhZ2Uoc3RydWN0IHhlbl9ibGtpZiAqYmxraWYpCi17Ci0Jc3RydWN0IGdudHRhYl91bm1hcF9ncmFudF9yZWYgb3A7Ci0KLQlnbnR0YWJfc2V0X3VubWFwX29wKCZvcCwgKHVuc2lnbmVkIGxvbmcpYmxraWYtPmJsa19yaW5nX2FyZWEtPmFkZHIsCi0JCQkgICAgR05UTUFQX2hvc3RfbWFwLCBibGtpZi0+c2htZW1faGFuZGxlKTsKLQotCWlmIChIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX3VubWFwX2dyYW50X3JlZiwgJm9wLCAxKSkKLQkJQlVHKCk7Ci19Ci0KIHN0YXRpYyBpbnQgeGVuX2Jsa2lmX21hcChzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZSwKIAkJCSB1bnNpZ25lZCBpbnQgZXZ0Y2huKQogewpAQCAtMTYxLDM1ICsxMzEsMjkgQEAKIAlpZiAoYmxraWYtPmlycSkKIAkJcmV0dXJuIDA7CiAKLQlibGtpZi0+YmxrX3JpbmdfYXJlYSA9IGFsbG9jX3ZtX2FyZWEoUEFHRV9TSVpFKTsKLQlpZiAoIWJsa2lmLT5ibGtfcmluZ19hcmVhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG1hcF9mcm9udGVuZF9wYWdlKGJsa2lmLCBzaGFyZWRfcGFnZSk7Ci0JaWYgKGVycikgewotCQlmcmVlX3ZtX2FyZWEoYmxraWYtPmJsa19yaW5nX2FyZWEpOworCWVyciA9IHhlbmJ1c19tYXBfcmluZ192YWxsb2MoYmxraWYtPmJlLT5kZXYsIHNoYXJlZF9wYWdlLCAmYmxraWYtPmJsa19yaW5nKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAlzd2l0Y2ggKGJsa2lmLT5ibGtfcHJvdG9jb2wpIHsKIAljYXNlIEJMS0lGX1BST1RPQ09MX05BVElWRToKIAl7CiAJCXN0cnVjdCBibGtpZl9zcmluZyAqc3Jpbmc7Ci0JCXNyaW5nID0gKHN0cnVjdCBibGtpZl9zcmluZyAqKWJsa2lmLT5ibGtfcmluZ19hcmVhLT5hZGRyOworCQlzcmluZyA9IChzdHJ1Y3QgYmxraWZfc3JpbmcgKilibGtpZi0+YmxrX3Jpbmc7CiAJCUJBQ0tfUklOR19JTklUKCZibGtpZi0+YmxrX3JpbmdzLm5hdGl2ZSwgc3JpbmcsIFBBR0VfU0laRSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIEJMS0lGX1BST1RPQ09MX1g4Nl8zMjoKIAl7CiAJCXN0cnVjdCBibGtpZl94ODZfMzJfc3JpbmcgKnNyaW5nX3g4Nl8zMjsKLQkJc3JpbmdfeDg2XzMyID0gKHN0cnVjdCBibGtpZl94ODZfMzJfc3JpbmcgKilibGtpZi0+YmxrX3JpbmdfYXJlYS0+YWRkcjsKKwkJc3JpbmdfeDg2XzMyID0gKHN0cnVjdCBibGtpZl94ODZfMzJfc3JpbmcgKilibGtpZi0+YmxrX3Jpbmc7CiAJCUJBQ0tfUklOR19JTklUKCZibGtpZi0+YmxrX3JpbmdzLng4Nl8zMiwgc3JpbmdfeDg2XzMyLCBQQUdFX1NJWkUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBCTEtJRl9QUk9UT0NPTF9YODZfNjQ6CiAJewogCQlzdHJ1Y3QgYmxraWZfeDg2XzY0X3NyaW5nICpzcmluZ194ODZfNjQ7Ci0JCXNyaW5nX3g4Nl82NCA9IChzdHJ1Y3QgYmxraWZfeDg2XzY0X3NyaW5nICopYmxraWYtPmJsa19yaW5nX2FyZWEtPmFkZHI7CisJCXNyaW5nX3g4Nl82NCA9IChzdHJ1Y3QgYmxraWZfeDg2XzY0X3NyaW5nICopYmxraWYtPmJsa19yaW5nOwogCQlCQUNLX1JJTkdfSU5JVCgmYmxraWYtPmJsa19yaW5ncy54ODZfNjQsIHNyaW5nX3g4Nl82NCwgUEFHRV9TSVpFKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjAxLDggKzE2NSw3IEBACiAJCQkJCQkgICAgeGVuX2Jsa2lmX2JlX2ludCwgMCwKIAkJCQkJCSAgICAiYmxraWYtYmFja2VuZCIsIGJsa2lmKTsKIAlpZiAoZXJyIDwgMCkgewotCQl1bm1hcF9mcm9udGVuZF9wYWdlKGJsa2lmKTsKLQkJZnJlZV92bV9hcmVhKGJsa2lmLT5ibGtfcmluZ19hcmVhKTsKKwkJeGVuYnVzX3VubWFwX3JpbmdfdmZyZWUoYmxraWYtPmJlLT5kZXYsIGJsa2lmLT5ibGtfcmluZyk7CiAJCWJsa2lmLT5ibGtfcmluZ3MuY29tbW9uLnNyaW5nID0gTlVMTDsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yMjgsOCArMTkxLDcgQEAKIAl9CiAKIAlpZiAoYmxraWYtPmJsa19yaW5ncy5jb21tb24uc3JpbmcpIHsKLQkJdW5tYXBfZnJvbnRlbmRfcGFnZShibGtpZik7Ci0JCWZyZWVfdm1fYXJlYShibGtpZi0+YmxrX3JpbmdfYXJlYSk7CisJCXhlbmJ1c191bm1hcF9yaW5nX3ZmcmVlKGJsa2lmLT5iZS0+ZGV2LCBibGtpZi0+YmxrX3JpbmcpOwogCQlibGtpZi0+YmxrX3JpbmdzLmNvbW1vbi5zcmluZyA9IE5VTEw7CiAJfQogfQpAQCAtMjcyLDYgKzIzNCw3IEBACiBWQkRfU0hPVyhyZF9yZXEsICAiJWRcbiIsIGJlLT5ibGtpZi0+c3RfcmRfcmVxKTsKIFZCRF9TSE9XKHdyX3JlcSwgICIlZFxuIiwgYmUtPmJsa2lmLT5zdF93cl9yZXEpOwogVkJEX1NIT1coZl9yZXEsICAiJWRcbiIsIGJlLT5ibGtpZi0+c3RfZl9yZXEpOworVkJEX1NIT1coZHNfcmVxLCAgIiVkXG4iLCBiZS0+YmxraWYtPnN0X2RzX3JlcSk7CiBWQkRfU0hPVyhyZF9zZWN0LCAiJWRcbiIsIGJlLT5ibGtpZi0+c3RfcmRfc2VjdCk7CiBWQkRfU0hPVyh3cl9zZWN0LCAiJWRcbiIsIGJlLT5ibGtpZi0+c3Rfd3Jfc2VjdCk7CiAKQEAgLTI4MCw2ICsyNDMsNyBAQAogCSZkZXZfYXR0cl9yZF9yZXEuYXR0ciwKIAkmZGV2X2F0dHJfd3JfcmVxLmF0dHIsCiAJJmRldl9hdHRyX2ZfcmVxLmF0dHIsCisJJmRldl9hdHRyX2RzX3JlcS5hdHRyLAogCSZkZXZfYXR0cl9yZF9zZWN0LmF0dHIsCiAJJmRldl9hdHRyX3dyX3NlY3QuYXR0ciwKIAlOVUxMCkBAIC00MTksNiArMzgzLDczIEBACiAJcmV0dXJuIGVycjsKIH0KIAoraW50IHhlbl9ibGtia19kaXNjYXJkKHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0LCBzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gYmUtPmRldjsKKwlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IGJlLT5ibGtpZjsKKwljaGFyICp0eXBlOworCWludCBlcnI7CisJaW50IHN0YXRlID0gMDsKKworCXR5cGUgPSB4ZW5idXNfcmVhZChYQlRfTklMLCBkZXYtPm5vZGVuYW1lLCAidHlwZSIsIE5VTEwpOworCWlmICghSVNfRVJSKHR5cGUpKSB7CisJCWlmIChzdHJuY21wKHR5cGUsICJmaWxlIiwgNCkgPT0gMCkgeworCQkJc3RhdGUgPSAxOworCQkJYmxraWYtPmJsa19iYWNrZW5kX3R5cGUgPSBCTEtJRl9CQUNLRU5EX0ZJTEU7CisJCX0KKwkJaWYgKHN0cm5jbXAodHlwZSwgInBoeSIsIDMpID09IDApIHsKKwkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiZS0+YmxraWYtPnZiZC5iZGV2OworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKwkJCWlmIChibGtfcXVldWVfZGlzY2FyZChxKSkgeworCQkJCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLAorCQkJCQkiZGlzY2FyZC1ncmFudWxhcml0eSIsICIldSIsCisJCQkJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5KTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsCisJCQkJCQkid3JpdGluZyBkaXNjYXJkLWdyYW51bGFyaXR5Iik7CisJCQkJCWdvdG8ga2ZyZWU7CisJCQkJfQorCQkJCWVyciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLAorCQkJCQkiZGlzY2FyZC1hbGlnbm1lbnQiLCAiJXUiLAorCQkJCQlxLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwKKwkJCQkJCSJ3cml0aW5nIGRpc2NhcmQtYWxpZ25tZW50Iik7CisJCQkJCWdvdG8ga2ZyZWU7CisJCQkJfQorCQkJCXN0YXRlID0gMTsKKwkJCQlibGtpZi0+YmxrX2JhY2tlbmRfdHlwZSA9IEJMS0lGX0JBQ0tFTkRfUEhZOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gUFRSX0VSUih0eXBlKTsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgInJlYWRpbmcgdHlwZSIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgImZlYXR1cmUtZGlzY2FyZCIsCisJCQkgICAgIiVkIiwgc3RhdGUpOworCWlmIChlcnIpCisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJ3cml0aW5nIGZlYXR1cmUtZGlzY2FyZCIpOwora2ZyZWU6CisJa2ZyZWUodHlwZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK2ludCB4ZW5fYmxrYmtfYmFycmllcihzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidCwKKwkJICAgICAgc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gYmUtPmRldjsKKwlpbnQgZXJyOworCisJZXJyID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsICJmZWF0dXJlLWJhcnJpZXIiLAorCQkJICAgICIlZCIsIHN0YXRlKTsKKwlpZiAoZXJyKQorCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLCAid3JpdGluZyBmZWF0dXJlLWJhcnJpZXIiKTsKKworCXJldHVybiBlcnI7Cit9CisKIC8qCiAgKiBFbnRyeSBwb2ludCB0byB0aGlzIGNvZGUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY3JlYXRlZC4gIEFsbG9jYXRlIHRoZSBiYXNpYwogICogc3RydWN0dXJlcywgYW5kIHdhdGNoIHRoZSBzdG9yZSB3YWl0aW5nIGZvciB0aGUgaG90cGx1ZyBzY3JpcHRzIHRvIHRlbGwgdXMKQEAgLTY1MCw2ICs2ODEsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGFib3J0OwogCisJZXJyID0geGVuX2Jsa2JrX2Rpc2NhcmQoeGJ0LCBiZSk7CisKKwkvKiBJZiB3ZSBjYW4ndCBhZHZlcnRpc2UgaXQgaXMgT0suICovCisJZXJyID0geGVuX2Jsa2JrX2JhcnJpZXIoeGJ0LCBiZSwgYmUtPmJsa2lmLT52YmQuZmx1c2hfc3VwcG9ydCk7CisKIAllcnIgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInNlY3RvcnMiLCAiJWxsdSIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2YmRfc3ooJmJlLT5ibGtpZi0+dmJkKSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggOWVhOGMyNS4uN2IyZWM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCkBAIC05OCw2ICs5OCw5IEBACiAJdW5zaWduZWQgbG9uZyBzaGFkb3dfZnJlZTsKIAl1bnNpZ25lZCBpbnQgZmVhdHVyZV9mbHVzaDsKIAl1bnNpZ25lZCBpbnQgZmx1c2hfb3A7CisJdW5zaWduZWQgaW50IGZlYXR1cmVfZGlzY2FyZDsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9ncmFudWxhcml0eTsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZF9hbGlnbm1lbnQ7CiAJaW50IGlzX3JlYWR5OwogfTsKIApAQCAtMzAyLDI5ICszMDUsMzYgQEAKIAkJcmluZ19yZXEtPm9wZXJhdGlvbiA9IGluZm8tPmZsdXNoX29wOwogCX0KIAotCXJpbmdfcmVxLT5ucl9zZWdtZW50cyA9IGJsa19ycV9tYXBfc2cocmVxLT5xLCByZXEsIGluZm8tPnNnKTsKLQlCVUdfT04ocmluZ19yZXEtPm5yX3NlZ21lbnRzID4gQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUKTsKKwlpZiAodW5saWtlbHkocmVxLT5jbWRfZmxhZ3MgJiBSRVFfRElTQ0FSRCkpIHsKKwkJLyogaWQsIHNlY3Rvcl9udW1iZXIgYW5kIGhhbmRsZSBhcmUgc2V0IGFib3ZlLiAqLworCQlyaW5nX3JlcS0+b3BlcmF0aW9uID0gQkxLSUZfT1BfRElTQ0FSRDsKKwkJcmluZ19yZXEtPm5yX3NlZ21lbnRzID0gMDsKKwkJcmluZ19yZXEtPnUuZGlzY2FyZC5ucl9zZWN0b3JzID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKKwl9IGVsc2UgeworCQlyaW5nX3JlcS0+bnJfc2VnbWVudHMgPSBibGtfcnFfbWFwX3NnKHJlcS0+cSwgcmVxLCBpbmZvLT5zZyk7CisJCUJVR19PTihyaW5nX3JlcS0+bnJfc2VnbWVudHMgPiBCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1QpOwogCi0JZm9yX2VhY2hfc2coaW5mby0+c2csIHNnLCByaW5nX3JlcS0+bnJfc2VnbWVudHMsIGkpIHsKLQkJYnVmZmVyX21mbiA9IHBmbl90b19tZm4ocGFnZV90b19wZm4oc2dfcGFnZShzZykpKTsKLQkJZnNlY3QgPSBzZy0+b2Zmc2V0ID4+IDk7Ci0JCWxzZWN0ID0gZnNlY3QgKyAoc2ctPmxlbmd0aCA+PiA5KSAtIDE7Ci0JCS8qIGluc3RhbGwgYSBncmFudCByZWZlcmVuY2UuICovCi0JCXJlZiA9IGdudHRhYl9jbGFpbV9ncmFudF9yZWZlcmVuY2UoJmdyZWZfaGVhZCk7Ci0JCUJVR19PTihyZWYgPT0gLUVOT1NQQyk7CisJCWZvcl9lYWNoX3NnKGluZm8tPnNnLCBzZywgcmluZ19yZXEtPm5yX3NlZ21lbnRzLCBpKSB7CisJCQlidWZmZXJfbWZuID0gcGZuX3RvX21mbihwYWdlX3RvX3BmbihzZ19wYWdlKHNnKSkpOworCQkJZnNlY3QgPSBzZy0+b2Zmc2V0ID4+IDk7CisJCQlsc2VjdCA9IGZzZWN0ICsgKHNnLT5sZW5ndGggPj4gOSkgLSAxOworCQkJLyogaW5zdGFsbCBhIGdyYW50IHJlZmVyZW5jZS4gKi8KKwkJCXJlZiA9IGdudHRhYl9jbGFpbV9ncmFudF9yZWZlcmVuY2UoJmdyZWZfaGVhZCk7CisJCQlCVUdfT04ocmVmID09IC1FTk9TUEMpOwogCi0JCWdudHRhYl9ncmFudF9mb3JlaWduX2FjY2Vzc19yZWYoCi0JCQkJcmVmLAotCQkJCWluZm8tPnhiZGV2LT5vdGhlcmVuZF9pZCwKLQkJCQlidWZmZXJfbWZuLAotCQkJCXJxX2RhdGFfZGlyKHJlcSkgKTsKKwkJCWdudHRhYl9ncmFudF9mb3JlaWduX2FjY2Vzc19yZWYoCisJCQkJCXJlZiwKKwkJCQkJaW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLAorCQkJCQlidWZmZXJfbWZuLAorCQkJCQlycV9kYXRhX2RpcihyZXEpKTsKIAotCQlpbmZvLT5zaGFkb3dbaWRdLmZyYW1lW2ldID0gbWZuX3RvX3BmbihidWZmZXJfbWZuKTsKLQkJcmluZ19yZXEtPnUucncuc2VnW2ldID0KLQkJCQkoc3RydWN0IGJsa2lmX3JlcXVlc3Rfc2VnbWVudCkgewotCQkJCQkuZ3JlZiAgICAgICA9IHJlZiwKLQkJCQkJLmZpcnN0X3NlY3QgPSBmc2VjdCwKLQkJCQkJLmxhc3Rfc2VjdCAgPSBsc2VjdCB9OworCQkJaW5mby0+c2hhZG93W2lkXS5mcmFtZVtpXSA9IG1mbl90b19wZm4oYnVmZmVyX21mbik7CisJCQlyaW5nX3JlcS0+dS5ydy5zZWdbaV0gPQorCQkJCQkoc3RydWN0IGJsa2lmX3JlcXVlc3Rfc2VnbWVudCkgeworCQkJCQkJLmdyZWYgICAgICAgPSByZWYsCisJCQkJCQkuZmlyc3Rfc2VjdCA9IGZzZWN0LAorCQkJCQkJLmxhc3Rfc2VjdCAgPSBsc2VjdCB9OworCQl9CiAJfQogCiAJaW5mby0+cmluZy5yZXFfcHJvZF9wdnQrKzsKQEAgLTM3MCw3ICszODAsOSBAQAogCiAJCWJsa19zdGFydF9yZXF1ZXN0KHJlcSk7CiAKLQkJaWYgKHJlcS0+Y21kX3R5cGUgIT0gUkVRX1RZUEVfRlMpIHsKKwkJaWYgKChyZXEtPmNtZF90eXBlICE9IFJFUV9UWVBFX0ZTKSB8fAorCQkgICAgKChyZXEtPmNtZF9mbGFncyAmIChSRVFfRkxVU0ggfCBSRVFfRlVBKSkgJiYKKwkJICAgICFpbmZvLT5mbHVzaF9vcCkpIHsKIAkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQkJY29udGludWU7CiAJCX0KQEAgLTM5OSw2ICs0MTEsNyBAQAogc3RhdGljIGludCB4bHZiZF9pbml0X2Jsa19xdWV1ZShzdHJ1Y3QgZ2VuZGlzayAqZ2QsIHUxNiBzZWN0b3Jfc2l6ZSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnE7CisJc3RydWN0IGJsa2Zyb250X2luZm8gKmluZm8gPSBnZC0+cHJpdmF0ZV9kYXRhOwogCiAJcnEgPSBibGtfaW5pdF9xdWV1ZShkb19ibGtpZl9yZXF1ZXN0LCAmYmxraWZfaW9fbG9jayk7CiAJaWYgKHJxID09IE5VTEwpCkBAIC00MDYsNiArNDE5LDEzIEBACiAKIAlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1ZJUlQsIHJxKTsKIAorCWlmIChpbmZvLT5mZWF0dXJlX2Rpc2NhcmQpIHsKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBycSk7CisJCWJsa19xdWV1ZV9tYXhfZGlzY2FyZF9zZWN0b3JzKHJxLCBnZXRfY2FwYWNpdHkoZ2QpKTsKKwkJcnEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gaW5mby0+ZGlzY2FyZF9ncmFudWxhcml0eTsKKwkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRpc2NhcmRfYWxpZ25tZW50OworCX0KKwogCS8qIEhhcmQgc2VjdG9yIHNpemUgYW5kIG1heCBzZWN0b3JzIGltcGVyc29uYXRlIHRoZSBlcXVpdi4gaGFyZHdhcmUuICovCiAJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShycSwgc2VjdG9yX3NpemUpOwogCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhycSwgNTEyKTsKQEAgLTcyMiw2ICs3NDIsMTcgQEAKIAogCQllcnJvciA9IChicmV0LT5zdGF0dXMgPT0gQkxLSUZfUlNQX09LQVkpID8gMCA6IC1FSU87CiAJCXN3aXRjaCAoYnJldC0+b3BlcmF0aW9uKSB7CisJCWNhc2UgQkxLSUZfT1BfRElTQ0FSRDoKKwkJCWlmICh1bmxpa2VseShicmV0LT5zdGF0dXMgPT0gQkxLSUZfUlNQX0VPUE5PVFNVUFApKSB7CisJCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxID0gaW5mby0+cnE7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmxrZnJvbnQ6ICVzOiBkaXNjYXJkIG9wIGZhaWxlZFxuIiwKKwkJCQkJICAgaW5mby0+Z2QtPmRpc2tfbmFtZSk7CisJCQkJZXJyb3IgPSAtRU9QTk9UU1VQUDsKKwkJCQlpbmZvLT5mZWF0dXJlX2Rpc2NhcmQgPSAwOworCQkJCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19ESVNDQVJELCBycSk7CisJCQl9CisJCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCBlcnJvcik7CisJCQlicmVhazsKIAkJY2FzZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEU6CiAJCWNhc2UgQkxLSUZfT1BfV1JJVEVfQkFSUklFUjoKIAkJCWlmICh1bmxpa2VseShicmV0LT5zdGF0dXMgPT0gQkxLSUZfUlNQX0VPUE5PVFNVUFApKSB7CkBAIC0xMDk4LDYgKzExMjksMzMgQEAKIAliZHB1dChiZGV2KTsKIH0KIAorc3RhdGljIHZvaWQgYmxrZnJvbnRfc2V0dXBfZGlzY2FyZChzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyOworCWNoYXIgKnR5cGU7CisJdW5zaWduZWQgaW50IGRpc2NhcmRfZ3JhbnVsYXJpdHk7CisJdW5zaWduZWQgaW50IGRpc2NhcmRfYWxpZ25tZW50OworCisJdHlwZSA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwgInR5cGUiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHR5cGUpKQorCQlyZXR1cm47CisKKwlpZiAoc3RybmNtcCh0eXBlLCAicGh5IiwgMykgPT0gMCkgeworCQllcnIgPSB4ZW5idXNfZ2F0aGVyKFhCVF9OSUwsIGluZm8tPnhiZGV2LT5vdGhlcmVuZCwKKwkJCSJkaXNjYXJkLWdyYW51bGFyaXR5IiwgIiV1IiwgJmRpc2NhcmRfZ3JhbnVsYXJpdHksCisJCQkiZGlzY2FyZC1hbGlnbm1lbnQiLCAiJXUiLCAmZGlzY2FyZF9hbGlnbm1lbnQsCisJCQlOVUxMKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWluZm8tPmZlYXR1cmVfZGlzY2FyZCA9IDE7CisJCQlpbmZvLT5kaXNjYXJkX2dyYW51bGFyaXR5ID0gZGlzY2FyZF9ncmFudWxhcml0eTsKKwkJCWluZm8tPmRpc2NhcmRfYWxpZ25tZW50ID0gZGlzY2FyZF9hbGlnbm1lbnQ7CisJCX0KKwl9IGVsc2UgaWYgKHN0cm5jbXAodHlwZSwgImZpbGUiLCA0KSA9PSAwKQorCQlpbmZvLT5mZWF0dXJlX2Rpc2NhcmQgPSAxOworCisJa2ZyZWUodHlwZSk7Cit9CisKIC8qCiAgKiBJbnZva2VkIHdoZW4gdGhlIGJhY2tlbmQgaXMgZmluYWxseSAncmVhZHknIChhbmQgaGFzIHRvbGQgcHJvZHVjZWQKICAqIHRoZSBkZXRhaWxzIGFib3V0IHRoZSBwaHlzaWNhbCBkZXZpY2UgLSAjc2VjdG9ycywgc2l6ZSwgZXRjKS4KQEAgLTExMDgsNyArMTE2Niw3IEBACiAJdW5zaWduZWQgbG9uZyBzZWN0b3Jfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgYmluZm87CiAJaW50IGVycjsKLQlpbnQgYmFycmllciwgZmx1c2g7CisJaW50IGJhcnJpZXIsIGZsdXNoLCBkaXNjYXJkOwogCiAJc3dpdGNoIChpbmZvLT5jb25uZWN0ZWQpIHsKIAljYXNlIEJMS0lGX1NUQVRFX0NPTk5FQ1RFRDoKQEAgLTExNzgsNyArMTIzNiwxNCBAQAogCQlpbmZvLT5mZWF0dXJlX2ZsdXNoID0gUkVRX0ZMVVNIOwogCQlpbmZvLT5mbHVzaF9vcCA9IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRTsKIAl9Ci0JCQorCisJZXJyID0geGVuYnVzX2dhdGhlcihYQlRfTklMLCBpbmZvLT54YmRldi0+b3RoZXJlbmQsCisJCQkgICAgImZlYXR1cmUtZGlzY2FyZCIsICIlZCIsICZkaXNjYXJkLAorCQkJICAgIE5VTEwpOworCisJaWYgKCFlcnIgJiYgZGlzY2FyZCkKKwkJYmxrZnJvbnRfc2V0dXBfZGlzY2FyZChpbmZvKTsKKwogCWVyciA9IHhsdmJkX2FsbG9jX2dlbmRpc2soc2VjdG9ycywgaW5mbywgYmluZm8sIHNlY3Rvcl9zaXplKTsKIAlpZiAoZXJyKSB7CiAJCXhlbmJ1c19kZXZfZmF0YWwoaW5mby0+eGJkZXYsIGVyciwgInhsdmJkX2FkZCBhdCAlcyIsCkBAIC0xMzg1LDYgKzE0NTAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4bGJsa19pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTM5NCw3ICsxNDYxLDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJldHVybiB4ZW5idXNfcmVnaXN0ZXJfZnJvbnRlbmQoJmJsa2Zyb250KTsKKwlyZXQgPSB4ZW5idXNfcmVnaXN0ZXJfZnJvbnRlbmQoJmJsa2Zyb250KTsKKwlpZiAocmV0KSB7CisJCXVucmVnaXN0ZXJfYmxrZGV2KFhFTlZCRF9NQUpPUiwgREVWX05BTUUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogbW9kdWxlX2luaXQoeGxibGtfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jCmluZGV4IDU0OGQxZDkuLmE4OGE3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYwpAQCAtMTgsNiArMTgsOCBAQAogICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLgogICoqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKaW5kZXggMzdiNTYzOS4uMjdiNzRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jCmluZGV4IDA0ZDM1M2YuLmI1ZjgzYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR3aWxpbmsuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpLmg+CiAKICNpbmNsdWRlIDxsaW51eC90aV93aWxpbmtfc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQmx1ZXRvb3RoIERyaXZlciBWZXJzaW9uICovCiAjZGVmaW5lIFZFUlNJT04gICAgICAgICAgICAgICAiMS4wIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA0MjNmZDU2Li40MzY0MzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtMjk4LDcgKzI5OCw3IEBACiBjb25maWcgUlRDCiAJdHJpc3RhdGUgIkVuaGFuY2VkIFJlYWwgVGltZSBDbG9jayBTdXBwb3J0IChsZWdhY3kgUEMgUlRDIGRyaXZlcikiCiAJZGVwZW5kcyBvbiAhUFBDICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsgJiYgIVNQQVJDICYmICFGUlYgXAotCQkJJiYgIUFSTSAmJiAhU1VQRVJIICYmICFTMzkwICYmICFBVlIzMiAmJiAhQkxBQ0tGSU4KKwkJCSYmICFBUk0gJiYgIVNVUEVSSCAmJiAhUzM5MCAmJiAhQVZSMzIgJiYgIUJMQUNLRklOICYmICFVTUwKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogY29uZmlnIEdFTl9SVEMKIAl0cmlzdGF0ZSAiR2VuZXJpYyAvZGV2L3J0YyBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhTTMyUiAmJiAhTUlQUyAmJiAhU1BBUkMgJiYgIUZSViAmJiAhUzM5MCAmJiAhU1VQRVJIICYmICFBVlIzMiAmJiAhQkxBQ0tGSU4KKwlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFNSVBTICYmICFTUEFSQyAmJiAhRlJWICYmICFTMzkwICYmICFTVVBFUkggJiYgIUFWUjMyICYmICFCTEFDS0ZJTiAmJiAhVU1MCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAogCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQpAQCAtNDkwLDcgKzQ5MCw3IEBACiAKIGNvbmZpZyBQQzg3MzZ4X0dQSU8KIAl0cmlzdGF0ZSAiTmF0U2VtaSBQQzg3MzZ4IEdQSU8gU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFg4Nl8zMgorCWRlcGVuZHMgb24gWDg2XzMyICYmICFVTUwKIAlkZWZhdWx0IFNDeDIwMF9HUElPCSMgbW9zdGx5IE4KIAlzZWxlY3QgTlNDX0dQSU8JCSMgbmVlZGVkIGZvciBzdXBwb3J0IHJvdXRpbmVzCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKaW5kZXggMDU2YjI4OS4uMzY5NTc3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCkBAIC0zMzYsNyArMzM2LDggQEAKIAlvZmZfdCBqLCBpb19wZ19zdGFydDsKIAlpbnQgaW9fcGdfY291bnQ7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJaWYgKHR5cGUgIT0gbWVtLT50eXBlIHx8CisJCWFncF9icmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGFncF9icmlkZ2UsIHR5cGUpKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzgwLDcgKzM4MSw4IEBACiAJc3RydWN0IF9ocF9wcml2YXRlICpocCA9ICZocF9wcml2YXRlOwogCWludCBpLCBpb19wZ19zdGFydCwgaW9fcGdfY291bnQ7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJaWYgKHR5cGUgIT0gbWVtLT50eXBlIHx8CisJCWFncF9icmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGFncF9icmlkZ2UsIHR5cGUpKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKaW5kZXggMjc3NGFjMS4uYzkyNDI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCkBAIC05MjMsNiArOTIzLDkgQEAKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAorCWlmIChpbnRlbF9wcml2YXRlLmJhc2UuZG9faWRsZV9tYXBzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChpbnRlbF9wcml2YXRlLmNsZWFyX2Zha2VfYWdwKSB7CiAJCWludCBzdGFydCA9IGludGVsX3ByaXZhdGUuYmFzZS5zdG9sZW5fc2l6ZSAvIFBBR0VfU0laRTsKIAkJaW50IGVuZCA9IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfbWFwcGFibGVfZW50cmllczsKQEAgLTk4NSw2ICs5ODgsOSBAQAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoaW50ZWxfcHJpdmF0ZS5iYXNlLmRvX2lkbGVfbWFwcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpbnRlbF9ndHRfY2xlYXJfcmFuZ2UocGdfc3RhcnQsIG1lbS0+cGFnZV9jb3VudCk7CiAKIAlpZiAoaW50ZWxfcHJpdmF0ZS5iYXNlLm5lZWRzX2RtYXIpIHsKQEAgLTExNzcsNiArMTE4MywyNiBAQAogewogfQogCisvKiBDZXJ0YWluIEdlbjUgY2hpcHNldHMgcmVxdWlyZSByZXF1aXJlIGlkbGluZyB0aGUgR1BVIGJlZm9yZQorICogdW5tYXBwaW5nIGFueXRoaW5nIGZyb20gdGhlIEdUVCB3aGVuIFZULWQgaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmVlZHNfaWRsZV9tYXBzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0lOVEVMX0lPTU1VCisJY29uc3QgdW5zaWduZWQgc2hvcnQgZ3B1X2RldmlkID0gaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldmljZTsKKwlleHRlcm4gaW50IGludGVsX2lvbW11X2dmeF9tYXBwZWQ7CisKKwkvKiBRdWVyeSBpbnRlbF9pb21tdSB0byBzZWUgaWYgd2UgbmVlZCB0aGUgd29ya2Fyb3VuZC4gUHJlc3VtYWJseSB0aGF0CisJICogd2FzIGxvYWRlZCBmaXJzdC4KKwkgKi8KKwlpZiAoKGdwdV9kZXZpZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSEIgfHwKKwkgICAgIGdwdV9kZXZpZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSUcpICYmCisJICAgICBpbnRlbF9pb21tdV9nZnhfbWFwcGVkKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGk5eHhfc2V0dXAodm9pZCkKIHsKIAl1MzIgcmVnX2FkZHI7CkBAIC0xMjExLDYgKzEyMzcsOSBAQAogCQlpbnRlbF9wcml2YXRlLmd0dF9idXNfYWRkciA9IHJlZ19hZGRyICsgZ3R0X29mZnNldDsKIAl9CiAKKwlpZiAobmVlZHNfaWRsZV9tYXBzKCkpCisJCWludGVsX3ByaXZhdGUuYmFzZS5kb19pZGxlX21hcHMgPSAxOworCiAJaW50ZWxfaTl4eF9zZXR1cF9mbHVzaCgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKaW5kZXggMWQyZWJjNy4uMDY4OWJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwpAQCAtNjAsNiArNjAsMTkgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIEhXX1JBTkRPTV9BVE1FTAorCXRyaXN0YXRlICJBdG1lbCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIEFSQ0hfQVQ5MVNBTTlHNDUKKwlkZWZhdWx0IEhXX1JBTkRPTQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBSYW5kb20gTnVtYmVyCisJICBHZW5lcmF0b3IgaGFyZHdhcmUgZm91bmQgb24gQXRtZWwgQVQ5MSBkZXZpY2VzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhdG1lbC1ybmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKIGNvbmZpZyBIV19SQU5ET01fR0VPREUKIAl0cmlzdGF0ZSAiQU1EIEdlb2RlIEhXIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgWDg2XzMyICYmIFBDSQpAQCAtMjIyLDMgKzIzNSwxOCBAQAogCSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHBjNHh4LXJuZy4KIAogCSBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVU1MX1JBTkRPTQorCWRlcGVuZHMgb24gVU1MCisJdHJpc3RhdGUgIkhhcmR3YXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgVU1MJ3MgImhhcmR3YXJlIiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gIEl0CisJICBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGhvc3QncyAvZGV2L3JhbmRvbSwgc3VwcGx5aW5nIGFzIG11Y2ggZW50cm9weQorCSAgYXMgdGhlIGhvc3QgaGFzLCByYXRoZXIgdGhhbiB0aGUgc21hbGwgYW1vdW50IHRoZSBVTUwgZ2V0cyBmcm9tIGl0cworCSAgb3duIGRyaXZlcnMuICBJdCByZWdpc3RlcnMgaXRzZWxmIGFzIGEgc3RhbmRhcmQgaGFyZHdhcmUgcmFuZG9tIG51bWJlcgorCSAgZ2VuZXJhdG9yLCBtYWpvciAxMCwgbWlub3IgMTgzLCBhbmQgdGhlIGNhbm9uaWNhbCBkZXZpY2UgbmFtZSBpcworCSAgL2Rldi9od3JuZy4KKwkgIFRoZSB3YXkgdG8gbWFrZSB1c2Ugb2YgdGhpcyBpcyB0byBpbnN0YWxsIHRoZSBybmctdG9vbHMgcGFja2FnZQorCSAgKGNoZWNrIHlvdXIgZGlzdHJvLCBvciBkb3dubG9hZCBmcm9tCisJICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2drZXJuZWwvKS4gIHJuZ2QgcGVyaW9kaWNhbGx5IHJlYWRzCisJICAvZGV2L2h3cm5nIGFuZCBpbmplY3RzIHRoZSBlbnRyb3B5IGludG8gL2Rldi9yYW5kb20uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQppbmRleCBjODhmMjQ0Li5iMmZmNTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiBvYmotJChDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0pICs9IHRpbWVyaW9tZW0tcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fSU5URUwpICs9IGludGVsLXJuZy5vCiBvYmotJChDT05GSUdfSFdfUkFORE9NX0FNRCkgKz0gYW1kLXJuZy5vCitvYmotJChDT05GSUdfSFdfUkFORE9NX0FUTUVMKSArPSBhdG1lbC1ybmcubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9HRU9ERSkgKz0gZ2VvZGUtcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fTjJSTkcpICs9IG4yLXJuZy5vCiBuMi1ybmcteSA6PSBuMi1kcnYubyBuMi1hc20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9hdG1lbC1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vYXRtZWwtcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxZGYyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vYXRtZWwtcm5nLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGV0ZXIgS29yc2dhYXJkIDxqYWNtZXRAc3Vuc2l0ZS5kaz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgVFJOR19DUgkJMHgwMAorI2RlZmluZSBUUk5HX0lTUgkweDFjCisjZGVmaW5lIFRSTkdfT0RBVEEJMHg1MAorCisjZGVmaW5lIFRSTkdfS0VZCTB4NTI0ZTQ3MDAgLyogUk5HICovCisKK3N0cnVjdCBhdG1lbF90cm5nIHsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBod3JuZyBybmc7Cit9OworCitzdGF0aWMgaW50IGF0bWVsX3RybmdfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdm9pZCAqYnVmLCBzaXplX3QgbWF4LAorCQkJICAgYm9vbCB3YWl0KQoreworCXN0cnVjdCBhdG1lbF90cm5nICp0cm5nID0gY29udGFpbmVyX29mKHJuZywgc3RydWN0IGF0bWVsX3RybmcsIHJuZyk7CisJdTMyICpkYXRhID0gYnVmOworCisJLyogZGF0YSByZWFkeT8gKi8KKwlpZiAocmVhZGwodHJuZy0+YmFzZSArIFRSTkdfT0RBVEEpICYgMSkgeworCQkqZGF0YSA9IHJlYWRsKHRybmctPmJhc2UgKyBUUk5HX09EQVRBKTsKKwkJcmV0dXJuIDQ7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3RybmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfdHJuZyAqdHJuZzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0cm5nID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdHJuZyksIEdGUF9LRVJORUwpOworCWlmICghdHJuZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJdHJuZy0+YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghdHJuZy0+YmFzZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRybmctPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUih0cm5nLT5jbGspKQorCQlyZXR1cm4gUFRSX0VSUih0cm5nLT5jbGspOworCisJcmV0ID0gY2xrX2VuYWJsZSh0cm5nLT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2VuYWJsZTsKKworCXdyaXRlbChUUk5HX0tFWSB8IDEsIHRybmctPmJhc2UgKyBUUk5HX0NSKTsKKwl0cm5nLT5ybmcubmFtZSA9IHBkZXYtPm5hbWU7CisJdHJuZy0+cm5nLnJlYWQgPSBhdG1lbF90cm5nX3JlYWQ7CisKKwlyZXQgPSBod3JuZ19yZWdpc3RlcigmdHJuZy0+cm5nKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRybmcpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjoKKwljbGtfZGlzYWJsZSh0cm5nLT5jbGspOworZXJyX2VuYWJsZToKKwljbGtfcHV0KHRybmctPmNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdG1lbF90cm5nX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdG1lbF90cm5nICp0cm5nID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlod3JuZ191bnJlZ2lzdGVyKCZ0cm5nLT5ybmcpOworCisJd3JpdGVsKFRSTkdfS0VZLCB0cm5nLT5iYXNlICsgVFJOR19DUik7CisJY2xrX2Rpc2FibGUodHJuZy0+Y2xrKTsKKwljbGtfcHV0KHRybmctPmNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF0bWVsX3Rybmdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3RybmcgKnRybmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNsa19kaXNhYmxlKHRybmctPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF90cm5nX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3RybmcgKnRybmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBjbGtfZW5hYmxlKHRybmctPmNsayk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdG1lbF90cm5nX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGF0bWVsX3Rybmdfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0bWVsX3RybmdfcmVzdW1lLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXRtZWxfdHJuZ19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF0bWVsX3RybmdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdG1lbF90cm5nX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF0bWVsLXRybmciLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCT0gJmF0bWVsX3RybmdfcG1fb3BzLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdG1lbF90cm5nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdG1lbF90cm5nX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdG1lbF90cm5nX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfdHJuZ19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0bWVsX3RybmdfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGF0bWVsX3RybmdfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF0bWVsIHRydWUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3ZpcnRpby1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCmluZGV4IDc1ZjFjYmQuLmZkNjk5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlydGlvLXJuZy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fcm5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YV9hdmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA4ZmMwNGI0Li4xNDUxNzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jIGIvZHJpdmVycy9jaGFyL3BzM2ZsYXNoLmMKaW5kZXggZDBjNTdjMi4uNmFiZGRlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BzM2ZsYXNoLmMKKysrIGIvZHJpdmVycy9jaGFyL3BzM2ZsYXNoLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMgYi9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCmluZGV4IDgxMGFmZjkuLjdjN2Y0MmExZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbW9vcHMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IGMzNWE3ODUuLjYzZTE5YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW5kb20uYworKysgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKQEAgLTkzMiw3ICs5MzIsMjEgQEAKICAqLwogdm9pZCBnZXRfcmFuZG9tX2J5dGVzKHZvaWQgKmJ1ZiwgaW50IG5ieXRlcykKIHsKLQlleHRyYWN0X2VudHJvcHkoJm5vbmJsb2NraW5nX3Bvb2wsIGJ1ZiwgbmJ5dGVzLCAwLCAwKTsKKwljaGFyICpwID0gYnVmOworCisJd2hpbGUgKG5ieXRlcykgeworCQl1bnNpZ25lZCBsb25nIHY7CisJCWludCBjaHVuayA9IG1pbihuYnl0ZXMsIChpbnQpc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJCisJCWlmICghYXJjaF9nZXRfcmFuZG9tX2xvbmcoJnYpKQorCQkJYnJlYWs7CisJCQorCQltZW1jcHkoYnVmLCAmdiwgY2h1bmspOworCQlwICs9IGNodW5rOworCQluYnl0ZXMgLT0gY2h1bms7CisJfQorCisJZXh0cmFjdF9lbnRyb3B5KCZub25ibG9ja2luZ19wb29sLCBwLCBuYnl0ZXMsIDAsIDApOwogfQogRVhQT1JUX1NZTUJPTChnZXRfcmFuZG9tX2J5dGVzKTsKIApAQCAtMTMxOCw5ICsxMzMyLDE0IEBACiBERUZJTkVfUEVSX0NQVShfX3UzMiBbTUQ1X0RJR0VTVF9XT1JEU10sIGdldF9yYW5kb21faW50X2hhc2gpOwogdW5zaWduZWQgaW50IGdldF9yYW5kb21faW50KHZvaWQpCiB7Ci0JX191MzIgKmhhc2ggPSBnZXRfY3B1X3ZhcihnZXRfcmFuZG9tX2ludF9oYXNoKTsKKwlfX3UzMiAqaGFzaDsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCisJaWYgKGFyY2hfZ2V0X3JhbmRvbV9pbnQoJnJldCkpCisJCXJldHVybiByZXQ7CisKKwloYXNoID0gZ2V0X2NwdV92YXIoZ2V0X3JhbmRvbV9pbnRfaGFzaCk7CisKIAloYXNoWzBdICs9IGN1cnJlbnQtPnBpZCArIGppZmZpZXMgKyBnZXRfY3ljbGVzKCk7CiAJbWQ1X3RyYW5zZm9ybShoYXNoLCByYW5kb21faW50X3NlY3JldCk7CiAJcmV0ID0gaGFzaFswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlwcmludGsuYyBiL2RyaXZlcnMvY2hhci90dHlwcmludGsuYwppbmRleCBhMWY2OGFmLi5lZWRkNTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5cHJpbnRrLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0cnVjdCB0dHlwcmludGtfcG9ydCB7CiAJc3RydWN0IHR0eV9wb3J0IHBvcnQ7CkBAIC0xNzAsNyArMTcxLDcgQEAKIAkuaW9jdGwgPSB0cGtfaW9jdGwsCiB9OwogCi1zdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBudWxsX29wcyA9IHsgfTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBudWxsX29wcyA9IHsgfTsKIAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICp0dHlwcmludGtfZHJpdmVyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCmluZGV4IGZiNjhiMTIuLjhlM2M0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCkBAIC0xOSw4ICsxOSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTMyLDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi90dHkvaHZjL2h2Y19jb25zb2xlLmgiCiAKIC8qCkBAIC03Myw2ICs3Niw3IEBACiBzdGF0aWMgc3RydWN0IHBvcnRzX2RyaXZlcl9kYXRhIHBkcnZkYXRhOwogCiBERUZJTkVfU1BJTkxPQ0socGRydmRhdGFfbG9jayk7CitERUNMQVJFX0NPTVBMRVRJT04oZWFybHlfY29uc29sZV9hZGRlZCk7CiAKIC8qIFRoaXMgc3RydWN0IGhvbGRzIGluZm9ybWF0aW9uIHRoYXQncyByZWxldmFudCBvbmx5IGZvciBjb25zb2xlIHBvcnRzICovCiBzdHJ1Y3QgY29uc29sZSB7CkBAIC0xNTEsNiArMTU1LDEwIEBACiAJaW50IGNocl9tYWpvcjsKIH07CiAKK3N0cnVjdCBwb3J0X3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzX3NlbnQsIGJ5dGVzX3JlY2VpdmVkLCBieXRlc19kaXNjYXJkZWQ7Cit9OworCiAvKiBUaGlzIHN0cnVjdCBob2xkcyB0aGUgcGVyLXBvcnQgZGF0YSAqLwogc3RydWN0IHBvcnQgewogCS8qIE5leHQgcG9ydCBpbiB0aGUgbGlzdCwgaGVhZCBpcyBpbiB0aGUgcG9ydHNfZGV2aWNlICovCkBAIC0xNzksNiArMTg3LDEzIEBACiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19maWxlOwogCiAJLyoKKwkgKiBLZWVwIGNvdW50IG9mIHRoZSBieXRlcyBzZW50LCByZWNlaXZlZCBhbmQgZGlzY2FyZGVkIGZvcgorCSAqIHRoaXMgcG9ydCBmb3IgYWNjb3VudGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLiAgVGhlc2UKKwkgKiBjb3VudHMgYXJlIG5vdCByZXNldCBhY3Jvc3MgcG9ydCBvcGVuIC8gY2xvc2UgZXZlbnRzLgorCSAqLworCXN0cnVjdCBwb3J0X3N0YXRzIHN0YXRzOworCisJLyoKIAkgKiBUaGUgZW50cmllcyBpbiB0aGlzIHN0cnVjdCB3aWxsIGJlIHZhbGlkIGlmIHRoaXMgcG9ydCBpcwogCSAqIGhvb2tlZCB1cCB0byBhbiBodmMgY29uc29sZQogCSAqLwpAQCAtMzQ3LDE3ICszNjIsMTkgQEAKIH0KIAogLyogQ2FsbGVycyBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZSBsb2NrcyAqLwotc3RhdGljIHZvaWQgKmdldF9pbmJ1ZihzdHJ1Y3QgcG9ydCAqcG9ydCkKK3N0YXRpYyBzdHJ1Y3QgcG9ydF9idWZmZXIgKmdldF9pbmJ1ZihzdHJ1Y3QgcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgcG9ydF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCi0JdnEgPSBwb3J0LT5pbl92cTsKLQlidWYgPSB2aXJ0cXVldWVfZ2V0X2J1Zih2cSwgJmxlbik7CisJaWYgKHBvcnQtPmluYnVmKQorCQlyZXR1cm4gcG9ydC0+aW5idWY7CisKKwlidWYgPSB2aXJ0cXVldWVfZ2V0X2J1Zihwb3J0LT5pbl92cSwgJmxlbik7CiAJaWYgKGJ1ZikgewogCQlidWYtPmxlbiA9IGxlbjsKIAkJYnVmLT5vZmZzZXQgPSAwOworCQlwb3J0LT5zdGF0cy5ieXRlc19yZWNlaXZlZCArPSBsZW47CiAJfQogCXJldHVybiBidWY7CiB9CkBAIC0zODQsMzIgKzQwMSwyNyBAQAogc3RhdGljIHZvaWQgZGlzY2FyZF9wb3J0X2RhdGEoc3RydWN0IHBvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHBvcnRfYnVmZmVyICpidWY7Ci0Jc3RydWN0IHZpcnRxdWV1ZSAqdnE7Ci0JdW5zaWduZWQgaW50IGxlbjsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBlcnI7CiAKIAlpZiAoIXBvcnQtPnBvcnRkZXYpIHsKIAkJLyogRGV2aWNlIGhhcyBiZWVuIHVucGx1Z2dlZC4gIHZxcyBhcmUgYWxyZWFkeSBnb25lLiAqLwogCQlyZXR1cm47CiAJfQotCXZxID0gcG9ydC0+aW5fdnE7Ci0JaWYgKHBvcnQtPmluYnVmKQotCQlidWYgPSBwb3J0LT5pbmJ1ZjsKLQllbHNlCi0JCWJ1ZiA9IHZpcnRxdWV1ZV9nZXRfYnVmKHZxLCAmbGVuKTsKKwlidWYgPSBnZXRfaW5idWYocG9ydCk7CiAKLQlyZXQgPSAwOworCWVyciA9IDA7CiAJd2hpbGUgKGJ1ZikgewotCQlpZiAoYWRkX2luYnVmKHZxLCBidWYpIDwgMCkgewotCQkJcmV0Kys7CisJCXBvcnQtPnN0YXRzLmJ5dGVzX2Rpc2NhcmRlZCArPSBidWYtPmxlbiAtIGJ1Zi0+b2Zmc2V0OworCQlpZiAoYWRkX2luYnVmKHBvcnQtPmluX3ZxLCBidWYpIDwgMCkgeworCQkJZXJyKys7CiAJCQlmcmVlX2J1ZihidWYpOwogCQl9Ci0JCWJ1ZiA9IHZpcnRxdWV1ZV9nZXRfYnVmKHZxLCAmbGVuKTsKKwkJcG9ydC0+aW5idWYgPSBOVUxMOworCQlidWYgPSBnZXRfaW5idWYocG9ydCk7CiAJfQotCXBvcnQtPmluYnVmID0gTlVMTDsKLQlpZiAocmV0KQorCWlmIChlcnIpCiAJCWRldl93YXJuKHBvcnQtPmRldiwgIkVycm9ycyBhZGRpbmcgJWQgYnVmZmVycyBiYWNrIHRvIHZxXG4iLAotCQkJIHJldCk7CisJCQkgZXJyKTsKIH0KIAogc3RhdGljIGJvb2wgcG9ydF9oYXNfZGF0YShzdHJ1Y3QgcG9ydCAqcG9ydCkKQEAgLTQxNywxOCArNDI5LDEyIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pbmJ1Zl9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnQtPmluYnVmKSB7Ci0JCXJldCA9IHRydWU7Ci0JCWdvdG8gb3V0OwotCX0KLQlwb3J0LT5pbmJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKLQlpZiAocG9ydC0+aW5idWYpIHsKLQkJcmV0ID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQogCXJldCA9IGZhbHNlOwotb3V0OgorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pbmJ1Zl9sb2NrLCBmbGFncyk7CisJcG9ydC0+aW5idWYgPSBnZXRfaW5idWYocG9ydCk7CisJaWYgKHBvcnQtPmluYnVmKQorCQlyZXQgPSB0cnVlOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+aW5idWZfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC01MjksNiArNTM1LDggQEAKIAkJY3B1X3JlbGF4KCk7CiBkb25lOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPm91dHZxX2xvY2ssIGZsYWdzKTsKKworCXBvcnQtPnN0YXRzLmJ5dGVzX3NlbnQgKz0gaW5fY291bnQ7CiAJLyoKIAkgKiBXZSdyZSBleHBlY3RlZCB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIHdlIHdyb3RlIC0tIGFsbAogCSAqIG9mIGl0CkBAIC02MzMsOCArNjQxLDggQEAKIAkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkJcmV0dXJuIC1FQUdBSU47CiAKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvcnQtPndhaXRxdWV1ZSwKLQkJCQkJICAgICAgICF3aWxsX3JlYWRfYmxvY2socG9ydCkpOworCQlyZXQgPSB3YWl0X2V2ZW50X2ZyZWV6YWJsZShwb3J0LT53YWl0cXVldWUsCisJCQkJCSAgICF3aWxsX3JlYWRfYmxvY2socG9ydCkpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNjc3LDggKzY4NSw4IEBACiAJCWlmIChub25ibG9jaykKIAkJCXJldHVybiAtRUFHQUlOOwogCi0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0LT53YWl0cXVldWUsCi0JCQkJCSAgICAgICAhd2lsbF93cml0ZV9ibG9jayhwb3J0KSk7CisJCXJldCA9IHdhaXRfZXZlbnRfZnJlZXphYmxlKHBvcnQtPndhaXRxdWV1ZSwKKwkJCQkJICAgIXdpbGxfd3JpdGVfYmxvY2socG9ydCkpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTA1OSw2ICsxMDY3LDE0IEBACiAJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAogCQkJICAgICAgICJvdXR2cV9mdWxsOiAlZFxuIiwgcG9ydC0+b3V0dnFfZnVsbCk7CiAJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAorCQkJICAgICAgICJieXRlc19zZW50OiAlbHVcbiIsIHBvcnQtPnN0YXRzLmJ5dGVzX3NlbnQpOworCW91dF9vZmZzZXQgKz0gc25wcmludGYoYnVmICsgb3V0X29mZnNldCwgb3V0X2NvdW50IC0gb3V0X29mZnNldCwKKwkJCSAgICAgICAiYnl0ZXNfcmVjZWl2ZWQ6ICVsdVxuIiwKKwkJCSAgICAgICBwb3J0LT5zdGF0cy5ieXRlc19yZWNlaXZlZCk7CisJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAorCQkJICAgICAgICJieXRlc19kaXNjYXJkZWQ6ICVsdVxuIiwKKwkJCSAgICAgICBwb3J0LT5zdGF0cy5ieXRlc19kaXNjYXJkZWQpOworCW91dF9vZmZzZXQgKz0gc25wcmludGYoYnVmICsgb3V0X29mZnNldCwgb3V0X2NvdW50IC0gb3V0X29mZnNldCwKIAkJCSAgICAgICAiaXNfY29uc29sZTogJXNcbiIsCiAJCQkgICAgICAgaXNfY29uc29sZV9wb3J0KHBvcnQpID8gInllcyIgOiAibm8iKTsKIAlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCkBAIC0xMTQzLDYgKzExNTksNyBAQAogCXBvcnQtPmNvbnMud3Mud3Nfcm93ID0gcG9ydC0+Y29ucy53cy53c19jb2wgPSAwOwogCiAJcG9ydC0+aG9zdF9jb25uZWN0ZWQgPSBwb3J0LT5ndWVzdF9jb25uZWN0ZWQgPSBmYWxzZTsKKwlwb3J0LT5zdGF0cyA9IChzdHJ1Y3QgcG9ydF9zdGF0cykgeyAwIH07CiAKIAlwb3J0LT5vdXR2cV9mdWxsID0gZmFsc2U7CiAKQEAgLTEzNTIsNiArMTM2OSw3IEBACiAJCQlicmVhazsKIAogCQlpbml0X3BvcnRfY29uc29sZShwb3J0KTsKKwkJY29tcGxldGUoJmVhcmx5X2NvbnNvbGVfYWRkZWQpOwogCQkvKgogCQkgKiBDb3VsZCByZW1vdmUgdGhlIHBvcnQgaGVyZSBpbiBjYXNlIGluaXQgZmFpbHMgLSBidXQKIAkJICogaGF2ZSB0byBub3RpZnkgdGhlIGhvc3QgZmlyc3QuCkBAIC0xMzk0LDYgKzE0MTIsMTMgQEAKIAkJYnJlYWs7CiAJY2FzZSBWSVJUSU9fQ09OU09MRV9QT1JUX05BTUU6CiAJCS8qCisJCSAqIElmIHdlIHdva2UgdXAgYWZ0ZXIgaGliZXJuYXRpb24sIHdlIGNhbiBnZXQgdGhpcworCQkgKiBhZ2Fpbi4gIFNraXAgaXQgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJaWYgKHBvcnQtPm5hbWUpCisJCQlicmVhazsKKworCQkvKgogCQkgKiBTa2lwIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgYW5kIHRoZSBjcGt0IHRvIGdldCB0aGUgc2l6ZQogCQkgKiBvZiB0aGUgbmFtZSB0aGF0IHdhcyBzZW50CiAJCSAqLwpAQCAtMTQ4MSw4ICsxNTA2LDcgQEAKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmluYnVmX2xvY2ssIGZsYWdzKTsKLQlpZiAoIXBvcnQtPmluYnVmKQotCQlwb3J0LT5pbmJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKKwlwb3J0LT5pbmJ1ZiA9IGdldF9pbmJ1Zihwb3J0KTsKIAogCS8qCiAJICogRG9uJ3QgcXVldWUgdXAgZGF0YSB3aGVuIHBvcnQgaXMgY2xvc2VkLiAgVGhpcyBjb25kaXRpb24KQEAgLTE1NjMsNyArMTU4Nyw3IEBACiAJcG9ydGRldi0+b3V0X3ZxcyA9IGttYWxsb2MobnJfcG9ydHMgKiBzaXplb2Yoc3RydWN0IHZpcnRxdWV1ZSAqKSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXZxcyB8fCAhaW9fY2FsbGJhY2tzIHx8ICFpb19uYW1lcyB8fCAhcG9ydGRldi0+aW5fdnFzIHx8Ci0JCQkhcG9ydGRldi0+b3V0X3ZxcykgeworCSAgICAhcG9ydGRldi0+b3V0X3ZxcykgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWU7CiAJfQpAQCAtMTY0OCw2ICsxNjcyLDEwIEBACiAJc3RydWN0IHBvcnRzX2RldmljZSAqcG9ydGRldjsKIAlpbnQgZXJyOwogCWJvb2wgbXVsdGlwb3J0OworCWJvb2wgZWFybHkgPSBlYXJseV9wdXRfY2hhcnMgIT0gTlVMTDsKKworCS8qIEVuc3VyZSB0byByZWFkIGVhcmx5X3B1dF9jaGFycyBub3cgKi8KKwliYXJyaWVyKCk7CiAKIAlwb3J0ZGV2ID0ga21hbGxvYyhzaXplb2YoKnBvcnRkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnRkZXYpIHsKQEAgLTE2NzUsMTMgKzE3MDMsMTEgQEAKIAogCW11bHRpcG9ydCA9IGZhbHNlOwogCXBvcnRkZXYtPmNvbmZpZy5tYXhfbnJfcG9ydHMgPSAxOwotCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX0NPTlNPTEVfRl9NVUxUSVBPUlQpKSB7CisJaWYgKHZpcnRpb19jb25maWdfdmFsKHZkZXYsIFZJUlRJT19DT05TT0xFX0ZfTVVMVElQT1JULAorCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbmZpZywKKwkJCQkgICAgICAgbWF4X25yX3BvcnRzKSwKKwkJCSAgICAgICZwb3J0ZGV2LT5jb25maWcubWF4X25yX3BvcnRzKSA9PSAwKQogCQltdWx0aXBvcnQgPSB0cnVlOwotCQl2ZGV2LT5jb25maWctPmdldCh2ZGV2LCBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29uZmlnLAotCQkJCQkJIG1heF9ucl9wb3J0cyksCi0JCQkJICAmcG9ydGRldi0+Y29uZmlnLm1heF9ucl9wb3J0cywKLQkJCQkgIHNpemVvZihwb3J0ZGV2LT5jb25maWcubWF4X25yX3BvcnRzKSk7Ci0JfQogCiAJZXJyID0gaW5pdF92cXMocG9ydGRldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTE3MTksNiArMTc0NSwxOSBAQAogCiAJX19zZW5kX2NvbnRyb2xfbXNnKHBvcnRkZXYsIFZJUlRJT19DT05TT0xFX0JBRF9JRCwKIAkJCSAgIFZJUlRJT19DT05TT0xFX0RFVklDRV9SRUFEWSwgMSk7CisKKwkvKgorCSAqIElmIHRoZXJlIHdhcyBhbiBlYXJseSB2aXJ0aW8gY29uc29sZSwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vCisJICogb3RoZXIgY29uc29sZXMuIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgaHZjX2FsbG9jIG1hdGNoZXMgdGhlCisJICogaHZjX2luc3RhbnRpYXRlLCBvdGhlcndpc2UgdHR5X29wZW4gd2lsbCBjb21wbGFpbiwgcmVzdWx0aW5nIGluCisJICogYSAiV2FybmluZzogdW5hYmxlIHRvIG9wZW4gYW4gaW5pdGlhbCBjb25zb2xlIiBib290IGZhaWx1cmUuCisJICogV2l0aG91dCBtdWx0aXBvcnQgdGhpcyBpcyBkb25lIGluIGFkZF9wb3J0IGFib3ZlLiBXaXRoIG11bHRpcG9ydAorCSAqIHRoaXMgbWlnaHQgdGFrZSBzb21lIGhvc3Q8LT5ndWVzdCBjb21tdW5pY2F0aW9uIC0gdGh1cyB3ZSBoYXZlIHRvCisJICogd2FpdC4KKwkgKi8KKwlpZiAobXVsdGlwb3J0ICYmIGVhcmx5KQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZlYXJseV9jb25zb2xlX2FkZGVkKTsKKwogCXJldHVybiAwOwogCiBmcmVlX3ZxczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwppbmRleCAzNGU5YzRmLi45OTlkNmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0xNSwzICsxNSwxOCBAQAogCiBjb25maWcgRFdfQVBCX1RJTUVSCiAJYm9vbAorCitjb25maWcgQ0xLU1JDX0RCWDUwMF9QUkNNVQorCWJvb2wgIkNsb2Nrc291cmNlIFBSQ01VIFRpbWVyIgorCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCNTUwMCB8fCBVWDUwMF9TT0NfREI4NTAwCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXNlIHRoZSBhbHdheXMgb24gUFJDTVUgVGltZXIgYXMgY2xvY2tzb3VyY2UKKworY29uZmlnIENMS1NSQ19EQlg1MDBfUFJDTVVfU0NIRURfQ0xPQ0sKKwlib29sICJDbG9ja3NvdXJjZSBQUkNNVSBUaW1lciBzY2hlZF9jbG9jayIKKwlkZXBlbmRzIG9uIChDTEtTUkNfREJYNTAwX1BSQ01VICYmICFOT01BRElLX01UVV9TQ0hFRF9DTE9DSykKKwlzZWxlY3QgSEFWRV9TQ0hFRF9DTE9DSworCWRlZmF1bHQgeQorCWhlbHAKKwkgIFVzZSB0aGUgYWx3YXlzIG9uIFBSQ01VIFRpbWVyIGFzIHNjaGVkX2Nsb2NrCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQppbmRleCA4NWFkMTY0Ni4uOGQ4MWExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCkBAIC05LDMgKzksNCBAQAogb2JqLSQoQ09ORklHX0NMS0JMRF9JODI1MykJKz0gaTgyNTMubwogb2JqLSQoQ09ORklHX0NMS1NSQ19NTUlPKQkrPSBtbWlvLm8KIG9iai0kKENPTkZJR19EV19BUEJfVElNRVIpCSs9IGR3X2FwYl90aW1lci5vCitvYmotJChDT05GSUdfQ0xLU1JDX0RCWDUwMF9QUkNNVSkJKz0gY2xrc3JjLWRieDUwMC1wcmNtdS5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jbGtzcmMtZGJ4NTAwLXByY211LmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2Nsa3NyYy1kYng1MDAtcHJjbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWZlZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9jbGtzcmMtZGJ4NTAwLXByY211LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTEKKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICogQXV0aG9yOiBNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yOiBTdW5kYXIgSXllciBmb3IgU1QtRXJpY3Nzb24KKyAqIHNjaGVkX2Nsb2NrIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uOgorICogcGxhdC1ub21hZGlrL3RpbWVyLmMgTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4KKyAqCisgKiBEQng1MDAtUFJDTVUgVGltZXIKKyAqIFRoZSBQUkNNVSBoYXMgNSB0aW1lcnMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiBhIGFsd2F5cy1vbgorICogcG93ZXIgZG9tYWluLiAgV2UgdXNlIHRoZSBUaW1lciA0IGZvciBvdXIgYWx3YXlzLW9uIGNsb2NrCisgKiBzb3VyY2Ugb24gREI4NTAwIGFuZCBUaW1lciAzIG9uIERCNTUwMC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGtzcmMtZGJ4NTAwLXByY211Lmg+CisKKyNpbmNsdWRlIDxhc20vc2NoZWRfY2xvY2suaD4KKworI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgUkFURV8zMksJCTMyNzY4CisKKyNkZWZpbmUgVElNRVJfTU9ERV9DT05USU5PVVMJMHgxCisjZGVmaW5lIFRJTUVSX0RPV05DT1VOVF9WQUwJMHhmZmZmZmZmZgorCisjZGVmaW5lIFBSQ01VX1RJTUVSX1JFRgkJMAorI2RlZmluZSBQUkNNVV9USU1FUl9ET1dOQ09VTlQJMHg0CisjZGVmaW5lIFBSQ01VX1RJTUVSX01PREUJMHg4CisKKyNkZWZpbmUgU0NIRURfQ0xPQ0tfTUlOX1dSQVAgMTMxMDcyIC8qIDJeMzIgLyAzMjc2OCAqLworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2U7CisKK3N0YXRpYyBjeWNsZV90IGNsa3NyY19kYng1MDBfcHJjbXVfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXUzMiBjb3VudCwgY291bnQyOworCisJZG8geworCQljb3VudCA9IHJlYWRsKGNsa3NyY19kYng1MDBfdGltZXJfYmFzZSArCisJCQkgICAgICBQUkNNVV9USU1FUl9ET1dOQ09VTlQpOworCQljb3VudDIgPSByZWFkbChjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2UgKworCQkJICAgICAgIFBSQ01VX1RJTUVSX0RPV05DT1VOVCk7CisJfSB3aGlsZSAoY291bnQyICE9IGNvdW50KTsKKworCS8qIE5lZ2F0ZSBiZWNhdXNlIHRoZSB0aW1lciBpcyBhIGRlY3JlbWVudGluZyBjb3VudGVyICovCisJcmV0dXJuIH5jb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9kYng1MDBfcHJjbXUgPSB7CisJLm5hbWUJCT0gImRieDUwMC1wcmNtdS10aW1lciIsCisJLnJhdGluZwkJPSAzMDAsCisJLnJlYWQJCT0gY2xrc3JjX2RieDUwMF9wcmNtdV9yZWFkLAorCS5zaGlmdAkJPSAxMCwKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCit9OworCisjaWZkZWYgQ09ORklHX0NMS1NSQ19EQlg1MDBfUFJDTVVfU0NIRURfQ0xPQ0sKK3N0YXRpYyBERUZJTkVfQ0xPQ0tfREFUQShjZCk7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBub3RyYWNlIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJdTMyIGN5YzsKKworCWlmICh1bmxpa2VseSghY2xrc3JjX2RieDUwMF90aW1lcl9iYXNlKSkKKwkJcmV0dXJuIDA7CisKKwljeWMgPSBjbGtzcmNfZGJ4NTAwX3ByY211X3JlYWQoJmNsb2Nrc291cmNlX2RieDUwMF9wcmNtdSk7CisKKwlyZXR1cm4gY3ljX3RvX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKK30KKworc3RhdGljIHZvaWQgbm90cmFjZSBjbGtzcmNfZGJ4NTAwX3ByY211X3VwZGF0ZV9zY2hlZF9jbG9jayh2b2lkKQoreworCXUzMiBjeWMgPSBjbGtzcmNfZGJ4NTAwX3ByY211X3JlYWQoJmNsb2Nrc291cmNlX2RieDUwMF9wcmNtdSk7CisJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBjbGtzcmNfZGJ4NTAwX3ByY211X2luaXQodm9pZCBfX2lvbWVtICpiYXNlKQoreworCWNsa3NyY19kYng1MDBfdGltZXJfYmFzZSA9IGJhc2U7CisKKwkvKgorCSAqIFRoZSBBOSBzdWIgc3lzdGVtIGV4cGVjdHMgdGhlIHRpbWVyIHRvIGJlIGNvbmZpZ3VyZWQgYXMKKwkgKiBhIGNvbnRpbm91cyBsb29waW5nIHRpbWVyLgorCSAqIFRoZSBQUkNNVSBzaG91bGQgY29uZmlndXJlIGl0IGJ1dCBpZiBpdCBmb3Igc29tZSByZWFzb24KKwkgKiBkb24ndCB3ZSBkbyBpdCBoZXJlLgorCSAqLworCWlmIChyZWFkbChjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2UgKyBQUkNNVV9USU1FUl9NT0RFKSAhPQorCSAgICBUSU1FUl9NT0RFX0NPTlRJTk9VUykgeworCQl3cml0ZWwoVElNRVJfTU9ERV9DT05USU5PVVMsCisJCSAgICAgICBjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2UgKyBQUkNNVV9USU1FUl9NT0RFKTsKKwkJd3JpdGVsKFRJTUVSX0RPV05DT1VOVF9WQUwsCisJCSAgICAgICBjbGtzcmNfZGJ4NTAwX3RpbWVyX2Jhc2UgKyBQUkNNVV9USU1FUl9SRUYpOworCX0KKyNpZmRlZiBDT05GSUdfQ0xLU1JDX0RCWDUwMF9QUkNNVV9TQ0hFRF9DTE9DSworCWluaXRfc2NoZWRfY2xvY2soJmNkLCBjbGtzcmNfZGJ4NTAwX3ByY211X3VwZGF0ZV9zY2hlZF9jbG9jaywKKwkJCSAzMiwgUkFURV8zMkspOworI2VuZGlmCisJY2xvY2tzb3VyY2VfY2FsY19tdWx0X3NoaWZ0KCZjbG9ja3NvdXJjZV9kYng1MDBfcHJjbXUsCisJCQkJICAgIFJBVEVfMzJLLCBTQ0hFRF9DTE9DS19NSU5fV1JBUCk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2RieDUwMF9wcmNtdSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYwppbmRleCAzMmE3N2JlLi5jYTA5YmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBzaF9jbXRfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9tdHUyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYwppbmRleCA0MDYzMGNiLi5kYjhkNTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHNoX210dTJfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfdG11LmMKaW5kZXggODA4MTM1Ny4uMDc5ZTk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3Qgc2hfdG11X3ByaXYgewogCXZvaWQgX19pb21lbSAqbWFwYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IGZhZjdjNTIuLmM1MDcyYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvZGI4NTAwLWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9kYjg1MDAtY3B1ZnJlcS5jCmluZGV4IGQ5MDQ1NmEuLmY1MDAyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9kYjg1MDAtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9kYjg1MDAtY3B1ZnJlcS5jCkBAIC0xMiwzMCArMTIsMzUgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2RiODUwMC1wcmNtdS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYng1MDAtcHJjbXUuaD4KICNpbmNsdWRlIDxtYWNoL2lkLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZnJlcV90YWJsZVtdID0gewogCVswXSA9IHsKIAkJLmluZGV4ID0gMCwKLQkJLmZyZXF1ZW5jeSA9IDMwMDAwMCwKKwkJLmZyZXF1ZW5jeSA9IDIwMDAwMCwKIAl9LAogCVsxXSA9IHsKIAkJLmluZGV4ID0gMSwKLQkJLmZyZXF1ZW5jeSA9IDYwMDAwMCwKKwkJLmZyZXF1ZW5jeSA9IDMwMDAwMCwKIAl9LAogCVsyXSA9IHsKLQkJLyogVXNlZCBmb3IgTUFYX09QUCwgaWYgYXZhaWxhYmxlICovCiAJCS5pbmRleCA9IDIsCi0JCS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCwKKwkJLmZyZXF1ZW5jeSA9IDYwMDAwMCwKIAl9LAogCVszXSA9IHsKKwkJLyogVXNlZCBmb3IgTUFYX09QUCwgaWYgYXZhaWxhYmxlICovCiAJCS5pbmRleCA9IDMsCiAJCS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCwKIAl9LAorCVs0XSA9IHsKKwkJLmluZGV4ID0gNCwKKwkJLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5ELAorCX0sCiB9OwogCiBzdGF0aWMgZW51bSBhcm1fb3BwIGlkeDJvcHBbXSA9IHsKKwlBUk1fRVhUQ0xLLAogCUFSTV81MF9PUFAsCiAJQVJNXzEwMF9PUFAsCiAJQVJNX01BWF9PUFAKQEAgLTcyLDEzICs3NywxMyBAQAogCiAJZnJlcXMub2xkID0gcG9saWN5LT5jdXI7CiAJZnJlcXMubmV3ID0gZnJlcV90YWJsZVtpZHhdLmZyZXF1ZW5jeTsKLQlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKIAogCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQogCQlyZXR1cm4gMDsKIAogCS8qIHByZS1jaGFuZ2Ugbm90aWZpY2F0aW9uICovCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwlmb3JfZWFjaF9jcHUoZnJlcXMuY3B1LCBwb2xpY3ktPmNwdXMpCisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CiAKIAkvKiByZXF1ZXN0IHRoZSBQUkNNIHVuaXQgZm9yIG9wcCBjaGFuZ2UgKi8KIAlpZiAocHJjbXVfc2V0X2FybV9vcHAoaWR4Mm9wcFtpZHhdKSkgewpAQCAtODcsNyArOTIsOCBAQAogCX0KIAogCS8qIHBvc3QgY2hhbmdlIG5vdGlmaWNhdGlvbiAqLwotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCWZvcl9lYWNoX2NwdShmcmVxcy5jcHUsIHBvbGljeS0+Y3B1cykKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMywxNyArMTA5LDE5IEBACiAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGRiODUwMF9jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JaW50IHJlczsKLQlpbnQgaTsKKwlpbnQgaSwgcmVzOwogCiAJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoaWR4Mm9wcCkgKyAxICE9IEFSUkFZX1NJWkUoZnJlcV90YWJsZSkpOwogCi0JaWYgKGNwdV9pc191ODUwMHYyKCkgJiYgIXByY211X2lzX3U4NDAwKCkpIHsKLQkJZnJlcV90YWJsZVswXS5mcmVxdWVuY3kgPSA0MDAwMDA7Ci0JCWZyZXFfdGFibGVbMV0uZnJlcXVlbmN5ID0gODAwMDAwOworCWlmICghcHJjbXVfaXNfdTg0MDAoKSkgeworCQlmcmVxX3RhYmxlWzFdLmZyZXF1ZW5jeSA9IDQwMDAwMDsKKwkJZnJlcV90YWJsZVsyXS5mcmVxdWVuY3kgPSA4MDAwMDA7CiAJCWlmIChwcmNtdV9oYXNfYXJtX21heG9wcCgpKQotCQkJZnJlcV90YWJsZVsyXS5mcmVxdWVuY3kgPSAxMDAwMDAwOworCQkJZnJlcV90YWJsZVszXS5mcmVxdWVuY3kgPSAxMDAwMDAwOwogCX0KKwlwcl9pbmZvKCJkYjg1MDAtY3B1ZnJlcSA6IEF2YWlsYWJsZSBmcmVxdWVuY2llczpcbiIpOworCWZvciAoaSA9IDA7IGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EOyBpKyspCisJCXByX2luZm8oIiAgJWQgTWh6XG4iLCBmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeS8xMDAwKTsKIAogCS8qIGdldCBwb2xpY3kgZmllbGRzIGJhc2VkIG9uIHRoZSB0YWJsZSAqLwogCXJlcyA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBmcmVxX3RhYmxlKTsKQEAgLTEyNywxMCArMTM1LDYgQEAKIAlwb2xpY3ktPm1pbiA9IHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcTsKIAlwb2xpY3ktPm1heCA9IHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKIAlwb2xpY3ktPmN1ciA9IGRiODUwMF9jcHVmcmVxX2dldHNwZWVkKHBvbGljeS0+Y3B1KTsKLQotCWZvciAoaSA9IDA7IGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ICE9IHBvbGljeS0+Y3VyOyBpKyspCi0JCTsKLQogCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2VfcG93ZXJzYXZlci5jIGIvZHJpdmVycy9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCmluZGV4IDM1YTI1N2QuLjRiZDY4MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKQEAgLTE5LDYgKzE5LDExIEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS90c2MuaD4KIAorI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKICNkZWZpbmUgRVBTX0JSQU5EX0M3TQkwCiAjZGVmaW5lIEVQU19CUkFORF9DNwkxCiAjZGVmaW5lIEVQU19CUkFORF9FREVOCTIKQEAgLTI3LDExICszMiw1OSBAQAogCiBzdHJ1Y3QgZXBzX2NwdV9kYXRhIHsKIAl1MzIgZnNiOworI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorCXUzMiBiaW9zX2xpbWl0OworI2VuZGlmCiAJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGZyZXFfdGFibGVbXTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXBzX2NwdV9kYXRhICplcHNfY3B1W05SX0NQVVNdOwogCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBmcmVxX2ZhaWxzYWZlX29mZjsKK3N0YXRpYyBpbnQgdm9sdGFnZV9mYWlsc2FmZV9vZmY7CitzdGF0aWMgaW50IHNldF9tYXhfdm9sdGFnZTsKKworI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorc3RhdGljIGludCBpZ25vcmVfYWNwaV9saW1pdDsKKworc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqZXBzX2FjcGlfY3B1X3BlcmY7CisKKy8qIE1pbmltdW0gbmVjZXNzYXJ5IHRvIGdldCBhY3BpX3Byb2Nlc3Nvcl9nZXRfYmlvc19saW1pdCgpIHdvcmtpbmcgKi8KK3N0YXRpYyBpbnQgZXBzX2FjcGlfaW5pdCh2b2lkKQoreworCWVwc19hY3BpX2NwdV9wZXJmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWVwc19hY3BpX2NwdV9wZXJmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZlcHNfYWNwaV9jcHVfcGVyZi0+c2hhcmVkX2NwdV9tYXAsCisJCQkJCQkJCUdGUF9LRVJORUwpKSB7CisJCWtmcmVlKGVwc19hY3BpX2NwdV9wZXJmKTsKKwkJZXBzX2FjcGlfY3B1X3BlcmYgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoZXBzX2FjcGlfY3B1X3BlcmYsIDApKSB7CisJCWZyZWVfY3B1bWFza192YXIoZXBzX2FjcGlfY3B1X3BlcmYtPnNoYXJlZF9jcHVfbWFwKTsKKwkJa2ZyZWUoZXBzX2FjcGlfY3B1X3BlcmYpOworCQllcHNfYWNwaV9jcHVfcGVyZiA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcHNfYWNwaV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmIChlcHNfYWNwaV9jcHVfcGVyZikgeworCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKGVwc19hY3BpX2NwdV9wZXJmLCAwKTsKKwkJZnJlZV9jcHVtYXNrX3ZhcihlcHNfYWNwaV9jcHVfcGVyZi0+c2hhcmVkX2NwdV9tYXApOworCQlrZnJlZShlcHNfYWNwaV9jcHVfcGVyZik7CisJCWVwc19hY3BpX2NwdV9wZXJmID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogc3RhdGljIHVuc2lnbmVkIGludCBlcHNfZ2V0KHVuc2lnbmVkIGludCBjcHUpCiB7CkBAIC0xNjQsNiArMjE3LDkgQEAKIAlpbnQgaywgc3RlcCwgdm9sdGFnZTsKIAlpbnQgcmV0OwogCWludCBzdGF0ZXM7CisjaWYgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1IgfHwgZGVmaW5lZCBDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFCisJdW5zaWduZWQgaW50IGxpbWl0OworI2VuZGlmCiAKIAlpZiAocG9saWN5LT5jcHUgIT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNDQsMTEgKzMwMCw2MiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY3VycmVudF92b2x0YWdlID4gMHgxZiB8fCBtYXhfdm9sdGFnZSA+IDB4MWYpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChtYXhfdm9sdGFnZSA8IG1pbl92b2x0YWdlKQorCWlmIChtYXhfdm9sdGFnZSA8IG1pbl92b2x0YWdlCisJICAgIHx8IGN1cnJlbnRfdm9sdGFnZSA8IG1pbl92b2x0YWdlCisJICAgIHx8IGN1cnJlbnRfdm9sdGFnZSA+IG1heF92b2x0YWdlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIENoZWNrIGZvciBzeXN0ZW1zIHVzaW5nIHVuZGVyY2xvY2tlZCBDUFUgKi8KKwlpZiAoIWZyZXFfZmFpbHNhZmVfb2ZmICYmIG1heF9tdWx0aXBsaWVyICE9IGN1cnJlbnRfbXVsdGlwbGllcikgeworCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IFlvdXIgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgYXQgZGlmZmVyZW50ICIKKwkJCSJmcmVxdWVuY3kgdGhlbiBpdHMgbWF4aW11bS4gQWJvcnRpbmcuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBZb3UgY2FuIHVzZSBmcmVxX2ZhaWxzYWZlX29mZiBvcHRpb24gIgorCQkJInRvIGRpc2FibGUgdGhpcyBjaGVjay5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCF2b2x0YWdlX2ZhaWxzYWZlX29mZiAmJiBtYXhfdm9sdGFnZSAhPSBjdXJyZW50X3ZvbHRhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBZb3VyIHByb2Nlc3NvciBpcyBydW5uaW5nIGF0IGRpZmZlcmVudCAiCisJCQkidm9sdGFnZSB0aGVuIGl0cyBtYXhpbXVtLiBBYm9ydGluZy5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IFlvdSBjYW4gdXNlIHZvbHRhZ2VfZmFpbHNhZmVfb2ZmICIKKwkJCSJvcHRpb24gdG8gZGlzYWJsZSB0aGlzIGNoZWNrLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIENhbGMgRlNCIHNwZWVkICovCiAJZnNiID0gY3B1X2toeiAvIGN1cnJlbnRfbXVsdGlwbGllcjsKKworI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorCS8qIENoZWNrIGZvciBBQ1BJIHByb2Nlc3NvciBzcGVlZCBsaW1pdCAqLworCWlmICghaWdub3JlX2FjcGlfbGltaXQgJiYgIWVwc19hY3BpX2luaXQoKSkgeworCQlpZiAoIWFjcGlfcHJvY2Vzc29yX2dldF9iaW9zX2xpbWl0KHBvbGljeS0+Y3B1LCAmbGltaXQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IEFDUEkgbGltaXQgJXUuJXVHSHpcbiIsCisJCQkJbGltaXQvMTAwMDAwMCwKKwkJCQkobGltaXQlMTAwMDAwMCkvMTAwMDApOworCQkJZXBzX2FjcGlfZXhpdChwb2xpY3kpOworCQkJLyogQ2hlY2sgaWYgbWF4X211bHRpcGxpZXIgaXMgaW4gQklPUyBsaW1pdHMgKi8KKwkJCWlmIChsaW1pdCAmJiBtYXhfbXVsdGlwbGllciAqIGZzYiA+IGxpbWl0KSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBBYm9ydGluZy5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBBbGxvdyB1c2VyIHRvIHNldCBsb3dlciBtYXhpbXVtIHZvbHRhZ2UgdGhlbiB0aGF0IHJlcG9ydGVkCisJICogYnkgcHJvY2Vzc29yICovCisJaWYgKGJyYW5kID09IEVQU19CUkFORF9DN00gJiYgc2V0X21heF92b2x0YWdlKSB7CisJCXUzMiB2OworCisJCS8qIENoYW5nZSBtViB0byBzb21ldGhpbmcgaGFyZHdhcmUgY2FuIHVzZSAqLworCQl2ID0gKHNldF9tYXhfdm9sdGFnZSAtIDcwMCkgLyAxNjsKKwkJLyogQ2hlY2sgaWYgdm9sdGFnZSBpcyB3aXRoaW4gbGltaXRzICovCisJCWlmICh2ID49IG1pbl92b2x0YWdlICYmIHYgPD0gbWF4X3ZvbHRhZ2UpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImVwczogU2V0dGluZyAlZG1WIGFzIG1heGltdW0uXG4iLAorCQkJCXYgKiAxNiArIDcwMCk7CisJCQltYXhfdm9sdGFnZSA9IHY7CisJCX0KKwl9CisKIAkvKiBDYWxjIG51bWJlciBvZiBwLXN0YXRlcyBzdXBwb3J0ZWQgKi8KIAlpZiAoYnJhbmQgPT0gRVBTX0JSQU5EX0M3TSkKIAkJc3RhdGVzID0gbWF4X211bHRpcGxpZXIgLSBtaW5fbXVsdGlwbGllciArIDE7CkBAIC0yNjUsNiArMzcyLDkgQEAKIAogCS8qIENvcHkgYmFzaWMgdmFsdWVzICovCiAJY2VudGF1ci0+ZnNiID0gZnNiOworI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorCWNlbnRhdXItPmJpb3NfbGltaXQgPSBsaW1pdDsKKyNlbmRpZgogCiAJLyogRmlsbCBmcmVxdWVuY3kgYW5kIE1TUiB2YWx1ZSB0YWJsZSAqLwogCWZfdGFibGUgPSAmY2VudGF1ci0+ZnJlcV90YWJsZVswXTsKQEAgLTMwMywxNyArNDEzLDcgQEAKIHN0YXRpYyBpbnQgZXBzX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKLQlzdHJ1Y3QgZXBzX2NwdV9kYXRhICpjZW50YXVyOwotCXUzMiBsbywgaGk7CiAKLQlpZiAoZXBzX2NwdVtjcHVdID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCWNlbnRhdXIgPSBlcHNfY3B1W2NwdV07Ci0KLQkvKiBHZXQgbWF4IGZyZXF1ZW5jeSAqLwotCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOwotCS8qIFNldCBtYXggZnJlcXVlbmN5ICovCi0JZXBzX3NldF9zdGF0ZShjZW50YXVyLCBjcHUsIGhpICYgMHhmZmZmKTsKIAkvKiBCeWUgKi8KIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CiAJa2ZyZWUoZXBzX2NwdVtjcHVdKTsKQEAgLTM1OSw2ICs0NTksMTkgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZlcHNfZHJpdmVyKTsKIH0KIAorLyogQWxsb3cgdXNlciB0byBvdmVyY2xvY2sgaGlzIG1hY2hpbmUgb3IgdG8gY2hhbmdlIGZyZXF1ZW5jeSB0byBoaWdoZXIgYWZ0ZXIKKyAqIHVubG9hZGluZyBtb2R1bGUgKi8KK21vZHVsZV9wYXJhbShmcmVxX2ZhaWxzYWZlX29mZiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZnJlcV9mYWlsc2FmZV9vZmYsICJEaXNhYmxlIGN1cnJlbnQgdnMgbWF4IGZyZXF1ZW5jeSBjaGVjayIpOworbW9kdWxlX3BhcmFtKHZvbHRhZ2VfZmFpbHNhZmVfb2ZmLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2b2x0YWdlX2ZhaWxzYWZlX29mZiwgIkRpc2FibGUgY3VycmVudCB2cyBtYXggdm9sdGFnZSBjaGVjayIpOworI2lmIGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SIHx8IGRlZmluZWQgQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRQorbW9kdWxlX3BhcmFtKGlnbm9yZV9hY3BpX2xpbWl0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfYWNwaV9saW1pdCwgIkRvbid0IGNoZWNrIEFDUEkncyBwcm9jZXNzb3Igc3BlZWQgbGltaXQiKTsKKyNlbmRpZgorbW9kdWxlX3BhcmFtKHNldF9tYXhfdm9sdGFnZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2V0X21heF92b2x0YWdlLCAiU2V0IG1heGltdW0gQ1BVIHZvbHRhZ2UgKG1WKSBDNy1NIG9ubHkiKTsKKwogTU9EVUxFX0FVVEhPUigiUmFmYWwgQmlsc2tpIDxyYWZhbGJpbHNraUBpbnRlcmlhLnBsPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFbmhhbmNlZCBQb3dlclNhdmVyIGRyaXZlciBmb3IgVklBIEM3IENQVSdzLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2V4eW5vczQyMTAtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2V4eW5vczQyMTAtY3B1ZnJlcS5jCmluZGV4IGI3YzNhODQuLmFiOTc0MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9leHlub3M0MjEwLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZXh5bm9zNDIxMC1jcHVmcmVxLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KQEAgLTM2LDYgKzM4LDEwIEBACiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CiBzdGF0aWMgdW5zaWduZWQgaW50IG1lbXR5cGU7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9ja2luZ19mcmVxdWVuY3k7CitzdGF0aWMgYm9vbCBmcmVxdWVuY3lfbG9ja2VkOworc3RhdGljIERFRklORV9NVVRFWChjcHVmcmVxX2xvY2spOworCiBlbnVtIGV4eW5vczRfbWVtb3J5X3R5cGUgewogCUREUjIgPSA0LAogCUxQRERSMiwKQEAgLTQwNSwyMiArNDExLDMyIEBACiB7CiAJdW5zaWduZWQgaW50IGluZGV4LCBvbGRfaW5kZXg7CiAJdW5zaWduZWQgaW50IGFybV92b2x0LCBpbnRfdm9sdDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKIAogCWZyZXFzLm9sZCA9IGV4eW5vczRfZ2V0c3BlZWQocG9saWN5LT5jcHUpOwogCisJbXV0ZXhfbG9jaygmY3B1ZnJlcV9sb2NrKTsKKworCWlmIChmcmVxdWVuY3lfbG9ja2VkICYmIHRhcmdldF9mcmVxICE9IGxvY2tpbmdfZnJlcXVlbmN5KSB7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwogCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUsCiAJCQkJCSAgIGZyZXFzLm9sZCwgcmVsYXRpb24sICZvbGRfaW5kZXgpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAKIAlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgZXh5bm9zNF9mcmVxX3RhYmxlLAogCQkJCQkgICB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZpbmRleCkpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKKworCWVyciA9IDA7CiAKIAlmcmVxcy5uZXcgPSBleHlub3M0X2ZyZXFfdGFibGVbaW5kZXhdLmZyZXF1ZW5jeTsKIAlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKIAogCWlmIChmcmVxcy5uZXcgPT0gZnJlcXMub2xkKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAkvKiBnZXQgdGhlIHZvbHRhZ2UgdmFsdWUgKi8KIAlhcm1fdm9sdCA9IGV4eW5vczRfdm9sdF90YWJsZVtpbmRleF0uYXJtX3ZvbHQ7CkBAIC00NDcsMTAgKzQ2MywxNiBAQAogCiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAKLQlyZXR1cm4gMDsKK291dDoKKwltdXRleF91bmxvY2soJmNwdWZyZXFfbG9jayk7CisJcmV0dXJuIGVycjsKIH0KIAogI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIFRoZXNlIHN1c3BlbmQvcmVzdW1lIGFyZSB1c2VkIGFzIHN5c2NvcmVfb3BzLCBpdCBpcyBhbHJlYWR5IHRvbworICogbGF0ZSB0byBzZXQgcmVndWxhdG9yIHZvbHRhZ2VzIGF0IHRoaXMgc3RhZ2UuCisgKi8KIHN0YXRpYyBpbnQgZXh5bm9zNF9jcHVmcmVxX3N1c3BlbmQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJcmV0dXJuIDA7CkBAIC00NjIsOCArNDg0LDgyIEBACiB9CiAjZW5kaWYKIAorLyoqCisgKiBleHlub3M0X2NwdWZyZXFfcG1fbm90aWZpZXIgLSBibG9jayBDUFVGUkVRJ3MgYWN0aXZpdGllcyBpbiBzdXNwZW5kLXJlc3VtZQorICoJCQljb250ZXh0CisgKiBAbm90aWZpZXIKKyAqIEBwbV9ldmVudAorICogQHYKKyAqCisgKiBXaGlsZSBmcmVxdWVuY3lfbG9ja2VkID09IHRydWUsIHRhcmdldCgpIGlnbm9yZXMgZXZlcnkgZnJlcXVlbmN5IGJ1dAorICogbG9ja2luZ19mcmVxdWVuY3kuIFRoZSBsb2NraW5nX2ZyZXF1ZW5jeSB2YWx1ZSBpcyB0aGUgaW5pdGlhbCBmcmVxdWVuY3ksCisgKiB3aGljaCBpcyBzZXQgYnkgdGhlIGJvb3Rsb2FkZXIuIEluIG9yZGVyIHRvIGVsaW1pbmF0ZSBwb3NzaWJsZQorICogaW5jb25zaXN0ZW5jeSBpbiBjbG9jayB2YWx1ZXMsIHdlIHNhdmUgYW5kIHJlc3RvcmUgZnJlcXVlbmNpZXMgZHVyaW5nCisgKiBzdXNwZW5kIGFuZCByZXN1bWUgYW5kIGJsb2NrIENQVUZSRVEgYWN0aXZpdGllcy4gTm90ZSB0aGF0IHRoZSBzdGFuZGFyZAorICogc3VzcGVuZC9yZXN1bWUgY2Fubm90IGJlIHVzZWQgYXMgdGhleSBhcmUgdG9vIGRlZXAgKHN5c2NvcmVfb3BzKSBmb3IKKyAqIHJlZ3VsYXRvciBhY3Rpb25zLgorICovCitzdGF0aWMgaW50IGV4eW5vczRfY3B1ZnJlcV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBtX2V2ZW50LCB2b2lkICp2KQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KDApOyAvKiBib290IENQVSAqLworCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2F2ZWRfZnJlcXVlbmN5OworCXVuc2lnbmVkIGludCB0ZW1wOworCisJbXV0ZXhfbG9jaygmY3B1ZnJlcV9sb2NrKTsKKwlzd2l0Y2ggKHBtX2V2ZW50KSB7CisJY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6CisJCWlmIChmcmVxdWVuY3lfbG9ja2VkKQorCQkJZ290byBvdXQ7CisJCWZyZXF1ZW5jeV9sb2NrZWQgPSB0cnVlOworCisJCWlmIChsb2NraW5nX2ZyZXF1ZW5jeSkgeworCQkJc2F2ZWRfZnJlcXVlbmN5ID0gZXh5bm9zNF9nZXRzcGVlZCgwKTsKKworCQkJbXV0ZXhfdW5sb2NrKCZjcHVmcmVxX2xvY2spOworCQkJZXh5bm9zNF90YXJnZXQocG9saWN5LCBsb2NraW5nX2ZyZXF1ZW5jeSwKKwkJCQkgICAgICAgQ1BVRlJFUV9SRUxBVElPTl9IKTsKKwkJCW11dGV4X2xvY2soJmNwdWZyZXFfbG9jayk7CisJCX0KKworCQlicmVhazsKKwljYXNlIFBNX1BPU1RfU1VTUEVORDoKKworCQlpZiAoc2F2ZWRfZnJlcXVlbmN5KSB7CisJCQkvKgorCQkJICogV2hpbGUgZnJlcXVlbmN5X2xvY2tlZCwgb25seSBsb2NraW5nX2ZyZXF1ZW5jeQorCQkJICogaXMgdmFsaWQgZm9yIHRhcmdldCgpLiBJbiBvcmRlciB0byB1c2UKKwkJCSAqIHNhdmVkX2ZyZXF1ZW5jeSB3aGlsZSBrZWVwaW5nIGZyZXF1ZW5jeV9sb2NrZWQsCisJCQkgKiB3ZSB0ZW1wb3Jhcmx5IG92ZXJ3cml0ZSBsb2NraW5nX2ZyZXF1ZW5jeS4KKwkJCSAqLworCQkJdGVtcCA9IGxvY2tpbmdfZnJlcXVlbmN5OworCQkJbG9ja2luZ19mcmVxdWVuY3kgPSBzYXZlZF9mcmVxdWVuY3k7CisKKwkJCW11dGV4X3VubG9jaygmY3B1ZnJlcV9sb2NrKTsKKwkJCWV4eW5vczRfdGFyZ2V0KHBvbGljeSwgbG9ja2luZ19mcmVxdWVuY3ksCisJCQkJICAgICAgIENQVUZSRVFfUkVMQVRJT05fSCk7CisJCQltdXRleF9sb2NrKCZjcHVmcmVxX2xvY2spOworCisJCQlsb2NraW5nX2ZyZXF1ZW5jeSA9IHRlbXA7CisJCX0KKworCQlmcmVxdWVuY3lfbG9ja2VkID0gZmFsc2U7CisJCWJyZWFrOworCX0KK291dDoKKwltdXRleF91bmxvY2soJmNwdWZyZXFfbG9jayk7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGV4eW5vczRfY3B1ZnJlcV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGV4eW5vczRfY3B1ZnJlcV9wbV9ub3RpZmllciwKK307CisKIHN0YXRpYyBpbnQgZXh5bm9zNF9jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogeworCWludCByZXQ7CisKIAlwb2xpY3ktPmN1ciA9IHBvbGljeS0+bWluID0gcG9saWN5LT5tYXggPSBleHlub3M0X2dldHNwZWVkKHBvbGljeS0+Y3B1KTsKIAogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGV4eW5vczRfZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOwpAQCAtNDc5LDE2ICs1NzUsMzUgQEAKIAkgKi8KIAljcHVtYXNrX3NldGFsbChwb2xpY3ktPmNwdXMpOwogCi0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUpOworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBleHlub3M0X2ZyZXFfdGFibGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihleHlub3M0X2ZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGV4eW5vczRfY3B1ZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpleHlub3M0X2NwdWZyZXFfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKwogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBleHlub3M0X2RyaXZlciA9IHsKIAkuZmxhZ3MJCT0gQ1BVRlJFUV9TVElDS1ksCiAJLnZlcmlmeQkJPSBleHlub3M0X3ZlcmlmeV9zcGVlZCwKIAkudGFyZ2V0CQk9IGV4eW5vczRfdGFyZ2V0LAogCS5nZXQJCT0gZXh5bm9zNF9nZXRzcGVlZCwKIAkuaW5pdAkJPSBleHlub3M0X2NwdWZyZXFfY3B1X2luaXQsCisJLmV4aXQJCT0gZXh5bm9zNF9jcHVmcmVxX2NwdV9leGl0LAogCS5uYW1lCQk9ICJleHlub3M0X2NwdWZyZXEiLAorCS5hdHRyCQk9IGV4eW5vczRfY3B1ZnJlcV9hdHRyLAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gZXh5bm9zNF9jcHVmcmVxX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBleHlub3M0X2NwdWZyZXFfcmVzdW1lLApAQCAtNTAxLDYgKzYxNiw4IEBACiAJaWYgKElTX0VSUihjcHVfY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY3B1X2Nsayk7CiAKKwlsb2NraW5nX2ZyZXF1ZW5jeSA9IGV4eW5vczRfZ2V0c3BlZWQoMCk7CisKIAltb3V0Y29yZSA9IGNsa19nZXQoTlVMTCwgIm1vdXRjb3JlIik7CiAJaWYgKElTX0VSUihtb3V0Y29yZSkpCiAJCWdvdG8gb3V0OwpAQCAtNTQwLDYgKzY1Nyw4IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWVtdHlwZT0gMHgleFxuIiwgX19mdW5jX18sIG1lbXR5cGUpOwogCX0KIAorCXJlZ2lzdGVyX3BtX25vdGlmaWVyKCZleHlub3M0X2NwdWZyZXFfbmIpOworCiAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZleHlub3M0X2RyaXZlcik7CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zM2M2NHh4LWNwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9zM2M2NHh4LWNwdWZyZXEuYwppbmRleCBiOGQxZDIwLi4zNDc1ZjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvczNjNjR4eC1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3MzYzY0eHgtY3B1ZnJlcS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICphcm1jbGs7CiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqdmRkYXJtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKaW5kZXggMGRmMDE0MS4uMDZjZTI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCiAjaW5jbHVkZSAiY3B1aWRsZS5oIgpAQCAtNjEsOCArNjIsOSBAQAogaW50IGNwdWlkbGVfaWRsZV9jYWxsKHZvaWQpCiB7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBfX3RoaXNfY3B1X3JlYWQoY3B1aWRsZV9kZXZpY2VzKTsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9IGNwdWlkbGVfZ2V0X2RyaXZlcigpOwogCXN0cnVjdCBjcHVpZGxlX3N0YXRlICp0YXJnZXRfc3RhdGU7Ci0JaW50IG5leHRfc3RhdGU7CisJaW50IG5leHRfc3RhdGUsIGVudGVyZWRfc3RhdGU7CiAKIAlpZiAob2ZmKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTgzLDQ1ICs4NSwzNiBAQAogCWhydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKICNlbmRpZgogCi0JLyoKLQkgKiBDYWxsIHRoZSBkZXZpY2UncyBwcmVwYXJlIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoZQotCSAqIGdvdmVybm9yJ3Mgc2VsZWN0IGZ1bmN0aW9uLiAgLT5wcmVwYXJlIGdpdmVzIHRoZSBkZXZpY2UncwotCSAqIGNwdWlkbGUgZHJpdmVyIGEgY2hhbmNlIHRvIHVwZGF0ZSBhbnkgZHluYW1pYyBpbmZvcm1hdGlvbgotCSAqIG9mIGl0cyBjcHVpZGxlIHN0YXRlcyBmb3IgdGhlIGN1cnJlbnQgaWRsZSBwZXJpb2QsIGUuZy4KLQkgKiBzdGF0ZSBhdmFpbGFiaWxpdHksIGxhdGVuY2llcywgcmVzaWRlbmNpZXMsIGV0Yy4KLQkgKi8KLQlpZiAoZGV2LT5wcmVwYXJlKQotCQlkZXYtPnByZXBhcmUoZGV2KTsKLQogCS8qIGFzayB0aGUgZ292ZXJub3IgZm9yIHRoZSBuZXh0IHN0YXRlICovCi0JbmV4dF9zdGF0ZSA9IGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+c2VsZWN0KGRldik7CisJbmV4dF9zdGF0ZSA9IGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+c2VsZWN0KGRydiwgZGV2KTsKIAlpZiAobmVlZF9yZXNjaGVkKCkpIHsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl0YXJnZXRfc3RhdGUgPSAmZGV2LT5zdGF0ZXNbbmV4dF9zdGF0ZV07Ci0KLQkvKiBlbnRlciB0aGUgc3RhdGUgYW5kIHVwZGF0ZSBzdGF0cyAqLwotCWRldi0+bGFzdF9zdGF0ZSA9IHRhcmdldF9zdGF0ZTsKKwl0YXJnZXRfc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbbmV4dF9zdGF0ZV07CiAKIAl0cmFjZV9wb3dlcl9zdGFydChQT1dFUl9DU1RBVEUsIG5leHRfc3RhdGUsIGRldi0+Y3B1KTsKIAl0cmFjZV9jcHVfaWRsZShuZXh0X3N0YXRlLCBkZXYtPmNwdSk7CiAKLQlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gdGFyZ2V0X3N0YXRlLT5lbnRlcihkZXYsIHRhcmdldF9zdGF0ZSk7CisJZW50ZXJlZF9zdGF0ZSA9IHRhcmdldF9zdGF0ZS0+ZW50ZXIoZGV2LCBkcnYsIG5leHRfc3RhdGUpOwogCiAJdHJhY2VfcG93ZXJfZW5kKGRldi0+Y3B1KTsKIAl0cmFjZV9jcHVfaWRsZShQV1JfRVZFTlRfRVhJVCwgZGV2LT5jcHUpOwogCi0JaWYgKGRldi0+bGFzdF9zdGF0ZSkKLQkJdGFyZ2V0X3N0YXRlID0gZGV2LT5sYXN0X3N0YXRlOwotCi0JdGFyZ2V0X3N0YXRlLT50aW1lICs9ICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5sYXN0X3Jlc2lkZW5jeTsKLQl0YXJnZXRfc3RhdGUtPnVzYWdlKys7CisJaWYgKGVudGVyZWRfc3RhdGUgPj0gMCkgeworCQkvKiBVcGRhdGUgY3B1aWRsZSBjb3VudGVycyAqLworCQkvKiBUaGlzIGNhbiBiZSBtb3ZlZCB0byB3aXRoaW4gZHJpdmVyIGVudGVyIHJvdXRpbmUKKwkJICogYnV0IHRoYXQgcmVzdWx0cyBpbiBtdWx0aXBsZSBjb3BpZXMgb2Ygc2FtZSBjb2RlLgorCQkgKi8KKwkJZGV2LT5zdGF0ZXNfdXNhZ2VbZW50ZXJlZF9zdGF0ZV0udGltZSArPQorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5sYXN0X3Jlc2lkZW5jeTsKKwkJZGV2LT5zdGF0ZXNfdXNhZ2VbZW50ZXJlZF9zdGF0ZV0udXNhZ2UrKzsKKwl9CiAKIAkvKiBnaXZlIHRoZSBnb3Zlcm5vciBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IG9uIHRoZSBvdXRjb21lICovCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdCkKLQkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KGRldik7CisJCWNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdChkZXYsIGVudGVyZWRfc3RhdGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzIsMTEgKzE2NSwxMSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jayk7CiAKICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYCi1zdGF0aWMgaW50IHBvbGxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0KQorc3RhdGljIGludCBwb2xsX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaW5kZXgpCiB7CiAJa3RpbWVfdAl0MSwgdDI7CiAJczY0IGRpZmY7Ci0JaW50IHJldDsKIAogCXQxID0ga3RpbWVfZ2V0KCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtMTg4LDE1ICsxODEsMTQgQEAKIAlpZiAoZGlmZiA+IElOVF9NQVgpCiAJCWRpZmYgPSBJTlRfTUFYOwogCi0JcmV0ID0gKGludCkgZGlmZjsKLQlyZXR1cm4gcmV0OworCWRldi0+bGFzdF9yZXNpZGVuY3kgPSAoaW50KSBkaWZmOworCisJcmV0dXJuIGluZGV4OwogfQogCi1zdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHBvbGxfaWRsZV9pbml0KHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSA9ICZkZXYtPnN0YXRlc1swXTsKLQotCWNwdWlkbGVfc2V0X3N0YXRlZGF0YShzdGF0ZSwgTlVMTCk7CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0gJmRydi0+c3RhdGVzWzBdOwogCiAJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJQT0xMIik7CiAJc25wcmludGYoc3RhdGUtPmRlc2MsIENQVUlETEVfREVTQ19MRU4sICJDUFVJRExFIENPUkUgUE9MTCBJRExFIik7CkBAIC0yMDcsNyArMTk5LDcgQEAKIAlzdGF0ZS0+ZW50ZXIgPSBwb2xsX2lkbGU7CiB9CiAjZWxzZQotc3RhdGljIHZvaWQgcG9sbF9pZGxlX2luaXQoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpIHt9CitzdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydikge30KICNlbmRpZiAvKiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYICovCiAKIC8qKgpAQCAtMjM0LDIxICsyMjYsMjAgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcG9sbF9pZGxlX2luaXQoZGV2KTsKKwlwb2xsX2lkbGVfaW5pdChjcHVpZGxlX2dldF9kcml2ZXIoKSk7CiAKIAlpZiAoKHJldCA9IGNwdWlkbGVfYWRkX3N0YXRlX3N5c2ZzKGRldikpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+ZW5hYmxlICYmCi0JICAgIChyZXQgPSBjcHVpZGxlX2N1cnJfZ292ZXJub3ItPmVuYWJsZShkZXYpKSkKKwkgICAgKHJldCA9IGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+ZW5hYmxlKGNwdWlkbGVfZ2V0X2RyaXZlcigpLCBkZXYpKSkKIAkJZ290byBmYWlsX3N5c2ZzOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+c3RhdGVfY291bnQ7IGkrKykgewotCQlkZXYtPnN0YXRlc1tpXS51c2FnZSA9IDA7Ci0JCWRldi0+c3RhdGVzW2ldLnRpbWUgPSAwOworCQlkZXYtPnN0YXRlc191c2FnZVtpXS51c2FnZSA9IDA7CisJCWRldi0+c3RhdGVzX3VzYWdlW2ldLnRpbWUgPSAwOwogCX0KIAlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gMDsKLQlkZXYtPmxhc3Rfc3RhdGUgPSBOVUxMOwogCiAJc21wX3dtYigpOwogCkBAIC0yODIsNyArMjczLDcgQEAKIAlkZXYtPmVuYWJsZWQgPSAwOwogCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+ZGlzYWJsZSkKLQkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5kaXNhYmxlKGRldik7CisJCWNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+ZGlzYWJsZShjcHVpZGxlX2dldF9kcml2ZXIoKSwgZGV2KTsKIAogCWNwdWlkbGVfcmVtb3ZlX3N0YXRlX3N5c2ZzKGRldik7CiAJZW5hYmxlZF9kZXZpY2VzLS07CkBAIC0zMTAsMjYgKzMwMSw2IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmRldi0+a29ial91bnJlZ2lzdGVyKTsKIAotCS8qCi0JICogY3B1aWRsZSBkcml2ZXIgc2hvdWxkIHNldCB0aGUgZGV2LT5wb3dlcl9zcGVjaWZpZWQgYml0Ci0JICogYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UgaWYgdGhlIGRyaXZlciBwcm92aWRlcwotCSAqIHBvd2VyX3VzYWdlIG51bWJlcnMuCi0JICoKLQkgKiBGb3IgdGhvc2UgZGV2aWNlcyB3aG9zZSAtPnBvd2VyX3NwZWNpZmllZCBpcyBub3Qgc2V0LAotCSAqIHdlIGZpbGwgaW4gcG93ZXJfdXNhZ2Ugd2l0aCBkZWNyZWFzaW5nIHZhbHVlcyBhcyB0aGUKLQkgKiBjcHVpZGxlIGNvZGUgaGFzIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCBzdGF0ZSBDbgotCSAqIHVzZXMgbGVzcyBwb3dlciB0aGFuIEMobi0xKS4KLQkgKgotCSAqIFdpdGggQ09ORklHX0FSQ0hfSEFTX0NQVV9SRUxBWCwgQzAgaXMgYWxyZWFkeSBhc3NpZ25lZAotCSAqIGFuIHBvd2VyIHZhbHVlIG9mIC0xLiAgU28gd2UgdXNlIC0yLCAtMywgZXRjLCBmb3Igb3RoZXIKLQkgKiBjLXN0YXRlcy4KLQkgKi8KLQlpZiAoIWRldi0+cG93ZXJfc3BlY2lmaWVkKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsgaSA8IGRldi0+c3RhdGVfY291bnQ7IGkrKykKLQkJCWRldi0+c3RhdGVzW2ldLnBvd2VyX3VzYWdlID0gLTEgLSBpOwotCX0KLQogCXBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBkZXYtPmNwdSkgPSBkZXY7CiAJbGlzdF9hZGQoJmRldi0+ZGV2aWNlX2xpc3QsICZjcHVpZGxlX2RldGVjdGVkX2RldmljZXMpOwogCWlmICgocmV0ID0gY3B1aWRsZV9hZGRfc3lzZnMoc3lzX2RldikpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMgYi9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKaW5kZXggM2Y3ZTNjZS4uMjg0ZDdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwpAQCAtMTcsNiArMTcsMzAgQEAKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmNwdWlkbGVfY3Vycl9kcml2ZXI7CiBERUZJTkVfU1BJTkxPQ0soY3B1aWRsZV9kcml2ZXJfbG9jayk7CiAKK3N0YXRpYyB2b2lkIF9fY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpCit7CisJaW50IGk7CisJLyoKKwkgKiBjcHVpZGxlIGRyaXZlciBzaG91bGQgc2V0IHRoZSBkcnYtPnBvd2VyX3NwZWNpZmllZCBiaXQKKwkgKiBiZWZvcmUgcmVnaXN0ZXJpbmcgaWYgdGhlIGRyaXZlciBwcm92aWRlcworCSAqIHBvd2VyX3VzYWdlIG51bWJlcnMuCisJICoKKwkgKiBJZiBwb3dlcl9zcGVjaWZpZWQgaXMgbm90IHNldCwKKwkgKiB3ZSBmaWxsIGluIHBvd2VyX3VzYWdlIHdpdGggZGVjcmVhc2luZyB2YWx1ZXMgYXMgdGhlCisJICogY3B1aWRsZSBjb2RlIGhhcyBhbiBpbXBsaWNpdCBhc3N1bXB0aW9uIHRoYXQgc3RhdGUgQ24KKwkgKiB1c2VzIGxlc3MgcG93ZXIgdGhhbiBDKG4tMSkuCisJICoKKwkgKiBXaXRoIENPTkZJR19BUkNIX0hBU19DUFVfUkVMQVgsIEMwIGlzIGFscmVhZHkgYXNzaWduZWQKKwkgKiBhbiBwb3dlciB2YWx1ZSBvZiAtMS4gIFNvIHdlIHVzZSAtMiwgLTMsIGV0YywgZm9yIG90aGVyCisJICogYy1zdGF0ZXMuCisJICovCisJaWYgKCFkcnYtPnBvd2VyX3NwZWNpZmllZCkgeworCQlmb3IgKGkgPSBDUFVJRExFX0RSSVZFUl9TVEFURV9TVEFSVDsgaSA8IGRydi0+c3RhdGVfY291bnQ7IGkrKykKKwkJCWRydi0+c3RhdGVzW2ldLnBvd2VyX3VzYWdlID0gLTEgLSBpOworCX0KK30KKworCiAvKioKICAqIGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyIC0gcmVnaXN0ZXJzIGEgZHJpdmVyCiAgKiBAZHJ2OiB0aGUgZHJpdmVyCkBAIC0zNCw2ICs1OCw3IEBACiAJCXNwaW5fdW5sb2NrKCZjcHVpZGxlX2RyaXZlcl9sb2NrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CisJX19jcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihkcnYpOwogCWNwdWlkbGVfY3Vycl9kcml2ZXIgPSBkcnY7CiAJc3Bpbl91bmxvY2soJmNwdWlkbGVfZHJpdmVyX2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL2xhZGRlci5jIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9sYWRkZXIuYwppbmRleCBmNjJmZGUyLi5iNmEwOWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL2xhZGRlci5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbGFkZGVyLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTYwLDkgKzYwLDExIEBACiAKIC8qKgogICogbGFkZGVyX3NlbGVjdF9zdGF0ZSAtIHNlbGVjdHMgdGhlIG5leHQgc3RhdGUgdG8gZW50ZXIKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCiAgKiBAZGV2OiB0aGUgQ1BVCiAgKi8KLXN0YXRpYyBpbnQgbGFkZGVyX3NlbGVjdF9zdGF0ZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbGFkZGVyX3NlbGVjdF9zdGF0ZShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFkZGVyX2RldmljZSAqbGRldiA9ICZfX2dldF9jcHVfdmFyKGxhZGRlcl9kZXZpY2VzKTsKIAlzdHJ1Y3QgbGFkZGVyX2RldmljZV9zdGF0ZSAqbGFzdF9zdGF0ZTsKQEAgLTc3LDE1ICs3OSwxNyBAQAogCiAJbGFzdF9zdGF0ZSA9ICZsZGV2LT5zdGF0ZXNbbGFzdF9pZHhdOwogCi0JaWYgKGRldi0+c3RhdGVzW2xhc3RfaWR4XS5mbGFncyAmIENQVUlETEVfRkxBR19USU1FX1ZBTElEKQotCQlsYXN0X3Jlc2lkZW5jeSA9IGNwdWlkbGVfZ2V0X2xhc3RfcmVzaWRlbmN5KGRldikgLSBkZXYtPnN0YXRlc1tsYXN0X2lkeF0uZXhpdF9sYXRlbmN5OworCWlmIChkcnYtPnN0YXRlc1tsYXN0X2lkeF0uZmxhZ3MgJiBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCkgeworCQlsYXN0X3Jlc2lkZW5jeSA9IGNwdWlkbGVfZ2V0X2xhc3RfcmVzaWRlbmN5KGRldikgLSBcCisJCQkJCSBkcnYtPnN0YXRlc1tsYXN0X2lkeF0uZXhpdF9sYXRlbmN5OworCX0KIAllbHNlCiAJCWxhc3RfcmVzaWRlbmN5ID0gbGFzdF9zdGF0ZS0+dGhyZXNob2xkLnByb21vdGlvbl90aW1lICsgMTsKIAogCS8qIGNvbnNpZGVyIHByb21vdGlvbiAqLwotCWlmIChsYXN0X2lkeCA8IGRldi0+c3RhdGVfY291bnQgLSAxICYmCisJaWYgKGxhc3RfaWR4IDwgZHJ2LT5zdGF0ZV9jb3VudCAtIDEgJiYKIAkgICAgbGFzdF9yZXNpZGVuY3kgPiBsYXN0X3N0YXRlLT50aHJlc2hvbGQucHJvbW90aW9uX3RpbWUgJiYKLQkgICAgZGV2LT5zdGF0ZXNbbGFzdF9pZHggKyAxXS5leGl0X2xhdGVuY3kgPD0gbGF0ZW5jeV9yZXEpIHsKKwkgICAgZHJ2LT5zdGF0ZXNbbGFzdF9pZHggKyAxXS5leGl0X2xhdGVuY3kgPD0gbGF0ZW5jeV9yZXEpIHsKIAkJbGFzdF9zdGF0ZS0+c3RhdHMucHJvbW90aW9uX2NvdW50Kys7CiAJCWxhc3Rfc3RhdGUtPnN0YXRzLmRlbW90aW9uX2NvdW50ID0gMDsKIAkJaWYgKGxhc3Rfc3RhdGUtPnN0YXRzLnByb21vdGlvbl9jb3VudCA+PSBsYXN0X3N0YXRlLT50aHJlc2hvbGQucHJvbW90aW9uX2NvdW50KSB7CkBAIC05NiwxMSArMTAwLDExIEBACiAKIAkvKiBjb25zaWRlciBkZW1vdGlvbiAqLwogCWlmIChsYXN0X2lkeCA+IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUICYmCi0JICAgIGRldi0+c3RhdGVzW2xhc3RfaWR4XS5leGl0X2xhdGVuY3kgPiBsYXRlbmN5X3JlcSkgeworCSAgICBkcnYtPnN0YXRlc1tsYXN0X2lkeF0uZXhpdF9sYXRlbmN5ID4gbGF0ZW5jeV9yZXEpIHsKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gbGFzdF9pZHggLSAxOyBpID4gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7IGktLSkgewotCQkJaWYgKGRldi0+c3RhdGVzW2ldLmV4aXRfbGF0ZW5jeSA8PSBsYXRlbmN5X3JlcSkKKwkJCWlmIChkcnYtPnN0YXRlc1tpXS5leGl0X2xhdGVuY3kgPD0gbGF0ZW5jeV9yZXEpCiAJCQkJYnJlYWs7CiAJCX0KIAkJbGFkZGVyX2RvX3NlbGVjdGlvbihsZGV2LCBsYXN0X2lkeCwgaSk7CkBAIC0xMjMsOSArMTI3LDExIEBACiAKIC8qKgogICogbGFkZGVyX2VuYWJsZV9kZXZpY2UgLSBzZXR1cCBmb3IgdGhlIGdvdmVybm9yCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlcgogICogQGRldjogdGhlIENQVQogICovCi1zdGF0aWMgaW50IGxhZGRlcl9lbmFibGVfZGV2aWNlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIGludCBsYWRkZXJfZW5hYmxlX2RldmljZShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbGFkZGVyX2RldmljZSAqbGRldiA9ICZwZXJfY3B1KGxhZGRlcl9kZXZpY2VzLCBkZXYtPmNwdSk7CkBAIC0xMzQsOCArMTQwLDggQEAKIAogCWxkZXYtPmxhc3Rfc3RhdGVfaWR4ID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5zdGF0ZV9jb3VudDsgaSsrKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVzW2ldOworCWZvciAoaSA9IDA7IGkgPCBkcnYtPnN0YXRlX2NvdW50OyBpKyspIHsKKwkJc3RhdGUgPSAmZHJ2LT5zdGF0ZXNbaV07CiAJCWxzdGF0ZSA9ICZsZGV2LT5zdGF0ZXNbaV07CiAKIAkJbHN0YXRlLT5zdGF0cy5wcm9tb3Rpb25fY291bnQgPSAwOwpAQCAtMTQ0LDcgKzE1MCw3IEBACiAJCWxzdGF0ZS0+dGhyZXNob2xkLnByb21vdGlvbl9jb3VudCA9IFBST01PVElPTl9DT1VOVDsKIAkJbHN0YXRlLT50aHJlc2hvbGQuZGVtb3Rpb25fY291bnQgPSBERU1PVElPTl9DT1VOVDsKIAotCQlpZiAoaSA8IGRldi0+c3RhdGVfY291bnQgLSAxKQorCQlpZiAoaSA8IGRydi0+c3RhdGVfY291bnQgLSAxKQogCQkJbHN0YXRlLT50aHJlc2hvbGQucHJvbW90aW9uX3RpbWUgPSBzdGF0ZS0+ZXhpdF9sYXRlbmN5OwogCQlpZiAoaSA+IDApCiAJCQlsc3RhdGUtPnRocmVzaG9sZC5kZW1vdGlvbl90aW1lID0gc3RhdGUtPmV4aXRfbGF0ZW5jeTsKQEAgLTE1MywxMSArMTU5LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogbGFkZGVyX3JlZmxlY3QgLSB1cGRhdGUgdGhlIGNvcnJlY3QgbGFzdF9zdGF0ZV9pZHgKKyAqIEBkZXY6IHRoZSBDUFUKKyAqIEBpbmRleDogdGhlIGluZGV4IG9mIGFjdHVhbCBzdGF0ZSBlbnRlcmVkCisgKi8KK3N0YXRpYyB2b2lkIGxhZGRlcl9yZWZsZWN0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGxhZGRlcl9kZXZpY2UgKmxkZXYgPSAmX19nZXRfY3B1X3ZhcihsYWRkZXJfZGV2aWNlcyk7CisJaWYgKGluZGV4ID4gMCkKKwkJbGRldi0+bGFzdF9zdGF0ZV9pZHggPSBpbmRleDsKK30KKwogc3RhdGljIHN0cnVjdCBjcHVpZGxlX2dvdmVybm9yIGxhZGRlcl9nb3Zlcm5vciA9IHsKIAkubmFtZSA9CQkibGFkZGVyIiwKIAkucmF0aW5nID0JMTAsCiAJLmVuYWJsZSA9CWxhZGRlcl9lbmFibGVfZGV2aWNlLAogCS5zZWxlY3QgPQlsYWRkZXJfc2VsZWN0X3N0YXRlLAorCS5yZWZsZWN0ID0JbGFkZGVyX3JlZmxlY3QsCiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3JzL21lbnUuYyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCmluZGV4IDM2MDBmMTkuLmFkMDk1MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgQlVDS0VUUyAxMgogI2RlZmluZSBJTlRFUlZBTFMgOApAQCAtMTgyLDcgKzE4Myw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWVudV9kZXZpY2UsIG1lbnVfZGV2aWNlcyk7CiAKLXN0YXRpYyB2b2lkIG1lbnVfdXBkYXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1lbnVfdXBkYXRlKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CiAKIC8qIFRoaXMgaW1wbGVtZW50cyBESVZfUk9VTkRfQ0xPU0VTVCBidXQgYXZvaWRzIDY0IGJpdCBkaXZpc2lvbiAqLwogc3RhdGljIHU2NCBkaXZfcm91bmQ2NCh1NjQgZGl2aWRlbmQsIHUzMiBkaXZpc29yKQpAQCAtMjI4LDkgKzIyOSwxMCBAQAogCiAvKioKICAqIG1lbnVfc2VsZWN0IC0gc2VsZWN0cyB0aGUgbmV4dCBpZGxlIHN0YXRlIHRvIGVudGVyCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlciBjb250YWluaW5nIHN0YXRlIGRhdGEKICAqIEBkZXY6IHRoZSBDUFUKICAqLwotc3RhdGljIGludCBtZW51X3NlbGVjdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbWVudV9zZWxlY3Qoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtZW51X2RldmljZSAqZGF0YSA9ICZfX2dldF9jcHVfdmFyKG1lbnVfZGV2aWNlcyk7CiAJaW50IGxhdGVuY3lfcmVxID0gcG1fcW9zX3JlcXVlc3QoUE1fUU9TX0NQVV9ETUFfTEFURU5DWSk7CkBAIC0yNDAsNyArMjQyLDcgQEAKIAlzdHJ1Y3QgdGltZXNwZWMgdDsKIAogCWlmIChkYXRhLT5uZWVkc191cGRhdGUpIHsKLQkJbWVudV91cGRhdGUoZGV2KTsKKwkJbWVudV91cGRhdGUoZHJ2LCBkZXYpOwogCQlkYXRhLT5uZWVkc191cGRhdGUgPSAwOwogCX0KIApAQCAtMjg1LDExICsyODcsOSBAQAogCSAqIEZpbmQgdGhlIGlkbGUgc3RhdGUgd2l0aCB0aGUgbG93ZXN0IHBvd2VyIHdoaWxlIHNhdGlzZnlpbmcKIAkgKiBvdXIgY29uc3RyYWludHMuCiAJICovCi0JZm9yIChpID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7IGkgPCBkZXYtPnN0YXRlX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnMgPSAmZGV2LT5zdGF0ZXNbaV07CisJZm9yIChpID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7IGkgPCBkcnYtPnN0YXRlX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnMgPSAmZHJ2LT5zdGF0ZXNbaV07CiAKLQkJaWYgKHMtPmZsYWdzICYgQ1BVSURMRV9GTEFHX0lHTk9SRSkKLQkJCWNvbnRpbnVlOwogCQlpZiAocy0+dGFyZ2V0X3Jlc2lkZW5jeSA+IGRhdGEtPnByZWRpY3RlZF91cykKIAkJCWNvbnRpbnVlOwogCQlpZiAocy0+ZXhpdF9sYXRlbmN5ID4gbGF0ZW5jeV9yZXEpCkBAIC0zMTAsMjYgKzMxMCwzMCBAQAogLyoqCiAgKiBtZW51X3JlZmxlY3QgLSByZWNvcmRzIHRoYXQgZGF0YSBzdHJ1Y3R1cmVzIG5lZWQgdXBkYXRlCiAgKiBAZGV2OiB0aGUgQ1BVCisgKiBAaW5kZXg6IHRoZSBpbmRleCBvZiBhY3R1YWwgZW50ZXJlZCBzdGF0ZQogICoKICAqIE5PVEU6IGl0J3MgaW1wb3J0YW50IHRvIGJlIGZhc3QgaGVyZSBiZWNhdXNlIHRoaXMgb3BlcmF0aW9uIHdpbGwgYWRkIHRvCiAgKiAgICAgICB0aGUgb3ZlcmFsbCBleGl0IGxhdGVuY3kuCiAgKi8KLXN0YXRpYyB2b2lkIG1lbnVfcmVmbGVjdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG1lbnVfcmVmbGVjdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgaW50IGluZGV4KQogewogCXN0cnVjdCBtZW51X2RldmljZSAqZGF0YSA9ICZfX2dldF9jcHVfdmFyKG1lbnVfZGV2aWNlcyk7Ci0JZGF0YS0+bmVlZHNfdXBkYXRlID0gMTsKKwlkYXRhLT5sYXN0X3N0YXRlX2lkeCA9IGluZGV4OworCWlmIChpbmRleCA+PSAwKQorCQlkYXRhLT5uZWVkc191cGRhdGUgPSAxOwogfQogCiAvKioKICAqIG1lbnVfdXBkYXRlIC0gYXR0ZW1wdHMgdG8gZ3Vlc3Mgd2hhdCBoYXBwZW5lZCBhZnRlciBlbnRyeQorICogQGRydjogY3B1aWRsZSBkcml2ZXIgY29udGFpbmluZyBzdGF0ZSBkYXRhCiAgKiBAZGV2OiB0aGUgQ1BVCiAgKi8KLXN0YXRpYyB2b2lkIG1lbnVfdXBkYXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbWVudV91cGRhdGUoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtZW51X2RldmljZSAqZGF0YSA9ICZfX2dldF9jcHVfdmFyKG1lbnVfZGV2aWNlcyk7CiAJaW50IGxhc3RfaWR4ID0gZGF0YS0+bGFzdF9zdGF0ZV9pZHg7CiAJdW5zaWduZWQgaW50IGxhc3RfaWRsZV91cyA9IGNwdWlkbGVfZ2V0X2xhc3RfcmVzaWRlbmN5KGRldik7Ci0Jc3RydWN0IGNwdWlkbGVfc3RhdGUgKnRhcmdldCA9ICZkZXYtPnN0YXRlc1tsYXN0X2lkeF07CisJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnRhcmdldCA9ICZkcnYtPnN0YXRlc1tsYXN0X2lkeF07CiAJdW5zaWduZWQgaW50IG1lYXN1cmVkX3VzOwogCXU2NCBuZXdfZmFjdG9yOwogCkBAIC0zODMsOSArMzg3LDExIEBACiAKIC8qKgogICogbWVudV9lbmFibGVfZGV2aWNlIC0gc2NhbnMgYSBDUFUncyBzdGF0ZXMgYW5kIGRvZXMgc2V0dXAKKyAqIEBkcnY6IGNwdWlkbGUgZHJpdmVyCiAgKiBAZGV2OiB0aGUgQ1BVCiAgKi8KLXN0YXRpYyBpbnQgbWVudV9lbmFibGVfZGV2aWNlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KQorc3RhdGljIGludCBtZW51X2VuYWJsZV9kZXZpY2Uoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1lbnVfZGV2aWNlICpkYXRhID0gJnBlcl9jcHUobWVudV9kZXZpY2VzLCBkZXYtPmNwdSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9zeXNmcy5jIGIvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKaW5kZXggYmU3OTE3ZWMuLjFlNzU2ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9zeXNmcy5jCkBAIC0yMTYsNyArMjE2LDggQEAKIAogc3RydWN0IGNwdWlkbGVfc3RhdGVfYXR0ciB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqLCBjaGFyICopOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqLCBcCisJCQkJCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICosIGNoYXIgKik7CiAJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwogCkBAIC0yMjQsMTkgKzIyNSwyMiBAQAogc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlX2F0dHIgYXR0cl8jI19uYW1lID0gX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93LCBOVUxMKQogCiAjZGVmaW5lIGRlZmluZV9zaG93X3N0YXRlX2Z1bmN0aW9uKF9uYW1lKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3N0YXRlXyMjX25hbWUoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlLCBjaGFyICpidWYpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdGVfIyNfbmFtZShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUsIFwKKwkJCSBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UsIGNoYXIgKmJ1ZikgXAogeyBcCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHN0YXRlLT5fbmFtZSk7XAogfQogCiAjZGVmaW5lIGRlZmluZV9zaG93X3N0YXRlX3VsbF9mdW5jdGlvbihfbmFtZSkgXAotc3RhdGljIHNzaXplX3Qgc2hvd19zdGF0ZV8jI19uYW1lKHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSwgY2hhciAqYnVmKSBcCitzdGF0aWMgc3NpemVfdCBzaG93X3N0YXRlXyMjX25hbWUoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlLCBcCisJCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UsIGNoYXIgKmJ1ZikgXAogeyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgc3RhdGUtPl9uYW1lKTtcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgc3RhdGVfdXNhZ2UtPl9uYW1lKTtcCiB9CiAKICNkZWZpbmUgZGVmaW5lX3Nob3dfc3RhdGVfc3RyX2Z1bmN0aW9uKF9uYW1lKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3N0YXRlXyMjX25hbWUoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlLCBjaGFyICpidWYpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdGVfIyNfbmFtZShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUsIFwKKwkJCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdGF0ZV91c2FnZSwgY2hhciAqYnVmKSBcCiB7IFwKIAlpZiAoc3RhdGUtPl9uYW1lWzBdID09ICdcMCcpXAogCQlyZXR1cm4gc3ByaW50ZihidWYsICI8bnVsbD5cbiIpO1wKQEAgLTI2OSwxNiArMjczLDE4IEBACiAKICNkZWZpbmUga29ial90b19zdGF0ZV9vYmooaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBjcHVpZGxlX3N0YXRlX2tvYmosIGtvYmopCiAjZGVmaW5lIGtvYmpfdG9fc3RhdGUoaykgKGtvYmpfdG9fc3RhdGVfb2JqKGspLT5zdGF0ZSkKKyNkZWZpbmUga29ial90b19zdGF0ZV91c2FnZShrKSAoa29ial90b19zdGF0ZV9vYmooayktPnN0YXRlX3VzYWdlKQogI2RlZmluZSBhdHRyX3RvX3N0YXRlYXR0cihhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IGNwdWlkbGVfc3RhdGVfYXR0ciwgYXR0cikKIHN0YXRpYyBzc2l6ZV90IGNwdWlkbGVfc3RhdGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqIGtvYmosCiAJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgLGNoYXIgKiBidWYpCiB7CiAJaW50IHJldCA9IC1FSU87CiAJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlID0ga29ial90b19zdGF0ZShrb2JqKTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2UgPSBrb2JqX3RvX3N0YXRlX3VzYWdlKGtvYmopOwogCXN0cnVjdCBjcHVpZGxlX3N0YXRlX2F0dHIgKiBjYXR0ciA9IGF0dHJfdG9fc3RhdGVhdHRyKGF0dHIpOwogCiAJaWYgKGNhdHRyLT5zaG93KQotCQlyZXQgPSBjYXR0ci0+c2hvdyhzdGF0ZSwgYnVmKTsKKwkJcmV0ID0gY2F0dHItPnNob3coc3RhdGUsIHN0YXRlX3VzYWdlLCBidWYpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMxNiwxMyArMzIyLDE1IEBACiB7CiAJaW50IGksIHJldCA9IC1FTk9NRU07CiAJc3RydWN0IGNwdWlkbGVfc3RhdGVfa29iaiAqa29iajsKKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9IGNwdWlkbGVfZ2V0X2RyaXZlcigpOwogCiAJLyogc3RhdGUgc3RhdGlzdGljcyAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPnN0YXRlX2NvdW50OyBpKyspIHsKIAkJa29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVpZGxlX3N0YXRlX2tvYmopLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFrb2JqKQogCQkJZ290byBlcnJvcl9zdGF0ZTsKLQkJa29iai0+c3RhdGUgPSAmZGV2aWNlLT5zdGF0ZXNbaV07CisJCWtvYmotPnN0YXRlID0gJmRydi0+c3RhdGVzW2ldOworCQlrb2JqLT5zdGF0ZV91c2FnZSA9ICZkZXZpY2UtPnN0YXRlc191c2FnZVtpXTsKIAkJaW5pdF9jb21wbGV0aW9uKCZrb2JqLT5rb2JqX3VucmVnaXN0ZXIpOwogCiAJCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZrb2JqLT5rb2JqLCAma3R5cGVfc3RhdGVfY3B1aWRsZSwgJmRldmljZS0+a29iaiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCmluZGV4IGUwYjI1ZGUuLjZkMTZiNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKKysrIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwpAQCAtMjAwLDYgKzIwMCw3IEBACiAJc2VsZWN0IENSWVBUT19CTEtDSVBIRVIKIAlzZWxlY3QgSFdfUkFORE9NIGlmIENSWVBUT19ERVZfSElGTl83OTVYX1JORwogCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiAhQVJDSF9ETUFfQUREUl9UXzY0QklUCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBoYXZlIHN1cHBvcnQgZm9yIEhJRk4gNzk1eCBjcnlwdG8gYWRhcHRlcnMuCiAKQEAgLTI2Niw3ICsyNjcsNyBAQAogCiBjb25maWcgQ1JZUFRPX0RFVl9QSUNPWENFTEwKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgcGljb1hjZWxsIElQU0VDIGFuZCBMYXllcjIgY3J5cHRvIGVuZ2luZXMiCi0JZGVwZW5kcyBvbiBBUkNIX1BJQ09YQ0VMTAorCWRlcGVuZHMgb24gQVJDSF9QSUNPWENFTEwgJiYgSEFWRV9DTEsKIAlzZWxlY3QgQ1JZUFRPX0FFUwogCXNlbGVjdCBDUllQVE9fQVVUSEVOQwogCXNlbGVjdCBDUllQVE9fQUxHQVBJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9oaWZuXzc5NXguYyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCmluZGV4IGE4NDI1MGEuLmZlNzY1ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2hpZm5fNzk1eC5jCkBAIC0yNzQ0LDEwICsyNzQ0LDggQEAKIAl1bnNpZ25lZCBpbnQgZnJlcTsKIAlpbnQgZXJyOwogCi0JaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiSElGTiBzdXBwb3J0cyBvbmx5IDMyLWJpdCBhZGRyZXNzZXMuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIEhJRk4gc3VwcG9ydHMgb25seSAzMi1iaXQgYWRkcmVzc2VzICovCisJQlVJTERfQlVHX09OKHNpemVvZihkbWFfYWRkcl90KSAhPSA0KTsKIAogCWlmIChzdHJuY21wKGhpZm5fcGxsX3JlZiwgImV4dCIsIDMpICYmCiAJICAgIHN0cm5jbXAoaGlmbl9wbGxfcmVmLCAicGNpIiwgMykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL212X2Nlc2EuYyBiL2RyaXZlcnMvY3J5cHRvL212X2Nlc2EuYwppbmRleCAzY2YzMDNlLi41YzZmNTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9tdl9jZXNhLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KICNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYwppbmRleCBkMDE4M2RkLi44OTQ0ZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vbjJfY29yZS5jCkBAIC0xMDA2LDkgKzEwMDYsOSBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPmxvY2ssIGZsYWdzKTsKIAorb3V0OgogCXB1dF9jcHUoKTsKIAotb3V0OgogCW4yX2NodW5rX2NvbXBsZXRlKHJlcSwgTlVMTCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEwOTYsOSArMTA5Niw5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+bG9jaywgZmxhZ3MpOwogCitvdXQ6CiAJcHV0X2NwdSgpOwogCi1vdXQ6CiAJbjJfY2h1bmtfY29tcGxldGUocmVxLCBlcnIgPyBOVUxMIDogZmluYWxfaXZfYWRkcik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCmluZGV4IGRiMzNkMzAuLjI5Yjk0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwpAQCAtNTA4LDEwICs1MDgsOCBAQAogCWludCByZXQ7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKDApOwogCi0JaWYgKCFjcHVfaGFzX3hjcnlwdCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICJWSUEgUGFkTG9jayBub3QgZGV0ZWN0ZWQuXG4iKTsKKwlpZiAoIWNwdV9oYXNfeGNyeXB0KQogCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAlpZiAoIWNwdV9oYXNfeGNyeXB0X2VuYWJsZWQpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFIFBGWCAiVklBIFBhZExvY2sgZGV0ZWN0ZWQsIGJ1dCBub3QgZW5hYmxlZC4gSG1tLCBzdHJhbmdlLi4uXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BpY294Y2VsbF9jcnlwdG8uYyBiL2RyaXZlcnMvY3J5cHRvL3BpY294Y2VsbF9jcnlwdG8uYwppbmRleCAyMzBiNWI4Li5hMmI1NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9waWNveGNlbGxfY3J5cHRvLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGljb3hjZWxsX2NyeXB0by5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgpAQCAtMTI0MSw4ICsxMjQyLDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPmh3X2xvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJmNvbXBsZXRlZCwgbGlzdCkgewotCQlyZXEtPmNvbXBsZXRlKHJlcSk7CiAJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCQlyZXEtPmNvbXBsZXRlKHJlcSk7CiAJfQogfQogCkBAIC0xNjU3LDEwICsxNjU4LDMzIEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNwYWNjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJIHVuc2lnbmVkIG1heF9jdHhzLCBzaXplX3QgY2lwaGVyX3BnX3N6LAotCQkJCSBzaXplX3QgaGFzaF9wZ19zeiwgc2l6ZV90IGZpZm9fc3osCi0JCQkJIHN0cnVjdCBzcGFjY19hbGcgKmFsZ3MsIHNpemVfdCBudW1fYWxncykKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwYWNjX29mX2lkX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyIgfSwKKwl7IC5jb21wYXRpYmxlID0gInBpY29jaGlwLHNwYWNjLWwyIiB9LAorCXt9Cit9OworI2Vsc2UgLyogQ09ORklHX09GICovCisjZGVmaW5lIHNwYWNjX29mX2lkX3RhYmxlIE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKworc3RhdGljIGJvb2wgc3BhY2NfaXNfY29tcGF0aWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCWNvbnN0IGNoYXIgKnNwYWNjX3R5cGUpCit7CisJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqcGxhdGlkID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KTsKKworCWlmIChwbGF0aWQgJiYgIXN0cmNtcChwbGF0aWQtPm5hbWUsIHNwYWNjX3R5cGUpKQorCQlyZXR1cm4gdHJ1ZTsKKworI2lmZGVmIENPTkZJR19PRgorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgc3BhY2NfdHlwZSkpCisJCXJldHVybiB0cnVlOworI2VuZGlmIC8qIENPTkZJR19PRiAqLworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcGFjY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBpLCBlcnIsIHJldCA9IC1FSU5WQUw7CiAJc3RydWN0IHJlc291cmNlICptZW0sICppcnE7CkBAIC0xNjY5LDEzICsxNjkzLDI1IEBACiAJaWYgKCFlbmdpbmUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZW5naW5lLT5tYXhfY3R4cwk9IG1heF9jdHhzOwotCWVuZ2luZS0+Y2lwaGVyX3BnX3N6CT0gY2lwaGVyX3BnX3N6OwotCWVuZ2luZS0+aGFzaF9wZ19zegk9IGhhc2hfcGdfc3o7Ci0JZW5naW5lLT5maWZvX3N6CQk9IGZpZm9fc3o7Ci0JZW5naW5lLT5hbGdzCQk9IGFsZ3M7Ci0JZW5naW5lLT5udW1fYWxncwk9IG51bV9hbGdzOwotCWVuZ2luZS0+bmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlpZiAoc3BhY2NfaXNfY29tcGF0aWJsZShwZGV2LCAicGljb2NoaXAsc3BhY2MtaXBzZWMiKSkgeworCQllbmdpbmUtPm1heF9jdHhzCT0gU1BBQ0NfQ1JZUFRPX0lQU0VDX01BWF9DVFhTOworCQllbmdpbmUtPmNpcGhlcl9wZ19zegk9IFNQQUNDX0NSWVBUT19JUFNFQ19DSVBIRVJfUEdfU1o7CisJCWVuZ2luZS0+aGFzaF9wZ19zegk9IFNQQUNDX0NSWVBUT19JUFNFQ19IQVNIX1BHX1NaOworCQllbmdpbmUtPmZpZm9fc3oJCT0gU1BBQ0NfQ1JZUFRPX0lQU0VDX0ZJRk9fU1o7CisJCWVuZ2luZS0+YWxncwkJPSBpcHNlY19lbmdpbmVfYWxnczsKKwkJZW5naW5lLT5udW1fYWxncwk9IEFSUkFZX1NJWkUoaXBzZWNfZW5naW5lX2FsZ3MpOworCX0gZWxzZSBpZiAoc3BhY2NfaXNfY29tcGF0aWJsZShwZGV2LCAicGljb2NoaXAsc3BhY2MtbDIiKSkgeworCQllbmdpbmUtPm1heF9jdHhzCT0gU1BBQ0NfQ1JZUFRPX0wyX01BWF9DVFhTOworCQllbmdpbmUtPmNpcGhlcl9wZ19zegk9IFNQQUNDX0NSWVBUT19MMl9DSVBIRVJfUEdfU1o7CisJCWVuZ2luZS0+aGFzaF9wZ19zegk9IFNQQUNDX0NSWVBUT19MMl9IQVNIX1BHX1NaOworCQllbmdpbmUtPmZpZm9fc3oJCT0gU1BBQ0NfQ1JZUFRPX0wyX0ZJRk9fU1o7CisJCWVuZ2luZS0+YWxncwkJPSBsMl9lbmdpbmVfYWxnczsKKwkJZW5naW5lLT5udW1fYWxncwk9IEFSUkFZX1NJWkUobDJfZW5naW5lX2FsZ3MpOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuZ2luZS0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwpAQCAtMTcxMSw3ICsxNzQ3LDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCZlbmdpbmUtPmh3X2xvY2spOwogCi0JZW5naW5lLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWVuZ2luZS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicmVmIik7CiAJaWYgKElTX0VSUihlbmdpbmUtPmNsaykpIHsKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNsayB1bmF2YWlsYWJsZVxuIik7CiAJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF9pcnFfdGhyZXNoKTsKQEAgLTE4MDAsNzIgKzE4MzYsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgaXBzZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc3BhY2NfcHJvYmUocGRldiwgU1BBQ0NfQ1JZUFRPX0lQU0VDX01BWF9DVFhTLAotCQkJICAgU1BBQ0NfQ1JZUFRPX0lQU0VDX0NJUEhFUl9QR19TWiwKLQkJCSAgIFNQQUNDX0NSWVBUT19JUFNFQ19IQVNIX1BHX1NaLAotCQkJICAgU1BBQ0NfQ1JZUFRPX0lQU0VDX0ZJRk9fU1osIGlwc2VjX2VuZ2luZV9hbGdzLAotCQkJICAgQVJSQVlfU0laRShpcHNlY19lbmdpbmVfYWxncykpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpcHNlY19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGlwc2VjX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3BhY2NfcmVtb3ZlKSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicGljb3hjZWxsLWlwc2VjIiwKLSNpZmRlZiBDT05GSUdfUE0KLQkJLnBtCT0gJnNwYWNjX3BtX29wcywKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQl9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc3BhY2NfaWRfdGFibGVbXSA9IHsKKwl7ICJwaWNvY2hpcCxzcGFjYy1pcHNlYyIsIH0sCisJeyAicGljb2NoaXAsc3BhY2MtbDIiLCB9LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgbDJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc3BhY2NfcHJvYmUocGRldiwgU1BBQ0NfQ1JZUFRPX0wyX01BWF9DVFhTLAotCQkJICAgU1BBQ0NfQ1JZUFRPX0wyX0NJUEhFUl9QR19TWiwKLQkJCSAgIFNQQUNDX0NSWVBUT19MMl9IQVNIX1BHX1NaLCBTUEFDQ19DUllQVE9fTDJfRklGT19TWiwKLQkJCSAgIGwyX2VuZ2luZV9hbGdzLCBBUlJBWV9TSVpFKGwyX2VuZ2luZV9hbGdzKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGwyX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gbDJfcHJvYmUsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGFjY19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNwYWNjX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3BhY2NfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicGljb3hjZWxsLWwyIiwKKwkJLm5hbWUJPSAicGljb2NoaXAsc3BhY2MiLAogI2lmZGVmIENPTkZJR19QTQogCQkucG0JPSAmc3BhY2NfcG1fb3BzLAogI2VuZGlmIC8qIENPTkZJR19QTSAqLworCQkub2ZfbWF0Y2hfdGFibGUJPSBzcGFjY19vZl9pZF90YWJsZSwKIAl9LAorCS5pZF90YWJsZQk9IHNwYWNjX2lkX3RhYmxlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc3BhY2NfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlwc2VjX2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBpcHNlYyBzcGFjYyBkcml2ZXIiKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsMl9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgbDIgc3BhY2MgZHJpdmVyIik7Ci0JCWdvdG8gbDJfZmFpbGVkOwotCX0KLQotCXJldHVybiAwOwotCi1sMl9mYWlsZWQ6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlwc2VjX2RyaXZlcik7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGFjY19kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoc3BhY2NfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzcGFjY19leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlwc2VjX2RyaXZlcik7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmwyX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwYWNjX2RyaXZlcik7CiB9CiBtb2R1bGVfZXhpdChzcGFjY19leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jIGIvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCmluZGV4IDhhMGJiNDEuLmRiZTc2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYworKysgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogLyoKICAqIGxvY2F0ZSBjdXJyZW50IChvZmZlbmRpbmcpIGRlc2NyaXB0b3IKICAqLwotc3RhdGljIHN0cnVjdCB0YWxpdG9zX2Rlc2MgKmN1cnJlbnRfZGVzYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaCkKK3N0YXRpYyB1MzIgY3VycmVudF9kZXNjX2hkcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaCkKIHsKIAlzdHJ1Y3QgdGFsaXRvc19wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHRhaWwgPSBwcml2LT5jaGFuW2NoXS50YWlsOwpAQCAtNDI4LDIzICs0MjgsMjUgQEAKIAkJdGFpbCA9ICh0YWlsICsgMSkgJiAocHJpdi0+Zmlmb19sZW4gLSAxKTsKIAkJaWYgKHRhaWwgPT0gcHJpdi0+Y2hhbltjaF0udGFpbCkgewogCQkJZGV2X2VycihkZXYsICJjb3VsZG4ndCBsb2NhdGUgY3VycmVudCBkZXNjcmlwdG9yXG4iKTsKLQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQlyZXR1cm4gcHJpdi0+Y2hhbltjaF0uZmlmb1t0YWlsXS5kZXNjOworCXJldHVybiBwcml2LT5jaGFuW2NoXS5maWZvW3RhaWxdLmRlc2MtPmhkcjsKIH0KIAogLyoKICAqIHVzZXIgZGlhZ25vc3RpY3M7IHJlcG9ydCByb290IGNhdXNlIG9mIGVycm9yIGJhc2VkIG9uIGV4ZWN1dGlvbiB1bml0IHN0YXR1cwogICovCi1zdGF0aWMgdm9pZCByZXBvcnRfZXVfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY2gsCi0JCQkgICAgc3RydWN0IHRhbGl0b3NfZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIHJlcG9ydF9ldV9lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjaCwgdTMyIGRlc2NfaGRyKQogewogCXN0cnVjdCB0YWxpdG9zX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaTsKIAotCXN3aXRjaCAoZGVzYy0+aGRyICYgREVTQ19IRFJfU0VMMF9NQVNLKSB7CisJaWYgKCFkZXNjX2hkcikKKwkJZGVzY19oZHIgPSBpbl9iZTMyKHByaXYtPnJlZyArIFRBTElUT1NfREVTQ0JVRihjaCkpOworCisJc3dpdGNoIChkZXNjX2hkciAmIERFU0NfSERSX1NFTDBfTUFTSykgewogCWNhc2UgREVTQ19IRFJfU0VMMF9BRkVVOgogCQlkZXZfZXJyKGRldiwgIkFGRVVJU1IgMHglMDh4XyUwOHhcbiIsCiAJCQlpbl9iZTMyKHByaXYtPnJlZyArIFRBTElUT1NfQUZFVUlTUiksCkBAIC00ODgsNyArNDkwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0Jc3dpdGNoIChkZXNjLT5oZHIgJiBERVNDX0hEUl9TRUwxX01BU0spIHsKKwlzd2l0Y2ggKGRlc2NfaGRyICYgREVTQ19IRFJfU0VMMV9NQVNLKSB7CiAJY2FzZSBERVNDX0hEUl9TRUwxX01ERVVBOgogCWNhc2UgREVTQ19IRFJfU0VMMV9NREVVQjoKIAkJZGV2X2VycihkZXYsICJNREVVSVNSIDB4JTA4eF8lMDh4XG4iLApAQCAtNTUwLDcgKzU1Miw3IEBACiAJCWlmICh2X2xvICYgVEFMSVRPU19DQ1BTUl9MT19JRVUpCiAJCQlkZXZfZXJyKGRldiwgImludmFsaWQgZXhlY3V0aW9uIHVuaXQgZXJyb3JcbiIpOwogCQlpZiAodl9sbyAmIFRBTElUT1NfQ0NQU1JfTE9fRVUpCi0JCQlyZXBvcnRfZXVfZXJyb3IoZGV2LCBjaCwgY3VycmVudF9kZXNjKGRldiwgY2gpKTsKKwkJCXJlcG9ydF9ldV9lcnJvcihkZXYsIGNoLCBjdXJyZW50X2Rlc2NfaGRyKGRldiwgY2gpKTsKIAkJaWYgKHZfbG8gJiBUQUxJVE9TX0NDUFNSX0xPX0dCKQogCQkJZGV2X2VycihkZXYsICJnYXRoZXIgYm91bmRhcnkgZXJyb3JcbiIpOwogCQlpZiAodl9sbyAmIFRBTElUT1NfQ0NQU1JfTE9fR1JMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kY2EvZGNhLWNvcmUuYyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKaW5kZXggMjVlYzBiYi4uYmM2ZjVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kY2EvZGNhLWNvcmUuYworKysgYi9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGNhLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERDQV9WRVJTSU9OICIxLjEyLjEiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGNhL2RjYS1zeXNmcy5jIGIvZHJpdmVycy9kY2EvZGNhLXN5c2ZzLmMKaW5kZXggNWU4ZjMzNS4uNTkxYjY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kY2EvZGNhLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9kY2EvZGNhLXN5c2ZzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kY2EuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqZGNhX2NsYXNzOwogc3RhdGljIHN0cnVjdCBpZHIgZGNhX2lkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDJlM2IzZDMuLmFiOGY0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTkzLDcgKzE5Myw4IEBACiBjb25maWcgUEwzMzBfRE1BCiAJdHJpc3RhdGUgIkRNQSBBUEkgRHJpdmVyIGZvciBQTDMzMCIKIAlzZWxlY3QgRE1BX0VOR0lORQotCWRlcGVuZHMgb24gUEwzMzAKKwlkZXBlbmRzIG9uIEFSTV9BTUJBCisJc2VsZWN0IFBMMzMwCiAJaGVscAogCSAgU2VsZWN0IGlmIHlvdXIgcGxhdGZvcm0gaGFzIG9uZSBvciBtb3JlIFBMMzMwIERNQUNzLgogCSAgWW91IG5lZWQgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyB2aWEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYyBiL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYwppbmRleCBiZTIxZTNmLi5iN2NiZDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKKysrIGIvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCkBAIC02NiwzMiArNjYsMjkgQEAKICAqICAgIGFmdGVyIHRoZSBmaW5hbCB0cmFuc2ZlciBzaWduYWxsZWQgYnkgTEJSRVEgb3IgTFNSRVEuICBUaGUgRE1BQwogICogICAgd2lsbCB0aGVuIG1vdmUgdG8gdGhlIG5leHQgTExJIGVudHJ5LgogICoKLSAqIE9ubHkgdGhlIGZvcm1lciB3b3JrcyBzYW5lbHkgd2l0aCBzY2F0dGVyIGxpc3RzLCBzbyB3ZSBvbmx5IGltcGxlbWVudAotICogdGhlIERNQUMgZmxvdyBjb250cm9sIG1ldGhvZC4gIEhvd2V2ZXIsIHBlcmlwaGVyYWxzIHdoaWNoIHVzZSB0aGUgTEJSRVEKLSAqIGFuZCBMU1JFUSBzaWduYWxzIChlZywgTU1DSSkgYXJlIHVuYWJsZSB0byB1c2UgdGhpcyBtb2RlLCB3aGljaCB0aHJvdWdoCi0gKiB0aGVzZSBoYXJkd2FyZSByZXN0cmljdGlvbnMgcHJldmVudHMgdGhlbSBmcm9tIHVzaW5nIHNjYXR0ZXIgRE1BLgotICoKICAqIEdsb2JhbCBUT0RPOgogICogLSBCcmVhayBvdXQgY29tbW9uIGNvZGUgZnJvbSBhcmNoL2FybS9tYWNoLXMzYzY0eHggYW5kIHNoYXJlCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDh4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9wbDA4MC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJwbDA4eGRtYWMiCiAKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwwOHhfYW1iYV9kcml2ZXI7CisKIC8qKgogICogc3RydWN0IHZlbmRvcl9kYXRhIC0gdmVuZG9yLXNwZWNpZmljIGNvbmZpZyBwYXJhbWV0ZXJzIGZvciBQTDA4eCBkZXJpdmF0aXZlcwogICogQGNoYW5uZWxzOiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSBpbiB0aGlzIHZhcmlhbnQKQEAgLTEyNiw3ICsxMjMsOCBAQAogICogQHBoeV9jaGFuczogYXJyYXkgb2YgZGF0YSBmb3IgdGhlIHBoeXNpY2FsIGNoYW5uZWxzCiAgKiBAcG9vbDogYSBwb29sIGZvciB0aGUgTExJIGRlc2NyaXB0b3JzCiAgKiBAcG9vbF9jdHI6IGNvdW50ZXIgb2YgTExJcyBpbiB0aGUgcG9vbAotICogQGxsaV9idXNlczogYml0bWFzayB0byBvciBpbiB0byBMTEkgcG9pbnRlciBzZWxlY3RpbmcgQUhCIHBvcnQgZm9yIExMSSBmZXRjaGVzCisgKiBAbGxpX2J1c2VzOiBiaXRtYXNrIHRvIG9yIGluIHRvIExMSSBwb2ludGVyIHNlbGVjdGluZyBBSEIgcG9ydCBmb3IgTExJCisgKiBmZXRjaGVzCiAgKiBAbWVtX2J1c2VzOiBzZXQgdG8gaW5kaWNhdGUgbWVtb3J5IHRyYW5zZmVycyBvbiBBSEIyLgogICogQGxvY2s6IGEgc3BpbmxvY2sgZm9yIHRoaXMgc3RydWN0CiAgKi8KQEAgLTE0OSwxNCArMTQ3LDYgQEAKICAqIFBMMDhYIHNwZWNpZmljIGRlZmluZXMKICAqLwogCi0vKgotICogTWVtb3J5IGJvdW5kYXJpZXM6IHRoZSBtYW51YWwgZm9yIFBMMDh4IHNheXMgdGhhdCB0aGUgY29udHJvbGxlcgotICogY2Fubm90IHJlYWQgcGFzdCBhIDFLaUIgYm91bmRhcnksIHNvIHRoZXNlIGRlZmluZXMgYXJlIHVzZWQgdG8KLSAqIGNyZWF0ZSB0cmFuc2ZlciBMTElzIHRoYXQgZG8gbm90IGNyb3NzIHN1Y2ggYm91bmRhcmllcy4KLSAqLwotI2RlZmluZSBQTDA4WF9CT1VOREFSWV9TSElGVAkJKDEwKQkvKiAxS0IgMHg0MDAgKi8KLSNkZWZpbmUgUEwwOFhfQk9VTkRBUllfU0laRQkJKDEgPDwgUEwwOFhfQk9VTkRBUllfU0hJRlQpCi0KIC8qIFNpemUgKGJ5dGVzKSBvZiBlYWNoIExMSSBidWZmZXIgYWxsb2NhdGVkIGZvciBvbmUgdHJhbnNmZXIgKi8KICMgZGVmaW5lIFBMMDhYX0xMSV9UU0ZSX1NJWkUJMHgyMDAwCiAKQEAgLTI3Miw3ICsyNjIsNiBAQAogCXdyaXRlbCh2YWwsIGNoLT5iYXNlICsgUEwwODBfQ0hfQ09ORklHKTsKIH0KIAotCiAvKgogICogcGwwOHhfdGVybWluYXRlX3BoeV9jaGFuKCkgc3RvcHMgdGhlIGNoYW5uZWwsIGNsZWFycyB0aGUgRklGTyBhbmQKICAqIGNsZWFycyBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgc3RhdHVzLiAgVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yCkBAIC0zNjMsNyArMzUyLDkgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnBsY2hhbi0+cGVuZF9saXN0KSkgewogCQlzdHJ1Y3QgcGwwOHhfdHhkICp0eGRpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR4ZGksICZwbGNoYW4tPnBlbmRfbGlzdCwgbm9kZSkgewotCQkJYnl0ZXMgKz0gdHhkaS0+bGVuOworCQkJc3RydWN0IHBsMDh4X3NnICpkc2c7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpCisJCQkJYnl0ZXMgKz0gZHNnLT5sZW47CiAJCX0KIAl9CiAKQEAgLTQwNyw2ICszOTgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZwbDA4eC0+YWRldi0+ZGV2KTsKIAlyZXR1cm4gY2g7CiB9CiAKQEAgLTQyMCw2ICs0MTIsOCBAQAogCS8qIFN0b3AgdGhlIGNoYW5uZWwgYW5kIGNsZWFyIGl0cyBpbnRlcnJ1cHRzICovCiAJcGwwOHhfdGVybWluYXRlX3BoeV9jaGFuKHBsMDh4LCBjaCk7CiAKKwlwbV9ydW50aW1lX3B1dCgmcGwwOHgtPmFkZXYtPmRldik7CisKIAkvKiBNYXJrIGl0IGFzIGZyZWUgKi8KIAljaC0+c2VydmluZyA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGZsYWdzKTsKQEAgLTQ5OSwzNiArNDkzLDMwIEBACiB9OwogCiAvKgotICogQXV0b3NlbGVjdCBhIG1hc3RlciBidXMgdG8gdXNlIGZvciB0aGUgdHJhbnNmZXIgdGhpcyBwcmVmZXJzIHRoZQotICogZGVzdGluYXRpb24gYnVzIGlmIGJvdGggYXZhaWxhYmxlIGlmIGZpeGVkIGFkZHJlc3Mgb24gb25lIGJ1cyB0aGUKLSAqIG90aGVyIHdpbGwgYmUgY2hvc2VuCisgKiBBdXRvc2VsZWN0IGEgbWFzdGVyIGJ1cyB0byB1c2UgZm9yIHRoZSB0cmFuc2Zlci4gU2xhdmUgd2lsbCBiZSB0aGUgY2hvc2VuIGFzCisgKiB2aWN0aW0gaW4gY2FzZSBzcmMgJiBkZXN0IGFyZSBub3Qgc2ltaWxhcmx5IGFsaWduZWQuIGkuZS4gSWYgYWZ0ZXIgYWxpZ25pbmcKKyAqIG1hc3RlcnMgYWRkcmVzcyB3aXRoIHdpZHRoIHJlcXVpcmVtZW50cyBvZiB0cmFuc2ZlciAoYnkgc2VuZGluZyBmZXcgYnl0ZSBieQorICogYnl0ZSBkYXRhKSwgc2xhdmUgaXMgc3RpbGwgbm90IGFsaWduZWQsIHRoZW4gaXRzIHdpZHRoIHdpbGwgYmUgcmVkdWNlZCB0bworICogQllURS4KKyAqIC0gcHJlZmVycyB0aGUgZGVzdGluYXRpb24gYnVzIGlmIGJvdGggYXZhaWxhYmxlCisgKiAtIHByZWZlcnMgYnVzIHdpdGggZml4ZWQgYWRkcmVzcyAoaS5lLiBwZXJpcGhlcmFsKQogICovCiBzdGF0aWMgdm9pZCBwbDA4eF9jaG9vc2VfbWFzdGVyX2J1cyhzdHJ1Y3QgcGwwOHhfbGxpX2J1aWxkX2RhdGEgKmJkLAogCXN0cnVjdCBwbDA4eF9idXNfZGF0YSAqKm1idXMsIHN0cnVjdCBwbDA4eF9idXNfZGF0YSAqKnNidXMsIHUzMiBjY3RsKQogewogCWlmICghKGNjdGwgJiBQTDA4MF9DT05UUk9MX0RTVF9JTkNSKSkgewotCQkqbWJ1cyA9ICZiZC0+c3JjYnVzOwotCQkqc2J1cyA9ICZiZC0+ZHN0YnVzOwotCX0gZWxzZSBpZiAoIShjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUikpIHsKIAkJKm1idXMgPSAmYmQtPmRzdGJ1czsKIAkJKnNidXMgPSAmYmQtPnNyY2J1czsKKwl9IGVsc2UgaWYgKCEoY2N0bCAmIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IpKSB7CisJCSptYnVzID0gJmJkLT5zcmNidXM7CisJCSpzYnVzID0gJmJkLT5kc3RidXM7CiAJfSBlbHNlIHsKLQkJaWYgKGJkLT5kc3RidXMuYnVzd2lkdGggPT0gNCkgeworCQlpZiAoYmQtPmRzdGJ1cy5idXN3aWR0aCA+PSBiZC0+c3JjYnVzLmJ1c3dpZHRoKSB7CiAJCQkqbWJ1cyA9ICZiZC0+ZHN0YnVzOwogCQkJKnNidXMgPSAmYmQtPnNyY2J1czsKLQkJfSBlbHNlIGlmIChiZC0+c3JjYnVzLmJ1c3dpZHRoID09IDQpIHsKLQkJCSptYnVzID0gJmJkLT5zcmNidXM7Ci0JCQkqc2J1cyA9ICZiZC0+ZHN0YnVzOwotCQl9IGVsc2UgaWYgKGJkLT5kc3RidXMuYnVzd2lkdGggPT0gMikgewotCQkJKm1idXMgPSAmYmQtPmRzdGJ1czsKLQkJCSpzYnVzID0gJmJkLT5zcmNidXM7Ci0JCX0gZWxzZSBpZiAoYmQtPnNyY2J1cy5idXN3aWR0aCA9PSAyKSB7Ci0JCQkqbWJ1cyA9ICZiZC0+c3JjYnVzOwotCQkJKnNidXMgPSAmYmQtPmRzdGJ1czsKIAkJfSBlbHNlIHsKLQkJCS8qIGJkLT5zcmNidXMuYnVzd2lkdGggPT0gMSAqLwotCQkJKm1idXMgPSAmYmQtPmRzdGJ1czsKLQkJCSpzYnVzID0gJmJkLT5zcmNidXM7CisJCQkqbWJ1cyA9ICZiZC0+c3JjYnVzOworCQkJKnNidXMgPSAmYmQtPmRzdGJ1czsKIAkJfQogCX0KIH0KQEAgLTU0Nyw3ICs1MzUsOCBAQAogCWxsaXNfdmFbbnVtX2xsaXNdLmNjdGwgPSBjY3RsOwogCWxsaXNfdmFbbnVtX2xsaXNdLnNyYyA9IGJkLT5zcmNidXMuYWRkcjsKIAlsbGlzX3ZhW251bV9sbGlzXS5kc3QgPSBiZC0+ZHN0YnVzLmFkZHI7Ci0JbGxpc192YVtudW1fbGxpc10ubGxpID0gbGxpc19idXMgKyAobnVtX2xsaXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcGwwOHhfbGxpKTsKKwlsbGlzX3ZhW251bV9sbGlzXS5sbGkgPSBsbGlzX2J1cyArIChudW1fbGxpcyArIDEpICoKKwkJc2l6ZW9mKHN0cnVjdCBwbDA4eF9sbGkpOwogCWxsaXNfdmFbbnVtX2xsaXNdLmxsaSB8PSBiZC0+bGxpX2J1czsKIAogCWlmIChjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUikKQEAgLTU2MCwxNiArNTQ5LDEyIEBACiAJYmQtPnJlbWFpbmRlciAtPSBsZW47CiB9CiAKLS8qCi0gKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRvIGZpbGwgdG8gYm91bmRhcnksIG9yIGxlbi4KLSAqIFRoaXMgY2FsY3VsYXRpb24gd29ya3MgZm9yIGFueSB2YWx1ZSBvZiBhZGRyLgotICovCi1zdGF0aWMgaW5saW5lIHNpemVfdCBwbDA4eF9wcmVfYm91bmRhcnkodTMyIGFkZHIsIHNpemVfdCBsZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcF9ieXRlX3dpZHRoX2xsaShzdHJ1Y3QgcGwwOHhfbGxpX2J1aWxkX2RhdGEgKmJkLAorCQl1MzIgKmNjdGwsIHUzMiBsZW4sIGludCBudW1fbGxpcywgc2l6ZV90ICp0b3RhbF9ieXRlcykKIHsKLQlzaXplX3QgYm91bmRhcnlfbGVuID0gUEwwOFhfQk9VTkRBUllfU0laRSAtCi0JCQkoYWRkciAmIChQTDA4WF9CT1VOREFSWV9TSVpFIC0gMSkpOwotCi0JcmV0dXJuIG1pbihib3VuZGFyeV9sZW4sIGxlbik7CisJKmNjdGwgPSBwbDA4eF9jY3RsX2JpdHMoKmNjdGwsIDEsIDEsIGxlbik7CisJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoYmQsIG51bV9sbGlzLCBsZW4sICpjY3RsKTsKKwkoKnRvdGFsX2J5dGVzKSArPSBsZW47CiB9CiAKIC8qCkBAIC01ODMsMTMgKzU2OCwxMiBAQAogCXN0cnVjdCBwbDA4eF9idXNfZGF0YSAqbWJ1cywgKnNidXM7CiAJc3RydWN0IHBsMDh4X2xsaV9idWlsZF9kYXRhIGJkOwogCWludCBudW1fbGxpcyA9IDA7Ci0JdTMyIGNjdGw7Ci0Jc2l6ZV90IG1heF9ieXRlc19wZXJfbGxpOwotCXNpemVfdCB0b3RhbF9ieXRlcyA9IDA7CisJdTMyIGNjdGwsIGVhcmx5X2J5dGVzID0gMDsKKwlzaXplX3QgbWF4X2J5dGVzX3Blcl9sbGksIHRvdGFsX2J5dGVzOwogCXN0cnVjdCBwbDA4eF9sbGkgKmxsaXNfdmE7CisJc3RydWN0IHBsMDh4X3NnICpkc2c7CiAKLQl0eGQtPmxsaXNfdmEgPSBkbWFfcG9vbF9hbGxvYyhwbDA4eC0+cG9vbCwgR0ZQX05PV0FJVCwKLQkJCQkgICAgICAmdHhkLT5sbGlzX2J1cyk7CisJdHhkLT5sbGlzX3ZhID0gZG1hX3Bvb2xfYWxsb2MocGwwOHgtPnBvb2wsIEdGUF9OT1dBSVQsICZ0eGQtPmxsaXNfYnVzKTsKIAlpZiAoIXR4ZC0+bGxpc192YSkgewogCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgbm8gbWVtb3J5IGZvciBsbGlzXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwpAQCAtNTk3LDEzICs1ODEsOSBAQAogCiAJcGwwOHgtPnBvb2xfY3RyKys7CiAKLQkvKiBHZXQgdGhlIGRlZmF1bHQgQ0NUTCAqLwotCWNjdGwgPSB0eGQtPmNjdGw7Ci0KIAliZC50eGQgPSB0eGQ7Ci0JYmQuc3JjYnVzLmFkZHIgPSB0eGQtPnNyY19hZGRyOwotCWJkLmRzdGJ1cy5hZGRyID0gdHhkLT5kc3RfYWRkcjsKIAliZC5sbGlfYnVzID0gKHBsMDh4LT5sbGlfYnVzZXMgJiBQTDA4WF9BSEIyKSA/IFBMMDgwX0xMSV9MTV9BSEIyIDogMDsKKwljY3RsID0gdHhkLT5jY3RsOwogCiAJLyogRmluZCBtYXhpbXVtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVzICovCiAJYmQuc3JjYnVzLm1heHdpZHRoID0KQEAgLTYxNSwyMTUgKzU5NSwxNzkgQEAKIAkJcGwwOHhfZ2V0X2J5dGVzX2Zvcl9jY3RsKChjY3RsICYgUEwwODBfQ09OVFJPTF9EV0lEVEhfTUFTSykgPj4KIAkJCQkgICAgICAgUEwwODBfQ09OVFJPTF9EV0lEVEhfU0hJRlQpOwogCi0JLyogU2V0IHVwIHRoZSBidXMgd2lkdGhzIHRvIHRoZSBtYXhpbXVtICovCi0JYmQuc3JjYnVzLmJ1c3dpZHRoID0gYmQuc3JjYnVzLm1heHdpZHRoOwotCWJkLmRzdGJ1cy5idXN3aWR0aCA9IGJkLmRzdGJ1cy5tYXh3aWR0aDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpIHsKKwkJdG90YWxfYnl0ZXMgPSAwOworCQljY3RsID0gdHhkLT5jY3RsOwogCi0JLyoKLQkgKiBCeXRlcyB0cmFuc2ZlcnJlZCA9PSB0c2l6ZSAqIE1JTihidXN3aWR0aHMpLCBub3QgbWF4KGJ1c3dpZHRocykKLQkgKi8KLQltYXhfYnl0ZXNfcGVyX2xsaSA9IG1pbihiZC5zcmNidXMuYnVzd2lkdGgsIGJkLmRzdGJ1cy5idXN3aWR0aCkgKgotCQlQTDA4MF9DT05UUk9MX1RSQU5TRkVSX1NJWkVfTUFTSzsKKwkJYmQuc3JjYnVzLmFkZHIgPSBkc2ctPnNyY19hZGRyOworCQliZC5kc3RidXMuYWRkciA9IGRzZy0+ZHN0X2FkZHI7CisJCWJkLnJlbWFpbmRlciA9IGRzZy0+bGVuOworCQliZC5zcmNidXMuYnVzd2lkdGggPSBiZC5zcmNidXMubWF4d2lkdGg7CisJCWJkLmRzdGJ1cy5idXN3aWR0aCA9IGJkLmRzdGJ1cy5tYXh3aWR0aDsKIAotCS8qIFdlIG5lZWQgdG8gY291bnQgdGhpcyBkb3duIHRvIHplcm8gKi8KLQliZC5yZW1haW5kZXIgPSB0eGQtPmxlbjsKKwkJcGwwOHhfY2hvb3NlX21hc3Rlcl9idXMoJmJkLCAmbWJ1cywgJnNidXMsIGNjdGwpOwogCi0JLyoKLQkgKiBDaG9vc2UgYnVzIHRvIGFsaWduIHRvCi0JICogLSBwcmVmZXJzIGRlc3RpbmF0aW9uIGJ1cyBpZiBib3RoIGF2YWlsYWJsZQotCSAqIC0gaWYgZml4ZWQgYWRkcmVzcyBvbiBvbmUgYnVzIGNob29zZXMgb3RoZXIKLQkgKi8KLQlwbDA4eF9jaG9vc2VfbWFzdGVyX2J1cygmYmQsICZtYnVzLCAmc2J1cywgY2N0bCk7Ci0KLQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwgInNyYz0weCUwOHglcy8ldSBkc3Q9MHglMDh4JXMvJXUgbGVuPSV6dSBsbGltYXg9JXp1XG4iLAotCQkgYmQuc3JjYnVzLmFkZHIsIGNjdGwgJiBQTDA4MF9DT05UUk9MX1NSQ19JTkNSID8gIisiIDogIiIsCi0JCSBiZC5zcmNidXMuYnVzd2lkdGgsCi0JCSBiZC5kc3RidXMuYWRkciwgY2N0bCAmIFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IgPyAiKyIgOiAiIiwKLQkJIGJkLmRzdGJ1cy5idXN3aWR0aCwKLQkJIGJkLnJlbWFpbmRlciwgbWF4X2J5dGVzX3Blcl9sbGkpOwotCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAibWJ1cz0lcyBzYnVzPSVzXG4iLAotCQkgbWJ1cyA9PSAmYmQuc3JjYnVzID8gInNyYyIgOiAiZHN0IiwKLQkJIHNidXMgPT0gJmJkLnNyY2J1cyA/ICJzcmMiIDogImRzdCIpOwotCi0JaWYgKHR4ZC0+bGVuIDwgbWJ1cy0+YnVzd2lkdGgpIHsKLQkJLyogTGVzcyB0aGFuIGEgYnVzIHdpZHRoIGF2YWlsYWJsZSAtIHNlbmQgYXMgc2luZ2xlIGJ5dGVzICovCi0JCXdoaWxlIChiZC5yZW1haW5kZXIpIHsKLQkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJCSAiJXMgc2luZ2xlIGJ5dGUgTExJcyBmb3IgYSB0cmFuc2ZlciBvZiAiCi0JCQkJICJsZXNzIHRoYW4gYSBidXMgd2lkdGggKHJlbWFpbiAweCUwOHgpXG4iLAotCQkJCSBfX2Z1bmNfXywgYmQucmVtYWluZGVyKTsKLQkJCWNjdGwgPSBwbDA4eF9jY3RsX2JpdHMoY2N0bCwgMSwgMSwgMSk7Ci0JCQlwbDA4eF9maWxsX2xsaV9mb3JfZGVzYygmYmQsIG51bV9sbGlzKyssIDEsIGNjdGwpOwotCQkJdG90YWxfYnl0ZXMrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIE1ha2Ugb25lIGJ5dGUgTExJcyB1bnRpbCBtYXN0ZXIgYnVzIGlzIGFsaWduZWQgKi8KLQkJd2hpbGUgKChtYnVzLT5hZGRyKSAlIChtYnVzLT5idXN3aWR0aCkpIHsKLQkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJCSIlcyBhZGp1c3RtZW50IGxsaSBmb3IgbGVzcyB0aGFuIGJ1cyB3aWR0aCAiCi0JCQkJICIocmVtYWluIDB4JTA4eClcbiIsCi0JCQkJIF9fZnVuY19fLCBiZC5yZW1haW5kZXIpOwotCQkJY2N0bCA9IHBsMDh4X2NjdGxfYml0cyhjY3RsLCAxLCAxLCAxKTsKLQkJCXBsMDh4X2ZpbGxfbGxpX2Zvcl9kZXNjKCZiZCwgbnVtX2xsaXMrKywgMSwgY2N0bCk7Ci0JCQl0b3RhbF9ieXRlcysrOwotCQl9CisJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAic3JjPTB4JTA4eCVzLyV1IGRzdD0weCUwOHglcy8ldSBsZW49JXp1XG4iLAorCQkJYmQuc3JjYnVzLmFkZHIsIGNjdGwgJiBQTDA4MF9DT05UUk9MX1NSQ19JTkNSID8gIisiIDogIiIsCisJCQliZC5zcmNidXMuYnVzd2lkdGgsCisJCQliZC5kc3RidXMuYWRkciwgY2N0bCAmIFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IgPyAiKyIgOiAiIiwKKwkJCWJkLmRzdGJ1cy5idXN3aWR0aCwKKwkJCWJkLnJlbWFpbmRlcik7CisJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAibWJ1cz0lcyBzYnVzPSVzXG4iLAorCQkJbWJ1cyA9PSAmYmQuc3JjYnVzID8gInNyYyIgOiAiZHN0IiwKKwkJCXNidXMgPT0gJmJkLnNyY2J1cyA/ICJzcmMiIDogImRzdCIpOwogCiAJCS8qCi0JCSAqIE1hc3RlciBub3cgYWxpZ25lZAotCQkgKiAtIGlmIHNsYXZlIGlzIG5vdCB0aGVuIHdlIG11c3Qgc2V0IGl0cyB3aWR0aCBkb3duCisJCSAqIFplcm8gbGVuZ3RoIGlzIG9ubHkgYWxsb3dlZCBpZiBhbGwgdGhlc2UgcmVxdWlyZW1lbnRzIGFyZQorCQkgKiBtZXQ6CisJCSAqIC0gZmxvdyBjb250cm9sbGVyIGlzIHBlcmlwaGVyYWwuCisJCSAqIC0gc3JjLmFkZHIgaXMgYWxpZ25lZCB0byBzcmMud2lkdGgKKwkJICogLSBkc3QuYWRkciBpcyBhbGlnbmVkIHRvIGRzdC53aWR0aAorCQkgKgorCQkgKiBzZ19sZW4gPT0gMSBzaG91bGQgYmUgdHJ1ZSwgYXMgdGhlcmUgY2FuIGJlIHR3byBjYXNlcyBoZXJlOgorCQkgKgorCQkgKiAtIE1lbW9yeSBhZGRyZXNzZXMgYXJlIGNvbnRpZ3VvdXMgYW5kIGFyZSBub3Qgc2NhdHRlcmVkLgorCQkgKiAgIEhlcmUsIE9ubHkgb25lIHNnIHdpbGwgYmUgcGFzc2VkIGJ5IHVzZXIgZHJpdmVyLCB3aXRoCisJCSAqICAgbWVtb3J5IGFkZHJlc3MgYW5kIHplcm8gbGVuZ3RoLiBXZSBwYXNzIHRoaXMgdG8gY29udHJvbGxlcgorCQkgKiAgIGFuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXQgd2lsbCByZWNlaXZlIHRoZSBsYXN0IGJ1cnN0CisJCSAqICAgcmVxdWVzdCBmcm9tIHBlcmlwaGVyYWwgYW5kIHNvIHRyYW5zZmVyIGZpbmlzaGVzLgorCQkgKgorCQkgKiAtIE1lbW9yeSBhZGRyZXNzZXMgYXJlIHNjYXR0ZXJlZCBhbmQgYXJlIG5vdCBjb250aWd1b3VzLgorCQkgKiAgIEhlcmUsIE9idmlvdXNseSBhcyBETUEgY29udHJvbGxlciBkb2Vzbid0IGtub3cgd2hlbiBhIGxsaSdzCisJCSAqICAgdHJhbnNmZXIgZ2V0cyBvdmVyLCBpdCBjYW4ndCBsb2FkIG5leHQgbGxpLiBTbyBpbiB0aGlzCisJCSAqICAgY2FzZSwgdGhlcmUgaGFzIHRvIGJlIGFuIGFzc3VtcHRpb24gdGhhdCBvbmx5IG9uZSBsbGkgaXMKKwkJICogICBzdXBwb3J0ZWQuIFRodXMsIHdlIGNhbid0IGhhdmUgc2NhdHRlcmVkIGFkZHJlc3Nlcy4KIAkJICovCi0JCWlmIChzYnVzLT5hZGRyICUgc2J1cy0+YnVzd2lkdGgpIHsKLQkJCWRldl9kYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJIiVzIHNldCBkb3duIGJ1cyB3aWR0aCB0byBvbmUgYnl0ZVxuIiwKLQkJCQkgX19mdW5jX18pOwotCi0JCQlzYnVzLT5idXN3aWR0aCA9IDE7Ci0JCX0KLQotCQkvKgotCQkgKiBNYWtlIGxhcmdlc3QgcG9zc2libGUgTExJcyB1bnRpbCBsZXNzIHRoYW4gb25lIGJ1cwotCQkgKiB3aWR0aCBsZWZ0Ci0JCSAqLwotCQl3aGlsZSAoYmQucmVtYWluZGVyID4gKG1idXMtPmJ1c3dpZHRoIC0gMSkpIHsKLQkJCXNpemVfdCBsbGlfbGVuLCB0YXJnZXRfbGVuLCB0c2l6ZSwgb2RkX2J5dGVzOwotCi0JCQkvKgotCQkJICogSWYgZW5vdWdoIGxlZnQgdHJ5IHRvIHNlbmQgbWF4IHBvc3NpYmxlLAotCQkJICogb3RoZXJ3aXNlIHRyeSB0byBzZW5kIHRoZSByZW1haW5kZXIKLQkJCSAqLwotCQkJdGFyZ2V0X2xlbiA9IG1pbihiZC5yZW1haW5kZXIsIG1heF9ieXRlc19wZXJfbGxpKTsKLQotCQkJLyoKLQkJCSAqIFNldCBidXMgbGVuZ3RocyBmb3IgaW5jcmVtZW50aW5nIGJ1c2VzIHRvIHRoZQotCQkJICogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZpbGwgdG8gbmV4dCBtZW1vcnkgYm91bmRhcnksCi0JCQkgKiBsaW1pdGluZyBvbiB0aGUgdGFyZ2V0IGxlbmd0aCBjYWxjdWxhdGVkIGFib3ZlLgotCQkJICovCi0JCQlpZiAoY2N0bCAmIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IpCi0JCQkJYmQuc3JjYnVzLmZpbGxfYnl0ZXMgPQotCQkJCQlwbDA4eF9wcmVfYm91bmRhcnkoYmQuc3JjYnVzLmFkZHIsCi0JCQkJCQl0YXJnZXRfbGVuKTsKLQkJCWVsc2UKLQkJCQliZC5zcmNidXMuZmlsbF9ieXRlcyA9IHRhcmdldF9sZW47Ci0KLQkJCWlmIChjY3RsICYgUEwwODBfQ09OVFJPTF9EU1RfSU5DUikKLQkJCQliZC5kc3RidXMuZmlsbF9ieXRlcyA9Ci0JCQkJCXBsMDh4X3ByZV9ib3VuZGFyeShiZC5kc3RidXMuYWRkciwKLQkJCQkJCXRhcmdldF9sZW4pOwotCQkJZWxzZQotCQkJCWJkLmRzdGJ1cy5maWxsX2J5dGVzID0gdGFyZ2V0X2xlbjsKLQotCQkJLyogRmluZCB0aGUgbmVhcmVzdCAqLwotCQkJbGxpX2xlbgk9IG1pbihiZC5zcmNidXMuZmlsbF9ieXRlcywKLQkJCQkgICAgICBiZC5kc3RidXMuZmlsbF9ieXRlcyk7Ci0KLQkJCUJVR19PTihsbGlfbGVuID4gYmQucmVtYWluZGVyKTsKLQotCQkJaWYgKGxsaV9sZW4gPD0gMCkgewotCQkJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJCSIlcyBsbGlfbGVuIGlzICV6dSwgPD0gMFxuIiwKLQkJCQkJCV9fZnVuY19fLCBsbGlfbGVuKTsKKwkJaWYgKCFiZC5yZW1haW5kZXIpIHsKKwkJCXUzMiBmYyA9ICh0eGQtPmNjZmcgJiBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX01BU0spID4+CisJCQkJUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKKwkJCWlmICghKChmYyA+PSBQTDA4MF9GTE9XX1NSQzJEU1RfRFNUKSAmJgorCQkJCQkoZmMgPD0gUEwwODBfRkxPV19TUkMyRFNUX1NSQykpKSB7CisJCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwgIiVzIHNnIGxlbiBjYW4ndCBiZSB6ZXJvIiwKKwkJCQkJX19mdW5jX18pOwogCQkJCXJldHVybiAwOwogCQkJfQogCi0JCQlpZiAobGxpX2xlbiA9PSB0YXJnZXRfbGVuKSB7Ci0JCQkJLyoKLQkJCQkgKiBDYW4gc2VuZCB3aGF0IHdlIHdhbnRlZC4KLQkJCQkgKiBNYWludGFpbiBhbGlnbm1lbnQKLQkJCQkgKi8KLQkJCQlsbGlfbGVuCT0gKGxsaV9sZW4vbWJ1cy0+YnVzd2lkdGgpICoKLQkJCQkJCQltYnVzLT5idXN3aWR0aDsKLQkJCQlvZGRfYnl0ZXMgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIFNvIG5vdyB3ZSBrbm93IGhvdyBtYW55IGJ5dGVzIHRvIHRyYW5zZmVyCi0JCQkJICogdG8gZ2V0IHRvIHRoZSBuZWFyZXN0IGJvdW5kYXJ5LiAgVGhlIG5leHQKLQkJCQkgKiBMTEkgd2lsbCBwYXN0IHRoZSBib3VuZGFyeS4gIEhvd2V2ZXIsIHdlCi0JCQkJICogbWF5IGJlIHdvcmtpbmcgdG8gYSBib3VuZGFyeSBvbiB0aGUgc2xhdmUKLQkJCQkgKiBidXMuICBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbWFzdGVyIHN0YXlzCi0JCQkJICogYWxpZ25lZCwgYW5kIHRoYXQgd2UgYXJlIHdvcmtpbmcgaW4KLQkJCQkgKiBtdWx0aXBsZXMgb2YgdGhlIGJ1cyB3aWR0aHMuCi0JCQkJICovCi0JCQkJb2RkX2J5dGVzID0gbGxpX2xlbiAlIG1idXMtPmJ1c3dpZHRoOwotCQkJCWxsaV9sZW4gLT0gb2RkX2J5dGVzOwotCisJCQlpZiAoKGJkLnNyY2J1cy5hZGRyICUgYmQuc3JjYnVzLmJ1c3dpZHRoKSB8fAorCQkJCQkoYmQuc3JjYnVzLmFkZHIgJSBiZC5zcmNidXMuYnVzd2lkdGgpKSB7CisJCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkJIiVzIHNyYyAmIGRzdCBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byBzcmMiCisJCQkJCSIgJiBkc3Qgd2lkdGggaWYgcGVyaXBoZXJhbCBpcyBmbG93IGNvbnRyb2xsZXIiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAKLQkJCWlmIChsbGlfbGVuKSB7Ci0JCQkJLyoKLQkJCQkgKiBDaGVjayBhZ2FpbnN0IG1pbmltdW0gYnVzIGFsaWdubWVudDoKLQkJCQkgKiBDYWxjdWxhdGUgYWN0dWFsIHRyYW5zZmVyIHNpemUgaW4gcmVsYXRpb24KLQkJCQkgKiB0byBidXMgd2lkdGggYW4gZ2V0IGEgbWF4aW11bSByZW1haW5kZXIgb2YKLQkJCQkgKiB0aGUgc21hbGxlc3QgYnVzIHdpZHRoIC0gMQotCQkJCSAqLwotCQkJCS8qIEZJWE1FOiB1c2Ugcm91bmRfZG93bigpPyAqLwotCQkJCXRzaXplID0gbGxpX2xlbiAvIG1pbihtYnVzLT5idXN3aWR0aCwKLQkJCQkJCSAgICAgIHNidXMtPmJ1c3dpZHRoKTsKLQkJCQlsbGlfbGVuCT0gdHNpemUgKiBtaW4obWJ1cy0+YnVzd2lkdGgsCi0JCQkJCQkgICAgICBzYnVzLT5idXN3aWR0aCk7Ci0KLQkJCQlpZiAodGFyZ2V0X2xlbiAhPSBsbGlfbGVuKSB7Ci0JCQkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJCQkiJXMgY2FuJ3Qgc2VuZCB3aGF0IHdlIHdhbnQuIERlc2lyZWQgMHglMDh6eCwgbGxpIG9mIDB4JTA4enggYnl0ZXMgaW4gdHhkIG9mIDB4JTA4enhcbiIsCi0JCQkJCV9fZnVuY19fLCB0YXJnZXRfbGVuLCBsbGlfbGVuLCB0eGQtPmxlbik7Ci0JCQkJfQotCi0JCQkJY2N0bCA9IHBsMDh4X2NjdGxfYml0cyhjY3RsLAotCQkJCQkJICAgICAgIGJkLnNyY2J1cy5idXN3aWR0aCwKLQkJCQkJCSAgICAgICBiZC5kc3RidXMuYnVzd2lkdGgsCi0JCQkJCQkgICAgICAgdHNpemUpOwotCi0JCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJCSIlcyBmaWxsIGxsaSB3aXRoIHNpbmdsZSBsbGkgY2h1bmsgb2Ygc2l6ZSAweCUwOHp4IChyZW1haW5kZXIgMHglMDh6eClcbiIsCi0JCQkJCV9fZnVuY19fLCBsbGlfbGVuLCBiZC5yZW1haW5kZXIpOwotCQkJCXBsMDh4X2ZpbGxfbGxpX2Zvcl9kZXNjKCZiZCwgbnVtX2xsaXMrKywKLQkJCQkJbGxpX2xlbiwgY2N0bCk7Ci0JCQkJdG90YWxfYnl0ZXMgKz0gbGxpX2xlbjsKLQkJCX0KLQotCi0JCQlpZiAob2RkX2J5dGVzKSB7Ci0JCQkJLyoKLQkJCQkgKiBDcmVlcCBwYXN0IHRoZSBib3VuZGFyeSwgbWFpbnRhaW5pbmcKLQkJCQkgKiBtYXN0ZXIgYWxpZ25tZW50Ci0JCQkJICovCi0JCQkJaW50IGo7Ci0JCQkJZm9yIChqID0gMDsgKGogPCBtYnVzLT5idXN3aWR0aCkKLQkJCQkJCSYmIChiZC5yZW1haW5kZXIpOyBqKyspIHsKLQkJCQkJY2N0bCA9IHBsMDh4X2NjdGxfYml0cyhjY3RsLCAxLCAxLCAxKTsKLQkJCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJCQkiJXMgYWxpZ24gd2l0aCBib3VuZGFyeSwgc2luZ2xlIGJ5dGUgKHJlbWFpbiAweCUwOHp4KVxuIiwKLQkJCQkJCV9fZnVuY19fLCBiZC5yZW1haW5kZXIpOwotCQkJCQlwbDA4eF9maWxsX2xsaV9mb3JfZGVzYygmYmQsCi0JCQkJCQludW1fbGxpcysrLCAxLCBjY3RsKTsKLQkJCQkJdG90YWxfYnl0ZXMrKzsKLQkJCQl9Ci0JCQl9CisJCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsIGJkLnNyY2J1cy5idXN3aWR0aCwKKwkJCQkJYmQuZHN0YnVzLmJ1c3dpZHRoLCAwKTsKKwkJCXBsMDh4X2ZpbGxfbGxpX2Zvcl9kZXNjKCZiZCwgbnVtX2xsaXMrKywgMCwgY2N0bCk7CisJCQlicmVhazsKIAkJfQogCiAJCS8qCi0JCSAqIFNlbmQgYW55IG9kZCBieXRlcworCQkgKiBTZW5kIGJ5dGUgYnkgYnl0ZSBmb3IgZm9sbG93aW5nIGNhc2VzCisJCSAqIC0gTGVzcyB0aGFuIGEgYnVzIHdpZHRoIGF2YWlsYWJsZQorCQkgKiAtIHVudGlsIG1hc3RlciBidXMgaXMgYWxpZ25lZAogCQkgKi8KLQkJd2hpbGUgKGJkLnJlbWFpbmRlcikgewotCQkJY2N0bCA9IHBsMDh4X2NjdGxfYml0cyhjY3RsLCAxLCAxLCAxKTsKLQkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJCSIlcyBhbGlnbiB3aXRoIGJvdW5kYXJ5LCBzaW5nbGUgb2RkIGJ5dGUgKHJlbWFpbiAlenUpXG4iLAotCQkJCV9fZnVuY19fLCBiZC5yZW1haW5kZXIpOwotCQkJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoJmJkLCBudW1fbGxpcysrLCAxLCBjY3RsKTsKLQkJCXRvdGFsX2J5dGVzKys7CisJCWlmIChiZC5yZW1haW5kZXIgPCBtYnVzLT5idXN3aWR0aCkKKwkJCWVhcmx5X2J5dGVzID0gYmQucmVtYWluZGVyOworCQllbHNlIGlmICgobWJ1cy0+YWRkcikgJSAobWJ1cy0+YnVzd2lkdGgpKSB7CisJCQllYXJseV9ieXRlcyA9IG1idXMtPmJ1c3dpZHRoIC0gKG1idXMtPmFkZHIpICUKKwkJCQkobWJ1cy0+YnVzd2lkdGgpOworCQkJaWYgKChiZC5yZW1haW5kZXIgLSBlYXJseV9ieXRlcykgPCBtYnVzLT5idXN3aWR0aCkKKwkJCQllYXJseV9ieXRlcyA9IGJkLnJlbWFpbmRlcjsKIAkJfQotCX0KLQlpZiAodG90YWxfYnl0ZXMgIT0gdHhkLT5sZW4pIHsKLQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKLQkJCSIlcyBzaXplIG9mIGVuY29kZWQgbGxpOnMgZG9uJ3QgbWF0Y2ggdG90YWwgdHhkLCB0cmFuc2ZlcnJlZCAweCUwOHp4IGZyb20gc2l6ZSAweCUwOHp4XG4iLAotCQkJX19mdW5jX18sIHRvdGFsX2J5dGVzLCB0eGQtPmxlbik7Ci0JCXJldHVybiAwOwotCX0KIAotCWlmIChudW1fbGxpcyA+PSBNQVhfTlVNX1RTRlJfTExJUykgewotCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJIiVzIG5lZWQgdG8gaW5jcmVhc2UgTUFYX05VTV9UU0ZSX0xMSVMgZnJvbSAweCUwOHhcbiIsCi0JCQlfX2Z1bmNfXywgKHUzMikgTUFYX05VTV9UU0ZSX0xMSVMpOwotCQlyZXR1cm4gMDsKKwkJaWYgKGVhcmx5X2J5dGVzKSB7CisJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkiJXMgYnl0ZSB3aWR0aCBMTElzIChyZW1haW4gMHglMDh4KVxuIiwKKwkJCQlfX2Z1bmNfXywgYmQucmVtYWluZGVyKTsKKwkJCXByZXBfYnl0ZV93aWR0aF9sbGkoJmJkLCAmY2N0bCwgZWFybHlfYnl0ZXMsIG51bV9sbGlzKyssCisJCQkJJnRvdGFsX2J5dGVzKTsKKwkJfQorCisJCWlmIChiZC5yZW1haW5kZXIpIHsKKwkJCS8qCisJCQkgKiBNYXN0ZXIgbm93IGFsaWduZWQKKwkJCSAqIC0gaWYgc2xhdmUgaXMgbm90IHRoZW4gd2UgbXVzdCBzZXQgaXRzIHdpZHRoIGRvd24KKwkJCSAqLworCQkJaWYgKHNidXMtPmFkZHIgJSBzYnVzLT5idXN3aWR0aCkgeworCQkJCWRldl9kYmcoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkJCSIlcyBzZXQgZG93biBidXMgd2lkdGggdG8gb25lIGJ5dGVcbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJCXNidXMtPmJ1c3dpZHRoID0gMTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEJ5dGVzIHRyYW5zZmVycmVkID0gdHNpemUgKiBzcmMgd2lkdGgsIG5vdAorCQkJICogTUlOKGJ1c3dpZHRocykKKwkJCSAqLworCQkJbWF4X2J5dGVzX3Blcl9sbGkgPSBiZC5zcmNidXMuYnVzd2lkdGggKgorCQkJCVBMMDgwX0NPTlRST0xfVFJBTlNGRVJfU0laRV9NQVNLOworCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkJIiVzIG1heCBieXRlcyBwZXIgbGxpID0gJXp1XG4iLAorCQkJCV9fZnVuY19fLCBtYXhfYnl0ZXNfcGVyX2xsaSk7CisKKwkJCS8qCisJCQkgKiBNYWtlIGxhcmdlc3QgcG9zc2libGUgTExJcyB1bnRpbCBsZXNzIHRoYW4gb25lIGJ1cworCQkJICogd2lkdGggbGVmdAorCQkJICovCisJCQl3aGlsZSAoYmQucmVtYWluZGVyID4gKG1idXMtPmJ1c3dpZHRoIC0gMSkpIHsKKwkJCQlzaXplX3QgbGxpX2xlbiwgdHNpemUsIHdpZHRoOworCisJCQkJLyoKKwkJCQkgKiBJZiBlbm91Z2ggbGVmdCB0cnkgdG8gc2VuZCBtYXggcG9zc2libGUsCisJCQkJICogb3RoZXJ3aXNlIHRyeSB0byBzZW5kIHRoZSByZW1haW5kZXIKKwkJCQkgKi8KKwkJCQlsbGlfbGVuID0gbWluKGJkLnJlbWFpbmRlciwgbWF4X2J5dGVzX3Blcl9sbGkpOworCisJCQkJLyoKKwkJCQkgKiBDaGVjayBhZ2FpbnN0IG1heGltdW0gYnVzIGFsaWdubWVudDoKKwkJCQkgKiBDYWxjdWxhdGUgYWN0dWFsIHRyYW5zZmVyIHNpemUgaW4gcmVsYXRpb24gdG8KKwkJCQkgKiBidXMgd2lkdGggYW4gZ2V0IGEgbWF4aW11bSByZW1haW5kZXIgb2YgdGhlCisJCQkJICogaGlnaGVzdCBidXMgd2lkdGggLSAxCisJCQkJICovCisJCQkJd2lkdGggPSBtYXgobWJ1cy0+YnVzd2lkdGgsIHNidXMtPmJ1c3dpZHRoKTsKKwkJCQlsbGlfbGVuID0gKGxsaV9sZW4gLyB3aWR0aCkgKiB3aWR0aDsKKwkJCQl0c2l6ZSA9IGxsaV9sZW4gLyBiZC5zcmNidXMuYnVzd2lkdGg7CisKKwkJCQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkJIiVzIGZpbGwgbGxpIHdpdGggc2luZ2xlIGxsaSBjaHVuayBvZiAiCisJCQkJCSJzaXplIDB4JTA4enggKHJlbWFpbmRlciAweCUwOHp4KVxuIiwKKwkJCQkJX19mdW5jX18sIGxsaV9sZW4sIGJkLnJlbWFpbmRlcik7CisKKwkJCQljY3RsID0gcGwwOHhfY2N0bF9iaXRzKGNjdGwsIGJkLnNyY2J1cy5idXN3aWR0aCwKKwkJCQkJYmQuZHN0YnVzLmJ1c3dpZHRoLCB0c2l6ZSk7CisJCQkJcGwwOHhfZmlsbF9sbGlfZm9yX2Rlc2MoJmJkLCBudW1fbGxpcysrLAorCQkJCQkJbGxpX2xlbiwgY2N0bCk7CisJCQkJdG90YWxfYnl0ZXMgKz0gbGxpX2xlbjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNlbmQgYW55IG9kZCBieXRlcworCQkJICovCisJCQlpZiAoYmQucmVtYWluZGVyKSB7CisJCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkJCSIlcyBhbGlnbiB3aXRoIGJvdW5kYXJ5LCBzZW5kIG9kZCBieXRlcyAocmVtYWluICV6dSlcbiIsCisJCQkJCV9fZnVuY19fLCBiZC5yZW1haW5kZXIpOworCQkJCXByZXBfYnl0ZV93aWR0aF9sbGkoJmJkLCAmY2N0bCwgYmQucmVtYWluZGVyLAorCQkJCQkJbnVtX2xsaXMrKywgJnRvdGFsX2J5dGVzKTsKKwkJCX0KKwkJfQorCisJCWlmICh0b3RhbF9ieXRlcyAhPSBkc2ctPmxlbikgeworCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKKwkJCQkiJXMgc2l6ZSBvZiBlbmNvZGVkIGxsaTpzIGRvbid0IG1hdGNoIHRvdGFsIHR4ZCwgdHJhbnNmZXJyZWQgMHglMDh6eCBmcm9tIHNpemUgMHglMDh6eFxuIiwKKwkJCQlfX2Z1bmNfXywgdG90YWxfYnl0ZXMsIGRzZy0+bGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG51bV9sbGlzID49IE1BWF9OVU1fVFNGUl9MTElTKSB7CisJCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJCSIlcyBuZWVkIHRvIGluY3JlYXNlIE1BWF9OVU1fVFNGUl9MTElTIGZyb20gMHglMDh4XG4iLAorCQkJCV9fZnVuY19fLCAodTMyKSBNQVhfTlVNX1RTRlJfTExJUyk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KIAogCWxsaXNfdmEgPSB0eGQtPmxsaXNfdmE7CkBAIC04NTYsMTEgKzgwMCwxOSBAQAogc3RhdGljIHZvaWQgcGwwOHhfZnJlZV90eGQoc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCwKIAkJCSAgIHN0cnVjdCBwbDA4eF90eGQgKnR4ZCkKIHsKKwlzdHJ1Y3QgcGwwOHhfc2cgKmRzZywgKl9kc2c7CisKIAkvKiBGcmVlIHRoZSBMTEkgKi8KLQlkbWFfcG9vbF9mcmVlKHBsMDh4LT5wb29sLCB0eGQtPmxsaXNfdmEsIHR4ZC0+bGxpc19idXMpOworCWlmICh0eGQtPmxsaXNfdmEpCisJCWRtYV9wb29sX2ZyZWUocGwwOHgtPnBvb2wsIHR4ZC0+bGxpc192YSwgdHhkLT5sbGlzX2J1cyk7CiAKIAlwbDA4eC0+cG9vbF9jdHItLTsKIAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkc2csIF9kc2csICZ0eGQtPmRzZ19saXN0LCBub2RlKSB7CisJCWxpc3RfZGVsKCZkc2ctPm5vZGUpOworCQlrZnJlZShkc2cpOworCX0KKwogCWtmcmVlKHR4ZCk7CiB9CiAKQEAgLTkxNyw5ICs4NjksNyBAQAogCSAqIG5lZWQsIGJ1dCBmb3Igc2xhdmVzIHRoZSBwaHlzaWNhbCBzaWduYWxzIG1heSBiZSBtdXhlZCEKIAkgKiBDYW4gdGhlIHBsYXRmb3JtIGFsbG93IHVzIHRvIHVzZSB0aGlzIGNoYW5uZWw/CiAJICovCi0JaWYgKHBsY2hhbi0+c2xhdmUgJiYKLQkgICAgY2gtPnNpZ25hbCA8IDAgJiYKLQkgICAgcGwwOHgtPnBkLT5nZXRfc2lnbmFsKSB7CisJaWYgKHBsY2hhbi0+c2xhdmUgJiYgcGwwOHgtPnBkLT5nZXRfc2lnbmFsKSB7CiAJCXJldCA9IHBsMDh4LT5wZC0+Z2V0X3NpZ25hbChwbGNoYW4pOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwKQEAgLTEwMDgsMTAgKzk1OCw4IEBACiAgKiBJZiBzbGF2ZXMgYXJlIHJlbHlpbmcgb24gaW50ZXJydXB0cyB0byBzaWduYWwgY29tcGxldGlvbiB0aGlzIGZ1bmN0aW9uCiAgKiBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCi1zdGF0aWMgZW51bSBkbWFfc3RhdHVzCi1wbDA4eF9kbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJICAgIGRtYV9jb29raWVfdCBjb29raWUsCi0JCSAgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQorc3RhdGljIGVudW0gZG1hX3N0YXR1cyBwbDA4eF9kbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJZG1hX2Nvb2tpZV90IGNvb2tpZSwgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKIHsKIAlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CiAJZG1hX2Nvb2tpZV90IGxhc3RfdXNlZDsKQEAgLTEyNTMsNyArMTIwMSw5IEBACiAKIAludW1fbGxpcyA9IHBsMDh4X2ZpbGxfbGxpc19mb3JfZGVzYyhwbDA4eCwgdHhkKTsKIAlpZiAoIW51bV9sbGlzKSB7Ci0JCWtmcmVlKHR4ZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwbGNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJcGwwOHhfZnJlZV90eGQocGwwOHgsIHR4ZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsY2hhbi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzMDEsMTMgKzEyNTEsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgcGwwOHhfdHhkICpwbDA4eF9nZXRfdHhkKHN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBsMDh4X3R4ZCAqdHhkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBsMDh4X3R4ZCksIEdGUF9OT1dBSVQpOworCXN0cnVjdCBwbDA4eF90eGQgKnR4ZCA9IGt6YWxsb2Moc2l6ZW9mKCp0eGQpLCBHRlBfTk9XQUlUKTsKIAogCWlmICh0eGQpIHsKIAkJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmdHhkLT50eCwgJnBsY2hhbi0+Y2hhbik7CiAJCXR4ZC0+dHguZmxhZ3MgPSBmbGFnczsKIAkJdHhkLT50eC50eF9zdWJtaXQgPSBwbDA4eF90eF9zdWJtaXQ7CiAJCUlOSVRfTElTVF9IRUFEKCZ0eGQtPm5vZGUpOworCQlJTklUX0xJU1RfSEVBRCgmdHhkLT5kc2dfbGlzdCk7CiAKIAkJLyogQWx3YXlzIGVuYWJsZSBlcnJvciBhbmQgdGVybWluYWwgaW50ZXJydXB0cyAqLwogCQl0eGQtPmNjZmcgPSBQTDA4MF9DT05GSUdfRVJSX0lSUV9NQVNLIHwKQEAgLTEzMjYsNiArMTI3Nyw3IEBACiAJc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW4gPSB0b19wbDA4eF9jaGFuKGNoYW4pOwogCXN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSAqcGwwOHggPSBwbGNoYW4tPmhvc3Q7CiAJc3RydWN0IHBsMDh4X3R4ZCAqdHhkOworCXN0cnVjdCBwbDA4eF9zZyAqZHNnOwogCWludCByZXQ7CiAKIAl0eGQgPSBwbDA4eF9nZXRfdHhkKHBsY2hhbiwgZmxhZ3MpOwpAQCAtMTMzNSwxMCArMTI4NywxOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlkc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwOHhfc2cpLCBHRlBfTk9XQUlUKTsKKwlpZiAoIWRzZykgeworCQlwbDA4eF9mcmVlX3R4ZChwbDA4eCwgdHhkKTsKKwkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwgIiVzIG5vIG1lbW9yeSBmb3IgcGwwODAgc2dcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbGlzdF9hZGRfdGFpbCgmZHNnLT5ub2RlLCAmdHhkLT5kc2dfbGlzdCk7CisKIAl0eGQtPmRpcmVjdGlvbiA9IERNQV9OT05FOwotCXR4ZC0+c3JjX2FkZHIgPSBzcmM7Ci0JdHhkLT5kc3RfYWRkciA9IGRlc3Q7Ci0JdHhkLT5sZW4gPSBsZW47CisJZHNnLT5zcmNfYWRkciA9IHNyYzsKKwlkc2ctPmRzdF9hZGRyID0gZGVzdDsKKwlkc2ctPmxlbiA9IGxlbjsKIAogCS8qIFNldCBwbGF0Zm9ybSBkYXRhIGZvciBtMm0gKi8KIAl0eGQtPmNjZmcgfD0gUEwwODBfRkxPV19NRU0yTUVNIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7CkBAIC0xMzY3LDE5ICsxMzI4LDEzIEBACiAJc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW4gPSB0b19wbDA4eF9jaGFuKGNoYW4pOwogCXN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSAqcGwwOHggPSBwbGNoYW4tPmhvc3Q7CiAJc3RydWN0IHBsMDh4X3R4ZCAqdHhkOwotCWludCByZXQ7Ci0KLQkvKgotCSAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gQVNTVU1FUyBvbmx5IG9uZSBzZwotCSAqLwotCWlmIChzZ19sZW4gIT0gMSkgewotCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgcHJlcGFyZWQgdG9vIGxvbmcgc2dsaXN0XG4iLAotCQkJX19mdW5jX18pOwotCQlCVUcoKTsKLQl9CisJc3RydWN0IHBsMDh4X3NnICpkc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlkbWFfYWRkcl90IHNsYXZlX2FkZHI7CisJaW50IHJldCwgdG1wOwogCiAJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwgIiVzIHByZXBhcmUgdHJhbnNhY3Rpb24gb2YgJWQgYnl0ZXMgZnJvbSAlc1xuIiwKLQkJX19mdW5jX18sIHNnbC0+bGVuZ3RoLCBwbGNoYW4tPm5hbWUpOworCQkJX19mdW5jX18sIHNnbC0+bGVuZ3RoLCBwbGNoYW4tPm5hbWUpOwogCiAJdHhkID0gcGwwOHhfZ2V0X3R4ZChwbGNoYW4sIGZsYWdzKTsKIAlpZiAoIXR4ZCkgewpAQCAtMTM5OCwyNCArMTM1Myw0OSBAQAogCSAqIGNoYW5uZWwgdGFyZ2V0IGFkZHJlc3MgZHluYW1pY2FsbHkgYXQgcnVudGltZS4KIAkgKi8KIAl0eGQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl0eGQtPmxlbiA9IHNnbC0+bGVuZ3RoOwogCiAJaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7Ci0JCXR4ZC0+Y2NmZyB8PSBQTDA4MF9GTE9XX01FTTJQRVIgPDwgUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKIAkJdHhkLT5jY3RsID0gcGxjaGFuLT5kc3RfY2N0bDsKLQkJdHhkLT5zcmNfYWRkciA9IHNnbC0+ZG1hX2FkZHJlc3M7Ci0JCXR4ZC0+ZHN0X2FkZHIgPSBwbGNoYW4tPmRzdF9hZGRyOworCQlzbGF2ZV9hZGRyID0gcGxjaGFuLT5kc3RfYWRkcjsKIAl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKLQkJdHhkLT5jY2ZnIHw9IFBMMDgwX0ZMT1dfUEVSMk1FTSA8PCBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOwogCQl0eGQtPmNjdGwgPSBwbGNoYW4tPnNyY19jY3RsOwotCQl0eGQtPnNyY19hZGRyID0gcGxjaGFuLT5zcmNfYWRkcjsKLQkJdHhkLT5kc3RfYWRkciA9IHNnbC0+ZG1hX2FkZHJlc3M7CisJCXNsYXZlX2FkZHIgPSBwbGNoYW4tPnNyY19hZGRyOwogCX0gZWxzZSB7CisJCXBsMDh4X2ZyZWVfdHhkKHBsMDh4LCB0eGQpOwogCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJIiVzIGRpcmVjdGlvbiB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlpZiAocGxjaGFuLT5jZC0+ZGV2aWNlX2ZjKQorCQl0bXAgPSAoZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpID8gUEwwODBfRkxPV19NRU0yUEVSX1BFUiA6CisJCQlQTDA4MF9GTE9XX1BFUjJNRU1fUEVSOworCWVsc2UKKwkJdG1wID0gKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSA/IFBMMDgwX0ZMT1dfTUVNMlBFUiA6CisJCQlQTDA4MF9GTE9XX1BFUjJNRU07CisKKwl0eGQtPmNjZmcgfD0gdG1wIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7CisKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ19sZW4sIHRtcCkgeworCQlkc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwOHhfc2cpLCBHRlBfTk9XQUlUKTsKKwkJaWYgKCFkc2cpIHsKKwkJCXBsMDh4X2ZyZWVfdHhkKHBsMDh4LCB0eGQpOworCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwgIiVzIG5vIG1lbSBmb3IgcGwwODAgc2dcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmRzZy0+bm9kZSwgJnR4ZC0+ZHNnX2xpc3QpOworCisJCWRzZy0+bGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQkJZHNnLT5zcmNfYWRkciA9IHNnX3BoeXMoc2cpOworCQkJZHNnLT5kc3RfYWRkciA9IHNsYXZlX2FkZHI7CisJCX0gZWxzZSB7CisJCQlkc2ctPnNyY19hZGRyID0gc2xhdmVfYWRkcjsKKwkJCWRzZy0+ZHN0X2FkZHIgPSBzZ19waHlzKHNnKTsKKwkJfQorCX0KKwogCXJldCA9IHBsMDh4X3ByZXBfY2hhbm5lbF9yZXNvdXJjZXMocGxjaGFuLCB0eGQpOwogCWlmIChyZXQpCiAJCXJldHVybiBOVUxMOwpAQCAtMTQ4OSw5ICsxNDY5LDE1IEBACiAKIGJvb2wgcGwwOHhfZmlsdGVyX2lkKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqY2hhbl9pZCkKIHsKLQlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CisJc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW47CiAJY2hhciAqbmFtZSA9IGNoYW5faWQ7CiAKKwkvKiBSZWplY3QgY2hhbm5lbHMgZm9yIGRldmljZXMgbm90IGJvdW5kIHRvIHRoaXMgZHJpdmVyICovCisJaWYgKGNoYW4tPmRldmljZS0+ZGV2LT5kcml2ZXIgIT0gJnBsMDh4X2FtYmFfZHJpdmVyLmRydikKKwkJcmV0dXJuIGZhbHNlOworCisJcGxjaGFuID0gdG9fcGwwOHhfY2hhbihjaGFuKTsKKwogCS8qIENoZWNrIHRoYXQgdGhlIGNoYW5uZWwgaXMgbm90IHRha2VuISAqLwogCWlmICghc3RyY21wKHBsY2hhbi0+bmFtZSwgbmFtZSkpCiAJCXJldHVybiB0cnVlOwpAQCAtMTUwNywzNCArMTQ5MywzNCBAQAogICovCiBzdGF0aWMgdm9pZCBwbDA4eF9lbnN1cmVfb24oc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCkKIHsKLQl1MzIgdmFsOwotCi0JdmFsID0gcmVhZGwocGwwOHgtPmJhc2UgKyBQTDA4MF9DT05GSUcpOwotCXZhbCAmPSB+KFBMMDgwX0NPTkZJR19NMl9CRSB8IFBMMDgwX0NPTkZJR19NMV9CRSB8IFBMMDgwX0NPTkZJR19FTkFCTEUpOwotCS8qIFdlIGltcGxpY2l0bHkgY2xlYXIgYml0IDEgYW5kIHRoYXQgbWVhbnMgbGl0dGxlLWVuZGlhbiBtb2RlICovCi0JdmFsIHw9IFBMMDgwX0NPTkZJR19FTkFCTEU7Ci0Jd3JpdGVsKHZhbCwgcGwwOHgtPmJhc2UgKyBQTDA4MF9DT05GSUcpOworCXdyaXRlbChQTDA4MF9DT05GSUdfRU5BQkxFLCBwbDA4eC0+YmFzZSArIFBMMDgwX0NPTkZJRyk7CiB9CiAKIHN0YXRpYyB2b2lkIHBsMDh4X3VubWFwX2J1ZmZlcnMoc3RydWN0IHBsMDh4X3R4ZCAqdHhkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHR4ZC0+dHguY2hhbi0+ZGV2aWNlLT5kZXY7CisJc3RydWN0IHBsMDh4X3NnICpkc2c7CiAKIAlpZiAoISh0eGQtPnR4LmZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkgewogCQlpZiAodHhkLT50eC5mbGFncyAmIERNQV9DT01QTF9TUkNfVU5NQVBfU0lOR0xFKQotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHR4ZC0+c3JjX2FkZHIsIHR4ZC0+bGVuLAotCQkJCURNQV9UT19ERVZJQ0UpOwotCQllbHNlCi0JCQlkbWFfdW5tYXBfcGFnZShkZXYsIHR4ZC0+c3JjX2FkZHIsIHR4ZC0+bGVuLAotCQkJCURNQV9UT19ERVZJQ0UpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc2csICZ0eGQtPmRzZ19saXN0LCBub2RlKQorCQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBkc2ctPnNyY19hZGRyLCBkc2ctPmxlbiwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQllbHNlIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHNnLCAmdHhkLT5kc2dfbGlzdCwgbm9kZSkKKwkJCQlkbWFfdW5tYXBfcGFnZShkZXYsIGRzZy0+c3JjX2FkZHIsIGRzZy0+bGVuLAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCX0KIAl9CiAJaWYgKCEodHhkLT50eC5mbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKSB7CiAJCWlmICh0eGQtPnR4LmZsYWdzICYgRE1BX0NPTVBMX0RFU1RfVU5NQVBfU0lOR0xFKQotCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHR4ZC0+ZHN0X2FkZHIsIHR4ZC0+bGVuLAotCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzZywgJnR4ZC0+ZHNnX2xpc3QsIG5vZGUpCisJCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGRzZy0+ZHN0X2FkZHIsIGRzZy0+bGVuLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKIAkJZWxzZQotCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCB0eGQtPmRzdF9hZGRyLCB0eGQtPmxlbiwKLQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc2csICZ0eGQtPmRzZ19saXN0LCBub2RlKQorCQkJCWRtYV91bm1hcF9wYWdlKGRldiwgZHNnLT5kc3RfYWRkciwgZHNnLT5sZW4sCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOwogCX0KIH0KIApAQCAtMTU4OSw4ICsxNTc1LDggQEAKIAkJICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkod2FpdGluZywgJnBsMDh4LT5tZW1jcHkuY2hhbm5lbHMsCiAJCQkJICAgIGNoYW4uZGV2aWNlX25vZGUpIHsKLQkJICBpZiAod2FpdGluZy0+c3RhdGUgPT0gUEwwOFhfQ0hBTl9XQUlUSU5HICYmCi0JCQkgICAgd2FpdGluZy0+d2FpdGluZyAhPSBOVUxMKSB7CisJCQlpZiAod2FpdGluZy0+c3RhdGUgPT0gUEwwOFhfQ0hBTl9XQUlUSU5HICYmCisJCQkJd2FpdGluZy0+d2FpdGluZyAhPSBOVUxMKSB7CiAJCQkJaW50IHJldDsKIAogCQkJCS8qIFRoaXMgc2hvdWxkIFJFQUxMWSBub3QgZmFpbCBub3cgKi8KQEAgLTE2MzAsMzggKzE2MTYsNDAgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwbDA4eF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQogewogCXN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSAqcGwwOHggPSBkZXY7Ci0JdTMyIG1hc2sgPSAwOwotCXUzMiB2YWw7Ci0JaW50IGk7CisJdTMyIG1hc2sgPSAwLCBlcnIsIHRjLCBpOwogCi0JdmFsID0gcmVhZGwocGwwOHgtPmJhc2UgKyBQTDA4MF9FUlJfU1RBVFVTKTsKLQlpZiAodmFsKSB7Ci0JCS8qIEFuIGVycm9yIGludGVycnVwdCAob24gb25lIG9yIG1vcmUgY2hhbm5lbHMpICovCi0JCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkiJXMgZXJyb3IgaW50ZXJydXB0LCByZWdpc3RlciB2YWx1ZSAweCUwOHhcbiIsCi0JCQkJX19mdW5jX18sIHZhbCk7Ci0JCS8qCi0JCSAqIFNpbXBseSBjbGVhciBBTEwgUEwwOFggZXJyb3IgaW50ZXJydXB0cywKLQkJICogcmVnYXJkbGVzcyBvZiBjaGFubmVsIGFuZCBjYXVzZQotCQkgKiBGSVhNRTogc2hvdWxkIGJlIDB4MDAwMDAwMDMgb24gUEwwODEgcmVhbGx5LgotCQkgKi8KLQkJd3JpdGVsKDB4MDAwMDAwRkYsIHBsMDh4LT5iYXNlICsgUEwwODBfRVJSX0NMRUFSKTsKKwkvKiBjaGVjayAmIGNsZWFyIC0gRVJSICYgVEMgaW50ZXJydXB0cyAqLworCWVyciA9IHJlYWRsKHBsMDh4LT5iYXNlICsgUEwwODBfRVJSX1NUQVRVUyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LCAiJXMgZXJyb3IgaW50ZXJydXB0LCByZWdpc3RlciB2YWx1ZSAweCUwOHhcbiIsCisJCQlfX2Z1bmNfXywgZXJyKTsKKwkJd3JpdGVsKGVyciwgcGwwOHgtPmJhc2UgKyBQTDA4MF9FUlJfQ0xFQVIpOwogCX0KLQl2YWwgPSByZWFkbChwbDA4eC0+YmFzZSArIFBMMDgwX0lOVF9TVEFUVVMpOworCXRjID0gcmVhZGwocGwwOHgtPmJhc2UgKyBQTDA4MF9JTlRfU1RBVFVTKTsKKwlpZiAodGMpCisJCXdyaXRlbCh0YywgcGwwOHgtPmJhc2UgKyBQTDA4MF9UQ19DTEVBUik7CisKKwlpZiAoIWVyciAmJiAhdGMpCisJCXJldHVybiBJUlFfTk9ORTsKKwogCWZvciAoaSA9IDA7IGkgPCBwbDA4eC0+dmQtPmNoYW5uZWxzOyBpKyspIHsKLQkJaWYgKCgxIDw8IGkpICYgdmFsKSB7CisJCWlmICgoKDEgPDwgaSkgJiBlcnIpIHx8ICgoMSA8PCBpKSAmIHRjKSkgewogCQkJLyogTG9jYXRlIHBoeXNpY2FsIGNoYW5uZWwgKi8KIAkJCXN0cnVjdCBwbDA4eF9waHlfY2hhbiAqcGh5Y2hhbiA9ICZwbDA4eC0+cGh5X2NoYW5zW2ldOwogCQkJc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW4gPSBwaHljaGFuLT5zZXJ2aW5nOwogCisJCQlpZiAoIXBsY2hhbikgeworCQkJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkJCSIlcyBFcnJvciBUQyBpbnRlcnJ1cHQgb24gdW51c2VkIGNoYW5uZWw6IDB4JTA4eFxuIiwKKwkJCQkJX19mdW5jX18sIGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQkvKiBTY2hlZHVsZSB0YXNrbGV0IG9uIHRoaXMgY2hhbm5lbCAqLwogCQkJdGFza2xldF9zY2hlZHVsZSgmcGxjaGFuLT50YXNrbGV0KTsKLQogCQkJbWFzayB8PSAoMSA8PCBpKTsKIAkJfQogCX0KLQkvKiBDbGVhciBvbmx5IHRoZSB0ZXJtaW5hbCBpbnRlcnJ1cHRzIG9uIGNoYW5uZWxzIHdlIHByb2Nlc3NlZCAqLwotCXdyaXRlbChtYXNrLCBwbDA4eC0+YmFzZSArIFBMMDgwX1RDX0NMRUFSKTsKIAogCXJldHVybiBtYXNrID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0KQEAgLTE2ODUsOSArMTY3Myw3IEBACiAgKiBNYWtlIGEgbG9jYWwgd3JhcHBlciB0byBob2xkIHJlcXVpcmVkIGRhdGEKICAqLwogc3RhdGljIGludCBwbDA4eF9kbWFfaW5pdF92aXJ0dWFsX2NoYW5uZWxzKHN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSAqcGwwOHgsCi0JCQkJCSAgIHN0cnVjdCBkbWFfZGV2aWNlICpkbWFkZXYsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBjaGFubmVscywKLQkJCQkJICAgYm9vbCBzbGF2ZSkKKwkJc3RydWN0IGRtYV9kZXZpY2UgKmRtYWRldiwgdW5zaWduZWQgaW50IGNoYW5uZWxzLCBib29sIHNsYXZlKQogewogCXN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqY2hhbjsKIAlpbnQgaTsKQEAgLTE3MDAsNyArMTY4Niw3IEBACiAJICogdG8gY29wZSB3aXRoIHRoYXQgc2l0dWF0aW9uLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7Ci0JCWNoYW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4pLCBHRlBfS0VSTkVMKTsKKwkJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFuKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2hhbikgewogCQkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKIAkJCQkiJXMgbm8gbWVtb3J5IGZvciBjaGFubmVsXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNzI4LDcgKzE3MTQsNyBAQAogCQkJa2ZyZWUoY2hhbik7CiAJCQljb250aW51ZTsKIAkJfQotCQlkZXZfaW5mbygmcGwwOHgtPmFkZXYtPmRldiwKKwkJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwKIAkJCSAiaW5pdGlhbGl6ZSB2aXJ0dWFsIGNoYW5uZWwgXCIlc1wiXG4iLAogCQkJIGNoYW4tPm5hbWUpOwogCkBAIC0xODM3LDkgKzE4MjMsOSBAQAogc3RhdGljIHZvaWQgaW5pdF9wbDA4eF9kZWJ1Z2ZzKHN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSAqcGwwOHgpCiB7CiAJLyogRXhwb3NlIGEgc2ltcGxlIGRlYnVnZnMgaW50ZXJmYWNlIHRvIHZpZXcgYWxsIGNsb2NrcyAqLwotCSh2b2lkKSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGRldl9uYW1lKCZwbDA4eC0+YWRldi0+ZGV2KSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgTlVMTCwgcGwwOHgsCi0JCQkJICAgJnBsMDh4X2RlYnVnZnNfb3BlcmF0aW9ucyk7CisJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoZGV2X25hbWUoJnBsMDh4LT5hZGV2LT5kZXYpLAorCQkJU19JRlJFRyB8IFNfSVJVR08sIE5VTEwsIHBsMDh4LAorCQkJJnBsMDh4X2RlYnVnZnNfb3BlcmF0aW9ucyk7CiB9CiAKICNlbHNlCkBAIC0xODYwLDEyICsxODQ2LDE1IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBDcmVhdGUgdGhlIGRyaXZlciBzdGF0ZSBob2xkZXIgKi8KLQlwbDA4eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCXBsMDh4ID0ga3phbGxvYyhzaXplb2YoKnBsMDh4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbDA4eCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9ub19wbDA4eDsKIAl9CiAKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJmFkZXYtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJmFkZXYtPmRldik7CisKIAkvKiBJbml0aWFsaXplIG1lbWNweSBlbmdpbmUgKi8KIAlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBwbDA4eC0+bWVtY3B5LmNhcF9tYXNrKTsKIAlwbDA4eC0+bWVtY3B5LmRldiA9ICZhZGV2LT5kZXY7CkBAIC0xOTM5LDcgKzE5MjgsNyBAQAogCX0KIAogCS8qIEluaXRpYWxpemUgcGh5c2ljYWwgY2hhbm5lbHMgKi8KLQlwbDA4eC0+cGh5X2NoYW5zID0ga21hbGxvYygodmQtPmNoYW5uZWxzICogc2l6ZW9mKHN0cnVjdCBwbDA4eF9waHlfY2hhbikpLAorCXBsMDh4LT5waHlfY2hhbnMgPSBrbWFsbG9jKCh2ZC0+Y2hhbm5lbHMgKiBzaXplb2YoKnBsMDh4LT5waHlfY2hhbnMpKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghcGwwOHgtPnBoeV9jaGFucykgewogCQlkZXZfZXJyKCZhZGV2LT5kZXYsICIlcyBmYWlsZWQgdG8gYWxsb2NhdGUgIgpAQCAtMTk1Niw5ICsxOTQ1LDggQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmNoLT5sb2NrKTsKIAkJY2gtPnNlcnZpbmcgPSBOVUxMOwogCQljaC0+c2lnbmFsID0gLTE7Ci0JCWRldl9pbmZvKCZhZGV2LT5kZXYsCi0JCQkgInBoeXNpY2FsIGNoYW5uZWwgJWQgaXMgJXNcbiIsIGksCi0JCQkgcGwwOHhfcGh5X2NoYW5uZWxfYnVzeShjaCkgPyAiQlVTWSIgOiAiRlJFRSIpOworCQlkZXZfZGJnKCZhZGV2LT5kZXYsICJwaHlzaWNhbCBjaGFubmVsICVkIGlzICVzXG4iLAorCQkJaSwgcGwwOHhfcGh5X2NoYW5uZWxfYnVzeShjaCkgPyAiQlVTWSIgOiAiRlJFRSIpOwogCX0KIAogCS8qIFJlZ2lzdGVyIGFzIG1hbnkgbWVtY3B5IGNoYW5uZWxzIGFzIHRoZXJlIGFyZSBwaHlzaWNhbCBjaGFubmVscyAqLwpAQCAtMTk3NCw4ICsxOTYyLDcgQEAKIAogCS8qIFJlZ2lzdGVyIHNsYXZlIGNoYW5uZWxzICovCiAJcmV0ID0gcGwwOHhfZG1hX2luaXRfdmlydHVhbF9jaGFubmVscyhwbDA4eCwgJnBsMDh4LT5zbGF2ZSwKLQkJCQkJICAgICAgcGwwOHgtPnBkLT5udW1fc2xhdmVfY2hhbm5lbHMsCi0JCQkJCSAgICAgIHRydWUpOworCQkJcGwwOHgtPnBkLT5udW1fc2xhdmVfY2hhbm5lbHMsIHRydWUpOwogCWlmIChyZXQgPD0gMCkgewogCQlkZXZfd2FybigmcGwwOHgtPmFkZXYtPmRldiwKIAkJCSIlcyBmYWlsZWQgdG8gZW51bWVyYXRlIHNsYXZlIGNoYW5uZWxzIC0gJWRcbiIsCkBAIC0yMDA1LDYgKzE5OTIsOCBAQAogCWRldl9pbmZvKCZwbDA4eC0+YWRldi0+ZGV2LCAiRE1BOiBQTCUwM3ggcmV2JXUgYXQgMHglMDhsbHggaXJxICVkXG4iLAogCQkgYW1iYV9wYXJ0KGFkZXYpLCBhbWJhX3JldihhZGV2KSwKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpYWRldi0+cmVzLnN0YXJ0LCBhZGV2LT5pcnFbMF0pOworCisJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAJcmV0dXJuIDA7CiAKIG91dF9ub19zbGF2ZV9yZWc6CkBAIC0yMDIzLDYgKzIwMTIsOSBAQAogCWRtYV9wb29sX2Rlc3Ryb3kocGwwOHgtPnBvb2wpOwogb3V0X25vX2xsaV9wb29sOgogb3V0X25vX3BsYXRkYXRhOgorCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmYWRldi0+ZGV2KTsKKwogCWtmcmVlKHBsMDh4KTsKIG91dF9ub19wbDA4eDoKIAlhbWJhX3JlbGVhc2VfcmVnaW9ucyhhZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCmluZGV4IDZhNDgzZWEuLmZjZmEwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwpAQCAtMTA3LDEwICsxMDcsMTEgQEAKIHsKIAlzdHJ1Y3QgYXRfZGVzYyAqZGVzYywgKl9kZXNjOwogCXN0cnVjdCBhdF9kZXNjICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGkgPSAwOwogCUxJU1RfSEVBRCh0bXBfbGlzdCk7CiAKLQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJmF0Y2hhbi0+ZnJlZV9saXN0LCBkZXNjX25vZGUpIHsKIAkJaSsrOwogCQlpZiAoYXN5bmNfdHhfdGVzdF9hY2soJmRlc2MtPnR4ZCkpIHsKQEAgLTEyMSw3ICsxMjIsNyBAQAogCQlkZXZfZGJnKGNoYW4yZGV2KCZhdGNoYW4tPmNoYW5fY29tbW9uKSwKIAkJCQkiZGVzYyAlcCBub3QgQUNLZWRcbiIsIGRlc2MpOwogCX0KLQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAlkZXZfdmRiZyhjaGFuMmRldigmYXRjaGFuLT5jaGFuX2NvbW1vbiksCiAJCSJzY2FubmVkICV1IGRlc2NyaXB0b3JzIG9uIGZyZWVsaXN0XG4iLCBpKTsKIApAQCAtMTI5LDkgKzEzMCw5IEBACiAJaWYgKCFyZXQpIHsKIAkJcmV0ID0gYXRjX2FsbG9jX2Rlc2NyaXB0b3IoJmF0Y2hhbi0+Y2hhbl9jb21tb24sIEdGUF9BVE9NSUMpOwogCQlpZiAocmV0KSB7Ci0JCQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJCQlhdGNoYW4tPmRlc2NzX2FsbG9jYXRlZCsrOwotCQkJc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJCQkibm90IGVub3VnaCBkZXNjcmlwdG9ycyBhdmFpbGFibGVcbiIpOwpAQCAtMTUwLDggKzE1MSw5IEBACiB7CiAJaWYgKGRlc2MpIHsKIAkJc3RydWN0IGF0X2Rlc2MgKmNoaWxkOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQogCQkJZGV2X3ZkYmcoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJCQkibW92aW5nIGNoaWxkIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsCkBAIC0xNjAsNyArMTYyLDcgQEAKIAkJZGV2X3ZkYmcoY2hhbjJkZXYoJmF0Y2hhbi0+Y2hhbl9jb21tb24pLAogCQkJICJtb3ZpbmcgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwgZGVzYyk7CiAJCWxpc3RfYWRkKCZkZXNjLT5kZXNjX25vZGUsICZhdGNoYW4tPmZyZWVfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTI5OSw3ICszMDEsNyBAQAogCiAJLyogZm9yIGN5Y2xpYyB0cmFuc2ZlcnMsCiAJICogbm8gbmVlZCB0byByZXBsYXkgY2FsbGJhY2sgZnVuY3Rpb24gd2hpbGUgc3RvcHBpbmcgKi8KLQlpZiAoIXRlc3RfYml0KEFUQ19JU19DWUNMSUMsICZhdGNoYW4tPnN0YXR1cykpIHsKKwlpZiAoIWF0Y19jaGFuX2lzX2N5Y2xpYyhhdGNoYW4pKSB7CiAJCWRtYV9hc3luY190eF9jYWxsYmFjawljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7CiAJCXZvaWQJCQkqcGFyYW0gPSB0eGQtPmNhbGxiYWNrX3BhcmFtOwogCkBAIC00NzEsMTYgKzQ3MywxNyBAQAogc3RhdGljIHZvaWQgYXRjX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuID0gKHN0cnVjdCBhdF9kbWFfY2hhbiAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBVENfSVNfRVJST1IsICZhdGNoYW4tPnN0YXR1cykpCiAJCWF0Y19oYW5kbGVfZXJyb3IoYXRjaGFuKTsKLQllbHNlIGlmICh0ZXN0X2JpdChBVENfSVNfQ1lDTElDLCAmYXRjaGFuLT5zdGF0dXMpKQorCWVsc2UgaWYgKGF0Y19jaGFuX2lzX2N5Y2xpYyhhdGNoYW4pKQogCQlhdGNfaGFuZGxlX2N5Y2xpYyhhdGNoYW4pOwogCWVsc2UKIAkJYXRjX2FkdmFuY2Vfd29yayhhdGNoYW4pOwogCi0Jc3Bpbl91bmxvY2soJmF0Y2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhdF9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTUzOSw4ICs1NDIsOSBAQAogCXN0cnVjdCBhdF9kZXNjCQkqZGVzYyA9IHR4ZF90b19hdF9kZXNjKHR4KTsKIAlzdHJ1Y3QgYXRfZG1hX2NoYW4JKmF0Y2hhbiA9IHRvX2F0X2RtYV9jaGFuKHR4LT5jaGFuKTsKIAlkbWFfY29va2llX3QJCWNvb2tpZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJY29va2llID0gYXRjX2Fzc2lnbl9jb29raWUoYXRjaGFuLCBkZXNjKTsKIAogCWlmIChsaXN0X2VtcHR5KCZhdGNoYW4tPmFjdGl2ZV9saXN0KSkgewpAQCAtNTU0LDcgKzU1OCw3IEBACiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJmF0Y2hhbi0+cXVldWUpOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTkyNywyOCArOTMxLDI5IEBACiAJc3RydWN0IGF0X2RtYV9jaGFuCSphdGNoYW4gPSB0b19hdF9kbWFfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgYXRfZG1hCQkqYXRkbWEgPSB0b19hdF9kbWEoY2hhbi0+ZGV2aWNlKTsKIAlpbnQJCQljaGFuX2lkID0gYXRjaGFuLT5jaGFuX2NvbW1vbi5jaGFuX2lkOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJTElTVF9IRUFEKGxpc3QpOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICJhdGNfY29udHJvbCAoJWQpXG4iLCBjbWQpOwogCiAJaWYgKGNtZCA9PSBETUFfUEFVU0UpIHsKLQkJc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAkJZG1hX3dyaXRlbChhdGRtYSwgQ0hFUiwgQVRfRE1BX1NVU1AoY2hhbl9pZCkpOwogCQlzZXRfYml0KEFUQ19JU19QQVVTRUQsICZhdGNoYW4tPnN0YXR1cyk7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCX0gZWxzZSBpZiAoY21kID09IERNQV9SRVNVTUUpIHsKLQkJaWYgKCF0ZXN0X2JpdChBVENfSVNfUEFVU0VELCAmYXRjaGFuLT5zdGF0dXMpKQorCQlpZiAoIWF0Y19jaGFuX2lzX3BhdXNlZChhdGNoYW4pKQogCQkJcmV0dXJuIDA7CiAKLQkJc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAkJZG1hX3dyaXRlbChhdGRtYSwgQ0hEUiwgQVRfRE1BX1JFUyhjaGFuX2lkKSk7CiAJCWNsZWFyX2JpdChBVENfSVNfUEFVU0VELCAmYXRjaGFuLT5zdGF0dXMpOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAl9IGVsc2UgaWYgKGNtZCA9PSBETUFfVEVSTUlOQVRFX0FMTCkgewogCQlzdHJ1Y3QgYXRfZGVzYwkqZGVzYywgKl9kZXNjOwogCQkvKgpAQCAtOTU3LDcgKzk2Miw3IEBACiAJCSAqIGNoYW5uZWwuIFdlIHN0aWxsIGhhdmUgdG8gcG9sbCB0aGUgY2hhbm5lbCBlbmFibGUgYml0IGR1ZQogCQkgKiB0byBBSEIvSFNCIGxpbWl0YXRpb25zLgogCQkgKi8KLQkJc3Bpbl9sb2NrX2JoKCZhdGNoYW4tPmxvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogZGlzYWJsaW5nIGNoYW5uZWw6IG11c3QgYWxzbyByZW1vdmUgc3VzcGVuZCBzdGF0ZSAqLwogCQlkbWFfd3JpdGVsKGF0ZG1hLCBDSERSLCBBVF9ETUFfUkVTKGNoYW5faWQpIHwgYXRjaGFuLT5tYXNrKTsKQEAgLTk3OCw3ICs5ODMsNyBAQAogCQkvKiBpZiBjaGFubmVsIGRlZGljYXRlZCB0byBjeWNsaWMgb3BlcmF0aW9ucywgZnJlZSBpdCAqLwogCQljbGVhcl9iaXQoQVRDX0lTX0NZQ0xJQywgJmF0Y2hhbi0+c3RhdHVzKTsKIAotCQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xMDA0LDkgKzEwMDksMTAgQEAKIAlzdHJ1Y3QgYXRfZG1hX2NoYW4JKmF0Y2hhbiA9IHRvX2F0X2RtYV9jaGFuKGNoYW4pOwogCWRtYV9jb29raWVfdAkJbGFzdF91c2VkOwogCWRtYV9jb29raWVfdAkJbGFzdF9jb21wbGV0ZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAllbnVtIGRtYV9zdGF0dXMJCXJldDsKIAotCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAlsYXN0X2NvbXBsZXRlID0gYXRjaGFuLT5jb21wbGV0ZWRfY29va2llOwogCWxhc3RfdXNlZCA9IGNoYW4tPmNvb2tpZTsKQEAgLTEwMjEsNyArMTAyNyw3IEBACiAJCXJldCA9IGRtYV9hc3luY19pc19jb21wbGV0ZShjb29raWUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAocmV0ICE9IERNQV9TVUNDRVNTKQogCQlkbWFfc2V0X3R4X3N0YXRlKHR4c3RhdGUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCwKQEAgLTEwMjksNyArMTAzNSw3IEBACiAJZWxzZQogCQlkbWFfc2V0X3R4X3N0YXRlKHR4c3RhdGUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCwgMCk7CiAKLQlpZiAodGVzdF9iaXQoQVRDX0lTX1BBVVNFRCwgJmF0Y2hhbi0+c3RhdHVzKSkKKwlpZiAoYXRjX2NoYW5faXNfcGF1c2VkKGF0Y2hhbikpCiAJCXJldCA9IERNQV9QQVVTRUQ7CiAKIAlkZXZfdmRiZyhjaGFuMmRldihjaGFuKSwgInR4X3N0YXR1cyAlZDogY29va2llID0gJWQgKGQlZCwgdSVkKVxuIiwKQEAgLTEwNDYsMTggKzEwNTIsMTkgQEAKIHN0YXRpYyB2b2lkIGF0Y19pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgYXRfZG1hX2NoYW4JKmF0Y2hhbiA9IHRvX2F0X2RtYV9jaGFuKGNoYW4pOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICJpc3N1ZV9wZW5kaW5nXG4iKTsKIAogCS8qIE5vdCBuZWVkZWQgZm9yIGN5Y2xpYyB0cmFuc2ZlcnMgKi8KLQlpZiAodGVzdF9iaXQoQVRDX0lTX0NZQ0xJQywgJmF0Y2hhbi0+c3RhdHVzKSkKKwlpZiAoYXRjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXRjaGFuLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFhdGNfY2hhbl9pc19lbmFibGVkKGF0Y2hhbikpIHsKIAkJYXRjX2FkdmFuY2Vfd29yayhhdGNoYW4pOwogCX0KLQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoqCkBAIC0xMDczLDYgKzEwODAsNyBAQAogCXN0cnVjdCBhdF9kbWEJCSphdGRtYSA9IHRvX2F0X2RtYShjaGFuLT5kZXZpY2UpOwogCXN0cnVjdCBhdF9kZXNjCQkqZGVzYzsKIAlzdHJ1Y3QgYXRfZG1hX3NsYXZlCSphdHNsYXZlOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWludAkJCWk7CiAJdTMyCQkJY2ZnOwogCUxJU1RfSEVBRCh0bXBfbGlzdCk7CkBAIC0xMTE2LDExICsxMTI0LDExIEBACiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJnRtcF9saXN0KTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJmF0Y2hhbi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCWF0Y2hhbi0+ZGVzY3NfYWxsb2NhdGVkID0gaTsKIAlsaXN0X3NwbGljZSgmdG1wX2xpc3QsICZhdGNoYW4tPmZyZWVfbGlzdCk7CiAJYXRjaGFuLT5jb21wbGV0ZWRfY29va2llID0gY2hhbi0+Y29va2llID0gMTsKLQlzcGluX3VubG9ja19iaCgmYXRjaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCS8qIGNoYW5uZWwgcGFyYW1ldGVycyAqLwogCWNoYW5uZWxfd3JpdGVsKGF0Y2hhbiwgQ0ZHLCBjZmcpOwpAQCAtMTI2MCwxMiArMTI2OCwxMSBAQAogCiAJLyogaW5pdGlhbGl6ZSBjaGFubmVscyByZWxhdGVkIHZhbHVlcyAqLwogCUlOSVRfTElTVF9IRUFEKCZhdGRtYS0+ZG1hX2NvbW1vbi5jaGFubmVscyk7Ci0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ucl9jaGFubmVsczsgaSsrLCBhdGRtYS0+ZG1hX2NvbW1vbi5jaGFuY250KyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX2NoYW5uZWxzOyBpKyspIHsKIAkJc3RydWN0IGF0X2RtYV9jaGFuCSphdGNoYW4gPSAmYXRkbWEtPmNoYW5baV07CiAKIAkJYXRjaGFuLT5jaGFuX2NvbW1vbi5kZXZpY2UgPSAmYXRkbWEtPmRtYV9jb21tb247CiAJCWF0Y2hhbi0+Y2hhbl9jb21tb24uY29va2llID0gYXRjaGFuLT5jb21wbGV0ZWRfY29va2llID0gMTsKLQkJYXRjaGFuLT5jaGFuX2NvbW1vbi5jaGFuX2lkID0gaTsKIAkJbGlzdF9hZGRfdGFpbCgmYXRjaGFuLT5jaGFuX2NvbW1vbi5kZXZpY2Vfbm9kZSwKIAkJCQkmYXRkbWEtPmRtYV9jb21tb24uY2hhbm5lbHMpOwogCkBAIC0xMjkzLDIyICsxMzAwLDIwIEBACiAJaWYgKGRtYV9oYXNfY2FwKERNQV9NRU1DUFksIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSkKIAkJYXRkbWEtPmRtYV9jb21tb24uZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGF0Y19wcmVwX2RtYV9tZW1jcHk7CiAKLQlpZiAoZG1hX2hhc19jYXAoRE1BX1NMQVZFLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzaykpCisJaWYgKGRtYV9oYXNfY2FwKERNQV9TTEFWRSwgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spKSB7CiAJCWF0ZG1hLT5kbWFfY29tbW9uLmRldmljZV9wcmVwX3NsYXZlX3NnID0gYXRjX3ByZXBfc2xhdmVfc2c7Ci0KLQlpZiAoZG1hX2hhc19jYXAoRE1BX0NZQ0xJQywgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spKQorCQkvKiBjb250cm9sbGVyIGNhbiBkbyBzbGF2ZSBETUE6IGNhbiB0cmlnZ2VyIGN5Y2xpYyB0cmFuc2ZlcnMgKi8KKwkJZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2spOwogCQlhdGRtYS0+ZG1hX2NvbW1vbi5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gYXRjX3ByZXBfZG1hX2N5Y2xpYzsKLQotCWlmIChkbWFfaGFzX2NhcChETUFfU0xBVkUsIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSB8fAotCSAgICBkbWFfaGFzX2NhcChETUFfQ1lDTElDLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzaykpCiAJCWF0ZG1hLT5kbWFfY29tbW9uLmRldmljZV9jb250cm9sID0gYXRjX2NvbnRyb2w7CisJfQogCiAJZG1hX3dyaXRlbChhdGRtYSwgRU4sIEFUX0RNQV9FTkFCTEUpOwogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkF0bWVsIEFIQiBETUEgQ29udHJvbGxlciAoICVzJXMpLCAlZCBjaGFubmVsc1xuIiwKIAkgIGRtYV9oYXNfY2FwKERNQV9NRU1DUFksIGF0ZG1hLT5kbWFfY29tbW9uLmNhcF9tYXNrKSA/ICJjcHkgIiA6ICIiLAogCSAgZG1hX2hhc19jYXAoRE1BX1NMQVZFLCBhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzaykgID8gInNsYXZlICIgOiAiIiwKLQkgIGF0ZG1hLT5kbWFfY29tbW9uLmNoYW5jbnQpOworCSAgcGRhdGEtPm5yX2NoYW5uZWxzKTsKIAogCWRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoJmF0ZG1hLT5kbWFfY29tbW9uKTsKIApAQCAtMTM3NywyNyArMTM4MiwxMTIgQEAKIAljbGtfZGlzYWJsZShhdGRtYS0+Y2xrKTsKIH0KIAorc3RhdGljIGludCBhdF9kbWFfcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBhdF9kbWEgKmF0ZG1hID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuLCAqX2NoYW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgX2NoYW4sICZhdGRtYS0+ZG1hX2NvbW1vbi5jaGFubmVscywKKwkJCWRldmljZV9ub2RlKSB7CisJCXN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuID0gdG9fYXRfZG1hX2NoYW4oY2hhbik7CisJCS8qIHdhaXQgZm9yIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24gKGV4Y2VwdCBpbiBjeWNsaWMgY2FzZSkgKi8KKwkJaWYgKGF0Y19jaGFuX2lzX2VuYWJsZWQoYXRjaGFuKSAmJiAhYXRjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0Y19zdXNwZW5kX2N5Y2xpYyhzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbikKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4JKmNoYW4gPSAmYXRjaGFuLT5jaGFuX2NvbW1vbjsKKworCS8qIENoYW5uZWwgc2hvdWxkIGJlIHBhdXNlZCBieSB1c2VyCisJICogZG8gaXQgYW55d2F5IGV2ZW4gaWYgaXQgaXMgbm90IGRvbmUgYWxyZWFkeSAqLworCWlmICghYXRjX2NoYW5faXNfcGF1c2VkKGF0Y2hhbikpIHsKKwkJZGV2X3dhcm4oY2hhbjJkZXYoY2hhbiksCisJCSJjeWNsaWMgY2hhbm5lbCBub3QgcGF1c2VkLCBzaG91bGQgYmUgZG9uZSBieSBjaGFubmVsIHVzZXJcbiIpOworCQlhdGNfY29udHJvbChjaGFuLCBETUFfUEFVU0UsIDApOworCX0KKworCS8qIG5vdyBwcmVzZXJ2ZSBhZGRpdGlvbmFsIGRhdGEgZm9yIGN5Y2xpYyBvcGVyYXRpb25zICovCisJLyogbmV4dCBkZXNjcmlwdG9yIGFkZHJlc3MgaW4gdGhlIGN5Y2xpYyBsaXN0ICovCisJYXRjaGFuLT5zYXZlX2RzY3IgPSBjaGFubmVsX3JlYWRsKGF0Y2hhbiwgRFNDUik7CisKKwl2ZGJnX2R1bXBfcmVncyhhdGNoYW4pOworfQorCiBzdGF0aWMgaW50IGF0X2RtYV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGF0X2RtYSAqYXRkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKIAotCWF0X2RtYV9vZmYocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOworCS8qIHByZXNlcnZlIGRhdGEgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgX2NoYW4sICZhdGRtYS0+ZG1hX2NvbW1vbi5jaGFubmVscywKKwkJCWRldmljZV9ub2RlKSB7CisJCXN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuID0gdG9fYXRfZG1hX2NoYW4oY2hhbik7CisKKwkJaWYgKGF0Y19jaGFuX2lzX2N5Y2xpYyhhdGNoYW4pKQorCQkJYXRjX3N1c3BlbmRfY3ljbGljKGF0Y2hhbik7CisJCWF0Y2hhbi0+c2F2ZV9jZmcgPSBjaGFubmVsX3JlYWRsKGF0Y2hhbiwgQ0ZHKTsKKwl9CisJYXRkbWEtPnNhdmVfaW1yID0gZG1hX3JlYWRsKGF0ZG1hLCBFQkNJTVIpOworCisJLyogZGlzYWJsZSBETUEgY29udHJvbGxlciAqLworCWF0X2RtYV9vZmYoYXRkbWEpOwogCWNsa19kaXNhYmxlKGF0ZG1hLT5jbGspOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhdGNfcmVzdW1lX2N5Y2xpYyhzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbikKK3sKKwlzdHJ1Y3QgYXRfZG1hCSphdGRtYSA9IHRvX2F0X2RtYShhdGNoYW4tPmNoYW5fY29tbW9uLmRldmljZSk7CisKKwkvKiByZXN0b3JlIGNoYW5uZWwgc3RhdHVzIGZvciBjeWNsaWMgZGVzY3JpcHRvcnMgbGlzdDoKKwkgKiBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGN5Y2xpYyBsaXN0IGF0IHRoZSB0aW1lIG9mIHN1c3BlbmQgKi8KKwljaGFubmVsX3dyaXRlbChhdGNoYW4sIFNBRERSLCAwKTsKKwljaGFubmVsX3dyaXRlbChhdGNoYW4sIERBRERSLCAwKTsKKwljaGFubmVsX3dyaXRlbChhdGNoYW4sIENUUkxBLCAwKTsKKwljaGFubmVsX3dyaXRlbChhdGNoYW4sIENUUkxCLCAwKTsKKwljaGFubmVsX3dyaXRlbChhdGNoYW4sIERTQ1IsIGF0Y2hhbi0+c2F2ZV9kc2NyKTsKKwlkbWFfd3JpdGVsKGF0ZG1hLCBDSEVSLCBhdGNoYW4tPm1hc2spOworCisJLyogY2hhbm5lbCBwYXVzZSBzdGF0dXMgc2hvdWxkIGJlIHJlbW92ZWQgYnkgY2hhbm5lbCB1c2VyCisJICogV2UgY2Fubm90IHRha2UgdGhlIGluaXRpYXRpdmUgdG8gZG8gaXQgaGVyZSAqLworCisJdmRiZ19kdW1wX3JlZ3MoYXRjaGFuKTsKK30KKwogc3RhdGljIGludCBhdF9kbWFfcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGF0X2RtYSAqYXRkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKIAorCS8qIGJyaW5nIGJhY2sgRE1BIGNvbnRyb2xsZXIgKi8KIAljbGtfZW5hYmxlKGF0ZG1hLT5jbGspOwogCWRtYV93cml0ZWwoYXRkbWEsIEVOLCBBVF9ETUFfRU5BQkxFKTsKKworCS8qIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCAqLworCXdoaWxlIChkbWFfcmVhZGwoYXRkbWEsIEVCQ0lTUikpCisJCWNwdV9yZWxheCgpOworCisJLyogcmVzdG9yZSBzYXZlZCBkYXRhICovCisJZG1hX3dyaXRlbChhdGRtYSwgRUJDSUVSLCBhdGRtYS0+c2F2ZV9pbXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwgJmF0ZG1hLT5kbWFfY29tbW9uLmNoYW5uZWxzLAorCQkJZGV2aWNlX25vZGUpIHsKKwkJc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4gPSB0b19hdF9kbWFfY2hhbihjaGFuKTsKKworCQljaGFubmVsX3dyaXRlbChhdGNoYW4sIENGRywgYXRjaGFuLT5zYXZlX2NmZyk7CisJCWlmIChhdGNfY2hhbl9pc19jeWNsaWMoYXRjaGFuKSkKKwkJCWF0Y19yZXN1bWVfY3ljbGljKGF0Y2hhbik7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYXRfZG1hX2Rldl9wbV9vcHMgPSB7CisJLnByZXBhcmUgPSBhdF9kbWFfcHJlcGFyZSwKIAkuc3VzcGVuZF9ub2lycSA9IGF0X2RtYV9zdXNwZW5kX25vaXJxLAogCS5yZXN1bWVfbm9pcnEgPSBhdF9kbWFfcmVzdW1lX25vaXJxLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaCBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaAppbmRleCAwODdkYmYxLi5hYTRjOWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hdF9oZG1hY19yZWdzLmgKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWNfcmVncy5oCkBAIC0yMDQsNiArMjA0LDkgQEAKICAqIEBzdGF0dXM6IHRyYW5zbWl0IHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIGlycS9wcmVwKiBmdW5jdGlvbnMKICAqICAgICAgICAgICAgICAgIHRvIHRhc2tsZXQgKHVzZSBhdG9taWMgb3BlcmF0aW9ucykKICAqIEB0YXNrbGV0OiBib3R0b20gaGFsZiB0byBmaW5pc2ggdHJhbnNhY3Rpb24gd29yaworICogQHNhdmVfY2ZnOiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRoYXQgaXMgc2F2ZWQgb24gc3VzcGVuZC9yZXN1bWUgY3ljbGUKKyAqIEBzYXZlX2RzY3I6IGZvciBjeWNsaWMgb3BlcmF0aW9ucywgcHJlc2VydmUgbmV4dCBkZXNjcmlwdG9yIGFkZHJlc3MgaW4KKyAqICAgICAgICAgICAgIHRoZSBjeWNsaWMgbGlzdCBvbiBzdXNwZW5kL3Jlc3VtZSBjeWNsZQogICogQGxvY2s6IHNlcmlhbGl6ZXMgZW5xdWV1ZS9kZXF1ZXVlIG9wZXJhdGlvbnMgdG8gZGVzY3JpcHRvcnMgbGlzdHMKICAqIEBjb21wbGV0ZWRfY29va2llOiBpZGVudGlmaWVyIGZvciB0aGUgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgb3BlcmF0aW9uCiAgKiBAYWN0aXZlX2xpc3Q6IGxpc3Qgb2YgZGVzY3JpcHRvcnMgZG1hZW5naW5lIGlzIGJlaW5nIHJ1bm5pbmcgb24KQEAgLTIxOCw2ICsyMjEsOCBAQAogCXU4CQkJbWFzazsKIAl1bnNpZ25lZCBsb25nCQlzdGF0dXM7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRhc2tsZXQ7CisJdTMyCQkJc2F2ZV9jZmc7CisJdTMyCQkJc2F2ZV9kc2NyOwogCiAJc3BpbmxvY2tfdAkJbG9jazsKIApAQCAtMjQ4LDYgKzI1Myw3IEBACiAgKiBAY2hhbl9jb21tb246IGNvbW1vbiBkbWFlbmdpbmUgZG1hX2RldmljZSBvYmplY3QgbWVtYmVycwogICogQGNoX3JlZ3M6IG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgYmFzZQogICogQGNsazogZG1hIGNvbnRyb2xsZXIgY2xvY2sKKyAqIEBzYXZlX2ltcjogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgdGhhdCBpcyBzYXZlZCBvbiBzdXNwZW5kL3Jlc3VtZSBjeWNsZQogICogQGFsbF9jaGFuX21hc2s6IGFsbCBjaGFubmVscyBhdmFpbGxhYmxlIGluIGEgbWFzawogICogQGRtYV9kZXNjX3Bvb2w6IGJhc2Ugb2YgRE1BIGRlc2NyaXB0b3IgcmVnaW9uIChETUEgYWRkcmVzcykKICAqIEBjaGFuOiBjaGFubmVscyB0YWJsZSB0byBzdG9yZSBhdF9kbWFfY2hhbiBzdHJ1Y3R1cmVzCkBAIC0yNTYsNiArMjYyLDcgQEAKIAlzdHJ1Y3QgZG1hX2RldmljZQlkbWFfY29tbW9uOwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IGNsawkJKmNsazsKKwl1MzIJCQlzYXZlX2ltcjsKIAogCXU4CQkJYWxsX2NoYW5fbWFzazsKIApAQCAtMzU1LDYgKzM2MiwyMyBAQAogCXJldHVybiAhIShkbWFfcmVhZGwoYXRkbWEsIENIU1IpICYgYXRjaGFuLT5tYXNrKTsKIH0KIAorLyoqCisgKiBhdGNfY2hhbl9pc19wYXVzZWQgLSB0ZXN0IGNoYW5uZWwgcGF1c2UvcmVzdW1lIHN0YXR1cworICogQGF0Y2hhbjogY2hhbm5lbCB3ZSB3YW50IHRvIHRlc3Qgc3RhdHVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0Y19jaGFuX2lzX3BhdXNlZChzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbikKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQVRDX0lTX1BBVVNFRCwgJmF0Y2hhbi0+c3RhdHVzKTsKK30KKworLyoqCisgKiBhdGNfY2hhbl9pc19jeWNsaWMgLSB0ZXN0IGlmIGdpdmVuIGNoYW5uZWwgaGFzIGN5Y2xpYyBwcm9wZXJ0eSBzZXQKKyAqIEBhdGNoYW46IGNoYW5uZWwgd2Ugd2FudCB0byB0ZXN0IHN0YXR1cworICovCitzdGF0aWMgaW5saW5lIGludCBhdGNfY2hhbl9pc19jeWNsaWMoc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4pCit7CisJcmV0dXJuIHRlc3RfYml0KEFUQ19JU19DWUNMSUMsICZhdGNoYW4tPnN0YXR1cyk7Cit9CiAKIC8qKgogICogc2V0X2Rlc2NfZW9sIC0gc2V0IGVuZC1vZi1saW5rIHRvIGRlc2NyaXB0b3Igc28gaXQgd2lsbCBlbmQgdHJhbnNmZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwppbmRleCA3NjVmNWZmLi5lYjFkODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKKysrIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjUxLDYgKzI1Miw3IEBACiAJaW50CQkJaTsKIAogCXRocmVhZF9uYW1lID0gY3VycmVudC0+Y29tbTsKKwlzZXRfZnJlZXphYmxlX3dpdGhfc2lnbmFsKCk7CiAKIAlyZXQgPSAtRU5PTUVNOwogCkBAIC0zMDUsNyArMzA3LDggQEAKIAkJZG1hX2FkZHJfdCBkbWFfc3Jjc1tzcmNfY250XTsKIAkJZG1hX2FkZHJfdCBkbWFfZHN0c1tkc3RfY250XTsKIAkJc3RydWN0IGNvbXBsZXRpb24gY21wOwotCQl1bnNpZ25lZCBsb25nIHRtbyA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHRtbywgZW5kID0gMCAvKiBjb21waWxlci4uLiAqLzsKKwkJYm9vbCByZWxvYWQgPSB0cnVlOwogCQl1OCBhbGlnbiA9IDA7CiAKIAkJdG90YWxfdGVzdHMrKzsKQEAgLTQwNCw3ICs0MDcsMTcgQEAKIAkJfQogCQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKIAotCQl0bW8gPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNtcCwgdG1vKTsKKwkJZG8geworCQkJc3RhcnQgPSBqaWZmaWVzOworCQkJaWYgKHJlbG9hZCkKKwkJCQllbmQgPSBzdGFydCArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJCQllbHNlIGlmIChlbmQgPD0gc3RhcnQpCisJCQkJZW5kID0gc3RhcnQgKyAxOworCQkJdG1vID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmNtcCwKKwkJCQkJCQkJZW5kIC0gc3RhcnQpOworCQkJcmVsb2FkID0gdHJ5X3RvX2ZyZWV6ZSgpOworCQl9IHdoaWxlICh0bW8gPT0gLUVSRVNUQVJUU1lTKTsKKwogCQlzdGF0dXMgPSBkbWFfYXN5bmNfaXNfdHhfY29tcGxldGUoY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKTsKIAogCQlpZiAodG1vID09IDApIHsKQEAgLTQ3Nyw2ICs0OTAsOCBAQAogCXByX25vdGljZSgiJXM6IHRlcm1pbmF0aW5nIGFmdGVyICV1IHRlc3RzLCAldSBmYWlsdXJlcyAoc3RhdHVzICVkKVxuIiwKIAkJCXRocmVhZF9uYW1lLCB0b3RhbF90ZXN0cywgZmFpbGVkX3Rlc3RzLCByZXQpOwogCisJLyogdGVybWluYXRlIGFsbCB0cmFuc2ZlcnMgb24gc3BlY2lmaWVkIGNoYW5uZWxzICovCisJY2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbChjaGFuLCBETUFfVEVSTUlOQVRFX0FMTCwgMCk7CiAJaWYgKGl0ZXJhdGlvbnMgPiAwKQogCQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQkJREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyh3YWl0X2RtYXRlc3RfZXhpdCk7CkBAIC00OTksNiArNTE0LDEwIEBACiAJCWxpc3RfZGVsKCZ0aHJlYWQtPm5vZGUpOwogCQlrZnJlZSh0aHJlYWQpOwogCX0KKworCS8qIHRlcm1pbmF0ZSBhbGwgdHJhbnNmZXJzIG9uIHNwZWNpZmllZCBjaGFubmVscyAqLworCWR0Yy0+Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbChkdGMtPmNoYW4sIERNQV9URVJNSU5BVEVfQUxMLCAwKTsKKwogCWtmcmVlKGR0Yyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2R3X2RtYWMuYyBiL2RyaXZlcnMvZG1hL2R3X2RtYWMuYwppbmRleCA0ZDE4MGNhLi45YmZkNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kd19kbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvZHdfZG1hYy5jCkBAIC0xNDA3LDEyICsxNDA3LDExIEBACiAJZHctPmFsbF9jaGFuX21hc2sgPSAoMSA8PCBwZGF0YS0+bnJfY2hhbm5lbHMpIC0gMTsKIAogCUlOSVRfTElTVF9IRUFEKCZkdy0+ZG1hLmNoYW5uZWxzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX2NoYW5uZWxzOyBpKyssIGR3LT5kbWEuY2hhbmNudCsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ucl9jaGFubmVsczsgaSsrKSB7CiAJCXN0cnVjdCBkd19kbWFfY2hhbgkqZHdjID0gJmR3LT5jaGFuW2ldOwogCiAJCWR3Yy0+Y2hhbi5kZXZpY2UgPSAmZHctPmRtYTsKIAkJZHdjLT5jaGFuLmNvb2tpZSA9IGR3Yy0+Y29tcGxldGVkID0gMTsKLQkJZHdjLT5jaGFuLmNoYW5faWQgPSBpOwogCQlpZiAocGRhdGEtPmNoYW5fYWxsb2NhdGlvbl9vcmRlciA9PSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HKQogCQkJbGlzdF9hZGRfdGFpbCgmZHdjLT5jaGFuLmRldmljZV9ub2RlLAogCQkJCQkmZHctPmRtYS5jaGFubmVscyk7CkBAIC0xNDY4LDcgKzE0NjcsNyBAQAogCWRtYV93cml0ZWwoZHcsIENGRywgRFdfQ0ZHX0RNQV9FTik7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogRGVzaWduV2FyZSBETUEgQ29udHJvbGxlciwgJWQgY2hhbm5lbHNcbiIsCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgZHctPmRtYS5jaGFuY250KTsKKwkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBwZGF0YS0+bnJfY2hhbm5lbHMpOwogCiAJZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmZHctPmRtYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYyBiL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYwppbmRleCA1ZDdhNDliLi5iNDdlMmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LWRtYS5jIGIvZHJpdmVycy9kbWEvaW14LWRtYS5jCmluZGV4IGQ5OWY3MWMuLjRiZTU1ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lteC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtZG1hLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTIzLDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEtdjEuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCmluZGV4IDdiZDdlOTguLmY5OTM5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW14LXNkbWEuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9zZG1hLmg+CkBAIC0zMTgsNiArMzIwLDcgQEAKIAlkbWFfYWRkcl90CQkJY29udGV4dF9waHlzOwogCXN0cnVjdCBkbWFfZGV2aWNlCQlkbWFfZGV2aWNlOwogCXN0cnVjdCBjbGsJCQkqY2xrOworCXN0cnVjdCBtdXRleAkJCWNoYW5uZWxfMF9sb2NrOwogCXN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycwkqc2NyaXB0X2FkZHJzOwogfTsKIApAQCAtNDE1LDExICs0MTgsMTUgQEAKIAlkbWFfYWRkcl90IGJ1Zl9waHlzOwogCWludCByZXQ7CiAKKwltdXRleF9sb2NrKCZzZG1hLT5jaGFubmVsXzBfbG9jayk7CisKIAlidWZfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLAogCQkJc2l6ZSwKIAkJCSZidWZfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZfdmlydCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFidWZfdmlydCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQogCiAJYmQwLT5tb2RlLmNvbW1hbmQgPSBDMF9TRVRQTTsKIAliZDAtPm1vZGUuc3RhdHVzID0gQkRfRE9ORSB8IEJEX0lOVFIgfCBCRF9XUkFQIHwgQkRfRVhURDsKQEAgLTQzMyw2ICs0NDAsOSBAQAogCiAJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZSwgYnVmX3ZpcnQsIGJ1Zl9waHlzKTsKIAorZXJyX291dDoKKwltdXRleF91bmxvY2soJnNkbWEtPmNoYW5uZWxfMF9sb2NrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY1Niw2ICs2NjYsOCBAQAogCWRldl9kYmcoc2RtYS0+ZGV2LCAiZXZlbnRfbWFzazAgPSAweCUwOHhcbiIsIHNkbWFjLT5ldmVudF9tYXNrMCk7CiAJZGV2X2RiZyhzZG1hLT5kZXYsICJldmVudF9tYXNrMSA9IDB4JTA4eFxuIiwgc2RtYWMtPmV2ZW50X21hc2sxKTsKIAorCW11dGV4X2xvY2soJnNkbWEtPmNoYW5uZWxfMF9sb2NrKTsKKwogCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YoKmNvbnRleHQpKTsKIAljb250ZXh0LT5jaGFubmVsX3N0YXRlLnBjID0gbG9hZF9hZGRyZXNzOwogCkBAIC02NzYsNiArNjg4LDggQEAKIAogCXJldCA9IHNkbWFfcnVuX2NoYW5uZWwoJnNkbWEtPmNoYW5uZWxbMF0pOwogCisJbXV0ZXhfdW5sb2NrKCZzZG1hLT5jaGFubmVsXzBfbG9jayk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTMxLDE4ICsxMTQ1LDE3IEBACiAJCQlzYWRkcl9hcnJbaV0gPSBhZGRyX2FycltpXTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2RtYV9nZXRfZmlybXdhcmUoc3RydWN0IHNkbWFfZW5naW5lICpzZG1hLAotCQljb25zdCBjaGFyICpmd19uYW1lKQorc3RhdGljIHZvaWQgc2RtYV9sb2FkX2Zpcm13YXJlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpCiB7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWEgPSBjb250ZXh0OwogCWNvbnN0IHN0cnVjdCBzZG1hX2Zpcm13YXJlX2hlYWRlciAqaGVhZGVyOwotCWludCByZXQ7CiAJY29uc3Qgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzICphZGRyOwogCXVuc2lnbmVkIHNob3J0ICpyYW1fY29kZTsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBzZG1hLT5kZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaWYgKCFmdykgeworCQlkZXZfZXJyKHNkbWEtPmRldiwgImZpcm13YXJlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoZnctPnNpemUgPCBzaXplb2YoKmhlYWRlcikpCiAJCWdvdG8gZXJyX2Zpcm13YXJlOwpAQCAtMTE3Miw2ICsxMTg1LDE2IEBACiAKIGVycl9maXJtd2FyZToKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2RtYV9nZXRfZmlybXdhcmUoc3RydWN0IHNkbWFfZW5naW5lICpzZG1hLAorCQljb25zdCBjaGFyICpmd19uYW1lKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwKKwkJCUZXX0FDVElPTl9IT1RQTFVHLCBmd19uYW1lLCBzZG1hLT5kZXYsCisJCQlHRlBfS0VSTkVMLCBzZG1hLCBzZG1hX2xvYWRfZmlybXdhcmUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyNjksMTEgKzEyOTIsMTQgQEAKIAlzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCBpOwogCXN0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYTsKKwlzMzIgKnNhZGRyX2FycjsKIAogCXNkbWEgPSBremFsbG9jKHNpemVvZigqc2RtYSksIEdGUF9LRVJORUwpOwogCWlmICghc2RtYSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwltdXRleF9pbml0KCZzZG1hLT5jaGFubmVsXzBfbG9jayk7CisKIAlzZG1hLT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpAQCAtMTMxMCw2ICsxMzM2LDExIEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAorCS8qIGluaXRpYWxseSBubyBzY3JpcHRzIGF2YWlsYWJsZSAqLworCXNhZGRyX2FyciA9IChzMzIgKilzZG1hLT5zY3JpcHRfYWRkcnM7CisJZm9yIChpID0gMDsgaSA8IFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjE7IGkrKykKKwkJc2FkZHJfYXJyW2ldID0gLUVJTlZBTDsKKwogCWlmIChvZl9pZCkKIAkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKIAlzZG1hLT5kZXZ0eXBlID0gcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jIGIvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCmluZGV4IDhhM2ZkZDguLjE5YTBjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZWxfbWlkX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9DSEFOCTQgLyptYXggY2ggYWNyb3NzIGNvbnRyb2xsZXJzKi8KICNpbmNsdWRlICJpbnRlbF9taWRfZG1hX3JlZ3MuaCIKQEAgLTExNSwxNiArMTE2LDE1IEBACiAKIC8qKgogICogZG1hYzFfbWFza19wZXJpcGhyYWxfaW50ciAtCW1hc2sgdGhlIHBlcmlwaHJhbCBpbnRlcnJ1cHQKLSAqIEBtaWRjOiBkbWEgY2hhbm5lbCBmb3Igd2hpY2ggbWFza2luZyBpcyByZXF1aXJlZAorICogQG1pZDogZG1hIGRldmljZSBmb3Igd2hpY2ggbWFza2luZyBpcyByZXF1aXJlZAogICoKICAqIE1hc2tzIHRoZSBETUEgcGVyaXBocmFsIGludGVycnVwdAogICogdGhpcyBpcyB2YWxpZCBmb3IgRE1BQzEgZmFtaWx5IGNvbnRyb2xsZXJzIG9ubHkKICAqIFRoaXMgY29udHJvbGxlciBzaG91bGQgaGF2ZSBwZXJpcGhyYWwgbWFzayByZWdpc3RlcnMgYWxyZWFkeSBtYXBwZWQKICAqLwotc3RhdGljIHZvaWQgZG1hYzFfbWFza19wZXJpcGhyYWxfaW50cihzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjKQorc3RhdGljIHZvaWQgZG1hYzFfbWFza19wZXJpcGhyYWxfaW50cihzdHJ1Y3QgbWlkZG1hX2RldmljZSAqbWlkKQogewogCXUzMiBwaW1yOwotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQgPSB0b19taWRkbWFfZGV2aWNlKG1pZGMtPmNoYW4uZGV2aWNlKTsKIAogCWlmIChtaWQtPnBpbXJfbWFzaykgewogCQlwaW1yID0gcmVhZGwobWlkLT5tYXNrX3JlZyArIExOV19QRVJJUEhSQUxfTUFTSyk7CkBAIC0xODQsNyArMTg0LDYgQEAKIHN0YXRpYyB2b2lkIGRpc2FibGVfZG1hX2ludGVycnVwdChzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjKQogewogCS8qQ2hlY2sgTFBFIFBJU1IsIG1ha2Ugc3VyZSBmd2QgaXMgZGlzYWJsZWQqLwotCWRtYWMxX21hc2tfcGVyaXBocmFsX2ludHIobWlkYyk7CiAJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkYy0+Y2hfaWQpLCBtaWRjLT5kbWFfYmFzZSArIE1BU0tfQkxPQ0spOwogCWlvd3JpdGUzMihNQVNLX0lOVFJfUkVHKG1pZGMtPmNoX2lkKSwgbWlkYy0+ZG1hX2Jhc2UgKyBNQVNLX1RGUik7CiAJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkYy0+Y2hfaWQpLCBtaWRjLT5kbWFfYmFzZSArIE1BU0tfRVJSKTsKQEAgLTExMTQsNyArMTExMyw2IEBACiAKIAkJbWlkY2gtPmNoYW4uZGV2aWNlID0gJmRtYS0+Y29tbW9uOwogCQltaWRjaC0+Y2hhbi5jb29raWUgPSAgMTsKLQkJbWlkY2gtPmNoYW4uY2hhbl9pZCA9IGk7CiAJCW1pZGNoLT5jaF9pZCA9IGRtYS0+Y2hhbl9iYXNlICsgaTsKIAkJcHJfZGVidWcoIk1ETUE6SW5pdCBDSCAlZCwgSUQgJWRcbiIsIGksIG1pZGNoLT5jaF9pZCk7CiAKQEAgLTExNTAsNyArMTE0OCw2IEBACiAJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBkbWEtPmNvbW1vbi5jYXBfbWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX1BSSVZBVEUsIGRtYS0+Y29tbW9uLmNhcF9tYXNrKTsKIAlkbWEtPmNvbW1vbi5kZXYgPSAmcGRldi0+ZGV2OwotCWRtYS0+Y29tbW9uLmNoYW5jbnQgPSBkbWEtPm1heF9jaGFuOwogCiAJZG1hLT5jb21tb24uZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0KIAkJCQkJaW50ZWxfbWlkX2RtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKQEAgLTEzNTAsNiArMTM0Nyw3IEBACiAJCWlmIChkZXZpY2UtPmNoW2ldLmluX3VzZSkKIAkJCXJldHVybiAtRUFHQUlOOwogCX0KKwlkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyKGRldmljZSk7CiAJZGV2aWNlLT5zdGF0ZSA9IFNVU1BFTkRFRDsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jIGIvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCmluZGV4IDY4MTU5MDUuLjBlNWVmMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcHUuaD4KIApAQCAtMTMwNyw2ICsxMzA4LDcgQEAKIAkgICAgaXB1X3N1Ym1pdF9idWZmZXIoaWNoYW4sIGRlc2NuZXcsIHNnbmV3LCBpY2hhbi0+YWN0aXZlX2J1ZmZlcikgPCAwKSB7CiAJCWNhbGxiYWNrID0gZGVzY25ldy0+dHhkLmNhbGxiYWNrOwogCQljYWxsYmFja19wYXJhbSA9IGRlc2NuZXctPnR4ZC5jYWxsYmFja19wYXJhbTsKKwkJbGlzdF9kZWxfaW5pdCgmZGVzY25ldy0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZpY2hhbi0+bG9jayk7CiAJCWlmIChjYWxsYmFjaykKIAkJCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKQEAgLTE0MjgsMzkgKzE0MzAsNTggQEAKIHsKIAlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSB0b19pZG1hY19jaGFuKGNoYW4pOwogCXN0cnVjdCBpZG1hYyAqaWRtYWMgPSB0b19pZG1hYyhjaGFuLT5kZXZpY2UpOworCXN0cnVjdCBpcHUgKmlwdSA9IHRvX2lwdShpZG1hYyk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JLyogT25seSBzdXBwb3J0cyBETUFfVEVSTUlOQVRFX0FMTCAqLwotCWlmIChjbWQgIT0gRE1BX1RFUk1JTkFURV9BTEwpCi0JCXJldHVybiAtRU5YSU87CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERNQV9QQVVTRToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlwdS0+bG9jaywgZmxhZ3MpOworCQlpcHVfaWNfZGlzYWJsZV90YXNrKGlwdSwgY2hhbi0+Y2hhbl9pZCk7CiAKLQlpcHVfZGlzYWJsZV9jaGFubmVsKGlkbWFjLCBpY2hhbiwKLQkJCSAgICBpY2hhbi0+c3RhdHVzID49IElQVV9DSEFOTkVMX0VOQUJMRUQpOworCQkvKiBSZXR1cm4gYWxsIGRlc2NyaXB0b3JzIGludG8gInByZXBhcmVkIiBzdGF0ZSAqLworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmaWNoYW4tPnF1ZXVlKQorCQkJbGlzdF9kZWxfaW5pdChsaXN0KTsKIAotCXRhc2tsZXRfZGlzYWJsZSgmdG9faXB1KGlkbWFjKS0+dGFza2xldCk7CisJCWljaGFuLT5zZ1swXSA9IE5VTEw7CisJCWljaGFuLT5zZ1sxXSA9IE5VTEw7CiAKLQkvKiBpY2hhbi0+cXVldWUgaXMgbW9kaWZpZWQgaW4gSVNSLCBoYXZlIHRvIHNwaW5sb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmljaGFuLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmaWNoYW4tPnF1ZXVlLCAmaWNoYW4tPmZyZWVfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwdS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGljaGFuLT5kZXNjKQotCQlmb3IgKGkgPSAwOyBpIDwgaWNoYW4tPm5fdHhfZGVzYzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgaWRtYWNfdHhfZGVzYyAqZGVzYyA9IGljaGFuLT5kZXNjICsgaTsKLQkJCWlmIChsaXN0X2VtcHR5KCZkZXNjLT5saXN0KSkKLQkJCQkvKiBEZXNjcmlwdG9yIHdhcyBwcmVwYXJlZCwgYnV0IG5vdCBzdWJtaXR0ZWQgKi8KLQkJCQlsaXN0X2FkZCgmZGVzYy0+bGlzdCwgJmljaGFuLT5mcmVlX2xpc3QpOworCQlpY2hhbi0+c3RhdHVzID0gSVBVX0NIQU5ORUxfSU5JVElBTElaRUQ7CisJCWJyZWFrOworCWNhc2UgRE1BX1RFUk1JTkFURV9BTEw6CisJCWlwdV9kaXNhYmxlX2NoYW5uZWwoaWRtYWMsIGljaGFuLAorCQkJCSAgICBpY2hhbi0+c3RhdHVzID49IElQVV9DSEFOTkVMX0VOQUJMRUQpOwogCi0JCQlhc3luY190eF9jbGVhcl9hY2soJmRlc2MtPnR4ZCk7Ci0JCX0KKwkJdGFza2xldF9kaXNhYmxlKCZpcHUtPnRhc2tsZXQpOwogCi0JaWNoYW4tPnNnWzBdID0gTlVMTDsKLQlpY2hhbi0+c2dbMV0gPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmljaGFuLT5sb2NrLCBmbGFncyk7CisJCS8qIGljaGFuLT5xdWV1ZSBpcyBtb2RpZmllZCBpbiBJU1IsIGhhdmUgdG8gc3BpbmxvY2sgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmljaGFuLT5sb2NrLCBmbGFncyk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmljaGFuLT5xdWV1ZSwgJmljaGFuLT5mcmVlX2xpc3QpOwogCi0JdGFza2xldF9lbmFibGUoJnRvX2lwdShpZG1hYyktPnRhc2tsZXQpOworCQlpZiAoaWNoYW4tPmRlc2MpCisJCQlmb3IgKGkgPSAwOyBpIDwgaWNoYW4tPm5fdHhfZGVzYzsgaSsrKSB7CisJCQkJc3RydWN0IGlkbWFjX3R4X2Rlc2MgKmRlc2MgPSBpY2hhbi0+ZGVzYyArIGk7CisJCQkJaWYgKGxpc3RfZW1wdHkoJmRlc2MtPmxpc3QpKQorCQkJCQkvKiBEZXNjcmlwdG9yIHdhcyBwcmVwYXJlZCwgYnV0IG5vdCBzdWJtaXR0ZWQgKi8KKwkJCQkJbGlzdF9hZGQoJmRlc2MtPmxpc3QsICZpY2hhbi0+ZnJlZV9saXN0KTsKIAotCWljaGFuLT5zdGF0dXMgPSBJUFVfQ0hBTk5FTF9JTklUSUFMSVpFRDsKKwkJCQlhc3luY190eF9jbGVhcl9hY2soJmRlc2MtPnR4ZCk7CisJCQl9CisKKwkJaWNoYW4tPnNnWzBdID0gTlVMTDsKKwkJaWNoYW4tPnNnWzFdID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWNoYW4tPmxvY2ssIGZsYWdzKTsKKworCQl0YXNrbGV0X2VuYWJsZSgmaXB1LT50YXNrbGV0KTsKKworCQlpY2hhbi0+c3RhdHVzID0gSVBVX0NIQU5ORUxfSU5JVElBTElaRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTY2Myw3ICsxNjg0LDYgQEAKIAkJc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gaXB1LT5jaGFubmVsICsgaTsKIAogCQlpZG1hY19jb250cm9sKCZpY2hhbi0+ZG1hX2NoYW4sIERNQV9URVJNSU5BVEVfQUxMLCAwKTsKLQkJaWRtYWNfcHJlcF9zbGF2ZV9zZygmaWNoYW4tPmRtYV9jaGFuLCBOVUxMLCAwLCBETUFfTk9ORSwgMCk7CiAJfQogCiAJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZpZG1hYy0+ZG1hKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCmluZGV4IGI5YmFlOTQuLjhiYTRlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYwpAQCAtNzQxLDcgKzc0MSw2IEBACiAJCW1jaGFuID0gJm1kbWEtPmNoYW5uZWxzW2ldOwogCiAJCW1jaGFuLT5jaGFuLmRldmljZSA9IGRtYTsKLQkJbWNoYW4tPmNoYW4uY2hhbl9pZCA9IGk7CiAJCW1jaGFuLT5jaGFuLmNvb2tpZSA9IDE7CiAJCW1jaGFuLT5jb21wbGV0ZWRfY29va2llID0gbWNoYW4tPmNoYW4uY29va2llOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9teHMtZG1hLmMgYi9kcml2ZXJzL2RtYS9teHMtZG1hLmMKaW5kZXggYmU2NDFjYi4uYjQ1ODhiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXhzLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL214cy1kbWEuYwpAQCAtMTMwLDYgKzEzMCwyMyBAQAogCXN0cnVjdCBteHNfZG1hX2NoYW4JCW14c19jaGFuc1tNWFNfRE1BX0NIQU5ORUxTXTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBteHNfZG1hX2Nsa2dhdGUoc3RydWN0IG14c19kbWFfY2hhbiAqbXhzX2NoYW4sIGludCBlbmFibGUpCit7CisJc3RydWN0IG14c19kbWFfZW5naW5lICpteHNfZG1hID0gbXhzX2NoYW4tPm14c19kbWE7CisJaW50IGNoYW5faWQgPSBteHNfY2hhbi0+Y2hhbi5jaGFuX2lkOworCWludCBzZXRfY2xyID0gZW5hYmxlID8gTVhTX0NMUl9BRERSIDogTVhTX1NFVF9BRERSOworCisJLyogZW5hYmxlIGFwYmggY2hhbm5lbCBjbG9jayAqLworCWlmIChkbWFfaXNfYXBiaCgpKSB7CisJCWlmIChhcGJoX2lzX29sZCgpKQorCQkJd3JpdGVsKDEgPDwgKGNoYW5faWQgKyBCUF9BUEJIX0NUUkwwX0NMS0dBVEVfQ0hBTk5FTCksCisJCQkJbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NUUkwwICsgc2V0X2Nscik7CisJCWVsc2UKKwkJCXdyaXRlbCgxIDw8IGNoYW5faWQsCisJCQkJbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NUUkwwICsgc2V0X2Nscik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBteHNfZG1hX3Jlc2V0X2NoYW4oc3RydWN0IG14c19kbWFfY2hhbiAqbXhzX2NoYW4pCiB7CiAJc3RydWN0IG14c19kbWFfZW5naW5lICpteHNfZG1hID0gbXhzX2NoYW4tPm14c19kbWE7CkBAIC0xNDgsMzggKzE2NSwyMSBAQAogCXN0cnVjdCBteHNfZG1hX2VuZ2luZSAqbXhzX2RtYSA9IG14c19jaGFuLT5teHNfZG1hOwogCWludCBjaGFuX2lkID0gbXhzX2NoYW4tPmNoYW4uY2hhbl9pZDsKIAorCS8qIGNsa2dhdGUgbmVlZHMgdG8gYmUgZW5hYmxlZCBiZWZvcmUgd3JpdGluZyBvdGhlciByZWdpc3RlcnMgKi8KKwlteHNfZG1hX2Nsa2dhdGUobXhzX2NoYW4sIDEpOworCiAJLyogc2V0IGNtZF9hZGRyIHVwICovCiAJd3JpdGVsKG14c19jaGFuLT5jY3dfcGh5cywKIAkJbXhzX2RtYS0+YmFzZSArIEhXX0FQQkhYX0NIbl9OWFRDTURBUihjaGFuX2lkKSk7CiAKLQkvKiBlbmFibGUgYXBiaCBjaGFubmVsIGNsb2NrICovCi0JaWYgKGRtYV9pc19hcGJoKCkpIHsKLQkJaWYgKGFwYmhfaXNfb2xkKCkpCi0JCQl3cml0ZWwoMSA8PCAoY2hhbl9pZCArIEJQX0FQQkhfQ1RSTDBfQ0xLR0FURV9DSEFOTkVMKSwKLQkJCQlteHNfZG1hLT5iYXNlICsgSFdfQVBCSFhfQ1RSTDAgKyBNWFNfQ0xSX0FERFIpOwotCQllbHNlCi0JCQl3cml0ZWwoMSA8PCBjaGFuX2lkLAotCQkJCW14c19kbWEtPmJhc2UgKyBIV19BUEJIWF9DVFJMMCArIE1YU19DTFJfQUREUik7Ci0JfQotCiAJLyogd3JpdGUgMSB0byBTRU1BIHRvIGtpY2sgb2ZmIHRoZSBjaGFubmVsICovCiAJd3JpdGVsKDEsIG14c19kbWEtPmJhc2UgKyBIV19BUEJIWF9DSG5fU0VNQShjaGFuX2lkKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG14c19kbWFfZGlzYWJsZV9jaGFuKHN0cnVjdCBteHNfZG1hX2NoYW4gKm14c19jaGFuKQogewotCXN0cnVjdCBteHNfZG1hX2VuZ2luZSAqbXhzX2RtYSA9IG14c19jaGFuLT5teHNfZG1hOwotCWludCBjaGFuX2lkID0gbXhzX2NoYW4tPmNoYW4uY2hhbl9pZDsKLQogCS8qIGRpc2FibGUgYXBiaCBjaGFubmVsIGNsb2NrICovCi0JaWYgKGRtYV9pc19hcGJoKCkpIHsKLQkJaWYgKGFwYmhfaXNfb2xkKCkpCi0JCQl3cml0ZWwoMSA8PCAoY2hhbl9pZCArIEJQX0FQQkhfQ1RSTDBfQ0xLR0FURV9DSEFOTkVMKSwKLQkJCQlteHNfZG1hLT5iYXNlICsgSFdfQVBCSFhfQ1RSTDAgKyBNWFNfU0VUX0FERFIpOwotCQllbHNlCi0JCQl3cml0ZWwoMSA8PCBjaGFuX2lkLAotCQkJCW14c19kbWEtPmJhc2UgKyBIV19BUEJIWF9DVFJMMCArIE1YU19TRVRfQUREUik7Ci0JfQorCW14c19kbWFfY2xrZ2F0ZShteHNfY2hhbiwgMCk7CiAKIAlteHNfY2hhbi0+c3RhdHVzID0gRE1BX1NVQ0NFU1M7CiB9CkBAIC0zMzgsNyArMzM4LDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfY2xrOwogCisJLyogY2xrZ2F0ZSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciByZXNldCB0byBmaW5pc2ggKi8KKwlteHNfZG1hX2Nsa2dhdGUobXhzX2NoYW4sIDEpOwogCW14c19kbWFfcmVzZXRfY2hhbihteHNfY2hhbik7CisJbXhzX2RtYV9jbGtnYXRlKG14c19jaGFuLCAwKTsKIAogCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJm14c19jaGFuLT5kZXNjLCBjaGFuKTsKIAlteHNfY2hhbi0+ZGVzYy50eF9zdWJtaXQgPSBteHNfZG1hX3R4X3N1Ym1pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3BjaF9kbWEuYyBiL2RyaXZlcnMvZG1hL3BjaF9kbWEuYwppbmRleCAxYWM4ZDRiLi5hNmQwZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvcGNoX2RtYS5jCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIERNQV9ERVNDX0ZPTExPV19XSVRIT1VUX0lSUQkweDIKICNkZWZpbmUgRE1BX0RFU0NfRk9MTE9XX1dJVEhfSVJRCTB4MwogCi0jZGVmaW5lIE1BWF9DSEFOX05SCQkJOAorI2RlZmluZSBNQVhfQ0hBTl9OUgkJCTEyCiAKICNkZWZpbmUgRE1BX01BU0tfQ1RMMF9NT0RFCTB4MzMzMzMzMzMKICNkZWZpbmUgRE1BX01BU0tfQ1RMMl9NT0RFCTB4MDAwMDMzMzMKQEAgLTg3Miw4ICs4NzIsNyBAQAogCWludCBpOwogCiAJbnJfY2hhbm5lbHMgPSBpZC0+ZHJpdmVyX2RhdGE7Ci0JcGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNoX2RtYSkrCi0JCXNpemVvZihzdHJ1Y3QgcGNoX2RtYV9jaGFuKSAqIG5yX2NoYW5uZWxzLCBHRlBfS0VSTkVMKTsKKwlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwogCWlmICghcGQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC05MjYsNyArOTI1LDYgQEAKIAl9CiAKIAlwZC0+ZG1hLmRldiA9ICZwZGV2LT5kZXY7Ci0JcGQtPmRtYS5jaGFuY250ID0gbnJfY2hhbm5lbHM7CiAKIAlJTklUX0xJU1RfSEVBRCgmcGQtPmRtYS5jaGFubmVscyk7CiAKQEAgLTkzNSw3ICs5MzMsNiBAQAogCiAJCXBkX2NoYW4tPmNoYW4uZGV2aWNlID0gJnBkLT5kbWE7CiAJCXBkX2NoYW4tPmNoYW4uY29va2llID0gMTsKLQkJcGRfY2hhbi0+Y2hhbi5jaGFuX2lkID0gaTsKIAogCQlwZF9jaGFuLT5tZW1iYXNlID0gJnJlZ3MtPmRlc2NbaV07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3BsMzMwLmMgYi9kcml2ZXJzL2RtYS9wbDMzMC5jCmluZGV4IDAwZWVlNTkuLjU3MTA0MTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9wbDMzMC5jCisrKyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwzMzAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2RlZmluZSBOUl9ERUZBVUxUX0RFU0MJMTYKIApAQCAtNjgsNiArNzAsMTQgQEAKIAkgKiBOVUxMIGlmIHRoZSBjaGFubmVsIGlzIGF2YWlsYWJsZSB0byBiZSBhY3F1aXJlZC4KIAkgKi8KIAl2b2lkICpwbDMzMF9jaGlkOworCisJLyogRm9yIEQtdG8tTSBhbmQgTS10by1EIGNoYW5uZWxzICovCisJaW50IGJ1cnN0X3N6OyAvKiB0aGUgcGVyaXBoZXJhbCBmaWZvIHdpZHRoICovCisJaW50IGJ1cnN0X2xlbjsgLyogdGhlIG51bWJlciBvZiBidXJzdCAqLworCWRtYV9hZGRyX3QgZmlmb19hZGRyOworCisJLyogZm9yIGN5Y2xpYyBjYXBhYmlsaXR5ICovCisJYm9vbCBjeWNsaWM7CiB9OwogCiBzdHJ1Y3QgZG1hX3BsMzMwX2RtYWMgewpAQCAtODMsNiArOTMsOCBAQAogCiAJLyogUGVyaXBoZXJhbCBjaGFubmVscyBjb25uZWN0ZWQgdG8gdGhpcyBETUFDICovCiAJc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwZXJpcGhlcmFsczsgLyoga2VlcCBhdCBlbmQgKi8KKworCXN0cnVjdCBjbGsgKmNsazsKIH07CiAKIHN0cnVjdCBkbWFfcGwzMzBfZGVzYyB7CkBAIC0xNTIsNiArMTY0LDMxIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRtYWMtPnBvb2xfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2N5Y2xpY19kZXNjX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgZG1hX3BsMzMwX2Rlc2MgKmRlc2M7CisJc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsIGxpc3QsIG5vZGUpIHsKKwkJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOworCisJCS8qIENoYW5nZSBzdGF0dXMgdG8gcmVsb2FkIGl0ICovCisJCWRlc2MtPnN0YXR1cyA9IFBSRVA7CisJCXBjaCA9IGRlc2MtPnBjaGFuOworCQljYWxsYmFjayA9IGRlc2MtPnR4ZC5jYWxsYmFjazsKKwkJaWYgKGNhbGxiYWNrKQorCQkJY2FsbGJhY2soZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNoLT5sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KGxpc3QsICZwY2gtPndvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX3F1ZXVlKHN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoKQogewogCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYzsKQEAgLTIwNSw3ICsyNDIsMTAgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaC0+bG9jaywgZmxhZ3MpOwogCi0JZnJlZV9kZXNjX2xpc3QoJmxpc3QpOworCWlmIChwY2gtPmN5Y2xpYykKKwkJaGFuZGxlX2N5Y2xpY19kZXNjX2xpc3QoJmxpc3QpOworCWVsc2UKKwkJZnJlZV9kZXNjX2xpc3QoJmxpc3QpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFfcGwzMzBfcnFjYih2b2lkICp0b2tlbiwgZW51bSBwbDMzMF9vcF9lcnIgZXJyKQpAQCAtMjM2LDYgKzI3Niw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaC0+bG9jaywgZmxhZ3MpOwogCiAJcGNoLT5jb21wbGV0ZWQgPSBjaGFuLT5jb29raWUgPSAxOworCXBjaC0+Y3ljbGljID0gZmFsc2U7CiAKIAlwY2gtPnBsMzMwX2NoaWQgPSBwbDMzMF9yZXF1ZXN0X2NoYW5uZWwoJnBkbWFjLT5waWYpOwogCWlmICghcGNoLT5wbDMzMF9jaGlkKSB7CkBAIC0yNTMsMjUgKzI5NCw1MiBAQAogc3RhdGljIGludCBwbDMzMF9jb250cm9sKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfY3RybF9jbWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgZG1hX3BsMzMwX2NoYW4gKnBjaCA9IHRvX3BjaGFuKGNoYW4pOwotCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZG1hX3BsMzMwX2Rlc2MgKmRlc2MsICpfZHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX3BsMzMwX2RtYWMgKnBkbWFjID0gcGNoLT5kbWFjOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpzbGF2ZV9jb25maWc7CisJTElTVF9IRUFEKGxpc3QpOwogCi0JLyogT25seSBzdXBwb3J0cyBETUFfVEVSTUlOQVRFX0FMTCAqLwotCWlmIChjbWQgIT0gRE1BX1RFUk1JTkFURV9BTEwpCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIERNQV9URVJNSU5BVEVfQUxMOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNoLT5sb2NrLCBmbGFncyk7CisKKwkJLyogRkxVU0ggdGhlIFBMMzMwIENoYW5uZWwgdGhyZWFkICovCisJCXBsMzMwX2NoYW5fY3RybChwY2gtPnBsMzMwX2NoaWQsIFBMMzMwX09QX0ZMVVNIKTsKKworCQkvKiBNYXJrIGFsbCBkZXNjIGRvbmUgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kdCwgJnBjaC0+d29ya19saXN0ICwgbm9kZSkgeworCQkJZGVzYy0+c3RhdHVzID0gRE9ORTsKKwkJCXBjaC0+Y29tcGxldGVkID0gZGVzYy0+dHhkLmNvb2tpZTsKKwkJCWxpc3RfbW92ZV90YWlsKCZkZXNjLT5ub2RlLCAmbGlzdCk7CisJCX0KKworCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJmxpc3QsICZwZG1hYy0+ZGVzY19wb29sKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0NPTkZJRzoKKwkJc2xhdmVfY29uZmlnID0gKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICopYXJnOworCisJCWlmIChzbGF2ZV9jb25maWctPmRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQlpZiAoc2xhdmVfY29uZmlnLT5kc3RfYWRkcikKKwkJCQlwY2gtPmZpZm9fYWRkciA9IHNsYXZlX2NvbmZpZy0+ZHN0X2FkZHI7CisJCQlpZiAoc2xhdmVfY29uZmlnLT5kc3RfYWRkcl93aWR0aCkKKwkJCQlwY2gtPmJ1cnN0X3N6ID0gX19mZnMoc2xhdmVfY29uZmlnLT5kc3RfYWRkcl93aWR0aCk7CisJCQlpZiAoc2xhdmVfY29uZmlnLT5kc3RfbWF4YnVyc3QpCisJCQkJcGNoLT5idXJzdF9sZW4gPSBzbGF2ZV9jb25maWctPmRzdF9tYXhidXJzdDsKKwkJfSBlbHNlIGlmIChzbGF2ZV9jb25maWctPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCWlmIChzbGF2ZV9jb25maWctPnNyY19hZGRyKQorCQkJCXBjaC0+Zmlmb19hZGRyID0gc2xhdmVfY29uZmlnLT5zcmNfYWRkcjsKKwkJCWlmIChzbGF2ZV9jb25maWctPnNyY19hZGRyX3dpZHRoKQorCQkJCXBjaC0+YnVyc3Rfc3ogPSBfX2ZmcyhzbGF2ZV9jb25maWctPnNyY19hZGRyX3dpZHRoKTsKKwkJCWlmIChzbGF2ZV9jb25maWctPnNyY19tYXhidXJzdCkKKwkJCQlwY2gtPmJ1cnN0X2xlbiA9IHNsYXZlX2NvbmZpZy0+c3JjX21heGJ1cnN0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIocGNoLT5kbWFjLT5waWYuZGV2LCAiTm90IHN1cHBvcnRlZCBjb21tYW5kLlxuIik7CiAJCXJldHVybiAtRU5YSU87Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNoLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBGTFVTSCB0aGUgUEwzMzAgQ2hhbm5lbCB0aHJlYWQgKi8KLQlwbDMzMF9jaGFuX2N0cmwocGNoLT5wbDMzMF9jaGlkLCBQTDMzMF9PUF9GTFVTSCk7Ci0KLQkvKiBNYXJrIGFsbCBkZXNjIGRvbmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZwY2gtPndvcmtfbGlzdCwgbm9kZSkKLQkJZGVzYy0+c3RhdHVzID0gRE9ORTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaC0+bG9jaywgZmxhZ3MpOwotCi0JcGwzMzBfdGFza2xldCgodW5zaWduZWQgbG9uZykgcGNoKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4OCw2ICszNTYsOSBAQAogCXBsMzMwX3JlbGVhc2VfY2hhbm5lbChwY2gtPnBsMzMwX2NoaWQpOwogCXBjaC0+cGwzMzBfY2hpZCA9IE5VTEw7CiAKKwlpZiAocGNoLT5jeWNsaWMpCisJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmcGNoLT53b3JrX2xpc3QsICZwY2gtPmRtYWMtPmRlc2NfcG9vbCk7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2gtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNDUzLDcgKzUyNCw3IEBACiAKIAlpZiAocGVyaSkgewogCQlkZXNjLT5yZXEucnF0eXBlID0gcGVyaS0+cnF0eXBlOwotCQlkZXNjLT5yZXEucGVyaSA9IHBlcmktPnBlcmlfaWQ7CisJCWRlc2MtPnJlcS5wZXJpID0gcGNoLT5jaGFuLmNoYW5faWQ7CiAJfSBlbHNlIHsKIAkJZGVzYy0+cmVxLnJxdHlwZSA9IE1FTVRPTUVNOwogCQlkZXNjLT5yZXEucGVyaSA9IDA7CkBAIC01MjQsNiArNTk1LDUxIEBACiAJcmV0dXJuIGJ1cnN0X2xlbjsKIH0KIAorc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqcGwzMzBfcHJlcF9kbWFfY3ljbGljKAorCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBsZW4sCisJCXNpemVfdCBwZXJpb2RfbGVuLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9wbDMzMF9kZXNjICpkZXNjOworCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoID0gdG9fcGNoYW4oY2hhbik7CisJZG1hX2FkZHJfdCBkc3Q7CisJZG1hX2FkZHJfdCBzcmM7CisKKwlkZXNjID0gcGwzMzBfZ2V0X2Rlc2MocGNoKTsKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2VycihwY2gtPmRtYWMtPnBpZi5kZXYsICIlczolZCBVbmFibGUgdG8gZmV0Y2ggZGVzY1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlkZXNjLT5ycWNmZy5zcmNfaW5jID0gMTsKKwkJZGVzYy0+cnFjZmcuZHN0X2luYyA9IDA7CisJCXNyYyA9IGRtYV9hZGRyOworCQlkc3QgPSBwY2gtPmZpZm9fYWRkcjsKKwkJYnJlYWs7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCWRlc2MtPnJxY2ZnLnNyY19pbmMgPSAwOworCQlkZXNjLT5ycWNmZy5kc3RfaW5jID0gMTsKKwkJc3JjID0gcGNoLT5maWZvX2FkZHI7CisJCWRzdCA9IGRtYV9hZGRyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHBjaC0+ZG1hYy0+cGlmLmRldiwgIiVzOiVkIEludmFsaWQgZG1hIGRpcmVjdGlvblxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYy0+cnFjZmcuYnJzdF9zaXplID0gcGNoLT5idXJzdF9zejsKKwlkZXNjLT5ycWNmZy5icnN0X2xlbiA9IDE7CisKKwlwY2gtPmN5Y2xpYyA9IHRydWU7CisKKwlmaWxsX3B4KCZkZXNjLT5weCwgZHN0LCBzcmMsIHBlcmlvZF9sZW4pOworCisJcmV0dXJuICZkZXNjLT50eGQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgogcGwzMzBfcHJlcF9kbWFfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkc3QsCiAJCWRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQpAQCAtNTc5LDcgKzY5NSw3IEBACiAJc3RydWN0IGRtYV9wbDMzMF9wZXJpICpwZXJpID0gY2hhbi0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIGJ1cnN0X3NpemU7CisJaW50IGk7CiAJZG1hX2FkZHJfdCBhZGRyOwogCiAJaWYgKHVubGlrZWx5KCFwY2ggfHwgIXNnbCB8fCAhc2dfbGVuIHx8ICFwZXJpKSkKQEAgLTU5NSw4ICs3MTEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlhZGRyID0gcGVyaS0+Zmlmb19hZGRyOwotCWJ1cnN0X3NpemUgPSBwZXJpLT5idXJzdF9zejsKKwlhZGRyID0gcGNoLT5maWZvX2FkZHI7CiAKIAlmaXJzdCA9IE5VTEw7CiAKQEAgLTY0NCw3ICs3NTksNyBAQAogCQkJCXNnX2RtYV9hZGRyZXNzKHNnKSwgYWRkciwgc2dfZG1hX2xlbihzZykpOwogCQl9CiAKLQkJZGVzYy0+cnFjZmcuYnJzdF9zaXplID0gYnVyc3Rfc2l6ZTsKKwkJZGVzYy0+cnFjZmcuYnJzdF9zaXplID0gcGNoLT5idXJzdF9zejsKIAkJZGVzYy0+cnFjZmcuYnJzdF9sZW4gPSAxOwogCX0KIApAQCAtNjk2LDYgKzgxMSwzMCBAQAogCQlnb3RvIHByb2JlX2VycjE7CiAJfQogCisJcGRtYWMtPmNsayA9IGNsa19nZXQoJmFkZXYtPmRldiwgImRtYSIpOworCWlmIChJU19FUlIocGRtYWMtPmNsaykpIHsKKwkJZGV2X2VycigmYWRldi0+ZGV2LCAiQ2Fubm90IGdldCBvcGVyYXRpb24gY2xvY2suXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBwcm9iZV9lcnIxOworCX0KKworCWFtYmFfc2V0X2RydmRhdGEoYWRldiwgcGRtYWMpOworCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwkvKiB0byB1c2UgdGhlIHJ1bnRpbWUgUE0gaGVscGVyIGZ1bmN0aW9ucyAqLworCXBtX3J1bnRpbWVfZW5hYmxlKCZhZGV2LT5kZXYpOworCisJLyogZW5hYmxlIHRoZSBwb3dlciBkb21haW4gKi8KKwlpZiAocG1fcnVudGltZV9nZXRfc3luYygmYWRldi0+ZGV2KSkgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJ1bnRpbWUgcG1cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHByb2JlX2VycjE7CisJfQorI2Vsc2UKKwkvKiBlbmFibGUgZG1hIGNsayAqLworCWNsa19lbmFibGUocGRtYWMtPmNsayk7CisjZW5kaWYKKwogCWlycSA9IGFkZXYtPmlycVswXTsKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHBsMzMwX2lycV9oYW5kbGVyLCAwLAogCQkJZGV2X25hbWUoJmFkZXYtPmRldiksIHBpKTsKQEAgLTczMiw2ICs4NzEsNyBAQAogCQkJY2FzZSBNRU1UT0RFVjoKIAkJCWNhc2UgREVWVE9NRU06CiAJCQkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBwZC0+Y2FwX21hc2spOworCQkJCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMsIHBkLT5jYXBfbWFzayk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWRldl9lcnIoJmFkZXYtPmRldiwgIkRFVlRPREVWIE5vdCBTdXBwb3J0ZWRcbiIpOwpAQCAtNzQ3LDExICs4ODcsOSBAQAogCQlzcGluX2xvY2tfaW5pdCgmcGNoLT5sb2NrKTsKIAkJcGNoLT5wbDMzMF9jaGlkID0gTlVMTDsKIAkJcGNoLT5jaGFuLmRldmljZSA9IHBkOwotCQlwY2gtPmNoYW4uY2hhbl9pZCA9IGk7CiAJCXBjaC0+ZG1hYyA9IHBkbWFjOwogCiAJCS8qIEFkZCB0aGUgY2hhbm5lbCB0byB0aGUgRE1BQyBsaXN0ICovCi0JCXBkLT5jaGFuY250Kys7CiAJCWxpc3RfYWRkX3RhaWwoJnBjaC0+Y2hhbi5kZXZpY2Vfbm9kZSwgJnBkLT5jaGFubmVscyk7CiAJfQogCkBAIC03NjAsNiArODk4LDcgQEAKIAlwZC0+ZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0gcGwzMzBfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CiAJcGQtPmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0gcGwzMzBfZnJlZV9jaGFuX3Jlc291cmNlczsKIAlwZC0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IHBsMzMwX3ByZXBfZG1hX21lbWNweTsKKwlwZC0+ZGV2aWNlX3ByZXBfZG1hX2N5Y2xpYyA9IHBsMzMwX3ByZXBfZG1hX2N5Y2xpYzsKIAlwZC0+ZGV2aWNlX3R4X3N0YXR1cyA9IHBsMzMwX3R4X3N0YXR1czsKIAlwZC0+ZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBwbDMzMF9wcmVwX3NsYXZlX3NnOwogCXBkLT5kZXZpY2VfY29udHJvbCA9IHBsMzMwX2NvbnRyb2w7CkBAIC03NzEsOCArOTEwLDYgQEAKIAkJZ290byBwcm9iZV9lcnI0OwogCX0KIAotCWFtYmFfc2V0X2RydmRhdGEoYWRldiwgcGRtYWMpOwotCiAJZGV2X2luZm8oJmFkZXYtPmRldiwKIAkJIkxvYWRlZCBkcml2ZXIgZm9yIFBMMzMwIERNQUMtJWRcbiIsIGFkZXYtPnBlcmlwaGlkKTsKIAlkZXZfaW5mbygmYWRldi0+ZGV2LApAQCAtODMzLDYgKzk3MCwxMyBAQAogCXJlcyA9ICZhZGV2LT5yZXM7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmYWRldi0+ZGV2KTsKKyNlbHNlCisJY2xrX2Rpc2FibGUocGRtYWMtPmNsayk7CisjZW5kaWYKKwogCWtmcmVlKHBkbWFjKTsKIAogCXJldHVybiAwOwpAQCAtODQ2LDEwICs5OTAsNDkgQEAKIAl7IDAsIDAgfSwKIH07CiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBwbDMzMF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfcGwzMzBfZG1hYyAqcGRtYWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcGRtYWMpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGRtYWNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljbGtfZGlzYWJsZShwZG1hYy0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMzMwX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG1hX3BsMzMwX2RtYWMgKnBkbWFjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXBkbWFjKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBkbWFjXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2xrX2VuYWJsZShwZG1hYy0+Y2xrKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcGwzMzBfcnVudGltZV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcGwzMzBfcnVudGltZV9yZXN1bWUJTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbDMzMF9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IHBsMzMwX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBwbDMzMF9ydW50aW1lX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwzMzBfZHJpdmVyID0gewogCS5kcnYgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSA9ICJkbWEtcGwzMzAiLAorCQkucG0gPSAmcGwzMzBfcG1fb3BzLAogCX0sCiAJLmlkX3RhYmxlID0gcGwzMzBfaWRzLAogCS5wcm9iZSA9IHBsMzMwX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc2hkbWEuYyBiL2RyaXZlcnMvZG1hL3NoZG1hLmMKaW5kZXggN2Y0OTIzNS4uODE4MDljMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2hkbWEuYworKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5jCkBAIC0yNTksMTQgKzI1OSwyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzaF9jaGFuX3hmZXJfbGRfcXVldWUoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbik7CisKIHN0YXRpYyBkbWFfY29va2llX3Qgc2hfZG1hZV90eF9zdWJtaXQoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKIHsKIAlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYyA9IHR4X3RvX3NoX2Rlc2ModHgpLCAqY2h1bmssICpsYXN0ID0gZGVzYywgKmM7CiAJc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiA9IHRvX3NoX2NoYW4odHgtPmNoYW4pOworCXN0cnVjdCBzaF9kbWFlX3NsYXZlICpwYXJhbSA9IHR4LT5jaGFuLT5wcml2YXRlOwogCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjayA9IHR4LT5jYWxsYmFjazsKIAlkbWFfY29va2llX3QgY29va2llOworCWJvb2wgcG93ZXJfdXA7CiAKLQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZzaF9jaGFuLT5sZF9xdWV1ZSkpCisJCXBvd2VyX3VwID0gdHJ1ZTsKKwllbHNlCisJCXBvd2VyX3VwID0gZmFsc2U7CiAKIAljb29raWUgPSBzaF9jaGFuLT5jb21tb24uY29va2llOwogCWNvb2tpZSsrOwpAQCAtMzAyLDcgKzMxMSwzOCBAQAogCQl0eC0+Y29va2llLCAmbGFzdC0+YXN5bmNfdHgsIHNoX2NoYW4tPmlkLAogCQlkZXNjLT5ody5zYXIsIGRlc2MtPmh3LnRjciwgZGVzYy0+aHcuZGFyKTsKIAotCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCWlmIChwb3dlcl91cCkgeworCQlzaF9jaGFuLT5wbV9zdGF0ZSA9IERNQUVfUE1fQlVTWTsKKworCQlwbV9ydW50aW1lX2dldChzaF9jaGFuLT5kZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKworCQlwbV9ydW50aW1lX2JhcnJpZXIoc2hfY2hhbi0+ZGV2KTsKKworCQlzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOworCisJCS8qIEhhdmUgd2UgYmVlbiByZXNldCwgd2hpbGUgd2FpdGluZz8gKi8KKwkJaWYgKHNoX2NoYW4tPnBtX3N0YXRlICE9IERNQUVfUE1fRVNUQUJMSVNIRUQpIHsKKwkJCWRldl9kYmcoc2hfY2hhbi0+ZGV2LCAiQnJpbmcgdXAgY2hhbm5lbCAlZFxuIiwKKwkJCQlzaF9jaGFuLT5pZCk7CisJCQlpZiAocGFyYW0pIHsKKwkJCQljb25zdCBzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZV9jb25maWcgKmNmZyA9CisJCQkJCXBhcmFtLT5jb25maWc7CisKKwkJCQlkbWFlX3NldF9kbWFycyhzaF9jaGFuLCBjZmctPm1pZF9yaWQpOworCQkJCWRtYWVfc2V0X2NoY3Ioc2hfY2hhbiwgY2ZnLT5jaGNyKTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hZV9pbml0KHNoX2NoYW4pOworCQkJfQorCisJCQlpZiAoc2hfY2hhbi0+cG1fc3RhdGUgPT0gRE1BRV9QTV9QRU5ESU5HKQorCQkJCXNoX2NoYW5feGZlcl9sZF9xdWV1ZShzaF9jaGFuKTsKKwkJCXNoX2NoYW4tPnBtX3N0YXRlID0gRE1BRV9QTV9FU1RBQkxJU0hFRDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAogCXJldHVybiBjb29raWU7CiB9CkBAIC0zNDYsOCArMzg2LDYgQEAKIAlzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZSAqcGFyYW0gPSBjaGFuLT5wcml2YXRlOwogCWludCByZXQ7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKHNoX2NoYW4tPmRldik7Ci0KIAkvKgogCSAqIFRoaXMgcmVsaWVzIG9uIHRoZSBndWFyYW50ZWUgZnJvbSBkbWFlbmdpbmUgdGhhdCBhbGxvY19jaGFuX3Jlc291cmNlcwogCSAqIG5ldmVyIHJ1bnMgY29uY3VycmVudGx5IHdpdGggaXRzZWxmIG9yIGZyZWVfY2hhbl9yZXNvdXJjZXMuCkBAIC0zNjcsMzEgKzQwNSwyMCBAQAogCQl9CiAKIAkJcGFyYW0tPmNvbmZpZyA9IGNmZzsKLQotCQlkbWFlX3NldF9kbWFycyhzaF9jaGFuLCBjZmctPm1pZF9yaWQpOwotCQlkbWFlX3NldF9jaGNyKHNoX2NoYW4sIGNmZy0+Y2hjcik7Ci0JfSBlbHNlIHsKLQkJZG1hZV9pbml0KHNoX2NoYW4pOwogCX0KIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAl3aGlsZSAoc2hfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkIDwgTlJfREVTQ1NfUEVSX0NIQU5ORUwpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAJCWRlc2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hfZGVzYyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWRlc2MpIHsKLQkJCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwkJaWYgKCFkZXNjKQogCQkJYnJlYWs7Ci0JCX0KIAkJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmZGVzYy0+YXN5bmNfdHgsCiAJCQkJCSZzaF9jaGFuLT5jb21tb24pOwogCQlkZXNjLT5hc3luY190eC50eF9zdWJtaXQgPSBzaF9kbWFlX3R4X3N1Ym1pdDsKIAkJZGVzYy0+bWFyayA9IERFU0NfSURMRTsKIAotCQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAJCWxpc3RfYWRkKCZkZXNjLT5ub2RlLCAmc2hfY2hhbi0+bGRfZnJlZSk7CiAJCXNoX2NoYW4tPmRlc2NzX2FsbG9jYXRlZCsrOwogCX0KLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAogCWlmICghc2hfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC00MDUsNyArNDMyLDcgQEAKIAkJY2xlYXJfYml0KHBhcmFtLT5zbGF2ZV9pZCwgc2hfZG1hZV9zbGF2ZV91c2VkKTsKIGV0ZXN0dXNlZDoKIGVmaW5kc2xhdmU6Ci0JcG1fcnVudGltZV9wdXQoc2hfY2hhbi0+ZGV2KTsKKwljaGFuLT5wcml2YXRlID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MTcsNyArNDQ0LDYgQEAKIAlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuID0gdG9fc2hfY2hhbihjaGFuKTsKIAlzdHJ1Y3Qgc2hfZGVzYyAqZGVzYywgKl9kZXNjOwogCUxJU1RfSEVBRChsaXN0KTsKLQlpbnQgZGVzY3MgPSBzaF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQ7CiAKIAkvKiBQcm90ZWN0IGFnYWluc3QgSVNSICovCiAJc3Bpbl9sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKQEAgLTQzNywxNSArNDYzLDEyIEBACiAJCWNoYW4tPnByaXZhdGUgPSBOVUxMOwogCX0KIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCiAJbGlzdF9zcGxpY2VfaW5pdCgmc2hfY2hhbi0+bGRfZnJlZSwgJmxpc3QpOwogCXNoX2NoYW4tPmRlc2NzX2FsbG9jYXRlZCA9IDA7CiAKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKLQotCWlmIChkZXNjcyA+IDApCi0JCXBtX3J1bnRpbWVfcHV0KHNoX2NoYW4tPmRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmbGlzdCwgbm9kZSkKIAkJa2ZyZWUoZGVzYyk7CkBAIC01MzQsNiArNTU3LDcgQEAKIAlzdHJ1Y3Qgc2hfZGVzYyAqZmlyc3QgPSBOVUxMLCAqbmV3ID0gTlVMTCAvKiBjb21waWxlci4uLiAqLzsKIAlMSVNUX0hFQUQodHhfbGlzdCk7CiAJaW50IGNodW5rcyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJaW50IGk7CiAKIAlpZiAoIXNnX2xlbikKQEAgLTU0NCw3ICs1NjgsNyBAQAogCQkJKFNIX0RNQV9UQ1JfTUFYICsgMSk7CiAKIAkvKiBIYXZlIHRvIGxvY2sgdGhlIHdob2xlIGxvb3AgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcmVsZWFzZSAqLwotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBpcnFfZmxhZ3MpOwogCiAJLyoKIAkgKiBDaGFpbmluZzoKQEAgLTU5MCw3ICs2MTQsNyBAQAogCS8qIFB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdCwgc28sIHRoZXkgZG9uJ3QgZ2V0IGxvc3QgKi8KIAlsaXN0X3NwbGljZV90YWlsKCZ0eF9saXN0LCAmc2hfY2hhbi0+bGRfZnJlZSk7CiAKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGlycV9mbGFncyk7CiAKIAlyZXR1cm4gJmZpcnN0LT5hc3luY190eDsKIApAQCAtNTk5LDcgKzYyMyw3IEBACiAJCW5ldy0+bWFyayA9IERFU0NfSURMRTsKIAlsaXN0X3NwbGljZSgmdHhfbGlzdCwgJnNoX2NoYW4tPmxkX2ZyZWUpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBpcnFfZmxhZ3MpOwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC02NjEsNiArNjg1LDcgQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4gPSB0b19zaF9jaGFuKGNoYW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBPbmx5IHN1cHBvcnRzIERNQV9URVJNSU5BVEVfQUxMICovCiAJaWYgKGNtZCAhPSBETUFfVEVSTUlOQVRFX0FMTCkKQEAgLTY2OSw3ICs2OTQsNyBAQAogCWlmICghY2hhbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNoX2NoYW4tPmRlc2NfbG9jaywgZmxhZ3MpOwogCWRtYWVfaGFsdChzaF9jaGFuKTsKIAogCWlmICghbGlzdF9lbXB0eSgmc2hfY2hhbi0+bGRfcXVldWUpKSB7CkBAIC02NzgsOSArNzAzLDggQEAKIAkJCQkJCSAgc3RydWN0IHNoX2Rlc2MsIG5vZGUpOwogCQlkZXNjLT5wYXJ0aWFsID0gKGRlc2MtPmh3LnRjciAtIHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgVENSKSkgPDwKIAkJCXNoX2NoYW4tPnhtaXRfc2hpZnQ7Ci0KIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAKIAlzaF9kbWFlX2NoYW5fbGRfY2xlYW51cChzaF9jaGFuLCB0cnVlKTsKIApAQCAtNjk1LDggKzcxOSw5IEBACiAJZG1hX2Nvb2tpZV90IGNvb2tpZSA9IDA7CiAJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrID0gTlVMTDsKIAl2b2lkICpwYXJhbSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmc2hfY2hhbi0+bGRfcXVldWUsIG5vZGUpIHsKIAkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9ICZkZXNjLT5hc3luY190eDsKIApAQCAtNzYyLDcgKzc4NywxMyBAQAogCQkgICAgIGFzeW5jX3R4X3Rlc3RfYWNrKCZkZXNjLT5hc3luY190eCkpIHx8IGFsbCkgewogCQkJLyogUmVtb3ZlIGZyb20gbGRfcXVldWUgbGlzdCAqLwogCQkJZGVzYy0+bWFyayA9IERFU0NfSURMRTsKKwogCQkJbGlzdF9tb3ZlKCZkZXNjLT5ub2RlLCAmc2hfY2hhbi0+bGRfZnJlZSk7CisKKwkJCWlmIChsaXN0X2VtcHR5KCZzaF9jaGFuLT5sZF9xdWV1ZSkpIHsKKwkJCQlkZXZfZGJnKHNoX2NoYW4tPmRldiwgIkJyaW5nIGRvd24gY2hhbm5lbCAlZFxuIiwgc2hfY2hhbi0+aWQpOworCQkJCXBtX3J1bnRpbWVfcHV0KHNoX2NoYW4tPmRldik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTc3Myw3ICs4MDQsNyBAQAogCQkgKi8KIAkJc2hfY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IHNoX2NoYW4tPmNvbW1vbi5jb29raWU7CiAKLQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9jaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAogCWlmIChjYWxsYmFjaykKIAkJY2FsbGJhY2socGFyYW0pOwpAQCAtNzkyLDE0ICs4MjMsMTQgQEAKIAkJOwogfQogCisvKiBDYWxsZWQgdW5kZXIgc3Bpbl9sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKSAqLwogc3RhdGljIHZvaWQgc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4pCiB7CiAJc3RydWN0IHNoX2Rlc2MgKmRlc2M7CiAKLQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAJLyogRE1BIHdvcmsgY2hlY2sgKi8KIAlpZiAoZG1hZV9pc19idXN5KHNoX2NoYW4pKQotCQlnb3RvIHNoX2NoYW5feGZlcl9sZF9xdWV1ZV9lbmQ7CisJCXJldHVybjsKIAogCS8qIEZpbmQgdGhlIGZpcnN0IG5vdCB0cmFuc2ZlcnJlZCBkZXNjcmlwdG9yICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXNjLCAmc2hfY2hhbi0+bGRfcXVldWUsIG5vZGUpCkBAIC04MTIsMTUgKzg0MywxOCBAQAogCQkJZG1hZV9zdGFydChzaF9jaGFuKTsKIAkJCWJyZWFrOwogCQl9Ci0KLXNoX2NoYW5feGZlcl9sZF9xdWV1ZV9lbmQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHNoX2RtYWVfbWVtY3B5X2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4gPSB0b19zaF9jaGFuKGNoYW4pOwotCXNoX2NoYW5feGZlcl9sZF9xdWV1ZShzaF9jaGFuKTsKKworCXNwaW5fbG9ja19pcnEoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJaWYgKHNoX2NoYW4tPnBtX3N0YXRlID09IERNQUVfUE1fRVNUQUJMSVNIRUQpCisJCXNoX2NoYW5feGZlcl9sZF9xdWV1ZShzaF9jaGFuKTsKKwllbHNlCisJCXNoX2NoYW4tPnBtX3N0YXRlID0gRE1BRV9QTV9QRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIH0KIAogc3RhdGljIGVudW0gZG1hX3N0YXR1cyBzaF9kbWFlX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCkBAIC04MzEsNiArODY1LDcgQEAKIAlkbWFfY29va2llX3QgbGFzdF91c2VkOwogCWRtYV9jb29raWVfdCBsYXN0X2NvbXBsZXRlOwogCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNoX2RtYWVfY2hhbl9sZF9jbGVhbnVwKHNoX2NoYW4sIGZhbHNlKTsKIApAQCAtODQxLDcgKzg3Niw3IEBACiAJQlVHX09OKGxhc3RfY29tcGxldGUgPCAwKTsKIAlkbWFfc2V0X3R4X3N0YXRlKHR4c3RhdGUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCwgMCk7CiAKLQlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNoX2NoYW4tPmRlc2NfbG9jaywgZmxhZ3MpOwogCiAJc3RhdHVzID0gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKIApAQCAtODU5LDcgKzg5NCw3IEBACiAJCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hfY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtOTEyLDYgKzk0NywxMiBAQAogCiAJCWxpc3Rfc3BsaWNlX2luaXQoJnNoX2NoYW4tPmxkX3F1ZXVlLCAmZGwpOwogCisJCWlmICghbGlzdF9lbXB0eSgmZGwpKSB7CisJCQlkZXZfZGJnKHNoX2NoYW4tPmRldiwgIkJyaW5nIGRvd24gY2hhbm5lbCAlZFxuIiwgc2hfY2hhbi0+aWQpOworCQkJcG1fcnVudGltZV9wdXQoc2hfY2hhbi0+ZGV2KTsKKwkJfQorCQlzaF9jaGFuLT5wbV9zdGF0ZSA9IERNQUVfUE1fRVNUQUJMSVNIRUQ7CisKIAkJc3Bpbl91bmxvY2soJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAKIAkJLyogQ29tcGxldGUgYWxsICAqLwpAQCAtOTUyLDcgKzk5Myw3IEBACiAJdTMyIHNhcl9idWYgPSBzaF9kbWFlX3JlYWRsKHNoX2NoYW4sIFNBUik7CiAJdTMyIGRhcl9idWYgPSBzaF9kbWFlX3JlYWRsKHNoX2NoYW4sIERBUik7CiAKLQlzcGluX2xvY2soJnNoX2NoYW4tPmRlc2NfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZzaF9jaGFuLT5sZF9xdWV1ZSwgbm9kZSkgewogCQlpZiAoZGVzYy0+bWFyayA9PSBERVNDX1NVQk1JVFRFRCAmJgogCQkgICAgKChkZXNjLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFICYmCkBAIC05NjUsMTAgKzEwMDYsMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZzaF9jaGFuLT5kZXNjX2xvY2spOwotCiAJLyogTmV4dCBkZXNjICovCiAJc2hfY2hhbl94ZmVyX2xkX3F1ZXVlKHNoX2NoYW4pOworCXNwaW5fdW5sb2NrX2lycSgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKKwogCXNoX2RtYWVfY2hhbl9sZF9jbGVhbnVwKHNoX2NoYW4sIGZhbHNlKTsKIH0KIApAQCAtMTAzNiw3ICsxMDc3LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogY29weSBzdHJ1Y3QgZG1hX2RldmljZSAqLworCW5ld19zaF9jaGFuLT5wbV9zdGF0ZSA9IERNQUVfUE1fRVNUQUJMSVNIRUQ7CisKKwkvKiByZWZlcmVuY2Ugc3RydWN0IGRtYV9kZXZpY2UgKi8KIAluZXdfc2hfY2hhbi0+Y29tbW9uLmRldmljZSA9ICZzaGRldi0+Y29tbW9uOwogCiAJbmV3X3NoX2NoYW4tPmRldiA9IHNoZGV2LT5jb21tb24uZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc2hkbWEuaCBiL2RyaXZlcnMvZG1hL3NoZG1hLmgKaW5kZXggZGM1NjU3Ni4uMmI1NWEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2hkbWEuaAorKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5oCkBAIC0yMyw2ICsyMywxMiBAQAogCiBzdHJ1Y3QgZGV2aWNlOwogCitlbnVtIGRtYWVfcG1fc3RhdGUgeworCURNQUVfUE1fRVNUQUJMSVNIRUQsCisJRE1BRV9QTV9CVVNZLAorCURNQUVfUE1fUEVORElORywKK307CisKIHN0cnVjdCBzaF9kbWFlX2NoYW4gewogCWRtYV9jb29raWVfdCBjb21wbGV0ZWRfY29va2llOwkvKiBUaGUgbWF4aW11bSBjb29raWUgY29tcGxldGVkICovCiAJc3BpbmxvY2tfdCBkZXNjX2xvY2s7CQkvKiBEZXNjcmlwdG9yIG9wZXJhdGlvbiBsb2NrICovCkBAIC0zOCw2ICs0NCw3IEBACiAJdTMyIF9faW9tZW0gKmJhc2U7CiAJY2hhciBkZXZfaWRbMTZdOwkJLyogdW5pcXVlIG5hbWUgcGVyIERNQUMgb2YgY2hhbm5lbCAqLwogCWludCBwbV9lcnJvcjsKKwllbnVtIGRtYWVfcG1fc3RhdGUgcG1fc3RhdGU7CiB9OwogCiBzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwppbmRleCA0NjdlNGRjLi4xMzI1OWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYworKysgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMgYi9kcml2ZXJzL2RtYS90aW1iX2RtYS5jCmluZGV4IGY2OWY5MGE2Li5hNGEzOThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS90aW1iX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMKQEAgLTc1Myw3ICs3NTMsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnRkLT5kbWEuY2hhbm5lbHMpOwogCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ucl9jaGFubmVsczsgaSsrLCB0ZC0+ZG1hLmNoYW5jbnQrKykgeworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnJfY2hhbm5lbHM7IGkrKykgewogCQlzdHJ1Y3QgdGltYl9kbWFfY2hhbiAqdGRfY2hhbiA9ICZ0ZC0+Y2hhbm5lbHNbaV07CiAJCXN0cnVjdCB0aW1iX2RtYV9wbGF0Zm9ybV9kYXRhX2NoYW5uZWwgKnBjaGFuID0KIAkJCXBkYXRhLT5jaGFubmVscyArIGk7CkBAIC03NjIsMTIgKzc2MiwxMSBAQAogCQlpZiAoKGkgJSAyKSA9PSBwY2hhbi0+cngpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyb25nIGNoYW5uZWwgY29uZmlndXJhdGlvblxuIik7CiAJCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfdGFza2xldF9raWxsOworCQkJZ290byBlcnJfZnJlZV9pcnE7CiAJCX0KIAogCQl0ZF9jaGFuLT5jaGFuLmRldmljZSA9ICZ0ZC0+ZG1hOwogCQl0ZF9jaGFuLT5jaGFuLmNvb2tpZSA9IDE7Ci0JCXRkX2NoYW4tPmNoYW4uY2hhbl9pZCA9IGk7CiAJCXNwaW5fbG9ja19pbml0KCZ0ZF9jaGFuLT5sb2NrKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnRkX2NoYW4tPmFjdGl2ZV9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJnRkX2NoYW4tPnF1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggYWYxYTE3ZC4uNTk0OGEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9lZGFjL0tjb25maWcKQEAgLTQxLDcgKzQxLDcgQEAKIAogY29uZmlnIEVEQUNfREVDT0RFX01DRQogCXRyaXN0YXRlICJEZWNvZGUgTUNFcyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtIChvbmx5IG9uIEFNRCBmb3Igbm93KSIKLQlkZXBlbmRzIG9uIENQVV9TVVBfQU1EICYmIFg4Nl9NQ0UKKwlkZXBlbmRzIG9uIENQVV9TVVBfQU1EICYmIFg4Nl9NQ0VfQU1ECiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGRlY29kZSBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbnMKQEAgLTcxLDkgKzcxLDYgQEAKIAkgIG9jY3VycmVkIHNvIHRoYXQgYSBwYXJ0aWN1bGFyIGZhaWxpbmcgbWVtb3J5IG1vZHVsZSBjYW4gYmUKIAkgIHJlcGxhY2VkLiAgSWYgdW5zdXJlLCBzZWxlY3QgJ1knLgogCi1jb25maWcgRURBQ19NQ0UKLQlib29sCi0KIGNvbmZpZyBFREFDX0FNRDY0CiAJdHJpc3RhdGUgIkFNRDY0IChPcHRlcm9uLCBBdGhsb242NCkgSzgsIEYxMGgiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgQU1EX05CICYmIFg4Nl82NCAmJiBFREFDX0RFQ09ERV9NQ0UKQEAgLTE3Myw4ICsxNzAsNyBAQAogCiBjb25maWcgRURBQ19JN0NPUkUKIAl0cmlzdGF0ZSAiSW50ZWwgaTcgQ29yZSAoTmVoYWxlbSkgcHJvY2Vzc29ycyIKLQlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2Ci0Jc2VsZWN0IEVEQUNfTUNFCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4NiAmJiBYODZfTUNFX0lOVEVMCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAogCSAgaTcgQ29yZSAoTmVoYWxlbSkgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlciB0aGF0IGV4aXN0cyBvbgpAQCAtMjE2LDYgKzIxMiwxNCBAQAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAogCSAgQ2xhcmtzYm9ybyBNQ0ggKEludGVsIDczMDAgY2hpcHNldCkuCiAKK2NvbmZpZyBFREFDX1NCUklER0UKKwl0cmlzdGF0ZSAiSW50ZWwgU2FuZHktQnJpZGdlIEludGVncmF0ZWQgTUMiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4Nl82NCAmJiBYODZfTUNFX0lOVEVMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCisJICBTYW5keSBCcmlkZ2UgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlci4KKwogY29uZmlnIEVEQUNfTVBDODVYWAogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDODN4eCAvIE1QQzg1eHgiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgRlNMX1NPQyAmJiAoUFBDXzgzeHggfHwgUFBDXzg1eHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggM2UyMzkxMy4uMTk2YTYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtOCw3ICs4LDYgQEAKIAogb2JqLSQoQ09ORklHX0VEQUMpCQkJOj0gZWRhY19zdHViLm8KIG9iai0kKENPTkZJR19FREFDX01NX0VEQUMpCQkrPSBlZGFjX2NvcmUubwotb2JqLSQoQ09ORklHX0VEQUNfTUNFKQkJCSs9IGVkYWNfbWNlLm8KIAogZWRhY19jb3JlLXkJOj0gZWRhY19tYy5vIGVkYWNfZGV2aWNlLm8gZWRhY19tY19zeXNmcy5vIGVkYWNfcGNpX3N5c2ZzLm8KIGVkYWNfY29yZS15CSs9IGVkYWNfbW9kdWxlLm8gZWRhY19kZXZpY2Vfc3lzZnMubwpAQCAtMjksNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0VEQUNfSTU0MDApCQkrPSBpNTQwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k3MzAwKQkJKz0gaTczMDBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JN0NPUkUpCQkrPSBpN2NvcmVfZWRhYy5vCitvYmotJChDT05GSUdfRURBQ19TQlJJREdFKQkJKz0gc2JfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FN1hYWCkJCSs9IGU3eHh4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfRTc1MlgpCQkrPSBlNzUyeF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k4MjQ0M0JYR1gpCQkrPSBpODI0NDNieGd4X2VkYWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKaW5kZXggOWE4YmViYy4uYzllZWU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCkBAIC0xMTQsMTAgKzExNCwyMiBAQAogCXJldHVybiBfX2FtZDY0X3JlYWRfcGNpX2NmZ19kd29yZChwdnQtPkYyLCBhZGRyLCB2YWwsIGZ1bmMpOwogfQogCisvKgorICogU2VsZWN0IERDVCB0byB3aGljaCBQQ0kgY2ZnIGFjY2Vzc2VzIGFyZSByb3V0ZWQKKyAqLworc3RhdGljIHZvaWQgZjE1aF9zZWxlY3RfZGN0KHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgdTggZGN0KQoreworCXUzMiByZWcgPSAwOworCisJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+RjEsIERDVF9DRkdfU0VMLCAmcmVnKTsKKwlyZWcgJj0gMHhmZmZmZmZmZTsKKwlyZWcgfD0gZGN0OworCWFtZDY0X3dyaXRlX3BjaV9jZmcocHZ0LT5GMSwgRENUX0NGR19TRUwsIHJlZyk7Cit9CisKIHN0YXRpYyBpbnQgZjE1X3JlYWRfZGN0X3BjaV9jZmcoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgYWRkciwgdTMyICp2YWwsCiAJCQkJIGNvbnN0IGNoYXIgKmZ1bmMpCiB7Ci0JdTMyIHJlZyA9IDA7CiAJdTggZGN0ICA9IDA7CiAKIAlpZiAoYWRkciA+PSAweDE0MCAmJiBhZGRyIDw9IDB4MWEwKSB7CkBAIC0xMjUsMTAgKzEzNyw3IEBACiAJCWFkZHIgLT0gMHgxMDA7CiAJfQogCi0JYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+RjEsIERDVF9DRkdfU0VMLCAmcmVnKTsKLQlyZWcgJj0gMHhmZmZmZmZmZTsKLQlyZWcgfD0gZGN0OwotCWFtZDY0X3dyaXRlX3BjaV9jZmcocHZ0LT5GMSwgRENUX0NGR19TRUwsIHJlZyk7CisJZjE1aF9zZWxlY3RfZGN0KHB2dCwgZGN0KTsKIAogCXJldHVybiBfX2FtZDY0X3JlYWRfcGNpX2NmZ19kd29yZChwdnQtPkYyLCBhZGRyLCB2YWwsIGZ1bmMpOwogfQpAQCAtMTk4LDYgKzIwNywxMCBAQAogCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYpCiAJCW1pbl9zY3J1YnJhdGUgPSAweDA7CiAKKwkvKiBGMTVoIEVycmF0dW0gIzUwNSAqLworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweDE1KQorCQlmMTVoX3NlbGVjdF9kY3QocHZ0LCAwKTsKKwogCXJldHVybiBfX2FtZDY0X3NldF9zY3J1Yl9yYXRlKHB2dC0+RjMsIGJ3LCBtaW5fc2NydWJyYXRlKTsKIH0KIApAQCAtMjA3LDYgKzIyMCwxMCBAQAogCXUzMiBzY3J1YnZhbCA9IDA7CiAJaW50IGksIHJldHZhbCA9IC1FSU5WQUw7CiAKKwkvKiBGMTVoIEVycmF0dW0gIzUwNSAqLworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweDE1KQorCQlmMTVoX3NlbGVjdF9kY3QocHZ0LCAwKTsKKwogCWFtZDY0X3JlYWRfcGNpX2NmZyhwdnQtPkYzLCBTQ1JDVFJMLCAmc2NydWJ2YWwpOwogCiAJc2NydWJ2YWwgPSBzY3J1YnZhbCAmIDB4MDAxRjsKQEAgLTc1MSwxMCArNzY4LDEwIEBACiAgKiBEZXRlcm1pbmUgaWYgdGhlIERJTU1zIGhhdmUgRUNDIGVuYWJsZWQuIEVDQyBpcyBlbmFibGVkIE9OTFkgaWYgYWxsIHRoZSBESU1NcwogICogYXJlIEVDQyBjYXBhYmxlLgogICovCi1zdGF0aWMgZW51bSBlZGFjX3R5cGUgYW1kNjRfZGV0ZXJtaW5lX2VkYWNfY2FwKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFtZDY0X2RldGVybWluZV9lZGFjX2NhcChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCiB7CiAJdTggYml0OwotCWVudW0gZGV2X3R5cGUgZWRhY19jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwl1bnNpZ25lZCBsb25nIGVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CiAKIAliaXQgPSAoYm9vdF9jcHVfZGF0YS54ODYgPiAweGYgfHwgcHZ0LT5leHRfbW9kZWwgPj0gSzhfUkVWX0YpCiAJCT8gMTkKQEAgLTE5NTMsMTEgKzE5NzAsOSBAQAogCQlhbWQ2NF9oYW5kbGVfdWUobWNpLCBtKTsKIH0KIAotdm9pZCBhbWQ2NF9kZWNvZGVfYnVzX2Vycm9yKGludCBub2RlX2lkLCBzdHJ1Y3QgbWNlICptLCB1MzIgbmJjZmcpCit2b2lkIGFtZDY0X2RlY29kZV9idXNfZXJyb3IoaW50IG5vZGVfaWQsIHN0cnVjdCBtY2UgKm0pCiB7Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gbWNpc1tub2RlX2lkXTsKLQotCV9fYW1kNjRfZGVjb2RlX2J1c19lcnJvcihtY2ksIG0pOworCV9fYW1kNjRfZGVjb2RlX2J1c19lcnJvcihtY2lzW25vZGVfaWRdLCBtKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9jcGM5MjVfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2NwYzkyNV9lZGFjLmMKaW5kZXggYTY4N2EwZC4uYTc3NGMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2NwYzkyNV9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2NwYzkyNV9lZGFjLmMKQEAgLTkwLDYgKzkwLDcgQEAKIAlFQ0NfTUFTS19FTkFCTEUgPSAoQVBJTUFTS19FQ0NfVUVfSCB8IEFQSU1BU0tfRUNDX0NFX0ggfAogCQkJICAgQVBJTUFTS19FQ0NfVUVfTCB8IEFQSU1BU0tfRUNDX0NFX0wpLAogfTsKKyNkZWZpbmUgQVBJTUFTS19BREkobikJCUNQQzkyNV9CSVQoKChuKSsxKSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJUHJvY2Vzc29yIEludGVyZmFjZSBFeGNlcHRpb24gUmVnaXN0ZXIgKEFQSUVYQ1ApCkBAIC01ODEsMTYgKzU4Miw3MyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKiogQ1BVIGVyciBkZXZpY2UqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgY3BjOTI1X2NwdV9tYXNrX2Rpc2FibGVkKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1bm9kZSA9IE5VTEw7CisJc3RhdGljIHUzMiBtYXNrID0gMDsKKworCS8qIHVzZSBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlICovCisJaWYgKG1hc2sgIT0gMCkKKwkJcmV0dXJuIG1hc2s7CisKKwltYXNrID0gQVBJTUFTS19BREkwIHwgQVBJTUFTS19BREkxOworCisJY3B1cyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCWlmIChjcHVzID09IE5VTEwpIHsKKwkJY3BjOTI1X3ByaW50ayhLRVJOX0RFQlVHLCAiTm8gL2NwdXMgbm9kZSAhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChjcHVub2RlID0gb2ZfZ2V0X25leHRfY2hpbGQoY3B1cywgY3B1bm9kZSkpICE9IE5VTEwpIHsKKwkJY29uc3QgdTMyICpyZWcgPSBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgInJlZyIsIE5VTEwpOworCisJCWlmIChzdHJjbXAoY3B1bm9kZS0+dHlwZSwgImNwdSIpKSB7CisJCQljcGM5MjVfcHJpbnRrKEtFUk5fRVJSLCAiTm90IGEgY3B1IG5vZGUgaW4gL2NwdXM6ICVzXG4iLCBjcHVub2RlLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlZyA9PSBOVUxMIHx8ICpyZWcgPiAyKSB7CisJCQljcGM5MjVfcHJpbnRrKEtFUk5fRVJSLCAiQmFkIHJlZyB2YWx1ZSBhdCAlc1xuIiwgY3B1bm9kZS0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWFzayAmPSB+QVBJTUFTS19BREkoKnJlZyk7CisJfQorCisJaWYgKG1hc2sgIT0gKEFQSU1BU0tfQURJMCB8IEFQSU1BU0tfQURJMSkpIHsKKwkJLyogV2UgYXNzdW1lIHRoYXQgZWFjaCBDUFUgc2l0cyBvbiBpdCdzIG93biBQSSBhbmQgdGhhdAorCQkgKiBmb3IgcHJlc2VudCBDUFVzIHRoZSByZWcgcHJvcGVydHkgZXF1YWxzIHRvIHRoZSBQSQorCQkgKiBpbnRlcmZhY2UgaWQgKi8KKwkJY3BjOTI1X3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkJIkFzc3VtaW5nIFBJIGlkIGlzIGVxdWFsIHRvIENQVSBNUElDIGlkIVxuIik7CisJfQorCisJb2Zfbm9kZV9wdXQoY3B1bm9kZSk7CisJb2Zfbm9kZV9wdXQoY3B1cyk7CisKKwlyZXR1cm4gbWFzazsKK30KKwogLyogRW5hYmxlIENQVSBFcnJvcnMgZGV0ZWN0aW9uICovCiBzdGF0aWMgdm9pZCBjcGM5MjVfY3B1X2luaXQoc3RydWN0IGNwYzkyNV9kZXZfaW5mbyAqZGV2X2luZm8pCiB7CiAJdTMyIGFwaW1hc2s7CisJdTMyIGNwdW1hc2s7CiAKIAlhcGltYXNrID0gX19yYXdfcmVhZGwoZGV2X2luZm8tPnZiYXNlICsgUkVHX0FQSU1BU0tfT0ZGU0VUKTsKLQlpZiAoKGFwaW1hc2sgJiBDUFVfTUFTS19FTkFCTEUpID09IDApIHsKLQkJYXBpbWFzayB8PSBDUFVfTUFTS19FTkFCTEU7Ci0JCV9fcmF3X3dyaXRlbChhcGltYXNrLCBkZXZfaW5mby0+dmJhc2UgKyBSRUdfQVBJTUFTS19PRkZTRVQpOworCisJY3B1bWFzayA9IGNwYzkyNV9jcHVfbWFza19kaXNhYmxlZCgpOworCWlmIChhcGltYXNrICYgY3B1bWFzaykgeworCQljcGM5MjVfcHJpbnRrKEtFUk5fV0FSTklORywgIkNQVShzKSBub3QgcHJlc2VudCwgIgorCQkJCSJidXQgZW5hYmxlZCBpbiBBUElNQVNLLCBkaXNhYmxpbmdcbiIpOworCQlhcGltYXNrICY9IH5jcHVtYXNrOwogCX0KKworCWlmICgoYXBpbWFzayAmIENQVV9NQVNLX0VOQUJMRSkgPT0gMCkKKwkJYXBpbWFzayB8PSBDUFVfTUFTS19FTkFCTEU7CisKKwlfX3Jhd193cml0ZWwoYXBpbWFzaywgZGV2X2luZm8tPnZiYXNlICsgUkVHX0FQSU1BU0tfT0ZGU0VUKTsKIH0KIAogLyogRGlzYWJsZSBDUFUgRXJyb3JzIGRldGVjdGlvbiAqLwpAQCAtNjIyLDYgKzY4MCw5IEBACiAJaWYgKChhcGlleGNwICYgQ1BVX0VYQ1BfREVURUNURUQpID09IDApCiAJCXJldHVybjsKIAorCWlmICgoYXBpZXhjcCAmIH5jcGM5MjVfY3B1X21hc2tfZGlzYWJsZWQoKSkgPT0gMCkKKwkJcmV0dXJuOworCiAJYXBpbWFzayA9IF9fcmF3X3JlYWRsKGRldl9pbmZvLT52YmFzZSArIFJFR19BUElNQVNLX09GRlNFVCk7CiAJY3BjOTI1X3ByaW50ayhLRVJOX0lORk8sICJQcm9jZXNzb3IgSW50ZXJmYWNlIEZhdWx0XG4iCiAJCQkJICJQcm9jZXNzb3IgSW50ZXJmYWNlIHJlZ2lzdGVyIGR1bXA6XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaCBiL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAppbmRleCA1NWI4Mjc4Li5mZTkwY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCkBAIC0zNCwxMSArMzQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CiAKLSNkZWZpbmUgRURBQ19NQ19MQUJFTF9MRU4JMzEKICNkZWZpbmUgRURBQ19ERVZJQ0VfTkFNRV9MRU4JMzEKICNkZWZpbmUgRURBQ19BVFRSSUJfVkFMVUVfTEVOCTE1Ci0jZGVmaW5lIE1DX1BST0NfTkFNRV9NQVhfTEVOCTcKIAogI2lmIFBBR0VfU0hJRlQgPCAyMAogI2RlZmluZSBQQUdFU19UT19NaUIocGFnZXMpCSgocGFnZXMpID4+ICgyMCAtIFBBR0VfU0hJRlQpKQpAQCAtMTAxLDM1MyArMTAwLDYgQEAKIAogI2RlZmluZSBlZGFjX2Rldl9uYW1lKGRldikgKGRldiktPmRldl9uYW1lCiAKLS8qIG1lbW9yeSBkZXZpY2VzICovCi1lbnVtIGRldl90eXBlIHsKLQlERVZfVU5LTk9XTiA9IDAsCi0JREVWX1gxLAotCURFVl9YMiwKLQlERVZfWDQsCi0JREVWX1g4LAotCURFVl9YMTYsCi0JREVWX1gzMiwJCS8qIERvIHRoZXNlIHBhcnRzIGV4aXN0PyAqLwotCURFVl9YNjQJCQkvKiBEbyB0aGVzZSBwYXJ0cyBleGlzdD8gKi8KLX07Ci0KLSNkZWZpbmUgREVWX0ZMQUdfVU5LTk9XTglCSVQoREVWX1VOS05PV04pCi0jZGVmaW5lIERFVl9GTEFHX1gxCQlCSVQoREVWX1gxKQotI2RlZmluZSBERVZfRkxBR19YMgkJQklUKERFVl9YMikKLSNkZWZpbmUgREVWX0ZMQUdfWDQJCUJJVChERVZfWDQpCi0jZGVmaW5lIERFVl9GTEFHX1g4CQlCSVQoREVWX1g4KQotI2RlZmluZSBERVZfRkxBR19YMTYJCUJJVChERVZfWDE2KQotI2RlZmluZSBERVZfRkxBR19YMzIJCUJJVChERVZfWDMyKQotI2RlZmluZSBERVZfRkxBR19YNjQJCUJJVChERVZfWDY0KQotCi0vKiBtZW1vcnkgdHlwZXMgKi8KLWVudW0gbWVtX3R5cGUgewotCU1FTV9FTVBUWSA9IDAsCQkvKiBFbXB0eSBjc3JvdyAqLwotCU1FTV9SRVNFUlZFRCwJCS8qIFJlc2VydmVkIGNzcm93IHR5cGUgKi8KLQlNRU1fVU5LTk9XTiwJCS8qIFVua25vd24gY3Nyb3cgdHlwZSAqLwotCU1FTV9GUE0sCQkvKiBGYXN0IHBhZ2UgbW9kZSAqLwotCU1FTV9FRE8sCQkvKiBFeHRlbmRlZCBkYXRhIG91dCAqLwotCU1FTV9CRURPLAkJLyogQnVyc3QgRXh0ZW5kZWQgZGF0YSBvdXQgKi8KLQlNRU1fU0RSLAkJLyogU2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSAqLwotCU1FTV9SRFIsCQkvKiBSZWdpc3RlcmVkIHNpbmdsZSBkYXRhIHJhdGUgU0RSQU0gKi8KLQlNRU1fRERSLAkJLyogRG91YmxlIGRhdGEgcmF0ZSBTRFJBTSAqLwotCU1FTV9SRERSLAkJLyogUmVnaXN0ZXJlZCBEb3VibGUgZGF0YSByYXRlIFNEUkFNICovCi0JTUVNX1JNQlMsCQkvKiBSYW1idXMgRFJBTSAqLwotCU1FTV9ERFIyLAkJLyogRERSMiBSQU0gKi8KLQlNRU1fRkJfRERSMiwJCS8qIGZ1bGx5IGJ1ZmZlcmVkIEREUjIgKi8KLQlNRU1fUkREUjIsCQkvKiBSZWdpc3RlcmVkIEREUjIgUkFNICovCi0JTUVNX1hEUiwJCS8qIFJhbWJ1cyBYRFIgKi8KLQlNRU1fRERSMywJCS8qIEREUjMgUkFNICovCi0JTUVNX1JERFIzLAkJLyogUmVnaXN0ZXJlZCBERFIzIFJBTSAqLwotfTsKLQotI2RlZmluZSBNRU1fRkxBR19FTVBUWQkJQklUKE1FTV9FTVBUWSkKLSNkZWZpbmUgTUVNX0ZMQUdfUkVTRVJWRUQJQklUKE1FTV9SRVNFUlZFRCkKLSNkZWZpbmUgTUVNX0ZMQUdfVU5LTk9XTglCSVQoTUVNX1VOS05PV04pCi0jZGVmaW5lIE1FTV9GTEFHX0ZQTQkJQklUKE1FTV9GUE0pCi0jZGVmaW5lIE1FTV9GTEFHX0VETwkJQklUKE1FTV9FRE8pCi0jZGVmaW5lIE1FTV9GTEFHX0JFRE8JCUJJVChNRU1fQkVETykKLSNkZWZpbmUgTUVNX0ZMQUdfU0RSCQlCSVQoTUVNX1NEUikKLSNkZWZpbmUgTUVNX0ZMQUdfUkRSCQlCSVQoTUVNX1JEUikKLSNkZWZpbmUgTUVNX0ZMQUdfRERSCQlCSVQoTUVNX0REUikKLSNkZWZpbmUgTUVNX0ZMQUdfUkREUgkJQklUKE1FTV9SRERSKQotI2RlZmluZSBNRU1fRkxBR19STUJTCQlCSVQoTUVNX1JNQlMpCi0jZGVmaW5lIE1FTV9GTEFHX0REUjIgICAgICAgICAgIEJJVChNRU1fRERSMikKLSNkZWZpbmUgTUVNX0ZMQUdfRkJfRERSMiAgICAgICAgQklUKE1FTV9GQl9ERFIyKQotI2RlZmluZSBNRU1fRkxBR19SRERSMiAgICAgICAgICBCSVQoTUVNX1JERFIyKQotI2RlZmluZSBNRU1fRkxBR19YRFIgICAgICAgICAgICBCSVQoTUVNX1hEUikKLSNkZWZpbmUgTUVNX0ZMQUdfRERSMwkJIEJJVChNRU1fRERSMykKLSNkZWZpbmUgTUVNX0ZMQUdfUkREUjMJCSBCSVQoTUVNX1JERFIzKQotCi0vKiBjaGlwc2V0IEVycm9yIERldGVjdGlvbiBhbmQgQ29ycmVjdGlvbiBjYXBhYmlsaXRpZXMgYW5kIG1vZGUgKi8KLWVudW0gZWRhY190eXBlIHsKLQlFREFDX1VOS05PV04gPSAwLAkvKiBVbmtub3duIGlmIEVDQyBpcyBhdmFpbGFibGUgKi8KLQlFREFDX05PTkUsCQkvKiBEb2Vzbid0IHN1cHBvcnQgRUNDICovCi0JRURBQ19SRVNFUlZFRCwJCS8qIFJlc2VydmVkIEVDQyB0eXBlICovCi0JRURBQ19QQVJJVFksCQkvKiBEZXRlY3RzIHBhcml0eSBlcnJvcnMgKi8KLQlFREFDX0VDLAkJLyogRXJyb3IgQ2hlY2tpbmcgLSBubyBjb3JyZWN0aW9uICovCi0JRURBQ19TRUNERUQsCQkvKiBTaW5nbGUgYml0IGVycm9yIGNvcnJlY3Rpb24sIERvdWJsZSBkZXRlY3Rpb24gKi8KLQlFREFDX1MyRUNEMkVELAkJLyogQ2hpcGtpbGwgeDIgZGV2aWNlcyAtIGRvIHRoZXNlIGV4aXN0PyAqLwotCUVEQUNfUzRFQ0Q0RUQsCQkvKiBDaGlwa2lsbCB4NCBkZXZpY2VzICovCi0JRURBQ19TOEVDRDhFRCwJCS8qIENoaXBraWxsIHg4IGRldmljZXMgKi8KLQlFREFDX1MxNkVDRDE2RUQsCS8qIENoaXBraWxsIHgxNiBkZXZpY2VzICovCi19OwotCi0jZGVmaW5lIEVEQUNfRkxBR19VTktOT1dOCUJJVChFREFDX1VOS05PV04pCi0jZGVmaW5lIEVEQUNfRkxBR19OT05FCQlCSVQoRURBQ19OT05FKQotI2RlZmluZSBFREFDX0ZMQUdfUEFSSVRZCUJJVChFREFDX1BBUklUWSkKLSNkZWZpbmUgRURBQ19GTEFHX0VDCQlCSVQoRURBQ19FQykKLSNkZWZpbmUgRURBQ19GTEFHX1NFQ0RFRAlCSVQoRURBQ19TRUNERUQpCi0jZGVmaW5lIEVEQUNfRkxBR19TMkVDRDJFRAlCSVQoRURBQ19TMkVDRDJFRCkKLSNkZWZpbmUgRURBQ19GTEFHX1M0RUNENEVECUJJVChFREFDX1M0RUNENEVEKQotI2RlZmluZSBFREFDX0ZMQUdfUzhFQ0Q4RUQJQklUKEVEQUNfUzhFQ0Q4RUQpCi0jZGVmaW5lIEVEQUNfRkxBR19TMTZFQ0QxNkVECUJJVChFREFDX1MxNkVDRDE2RUQpCi0KLS8qIHNjcnViYmluZyBjYXBhYmlsaXRpZXMgKi8KLWVudW0gc2NydWJfdHlwZSB7Ci0JU0NSVUJfVU5LTk9XTiA9IDAsCS8qIFVua25vd24gaWYgc2NydWJiZXIgaXMgYXZhaWxhYmxlICovCi0JU0NSVUJfTk9ORSwJCS8qIE5vIHNjcnViYmVyICovCi0JU0NSVUJfU1dfUFJPRywJCS8qIFNXIHByb2dyZXNzaXZlIChzZXF1ZW50aWFsKSBzY3J1YmJpbmcgKi8KLQlTQ1JVQl9TV19TUkMsCQkvKiBTb2Z0d2FyZSBzY3J1YiBvbmx5IGVycm9ycyAqLwotCVNDUlVCX1NXX1BST0dfU1JDLAkvKiBQcm9ncmVzc2l2ZSBzb2Z0d2FyZSBzY3J1YiBmcm9tIGFuIGVycm9yICovCi0JU0NSVUJfU1dfVFVOQUJMRSwJLyogU29mdHdhcmUgc2NydWIgZnJlcXVlbmN5IGlzIHR1bmFibGUgKi8KLQlTQ1JVQl9IV19QUk9HLAkJLyogSFcgcHJvZ3Jlc3NpdmUgKHNlcXVlbnRpYWwpIHNjcnViYmluZyAqLwotCVNDUlVCX0hXX1NSQywJCS8qIEhhcmR3YXJlIHNjcnViIG9ubHkgZXJyb3JzICovCi0JU0NSVUJfSFdfUFJPR19TUkMsCS8qIFByb2dyZXNzaXZlIGhhcmR3YXJlIHNjcnViIGZyb20gYW4gZXJyb3IgKi8KLQlTQ1JVQl9IV19UVU5BQkxFCS8qIEhhcmR3YXJlIHNjcnViIGZyZXF1ZW5jeSBpcyB0dW5hYmxlICovCi19OwotCi0jZGVmaW5lIFNDUlVCX0ZMQUdfU1dfUFJPRwlCSVQoU0NSVUJfU1dfUFJPRykKLSNkZWZpbmUgU0NSVUJfRkxBR19TV19TUkMJQklUKFNDUlVCX1NXX1NSQykKLSNkZWZpbmUgU0NSVUJfRkxBR19TV19QUk9HX1NSQwlCSVQoU0NSVUJfU1dfUFJPR19TUkMpCi0jZGVmaW5lIFNDUlVCX0ZMQUdfU1dfVFVOCUJJVChTQ1JVQl9TV19TQ1JVQl9UVU5BQkxFKQotI2RlZmluZSBTQ1JVQl9GTEFHX0hXX1BST0cJQklUKFNDUlVCX0hXX1BST0cpCi0jZGVmaW5lIFNDUlVCX0ZMQUdfSFdfU1JDCUJJVChTQ1JVQl9IV19TUkMpCi0jZGVmaW5lIFNDUlVCX0ZMQUdfSFdfUFJPR19TUkMJQklUKFNDUlVCX0hXX1BST0dfU1JDKQotI2RlZmluZSBTQ1JVQl9GTEFHX0hXX1RVTglCSVQoU0NSVUJfSFdfVFVOQUJMRSkKLQotLyogRklYTUUgLSBzaG91bGQgaGF2ZSBub3RpZnkgY2FwYWJpbGl0aWVzOiBOTUksIExPRywgUFJPQywgZXRjICovCi0KLS8qIEVEQUMgaW50ZXJuYWwgb3BlcmF0aW9uIHN0YXRlcyAqLwotI2RlZmluZQlPUF9BTExPQwkJMHgxMDAKLSNkZWZpbmUgT1BfUlVOTklOR19QT0xMCQkweDIwMQotI2RlZmluZSBPUF9SVU5OSU5HX0lOVEVSUlVQVAkweDIwMgotI2RlZmluZSBPUF9SVU5OSU5HX1BPTExfSU5UUgkweDIwMwotI2RlZmluZSBPUF9PRkZMSU5FCQkweDMwMAotCi0vKgotICogVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRvIGJlIGF3YXJlIG9mIHRoYXQgYXJlbid0IGF0IGFsbCBvYnZpb3VzOgotICoKLSAqCi0gKiBTT0NLRVRTLCBTT0NLRVQgU0VUUywgQkFOS1MsIFJPV1MsIENISVAtU0VMRUNUIFJPV1MsIENIQU5ORUxTLCBldGMuLgotICoKLSAqIFRoZXNlIGFyZSBzb21lIG9mIHRoZSBtYW55IHRlcm1zIHRoYXQgYXJlIHRocm93biBhYm91dCB0aGF0IGRvbid0IGFsd2F5cwotICogbWVhbiB3aGF0IHBlb3BsZSB0aGluayB0aGV5IG1lYW4gKEluY29uY2VpdmFibGUhKS4gIEluIHRoZSBpbnRlcmVzdCBvZgotICogY3JlYXRpbmcgYSBjb21tb24gZ3JvdW5kIGZvciBkaXNjdXNzaW9uLCB0ZXJtcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMKLSAqIHdpbGwgYmUgZXN0YWJsaXNoZWQuCi0gKgotICogTWVtb3J5IGRldmljZXM6CVRoZSBpbmRpdmlkdWFsIGNoaXAgb24gYSBtZW1vcnkgc3RpY2suICBUaGVzZSBkZXZpY2VzCi0gKgkJCWNvbW1vbmx5IG91dHB1dCA0IGFuZCA4IGJpdHMgZWFjaC4gIEdyb3VwaW5nIHNldmVyYWwKLSAqCQkJb2YgdGhlc2UgaW4gcGFyYWxsZWwgcHJvdmlkZXMgNjQgYml0cyB3aGljaCBpcyBjb21tb24KLSAqCQkJZm9yIGEgbWVtb3J5IHN0aWNrLgotICoKLSAqIE1lbW9yeSBTdGljazoJQSBwcmludGVkIGNpcmN1aXQgYm9hcmQgdGhhdCBhZ2dyZWdhdGVzIG11bHRpcGxlCi0gKgkJCW1lbW9yeSBkZXZpY2VzIGluIHBhcmFsbGVsLiAgVGhpcyBpcyB0aGUgYXRvbWljCi0gKgkJCW1lbW9yeSBjb21wb25lbnQgdGhhdCBpcyBwdXJjaGFzZWFibGUgYnkgSm9lIGNvbnN1bWVyCi0gKgkJCWFuZCBsb2FkZWQgaW50byBhIG1lbW9yeSBzb2NrZXQuCi0gKgotICogU29ja2V0OgkJQSBwaHlzaWNhbCBjb25uZWN0b3Igb24gdGhlIG1vdGhlcmJvYXJkIHRoYXQgYWNjZXB0cwotICoJCQlhIHNpbmdsZSBtZW1vcnkgc3RpY2suCi0gKgotICogQ2hhbm5lbDoJCVNldCBvZiBtZW1vcnkgZGV2aWNlcyBvbiBhIG1lbW9yeSBzdGljayB0aGF0IG11c3QgYmUKLSAqCQkJZ3JvdXBlZCBpbiBwYXJhbGxlbCB3aXRoIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwKLSAqCQkJY2hhbm5lbHMgZnJvbSBvdGhlciBtZW1vcnkgc3RpY2tzLiAgVGhpcyBwYXJhbGxlbAotICoJCQlncm91cGluZyBvZiB0aGUgb3V0cHV0IGZyb20gbXVsdGlwbGUgY2hhbm5lbHMgYXJlCi0gKgkJCW5lY2Vzc2FyeSBmb3IgdGhlIHNtYWxsZXN0IGdyYW51bGFyaXR5IG9mIG1lbW9yeSBhY2Nlc3MuCi0gKgkJCVNvbWUgbWVtb3J5IGNvbnRyb2xsZXJzIGFyZSBjYXBhYmxlIG9mIHNpbmdsZSBjaGFubmVsIC0KLSAqCQkJd2hpY2ggbWVhbnMgdGhhdCBtZW1vcnkgc3RpY2tzIGNhbiBiZSBsb2FkZWQKLSAqCQkJaW5kaXZpZHVhbGx5LiAgT3RoZXIgbWVtb3J5IGNvbnRyb2xsZXJzIGFyZSBvbmx5Ci0gKgkJCWNhcGFibGUgb2YgZHVhbCBjaGFubmVsIC0gd2hpY2ggbWVhbnMgdGhhdCBtZW1vcnkKLSAqCQkJc3RpY2tzIG11c3QgYmUgbG9hZGVkIGFzIHBhaXJzIChzZWUgInNvY2tldCBzZXQiKS4KLSAqCi0gKiBDaGlwLXNlbGVjdCByb3c6CUFsbCBvZiB0aGUgbWVtb3J5IGRldmljZXMgdGhhdCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIuCi0gKgkJCWZvciBhIHNpbmdsZSwgbWluaW11bSBncmFpbiBvZiBtZW1vcnkgYWNjZXNzLgotICoJCQlUaGlzIHNlbGVjdHMgYWxsIG9mIHRoZSBwYXJhbGxlbCBtZW1vcnkgZGV2aWNlcyBhY3Jvc3MKLSAqCQkJYWxsIG9mIHRoZSBwYXJhbGxlbCBjaGFubmVscy4gIENvbW1vbiBjaGlwLXNlbGVjdCByb3dzCi0gKgkJCWZvciBzaW5nbGUgY2hhbm5lbCBhcmUgNjQgYml0cywgZm9yIGR1YWwgY2hhbm5lbCAxMjgKLSAqCQkJYml0cy4KLSAqCi0gKiBTaW5nbGUtUmFua2VkIHN0aWNrOglBIFNpbmdsZS1yYW5rZWQgc3RpY2sgaGFzIDEgY2hpcC1zZWxlY3Qgcm93IG9mIG1lbW9yeS4KLSAqCQkJTW90aGVyYm9hcmRzIGNvbW1vbmx5IGRyaXZlIHR3byBjaGlwLXNlbGVjdCBwaW5zIHRvCi0gKgkJCWEgbWVtb3J5IHN0aWNrLiBBIHNpbmdsZS1yYW5rZWQgc3RpY2ssIHdpbGwgb2NjdXB5Ci0gKgkJCW9ubHkgb25lIG9mIHRob3NlIHJvd3MuIFRoZSBvdGhlciB3aWxsIGJlIHVudXNlZC4KLSAqCi0gKiBEb3VibGUtUmFua2VkIHN0aWNrOglBIGRvdWJsZS1yYW5rZWQgc3RpY2sgaGFzIHR3byBjaGlwLXNlbGVjdCByb3dzIHdoaWNoCi0gKgkJCWFjY2VzcyBkaWZmZXJlbnQgc2V0cyBvZiBtZW1vcnkgZGV2aWNlcy4gIFRoZSB0d28KLSAqCQkJcm93cyBjYW5ub3QgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5LgotICoKLSAqIERvdWJsZS1zaWRlZCBzdGljazoJREVQUkVDQVRFRCBURVJNLCBzZWUgRG91YmxlLVJhbmtlZCBzdGljay4KLSAqCQkJQSBkb3VibGUtc2lkZWQgc3RpY2sgaGFzIHR3byBjaGlwLXNlbGVjdCByb3dzIHdoaWNoCi0gKgkJCWFjY2VzcyBkaWZmZXJlbnQgc2V0cyBvZiBtZW1vcnkgZGV2aWNlcy4gIFRoZSB0d28KLSAqCQkJcm93cyBjYW5ub3QgYmUgYWNjZXNzZWQgY29uY3VycmVudGx5LiAgIkRvdWJsZS1zaWRlZCIKLSAqCQkJaXMgaXJyZXNwZWN0aXZlIG9mIHRoZSBtZW1vcnkgZGV2aWNlcyBiZWluZyBtb3VudGVkCi0gKgkJCW9uIGJvdGggc2lkZXMgb2YgdGhlIG1lbW9yeSBzdGljay4KLSAqCi0gKiBTb2NrZXQgc2V0OgkJQWxsIG9mIHRoZSBtZW1vcnkgc3RpY2tzIHRoYXQgYXJlIHJlcXVpcmVkIGZvcgotICoJCQlhIHNpbmdsZSBtZW1vcnkgYWNjZXNzIG9yIGFsbCBvZiB0aGUgbWVtb3J5IHN0aWNrcwotICoJCQlzcGFubmVkIGJ5IGEgY2hpcC1zZWxlY3Qgcm93LiAgQSBzaW5nbGUgc29ja2V0IHNldAotICoJCQloYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3MgYW5kIGlmIGRvdWJsZS1zaWRlZCBzdGlja3MKLSAqCQkJYXJlIHVzZWQgdGhlc2Ugd2lsbCBvY2N1cHkgdGhvc2UgY2hpcC1zZWxlY3Qgcm93cy4KLSAqCi0gKiBCYW5rOgkJVGhpcyB0ZXJtIGlzIGF2b2lkZWQgYmVjYXVzZSBpdCBpcyB1bmNsZWFyIHdoZW4KLSAqCQkJbmVlZGluZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNoaXAtc2VsZWN0IHJvd3MgYW5kCi0gKgkJCXNvY2tldCBzZXRzLgotICoKLSAqIENvbnRyb2xsZXIgcGFnZXM6Ci0gKgotICogUGh5c2ljYWwgcGFnZXM6Ci0gKgotICogVmlydHVhbCBwYWdlczoKLSAqCi0gKgotICogU1RSVUNUVVJFIE9SR0FOSVpBVElPTiBBTkQgQ0hPSUNFUwotICoKLSAqCi0gKgotICogUFMgLSBJIGVuam95ZWQgd3JpdGluZyBhbGwgdGhhdCBhYm91dCBhcyBtdWNoIGFzIHlvdSBlbmpveWVkIHJlYWRpbmcgaXQuCi0gKi8KLQotc3RydWN0IGNoYW5uZWxfaW5mbyB7Ci0JaW50IGNoYW5faWR4OwkJLyogY2hhbm5lbCBpbmRleCAqLwotCXUzMiBjZV9jb3VudDsJCS8qIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBDSEFOTkVMICovCi0JY2hhciBsYWJlbFtFREFDX01DX0xBQkVMX0xFTiArIDFdOwkvKiBESU1NIGxhYmVsIG9uIG1vdGhlcmJvYXJkICovCi0Jc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwkvKiB0aGUgcGFyZW50ICovCi19OwotCi1zdHJ1Y3QgY3Nyb3dfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlOwkvKiBmaXJzdCBwYWdlIG51bWJlciBpbiBkaW1tICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2U7CS8qIGxhc3QgcGFnZSBudW1iZXIgaW4gZGltbSAqLwotCXVuc2lnbmVkIGxvbmcgcGFnZV9tYXNrOwkvKiB1c2VkIGZvciBpbnRlcmxlYXZpbmcgLQotCQkJCQkgKiAwVUwgZm9yIG5vbiBpbnRsdgotCQkJCQkgKi8KLQl1MzIgbnJfcGFnZXM7CQkvKiBudW1iZXIgb2YgcGFnZXMgaW4gY3Nyb3cgKi8KLQl1MzIgZ3JhaW47CQkvKiBncmFudWxhcml0eSBvZiByZXBvcnRlZCBlcnJvciBpbiBieXRlcyAqLwotCWludCBjc3Jvd19pZHg7CQkvKiB0aGUgY2hpcC1zZWxlY3Qgcm93ICovCi0JZW51bSBkZXZfdHlwZSBkdHlwZTsJLyogbWVtb3J5IGRldmljZSB0eXBlICovCi0JdTMyIHVlX2NvdW50OwkJLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KLQl1MzIgY2VfY291bnQ7CQkvKiBDb3JyZWN0YWJsZSBFcnJvcnMgZm9yIHRoaXMgY3Nyb3cgKi8KLQllbnVtIG1lbV90eXBlIG10eXBlOwkvKiBtZW1vcnkgY3Nyb3cgdHlwZSAqLwotCWVudW0gZWRhY190eXBlIGVkYWNfbW9kZTsJLyogRURBQyBtb2RlIGZvciB0aGlzIGNzcm93ICovCi0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwkvKiB0aGUgcGFyZW50ICovCi0KLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwkvKiBzeXNmcyBrb2JqZWN0IGZvciB0aGlzIGNzcm93ICovCi0KLQkvKiBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGlzIGNzcm93ICovCi0JdTMyIG5yX2NoYW5uZWxzOwotCXN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWxzOwotfTsKLQotc3RydWN0IG1jaWRldl9zeXNmc19ncm91cCB7Ci0JY29uc3QgY2hhciAqbmFtZTsJCQkJLyogZ3JvdXAgbmFtZSAqLwotCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlICptY2lkZXZfYXR0cjsgLyogZ3JvdXAgYXR0cmlidXRlcyAqLwotfTsKLQotc3RydWN0IG1jaWRldl9zeXNmc19ncm91cF9rb2JqIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IGZvciBhbGwgaW5zdGFuY2VzIHdpdGhpbiBhIG1jICovCi0KLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwkJLyoga29iaiBmb3IgdGhlIGdyb3VwICovCi0KLQljb25zdCBzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwICpncnA7CS8qIGdyb3VwIGRlc2NyaXB0aW9uIHRhYmxlICovCi0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwkvKiB0aGUgcGFyZW50ICovCi19OwotCi0vKiBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIHN0cnVjdHVyZQotICoJdXNlZCBmb3IgZHJpdmVyIHN5c2ZzIGF0dHJpYnV0ZXMgYW5kIGluIG1lbV9jdGxfaW5mbwotICogCXN5c2ZzIHRvcCBsZXZlbCBlbnRyaWVzCi0gKi8KLXN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIHsKLQkvKiBJdCBzaG91bGQgdXNlIGVpdGhlciBhdHRyIG9yIGdycCAqLwotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQljb25zdCBzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwICpncnA7CS8qIFBvaW50cyB0byBhIGdyb3VwIG9mIGF0dHJpYnV0ZXMgKi8KLQotCS8qIE9wcyBmb3Igc2hvdy9zdG9yZSB2YWx1ZXMgYXQgdGhlIGF0dHJpYnV0ZSAtIG5vdCB1c2VkIG9uIGdyb3VwICovCi0gICAgICAgIHNzaXplX3QgKCpzaG93KShzdHJ1Y3QgbWVtX2N0bF9pbmZvICosY2hhciAqKTsKLSAgICAgICAgc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgbWVtX2N0bF9pbmZvICosIGNvbnN0IGNoYXIgKixzaXplX3QpOwotfTsKLQotLyogTUVNT1JZIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBtZW1fY3RsX2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogZm9yIGdsb2JhbCBsaXN0IG9mIG1lbV9jdGxfaW5mbyBzdHJ1Y3RzICovCi0KLQlzdHJ1Y3QgbW9kdWxlICpvd25lcjsJLyogTW9kdWxlIG93bmVyIG9mIHRoaXMgY29udHJvbCBzdHJ1Y3QgKi8KLQotCXVuc2lnbmVkIGxvbmcgbXR5cGVfY2FwOwkvKiBtZW1vcnkgdHlwZXMgc3VwcG9ydGVkIGJ5IG1jICovCi0JdW5zaWduZWQgbG9uZyBlZGFjX2N0bF9jYXA7CS8qIE1lbSBjb250cm9sbGVyIEVEQUMgY2FwYWJpbGl0aWVzICovCi0JdW5zaWduZWQgbG9uZyBlZGFjX2NhcDsJLyogY29uZmlndXJhdGlvbiBjYXBhYmlsaXRpZXMgLSB0aGlzIGlzCi0JCQkJICogY2xvc2VseSByZWxhdGVkIHRvIGVkYWNfY3RsX2NhcC4gIFRoZQotCQkJCSAqIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY29udHJvbGxlciBtYXkgYmUKLQkJCQkgKiBjYXBhYmxlIG9mIHM0ZWNkNGVkIHdoaWNoIHdvdWxkIGJlIGxpc3RlZAotCQkJCSAqIGluIGVkYWNfY3RsX2NhcCwgYnV0IGlmIGNoYW5uZWxzIGFyZW4ndAotCQkJCSAqIGNhcGFibGUgb2YgczRlY2Q0ZWQgdGhlbiB0aGUgZWRhY19jYXAgd291bGQKLQkJCQkgKiBub3QgaGF2ZSB0aGF0IGNhcGFiaWxpdHkuCi0JCQkJICovCi0JdW5zaWduZWQgbG9uZyBzY3J1Yl9jYXA7CS8qIGNoaXBzZXQgc2NydWIgY2FwYWJpbGl0aWVzICovCi0JZW51bSBzY3J1Yl90eXBlIHNjcnViX21vZGU7CS8qIGN1cnJlbnQgc2NydWIgbW9kZSAqLwotCi0JLyogVHJhbnNsYXRlcyBzZHJhbSBtZW1vcnkgc2NydWIgcmF0ZSBnaXZlbiBpbiBieXRlcy9zZWMgdG8gdGhlCi0JICAgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gYW5kIGNvbmZpZ3VyZXMgd2hhdGV2ZXIgZWxzZSBuZWVkcwotCSAgIHRvIGJlIGNvbmZpZ3VyZWQuCi0JICovCi0JaW50ICgqc2V0X3NkcmFtX3NjcnViX3JhdGUpIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpLCB1MzIgYncpOwotCi0JLyogR2V0IHRoZSBjdXJyZW50IHNkcmFtIG1lbW9yeSBzY3J1YiByYXRlIGZyb20gdGhlIGludGVybmFsCi0JICAgcmVwcmVzZW50YXRpb24gYW5kIGNvbnZlcnRzIGl0IHRvIHRoZSBjbG9zZXN0IG1hdGNoaW5nCi0JICAgYmFuZHdpZHRoIGluIGJ5dGVzL3NlYy4KLQkgKi8KLQlpbnQgKCpnZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2kpOwotCi0KLQkvKiBwb2ludGVyIHRvIGVkYWMgY2hlY2tpbmcgcm91dGluZSAqLwotCXZvaWQgKCplZGFjX2NoZWNrKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSk7Ci0KLQkvKgotCSAqIFJlbWFwcyBtZW1vcnkgcGFnZXM6IGNvbnRyb2xsZXIgcGFnZXMgdG8gcGh5c2ljYWwgcGFnZXMuCi0JICogRm9yIG1vc3QgTUMncywgdGhpcyB3aWxsIGJlIE5VTEwuCi0JICovCi0JLyogRklYTUUgLSB3aHkgbm90IHNlbmQgdGhlIHBoeXMgcGFnZSB0byBiZWdpbiB3aXRoPyAqLwotCXVuc2lnbmVkIGxvbmcgKCpjdGxfcGFnZV90b19waHlzKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBwYWdlKTsKLQlpbnQgbWNfaWR4OwotCWludCBucl9jc3Jvd3M7Ci0Jc3RydWN0IGNzcm93X2luZm8gKmNzcm93czsKLQkvKgotCSAqIEZJWE1FIC0gd2hhdCBhYm91dCBjb250cm9sbGVycyBvbiBvdGhlciBidXNzZXM/IC0gSURzIG11c3QgYmUKLQkgKiB1bmlxdWUuICBkZXYgcG9pbnRlciBzaG91bGQgYmUgc3VmZmljaWVudGx5IHVuaXF1ZSwgYnV0Ci0JICogQlVTOlNMT1QuRlVOQyBudW1iZXJzIG1heSBub3QgYmUgdW5pcXVlLgotCSAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljb25zdCBjaGFyICptb2RfbmFtZTsKLQljb25zdCBjaGFyICptb2RfdmVyOwotCWNvbnN0IGNoYXIgKmN0bF9uYW1lOwotCWNvbnN0IGNoYXIgKmRldl9uYW1lOwotCWNoYXIgcHJvY19uYW1lW01DX1BST0NfTkFNRV9NQVhfTEVOICsgMV07Ci0Jdm9pZCAqcHZ0X2luZm87Ci0JdTMyIHVlX25vaW5mb19jb3VudDsJLyogVW5jb3JyZWN0YWJsZSBFcnJvcnMgdy9vIGluZm8gKi8KLQl1MzIgY2Vfbm9pbmZvX2NvdW50OwkvKiBDb3JyZWN0YWJsZSBFcnJvcnMgdy9vIGluZm8gKi8KLQl1MzIgdWVfY291bnQ7CQkvKiBUb3RhbCBVbmNvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBNQyAqLwotCXUzMiBjZV9jb3VudDsJCS8qIFRvdGFsIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBNQyAqLwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsJLyogbWNpIGxvYWQgc3RhcnQgdGltZSAoaW4gamlmZmllcykgKi8KLQotCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOwotCi0JLyogZWRhYyBzeXNmcyBkZXZpY2UgY29udHJvbCAqLwotCXN0cnVjdCBrb2JqZWN0IGVkYWNfbWNpX2tvYmo7Ci0KLQkvKiBsaXN0IGZvciBhbGwgZ3JwIGluc3RhbmNlcyB3aXRoaW4gYSBtYyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZ3JwX2tvYmpfbGlzdDsKLQotCS8qIEFkZGl0aW9uYWwgdG9wIGNvbnRyb2xsZXIgbGV2ZWwgYXR0cmlidXRlcywgYnV0IHNwZWNpZmllZAotCSAqIGJ5IHRoZSBsb3cgbGV2ZWwgZHJpdmVyLgotCSAqCi0JICogU2V0IGJ5IHRoZSBsb3cgbGV2ZWwgZHJpdmVyIHRvIHByb3ZpZGUgYXR0cmlidXRlcyBhdCB0aGUKLQkgKiBjb250cm9sbGVyIGxldmVsLCBzYW1lIGxldmVsIGFzICd1ZV9jb3VudCcgYW5kICdjZV9jb3VudCcgYWJvdmUuCi0JICogQW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgTlVMTCB0ZXJtaW5hdGVkCi0JICoKLQkgKiBJZiBhdHRyaWJ1dGVzIGFyZSBkZXNpcmVkLCB0aGVuIHNldCB0byBhcnJheSBvZiBhdHRyaWJ1dGVzCi0JICogSWYgbm8gYXR0cmlidXRlcyBhcmUgZGVzaXJlZCwgbGVhdmUgTlVMTAotCSAqLwotCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlICptY19kcml2ZXJfc3lzZnNfYXR0cmlidXRlczsKLQotCS8qIHdvcmsgc3RydWN0IGZvciB0aGlzIE1DICovCi0Jc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwotCi0JLyogdGhlIGludGVybmFsIHN0YXRlIG9mIHRoaXMgY29udHJvbGxlciBpbnN0YW5jZSAqLwotCWludCBvcF9zdGF0ZTsKLX07Ci0KIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3RydWN0dXJlcyB0byBwcm92aWRlIGZvciBhIGdlbmVyaWMKICAqIG9yIGFic3RyYWN0ICdlZGFjX2RldmljZScuIFRoaXMgc2V0IG9mIHN0cnVjdHVyZXMgYW5kIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWNlLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjZGM1Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIFByb3ZpZGVzIGVkYWMgaW50ZXJmYWNlIHRvIG1jZWxvZyBldmVudHMKLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnk6Ci0gKgkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Ci0gKgotICogUmVkIEhhdCBJbmMuIGh0dHA6Ly93d3cucmVkaGF0LmNvbQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lZGFjX21jZS5oPgotI2luY2x1ZGUgPGFzbS9tY2UuaD4KLQotaW50IGVkYWNfbWNlX2VuYWJsZWQ7Ci1FWFBPUlRfU1lNQk9MX0dQTChlZGFjX21jZV9lbmFibGVkKTsKLQotCi0vKgotICogRXh0ZW5zaW9uIGludGVyZmFjZQotICovCi0KLXN0YXRpYyBMSVNUX0hFQUQoZWRhY19tY2VfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGVkYWNfbWNlX2xvY2spOwotCi1pbnQgZWRhY19tY2VfcmVnaXN0ZXIoc3RydWN0IGVkYWNfbWNlICplZGFjX21jZSkKLXsKLQltdXRleF9sb2NrKCZlZGFjX21jZV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZlZGFjX21jZS0+bGlzdCwgJmVkYWNfbWNlX2xpc3QpOwotCW11dGV4X3VubG9jaygmZWRhY19tY2VfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGVkYWNfbWNlX3JlZ2lzdGVyKTsKLQotdm9pZCBlZGFjX21jZV91bnJlZ2lzdGVyKHN0cnVjdCBlZGFjX21jZSAqZWRhY19tY2UpCi17Ci0JbXV0ZXhfbG9jaygmZWRhY19tY2VfbG9jayk7Ci0JbGlzdF9kZWwoJmVkYWNfbWNlLT5saXN0KTsKLQltdXRleF91bmxvY2soJmVkYWNfbWNlX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTChlZGFjX21jZV91bnJlZ2lzdGVyKTsKLQotaW50IGVkYWNfbWNlX3BhcnNlKHN0cnVjdCBtY2UgKm1jZSkKLXsKLQlzdHJ1Y3QgZWRhY19tY2UgKmVkYWNfbWNlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlZGFjX21jZSwgJmVkYWNfbWNlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGVkYWNfbWNlLT5jaGVja19lcnJvcihlZGFjX21jZS0+cHJpdiwgbWNlKSkKLQkJCXJldHVybiAxOwotCX0KLQotCS8qIE5vYm9keSBxdWV1ZWQgdGhlIGVycm9yICovCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChlZGFjX21jZV9wYXJzZSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIChodHRwOi8vd3d3LnJlZGhhdC5jb20pIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkVEQUMgRHJpdmVyIGZvciBtY2Vsb2cgY2FwdHVyZWQgZXJyb3JzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTczMDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k3MzAwX2VkYWMuYwppbmRleCBhNzZmZTgzLi42MTA0ZGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTczMDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pNzMwMF9lZGFjLmMKQEAgLTM3Miw3ICszNzIsNyBAQAogc3RhdGljIHZvaWQgaTczMDBfcHJvY2Vzc19lcnJvcl9nbG9iYWwoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQogewogCXN0cnVjdCBpNzMwMF9wdnQgKnB2dDsKLQl1MzIgZXJybnVtLCB2YWx1ZTsKKwl1MzIgZXJybnVtLCBlcnJvcl9yZWc7CiAJdW5zaWduZWQgbG9uZyBlcnJvcnM7CiAJY29uc3QgY2hhciAqc3BlY2lmaWM7CiAJYm9vbCBpc19mYXRhbDsKQEAgLTM4MSw5ICszODEsOSBAQAogCiAJLyogcmVhZCBpbiB0aGUgMXN0IEZBVEFMIGVycm9yIHJlZ2lzdGVyICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8yX2ZzYl9lcnJfcmVncywKLQkJCSAgICAgIEZFUlJfR0xPQkFMX0hJLCAmdmFsdWUpOwotCWlmICh1bmxpa2VseSh2YWx1ZSkpIHsKLQkJZXJyb3JzID0gdmFsdWU7CisJCQkgICAgICBGRVJSX0dMT0JBTF9ISSwgJmVycm9yX3JlZyk7CisJaWYgKHVubGlrZWx5KGVycm9yX3JlZykpIHsKKwkJZXJyb3JzID0gZXJyb3JfcmVnOwogCQllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmZXJyb3JzLAogCQkJCQlBUlJBWV9TSVpFKGZlcnJfZ2xvYmFsX2hpX25hbWUpKTsKIAkJc3BlY2lmaWMgPSBHRVRfRVJSX0ZST01fVEFCTEUoZmVycl9nbG9iYWxfaGlfbmFtZSwgZXJybnVtKTsKQEAgLTM5MSwxNSArMzkxLDE1IEBACiAKIAkJLyogQ2xlYXIgdGhlIGVycm9yIGJpdCAqLwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8yX2ZzYl9lcnJfcmVncywKLQkJCQkgICAgICAgRkVSUl9HTE9CQUxfSEksIHZhbHVlKTsKKwkJCQkgICAgICAgRkVSUl9HTE9CQUxfSEksIGVycm9yX3JlZyk7CiAKIAkJZ290byBlcnJvcl9nbG9iYWw7CiAJfQogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8yX2ZzYl9lcnJfcmVncywKLQkJCSAgICAgIEZFUlJfR0xPQkFMX0xPLCAmdmFsdWUpOwotCWlmICh1bmxpa2VseSh2YWx1ZSkpIHsKLQkJZXJyb3JzID0gdmFsdWU7CisJCQkgICAgICBGRVJSX0dMT0JBTF9MTywgJmVycm9yX3JlZyk7CisJaWYgKHVubGlrZWx5KGVycm9yX3JlZykpIHsKKwkJZXJyb3JzID0gZXJyb3JfcmVnOwogCQllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmZXJyb3JzLAogCQkJCQlBUlJBWV9TSVpFKGZlcnJfZ2xvYmFsX2xvX25hbWUpKTsKIAkJc3BlY2lmaWMgPSBHRVRfRVJSX0ZST01fVEFCTEUoZmVycl9nbG9iYWxfbG9fbmFtZSwgZXJybnVtKTsKQEAgLTQwNyw3ICs0MDcsNyBAQAogCiAJCS8qIENsZWFyIHRoZSBlcnJvciBiaXQgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMl9mc2JfZXJyX3JlZ3MsCi0JCQkJICAgICAgIEZFUlJfR0xPQkFMX0xPLCB2YWx1ZSk7CisJCQkJICAgICAgIEZFUlJfR0xPQkFMX0xPLCBlcnJvcl9yZWcpOwogCiAJCWdvdG8gZXJyb3JfZ2xvYmFsOwogCX0KQEAgLTQyNyw3ICs0MjcsNyBAQAogc3RhdGljIHZvaWQgaTczMDBfcHJvY2Vzc19mYmRfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQogewogCXN0cnVjdCBpNzMwMF9wdnQgKnB2dDsKLQl1MzIgZXJybnVtLCB2YWx1ZTsKKwl1MzIgZXJybnVtLCB2YWx1ZSwgZXJyb3JfcmVnOwogCXUxNiB2YWwxNjsKIAl1bnNpZ25lZCBicmFuY2gsIGNoYW5uZWwsIGJhbmssIHJhbmssIGNhcywgcmFzOwogCXUzMiBzeW5kcm9tZTsKQEAgLTQ0MCwxNCArNDQwLDE0IEBACiAKIAkvKiByZWFkIGluIHRoZSAxc3QgRkFUQUwgZXJyb3IgcmVnaXN0ZXIgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAotCQkJICAgICAgRkVSUl9GQVRfRkJELCAmdmFsdWUpOwotCWlmICh1bmxpa2VseSh2YWx1ZSAmIEZFUlJfRkFUX0ZCRF9FUlJfTUFTSykpIHsKLQkJZXJyb3JzID0gdmFsdWUgJiBGRVJSX0ZBVF9GQkRfRVJSX01BU0sgOworCQkJICAgICAgRkVSUl9GQVRfRkJELCAmZXJyb3JfcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyb3JfcmVnICYgRkVSUl9GQVRfRkJEX0VSUl9NQVNLKSkgeworCQllcnJvcnMgPSBlcnJvcl9yZWcgJiBGRVJSX0ZBVF9GQkRfRVJSX01BU0sgOwogCQllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmZXJyb3JzLAogCQkJCQlBUlJBWV9TSVpFKGZlcnJfZmF0X2ZiZF9uYW1lKSk7CiAJCXNwZWNpZmljID0gR0VUX0VSUl9GUk9NX1RBQkxFKGZlcnJfZmF0X2ZiZF9uYW1lLCBlcnJudW0pOworCQlicmFuY2ggPSAoR0VUX0ZCRF9GQVRfSURYKGVycm9yX3JlZykgPT0gMikgPyAxIDogMDsKIAotCQlicmFuY2ggPSAoR0VUX0ZCRF9GQVRfSURYKHZhbHVlKSA9PSAyKSA/IDEgOiAwOwogCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCiAJCQkJICAgICBOUkVDTUVNQSwgJnZhbDE2KTsKIAkJYmFuayA9IE5SRUNNRU1BX0JBTksodmFsMTYpOwpAQCAtNDU1LDExICs0NTUsMTQgQEAKIAogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAogCQkJCU5SRUNNRU1CLCAmdmFsdWUpOwotCiAJCWlzX3dyID0gTlJFQ01FTUJfSVNfV1IodmFsdWUpOwogCQljYXMgPSBOUkVDTUVNQl9DQVModmFsdWUpOwogCQlyYXMgPSBOUkVDTUVNQl9SQVModmFsdWUpOwogCisJCS8qIENsZWFuIHRoZSBlcnJvciByZWdpc3RlciAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKKwkJCQlGRVJSX0ZBVF9GQkQsIGVycm9yX3JlZyk7CisKIAkJc25wcmludGYocHZ0LT50bXBfcHJ0X2J1ZmZlciwgUEFHRV9TSVpFLAogCQkJIkZBVEFMIChCcmFuY2g9JWQgRFJBTS1CYW5rPSVkICVzICIKIAkJCSJSQVM9JWQgQ0FTPSVkIEVycj0weCVseCAoJXMpKSIsCkBAIC00NzYsMjEgKzQ3OSwxNyBAQAogCiAJLyogcmVhZCBpbiB0aGUgMXN0IE5PTi1GQVRBTCBlcnJvciByZWdpc3RlciAqLwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCi0JCQkgICAgICBGRVJSX05GX0ZCRCwgJnZhbHVlKTsKLQlpZiAodW5saWtlbHkodmFsdWUgJiBGRVJSX05GX0ZCRF9FUlJfTUFTSykpIHsKLQkJZXJyb3JzID0gdmFsdWUgJiBGRVJSX05GX0ZCRF9FUlJfTUFTSzsKKwkJCSAgICAgIEZFUlJfTkZfRkJELCAmZXJyb3JfcmVnKTsKKwlpZiAodW5saWtlbHkoZXJyb3JfcmVnICYgRkVSUl9ORl9GQkRfRVJSX01BU0spKSB7CisJCWVycm9ycyA9IGVycm9yX3JlZyAmIEZFUlJfTkZfRkJEX0VSUl9NQVNLOwogCQllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmZXJyb3JzLAogCQkJCQlBUlJBWV9TSVpFKGZlcnJfbmZfZmJkX25hbWUpKTsKIAkJc3BlY2lmaWMgPSBHRVRfRVJSX0ZST01fVEFCTEUoZmVycl9uZl9mYmRfbmFtZSwgZXJybnVtKTsKLQotCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0ICovCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzJfZnNiX2Vycl9yZWdzLAotCQkJCSAgICAgICBGRVJSX0dMT0JBTF9MTywgdmFsdWUpOworCQlicmFuY2ggPSAoR0VUX0ZCRF9GQVRfSURYKGVycm9yX3JlZykgPT0gMikgPyAxIDogMDsKIAogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAogCQkJUkVETUVNQSwgJnN5bmRyb21lKTsKIAotCQlicmFuY2ggPSAoR0VUX0ZCRF9GQVRfSURYKHZhbHVlKSA9PSAyKSA/IDEgOiAwOwogCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCiAJCQkJICAgICBSRUNNRU1BLCAmdmFsMTYpOwogCQliYW5rID0gUkVDTUVNQV9CQU5LKHZhbDE2KTsKQEAgLTQ5OCwxOCArNDk3LDIwIEBACiAKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2Rldl8xNl8xX2ZzYl9hZGRyX21hcCwKIAkJCQlSRUNNRU1CLCAmdmFsdWUpOwotCiAJCWlzX3dyID0gUkVDTUVNQl9JU19XUih2YWx1ZSk7CiAJCWNhcyA9IFJFQ01FTUJfQ0FTKHZhbHVlKTsKIAkJcmFzID0gUkVDTUVNQl9SQVModmFsdWUpOwogCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9kZXZfMTZfMV9mc2JfYWRkcl9tYXAsCiAJCQkJICAgICBSRURNRU1CLCAmdmFsdWUpOwotCiAJCWNoYW5uZWwgPSAoYnJhbmNoIDw8IDEpOwogCQlpZiAoSVNfU0VDT05EX0NIKHZhbHVlKSkKIAkJCWNoYW5uZWwrKzsKIAorCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0ICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5wY2lfZGV2XzE2XzFfZnNiX2FkZHJfbWFwLAorCQkJCUZFUlJfTkZfRkJELCBlcnJvcl9yZWcpOworCiAJCS8qIEZvcm0gb3V0IG1lc3NhZ2UgKi8KIAkJc25wcmludGYocHZ0LT50bXBfcHJ0X2J1ZmZlciwgUEFHRV9TSVpFLAogCQkJIkNvcnJlY3RlZCBlcnJvciAoQnJhbmNoPSVkLCBDaGFubmVsICVkKSwgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYwppbmRleCBmNmNmNDQ4Li43MGFkODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYwpAQCAtMzEsMTEgKzMxLDEzIEBACiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9lZGFjX21jZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9tY2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICJlZGFjX2NvcmUuaCIKIApAQCAtNzgsNiArODAsOCBAQAogCS8qIE9GRlNFVFMgZm9yIERldmljZSAwIEZ1bmN0aW9uIDAgKi8KIAogI2RlZmluZSBNQ19DRkdfQ09OVFJPTAkweDkwCisgICNkZWZpbmUgTUNfQ0ZHX1VOTE9DSwkJMHgwMgorICAjZGVmaW5lIE1DX0NGR19MT0NLCQkweDAwCiAKIAkvKiBPRkZTRVRTIGZvciBEZXZpY2UgMyBGdW5jdGlvbiAwICovCiAKQEAgLTk4LDYgKzEwMiwxNSBAQAogICAjZGVmaW5lIERJTU0wX0NPUl9FUlIocikJCQkoKHIpICYgMHg3ZmZmKQogCiAvKiBPRkZTRVRTIGZvciBEZXZpY2UgMyBGdW5jdGlvbiAyLCBhcyBpbmljYXRlZCBvbiBYZW9uIDU1MDAgZGF0YXNoZWV0ICovCisjZGVmaW5lIE1DX1NTUkNPTlRST0wJCTB4NDgKKyAgI2RlZmluZSBTU1JfTU9ERV9ESVNBQkxFCTB4MDAKKyAgI2RlZmluZSBTU1JfTU9ERV9FTkFCTEUJMHgwMQorICAjZGVmaW5lIFNTUl9NT0RFX01BU0sJCTB4MDMKKworI2RlZmluZSBNQ19TQ1JVQl9DT05UUk9MCTB4NGMKKyAgI2RlZmluZSBTVEFSVFNDUlVCCQkoMSA8PCAyNCkKKyAgI2RlZmluZSBTQ1JVQklOVEVSVkFMX01BU0sgICAgMHhmZmZmZmYKKwogI2RlZmluZSBNQ19DT1JfRUNDX0NOVF8wCTB4ODAKICNkZWZpbmUgTUNfQ09SX0VDQ19DTlRfMQkweDg0CiAjZGVmaW5lIE1DX0NPUl9FQ0NfQ05UXzIJMHg4OApAQCAtMjUzLDEwICsyNjYsNyBAQAogCXVuc2lnbmVkIGxvbmcJcmRpbW1fY2VfY291bnRbTlVNX0NIQU5TXVtNQVhfRElNTVNdOwogCWludAkJcmRpbW1fbGFzdF9jZV9jb3VudFtOVU1fQ0hBTlNdW01BWF9ESU1NU107CiAKLQl1bnNpZ25lZCBpbnQJaXNfcmVnaXN0ZXJlZDsKLQotCS8qIG1jZWxvZyBnbHVlICovCi0Jc3RydWN0IGVkYWNfbWNlCQllZGFjX21jZTsKKwlib29sCQlpc19yZWdpc3RlcmVkLCBlbmFibGVfc2NydWI7CiAKIAkvKiBGaWZvIGRvdWJsZSBidWZmZXJzICovCiAJc3RydWN0IG1jZQkJbWNlX2VudHJ5W01DRV9MT0dfTEVOXTsKQEAgLTI2OCw2ICsyNzgsOSBAQAogCS8qIENvdW50IGluZGljYXRvciB0byBzaG93IGVycm9ycyBub3QgZ290ICovCiAJdW5zaWduZWQJCW1jZV9vdmVycnVuOwogCisJLyogRENMSyBGcmVxdWVuY3kgdXNlZCBmb3IgY29tcHV0aW5nIHNjcnViIHJhdGUgKi8KKwlpbnQJCQlkY2xrX2ZyZXE7CisKIAkvKiBTdHJ1Y3QgdG8gY29udHJvbCBFREFDIHBvbGxpbmcgKi8KIAlzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKmk3Y29yZV9wY2k7CiB9OwpAQCAtMjgxLDggKzI5NCw3IEBACiAJCS8qIE1lbW9yeSBjb250cm9sbGVyICovCiAJeyBQQ0lfREVTQ1IoMywgMCwgUENJX0RFVklDRV9JRF9JTlRFTF9JN19NQ1IpICAgICB9LAogCXsgUENJX0RFU0NSKDMsIDEsIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTUNfVEFEKSAgfSwKLQotCQkvKiBFeGlzdHMgb25seSBmb3IgUkRJTU0gKi8KKwkJCS8qIEV4aXN0cyBvbmx5IGZvciBSRElNTSAqLwogCXsgUENJX0RFU0NSKDMsIDIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTUNfUkFTKSwgLm9wdGlvbmFsID0gMSAgfSwKIAl7IFBDSV9ERVNDUigzLCA0LCBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X01DX1RFU1QpIH0sCiAKQEAgLTMwMyw2ICszMTUsMTYgQEAKIAl7IFBDSV9ERVNDUig2LCAxLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X01DX0NIMl9BRERSKSB9LAogCXsgUENJX0RFU0NSKDYsIDIsIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTUNfQ0gyX1JBTkspIH0sCiAJeyBQQ0lfREVTQ1IoNiwgMywgUENJX0RFVklDRV9JRF9JTlRFTF9JN19NQ19DSDJfVEMpICAgfSwKKworCQkvKiBHZW5lcmljIE5vbi1jb3JlIHJlZ2lzdGVycyAqLworCS8qCisJICogVGhpcyBpcyB0aGUgUENJIGRldmljZSBvbiBpN2NvcmUgYW5kIG9uIFhlb24gMzV4eCAoODA4NjoyYzQxKQorCSAqIE9uIFhlb24gNTV4eCwgaG93ZXZlciwgaXQgaGFzIGEgZGlmZmVyZW50IGlkICg4MDg2OjJjNDApLiBTbywKKwkgKiB0aGUgcHJvYmluZyBjb2RlIG5lZWRzIHRvIHRlc3QgZm9yIHRoZSBvdGhlciBhZGRyZXNzIGluIGNhc2Ugb2YKKwkgKiBmYWlsdXJlIG9mIHRoaXMgb25lCisJICovCisJeyBQQ0lfREVTQ1IoMCwgMCwgUENJX0RFVklDRV9JRF9JTlRFTF9JN19OT05DT1JFKSAgfSwKKwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfaWRfZGVzY3IgcGNpX2Rldl9kZXNjcl9seW5uZmllbGRbXSA9IHsKQEAgLTMxOSw2ICszNDEsMTIgQEAKIAl7IFBDSV9ERVNDUiggNSwgMSwgUENJX0RFVklDRV9JRF9JTlRFTF9MWU5ORklFTERfTUNfQ0gxX0FERFIpIH0sCiAJeyBQQ0lfREVTQ1IoIDUsIDIsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX01DX0NIMV9SQU5LKSB9LAogCXsgUENJX0RFU0NSKCA1LCAzLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9NQ19DSDFfVEMpICAgfSwKKworCS8qCisJICogVGhpcyBpcyB0aGUgUENJIGRldmljZSBoYXMgYW4gYWx0ZXJuYXRlIGFkZHJlc3Mgb24gc29tZQorCSAqIHByb2Nlc3NvcnMgbGlrZSBDb3JlIGk3IDg2MAorCSAqLworCXsgUENJX0RFU0NSKCAwLCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFKSAgICAgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2lkX2Rlc2NyIHBjaV9kZXZfZGVzY3JfaTdjb3JlX3dlc3RtZXJlW10gPSB7CkBAIC0zNDYsNiArMzc0LDEwIEBACiAJeyBQQ0lfREVTQ1IoNiwgMSwgUENJX0RFVklDRV9JRF9JTlRFTF9MWU5ORklFTERfTUNfQ0gyX0FERFJfUkVWMikgfSwKIAl7IFBDSV9ERVNDUig2LCAyLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9NQ19DSDJfUkFOS19SRVYyKSB9LAogCXsgUENJX0RFU0NSKDYsIDMsIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX01DX0NIMl9UQ19SRVYyKSAgIH0sCisKKwkJLyogR2VuZXJpYyBOb24tY29yZSByZWdpc3RlcnMgKi8KKwl7IFBDSV9ERVNDUigwLCAwLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFX1JFVjIpICB9LAorCiB9OwogCiAjZGVmaW5lIFBDSV9JRF9UQUJMRV9FTlRSWShBKSB7IC5kZXNjcj1BLCAubl9kZXZzID0gQVJSQVlfU0laRShBKSB9CkBAIC03MTQsNiArNzQ2LDEwIEBACiAKIAkJCWNzci0+ZWRhY19tb2RlID0gbW9kZTsKIAkJCWNzci0+bXR5cGUgPSBtdHlwZTsKKwkJCXNucHJpbnRmKGNzci0+Y2hhbm5lbHNbMF0ubGFiZWwsCisJCQkJCXNpemVvZihjc3ItPmNoYW5uZWxzWzBdLmxhYmVsKSwKKwkJCQkJIkNQVSMldUNoYW5uZWwjJXVfRElNTSMldSIsCisJCQkJCXB2dC0+aTdjb3JlX2Rldi0+c29ja2V0LCBpLCBqKTsKIAogCQkJY3Nyb3crKzsKIAkJfQpAQCAtNzMxLDcgKzc2Nyw3IEBACiAJCQlkZWJ1Z2YxKCJcdFx0JSN4XHQlI3hcdCUjeFxuIiwKIAkJCQkodmFsdWVbal0gPj4gMjcpICYgMHgxLAogCQkJCSh2YWx1ZVtqXSA+PiAyNCkgJiAweDcsCi0JCQkJKHZhbHVlW2pdICYmICgoMSA8PCAyNCkgLSAxKSkpOworCQkJCSh2YWx1ZVtqXSAmICgoMSA8PCAyNCkgLSAxKSkpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTMyNCw2ICsxMzYwLDIwIEBACiAJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkgICAgICBkZXZfZGVzY3ItPmRldl9pZCwgKnByZXYpOwogCisJLyoKKwkgKiBPbiBYZW9uIDU1eHgsIHRoZSBJbnRlbCBRdWNrcGF0aCBBcmNoIEdlbmVyaWMgTm9uLWNvcmUgcmVncworCSAqIGlzIGF0IGFkZHIgODA4NjoyYzQwLCBpbnN0ZWFkIG9mIDgwODY6MmM0MS4gU28sIHdlIG5lZWQKKwkgKiB0byBwcm9iZSBmb3IgdGhlIGFsdGVybmF0ZSBhZGRyZXNzIGluIGNhc2Ugb2YgZmFpbHVyZQorCSAqLworCWlmIChkZXZfZGVzY3ItPmRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0k3X05PTkNPUkUgJiYgIXBkZXYpCisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTk9OQ09SRV9BTFQsICpwcmV2KTsKKworCWlmIChkZXZfZGVzY3ItPmRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFICYmICFwZGV2KQorCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFX0FMVCwKKwkJCQkgICAgICAqcHJldik7CisKIAlpZiAoIXBkZXYpIHsKIAkJaWYgKCpwcmV2KSB7CiAJCQkqcHJldiA9IHBkZXY7CkBAIC0xNDQ0LDggKzE0OTQsMTAgQEAKIAlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlpbnQgaSwgZnVuYywgc2xvdDsKKwljaGFyICpmYW1pbHk7CiAKLQlwdnQtPmlzX3JlZ2lzdGVyZWQgPSAwOworCXB2dC0+aXNfcmVnaXN0ZXJlZCA9IGZhbHNlOworCXB2dC0+ZW5hYmxlX3NjcnViICA9IGZhbHNlOwogCWZvciAoaSA9IDA7IGkgPCBpN2NvcmVfZGV2LT5uX2RldnM7IGkrKykgewogCQlwZGV2ID0gaTdjb3JlX2Rldi0+cGRldltpXTsKIAkJaWYgKCFwZGV2KQpAQCAtMTQ2MSw5ICsxNTEzLDM3IEBACiAJCQlpZiAodW5saWtlbHkoZnVuYyA+IE1BWF9DSEFOX0ZVTkMpKQogCQkJCWdvdG8gZXJyb3I7CiAJCQlwdnQtPnBjaV9jaFtzbG90IC0gNF1bZnVuY10gPSBwZGV2OwotCQl9IGVsc2UgaWYgKCFzbG90ICYmICFmdW5jKQorCQl9IGVsc2UgaWYgKCFzbG90ICYmICFmdW5jKSB7CiAJCQlwdnQtPnBjaV9ub25jb3JlID0gcGRldjsKLQkJZWxzZQorCisJCQkvKiBEZXRlY3QgdGhlIHByb2Nlc3NvciBmYW1pbHkgKi8KKwkJCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTk9OQ09SRToKKwkJCQlmYW1pbHkgPSAiWGVvbiAzNXh4LyBpN2NvcmUiOworCQkJCXB2dC0+ZW5hYmxlX3NjcnViID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTFlOTkZJRUxEX05PTkNPUkVfQUxUOgorCQkJCWZhbWlseSA9ICJpNy04MDAvaTUtNzAwIjsKKwkJCQlwdnQtPmVuYWJsZV9zY3J1YiA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFOgorCQkJCWZhbWlseSA9ICJYZW9uIDM0eHgiOworCQkJCXB2dC0+ZW5hYmxlX3NjcnViID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSTdfTk9OQ09SRV9BTFQ6CisJCQkJZmFtaWx5ID0gIlhlb24gNTV4eCI7CisJCQkJcHZ0LT5lbmFibGVfc2NydWIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTk5GSUVMRF9OT05DT1JFX1JFVjI6CisJCQkJZmFtaWx5ID0gIlhlb24gNTZ4eCAvIGk3LTkwMCI7CisJCQkJcHZ0LT5lbmFibGVfc2NydWIgPSB0cnVlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmYW1pbHkgPSAidW5rbm93biI7CisJCQkJcHZ0LT5lbmFibGVfc2NydWIgPSBmYWxzZTsKKwkJCX0KKwkJCWRlYnVnZjAoIkRldGVjdGVkIGEgcHJvY2Vzc29yIHR5cGUgJXNcbiIsIGZhbWlseSk7CisJCX0gZWxzZQogCQkJZ290byBlcnJvcjsKIAogCQlkZWJ1Z2YwKCJBc3NvY2lhdGVkIGZuICVkLiVkLCBkZXYgPSAlcCwgc29ja2V0ICVkXG4iLApAQCAtMTQ3Miw3ICsxNTUyLDcgQEAKIAogCQlpZiAoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDMgJiYKIAkJCVBDSV9GVU5DKHBkZXYtPmRldmZuKSA9PSAyKQotCQkJcHZ0LT5pc19yZWdpc3RlcmVkID0gMTsKKwkJCXB2dC0+aXNfcmVnaXN0ZXJlZCA9IHRydWU7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xODI2LDMzICsxOTA2LDQzIEBACiAgKiBXQVJOSU5HOiBBcyB0aGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBhdCBOTUkgdGltZSwgZXh0cmEgY2FyZSBzaG91bGQKICAqIGJlIHRha2VuIHRvIGF2b2lkIGRlYWRsb2NrcywgYW5kIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuCiAgKi8KLXN0YXRpYyBpbnQgaTdjb3JlX21jZV9jaGVja19lcnJvcih2b2lkICpwcml2LCBzdHJ1Y3QgbWNlICptY2UpCitzdGF0aWMgaW50IGk3Y29yZV9tY2VfY2hlY2tfZXJyb3Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkJICB2b2lkICpkYXRhKQogewotCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHByaXY7Ci0Jc3RydWN0IGk3Y29yZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJc3RydWN0IG1jZSAqbWNlID0gKHN0cnVjdCBtY2UgKilkYXRhOworCXN0cnVjdCBpN2NvcmVfZGV2ICppN19kZXY7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQ7CisKKwlpN19kZXYgPSBnZXRfaTdjb3JlX2RldihtY2UtPnNvY2tldGlkKTsKKwlpZiAoIWk3X2RldikKKwkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwltY2kgPSBpN19kZXYtPm1jaTsKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOwogCiAJLyoKIAkgKiBKdXN0IGxldCBtY2Vsb2cgaGFuZGxlIGl0IGlmIHRoZSBlcnJvciBpcwogCSAqIG91dHNpZGUgdGhlIG1lbW9yeSBjb250cm9sbGVyCiAJICovCiAJaWYgKCgobWNlLT5zdGF0dXMgJiAweGZmZmYpID4+IDcpICE9IDEpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAkvKiBCYW5rIDggcmVnaXN0ZXJzIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgd2Uga25vdyBob3cgdG8gaGFuZGxlICovCiAJaWYgKG1jZS0+YmFuayAhPSA4KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIE9ubHkgaGFuZGxlIGlmIGl0IGlzIHRoZSByaWdodCBtYyBjb250cm9sbGVyICovCi0JaWYgKGNwdV9kYXRhKG1jZS0+Y3B1KS5waHlzX3Byb2NfaWQgIT0gcHZ0LT5pN2NvcmVfZGV2LT5zb2NrZXQpCi0JCXJldHVybiAwOworCWlmIChtY2UtPnNvY2tldGlkICE9IHB2dC0+aTdjb3JlX2Rldi0+c29ja2V0KQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAjZW5kaWYKIAogCXNtcF9ybWIoKTsKIAlpZiAoKHB2dC0+bWNlX291dCArIDEpICUgTUNFX0xPR19MRU4gPT0gcHZ0LT5tY2VfaW4pIHsKIAkJc21wX3dtYigpOwogCQlwdnQtPm1jZV9vdmVycnVuKys7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAJfQogCiAJLyogQ29weSBtZW1vcnkgZXJyb3IgYXQgdGhlIHJpbmdidWZmZXIgKi8KQEAgLTE4NjUsNyArMTk1NSwyNDAgQEAKIAkJaTdjb3JlX2NoZWNrX2Vycm9yKG1jaSk7CiAKIAkvKiBBZHZpc2UgbWNlbG9nIHRoYXQgdGhlIGVycm9ycyB3ZXJlIGhhbmRsZWQgKi8KLQlyZXR1cm4gMTsKKwlyZXR1cm4gTk9USUZZX1NUT1A7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaTdfbWNlX2RlYyA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGk3Y29yZV9tY2VfY2hlY2tfZXJyb3IsCit9OworCitzdHJ1Y3QgbWVtZGV2X2RtaV9lbnRyeSB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTE2IGhhbmRsZTsKKwl1MTYgcGh5c19tZW1fYXJyYXlfaGFuZGxlOworCXUxNiBtZW1fZXJyX2luZm9faGFuZGxlOworCXUxNiB0b3RhbF93aWR0aDsKKwl1MTYgZGF0YV93aWR0aDsKKwl1MTYgc2l6ZTsKKwl1OCBmb3JtOworCXU4IGRldmljZV9zZXQ7CisJdTggZGV2aWNlX2xvY2F0b3I7CisJdTggYmFua19sb2NhdG9yOworCXU4IG1lbW9yeV90eXBlOworCXUxNiB0eXBlX2RldGFpbDsKKwl1MTYgc3BlZWQ7CisJdTggbWFudWZhY3R1cmVyOworCXU4IHNlcmlhbF9udW1iZXI7CisJdTggYXNzZXRfdGFnOworCXU4IHBhcnRfbnVtYmVyOworCXU4IGF0dHJpYnV0ZXM7CisJdTMyIGV4dGVuZGVkX3NpemU7CisJdTE2IGNvbmZfbWVtX2Nsa19zcGVlZDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qCisgKiBEZWNvZGUgdGhlIERSQU0gQ2xvY2sgRnJlcXVlbmN5LCBiZSBwYXJhbm9pZCwgbWFrZSBzdXJlIHRoYXQgYWxsCisgKiBtZW1vcnkgZGV2aWNlcyBzaG93IHRoZSBzYW1lIHNwZWVkLCBhbmQgaWYgdGhleSBkb24ndCB0aGVuIGNvbnNpZGVyCisgKiBhbGwgc3BlZWRzIHRvIGJlIGludmFsaWQuCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9kY2xrKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkaCwgdm9pZCAqX2RjbGtfZnJlcSkKK3sKKwlpbnQgKmRjbGtfZnJlcSA9IF9kY2xrX2ZyZXE7CisJdTE2IGRtaV9tZW1fY2xrX3NwZWVkOworCisJaWYgKCpkY2xrX2ZyZXEgPT0gLTEpCisJCXJldHVybjsKKworCWlmIChkaC0+dHlwZSA9PSBETUlfRU5UUllfTUVNX0RFVklDRSkgeworCQlzdHJ1Y3QgbWVtZGV2X2RtaV9lbnRyeSAqbWVtZGV2X2RtaV9lbnRyeSA9CisJCQkoc3RydWN0IG1lbWRldl9kbWlfZW50cnkgKilkaDsKKwkJdW5zaWduZWQgbG9uZyBjb25mX21lbV9jbGtfc3BlZWRfb2Zmc2V0ID0KKwkJCSh1bnNpZ25lZCBsb25nKSZtZW1kZXZfZG1pX2VudHJ5LT5jb25mX21lbV9jbGtfc3BlZWQgLQorCQkJKHVuc2lnbmVkIGxvbmcpJm1lbWRldl9kbWlfZW50cnktPnR5cGU7CisJCXVuc2lnbmVkIGxvbmcgc3BlZWRfb2Zmc2V0ID0KKwkJCSh1bnNpZ25lZCBsb25nKSZtZW1kZXZfZG1pX2VudHJ5LT5zcGVlZCAtCisJCQkodW5zaWduZWQgbG9uZykmbWVtZGV2X2RtaV9lbnRyeS0+dHlwZTsKKworCQkvKiBDaGVjayB0aGF0IGEgRElNTSBpcyBwcmVzZW50ICovCisJCWlmIChtZW1kZXZfZG1pX2VudHJ5LT5zaXplID09IDApCisJCQlyZXR1cm47CisKKwkJLyoKKwkJICogUGljayB0aGUgY29uZmlndXJlZCBzcGVlZCBpZiBpdCdzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisJCSAqIHBpY2sgdGhlIERJTU0gc3BlZWQsIG9yIHdlIGRvbid0IGhhdmUgYSBzcGVlZC4KKwkJICovCisJCWlmIChtZW1kZXZfZG1pX2VudHJ5LT5sZW5ndGggPiBjb25mX21lbV9jbGtfc3BlZWRfb2Zmc2V0KSB7CisJCQlkbWlfbWVtX2Nsa19zcGVlZCA9CisJCQkJbWVtZGV2X2RtaV9lbnRyeS0+Y29uZl9tZW1fY2xrX3NwZWVkOworCQl9IGVsc2UgaWYgKG1lbWRldl9kbWlfZW50cnktPmxlbmd0aCA+IHNwZWVkX29mZnNldCkgeworCQkJZG1pX21lbV9jbGtfc3BlZWQgPSBtZW1kZXZfZG1pX2VudHJ5LT5zcGVlZDsKKwkJfSBlbHNlIHsKKwkJCSpkY2xrX2ZyZXEgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgqZGNsa19mcmVxID09IDApIHsKKwkJCS8qIEZpcnN0IHBhc3MsIHNwZWVkIHdhcyAwICovCisJCQlpZiAoZG1pX21lbV9jbGtfc3BlZWQgPiAwKSB7CisJCQkJLyogU2V0IHNwZWVkIGlmIGEgdmFsaWQgc3BlZWQgaXMgcmVhZCAqLworCQkJCSpkY2xrX2ZyZXEgPSBkbWlfbWVtX2Nsa19zcGVlZDsKKwkJCX0gZWxzZSB7CisJCQkJLyogT3RoZXJ3aXNlIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBzcGVlZCAqLworCQkJCSpkY2xrX2ZyZXEgPSAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmICgqZGNsa19mcmVxID4gMCAmJgorCQkJICAgKmRjbGtfZnJlcSAhPSBkbWlfbWVtX2Nsa19zcGVlZCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgYSBzcGVlZCwgY2hlY2sgdGhhdCBhbGwgRElNTVMgYXJlIHRoZSBzYW1lCisJCQkgKiBzcGVlZCwgb3RoZXJ3aXNlIHNldCB0aGUgc3BlZWQgYXMgaW52YWxpZC4KKwkJCSAqLworCQkJKmRjbGtfZnJlcSA9IC0xOworCQl9CisJfQorfQorCisvKgorICogVGhlIGRlZmF1bHQgRENMSyBmcmVxdWVuY3kgaXMgdXNlZCBhcyBhIGZhbGxiYWNrIGlmIHdlCisgKiBmYWlsIHRvIGZpbmQgYW55dGhpbmcgcmVsaWFibGUgaW4gdGhlIERNSS4gVGhlIHZhbHVlCisgKiBpcyB0YWtlbiBzdHJhaWdodCBmcm9tIHRoZSBkYXRhc2hlZXQuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9EQ0xLX0ZSRVEgODAwCisKK3N0YXRpYyBpbnQgZ2V0X2RjbGtfZnJlcSh2b2lkKQoreworCWludCBkY2xrX2ZyZXEgPSAwOworCisJZG1pX3dhbGsoZGVjb2RlX2RjbGssICh2b2lkICopJmRjbGtfZnJlcSk7CisKKwlpZiAoZGNsa19mcmVxIDwgMSkKKwkJcmV0dXJuIERFRkFVTFRfRENMS19GUkVROworCisJcmV0dXJuIGRjbGtfZnJlcTsKK30KKworLyoKKyAqIHNldF9zZHJhbV9zY3J1Yl9yYXRlCQlUaGlzIHJvdXRpbmUgc2V0cyBieXRlL3NlYyBiYW5kd2lkdGggc2NydWIgcmF0ZQorICoJCQkJdG8gaGFyZHdhcmUgYWNjb3JkaW5nIHRvIFNDUlVCSU5URVJWQUwgZm9ybXVsYQorICoJCQkJZm91bmQgaW4gZGF0YXNoZWV0LgorICovCitzdGF0aWMgaW50IHNldF9zZHJhbV9zY3J1Yl9yYXRlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTMyIG5ld19idykKK3sKKwlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgZHdfc2NydWI7CisJdTMyIGR3X3NzcjsKKworCS8qIEdldCBkYXRhIGZyb20gdGhlIE1DIHJlZ2lzdGVyLCBmdW5jdGlvbiAyICovCisJcGRldiA9IHB2dC0+cGNpX21jclsyXTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE1DX1NDUlVCX0NPTlRST0wsICZkd19zY3J1Yik7CisKKwlpZiAobmV3X2J3ID09IDApIHsKKwkJLyogUHJlcGFyZSB0byBkaXNhYmxlIHBldHJvbCBzY3J1YiAqLworCQlkd19zY3J1YiAmPSB+U1RBUlRTQ1JVQjsKKwkJLyogU3RvcCB0aGUgcGF0cm9sIHNjcnViIGVuZ2luZSAqLworCQl3cml0ZV9hbmRfdGVzdChwZGV2LCBNQ19TQ1JVQl9DT05UUk9MLAorCQkJICAgICAgIGR3X3NjcnViICYgflNDUlVCSU5URVJWQUxfTUFTSyk7CisKKwkJLyogR2V0IGN1cnJlbnQgc3RhdHVzIG9mIHNjcnViIHJhdGUgYW5kIHNldCBiaXQgdG8gZGlzYWJsZSAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTUNfU1NSQ09OVFJPTCwgJmR3X3Nzcik7CisJCWR3X3NzciAmPSB+U1NSX01PREVfTUFTSzsKKwkJZHdfc3NyIHw9IFNTUl9NT0RFX0RJU0FCTEU7CisJfSBlbHNlIHsKKwkJY29uc3QgaW50IGNhY2hlX2xpbmVfc2l6ZSA9IDY0OworCQljb25zdCB1MzIgZnJlcV9kY2xrX21oeiA9IHB2dC0+ZGNsa19mcmVxOworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2NydWJfaW50ZXJ2YWw7CisJCS8qCisJCSAqIFRyYW5zbGF0ZSB0aGUgZGVzaXJlZCBzY3J1YiByYXRlIHRvIGEgcmVnaXN0ZXIgdmFsdWUgYW5kCisJCSAqIHByb2dyYW0gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgdmFsdWUuCisJCSAqLworCQlzY3J1Yl9pbnRlcnZhbCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpZnJlcV9kY2xrX21oeiAqCisJCQljYWNoZV9saW5lX3NpemUgKiAxMDAwMDAwOworCQlkb19kaXYoc2NydWJfaW50ZXJ2YWwsIG5ld19idyk7CisKKwkJaWYgKCFzY3J1Yl9pbnRlcnZhbCB8fCBzY3J1Yl9pbnRlcnZhbCA+IFNDUlVCSU5URVJWQUxfTUFTSykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWR3X3NjcnViID0gU0NSVUJJTlRFUlZBTF9NQVNLICYgc2NydWJfaW50ZXJ2YWw7CisKKwkJLyogU3RhcnQgdGhlIHBhdHJvbCBzY3J1YiBlbmdpbmUgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBNQ19TQ1JVQl9DT05UUk9MLAorCQkJCSAgICAgICBTVEFSVFNDUlVCIHwgZHdfc2NydWIpOworCisJCS8qIEdldCBjdXJyZW50IHN0YXR1cyBvZiBzY3J1YiByYXRlIGFuZCBzZXQgYml0IHRvIGVuYWJsZSAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTUNfU1NSQ09OVFJPTCwgJmR3X3Nzcik7CisJCWR3X3NzciAmPSB+U1NSX01PREVfTUFTSzsKKwkJZHdfc3NyIHw9IFNTUl9NT0RFX0VOQUJMRTsKKwl9CisJLyogRGlzYWJsZSBvciBlbmFibGUgc2NydWJiaW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBNQ19TU1JDT05UUk9MLCBkd19zc3IpOworCisJcmV0dXJuIG5ld19idzsKK30KKworLyoKKyAqIGdldF9zZHJhbV9zY3J1Yl9yYXRlCQlUaGlzIHJvdXRpbmUgY29udmVydCBjdXJyZW50IHNjcnViIHJhdGUgdmFsdWUKKyAqCQkJCWludG8gYnl0ZS9zZWMgYmFuZHdpZHRoIGFjY291cmRpbmcgdG8KKyAqCQkJCVNDUlVCSU5URVJWQUwgZm9ybXVsYSBmb3VuZCBpbiBkYXRhc2hlZXQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3NkcmFtX3NjcnViX3JhdGUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWNvbnN0IHUzMiBjYWNoZV9saW5lX3NpemUgPSA2NDsKKwljb25zdCB1MzIgZnJlcV9kY2xrX21oeiA9IHB2dC0+ZGNsa19mcmVxOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzY3J1Yl9yYXRlOworCXUzMiBzY3J1YnZhbDsKKworCS8qIEdldCBkYXRhIGZyb20gdGhlIE1DIHJlZ2lzdGVyLCBmdW5jdGlvbiAyICovCisJcGRldiA9IHB2dC0+cGNpX21jclsyXTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogR2V0IGN1cnJlbnQgc2NydWIgY29udHJvbCBkYXRhICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE1DX1NDUlVCX0NPTlRST0wsICZzY3J1YnZhbCk7CisKKwkvKiBNYXNrIGhpZ2hlc3QgOC1iaXRzIHRvIDAgKi8KKwlzY3J1YnZhbCAmPSAgU0NSVUJJTlRFUlZBTF9NQVNLOworCWlmICghc2NydWJ2YWwpCisJCXJldHVybiAwOworCisJLyogQ2FsY3VsYXRlIHNjcnViIHJhdGUgdmFsdWUgaW50byBieXRlL3NlYyBiYW5kd2lkdGggKi8KKwlzY3J1Yl9yYXRlID0gICh1bnNpZ25lZCBsb25nIGxvbmcpZnJlcV9kY2xrX21oeiAqCisJCTEwMDAwMDAgKiBjYWNoZV9saW5lX3NpemU7CisJZG9fZGl2KHNjcnViX3JhdGUsIHNjcnVidmFsKTsKKwlyZXR1cm4gKGludClzY3J1Yl9yYXRlOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfc2RyYW1fc2NydWJfc2V0dGluZyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk3Y29yZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdTMyIHBjaV9sb2NrOworCisJLyogVW5sb2NrIHdyaXRlcyB0byBwY2kgcmVnaXN0ZXJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX25vbmNvcmUsIE1DX0NGR19DT05UUk9MLCAmcGNpX2xvY2spOworCXBjaV9sb2NrICY9IH4weDM7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPnBjaV9ub25jb3JlLCBNQ19DRkdfQ09OVFJPTCwKKwkJCSAgICAgICBwY2lfbG9jayB8IE1DX0NGR19VTkxPQ0spOworCisJbWNpLT5zZXRfc2RyYW1fc2NydWJfcmF0ZSA9IHNldF9zZHJhbV9zY3J1Yl9yYXRlOworCW1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUgPSBnZXRfc2RyYW1fc2NydWJfcmF0ZTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9zZHJhbV9zY3J1Yl9zZXR0aW5nKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTdjb3JlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgcGNpX2xvY2s7CisKKwkvKiBMb2NrIHdyaXRlcyB0byBwY2kgcmVnaXN0ZXJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX25vbmNvcmUsIE1DX0NGR19DT05UUk9MLCAmcGNpX2xvY2spOworCXBjaV9sb2NrICY9IH4weDM7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPnBjaV9ub25jb3JlLCBNQ19DRkdfQ09OVFJPTCwKKwkJCSAgICAgICBwY2lfbG9jayB8IE1DX0NGR19MT0NLKTsKIH0KIAogc3RhdGljIHZvaWQgaTdjb3JlX3BjaV9jdGxfY3JlYXRlKHN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQpCkBAIC0xODc0LDcgKzIxOTcsOCBAQAogCQkJCQkJJnB2dC0+aTdjb3JlX2Rldi0+cGRldlswXS0+ZGV2LAogCQkJCQkJRURBQ19NT0RfU1RSKTsKIAlpZiAodW5saWtlbHkoIXB2dC0+aTdjb3JlX3BjaSkpCi0JCXByX3dhcm4oIlVuYWJsZSB0byBzZXR1cCBQQ0kgZXJyb3IgcmVwb3J0IHZpYSBFREFDXG4iKTsKKwkJaTdjb3JlX3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkgICAgICAiVW5hYmxlIHRvIHNldHVwIFBDSSBlcnJvciByZXBvcnQgdmlhIEVEQUNcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBpN2NvcmVfcGNpX2N0bF9yZWxlYXNlKHN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQpCkBAIC0xOTA2LDggKzIyMzAsMTEgQEAKIAlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtY2kgPSAlcCwgZGV2ID0gJXBcbiIsCiAJCV9fZnVuY19fLCBtY2ksICZpN2NvcmVfZGV2LT5wZGV2WzBdLT5kZXYpOwogCi0JLyogRGlzYWJsZSBNQ0UgTk1JIGhhbmRsZXIgKi8KLQllZGFjX21jZV91bnJlZ2lzdGVyKCZwdnQtPmVkYWNfbWNlKTsKKwkvKiBEaXNhYmxlIHNjcnVicmF0ZSBzZXR0aW5nICovCisJaWYgKHB2dC0+ZW5hYmxlX3NjcnViKQorCQlkaXNhYmxlX3NkcmFtX3NjcnViX3NldHRpbmcobWNpKTsKKworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sICZpN19tY2VfZGVjKTsKIAogCS8qIERpc2FibGUgRURBQyBwb2xsaW5nICovCiAJaTdjb3JlX3BjaV9jdGxfcmVsZWFzZShwdnQpOwpAQCAtMTk3OSw2ICsyMzA2LDEwIEBACiAJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGFuIGFjdHVhbCBvcGVyYXRpb24gZnVuY3Rpb24gKi8KIAltY2ktPmVkYWNfY2hlY2sgPSBpN2NvcmVfY2hlY2tfZXJyb3I7CiAKKwkvKiBFbmFibGUgc2NydWJyYXRlIHNldHRpbmcgKi8KKwlpZiAocHZ0LT5lbmFibGVfc2NydWIpCisJCWVuYWJsZV9zZHJhbV9zY3J1Yl9zZXR0aW5nKG1jaSk7CisKIAkvKiBhZGQgdGhpcyBuZXcgTUMgY29udHJvbCBzdHJ1Y3R1cmUgdG8gRURBQydzIGxpc3Qgb2YgTUNzICovCiAJaWYgKHVubGlrZWx5KGVkYWNfbWNfYWRkX21jKG1jaSkpKSB7CiAJCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fCkBAIC0yMDAyLDIxICsyMzMzLDEzIEBACiAJLyogYWxsb2NhdGluZyBnZW5lcmljIFBDSSBjb250cm9sIGluZm8gKi8KIAlpN2NvcmVfcGNpX2N0bF9jcmVhdGUocHZ0KTsKIAotCS8qIFJlZ2lzdGVycyBvbiBlZGFjX21jZSBpbiBvcmRlciB0byByZWNlaXZlIG1lbW9yeSBlcnJvcnMgKi8KLQlwdnQtPmVkYWNfbWNlLnByaXYgPSBtY2k7Ci0JcHZ0LT5lZGFjX21jZS5jaGVja19lcnJvciA9IGk3Y29yZV9tY2VfY2hlY2tfZXJyb3I7Ci0JcmMgPSBlZGFjX21jZV9yZWdpc3RlcigmcHZ0LT5lZGFjX21jZSk7Ci0JaWYgKHVubGlrZWx5KHJjIDwgMCkpIHsKLQkJZGVidWdmMCgiTUM6ICIgX19GSUxFX18KLQkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jZV9yZWdpc3RlcigpXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDE7Ci0JfQorCS8qIERDTEsgZm9yIHNjcnViIHJhdGUgc2V0dGluZyAqLworCXB2dC0+ZGNsa19mcmVxID0gZ2V0X2RjbGtfZnJlcSgpOworCisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sICZpN19tY2VfZGVjKTsKIAogCXJldHVybiAwOwogCi1mYWlsMToKLQlpN2NvcmVfcGNpX2N0bF9yZWxlYXNlKHB2dCk7Ci0JZWRhY19tY19kZWxfbWMobWNpLT5kZXYpOwogZmFpbDA6CiAJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CiAJZWRhY19tY19mcmVlKG1jaSk7CkBAIC0yMDM1LDcgKzIzNTgsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgaTdjb3JlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludCByYzsKKwlpbnQgcmMsIGNvdW50ID0gMDsKIAlzdHJ1Y3QgaTdjb3JlX2RldiAqaTdjb3JlX2RldjsKIAogCS8qIGdldCB0aGUgcGNpIGRldmljZXMgd2Ugd2FudCB0byByZXNlcnZlIGZvciBvdXIgdXNlICovCkBAIC0yMDU1LDEyICsyMzc4LDI4IEBACiAJCWdvdG8gZmFpbDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGk3Y29yZV9kZXYsICZpN2NvcmVfZWRhY19saXN0LCBsaXN0KSB7CisJCWNvdW50Kys7CiAJCXJjID0gaTdjb3JlX3JlZ2lzdGVyX21jaShpN2NvcmVfZGV2KTsKIAkJaWYgKHVubGlrZWx5KHJjIDwgMCkpCiAJCQlnb3RvIGZhaWwxOwogCX0KIAotCWk3Y29yZV9wcmludGsoS0VSTl9JTkZPLCAiRHJpdmVyIGxvYWRlZC5cbiIpOworCS8qCisJICogTmVoYWxlbS1FWCB1c2VzIGEgZGlmZmVyZW50IG1lbW9yeSBjb250cm9sbGVyLiBIb3dldmVyLCBhcyB0aGUKKwkgKiBtZW1vcnkgY29udHJvbGxlciBpcyBub3QgdmlzaWJsZSBvbiBzb21lIE5laGFsZW0vTmVoYWxlbS1FUCwgd2UKKwkgKiBuZWVkIHRvIGluZGlyZWN0bHkgcHJvYmUgdmlhIGEgWDU4IFBDSSBkZXZpY2UuIFRoZSBzYW1lIGRldmljZXMKKwkgKiBhcmUgZm91bmQgb24gKHNvbWUpIE5laGFsZW0tRVguIFNvLCBvbiB0aG9zZSBtYWNoaW5lcywgdGhlCisJICogcHJvYmUgcm91dGluZSBuZWVkcyB0byByZXR1cm4gLUVOT0RFViwgYXMgdGhlIGFjdHVhbCBNZW1vcnkKKwkgKiBDb250cm9sbGVyIHJlZ2lzdGVycyB3b24ndCBiZSBkZXRlY3RlZC4KKwkgKi8KKwlpZiAoIWNvdW50KSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlpN2NvcmVfcHJpbnRrKEtFUk5fSU5GTywKKwkJICAgICAgIkRyaXZlciBsb2FkZWQsICVkIG1lbW9yeSBjb250cm9sbGVyKHMpIGZvdW5kLlxuIiwKKwkJICAgICAgY291bnQpOwogCiAJbXV0ZXhfdW5sb2NrKCZpN2NvcmVfZWRhY19sb2NrKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCmluZGV4IDc5NWNmYmMuLmQwODY0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKKysrIGIvZHJpdmVycy9lZGFjL21jZV9hbWQuYwpAQCAtOSw3ICs5LDcgQEAKIHN0YXRpYyB1OCBuYl9lcnJfY3B1bWFzayA9IDB4ZjsKIAogc3RhdGljIGJvb2wgcmVwb3J0X2dhcnRfZXJyb3JzOwotc3RhdGljIHZvaWQgKCpuYl9idXNfZGVjb2RlcikoaW50IG5vZGVfaWQsIHN0cnVjdCBtY2UgKm0sIHUzMiBuYmNmZyk7CitzdGF0aWMgdm9pZCAoKm5iX2J1c19kZWNvZGVyKShpbnQgbm9kZV9pZCwgc3RydWN0IG1jZSAqbSk7CiAKIHZvaWQgYW1kX3JlcG9ydF9nYXJ0X2Vycm9ycyhib29sIHYpCiB7CkBAIC0xNywxMyArMTcsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFtZF9yZXBvcnRfZ2FydF9lcnJvcnMpOwogCi12b2lkIGFtZF9yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICosIHUzMikpCit2b2lkIGFtZF9yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICopKQogewogCW5iX2J1c19kZWNvZGVyID0gZjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFtZF9yZWdpc3Rlcl9lY2NfZGVjb2Rlcik7CiAKLXZvaWQgYW1kX3VucmVnaXN0ZXJfZWNjX2RlY29kZXIodm9pZCAoKmYpKGludCwgc3RydWN0IG1jZSAqLCB1MzIpKQordm9pZCBhbWRfdW5yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICopKQogewogCWlmIChuYl9idXNfZGVjb2RlcikgewogCQlXQVJOX09OKG5iX2J1c19kZWNvZGVyICE9IGYpOwpAQCAtNTkyLDMxICs1OTIsMTQgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgYW1kX2RlY29kZV9uYl9tY2UoaW50IG5vZGVfaWQsIHN0cnVjdCBtY2UgKm0sIHUzMiBuYmNmZykKK3ZvaWQgYW1kX2RlY29kZV9uYl9tY2Uoc3RydWN0IG1jZSAqbSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKLQl1MTYgZWMgICA9IEVDKG0tPnN0YXR1cyk7Ci0JdTggeGVjICAgPSBYRUMobS0+c3RhdHVzLCAweDFmKTsKLQl1MzIgbmJzaCA9ICh1MzIpKG0tPnN0YXR1cyA+PiAzMik7Ci0JaW50IGNvcmUgPSAtMTsKKwlpbnQgbm9kZV9pZCA9IGFtZF9nZXRfbmJfaWQobS0+ZXh0Y3B1KTsKKwl1MTYgZWMgPSBFQyhtLT5zdGF0dXMpOworCXU4IHhlYyA9IFhFQyhtLT5zdGF0dXMsIDB4MWYpOwogCi0JcHJfZW1lcmcoSFdfRVJSICJOb3J0aGJyaWRnZSBFcnJvciAobm9kZSAlZCIsIG5vZGVfaWQpOwotCi0JLyogRjEwaCwgcmV2RCBjYW4gZGlzYWJsZSBFcnJDcHVbMzowXSB0aHJvdWdoIEVyckNwdVZhbCAqLwotCWlmIChjLT54ODYgPT0gMHgxMCAmJiBjLT54ODZfbW9kZWwgPiA3KSB7Ci0JCWlmIChuYnNoICYgTkJTSF9FUlJfQ1BVX1ZBTCkKLQkJCWNvcmUgPSBuYnNoICYgbmJfZXJyX2NwdW1hc2s7Ci0JfSBlbHNlIHsKLQkJdTggYXNzb2NfY3B1cyA9IG5ic2ggJiBuYl9lcnJfY3B1bWFzazsKLQotCQlpZiAoYXNzb2NfY3B1cyA+IDApCi0JCQljb3JlID0gZmxzKGFzc29jX2NwdXMpIC0gMTsKLQl9Ci0KLQlpZiAoY29yZSA+PSAwKQotCQlwcl9jb250KCIsIGNvcmUgJWQpOiAiLCBjb3JlKTsKLQllbHNlCi0JCXByX2NvbnQoIik6ICIpOworCXByX2VtZXJnKEhXX0VSUiAiTm9ydGhicmlkZ2UgRXJyb3IgKG5vZGUgJWQpOiAiLCBub2RlX2lkKTsKIAogCXN3aXRjaCAoeGVjKSB7CiAJY2FzZSAweDI6CkBAIC02NDgsNyArNjMxLDcgQEAKIAogCWlmIChjLT54ODYgPT0gMHhmIHx8IGMtPng4NiA9PSAweDEwIHx8IGMtPng4NiA9PSAweDE1KQogCQlpZiAoKHhlYyA9PSAweDggfHwgeGVjID09IDB4MCkgJiYgbmJfYnVzX2RlY29kZXIpCi0JCQluYl9idXNfZGVjb2Rlcihub2RlX2lkLCBtLCBuYmNmZyk7CisJCQluYl9idXNfZGVjb2Rlcihub2RlX2lkLCBtKTsKIAogCXJldHVybjsKIApAQCAtNzY0LDEzICs3NDcsMTMgQEAKIHsKIAlzdHJ1Y3QgbWNlICptID0gKHN0cnVjdCBtY2UgKilkYXRhOwogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOwotCWludCBub2RlLCBlY2M7CisJaW50IGVjYzsKIAogCWlmIChhbWRfZmlsdGVyX21jZShtKSkKIAkJcmV0dXJuIE5PVElGWV9TVE9QOwogCi0JcHJfZW1lcmcoSFdfRVJSICJNQyVkX1NUQVRVU1slc3wlc3wlc3wlc3wlcyIsCi0JCW0tPmJhbmssCisJcHJfZW1lcmcoSFdfRVJSICJDUFU6JWRcdE1DJWRfU1RBVFVTWyVzfCVzfCVzfCVzfCVzIiwKKwkJbS0+ZXh0Y3B1LCBtLT5iYW5rLAogCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfT1ZFUikJPyAiT3ZlciIgIDogIi0iKSwKIAkJKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1VDKQk/ICJVRSIJICA6ICJDRSIpLAogCQkoKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfTUlTQ1YpCT8gIk1pc2NWIiA6ICItIiksCkBAIC03ODksNiArNzcyLDggQEAKIAogCXByX2NvbnQoIl06IDB4JTAxNmxseFxuIiwgbS0+c3RhdHVzKTsKIAorCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQorCQlwcl9lbWVyZyhIV19FUlIgIlx0TUMlZF9BRERSOiAweCUwMTZsbHhcbiIsIG0tPmJhbmssIG0tPmFkZHIpOwogCiAJc3dpdGNoIChtLT5iYW5rKSB7CiAJY2FzZSAwOgpAQCAtODExLDggKzc5Niw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSA0OgotCQlub2RlID0gYW1kX2dldF9uYl9pZChtLT5leHRjcHUpOwotCQlhbWRfZGVjb2RlX25iX21jZShub2RlLCBtLCAwKTsKKwkJYW1kX2RlY29kZV9uYl9tY2UobSk7CiAJCWJyZWFrOwogCiAJY2FzZSA1OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuaCBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmgKaW5kZXggNzk1YTMyMC4uMDEwNjc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuaAorKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5oCkBAIC04Niw5ICs4Niw5IEBACiB9OwogCiB2b2lkIGFtZF9yZXBvcnRfZ2FydF9lcnJvcnMoYm9vbCk7Ci12b2lkIGFtZF9yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICosIHUzMikpOwotdm9pZCBhbWRfdW5yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICosIHUzMikpOwotdm9pZCBhbWRfZGVjb2RlX25iX21jZShpbnQsIHN0cnVjdCBtY2UgKiwgdTMyKTsKK3ZvaWQgYW1kX3JlZ2lzdGVyX2VjY19kZWNvZGVyKHZvaWQgKCpmKShpbnQsIHN0cnVjdCBtY2UgKikpOwordm9pZCBhbWRfdW5yZWdpc3Rlcl9lY2NfZGVjb2Rlcih2b2lkICgqZikoaW50LCBzdHJ1Y3QgbWNlICopKTsKK3ZvaWQgYW1kX2RlY29kZV9uYl9tY2Uoc3RydWN0IG1jZSAqKTsKIGludCBhbWRfZGVjb2RlX21jZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CiAKICNlbmRpZiAvKiBfRURBQ19NQ0VfQU1EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tY2VfYW1kX2luai5jIGIvZHJpdmVycy9lZGFjL21jZV9hbWRfaW5qLmMKaW5kZXggYTQ5ODdlMC4uNzNjM2UyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWRfaW5qLmMKKysrIGIvZHJpdmVycy9lZGFjL21jZV9hbWRfaW5qLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KIAogI2luY2x1ZGUgIm1jZV9hbWQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKaW5kZXggMGRlN2Q4Ny4uMzg0MDA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCS5yZW1vdmUJCQk9IHBwYzR4eF9lZGFjX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm5hbWUgPSBQUEM0WFhfRURBQ19NT0RVTEVfTkFNRQorCQkubmFtZSA9IFBQQzRYWF9FREFDX01PRFVMRV9OQU1FLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBwcGM0eHhfZWRhY19tYXRjaCwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDAyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCkBAIC0wLDAgKzEsMTg5MyBAQAorLyogSW50ZWwgU2FuZHkgQnJpZGdlIC1FTi8tRVAvLUVYIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgbWVtb3J5IGNvbnRyb2xsZXJzIGZvdW5kIG9uIHRoZSBJbnRlbAorICogcHJvY2Vzc29yIGZhbWlseSBTYW5keSBCcmlkZ2UuCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgYnk6CisgKgkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbWNlLmg+CisKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKworLyogU3RhdGljIHZhcnMgKi8KK3N0YXRpYyBMSVNUX0hFQUQoc2JyaWRnZV9lZGFjX2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChzYnJpZGdlX2VkYWNfbG9jayk7CitzdGF0aWMgaW50IHByb2JlZDsKKworLyoKKyAqIEFsdGVyIHRoaXMgdmVyc2lvbiBmb3IgdGhlIG1vZHVsZSB3aGVuIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUKKyAqLworI2RlZmluZSBTQlJJREdFX1JFVklTSU9OICAgICIgVmVyOiAxLjAuMCAiCisjZGVmaW5lIEVEQUNfTU9EX1NUUiAgICAgICJzYnJpZGdlX2VkYWMiCisKKy8qCisgKiBEZWJ1ZyBtYWNyb3MKKyAqLworI2RlZmluZSBzYnJpZGdlX3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCQkJXAorCWVkYWNfcHJpbnRrKGxldmVsLCAic2JyaWRnZSIsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgc2JyaWRnZV9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pCQlcCisJZWRhY19tY19jaGlwc2V0X3ByaW50ayhtY2ksIGxldmVsLCAic2JyaWRnZSIsIGZtdCwgIyNhcmcpCisKKy8qCisgKiBHZXQgYSBiaXQgZmllbGQgYXQgcmVnaXN0ZXIgdmFsdWUgPHY+LCBmcm9tIGJpdCA8bG8+IHRvIGJpdCA8aGk+CisgKi8KKyNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIGxvLCBoaSkJXAorCSgoKHYpICYgKCgxVUxMIDw8ICgoaGkpIC0gKGxvKSArIDEpKSAtIDEpIDw8IChsbykpID4+IChsbykpCisKKy8qCisgKiBzYnJpZGdlIE1lbW9yeSBDb250cm9sbGVyIFJlZ2lzdGVycworICovCisKKy8qCisgKiBGSVhNRTogRm9yIG5vdywgbGV0J3Mgb3JkZXIgYnkgZGV2aWNlIGZ1bmN0aW9uLCBhcyBpdCBtYWtlcworICogZWFzaWVyIGZvciBkcml2ZXIncyBkZXZlbG9wbWVudCBwcm9jY2Vzcy4gVGhpcyB0YWJsZSBzaG91bGQgYmUKKyAqIG1vdmVkIHRvIHBjaV9pZC5oIHdoZW4gc3VibWl0dGVkIHVwc3RyZWFtCisgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX1NBRDAJMHgzY2Y0CS8qIDEyLjYgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX1NBRDEJMHgzY2Y2CS8qIDEyLjcgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0JSCQkweDNjZjUJLyogMTMuNiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0hBMAkweDNjYTAJLyogMTQuMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBCTB4M2NhOAkvKiAxNS4wICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfUkFTCTB4M2M3MQkvKiAxNS4xICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMAkweDNjYWEJLyogMTUuMiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBRDEJMHgzY2FiCS8qIDE1LjMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQyCTB4M2NhYwkvKiAxNS40ICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMwkweDNjYWQJLyogMTUuNSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0REUklPCTB4M2NiOAkvKiAxNy4wICovCisKKwkvKgorCSAqIEN1cnJlbnRseSwgdW51c2VkLCBidXQgd2lsbCBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZQorCSAqIGltcGxlbWVudGF0aW9ucywgYXMgdGhleSBob2xkIHRoZSBlcnJvciBjb3VudGVycworCSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0VSUjAJMHgzYzcyCS8qIDE2LjIgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19FUlIxCTB4M2M3MwkvKiAxNi4zICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfRVJSMgkweDNjNzYJLyogMTYuNiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX0VSUjMJMHgzYzc3CS8qIDE2LjcgKi8KKworLyogRGV2aWNlcyAxMiBGdW5jdGlvbiA2LCBPZmZzZXRzIDB4ODAgdG8gMHhjYyAqLworc3RhdGljIGNvbnN0IHUzMiBkcmFtX3J1bGVbXSA9IHsKKwkweDgwLCAweDg4LCAweDkwLCAweDk4LCAweGEwLAorCTB4YTgsIDB4YjAsIDB4YjgsIDB4YzAsIDB4YzgsCit9OworI2RlZmluZSBNQVhfU0FECQlBUlJBWV9TSVpFKGRyYW1fcnVsZSkKKworI2RlZmluZSBTQURfTElNSVQocmVnKQkJKChHRVRfQklURklFTEQocmVnLCA2LCAyNSkgPDwgMjYpIHwgMHgzZmZmZmZmKQorI2RlZmluZSBEUkFNX0FUVFIocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMiwgIDMpCisjZGVmaW5lIElOVEVSTEVBVkVfTU9ERShyZWcpCUdFVF9CSVRGSUVMRChyZWcsIDEsICAxKQorI2RlZmluZSBEUkFNX1JVTEVfRU5BQkxFKHJlZykJR0VUX0JJVEZJRUxEKHJlZywgMCwgIDApCisKK3N0YXRpYyBjaGFyICpnZXRfZHJhbV9hdHRyKHUzMiByZWcpCit7CisJc3dpdGNoKERSQU1fQVRUUihyZWcpKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAiRFJBTSI7CisJCWNhc2UgMToKKwkJCXJldHVybiAiTU1DRkciOworCQljYXNlIDI6CisJCQlyZXR1cm4gIk5YTSI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworc3RhdGljIGNvbnN0IHUzMiBpbnRlcmxlYXZlX2xpc3RbXSA9IHsKKwkweDg0LCAweDhjLCAweDk0LCAweDljLCAweGE0LAorCTB4YWMsIDB4YjQsIDB4YmMsIDB4YzQsIDB4Y2MsCit9OworI2RlZmluZSBNQVhfSU5URVJMRUFWRQlBUlJBWV9TSVpFKGludGVybGVhdmVfbGlzdCkKKworI2RlZmluZSBTQURfUEtHMChyZWcpCQlHRVRfQklURklFTEQocmVnLCAwLCAyKQorI2RlZmluZSBTQURfUEtHMShyZWcpCQlHRVRfQklURklFTEQocmVnLCAzLCA1KQorI2RlZmluZSBTQURfUEtHMihyZWcpCQlHRVRfQklURklFTEQocmVnLCA4LCAxMCkKKyNkZWZpbmUgU0FEX1BLRzMocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTEsIDEzKQorI2RlZmluZSBTQURfUEtHNChyZWcpCQlHRVRfQklURklFTEQocmVnLCAxNiwgMTgpCisjZGVmaW5lIFNBRF9QS0c1KHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDE5LCAyMSkKKyNkZWZpbmUgU0FEX1BLRzYocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMjQsIDI2KQorI2RlZmluZSBTQURfUEtHNyhyZWcpCQlHRVRfQklURklFTEQocmVnLCAyNywgMjkpCisKK3N0YXRpYyBpbmxpbmUgaW50IHNhZF9wa2codTMyIHJlZywgaW50IGludGVybGVhdmUpCit7CisJc3dpdGNoIChpbnRlcmxlYXZlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gU0FEX1BLRzAocmVnKTsKKwljYXNlIDE6CisJCXJldHVybiBTQURfUEtHMShyZWcpOworCWNhc2UgMjoKKwkJcmV0dXJuIFNBRF9QS0cyKHJlZyk7CisJY2FzZSAzOgorCQlyZXR1cm4gU0FEX1BLRzMocmVnKTsKKwljYXNlIDQ6CisJCXJldHVybiBTQURfUEtHNChyZWcpOworCWNhc2UgNToKKwkJcmV0dXJuIFNBRF9QS0c1KHJlZyk7CisJY2FzZSA2OgorCQlyZXR1cm4gU0FEX1BLRzYocmVnKTsKKwljYXNlIDc6CisJCXJldHVybiBTQURfUEtHNyhyZWcpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyogRGV2aWNlcyAxMiBGdW5jdGlvbiA3ICovCisKKyNkZWZpbmUgVE9MTQkJMHg4MAorI2RlZmluZQlUT0hNCQkweDg0CisKKyNkZWZpbmUgR0VUX1RPTE0ocmVnKQkJKChHRVRfQklURklFTEQocmVnLCAwLCAgMykgPDwgMjgpIHwgMHgzZmZmZmZmKQorI2RlZmluZSBHRVRfVE9ITShyZWcpCQkoKEdFVF9CSVRGSUVMRChyZWcsIDAsIDIwKSA8PCAyNSkgfCAweDNmZmZmZmYpCisKKy8qIERldmljZSAxMyBGdW5jdGlvbiA2ICovCisKKyNkZWZpbmUgU0FEX1RBUkdFVAkweGYwCisKKyNkZWZpbmUgU09VUkNFX0lEKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDksIDExKQorCisjZGVmaW5lIFNBRF9DT05UUk9MCTB4ZjQKKworI2RlZmluZSBOT0RFX0lEKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDAsIDIpCisKKy8qIERldmljZSAxNCBmdW5jdGlvbiAwICovCisKK3N0YXRpYyBjb25zdCB1MzIgdGFkX2RyYW1fcnVsZVtdID0geworCTB4NDAsIDB4NDQsIDB4NDgsIDB4NGMsCisJMHg1MCwgMHg1NCwgMHg1OCwgMHg1YywKKwkweDYwLCAweDY0LCAweDY4LCAweDZjLAorfTsKKyNkZWZpbmUgTUFYX1RBRAlBUlJBWV9TSVpFKHRhZF9kcmFtX3J1bGUpCisKKyNkZWZpbmUgVEFEX0xJTUlUKHJlZykJCSgoR0VUX0JJVEZJRUxEKHJlZywgMTIsIDMxKSA8PCAyNikgfCAweDNmZmZmZmYpCisjZGVmaW5lIFRBRF9TT0NLKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDEwLCAxMSkKKyNkZWZpbmUgVEFEX0NIKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsICA4LCAgOSkKKyNkZWZpbmUgVEFEX1RHVDMocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgIDYsICA3KQorI2RlZmluZSBUQURfVEdUMihyZWcpCQlHRVRfQklURklFTEQocmVnLCAgNCwgIDUpCisjZGVmaW5lIFRBRF9UR1QxKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsICAyLCAgMykKKyNkZWZpbmUgVEFEX1RHVDAocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgIDAsICAxKQorCisvKiBEZXZpY2UgMTUsIGZ1bmN0aW9uIDAgKi8KKworI2RlZmluZSBNQ01UUgkJCTB4N2MKKworI2RlZmluZSBJU19FQ0NfRU5BQkxFRChtY210cikJCUdFVF9CSVRGSUVMRChtY210ciwgMiwgMikKKyNkZWZpbmUgSVNfTE9DS1NURVBfRU5BQkxFRChtY210cikJR0VUX0JJVEZJRUxEKG1jbXRyLCAxLCAxKQorI2RlZmluZSBJU19DTE9TRV9QRyhtY210cikJCUdFVF9CSVRGSUVMRChtY210ciwgMCwgMCkKKworLyogRGV2aWNlIDE1LCBmdW5jdGlvbiAxICovCisKKyNkZWZpbmUgUkFTRU5BQkxFUwkJMHhhYworI2RlZmluZSBJU19NSVJST1JfRU5BQkxFRChyZWcpCQlHRVRfQklURklFTEQocmVnLCAwLCAwKQorCisvKiBEZXZpY2UgMTUsIGZ1bmN0aW9ucyAyLTUgKi8KKworc3RhdGljIGNvbnN0IGludCBtdHJfcmVnc1tdID0geworCTB4ODAsIDB4ODQsIDB4ODgsCit9OworCisjZGVmaW5lIFJBTktfRElTQUJMRShtdHIpCQlHRVRfQklURklFTEQobXRyLCAxNiwgMTkpCisjZGVmaW5lIElTX0RJTU1fUFJFU0VOVChtdHIpCQlHRVRfQklURklFTEQobXRyLCAxNCwgMTQpCisjZGVmaW5lIFJBTktfQ05UX0JJVFMobXRyKQkJR0VUX0JJVEZJRUxEKG10ciwgMTIsIDEzKQorI2RlZmluZSBSQU5LX1dJRFRIX0JJVFMobXRyKQkJR0VUX0JJVEZJRUxEKG10ciwgMiwgNCkKKyNkZWZpbmUgQ09MX1dJRFRIX0JJVFMobXRyKQkJR0VUX0JJVEZJRUxEKG10ciwgMCwgMSkKKworc3RhdGljIGNvbnN0IHUzMiB0YWRfY2hfbmlsdl9vZmZzZXRbXSA9IHsKKwkweDkwLCAweDk0LCAweDk4LCAweDljLAorCTB4YTAsIDB4YTQsIDB4YTgsIDB4YWMsCisJMHhiMCwgMHhiNCwgMHhiOCwgMHhiYywKK307CisjZGVmaW5lIENITl9JRFhfT0ZGU0VUKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDI4LCAyOSkKKyNkZWZpbmUgVEFEX09GRlNFVChyZWcpCQkJKEdFVF9CSVRGSUVMRChyZWcsICA2LCAyNSkgPDwgMjYpCisKK3N0YXRpYyBjb25zdCB1MzIgcmlyX3dheV9saW1pdFtdID0geworCTB4MTA4LCAweDEwYywgMHgxMTAsIDB4MTE0LCAweDExOCwKK307CisjZGVmaW5lIE1BWF9SSVJfUkFOR0VTIEFSUkFZX1NJWkUocmlyX3dheV9saW1pdCkKKworI2RlZmluZSBJU19SSVJfVkFMSUQocmVnKQlHRVRfQklURklFTEQocmVnLCAzMSwgMzEpCisjZGVmaW5lIFJJUl9XQVkocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMjgsIDI5KQorI2RlZmluZSBSSVJfTElNSVQocmVnKQkJKChHRVRfQklURklFTEQocmVnLCAgMSwgMTApIDw8IDI5KXwgMHgxZmZmZmZmZikKKworI2RlZmluZSBNQVhfUklSX1dBWQk4CisKK3N0YXRpYyBjb25zdCB1MzIgcmlyX29mZnNldFtNQVhfUklSX1JBTkdFU11bTUFYX1JJUl9XQVldID0geworCXsgMHgxMjAsIDB4MTI0LCAweDEyOCwgMHgxMmMsIDB4MTMwLCAweDEzNCwgMHgxMzgsIDB4MTNjIH0sCisJeyAweDE0MCwgMHgxNDQsIDB4MTQ4LCAweDE0YywgMHgxNTAsIDB4MTU0LCAweDE1OCwgMHgxNWMgfSwKKwl7IDB4MTYwLCAweDE2NCwgMHgxNjgsIDB4MTZjLCAweDE3MCwgMHgxNzQsIDB4MTc4LCAweDE3YyB9LAorCXsgMHgxODAsIDB4MTg0LCAweDE4OCwgMHgxOGMsIDB4MTkwLCAweDE5NCwgMHgxOTgsIDB4MTljIH0sCisJeyAweDFhMCwgMHgxYTQsIDB4MWE4LCAweDFhYywgMHgxYjAsIDB4MWI0LCAweDFiOCwgMHgxYmMgfSwKK307CisKKyNkZWZpbmUgUklSX1JOS19UR1QocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTYsIDE5KQorI2RlZmluZSBSSVJfT0ZGU0VUKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsICAyLCAxNCkKKworLyogRGV2aWNlIDE2LCBmdW5jdGlvbnMgMi03ICovCisKKy8qCisgKiBGSVhNRTogSW1wbGVtZW50IHRoZSBlcnJvciBjb3VudCByZWFkcyBkaXJlY3RseQorICovCisKK3N0YXRpYyBjb25zdCB1MzIgY29ycmVycmNudFtdID0geworCTB4MTA0LCAweDEwOCwgMHgxMGMsIDB4MTEwLAorfTsKKworI2RlZmluZSBSQU5LX09ERF9PVihyZWcpCQlHRVRfQklURklFTEQocmVnLCAzMSwgMzEpCisjZGVmaW5lIFJBTktfT0REX0VSUl9DTlQocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTYsIDMwKQorI2RlZmluZSBSQU5LX0VWRU5fT1YocmVnKQkJR0VUX0JJVEZJRUxEKHJlZywgMTUsIDE1KQorI2RlZmluZSBSQU5LX0VWRU5fRVJSX0NOVChyZWcpCQlHRVRfQklURklFTEQocmVnLCAgMCwgMTQpCisKK3N0YXRpYyBjb25zdCB1MzIgY29ycmVycnRocnNsZFtdID0geworCTB4MTFjLCAweDEyMCwgMHgxMjQsIDB4MTI4LAorfTsKKworI2RlZmluZSBSQU5LX09ERF9FUlJfVEhSU0xEKHJlZykJR0VUX0JJVEZJRUxEKHJlZywgMTYsIDMwKQorI2RlZmluZSBSQU5LX0VWRU5fRVJSX1RIUlNMRChyZWcpCUdFVF9CSVRGSUVMRChyZWcsICAwLCAxNCkKKworCisvKiBEZXZpY2UgMTcsIGZ1bmN0aW9uIDAgKi8KKworI2RlZmluZSBSQU5LX0NGR19BCQkweDAzMjgKKworI2RlZmluZSBJU19SRElNTV9FTkFCTEVEKHJlZykJCUdFVF9CSVRGSUVMRChyZWcsIDExLCAxMSkKKworLyoKKyAqIHNicmlkZ2Ugc3RydWN0cworICovCisKKyNkZWZpbmUgTlVNX0NIQU5ORUxTCTQKKyNkZWZpbmUgTUFYX0RJTU1TCTMJCS8qIE1heCBESU1NUyBwZXIgY2hhbm5lbCAqLworCitzdHJ1Y3Qgc2JyaWRnZV9pbmZvIHsKKwl1MzIJbWNtdHI7Cit9OworCitzdHJ1Y3Qgc2JyaWRnZV9jaGFubmVsIHsKKwl1MzIJCXJhbmtzOworCXUzMgkJZGltbXM7Cit9OworCitzdHJ1Y3QgcGNpX2lkX2Rlc2NyIHsKKwlpbnQJCQlkZXY7CisJaW50CQkJZnVuYzsKKwlpbnQgCQkJZGV2X2lkOworCWludAkJCW9wdGlvbmFsOworfTsKKworc3RydWN0IHBjaV9pZF90YWJsZSB7CisJY29uc3Qgc3RydWN0IHBjaV9pZF9kZXNjcgkqZGVzY3I7CisJaW50CQkJCW5fZGV2czsKK307CisKK3N0cnVjdCBzYnJpZGdlX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXU4CQkJYnVzLCBtYzsKKwl1OAkJCW5vZGVfaWQsIHNvdXJjZV9pZDsKKwlzdHJ1Y3QgcGNpX2RldgkJKipwZGV2OworCWludAkJCW5fZGV2czsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvCSptY2k7Cit9OworCitzdHJ1Y3Qgc2JyaWRnZV9wdnQgeworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX3RhLCAqcGNpX2RkcmlvLCAqcGNpX3JhczsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9zYWQwLCAqcGNpX3NhZDEsICpwY2lfaGEwOworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2JyOworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX3RhZFtOVU1fQ0hBTk5FTFNdOworCisJc3RydWN0IHNicmlkZ2VfZGV2CSpzYnJpZGdlX2RldjsKKworCXN0cnVjdCBzYnJpZGdlX2luZm8JaW5mbzsKKwlzdHJ1Y3Qgc2JyaWRnZV9jaGFubmVsCWNoYW5uZWxbTlVNX0NIQU5ORUxTXTsKKworCWludCAJCQljc3Jvd19tYXBbTlVNX0NIQU5ORUxTXVtNQVhfRElNTVNdOworCisJLyogTWVtb3J5IHR5cGUgZGV0ZWN0aW9uICovCisJYm9vbAkJCWlzX21pcnJvcmVkLCBpc19sb2Nrc3RlcCwgaXNfY2xvc2VfcGc7CisKKwkvKiBGaWZvIGRvdWJsZSBidWZmZXJzICovCisJc3RydWN0IG1jZQkJbWNlX2VudHJ5W01DRV9MT0dfTEVOXTsKKwlzdHJ1Y3QgbWNlCQltY2Vfb3V0ZW50cnlbTUNFX0xPR19MRU5dOworCisJLyogRmlmbyBpbi9vdXQgY291bnRlcnMgKi8KKwl1bnNpZ25lZAkJbWNlX2luLCBtY2Vfb3V0OworCisJLyogQ291bnQgaW5kaWNhdG9yIHRvIHNob3cgZXJyb3JzIG5vdCBnb3QgKi8KKwl1bnNpZ25lZAkJbWNlX292ZXJydW47CisKKwkvKiBNZW1vcnkgZGVzY3JpcHRpb24gKi8KKwl1NjQJCQl0b2xtLCB0b2htOworfTsKKworI2RlZmluZSBQQ0lfREVTQ1IoZGV2aWNlLCBmdW5jdGlvbiwgZGV2aWNlX2lkKQlcCisJLmRldiA9IChkZXZpY2UpLAkJCVwKKwkuZnVuYyA9IChmdW5jdGlvbiksCQkJXAorCS5kZXZfaWQgPSAoZGV2aWNlX2lkKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9pZF9kZXNjciBwY2lfZGV2X2Rlc2NyX3NicmlkZ2VbXSA9IHsKKwkJLyogUHJvY2Vzc29yIEhvbWUgQWdlbnQgKi8KKwl7IFBDSV9ERVNDUigxNCwgMCwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19IQTApCQl9LAorCisJCS8qIE1lbW9yeSBjb250cm9sbGVyICovCisJeyBQQ0lfREVTQ1IoMTUsIDAsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEEpCQl9LAorCXsgUENJX0RFU0NSKDE1LCAxLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1JBUykJCX0sCisJeyBQQ0lfREVTQ1IoMTUsIDIsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMCkJfSwKKwl7IFBDSV9ERVNDUigxNSwgMywgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19UQUQxKQl9LAorCXsgUENJX0RFU0NSKDE1LCA0LCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBRDIpCX0sCisJeyBQQ0lfREVTQ1IoMTUsIDUsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9JTUNfVEFEMykJfSwKKwl7IFBDSV9ERVNDUigxNywgMCwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0lNQ19ERFJJTykJfSwKKworCQkvKiBTeXN0ZW0gQWRkcmVzcyBEZWNvZGVyICovCisJeyBQQ0lfREVTQ1IoMTIsIDYsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0JSSURHRV9TQUQwKQkJfSwKKwl7IFBDSV9ERVNDUigxMiwgNywgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX1NBRDEpCQl9LAorCisJCS8qIEJyb2FkY2FzdCBSZWdpc3RlcnMgKi8KKwl7IFBDSV9ERVNDUigxMywgNiwgUENJX0RFVklDRV9JRF9JTlRFTF9TQlJJREdFX0JSKQkJfSwKK307CisKKyNkZWZpbmUgUENJX0lEX1RBQkxFX0VOVFJZKEEpIHsgLmRlc2NyPUEsIC5uX2RldnMgPSBBUlJBWV9TSVpFKEEpIH0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2lkX3RhYmxlIHBjaV9kZXZfZGVzY3Jfc2JyaWRnZV90YWJsZVtdID0geworCVBDSV9JRF9UQUJMRV9FTlRSWShwY2lfZGV2X2Rlc2NyX3NicmlkZ2UpLAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKy8qCisgKglwY2lfZGV2aWNlX2lkCXRhYmxlIGZvciB3aGljaCBkZXZpY2VzIHdlIGFyZSBsb29raW5nIGZvcgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2JyaWRnZV9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX1NCUklER0VfSU1DX1RBKX0sCisJezAsfQkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQW5jaWxpYXJ5IHN0YXR1cyByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IG51bXJhbmsodTMyIG10cikKK3sKKwlpbnQgcmFua3MgPSAoMSA8PCBSQU5LX0NOVF9CSVRTKG10cikpOworCisJaWYgKHJhbmtzID4gNCkgeworCQlkZWJ1Z2YwKCJJbnZhbGlkIG51bWJlciBvZiByYW5rczogJWQgKG1heCA9IDQpIHJhdyB2YWx1ZSA9ICV4ICglMDR4KSIsCisJCQlyYW5rcywgKHVuc2lnbmVkIGludClSQU5LX0NOVF9CSVRTKG10ciksIG10cik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYW5rczsKK30KKworc3RhdGljIGlubGluZSBpbnQgbnVtcm93KHUzMiBtdHIpCit7CisJaW50IHJvd3MgPSAoUkFOS19XSURUSF9CSVRTKG10cikgKyAxMik7CisKKwlpZiAocm93cyA8IDEzIHx8IHJvd3MgPiAxOCkgeworCQlkZWJ1Z2YwKCJJbnZhbGlkIG51bWJlciBvZiByb3dzOiAlZCAoc2hvdWxkIGJlIGJldHdlZW4gMTQgYW5kIDE3KSByYXcgdmFsdWUgPSAleCAoJTA0eCkiLAorCQkJcm93cywgKHVuc2lnbmVkIGludClSQU5LX1dJRFRIX0JJVFMobXRyKSwgbXRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDEgPDwgcm93czsKK30KKworc3RhdGljIGlubGluZSBpbnQgbnVtY29sKHUzMiBtdHIpCit7CisJaW50IGNvbHMgPSAoQ09MX1dJRFRIX0JJVFMobXRyKSArIDEwKTsKKworCWlmIChjb2xzID4gMTIpIHsKKwkJZGVidWdmMCgiSW52YWxpZCBudW1iZXIgb2YgY29sczogJWQgKG1heCA9IDQpIHJhdyB2YWx1ZSA9ICV4ICglMDR4KSIsCisJCQljb2xzLCAodW5zaWduZWQgaW50KUNPTF9XSURUSF9CSVRTKG10ciksIG10cik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxIDw8IGNvbHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2JyaWRnZV9kZXYgKmdldF9zYnJpZGdlX2Rldih1OCBidXMpCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JyaWRnZV9kZXYsICZzYnJpZGdlX2VkYWNfbGlzdCwgbGlzdCkgeworCQlpZiAoc2JyaWRnZV9kZXYtPmJ1cyA9PSBidXMpCisJCQlyZXR1cm4gc2JyaWRnZV9kZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2JyaWRnZV9kZXYgKmFsbG9jX3NicmlkZ2VfZGV2KHU4IGJ1cywKKwkJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9pZF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldjsKKworCXNicmlkZ2VfZGV2ID0ga3phbGxvYyhzaXplb2YoKnNicmlkZ2VfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYnJpZGdlX2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlzYnJpZGdlX2Rldi0+cGRldiA9IGt6YWxsb2Moc2l6ZW9mKCpzYnJpZGdlX2Rldi0+cGRldikgKiB0YWJsZS0+bl9kZXZzLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghc2JyaWRnZV9kZXYtPnBkZXYpIHsKKwkJa2ZyZWUoc2JyaWRnZV9kZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzYnJpZGdlX2Rldi0+YnVzID0gYnVzOworCXNicmlkZ2VfZGV2LT5uX2RldnMgPSB0YWJsZS0+bl9kZXZzOworCWxpc3RfYWRkX3RhaWwoJnNicmlkZ2VfZGV2LT5saXN0LCAmc2JyaWRnZV9lZGFjX2xpc3QpOworCisJcmV0dXJuIHNicmlkZ2VfZGV2OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NicmlkZ2VfZGV2KHN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXYpCit7CisJbGlzdF9kZWwoJnNicmlkZ2VfZGV2LT5saXN0KTsKKwlrZnJlZShzYnJpZGdlX2Rldi0+cGRldik7CisJa2ZyZWUoc2JyaWRnZV9kZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJTWVtb3J5IGNoZWNrIHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZ2V0X3BkZXZfc2xvdF9mdW5jKHU4IGJ1cywgdW5zaWduZWQgc2xvdCwKKwkJCQkJICB1bnNpZ25lZCBmdW5jKQoreworCXN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXYgPSBnZXRfc2JyaWRnZV9kZXYoYnVzKTsKKwlpbnQgaTsKKworCWlmICghc2JyaWRnZV9kZXYpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHNicmlkZ2VfZGV2LT5uX2RldnM7IGkrKykgeworCQlpZiAoIXNicmlkZ2VfZGV2LT5wZGV2W2ldKQorCQkJY29udGludWU7CisKKwkJaWYgKFBDSV9TTE9UKHNicmlkZ2VfZGV2LT5wZGV2W2ldLT5kZXZmbikgPT0gc2xvdCAmJgorCQkgICAgUENJX0ZVTkMoc2JyaWRnZV9kZXYtPnBkZXZbaV0tPmRldmZuKSA9PSBmdW5jKSB7CisJCQlkZWJ1Z2YxKCJBc3NvY2lhdGVkICUwMnguJTAyeC4lZCB3aXRoICVwXG4iLAorCQkJCWJ1cywgc2xvdCwgZnVuYywgc2JyaWRnZV9kZXYtPnBkZXZbaV0pOworCQkJcmV0dXJuIHNicmlkZ2VfZGV2LT5wZGV2W2ldOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogc2JyaWRnZV9nZXRfYWN0aXZlX2NoYW5uZWxzKCkgLSBnZXRzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGNzcm93cworICogYnVzOgkJRGV2aWNlIGJ1cworICogQGNoYW5uZWxzOglOdW1iZXIgb2YgY2hhbm5lbHMgdGhhdCB3aWxsIGJlIHJldHVybmVkCisgKiBAY3Nyb3dzOglOdW1iZXIgb2YgY3Nyb3dzIGZvdW5kCisgKgorICogU2luY2UgRURBQyBjb3JlIG5lZWRzIHRvIGtub3cgaW4gYWR2YW5jZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFubmVscworICogYW5kIGNzcm93cywgaW4gb3JkZXIgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjc3Jvd3MvY2hhbm5lbHMsIGl0IGlzIG5lZWRlZAorICogdG8gcnVuIHR3byBzaW1pbGFyIHN0ZXBzLiBBdCB0aGUgZmlyc3Qgc3RlcCwgaW1wbGVtZW50ZWQgb24gdGhpcyBmdW5jdGlvbiwKKyAqIGl0IGNoZWNrcyB0aGUgbnVtYmVyIG9mIGNzcm93cy9jaGFubmVscyBwcmVzZW50IGF0IG9uZSBzb2NrZXQsIGlkZW50aWZpZWQKKyAqIGJ5IHRoZSBhc3NvY2lhdGVkIFBDSSBidXMuCisgKiB0aGlzIGlzIHVzZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgYWxsb2NhdGUgdGhlIHNpemUgb2YgbWNpIGNvbXBvbmVudHMuCisgKiBOb3RlOiBvbmUgY3Nyb3cgaXMgb25lIGRpbW0uCisgKi8KK3N0YXRpYyBpbnQgc2JyaWRnZV9nZXRfYWN0aXZlX2NoYW5uZWxzKGNvbnN0IHU4IGJ1cywgdW5zaWduZWQgKmNoYW5uZWxzLAorCQkJCSAgICAgIHVuc2lnbmVkICpjc3Jvd3MpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCWludCBpLCBqOworCXUzMiBtY210cjsKKworCSpjaGFubmVscyA9IDA7CisJKmNzcm93cyA9IDA7CisKKwlwZGV2ID0gZ2V0X3BkZXZfc2xvdF9mdW5jKGJ1cywgMTUsIDApOworCWlmICghcGRldikgeworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkNvdWxkbid0IGZpbmQgUENJIGRldmljZSAiCisJCQkJCSIlMnguJTAyZC4lZCEhIVxuIiwKKwkJCQkJYnVzLCAxNSwgMCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBNQ01UUiwgJm1jbXRyKTsKKwlpZiAoIUlTX0VDQ19FTkFCTEVEKG1jbXRyKSkgeworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkVDQyBpcyBkaXNhYmxlZC4gQWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKKwkJdTMyIG10cjsKKworCQkvKiBEZXZpY2UgMTUgZnVuY3Rpb25zIDIgLSA1ICAqLworCQlwZGV2ID0gZ2V0X3BkZXZfc2xvdF9mdW5jKGJ1cywgMTUsIDIgKyBpKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkNvdWxkbid0IGZpbmQgUENJIGRldmljZSAiCisJCQkJCQkgIiUyeC4lMDJkLiVkISEhXG4iLAorCQkJCQkJIGJ1cywgMTUsIDIgKyBpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCSgqY2hhbm5lbHMpKys7CisKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobXRyX3JlZ3MpOyBqKyspIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBtdHJfcmVnc1tqXSwgJm10cik7CisJCQlkZWJ1Z2YxKCJCdXMjJTAyeCBjaGFubmVsICMlZCAgTVRSJWQgPSAleFxuIiwgYnVzLCBpLCBqLCBtdHIpOworCQkJaWYgKElTX0RJTU1fUFJFU0VOVChtdHIpKQorCQkJCSgqY3Nyb3dzKSsrOworCQl9CisJfQorCisJZGVidWdmMCgiTnVtYmVyIG9mIGFjdGl2ZSBjaGFubmVsczogJWQsIG51bWJlciBvZiBhY3RpdmUgZGltbXM6ICVkXG4iLAorCQkqY2hhbm5lbHMsICpjc3Jvd3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RpbW1fY29uZmlnKGNvbnN0IHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJc3RydWN0IGNzcm93X2luZm8gKmNzcjsKKwlpbnQgaSwgaiwgYmFua3MsIHJhbmtzLCByb3dzLCBjb2xzLCBzaXplLCBucGFnZXM7CisJaW50IGNzcm93ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFnZSA9IDA7CisJdTMyIHJlZzsKKwllbnVtIGVkYWNfdHlwZSBtb2RlOworCWVudW0gbWVtX3R5cGUgbXR5cGU7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfYnIsIFNBRF9UQVJHRVQsICZyZWcpOworCXB2dC0+c2JyaWRnZV9kZXYtPnNvdXJjZV9pZCA9IFNPVVJDRV9JRChyZWcpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX2JyLCBTQURfQ09OVFJPTCwgJnJlZyk7CisJcHZ0LT5zYnJpZGdlX2Rldi0+bm9kZV9pZCA9IE5PREVfSUQocmVnKTsKKwlkZWJ1Z2YwKCJtYyMlZDogTm9kZSBJRDogJWQsIHNvdXJjZSBJRDogJWRcbiIsCisJCXB2dC0+c2JyaWRnZV9kZXYtPm1jLAorCQlwdnQtPnNicmlkZ2VfZGV2LT5ub2RlX2lkLAorCQlwdnQtPnNicmlkZ2VfZGV2LT5zb3VyY2VfaWQpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3JhcywgUkFTRU5BQkxFUywgJnJlZyk7CisJaWYgKElTX01JUlJPUl9FTkFCTEVEKHJlZykpIHsKKwkJZGVidWdmMCgiTWVtb3J5IG1pcnJvciBpcyBlbmFibGVkXG4iKTsKKwkJcHZ0LT5pc19taXJyb3JlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJZGVidWdmMCgiTWVtb3J5IG1pcnJvciBpcyBkaXNhYmxlZFxuIik7CisJCXB2dC0+aXNfbWlycm9yZWQgPSBmYWxzZTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfdGEsIE1DTVRSLCAmcHZ0LT5pbmZvLm1jbXRyKTsKKwlpZiAoSVNfTE9DS1NURVBfRU5BQkxFRChwdnQtPmluZm8ubWNtdHIpKSB7CisJCWRlYnVnZjAoIkxvY2tzdGVwIGlzIGVuYWJsZWRcbiIpOworCQltb2RlID0gRURBQ19TOEVDRDhFRDsKKwkJcHZ0LT5pc19sb2Nrc3RlcCA9IHRydWU7CisJfSBlbHNlIHsKKwkJZGVidWdmMCgiTG9ja3N0ZXAgaXMgZGlzYWJsZWRcbiIpOworCQltb2RlID0gRURBQ19TNEVDRDRFRDsKKwkJcHZ0LT5pc19sb2Nrc3RlcCA9IGZhbHNlOworCX0KKwlpZiAoSVNfQ0xPU0VfUEcocHZ0LT5pbmZvLm1jbXRyKSkgeworCQlkZWJ1Z2YwKCJhZGRyZXNzIG1hcCBpcyBvbiBjbG9zZWQgcGFnZSBtb2RlXG4iKTsKKwkJcHZ0LT5pc19jbG9zZV9wZyA9IHRydWU7CisJfSBlbHNlIHsKKwkJZGVidWdmMCgiYWRkcmVzcyBtYXAgaXMgb24gb3BlbiBwYWdlIG1vZGVcbiIpOworCQlwdnQtPmlzX2Nsb3NlX3BnID0gZmFsc2U7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhLCBSQU5LX0NGR19BLCAmcmVnKTsKKwlpZiAoSVNfUkRJTU1fRU5BQkxFRChyZWcpKSB7CisJCS8qIEZJWE1FOiBDYW4gYWxzbyBiZSBMUkRJTU0gKi8KKwkJZGVidWdmMCgiTWVtb3J5IGlzIHJlZ2lzdGVyZWRcbiIpOworCQltdHlwZSA9IE1FTV9SRERSMzsKKwl9IGVsc2UgeworCQlkZWJ1Z2YwKCJNZW1vcnkgaXMgdW5yZWdpc3RlcmVkXG4iKTsKKwkJbXR5cGUgPSBNRU1fRERSMzsKKwl9CisKKwkvKiBPbiBhbGwgc3VwcG9ydGVkIEREUjMgRElNTSB0eXBlcywgdGhlcmUgYXJlIDggYmFua3MgYXZhaWxhYmxlICovCisJYmFua3MgPSA4OworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CisJCXUzMiBtdHI7CisKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobXRyX3JlZ3MpOyBqKyspIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YWRbaV0sCisJCQkJCSAgICAgIG10cl9yZWdzW2pdLCAmbXRyKTsKKwkJCWRlYnVnZjQoIkNoYW5uZWwgIyVkICBNVFIlZCA9ICV4XG4iLCBpLCBqLCBtdHIpOworCQkJaWYgKElTX0RJTU1fUFJFU0VOVChtdHIpKSB7CisJCQkJcHZ0LT5jaGFubmVsW2ldLmRpbW1zKys7CisKKwkJCQlyYW5rcyA9IG51bXJhbmsobXRyKTsKKwkJCQlyb3dzID0gbnVtcm93KG10cik7CisJCQkJY29scyA9IG51bWNvbChtdHIpOworCisJCQkJLyogRERSMyBoYXMgOCBJL08gYmFua3MgKi8KKwkJCQlzaXplID0gKHJvd3MgKiBjb2xzICogYmFua3MgKiByYW5rcykgPj4gKDIwIC0gMyk7CisJCQkJbnBhZ2VzID0gTWlCX1RPX1BBR0VTKHNpemUpOworCisJCQkJZGVidWdmMCgibWMjJWQ6IGNoYW5uZWwgJWQsIGRpbW0gJWQsICVkIE1iICglZCBwYWdlcykgYmFuazogJWQsIHJhbms6ICVkLCByb3c6ICUjeCwgY29sOiAlI3hcbiIsCisJCQkJCXB2dC0+c2JyaWRnZV9kZXYtPm1jLCBpLCBqLAorCQkJCQlzaXplLCBucGFnZXMsCisJCQkJCWJhbmtzLCByYW5rcywgcm93cywgY29scyk7CisJCQkJY3NyID0gJm1jaS0+Y3Nyb3dzW2Nzcm93XTsKKworCQkJCWNzci0+Zmlyc3RfcGFnZSA9IGxhc3RfcGFnZTsKKwkJCQljc3ItPmxhc3RfcGFnZSA9IGxhc3RfcGFnZSArIG5wYWdlcyAtIDE7CisJCQkJY3NyLT5wYWdlX21hc2sgPSAwVUw7CS8qIFVudXNlZCAqLworCQkJCWNzci0+bnJfcGFnZXMgPSBucGFnZXM7CisJCQkJY3NyLT5ncmFpbiA9IDMyOworCQkJCWNzci0+Y3Nyb3dfaWR4ID0gY3Nyb3c7CisJCQkJY3NyLT5kdHlwZSA9IChiYW5rcyA9PSA4KSA/IERFVl9YOCA6IERFVl9YNDsKKwkJCQljc3ItPmNlX2NvdW50ID0gMDsKKwkJCQljc3ItPnVlX2NvdW50ID0gMDsKKwkJCQljc3ItPm10eXBlID0gbXR5cGU7CisJCQkJY3NyLT5lZGFjX21vZGUgPSBtb2RlOworCQkJCWNzci0+bnJfY2hhbm5lbHMgPSAxOworCQkJCWNzci0+Y2hhbm5lbHNbMF0uY2hhbl9pZHggPSBpOworCQkJCWNzci0+Y2hhbm5lbHNbMF0uY2VfY291bnQgPSAwOworCQkJCXB2dC0+Y3Nyb3dfbWFwW2ldW2pdID0gY3Nyb3c7CisJCQkJc25wcmludGYoY3NyLT5jaGFubmVsc1swXS5sYWJlbCwKKwkJCQkJIHNpemVvZihjc3ItPmNoYW5uZWxzWzBdLmxhYmVsKSwKKwkJCQkJICJDUFVfU3JjSUQjJXVfQ2hhbm5lbCMldV9ESU1NIyV1IiwKKwkJCQkJIHB2dC0+c2JyaWRnZV9kZXYtPnNvdXJjZV9pZCwgaSwgaik7CisJCQkJbGFzdF9wYWdlICs9IG5wYWdlczsKKwkJCQljc3JvdysrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9tZW1vcnlfbGF5b3V0KGNvbnN0IHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJaW50IGksIGosIGssIG5fc2Fkcywgbl90YWRzLCBzYWRfaW50ZXJsOworCXUzMiByZWc7CisJdTY0IGxpbWl0LCBwcnYgPSAwOworCXU2NCB0bXBfbWI7CisJdTMyIHJpcl93YXk7CisKKwkvKgorCSAqIFN0ZXAgMSkgR2V0IFRPTE0vVE9ITSByYW5nZXMKKwkgKi8KKworCS8qIEFkZHJlc3MgcmFuZ2UgaXMgMzI6MjggKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfc2FkMSwgVE9MTSwKKwkJCSAgICAgICZyZWcpOworCXB2dC0+dG9sbSA9IEdFVF9UT0xNKHJlZyk7CisJdG1wX21iID0gKDEgKyBwdnQtPnRvbG0pID4+IDIwOworCisJZGVidWdmMCgiVE9MTTogJUx1LiUwM0x1IEdCICgweCUwMTZMeClcbiIsCisJCXRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsICh1NjQpcHZ0LT50b2xtKTsKKworCS8qIEFkZHJlc3MgcmFuZ2UgaXMgYWxyZWFkeSA0NToyNSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9zYWQxLCBUT0hNLAorCQkJICAgICAgJnJlZyk7CisJcHZ0LT50b2htID0gR0VUX1RPSE0ocmVnKTsKKwl0bXBfbWIgPSAoMSArIHB2dC0+dG9obSkgPj4gMjA7CisKKwlkZWJ1Z2YwKCJUT0hNOiAlTHUuJTAzTHUgR0IgKDB4JTAxNkx4KSIsCisJCXRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsICh1NjQpcHZ0LT50b2htKTsKKworCS8qCisJICogU3RlcCAyKSBHZXQgU0FEIHJhbmdlIGFuZCBTQUQgSW50ZXJsZWF2ZSBsaXN0CisJICogVEFEIHJlZ2lzdGVycyBjb250YWluIHRoZSBpbnRlcmxlYXZlIHdheW5lc3MuIEhvd2V2ZXIsIGl0CisJICogc2VlbXMgc2ltcGxlciB0byBqdXN0IGRpc2NvdmVyIGl0IGluZGlyZWN0bHksIHdpdGggdGhlCisJICogYWxnb3JpdGhtIGJlbGxvdy4KKwkgKi8KKwlwcnYgPSAwOworCWZvciAobl9zYWRzID0gMDsgbl9zYWRzIDwgTUFYX1NBRDsgbl9zYWRzKyspIHsKKwkJLyogU0FEX0xJTUlUIEFkZHJlc3MgcmFuZ2UgaXMgNDU6MjYgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3NhZDAsIGRyYW1fcnVsZVtuX3NhZHNdLAorCQkJCSAgICAgICZyZWcpOworCQlsaW1pdCA9IFNBRF9MSU1JVChyZWcpOworCisJCWlmICghRFJBTV9SVUxFX0VOQUJMRShyZWcpKQorCQkJY29udGludWU7CisKKwkJaWYgKGxpbWl0IDw9IHBydikKKwkJCWJyZWFrOworCisJCXRtcF9tYiA9IChsaW1pdCArIDEpID4+IDIwOworCQlkZWJ1Z2YwKCJTQUQjJWQgJXMgdXAgdG8gJUx1LiUwM0x1IEdCICgweCUwMTZMeCkgJXMgcmVnPTB4JTA4eFxuIiwKKwkJCW5fc2FkcywKKwkJCWdldF9kcmFtX2F0dHIocmVnKSwKKwkJCXRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsCisJCQkoKHU2NCl0bXBfbWIpIDw8IDIwTCwKKwkJCUlOVEVSTEVBVkVfTU9ERShyZWcpID8gIkludGVybGVhdmU6IDg6NiIgOiAiSW50ZXJsZWF2ZTogWzg6Nl1YT1JbMTg6MTZdIiwKKwkJCXJlZyk7CisJCXBydiA9IGxpbWl0OworCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9zYWQwLCBpbnRlcmxlYXZlX2xpc3Rbbl9zYWRzXSwKKwkJCQkgICAgICAmcmVnKTsKKwkJc2FkX2ludGVybCA9IHNhZF9wa2cocmVnLCAwKTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJaWYgKGogPiAwICYmIHNhZF9pbnRlcmwgPT0gc2FkX3BrZyhyZWcsIGopKQorCQkJCWJyZWFrOworCisJCQlkZWJ1Z2YwKCJTQUQjJWQsIGludGVybGVhdmUgIyVkOiAlZFxuIiwKKwkJCW5fc2Fkcywgaiwgc2FkX3BrZyhyZWcsIGopKTsKKwkJfQorCX0KKworCS8qCisJICogU3RlcCAzKSBHZXQgVEFEIHJhbmdlCisJICovCisJcHJ2ID0gMDsKKwlmb3IgKG5fdGFkcyA9IDA7IG5fdGFkcyA8IE1BWF9UQUQ7IG5fdGFkcysrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9oYTAsIHRhZF9kcmFtX3J1bGVbbl90YWRzXSwKKwkJCQkgICAgICAmcmVnKTsKKwkJbGltaXQgPSBUQURfTElNSVQocmVnKTsKKwkJaWYgKGxpbWl0IDw9IHBydikKKwkJCWJyZWFrOworCQl0bXBfbWIgPSAobGltaXQgKyAxKSA+PiAyMDsKKworCQlkZWJ1Z2YwKCJUQUQjJWQ6IHVwIHRvICVMdS4lMDNMdSBHQiAoMHglMDE2THgpLCBzb2NrZXQgaW50ZXJsZWF2ZSAlZCwgbWVtb3J5IGludGVybGVhdmUgJWQsIFRHVDogJWQsICVkLCAlZCwgJWQsIHJlZz0weCUwOHhcbiIsCisJCQluX3RhZHMsIHRtcF9tYiAvIDEwMDAsIHRtcF9tYiAlIDEwMDAsCisJCQkoKHU2NCl0bXBfbWIpIDw8IDIwTCwKKwkJCSh1MzIpVEFEX1NPQ0socmVnKSwKKwkJCSh1MzIpVEFEX0NIKHJlZyksCisJCQkodTMyKVRBRF9UR1QwKHJlZyksCisJCQkodTMyKVRBRF9UR1QxKHJlZyksCisJCQkodTMyKVRBRF9UR1QyKHJlZyksCisJCQkodTMyKVRBRF9UR1QzKHJlZyksCisJCQlyZWcpOworCQlwcnYgPSB0bXBfbWI7CisJfQorCisJLyoKKwkgKiBTdGVwIDQpIEdldCBUQUQgb2Zmc2V0cywgcGVyIGVhY2ggY2hhbm5lbAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoIXB2dC0+Y2hhbm5lbFtpXS5kaW1tcykKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgbl90YWRzOyBqKyspIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YWRbaV0sCisJCQkJCSAgICAgIHRhZF9jaF9uaWx2X29mZnNldFtqXSwKKwkJCQkJICAgICAgJnJlZyk7CisJCQl0bXBfbWIgPSBUQURfT0ZGU0VUKHJlZykgPj4gMjA7CisJCQlkZWJ1Z2YwKCJUQUQgQ0gjJWQsIG9mZnNldCAjJWQ6ICVMdS4lMDNMdSBHQiAoMHglMDE2THgpLCByZWc9MHglMDh4XG4iLAorCQkJCWksIGosCisJCQkJdG1wX21iIC8gMTAwMCwgdG1wX21iICUgMTAwMCwKKwkJCQkoKHU2NCl0bXBfbWIpIDw8IDIwTCwKKwkJCQlyZWcpOworCQl9CisJfQorCisJLyoKKwkgKiBTdGVwIDYpIEdldCBSSVIgV2F5bmVzcy9MaW1pdCwgcGVyIGVhY2ggY2hhbm5lbAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoIXB2dC0+Y2hhbm5lbFtpXS5kaW1tcykKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX1JJUl9SQU5HRVM7IGorKykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtpXSwKKwkJCQkJICAgICAgcmlyX3dheV9saW1pdFtqXSwKKwkJCQkJICAgICAgJnJlZyk7CisKKwkJCWlmICghSVNfUklSX1ZBTElEKHJlZykpCisJCQkJY29udGludWU7CisKKwkJCXRtcF9tYiA9IFJJUl9MSU1JVChyZWcpID4+IDIwOworCQkJcmlyX3dheSA9IDEgPDwgUklSX1dBWShyZWcpOworCQkJZGVidWdmMCgiQ0gjJWQgUklSIyVkLCBsaW1pdDogJUx1LiUwM0x1IEdCICgweCUwMTZMeCksIHdheTogJWQsIHJlZz0weCUwOHhcbiIsCisJCQkJaSwgaiwKKwkJCQl0bXBfbWIgLyAxMDAwLCB0bXBfbWIgJSAxMDAwLAorCQkJCSgodTY0KXRtcF9tYikgPDwgMjBMLAorCQkJCXJpcl93YXksCisJCQkJcmVnKTsKKworCQkJZm9yIChrID0gMDsgayA8IHJpcl93YXk7IGsrKykgeworCQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YWRbaV0sCisJCQkJCQkgICAgICByaXJfb2Zmc2V0W2pdW2tdLAorCQkJCQkJICAgICAgJnJlZyk7CisJCQkJdG1wX21iID0gUklSX09GRlNFVChyZWcpIDw8IDY7CisKKwkJCQlkZWJ1Z2YwKCJDSCMlZCBSSVIjJWQgSU5UTCMlZCwgb2Zmc2V0ICVMdS4lMDNMdSBHQiAoMHglMDE2THgpLCB0Z3Q6ICVkLCByZWc9MHglMDh4XG4iLAorCQkJCQlpLCBqLCBrLAorCQkJCQl0bXBfbWIgLyAxMDAwLCB0bXBfbWIgJSAxMDAwLAorCQkJCQkoKHU2NCl0bXBfbWIpIDw8IDIwTCwKKwkJCQkJKHUzMilSSVJfUk5LX1RHVChyZWcpLAorCQkJCQlyZWcpOworCQkJfQorCQl9CisJfQorfQorCitzdHJ1Y3QgbWVtX2N0bF9pbmZvICpnZXRfbWNpX2Zvcl9ub2RlX2lkKHU4IG5vZGVfaWQpCit7CisJc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JyaWRnZV9kZXYsICZzYnJpZGdlX2VkYWNfbGlzdCwgbGlzdCkgeworCQlpZiAoc2JyaWRnZV9kZXYtPm5vZGVfaWQgPT0gbm9kZV9pZCkKKwkJCXJldHVybiBzYnJpZGdlX2Rldi0+bWNpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfbWVtb3J5X2Vycm9yX2RhdGEoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSB1NjQgYWRkciwKKwkJCQkgdTggKnNvY2tldCwKKwkJCQkgbG9uZyAqY2hhbm5lbF9tYXNrLAorCQkJCSB1OCAqcmFuaywKKwkJCQkgY2hhciAqYXJlYV90eXBlKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8JKm5ld19tY2k7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCWNoYXIJCQltc2dbMjU2XTsKKwlpbnQgCQkJbl9yaXIsIG5fc2Fkcywgbl90YWRzLCBzYWRfd2F5LCBzY2tfeGNoOworCWludAkJCXNhZF9pbnRlcmwsIGlkeCwgYmFzZV9jaDsKKwlpbnQJCQlpbnRlcmxlYXZlX21vZGU7CisJdW5zaWduZWQJCXNhZF9pbnRlcmxlYXZlW01BWF9JTlRFUkxFQVZFXTsKKwl1MzIJCQlyZWc7CisJdTgJCQljaF93YXksc2NrX3dheTsKKwl1MzIJCQl0YWRfb2Zmc2V0OworCXUzMgkJCXJpcl93YXk7CisJdTY0CQkJY2hfYWRkciwgb2Zmc2V0LCBsaW1pdCwgcHJ2ID0gMDsKKworCisJLyoKKwkgKiBTdGVwIDApIENoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIGF0IHNwZWNpYWwgbWVtb3J5IHJhbmdlcworCSAqIFRoZSBjaGVjayBiZWxsb3cgaXMgcHJvYmFibHkgZW5vdWdoIHRvIGZpbGwgYWxsIGNhc2VzIHdoZXJlCisJICogdGhlIGVycm9yIGlzIG5vdCBpbnNpZGUgYSBtZW1vcnksIGV4Y2VwdCBmb3IgdGhlIGxlZ2FjeQorCSAqIHJhbmdlIChlLiBnLiBWR0EgYWRkcmVzc2VzKS4gSXQgaXMgdW5saWtlbHksIGhvd2V2ZXIsIHRoYXQgdGhlCisJICogbWVtb3J5IGNvbnRyb2xsZXIgd291bGQgZ2VuZXJhdGUgYW4gZXJyb3Igb24gdGhhdCByYW5nZS4KKwkgKi8KKwlpZiAoKGFkZHIgPiAodTY0KSBwdnQtPnRvbG0pICYmIChhZGRyIDwgKDFMIDw8IDMyKSkpIHsKKwkJc3ByaW50Zihtc2csICJFcnJvciBhdCBUT0xNIGFyZWEsIG9uIGFkZHIgMHglMDhMeCIsIGFkZHIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChhZGRyID49ICh1NjQpcHZ0LT50b2htKSB7CisJCXNwcmludGYobXNnLCAiRXJyb3IgYXQgTU1JT0ggYXJlYSwgb24gYWRkciAweCUwMTZMeCIsIGFkZHIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBTdGVwIDEpIEdldCBzb2NrZXQKKwkgKi8KKwlmb3IgKG5fc2FkcyA9IDA7IG5fc2FkcyA8IE1BWF9TQUQ7IG5fc2FkcysrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9zYWQwLCBkcmFtX3J1bGVbbl9zYWRzXSwKKwkJCQkgICAgICAmcmVnKTsKKworCQlpZiAoIURSQU1fUlVMRV9FTkFCTEUocmVnKSkKKwkJCWNvbnRpbnVlOworCisJCWxpbWl0ID0gU0FEX0xJTUlUKHJlZyk7CisJCWlmIChsaW1pdCA8PSBwcnYpIHsKKwkJCXNwcmludGYobXNnLCAiQ2FuJ3QgZGlzY292ZXIgdGhlIG1lbW9yeSBzb2NrZXQiKTsKKwkJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgIChhZGRyIDw9IGxpbWl0KQorCQkJYnJlYWs7CisJCXBydiA9IGxpbWl0OworCX0KKwlpZiAobl9zYWRzID09IE1BWF9TQUQpIHsKKwkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciB0aGUgbWVtb3J5IHNvY2tldCIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFyZWFfdHlwZSA9IGdldF9kcmFtX2F0dHIocmVnKTsKKwlpbnRlcmxlYXZlX21vZGUgPSBJTlRFUkxFQVZFX01PREUocmVnKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV9zYWQwLCBpbnRlcmxlYXZlX2xpc3Rbbl9zYWRzXSwKKwkJCSAgICAgICZyZWcpOworCXNhZF9pbnRlcmwgPSBzYWRfcGtnKHJlZywgMCk7CisJZm9yIChzYWRfd2F5ID0gMDsgc2FkX3dheSA8IDg7IHNhZF93YXkrKykgeworCQlpZiAoc2FkX3dheSA+IDAgJiYgc2FkX2ludGVybCA9PSBzYWRfcGtnKHJlZywgc2FkX3dheSkpCisJCQlicmVhazsKKwkJc2FkX2ludGVybGVhdmVbc2FkX3dheV0gPSBzYWRfcGtnKHJlZywgc2FkX3dheSk7CisJCWRlYnVnZjAoIlNBRCBpbnRlcmxlYXZlICMlZDogJWRcbiIsCisJCQlzYWRfd2F5LCBzYWRfaW50ZXJsZWF2ZVtzYWRfd2F5XSk7CisJfQorCWRlYnVnZjAoIm1jIyVkOiBFcnJvciBkZXRlY3RlZCBvbiBTQUQjJWQ6IGFkZHJlc3MgMHglMDE2THggPCAweCUwMTZMeCwgSW50ZXJsZWF2ZSBbJWQ6Nl0lc1xuIiwKKwkJcHZ0LT5zYnJpZGdlX2Rldi0+bWMsCisJCW5fc2FkcywKKwkJYWRkciwKKwkJbGltaXQsCisJCXNhZF93YXkgKyA3LAorCQlJTlRFUkxFQVZFX01PREUocmVnKSA/ICIiIDogIlhPUlsxODoxNl0iKTsKKwlpZiAoaW50ZXJsZWF2ZV9tb2RlKQorCQlpZHggPSAoKGFkZHIgPj4gNikgXiAoYWRkciA+PiAxNikpICYgNzsKKwllbHNlCisJCWlkeCA9IChhZGRyID4+IDYpICYgNzsKKwlzd2l0Y2ggKHNhZF93YXkpIHsKKwljYXNlIDE6CisJCWlkeCA9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWR4ID0gaWR4ICYgMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpZHggPSBpZHggJiAzOworCQlicmVhazsKKwljYXNlIDg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwcmludGYobXNnLCAiQ2FuJ3QgZGlzY292ZXIgc29ja2V0IGludGVybGVhdmUiKTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqc29ja2V0ID0gc2FkX2ludGVybGVhdmVbaWR4XTsKKwlkZWJ1Z2YwKCJTQUQgaW50ZXJsZWF2ZSBpbmRleDogJWQgKHdheW5lc3MgJWQpID0gQ1BVIHNvY2tldCAlZFxuIiwKKwkJaWR4LCBzYWRfd2F5LCAqc29ja2V0KTsKKworCS8qCisJICogTW92ZSB0byB0aGUgcHJvcGVyIG5vZGUgc3RydWN0dXJlLCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlCisJICogcmlnaHQgUENJIHJlZ2lzdGVycworCSAqLworCW5ld19tY2kgPSBnZXRfbWNpX2Zvcl9ub2RlX2lkKCpzb2NrZXQpOworCWlmICghbmV3X21jaSkgeworCQlzcHJpbnRmKG1zZywgIlN0cnVjdCBmb3Igc29ja2V0ICMldSB3YXNuJ3QgaW5pdGlhbGl6ZWQiLAorCQkJKnNvY2tldCk7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWNpID0gbmV3X21jaTsKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJLyoKKwkgKiBTdGVwIDIpIEdldCBtZW1vcnkgY2hhbm5lbAorCSAqLworCXBydiA9IDA7CisJZm9yIChuX3RhZHMgPSAwOyBuX3RhZHMgPCBNQVhfVEFEOyBuX3RhZHMrKykgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfaGEwLCB0YWRfZHJhbV9ydWxlW25fdGFkc10sCisJCQkJICAgICAgJnJlZyk7CisJCWxpbWl0ID0gVEFEX0xJTUlUKHJlZyk7CisJCWlmIChsaW1pdCA8PSBwcnYpIHsKKwkJCXNwcmludGYobXNnLCAiQ2FuJ3QgZGlzY292ZXIgdGhlIG1lbW9yeSBjaGFubmVsIik7CisJCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICAoYWRkciA8PSBsaW1pdCkKKwkJCWJyZWFrOworCQlwcnYgPSBsaW1pdDsKKwl9CisJY2hfd2F5ID0gVEFEX0NIKHJlZykgKyAxOworCXNja193YXkgPSBUQURfU09DSyhyZWcpICsgMTsKKwkvKgorCSAqIEZJWE1FOiBJcyBpdCByaWdodCB0byBhbHdheXMgdXNlIGNoYW5uZWwgMCBmb3Igb2Zmc2V0cz8KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5wY2lfdGFkWzBdLAorCQkJCXRhZF9jaF9uaWx2X29mZnNldFtuX3RhZHNdLAorCQkJCSZ0YWRfb2Zmc2V0KTsKKworCWlmIChjaF93YXkgPT0gMykKKwkJaWR4ID0gYWRkciA+PiA2OworCWVsc2UKKwkJaWR4ID0gYWRkciA+PiAoNiArIHNja193YXkpOworCWlkeCA9IGlkeCAlIGNoX3dheTsKKworCS8qCisJICogRklYTUU6IFNob3VsZG4ndCB3ZSB1c2UgQ0hOX0lEWF9PRkZTRVQoKSBoZXJlLCB3aGVuIGNoX3dheSA9PSAzID8/PworCSAqLworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAwOgorCQliYXNlX2NoID0gVEFEX1RHVDAocmVnKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQliYXNlX2NoID0gVEFEX1RHVDEocmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQliYXNlX2NoID0gVEFEX1RHVDIocmVnKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQliYXNlX2NoID0gVEFEX1RHVDMocmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciB0aGUgVEFEIHRhcmdldCIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSpjaGFubmVsX21hc2sgPSAxIDw8IGJhc2VfY2g7CisKKwlpZiAocHZ0LT5pc19taXJyb3JlZCkgeworCQkqY2hhbm5lbF9tYXNrIHw9IDEgPDwgKChiYXNlX2NoICsgMikgJSA0KTsKKwkJc3dpdGNoKGNoX3dheSkgeworCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJCXNja194Y2ggPSAxIDw8IHNja193YXkgKiAoY2hfd2F5ID4+IDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKG1zZywgIkludmFsaWQgbWlycm9yIHNldC4gQ2FuJ3QgZGVjb2RlIGFkZHIiKTsKKwkJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UKKwkJc2NrX3hjaCA9ICgxIDw8IHNja193YXkpICogY2hfd2F5OworCisJaWYgKHB2dC0+aXNfbG9ja3N0ZXApCisJCSpjaGFubmVsX21hc2sgfD0gMSA8PCAoKGJhc2VfY2ggKyAxKSAlIDQpOworCisJb2Zmc2V0ID0gVEFEX09GRlNFVCh0YWRfb2Zmc2V0KTsKKworCWRlYnVnZjAoIlRBRCMlZDogYWRkcmVzcyAweCUwMTZMeCA8IDB4JTAxNkx4LCBzb2NrZXQgaW50ZXJsZWF2ZSAlZCwgY2hhbm5lbCBpbnRlcmxlYXZlICVkIChvZmZzZXQgMHglMDhMeCksIGluZGV4ICVkLCBiYXNlIGNoOiAlZCwgY2ggbWFzazogMHglMDJseFxuIiwKKwkJbl90YWRzLAorCQlhZGRyLAorCQlsaW1pdCwKKwkJKHUzMilUQURfU09DSyhyZWcpLAorCQljaF93YXksCisJCW9mZnNldCwKKwkJaWR4LAorCQliYXNlX2NoLAorCQkqY2hhbm5lbF9tYXNrKTsKKworCS8qIENhbGN1bGF0ZSBjaGFubmVsIGFkZHJlc3MgKi8KKwkvKiBSZW1vdmUgdGhlIFRBRCBvZmZzZXQgKi8KKworCWlmIChvZmZzZXQgPiBhZGRyKSB7CisJCXNwcmludGYobXNnLCAiQ2FuJ3QgY2FsY3VsYXRlIGNoIGFkZHI6IFRBRCBvZmZzZXQgMHglMDhMeCBpcyB0b28gaGlnaCBmb3IgYWRkciAweCUwOEx4ISIsCisJCQlvZmZzZXQsIGFkZHIpOworCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgbXNnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWFkZHIgLT0gb2Zmc2V0OworCS8qIFN0b3JlIHRoZSBsb3cgYml0cyBbMDo2XSBvZiB0aGUgYWRkciAqLworCWNoX2FkZHIgPSBhZGRyICYgMHg3ZjsKKwkvKiBSZW1vdmUgc29ja2V0IHdheW5lc3MgYW5kIHJlbW92ZSA2IGJpdHMgKi8KKwlhZGRyID4+PSA2OworCWFkZHIgLz0gc2NrX3hjaDsKKyNpZiAwCisJLyogRGl2aWRlIGJ5IGNoYW5uZWwgd2F5ICovCisJYWRkciA9IGFkZHIgLyBjaF93YXk7CisjZW5kaWYKKwkvKiBSZWNvdmVyIHRoZSBsYXN0IDYgYml0cyAqLworCWNoX2FkZHIgfD0gYWRkciA8PCA2OworCisJLyoKKwkgKiBTdGVwIDMpIERlY29kZSByYW5rCisJICovCisJZm9yIChuX3JpciA9IDA7IG5fcmlyIDwgTUFYX1JJUl9SQU5HRVM7IG5fcmlyKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+cGNpX3RhZFtiYXNlX2NoXSwKKwkJCQkgICAgICByaXJfd2F5X2xpbWl0W25fcmlyXSwKKwkJCQkgICAgICAmcmVnKTsKKworCQlpZiAoIUlTX1JJUl9WQUxJRChyZWcpKQorCQkJY29udGludWU7CisKKwkJbGltaXQgPSBSSVJfTElNSVQocmVnKTsKKworCQlkZWJ1Z2YwKCJSSVIjJWQsIGxpbWl0OiAlTHUuJTAzTHUgR0IgKDB4JTAxNkx4KSwgd2F5OiAlZFxuIiwKKwkJCW5fcmlyLAorCQkJKGxpbWl0ID4+IDIwKSAvIDEwMDAsIChsaW1pdCA+PiAyMCkgJSAxMDAwLAorCQkJbGltaXQsCisJCQkxIDw8IFJJUl9XQVkocmVnKSk7CisJCWlmICAoY2hfYWRkciA8PSBsaW1pdCkKKwkJCWJyZWFrOworCX0KKwlpZiAobl9yaXIgPT0gTUFYX1JJUl9SQU5HRVMpIHsKKwkJc3ByaW50Zihtc2csICJDYW4ndCBkaXNjb3ZlciB0aGUgbWVtb3J5IHJhbmsgZm9yIGNoIGFkZHIgMHglMDhMeCIsCisJCQljaF9hZGRyKTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIG1zZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyaXJfd2F5ID0gUklSX1dBWShyZWcpOworCWlmIChwdnQtPmlzX2Nsb3NlX3BnKQorCQlpZHggPSAoY2hfYWRkciA+PiA2KTsKKwllbHNlCisJCWlkeCA9IChjaF9hZGRyID4+IDEzKTsJLyogRklYTUU6IERhdGFzaGVldCBzYXlzIHRvIHNoaWZ0IGJ5IDE1ICovCisJaWR4ICU9IDEgPDwgcmlyX3dheTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnBjaV90YWRbYmFzZV9jaF0sCisJCQkgICAgICByaXJfb2Zmc2V0W25fcmlyXVtpZHhdLAorCQkJICAgICAgJnJlZyk7CisJKnJhbmsgPSBSSVJfUk5LX1RHVChyZWcpOworCisJZGVidWdmMCgiUklSIyVkOiBjaGFubmVsIGFkZHJlc3MgMHglMDhMeCA8IDB4JTA4THgsIFJJUiBpbnRlcmxlYXZlICVkLCBpbmRleCAlZFxuIiwKKwkJbl9yaXIsCisJCWNoX2FkZHIsCisJCWxpbWl0LAorCQlyaXJfd2F5LAorCQlpZHgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJRGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzOiBwdXQvZ2V0LCBpbml0L2V4aXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJc2JyaWRnZV9wdXRfYWxsX2RldmljZXMJJ3B1dCcgYWxsIHRoZSBkZXZpY2VzIHRoYXQgd2UgaGF2ZQorICoJCQkJcmVzZXJ2ZWQgdmlhICdnZXQnCisgKi8KK3N0YXRpYyB2b2lkIHNicmlkZ2VfcHV0X2RldmljZXMoc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldikKK3sKKwlpbnQgaTsKKworCWRlYnVnZjAoX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCWZvciAoaSA9IDA7IGkgPCBzYnJpZGdlX2Rldi0+bl9kZXZzOyBpKyspIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBzYnJpZGdlX2Rldi0+cGRldltpXTsKKwkJaWYgKCFwZGV2KQorCQkJY29udGludWU7CisJCWRlYnVnZjAoIlJlbW92aW5nIGRldiAlMDJ4OiUwMnguJWRcbiIsCisJCQlwZGV2LT5idXMtPm51bWJlciwKKwkJCVBDSV9TTE9UKHBkZXYtPmRldmZuKSwgUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYnJpZGdlX3B1dF9hbGxfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXYsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2JyaWRnZV9kZXYsIHRtcCwgJnNicmlkZ2VfZWRhY19saXN0LCBsaXN0KSB7CisJCXNicmlkZ2VfcHV0X2RldmljZXMoc2JyaWRnZV9kZXYpOworCQlmcmVlX3NicmlkZ2VfZGV2KHNicmlkZ2VfZGV2KTsKKwl9Cit9CisKKy8qCisgKglzYnJpZGdlX2dldF9hbGxfZGV2aWNlcwlGaW5kIGFuZCBwZXJmb3JtICdnZXQnIG9wZXJhdGlvbiBvbiB0aGUgTUNIJ3MKKyAqCQkJZGV2aWNlL2Z1bmN0aW9ucyB3ZSB3YW50IHRvIHJlZmVyZW5jZSBmb3IgdGhpcyBkcml2ZXIKKyAqCisgKgkJCU5lZWQgdG8gJ2dldCcgZGV2aWNlIDE2IGZ1bmMgMSBhbmQgZnVuYyAyCisgKi8KK3N0YXRpYyBpbnQgc2JyaWRnZV9nZXRfb25lZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICoqcHJldiwKKwkJCQkgdTggKm51bV9tYywKKwkJCQkgY29uc3Qgc3RydWN0IHBjaV9pZF90YWJsZSAqdGFibGUsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGRldm5vKQoreworCXN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXY7CisJY29uc3Qgc3RydWN0IHBjaV9pZF9kZXNjciAqZGV2X2Rlc2NyID0gJnRhYmxlLT5kZXNjcltkZXZub107CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdTggYnVzID0gMDsKKworCXNicmlkZ2VfcHJpbnRrKEtFUk5fSU5GTywKKwkJIlNlZWtpbmcgZm9yOiBkZXYgJTAyeC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAorCQlkZXZfZGVzY3ItPmRldiwgZGV2X2Rlc2NyLT5mdW5jLAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCk7CisKKwlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIGRldl9kZXNjci0+ZGV2X2lkLCAqcHJldik7CisKKwlpZiAoIXBkZXYpIHsKKwkJaWYgKCpwcmV2KSB7CisJCQkqcHJldiA9IHBkZXY7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChkZXZfZGVzY3ItPm9wdGlvbmFsKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGRldm5vID09IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0lORk8sCisJCQkiRGV2aWNlIG5vdCBmb3VuZDogZGV2ICUwMnguJWQgUENJIElEICUwNHg6JTA0eFxuIiwKKwkJCWRldl9kZXNjci0+ZGV2LCBkZXZfZGVzY3ItPmZ1bmMsCisJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCk7CisKKwkJLyogRW5kIG9mIGxpc3QsIGxlYXZlICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwlidXMgPSBwZGV2LT5idXMtPm51bWJlcjsKKworCXNicmlkZ2VfZGV2ID0gZ2V0X3NicmlkZ2VfZGV2KGJ1cyk7CisJaWYgKCFzYnJpZGdlX2RldikgeworCQlzYnJpZGdlX2RldiA9IGFsbG9jX3NicmlkZ2VfZGV2KGJ1cywgdGFibGUpOworCQlpZiAoIXNicmlkZ2VfZGV2KSB7CisJCQlwY2lfZGV2X3B1dChwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCSgqbnVtX21jKSsrOworCX0KKworCWlmIChzYnJpZGdlX2Rldi0+cGRldltkZXZub10pIHsKKwkJc2JyaWRnZV9wcmludGsoS0VSTl9FUlIsCisJCQkiRHVwbGljYXRlZCBkZXZpY2UgZm9yICIKKwkJCSJkZXYgJTAyeDolZC4lZCBQQ0kgSUQgJTA0eDolMDR4XG4iLAorCQkJYnVzLCBkZXZfZGVzY3ItPmRldiwgZGV2X2Rlc2NyLT5mdW5jLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2X2Rlc2NyLT5kZXZfaWQpOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2JyaWRnZV9kZXYtPnBkZXZbZGV2bm9dID0gcGRldjsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICh1bmxpa2VseShQQ0lfU0xPVChwZGV2LT5kZXZmbikgIT0gZGV2X2Rlc2NyLT5kZXYgfHwKKwkJCVBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSBkZXZfZGVzY3ItPmZ1bmMpKSB7CisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLAorCQkJIkRldmljZSBQQ0kgSUQgJTA0eDolMDR4ICIKKwkJCSJoYXMgZGV2ICUwMng6JWQuJWQgaW5zdGVhZCBvZiBkZXYgJTAyeDolMDJ4LiVkXG4iLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2X2Rlc2NyLT5kZXZfaWQsCisJCQlidXMsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLAorCQkJYnVzLCBkZXZfZGVzY3ItPmRldiwgZGV2X2Rlc2NyLT5mdW5jKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQmUgc3VyZSB0aGF0IHRoZSBkZXZpY2UgaXMgZW5hYmxlZCAqLworCWlmICh1bmxpa2VseShwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApKSB7CisJCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLAorCQkJIkNvdWxkbid0IGVuYWJsZSAiCisJCQkiZGV2ICUwMng6JWQuJWQgUENJIElEICUwNHg6JTA0eFxuIiwKKwkJCWJ1cywgZGV2X2Rlc2NyLT5kZXYsIGRldl9kZXNjci0+ZnVuYywKKwkJCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldl9kZXNjci0+ZGV2X2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGVidWdmMCgiRGV0ZWN0ZWQgZGV2ICUwMng6JWQuJWQgUENJIElEICUwNHg6JTA0eFxuIiwKKwkJYnVzLCBkZXZfZGVzY3ItPmRldiwKKwkJZGV2X2Rlc2NyLT5mdW5jLAorCQlQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZfZGVzY3ItPmRldl9pZCk7CisKKwkvKgorCSAqIEFzIHN0YXRlZCBvbiBkcml2ZXJzL3BjaS9zZWFyY2guYywgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IKKwkgKiBAZnJvbSBpcyBhbHdheXMgZGVjcmVtZW50ZWQgaWYgaXQgaXMgbm90ICVOVUxMLiBTbywgYXMgd2UgbmVlZAorCSAqIHRvIGdldCBhbGwgZGV2aWNlcyB1cCB0byBudWxsLCB3ZSBuZWVkIHRvIGRvIGEgZ2V0IGZvciB0aGUgZGV2aWNlCisJICovCisJcGNpX2Rldl9nZXQocGRldik7CisKKwkqcHJldiA9IHBkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnJpZGdlX2dldF9hbGxfZGV2aWNlcyh1OCAqbnVtX21jKQoreworCWludCBpLCByYzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHBjaV9pZF90YWJsZSAqdGFibGUgPSBwY2lfZGV2X2Rlc2NyX3NicmlkZ2VfdGFibGU7CisKKwl3aGlsZSAodGFibGUgJiYgdGFibGUtPmRlc2NyKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bl9kZXZzOyBpKyspIHsKKwkJCXBkZXYgPSBOVUxMOworCQkJZG8geworCQkJCXJjID0gc2JyaWRnZV9nZXRfb25lZGV2aWNlKCZwZGV2LCBudW1fbWMsCisJCQkJCQkJICAgdGFibGUsIGkpOworCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkJaSA9IHRhYmxlLT5uX2RldnM7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzYnJpZGdlX3B1dF9hbGxfZGV2aWNlcygpOworCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQl9CisJCQl9IHdoaWxlIChwZGV2KTsKKwkJfQorCQl0YWJsZSsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jaV9iaW5kX2RldnMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJIHN0cnVjdCBzYnJpZGdlX2RldiAqc2JyaWRnZV9kZXYpCit7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWludCBpLCBmdW5jLCBzbG90OworCisJZm9yIChpID0gMDsgaSA8IHNicmlkZ2VfZGV2LT5uX2RldnM7IGkrKykgeworCQlwZGV2ID0gc2JyaWRnZV9kZXYtPnBkZXZbaV07CisJCWlmICghcGRldikKKwkJCWNvbnRpbnVlOworCQlzbG90ID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pOworCQlmdW5jID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCQlzd2l0Y2ggKHNsb3QpIHsKKwkJY2FzZSAxMjoKKwkJCXN3aXRjaCAoZnVuYykgeworCQkJY2FzZSA2OgorCQkJCXB2dC0+cGNpX3NhZDAgPSBwZGV2OworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCXB2dC0+cGNpX3NhZDEgPSBwZGV2OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTM6CisJCQlzd2l0Y2ggKGZ1bmMpIHsKKwkJCWNhc2UgNjoKKwkJCQlwdnQtPnBjaV9iciA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNDoKKwkJCXN3aXRjaCAoZnVuYykgeworCQkJY2FzZSAwOgorCQkJCXB2dC0+cGNpX2hhMCA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCXN3aXRjaCAoZnVuYykgeworCQkJY2FzZSAwOgorCQkJCXB2dC0+cGNpX3RhID0gcGRldjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlwdnQtPnBjaV9yYXMgPSBwZGV2OworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJY2FzZSAzOgorCQkJY2FzZSA0OgorCQkJY2FzZSA1OgorCQkJCXB2dC0+cGNpX3RhZFtmdW5jIC0gMl0gPSBwZGV2OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTc6CisJCQlzd2l0Y2ggKGZ1bmMpIHsKKwkJCWNhc2UgMDoKKwkJCQlwdnQtPnBjaV9kZHJpbyA9IHBkZXY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlkZWJ1Z2YwKCJBc3NvY2lhdGVkIFBDSSAlMDJ4LiUwMmQuJWQgd2l0aCBkZXYgPSAlcFxuIiwKKwkJCXNicmlkZ2VfZGV2LT5idXMsCisJCQlQQ0lfU0xPVChwZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwKKwkJCXBkZXYpOworCX0KKworCS8qIENoZWNrIGlmIGV2ZXJ5dGhpbmcgd2VyZSByZWdpc3RlcmVkICovCisJaWYgKCFwdnQtPnBjaV9zYWQwIHx8ICFwdnQtPnBjaV9zYWQxIHx8ICFwdnQtPnBjaV9oYTAgfHwKKwkgICAgIXB2dC0+IHBjaV90YWQgfHwgIXB2dC0+cGNpX3JhcyAgfHwgIXB2dC0+cGNpX3RhIHx8CisJICAgICFwdnQtPnBjaV9kZHJpbykKKwkJZ290byBlbm9kZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKCFwdnQtPnBjaV90YWRbaV0pCisJCQlnb3RvIGVub2RldjsKKwl9CisJcmV0dXJuIDA7CisKK2Vub2RldjoKKwlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIlNvbWUgbmVlZGVkIGRldmljZXMgYXJlIG1pc3NpbmdcbiIpOworCXJldHVybiAtRU5PREVWOworCitlcnJvcjoKKwlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkRldmljZSAlZCwgZnVuY3Rpb24gJWQgIgorCQkgICAgICAiaXMgb3V0IG9mIHRoZSBleHBlY3RlZCByYW5nZVxuIiwKKwkJICAgICAgc2xvdCwgZnVuYyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlFcnJvciBjaGVjayByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBXaGlsZSBTYW5keSBCcmlkZ2UgaGFzIGVycm9yIGNvdW50IHJlZ2lzdGVycywgU01JIEJJT1MgcmVhZCB2YWx1ZXMgZnJvbQorICogYW5kIHJlc2V0cyB0aGUgY291bnRlcnMuIFNvLCB0aGV5IGFyZSBub3QgcmVsaWFibGUgZm9yIHRoZSBPUyB0byByZWFkCisgKiBmcm9tIHRoZW0uIFNvLCB3ZSBoYXZlIG5vIG9wdGlvbiBidXQgdG8ganVzdCB0cnVzdCBvbiB3aGF0ZXZlciBNQ0UgaXMKKyAqIHRlbGxpbmcgdXMgYWJvdXQgdGhlIGVycm9ycy4KKyAqLworc3RhdGljIHZvaWQgc2JyaWRnZV9tY2Vfb3V0cHV0X2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG1jZSAqbSkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICpuZXdfbWNpOworCXN0cnVjdCBzYnJpZGdlX3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwljaGFyICp0eXBlLCAqb3B0eXBlLCAqbXNnLCAqcmVjb3ZlcmFibGVfbXNnOworCWJvb2wgcmlwdiA9IEdFVF9CSVRGSUVMRChtLT5tY2dzdGF0dXMsIDAsIDApOworCWJvb2wgb3ZlcmZsb3cgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MiwgNjIpOworCWJvb2wgdW5jb3JyZWN0ZWRfZXJyb3IgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MSwgNjEpOworCWJvb2wgcmVjb3ZlcmFibGUgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA1NiwgNTYpOworCXUzMiBjb3JlX2Vycl9jbnQgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCAzOCwgNTIpOworCXUzMiBtc2NvZCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDE2LCAzMSk7CisJdTMyIGVycmNvZGUgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCAwLCAxNSk7CisJdTMyIGNoYW5uZWwgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCAwLCAzKTsKKwl1MzIgb3B0eXBlbnVtID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgNCwgNik7CisJbG9uZyBjaGFubmVsX21hc2ssIGZpcnN0X2NoYW5uZWw7CisJdTggIHJhbmssIHNvY2tldDsKKwlpbnQgY3Nyb3csIHJjLCBkaW1tOworCWNoYXIgKmFyZWFfdHlwZSA9ICJVbmtub3duIjsKKworCWlmIChyaXB2KQorCQl0eXBlID0gIk5PTl9GQVRBTCI7CisJZWxzZQorCQl0eXBlID0gIkZBVEFMIjsKKworCS8qCisJICogQWNjb3JkaW5nIHdpdGggVGFibGUgMTUtOSBvZiB0aGUgSW50ZWwgQXJjaGljdGVjdHVyZSBzcGVjIHZvbCAzQSwKKwkgKiBtZW1vcnkgZXJyb3JzIHNob3VsZCBmaXQgaW4gdGhpcyBtYXNrOgorCSAqCTAwMGYgMDAwMCAxbW1tIGNjY2MgKGJpbmFyeSkKKwkgKiB3aGVyZToKKwkgKglmID0gQ29ycmVjdGlvbiBSZXBvcnQgRmlsdGVyaW5nIEJpdC4gSWYgMSwgc3Vic2VxdWVudCBlcnJvcnMKKwkgKgkgICAgd29uJ3QgYmUgc2hvd24KKwkgKgltbW0gPSBlcnJvciB0eXBlCisJICoJY2NjYyA9IGNoYW5uZWwKKwkgKiBJZiB0aGUgbWFzayBkb2Vzbid0IG1hdGNoLCByZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHBhcnNpbmcgbG9naWMKKwkgKi8KKwlpZiAoISAoKGVycmNvZGUgJiAweGVmODApID09IDB4ODApKSB7CisJCW9wdHlwZSA9ICJDYW4ndCBwYXJzZTogaXQgaXMgbm90IGEgbWVtIjsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKG9wdHlwZW51bSkgeworCQljYXNlIDA6CisJCQlvcHR5cGUgPSAiZ2VuZXJpYyB1bmRlZiByZXF1ZXN0IjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlvcHR5cGUgPSAibWVtb3J5IHJlYWQiOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW9wdHlwZSA9ICJtZW1vcnkgd3JpdGUiOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW9wdHlwZSA9ICJhZGRyL2NtZCI7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJb3B0eXBlID0gIm1lbW9yeSBzY3J1YmJpbmciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvcHR5cGUgPSAicmVzZXJ2ZWQiOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyYyA9IGdldF9tZW1vcnlfZXJyb3JfZGF0YShtY2ksIG0tPmFkZHIsICZzb2NrZXQsCisJCQkJICAgJmNoYW5uZWxfbWFzaywgJnJhbmssIGFyZWFfdHlwZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuOworCW5ld19tY2kgPSBnZXRfbWNpX2Zvcl9ub2RlX2lkKHNvY2tldCk7CisJaWYgKCFuZXdfbWNpKSB7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCAiRXJyb3I6IHNvY2tldCBnb3QgY29ycnVwdGVkISIpOworCQlyZXR1cm47CisJfQorCW1jaSA9IG5ld19tY2k7CisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCWZpcnN0X2NoYW5uZWwgPSBmaW5kX2ZpcnN0X2JpdCgmY2hhbm5lbF9tYXNrLCBOVU1fQ0hBTk5FTFMpOworCisJaWYgKHJhbmsgPCA0KQorCQlkaW1tID0gMDsKKwllbHNlIGlmIChyYW5rIDwgOCkKKwkJZGltbSA9IDE7CisJZWxzZQorCQlkaW1tID0gMjsKKworCWNzcm93ID0gcHZ0LT5jc3Jvd19tYXBbZmlyc3RfY2hhbm5lbF1bZGltbV07CisKKwlpZiAodW5jb3JyZWN0ZWRfZXJyb3IgJiYgcmVjb3ZlcmFibGUpCisJCXJlY292ZXJhYmxlX21zZyA9ICIgcmVjb3ZlcmFibGUiOworCWVsc2UKKwkJcmVjb3ZlcmFibGVfbXNnID0gIiI7CisKKwkvKgorCSAqIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyB3aXRoICJjaGFubmVsIiBpbmZvcm1hdGlvbiBvbiBtY2Vsb2c/CisJICogUHJvYmFibHksIHdlIGNhbiBqdXN0IGRpc2NhcmQgaXQsIGFzIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uCisJICogY29tZXMgZnJvbSB0aGUgZ2V0X21lbW9yeV9lcnJvcl9kYXRhKCkgYWRkcmVzcyBkZWNvZGluZworCSAqLworCW1zZyA9IGthc3ByaW50ZihHRlBfQVRPTUlDLAorCQkJIiVkICVzIGVycm9yKHMpOiAlcyBvbiAlcyBhcmVhICVzJXM6IGNwdT0lZCBFcnI9JTA0eDolMDR4IChjaD0lZCksICIKKwkJCSJhZGRyID0gMHglMDhsbHggPT4gc29ja2V0PSVkLCBDaGFubmVsPSVsZChtYXNrPSVsZCksIHJhbms9JWRcbiIsCisJCQljb3JlX2Vycl9jbnQsCisJCQlhcmVhX3R5cGUsCisJCQlvcHR5cGUsCisJCQl0eXBlLAorCQkJcmVjb3ZlcmFibGVfbXNnLAorCQkJb3ZlcmZsb3cgPyAiT1ZFUkZMT1ciIDogIiIsCisJCQltLT5jcHUsCisJCQltc2NvZCwgZXJyY29kZSwKKwkJCWNoYW5uZWwsCQkvKiAxMTExYiBtZWFucyBub3Qgc3BlY2lmaWVkICovCisJCQkobG9uZyBsb25nKSBtLT5hZGRyLAorCQkJc29ja2V0LAorCQkJZmlyc3RfY2hhbm5lbCwJCS8qIFRoaXMgaXMgdGhlIHJlYWwgY2hhbm5lbCBvbiBTQiAqLworCQkJY2hhbm5lbF9tYXNrLAorCQkJcmFuayk7CisKKwlkZWJ1Z2YwKCIlcyIsIG1zZyk7CisKKwkvKiBDYWxsIHRoZSBoZWxwZXIgdG8gb3V0cHV0IG1lc3NhZ2UgKi8KKwlpZiAodW5jb3JyZWN0ZWRfZXJyb3IpCisJCWVkYWNfbWNfaGFuZGxlX2ZiZF91ZShtY2ksIGNzcm93LCAwLCAwLCBtc2cpOworCWVsc2UKKwkJZWRhY19tY19oYW5kbGVfZmJkX2NlKG1jaSwgY3Nyb3csIDAsIG1zZyk7CisKKwlrZnJlZShtc2cpOworfQorCisvKgorICoJc2JyaWRnZV9jaGVja19lcnJvcglSZXRyaWV2ZSBhbmQgcHJvY2VzcyBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlCisgKgkJCQloYXJkd2FyZS4gQ2FsbGVkIGJ5IHRoZSBDb3JlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgc2JyaWRnZV9jaGVja19lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCWludCBpOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKwlzdHJ1Y3QgbWNlICptOworCisJLyoKKwkgKiBNQ0UgZmlyc3Qgc3RlcDogQ29weSBhbGwgbWNlIGVycm9ycyBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlcgorCSAqIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgaGVyZSwgdG8gcmVkdWNlIHRoZSByaXNrIG9mCisJICogbG9vc2luZyBhbiBlcnJvci4KKwkgKi8KKwlzbXBfcm1iKCk7CisJY291bnQgPSAocHZ0LT5tY2Vfb3V0ICsgTUNFX0xPR19MRU4gLSBwdnQtPm1jZV9pbikKKwkJJSBNQ0VfTE9HX0xFTjsKKwlpZiAoIWNvdW50KQorCQlyZXR1cm47CisKKwltID0gcHZ0LT5tY2Vfb3V0ZW50cnk7CisJaWYgKHB2dC0+bWNlX2luICsgY291bnQgPiBNQ0VfTE9HX0xFTikgeworCQl1bnNpZ25lZCBsID0gTUNFX0xPR19MRU4gLSBwdnQtPm1jZV9pbjsKKworCQltZW1jcHkobSwgJnB2dC0+bWNlX2VudHJ5W3B2dC0+bWNlX2luXSwgc2l6ZW9mKCptKSAqIGwpOworCQlzbXBfd21iKCk7CisJCXB2dC0+bWNlX2luID0gMDsKKwkJY291bnQgLT0gbDsKKwkJbSArPSBsOworCX0KKwltZW1jcHkobSwgJnB2dC0+bWNlX2VudHJ5W3B2dC0+bWNlX2luXSwgc2l6ZW9mKCptKSAqIGNvdW50KTsKKwlzbXBfd21iKCk7CisJcHZ0LT5tY2VfaW4gKz0gY291bnQ7CisKKwlzbXBfcm1iKCk7CisJaWYgKHB2dC0+bWNlX292ZXJydW4pIHsKKwkJc2JyaWRnZV9wcmludGsoS0VSTl9FUlIsICJMb3N0ICVkIG1lbW9yeSBlcnJvcnNcbiIsCisJCQkgICAgICBwdnQtPm1jZV9vdmVycnVuKTsKKwkJc21wX3dtYigpOworCQlwdnQtPm1jZV9vdmVycnVuID0gMDsKKwl9CisKKwkvKgorCSAqIE1DRSBzZWNvbmQgc3RlcDogcGFyc2UgZXJyb3JzIGFuZCBkaXNwbGF5CisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXNicmlkZ2VfbWNlX291dHB1dF9lcnJvcihtY2ksICZwdnQtPm1jZV9vdXRlbnRyeVtpXSk7Cit9CisKKy8qCisgKiBzYnJpZGdlX21jZV9jaGVja19lcnJvcglSZXBsaWNhdGVzIG1jZWxvZyByb3V0aW5lIHRvIGdldCBlcnJvcnMKKyAqCQkJCVRoaXMgcm91dGluZSBzaW1wbHkgcXVldWVzIG1jZWxvZyBlcnJvcnMsIGFuZAorICoJCQkJcmV0dXJuLiBUaGUgZXJyb3IgaXRzZWxmIHNob3VsZCBiZSBoYW5kbGVkIGxhdGVyCisgKgkJCQlieSBzYnJpZGdlX2NoZWNrX2Vycm9yLgorICogV0FSTklORzogQXMgdGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgYXQgTk1JIHRpbWUsIGV4dHJhIGNhcmUgc2hvdWxkCisgKiBiZSB0YWtlbiB0byBhdm9pZCBkZWFkbG9ja3MsIGFuZCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgaW50IHNicmlkZ2VfbWNlX2NoZWNrX2Vycm9yKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jZSAqbWNlID0gKHN0cnVjdCBtY2UgKilkYXRhOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3Qgc2JyaWRnZV9wdnQgKnB2dDsKKworCW1jaSA9IGdldF9tY2lfZm9yX25vZGVfaWQobWNlLT5zb2NrZXRpZCk7CisJaWYgKCFtY2kpCisJCXJldHVybiBOT1RJRllfQkFEOworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKgorCSAqIEp1c3QgbGV0IG1jZWxvZyBoYW5kbGUgaXQgaWYgdGhlIGVycm9yIGlzCisJICogb3V0c2lkZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuIEEgbWVtb3J5IGVycm9yCisJICogaXMgaW5kaWNhdGVkIGJ5IGJpdCA3ID0gMSBhbmQgYml0cyA9IDgtMTEsMTMtMTUgPSAwLgorCSAqIGJpdCAxMiBoYXMgYW4gc3BlY2lhbCBtZWFuaW5nLgorCSAqLworCWlmICgobWNlLT5zdGF0dXMgJiAweGVmZmYpID4+IDcgIT0gMSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJcHJpbnRrKCJzYnJpZGdlOiBIQU5ETElORyBNQ0UgTUVNT1JZIEVSUk9SXG4iKTsKKworCXByaW50aygiQ1BVICVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogJUx4IEJhbmsgJWQ6ICUwMTZMeFxuIiwKKwkgICAgICAgbWNlLT5leHRjcHUsIG1jZS0+bWNnc3RhdHVzLCBtY2UtPmJhbmssIG1jZS0+c3RhdHVzKTsKKwlwcmludGsoIlRTQyAlbGx4ICIsIG1jZS0+dHNjKTsKKwlwcmludGsoIkFERFIgJWxseCAiLCBtY2UtPmFkZHIpOworCXByaW50aygiTUlTQyAlbGx4ICIsIG1jZS0+bWlzYyk7CisKKwlwcmludGsoIlBST0NFU1NPUiAldToleCBUSU1FICVsbHUgU09DS0VUICV1IEFQSUMgJXhcbiIsCisJCW1jZS0+Y3B1dmVuZG9yLCBtY2UtPmNwdWlkLCBtY2UtPnRpbWUsCisJCW1jZS0+c29ja2V0aWQsIG1jZS0+YXBpY2lkKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkvKiBPbmx5IGhhbmRsZSBpZiBpdCBpcyB0aGUgcmlnaHQgbWMgY29udHJvbGxlciAqLworCWlmIChjcHVfZGF0YShtY2UtPmNwdSkucGh5c19wcm9jX2lkICE9IHB2dC0+c2JyaWRnZV9kZXYtPm1jKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisjZW5kaWYKKworCXNtcF9ybWIoKTsKKwlpZiAoKHB2dC0+bWNlX291dCArIDEpICUgTUNFX0xPR19MRU4gPT0gcHZ0LT5tY2VfaW4pIHsKKwkJc21wX3dtYigpOworCQlwdnQtPm1jZV9vdmVycnVuKys7CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9CisKKwkvKiBDb3B5IG1lbW9yeSBlcnJvciBhdCB0aGUgcmluZ2J1ZmZlciAqLworCW1lbWNweSgmcHZ0LT5tY2VfZW50cnlbcHZ0LT5tY2Vfb3V0XSwgbWNlLCBzaXplb2YoKm1jZSkpOworCXNtcF93bWIoKTsKKwlwdnQtPm1jZV9vdXQgPSAocHZ0LT5tY2Vfb3V0ICsgMSkgJSBNQ0VfTE9HX0xFTjsKKworCS8qIEhhbmRsZSBmYXRhbCBlcnJvcnMgaW1tZWRpYXRlbHkgKi8KKwlpZiAobWNlLT5tY2dzdGF0dXMgJiAxKQorCQlzYnJpZGdlX2NoZWNrX2Vycm9yKG1jaSk7CisKKwkvKiBBZHZpY2UgbWNlbG9nIHRoYXQgdGhlIGVycm9yIHdlcmUgaGFuZGxlZCAqLworCXJldHVybiBOT1RJRllfU1RPUDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzYnJpZGdlX21jZV9kZWMgPSB7CisJLm5vdGlmaWVyX2NhbGwgICAgICA9IHNicmlkZ2VfbWNlX2NoZWNrX2Vycm9yLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCUVEQUMgcmVnaXN0ZXIvdW5yZWdpc3RlciBsb2dpYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNicmlkZ2VfdW5yZWdpc3Rlcl9tY2koc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBzYnJpZGdlX2Rldi0+bWNpOworCXN0cnVjdCBzYnJpZGdlX3B2dCAqcHZ0OworCisJaWYgKHVubGlrZWx5KCFtY2kgfHwgIW1jaS0+cHZ0X2luZm8pKSB7CisJCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IGRldiA9ICVwXG4iLAorCQkJX19mdW5jX18sICZzYnJpZGdlX2Rldi0+cGRldlswXS0+ZGV2KTsKKworCQlzYnJpZGdlX3ByaW50ayhLRVJOX0VSUiwgIkNvdWxkbid0IGZpbmQgbWNpIGhhbmRsZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IG1jaSA9ICVwLCBkZXYgPSAlcFxuIiwKKwkJX19mdW5jX18sIG1jaSwgJnNicmlkZ2VfZGV2LT5wZGV2WzBdLT5kZXYpOworCisJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwKKwkJCQkJICZzYnJpZGdlX21jZV9kZWMpOworCisJLyogUmVtb3ZlIE1DIHN5c2ZzIG5vZGVzICovCisJZWRhY19tY19kZWxfbWMobWNpLT5kZXYpOworCisJZGVidWdmMSgiJXM6IGZyZWUgbWNpIHN0cnVjdFxuIiwgbWNpLT5jdGxfbmFtZSk7CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7CisJc2JyaWRnZV9kZXYtPm1jaSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2JyaWRnZV9yZWdpc3Rlcl9tY2koc3RydWN0IHNicmlkZ2VfZGV2ICpzYnJpZGdlX2RldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IHNicmlkZ2VfcHZ0ICpwdnQ7CisJaW50IHJjLCBjaGFubmVscywgY3Nyb3dzOworCisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBhY3RpdmUgYW5kIG5vdCBkaXNhYmxlZCBjaGFubmVscyAqLworCXJjID0gc2JyaWRnZV9nZXRfYWN0aXZlX2NoYW5uZWxzKHNicmlkZ2VfZGV2LT5idXMsICZjaGFubmVscywgJmNzcm93cyk7CisJaWYgKHVubGlrZWx5KHJjIDwgMCkpCisJCXJldHVybiByYzsKKworCS8qIGFsbG9jYXRlIGEgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlICovCisJbWNpID0gZWRhY19tY19hbGxvYyhzaXplb2YoKnB2dCksIGNzcm93cywgY2hhbm5lbHMsIHNicmlkZ2VfZGV2LT5tYyk7CisJaWYgKHVubGlrZWx5KCFtY2kpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IG1jaSA9ICVwLCBkZXYgPSAlcFxuIiwKKwkJX19mdW5jX18sIG1jaSwgJnNicmlkZ2VfZGV2LT5wZGV2WzBdLT5kZXYpOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwltZW1zZXQocHZ0LCAwLCBzaXplb2YoKnB2dCkpOworCisJLyogQXNzb2NpYXRlIHNicmlkZ2VfZGV2IGFuZCBtY2kgZm9yIGZ1dHVyZSB1c2FnZSAqLworCXB2dC0+c2JyaWRnZV9kZXYgPSBzYnJpZGdlX2RldjsKKwlzYnJpZGdlX2Rldi0+bWNpID0gbWNpOworCisJbWNpLT5tdHlwZV9jYXAgPSBNRU1fRkxBR19ERFIzOworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOworCW1jaS0+bW9kX25hbWUgPSAic2JyaWRnZV9lZGFjLmMiOworCW1jaS0+bW9kX3ZlciA9IFNCUklER0VfUkVWSVNJT047CisJbWNpLT5jdGxfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiU2FuZHkgQnJpZGdlIFNvY2tldCMlZCIsIG1jaS0+bWNfaWR4KTsKKwltY2ktPmRldl9uYW1lID0gcGNpX25hbWUoc2JyaWRnZV9kZXYtPnBkZXZbMF0pOworCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7CisKKwkvKiBTZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW4gYWN0dWFsIG9wZXJhdGlvbiBmdW5jdGlvbiAqLworCW1jaS0+ZWRhY19jaGVjayA9IHNicmlkZ2VfY2hlY2tfZXJyb3I7CisKKwkvKiBTdG9yZSBwY2kgZGV2aWNlcyBhdCBtY2kgZm9yIGZhc3RlciBhY2Nlc3MgKi8KKwlyYyA9IG1jaV9iaW5kX2RldnMobWNpLCBzYnJpZGdlX2Rldik7CisJaWYgKHVubGlrZWx5KHJjIDwgMCkpCisJCWdvdG8gZmFpbDA7CisKKwkvKiBHZXQgZGltbSBiYXNpYyBjb25maWcgYW5kIHRoZSBtZW1vcnkgbGF5b3V0ICovCisJZ2V0X2RpbW1fY29uZmlnKG1jaSk7CisJZ2V0X21lbW9yeV9sYXlvdXQobWNpKTsKKworCS8qIHJlY29yZCBwdHIgdG8gdGhlIGdlbmVyaWMgZGV2aWNlICovCisJbWNpLT5kZXYgPSAmc2JyaWRnZV9kZXYtPnBkZXZbMF0tPmRldjsKKworCS8qIGFkZCB0aGlzIG5ldyBNQyBjb250cm9sIHN0cnVjdHVyZSB0byBFREFDJ3MgbGlzdCBvZiBNQ3MgKi8KKwlpZiAodW5saWtlbHkoZWRhY19tY19hZGRfbWMobWNpKSkpIHsKKwkJZGVidWdmMCgiTUM6ICIgX19GSUxFX18KKwkJCSI6ICVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsMDsKKwl9CisKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwKKwkJCQkgICAgICAgJnNicmlkZ2VfbWNlX2RlYyk7CisJcmV0dXJuIDA7CisKK2ZhaWwwOgorCWtmcmVlKG1jaS0+Y3RsX25hbWUpOworCWVkYWNfbWNfZnJlZShtY2kpOworCXNicmlkZ2VfZGV2LT5tY2kgPSBOVUxMOworCXJldHVybiByYzsKK30KKworLyoKKyAqCXNicmlkZ2VfcHJvYmUJUHJvYmUgZm9yIE9ORSBpbnN0YW5jZSBvZiBkZXZpY2UgdG8gc2VlIGlmIGl0IGlzCisgKgkJCXByZXNlbnQuCisgKglyZXR1cm46CisgKgkJMCBmb3IgRk9VTkQgYSBkZXZpY2UKKyAqCQk8IDAgZm9yIGVycm9yIGNvZGUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYnJpZGdlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKwl1OCBtYywgbnVtX21jID0gMDsKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2OworCisJLyogZ2V0IHRoZSBwY2kgZGV2aWNlcyB3ZSB3YW50IHRvIHJlc2VydmUgZm9yIG91ciB1c2UgKi8KKwltdXRleF9sb2NrKCZzYnJpZGdlX2VkYWNfbG9jayk7CisKKwkvKgorCSAqIEFsbCBtZW1vcnkgY29udHJvbGxlcnMgYXJlIGFsbG9jYXRlZCBhdCB0aGUgZmlyc3QgcGFzcy4KKwkgKi8KKwlpZiAodW5saWtlbHkocHJvYmVkID49IDEpKSB7CisJCW11dGV4X3VubG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcHJvYmVkKys7CisKKwlyYyA9IHNicmlkZ2VfZ2V0X2FsbF9kZXZpY2VzKCZudW1fbWMpOworCWlmICh1bmxpa2VseShyYyA8IDApKQorCQlnb3RvIGZhaWwwOworCW1jID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JyaWRnZV9kZXYsICZzYnJpZGdlX2VkYWNfbGlzdCwgbGlzdCkgeworCQlkZWJ1Z2YwKCJSZWdpc3RlcmluZyBNQyMlZCAoJWQgb2YgJWQpXG4iLCBtYywgbWMgKyAxLCBudW1fbWMpOworCQlzYnJpZGdlX2Rldi0+bWMgPSBtYysrOworCQlyYyA9IHNicmlkZ2VfcmVnaXN0ZXJfbWNpKHNicmlkZ2VfZGV2KTsKKwkJaWYgKHVubGlrZWx5KHJjIDwgMCkpCisJCQlnb3RvIGZhaWwxOworCX0KKworCXNicmlkZ2VfcHJpbnRrKEtFUk5fSU5GTywgIkRyaXZlciBsb2FkZWQuXG4iKTsKKworCW11dGV4X3VubG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworCXJldHVybiAwOworCitmYWlsMToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNicmlkZ2VfZGV2LCAmc2JyaWRnZV9lZGFjX2xpc3QsIGxpc3QpCisJCXNicmlkZ2VfdW5yZWdpc3Rlcl9tY2koc2JyaWRnZV9kZXYpOworCisJc2JyaWRnZV9wdXRfYWxsX2RldmljZXMoKTsKK2ZhaWwwOgorCW11dGV4X3VubG9jaygmc2JyaWRnZV9lZGFjX2xvY2spOworCXJldHVybiByYzsKK30KKworLyoKKyAqCXNicmlkZ2VfcmVtb3ZlCWRlc3RydWN0b3IgZm9yIG9uZSBpbnN0YW5jZSBvZiBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzYnJpZGdlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc2JyaWRnZV9kZXYgKnNicmlkZ2VfZGV2OworCisJZGVidWdmMChfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIHdlIGhhdmUgYSB0cm91YmxlIGhlcmU6IHBkZXYgdmFsdWUgZm9yIHJlbW92YWwgd2lsbCBiZSB3cm9uZywgc2luY2UKKwkgKiBpdCB3aWxsIHBvaW50IHRvIHRoZSBYNTggcmVnaXN0ZXIgdXNlZCB0byBkZXRlY3QgdGhhdCB0aGUgbWFjaGluZQorCSAqIGlzIGEgTmVoYWxlbSBvciB1cHBlciBkZXNpZ24uIEhvd2V2ZXIsIGR1ZSB0byB0aGUgd2F5IHNldmVyYWwgUENJCisJICogZGV2aWNlcyBhcmUgZ3JvdXBlZCB0b2dldGhlciB0byBwcm92aWRlIE1DIGZ1bmN0aW9uYWxpdHksIHdlIG5lZWQKKwkgKiB0byB1c2UgYSBkaWZmZXJlbnQgbWV0aG9kIGZvciByZWxlYXNpbmcgdGhlIGRldmljZXMKKwkgKi8KKworCW11dGV4X2xvY2soJnNicmlkZ2VfZWRhY19sb2NrKTsKKworCWlmICh1bmxpa2VseSghcHJvYmVkKSkgeworCQltdXRleF91bmxvY2soJnNicmlkZ2VfZWRhY19sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JyaWRnZV9kZXYsICZzYnJpZGdlX2VkYWNfbGlzdCwgbGlzdCkKKwkJc2JyaWRnZV91bnJlZ2lzdGVyX21jaShzYnJpZGdlX2Rldik7CisKKwkvKiBSZWxlYXNlIFBDSSByZXNvdXJjZXMgKi8KKwlzYnJpZGdlX3B1dF9hbGxfZGV2aWNlcygpOworCisJcHJvYmVkLS07CisKKwltdXRleF91bmxvY2soJnNicmlkZ2VfZWRhY19sb2NrKTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNicmlkZ2VfcGNpX3RibCk7CisKKy8qCisgKglzYnJpZGdlX2RyaXZlcglwY2lfZHJpdmVyIHN0cnVjdHVyZSBmb3IgdGhpcyBtb2R1bGUKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzYnJpZGdlX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSAic2JyaWRnZV9lZGFjIiwKKwkucHJvYmUgICAgPSBzYnJpZGdlX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKHNicmlkZ2VfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBzYnJpZGdlX3BjaV90YmwsCit9OworCisvKgorICoJc2JyaWRnZV9pbml0CQlNb2R1bGUgZW50cnkgZnVuY3Rpb24KKyAqCQkJVHJ5IHRvIGluaXRpYWxpemUgdGhpcyBtb2R1bGUgZm9yIGl0cyBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNicmlkZ2VfaW5pdCh2b2lkKQoreworCWludCBwY2lfcmM7CisKKwlkZWJ1Z2YyKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBFbnN1cmUgdGhhdCB0aGUgT1BTVEFURSBpcyBzZXQgY29ycmVjdGx5IGZvciBQT0xMIG9yIE5NSSAqLworCW9wc3RhdGVfaW5pdCgpOworCisJcGNpX3JjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2JyaWRnZV9kcml2ZXIpOworCisJaWYgKHBjaV9yYyA+PSAwKQorCQlyZXR1cm4gMDsKKworCXNicmlkZ2VfcHJpbnRrKEtFUk5fRVJSLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIGVycm9yICVkLlxuIiwKKwkJICAgICAgcGNpX3JjKTsKKworCXJldHVybiBwY2lfcmM7Cit9CisKKy8qCisgKglzYnJpZGdlX2V4aXQoKQlNb2R1bGUgZXhpdCBmdW5jdGlvbgorICoJCQlVbnJlZ2lzdGVyIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNicmlkZ2VfZXhpdCh2b2lkKQoreworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNicmlkZ2VfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2JyaWRnZV9pbml0KTsKK21vZHVsZV9leGl0KHNicmlkZ2VfZXhpdCk7CisKK21vZHVsZV9wYXJhbShlZGFjX29wX3N0YXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlZGFjX29wX3N0YXRlLCAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwxPU5NSSIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQgSW5jLiAoaHR0cDovL3d3dy5yZWRoYXQuY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBEcml2ZXIgZm9yIEludGVsIFNhbmR5IEJyaWRnZSBtZW1vcnkgY29udHJvbGxlcnMgLSAiCisJCSAgIFNCUklER0VfUkVWSVNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9jb3JlLWlzby5jIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLWlzby5jCmluZGV4IDU3YzM5NzMuLjBmOTBlMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1pc28uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtaXNvLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10cmFuc2FjdGlvbi5jIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKaW5kZXggMzM0YjgyYS4uODU1YWIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKQEAgLTEwNDYsOCArMTA0Niw4IEBACiAKIAljeWNsZXMgPSBjYXJkLT5zcGxpdF90aW1lb3V0X2hpICogODAwMCArIChjYXJkLT5zcGxpdF90aW1lb3V0X2xvID4+IDE5KTsKIAotCWN5Y2xlcyA9IG1heChjeWNsZXMsIDgwMHUpOyAvKiBtaW5pbXVtIGFzIHBlciB0aGUgc3BlYyAqLwotCWN5Y2xlcyA9IG1pbihjeWNsZXMsIDN1ICogODAwMHUpOyAvKiBtYXhpbXVtIE9IQ0kgdGltZW91dCAqLworCS8qIG1pbmltdW0gcGVyIElFRUUgMTM5NCwgbWF4aW11bSB3aGljaCBkb2Vzbid0IG92ZXJmbG93IE9IQ0kgKi8KKwljeWNsZXMgPSBjbGFtcChjeWNsZXMsIDgwMHUsIDN1ICogODAwMHUpOwogCiAJY2FyZC0+c3BsaXRfdGltZW91dF9jeWNsZXMgPSBjeWNsZXM7CiAJY2FyZC0+c3BsaXRfdGltZW91dF9qaWZmaWVzID0gRElWX1JPVU5EX1VQKGN5Y2xlcyAqIEhaLCA4MDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCmluZGV4IDAzYTdhODUuLmEyMGY0NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9uZXQuYwpAQCAtNTAyLDExICs1MDIsNyBAQAogc3RhdGljIHVuc2lnbmVkIGZ3bmV0X21heF9wYXlsb2FkKHVuc2lnbmVkIG1heF9yZWMsIHVuc2lnbmVkIHNwZWVkKQogewogCW1heF9yZWMgPSBtaW4obWF4X3JlYywgc3BlZWQgKyA4KTsKLQltYXhfcmVjID0gbWluKG1heF9yZWMsIDB4YlUpOyAvKiA8PSA0MDk2ICovCi0JaWYgKG1heF9yZWMgPCA4KSB7Ci0JCWZ3X25vdGlmeSgibWF4X3JlYyAleCBvdXQgb2YgcmFuZ2VcbiIsIG1heF9yZWMpOwotCQltYXhfcmVjID0gODsKLQl9CisJbWF4X3JlYyA9IGNsYW1wKG1heF9yZWMsIDhVLCAxMVUpOyAvKiA1MTIuLi40MDk2ICovCiAKIAlyZXR1cm4gKDEgPDwgKG1heF9yZWMgKyAxKSkgLSBSRkMyMzc0X0ZSQUdfSERSX1NJWkU7CiB9CkBAIC0xMTI1LDE3ICsxMTIxLDEyIEBACiAJdW5zaWduZWQgdTsKIAogCWlmIChkZXYtPmxvY2FsX2ZpZm8gPT0gRldORVRfTk9fRklGT19BRERSKSB7Ci0JCS8qIG91dHNpZGUgT0hDSSBwb3N0ZWQgd3JpdGUgYXJlYT8gKi8KLQkJc3RhdGljIGNvbnN0IHN0cnVjdCBmd19hZGRyZXNzX3JlZ2lvbiByZWdpb24gPSB7Ci0JCQkuc3RhcnQgPSAweGZmZmYwMDAwMDAwMFVMTCwKLQkJCS5lbmQgICA9IENTUl9SRUdJU1RFUl9CQVNFLAotCQl9OwotCiAJCWRldi0+aGFuZGxlci5sZW5ndGggPSA0MDk2OwogCQlkZXYtPmhhbmRsZXIuYWRkcmVzc19jYWxsYmFjayA9IGZ3bmV0X3JlY2VpdmVfcGFja2V0OwogCQlkZXYtPmhhbmRsZXIuY2FsbGJhY2tfZGF0YSA9IGRldjsKIAotCQlyZXR2YWwgPSBmd19jb3JlX2FkZF9hZGRyZXNzX2hhbmRsZXIoJmRldi0+aGFuZGxlciwgJnJlZ2lvbik7CisJCXJldHZhbCA9IGZ3X2NvcmVfYWRkX2FkZHJlc3NfaGFuZGxlcigmZGV2LT5oYW5kbGVyLAorCQkJCQkmZndfaGlnaF9tZW1vcnlfcmVnaW9uKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGZhaWxlZF9pbml0aWFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCmluZGV4IGZkNzE3MGEuLjY2MjhmZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTI1LDYgKzEyNiw3IEBACiAJc3RydWN0IGZ3X29oY2kgKm9oY2k7CiAJdTMyIHJlZ3M7CiAJaW50IHRvdGFsX2FsbG9jYXRpb247CisJdTMyIGN1cnJlbnRfYnVzOwogCWJvb2wgcnVubmluZzsKIAlib29sIGZsdXNoaW5nOwogCkBAIC0yMjYsNyArMjI4LDcgQEAKIAogCV9fbGUzMiAgICAqc2VsZl9pZF9jcHU7CiAJZG1hX2FkZHJfdCBzZWxmX2lkX2J1czsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYnVzX3Jlc2V0X3Rhc2tsZXQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGJ1c19yZXNldF93b3JrOwogCiAJdTMyIHNlbGZfaWRfYnVmZmVyWzUxMl07CiB9OwpAQCAtMjYzLDYgKzI2NSw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUdFUkVfRlc2NDMJMHg1OTAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfRlcJMHgyMzgwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjIyCTB4ODAwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJX1RTQjEyTFYyNgkweDgwMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9UU0I4MkFBMgkweDgwMjUKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QSU5OQUNMRV9TWVNURU1TCTB4MTFiZAogCiAjZGVmaW5lIFFVSVJLX0NZQ0xFX1RJTUVSCQkxCkBAIC0yNzAsNiArMjc0LDcgQEAKICNkZWZpbmUgUVVJUktfQkVfSEVBREVSUwkJNAogI2RlZmluZSBRVUlSS19OT18xMzk0QQkJCTgKICNkZWZpbmUgUVVJUktfTk9fTVNJCQkJMTYKKyNkZWZpbmUgUVVJUktfVElfU0xMWjA1OQkJMzIKIAogLyogSW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIGluIG9oY2lfcXVpcmtzW10sIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyB1c2VkLiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC0yOTksNiArMzA0LDEyIEBACiAJe1BDSV9WRU5ET1JfSURfVEksIFBDSV9ERVZJQ0VfSURfVElfVFNCMTJMVjIyLCBQQ0lfQU5ZX0lELAogCQlRVUlSS19DWUNMRV9USU1FUiB8IFFVSVJLX1JFU0VUX1BBQ0tFVCB8IFFVSVJLX05PXzEzOTRBfSwKIAorCXtQQ0lfVkVORE9SX0lEX1RJLCBQQ0lfREVWSUNFX0lEX1RJX1RTQjEyTFYyNiwgUENJX0FOWV9JRCwKKwkJUVVJUktfUkVTRVRfUEFDS0VUIHwgUVVJUktfVElfU0xMWjA1OX0sCisKKwl7UENJX1ZFTkRPUl9JRF9USSwgUENJX0RFVklDRV9JRF9USV9UU0I4MkFBMiwgUENJX0FOWV9JRCwKKwkJUVVJUktfUkVTRVRfUEFDS0VUIHwgUVVJUktfVElfU0xMWjA1OX0sCisKIAl7UENJX1ZFTkRPUl9JRF9USSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkJUVVJUktfUkVTRVRfUEFDS0VUfSwKIApAQCAtMzE1LDYgKzMyNiw3IEBACiAJIiwgQVIvc2VsZklEIGVuZGlhbmVzcyA9ICIJX19zdHJpbmdpZnkoUVVJUktfQkVfSEVBREVSUykKIAkiLCBubyAxMzk0YSBlbmhhbmNlbWVudHMgPSAiCV9fc3RyaW5naWZ5KFFVSVJLX05PXzEzOTRBKQogCSIsIGRpc2FibGUgTVNJID0gIgkJX19zdHJpbmdpZnkoUVVJUktfTk9fTVNJKQorCSIsIFRJIFNMTFowNTkgZXJyYXR1bSA9ICIJX19zdHJpbmdpZnkoUVVJUktfVElfU0xMWjA1OSkKIAkiKSIpOwogCiAjZGVmaW5lIE9IQ0lfUEFSQU1fREVCVUdfQVRfQVIJCTEKQEAgLTg1OSw3ICs4NzEsNyBAQAogCSAqCiAJICogQWxhcyBzb21lIGNoaXBzIHNvbWV0aW1lcyBlbWl0IGJ1cyByZXNldCBwYWNrZXRzIHdpdGggYQogCSAqIHdyb25nIGdlbmVyYXRpb24uICBXZSBzZXQgdGhlIGNvcnJlY3QgZ2VuZXJhdGlvbiBmb3IgdGhlc2UKLQkgKiBhdCBhIHNsaWdodGx5IGluY29ycmVjdCB0aW1lIChpbiBidXNfcmVzZXRfdGFza2xldCkuCisJICogYXQgYSBzbGlnaHRseSBpbmNvcnJlY3QgdGltZSAoaW4gYnVzX3Jlc2V0X3dvcmspLgogCSAqLwogCWlmIChldnQgPT0gT0hDSTEzOTRfZXZ0X2J1c19yZXNldCkgewogCQlpZiAoIShvaGNpLT5xdWlya3MgJiBRVUlSS19SRVNFVF9QQUNLRVQpKQpAQCAtMTA0Niw2ICsxMDU4LDcgQEAKIAkJYWRkcmVzcyA9IGxlMzJfdG9fY3B1KGxhc3QtPmJyYW5jaF9hZGRyZXNzKTsKIAkJeiA9IGFkZHJlc3MgJiAweGY7CiAJCWFkZHJlc3MgJj0gfjB4ZjsKKwkJY3R4LT5jdXJyZW50X2J1cyA9IGFkZHJlc3M7CiAKIAkJLyogSWYgdGhlIGJyYW5jaCBhZGRyZXNzIHBvaW50cyB0byBhIGJ1ZmZlciBvdXRzaWRlIG9mIHRoZQogCQkgKiBjdXJyZW50IGJ1ZmZlciwgYWR2YW5jZSB0byB0aGUgbmV4dCBidWZmZXIuICovCkBAIC0xNzEzLDkgKzE3MjYsOTQgQEAKIAlyZXR1cm4gb2hjaS0+YnVzX3RpbWUgfCBjeWNsZV90aW1lX3NlY29uZHM7CiB9CiAKLXN0YXRpYyB2b2lkIGJ1c19yZXNldF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyBpbnQgZ2V0X3N0YXR1c19mb3JfcG9ydChzdHJ1Y3QgZndfb2hjaSAqb2hjaSwgaW50IHBvcnRfaW5kZXgpCiB7Ci0Jc3RydWN0IGZ3X29oY2kgKm9oY2kgPSAoc3RydWN0IGZ3X29oY2kgKilkYXRhOworCWludCByZWc7CisKKwltdXRleF9sb2NrKCZvaGNpLT5waHlfcmVnX211dGV4KTsKKwlyZWcgPSB3cml0ZV9waHlfcmVnKG9oY2ksIDcsIHBvcnRfaW5kZXgpOworCWlmIChyZWcgPj0gMCkKKwkJcmVnID0gcmVhZF9waHlfcmVnKG9oY2ksIDgpOworCW11dGV4X3VubG9jaygmb2hjaS0+cGh5X3JlZ19tdXRleCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwlzd2l0Y2ggKHJlZyAmIDB4MGYpIHsKKwljYXNlIDB4MDY6CisJCXJldHVybiAyOwkvKiBpcyBjaGlsZCBub2RlIChjb25uZWN0ZWQgdG8gcGFyZW50IG5vZGUpICovCisJY2FzZSAweDBlOgorCQlyZXR1cm4gMzsJLyogaXMgcGFyZW50IG5vZGUgKGNvbm5lY3RlZCB0byBjaGlsZCBub2RlKSAqLworCX0KKwlyZXR1cm4gMTsJCS8qIG5vdCBjb25uZWN0ZWQgKi8KK30KKworc3RhdGljIGludCBnZXRfc2VsZl9pZF9wb3Moc3RydWN0IGZ3X29oY2kgKm9oY2ksIHUzMiBzZWxmX2lkLAorCWludCBzZWxmX2lkX2NvdW50KQoreworCWludCBpOworCXUzMiBlbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPCBzZWxmX2lkX2NvdW50OyBpKyspIHsKKwkJZW50cnkgPSBvaGNpLT5zZWxmX2lkX2J1ZmZlcltpXTsKKwkJaWYgKChzZWxmX2lkICYgMHhmZjAwMDAwMCkgPT0gKGVudHJ5ICYgMHhmZjAwMDAwMCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICgoc2VsZl9pZCAmIDB4ZmYwMDAwMDApIDwgKGVudHJ5ICYgMHhmZjAwMDAwMCkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBUSSBUU0I4MkFBMkIgYW5kIFRTQjEyTFYyNiBkbyBub3QgcmVjZWl2ZSB0aGUgc2VsZklEIG9mIGEgbG9jYWxseQorICogYXR0YWNoZWQgVFNCNDFCQTNEIHBoeTsgc2VlIGh0dHA6Ly93d3cudGkuY29tL2xpdHYvcGRmL3NsbHowNTkuCisgKiBDb25zdHJ1Y3QgdGhlIHNlbGZJRCBmcm9tIHBoeSByZWdpc3RlciBjb250ZW50cy4KKyAqIEZJWE1FOiAgSG93IHRvIGRldGVybWluZSB0aGUgc2VsZklELmkgZmxhZz8KKyAqLworc3RhdGljIGludCBmaW5kX2FuZF9pbnNlcnRfc2VsZl9pZChzdHJ1Y3QgZndfb2hjaSAqb2hjaSwgaW50IHNlbGZfaWRfY291bnQpCit7CisJaW50IHJlZywgaSwgcG9zLCBzdGF0dXM7CisJLyogbGluayBhY3RpdmUgMSwgc3BlZWQgMywgYnJpZGdlIDAsIGNvbnRlbmRlciAxLCBtb3JlIHBhY2tldHMgMCAqLworCXUzMiBzZWxmX2lkID0gMHg4MDQwYzgwMDsKKworCXJlZyA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X05vZGVJRCk7CisJaWYgKCEocmVnICYgT0hDSTEzOTRfTm9kZUlEX2lkVmFsaWQpKSB7CisJCWZ3X25vdGlmeSgibm9kZSBJRCBub3QgdmFsaWQsIG5ldyBidXMgcmVzZXQgaW4gcHJvZ3Jlc3NcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzZWxmX2lkIHw9ICgocmVnICYgMHgzZikgPDwgMjQpOyAvKiBwaHkgSUQgKi8KKworCXJlZyA9IG9oY2lfcmVhZF9waHlfcmVnKCZvaGNpLT5jYXJkLCA0KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKwlzZWxmX2lkIHw9ICgocmVnICYgMHgwNykgPDwgOCk7IC8qIHBvd2VyIGNsYXNzICovCisKKwlyZWcgPSBvaGNpX3JlYWRfcGh5X3JlZygmb2hjaS0+Y2FyZCwgMSk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisJc2VsZl9pZCB8PSAoKHJlZyAmIDB4M2YpIDw8IDE2KTsgLyogZ2FwIGNvdW50ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXN0YXR1cyA9IGdldF9zdGF0dXNfZm9yX3BvcnQob2hjaSwgaSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc2VsZl9pZCB8PSAoKHN0YXR1cyAmIDB4MykgPDwgKDYgLSAoaSAqIDIpKSk7CisJfQorCisJcG9zID0gZ2V0X3NlbGZfaWRfcG9zKG9oY2ksIHNlbGZfaWQsIHNlbGZfaWRfY291bnQpOworCWlmIChwb3MgPj0gMCkgeworCQltZW1tb3ZlKCYob2hjaS0+c2VsZl9pZF9idWZmZXJbcG9zKzFdKSwKKwkJCSYob2hjaS0+c2VsZl9pZF9idWZmZXJbcG9zXSksCisJCQkoc2VsZl9pZF9jb3VudCAtIHBvcykgKiBzaXplb2YoKm9oY2ktPnNlbGZfaWRfYnVmZmVyKSk7CisJCW9oY2ktPnNlbGZfaWRfYnVmZmVyW3Bvc10gPSBzZWxmX2lkOworCQlzZWxmX2lkX2NvdW50Kys7CisJfQorCXJldHVybiBzZWxmX2lkX2NvdW50OworfQorCitzdGF0aWMgdm9pZCBidXNfcmVzZXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGZ3X29oY2kgKm9oY2kgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZ3X29oY2ksIGJ1c19yZXNldF93b3JrKTsKIAlpbnQgc2VsZl9pZF9jb3VudCwgaSwgaiwgcmVnOwogCWludCBnZW5lcmF0aW9uLCBuZXdfZ2VuZXJhdGlvbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTc1MywyMSArMTg1MSw1MCBAQAogCSAqIGJpdCBleHRyYSB0byBnZXQgdGhlIGFjdHVhbCBudW1iZXIgb2Ygc2VsZiBJRHMuCiAJICovCiAJc2VsZl9pZF9jb3VudCA9IChyZWcgPj4gMykgJiAweGZmOwotCWlmIChzZWxmX2lkX2NvdW50ID09IDAgfHwgc2VsZl9pZF9jb3VudCA+IDI1MikgeworCisJaWYgKHNlbGZfaWRfY291bnQgPiAyNTIpIHsKIAkJZndfbm90aWZ5KCJpbmNvbnNpc3RlbnQgc2VsZiBJRHNcbiIpOwogCQlyZXR1cm47CiAJfQorCiAJZ2VuZXJhdGlvbiA9IChjb25kX2xlMzJfdG9fY3B1KG9oY2ktPnNlbGZfaWRfY3B1WzBdKSA+PiAxNikgJiAweGZmOwogCXJtYigpOwogCiAJZm9yIChpID0gMSwgaiA9IDA7IGogPCBzZWxmX2lkX2NvdW50OyBpICs9IDIsIGorKykgewogCQlpZiAob2hjaS0+c2VsZl9pZF9jcHVbaV0gIT0gfm9oY2ktPnNlbGZfaWRfY3B1W2kgKyAxXSkgewotCQkJZndfbm90aWZ5KCJpbmNvbnNpc3RlbnQgc2VsZiBJRHNcbiIpOwotCQkJcmV0dXJuOworCQkJLyoKKwkJCSAqIElmIHRoZSBpbnZhbGlkIGRhdGEgbG9va3MgbGlrZSBhIGN5Y2xlIHN0YXJ0IHBhY2tldCwKKwkJCSAqIGl0J3MgbGlrZWx5IHRvIGJlIHRoZSByZXN1bHQgb2YgdGhlIGN5Y2xlIG1hc3RlcgorCQkJICogaGF2aW5nIGEgd3JvbmcgZ2FwIGNvdW50LiAgSW4gdGhpcyBjYXNlLCB0aGUgc2VsZiBJRHMKKwkJCSAqIHNvIGZhciBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgc28gdGhhdCB0aGUKKwkJCSAqIGJ1cyBtYW5hZ2VyIGNhbiB0aGVuIGNvcnJlY3QgdGhlIGdhcCBjb3VudC4KKwkJCSAqLworCQkJaWYgKGNvbmRfbGUzMl90b19jcHUob2hjaS0+c2VsZl9pZF9jcHVbaV0pCisJCQkJCQkJPT0gMHhmZmZmMDA4ZikgeworCQkJCWZ3X25vdGlmeSgiaWdub3Jpbmcgc3B1cmlvdXMgc2VsZiBJRHNcbiIpOworCQkJCXNlbGZfaWRfY291bnQgPSBqOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlmd19ub3RpZnkoImluY29uc2lzdGVudCBzZWxmIElEc1xuIik7CisJCQkJcmV0dXJuOworCQkJfQogCQl9CiAJCW9oY2ktPnNlbGZfaWRfYnVmZmVyW2pdID0KIAkJCQljb25kX2xlMzJfdG9fY3B1KG9oY2ktPnNlbGZfaWRfY3B1W2ldKTsKIAl9CisKKwlpZiAob2hjaS0+cXVpcmtzICYgUVVJUktfVElfU0xMWjA1OSkgeworCQlzZWxmX2lkX2NvdW50ID0gZmluZF9hbmRfaW5zZXJ0X3NlbGZfaWQob2hjaSwgc2VsZl9pZF9jb3VudCk7CisJCWlmIChzZWxmX2lkX2NvdW50IDwgMCkgeworCQkJZndfbm90aWZ5KCJjb3VsZCBub3QgY29uc3RydWN0IGxvY2FsIHNlbGYgSURcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHNlbGZfaWRfY291bnQgPT0gMCkgeworCQlmd19ub3RpZnkoImluY29uc2lzdGVudCBzZWxmIElEc1xuIik7CisJCXJldHVybjsKKwl9CiAJcm1iKCk7CiAKIAkvKgpAQCAtMTg4Nyw3ICsyMDE0LDcgQEAKIAlsb2dfaXJxcyhldmVudCk7CiAKIAlpZiAoZXZlbnQgJiBPSENJMTM5NF9zZWxmSURDb21wbGV0ZSkKLQkJdGFza2xldF9zY2hlZHVsZSgmb2hjaS0+YnVzX3Jlc2V0X3Rhc2tsZXQpOworCQlxdWV1ZV93b3JrKGZ3X3dvcmtxdWV1ZSwgJm9oY2ktPmJ1c19yZXNldF93b3JrKTsKIAogCWlmIChldmVudCAmIE9IQ0kxMzk0X1JRUGt0KQogCQl0YXNrbGV0X3NjaGVkdWxlKCZvaGNpLT5hcl9yZXF1ZXN0X2N0eC50YXNrbGV0KTsKQEAgLTE5MzQsNyArMjA2MSw4IEBACiAJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1Bvc3RlZFdyaXRlQWRkcmVzc0xvKTsKIAkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsCiAJCQkgIE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyKTsKLQkJZndfZXJyb3IoIlBDSSBwb3N0ZWQgd3JpdGUgZXJyb3JcbiIpOworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJZndfZXJyb3IoIlBDSSBwb3N0ZWQgd3JpdGUgZXJyb3JcbiIpOwogCX0KIAogCWlmICh1bmxpa2VseShldmVudCAmIE9IQ0kxMzk0X2N5Y2xlVG9vTG9uZykpIHsKQEAgLTIwNDgsNiArMjE3NiwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHByb2JlX3RzYjQxYmEzZChzdHJ1Y3QgZndfb2hjaSAqb2hjaSkKK3sKKwkvKiBUSSB2ZW5kb3IgSUQgPSAweDA4MDAyOCwgVFNCNDFCQTNEIHByb2R1Y3QgSUQgPSAweDgzMzAwNSAoc2ljKSAqLworCXN0YXRpYyBjb25zdCB1OCBpZFtdID0geyAweDA4LCAweDAwLCAweDI4LCAweDgzLCAweDMwLCAweDA1LCB9OworCWludCByZWcsIGk7CisKKwlyZWcgPSByZWFkX3BoeV9yZWcob2hjaSwgMik7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisJaWYgKChyZWcgJiBQSFlfRVhURU5ERURfUkVHSVNURVJTKSAhPSBQSFlfRVhURU5ERURfUkVHSVNURVJTKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUoaWQpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJcmVnID0gcmVhZF9wYWdlZF9waHlfcmVnKG9oY2ksIDEsIGkgKyAxMCk7CisJCWlmIChyZWcgPCAwKQorCQkJcmV0dXJuIHJlZzsKKwkJaWYgKHJlZyAhPSBpZFtpXSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBvaGNpX2VuYWJsZShzdHJ1Y3QgZndfY2FyZCAqY2FyZCwKIAkJICAgICAgIGNvbnN0IF9fYmUzMiAqY29uZmlnX3JvbSwgc2l6ZV90IGxlbmd0aCkKIHsKQEAgLTIwODUsNiArMjIzNSwxNiBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwlpZiAob2hjaS0+cXVpcmtzICYgUVVJUktfVElfU0xMWjA1OSkgeworCQlyZXQgPSBwcm9iZV90c2I0MWJhM2Qob2hjaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCkKKwkJCWZ3X25vdGlmeSgibG9jYWwgVFNCNDFCQTNEIHBoeVxuIik7CisJCWVsc2UKKwkJCW9oY2ktPnF1aXJrcyAmPSB+UVVJUktfVElfU0xMWjA1OTsKKwl9CisKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sQ2xlYXIsCiAJCSAgT0hDSTEzOTRfSENDb250cm9sX25vQnl0ZVN3YXBEYXRhKTsKIApAQCAtMjI2MCw3ICsyNDIwLDcgQEAKIAkgKiB0aGVuIHNldCB1cCB0aGUgcmVhbCB2YWx1ZXMgZm9yIHRoZSB0d28gcmVnaXN0ZXJzLgogCSAqCiAJICogV2UgdXNlIG9oY2ktPmxvY2sgdG8gYXZvaWQgcmFjaW5nIHdpdGggdGhlIGNvZGUgdGhhdCBzZXRzCi0JICogb2hjaS0+bmV4dF9jb25maWdfcm9tIHRvIE5VTEwgKHNlZSBidXNfcmVzZXRfdGFza2xldCkuCisJICogb2hjaS0+bmV4dF9jb25maWdfcm9tIHRvIE5VTEwgKHNlZSBidXNfcmVzZXRfd29yaykuCiAJICovCiAKIAluZXh0X2NvbmZpZ19yb20gPQpAQCAtMjUzOSw2ICsyNjk5LDcgQEAKIAlzdHJ1Y3QgaXNvX2NvbnRleHQgKmN0eCA9CiAJCWNvbnRhaW5lcl9vZihjb250ZXh0LCBzdHJ1Y3QgaXNvX2NvbnRleHQsIGNvbnRleHQpOwogCXN0cnVjdCBkZXNjcmlwdG9yICpwZDsKKwl1MzIgYnVmZmVyX2RtYTsKIAlfX2xlMzIgKmlyX2hlYWRlcjsKIAl2b2lkICpwOwogCkBAIC0yNTQ5LDYgKzI3MTAsMTYgQEAKIAkJLyogRGVzY3JpcHRvcihzKSBub3QgZG9uZSB5ZXQsIHN0b3AgaXRlcmF0aW9uICovCiAJCXJldHVybiAwOwogCisJd2hpbGUgKCEoZC0+Y29udHJvbCAmIGNwdV90b19sZTE2KERFU0NSSVBUT1JfQlJBTkNIX0FMV0FZUykpKSB7CisJCWQrKzsKKwkJYnVmZmVyX2RtYSA9IGxlMzJfdG9fY3B1KGQtPmRhdGFfYWRkcmVzcyk7CisJCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KGNvbnRleHQtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCQkgICAgICBidWZmZXJfZG1hICYgUEFHRV9NQVNLLAorCQkJCQkgICAgICBidWZmZXJfZG1hICYgflBBR0VfTUFTSywKKwkJCQkJICAgICAgbGUxNl90b19jcHUoZC0+cmVxX2NvdW50KSwKKwkJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwl9CisKIAlwID0gbGFzdCArIDE7CiAJY29weV9pc29faGVhZGVycyhjdHgsIHApOwogCkBAIC0yNTcxLDExICsyNzQyLDE5IEBACiB7CiAJc3RydWN0IGlzb19jb250ZXh0ICpjdHggPQogCQljb250YWluZXJfb2YoY29udGV4dCwgc3RydWN0IGlzb19jb250ZXh0LCBjb250ZXh0KTsKKwl1MzIgYnVmZmVyX2RtYTsKIAogCWlmICghbGFzdC0+dHJhbnNmZXJfc3RhdHVzKQogCQkvKiBEZXNjcmlwdG9yKHMpIG5vdCBkb25lIHlldCwgc3RvcCBpdGVyYXRpb24gKi8KIAkJcmV0dXJuIDA7CiAKKwlidWZmZXJfZG1hID0gbGUzMl90b19jcHUobGFzdC0+ZGF0YV9hZGRyZXNzKTsKKwlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShjb250ZXh0LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkgICAgICBidWZmZXJfZG1hICYgUEFHRV9NQVNLLAorCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiB+UEFHRV9NQVNLLAorCQkJCSAgICAgIGxlMTZfdG9fY3B1KGxhc3QtPnJlcV9jb3VudCksCisJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwogCWlmIChsZTE2X3RvX2NwdShsYXN0LT5jb250cm9sKSAmIERFU0NSSVBUT1JfSVJRX0FMV0FZUykKIAkJY3R4LT5iYXNlLmNhbGxiYWNrLm1jKCZjdHgtPmJhc2UsCiAJCQkJICAgICAgbGUzMl90b19jcHUobGFzdC0+ZGF0YV9hZGRyZXNzKSArCkBAIC0yNTg2LDYgKzI3NjUsNDMgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHN5bmNfaXRfcGFja2V0X2Zvcl9jcHUoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkJCSAgc3RydWN0IGRlc2NyaXB0b3IgKnBkKQoreworCV9fbGUxNiBjb250cm9sOworCXUzMiBidWZmZXJfZG1hOworCisJLyogb25seSBwYWNrZXRzIGJlZ2lubmluZyB3aXRoIE9VVFBVVF9NT1JFKiBoYXZlIGRhdGEgYnVmZmVycyAqLworCWlmIChwZC0+Y29udHJvbCAmIGNwdV90b19sZTE2KERFU0NSSVBUT1JfQlJBTkNIX0FMV0FZUykpCisJCXJldHVybjsKKworCS8qIHNraXAgb3ZlciB0aGUgT1VUUFVUX01PUkVfSU1NRURJQVRFIGRlc2NyaXB0b3IgKi8KKwlwZCArPSAyOworCisJLyoKKwkgKiBJZiB0aGUgcGFja2V0IGhhcyBhIGhlYWRlciwgdGhlIGZpcnN0IE9VVFBVVF9NT1JFL0xBU1QgZGVzY3JpcHRvcidzCisJICogZGF0YSBidWZmZXIgaXMgaW4gdGhlIGNvbnRleHQgcHJvZ3JhbSdzIGNvaGVyZW50IHBhZ2UgYW5kIG11c3Qgbm90CisJICogYmUgc3luY2VkLgorCSAqLworCWlmICgobGUzMl90b19jcHUocGQtPmRhdGFfYWRkcmVzcykgJiBQQUdFX01BU0spID09CisJICAgIChjb250ZXh0LT5jdXJyZW50X2J1cyAgICAgICAgICAmIFBBR0VfTUFTSykpIHsKKwkJaWYgKHBkLT5jb250cm9sICYgY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9CUkFOQ0hfQUxXQVlTKSkKKwkJCXJldHVybjsKKwkJcGQrKzsKKwl9CisKKwlkbyB7CisJCWJ1ZmZlcl9kbWEgPSBsZTMyX3RvX2NwdShwZC0+ZGF0YV9hZGRyZXNzKTsKKwkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoY29udGV4dC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiBQQUdFX01BU0ssCisJCQkJCSAgICAgIGJ1ZmZlcl9kbWEgJiB+UEFHRV9NQVNLLAorCQkJCQkgICAgICBsZTE2X3RvX2NwdShwZC0+cmVxX2NvdW50KSwKKwkJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CisJCWNvbnRyb2wgPSBwZC0+Y29udHJvbDsKKwkJcGQrKzsKKwl9IHdoaWxlICghKGNvbnRyb2wgJiBjcHVfdG9fbGUxNihERVNDUklQVE9SX0JSQU5DSF9BTFdBWVMpKSk7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX2l0X3BhY2tldChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKIAkJCSAgICBzdHJ1Y3QgZGVzY3JpcHRvciAqZCwKIAkJCSAgICBzdHJ1Y3QgZGVzY3JpcHRvciAqbGFzdCkKQEAgLTI2MDIsNiArMjgxOCw4IEBACiAJCS8qIERlc2NyaXB0b3Iocykgbm90IGRvbmUgeWV0LCBzdG9wIGl0ZXJhdGlvbiAqLwogCQlyZXR1cm4gMDsKIAorCXN5bmNfaXRfcGFja2V0X2Zvcl9jcHUoY29udGV4dCwgZCk7CisKIAlpID0gY3R4LT5oZWFkZXJfbGVuZ3RoOwogCWlmIChpICsgNCA8IFBBR0VfU0laRSkgewogCQkvKiBQcmVzZW50IHRoaXMgdmFsdWUgYXMgYmlnLWVuZGlhbiB0byBtYXRjaCB0aGUgcmVjZWl2ZSBjb2RlICovCkBAIC0yOTcxLDYgKzMxODksMTAgQEAKIAkJcGFnZV9idXMgPSBwYWdlX3ByaXZhdGUoYnVmZmVyLT5wYWdlc1twYWdlXSk7CiAJCXBkW2ldLmRhdGFfYWRkcmVzcyA9IGNwdV90b19sZTMyKHBhZ2VfYnVzICsgb2Zmc2V0KTsKIAorCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShjdHgtPmNvbnRleHQub2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCQkgcGFnZV9idXMsIG9mZnNldCwgbGVuZ3RoLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCiAJCXBheWxvYWRfaW5kZXggKz0gbGVuZ3RoOwogCX0KIApAQCAtMjk5NSw2ICszMjE3LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IGZ3X2lzb19idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYXlsb2FkKQogeworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IGN0eC0+Y29udGV4dC5vaGNpLT5jYXJkLmRldmljZTsKIAlzdHJ1Y3QgZGVzY3JpcHRvciAqZCwgKnBkOwogCWRtYV9hZGRyX3QgZF9idXMsIHBhZ2VfYnVzOwogCXUzMiB6LCBoZWFkZXJfeiwgcmVzdDsKQEAgLTMwNDksNiArMzI3MiwxMCBAQAogCQkJcGFnZV9idXMgPSBwYWdlX3ByaXZhdGUoYnVmZmVyLT5wYWdlc1twYWdlXSk7CiAJCQlwZC0+ZGF0YV9hZGRyZXNzID0gY3B1X3RvX2xlMzIocGFnZV9idXMgKyBvZmZzZXQpOwogCisJCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShkZXZpY2UsIHBhZ2VfYnVzLAorCQkJCQkJCSBvZmZzZXQsIGxlbmd0aCwKKwkJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwogCQkJb2Zmc2V0ID0gKG9mZnNldCArIGxlbmd0aCkgJiB+UEFHRV9NQVNLOwogCQkJcmVzdCAtPSBsZW5ndGg7CiAJCQlpZiAob2Zmc2V0ID09IDApCkBAIC0zMTA4LDYgKzMzMzUsMTAgQEAKIAkJcGFnZV9idXMgPSBwYWdlX3ByaXZhdGUoYnVmZmVyLT5wYWdlc1twYWdlXSk7CiAJCWQtPmRhdGFfYWRkcmVzcyA9IGNwdV90b19sZTMyKHBhZ2VfYnVzICsgb2Zmc2V0KTsKIAorCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShjdHgtPmNvbnRleHQub2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCQkgcGFnZV9idXMsIG9mZnNldCwgbGVuZ3RoLAorCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisKIAkJcmVzdCAtPSBsZW5ndGg7CiAJCW9mZnNldCA9IDA7CiAJCXBhZ2UrKzsKQEAgLTMyMzksOCArMzQ3MCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJm9oY2ktPmxvY2spOwogCW11dGV4X2luaXQoJm9oY2ktPnBoeV9yZWdfbXV0ZXgpOwogCi0JdGFza2xldF9pbml0KCZvaGNpLT5idXNfcmVzZXRfdGFza2xldCwKLQkJICAgICBidXNfcmVzZXRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpb2hjaSk7CisJSU5JVF9XT1JLKCZvaGNpLT5idXNfcmVzZXRfd29yaywgYnVzX3Jlc2V0X3dvcmspOwogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9uKGRldiwgMCwgb2hjaV9kcml2ZXJfbmFtZSk7CiAJaWYgKGVycikgewpAQCAtMzM4Miw2ICszNjEyLDcgQEAKIAlvaGNpID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tDbGVhciwgfjApOwogCWZsdXNoX3dyaXRlcyhvaGNpKTsKKwljYW5jZWxfd29ya19zeW5jKCZvaGNpLT5idXNfcmVzZXRfd29yayk7CiAJZndfY29yZV9yZW1vdmVfY2FyZCgmb2hjaS0+Y2FyZCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9zYnAyLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL3NicDIuYwppbmRleCAxN2NlZjg2Li42ODM3NWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL3NicDIuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL3NicDIuYwpAQCAtMTU0LDEyICsxNTQsMTYgQEAKIAlib29sIGJsb2NrZWQ7CiB9OwogCitzdGF0aWMgdm9pZCBzYnAyX3F1ZXVlX3dvcmsoc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSwgdW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoZndfd29ya3F1ZXVlLCAmbHUtPndvcmssIGRlbGF5KTsKK30KKwogLyoKICAqIFdlIGNyZWF0ZSBvbmUgc3RydWN0IHNicDJfdGFyZ2V0IHBlciBJRUVFIDEyMTIgVW5pdCBEaXJlY3RvcnkKICAqIGFuZCBvbmUgc3RydWN0IFNjc2lfSG9zdCBwZXIgc2JwMl90YXJnZXQuCiAgKi8KIHN0cnVjdCBzYnAyX3RhcmdldCB7Ci0Jc3RydWN0IGtyZWYga3JlZjsKIAlzdHJ1Y3QgZndfdW5pdCAqdW5pdDsKIAljb25zdCBjaGFyICpidXNfaWQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsdV9saXN0OwpAQCAtNzcyLDcxICs3NzYsNiBAQAogCXJldHVybiBzY3NpbHVuX3RvX2ludCgmZWlnaHRfYnl0ZXNfbHVuKTsKIH0KIAotc3RhdGljIHZvaWQgc2JwMl9yZWxlYXNlX3RhcmdldChzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgc2JwMl90YXJnZXQsIGtyZWYpOwotCXN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUsICpuZXh0OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0KLQkJY29udGFpbmVyX29mKCh2b2lkICopdGd0LCBzdHJ1Y3QgU2NzaV9Ib3N0LCBob3N0ZGF0YVswXSk7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCXN0cnVjdCBmd19kZXZpY2UgKmRldmljZSA9IHRhcmdldF9kZXZpY2UodGd0KTsKLQotCS8qIHByZXZlbnQgZGVhZGxvY2tzICovCi0Jc2JwMl91bmJsb2NrKHRndCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHUsIG5leHQsICZ0Z3QtPmx1X2xpc3QsIGxpbmspIHsKLQkJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChzaG9zdCwgMCwgMCwgc2JwMl9sdW4yaW50KGx1LT5sdW4pKTsKLQkJaWYgKHNkZXYpIHsKLQkJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKLQkJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKLQkJfQotCQlpZiAobHUtPmxvZ2luX2lkICE9IElOVkFMSURfTE9HSU5fSUQpIHsKLQkJCWludCBnZW5lcmF0aW9uLCBub2RlX2lkOwotCQkJLyoKLQkJCSAqIHRndC0+bm9kZV9pZCBtYXkgYmUgb2Jzb2xldGUgaGVyZSBpZiB3ZSBmYWlsZWQKLQkJCSAqIGR1cmluZyBpbml0aWFsIGxvZ2luIG9yIGFmdGVyIGEgYnVzIHJlc2V0IHdoZXJlCi0JCQkgKiB0aGUgdG9wb2xvZ3kgY2hhbmdlZC4KLQkJCSAqLwotCQkJZ2VuZXJhdGlvbiA9IGRldmljZS0+Z2VuZXJhdGlvbjsKLQkJCXNtcF9ybWIoKTsgLyogbm9kZV9pZCB2cy4gZ2VuZXJhdGlvbiAqLwotCQkJbm9kZV9pZCAgICA9IGRldmljZS0+bm9kZV9pZDsKLQkJCXNicDJfc2VuZF9tYW5hZ2VtZW50X29yYihsdSwgbm9kZV9pZCwgZ2VuZXJhdGlvbiwKLQkJCQkJCSBTQlAyX0xPR09VVF9SRVFVRVNULAotCQkJCQkJIGx1LT5sb2dpbl9pZCwgTlVMTCk7Ci0JCX0KLQkJZndfY29yZV9yZW1vdmVfYWRkcmVzc19oYW5kbGVyKCZsdS0+YWRkcmVzc19oYW5kbGVyKTsKLQkJbGlzdF9kZWwoJmx1LT5saW5rKTsKLQkJa2ZyZWUobHUpOwotCX0KLQlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKLQlmd19ub3RpZnkoInJlbGVhc2VkICVzLCB0YXJnZXQgJWQ6MDowXG4iLCB0Z3QtPmJ1c19pZCwgc2hvc3QtPmhvc3Rfbm8pOwotCi0JZndfdW5pdF9wdXQodGd0LT51bml0KTsKLQlzY3NpX2hvc3RfcHV0KHNob3N0KTsKLQlmd19kZXZpY2VfcHV0KGRldmljZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNicDJfdGFyZ2V0X2dldChzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCkKLXsKLQlrcmVmX2dldCgmdGd0LT5rcmVmKTsKLX0KLQotc3RhdGljIHZvaWQgc2JwMl90YXJnZXRfcHV0KHN0cnVjdCBzYnAyX3RhcmdldCAqdGd0KQotewotCWtyZWZfcHV0KCZ0Z3QtPmtyZWYsIHNicDJfcmVsZWFzZV90YXJnZXQpOwotfQotCi0vKgotICogQWx3YXlzIGdldCB0aGUgdGFyZ2V0J3Mga3JlZiB3aGVuIHNjaGVkdWxpbmcgd29yayBvbiBvbmUgaXRzIHVuaXRzLgotICogRWFjaCB3b3JrcXVldWUgam9iIGlzIHJlc3BvbnNpYmxlIHRvIGNhbGwgc2JwMl90YXJnZXRfcHV0KCkgdXBvbiByZXR1cm4uCi0gKi8KLXN0YXRpYyB2b2lkIHNicDJfcXVldWVfd29yayhzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1LCB1bnNpZ25lZCBsb25nIGRlbGF5KQotewotCXNicDJfdGFyZ2V0X2dldChsdS0+dGd0KTsKLQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhmd193b3JrcXVldWUsICZsdS0+d29yaywgZGVsYXkpKQotCQlzYnAyX3RhcmdldF9wdXQobHUtPnRndCk7Ci19Ci0KIC8qCiAgKiBXcml0ZSByZXRyYW5zbWl0IHJldHJ5IHZhbHVlcyBpbnRvIHRoZSBCVVNZX1RJTUVPVVQgcmVnaXN0ZXIuCiAgKiAtIFRoZSBzaW5nbGUtcGhhc2UgcmV0cnkgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGJ5IGFsbCBTQlAtMiBkZXZpY2VzLCBidXQgdGhlCkBAIC04NzcsNyArODE2LDcgQEAKIAlpbnQgZ2VuZXJhdGlvbiwgbm9kZV9pZCwgbG9jYWxfbm9kZV9pZDsKIAogCWlmIChmd19kZXZpY2VfaXNfc2h1dGRvd24oZGV2aWNlKSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCWdlbmVyYXRpb24gICAgPSBkZXZpY2UtPmdlbmVyYXRpb247CiAJc21wX3JtYigpOyAgICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KQEAgLTg5OSw3ICs4MzgsNyBAQAogCQkJLyogTGV0IGFueSB3YWl0aW5nIEkvTyBmYWlsIGZyb20gbm93IG9uLiAqLwogCQkJc2JwMl91bmJsb2NrKGx1LT50Z3QpOwogCQl9Ci0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJfQogCiAJdGd0LT5ub2RlX2lkCSAgPSBub2RlX2lkOwpAQCAtOTI1LDcgKzg2NCw4IEBACiAJaWYgKGx1LT5oYXNfc2RldikgewogCQlzYnAyX2NhbmNlbF9vcmJzKGx1KTsKIAkJc2JwMl9jb25kaXRpb25hbGx5X3VuYmxvY2sobHUpOwotCQlnb3RvIG91dDsKKworCQlyZXR1cm47CiAJfQogCiAJaWYgKGx1LT50Z3QtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EX0RFTEFZX0lOUVVJUlkpCkBAIC05NTcsNyArODk3LDggQEAKIAlsdS0+aGFzX3NkZXYgPSB0cnVlOwogCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKIAlzYnAyX2FsbG93X2Jsb2NrKGx1KTsKLQlnb3RvIG91dDsKKworCXJldHVybjsKIAogIG91dF9sb2dvdXRfbG9naW46CiAJc21wX3JtYigpOyAvKiBnZW5lcmF0aW9uIG1heSBoYXZlIGNoYW5nZWQgKi8KQEAgLTk3MSw4ICs5MTIsNTcgQEAKIAkgKiBsdS0+d29yayBhbHJlYWR5LiAgUmVzZXQgdGhlIHdvcmsgZnJvbSByZWNvbm5lY3QgdG8gbG9naW4uCiAJICovCiAJUFJFUEFSRV9ERUxBWUVEX1dPUksoJmx1LT53b3JrLCBzYnAyX2xvZ2luKTsKLSBvdXQ6Ci0Jc2JwMl90YXJnZXRfcHV0KHRndCk7Cit9CisKK3N0YXRpYyB2b2lkIHNicDJfcmVjb25uZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCwgd29yay53b3JrKTsKKwlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGx1LT50Z3Q7CisJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gdGFyZ2V0X2RldmljZSh0Z3QpOworCWludCBnZW5lcmF0aW9uLCBub2RlX2lkLCBsb2NhbF9ub2RlX2lkOworCisJaWYgKGZ3X2RldmljZV9pc19zaHV0ZG93bihkZXZpY2UpKQorCQlyZXR1cm47CisKKwlnZW5lcmF0aW9uICAgID0gZGV2aWNlLT5nZW5lcmF0aW9uOworCXNtcF9ybWIoKTsgICAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCisJbm9kZV9pZCAgICAgICA9IGRldmljZS0+bm9kZV9pZDsKKwlsb2NhbF9ub2RlX2lkID0gZGV2aWNlLT5jYXJkLT5ub2RlX2lkOworCisJaWYgKHNicDJfc2VuZF9tYW5hZ2VtZW50X29yYihsdSwgbm9kZV9pZCwgZ2VuZXJhdGlvbiwKKwkJCQkgICAgIFNCUDJfUkVDT05ORUNUX1JFUVVFU1QsCisJCQkJICAgICBsdS0+bG9naW5faWQsIE5VTEwpIDwgMCkgeworCQkvKgorCQkgKiBJZiByZWNvbm5lY3Qgd2FzIGltcG9zc2libGUgZXZlbiB0aG91Z2ggd2UgYXJlIGluIHRoZQorCQkgKiBjdXJyZW50IGdlbmVyYXRpb24sIGZhbGwgYmFjayBhbmQgdHJ5IHRvIGxvZyBpbiBhZ2Fpbi4KKwkJICoKKwkJICogV2UgY291bGQgY2hlY2sgZm9yICJGdW5jdGlvbiByZWplY3RlZCIgc3RhdHVzLCBidXQKKwkJICogbG9va2luZyBhdCB0aGUgYnVzIGdlbmVyYXRpb24gYXMgc2ltcGxlciBhbmQgbW9yZSBnZW5lcmFsLgorCQkgKi8KKwkJc21wX3JtYigpOyAvKiBnZXQgY3VycmVudCBjYXJkIGdlbmVyYXRpb24gKi8KKwkJaWYgKGdlbmVyYXRpb24gPT0gZGV2aWNlLT5jYXJkLT5nZW5lcmF0aW9uIHx8CisJCSAgICBsdS0+cmV0cmllcysrID49IDUpIHsKKwkJCWZ3X2Vycm9yKCIlczogZmFpbGVkIHRvIHJlY29ubmVjdFxuIiwgdGd0LT5idXNfaWQpOworCQkJbHUtPnJldHJpZXMgPSAwOworCQkJUFJFUEFSRV9ERUxBWUVEX1dPUksoJmx1LT53b3JrLCBzYnAyX2xvZ2luKTsKKwkJfQorCQlzYnAyX3F1ZXVlX3dvcmsobHUsIERJVl9ST1VORF9VUChIWiwgNSkpOworCisJCXJldHVybjsKKwl9CisKKwl0Z3QtPm5vZGVfaWQgICAgICA9IG5vZGVfaWQ7CisJdGd0LT5hZGRyZXNzX2hpZ2ggPSBsb2NhbF9ub2RlX2lkIDw8IDE2OworCXNtcF93bWIoKTsJICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlsdS0+Z2VuZXJhdGlvbgkgID0gZ2VuZXJhdGlvbjsKKworCWZ3X25vdGlmeSgiJXM6IHJlY29ubmVjdGVkIHRvIExVTiAlMDR4ICglZCByZXRyaWVzKVxuIiwKKwkJICB0Z3QtPmJ1c19pZCwgbHUtPmx1biwgbHUtPnJldHJpZXMpOworCisJc2JwMl9hZ2VudF9yZXNldChsdSk7CisJc2JwMl9jYW5jZWxfb3JicyhsdSk7CisJc2JwMl9jb25kaXRpb25hbGx5X3VuYmxvY2sobHUpOwogfQogCiBzdGF0aWMgaW50IHNicDJfYWRkX2xvZ2ljYWxfdW5pdChzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCwgaW50IGx1bl9lbnRyeSkKQEAgLTExMjAsNiArMTExMCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNjc2lfZHJpdmVyX3RlbXBsYXRlOworc3RhdGljIGludCBzYnAyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW50IHNicDJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTE0MSw3ICsxMTMyLDYgQEAKIAl0Z3QgPSAoc3RydWN0IHNicDJfdGFyZ2V0ICopc2hvc3QtPmhvc3RkYXRhOwogCWRldl9zZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlLCB0Z3QpOwogCXRndC0+dW5pdCA9IHVuaXQ7Ci0Ja3JlZl9pbml0KCZ0Z3QtPmtyZWYpOwogCUlOSVRfTElTVF9IRUFEKCZ0Z3QtPmx1X2xpc3QpOwogCXRndC0+YnVzX2lkID0gZGV2X25hbWUoJnVuaXQtPmRldmljZSk7CiAJdGd0LT5ndWlkID0gKHU2NClkZXZpY2UtPmNvbmZpZ19yb21bM10gPDwgMzIgfCBkZXZpY2UtPmNvbmZpZ19yb21bNF07CkBAIC0xMTU0LDkgKzExNDQsNiBAQAogCWlmIChzY3NpX2FkZF9ob3N0KHNob3N0LCAmdW5pdC0+ZGV2aWNlKSA8IDApCiAJCWdvdG8gZmFpbF9zaG9zdF9wdXQ7CiAKLQlmd19kZXZpY2VfZ2V0KGRldmljZSk7Ci0JZndfdW5pdF9nZXQodW5pdCk7Ci0KIAkvKiBpbXBsaWNpdCBkaXJlY3RvcnkgSUQgKi8KIAl0Z3QtPmRpcmVjdG9yeV9pZCA9ICgodW5pdC0+ZGlyZWN0b3J5IC0gZGV2aWNlLT5jb25maWdfcm9tKSAqIDQKIAkJCSAgICAgKyBDU1JfQ09ORklHX1JPTSkgJiAweGZmZmZmZjsKQEAgLTExNjYsNyArMTE1Myw3IEBACiAKIAlpZiAoc2JwMl9zY2FuX3VuaXRfZGlyKHRndCwgdW5pdC0+ZGlyZWN0b3J5LCAmbW9kZWwsCiAJCQkgICAgICAgJmZpcm13YXJlX3JldmlzaW9uKSA8IDApCi0JCWdvdG8gZmFpbF90Z3RfcHV0OworCQlnb3RvIGZhaWxfcmVtb3ZlOwogCiAJc2JwMl9jbGFtcF9tYW5hZ2VtZW50X29yYl90aW1lb3V0KHRndCk7CiAJc2JwMl9pbml0X3dvcmthcm91bmRzKHRndCwgbW9kZWwsIGZpcm13YXJlX3JldmlzaW9uKTsKQEAgLTExNzcsMTYgKzExNjQsMTcgQEAKIAkgKiBzcGVjaWZpZXMgdGhlIG1heCBwYXlsb2FkIHNpemUgYXMgMiBeIChtYXhfcGF5bG9hZCArIDIpLCBzbwogCSAqIGlmIHdlIHNldCB0aGlzIHRvIG1heF9zcGVlZCArIDcsIHdlIGdldCB0aGUgcmlnaHQgdmFsdWUuCiAJICovCi0JdGd0LT5tYXhfcGF5bG9hZCA9IG1pbihkZXZpY2UtPm1heF9zcGVlZCArIDcsIDEwVSk7Ci0JdGd0LT5tYXhfcGF5bG9hZCA9IG1pbih0Z3QtPm1heF9wYXlsb2FkLCBkZXZpY2UtPmNhcmQtPm1heF9yZWNlaXZlIC0gMSk7CisJdGd0LT5tYXhfcGF5bG9hZCA9IG1pbjMoZGV2aWNlLT5tYXhfc3BlZWQgKyA3LCAxMFUsCisJCQkJZGV2aWNlLT5jYXJkLT5tYXhfcmVjZWl2ZSAtIDEpOwogCiAJLyogRG8gdGhlIGxvZ2luIGluIGEgd29ya3F1ZXVlIHNvIHdlIGNhbiBlYXNpbHkgcmVzY2hlZHVsZSByZXRyaWVzLiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkobHUsICZ0Z3QtPmx1X2xpc3QsIGxpbmspCiAJCXNicDJfcXVldWVfd29yayhsdSwgRElWX1JPVU5EX1VQKEhaLCA1KSk7CisKIAlyZXR1cm4gMDsKIAotIGZhaWxfdGd0X3B1dDoKLQlzYnAyX3RhcmdldF9wdXQodGd0KTsKKyBmYWlsX3JlbW92ZToKKwlzYnAyX3JlbW92ZShkZXYpOwogCXJldHVybiAtRU5PTUVNOwogCiAgZmFpbF9zaG9zdF9wdXQ6CkBAIC0xMTk0LDcxICsxMTgyLDYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIGludCBzYnAyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZ3X3VuaXQgKnVuaXQgPSBmd191bml0KGRldik7Ci0Jc3RydWN0IHNicDJfdGFyZ2V0ICp0Z3QgPSBkZXZfZ2V0X2RydmRhdGEoJnVuaXQtPmRldmljZSk7Ci0Jc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobHUsICZ0Z3QtPmx1X2xpc3QsIGxpbmspCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbHUtPndvcmspOwotCi0Jc2JwMl90YXJnZXRfcHV0KHRndCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNicDJfcmVjb25uZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCwgd29yay53b3JrKTsKLQlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGx1LT50Z3Q7Ci0Jc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gdGFyZ2V0X2RldmljZSh0Z3QpOwotCWludCBnZW5lcmF0aW9uLCBub2RlX2lkLCBsb2NhbF9ub2RlX2lkOwotCi0JaWYgKGZ3X2RldmljZV9pc19zaHV0ZG93bihkZXZpY2UpKQotCQlnb3RvIG91dDsKLQotCWdlbmVyYXRpb24gICAgPSBkZXZpY2UtPmdlbmVyYXRpb247Ci0Jc21wX3JtYigpOyAgICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KLQlub2RlX2lkICAgICAgID0gZGV2aWNlLT5ub2RlX2lkOwotCWxvY2FsX25vZGVfaWQgPSBkZXZpY2UtPmNhcmQtPm5vZGVfaWQ7Ci0KLQlpZiAoc2JwMl9zZW5kX21hbmFnZW1lbnRfb3JiKGx1LCBub2RlX2lkLCBnZW5lcmF0aW9uLAotCQkJCSAgICAgU0JQMl9SRUNPTk5FQ1RfUkVRVUVTVCwKLQkJCQkgICAgIGx1LT5sb2dpbl9pZCwgTlVMTCkgPCAwKSB7Ci0JCS8qCi0JCSAqIElmIHJlY29ubmVjdCB3YXMgaW1wb3NzaWJsZSBldmVuIHRob3VnaCB3ZSBhcmUgaW4gdGhlCi0JCSAqIGN1cnJlbnQgZ2VuZXJhdGlvbiwgZmFsbCBiYWNrIGFuZCB0cnkgdG8gbG9nIGluIGFnYWluLgotCQkgKgotCQkgKiBXZSBjb3VsZCBjaGVjayBmb3IgIkZ1bmN0aW9uIHJlamVjdGVkIiBzdGF0dXMsIGJ1dAotCQkgKiBsb29raW5nIGF0IHRoZSBidXMgZ2VuZXJhdGlvbiBhcyBzaW1wbGVyIGFuZCBtb3JlIGdlbmVyYWwuCi0JCSAqLwotCQlzbXBfcm1iKCk7IC8qIGdldCBjdXJyZW50IGNhcmQgZ2VuZXJhdGlvbiAqLwotCQlpZiAoZ2VuZXJhdGlvbiA9PSBkZXZpY2UtPmNhcmQtPmdlbmVyYXRpb24gfHwKLQkJICAgIGx1LT5yZXRyaWVzKysgPj0gNSkgewotCQkJZndfZXJyb3IoIiVzOiBmYWlsZWQgdG8gcmVjb25uZWN0XG4iLCB0Z3QtPmJ1c19pZCk7Ci0JCQlsdS0+cmV0cmllcyA9IDA7Ci0JCQlQUkVQQVJFX0RFTEFZRURfV09SSygmbHUtPndvcmssIHNicDJfbG9naW4pOwotCQl9Ci0JCXNicDJfcXVldWVfd29yayhsdSwgRElWX1JPVU5EX1VQKEhaLCA1KSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXRndC0+bm9kZV9pZCAgICAgID0gbm9kZV9pZDsKLQl0Z3QtPmFkZHJlc3NfaGlnaCA9IGxvY2FsX25vZGVfaWQgPDwgMTY7Ci0Jc21wX3dtYigpOwkgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwotCWx1LT5nZW5lcmF0aW9uCSAgPSBnZW5lcmF0aW9uOwotCi0JZndfbm90aWZ5KCIlczogcmVjb25uZWN0ZWQgdG8gTFVOICUwNHggKCVkIHJldHJpZXMpXG4iLAotCQkgIHRndC0+YnVzX2lkLCBsdS0+bHVuLCBsdS0+cmV0cmllcyk7Ci0KLQlzYnAyX2FnZW50X3Jlc2V0KGx1KTsKLQlzYnAyX2NhbmNlbF9vcmJzKGx1KTsKLQlzYnAyX2NvbmRpdGlvbmFsbHlfdW5ibG9jayhsdSk7Ci0gb3V0OgotCXNicDJfdGFyZ2V0X3B1dCh0Z3QpOwotfQotCiBzdGF0aWMgdm9pZCBzYnAyX3VwZGF0ZShzdHJ1Y3QgZndfdW5pdCAqdW5pdCkKIHsKIAlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGRldl9nZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlKTsKQEAgLTEyNzcsNiArMTIwMCw1MSBAQAogCX0KIH0KIAorc3RhdGljIGludCBzYnAyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZ3X3VuaXQgKnVuaXQgPSBmd191bml0KGRldik7CisJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gZndfcGFyZW50X2RldmljZSh1bml0KTsKKwlzdHJ1Y3Qgc2JwMl90YXJnZXQgKnRndCA9IGRldl9nZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlKTsKKwlzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1LCAqbmV4dDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9CisJCWNvbnRhaW5lcl9vZigodm9pZCAqKXRndCwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGFbMF0pOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKworCS8qIHByZXZlbnQgZGVhZGxvY2tzICovCisJc2JwMl91bmJsb2NrKHRndCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHUsIG5leHQsICZ0Z3QtPmx1X2xpc3QsIGxpbmspIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZsdS0+d29yayk7CisJCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXAoc2hvc3QsIDAsIDAsIHNicDJfbHVuMmludChsdS0+bHVuKSk7CisJCWlmIChzZGV2KSB7CisJCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CisJCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJCX0KKwkJaWYgKGx1LT5sb2dpbl9pZCAhPSBJTlZBTElEX0xPR0lOX0lEKSB7CisJCQlpbnQgZ2VuZXJhdGlvbiwgbm9kZV9pZDsKKwkJCS8qCisJCQkgKiB0Z3QtPm5vZGVfaWQgbWF5IGJlIG9ic29sZXRlIGhlcmUgaWYgd2UgZmFpbGVkCisJCQkgKiBkdXJpbmcgaW5pdGlhbCBsb2dpbiBvciBhZnRlciBhIGJ1cyByZXNldCB3aGVyZQorCQkJICogdGhlIHRvcG9sb2d5IGNoYW5nZWQuCisJCQkgKi8KKwkJCWdlbmVyYXRpb24gPSBkZXZpY2UtPmdlbmVyYXRpb247CisJCQlzbXBfcm1iKCk7IC8qIG5vZGVfaWQgdnMuIGdlbmVyYXRpb24gKi8KKwkJCW5vZGVfaWQgICAgPSBkZXZpY2UtPm5vZGVfaWQ7CisJCQlzYnAyX3NlbmRfbWFuYWdlbWVudF9vcmIobHUsIG5vZGVfaWQsIGdlbmVyYXRpb24sCisJCQkJCQkgU0JQMl9MT0dPVVRfUkVRVUVTVCwKKwkJCQkJCSBsdS0+bG9naW5faWQsIE5VTEwpOworCQl9CisJCWZ3X2NvcmVfcmVtb3ZlX2FkZHJlc3NfaGFuZGxlcigmbHUtPmFkZHJlc3NfaGFuZGxlcik7CisJCWxpc3RfZGVsKCZsdS0+bGluayk7CisJCWtmcmVlKGx1KTsKKwl9CisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisJZndfbm90aWZ5KCJyZWxlYXNlZCAlcywgdGFyZ2V0ICVkOjA6MFxuIiwgdGd0LT5idXNfaWQsIHNob3N0LT5ob3N0X25vKTsKKworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFNCUDJfVU5JVF9TUEVDX0lEX0VOVFJZCTB4MDAwMDYwOWUKICNkZWZpbmUgU0JQMl9TV19WRVJTSU9OX0VOVFJZCTB4MDAwMTA0ODMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKaW5kZXggZjFiN2Y2NS4uZTIyOTU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCkBAIC0xNTEsNyArMTUxLDggQEAKIAkJcCArPSBzY25wcmludGYocCwgbGVmdCwgIlx0YmFzZV9hZGRyZXNzOiAleFxuIiwKIAkJCSAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLmlzYS5iYXNlX2FkZHJlc3MpOwogCX0gZWxzZSBpZiAoIXN0cm5jbXAoaW5mby0+cGFyYW1zLmhvc3RfYnVzX3R5cGUsICJQQ0lYIiwgNCkgfHwKLQkJICAgIXN0cm5jbXAoaW5mby0+cGFyYW1zLmhvc3RfYnVzX3R5cGUsICJQQ0kiLCAzKSkgeworCQkgICAhc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIlBDSSIsIDMpIHx8CisJCSAgICFzdHJuY21wKGluZm8tPnBhcmFtcy5ob3N0X2J1c190eXBlLCAiWFBSUyIsIDQpKSB7CiAJCXAgKz0gc2NucHJpbnRmKHAsIGxlZnQsCiAJCQkgICAgICJcdCUwMng6JTAyeC4lZCAgY2hhbm5lbDogJXVcbiIsCiAJCQkgICAgIGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuYnVzLApAQCAtMTU5LDcgKzE2MCw2IEBACiAJCQkgICAgIGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuZnVuY3Rpb24sCiAJCQkgICAgIGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuY2hhbm5lbCk7CiAJfSBlbHNlIGlmICghc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIklCTkQiLCA0KSB8fAotCQkgICAhc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIlhQUlMiLCA0KSB8fAogCQkgICAhc3RybmNtcChpbmZvLT5wYXJhbXMuaG9zdF9idXNfdHlwZSwgIkhUUFQiLCA0KSkgewogCQlwICs9IHNjbnByaW50ZihwLCBsZWZ0LAogCQkJICAgICAiXHRUQkQ6ICVsbHhcbiIsCkBAIC02NjgsNyArNjY4LDcgQEAKIHsKIAlzdHJ1Y3QgZWRkX2luZm8gKmluZm8gPSBlZGRfZGV2X2dldF9pbmZvKGVkZXYpOwogCi0JaWYgKGVkZF9kZXZfaXNfdHlwZShlZGV2LCAiUENJIikpIHsKKwlpZiAoZWRkX2Rldl9pc190eXBlKGVkZXYsICJQQ0kiKSB8fCBlZGRfZGV2X2lzX3R5cGUoZWRldiwgIlhQUlMiKSkgewogCQlyZXR1cm4gcGNpX2dldF9idXNfYW5kX3Nsb3QoaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5idXMsCiAJCQkJICAgICBQQ0lfREVWRk4oaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5zbG90LAogCQkJCQkgICAgICAgaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKaW5kZXggZWI4MGI1NC4uODM3MGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKQEAgLTQ5MCw4ICs0OTAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTY0IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKLQkJCSAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgKmlkLAorCQl1bnNpZ25lZCBpbnQgcGFydCwgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCWNoYXIgbmFtZVtEVU1QX05BTUVfTEVOXTsKIAljaGFyIHN0dWJfbmFtZVtEVU1QX05BTUVfTEVOXTsKQEAgLTQ5OSw3ICs0OTksNyBAQAogCWVmaV9ndWlkX3QgdmVuZG9yID0gTElOVVhfRUZJX0NSQVNIX0dVSUQ7CiAJc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMgPSBwc2ktPmRhdGE7CiAJc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksICpmb3VuZCA9IE5VTEw7Ci0JaW50IGk7CisJaW50IGksIHJldCA9IDA7CiAKIAlzcHJpbnRmKHN0dWJfbmFtZSwgImR1bXAtdHlwZSV1LSV1LSIsIHR5cGUsIHBhcnQpOwogCXNwcmludGYobmFtZSwgIiVzJWx1Iiwgc3R1Yl9uYW1lLCBnZXRfc2Vjb25kcygpKTsKQEAgLTU0OCwxOCArNTQ4LDE5IEBACiAJCWVmaXZhcl91bnJlZ2lzdGVyKGZvdW5kKTsKIAogCWlmIChzaXplKQotCQllZml2YXJfY3JlYXRlX3N5c2ZzX2VudHJ5KGVmaXZhcnMsCisJCXJldCA9IGVmaXZhcl9jcmVhdGVfc3lzZnNfZW50cnkoZWZpdmFycywKIAkJCQkJICB1dGYxNl9zdHJzaXplKGVmaV9uYW1lLAogCQkJCQkJCURVTVBfTkFNRV9MRU4gKiAyKSwKIAkJCQkJICBlZmlfbmFtZSwgJnZlbmRvcik7CiAKLQlyZXR1cm4gcGFydDsKKwkqaWQgPSBwYXJ0OworCXJldHVybiByZXQ7CiB9OwogCiBzdGF0aWMgaW50IGVmaV9wc3RvcmVfZXJhc2UoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCiAJCQkgICAgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7Ci0JZWZpX3BzdG9yZV93cml0ZSh0eXBlLCBpZCwgMCwgcHNpKTsKKwllZmlfcHN0b3JlX3dyaXRlKHR5cGUsICZpZCwgKHVuc2lnbmVkIGludClpZCwgMCwgcHNpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTgwLDggKzU4MSw4IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdTY0IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKLQkJCSAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgKmlkLAorCQl1bnNpZ25lZCBpbnQgcGFydCwgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCXJldHVybiAwOwogfQpAQCAtOTc4LDcgKzk3OSw3IEBACiAJaWYgKGVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWYpIHsKIAkJZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1ZnNpemUgPSAxMDI0OwogCQllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uZGF0YSA9IGVmaXZhcnM7Ci0JCW11dGV4X2luaXQoJmVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWZfbXV0ZXgpOworCQlzcGluX2xvY2tfaW5pdCgmZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1Zl9sb2NrKTsKIAkJcHN0b3JlX3JlZ2lzdGVyKCZlZml2YXJzLT5lZmlfcHN0b3JlX2luZm8pOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCmluZGV4IGFhODNkZTkuLmM0ZTdjNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBHU01JX1NIVVRET1dOX0NMRUFOCTAJLyogQ2xlYW4gU2h1dGRvd24gKi8KIC8qIFRPRE8obWlrZXdAZ29vZ2xlLmNvbSk6IFRpZSBpbiBIQVJETE9DS1VQX0RFVEVDVE9SIHdpdGggTk1JV0RUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCmluZGV4IGQ1MzllZmQuLjg0ODJhMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCkBAIC05NSwxNCArOTUsMTggQEAKIAlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYCiAJc2VsZWN0IEdQSU9fR0VORVJJQwogCi1jb25maWcgR1BJT19FWFlOT1M0Ci0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gQ1BVX0VYWU5PUzQyMTAKLQogY29uZmlnIEdQSU9fTVBDNTIwMAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4CiAKK2NvbmZpZyBHUElPX01QQzhYWFgKKwlib29sICJNUEM1MTJ4L01QQzh4eHggR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX01QQzUxMnggfHwgUFBDX01QQzgzMXggfHwgUFBDX01QQzgzNHggfHwgUFBDX01QQzgzN3ggfHwgXAorCQkgICBGU0xfU09DX0JPT0tFIHx8IFBQQ184Nnh4CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UncmUgZ29pbmcgdG8gdXNlIGhhcmR3YXJlIHRoYXQgY29ubmVjdHMgdG8gdGhlCisJICBNUEM1MTJ4LzgzMXgvODM0eC84Mzd4Lzg1NzIvODYxMCBHUElPcy4KKwogY29uZmlnIEdQSU9fTVNNX1YxCiAJdHJpc3RhdGUgIlF1YWxjb21tIE1TTSBHUElPIHYxIgogCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUkNIX01TTQpAQCAtMTMxLDE4ICsxMzUsNiBAQAogCXNlbGVjdCBHUElPX0dFTkVSSUMKIAlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCi1jb25maWcgR1BJT19QTEFUX1NBTVNVTkcKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBTQU1TVU5HX0dQSU9MSUJfNEJJVAotCi1jb25maWcgR1BJT19TNVBDMTAwCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gQ1BVX1M1UEMxMDAKLQotY29uZmlnIEdQSU9fUzVQVjIxMAotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIENQVV9TNVBWMjEwCi0KIGNvbmZpZyBHUElPX1BMMDYxCiAJYm9vbCAiUHJpbWVDZWxsIFBMMDYxIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSTV9BTUJBCkBAIC0xNzgsOSArMTcwLDE4IEBACiAJICBUaGUgSW50ZWwgVHVubmVsIENyZWVrIHByb2Nlc3NvciBoYXMgNSBHUElPcyBwb3dlcmVkIGJ5IHRoZQogCSAgY29yZSBwb3dlciByYWlsIGFuZCA5IGZyb20gc3VzcGVuZCBwb3dlciBzdXBwbHkuCiAKK2NvbmZpZyBHUElPX1UzMDAKKwlib29sICJTVC1Fcmljc3NvbiBVMzAwIENPSCA5MDEgMzM1LzU3MSBHUElPIgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUkNIX1UzMDAKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCBHUElPIGludGVyZmFjZSBvbiBTVC1Fcmljc3NvbiBVMzAwLgorCSAgVGhlIG5hbWVzIG9mIHRoZSB0d28gSVAgYmxvY2sgdmFyaWFudHMgc3VwcG9ydGVkIGFyZQorCSAgQ09IIDkwMSAzMzUgYW5kIENPSCA5MDEgNTcxLzMuIFRoZXkgY29udGFpbiAzLCA1IG9yIDcKKwkgIHBvcnRzIG9mIDggR1BJTyBwaW5zIGVhY2guCisKIGNvbmZpZyBHUElPX1ZYODU1CiAJdHJpc3RhdGUgIlZJQSBWWDg1NS9WWDg3NSBHUElPIgotCWRlcGVuZHMgb24gTUZEX1NVUFBPUlQgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgTUZEX1ZYODU1CiAJaGVscApAQCAtMzg4LDYgKzM4OSw3IEBACiBjb25maWcgR1BJT19QQ0gKIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIIC8gT0tJIFNFTUlDT05EVUNUT1IgTUw3MjIzIElPSCBHUElPIgogCWRlcGVuZHMgb24gUENJICYmIFg4NgorCXNlbGVjdCBHRU5FUklDX0lSUV9DSElQCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIFBDSChQbGF0Zm9ybSBjb250cm9sbGVyIEh1YikgR1BJTyBvZiBJbnRlbCBUb3BjbGlmZgogCSAgd2hpY2ggaXMgYW4gSU9IKElucHV0L091dHB1dCBIdWIpIGZvciB4ODYgZW1iZWRkZWQgcHJvY2Vzc29yLgpAQCAtNDAyLDYgKzQwNCw3IEBACiBjb25maWcgR1BJT19NTF9JT0gKIAl0cmlzdGF0ZSAiT0tJIFNFTUlDT05EVUNUT1IgTUw3MjEzIElPSCBHUElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCWhlbHAKIAkgIE1MNzIxMyBpcyBjb21wYW5pb24gY2hpcCBmb3IgSW50ZWwgQXRvbSBFNnh4IHNlcmllcy4KIAkgIFRoaXMgZHJpdmVyIGNhbiBiZSB1c2VkIGZvciBPS0kgU0VNSUNPTkRVQ1RPUiBNTDcyMTMgSU9IKElucHV0L091dHB1dApAQCAtNDE3LDcgKzQyMCw2IEBACiBjb25maWcgR1BJT19SREMzMjFYCiAJdHJpc3RhdGUgIlJEQyBSLTMyMXggR1BJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCi0Jc2VsZWN0IE1GRF9TVVBQT1JUCiAJc2VsZWN0IE1GRF9DT1JFCiAJc2VsZWN0IE1GRF9SREMzMjFYCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCmluZGV4IDk1ODg5NDguLmRiY2IwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKQEAgLTE0LDExICsxNCwxMyBAQAogb2JqLSQoQ09ORklHX0dQSU9fQlQ4WFgpCSs9IGdwaW8tYnQ4eHgubwogb2JqLSQoQ09ORklHX0dQSU9fQ1M1NTM1KQkrPSBncGlvLWNzNTUzNS5vCiBvYmotJChDT05GSUdfR1BJT19EQTkwNTIpCSs9IGdwaW8tZGE5MDUyLm8KK29iai0kKENPTkZJR19BUkNIX0RBVklOQ0kpCSs9IGdwaW8tZGF2aW5jaS5vCiBvYmotJChDT05GSUdfR1BJT19FUDkzWFgpCSs9IGdwaW8tZXA5M3h4Lm8KLW9iai0kKENPTkZJR19HUElPX0VYWU5PUzQpCSs9IGdwaW8tZXh5bm9zNC5vCiBvYmotJChDT05GSUdfR1BJT19JVDg3NjFFKQkrPSBncGlvLWl0ODc2MWUubwogb2JqLSQoQ09ORklHX0dQSU9fSkFOWl9UVEwpCSs9IGdwaW8tamFuei10dGwubworb2JqLSQoQ09ORklHX01BQ0hfS1M4Njk1KQkrPSBncGlvLWtzODY5NS5vCiBvYmotJChDT05GSUdfR1BJT19MQU5HV0VMTCkJKz0gZ3Bpby1sYW5nd2VsbC5vCitvYmotJChDT05GSUdfQVJDSF9MUEMzMlhYKQkrPSBncGlvLWxwYzMyeHgubwogb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwWCkJKz0gZ3Bpby1tYXg3MzB4Lm8KIG9iai0kKENPTkZJR19HUElPX01BWDczMDApCSs9IGdwaW8tbWF4NzMwMC5vCiBvYmotJChDT05GSUdfR1BJT19NQVg3MzAxKQkrPSBncGlvLW1heDczMDEubwpAQCAtMjcsNiArMjksNyBAQAogb2JqLSQoQ09ORklHX0dQSU9fTUNQMjNTMDgpCSs9IGdwaW8tbWNwMjNzMDgubwogb2JqLSQoQ09ORklHX0dQSU9fTUxfSU9IKQkrPSBncGlvLW1sLWlvaC5vCiBvYmotJChDT05GSUdfR1BJT19NUEM1MjAwKQkrPSBncGlvLW1wYzUyMDAubworb2JqLSQoQ09ORklHX0dQSU9fTVBDOFhYWCkJKz0gZ3Bpby1tcGM4eHh4Lm8KIG9iai0kKENPTkZJR19HUElPX01TTV9WMSkJKz0gZ3Bpby1tc20tdjEubwogb2JqLSQoQ09ORklHX0dQSU9fTVNNX1YyKQkrPSBncGlvLW1zbS12Mi5vCiBvYmotJChDT05GSUdfR1BJT19NWEMpCQkrPSBncGlvLW14Yy5vCkBAIC0zNywxOCArNDAsMTcgQEAKIG9iai0kKENPTkZJR19HUElPX1BDRjg1N1gpCSs9IGdwaW8tcGNmODU3eC5vCiBvYmotJChDT05GSUdfR1BJT19QQ0gpCQkrPSBncGlvLXBjaC5vCiBvYmotJChDT05GSUdfR1BJT19QTDA2MSkJKz0gZ3Bpby1wbDA2MS5vCitvYmotJChDT05GSUdfUExBVF9QWEEpCQkrPSBncGlvLXB4YS5vCiBvYmotJChDT05GSUdfR1BJT19SREMzMjFYKQkrPSBncGlvLXJkYzMyMXgubwotCi1vYmotJChDT05GSUdfR1BJT19QTEFUX1NBTVNVTkcpCSs9IGdwaW8tcGxhdC1zYW1zdW5nLm8KLW9iai0kKENPTkZJR19HUElPX1M1UEMxMDApCSs9IGdwaW8tczVwYzEwMC5vCi1vYmotJChDT05GSUdfR1BJT19TNVBWMjEwKQkrPSBncGlvLXM1cHYyMTAubwotCitvYmotJChDT05GSUdfUExBVF9TQU1TVU5HKQkrPSBncGlvLXNhbXN1bmcubworb2JqLSQoQ09ORklHX0FSQ0hfU0ExMTAwKQkrPSBncGlvLXNhMTEwMC5vCiBvYmotJChDT05GSUdfR1BJT19TQ0gpCQkrPSBncGlvLXNjaC5vCiBvYmotJChDT05GSUdfR1BJT19TVE1QRSkJKz0gZ3Bpby1zdG1wZS5vCiBvYmotJChDT05GSUdfR1BJT19TWDE1MFgpCSs9IGdwaW8tc3gxNTB4Lm8KIG9iai0kKENPTkZJR19HUElPX1RDMzU4OVgpCSs9IGdwaW8tdGMzNTg5eC5vCiBvYmotJChDT05GSUdfQVJDSF9URUdSQSkJKz0gZ3Bpby10ZWdyYS5vCiBvYmotJChDT05GSUdfR1BJT19USU1CRVJEQUxFKQkrPSBncGlvLXRpbWJlcmRhbGUubworb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSV9UTkVUVjEwN1gpICs9IGdwaW8tdG5ldHYxMDd4Lm8KIG9iai0kKENPTkZJR19HUElPX1RQUzY1OTEwKQkrPSBncGlvLXRwczY1OTEwLm8KIG9iai0kKENPTkZJR19HUElPX1RQUzY1OTEyKQkrPSBncGlvLXRwczY1OTEyLm8KIG9iai0kKENPTkZJR19HUElPX1RXTDQwMzApCSs9IGdwaW8tdHdsNDAzMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby03NHgxNjQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLTc0eDE2NC5jCmluZGV4IGZmNTI1YzAuLmEzMWFkNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLTc0eDE2NC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLTc0eDE2NC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpLzc0eDE2NC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBnZW5fNzR4MTY0X2NoaXAgewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1kYXZpbmNpLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1kYXZpbmNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwZDU5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWRhdmluY2kuYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIFRJIERhVmluY2kgR1BJTyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgRGF2aWQgQnJvd25lbGwKKyAqIENvcHlyaWdodCAoYykgMjAwNywgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIHsKKwl1MzIJZGlyOworCXUzMglvdXRfZGF0YTsKKwl1MzIJc2V0X2RhdGE7CisJdTMyCWNscl9kYXRhOworCXUzMglpbl9kYXRhOworCXUzMglzZXRfcmlzaW5nOworCXUzMgljbHJfcmlzaW5nOworCXUzMglzZXRfZmFsbGluZzsKKwl1MzIJY2xyX2ZhbGxpbmc7CisJdTMyCWludHN0YXQ7Cit9OworCisjZGVmaW5lIGNoaXAyY29udHJvbGxlcihjaGlwKQlcCisJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciwgY2hpcCkKKworc3RhdGljIHN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciBjaGlwc1tESVZfUk9VTkRfVVAoREFWSU5DSV9OX0dQSU8sIDMyKV07CitzdGF0aWMgdm9pZCBfX2lvbWVtICpncGlvX2Jhc2U7CisKK3N0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSBfX2luaXQgKmdwaW8ycmVncyh1bnNpZ25lZCBncGlvKQoreworCXZvaWQgX19pb21lbSAqcHRyOworCisJaWYgKGdwaW8gPCAzMiAqIDEpCisJCXB0ciA9IGdwaW9fYmFzZSArIDB4MTA7CisJZWxzZSBpZiAoZ3BpbyA8IDMyICogMikKKwkJcHRyID0gZ3Bpb19iYXNlICsgMHgzODsKKwllbHNlIGlmIChncGlvIDwgMzIgKiAzKQorCQlwdHIgPSBncGlvX2Jhc2UgKyAweDYwOworCWVsc2UgaWYgKGdwaW8gPCAzMiAqIDQpCisJCXB0ciA9IGdwaW9fYmFzZSArIDB4ODg7CisJZWxzZSBpZiAoZ3BpbyA8IDMyICogNSkKKwkJcHRyID0gZ3Bpb19iYXNlICsgMHhiMDsKKwllbHNlCisJCXB0ciA9IE5VTEw7CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqaXJxMnJlZ3MoaW50IGlycSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZzsKKworCWcgPSAoX19mb3JjZSBzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqKWlycV9nZXRfY2hpcF9kYXRhKGlycSk7CisKKwlyZXR1cm4gZzsKK30KKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9ncGlvX2lycV9zZXR1cCh2b2lkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGJvYXJkIHNldHVwIGNvZGUgKk1VU1QqIHNldHVwIHBpbm11eCBhbmQgZW5hYmxlIHRoZSBHUElPIGNsb2NrLiAqLworc3RhdGljIGlubGluZSBpbnQgX19kYXZpbmNpX2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJdW5zaWduZWQgb2Zmc2V0LCBib29sIG91dCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqZCA9IGNoaXAyY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGQtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdGVtcDsKKwl1MzIgbWFzayA9IDEgPDwgb2Zmc2V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKwl0ZW1wID0gX19yYXdfcmVhZGwoJmctPmRpcik7CisJaWYgKG91dCkgeworCQl0ZW1wICY9IH5tYXNrOworCQlfX3Jhd193cml0ZWwobWFzaywgdmFsdWUgPyAmZy0+c2V0X2RhdGEgOiAmZy0+Y2xyX2RhdGEpOworCX0gZWxzZSB7CisJCXRlbXAgfD0gbWFzazsKKwl9CisJX19yYXdfd3JpdGVsKHRlbXAsICZnLT5kaXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfZGlyZWN0aW9uX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19kYXZpbmNpX2RpcmVjdGlvbihjaGlwLCBvZmZzZXQsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIGludAorZGF2aW5jaV9kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXJldHVybiBfX2RhdmluY2lfZGlyZWN0aW9uKGNoaXAsIG9mZnNldCwgdHJ1ZSwgdmFsdWUpOworfQorCisvKgorICogUmVhZCB0aGUgcGluJ3MgdmFsdWUgKHdvcmtzIGV2ZW4gaWYgaXQncyBzZXQgdXAgYXMgb3V0cHV0KTsKKyAqIHJldHVybnMgemVyby9ub256ZXJvLgorICoKKyAqIE5vdGUgdGhhdCBjaGFuZ2VzIGFyZSBzeW5jaGVkIHRvIHRoZSBHUElPIGNsb2NrLCBzbyByZWFkaW5nIHZhbHVlcyBiYWNrCisgKiByaWdodCBhZnRlciB5b3UndmUgc2V0IHRoZW0gbWF5IGdpdmUgb2xkIHZhbHVlcy4KKyAqLworc3RhdGljIGludCBkYXZpbmNpX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQgPSBjaGlwMmNvbnRyb2xsZXIoY2hpcCk7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBkLT5yZWdzOworCisJcmV0dXJuICgxIDw8IG9mZnNldCkgJiBfX3Jhd19yZWFkbCgmZy0+aW5fZGF0YSk7Cit9CisKKy8qCisgKiBBc3N1bWluZyB0aGUgcGluIGlzIG11eGVkIGFzIGEgZ3BpbyBvdXRwdXQsIHNldCBpdHMgb3V0cHV0IHZhbHVlLgorICovCitzdGF0aWMgdm9pZAorZGF2aW5jaV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQgPSBjaGlwMmNvbnRyb2xsZXIoY2hpcCk7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBkLT5yZWdzOworCisJX19yYXdfd3JpdGVsKCgxIDw8IG9mZnNldCksIHZhbHVlID8gJmctPnNldF9kYXRhIDogJmctPmNscl9kYXRhKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9ncGlvX3NldHVwKHZvaWQpCit7CisJaW50IGksIGJhc2U7CisJdW5zaWduZWQgbmdwaW87CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzICpyZWdzOworCisJaWYgKHNvY19pbmZvLT5ncGlvX3R5cGUgIT0gR1BJT19UWVBFX0RBVklOQ0kpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGUgZ3BpbyBiYW5rcyBjb25jZXB0dWFsbHkgZXhwb3NlIGEgc2VnbWVudGVkIGJpdG1hcCwKKwkgKiBhbmQgIm5ncGlvIiBpcyBvbmUgbW9yZSB0aGFuIHRoZSBsYXJnZXN0IHplcm8tYmFzZWQKKwkgKiBiaXQgaW5kZXggdGhhdCdzIHZhbGlkLgorCSAqLworCW5ncGlvID0gc29jX2luZm8tPmdwaW9fbnVtOworCWlmIChuZ3BpbyA9PSAwKSB7CisJCXByX2VycigiR1BJTyBzZXR1cDogIGhvdyBtYW55IEdQSU9zP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChXQVJOX09OKERBVklOQ0lfTl9HUElPIDwgbmdwaW8pKQorCQluZ3BpbyA9IERBVklOQ0lfTl9HUElPOworCisJZ3Bpb19iYXNlID0gaW9yZW1hcChzb2NfaW5mby0+Z3Bpb19iYXNlLCBTWl80Syk7CisJaWYgKFdBUk5fT04oIWdwaW9fYmFzZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCwgYmFzZSA9IDA7IGJhc2UgPCBuZ3BpbzsgaSsrLCBiYXNlICs9IDMyKSB7CisJCWNoaXBzW2ldLmNoaXAubGFiZWwgPSAiRGFWaW5jaSI7CisKKwkJY2hpcHNbaV0uY2hpcC5kaXJlY3Rpb25faW5wdXQgPSBkYXZpbmNpX2RpcmVjdGlvbl9pbjsKKwkJY2hpcHNbaV0uY2hpcC5nZXQgPSBkYXZpbmNpX2dwaW9fZ2V0OworCQljaGlwc1tpXS5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBkYXZpbmNpX2RpcmVjdGlvbl9vdXQ7CisJCWNoaXBzW2ldLmNoaXAuc2V0ID0gZGF2aW5jaV9ncGlvX3NldDsKKworCQljaGlwc1tpXS5jaGlwLmJhc2UgPSBiYXNlOworCQljaGlwc1tpXS5jaGlwLm5ncGlvID0gbmdwaW8gLSBiYXNlOworCQlpZiAoY2hpcHNbaV0uY2hpcC5uZ3BpbyA+IDMyKQorCQkJY2hpcHNbaV0uY2hpcC5uZ3BpbyA9IDMyOworCisJCXNwaW5fbG9ja19pbml0KCZjaGlwc1tpXS5sb2NrKTsKKworCQlyZWdzID0gZ3BpbzJyZWdzKGJhc2UpOworCQljaGlwc1tpXS5yZWdzID0gcmVnczsKKwkJY2hpcHNbaV0uc2V0X2RhdGEgPSAmcmVncy0+c2V0X2RhdGE7CisJCWNoaXBzW2ldLmNscl9kYXRhID0gJnJlZ3MtPmNscl9kYXRhOworCQljaGlwc1tpXS5pbl9kYXRhID0gJnJlZ3MtPmluX2RhdGE7CisKKwkJZ3Bpb2NoaXBfYWRkKCZjaGlwc1tpXS5jaGlwKTsKKwl9CisKKwlzb2NfaW5mby0+Z3Bpb19jdGxycyA9IGNoaXBzOworCXNvY19pbmZvLT5ncGlvX2N0bHJzX251bSA9IERJVl9ST1VORF9VUChuZ3BpbywgMzIpOworCisJZGF2aW5jaV9ncGlvX2lycV9zZXR1cCgpOworCXJldHVybiAwOworfQorcHVyZV9pbml0Y2FsbChkYXZpbmNpX2dwaW9fc2V0dXApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXZSBleHBlY3QgaXJxcyB3aWxsIG5vcm1hbGx5IGJlIHNldCB1cCBhcyBpbnB1dCBwaW5zLCBidXQgdGhleSBjYW4gYWxzbyBiZQorICogdXNlZCBhcyBvdXRwdXQgcGlucyAuLi4gd2hpY2ggaXMgY29udmVuaWVudCBmb3IgdGVzdGluZy4KKyAqCisgKiBOT1RFOiAgVGhlIGZpcnN0IGZldyBHUElPcyBhbHNvIGhhdmUgZGlyZWN0IElOVEMgaG9va3VwcyBpbiBhZGRpdGlvbgorICogdG8gdGhlaXIgR1BJT0JOSzAgaXJxLCB3aXRoIGEgYml0IGxlc3Mgb3ZlcmhlYWQuCisgKgorICogQWxsIHRob3NlIElOVEMgaG9va3VwcyAoZGlyZWN0LCBwbHVzIHNldmVyYWwgSVJRIGJhbmtzKSBjYW4gYWxzbworICogc2VydmUgYXMgRURNQSBldmVudCB0cmlnZ2Vycy4KKyAqLworCitzdGF0aWMgdm9pZCBncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGQtPmlycSk7CisJdTMyIG1hc2sgPSAodTMyKSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKKworCV9fcmF3X3dyaXRlbChtYXNrLCAmZy0+Y2xyX2ZhbGxpbmcpOworCV9fcmF3X3dyaXRlbChtYXNrLCAmZy0+Y2xyX3Jpc2luZyk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzIF9faW9tZW0gKmcgPSBpcnEycmVncyhkLT5pcnEpOworCXUzMiBtYXNrID0gKHUzMikgaXJxX2RhdGFfZ2V0X2lycV9oYW5kbGVyX2RhdGEoZCk7CisJdW5zaWduZWQgc3RhdHVzID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGQpOworCisJc3RhdHVzICY9IElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0VER0VfUklTSU5HOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORzsKKworCWlmIChzdGF0dXMgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCV9fcmF3X3dyaXRlbChtYXNrLCAmZy0+c2V0X2ZhbGxpbmcpOworCWlmIChzdGF0dXMgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJX19yYXdfd3JpdGVsKG1hc2ssICZnLT5zZXRfcmlzaW5nKTsKK30KKworc3RhdGljIGludCBncGlvX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKK3sKKwlpZiAodHJpZ2dlciAmIH4oSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdwaW9faXJxY2hpcCA9IHsKKwkubmFtZQkJPSAiR1BJTyIsCisJLmlycV9lbmFibGUJPSBncGlvX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gZ3Bpb19pcnFfZGlzYWJsZSwKKwkuaXJxX3NldF90eXBlCT0gZ3Bpb19pcnFfdHlwZSwKKwkuZmxhZ3MJCT0gSVJRQ0hJUF9TRVRfVFlQRV9NQVNLRUQsCit9OworCitzdGF0aWMgdm9pZAorZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZzsKKwl1MzIgbWFzayA9IDB4ZmZmZjsKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQ7CisKKwlkID0gKHN0cnVjdCBkYXZpbmNpX2dwaW9fY29udHJvbGxlciAqKWlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJZyA9IChzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqKWQtPnJlZ3M7CisKKwkvKiB3ZSBvbmx5IGNhcmUgYWJvdXQgb25lIGJhbmsgKi8KKwlpZiAoaXJxICYgMSkKKwkJbWFzayA8PD0gMTY7CisKKwkvKiB0ZW1wb3JhcmlseSBtYXNrIChsZXZlbCBzZW5zaXRpdmUpIHBhcmVudCBJUlEgKi8KKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfbWFzaygmZGVzYy0+aXJxX2RhdGEpOworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKKwl3aGlsZSAoMSkgeworCQl1MzIJCXN0YXR1czsKKwkJaW50CQluOworCQlpbnQJCXJlczsKKworCQkvKiBhY2sgYW55IGlycXMgKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoJmctPmludHN0YXQpICYgbWFzazsKKwkJaWYgKCFzdGF0dXMpCisJCQlicmVhazsKKwkJX19yYXdfd3JpdGVsKHN0YXR1cywgJmctPmludHN0YXQpOworCisJCS8qIG5vdyBkZW11eCB0aGVtIHRvIHRoZSByaWdodCBsb3dsZXZlbCBoYW5kbGVyICovCisJCW4gPSBkLT5pcnFfYmFzZTsKKwkJaWYgKGlycSAmIDEpIHsKKwkJCW4gKz0gMTY7CisJCQlzdGF0dXMgPj49IDE2OworCQl9CisKKwkJd2hpbGUgKHN0YXR1cykgeworCQkJcmVzID0gZmZzKHN0YXR1cyk7CisJCQluICs9IHJlczsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShuIC0gMSk7CisJCQlzdGF0dXMgPj49IHJlczsKKwkJfQorCX0KKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfdW5tYXNrKCZkZXNjLT5pcnFfZGF0YSk7CisJLyogbm93IGl0IG1heSByZS10cmlnZ2VyICovCit9CisKK3N0YXRpYyBpbnQgZ3Bpb190b19pcnFfYmFua2VkKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX2NvbnRyb2xsZXIgKmQgPSBjaGlwMmNvbnRyb2xsZXIoY2hpcCk7CisKKwlpZiAoZC0+aXJxX2Jhc2UgPj0gMCkKKwkJcmV0dXJuIGQtPmlycV9iYXNlICsgb2Zmc2V0OworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb190b19pcnFfdW5iYW5rZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBkYXZpbmNpX3NvY19pbmZvICpzb2NfaW5mbyA9ICZkYXZpbmNpX3NvY19pbmZvOworCisJLyogTk9URTogIHdlIGFzc3VtZSBmb3Igbm93IHRoYXQgb25seSBpcnFzIGluIHRoZSBmaXJzdCBncGlvX2NoaXAKKwkgKiBjYW4gcHJvdmlkZSBkaXJlY3QtbWFwcGVkIElSUXMgdG8gQUlOVEMgKHVwIHRvIDMyIEdQSU9zKS4KKwkgKi8KKwlpZiAob2Zmc2V0IDwgc29jX2luZm8tPmdwaW9fdW5iYW5rZWQpCisJCXJldHVybiBzb2NfaW5mby0+Z3Bpb19pcnEgKyBvZmZzZXQ7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBncGlvX2lycV90eXBlX3VuYmFua2VkKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9ncGlvX3JlZ3MgX19pb21lbSAqZyA9IGlycTJyZWdzKGQtPmlycSk7CisJdTMyIG1hc2sgPSAodTMyKSBpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkKTsKKworCWlmICh0cmlnZ2VyICYgfihJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCisJCXJldHVybiAtRUlOVkFMOworCisJX19yYXdfd3JpdGVsKG1hc2ssICh0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKQorCQkgICAgID8gJmctPnNldF9mYWxsaW5nIDogJmctPmNscl9mYWxsaW5nKTsKKwlfX3Jhd193cml0ZWwobWFzaywgKHRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX1JJU0lORykKKwkJICAgICA/ICZnLT5zZXRfcmlzaW5nIDogJmctPmNscl9yaXNpbmcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFOiAgZm9yIHN1c3BlbmQvcmVzdW1lLCBwcm9iYWJseSBiZXN0IHRvIG1ha2UgYSBwbGF0Zm9ybV9kZXZpY2Ugd2l0aAorICogc3VzcGVuZF9sYXRlL3Jlc3VtZV9yZXN1bWUgY2FsbHMgaG9va2luZyBpbnRvIHJlc3VsdHMgb2YgdGhlIHNldF93YWtlKCkKKyAqIGNhbGxzIC4uLiBzbyBpZiBubyBncGlvcyBhcmUgd2FrZXVwIGV2ZW50cyB0aGUgY2xvY2sgY2FuIGJlIGRpc2FibGVkLAorICogd2l0aCBvdXRwdXRzIGxlZnQgYXQgcHJldmlvdXNseSBzZXQgbGV2ZWxzLCBhbmQgc28gdGhhdCBWREQzUDNWLklPUFdETjAKKyAqIChkbTY0NDYpIGNhbiBiZSBzZXQgYXBwcm9wcmlhdGVseSBmb3IgR1BJT1YzMyBwaW5zLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRhdmluY2lfZ3Bpb19pcnFfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZAlncGlvLCBpcnEsIGJhbms7CisJc3RydWN0IGNsawkqY2xrOworCXUzMgkJYmludGVuID0gMDsKKwl1bnNpZ25lZAluZ3BpbywgYmFua19pcnE7CisJc3RydWN0IGRhdmluY2lfc29jX2luZm8gKnNvY19pbmZvID0gJmRhdmluY2lfc29jX2luZm87CisJc3RydWN0IGRhdmluY2lfZ3Bpb19yZWdzCV9faW9tZW0gKmc7CisKKwluZ3BpbyA9IHNvY19pbmZvLT5ncGlvX251bTsKKworCWJhbmtfaXJxID0gc29jX2luZm8tPmdwaW9faXJxOworCWlmIChiYW5rX2lycSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRG9uJ3Qga25vdyBmaXJzdCBHUElPIGJhbmsgSVJRLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNsayA9IGNsa19nZXQoTlVMTCwgImdwaW8iKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlbGQgZ2V0dGluZyBncGlvIGNsb2NrP1xuIiwKKwkJICAgICAgIFBUUl9FUlIoY2xrKSk7CisJCXJldHVybiBQVFJfRVJSKGNsayk7CisJfQorCWNsa19lbmFibGUoY2xrKTsKKworCS8qIEFycmFuZ2UgZ3Bpb190b19pcnEoKSBzdXBwb3J0LCBoYW5kbGluZyBlaXRoZXIgZGlyZWN0IElSUXMgb3IKKwkgKiBiYW5rZWQgSVJRcy4gIEhhdmluZyBHUElPcyBpbiB0aGUgZmlyc3QgR1BJTyBiYW5rIHVzZSBkaXJlY3QKKwkgKiBJUlFzLCB3aGlsZSB0aGUgb3RoZXJzIHVzZSBiYW5rZWQgSVJRcywgd291bGQgbmVlZCBzb21lIHNldHVwCisJICogdHdlYWtzIHRvIHJlY29nbml6ZSBoYXJkd2FyZSB3aGljaCBjYW4gZG8gdGhhdC4KKwkgKi8KKwlmb3IgKGdwaW8gPSAwLCBiYW5rID0gMDsgZ3BpbyA8IG5ncGlvOyBiYW5rKyssIGdwaW8gKz0gMzIpIHsKKwkJY2hpcHNbYmFua10uY2hpcC50b19pcnEgPSBncGlvX3RvX2lycV9iYW5rZWQ7CisJCWNoaXBzW2JhbmtdLmlycV9iYXNlID0gc29jX2luZm8tPmdwaW9fdW5iYW5rZWQKKwkJCT8gLUVJTlZBTAorCQkJOiAoc29jX2luZm8tPmludGNfaXJxX251bSArIGdwaW8pOworCX0KKworCS8qCisJICogQUlOVEMgY2FuIGhhbmRsZSBkaXJlY3QvdW5iYW5rZWQgSVJRcyBmb3IgR1BJT3MsIHdpdGggdGhlIEdQSU8KKwkgKiBjb250cm9sbGVyIG9ubHkgaGFuZGxpbmcgdHJpZ2dlciBtb2Rlcy4gIFdlIGN1cnJlbnRseSBhc3N1bWUgbm8KKwkgKiBJUlEgbXV4IGNvbmZsaWN0czsgZ3Bpb19pcnFfdHlwZV91bmJhbmtlZCgpIGlzIG9ubHkgZm9yIEdQSU9zLgorCSAqLworCWlmIChzb2NfaW5mby0+Z3Bpb191bmJhbmtlZCkgeworCQlzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdwaW9faXJxY2hpcF91bmJhbmtlZDsKKworCQkvKiBwYXNzICJiYW5rIDAiIEdQSU8gSVJRcyB0byBBSU5UQyAqLworCQljaGlwc1swXS5jaGlwLnRvX2lycSA9IGdwaW9fdG9faXJxX3VuYmFua2VkOworCQliaW50ZW4gPSBCSVQoMCk7CisKKwkJLyogQUlOVEMgaGFuZGxlcyBtYXNrL3VubWFzazsgR1BJTyBoYW5kbGVzIHRyaWdnZXJpbmcgKi8KKwkJaXJxID0gYmFua19pcnE7CisJCWdwaW9faXJxY2hpcF91bmJhbmtlZCA9ICppcnFfZ2V0X2NoaXAoaXJxKTsKKwkJZ3Bpb19pcnFjaGlwX3VuYmFua2VkLm5hbWUgPSAiR1BJTy1BSU5UQyI7CisJCWdwaW9faXJxY2hpcF91bmJhbmtlZC5pcnFfc2V0X3R5cGUgPSBncGlvX2lycV90eXBlX3VuYmFua2VkOworCisJCS8qIGRlZmF1bHQgdHJpZ2dlcjogYm90aCBlZGdlcyAqLworCQlnID0gZ3BpbzJyZWdzKDApOworCQlfX3Jhd193cml0ZWwofjAsICZnLT5zZXRfZmFsbGluZyk7CisJCV9fcmF3X3dyaXRlbCh+MCwgJmctPnNldF9yaXNpbmcpOworCisJCS8qIHNldCB0aGUgZGlyZWN0IElSUXMgdXAgdG8gdXNlIHRoYXQgaXJxY2hpcCAqLworCQlmb3IgKGdwaW8gPSAwOyBncGlvIDwgc29jX2luZm8tPmdwaW9fdW5iYW5rZWQ7IGdwaW8rKywgaXJxKyspIHsKKwkJCWlycV9zZXRfY2hpcChpcnEsICZncGlvX2lycWNoaXBfdW5iYW5rZWQpOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCAodm9pZCAqKV9fZ3Bpb19tYXNrKGdwaW8pKTsKKwkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgKF9fZm9yY2Ugdm9pZCAqKWcpOworCQkJaXJxX3NldF9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfVFlQRV9FREdFX0JPVEgpOworCQl9CisKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogT3IsIEFJTlRDIGNhbiBoYW5kbGUgSVJRcyBmb3IgYmFua3Mgb2YgMTYgR1BJTyBJUlFzLCB3aGljaCB3ZQorCSAqIHRoZW4gY2hhaW4gdGhyb3VnaCBvdXIgb3duIGhhbmRsZXIuCisJICovCisJZm9yIChncGlvID0gMCwgaXJxID0gZ3Bpb190b19pcnEoMCksIGJhbmsgPSAwOworCQkJZ3BpbyA8IG5ncGlvOworCQkJYmFuaysrLCBiYW5rX2lycSsrKSB7CisJCXVuc2lnbmVkCQlpOworCisJCS8qIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGVuYWJsZWQgb25seSBhcyBuZWVkZWQgKi8KKwkJZyA9IGdwaW8ycmVncyhncGlvKTsKKwkJX19yYXdfd3JpdGVsKH4wLCAmZy0+Y2xyX2ZhbGxpbmcpOworCQlfX3Jhd193cml0ZWwofjAsICZnLT5jbHJfcmlzaW5nKTsKKworCQkvKiBzZXQgdXAgYWxsIGlycXMgaW4gdGhpcyBiYW5rICovCisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGJhbmtfaXJxLCBncGlvX2lycV9oYW5kbGVyKTsKKworCQkvKgorCQkgKiBFYWNoIGNoaXAgaGFuZGxlcyAzMiBncGlvcywgYW5kIGVhY2ggaXJxIGJhbmsgY29uc2lzdHMgb2YgMTYKKwkJICogZ3BpbyBpcnFzLiBQYXNzIHRoZSBpcnEgYmFuaydzIGNvcnJlc3BvbmRpbmcgY29udHJvbGxlciB0bworCQkgKiB0aGUgY2hhaW5lZCBpcnEgaGFuZGxlci4KKwkJICovCisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGJhbmtfaXJxLCAmY2hpcHNbZ3BpbyAvIDMyXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGdwaW8gPCBuZ3BpbzsgaSsrLCBpcnErKywgZ3BpbysrKSB7CisJCQlpcnFfc2V0X2NoaXAoaXJxLCAmZ3Bpb19pcnFjaGlwKTsKKwkJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgKF9fZm9yY2Ugdm9pZCAqKWcpOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCAodm9pZCAqKV9fZ3Bpb19tYXNrKGdwaW8pKTsKKwkJCWlycV9zZXRfaGFuZGxlcihpcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKKwkJfQorCisJCWJpbnRlbiB8PSBCSVQoYmFuayk7CisJfQorCitkb25lOgorCS8qIEJJTlRFTiAtLSBwZXItYmFuayBpbnRlcnJ1cHQgZW5hYmxlLiBnZW5pcnEgd291bGQgYWxzbyBsZXQgdGhlc2UKKwkgKiBiaXRzIGJlIHNldC9jbGVhcmVkIGR5bmFtaWNhbGx5LgorCSAqLworCV9fcmF3X3dyaXRlbChiaW50ZW4sIGdwaW9fYmFzZSArIDB4MDgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRGFWaW5jaTogJWQgZ3BpbyBpcnFzXG4iLCBpcnEgLSBncGlvX3RvX2lycSgwKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWVwOTN4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZXA5M3h4LmMKaW5kZXggNzJmYjljNi4uMWMwZmMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZXA5M3h4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZXA5M3h4LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KQEAgLTIzLDYgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9iYXNpY19tbWlvX2dwaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tZXA5M3h4Lmg+CisKKyNkZWZpbmUgaXJxX3RvX2dwaW8oaXJxKQkoKGlycSkgLSBncGlvX3RvX2lycSgwKSkKIAogc3RydWN0IGVwOTN4eF9ncGlvIHsKIAl2b2lkIF9faW9tZW0JCSptbWlvX2Jhc2U7CkBAIC0zMDcsNiArMzExLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBNYXAgR1BJTyBBMC4uQTcgICgwLi43KSAgdG8gaXJxIDY0Li43MSwKKyAqICAgICAgICAgIEIwLi5CNyAgKDcuLjE1KSB0byBpcnEgNzIuLjc5LCBhbmQKKyAqICAgICAgICAgIEYwLi5GNyAoMTYuLjI0KSB0byBpcnEgODAuLjg3LgorICovCitzdGF0aWMgaW50IGVwOTN4eF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaW50IGdwaW8gPSBjaGlwLT5iYXNlICsgb2Zmc2V0OworCisJaWYgKGdwaW8gPiBFUDkzWFhfR1BJT19MSU5FX01BWF9JUlEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDY0ICsgZ3BpbzsKK30KKwogc3RhdGljIGludCBlcDkzeHhfZ3Bpb19hZGRfYmFuayhzdHJ1Y3QgYmdwaW9fY2hpcCAqYmdjLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UsIHN0cnVjdCBlcDkzeHhfZ3Bpb19iYW5rICpiYW5rKQogewpAQCAtMzIxLDggKzM0MCwxMCBAQAogCWJnYy0+Z2MubGFiZWwgPSBiYW5rLT5sYWJlbDsKIAliZ2MtPmdjLmJhc2UgPSBiYW5rLT5iYXNlOwogCi0JaWYgKGJhbmstPmhhc19kZWJvdW5jZSkKKwlpZiAoYmFuay0+aGFzX2RlYm91bmNlKSB7CiAJCWJnYy0+Z2Muc2V0X2RlYm91bmNlID0gZXA5M3h4X2dwaW9fc2V0X2RlYm91bmNlOworCQliZ2MtPmdjLnRvX2lycSA9IGVwOTN4eF9ncGlvX3RvX2lycTsKKwl9CiAKIAlyZXR1cm4gZ3Bpb2NoaXBfYWRkKCZiZ2MtPmdjKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWV4eW5vczQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0YjMzNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1leHlub3M0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIEVYWU5PUzQgLSBHUElPbGliIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jb3JlLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgotI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmctaGVscGVycy5oPgotCi1pbnQgczNjX2dwaW9fc2V0cHVsbF9leHlub3M0KHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCXVuc2lnbmVkIGludCBvZmYsIHMzY19ncGlvX3B1bGxfdCBwdWxsKQotewotCWlmIChwdWxsID09IFMzQ19HUElPX1BVTExfVVApCi0JCXB1bGwgPSAzOwotCi0JcmV0dXJuIHMzY19ncGlvX3NldHB1bGxfdXBkb3duKGNoaXAsIG9mZiwgcHVsbCk7Ci19Ci0KLXMzY19ncGlvX3B1bGxfdCBzM2NfZ3Bpb19nZXRwdWxsX2V4eW5vczQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCQl1bnNpZ25lZCBpbnQgb2ZmKQotewotCXMzY19ncGlvX3B1bGxfdCBwdWxsOwotCi0JcHVsbCA9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duKGNoaXAsIG9mZik7Ci0JaWYgKHB1bGwgPT0gMykKLQkJcHVsbCA9IFMzQ19HUElPX1BVTExfVVA7Ci0KLQlyZXR1cm4gcHVsbDsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmcgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfZXh5bm9zNCwKLQkuZ2V0X3B1bGwJPSBzM2NfZ3Bpb19nZXRwdWxsX2V4eW5vczQsCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NmZyBncGlvX2NmZ19ub2ludCA9IHsKLQkuc2V0X2NvbmZpZwk9IHMzY19ncGlvX3NldGNmZ19zM2M2NHh4XzRiaXQsCi0JLnNldF9wdWxsCT0gczNjX2dwaW9fc2V0cHVsbF9leHlub3M0LAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfZXh5bm9zNCwKLX07Ci0KLS8qCi0gKiBGb2xsb3dpbmcgYXJlIHRoZSBncGlvIGJhbmtzIGluIHYzMTAuCi0gKgotICogVGhlICdjb25maWcnIG1lbWJlciB3aGVuIGxlZnQgdG8gTlVMTCwgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQKLSAqIHN0cnVjdHVyZSBncGlvX2NmZyBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KLSAqCi0gKiBUaGUgJ2Jhc2UnIG1lbWJlciBpcyBhbHNvIGluaXRpYWxpemVkIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgotICogTm90ZTogVGhlIGluaXRpYWxpemF0aW9uIG9mICdiYXNlJyBtZW1iZXIgb2YgczNjX2dwaW9fY2hpcCBzdHJ1Y3R1cmUKLSAqIHVzZXMgdGhlIGFib3ZlIG1hY3JvIGFuZCBkZXBlbmRzIG9uIHRoZSBiYW5rcyBiZWluZyBsaXN0ZWQgaW4gb3JkZXIgaGVyZS4KLSAqLwotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIGV4eW5vczRfZ3Bpb19wYXJ0MV80Yml0W10gPSB7Ci0JewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEEwKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0EwX05SLAotCQkJLmxhYmVsCT0gIkdQQTAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BBMSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19BMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEExIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQQigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19CX05SLAotCQkJLmxhYmVsCT0gIkdQQiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEMwKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0MwX05SLAotCQkJLmxhYmVsCT0gIkdQQzAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BDMSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19DMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEMxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRDAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRDBfTlIsCi0JCQkubGFiZWwJPSAiR1BEMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEQxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0QxX05SLAotCQkJLmxhYmVsCT0gIkdQRDEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BFMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEUwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTFfTlIsCi0JCQkubGFiZWwJPSAiR1BFMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEUyKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UyX05SLAotCQkJLmxhYmVsCT0gIkdQRTIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BFMygwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FM19OUiwKLQkJCS5sYWJlbAk9ICJHUEUzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTQoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTRfTlIsCi0JCQkubGFiZWwJPSAiR1BFNCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEYwKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0YwX05SLAotCQkJLmxhYmVsCT0gIkdQRjAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BGMSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19GMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEYxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjIoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjJfTlIsCi0JCQkubGFiZWwJPSAiR1BGMiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEYzKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0YzX05SLAotCQkJLmxhYmVsCT0gIkdQRjMiLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgZXh5bm9zNF9ncGlvX3BhcnQyXzRiaXRbXSA9IHsKLQl7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQSjAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSjBfTlIsCi0JCQkubGFiZWwJPSAiR1BKMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEoxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0oxX05SLAotCQkJLmxhYmVsCT0gIkdQSjEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BLMCgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEswIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQSzEoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSzFfTlIsCi0JCQkubGFiZWwJPSAiR1BLMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEsyKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0syX05SLAotCQkJLmxhYmVsCT0gIkdQSzIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BLMygwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LM19OUiwKLQkJCS5sYWJlbAk9ICJHUEszIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQTDAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fTDBfTlIsCi0JCQkubGFiZWwJPSAiR1BMMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUEwxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0wxX05SLAotCQkJLmxhYmVsCT0gIkdQTDEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BMMigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19MMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEwyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTAoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTBfTlIsCi0JCQkubGFiZWwJPSAiR1BZMCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFkxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1kxX05SLAotCQkJLmxhYmVsCT0gIkdQWTEiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BZMigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZMl9OUiwKLQkJCS5sYWJlbAk9ICJHUFkyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTMoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTNfTlIsCi0JCQkubGFiZWwJPSAiR1BZMyIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFk0KDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1k0X05SLAotCQkJLmxhYmVsCT0gIkdQWTQiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BZNSgwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZNV9OUiwKLQkJCS5sYWJlbAk9ICJHUFk1IiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTYoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTZfTlIsCi0JCQkubGFiZWwJPSAiR1BZNiIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEMwMCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDApLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFgwKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gwX05SLAotCQkJLmxhYmVsCT0gIkdQWDAiLAotCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEMyMCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDgpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFgxKDApLAotCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gxX05SLAotCQkJLmxhYmVsCT0gIkdQWDEiLAotCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTzIgKyAweEM0MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDE2KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IEVYWU5PUzRfR1BYMigwKSwKLQkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19YMl9OUiwKLQkJCS5sYWJlbAk9ICJHUFgyIiwKLQkJCS50b19pcnEJPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8yICsgMHhDNjApLAotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgyNCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBFWFlOT1M0X0dQWDMoMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWDNfTlIsCi0JCQkubGFiZWwJPSAiR1BYMyIsCi0JCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIGV4eW5vczRfZ3Bpb19wYXJ0M180Yml0W10gPSB7Ci0JewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gRVhZTk9TNF9HUFooMCksCi0JCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWl9OUiwKLQkJCS5sYWJlbAk9ICJHUFoiLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgX19pbml0IGludCBleHlub3M0X2dwaW9saWJfaW5pdCh2b2lkKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwOwotCWludCBpOwotCWludCBncm91cCA9IDA7Ci0JaW50IG5yX2NoaXBzOwotCi0JLyogR1BJTyBwYXJ0IDEgKi8KLQotCWNoaXAgPSBleHlub3M0X2dwaW9fcGFydDFfNGJpdDsKLQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoZXh5bm9zNF9ncGlvX3BhcnQxXzRiaXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgewotCQlpZiAoY2hpcC0+Y29uZmlnID09IE5VTEwpIHsKLQkJCWNoaXAtPmNvbmZpZyA9ICZncGlvX2NmZzsKLQkJCS8qIEFzc2lnbiB0aGUgR1BJTyBpbnRlcnJ1cHQgZ3JvdXAgKi8KLQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKLQkJfQotCQlpZiAoY2hpcC0+YmFzZSA9PSBOVUxMKQotCQkJY2hpcC0+YmFzZSA9IFM1UF9WQV9HUElPMSArIChpKSAqIDB4MjA7Ci0JfQotCi0Jc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKGV4eW5vczRfZ3Bpb19wYXJ0MV80Yml0LCBucl9jaGlwcyk7Ci0KLQkvKiBHUElPIHBhcnQgMiAqLwotCi0JY2hpcCA9IGV4eW5vczRfZ3Bpb19wYXJ0Ml80Yml0OwotCW5yX2NoaXBzID0gQVJSQVlfU0laRShleHlub3M0X2dwaW9fcGFydDJfNGJpdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7Ci0JCWlmIChjaGlwLT5jb25maWcgPT0gTlVMTCkgewotCQkJY2hpcC0+Y29uZmlnID0gJmdwaW9fY2ZnOwotCQkJLyogQXNzaWduIHRoZSBHUElPIGludGVycnVwdCBncm91cCAqLwotCQkJY2hpcC0+Z3JvdXAgPSBncm91cCsrOwotCQl9Ci0JCWlmIChjaGlwLT5iYXNlID09IE5VTEwpCi0JCQljaGlwLT5iYXNlID0gUzVQX1ZBX0dQSU8yICsgKGkpICogMHgyMDsKLQl9Ci0KLQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoZXh5bm9zNF9ncGlvX3BhcnQyXzRiaXQsIG5yX2NoaXBzKTsKLQotCS8qIEdQSU8gcGFydCAzICovCi0KLQljaGlwID0gZXh5bm9zNF9ncGlvX3BhcnQzXzRiaXQ7Ci0JbnJfY2hpcHMgPSBBUlJBWV9TSVpFKGV4eW5vczRfZ3Bpb19wYXJ0M180Yml0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKLQkJaWYgKGNoaXAtPmNvbmZpZyA9PSBOVUxMKSB7Ci0JCQljaGlwLT5jb25maWcgPSAmZ3Bpb19jZmc7Ci0JCQkvKiBBc3NpZ24gdGhlIEdQSU8gaW50ZXJydXB0IGdyb3VwICovCi0JCQljaGlwLT5ncm91cCA9IGdyb3VwKys7Ci0JCX0KLQkJaWYgKGNoaXAtPmJhc2UgPT0gTlVMTCkKLQkJCWNoaXAtPmJhc2UgPSBTNVBfVkFfR1BJTzMgKyAoaSkgKiAweDIwOwotCX0KLQotCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhleHlub3M0X2dwaW9fcGFydDNfNGJpdCwgbnJfY2hpcHMpOwotCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9fWEEsIDAsIElSUV9HUElPMV9OUl9HUk9VUFMpOwotCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9fWEIsIElSUV9HUElPMV9OUl9HUk9VUFMsIElSUV9HUElPMl9OUl9HUk9VUFMpOwotCi0JcmV0dXJuIDA7Ci19Ci1jb3JlX2luaXRjYWxsKGV4eW5vczRfZ3Bpb2xpYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWtzODY5NS5jIGIvZHJpdmVycy9ncGlvL2dwaW8ta3M4Njk1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhYzY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWtzODY5NS5jCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1rczg2OTUvZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJldyBWaWN0b3IKKyAqIFVwZGF0ZWQgdG8gR1BJT0xJQiwgQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgICAgICAgICAgICAgICAgIERhbmllbCBTaWx2ZXJzdG9uZSA8ZHNpbHZlcnNAc2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8ta3M4Njk1Lmg+CisKKy8qCisgKiBDb25maWd1cmUgYSBHUElPIGxpbmUgZm9yIGVpdGhlciBHUElPIGZ1bmN0aW9uLCBvciBpdHMgaW50ZXJuYWwKKyAqIGZ1bmN0aW9uIChJbnRlcnJ1cHQsIFRpbWVyLCBldGMpLgorICovCitzdGF0aWMgdm9pZCBrczg2OTVfZ3Bpb19tb2RlKHVuc2lnbmVkIGludCBwaW4sIHNob3J0IGdwaW8pCit7CisJdW5zaWduZWQgaW50IGVuYWJsZVtdID0geyBJT1BDX0lPRUlOVDBFTiwgSU9QQ19JT0VJTlQxRU4sIElPUENfSU9FSU5UMkVOLCBJT1BDX0lPRUlOVDNFTiwgSU9QQ19JT1RJTTBFTiwgSU9QQ19JT1RJTTFFTiB9OworCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7CisKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fNSkJLyogb25seSBHUElPIDAuLjUgaGF2ZSBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEMpOworCWlmIChncGlvKQkJCS8qIEdQSU86IHNldCBiaXQgdG8gMCAqLworCQl4ICY9IH5lbmFibGVbcGluXTsKKwllbHNlCQkJCS8qIEludGVybmFsIGZ1bmN0aW9uOiBzZXQgYml0IHRvIDEgKi8KKwkJeCB8PSBlbmFibGVbcGluXTsKKwlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QQyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9faXJxW10gPSB7IEtTODY5NV9JUlFfRVhURVJOMCwgS1M4Njk1X0lSUV9FWFRFUk4xLCBLUzg2OTVfSVJRX0VYVEVSTjIsIEtTODY5NV9JUlFfRVhURVJOMyB9OworCisvKgorICogQ29uZmlndXJlIEdQSU8gcGluIGFzIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2UuCisgKi8KK2ludCBrczg2OTVfZ3Bpb19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyB4LCBmbGFnczsKKworCWlmIChwaW4gPiBLUzg2OTVfR1BJT18zKQkvKiBvbmx5IEdQSU8gMC4uMyBjYW4gZ2VuZXJhdGUgSVJRICovCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogc2V0IHBpbiBhcyBpbnB1dCAqLworCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKKwl4ICY9IH5JT1BNKHBpbik7CisJX19yYXdfd3JpdGVsKHgsIEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogU2V0IElSUSB0cmlnZ2VyaW5nIHR5cGUgKi8KKwlpcnFfc2V0X2lycV90eXBlKGdwaW9faXJxW3Bpbl0sIHR5cGUpOworCisJLyogZW5hYmxlIGludGVycnVwdCBtb2RlICovCisJa3M4Njk1X2dwaW9fbW9kZShwaW4sIDApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGtzODY5NV9ncGlvX2ludGVycnVwdCk7CisKKworCisvKiAuLi4uIEdlbmVyaWMgR1BJTyBpbnRlcmZhY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCisvKgorICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gaW5wdXQuCisgKi8KK3N0YXRpYyBpbnQga3M4Njk1X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgcGluKQoreworCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7CisKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc2V0IHBpbiB0byBHUElPIG1vZGUgKi8KKwlrczg2OTVfZ3Bpb19tb2RlKHBpbiwgMSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgcGluIGFzIGlucHV0ICovCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCXggJj0gfklPUE0ocGluKTsKKwlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QTSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ29uZmlndXJlIHRoZSBHUElPIGxpbmUgYXMgYW4gb3V0cHV0LCB3aXRoIGRlZmF1bHQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQga3M4Njk1X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkJdW5zaWduZWQgaW50IHBpbiwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgeCwgZmxhZ3M7CisKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc2V0IHBpbiB0byBHUElPIG1vZGUgKi8KKwlrczg2OTVfZ3Bpb19tb2RlKHBpbiwgMSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgbGluZSBzdGF0ZSAqLworCXggPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKKwlpZiAoc3RhdGUpCisJCXggfD0gSU9QRChwaW4pOworCWVsc2UKKwkJeCAmPSB+SU9QRChwaW4pOworCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BEKTsKKworCS8qIHNldCBwaW4gYXMgb3V0cHV0ICovCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUE0pOworCXggfD0gSU9QTShwaW4pOworCV9fcmF3X3dyaXRlbCh4LCBLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTZXQgdGhlIHN0YXRlIG9mIGFuIG91dHB1dCBHUElPIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGtzODY5NV9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkgIHVuc2lnbmVkIGludCBwaW4sIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHgsIGZsYWdzOworCisJaWYgKHBpbiA+IEtTODY5NV9HUElPXzE1KQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBzZXQgb3V0cHV0IGxpbmUgc3RhdGUgKi8KKwl4ID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7CisJaWYgKHN0YXRlKQorCQl4IHw9IElPUEQocGluKTsKKwllbHNlCisJCXggJj0gfklPUEQocGluKTsKKwlfX3Jhd193cml0ZWwoeCwgS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QRCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIHN0YXRlIG9mIGEgR1BJTyBsaW5lLgorICovCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fMTUpCisJCXJldHVybiAtRUlOVkFMOworCisJeCA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOworCXJldHVybiAoeCAmIElPUEQocGluKSkgIT0gMDsKK30KKworCisvKgorICogTWFwIEdQSU8gbGluZSB0byBJUlEgbnVtYmVyLgorICovCitzdGF0aWMgaW50IGtzODY5NV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IHBpbikKK3sKKwlpZiAocGluID4gS1M4Njk1X0dQSU9fMykJLyogb25seSBHUElPIDAuLjMgY2FuIGdlbmVyYXRlIElSUSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBncGlvX2lycVtwaW5dOworfQorCisvKgorICogTWFwIElSUSBudW1iZXIgdG8gR1BJTyBsaW5lLgorICovCitpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoKGlycSA8IEtTODY5NV9JUlFfRVhURVJOMCkgfHwgKGlycSA+IEtTODY5NV9JUlFfRVhURVJOMykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIChpcnEgLSBLUzg2OTVfSVJRX0VYVEVSTjApOworfQorRVhQT1JUX1NZTUJPTChpcnFfdG9fZ3Bpbyk7CisKKy8qIEdQSU9MSUIgaW50ZXJmYWNlICovCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGtzODY5NV9ncGlvX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAiS1M4Njk1IiwKKwkuZGlyZWN0aW9uX2lucHV0CT0ga3M4Njk1X2dwaW9fZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0ga3M4Njk1X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZ2V0CQkJPSBrczg2OTVfZ3Bpb19nZXRfdmFsdWUsCisJLnNldAkJCT0ga3M4Njk1X2dwaW9fc2V0X3ZhbHVlLAorCS50b19pcnEJCQk9IGtzODY5NV9ncGlvX3RvX2lycSwKKwkuYmFzZQkJCT0gMCwKKwkubmdwaW8JCQk9IDE2LAorCS5jYW5fc2xlZXAJCT0gMCwKK307CisKKy8qIFJlZ2lzdGVyIHRoZSBHUElPcyAqLwordm9pZCBrczg2OTVfcmVnaXN0ZXJfZ3Bpb3Modm9pZCkKK3sKKwlpZiAoZ3Bpb2NoaXBfYWRkKCZrczg2OTVfZ3Bpb19jaGlwKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY29yZSBHUElPc1xuIik7Cit9CisKKy8qIC4uLi4gRGVidWcgaW50ZXJmYWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworc3RhdGljIGludCBrczg2OTVfZ3Bpb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQoreworCXVuc2lnbmVkIGludCBlbmFibGVbXSA9IHsgSU9QQ19JT0VJTlQwRU4sIElPUENfSU9FSU5UMUVOLCBJT1BDX0lPRUlOVDJFTiwgSU9QQ19JT0VJTlQzRU4sIElPUENfSU9USU0wRU4sIElPUENfSU9USU0xRU4gfTsKKwl1bnNpZ25lZCBpbnQgaW50bWFza1tdID0geyBJT1BDX0lPRUlOVDBUTSwgSU9QQ19JT0VJTlQxVE0sIElPUENfSU9FSU5UMlRNLCBJT1BDX0lPRUlOVDNUTSB9OworCXVuc2lnbmVkIGxvbmcgbW9kZSwgY3RybCwgZGF0YTsKKwlpbnQgaTsKKworCW1vZGUgPSBfX3Jhd19yZWFkbChLUzg2OTVfR1BJT19WQSArIEtTODY5NV9JT1BNKTsKKwljdHJsID0gX19yYXdfcmVhZGwoS1M4Njk1X0dQSU9fVkEgKyBLUzg2OTVfSU9QQyk7CisJZGF0YSA9IF9fcmF3X3JlYWRsKEtTODY5NV9HUElPX1ZBICsgS1M4Njk1X0lPUEQpOworCisJc2VxX3ByaW50ZihzLCAiUGluXHRJL09cdEZ1bmN0aW9uXHRTdGF0ZVxuXG4iKTsKKworCWZvciAoaSA9IEtTODY5NV9HUElPXzA7IGkgPD0gS1M4Njk1X0dQSU9fMTUgOyBpKyspIHsKKwkJc2VxX3ByaW50ZihzLCAiJWk6XHQiLCBpKTsKKworCQlzZXFfcHJpbnRmKHMsICIlc1x0IiwgKG1vZGUgJiBJT1BNKGkpKSA/ICJPdXRwdXQiIDogIklucHV0Iik7CisKKwkJaWYgKGkgPD0gS1M4Njk1X0dQSU9fMykgeworCQkJaWYgKGN0cmwgJiBlbmFibGVbaV0pIHsKKwkJCQlzZXFfcHJpbnRmKHMsICJFWFQlaSAiLCBpKTsKKworCQkJCXN3aXRjaCAoKGN0cmwgJiBpbnRtYXNrW2ldKSA+PiAoNCAqIGkpKSB7CisJCQkJCWNhc2UgSU9QQ19UTV9MT1c6CisJCQkJCQlzZXFfcHJpbnRmKHMsICIoTG93KSIpOwkJYnJlYWs7CisJCQkJCWNhc2UgSU9QQ19UTV9ISUdIOgorCQkJCQkJc2VxX3ByaW50ZihzLCAiKEhpZ2gpIik7CWJyZWFrOworCQkJCQljYXNlIElPUENfVE1fUklTSU5HOgorCQkJCQkJc2VxX3ByaW50ZihzLCAiKFJpc2luZykiKTsJYnJlYWs7CisJCQkJCWNhc2UgSU9QQ19UTV9GQUxMSU5HOgorCQkJCQkJc2VxX3ByaW50ZihzLCAiKEZhbGxpbmcpIik7CWJyZWFrOworCQkJCQljYXNlIElPUENfVE1fRURHRToKKwkJCQkJCXNlcV9wcmludGYocywgIihFZGdlcykiKTsJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCXNlcV9wcmludGYocywgIkdQSU9cdCIpOworCQl9CisJCWVsc2UgaWYgKGkgPD0gS1M4Njk1X0dQSU9fNSkgeworCQkJaWYgKGN0cmwgJiBlbmFibGVbaV0pCisJCQkJc2VxX3ByaW50ZihzLCAiVE9VVCVpXHQiLCBpIC0gS1M4Njk1X0dQSU9fNCk7CisJCQllbHNlCisJCQkJc2VxX3ByaW50ZihzLCAiR1BJT1x0Iik7CisJCX0KKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzLCAiR1BJT1x0Iik7CisKKwkJc2VxX3ByaW50ZihzLCAiXHQiKTsKKworCQlzZXFfcHJpbnRmKHMsICIlaVxuIiwgKGRhdGEgJiBJT1BEKGkpKSA/IDEgOiAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3M4Njk1X2dwaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwga3M4Njk1X2dwaW9fc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtzODY5NV9ncGlvX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0ga3M4Njk1X2dwaW9fb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQga3M4Njk1X2dwaW9fZGVidWdmc19pbml0KHZvaWQpCit7CisJLyogL3N5cy9rZXJuZWwvZGVidWcva3M4Njk1X2dwaW8gKi8KKwkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgia3M4Njk1X2dwaW8iLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgTlVMTCwgJmtzODY5NV9ncGlvX29wZXJhdGlvbnMpOworCXJldHVybiAwOworfQorcG9zdGNvcmVfaW5pdGNhbGwoa3M4Njk1X2dwaW9fZGVidWdmc19pbml0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1sYW5nd2VsbC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbGFuZ3dlbGwuYwppbmRleCBkMmViNTdjLi4wMDY5MmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1sYW5nd2VsbC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxhbmd3ZWxsLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAlHUkVSLAkJLyogcmlzaW5nIGVkZ2UgZGV0ZWN0ICovCiAJR0ZFUiwJCS8qIGZhbGxpbmcgZWRnZSBkZXRlY3QgKi8KIAlHRURSLAkJLyogZWRnZSBkZXRlY3QgcmVzdWx0ICovCisJR0FGUiwJCS8qIGFsdCBmdW5jdGlvbiAqLwogfTsKIAogc3RydWN0IGxud19ncGlvIHsKQEAgLTgxLDYgKzgyLDMxIEBACiAJcmV0dXJuIHB0cjsKIH0KIAorc3RhdGljIHZvaWQgX19pb21lbSAqZ3Bpb19yZWdfMmJpdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJICAgZW51bSBHUElPX1JFRyByZWdfdHlwZSkKK3sKKwlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbG53X2dwaW8sIGNoaXApOworCXVuc2lnbmVkIG5yZWcgPSBjaGlwLT5uZ3BpbyAvIDMyOworCXU4IHJlZyA9IG9mZnNldCAvIDE2OworCXZvaWQgX19pb21lbSAqcHRyOworCisJcHRyID0gKHZvaWQgX19pb21lbSAqKShsbnctPnJlZ19iYXNlICsgcmVnX3R5cGUgKiBucmVnICogNCArIHJlZyAqIDQpOworCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyBpbnQgbG53X2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICpnYWZyID0gZ3Bpb19yZWdfMmJpdChjaGlwLCBvZmZzZXQsIEdBRlIpOworCXUzMiB2YWx1ZSA9IHJlYWRsKGdhZnIpOworCWludCBzaGlmdCA9IChvZmZzZXQgJSAxNikgPDwgMSwgYWYgPSAodmFsdWUgPj4gc2hpZnQpICYgMzsKKworCWlmIChhZikgeworCQl2YWx1ZSAmPSB+KDMgPDwgc2hpZnQpOworCQl3cml0ZWwodmFsdWUsIGdhZnIpOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBsbndfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewogCXZvaWQgX19pb21lbSAqZ3BsciA9IGdwaW9fcmVnKGNoaXAsIG9mZnNldCwgR1BMUik7CkBAIC0zMjEsNiArMzQ3LDcgQEAKIAlsbnctPnJlZ19iYXNlID0gYmFzZTsKIAlsbnctPmlycV9iYXNlID0gaXJxX2Jhc2U7CiAJbG53LT5jaGlwLmxhYmVsID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJbG53LT5jaGlwLnJlcXVlc3QgPSBsbndfZ3Bpb19yZXF1ZXN0OwogCWxudy0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CiAJbG53LT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBsbndfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwogCWxudy0+Y2hpcC5nZXQgPSBsbndfZ3Bpb19nZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1scGMzMnh4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1scGMzMnh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2OTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtbHBjMzJ4eC9ncGlvbGliLmMKKyAqCisgKiBBdXRob3I6IEtldmluIFdlbGxzIDxrZXZpbi53ZWxsc0BueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8tbHBjMzJ4eC5oPgorCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19JTlBfU1RBVEUJCV9HUFJFRygweDAwMCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX09VVFBfU0VUCQlfR1BSRUcoMHgwMDQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19PVVRQX0NMUgkJX0dQUkVHKDB4MDA4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9TVEFURQkJX0dQUkVHKDB4MDBDKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfRElSX1NFVAkJCV9HUFJFRygweDAxMCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0RJUl9DTFIJCQlfR1BSRUcoMHgwMTQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9ESVJfU1RBVEUJCV9HUFJFRygweDAxOCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0lOUF9TVEFURQkJX0dQUkVHKDB4MDFDKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfT1VUUF9TRVQJCV9HUFJFRygweDAyMCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX09VVFBfQ0xSCQlfR1BSRUcoMHgwMjQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NVVhfU0VUCQkJX0dQUkVHKDB4MDI4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTVVYX0NMUgkJCV9HUFJFRygweDAyQykKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01VWF9TVEFURQkJX0dQUkVHKDB4MDMwKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfSU5QX1NUQVRFCQlfR1BSRUcoMHgwNDApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9PVVRQX1NFVAkJX0dQUkVHKDB4MDQ0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9DTFIJCV9HUFJFRygweDA0OCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX09VVFBfU1RBVEUJCV9HUFJFRygweDA0QykKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0RJUl9TRVQJCQlfR1BSRUcoMHgwNTApCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9ESVJfQ0xSCQkJX0dQUkVHKDB4MDU0KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfRElSX1NUQVRFCQlfR1BSRUcoMHgwNTgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9JTlBfU1RBVEUJCV9HUFJFRygweDA2MCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX09VVFBfU0VUCQlfR1BSRUcoMHgwNjQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9PVVRQX0NMUgkJX0dQUkVHKDB4MDY4KQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9TVEFURQkJX0dQUkVHKDB4MDZDKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfRElSX1NFVAkJCV9HUFJFRygweDA3MCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0RJUl9DTFIJCQlfR1BSRUcoMHgwNzQpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9ESVJfU1RBVEUJCV9HUFJFRygweDA3OCkKKworI2RlZmluZSBHUElPMDEyX1BJTl9UT19CSVQoeCkJCQkoMSA8PCAoeCkpCisjZGVmaW5lIEdQSU8zX1BJTl9UT19CSVQoeCkJCQkoMSA8PCAoKHgpICsgMjUpKQorI2RlZmluZSBHUE8zX1BJTl9UT19CSVQoeCkJCQkoMSA8PCAoeCkpCisjZGVmaW5lIEdQSU8wMTJfUElOX0lOX1NFTCh4LCB5KQkJKCgoeCkgPj4gKHkpKSAmIDEpCisjZGVmaW5lIEdQSU8zX1BJTl9JTl9TSElGVCh4KQkJCSgoeCkgPT0gNSA/IDI0IDogMTAgKyAoeCkpCisjZGVmaW5lIEdQSU8zX1BJTl9JTl9TRUwoeCwgeSkJCQkoKHgpID4+IEdQSU8zX1BJTl9JTl9TSElGVCh5KSkKKyNkZWZpbmUgR1BJTzNfUElONV9JTl9TRUwoeCkJCQkoKCh4KSA+PiAyNCkgJiAxKQorI2RlZmluZSBHUEkzX1BJTl9JTl9TRUwoeCwgeSkJCQkoKCh4KSA+PiAoeSkpICYgMSkKKworc3RydWN0IGdwaW9fcmVncyB7CisJdm9pZCBfX2lvbWVtICppbnBfc3RhdGU7CisJdm9pZCBfX2lvbWVtICpvdXRwX3NldDsKKwl2b2lkIF9faW9tZW0gKm91dHBfY2xyOworCXZvaWQgX19pb21lbSAqZGlyX3NldDsKKwl2b2lkIF9faW9tZW0gKmRpcl9jbHI7Cit9OworCisvKgorICogR1BJTyBuYW1lcworICovCitzdGF0aWMgY29uc3QgY2hhciAqZ3Bpb19wMF9uYW1lc1tMUEMzMlhYX0dQSU9fUDBfTUFYXSA9IHsKKwkicDAuMCIsICJwMC4xIiwgInAwLjIiLCAicDAuMyIsCisJInAwLjQiLCAicDAuNSIsICJwMC42IiwgInAwLjciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ3Bpb19wMV9uYW1lc1tMUEMzMlhYX0dQSU9fUDFfTUFYXSA9IHsKKwkicDEuMCIsICJwMS4xIiwgInAxLjIiLCAicDEuMyIsCisJInAxLjQiLCAicDEuNSIsICJwMS42IiwgInAxLjciLAorCSJwMS44IiwgInAxLjkiLCAicDEuMTAiLCAicDEuMTEiLAorCSJwMS4xMiIsICJwMS4xMyIsICJwMS4xNCIsICJwMS4xNSIsCisJInAxLjE2IiwgInAxLjE3IiwgInAxLjE4IiwgInAxLjE5IiwKKwkicDEuMjAiLCAicDEuMjEiLCAicDEuMjIiLCAicDEuMjMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdwaW9fcDJfbmFtZXNbTFBDMzJYWF9HUElPX1AyX01BWF0gPSB7CisJInAyLjAiLCAicDIuMSIsICJwMi4yIiwgInAyLjMiLAorCSJwMi40IiwgInAyLjUiLCAicDIuNiIsICJwMi43IiwKKwkicDIuOCIsICJwMi45IiwgInAyLjEwIiwgInAyLjExIiwKKwkicDIuMTIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ3Bpb19wM19uYW1lc1tMUEMzMlhYX0dQSU9fUDNfTUFYXSA9IHsKKwkiZ3BpMDAwIiwgImdwaW8wMSIsICJncGlvMDIiLCAiZ3BpbzAzIiwKKwkiZ3BpbzA0IiwgImdwaW8wNSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpncGlfcDNfbmFtZXNbTFBDMzJYWF9HUElfUDNfTUFYXSA9IHsKKwkiZ3BpMDAiLCAiZ3BpMDEiLCAiZ3BpMDIiLCAiZ3BpMDMiLAorCSJncGkwNCIsICJncGkwNSIsICJncGkwNiIsICJncGkwNyIsCisJImdwaTA4IiwgImdwaTA5IiwgIE5VTEwsICAgIE5VTEwsCisJIE5VTEwsICAgIE5VTEwsICAgIE5VTEwsICAgImdwaTE1IiwKKwkiZ3BpMTYiLCAiZ3BpMTciLCAiZ3BpMTgiLCAiZ3BpMTkiLAorCSJncGkyMCIsICJncGkyMSIsICJncGkyMiIsICJncGkyMyIsCisJImdwaTI0IiwgImdwaTI1IiwgImdwaTI2IiwgImdwaTI3IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdwb19wM19uYW1lc1tMUEMzMlhYX0dQT19QM19NQVhdID0geworCSJncG8wMCIsICJncG8wMSIsICJncG8wMiIsICJncG8wMyIsCisJImdwbzA0IiwgImdwbzA1IiwgImdwbzA2IiwgImdwbzA3IiwKKwkiZ3BvMDgiLCAiZ3BvMDkiLCAiZ3BvMTAiLCAiZ3BvMTEiLAorCSJncG8xMiIsICJncG8xMyIsICJncG8xNCIsICJncG8xNSIsCisJImdwbzE2IiwgImdwbzE3IiwgImdwbzE4IiwgImdwbzE5IiwKKwkiZ3BvMjAiLCAiZ3BvMjEiLCAiZ3BvMjIiLCAiZ3BvMjMiCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AwID0geworCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDBfSU5QX1NUQVRFLAorCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QMF9PVVRQX1NFVCwKKwkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDBfT1VUUF9DTFIsCisJLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDBfRElSX1NFVCwKKwkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMF9ESVJfQ0xSLAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX3JlZ3MgZ3Bpb19ncnBfcmVnc19wMSA9IHsKKwkuaW5wX3N0YXRlCT0gTFBDMzJYWF9HUElPX1AxX0lOUF9TVEFURSwKKwkub3V0cF9zZXQJPSBMUEMzMlhYX0dQSU9fUDFfT1VUUF9TRVQsCisJLm91dHBfY2xyCT0gTFBDMzJYWF9HUElPX1AxX09VVFBfQ0xSLAorCS5kaXJfc2V0CT0gTFBDMzJYWF9HUElPX1AxX0RJUl9TRVQsCisJLmRpcl9jbHIJPSBMUEMzMlhYX0dQSU9fUDFfRElSX0NMUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19yZWdzIGdwaW9fZ3JwX3JlZ3NfcDIgPSB7CisJLmlucF9zdGF0ZQk9IExQQzMyWFhfR1BJT19QMl9JTlBfU1RBVEUsCisJLm91dHBfc2V0CT0gTFBDMzJYWF9HUElPX1AyX09VVFBfU0VULAorCS5vdXRwX2Nscgk9IExQQzMyWFhfR1BJT19QMl9PVVRQX0NMUiwKKwkuZGlyX3NldAk9IExQQzMyWFhfR1BJT19QMl9ESVJfU0VULAorCS5kaXJfY2xyCT0gTFBDMzJYWF9HUElPX1AyX0RJUl9DTFIsCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fcmVncyBncGlvX2dycF9yZWdzX3AzID0geworCS5pbnBfc3RhdGUJPSBMUEMzMlhYX0dQSU9fUDNfSU5QX1NUQVRFLAorCS5vdXRwX3NldAk9IExQQzMyWFhfR1BJT19QM19PVVRQX1NFVCwKKwkub3V0cF9jbHIJPSBMUEMzMlhYX0dQSU9fUDNfT1VUUF9DTFIsCisJLmRpcl9zZXQJPSBMUEMzMlhYX0dQSU9fUDJfRElSX1NFVCwKKwkuZGlyX2Nscgk9IExQQzMyWFhfR1BJT19QMl9ESVJfQ0xSLAorfTsKKworc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7CisJc3RydWN0IGdwaW9fcmVncwkqZ3Bpb19ncnA7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqdG9fbHBjMzJ4eF9ncGlvKAorCXN0cnVjdCBncGlvX2NoaXAgKmdwYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGdwYywgc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwLCBjaGlwKTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfZ3Bpb19kaXJfcDAxMihzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbiwgaW50IGlucHV0KQoreworCWlmIChpbnB1dCkKKwkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAorCQkJZ3JvdXAtPmdwaW9fZ3JwLT5kaXJfY2xyKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKKwkJCWdyb3VwLT5ncGlvX2dycC0+ZGlyX3NldCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X2dwaW9fZGlyX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluLCBpbnQgaW5wdXQpCit7CisJdTMyIHUgPSBHUElPM19QSU5fVE9fQklUKHBpbik7CisKKwlpZiAoaW5wdXQpCisJCV9fcmF3X3dyaXRlbCh1LCBncm91cC0+Z3Bpb19ncnAtPmRpcl9jbHIpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKHUsIGdyb3VwLT5ncGlvX2dycC0+ZGlyX3NldCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X2dwaW9fbGV2ZWxfcDAxMihzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwLAorCXVuc2lnbmVkIHBpbiwgaW50IGhpZ2gpCit7CisJaWYgKGhpZ2gpCisJCV9fcmF3X3dyaXRlbChHUElPMDEyX1BJTl9UT19CSVQocGluKSwKKwkJCWdyb3VwLT5ncGlvX2dycC0+b3V0cF9zZXQpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKEdQSU8wMTJfUElOX1RPX0JJVChwaW4pLAorCQkJZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX2Nscik7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X2dwaW9fbGV2ZWxfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4sIGludCBoaWdoKQoreworCXUzMiB1ID0gR1BJTzNfUElOX1RPX0JJVChwaW4pOworCisJaWYgKGhpZ2gpCisJCV9fcmF3X3dyaXRlbCh1LCBncm91cC0+Z3Bpb19ncnAtPm91dHBfc2V0KTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbCh1LCBncm91cC0+Z3Bpb19ncnAtPm91dHBfY2xyKTsKK30KKworc3RhdGljIHZvaWQgX19zZXRfZ3BvX2xldmVsX3AzKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluLCBpbnQgaGlnaCkKK3sKKwlpZiAoaGlnaCkKKwkJX19yYXdfd3JpdGVsKEdQTzNfUElOX1RPX0JJVChwaW4pLCBncm91cC0+Z3Bpb19ncnAtPm91dHBfc2V0KTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChHUE8zX1BJTl9UT19CSVQocGluKSwgZ3JvdXAtPmdwaW9fZ3JwLT5vdXRwX2Nscik7Cit9CisKK3N0YXRpYyBpbnQgX19nZXRfZ3Bpb19zdGF0ZV9wMDEyKHN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAsCisJdW5zaWduZWQgcGluKQoreworCXJldHVybiBHUElPMDEyX1BJTl9JTl9TRUwoX19yYXdfcmVhZGwoZ3JvdXAtPmdwaW9fZ3JwLT5pbnBfc3RhdGUpLAorCQlwaW4pOworfQorCitzdGF0aWMgaW50IF9fZ2V0X2dwaW9fc3RhdGVfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4pCit7CisJaW50IHN0YXRlID0gX19yYXdfcmVhZGwoZ3JvdXAtPmdwaW9fZ3JwLT5pbnBfc3RhdGUpOworCisJLyoKKwkgKiBQMyBHUElPIHBpbiBpbnB1dCBtYXBwaW5nIGlzIG5vdCBjb250aWd1b3VzLCBHUElPUDMtMC4uNCBpcyBtYXBwZWQKKwkgKiB0byBiaXRzIDEwLi4xNCwgd2hpbGUgR1BJT1AzLTUgaXMgbWFwcGVkIHRvIGJpdCAyNC4KKwkgKi8KKwlyZXR1cm4gR1BJTzNfUElOX0lOX1NFTChzdGF0ZSwgcGluKTsKK30KKworc3RhdGljIGludCBfX2dldF9ncGlfc3RhdGVfcDMoc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCwKKwl1bnNpZ25lZCBwaW4pCit7CisJcmV0dXJuIEdQSTNfUElOX0lOX1NFTChfX3Jhd19yZWFkbChncm91cC0+Z3Bpb19ncnAtPmlucF9zdGF0ZSksIHBpbik7Cit9CisKKy8qCisgKiBHRU5FUklDX0dQSU8gcHJpbWl0aXZlcy4KKyAqLworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AwMTIoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fZGlyX3AwMTIoZ3JvdXAsIHBpbiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2Rpcl9wMyhncm91cCwgcGluLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19kaXJfaW5fYWx3YXlzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgcGluKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19nZXRfdmFsdWVfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCXJldHVybiBfX2dldF9ncGlvX3N0YXRlX3AwMTIoZ3JvdXAsIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCXJldHVybiBfX2dldF9ncGlvX3N0YXRlX3AzKGdyb3VwLCBwaW4pOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3BpX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCXJldHVybiBfX2dldF9ncGlfc3RhdGVfcDMoZ3JvdXAsIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDAxMihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncGlvX2Rpcl9wMDEyKGdyb3VwLCBwaW4sIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19kaXJfcDMoZ3JvdXAsIHBpbiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGMzMnh4X2dwaW9fZGlyX291dF9hbHdheXMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHBjMzJ4eF9ncGlvX3NldF92YWx1ZV9wMDEyKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbiwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwYzMyeHhfZ3Bpb19jaGlwICpncm91cCA9IHRvX2xwYzMyeHhfZ3BpbyhjaGlwKTsKKworCV9fc2V0X2dwaW9fbGV2ZWxfcDAxMihncm91cCwgcGluLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxwYzMyeHhfZ3Bpb19zZXRfdmFsdWVfcDMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgcGluLAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgKmdyb3VwID0gdG9fbHBjMzJ4eF9ncGlvKGNoaXApOworCisJX19zZXRfZ3Bpb19sZXZlbF9wMyhncm91cCwgcGluLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxwYzMyeHhfZ3BvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBwaW4sCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBscGMzMnh4X2dwaW9fY2hpcCAqZ3JvdXAgPSB0b19scGMzMnh4X2dwaW8oY2hpcCk7CisKKwlfX3NldF9ncG9fbGV2ZWxfcDMoZ3JvdXAsIHBpbiwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlpZiAocGluIDwgY2hpcC0+bmdwaW8pCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbHBjMzJ4eF9ncGlvX2NoaXAgbHBjMzJ4eF9ncGlvY2hpcFtdID0geworCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncGlvX3AwIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AwMTIsCisJCQkuZ2V0CQkJPSBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AwMTIsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AwMTIsCisJCQkuc2V0CQkJPSBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AwMTIsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSU9fUDBfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSU9fUDBfTUFYLAorCQkJLm5hbWVzCQkJPSBncGlvX3AwX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMCwKKwl9LAorCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncGlvX3AxIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AwMTIsCisJCQkuZ2V0CQkJPSBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AwMTIsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AwMTIsCisJCQkuc2V0CQkJPSBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AwMTIsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSU9fUDFfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSU9fUDFfTUFYLAorCQkJLm5hbWVzCQkJPSBncGlvX3AxX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMSwKKwl9LAorCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncGlvX3AyIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AwMTIsCisJCQkuZ2V0CQkJPSBscGMzMnh4X2dwaW9fZ2V0X3ZhbHVlX3AwMTIsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0cHV0X3AwMTIsCisJCQkuc2V0CQkJPSBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AwMTIsCisJCQkucmVxdWVzdAkJPSBscGMzMnh4X2dwaW9fcmVxdWVzdCwKKwkJCS5iYXNlCQkJPSBMUEMzMlhYX0dQSU9fUDJfR1JQLAorCQkJLm5ncGlvCQkJPSBMUEMzMlhYX0dQSU9fUDJfTUFYLAorCQkJLm5hbWVzCQkJPSBncGlvX3AyX25hbWVzLAorCQkJLmNhbl9zbGVlcAkJPSAwLAorCQl9LAorCQkuZ3Bpb19ncnAgPSAmZ3Bpb19ncnBfcmVnc19wMiwKKwl9LAorCXsKKwkJLmNoaXAgPSB7CisJCQkubGFiZWwJCQk9ICJncGlvX3AzIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBscGMzMnh4X2dwaW9fZGlyX2lucHV0X3AzLAorCQkJLmdldAkJCT0gbHBjMzJ4eF9ncGlvX2dldF92YWx1ZV9wMywKKwkJCS5kaXJlY3Rpb25fb3V0cHV0CT0gbHBjMzJ4eF9ncGlvX2Rpcl9vdXRwdXRfcDMsCisJCQkuc2V0CQkJPSBscGMzMnh4X2dwaW9fc2V0X3ZhbHVlX3AzLAorCQkJLnJlcXVlc3QJCT0gbHBjMzJ4eF9ncGlvX3JlcXVlc3QsCisJCQkuYmFzZQkJCT0gTFBDMzJYWF9HUElPX1AzX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElPX1AzX01BWCwKKwkJCS5uYW1lcwkJCT0gZ3Bpb19wM19uYW1lcywKKwkJCS5jYW5fc2xlZXAJCT0gMCwKKwkJfSwKKwkJLmdwaW9fZ3JwID0gJmdwaW9fZ3JwX3JlZ3NfcDMsCisJfSwKKwl7CisJCS5jaGlwID0geworCQkJLmxhYmVsCQkJPSAiZ3BpX3AzIiwKKwkJCS5kaXJlY3Rpb25faW5wdXQJPSBscGMzMnh4X2dwaW9fZGlyX2luX2Fsd2F5cywKKwkJCS5nZXQJCQk9IGxwYzMyeHhfZ3BpX2dldF92YWx1ZSwKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BJX1AzX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUElfUDNfTUFYLAorCQkJLm5hbWVzCQkJPSBncGlfcDNfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AzLAorCX0sCisJeworCQkuY2hpcCA9IHsKKwkJCS5sYWJlbAkJCT0gImdwb19wMyIsCisJCQkuZGlyZWN0aW9uX291dHB1dAk9IGxwYzMyeHhfZ3Bpb19kaXJfb3V0X2Fsd2F5cywKKwkJCS5zZXQJCQk9IGxwYzMyeHhfZ3BvX3NldF92YWx1ZSwKKwkJCS5yZXF1ZXN0CQk9IGxwYzMyeHhfZ3Bpb19yZXF1ZXN0LAorCQkJLmJhc2UJCQk9IExQQzMyWFhfR1BPX1AzX0dSUCwKKwkJCS5uZ3BpbwkJCT0gTFBDMzJYWF9HUE9fUDNfTUFYLAorCQkJLm5hbWVzCQkJPSBncG9fcDNfbmFtZXMsCisJCQkuY2FuX3NsZWVwCQk9IDAsCisJCX0sCisJCS5ncGlvX2dycCA9ICZncGlvX2dycF9yZWdzX3AzLAorCX0sCit9OworCit2b2lkIF9faW5pdCBscGMzMnh4X2dwaW9faW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHBjMzJ4eF9ncGlvY2hpcCk7IGkrKykKKwkJZ3Bpb2NoaXBfYWRkKCZscGMzMnh4X2dwaW9jaGlwW2ldLmNoaXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWMzMzg4MC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbWMzMzg4MC5jCmluZGV4IGIzYjQ2NTIuLjJkZTU3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1jMzM4ODAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tYzMzODgwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvbWMzMzg4MC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm1jMzM4ODAiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tY3AyM3MwOC5jCmluZGV4IDFlZjQ2ZTYuLmM1ZDgzYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tbC1pb2guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCmluZGV4IGE5MDE2ZjUuLmVhOGU3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCkBAIC0xNCwxMCArMTQsMjIgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjZGVmaW5lIElPSF9FREdFX0ZBTExJTkcJMAorI2RlZmluZSBJT0hfRURHRV9SSVNJTkcJCUJJVCgwKQorI2RlZmluZSBJT0hfTEVWRUxfTAkJQklUKDEpCisjZGVmaW5lIElPSF9MRVZFTF9ICQkoQklUKDApIHwgQklUKDEpKQorI2RlZmluZSBJT0hfRURHRV9CT1RICQlCSVQoMikKKyNkZWZpbmUgSU9IX0lNX01BU0sJCShCSVQoMCkgfCBCSVQoMSkgfCBCSVQoMikpCisKKyNkZWZpbmUgSU9IX0lSUV9CQVNFCQkwCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ST0hNICAgICAgICAgICAgIDB4MTBEQgogCkBAIC00NiwxMiArNTgsMjIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaW9oX2dwaW9fcmVnX2RhdGEgLSBUaGUgcmVnaXN0ZXIgc3RvcmUgZGF0YS4KKyAqIEBpZW5fcmVnCVRvIHN0b3JlIGNvbnRlbnRzIG9mIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIuCisgKiBAaW1hc2tfcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBpbnRlcnJ1cHQgbWFzayByZWdpc3QKICAqIEBwb19yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIFBPIHJlZ2lzdGVyLgogICogQHBtX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgUE0gcmVnaXN0ZXIuCisgKiBAaW0wX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgaW50ZXJydXB0IG1vZGUgcmVnaXN0MAorICogQGltMV9yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIGludGVycnVwdCBtb2RlIHJlZ2lzdDEKKyAqIEB1c2Vfc2VsX3JlZzogVG8gc3RvcmUgY29udGVudHMgb2YgR1BJT19VU0VfU0VMMH4zCiAgKi8KIHN0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSB7CisJdTMyIGllbl9yZWc7CisJdTMyIGltYXNrX3JlZzsKIAl1MzIgcG9fcmVnOwogCXUzMiBwbV9yZWc7CisJdTMyIGltMF9yZWc7CisJdTMyIGltMV9yZWc7CisJdTMyIHVzZV9zZWxfcmVnOwogfTsKIAogLyoqCkBAIC02Miw3ICs4NCwxMSBAQAogICogQGdwaW86CQkJRGF0YSBmb3IgR1BJTyBpbmZyYXN0cnVjdHVyZS4KICAqIEBpb2hfZ3Bpb19yZWc6CQlNZW1vcnkgbWFwcGVkIFJlZ2lzdGVyIGRhdGEgaXMgc2F2ZWQgaGVyZQogICoJCQkJd2hlbiBzdXNwZW5kLgorICogQGdwaW9fdXNlX3NlbDoJCVNhdmUgR1BJT19VU0VfU0VMMX40IHJlZ2lzdGVyIGZvciBQTQogICogQGNoOgkJCQlJbmRpY2F0ZSBHUElPIGNoYW5uZWwKKyAqIEBpcnFfYmFzZToJCVNhdmUgYmFzZSBvZiBJUlEgbnVtYmVyIGZvciBpbnRlcnJ1cHQKKyAqIEBzcGlubG9jazoJCVVzZWQgZm9yIHJlZ2lzdGVyIGFjY2VzcyBwcm90ZWN0aW9uIGluCisgKgkJCQlpbnRlcnJ1cHQgY29udGV4dCBpb2hfaXJxX3R5cGUgYW5kIFBNOwogICovCiBzdHJ1Y3QgaW9oX2dwaW8gewogCXZvaWQgX19pb21lbSAqYmFzZTsKQEAgLTcwLDggKzk2LDExIEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBncGlvX2NoaXAgZ3BpbzsKIAlzdHJ1Y3QgaW9oX2dwaW9fcmVnX2RhdGEgaW9oX2dwaW9fcmVnOworCXUzMiBncGlvX3VzZV9zZWw7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJaW50IGNoOworCWludCBpcnFfYmFzZTsKKwlzcGlubG9ja190IHNwaW5sb2NrOwogfTsKIAogc3RhdGljIGNvbnN0IGludCBudW1fcG9ydHNbXSA9IHs2LCAxMiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxMn07CkBAIC0xNDUsOCArMTc0LDI1IEBACiAgKi8KIHN0YXRpYyB2b2lkIGlvaF9ncGlvX3NhdmVfcmVnX2NvbmYoc3RydWN0IGlvaF9ncGlvICpjaGlwKQogewotCWNoaXAtPmlvaF9ncGlvX3JlZy5wb19yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7Ci0JY2hpcC0+aW9oX2dwaW9fcmVnLnBtX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpICsrLCBjaGlwKyspIHsKKwkJY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZyA9CisJCQkJCWlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBvKTsKKwkJY2hpcC0+aW9oX2dwaW9fcmVnLnBtX3JlZyA9CisJCQkJCWlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKKwkJY2hpcC0+aW9oX2dwaW9fcmVnLmllbl9yZWcgPQorCQkJCSAgICAgICBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pZW4pOworCQljaGlwLT5pb2hfZ3Bpb19yZWcuaW1hc2tfcmVnID0KKwkJCQkgICAgIGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltYXNrKTsKKwkJY2hpcC0+aW9oX2dwaW9fcmVnLmltMF9yZWcgPQorCQkJCSAgICAgIGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltXzApOworCQljaGlwLT5pb2hfZ3Bpb19yZWcuaW0xX3JlZyA9CisJCQkJICAgICAgaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1fMSk7CisJCWlmIChpIDwgNCkKKwkJCWNoaXAtPmlvaF9ncGlvX3JlZy51c2Vfc2VsX3JlZyA9CisJCQkJCSAgIGlvcmVhZDMyKCZjaGlwLT5yZWctPmlvaF9zZWxfcmVnW2ldKTsKKwl9CiB9CiAKIC8qCkBAIC0xNTQsMTMgKzIwMCwzNCBAQAogICovCiBzdGF0aWMgdm9pZCBpb2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKHN0cnVjdCBpb2hfZ3BpbyAqY2hpcCkKIHsKLQkvKiB0byBzdG9yZSBjb250ZW50cyBvZiBQTyByZWdpc3RlciAqLwotCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcucG9fcmVnLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7Ci0JLyogdG8gc3RvcmUgY29udGVudHMgb2YgUE0gcmVnaXN0ZXIgKi8KLQlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLnBtX3JlZywgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKyssIGNoaXArKykgeworCQlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCQlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLnBtX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCQlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLmllbl9yZWcsCisJCQkgICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmllbik7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcuaW1hc2tfcmVnLAorCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbWFzayk7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcuaW0wX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1fMCk7CisJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcuaW0xX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1fMSk7CisJCWlmIChpIDwgNCkKKwkJCWlvd3JpdGUzMihjaGlwLT5pb2hfZ3Bpb19yZWcudXNlX3NlbF9yZWcsCisJCQkJICAmY2hpcC0+cmVnLT5pb2hfc2VsX3JlZ1tpXSk7CisJfQogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgaW9oX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBjb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IGlvaF9ncGlvLCBncGlvKTsKKwlyZXR1cm4gY2hpcC0+aXJxX2Jhc2UgKyBvZmZzZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGlvaF9ncGlvX3NldHVwKHN0cnVjdCBpb2hfZ3BpbyAqY2hpcCwgaW50IG51bV9wb3J0KQogewogCXN0cnVjdCBncGlvX2NoaXAgKmdwaW8gPSAmY2hpcC0+Z3BpbzsKQEAgLTE3NSwxNiArMjQyLDE0OCBAQAogCWdwaW8tPmJhc2UgPSAtMTsKIAlncGlvLT5uZ3BpbyA9IG51bV9wb3J0OwogCWdwaW8tPmNhbl9zbGVlcCA9IDA7CisJZ3Bpby0+dG9faXJxID0gaW9oX2dwaW9fdG9faXJxOworfQorCitzdGF0aWMgaW50IGlvaF9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXUzMiBpbTsKKwl1MzIgKmltX3JlZzsKKwl1MzIgaWVuOworCXUzMiBpbV9wb3M7CisJaW50IGNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKwlpbnQgaXJxID0gZC0+aXJxOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCisJY2ggPSBpcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwlpZiAoaXJxIDw9IGNoaXAtPmlycV9iYXNlICsgNykgeworCQlpbV9yZWcgPSAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbV8wOworCQlpbV9wb3MgPSBjaDsKKwl9IGVsc2UgeworCQlpbV9yZWcgPSAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbV8xOworCQlpbV9wb3MgPSBjaCAtIDg7CisJfQorCWRldl9kYmcoY2hpcC0+ZGV2LCAiJXM6aXJxPSVkIHR5cGU9JWQgY2g9JWQgcG9zPSVkIHR5cGU9JWRcbiIsCisJCV9fZnVuY19fLCBpcnEsIHR5cGUsIGNoLCBpbV9wb3MsIHR5cGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQl2YWwgPSBJT0hfRURHRV9SSVNJTkc7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQl2YWwgPSBJT0hfRURHRV9GQUxMSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJdmFsID0gSU9IX0VER0VfQk9USDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQl2YWwgPSBJT0hfTEVWRUxfSDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCXZhbCA9IElPSF9MRVZFTF9MOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX1BST0JFOgorCQlnb3RvIGVuZDsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihjaGlwLT5kZXYsICIlczogdW5rbm93biB0eXBlKCVkZCkiLAorCQkJX19mdW5jX18sIHR5cGUpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgKi8KKwlpbSA9IGlvcmVhZDMyKGltX3JlZykgJiB+KElPSF9JTV9NQVNLIDw8IChpbV9wb3MgKiA0KSk7CisJaW93cml0ZTMyKGltIHwgKHZhbCA8PCAoaW1fcG9zICogNCkpLCBpbV9yZWcpOworCisJLyogaWNsciAqLworCWlvd3JpdGUzMihCSVQoY2gpLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pY2xyKTsKKworCS8qIElNQVNLQ0xSICovCisJaW93cml0ZTMyKEJJVChjaCksICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltYXNrY2xyKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpZW4gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pZW4pOworCWlvd3JpdGUzMihpZW4gfCBCSVQoY2gpLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pZW4pOworZW5kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9oX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCisJaW93cml0ZTMyKDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKSwKKwkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pbWFza2Nscik7Cit9CisKK3N0YXRpYyB2b2lkIGlvaF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gZ2MtPnByaXZhdGU7CisKKwlpb3dyaXRlMzIoMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpLAorCQkgICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmltYXNrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlvaF9ncGlvX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IGRldl9pZDsKKwl1MzIgcmVnX3ZhbDsKKwlpbnQgaSwgajsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXJlZ192YWwgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2ldLmlzdGF0dXMpOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX3BvcnRzW2ldOyBqKyspIHsKKwkJCWlmIChyZWdfdmFsICYgQklUKGopKSB7CisJCQkJZGV2X2RiZyhjaGlwLT5kZXYsCisJCQkJCSIlczpbJWRdOmlycT0lZCBzdGF0dXM9MHgleFxuIiwKKwkJCQkJX19mdW5jX18sIGosIGlycSwgcmVnX3ZhbCk7CisJCQkJaW93cml0ZTMyKEJJVChqKSwKKwkJCQkJICAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pY2xyKTsKKwkJCQlnZW5lcmljX2hhbmRsZV9pcnEoY2hpcC0+aXJxX2Jhc2UgKyBqKTsKKwkJCQlyZXQgPSBJUlFfSEFORExFRDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZpbml0IHZvaWQgaW9oX2dwaW9fYWxsb2NfZ2VuZXJpY19jaGlwKHN0cnVjdCBpb2hfZ3BpbyAqY2hpcCwKKwkJCQl1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3Q7CisKKwlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoImlvaF9ncGlvIiwgMSwgaXJxX3N0YXJ0LCBjaGlwLT5iYXNlLAorCQkJCSAgICBoYW5kbGVfc2ltcGxlX2lycSk7CisJZ2MtPnByaXZhdGUgPSBjaGlwOworCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CisKKwljdC0+Y2hpcC5pcnFfbWFzayA9IGlvaF9pcnFfbWFzazsKKwljdC0+Y2hpcC5pcnFfdW5tYXNrID0gaW9oX2lycV91bm1hc2s7CisJY3QtPmNoaXAuaXJxX3NldF90eXBlID0gaW9oX2lycV90eXBlOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyhudW0pLCBJUlFfR0NfSU5JVF9NQVNLX0NBQ0hFLAorCQkJICAgICAgIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGlvaF9ncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHJldDsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXA7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOworCWludCBpcnFfYmFzZTsKIAogCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyZXQpIHsKQEAgLTIyOCwxMCArNDI3LDQxIEBACiAJfQogCiAJY2hpcCA9IGNoaXBfc2F2ZTsKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrLCBjaGlwKyspIHsKKwkJaXJxX2Jhc2UgPSBpcnFfYWxsb2NfZGVzY3MoLTEsIElPSF9JUlFfQkFTRSwgbnVtX3BvcnRzW2pdLAorCQkJCQkgICBOVU1BX05PX05PREUpOworCQlpZiAoaXJxX2Jhc2UgPCAwKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSJtbF9pb2hfZ3BpbzogRmFpbGVkIHRvIGdldCBJUlEgYmFzZSBudW1cbiIpOworCQkJY2hpcC0+aXJxX2Jhc2UgPSAtMTsKKwkJCWdvdG8gZXJyX2lycV9hbGxvY19kZXNjczsKKwkJfQorCQljaGlwLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCQlpb2hfZ3Bpb19hbGxvY19nZW5lcmljX2NoaXAoY2hpcCwgaXJxX2Jhc2UsIG51bV9wb3J0c1tqXSk7CisJfQorCisJY2hpcCA9IGNoaXBfc2F2ZTsKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGlvaF9ncGlvX2hhbmRsZXIsCisJCQkgICAgIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSIlcyByZXF1ZXN0X2lycSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9yZXF1ZXN0X2lycToKKwljaGlwID0gY2hpcF9zYXZlOworZXJyX2lycV9hbGxvY19kZXNjczoKKwl3aGlsZSAoLS1qID49IDApIHsKKwkJY2hpcC0tOworCQlpcnFfZnJlZV9kZXNjcyhjaGlwLT5pcnFfYmFzZSwgbnVtX3BvcnRzW2pdKTsKKwl9CisKKwljaGlwID0gY2hpcF9zYXZlOwogZXJyX2dwaW9jaGlwX2FkZDoKIAl3aGlsZSAoLS1pID49IDApIHsKIAkJY2hpcC0tOwpAQCAtMjY0LDcgKzQ5NCwxMSBAQAogCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOwogCiAJY2hpcF9zYXZlID0gY2hpcDsKKworCWZyZWVfaXJxKHBkZXYtPmlycSwgY2hpcCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGlwKyspIHsKKwkJaXJxX2ZyZWVfZGVzY3MoY2hpcC0+aXJxX2Jhc2UsIG51bV9wb3J0c1tpXSk7CiAJCWVyciA9IGdwaW9jaGlwX3JlbW92ZSgmY2hpcC0+Z3Bpbyk7CiAJCWlmIChlcnIpCiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgZ3Bpb2NoaXBfcmVtb3ZlXG4iKTsKQEAgLTI4Miw5ICs1MTYsMTEgQEAKIHsKIAlzMzIgcmV0OwogCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CiAJaW9oX2dwaW9fc2F2ZV9yZWdfY29uZihjaGlwKTsKLQlpb2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0zMDQsNiArNTQwLDcgQEAKIHsKIAlzMzIgcmV0OwogCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmV0ID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMCk7CiAKQEAgLTMxNSw5ICs1NTIsMTEgQEAKIAl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAlpb3dyaXRlMzIoMHgwMSwgJmNoaXAtPnJlZy0+c3JzdCk7CiAJaW93cml0ZTMyKDB4MDAsICZjaGlwLT5yZWctPnNyc3QpOwogCWlvaF9ncGlvX3Jlc3RvcmVfcmVnX2NvbmYoY2hpcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXBjNTIwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjNTIwMC5jCmluZGV4IDUyZDNlZDIuLjJjN2NlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzUyMDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM1MjAwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjM2ZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM4eHh4LmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBHUElPcyBvbiBNUEM1MTJ4LzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2RlZmluZSBNUEM4WFhYX0dQSU9fUElOUwkzMgorCisjZGVmaW5lIEdQSU9fRElSCQkweDAwCisjZGVmaW5lIEdQSU9fT0RSCQkweDA0CisjZGVmaW5lIEdQSU9fREFUCQkweDA4CisjZGVmaW5lIEdQSU9fSUVSCQkweDBjCisjZGVmaW5lIEdQSU9fSU1SCQkweDEwCisjZGVmaW5lIEdQSU9fSUNSCQkweDE0CisjZGVmaW5lIEdQSU9fSUNSMgkJMHgxOAorCitzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgeworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgbW1fZ2M7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyoKKwkgKiBzaGFkb3dlZCBkYXRhIHJlZ2lzdGVyIHRvIGJlIGFibGUgdG8gY2xlYXIvc2V0IG91dHB1dCBwaW5zIGluCisJICogb3BlbiBkcmFpbiBtb2RlIHNhZmVseQorCSAqLworCXUzMiBkYXRhOworCXN0cnVjdCBpcnFfaG9zdCAqaXJxOworCXZvaWQgKm9mX2Rldl9pZF9kYXRhOworfTsKKworc3RhdGljIGlubGluZSB1MzIgbXBjOHh4eF9ncGlvMm1hc2sodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIDF1IDw8IChNUEM4WFhYX0dQSU9fUElOUyAtIDEgLSBncGlvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKgordG9fbXBjOHh4eF9ncGlvX2NoaXAoc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtbSwgc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwLCBtbV9nYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3Moc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0pCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCisJbXBjOHh4eF9nYy0+ZGF0YSA9IGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0RBVCk7Cit9CisKKy8qIFdvcmthcm91bmQgR1BJTyAxIGVycmF0YSBvbiBNUEM4NTcyL01QQzg1MzYuIFRoZSBzdGF0dXMgb2YgR1BJT3MKKyAqIGRlZmluZWQgYXMgb3V0cHV0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgR1BEQVQgcmVnaXN0ZXIsCisgKiBzbyB3ZSB1c2Ugc2hhZG93IGRhdGEgcmVnaXN0ZXIgaW5zdGVhZC4gVGhlIHN0YXR1cyBvZiBpbnB1dCBwaW5zCisgKiBpcyBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgR1BEQVQgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgbXBjODU3Ml9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJdTMyIHZhbDsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCisJdmFsID0gaW5fYmUzMihtbS0+cmVncyArIEdQSU9fREFUKSAmIH5pbl9iZTMyKG1tLT5yZWdzICsgR1BJT19ESVIpOworCisJcmV0dXJuICh2YWwgfCBtcGM4eHh4X2djLT5kYXRhKSAmIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKworCXJldHVybiBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19EQVQpICYgbXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSB0b19tcGM4eHh4X2dwaW9fY2hpcChtbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQltcGM4eHh4X2djLT5kYXRhIHw9IG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pOworCWVsc2UKKwkJbXBjOHh4eF9nYy0+ZGF0YSAmPSB+bXBjOHh4eF9ncGlvMm1hc2soZ3Bpbyk7CisKKwlvdXRfYmUzMihtbS0+cmVncyArIEdQSU9fREFULCBtcGM4eHh4X2djLT5kYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBtcGM4eHh4X2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19ESVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGdwaW8pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gdG9fbXBjOHh4eF9ncGlvX2NoaXAobW0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltcGM4eHh4X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fRElSLCBtcGM4eHh4X2dwaW8ybWFzayhncGlvKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM4eHh4X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IHRvX21wYzh4eHhfZ3Bpb19jaGlwKG1tKTsKKworCWlmIChtcGM4eHh4X2djLT5pcnEgJiYgb2Zmc2V0IDwgTVBDOFhYWF9HUElPX1BJTlMpCisJCXJldHVybiBpcnFfY3JlYXRlX21hcHBpbmcobXBjOHh4eF9nYy0+aXJxLCBvZmZzZXQpOworCWVsc2UKKwkJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9ncGlvX2lycV9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOworCXVuc2lnbmVkIGludCBtYXNrOworCisJbWFzayA9IGluX2JlMzIobW0tPnJlZ3MgKyBHUElPX0lFUikgJiBpbl9iZTMyKG1tLT5yZWdzICsgR1BJT19JTVIpOworCWlmIChtYXNrKQorCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2xpbmVhcl9yZXZtYXAobXBjOHh4eF9nYy0+aXJxLAorCQkJCQkJICAgICAzMiAtIGZmcyhtYXNrKSkpOworCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKworCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fSU1SLCBtcGM4eHh4X2dwaW8ybWFzayhpcnFkX3RvX2h3aXJxKGQpKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzh4eHhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gJm1wYzh4eHhfZ2MtPm1tX2djOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCisJY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19JTVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXBjOHh4eF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKworCW91dF9iZTMyKG1tLT5yZWdzICsgR1BJT19JRVIsIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKK30KKworc3RhdGljIGludCBtcGM4eHh4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoZmxvd190eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCXNldGJpdHMzMihtbS0+cmVncyArIEdQSU9fSUNSLAorCQkJICBtcGM4eHh4X2dwaW8ybWFzayhpcnFkX3RvX2h3aXJxKGQpKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wYzh4eHhfZ2MtPmxvY2ssIGZsYWdzKTsKKwkJY2xyYml0czMyKG1tLT5yZWdzICsgR1BJT19JQ1IsCisJCQkgIG1wYzh4eHhfZ3BpbzJtYXNrKGlycWRfdG9faHdpcnEoZCkpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzUxMnhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKK3sKKwlzdHJ1Y3QgbXBjOHh4eF9ncGlvX2NoaXAgKm1wYzh4eHhfZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbSA9ICZtcGM4eHh4X2djLT5tbV9nYzsKKwl1bnNpZ25lZCBsb25nIGdwaW8gPSBpcnFkX3RvX2h3aXJxKGQpOworCXZvaWQgX19pb21lbSAqcmVnOworCXVuc2lnbmVkIGludCBzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGdwaW8gPCAxNikgeworCQlyZWcgPSBtbS0+cmVncyArIEdQSU9fSUNSOworCQlzaGlmdCA9ICgxNSAtIGdwaW8pICogMjsKKwl9IGVsc2UgeworCQlyZWcgPSBtbS0+cmVncyArIEdQSU9fSUNSMjsKKwkJc2hpZnQgPSAoMTUgLSAoZ3BpbyAlIDE2KSkgKiAyOworCX0KKworCXN3aXRjaCAoZmxvd190eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWNscnNldGJpdHNfYmUzMihyZWcsIDMgPDwgc2hpZnQsIDIgPDwgc2hpZnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWNscnNldGJpdHNfYmUzMihyZWcsIDMgPDwgc2hpZnQsIDEgPDwgc2hpZnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWNscmJpdHMzMihyZWcsIDMgPDwgc2hpZnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGM4eHh4X2djLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjOHh4eF9pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAibXBjOHh4eC1ncGlvIiwKKwkuaXJxX3VubWFzawk9IG1wYzh4eHhfaXJxX3VubWFzaywKKwkuaXJxX21hc2sJPSBtcGM4eHh4X2lycV9tYXNrLAorCS5pcnFfYWNrCT0gbXBjOHh4eF9pcnFfYWNrLAorCS5pcnFfc2V0X3R5cGUJPSBtcGM4eHh4X2lycV9zZXRfdHlwZSwKK307CisKK3N0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX2lycV9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQlpcnFfaHdfbnVtYmVyX3QgaHcpCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gaC0+aG9zdF9kYXRhOworCisJaWYgKG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhKQorCQltcGM4eHh4X2lycV9jaGlwLmlycV9zZXRfdHlwZSA9IG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhOworCisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgaC0+aG9zdF9kYXRhKTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJm1wYzh4eHhfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCWlycV9zZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTk9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM4eHh4X2dwaW9faXJxX3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKKwkJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJICBpcnFfaHdfbnVtYmVyX3QgKm91dF9od2lycSwKKwkJCQkgIHVuc2lnbmVkIGludCAqb3V0X2ZsYWdzKQorCit7CisJLyogaW50ZXJydXB0IHNlbnNlIHZhbHVlcyBjb21pbmcgZnJvbSB0aGUgZGV2aWNlIHRyZWUgZXF1YWwgZWl0aGVyCisJICogRURHRV9GQUxMSU5HIG9yIEVER0VfQk9USAorCSAqLworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOworCSpvdXRfZmxhZ3MgPSBpbnRzcGVjWzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3Rfb3BzIG1wYzh4eHhfZ3Bpb19pcnFfb3BzID0geworCS5tYXAJPSBtcGM4eHh4X2dwaW9faXJxX21hcCwKKwkueGxhdGUJPSBtcGM4eHh4X2dwaW9faXJxX3hsYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjOHh4eF9ncGlvX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1ncGlvIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtZ3BpbyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1ncGlvIiwgLmRhdGEgPSBtcGM1MTJ4X2lycV9zZXRfdHlwZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwcTMtZ3BpbyIsICAgICB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWdwaW8iLCAgIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4eHh4X2FkZF9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOworCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOworCXVuc2lnbmVkIGh3aXJxOworCWludCByZXQ7CisKKwltcGM4eHh4X2djID0ga3phbGxvYyhzaXplb2YoKm1wYzh4eHhfZ2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1wYzh4eHhfZ2MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJm1wYzh4eHhfZ2MtPmxvY2spOworCisJbW1fZ2MgPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJZ2MgPSAmbW1fZ2MtPmdjOworCisJbW1fZ2MtPnNhdmVfcmVncyA9IG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3M7CisJZ2MtPm5ncGlvID0gTVBDOFhYWF9HUElPX1BJTlM7CisJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IG1wYzh4eHhfZ3Bpb19kaXJfaW47CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM4eHh4X2dwaW9fZGlyX291dDsKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsbXBjODU3Mi1ncGlvIikpCisJCWdjLT5nZXQgPSBtcGM4NTcyX2dwaW9fZ2V0OworCWVsc2UKKwkJZ2MtPmdldCA9IG1wYzh4eHhfZ3Bpb19nZXQ7CisJZ2MtPnNldCA9IG1wYzh4eHhfZ3Bpb19zZXQ7CisJZ2MtPnRvX2lycSA9IG1wYzh4eHhfZ3Bpb190b19pcnE7CisKKwlyZXQgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIG1tX2djKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWh3aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCWlmIChod2lycSA9PSBOT19JUlEpCisJCWdvdG8gc2tpcF9pcnE7CisKKwltcGM4eHh4X2djLT5pcnEgPQorCQlpcnFfYWxsb2NfaG9zdChucCwgSVJRX0hPU1RfTUFQX0xJTkVBUiwgTVBDOFhYWF9HUElPX1BJTlMsCisJCQkgICAgICAgJm1wYzh4eHhfZ3Bpb19pcnFfb3BzLCBNUEM4WFhYX0dQSU9fUElOUyk7CisJaWYgKCFtcGM4eHh4X2djLT5pcnEpCisJCWdvdG8gc2tpcF9pcnE7CisKKwlpZCA9IG9mX21hdGNoX25vZGUobXBjOHh4eF9ncGlvX2lkcywgbnApOworCWlmIChpZCkKKwkJbXBjOHh4eF9nYy0+b2ZfZGV2X2lkX2RhdGEgPSBpZC0+ZGF0YTsKKworCW1wYzh4eHhfZ2MtPmlycS0+aG9zdF9kYXRhID0gbXBjOHh4eF9nYzsKKworCS8qIGFjayBhbmQgbWFzayBhbGwgaXJxcyAqLworCW91dF9iZTMyKG1tX2djLT5yZWdzICsgR1BJT19JRVIsIDB4ZmZmZmZmZmYpOworCW91dF9iZTMyKG1tX2djLT5yZWdzICsgR1BJT19JTVIsIDApOworCisJaXJxX3NldF9oYW5kbGVyX2RhdGEoaHdpcnEsIG1wYzh4eHhfZ2MpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGh3aXJxLCBtcGM4eHh4X2dwaW9faXJxX2Nhc2NhZGUpOworCitza2lwX2lycToKKwlyZXR1cm47CisKK2VycjoKKwlwcl9lcnIoIiVzOiByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAorCSAgICAgICBucC0+ZnVsbF9uYW1lLCByZXQpOworCWtmcmVlKG1wYzh4eHhfZ2MpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtcGM4eHh4X2FkZF9ncGlvY2hpcHModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yX2VhY2hfbWF0Y2hpbmdfbm9kZShucCwgbXBjOHh4eF9ncGlvX2lkcykKKwkJbXBjOHh4eF9hZGRfY29udHJvbGxlcihucCk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXBjOHh4eF9hZGRfZ3Bpb2NoaXBzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW14Yy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMKaW5kZXggNDM0MGFjYS4uZTc5MTQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMKQEAgLTI5LDcgKzI5LDExIEBACiAjaW5jbHVkZSA8bGludXgvYmFzaWNfbW1pb19ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2RlZmluZSBpcnFfdG9fZ3BpbyhpcnEpCSgoaXJxKSAtIE1YQ19HUElPX0lSUV9TVEFSVCkKIAogZW51bSBteGNfZ3Bpb19od3R5cGUgewogCUlNWDFfR1BJTywJLyogcnVucyBvbiBpLm14MSAqLwpAQCAtMjMyLDEwICsyMzYsMTUgQEAKIHsKIAl1MzIgaXJxX3N0YXQ7CiAJc3RydWN0IG14Y19ncGlvX3BvcnQgKnBvcnQgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9nZXRfY2hpcChpcnEpOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CiAKIAlpcnFfc3RhdCA9IHJlYWRsKHBvcnQtPmJhc2UgKyBHUElPX0lTUikgJiByZWFkbChwb3J0LT5iYXNlICsgR1BJT19JTVIpOwogCiAJbXhjX2dwaW9faXJxX2hhbmRsZXIocG9ydCwgaXJxX3N0YXQpOworCisJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKIH0KIAogLyogTVgyIGhhcyBvbmUgaW50ZXJydXB0ICpmb3IgYWxsKiBncGlvIHBvcnRzICovCkBAIC0zMzcsNiArMzQ2LDE1IEBACiAJbXhjX2dwaW9faHd0eXBlID0gaHd0eXBlOwogfQogCitzdGF0aWMgaW50IG14Y19ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBiZ3Bpb19jaGlwICpiZ2MgPSB0b19iZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgbXhjX2dwaW9fcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihiZ2MsIHN0cnVjdCBteGNfZ3Bpb19wb3J0LCBiZ2MpOworCisJcmV0dXJuIHBvcnQtPnZpcnR1YWxfaXJxX3N0YXJ0ICsgb2Zmc2V0OworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBteGNfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKQEAgLTQwMyw2ICs0MjEsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2lvdW5tYXA7CiAKKwlwb3J0LT5iZ2MuZ2MudG9faXJxID0gbXhjX2dwaW9fdG9faXJxOwogCXBvcnQtPmJnYy5nYy5iYXNlID0gcGRldi0+aWQgKiAzMjsKIAlwb3J0LT5iZ2MuZGlyID0gcG9ydC0+YmdjLnJlYWRfcmVnKHBvcnQtPmJnYy5yZWdfZGlyKTsKIAlwb3J0LT5iZ2MuZGF0YSA9IHBvcnQtPmJnYy5yZWFkX3JlZyhwb3J0LT5iZ2MucmVnX3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1teHMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jCmluZGV4IGFmNTVhODUuLjM4NWM1OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW14cy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jhc2ljX21taW9fZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1hY2gvbXhzLmg+CiAKICNkZWZpbmUgTVhTX1NFVAkJMHg0CkBAIC00OSw2ICs1MCw4IEBACiAjZGVmaW5lIEdQSU9fSU5UX0xFVl9NQVNLCSgxIDw8IDApCiAjZGVmaW5lIEdQSU9fSU5UX1BPTF9NQVNLCSgxIDw8IDEpCiAKKyNkZWZpbmUgaXJxX3RvX2dwaW8oaXJxKQkoKGlycSkgLSBNWFNfR1BJT19JUlFfU1RBUlQpCisKIHN0cnVjdCBteHNfZ3Bpb19wb3J0IHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbm9tYWRpay5jCmluZGV4IDJjMjEyYzcuLjFlYmVkZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW5vbWFkaWsuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ub21hZGlrLmMKQEAgLTI3LDggKzI3LDkgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAogI2luY2x1ZGUgPHBsYXQvcGluY2ZnLmg+CisjaW5jbHVkZSA8cGxhdC9ncGlvLW5vbWFkaWsuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogLyoKICAqIFRoZSBHUElPIG1vZHVsZSBpbiB0aGUgTm9tYWRpayBmYW1pbHkgb2YgU3lzdGVtcy1vbi1DaGlwIGlzIGFuCkBAIC01OCw3ICs1OSw2IEBACiAJdTMyIHJ3aW1zYzsKIAl1MzIgZndpbXNjOwogCXUzMiBzbHBtOwotCXUzMiBlbmFibGVkOwogCXUzMiBwdWxsX3VwOwogfTsKIApAQCAtMjc2LDYgKzI3Niw4IEBACiAJCWlmICghY2hpcCkKIAkJCWJyZWFrOwogCisJCWNsa19lbmFibGUoY2hpcC0+Y2xrKTsKKwogCQlzbHBtW2ldID0gcmVhZGwoY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCQl3cml0ZWwodGVtcCwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCX0KQEAgLTI5Miw2ICsyOTQsOCBAQAogCQkJYnJlYWs7CiAKIAkJd3JpdGVsKHNscG1baV0sIGNoaXAtPmFkZHIgKyBOTUtfR1BJT19TTFBDKTsKKworCQljbGtfZGlzYWJsZShjaGlwLT5jbGspOwogCX0KIH0KIApAQCAtMzM2LDEwICszNDAsMTIgQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAkJc3Bpbl9sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAJCV9fbm1rX2NvbmZpZ19waW4obm1rX2NoaXAsIHBpbiAtIG5ta19jaGlwLT5jaGlwLmJhc2UsCiAJCQkJIGNmZ3NbaV0sIHNsZWVwLCBnbGl0Y2ggPyBzbHBtIDogTlVMTCk7CiAJCXNwaW5fdW5sb2NrKCZubWtfY2hpcC0+bG9jayk7CisJCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogCX0KIAogCWlmIChnbGl0Y2gpCkBAIC00MjQsNiArNDMwLDcgQEAKIAlpZiAoIW5ta19jaGlwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19ncGlvX3NscG1fbG9jaywgZmxhZ3MpOwogCXNwaW5fbG9jaygmbm1rX2NoaXAtPmxvY2spOwogCkBAIC00MzEsNiArNDM4LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2dwaW9fc2xwbV9sb2NrLCBmbGFncyk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1Nyw5ICs0NjUsMTEgQEAKIAlpZiAoIW5ta19jaGlwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CiAJX19ubWtfZ3Bpb19zZXRfcHVsbChubWtfY2hpcCwgZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UsIHB1bGwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4Myw5ICs0OTMsMTEgQEAKIAlpZiAoIW5ta19jaGlwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ta19jaGlwLT5sb2NrLCBmbGFncyk7CiAJX19ubWtfZ3Bpb19zZXRfbW9kZShubWtfY2hpcCwgZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UsIGdwaW9fbW9kZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTAyLDkgKzUxNCwxMyBAQAogCiAJYml0ID0gMSA8PCAoZ3BpbyAtIG5ta19jaGlwLT5jaGlwLmJhc2UpOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCWFmdW5jID0gcmVhZGwobm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19BRlNMQSkgJiBiaXQ7CiAJYmZ1bmMgPSByZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0FGU0xCKSAmIGJpdDsKIAorCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOworCiAJcmV0dXJuIChhZnVuYyA/IE5NS19HUElPX0FMVF9BIDogMCkgfCAoYmZ1bmMgPyBOTUtfR1BJT19BTFRfQiA6IDApOwogfQogRVhQT1JUX1NZTUJPTChubWtfZ3Bpb19nZXRfbW9kZSk7CkBAIC01MjUsNyArNTQxLDEwIEBACiAJbm1rX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlpZiAoIW5ta19jaGlwKQogCQlyZXR1cm47CisKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOwogCXdyaXRlbChubWtfZ3Bpb19nZXRfYml0bWFzayhncGlvKSwgbm1rX2NoaXAtPmFkZHIgKyBOTUtfR1BJT19JQyk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiB9CiAKIGVudW0gbm1rX2dwaW9faXJxX3R5cGUgewpAQCAtNTg2LDExICs2MDUsNyBAQAogCWlmICghbm1rX2NoaXApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGVuYWJsZSkKLQkJbm1rX2NoaXAtPmVuYWJsZWQgfD0gYml0bWFzazsKLQllbHNlCi0JCW5ta19jaGlwLT5lbmFibGVkICY9IH5iaXRtYXNrOwotCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2dwaW9fc2xwbV9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAKQEAgLTYwMSw2ICs2MTYsNyBAQAogCiAJc3Bpbl91bmxvY2soJm5ta19jaGlwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZubWtfZ3Bpb19zbHBtX2xvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjI4LDEwICs2NDQsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJYml0bWFzayA9IG5ta19ncGlvX2dldF9iaXRtYXNrKGdwaW8pOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbm1rX2dwaW9fc2xwbV9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAKLQlpZiAoIShubWtfY2hpcC0+ZW5hYmxlZCAmIGJpdG1hc2spKQorCWlmIChpcnFkX2lycV9kaXNhYmxlZChkKSkKIAkJX19ubWtfZ3Bpb19zZXRfd2FrZShubWtfY2hpcCwgZ3Bpbywgb24pOwogCiAJaWYgKG9uKQpAQCAtNjQxLDEzICs2NTgsMTUgQEAKIAogCXNwaW5fdW5sb2NrKCZubWtfY2hpcC0+bG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2dwaW9fc2xwbV9sb2NrLCBmbGFncyk7CisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBubWtfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQlib29sIGVuYWJsZWQsIHdha2UgPSBpcnFkX2lzX3dha2V1cF9zZXQoZCk7CisJYm9vbCBlbmFibGVkID0gIWlycWRfaXJxX2Rpc2FibGVkKGQpOworCWJvb2wgd2FrZSA9IGlycWRfaXNfd2FrZXVwX3NldChkKTsKIAlpbnQgZ3BpbzsKIAlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY2NCw4ICs2ODMsNyBAQAogCWlmICh0eXBlICYgSVJRX1RZUEVfTEVWRUxfTE9XKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVuYWJsZWQgPSBubWtfY2hpcC0+ZW5hYmxlZCAmIGJpdG1hc2s7Ci0KKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOwogCXNwaW5fbG9ja19pcnFzYXZlKCZubWtfY2hpcC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGVuYWJsZWQpCkBAIC02ODksMTAgKzcwNywyOCBAQAogCQlfX25ta19ncGlvX2lycV9tb2RpZnkobm1rX2NoaXAsIGdwaW8sIFdBS0UsIHRydWUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm1rX2NoaXAtPmxvY2ssIGZsYWdzKTsKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IG5ta19ncGlvX2lycV9zdGFydHVwKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CisJbm1rX2dwaW9faXJxX3VubWFzayhkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm1rX2dwaW9faXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKworCW5ta19ncGlvX2lycV9tYXNrKGQpOworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG5ta19ncGlvX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJOb21hZGlrLUdQSU8iLAogCS5pcnFfYWNrCT0gbm1rX2dwaW9faXJxX2FjaywKQEAgLTcwMCw2ICs3MzYsOCBAQAogCS5pcnFfdW5tYXNrCT0gbm1rX2dwaW9faXJxX3VubWFzaywKIAkuaXJxX3NldF90eXBlCT0gbm1rX2dwaW9faXJxX3NldF90eXBlLAogCS5pcnFfc2V0X3dha2UJPSBubWtfZ3Bpb19pcnFfc2V0X3dha2UsCisJLmlycV9zdGFydHVwCT0gbm1rX2dwaW9faXJxX3N0YXJ0dXAsCisJLmlycV9zaHV0ZG93bgk9IG5ta19ncGlvX2lycV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyB2b2lkIF9fbm1rX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLApAQCAtNzI2LDcgKzc2NCwxMSBAQAogc3RhdGljIHZvaWQgbm1rX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7Ci0JdTMyIHN0YXR1cyA9IHJlYWRsKG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fSVMpOworCXUzMiBzdGF0dXM7CisKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOworCXN0YXR1cyA9IHJlYWRsKG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fSVMpOworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogCiAJX19ubWtfZ3Bpb19pcnFfaGFuZGxlcihpcnEsIGRlc2MsIHN0YXR1cyk7CiB9CkBAIC03NzIsNyArODE0LDEyIEBACiAJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwID0KIAkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBubWtfZ3Bpb19jaGlwLCBjaGlwKTsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CisKIAl3cml0ZWwoMSA8PCBvZmZzZXQsIG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fRElSQyk7CisKKwljbGtfZGlzYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC03ODEsOCArODI4LDE1IEBACiAJc3RydWN0IG5ta19ncGlvX2NoaXAgKm5ta19jaGlwID0KIAkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBubWtfZ3Bpb19jaGlwLCBjaGlwKTsKIAl1MzIgYml0ID0gMSA8PCBvZmZzZXQ7CisJaW50IHZhbHVlOwogCi0JcmV0dXJuIChyZWFkbChubWtfY2hpcC0+YWRkciArIE5NS19HUElPX0RBVCkgJiBiaXQpICE9IDA7CisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKworCXZhbHVlID0gKHJlYWRsKG5ta19jaGlwLT5hZGRyICsgTk1LX0dQSU9fREFUKSAmIGJpdCkgIT0gMDsKKworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOworCisJcmV0dXJuIHZhbHVlOwogfQogCiBzdGF0aWMgdm9pZCBubWtfZ3Bpb19zZXRfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKQEAgLTc5MSw3ICs4NDUsMTEgQEAKIAlzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCAqbm1rX2NoaXAgPQogCQljb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG5ta19ncGlvX2NoaXAsIGNoaXApOwogCisJY2xrX2VuYWJsZShubWtfY2hpcC0+Y2xrKTsKKwogCV9fbm1rX2dwaW9fc2V0X291dHB1dChubWtfY2hpcCwgb2Zmc2V0LCB2YWwpOworCisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CiB9CiAKIHN0YXRpYyBpbnQgbm1rX2dwaW9fbWFrZV9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LApAQCAtODAwLDggKzg1OCwxMiBAQAogCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpubWtfY2hpcCA9CiAJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgbm1rX2dwaW9fY2hpcCwgY2hpcCk7CiAKKwljbGtfZW5hYmxlKG5ta19jaGlwLT5jbGspOworCiAJX19ubWtfZ3Bpb19tYWtlX291dHB1dChubWtfY2hpcCwgb2Zmc2V0LCB2YWwpOwogCisJY2xrX2Rpc2FibGUobm1rX2NoaXAtPmNsayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODMyLDYgKzg5NCw4IEBACiAJCVtOTUtfR1BJT19BTFRfQ10JPSAiYWx0QyIsCiAJfTsKIAorCWNsa19lbmFibGUobm1rX2NoaXAtPmNsayk7CisKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bmdwaW87IGkrKywgZ3BpbysrKSB7CiAJCWNvbnN0IGNoYXIgKmxhYmVsID0gZ3Bpb2NoaXBfaXNfcmVxdWVzdGVkKGNoaXAsIGkpOwogCQlib29sIHB1bGw7CkBAIC04NzYsNiArOTQwLDggQEAKIAogCQlzZXFfcHJpbnRmKHMsICJcbiIpOwogCX0KKworCWNsa19kaXNhYmxlKG5ta19jaGlwLT5jbGspOwogfQogCiAjZWxzZQpAQCAtODkzLDYgKzk1OSwzNCBAQAogCS5jYW5fc2xlZXAJCT0gMCwKIH07CiAKK3ZvaWQgbm1rX2dwaW9fY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9CQU5LUzsgaSsrKSB7CisJCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpjaGlwID0gbm1rX2dwaW9fY2hpcHNbaV07CisKKwkJaWYgKCFjaGlwKQorCQkJY29udGludWU7CisKKwkJY2xrX2VuYWJsZShjaGlwLT5jbGspOworCX0KK30KKwordm9pZCBubWtfZ3Bpb19jbG9ja3NfZGlzYWJsZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9CQU5LUzsgaSsrKSB7CisJCXN0cnVjdCBubWtfZ3Bpb19jaGlwICpjaGlwID0gbm1rX2dwaW9fY2hpcHNbaV07CisKKwkJaWYgKCFjaGlwKQorCQkJY29udGludWU7CisKKwkJY2xrX2Rpc2FibGUoY2hpcC0+Y2xrKTsKKwl9Cit9CisKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aGUgc3VzcGVuZC9yZXN1bWUgcGF0aCB0byBvbmx5IGtlZXAgdGhlIHJlYWwgd2FrZXVwIGludGVycnVwdHMKICAqICh0aG9zZSB0aGF0IGhhdmUgaGFkIHNldF9pcnFfd2FrZSgpIGNhbGxlZCBvbiB0aGVtKSBhcyB3YWtldXAgaW50ZXJydXB0cywKQEAgLTkxMiw2ICsxMDA2LDggQEAKIAkJaWYgKCFjaGlwKQogCQkJYnJlYWs7CiAKKwkJY2xrX2VuYWJsZShjaGlwLT5jbGspOworCiAJCWNoaXAtPnJ3aW1zYyA9IHJlYWRsKGNoaXAtPmFkZHIgKyBOTUtfR1BJT19SV0lNU0MpOwogCQljaGlwLT5md2ltc2MgPSByZWFkbChjaGlwLT5hZGRyICsgTk1LX0dQSU9fRldJTVNDKTsKIApAQCAtOTI2LDYgKzEwMjIsOCBAQAogCQkJLyogMCAtPiB3YWtldXAgZW5hYmxlICovCiAJCQl3cml0ZWwofmNoaXAtPnJlYWxfd2FrZSwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOwogCQl9CisKKwkJY2xrX2Rpc2FibGUoY2hpcC0+Y2xrKTsKIAl9CiB9CiAKQEAgLTkzOSwxMSArMTAzNywxNSBAQAogCQlpZiAoIWNoaXApCiAJCQlicmVhazsKIAorCQljbGtfZW5hYmxlKGNoaXAtPmNsayk7CisKIAkJd3JpdGVsKGNoaXAtPnJ3aW1zYywgY2hpcC0+YWRkciArIE5NS19HUElPX1JXSU1TQyk7CiAJCXdyaXRlbChjaGlwLT5md2ltc2MsIGNoaXAtPmFkZHIgKyBOTUtfR1BJT19GV0lNU0MpOwogCiAJCWlmIChjaGlwLT5zbGVlcG1vZGUpCiAJCQl3cml0ZWwoY2hpcC0+c2xwbSwgY2hpcC0+YWRkciArIE5NS19HUElPX1NMUEMpOworCisJCWNsa19kaXNhYmxlKGNoaXAtPmNsayk7CiAJfQogfQogCkBAIC0xMDEwLDggKzExMTIsNiBAQAogCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAotCWNsa19lbmFibGUoY2xrKTsKLQogCW5ta19jaGlwID0ga3phbGxvYyhzaXplb2YoKm5ta19jaGlwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFubWtfY2hpcCkgewogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tb21hcC5jCmluZGV4IDExOGVjMTIuLjBiMDU2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW9tYXAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1vbWFwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKIHN0cnVjdCBncGlvX2JhbmsgewpAQCAtMTQ4LDEzICsxNDgsMTcgQEAKIAlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiBHUElPX0JJVChiYW5rLCBncGlvKSkgIT0gMDsKIH0KIAotI2RlZmluZSBNT0RfUkVHX0JJVChyZWcsIGJpdF9tYXNrLCBzZXQpCVwKLWRvIHsJXAotCWludCBsID0gX19yYXdfcmVhZGwoYmFzZSArIHJlZyk7IFwKLQlpZiAoc2V0KSBsIHw9IGJpdF9tYXNrOyBcCi0JZWxzZSBsICY9IH5iaXRfbWFzazsgXAotCV9fcmF3X3dyaXRlbChsLCBiYXNlICsgcmVnKTsgXAotfSB3aGlsZSgwKQorc3RhdGljIGlubGluZSB2b2lkIF9ncGlvX3Jtdyh2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiByZWcsIHUzMiBtYXNrLCBib29sIHNldCkKK3sKKwlpbnQgbCA9IF9fcmF3X3JlYWRsKGJhc2UgKyByZWcpOworCisJaWYgKHNldCkgCisJCWwgfD0gbWFzazsKKwllbHNlCisJCWwgJj0gfm1hc2s7CisKKwlfX3Jhd193cml0ZWwobCwgYmFzZSArIHJlZyk7Cit9CiAKIC8qKgogICogX3NldF9ncGlvX2RlYm91bmNlIC0gbG93IGxldmVsIGdwaW8gZGVib3VuY2UgdGltZQpAQCAtMjEwLDI4ICsyMTQsMjggQEAKIAl1MzIgZ3Bpb19iaXQgPSAxIDw8IGdwaW87CiAKIAlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0JCU1PRF9SRUdfQklUKE9NQVA0X0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKLQkJCXRyaWdnZXIgJiBJUlFfVFlQRV9MRVZFTF9ISUdIKTsKLQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19SSVNJTkdERVRFQ1QsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQkJTU9EX1JFR19CSVQoT01BUDRfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKLQkJCXRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDRfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwkJX2dwaW9fcm13KGJhc2UsIE9NQVA0X0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKKwkJCSAgdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDRfR1BJT19SSVNJTkdERVRFQ1QsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDRfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKKwkJCSAgdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORyk7CiAJfSBlbHNlIHsKLQkJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0xPVyk7Ci0JCU1PRF9SRUdfQklUKE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKLQkJCXRyaWdnZXIgJiBJUlFfVFlQRV9MRVZFTF9ISUdIKTsKLQkJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19SSVNJTkdERVRFQ1QsIGdwaW9fYml0LAotCQkJdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfUklTSU5HKTsKLQkJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKLQkJCXRyaWdnZXIgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDAsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfTEVWRUxfTE9XKTsKKwkJX2dwaW9fcm13KGJhc2UsIE9NQVAyNFhYX0dQSU9fTEVWRUxERVRFQ1QxLCBncGlvX2JpdCwKKwkJCSAgdHJpZ2dlciAmIElSUV9UWVBFX0xFVkVMX0hJR0gpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDI0WFhfR1BJT19SSVNJTkdERVRFQ1QsIGdwaW9fYml0LAorCQkJICB0cmlnZ2VyICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCQlfZ3Bpb19ybXcoYmFzZSwgT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKKwkJCSAgdHJpZ2dlciAmIElSUV9UWVBFX0VER0VfRkFMTElORyk7CiAJfQogCWlmIChsaWtlbHkoIShiYW5rLT5ub25fd2FrZXVwX2dwaW9zICYgZ3Bpb19iaXQpKSkgewogCQlpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJCU1PRF9SRUdfQklUKE9NQVA0X0dQSU9fSVJRV0FLRU4wLCBncGlvX2JpdCwKLQkJCQl0cmlnZ2VyICE9IDApOworCQkJX2dwaW9fcm13KGJhc2UsIE9NQVA0X0dQSU9fSVJRV0FLRU4wLCBncGlvX2JpdCwKKwkJCQkgIHRyaWdnZXIgIT0gMCk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogR1BJTyB3YWtldXAgcmVxdWVzdCBjYW4gb25seSBiZSBnZW5lcmF0ZWQgb24gZWRnZQpAQCAtMTA4Niw2ICsxMDkwLDExIEBACiAKIAlnYyA9IGlycV9hbGxvY19nZW5lcmljX2NoaXAoIk1QVUlPIiwgMSwgaXJxX3N0YXJ0LCBiYW5rLT5iYXNlLAogCQkJCSAgICBoYW5kbGVfc2ltcGxlX2lycSk7CisJaWYgKCFnYykgeworCQlkZXZfZXJyKGJhbmstPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlsZWQgZm9yIGdjXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCWN0ID0gZ2MtPmNoaXBfdHlwZXM7CiAKIAkvKiBOT1RFOiBObyBhY2sgcmVxdWlyZWQsIHJlYWRpbmcgSVJRIHN0YXR1cyBjbGVhcnMgaXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMKaW5kZXggMDU1MGRjYi4uMTQ3ZGY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwpAQCAtNTk2LDkgKzU5Niw2IEBACiAKIAkvKiBzZXQgcGxhdGZvcm0gc3BlY2lmaWMgcG9sYXJpdHkgaW52ZXJzaW9uICovCiAJcmV0ID0gcGNhOTUzeF93cml0ZV9yZWcoY2hpcCwgUENBOTUzWF9JTlZFUlQsIGludmVydCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0JcmV0dXJuIDA7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY0MCw3ICs2MzcsNyBAQAogCXN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7CiAJaW50IGlycV9iYXNlPTAsIGludmVydD0wOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjYTk1M3hfY2hpcCksIEdGUF9LRVJORUwpOwogCWlmIChjaGlwID09IE5VTEwpCkBAIC02NzMsMTAgKzY3MCwxMCBAQAogCXBjYTk1M3hfc2V0dXBfZ3BpbyhjaGlwLCBpZC0+ZHJpdmVyX2RhdGEgJiBQQ0FfR1BJT19NQVNLKTsKIAogCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gUENBOTUzWF9UWVBFKQotCQlkZXZpY2VfcGNhOTUzeF9pbml0KGNoaXAsIGludmVydCk7Ci0JZWxzZSBpZiAoY2hpcC0+Y2hpcF90eXBlID09IFBDQTk1N1hfVFlQRSkKLQkJZGV2aWNlX3BjYTk1N3hfaW5pdChjaGlwLCBpbnZlcnQpOworCQlyZXQgPSBkZXZpY2VfcGNhOTUzeF9pbml0KGNoaXAsIGludmVydCk7CiAJZWxzZQorCQlyZXQgPSBkZXZpY2VfcGNhOTU3eF9pbml0KGNoaXAsIGludmVydCk7CisJaWYgKHJldCkKIAkJZ290byBvdXRfZmFpbGVkOwogCiAJcmV0ID0gcGNhOTUzeF9pcnFfc2V0dXAoY2hpcCwgaWQsIGlycV9iYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjZjg1N3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjZjg1N3guYwppbmRleCA3MzY5ZmRkLi4zZTFmMWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2Y4NTd4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNmODU3eC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2Y4NTd4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBjZjg1N3hfaWRbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjaC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNoLmMKaW5kZXggMzY5MTllNy4uYTYwMDhlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcGNoLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNoLmMKQEAgLTE0LDEyICsxNCwyMSBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAotI2RlZmluZSBQQ0hfR1BJT19BTExfUElOUwkweGZmZiAvKiBNYXNrIGZvciBHUElPIHBpbnMgMCB0byAxMSAqLwotI2RlZmluZSBHUElPX05VTV9QSU5TCTEyCS8qIFNwZWNpZmllcyBudW1iZXIgb2YgR1BJTyBQSU5TIEdQSU8wLUdQSU8xMSAqLworI2RlZmluZSBQQ0hfRURHRV9GQUxMSU5HCTAKKyNkZWZpbmUgUENIX0VER0VfUklTSU5HCQlCSVQoMCkKKyNkZWZpbmUgUENIX0xFVkVMX0wJCUJJVCgxKQorI2RlZmluZSBQQ0hfTEVWRUxfSAkJKEJJVCgwKSB8IEJJVCgxKSkKKyNkZWZpbmUgUENIX0VER0VfQk9USAkJQklUKDIpCisjZGVmaW5lIFBDSF9JTV9NQVNLCQkoQklUKDApIHwgQklUKDEpIHwgQklUKDIpKQorCisjZGVmaW5lIFBDSF9JUlFfQkFTRQkJMjQKIAogc3RydWN0IHBjaF9yZWdzIHsKIAl1MzIJaWVuOwpAQCAtMzMsMTggKzQyLDQzIEBACiAJdTMyCXBtOwogCXUzMglpbTA7CiAJdTMyCWltMTsKLQl1MzIJcmVzZXJ2ZWRbNF07CisJdTMyCXJlc2VydmVkWzNdOworCXUzMglncGlvX3VzZV9zZWw7CiAJdTMyCXJlc2V0OwogfTsKIAorZW51bSBwY2hfdHlwZV90IHsKKwlJTlRFTF9FRzIwVF9QQ0gsCisJT0tJU0VNSV9NTDcyMjNtX0lPSCwgLyogT0tJU0VNSSBNTDcyMjMgSU9IIFBDSWUgQnVzLW0gKi8KKwlPS0lTRU1JX01MNzIyM25fSU9IICAvKiBPS0lTRU1JIE1MNzIyMyBJT0ggUENJZSBCdXMtbiAqLworfTsKKworLyogU3BlY2lmaWVzIG51bWJlciBvZiBHUElPIFBJTlMgKi8KK3N0YXRpYyBpbnQgZ3Bpb19waW5zW10gPSB7CisJW0lOVEVMX0VHMjBUX1BDSF0gPSAxMiwKKwlbT0tJU0VNSV9NTDcyMjNtX0lPSF0gPSA4LAorCVtPS0lTRU1JX01MNzIyM25fSU9IXSA9IDgsCit9OworCiAvKioKICAqIHN0cnVjdCBwY2hfZ3Bpb19yZWdfZGF0YSAtIFRoZSByZWdpc3RlciBzdG9yZSBkYXRhLgorICogQGllbl9yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIElFTiByZWdpc3Rlci4KKyAqIEBpbWFza19yZWc6CVRvIHN0b3JlIGNvbnRlbnRzIG9mIElNQVNLIHJlZ2lzdGVyLgogICogQHBvX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIuCiAgKiBAcG1fcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBQTSByZWdpc3Rlci4KKyAqIEBpbTBfcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBJTTAgcmVnaXN0ZXIuCisgKiBAaW0xX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgSU0xIHJlZ2lzdGVyLgorICogQGdwaW9fdXNlX3NlbF9yZWcgOiBUbyBzdG9yZSBjb250ZW50cyBvZiBHUElPX1VTRV9TRUwgcmVnaXN0ZXIuCisgKgkJICAgICAgIChPbmx5IE1MNzIyMyBCdXMtbikKICAqLwogc3RydWN0IHBjaF9ncGlvX3JlZ19kYXRhIHsKKwl1MzIgaWVuX3JlZzsKKwl1MzIgaW1hc2tfcmVnOwogCXUzMiBwb19yZWc7CiAJdTMyIHBtX3JlZzsKKwl1MzIgaW0wX3JlZzsKKwl1MzIgaW0xX3JlZzsKKwl1MzIgZ3Bpb191c2Vfc2VsX3JlZzsKIH07CiAKIC8qKgpAQCAtNTUsNiArODksMTIgQEAKICAqIEBncGlvOgkJCURhdGEgZm9yIEdQSU8gaW5mcmFzdHJ1Y3R1cmUuCiAgKiBAcGNoX2dwaW9fcmVnOgkJTWVtb3J5IG1hcHBlZCBSZWdpc3RlciBkYXRhIGlzIHNhdmVkIGhlcmUKICAqCQkJCXdoZW4gc3VzcGVuZC4KKyAqIEBsb2NrOgkJCVVzZWQgZm9yIHJlZ2lzdGVyIGFjY2VzcyBwcm90ZWN0aW9uCisgKiBAaXJxX2Jhc2U6CQlTYXZlIGJhc2Ugb2YgSVJRIG51bWJlciBmb3IgaW50ZXJydXB0CisgKiBAaW9oOgkJSU9IIElECisgKiBAc3BpbmxvY2s6CQlVc2VkIGZvciByZWdpc3RlciBhY2Nlc3MgcHJvdGVjdGlvbiBpbgorICoJCQkJaW50ZXJydXB0IGNvbnRleHQgcGNoX2lycV9tYXNrLAorICoJCQkJcGNoX2lycV91bm1hc2sgYW5kIHBjaF9pcnFfdHlwZTsKICAqLwogc3RydWN0IHBjaF9ncGlvIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CkBAIC02Myw2ICsxMDMsOSBAQAogCXN0cnVjdCBncGlvX2NoaXAgZ3BpbzsKIAlzdHJ1Y3QgcGNoX2dwaW9fcmVnX2RhdGEgcGNoX2dwaW9fcmVnOwogCXN0cnVjdCBtdXRleCBsb2NrOworCWludCBpcnFfYmFzZTsKKwllbnVtIHBjaF90eXBlX3QgaW9oOworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CiB9OwogCiBzdGF0aWMgdm9pZCBwY2hfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgbnIsIGludCB2YWwpCkBAIC05Niw3ICsxMzksNyBAQAogCXUzMiByZWdfdmFsOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7Ci0JcG0gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5wbSkgJiBQQ0hfR1BJT19BTExfUElOUzsKKwlwbSA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnBtKSAmICgoMSA8PCBncGlvX3BpbnNbY2hpcC0+aW9oXSkgLSAxKTsKIAlwbSB8PSAoMSA8PCBucik7CiAJaW93cml0ZTMyKHBtLCAmY2hpcC0+cmVnLT5wbSk7CiAKQEAgLTExOCw3ICsxNjEsNyBAQAogCXUzMiBwbTsKIAogCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwotCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cG0pICYgUENIX0dQSU9fQUxMX1BJTlM7IC8qYml0cyAwLTExKi8KKwlwbSA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnBtKSAmICgoMSA8PCBncGlvX3BpbnNbY2hpcC0+aW9oXSkgLSAxKTsKIAlwbSAmPSB+KDEgPDwgbnIpOwogCWlvd3JpdGUzMihwbSwgJmNoaXAtPnJlZy0+cG0pOwogCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CkBAIC0xMzEsOCArMTc0LDE2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBjaF9ncGlvX3NhdmVfcmVnX2NvbmYoc3RydWN0IHBjaF9ncGlvICpjaGlwKQogeworCWNoaXAtPnBjaF9ncGlvX3JlZy5pZW5fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+aWVuKTsKKwljaGlwLT5wY2hfZ3Bpb19yZWcuaW1hc2tfcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+aW1hc2spOwogCWNoaXAtPnBjaF9ncGlvX3JlZy5wb19yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5wbyk7CiAJY2hpcC0+cGNoX2dwaW9fcmVnLnBtX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnBtKTsKKwljaGlwLT5wY2hfZ3Bpb19yZWcuaW0wX3JlZyA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPmltMCk7CisJaWYgKGNoaXAtPmlvaCA9PSBJTlRFTF9FRzIwVF9QQ0gpCisJCWNoaXAtPnBjaF9ncGlvX3JlZy5pbTFfcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+aW0xKTsKKwlpZiAoY2hpcC0+aW9oID09IE9LSVNFTUlfTUw3MjIzbl9JT0gpCisJCWNoaXAtPnBjaF9ncGlvX3JlZy5ncGlvX3VzZV9zZWxfcmVnID1cCisJCQkJCSAgICBpb3JlYWQzMigmY2hpcC0+cmVnLT5ncGlvX3VzZV9zZWwpOwogfQogCiAvKgpAQCAtMTQwLDEwICsxOTEsMjQgQEAKICAqLwogc3RhdGljIHZvaWQgcGNoX2dwaW9fcmVzdG9yZV9yZWdfY29uZihzdHJ1Y3QgcGNoX2dwaW8gKmNoaXApCiB7CisJaW93cml0ZTMyKGNoaXAtPnBjaF9ncGlvX3JlZy5pZW5fcmVnLCAmY2hpcC0+cmVnLT5pZW4pOworCWlvd3JpdGUzMihjaGlwLT5wY2hfZ3Bpb19yZWcuaW1hc2tfcmVnLCAmY2hpcC0+cmVnLT5pbWFzayk7CiAJLyogdG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIgKi8KIAlpb3dyaXRlMzIoY2hpcC0+cGNoX2dwaW9fcmVnLnBvX3JlZywgJmNoaXAtPnJlZy0+cG8pOwogCS8qIHRvIHN0b3JlIGNvbnRlbnRzIG9mIFBNIHJlZ2lzdGVyICovCiAJaW93cml0ZTMyKGNoaXAtPnBjaF9ncGlvX3JlZy5wbV9yZWcsICZjaGlwLT5yZWctPnBtKTsKKwlpb3dyaXRlMzIoY2hpcC0+cGNoX2dwaW9fcmVnLmltMF9yZWcsICZjaGlwLT5yZWctPmltMCk7CisJaWYgKGNoaXAtPmlvaCA9PSBJTlRFTF9FRzIwVF9QQ0gpCisJCWlvd3JpdGUzMihjaGlwLT5wY2hfZ3Bpb19yZWcuaW0xX3JlZywgJmNoaXAtPnJlZy0+aW0xKTsKKwlpZiAoY2hpcC0+aW9oID09IE9LSVNFTUlfTUw3MjIzbl9JT0gpCisJCWlvd3JpdGUzMihjaGlwLT5wY2hfZ3Bpb19yZWcuZ3Bpb191c2Vfc2VsX3JlZywKKwkJCSAgJmNoaXAtPnJlZy0+Z3Bpb191c2Vfc2VsKTsKK30KKworc3RhdGljIGludCBwY2hfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqZ3BpbywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IGNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgcGNoX2dwaW8sIGdwaW8pOworCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKIH0KIAogc3RhdGljIHZvaWQgcGNoX2dwaW9fc2V0dXAoc3RydWN0IHBjaF9ncGlvICpjaGlwKQpAQCAtMTU4LDggKzIyMywxMzIgQEAKIAlncGlvLT5zZXQgPSBwY2hfZ3Bpb19zZXQ7CiAJZ3Bpby0+ZGJnX3Nob3cgPSBOVUxMOwogCWdwaW8tPmJhc2UgPSAtMTsKLQlncGlvLT5uZ3BpbyA9IEdQSU9fTlVNX1BJTlM7CisJZ3Bpby0+bmdwaW8gPSBncGlvX3BpbnNbY2hpcC0+aW9oXTsKIAlncGlvLT5jYW5fc2xlZXAgPSAwOworCWdwaW8tPnRvX2lycSA9IHBjaF9ncGlvX3RvX2lycTsKK30KKworc3RhdGljIGludCBwY2hfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl1MzIgaW07CisJdTMyICppbV9yZWc7CisJdTMyIGllbjsKKwl1MzIgaW1fcG9zOworCWludCBjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisJaW50IGlycSA9IGQtPmlycTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgcGNoX2dwaW8gKmNoaXAgPSBnYy0+cHJpdmF0ZTsKKworCWNoID0gaXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJaWYgKGlycSA8PSBjaGlwLT5pcnFfYmFzZSArIDcpIHsKKwkJaW1fcmVnID0gJmNoaXAtPnJlZy0+aW0wOworCQlpbV9wb3MgPSBjaDsKKwl9IGVsc2UgeworCQlpbV9yZWcgPSAmY2hpcC0+cmVnLT5pbTE7CisJCWltX3BvcyA9IGNoIC0gODsKKwl9CisJZGV2X2RiZyhjaGlwLT5kZXYsICIlczppcnE9JWQgdHlwZT0lZCBjaD0lZCBwb3M9JWRcbiIsCisJCV9fZnVuY19fLCBpcnEsIHR5cGUsIGNoLCBpbV9wb3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQl2YWwgPSBQQ0hfRURHRV9SSVNJTkc7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQl2YWwgPSBQQ0hfRURHRV9GQUxMSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJdmFsID0gUENIX0VER0VfQk9USDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQl2YWwgPSBQQ0hfTEVWRUxfSDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCXZhbCA9IFBDSF9MRVZFTF9MOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX1BST0JFOgorCQlnb3RvIGVuZDsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihjaGlwLT5kZXYsICIlczogdW5rbm93biB0eXBlKCVkZCkiLAorCQkJX19mdW5jX18sIHR5cGUpOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgKi8KKwlpbSA9IGlvcmVhZDMyKGltX3JlZykgJiB+KFBDSF9JTV9NQVNLIDw8IChpbV9wb3MgKiA0KSk7CisJaW93cml0ZTMyKGltIHwgKHZhbCA8PCAoaW1fcG9zICogNCkpLCBpbV9yZWcpOworCisJLyogaWNsciAqLworCWlvd3JpdGUzMihCSVQoY2gpLCAmY2hpcC0+cmVnLT5pY2xyKTsKKworCS8qIElNQVNLQ0xSICovCisJaW93cml0ZTMyKEJJVChjaCksICZjaGlwLT5yZWctPmltYXNrY2xyKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpZW4gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5pZW4pOworCWlvd3JpdGUzMihpZW4gfCBCSVQoY2gpLCAmY2hpcC0+cmVnLT5pZW4pOworZW5kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGNoX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCisJaW93cml0ZTMyKDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKSwgJmNoaXAtPnJlZy0+aW1hc2tjbHIpOworfQorCitzdGF0aWMgdm9pZCBwY2hfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCisJaW93cml0ZTMyKDEgPDwgKGQtPmlycSAtIGNoaXAtPmlycV9iYXNlKSwgJmNoaXAtPnJlZy0+aW1hc2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNoX2dwaW9faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBjaF9ncGlvICpjaGlwID0gZGV2X2lkOworCXUzMiByZWdfdmFsID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+aXN0YXR1cyk7CisJaW50IGk7CisJaW50IHJldCA9IElSUV9OT05FOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9fcGluc1tjaGlwLT5pb2hdOyBpKyspIHsKKwkJaWYgKHJlZ192YWwgJiBCSVQoaSkpIHsKKwkJCWRldl9kYmcoY2hpcC0+ZGV2LCAiJXM6WyVkXTppcnE9JWQgIHN0YXR1cz0weCV4XG4iLAorCQkJCV9fZnVuY19fLCBpLCBpcnEsIHJlZ192YWwpOworCQkJaW93cml0ZTMyKEJJVChpKSwgJmNoaXAtPnJlZy0+aWNscik7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoY2hpcC0+aXJxX2Jhc2UgKyBpKTsKKwkJCXJldCA9IElSUV9IQU5ETEVEOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgdm9pZCBwY2hfZ3Bpb19hbGxvY19nZW5lcmljX2NoaXAoc3RydWN0IHBjaF9ncGlvICpjaGlwLAorCQkJCXVuc2lnbmVkIGludCBpcnFfc3RhcnQsIHVuc2lnbmVkIGludCBudW0pCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKKworCWdjID0gaXJxX2FsbG9jX2dlbmVyaWNfY2hpcCgicGNoX2dwaW8iLCAxLCBpcnFfc3RhcnQsIGNoaXAtPmJhc2UsCisJCQkJICAgIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwlnYy0+cHJpdmF0ZSA9IGNoaXA7CisJY3QgPSBnYy0+Y2hpcF90eXBlczsKKworCWN0LT5jaGlwLmlycV9tYXNrID0gcGNoX2lycV9tYXNrOworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBwY2hfaXJxX3VubWFzazsKKwljdC0+Y2hpcC5pcnFfc2V0X3R5cGUgPSBwY2hfaXJxX3R5cGU7CisKKwlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKG51bSksIElSUV9HQ19JTklUX01BU0tfQ0FDSEUsCisJCQkgICAgICAgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFLCAwKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcGNoX2dwaW9fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC0xNjcsNiArMzU2LDcgQEAKIHsKIAlzMzIgcmV0OwogCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcDsKKwlpbnQgaXJxX2Jhc2U7CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2hpcCA9PSBOVUxMKQpAQCAtMTkyLDYgKzM4MiwxMyBAQAogCQlnb3RvIGVycl9pb21hcDsKIAl9CiAKKwlpZiAocGRldi0+ZGV2aWNlID09IDB4ODgwMykKKwkJY2hpcC0+aW9oID0gSU5URUxfRUcyMFRfUENIOworCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSAweDgwMTQpCisJCWNoaXAtPmlvaCA9IE9LSVNFTUlfTUw3MjIzbV9JT0g7CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IDB4ODA0MykKKwkJY2hpcC0+aW9oID0gT0tJU0VNSV9NTDcyMjNuX0lPSDsKKwogCWNoaXAtPnJlZyA9IGNoaXAtPmJhc2U7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOwogCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOwpAQCAtMjAyLDggKzM5OSwzNiBAQAogCQlnb3RvIGVycl9ncGlvY2hpcF9hZGQ7CiAJfQogCisJaXJxX2Jhc2UgPSBpcnFfYWxsb2NfZGVzY3MoLTEsIDAsIGdwaW9fcGluc1tjaGlwLT5pb2hdLCBOVU1BX05PX05PREUpOworCWlmIChpcnFfYmFzZSA8IDApIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlBDSCBncGlvOiBGYWlsZWQgdG8gZ2V0IElSUSBiYXNlIG51bVxuIik7CisJCWNoaXAtPmlycV9iYXNlID0gLTE7CisJCWdvdG8gZW5kOworCX0KKwljaGlwLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBwY2hfZ3Bpb19oYW5kbGVyLAorCQkJICAgICBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIGNoaXApOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiJXMgcmVxdWVzdF9pcnEgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOworCX0KKworCXBjaF9ncGlvX2FsbG9jX2dlbmVyaWNfY2hpcChjaGlwLCBpcnFfYmFzZSwgZ3Bpb19waW5zW2NoaXAtPmlvaF0pOworCisJLyogSW5pdGlhbGl6ZSBpbnRlcnJ1cHQgaWVuIHJlZ2lzdGVyICovCisJaW93cml0ZTMyKDAsICZjaGlwLT5yZWctPmllbik7CitlbmQ6CiAJcmV0dXJuIDA7CiAKK2Vycl9yZXF1ZXN0X2lycToKKwlpcnFfZnJlZV9kZXNjcyhpcnFfYmFzZSwgZ3Bpb19waW5zW2NoaXAtPmlvaF0pOworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBncGlvY2hpcF9yZW1vdmUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKIGVycl9ncGlvY2hpcF9hZGQ6CiAJcGNpX2lvdW5tYXAocGRldiwgY2hpcC0+YmFzZSk7CiAKQEAgLTIyNCw2ICs0NDksMTIgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCWlmIChjaGlwLT5pcnFfYmFzZSAhPSAtMSkgeworCQlmcmVlX2lycShwZGV2LT5pcnEsIGNoaXApOworCisJCWlycV9mcmVlX2Rlc2NzKGNoaXAtPmlycV9iYXNlLCBncGlvX3BpbnNbY2hpcC0+aW9oXSk7CisJfQorCiAJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvKTsKIAlpZiAoZXJyKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgZ3Bpb2NoaXBfcmVtb3ZlXG4iKTsKQEAgLTIzOSw5ICs0NzAsMTEgQEAKIHsKIAlzMzIgcmV0OwogCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CiAJcGNoX2dwaW9fc2F2ZV9yZWdfY29uZihjaGlwKTsKLQlwY2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlpZiAocmV0KSB7CkBAIC0yNjEsNiArNDk0LDcgQEAKIHsKIAlzMzIgcmV0OwogCXN0cnVjdCBwY2hfZ3BpbyAqY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmV0ID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMCk7CiAKQEAgLTI3Miw5ICs1MDYsMTEgQEAKIAl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKIAlpb3dyaXRlMzIoMHgwMSwgJmNoaXAtPnJlZy0+cmVzZXQpOwogCWlvd3JpdGUzMigweDAwLCAmY2hpcC0+cmVnLT5yZXNldCk7CiAJcGNoX2dwaW9fcmVzdG9yZV9yZWdfY29uZihjaGlwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODcsNiArNTIzLDcgQEAKIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShwY2hfZ3Bpb19wY2lkZXZfaWQpID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDg4MDMpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUk9ITSwgMHg4MDE0KSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JPSE0sIDB4ODA0MykgfSwKIAl7IDAsIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNoX2dwaW9fcGNpZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsMDYxLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wbDA2MS5jCmluZGV4IDJjNWExOGYuLjA5M2M5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsMDYxLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYwpAQCAtMTE4LDcgKzExOCw3IEBACiB7CiAJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBwbDA2MV9ncGlvLCBnYyk7CiAKLQlpZiAoY2hpcC0+aXJxX2Jhc2UgPT0gKHVuc2lnbmVkKSAtMSkKKwlpZiAoY2hpcC0+aXJxX2Jhc2UgPT0gTk9fSVJRKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKQEAgLTI0Niw2ICsyNDYsMTggQEAKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXBkYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEpIHsKKwkJY2hpcC0+Z2MuYmFzZSA9IHBkYXRhLT5ncGlvX2Jhc2U7CisJCWNoaXAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOworCX0gZWxzZSBpZiAoZGV2LT5kZXYub2Zfbm9kZSkgeworCQljaGlwLT5nYy5iYXNlID0gLTE7CisJCWNoaXAtPmlycV9iYXNlID0gTk9fSVJROworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsCiAJCQkJcmVzb3VyY2Vfc2l6ZSgmZGV2LT5yZXMpLCAicGwwNjEiKSkgewogCQlyZXQgPSAtRUJVU1k7CkBAIC0yNjcsMTQgKzI3OSwxMSBAQAogCWNoaXAtPmdjLmdldCA9IHBsMDYxX2dldF92YWx1ZTsKIAljaGlwLT5nYy5zZXQgPSBwbDA2MV9zZXRfdmFsdWU7CiAJY2hpcC0+Z2MudG9faXJxID0gcGwwNjFfdG9faXJxOwotCWNoaXAtPmdjLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwogCWNoaXAtPmdjLm5ncGlvID0gUEwwNjFfR1BJT19OUjsKIAljaGlwLT5nYy5sYWJlbCA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJY2hpcC0+Z2MuZGV2ID0gJmRldi0+ZGV2OwogCWNoaXAtPmdjLm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQljaGlwLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKLQogCXJldCA9IGdwaW9jaGlwX2FkZCgmY2hpcC0+Z2MpOwogCWlmIChyZXQpCiAJCWdvdG8gaW91bm1hcDsKQEAgLTI4Myw3ICsyOTIsNyBAQAogCSAqIGlycV9jaGlwIHN1cHBvcnQKIAkgKi8KIAotCWlmIChjaGlwLT5pcnFfYmFzZSA9PSAodW5zaWduZWQpIC0xKQorCWlmIChjaGlwLT5pcnFfYmFzZSA9PSBOT19JUlEpCiAJCXJldHVybiAwOwogCiAJd3JpdGViKDAsIGNoaXAtPmJhc2UgKyBHUElPSUUpOyAvKiBkaXNhYmxlIGlycXMgKi8KQEAgLTMwNywxMSArMzE2LDEzIEBACiAJbGlzdF9hZGQoJmNoaXAtPmxpc3QsIGNoaXBfbGlzdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUEwwNjFfR1BJT19OUjsgaSsrKSB7Ci0JCWlmIChwZGF0YS0+ZGlyZWN0aW9ucyAmICgxIDw8IGkpKQotCQkJcGwwNjFfZGlyZWN0aW9uX291dHB1dCgmY2hpcC0+Z2MsIGksCi0JCQkJCXBkYXRhLT52YWx1ZXMgJiAoMSA8PCBpKSk7Ci0JCWVsc2UKLQkJCXBsMDYxX2RpcmVjdGlvbl9pbnB1dCgmY2hpcC0+Z2MsIGkpOworCQlpZiAocGRhdGEpIHsKKwkJCWlmIChwZGF0YS0+ZGlyZWN0aW9ucyAmICgxIDw8IGkpKQorCQkJCXBsMDYxX2RpcmVjdGlvbl9vdXRwdXQoJmNoaXAtPmdjLCBpLAorCQkJCQkJcGRhdGEtPnZhbHVlcyAmICgxIDw8IGkpKTsKKwkJCWVsc2UKKwkJCQlwbDA2MV9kaXJlY3Rpb25faW5wdXQoJmNoaXAtPmdjLCBpKTsKKwkJfQogCiAJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpICsgY2hpcC0+aXJxX2Jhc2UsICZwbDA2MV9pcnFjaGlwLAogCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tcGxhdC1zYW1zdW5nLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wbGF0LXNhbXN1bmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2N2YxOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wbGF0LXNhbXN1bmcuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCi0gKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KLSAqCi0gKiBTQU1TVU5HIC0gR1BJT2xpYiBzdXBwb3J0Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0KLSNpZm5kZWYgREVCVUdfR1BJTwotI2RlZmluZSBncGlvX2RiZyh4Li4uKSBkbyB7IH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBncGlvX2RiZyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyB4KQotI2VuZGlmCi0KLS8qIFRoZSBzYW1zdW5nX2dwaW9saWJfNGJpdCByb3V0aW5lcyBhcmUgdG8gY29udHJvbCB0aGUgZ3BpbyBiYW5rcyB3aGVyZQotICogdGhlIGdwaW8gY29uZmlndXJhdGlvbiByZWdpc3RlciAoR1B4Q09OKSBoYXMgNCBiaXRzIHBlciBHUElPLCBhcyB0aGUKLSAqIGZvbGxvd2luZyBleGFtcGxlOgotICoKLSAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCA0IGJpdHMgcGVyIGdwaW8KLSAqCQlncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQotICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgotICogYmFzZSArIDB4MDQ6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCi0gKgkJYml0IG46IGRhdGEgYml0IG4KLSAqCi0gKiBOb3RlLCBzaW5jZSB0aGUgZGF0YSByZWdpc3RlciBpcyBvbmUgYml0IHBlciBncGlvIGFuZCBpcyBhdCBiYXNlICsgMHg0Ci0gKiB3ZSBjYW4gdXNlIHMzY19ncGlvbGliX2dldCBhbmQgczNjX2dwaW9saWJfc2V0IHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YKLSAqIHRoZSBvdXRwdXQuCi0qLwotCi1zdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgczNjX2dwaW9fY2hpcCAqb3VyY2hpcCA9IHRvX3MzY19ncGlvKGNoaXApOwotCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBjb247Ci0KLQljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgR1BJT0NPTl9PRkYpOwotCWNvbiAmPSB+KDB4ZiA8PCBjb25fNGJpdF9zaGlmdChvZmZzZXQpKTsKLQlfX3Jhd193cml0ZWwoY29uLCBiYXNlICsgR1BJT0NPTl9PRkYpOwotCi0JZ3Bpb19kYmcoIiVzOiAlcDogQ09OIG5vdyAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYW1zdW5nX2dwaW9saWJfNGJpdF9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPQ09OX09GRik7Ci0JY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOwotCWNvbiB8PSAweDEgPDwgY29uXzRiaXRfc2hpZnQob2Zmc2V0KTsKLQotCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPREFUX09GRik7Ci0KLQlpZiAodmFsdWUpCi0JCWRhdCB8PSAxIDw8IG9mZnNldDsKLQllbHNlCi0JCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKLQotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7Ci0JX19yYXdfd3JpdGVsKGNvbiwgYmFzZSArIEdQSU9DT05fT0ZGKTsKLQlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOwotCi0JZ3Bpb19kYmcoIiVzOiAlcDogQ09OICUwOGx4LCBEQVQgJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24sIGRhdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhlIG5leHQgc2V0IG9mIHJvdXRpbmVzIGFyZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIEdQSU8gY29uZmlndXJhdGlvbgotICogcmVnaXN0ZXJzIGFyZSA0IGJpdHMgcGVyIEdQSU8gYnV0IHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXIgKHRoZQotICogYmFuayBoYXMgbW9yZSB0aGFuIDggR1BJT3MuCi0gKgotICogVGhpcyBjYXNlIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSA0IGJpdCBjYXNlLCBidXQgdGhlIHJlZ2lzdGVycyBhcmUgYXMKLSAqIGZvbGxvd3M6Ci0gKgotICogYmFzZSArIDB4MDA6IENvbnRyb2wgcmVnaXN0ZXIsIDQgYml0cyBwZXIgZ3BpbyAobG93ZXIgOCBHUElPcykKLSAqCQlncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQotICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgotICogYmFzZSArIDB4MDQ6IENvbnRyb2wgcmVnaXN0ZXIsIDQgYml0cyBwZXIgZ3BpbyAodXAgdG8gOCBhZGRpdGlvbnMgR1BJT3MpCi0gKgkJZ3BpbyBuOiA0IGJpdHMgc3RhcnRpbmcgYXQgKDQqbikKLSAqCQkwMDAwID0gaW5wdXQsIDAwMDEgPSBvdXRwdXQsIG90aGVycyBtZWFuIHNwZWNpYWwtZnVuY3Rpb24KLSAqIGJhc2UgKyAweDA4OiBEYXRhIHJlZ2lzdGVyLCAxIGJpdCBwZXIgZ3BpbwotICoJCWJpdCBuOiBkYXRhIGJpdCBuCi0gKgotICogVG8gYWxsb3cgdXMgdG8gdXNlIHRoZSBzM2NfZ3Bpb2xpYl9nZXQgYW5kIHMzY19ncGlvbGliX3NldCByb3V0aW5lcyB3ZQotICogc3RvcmUgdGhlICdiYXNlICsgMHg0JyBhZGRyZXNzIHNvIHRoYXQgdGhlc2Ugcm91dGluZXMgc2VlIHRoZSBkYXRhCi0gKiByZWdpc3RlciBhdCBvdXJjaGlwLT5iYXNlICsgMHgwNC4KLSAqLwotCi1zdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0Ml9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fczNjX2dwaW8oY2hpcCk7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKLQl2b2lkIF9faW9tZW0gKnJlZ2NvbiA9IGJhc2U7Ci0JdW5zaWduZWQgbG9uZyBjb247Ci0KLQlpZiAob2Zmc2V0ID4gNykKLQkJb2Zmc2V0IC09IDg7Ci0JZWxzZQotCQlyZWdjb24gLT0gNDsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKHJlZ2Nvbik7Ci0JY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOwotCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7Ci0KLQlncGlvX2RiZygiJXM6ICVwOiBDT04gJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXQyX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zM2NfZ3BpbyhjaGlwKTsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBvdXJjaGlwLT5iYXNlOwotCXZvaWQgX19pb21lbSAqcmVnY29uID0gYmFzZTsKLQl1bnNpZ25lZCBsb25nIGNvbjsKLQl1bnNpZ25lZCBsb25nIGRhdDsKLQl1bnNpZ25lZCBjb25fb2Zmc2V0ID0gb2Zmc2V0OwotCi0JaWYgKGNvbl9vZmZzZXQgPiA3KQotCQljb25fb2Zmc2V0IC09IDg7Ci0JZWxzZQotCQlyZWdjb24gLT0gNDsKLQotCWNvbiA9IF9fcmF3X3JlYWRsKHJlZ2Nvbik7Ci0JY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KGNvbl9vZmZzZXQpKTsKLQljb24gfD0gMHgxIDw8IGNvbl80Yml0X3NoaWZ0KGNvbl9vZmZzZXQpOwotCi0JZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIEdQSU9EQVRfT0ZGKTsKLQotCWlmICh2YWx1ZSkKLQkJZGF0IHw9IDEgPDwgb2Zmc2V0OwotCWVsc2UKLQkJZGF0ICY9IH4oMSA8PCBvZmZzZXQpOwotCi0JX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKLQlfX3Jhd193cml0ZWwoY29uLCByZWdjb24pOwotCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7Ci0KLQlncGlvX2RiZygiJXM6ICVwOiBDT04gJTA4bHgsIERBVCAlMDhseFxuIiwgX19mdW5jX18sIGJhc2UsIGNvbiwgZGF0KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXApCi17Ci0JY2hpcC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBzYW1zdW5nX2dwaW9saWJfNGJpdF9pbnB1dDsKLQljaGlwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzYW1zdW5nX2dwaW9saWJfNGJpdF9vdXRwdXQ7Ci0JY2hpcC0+cG0gPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzRiaXQpOwotfQotCi12b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwKQotewotCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc2Ftc3VuZ19ncGlvbGliXzRiaXQyX2lucHV0OwotCWNoaXAtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0Ml9vdXRwdXQ7Ci0JY2hpcC0+cG0gPSBfX2dwaW9fcG0oJnMzY19ncGlvX3BtXzRiaXQpOwotfQotCi12b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgIGludCBucl9jaGlwcykKLXsKLQlmb3IgKDsgbnJfY2hpcHMgPiAwOyBucl9jaGlwcy0tLCBjaGlwKyspIHsKLQkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0KGNoaXApOwotCQlzM2NfZ3Bpb2xpYl9hZGQoY2hpcCk7Ci0JfQotfQotCi12b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKHN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgICAgaW50IG5yX2NoaXBzKQotewotCWZvciAoOyBucl9jaGlwcyA+IDA7IG5yX2NoaXBzLS0sIGNoaXArKykgewotCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyKGNoaXApOwotCQlzM2NfZ3Bpb2xpYl9hZGQoY2hpcCk7Ci0JfQotfQotCi12b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzJiaXRfY2hpcHMoc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAsCi0JCQkJCSAgIGludCBucl9jaGlwcykKLXsKLQlmb3IgKDsgbnJfY2hpcHMgPiAwOyBucl9jaGlwcy0tLCBjaGlwKyspCi0JCXMzY19ncGlvbGliX2FkZChjaGlwKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXB4YS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcHhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxMzc3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1weGEuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9wbGF0LXB4YS9ncGlvLmMKKyAqCisgKiAgR2VuZXJpYyBQWEEgR1BJTyBoYW5kbGluZworICoKKyAqICBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqICBDcmVhdGVkOglKdW4gMTUsIDIwMDEKKyAqICBDb3B5cmlnaHQ6CU1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2dwaW8tcHhhLmg+CisKK2ludCBweGFfbGFzdF9ncGlvOworCitzdHJ1Y3QgcHhhX2dwaW9fY2hpcCB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXZvaWQgX19pb21lbQkqcmVnYmFzZTsKKwljaGFyIGxhYmVsWzEwXTsKKworCXVuc2lnbmVkIGxvbmcJaXJxX21hc2s7CisJdW5zaWduZWQgbG9uZwlpcnFfZWRnZV9yaXNlOworCXVuc2lnbmVkIGxvbmcJaXJxX2VkZ2VfZmFsbDsKKworI2lmZGVmIENPTkZJR19QTQorCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ3BscjsKKwl1bnNpZ25lZCBsb25nCXNhdmVkX2dwZHI7CisJdW5zaWduZWQgbG9uZwlzYXZlZF9ncmVyOworCXVuc2lnbmVkIGxvbmcJc2F2ZWRfZ2ZlcjsKKyNlbmRpZgorfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhncGlvX2xvY2spOworc3RhdGljIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpweGFfZ3Bpb19jaGlwczsKKworI2RlZmluZSBmb3JfZWFjaF9ncGlvX2NoaXAoaSwgYykJCQlcCisJZm9yIChpID0gMCwgYyA9ICZweGFfZ3Bpb19jaGlwc1swXTsgaSA8PSBweGFfbGFzdF9ncGlvOyBpICs9IDMyLCBjKyspCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpncGlvX2NoaXBfYmFzZShzdHJ1Y3QgZ3Bpb19jaGlwICpjKQoreworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IHB4YV9ncGlvX2NoaXAsIGNoaXApLT5yZWdiYXNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBweGFfZ3Bpb19jaGlwICpncGlvX3RvX3B4YWNoaXAodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gJnB4YV9ncGlvX2NoaXBzW2dwaW9fdG9fYmFuayhncGlvKV07Cit9CisKK3N0YXRpYyBpbnQgcHhhX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBncGlvX2NoaXBfYmFzZShjaGlwKTsKKwl1aW50MzJfdCB2YWx1ZSwgbWFzayA9IDEgPDwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwl2YWx1ZSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUERSX09GRlNFVCk7CisJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChjaGlwLT5iYXNlICsgb2Zmc2V0KSkKKwkJdmFsdWUgfD0gbWFzazsKKwllbHNlCisJCXZhbHVlICY9IH5tYXNrOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYmFzZSArIEdQRFJfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IGdwaW9fY2hpcF9iYXNlKGNoaXApOworCXVpbnQzMl90IHRtcCwgbWFzayA9IDEgPDwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3Jhd193cml0ZWwobWFzaywgYmFzZSArICh2YWx1ZSA/IEdQU1JfT0ZGU0VUIDogR1BDUl9PRkZTRVQpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCXRtcCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUERSX09GRlNFVCk7CisJaWYgKF9fZ3Bpb19pc19pbnZlcnRlZChjaGlwLT5iYXNlICsgb2Zmc2V0KSkKKwkJdG1wICY9IH5tYXNrOworCWVsc2UKKwkJdG1wIHw9IG1hc2s7CisJX19yYXdfd3JpdGVsKHRtcCwgYmFzZSArIEdQRFJfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGdwaW9fY2hpcF9iYXNlKGNoaXApICsgR1BMUl9PRkZTRVQpICYgKDEgPDwgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgcHhhX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCV9fcmF3X3dyaXRlbCgxIDw8IG9mZnNldCwgZ3Bpb19jaGlwX2Jhc2UoY2hpcCkgKworCQkJCSh2YWx1ZSA/IEdQU1JfT0ZGU0VUIDogR1BDUl9PRkZTRVQpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHhhX2luaXRfZ3Bpb19jaGlwKGludCBncGlvX2VuZCkKK3sKKwlpbnQgaSwgZ3BpbywgbmJhbmtzID0gZ3Bpb190b19iYW5rKGdwaW9fZW5kKSArIDE7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmNoaXBzOworCisJY2hpcHMgPSBremFsbG9jKG5iYW5rcyAqIHNpemVvZihzdHJ1Y3QgcHhhX2dwaW9fY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwcyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBHUElPIGNoaXBzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDAsIGdwaW8gPSAwOyBpIDwgbmJhbmtzOyBpKyssIGdwaW8gKz0gMzIpIHsKKwkJc3RydWN0IGdwaW9fY2hpcCAqYyA9ICZjaGlwc1tpXS5jaGlwOworCisJCXNwcmludGYoY2hpcHNbaV0ubGFiZWwsICJncGlvLSVkIiwgaSk7CisJCWNoaXBzW2ldLnJlZ2Jhc2UgPSBHUElPX0JBTksoaSk7CisKKwkJYy0+YmFzZSAgPSBncGlvOworCQljLT5sYWJlbCA9IGNoaXBzW2ldLmxhYmVsOworCisJCWMtPmRpcmVjdGlvbl9pbnB1dCAgPSBweGFfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJCWMtPmRpcmVjdGlvbl9vdXRwdXQgPSBweGFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCQljLT5nZXQgPSBweGFfZ3Bpb19nZXQ7CisJCWMtPnNldCA9IHB4YV9ncGlvX3NldDsKKworCQkvKiBudW1iZXIgb2YgR1BJT3Mgb24gbGFzdCBiYW5rIG1heSBiZSBsZXNzIHRoYW4gMzIgKi8KKwkJYy0+bmdwaW8gPSAoZ3BpbyArIDMxID4gZ3Bpb19lbmQpID8gKGdwaW9fZW5kIC0gZ3BpbyArIDEpIDogMzI7CisJCWdwaW9jaGlwX2FkZChjKTsKKwl9CisJcHhhX2dwaW9fY2hpcHMgPSBjaGlwczsKKwlyZXR1cm4gMDsKK30KKworLyogVXBkYXRlIG9ubHkgdGhvc2UgR1JFUnggYW5kIEdGRVJ4IGVkZ2UgZGV0ZWN0aW9uIHJlZ2lzdGVyIGJpdHMgaWYgdGhvc2UKKyAqIGJpdHMgYXJlIHNldCBpbiBjLT5pcnFfbWFzaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2VkZ2VfZGV0ZWN0KHN0cnVjdCBweGFfZ3Bpb19jaGlwICpjKQoreworCXVpbnQzMl90IGdyZXIsIGdmZXI7CisKKwlncmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKSAmIH5jLT5pcnFfbWFzazsKKwlnZmVyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKSAmIH5jLT5pcnFfbWFzazsKKwlncmVyIHw9IGMtPmlycV9lZGdlX3Jpc2UgJiBjLT5pcnFfbWFzazsKKwlnZmVyIHw9IGMtPmlycV9lZGdlX2ZhbGwgJiBjLT5pcnFfbWFzazsKKwlfX3Jhd193cml0ZWwoZ3JlciwgYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKKwlfX3Jhd193cml0ZWwoZ2ZlciwgYy0+cmVnYmFzZSArIEdGRVJfT0ZGU0VUKTsKK30KKworc3RhdGljIGludCBweGFfZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOworCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwl1bnNpZ25lZCBsb25nIGdwZHIsIG1hc2sgPSBHUElPX2JpdChncGlvKTsKKworCWMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CisKKwlpZiAodHlwZSA9PSBJUlFfVFlQRV9QUk9CRSkgeworCQkvKiBEb24ndCBtZXNzIHdpdGggZW5hYmxlZCBHUElPcyB1c2luZyBwcmVjb25maWd1cmVkIGVkZ2VzIG9yCisJCSAqIEdQSU9zIHNldCB0byBhbHRlcm5hdGUgZnVuY3Rpb24gb3IgdG8gb3V0cHV0IGR1cmluZyBwcm9iZQorCQkgKi8KKwkJaWYgKChjLT5pcnFfZWRnZV9yaXNlIHwgYy0+aXJxX2VkZ2VfZmFsbCkgJiBHUElPX2JpdChncGlvKSkKKwkJCXJldHVybiAwOworCisJCWlmIChfX2dwaW9faXNfb2NjdXBpZWQoZ3BpbykpCisJCQlyZXR1cm4gMDsKKworCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CisJfQorCisJZ3BkciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUERSX09GRlNFVCk7CisKKwlpZiAoX19ncGlvX2lzX2ludmVydGVkKGdwaW8pKQorCQlfX3Jhd193cml0ZWwoZ3BkciB8IG1hc2ssICBjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKGdwZHIgJiB+bWFzaywgYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKKworCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCisJCWMtPmlycV9lZGdlX3Jpc2UgfD0gbWFzazsKKwllbHNlCisJCWMtPmlycV9lZGdlX3Jpc2UgJj0gfm1hc2s7CisKKwlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykKKwkJYy0+aXJxX2VkZ2VfZmFsbCB8PSBtYXNrOworCWVsc2UKKwkJYy0+aXJxX2VkZ2VfZmFsbCAmPSB+bWFzazsKKworCXVwZGF0ZV9lZGdlX2RldGVjdChjKTsKKworCXByX2RlYnVnKCIlczogSVJRJWQgKEdQSU8lZCkgLSBlZGdlJXMlc1xuIiwgX19mdW5jX18sIGQtPmlycSwgZ3BpbywKKwkJKCh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpICA/ICIgcmlzaW5nIiAgOiAiIiksCisJCSgodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykgPyAiIGZhbGxpbmciIDogIiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhX2dwaW9fZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmM7CisJaW50IGxvb3AsIGdwaW8sIGdwaW9fYmFzZSwgbjsKKwl1bnNpZ25lZCBsb25nIGdlZHI7CisKKwlkbyB7CisJCWxvb3AgPSAwOworCQlmb3JfZWFjaF9ncGlvX2NoaXAoZ3BpbywgYykgeworCQkJZ3Bpb19iYXNlID0gYy0+Y2hpcC5iYXNlOworCisJCQlnZWRyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKKwkJCWdlZHIgPSBnZWRyICYgYy0+aXJxX21hc2s7CisJCQlfX3Jhd193cml0ZWwoZ2VkciwgYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKKworCQkJbiA9IGZpbmRfZmlyc3RfYml0KCZnZWRyLCBCSVRTX1BFUl9MT05HKTsKKwkJCXdoaWxlIChuIDwgQklUU19QRVJfTE9ORykgeworCQkJCWxvb3AgPSAxOworCisJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGdwaW9fdG9faXJxKGdwaW9fYmFzZSArIG4pKTsKKwkJCQluID0gZmluZF9uZXh0X2JpdCgmZ2VkciwgQklUU19QRVJfTE9ORywgbiArIDEpOworCQkJfQorCQl9CisJfSB3aGlsZSAobG9vcCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9hY2tfbXV4ZWRfZ3BpbyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50IGdwaW8gPSBpcnFfdG9fZ3BpbyhkLT5pcnEpOworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjID0gZ3Bpb190b19weGFjaGlwKGdwaW8pOworCisJX19yYXdfd3JpdGVsKEdQSU9fYml0KGdwaW8pLCBjLT5yZWdiYXNlICsgR0VEUl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBweGFfbWFza19tdXhlZF9ncGlvKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnQgZ3BpbyA9IGlycV90b19ncGlvKGQtPmlycSk7CisJc3RydWN0IHB4YV9ncGlvX2NoaXAgKmMgPSBncGlvX3RvX3B4YWNoaXAoZ3Bpbyk7CisJdWludDMyX3QgZ3JlciwgZ2ZlcjsKKworCWMtPmlycV9tYXNrICY9IH5HUElPX2JpdChncGlvKTsKKworCWdyZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpICYgfkdQSU9fYml0KGdwaW8pOworCWdmZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpICYgfkdQSU9fYml0KGdwaW8pOworCV9fcmF3X3dyaXRlbChncmVyLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOworCV9fcmF3X3dyaXRlbChnZmVyLCBjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBweGFfdW5tYXNrX211eGVkX2dwaW8oc3RydWN0IGlycV9kYXRhICpkKQoreworCWludCBncGlvID0gaXJxX3RvX2dwaW8oZC0+aXJxKTsKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYyA9IGdwaW9fdG9fcHhhY2hpcChncGlvKTsKKworCWMtPmlycV9tYXNrIHw9IEdQSU9fYml0KGdwaW8pOworCXVwZGF0ZV9lZGdlX2RldGVjdChjKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBweGFfbXV4ZWRfZ3Bpb19jaGlwID0geworCS5uYW1lCQk9ICJHUElPIiwKKwkuaXJxX2Fjawk9IHB4YV9hY2tfbXV4ZWRfZ3BpbywKKwkuaXJxX21hc2sJPSBweGFfbWFza19tdXhlZF9ncGlvLAorCS5pcnFfdW5tYXNrCT0gcHhhX3VubWFza19tdXhlZF9ncGlvLAorCS5pcnFfc2V0X3R5cGUJPSBweGFfZ3Bpb19pcnFfdHlwZSwKK307CisKK3ZvaWQgX19pbml0IHB4YV9pbml0X2dwaW8oaW50IG11eF9pcnEsIGludCBzdGFydCwgaW50IGVuZCwgc2V0X3dha2VfdCBmbikKK3sKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKKwlpbnQgZ3BpbywgaXJxOworCisJcHhhX2xhc3RfZ3BpbyA9IGVuZDsKKworCS8qIEluaXRpYWxpemUgR1BJTyBjaGlwcyAqLworCXB4YV9pbml0X2dwaW9fY2hpcChlbmQpOworCisJLyogY2xlYXIgYWxsIEdQSU8gZWRnZSBkZXRlY3RzICovCisJZm9yX2VhY2hfZ3Bpb19jaGlwKGdwaW8sIGMpIHsKKwkJX19yYXdfd3JpdGVsKDAsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7CisJCV9fcmF3X3dyaXRlbCgwLCBjLT5yZWdiYXNlICsgR1JFUl9PRkZTRVQpOworCQlfX3Jhd193cml0ZWwofjAsYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKKwl9CisKKwlmb3IgKGlycSAgPSBncGlvX3RvX2lycShzdGFydCk7IGlycSA8PSBncGlvX3RvX2lycShlbmQpOyBpcnErKykgeworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmcHhhX211eGVkX2dwaW9fY2hpcCwKKwkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJLyogSW5zdGFsbCBoYW5kbGVyIGZvciBHUElPPj0yIGVkZ2UgZGV0ZWN0IGludGVycnVwdHMgKi8KKwlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihtdXhfaXJxLCBweGFfZ3Bpb19kZW11eF9oYW5kbGVyKTsKKwlweGFfbXV4ZWRfZ3Bpb19jaGlwLmlycV9zZXRfd2FrZSA9IGZuOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YV9ncGlvX3N1c3BlbmQodm9pZCkKK3sKKwlzdHJ1Y3QgcHhhX2dwaW9fY2hpcCAqYzsKKwlpbnQgZ3BpbzsKKworCWZvcl9lYWNoX2dwaW9fY2hpcChncGlvLCBjKSB7CisJCWMtPnNhdmVkX2dwbHIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR1BMUl9PRkZTRVQpOworCQljLT5zYXZlZF9ncGRyID0gX19yYXdfcmVhZGwoYy0+cmVnYmFzZSArIEdQRFJfT0ZGU0VUKTsKKwkJYy0+c2F2ZWRfZ3JlciA9IF9fcmF3X3JlYWRsKGMtPnJlZ2Jhc2UgKyBHUkVSX09GRlNFVCk7CisJCWMtPnNhdmVkX2dmZXIgPSBfX3Jhd19yZWFkbChjLT5yZWdiYXNlICsgR0ZFUl9PRkZTRVQpOworCisJCS8qIENsZWFyIEdQSU8gdHJhbnNpdGlvbiBkZXRlY3QgYml0cyAqLworCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYy0+cmVnYmFzZSArIEdFRFJfT0ZGU0VUKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9ncGlvX3Jlc3VtZSh2b2lkKQoreworCXN0cnVjdCBweGFfZ3Bpb19jaGlwICpjOworCWludCBncGlvOworCisJZm9yX2VhY2hfZ3Bpb19jaGlwKGdwaW8sIGMpIHsKKwkJLyogcmVzdG9yZSBsZXZlbCB3aXRoIHNldC9jbGVhciAqLworCQlfX3Jhd193cml0ZWwoIGMtPnNhdmVkX2dwbHIsIGMtPnJlZ2Jhc2UgKyBHUFNSX09GRlNFVCk7CisJCV9fcmF3X3dyaXRlbCh+Yy0+c2F2ZWRfZ3BsciwgYy0+cmVnYmFzZSArIEdQQ1JfT0ZGU0VUKTsKKworCQlfX3Jhd193cml0ZWwoYy0+c2F2ZWRfZ3JlciwgYy0+cmVnYmFzZSArIEdSRVJfT0ZGU0VUKTsKKwkJX19yYXdfd3JpdGVsKGMtPnNhdmVkX2dmZXIsIGMtPnJlZ2Jhc2UgKyBHRkVSX09GRlNFVCk7CisJCV9fcmF3X3dyaXRlbChjLT5zYXZlZF9ncGRyLCBjLT5yZWdiYXNlICsgR1BEUl9PRkZTRVQpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIHB4YV9ncGlvX3N1c3BlbmQJTlVMTAorI2RlZmluZSBweGFfZ3Bpb19yZXN1bWUJCU5VTEwKKyNlbmRpZgorCitzdHJ1Y3Qgc3lzY29yZV9vcHMgcHhhX2dwaW9fc3lzY29yZV9vcHMgPSB7CisJLnN1c3BlbmQJPSBweGFfZ3Bpb19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX2dwaW9fcmVzdW1lLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cGMxMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cGMxMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4N2IwYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1zNXBjMTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIFM1UEMxMDAgLSBHUElPbGliIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCi0gKgotICogIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28KLSAqICBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgotCi0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0KLS8qIFM1UEMxMDAgR1BJTyBiYW5rIHN1bW1hcnk6Ci0gKgotICogQmFuawlHUElPcwlTdHlsZQlJTlQgVHlwZQotICogQTAJOAk0Qml0CUdQSU9fSU5UMAotICogQTEJNQk0Qml0CUdQSU9fSU5UMQotICogQgk4CTRCaXQJR1BJT19JTlQyCi0gKiBDCTUJNEJpdAlHUElPX0lOVDMKLSAqIEQJNwk0Qml0CUdQSU9fSU5UNAotICogRTAJOAk0Qml0CUdQSU9fSU5UNQotICogRTEJNgk0Qml0CUdQSU9fSU5UNgotICogRjAJOAk0Qml0CUdQSU9fSU5UNwotICogRjEJOAk0Qml0CUdQSU9fSU5UOAotICogRjIJOAk0Qml0CUdQSU9fSU5UOQotICogRjMJNAk0Qml0CUdQSU9fSU5UMTAKLSAqIEcwCTgJNEJpdAlHUElPX0lOVDExCi0gKiBHMQkzCTRCaXQJR1BJT19JTlQxMgotICogRzIJNwk0Qml0CUdQSU9fSU5UMTMKLSAqIEczCTcJNEJpdAlHUElPX0lOVDE0Ci0gKiBIMAk4CTRCaXQJV0tVUF9JTlQKLSAqIEgxCTgJNEJpdAlXS1VQX0lOVAotICogSDIJOAk0Qml0CVdLVVBfSU5UCi0gKiBIMwk4CTRCaXQJV0tVUF9JTlQKLSAqIEkJOAk0Qml0CUdQSU9fSU5UMTUKLSAqIEowCTgJNEJpdAlHUElPX0lOVDE2Ci0gKiBKMQk1CTRCaXQJR1BJT19JTlQxNwotICogSjIJOAk0Qml0CUdQSU9fSU5UMTgKLSAqIEozCTgJNEJpdAlHUElPX0lOVDE5Ci0gKiBKNAk0CTRCaXQJR1BJT19JTlQyMAotICogSzAJOAk0Qml0CU5vbmUKLSAqIEsxCTYJNEJpdAlOb25lCi0gKiBLMgk4CTRCaXQJTm9uZQotICogSzMJOAk0Qml0CU5vbmUKLSAqIEwwCTgJNEJpdAlOb25lCi0gKiBMMQk4CTRCaXQJTm9uZQotICogTDIJOAk0Qml0CU5vbmUKLSAqIEwzCTgJNEJpdAlOb25lCi0gKi8KLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmcgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmdfZWludCA9IHsKLQkuY2ZnX2VpbnQJPSAweGYsCi0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmdfbm9pbnQgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotLyoKLSAqIEdQSU8gYmFuaydzIGJhc2UgYWRkcmVzcyBnaXZlbiB0aGUgaW5kZXggb2YgdGhlIGJhbmsgaW4gdGhlCi0gKiBsaXN0IG9mIGFsbCBncGlvIGJhbmtzLgotICovCi0jZGVmaW5lIFM1UEMxMDBfQkFOS19CQVNFKGJhbmtfbnIpCShTNVBfVkFfR1BJTyArICgoYmFua19ucikgKiAweDIwKSkKLQotLyoKLSAqIEZvbGxvd2luZyBhcmUgdGhlIGdwaW8gYmFua3MgaW4gUzVQQzEwMC4KLSAqCi0gKiBUaGUgJ2NvbmZpZycgbWVtYmVyIHdoZW4gbGVmdCB0byBOVUxMLCBpcyBpbml0aWFsaXplZCB0byB0aGUgZGVmYXVsdAotICogc3RydWN0dXJlIGdwaW9fY2ZnIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgotICoKLSAqIFRoZSAnYmFzZScgbWVtYmVyIGlzIGFsc28gaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCi0gKiBOb3RlOiBUaGUgaW5pdGlhbGl6YXRpb24gb2YgJ2Jhc2UnIG1lbWJlciBvZiBzM2NfZ3Bpb19jaGlwIHN0cnVjdHVyZQotICogdXNlcyB0aGUgYWJvdmUgbWFjcm8gYW5kIGRlcGVuZHMgb24gdGhlIGJhbmtzIGJlaW5nIGxpc3RlZCBpbiBvcmRlciBoZXJlLgotICovCi1zdGF0aWMgc3RydWN0IHMzY19ncGlvX2NoaXAgczVwYzEwMF9ncGlvX2NoaXBzW10gPSB7Ci0JewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEEwKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0EwX05SLAotCQkJLmxhYmVsCT0gIkdQQTAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BBMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19BMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEExIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQQigwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19CX05SLAotCQkJLmxhYmVsCT0gIkdQQiIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEMoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fQ19OUiwKLQkJCS5sYWJlbAk9ICJHUEMiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BEKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0RfTlIsCi0JCQkubGFiZWwJPSAiR1BEIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRTAoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRTBfTlIsCi0JCQkubGFiZWwJPSAiR1BFMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEUxKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0UxX05SLAotCQkJLmxhYmVsCT0gIkdQRTEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BGMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19GMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEYwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRjEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRjFfTlIsCi0JCQkubGFiZWwJPSAiR1BGMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEYyKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YyX05SLAotCQkJLmxhYmVsCT0gIkdQRjIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BGMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19GM19OUiwKLQkJCS5sYWJlbAk9ICJHUEYzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRzAoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRzBfTlIsCi0JCQkubGFiZWwJPSAiR1BHMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEcxKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0cxX05SLAotCQkJLmxhYmVsCT0gIkdQRzEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BHMigwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEcyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQRzMoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRzNfTlIsCi0JCQkubGFiZWwJPSAiR1BHMyIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEkoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSV9OUiwKLQkJCS5sYWJlbAk9ICJHUEkiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BKMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEowIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjFfTlIsCi0JCQkubGFiZWwJPSAiR1BKMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEoyKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0oyX05SLAotCQkJLmxhYmVsCT0gIkdQSjIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BKMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KM19OUiwKLQkJCS5sYWJlbAk9ICJHUEozIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjQoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjRfTlIsCi0JCQkubGFiZWwJPSAiR1BKNCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEswKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0swX05SLAotCQkJLmxhYmVsCT0gIkdQSzAiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BLMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19LMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEsxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzIoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzJfTlIsCi0JCQkubGFiZWwJPSAiR1BLMiIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEszKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0szX05SLAotCQkJLmxhYmVsCT0gIkdQSzMiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BMMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEwwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDFfTlIsCi0JCQkubGFiZWwJPSAiR1BMMSIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEwyKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wyX05SLAotCQkJLmxhYmVsCT0gIkdQTDIiLAotCQl9LAotCX0sIHsKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BMMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MM19OUiwKLQkJCS5sYWJlbAk9ICJHUEwzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDQoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDRfTlIsCi0JCQkubGFiZWwJPSAiR1BMNCIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzAwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19laW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BIMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19IMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEgwIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMyMCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfZWludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoOCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBDMTAwX0dQSDEoMCksCi0JCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSDFfTlIsCi0JCQkubGFiZWwJPSAiR1BIMSIsCi0JCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDNDApLAotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX2VpbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDE2KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UEMxMDBfR1BIMigwKSwKLQkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19IMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEgyIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEM2MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfZWludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMjQpLAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQQzEwMF9HUEgzKDApLAotCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gzX05SLAotCQkJLmxhYmVsCT0gIkdQSDMiLAotCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IHM1cGMxMDBfZ3Bpb2xpYl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHMzY19ncGlvX2NoaXAgKmNoaXAgPSBzNXBjMTAwX2dwaW9fY2hpcHM7Ci0JaW50IG5yX2NoaXBzID0gQVJSQVlfU0laRShzNXBjMTAwX2dwaW9fY2hpcHMpOwotCWludCBncGlvaW50X2dyb3VwID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKLQkJaWYgKGNoaXAtPmNvbmZpZyA9PSBOVUxMKSB7Ci0JCQljaGlwLT5jb25maWcgPSAmZ3Bpb19jZmc7Ci0JCQljaGlwLT5ncm91cCA9IGdwaW9pbnRfZ3JvdXArKzsKLQkJfQotCQlpZiAoY2hpcC0+YmFzZSA9PSBOVUxMKQotCQkJY2hpcC0+YmFzZSA9IFM1UEMxMDBfQkFOS19CQVNFKGkpOwotCX0KLQotCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhzNXBjMTAwX2dwaW9fY2hpcHMsIG5yX2NoaXBzKTsKLQlzNXBfcmVnaXN0ZXJfZ3Bpb2ludF9iYW5rKElSUV9HUElPSU5ULCAwLCBTNVBfR1BJT0lOVF9HUk9VUF9NQVhOUik7Ci0KLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoczVwYzEwMF9ncGlvbGliX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tczVwdjIxMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tczVwdjIxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjEyZjE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXM1cHYyMTAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogUzVQVjIxMCAtIEdQSU9saWIgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNvcmUuaD4KLSNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+Ci0jaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy1oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tYXAuaD4KLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmcgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfZ3Bpb19jZmcgZ3Bpb19jZmdfbm9pbnQgPSB7Ci0JLnNldF9jb25maWcJPSBzM2NfZ3Bpb19zZXRjZmdfczNjNjR4eF80Yml0LAotCS5zZXRfcHVsbAk9IHMzY19ncGlvX3NldHB1bGxfdXBkb3duLAotCS5nZXRfcHVsbAk9IHMzY19ncGlvX2dldHB1bGxfdXBkb3duLAotfTsKLQotLyogR1BJTyBiYW5rJ3MgYmFzZSBhZGRyZXNzIGdpdmVuIHRoZSBpbmRleCBvZiB0aGUgYmFuayBpbiB0aGUKLSAqIGxpc3Qgb2YgYWxsIGdwaW8gYmFua3MuCi0gKi8KLSNkZWZpbmUgUzVQVjIxMF9CQU5LX0JBU0UoYmFua19ucikJKFM1UF9WQV9HUElPICsgKChiYW5rX25yKSAqIDB4MjApKQotCi0vKgotICogRm9sbG93aW5nIGFyZSB0aGUgZ3BpbyBiYW5rcyBpbiB2MjEwLgotICoKLSAqIFRoZSAnY29uZmlnJyBtZW1iZXIgd2hlbiBsZWZ0IHRvIE5VTEwsIGlzIGluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0Ci0gKiBzdHJ1Y3R1cmUgZ3Bpb19jZmcgaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCi0gKgotICogVGhlICdiYXNlJyBtZW1iZXIgaXMgYWxzbyBpbml0aWFsaXplZCBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KLSAqIE5vdGU6IFRoZSBpbml0aWFsaXphdGlvbiBvZiAnYmFzZScgbWVtYmVyIG9mIHMzY19ncGlvX2NoaXAgc3RydWN0dXJlCi0gKiB1c2VzIHRoZSBhYm92ZSBtYWNybyBhbmQgZGVwZW5kcyBvbiB0aGUgYmFua3MgYmVpbmcgbGlzdGVkIGluIG9yZGVyIGhlcmUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBzNXB2MjEwX2dwaW9fNGJpdFtdID0gewotCXsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BBMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19BMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEEwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQQTEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fQTFfTlIsCi0JCQkubGFiZWwJPSAiR1BBMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEIoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fQl9OUiwKLQkJCS5sYWJlbAk9ICJHUEIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BDMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19DMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEMwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQQzEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fQzFfTlIsCi0JCQkubGFiZWwJPSAiR1BDMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEQwKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0QwX05SLAotCQkJLmxhYmVsCT0gIkdQRDAiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BEMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19EMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEQxIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRTAoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRTBfTlIsCi0JCQkubGFiZWwJPSAiR1BFMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEUxKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0UxX05SLAotCQkJLmxhYmVsCT0gIkdQRTEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BGMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19GMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEYwIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRjEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRjFfTlIsCi0JCQkubGFiZWwJPSAiR1BGMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEYyKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YyX05SLAotCQkJLmxhYmVsCT0gIkdQRjIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BGMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19GM19OUiwKLQkJCS5sYWJlbAk9ICJHUEYzIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRzAoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRzBfTlIsCi0JCQkubGFiZWwJPSAiR1BHMCIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEcxKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0cxX05SLAotCQkJLmxhYmVsCT0gIkdQRzEiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BHMigwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEcyIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQRzMoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRzNfTlIsCi0JCQkubGFiZWwJPSAiR1BHMyIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEkoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSV9OUiwKLQkJCS5sYWJlbAk9ICJHUEkiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BKMCgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KMF9OUiwKLQkJCS5sYWJlbAk9ICJHUEowIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjEoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjFfTlIsCi0JCQkubGFiZWwJPSAiR1BKMSIsCi0JCX0sCi0JfSwgewotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9HUEoyKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0oyX05SLAotCQkJLmxhYmVsCT0gIkdQSjIiLAotCQl9LAotCX0sIHsKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BKMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KM19OUiwKLQkJCS5sYWJlbAk9ICJHUEozIiwKLQkJfSwKLQl9LCB7Ci0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjQoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjRfTlIsCi0JCQkubGFiZWwJPSAiR1BKNCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9NUDAxKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX01QMDFfTlIsCi0JCQkubGFiZWwJPSAiTVAwMSIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9NUDAyKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX01QMDJfTlIsCi0JCQkubGFiZWwJPSAiTVAwMiIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9NUDAzKDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX01QMDNfTlIsCi0JCQkubGFiZWwJPSAiTVAwMyIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9NUDA0KDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX01QMDRfTlIsCi0JCQkubGFiZWwJPSAiTVAwNCIsCi0JCX0sCi0JfSwgewotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuY2hpcAk9IHsKLQkJCS5iYXNlCT0gUzVQVjIxMF9NUDA1KDApLAotCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX01QMDVfTlIsCi0JCQkubGFiZWwJPSAiTVAwNSIsCi0JCX0sCi0JfSwgewotCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzAwKSwKLQkJLmNvbmZpZwk9ICZncGlvX2NmZ19ub2ludCwKLQkJLmlycV9iYXNlID0gSVJRX0VJTlQoMCksCi0JCS5jaGlwCT0gewotCQkJLmJhc2UJPSBTNVBWMjEwX0dQSDAoMCksCi0JCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSDBfTlIsCi0JCQkubGFiZWwJPSAiR1BIMCIsCi0JCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKLQkJfSwKLQl9LCB7Ci0JCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDMjApLAotCQkuY29uZmlnCT0gJmdwaW9fY2ZnX25vaW50LAotCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCg4KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BIMSgwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19IMV9OUiwKLQkJCS5sYWJlbAk9ICJHUEgxIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEM0MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDE2KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BIMigwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19IMl9OUiwKLQkJCS5sYWJlbAk9ICJHUEgyIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sIHsKLQkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEM2MCksCi0JCS5jb25maWcJPSAmZ3Bpb19jZmdfbm9pbnQsCi0JCS5pcnFfYmFzZSA9IElSUV9FSU5UKDI0KSwKLQkJLmNoaXAJPSB7Ci0JCQkuYmFzZQk9IFM1UFYyMTBfR1BIMygwKSwKLQkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19IM19OUiwKLQkJCS5sYWJlbAk9ICJHUEgzIiwKLQkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgX19pbml0IGludCBzNXB2MjEwX2dwaW9saWJfaW5pdCh2b2lkKQotewotCXN0cnVjdCBzM2NfZ3Bpb19jaGlwICpjaGlwID0gczVwdjIxMF9ncGlvXzRiaXQ7Ci0JaW50IG5yX2NoaXBzID0gQVJSQVlfU0laRShzNXB2MjEwX2dwaW9fNGJpdCk7Ci0JaW50IGdwaW9pbnRfZ3JvdXAgPSAwOwotCWludCBpID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKLQkJaWYgKGNoaXAtPmNvbmZpZyA9PSBOVUxMKSB7Ci0JCQljaGlwLT5jb25maWcgPSAmZ3Bpb19jZmc7Ci0JCQljaGlwLT5ncm91cCA9IGdwaW9pbnRfZ3JvdXArKzsKLQkJfQotCQlpZiAoY2hpcC0+YmFzZSA9PSBOVUxMKQotCQkJY2hpcC0+YmFzZSA9IFM1UFYyMTBfQkFOS19CQVNFKGkpOwotCX0KLQotCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhzNXB2MjEwX2dwaW9fNGJpdCwgbnJfY2hpcHMpOwotCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9JTlQsIDAsIFM1UF9HUElPSU5UX0dST1VQX01BWE5SKTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChzNXB2MjEwX2dwaW9saWJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zYTExMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzFmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zYTExMDAuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ3Bpby5jCisgKgorICogR2VuZXJpYyBTQS0xMTAwIEdQSU8gaGFuZGxpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIGludCBzYTExMDBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBHUExSICYgR1BJT19HUElPKG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTEwMF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUpCisJCUdQU1IgPSBHUElPX0dQSU8ob2Zmc2V0KTsKKwllbHNlCisJCUdQQ1IgPSBHUElPX0dQSU8ob2Zmc2V0KTsKK30KKworc3RhdGljIGludCBzYTExMDBfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCUdQRFIgJj0gfkdQSU9fR1BJTyhvZmZzZXQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYTExMDBfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNhMTEwMF9ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlHUERSIHw9IEdQSU9fR1BJTyhvZmZzZXQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc2ExMTAwX2dwaW9fY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJncGlvIiwKKwkuZGlyZWN0aW9uX2lucHV0CT0gc2ExMTAwX2RpcmVjdGlvbl9pbnB1dCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHNhMTEwMF9kaXJlY3Rpb25fb3V0cHV0LAorCS5zZXQJCQk9IHNhMTEwMF9ncGlvX3NldCwKKwkuZ2V0CQkJPSBzYTExMDBfZ3Bpb19nZXQsCisJLmJhc2UJCQk9IDAsCisJLm5ncGlvCQkJPSBHUElPX01BWCArIDEsCit9OworCit2b2lkIF9faW5pdCBzYTExMDBfaW5pdF9ncGlvKHZvaWQpCit7CisJZ3Bpb2NoaXBfYWRkKCZzYTExMDBfZ3Bpb19jaGlwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNhbXN1bmcuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhbXN1bmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjYyNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc2Ftc3VuZy5jCkBAIC0wLDAgKzEsMjcxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgorICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCisgKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCisgKiBTQU1TVU5HIC0gR1BJT2xpYiBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSA8cGxhdC9jcHUuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY29yZS5oPgorI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLWhlbHBlcnMuaD4KKyNpbmNsdWRlIDxwbGF0L2dwaW8tZm5zLmg+CisjaW5jbHVkZSA8cGxhdC9wbS5oPgorCisjaWZuZGVmIERFQlVHX0dQSU8KKyNkZWZpbmUgZ3Bpb19kYmcoeC4uLikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZ3Bpb19kYmcoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKKyNlbmRpZgorCitpbnQgc2Ftc3VuZ19ncGlvX3NldHB1bGxfdXBkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBpbnQgb2ZmLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpCit7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBjaGlwLT5iYXNlICsgMHgwODsKKwlpbnQgc2hpZnQgPSBvZmYgKiAyOworCXUzMiBwdXA7CisKKwlwdXAgPSBfX3Jhd19yZWFkbChyZWcpOworCXB1cCAmPSB+KDMgPDwgc2hpZnQpOworCXB1cCB8PSBwdWxsIDw8IHNoaWZ0OworCV9fcmF3X3dyaXRlbChwdXAsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc2Ftc3VuZ19ncGlvX3B1bGxfdCBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJdW5zaWduZWQgaW50IG9mZikKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OworCWludCBzaGlmdCA9IG9mZiAqIDI7CisJdTMyIHB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7CisKKwlwdXAgPj49IHNoaWZ0OworCXB1cCAmPSAweDM7CisKKwlyZXR1cm4gKF9fZm9yY2Ugc2Ftc3VuZ19ncGlvX3B1bGxfdClwdXA7Cit9CisKK2ludCBzM2MyNDQzX2dwaW9fc2V0cHVsbChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkgdW5zaWduZWQgaW50IG9mZiwgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQoreworCXN3aXRjaCAocHVsbCkgeworCWNhc2UgUzNDX0dQSU9fUFVMTF9OT05FOgorCQlwdWxsID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBTM0NfR1BJT19QVUxMX1VQOgorCQlwdWxsID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBTM0NfR1BJT19QVUxMX0RPV046CisJCXB1bGwgPSAweDAyOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3VwZG93bihjaGlwLCBvZmYsIHB1bGwpOworfQorCitzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0NDNfZ3Bpb19nZXRwdWxsKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmYpCit7CisJc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsOworCisJcHVsbCA9IHNhbXN1bmdfZ3Bpb19nZXRwdWxsX3VwZG93bihjaGlwLCBvZmYpOworCisJc3dpdGNoIChwdWxsKSB7CisJY2FzZSAweDAwOgorCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9VUDsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCWNhc2UgMHgwMzoKKwkJcHVsbCA9IFMzQ19HUElPX1BVTExfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9ET1dOOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcHVsbDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X2dwaW9fc2V0cHVsbF8xKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCwKKwkJCQkgIHNhbXN1bmdfZ3Bpb19wdWxsX3QgdXBkb3duKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZSArIDB4MDg7CisJdTMyIHB1cCA9IF9fcmF3X3JlYWRsKHJlZyk7CisKKwlpZiAocHVsbCA9PSB1cGRvd24pCisJCXB1cCAmPSB+KDEgPDwgb2ZmKTsKKwllbHNlIGlmIChwdWxsID09IFMzQ19HUElPX1BVTExfTk9ORSkKKwkJcHVwIHw9ICgxIDw8IG9mZik7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCV9fcmF3X3dyaXRlbChwdXAsIHJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzEoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgb2ZmLAorCQkJCQkJICBzYW1zdW5nX2dwaW9fcHVsbF90IHVwZG93bikKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2UgKyAweDA4OworCXUzMiBwdXAgPSBfX3Jhd19yZWFkbChyZWcpOworCisJcHVwICY9ICgxIDw8IG9mZik7CisJcmV0dXJuIHB1cCA/IFMzQ19HUElPX1BVTExfTk9ORSA6IHVwZG93bjsKK30KKworc2Ftc3VuZ19ncGlvX3B1bGxfdCBzM2MyNHh4X2dwaW9fZ2V0cHVsbF8xdXAoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisJcmV0dXJuIHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzEoY2hpcCwgb2ZmLCBTM0NfR1BJT19QVUxMX1VQKTsKK30KKworaW50IHMzYzI0eHhfZ3Bpb19zZXRwdWxsXzF1cChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkgICAgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlyZXR1cm4gczNjMjR4eF9ncGlvX3NldHB1bGxfMShjaGlwLCBvZmYsIHB1bGwsIFMzQ19HUElPX1BVTExfVVApOworfQorCitzYW1zdW5nX2dwaW9fcHVsbF90IHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzFkb3duKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisJcmV0dXJuIHMzYzI0eHhfZ3Bpb19nZXRwdWxsXzEoY2hpcCwgb2ZmLCBTM0NfR1BJT19QVUxMX0RPV04pOworfQorCitpbnQgczNjMjR4eF9ncGlvX3NldHB1bGxfMWRvd24oc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlyZXR1cm4gczNjMjR4eF9ncGlvX3NldHB1bGxfMShjaGlwLCBvZmYsIHB1bGwsIFMzQ19HUElPX1BVTExfRE9XTik7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zNF9ncGlvX3NldHB1bGwoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCXVuc2lnbmVkIGludCBvZmYsIHNhbXN1bmdfZ3Bpb19wdWxsX3QgcHVsbCkKK3sKKwlpZiAocHVsbCA9PSBTM0NfR1BJT19QVUxMX1VQKQorCQlwdWxsID0gMzsKKworCXJldHVybiBzYW1zdW5nX2dwaW9fc2V0cHVsbF91cGRvd24oY2hpcCwgb2ZmLCBwdWxsKTsKK30KKworc3RhdGljIHNhbXN1bmdfZ3Bpb19wdWxsX3QgZXh5bm9zNF9ncGlvX2dldHB1bGwoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJdW5zaWduZWQgaW50IG9mZikKK3sKKwlzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGw7CisKKwlwdWxsID0gc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duKGNoaXAsIG9mZik7CisKKwlpZiAocHVsbCA9PSAzKQorCQlwdWxsID0gUzNDX0dQSU9fUFVMTF9VUDsKKworCXJldHVybiBwdWxsOworfQorCisvKgorICogc2Ftc3VuZ19ncGlvX3NldGNmZ18yYml0IC0gU2Ftc3VuZyAyYml0IHN0eWxlIEdQSU8gY29uZmlndXJhdGlvbi4KKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KKyAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCisgKgorICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyCisgKiBoYXMgdHdvIGJpdHMgb2YgY29uZmlndXJhdGlvbiBwZXIgZ3Bpbywgd2hpY2ggaGF2ZSB0aGUgZm9sbG93aW5nCisgKiBmdW5jdGlvbnM6CisgKgkwMCA9IGlucHV0CisgKgkwMSA9IG91dHB1dAorICoJMXggPSBzcGVjaWFsIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIGludCBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgY2ZnKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBvZmYgKiAyOworCXUzMiBjb247CisKKwlpZiAoc2Ftc3VuZ19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKwkJaWYgKGNmZyA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljZmcgPDw9IHNoaWZ0OworCX0KKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZyk7CisJY29uICY9IH4oMHgzIDw8IHNoaWZ0KTsKKwljb24gfD0gY2ZnOworCV9fcmF3X3dyaXRlbChjb24sIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNhbXN1bmdfZ3Bpb19nZXRjZmdfMmJpdCAtIFNhbXN1bmcgMmJpdCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24gcmVhZC4KKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KKyAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCisgKgorICogVGhlIHJldmVyc2Ugb2Ygc2Ftc3VuZ19ncGlvX3NldGNmZ18yYml0KCkuIFdpbGwgcmV0dXJuIGEgdmFsdWUgd2hpY2cKKyAqIGNvdWxkIGJlIGRpcmVjdGx5IHBhc3NlZCBiYWNrIHRvIHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdCgpLCBmcm9tIHRoZQorICogUzNDX0dQSU9fU1BFQ0lBTCgpIG1hY3JvLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0KHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKQoreworCXUzMiBjb247CisKKwljb24gPSBfX3Jhd19yZWFkbChjaGlwLT5iYXNlKTsKKwljb24gPj49IG9mZiAqIDI7CisJY29uICY9IDM7CisKKwkvKiB0aGlzIGNvbnZlcnNpb24gd29ya3MgZm9yIElOIGFuZCBPVVQgYXMgd2VsbCBhcyBzcGVjaWFsIG1vZGUgKi8KKwlyZXR1cm4gUzNDX0dQSU9fU1BFQ0lBTChjb24pOworfQorCisvKgorICogc2Ftc3VuZ19ncGlvX3NldGNmZ180Yml0IC0gU2Ftc3VuZyA0Yml0IHNpbmdsZSByZWdpc3RlciBHUElPIGNvbmZpZy4KKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KKyAqIEBvZmY6IFRoZSBvZmZzZXQgZm9yIHRoZSBHUElPIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAY2ZnOiBUaGUgY29uZmlndXJhdGlvbiB2YWx1ZSB0byBzZXQuCisgKgorICogVGhpcyBoZWxwZXIgZGVhbCB3aXRoIHRoZSBHUElPIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyA0IGJpdHMKKyAqIG9mIGNvbnRyb2wgcGVyIEdQSU8sIGdlbmVyYWxseSBpbiB0aGUgZm9ybSBvZjoKKyAqCTAwMDAgPSBJbnB1dAorICoJMDAwMSA9IE91dHB1dAorICoJb3RoZXJzID0gU3BlY2lhbCBmdW5jdGlvbnMgKGRlcGVuZGVudCBvbiBiYW5rKQorICoKKyAqIE5vdGUsIHNpbmNlIHRoZSBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgdHdvIGNvbnRyb2wKKyAqIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIG9uZSwgd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSBzZXQgb2YgZnVuY3Rpb25zIGZvcgorICogZWFjaCBjYXNlLgorICovCisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvX3NldGNmZ180Yml0KHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2U7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gKG9mZiAmIDcpICogNDsKKwl1MzIgY29uOworCisJaWYgKG9mZiA8IDggJiYgY2hpcC0+Y2hpcC5uZ3BpbyA+IDgpCisJCXJlZyAtPSA0OworCisJaWYgKHNhbXN1bmdfZ3Bpb19pc19jZmdfc3BlY2lhbChjZmcpKSB7CisJCWNmZyAmPSAweGY7CisJCWNmZyA8PD0gc2hpZnQ7CisJfQorCisJY29uID0gX19yYXdfcmVhZGwocmVnKTsKKwljb24gJj0gfigweGYgPDwgc2hpZnQpOworCWNvbiB8PSBjZmc7CisJX19yYXdfd3JpdGVsKGNvbiwgcmVnKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2Ftc3VuZ19ncGlvX2dldGNmZ180Yml0IC0gU2Ftc3VuZyA0Yml0IHNpbmdsZSByZWdpc3RlciBHUElPIGNvbmZpZyByZWFkLgorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqCisgKiBUaGUgcmV2ZXJzZSBvZiBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzRiaXQoKSwgdHVybmluZyBhIGdwaW8gY29uZmlndXJhdGlvbgorICogcmVnaXN0ZXIgc2V0dGluZyBpbnRvIGEgdmFsdWUgdGhlIHNvZnR3YXJlIGNhbiB1c2UsIHN1Y2ggYXMgY291bGQgYmUgcGFzc2VkCisgKiB0byBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzRiaXQoKS4KKyAqCisgKiBAc2Egc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0CisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNhbXN1bmdfZ3Bpb19nZXRjZmdfNGJpdChzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAsCisJCQkJCSB1bnNpZ25lZCBpbnQgb2ZmKQoreworCXZvaWQgX19pb21lbSAqcmVnID0gY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSAob2ZmICYgNykgKiA0OworCXUzMiBjb247CisKKwlpZiAob2ZmIDwgOCAmJiBjaGlwLT5jaGlwLm5ncGlvID4gOCkKKwkJcmVnIC09IDQ7CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiA+Pj0gc2hpZnQ7CisJY29uICY9IDB4ZjsKKworCS8qIHRoaXMgY29udmVyc2lvbiB3b3JrcyBmb3IgSU4gYW5kIE9VVCBhcyB3ZWxsIGFzIHNwZWNpYWwgbW9kZSAqLworCXJldHVybiBTM0NfR1BJT19TUEVDSUFMKGNvbik7Cit9CisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCisvKgorICogczNjMjR4eF9ncGlvX3NldGNmZ19hYmFuayAtIFMzQzI0WFggc3R5bGUgR1BJTyBjb25maWd1cmF0aW9uIChCYW5rIEEpCisgKiBAY2hpcDogVGhlIGdwaW8gY2hpcCB0aGF0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKiBAb2ZmOiBUaGUgb2Zmc2V0IGZvciB0aGUgR1BJTyBiZWluZyBjb25maWd1cmVkLgorICogQGNmZzogVGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgdG8gc2V0LgorICoKKyAqIFRoaXMgaGVscGVyIGRlYWwgd2l0aCB0aGUgR1BJTyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCByZWdpc3RlcgorICogaGFzIG9uZSBiaXQgb2YgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdwaW8sIHdoZXJlIHNldHRpbmcgdGhlIGJpdAorICogbWVhbnMgdGhlIHBpbiBpcyBpbiBzcGVjaWFsIGZ1bmN0aW9uIG1vZGUgYW5kIHVuc2V0IG1lYW5zIG91dHB1dC4KKyAqLworCitzdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb19zZXRjZmdfYWJhbmsoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2U7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gb2ZmOworCXUzMiBjb247CisKKwlpZiAoc2Ftc3VuZ19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKworCQkvKiBNYXAgb3V0cHV0IHRvIDAsIGFuZCBTRk4yIHRvIDEgKi8KKwkJY2ZnIC09IDE7CisJCWlmIChjZmcgPiAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2ZnIDw8PSBzaGlmdDsKKwl9CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiAmPSB+KDB4MSA8PCBzaGlmdCk7CisJY29uIHw9IGNmZzsKKwlfX3Jhd193cml0ZWwoY29uLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzM2MyNHh4X2dwaW9fZ2V0Y2ZnX2FiYW5rIC0gUzNDMjRYWCBzdHlsZSBHUElPIGNvbmZpZ3VyYXRpb24gcmVhZCAoQmFuayBBKQorICogQGNoaXA6IFRoZSBncGlvIGNoaXAgdGhhdCBpcyBiZWluZyBjb25maWd1cmVkLgorICogQG9mZjogVGhlIG9mZnNldCBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqCisgKiBUaGUgcmV2ZXJzZSBvZiBzM2MyNHh4X2dwaW9fc2V0Y2ZnX2FiYW5rKCkgdHVybmluZyBhbiBHUElPIGludG8gYSB1c2FibGUKKyAqIEdQSU8gY29uZmlndXJhdGlvbiB2YWx1ZS4KKyAqCisgKiBAc2Egc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0CisgKiBAc2Egc2Ftc3VuZ19ncGlvX2dldGNmZ180Yml0CisgKi8KKworc3RhdGljIHVuc2lnbmVkIHMzYzI0eHhfZ3Bpb19nZXRjZmdfYWJhbmsoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgIHVuc2lnbmVkIGludCBvZmYpCit7CisJdTMyIGNvbjsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGNoaXAtPmJhc2UpOworCWNvbiA+Pj0gb2ZmOworCWNvbiAmPSAxOworCWNvbisrOworCisJcmV0dXJuIFMzQ19HUElPX1NGTihjb24pOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQNjQ0MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1M1UDY0NTApCitzdGF0aWMgaW50IHM1cDY0eDBfZ3Bpb19zZXRjZmdfcmJhbmsoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IGNmZykKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGNoaXAtPmJhc2U7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCXUzMiBjb247CisKKwlzd2l0Y2ggKG9mZikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlzaGlmdCA9IChvZmYgJiA3KSAqIDQ7CisJCXJlZyAtPSA0OworCQlicmVhazsKKwljYXNlIDY6CisJCXNoaWZ0ID0gKChvZmYgKyAxKSAmIDcpICogNDsKKwkJcmVnIC09IDQ7CisJZGVmYXVsdDoKKwkJc2hpZnQgPSAoKG9mZiArIDEpICYgNykgKiA0OworCQlicmVhazsKKwl9CisKKwlpZiAoc2Ftc3VuZ19ncGlvX2lzX2NmZ19zcGVjaWFsKGNmZykpIHsKKwkJY2ZnICY9IDB4ZjsKKwkJY2ZnIDw8PSBzaGlmdDsKKwl9CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWcpOworCWNvbiAmPSB+KDB4ZiA8PCBzaGlmdCk7CisJY29uIHw9IGNmZzsKKwlfX3Jhd193cml0ZWwoY29uLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9zZXRfY2ZnKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2ZnICpjaGlwY2ZnLAorCQkJCQkgICBpbnQgbnJfY2hpcHMpCit7CisJZm9yICg7IG5yX2NoaXBzID4gMDsgbnJfY2hpcHMtLSwgY2hpcGNmZysrKSB7CisJCWlmICghY2hpcGNmZy0+c2V0X2NvbmZpZykKKwkJCWNoaXBjZmctPnNldF9jb25maWcgPSBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzRiaXQ7CisJCWlmICghY2hpcGNmZy0+Z2V0X2NvbmZpZykKKwkJCWNoaXBjZmctPmdldF9jb25maWcgPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzRiaXQ7CisJCWlmICghY2hpcGNmZy0+c2V0X3B1bGwpCisJCQljaGlwY2ZnLT5zZXRfcHVsbCA9IHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3VwZG93bjsKKwkJaWYgKCFjaGlwY2ZnLT5nZXRfcHVsbCkKKwkJCWNoaXBjZmctPmdldF9wdWxsID0gc2Ftc3VuZ19ncGlvX2dldHB1bGxfdXBkb3duOworCX0KK30KKworc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgczNjMjR4eF9ncGlvY2ZnX2RlZmF1bHQgPSB7CisJLnNldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQsCisJLmdldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQsCit9OworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2ZnIHMzYzI0eHhfZ3Bpb2NmZ19iYW5rYSA9IHsKKwkuc2V0X2NvbmZpZwk9IHMzYzI0eHhfZ3Bpb19zZXRjZmdfYWJhbmssCisJLmdldF9jb25maWcJPSBzM2MyNHh4X2dwaW9fZ2V0Y2ZnX2FiYW5rLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgZXh5bm9zNF9ncGlvX2NmZyA9IHsKKwkuc2V0X3B1bGwJPSBleHlub3M0X2dwaW9fc2V0cHVsbCwKKwkuZ2V0X3B1bGwJPSBleHlub3M0X2dwaW9fZ2V0cHVsbCwKKwkuc2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfNGJpdCwKKwkuZ2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19nZXRjZmdfNGJpdCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQNjQ0MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1M1UDY0NTApCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jZmcgczVwNjR4MF9ncGlvX2NmZ19yYmFuayA9IHsKKwkuY2ZnX2VpbnQJPSAweDMsCisJLnNldF9jb25maWcJPSBzNXA2NHgwX2dwaW9fc2V0Y2ZnX3JiYW5rLAorCS5nZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX2dldGNmZ180Yml0LAorCS5zZXRfcHVsbAk9IHNhbXN1bmdfZ3Bpb19zZXRwdWxsX3VwZG93biwKKwkuZ2V0X3B1bGwJPSBzYW1zdW5nX2dwaW9fZ2V0cHVsbF91cGRvd24sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NmZyBzYW1zdW5nX2dwaW9fY2Znc1tdID0geworCXsKKwkJLmNmZ19laW50CT0gMHgwLAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHgzLAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHg3LAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHhGLAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHgwLAorCQkuc2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19zZXRjZmdfMmJpdCwKKwkJLmdldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fZ2V0Y2ZnXzJiaXQsCisJfSwgeworCQkuY2ZnX2VpbnQJPSAweDIsCisJCS5zZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX3NldGNmZ18yYml0LAorCQkuZ2V0X2NvbmZpZwk9IHNhbXN1bmdfZ3Bpb19nZXRjZmdfMmJpdCwKKwl9LCB7CisJCS5jZmdfZWludAk9IDB4MywKKwkJLnNldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQsCisJCS5nZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0LAorCX0sIHsKKwkJLnNldF9jb25maWcJPSBzYW1zdW5nX2dwaW9fc2V0Y2ZnXzJiaXQsCisJCS5nZXRfY29uZmlnCT0gc2Ftc3VuZ19ncGlvX2dldGNmZ18yYml0LAorCX0sIHsKKwkJLnNldF9wdWxsCT0gZXh5bm9zNF9ncGlvX3NldHB1bGwsCisJCS5nZXRfcHVsbAk9IGV4eW5vczRfZ3Bpb19nZXRwdWxsLAorCX0sIHsKKwkJLmNmZ19laW50CT0gMHgzLAorCQkuc2V0X3B1bGwJPSBleHlub3M0X2dwaW9fc2V0cHVsbCwKKwkJLmdldF9wdWxsCT0gZXh5bm9zNF9ncGlvX2dldHB1bGwsCisJfQorfTsKKworLyoKKyAqIERlZmF1bHQgcm91dGluZXMgZm9yIGNvbnRyb2xsaW5nIEdQSU8sIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBTM0MyNFhYCisgKiBHUElPIGZ1bmN0aW9ucyB3aGljaCBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgZWFjaCBncGlvIGJhbmsgb2YgdGhlCisgKiBjaGlwIGlzIGFzIGZvbGxvd2luZzoKKyAqCisgKiBiYXNlICsgMHgwMDogQ29udHJvbCByZWdpc3RlciwgMiBiaXRzIHBlciBncGlvCisgKgkgICAgICAgIGdwaW8gbjogMiBiaXRzIHN0YXJ0aW5nIGF0ICgyKm4pCisgKgkJMDAgPSBpbnB1dCwgMDEgPSBvdXRwdXQsIG90aGVycyBtZWFuIHNwZWNpYWwtZnVuY3Rpb24KKyAqIGJhc2UgKyAweDA0OiBEYXRhIHJlZ2lzdGVyLCAxIGJpdCBwZXIgZ3BpbworICoJCWJpdCBuOiBkYXRhIGJpdCBuCisqLworCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgY29uOworCisJc2Ftc3VuZ19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOworCisJY29uID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOworCWNvbiAmPSB+KDMgPDwgKG9mZnNldCAqIDIpKTsKKworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKKworCXNhbXN1bmdfZ3Bpb191bmxvY2sob3VyY2hpcCwgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZGF0OworCXVuc2lnbmVkIGxvbmcgY29uOworCisJc2Ftc3VuZ19ncGlvX2xvY2sob3VyY2hpcCwgZmxhZ3MpOworCisJZGF0ID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDQpOworCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7CisKKwljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwMCk7CisJY29uICY9IH4oMyA8PCAob2Zmc2V0ICogMikpOworCWNvbiB8PSAxIDw8IChvZmZzZXQgKiAyKTsKKworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7CisKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKG91cmNoaXAsIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBzYW1zdW5nX2dwaW9saWJfNGJpdCByb3V0aW5lcyBhcmUgdG8gY29udHJvbCB0aGUgZ3BpbyBiYW5rcyB3aGVyZQorICogdGhlIGdwaW8gY29uZmlndXJhdGlvbiByZWdpc3RlciAoR1B4Q09OKSBoYXMgNCBiaXRzIHBlciBHUElPLCBhcyB0aGUKKyAqIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqIGJhc2UgKyAweDAwOiBDb250cm9sIHJlZ2lzdGVyLCA0IGJpdHMgcGVyIGdwaW8KKyAqCQlncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQorICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgorICogYmFzZSArIDB4MDQ6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCisgKgkJYml0IG46IGRhdGEgYml0IG4KKyAqCisgKiBOb3RlLCBzaW5jZSB0aGUgZGF0YSByZWdpc3RlciBpcyBvbmUgYml0IHBlciBncGlvIGFuZCBpcyBhdCBiYXNlICsgMHg0CisgKiB3ZSBjYW4gdXNlIHNhbXN1bmdfZ3Bpb2xpYl9nZXQgYW5kIHNhbXN1bmdfZ3Bpb2xpYl9zZXQgdG8gY2hhbmdlIHRoZQorICogc3RhdGUgb2YgdGhlIG91dHB1dC4KKyAqLworCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGNvbjsKKworCWNvbiA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPQ09OX09GRik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyBHUElPQ09OX09GRik7CisKKwlncGlvX2RiZygiJXM6ICVwOiBDT04gbm93ICUwOGx4XG4iLCBfX2Z1bmNfXywgYmFzZSwgY29uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fc2Ftc3VuZ19ncGlvKGNoaXApOworCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBjb247CisJdW5zaWduZWQgbG9uZyBkYXQ7CisKKwljb24gPSBfX3Jhd19yZWFkbChiYXNlICsgR1BJT0NPTl9PRkYpOworCWNvbiAmPSB+KDB4ZiA8PCBjb25fNGJpdF9zaGlmdChvZmZzZXQpKTsKKwljb24gfD0gMHgxIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgR1BJT0RBVF9PRkYpOworCisJaWYgKHZhbHVlKQorCQlkYXQgfD0gMSA8PCBvZmZzZXQ7CisJZWxzZQorCQlkYXQgJj0gfigxIDw8IG9mZnNldCk7CisKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyBHUElPQ09OX09GRik7CisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKKworCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseCwgREFUICUwOGx4XG4iLCBfX2Z1bmNfXywgYmFzZSwgY29uLCBkYXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgbmV4dCBzZXQgb2Ygcm91dGluZXMgYXJlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgR1BJTyBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlcnMgYXJlIDQgYml0cyBwZXIgR1BJTyBidXQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZWdpc3RlciAodGhlCisgKiBiYW5rIGhhcyBtb3JlIHRoYW4gOCBHUElPcy4KKyAqCisgKiBUaGlzIGNhc2UgaXMgdGhlIHNpbWlsYXIgdG8gdGhlIDQgYml0IGNhc2UsIGJ1dCB0aGUgcmVnaXN0ZXJzIGFyZSBhcworICogZm9sbG93czoKKyAqCisgKiBiYXNlICsgMHgwMDogQ29udHJvbCByZWdpc3RlciwgNCBiaXRzIHBlciBncGlvIChsb3dlciA4IEdQSU9zKQorICoJCWdwaW8gbjogNCBiaXRzIHN0YXJ0aW5nIGF0ICg0Km4pCisgKgkJMDAwMCA9IGlucHV0LCAwMDAxID0gb3V0cHV0LCBvdGhlcnMgbWVhbiBzcGVjaWFsLWZ1bmN0aW9uCisgKiBiYXNlICsgMHgwNDogQ29udHJvbCByZWdpc3RlciwgNCBiaXRzIHBlciBncGlvICh1cCB0byA4IGFkZGl0aW9ucyBHUElPcykKKyAqCQlncGlvIG46IDQgYml0cyBzdGFydGluZyBhdCAoNCpuKQorICoJCTAwMDAgPSBpbnB1dCwgMDAwMSA9IG91dHB1dCwgb3RoZXJzIG1lYW4gc3BlY2lhbC1mdW5jdGlvbgorICogYmFzZSArIDB4MDg6IERhdGEgcmVnaXN0ZXIsIDEgYml0IHBlciBncGlvCisgKgkJYml0IG46IGRhdGEgYml0IG4KKyAqCisgKiBUbyBhbGxvdyB1cyB0byB1c2UgdGhlIHNhbXN1bmdfZ3Bpb2xpYl9nZXQgYW5kIHNhbXN1bmdfZ3Bpb2xpYl9zZXQKKyAqIHJvdXRpbmVzIHdlIHN0b3JlIHRoZSAnYmFzZSArIDB4NCcgYWRkcmVzcyBzbyB0aGF0IHRoZXNlIHJvdXRpbmVzIHNlZQorICogdGhlIGRhdGEgcmVnaXN0ZXIgYXQgb3VyY2hpcC0+YmFzZSArIDB4MDQuCisgKi8KKworc3RhdGljIGludCBzYW1zdW5nX2dwaW9saWJfNGJpdDJfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZ2NvbiA9IGJhc2U7CisJdW5zaWduZWQgbG9uZyBjb247CisKKwlpZiAob2Zmc2V0ID4gNykKKwkJb2Zmc2V0IC09IDg7CisJZWxzZQorCQlyZWdjb24gLT0gNDsKKworCWNvbiA9IF9fcmF3X3JlYWRsKHJlZ2Nvbik7CisJY29uICY9IH4oMHhmIDw8IGNvbl80Yml0X3NoaWZ0KG9mZnNldCkpOworCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7CisKKwlncGlvX2RiZygiJXM6ICVwOiBDT04gJTA4bHhcbiIsIF9fZnVuY19fLCBiYXNlLCBjb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliXzRiaXQyX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fc2Ftc3VuZ19ncGlvKGNoaXApOworCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWdjb24gPSBiYXNlOworCXVuc2lnbmVkIGxvbmcgY29uOworCXVuc2lnbmVkIGxvbmcgZGF0OworCXVuc2lnbmVkIGNvbl9vZmZzZXQgPSBvZmZzZXQ7CisKKwlpZiAoY29uX29mZnNldCA+IDcpCisJCWNvbl9vZmZzZXQgLT0gODsKKwllbHNlCisJCXJlZ2NvbiAtPSA0OworCisJY29uID0gX19yYXdfcmVhZGwocmVnY29uKTsKKwljb24gJj0gfigweGYgPDwgY29uXzRiaXRfc2hpZnQoY29uX29mZnNldCkpOworCWNvbiB8PSAweDEgPDwgY29uXzRiaXRfc2hpZnQoY29uX29mZnNldCk7CisKKwlkYXQgPSBfX3Jhd19yZWFkbChiYXNlICsgR1BJT0RBVF9PRkYpOworCisJaWYgKHZhbHVlKQorCQlkYXQgfD0gMSA8PCBvZmZzZXQ7CisJZWxzZQorCQlkYXQgJj0gfigxIDw8IG9mZnNldCk7CisKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgR1BJT0RBVF9PRkYpOworCV9fcmF3X3dyaXRlbChjb24sIHJlZ2Nvbik7CisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIEdQSU9EQVRfT0ZGKTsKKworCWdwaW9fZGJnKCIlczogJXA6IENPTiAlMDhseCwgREFUICUwOGx4XG4iLCBfX2Z1bmNfXywgYmFzZSwgY29uLCBkYXQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUExBVF9TM0MyNFhYCisvKiBUaGUgbmV4dCBzZXQgb2Ygcm91dGluZXMgYXJlIGZvciB0aGUgY2FzZSBvZiBzM2MyNHh4IGJhbmsgYSAqLworCitzdGF0aWMgaW50IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rYV9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmthX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZGF0OworCXVuc2lnbmVkIGxvbmcgY29uOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY29uID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDA0KTsKKworCWRhdCAmPSB+KDEgPDwgb2Zmc2V0KTsKKwlpZiAodmFsdWUpCisJCWRhdCB8PSAxIDw8IG9mZnNldDsKKworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyAweDA0KTsKKworCWNvbiAmPSB+KDEgPDwgb2Zmc2V0KTsKKworCV9fcmF3X3dyaXRlbChjb24sIGJhc2UgKyAweDAwKTsKKwlfX3Jhd193cml0ZWwoZGF0LCBiYXNlICsgMHgwNCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogVGhlIG5leHQgc2V0IG9mIHJvdXRpbmVzIGFyZSBmb3IgdGhlIGNhc2Ugb2YgczVwNjR4MCBiYW5rIHIgKi8KKworc3RhdGljIGludCBzNXA2NHgwX2dwaW9saWJfcmJhbmtfaW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZ2NvbiA9IGJhc2U7CisJdW5zaWduZWQgbG9uZyBjb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSA2OgorCQlvZmZzZXQgKz0gMTsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwkJcmVnY29uIC09IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW9mZnNldCAtPSA3OworCQlicmVhazsKKwl9CisKKwlzYW1zdW5nX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWdjb24pOworCWNvbiAmPSB+KDB4ZiA8PCBjb25fNGJpdF9zaGlmdChvZmZzZXQpKTsKKwlfX3Jhd193cml0ZWwoY29uLCByZWdjb24pOworCisJc2Ftc3VuZ19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXA2NHgwX2dwaW9saWJfcmJhbmtfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKm91cmNoaXAgPSB0b19zYW1zdW5nX2dwaW8oY2hpcCk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gb3VyY2hpcC0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZ2NvbiA9IGJhc2U7CisJdW5zaWduZWQgbG9uZyBjb247CisJdW5zaWduZWQgbG9uZyBkYXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjb25fb2Zmc2V0ICA9IG9mZnNldDsKKworCXN3aXRjaCAoY29uX29mZnNldCkgeworCWNhc2UgNjoKKwkJY29uX29mZnNldCArPSAxOworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlyZWdjb24gLT0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29uX29mZnNldCAtPSA3OworCQlicmVhazsKKwl9CisKKwlzYW1zdW5nX2dwaW9fbG9jayhvdXJjaGlwLCBmbGFncyk7CisKKwljb24gPSBfX3Jhd19yZWFkbChyZWdjb24pOworCWNvbiAmPSB+KDB4ZiA8PCBjb25fNGJpdF9zaGlmdChjb25fb2Zmc2V0KSk7CisJY29uIHw9IDB4MSA8PCBjb25fNGJpdF9zaGlmdChjb25fb2Zmc2V0KTsKKworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyBHUElPREFUX09GRik7CisJaWYgKHZhbHVlKQorCQlkYXQgfD0gMSA8PCBvZmZzZXQ7CisJZWxzZQorCQlkYXQgJj0gfigxIDw8IG9mZnNldCk7CisKKwlfX3Jhd193cml0ZWwoY29uLCByZWdjb24pOworCV9fcmF3X3dyaXRlbChkYXQsIGJhc2UgKyBHUElPREFUX09GRik7CisKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKG91cmNoaXAsIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYW1zdW5nX2dwaW9saWJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fc2Ftc3VuZ19ncGlvKGNoaXApOworCXZvaWQgX19pb21lbSAqYmFzZSA9IG91cmNoaXAtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRhdDsKKworCXNhbXN1bmdfZ3Bpb19sb2NrKG91cmNoaXAsIGZsYWdzKTsKKworCWRhdCA9IF9fcmF3X3JlYWRsKGJhc2UgKyAweDA0KTsKKwlkYXQgJj0gfigxIDw8IG9mZnNldCk7CisJaWYgKHZhbHVlKQorCQlkYXQgfD0gMSA8PCBvZmZzZXQ7CisJX19yYXdfd3JpdGVsKGRhdCwgYmFzZSArIDB4MDQpOworCisJc2Ftc3VuZ19ncGlvX3VubG9jayhvdXJjaGlwLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19ncGlvbGliX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpvdXJjaGlwID0gdG9fc2Ftc3VuZ19ncGlvKGNoaXApOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwob3VyY2hpcC0+YmFzZSArIDB4MDQpOworCXZhbCA+Pj0gb2Zmc2V0OworCXZhbCAmPSAxOworCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIENPTkZJR19TM0NfR1BJT19UUkFDSyBlbmFibGVzIHRoZSB0cmFja2luZyBvZiB0aGUgczNjIHNwZWNpZmljIGdwaW9zCisgKiBmb3IgdXNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gY2FsbHMsIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgczNjIGdwaW9saWIKKyAqIHN1cHBvcnQgY29kZS4KKyAqCisgKiBOb3QgYWxsIHMzYyBzdXBwb3J0IGNvZGUgd2lsbCBuZWVkIHRoaXMsIGFzIHNvbWUgY29uZmlndXJhdGlvbnMgb2YgY3B1CisgKiBtYXkgb25seSBzdXBwb3J0IG9uZSBvciB0d28gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgaGF2ZSBhbgorICogZWFzeSBncGlvIHRvIHNhbXN1bmdfZ3Bpb19jaGlwIG1hcHBpbmcgZnVuY3Rpb24uIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4KKyAqIHRoZSBtYWNoaW5lIHN1cHBvcnQgZmlsZSBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKCkKKyAqIGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgQ09ORklHX1MzQ19HUElPX1RSQUNLCitzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKnMzY19ncGlvc1tTM0NfR1BJT19FTkRdOworCitzdGF0aWMgX19pbml0IHZvaWQgczNjX2dwaW9saWJfdHJhY2soc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGludCBncG47CisJaW50IGk7CisKKwlncG4gPSBjaGlwLT5jaGlwLmJhc2U7CisJZm9yIChpID0gMDsgaSA8IGNoaXAtPmNoaXAubmdwaW87IGkrKywgZ3BuKyspIHsKKwkJQlVHX09OKGdwbiA+PSBBUlJBWV9TSVpFKHMzY19ncGlvcykpOworCQlzM2NfZ3Bpb3NbZ3BuXSA9IGNoaXA7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TM0NfR1BJT19UUkFDSyAqLworCisvKgorICogc2Ftc3VuZ19ncGlvbGliX2FkZCgpIC0gYWRkIHRoZSBTYW1zdW5nIGdwaW9fY2hpcC4KKyAqIEBjaGlwOiBUaGUgY2hpcCB0byByZWdpc3RlcgorICoKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGdwaW9jaGlwX2FkZCgpIHRoYXQgdGFrZXMgb3VyIHNwZWNpZmljIGdwaW8gY2hpcAorICogaW5mb3JtYXRpb24gYW5kIG1ha2VzIHRoZSBuZWNlc3NhcnkgYWx0ZXJhdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSBhbmQKKyAqIG5vdGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgdXNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtcyBhbmQgYW55CisgKiBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9ICZjaGlwLT5jaGlwOworCWludCByZXQ7CisKKwlCVUdfT04oIWNoaXAtPmJhc2UpOworCUJVR19PTighZ2MtPmxhYmVsKTsKKwlCVUdfT04oIWdjLT5uZ3Bpbyk7CisKKwlzcGluX2xvY2tfaW5pdCgmY2hpcC0+bG9jayk7CisKKwlpZiAoIWdjLT5kaXJlY3Rpb25faW5wdXQpCisJCWdjLT5kaXJlY3Rpb25faW5wdXQgPSBzYW1zdW5nX2dwaW9saWJfMmJpdF9pbnB1dDsKKwlpZiAoIWdjLT5kaXJlY3Rpb25fb3V0cHV0KQorCQlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X291dHB1dDsKKwlpZiAoIWdjLT5zZXQpCisJCWdjLT5zZXQgPSBzYW1zdW5nX2dwaW9saWJfc2V0OworCWlmICghZ2MtPmdldCkKKwkJZ2MtPmdldCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXQ7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoY2hpcC0+cG0gIT0gTlVMTCkgeworCQlpZiAoIWNoaXAtPnBtLT5zYXZlIHx8ICFjaGlwLT5wbS0+cmVzdW1lKQorCQkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiAlcyBoYXMgbWlzc2luZyBQTSBmdW5jdGlvbnNcbiIsCisJCQkgICAgICAgZ2MtPmxhYmVsKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiAlcyBoYXMgbm8gUE0gZnVuY3Rpb25cbiIsIGdjLT5sYWJlbCk7CisjZW5kaWYKKworCS8qIGdwaW9jaGlwX2FkZCgpIHByaW50cyBvd24gZmFpbHVyZSBtZXNzYWdlIG9uIGVycm9yLiAqLworCXJldCA9IGdwaW9jaGlwX2FkZChnYyk7CisJaWYgKHJldCA+PSAwKQorCQlzM2NfZ3Bpb2xpYl90cmFjayhjaGlwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHMzYzI0eHhfZ3Bpb2xpYl9hZGRfY2hpcHMoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgICAgIGludCBucl9jaGlwcywgdm9pZCBfX2lvbWVtICpiYXNlKQoreworCWludCBpOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJmNoaXAtPmNoaXA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgeworCQkvKiBza2lwIGJhbmtzIG5vdCBwcmVzZW50IG9uIFNvQyAqLworCQlpZiAoY2hpcC0+Y2hpcC5iYXNlID49IFMzQ19HUElPX0VORCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY2hpcC0+Y29uZmlnKQorCQkJY2hpcC0+Y29uZmlnID0gJnMzYzI0eHhfZ3Bpb2NmZ19kZWZhdWx0OworCQlpZiAoIWNoaXAtPnBtKQorCQkJY2hpcC0+cG0gPSBfX2dwaW9fcG0oJnNhbXN1bmdfZ3Bpb19wbV8yYml0KTsKKwkJaWYgKChiYXNlICE9IE5VTEwpICYmIChjaGlwLT5iYXNlID09IE5VTEwpKQorCQkJY2hpcC0+YmFzZSA9IGJhc2UgKyAoKGkpICogMHgxMCk7CisKKwkJaWYgKCFnYy0+ZGlyZWN0aW9uX2lucHV0KQorCQkJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X2lucHV0OworCQlpZiAoIWdjLT5kaXJlY3Rpb25fb3V0cHV0KQorCQkJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBzYW1zdW5nX2dwaW9saWJfMmJpdF9vdXRwdXQ7CisKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZChjaGlwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYW1zdW5nX2dwaW9saWJfYWRkXzJiaXRfY2hpcHMoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICBpbnQgbnJfY2hpcHMsIHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc2Ftc3VuZ19ncGlvbGliXzJiaXRfaW5wdXQ7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl8yYml0X291dHB1dDsKKworCQlpZiAoIWNoaXAtPmNvbmZpZykKKwkJCWNoaXAtPmNvbmZpZyA9ICZzYW1zdW5nX2dwaW9fY2Znc1s3XTsKKwkJaWYgKCFjaGlwLT5wbSkKKwkJCWNoaXAtPnBtID0gX19ncGlvX3BtKCZzYW1zdW5nX2dwaW9fcG1fMmJpdCk7CisJCWlmICgoYmFzZSAhPSBOVUxMKSAmJiAoY2hpcC0+YmFzZSA9PSBOVUxMKSkKKwkJCWNoaXAtPmJhc2UgPSBiYXNlICsgKChpKSAqIG9mZnNldCk7CisKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZChjaGlwKTsKKwl9Cit9CisKKy8qCisgKiBzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMgLSA0Yml0IHNpbmdsZSByZWdpc3RlciBHUElPIGNvbmZpZy4KKyAqIEBjaGlwOiBUaGUgZ3BpbyBjaGlwIHRoYXQgaXMgYmVpbmcgY29uZmlndXJlZC4KKyAqIEBucl9jaGlwczogVGhlIG5vIG9mIGNoaXBzIChncGlvIHBvcnRzKSBmb3IgdGhlIEdQSU8gYmVpbmcgY29uZmlndXJlZC4KKyAqCisgKiBUaGlzIGhlbHBlciBkZWFsIHdpdGggdGhlIEdQSU8gY2FzZXMgd2hlcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaGFzIDQgYml0cworICogb2YgY29udHJvbCBwZXIgR1BJTywgZ2VuZXJhbGx5IGluIHRoZSBmb3JtIG9mOgorICogMDAwMCA9IElucHV0CisgKiAwMDAxID0gT3V0cHV0CisgKiBvdGhlcnMgPSBTcGVjaWFsIGZ1bmN0aW9ucyAoZGVwZW5kZW50IG9uIGJhbmspCisgKgorICogTm90ZSwgc2luY2UgdGhlIGNvZGUgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSB0d28gY29udHJvbAorICogcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb25lLCB3ZSBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHNldCBvZiBmdW5jdGlvbgorICogKHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDJfY2hpcHMpZm9yIGVhY2ggY2FzZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJCSAgaW50IG5yX2NoaXBzLCB2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgeworCQljaGlwLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0X2lucHV0OworCQljaGlwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzYW1zdW5nX2dwaW9saWJfNGJpdF9vdXRwdXQ7CisKKwkJaWYgKCFjaGlwLT5jb25maWcpCisJCQljaGlwLT5jb25maWcgPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbMl07CisJCWlmICghY2hpcC0+cG0pCisJCQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmc2Ftc3VuZ19ncGlvX3BtXzRiaXQpOworCQlpZiAoKGJhc2UgIT0gTlVMTCkgJiYgKGNoaXAtPmJhc2UgPT0gTlVMTCkpCisJCQljaGlwLT5iYXNlID0gYmFzZSArICgoaSkgKiAweDIwKTsKKworCQlzYW1zdW5nX2dwaW9saWJfYWRkKGNoaXApOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdDJfY2hpcHMoc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkJICAgaW50IG5yX2NoaXBzKQoreworCWZvciAoOyBucl9jaGlwcyA+IDA7IG5yX2NoaXBzLS0sIGNoaXArKykgeworCQljaGlwLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHNhbXN1bmdfZ3Bpb2xpYl80Yml0Ml9pbnB1dDsKKwkJY2hpcC0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gc2Ftc3VuZ19ncGlvbGliXzRiaXQyX291dHB1dDsKKworCQlpZiAoIWNoaXAtPmNvbmZpZykKKwkJCWNoaXAtPmNvbmZpZyA9ICZzYW1zdW5nX2dwaW9fY2Znc1syXTsKKwkJaWYgKCFjaGlwLT5wbSkKKwkJCWNoaXAtPnBtID0gX19ncGlvX3BtKCZzYW1zdW5nX2dwaW9fcG1fNGJpdCk7CisKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZChjaGlwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzNXA2NHgwX2dwaW9saWJfYWRkX3JiYW5rKHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCwKKwkJCQkJICAgICBpbnQgbnJfY2hpcHMpCit7CisJZm9yICg7IG5yX2NoaXBzID4gMDsgbnJfY2hpcHMtLSwgY2hpcCsrKSB7CisJCWNoaXAtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gczVwNjR4MF9ncGlvbGliX3JiYW5rX2lucHV0OworCQljaGlwLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzNXA2NHgwX2dwaW9saWJfcmJhbmtfb3V0cHV0OworCisJCWlmICghY2hpcC0+cG0pCisJCQljaGlwLT5wbSA9IF9fZ3Bpb19wbSgmc2Ftc3VuZ19ncGlvX3BtXzRiaXQpOworCisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGQoY2hpcCk7CisJfQorfQorCitpbnQgc2Ftc3VuZ19ncGlvbGliX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqc2Ftc3VuZ19jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCwgY2hpcCk7CisKKwlyZXR1cm4gc2Ftc3VuZ19jaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworI2lmZGVmIENPTkZJR19QTEFUX1MzQzI0WFgKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2ZiYW5rX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaWYgKG9mZnNldCA8IDQpCisJCXJldHVybiBJUlFfRUlOVDAgKyBvZmZzZXQ7CisKKwlpZiAob2Zmc2V0IDwgOCkKKwkJcmV0dXJuIElSUV9FSU5UNCArIG9mZnNldCAtIDQ7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDNjRYWAorc3RhdGljIGludCBzM2M2NHh4X2dwaW9saWJfbWJhbmtfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlyZXR1cm4gcGluIDwgNSA/IElSUV9FSU5UKDIzKSArIHBpbiA6IC1FTlhJTzsKK30KKworc3RhdGljIGludCBzM2M2NHh4X2dwaW9saWJfbGJhbmtfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHBpbikKK3sKKwlyZXR1cm4gcGluID49IDggPyBJUlFfRUlOVCgxNikgKyBwaW4gLSA4IDogLUVOWElPOworfQorI2VuZGlmCisKK3N0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW10gPSB7CisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAorCXsKKwkJLmNvbmZpZwk9ICZzM2MyNHh4X2dwaW9jZmdfYmFua2EsCisJCS5jaGlwCT0geworCQkJLmJhc2UJCQk9IFMzQzI0MTBfR1BBKDApLAorCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAkJCT0gIkdQSU9BIiwKKwkJCS5uZ3BpbwkJCT0gMjQsCisJCQkuZGlyZWN0aW9uX2lucHV0CT0gczNjMjR4eF9ncGlvbGliX2JhbmthX2lucHV0LAorCQkJLmRpcmVjdGlvbl9vdXRwdXQJPSBzM2MyNHh4X2dwaW9saWJfYmFua2Ffb3V0cHV0LAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BCKDApLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubGFiZWwJPSAiR1BJT0IiLAorCQkJLm5ncGlvCT0gMTYsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEMoMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPQyIsCisJCQkubmdwaW8JPSAxNiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQRCgwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9EIiwKKwkJCS5uZ3Bpbwk9IDE2LAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BFKDApLAorCQkJLmxhYmVsCT0gIkdQSU9FIiwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLm5ncGlvCT0gMTYsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEYoMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPRiIsCisJCQkubmdwaW8JPSA4LAorCQkJLnRvX2lycQk9IHMzYzI0eHhfZ3Bpb2xpYl9mYmFua190b19pcnEsCisJCX0sCisJfSwgeworCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVDgsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQRygwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9HIiwKKwkJCS5uZ3Bpbwk9IDE2LAorCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEgoMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPSCIsCisJCQkubmdwaW8JPSAxMSwKKwkJfSwKKwl9LAorCQkvKiBHUElPUyBmb3IgdGhlIFMzQzI0NDMgYW5kIGxhdGVyIGRldmljZXMuICovCisJeworCQkuYmFzZQk9IFMzQzI0NDBfR1BKQ09OLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUEooMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPSiIsCisJCQkubmdwaW8JPSAxNiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDMjQ0M19HUEtDT04sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0MyNDEwX0dQSygwKSwKKwkJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkJLmxhYmVsCT0gIkdQSU9LIiwKKwkJCS5uZ3Bpbwk9IDE2LAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0MyNDQzX0dQTENPTiwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzI0MTBfR1BMKDApLAorCQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCQkubGFiZWwJPSAiR1BJT0wiLAorCQkJLm5ncGlvCT0gMTUsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFMzQzI0NDNfR1BNQ09OLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDMjQxMF9HUE0oMCksCisJCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJCS5sYWJlbAk9ICJHUElPTSIsCisJCQkubmdwaW8JPSAyLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKKy8qCisgKiBHUElPIGJhbmsgc3VtbWFyeToKKyAqCisgKiBCYW5rCUdQSU9zCVN0eWxlCVNscENvbglFeHRJbnQgR3JvdXAKKyAqIEEJOAk0Qml0CVllcwkxCisgKiBCCTcJNEJpdAlZZXMJMQorICogQwk4CTRCaXQJWWVzCTIKKyAqIEQJNQk0Qml0CVllcwkzCisgKiBFCTUJNEJpdAlZZXMJTm9uZQorICogRgkxNgkyQml0CVllcwk0IFsxXQorICogRwk3CTRCaXQJWWVzCTUKKyAqIEgJMTAJNEJpdFsyXQlZZXMJNgorICogSQkxNgkyQml0CVllcwlOb25lCisgKiBKCTEyCTJCaXQJWWVzCU5vbmUKKyAqIEsJMTYJNEJpdFsyXQlObwlOb25lCisgKiBMCTE1CTRCaXRbMl0gTm8JTm9uZQorICogTQk2CTRCaXQJTm8JSVJRX0VJTlQKKyAqIE4JMTYJMkJpdAlObwlJUlFfRUlOVAorICogTwkxNgkyQml0CVllcwk3CisgKiBQCTE1CTJCaXQJWWVzCTgKKyAqIFEJOQkyQml0CVllcwk5CisgKgorICogWzFdIEJBTktGIHBpbnMgMTQsMTUgZG8gbm90IGZvcm0gcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMKKyAqIFsyXSBCQU5LIGhhcyB0d28gY29udHJvbCByZWdpc3RlcnMsIEdQeENPTjAgYW5kIEdQeENPTjEKKyAqLworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHMzYzY0eHhfZ3Bpb3NfNGJpdFtdID0geworI2lmZGVmIENPTkZJR19QTEFUX1MzQzY0WFgKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQQSgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19BX05SLAorCQkJLmxhYmVsCT0gIkdQQSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEIoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fQl9OUiwKKwkJCS5sYWJlbAk9ICJHUEIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BDKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0NfTlIsCisJCQkubGFiZWwJPSAiR1BDIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRCgwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19EX05SLAorCQkJLmxhYmVsCT0gIkdQRCIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzBdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEUoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fRV9OUiwKKwkJCS5sYWJlbAk9ICJHUEUiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQR19CQVNFLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEcoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fR19OUiwKKwkJCS5sYWJlbAk9ICJHUEciLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQTV9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzFdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUE0oMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTV9OUiwKKwkJCS5sYWJlbAk9ICJHUE0iLAorCQkJLnRvX2lycSA9IHMzYzY0eHhfZ3Bpb2xpYl9tYmFua190b19pcnEsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzM2M2NHh4X2dwaW9zXzRiaXQyW10gPSB7CisjaWZkZWYgQ09ORklHX1BMQVRfUzNDNjRYWAorCXsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQSF9CQVNFICsgMHg0LAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEgoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSF9OUiwKKwkJCS5sYWJlbAk9ICJHUEgiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQS19CQVNFICsgMHg0LAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzBdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEsoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fS19OUiwKKwkJCS5sYWJlbAk9ICJHUEsiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTM0M2NFhYX0dQTF9CQVNFICsgMHg0LAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzFdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEwoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fTF9OUiwKKwkJCS5sYWJlbAk9ICJHUEwiLAorCQkJLnRvX2lycSA9IHMzYzY0eHhfZ3Bpb2xpYl9sYmFua190b19pcnEsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzM2M2NHh4X2dwaW9zXzJiaXRbXSA9IHsKKyNpZmRlZiBDT05GSUdfUExBVF9TM0M2NFhYCisJeworCQkuYmFzZQk9IFMzQzY0WFhfR1BGX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQRigwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19GX05SLAorCQkJLmxhYmVsCT0gIkdQRiIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzddLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUEkoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fSV9OUiwKKwkJCS5sYWJlbAk9ICJHUEkiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s3XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BKKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX0pfTlIsCisJCQkubGFiZWwJPSAiR1BKIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQTygwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19PX05SLAorCQkJLmxhYmVsCT0gIkdQTyIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzZdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzNDNjRYWF9HUFAoMCksCisJCQkubmdwaW8JPSBTM0M2NFhYX0dQSU9fUF9OUiwKKwkJCS5sYWJlbAk9ICJHUFAiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s2XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFMzQzY0WFhfR1BRKDApLAorCQkJLm5ncGlvCT0gUzNDNjRYWF9HUElPX1FfTlIsCisJCQkubGFiZWwJPSAiR1BRIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzNDNjRYWF9HUE5fQkFTRSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMCksCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTM0M2NFhYX0dQTigwKSwKKwkJCS5uZ3Bpbwk9IFMzQzY0WFhfR1BJT19OX05SLAorCQkJLmxhYmVsCT0gIkdQTiIsCisJCQkudG9faXJxID0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCisvKgorICogUzVQNjQ0MCBHUElPIGJhbmsgc3VtbWFyeToKKyAqCisgKiBCYW5rCUdQSU9zCVN0eWxlCVNscENvbglFeHRJbnQgR3JvdXAKKyAqIEEJNgk0Qml0CVllcwkxCisgKiBCCTcJNEJpdAlZZXMJMQorICogQwk4CTRCaXQJWWVzCTIKKyAqIEYJMgkyQml0CVllcwk0IFsxXQorICogRwk3CTRCaXQJWWVzCTUKKyAqIEgJMTAJNEJpdFsyXQlZZXMJNgorICogSQkxNgkyQml0CVllcwlOb25lCisgKiBKCTEyCTJCaXQJWWVzCU5vbmUKKyAqIE4JMTYJMkJpdAlObwlJUlFfRUlOVAorICogUAk4CTJCaXQJWWVzCTgKKyAqIFIJMTUJNEJpdFsyXQlZZXMJOAorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ0MF9ncGlvc180Yml0W10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDQwCisJeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUEEoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fQV9OUiwKKwkJCS5sYWJlbAk9ICJHUEEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NDBfR1BCKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ0MF9HUElPX0JfTlIsCisJCQkubGFiZWwJPSAiR1BCIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQQygwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19DX05SLAorCQkJLmxhYmVsCT0gIkdQQyIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BHX0JBU0UsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQRygwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19HX05SLAorCQkJLmxhYmVsCT0gIkdQRyIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXA2NDQwX2dwaW9zXzRiaXQyW10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDQwCisJeworCQkuYmFzZQk9IFM1UDY0WDBfR1BIX0JBU0UgKyAweDQsCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDQwX0dQSCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NDBfR1BJT19IX05SLAorCQkJLmxhYmVsCT0gIkdQSCIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXA2NDQwX2dwaW9zX3JiYW5rW10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDQwCisJeworCQkuYmFzZQk9IFM1UDY0WDBfR1BSX0JBU0UgKyAweDQsCisJCS5jb25maWcJPSAmczVwNjR4MF9ncGlvX2NmZ19yYmFuaywKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NDBfR1BSKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ0MF9HUElPX1JfTlIsCisJCQkubGFiZWwJPSAiR1BSIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NDBfZ3Bpb3NfMmJpdFtdID0geworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ0MAorCXsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQRl9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzZdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUEYoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fRl9OUiwKKwkJCS5sYWJlbAk9ICJHUEYiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQSV9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzRdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUEkoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fSV9OUiwKKwkJCS5sYWJlbAk9ICJHUEkiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQSl9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzRdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUEooMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fSl9OUiwKKwkJCS5sYWJlbAk9ICJHUEoiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQTl9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzVdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUE4oMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fTl9OUiwKKwkJCS5sYWJlbAk9ICJHUE4iLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSBTNVA2NFgwX0dQUF9CQVNFLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzZdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ0MF9HUFAoMCksCisJCQkubmdwaW8JPSBTNVA2NDQwX0dQSU9fUF9OUiwKKwkJCS5sYWJlbAk9ICJHUFAiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKKy8qCisgKiBTNVA2NDUwIEdQSU8gYmFuayBzdW1tYXJ5OgorICoKKyAqIEJhbmsJR1BJT3MJU3R5bGUJU2xwQ29uCUV4dEludCBHcm91cAorICogQQk2CTRCaXQJWWVzCTEKKyAqIEIJNwk0Qml0CVllcwkxCisgKiBDCTgJNEJpdAlZZXMJMgorICogRAk4CTRCaXQJWWVzCU5vbmUKKyAqIEYJMgkyQml0CVllcwlOb25lCisgKiBHCTE0CTRCaXRbMl0JWWVzCTUKKyAqIEgJMTAJNEJpdFsyXQlZZXMJNgorICogSQkxNgkyQml0CVllcwlOb25lCisgKiBKCTEyCTJCaXQJWWVzCU5vbmUKKyAqIEsJNQk0Qml0CVllcwlOb25lCisgKiBOCTE2CTJCaXQJTm8JSVJRX0VJTlQKKyAqIFAJMTEJMkJpdAlZZXMJOAorICogUQkxNAkyQml0CVllcwlOb25lCisgKiBSCTE1CTRCaXRbMl0JWWVzCU5vbmUKKyAqIFMJOAkyQml0CVllcwlOb25lCisgKgorICogWzFdIEJBTktGIHBpbnMgMTQsMTUgZG8gbm90IGZvcm0gcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMKKyAqIFsyXSBCQU5LIGhhcyB0d28gY29udHJvbCByZWdpc3RlcnMsIEdQeENPTjAgYW5kIEdQeENPTjEKKyAqLworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NTBfZ3Bpb3NfNGJpdFtdID0geworI2lmZGVmIENPTkZJR19DUFVfUzVQNjQ1MAorCXsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BBKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0FfTlIsCisJCQkubGFiZWwJPSAiR1BBIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQQigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19CX05SLAorCQkJLmxhYmVsCT0gIkdQQiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUEMoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fQ19OUiwKKwkJCS5sYWJlbAk9ICJHUEMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BEKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0RfTlIsCisJCQkubGFiZWwJPSAiR1BEIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjQ1MF9HUEtfQkFTRSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BLKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0tfTlIsCisJCQkubGFiZWwJPSAiR1BLIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NTBfZ3Bpb3NfNGJpdDJbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NTAKKwl7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEdfQkFTRSArIDB4NCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BHKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0dfTlIsCisJCQkubGFiZWwJPSAiR1BHIiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gUzVQNjRYMF9HUEhfQkFTRSArIDB4NCwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UDY0NTBfR1BIKDApLAorCQkJLm5ncGlvCT0gUzVQNjQ1MF9HUElPX0hfTlIsCisJCQkubGFiZWwJPSAiR1BIIiwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIHM1cDY0NTBfZ3Bpb3NfcmJhbmtbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UDY0NTAKKwl7CisJCS5iYXNlCT0gUzVQNjRYMF9HUFJfQkFTRSArIDB4NCwKKwkJLmNvbmZpZwk9ICZzNXA2NHgwX2dwaW9fY2ZnX3JiYW5rLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQNjQ1MF9HUFIoMCksCisJCQkubmdwaW8JPSBTNVA2NDUwX0dQSU9fUl9OUiwKKwkJCS5sYWJlbAk9ICJHUFIiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwNjQ1MF9ncGlvc18yYml0W10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVA2NDUwCisJeworCQkuYmFzZQk9IFM1UDY0WDBfR1BGX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQRigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19GX05SLAorCQkJLmxhYmVsCT0gIkdQRiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BJX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQSSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19JX05SLAorCQkJLmxhYmVsCT0gIkdQSSIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BKX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQSigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19KX05SLAorCQkJLmxhYmVsCT0gIkdQSiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BOX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQTigwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19OX05SLAorCQkJLmxhYmVsCT0gIkdQTiIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0WDBfR1BQX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQUCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19QX05SLAorCQkJLmxhYmVsCT0gIkdQUCIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0NTBfR1BRX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNV0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQUSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19RX05SLAorCQkJLmxhYmVsCT0gIkdQUSIsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IFM1UDY0NTBfR1BTX0JBU0UsCisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbNl0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVA2NDUwX0dQUygwKSwKKwkJCS5uZ3Bpbwk9IFM1UDY0NTBfR1BJT19TX05SLAorCQkJLmxhYmVsCT0gIkdQUyIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIFM1UEMxMDAgR1BJTyBiYW5rIHN1bW1hcnk6CisgKgorICogQmFuawlHUElPcwlTdHlsZQlJTlQgVHlwZQorICogQTAJOAk0Qml0CUdQSU9fSU5UMAorICogQTEJNQk0Qml0CUdQSU9fSU5UMQorICogQgk4CTRCaXQJR1BJT19JTlQyCisgKiBDCTUJNEJpdAlHUElPX0lOVDMKKyAqIEQJNwk0Qml0CUdQSU9fSU5UNAorICogRTAJOAk0Qml0CUdQSU9fSU5UNQorICogRTEJNgk0Qml0CUdQSU9fSU5UNgorICogRjAJOAk0Qml0CUdQSU9fSU5UNworICogRjEJOAk0Qml0CUdQSU9fSU5UOAorICogRjIJOAk0Qml0CUdQSU9fSU5UOQorICogRjMJNAk0Qml0CUdQSU9fSU5UMTAKKyAqIEcwCTgJNEJpdAlHUElPX0lOVDExCisgKiBHMQkzCTRCaXQJR1BJT19JTlQxMgorICogRzIJNwk0Qml0CUdQSU9fSU5UMTMKKyAqIEczCTcJNEJpdAlHUElPX0lOVDE0CisgKiBIMAk4CTRCaXQJV0tVUF9JTlQKKyAqIEgxCTgJNEJpdAlXS1VQX0lOVAorICogSDIJOAk0Qml0CVdLVVBfSU5UCisgKiBIMwk4CTRCaXQJV0tVUF9JTlQKKyAqIEkJOAk0Qml0CUdQSU9fSU5UMTUKKyAqIEowCTgJNEJpdAlHUElPX0lOVDE2CisgKiBKMQk1CTRCaXQJR1BJT19JTlQxNworICogSjIJOAk0Qml0CUdQSU9fSU5UMTgKKyAqIEozCTgJNEJpdAlHUElPX0lOVDE5CisgKiBKNAk0CTRCaXQJR1BJT19JTlQyMAorICogSzAJOAk0Qml0CU5vbmUKKyAqIEsxCTYJNEJpdAlOb25lCisgKiBLMgk4CTRCaXQJTm9uZQorICogSzMJOAk0Qml0CU5vbmUKKyAqIEwwCTgJNEJpdAlOb25lCisgKiBMMQk4CTRCaXQJTm9uZQorICogTDIJOAk0Qml0CU5vbmUKKyAqIEwzCTgJNEJpdAlOb25lCisgKi8KKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBzNXBjMTAwX2dwaW9zXzRiaXRbXSA9IHsKKyNpZmRlZiBDT05GSUdfQ1BVX1M1UEMxMDAKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQQTAoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fQTBfTlIsCisJCQkubGFiZWwJPSAiR1BBMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEExKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0ExX05SLAorCQkJLmxhYmVsCT0gIkdQQTEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BCKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0JfTlIsCisJCQkubGFiZWwJPSAiR1BCIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQQygwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19DX05SLAorCQkJLmxhYmVsCT0gIkdQQyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEQoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRF9OUiwKKwkJCS5sYWJlbAk9ICJHUEQiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BFMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19FMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEUwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRTEoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRTFfTlIsCisJCQkubGFiZWwJPSAiR1BFMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEYwKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YwX05SLAorCQkJLmxhYmVsCT0gIkdQRjAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BGMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19GMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEYxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRjIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRjJfTlIsCisJCQkubGFiZWwJPSAiR1BGMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEYzKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0YzX05SLAorCQkJLmxhYmVsCT0gIkdQRjMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BHMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEcwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQRzEoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fRzFfTlIsCisJCQkubGFiZWwJPSAiR1BHMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEcyKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0cyX05SLAorCQkJLmxhYmVsCT0gIkdQRzIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BHMygwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19HM19OUiwKKwkJCS5sYWJlbAk9ICJHUEczIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19JX05SLAorCQkJLmxhYmVsCT0gIkdQSSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEowKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0owX05SLAorCQkJLmxhYmVsCT0gIkdQSjAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BKMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEoxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSjIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSjJfTlIsCisJCQkubGFiZWwJPSAiR1BKMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEozKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0ozX05SLAorCQkJLmxhYmVsCT0gIkdQSjMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BKNCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19KNF9OUiwKKwkJCS5sYWJlbAk9ICJHUEo0IiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzAoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzBfTlIsCisJCQkubGFiZWwJPSAiR1BLMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEsxKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0sxX05SLAorCQkJLmxhYmVsCT0gIkdQSzEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BLMigwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19LMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEsyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQSzMoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fSzNfTlIsCisJCQkubGFiZWwJPSAiR1BLMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEwwKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wwX05SLAorCQkJLmxhYmVsCT0gIkdQTDAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BMMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEwxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBDMTAwX0dQTDIoMCksCisJCQkubmdwaW8JPSBTNVBDMTAwX0dQSU9fTDJfTlIsCisJCQkubGFiZWwJPSAiR1BMMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEwzKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0wzX05SLAorCQkJLmxhYmVsCT0gIkdQTDMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BMNCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19MNF9OUiwKKwkJCS5sYWJlbAk9ICJHUEw0IiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDMDApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UEMxMDBfR1BIMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UEMxMDBfR1BJT19IMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEgwIiwKKwkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMyMCksCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDgpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEgxKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gxX05SLAorCQkJLmxhYmVsCT0gIkdQSDEiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzQwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMTYpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEgyKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gyX05SLAorCQkJLmxhYmVsCT0gIkdQSDIiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzYwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMjQpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQQzEwMF9HUEgzKDApLAorCQkJLm5ncGlvCT0gUzVQQzEwMF9HUElPX0gzX05SLAorCQkJLmxhYmVsCT0gIkdQSDMiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIEZvbGxvd2luZ3MgYXJlIHRoZSBncGlvIGJhbmtzIGluIFM1UFYyMTAvUzVQQzExMAorICoKKyAqIFRoZSAnY29uZmlnJyBtZW1iZXIgd2hlbiBsZWZ0IHRvIE5VTEwsIGlzIGluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0CisgKiBzdHJ1Y3R1cmUgc2Ftc3VuZ19ncGlvX2NmZ3NbM10gaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCisgKgorICogVGhlICdiYXNlJyBtZW1iZXIgaXMgYWxzbyBpbml0aWFsaXplZCBpbiB0aGUgaW5pdCBmdW5jdGlvbiBiZWxvdy4KKyAqIE5vdGU6IFRoZSBpbml0aWFsaXphdGlvbiBvZiAnYmFzZScgbWVtYmVyIG9mIHNhbXN1bmdfZ3Bpb19jaGlwIHN0cnVjdHVyZQorICogdXNlcyB0aGUgYWJvdmUgbWFjcm8gYW5kIGRlcGVuZHMgb24gdGhlIGJhbmtzIGJlaW5nIGxpc3RlZCBpbiBvcmRlciBoZXJlLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgczVwdjIxMF9ncGlvc180Yml0W10gPSB7CisjaWZkZWYgQ09ORklHX0NQVV9TNVBWMjEwCisJeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEEwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0EwX05SLAorCQkJLmxhYmVsCT0gIkdQQTAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BBMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19BMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEExIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQQigwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19CX05SLAorCQkJLmxhYmVsCT0gIkdQQiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEMwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0MwX05SLAorCQkJLmxhYmVsCT0gIkdQQzAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BDMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19DMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEMxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRDAoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRDBfTlIsCisJCQkubGFiZWwJPSAiR1BEMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEQxKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0QxX05SLAorCQkJLmxhYmVsCT0gIkdQRDEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BFMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19FMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEUwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRTEoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRTFfTlIsCisJCQkubGFiZWwJPSAiR1BFMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEYwKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YwX05SLAorCQkJLmxhYmVsCT0gIkdQRjAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BGMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19GMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEYxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRjIoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRjJfTlIsCisJCQkubGFiZWwJPSAiR1BGMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEYzKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0YzX05SLAorCQkJLmxhYmVsCT0gIkdQRjMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BHMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEcwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQRzEoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fRzFfTlIsCisJCQkubGFiZWwJPSAiR1BHMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEcyKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0cyX05SLAorCQkJLmxhYmVsCT0gIkdQRzIiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BHMygwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19HM19OUiwKKwkJCS5sYWJlbAk9ICJHUEczIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19JX05SLAorCQkJLmxhYmVsCT0gIkdQSSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEowKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0owX05SLAorCQkJLmxhYmVsCT0gIkdQSjAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BKMSgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEoxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX0dQSjIoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fSjJfTlIsCisJCQkubGFiZWwJPSAiR1BKMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEozKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0ozX05SLAorCQkJLmxhYmVsCT0gIkdQSjMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BKNCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19KNF9OUiwKKwkJCS5sYWJlbAk9ICJHUEo0IiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX01QMDEoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwMV9OUiwKKwkJCS5sYWJlbAk9ICJNUDAxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX01QMDIoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwMl9OUiwKKwkJCS5sYWJlbAk9ICJNUDAyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX01QMDMoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwM19OUiwKKwkJCS5sYWJlbAk9ICJNUDAzIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX01QMDQoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwNF9OUiwKKwkJCS5sYWJlbAk9ICJNUDA0IiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBTNVBWMjEwX01QMDUoMCksCisJCQkubmdwaW8JPSBTNVBWMjEwX0dQSU9fTVAwNV9OUiwKKwkJCS5sYWJlbAk9ICJNUDA1IiwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPICsgMHhDMDApLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IFM1UFYyMTBfR1BIMCgwKSwKKwkJCS5uZ3Bpbwk9IFM1UFYyMTBfR1BJT19IMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEgwIiwKKwkJCS50b19pcnEgPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8gKyAweEMyMCksCisJCS5pcnFfYmFzZSA9IElSUV9FSU5UKDgpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEgxKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gxX05SLAorCQkJLmxhYmVsCT0gIkdQSDEiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzQwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMTYpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEgyKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gyX05SLAorCQkJLmxhYmVsCT0gIkdQSDIiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwgeworCQkuYmFzZQk9IChTNVBfVkFfR1BJTyArIDB4QzYwKSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMjQpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gUzVQVjIxMF9HUEgzKDApLAorCQkJLm5ncGlvCT0gUzVQVjIxMF9HUElPX0gzX05SLAorCQkJLmxhYmVsCT0gIkdQSDMiLAorCQkJLnRvX2lycSA9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIEZvbGxvd2luZ3MgYXJlIHRoZSBncGlvIGJhbmtzIGluIEVYWU5PUzQyMTAKKyAqCisgKiBUaGUgJ2NvbmZpZycgbWVtYmVyIHdoZW4gbGVmdCB0byBOVUxMLCBpcyBpbml0aWFsaXplZCB0byB0aGUgZGVmYXVsdAorICogc3RydWN0dXJlIHNhbXN1bmdfZ3Bpb19jZmdzWzNdIGluIHRoZSBpbml0IGZ1bmN0aW9uIGJlbG93LgorICoKKyAqIFRoZSAnYmFzZScgbWVtYmVyIGlzIGFsc28gaW5pdGlhbGl6ZWQgaW4gdGhlIGluaXQgZnVuY3Rpb24gYmVsb3cuCisgKiBOb3RlOiBUaGUgaW5pdGlhbGl6YXRpb24gb2YgJ2Jhc2UnIG1lbWJlciBvZiBzYW1zdW5nX2dwaW9fY2hpcCBzdHJ1Y3R1cmUKKyAqIHVzZXMgdGhlIGFib3ZlIG1hY3JvIGFuZCBkZXBlbmRzIG9uIHRoZSBiYW5rcyBiZWluZyBsaXN0ZWQgaW4gb3JkZXIgaGVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwIGV4eW5vczRfZ3Bpb3NfMVtdID0geworI2lmZGVmIENPTkZJR19BUkNIX0VYWU5PUzQKKwl7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQQTAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQTBfTlIsCisJCQkubGFiZWwJPSAiR1BBMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEExKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0ExX05SLAorCQkJLmxhYmVsCT0gIkdQQTEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BCKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0JfTlIsCisJCQkubGFiZWwJPSAiR1BCIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQQzAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fQzBfTlIsCisJCQkubGFiZWwJPSAiR1BDMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEMxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0MxX05SLAorCQkJLmxhYmVsCT0gIkdQQzEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BEMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19EMF9OUiwKKwkJCS5sYWJlbAk9ICJHUEQwIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRDEoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRDFfTlIsCisJCQkubGFiZWwJPSAiR1BEMSIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEUwKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UwX05SLAorCQkJLmxhYmVsCT0gIkdQRTAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BFMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEUxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRTIoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRTJfTlIsCisJCQkubGFiZWwJPSAiR1BFMiIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEUzKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0UzX05SLAorCQkJLmxhYmVsCT0gIkdQRTMiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BFNCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19FNF9OUiwKKwkJCS5sYWJlbAk9ICJHUEU0IiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjBfTlIsCisJCQkubGFiZWwJPSAiR1BGMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEYxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0YxX05SLAorCQkJLmxhYmVsCT0gIkdQRjEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BGMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19GMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEYyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQRjMoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fRjNfTlIsCisJCQkubGFiZWwJPSAiR1BGMyIsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBleHlub3M0X2dwaW9zXzJbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVJDSF9FWFlOT1M0CisJeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEowKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0owX05SLAorCQkJLmxhYmVsCT0gIkdQSjAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BKMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19KMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEoxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQSzAoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSzBfTlIsCisJCQkubGFiZWwJPSAiR1BLMCIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEsxKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0sxX05SLAorCQkJLmxhYmVsCT0gIkdQSzEiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BLMigwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19LMl9OUiwKKwkJCS5sYWJlbAk9ICJHUEsyIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQSzMoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fSzNfTlIsCisJCQkubGFiZWwJPSAiR1BLMyIsCisJCX0sCisJfSwgeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUEwwKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX0wwX05SLAorCQkJLmxhYmVsCT0gIkdQTDAiLAorCQl9LAorCX0sIHsKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BMMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19MMV9OUiwKKwkJCS5sYWJlbAk9ICJHUEwxIiwKKwkJfSwKKwl9LCB7CisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQTDIoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fTDJfTlIsCisJCQkubGFiZWwJPSAiR1BMMiIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzhdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFkwKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1kwX05SLAorCQkJLmxhYmVsCT0gIkdQWTAiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s4XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BZMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZMV9OUiwKKwkJCS5sYWJlbAk9ICJHUFkxIiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTIoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTJfTlIsCisJCQkubGFiZWwJPSAiR1BZMiIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzhdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFkzKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1kzX05SLAorCQkJLmxhYmVsCT0gIkdQWTMiLAorCQl9LAorCX0sIHsKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s4XSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BZNCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19ZNF9OUiwKKwkJCS5sYWJlbAk9ICJHUFk0IiwKKwkJfSwKKwl9LCB7CisJCS5jb25maWcJPSAmc2Ftc3VuZ19ncGlvX2NmZ3NbOF0sCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWTUoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWTVfTlIsCisJCQkubGFiZWwJPSAiR1BZNSIsCisJCX0sCisJfSwgeworCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzhdLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFk2KDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1k2X05SLAorCQkJLmxhYmVsCT0gIkdQWTYiLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8yICsgMHhDMDApLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzldLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgwKSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BYMCgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19YMF9OUiwKKwkJCS5sYWJlbAk9ICJHUFgwIiwKKwkJCS50b19pcnEJPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8yICsgMHhDMjApLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzldLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCg4KSwKKwkJLmNoaXAJPSB7CisJCQkuYmFzZQk9IEVYWU5PUzRfR1BYMSgwKSwKKwkJCS5uZ3Bpbwk9IEVYWU5PUzRfR1BJT19YMV9OUiwKKwkJCS5sYWJlbAk9ICJHUFgxIiwKKwkJCS50b19pcnEJPSBzYW1zdW5nX2dwaW9saWJfdG9faXJxLAorCQl9LAorCX0sIHsKKwkJLmJhc2UJPSAoUzVQX1ZBX0dQSU8yICsgMHhDNDApLAorCQkuY29uZmlnCT0gJnNhbXN1bmdfZ3Bpb19jZmdzWzldLAorCQkuaXJxX2Jhc2UgPSBJUlFfRUlOVCgxNiksCisJCS5jaGlwCT0geworCQkJLmJhc2UJPSBFWFlOT1M0X0dQWDIoMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWDJfTlIsCisJCQkubGFiZWwJPSAiR1BYMiIsCisJCQkudG9faXJxCT0gc2Ftc3VuZ19ncGlvbGliX3RvX2lycSwKKwkJfSwKKwl9LCB7CisJCS5iYXNlCT0gKFM1UF9WQV9HUElPMiArIDB4QzYwKSwKKwkJLmNvbmZpZwk9ICZzYW1zdW5nX2dwaW9fY2Znc1s5XSwKKwkJLmlycV9iYXNlID0gSVJRX0VJTlQoMjQpLAorCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFgzKDApLAorCQkJLm5ncGlvCT0gRVhZTk9TNF9HUElPX1gzX05SLAorCQkJLmxhYmVsCT0gIkdQWDMiLAorCQkJLnRvX2lycQk9IHNhbXN1bmdfZ3Bpb2xpYl90b19pcnEsCisJCX0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCBleHlub3M0X2dwaW9zXzNbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVJDSF9FWFlOT1M0CisJeworCQkuY2hpcAk9IHsKKwkJCS5iYXNlCT0gRVhZTk9TNF9HUFooMCksCisJCQkubmdwaW8JPSBFWFlOT1M0X0dQSU9fWl9OUiwKKwkJCS5sYWJlbAk9ICJHUFoiLAorCQl9LAorCX0sCisjZW5kaWYKK307CisKKy8qIFRPRE86IGNsZWFudXAgc29jX2lzXyogKi8KK3N0YXRpYyBfX2luaXQgaW50IHNhbXN1bmdfZ3Bpb2xpYl9pbml0KHZvaWQpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwOworCWludCBpLCBucl9jaGlwczsKKwlpbnQgZ3JvdXAgPSAwOworCisJc2Ftc3VuZ19ncGlvbGliX3NldF9jZmcoc2Ftc3VuZ19ncGlvX2NmZ3MsIEFSUkFZX1NJWkUoc2Ftc3VuZ19ncGlvX2NmZ3MpKTsKKworCWlmIChzb2NfaXNfczNjMjR4eCgpKSB7CisJCXMzYzI0eHhfZ3Bpb2xpYl9hZGRfY2hpcHMoczNjMjR4eF9ncGlvcywKKwkJCQlBUlJBWV9TSVpFKHMzYzI0eHhfZ3Bpb3MpLCBTM0MyNFhYX1ZBX0dQSU8pOworCX0gZWxzZSBpZiAoc29jX2lzX3MzYzY0eHgoKSkgeworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzJiaXRfY2hpcHMoczNjNjR4eF9ncGlvc18yYml0LAorCQkJCUFSUkFZX1NJWkUoczNjNjR4eF9ncGlvc18yYml0KSwKKwkJCQlTM0M2NFhYX1ZBX0dQSU8gKyAweEUwLCAweDIwKTsKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHMzYzY0eHhfZ3Bpb3NfNGJpdCwKKwkJCQlBUlJBWV9TSVpFKHMzYzY0eHhfZ3Bpb3NfNGJpdCksCisJCQkJUzNDNjRYWF9WQV9HUElPKTsKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0Ml9jaGlwcyhzM2M2NHh4X2dwaW9zXzRiaXQyLAorCQkJCUFSUkFZX1NJWkUoczNjNjR4eF9ncGlvc180Yml0MikpOworCX0gZWxzZSBpZiAoc29jX2lzX3M1cDY0NDAoKSkgeworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzJiaXRfY2hpcHMoczVwNjQ0MF9ncGlvc18yYml0LAorCQkJCUFSUkFZX1NJWkUoczVwNjQ0MF9ncGlvc18yYml0KSwgTlVMTCwgMHgwKTsKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHM1cDY0NDBfZ3Bpb3NfNGJpdCwKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NDBfZ3Bpb3NfNGJpdCksIFM1UF9WQV9HUElPKTsKKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0Ml9jaGlwcyhzNXA2NDQwX2dwaW9zXzRiaXQyLAorCQkJCUFSUkFZX1NJWkUoczVwNjQ0MF9ncGlvc180Yml0MikpOworCQlzNXA2NHgwX2dwaW9saWJfYWRkX3JiYW5rKHM1cDY0NDBfZ3Bpb3NfcmJhbmssCisJCQkJQVJSQVlfU0laRShzNXA2NDQwX2dwaW9zX3JiYW5rKSk7CisJfSBlbHNlIGlmIChzb2NfaXNfczVwNjQ1MCgpKSB7CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfMmJpdF9jaGlwcyhzNXA2NDUwX2dwaW9zXzJiaXQsCisJCQkJQVJSQVlfU0laRShzNXA2NDUwX2dwaW9zXzJiaXQpLCBOVUxMLCAweDApOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoczVwNjQ1MF9ncGlvc180Yml0LAorCQkJCUFSUkFZX1NJWkUoczVwNjQ1MF9ncGlvc180Yml0KSwgUzVQX1ZBX0dQSU8pOworCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXQyX2NoaXBzKHM1cDY0NTBfZ3Bpb3NfNGJpdDIsCisJCQkJQVJSQVlfU0laRShzNXA2NDUwX2dwaW9zXzRiaXQyKSk7CisJCXM1cDY0eDBfZ3Bpb2xpYl9hZGRfcmJhbmsoczVwNjQ1MF9ncGlvc19yYmFuaywKKwkJCQlBUlJBWV9TSVpFKHM1cDY0NTBfZ3Bpb3NfcmJhbmspKTsKKwl9IGVsc2UgaWYgKHNvY19pc19zNXBjMTAwKCkpIHsKKwkJZ3JvdXAgPSAwOworCQljaGlwID0gczVwYzEwMF9ncGlvc180Yml0OworCQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoczVwYzEwMF9ncGlvc180Yml0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCQlpZiAoIWNoaXAtPmNvbmZpZykgeworCQkJCWNoaXAtPmNvbmZpZyA9ICZzYW1zdW5nX2dwaW9fY2Znc1szXTsKKwkJCQljaGlwLT5ncm91cCA9IGdyb3VwKys7CisJCQl9CisJCX0KKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHM1cGMxMDBfZ3Bpb3NfNGJpdCwgbnJfY2hpcHMsIFM1UF9WQV9HUElPKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQQzEwMCkgJiYgZGVmaW5lZChDT05GSUdfUzVQX0dQSU9fSU5UKQorCQlzNXBfcmVnaXN0ZXJfZ3Bpb2ludF9iYW5rKElSUV9HUElPSU5ULCAwLCBTNVBfR1BJT0lOVF9HUk9VUF9NQVhOUik7CisjZW5kaWYKKwl9IGVsc2UgaWYgKHNvY19pc19zNXB2MjEwKCkpIHsKKwkJZ3JvdXAgPSAwOworCQljaGlwID0gczVwdjIxMF9ncGlvc180Yml0OworCQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoczVwdjIxMF9ncGlvc180Yml0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCQlpZiAoIWNoaXAtPmNvbmZpZykgeworCQkJCWNoaXAtPmNvbmZpZyA9ICZzYW1zdW5nX2dwaW9fY2Znc1szXTsKKwkJCQljaGlwLT5ncm91cCA9IGdyb3VwKys7CisJCQl9CisJCX0KKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKHM1cHYyMTBfZ3Bpb3NfNGJpdCwgbnJfY2hpcHMsIFM1UF9WQV9HUElPKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzVQVjIxMCkgJiYgZGVmaW5lZChDT05GSUdfUzVQX0dQSU9fSU5UKQorCQlzNXBfcmVnaXN0ZXJfZ3Bpb2ludF9iYW5rKElSUV9HUElPSU5ULCAwLCBTNVBfR1BJT0lOVF9HUk9VUF9NQVhOUik7CisjZW5kaWYKKwl9IGVsc2UgaWYgKHNvY19pc19leHlub3M0MjEwKCkpIHsKKwkJZ3JvdXAgPSAwOworCisJCS8qIGdwaW8gcGFydDEgKi8KKwkJY2hpcCA9IGV4eW5vczRfZ3Bpb3NfMTsKKwkJbnJfY2hpcHMgPSBBUlJBWV9TSVpFKGV4eW5vczRfZ3Bpb3NfMSk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2NoaXBzOyBpKyssIGNoaXArKykgeworCQkJaWYgKCFjaGlwLT5jb25maWcpIHsKKwkJCQljaGlwLT5jb25maWcgPSAmZXh5bm9zNF9ncGlvX2NmZzsKKwkJCQljaGlwLT5ncm91cCA9IGdyb3VwKys7CisJCQl9CisJCX0KKwkJc2Ftc3VuZ19ncGlvbGliX2FkZF80Yml0X2NoaXBzKGV4eW5vczRfZ3Bpb3NfMSwgbnJfY2hpcHMsIFM1UF9WQV9HUElPMSk7CisKKwkJLyogZ3BpbyBwYXJ0MiAqLworCQljaGlwID0gZXh5bm9zNF9ncGlvc18yOworCQlucl9jaGlwcyA9IEFSUkFZX1NJWkUoZXh5bm9zNF9ncGlvc18yKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hpcHM7IGkrKywgY2hpcCsrKSB7CisJCQlpZiAoIWNoaXAtPmNvbmZpZykgeworCQkJCWNoaXAtPmNvbmZpZyA9ICZleHlub3M0X2dwaW9fY2ZnOworCQkJCWNoaXAtPmdyb3VwID0gZ3JvdXArKzsKKwkJCX0KKwkJfQorCQlzYW1zdW5nX2dwaW9saWJfYWRkXzRiaXRfY2hpcHMoZXh5bm9zNF9ncGlvc18yLCBucl9jaGlwcywgUzVQX1ZBX0dQSU8yKTsKKworCQkvKiBncGlvIHBhcnQzICovCisJCWNoaXAgPSBleHlub3M0X2dwaW9zXzM7CisJCW5yX2NoaXBzID0gQVJSQVlfU0laRShleHlub3M0X2dwaW9zXzMpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaGlwczsgaSsrLCBjaGlwKyspIHsKKwkJCWlmICghY2hpcC0+Y29uZmlnKSB7CisJCQkJY2hpcC0+Y29uZmlnID0gJmV4eW5vczRfZ3Bpb19jZmc7CisJCQkJY2hpcC0+Z3JvdXAgPSBncm91cCsrOworCQkJfQorCQl9CisJCXNhbXN1bmdfZ3Bpb2xpYl9hZGRfNGJpdF9jaGlwcyhleHlub3M0X2dwaW9zXzMsIG5yX2NoaXBzLCBTNVBfVkFfR1BJTzMpOworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0VYWU5PUzQyMTApICYmIGRlZmluZWQoQ09ORklHX1M1UF9HUElPX0lOVCkKKwkJczVwX3JlZ2lzdGVyX2dwaW9pbnRfYmFuayhJUlFfR1BJT19YQSwgMCwgSVJRX0dQSU8xX05SX0dST1VQUyk7CisJCXM1cF9yZWdpc3Rlcl9ncGlvaW50X2JhbmsoSVJRX0dQSU9fWEIsIElSUV9HUElPMV9OUl9HUk9VUFMsIElSUV9HUElPMl9OUl9HUk9VUFMpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJV0FSTigxLCAiVW5rbm93biBTb0MgaW4gZ3Bpby1zYW1zdW5nLCBubyBHUElPcyBhZGRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChzYW1zdW5nX2dwaW9saWJfaW5pdCk7CisKK2ludCBzM2NfZ3Bpb19jZmdwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9mZnNldDsKKwlpbnQgcmV0OworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKworCXNhbXN1bmdfZ3Bpb19sb2NrKGNoaXAsIGZsYWdzKTsKKwlyZXQgPSBzYW1zdW5nX2dwaW9fZG9fc2V0Y2ZnKGNoaXAsIG9mZnNldCwgY29uZmlnKTsKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHMzY19ncGlvX2NmZ3Bpbik7CisKK2ludCBzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UodW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnIsCisJCQkgIHVuc2lnbmVkIGludCBjZmcpCit7CisJaW50IHJldDsKKworCWZvciAoOyBuciA+IDA7IG5yLS0sIHN0YXJ0KyspIHsKKwkJcmV0ID0gczNjX2dwaW9fY2ZncGluKHN0YXJ0LCBjZmcpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoczNjX2dwaW9fY2ZncGluX3JhbmdlKTsKKworaW50IHMzY19ncGlvX2NmZ2FsbF9yYW5nZSh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuciwKKwkJCSAgdW5zaWduZWQgaW50IGNmZywgc2Ftc3VuZ19ncGlvX3B1bGxfdCBwdWxsKQoreworCWludCByZXQ7CisKKwlmb3IgKDsgbnIgPiAwOyBuci0tLCBzdGFydCsrKSB7CisJCXMzY19ncGlvX3NldHB1bGwoc3RhcnQsIHB1bGwpOworCQlyZXQgPSBzM2NfZ3Bpb19jZmdwaW4oc3RhcnQsIGNmZyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzM2NfZ3Bpb19jZmdhbGxfcmFuZ2UpOworCit1bnNpZ25lZCBzM2NfZ3Bpb19nZXRjZmcodW5zaWduZWQgaW50IHBpbikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcmV0ID0gMDsKKwlpbnQgb2Zmc2V0OworCisJaWYgKGNoaXApIHsKKwkJb2Zmc2V0ID0gcGluIC0gY2hpcC0+Y2hpcC5iYXNlOworCisJCXNhbXN1bmdfZ3Bpb19sb2NrKGNoaXAsIGZsYWdzKTsKKwkJcmV0ID0gc2Ftc3VuZ19ncGlvX2RvX2dldGNmZyhjaGlwLCBvZmZzZXQpOworCQlzYW1zdW5nX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzM2NfZ3Bpb19nZXRjZmcpOworCitpbnQgczNjX2dwaW9fc2V0cHVsbCh1bnNpZ25lZCBpbnQgcGluLCBzYW1zdW5nX2dwaW9fcHVsbF90IHB1bGwpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzZXQsIHJldDsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZmZzZXQgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisKKwlzYW1zdW5nX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7CisJcmV0ID0gc2Ftc3VuZ19ncGlvX2RvX3NldHB1bGwoY2hpcCwgb2Zmc2V0LCBwdWxsKTsKKwlzYW1zdW5nX2dwaW9fdW5sb2NrKGNoaXAsIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHMzY19ncGlvX3NldHB1bGwpOworCitzYW1zdW5nX2dwaW9fcHVsbF90IHMzY19ncGlvX2dldHB1bGwodW5zaWduZWQgaW50IHBpbikKK3sKKwlzdHJ1Y3Qgc2Ftc3VuZ19ncGlvX2NoaXAgKmNoaXAgPSBzYW1zdW5nX2dwaW9saWJfZ2V0Y2hpcChwaW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9mZnNldDsKKwl1MzIgcHVwID0gMDsKKworCWlmIChjaGlwKSB7CisJCW9mZnNldCA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKworCQlzYW1zdW5nX2dwaW9fbG9jayhjaGlwLCBmbGFncyk7CisJCXB1cCA9IHNhbXN1bmdfZ3Bpb19kb19nZXRwdWxsKGNoaXAsIG9mZnNldCk7CisJCXNhbXN1bmdfZ3Bpb191bmxvY2soY2hpcCwgZmxhZ3MpOworCX0KKworCXJldHVybiAoX19mb3JjZSBzYW1zdW5nX2dwaW9fcHVsbF90KXB1cDsKK30KK0VYUE9SVF9TWU1CT0woczNjX2dwaW9fZ2V0cHVsbCk7CisKKy8qIGdwaW9saWIgd3JhcHBlcnMgdW50aWwgdGhlc2UgYXJlIHRvdGFsbHkgZWxpbWluYXRlZCAqLworCit2b2lkIHMzYzI0MTBfZ3Bpb19wdWxsdXAodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKQoreworCWludCByZXQ7CisKKwlXQVJOX09OKHRvKTsJLyogc2hvdWxkIGJlIG5vbmUgb2YgdGhlc2UgbGVmdCAqLworCisJaWYgKCF0bykgeworCQkvKiBpZiBwdWxsIGlzIGVuYWJsZWQsIHRyeSBmaXJzdCB3aXRoIHVwLCBhbmQgaWYgdGhhdAorCQkgKiBmYWlscywgdHJ5IHVzaW5nIGRvd24gKi8KKworCQlyZXQgPSBzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9VUCk7CisJCWlmIChyZXQpCisJCQlzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9ET1dOKTsKKwl9IGVsc2UgeworCQlzM2NfZ3Bpb19zZXRwdWxsKHBpbiwgUzNDX0dQSU9fUFVMTF9OT05FKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19wdWxsdXApOworCit2b2lkIHMzYzI0MTBfZ3Bpb19zZXRwaW4odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHRvKQoreworCS8qIGRvIHRoaXMgdmlhIGdwaW9saWIgdW50aWwgYWxsIHVzZXJzIHJlbW92ZWQgKi8KKworCWdwaW9fcmVxdWVzdChwaW4sICJ0ZW1wb3JhcnkiKTsKKwlncGlvX3NldF92YWx1ZShwaW4sIHRvKTsKKwlncGlvX2ZyZWUocGluKTsKK30KK0VYUE9SVF9TWU1CT0woczNjMjQxMF9ncGlvX3NldHBpbik7CisKK3Vuc2lnbmVkIGludCBzM2MyNDEwX2dwaW9fZ2V0cGluKHVuc2lnbmVkIGludCBwaW4pCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoY2hpcC0+YmFzZSArIDB4MDQpICYgKDEgPDwgb2Zmcyk7Cit9CitFWFBPUlRfU1lNQk9MKHMzYzI0MTBfZ3Bpb19nZXRwaW4pOworCisjaWZkZWYgQ09ORklHX1M1UF9HUElPX0RSVlNUUgorczVwX2dwaW9fZHJ2c3RyX3QgczVwX2dwaW9fZ2V0X2RydnN0cih1bnNpZ25lZCBpbnQgcGluKQoreworCXN0cnVjdCBzYW1zdW5nX2dwaW9fY2hpcCAqY2hpcCA9IHNhbXN1bmdfZ3Bpb2xpYl9nZXRjaGlwKHBpbik7CisJdW5zaWduZWQgaW50IG9mZjsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwlpbnQgc2hpZnQ7CisJdTMyIGRydnN0cjsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZmYgPSBwaW4gLSBjaGlwLT5jaGlwLmJhc2U7CisJc2hpZnQgPSBvZmYgKiAyOworCXJlZyA9IGNoaXAtPmJhc2UgKyAweDBDOworCisJZHJ2c3RyID0gX19yYXdfcmVhZGwocmVnKTsKKwlkcnZzdHIgPSBkcnZzdHIgPj4gc2hpZnQ7CisJZHJ2c3RyICY9IDB4MzsKKworCXJldHVybiAoX19mb3JjZSBzNXBfZ3Bpb19kcnZzdHJfdClkcnZzdHI7Cit9CitFWFBPUlRfU1lNQk9MKHM1cF9ncGlvX2dldF9kcnZzdHIpOworCitpbnQgczVwX2dwaW9fc2V0X2RydnN0cih1bnNpZ25lZCBpbnQgcGluLCBzNXBfZ3Bpb19kcnZzdHJfdCBkcnZzdHIpCit7CisJc3RydWN0IHNhbXN1bmdfZ3Bpb19jaGlwICpjaGlwID0gc2Ftc3VuZ19ncGlvbGliX2dldGNoaXAocGluKTsKKwl1bnNpZ25lZCBpbnQgb2ZmOworCXZvaWQgX19pb21lbSAqcmVnOworCWludCBzaGlmdDsKKwl1MzIgdG1wOworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZiA9IHBpbiAtIGNoaXAtPmNoaXAuYmFzZTsKKwlzaGlmdCA9IG9mZiAqIDI7CisJcmVnID0gY2hpcC0+YmFzZSArIDB4MEM7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChyZWcpOworCXRtcCAmPSB+KDB4MyA8PCBzaGlmdCk7CisJdG1wIHw9IGRydnN0ciA8PCBzaGlmdDsKKworCV9fcmF3X3dyaXRlbCh0bXAsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woczVwX2dwaW9fc2V0X2RydnN0cik7CisjZW5kaWYJLyogQ09ORklHX1M1UF9HUElPX0RSVlNUUiAqLworCisjaWZkZWYgQ09ORklHX1BMQVRfUzNDMjRYWAordW5zaWduZWQgaW50IHMzYzI0MTBfbW9kaWZ5X21pc2Njcih1bnNpZ25lZCBpbnQgY2xlYXIsIHVuc2lnbmVkIGludCBjaGFuZ2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1pc2NjcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltaXNjY3IgPSBfX3Jhd19yZWFkbChTM0MyNFhYX01JU0NDUik7CisJbWlzY2NyICY9IH5jbGVhcjsKKwltaXNjY3IgXj0gY2hhbmdlOworCV9fcmF3X3dyaXRlbChtaXNjY3IsIFMzQzI0WFhfTUlTQ0NSKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gbWlzY2NyOworfQorRVhQT1JUX1NZTUJPTChzM2MyNDEwX21vZGlmeV9taXNjY3IpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10ZWdyYS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdGVncmEuYwppbmRleCA3NDdlYjQwLi42MTA0NGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10ZWdyYS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRlZ3JhLmMKQEAgLTIwLDEzICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KIAorI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgogI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL3N1c3BlbmQuaD4KIApAQCAtMzQsOSArMzYsNyBAQAogI2RlZmluZSBHUElPX1BPUlQoeCkJCSgoKHgpID4+IDMpICYgMHgzKQogI2RlZmluZSBHUElPX0JJVCh4KQkJKCh4KSAmIDB4NykKIAotI2RlZmluZSBHUElPX1JFRyh4KQkJKElPX1RPX1ZJUlQoVEVHUkFfR1BJT19CQVNFKSArCVwKLQkJCQkgR1BJT19CQU5LKHgpICogMHg4MCArCQlcCi0JCQkJIEdQSU9fUE9SVCh4KSAqIDQpCisjZGVmaW5lIEdQSU9fUkVHKHgpCQkoR1BJT19CQU5LKHgpICogMHg4MCArIEdQSU9fUE9SVCh4KSAqIDQpCiAKICNkZWZpbmUgR1BJT19DTkYoeCkJCShHUElPX1JFRyh4KSArIDB4MDApCiAjZGVmaW5lIEdQSU9fT0UoeCkJCShHUElPX1JFRyh4KSArIDB4MTApCkBAIC03NSwxNSArNzUsMTggQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCB0ZWdyYV9ncGlvX2JhbmsgdGVncmFfZ3Bpb19iYW5rc1tdID0gewotCXsuYmFuayA9IDAsIC5pcnEgPSBJTlRfR1BJTzF9LAotCXsuYmFuayA9IDEsIC5pcnEgPSBJTlRfR1BJTzJ9LAotCXsuYmFuayA9IDIsIC5pcnEgPSBJTlRfR1BJTzN9LAotCXsuYmFuayA9IDMsIC5pcnEgPSBJTlRfR1BJTzR9LAotCXsuYmFuayA9IDQsIC5pcnEgPSBJTlRfR1BJTzV9LAotCXsuYmFuayA9IDUsIC5pcnEgPSBJTlRfR1BJTzZ9LAotCXsuYmFuayA9IDYsIC5pcnEgPSBJTlRfR1BJTzd9LAotfTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJlZ3M7CitzdGF0aWMgc3RydWN0IHRlZ3JhX2dwaW9fYmFuayB0ZWdyYV9ncGlvX2JhbmtzWzddOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfZ3Bpb193cml0ZWwodTMyIHZhbCwgdTMyIHJlZykKK3sKKwlfX3Jhd193cml0ZWwodmFsLCByZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdGVncmFfZ3Bpb19yZWFkbCh1MzIgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbChyZWdzICsgcmVnKTsKK30KIAogc3RhdGljIGludCB0ZWdyYV9ncGlvX2NvbXBvc2UoaW50IGJhbmssIGludCBwb3J0LCBpbnQgYml0KQogewpAQCAtOTcsNyArMTAwLDcgQEAKIAl2YWwgPSAweDEwMCA8PCBHUElPX0JJVChncGlvKTsKIAlpZiAodmFsdWUpCiAJCXZhbCB8PSAxIDw8IEdQSU9fQklUKGdwaW8pOwotCV9fcmF3X3dyaXRlbCh2YWwsIHJlZyk7CisJdGVncmFfZ3Bpb193cml0ZWwodmFsLCByZWcpOwogfQogCiB2b2lkIHRlZ3JhX2dwaW9fZW5hYmxlKGludCBncGlvKQpAQCAtMTE3LDcgKzEyMCw3IEBACiAKIHN0YXRpYyBpbnQgdGVncmFfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXJldHVybiAoX19yYXdfcmVhZGwoR1BJT19JTihvZmZzZXQpKSA+PiBHUElPX0JJVChvZmZzZXQpKSAmIDB4MTsKKwlyZXR1cm4gKHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTihvZmZzZXQpKSA+PiBHUElPX0JJVChvZmZzZXQpKSAmIDB4MTsKIH0KIAogc3RhdGljIGludCB0ZWdyYV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCkBAIC0xMzQsNyArMTM3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLQorc3RhdGljIGludCB0ZWdyYV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIFRFR1JBX0dQSU9fVE9fSVJRKG9mZnNldCk7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlZ3JhX2dwaW9fY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ0ZWdyYS1ncGlvIiwKQEAgLTE0Miw2ICsxNDgsNyBAQAogCS5nZXQJCQk9IHRlZ3JhX2dwaW9fZ2V0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gdGVncmFfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAogCS5zZXQJCQk9IHRlZ3JhX2dwaW9fc2V0LAorCS50b19pcnEJCQk9IHRlZ3JhX2dwaW9fdG9faXJxLAogCS5iYXNlCQkJPSAwLAogCS5uZ3BpbwkJCT0gVEVHUkFfTlJfR1BJT1MsCiB9OwpAQCAtMTUwLDcgKzE1Nyw3IEBACiB7CiAJaW50IGdwaW8gPSBkLT5pcnEgLSBJTlRfR1BJT19CQVNFOwogCi0JX19yYXdfd3JpdGVsKDEgPDwgR1BJT19CSVQoZ3BpbyksIEdQSU9fSU5UX0NMUihncGlvKSk7CisJdGVncmFfZ3Bpb193cml0ZWwoMSA8PCBHUElPX0JJVChncGlvKSwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKIH0KIAogc3RhdGljIHZvaWQgdGVncmFfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCkBAIC0yMDMsMTAgKzIxMCwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmx2bF9sb2NrW3BvcnRdLCBmbGFncyk7CiAKLQl2YWwgPSBfX3Jhd19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOworCXZhbCA9IHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKIAl2YWwgJj0gfihHUElPX0lOVF9MVkxfTUFTSyA8PCBHUElPX0JJVChncGlvKSk7CiAJdmFsIHw9IGx2bF90eXBlIDw8IEdQSU9fQklUKGdwaW8pOwotCV9fcmF3X3dyaXRlbCh2YWwsIEdQSU9fSU5UX0xWTChncGlvKSk7CisJdGVncmFfZ3Bpb193cml0ZWwodmFsLCBHUElPX0lOVF9MVkwoZ3BpbykpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+bHZsX2xvY2tbcG9ydF0sIGZsYWdzKTsKIApAQCAtMjMyLDEyICsyMzksMTIgQEAKIAogCWZvciAocG9ydCA9IDA7IHBvcnQgPCA0OyBwb3J0KyspIHsKIAkJaW50IGdwaW8gPSB0ZWdyYV9ncGlvX2NvbXBvc2UoYmFuay0+YmFuaywgcG9ydCwgMCk7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhID0gX19yYXdfcmVhZGwoR1BJT19JTlRfU1RBKGdwaW8pKSAmCi0JCQlfX3Jhd19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpOwotCQl1MzIgbHZsID0gX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKKwkJdW5zaWduZWQgbG9uZyBzdGEgPSB0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX1NUQShncGlvKSkgJgorCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpOworCQl1MzIgbHZsID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9MVkwoZ3BpbykpOwogCiAJCWZvcl9lYWNoX3NldF9iaXQocGluLCAmc3RhLCA4KSB7Ci0JCQlfX3Jhd193cml0ZWwoMSA8PCBwaW4sIEdQSU9fSU5UX0NMUihncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbCgxIDw8IHBpbiwgR1BJT19JTlRfQ0xSKGdwaW8pKTsKIAogCQkJLyogaWYgZ3BpbyBpcyBlZGdlIHRyaWdnZXJlZCwgY2xlYXIgY29uZGl0aW9uCiAJCQkgKiBiZWZvcmUgZXhlY3V0aW5nIHRoZSBoYW5kZXIgc28gdGhhdCB3ZSBkb24ndApAQCAtMjcxLDExICsyNzgsMTEgQEAKIAogCQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShiYW5rLT5vZSk7IHArKykgewogCQkJdW5zaWduZWQgaW50IGdwaW8gPSAoYjw8NSkgfCAocDw8Myk7Ci0JCQlfX3Jhd193cml0ZWwoYmFuay0+Y25mW3BdLCBHUElPX0NORihncGlvKSk7Ci0JCQlfX3Jhd193cml0ZWwoYmFuay0+b3V0W3BdLCBHUElPX09VVChncGlvKSk7Ci0JCQlfX3Jhd193cml0ZWwoYmFuay0+b2VbcF0sIEdQSU9fT0UoZ3BpbykpOwotCQkJX19yYXdfd3JpdGVsKGJhbmstPmludF9sdmxbcF0sIEdQSU9fSU5UX0xWTChncGlvKSk7Ci0JCQlfX3Jhd193cml0ZWwoYmFuay0+aW50X2VuYltwXSwgR1BJT19JTlRfRU5CKGdwaW8pKTsKKwkJCXRlZ3JhX2dwaW9fd3JpdGVsKGJhbmstPmNuZltwXSwgR1BJT19DTkYoZ3BpbykpOworCQkJdGVncmFfZ3Bpb193cml0ZWwoYmFuay0+b3V0W3BdLCBHUElPX09VVChncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbChiYW5rLT5vZVtwXSwgR1BJT19PRShncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbChiYW5rLT5pbnRfbHZsW3BdLCBHUElPX0lOVF9MVkwoZ3BpbykpOworCQkJdGVncmFfZ3Bpb193cml0ZWwoYmFuay0+aW50X2VuYltwXSwgR1BJT19JTlRfRU5CKGdwaW8pKTsKIAkJfQogCX0KIApAQCAtMjk0LDExICszMDEsMTEgQEAKIAogCQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShiYW5rLT5vZSk7IHArKykgewogCQkJdW5zaWduZWQgaW50IGdwaW8gPSAoYjw8NSkgfCAocDw8Myk7Ci0JCQliYW5rLT5jbmZbcF0gPSBfX3Jhd19yZWFkbChHUElPX0NORihncGlvKSk7Ci0JCQliYW5rLT5vdXRbcF0gPSBfX3Jhd19yZWFkbChHUElPX09VVChncGlvKSk7Ci0JCQliYW5rLT5vZVtwXSA9IF9fcmF3X3JlYWRsKEdQSU9fT0UoZ3BpbykpOwotCQkJYmFuay0+aW50X2VuYltwXSA9IF9fcmF3X3JlYWRsKEdQSU9fSU5UX0VOQihncGlvKSk7Ci0JCQliYW5rLT5pbnRfbHZsW3BdID0gX19yYXdfcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKKwkJCWJhbmstPmNuZltwXSA9IHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19DTkYoZ3BpbykpOworCQkJYmFuay0+b3V0W3BdID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX09VVChncGlvKSk7CisJCQliYW5rLT5vZVtwXSA9IHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19PRShncGlvKSk7CisJCQliYW5rLT5pbnRfZW5iW3BdID0gdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpOworCQkJYmFuay0+aW50X2x2bFtwXSA9IHRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKTsKIAkJfQogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0zMjgsMzggKzMzNSw2OSBAQAogICovCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGdwaW9fbG9ja19jbGFzczsKIAotc3RhdGljIGludCBfX2luaXQgdGVncmFfZ3Bpb19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZWdyYV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IHRlZ3JhX2dwaW9fYmFuayAqYmFuazsKKwlpbnQgZ3BpbzsKIAlpbnQgaTsKIAlpbnQgajsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhX2dwaW9fYmFua3MpOyBpKyspIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgSVJRIHJlc291cmNlXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJYmFuayA9ICZ0ZWdyYV9ncGlvX2JhbmtzW2ldOworCQliYW5rLT5iYW5rID0gaTsKKwkJYmFuay0+aXJxID0gcmVzLT5zdGFydDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgTUVNIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCSAgICAgZGV2X25hbWUoJnBkZXYtPmRldikpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IHJlcXVlc3QgTUVNIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVncyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghcmVncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBpb3JlbWFwIHJlZ3NcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKIAkJCWludCBncGlvID0gdGVncmFfZ3Bpb19jb21wb3NlKGksIGosIDApOwotCQkJX19yYXdfd3JpdGVsKDB4MDAsIEdQSU9fSU5UX0VOQihncGlvKSk7CisJCQl0ZWdyYV9ncGlvX3dyaXRlbCgweDAwLCBHUElPX0lOVF9FTkIoZ3BpbykpOwogCQl9CiAJfQogCiAjaWZkZWYgQ09ORklHX09GX0dQSU8KLQkvKgotCSAqIFRoaXMgaXNuJ3QgaWRlYWwsIGJ1dCBpdCBnZXRzIHRoaW5ncyBob29rZWQgdXAgdW50aWwgdGhpcwotCSAqIGRyaXZlciBpcyBjb252ZXJ0ZWQgaW50byBhIHBsYXRmb3JtX2RldmljZQotCSAqLwotCXRlZ3JhX2dwaW9fY2hpcC5vZl9ub2RlID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwKLQkJCQkJCSJudmlkaWEsdGVncmEyMC1ncGlvIik7Ci0jZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KKwl0ZWdyYV9ncGlvX2NoaXAub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworI2VuZGlmCiAKIAlncGlvY2hpcF9hZGQoJnRlZ3JhX2dwaW9fY2hpcCk7CiAKLQlmb3IgKGkgPSBJTlRfR1BJT19CQVNFOyBpIDwgKElOVF9HUElPX0JBU0UgKyBURUdSQV9OUl9HUElPUyk7IGkrKykgewotCQliYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbR1BJT19CQU5LKGlycV90b19ncGlvKGkpKV07CisJZm9yIChncGlvID0gMDsgZ3BpbyA8IFRFR1JBX05SX0dQSU9TOyBncGlvKyspIHsKKwkJaW50IGlycSA9IFRFR1JBX0dQSU9fVE9fSVJRKGdwaW8pOworCQkvKiBObyB2YWxpZGl0eSBjaGVjazsgYWxsIFRlZ3JhIEdQSU9zIGFyZSB2YWxpZCBJUlFzICovCiAKLQkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGksICZncGlvX2xvY2tfY2xhc3MpOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpLCBiYW5rKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZ0ZWdyYV9ncGlvX2lycV9jaGlwLAorCQliYW5rID0gJnRlZ3JhX2dwaW9fYmFua3NbR1BJT19CQU5LKGdwaW8pXTsKKworCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaXJxLCAmZ3Bpb19sb2NrX2NsYXNzKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBiYW5rKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJnRlZ3JhX2dwaW9faXJxX2NoaXAsCiAJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZWdyYV9ncGlvX2JhbmtzKTsgaSsrKSB7CkBAIC0zNzUsNiArNDEzLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX2dwaW9fb2ZfbWF0Y2hbXSBfX2RldmluaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZ3BpbyIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInRlZ3JhLWdwaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdGVncmFfZ3Bpb19vZl9tYXRjaCwKKwl9LAorCS5wcm9iZQkJPSB0ZWdyYV9ncGlvX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVncmFfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVncmFfZ3Bpb19kcml2ZXIpOworfQogcG9zdGNvcmVfaW5pdGNhbGwodGVncmFfZ3Bpb19pbml0KTsKIAogdm9pZCBfX2luaXQgdGVncmFfZ3Bpb19jb25maWcoc3RydWN0IHRlZ3JhX2dwaW9fdGFibGUgKnRhYmxlLCBpbnQgbnVtKQpAQCAtNDA3LDEzICs0NjMsMTMgQEAKIAkJCXNlcV9wcmludGYocywKIAkJCQkiJWQ6JWQgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTA2eFxuIiwKIAkJCQlpLCBqLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fQ05GKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX09FKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX09VVChncGlvKSksCi0JCQkJX19yYXdfcmVhZGwoR1BJT19JTihncGlvKSksCi0JCQkJX19yYXdfcmVhZGwoR1BJT19JTlRfU1RBKGdwaW8pKSwKLQkJCQlfX3Jhd19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpLAotCQkJCV9fcmF3X3JlYWRsKEdQSU9fSU5UX0xWTChncGlvKSkpOworCQkJCXRlZ3JhX2dwaW9fcmVhZGwoR1BJT19DTkYoZ3BpbykpLAorCQkJCXRlZ3JhX2dwaW9fcmVhZGwoR1BJT19PRShncGlvKSksCisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX09VVChncGlvKSksCisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOKGdwaW8pKSwKKwkJCQl0ZWdyYV9ncGlvX3JlYWRsKEdQSU9fSU5UX1NUQShncGlvKSksCisJCQkJdGVncmFfZ3Bpb19yZWFkbChHUElPX0lOVF9FTkIoZ3BpbykpLAorCQkJCXRlZ3JhX2dwaW9fcmVhZGwoR1BJT19JTlRfTFZMKGdwaW8pKSk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby10bmV0djEwN3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRuZXR2MTA3eC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLWRhdmluY2kvZ3Bpby10bmV0djEwN3guYwpyZW5hbWUgdG8gZHJpdmVycy9ncGlvL2dwaW8tdG5ldHYxMDd4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXUzMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXUzMDAuYwppbmRleCA1M2U4MjU1Li40MDM1Nzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby11MzAwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdTMwMC5jCkBAIC0xLDE4ICsxLDE3IEBACiAvKgogICogVTMwMCBHUElPIG1vZHVsZS4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBTVC1Fcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgU1QtRXJpY3Nzb24gQUIKICAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgogICogVGhpcyBjYW4gZHJpdmVyIGVpdGhlciBvZiB0aGUgdHdvIGJhc2ljIEdQSU8gY29yZXMKICAqIGF2YWlsYWJsZSBpbiB0aGUgVTMwMCBwbGF0Zm9ybXM6CiAgKiBDT0ggOTAxIDMzNSAgIC0gVXNlZCBpbiBEQjMxNTAgKFUzMDAgMS4wKSBhbmQgREIzMjAwIChVMzMwIDEuMCkKICAqIENPSCA5MDEgNTcxLzMgLSBVc2VkIGluIERCMzIxMCAoVTM2NSAyLjApIGFuZCBEQjMzNTAgKFUzMzUgMS4wKQotICogTm90aWNlIHRoYXQgeW91IGFsc28gaGF2ZSBpbmxpbmUgbWFjcm9zIGluIDxhc20tYXJjaC9ncGlvLmg+Ci0gKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KICAqIEF1dGhvcjogSm9uYXMgQWFiZXJnIDxqb25hcy5hYmVyZ0BzdGVyaWNzc29uLmNvbT4KLSAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0yMSw2NzcgKzIwLDg5OCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby11MzAwLmg+CiAKLS8qIFJlZmVyZW5jZSB0byBHUElPIGJsb2NrIGNsb2NrICovCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrOworLyoKKyAqIEJpYXMgbW9kZXMgZm9yIFUzMDAgR1BJT3MKKyAqCisgKiBHUElPX1UzMDBfQ09ORklHX0JJQVNfVU5LTk9XTjogdGhpcyBiaWFzIG1vZGUgaXMgbm90IGtub3duIHRvIHVzCisgKiBHUElPX1UzMDBfQ09ORklHX0JJQVNfRkxPQVQ6IG5vIHNwZWNpZmljIGJpYXMsIHRoZSBHUElPIHdpbGwgZmxvYXQgb3Igc3RhdGUKKyAqCWlzIG5vdCBjb250cm9sbGVkIGJ5IHNvZnR3YXJlCisgKiBHUElPX1UzMDBfQ09ORklHX0JJQVNfUFVMTF9VUDogdGhlIEdQSU8gd2lsbCBiZSBwdWxsZWQgdXAgKHVzdWFsbHkgd2l0aCBoaWdoCisgKglpbXBlZGFuY2UgdG8gVkREKQorICovCisjZGVmaW5lIEdQSU9fVTMwMF9DT05GSUdfQklBU19VTktOT1dOCTB4MTAwMAorI2RlZmluZSBHUElPX1UzMDBfQ09ORklHX0JJQVNfRkxPQVQJMHgxMDAxCisjZGVmaW5lIEdQSU9fVTMwMF9DT05GSUdfQklBU19QVUxMX1VQCTB4MTAwMgogCi0vKiBNZW1vcnkgcmVzb3VyY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKm1lbXJlczsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnZpcnRiYXNlOwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmdwaW9kZXY7CisvKgorICogRHJpdmUgbW9kZXMgZm9yIFUzMDAgR1BJT3MgKG91dHB1dCkKKyAqCisgKiBHUElPX1UzMDBfQ09ORklHX0RSSVZFX1BVU0hfUFVMTDogdGhlIEdQSU8gd2lsbCBiZSBkcml2ZW4gYWN0aXZlbHkgaGlnaCBhbmQKKyAqCWxvdywgdGhpcyBpcyB0aGUgbW9zdCB0eXBpY2FsIGNhc2UgYW5kIGlzIHR5cGljYWxseSBhY2hpZXZlZCB3aXRoIHR3bworICoJYWN0aXZlIHRyYW5zaXN0b3JzIG9uIHRoZSBvdXRwdXQKKyAqIEdQSU9fVTMwMF9DT05GSUdfRFJJVkVfT1BFTl9EUkFJTjogdGhlIEdQSU8gd2lsbCBiZSBkcml2ZW4gd2l0aCBvcGVuIGRyYWluCisgKgkob3BlbiBjb2xsZWN0b3IpIHdoaWNoIG1lYW5zIGl0IGlzIHVzdWFsbHkgd2lyZWQgd2l0aCBvdGhlciBvdXRwdXQKKyAqCXBvcnRzIHdoaWNoIGFyZSB0aGVuIHB1bGxlZCB1cCB3aXRoIGFuIGV4dGVybmFsIHJlc2lzdG9yCisgKiBHUElPX1UzMDBfQ09ORklHX0RSSVZFX09QRU5fU09VUkNFOiB0aGUgR1BJTyB3aWxsIGJlIGRyaXZlbiB3aXRoIG9wZW4gZHJhaW4KKyAqCShvcGVuIGVtaXR0ZXIpIHdoaWNoIGlzIHRoZSBzYW1lIGFzIG9wZW4gZHJhaW4gbXV0YXRpcyBtdXRhbmRpcyBidXQKKyAqCXB1bGxlZCB0byBncm91bmQKKyAqLworI2RlZmluZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX1BVU0hfUFVMTAkweDIwMDAKKyNkZWZpbmUgR1BJT19VMzAwX0NPTkZJR19EUklWRV9PUEVOX0RSQUlOCTB4MjAwMQorI2RlZmluZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX09QRU5fU09VUkNFCTB4MjAwMgorCisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIENPSCA5MDEgMzM1IHZhcmlhbnQKKyAqLworI2RlZmluZSBVMzAwXzMzNV9QT1JUX1NUUklERQkJCQkoMHgxQykKKy8qIFBvcnQgWCBQaW4gRGF0YSBSZWdpc3RlciAzMmJpdCwgdGhpcyBpcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfUFhQRElSCQkJCQkoMHgwMCkKKyNkZWZpbmUgVTMwMF8zMzVfUFhQRE9SCQkJCQkoMHgwMCkKKy8qIFBvcnQgWCBQaW4gQ29uZmlnIFJlZ2lzdGVyIDMyYml0IChSL1cpICovCisjZGVmaW5lIFUzMDBfMzM1X1BYUENSCQkJCQkoMHgwNCkKKy8qIFRoaXMgcmVnaXN0ZXIgbGF5b3V0IGlzIHRoZSBzYW1lIGluIGJvdGggYmxvY2tzICovCisjZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9BTExfUElOU19NT0RFX01BU0sJCSgweDAwMDBGRkZGVUwpCisjZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLCQkJKDB4MDAwMDAwMDNVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX1NISUZUCQkJKDB4MDAwMDAwMDJVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX0lOUFVUCQkJKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwJKDB4MDAwMDAwMDFVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9PUEVOX0RSQUlOCSgweDAwMDAwMDAyVUwpCisjZGVmaW5lIFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfT1BFTl9TT1VSQ0UJKDB4MDAwMDAwMDNVTCkKKy8qIFBvcnQgWCBJbnRlcnJ1cHQgRXZlbnQgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfUFhJRVYJCQkJCSgweDA4KQorLyogUG9ydCBYIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfUFhJRU4JCQkJCSgweDBDKQorLyogUG9ydCBYIEludGVycnVwdCBGb3JjZSBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWElGUgkJCQkJKDB4MTApCisvKiBQb3J0IFggSW50ZXJydXB0IENvbmZpZyBSZWdpc3RlciAzMmJpdCAoUi9XKSAqLworI2RlZmluZSBVMzAwXzMzNV9QWElDUgkJCQkJKDB4MTQpCisvKiBUaGlzIHJlZ2lzdGVyIGxheW91dCBpcyB0aGUgc2FtZSBpbiBib3RoIGJsb2NrcyAqLworI2RlZmluZSBVMzAwX0dQSU9fUFhJQ1JfQUxMX0lSUV9DT05GSUdfTUFTSwkJKDB4MDAwMDAwRkZVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfTUFTSwkJCSgweDAwMDAwMDAxVUwpCisjZGVmaW5lIFUzMDBfR1BJT19QWElDUl9JUlFfQ09ORklHX0ZBTExJTkdfRURHRQkJKDB4MDAwMDAwMDBVTCkKKyNkZWZpbmUgVTMwMF9HUElPX1BYSUNSX0lSUV9DT05GSUdfUklTSU5HX0VER0UJCSgweDAwMDAwMDAxVUwpCisvKiBQb3J0IFggUHVsbC11cCBFbmFibGUgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfUFhQRVIJCQkJCSgweDE4KQorLyogVGhpcyByZWdpc3RlciBsYXlvdXQgaXMgdGhlIHNhbWUgaW4gYm90aCBibG9ja3MgKi8KKyNkZWZpbmUgVTMwMF9HUElPX1BYUEVSX0FMTF9QVUxMX1VQX0RJU0FCTEVfTUFTSwkoMHgwMDAwMDBGRlVMKQorI2RlZmluZSBVMzAwX0dQSU9fUFhQRVJfUFVMTF9VUF9ESVNBQkxFCQkJKDB4MDAwMDAwMDFVTCkKKy8qIENvbnRyb2wgUmVnaXN0ZXIgMzJiaXQgKFIvVykgKi8KKyNkZWZpbmUgVTMwMF8zMzVfQ1IJCQkJCSgweDU0KQorI2RlZmluZSBVMzAwXzMzNV9DUl9CTE9DS19DTE9DS19FTkFCTEUJCQkoMHgwMDAwMDAwMVVMKQorCisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIENPSCA5MDEgNTcxIC8gMyB2YXJpYW50CisgKi8KKyNkZWZpbmUgVTMwMF81NzFfUE9SVF9TVFJJREUJCQkJKDB4MzApCisvKgorICogQ29udHJvbCBSZWdpc3RlciAzMmJpdCAoUi9XKQorICogYml0IDE1LTkgKG1hc2sgMHgwMDAwRkUwMCkgY29udGFpbnMgdGhlIG51bWJlciBvZiBjb3Jlcy4gOCpjb3JlcworICogZ2l2ZXMgdGhlIG51bWJlciBvZiBHUElPIHBpbnMuCisgKiBiaXQgOC0yICAobWFzayAweDAwMDAwMUZDKSBjb250YWlucyB0aGUgY29yZSB2ZXJzaW9uIElELgorICovCisjZGVmaW5lIFUzMDBfNTcxX0NSCQkJCQkoMHgwMCkKKyNkZWZpbmUgVTMwMF81NzFfQ1JfU1lOQ19TRUxfRU5BQkxFCQkJKDB4MDAwMDAwMDJVTCkKKyNkZWZpbmUgVTMwMF81NzFfQ1JfQkxPQ0tfQ0xLUlFfRU5BQkxFCQkJKDB4MDAwMDAwMDFVTCkKKy8qCisgKiBUaGVzZSByZWdpc3RlcnMgaGF2ZSB0aGUgc2FtZSBsYXlvdXQgYW5kIGZ1bmN0aW9uIGFzIHRoZSBjb3JyZXNwb25kaW5nCisgKiBDT0ggOTAxIDMzNSByZWdpc3RlcnMsIGp1c3QgYXQgZGlmZmVyZW50IG9mZnNldC4KKyAqLworI2RlZmluZSBVMzAwXzU3MV9QWFBESVIJCQkJCSgweDA0KQorI2RlZmluZSBVMzAwXzU3MV9QWFBET1IJCQkJCSgweDA4KQorI2RlZmluZSBVMzAwXzU3MV9QWFBDUgkJCQkJKDB4MEMpCisjZGVmaW5lIFUzMDBfNTcxX1BYUEVSCQkJCQkoMHgxMCkKKyNkZWZpbmUgVTMwMF81NzFfUFhJRVYJCQkJCSgweDE0KQorI2RlZmluZSBVMzAwXzU3MV9QWElFTgkJCQkJKDB4MTgpCisjZGVmaW5lIFUzMDBfNTcxX1BYSUZSCQkJCQkoMHgxQykKKyNkZWZpbmUgVTMwMF81NzFfUFhJQ1IJCQkJCSgweDIwKQorCisvKiA4IGJpdHMgcGVyIHBvcnQsIG5vIHZlcnNpb24gaGFzIG1vcmUgdGhhbiA3IHBvcnRzICovCisjZGVmaW5lIFUzMDBfR1BJT19QSU5TX1BFUl9QT1JUIDgKKyNkZWZpbmUgVTMwMF9HUElPX01BWCAoVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQgKiA3KQorCitzdHJ1Y3QgdTMwMF9ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0X2xpc3Q7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCByZXNvdXJjZSAqbWVtcmVzOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGlycV9iYXNlOworCXUzMiBzdHJpZGU7CisJLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworCXUzMiBwY3I7CisJdTMyIGRvcjsKKwl1MzIgZGlyOworCXUzMiBwZXI7CisJdTMyIGljcjsKKwl1MzIgaWVuOworCXUzMiBpZXY7Cit9OwogCiBzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgewotCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW87CisJY2hhciBuYW1lWzhdOwogCWludCBpcnE7CiAJaW50IG51bWJlcjsKKwl1OCB0b2dnbGVfZWRnZV9tb2RlOwogfTsKIAorLyoKKyAqIE1hY3JvIHRvIGV4cGFuZCB0byByZWFkIGEgc3BlY2lmaWMgcmVnaXN0ZXIgZm91bmQgaW4gdGhlICJncGlvIgorICogc3RydWN0LiBJdCByZXF1aXJlcyB0aGUgc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyB2YXJpYWJsZSB0byBleGlzdCBpbgorICogaXRzIGNvbnRleHQuIEl0IGNhbGN1bGF0ZXMgdGhlIHBvcnQgb2Zmc2V0IGZyb20gdGhlIGdpdmVuIHBpbgorICogb2Zmc2V0LCBtdWxpcGxpZXMgYnkgdGhlIHBvcnQgc3RyaWRlIGFuZCBhZGRzIHRoZSByZWdpc3RlciBvZmZzZXQKKyAqIHNvIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUgZGVzaXJlZCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBVMzAwX1BJTl9SRUcocGluLCByZWcpIFwKKwkoZ3Bpby0+YmFzZSArIChwaW4gPj4gMykgKiBncGlvLT5zdHJpZGUgKyBncGlvLT5yZWcpCiAKLXN0YXRpYyBzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgZ3Bpb19wb3J0c1tdID0gewotCXsKLQkJLm5hbWUgPSAiZ3BpbzAiLAotCQkubnVtYmVyID0gMCwKLQl9LAotCXsKLQkJLm5hbWUgPSAiZ3BpbzEiLAotCQkubnVtYmVyID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiZ3BpbzIiLAotCQkubnVtYmVyID0gMiwKLQl9LAotI2lmZGVmIFUzMDBfQ09IOTAxNTcxXzMKLQl7Ci0JCS5uYW1lID0gImdwaW8zIiwKLQkJLm51bWJlciA9IDMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gImdwaW80IiwKLQkJLm51bWJlciA9IDQsCi0JfSwKLSNpZmRlZiBDT05GSUdfTUFDSF9VMzAwX0JTMzM1Ci0JewotCQkubmFtZSA9ICJncGlvNSIsCi0JCS5udW1iZXIgPSA1LAotCX0sCi0JewotCQkubmFtZSA9ICJncGlvNiIsCi0JCS5udW1iZXIgPSA2LAotCX0sCi0jZW5kaWYKLSNlbmRpZgorLyoKKyAqIFByb3ZpZGVzIGEgYml0bWFzayBmb3IgYSBzcGVjaWZpYyBncGlvIHBpbiBpbnNpZGUgYW4gOC1iaXQgR1BJTworICogcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgVTMwMF9QSU5fQklUKHBpbikgXAorCSgxIDw8IChwaW4gJiAweDA3KSkKIAorc3RydWN0IHUzMDBfZ3Bpb19jb25mZGF0YSB7CisJdTE2IGJpYXNfbW9kZTsKKwlib29sIG91dHB1dDsKKwlpbnQgb3V0dmFsOwogfTsKIAorLyogQlMzMzUgaGFzIHNldmVuIHBvcnRzIG9mIDggYml0cyBlYWNoID0gR1BJTyBwaW5zIDAuLjU1ICovCisjZGVmaW5lIEJTMzM1X0dQSU9fTlVNX1BPUlRTIDcKKy8qIEJTMzY1IGhhcyBmaXZlIHBvcnRzIG9mIDggYml0cyBlYWNoID0gR1BJTyBwaW5zIDAuLjM5ICovCisjZGVmaW5lIEJTMzY1X0dQSU9fTlVNX1BPUlRTIDUKIAotI2lmZGVmIFUzMDBfQ09IOTAxNTcxXzMKKyNkZWZpbmUgVTMwMF9GTE9BVElOR19JTlBVVCB7IFwKKwkuYmlhc19tb2RlID0gR1BJT19VMzAwX0NPTkZJR19CSUFTX0ZMT0FULCBcCisJLm91dHB1dCA9IGZhbHNlLCBcCit9CiAKLS8qIERlZmF1bHQgaW5wdXQgdmFsdWUgKi8KLSNkZWZpbmUgREVGQVVMVF9PVVRQVVRfTE9XICAgMAotI2RlZmluZSBERUZBVUxUX09VVFBVVF9ISUdIICAxCisjZGVmaW5lIFUzMDBfUFVMTF9VUF9JTlBVVCB7IFwKKwkuYmlhc19tb2RlID0gR1BJT19VMzAwX0NPTkZJR19CSUFTX1BVTExfVVAsIFwKKwkub3V0cHV0ID0gZmFsc2UsIFwKK30KIAotLyogR1BJTyBQdWxsLVVwIHN0YXR1cyAqLwotI2RlZmluZSBESVNBQkxFX1BVTExfVVAgIDAKLSNkZWZpbmUgRU5BQkxFX1BVTExfVVAgIDEKKyNkZWZpbmUgVTMwMF9PVVRQVVRfTE9XIHsgXAorCS5vdXRwdXQgPSB0cnVlLCBcCisJLm91dHZhbCA9IDAsIFwKK30KIAotI2RlZmluZSBHUElPX05PVF9VU0VEIDAKLSNkZWZpbmUgR1BJT19JTiAgICAgICAxCi0jZGVmaW5lIEdQSU9fT1VUICAgICAgMgorI2RlZmluZSBVMzAwX09VVFBVVF9ISUdIIHsgXAorCS5vdXRwdXQgPSB0cnVlLCBcCisJLm91dHZhbCA9IDEsIFwKK30KIAotc3RydWN0IHUzMDBfZ3Bpb19jb25maWd1cmF0aW9uX2RhdGEgewotCXVuc2lnbmVkIGNoYXIgcGluX3VzYWdlOwotCXVuc2lnbmVkIGNoYXIgZGVmYXVsdF9vdXRwdXRfdmFsdWU7Ci0JdW5zaWduZWQgY2hhciBwdWxsX3VwOwotfTsKIAogLyogSW5pdGlhbCBjb25maWd1cmF0aW9uICovCi1jb25zdCBzdHJ1Y3QgdTMwMF9ncGlvX2NvbmZpZ3VyYXRpb25fZGF0YQotdTMwMF9ncGlvX2NvbmZpZ1tVMzAwX0dQSU9fTlVNX1BPUlRTXVtVMzAwX0dQSU9fUElOU19QRVJfUE9SVF0gPSB7Ci0jaWZkZWYgQ09ORklHX01BQ0hfVTMwMF9CUzMzNQorc3RhdGljIGNvbnN0IHN0cnVjdCBfX2luaXRkYXRhIHUzMDBfZ3Bpb19jb25mZGF0YQorYnMzMzVfZ3Bpb19jb25maWdbQlMzMzVfR1BJT19OVU1fUE9SVFNdW1UzMDBfR1BJT19QSU5TX1BFUl9QT1JUXSA9IHsKIAkvKiBQb3J0IDAsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0hJR0gsICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0hJR0gsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAogCX0sCiAJLyogUG9ydCAxLCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9ISUdILCAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0hJR0gsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAogCX0sCiAJLyogUG9ydCAyLCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDMsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19PVVQsIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICBESVNBQkxFX1BVTExfVVB9CisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAogCX0sCiAJLyogUG9ydCA0LCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAogCX0sCiAJLyogUG9ydCA1LCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAogCX0sCiAJLyogUG9ydCA2LCBwaW5kIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAogCX0KLSNlbmRpZgorfTsKIAotI2lmZGVmIENPTkZJR19NQUNIX1UzMDBfQlMzNjUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX19pbml0ZGF0YSB1MzAwX2dwaW9fY29uZmRhdGEKK2JzMzY1X2dwaW9fY29uZmlnW0JTMzY1X0dQSU9fTlVNX1BPUlRTXVtVMzAwX0dQSU9fUElOU19QRVJfUE9SVF0gPSB7CiAJLyogUG9ydCAwLCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9GTE9BVElOR19JTlBVVCwKIAl9LAogCS8qIFBvcnQgMSwgcGlucyAwLTcgKi8KIAl7Ci0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX0lOLCAgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfSElHSCwgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0sCi0JCXtHUElPX09VVCwgREVGQVVMVF9PVVRQVVRfTE9XLCAgIERJU0FCTEVfUFVMTF9VUH0KKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfRkxPQVRJTkdfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0hJR0gsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAogCX0sCiAJLyogUG9ydCAyLCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgRElTQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfQorCQlVMzAwX0ZMT0FUSU5HX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCiAJfSwKIAkvKiBQb3J0IDMsIHBpbnMgMC03ICovCiAJewotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9LAotCQl7R1BJT19JTiwgIERFRkFVTFRfT1VUUFVUX0xPVywgICAgRU5BQkxFX1BVTExfVVB9CisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAogCX0sCiAJLyogUG9ydCA0LCBwaW5zIDAtNyAqLwogCXsKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fSU4sICBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAorCQlVMzAwX1BVTExfVVBfSU5QVVQsCisJCVUzMDBfUFVMTF9VUF9JTlBVVCwKKwkJVTMwMF9QVUxMX1VQX0lOUFVULAogCQkvKiBUaGVzZSA0IHBpbnMgZG9lc24ndCBleGlzdCBvbiBEQjMyMTAgKi8KLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfSwKLQkJe0dQSU9fT1VULCBERUZBVUxUX09VVFBVVF9MT1csICAgIEVOQUJMRV9QVUxMX1VQfQorCQlVMzAwX09VVFBVVF9MT1csCisJCVUzMDBfT1VUUFVUX0xPVywKKwkJVTMwMF9PVVRQVVRfTE9XLAorCQlVMzAwX09VVFBVVF9MT1csCiAJfQotI2VuZGlmCi19OwotI2VuZGlmCi0KLQotLyogTm8gdXNlcnMgPT0gd2UgY2FuIHBvd2VyIGRvd24gR1BJTyAqLwotc3RhdGljIGludCBncGlvX3VzZXJzOwotCi1zdHJ1Y3QgZ3Bpb19zdHJ1Y3QgewotCWludCAoKmNhbGxiYWNrKSh2b2lkICopOwotCXZvaWQgKmRhdGE7Ci0JaW50IHVzZXJzOwogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX3N0cnVjdCBncGlvX3BpbltVMzAwX0dQSU9fTUFYXTsKLQotLyoKLSAqIExldCBkcml2ZXJzIHJlZ2lzdGVyIGNhbGxiYWNrIGluIG9yZGVyIHRvIGdldCBub3RpZmllZCB3aGVuIHRoZXJlIGlzCi0gKiBhbiBpbnRlcnJ1cHQgb24gdGhlIGdwaW8gcGluCisvKioKKyAqIHRvX3UzMDBfZ3BpbygpIC0gZ2V0IHRoZSBwb2ludGVyIHRvIHUzMDBfZ3BpbworICogQGNoaXA6IHRoZSBncGlvIGNoaXAgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgdTMwMF9ncGlvCiAgKi8KLWludCBncGlvX3JlZ2lzdGVyX2NhbGxiYWNrKHVuc2lnbmVkIGdwaW8sIGludCAoKmZ1bmMpKHZvaWQgKmFyZyksIHZvaWQgKmRhdGEpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1MzAwX2dwaW8gKnRvX3UzMDBfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQogewotCWlmIChncGlvX3BpbltncGlvXS5jYWxsYmFjaykKLQkJZGV2X3dhcm4oZ3Bpb2RldiwgIiVzOiBXQVJOSU5HOiBjYWxsYmFjayBhbHJlYWR5ICIKLQkJCSAicmVnaXN0ZXJlZCBmb3IgZ3BpbyBwaW4jJWRcbiIsIF9fZnVuY19fLCBncGlvKTsKLQlncGlvX3BpbltncGlvXS5jYWxsYmFjayA9IGZ1bmM7Ci0JZ3Bpb19waW5bZ3Bpb10uZGF0YSA9IGRhdGE7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCB1MzAwX2dwaW8sIGNoaXApOwogfQotRVhQT1JUX1NZTUJPTChncGlvX3JlZ2lzdGVyX2NhbGxiYWNrKTsKIAotaW50IGdwaW9fdW5yZWdpc3Rlcl9jYWxsYmFjayh1bnNpZ25lZCBncGlvKQorc3RhdGljIGludCB1MzAwX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKLQlpZiAoIWdwaW9fcGluW2dwaW9dLmNhbGxiYWNrKQotCQlkZXZfd2FybihncGlvZGV2LCAiJXM6IFdBUk5JTkc6IGNhbGxiYWNrIGFscmVhZHkgIgotCQkJICJ1bnJlZ2lzdGVyZWQgZm9yIGdwaW8gcGluIyVkXG4iLCBfX2Z1bmNfXywgZ3Bpbyk7Ci0JZ3Bpb19waW5bZ3Bpb10uY2FsbGJhY2sgPSBOVUxMOwotCWdwaW9fcGluW2dwaW9dLmRhdGEgPSBOVUxMOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSB0b191MzAwX2dwaW8oY2hpcCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgZGlyKSkgJiBVMzAwX1BJTl9CSVQob2Zmc2V0KTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb191bnJlZ2lzdGVyX2NhbGxiYWNrKTsKIAotLyogTm9uLXplcm8gbWVhbnMgdmFsaWQgKi8KLWludCBncGlvX2lzX3ZhbGlkKGludCBudW1iZXIpCitzdGF0aWMgdm9pZCB1MzAwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQogewotCWlmIChudW1iZXIgPj0gMCAmJgotCSAgICBudW1iZXIgPCAoVTMwMF9HUElPX05VTV9QT1JUUyAqIFUzMDBfR1BJT19QSU5TX1BFUl9QT1JUKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9faXNfdmFsaWQpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSB0b191MzAwX2dwaW8oY2hpcCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOwogCi1pbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCWlmIChncGlvX3BpbltncGlvXS51c2VycykKLQkJcmV0dXJuIC1FSU5WQUw7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgZG9yKSk7CisJaWYgKHZhbHVlKQorCQl3cml0ZWwodmFsIHwgVTMwMF9QSU5fQklUKG9mZnNldCksIFUzMDBfUElOX1JFRyhvZmZzZXQsIGRvcikpOwogCWVsc2UKLQkJZ3Bpb19waW5bZ3Bpb10udXNlcnMrKzsKKwkJd3JpdGVsKHZhbCAmIH5VMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgZG9yKSk7CiAKLQlncGlvX3VzZXJzKys7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZ3Bpb19yZXF1ZXN0KTsKLQotdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKLXsKLQlncGlvX3VzZXJzLS07Ci0JZ3Bpb19waW5bZ3Bpb10udXNlcnMtLTsKLQlpZiAodW5saWtlbHkoZ3Bpb19waW5bZ3Bpb10udXNlcnMgPCAwKSkgewotCQlkZXZfd2FybihncGlvZGV2LCAid2FybmluZzogZ3BpbyMlZCByZWxlYXNlIG1pc21hdGNoXG4iLAotCQkJIGdwaW8pOwotCQlncGlvX3BpbltncGlvXS51c2VycyA9IDA7Ci0JfQotCi0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOwotCi0vKiBUaGlzIHJldHVybnMgemVybyBvciBub256ZXJvICovCi1pbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRElSICsKLQkgIFBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpICYgKDEgPDwgKGdwaW8gJiAweDA3KSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKLQotLyoKLSAqIFdlIGhvcGUgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSBhd2F5IHRoZSB1bnVzZWQgYnJhbmNoCi0gKiBpbiBjYXNlICJ2YWx1ZSIgaXMgYSBjb25zdGFudAotICovCi12b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHZhbHVlKSB7Ci0JCS8qIHNldCAqLwotCQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBET1IgKwotCQkgIFBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpCi0JCSAgJiAoMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLQkJd3JpdGVsKHZhbCB8ICgxIDw8IChncGlvICYgMHgwNykpLCB2aXJ0YmFzZSArCi0JCSAgVTMwMF9HUElPX1BYUERPUiArCi0JCSAgUElOX1RPX1BPUlQoZ3BpbykgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JfSBlbHNlIHsKLQkJLyogY2xlYXIgKi8KLQkJdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRE9SICsKLQkJICBQSU5fVE9fUE9SVChncGlvKSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKQotCQkgICYgKDEgPDwgKGdwaW8gJiAweDA3KSk7Ci0JCXdyaXRlbCh2YWwgJiB+KDEgPDwgKGdwaW8gJiAweDA3KSksIHZpcnRiYXNlICsKLQkJICBVMzAwX0dQSU9fUFhQRE9SICsKLQkJICBQSU5fVE9fUE9SVChncGlvKSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChncGlvX3NldF92YWx1ZSk7CiAKLWludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQorc3RhdGljIGludCB1MzAwX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvID0gdG9fdTMwMF9ncGlvKGNoaXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbDsKIAotCWlmIChncGlvID4gVTMwMF9HUElPX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQQ1IgKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCS8qIE1hc2sgb3V0IHRoaXMgcGluKi8KLQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSyA8PCAoKGdwaW8gJiAweDA3KSA8PCAxKSk7Ci0JLyogVGhpcyBpcyBub3QgbmVlZGVkIHNpbmNlIGl0IHNldHMgdGhlIGJpdHMgdG8gemVyby4qLwotCS8qIHZhbCB8PSAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX0lOUFVUIDw8IChncGlvKjIpKTsgKi8KLQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7CisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CisJLyogTWFzayBvdXQgdGhpcyBwaW4sIG5vdGUgMiBiaXRzIHBlciBzZXR0aW5nICovCisJdmFsICY9IH4oVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sgPDwgKChvZmZzZXQgJiAweDA3KSA8PCAxKSk7CisJd3JpdGVsKHZhbCwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLWludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQorc3RhdGljIGludCB1MzAwX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJICAgICAgaW50IHZhbHVlKQogeworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSB0b191MzAwX2dwaW8oY2hpcCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgb2xkbW9kZTsKIAl1MzIgdmFsOwogCi0JaWYgKGdwaW8gPiBVMzAwX0dQSU9fTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWFBDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JLyogTWFzayBvdXQgdGhpcyBwaW4gKi8KLQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSyA8PCAoKGdwaW8gJiAweDA3KSA8PCAxKSk7CisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CiAJLyoKLQkgKiBGSVhNRTogY29uZmlndXJlIGZvciBwdXNoL3B1bGwsIG9wZW4gZHJhaW4gb3Igb3BlbiBzb3VyY2UgcGVyIHBpbgotCSAqIGluIHNldHVwLiBUaGUgY3VycmVudCBkcml2ZXIgd2lsbCBvbmx5IHN1cHBvcnQgcHVzaC9wdWxsLgorCSAqIERyaXZlIG1vZGUgbXVzdCBiZSBzZXQgYnkgdGhlIHNwZWNpYWwgbW9kZSBzZXQgZnVuY3Rpb24sIHNldAorCSAqIHB1c2gvcHVsbCBtb2RlIGJ5IGRlZmF1bHQgaWYgbm8gbW9kZSBoYXMgYmVlbiBzZWxlY3RlZC4KIAkgKi8KLQl2YWwgfD0gKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfUFVTSF9QVUxMCi0JCQk8PCAoKGdwaW8gJiAweDA3KSA8PCAxKSk7Ci0Jd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQQ1IgKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKKwlvbGRtb2RlID0gdmFsICYgKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9NQVNLIDw8CisJCQkgKChvZmZzZXQgJiAweDA3KSA8PCAxKSk7CisJLyogbW9kZSA9IDAgbWVhbnMgaW5wdXQsIGVsc2Ugc29tZSBtb2RlIGlzIGFscmVhZHkgc2V0ICovCisJaWYgKG9sZG1vZGUgPT0gMCkgeworCQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSyA8PAorCQkJICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl2YWwgfD0gKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfUFVTSF9QVUxMCisJCQk8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkJd3JpdGVsKHZhbCwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CisJfQorCXUzMDBfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwogCi0vKgotICogRW5hYmxlIGFuIElSUSwgZWRnZSBpcyByaXNpbmcgZWRnZSAoIT0gMCkgb3IgZmFsbGluZyBlZGdlICg9PTApLgotICovCi12b2lkIGVuYWJsZV9pcnFfb25fZ3Bpb19waW4odW5zaWduZWQgZ3BpbywgaW50IGVkZ2UpCitzdGF0aWMgaW50IHUzMDBfZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbyA9IHRvX3UzMDBfZ3BpbyhjaGlwKTsKKwlpbnQgcmV0aXJxID0gZ3Bpby0+aXJxX2Jhc2UgKyBvZmZzZXQ7CiAKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElFTiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JdmFsIHw9ICgxIDw8IChncGlvICYgMHgwNykpOwotCXdyaXRlbCh2YWwsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVOICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCVUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElDUiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JaWYgKGVkZ2UpCi0JCXZhbCB8PSAoMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLQllbHNlCi0JCXZhbCAmPSB+KDEgPDwgKGdwaW8gJiAweDA3KSk7Ci0Jd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhJQ1IgKyBQSU5fVE9fUE9SVChncGlvKSAqCi0JCQkJVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlkZXZfZGJnKGdwaW8tPmRldiwgInJlcXVlc3QgSVJRIGZvciBHUElPICVkLCByZXR1cm4gJWRcbiIsIG9mZnNldCwKKwkJcmV0aXJxKTsKKwlyZXR1cm4gcmV0aXJxOwogfQotRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxX29uX2dwaW9fcGluKTsKIAotdm9pZCBkaXNhYmxlX2lycV9vbl9ncGlvX3Bpbih1bnNpZ25lZCBncGlvKQorc3RhdGljIGludCB1MzAwX2dwaW9fY29uZmlnKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJICAgICB1MTYgcGFyYW0sIHVuc2lnbmVkIGxvbmcgKmRhdGEpCiB7Ci0JdTMyIHZhbDsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvID0gdG9fdTMwMF9ncGlvKGNoaXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElFTiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JdmFsICY9IH4oMSA8PCAoZ3BpbyAmIDB4MDcpKTsKLQl3cml0ZWwodmFsLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElFTiArIFBJTl9UT19QT1JUKGdwaW8pICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycV9vbl9ncGlvX3Bpbik7Ci0KLS8qIEVuYWJsZSAodmFsdWUgPT0gMCkgb3IgZGlzYWJsZSAodmFsdWUgPT0gMSkgaW50ZXJuYWwgcHVsbHVwICovCi12b2lkIGdwaW9fcHVsbHVwKHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHZhbHVlKSB7Ci0JCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUEVSICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JCXdyaXRlbCh2YWwgfCAoMSA8PCAoZ3BpbyAmIDB4MDcpKSwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRVIgKwotCQkJCVBJTl9UT19QT1JUKGdwaW8pICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCX0gZWxzZSB7Ci0JCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUEVSICsgUElOX1RPX1BPUlQoZ3BpbykgKgotCQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JCXdyaXRlbCh2YWwgJiB+KDEgPDwgKGdwaW8gJiAweDA3KSksIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUEVSICsKLQkJCQlQSU5fVE9fUE9SVChncGlvKSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChncGlvX3B1bGx1cCk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBncGlvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgKnBvcnQgPSBkZXZfaWQ7Ci0JdTMyIHZhbDsKLQlpbnQgcGluOwotCi0JLyogUmVhZCBldmVudCByZWdpc3RlciAqLwotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVWICsgcG9ydC0+bnVtYmVyICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JLyogTWFzayB3aXRoIGVuYWJsZSByZWdpc3RlciAqLwotCXZhbCAmPSByZWFkbCh2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElFViArIHBvcnQtPm51bWJlciAqCi0JCQkJVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCS8qIE1hc2sgcmVsZXZhbnQgYml0cyAqLwotCXZhbCAmPSBVMzAwX0dQSU9fUFhJRVZfQUxMX0lSUV9FVkVOVF9NQVNLOwotCS8qIEFDSyBJUlEgKGNsZWFyIGV2ZW50KSAqLwotCXdyaXRlbCh2YWwsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYSUVWICsgcG9ydC0+bnVtYmVyICoKLQkJCQlVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7Ci0JLyogUHJpbnQgbWVzc2FnZSAqLwotCXdoaWxlICh2YWwgIT0gMCkgewotCQl1bnNpZ25lZCBncGlvOwotCi0JCXBpbiA9IF9fZmZzKHZhbCk7Ci0JCS8qIG1hc2sgb2ZmIHRoaXMgcGluICovCi0JCXZhbCAmPSB+KDEgPDwgcGluKTsKLQkJZ3BpbyA9IChwb3J0LT5udW1iZXIgPDwgMykgKyBwaW47Ci0KLQkJaWYgKGdwaW9fcGluW2dwaW9dLmNhbGxiYWNrKQotCQkJKHZvaWQpZ3Bpb19waW5bZ3Bpb10uY2FsbGJhY2soZ3Bpb19waW5bZ3Bpb10uZGF0YSk7Ci0JCWVsc2UKLQkJCWRldl9kYmcoZ3Bpb2RldiwgInN0cmF5IEdQSU8gSVJRIG9uIGxpbmUgJWRcbiIsCi0JCQkgICAgICAgZ3Bpbyk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb19zZXRfaW5pdGlhbF92YWx1ZXModm9pZCkKLXsKLSNpZmRlZiBVMzAwX0NPSDkwMTU3MV8zCi0JaW50IGksIGo7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsOwotCi0JLyogV3JpdGUgZGVmYXVsdCB2YWx1ZXMgdG8gYWxsIHBpbnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgaSsrKSB7Ci0JCXZhbCA9IDA7Ci0JCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCQl2YWwgfD0gKHUzMikgKHUzMDBfZ3Bpb19jb25maWdbaV1bal0uZGVmYXVsdF9vdXRwdXRfdmFsdWUgIT0gREVGQVVMVF9PVVRQVVRfTE9XKSA8PCBqOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXdyaXRlbCh2YWwsIHZpcnRiYXNlICsgVTMwMF9HUElPX1BYUERPUiArIGkgKiBVMzAwX0dQSU9fUE9SVFhfU1BBQ0lORyk7CisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgR1BJT19VMzAwX0NPTkZJR19CSUFTX1VOS05PV046CisJY2FzZSBHUElPX1UzMDBfQ09ORklHX0JJQVNfRkxPQVQ6CisJCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIHBlcikpOworCQl3cml0ZWwodmFsIHwgVTMwMF9QSU5fQklUKG9mZnNldCksIFUzMDBfUElOX1JFRyhvZmZzZXQsIHBlcikpOworCQlicmVhazsKKwljYXNlIEdQSU9fVTMwMF9DT05GSUdfQklBU19QVUxMX1VQOgorCQl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBwZXIpKTsKKwkJd3JpdGVsKHZhbCAmIH5VMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGVyKSk7CisJCWJyZWFrOworCWNhc2UgR1BJT19VMzAwX0NPTkZJR19EUklWRV9QVVNIX1BVTEw6CisJCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIHBjcikpOworCQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSworCQkJIDw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl2YWwgfD0gKFUzMDBfR1BJT19QWFBDUl9QSU5fTU9ERV9PVVRQVVRfUFVTSF9QVUxMCisJCQk8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkJd3JpdGVsKHZhbCwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CisJCWJyZWFrOworCWNhc2UgR1BJT19VMzAwX0NPTkZJR19EUklWRV9PUEVOX0RSQUlOOgorCQl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkJdmFsICY9IH4oVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sKKwkJCSA8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkJdmFsIHw9IChVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fRFJBSU4KKwkJCTw8ICgob2Zmc2V0ICYgMHgwNykgPDwgMSkpOworCQl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkJYnJlYWs7CisJY2FzZSBHUElPX1UzMDBfQ09ORklHX0RSSVZFX09QRU5fU09VUkNFOgorCQl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBwY3IpKTsKKwkJdmFsICY9IH4oVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX01BU0sKKwkJCSA8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkJdmFsIHw9IChVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfT1VUUFVUX09QRU5fU09VUkNFCisJCQk8PCAoKG9mZnNldCAmIDB4MDcpIDw8IDEpKTsKKwkJd3JpdGVsKHZhbCwgVTMwMF9QSU5fUkVHKG9mZnNldCwgcGNyKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJZGV2X2VycihncGlvLT5kZXYsICJpbGxlZ2FsIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdTMwMF9ncGlvX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAidTMwMC1ncGlvLWNoaXAiLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdldAkJCT0gdTMwMF9ncGlvX2dldCwKKwkuc2V0CQkJPSB1MzAwX2dwaW9fc2V0LAorCS5kaXJlY3Rpb25faW5wdXQJPSB1MzAwX2dwaW9fZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdTMwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLnRvX2lycQkJCT0gdTMwMF9ncGlvX3RvX2lycSwKK307CisKK3N0YXRpYyB2b2lkIHUzMDBfdG9nZ2xlX3RyaWdnZXIoc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbywgdW5zaWduZWQgb2Zmc2V0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChVMzAwX1BJTl9SRUcob2Zmc2V0LCBpY3IpKTsKKwkvKiBTZXQgbW9kZSBkZXBlbmRpbmcgb24gc3RhdGUgKi8KKwlpZiAodTMwMF9ncGlvX2dldCgmZ3Bpby0+Y2hpcCwgb2Zmc2V0KSkgeworCQkvKiBIaWdoIG5vdywgbGV0J3MgdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2UgbmV4dCB0aGVuICovCisJCXdyaXRlbCh2YWwgJiB+VTMwMF9QSU5fQklUKG9mZnNldCksIFUzMDBfUElOX1JFRyhvZmZzZXQsIGljcikpOworCQlkZXZfZGJnKGdwaW8tPmRldiwgIm5leHQgSVJRIG9uIGZhbGxpbmcgZWRnZSBvbiBwaW4gJWRcbiIsCisJCQlvZmZzZXQpOworCX0gZWxzZSB7CisJCS8qIExvdyBub3csIGxldCdzIHRyaWdnZXIgb24gcmlzaW5nIGVkZ2UgbmV4dCB0aGVuICovCisJCXdyaXRlbCh2YWwgfCBVMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAibmV4dCBJUlEgb24gcmlzaW5nIGVkZ2Ugb24gcGluICVkXG4iLAorCQkJb2Zmc2V0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdTMwMF9ncGlvX2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHJpZ2dlcikKK3sKKwlzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgKnBvcnQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvID0gcG9ydC0+Z3BpbzsKKwlpbnQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpby0+aXJxX2Jhc2U7CisJdTMyIHZhbDsKKworCWlmICgodHJpZ2dlciAmIElSUUZfVFJJR0dFUl9SSVNJTkcpICYmCisJICAgICh0cmlnZ2VyICYgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJCS8qCisJCSAqIFRoZSBHUElPIGJsb2NrIGNhbiBvbmx5IHRyaWdnZXIgb24gZmFsbGluZyBPUiByaXNpbmcgZWRnZXMsCisJCSAqIG5vdCBib3RoLiBTbyB3ZSBuZWVkIHRvIHRvZ2dsZSB0aGUgbW9kZSB3aGVuZXZlciB0aGUgcGluCisJCSAqIGdvZXMgZnJvbSBvbmUgc3RhdGUgdG8gdGhlIG90aGVyIHdpdGggYSBzcGVjaWFsIHN0YXRlIGZsYWcKKwkJICovCisJCWRldl9kYmcoZ3Bpby0+ZGV2LAorCQkJInRyaWdnZXIgb24gYm90aCByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBvbiBwaW4gJWRcbiIsCisJCQlvZmZzZXQpOworCQlwb3J0LT50b2dnbGVfZWRnZV9tb2RlIHw9IFUzMDBfUElOX0JJVChvZmZzZXQpOworCQl1MzAwX3RvZ2dsZV90cmlnZ2VyKGdwaW8sIG9mZnNldCk7CisJfSBlbHNlIGlmICh0cmlnZ2VyICYgSVJRRl9UUklHR0VSX1JJU0lORykgeworCQlkZXZfZGJnKGdwaW8tPmRldiwgInRyaWdnZXIgb24gcmlzaW5nIGVkZ2Ugb24gcGluICVkXG4iLAorCQkJb2Zmc2V0KTsKKwkJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCXdyaXRlbCh2YWwgfCBVMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCXBvcnQtPnRvZ2dsZV9lZGdlX21vZGUgJj0gflUzMDBfUElOX0JJVChvZmZzZXQpOworCX0gZWxzZSBpZiAodHJpZ2dlciAmIElSUUZfVFJJR0dFUl9GQUxMSU5HKSB7CisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAidHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2Ugb24gcGluICVkXG4iLAorCQkJb2Zmc2V0KTsKKwkJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgaWNyKSk7CisJCXdyaXRlbCh2YWwgJiB+VTMwMF9QSU5fQklUKG9mZnNldCksIFUzMDBfUElOX1JFRyhvZmZzZXQsIGljcikpOworCQlwb3J0LT50b2dnbGVfZWRnZV9tb2RlICY9IH5VMzAwX1BJTl9CSVQob2Zmc2V0KTsKIAl9CiAKLQkvKgotCSAqIFB1dCBhbGwgcGlucyB0aGF0IGFyZSBzZXQgdG8gZWl0aGVyICdHUElPX09VVCcgb3IgJ0dQSU9fTk9UX1VTRUQnCi0JICogdG8gb3V0cHV0IGFuZCAnR1BJT19JTicgdG8gaW5wdXQgZm9yIGVhY2ggcG9ydC4gQW5kIGluaXRpYWxpemUKLQkgKiBkZWZhdWx0IHZhbHVlIG9uIG91dHB1dHMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IFUzMDBfR1BJT19OVU1fUE9SVFM7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQ7IGorKykgewotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQQ1IgKwotCQkJCQkgaSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkJCS8qIE1hc2sgb3V0IHRoaXMgcGluICovCi0JCQl2YWwgJj0gfihVMzAwX0dQSU9fUFhQQ1JfUElOX01PREVfTUFTSyA8PCAoaiA8PCAxKSk7CisJcmV0dXJuIDA7Cit9CiAKLQkJCWlmICh1MzAwX2dwaW9fY29uZmlnW2ldW2pdLnBpbl91c2FnZSAhPSBHUElPX0lOKQotCQkJCXZhbCB8PSAoVTMwMF9HUElPX1BYUENSX1BJTl9NT0RFX09VVFBVVF9QVVNIX1BVTEwgPDwgKGogPDwgMSkpOwotCQkJd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQQ1IgKwotCQkJCQkgaSAqIFUzMDBfR1BJT19QT1JUWF9TUEFDSU5HKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK3N0YXRpYyB2b2lkIHUzMDBfZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgKnBvcnQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvID0gcG9ydC0+Z3BpbzsKKwlpbnQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpby0+aXJxX2Jhc2U7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXZhbCA9IHJlYWRsKFUzMDBfUElOX1JFRyhvZmZzZXQsIGllbikpOworCXdyaXRlbCh2YWwgfCBVMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWVuKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1MzAwX2dwaW9faXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSBwb3J0LT5ncGlvOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvLT5pcnFfYmFzZTsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKG9mZnNldCwgaWVuKSk7CisJd3JpdGVsKHZhbCAmIH5VMzAwX1BJTl9CSVQob2Zmc2V0KSwgVTMwMF9QSU5fUkVHKG9mZnNldCwgaWVuKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHUzMDBfZ3Bpb19pcnFjaGlwID0geworCS5uYW1lCQkJPSAidTMwMC1ncGlvLWlycWNoaXAiLAorCS5pcnFfZW5hYmxlCQk9IHUzMDBfZ3Bpb19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQkJPSB1MzAwX2dwaW9faXJxX2Rpc2FibGUsCisJLmlycV9zZXRfdHlwZQkJPSB1MzAwX2dwaW9faXJxX3R5cGUsCisKK307CisKK3N0YXRpYyB2b2lkIHUzMDBfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQgKnBvcnQgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSBwb3J0LT5ncGlvOworCWludCBwaW5vZmZzZXQgPSBwb3J0LT5udW1iZXIgPDwgMzsgLyogZ2V0IHRoZSByaWdodCBzdHJpZGUgKi8KKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKKwkvKiBSZWFkIGV2ZW50IHJlZ2lzdGVyICovCisJdmFsID0gcmVhZGwoVTMwMF9QSU5fUkVHKHBpbm9mZnNldCwgaWV2KSk7CisJLyogTWFzayByZWxldmFudCBiaXRzICovCisJdmFsICY9IDB4RkZVOyAvKiA4IGJpdHMgcGVyIHBvcnQgKi8KKwkvKiBBQ0sgSVJRIChjbGVhciBldmVudCkgKi8KKwl3cml0ZWwodmFsLCBVMzAwX1BJTl9SRUcocGlub2Zmc2V0LCBpZXYpKTsKKworCS8qIENhbGwgSVJRIGhhbmRsZXIgKi8KKwlpZiAodmFsICE9IDApIHsKKwkJaW50IGlycW9mZnNldDsKKworCQlmb3JfZWFjaF9zZXRfYml0KGlycW9mZnNldCwgJnZhbCwgVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQpIHsKKwkJCWludCBwaW5faXJxID0gZ3Bpby0+aXJxX2Jhc2UgKyAocG9ydC0+bnVtYmVyIDw8IDMpCisJCQkJKyBpcnFvZmZzZXQ7CisJCQlpbnQgb2Zmc2V0ID0gcGlub2Zmc2V0ICsgaXJxb2Zmc2V0OworCisJCQlkZXZfZGJnKGdwaW8tPmRldiwgIkdQSU8gSVJRICVkIG9uIHBpbiAlZFxuIiwKKwkJCQlwaW5faXJxLCBvZmZzZXQpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBpbl9pcnEpOworCQkJLyoKKwkJCSAqIFRyaWdnZXJpbmcgSVJRIG9uIGJvdGggcmlzaW5nIGFuZCBmYWxsaW5nIGVkZ2UKKwkJCSAqIG5lZWRzIG1vY2tlcnkKKwkJCSAqLworCQkJaWYgKHBvcnQtPnRvZ2dsZV9lZGdlX21vZGUgJiBVMzAwX1BJTl9CSVQob2Zmc2V0KSkKKwkJCQl1MzAwX3RvZ2dsZV90cmlnZ2VyKGdwaW8sIG9mZnNldCk7CiAJCX0KIAl9CiAKLQkvKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgaW50ZXJuYWwgcHVsbC11cHMgaW4gdGhlIEdQSU8gQVNJQyBibG9jayAqLwotCWZvciAoaSA9IDA7IGkgPCBVMzAwX0dQSU9fTUFYOyBpKyspIHsKLQkJdmFsID0gMDsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJCXZhbCB8PSAodTMyKSgodTMwMF9ncGlvX2NvbmZpZ1tpXVtqXS5wdWxsX3VwID09IERJU0FCTEVfUFVMTF9VUCkgPDwgaik7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJd3JpdGVsKHZhbCwgdmlydGJhc2UgKyBVMzAwX0dQSU9fUFhQRVIgKyBpICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotI2VuZGlmCisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX3VubWFzaygmZGVzYy0+aXJxX2RhdGEpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBfX2luaXQgdTMwMF9ncGlvX2luaXRfcGluKHN0cnVjdCB1MzAwX2dwaW8gKmdwaW8sCisJCQkJICAgICAgaW50IG9mZnNldCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdTMwMF9ncGlvX2NvbmZkYXRhICpjb25mKQogewotCXUzMiB2YWw7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7Ci0JaW50IG51bV9pcnFzOworCS8qIFNldCBtb2RlOiBpbnB1dCBvciBvdXRwdXQgKi8KKwlpZiAoY29uZi0+b3V0cHV0KSB7CisJCXUzMDBfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KCZncGlvLT5jaGlwLCBvZmZzZXQsIGNvbmYtPm91dHZhbCk7CiAKLQlncGlvZGV2ID0gJnBkZXYtPmRldjsKLQltZW1zZXQoZ3Bpb19waW4sIDAsIHNpemVvZihncGlvX3BpbikpOworCQkvKiBEZWFjdGl2YXRlIGJpYXMgbW9kZSBmb3Igb3V0cHV0ICovCisJCXUzMDBfZ3Bpb19jb25maWcoJmdwaW8tPmNoaXAsIG9mZnNldCwKKwkJCQkgR1BJT19VMzAwX0NPTkZJR19CSUFTX0ZMT0FULAorCQkJCSBOVUxMKTsKKworCQkvKiBTZXQgZHJpdmUgbW9kZSBmb3Igb3V0cHV0ICovCisJCXUzMDBfZ3Bpb19jb25maWcoJmdwaW8tPmNoaXAsIG9mZnNldCwKKwkJCQkgR1BJT19VMzAwX0NPTkZJR19EUklWRV9QVVNIX1BVTEwsIE5VTEwpOworCisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAic2V0IHVwIHBpbiAlZCBhcyBvdXRwdXQsIHZhbHVlOiAlZFxuIiwKKwkJCW9mZnNldCwgY29uZi0+b3V0dmFsKTsKKwl9IGVsc2UgeworCQl1MzAwX2dwaW9fZGlyZWN0aW9uX2lucHV0KCZncGlvLT5jaGlwLCBvZmZzZXQpOworCisJCS8qIEFsd2F5cyBzZXQgb3V0cHV0IGxvdyBvbiBpbnB1dCBwaW5zICovCisJCXUzMDBfZ3Bpb19zZXQoJmdwaW8tPmNoaXAsIG9mZnNldCwgMCk7CisKKwkJLyogU2V0IGJpYXMgbW9kZSBmb3IgaW5wdXQgKi8KKwkJdTMwMF9ncGlvX2NvbmZpZygmZ3Bpby0+Y2hpcCwgb2Zmc2V0LCBjb25mLT5iaWFzX21vZGUsIE5VTEwpOworCisJCWRldl9kYmcoZ3Bpby0+ZGV2LCAic2V0IHVwIHBpbiAlZCBhcyBpbnB1dCwgYmlhczogJTA0eFxuIiwKKwkJCW9mZnNldCwgY29uZi0+Ymlhc19tb2RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB1MzAwX2dwaW9faW5pdF9jb2g5MDE1NzEoc3RydWN0IHUzMDBfZ3BpbyAqZ3BpbywKKwkJCQkgICAgIHN0cnVjdCB1MzAwX2dwaW9fcGxhdGZvcm0gKnBsYXQpCit7CisJaW50IGksIGo7CisKKwkvKiBXcml0ZSBkZWZhdWx0IGNvbmZpZyBhbmQgdmFsdWVzIHRvIGFsbCBwaW5zICovCisJZm9yIChpID0gMDsgaSA8IHBsYXQtPnBvcnRzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJY29uc3Qgc3RydWN0IHUzMDBfZ3Bpb19jb25mZGF0YSAqY29uZjsKKwkJCWludCBvZmZzZXQgPSAoaSo4KSArIGo7CisKKwkJCWlmIChwbGF0LT52YXJpYW50ID09IFUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzMzNSkKKwkJCQljb25mID0gJmJzMzM1X2dwaW9fY29uZmlnW2ldW2pdOworCQkJZWxzZSBpZiAocGxhdC0+dmFyaWFudCA9PSBVMzAwX0dQSU9fQ09IOTAxNTcxXzNfQlMzNjUpCisJCQkJY29uZiA9ICZiczM2NV9ncGlvX2NvbmZpZ1tpXVtqXTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKworCQkJdTMwMF9ncGlvX2luaXRfcGluKGdwaW8sIG9mZnNldCwgY29uZik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MzAwX2dwaW9fZnJlZV9wb3J0cyhzdHJ1Y3QgdTMwMF9ncGlvICpncGlvKQoreworCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZ3Bpby0+cG9ydF9saXN0KSB7CisJCXBvcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB1MzAwX2dwaW9fcG9ydCwgbm9kZSk7CisJCWxpc3RfZGVsKCZwb3J0LT5ub2RlKTsKKwkJZnJlZV9pcnEocG9ydC0+aXJxLCBwb3J0KTsKKwkJa2ZyZWUocG9ydCk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCB1MzAwX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdTMwMF9ncGlvX3BsYXRmb3JtICpwbGF0ID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgdTMwMF9ncGlvICpncGlvOworCWludCBlcnIgPSAwOworCWludCBwb3J0bm87CisJdTMyIHZhbDsKKwl1MzIgaWZyOworCWludCBpOworCisJZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1MzAwX2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoZ3BpbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlncGlvLT5jaGlwID0gdTMwMF9ncGlvX2NoaXA7CisJZ3Bpby0+Y2hpcC5uZ3BpbyA9IHBsYXQtPnBvcnRzICogVTMwMF9HUElPX1BJTlNfUEVSX1BPUlQ7CisJZ3Bpby0+aXJxX2Jhc2UgPSBwbGF0LT5ncGlvX2lycV9iYXNlOworCWdwaW8tPmNoaXAuZGV2ID0gJnBkZXYtPmRldjsKKwlncGlvLT5jaGlwLmJhc2UgPSBwbGF0LT5ncGlvX2Jhc2U7CisJZ3Bpby0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCS8qIEdldCBHUElPIGNsb2NrICovCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJZXJyID0gUFRSX0VSUihjbGspOwotCQlkZXZfZXJyKGdwaW9kZXYsICJjb3VsZCBub3QgZ2V0IEdQSU8gY2xvY2tcbiIpOworCWdwaW8tPmNsayA9IGNsa19nZXQoZ3Bpby0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGdwaW8tPmNsaykpIHsKKwkJZXJyID0gUFRSX0VSUihncGlvLT5jbGspOworCQlkZXZfZXJyKGdwaW8tPmRldiwgImNvdWxkIG5vdCBnZXQgR1BJTyBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX25vX2NsazsKIAl9Ci0JZXJyID0gY2xrX2VuYWJsZShjbGspOworCWVyciA9IGNsa19lbmFibGUoZ3Bpby0+Y2xrKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZ3Bpb2RldiwgImNvdWxkIG5vdCBlbmFibGUgR1BJTyBjbG9ja1xuIik7CisJCWRldl9lcnIoZ3Bpby0+ZGV2LCAiY291bGQgbm90IGVuYWJsZSBHUElPIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfbm9fY2xrX2VuYWJsZTsKIAl9CiAKLQltZW1yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghbWVtcmVzKQorCWdwaW8tPm1lbXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFncGlvLT5tZW1yZXMpIHsKKwkJZGV2X2VycihncGlvLT5kZXYsICJjb3VsZCBub3QgZ2V0IEdQSU8gbWVtb3J5IHJlc291cmNlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfbm9fcmVzb3VyY2U7CisJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1yZXMpLAorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGdwaW8tPm1lbXJlcy0+c3RhcnQsCisJCQkJcmVzb3VyY2Vfc2l6ZShncGlvLT5tZW1yZXMpLAogCQkJCSJHUElPIENvbnRyb2xsZXIiKSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9ub19pb3JlZ2lvbjsKIAl9CiAKLQl2aXJ0YmFzZSA9IGlvcmVtYXAobWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1yZXMpKTsKLQlpZiAoIXZpcnRiYXNlKSB7CisJZ3Bpby0+YmFzZSA9IGlvcmVtYXAoZ3Bpby0+bWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShncGlvLT5tZW1yZXMpKTsKKwlpZiAoIWdwaW8tPmJhc2UpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfbm9faW9yZW1hcDsKIAl9Ci0JZGV2X2luZm8oZ3Bpb2RldiwgInJlbWFwcGVkIDB4JTA4eCB0byAlcFxuIiwKLQkJIG1lbXJlcy0+c3RhcnQsIHZpcnRiYXNlKTsKIAotI2lmZGVmIFUzMDBfQ09IOTAxMzM1Ci0JZGV2X2luZm8oZ3Bpb2RldiwgImluaXRpYWxpemluZyBHUElPIENvbnRyb2xsZXIgQ09IIDkwMSAzMzVcbiIpOwotCS8qIFR1cm4gb24gdGhlIEdQSU8gYmxvY2sgKi8KLQl3cml0ZWwoVTMwMF9HUElPX0NSX0JMT0NLX0NMT0NLX0VOQUJMRSwgdmlydGJhc2UgKyBVMzAwX0dQSU9fQ1IpOwotI2VuZGlmCisJaWYgKHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTMzNSkgeworCQlkZXZfaW5mbyhncGlvLT5kZXYsCisJCQkgImluaXRpYWxpemluZyBHUElPIENvbnRyb2xsZXIgQ09IIDkwMSAzMzVcbiIpOworCQlncGlvLT5zdHJpZGUgPSBVMzAwXzMzNV9QT1JUX1NUUklERTsKKwkJZ3Bpby0+cGNyID0gVTMwMF8zMzVfUFhQQ1I7CisJCWdwaW8tPmRvciA9IFUzMDBfMzM1X1BYUERPUjsKKwkJZ3Bpby0+ZGlyID0gVTMwMF8zMzVfUFhQRElSOworCQlncGlvLT5wZXIgPSBVMzAwXzMzNV9QWFBFUjsKKwkJZ3Bpby0+aWNyID0gVTMwMF8zMzVfUFhJQ1I7CisJCWdwaW8tPmllbiA9IFUzMDBfMzM1X1BYSUVOOworCQlncGlvLT5pZXYgPSBVMzAwXzMzNV9QWElFVjsKKwkJaWZyID0gVTMwMF8zMzVfUFhJRlI7CiAKLSNpZmRlZiBVMzAwX0NPSDkwMTU3MV8zCi0JZGV2X2luZm8oZ3Bpb2RldiwgImluaXRpYWxpemluZyBHUElPIENvbnRyb2xsZXIgQ09IIDkwMSA1NzEvM1xuIik7Ci0JdmFsID0gcmVhZGwodmlydGJhc2UgKyBVMzAwX0dQSU9fQ1IpOwotCWRldl9pbmZvKGdwaW9kZXYsICJDT0g5MDE1NzEvMyBibG9jayB2ZXJzaW9uOiAlZCwgIiBcCi0JICAgICAgICJudW1iZXIgb2YgY29yZXM6ICVkXG4iLAotCSAgICAgICAoKHZhbCAmIDB4MDAwMEZFMDApID4+IDkpLAotCSAgICAgICAoKHZhbCAmIDB4MDAwMDAxRkMpID4+IDIpKTsKLQl3cml0ZWwoVTMwMF9HUElPX0NSX0JMT0NLX0NMS1JRX0VOQUJMRSwgdmlydGJhc2UgKyBVMzAwX0dQSU9fQ1IpOwotI2VuZGlmCisJCS8qIFR1cm4gb24gdGhlIEdQSU8gYmxvY2sgKi8KKwkJd3JpdGVsKFUzMDBfMzM1X0NSX0JMT0NLX0NMT0NLX0VOQUJMRSwKKwkJICAgICAgIGdwaW8tPmJhc2UgKyBVMzAwXzMzNV9DUik7CisJfSBlbHNlIGlmIChwbGF0LT52YXJpYW50ID09IFUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzMzNSB8fAorCQkgICBwbGF0LT52YXJpYW50ID09IFUzMDBfR1BJT19DT0g5MDE1NzFfM19CUzM2NSkgeworCQlkZXZfaW5mbyhncGlvLT5kZXYsCisJCQkgImluaXRpYWxpemluZyBHUElPIENvbnRyb2xsZXIgQ09IIDkwMSA1NzEvM1xuIik7CisJCWdwaW8tPnN0cmlkZSA9IFUzMDBfNTcxX1BPUlRfU1RSSURFOworCQlncGlvLT5wY3IgPSBVMzAwXzU3MV9QWFBDUjsKKwkJZ3Bpby0+ZG9yID0gVTMwMF81NzFfUFhQRE9SOworCQlncGlvLT5kaXIgPSBVMzAwXzU3MV9QWFBESVI7CisJCWdwaW8tPnBlciA9IFUzMDBfNTcxX1BYUEVSOworCQlncGlvLT5pY3IgPSBVMzAwXzU3MV9QWElDUjsKKwkJZ3Bpby0+aWVuID0gVTMwMF81NzFfUFhJRU47CisJCWdwaW8tPmlldiA9IFUzMDBfNTcxX1BYSUVWOworCQlpZnIgPSBVMzAwXzU3MV9QWElGUjsKIAotCWdwaW9fc2V0X2luaXRpYWxfdmFsdWVzKCk7Ci0KLQlmb3IgKG51bV9pcnFzID0gMCA7IG51bV9pcnFzIDwgVTMwMF9HUElPX05VTV9QT1JUUzsgbnVtX2lycXMrKykgewotCi0JCWdwaW9fcG9ydHNbbnVtX2lycXNdLmlycSA9Ci0JCQlwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LAotCQkJCQkJZ3Bpb19wb3J0c1tudW1faXJxc10ubmFtZSk7Ci0KLQkJZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb19wb3J0c1tudW1faXJxc10uaXJxLAotCQkJCSAgZ3Bpb19pcnFfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKLQkJCQkgIGdwaW9fcG9ydHNbbnVtX2lycXNdLm5hbWUsCi0JCQkJICAmZ3Bpb19wb3J0c1tudW1faXJxc10pOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKGdwaW9kZXYsICJjYW5ub3QgYWxsb2NhdGUgSVJRIGZvciAlcyFcbiIsCi0JCQkJZ3Bpb19wb3J0c1tudW1faXJxc10ubmFtZSk7Ci0JCQlnb3RvIGVycl9ub19pcnE7Ci0JCX0KLQkJLyogVHVybnMgb2ZmIFBvcnRYX2lycV9mb3JjZSAqLwotCQl3cml0ZWwoMHgwLCB2aXJ0YmFzZSArIFUzMDBfR1BJT19QWElGUiArCi0JCQkJIG51bV9pcnFzICogVTMwMF9HUElPX1BPUlRYX1NQQUNJTkcpOworCQl2YWwgPSByZWFkbChncGlvLT5iYXNlICsgVTMwMF81NzFfQ1IpOworCQlkZXZfaW5mbyhncGlvLT5kZXYsICJDT0g5MDE1NzEvMyBibG9jayB2ZXJzaW9uOiAlZCwgIiBcCisJCQkgIm51bWJlciBvZiBjb3JlczogJWQgdG90YWxsaW5nICVkIHBpbnNcbiIsCisJCQkgKCh2YWwgJiAweDAwMDAwMUZDKSA+PiAyKSwKKwkJCSAoKHZhbCAmIDB4MDAwMEZFMDApID4+IDkpLAorCQkJICgodmFsICYgMHgwMDAwRkUwMCkgPj4gOSkgKiA4KTsKKwkJd3JpdGVsKFUzMDBfNTcxX0NSX0JMT0NLX0NMS1JRX0VOQUJMRSwKKwkJICAgICAgIGdwaW8tPmJhc2UgKyBVMzAwXzU3MV9DUik7CisJCXUzMDBfZ3Bpb19pbml0X2NvaDkwMTU3MShncGlvLCBwbGF0KTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGdwaW8tPmRldiwgInVua25vd24gYmxvY2sgdmFyaWFudFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3Vua25vd25fdmFyaWFudDsKIAl9CiAKKwkvKiBBZGQgZWFjaCBwb3J0IHdpdGggaXRzIElSUSBzZXBhcmF0ZWx5ICovCisJSU5JVF9MSVNUX0hFQUQoJmdwaW8tPnBvcnRfbGlzdCk7CisJZm9yIChwb3J0bm8gPSAwIDsgcG9ydG5vIDwgcGxhdC0+cG9ydHM7IHBvcnRubysrKSB7CisJCXN0cnVjdCB1MzAwX2dwaW9fcG9ydCAqcG9ydCA9CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTMwMF9ncGlvX3BvcnQpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIXBvcnQpIHsKKwkJCWRldl9lcnIoZ3Bpby0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnJfbm9fcG9ydDsKKwkJfQorCisJCXNucHJpbnRmKHBvcnQtPm5hbWUsIDgsICJncGlvJWQiLCBwb3J0bm8pOworCQlwb3J0LT5udW1iZXIgPSBwb3J0bm87CisJCXBvcnQtPmdwaW8gPSBncGlvOworCisJCXBvcnQtPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsCisJCQkJCQkgICAgcG9ydC0+bmFtZSk7CisKKwkJZGV2X2RiZyhncGlvLT5kZXYsICJyZWdpc3RlciBJUlEgJWQgZm9yICVzXG4iLCBwb3J0LT5pcnEsCisJCQlwb3J0LT5uYW1lKTsKKworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihwb3J0LT5pcnEsIHUzMDBfZ3Bpb19pcnFfaGFuZGxlcik7CisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKHBvcnQtPmlycSwgcG9ydCk7CisKKwkJLyogRm9yIGVhY2ggR1BJTyBwaW4gc2V0IHRoZSB1bmlxdWUgSVJRIGhhbmRsZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IFUzMDBfR1BJT19QSU5TX1BFUl9QT1JUOyBpKyspIHsKKwkJCWludCBpcnFubyA9IGdwaW8tPmlycV9iYXNlICsgKHBvcnRubyA8PCAzKSArIGk7CisKKwkJCWRldl9kYmcoZ3Bpby0+ZGV2LCAiaGFuZGxlciBmb3IgSVJRICVkIG9uICVzXG4iLAorCQkJCWlycW5vLCBwb3J0LT5uYW1lKTsKKwkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnFubywgJnUzMDBfZ3Bpb19pcnFjaGlwLAorCQkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJCXNldF9pcnFfZmxhZ3MoaXJxbm8sIElSUUZfVkFMSUQpOworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxbm8sIHBvcnQpOworCQl9CisKKwkJLyogVHVybnMgb2ZmIGlycSBmb3JjZSAodGVzdCByZWdpc3RlcikgZm9yIHRoaXMgcG9ydCAqLworCQl3cml0ZWwoMHgwLCBncGlvLT5iYXNlICsgcG9ydG5vICogZ3Bpby0+c3RyaWRlICsgaWZyKTsKKworCQlsaXN0X2FkZF90YWlsKCZwb3J0LT5ub2RlLCAmZ3Bpby0+cG9ydF9saXN0KTsKKwl9CisJZGV2X2RiZyhncGlvLT5kZXYsICJpbml0aWFsaXplZCAlZCBHUElPIHBvcnRzXG4iLCBwb3J0bm8pOworCisJZXJyID0gZ3Bpb2NoaXBfYWRkKCZncGlvLT5jaGlwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZ3Bpby0+ZGV2LCAidW5hYmxlIHRvIGFkZCBncGlvY2hpcDogJWRcbiIsIGVycik7CisJCWdvdG8gZXJyX25vX2NoaXA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpbyk7CisKIAlyZXR1cm4gMDsKIAotIGVycl9ub19pcnE6Ci0JZm9yIChpID0gMDsgaSA8IG51bV9pcnFzOyBpKyspCi0JCWZyZWVfaXJxKGdwaW9fcG9ydHNbaV0uaXJxLCAmZ3Bpb19wb3J0c1tpXSk7Ci0JaW91bm1hcCh2aXJ0YmFzZSk7Ci0gZXJyX25vX2lvcmVtYXA6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtcmVzKSk7Ci0gZXJyX25vX2lvcmVnaW9uOgotIGVycl9ub19yZXNvdXJjZToKLQljbGtfZGlzYWJsZShjbGspOwotIGVycl9ub19jbGtfZW5hYmxlOgotCWNsa19wdXQoY2xrKTsKLSBlcnJfbm9fY2xrOgotCWRldl9pbmZvKGdwaW9kZXYsICJtb2R1bGUgRVJST1I6JWRcbiIsIGVycik7CitlcnJfbm9fY2hpcDoKK2Vycl9ub19wb3J0OgorCXUzMDBfZ3Bpb19mcmVlX3BvcnRzKGdwaW8pOworZXJyX3Vua25vd25fdmFyaWFudDoKKwlpb3VubWFwKGdwaW8tPmJhc2UpOworZXJyX25vX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGdwaW8tPm1lbXJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoZ3Bpby0+bWVtcmVzKSk7CitlcnJfbm9faW9yZWdpb246CitlcnJfbm9fcmVzb3VyY2U6CisJY2xrX2Rpc2FibGUoZ3Bpby0+Y2xrKTsKK2Vycl9ub19jbGtfZW5hYmxlOgorCWNsa19wdXQoZ3Bpby0+Y2xrKTsKK2Vycl9ub19jbGs6CisJa2ZyZWUoZ3Bpbyk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIm1vZHVsZSBFUlJPUjolZFxuIiwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2V4aXQgdTMwMF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCBpOworCXN0cnVjdCB1MzAwX2dwaW9fcGxhdGZvcm0gKnBsYXQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCB1MzAwX2dwaW8gKmdwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyOwogCiAJLyogVHVybiBvZmYgdGhlIEdQSU8gYmxvY2sgKi8KLQl3cml0ZWwoMHgwMDAwMDAwMFUsIHZpcnRiYXNlICsgVTMwMF9HUElPX0NSKTsKLQlmb3IgKGkgPSAwIDsgaSA8IFUzMDBfR1BJT19OVU1fUE9SVFM7IGkrKykKLQkJZnJlZV9pcnEoZ3Bpb19wb3J0c1tpXS5pcnEsICZncGlvX3BvcnRzW2ldKTsKLQlpb3VubWFwKHZpcnRiYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24obWVtcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1yZXMpKTsKLQljbGtfZGlzYWJsZShjbGspOwotCWNsa19wdXQoY2xrKTsKKwlpZiAocGxhdC0+dmFyaWFudCA9PSBVMzAwX0dQSU9fQ09IOTAxMzM1KQorCQl3cml0ZWwoMHgwMDAwMDAwMFUsIGdwaW8tPmJhc2UgKyBVMzAwXzMzNV9DUik7CisJaWYgKHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzM1IHx8CisJICAgIHBsYXQtPnZhcmlhbnQgPT0gVTMwMF9HUElPX0NPSDkwMTU3MV8zX0JTMzY1KQorCQl3cml0ZWwoMHgwMDAwMDAwMFUsIGdwaW8tPmJhc2UgKyBVMzAwXzU3MV9DUik7CisKKwllcnIgPSBncGlvY2hpcF9yZW1vdmUoJmdwaW8tPmNoaXApOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZ3Bpby0+ZGV2LCAidW5hYmxlIHRvIHJlbW92ZSBncGlvY2hpcDogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCXUzMDBfZ3Bpb19mcmVlX3BvcnRzKGdwaW8pOworCWlvdW5tYXAoZ3Bpby0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGdwaW8tPm1lbXJlcy0+c3RhcnQsCisJCQkgICByZXNvdXJjZV9zaXplKGdwaW8tPm1lbXJlcykpOworCWNsa19kaXNhYmxlKGdwaW8tPmNsayk7CisJY2xrX3B1dChncGlvLT5jbGspOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGdwaW8pOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncGlvX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHUzMDBfZ3Bpb19kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInUzMDAtZ3BpbyIsCiAJfSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKGdwaW9fcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHUzMDBfZ3Bpb19yZW1vdmUpLAogfTsKIAogCiBzdGF0aWMgaW50IF9faW5pdCB1MzAwX2dwaW9faW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmdwaW9fZHJpdmVyLCBncGlvX3Byb2JlKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZ1MzAwX2dwaW9fZHJpdmVyLCB1MzAwX2dwaW9fcHJvYmUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdTMwMF9ncGlvX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3Bpb19kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ1MzAwX2dwaW9fZHJpdmVyKTsKIH0KIAogYXJjaF9pbml0Y2FsbCh1MzAwX2dwaW9faW5pdCk7CiBtb2R1bGVfZXhpdCh1MzAwX2dwaW9fZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIkxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAc3Rlcmljc3Nvbi5jb20+Iik7Ci0KLSNpZmRlZiBVMzAwX0NPSDkwMTU3MV8zCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNULUVyaWNzc29uIEFCIENPSCA5MDEgNTcxLzMgR1BJTyBkcml2ZXIiKTsKLSNlbmRpZgotCi0jaWZkZWYgVTMwMF9DT0g5MDEzMzUKLU1PRFVMRV9ERVNDUklQVElPTigiU1QtRXJpY3Nzb24gQUIgQ09IIDkwMSAzMzUgR1BJTyBkcml2ZXIiKTsKLSNlbmRpZgotCitNT0RVTEVfREVTQ1JJUFRJT04oIlNULUVyaWNzc29uIEFCIENPSCA5MDEgMzM1L0NPSCA5MDEgNTcxLzMgR1BJTyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXhpbGlueC5jIGIvZHJpdmVycy9ncGlvL2dwaW8teGlsaW54LmMKaW5kZXggODQ2ZmJkNS4uMGNlNmFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8teGlsaW54LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8teGlsaW54LmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwppbmRleCBiNDkzNjYzLi4xMzY4ODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwpAQCAtOSw3ICs5LDYgQEAKIAlkZXBlbmRzIG9uIChBR1AgfHwgQUdQPW4pICYmICFFTVVMQVRFRF9DTVBYQ0hHICYmIE1NVQogCXNlbGVjdCBJMkMKIAlzZWxlY3QgSTJDX0FMR09CSVQKLQlzZWxlY3QgU0xPV19XT1JLCiAJaGVscAogCSAgS2VybmVsLWxldmVsIHN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpCiAJICBpbnRyb2R1Y2VkIGluIFhGcmVlODYgNC4wLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gc2VsZWN0CkBAIC05Niw2ICs5NSw3IEBACiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAkjIGk5MTUgZGVwZW5kcyBvbiBBQ1BJX1ZJREVPIHdoZW4gQUNQSSBpcyBlbmFibGVkCiAJIyBidXQgZm9yIHNlbGVjdCB0byB3b3JrLCBuZWVkIHRvIHNlbGVjdCBBQ1BJX1ZJREVPJ3MgZGVwZW5kZW5jaWVzLCBpY2sKKwlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlmIEFDUEkKIAlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpZiBBQ1BJCiAJc2VsZWN0IFZJREVPX09VVFBVVF9DT05UUk9MIGlmIEFDUEkKIAlzZWxlY3QgSU5QVVQgaWYgQUNQSQpAQCAtMTU4LDMgKzE1OCw3IEBACiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2F2YWdlM0QvNC9TdXBlclNhdmFnZS9Qcm8vVHdpc3RlcgogCSAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhdmFnZS4KKworc291cmNlICJkcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCmluZGV4IDg5Y2YwNWEuLmMwNDk2ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKQEAgLTM1LDQgKzM1LDUgQEAKIG9iai0kKENPTkZJR19EUk1fVk1XR0ZYKSs9IHZtd2dmeC8KIG9iai0kKENPTkZJR19EUk1fVklBKQkrPXZpYS8KIG9iai0kKENPTkZJR19EUk1fTk9VVkVBVSkgKz1ub3V2ZWF1Lworb2JqLSQoQ09ORklHX0RSTV9FWFlOT1MpICs9ZXh5bm9zLwogb2JqLXkJCQkrPSBpMmMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXRpX3BjaWdhcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9hdGlfcGNpZ2FydC5jCmluZGV4IDFjMzY0OTIuLjlhZmU0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hdGlfcGNpZ2FydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hdGlfcGNpZ2FydC5jCkBAIC0zMSw2ICszMSw3IEBACiAgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogIyBkZWZpbmUgQVRJX1BDSUdBUlRfUEFHRV9TSVpFCQk0MDk2CS8qKjwgUENJIEdBUlQgcGFnZSBzaXplICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9idWZmZXIuYwppbmRleCA1MjlhMGRiLi4wOGNjZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmZmVyLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqIFBhdWxpIE5pZW1pbmVuIDxzdW9ra29zLWF0LWdtYWlsLWRvdC1jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybV9idWZmZXIuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCmluZGV4IDYxZTFlZjkuLjMwMzcyZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnVmcy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NhY2hlLmMKaW5kZXggMGUzYmQ1Yi4uNTkyODY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jYWNoZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY2FjaGUuYwpAQCAtMjgsNiArMjgsNyBAQAogICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKaW5kZXggZmU3MzhmMC4uNDA1YzYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCkBAIC0xNjIsNiArMTYzLDcgQEAKIAl7IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQiwgIkhETUktQiIsIDAgfSwKIAl7IERSTV9NT0RFX0NPTk5FQ1RPUl9UViwgIlRWIiwgMCB9LAogCXsgRFJNX01PREVfQ09OTkVDVE9SX2VEUCwgImVEUCIsIDAgfSwKKwl7IERSTV9NT0RFX0NPTk5FQ1RPUl9WSVJUVUFMLCAiVmlydHVhbCIsIDB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3QgZHJtX2VuY29kZXJfZW51bV9saXN0W10gPQpAQCAtMTcwLDYgKzE3Miw3IEBACiAJeyBEUk1fTU9ERV9FTkNPREVSX1RNRFMsICJUTURTIiB9LAogCXsgRFJNX01PREVfRU5DT0RFUl9MVkRTLCAiTFZEUyIgfSwKIAl7IERSTV9NT0RFX0VOQ09ERVJfVFZEQUMsICJUViIgfSwKKwl7IERSTV9NT0RFX0VOQ09ERVJfVklSVFVBTCwgIlZpcnR1YWwiIH0sCiB9OwogCiBjaGFyICpkcm1fZ2V0X2VuY29kZXJfbmFtZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC00NjMsOCArNDY2LDEwIEBACiAJbGlzdF9hZGRfdGFpbCgmY29ubmVjdG9yLT5oZWFkLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCk7CiAJZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yKys7CiAKLQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCi0JCQkJICAgICAgZGV2LT5tb2RlX2NvbmZpZy5lZGlkX3Byb3BlcnR5LCAwKTsKKwlpZiAoY29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwpCisJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkJICAgICAgZGV2LT5tb2RlX2NvbmZpZy5lZGlkX3Byb3BlcnR5LAorCQkJCQkgICAgICAwKTsKIAogCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKIAkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLmRwbXNfcHJvcGVydHksIDApOwpAQCAtMjExMyw4ICsyMTE4LDEwIEBACiAJcHJvcGVydHktPm51bV92YWx1ZXMgPSBudW1fdmFsdWVzOwogCUlOSVRfTElTVF9IRUFEKCZwcm9wZXJ0eS0+ZW51bV9ibG9iX2xpc3QpOwogCi0JaWYgKG5hbWUpCisJaWYgKG5hbWUpIHsKIAkJc3RybmNweShwcm9wZXJ0eS0+bmFtZSwgbmFtZSwgRFJNX1BST1BfTkFNRV9MRU4pOworCQlwcm9wZXJ0eS0+bmFtZVtEUk1fUFJPUF9OQU1FX0xFTi0xXSA9ICdcMCc7CisJfQogCiAJbGlzdF9hZGRfdGFpbCgmcHJvcGVydHktPmhlYWQsICZkZXYtPm1vZGVfY29uZmlnLnByb3BlcnR5X2xpc3QpOwogCXJldHVybiBwcm9wZXJ0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYwppbmRleCBmODhhOWIyLi4zOTY5Zjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCkBAIC0yOSw2ICsyOSw5IEBACiAgKiAgICAgIEplc3NlIEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgpAQCAtMzcyLDExICszNzUsMTMgQEAKIAkJZW5jb2Rlcl9mdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOwogCQlpZiAoIShyZXQgPSBlbmNvZGVyX2Z1bmNzLT5tb2RlX2ZpeHVwKGVuY29kZXIsIG1vZGUsCiAJCQkJCQkgICAgICBhZGp1c3RlZF9tb2RlKSkpIHsKKwkJCURSTV9ERUJVR19LTVMoIkVuY29kZXIgZml4dXAgZmFpbGVkXG4iKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAogCWlmICghKHJldCA9IGNydGNfZnVuY3MtPm1vZGVfZml4dXAoY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSkpKSB7CisJCURSTV9ERUJVR19LTVMoIkNSVEMgZml4dXAgZmFpbGVkXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAlEUk1fREVCVUdfS01TKCJbQ1JUQzolZF1cbiIsIGNydGMtPmJhc2UuaWQpOwpAQCAtNDc5LDYgKzQ4NCw3IEBACiAJc3RydWN0IGRybV9jb25uZWN0b3IgKnNhdmVfY29ubmVjdG9ycywgKmNvbm5lY3RvcjsKIAlpbnQgY291bnQgPSAwLCBybywgZmFpbCA9IDA7CiAJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jczsKKwlzdHJ1Y3QgZHJtX21vZGVfc2V0IHNhdmVfc2V0OwogCWludCByZXQgPSAwOwogCWludCBpOwogCkBAIC01NTEsNiArNTU3LDEyIEBACiAJCXNhdmVfY29ubmVjdG9yc1tjb3VudCsrXSA9ICpjb25uZWN0b3I7CiAJfQogCisJc2F2ZV9zZXQuY3J0YyA9IHNldC0+Y3J0YzsKKwlzYXZlX3NldC5tb2RlID0gJnNldC0+Y3J0Yy0+bW9kZTsKKwlzYXZlX3NldC54ID0gc2V0LT5jcnRjLT54OworCXNhdmVfc2V0LnkgPSBzZXQtPmNydGMtPnk7CisJc2F2ZV9zZXQuZmIgPSBzZXQtPmNydGMtPmZiOworCiAJLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hlY2sgaGVyZSBpZiB0aGUgZmIgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMKIAkgKiBhbmQgdGhlbiBqdXN0IGZsaXBfb3JfbW92ZSBpdCAqLwogCWlmIChzZXQtPmNydGMtPmZiICE9IHNldC0+ZmIpIHsKQEAgLTcxNiw2ICs3MjgsMTIgQEAKIAkJKmNvbm5lY3RvciA9IHNhdmVfY29ubmVjdG9yc1tjb3VudCsrXTsKIAl9CiAKKwkvKiBUcnkgdG8gcmVzdG9yZSB0aGUgY29uZmlnICovCisJaWYgKG1vZGVfY2hhbmdlZCAmJgorCSAgICAhZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKHNhdmVfc2V0LmNydGMsIHNhdmVfc2V0Lm1vZGUsIHNhdmVfc2V0LngsCisJCQkJICAgICAgc2F2ZV9zZXQueSwgc2F2ZV9zZXQuZmIpKQorCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXN0b3JlIGNvbmZpZyBhZnRlciBtb2Rlc2V0IGZhaWx1cmVcbiIpOworCiAJa2ZyZWUoc2F2ZV9jb25uZWN0b3JzKTsKIAlrZnJlZShzYXZlX2VuY29kZXJzKTsKIAlrZnJlZShzYXZlX2NydGNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMKaW5kZXggOWQyNjY4YS4uMWM3YTFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCkBAIC0xMDcsMTEgKzEwOCw4IEBACiAJCWVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZmlsZXNbaV0ubmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCiAJCQkJCSAgcm9vdCwgdG1wLCAmZHJtX2RlYnVnZnNfZm9wcyk7CiAJCWlmICghZW50KSB7Ci0JCQljaGFyIG5hbWVbNjRdOwotCQkJc3RybmNweShuYW1lLCByb290LT5kX25hbWUubmFtZSwKLQkJCQkJCW1pbihyb290LT5kX25hbWUubGVuLCA2NFUpKTsKIAkJCURSTV9FUlJPUigiQ2Fubm90IGNyZWF0ZSAvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvJXMvJXNcbiIsCi0JCQkJICBuYW1lLCBmaWxlc1tpXS5uYW1lKTsKKwkJCQkgIHJvb3QtPmRfbmFtZS5uYW1lLCBmaWxlc1tpXS5uYW1lKTsKIAkJCWtmcmVlKHRtcCk7CiAJCQlyZXQgPSAtMTsKIAkJCWdvdG8gZmFpbDsKQEAgLTEyMCw3ICsxMTgsMTAgQEAKIAkJdG1wLT5taW5vciA9IG1pbm9yOwogCQl0bXAtPmRlbnQgPSBlbnQ7CiAJCXRtcC0+aW5mb19lbnQgPSAmZmlsZXNbaV07Ci0JCWxpc3RfYWRkKCYodG1wLT5saXN0KSwgJihtaW5vci0+ZGVidWdmc19ub2Rlcy5saXN0KSk7CisKKwkJbXV0ZXhfbG9jaygmbWlub3ItPmRlYnVnZnNfbG9jayk7CisJCWxpc3RfYWRkKCZ0bXAtPmxpc3QsICZtaW5vci0+ZGVidWdmc19saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKIAl9CiAJcmV0dXJuIDA7CiAKQEAgLTE0OCw3ICsxNDksOCBAQAogCWNoYXIgbmFtZVs2NF07CiAJaW50IHJldDsKIAotCUlOSVRfTElTVF9IRUFEKCZtaW5vci0+ZGVidWdmc19ub2Rlcy5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWlub3ItPmRlYnVnZnNfbGlzdCk7CisJbXV0ZXhfaW5pdCgmbWlub3ItPmRlYnVnZnNfbG9jayk7CiAJc3ByaW50ZihuYW1lLCAiJWQiLCBtaW5vcl9pZCk7CiAJbWlub3ItPmRlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCByb290KTsKIAlpZiAoIW1pbm9yLT5kZWJ1Z2ZzX3Jvb3QpIHsKQEAgLTE5NCw4ICsxOTYsOSBAQAogCXN0cnVjdCBkcm1faW5mb19ub2RlICp0bXA7CiAJaW50IGk7CiAKKwltdXRleF9sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBxLCAmbWlub3ItPmRlYnVnZnNfbm9kZXMubGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBxLCAmbWlub3ItPmRlYnVnZnNfbGlzdCkgewogCQkJdG1wID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBkcm1faW5mb19ub2RlLCBsaXN0KTsKIAkJCWlmICh0bXAtPmluZm9fZW50ID09ICZmaWxlc1tpXSkgewogCQkJCWRlYnVnZnNfcmVtb3ZlKHRtcC0+ZGVudCk7CkBAIC0yMDQsNiArMjA3LDcgQEAKIAkJCX0KIAkJfQogCX0KKwltdXRleF91bmxvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZGVidWdmc19yZW1vdmVfZmlsZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZG1hLmMKaW5kZXggMjUyY2JkNy4uY2ZiNGUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RtYS5jCkBAIC0zMyw2ICszMyw3IEBACiAgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwppbmRleCA5M2ExMTJkLi40MGMxODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKQEAgLTQ4LDYgKzQ4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCiAKQEAgLTEyNCw3ICsxMjUsNyBAQAogCURSTV9JT0NUTF9ERUYoRFJNX0lPQ1RMX1NHX0FMTE9DLCBkcm1fc2dfYWxsb2NfaW9jdGwsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfU0dfRlJFRSwgZHJtX3NnX2ZyZWUsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCiAKLQlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgZHJtX3dhaXRfdmJsYW5rLCAwKSwKKwlEUk1fSU9DVExfREVGKERSTV9JT0NUTF9XQUlUX1ZCTEFOSywgZHJtX3dhaXRfdmJsYW5rLCBEUk1fVU5MT0NLRUQpLAogCiAJRFJNX0lPQ1RMX0RFRihEUk1fSU9DVExfTU9ERVNFVF9DVEwsIGRybV9tb2Rlc2V0X2N0bCwgMCksCiAKQEAgLTQzOCw2ICs0MzksOCBAQAogCQkJCQlnb3RvIGVycl9pMTsKIAkJCQl9CiAJCQl9CisJCQlpZiAoYXNpemUgPiB1c2l6ZSkKKwkJCQltZW1zZXQoa2RhdGEgKyB1c2l6ZSwgMCwgYXNpemUgLSB1c2l6ZSk7CiAJCX0KIAogCQlpZiAoY21kICYgSU9DX0lOKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCmluZGV4IDc0MjVlNWMuLjNlOTI3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm1fZWRpZC5oIgogI2luY2x1ZGUgImRybV9lZGlkX21vZGVzLmgiCkBAIC0xMzE5LDYgKzEzMjAsNyBAQAogI2RlZmluZSBIRE1JX0lERU5USUZJRVIgMHgwMDBDMDMKICNkZWZpbmUgQVVESU9fQkxPQ0sJMHgwMQogI2RlZmluZSBWRU5ET1JfQkxPQ0sgICAgMHgwMworI2RlZmluZSBTUEVBS0VSX0JMT0NLCTB4MDQKICNkZWZpbmUgRURJRF9CQVNJQ19BVURJTwkoMSA8PCA2KQogCiAvKioKQEAgLTEzNDcsNiArMTM0OSwxNzYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZpbmRfY2VhX2V4dGVuc2lvbik7CiAKK3N0YXRpYyB2b2lkCitwYXJzZV9oZG1pX3ZzZGIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgdWludDhfdCAqZGIpCit7CisJY29ubmVjdG9yLT5lbGRbNV0gfD0gKGRiWzZdID4+IDcpIDw8IDE7ICAvKiBTdXBwb3J0c19BSSAqLworCisJY29ubmVjdG9yLT5kdmlfZHVhbCA9IGRiWzZdICYgMTsKKwljb25uZWN0b3ItPm1heF90bWRzX2Nsb2NrID0gZGJbN10gKiA1OworCisJY29ubmVjdG9yLT5sYXRlbmN5X3ByZXNlbnRbMF0gPSBkYls4XSA+PiA3OworCWNvbm5lY3Rvci0+bGF0ZW5jeV9wcmVzZW50WzFdID0gKGRiWzhdID4+IDYpICYgMTsKKwljb25uZWN0b3ItPnZpZGVvX2xhdGVuY3lbMF0gPSBkYls5XTsKKwljb25uZWN0b3ItPmF1ZGlvX2xhdGVuY3lbMF0gPSBkYlsxMF07CisJY29ubmVjdG9yLT52aWRlb19sYXRlbmN5WzFdID0gZGJbMTFdOworCWNvbm5lY3Rvci0+YXVkaW9fbGF0ZW5jeVsxXSA9IGRiWzEyXTsKKworCURSTV9MT0dfS01TKCJIRE1JOiBEVkkgZHVhbCAlZCwgIgorCQkgICAgIm1heCBUTURTIGNsb2NrICVkLCAiCisJCSAgICAibGF0ZW5jeSBwcmVzZW50ICVkICVkLCAiCisJCSAgICAidmlkZW8gbGF0ZW5jeSAlZCAlZCwgIgorCQkgICAgImF1ZGlvIGxhdGVuY3kgJWQgJWRcbiIsCisJCSAgICBjb25uZWN0b3ItPmR2aV9kdWFsLAorCQkgICAgY29ubmVjdG9yLT5tYXhfdG1kc19jbG9jaywKKwkgICAgICAoaW50KSBjb25uZWN0b3ItPmxhdGVuY3lfcHJlc2VudFswXSwKKwkgICAgICAoaW50KSBjb25uZWN0b3ItPmxhdGVuY3lfcHJlc2VudFsxXSwKKwkJICAgIGNvbm5lY3Rvci0+dmlkZW9fbGF0ZW5jeVswXSwKKwkJICAgIGNvbm5lY3Rvci0+dmlkZW9fbGF0ZW5jeVsxXSwKKwkJICAgIGNvbm5lY3Rvci0+YXVkaW9fbGF0ZW5jeVswXSwKKwkJICAgIGNvbm5lY3Rvci0+YXVkaW9fbGF0ZW5jeVsxXSk7Cit9CisKK3N0YXRpYyB2b2lkCittb25pdG9yX25hbWUoc3RydWN0IGRldGFpbGVkX3RpbWluZyAqdCwgdm9pZCAqZGF0YSkKK3sKKwlpZiAodC0+ZGF0YS5vdGhlcl9kYXRhLnR5cGUgPT0gRURJRF9ERVRBSUxfTU9OSVRPUl9OQU1FKQorCQkqKHU4ICoqKWRhdGEgPSB0LT5kYXRhLm90aGVyX2RhdGEuZGF0YS5zdHIuc3RyOworfQorCisvKioKKyAqIGRybV9lZGlkX3RvX2VsZCAtIGJ1aWxkIEVMRCBmcm9tIEVESUQKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBIRE1JL0RQIHNpbmsKKyAqIEBlZGlkOiBFRElEIHRvIHBhcnNlCisgKgorICogRmlsbCB0aGUgRUxEIChFRElELUxpa2UgRGF0YSkgYnVmZmVyIGZvciBwYXNzaW5nIHRvIHRoZSBhdWRpbyBkcml2ZXIuCisgKiBTb21lIEVMRCBmaWVsZHMgYXJlIGxlZnQgdG8gdGhlIGdyYXBoaWNzIGRyaXZlciBjYWxsZXI6CisgKiAtIENvbm5fVHlwZQorICogLSBIRENQCisgKiAtIFBvcnRfSUQKKyAqLwordm9pZCBkcm1fZWRpZF90b19lbGQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGVkaWQgKmVkaWQpCit7CisJdWludDhfdCAqZWxkID0gY29ubmVjdG9yLT5lbGQ7CisJdTggKmNlYTsKKwl1OCAqbmFtZTsKKwl1OCAqZGI7CisJaW50IHNhZF9jb3VudCA9IDA7CisJaW50IG1ubDsKKwlpbnQgZGJsOworCisJbWVtc2V0KGVsZCwgMCwgc2l6ZW9mKGNvbm5lY3Rvci0+ZWxkKSk7CisKKwljZWEgPSBkcm1fZmluZF9jZWFfZXh0ZW5zaW9uKGVkaWQpOworCWlmICghY2VhKSB7CisJCURSTV9ERUJVR19LTVMoIkVMRDogbm8gQ0VBIEV4dGVuc2lvbiBmb3VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwluYW1lID0gTlVMTDsKKwlkcm1fZm9yX2VhY2hfZGV0YWlsZWRfYmxvY2soKHU4ICopZWRpZCwgbW9uaXRvcl9uYW1lLCAmbmFtZSk7CisJZm9yIChtbmwgPSAwOyBuYW1lICYmIG1ubCA8IDEzOyBtbmwrKykgeworCQlpZiAobmFtZVttbmxdID09IDB4MGEpCisJCQlicmVhazsKKwkJZWxkWzIwICsgbW5sXSA9IG5hbWVbbW5sXTsKKwl9CisJZWxkWzRdID0gKGNlYVsxXSA8PCA1KSB8IG1ubDsKKwlEUk1fREVCVUdfS01TKCJFTEQgbW9uaXRvciAlc1xuIiwgZWxkICsgMjApOworCisJZWxkWzBdID0gMiA8PCAzOwkJLyogRUxEIHZlcnNpb246IDIgKi8KKworCWVsZFsxNl0gPSBlZGlkLT5tZmdfaWRbMF07CisJZWxkWzE3XSA9IGVkaWQtPm1mZ19pZFsxXTsKKwllbGRbMThdID0gZWRpZC0+cHJvZF9jb2RlWzBdOworCWVsZFsxOV0gPSBlZGlkLT5wcm9kX2NvZGVbMV07CisKKwlmb3IgKGRiID0gY2VhICsgNDsgZGIgPCBjZWEgKyBjZWFbMl07IGRiICs9IGRibCArIDEpIHsKKwkJZGJsID0gZGJbMF0gJiAweDFmOworCisJCXN3aXRjaCAoKGRiWzBdICYgMHhlMCkgPj4gNSkgeworCQljYXNlIEFVRElPX0JMT0NLOgkvKiBBdWRpbyBEYXRhIEJsb2NrLCBjb250YWlucyBTQURzICovCisJCQlzYWRfY291bnQgPSBkYmwgLyAzOworCQkJbWVtY3B5KGVsZCArIDIwICsgbW5sLCAmZGJbMV0sIGRibCk7CisJCQlicmVhazsKKwkJY2FzZSBTUEVBS0VSX0JMT0NLOgkvKiBTcGVha2VyIEFsbG9jYXRpb24gRGF0YSBCbG9jayAqLworCQkJZWxkWzddID0gZGJbMV07CisJCQlicmVhazsKKwkJY2FzZSBWRU5ET1JfQkxPQ0s6CisJCQkvKiBIRE1JIFZlbmRvci1TcGVjaWZpYyBEYXRhIEJsb2NrICovCisJCQlpZiAoZGJbMV0gPT0gMHgwMyAmJiBkYlsyXSA9PSAweDBjICYmIGRiWzNdID09IDApCisJCQkJcGFyc2VfaGRtaV92c2RiKGNvbm5lY3RvciwgZGIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwllbGRbNV0gfD0gc2FkX2NvdW50IDw8IDQ7CisJZWxkWzJdID0gKDIwICsgbW5sICsgc2FkX2NvdW50ICogMyArIDMpIC8gNDsKKworCURSTV9ERUJVR19LTVMoIkVMRCBzaXplICVkLCBTQUQgY291bnQgJWRcbiIsIChpbnQpZWxkWzJdLCBzYWRfY291bnQpOworfQorRVhQT1JUX1NZTUJPTChkcm1fZWRpZF90b19lbGQpOworCisvKioKKyAqIGRybV9hdl9zeW5jX2RlbGF5IC0gSERNSS9EUCBzaW5rIGF1ZGlvLXZpZGVvIHN5bmMgZGVsYXkgaW4gbWlsbGlzZWNvbmQKKyAqIEBjb25uZWN0b3I6IGNvbm5lY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIEhETUkvRFAgc2luaworICogQG1vZGU6IHRoZSBkaXNwbGF5IG1vZGUKKyAqLworaW50IGRybV9hdl9zeW5jX2RlbGF5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCSAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCWludCBpID0gISEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSk7CisJaW50IGEsIHY7CisKKwlpZiAoIWNvbm5lY3Rvci0+bGF0ZW5jeV9wcmVzZW50WzBdKQorCQlyZXR1cm4gMDsKKwlpZiAoIWNvbm5lY3Rvci0+bGF0ZW5jeV9wcmVzZW50WzFdKQorCQlpID0gMDsKKworCWEgPSBjb25uZWN0b3ItPmF1ZGlvX2xhdGVuY3lbaV07CisJdiA9IGNvbm5lY3Rvci0+dmlkZW9fbGF0ZW5jeVtpXTsKKworCS8qCisJICogSERNSS9EUCBzaW5rIGRvZXNuJ3Qgc3VwcG9ydCBhdWRpbyBvciB2aWRlbz8KKwkgKi8KKwlpZiAoYSA9PSAyNTUgfHwgdiA9PSAyNTUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDb252ZXJ0IHJhdyBFRElEIHZhbHVlcyB0byBtaWxsaXNlY29uZC4KKwkgKiBUcmVhdCB1bmtub3duIGxhdGVuY3kgYXMgMG1zLgorCSAqLworCWlmIChhKQorCQlhID0gbWluKDIgKiAoYSAtIDEpLCA1MDApOworCWlmICh2KQorCQl2ID0gbWluKDIgKiAodiAtIDEpLCA1MDApOworCisJcmV0dXJuIG1heCh2IC0gYSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9hdl9zeW5jX2RlbGF5KTsKKworLyoqCisgKiBkcm1fc2VsZWN0X2VsZCAtIHNlbGVjdCBvbmUgRUxEIGZyb20gbXVsdGlwbGUgSERNSS9EUCBzaW5rcworICogQGVuY29kZXI6IHRoZSBlbmNvZGVyIGp1c3QgY2hhbmdlZCBkaXNwbGF5IG1vZGUKKyAqIEBtb2RlOiB0aGUgYWRqdXN0ZWQgZGlzcGxheSBtb2RlCisgKgorICogSXQncyBwb3NzaWJsZSBmb3Igb25lIGVuY29kZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIEhETUkvRFAgc2lua3MuCisgKiBUaGUgcG9saWN5IGlzIG5vdyBoYXJkIGNvZGVkIHRvIHNpbXBseSB1c2UgdGhlIGZpcnN0IEhETUkvRFAgc2luaydzIEVMRC4KKyAqLworc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9zZWxlY3RfZWxkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciA9PSBlbmNvZGVyICYmIGNvbm5lY3Rvci0+ZWxkWzBdKQorCQkJcmV0dXJuIGNvbm5lY3RvcjsKKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fc2VsZWN0X2VsZCk7CisKIC8qKgogICogZHJtX2RldGVjdF9oZG1pX21vbml0b3IgLSBkZXRlY3Qgd2hldGhlciBtb25pdG9yIGlzIGhkbWkuCiAgKiBAZWRpZDogbW9uaXRvciBFRElEIGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2VuY29kZXJfc2xhdmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rlcl9zbGF2ZS5jCmluZGV4IGQ2MmMwNjQuLmZiOTQzNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rlcl9zbGF2ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZW5jb2Rlcl9zbGF2ZS5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybV9lbmNvZGVyX3NsYXZlLmgiCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggZjdjNjg1NC4uODBmZTM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtX2NydGMuaCIKICNpbmNsdWRlICJkcm1fZmJfaGVscGVyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jCmluZGV4IDJlYzdkNDguLjQ5MTFlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIGZyb20gQktMIHB1c2hkb3duOiBub3RlIHRoYXQgbm90aGluZyBlbHNlIHNlcmlhbGl6ZXMgaWRyX2ZpbmQoKSAqLwogREVGSU5FX01VVEVYKGRybV9nbG9iYWxfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKaW5kZXggMTg2ZDYyZS4uMzk2ZTYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCkBAIC0yODUsNiArMjg1LDk0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9nZW1faGFuZGxlX2NyZWF0ZSk7CiAKKworLyoqCisgKiBkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQgLSByZWxlYXNlIGEgZmFrZSBtbWFwIG9mZnNldCBmb3IgYW4gb2JqZWN0CisgKiBAb2JqOiBvYmogaW4gcXVlc3Rpb24KKyAqCisgKiBUaGlzIHJvdXRpbmUgZnJlZXMgZmFrZSBvZmZzZXRzIGFsbG9jYXRlZCBieSBkcm1fZ2VtX2NyZWF0ZV9tbWFwX29mZnNldCgpLgorICovCit2b2lkCitkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0ID0gJm9iai0+bWFwX2xpc3Q7CisKKwlkcm1faHRfcmVtb3ZlX2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpOworCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7CisJa2ZyZWUobGlzdC0+bWFwKTsKKwlsaXN0LT5tYXAgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQpOworCisvKioKKyAqIGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0IC0gY3JlYXRlIGEgZmFrZSBtbWFwIG9mZnNldCBmb3IgYW4gb2JqZWN0CisgKiBAb2JqOiBvYmogaW4gcXVlc3Rpb24KKyAqCisgKiBHRU0gbWVtb3J5IG1hcHBpbmcgd29ya3MgYnkgaGFuZGluZyBiYWNrIHRvIHVzZXJzcGFjZSBhIGZha2UgbW1hcCBvZmZzZXQKKyAqIGl0IGNhbiB1c2UgaW4gYSBzdWJzZXF1ZW50IG1tYXAoMikgY2FsbC4gIFRoZSBEUk0gY29yZSBjb2RlIHRoZW4gbG9va3MKKyAqIHVwIHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIG9mZnNldCBhbmQgc2V0cyB1cCB0aGUgdmFyaW91cyBtZW1vcnkgbWFwcGluZworICogc3RydWN0dXJlcy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGFuZCBhdHRhY2hlcyBhIGZha2Ugb2Zmc2V0IGZvciBAb2JqLgorICovCitpbnQKK2RybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2xvY2FsX21hcCAqbWFwOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBvYmplY3QgdXAgZm9yIG1tYXAnaW5nICovCisJbGlzdCA9ICZvYmotPm1hcF9saXN0OworCWxpc3QtPm1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fbWFwX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpc3QtPm1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXAgPSBsaXN0LT5tYXA7CisJbWFwLT50eXBlID0gX0RSTV9HRU07CisJbWFwLT5zaXplID0gb2JqLT5zaXplOworCW1hcC0+aGFuZGxlID0gb2JqOworCisJLyogR2V0IGEgRFJNIEdFTSBtbWFwIG9mZnNldCBhbGxvY2F0ZWQuLi4gKi8KKwlsaXN0LT5maWxlX29mZnNldF9ub2RlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZtbS0+b2Zmc2V0X21hbmFnZXIsCisJCQlvYmotPnNpemUgLyBQQUdFX1NJWkUsIDAsIDApOworCisJaWYgKCFsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG9mZnNldCBmb3IgYm8gJWRcbiIsIG9iai0+bmFtZSk7CisJCXJldCA9IC1FTk9TUEM7CisJCWdvdG8gb3V0X2ZyZWVfbGlzdDsKKwl9CisKKwlsaXN0LT5maWxlX29mZnNldF9ub2RlID0gZHJtX21tX2dldF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlLAorCQkJb2JqLT5zaXplIC8gUEFHRV9TSVpFLCAwKTsKKwlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9saXN0OworCX0KKworCWxpc3QtPmhhc2gua2V5ID0gbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZS0+c3RhcnQ7CisJcmV0ID0gZHJtX2h0X2luc2VydF9pdGVtKCZtbS0+b2Zmc2V0X2hhc2gsICZsaXN0LT5oYXNoKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFkZCB0byBtYXAgaGFzaFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfbW07CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlX21tOgorCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7CitvdXRfZnJlZV9saXN0OgorCWtmcmVlKGxpc3QtPm1hcCk7CisJbGlzdC0+bWFwID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KTsKKwogLyoqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBuYW1lZCBieSB0aGUgaGFuZGxlLiAqLwogc3RydWN0IGRybV9nZW1fb2JqZWN0ICoKIGRybV9nZW1fb2JqZWN0X2xvb2t1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2hhc2h0YWIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faGFzaHRhYi5jCmluZGV4IGUzYTc1NjguLjY4ZGM4NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faGFzaHRhYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faGFzaHRhYi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiZHJtX2hhc2h0YWIuaCIKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBpbnQgZHJtX2h0X2NyZWF0ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYwppbmRleCA0YTA1OGM3Li5kZGQ3MGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm1fY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKaW5kZXggMzgzMGU5ZS4uNjhiNzU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIEFjY2VzcyBtYWNybyBmb3Igc2xvdHMgaW4gdmJsYW5rIHRpbWVzdGFtcCByaW5nYnVmZmVyLiAqLwogI2RlZmluZSB2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCBjb3VudCkgKCBcCkBAIC00MDYsMTMgKzQwNywxNiBAQAogCS8qCiAJICogV2FrZSB1cCBhbnkgd2FpdGVycyBzbyB0aGV5IGRvbid0IGhhbmcuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fY3J0Y3M7IGkrKykgewotCQlEUk1fV0FLRVVQKCZkZXYtPnZibF9xdWV1ZVtpXSk7Ci0JCWRldi0+dmJsYW5rX2VuYWJsZWRbaV0gPSAwOwotCQlkZXYtPmxhc3RfdmJsYW5rW2ldID0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGkpOworCWlmIChkZXYtPm51bV9jcnRjcykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fY3J0Y3M7IGkrKykgeworCQkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWVbaV0pOworCQkJZGV2LT52YmxhbmtfZW5hYmxlZFtpXSA9IDA7CisJCQlkZXYtPmxhc3RfdmJsYW5rW2ldID0KKwkJCQlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgaSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAKIAlpZiAoIWlycV9lbmFibGVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMjQsNiArMTEyOCw3IEBACiAJCXRyYWNlX2RybV92YmxhbmtfZXZlbnRfZGVsaXZlcmVkKGN1cnJlbnQtPnBpZCwgcGlwZSwKIAkJCQkJCSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKTsKIAl9IGVsc2UgeworCQkvKiBkcm1faGFuZGxlX3ZibGFua19ldmVudHMgd2lsbCBjYWxsIGRybV92YmxhbmtfcHV0ICovCiAJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmRldi0+dmJsYW5rX2V2ZW50X2xpc3QpOwogCQl2Ymx3YWl0LT5yZXBseS5zZXF1ZW5jZSA9IHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2U7CiAJfQpAQCAtMTIwNCw4ICsxMjA5LDEyIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19FVkVOVCkKKwlpZiAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19FVkVOVCkgeworCQkvKiBtdXN0IGhvbGQgb24gdG8gdGhlIHZibGFuayByZWYgdW50aWwgdGhlIGV2ZW50IGZpcmVzCisJCSAqIGRybV92YmxhbmtfcHV0IHdpbGwgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5CisJCSAqLwogCQlyZXR1cm4gZHJtX3F1ZXVlX3ZibGFua19ldmVudChkZXYsIGNydGMsIHZibHdhaXQsIGZpbGVfcHJpdik7CisJfQogCiAJaWYgKChmbGFncyAmIF9EUk1fVkJMQU5LX05FWFRPTk1JU1MpICYmCiAJICAgIChzZXEgLSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKSA8PSAoMTw8MjMpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYwppbmRleCBjOWI4MDUwLi5jOGI2YjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbWVtb3J5LmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKaW5kZXggOTU5MTg2Yy4uOTYxZmI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgImRybV9tbS5oIgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjZGVmaW5lIE1NX1VOVVNFRF9UQVJHRVQgNAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKaW5kZXggYWQ3NGZiNC4uZmI4ZTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3Rfc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGNpLmMKaW5kZXggYjZhMTljYi4uZDRkMTBiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wY2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3BjaS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcGxhdGZvcm0uYwppbmRleCAyYThiNjI2Li5hZTlkYjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wbGF0Zm9ybS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9jLmMKaW5kZXggOWU1YjA3ZWYuLmZmZjg3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYy5jCkBAIC0zOSw2ICszOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk1LDcgKzk2LDYgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbWlub3ItPmRldjsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqdG1wOwotCWNoYXIgbmFtZVs2NF07CiAJaW50IGksIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCQkgICAgICAgJmRybV9wcm9jX2ZvcHMsIHRtcCk7CiAJCWlmICghZW50KSB7CiAJCQlEUk1fRVJST1IoIkNhbm5vdCBjcmVhdGUgL3Byb2MvZHJpLyVzLyVzXG4iLAotCQkJCSAgbmFtZSwgZmlsZXNbaV0ubmFtZSk7CisJCQkJICByb290LT5uYW1lLCBmaWxlc1tpXS5uYW1lKTsKIAkJCWxpc3RfZGVsKCZ0bXAtPmxpc3QpOwogCQkJa2ZyZWUodG1wKTsKIAkJCXJldCA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9zbWFuLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3NtYW4uYwppbmRleCAzNDY2NDU4Li5jZWJjZTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3NtYW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3NtYW4uYwpAQCAtMzYsNiArMzYsNyBAQAogICogVGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybV9zbWFuLmgiCiAKIHN0cnVjdCBkcm1fb3duZXJfaXRlbSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggMmVlZThlMC4uMGY5ZWY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZHJtX3N5c2ZzLmgiCiAjaW5jbHVkZSAiZHJtX2NvcmUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdXNiLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3VzYi5jCmluZGV4IDIwNmQyMzAuLjQ0NTAwM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdXNiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV91c2IuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpZmRlZiBDT05GSUdfVVNCCiBpbnQgZHJtX2dldF91c2JfZGV2KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKaW5kZXggNWRiOTZkNDUuLjhjMDNlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZtLmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2lmIGRlZmluZWQoX19pYTY0X18pCiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzQ2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcKQEAgLTAsMCArMSwyMCBAQAorY29uZmlnIERSTV9FWFlOT1MKKwl0cmlzdGF0ZSAiRFJNIFN1cHBvcnQgZm9yIFNhbXN1bmcgU29DIEVYWU5PUyBTZXJpZXMiCisJZGVwZW5kcyBvbiBEUk0gJiYgUExBVF9TQU1TVU5HCisJZGVmYXVsdAluCisJc2VsZWN0IERSTV9LTVNfSEVMUEVSCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCXNlbGVjdCBWVF9IV19DT05TT0xFX0JJTkRJTkcgaWYgRlJBTUVCVUZGRVJfQ09OU09MRQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIFNhbXN1bmcgU29DIEVYWU5PUyBjaGlwc2V0LgorCSAgSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4eW5vc2RybS4KKworY29uZmlnIERSTV9FWFlOT1NfRklNRAorCXRyaXN0YXRlICJFeHlub3MgRFJNIEZJTUQiCisJZGVwZW5kcyBvbiBEUk1fRVhZTk9TCisJZGVmYXVsdCBuCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBFeHlub3MgRklNRCBmb3IgRFJNLgorCSAgSWYgTSBpcyBzZWxlY3RlZCwgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHlub3NfZHJtX2ZpbWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTZkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBkcm0gZGV2aWNlIGRyaXZlci4gIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZQorIyBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpIGluIFhGcmVlODYgNC4xLjAgYW5kIGhpZ2hlci4KKworY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0gLUlkcml2ZXJzL2dwdS9kcm0vZXh5bm9zCitleHlub3Nkcm0teSA6PSBleHlub3NfZHJtX2Rydi5vIGV4eW5vc19kcm1fZW5jb2Rlci5vIGV4eW5vc19kcm1fY29ubmVjdG9yLm8gXAorCQlleHlub3NfZHJtX2NydGMubyBleHlub3NfZHJtX2ZiZGV2Lm8gZXh5bm9zX2RybV9mYi5vIFwKKwkJZXh5bm9zX2RybV9idWYubyBleHlub3NfZHJtX2dlbS5vIGV4eW5vc19kcm1fY29yZS5vCisKK29iai0kKENPTkZJR19EUk1fRVhZTk9TKSArPSBleHlub3Nkcm0ubworb2JqLSQoQ09ORklHX0RSTV9FWFlOT1NfRklNRCkgKz0gZXh5bm9zX2RybV9maW1kLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9idWYuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhhZmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiBleHlub3NfZHJtX2J1Zi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IElua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorCisjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2J1Zi5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKGV4eW5vc19kcm1fYnVmX2xvY2spOworCitzdGF0aWMgaW50IGxvd2xldmVsX2J1ZmZlcl9hbGxvY2F0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5KQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwllbnRyeS0+dmFkZHIgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGRldi0+ZGV2LCBlbnRyeS0+c2l6ZSwKKwkJCShkbWFfYWRkcl90ICopJmVudHJ5LT5wYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeS0+cGFkZHIpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCURSTV9ERUJVR19LTVMoImFsbG9jYXRlZCA6IHZhZGRyKDB4JXgpLCBwYWRkcigweCV4KSwgc2l6ZSgweCV4KVxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpZW50cnktPnZhZGRyLCBlbnRyeS0+cGFkZHIsIGVudHJ5LT5zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb3dsZXZlbF9idWZmZXJfZGVhbGxvY2F0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5KQoreworCURSTV9ERUJVR19LTVMoIiVzLlxuIiwgX19GSUxFX18pOworCisJaWYgKGVudHJ5LT5wYWRkciAmJiBlbnRyeS0+dmFkZHIgJiYgZW50cnktPnNpemUpCisJCWRtYV9mcmVlX3dyaXRlY29tYmluZShkZXYtPmRldiwgZW50cnktPnNpemUsIGVudHJ5LT52YWRkciwKKwkJCQllbnRyeS0+cGFkZHIpOworCWVsc2UKKwkJRFJNX0RFQlVHX0tNUygiZW50cnkgZGF0YSBpcyBudWxsLlxuIik7Cit9CisKK3N0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZXh5bm9zX2RybV9idWZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisKKwlEUk1fREVCVUdfS01TKCIlcy5cbiIsIF9fRklMRV9fKTsKKworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyeSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBleHlub3NfZHJtX2J1Zl9lbnRyeS5cbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwllbnRyeS0+c2l6ZSA9IHNpemU7CisKKwkvKgorCSAqIGFsbG9jYXRlIG1lbW9yeSByZWdpb24gd2l0aCBzaXplIGFuZCBzZXQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbgorCSAqIHRvIHZhZGRyIGFuZCBwYWRkciBvZiBhIGVudHJ5IG9iamVjdC4KKwkgKi8KKwlpZiAobG93bGV2ZWxfYnVmZmVyX2FsbG9jYXRlKGRldiwgZW50cnkpIDwgMCkgeworCQlrZnJlZShlbnRyeSk7CisJCWVudHJ5ID0gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIGVudHJ5OworfQorCit2b2lkIGV4eW5vc19kcm1fYnVmX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeSkKK3sKKwlEUk1fREVCVUdfS01TKCIlcy5cbiIsIF9fRklMRV9fKTsKKworCWlmICghZW50cnkpIHsKKwkJRFJNX0RFQlVHX0tNUygiZW50cnkgaXMgbnVsbC5cbiIpOworCQlyZXR1cm47CisJfQorCisJbG93bGV2ZWxfYnVmZmVyX2RlYWxsb2NhdGUoZGV2LCBlbnRyeSk7CisKKwlrZnJlZShlbnRyeSk7CisJZW50cnkgPSBOVUxMOworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBCdWZmZXIgTWFuYWdlbWVudCBNb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9idWYuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkNTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2J1Zi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGV4eW5vc19kcm1fYnVmLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fQlVGX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0JVRl9IXworCisvKgorICogZXh5bm9zIGRybSBidWZmZXIgZW50cnkgc3RydWN0dXJlLgorICoKKyAqIEBwYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5LgorICogQHZhZGRyOiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBAc2l6ZTogc2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5LgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgeworCWRtYV9hZGRyX3QgcGFkZHI7CisJdm9pZCBfX2lvbWVtICp2YWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIGFsbG9jYXRlIHBoeXNpY2FsIG1lbW9yeS4gKi8KK3N0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZXh5bm9zX2RybV9idWZfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXVuc2lnbmVkIGludCBzaXplKTsKKworLyogZ2V0IHBoeXNpY2FsIG1lbW9yeSBpbmZvcm1hdGlvbiBvZiBhIGRybSBmcmFtZWJ1ZmZlci4gKi8KK3N0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZXh5bm9zX2RybV9mYl9nZXRfYnVmKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKTsKKworLyogcmVtb3ZlIGFsbG9jYXRlZCBwaHlzaWNhbCBtZW1vcnkuICovCit2b2lkIGV4eW5vc19kcm1fYnVmX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWQ5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29ubmVjdG9yLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZW5jb2Rlci5oIgorCisjZGVmaW5lIE1BWF9FRElEIDI1NgorI2RlZmluZSB0b19leHlub3NfY29ubmVjdG9yKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZXh5bm9zX2RybV9jb25uZWN0b3IsXAorCQkJCWRybV9jb25uZWN0b3IpCisKK3N0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvciB7CisJc3RydWN0IGRybV9jb25uZWN0b3IJZHJtX2Nvbm5lY3RvcjsKK307CisKKy8qIGNvbnZlcnQgZXh5bm9zX3ZpZGVvX3RpbWluZ3MgdG8gZHJtX2Rpc3BsYXlfbW9kZSAqLworc3RhdGljIGlubGluZSB2b2lkCitjb252ZXJ0X3RvX2Rpc3BsYXlfbW9kZShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCXN0cnVjdCBmYl92aWRlb21vZGUgKnRpbWluZykKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJbW9kZS0+Y2xvY2sgPSB0aW1pbmctPnBpeGNsb2NrIC8gMTAwMDsKKworCW1vZGUtPmhkaXNwbGF5ID0gdGltaW5nLT54cmVzOworCW1vZGUtPmhzeW5jX3N0YXJ0ID0gbW9kZS0+aGRpc3BsYXkgKyB0aW1pbmctPmxlZnRfbWFyZ2luOworCW1vZGUtPmhzeW5jX2VuZCA9IG1vZGUtPmhzeW5jX3N0YXJ0ICsgdGltaW5nLT5oc3luY19sZW47CisJbW9kZS0+aHRvdGFsID0gbW9kZS0+aHN5bmNfZW5kICsgdGltaW5nLT5yaWdodF9tYXJnaW47CisKKwltb2RlLT52ZGlzcGxheSA9IHRpbWluZy0+eXJlczsKKwltb2RlLT52c3luY19zdGFydCA9IG1vZGUtPnZkaXNwbGF5ICsgdGltaW5nLT51cHBlcl9tYXJnaW47CisJbW9kZS0+dnN5bmNfZW5kID0gbW9kZS0+dnN5bmNfc3RhcnQgKyB0aW1pbmctPnZzeW5jX2xlbjsKKwltb2RlLT52dG90YWwgPSBtb2RlLT52c3luY19lbmQgKyB0aW1pbmctPmxvd2VyX21hcmdpbjsKK30KKworLyogY29udmVydCBkcm1fZGlzcGxheV9tb2RlIHRvIGV4eW5vc192aWRlb190aW1pbmdzICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvbnZlcnRfdG9fdmlkZW9fdGltaW5nKHN0cnVjdCBmYl92aWRlb21vZGUgKnRpbWluZywKKwkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwltZW1zZXQodGltaW5nLCAwLCBzaXplb2YoKnRpbWluZykpOworCisJdGltaW5nLT5waXhjbG9jayA9IG1vZGUtPmNsb2NrICogMTAwMDsKKwl0aW1pbmctPnJlZnJlc2ggPSBtb2RlLT52cmVmcmVzaDsKKworCXRpbWluZy0+eHJlcyA9IG1vZGUtPmhkaXNwbGF5OworCXRpbWluZy0+bGVmdF9tYXJnaW4gPSBtb2RlLT5oc3luY19zdGFydCAtIG1vZGUtPmhkaXNwbGF5OworCXRpbWluZy0+aHN5bmNfbGVuID0gbW9kZS0+aHN5bmNfZW5kIC0gbW9kZS0+aHN5bmNfc3RhcnQ7CisJdGltaW5nLT5yaWdodF9tYXJnaW4gPSBtb2RlLT5odG90YWwgLSBtb2RlLT5oc3luY19lbmQ7CisKKwl0aW1pbmctPnlyZXMgPSBtb2RlLT52ZGlzcGxheTsKKwl0aW1pbmctPnVwcGVyX21hcmdpbiA9IG1vZGUtPnZzeW5jX3N0YXJ0IC0gbW9kZS0+dmRpc3BsYXk7CisJdGltaW5nLT52c3luY19sZW4gPSBtb2RlLT52c3luY19lbmQgLSBtb2RlLT52c3luY19zdGFydDsKKwl0aW1pbmctPmxvd2VyX21hcmdpbiA9IG1vZGUtPnZ0b3RhbCAtIG1vZGUtPnZzeW5jX2VuZDsKKworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQl0aW1pbmctPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKKwllbHNlCisJCXRpbWluZy0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQl0aW1pbmctPnZtb2RlIHw9IEZCX1ZNT0RFX0RPVUJMRTsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJCQlleHlub3NfZHJtX2dldF9tYW5hZ2VyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7CisJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IG1hbmFnZXItPmRpc3BsYXk7CisJdW5zaWduZWQgaW50IGNvdW50OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICghZGlzcGxheSkgeworCQlEUk1fREVCVUdfS01TKCJkaXNwbGF5IGlzIG51bGwuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBpZiBnZXRfZWRpZCgpIGV4aXN0cyB0aGVuIGdldF9lZGlkKCkgY2FsbGJhY2sgb2YgaGRtaSBzaWRlCisJICogaXMgY2FsbGVkIHRvIGdldCBlZGlkIGRhdGEgdGhyb3VnaCBpMmMgaW50ZXJmYWNlIGVsc2UKKwkgKiBnZXQgdGltaW5nIGZyb20gdGhlIEZJTUQgZHJpdmVyKGRpc3BsYXkgY29udHJvbGxlcikuCisJICoKKwkgKiBQLlMuIGluIGNhc2Ugb2YgbGNkIHBhbmVsLCBjb3VudCBpcyBhbHdheXMgMSBpZiBzdWNjZXNzCisJICogYmVjYXVzZSBsY2QgcGFuZWwgaGFzIG9ubHkgb25lIG1vZGUuCisJICovCisJaWYgKGRpc3BsYXktPmdldF9lZGlkKSB7CisJCWludCByZXQ7CisJCXZvaWQgKmVkaWQ7CisKKwkJZWRpZCA9IGt6YWxsb2MoTUFYX0VESUQsIEdGUF9LRVJORUwpOworCQlpZiAoIWVkaWQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGVkaWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXQgPSBkaXNwbGF5LT5nZXRfZWRpZChtYW5hZ2VyLT5kZXYsIGNvbm5lY3RvciwKKwkJCQkJCWVkaWQsIE1BWF9FRElEKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBlZGlkIGRhdGEuXG4iKTsKKwkJCWtmcmVlKGVkaWQpOworCQkJZWRpZCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIGVkaWQpOworCQljb3VudCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOworCisJCWtmcmVlKGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnJhd19lZGlkKTsKKwkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucmF3X2VkaWQgPSBlZGlkOworCX0gZWxzZSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gZHJtX21vZGVfY3JlYXRlKGNvbm5lY3Rvci0+ZGV2KTsKKwkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nOworCisJCWlmIChkaXNwbGF5LT5nZXRfdGltaW5nKQorCQkJdGltaW5nID0gZGlzcGxheS0+Z2V0X3RpbWluZyhtYW5hZ2VyLT5kZXYpOworCQllbHNlIHsKKwkJCWRybV9tb2RlX2Rlc3Ryb3koY29ubmVjdG9yLT5kZXYsIG1vZGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljb252ZXJ0X3RvX2Rpc3BsYXlfbW9kZShtb2RlLCB0aW1pbmcpOworCisJCW1vZGUtPnR5cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOworCQlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKKwkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCisJCWNvdW50ID0gMTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9CisJCQkJZXh5bm9zX2RybV9nZXRfbWFuYWdlcihjb25uZWN0b3ItPmVuY29kZXIpOworCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkgPSBtYW5hZ2VyLT5kaXNwbGF5OworCXN0cnVjdCBmYl92aWRlb21vZGUgdGltaW5nOworCWludCByZXQgPSBNT0RFX0JBRDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwljb252ZXJ0X3RvX3ZpZGVvX3RpbWluZygmdGltaW5nLCBtb2RlKTsKKworCWlmIChkaXNwbGF5ICYmIGRpc3BsYXktPmNoZWNrX3RpbWluZykKKwkJaWYgKCFkaXNwbGF5LT5jaGVja190aW1pbmcobWFuYWdlci0+ZGV2LCAodm9pZCAqKSZ0aW1pbmcpKQorCQkJcmV0ID0gTU9ERV9PSzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBkcm1fZW5jb2RlciAqZXh5bm9zX2RybV9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0dXJuIGNvbm5lY3Rvci0+ZW5jb2RlcjsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBleHlub3NfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2V0X21vZGVzCT0gZXh5bm9zX2RybV9jb25uZWN0b3JfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkCT0gZXh5bm9zX2RybV9jb25uZWN0b3JfbW9kZV92YWxpZCwKKwkuYmVzdF9lbmNvZGVyCT0gZXh5bm9zX2RybV9iZXN0X2VuY29kZXIsCit9OworCisvKiBnZXQgZGV0ZWN0aW9uIHN0YXR1cyBvZiBkaXNwbGF5IGRldmljZS4gKi8KK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCitleHlub3NfZHJtX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJCQlleHlub3NfZHJtX2dldF9tYW5hZ2VyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7CisJc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IG1hbmFnZXItPmRpc3BsYXk7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoZGlzcGxheSAmJiBkaXNwbGF5LT5pc19jb25uZWN0ZWQpIHsKKwkJaWYgKGRpc3BsYXktPmlzX2Nvbm5lY3RlZChtYW5hZ2VyLT5kZXYpKQorCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWVsc2UKKwkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fY29ubmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jb25uZWN0b3IgKmV4eW5vc19jb25uZWN0b3IgPQorCQl0b19leHlub3NfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShleHlub3NfY29ubmVjdG9yKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGV4eW5vc19jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRwbXMJCT0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKKwkuZmlsbF9tb2Rlcwk9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKKwkuZGV0ZWN0CQk9IGV4eW5vc19kcm1fY29ubmVjdG9yX2RldGVjdCwKKwkuZGVzdHJveQk9IGV4eW5vc19kcm1fY29ubmVjdG9yX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZXh5bm9zX2RybV9jb25uZWN0b3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yICpleHlub3NfY29ubmVjdG9yOworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPSBleHlub3NfZHJtX2dldF9tYW5hZ2VyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IHR5cGU7CisJaW50IGVycjsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfY29ubmVjdG9yID0ga3phbGxvYyhzaXplb2YoKmV4eW5vc19jb25uZWN0b3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4eW5vc19jb25uZWN0b3IpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgY29ubmVjdG9yXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY29ubmVjdG9yID0gJmV4eW5vc19jb25uZWN0b3ItPmRybV9jb25uZWN0b3I7CisKKwlzd2l0Y2ggKG1hbmFnZXItPmRpc3BsYXktPnR5cGUpIHsKKwljYXNlIEVYWU5PU19ESVNQTEFZX1RZUEVfSERNSToKKwkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOworCQlicmVhazsKKwl9CisKKwlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZleHlub3NfY29ubmVjdG9yX2Z1bmNzLCB0eXBlKTsKKwlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLCAmZXh5bm9zX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJZXJyID0gZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jb25uZWN0b3I7CisKKwljb25uZWN0b3ItPmVuY29kZXIgPSBlbmNvZGVyOworCWVyciA9IGRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIGEgY29ubmVjdG9yIHRvIGEgZW5jb2RlclxuIik7CisJCWdvdG8gZXJyX3N5c2ZzOworCX0KKworCURSTV9ERUJVR19LTVMoImNvbm5lY3RvciBoYXMgYmVlbiBjcmVhdGVkXG4iKTsKKworCXJldHVybiBjb25uZWN0b3I7CisKK2Vycl9zeXNmczoKKwlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOworZXJyX2Nvbm5lY3RvcjoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShleHlub3NfY29ubmVjdG9yKTsKKwlyZXR1cm4gTlVMTDsKK30KKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIENvbm5lY3RvciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzdiMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fQ09OTkVDVE9SX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0NPTk5FQ1RPUl9IXworCitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZXh5bm9zX2RybV9jb25uZWN0b3JfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb3JlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MWEwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29yZS5jCkBAIC0wLDAgKzEsMjcyIEBACisvKiBleHlub3NfZHJtX2NvcmUuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9lbmNvZGVyLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2ZiZGV2LmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoZXh5bm9zX2RybV9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGV4eW5vc19kcm1fc3ViZHJ2X2xpc3QpOworc3RhdGljIHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2OworCitzdGF0aWMgaW50IGV4eW5vc19kcm1fc3ViZHJ2X3Byb2JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2KQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCisJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmIChzdWJkcnYtPnByb2JlKSB7CisJCWludCByZXQ7CisKKwkJLyoKKwkJICogdGhpcyBwcm9iZSBjYWxsYmFjayB3b3VsZCBiZSBjYWxsZWQgYnkgc3ViIGRyaXZlcgorCQkgKiBhZnRlciBzZXR0aW5nIG9mIGFsbCByZXNvdXJjZXMgdG8gdGhpcyBzdWIgZHJpdmVyLAorCQkgKiBzdWNoIGFzIGNsb2NrLCBpcnEgYW5kIHJlZ2lzdGVyIG1hcCBhcmUgZG9uZSBvciBieSBsb2FkKCkKKwkJICogb2YgZXh5bm9zIGRybSBkcml2ZXIuCisJCSAqCisJCSAqIFAuUy4gbm90ZSB0aGF0IHRoaXMgZHJpdmVyIGlzIGNvbnNpZGVyZWQgZm9yIG1vZHVsYXJpemF0aW9uLgorCQkgKi8KKwkJcmV0ID0gc3ViZHJ2LT5wcm9iZShkZXYsIHN1YmRydi0+bWFuYWdlci5kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBlbmNvZGVyIGZvciB0aGlzIHN1YiBkcml2ZXIuICovCisJZW5jb2RlciA9IGV4eW5vc19kcm1fZW5jb2Rlcl9jcmVhdGUoZGV2LCAmc3ViZHJ2LT5tYW5hZ2VyLAorCQkJKDEgPDwgTUFYX0NSVEMpIC0gMSk7CisJaWYgKCFlbmNvZGVyKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBlbmNvZGVyXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyoKKwkgKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYSBjb25uZWN0b3IgZm9yIHRoaXMgc3ViIGRyaXZlciBhbmQKKwkgKiBhdHRhY2ggdGhlIGVuY29kZXIgY3JlYXRlZCBhYm92ZSB0byB0aGUgY29ubmVjdG9yLgorCSAqLworCWNvbm5lY3RvciA9IGV4eW5vc19kcm1fY29ubmVjdG9yX2NyZWF0ZShkZXYsIGVuY29kZXIpOworCWlmICghY29ubmVjdG9yKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBjb25uZWN0b3JcbiIpOworCQllbmNvZGVyLT5mdW5jcy0+ZGVzdHJveShlbmNvZGVyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3ViZHJ2LT5lbmNvZGVyID0gZW5jb2RlcjsKKwlzdWJkcnYtPmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX3N1YmRydl9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydikKK3sKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKHN1YmRydi0+cmVtb3ZlKQorCQlzdWJkcnYtPnJlbW92ZShkZXYpOworCisJaWYgKHN1YmRydi0+ZW5jb2RlcikgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSBzdWJkcnYtPmVuY29kZXI7CisJCWVuY29kZXItPmZ1bmNzLT5kZXN0cm95KGVuY29kZXIpOworCQlzdWJkcnYtPmVuY29kZXIgPSBOVUxMOworCX0KKworCWlmIChzdWJkcnYtPmNvbm5lY3RvcikgeworCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gc3ViZHJ2LT5jb25uZWN0b3I7CisJCWNvbm5lY3Rvci0+ZnVuY3MtPmRlc3Ryb3koY29ubmVjdG9yKTsKKwkJc3ViZHJ2LT5jb25uZWN0b3IgPSBOVUxMOworCX0KK30KKworaW50IGV4eW5vc19kcm1fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnYsICpuOworCWludCBlcnI7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRybV9kZXYpIHsKKwkJRFJNX0VSUk9SKCJBbHJlYWR5IGRybSBkZXZpY2Ugd2VyZSByZWdpc3RlcmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltdXRleF9sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3ViZHJ2LCBuLCAmZXh5bm9zX2RybV9zdWJkcnZfbGlzdCwgbGlzdCkgeworCQllcnIgPSBleHlub3NfZHJtX3N1YmRydl9wcm9iZShkZXYsIHN1YmRydik7CisJCWlmIChlcnIpIHsKKwkJCURSTV9ERUJVRygiZXh5bm9zIGRybSBzdWJkcnYgcHJvYmUgZmFpbGVkLlxuIik7CisJCQlsaXN0X2RlbCgmc3ViZHJ2LT5saXN0KTsKKwkJfQorCX0KKworCWRybV9kZXYgPSBkZXY7CisJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9kZXZpY2VfcmVnaXN0ZXIpOworCitpbnQgZXh5bm9zX2RybV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2OworCisJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICghZGV2IHx8IGRldiAhPSBkcm1fZGV2KSB7CisJCVdBUk4oMSwgIlVuZXhwZWN0ZWQgZHJtIGRldmljZSB1bnJlZ2lzdGVyIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmV4eW5vc19kcm1fbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ViZHJ2LCAmZXh5bm9zX2RybV9zdWJkcnZfbGlzdCwgbGlzdCkKKwkJZXh5bm9zX2RybV9zdWJkcnZfcmVtb3ZlKGRldiwgc3ViZHJ2KTsKKworCWRybV9kZXYgPSBOVUxMOworCW11dGV4X3VubG9jaygmZXh5bm9zX2RybV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4eW5vc19kcm1fZGV2aWNlX3VucmVnaXN0ZXIpOworCitzdGF0aWMgaW50IGV4eW5vc19kcm1fbW9kZV9ncm91cF9yZWluaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX21vZGVfZ3JvdXAgKmdyb3VwID0gJmRldi0+cHJpbWFyeS0+bW9kZV9ncm91cDsKKwl1aW50MzJfdCAqaWRfbGlzdCA9IGdyb3VwLT5pZF9saXN0OworCWludCByZXQ7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0ID0gZHJtX21vZGVfZ3JvdXBfaW5pdF9sZWdhY3lfZ3JvdXAoZGV2LCBncm91cCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlrZnJlZShpZF9saXN0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGV4eW5vc19kcm1fc3ViZHJ2X3JlZ2lzdGVyKHN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqc3ViZHJ2KQoreworCWludCBlcnI7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFzdWJkcnYpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZXh5bm9zX2RybV9tdXRleCk7CisJaWYgKGRybV9kZXYpIHsKKwkJZXJyID0gZXh5bm9zX2RybV9zdWJkcnZfcHJvYmUoZHJtX2Rldiwgc3ViZHJ2KTsKKwkJaWYgKGVycikgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcHJvYmUgZXh5bm9zIGRybSBzdWJkcnZcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKgorCQkgKiBpZiBhbnkgc3BlY2lmaWMgZHJpdmVyIHN1Y2ggYXMgZmltZCBvciBoZG1pIGRyaXZlciBjYWxsZWQKKwkJICogZXh5bm9zX2RybV9zdWJkcnZfcmVnaXN0ZXIoKSBsYXRlciB0aGFuIGRybV9sb2FkKCksCisJCSAqIHRoZSBmYiBoZWxwZXIgc2hvdWxkIGJlIHJlLWluaXRpYWxpemVkIGFuZCByZS1jb25maWd1cmVkLgorCQkgKi8KKwkJZXJyID0gZXh5bm9zX2RybV9mYmRldl9yZWluaXQoZHJtX2Rldik7CisJCWlmIChlcnIpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlaW5pdGlhbGl6ZSBleHlub3MgZHJtIGZiZGV2XG4iKTsKKwkJCWV4eW5vc19kcm1fc3ViZHJ2X3JlbW92ZShkcm1fZGV2LCBzdWJkcnYpOworCQkJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnIgPSBleHlub3NfZHJtX21vZGVfZ3JvdXBfcmVpbml0KGRybV9kZXYpOworCQlpZiAoZXJyKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byByZWluaXRpYWxpemUgbW9kZSBncm91cFxuIik7CisJCQlleHlub3NfZHJtX2ZiZGV2X2ZpbmkoZHJtX2Rldik7CisJCQlleHlub3NfZHJtX3N1YmRydl9yZW1vdmUoZHJtX2Rldiwgc3ViZHJ2KTsKKwkJCW11dGV4X3VubG9jaygmZXh5bm9zX2RybV9tdXRleCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJc3ViZHJ2LT5kcm1fZGV2ID0gZHJtX2RldjsKKworCWxpc3RfYWRkX3RhaWwoJnN1YmRydi0+bGlzdCwgJmV4eW5vc19kcm1fc3ViZHJ2X2xpc3QpOworCW11dGV4X3VubG9jaygmZXh5bm9zX2RybV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4eW5vc19kcm1fc3ViZHJ2X3JlZ2lzdGVyKTsKKworaW50IGV4eW5vc19kcm1fc3ViZHJ2X3VucmVnaXN0ZXIoc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnYpCit7CisJaW50IHJldCA9IC1FRkFVTFQ7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFzdWJkcnYpIHsKKwkJRFJNX0RFQlVHKCJVbmV4cGVjdGVkIGV4eW5vcyBkcm0gc3ViZHJ2IHVucmVnaXN0ZXIhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF9sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwlpZiAoZHJtX2RldikgeworCQlleHlub3NfZHJtX3N1YmRydl9yZW1vdmUoZHJtX2Rldiwgc3ViZHJ2KTsKKwkJbGlzdF9kZWwoJnN1YmRydi0+bGlzdCk7CisKKwkJLyoKKwkJICogZmIgaGVscGVyIHNob3VsZCBiZSB1cGRhdGVkIG9uY2UgYSBzdWIgZHJpdmVyIGlzIHJlbGVhc2VkCisJCSAqIHRvIHJlLWNvbmZpZ3VyZSBjcnRjIGFuZCBjb25uZWN0b3IgYW5kIGFsc28gdG8gcmUtc2V0dXAKKwkJICogZHJtIGZyYW1lYnVmZmVyLgorCQkgKi8KKwkJcmV0ID0gZXh5bm9zX2RybV9mYmRldl9yZWluaXQoZHJtX2Rldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCBmYiBoZWxwZXIgcmVpbml0LlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlyZXQgPSBleHlub3NfZHJtX21vZGVfZ3JvdXBfcmVpbml0KGRybV9kZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgZHJtIG1vZGUgZ3JvdXAgcmVpbml0LlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZleHlub3NfZHJtX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh5bm9zX2RybV9zdWJkcnZfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBDb3JlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzN2U1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qIGV4eW5vc19kcm1fY3J0Yy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2ZiLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9lbmNvZGVyLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9idWYuaCIKKworI2RlZmluZSB0b19leHlub3NfY3J0Yyh4KQljb250YWluZXJfb2YoeCwgc3RydWN0IGV4eW5vc19kcm1fY3J0YyxcCisJCQkJZHJtX2NydGMpCisKKy8qCisgKiBFeHlub3Mgc3BlY2lmaWMgY3J0YyBwb3N0aW9uIHN0cnVjdHVyZS4KKyAqCisgKiBAZmJfeDogb2Zmc2V0IHggb24gYSBmcmFtZWJ1ZmZlciB0byBiZSBkaXNwbHllZAorICoJLSB0aGUgdW5pdCBpcyBzY3JlZW4gY29vcmRpbmF0ZXMuCisgKiBAZmJfeTogb2Zmc2V0IHkgb24gYSBmcmFtZWJ1ZmZlciB0byBiZSBkaXNwbGF5ZWQKKyAqCS0gdGhlIHVuaXQgaXMgc2NyZWVuIGNvb3JkaW5hdGVzLgorICogQGNydGNfeDogb2Zmc2V0IHggb24gaGFyZHdhcmUgc2NyZWVuLgorICogQGNydGNfeTogb2Zmc2V0IHkgb24gaGFyZHdhcmUgc2NyZWVuLgorICogQGNydGNfdzogd2lkdGggb2YgaGFyZHdhcmUgc2NyZWVuLgorICogQGNydGNfaDogaGVpZ2h0IG9mIGhhcmR3YXJlIHNjcmVlbi4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fY3J0Y19wb3MgeworCXVuc2lnbmVkIGludCBmYl94OworCXVuc2lnbmVkIGludCBmYl95OworCXVuc2lnbmVkIGludCBjcnRjX3g7CisJdW5zaWduZWQgaW50IGNydGNfeTsKKwl1bnNpZ25lZCBpbnQgY3J0Y193OworCXVuc2lnbmVkIGludCBjcnRjX2g7Cit9OworCisvKgorICogRXh5bm9zIHNwZWNpZmljIGNydGMgc3RydWN0dXJlLgorICoKKyAqIEBkcm1fY3J0YzogY3J0YyBvYmplY3QuCisgKiBAb3ZlcmxheTogY29udGFpbiBpbmZvcm1hdGlvbiBjb21tb24gdG8gZGlzcGxheSBjb250cm9sbGVyIGFuZCBoZG1pIGFuZAorICoJY29udGVudHMgb2YgdGhpcyBvdmVybGF5IG9iamVjdCB3b3VsZCBiZSBjb3BpZWQgdG8gc3ViIGRyaXZlciBzaXplLgorICogQHBpcGU6IGEgY3J0YyBpbmRleCBjcmVhdGVkIGF0IGxvYWQoKSB3aXRoIGEgbmV3IGNydGMgb2JqZWN0IGNyZWF0aW9uCisgKglhbmQgdGhlIGNydGMgb2JqZWN0IHdvdWxkIGJlIHNldCB0byBwcml2YXRlLT5jcnRjIGFycmF5CisgKgl0byBnZXQgYSBjcnRjIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGlwZSBmcm9tIHByaXZhdGUtPmNydGMKKyAqCWFycmF5IHdoZW4gaXJxIGludGVycnVwdCBvY2N1cmVkLiB0aGUgcmVhc29uIG9mIHVzaW5nIHRoaXMgcGlwZSBpcyB0aGF0CisgKglkcm0gZnJhbWV3b3JrIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpcnEgeWV0LgorICoJd2UgY2FuIHJlZmVyIHRvIHRoZSBjcnRjIHRvIGN1cnJlbnQgaGFyZHdhcmUgaW50ZXJydXB0IG9jY3VyZWQgdGhyb3VnaAorICoJdGhpcyBwaXBlIHZhbHVlLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjIHsKKwlzdHJ1Y3QgZHJtX2NydGMJCQlkcm1fY3J0YzsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5CW92ZXJsYXk7CisJdW5zaWduZWQgaW50CQkJcGlwZTsKK307CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fY3J0Y19hcHBseShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fY3J0YyAqZXh5bm9zX2NydGMgPSB0b19leHlub3NfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5ID0gJmV4eW5vc19jcnRjLT5vdmVybGF5OworCisJZXh5bm9zX2RybV9mbl9lbmNvZGVyKGNydGMsIG92ZXJsYXksCisJCQlleHlub3NfZHJtX2VuY29kZXJfY3J0Y19tb2RlX3NldCk7CisJZXh5bm9zX2RybV9mbl9lbmNvZGVyKGNydGMsIE5VTEwsIGV4eW5vc19kcm1fZW5jb2Rlcl9jcnRjX2NvbW1pdCk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9vdmVybGF5X3VwZGF0ZShzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICAgICAgIHN0cnVjdCBleHlub3NfZHJtX2NydGNfcG9zICpwb3MpCit7CisJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBpbnQgYWN0dWFsX3c7CisJdW5zaWduZWQgaW50IGFjdHVhbF9oOworCisJZW50cnkgPSBleHlub3NfZHJtX2ZiX2dldF9idWYoZmIpOworCWlmICghZW50cnkpIHsKKwkJRFJNX0xPR19LTVMoImVudHJ5IGlzIG51bGwuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJb3ZlcmxheS0+cGFkZHIgPSBlbnRyeS0+cGFkZHI7CisJb3ZlcmxheS0+dmFkZHIgPSBlbnRyeS0+dmFkZHI7CisKKwlEUk1fREVCVUdfS01TKCJ2YWRkciA9IDB4JWx4LCBwYWRkciA9IDB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpb3ZlcmxheS0+dmFkZHIsCisJCQkodW5zaWduZWQgbG9uZylvdmVybGF5LT5wYWRkcik7CisKKwlhY3R1YWxfdyA9IG1pbigobW9kZS0+aGRpc3BsYXkgLSBwb3MtPmNydGNfeCksIHBvcy0+Y3J0Y193KTsKKwlhY3R1YWxfaCA9IG1pbigobW9kZS0+dmRpc3BsYXkgLSBwb3MtPmNydGNfeSksIHBvcy0+Y3J0Y19oKTsKKworCS8qIHNldCBkcm0gZnJhbWVidWZmZXIgZGF0YS4gKi8KKwlvdmVybGF5LT5mYl94ID0gcG9zLT5mYl94OworCW92ZXJsYXktPmZiX3kgPSBwb3MtPmZiX3k7CisJb3ZlcmxheS0+ZmJfd2lkdGggPSBmYi0+d2lkdGg7CisJb3ZlcmxheS0+ZmJfaGVpZ2h0ID0gZmItPmhlaWdodDsKKwlvdmVybGF5LT5icHAgPSBmYi0+Yml0c19wZXJfcGl4ZWw7CisJb3ZlcmxheS0+cGl0Y2ggPSBmYi0+cGl0Y2g7CisKKwkvKiBzZXQgb3ZlcmxheSByYW5nZSB0byBiZSBkaXNwbGF5ZWQuICovCisJb3ZlcmxheS0+Y3J0Y194ID0gcG9zLT5jcnRjX3g7CisJb3ZlcmxheS0+Y3J0Y195ID0gcG9zLT5jcnRjX3k7CisJb3ZlcmxheS0+Y3J0Y193aWR0aCA9IGFjdHVhbF93OworCW92ZXJsYXktPmNydGNfaGVpZ2h0ID0gYWN0dWFsX2g7CisKKwkvKiBzZXQgZHJtIG1vZGUgZGF0YS4gKi8KKwlvdmVybGF5LT5tb2RlX3dpZHRoID0gbW9kZS0+aGRpc3BsYXk7CisJb3ZlcmxheS0+bW9kZV9oZWlnaHQgPSBtb2RlLT52ZGlzcGxheTsKKwlvdmVybGF5LT5yZWZyZXNoID0gbW9kZS0+dnJlZnJlc2g7CisJb3ZlcmxheS0+c2Nhbl9mbGFnID0gbW9kZS0+ZmxhZ3M7CisKKwlEUk1fREVCVUdfS01TKCJvdmVybGF5IDogb2Zmc2V0X3gveSglZCwlZCksIHdpZHRoL2hlaWdodCglZCwlZCkiLAorCQkJb3ZlcmxheS0+Y3J0Y194LCBvdmVybGF5LT5jcnRjX3ksCisJCQlvdmVybGF5LT5jcnRjX3dpZHRoLCBvdmVybGF5LT5jcnRjX2hlaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2NydGNfdXBkYXRlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YzsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5OworCXN0cnVjdCBleHlub3NfZHJtX2NydGNfcG9zIHBvczsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjLT5tb2RlOworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CisKKwlpZiAoIW1vZGUgfHwgIWZiKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV4eW5vc19jcnRjID0gdG9fZXh5bm9zX2NydGMoY3J0Yyk7CisJb3ZlcmxheSA9ICZleHlub3NfY3J0Yy0+b3ZlcmxheTsKKworCW1lbXNldCgmcG9zLCAwLCBzaXplb2Yoc3RydWN0IGV4eW5vc19kcm1fY3J0Y19wb3MpKTsKKworCS8qIGl0IG1lYW5zIHRoZSBvZmZzZXQgb2YgZnJhbWVidWZmZXIgdG8gYmUgZGlzcGxheWVkLiAqLworCXBvcy5mYl94ID0gY3J0Yy0+eDsKKwlwb3MuZmJfeSA9IGNydGMtPnk7CisKKwkvKiBPU0QgcG9zaXRpb24gdG8gYmUgZGlzcGxheWVkLiAqLworCXBvcy5jcnRjX3ggPSAwOworCXBvcy5jcnRjX3kgPSAwOworCXBvcy5jcnRjX3cgPSBmYi0+d2lkdGggLSBjcnRjLT54OworCXBvcy5jcnRjX2ggPSBmYi0+aGVpZ2h0IC0gY3J0Yy0+eTsKKworCXJldHVybiBleHlub3NfZHJtX292ZXJsYXlfdXBkYXRlKG92ZXJsYXksIGNydGMtPmZiLCBtb2RlLCAmcG9zKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbW9kZSkKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogVE9ETyAqLworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIGRybSBmcmFtZXdvcmsgZG9lc24ndCBjaGVjayBOVUxMLiAqLworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogZHJtIGZyYW1ld29yayBkb2Vzbid0IGNoZWNrIE5VTEwuICovCit9CisKK3N0YXRpYyBib29sCitleHlub3NfZHJtX2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIGRybSBmcmFtZXdvcmsgZG9lc24ndCBjaGVjayBOVUxMICovCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQKK2V4eW5vc19kcm1fY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwgaW50IHgsIGludCB5LAorCQkJICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCW1vZGUgPSBhZGp1c3RlZF9tb2RlOworCisJcmV0dXJuIGV4eW5vc19kcm1fY3J0Y191cGRhdGUoY3J0Yyk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCQkJCSAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCWludCByZXQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0ID0gZXh5bm9zX2RybV9jcnRjX3VwZGF0ZShjcnRjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZXh5bm9zX2RybV9jcnRjX2FwcGx5KGNydGMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCS8qIGRybSBmcmFtZXdvcmsgZG9lc24ndCBjaGVjayBOVUxMICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIGV4eW5vc19jcnRjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcwkJPSBleHlub3NfZHJtX2NydGNfZHBtcywKKwkucHJlcGFyZQk9IGV4eW5vc19kcm1fY3J0Y19wcmVwYXJlLAorCS5jb21taXQJCT0gZXh5bm9zX2RybV9jcnRjX2NvbW1pdCwKKwkubW9kZV9maXh1cAk9IGV4eW5vc19kcm1fY3J0Y19tb2RlX2ZpeHVwLAorCS5tb2RlX3NldAk9IGV4eW5vc19kcm1fY3J0Y19tb2RlX3NldCwKKwkubW9kZV9zZXRfYmFzZQk9IGV4eW5vc19kcm1fY3J0Y19tb2RlX3NldF9iYXNlLAorCS5sb2FkX2x1dAk9IGV4eW5vc19kcm1fY3J0Y19sb2FkX2x1dCwKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9jcnRjX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJICAgICAgc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGV4eW5vc19kcm1fY3J0YyAqZXh5bm9zX2NydGMgPSB0b19leHlub3NfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIgPSBjcnRjLT5mYjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlpZiAoZXZlbnQpIHsKKwkJLyoKKwkJICogdGhlIHBpcGUgZnJvbSB1c2VyIGFsd2F5cyBpcyAwIHNvIHdlIGNhbiBzZXQgcGlwZSBudW1iZXIKKwkJICogb2YgY3VycmVudCBvd25lciB0byBldmVudC4KKwkJICovCisJCWV2ZW50LT5waXBlID0gZXh5bm9zX2NydGMtPnBpcGU7CisKKwkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmJhc2UubGluaywKKwkJCQkmZGV2X3ByaXYtPnBhZ2VmbGlwX2V2ZW50X2xpc3QpOworCisJCXJldCA9IGRybV92YmxhbmtfZ2V0KGRldiwgZXh5bm9zX2NydGMtPnBpcGUpOworCQlpZiAocmV0KSB7CisJCQlEUk1fREVCVUcoImZhaWxlZCB0byBhY3F1aXJlIHZibGFuayBjb3VudGVyXG4iKTsKKwkJCWxpc3RfZGVsKCZldmVudC0+YmFzZS5saW5rKTsKKworCQkJZ290byBvdXQ7CisJCX0KKworCQljcnRjLT5mYiA9IGZiOworCQlyZXQgPSBleHlub3NfZHJtX2NydGNfdXBkYXRlKGNydGMpOworCQlpZiAocmV0KSB7CisJCQljcnRjLT5mYiA9IG9sZF9mYjsKKwkJCWRybV92YmxhbmtfcHV0KGRldiwgZXh5bm9zX2NydGMtPnBpcGUpOworCQkJbGlzdF9kZWwoJmV2ZW50LT5iYXNlLmxpbmspOworCisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIHRoZSB2YWx1ZXMgcmVsYXRlZCB0byBhIGJ1ZmZlciBvZiB0aGUgZHJtIGZyYW1lYnVmZmVyCisJCSAqIHRvIGJlIGFwcGxpZWQgc2hvdWxkIGJlIHNldCBhdCBoZXJlLiBiZWNhdXNlIHRoZXNlIHZhbHVlcworCQkgKiBmaXJzdCwgYXJlIHNldCB0byBzaGFkb3cgcmVnaXN0ZXJzIGFuZCB0aGVuIHRvCisJCSAqIHJlYWwgcmVnaXN0ZXJzIGF0IHZzeW5jIGZyb250IHBvcmNoIHBlcmlvZC4KKwkJICovCisJCWV4eW5vc19kcm1fY3J0Y19hcHBseShjcnRjKTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmV4eW5vc19jcnRjID0gdG9fZXh5bm9zX2NydGMoY3J0Yyk7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcHJpdmF0ZS0+Y3J0Y1tleHlub3NfY3J0Yy0+cGlwZV0gPSBOVUxMOworCisJZHJtX2NydGNfY2xlYW51cChjcnRjKTsKKwlrZnJlZShleHlub3NfY3J0Yyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgZXh5bm9zX2NydGNfZnVuY3MgPSB7CisJLnNldF9jb25maWcJPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKKwkucGFnZV9mbGlwCT0gZXh5bm9zX2RybV9jcnRjX3BhZ2VfZmxpcCwKKwkuZGVzdHJveQk9IGV4eW5vc19kcm1fY3J0Y19kZXN0cm95LAorfTsKKworc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheSAqZ2V0X2V4eW5vc19kcm1fb3ZlcmxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fY3J0YyAqZXh5bm9zX2NydGMgPSB0b19leHlub3NfY3J0YyhjcnRjKTsKKworCXJldHVybiAmZXh5bm9zX2NydGMtPm92ZXJsYXk7Cit9CisKK2ludCBleHlub3NfZHJtX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBucikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9jcnRjICpleHlub3NfY3J0YzsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2NydGMgPSBremFsbG9jKHNpemVvZigqZXh5bm9zX2NydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4eW5vc19jcnRjKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGV4eW5vcyBjcnRjXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXh5bm9zX2NydGMtPnBpcGUgPSBucjsKKwljcnRjID0gJmV4eW5vc19jcnRjLT5kcm1fY3J0YzsKKworCXByaXZhdGUtPmNydGNbbnJdID0gY3J0YzsKKworCWRybV9jcnRjX2luaXQoZGV2LCBjcnRjLCAmZXh5bm9zX2NydGNfZnVuY3MpOworCWRybV9jcnRjX2hlbHBlcl9hZGQoY3J0YywgJmV4eW5vc19jcnRjX2hlbHBlcl9mdW5jcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGV4eW5vc19kcm1fY3J0Y19lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKnByaXZhdGUgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWV4eW5vc19kcm1fZm5fZW5jb2Rlcihwcml2YXRlLT5jcnRjW2NydGNdLCAmY3J0YywKKwkJCWV4eW5vc19kcm1fZW5hYmxlX3ZibGFuayk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBleHlub3NfZHJtX2NydGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2RybV9mbl9lbmNvZGVyKHByaXZhdGUtPmNydGNbY3J0Y10sICZjcnRjLAorCQkJZXh5bm9zX2RybV9kaXNhYmxlX3ZibGFuayk7Cit9CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBDUlRDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2NydGMuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4NDA0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jcnRjLmgKQEAgLTAsMCArMSwzOCBAQAorLyogZXh5bm9zX2RybV9jcnRjLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fQ1JUQ19IXworI2RlZmluZSBfRVhZTk9TX0RSTV9DUlRDX0hfCisKK3N0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKmdldF9leHlub3NfZHJtX292ZXJsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK2ludCBleHlub3NfZHJtX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBucik7CitpbnQgZXh5bm9zX2RybV9jcnRjX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwordm9pZCBleHlub3NfZHJtX2NydGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgxMGNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorCisjaW5jbHVkZSA8ZHJtL2V4eW5vc19kcm0uaD4KKworI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9jcnRjLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9mYmRldi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZmIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2dlbS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCSJleHlub3MtZHJtIgorI2RlZmluZSBEUklWRVJfREVTQwkiU2Ftc3VuZyBTb0MgRFJNIgorI2RlZmluZSBEUklWRVJfREFURQkiMjAxMTA1MzAiCisjZGVmaW5lIERSSVZFUl9NQUpPUgkxCisjZGVmaW5lIERSSVZFUl9NSU5PUgkwCisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZTsKKwlpbnQgcmV0OworCWludCBucjsKKworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlwcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCWlmICghcHJpdmF0ZSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBwcml2YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnByaXZhdGUtPnBhZ2VmbGlwX2V2ZW50X2xpc3QpOworCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKXByaXZhdGU7CisKKwlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOworCisJZXh5bm9zX2RybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CisKKwkvKgorCSAqIEVYWU5PUzQgaXMgZW5vdWdoIHRvIGhhdmUgdHdvIENSVENzIGFuZCBlYWNoIGNydGMgd291bGQgYmUgdXNlZAorCSAqIHdpdGhvdXQgZGVwZW5kZW5jeSBvZiBoYXJkd2FyZS4KKwkgKi8KKwlmb3IgKG5yID0gMDsgbnIgPCBNQVhfQ1JUQzsgbnIrKykgeworCQlyZXQgPSBleHlub3NfZHJtX2NydGNfY3JlYXRlKGRldiwgbnIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfY3J0YzsKKwl9CisKKwlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCBNQVhfQ1JUQyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY3J0YzsKKworCS8qCisJICogcHJvYmUgc3ViIGRyaXZlcnMgc3VjaCBhcyBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIGhkbWkgZHJpdmVyLAorCSAqIHRoYXQgd2VyZSByZWdpc3RlcmVkIGF0IHByb2JlKCkgb2YgcGxhdGZvcm0gZHJpdmVyCisJICogdG8gdGhlIHN1YiBkcml2ZXIgYW5kIGNyZWF0ZSBlbmNvZGVyIGFuZCBjb25uZWN0b3IgZm9yIHRoZW0uCisJICovCisJcmV0ID0gZXh5bm9zX2RybV9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl92Ymxhbms7CisKKwkvKgorCSAqIGNyZWF0ZSBhbmQgY29uZmlndXJlIGZiIGhlbHBlciBhbmQgYWxzbyBleHlub3Mgc3BlY2lmaWMKKwkgKiBmYmRldiBvYmplY3QuCisJICovCisJcmV0ID0gZXh5bm9zX2RybV9mYmRldl9pbml0KGRldik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0aWFsaXplIGRybSBmYmRldlxuIik7CisJCWdvdG8gZXJyX2RybV9kZXZpY2U7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kcm1fZGV2aWNlOgorCWV4eW5vc19kcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKK2Vycl92Ymxhbms6CisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CitlcnJfY3J0YzoKKwlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOworCWtmcmVlKHByaXZhdGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZHJtX2ZiZGV2X2ZpbmkoZGV2KTsKKwlleHlub3NfZHJtX2RldmljZV91bnJlZ2lzdGVyKGRldik7CisJZHJtX3ZibGFua19jbGVhbnVwKGRldik7CisJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKKwlrZnJlZShkZXYtPmRldl9wcml2YXRlKTsKKworCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLyoKKwkgKiBkcm0gZnJhbWV3b3JrIGZyZWVzIGFsbCBldmVudHMgYXQgcmVsZWFzZSB0aW1lLAorCSAqIHNvIHByaXZhdGUgZXZlbnQgbGlzdCBzaG91bGQgYmUgY2xlYXJlZC4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5wYWdlZmxpcF9ldmVudF9saXN0KSkKKwkJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5wYWdlZmxpcF9ldmVudF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2RybV9mYmRldl9yZXN0b3JlX21vZGUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBleHlub3NfZHJtX2dlbV92bV9vcHMgPSB7CisJLmZhdWx0ID0gZXh5bm9zX2RybV9nZW1fZmF1bHQsCisJLm9wZW4gPSBkcm1fZ2VtX3ZtX29wZW4sCisJLmNsb3NlID0gZHJtX2dlbV92bV9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgZXh5bm9zX2lvY3Rsc1tdID0geworCURSTV9JT0NUTF9ERUZfRFJWKEVYWU5PU19HRU1fQ1JFQVRFLCBleHlub3NfZHJtX2dlbV9jcmVhdGVfaW9jdGwsCisJCQlEUk1fVU5MT0NLRUQgfCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoRVhZTk9TX0dFTV9NQVBfT0ZGU0VULAorCQkJZXh5bm9zX2RybV9nZW1fbWFwX29mZnNldF9pb2N0bCwgRFJNX1VOTE9DS0VEIHwKKwkJCURSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihFWFlOT1NfR0VNX01NQVAsCisJCQlleHlub3NfZHJtX2dlbV9tbWFwX2lvY3RsLCBEUk1fVU5MT0NLRUQgfCBEUk1fQVVUSCksCit9OworCitzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZXh5bm9zX2RybV9kcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcwk9IERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9CVVNfUExBVEZPUk0gfAorCQkJCSAgRFJJVkVSX01PREVTRVQgfCBEUklWRVJfR0VNLAorCS5sb2FkCQkJPSBleHlub3NfZHJtX2xvYWQsCisJLnVubG9hZAkJCT0gZXh5bm9zX2RybV91bmxvYWQsCisJLnByZWNsb3NlCQk9IGV4eW5vc19kcm1fcHJlY2xvc2UsCisJLmxhc3RjbG9zZQkJPSBleHlub3NfZHJtX2xhc3RjbG9zZSwKKwkuZ2V0X3ZibGFua19jb3VudGVyCT0gZHJtX3ZibGFua19jb3VudCwKKwkuZW5hYmxlX3ZibGFuawkJPSBleHlub3NfZHJtX2NydGNfZW5hYmxlX3ZibGFuaywKKwkuZGlzYWJsZV92YmxhbmsJCT0gZXh5bm9zX2RybV9jcnRjX2Rpc2FibGVfdmJsYW5rLAorCS5nZW1faW5pdF9vYmplY3QJPSBleHlub3NfZHJtX2dlbV9pbml0X29iamVjdCwKKwkuZ2VtX2ZyZWVfb2JqZWN0CT0gZXh5bm9zX2RybV9nZW1fZnJlZV9vYmplY3QsCisJLmdlbV92bV9vcHMJCT0gJmV4eW5vc19kcm1fZ2VtX3ZtX29wcywKKwkuZHVtYl9jcmVhdGUJCT0gZXh5bm9zX2RybV9nZW1fZHVtYl9jcmVhdGUsCisJLmR1bWJfbWFwX29mZnNldAk9IGV4eW5vc19kcm1fZ2VtX2R1bWJfbWFwX29mZnNldCwKKwkuZHVtYl9kZXN0cm95CQk9IGV4eW5vc19kcm1fZ2VtX2R1bWJfZGVzdHJveSwKKwkuaW9jdGxzCQkJPSBleHlub3NfaW9jdGxzLAorCS5mb3BzID0geworCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5vcGVuCQk9IGRybV9vcGVuLAorCQkubW1hcAkJPSBleHlub3NfZHJtX2dlbV9tbWFwLAorCQkucG9sbAkJPSBkcm1fcG9sbCwKKwkJLnJlYWQJCT0gZHJtX3JlYWQsCisJCS51bmxvY2tlZF9pb2N0bAk9IGRybV9pb2N0bCwKKwkJLnJlbGVhc2UJPSBkcm1fcmVsZWFzZSwKKwl9LAorCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJLmRlc2MJPSBEUklWRVJfREVTQywKKwkuZGF0ZQk9IERSSVZFUl9EQVRFLAorCS5tYWpvcgk9IERSSVZFUl9NQUpPUiwKKwkubWlub3IJPSBEUklWRVJfTUlOT1IsCit9OworCitzdGF0aWMgaW50IGV4eW5vc19kcm1fcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2RybV9kcml2ZXIubnVtX2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKGV4eW5vc19pb2N0bHMpOworCisJcmV0dXJuIGRybV9wbGF0Zm9ybV9pbml0KCZleHlub3NfZHJtX2RyaXZlciwgcGRldik7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJZHJtX3BsYXRmb3JtX2V4aXQoJmV4eW5vc19kcm1fZHJpdmVyLCBwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBleHlub3NfZHJtX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZXh5bm9zX2RybV9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGV4eW5vc19kcm1fcGxhdGZvcm1fcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV4eW5vc19kcm1faW5pdCh2b2lkKQoreworCURSTV9ERUJVR19EUklWRVIoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZleHlub3NfZHJtX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleHlub3NfZHJtX2V4aXQodm9pZCkKK3sKKwlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19GSUxFX18pOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmV4eW5vc19kcm1fcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZXh5bm9zX2RybV9pbml0KTsKK21vZHVsZV9leGl0KGV4eW5vc19kcm1fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIklua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgU29DIERSTSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM2ODNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Rydi5oCkBAIC0wLDAgKzEsMjU0IEBACisvKiBleHlub3NfZHJtX2Rydi5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9FWFlOT1NfRFJNX0RSVl9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9EUlZfSF8KKworI2luY2x1ZGUgImRybS5oIgorCisjZGVmaW5lIE1BWF9DUlRDCTIKKworc3RydWN0IGRybV9kZXZpY2U7CitzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5Oworc3RydWN0IGRybV9jb25uZWN0b3I7CisKKy8qIHRoaXMgZW51bWVyYXRlcyBkaXNwbGF5IHR5cGUuICovCitlbnVtIGV4eW5vc19kcm1fb3V0cHV0X3R5cGUgeworCUVYWU5PU19ESVNQTEFZX1RZUEVfTk9ORSwKKwkvKiBSR0Igb3IgQ1BVIEludGVyZmFjZS4gKi8KKwlFWFlOT1NfRElTUExBWV9UWVBFX0xDRCwKKwkvKiBIRE1JIEludGVyZmFjZS4gKi8KKwlFWFlOT1NfRElTUExBWV9UWVBFX0hETUksCit9OworCisvKgorICogRXh5bm9zIGRybSBvdmVybGF5IG9wcyBzdHJ1Y3R1cmUuCisgKgorICogQG1vZGVfc2V0OiBjb3B5IGRybSBvdmVybGF5IGluZm8gdG8gaHcgc3BlY2lmaWMgb3ZlcmxheSBpbmZvLgorICogQGNvbW1pdDogYXBwbHkgaGFyZHdhcmUgc3BlY2lmaWMgb3ZlcmxheSBkYXRhIHRvIHJlZ2lzdGVycy4KKyAqIEBkaXNhYmxlOiBkaXNhYmxlIGhhcmR3YXJlIHNwZWNpZmljIG92ZXJsYXkuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX292ZXJsYXlfb3BzIHsKKwl2b2lkICgqbW9kZV9zZXQpKHN0cnVjdCBkZXZpY2UgKnN1YmRydl9kZXYsCisJCQkgc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheSAqb3ZlcmxheSk7CisJdm9pZCAoKmNvbW1pdCkoc3RydWN0IGRldmljZSAqc3ViZHJ2X2Rldik7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBkZXZpY2UgKnN1YmRydl9kZXYpOworfTsKKworLyoKKyAqIEV4eW5vcyBkcm0gY29tbW9uIG92ZXJsYXkgc3RydWN0dXJlLgorICoKKyAqIEBmYl94OiBvZmZzZXQgeCBvbiBhIGZyYW1lYnVmZmVyIHRvIGJlIGRpc3BsYXllZC4KKyAqCS0gdGhlIHVuaXQgaXMgc2NyZWVuIGNvb3JkaW5hdGVzLgorICogQGZiX3k6IG9mZnNldCB5IG9uIGEgZnJhbWVidWZmZXIgdG8gYmUgZGlzcGxheWVkLgorICoJLSB0aGUgdW5pdCBpcyBzY3JlZW4gY29vcmRpbmF0ZXMuCisgKiBAZmJfd2lkdGg6IHdpZHRoIG9mIGEgZnJhbWVidWZmZXIuCisgKiBAZmJfaGVpZ2h0OiBoZWlnaHQgb2YgYSBmcmFtZWJ1ZmZlci4KKyAqIEBjcnRjX3g6IG9mZnNldCB4IG9uIGhhcmR3YXJlIHNjcmVlbi4KKyAqIEBjcnRjX3k6IG9mZnNldCB5IG9uIGhhcmR3YXJlIHNjcmVlbi4KKyAqIEBjcnRjX3dpZHRoOiB3aW5kb3cgd2lkdGggdG8gYmUgZGlzcGxheWVkIChoYXJkd2FyZSBzY3JlZW4pLgorICogQGNydGNfaGVpZ2h0OiB3aW5kb3cgaGVpZ2h0IHRvIGJlIGRpc3BsYXllZCAoaGFyZHdhcmUgc2NyZWVuKS4KKyAqIEBtb2RlX3dpZHRoOiB3aWR0aCBvZiBzY3JlZW4gbW9kZS4KKyAqIEBtb2RlX2hlaWdodDogaGVpZ2h0IG9mIHNjcmVlbiBtb2RlLgorICogQHJlZnJlc2g6IHJlZnJlc2ggcmF0ZS4KKyAqIEBzY2FuX2ZsYWc6IGludGVybGFjZSBvciBwcm9ncmVzc2l2ZSB3YXkuCisgKgkoaXQgY291bGQgYmUgRFJNX01PREVfRkxBR18qKQorICogQGJwcDogcGl4ZWwgc2l6ZS4oaW4gYml0KQorICogQHBhZGRyOiBidXMoYWNjZXNzZWQgYnkgZG1hKSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyB0byB0aGlzIG92ZXJsYXkKKyAqCQlhbmQgdGhpcyBpcyBwaHlzaWNhbGx5IGNvbnRpbnVvdXMuCisgKiBAdmFkZHI6IHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NzIHRvIHRoaXMgb3ZlcmxheS4KKyAqIEBkZWZhdWx0X3dpbjogYSB3aW5kb3cgdG8gYmUgZW5hYmxlZC4KKyAqIEBjb2xvcl9rZXk6IGNvbG9yIGtleSBvbiBvciBvZmYuCisgKiBAaW5kZXhfY29sb3I6IGlmIHVzaW5nIGNvbG9yIGtleSBmZWF0dXJlIHRoZW4gdGhpcyB2YWx1ZSB3b3VsZCBiZSB1c2VkCisgKgkJCWFzIGluZGV4IGNvbG9yLgorICogQGxvY2FsX3BhdGg6IGluIGNhc2Ugb2YgbGNkIHR5cGUsIGxvY2FsIHBhdGggbW9kZSBvbiBvciBvZmYuCisgKiBAdHJhbnNwYXJlbmN5OiB0cmFuc3BhcmVuY3kgb24gb3Igb2ZmLgorICogQGFjdGl2YXRlZDogYWN0aXZhdGVkIG9yIG5vdC4KKyAqCisgKiB0aGlzIHN0cnVjdHVyZSBpcyBjb21tb24gdG8gZXh5bm9zIFNvQyBhbmQgaXRzIGNvbnRlbnRzIHdvdWxkIGJlIGNvcGllZAorICogdG8gaGFyZHdhcmUgc3BlY2lmaWMgb3ZlcmxheSBpbmZvLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5IHsKKwl1bnNpZ25lZCBpbnQgZmJfeDsKKwl1bnNpZ25lZCBpbnQgZmJfeTsKKwl1bnNpZ25lZCBpbnQgZmJfd2lkdGg7CisJdW5zaWduZWQgaW50IGZiX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgY3J0Y194OworCXVuc2lnbmVkIGludCBjcnRjX3k7CisJdW5zaWduZWQgaW50IGNydGNfd2lkdGg7CisJdW5zaWduZWQgaW50IGNydGNfaGVpZ2h0OworCXVuc2lnbmVkIGludCBtb2RlX3dpZHRoOworCXVuc2lnbmVkIGludCBtb2RlX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaDsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9mbGFnOworCXVuc2lnbmVkIGludCBicHA7CisJdW5zaWduZWQgaW50IHBpdGNoOworCWRtYV9hZGRyX3QgcGFkZHI7CisJdm9pZCBfX2lvbWVtICp2YWRkcjsKKworCWJvb2wgZGVmYXVsdF93aW47CisJYm9vbCBjb2xvcl9rZXk7CisJdW5zaWduZWQgaW50IGluZGV4X2NvbG9yOworCWJvb2wgbG9jYWxfcGF0aDsKKwlib29sIHRyYW5zcGFyZW5jeTsKKwlib29sIGFjdGl2YXRlZDsKK307CisKKy8qCisgKiBFeHlub3MgRFJNIERpc3BsYXkgU3RydWN0dXJlLgorICoJLSB0aGlzIHN0cnVjdHVyZSBpcyBjb21tb24gdG8gYW5hbG9nIHR2LCBkaWdpdGFsIHR2IGFuZCBsY2QgcGFuZWwuCisgKgorICogQHR5cGU6IG9uZSBvZiBFWFlOT1NfRElTUExBWV9UWVBFX0xDRCBhbmQgSERNSS4KKyAqIEBpc19jb25uZWN0ZWQ6IGNoZWNrIGZvciB0aGF0IGRpc3BsYXkgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyAqIEBnZXRfZWRpZDogZ2V0IGVkaWQgbW9kZXMgZnJvbSBkaXNwbGF5IGRyaXZlci4KKyAqIEBnZXRfdGltaW5nOiBnZXQgdGltaW5nIG9iamVjdCBmcm9tIGRpc3BsYXkgZHJpdmVyLgorICogQGNoZWNrX3RpbWluZzogY2hlY2sgaWYgdGltaW5nIGlzIHZhbGlkIG9yIG5vdC4KKyAqIEBwb3dlcl9vbjogZGlzcGxheSBkZXZpY2Ugb24gb3Igb2ZmLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5IHsKKwllbnVtIGV4eW5vc19kcm1fb3V0cHV0X3R5cGUgdHlwZTsKKwlib29sICgqaXNfY29ubmVjdGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKmdldF9lZGlkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJdTggKmVkaWQsIGludCBsZW4pOworCXZvaWQgKigqZ2V0X3RpbWluZykoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpjaGVja190aW1pbmcpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdGltaW5nKTsKKwlpbnQgKCpwb3dlcl9vbikoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbW9kZSk7Cit9OworCisvKgorICogRXh5bm9zIGRybSBtYW5hZ2VyIG9wcworICoKKyAqIEBtb2RlX3NldDogY29udmVydCBkcm1fZGlzcGxheV9tb2RlIHRvIGh3IHNwZWNpZmljIGRpc3BsYXkgbW9kZSBhbmQKKyAqCSAgICAgIHdvdWxkIGJlIGNhbGxlZCBieSBlbmNvZGVyLT5tb2RlX3NldCgpLgorICogQGNvbW1pdDogc2V0IGN1cnJlbnQgaHcgc3BlY2lmaWMgZGlzcGxheSBtb2RlIHRvIGh3LgorICogQGVuYWJsZV92Ymxhbms6IHNwZWNpZmljIGRyaXZlciBjYWxsYmFjayBmb3IgZW5hYmxpbmcgdmJsYW5rIGludGVycnVwdC4KKyAqIEBkaXNhYmxlX3ZibGFuazogc3BlY2lmaWMgZHJpdmVyIGNhbGxiYWNrIGZvciBkaXNhYmxpbmcgdmJsYW5rIGludGVycnVwdC4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgeworCXZvaWQgKCptb2RlX3NldCkoc3RydWN0IGRldmljZSAqc3ViZHJ2X2Rldiwgdm9pZCAqbW9kZSk7CisJdm9pZCAoKmNvbW1pdCkoc3RydWN0IGRldmljZSAqc3ViZHJ2X2Rldik7CisJaW50ICgqZW5hYmxlX3ZibGFuaykoc3RydWN0IGRldmljZSAqc3ViZHJ2X2Rldik7CisJdm9pZCAoKmRpc2FibGVfdmJsYW5rKShzdHJ1Y3QgZGV2aWNlICpzdWJkcnZfZGV2KTsKK307CisKKy8qCisgKiBFeHlub3MgZHJtIGNvbW1vbiBtYW5hZ2VyIHN0cnVjdHVyZS4KKyAqCisgKiBAZGV2OiBwb2ludGVyIHRvIGRldmljZSBvYmplY3QgZm9yIHN1YmRydiBkZXZpY2UgZHJpdmVyLgorICoJc3ViIGRyaXZlcnMgc3VjaCBhcyBkaXNwbGF5IGNvbnRyb2xsZXIgb3IgaGRtaSBkcml2ZXIsCisgKgloYXZlIHRoZWlyIG93biBkZXZpY2Ugb2JqZWN0LgorICogQG9wczogcG9pbnRlciB0byBjYWxsYmFja3MgZm9yIGV4eW5vcyBkcm0gc3BlY2lmaWMgZnJhbWVidWZmZXIuCisgKgl0aGVzZSBjYWxsYmFja3Mgc2hvdWxkIGJlIHNldCBieSBzcGVjaWZpYyBkcml2ZXJzIHN1Y2ggZmltZAorICoJb3IgaGRtaSBkcml2ZXIgYW5kIGFyZSB1c2VkIHRvIGNvbnRyb2wgaGFyZHdhcmUgZ2xvYmFsIHJlZ2lzdGVycy4KKyAqIEBvdmVybGF5X29wczogcG9pbnRlciB0byBjYWxsYmFja3MgZm9yIGV4eW5vcyBkcm0gc3BlY2lmaWMgZnJhbWVidWZmZXIuCisgKgl0aGVzZSBjYWxsYmFja3Mgc2hvdWxkIGJlIHNldCBieSBzcGVjaWZpYyBkcml2ZXJzIHN1Y2ggZmltZAorICoJb3IgaGRtaSBkcml2ZXIgYW5kIGFyZSB1c2VkIHRvIGNvbnRyb2wgaGFyZHdhcmUgb3ZlcmxheSByZWlnc3RlcnMuCisgKiBAZGlzcGxheTogcG9pbnRlciB0byBjYWxsYmFja3MgZm9yIGV4eW5vcyBkcm0gc3BlY2lmaWMgZnJhbWVidWZmZXIuCisgKgl0aGVzZSBjYWxsYmFja3Mgc2hvdWxkIGJlIHNldCBieSBzcGVjaWZpYyBkcml2ZXJzIHN1Y2ggZmltZAorICoJb3IgaGRtaSBkcml2ZXIgYW5kIGFyZSB1c2VkIHRvIGNvbnRyb2wgZGlzcGxheSBkZXZpY2VzIHN1Y2ggYXMKKyAqCWFuYWxvZyB0diwgZGlnaXRhbCB0diBhbmQgbGNkIHBhbmVsIGFuZCBhbHNvIGdldCB0aW1pbmcgZGF0YSBmb3IgdGhlbS4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBwaXBlOworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXJfb3BzICpvcHM7CisJc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheV9vcHMgKm92ZXJsYXlfb3BzOworCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXk7Cit9OworCisvKgorICogRXh5bm9zIGRybSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSB7CisJc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcjsKKworCS8qIGxpc3QgaGVhZCBmb3IgbmV3IGV2ZW50IHRvIGJlIGFkZGVkLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgcGFnZWZsaXBfZXZlbnRfbGlzdDsKKworCS8qCisJICogY3JlYXRlZCBjcnRjIG9iamVjdCB3b3VsZCBiZSBjb250YWluZWQgYXQgdGhpcyBhcnJheSBhbmQKKwkgKiB0aGlzIGFycmF5IGlzIHVzZWQgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggY3J0YyBkaWQgaXQgcmVxdWVzdCB2YmxhbmsuCisJICovCisJc3RydWN0IGRybV9jcnRjICpjcnRjW01BWF9DUlRDXTsKK307CisKKy8qCisgKiBFeHlub3MgZHJtIHN1YiBkcml2ZXIgc3RydWN0dXJlLgorICoKKyAqIEBsaXN0OiBzdWIgZHJpdmVyIGhhcyBpdHMgb3duIGxpc3Qgb2JqZWN0IHRvIHJlZ2lzdGVyIHRvIGV4eW5vcyBkcm0gZHJpdmVyLgorICogQGRybV9kZXY6IHBvaW50ZXIgdG8gZHJtX2RldmljZSBhbmQgdGhpcyBwb2ludGVyIHdvdWxkIGJlIHNldAorICoJd2hlbiBzdWIgZHJpdmVyIGNhbGxzIGV4eW5vc19kcm1fc3ViZHJ2X3JlZ2lzdGVyKCkuCisgKiBAcHJvYmU6IHRoaXMgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGJ5IGV4eW5vcyBkcm0gZHJpdmVyIGFmdGVyCisgKglzdWJkcnYgaXMgcmVnaXN0ZXJlZCB0byBpdC4KKyAqIEByZW1vdmU6IHRoaXMgY2FsbGJhY2sgaXMgdXNlZCB0byByZWxlYXNlIHJlc291cmNlcyBjcmVhdGVkCisgKglieSBwcm9iZSBjYWxsYmFjay4KKyAqIEBtYW5hZ2VyOiBzdWJkcnYgaGFzIGl0cyBvd24gbWFuYWdlciB0byBjb250cm9sIGEgaGFyZHdhcmUgYXBwcm9wcmlhdGVseQorICoJYW5kIHdlIGNhbiBhY2Nlc3MgYSBoYXJkd2FyZSBkcmF3aW5nIG9uIHRoaXMgbWFuYWdlci4KKyAqIEBlbmNvZGVyOiBlbmNvZGVyIG9iamVjdCBvd25lZCBieSB0aGlzIHN1YiBkcml2ZXIuCisgKiBAY29ubmVjdG9yOiBjb25uZWN0b3Igb2JqZWN0IG93bmVkIGJ5IHRoaXMgc3ViIGRyaXZlci4KKyAqLworc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXY7CisKKwlpbnQgKCpwcm9iZSkoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIHN0cnVjdCBkZXZpY2UgKmRldik7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyIG1hbmFnZXI7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Cit9OworCisvKgorICogdGhpcyBmdW5jdGlvbiBjYWxscyBhIHByb2JlIGNhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gc3ViIGRyaXZlciBsaXN0IGFuZAorICogY3JlYXRlIGl0cyBvd24gZW5jb2RlciBhbmQgY29ubmVjdG9yIGFuZCB0aGVuIHNldCBkcm1fZGV2aWNlIG9iamVjdAorICogdG8gZ2xvYmFsIG9uZS4KKyAqLworaW50IGV4eW5vc19kcm1fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworLyoKKyAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgYSByZW1vdmUgY2FsbGJhY2sgcmVnaXN0ZXJlZCB0byBzdWIgZHJpdmVyIGxpc3QgYW5kCisgKiBkZXN0cm95IGl0cyBvd24gZW5jb2RlciBhbmQgY29ubmV0b3IuCisgKi8KK2ludCBleHlub3NfZHJtX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCisvKgorICogdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQgYnkgc3ViIGRyaXZlcnMgc3VjaCBhcyBkaXNwbGF5IGNvbnRyb2xsZXIKKyAqIG9yIGhkbWkgZHJpdmVyIHRvIHJlZ2lzdGVyIHRoaXMgc3ViIGRyaXZlciBvYmplY3QgdG8gZXh5bm9zIGRybSBkcml2ZXIKKyAqIGFuZCB3aGVuIGEgc3ViIGRyaXZlciBpcyByZWdpc3RlcmVkIHRvIGV4eW5vcyBkcm0gZHJpdmVyIGEgcHJvYmUgY2FsbGJhY2sKKyAqIG9mIHRoZSBzdWIgZHJpdmVyIGlzIGNhbGxlZCBhbmQgY3JlYXRlcyBpdHMgb3duIGVuY29kZXIgYW5kIGNvbm5lY3RvcgorICogYW5kIHRoZW4gZmIgaGVscGVyIGFuZCBkcm0gbW9kZSBncm91cCB3b3VsZCBiZSByZS1pbml0aWFsaXplZC4KKyAqLworaW50IGV4eW5vc19kcm1fc3ViZHJ2X3JlZ2lzdGVyKHN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqZHJtX3N1YmRydik7CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZXMgc3ViZHJ2IGxpc3QgZnJvbSBleHlub3MgZHJtIGRyaXZlciBhbmQgZmIgaGVscGVyCisgKiBhbmQgZHJtIG1vZGUgZ3JvdXAgd291bGQgYmUgcmUtaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBleHlub3NfZHJtX3N1YmRydl91bnJlZ2lzdGVyKHN0cnVjdCBleHlub3NfZHJtX3N1YmRydiAqZHJtX3N1YmRydik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2VuY29kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9lbmNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNmZhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9lbmNvZGVyLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qIGV4eW5vc19kcm1fZW5jb2Rlci5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgorCisjaW5jbHVkZSAiZXh5bm9zX2RybV9kcnYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2NydGMuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2VuY29kZXIuaCIKKworI2RlZmluZSB0b19leHlub3NfZW5jb2Rlcih4KQljb250YWluZXJfb2YoeCwgc3RydWN0IGV4eW5vc19kcm1fZW5jb2RlcixcCisJCQkJZHJtX2VuY29kZXIpCisKKy8qCisgKiBleHlub3Mgc3BlY2lmaWMgZW5jb2RlciBzdHJ1Y3R1cmUuCisgKgorICogQGRybV9lbmNvZGVyOiBlbmNvZGVyIG9iamVjdC4KKyAqIEBtYW5hZ2VyOiBzcGVjaWZpYyBlbmNvZGVyIGhhcyBpdHMgb3duIG1hbmFnZXIgdG8gY29udHJvbCBhIGhhcmR3YXJlCisgKglhcHByb3ByaWF0ZWx5IGFuZCB3ZSBjYW4gYWNjZXNzIGEgaGFyZHdhcmUgZHJhd2luZyBvbiB0aGlzIG1hbmFnZXIuCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2VuY29kZXIgeworCXN0cnVjdCBkcm1fZW5jb2RlcgkJZHJtX2VuY29kZXI7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcgkqbWFuYWdlcjsKK307CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fZW5jb2Rlcl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPSBleHlub3NfZHJtX2dldF9tYW5hZ2VyKGVuY29kZXIpOworCisJRFJNX0RFQlVHX0tNUygiJXMsIGVuY29kZXIgZHBtczogJWRcbiIsIF9fRklMRV9fLCBtb2RlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlpZiAoY29ubmVjdG9yLT5lbmNvZGVyID09IGVuY29kZXIpIHsKKwkJCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkgPSBtYW5hZ2VyLT5kaXNwbGF5OworCisJCQlpZiAoZGlzcGxheSAmJiBkaXNwbGF5LT5wb3dlcl9vbikKKwkJCQlkaXNwbGF5LT5wb3dlcl9vbihtYW5hZ2VyLT5kZXYsIG1vZGUpOworCQl9CisJfQorfQorCitzdGF0aWMgYm9vbAorZXh5bm9zX2RybV9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBkcm0gZnJhbWV3b3JrIGRvZXNuJ3QgY2hlY2sgTlVMTC4gKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9IGV4eW5vc19kcm1fZ2V0X21hbmFnZXIoZW5jb2Rlcik7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgKm1hbmFnZXJfb3BzID0gbWFuYWdlci0+b3BzOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXlfb3BzICpvdmVybGF5X29wcyA9IG1hbmFnZXItPm92ZXJsYXlfb3BzOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXkgKm92ZXJsYXkgPSBnZXRfZXh5bm9zX2RybV9vdmVybGF5KGRldiwKKwkJCQkJCWVuY29kZXItPmNydGMpOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCW1vZGUgPSBhZGp1c3RlZF9tb2RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgPT0gZW5jb2RlcikgeworCQkJaWYgKG1hbmFnZXJfb3BzICYmIG1hbmFnZXJfb3BzLT5tb2RlX3NldCkKKwkJCQltYW5hZ2VyX29wcy0+bW9kZV9zZXQobWFuYWdlci0+ZGV2LCBtb2RlKTsKKworCQkJaWYgKG92ZXJsYXlfb3BzICYmIG92ZXJsYXlfb3BzLT5tb2RlX3NldCkKKwkJCQlvdmVybGF5X29wcy0+bW9kZV9zZXQobWFuYWdlci0+ZGV2LCBvdmVybGF5KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBkcm0gZnJhbWV3b3JrIGRvZXNuJ3QgY2hlY2sgTlVMTC4gKi8KK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9IGV4eW5vc19kcm1fZ2V0X21hbmFnZXIoZW5jb2Rlcik7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgKm1hbmFnZXJfb3BzID0gbWFuYWdlci0+b3BzOworCXN0cnVjdCBleHlub3NfZHJtX292ZXJsYXlfb3BzICpvdmVybGF5X29wcyA9IG1hbmFnZXItPm92ZXJsYXlfb3BzOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmIChtYW5hZ2VyX29wcyAmJiBtYW5hZ2VyX29wcy0+Y29tbWl0KQorCQltYW5hZ2VyX29wcy0+Y29tbWl0KG1hbmFnZXItPmRldik7CisKKwlpZiAob3ZlcmxheV9vcHMgJiYgb3ZlcmxheV9vcHMtPmNvbW1pdCkKKwkJb3ZlcmxheV9vcHMtPmNvbW1pdChtYW5hZ2VyLT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9jcnRjICoKK2V4eW5vc19kcm1fZW5jb2Rlcl9nZXRfY3J0YyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJcmV0dXJuIGVuY29kZXItPmNydGM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGV4eW5vc19lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcwkJPSBleHlub3NfZHJtX2VuY29kZXJfZHBtcywKKwkubW9kZV9maXh1cAk9IGV4eW5vc19kcm1fZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5tb2RlX3NldAk9IGV4eW5vc19kcm1fZW5jb2Rlcl9tb2RlX3NldCwKKwkucHJlcGFyZQk9IGV4eW5vc19kcm1fZW5jb2Rlcl9wcmVwYXJlLAorCS5jb21taXQJCT0gZXh5bm9zX2RybV9lbmNvZGVyX2NvbW1pdCwKKwkuZ2V0X2NydGMJPSBleHlub3NfZHJtX2VuY29kZXJfZ2V0X2NydGMsCit9OworCitzdGF0aWMgdm9pZCBleHlub3NfZHJtX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZW5jb2RlciAqZXh5bm9zX2VuY29kZXIgPQorCQl0b19leHlub3NfZW5jb2RlcihlbmNvZGVyKTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlleHlub3NfZW5jb2Rlci0+bWFuYWdlci0+cGlwZSA9IC0xOworCisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwllbmNvZGVyLT5kZXYtPm1vZGVfY29uZmlnLm51bV9lbmNvZGVyLS07CisJa2ZyZWUoZXh5bm9zX2VuY29kZXIpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGV4eW5vc19lbmNvZGVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gZXh5bm9zX2RybV9lbmNvZGVyX2Rlc3Ryb3ksCit9OworCitzdHJ1Y3QgZHJtX2VuY29kZXIgKgorZXh5bm9zX2RybV9lbmNvZGVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciwKKwkJCSAgIHVuc2lnbmVkIGludCBwb3NzaWJsZV9jcnRjcykKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGV4eW5vc19kcm1fZW5jb2RlciAqZXh5bm9zX2VuY29kZXI7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFtYW5hZ2VyIHx8ICFwb3NzaWJsZV9jcnRjcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW1hbmFnZXItPmRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlleHlub3NfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpleHlub3NfZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghZXh5bm9zX2VuY29kZXIpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZW5jb2RlclxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWV4eW5vc19lbmNvZGVyLT5tYW5hZ2VyID0gbWFuYWdlcjsKKwllbmNvZGVyID0gJmV4eW5vc19lbmNvZGVyLT5kcm1fZW5jb2RlcjsKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IHBvc3NpYmxlX2NydGNzOworCisJRFJNX0RFQlVHX0tNUygicG9zc2libGVfY3J0Y3MgPSAweCV4XG4iLCBlbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyk7CisKKwlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJmV4eW5vc19lbmNvZGVyX2Z1bmNzLAorCQkJRFJNX01PREVfRU5DT0RFUl9UTURTKTsKKworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmV4eW5vc19lbmNvZGVyX2hlbHBlcl9mdW5jcyk7CisKKwlEUk1fREVCVUdfS01TKCJlbmNvZGVyIGhhcyBiZWVuIGNyZWF0ZWRcbiIpOworCisJcmV0dXJuIGVuY29kZXI7Cit9CisKK3N0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKmV4eW5vc19kcm1fZ2V0X21hbmFnZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXJldHVybiB0b19leHlub3NfZW5jb2RlcihlbmNvZGVyKS0+bWFuYWdlcjsKK30KKwordm9pZCBleHlub3NfZHJtX2ZuX2VuY29kZXIoc3RydWN0IGRybV9jcnRjICpjcnRjLCB2b2lkICpkYXRhLAorCQkJICAgIHZvaWQgKCpmbikoc3RydWN0IGRybV9lbmNvZGVyICosIHZvaWQgKikpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlpZiAoZW5jb2Rlci0+Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJZm4oZW5jb2RlciwgZGF0YSk7CisJfQorfQorCit2b2lkIGV4eW5vc19kcm1fZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWFuYWdlciA9CisJCXRvX2V4eW5vc19lbmNvZGVyKGVuY29kZXIpLT5tYW5hZ2VyOworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXJfb3BzICptYW5hZ2VyX29wcyA9IG1hbmFnZXItPm9wczsKKwlpbnQgY3J0YyA9ICooaW50ICopZGF0YTsKKworCWlmIChtYW5hZ2VyLT5waXBlID09IC0xKQorCQltYW5hZ2VyLT5waXBlID0gY3J0YzsKKworCWlmIChtYW5hZ2VyX29wcy0+ZW5hYmxlX3ZibGFuaykKKwkJbWFuYWdlcl9vcHMtPmVuYWJsZV92YmxhbmsobWFuYWdlci0+ZGV2KTsKK30KKwordm9pZCBleHlub3NfZHJtX2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJdG9fZXh5bm9zX2VuY29kZXIoZW5jb2RlciktPm1hbmFnZXI7CisJc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlcl9vcHMgKm1hbmFnZXJfb3BzID0gbWFuYWdlci0+b3BzOworCWludCBjcnRjID0gKihpbnQgKilkYXRhOworCisJaWYgKG1hbmFnZXItPnBpcGUgPT0gLTEpCisJCW1hbmFnZXItPnBpcGUgPSBjcnRjOworCisJaWYgKG1hbmFnZXJfb3BzLT5kaXNhYmxlX3ZibGFuaykKKwkJbWFuYWdlcl9vcHMtPmRpc2FibGVfdmJsYW5rKG1hbmFnZXItPmRldik7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX2NydGNfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0KKwkJdG9fZXh5bm9zX2VuY29kZXIoZW5jb2RlciktPm1hbmFnZXI7CisJc3RydWN0IGV4eW5vc19kcm1fb3ZlcmxheV9vcHMgKm92ZXJsYXlfb3BzID0gbWFuYWdlci0+b3ZlcmxheV9vcHM7CisKKwlvdmVybGF5X29wcy0+Y29tbWl0KG1hbmFnZXItPmRldik7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKm1hbmFnZXIgPQorCQl0b19leHlub3NfZW5jb2RlcihlbmNvZGVyKS0+bWFuYWdlcjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5X29wcyAqb3ZlcmxheV9vcHMgPSBtYW5hZ2VyLT5vdmVybGF5X29wczsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5ID0gZGF0YTsKKworCW92ZXJsYXlfb3BzLT5tb2RlX3NldChtYW5hZ2VyLT5kZXYsIG92ZXJsYXkpOworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBEUk0gRW5jb2RlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9lbmNvZGVyLmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlY2Q2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZW5jb2Rlci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fRU5DT0RFUl9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9FTkNPREVSX0hfCisKK3N0cnVjdCBleHlub3NfZHJtX21hbmFnZXI7CisKK3N0cnVjdCBkcm1fZW5jb2RlciAqZXh5bm9zX2RybV9lbmNvZGVyX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGV4eW5vc19kcm1fbWFuYWdlciAqbWdyLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHBvc3NpYmxlX2NydGNzKTsKK3N0cnVjdCBleHlub3NfZHJtX21hbmFnZXIgKgorZXh5bm9zX2RybV9nZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwordm9pZCBleHlub3NfZHJtX2ZuX2VuY29kZXIoc3RydWN0IGRybV9jcnRjICpjcnRjLCB2b2lkICpkYXRhLAorCQkJICAgIHZvaWQgKCpmbikoc3RydWN0IGRybV9lbmNvZGVyICosIHZvaWQgKikpOwordm9pZCBleHlub3NfZHJtX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKTsKK3ZvaWQgZXh5bm9zX2RybV9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHZvaWQgKmRhdGEpOwordm9pZCBleHlub3NfZHJtX2VuY29kZXJfY3J0Y19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKTsKK3ZvaWQgZXh5bm9zX2RybV9lbmNvZGVyX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB2b2lkICpkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDI5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuYwpAQCAtMCwwICsxLDI2NSBAQAorLyogZXh5bm9zX2RybV9mYi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2ZiLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9idWYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2dlbS5oIgorCisjZGVmaW5lIHRvX2V4eW5vc19mYih4KQljb250YWluZXJfb2YoeCwgc3RydWN0IGV4eW5vc19kcm1fZmIsIGZiKQorCisvKgorICogZXh5bm9zIHNwZWNpZmljIGZyYW1lYnVmZmVyIHN0cnVjdHVyZS4KKyAqCisgKiBAZmI6IGRybSBmcmFtZWJ1ZmZlciBvYmVqY3QuCisgKiBAZXh5bm9zX2dlbV9vYmo6IGV4eW5vcyBzcGVjaWZpYyBnZW0gb2JqZWN0IGNvbnRhaW5pbmcgYSBnZW0gb2JqZWN0LgorICogQGVudHJ5OiBwb2ludGVyIHRvIGV4eW5vcyBkcm0gYnVmZmVyIGVudHJ5IG9iamVjdC4KKyAqCS0gY29udGFpbmluZyBvbmx5IHRoZSBpbmZvcm1hdGlvbiB0byBwaHlzaWNhbGx5IGNvbnRpbnVvdXMgbWVtb3J5CisgKglyZWdpb24gYWxsb2NhdGVkIGF0IGRlZmF1bHQgZnJhbWVidWZmZXIgY3JlYXRpb24uCisgKi8KK3N0cnVjdCBleHlub3NfZHJtX2ZiIHsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyCQlmYjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqCSpleHlub3NfZ2VtX29iajsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkJKmVudHJ5OworfTsKKworc3RhdGljIHZvaWQgZXh5bm9zX2RybV9mYl9kZXN0cm95KHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQoreworCXN0cnVjdCBleHlub3NfZHJtX2ZiICpleHlub3NfZmIgPSB0b19leHlub3NfZmIoZmIpOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKKworCS8qCisJICogZGVmYXVsdCBmcmFtZWJ1ZmZlciBoYXMgbm8gZ2VtIG9iamVjdCBzbworCSAqIGEgYnVmZmVyIG9mIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBiZSByZWxlYXNlZCBhdCBoZXJlLgorCSAqLworCWlmICghZXh5bm9zX2ZiLT5leHlub3NfZ2VtX29iaiAmJiBleHlub3NfZmItPmVudHJ5KQorCQlleHlub3NfZHJtX2J1Zl9kZXN0cm95KGZiLT5kZXYsIGV4eW5vc19mYi0+ZW50cnkpOworCisJa2ZyZWUoZXh5bm9zX2ZiKTsKKwlleHlub3NfZmIgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fZmJfY3JlYXRlX2hhbmRsZShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJCXVuc2lnbmVkIGludCAqaGFuZGxlKQoreworCXN0cnVjdCBleHlub3NfZHJtX2ZiICpleHlub3NfZmIgPSB0b19leHlub3NfZmIoZmIpOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LAorCQkJJmV4eW5vc19mYi0+ZXh5bm9zX2dlbV9vYmotPmJhc2UsIGhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYl9kaXJ0eShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgdW5zaWduZWQgZmxhZ3MsCisJCQkJdW5zaWduZWQgY29sb3IsIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKKwkJCQl1bnNpZ25lZCBudW1fY2xpcHMpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIFRPRE8gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBleHlub3NfZHJtX2ZiX2Z1bmNzID0geworCS5kZXN0cm95CT0gZXh5bm9zX2RybV9mYl9kZXN0cm95LAorCS5jcmVhdGVfaGFuZGxlCT0gZXh5bm9zX2RybV9mYl9jcmVhdGVfaGFuZGxlLAorCS5kaXJ0eQkJPSBleHlub3NfZHJtX2ZiX2RpcnR5LAorfTsKKworc3RhdGljIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKgorZXh5bm9zX2RybV9mYl9pbml0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmIgKmV4eW5vc19mYjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZ2VtX29iaiA9IE5VTEw7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwltb2RlX2NtZC0+cGl0Y2ggPSBtYXgobW9kZV9jbWQtPnBpdGNoLAorCQkJbW9kZV9jbWQtPndpZHRoICogKG1vZGVfY21kLT5icHAgPj4gMykpOworCisJRFJNX0xPR19LTVMoImRybSBmYiBjcmVhdGUoJWR4JWQpXG4iLAorCQkJbW9kZV9jbWQtPndpZHRoLCBtb2RlX2NtZC0+aGVpZ2h0KTsKKworCWV4eW5vc19mYiA9IGt6YWxsb2Moc2l6ZW9mKCpleHlub3NfZmIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4eW5vc19mYikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBleHlub3MgZHJtIGZyYW1lYnVmZmVyLlxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWZiID0gJmV4eW5vc19mYi0+ZmI7CisJcmV0ID0gZHJtX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCBmYiwgJmV4eW5vc19kcm1fZmJfZnVuY3MpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmcmFtZWJ1ZmZlci5cbiIpOworCQlnb3RvIGVycl9pbml0OworCX0KKworCURSTV9MT0dfS01TKCJjcmVhdGU6IGZiIGlkOiAlZFxuIiwgZmItPmJhc2UuaWQpOworCisJc2l6ZSA9IG1vZGVfY21kLT5waXRjaCAqIG1vZGVfY21kLT5oZWlnaHQ7CisKKwkvKgorCSAqIG1vZGVfY21kLT5oYW5kbGUgY291bGQgYmUgTlVMTCBhdCBib290aW5nIHRpbWUgb3IKKwkgKiB3aXRoIHVzZXIgcmVxdWVzdC4gaWYgTlVMTCwgYSBuZXcgYnVmZmVyIG9yIGEgZ2VtIG9iamVjdAorCSAqIHdvdWxkIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwlpZiAoIW1vZGVfY21kLT5oYW5kbGUpIHsKKwkJaWYgKCFmaWxlX3ByaXYpIHsKKwkJCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisKKwkJCS8qCisJCQkgKiBpbiBjYXNlIHRoYXQgZmlsZV9wcml2IGlzIE5VTEwsIGl0IGFsbG9jYXRlcworCQkJICogb25seSBidWZmZXIgYW5kIHRoaXMgYnVmZmVyIHdvdWxkIGJlIHVzZWQKKwkJCSAqIGZvciBkZWZhdWx0IGZyYW1lYnVmZmVyLgorCQkJICovCisJCQllbnRyeSA9IGV4eW5vc19kcm1fYnVmX2NyZWF0ZShkZXYsIHNpemUpOworCQkJaWYgKElTX0VSUihlbnRyeSkpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKGVudHJ5KTsKKwkJCQlnb3RvIGVycl9idWZmZXI7CisJCQl9CisKKwkJCWV4eW5vc19mYi0+ZW50cnkgPSBlbnRyeTsKKworCQkJRFJNX0xPR19LTVMoImRlZmF1bHQgZmI6IHBhZGRyID0gMHglbHgsIHNpemUgPSAweCV4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyllbnRyeS0+cGFkZHIsIHNpemUpOworCisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCWV4eW5vc19nZW1fb2JqID0gZXh5bm9zX2RybV9nZW1fY3JlYXRlKGZpbGVfcHJpdiwgZGV2LAorCQkJCQkJCXNpemUsCisJCQkJCQkJJm1vZGVfY21kLT5oYW5kbGUpOworCQkJaWYgKElTX0VSUihleHlub3NfZ2VtX29iaikpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKGV4eW5vc19nZW1fb2JqKTsKKwkJCQlnb3RvIGVycl9idWZmZXI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIG1vZGVfY21kLT5oYW5kbGUpOworCQlpZiAoIW9iaikgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbG9va3VwIGdlbSBvYmplY3QuXG4iKTsKKwkJCWdvdG8gZXJyX2J1ZmZlcjsKKwkJfQorCisJCWV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmoob2JqKTsKKworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCX0KKworCS8qCisJICogaWYgZ290IGEgZXh5bm9zX2dlbV9vYmogZnJvbSBlaXRoZXIgYSBoYW5kbGUgb3IKKwkgKiBhIG5ldyBjcmVhdGlvbiB0aGVuIGV4eW5vc19mYi0+ZXh5bm9zX2dlbV9vYmogaXMgTlVMTAorCSAqIHNvIHRoYXQgZGVmYXVsdCBmcmFtZWJ1ZmZlciBoYXMgbm8gaXRzIG93biBnZW0gb2JqZWN0LAorCSAqIG9ubHkgaXRzIG93biBidWZmZXIgb2JqZWN0LgorCSAqLworCWV4eW5vc19mYi0+ZW50cnkgPSBleHlub3NfZ2VtX29iai0+ZW50cnk7CisKKwlEUk1fTE9HX0tNUygicGFkZHIgPSAweCVseCwgc2l6ZSA9IDB4JXgsIGdlbSBvYmplY3QgPSAweCV4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpZXh5bm9zX2ZiLT5lbnRyeS0+cGFkZHIsIHNpemUsCisJCQkodW5zaWduZWQgaW50KSZleHlub3NfZ2VtX29iai0+YmFzZSk7CisKK291dDoKKwlleHlub3NfZmItPmV4eW5vc19nZW1fb2JqID0gZXh5bm9zX2dlbV9vYmo7CisKKwlkcm1faGVscGVyX21vZGVfZmlsbF9mYl9zdHJ1Y3QoZmIsIG1vZGVfY21kKTsKKworCXJldHVybiBmYjsKKworZXJyX2J1ZmZlcjoKKwlkcm1fZnJhbWVidWZmZXJfY2xlYW51cChmYik7CisKK2Vycl9pbml0OgorCWtmcmVlKGV4eW5vc19mYik7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpleHlub3NfZHJtX2ZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHVybiBleHlub3NfZHJtX2ZiX2luaXQoZmlsZV9wcml2LCBkZXYsIG1vZGVfY21kKTsKK30KKworc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICpleHlub3NfZHJtX2ZiX2dldF9idWYoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZmIgKmV4eW5vc19mYiA9IHRvX2V4eW5vc19mYihmYik7CisJc3RydWN0IGV4eW5vc19kcm1fYnVmX2VudHJ5ICplbnRyeTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwllbnRyeSA9IGV4eW5vc19mYi0+ZW50cnk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlEUk1fREVCVUdfS01TKCJ2YWRkciA9IDB4JWx4LCBwYWRkciA9IDB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpZW50cnktPnZhZGRyLAorCQkJKHVuc2lnbmVkIGxvbmcpZW50cnktPnBhZGRyKTsKKworCXJldHVybiBlbnRyeTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgZXh5bm9zX2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKKwkuZmJfY3JlYXRlID0gZXh5bm9zX2RybV9mYl9jcmVhdGUsCit9OworCit2b2lkIGV4eW5vc19kcm1fbW9kZV9jb25maWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOworCisJLyoKKwkgKiBzZXQgbWF4IHdpZHRoIGFuZCBoZWlnaHQgYXMgZGVmYXVsdCB2YWx1ZSg0MDk2eDQwOTYpLgorCSAqIHRoaXMgdmFsdWUgd291bGQgYmUgdXNlZCB0byBjaGVjayBmcmFtZWJ1ZmZlciBzaXplIGxpbWl0YXRpb24KKwkgKiBhdCBkcm1fbW9kZV9hZGRmYigpLgorCSAqLworCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gNDA5NjsKKwlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA0MDk2OworCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcyA9ICZleHlub3NfZHJtX21vZGVfY29uZmlnX2Z1bmNzOworfQorCitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBEUk0gRkIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuaCBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzU5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3JzOgorICoJSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgorICoJSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPgorICoJU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9FWFlOT1NfRFJNX0ZCX0hfCisjZGVmaW5lIF9FWFlOT1NfRFJNX0ZCX0gKKworc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZXh5bm9zX2RybV9mYl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxwLAorCQkJCQkgICAgICBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kICptb2RlX2NtZCk7CisKK3ZvaWQgZXh5bm9zX2RybV9tb2RlX2NvbmZpZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYmRldi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0YjNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYmRldi5jCkBAIC0wLDAgKzEsNDU2IEBACisvKiBleHlub3NfZHJtX2ZiZGV2LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGMuaCIKKyNpbmNsdWRlICJkcm1fZmJfaGVscGVyLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZmIuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2J1Zi5oIgorCisjZGVmaW5lIE1BWF9DT05ORUNUT1IJCTQKKyNkZWZpbmUgUFJFRkVSUkVEX0JQUAkJMzIKKworI2RlZmluZSB0b19leHlub3NfZmJkZXYoeCkJY29udGFpbmVyX29mKHgsIHN0cnVjdCBleHlub3NfZHJtX2ZiZGV2LFwKKwkJCQlkcm1fZmJfaGVscGVyKQorCitzdHJ1Y3QgZXh5bm9zX2RybV9mYmRldiB7CisJc3RydWN0IGRybV9mYl9oZWxwZXIJZHJtX2ZiX2hlbHBlcjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyCSpmYjsKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYmRldl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMzI6CisJY2FzZSAyNDoKKwljYXNlIDE4OgorCWNhc2UgMTY6CisJY2FzZSAxMjoKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9NT05PMDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCWJyZWFrOworCX0KKworCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICh2YXItPnhyZXNfdmlydHVhbCAqIHZhci0+Yml0c19wZXJfcGl4ZWwpIC8gODsKKworCXJldHVybiBkcm1fZmJfaGVscGVyX3NldF9wYXIoaW5mbyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmYl9vcHMgZXh5bm9zX2RybV9mYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCisJLmZiX2NoZWNrX3Zhcgk9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyCT0gZXh5bm9zX2RybV9mYmRldl9zZXRfcGFyLAorCS5mYl9ibGFuawk9IGRybV9mYl9oZWxwZXJfYmxhbmssCisJLmZiX3Bhbl9kaXNwbGF5CT0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKKwkuZmJfc2V0Y21hcAk9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYmRldl91cGRhdGUoc3RydWN0IGRybV9mYl9oZWxwZXIgKmhlbHBlciwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGZiX3dpZHRoLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGZiX2hlaWdodCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gaGVscGVyLT5mYmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGVscGVyLT5kZXY7CisJc3RydWN0IGV4eW5vc19kcm1fZmJkZXYgKmV4eW5vc19mYiA9IHRvX2V4eW5vc19mYmRldihoZWxwZXIpOworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgaW50IHNpemUgPSBmYl93aWR0aCAqIGZiX2hlaWdodCAqIChmYi0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJZXh5bm9zX2ZiLT5mYiA9IGZiOworCisJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChmYmksIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKKwlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGZiaSwgaGVscGVyLCBmYl93aWR0aCwgZmJfaGVpZ2h0KTsKKworCWVudHJ5ID0gZXh5bm9zX2RybV9mYl9nZXRfYnVmKGZiKTsKKwlpZiAoIWVudHJ5KSB7CisJCURSTV9MT0dfS01TKCJlbnRyeSBpcyBudWxsLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW9mZnNldCA9IGZiaS0+dmFyLnhvZmZzZXQgKiAoZmItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCW9mZnNldCArPSBmYmktPnZhci55b2Zmc2V0ICogZmItPnBpdGNoOworCisJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZW50cnktPnBhZGRyOworCWZiaS0+c2NyZWVuX2Jhc2UgPSBlbnRyeS0+dmFkZHIgKyBvZmZzZXQ7CisJZmJpLT5maXguc21lbV9zdGFydCA9IGVudHJ5LT5wYWRkciArIG9mZnNldDsKKwlmYmktPnNjcmVlbl9zaXplID0gc2l6ZTsKKwlmYmktPmZpeC5zbWVtX2xlbiA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHlub3NfZHJtX2ZiZGV2X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQoreworCXN0cnVjdCBleHlub3NfZHJtX2ZiZGV2ICpleHlub3NfZmJkZXYgPSB0b19leHlub3NfZmJkZXYoaGVscGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaGVscGVyLT5kZXY7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kIG1vZGVfY21kID0geyAwIH07CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRldi0+cGxhdGZvcm1kZXY7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlEUk1fREVCVUdfS01TKCJzdXJmYWNlIHdpZHRoKCVkKSwgaGVpZ2h0KCVkKSBhbmQgYnBwKCVkXG4iLAorCQkJc2l6ZXMtPnN1cmZhY2Vfd2lkdGgsIHNpemVzLT5zdXJmYWNlX2hlaWdodCwKKwkJCXNpemVzLT5zdXJmYWNlX2JwcCk7CisKKwltb2RlX2NtZC53aWR0aCA9IHNpemVzLT5zdXJmYWNlX3dpZHRoOworCW1vZGVfY21kLmhlaWdodCA9IHNpemVzLT5zdXJmYWNlX2hlaWdodDsKKwltb2RlX2NtZC5icHAgPSBzaXplcy0+c3VyZmFjZV9icHA7CisJbW9kZV9jbWQuZGVwdGggPSBzaXplcy0+c3VyZmFjZV9kZXB0aDsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWZiaSA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZwZGV2LT5kZXYpOworCWlmICghZmJpKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGZiIGluZm8uXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZXh5bm9zX2ZiZGV2LT5mYiA9IGV4eW5vc19kcm1fZmJfY3JlYXRlKGRldiwgTlVMTCwgJm1vZGVfY21kKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZXh5bm9zX2ZiZGV2LT5mYikpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGRybSBmcmFtZWJ1ZmZlci5cbiIpOworCQlyZXQgPSBQVFJfRVJSKGV4eW5vc19mYmRldi0+ZmIpOworCQlnb3RvIG91dDsKKwl9CisKKwloZWxwZXItPmZiID0gZXh5bm9zX2ZiZGV2LT5mYjsKKwloZWxwZXItPmZiZGV2ID0gZmJpOworCisJZmJpLT5wYXIgPSBoZWxwZXI7CisJZmJpLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisJZmJpLT5mYm9wcyA9ICZleHlub3NfZHJtX2ZiX29wczsKKworCXJldCA9IGZiX2FsbG9jX2NtYXAoJmZiaS0+Y21hcCwgMjU2LCAwKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGNtYXAuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZXh5bm9zX2RybV9mYmRldl91cGRhdGUoaGVscGVyLCBoZWxwZXItPmZiLCBzaXplcy0+ZmJfd2lkdGgsCisJCQlzaXplcy0+ZmJfaGVpZ2h0KTsKKwlpZiAocmV0IDwgMCkKKwkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworCisvKgorICogaWYgZmFpbGVkLCBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBhYm92ZSB3b3VsZCBiZSByZWxlYXNlZCBieQorICogZHJtX21vZGVfY29uZmlnX2NsZWFudXAoKSB3aGVuIGRybV9sb2FkKCkgaGFkIGJlZW4gY2FsbGVkIHByaW9yCisgKiB0byBhbnkgc3BlY2lmaWMgZHJpdmVyIHN1Y2ggYXMgZmltZCBvciBoZG1pIGRyaXZlci4KKyAqLworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sCitleHlub3NfZHJtX2ZiZGV2X2lzX3NhbWVmYihzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCSAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQoreworCWlmIChmYi0+d2lkdGggIT0gc2l6ZXMtPnN1cmZhY2Vfd2lkdGgpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmItPmhlaWdodCAhPSBzaXplcy0+c3VyZmFjZV9oZWlnaHQpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZmItPmJpdHNfcGVyX3BpeGVsICE9IHNpemVzLT5zdXJmYWNlX2JwcCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChmYi0+ZGVwdGggIT0gc2l6ZXMtPnN1cmZhY2VfZGVwdGgpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGV4eW5vc19kcm1fZmJkZXZfcmVjcmVhdGUoc3RydWN0IGRybV9mYl9oZWxwZXIgKmhlbHBlciwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBoZWxwZXItPmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9mYmRldiAqZXh5bm9zX2ZiZGV2ID0gdG9fZXh5bm9zX2ZiZGV2KGhlbHBlcik7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBleHlub3NfZmJkZXYtPmZiOworCXN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgbW9kZV9jbWQgPSB7IDAgfTsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoaGVscGVyLT5mYiAhPSBmYikgeworCQlEUk1fRVJST1IoImRybSBmcmFtZWJ1ZmZlciBpcyBkaWZmZXJlbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh5bm9zX2RybV9mYmRldl9pc19zYW1lZmIoZmIsIHNpemVzKSkKKwkJcmV0dXJuIDA7CisKKwltb2RlX2NtZC53aWR0aCA9IHNpemVzLT5zdXJmYWNlX3dpZHRoOworCW1vZGVfY21kLmhlaWdodCA9IHNpemVzLT5zdXJmYWNlX2hlaWdodDsKKwltb2RlX2NtZC5icHAgPSBzaXplcy0+c3VyZmFjZV9icHA7CisJbW9kZV9jbWQuZGVwdGggPSBzaXplcy0+c3VyZmFjZV9kZXB0aDsKKworCWlmIChmYi0+ZnVuY3MtPmRlc3Ryb3kpCisJCWZiLT5mdW5jcy0+ZGVzdHJveShmYik7CisKKwlleHlub3NfZmJkZXYtPmZiID0gZXh5bm9zX2RybV9mYl9jcmVhdGUoZGV2LCBOVUxMLCAmbW9kZV9jbWQpOworCWlmIChJU19FUlIoZXh5bm9zX2ZiZGV2LT5mYikpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgZmIuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZXh5bm9zX2ZiZGV2LT5mYik7CisJfQorCisJaGVscGVyLT5mYiA9IGV4eW5vc19mYmRldi0+ZmI7CisJcmV0dXJuIGV4eW5vc19kcm1fZmJkZXZfdXBkYXRlKGhlbHBlciwgaGVscGVyLT5mYiwgc2l6ZXMtPmZiX3dpZHRoLAorCQkJc2l6ZXMtPmZiX2hlaWdodCk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9mYmRldl9wcm9iZShzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyLAorCQkJCSAgIHN0cnVjdCBkcm1fZmJfaGVscGVyX3N1cmZhY2Vfc2l6ZSAqc2l6ZXMpCit7CisJaW50IHJldCA9IDA7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFoZWxwZXItPmZiKSB7CisJCXJldCA9IGV4eW5vc19kcm1fZmJkZXZfY3JlYXRlKGhlbHBlciwgc2l6ZXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGZiZGV2LlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogZmJfaGVscGVyIGV4cGVjdHMgYSB2YWx1ZSBtb3JlIHRoYW4gMSBpZiBzdWNjZWVkCisJCSAqIGJlY2F1c2UgcmVnaXN0ZXJfZnJhbWVidWZmZXIoKSBzaG91bGQgYmUgY2FsbGVkLgorCQkgKi8KKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlyZXQgPSBleHlub3NfZHJtX2ZiZGV2X3JlY3JlYXRlKGhlbHBlciwgc2l6ZXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVjb25maWd1cmUgZmJkZXZcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9mdW5jcyBleHlub3NfZHJtX2ZiX2hlbHBlcl9mdW5jcyA9IHsKKwkuZmJfcHJvYmUgPQlleHlub3NfZHJtX2ZiZGV2X3Byb2JlLAorfTsKKworaW50IGV4eW5vc19kcm1fZmJkZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBleHlub3NfZHJtX2ZiZGV2ICpmYmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqaGVscGVyOworCXVuc2lnbmVkIGludCBudW1fY3J0YzsKKwlpbnQgcmV0OworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICghZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YyB8fCAhZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yKQorCQlyZXR1cm4gMDsKKworCWZiZGV2ID0ga3phbGxvYyhzaXplb2YoKmZiZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmYmRldikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBkcm0gZmJkZXYuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdmF0ZS0+ZmJfaGVscGVyID0gaGVscGVyID0gJmZiZGV2LT5kcm1fZmJfaGVscGVyOworCWhlbHBlci0+ZnVuY3MgPSAmZXh5bm9zX2RybV9mYl9oZWxwZXJfZnVuY3M7CisKKwludW1fY3J0YyA9IGRldi0+bW9kZV9jb25maWcubnVtX2NydGM7CisKKwlyZXQgPSBkcm1fZmJfaGVscGVyX2luaXQoZGV2LCBoZWxwZXIsIG51bV9jcnRjLCBNQVhfQ09OTkVDVE9SKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0aWFsaXplIGRybSBmYiBoZWxwZXIuXG4iKTsKKwkJZ290byBlcnJfaW5pdDsKKwl9CisKKwlyZXQgPSBkcm1fZmJfaGVscGVyX3NpbmdsZV9hZGRfYWxsX2Nvbm5lY3RvcnMoaGVscGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byByZWdpc3RlciBkcm1fZmJfaGVscGVyX2Nvbm5lY3Rvci5cbiIpOworCQlnb3RvIGVycl9zZXR1cDsKKworCX0KKworCXJldCA9IGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoaGVscGVyLCBQUkVGRVJSRURfQlBQKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQgdXAgaHcgY29uZmlndXJhdGlvbi5cbiIpOworCQlnb3RvIGVycl9zZXR1cDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3NldHVwOgorCWRybV9mYl9oZWxwZXJfZmluaShoZWxwZXIpOworCitlcnJfaW5pdDoKKwlwcml2YXRlLT5mYl9oZWxwZXIgPSBOVUxMOworCWtmcmVlKGZiZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGV4eW5vc19kcm1fZmJkZXZfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCit7CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CisKKwkvKiByZWxlYXNlIGRybSBmcmFtZWJ1ZmZlciBhbmQgcmVhbCBidWZmZXIgKi8KKwlpZiAoZmJfaGVscGVyLT5mYiAmJiBmYl9oZWxwZXItPmZiLT5mdW5jcykgeworCQlmYiA9IGZiX2hlbHBlci0+ZmI7CisJCWlmIChmYiAmJiBmYi0+ZnVuY3MtPmRlc3Ryb3kpCisJCQlmYi0+ZnVuY3MtPmRlc3Ryb3koZmIpOworCX0KKworCS8qIHJlbGVhc2UgbGludXggZnJhbWVidWZmZXIgKi8KKwlpZiAoZmJfaGVscGVyLT5mYmRldikgeworCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwkJaW50IHJldDsKKworCQlpbmZvID0gZmJfaGVscGVyLT5mYmRldjsKKwkJcmV0ID0gdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigpXG4iKTsKKworCQlpZiAoaW5mby0+Y21hcC5sZW4pCisJCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJfQorCisJZHJtX2ZiX2hlbHBlcl9maW5pKGZiX2hlbHBlcik7Cit9CisKK3ZvaWQgZXh5bm9zX2RybV9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGV4eW5vc19kcm1fZmJkZXYgKmZiZGV2OworCisJaWYgKCFwcml2YXRlIHx8ICFwcml2YXRlLT5mYl9oZWxwZXIpCisJCXJldHVybjsKKworCWZiZGV2ID0gdG9fZXh5bm9zX2ZiZGV2KHByaXZhdGUtPmZiX2hlbHBlcik7CisKKwlleHlub3NfZHJtX2ZiZGV2X2Rlc3Ryb3koZGV2LCBwcml2YXRlLT5mYl9oZWxwZXIpOworCWtmcmVlKGZiZGV2KTsKKwlwcml2YXRlLT5mYl9oZWxwZXIgPSBOVUxMOworfQorCit2b2lkIGV4eW5vc19kcm1fZmJkZXZfcmVzdG9yZV9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIXByaXZhdGUgfHwgIXByaXZhdGUtPmZiX2hlbHBlcikKKwkJcmV0dXJuOworCisJZHJtX2ZiX2hlbHBlcl9yZXN0b3JlX2ZiZGV2X21vZGUocHJpdmF0ZS0+ZmJfaGVscGVyKTsKK30KKworaW50IGV4eW5vc19kcm1fZmJkZXZfcmVpbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcjsKKwlpbnQgcmV0OworCisJaWYgKCFwcml2YXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogaWYgYWxsIHN1YiBkcml2ZXJzIHdlcmUgdW5sb2FkZWQgdGhlbiBudW1fY29ubmVjdG9yIGlzIDAKKwkgKiBzbyBhdCB0aGlzIHRpbWUsIHRoZSBmcmFtZWJ1ZmZlcnMgYWxzbyBzaG91bGQgYmUgZGVzdHJveWVkLgorCSAqLworCWlmICghZGV2LT5tb2RlX2NvbmZpZy5udW1fY29ubmVjdG9yKSB7CisJCWV4eW5vc19kcm1fZmJkZXZfZmluaShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmYl9oZWxwZXIgPSBwcml2YXRlLT5mYl9oZWxwZXI7CisKKwlpZiAoZmJfaGVscGVyKSB7CisJCWRybV9mYl9oZWxwZXJfZmluaShmYl9oZWxwZXIpOworCisJCXJldCA9IGRybV9mYl9oZWxwZXJfaW5pdChkZXYsIGZiX2hlbHBlciwKKwkJCQlkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjLCBNQVhfQ09OTkVDVE9SKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRpYWxpemUgZHJtIGZiIGhlbHBlclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gZHJtX2ZiX2hlbHBlcl9zaW5nbGVfYWRkX2FsbF9jb25uZWN0b3JzKGZiX2hlbHBlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBhZGQgZmIgaGVscGVyIHRvIGNvbm5lY3RvcnNcbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlyZXQgPSBkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnKGZiX2hlbHBlciwgUFJFRkVSUkVEX0JQUCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQgdXAgaHcgY29uZmlndXJhdGlvbi5cbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBpZiBkcm1fbG9hZCgpIGZhaWxlZCB3aGVtIGRybSBsb2FkKCkgd2FzIGNhbGxlZCBwcmlvcgorCQkgKiB0byBzcGVjaWZpYyBkcml2ZXJzLCBmYl9oZWxwZXIgbXVzdCBiZSBOVUxMIGFuZCBzbworCQkgKiB0aGlzIGZ1Y3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiB0byByZS1pbml0aWFsaXplIGFuZAorCQkgKiByZS1jb25maWd1cmUgdGhlIGZiIGhlbHBlci4gaXQgbWVhbnMgdGhhdCB0aGlzIGZ1bmN0aW9uCisJCSAqIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUgc3BlY2lmaWMgZHJpdmVycy4KKwkJICovCisJCXJldCA9IGV4eW5vc19kcm1fZmJkZXZfaW5pdChkZXYpOworCX0KKworCXJldHVybiByZXQ7CisKK2VycjoKKwkvKgorCSAqIGlmIGRybV9sb2FkKCkgZmFpbGVkIHdoZW4gZHJtIGxvYWQoKSB3YXMgY2FsbGVkIHByaW9yCisJICogdG8gc3BlY2lmaWMgZHJpdmVycywgdGhlIGZiX2hlbHBlciBtdXN0IGJlIE5VTEwgYW5kIHNvIGNoZWNrIGl0LgorCSAqLworCWlmIChmYl9oZWxwZXIpCisJCWRybV9mYl9oZWxwZXJfZmluaShmYl9oZWxwZXIpOworCisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2V1bmctV29vIEtpbSA8c3cwMzEyLmtpbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTb0MgRFJNIEZCREVWIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmggYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmJkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZjZThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiZGV2LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fRkJERVZfSF8KKyNkZWZpbmUgX0VYWU5PU19EUk1fRkJERVZfSF8KKworaW50IGV4eW5vc19kcm1fZmJkZXZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBleHlub3NfZHJtX2ZiZGV2X3JlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgZXh5bm9zX2RybV9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBleHlub3NfZHJtX2ZiZGV2X3Jlc3RvcmVfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU5Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYwpAQCAtMCwwICsxLDgxMSBAQAorLyogZXh5bm9zX2RybV9maW1kLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcnM6CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGRybS9leHlub3NfZHJtLmg+CisjaW5jbHVkZSA8cGxhdC9yZWdzLWZiLXY0Lmg+CisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZmJkZXYuaCIKKyNpbmNsdWRlICJleHlub3NfZHJtX2NydGMuaCIKKworLyoKKyAqIEZJTUQgaXMgc3RhbmQgZm9yIEZ1bGx5IEludGVyYWN0aXZlIE1vYmlsZSBEaXNwbGF5IGFuZAorICogYXMgYSBkaXNwbGF5IGNvbnRyb2xsZXIsIGl0IHRyYW5zZmVycyBjb250ZW50cyBkcmF3biBvbiBtZW1vcnkKKyAqIHRvIGEgTENEIFBhbmVsIHRocm91Z2ggRGlzcGxheSBJbnRlcmZhY2VzIHN1Y2ggYXMgUkdCIG9yCisgKiBDUFUgSW50ZXJmYWNlLgorICovCisKKy8qIHBvc2l0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGhhcmR3YXJlIHdpbmRvdyAwLCAyIH4gNC4qLworI2RlZmluZSBWSURPU0RfQSh3aW4pCQkoVklET1NEX0JBU0UgKyAweDAwICsgKHdpbikgKiAxNikKKyNkZWZpbmUgVklET1NEX0Iod2luKQkJKFZJRE9TRF9CQVNFICsgMHgwNCArICh3aW4pICogMTYpCisvKiBzaXplIGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGhhcmR3YXJlIHdpbmRvdyAwLiAqLworI2RlZmluZSBWSURPU0RfQ19TSVpFX1cwCShWSURPU0RfQkFTRSArIDB4MDgpCisvKiBhbHBoYSBjb250cm9sIHJlZ2lzdGVyIGZvciBoYXJkd2FyZSB3aW5kb3cgMSB+IDQuICovCisjZGVmaW5lIFZJRE9TRF9DKHdpbikJCShWSURPU0RfQkFTRSArIDB4MTggKyAod2luKSAqIDE2KQorLyogc2l6ZSBjb250cm9sIHJlZ2lzdGVyIGZvciBoYXJkd2FyZSB3aW5kb3cgMSB+IDQuICovCisjZGVmaW5lIFZJRE9TRF9EKHdpbikJCShWSURPU0RfQkFTRSArIDB4MEMgKyAod2luKSAqIDE2KQorCisjZGVmaW5lIFZJRFd4X0JVRl9TVEFSVCh3aW4sIGJ1ZikJKFZJRFdfQlVGX1NUQVJUKGJ1ZikgKyAod2luKSAqIDgpCisjZGVmaW5lIFZJRFd4X0JVRl9FTkQod2luLCBidWYpCQkoVklEV19CVUZfRU5EKGJ1ZikgKyAod2luKSAqIDgpCisjZGVmaW5lIFZJRFd4X0JVRl9TSVpFKHdpbiwgYnVmKQkoVklEV19CVUZfU0laRShidWYpICsgKHdpbikgKiA0KQorCisvKiBjb2xvciBrZXkgY29udHJvbCByZWdpc3RlciBmb3IgaGFyZHdhcmUgd2luZG93IDEgfiA0LiAqLworI2RlZmluZSBXS0VZQ09OMF9CQVNFKHgpCQkoKFdLRVlDT04wICsgMHgxNDApICsgKHggKiA4KSkKKy8qIGNvbG9yIGtleSB2YWx1ZSByZWdpc3RlciBmb3IgaGFyZHdhcmUgd2luZG93IDEgfiA0LiAqLworI2RlZmluZSBXS0VZQ09OMV9CQVNFKHgpCQkoKFdLRVlDT04xICsgMHgxNDApICsgKHggKiA4KSkKKworLyogRklNRCBoYXMgdG90YWxseSBmaXZlIGhhcmR3YXJlIHdpbmRvd3MuICovCisjZGVmaW5lIFdJTkRPV1NfTlIJNQorCisjZGVmaW5lIGdldF9maW1kX2NvbnRleHQoZGV2KQlwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSkKKworc3RydWN0IGZpbWRfd2luX2RhdGEgeworCXVuc2lnbmVkIGludAkJb2Zmc2V0X3g7CisJdW5zaWduZWQgaW50CQlvZmZzZXRfeTsKKwl1bnNpZ25lZCBpbnQJCW92bF93aWR0aDsKKwl1bnNpZ25lZCBpbnQJCW92bF9oZWlnaHQ7CisJdW5zaWduZWQgaW50CQlmYl93aWR0aDsKKwl1bnNpZ25lZCBpbnQJCWZiX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQJCWJwcDsKKwlkbWFfYWRkcl90CQlwYWRkcjsKKwl2b2lkIF9faW9tZW0JCSp2YWRkcjsKKwl1bnNpZ25lZCBpbnQJCWJ1Zl9vZmZzaXplOworCXVuc2lnbmVkIGludAkJbGluZV9zaXplOwkvKiBieXRlcyAqLworfTsKKworc3RydWN0IGZpbWRfY29udGV4dCB7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2CXN1YmRydjsKKwlpbnQJCQkJaXJxOworCXN0cnVjdCBkcm1fY3J0YwkJCSpjcnRjOworCXN0cnVjdCBjbGsJCQkqYnVzX2NsazsKKwlzdHJ1Y3QgY2xrCQkJKmxjZF9jbGs7CisJc3RydWN0IHJlc291cmNlCQkJKnJlZ3NfcmVzOworCXZvaWQgX19pb21lbQkJCSpyZWdzOworCXN0cnVjdCBmaW1kX3dpbl9kYXRhCQl3aW5fZGF0YVtXSU5ET1dTX05SXTsKKwl1bnNpZ25lZCBpbnQJCQljbGtkaXY7CisJdW5zaWduZWQgaW50CQkJZGVmYXVsdF93aW47CisJdW5zaWduZWQgbG9uZwkJCWlycV9mbGFnczsKKwl1MzIJCQkJdmlkY29uMDsKKwl1MzIJCQkJdmlkY29uMTsKKworCXN0cnVjdCBmYl92aWRlb21vZGUJCSp0aW1pbmc7Cit9OworCitzdGF0aWMgYm9vbCBmaW1kX2Rpc3BsYXlfaXNfY29ubmVjdGVkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyogVE9ETy4gKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCAqZmltZF9nZXRfdGltaW5nKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcmV0dXJuIGN0eC0+dGltaW5nOworfQorCitzdGF0aWMgaW50IGZpbWRfY2hlY2tfdGltaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdGltaW5nKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBUT0RPLiAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmltZF9kaXNwbGF5X3Bvd2VyX29uKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1vZGUpCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCS8qIFRPRE8uICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgZmltZF9kaXNwbGF5ID0geworCS50eXBlID0gRVhZTk9TX0RJU1BMQVlfVFlQRV9MQ0QsCisJLmlzX2Nvbm5lY3RlZCA9IGZpbWRfZGlzcGxheV9pc19jb25uZWN0ZWQsCisJLmdldF90aW1pbmcgPSBmaW1kX2dldF90aW1pbmcsCisJLmNoZWNrX3RpbWluZyA9IGZpbWRfY2hlY2tfdGltaW5nLAorCS5wb3dlcl9vbiA9IGZpbWRfZGlzcGxheV9wb3dlcl9vbiwKK307CisKK3N0YXRpYyB2b2lkIGZpbWRfY29tbWl0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nID0gY3R4LT50aW1pbmc7CisJdTMyIHZhbDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBzZXR1cCBwb2xhcml0eSB2YWx1ZXMgZnJvbSBtYWNoaW5lIGNvZGUuICovCisJd3JpdGVsKGN0eC0+dmlkY29uMSwgY3R4LT5yZWdzICsgVklEQ09OMSk7CisKKwkvKiBzZXR1cCB2ZXJ0aWNhbCB0aW1pbmcgdmFsdWVzLiAqLworCXZhbCA9IFZJRFRDT04wX1ZCUEQodGltaW5nLT51cHBlcl9tYXJnaW4gLSAxKSB8CisJICAgICAgIFZJRFRDT04wX1ZGUEQodGltaW5nLT5sb3dlcl9tYXJnaW4gLSAxKSB8CisJICAgICAgIFZJRFRDT04wX1ZTUFcodGltaW5nLT52c3luY19sZW4gLSAxKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURUQ09OMCk7CisKKwkvKiBzZXR1cCBob3Jpem9udGFsIHRpbWluZyB2YWx1ZXMuICAqLworCXZhbCA9IFZJRFRDT04xX0hCUEQodGltaW5nLT5sZWZ0X21hcmdpbiAtIDEpIHwKKwkgICAgICAgVklEVENPTjFfSEZQRCh0aW1pbmctPnJpZ2h0X21hcmdpbiAtIDEpIHwKKwkgICAgICAgVklEVENPTjFfSFNQVyh0aW1pbmctPmhzeW5jX2xlbiAtIDEpOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFRDT04xKTsKKworCS8qIHNldHVwIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpc3BsYXkgc2l6ZS4gKi8KKwl2YWwgPSBWSURUQ09OMl9MSU5FVkFMKHRpbWluZy0+eXJlcyAtIDEpIHwKKwkgICAgICAgVklEVENPTjJfSE9aVkFMKHRpbWluZy0+eHJlcyAtIDEpOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFRDT04yKTsKKworCS8qIHNldHVwIGNsb2NrIHNvdXJjZSwgY2xvY2sgZGl2aWRlciwgZW5hYmxlIGRtYS4gKi8KKwl2YWwgPSBjdHgtPnZpZGNvbjA7CisJdmFsICY9IH4oVklEQ09OMF9DTEtWQUxfRl9NQVNLIHwgVklEQ09OMF9DTEtESVIpOworCisJaWYgKGN0eC0+Y2xrZGl2ID4gMSkKKwkJdmFsIHw9IFZJRENPTjBfQ0xLVkFMX0YoY3R4LT5jbGtkaXYgLSAxKSB8IFZJRENPTjBfQ0xLRElSOworCWVsc2UKKwkJdmFsICY9IH5WSURDT04wX0NMS0RJUjsJLyogMToxIGNsb2NrICovCisKKwkvKgorCSAqIGZpZWxkcyBvZiByZWdpc3RlciB3aXRoIHByZWZpeCAnX0YnIHdvdWxkIGJlIHVwZGF0ZWQKKwkgKiBhdCB2c3luYyhzYW1lIGFzIGRtYSBzdGFydCkKKwkgKi8KKwl2YWwgfD0gVklEQ09OMF9FTlZJRCB8IFZJRENPTjBfRU5WSURfRjsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURDT04wKTsKK30KKworc3RhdGljIGludCBmaW1kX2VuYWJsZV92Ymxhbmsoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGdldF9maW1kX2NvbnRleHQoZGV2KTsKKwl1MzIgdmFsOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmY3R4LT5pcnFfZmxhZ3MpKSB7CisJCXZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFZJRElOVENPTjApOworCisJCXZhbCB8PSBWSURJTlRDT04wX0lOVF9FTkFCTEU7CisJCXZhbCB8PSBWSURJTlRDT04wX0lOVF9GUkFNRTsKKworCQl2YWwgJj0gflZJRElOVENPTjBfRlJBTUVTRUwwX01BU0s7CisJCXZhbCB8PSBWSURJTlRDT04wX0ZSQU1FU0VMMF9WU1lOQzsKKwkJdmFsICY9IH5WSURJTlRDT04wX0ZSQU1FU0VMMV9NQVNLOworCQl2YWwgfD0gVklESU5UQ09OMF9GUkFNRVNFTDFfTk9ORTsKKworCQl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURJTlRDT04wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmltZF9kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXUzMiB2YWw7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmY3R4LT5pcnFfZmxhZ3MpKSB7CisJCXZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFZJRElOVENPTjApOworCisJCXZhbCAmPSB+VklESU5UQ09OMF9JTlRfRlJBTUU7CisJCXZhbCAmPSB+VklESU5UQ09OMF9JTlRfRU5BQkxFOworCisJCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRElOVENPTjApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBleHlub3NfZHJtX21hbmFnZXJfb3BzIGZpbWRfbWFuYWdlcl9vcHMgPSB7CisJLmNvbW1pdCA9IGZpbWRfY29tbWl0LAorCS5lbmFibGVfdmJsYW5rID0gZmltZF9lbmFibGVfdmJsYW5rLAorCS5kaXNhYmxlX3ZibGFuayA9IGZpbWRfZGlzYWJsZV92YmxhbmssCit9OworCitzdGF0aWMgdm9pZCBmaW1kX3dpbl9tb2RlX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5ICpvdmVybGF5KQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IGdldF9maW1kX2NvbnRleHQoZGV2KTsKKwlzdHJ1Y3QgZmltZF93aW5fZGF0YSAqd2luX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKCFvdmVybGF5KSB7CisJCWRldl9lcnIoZGV2LCAib3ZlcmxheSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW9mZnNldCA9IG92ZXJsYXktPmZiX3ggKiAob3ZlcmxheS0+YnBwID4+IDMpOworCW9mZnNldCArPSBvdmVybGF5LT5mYl95ICogb3ZlcmxheS0+cGl0Y2g7CisKKwlEUk1fREVCVUdfS01TKCJvZmZzZXQgPSAweCVseCwgcGl0Y2ggPSAleFxuIiwgb2Zmc2V0LCBvdmVybGF5LT5waXRjaCk7CisKKwl3aW5fZGF0YSA9ICZjdHgtPndpbl9kYXRhW2N0eC0+ZGVmYXVsdF93aW5dOworCisJd2luX2RhdGEtPm9mZnNldF94ID0gb3ZlcmxheS0+Y3J0Y194OworCXdpbl9kYXRhLT5vZmZzZXRfeSA9IG92ZXJsYXktPmNydGNfeTsKKwl3aW5fZGF0YS0+b3ZsX3dpZHRoID0gb3ZlcmxheS0+Y3J0Y193aWR0aDsKKwl3aW5fZGF0YS0+b3ZsX2hlaWdodCA9IG92ZXJsYXktPmNydGNfaGVpZ2h0OworCXdpbl9kYXRhLT5mYl93aWR0aCA9IG92ZXJsYXktPmZiX3dpZHRoOworCXdpbl9kYXRhLT5mYl9oZWlnaHQgPSBvdmVybGF5LT5mYl9oZWlnaHQ7CisJd2luX2RhdGEtPnBhZGRyID0gb3ZlcmxheS0+cGFkZHIgKyBvZmZzZXQ7CisJd2luX2RhdGEtPnZhZGRyID0gb3ZlcmxheS0+dmFkZHIgKyBvZmZzZXQ7CisJd2luX2RhdGEtPmJwcCA9IG92ZXJsYXktPmJwcDsKKwl3aW5fZGF0YS0+YnVmX29mZnNpemUgPSAob3ZlcmxheS0+ZmJfd2lkdGggLSBvdmVybGF5LT5jcnRjX3dpZHRoKSAqCisJCQkJKG92ZXJsYXktPmJwcCA+PiAzKTsKKwl3aW5fZGF0YS0+bGluZV9zaXplID0gb3ZlcmxheS0+Y3J0Y193aWR0aCAqIChvdmVybGF5LT5icHAgPj4gMyk7CisKKwlEUk1fREVCVUdfS01TKCJvZmZzZXRfeCA9ICVkLCBvZmZzZXRfeSA9ICVkXG4iLAorCQkJd2luX2RhdGEtPm9mZnNldF94LCB3aW5fZGF0YS0+b2Zmc2V0X3kpOworCURSTV9ERUJVR19LTVMoIm92bF93aWR0aCA9ICVkLCBvdmxfaGVpZ2h0ID0gJWRcbiIsCisJCQl3aW5fZGF0YS0+b3ZsX3dpZHRoLCB3aW5fZGF0YS0+b3ZsX2hlaWdodCk7CisJRFJNX0RFQlVHX0tNUygicGFkZHIgPSAweCVseCwgdmFkZHIgPSAweCVseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXdpbl9kYXRhLT5wYWRkciwKKwkJCSh1bnNpZ25lZCBsb25nKXdpbl9kYXRhLT52YWRkcik7CisJRFJNX0RFQlVHX0tNUygiZmJfd2lkdGggPSAlZCwgY3J0Y193aWR0aCA9ICVkXG4iLAorCQkJb3ZlcmxheS0+ZmJfd2lkdGgsIG92ZXJsYXktPmNydGNfd2lkdGgpOworfQorCitzdGF0aWMgdm9pZCBmaW1kX3dpbl9zZXRfcGl4Zm10KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHdpbikKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBnZXRfZmltZF9jb250ZXh0KGRldik7CisJc3RydWN0IGZpbWRfd2luX2RhdGEgKndpbl9kYXRhID0gJmN0eC0+d2luX2RhdGFbd2luXTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwl2YWwgPSBXSU5DT054X0VOV0lOOworCisJc3dpdGNoICh3aW5fZGF0YS0+YnBwKSB7CisJY2FzZSAxOgorCQl2YWwgfD0gV0lOQ09OMF9CUFBNT0RFXzFCUFA7CisJCXZhbCB8PSBXSU5DT054X0JJVFNXUDsKKwkJdmFsIHw9IFdJTkNPTnhfQlVSU1RMRU5fNFdPUkQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsIHw9IFdJTkNPTjBfQlBQTU9ERV8yQlBQOworCQl2YWwgfD0gV0lOQ09OeF9CSVRTV1A7CisJCXZhbCB8PSBXSU5DT054X0JVUlNUTEVOXzhXT1JEOworCQlicmVhazsKKwljYXNlIDQ6CisJCXZhbCB8PSBXSU5DT04wX0JQUE1PREVfNEJQUDsKKwkJdmFsIHw9IFdJTkNPTnhfQklUU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl84V09SRDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWwgfD0gV0lOQ09OMF9CUFBNT0RFXzhCUFBfUEFMRVRURTsKKwkJdmFsIHw9IFdJTkNPTnhfQlVSU1RMRU5fOFdPUkQ7CisJCXZhbCB8PSBXSU5DT054X0JZVFNXUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJdmFsIHw9IFdJTkNPTjBfQlBQTU9ERV8xNkJQUF81NjU7CisJCXZhbCB8PSBXSU5DT054X0hBV1NXUDsKKwkJdmFsIHw9IFdJTkNPTnhfQlVSU1RMRU5fMTZXT1JEOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWwgfD0gV0lOQ09OMF9CUFBNT0RFXzI0QlBQXzg4ODsKKwkJdmFsIHw9IFdJTkNPTnhfV1NXUDsKKwkJdmFsIHw9IFdJTkNPTnhfQlVSU1RMRU5fMTZXT1JEOworCQlicmVhazsKKwljYXNlIDMyOgorCQl2YWwgfD0gV0lOQ09OMV9CUFBNT0RFXzI4QlBQX0E0ODg4CisJCQl8IFdJTkNPTjFfQkxEX1BJWCB8IFdJTkNPTjFfQUxQSEFfU0VMOworCQl2YWwgfD0gV0lOQ09OeF9XU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl8xNldPUkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9ERUJVR19LTVMoImludmFsaWQgcGl4ZWwgc2l6ZSBzbyB1c2luZyB1bnBhY2tlZCAyNGJwcC5cbiIpOworCisJCXZhbCB8PSBXSU5DT04wX0JQUE1PREVfMjRCUFBfODg4OworCQl2YWwgfD0gV0lOQ09OeF9XU1dQOworCQl2YWwgfD0gV0lOQ09OeF9CVVJTVExFTl8xNldPUkQ7CisJCWJyZWFrOworCX0KKworCURSTV9ERUJVR19LTVMoImJwcCA9ICVkXG4iLCB3aW5fZGF0YS0+YnBwKTsKKworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFdJTkNPTih3aW4pKTsKK30KKworc3RhdGljIHZvaWQgZmltZF93aW5fc2V0X2NvbGtleShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB3aW4pCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXVuc2lnbmVkIGludCBrZXljb24wID0gMCwga2V5Y29uMSA9IDA7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJa2V5Y29uMCA9IH4oV3hLRVlDT04wX0tFWUJMX0VOIHwgV3hLRVlDT04wX0tFWUVOX0YgfAorCQkJV3hLRVlDT04wX0RJUkNPTikgfCBXeEtFWUNPTjBfQ09NUEtFWSgwKTsKKworCWtleWNvbjEgPSBXeEtFWUNPTjFfQ09MVkFMKDB4ZmZmZmZmZmYpOworCisJd3JpdGVsKGtleWNvbjAsIGN0eC0+cmVncyArIFdLRVlDT04wX0JBU0Uod2luKSk7CisJd3JpdGVsKGtleWNvbjEsIGN0eC0+cmVncyArIFdLRVlDT04xX0JBU0Uod2luKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWRfd2luX2NvbW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXN0cnVjdCBmaW1kX3dpbl9kYXRhICp3aW5fZGF0YTsKKwlpbnQgd2luID0gY3R4LT5kZWZhdWx0X3dpbjsKKwl1bnNpZ25lZCBsb25nIHZhbCwgYWxwaGEsIHNpemU7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJaWYgKHdpbiA8IDAgfHwgd2luID4gV0lORE9XU19OUikKKwkJcmV0dXJuOworCisJd2luX2RhdGEgPSAmY3R4LT53aW5fZGF0YVt3aW5dOworCisJLyoKKwkgKiBTSEFET1dDT04gcmVnaXN0ZXIgaXMgdXNlZCBmb3IgZW5hYmxpbmcgdGltaW5nLgorCSAqCisJICogZm9yIGV4YW1wbGUsIG9uY2Ugb25seSB3aWR0aCB2YWx1ZSBvZiBhIHJlZ2lzdGVyIGlzIHNldCwKKwkgKiBpZiB0aGUgZG1hIGlzIHN0YXJ0ZWQgdGhlbiBmaW1kIGhhcmR3YXJlIGNvdWxkIG1hbGZ1bmN0aW9uIHNvCisJICogd2l0aCBwcm90ZWN0IHdpbmRvdyBzZXR0aW5nLCB0aGUgcmVnaXN0ZXIgZmllbGRzIHdpdGggcHJlZml4ICdfRicKKwkgKiB3b3VsZG4ndCBiZSB1cGRhdGVkIGF0IHZzeW5jIGFsc28gYnV0IHVwZGF0ZWQgb25jZSB1bnByb3RlY3Qgd2luZG93CisJICogaXMgc2V0LgorCSAqLworCisJLyogcHJvdGVjdCB3aW5kb3dzICovCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKwl2YWwgfD0gU0hBRE9XQ09OX1dJTnhfUFJPVEVDVCh3aW4pOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFNIQURPV0NPTik7CisKKwkvKiBidWZmZXIgc3RhcnQgYWRkcmVzcyAqLworCXZhbCA9IHdpbl9kYXRhLT5wYWRkcjsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBWSURXeF9CVUZfU1RBUlQod2luLCAwKSk7CisKKwkvKiBidWZmZXIgZW5kIGFkZHJlc3MgKi8KKwlzaXplID0gd2luX2RhdGEtPmZiX3dpZHRoICogd2luX2RhdGEtPm92bF9oZWlnaHQgKiAod2luX2RhdGEtPmJwcCA+PiAzKTsKKwl2YWwgPSB3aW5fZGF0YS0+cGFkZHIgKyBzaXplOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFd4X0JVRl9FTkQod2luLCAwKSk7CisKKwlEUk1fREVCVUdfS01TKCJzdGFydCBhZGRyID0gMHglbHgsIGVuZCBhZGRyID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXdpbl9kYXRhLT5wYWRkciwgdmFsLCBzaXplKTsKKwlEUk1fREVCVUdfS01TKCJvdmxfd2lkdGggPSAlZCwgb3ZsX2hlaWdodCA9ICVkXG4iLAorCQkJd2luX2RhdGEtPm92bF93aWR0aCwgd2luX2RhdGEtPm92bF9oZWlnaHQpOworCisJLyogYnVmZmVyIHNpemUgKi8KKwl2YWwgPSBWSURXX0JVRl9TSVpFX09GRlNFVCh3aW5fZGF0YS0+YnVmX29mZnNpemUpIHwKKwkJVklEV19CVUZfU0laRV9QQUdFV0lEVEgod2luX2RhdGEtPmxpbmVfc2l6ZSk7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklEV3hfQlVGX1NJWkUod2luLCAwKSk7CisKKwkvKiBPU0QgcG9zaXRpb24gKi8KKwl2YWwgPSBWSURPU0R4QV9UT1BMRUZUX1god2luX2RhdGEtPm9mZnNldF94KSB8CisJCVZJRE9TRHhBX1RPUExFRlRfWSh3aW5fZGF0YS0+b2Zmc2V0X3kpOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRE9TRF9BKHdpbikpOworCisJdmFsID0gVklET1NEeEJfQk9UUklHSFRfWCh3aW5fZGF0YS0+b2Zmc2V0X3ggKworCQkJCQl3aW5fZGF0YS0+b3ZsX3dpZHRoIC0gMSkgfAorCQlWSURPU0R4Ql9CT1RSSUdIVF9ZKHdpbl9kYXRhLT5vZmZzZXRfeSArCisJCQkJCXdpbl9kYXRhLT5vdmxfaGVpZ2h0IC0gMSk7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklET1NEX0Iod2luKSk7CisKKwlEUk1fREVCVUdfS01TKCJvc2QgcG9zOiB0eCA9ICVkLCB0eSA9ICVkLCBieCA9ICVkLCBieSA9ICVkXG4iLAorCQkJd2luX2RhdGEtPm9mZnNldF94LCB3aW5fZGF0YS0+b2Zmc2V0X3ksCisJCQl3aW5fZGF0YS0+b2Zmc2V0X3ggKyB3aW5fZGF0YS0+b3ZsX3dpZHRoIC0gMSwKKwkJCXdpbl9kYXRhLT5vZmZzZXRfeSArIHdpbl9kYXRhLT5vdmxfaGVpZ2h0IC0gMSk7CisKKwkvKiBoYXJkd2FyZSB3aW5kb3cgMCBkb2Vzbid0IHN1cHBvcnQgYWxwaGEgY2hhbm5lbC4gKi8KKwlpZiAod2luICE9IDApIHsKKwkJLyogT1NEIGFscGhhICovCisJCWFscGhhID0gVklESVNEMTRDX0FMUEhBMV9SKDB4ZikgfAorCQkJVklESVNEMTRDX0FMUEhBMV9HKDB4ZikgfAorCQkJVklESVNEMTRDX0FMUEhBMV9CKDB4Zik7CisKKwkJd3JpdGVsKGFscGhhLCBjdHgtPnJlZ3MgKyBWSURPU0RfQyh3aW4pKTsKKwl9CisKKwkvKiBPU0Qgc2l6ZSAqLworCWlmICh3aW4gIT0gMyAmJiB3aW4gIT0gNCkgeworCQl1MzIgb2Zmc2V0ID0gVklET1NEX0Qod2luKTsKKwkJaWYgKHdpbiA9PSAwKQorCQkJb2Zmc2V0ID0gVklET1NEX0NfU0laRV9XMDsKKwkJdmFsID0gd2luX2RhdGEtPm92bF93aWR0aCAqIHdpbl9kYXRhLT5vdmxfaGVpZ2h0OworCQl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBvZmZzZXQpOworCisJCURSTV9ERUJVR19LTVMoIm9zZCBzaXplID0gMHgleFxuIiwgKHVuc2lnbmVkIGludCl2YWwpOworCX0KKworCWZpbWRfd2luX3NldF9waXhmbXQoZGV2LCB3aW4pOworCisJLyogaGFyZHdhcmUgd2luZG93IDAgZG9lc24ndCBzdXBwb3J0IGNvbG9yIGtleS4gKi8KKwlpZiAod2luICE9IDApCisJCWZpbWRfd2luX3NldF9jb2xrZXkoZGV2LCB3aW4pOworCisJLyogRW5hYmxlIERNQSBjaGFubmVsIGFuZCB1bnByb3RlY3Qgd2luZG93cyAqLworCXZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFNIQURPV0NPTik7CisJdmFsIHw9IFNIQURPV0NPTl9DSHhfRU5BQkxFKHdpbik7CisJdmFsICY9IH5TSEFET1dDT05fV0lOeF9QUk9URUNUKHdpbik7CisJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKK30KKworc3RhdGljIHZvaWQgZmltZF93aW5fZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWRfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWRfY29udGV4dChkZXYpOworCXN0cnVjdCBmaW1kX3dpbl9kYXRhICp3aW5fZGF0YTsKKwlpbnQgd2luID0gY3R4LT5kZWZhdWx0X3dpbjsKKwl1MzIgdmFsOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWlmICh3aW4gPCAwIHx8IHdpbiA+IFdJTkRPV1NfTlIpCisJCXJldHVybjsKKworCXdpbl9kYXRhID0gJmN0eC0+d2luX2RhdGFbd2luXTsKKworCS8qIHByb3RlY3Qgd2luZG93cyAqLworCXZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFNIQURPV0NPTik7CisJdmFsIHw9IFNIQURPV0NPTl9XSU54X1BST1RFQ1Qod2luKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworCisJLyogd2luY29uICovCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgV0lOQ09OKHdpbikpOworCXZhbCAmPSB+V0lOQ09OeF9FTldJTjsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBXSU5DT04od2luKSk7CisKKwkvKiB1bnByb3RlY3Qgd2luZG93cyAqLworCXZhbCA9IHJlYWRsKGN0eC0+cmVncyArIFNIQURPV0NPTik7CisJdmFsICY9IH5TSEFET1dDT05fQ0h4X0VOQUJMRSh3aW4pOworCXZhbCAmPSB+U0hBRE9XQ09OX1dJTnhfUFJPVEVDVCh3aW4pOworCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFNIQURPV0NPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh5bm9zX2RybV9vdmVybGF5X29wcyBmaW1kX292ZXJsYXlfb3BzID0geworCS5tb2RlX3NldCA9IGZpbWRfd2luX21vZGVfc2V0LAorCS5jb21taXQgPSBmaW1kX3dpbl9jb21taXQsCisJLmRpc2FibGUgPSBmaW1kX3dpbl9kaXNhYmxlLAorfTsKKworc3RhdGljIHZvaWQgZmltZF9maW5pc2hfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIGludCBjcnRjKQoreworCXN0cnVjdCBleHlub3NfZHJtX3ByaXZhdGUgKmRldl9wcml2ID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZSwgKnQ7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBpc19jaGVja2VkID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHJtX2Rldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHQsICZkZXZfcHJpdi0+cGFnZWZsaXBfZXZlbnRfbGlzdCwKKwkJCWJhc2UubGluaykgeworCQkvKiBpZiBldmVudCdzIHBpcGUgaXNuJ3Qgc2FtZSBhcyBjcnRjIHRoZW4gaWdub3JlIGl0LiAqLworCQlpZiAoY3J0YyAhPSBlLT5waXBlKQorCQkJY29udGludWU7CisKKwkJaXNfY2hlY2tlZCA9IHRydWU7CisKKwkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQllLT5ldmVudC5zZXF1ZW5jZSA9IDA7CisJCWUtPmV2ZW50LnR2X3NlYyA9IG5vdy50dl9zZWM7CisJCWUtPmV2ZW50LnR2X3VzZWMgPSBub3cudHZfdXNlYzsKKworCQlsaXN0X21vdmVfdGFpbCgmZS0+YmFzZS5saW5rLCAmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X2xpc3QpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF93YWl0KTsKKwl9CisKKwlpZiAoaXNfY2hlY2tlZCkKKwkJZHJtX3ZibGFua19wdXQoZHJtX2RldiwgY3J0Yyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcm1fZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmaW1kX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSAoc3RydWN0IGZpbWRfY29udGV4dCAqKWRldl9pZDsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9zdWJkcnYgKnN1YmRydiA9ICZjdHgtPnN1YmRydjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHN1YmRydi0+ZHJtX2RldjsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9tYW5hZ2VyICptYW5hZ2VyID0gJnN1YmRydi0+bWFuYWdlcjsKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgVklESU5UQ09OMSk7CisKKwlpZiAodmFsICYgVklESU5UQ09OMV9JTlRfRlJBTUUpCisJCS8qIFZTWU5DIGludGVycnVwdCAqLworCQl3cml0ZWwoVklESU5UQ09OMV9JTlRfRlJBTUUsIGN0eC0+cmVncyArIFZJRElOVENPTjEpOworCisJZHJtX2hhbmRsZV92YmxhbmsoZHJtX2RldiwgbWFuYWdlci0+cGlwZSk7CisJZmltZF9maW5pc2hfcGFnZWZsaXAoZHJtX2RldiwgbWFuYWdlci0+cGlwZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZmltZF9zdWJkcnZfcHJvYmUoc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyoKKwkgKiBlbmFibGUgZHJtIGlycSBtb2RlLgorCSAqIC0gd2l0aCBpcnFfZW5hYmxlZCA9IDEsIHdlIGNhbiB1c2UgdGhlIHZibGFuayBmZWF0dXJlLgorCSAqCisJICogUC5TLiBub3RlIHRoYXQgd2Ugd291bGRuJ3QgdXNlIGRybSBpcnEgaGFuZGxlciBidXQKKwkgKglqdXN0IHNwZWNpZmljIGRyaXZlciBvd24gb25lIGluc3RlYWQgYmVjYXVzZQorCSAqCWRybSBmcmFtZXdvcmsgc3VwcG9ydHMgb25seSBvbmUgaXJxIGhhbmRsZXIuCisJICovCisJZHJtX2Rldi0+aXJxX2VuYWJsZWQgPSAxOworCisJLyoKKwkgKiB3aXRoIHZibGFua19kaXNhYmxlX2FsbG93ZWQgPSAxLCB2YmxhbmsgaW50ZXJydXB0IHdpbGwgYmUgZGlzYWJsZWQKKwkgKiBieSBkcm0gdGltZXIgb25jZSBhIGN1cnJlbnQgcHJvY2VzcyBnaXZlcyB1cCBvd25lcnNoaXAgb2YKKwkgKiB2YmxhbmsgZXZlbnQuKGRybV92YmxhbmtfcHV0IGZ1bmN0aW9uIHdhcyBjYWxsZWQpCisJICovCisJZHJtX2Rldi0+dmJsYW5rX2Rpc2FibGVfYWxsb3dlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmltZF9zdWJkcnZfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2KQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBUT0RPLiAqLworfQorCitzdGF0aWMgaW50IGZpbWRfY2FsY19jbGtkaXYoc3RydWN0IGZpbWRfY29udGV4dCAqY3R4LAorCQkJICAgIHN0cnVjdCBmYl92aWRlb21vZGUgKnRpbWluZykKK3sKKwl1bnNpZ25lZCBsb25nIGNsayA9IGNsa19nZXRfcmF0ZShjdHgtPmxjZF9jbGspOworCXUzMiByZXRyYWNlOworCXUzMiBjbGtkaXY7CisJdTMyIGJlc3RfZnJhbWVyYXRlID0gMDsKKwl1MzIgZnJhbWVyYXRlOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHJhY2UgPSB0aW1pbmctPmxlZnRfbWFyZ2luICsgdGltaW5nLT5oc3luY19sZW4gKworCQkJCXRpbWluZy0+cmlnaHRfbWFyZ2luICsgdGltaW5nLT54cmVzOworCXJldHJhY2UgKj0gdGltaW5nLT51cHBlcl9tYXJnaW4gKyB0aW1pbmctPnZzeW5jX2xlbiArCisJCQkJdGltaW5nLT5sb3dlcl9tYXJnaW4gKyB0aW1pbmctPnlyZXM7CisKKwkvKiBkZWZhdWx0IGZyYW1lcmF0ZSBpcyA2MEh6ICovCisJaWYgKCF0aW1pbmctPnJlZnJlc2gpCisJCXRpbWluZy0+cmVmcmVzaCA9IDYwOworCisJY2xrIC89IHJldHJhY2U7CisKKwlmb3IgKGNsa2RpdiA9IDE7IGNsa2RpdiA8IDB4MTAwOyBjbGtkaXYrKykgeworCQlpbnQgdG1wOworCisJCS8qIGdldCBiZXN0IGZyYW1lcmF0ZSAqLworCQlmcmFtZXJhdGUgPSBjbGsgLyBjbGtkaXY7CisJCXRtcCA9IHRpbWluZy0+cmVmcmVzaCAtIGZyYW1lcmF0ZTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCWJlc3RfZnJhbWVyYXRlID0gZnJhbWVyYXRlOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlpZiAoIWJlc3RfZnJhbWVyYXRlKQorCQkJCWJlc3RfZnJhbWVyYXRlID0gZnJhbWVyYXRlOworCQkJZWxzZSBpZiAodG1wIDwgKGJlc3RfZnJhbWVyYXRlIC0gZnJhbWVyYXRlKSkKKwkJCQliZXN0X2ZyYW1lcmF0ZSA9IGZyYW1lcmF0ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNsa2RpdjsKK30KKworc3RhdGljIHZvaWQgZmltZF9jbGVhcl93aW4oc3RydWN0IGZpbWRfY29udGV4dCAqY3R4LCBpbnQgd2luKQoreworCXUzMiB2YWw7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJd3JpdGVsKDAsIGN0eC0+cmVncyArIFdJTkNPTih3aW4pKTsKKwl3cml0ZWwoMCwgY3R4LT5yZWdzICsgVklET1NEX0Eod2luKSk7CisJd3JpdGVsKDAsIGN0eC0+cmVncyArIFZJRE9TRF9CKHdpbikpOworCXdyaXRlbCgwLCBjdHgtPnJlZ3MgKyBWSURPU0RfQyh3aW4pKTsKKworCWlmICh3aW4gPT0gMSB8fCB3aW4gPT0gMikKKwkJd3JpdGVsKDAsIGN0eC0+cmVncyArIFZJRE9TRF9EKHdpbikpOworCisJdmFsID0gcmVhZGwoY3R4LT5yZWdzICsgU0hBRE9XQ09OKTsKKwl2YWwgJj0gflNIQURPV0NPTl9XSU54X1BST1RFQ1Qod2luKTsKKwl3cml0ZWwodmFsLCBjdHgtPnJlZ3MgKyBTSEFET1dDT04pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmaW1kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHg7CisJc3RydWN0IGV4eW5vc19kcm1fc3ViZHJ2ICpzdWJkcnY7CisJc3RydWN0IGV4eW5vc19kcm1fZmltZF9wZGF0YSAqcGRhdGE7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSAqdGltaW5nOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCB3aW47CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcGxhdGZvcm0gZGF0YSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0aW1pbmcgPSAmcGRhdGEtPnRpbWluZzsKKwlpZiAoIXRpbWluZykgeworCQlkZXZfZXJyKGRldiwgInRpbWluZyBpcyBudWxsLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHgtPmJ1c19jbGsgPSBjbGtfZ2V0KGRldiwgImZpbWQiKTsKKwlpZiAoSVNfRVJSKGN0eC0+YnVzX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGJ1cyBjbG9ja1xuIik7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5idXNfY2xrKTsKKwkJZ290byBlcnJfY2xrX2dldDsKKwl9CisKKwljbGtfZW5hYmxlKGN0eC0+YnVzX2Nsayk7CisKKwljdHgtPmxjZF9jbGsgPSBjbGtfZ2V0KGRldiwgInNjbGtfZmltZCIpOworCWlmIChJU19FUlIoY3R4LT5sY2RfY2xrKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbGNkIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihjdHgtPmxjZF9jbGspOworCQlnb3RvIGVycl9idXNfY2xrOworCX0KKworCWNsa19lbmFibGUoY3R4LT5sY2RfY2xrKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCByZWdpc3RlcnNcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJY3R4LT5yZWdzX3JlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJCSAgIGRldl9uYW1lKGRldikpOworCWlmICghY3R4LT5yZWdzX3JlcykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjbGFpbSByZWdpc3RlciByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJY3R4LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghY3R4LT5yZWdzKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyX3JlcV9yZWdpb25faW87CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwgImlycSByZXF1ZXN0IGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9yZXFfcmVnaW9uX2lycTsKKwl9CisKKwljdHgtPmlycSA9IHJlcy0+c3RhcnQ7CisKKwlmb3IgKHdpbiA9IDA7IHdpbiA8IFdJTkRPV1NfTlI7IHdpbisrKQorCQlmaW1kX2NsZWFyX3dpbihjdHgsIHdpbik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShjdHgtPmlycSwgZmltZF9pcnFfaGFuZGxlciwgMCwgImRybV9maW1kIiwgY3R4KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImlycSByZXF1ZXN0IGZhaWxlZC5cbiIpOworCQlnb3RvIGVycl9yZXFfaXJxOworCX0KKworCWN0eC0+Y2xrZGl2ID0gZmltZF9jYWxjX2Nsa2RpdihjdHgsIHRpbWluZyk7CisJY3R4LT52aWRjb24wID0gcGRhdGEtPnZpZGNvbjA7CisJY3R4LT52aWRjb24xID0gcGRhdGEtPnZpZGNvbjE7CisJY3R4LT5kZWZhdWx0X3dpbiA9IHBkYXRhLT5kZWZhdWx0X3dpbjsKKwljdHgtPnRpbWluZyA9IHRpbWluZzsKKworCXRpbWluZy0+cGl4Y2xvY2sgPSBjbGtfZ2V0X3JhdGUoY3R4LT5sY2RfY2xrKSAvIGN0eC0+Y2xrZGl2OworCisJRFJNX0RFQlVHX0tNUygicGl4ZWwgY2xvY2sgPSAlZCwgY2xrZGl2ID0gJWRcbiIsCisJCQl0aW1pbmctPnBpeGNsb2NrLCBjdHgtPmNsa2Rpdik7CisKKwlzdWJkcnYgPSAmY3R4LT5zdWJkcnY7CisKKwlzdWJkcnYtPnByb2JlID0gZmltZF9zdWJkcnZfcHJvYmU7CisJc3ViZHJ2LT5yZW1vdmUgPSBmaW1kX3N1YmRydl9yZW1vdmU7CisJc3ViZHJ2LT5tYW5hZ2VyLnBpcGUgPSAtMTsKKwlzdWJkcnYtPm1hbmFnZXIub3BzID0gJmZpbWRfbWFuYWdlcl9vcHM7CisJc3ViZHJ2LT5tYW5hZ2VyLm92ZXJsYXlfb3BzID0gJmZpbWRfb3ZlcmxheV9vcHM7CisJc3ViZHJ2LT5tYW5hZ2VyLmRpc3BsYXkgPSAmZmltZF9kaXNwbGF5OworCXN1YmRydi0+bWFuYWdlci5kZXYgPSBkZXY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCWV4eW5vc19kcm1fc3ViZHJ2X3JlZ2lzdGVyKHN1YmRydik7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlcV9pcnE6CitlcnJfcmVxX3JlZ2lvbl9pcnE6CisJaW91bm1hcChjdHgtPnJlZ3MpOworCitlcnJfcmVxX3JlZ2lvbl9pbzoKKwlyZWxlYXNlX3Jlc291cmNlKGN0eC0+cmVnc19yZXMpOworCWtmcmVlKGN0eC0+cmVnc19yZXMpOworCitlcnJfY2xrOgorCWNsa19kaXNhYmxlKGN0eC0+bGNkX2Nsayk7CisJY2xrX3B1dChjdHgtPmxjZF9jbGspOworCitlcnJfYnVzX2NsazoKKwljbGtfZGlzYWJsZShjdHgtPmJ1c19jbGspOworCWNsa19wdXQoY3R4LT5idXNfY2xrKTsKKworZXJyX2Nsa19nZXQ6CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBmaW1kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCWV4eW5vc19kcm1fc3ViZHJ2X3VucmVnaXN0ZXIoJmN0eC0+c3ViZHJ2KTsKKworCWNsa19kaXNhYmxlKGN0eC0+bGNkX2Nsayk7CisJY2xrX2Rpc2FibGUoY3R4LT5idXNfY2xrKTsKKwljbGtfcHV0KGN0eC0+bGNkX2Nsayk7CisJY2xrX3B1dChjdHgtPmJ1c19jbGspOworCisJaW91bm1hcChjdHgtPnJlZ3MpOworCXJlbGVhc2VfcmVzb3VyY2UoY3R4LT5yZWdzX3Jlcyk7CisJa2ZyZWUoY3R4LT5yZWdzX3Jlcyk7CisJZnJlZV9pcnEoY3R4LT5pcnEsIGN0eCk7CisKKwlrZnJlZShjdHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZpbWRfZHJpdmVyID0geworCS5wcm9iZQkJPSBmaW1kX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZmltZF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJleHlub3M0LWZiIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbWRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZpbWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbWRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmaW1kX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGZpbWRfaW5pdCk7Cittb2R1bGVfZXhpdChmaW1kX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgRFJNIEZJTUQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlN2E4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nZW0uYwpAQCAtMCwwICsxLDQxNSBAQAorLyogZXh5bm9zX2RybV9nZW0uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogQXV0aG9yOiBJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZBIExJTlVYIFNZU1RFTVMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKworI2luY2x1ZGUgPGRybS9leHlub3NfZHJtLmg+CisKKyNpbmNsdWRlICJleHlub3NfZHJtX2Rydi5oIgorI2luY2x1ZGUgImV4eW5vc19kcm1fZ2VtLmgiCisjaW5jbHVkZSAiZXh5bm9zX2RybV9idWYuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBjb252ZXJ0X3RvX3ZtX2Vycl9tc2coaW50IG1zZykKK3sKKwl1bnNpZ25lZCBpbnQgb3V0X21zZzsKKworCXN3aXRjaCAobXNnKSB7CisJY2FzZSAwOgorCWNhc2UgLUVSRVNUQVJUU1lTOgorCWNhc2UgLUVJTlRSOgorCQlvdXRfbXNnID0gVk1fRkFVTFRfTk9QQUdFOworCQlicmVhazsKKworCWNhc2UgLUVOT01FTToKKwkJb3V0X21zZyA9IFZNX0ZBVUxUX09PTTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRfbXNnID0gVk1fRkFVTFRfU0lHQlVTOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gb3V0X21zZzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfZ2VtX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoreworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludClvYmotPm1hcF9saXN0Lmhhc2gua2V5IDw8IFBBR0VfU0hJRlQ7Cit9CisKK3N0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19kcm1fZ2VtX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHNpemUsCisJCXVuc2lnbmVkIGludCAqaGFuZGxlKQoreworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqOworCXN0cnVjdCBleHlub3NfZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlzaXplID0gcm91bmR1cChzaXplLCBQQUdFX1NJWkUpOworCisJZXh5bm9zX2dlbV9vYmogPSBremFsbG9jKHNpemVvZigqZXh5bm9zX2dlbV9vYmopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4eW5vc19nZW1fb2JqKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGV4eW5vcyBnZW0gb2JqZWN0LlxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCS8qIGFsbG9jYXRlIHRoZSBuZXcgYnVmZmVyIG9iamVjdCBhbmQgbWVtb3J5IHJlZ2lvbi4gKi8KKwllbnRyeSA9IGV4eW5vc19kcm1fYnVmX2NyZWF0ZShkZXYsIHNpemUpOworCWlmICghZW50cnkpIHsKKwkJa2ZyZWUoZXh5bm9zX2dlbV9vYmopOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlleHlub3NfZ2VtX29iai0+ZW50cnkgPSBlbnRyeTsKKworCW9iaiA9ICZleHlub3NfZ2VtX29iai0+YmFzZTsKKworCXJldCA9IGRybV9nZW1fb2JqZWN0X2luaXQoZGV2LCBvYmosIHNpemUpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluaXRhaWxpemUgZ2VtIG9iamVjdC5cbiIpOworCQlnb3RvIGVycl9vYmpfaW5pdDsKKwl9CisKKwlEUk1fREVCVUdfS01TKCJjcmVhdGVkIGZpbGUgb2JqZWN0ID0gMHgleFxuIiwgKHVuc2lnbmVkIGludClvYmotPmZpbHApOworCisJcmV0ID0gZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQob2JqKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBtbWFwIG9mZnNldC5cbiIpOworCQlnb3RvIGVycl9jcmVhdGVfbW1hcF9vZmZzZXQ7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBhIGlkIG9mIGlkciB0YWJsZSB3aGVyZSB0aGUgb2JqIGlzIHJlZ2lzdGVyZWQKKwkgKiBhbmQgaGFuZGxlIGhhcyB0aGUgaWQgd2hhdCB1c2VyIGNhbiBzZWUuCisJICovCisJcmV0ID0gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGVfcHJpdiwgb2JqLCBoYW5kbGUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hhbmRsZV9jcmVhdGU7CisKKwlEUk1fREVCVUdfS01TKCJnZW0gaGFuZGxlID0gMHgleFxuIiwgKmhhbmRsZSk7CisKKwkvKiBkcm9wIHJlZmVyZW5jZSBmcm9tIGFsbG9jYXRlIC0gaGFuZGxlIGhvbGRzIGl0IG5vdy4gKi8KKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCisJcmV0dXJuIGV4eW5vc19nZW1fb2JqOworCitlcnJfaGFuZGxlX2NyZWF0ZToKKwlkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKKworZXJyX2NyZWF0ZV9tbWFwX29mZnNldDoKKwlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKG9iaik7CisKK2Vycl9vYmpfaW5pdDoKKwlleHlub3NfZHJtX2J1Zl9kZXN0cm95KGRldiwgZXh5bm9zX2dlbV9vYmotPmVudHJ5KTsKKworCWtmcmVlKGV4eW5vc19nZW1fb2JqKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK2ludCBleHlub3NfZHJtX2dlbV9jcmVhdGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9leHlub3NfZ2VtX2NyZWF0ZSAqYXJncyA9IGRhdGE7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmo7CisKKwlEUk1fREVCVUdfS01TKCIlcyA6IHNpemUgPSAweCV4XG4iLCBfX0ZJTEVfXywgYXJncy0+c2l6ZSk7CisKKwlleHlub3NfZ2VtX29iaiA9IGV4eW5vc19kcm1fZ2VtX2NyZWF0ZShmaWxlX3ByaXYsIGRldiwgYXJncy0+c2l6ZSwKKwkJCSZhcmdzLT5oYW5kbGUpOworCWlmIChJU19FUlIoZXh5bm9zX2dlbV9vYmopKQorCQlyZXR1cm4gUFRSX0VSUihleHlub3NfZ2VtX29iaik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGV4eW5vc19kcm1fZ2VtX21hcF9vZmZzZXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV9leHlub3NfZ2VtX21hcF9vZmYgKmFyZ3MgPSBkYXRhOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCURSTV9ERUJVR19LTVMoImhhbmRsZSA9IDB4JXgsIG9mZnNldCA9IDB4JWx4XG4iLAorCQkJYXJncy0+aGFuZGxlLCAodW5zaWduZWQgbG9uZylhcmdzLT5vZmZzZXQpOworCisJaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKSB7CisJCURSTV9FUlJPUigiZG9lcyBub3Qgc3VwcG9ydCBHRU0uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGV4eW5vc19kcm1fZ2VtX2R1bWJfbWFwX29mZnNldChmaWxlX3ByaXYsIGRldiwgYXJncy0+aGFuZGxlLAorCQkJJmFyZ3MtPm9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX2RybV9nZW1fbW1hcF9idWZmZXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmoob2JqKTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgcGZuLCB2bV9zaXplOworCisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fUkVTRVJWRUQpOworCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwl2bWEtPnZtX2ZpbGUgPSBmaWxwOworCisJdm1fc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwkvKgorCSAqIGEgZW50cnkgY29udGFpbnMgaW5mb3JtYXRpb24gdG8gcGh5c2ljYWxseSBjb250aW51b3VzIG1lbW9yeQorCSAqIGFsbG9jYXRlZCBieSB1c2VyIHJlcXVlc3Qgb3IgYXQgZnJhbWVidWZmZXIgY3JlYXRpb24uCisJICovCisJZW50cnkgPSBleHlub3NfZ2VtX29iai0+ZW50cnk7CisKKwkvKiBjaGVjayBpZiB1c2VyLXJlcXVlc3RlZCBzaXplIGlzIHZhbGlkLiAqLworCWlmICh2bV9zaXplID4gZW50cnktPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBnZXQgcGFnZSBmcmFtZSBudW1iZXIgdG8gcGh5c2ljYWwgbWVtb3J5IHRvIGJlIG1hcHBlZAorCSAqIHRvIHVzZXIgc3BhY2UuCisJICovCisJcGZuID0gZXh5bm9zX2dlbV9vYmotPmVudHJ5LT5wYWRkciA+PiBQQUdFX1NISUZUOworCisJRFJNX0RFQlVHX0tNUygicGZuID0gMHglbHhcbiIsIHBmbik7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgcGZuLCB2bV9zaXplLAorCQkJCXZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byByZW1hcCBwZm4gcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4eW5vc19kcm1fZ2VtX2ZvcHMgPSB7CisJLm1tYXAgPSBleHlub3NfZHJtX2dlbV9tbWFwX2J1ZmZlciwKK307CisKK2ludCBleHlub3NfZHJtX2dlbV9tbWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fZXh5bm9zX2dlbV9tbWFwICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpIHsKKwkJRFJNX0VSUk9SKCJkb2VzIG5vdCBzdXBwb3J0IEdFTS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJaWYgKCFvYmopIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbG9va3VwIGdlbSBvYmplY3QuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2JqLT5maWxwLT5mX29wID0gJmV4eW5vc19kcm1fZ2VtX2ZvcHM7CisJb2JqLT5maWxwLT5wcml2YXRlX2RhdGEgPSBvYmo7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWFkZHIgPSBkb19tbWFwKG9iai0+ZmlscCwgMCwgYXJncy0+c2l6ZSwKKwkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIDApOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKworCWlmIChJU19FUlIoKHZvaWQgKilhZGRyKSkKKwkJcmV0dXJuIFBUUl9FUlIoKHZvaWQgKilhZGRyKTsKKworCWFyZ3MtPm1hcHBlZCA9IGFkZHI7CisKKwlEUk1fREVCVUdfS01TKCJtYXBwZWQgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpYXJncy0+bWFwcGVkKTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1faW5pdF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJRFJNX0RFQlVHX0tNUygiJXNcbiIsIF9fRklMRV9fKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGV4eW5vc19kcm1fZ2VtX2ZyZWVfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtX29iaikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZ2VtX29iajsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwlEUk1fREVCVUdfS01TKCJoYW5kbGUgY291bnQgPSAlZFxuIiwKKwkJCWF0b21pY19yZWFkKCZnZW1fb2JqLT5oYW5kbGVfY291bnQpKTsKKworCWlmIChnZW1fb2JqLT5tYXBfbGlzdC5tYXApCisJCWRybV9nZW1fZnJlZV9tbWFwX29mZnNldChnZW1fb2JqKTsKKworCS8qIHJlbGVhc2UgZmlsZSBwb2ludGVyIHRvIGdlbSBvYmplY3QuICovCisJZHJtX2dlbV9vYmplY3RfcmVsZWFzZShnZW1fb2JqKTsKKworCWV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmooZ2VtX29iaik7CisKKwlleHlub3NfZHJtX2J1Zl9kZXN0cm95KGdlbV9vYmotPmRldiwgZXh5bm9zX2dlbV9vYmotPmVudHJ5KTsKKworCWtmcmVlKGV4eW5vc19nZW1fb2JqKTsKK30KKworaW50IGV4eW5vc19kcm1fZ2VtX2R1bWJfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21vZGVfY3JlYXRlX2R1bWIgKmFyZ3MpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmo7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyoKKwkgKiBhbG9jYXRlIG1lbW9yeSB0byBiZSB1c2VkIGZvciBmcmFtZWJ1ZmZlci4KKwkgKiAtIHRoaXMgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGJ5IHVzZXIgYXBwbGljYXRpb24KKwkgKgl3aXRoIERSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CIGNvbW1hbmQuCisJICovCisKKwlhcmdzLT5waXRjaCA9IGFyZ3MtPndpZHRoICogYXJncy0+YnBwID4+IDM7CisJYXJncy0+c2l6ZSA9IGFyZ3MtPnBpdGNoICogYXJncy0+aGVpZ2h0OworCisJZXh5bm9zX2dlbV9vYmogPSBleHlub3NfZHJtX2dlbV9jcmVhdGUoZmlsZV9wcml2LCBkZXYsIGFyZ3MtPnNpemUsCisJCQkJCQkJJmFyZ3MtPmhhbmRsZSk7CisJaWYgKElTX0VSUihleHlub3NfZ2VtX29iaikpCisJCXJldHVybiBQVFJfRVJSKGV4eW5vc19nZW1fb2JqKTsKKworCXJldHVybiAwOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1fZHVtYl9tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90ICpvZmZzZXQpCit7CisJc3RydWN0IGV4eW5vc19kcm1fZ2VtX29iaiAqZXh5bm9zX2dlbV9vYmo7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJLyoKKwkgKiBnZXQgb2Zmc2V0IG9mIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGRybSBmcmFtZWJ1ZmZlci4KKwkgKiAtIHRoaXMgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGJ5IHVzZXIgYXBwbGljYXRpb24KKwkgKgl3aXRoIERSTV9JT0NUTF9NT0RFX01BUF9EVU1CIGNvbW1hbmQuCisJICovCisKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGhhbmRsZSk7CisJaWYgKCFvYmopIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbG9va3VwIGdlbSBvYmplY3QuXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmoob2JqKTsKKworCSpvZmZzZXQgPSBnZXRfZ2VtX21tYXBfb2Zmc2V0KCZleHlub3NfZ2VtX29iai0+YmFzZSk7CisKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCisJRFJNX0RFQlVHX0tNUygib2Zmc2V0ID0gMHglbHhcbiIsICh1bnNpZ25lZCBsb25nKSpvZmZzZXQpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGV4eW5vc19kcm1fZ2VtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK3sKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXN0cnVjdCBleHlub3NfZHJtX2dlbV9vYmogKmV4eW5vc19nZW1fb2JqID0gdG9fZXh5bm9zX2dlbV9vYmoob2JqKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJdW5zaWduZWQgbG9uZyBwZm47CisJcGdvZmZfdCBwYWdlX29mZnNldDsKKwlpbnQgcmV0OworCisJcGFnZV9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MgLQorCQkJdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXBmbiA9IChleHlub3NfZ2VtX29iai0+ZW50cnktPnBhZGRyID4+IFBBR0VfU0hJRlQpICsgcGFnZV9vZmZzZXQ7CisKKwlyZXQgPSB2bV9pbnNlcnRfbWl4ZWQodm1hLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcywgcGZuKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJcmV0dXJuIGNvbnZlcnRfdG9fdm1fZXJyX21zZyhyZXQpOworfQorCitpbnQgZXh5bm9zX2RybV9nZW1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHJldDsKKworCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7CisKKwkvKiBzZXQgdm1fYXJlYV9zdHJ1Y3QuICovCisJcmV0ID0gZHJtX2dlbV9tbWFwKGZpbHAsIHZtYSk7CisJaWYgKHJldCA8IDApIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbW1hcC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZtYS0+dm1fZmxhZ3MgJj0gflZNX1BGTk1BUDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX01JWEVETUFQOworCisJcmV0dXJuIHJldDsKK30KKworCitpbnQgZXh5bm9zX2RybV9nZW1fZHVtYl9kZXN0cm95KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaGFuZGxlKQoreworCWludCByZXQ7CisKKwlEUk1fREVCVUdfS01TKCIlc1xuIiwgX19GSUxFX18pOworCisJLyoKKwkgKiBvYmotPnJlZmNvdW50IGFuZCBvYmotPmhhbmRsZV9jb3VudCBhcmUgZGVjcmVhc2VkIGFuZAorCSAqIGlmIGJvdGggdGhlbSBhcmUgMCB0aGVuIGV4eW5vc19kcm1fZ2VtX2ZyZWVfb2JqZWN0KCkKKwkgKiB3b3VsZCBiZSBjYWxsZWQgYnkgY2FsbGJhY2sgdG8gcmVsZWFzZSByZXNvdXJjZXMuCisJICovCisJcmV0ID0gZHJtX2dlbV9oYW5kbGVfZGVsZXRlKGZpbGVfcHJpdiwgaGFuZGxlKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBkZWxldGUgZHJtX2dlbV9oYW5kbGUuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFNvQyBEUk0gR0VNIE1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZmMwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ2VtLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIGV4eW5vc19kcm1fZ2VtLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvZXI6IElua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVkEgTElOVVggU1lTVEVNUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9FWFlOT1NfRFJNX0dFTV9IXworI2RlZmluZSBfRVhZTk9TX0RSTV9HRU1fSF8KKworI2RlZmluZSB0b19leHlub3NfZ2VtX29iaih4KQljb250YWluZXJfb2YoeCxcCisJCQlzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqLCBiYXNlKQorCisvKgorICogZXh5bm9zIGRybSBidWZmZXIgc3RydWN0dXJlLgorICoKKyAqIEBiYXNlOiBhIGdlbSBvYmplY3QuCisgKgktIGEgbmV3IGhhbmRsZSB0byB0aGlzIGdlbSBvYmplY3Qgd291bGQgYmUgY3JlYXRlZAorICoJYnkgZHJtX2dlbV9oYW5kbGVfY3JlYXRlKCkuCisgKiBAZW50cnk6IHBvaW50ZXIgdG8gZXh5bm9zIGRybSBidWZmZXIgZW50cnkgb2JqZWN0LgorICoJLSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBwaHlzaWNhbGx5CisgKgljb250aW51b3VzIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGJ5IHVzZXIgcmVxdWVzdAorICoJb3IgYXQgZnJhbWVidWZmZXIgY3JlYXRpb24uCisgKgorICogUC5TLiB0aGlzIG9iamVjdCB3b3VsZCBiZSB0cmFuc2ZlcmVkIHRvIHVzZXIgYXMga21zX2JvLmhhbmRsZSBzbworICoJdXNlciBjYW4gYWNjZXNzIHRoZSBidWZmZXIgdGhyb3VnaCBrbXNfYm8uaGFuZGxlLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqIHsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgYmFzZTsKKwlzdHJ1Y3QgZXh5bm9zX2RybV9idWZfZW50cnkgKmVudHJ5OworfTsKKworLyogY3JlYXRlIGEgbmV3IGJ1ZmZlciBhbmQgZ2V0IGEgbmV3IGdlbSBoYW5kbGUuICovCitzdHJ1Y3QgZXh5bm9zX2RybV9nZW1fb2JqICpleHlub3NfZHJtX2dlbV9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzaXplLAorCQl1bnNpZ25lZCBpbnQgKmhhbmRsZSk7CisKKy8qCisgKiByZXF1ZXN0IGdlbSBvYmplY3QgY3JlYXRpb24gYW5kIGJ1ZmZlciBhbGxvY2F0aW9uIGFzIHRoZSBzaXplCisgKiB0aGF0IGl0IGlzIGNhbGN1bGF0ZWQgd2l0aCBmcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBzdWNoIGFzIHdpZHRoLAorICogaGVpZ2h0IGFuZCBicHAuCisgKi8KK2ludCBleHlub3NfZHJtX2dlbV9jcmVhdGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworCisvKiBnZXQgYnVmZmVyIG9mZnNldCB0byBtYXAgdG8gdXNlciBzcGFjZS4gKi8KK2ludCBleHlub3NfZHJtX2dlbV9tYXBfb2Zmc2V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKKworLyogdW5tYXAgYSBidWZmZXIgZnJvbSB1c2VyIHNwYWNlLiAqLworaW50IGV4eW5vc19kcm1fZ2VtX211bm1hcF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKKy8qIGluaXRpYWxpemUgZ2VtIG9iamVjdC4gKi8KK2ludCBleHlub3NfZHJtX2dlbV9pbml0X29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CisKKy8qIGZyZWUgZ2VtIG9iamVjdC4gKi8KK3ZvaWQgZXh5bm9zX2RybV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW1fb2JqKTsKKworLyogY3JlYXRlIG1lbW9yeSByZWdpb24gZm9yIGRybSBmcmFtZWJ1ZmZlci4gKi8KK2ludCBleHlub3NfZHJtX2dlbV9kdW1iX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tb2RlX2NyZWF0ZV9kdW1iICphcmdzKTsKKworLyogbWFwIG1lbW9yeSByZWdpb24gZm9yIGRybSBmcmFtZWJ1ZmZlciB0byB1c2VyIHNwYWNlLiAqLworaW50IGV4eW5vc19kcm1fZ2VtX2R1bWJfbWFwX29mZnNldChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaGFuZGxlLCB1aW50NjRfdCAqb2Zmc2V0KTsKKworLyogcGFnZSBmYXVsdCBoYW5kbGVyIGFuZCBtbWFwIGZhdWx0IGFkZHJlc3ModmlydHVhbCkgdG8gcGh5c2ljYWwgbWVtb3J5LiAqLworaW50IGV4eW5vc19kcm1fZ2VtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7CisKKy8qCisgKiBtbWFwIHRoZSBwaHlzaWNhbGx5IGNvbnRpbnVvdXMgbWVtb3J5IHRoYXQgYSBnZW0gb2JqZWN0IGNvbnRhaW5zCisgKiB0byB1c2VyIHNwYWNlLgorICovCitpbnQgZXh5bm9zX2RybV9nZW1fbW1hcF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKKy8qIHNldCB2bV9mbGFncyBhbmQgd2UgY2FuIGNoYW5nZSB0aGUgdm0gYXR0cmlidXRlIHRvIG90aGVyIG9uZSBhdCBoZXJlLiAqLworaW50IGV4eW5vc19kcm1fZ2VtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworLyoKKyAqIGRlc3Ryb3kgbWVtb3J5IHJlZ2lvbiBhbGxvY2F0ZWQuCisgKgktIGEgZ2VtIGhhbmRsZSBhbmQgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbiBwb2ludGVkIGJ5IGEgZ2VtIG9iamVjdAorICoJd291bGQgYmUgcmVsZWFzZWQgYnkgZHJtX2dlbV9oYW5kbGVfZGVsZXRlKCkuCisgKi8KK2ludCBleHlub3NfZHJtX2dlbV9kdW1iX2Rlc3Ryb3koc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBoYW5kbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvY2g3MDA2X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMKaW5kZXggMDg3OTJhNy4uMDdkNTVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2kyYy9jaDcwMDZfZHJ2LmMKQEAgLTI0LDYgKzI0LDggQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiY2g3MDA2X3ByaXYuaCIKIAogLyogRFJNIGVuY29kZXIgZnVuY3Rpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTJjL3NpbDE2NF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvc2lsMTY0X2Rydi5jCmluZGV4IDBiNjc3MzIuLmI3ZDQ1YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pMmMvc2lsMTY0X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pMmMvc2lsMTY0X2Rydi5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKICNpbmNsdWRlICJkcm1fZW5jb2Rlcl9zbGF2ZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pODEwL2k4MTBfZHJ2LmMKaW5kZXggNmY5OGQwNS4uZDQyNjZiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k4MTAvaTgxMF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTgxMC9pODEwX2Rydi5jCkBAIC0zMCw2ICszMCw4IEBACiAgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImk4MTBfZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3MDE3LmMKaW5kZXggZDNlOGM1NC4uMWNhNzk5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoNzAxNy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDcwMTcuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0tNUygiY2g3MDF4IG5vdCBkZXRlY3RlZCwgZ290ICVkOiBmcm9tICVzICIKIAkJCSAgICAgICJzbGF2ZSAlZC5cbiIsCi0JCQkgICAgICB2YWwsIGFkYXB0ZXItPm5hbWUsZHZvLT5zbGF2ZV9hZGRyKTsKKwkJCSAgICAgIHZhbCwgYWRhcHRlci0+bmFtZSwgZHZvLT5zbGF2ZV9hZGRyKTsKIAkJZ290byBmYWlsOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2NoN3h4eC5jCmluZGV4IDdlYWE5NGUuLjRhMDM2NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19jaDd4eHguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fY2g3eHh4LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogLyoqIFJlYWRzIGFuIDggYml0IHJlZ2lzdGVyICovCiBzdGF0aWMgYm9vbCBjaDd4eHhfcmVhZGIoc3RydWN0IGludGVsX2R2b19kZXZpY2UgKmR2bywgaW50IGFkZHIsIHVpbnQ4X3QgKmNoKQogewotCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4PSBkdm8tPmRldl9wcml2OworCXN0cnVjdCBjaDd4eHhfcHJpdiAqY2g3eHh4ID0gZHZvLT5kZXZfcHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkdm8tPmkyY19idXM7CiAJdTggb3V0X2J1ZlsyXTsKIAl1OCBpbl9idWZbMl07CkBAIC0zMDMsNyArMzAzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBDSDd4eHhfTlVNX1JFR1M7IGkrKykgewogCQl1aW50OF90IHZhbDsKLQkJaWYgKChpICUgOCkgPT0gMCApCisJCWlmICgoaSAlIDgpID09IDApCiAJCQlEUk1fTE9HX0tNUygiXG4gJTAyWDogIiwgaSk7CiAJCWNoN3h4eF9yZWFkYihkdm8sIGksICZ2YWwpOwogCQlEUk1fTE9HX0tNUygiJTAyWCAiLCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19pdmNoLmMKaW5kZXggYTEyZWQ5NC4uMDRmMjg5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX2l2Y2guYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9faXZjaC5jCkBAIC0zNDQsOCArMzQ0LDggQEAKIAkJCSAgIChhZGp1c3RlZF9tb2RlLT5oZGlzcGxheSAtIDEpKSA+PiAyOwogCQl5X3JhdGlvID0gKCgobW9kZS0+dmRpc3BsYXkgLSAxKSA8PCAxNikgLwogCQkJICAgKGFkanVzdGVkX21vZGUtPnZkaXNwbGF5IC0gMSkpID4+IDI7Ci0JCWl2Y2hfd3JpdGUgKGR2bywgVlI0MiwgeF9yYXRpbyk7Ci0JCWl2Y2hfd3JpdGUgKGR2bywgVlI0MSwgeV9yYXRpbyk7CisJCWl2Y2hfd3JpdGUoZHZvLCBWUjQyLCB4X3JhdGlvKTsKKwkJaXZjaF93cml0ZShkdm8sIFZSNDEsIHlfcmF0aW8pOwogCX0gZWxzZSB7CiAJCXZyMDEgJj0gflZSMDFfUEFORUxfRklUX0VOQUJMRTsKIAkJdnI0MCAmPSB+VlI0MF9DTE9DS19HQVRJTkdfRU5BQkxFOwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJfQogfQogCi1zdHJ1Y3QgaW50ZWxfZHZvX2Rldl9vcHMgaXZjaF9vcHM9IHsKK3N0cnVjdCBpbnRlbF9kdm9fZGV2X29wcyBpdmNoX29wcyA9IHsKIAkuaW5pdCA9IGl2Y2hfaW5pdCwKIAkuZHBtcyA9IGl2Y2hfZHBtcywKIAkubW9kZV92YWxpZCA9IGl2Y2hfbW9kZV92YWxpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19zaWwxNjQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b19zaWwxNjQuYwppbmRleCBlNGI0MDkxLi5hMGIxM2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fc2lsMTY0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3NpbDE2NC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogc3RhdGljIGJvb2wgc2lsMTY0X3dyaXRlYihzdHJ1Y3QgaW50ZWxfZHZvX2RldmljZSAqZHZvLCBpbnQgYWRkciwgdWludDhfdCBjaCkKIHsKLQlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnNpbD0gZHZvLT5kZXZfcHJpdjsKKwlzdHJ1Y3Qgc2lsMTY0X3ByaXYgKnNpbCA9IGR2by0+ZGV2X3ByaXY7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gZHZvLT5pMmNfYnVzOwogCXVpbnQ4X3Qgb3V0X2J1ZlsyXTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kdm9fdGZwNDEwLmMKaW5kZXggOGFiMjg1NS4uYWEyY2QzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZHZvX3RmcDQxMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2R2b190ZnA0MTAuYwpAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBURlA0MTBfQ1RMXzJfTURJCSgxPDwwKQogCiAjZGVmaW5lIFRGUDQxMF9DVExfMwkJMHgwQQotI2RlZmluZSBURlA0MTBfQ1RMXzNfREtfTUFTSyAJKDB4Nzw8NSkKKyNkZWZpbmUgVEZQNDEwX0NUTF8zX0RLX01BU0sJKDB4Nzw8NSkKICNkZWZpbmUgVEZQNDEwX0NUTF8zX0RLCQkoMTw8NSkKICNkZWZpbmUgVEZQNDEwX0NUTF8zX0RLRU4JKDE8PDQpCiAjZGVmaW5lIFRGUDQxMF9DVExfM19DVExfTUFTSwkoMHg3PDwxKQpAQCAtMjI1LDEyICsyMjUsMTIgQEAKIAkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCSAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKLSAgICAvKiBBcyBsb25nIGFzIHRoZSBiYXNpY3MgYXJlIHNldCB1cCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjbG9jayBkZXBlbmRlbmNpZXMKLSAgICAgKiBpbiB0aGUgbW9kZSBzZXR1cCwgd2UgY2FuIGp1c3QgbGVhdmUgdGhlIHJlZ2lzdGVycyBhbG9uZSBhbmQgZXZlcnl0aGluZwotICAgICAqIHdpbGwgd29yayBmaW5lLgotICAgICAqLwotICAgIC8qIGRvbid0IGRvIG11Y2ggKi8KLSAgICByZXR1cm47CisJLyogQXMgbG9uZyBhcyB0aGUgYmFzaWNzIGFyZSBzZXQgdXAsIHNpbmNlIHdlIGRvbid0IGhhdmUgY2xvY2sgZGVwZW5kZW5jaWVzCisJKiBpbiB0aGUgbW9kZSBzZXR1cCwgd2UgY2FuIGp1c3QgbGVhdmUgdGhlIHJlZ2lzdGVycyBhbG9uZSBhbmQgZXZlcnl0aGluZworCSogd2lsbCB3b3JrIGZpbmUuCisJKi8KKwkvKiBkb24ndCBkbyBtdWNoICovCisJcmV0dXJuOwogfQogCiAvKiBzZXQgdGhlIHRmcDQxMCBwb3dlciBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCAzYzM5NWE1Li40ZjQwZjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCkBAIC05OCwxMiArOTksMTIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmdldF90aWxpbmdfZmxhZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotICAgIHN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBJOTE1X1RJTElOR19OT05FOiByZXR1cm4gIiAiOwotICAgIGNhc2UgSTkxNV9USUxJTkdfWDogcmV0dXJuICJYIjsKLSAgICBjYXNlIEk5MTVfVElMSU5HX1k6IHJldHVybiAiWSI7Ci0gICAgfQorCXN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgeworCWRlZmF1bHQ6CisJY2FzZSBJOTE1X1RJTElOR19OT05FOiByZXR1cm4gIiAiOworCWNhc2UgSTkxNV9USUxJTkdfWDogcmV0dXJuICJYIjsKKwljYXNlIEk5MTVfVElMSU5HX1k6IHJldHVybiAiWSI7CisJfQogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfbGV2ZWxfc3RyKGludCB0eXBlKQpAQCAtMjE3LDcgKzIxOCw3IEBACiAJCQkrK21hcHBhYmxlX2NvdW50OyBcCiAJCX0gXAogCX0gXAotfSB3aGlsZSgwKQorfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3RfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQqIGRhdGEpCiB7CkBAIC0xMjkzLDEyICsxMjk0LDEyIEBACiAJY2hhciBidWZbODBdOwogCWludCBsZW47CiAKLQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZiAoYnVmKSwKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAogCQkgICAgICAgIndlZGdlZCA6ICAlZFxuIiwKIAkJICAgICAgIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7CiAKLQlpZiAobGVuID4gc2l6ZW9mIChidWYpKQotCQlsZW4gPSBzaXplb2YgKGJ1Zik7CisJaWYgKGxlbiA+IHNpemVvZihidWYpKQorCQlsZW4gPSBzaXplb2YoYnVmKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBtYXgsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KQEAgLTEzMTQsNyArMTMxNSw3IEBACiAJaW50IHZhbCA9IDE7CiAKIAlpZiAoY250ID4gMCkgewotCQlpZiAoY250ID4gc2l6ZW9mIChidWYpIC0gMSkKKwkJaWYgKGNudCA+IHNpemVvZihidWYpIC0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGNudCkpCkBAIC0xMzU3LDExICsxMzU4LDExIEBACiAJY2hhciBidWZbODBdOwogCWludCBsZW47CiAKLQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZiAoYnVmKSwKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAogCQkgICAgICAgIm1heCBmcmVxOiAlZFxuIiwgZGV2X3ByaXYtPm1heF9kZWxheSAqIDUwKTsKIAotCWlmIChsZW4gPiBzaXplb2YgKGJ1ZikpCi0JCWxlbiA9IHNpemVvZiAoYnVmKTsKKwlpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCisJCWxlbiA9IHNpemVvZihidWYpOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIG1heCwgcHBvcywgYnVmLCBsZW4pOwogfQpAQCAtMTM3OCw3ICsxMzc5LDcgQEAKIAlpbnQgdmFsID0gMTsKIAogCWlmIChjbnQgPiAwKSB7Ci0JCWlmIChjbnQgPiBzaXplb2YgKGJ1ZikgLSAxKQorCQlpZiAoY250ID4gc2l6ZW9mKGJ1ZikgLSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkKQEAgLTE0MzIsMTIgKzE0MzMsMTIgQEAKIAlzbnBjciA9IEk5MTVfUkVBRChHRU42X01CQ1VOSVRfU05QQ1IpOwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRldi0+c3RydWN0X211dGV4KTsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIChidWYpLAorCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCiAJCSAgICAgICAiJWRcbiIsIChzbnBjciAmIEdFTjZfTUJDX1NOUENSX01BU0spID4+CiAJCSAgICAgICBHRU42X01CQ19TTlBDUl9TSElGVCk7CiAKLQlpZiAobGVuID4gc2l6ZW9mIChidWYpKQotCQlsZW4gPSBzaXplb2YgKGJ1Zik7CisJaWYgKGxlbiA+IHNpemVvZihidWYpKQorCQlsZW4gPSBzaXplb2YoYnVmKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBtYXgsIHBwb3MsIGJ1ZiwgbGVuKTsKIH0KQEAgLTE0NTUsNyArMTQ1Niw3IEBACiAJaW50IHZhbCA9IDE7CiAKIAlpZiAoY250ID4gMCkgewotCQlpZiAoY250ID4gc2l6ZW9mIChidWYpIC0gMSkKKwkJaWYgKGNudCA+IHNpemVvZihidWYpIC0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGNudCkpCkBAIC0xNTA1LDcgKzE1MDYsMTAgQEAKIAlub2RlLT5taW5vciA9IG1pbm9yOwogCW5vZGUtPmRlbnQgPSBlbnQ7CiAJbm9kZS0+aW5mb19lbnQgPSAodm9pZCAqKSBrZXk7Ci0JbGlzdF9hZGQoJm5vZGUtPmxpc3QsICZtaW5vci0+ZGVidWdmc19ub2Rlcy5saXN0KTsKKworCW11dGV4X2xvY2soJm1pbm9yLT5kZWJ1Z2ZzX2xvY2spOworCWxpc3RfYWRkKCZub2RlLT5saXN0LCAmbWlub3ItPmRlYnVnZnNfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtaW5vci0+ZGVidWdmc19sb2NrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKaW5kZXggOGEzOTQyYy4uYTk1MzNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvdmdhX3N3aXRjaGVyb28uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YWNwaS92aWRlby5oPgogCiBzdGF0aWMgdm9pZCBpOTE1X3dyaXRlX2h3c19wZ2Eoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTg4NCw3ICs4ODUsNyBAQAogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlkZXZfcHJpdi0+YnJpZGdlX2RldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIFBDSV9ERVZGTigwLDApKTsKKwlkZXZfcHJpdi0+YnJpZGdlX2RldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIFBDSV9ERVZGTigwLCAwKSk7CiAJaWYgKCFkZXZfcHJpdi0+YnJpZGdlX2RldikgewogCQlEUk1fRVJST1IoImJyaWRnZSBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTczMCwxMCArMTczMSwxMCBAQAogICovCiB1bnNpZ25lZCBsb25nIGk5MTVfcmVhZF9tY2hfdmFsKHZvaWQpCiB7Ci0gIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OwogCXVuc2lnbmVkIGxvbmcgY2hpcHNldF92YWwsIGdyYXBoaWNzX3ZhbCwgcmV0ID0gMDsKIAotICAJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CiAJaWYgKCFpOTE1X21jaF9kZXYpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlkZXZfcHJpdiA9IGk5MTVfbWNoX2RldjsKQEAgLTE3NDQsOSArMTc0NSw5IEBACiAJcmV0ID0gY2hpcHNldF92YWwgKyBncmFwaGljc192YWw7CiAKIG91dF91bmxvY2s6Ci0gIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CiAKLSAgCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGk5MTVfcmVhZF9tY2hfdmFsKTsKIApAQCAtMTc1NywxMCArMTc1OCwxMCBAQAogICovCiBib29sIGk5MTVfZ3B1X3JhaXNlKHZvaWQpCiB7Ci0gIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OwogCWJvb2wgcmV0ID0gdHJ1ZTsKIAotICAJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl9sb2NrKCZtY2hkZXZfbG9jayk7CiAJaWYgKCFpOTE1X21jaF9kZXYpIHsKIAkJcmV0ID0gZmFsc2U7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTE3NzEsOSArMTc3Miw5IEBACiAJCWRldl9wcml2LT5tYXhfZGVsYXktLTsKIAogb3V0X3VubG9jazoKLSAgCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CisJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKIAotICAJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaTkxNV9ncHVfcmFpc2UpOwogCkBAIC0xNzg1LDEwICsxNzg2LDEwIEBACiAgKi8KIGJvb2wgaTkxNV9ncHVfbG93ZXIodm9pZCkKIHsKLSAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAJYm9vbCByZXQgPSB0cnVlOwogCi0gIAlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKIAlpZiAoIWk5MTVfbWNoX2RldikgewogCQlyZXQgPSBmYWxzZTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTc5OSw5ICsxODAwLDkgQEAKIAkJZGV2X3ByaXYtPm1heF9kZWxheSsrOwogCiBvdXRfdW5sb2NrOgotICAJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOwogCi0gIAlyZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpOTE1X2dwdV9sb3dlcik7CiAKQEAgLTE4MTIsMTAgKzE4MTMsMTAgQEAKICAqLwogYm9vbCBpOTE1X2dwdV9idXN5KHZvaWQpCiB7Ci0gIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKLSAgCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fbG9jaygmbWNoZGV2X2xvY2spOwogCWlmICghaTkxNV9tY2hfZGV2KQogCQlnb3RvIG91dF91bmxvY2s7CiAJZGV2X3ByaXYgPSBpOTE1X21jaF9kZXY7CkBAIC0xODIzLDkgKzE4MjQsOSBAQAogCXJldCA9IGRldl9wcml2LT5idXN5OwogCiBvdXRfdW5sb2NrOgotICAJc3Bpbl91bmxvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOwogCi0gIAlyZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpOTE1X2dwdV9idXN5KTsKIApAQCAtMTgzNywxMCArMTgzOCwxMCBAQAogICovCiBib29sIGk5MTVfZ3B1X3R1cmJvX2Rpc2FibGUodm9pZCkKIHsKLSAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAJYm9vbCByZXQgPSB0cnVlOwogCi0gIAlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKKwlzcGluX2xvY2soJm1jaGRldl9sb2NrKTsKIAlpZiAoIWk5MTVfbWNoX2RldikgewogCQlyZXQgPSBmYWxzZTsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTg1Myw5ICsxODU0LDkgQEAKIAkJcmV0ID0gZmFsc2U7CiAKIG91dF91bmxvY2s6Ci0gIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOworCXNwaW5fdW5sb2NrKCZtY2hkZXZfbG9jayk7CiAKLSAgCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGk5MTVfZ3B1X3R1cmJvX2Rpc2FibGUpOwogCkBAIC0xOTQ4LDcgKzE5NDksNyBAQAogCiAJYWdwX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfbWFwcGFibGVfZW50cmllcyA8PCBQQUdFX1NISUZUOwogCi0gICAgICAgIGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyA9CisJZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nID0KIAkJaW9fbWFwcGluZ19jcmVhdGVfd2MoZGV2LT5hZ3AtPmJhc2UsIGFncF9zaXplKTsKIAlpZiAoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nID09IE5VTEwpIHsKIAkJcmV0ID0gLUVJTzsKQEAgLTIwMzUsNyArMjAzNiw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5lcnJvcl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPnJwc19sb2NrKTsKIAotCWlmIChJU19NT0JJTEUoZGV2KSB8fCAhSVNfR0VOMihkZXYpKQorCWlmIChJU19JVllCUklER0UoZGV2KSkKKwkJZGV2X3ByaXYtPm51bV9waXBlID0gMzsKKwllbHNlIGlmIChJU19NT0JJTEUoZGV2KSB8fCAhSVNfR0VOMihkZXYpKQogCQlkZXZfcHJpdi0+bnVtX3BpcGUgPSAyOwogCWVsc2UKIAkJZGV2X3ByaXYtPm51bV9waXBlID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCmluZGV4IGYwN2U0MjUuLmU5YzJjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImludGVsX2Rydi5oIgogCiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgogCiBzdGF0aWMgaW50IGk5MTVfbW9kZXNldCBfX3JlYWRfbW9zdGx5ID0gLTE7CkBAIC03OSwxMSArODAsMTEgQEAKIAkJIlVzZSBwYW5lbCAoTFZEUy9lRFApIGRvd25jbG9ja2luZyBmb3IgcG93ZXIgc2F2aW5ncyAiCiAJCSIoZGVmYXVsdDogZmFsc2UpIik7CiAKLXVuc2lnbmVkIGludCBpOTE1X3BhbmVsX3VzZV9zc2MgX19yZWFkX21vc3RseSA9IDE7Cit1bnNpZ25lZCBpbnQgaTkxNV9wYW5lbF91c2Vfc3NjIF9fcmVhZF9tb3N0bHkgPSAtMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChsdmRzX3VzZV9zc2MsIGk5MTVfcGFuZWxfdXNlX3NzYywgaW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobHZkc191c2Vfc3NjLAogCQkiVXNlIFNwcmVhZCBTcGVjdHJ1bSBDbG9jayB3aXRoIHBhbmVscyBbTFZEUy9lRFBdICIKLQkJIihkZWZhdWx0OiB0cnVlKSIpOworCQkiKGRlZmF1bHQ6IGF1dG8gZnJvbSBWQlQpIik7CiAKIGludCBpOTE1X3ZidF9zZHZvX3BhbmVsX3R5cGUgX19yZWFkX21vc3RseSA9IC0xOwogbW9kdWxlX3BhcmFtX25hbWVkKHZidF9zZHZvX3BhbmVsX3R5cGUsIGk5MTVfdmJ0X3Nkdm9fcGFuZWxfdHlwZSwgaW50LCAwNjAwKTsKQEAgLTI5NCw3ICsyOTUsNyBAQAogI2RlZmluZSBJTlRFTF9QQ0hfQ1BUX0RFVklDRV9JRF9UWVBFCTB4MWMwMAogI2RlZmluZSBJTlRFTF9QQ0hfUFBUX0RFVklDRV9JRF9UWVBFCTB4MWUwMAogCi12b2lkIGludGVsX2RldGVjdF9wY2ggKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkIGludGVsX2RldGVjdF9wY2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBwY2lfZGV2ICpwY2g7CkBAIC0zNzcsNyArMzc4LDcgQEAKIAogdm9pZCBfX2dlbjZfZ3Rfd2FpdF9mb3JfZmlmbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7Ci0JaWYgKGRldl9wcml2LT5ndF9maWZvX2NvdW50IDwgR1RfRklGT19OVU1fUkVTRVJWRURfRU5UUklFUyApIHsKKwlpZiAoZGV2X3ByaXYtPmd0X2ZpZm9fY291bnQgPCBHVF9GSUZPX05VTV9SRVNFUlZFRF9FTlRSSUVTKSB7CiAJCWludCBsb29wID0gNTAwOwogCQl1MzIgZmlmbyA9IEk5MTVfUkVBRF9OT1RSQUNFKEdUX0ZJRk9fRlJFRV9FTlRSSUVTKTsKIAkJd2hpbGUgKGZpZm8gPD0gR1RfRklGT19OVU1fUkVTRVJWRURfRU5UUklFUyAmJiBsb29wLS0pIHsKQEAgLTQ3MSw2ICs0NzIsOSBAQAogCQllcnJvciA9IGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihkZXYpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAorCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQorCQkJaXJvbmxha2VfaW5pdF9wY2hfcmVmY2xrKGRldik7CisKIAkJZHJtX21vZGVfY29uZmlnX3Jlc2V0KGRldik7CiAJCWRybV9pcnFfaW5zdGFsbChkZXYpOwogCkBAIC03NzAsMTIgKzc3NCwxMiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaTkxNV9wbV9vcHMgPSB7Ci0gICAgIC5zdXNwZW5kID0gaTkxNV9wbV9zdXNwZW5kLAotICAgICAucmVzdW1lID0gaTkxNV9wbV9yZXN1bWUsCi0gICAgIC5mcmVlemUgPSBpOTE1X3BtX2ZyZWV6ZSwKLSAgICAgLnRoYXcgPSBpOTE1X3BtX3RoYXcsCi0gICAgIC5wb3dlcm9mZiA9IGk5MTVfcG1fcG93ZXJvZmYsCi0gICAgIC5yZXN0b3JlID0gaTkxNV9wbV9yZXN1bWUsCisJLnN1c3BlbmQgPSBpOTE1X3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IGk5MTVfcG1fcmVzdW1lLAorCS5mcmVlemUgPSBpOTE1X3BtX2ZyZWV6ZSwKKwkudGhhdyA9IGk5MTVfcG1fdGhhdywKKwkucG93ZXJvZmYgPSBpOTE1X3BtX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0gaTkxNV9wbV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGk5MTVfZ2VtX3ZtX29wcyA9IHsKQEAgLTc4NSw4ICs3ODksOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlciA9IHsKLQkvKiBkb24ndCB1c2UgbXRycidzIGhlcmUsIHRoZSBYc2VydmVyIG9yIHVzZXIgc3BhY2UgYXBwIHNob3VsZAotCSAqIGRlYWwgd2l0aCB0aGVtIGZvciBpbnRlbCBoYXJkd2FyZS4KKwkvKiBEb24ndCB1c2UgTVRSUnMgaGVyZTsgdGhlIFhzZXJ2ZXIgb3IgdXNlcnNwYWNlIGFwcCBzaG91bGQKKwkgKiBkZWFsIHdpdGggdGhlbSBmb3IgSW50ZWwgaGFyZHdhcmUuCiAJICovCiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgLyogRFJJVkVSX1VTRV9NVFJSIHwqLwpAQCAtODk1LDMgKzg5OSw0MyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOworCisvKiBXZSBnaXZlIGZhc3QgcGF0aHMgZm9yIHRoZSByZWFsbHkgY29vbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTkVFRFNfRk9SQ0VfV0FLRShkZXZfcHJpdiwgcmVnKSBcCisJKCgoZGV2X3ByaXYpLT5pbmZvLT5nZW4gPj0gNikgJiYgXAorCSgocmVnKSA8IDB4NDAwMDApICYmIFwKKwkoKHJlZykgIT0gRk9SQ0VXQUtFKSkKKworI2RlZmluZSBfX2k5MTVfcmVhZCh4LCB5KSBcCit1IyN4IGk5MTVfcmVhZCMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpIHsgXAorCXUjI3ggdmFsID0gMDsgXAorCWlmIChORUVEU19GT1JDRV9XQUtFKChkZXZfcHJpdiksIChyZWcpKSkgeyBcCisJCWdlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOyBcCisJCXZhbCA9IHJlYWQjI3koZGV2X3ByaXYtPnJlZ3MgKyByZWcpOyBcCisJCWdlbjZfZ3RfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOyBcCisJfSBlbHNlIHsgXAorCQl2YWwgPSByZWFkIyN5KGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAorCX0gXAorCXRyYWNlX2k5MTVfcmVnX3J3KGZhbHNlLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCisJcmV0dXJuIHZhbDsgXAorfQorCitfX2k5MTVfcmVhZCg4LCBiKQorX19pOTE1X3JlYWQoMTYsIHcpCitfX2k5MTVfcmVhZCgzMiwgbCkKK19faTkxNV9yZWFkKDY0LCBxKQorI3VuZGVmIF9faTkxNV9yZWFkCisKKyNkZWZpbmUgX19pOTE1X3dyaXRlKHgsIHkpIFwKK3ZvaWQgaTkxNV93cml0ZSMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUjI3ggdmFsKSB7IFwKKwl0cmFjZV9pOTE1X3JlZ19ydyh0cnVlLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCisJaWYgKE5FRURTX0ZPUkNFX1dBS0UoKGRldl9wcml2KSwgKHJlZykpKSB7IFwKKwkJX19nZW42X2d0X3dhaXRfZm9yX2ZpZm8oZGV2X3ByaXYpOyBcCisJfSBcCisJd3JpdGUjI3kodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7IFwKK30KK19faTkxNV93cml0ZSg4LCBiKQorX19pOTE1X3dyaXRlKDE2LCB3KQorX19pOTE1X3dyaXRlKDMyLCBsKQorX19pOTE1X3dyaXRlKDY0LCBxKQorI3VuZGVmIF9faTkxNV93cml0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggNzkxNmJkOS4uMDZhMzdmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0xMzksNyArMTM5LDYgQEAKIAl1OCBzbGF2ZV9hZGRyOwogCXU4IGR2b193aXJpbmc7CiAJdTggaTJjX3BpbjsKLQl1OCBpMmNfc3BlZWQ7CiAJdTggZGRjX3BpbjsKIH07CiAKQEAgLTIwOSw2ICsyMDgsOCBAQAogCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwKIAkJCSAgICAgaW50IHgsIGludCB5LAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpOworCXZvaWQgKCp3cml0ZV9lbGQpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgIHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAoKmZkaV9saW5rX3RyYWluKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogCXZvaWQgKCppbml0X2Nsb2NrX2dhdGluZykoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJdm9pZCAoKmluaXRfcGNoX2Nsb2NrX2dhdGluZykoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC0yMjYsMjYgKzIyNywyNiBAQAogCiBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gewogCXU4IGdlbjsKLQl1OCBpc19tb2JpbGUgOiAxOwotCXU4IGlzX2k4NXggOiAxOwotCXU4IGlzX2k5MTVnIDogMTsKLQl1OCBpc19pOTQ1Z20gOiAxOwotCXU4IGlzX2czMyA6IDE7Ci0JdTggbmVlZF9nZnhfaHdzIDogMTsKLQl1OCBpc19nNHggOiAxOwotCXU4IGlzX3BpbmV2aWV3IDogMTsKLQl1OCBpc19icm9hZHdhdGVyIDogMTsKLQl1OCBpc19jcmVzdGxpbmUgOiAxOwotCXU4IGlzX2l2eWJyaWRnZSA6IDE7Ci0JdTggaGFzX2ZiYyA6IDE7Ci0JdTggaGFzX3BpcGVfY3hzciA6IDE7Ci0JdTggaGFzX2hvdHBsdWcgOiAxOwotCXU4IGN1cnNvcl9uZWVkc19waHlzaWNhbCA6IDE7Ci0JdTggaGFzX292ZXJsYXkgOiAxOwotCXU4IG92ZXJsYXlfbmVlZHNfcGh5c2ljYWwgOiAxOwotCXU4IHN1cHBvcnRzX3R2IDogMTsKLQl1OCBoYXNfYnNkX3JpbmcgOiAxOwotCXU4IGhhc19ibHRfcmluZyA6IDE7CisJdTggaXNfbW9iaWxlOjE7CisJdTggaXNfaTg1eDoxOworCXU4IGlzX2k5MTVnOjE7CisJdTggaXNfaTk0NWdtOjE7CisJdTggaXNfZzMzOjE7CisJdTggbmVlZF9nZnhfaHdzOjE7CisJdTggaXNfZzR4OjE7CisJdTggaXNfcGluZXZpZXc6MTsKKwl1OCBpc19icm9hZHdhdGVyOjE7CisJdTggaXNfY3Jlc3RsaW5lOjE7CisJdTggaXNfaXZ5YnJpZGdlOjE7CisJdTggaGFzX2ZiYzoxOworCXU4IGhhc19waXBlX2N4c3I6MTsKKwl1OCBoYXNfaG90cGx1ZzoxOworCXU4IGN1cnNvcl9uZWVkc19waHlzaWNhbDoxOworCXU4IGhhc19vdmVybGF5OjE7CisJdTggb3ZlcmxheV9uZWVkc19waHlzaWNhbDoxOworCXU4IHN1cHBvcnRzX3R2OjE7CisJdTggaGFzX2JzZF9yaW5nOjE7CisJdTggaGFzX2JsdF9yaW5nOjE7CiB9OwogCiBlbnVtIG5vX2ZiY19yZWFzb24gewpAQCAtMzQ3LDcgKzM0OCw2IEBACiAJLyogTFZEUyBpbmZvICovCiAJaW50IGJhY2tsaWdodF9sZXZlbDsgIC8qIHJlc3RvcmUgYmFja2xpZ2h0IHRvIHRoaXMgdmFsdWUgKi8KIAlib29sIGJhY2tsaWdodF9lbmFibGVkOwotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpsZnBfbHZkc192YnRfbW9kZTsgLyogaWYgYW55ICovCiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnNkdm9fbHZkc192YnRfbW9kZTsgLyogaWYgYW55ICovCiAKQEAgLTM1Nyw2ICszNTcsNyBAQAogCXVuc2lnbmVkIGludCBsdmRzX3ZidDoxOwogCXVuc2lnbmVkIGludCBpbnRfY3J0X3N1cHBvcnQ6MTsKIAl1bnNpZ25lZCBpbnQgbHZkc191c2Vfc3NjOjE7CisJdW5zaWduZWQgaW50IGRpc3BsYXlfY2xvY2tfbW9kZToxOwogCWludCBsdmRzX3NzY19mcmVxOwogCXN0cnVjdCB7CiAJCWludCByYXRlOwpAQCAtNjcyLDEwICs2NzMsOSBAQAogCXVuc2lnbmVkIGludCBsdmRzX2JvcmRlcl9iaXRzOwogCS8qIFBhbmVsIGZpdHRlciBwbGFjZW1lbnQgYW5kIHNpemUgZm9yIElyb25sYWtlKyAqLwogCXUzMiBwY2hfcGZfcG9zLCBwY2hfcGZfc2l6ZTsKLQlpbnQgcGFuZWxfdDMsIHBhbmVsX3QxMjsKIAotCXN0cnVjdCBkcm1fY3J0YyAqcGxhbmVfdG9fY3J0Y19tYXBwaW5nWzJdOwotCXN0cnVjdCBkcm1fY3J0YyAqcGlwZV90b19jcnRjX21hcHBpbmdbMl07CisJc3RydWN0IGRybV9jcnRjICpwbGFuZV90b19jcnRjX21hcHBpbmdbM107CisJc3RydWN0IGRybV9jcnRjICpwaXBlX3RvX2NydGNfbWFwcGluZ1szXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBwZW5kaW5nX2ZsaXBfcXVldWU7CiAJYm9vbCBmbGlwX3BlbmRpbmdfaXNfZG9uZTsKIApAQCAtNzU5LDE5ICs3NTksMTkgQEAKIAkgKiAoaGFzIHBlbmRpbmcgcmVuZGVyaW5nKSwgYW5kIGlzIG5vdCBzZXQgaWYgaXQncyBvbiBpbmFjdGl2ZSAocmVhZHkKIAkgKiB0byBiZSB1bmJvdW5kKS4KIAkgKi8KLQl1bnNpZ25lZCBpbnQgYWN0aXZlIDogMTsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlOjE7CiAKIAkvKioKIAkgKiBUaGlzIGlzIHNldCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgbGFzdCBib3VuZAogCSAqIHRvIHRoZSBHVFQKIAkgKi8KLQl1bnNpZ25lZCBpbnQgZGlydHkgOiAxOworCXVuc2lnbmVkIGludCBkaXJ0eToxOwogCiAJLyoqCiAJICogVGhpcyBpcyBzZXQgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiB3cml0dGVuIHRvIHNpbmNlIHRoZSBsYXN0CiAJICogR1BVIGZsdXNoLgogCSAqLwotCXVuc2lnbmVkIGludCBwZW5kaW5nX2dwdV93cml0ZSA6IDE7CisJdW5zaWduZWQgaW50IHBlbmRpbmdfZ3B1X3dyaXRlOjE7CiAKIAkvKioKIAkgKiBGZW5jZSByZWdpc3RlciBiaXRzIChpZiBhbnkpIGZvciB0aGlzIG9iamVjdC4gIFdpbGwgYmUgc2V0CkBAIC03ODAsMTggKzc4MCwxOCBAQAogCSAqCiAJICogU2l6ZTogNCBiaXRzIGZvciAxNiBmZW5jZXMgKyBzaWduIChmb3IgRkVOQ0VfUkVHX05PTkUpCiAJICovCi0Jc2lnbmVkIGludCBmZW5jZV9yZWcgOiA1OworCXNpZ25lZCBpbnQgZmVuY2VfcmVnOjU7CiAKIAkvKioKIAkgKiBBZHZpY2U6IGFyZSB0aGUgYmFja2luZyBwYWdlcyBwdXJnZWFibGU/CiAJICovCi0JdW5zaWduZWQgaW50IG1hZHYgOiAyOworCXVuc2lnbmVkIGludCBtYWR2OjI7CiAKIAkvKioKIAkgKiBDdXJyZW50IHRpbGluZyBtb2RlIGZvciB0aGUgb2JqZWN0LgogCSAqLwotCXVuc2lnbmVkIGludCB0aWxpbmdfbW9kZSA6IDI7Ci0JdW5zaWduZWQgaW50IHRpbGluZ19jaGFuZ2VkIDogMTsKKwl1bnNpZ25lZCBpbnQgdGlsaW5nX21vZGU6MjsKKwl1bnNpZ25lZCBpbnQgdGlsaW5nX2NoYW5nZWQ6MTsKIAogCS8qKiBIb3cgbWFueSB1c2VycyBoYXZlIHBpbm5lZCB0aGlzIG9iamVjdCBpbiBHVFQgc3BhY2UuIFRoZSBmb2xsb3dpbmcKIAkgKiB1c2VycyBjYW4gZWFjaCBob2xkIGF0IG1vc3Qgb25lIHJlZmVyZW5jZTogcHdyaXRlL3ByZWFkLCBwaW5faW9jdGwKQEAgLTgwMiwyMiArODAyLDIyIEBACiAJICoKIAkgKiBJbiB0aGUgd29yc3QgY2FzZSB0aGlzIGlzIDEgKyAxICsgMSArIDIqMiA9IDcuIFRoYXQgd291bGQgZml0IGludG8gMwogCSAqIGJpdHMgd2l0aCBhYnNvbHV0ZWx5IG5vIGhlYWRyb29tLiBTbyB1c2UgNCBiaXRzLiAqLwotCXVuc2lnbmVkIGludCBwaW5fY291bnQgOiA0OworCXVuc2lnbmVkIGludCBwaW5fY291bnQ6NDsKICNkZWZpbmUgRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUElOX0NPVU5UIDB4ZgogCiAJLyoqCiAJICogSXMgdGhlIG9iamVjdCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgZ3R0IG1hcHBhYmxlIGFuZAogCSAqIGZlbmNlYWJsZT8gVXNlZCB0byBhdm9pZCBjb3N0bHkgcmVjYWxjdWxhdGlvbnMuCiAJICovCi0JdW5zaWduZWQgaW50IG1hcF9hbmRfZmVuY2VhYmxlIDogMTsKKwl1bnNpZ25lZCBpbnQgbWFwX2FuZF9mZW5jZWFibGU6MTsKIAogCS8qKgogCSAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgZ3R0IG1hcHBpbmcgbmVlZHMgdG8gYmUgbWFwcGFibGUgKGFuZCBpc24ndCBqdXN0CiAJICogbWFwcGFibGUgYnkgYWNjaWRlbnQpLiBUcmFjayBwaW4gYW5kIGZhdWx0IHNlcGFyYXRlIGZvciBhIG1vcmUKIAkgKiBhY2N1cmF0ZSBtYXBwYWJsZSB3b3JraW5nIHNldC4KIAkgKi8KLQl1bnNpZ25lZCBpbnQgZmF1bHRfbWFwcGFibGUgOiAxOwotCXVuc2lnbmVkIGludCBwaW5fbWFwcGFibGUgOiAxOworCXVuc2lnbmVkIGludCBmYXVsdF9tYXBwYWJsZToxOworCXVuc2lnbmVkIGludCBwaW5fbWFwcGFibGU6MTsKIAogCS8qCiAJICogSXMgdGhlIEdQVSBjdXJyZW50bHkgdXNpbmcgYSBmZW5jZSB0byBhY2Nlc3MgdGhpcyBidWZmZXIsCkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogdm9pZAogaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIGludCBwaXBlLCB1MzIgbWFzayk7CiAKLXZvaWQgaW50ZWxfZW5hYmxlX2FzbGUgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwordm9pZCBpbnRlbF9lbmFibGVfYXNsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogI2lmZGVmIENPTkZJR19ERUJVR19GUwogZXh0ZXJuIHZvaWQgaTkxNV9kZXN0cm95X2Vycm9yX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIGludCBpOTE1X2dlbV9tbWFwX2d0dChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJICAgICAgdWludDMyX3QgaGFuZGxlLCB1aW50NjRfdCAqb2Zmc2V0KTsKIGludCBpOTE1X2dlbV9kdW1iX2Rlc3Ryb3koc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgIHVpbnQzMl90IGhhbmRsZSk7CQkJICAKKwkJCSAgdWludDMyX3QgaGFuZGxlKTsKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHNlcTEgaXMgbGF0ZXIgdGhhbiBzZXEyLgogICovCkBAIC0xMzAxLDEwICsxMzAxLDExIEBACiBleHRlcm4gYm9vbCBpbnRlbF9mYmNfZW5hYmxlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGJvb2wgaXJvbmxha2Vfc2V0X2RycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggdmFsKTsKK2V4dGVybiB2b2lkIGlyb25sYWtlX2luaXRfcGNoX3JlZmNsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGlyb25sYWtlX2VuYWJsZV9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBnZW42X3NldF9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggdmFsKTsKLWV4dGVybiB2b2lkIGludGVsX2RldGVjdF9wY2ggKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCBpbnRlbF90cmFuc19kcF9wb3J0X3NlbCAoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK2V4dGVybiB2b2lkIGludGVsX2RldGVjdF9wY2goc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGludGVsX3RyYW5zX2RwX3BvcnRfc2VsKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAKIC8qIG92ZXJsYXkgKi8KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKQEAgLTEzNTQsMTggKzEzNTUsNyBAQAogCSgocmVnKSAhPSBGT1JDRVdBS0UpKQogCiAjZGVmaW5lIF9faTkxNV9yZWFkKHgsIHkpIFwKLXN0YXRpYyBpbmxpbmUgdSMjeCBpOTE1X3JlYWQjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnKSB7IFwKLQl1IyN4IHZhbCA9IDA7IFwKLQlpZiAoTkVFRFNfRk9SQ0VfV0FLRSgoZGV2X3ByaXYpLCAocmVnKSkpIHsgXAotCQlnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsgXAotCQl2YWwgPSByZWFkIyN5KGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAotCQlnZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsgXAotCX0gZWxzZSB7IFwKLQkJdmFsID0gcmVhZCMjeShkZXZfcHJpdi0+cmVncyArIHJlZyk7IFwKLQl9IFwKLQl0cmFjZV9pOTE1X3JlZ19ydyhmYWxzZSwgcmVnLCB2YWwsIHNpemVvZih2YWwpKTsgXAotCXJldHVybiB2YWw7IFwKLX0KKwl1IyN4IGk5MTVfcmVhZCMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpOwogCiBfX2k5MTVfcmVhZCg4LCBiKQogX19pOTE1X3JlYWQoMTYsIHcpCkBAIC0xMzc0LDEzICsxMzY0LDggQEAKICN1bmRlZiBfX2k5MTVfcmVhZAogCiAjZGVmaW5lIF9faTkxNV93cml0ZSh4LCB5KSBcCi1zdGF0aWMgaW5saW5lIHZvaWQgaTkxNV93cml0ZSMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUjI3ggdmFsKSB7IFwKLQl0cmFjZV9pOTE1X3JlZ19ydyh0cnVlLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCi0JaWYgKE5FRURTX0ZPUkNFX1dBS0UoKGRldl9wcml2KSwgKHJlZykpKSB7IFwKLQkJX19nZW42X2d0X3dhaXRfZm9yX2ZpZm8oZGV2X3ByaXYpOyBcCi0JfSBcCi0Jd3JpdGUjI3kodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7IFwKLX0KKwl2b2lkIGk5MTVfd3JpdGUjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1IyN4IHZhbCk7CisKIF9faTkxNV93cml0ZSg4LCBiKQogX19pOTE1X3dyaXRlKDE2LCB3KQogX19pOTE1X3dyaXRlKDMyLCBsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggYTU0NmE3MS4uZDE4YjA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCWFyZ3MtPmFwZXJfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHRfdG90YWw7Ci0JYXJncy0+YXBlcl9hdmFpbGFibGVfc2l6ZSA9IGFyZ3MtPmFwZXJfc2l6ZSAtcGlubmVkOworCWFyZ3MtPmFwZXJfYXZhaWxhYmxlX3NpemUgPSBhcmdzLT5hcGVyX3NpemUgLSBwaW5uZWQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5NSw2ICsxOTUsOCBAQAogCXUzMiBoYW5kbGU7CiAKIAlzaXplID0gcm91bmR1cChzaXplLCBQQUdFX1NJWkUpOworCWlmIChzaXplID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQWxsb2NhdGUgdGhlIG5ldyBvYmplY3QgKi8KIAlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCBzaXplKTsKQEAgLTgwMCwxMSArODAyLDExIEBACiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKIAotCQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2YWRkciArIHBhZ2Vfb2Zmc2V0LAogCQkJCQkJdXNlcl9kYXRhLAogCQkJCQkJcGFnZV9sZW5ndGgpOwotCQlrdW5tYXBfYXRvbWljKHZhZGRyLCBLTV9VU0VSMCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIpOwogCiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CkBAIC0xMjY1LDc0ICsxMjY3LDYgQEAKIH0KIAogLyoqCi0gKiBpOTE1X2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQgLSBjcmVhdGUgYSBmYWtlIG1tYXAgb2Zmc2V0IGZvciBhbiBvYmplY3QKLSAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgotICoKLSAqIEdFTSBtZW1vcnkgbWFwcGluZyB3b3JrcyBieSBoYW5kaW5nIGJhY2sgdG8gdXNlcnNwYWNlIGEgZmFrZSBtbWFwIG9mZnNldAotICogaXQgY2FuIHVzZSBpbiBhIHN1YnNlcXVlbnQgbW1hcCgyKSBjYWxsLiAgVGhlIERSTSBjb3JlIGNvZGUgdGhlbiBsb29rcwotICogdXAgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgb2Zmc2V0IGFuZCBzZXRzIHVwIHRoZSB2YXJpb3VzIG1lbW9yeSBtYXBwaW5nCi0gKiBzdHJ1Y3R1cmVzLgotICoKLSAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYW5kIGF0dGFjaGVzIGEgZmFrZSBvZmZzZXQgZm9yIEBvYmouCi0gKi8KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0OwotCXN0cnVjdCBkcm1fbG9jYWxfbWFwICptYXA7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBTZXQgdGhlIG9iamVjdCB1cCBmb3IgbW1hcCdpbmcgKi8KLQlsaXN0ID0gJm9iai0+YmFzZS5tYXBfbGlzdDsKLQlsaXN0LT5tYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX21hcF9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsaXN0LT5tYXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWFwID0gbGlzdC0+bWFwOwotCW1hcC0+dHlwZSA9IF9EUk1fR0VNOwotCW1hcC0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOwotCW1hcC0+aGFuZGxlID0gb2JqOwotCi0JLyogR2V0IGEgRFJNIEdFTSBtbWFwIG9mZnNldCBhbGxvY2F0ZWQuLi4gKi8KLQlsaXN0LT5maWxlX29mZnNldF9ub2RlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZtbS0+b2Zmc2V0X21hbmFnZXIsCi0JCQkJCQkgICAgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsCi0JCQkJCQkgICAgMCwgMCk7Ci0JaWYgKCFsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG9mZnNldCBmb3IgYm8gJWRcbiIsCi0JCQkgIG9iai0+YmFzZS5uYW1lKTsKLQkJcmV0ID0gLUVOT1NQQzsKLQkJZ290byBvdXRfZnJlZV9saXN0OwotCX0KLQotCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fZ2V0X2Jsb2NrKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUsCi0JCQkJCQkgIG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFLAotCQkJCQkJICAwKTsKLQlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV9saXN0OwotCX0KLQotCWxpc3QtPmhhc2gua2V5ID0gbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZS0+c3RhcnQ7Ci0JcmV0ID0gZHJtX2h0X2luc2VydF9pdGVtKCZtbS0+b2Zmc2V0X2hhc2gsICZsaXN0LT5oYXNoKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGFkZCB0byBtYXAgaGFzaFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfbW07Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9mcmVlX21tOgotCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7Ci1vdXRfZnJlZV9saXN0OgotCWtmcmVlKGxpc3QtPm1hcCk7Ci0JbGlzdC0+bWFwID0gTlVMTDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgogICogaTkxNV9nZW1fcmVsZWFzZV9tbWFwIC0gcmVtb3ZlIHBoeXNpY2FsIHBhZ2UgbWFwcGluZ3MKICAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgogICoKQEAgLTEzNjAsMTkgKzEyOTQsNiBAQAogCW9iai0+ZmF1bHRfbWFwcGFibGUgPSBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdCA9ICZvYmotPmJhc2UubWFwX2xpc3Q7Ci0KLQlkcm1faHRfcmVtb3ZlX2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpOwotCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7Ci0Ja2ZyZWUobGlzdC0+bWFwKTsKLQlsaXN0LT5tYXAgPSBOVUxMOwotfQotCiBzdGF0aWMgdWludDMyX3QKIGk5MTVfZ2VtX2dldF9ndHRfc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBzaXplLCBpbnQgdGlsaW5nX21vZGUpCiB7CkBAIC0xNDc1LDcgKzEzOTYsNyBAQAogCiAJaWYgKG9iai0+YmFzZS5zaXplID4gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQpIHsKIAkJcmV0ID0gLUUyQklHOwotCQlnb3RvIHVubG9jazsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG9iai0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsKQEAgLTE0ODUsNyArMTQwNiw3IEBACiAJfQogCiAJaWYgKCFvYmotPmJhc2UubWFwX2xpc3QubWFwKSB7Ci0JCXJldCA9IGk5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChvYmopOworCQlyZXQgPSBkcm1fZ2VtX2NyZWF0ZV9tbWFwX29mZnNldCgmb2JqLT5iYXNlKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTE1NTcsNyArMTQ3OCw3IEBACiAJCW9iai0+cGFnZXNbaV0gPSBwYWdlOwogCX0KIAotCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCisJaWYgKGk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19zd2l6emxlKG9iaikpCiAJCWk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShvYmopOwogCiAJcmV0dXJuIDA7CkBAIC0xNTc5LDcgKzE1MDAsNyBAQAogCiAJQlVHX09OKG9iai0+bWFkdiA9PSBfX0k5MTVfTUFEVl9QVVJHRUQpOwogCi0JaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkKIAkJaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUob2JqKTsKIAogCWlmIChvYmotPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEKQpAQCAtMTg1Niw3ICsxNzc3LDcgQEAKIAkgKiBsb3N0IGJvIHRvIHRoZSBpbmFjdGl2ZSBsaXN0LgogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKSB7Ci0JCW9iaj0gbGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsCisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LAogCQkJCSAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAogCQkJCSAgICAgIG1tX2xpc3QpOwogCkBAIC0xOTIyLDcgKzE4NDMsNyBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmluZy0+YWN0aXZlX2xpc3QpKSB7CiAJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAKLQkJb2JqPSBsaXN0X2ZpcnN0X2VudHJ5KCZyaW5nLT5hY3RpdmVfbGlzdCwKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+YWN0aXZlX2xpc3QsCiAJCQkJICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCiAJCQkJICAgICAgcmluZ19saXN0KTsKIApAQCAtMjI3MiwxNCArMjE5Myw4IEBACiBpOTE1X2dwdV9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JYm9vbCBsaXN0c19lbXB0eTsKIAlpbnQgcmV0LCBpOwogCi0JbGlzdHNfZW1wdHkgPSAobGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpICYmCi0JCSAgICAgICBsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpKTsKLQlpZiAobGlzdHNfZW1wdHkpCi0JCXJldHVybiAwOwotCiAJLyogRmx1c2ggZXZlcnl0aGluZyBvbnRvIHRoZSBpbmFjdGl2ZSBsaXN0LiAqLwogCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKSB7CiAJCXJldCA9IGk5MTVfcmluZ19pZGxlKCZkZXZfcHJpdi0+cmluZ1tpXSk7CkBAIC0yODgyLDcgKzI3OTcsNyBAQAogCiAJZmVuY2VhYmxlID0KIAkJb2JqLT5ndHRfc3BhY2UtPnNpemUgPT0gZmVuY2Vfc2l6ZSAmJgotCQkob2JqLT5ndHRfc3BhY2UtPnN0YXJ0ICYgKGZlbmNlX2FsaWdubWVudCAtMSkpID09IDA7CisJCShvYmotPmd0dF9zcGFjZS0+c3RhcnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpID09IDA7CiAKIAltYXBwYWJsZSA9CiAJCW9iai0+Z3R0X29mZnNldCArIG9iai0+YmFzZS5zaXplIDw9IGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kOwpAQCAtMzU5OCw3ICszNTEzLDcgQEAKIAkJCSAqLwogCQkJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAocmVxdWVzdCkKLQkJCQlyZXQgPSBpOTE1X2FkZF9yZXF1ZXN0KG9iai0+cmluZywgTlVMTCxyZXF1ZXN0KTsKKwkJCQlyZXQgPSBpOTE1X2FkZF9yZXF1ZXN0KG9iai0+cmluZywgTlVMTCwgcmVxdWVzdCk7CiAJCQllbHNlCiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJfQpAQCAtMzYyMyw3ICszNTM4LDcgQEAKIGk5MTVfZ2VtX3Rocm90dGxlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLSAgICByZXR1cm4gaTkxNV9nZW1fcmluZ190aHJvdHRsZShkZXYsIGZpbGVfcHJpdik7CisJcmV0dXJuIGk5MTVfZ2VtX3JpbmdfdGhyb3R0bGUoZGV2LCBmaWxlX3ByaXYpOwogfQogCiBpbnQKQEAgLTM3NTIsNyArMzY2Nyw3IEBACiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2Rlc3Ryb3kob2JqKTsKIAogCWlmIChvYmotPmJhc2UubWFwX2xpc3QubWFwKQotCQlpOTE1X2dlbV9mcmVlX21tYXBfb2Zmc2V0KG9iaik7CisJCWRybV9nZW1fZnJlZV9tbWFwX29mZnNldCgmb2JqLT5iYXNlKTsKIAogCWRybV9nZW1fb2JqZWN0X3JlbGVhc2UoJm9iai0+YmFzZSk7CiAJaTkxNV9nZW1faW5mb19yZW1vdmVfb2JqKGRldl9wcml2LCBvYmotPmJhc2Uuc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kZWJ1Zy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZGVidWcuYwppbmRleCA4ZGExODk5Li5jYzkzY2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKCFvYmotPmFjdGl2ZSB8fAogCQkJICAgKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgPT0gMCB8fAotCQkJICAgbGlzdF9lbXB0eSgmb2JqLT5ncHVfd3JpdGVfbGlzdCkpeworCQkJICAgbGlzdF9lbXB0eSgmb2JqLT5ncHVfd3JpdGVfbGlzdCkpIHsKIAkJCURSTV9FUlJPUigiaW52YWxpZCBmbHVzaGluZyAlcCAoYSAlZCB3ICV4IGd3bCAlZClcbiIsCiAJCQkJICBvYmosCiAJCQkJICBvYmotPmFjdGl2ZSwKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBvYmotPnNpemUgLyBQQUdFX1NJWkU7IHBhZ2UrKykgewogCQlpbnQgaTsKIAotCQliYWNraW5nX21hcCA9IGttYXBfYXRvbWljKG9iai0+cGFnZXNbcGFnZV0sIEtNX1VTRVIwKTsKKwkJYmFja2luZ19tYXAgPSBrbWFwX2F0b21pYyhvYmotPnBhZ2VzW3BhZ2VdKTsKIAogCQlpZiAoYmFja2luZ19tYXAgPT0gTlVMTCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbWFwIGJhY2tpbmcgcGFnZVxuIik7CkBAIC0xODEsMTMgKzE4MSwxMyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlrdW5tYXBfYXRvbWljKGJhY2tpbmdfbWFwLCBLTV9VU0VSMCk7CisJCWt1bm1hcF9hdG9taWMoYmFja2luZ19tYXApOwogCQliYWNraW5nX21hcCA9IE5VTEw7CiAJfQogCiAgb3V0OgogCWlmIChiYWNraW5nX21hcCAhPSBOVUxMKQotCQlrdW5tYXBfYXRvbWljKGJhY2tpbmdfbWFwLCBLTV9VU0VSMCk7CisJCWt1bm1hcF9hdG9taWMoYmFja2luZ19tYXApOwogCWlvdW5tYXAoZ3R0X21hcHBpbmcpOwogCiAJLyogZ2l2ZSBzeXNsb2cgdGltZSB0byBjYXRjaCB1cCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKaW5kZXggZGEwNWEyNjkyLi5lYWQ1ZDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQkJZ290byBmb3VuZDsKIAl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKLQkJaWYgKCEgb2JqLT5iYXNlLndyaXRlX2RvbWFpbiB8fCBvYmotPnBpbl9jb3VudCkKKwkJaWYgKCFvYmotPmJhc2Uud3JpdGVfZG9tYWluIHx8IG9iai0+cGluX2NvdW50KQogCQkJY29udGludWU7CiAKIAkJaWYgKG1hcmtfZnJlZShvYmosICZ1bndpbmRfbGlzdCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKaW5kZXggNDkzNGNmOC4uMzY5M2U4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtNzg0LDcgKzc4NCw4IEBACiAJfQogCiAJZnJvbS0+c3luY19zZXFub1tpZHhdID0gc2Vxbm87Ci0JcmV0dXJuIGludGVsX3Jpbmdfc3luYyh0bywgZnJvbSwgc2Vxbm8gLSAxKTsKKworCXJldHVybiB0by0+c3luY190byh0bywgZnJvbSwgc2Vxbm8gLSAxKTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCA3YTcwOWNkLi42MDQyYzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtNDksNiArNDksMjggQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIGRvX2lkbGluZyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJYm9vbCByZXQgPSBkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZTsKKworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+bW0uZ3R0LT5kb19pZGxlX21hcHMpKSB7CisJCWRldl9wcml2LT5tbS5pbnRlcnJ1cHRpYmxlID0gZmFsc2U7CisJCWlmIChpOTE1X2dwdV9pZGxlKGRldl9wcml2LT5kZXYpKSB7CisJCQlEUk1fRVJST1IoIkNvdWxkbid0IGlkbGUgR1BVXG4iKTsKKwkJCS8qIFdhaXQgYSBiaXQsIGluIGhvcGVzIGl0IGF2b2lkcyB0aGUgaGFuZyAqLworCQkJdWRlbGF5KDEwKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVuZG9faWRsaW5nKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+bW0uZ3R0LT5kb19pZGxlX21hcHMpKQorCQlkZXZfcHJpdi0+bW0uaW50ZXJydXB0aWJsZSA9IGludGVycnVwdGlibGU7Cit9CisKIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTE3LDYgKzEzOSwxMiBAQAogCiB2b2lkIGk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlib29sIGludGVycnVwdGlibGU7CisKKwlpbnRlcnJ1cHRpYmxlID0gZG9faWRsaW5nKGRldl9wcml2KTsKKwogCWludGVsX2d0dF9jbGVhcl9yYW5nZShvYmotPmd0dF9zcGFjZS0+c3RhcnQgPj4gUEFHRV9TSElGVCwKIAkJCSAgICAgIG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQpOwogCkBAIC0xMjQsNCArMTUyLDYgQEAKIAkJaW50ZWxfZ3R0X3VubWFwX21lbW9yeShvYmotPnNnX2xpc3QsIG9iai0+bnVtX3NnKTsKIAkJb2JqLT5zZ19saXN0ID0gTlVMTDsKIAl9CisKKwl1bmRvX2lkbGluZyhkZXZfcHJpdiwgaW50ZXJydXB0aWJsZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCmluZGV4IDk5YzRmYWEuLjMxZDMzNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCkBAIC05Miw3ICs5MiwxMCBAQAogCXVpbnQzMl90IHN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwogCXVpbnQzMl90IHN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDUpIHsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikgeworCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJfSBlbHNlIGlmIChJU19HRU41KGRldikpIHsKIAkJLyogT24gSXJvbmxha2Ugd2hhdGV2ZXIgRFJBTSBjb25maWcsIEdQVSBhbHdheXMgZG8KIAkJICogc2FtZSBzd2l6emxpbmcgc2V0dXAuCiAJCSAqLwpAQCAtNDQwLDE0ICs0NDMsOSBAQAogdm9pZAogaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOwogCWludCBpOwogCi0JaWYgKGRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3ggIT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcpCi0JCXJldHVybjsKLQogCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKQogCQlyZXR1cm47CiAKQEAgLTQ2NCwxNCArNDYyLDkgQEAKIHZvaWQKIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOwogCWludCBpOwogCi0JaWYgKGRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3ggIT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcpCi0JCXJldHVybjsKLQogCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKSB7CiAJCW9iai0+Yml0XzE3ID0ga21hbGxvYyhCSVRTX1RPX0xPTkdTKHBhZ2VfY291bnQpICoKIAkJCQkJICAgc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCmluZGV4IDljYmIwY2QuLjllZTI3MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwpAQCAtMzgzLDYgKzM4Myw3IEBACiAJcG1faWlyID0gZGV2X3ByaXYtPnBtX2lpcjsKIAlkZXZfcHJpdi0+cG1faWlyID0gMDsKIAlwbV9pbXIgPSBJOTE1X1JFQUQoR0VONl9QTUlNUik7CisJSTkxNV9XUklURShHRU42X1BNSU1SLCAwKTsKIAlzcGluX3VubG9ja19pcnEoJmRldl9wcml2LT5ycHNfbG9jayk7CiAKIAlpZiAoIXBtX2lpcikKQEAgLTQyMCw3ICs0MjEsNiBAQAogCSAqIGFuICpleHRyZW1lbHkqIHVubGlrZWx5IHJhY2Ugd2l0aCBnZW42X3Jwc19lbmFibGUoKSB0aGF0IGlzIHByZXZlbnRlZAogCSAqIGJ5IGhvbGRpbmcgc3RydWN0X211dGV4IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyaXRlLgogCSAqLwotCUk5MTVfV1JJVEUoR0VONl9QTUlNUiwgcG1faW1yICYgfnBtX2lpcik7CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogfQogCkBAIC01MzYsOCArNTM2LDkgQEAKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5ycHNfbG9jaywgZmxhZ3MpOwogCQlXQVJOKGRldl9wcml2LT5wbV9paXIgJiBwbV9paXIsICJNaXNzZWQgYSBQTSBpbnRlcnJ1cHRcbiIpOwotCQlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIHBtX2lpcik7CiAJCWRldl9wcml2LT5wbV9paXIgfD0gcG1faWlyOworCQlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIGRldl9wcml2LT5wbV9paXIpOworCQlQT1NUSU5HX1JFQUQoR0VONl9QTUlNUik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5ycHNfbG9jaywgZmxhZ3MpOwogCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5ycHNfd29yayk7CiAJfQpAQCAtNjQ5LDggKzY1MCw5IEBACiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+cnBzX2xvY2ssIGZsYWdzKTsKIAkJV0FSTihkZXZfcHJpdi0+cG1faWlyICYgcG1faWlyLCAiTWlzc2VkIGEgUE0gaW50ZXJydXB0XG4iKTsKLQkJSTkxNV9XUklURShHRU42X1BNSU1SLCBwbV9paXIpOwogCQlkZXZfcHJpdi0+cG1faWlyIHw9IHBtX2lpcjsKKwkJSTkxNV9XUklURShHRU42X1BNSU1SLCBkZXZfcHJpdi0+cG1faWlyKTsKKwkJUE9TVElOR19SRUFEKEdFTjZfUE1JTVIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+cnBzX2xvY2ssIGZsYWdzKTsKIAkJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+cnBzX3dvcmspOwogCX0KQEAgLTcxMSw3ICs3MTMsNyBAQAogCiAJcGFnZV9jb3VudCA9IHNyYy0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwogCi0JZHN0ID0ga21hbGxvYyhzaXplb2YoKmRzdCkgKyBwYWdlX2NvdW50ICogc2l6ZW9mICh1MzIgKiksIEdGUF9BVE9NSUMpOworCWRzdCA9IGttYWxsb2Moc2l6ZW9mKCpkc3QpICsgcGFnZV9jb3VudCAqIHNpemVvZih1MzIgKiksIEdGUF9BVE9NSUMpOwogCWlmIChkc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE0OTMsNyArMTQ5NSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAJaXJvbmxha2VfZW5hYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCAocGlwZSA9PSAwKSA/Ci0JCQkJICAgIERFX1BJUEVBX1ZCTEFOSzogREVfUElQRUJfVkJMQU5LKTsKKwkJCQkgICAgREVfUElQRUFfVkJMQU5LIDogREVfUElQRUJfVkJMQU5LKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMTU0MSw3ICsxNTQzLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpcm9ubGFrZV9kaXNhYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCAocGlwZSA9PSAwKSA/Ci0JCQkJICAgICBERV9QSVBFQV9WQkxBTks6IERFX1BJUEVCX1ZCTEFOSyk7CisJCQkJICAgICBERV9QSVBFQV9WQkxBTksgOiBERV9QSVBFQl9WQkxBTkspOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogfQogCkBAIC0xNzc3LDYgKzE3NzksMjYgQEAKIAlQT1NUSU5HX1JFQUQoU0RFSUVSKTsKIH0KIAorLyoKKyAqIEVuYWJsZSBkaWdpdGFsIGhvdHBsdWcgb24gdGhlIFBDSCwgYW5kIGNvbmZpZ3VyZSB0aGUgRFAgc2hvcnQgcHVsc2UKKyAqIGR1cmF0aW9uIHRvIDJtcyAod2hpY2ggaXMgdGhlIG1pbmltdW0gaW4gdGhlIERpc3BsYXkgUG9ydCBzcGVjKQorICoKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgdGhlIHNhbWUgb24gYWxsIGtub3duIFBDSCBjaGlwcy4KKyAqLworCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lbmFibGVfcGNoX2hvdHBsdWcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMglob3RwbHVnOworCisJaG90cGx1ZyA9IEk5MTVfUkVBRChQQ0hfUE9SVF9IT1RQTFVHKTsKKwlob3RwbHVnICY9IH4oUE9SVERfUFVMU0VfRFVSQVRJT05fTUFTS3xQT1JUQ19QVUxTRV9EVVJBVElPTl9NQVNLfFBPUlRCX1BVTFNFX0RVUkFUSU9OX01BU0spOworCWhvdHBsdWcgfD0gUE9SVERfSE9UUExVR19FTkFCTEUgfCBQT1JURF9QVUxTRV9EVVJBVElPTl8ybXM7CisJaG90cGx1ZyB8PSBQT1JUQ19IT1RQTFVHX0VOQUJMRSB8IFBPUlRDX1BVTFNFX0RVUkFUSU9OXzJtczsKKwlob3RwbHVnIHw9IFBPUlRCX0hPVFBMVUdfRU5BQkxFIHwgUE9SVEJfUFVMU0VfRFVSQVRJT05fMm1zOworCUk5MTVfV1JJVEUoUENIX1BPUlRfSE9UUExVRywgaG90cGx1Zyk7Cit9CisKIHN0YXRpYyBpbnQgaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE4MzksNiArMTg2MSw4IEBACiAJSTkxNV9XUklURShTREVJRVIsIGhvdHBsdWdfbWFzayk7CiAJUE9TVElOR19SRUFEKFNERUlFUik7CiAKKwlpcm9ubGFrZV9lbmFibGVfcGNoX2hvdHBsdWcoZGV2KTsKKwogCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKIAkJLyogQ2xlYXIgJiBlbmFibGUgUENVIGV2ZW50IGludGVycnVwdHMgKi8KIAkJSTkxNV9XUklURShERUlJUiwgREVfUENVX0VWRU5UKTsKQEAgLTE4OTYsNiArMTkyMCw4IEBACiAJSTkxNV9XUklURShTREVJRVIsIGhvdHBsdWdfbWFzayk7CiAJUE9TVElOR19SRUFEKFNERUlFUik7CiAKKwlpcm9ubGFrZV9lbmFibGVfcGNoX2hvdHBsdWcoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDIwLDYgKzIwNDYsMTAgQEAKIAlJOTE1X1dSSVRFKEdUSU1SLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKEdUSUVSLCAweDApOwogCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOworCisJSTkxNV9XUklURShTREVJTVIsIDB4ZmZmZmZmZmYpOworCUk5MTVfV1JJVEUoU0RFSUVSLCAweDApOworCUk5MTVfV1JJVEUoU0RFSUlSLCBJOTE1X1JFQUQoU0RFSUlSKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9tZW0uYwppbmRleCA4M2I3YjgxLi5jYzhmNmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X21lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfbWVtLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCWJsb2Nrcy0+bmV4dCA9IGJsb2Nrcy0+cHJldiA9ICpoZWFwOwogCiAJbWVtc2V0KCpoZWFwLCAwLCBzaXplb2YoKipoZWFwKSk7Ci0JKCpoZWFwKS0+ZmlsZV9wcml2ID0gKHN0cnVjdCBkcm1fZmlsZSAqKSAtIDE7CisJKCpoZWFwKS0+ZmlsZV9wcml2ID0gKHN0cnVjdCBkcm1fZmlsZSAqKSAtMTsKIAkoKmhlYXApLT5uZXh0ID0gKCpoZWFwKS0+cHJldiA9IGJsb2NrczsKIAlyZXR1cm4gMDsKIH0KQEAgLTM1OSwxOSArMzU5LDE5IEBACiAJcmV0dXJuIGluaXRfaGVhcChoZWFwLCBpbml0aGVhcC0+c3RhcnQsIGluaXRoZWFwLT5zaXplKTsKIH0KIAotaW50IGk5MTVfbWVtX2Rlc3Ryb3lfaGVhcCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2ICkKK2ludCBpOTE1X21lbV9kZXN0cm95X2hlYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pOTE1X21lbV9kZXN0cm95X2hlYXBfdCAqZGVzdHJveWhlYXAgPSBkYXRhOwogCXN0cnVjdCBtZW1fYmxvY2sgKipoZWFwOwogCi0JaWYgKCAhZGV2X3ByaXYgKSB7Ci0JCURSTV9FUlJPUiggImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iICk7CisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaGVhcCA9IGdldF9oZWFwKCBkZXZfcHJpdiwgZGVzdHJveWhlYXAtPnJlZ2lvbiApOworCWhlYXAgPSBnZXRfaGVhcChkZXZfcHJpdiwgZGVzdHJveWhlYXAtPnJlZ2lvbik7CiAJaWYgKCFoZWFwKSB7CiAJCURSTV9FUlJPUigiZ2V0X2hlYXAgZmFpbGVkIik7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMzgyLDYgKzM4Miw2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWk5MTVfbWVtX3Rha2Vkb3duKCBoZWFwICk7CisJaTkxNV9tZW1fdGFrZWRvd24oaGVhcCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCA1NDI0NTNmLi41YTA5NDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTE1Niw3ICsxNTYsNyBAQAogI2RlZmluZSBNSV9TVVNQRU5EX0ZMVVNICU1JX0lOU1RSKDB4MGIsIDApCiAjZGVmaW5lICAgTUlfU1VTUEVORF9GTFVTSF9FTgkoMTw8MCkKICNkZWZpbmUgTUlfUkVQT1JUX0hFQUQJCU1JX0lOU1RSKDB4MDcsIDApCi0jZGVmaW5lIE1JX09WRVJMQVlfRkxJUAkJTUlfSU5TVFIoMHgxMSwwKQorI2RlZmluZSBNSV9PVkVSTEFZX0ZMSVAJCU1JX0lOU1RSKDB4MTEsIDApCiAjZGVmaW5lICAgTUlfT1ZFUkxBWV9DT05USU5VRQkoMHgwPDwyMSkKICNkZWZpbmUgICBNSV9PVkVSTEFZX09OCQkoMHgxPDwyMSkKICNkZWZpbmUgICBNSV9PVkVSTEFZX09GRgkoMHgyPDwyMSkKQEAgLTE5NCw2ICsxOTQsMTMgQEAKICNkZWZpbmUgIE1JX1NFTUFQSE9SRV9VUERBVEUJICAgICgxPDwyMSkKICNkZWZpbmUgIE1JX1NFTUFQSE9SRV9DT01QQVJFCSAgICAoMTw8MjApCiAjZGVmaW5lICBNSV9TRU1BUEhPUkVfUkVHSVNURVIJICAgICgxPDwxOCkKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1JWCSAgICAoMjw8MTYpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19SQgkgICAgKDA8PDE2KQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfVlIJICAgICgwPDwxNikKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX1ZCCSAgICAoMjw8MTYpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfU1lOQ19CUgkgICAgKDI8PDE2KQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1NZTkNfQlYJICAgICgwPDwxNikKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQgICgxPDwwKQogLyoKICAqIDNEIGluc3RydWN0aW9ucyB1c2VkIGJ5IHRoZSBrZXJuZWwKICAqLwpAQCAtMjM1LDE2ICsyNDIsMjIgQEAKICNkZWZpbmUgICBBU1lOQ19GTElQICAgICAgICAgICAgICAgICgxPDwyMikKICNkZWZpbmUgICBESVNQTEFZX1BMQU5FX0EgICAgICAgICAgICgwPDwyMCkKICNkZWZpbmUgICBESVNQTEFZX1BMQU5FX0IgICAgICAgICAgICgxPDwyMCkKLSNkZWZpbmUgR0ZYX09QX1BJUEVfQ09OVFJPTAkoKDB4Mzw8MjkpfCgweDM8PDI3KXwoMHgyPDwyNCl8MikKLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfUVdfV1JJVEUJKDE8PDE0KQotI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTCAoMTw8MTMpCi0jZGVmaW5lICAgUElQRV9DT05UUk9MX1dDX0ZMVVNICSgxPDwxMikKLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfSVNfRkxVU0gJKDE8PDExKSAvKiBNQlogb24gSXJvbmxha2UgKi8KLSNkZWZpbmUgICBQSVBFX0NPTlRST0xfVENfRkxVU0ggKDE8PDEwKSAvKiBHTTQ1KyBvbmx5ICovCi0jZGVmaW5lICAgUElQRV9DT05UUk9MX0lTUF9ESVMJKDE8PDkpCi0jZGVmaW5lICAgUElQRV9DT05UUk9MX05PVElGWQkoMTw8OCkKKyNkZWZpbmUgR0ZYX09QX1BJUEVfQ09OVFJPTChsZW4pCSgoMHgzPDwyOSl8KDB4Mzw8MjcpfCgweDI8PDI0KXwobGVuLTIpKQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9DU19TVEFMTAkJCQkoMTw8MjApCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1FXX1dSSVRFCQkJCSgxPDwxNCkKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfREVQVEhfU1RBTEwJCQkoMTw8MTMpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1dSSVRFX0ZMVVNICQkJKDE8PDEyKQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9SRU5ERVJfVEFSR0VUX0NBQ0hFX0ZMVVNICSgxPDwxMikgLyogZ2VuNisgKi8KKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfSU5TVFJVQ1RJT05fQ0FDSEVfSU5WQUxJREFURQkoMTw8MTEpIC8qIE1CWiBvbiBJcm9ubGFrZSAqLworI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEUJCSgxPDwxMCkgLyogR000NSsgb25seSAqLworI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9JTkRJUkVDVF9TVEFURV9ESVNBQkxFCQkoMTw8OSkKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfTk9USUZZCQkJCSgxPDw4KQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9WRl9DQUNIRV9JTlZBTElEQVRFCQkoMTw8NCkKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfQ09OU1RfQ0FDSEVfSU5WQUxJREFURQkJKDE8PDMpCisjZGVmaW5lICAgUElQRV9DT05UUk9MX1NUQVRFX0NBQ0hFX0lOVkFMSURBVEUJCSgxPDwyKQorI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9TVEFMTF9BVF9TQ09SRUJPQVJECQkoMTw8MSkKKyNkZWZpbmUgICBQSVBFX0NPTlRST0xfREVQVEhfQ0FDSEVfRkxVU0gJCSgxPDwwKQogI2RlZmluZSAgIFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUICgxPDwyKSAvKiBpbiBhZGRyIGR3b3JkICovCi0jZGVmaW5lICAgUElQRV9DT05UUk9MX1NUQUxMX0VOCSgxPDwxKSAvKiBpbiBhZGRyIHdvcmQsIElyb25sYWtlKyBvbmx5ICovCiAKIAogLyoKQEAgLTI5Niw2ICszMDksMTIgQEAKICNkZWZpbmUgUklOR19DVEwoYmFzZSkJCSgoYmFzZSkrMHgzYykKICNkZWZpbmUgUklOR19TWU5DXzAoYmFzZSkJKChiYXNlKSsweDQwKQogI2RlZmluZSBSSU5HX1NZTkNfMShiYXNlKQkoKGJhc2UpKzB4NDQpCisjZGVmaW5lIEdFTjZfUlZTWU5DIChSSU5HX1NZTkNfMChSRU5ERVJfUklOR19CQVNFKSkKKyNkZWZpbmUgR0VONl9SQlNZTkMgKFJJTkdfU1lOQ18xKFJFTkRFUl9SSU5HX0JBU0UpKQorI2RlZmluZSBHRU42X1ZSU1lOQyAoUklOR19TWU5DXzEoR0VONl9CU0RfUklOR19CQVNFKSkKKyNkZWZpbmUgR0VONl9WQlNZTkMgKFJJTkdfU1lOQ18wKEdFTjZfQlNEX1JJTkdfQkFTRSkpCisjZGVmaW5lIEdFTjZfQlJTWU5DIChSSU5HX1NZTkNfMChCTFRfUklOR19CQVNFKSkKKyNkZWZpbmUgR0VONl9CVlNZTkMgKFJJTkdfU1lOQ18xKEJMVF9SSU5HX0JBU0UpKQogI2RlZmluZSBSSU5HX01BWF9JRExFKGJhc2UpCSgoYmFzZSkrMHg1NCkKICNkZWZpbmUgUklOR19IV1NfUEdBKGJhc2UpCSgoYmFzZSkrMHg4MCkKICNkZWZpbmUgUklOR19IV1NfUEdBX0dFTjYoYmFzZSkJKChiYXNlKSsweDIwODApCkBAIC00NzAsNyArNDg5LDcgQEAKIAogLyogRW5hYmxlcyBub24tc2VxdWVudGlhbCBkYXRhIHJlYWRzIHRocm91Z2ggYXJiaXRlcgogICovCi0jZGVmaW5lICAgTUlfQVJCX0RVQUxfREFUQV9QSEFTRV9ESVNBQkxFICAgICAgIAkoMSA8PCA5KQorI2RlZmluZSAgIE1JX0FSQl9EVUFMX0RBVEFfUEhBU0VfRElTQUJMRQkoMSA8PCA5KQogCiAvKiBEaXNhYmxlIEZTQiBzbm9vcGluZyBvZiBjYWNoZWFibGUgd3JpdGUgY3ljbGVzIGZyb20gYmlubmVyL3JlbmRlcgogICogY29tbWFuZCBzdHJlYW0KQEAgLTYyNiw3ICs2NDUsNyBAQAogCiAjZGVmaW5lIElMS19ESVNQTEFZX0NISUNLRU4xCTB4NDIwMDAKICNkZWZpbmUgICBJTEtfRkJDUV9ESVMJCSgxPDwyMikKLSNkZWZpbmUgICBJTEtfUEFCU1RSRVRDSF9ESVMgCSgxPDwyMSkKKyNkZWZpbmUJICBJTEtfUEFCU1RSRVRDSF9ESVMJKDE8PDIxKQogCiAKIC8qCkBAIC0yMzU4LDcgKzIzNzcsNyBAQAogCiAjZGVmaW5lIERTUEZXMQkJCTB4NzAwMzQKICNkZWZpbmUgICBEU1BGV19TUl9TSElGVAkyMwotI2RlZmluZSAgIERTUEZXX1NSX01BU0sgCSgweDFmZjw8MjMpCisjZGVmaW5lICAgRFNQRldfU1JfTUFTSwkJKDB4MWZmPDwyMykKICNkZWZpbmUgICBEU1BGV19DVVJTT1JCX1NISUZUCTE2CiAjZGVmaW5lICAgRFNQRldfQ1VSU09SQl9NQVNLCSgweDNmPDwxNikKICNkZWZpbmUgICBEU1BGV19QTEFORUJfU0hJRlQJOApAQCAtMjQxNiw2ICsyNDM1LDcgQEAKICNkZWZpbmUgIFdNMF9QSVBFX0NVUlNPUl9NQVNLCSgweDFmKQogCiAjZGVmaW5lIFdNMF9QSVBFQl9JTEsJCTB4NDUxMDQKKyNkZWZpbmUgV00wX1BJUEVDX0lWQgkJMHg0NTIwMAogI2RlZmluZSBXTTFfTFBfSUxLCQkweDQ1MTA4CiAjZGVmaW5lICBXTTFfTFBfU1JfRU4JCSgxPDwzMSkKICNkZWZpbmUgIFdNMV9MUF9MQVRFTkNZX1NISUZUCTI0CkBAIC0yNTU0LDEwICsyNTc0LDE4IEBACiAjZGVmaW5lIF9DVVJCQkFTRQkJMHg3MDBjNAogI2RlZmluZSBfQ1VSQlBPUwkJCTB4NzAwYzgKIAorI2RlZmluZSBfQ1VSQkNOVFJfSVZCCQkweDcxMDgwCisjZGVmaW5lIF9DVVJCQkFTRV9JVkIJCTB4NzEwODQKKyNkZWZpbmUgX0NVUkJQT1NfSVZCCQkweDcxMDg4CisKICNkZWZpbmUgQ1VSQ05UUihwaXBlKSBfUElQRShwaXBlLCBfQ1VSQUNOVFIsIF9DVVJCQ05UUikKICNkZWZpbmUgQ1VSQkFTRShwaXBlKSBfUElQRShwaXBlLCBfQ1VSQUJBU0UsIF9DVVJCQkFTRSkKICNkZWZpbmUgQ1VSUE9TKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBUE9TLCBfQ1VSQlBPUykKIAorI2RlZmluZSBDVVJDTlRSX0lWQihwaXBlKSBfUElQRShwaXBlLCBfQ1VSQUNOVFIsIF9DVVJCQ05UUl9JVkIpCisjZGVmaW5lIENVUkJBU0VfSVZCKHBpcGUpIF9QSVBFKHBpcGUsIF9DVVJBQkFTRSwgX0NVUkJCQVNFX0lWQikKKyNkZWZpbmUgQ1VSUE9TX0lWQihwaXBlKSBfUElQRShwaXBlLCBfQ1VSQVBPUywgX0NVUkJQT1NfSVZCKQorCiAvKiBEaXNwbGF5IEEgY29udHJvbCAqLwogI2RlZmluZSBfRFNQQUNOVFIgICAgICAgICAgICAgICAgMHg3MDE4MAogI2RlZmluZSAgIERJU1BMQVlfUExBTkVfRU5BQkxFCQkJKDE8PDMxKQpAQCAtMjkwMywxMiArMjkzMSwxMyBAQAogI2RlZmluZSBTREVJRVIgIDB4YzQwMGMKIAogLyogZGlnaXRhbCBwb3J0IGhvdHBsdWcgKi8KLSNkZWZpbmUgUENIX1BPUlRfSE9UUExVRyAgICAgICAgMHhjNDAzMAorI2RlZmluZSBQQ0hfUE9SVF9IT1RQTFVHICAgICAgICAweGM0MDMwCQkvKiBTSE9UUExVR19DVEwgKi8KICNkZWZpbmUgUE9SVERfSE9UUExVR19FTkFCTEUgICAgICAgICAgICAoMSA8PCAyMCkKICNkZWZpbmUgUE9SVERfUFVMU0VfRFVSQVRJT05fMm1zICAgICAgICAoMCkKICNkZWZpbmUgUE9SVERfUFVMU0VfRFVSQVRJT05fNF81bXMgICAgICAoMSA8PCAxOCkKICNkZWZpbmUgUE9SVERfUFVMU0VfRFVSQVRJT05fNm1zICAgICAgICAoMiA8PCAxOCkKICNkZWZpbmUgUE9SVERfUFVMU0VfRFVSQVRJT05fMTAwbXMgICAgICAoMyA8PCAxOCkKKyNkZWZpbmUgUE9SVERfUFVMU0VfRFVSQVRJT05fTUFTSwkoMyA8PCAxOCkKICNkZWZpbmUgUE9SVERfSE9UUExVR19OT19ERVRFQ1QgICAgICAgICAoMCkKICNkZWZpbmUgUE9SVERfSE9UUExVR19TSE9SVF9ERVRFQ1QgICAgICAoMSA8PCAxNikKICNkZWZpbmUgUE9SVERfSE9UUExVR19MT05HX0RFVEVDVCAgICAgICAoMSA8PCAxNykKQEAgLTI5MTcsNiArMjk0Niw3IEBACiAjZGVmaW5lIFBPUlRDX1BVTFNFX0RVUkFUSU9OXzRfNW1zICAgICAgKDEgPDwgMTApCiAjZGVmaW5lIFBPUlRDX1BVTFNFX0RVUkFUSU9OXzZtcyAgICAgICAgKDIgPDwgMTApCiAjZGVmaW5lIFBPUlRDX1BVTFNFX0RVUkFUSU9OXzEwMG1zICAgICAgKDMgPDwgMTApCisjZGVmaW5lIFBPUlRDX1BVTFNFX0RVUkFUSU9OX01BU0sJKDMgPDwgMTApCiAjZGVmaW5lIFBPUlRDX0hPVFBMVUdfTk9fREVURUNUICAgICAgICAgKDApCiAjZGVmaW5lIFBPUlRDX0hPVFBMVUdfU0hPUlRfREVURUNUICAgICAgKDEgPDwgOCkKICNkZWZpbmUgUE9SVENfSE9UUExVR19MT05HX0RFVEVDVCAgICAgICAoMSA8PCA5KQpAQCAtMjkyNSw2ICsyOTU1LDcgQEAKICNkZWZpbmUgUE9SVEJfUFVMU0VfRFVSQVRJT05fNF81bXMgICAgICAoMSA8PCAyKQogI2RlZmluZSBQT1JUQl9QVUxTRV9EVVJBVElPTl82bXMgICAgICAgICgyIDw8IDIpCiAjZGVmaW5lIFBPUlRCX1BVTFNFX0RVUkFUSU9OXzEwMG1zICAgICAgKDMgPDwgMikKKyNkZWZpbmUgUE9SVEJfUFVMU0VfRFVSQVRJT05fTUFTSwkoMyA8PCAyKQogI2RlZmluZSBQT1JUQl9IT1RQTFVHX05PX0RFVEVDVCAgICAgICAgICgwKQogI2RlZmluZSBQT1JUQl9IT1RQTFVHX1NIT1JUX0RFVEVDVCAgICAgICgxIDw8IDApCiAjZGVmaW5lIFBPUlRCX0hPVFBMVUdfTE9OR19ERVRFQ1QgICAgICAgKDEgPDwgMSkKQEAgLTI5NDUsMTUgKzI5NzYsMTUgQEAKIAogI2RlZmluZSBfUENIX0RQTExfQSAgICAgICAgICAgICAgMHhjNjAxNAogI2RlZmluZSBfUENIX0RQTExfQiAgICAgICAgICAgICAgMHhjNjAxOAotI2RlZmluZSBQQ0hfRFBMTChwaXBlKSBfUElQRShwaXBlLCBfUENIX0RQTExfQSwgX1BDSF9EUExMX0IpCisjZGVmaW5lIFBDSF9EUExMKHBpcGUpIChwaXBlID09IDAgPyAgX1BDSF9EUExMX0EgOiBfUENIX0RQTExfQikKIAogI2RlZmluZSBfUENIX0ZQQTAgICAgICAgICAgICAgICAgMHhjNjA0MAogI2RlZmluZSAgRlBfQ0JfVFVORQkJKDB4Mzw8MjIpCiAjZGVmaW5lIF9QQ0hfRlBBMSAgICAgICAgICAgICAgICAweGM2MDQ0CiAjZGVmaW5lIF9QQ0hfRlBCMCAgICAgICAgICAgICAgICAweGM2MDQ4CiAjZGVmaW5lIF9QQ0hfRlBCMSAgICAgICAgICAgICAgICAweGM2MDRjCi0jZGVmaW5lIFBDSF9GUDAocGlwZSkgX1BJUEUocGlwZSwgX1BDSF9GUEEwLCBfUENIX0ZQQjApCi0jZGVmaW5lIFBDSF9GUDEocGlwZSkgX1BJUEUocGlwZSwgX1BDSF9GUEExLCBfUENIX0ZQQjEpCisjZGVmaW5lIFBDSF9GUDAocGlwZSkgKHBpcGUgPT0gMCA/IF9QQ0hfRlBBMCA6IF9QQ0hfRlBCMCkKKyNkZWZpbmUgUENIX0ZQMShwaXBlKSAocGlwZSA9PSAwID8gX1BDSF9GUEExIDogX1BDSF9GUEIxKQogCiAjZGVmaW5lIFBDSF9EUExMX1RFU1QgICAgICAgICAgIDB4YzYwNmMKIApAQCAtMzE2Nyw2ICszMTk4LDcgQEAKICNkZWZpbmUgIEZESV9MSU5LX1RSQUlOX05PTkVfSVZCICAgICAgICAgICAgKDM8PDgpCiAKIC8qIGJvdGggVHggYW5kIFJ4ICovCisjZGVmaW5lICBGRElfQ09NUE9TSVRFX1NZTkMJCSgxPDwxMSkKICNkZWZpbmUgIEZESV9MSU5LX1RSQUlOX0FVVE8JCSgxPDwxMCkKICNkZWZpbmUgIEZESV9TQ1JBTUJMSU5HX0VOQUJMRSAgICAgICAgICAoMDw8NykKICNkZWZpbmUgIEZESV9TQ1JBTUJMSU5HX0RJU0FCTEUgICAgICAgICAoMTw8NykKQEAgLTMzMDgsMTUgKzMzNDAsMzUgQEAKICNkZWZpbmUgUENIX1BQX1NUQVRVUwkJMHhjNzIwMAogI2RlZmluZSBQQ0hfUFBfQ09OVFJPTAkJMHhjNzIwNAogI2RlZmluZSAgUEFORUxfVU5MT0NLX1JFR1MJKDB4YWJjZCA8PCAxNikKKyNkZWZpbmUgIFBBTkVMX1VOTE9DS19NQVNLCSgweGZmZmYgPDwgMTYpCiAjZGVmaW5lICBFRFBfRk9SQ0VfVkRECQkoMSA8PCAzKQogI2RlZmluZSAgRURQX0JMQ19FTkFCTEUJCSgxIDw8IDIpCiAjZGVmaW5lICBQQU5FTF9QT1dFUl9SRVNFVAkoMSA8PCAxKQogI2RlZmluZSAgUEFORUxfUE9XRVJfT0ZGCSgwIDw8IDApCiAjZGVmaW5lICBQQU5FTF9QT1dFUl9PTgkJKDEgPDwgMCkKICNkZWZpbmUgUENIX1BQX09OX0RFTEFZUwkweGM3MjA4CisjZGVmaW5lICBQQU5FTF9QT1JUX1NFTEVDVF9NQVNLCSgzIDw8IDMwKQorI2RlZmluZSAgUEFORUxfUE9SVF9TRUxFQ1RfTFZEUwkoMCA8PCAzMCkKKyNkZWZpbmUgIFBBTkVMX1BPUlRfU0VMRUNUX0RQQQkoMSA8PCAzMCkKICNkZWZpbmUgIEVEUF9QQU5FTAkJKDEgPDwgMzApCisjZGVmaW5lICBQQU5FTF9QT1JUX1NFTEVDVF9EUEMJKDIgPDwgMzApCisjZGVmaW5lICBQQU5FTF9QT1JUX1NFTEVDVF9EUEQJKDMgPDwgMzApCisjZGVmaW5lICBQQU5FTF9QT1dFUl9VUF9ERUxBWV9NQVNLCSgweDFmZmYwMDAwKQorI2RlZmluZSAgUEFORUxfUE9XRVJfVVBfREVMQVlfU0hJRlQJMTYKKyNkZWZpbmUgIFBBTkVMX0xJR0hUX09OX0RFTEFZX01BU0sJKDB4MWZmZikKKyNkZWZpbmUgIFBBTkVMX0xJR0hUX09OX0RFTEFZX1NISUZUCTAKKwogI2RlZmluZSBQQ0hfUFBfT0ZGX0RFTEFZUwkweGM3MjBjCisjZGVmaW5lICBQQU5FTF9QT1dFUl9ET1dOX0RFTEFZX01BU0sJKDB4MWZmZjAwMDApCisjZGVmaW5lICBQQU5FTF9QT1dFUl9ET1dOX0RFTEFZX1NISUZUCTE2CisjZGVmaW5lICBQQU5FTF9MSUdIVF9PRkZfREVMQVlfTUFTSwkoMHgxZmZmKQorI2RlZmluZSAgUEFORUxfTElHSFRfT0ZGX0RFTEFZX1NISUZUCTAKKwogI2RlZmluZSBQQ0hfUFBfRElWSVNPUgkJMHhjNzIxMAorI2RlZmluZSAgUFBfUkVGRVJFTkNFX0RJVklERVJfTUFTSwkoMHhmZmZmZmYwMCkKKyNkZWZpbmUgIFBQX1JFRkVSRU5DRV9ESVZJREVSX1NISUZUCTgKKyNkZWZpbmUgIFBBTkVMX1BPV0VSX0NZQ0xFX0RFTEFZX01BU0sJKDB4MWYpCisjZGVmaW5lICBQQU5FTF9QT1dFUl9DWUNMRV9ERUxBWV9TSElGVAkwCiAKICNkZWZpbmUgUENIX0RQX0IJCTB4ZTQxMDAKICNkZWZpbmUgUENIX0RQQl9BVVhfQ0hfQ1RMCTB4ZTQxMTAKQEAgLTM0NzAsNCArMzUyMiwyOSBAQAogI2RlZmluZSBHRU42X1BDT0RFX0RBVEEJCQkJMHgxMzgxMjgKICNkZWZpbmUgICBHRU42X1BDT0RFX0ZSRVFfSUFfUkFUSU9fU0hJRlQJOAogCisjZGVmaW5lIEc0WF9BVURfVklEX0RJRAkJCTB4NjIwMjAKKyNkZWZpbmUgSU5URUxfQVVESU9fREVWQ0wJCTB4ODA4NjI5RkIKKyNkZWZpbmUgSU5URUxfQVVESU9fREVWQkxDCQkweDgwODYyODAxCisjZGVmaW5lIElOVEVMX0FVRElPX0RFVkNURwkJMHg4MDg2MjgwMgorCisjZGVmaW5lIEc0WF9BVURfQ05UTF9TVAkJCTB4NjIwQjQKKyNkZWZpbmUgRzRYX0VMRFZfREVWQ0xfREVWQkxDCQkoMSA8PCAxMykKKyNkZWZpbmUgRzRYX0VMRFZfREVWQ1RHCQkJKDEgPDwgMTQpCisjZGVmaW5lIEc0WF9FTERfQUREUgkJCSgweGYgPDwgNSkKKyNkZWZpbmUgRzRYX0VMRF9BQ0sJCQkoMSA8PCA0KQorI2RlZmluZSBHNFhfSERNSVdfSERNSUVESUQJCTB4NjIxMEMKKworI2RlZmluZSBHRU41X0hETUlXX0hETUlFRElEX0EJCTB4RTIwNTAKKyNkZWZpbmUgR0VONV9BVURfQ05UTF9TVF9BCQkweEUyMEI0CisjZGVmaW5lIEdFTjVfRUxEX0JVRkZFUl9TSVpFCQkoMHgxZiA8PCAxMCkKKyNkZWZpbmUgR0VONV9FTERfQUREUkVTUwkJKDB4MWYgPDwgNSkKKyNkZWZpbmUgR0VONV9FTERfQUNLCQkJKDEgPDwgNCkKKyNkZWZpbmUgR0VONV9BVURfQ05UTF9TVDIJCTB4RTIwQzAKKyNkZWZpbmUgR0VONV9FTERfVkFMSURCCQkJKDEgPDwgMCkKKyNkZWZpbmUgR0VONV9DUF9SRUFEWUIJCQkoMSA8PCAxKQorCisjZGVmaW5lIEdFTjdfSERNSVdfSERNSUVESURfQQkJMHhFNTA1MAorI2RlZmluZSBHRU43X0FVRF9DTlRSTF9TVF9BCQkweEU1MEI0CisjZGVmaW5lIEdFTjdfQVVEX0NOVFJMX1NUMgkJMHhFNTBDMAorCiAjZW5kaWYgLyogX0k5MTVfUkVHX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCmluZGV4IGYxMDc0MjMuLmY4ZjYwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfc3VzcGVuZC5jCkBAIC02MCw3ICs2MCw3IEBACiAJZWxzZQogCQlhcnJheSA9IGRldl9wcml2LT5zYXZlX3BhbGV0dGVfYjsKIAotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJYXJyYXlbaV0gPSBJOTE1X1JFQUQocmVnICsgKGkgPDwgMikpOwogfQogCkBAIC04Miw3ICs4Miw3IEBACiAJZWxzZQogCQlhcnJheSA9IGRldl9wcml2LT5zYXZlX3BhbGV0dGVfYjsKIAotCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJSTkxNV9XUklURShyZWcgKyAoaSA8PCAyKSwgYXJyYXlbaV0pOwogfQogCkBAIC04ODcsMTAgKzg4NywxMCBAQAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KLQlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CisJSTkxNV9XUklURShDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CiAKIAkvKiBNZW1vcnkgYXJiaXRyYXRpb24gc3RhdGUgKi8KLQlJOTE1X1dSSVRFIChNSV9BUkJfU1RBVEUsIGRldl9wcml2LT5zYXZlTUlfQVJCX1NUQVRFIHwgMHhmZmZmMDAwMCk7CisJSTkxNV9XUklURShNSV9BUkJfU1RBVEUsIGRldl9wcml2LT5zYXZlTUlfQVJCX1NUQVRFIHwgMHhmZmZmMDAwMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlJOTE1X1dSSVRFKFNXRjAwICsgKGkgPDwgMiksIGRldl9wcml2LT5zYXZlU1dGMFtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKaW5kZXggZDYyM2ZlZi4uZGFjN2JiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaApAQCAtMzg1LDI5ICszODUsMjkgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGk5MTVfcmVnX3J3LAotICAgICAgICAgICBUUF9QUk9UTyhib29sIHdyaXRlLCB1MzIgcmVnLCB1NjQgdmFsLCBpbnQgbGVuKSwKKwlUUF9QUk9UTyhib29sIHdyaXRlLCB1MzIgcmVnLCB1NjQgdmFsLCBpbnQgbGVuKSwKIAotICAgICAgICAgICBUUF9BUkdTKHdyaXRlLCByZWcsIHZhbCwgbGVuKSwKKwlUUF9BUkdTKHdyaXRlLCByZWcsIHZhbCwgbGVuKSwKIAotICAgICAgICAgICBUUF9TVFJVQ1RfX2VudHJ5KAotICAgICAgICAgICAgICAgICAgIF9fZmllbGQodTY0LCB2YWwpCi0gICAgICAgICAgICAgICAgICAgX19maWVsZCh1MzIsIHJlZykKLSAgICAgICAgICAgICAgICAgICBfX2ZpZWxkKHUxNiwgd3JpdGUpCi0gICAgICAgICAgICAgICAgICAgX19maWVsZCh1MTYsIGxlbikKLSAgICAgICAgICAgICAgICAgICApLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodTY0LCB2YWwpCisJCV9fZmllbGQodTMyLCByZWcpCisJCV9fZmllbGQodTE2LCB3cml0ZSkKKwkJX19maWVsZCh1MTYsIGxlbikKKwkJKSwKIAotICAgICAgICAgICBUUF9mYXN0X2Fzc2lnbigKLSAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT52YWwgPSAodTY0KXZhbDsKLSAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT5yZWcgPSByZWc7Ci0gICAgICAgICAgICAgICAgICAgX19lbnRyeS0+d3JpdGUgPSB3cml0ZTsKLSAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT5sZW4gPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+dmFsID0gKHU2NCl2YWw7CisJCV9fZW50cnktPnJlZyA9IHJlZzsKKwkJX19lbnRyeS0+d3JpdGUgPSB3cml0ZTsKKwkJX19lbnRyeS0+bGVuID0gbGVuOworCQkpLAogCi0gICAgICAgICAgIFRQX3ByaW50aygiJXMgcmVnPTB4JXgsIGxlbj0lZCwgdmFsPSgweCV4LCAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT53cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsCi0JCSAgICAgX19lbnRyeS0+cmVnLCBfX2VudHJ5LT5sZW4sCi0JCSAgICAgKHUzMikoX19lbnRyeS0+dmFsICYgMHhmZmZmZmZmZiksCi0JCSAgICAgKHUzMikoX19lbnRyeS0+dmFsID4+IDMyKSkKKwlUUF9wcmludGsoIiVzIHJlZz0weCV4LCBsZW49JWQsIHZhbD0oMHgleCwgMHgleCkiLAorCQlfX2VudHJ5LT53cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsCisJCV9fZW50cnktPnJlZywgX19lbnRyeS0+bGVuLAorCQkodTMyKShfX2VudHJ5LT52YWwgJiAweGZmZmZmZmZmKSwKKwkJKHUzMikoX19lbnRyeS0+dmFsID4+IDMyKSkKICk7CiAKICNlbmRpZiAvKiBfSTkxNV9UUkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYWNwaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYWNwaS5jCmluZGV4IDJjYjhlMGIuLmNiOTEyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2FjcGkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hY3BpLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAkJaWYgKG9iai0+YnVmZmVyLmxlbmd0aCA9PSA0KSB7Ci0JCQlyZXN1bHQgPShvYmotPmJ1ZmZlci5wb2ludGVyWzBdIHwKKwkJCXJlc3VsdCA9IChvYmotPmJ1ZmZlci5wb2ludGVyWzBdIHwKIAkJCQkob2JqLT5idWZmZXIucG9pbnRlclsxXSA8PCAgOCkgfAogCQkJCShvYmotPmJ1ZmZlci5wb2ludGVyWzJdIDw8IDE2KSB8CiAJCQkJKG9iai0+YnVmZmVyLnBvaW50ZXJbM10gPDwgMjQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwppbmRleCA2MWFiZWY4YS4uNjM4ODBlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgqSAyMDA2IEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMzA5LDYgKzMwOSwxMyBAQAogCQlkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gZ2VuZXJhbC0+ZW5hYmxlX3NzYzsKIAkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQogCQkJaW50ZWxfYmlvc19zc2NfZnJlcXVlbmN5KGRldiwgZ2VuZXJhbC0+c3NjX2ZyZXEpOworCQlkZXZfcHJpdi0+ZGlzcGxheV9jbG9ja19tb2RlID0gZ2VuZXJhbC0+ZGlzcGxheV9jbG9ja19tb2RlOworCQlEUk1fREVCVUdfS01TKCJCREJfR0VORVJBTF9GRUFUVVJFUyBpbnRfdHZfc3VwcG9ydCAlZCBpbnRfY3J0X3N1cHBvcnQgJWQgbHZkc191c2Vfc3NjICVkIGx2ZHNfc3NjX2ZyZXEgJWQgZGlzcGxheV9jbG9ja19tb2RlICVkXG4iLAorCQkJICAgICAgZGV2X3ByaXYtPmludF90dl9zdXBwb3J0LAorCQkJICAgICAgZGV2X3ByaXYtPmludF9jcnRfc3VwcG9ydCwKKwkJCSAgICAgIGRldl9wcml2LT5sdmRzX3VzZV9zc2MsCisJCQkgICAgICBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSwKKwkJCSAgICAgIGRldl9wcml2LT5kaXNwbGF5X2Nsb2NrX21vZGUpOwogCX0KIH0KIApAQCAtMzgxLDcgKzM4OCw3IEBACiAJCWlmIChwX2NoaWxkLT5kdm9fcG9ydCAhPSBERVZJQ0VfUE9SVF9EVk9CICYmCiAJCQlwX2NoaWxkLT5kdm9fcG9ydCAhPSBERVZJQ0VfUE9SVF9EVk9DKSB7CiAJCQkvKiBza2lwIHRoZSBpbmNvcnJlY3QgU0RWTyBwb3J0ICovCi0JCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBwb3J0LiBTa2lwIGl0IFxuIik7CisJCQlEUk1fREVCVUdfS01TKCJJbmNvcnJlY3QgU0RWTyBwb3J0LiBTa2lwIGl0XG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCURSTV9ERUJVR19LTVMoInRoZSBTRFZPIGRldmljZSB3aXRoIHNsYXZlIGFkZHIgJTJ4IGlzIGZvdW5kIG9uIgpAQCAtMzk2LDE1ICs0MDMsMTMgQEAKIAkJCXBfbWFwcGluZy0+ZHZvX3dpcmluZyA9IHBfY2hpbGQtPmR2b193aXJpbmc7CiAJCQlwX21hcHBpbmctPmRkY19waW4gPSBwX2NoaWxkLT5kZGNfcGluOwogCQkJcF9tYXBwaW5nLT5pMmNfcGluID0gcF9jaGlsZC0+aTJjX3BpbjsKLQkJCXBfbWFwcGluZy0+aTJjX3NwZWVkID0gcF9jaGlsZC0+aTJjX3NwZWVkOwogCQkJcF9tYXBwaW5nLT5pbml0aWFsaXplZCA9IDE7Ci0JCQlEUk1fREVCVUdfS01TKCJTRFZPIGRldmljZTogZHZvPSV4LCBhZGRyPSV4LCB3aXJpbmc9JWQsIGRkY19waW49JWQsIGkyY19waW49JWQsIGkyY19zcGVlZD0lZFxuIiwKKwkJCURSTV9ERUJVR19LTVMoIlNEVk8gZGV2aWNlOiBkdm89JXgsIGFkZHI9JXgsIHdpcmluZz0lZCwgZGRjX3Bpbj0lZCwgaTJjX3Bpbj0lZFxuIiwKIAkJCQkgICAgICBwX21hcHBpbmctPmR2b19wb3J0LAogCQkJCSAgICAgIHBfbWFwcGluZy0+c2xhdmVfYWRkciwKIAkJCQkgICAgICBwX21hcHBpbmctPmR2b193aXJpbmcsCiAJCQkJICAgICAgcF9tYXBwaW5nLT5kZGNfcGluLAotCQkJCSAgICAgIHBfbWFwcGluZy0+aTJjX3BpbiwKLQkJCQkgICAgICBwX21hcHBpbmctPmkyY19zcGVlZCk7CisJCQkJICAgICAgcF9tYXBwaW5nLT5pMmNfcGluKTsKIAkJfSBlbHNlIHsKIAkJCURSTV9ERUJVR19LTVMoIk1heWJlIG9uZSBTRFZPIHBvcnQgaXMgc2hhcmVkIGJ5ICIKIAkJCQkJICJ0d28gU0RWTyBkZXZpY2UuXG4iKTsKQEAgLTU2NCw3ICs1NjksNyBAQAogCQljb3VudCsrOwogCX0KIAlpZiAoIWNvdW50KSB7Ci0JCURSTV9ERUJVR19LTVMoIm5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQgXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygibm8gY2hpbGQgZGV2IGlzIHBhcnNlZCBmcm9tIFZCVFxuIik7CiAJCXJldHVybjsKIAl9CiAJZGV2X3ByaXYtPmNoaWxkX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpwX2NoaWxkKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKQEAgLTYxMCw3ICs2MTUsNyBAQAogCS8qIERlZmF1bHQgdG8gdXNpbmcgU1NDICovCiAJZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyA9IDE7CiAJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPSBpbnRlbF9iaW9zX3NzY19mcmVxdWVuY3koZGV2LCAxKTsKLQlEUk1fREVCVUcoIlNldCBkZWZhdWx0IHRvIFNTQyBhdCAlZE1IelxuIiwgZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEpOworCURSTV9ERUJVR19LTVMoIlNldCBkZWZhdWx0IHRvIFNTQyBhdCAlZE1IelxuIiwgZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEpOwogCiAJLyogZURQIGRhdGEgKi8KIAlkZXZfcHJpdi0+ZWRwLmJwcCA9IDE4OwpAQCAtNjM5LDcgKzY0NCw3IEBACiAJaWYgKGRldl9wcml2LT5vcHJlZ2lvbi52YnQpIHsKIAkJc3RydWN0IHZidF9oZWFkZXIgKnZidCA9IGRldl9wcml2LT5vcHJlZ2lvbi52YnQ7CiAJCWlmIChtZW1jbXAodmJ0LT5zaWduYXR1cmUsICIkVkJUIiwgNCkgPT0gMCkgewotCQkJRFJNX0RFQlVHX0RSSVZFUigiVXNpbmcgVkJUIGZyb20gT3BSZWdpb246ICUyMHNcbiIsCisJCQlEUk1fREVCVUdfS01TKCJVc2luZyBWQlQgZnJvbSBPcFJlZ2lvbjogJTIwc1xuIiwKIAkJCQkJIHZidC0+c2lnbmF0dXJlKTsKIAkJCWJkYiA9IChzdHJ1Y3QgYmRiX2hlYWRlciAqKSgoY2hhciAqKXZidCArIHZidC0+YmRiX29mZnNldCk7CiAJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5oCmluZGV4IDVmOGU0ZWQuLjhhZjM3MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMDYgSW50ZWwgQ29ycG9yYXRpb24KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTEyMCw3ICsxMjAsOSBAQAogCXU4IHNzY19mcmVxOjE7CiAJdTggZW5hYmxlX2xmcF9vbl9vdmVycmlkZToxOwogCXU4IGRpc2FibGVfc3NjX2RkdDoxOwotCXU4IHJzdmQ4OjM7IC8qIGZpbmlzaCBieXRlICovCisJdTggcnN2ZDc6MTsKKwl1OCBkaXNwbGF5X2Nsb2NrX21vZGU6MTsKKwl1OCByc3ZkODoxOyAvKiBmaW5pc2ggYnl0ZSAqLwogCiAgICAgICAgIC8qIGJpdHMgMyAqLwogCXU4IGRpc2FibGVfc21vb3RoX3Zpc2lvbjoxOwpAQCAtMTMzLDcgKzEzNSwxMCBAQAogICAgICAgICAvKiBiaXRzIDUgKi8KIAl1OCBpbnRfY3J0X3N1cHBvcnQ6MTsKIAl1OCBpbnRfdHZfc3VwcG9ydDoxOwotCXU4IHJzdmQxMTo2OyAvKiBmaW5pc2ggYnl0ZSAqLworCXU4IGludF9lZnBfc3VwcG9ydDoxOworCXU4IGRwX3NzY19lbmI6MTsJLyogUENIIGF0dGFjaGVkIGVEUCBzdXBwb3J0cyBTU0MgKi8KKwl1OCBkcF9zc2NfZnJlcToxOwkvKiBTU0MgZnJlcSBmb3IgUENIIGF0dGFjaGVkIGVEUCAqLworCXU4IHJzdmQxMTozOyAvKiBmaW5pc2ggYnl0ZSAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogcHJlLTkxNSAqLwpAQCAtMTk3LDggKzIwMiw3IEBACiBzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyB7CiAJdTE2IGhhbmRsZTsKIAl1MTYgZGV2aWNlX3R5cGU7Ci0JdTggIGkyY19zcGVlZDsKLQl1OCAgcnN2ZFs5XTsKKwl1OCAgZGV2aWNlX2lkWzEwXTsgLyogYXNjaWkgc3RyaW5nICovCiAJdTE2IGFkZGluX29mZnNldDsKIAl1OCAgZHZvX3BvcnQ7IC8qIFNlZSBEZXZpY2VfUE9SVF8qIGFib3ZlICovCiAJdTggIGkyY19waW47CkBAIC0yNDAsNyArMjQ0LDcgQEAKIAkgKiBBbmQgdGhlIGRldmljZSBudW0gaXMgcmVsYXRlZCB3aXRoIHRoZSBzaXplIG9mIGdlbmVyYWwgZGVmaW5pdGlvbgogCSAqIGJsb2NrLiBJdCBpcyBvYnRhaW5lZCBieSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CiAJICogbnVtYmVyID0gKGJsb2NrX3NpemUgLSBzaXplb2YoYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMpKS8KLQkgKiAJCXNpemVvZihjaGlsZF9kZXZpY2VfY29uZmlnKTsKKwkgKgkgICAgIHNpemVvZihjaGlsZF9kZXZpY2VfY29uZmlnKTsKIAkgKi8KIAlzdHJ1Y3QgY2hpbGRfZGV2aWNlX2NvbmZpZyBkZXZpY2VzWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKQEAgLTQ0NiwxMSArNDUwLDExIEBACiAjZGVmaW5lIEVEUF9WU1dJTkdfMV8yVgkJMwogCiBzdHJ1Y3QgZWRwX3Bvd2VyX3NlcSB7Ci0JdTE2IHQzOwotCXUxNiB0NzsKKwl1MTYgdDFfdDM7CisJdTE2IHQ4OwogCXUxNiB0OTsKIAl1MTYgdDEwOwotCXUxNiB0MTI7CisJdTE2IHQxMV90MTI7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IGVkcF9saW5rX3BhcmFtcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCmluZGV4IDA5NzlkODguLmZlZTBhZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NydC5jCkBAIC02OSw3ICs2OSw3IEBACiAJdGVtcCAmPSB+KEFEUEFfSFNZTkNfQ05UTF9ESVNBQkxFIHwgQURQQV9WU1lOQ19DTlRMX0RJU0FCTEUpOwogCXRlbXAgJj0gfkFEUEFfREFDX0VOQUJMRTsKIAotCXN3aXRjaChtb2RlKSB7CisJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgogCQl0ZW1wIHw9IEFEUEFfREFDX0VOQUJMRTsKIAkJYnJlYWs7CkBAIC0xNTIsMTcgKzE1MiwxMyBAQAogCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKQogCQlhZHBhIHw9IEFEUEFfVlNZTkNfQUNUSVZFX0hJR0g7CiAKLQlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSB7Ci0JCWlmIChIQVNfUENIX0NQVChkZXYpKQotCQkJYWRwYSB8PSBQT1JUX1RSQU5TX0FfU0VMX0NQVDsKLQkJZWxzZQotCQkJYWRwYSB8PSBBRFBBX1BJUEVfQV9TRUxFQ1Q7Ci0JfSBlbHNlIHsKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikpCi0JCQlhZHBhIHw9IFBPUlRfVFJBTlNfQl9TRUxfQ1BUOwotCQllbHNlCi0JCQlhZHBhIHw9IEFEUEFfUElQRV9CX1NFTEVDVDsKLQl9CisJLyogRm9yIENQVCBhbGxvdyAzIHBpcGUgY29uZmlnLCBmb3Igb3RoZXJzIGp1c3QgdXNlIEEgb3IgQiAqLworCWlmIChIQVNfUENIX0NQVChkZXYpKQorCQlhZHBhIHw9IFBPUlRfVFJBTlNfU0VMX0NQVChpbnRlbF9jcnRjLT5waXBlKTsKKwllbHNlIGlmIChpbnRlbF9jcnRjLT5waXBlID09IDApCisJCWFkcGEgfD0gQURQQV9QSVBFX0FfU0VMRUNUOworCWVsc2UKKwkJYWRwYSB8PSBBRFBBX1BJUEVfQl9TRUxFQ1Q7CiAKIAlpZiAoIUhBU19QQ0hfU1BMSVQoZGV2KSkKIAkJSTkxNV9XUklURShCQ0xSUEFUKGludGVsX2NydGMtPnBpcGUpLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCAwNDQxMWFkLi45ODFiMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZnYWFyYi5oPgorI2luY2x1ZGUgPGRybS9kcm1fZWRpZC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgpAQCAtNDIsMzkgKzQzLDM5IEBACiAKICNkZWZpbmUgSEFTX2VEUCAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfRURQKSkKIAotYm9vbCBpbnRlbF9waXBlX2hhc190eXBlIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB0eXBlKTsKK2Jvb2wgaW50ZWxfcGlwZV9oYXNfdHlwZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB0eXBlKTsKIHN0YXRpYyB2b2lkIGludGVsX3VwZGF0ZV93YXRlcm1hcmtzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgaW50ZWxfaW5jcmVhc2VfcGxsY2xvY2soc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfdXBkYXRlX2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGJvb2wgb24pOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogZ2l2ZW4gdmFsdWVzICovCi0gICAgaW50IG47Ci0gICAgaW50IG0xLCBtMjsKLSAgICBpbnQgcDEsIHAyOwotICAgIC8qIGRlcml2ZWQgdmFsdWVzICovCi0gICAgaW50CWRvdDsKLSAgICBpbnQJdmNvOwotICAgIGludAltOwotICAgIGludAlwOworCS8qIGdpdmVuIHZhbHVlcyAqLworCWludCBuOworCWludCBtMSwgbTI7CisJaW50IHAxLCBwMjsKKwkvKiBkZXJpdmVkIHZhbHVlcyAqLworCWludAlkb3Q7CisJaW50CXZjbzsKKwlpbnQJbTsKKwlpbnQJcDsKIH0gaW50ZWxfY2xvY2tfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludAltaW4sIG1heDsKKwlpbnQJbWluLCBtYXg7CiB9IGludGVsX3JhbmdlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQJZG90X2xpbWl0OwotICAgIGludAlwMl9zbG93LCBwMl9mYXN0OworCWludAlkb3RfbGltaXQ7CisJaW50CXAyX3Nsb3csIHAyX2Zhc3Q7CiB9IGludGVsX3AyX3Q7CiAKICNkZWZpbmUgSU5URUxfUDJfTlVNCQkgICAgICAyCiB0eXBlZGVmIHN0cnVjdCBpbnRlbF9saW1pdCBpbnRlbF9saW1pdF90Owogc3RydWN0IGludGVsX2xpbWl0IHsKLSAgICBpbnRlbF9yYW5nZV90ICAgZG90LCB2Y28sIG4sIG0sIG0xLCBtMiwgcCwgcDE7Ci0gICAgaW50ZWxfcDJfdAkgICAgcDI7Ci0gICAgYm9vbCAoKiBmaW5kX3BsbCkoY29uc3QgaW50ZWxfbGltaXRfdCAqLCBzdHJ1Y3QgZHJtX2NydGMgKiwKLQkJICAgICAgaW50LCBpbnQsIGludGVsX2Nsb2NrX3QgKik7CisJaW50ZWxfcmFuZ2VfdCAgIGRvdCwgdmNvLCBuLCBtLCBtMSwgbTIsIHAsIHAxOworCWludGVsX3AyX3QJICAgIHAyOworCWJvb2wgKCogZmluZF9wbGwpKGNvbnN0IGludGVsX2xpbWl0X3QgKiwgc3RydWN0IGRybV9jcnRjICosCisJCQlpbnQsIGludCwgaW50ZWxfY2xvY2tfdCAqKTsKIH07CiAKIC8qIEZESSAqLwpAQCAtMTA1LDU2ICsxMDYsNTYgQEAKIH0KIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2k4eHhfZHZvID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDkzMDAwMCwgLm1heCA9IDE0MDAwMDAgfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gMTYgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSA5NiwgLm1heCA9IDE0MCB9LAotICAgICAgICAubTEgPSB7IC5taW4gPSAxOCwgLm1heCA9IDI2IH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDYsIC5tYXggPSAxNiB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDQsIC5tYXggPSAxMjggfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMiwgLm1heCA9IDMzIH0sCisJLmRvdCA9IHsgLm1pbiA9IDI1MDAwLCAubWF4ID0gMzUwMDAwIH0sCisJLnZjbyA9IHsgLm1pbiA9IDkzMDAwMCwgLm1heCA9IDE0MDAwMDAgfSwKKwkubiA9IHsgLm1pbiA9IDMsIC5tYXggPSAxNiB9LAorCS5tID0geyAubWluID0gOTYsIC5tYXggPSAxNDAgfSwKKwkubTEgPSB7IC5taW4gPSAxOCwgLm1heCA9IDI2IH0sCisJLm0yID0geyAubWluID0gNiwgLm1heCA9IDE2IH0sCisJLnAgPSB7IC5taW4gPSA0LCAubWF4ID0gMTI4IH0sCisJLnAxID0geyAubWluID0gMiwgLm1heCA9IDMzIH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMTY1MDAwLAogCQkucDJfc2xvdyA9IDQsIC5wMl9mYXN0ID0gMiB9LAogCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfYmVzdF9QTEwsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaTh4eF9sdmRzID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDkzMDAwMCwgLm1heCA9IDE0MDAwMDAgfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gMTYgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSA5NiwgLm1heCA9IDE0MCB9LAotICAgICAgICAubTEgPSB7IC5taW4gPSAxOCwgLm1heCA9IDI2IH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDYsIC5tYXggPSAxNiB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDQsIC5tYXggPSAxMjggfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDYgfSwKKwkuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKKwkudmNvID0geyAubWluID0gOTMwMDAwLCAubWF4ID0gMTQwMDAwMCB9LAorCS5uID0geyAubWluID0gMywgLm1heCA9IDE2IH0sCisJLm0gPSB7IC5taW4gPSA5NiwgLm1heCA9IDE0MCB9LAorCS5tMSA9IHsgLm1pbiA9IDE4LCAubWF4ID0gMjYgfSwKKwkubTIgPSB7IC5taW4gPSA2LCAubWF4ID0gMTYgfSwKKwkucCA9IHsgLm1pbiA9IDQsIC5tYXggPSAxMjggfSwKKwkucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gNiB9LAogCS5wMiA9IHsgLmRvdF9saW1pdCA9IDE2NTAwMCwKIAkJLnAyX3Nsb3cgPSAxNCwgLnAyX2Zhc3QgPSA3IH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pOXh4X3Nkdm8gPSB7Ci0gICAgICAgIC5kb3QgPSB7IC5taW4gPSAyMDAwMCwgLm1heCA9IDQwMDAwMCB9LAotICAgICAgICAudmNvID0geyAubWluID0gMTQwMDAwMCwgLm1heCA9IDI4MDAwMDAgfSwKLSAgICAgICAgLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gNiB9LAotICAgICAgICAubSA9IHsgLm1pbiA9IDcwLCAubWF4ID0gMTIwIH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjIgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKLSAgICAgICAgLnAgPSB7IC5taW4gPSA1LCAubWF4ID0gODAgfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKKwkuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDAgfSwKKwkudmNvID0geyAubWluID0gMTQwMDAwMCwgLm1heCA9IDI4MDAwMDAgfSwKKwkubiA9IHsgLm1pbiA9IDEsIC5tYXggPSA2IH0sCisJLm0gPSB7IC5taW4gPSA3MCwgLm1heCA9IDEyMCB9LAorCS5tMSA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjIgfSwKKwkubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAorCS5wID0geyAubWluID0gNSwgLm1heCA9IDgwIH0sCisJLnAxID0geyAubWluID0gMSwgLm1heCA9IDggfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAyMDAwMDAsCiAJCS5wMl9zbG93ID0gMTAsIC5wMl9mYXN0ID0gNSB9LAogCS5maW5kX3BsbCA9IGludGVsX2ZpbmRfYmVzdF9QTEwsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaTl4eF9sdmRzID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDE0MDAwMDAsIC5tYXggPSAyODAwMDAwIH0sCi0gICAgICAgIC5uID0geyAubWluID0gMSwgLm1heCA9IDYgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSA3MCwgLm1heCA9IDEyMCB9LAotICAgICAgICAubTEgPSB7IC5taW4gPSAxMCwgLm1heCA9IDIyIH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDUsIC5tYXggPSA5IH0sCi0gICAgICAgIC5wID0geyAubWluID0gNywgLm1heCA9IDk4IH0sCi0gICAgICAgIC5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCisJLmRvdCA9IHsgLm1pbiA9IDIwMDAwLCAubWF4ID0gNDAwMDAwIH0sCisJLnZjbyA9IHsgLm1pbiA9IDE0MDAwMDAsIC5tYXggPSAyODAwMDAwIH0sCisJLm4gPSB7IC5taW4gPSAxLCAubWF4ID0gNiB9LAorCS5tID0geyAubWluID0gNzAsIC5tYXggPSAxMjAgfSwKKwkubTEgPSB7IC5taW4gPSAxMCwgLm1heCA9IDIyIH0sCisJLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKKwkucCA9IHsgLm1pbiA9IDcsIC5tYXggPSA5OCB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMTEyMDAwLAogCQkucDJfc2xvdyA9IDE0LCAucDJfZmFzdCA9IDcgfSwKIAkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLApAQCAtMjIyLDQ0ICsyMjMsNDQgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19nNHhfZGlzcGxheV9wb3J0ID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMTYxNjcwLCAubWF4ID0gMjI3MDAwIH0sCi0gICAgICAgIC52Y28gPSB7IC5taW4gPSAxNzUwMDAwLCAubWF4ID0gMzUwMDAwMH0sCi0gICAgICAgIC5uID0geyAubWluID0gMSwgLm1heCA9IDIgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSA5NywgLm1heCA9IDEwOCB9LAotICAgICAgICAubTEgPSB7IC5taW4gPSAweDEwLCAubWF4ID0gMHgxMiB9LAotICAgICAgICAubTIgPSB7IC5taW4gPSAweDA1LCAubWF4ID0gMHgwNiB9LAotICAgICAgICAucCA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjAgfSwKLSAgICAgICAgLnAxID0geyAubWluID0gMSwgLm1heCA9IDJ9LAotICAgICAgICAucDIgPSB7IC5kb3RfbGltaXQgPSAwLAorCS5kb3QgPSB7IC5taW4gPSAxNjE2NzAsIC5tYXggPSAyMjcwMDAgfSwKKwkudmNvID0geyAubWluID0gMTc1MDAwMCwgLm1heCA9IDM1MDAwMDB9LAorCS5uID0geyAubWluID0gMSwgLm1heCA9IDIgfSwKKwkubSA9IHsgLm1pbiA9IDk3LCAubWF4ID0gMTA4IH0sCisJLm0xID0geyAubWluID0gMHgxMCwgLm1heCA9IDB4MTIgfSwKKwkubTIgPSB7IC5taW4gPSAweDA1LCAubWF4ID0gMHgwNiB9LAorCS5wID0geyAubWluID0gMTAsIC5tYXggPSAyMCB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSAyfSwKKwkucDIgPSB7IC5kb3RfbGltaXQgPSAwLAogCQkucDJfc2xvdyA9IDEwLCAucDJfZmFzdCA9IDEwIH0sCi0gICAgICAgIC5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2c0eF9kcCwKKwkuZmluZF9wbGwgPSBpbnRlbF9maW5kX3BsbF9nNHhfZHAsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfcGluZXZpZXdfc2R2byA9IHsKLSAgICAgICAgLmRvdCA9IHsgLm1pbiA9IDIwMDAwLCAubWF4ID0gNDAwMDAwfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDE3MDAwMDAsIC5tYXggPSAzNTAwMDAwIH0sCisJLmRvdCA9IHsgLm1pbiA9IDIwMDAwLCAubWF4ID0gNDAwMDAwfSwKKwkudmNvID0geyAubWluID0gMTcwMDAwMCwgLm1heCA9IDM1MDAwMDAgfSwKIAkvKiBQaW5ldmlldydzIE5jb3VudGVyIGlzIGEgcmluZyBjb3VudGVyICovCi0gICAgICAgIC5uID0geyAubWluID0gMywgLm1heCA9IDYgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSAyLCAubWF4ID0gMjU2IH0sCisJLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gNiB9LAorCS5tID0geyAubWluID0gMiwgLm1heCA9IDI1NiB9LAogCS8qIFBpbmV2aWV3IG9ubHkgaGFzIG9uZSBjb21iaW5lZCBtIGRpdmlkZXIsIHdoaWNoIHdlIHRyZWF0IGFzIG0yLiAqLwotICAgICAgICAubTEgPSB7IC5taW4gPSAwLCAubWF4ID0gMCB9LAotICAgICAgICAubTIgPSB7IC5taW4gPSAwLCAubWF4ID0gMjU0IH0sCi0gICAgICAgIC5wID0geyAubWluID0gNSwgLm1heCA9IDgwIH0sCi0gICAgICAgIC5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCisJLm0xID0geyAubWluID0gMCwgLm1heCA9IDAgfSwKKwkubTIgPSB7IC5taW4gPSAwLCAubWF4ID0gMjU0IH0sCisJLnAgPSB7IC5taW4gPSA1LCAubWF4ID0gODAgfSwKKwkucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gOCB9LAogCS5wMiA9IHsgLmRvdF9saW1pdCA9IDIwMDAwMCwKIAkJLnAyX3Nsb3cgPSAxMCwgLnAyX2Zhc3QgPSA1IH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19waW5ldmlld19sdmRzID0gewotICAgICAgICAuZG90ID0geyAubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDAgfSwKLSAgICAgICAgLnZjbyA9IHsgLm1pbiA9IDE3MDAwMDAsIC5tYXggPSAzNTAwMDAwIH0sCi0gICAgICAgIC5uID0geyAubWluID0gMywgLm1heCA9IDYgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSAyLCAubWF4ID0gMjU2IH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDAsIC5tYXggPSAwIH0sCi0gICAgICAgIC5tMiA9IHsgLm1pbiA9IDAsIC5tYXggPSAyNTQgfSwKLSAgICAgICAgLnAgPSB7IC5taW4gPSA3LCAubWF4ID0gMTEyIH0sCi0gICAgICAgIC5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCisJLmRvdCA9IHsgLm1pbiA9IDIwMDAwLCAubWF4ID0gNDAwMDAwIH0sCisJLnZjbyA9IHsgLm1pbiA9IDE3MDAwMDAsIC5tYXggPSAzNTAwMDAwIH0sCisJLm4gPSB7IC5taW4gPSAzLCAubWF4ID0gNiB9LAorCS5tID0geyAubWluID0gMiwgLm1heCA9IDI1NiB9LAorCS5tMSA9IHsgLm1pbiA9IDAsIC5tYXggPSAwIH0sCisJLm0yID0geyAubWluID0gMCwgLm1heCA9IDI1NCB9LAorCS5wID0geyAubWluID0gNywgLm1heCA9IDExMiB9LAorCS5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSA4IH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMTEyMDAwLAogCQkucDJfc2xvdyA9IDE0LCAucDJfZmFzdCA9IDE0IH0sCiAJLmZpbmRfcGxsID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKQEAgLTMyMSw3ICszMjIsNyBAQAogCS5tMSA9IHsgLm1pbiA9IDEyLCAubWF4ID0gMjIgfSwKIAkubTIgPSB7IC5taW4gPSA1LCAubWF4ID0gOSB9LAogCS5wID0geyAubWluID0gMjgsIC5tYXggPSAxMTIgfSwKLQkucDEgPSB7IC5taW4gPSAyLC5tYXggPSA4IH0sCisJLnAxID0geyAubWluID0gMiwgLm1heCA9IDggfSwKIAkucDIgPSB7IC5kb3RfbGltaXQgPSAyMjUwMDAsCiAJCS5wMl9zbG93ID0gMTQsIC5wMl9mYXN0ID0gMTQgfSwKIAkuZmluZF9wbGwgPSBpbnRlbF9nNHhfZmluZF9iZXN0X1BMTCwKQEAgLTMzNSwyNCArMzM2LDI0IEBACiAJLm0xID0geyAubWluID0gMTIsIC5tYXggPSAyMiB9LAogCS5tMiA9IHsgLm1pbiA9IDUsIC5tYXggPSA5IH0sCiAJLnAgPSB7IC5taW4gPSAxNCwgLm1heCA9IDQyIH0sCi0JLnAxID0geyAubWluID0gMiwubWF4ID0gNiB9LAorCS5wMSA9IHsgLm1pbiA9IDIsIC5tYXggPSA2IH0sCiAJLnAyID0geyAuZG90X2xpbWl0ID0gMjI1MDAwLAogCQkucDJfc2xvdyA9IDcsIC5wMl9mYXN0ID0gNyB9LAogCS5maW5kX3BsbCA9IGludGVsX2c0eF9maW5kX2Jlc3RfUExMLAogfTsKIAogc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2lyb25sYWtlX2Rpc3BsYXlfcG9ydCA9IHsKLSAgICAgICAgLmRvdCA9IHsgLm1pbiA9IDI1MDAwLCAubWF4ID0gMzUwMDAwIH0sCi0gICAgICAgIC52Y28gPSB7IC5taW4gPSAxNzYwMDAwLCAubWF4ID0gMzUxMDAwMH0sCi0gICAgICAgIC5uID0geyAubWluID0gMSwgLm1heCA9IDIgfSwKLSAgICAgICAgLm0gPSB7IC5taW4gPSA4MSwgLm1heCA9IDkwIH0sCi0gICAgICAgIC5tMSA9IHsgLm1pbiA9IDEyLCAubWF4ID0gMjIgfSwKLSAgICAgICAgLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKLSAgICAgICAgLnAgPSB7IC5taW4gPSAxMCwgLm1heCA9IDIwIH0sCi0gICAgICAgIC5wMSA9IHsgLm1pbiA9IDEsIC5tYXggPSAyfSwKLSAgICAgICAgLnAyID0geyAuZG90X2xpbWl0ID0gMCwKKwkuZG90ID0geyAubWluID0gMjUwMDAsIC5tYXggPSAzNTAwMDAgfSwKKwkudmNvID0geyAubWluID0gMTc2MDAwMCwgLm1heCA9IDM1MTAwMDB9LAorCS5uID0geyAubWluID0gMSwgLm1heCA9IDIgfSwKKwkubSA9IHsgLm1pbiA9IDgxLCAubWF4ID0gOTAgfSwKKwkubTEgPSB7IC5taW4gPSAxMiwgLm1heCA9IDIyIH0sCisJLm0yID0geyAubWluID0gNSwgLm1heCA9IDkgfSwKKwkucCA9IHsgLm1pbiA9IDEwLCAubWF4ID0gMjAgfSwKKwkucDEgPSB7IC5taW4gPSAxLCAubWF4ID0gMn0sCisJLnAyID0geyAuZG90X2xpbWl0ID0gMCwKIAkJLnAyX3Nsb3cgPSAxMCwgLnAyX2Zhc3QgPSAxMCB9LAotICAgICAgICAuZmluZF9wbGwgPSBpbnRlbF9maW5kX3BsbF9pcm9ubGFrZV9kcCwKKwkuZmluZF9wbGwgPSBpbnRlbF9maW5kX3BsbF9pcm9ubGFrZV9kcCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90ICppbnRlbF9pcm9ubGFrZV9saW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC00MDQsNyArNDA1LDcgQEAKIAkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9oZG1pOwogCX0gZWxzZSBpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfU0RWTykpIHsKIAkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9zZHZvOwotCX0gZWxzZSBpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZSAoY3J0YywgSU5URUxfT1VUUFVUX0RJU1BMQVlQT1JUKSkgeworCX0gZWxzZSBpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQpKSB7CiAJCWxpbWl0ID0gJmludGVsX2xpbWl0c19nNHhfZGlzcGxheV9wb3J0OwogCX0gZWxzZSAvKiBUaGUgb3B0aW9uIGlzIGZvciBvdGhlciBvdXRwdXRzICovCiAJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pOXh4X3Nkdm87CkBAIC00ODgsMjYgKzQ4OSwyNiBAQAogCQkJICAgICAgIGNvbnN0IGludGVsX2Nsb2NrX3QgKmNsb2NrKQogewogCWlmIChjbG9jay0+cDEgIDwgbGltaXQtPnAxLm1pbiAgfHwgbGltaXQtPnAxLm1heCAgPCBjbG9jay0+cDEpCi0JCUlOVEVMUGxsSW52YWxpZCAoInAxIG91dCBvZiByYW5nZVxuIik7CisJCUlOVEVMUGxsSW52YWxpZCgicDEgb3V0IG9mIHJhbmdlXG4iKTsKIAlpZiAoY2xvY2stPnAgICA8IGxpbWl0LT5wLm1pbiAgIHx8IGxpbWl0LT5wLm1heCAgIDwgY2xvY2stPnApCi0JCUlOVEVMUGxsSW52YWxpZCAoInAgb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJwIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT5tMiAgPCBsaW1pdC0+bTIubWluICB8fCBsaW1pdC0+bTIubWF4ICA8IGNsb2NrLT5tMikKLQkJSU5URUxQbGxJbnZhbGlkICgibTIgb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJtMiBvdXQgb2YgcmFuZ2VcbiIpOwogCWlmIChjbG9jay0+bTEgIDwgbGltaXQtPm0xLm1pbiAgfHwgbGltaXQtPm0xLm1heCAgPCBjbG9jay0+bTEpCi0JCUlOVEVMUGxsSW52YWxpZCAoIm0xIG91dCBvZiByYW5nZVxuIik7CisJCUlOVEVMUGxsSW52YWxpZCgibTEgb3V0IG9mIHJhbmdlXG4iKTsKIAlpZiAoY2xvY2stPm0xIDw9IGNsb2NrLT5tMiAmJiAhSVNfUElORVZJRVcoZGV2KSkKLQkJSU5URUxQbGxJbnZhbGlkICgibTEgPD0gbTJcbiIpOworCQlJTlRFTFBsbEludmFsaWQoIm0xIDw9IG0yXG4iKTsKIAlpZiAoY2xvY2stPm0gICA8IGxpbWl0LT5tLm1pbiAgIHx8IGxpbWl0LT5tLm1heCAgIDwgY2xvY2stPm0pCi0JCUlOVEVMUGxsSW52YWxpZCAoIm0gb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJtIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT5uICAgPCBsaW1pdC0+bi5taW4gICB8fCBsaW1pdC0+bi5tYXggICA8IGNsb2NrLT5uKQotCQlJTlRFTFBsbEludmFsaWQgKCJuIG91dCBvZiByYW5nZVxuIik7CisJCUlOVEVMUGxsSW52YWxpZCgibiBvdXQgb2YgcmFuZ2VcbiIpOwogCWlmIChjbG9jay0+dmNvIDwgbGltaXQtPnZjby5taW4gfHwgbGltaXQtPnZjby5tYXggPCBjbG9jay0+dmNvKQotCQlJTlRFTFBsbEludmFsaWQgKCJ2Y28gb3V0IG9mIHJhbmdlXG4iKTsKKwkJSU5URUxQbGxJbnZhbGlkKCJ2Y28gb3V0IG9mIHJhbmdlXG4iKTsKIAkvKiBYWFg6IFdlIG1heSBuZWVkIHRvIGJlIGNoZWNraW5nICJEb3QgY2xvY2siIGRlcGVuZGluZyBvbiB0aGUgbXVsdGlwbGllciwKIAkgKiBjb25uZWN0b3IsIGV0Yy4sIHJhdGhlciB0aGFuIGp1c3QgYSBzaW5nbGUgcmFuZ2UuCiAJICovCiAJaWYgKGNsb2NrLT5kb3QgPCBsaW1pdC0+ZG90Lm1pbiB8fCBsaW1pdC0+ZG90Lm1heCA8IGNsb2NrLT5kb3QpCi0JCUlOVEVMUGxsSW52YWxpZCAoImRvdCBvdXQgb2YgcmFuZ2VcbiIpOworCQlJTlRFTFBsbEludmFsaWQoImRvdCBvdXQgb2YgcmFuZ2VcbiIpOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC01NDIsNyArNTQzLDcgQEAKIAkJCWNsb2NrLnAyID0gbGltaXQtPnAyLnAyX2Zhc3Q7CiAJfQogCi0JbWVtc2V0IChiZXN0X2Nsb2NrLCAwLCBzaXplb2YgKCpiZXN0X2Nsb2NrKSk7CisJbWVtc2V0KGJlc3RfY2xvY2ssIDAsIHNpemVvZigqYmVzdF9jbG9jaykpOwogCiAJZm9yIChjbG9jay5tMSA9IGxpbWl0LT5tMS5taW47IGNsb2NrLm0xIDw9IGxpbWl0LT5tMS5tYXg7CiAJICAgICBjbG9jay5tMSsrKSB7CkBAIC04MDIsNiArODAzLDE5IEBACiAJdTMyIHZhbDsKIAlib29sIGN1cl9zdGF0ZTsKIAorCWlmIChIQVNfUENIX0NQVChkZXZfcHJpdi0+ZGV2KSkgeworCQl1MzIgcGNoX2RwbGw7CisKKwkJcGNoX2RwbGwgPSBJOTE1X1JFQUQoUENIX0RQTExfU0VMKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIHNlbGVjdGVkIFBMTCBpcyBlbmFibGVkIHRvIHRoZSB0cmFuc2NvZGVyICovCisJCVdBUk4oISgocGNoX2RwbGwgPj4gKDQgKiBwaXBlKSkgJiA4KSwKKwkJICAgICAidHJhbnNjb2RlciAlZCBQTEwgbm90IGVuYWJsZWRcbiIsIHBpcGUpOworCisJCS8qIENvbnZlcnQgdGhlIHRyYW5zY29kZXIgcGlwZSBudW1iZXIgdG8gYSBwbGwgcGlwZSBudW1iZXIgKi8KKwkJcGlwZSA9IChwY2hfZHBsbCA+PiAoNCAqIHBpcGUpKSAmIDE7CisJfQorCiAJcmVnID0gUENIX0RQTEwocGlwZSk7CiAJdmFsID0gSTkxNV9SRUFEKHJlZyk7CiAJY3VyX3N0YXRlID0gISEodmFsICYgRFBMTF9WQ09fRU5BQkxFKTsKQEAgLTExNzEsNiArMTE4NSw5IEBACiAJaW50IHJlZzsKIAl1MzIgdmFsOwogCisJaWYgKHBpcGUgPiAxKQorCQlyZXR1cm47CisKIAkvKiBQQ0ggb25seSBhdmFpbGFibGUgb24gSUxLKyAqLwogCUJVR19PTihkZXZfcHJpdi0+aW5mby0+Z2VuIDwgNSk7CiAKQEAgLTExOTEsNiArMTIwOCw5IEBACiAJaW50IHJlZzsKIAl1MzIgdmFsOwogCisJaWYgKHBpcGUgPiAxKQorCQlyZXR1cm47CisKIAkvKiBQQ0ggb25seSBhdmFpbGFibGUgb24gSUxLKyAqLwogCUJVR19PTihkZXZfcHJpdi0+aW5mby0+Z2VuIDwgNSk7CiAKQEAgLTEyNTYsNyArMTI3Niw3IEBACiAJSTkxNV9XUklURShyZWcsIHZhbCk7CiAJLyogd2FpdCBmb3IgUENIIHRyYW5zY29kZXIgb2ZmLCB0cmFuc2NvZGVyIHN0YXRlICovCiAJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQocmVnKSAmIFRSQU5TX1NUQVRFX0VOQUJMRSkgPT0gMCwgNTApKQotCQlEUk1fRVJST1IoImZhaWxlZCB0byBkaXNhYmxlIHRyYW5zY29kZXJcbiIpOworCQlEUk1fRVJST1IoImZhaWxlZCB0byBkaXNhYmxlIHRyYW5zY29kZXIgJWRcbiIsIHBpcGUpOwogfQogCiAvKioKQEAgLTIwODUsNiArMjEwNSw3IEBACiAJc3dpdGNoIChwbGFuZSkgewogCWNhc2UgMDoKIAljYXNlIDE6CisJY2FzZSAyOgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwbGFuZSAlZCBpbiBTQVJFQVxuIiwgcGxhbmUpOwpAQCAtMjE4NCw2ICsyMjA1LDEwIEBACiAJY2FzZSAwOgogCWNhc2UgMToKIAkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAoSVNfSVZZQlJJREdFKGRldikpCisJCQlicmVhazsKKwkJLyogZmFsbCB0aHJvdWdoIG90aGVyd2lzZSAqLwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigibm8gcGxhbmUgZm9yIGNydGNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0NDAsNyArMjQ2NSw3IEBACiAKIH0KIAotc3RhdGljIGNvbnN0IGludCBzbmJfYl9mZGlfdHJhaW5fcGFyYW0gW10gPSB7CitzdGF0aWMgY29uc3QgaW50IHNuYl9iX2ZkaV90cmFpbl9wYXJhbVtdID0gewogCUZESV9MSU5LX1RSQUlOXzQwME1WXzBEQl9TTkJfQiwKIAlGRElfTElOS19UUkFJTl80MDBNVl82REJfU05CX0IsCiAJRkRJX0xJTktfVFJBSU5fNjAwTVZfM181REJfU05CX0IsCkBAIC0yNDk2LDcgKzI1MjEsNyBAQAogCWlmIChIQVNfUENIX0NQVChkZXYpKQogCQljcHRfcGhhc2VfcG9pbnRlcl9lbmFibGUoZGV2LCBwaXBlKTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKysgKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlyZWcgPSBGRElfVFhfQ1RMKHBpcGUpOwogCQl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CiAJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTSzsKQEAgLTI1NDUsNyArMjU3MCw3IEBACiAJUE9TVElOR19SRUFEKHJlZyk7CiAJdWRlbGF5KDE1MCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrICkgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKIAkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwogCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CkBAIC0yNjAwLDYgKzI2MjUsNyBAQAogCXRlbXAgfD0gRkRJX0xJTktfVFJBSU5fUEFUVEVSTl8xX0lWQjsKIAl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CiAJdGVtcCB8PSBGRElfTElOS19UUkFJTl80MDBNVl8wREJfU05CX0I7CisJdGVtcCB8PSBGRElfQ09NUE9TSVRFX1NZTkM7CiAJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElfVFhfRU5BQkxFKTsKIAogCXJlZyA9IEZESV9SWF9DVEwocGlwZSk7CkBAIC0yNjA3LDYgKzI2MzMsNyBAQAogCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX0FVVE87CiAJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fUEFUVEVSTl9NQVNLX0NQVDsKIAl0ZW1wIHw9IEZESV9MSU5LX1RSQUlOX1BBVFRFUk5fMV9DUFQ7CisJdGVtcCB8PSBGRElfQ09NUE9TSVRFX1NZTkM7CiAJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElfUlhfRU5BQkxFKTsKIAogCVBPU1RJTkdfUkVBRChyZWcpOwpAQCAtMjYxNSw3ICsyNjQyLDcgQEAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKIAkJY3B0X3BoYXNlX3BvaW50ZXJfZW5hYmxlKGRldiwgcGlwZSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrICkgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKIAkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwogCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CkBAIC0yNjU3LDcgKzI2ODQsNyBAQAogCVBPU1RJTkdfUkVBRChyZWcpOwogCXVkZWxheSgxNTApOwogCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKyApIHsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXJlZyA9IEZESV9UWF9DVEwocGlwZSk7CiAJCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKIAkJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLOwpAQCAtMjg2Niw3ICsyODkzLDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0JdTMyIHJlZywgdGVtcDsKKwl1MzIgcmVnLCB0ZW1wLCB0cmFuc2Nfc2VsOwogCiAJLyogRm9yIFBDSCBvdXRwdXQsIHRyYWluaW5nIEZESSBsaW5rICovCiAJZGV2X3ByaXYtPmRpc3BsYXkuZmRpX2xpbmtfdHJhaW4oY3J0Yyk7CkBAIC0yODc0LDEyICsyOTAxLDIxIEBACiAJaW50ZWxfZW5hYmxlX3BjaF9wbGwoZGV2X3ByaXYsIHBpcGUpOwogCiAJaWYgKEhBU19QQ0hfQ1BUKGRldikpIHsKKwkJdHJhbnNjX3NlbCA9IGludGVsX2NydGMtPnVzZV9wbGxfYSA/IFRSQU5TQ19EUExMQV9TRUwgOgorCQkJVFJBTlNDX0RQTExCX1NFTDsKKwogCQkvKiBCZSBzdXJlIFBDSCBEUExMIFNFTCBpcyBzZXQgKi8KIAkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfRFBMTF9TRUwpOwotCQlpZiAocGlwZSA9PSAwICYmICh0ZW1wICYgVFJBTlNBX0RQTExfRU5BQkxFKSA9PSAwKQorCQlpZiAocGlwZSA9PSAwKSB7CisJCQl0ZW1wICY9IH4oVFJBTlNBX0RQTExCX1NFTCk7CiAJCQl0ZW1wIHw9IChUUkFOU0FfRFBMTF9FTkFCTEUgfCBUUkFOU0FfRFBMTEFfU0VMKTsKLQkJZWxzZSBpZiAocGlwZSA9PSAxICYmICh0ZW1wICYgVFJBTlNCX0RQTExfRU5BQkxFKSA9PSAwKQorCQl9IGVsc2UgaWYgKHBpcGUgPT0gMSkgeworCQkJdGVtcCAmPSB+KFRSQU5TQl9EUExMQl9TRUwpOwogCQkJdGVtcCB8PSAoVFJBTlNCX0RQTExfRU5BQkxFIHwgVFJBTlNCX0RQTExCX1NFTCk7CisJCX0gZWxzZSBpZiAocGlwZSA9PSAyKSB7CisJCQl0ZW1wICY9IH4oVFJBTlNDX0RQTExCX1NFTCk7CisJCQl0ZW1wIHw9IChUUkFOU0NfRFBMTF9FTkFCTEUgfCB0cmFuc2Nfc2VsKTsKKwkJfQogCQlJOTE1X1dSSVRFKFBDSF9EUExMX1NFTCwgdGVtcCk7CiAJfQogCkBAIC0yOTM1LDYgKzI5NzEsMjQgQEAKIAlpbnRlbF9lbmFibGVfdHJhbnNjb2RlcihkZXZfcHJpdiwgcGlwZSk7CiB9CiAKK3ZvaWQgaW50ZWxfY3B0X3ZlcmlmeV9tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGRzbHJlZyA9IFBJUEVEU0wocGlwZSksIHRjMnJlZyA9IFRSQU5TX0NISUNLRU4yKHBpcGUpOworCXUzMiB0ZW1wOworCisJdGVtcCA9IEk5MTVfUkVBRChkc2xyZWcpOworCXVkZWxheSg1MDApOworCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoZHNscmVnKSAhPSB0ZW1wLCA1KSkgeworCQkvKiBXaXRob3V0IHRoaXMsIG1vZGUgc2V0cyBtYXkgZmFpbCBzaWxlbnRseSBvbiBGREkgKi8KKwkJSTkxNV9XUklURSh0YzJyZWcsIFRSQU5TX0FVVE9UUkFJTl9HRU5fU1RBTExfRElTKTsKKwkJdWRlbGF5KDI1MCk7CisJCUk5MTVfV1JJVEUodGMycmVnLCAwKTsKKwkJaWYgKHdhaXRfZm9yKEk5MTVfUkVBRChkc2xyZWcpICE9IHRlbXAsIDUpKQorCQkJRFJNX0VSUk9SKCJtb2RlIHNldCBmYWlsZWQ6IHBpcGUgJWQgc3R1Y2tcbiIsIHBpcGUpOworCX0KK30KKwogc3RhdGljIHZvaWQgaXJvbmxha2VfY3J0Y19lbmFibGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CkBAIC0zMDQ1LDEzICszMDk5LDEzIEBACiAJCXRlbXAgPSBJOTE1X1JFQUQoUENIX0RQTExfU0VMKTsKIAkJc3dpdGNoIChwaXBlKSB7CiAJCWNhc2UgMDoKLQkJCXRlbXAgJj0gfihUUkFOU0FfRFBMTF9FTkFCTEUgfCBUUkFOU0FfRFBMTEFfU0VMKTsKKwkJCXRlbXAgJj0gfihUUkFOU0FfRFBMTF9FTkFCTEUgfCBUUkFOU0FfRFBMTEJfU0VMKTsKIAkJCWJyZWFrOwogCQljYXNlIDE6CiAJCQl0ZW1wICY9IH4oVFJBTlNCX0RQTExfRU5BQkxFIHwgVFJBTlNCX0RQTExCX1NFTCk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJLyogRklYTUU6IG1hbmFnZSB0cmFuc2NvZGVyIFBMTHM/ICovCisJCQkvKiBDIHNoYXJlcyBQTEwgQSBvciBCICovCiAJCQl0ZW1wICY9IH4oVFJBTlNDX0RQTExfRU5BQkxFIHwgVFJBTlNDX0RQTExCX1NFTCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTMwNjEsNyArMzExNSw4IEBACiAJfQogCiAJLyogZGlzYWJsZSBQQ0ggRFBMTCAqLwotCWludGVsX2Rpc2FibGVfcGNoX3BsbChkZXZfcHJpdiwgcGlwZSk7CisJaWYgKCFpbnRlbF9jcnRjLT5ub19wbGwpCisJCWludGVsX2Rpc2FibGVfcGNoX3BsbChkZXZfcHJpdiwgcGlwZSk7CiAKIAkvKiBTd2l0Y2ggZnJvbSBQQ0RjbGsgdG8gUmF3Y2xrICovCiAJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKQEAgLTMyOTMsMTggKzMzNDgsMjUgQEAKIAlpcm9ubGFrZV9jcnRjX2VuYWJsZShjcnRjKTsKIH0KIAotdm9pZCBpbnRlbF9lbmNvZGVyX3ByZXBhcmUgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3ZvaWQgaW50ZWxfZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CiAJLyogbHZkcyBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIHByZXBhcmUgc2VlIGludGVsX2x2ZHNfcHJlcGFyZSAqLwogCWVuY29kZXJfZnVuY3MtPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOwogfQogCi12b2lkIGludGVsX2VuY29kZXJfY29tbWl0IChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit2b2lkIGludGVsX2VuY29kZXJfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciA9IHRvX2ludGVsX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGludGVsX2VuY29kZXItPmJhc2UuY3J0Yyk7CisKIAkvKiBsdmRzIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgY29tbWl0IHNlZSBpbnRlbF9sdmRzX2NvbW1pdCAqLwogCWVuY29kZXJfZnVuY3MtPmRwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKKwkJaW50ZWxfY3B0X3ZlcmlmeV9tb2Rlc2V0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CiB9CiAKIHZvaWQgaW50ZWxfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTQ0NzgsNiArNDU0MCwyMCBAQAogCQllbmFibGVkIHw9IDI7CiAJfQogCisJLyogSVZCIGhhcyAzIHBpcGVzICovCisJaWYgKElTX0lWWUJSSURHRShkZXYpICYmCisJICAgIGc0eF9jb21wdXRlX3dtMChkZXYsIDIsCisJCQkgICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKKwkJCSAgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkgICAgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCQlJOTE1X1dSSVRFKFdNMF9QSVBFQ19JVkIsCisJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKKwkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEMgLSIKKwkJCSAgICAgICIgcGxhbmUgJWQsIGN1cnNvcjogJWRcbiIsCisJCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKKwkJZW5hYmxlZCB8PSAzOworCX0KKwogCS8qCiAJICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgb25seSB3aGVuIG9uZQogCSAqIGRpc3BsYXkgcGxhbmUgaXMgdXNlZC4KQEAgLTQ1ODQsNyArNDY2MCw5IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wYW5lbF91c2Vfc3NjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlyZXR1cm4gZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyAmJiBpOTE1X3BhbmVsX3VzZV9zc2MKKwlpZiAoaTkxNV9wYW5lbF91c2Vfc3NjID49IDApCisJCXJldHVybiBpOTE1X3BhbmVsX3VzZV9zc2MgIT0gMDsKKwlyZXR1cm4gZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYwogCQkmJiAhKGRldl9wcml2LT5xdWlya3MgJiBRVUlSS19MVkRTX1NTQ19ESVNBQkxFKTsKIH0KIApAQCAtNTEwNywzNiArNTE4NSw1MiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGlyb25sYWtlX3VwZGF0ZV9wY2hfcmVmY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCisvKgorICogSW5pdGlhbGl6ZSByZWZlcmVuY2UgY2xvY2tzIHdoZW4gdGhlIGRyaXZlciBsb2FkcworICovCit2b2lkIGlyb25sYWtlX2luaXRfcGNoX3JlZmNsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqbW9kZV9jb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7Ci0Jc3RydWN0IGludGVsX2VuY29kZXIgKmhhc19lZHBfZW5jb2RlciA9IE5VTEw7CiAJdTMyIHRlbXA7CiAJYm9vbCBoYXNfbHZkcyA9IGZhbHNlOworCWJvb2wgaGFzX2NwdV9lZHAgPSBmYWxzZTsKKwlib29sIGhhc19wY2hfZWRwID0gZmFsc2U7CisJYm9vbCBoYXNfcGFuZWwgPSBmYWxzZTsKKwlib29sIGhhc19jazUwNSA9IGZhbHNlOworCWJvb2wgY2FuX3NzYyA9IGZhbHNlOwogCiAJLyogV2UgbmVlZCB0byB0YWtlIHRoZSBnbG9iYWwgY29uZmlnIGludG8gYWNjb3VudCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJm1vZGVfY29uZmlnLT5jcnRjX2xpc3QsIGhlYWQpIHsKLQkJaWYgKCFjcnRjLT5lbmFibGVkKQotCQkJY29udGludWU7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmbW9kZV9jb25maWctPmVuY29kZXJfbGlzdCwKLQkJCQkgICAgYmFzZS5oZWFkKSB7Ci0JCQlpZiAoZW5jb2Rlci0+YmFzZS5jcnRjICE9IGNydGMpCi0JCQkJY29udGludWU7Ci0KLQkJCXN3aXRjaCAoZW5jb2Rlci0+dHlwZSkgewotCQkJY2FzZSBJTlRFTF9PVVRQVVRfTFZEUzoKLQkJCQloYXNfbHZkcyA9IHRydWU7Ci0JCQljYXNlIElOVEVMX09VVFBVVF9FRFA6Ci0JCQkJaGFzX2VkcF9lbmNvZGVyID0gZW5jb2RlcjsKLQkJCQlicmVhazsKLQkJCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZtb2RlX2NvbmZpZy0+ZW5jb2Rlcl9saXN0LAorCQkJICAgIGJhc2UuaGVhZCkgeworCQlzd2l0Y2ggKGVuY29kZXItPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfTFZEUzoKKwkJCWhhc19wYW5lbCA9IHRydWU7CisJCQloYXNfbHZkcyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfRURQOgorCQkJaGFzX3BhbmVsID0gdHJ1ZTsKKwkJCWlmIChpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmVuY29kZXItPmJhc2UpKQorCQkJCWhhc19wY2hfZWRwID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQloYXNfY3B1X2VkcCA9IHRydWU7CisJCQlicmVhazsKIAkJfQogCX0KIAorCWlmIChIQVNfUENIX0lCWChkZXYpKSB7CisJCWhhc19jazUwNSA9IGRldl9wcml2LT5kaXNwbGF5X2Nsb2NrX21vZGU7CisJCWNhbl9zc2MgPSBoYXNfY2s1MDU7CisJfSBlbHNlIHsKKwkJaGFzX2NrNTA1ID0gZmFsc2U7CisJCWNhbl9zc2MgPSB0cnVlOworCX0KKworCURSTV9ERUJVR19LTVMoImhhc19wYW5lbCAlZCBoYXNfbHZkcyAlZCBoYXNfcGNoX2VkcCAlZCBoYXNfY3B1X2VkcCAlZCBoYXNfY2s1MDUgJWRcbiIsCisJCSAgICAgIGhhc19wYW5lbCwgaGFzX2x2ZHMsIGhhc19wY2hfZWRwLCBoYXNfY3B1X2VkcCwKKwkJICAgICAgaGFzX2NrNTA1KTsKKwogCS8qIElyb25sYWtlOiB0cnkgdG8gc2V0dXAgZGlzcGxheSByZWYgY2xvY2sgYmVmb3JlIERQTEwKIAkgKiBlbmFibGluZy4gVGhpcyBpcyBvbmx5IHVuZGVyIGRyaXZlcidzIGNvbnRyb2wgYWZ0ZXIKIAkgKiBQQ0ggQiBzdGVwcGluZywgcHJldmlvdXMgY2hpcHNldCBzdGVwcGluZyBzaG91bGQgYmUKQEAgLTUxNDUsNDMgKzUyMzksMTAyIEBACiAJdGVtcCA9IEk5MTVfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKIAkvKiBBbHdheXMgZW5hYmxlIG5vbnNwcmVhZCBzb3VyY2UgKi8KIAl0ZW1wICY9IH5EUkVGX05PTlNQUkVBRF9TT1VSQ0VfTUFTSzsKLQl0ZW1wIHw9IERSRUZfTk9OU1BSRUFEX1NPVVJDRV9FTkFCTEU7Ci0JdGVtcCAmPSB+RFJFRl9TU0NfU09VUkNFX01BU0s7Ci0JdGVtcCB8PSBEUkVGX1NTQ19TT1VSQ0VfRU5BQkxFOwotCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CiAKLQlQT1NUSU5HX1JFQUQoUENIX0RSRUZfQ09OVFJPTCk7Ci0JdWRlbGF5KDIwMCk7CisJaWYgKGhhc19jazUwNSkKKwkJdGVtcCB8PSBEUkVGX05PTlNQUkVBRF9DSzUwNV9FTkFCTEU7CisJZWxzZQorCQl0ZW1wIHw9IERSRUZfTk9OU1BSRUFEX1NPVVJDRV9FTkFCTEU7CiAKLQlpZiAoaGFzX2VkcF9lbmNvZGVyKSB7Ci0JCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgeworCWlmIChoYXNfcGFuZWwpIHsKKwkJdGVtcCAmPSB+RFJFRl9TU0NfU09VUkNFX01BU0s7CisJCXRlbXAgfD0gRFJFRl9TU0NfU09VUkNFX0VOQUJMRTsKKworCQkvKiBTU0MgbXVzdCBiZSB0dXJuZWQgb24gYmVmb3JlIGVuYWJsaW5nIHRoZSBDUFUgb3V0cHV0ICAqLworCQlpZiAoaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgY2FuX3NzYykgeworCQkJRFJNX0RFQlVHX0tNUygiVXNpbmcgU1NDIG9uIHBhbmVsXG4iKTsKIAkJCXRlbXAgfD0gRFJFRl9TU0MxX0VOQUJMRTsKLQkJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7Ci0KLQkJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKLQkJCXVkZWxheSgyMDApOwogCQl9CisKKwkJLyogR2V0IFNTQyBnb2luZyBiZWZvcmUgZW5hYmxpbmcgdGhlIG91dHB1dHMgKi8KKwkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKKwkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOworCQl1ZGVsYXkoMjAwKTsKKwogCQl0ZW1wICY9IH5EUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX01BU0s7CiAKIAkJLyogRW5hYmxlIENQVSBzb3VyY2Ugb24gQ1BVIGF0dGFjaGVkIGVEUCAqLwotCQlpZiAoIWludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewotCQkJaWYgKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpKQorCQlpZiAoaGFzX2NwdV9lZHApIHsKKwkJCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSAmJiBjYW5fc3NjKSB7CisJCQkJRFJNX0RFQlVHX0tNUygiVXNpbmcgU1NDIG9uIGVEUFxuIik7CiAJCQkJdGVtcCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX0RPV05TUFJFQUQ7CisJCQl9CiAJCQllbHNlCiAJCQkJdGVtcCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX05PTlNQUkVBRDsKLQkJfSBlbHNlIHsKLQkJCS8qIEVuYWJsZSBTU0Mgb24gUENIIGVEUCBpZiBuZWVkZWQgKi8KLQkJCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgewotCQkJCURSTV9FUlJPUigiZW5hYmxpbmcgU1NDIG9uIFBDSFxuIik7Ci0JCQkJdGVtcCB8PSBEUkVGX1NVUEVSU1BSRUFEX1NPVVJDRV9FTkFCTEU7Ci0JCQl9Ci0JCX0KKwkJfSBlbHNlCisJCQl0ZW1wIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfRElTQUJMRTsKKworCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIHRlbXApOworCQlQT1NUSU5HX1JFQUQoUENIX0RSRUZfQ09OVFJPTCk7CisJCXVkZWxheSgyMDApOworCX0gZWxzZSB7CisJCURSTV9ERUJVR19LTVMoIkRpc2FibGluZyBTU0MgZW50aXJlbHlcbiIpOworCisJCXRlbXAgJj0gfkRSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfTUFTSzsKKworCQkvKiBUdXJuIG9mZiBDUFUgb3V0cHV0ICovCisJCXRlbXAgfD0gRFJFRl9DUFVfU09VUkNFX09VVFBVVF9ESVNBQkxFOworCisJCUk5MTVfV1JJVEUoUENIX0RSRUZfQ09OVFJPTCwgdGVtcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfRFJFRl9DT05UUk9MKTsKKwkJdWRlbGF5KDIwMCk7CisKKwkJLyogVHVybiBvZmYgdGhlIFNTQyBzb3VyY2UgKi8KKwkJdGVtcCAmPSB+RFJFRl9TU0NfU09VUkNFX01BU0s7CisJCXRlbXAgfD0gRFJFRl9TU0NfU09VUkNFX0RJU0FCTEU7CisKKwkJLyogVHVybiBvZmYgU1NDMSAqLworCQl0ZW1wICY9IH4gRFJFRl9TU0MxX0VOQUJMRTsKKwogCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIHRlbXApOwogCQlQT1NUSU5HX1JFQUQoUENIX0RSRUZfQ09OVFJPTCk7CiAJCXVkZWxheSgyMDApOwogCX0KIH0KIAorc3RhdGljIGludCBpcm9ubGFrZV9nZXRfcmVmY2xrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXI7CisJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqbW9kZV9jb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKKwlzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZWRwX2VuY29kZXIgPSBOVUxMOworCWludCBudW1fY29ubmVjdG9ycyA9IDA7CisJYm9vbCBpc19sdmRzID0gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZtb2RlX2NvbmZpZy0+ZW5jb2Rlcl9saXN0LCBiYXNlLmhlYWQpIHsKKwkJaWYgKGVuY29kZXItPmJhc2UuY3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChlbmNvZGVyLT50eXBlKSB7CisJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CisJCQlpc19sdmRzID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9FRFA6CisJCQllZHBfZW5jb2RlciA9IGVuY29kZXI7CisJCQlicmVhazsKKwkJfQorCQludW1fY29ubmVjdG9ycysrOworCX0KKworCWlmIChpc19sdmRzICYmIGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmIG51bV9jb25uZWN0b3JzIDwgMikgeworCQlEUk1fREVCVUdfS01TKCJ1c2luZyBTU0MgcmVmZXJlbmNlIGNsb2NrIG9mICVkIE1IelxuIiwKKwkJCSAgICAgIGRldl9wcml2LT5sdmRzX3NzY19mcmVxKTsKKwkJcmV0dXJuIGRldl9wcml2LT5sdmRzX3NzY19mcmVxICogMTAwMDsKKwl9CisKKwlyZXR1cm4gMTIwMDAwOworfQorCiBzdGF0aWMgaW50IGlyb25sYWtlX2NydGNfbW9kZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSwKQEAgLTUyNDEsMTYgKzUzOTQsNyBAQAogCQludW1fY29ubmVjdG9ycysrOwogCX0KIAotCWlmIChpc19sdmRzICYmIGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmIG51bV9jb25uZWN0b3JzIDwgMikgewotCQlyZWZjbGsgPSBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSAqIDEwMDA7Ci0JCURSTV9ERUJVR19LTVMoInVzaW5nIFNTQyByZWZlcmVuY2UgY2xvY2sgb2YgJWQgTUh6XG4iLAotCQkJICAgICAgcmVmY2xrIC8gMTAwMCk7Ci0JfSBlbHNlIHsKLQkJcmVmY2xrID0gOTYwMDA7Ci0JCWlmICghaGFzX2VkcF9lbmNvZGVyIHx8Ci0JCSAgICBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpCi0JCQlyZWZjbGsgPSAxMjAwMDA7IC8qIDEyME1oeiByZWZjbGsgKi8KLQl9CisJcmVmY2xrID0gaXJvbmxha2VfZ2V0X3JlZmNsayhjcnRjKTsKIAogCS8qCiAJICogUmV0dXJucyBhIHNldCBvZiBkaXZpc29ycyBmb3IgdGhlIGRlc2lyZWQgdGFyZ2V0IGNsb2NrIHdpdGggdGhlIGdpdmVuCkBAIC01Mzc3LDggKzU1MjEsNiBAQAogCWlyb25sYWtlX2NvbXB1dGVfbV9uKGludGVsX2NydGMtPmJwcCwgbGFuZSwgdGFyZ2V0X2Nsb2NrLCBsaW5rX2J3LAogCQkJICAgICAmbV9uKTsKIAotCWlyb25sYWtlX3VwZGF0ZV9wY2hfcmVmY2xrKGRldik7Ci0KIAlmcCA9IGNsb2NrLm4gPDwgMTYgfCBjbG9jay5tMSA8PCA4IHwgY2xvY2subTI7CiAJaWYgKGhhc19yZWR1Y2VkX2Nsb2NrKQogCQlmcDIgPSByZWR1Y2VkX2Nsb2NrLm4gPDwgMTYgfCByZWR1Y2VkX2Nsb2NrLm0xIDw8IDggfApAQCAtNTQ1MCwzOSArNTU5MiwzMiBAQAogCS8qIFNldCB1cCB0aGUgZGlzcGxheSBwbGFuZSByZWdpc3RlciAqLwogCWRzcGNudHIgPSBESVNQUExBTkVfR0FNTUFfRU5BQkxFOwogCi0JRFJNX0RFQlVHX0tNUygiTW9kZSBmb3IgcGlwZSAlYzpcbiIsIHBpcGUgPT0gMCA/ICdBJyA6ICdCJyk7CisJRFJNX0RFQlVHX0tNUygiTW9kZSBmb3IgcGlwZSAlZDpcbiIsIHBpcGUpOwogCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CiAKIAkvKiBQQ0ggZURQIG5lZWRzIEZESSwgYnV0IENQVSBlRFAgZG9lcyBub3QgKi8KLQlpZiAoIWhhc19lZHBfZW5jb2RlciB8fCBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpIHsKLQkJSTkxNV9XUklURShQQ0hfRlAwKHBpcGUpLCBmcCk7Ci0JCUk5MTVfV1JJVEUoUENIX0RQTEwocGlwZSksIGRwbGwgJiB+RFBMTF9WQ09fRU5BQkxFKTsKKwlpZiAoIWludGVsX2NydGMtPm5vX3BsbCkgeworCQlpZiAoIWhhc19lZHBfZW5jb2RlciB8fAorCQkgICAgaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7CisJCQlJOTE1X1dSSVRFKFBDSF9GUDAocGlwZSksIGZwKTsKKwkJCUk5MTVfV1JJVEUoUENIX0RQTEwocGlwZSksIGRwbGwgJiB+RFBMTF9WQ09fRU5BQkxFKTsKIAotCQlQT1NUSU5HX1JFQUQoUENIX0RQTEwocGlwZSkpOwotCQl1ZGVsYXkoMTUwKTsKLQl9Ci0KLQkvKiBlbmFibGUgdHJhbnNjb2RlciBEUExMICovCi0JaWYgKEhBU19QQ0hfQ1BUKGRldikpIHsKLQkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfRFBMTF9TRUwpOwotCQlzd2l0Y2ggKHBpcGUpIHsKLQkJY2FzZSAwOgotCQkJdGVtcCB8PSBUUkFOU0FfRFBMTF9FTkFCTEUgfCBUUkFOU0FfRFBMTEFfU0VMOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXRlbXAgfD0JVFJBTlNCX0RQTExfRU5BQkxFIHwgVFJBTlNCX0RQTExCX1NFTDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkvKiBGSVhNRTogbWFuYWdlIHRyYW5zY29kZXIgUExMcz8gKi8KLQkJCXRlbXAgfD0gVFJBTlNDX0RQTExfRU5BQkxFIHwgVFJBTlNDX0RQTExCX1NFTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7CisJCQlQT1NUSU5HX1JFQUQoUENIX0RQTEwocGlwZSkpOworCQkJdWRlbGF5KDE1MCk7CiAJCX0KLQkJSTkxNV9XUklURShQQ0hfRFBMTF9TRUwsIHRlbXApOwotCi0JCVBPU1RJTkdfUkVBRChQQ0hfRFBMTF9TRUwpOwotCQl1ZGVsYXkoMTUwKTsKKwl9IGVsc2UgeworCQlpZiAoZHBsbCA9PSAoSTkxNV9SRUFEKFBDSF9EUExMKDApKSAmIDB4N2ZmZmZmZmYpICYmCisJCSAgICBmcCA9PSBJOTE1X1JFQUQoUENIX0ZQMCgwKSkpIHsKKwkJCWludGVsX2NydGMtPnVzZV9wbGxfYSA9IHRydWU7CisJCQlEUk1fREVCVUdfS01TKCJ1c2luZyBwaXBlIGEgZHBsbFxuIik7CisJCX0gZWxzZSBpZiAoZHBsbCA9PSAoSTkxNV9SRUFEKFBDSF9EUExMKDEpKSAmIDB4N2ZmZmZmZmYpICYmCisJCQkgICBmcCA9PSBJOTE1X1JFQUQoUENIX0ZQMCgxKSkpIHsKKwkJCWludGVsX2NydGMtPnVzZV9wbGxfYSA9IGZhbHNlOworCQkJRFJNX0RFQlVHX0tNUygidXNpbmcgcGlwZSBiIGRwbGxcbiIpOworCQl9IGVsc2UgeworCQkJRFJNX0RFQlVHX0tNUygibm8gbWF0Y2hpbmcgUExMIGNvbmZpZ3VyYXRpb24gZm9yIHBpcGUgMlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAogCS8qIFRoZSBMVkRTIHBpbiBwYWlyIG5lZWRzIHRvIGJlIG9uIGJlZm9yZSB0aGUgRFBMTHMgYXJlIGVuYWJsZWQuCkBAIC01NDkyLDE3ICs1NjI3LDEzIEBACiAJaWYgKGlzX2x2ZHMpIHsKIAkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfTFZEUyk7CiAJCXRlbXAgfD0gTFZEU19QT1JUX0VOIHwgTFZEU19BMEEyX0NMS0FfUE9XRVJfVVA7Ci0JCWlmIChwaXBlID09IDEpIHsKLQkJCWlmIChIQVNfUENIX0NQVChkZXYpKQotCQkJCXRlbXAgfD0gUE9SVF9UUkFOU19CX1NFTF9DUFQ7Ci0JCQllbHNlCi0JCQkJdGVtcCB8PSBMVkRTX1BJUEVCX1NFTEVDVDsKLQkJfSBlbHNlIHsKLQkJCWlmIChIQVNfUENIX0NQVChkZXYpKQotCQkJCXRlbXAgJj0gflBPUlRfVFJBTlNfU0VMX01BU0s7Ci0JCQllbHNlCi0JCQkJdGVtcCAmPSB+TFZEU19QSVBFQl9TRUxFQ1Q7Ci0JCX0KKwkJaWYgKEhBU19QQ0hfQ1BUKGRldikpCisJCQl0ZW1wIHw9IFBPUlRfVFJBTlNfU0VMX0NQVChwaXBlKTsKKwkJZWxzZSBpZiAocGlwZSA9PSAxKQorCQkJdGVtcCB8PSBMVkRTX1BJUEVCX1NFTEVDVDsKKwkJZWxzZQorCQkJdGVtcCAmPSB+TFZEU19QSVBFQl9TRUxFQ1Q7CisKIAkJLyogc2V0IHRoZSBjb3JyZXNwb25zZGluZyBMVkRTX0JPUkRFUiBiaXQgKi8KIAkJdGVtcCB8PSBkZXZfcHJpdi0+bHZkc19ib3JkZXJfYml0czsKIAkJLyogU2V0IHRoZSBCMC1CMyBkYXRhIHBhaXJzIGNvcnJlc3BvbmRpbmcgdG8gd2hldGhlciB3ZSdyZSBnb2luZyB0bwpAQCAtNTU1Miw4ICs1NjgzLDkgQEAKIAkJSTkxNV9XUklURShUUkFOU0RQTElOS19OMShwaXBlKSwgMCk7CiAJfQogCi0JaWYgKCFoYXNfZWRwX2VuY29kZXIgfHwKLQkgICAgaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7CisJaWYgKCFpbnRlbF9jcnRjLT5ub19wbGwgJiYKKwkgICAgKCFoYXNfZWRwX2VuY29kZXIgfHwKKwkgICAgIGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkpIHsKIAkJSTkxNV9XUklURShQQ0hfRFBMTChwaXBlKSwgZHBsbCk7CiAKIAkJLyogV2FpdCBmb3IgdGhlIGNsb2NrcyB0byBzdGFiaWxpemUuICovCkBAIC01NTY5LDE4ICs1NzAxLDIwIEBACiAJfQogCiAJaW50ZWxfY3J0Yy0+bG93ZnJlcV9hdmFpbCA9IGZhbHNlOwotCWlmIChpc19sdmRzICYmIGhhc19yZWR1Y2VkX2Nsb2NrICYmIGk5MTVfcG93ZXJzYXZlKSB7Ci0JCUk5MTVfV1JJVEUoUENIX0ZQMShwaXBlKSwgZnAyKTsKLQkJaW50ZWxfY3J0Yy0+bG93ZnJlcV9hdmFpbCA9IHRydWU7Ci0JCWlmIChIQVNfUElQRV9DWFNSKGRldikpIHsKLQkJCURSTV9ERUJVR19LTVMoImVuYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKLQkJCXBpcGVjb25mIHw9IFBJUEVDT05GX0NYU1JfRE9XTkNMT0NLOwotCQl9Ci0JfSBlbHNlIHsKLQkJSTkxNV9XUklURShQQ0hfRlAxKHBpcGUpLCBmcCk7Ci0JCWlmIChIQVNfUElQRV9DWFNSKGRldikpIHsKLQkJCURSTV9ERUJVR19LTVMoImRpc2FibGluZyBDeFNSIGRvd25jbG9ja2luZ1xuIik7Ci0JCQlwaXBlY29uZiAmPSB+UElQRUNPTkZfQ1hTUl9ET1dOQ0xPQ0s7CisJaWYgKCFpbnRlbF9jcnRjLT5ub19wbGwpIHsKKwkJaWYgKGlzX2x2ZHMgJiYgaGFzX3JlZHVjZWRfY2xvY2sgJiYgaTkxNV9wb3dlcnNhdmUpIHsKKwkJCUk5MTVfV1JJVEUoUENIX0ZQMShwaXBlKSwgZnAyKTsKKwkJCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSB0cnVlOworCQkJaWYgKEhBU19QSVBFX0NYU1IoZGV2KSkgeworCQkJCURSTV9ERUJVR19LTVMoImVuYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKKwkJCQlwaXBlY29uZiB8PSBQSVBFQ09ORl9DWFNSX0RPV05DTE9DSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUk5MTVfV1JJVEUoUENIX0ZQMShwaXBlKSwgZnApOworCQkJaWYgKEhBU19QSVBFX0NYU1IoZGV2KSkgeworCQkJCURSTV9ERUJVR19LTVMoImRpc2FibGluZyBDeFNSIGRvd25jbG9ja2luZ1xuIik7CisJCQkJcGlwZWNvbmYgJj0gflBJUEVDT05GX0NYU1JfRE9XTkNMT0NLOworCQkJfQogCQl9CiAJfQogCkBAIC01Njc3LDYgKzU4MTEsMTMxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZzR4X3dyaXRlX2VsZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCXVpbnQ4X3QgKmVsZCA9IGNvbm5lY3Rvci0+ZWxkOworCXVpbnQzMl90IGVsZHY7CisJdWludDMyX3QgbGVuOworCXVpbnQzMl90IGk7CisKKwlpID0gSTkxNV9SRUFEKEc0WF9BVURfVklEX0RJRCk7CisKKwlpZiAoaSA9PSBJTlRFTF9BVURJT19ERVZCTEMgfHwgaSA9PSBJTlRFTF9BVURJT19ERVZDTCkKKwkJZWxkdiA9IEc0WF9FTERWX0RFVkNMX0RFVkJMQzsKKwllbHNlCisJCWVsZHYgPSBHNFhfRUxEVl9ERVZDVEc7CisKKwlpID0gSTkxNV9SRUFEKEc0WF9BVURfQ05UTF9TVCk7CisJaSAmPSB+KGVsZHYgfCBHNFhfRUxEX0FERFIpOworCWxlbiA9IChpID4+IDkpICYgMHgxZjsJCS8qIEVMRCBidWZmZXIgc2l6ZSAqLworCUk5MTVfV1JJVEUoRzRYX0FVRF9DTlRMX1NULCBpKTsKKworCWlmICghZWxkWzBdKQorCQlyZXR1cm47CisKKwlsZW4gPSBtaW5fdCh1aW50OF90LCBlbGRbMl0sIGxlbik7CisJRFJNX0RFQlVHX0RSSVZFUigiRUxEIHNpemUgJWRcbiIsIGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlJOTE1X1dSSVRFKEc0WF9IRE1JV19IRE1JRURJRCwgKigodWludDMyX3QgKillbGQgKyBpKSk7CisKKwlpID0gSTkxNV9SRUFEKEc0WF9BVURfQ05UTF9TVCk7CisJaSB8PSBlbGR2OworCUk5MTVfV1JJVEUoRzRYX0FVRF9DTlRMX1NULCBpKTsKK30KKworc3RhdGljIHZvaWQgaXJvbmxha2Vfd3JpdGVfZWxkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOworCXVpbnQ4X3QgKmVsZCA9IGNvbm5lY3Rvci0+ZWxkOworCXVpbnQzMl90IGVsZHY7CisJdWludDMyX3QgaTsKKwlpbnQgbGVuOworCWludCBoZG1pd19oZG1pZWRpZDsKKwlpbnQgYXVkX2NudGxfc3Q7CisJaW50IGF1ZF9jbnRybF9zdDI7CisKKwlpZiAoSVNfSVZZQlJJREdFKGNvbm5lY3Rvci0+ZGV2KSkgeworCQloZG1pd19oZG1pZWRpZCA9IEdFTjdfSERNSVdfSERNSUVESURfQTsKKwkJYXVkX2NudGxfc3QgPSBHRU43X0FVRF9DTlRSTF9TVF9BOworCQlhdWRfY250cmxfc3QyID0gR0VON19BVURfQ05UUkxfU1QyOworCX0gZWxzZSB7CisJCWhkbWl3X2hkbWllZGlkID0gR0VONV9IRE1JV19IRE1JRURJRF9BOworCQlhdWRfY250bF9zdCA9IEdFTjVfQVVEX0NOVExfU1RfQTsKKwkJYXVkX2NudHJsX3N0MiA9IEdFTjVfQVVEX0NOVExfU1QyOworCX0KKworCWkgPSB0b19pbnRlbF9jcnRjKGNydGMpLT5waXBlOworCWhkbWl3X2hkbWllZGlkICs9IGkgKiAweDEwMDsKKwlhdWRfY250bF9zdCArPSBpICogMHgxMDA7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJFTEQgb24gcGlwZSAlY1xuIiwgcGlwZV9uYW1lKGkpKTsKKworCWkgPSBJOTE1X1JFQUQoYXVkX2NudGxfc3QpOworCWkgPSAoaSA+PiAyOSkgJiAweDM7CQkvKiBESVBfUG9ydF9TZWxlY3QsIDB4MSA9IFBvcnRCICovCisJaWYgKCFpKSB7CisJCURSTV9ERUJVR19EUklWRVIoIkF1ZGlvIGRpcmVjdGVkIHRvIHVua25vd24gcG9ydFxuIik7CisJCS8qIG9wZXJhdGUgYmxpbmRseSBvbiBhbGwgcG9ydHMgKi8KKwkJZWxkdiA9IEdFTjVfRUxEX1ZBTElEQjsKKwkJZWxkdiB8PSBHRU41X0VMRF9WQUxJREIgPDwgNDsKKwkJZWxkdiB8PSBHRU41X0VMRF9WQUxJREIgPDwgODsKKwl9IGVsc2UgeworCQlEUk1fREVCVUdfRFJJVkVSKCJFTEQgb24gcG9ydCAlY1xuIiwgJ0EnICsgaSk7CisJCWVsZHYgPSBHRU41X0VMRF9WQUxJREIgPDwgKChpIC0gMSkgKiA0KTsKKwl9CisKKwlpID0gSTkxNV9SRUFEKGF1ZF9jbnRybF9zdDIpOworCWkgJj0gfmVsZHY7CisJSTkxNV9XUklURShhdWRfY250cmxfc3QyLCBpKTsKKworCWlmICghZWxkWzBdKQorCQlyZXR1cm47CisKKwlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQpKSB7CisJCURSTV9ERUJVR19EUklWRVIoIkVMRDogRGlzcGxheVBvcnQgZGV0ZWN0ZWRcbiIpOworCQllbGRbNV0gfD0gKDEgPDwgMik7CS8qIENvbm5fVHlwZSwgMHgxID0gRGlzcGxheVBvcnQgKi8KKwl9CisKKwlpID0gSTkxNV9SRUFEKGF1ZF9jbnRsX3N0KTsKKwlpICY9IH5HRU41X0VMRF9BRERSRVNTOworCUk5MTVfV1JJVEUoYXVkX2NudGxfc3QsIGkpOworCisJbGVuID0gbWluX3QodWludDhfdCwgZWxkWzJdLCAyMSk7CS8qIDg0IGJ5dGVzIG9mIGh3IEVMRCBidWZmZXIgKi8KKwlEUk1fREVCVUdfRFJJVkVSKCJFTEQgc2l6ZSAlZFxuIiwgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCUk5MTVfV1JJVEUoaGRtaXdfaGRtaWVkaWQsICooKHVpbnQzMl90ICopZWxkICsgaSkpOworCisJaSA9IEk5MTVfUkVBRChhdWRfY250cmxfc3QyKTsKKwlpIHw9IGVsZHY7CisJSTkxNV9XUklURShhdWRfY250cmxfc3QyLCBpKTsKK30KKwordm9pZCBpbnRlbF93cml0ZV9lbGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwljb25uZWN0b3IgPSBkcm1fc2VsZWN0X2VsZChlbmNvZGVyLCBtb2RlKTsKKwlpZiAoIWNvbm5lY3RvcikKKwkJcmV0dXJuOworCisJRFJNX0RFQlVHX0RSSVZFUigiRUxEIG9uIFtDT05ORUNUT1I6JWQ6JXNdLCBbRU5DT0RFUjolZDolc11cbiIsCisJCQkgY29ubmVjdG9yLT5iYXNlLmlkLAorCQkJIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSwKKwkJCSBjb25uZWN0b3ItPmVuY29kZXItPmJhc2UuaWQsCisJCQkgZHJtX2dldF9lbmNvZGVyX25hbWUoY29ubmVjdG9yLT5lbmNvZGVyKSk7CisKKwljb25uZWN0b3ItPmVsZFs2XSA9IGRybV9hdl9zeW5jX2RlbGF5KGNvbm5lY3RvciwgbW9kZSkgLyAyOworCisJaWYgKGRldl9wcml2LT5kaXNwbGF5LndyaXRlX2VsZCkKKwkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkKGNvbm5lY3RvciwgY3J0Yyk7Cit9CisKIC8qKiBMb2FkcyB0aGUgcGFsZXR0ZS9nYW1tYSB1bml0IGZvciB0aGUgQ1JUQyB3aXRoIHRoZSBwcmVwYXJlZCB2YWx1ZXMgKi8KIHZvaWQgaW50ZWxfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CkBAIC01NzU4LDYgKzYwMTcsMzEgQEAKIAlJOTE1X1dSSVRFKENVUkJBU0UocGlwZSksIGJhc2UpOwogfQogCitzdGF0aWMgdm9pZCBpdmJfdXBkYXRlX2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBiYXNlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCWJvb2wgdmlzaWJsZSA9IGJhc2UgIT0gMDsKKworCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfdmlzaWJsZSAhPSB2aXNpYmxlKSB7CisJCXVpbnQzMl90IGNudGwgPSBJOTE1X1JFQUQoQ1VSQ05UUl9JVkIocGlwZSkpOworCQlpZiAoYmFzZSkgeworCQkJY250bCAmPSB+Q1VSU09SX01PREU7CisJCQljbnRsIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVggfCBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCWNudGwgJj0gfihDVVJTT1JfTU9ERSB8IE1DVVJTT1JfR0FNTUFfRU5BQkxFKTsKKwkJCWNudGwgfD0gQ1VSU09SX01PREVfRElTQUJMRTsKKwkJfQorCQlJOTE1X1dSSVRFKENVUkNOVFJfSVZCKHBpcGUpLCBjbnRsKTsKKworCQlpbnRlbF9jcnRjLT5jdXJzb3JfdmlzaWJsZSA9IHZpc2libGU7CisJfQorCS8qIGFuZCBjb21taXQgY2hhbmdlcyBvbiBuZXh0IHZibGFuayAqLworCUk5MTVfV1JJVEUoQ1VSQkFTRV9JVkIocGlwZSksIGJhc2UpOworfQorCiAvKiBJZiBuby1wYXJ0IG9mIHRoZSBjdXJzb3IgaXMgdmlzaWJsZSBvbiB0aGUgZnJhbWVidWZmZXIsIHRoZW4gdGhlIEdQVSBtYXkgaGFuZy4uLiAqLwogc3RhdGljIHZvaWQgaW50ZWxfY3J0Y191cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgICAgIGJvb2wgb24pCkBAIC01ODA1LDExICs2MDg5LDE2IEBACiAJaWYgKCF2aXNpYmxlICYmICFpbnRlbF9jcnRjLT5jdXJzb3JfdmlzaWJsZSkKIAkJcmV0dXJuOwogCi0JSTkxNV9XUklURShDVVJQT1MocGlwZSksIHBvcyk7Ci0JaWYgKElTXzg0NUcoZGV2KSB8fCBJU19JODY1RyhkZXYpKQotCQlpODQ1X3VwZGF0ZV9jdXJzb3IoY3J0YywgYmFzZSk7Ci0JZWxzZQotCQlpOXh4X3VwZGF0ZV9jdXJzb3IoY3J0YywgYmFzZSk7CisJaWYgKElTX0lWWUJSSURHRShkZXYpKSB7CisJCUk5MTVfV1JJVEUoQ1VSUE9TX0lWQihwaXBlKSwgcG9zKTsKKwkJaXZiX3VwZGF0ZV9jdXJzb3IoY3J0YywgYmFzZSk7CisJfSBlbHNlIHsKKwkJSTkxNV9XUklURShDVVJQT1MocGlwZSksIHBvcyk7CisJCWlmIChJU184NDVHKGRldikgfHwgSVNfSTg2NUcoZGV2KSkKKwkJCWk4NDVfdXBkYXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKKwkJZWxzZQorCQkJaTl4eF91cGRhdGVfY3Vyc29yKGNydGMsIGJhc2UpOworCX0KIAogCWlmICh2aXNpYmxlKQogCQlpbnRlbF9tYXJrX2J1c3koZGV2LCB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYiktPm9iaik7CkBAIC03MDcxLDYgKzczNjAsOCBAQAogCWludGVsX2NydGMtPmJwcCA9IDI0OyAvKiBkZWZhdWx0IGZvciBwcmUtSXJvbmxha2UgKi8KIAogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJaWYgKHBpcGUgPT0gMiAmJiBJU19JVllCUklER0UoZGV2KSkKKwkJCWludGVsX2NydGMtPm5vX3BsbCA9IHRydWU7CiAJCWludGVsX2hlbHBlcl9mdW5jcy5wcmVwYXJlID0gaXJvbmxha2VfY3J0Y19wcmVwYXJlOwogCQlpbnRlbF9oZWxwZXJfZnVuY3MuY29tbWl0ID0gaXJvbmxha2VfY3J0Y19jb21taXQ7CiAJfSBlbHNlIHsKQEAgLTcyNTAsNiArNzU0MSw5IEBACiAKIAkvKiBkaXNhYmxlIGFsbCB0aGUgcG9zc2libGUgb3V0cHV0cy9jcnRjcyBiZWZvcmUgZW50ZXJpbmcgS01TIG1vZGUgKi8KIAlkcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhkZXYpOworCisJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKKwkJaXJvbmxha2VfaW5pdF9wY2hfcmVmY2xrKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYikKQEAgLTc0OTQsNiArNzc4OCwxMCBAQAogCUk5MTVfV1JJVEUoR0VONl9SUE5TV1JFUSwgMSA8PCAzMSk7CiAJSTkxNV9XUklURShHRU42X1BNSU5UUk1TSywgMHhmZmZmZmZmZik7CiAJSTkxNV9XUklURShHRU42X1BNSUVSLCAwKTsKKwkvKiBDb21wbGV0ZSBQTSBpbnRlcnJ1cHQgbWFza2luZyBoZXJlIGRvZXNuJ3QgcmFjZSB3aXRoIHRoZSBycHMgd29yaworCSAqIGl0ZW0gYWdhaW4gdW5tYXNraW5nIFBNIGludGVycnVwdHMgYmVjYXVzZSB0aGF0IGlzIHVzaW5nIGEgZGlmZmVyZW50CisJICogcmVnaXN0ZXIgKFBNSU1SKSB0byBtYXNrIFBNIGludGVycnVwdHMuIFRoZSBvbmx5IHJpc2sgaXMgaW4gbGVhdmluZworCSAqIHN0YWxlIGJpdHMgaW4gUE1JSVIgYW5kIFBNSU1SIHdoaWNoIGdlbjZfZW5hYmxlX3JwcyB3aWxsIGNsZWFuIHVwLiAqLwogCiAJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPnJwc19sb2NrKTsKIAlkZXZfcHJpdi0+cG1faWlyID0gMDsKQEAgLTgxNTQsNyArODQ1Miw3IEBACiAJfQogCiAJLyogUmV0dXJucyB0aGUgY29yZSBkaXNwbGF5IGNsb2NrIHNwZWVkICovCi0JaWYgKElTX0k5NDVHKGRldikgfHwgKElTX0czMyhkZXYpICYmICEgSVNfUElORVZJRVdfTShkZXYpKSkKKwlpZiAoSVNfSTk0NUcoZGV2KSB8fCAoSVNfRzMzKGRldikgJiYgIUlTX1BJTkVWSUVXX00oZGV2KSkpCiAJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0KIAkJCWk5NDVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CiAJZWxzZSBpZiAoSVNfSTkxNUcoZGV2KSkKQEAgLTgxOTMsNiArODQ5MSw3IEBACiAJCQl9CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5mZGlfbGlua190cmFpbiA9IGlyb25sYWtlX2ZkaV9saW5rX3RyYWluOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBpcm9ubGFrZV9pbml0X2Nsb2NrX2dhdGluZzsKKwkJCWRldl9wcml2LT5kaXNwbGF5LndyaXRlX2VsZCA9IGlyb25sYWtlX3dyaXRlX2VsZDsKIAkJfSBlbHNlIGlmIChJU19HRU42KGRldikpIHsKIAkJCWlmIChTTkJfUkVBRF9XTTBfTEFURU5DWSgpKSB7CiAJCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gc2FuZHlicmlkZ2VfdXBkYXRlX3dtOwpAQCAtODIwMyw2ICs4NTAyLDcgQEAKIAkJCX0KIAkJCWRldl9wcml2LT5kaXNwbGF5LmZkaV9saW5rX3RyYWluID0gZ2VuNl9mZGlfbGlua190cmFpbjsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmluaXRfY2xvY2tfZ2F0aW5nID0gZ2VuNl9pbml0X2Nsb2NrX2dhdGluZzsKKwkJCWRldl9wcml2LT5kaXNwbGF5LndyaXRlX2VsZCA9IGlyb25sYWtlX3dyaXRlX2VsZDsKIAkJfSBlbHNlIGlmIChJU19JVllCUklER0UoZGV2KSkgewogCQkJLyogRklYTUU6IGRldGVjdCBCMCsgc3RlcHBpbmcgYW5kIHVzZSBhdXRvIHRyYWluaW5nICovCiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5mZGlfbGlua190cmFpbiA9IGl2Yl9tYW51YWxfZmRpX2xpbmtfdHJhaW47CkBAIC04MjE0LDcgKzg1MTQsNyBAQAogCQkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJCQl9CiAJCQlkZXZfcHJpdi0+ZGlzcGxheS5pbml0X2Nsb2NrX2dhdGluZyA9IGl2eWJyaWRnZV9pbml0X2Nsb2NrX2dhdGluZzsKLQorCQkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkID0gaXJvbmxha2Vfd3JpdGVfZWxkOwogCQl9IGVsc2UKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CkBAIC04MjI1LDcgKzg1MjUsNyBAQAogCQkJRFJNX0lORk8oImZhaWxlZCB0byBmaW5kIGtub3duIEN4U1IgbGF0ZW5jeSAiCiAJCQkJICIoZm91bmQgZGRyJXMgZnNiIGZyZXEgJWQsIG1lbSBmcmVxICVkKSwgIgogCQkJCSAiZGlzYWJsaW5nIEN4U1JcbiIsCi0JCQkJIChkZXZfcHJpdi0+aXNfZGRyMyA9PSAxKSA/ICIzIjogIjIiLAorCQkJCSAoZGV2X3ByaXYtPmlzX2RkcjMgPT0gMSkgPyAiMyIgOiAiMiIsCiAJCQkJIGRldl9wcml2LT5mc2JfZnJlcSwgZGV2X3ByaXYtPm1lbV9mcmVxKTsKIAkJCS8qIERpc2FibGUgQ3hTUiBhbmQgbmV2ZXIgdXBkYXRlIGl0cyB3YXRlcm1hcmsgYWdhaW4gKi8KIAkJCXBpbmV2aWV3X2Rpc2FibGVfY3hzcihkZXYpOwpAQCAtODIzNCw2ICs4NTM0LDcgQEAKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IHBpbmV2aWV3X3VwZGF0ZV93bTsKIAkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnZW4zX2luaXRfY2xvY2tfZ2F0aW5nOwogCX0gZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkud3JpdGVfZWxkID0gZzR4X3dyaXRlX2VsZDsKIAkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gZzR4X3VwZGF0ZV93bTsKIAkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9jbG9ja19nYXRpbmcgPSBnNHhfaW5pdF9jbG9ja19nYXRpbmc7CiAJfSBlbHNlIGlmIChJU19HRU40KGRldikpIHsKQEAgLTgyOTQsNyArODU5NSw3IEBACiAgKiByZXN1bWUsIG9yIG90aGVyIHRpbWVzLiAgVGhpcyBxdWlyayBtYWtlcyBzdXJlIHRoYXQncyB0aGUgY2FzZSBmb3IKICAqIGFmZmVjdGVkIHN5c3RlbXMuCiAgKi8KLXN0YXRpYyB2b2lkIHF1aXJrX3BpcGVhX2ZvcmNlIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcXVpcmtfcGlwZWFfZm9yY2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04MzIyLDcgKzg2MjMsNyBAQAogCS8qIEhQIENvbXBhcSAyNzMwcCBuZWVkcyBwaXBlIEEgZm9yY2UgcXVpcmsgKExQOiAjMjkxNTU1KSAqLwogCXsgMHgyYTQyLCAweDEwM2MsIDB4MzBlYiwgcXVpcmtfcGlwZWFfZm9yY2UgfSwKIAkvKiBIUCBNaW5pIG5lZWRzIHBpcGUgQSBmb3JjZSBxdWlyayAoTFA6ICMzMjIxMDQpICovCi0JeyAweDI3YWUsMHgxMDNjLCAweDM2MWEsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCisJeyAweDI3YWUsIDB4MTAzYywgMHgzNjFhLCBxdWlya19waXBlYV9mb3JjZSB9LAogCiAJLyogVGhpbmtwYWQgUjMxIG5lZWRzIHBpcGUgQSBmb3JjZSBxdWlyayAqLwogCXsgMHgzNTc3LCAweDEwMTQsIDB4MDUwNSwgcXVpcmtfcGlwZWFfZm9yY2UgfSwKQEAgLTg0ODgsNiArODc4OSw3IEBACiAJICogZW5xdWV1ZSB1bnBpbi9ob3RwbHVnIHdvcmsuICovCiAJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAljYW5jZWxfd29ya19zeW5jKCZkZXZfcHJpdi0+aG90cGx1Z193b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZkZXZfcHJpdi0+cnBzX3dvcmspOwogCiAJLyogZmx1c2ggYW55IGRlbGF5ZWQgdGFza3Mgb3IgcGVuZGluZyB3b3JrICovCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKQEAgLTg1NzMsNyArODg3NSw3IEBACiBzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqCiBpbnRlbF9kaXNwbGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jfc3RhdGUgKmVycm9yOwogCWludCBpOwogCkBAIC04NTg5LDcgKzg4OTEsNyBAQAogCQllcnJvci0+cGxhbmVbaV0uY29udHJvbCA9IEk5MTVfUkVBRChEU1BDTlRSKGkpKTsKIAkJZXJyb3ItPnBsYW5lW2ldLnN0cmlkZSA9IEk5MTVfUkVBRChEU1BTVFJJREUoaSkpOwogCQllcnJvci0+cGxhbmVbaV0uc2l6ZSA9IEk5MTVfUkVBRChEU1BTSVpFKGkpKTsKLQkJZXJyb3ItPnBsYW5lW2ldLnBvcz0gSTkxNV9SRUFEKERTUFBPUyhpKSk7CisJCWVycm9yLT5wbGFuZVtpXS5wb3MgPSBJOTE1X1JFQUQoRFNQUE9TKGkpKTsKIAkJZXJyb3ItPnBsYW5lW2ldLmFkZHIgPSBJOTE1X1JFQUQoRFNQQUREUihpKSk7CiAJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CiAJCQllcnJvci0+cGxhbmVbaV0uc3VyZmFjZSA9IEk5MTVfUkVBRChEU1BTVVJGKGkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDQ0ZmVmNWUuLjA5YjMxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJkcm1fY3J0Yy5oIgpAQCAtMzYsNyArMzcsNyBAQAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgogCi0KKyNkZWZpbmUgRFBfUkVDRUlWRVJfQ0FQX1NJWkUJMHhmCiAjZGVmaW5lIERQX0xJTktfU1RBVFVTX1NJWkUJNgogI2RlZmluZSBEUF9MSU5LX0NIRUNLX1RJTUVPVVQJKDEwICogMTAwMCkKIApAQCAtNTMsMTIgKzU0LDIxIEBACiAJaW50IGRwbXNfbW9kZTsKIAl1aW50OF90IGxpbmtfYnc7CiAJdWludDhfdCBsYW5lX2NvdW50OwotCXVpbnQ4X3QgZHBjZFs4XTsKKwl1aW50OF90IGRwY2RbRFBfUkVDRUlWRVJfQ0FQX1NJWkVdOwogCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOwogCXN0cnVjdCBpMmNfYWxnb19kcF9hdXhfZGF0YSBhbGdvOwogCWJvb2wgaXNfcGNoX2VkcDsKIAl1aW50OF90CXRyYWluX3NldFs0XTsKIAl1aW50OF90IGxpbmtfc3RhdHVzW0RQX0xJTktfU1RBVFVTX1NJWkVdOworCWludCBwYW5lbF9wb3dlcl91cF9kZWxheTsKKwlpbnQgcGFuZWxfcG93ZXJfZG93bl9kZWxheTsKKwlpbnQgcGFuZWxfcG93ZXJfY3ljbGVfZGVsYXk7CisJaW50IGJhY2tsaWdodF9vbl9kZWxheTsKKwlpbnQgYmFja2xpZ2h0X29mZl9kZWxheTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsgIC8qIGZvciBlRFAgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBhbmVsX3ZkZF93b3JrOworCWJvb2wgd2FudF9wYW5lbF92ZGQ7CisJdW5zaWduZWQgbG9uZyBwYW5lbF9vZmZfamlmZmllczsKIH07CiAKIC8qKgpAQCAtODYsNiArOTYsMTcgQEAKIAlyZXR1cm4gaW50ZWxfZHAtPmlzX3BjaF9lZHA7CiB9CiAKKy8qKgorICogaXNfY3B1X2VkcCAtIGlzIHRoZSBwb3J0IG9uIHRoZSBDUFUgYW5kIGF0dGFjaGVkIHRvIGFuIGVEUCBwYW5lbD8KKyAqIEBpbnRlbF9kcDogRFAgc3RydWN0CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBEUCBzdHJ1Y3QgY29ycmVzcG9uZHMgdG8gYSBDUFUgZURQIHBvcnQuCisgKi8KK3N0YXRpYyBib29sIGlzX2NwdV9lZHAoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwlyZXR1cm4gaXNfZWRwKGludGVsX2RwKSAmJiAhaXNfcGNoX2VkcChpbnRlbF9kcCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfZHAgKmVuY190b19pbnRlbF9kcChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihlbmNvZGVyLCBzdHJ1Y3QgaW50ZWxfZHAsIGJhc2UuYmFzZSk7CkBAIC0xMjEsNyArMTQyLDcgQEAKIHN0YXRpYyB2b2lkIGludGVsX2RwX2xpbmtfZG93bihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKTsKIAogdm9pZAotaW50ZWxfZWRwX2xpbmtfY29uZmlnIChzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciwKK2ludGVsX2VkcF9saW5rX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciwKIAkJICAgICAgIGludCAqbGFuZV9udW0sIGludCAqbGlua19idykKIHsKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gY29udGFpbmVyX29mKGludGVsX2VuY29kZXIsIHN0cnVjdCBpbnRlbF9kcCwgYmFzZSk7CkBAIC0xNzUsOSArMTk2LDI1IEBACiAJCXJldHVybiAxNjIwMDA7CiB9CiAKLS8qIEkgdGhpbmsgdGhpcyBpcyBhIGZpY3Rpb24gKi8KKy8qCisgKiBUaGUgdW5pdHMgb24gdGhlIG51bWJlcnMgaW4gdGhlIG5leHQgdHdvIGFyZS4uLiBiaXphcnJlLiAgRXhhbXBsZXMgd2lsbAorICogbWFrZSBpdCBjbGVhcmVyOyB0aGlzIG9uZSBwYXJhbGxlbHMgYW4gZXhhbXBsZSBpbiB0aGUgZURQIHNwZWMuCisgKgorICogaW50ZWxfZHBfbWF4X2RhdGFfcmF0ZSBmb3Igb25lIGxhbmUgb2YgMi43R0h6IGV2YWx1YXRlcyBhczoKKyAqCisgKiAgICAgMjcwMDAwICogMSAqIDggLyAxMCA9PSAyMTYwMDAKKyAqCisgKiBUaGUgYWN0dWFsIGRhdGEgY2FwYWNpdHkgb2YgdGhhdCBjb25maWd1cmF0aW9uIGlzIDIuMTZHYml0L3MsIHNvIHRoZQorICogdW5pdHMgYXJlIGRlY2FraWxvYml0cy4gIC0+Y2xvY2sgaW4gYSBkcm1fZGlzcGxheV9tb2RlIGlzIGluIGtpbG9oZXJ0eiAtCisgKiBvciBlcXVpdmFsZW50bHksIGtpbG9waXhlbHMgcGVyIHNlY29uZCAtIHNvIGZvciAxNjgweDEwNTBSIGl0J2QgYmUKKyAqIDExOTAwMC4gIEF0IDE4YnBwIHRoYXQncyAyMTQyMDAwIGtpbG9iaXRzIHBlciBzZWNvbmQuCisgKgorICogVGh1cyB0aGUgc3RyYW5nZS1sb29raW5nIGRpdmlzaW9uIGJ5IDEwIGluIGludGVsX2RwX2xpbmtfcmVxdWlyZWQsIHRvCisgKiBnZXQgdGhlIHJlc3VsdCBpbiBkZWNha2lsb2JpdHMgaW5zdGVhZCBvZiBraWxvYml0cy4KKyAqLworCiBzdGF0aWMgaW50Ci1pbnRlbF9kcF9saW5rX3JlcXVpcmVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIGludCBwaXhlbF9jbG9jaykKK2ludGVsX2RwX2xpbmtfcmVxdWlyZWQoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgaW50IHBpeGVsX2Nsb2NrKQogewogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGludGVsX2RwLT5iYXNlLmJhc2UuY3J0YzsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CkBAIC0xODYsNyArMjIzLDcgQEAKIAlpZiAoaW50ZWxfY3J0YykKIAkJYnBwID0gaW50ZWxfY3J0Yy0+YnBwOwogCi0JcmV0dXJuIChwaXhlbF9jbG9jayAqIGJwcCArIDcpIC8gODsKKwlyZXR1cm4gKHBpeGVsX2Nsb2NrICogYnBwICsgOSkgLyAxMDsKIH0KIAogc3RhdGljIGludApAQCAtMjAwLDI0ICsyMzcsMTkgQEAKIAkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBpbnRlbF9hdHRhY2hlZF9kcChjb25uZWN0b3IpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBtYXhfbGlua19jbG9jayA9IGludGVsX2RwX2xpbmtfY2xvY2soaW50ZWxfZHBfbWF4X2xpbmtfYncoaW50ZWxfZHApKTsKIAlpbnQgbWF4X2xhbmVzID0gaW50ZWxfZHBfbWF4X2xhbmVfY291bnQoaW50ZWxfZHApOwogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKLQkJaWYgKG1vZGUtPmhkaXNwbGF5ID4gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5KQorCWlmIChpc19lZHAoaW50ZWxfZHApICYmIGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlKSB7CisJCWlmIChtb2RlLT5oZGlzcGxheSA+IGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSkKIAkJCXJldHVybiBNT0RFX1BBTkVMOwogCi0JCWlmIChtb2RlLT52ZGlzcGxheSA+IGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheSkKKwkJaWYgKG1vZGUtPnZkaXNwbGF5ID4gaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5KQogCQkJcmV0dXJuIE1PREVfUEFORUw7CiAJfQogCi0JLyogb25seSByZWZ1c2UgdGhlIG1vZGUgb24gbm9uIGVEUCBzaW5jZSB3ZSBoYXZlIHNlZW4gc29tZSB3ZWlyZCBlRFAgcGFuZWxzCi0JICAgd2hpY2ggYXJlIG91dHNpZGUgc3BlYyB0b2xlcmFuY2VzIGJ1dCBzb21laG93IHdvcmsgYnkgbWFnaWMgKi8KLQlpZiAoIWlzX2VkcChpbnRlbF9kcCkgJiYKLQkgICAgKGludGVsX2RwX2xpbmtfcmVxdWlyZWQoY29ubmVjdG9yLT5kZXYsIGludGVsX2RwLCBtb2RlLT5jbG9jaykKLQkgICAgID4gaW50ZWxfZHBfbWF4X2RhdGFfcmF0ZShtYXhfbGlua19jbG9jaywgbWF4X2xhbmVzKSkpCisJaWYgKGludGVsX2RwX2xpbmtfcmVxdWlyZWQoaW50ZWxfZHAsIG1vZGUtPmNsb2NrKQorCSAgICA+IGludGVsX2RwX21heF9kYXRhX3JhdGUobWF4X2xpbmtfY2xvY2ssIG1heF9sYW5lcykpCiAJCXJldHVybiBNT0RFX0NMT0NLX0hJR0g7CiAKIAlpZiAobW9kZS0+Y2xvY2sgPCAxMDAwMCkKQEAgLTI3OSw2ICszMTEsMzggQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIGlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3Bvd2VyKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlyZXR1cm4gKEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSAmIFBQX09OKSAhPSAwOworfQorCitzdGF0aWMgYm9vbCBpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF92ZGQoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXJldHVybiAoSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKSAmIEVEUF9GT1JDRV9WREQpICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9kcF9jaGVja19lZHAoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghaXNfZWRwKGludGVsX2RwKSkKKwkJcmV0dXJuOworCWlmICghaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfcG93ZXIoaW50ZWxfZHApICYmICFpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF92ZGQoaW50ZWxfZHApKSB7CisJCVdBUk4oMSwgImVEUCBwb3dlcmVkIG9mZiB3aGlsZSBhdHRlbXB0aW5nIGF1eCBjaGFubmVsIGNvbW11bmljYXRpb24uXG4iKTsKKwkJRFJNX0RFQlVHX0tNUygiU3RhdHVzIDB4JTA4eCBDb250cm9sIDB4JTA4eFxuIiwKKwkJCSAgICAgIEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSwKKwkJCSAgICAgIEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCkpOworCX0KK30KKwogc3RhdGljIGludAogaW50ZWxfZHBfYXV4X2NoKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCiAJCXVpbnQ4X3QgKnNlbmQsIGludCBzZW5kX2J5dGVzLApAQCAtMjk1LDYgKzM1OSw3IEBACiAJdWludDMyX3QgYXV4X2Nsb2NrX2RpdmlkZXI7CiAJaW50IHRyeSwgcHJlY2hhcmdlOwogCisJaW50ZWxfZHBfY2hlY2tfZWRwKGludGVsX2RwKTsKIAkvKiBUaGUgY2xvY2sgZGl2aWRlciBpcyBiYXNlZCBvZmYgdGhlIGhyYXdjbGssCiAJICogYW5kIHdvdWxkIGxpa2UgdG8gcnVuIGF0IDJNSHouIFNvLCB0YWtlIHRoZQogCSAqIGhyYXdjbGsgdmFsdWUgYW5kIGRpdmlkZSBieSAyIGFuZCB1c2UgdGhhdApAQCAtMzAyLDcgKzM2Nyw3IEBACiAJICogTm90ZSB0aGF0IFBDSCBhdHRhY2hlZCBlRFAgcGFuZWxzIHNob3VsZCB1c2UgYSAxMjVNSHogaW5wdXQKIAkgKiBjbG9jayBkaXZpZGVyLgogCSAqLwotCWlmIChpc19lZHAoaW50ZWxfZHApICYmICFpc19wY2hfZWRwKGludGVsX2RwKSkgeworCWlmIChpc19jcHVfZWRwKGludGVsX2RwKSkgewogCQlpZiAoSVNfR0VONihkZXYpKQogCQkJYXV4X2Nsb2NrX2RpdmlkZXIgPSAyMDA7IC8qIFNOQiBlRFAgaW5wdXQgY2xvY2sgYXQgNDAwTWh6ICovCiAJCWVsc2UKQEAgLTMzNyw3ICs0MDIsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgc2VuZF9ieXRlczsgaSArPSA0KQogCQkJSTkxNV9XUklURShjaF9kYXRhICsgaSwKIAkJCQkgICBwYWNrX2F1eChzZW5kICsgaSwgc2VuZF9ieXRlcyAtIGkpKTsKLQkKKwogCQkvKiBTZW5kIHRoZSBjb21tYW5kIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLwogCQlJOTE1X1dSSVRFKGNoX2N0bCwKIAkJCSAgIERQX0FVWF9DSF9DVExfU0VORF9CVVNZIHwKQEAgLTM1NCw3ICs0MTksNyBAQAogCQkJCWJyZWFrOwogCQkJdWRlbGF5KDEwMCk7CiAJCX0KLQkKKwogCQkvKiBDbGVhciBkb25lIHN0YXR1cyBhbmQgYW55IGVycm9ycyAqLwogCQlJOTE1X1dSSVRFKGNoX2N0bCwKIAkJCSAgIHN0YXR1cyB8CkBAIC0zOTAsNyArNDU1LDcgQEAKIAkJICAgICAgRFBfQVVYX0NIX0NUTF9NRVNTQUdFX1NJWkVfU0hJRlQpOwogCWlmIChyZWN2X2J5dGVzID4gcmVjdl9zaXplKQogCQlyZWN2X2J5dGVzID0gcmVjdl9zaXplOwotCQorCiAJZm9yIChpID0gMDsgaSA8IHJlY3ZfYnl0ZXM7IGkgKz0gNCkKIAkJdW5wYWNrX2F1eChJOTE1X1JFQUQoY2hfZGF0YSArIGkpLAogCQkJICAgcmVjdiArIGksIHJlY3ZfYnl0ZXMgLSBpKTsKQEAgLTQwOCw2ICs0NzMsNyBAQAogCWludCBtc2dfYnl0ZXM7CiAJdWludDhfdAlhY2s7CiAKKwlpbnRlbF9kcF9jaGVja19lZHAoaW50ZWxfZHApOwogCWlmIChzZW5kX2J5dGVzID4gMTYpCiAJCXJldHVybiAtMTsKIAltc2dbMF0gPSBBVVhfTkFUSVZFX1dSSVRFIDw8IDQ7CkBAIC00NTAsNiArNTE2LDcgQEAKIAl1aW50OF90IGFjazsKIAlpbnQgcmV0OwogCisJaW50ZWxfZHBfY2hlY2tfZWRwKGludGVsX2RwKTsKIAltc2dbMF0gPSBBVVhfTkFUSVZFX1JFQUQgPDwgNDsKIAltc2dbMV0gPSBhZGRyZXNzID4+IDg7CiAJbXNnWzJdID0gYWRkcmVzcyAmIDB4ZmY7CkBAIC00OTMsNiArNTYwLDcgQEAKIAlpbnQgcmVwbHlfYnl0ZXM7CiAJaW50IHJldDsKIAorCWludGVsX2RwX2NoZWNrX2VkcChpbnRlbF9kcCk7CiAJLyogU2V0IHVwIHRoZSBjb21tYW5kIGJ5dGUgKi8KIAlpZiAobW9kZSAmIE1PREVfSTJDX1JFQUQpCiAJCW1zZ1swXSA9IEFVWF9JMkNfUkVBRCA8PCA0OwpAQCAtNTczLDI0ICs2NDEsMzIgQEAKIAlyZXR1cm4gLUVSRU1PVEVJTzsKIH0KIAorc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKTsKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIGJvb2wgc3luYyk7CisKIHN0YXRpYyBpbnQKIGludGVsX2RwX2kyY19pbml0KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsCiAJCSAgc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yLCBjb25zdCBjaGFyICpuYW1lKQogeworCWludAlyZXQ7CisKIAlEUk1fREVCVUdfS01TKCJpMmNfaW5pdCAlc1xuIiwgbmFtZSk7CiAJaW50ZWxfZHAtPmFsZ28ucnVubmluZyA9IGZhbHNlOwogCWludGVsX2RwLT5hbGdvLmFkZHJlc3MgPSAwOwogCWludGVsX2RwLT5hbGdvLmF1eF9jaCA9IGludGVsX2RwX2kyY19hdXhfY2g7CiAKLQltZW1zZXQoJmludGVsX2RwLT5hZGFwdGVyLCAnXDAnLCBzaXplb2YgKGludGVsX2RwLT5hZGFwdGVyKSk7CisJbWVtc2V0KCZpbnRlbF9kcC0+YWRhcHRlciwgJ1wwJywgc2l6ZW9mKGludGVsX2RwLT5hZGFwdGVyKSk7CiAJaW50ZWxfZHAtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKIAlpbnRlbF9kcC0+YWRhcHRlci5jbGFzcyA9IEkyQ19DTEFTU19EREM7Ci0Jc3RybmNweSAoaW50ZWxfZHAtPmFkYXB0ZXIubmFtZSwgbmFtZSwgc2l6ZW9mKGludGVsX2RwLT5hZGFwdGVyLm5hbWUpIC0gMSk7CisJc3RybmNweShpbnRlbF9kcC0+YWRhcHRlci5uYW1lLCBuYW1lLCBzaXplb2YoaW50ZWxfZHAtPmFkYXB0ZXIubmFtZSkgLSAxKTsKIAlpbnRlbF9kcC0+YWRhcHRlci5uYW1lW3NpemVvZihpbnRlbF9kcC0+YWRhcHRlci5uYW1lKSAtIDFdID0gJ1wwJzsKIAlpbnRlbF9kcC0+YWRhcHRlci5hbGdvX2RhdGEgPSAmaW50ZWxfZHAtPmFsZ287CiAJaW50ZWxfZHAtPmFkYXB0ZXIuZGV2LnBhcmVudCA9ICZpbnRlbF9jb25uZWN0b3ItPmJhc2Uua2RldjsKIAotCXJldHVybiBpMmNfZHBfYXV4X2FkZF9idXMoJmludGVsX2RwLT5hZGFwdGVyKTsKKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKKwlyZXQgPSBpMmNfZHBfYXV4X2FkZF9idXMoJmludGVsX2RwLT5hZGFwdGVyKTsKKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgZmFsc2UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBib29sCkBAIC01OTgsMjkgKzY3NCwyOCBAQAogCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoZW5jb2Rlcik7CiAJaW50IGxhbmVfY291bnQsIGNsb2NrOwogCWludCBtYXhfbGFuZV9jb3VudCA9IGludGVsX2RwX21heF9sYW5lX2NvdW50KGludGVsX2RwKTsKIAlpbnQgbWF4X2Nsb2NrID0gaW50ZWxfZHBfbWF4X2xpbmtfYncoaW50ZWxfZHApID09IERQX0xJTktfQldfMl83ID8gMSA6IDA7CiAJc3RhdGljIGludCBid3NbMl0gPSB7IERQX0xJTktfQldfMV82MiwgRFBfTElOS19CV18yXzcgfTsKIAotCWlmIChpc19lZHAoaW50ZWxfZHApICYmIGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlKSB7Ci0JCWludGVsX2ZpeGVkX3BhbmVsX21vZGUoZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUsIGFkanVzdGVkX21vZGUpOworCWlmIChpc19lZHAoaW50ZWxfZHApICYmIGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlKSB7CisJCWludGVsX2ZpeGVkX3BhbmVsX21vZGUoaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUsIGFkanVzdGVkX21vZGUpOwogCQlpbnRlbF9wY2hfcGFuZWxfZml0dGluZyhkZXYsIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU4sCiAJCQkJCW1vZGUsIGFkanVzdGVkX21vZGUpOwogCQkvKgogCQkgKiB0aGUgbW9kZS0+Y2xvY2sgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIERhdGEmTGluayBNL04KIAkJICogb2YgdGhlIHBpcGUuIEZvciB0aGUgZURQIHRoZSBmaXhlZCBjbG9jayBzaG91bGQgYmUgdXNlZC4KIAkJICovCi0JCW1vZGUtPmNsb2NrID0gZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPmNsb2NrOworCQltb2RlLT5jbG9jayA9IGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlLT5jbG9jazsKIAl9CiAKIAlmb3IgKGxhbmVfY291bnQgPSAxOyBsYW5lX2NvdW50IDw9IG1heF9sYW5lX2NvdW50OyBsYW5lX2NvdW50IDw8PSAxKSB7CiAJCWZvciAoY2xvY2sgPSAwOyBjbG9jayA8PSBtYXhfY2xvY2s7IGNsb2NrKyspIHsKIAkJCWludCBsaW5rX2F2YWlsID0gaW50ZWxfZHBfbWF4X2RhdGFfcmF0ZShpbnRlbF9kcF9saW5rX2Nsb2NrKGJ3c1tjbG9ja10pLCBsYW5lX2NvdW50KTsKIAotCQkJaWYgKGludGVsX2RwX2xpbmtfcmVxdWlyZWQoZW5jb2Rlci0+ZGV2LCBpbnRlbF9kcCwgbW9kZS0+Y2xvY2spCisJCQlpZiAoaW50ZWxfZHBfbGlua19yZXF1aXJlZChpbnRlbF9kcCwgbW9kZS0+Y2xvY2spCiAJCQkJCTw9IGxpbmtfYXZhaWwpIHsKIAkJCQlpbnRlbF9kcC0+bGlua19idyA9IGJ3c1tjbG9ja107CiAJCQkJaW50ZWxfZHAtPmxhbmVfY291bnQgPSBsYW5lX2NvdW50OwpAQCAtNjM0LDE5ICs3MDksNiBAQAogCQl9CiAJfQogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJLyogb2theSB3ZSBmYWlsZWQganVzdCBwaWNrIHRoZSBoaWdoZXN0ICovCi0JCWludGVsX2RwLT5sYW5lX2NvdW50ID0gbWF4X2xhbmVfY291bnQ7Ci0JCWludGVsX2RwLT5saW5rX2J3ID0gYndzW21heF9jbG9ja107Ci0JCWFkanVzdGVkX21vZGUtPmNsb2NrID0gaW50ZWxfZHBfbGlua19jbG9jayhpbnRlbF9kcC0+bGlua19idyk7Ci0JCURSTV9ERUJVR19LTVMoIkZvcmNlIHBpY2tpbmcgZGlzcGxheSBwb3J0IGxpbmsgYncgJTAyeCBsYW5lICIKLQkJCSAgICAgICJjb3VudCAlZCBjbG9jayAlZFxuIiwKLQkJCSAgICAgIGludGVsX2RwLT5saW5rX2J3LCBpbnRlbF9kcC0+bGFuZV9jb3VudCwKLQkJCSAgICAgIGFkanVzdGVkX21vZGUtPmNsb2NrKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTc0MCw2ICs4MDIsOSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BsbF9vbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BsbF9vZmYoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKKwogc3RhdGljIHZvaWQKIGludGVsX2RwX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCkBAIC03NDksNiArODE0LDE0IEBACiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5jcnRjOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAorCS8qIFR1cm4gb24gdGhlIGVEUCBQTEwgaWYgbmVlZGVkICovCisJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKKwkJaWYgKCFpc19wY2hfZWRwKGludGVsX2RwKSkKKwkJCWlyb25sYWtlX2VkcF9wbGxfb24oZW5jb2Rlcik7CisJCWVsc2UKKwkJCWlyb25sYWtlX2VkcF9wbGxfb2ZmKGVuY29kZXIpOworCX0KKwogCWludGVsX2RwLT5EUCA9IERQX1ZPTFRBR0VfMF80IHwgRFBfUFJFX0VNUEhBU0lTXzA7CiAJaW50ZWxfZHAtPkRQIHw9IGludGVsX2RwLT5jb2xvcl9yYW5nZTsKIApAQCAtNzU3LDcgKzgzMCw3IEBACiAJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCiAJCWludGVsX2RwLT5EUCB8PSBEUF9TWU5DX1ZTX0hJR0g7CiAKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkKKwlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCiAJCWludGVsX2RwLT5EUCB8PSBEUF9MSU5LX1RSQUlOX09GRl9DUFQ7CiAJZWxzZQogCQlpbnRlbF9kcC0+RFAgfD0gRFBfTElOS19UUkFJTl9PRkY7CkBAIC03NzMsOCArODQ2LDEyIEBACiAJCWludGVsX2RwLT5EUCB8PSBEUF9QT1JUX1dJRFRIXzQ7CiAJCWJyZWFrOwogCX0KLQlpZiAoaW50ZWxfZHAtPmhhc19hdWRpbykKKwlpZiAoaW50ZWxfZHAtPmhhc19hdWRpbykgeworCQlEUk1fREVCVUdfRFJJVkVSKCJFbmFibGluZyBEUCBhdWRpbyBvbiBwaXBlICVjXG4iLAorCQkJCSBwaXBlX25hbWUoaW50ZWxfY3J0Yy0+cGlwZSkpOwogCQlpbnRlbF9kcC0+RFAgfD0gRFBfQVVESU9fT1VUUFVUX0VOQUJMRTsKKwkJaW50ZWxfd3JpdGVfZWxkKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOworCX0KIAogCW1lbXNldChpbnRlbF9kcC0+bGlua19jb25maWd1cmF0aW9uLCAwLCBEUF9MSU5LX0NPTkZJR1VSQVRJT05fU0laRSk7CiAJaW50ZWxfZHAtPmxpbmtfY29uZmlndXJhdGlvblswXSA9IGludGVsX2RwLT5saW5rX2J3OwpAQCAtNzk0LDcgKzg3MSw3IEBACiAJaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMSAmJiAhSEFTX1BDSF9DUFQoZGV2KSkKIAkJaW50ZWxfZHAtPkRQIHw9IERQX1BJUEVCX1NFTEVDVDsKIAotCWlmIChpc19lZHAoaW50ZWxfZHApICYmICFpc19wY2hfZWRwKGludGVsX2RwKSkgeworCWlmIChpc19jcHVfZWRwKGludGVsX2RwKSkgewogCQkvKiBkb24ndCBtaXNzIG91dCByZXF1aXJlZCBzZXR0aW5nIGZvciBlRFAgKi8KIAkJaW50ZWxfZHAtPkRQIHw9IERQX1BMTF9FTkFCTEU7CiAJCWlmIChhZGp1c3RlZF9tb2RlLT5jbG9jayA8IDIwMDAwMCkKQEAgLTgwNCw1OCArODgxLDE1MCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaXJvbmxha2Vfd2FpdF9wYW5lbF9vZmYoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKK3sKKwl1bnNpZ25lZCBsb25nCW9mZl90aW1lOworCXVuc2lnbmVkIGxvbmcJZGVsYXk7CisKKwlEUk1fREVCVUdfS01TKCJXYWl0IGZvciBwYW5lbCBwb3dlciBvZmYgdGltZVxuIik7CisKKwlpZiAoaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfcG93ZXIoaW50ZWxfZHApIHx8CisJICAgIGlyb25sYWtlX2VkcF9oYXZlX3BhbmVsX3ZkZChpbnRlbF9kcCkpCisJeworCQlEUk1fREVCVUdfS01TKCJQYW5lbCBzdGlsbCBvbiwgbm8gZGVsYXkgbmVlZGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW9mZl90aW1lID0gaW50ZWxfZHAtPnBhbmVsX29mZl9qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpbnRlbF9kcC0+cGFuZWxfcG93ZXJfZG93bl9kZWxheSk7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgb2ZmX3RpbWUpKSB7CisJCURSTV9ERUJVR19LTVMoIlRpbWUgYWxyZWFkeSBwYXNzZWQiKTsKKwkJcmV0dXJuOworCX0KKwlkZWxheSA9IGppZmZpZXNfdG9fbXNlY3Mob2ZmX3RpbWUgLSBqaWZmaWVzKTsKKwlpZiAoZGVsYXkgPiBpbnRlbF9kcC0+cGFuZWxfcG93ZXJfZG93bl9kZWxheSkKKwkJZGVsYXkgPSBpbnRlbF9kcC0+cGFuZWxfcG93ZXJfZG93bl9kZWxheTsKKwlEUk1fREVCVUdfS01TKCJXYWl0aW5nIGFuIGFkZGl0aW9uYWwgJWxkIG1zXG4iLCBkZWxheSk7CisJbXNsZWVwKGRlbGF5KTsKK30KKwogc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwcDsKIAotCS8qCi0JICogSWYgdGhlIHBhbmVsIHdhc24ndCBvbiwgbWFrZSBzdXJlIHRoZXJlJ3Mgbm90IGEgY3VycmVudGx5Ci0JICogYWN0aXZlIFBQIHNlcXVlbmNlIGJlZm9yZSBlbmFibGluZyBBVVggVkRELgotCSAqLwotCWlmICghKEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSAmIFBQX09OKSkKLQkJbXNsZWVwKGRldl9wcml2LT5wYW5lbF90Myk7CisJaWYgKCFpc19lZHAoaW50ZWxfZHApKQorCQlyZXR1cm47CisJRFJNX0RFQlVHX0tNUygiVHVybiBlRFAgVkREIG9uXG4iKTsKIAorCVdBUk4oaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkLAorCSAgICAgImVEUCBWREQgYWxyZWFkeSByZXF1ZXN0ZWQgb25cbiIpOworCisJaW50ZWxfZHAtPndhbnRfcGFuZWxfdmRkID0gdHJ1ZTsKKwlpZiAoaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfdmRkKGludGVsX2RwKSkgeworCQlEUk1fREVCVUdfS01TKCJlRFAgVkREIGFscmVhZHkgb25cbiIpOworCQlyZXR1cm47CisJfQorCisJaXJvbmxha2Vfd2FpdF9wYW5lbF9vZmYoaW50ZWxfZHApOwogCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlwcCAmPSB+UEFORUxfVU5MT0NLX01BU0s7CisJcHAgfD0gUEFORUxfVU5MT0NLX1JFR1M7CiAJcHAgfD0gRURQX0ZPUkNFX1ZERDsKIAlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CiAJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlEUk1fREVCVUdfS01TKCJQQ0hfUFBfU1RBVFVTOiAweCUwOHggUENIX1BQX0NPTlRST0w6IDB4JTA4eFxuIiwKKwkJICAgICAgSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpLCBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpKTsKKworCS8qCisJICogSWYgdGhlIHBhbmVsIHdhc24ndCBvbiwgZGVsYXkgYmVmb3JlIGFjY2Vzc2luZyBhdXggY2hhbm5lbAorCSAqLworCWlmICghaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfcG93ZXIoaW50ZWxfZHApKSB7CisJCURSTV9ERUJVR19LTVMoImVEUCB3YXMgbm90IHJ1bm5pbmdcbiIpOworCQltc2xlZXAoaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX3VwX2RlbGF5KTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9wYW5lbF92ZGRfb2ZmX3N5bmMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcHA7CiAKLQlwcCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7Ci0JcHAgJj0gfkVEUF9GT1JDRV9WREQ7Ci0JSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwotCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJaWYgKCFpbnRlbF9kcC0+d2FudF9wYW5lbF92ZGQgJiYgaXJvbmxha2VfZWRwX2hhdmVfcGFuZWxfdmRkKGludGVsX2RwKSkgeworCQlwcCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJCXBwICY9IH5QQU5FTF9VTkxPQ0tfTUFTSzsKKwkJcHAgfD0gUEFORUxfVU5MT0NLX1JFR1M7CisJCXBwICY9IH5FRFBfRk9SQ0VfVkREOworCQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CiAKLQkvKiBNYWtlIHN1cmUgc2VxdWVuY2VyIGlzIGlkbGUgYmVmb3JlIGFsbG93aW5nIHN1YnNlcXVlbnQgYWN0aXZpdHkgKi8KLQltc2xlZXAoZGV2X3ByaXYtPnBhbmVsX3QxMik7CisJCS8qIE1ha2Ugc3VyZSBzZXF1ZW5jZXIgaXMgaWRsZSBiZWZvcmUgYWxsb3dpbmcgc3Vic2VxdWVudCBhY3Rpdml0eSAqLworCQlEUk1fREVCVUdfS01TKCJQQ0hfUFBfU1RBVFVTOiAweCUwOHggUENIX1BQX0NPTlRST0w6IDB4JTA4eFxuIiwKKwkJCSAgICAgIEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSwgSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKSk7CisJCWludGVsX2RwLT5wYW5lbF9vZmZfamlmZmllcyA9IGppZmZpZXM7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9wYW5lbF92ZGRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9fd29yaykKK3sKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayhfX3dvcmspLAorCQkJCQkJIHN0cnVjdCBpbnRlbF9kcCwgcGFuZWxfdmRkX3dvcmspOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRlbF9kcC0+YmFzZS5iYXNlLmRldjsKKworCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpcm9ubGFrZV9wYW5lbF92ZGRfb2ZmX3N5bmMoaW50ZWxfZHApOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBib29sIHN5bmMpCit7CisJaWYgKCFpc19lZHAoaW50ZWxfZHApKQorCQlyZXR1cm47CisKKwlEUk1fREVCVUdfS01TKCJUdXJuIGVEUCBWREQgb2ZmICVkXG4iLCBpbnRlbF9kcC0+d2FudF9wYW5lbF92ZGQpOworCVdBUk4oIWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCwgImVEUCBWREQgbm90IGZvcmNlZCBvbiIpOworCQorCWludGVsX2RwLT53YW50X3BhbmVsX3ZkZCA9IGZhbHNlOworCisJaWYgKHN5bmMpIHsKKwkJaXJvbmxha2VfcGFuZWxfdmRkX29mZl9zeW5jKGludGVsX2RwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBRdWV1ZSB0aGUgdGltZXIgdG8gZmlyZSBhIGxvbmcKKwkJICogdGltZSBmcm9tIG5vdyAocmVsYXRpdmUgdG8gdGhlIHBvd2VyIGRvd24gZGVsYXkpCisJCSAqIHRvIGtlZXAgdGhlIHBhbmVsIHBvd2VyIHVwIGFjcm9zcyBhIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMKKwkJICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW50ZWxfZHAtPnBhbmVsX3ZkZF93b3JrLAorCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2N5Y2xlX2RlbGF5ICogNSkpOworCX0KIH0KIAogLyogUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCB3YXMgYWxyZWFkeSBvbiB3aGVuIGNhbGxlZCAqLwotc3RhdGljIGJvb2wgaXJvbmxha2VfZWRwX3BhbmVsX29uIChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKQorc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BhbmVsX29uKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHBwLCBpZGxlX29uX21hc2sgPSBQUF9PTiB8IFBQX1NFUVVFTkNFX1NUQVRFX09OX0lETEU7CiAKLQlpZiAoSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpICYgUFBfT04pCi0JCXJldHVybiB0cnVlOworCWlmICghaXNfZWRwKGludGVsX2RwKSkKKwkJcmV0dXJuOworCWlmIChpcm9ubGFrZV9lZHBfaGF2ZV9wYW5lbF9wb3dlcihpbnRlbF9kcCkpCisJCXJldHVybjsKIAorCWlyb25sYWtlX3dhaXRfcGFuZWxfb2ZmKGludGVsX2RwKTsKIAlwcCA9IEk5MTVfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJcHAgJj0gflBBTkVMX1VOTE9DS19NQVNLOworCXBwIHw9IFBBTkVMX1VOTE9DS19SRUdTOwogCi0JLyogSUxLIHdvcmthcm91bmQ6IGRpc2FibGUgcmVzZXQgYXJvdW5kIHBvd2VyIHNlcXVlbmNlICovCi0JcHAgJj0gflBBTkVMX1BPV0VSX1JFU0VUOwotCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKLQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCWlmIChJU19HRU41KGRldikpIHsKKwkJLyogSUxLIHdvcmthcm91bmQ6IGRpc2FibGUgcmVzZXQgYXJvdW5kIHBvd2VyIHNlcXVlbmNlICovCisJCXBwICY9IH5QQU5FTF9QT1dFUl9SRVNFVDsKKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCX0KIAotCXBwIHw9IFBBTkVMX1VOTE9DS19SRUdTIHwgUE9XRVJfVEFSR0VUX09OOworCXBwIHw9IFBPV0VSX1RBUkdFVF9PTjsKIAlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CiAJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKIApAQCAtODY0LDQ0ICsxMDMzLDY0IEBACiAJCURSTV9FUlJPUigicGFuZWwgb24gd2FpdCB0aW1lZCBvdXQ6IDB4JTA4eFxuIiwKIAkJCSAgSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpKTsKIAotCXBwIHw9IFBBTkVMX1BPV0VSX1JFU0VUOyAvKiByZXN0b3JlIHBhbmVsIHJlc2V0IGJpdCAqLwotCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKLQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOwotCi0JcmV0dXJuIGZhbHNlOworCWlmIChJU19HRU41KGRldikpIHsKKwkJcHAgfD0gUEFORUxfUE9XRVJfUkVTRVQ7IC8qIHJlc3RvcmUgcGFuZWwgcmVzZXQgYml0ICovCisJCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKKwkJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9wYW5lbF9vZmYgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKIHsKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gZW5jX3RvX2ludGVsX2RwKGVuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcHAsIGlkbGVfb2ZmX21hc2sgPSBQUF9PTiB8IFBQX1NFUVVFTkNFX01BU0sgfAogCQlQUF9DWUNMRV9ERUxBWV9BQ1RJVkUgfCBQUF9TRVFVRU5DRV9TVEFURV9NQVNLOwogCisJaWYgKCFpc19lZHAoaW50ZWxfZHApKQorCQlyZXR1cm47CiAJcHAgPSBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpOworCXBwICY9IH5QQU5FTF9VTkxPQ0tfTUFTSzsKKwlwcCB8PSBQQU5FTF9VTkxPQ0tfUkVHUzsKIAotCS8qIElMSyB3b3JrYXJvdW5kOiBkaXNhYmxlIHJlc2V0IGFyb3VuZCBwb3dlciBzZXF1ZW5jZSAqLwotCXBwICY9IH5QQU5FTF9QT1dFUl9SRVNFVDsKLQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7Ci0JUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlpZiAoSVNfR0VONShkZXYpKSB7CisJCS8qIElMSyB3b3JrYXJvdW5kOiBkaXNhYmxlIHJlc2V0IGFyb3VuZCBwb3dlciBzZXF1ZW5jZSAqLworCQlwcCAmPSB+UEFORUxfUE9XRVJfUkVTRVQ7CisJCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKKwkJUE9TVElOR19SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwl9CiAKLQlwcCAmPSB+UE9XRVJfVEFSR0VUX09OOwotCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIHBwKTsKLQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCWludGVsX2RwLT5wYW5lbF9vZmZfamlmZmllcyA9IGppZmZpZXM7CiAKLQlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChQQ0hfUFBfU1RBVFVTKSAmIGlkbGVfb2ZmX21hc2spID09IDAsIDUwMDApKQotCQlEUk1fRVJST1IoInBhbmVsIG9mZiB3YWl0IHRpbWVkIG91dDogMHglMDh4XG4iLAotCQkJICBJOTE1X1JFQUQoUENIX1BQX1NUQVRVUykpOworCWlmIChJU19HRU41KGRldikpIHsKKwkJcHAgJj0gflBPV0VSX1RBUkdFVF9PTjsKKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCQlwcCAmPSB+UE9XRVJfVEFSR0VUX09OOworCQlJOTE1X1dSSVRFKFBDSF9QUF9DT05UUk9MLCBwcCk7CisJCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJCW1zbGVlcChpbnRlbF9kcC0+cGFuZWxfcG93ZXJfY3ljbGVfZGVsYXkpOwogCi0JcHAgfD0gUEFORUxfUE9XRVJfUkVTRVQ7IC8qIHJlc3RvcmUgcGFuZWwgcmVzZXQgYml0ICovCi0JSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOwotCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpICYgaWRsZV9vZmZfbWFzaykgPT0gMCwgNTAwMCkpCisJCQlEUk1fRVJST1IoInBhbmVsIG9mZiB3YWl0IHRpbWVkIG91dDogMHglMDh4XG4iLAorCQkJCSAgSTkxNV9SRUFEKFBDSF9QUF9TVEFUVVMpKTsKKworCQlwcCB8PSBQQU5FTF9QT1dFUl9SRVNFVDsgLyogcmVzdG9yZSBwYW5lbCByZXNldCBiaXQgKi8KKwkJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCQlQT1NUSU5HX1JFQUQoUENIX1BQX0NPTlRST0wpOworCX0KIH0KIAotc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vbiAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb24oc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcHA7CiAKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCXJldHVybjsKKwogCURSTV9ERUJVR19LTVMoIlxuIik7CiAJLyoKIAkgKiBJZiB3ZSBlbmFibGUgdGhlIGJhY2tsaWdodCByaWdodCBhd2F5IGZvbGxvd2luZyBhIHBhbmVsIHBvd2VyCkBAIC05MDksMjEgKzEwOTgsMzIgQEAKIAkgKiBsaW5rLiAgU28gZGVsYXkgYSBiaXQgdG8gbWFrZSBzdXJlIHRoZSBpbWFnZSBpcyBzb2xpZCBiZWZvcmUKIAkgKiBhbGxvd2luZyBpdCB0byBhcHBlYXIuCiAJICovCi0JbXNsZWVwKDMwMCk7CisJbXNsZWVwKGludGVsX2RwLT5iYWNrbGlnaHRfb25fZGVsYXkpOwogCXBwID0gSTkxNV9SRUFEKFBDSF9QUF9DT05UUk9MKTsKKwlwcCAmPSB+UEFORUxfVU5MT0NLX01BU0s7CisJcHAgfD0gUEFORUxfVU5MT0NLX1JFR1M7CiAJcHAgfD0gRURQX0JMQ19FTkFCTEU7CiAJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcHA7CiAKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCXJldHVybjsKKwogCURSTV9ERUJVR19LTVMoIlxuIik7CiAJcHAgPSBJOTE1X1JFQUQoUENIX1BQX0NPTlRST0wpOworCXBwICY9IH5QQU5FTF9VTkxPQ0tfTUFTSzsKKwlwcCB8PSBQQU5FTF9VTkxPQ0tfUkVHUzsKIAlwcCAmPSB+RURQX0JMQ19FTkFCTEU7CiAJSTkxNV9XUklURShQQ0hfUFBfQ09OVFJPTCwgcHApOworCVBPU1RJTkdfUkVBRChQQ0hfUFBfQ09OVFJPTCk7CisJbXNsZWVwKGludGVsX2RwLT5iYWNrbGlnaHRfb2ZmX2RlbGF5KTsKIH0KIAogc3RhdGljIHZvaWQgaXJvbmxha2VfZWRwX3BsbF9vbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC05ODYsNDMgKzExODYsMzkgQEAKIHN0YXRpYyB2b2lkIGludGVsX2RwX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAgPSBlbmNfdG9faW50ZWxfZHAoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAogCS8qIFdha2UgdXAgdGhlIHNpbmsgZmlyc3QgKi8KKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKIAlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIERSTV9NT0RFX0RQTVNfT04pOworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CiAKLQlpZiAoaXNfZWRwKGludGVsX2RwKSkgewotCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihkZXYpOwotCQlpcm9ubGFrZV9lZHBfcGFuZWxfb2ZmKGRldik7Ci0JCWlmICghaXNfcGNoX2VkcChpbnRlbF9kcCkpCi0JCQlpcm9ubGFrZV9lZHBfcGxsX29uKGVuY29kZXIpOwotCQllbHNlCi0JCQlpcm9ubGFrZV9lZHBfcGxsX29mZihlbmNvZGVyKTsKLQl9CisJLyogTWFrZSBzdXJlIHRoZSBwYW5lbCBpcyBvZmYgYmVmb3JlIHRyeWluZyB0bworCSAqIGNoYW5nZSB0aGUgbW9kZQorCSAqLworCWlyb25sYWtlX2VkcF9iYWNrbGlnaHRfb2ZmKGludGVsX2RwKTsKIAlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOworCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoZW5jb2Rlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX2RwX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGVuY190b19pbnRlbF9kcChlbmNvZGVyKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhpbnRlbF9kcC0+YmFzZS5iYXNlLmNydGMpOwogCi0JaWYgKGlzX2VkcChpbnRlbF9kcCkpCi0JCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOwotCisJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CisJaW50ZWxfZHBfc2lua19kcG1zKGludGVsX2RwLCBEUk1fTU9ERV9EUE1TX09OKTsKIAlpbnRlbF9kcF9zdGFydF9saW5rX3RyYWluKGludGVsX2RwKTsKLQotCWlmIChpc19lZHAoaW50ZWxfZHApKSB7Ci0JCWlyb25sYWtlX2VkcF9wYW5lbF9vbihpbnRlbF9kcCk7Ci0JCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwKTsKLQl9CisJaXJvbmxha2VfZWRwX3BhbmVsX29uKGludGVsX2RwKTsKKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgdHJ1ZSk7CiAKIAlpbnRlbF9kcF9jb21wbGV0ZV9saW5rX3RyYWluKGludGVsX2RwKTsKLQotCWlmIChpc19lZHAoaW50ZWxfZHApKQotCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGRldik7CisJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vbihpbnRlbF9kcCk7CiAKIAlpbnRlbF9kcC0+ZHBtc19tb2RlID0gRFJNX01PREVfRFBNU19PTjsKKworCWlmIChIQVNfUENIX0NQVChkZXYpKQorCQlpbnRlbF9jcHRfdmVyaWZ5X21vZGVzZXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwMzQsMjggKzEyMzAsMjcgQEAKIAl1aW50MzJfdCBkcF9yZWcgPSBJOTE1X1JFQUQoaW50ZWxfZHAtPm91dHB1dF9yZWcpOwogCiAJaWYgKG1vZGUgIT0gRFJNX01PREVfRFBNU19PTikgeworCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKIAkJaWYgKGlzX2VkcChpbnRlbF9kcCkpCi0JCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29mZihkZXYpOworCQkJaXJvbmxha2VfZWRwX2JhY2tsaWdodF9vZmYoaW50ZWxfZHApOwogCQlpbnRlbF9kcF9zaW5rX2RwbXMoaW50ZWxfZHAsIG1vZGUpOwogCQlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOwotCQlpZiAoaXNfZWRwKGludGVsX2RwKSkKLQkJCWlyb25sYWtlX2VkcF9wYW5lbF9vZmYoZGV2KTsKKwkJaXJvbmxha2VfZWRwX3BhbmVsX29mZihlbmNvZGVyKTsKIAkJaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgIWlzX3BjaF9lZHAoaW50ZWxfZHApKQogCQkJaXJvbmxha2VfZWRwX3BsbF9vZmYoZW5jb2Rlcik7CisJCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb2ZmKGludGVsX2RwLCBmYWxzZSk7CiAJfSBlbHNlIHsKLQkJaWYgKGlzX2VkcChpbnRlbF9kcCkpCi0JCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29uKGludGVsX2RwKTsKKwkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CiAJCWludGVsX2RwX3NpbmtfZHBtcyhpbnRlbF9kcCwgbW9kZSk7CiAJCWlmICghKGRwX3JlZyAmIERQX1BPUlRfRU4pKSB7CiAJCQlpbnRlbF9kcF9zdGFydF9saW5rX3RyYWluKGludGVsX2RwKTsKLQkJCWlmIChpc19lZHAoaW50ZWxfZHApKSB7Ci0JCQkJaXJvbmxha2VfZWRwX3BhbmVsX29uKGludGVsX2RwKTsKLQkJCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCk7Ci0JCQl9CisJCQlpcm9ubGFrZV9lZHBfcGFuZWxfb24oaW50ZWxfZHApOworCQkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHAsIHRydWUpOwogCQkJaW50ZWxfZHBfY29tcGxldGVfbGlua190cmFpbihpbnRlbF9kcCk7Ci0JCX0KLQkJaWYgKGlzX2VkcChpbnRlbF9kcCkpCi0JCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGRldik7CisJCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGludGVsX2RwKTsKKwkJfSBlbHNlCisJCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgZmFsc2UpOworCQlpcm9ubGFrZV9lZHBfYmFja2xpZ2h0X29uKGludGVsX2RwKTsKIAl9CiAJaW50ZWxfZHAtPmRwbXNfbW9kZSA9IG1vZGU7CiB9CkBAIC0xMzY0LDcgKzE1NTksNyBAQAogCQkJCSAgRFBfTElOS19DT05GSUdVUkFUSU9OX1NJWkUpOwogCiAJRFAgfD0gRFBfUE9SVF9FTjsKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkKKwlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCiAJCURQICY9IH5EUF9MSU5LX1RSQUlOX01BU0tfQ1BUOwogCWVsc2UKIAkJRFAgJj0gfkRQX0xJTktfVFJBSU5fTUFTSzsKQEAgLTEzODMsNyArMTU3OCw3IEBACiAJCQlEUCA9IChEUCAmIH4oRFBfVk9MVEFHRV9NQVNLfERQX1BSRV9FTVBIQVNJU19NQVNLKSkgfCBzaWduYWxfbGV2ZWxzOwogCQl9CiAKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2VkcChpbnRlbF9kcCkpCisJCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19jcHVfZWRwKGludGVsX2RwKSkKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMV9DUFQ7CiAJCWVsc2UKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMTsKQEAgLTE0NTgsNyArMTY1Myw3IEBACiAJCQlEUCA9IChEUCAmIH4oRFBfVk9MVEFHRV9NQVNLfERQX1BSRV9FTVBIQVNJU19NQVNLKSkgfCBzaWduYWxfbGV2ZWxzOwogCQl9CiAKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2VkcChpbnRlbF9kcCkpCisJCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19jcHVfZWRwKGludGVsX2RwKSkKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMl9DUFQ7CiAJCWVsc2UKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMjsKQEAgLTE0OTksNyArMTY5NCw3IEBACiAJCSsrdHJpZXM7CiAJfQogCi0JaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2VkcChpbnRlbF9kcCkpCisJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQogCQlyZWcgPSBEUCB8IERQX0xJTktfVFJBSU5fT0ZGX0NQVDsKIAllbHNlCiAJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9PRkY7CkBAIC0xNTI5LDcgKzE3MjQsNyBAQAogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfZWRwKGludGVsX2RwKSkgeworCWlmIChIQVNfUENIX0NQVChkZXYpICYmICFpc19jcHVfZWRwKGludGVsX2RwKSkgewogCQlEUCAmPSB+RFBfTElOS19UUkFJTl9NQVNLX0NQVDsKIAkJSTkxNV9XUklURShpbnRlbF9kcC0+b3V0cHV0X3JlZywgRFAgfCBEUF9MSU5LX1RSQUlOX1BBVF9JRExFX0NQVCk7CiAJfSBlbHNlIHsKQEAgLTE1NzgsMTMgKzE3NzMsMTQgQEAKIAogCUk5MTVfV1JJVEUoaW50ZWxfZHAtPm91dHB1dF9yZWcsIERQICYgfkRQX1BPUlRfRU4pOwogCVBPU1RJTkdfUkVBRChpbnRlbF9kcC0+b3V0cHV0X3JlZyk7CisJbXNsZWVwKGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5KTsKIH0KIAogc3RhdGljIGJvb2wKIGludGVsX2RwX2dldF9kcGNkKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7CiAJaWYgKGludGVsX2RwX2F1eF9uYXRpdmVfcmVhZF9yZXRyeShpbnRlbF9kcCwgMHgwMDAsIGludGVsX2RwLT5kcGNkLAotCQkJCQkgICBzaXplb2YgKGludGVsX2RwLT5kcGNkKSkgJiYKKwkJCQkJICAgc2l6ZW9mKGludGVsX2RwLT5kcGNkKSkgJiYKIAkgICAgKGludGVsX2RwLT5kcGNkW0RQX0RQQ0RfUkVWXSAhPSAwKSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0xNTkyLDYgKzE3ODgsMjcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sCitpbnRlbF9kcF9nZXRfc2lua19pcnEoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgdTggKnNpbmtfaXJxX3ZlY3RvcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfZHBfYXV4X25hdGl2ZV9yZWFkX3JldHJ5KGludGVsX2RwLAorCQkJCQkgICAgIERQX0RFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1IsCisJCQkJCSAgICAgc2lua19pcnFfdmVjdG9yLCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9kcF9oYW5kbGVfdGVzdF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCit7CisJLyogTkFLIGJ5IGRlZmF1bHQgKi8KKwlpbnRlbF9kcF9hdXhfbmF0aXZlX3dyaXRlXzEoaW50ZWxfZHAsIERQX1RFU1RfUkVTUE9OU0UsIERQX1RFU1RfQUNLKTsKK30KKwogLyoKICAqIEFjY29yZGluZyB0byBEUCBzcGVjCiAgKiA1LjEuMjoKQEAgLTE2MDQsNiArMTgyMSw4IEBACiBzdGF0aWMgdm9pZAogaW50ZWxfZHBfY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCkKIHsKKwl1OCBzaW5rX2lycV92ZWN0b3I7CisKIAlpZiAoaW50ZWxfZHAtPmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKQogCQlyZXR1cm47CiAKQEAgLTE2MjIsNiArMTg0MSwyMCBAQAogCQlyZXR1cm47CiAJfQogCisJLyogVHJ5IHRvIHJlYWQgdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0ICovCisJaWYgKGludGVsX2RwLT5kcGNkW0RQX0RQQ0RfUkVWXSA+PSAweDExICYmCisJICAgIGludGVsX2RwX2dldF9zaW5rX2lycShpbnRlbF9kcCwgJnNpbmtfaXJxX3ZlY3RvcikpIHsKKwkJLyogQ2xlYXIgaW50ZXJydXB0IHNvdXJjZSAqLworCQlpbnRlbF9kcF9hdXhfbmF0aXZlX3dyaXRlXzEoaW50ZWxfZHAsCisJCQkJCSAgICBEUF9ERVZJQ0VfU0VSVklDRV9JUlFfVkVDVE9SLAorCQkJCQkgICAgc2lua19pcnFfdmVjdG9yKTsKKworCQlpZiAoc2lua19pcnFfdmVjdG9yICYgRFBfQVVUT01BVEVEX1RFU1RfUkVRVUVTVCkKKwkJCWludGVsX2RwX2hhbmRsZV90ZXN0X3JlcXVlc3QoaW50ZWxfZHApOworCQlpZiAoc2lua19pcnFfdmVjdG9yICYgKERQX0NQX0lSUSB8IERQX1NJTktfU1BFQ0lGSUNfSVJRKSkKKwkJCURSTV9ERUJVR19EUklWRVIoIkNQIG9yIHNpbmsgc3BlY2lmaWMgaXJxIHVuaGFuZGxlZFxuIik7CisJfQorCiAJaWYgKCFpbnRlbF9jaGFubmVsX2VxX29rKGludGVsX2RwKSkgewogCQlEUk1fREVCVUdfS01TKCIlczogY2hhbm5lbCBFUSBub3Qgb2ssIHJldHJhaW5pbmdcbiIsCiAJCQkgICAgICBkcm1fZ2V0X2VuY29kZXJfbmFtZSgmaW50ZWxfZHAtPmJhc2UuYmFzZSkpOwpAQCAtMTY4Myw2ICsxOTE2LDMxIEBACiAJcmV0dXJuIGludGVsX2RwX2RldGVjdF9kcGNkKGludGVsX2RwKTsKIH0KIAorc3RhdGljIHN0cnVjdCBlZGlkICoKK2ludGVsX2RwX2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZWRpZAkqZWRpZDsKKworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOworCWVkaWQgPSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCBhZGFwdGVyKTsKKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgZmFsc2UpOworCXJldHVybiBlZGlkOworfQorCitzdGF0aWMgaW50CitpbnRlbF9kcF9nZXRfZWRpZF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGludGVsX2RwICppbnRlbF9kcCA9IGludGVsX2F0dGFjaGVkX2RwKGNvbm5lY3Rvcik7CisJaW50CXJldDsKKworCWlyb25sYWtlX2VkcF9wYW5lbF92ZGRfb24oaW50ZWxfZHApOworCXJldCA9IGludGVsX2RkY19nZXRfbW9kZXMoY29ubmVjdG9yLCBhZGFwdGVyKTsKKwlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgZmFsc2UpOworCXJldHVybiByZXQ7Cit9CisKKwogLyoqCiAgKiBVc2VzIENSVF9IT1RQTFVHX0VOIGFuZCBDUlRfSE9UUExVR19TVEFUIHRvIGRldGVjdCBEUCBjb25uZWN0aW9uLgogICoKQEAgLTE3MTUsNyArMTk3Myw3IEBACiAJaWYgKGludGVsX2RwLT5mb3JjZV9hdWRpbykgewogCQlpbnRlbF9kcC0+aGFzX2F1ZGlvID0gaW50ZWxfZHAtPmZvcmNlX2F1ZGlvID4gMDsKIAl9IGVsc2UgewotCQllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKKwkJZWRpZCA9IGludGVsX2RwX2dldF9lZGlkKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKIAkJaWYgKGVkaWQpIHsKIAkJCWludGVsX2RwLT5oYXNfYXVkaW8gPSBkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8oZWRpZCk7CiAJCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5yYXdfZWRpZCA9IE5VTEw7CkBAIC0xNzM2LDI4ICsxOTk0LDM2IEBACiAJLyogV2Ugc2hvdWxkIHBhcnNlIHRoZSBFRElEIGRhdGEgYW5kIGZpbmQgb3V0IGlmIGl0IGhhcyBhbiBhdWRpbyBzaW5rCiAJICovCiAKLQlyZXQgPSBpbnRlbF9kZGNfZ2V0X21vZGVzKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKKwlyZXQgPSBpbnRlbF9kcF9nZXRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsICZpbnRlbF9kcC0+YWRhcHRlcik7CiAJaWYgKHJldCkgewotCQlpZiAoaXNfZWRwKGludGVsX2RwKSAmJiAhZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgIWludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlKSB7CiAJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbmV3bW9kZTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV3bW9kZSwgJmNvbm5lY3Rvci0+cHJvYmVkX21vZGVzLAogCQkJCQkgICAgaGVhZCkgewotCQkJCWlmIChuZXdtb2RlLT50eXBlICYgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQpIHsKLQkJCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUgPQorCQkJCWlmICgobmV3bW9kZS0+dHlwZSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEKSkgeworCQkJCQlpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSA9CiAJCQkJCQlkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBuZXdtb2RlKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQl9Ci0KIAkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBpZiBlRFAgaGFzIG5vIEVESUQsIHRyeSB0byB1c2UgZml4ZWQgcGFuZWwgbW9kZSBmcm9tIFZCVCAqLwogCWlmIChpc19lZHAoaW50ZWxfZHApKSB7Ci0JCWlmIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSAhPSBOVUxMKSB7CisJCS8qIGluaXRpYWxpemUgcGFuZWwgbW9kZSBmcm9tIFZCVCBpZiBhdmFpbGFibGUgZm9yIGVEUCAqLworCQlpZiAoaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUgPT0gTlVMTCAmJiBkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgIT0gTlVMTCkgeworCQkJaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUgPQorCQkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT5sZnBfbHZkc192YnRfbW9kZSk7CisJCQlpZiAoaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJCQlpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZS0+dHlwZSB8PQorCQkJCQlEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJCX0KKwkJfQorCQlpZiAoaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKIAkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwotCQkJbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlKTsKKwkJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBpbnRlbF9kcC0+cGFuZWxfZml4ZWRfbW9kZSk7CiAJCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTc3Miw3ICsyMDM4LDcgQEAKIAlzdHJ1Y3QgZWRpZCAqZWRpZDsKIAlib29sIGhhc19hdWRpbyA9IGZhbHNlOwogCi0JZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZpbnRlbF9kcC0+YWRhcHRlcik7CisJZWRpZCA9IGludGVsX2RwX2dldF9lZGlkKGNvbm5lY3RvciwgJmludGVsX2RwLT5hZGFwdGVyKTsKIAlpZiAoZWRpZCkgewogCQloYXNfYXVkaW8gPSBkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8oZWRpZCk7CiAKQEAgLTE4MzksNyArMjEwNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pbnRlbF9kcF9kZXN0cm95IChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoraW50ZWxfZHBfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIApAQCAtMTg1Nyw2ICsyMTIzLDEwIEBACiAKIAlpMmNfZGVsX2FkYXB0ZXIoJmludGVsX2RwLT5hZGFwdGVyKTsKIAlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworCWlmIChpc19lZHAoaW50ZWxfZHApKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaW50ZWxfZHAtPnBhbmVsX3ZkZF93b3JrKTsKKwkJaXJvbmxha2VfcGFuZWxfdmRkX29mZl9zeW5jKGludGVsX2RwKTsKKwl9CiAJa2ZyZWUoaW50ZWxfZHApOwogfQogCkBAIC0xODk2LDcgKzIxNjYsNyBAQAogCiAvKiBSZXR1cm4gd2hpY2ggRFAgUG9ydCBzaG91bGQgYmUgc2VsZWN0ZWQgZm9yIFRyYW5zY29kZXIgRFAgY29udHJvbCAqLwogaW50Ci1pbnRlbF90cmFuc19kcF9wb3J0X3NlbCAoc3RydWN0IGRybV9jcnRjICpjcnRjKQoraW50ZWxfdHJhbnNfZHBfcG9ydF9zZWwoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9tb2RlX2NvbmZpZyAqbW9kZV9jb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKQEAgLTE5OTMsMTAgKzIyNjMsMTMgQEAKIAllbHNlIGlmIChvdXRwdXRfcmVnID09IERQX0QgfHwgb3V0cHV0X3JlZyA9PSBQQ0hfRFBfRCkKIAkJaW50ZWxfZW5jb2Rlci0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0RQX0RfQ0xPTkVfQklUKTsKIAotCWlmIChpc19lZHAoaW50ZWxfZHApKQorCWlmIChpc19lZHAoaW50ZWxfZHApKSB7CiAJCWludGVsX2VuY29kZXItPmNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9FRFBfQ0xPTkVfQklUKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmludGVsX2RwLT5wYW5lbF92ZGRfd29yaywKKwkJCQkgIGlyb25sYWtlX3BhbmVsX3ZkZF93b3JrKTsKKwl9CiAKLQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKTsKIAljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gdHJ1ZTsKIAljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CiAKQEAgLTIwMzIsMjUgKzIzMDUsNjAgQEAKIAkJCWJyZWFrOwogCX0KIAotCWludGVsX2RwX2kyY19pbml0KGludGVsX2RwLCBpbnRlbF9jb25uZWN0b3IsIG5hbWUpOwotCiAJLyogQ2FjaGUgc29tZSBEUENEIGRhdGEgaW4gdGhlIGVEUCBjYXNlICovCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKIAkJYm9vbCByZXQ7Ci0JCXUzMiBwcF9vbiwgcHBfZGl2OworCQlzdHJ1Y3QgZWRwX3Bvd2VyX3NlcQljdXIsIHZidDsKKwkJdTMyIHBwX29uLCBwcF9vZmYsIHBwX2RpdjsKIAogCQlwcF9vbiA9IEk5MTVfUkVBRChQQ0hfUFBfT05fREVMQVlTKTsKKwkJcHBfb2ZmID0gSTkxNV9SRUFEKFBDSF9QUF9PRkZfREVMQVlTKTsKIAkJcHBfZGl2ID0gSTkxNV9SRUFEKFBDSF9QUF9ESVZJU09SKTsKIAotCQkvKiBHZXQgVDMgJiBUMTIgdmFsdWVzIChub3RlOiBWRVNBIG5vdCBic3BlYyB0ZXJtaW5vbG9neSkgKi8KLQkJZGV2X3ByaXYtPnBhbmVsX3QzID0gKHBwX29uICYgMHgxZmZmMDAwMCkgPj4gMTY7Ci0JCWRldl9wcml2LT5wYW5lbF90MyAvPSAxMDsgLyogdDMgaW4gMTAwdXMgdW5pdHMgKi8KLQkJZGV2X3ByaXYtPnBhbmVsX3QxMiA9IHBwX2RpdiAmIDB4ZjsKLQkJZGV2X3ByaXYtPnBhbmVsX3QxMiAqPSAxMDA7IC8qIHQxMiBpbiAxMDBtcyB1bml0cyAqLworCQkvKiBQdWxsIHRpbWluZyB2YWx1ZXMgb3V0IG9mIHJlZ2lzdGVycyAqLworCQljdXIudDFfdDMgPSAocHBfb24gJiBQQU5FTF9QT1dFUl9VUF9ERUxBWV9NQVNLKSA+PgorCQkJUEFORUxfUE9XRVJfVVBfREVMQVlfU0hJRlQ7CisKKwkJY3VyLnQ4ID0gKHBwX29uICYgUEFORUxfTElHSFRfT05fREVMQVlfTUFTSykgPj4KKwkJCVBBTkVMX0xJR0hUX09OX0RFTEFZX1NISUZUOworCQkKKwkJY3VyLnQ5ID0gKHBwX29mZiAmIFBBTkVMX0xJR0hUX09GRl9ERUxBWV9NQVNLKSA+PgorCQkJUEFORUxfTElHSFRfT0ZGX0RFTEFZX1NISUZUOworCisJCWN1ci50MTAgPSAocHBfb2ZmICYgUEFORUxfUE9XRVJfRE9XTl9ERUxBWV9NQVNLKSA+PgorCQkJUEFORUxfUE9XRVJfRE9XTl9ERUxBWV9TSElGVDsKKworCQljdXIudDExX3QxMiA9ICgocHBfZGl2ICYgUEFORUxfUE9XRVJfQ1lDTEVfREVMQVlfTUFTSykgPj4KKwkJCSAgICAgICBQQU5FTF9QT1dFUl9DWUNMRV9ERUxBWV9TSElGVCkgKiAxMDAwOworCisJCURSTV9ERUJVR19LTVMoImN1ciB0MV90MyAlZCB0OCAlZCB0OSAlZCB0MTAgJWQgdDExX3QxMiAlZFxuIiwKKwkJCSAgICAgIGN1ci50MV90MywgY3VyLnQ4LCBjdXIudDksIGN1ci50MTAsIGN1ci50MTFfdDEyKTsKKworCQl2YnQgPSBkZXZfcHJpdi0+ZWRwLnBwczsKKworCQlEUk1fREVCVUdfS01TKCJ2YnQgdDFfdDMgJWQgdDggJWQgdDkgJWQgdDEwICVkIHQxMV90MTIgJWRcbiIsCisJCQkgICAgICB2YnQudDFfdDMsIHZidC50OCwgdmJ0LnQ5LCB2YnQudDEwLCB2YnQudDExX3QxMik7CisKKyNkZWZpbmUgZ2V0X2RlbGF5KGZpZWxkKQkoKG1heChjdXIuZmllbGQsIHZidC5maWVsZCkgKyA5KSAvIDEwKQorCisJCWludGVsX2RwLT5wYW5lbF9wb3dlcl91cF9kZWxheSA9IGdldF9kZWxheSh0MV90Myk7CisJCWludGVsX2RwLT5iYWNrbGlnaHRfb25fZGVsYXkgPSBnZXRfZGVsYXkodDgpOworCQlpbnRlbF9kcC0+YmFja2xpZ2h0X29mZl9kZWxheSA9IGdldF9kZWxheSh0OSk7CisJCWludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5ID0gZ2V0X2RlbGF5KHQxMCk7CisJCWludGVsX2RwLT5wYW5lbF9wb3dlcl9jeWNsZV9kZWxheSA9IGdldF9kZWxheSh0MTFfdDEyKTsKKworCQlEUk1fREVCVUdfS01TKCJwYW5lbCBwb3dlciB1cCBkZWxheSAlZCwgcG93ZXIgZG93biBkZWxheSAlZCwgcG93ZXIgY3ljbGUgZGVsYXkgJWRcbiIsCisJCQkgICAgICBpbnRlbF9kcC0+cGFuZWxfcG93ZXJfdXBfZGVsYXksIGludGVsX2RwLT5wYW5lbF9wb3dlcl9kb3duX2RlbGF5LAorCQkJICAgICAgaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2N5Y2xlX2RlbGF5KTsKKworCQlEUk1fREVCVUdfS01TKCJiYWNrbGlnaHQgb24gZGVsYXkgJWQsIG9mZiBkZWxheSAlZFxuIiwKKwkJCSAgICAgIGludGVsX2RwLT5iYWNrbGlnaHRfb25fZGVsYXksIGludGVsX2RwLT5iYWNrbGlnaHRfb2ZmX2RlbGF5KTsKKworCQlpbnRlbF9kcC0+cGFuZWxfb2ZmX2ppZmZpZXMgPSBqaWZmaWVzIC0gaW50ZWxfZHAtPnBhbmVsX3Bvd2VyX2Rvd25fZGVsYXk7CiAKIAkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vbihpbnRlbF9kcCk7CiAJCXJldCA9IGludGVsX2RwX2dldF9kcGNkKGludGVsX2RwKTsKLQkJaXJvbmxha2VfZWRwX3BhbmVsX3ZkZF9vZmYoaW50ZWxfZHApOworCQlpcm9ubGFrZV9lZHBfcGFuZWxfdmRkX29mZihpbnRlbF9kcCwgZmFsc2UpOwogCQlpZiAocmV0KSB7CiAJCQlpZiAoaW50ZWxfZHAtPmRwY2RbRFBfRFBDRF9SRVZdID49IDB4MTEpCiAJCQkJZGV2X3ByaXYtPm5vX2F1eF9oYW5kc2hha2UgPQpAQCAtMjA2NSwxOCArMjM3MywxMSBAQAogCQl9CiAJfQogCisJaW50ZWxfZHBfaTJjX2luaXQoaW50ZWxfZHAsIGludGVsX2Nvbm5lY3RvciwgbmFtZSk7CisKIAlpbnRlbF9lbmNvZGVyLT5ob3RfcGx1ZyA9IGludGVsX2RwX2hvdF9wbHVnOwogCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJLyogaW5pdGlhbGl6ZSBwYW5lbCBtb2RlIGZyb20gVkJUIGlmIGF2YWlsYWJsZSBmb3IgZURQICovCi0JCWlmIChkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUpIHsKLQkJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlID0KLQkJCQlkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUpOwotCQkJaWYgKGRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlKSB7Ci0JCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnR5cGUgfD0KLQkJCQkJRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7Ci0JCQl9Ci0JCX0KIAkJZGV2X3ByaXYtPmludF9lZHBfY29ubmVjdG9yID0gY29ubmVjdG9yOwogCQlpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IGZlMTA5OWQuLmJkOWE2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIF93YWl0X2ZvcihDT05ELCBNUywgVykgKHsgXAogCXVuc2lnbmVkIGxvbmcgdGltZW91dF9fID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTVMpOwlcCiAJaW50IHJldF9fID0gMDsJCQkJCQkJXAotCXdoaWxlICghIChDT05EKSkgewkJCQkJCVwKKwl3aGlsZSAoIShDT05EKSkgewkJCQkJCVwKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dF9fKSkgewkJCVwKIAkJCXJldF9fID0gLUVUSU1FRE9VVDsJCQkJXAogCQkJYnJlYWs7CQkJCQkJXApAQCAtNDksMTAgKzQ5LDEwIEBACiAKICNkZWZpbmUgTVNMRUVQKHgpIGRvIHsgXAogCWlmIChpbl9kYmdfbWFzdGVyKCkpIFwKLQkgICAgICAgCW1kZWxheSh4KTsgXAorCQltZGVsYXkoeCk7IFwKIAllbHNlIFwKIAkJbXNsZWVwKHgpOyBcCi19IHdoaWxlKDApCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIEtIeih4KSAoMTAwMCp4KQogI2RlZmluZSBNSHooeCkgS0h6KDEwMDAqeCkKQEAgLTE3MSw2ICsxNzEsOSBAQAogCWludDE2X3QgY3Vyc29yX3dpZHRoLCBjdXJzb3JfaGVpZ2h0OwogCWJvb2wgY3Vyc29yX3Zpc2libGU7CiAJdW5zaWduZWQgaW50IGJwcDsKKworCWJvb2wgbm9fcGxsOyAvKiB0ZXJ0aWFyeSBwaXBlIGZvciBJVkIgKi8KKwlib29sIHVzZV9wbGxfYTsKIH07CiAKICNkZWZpbmUgdG9faW50ZWxfY3J0Yyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGludGVsX2NydGMsIGJhc2UpCkBAIC0xODQsNyArMTg3LDcgQEAKICNkZWZpbmUgRElQX1ZFUlNJT05fQVZJIDB4MgogI2RlZmluZSBESVBfTEVOX0FWSSAgICAgMTMKIAotI2RlZmluZSBESVBfVFlQRV9TUEQJMHgzCisjZGVmaW5lIERJUF9UWVBFX1NQRAkweDgzCiAjZGVmaW5lIERJUF9WRVJTSU9OX1NQRAkweDEKICNkZWZpbmUgRElQX0xFTl9TUEQJMjUKICNkZWZpbmUgRElQX1NQRF9VTktOT1dOCTAKQEAgLTI4NCw3ICsyODcsNyBAQAogaW50ZWxfZHBfc2V0X21fbihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAogCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOwogZXh0ZXJuIGJvb2wgaW50ZWxfZHBkX2lzX2VkcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGludGVsX2VkcF9saW5rX2NvbmZpZyAoc3RydWN0IGludGVsX2VuY29kZXIgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiB2b2lkIGludGVsX2VkcF9saW5rX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqLCBpbnQgKiwgaW50ICopOwogZXh0ZXJuIGJvb2wgaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAKIC8qIGludGVsX3BhbmVsLmMgKi8KQEAgLTMwNCw4ICszMDcsOCBAQAogZXh0ZXJuIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaW50ZWxfcGFuZWxfZGV0ZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Ci1leHRlcm4gdm9pZCBpbnRlbF9lbmNvZGVyX3ByZXBhcmUgKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Ci1leHRlcm4gdm9pZCBpbnRlbF9lbmNvZGVyX2NvbW1pdCAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiB2b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOworZXh0ZXJuIHZvaWQgaW50ZWxfZW5jb2Rlcl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIGV4dGVybiB2b2lkIGludGVsX2VuY29kZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9lbmNvZGVyICppbnRlbF9hdHRhY2hlZF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0zNzcsNCArMzgwLDggQEAKIGV4dGVybiB2b2lkIGludGVsX2ZiX3Jlc3RvcmVfbW9kZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIHZvaWQgaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbnRlbF93cml0ZV9lbGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKK2V4dGVybiB2b2lkIGludGVsX2NwdF92ZXJpZnlfbW9kZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSk7CisKICNlbmRpZiAvKiBfX0lOVEVMX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYwppbmRleCAyMjZiYTgzLi5kNGY1YTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCkBAIC02OSw4ICs2OSw3IEBACiAJZnJhbWUtPmNoZWNrc3VtID0gMDsKIAlmcmFtZS0+ZWNjID0gMDsKIAotCS8qIEhlYWRlciBpc24ndCBwYXJ0IG9mIHRoZSBjaGVja3N1bSAqLwotCWZvciAoaSA9IDU7IGkgPCBmcmFtZS0+bGVuOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGZyYW1lLT5sZW4gKyBESVBfSEVBREVSX1NJWkU7IGkrKykKIAkJc3VtICs9IGRhdGFbaV07CiAKIAlmcmFtZS0+Y2hlY2tzdW0gPSAweDEwMCAtIHN1bTsKQEAgLTEwNCw3ICsxMDMsNyBAQAogCQlmbGFncyB8PSBWSURFT19ESVBfRU5BQkxFX0FWSSB8IFZJREVPX0RJUF9GUkVRX1ZTWU5DOwogCQlicmVhazsKIAljYXNlIERJUF9UWVBFX1NQRDoKLQkJZmxhZ3MgfD0gVklERU9fRElQX0VOQUJMRV9TUEQgfCBWSURFT19ESVBfRlJFUV8yVlNZTkM7CisJCWZsYWdzIHw9IFZJREVPX0RJUF9FTkFCTEVfU1BEIHwgVklERU9fRElQX0ZSRVFfVlNZTkM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9ERUJVR19EUklWRVIoInVua25vd24gaW5mbyBmcmFtZSB0eXBlICVkXG4iLCBmcmFtZS0+dHlwZSk7CkBAIC0xNjUsOSArMTY0LDkgQEAKIAogCWZsYWdzID0gaW50ZWxfaW5mb2ZyYW1lX2luZGV4KGZyYW1lKTsKIAotCXZhbCAmPSB+VklERU9fRElQX1NFTEVDVF9NQVNLOworCXZhbCAmPSB+KFZJREVPX0RJUF9TRUxFQ1RfTUFTSyB8IDB4Zik7IC8qIGNsZWFyIERJUCBkYXRhIG9mZnNldCAqLwogCi0JSTkxNV9XUklURShyZWcsIHZhbCB8IGZsYWdzKTsKKwlJOTE1X1dSSVRFKHJlZywgVklERU9fRElQX0VOQUJMRSB8IHZhbCB8IGZsYWdzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkgewogCQlJOTE1X1dSSVRFKFRWSURFT19ESVBfREFUQShpbnRlbF9jcnRjLT5waXBlKSwgKmRhdGEpOwpAQCAtMjQ1LDE2ICsyNDQsMTcgQEAKIAkJc2R2b3ggfD0gSERNSV9NT0RFX1NFTEVDVDsKIAogCWlmIChpbnRlbF9oZG1pLT5oYXNfYXVkaW8pIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiRW5hYmxpbmcgSERNSSBhdWRpbyBvbiBwaXBlICVjXG4iLAorCQkJCSBwaXBlX25hbWUoaW50ZWxfY3J0Yy0+cGlwZSkpOwogCQlzZHZveCB8PSBTRFZPX0FVRElPX0VOQUJMRTsKIAkJc2R2b3ggfD0gU0RWT19OVUxMX1BBQ0tFVFNfRFVSSU5HX1ZTWU5DOworCQlpbnRlbF93cml0ZV9lbGQoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CiAJfQogCi0JaWYgKGludGVsX2NydGMtPnBpcGUgPT0gMSkgewotCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKLQkJCXNkdm94IHw9IFBPUlRfVFJBTlNfQl9TRUxfQ1BUOwotCQllbHNlCi0JCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7Ci0JfQorCWlmIChIQVNfUENIX0NQVChkZXYpKQorCQlzZHZveCB8PSBQT1JUX1RSQU5TX1NFTF9DUFQoaW50ZWxfY3J0Yy0+cGlwZSk7CisJZWxzZSBpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7CiAKIAlJOTE1X1dSSVRFKGludGVsX2hkbWktPnNkdm94X3JlZywgc2R2b3gpOwogCVBPU1RJTkdfUkVBRChpbnRlbF9oZG1pLT5zZHZveF9yZWcpOwpAQCAtNDg2LDYgKzQ4Niw3IEBACiAJc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXI7CiAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yOwogCXN0cnVjdCBpbnRlbF9oZG1pICppbnRlbF9oZG1pOworCWludCBpOwogCiAJaW50ZWxfaGRtaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9oZG1pKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnRlbF9oZG1pKQpAQCAtNTExLDcgKzUxMiw3IEBACiAJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwogCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSAwOwogCWNvbm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gMDsKLQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCWludGVsX2VuY29kZXItPmNydGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKTsKIAogCS8qIFNldCB1cCB0aGUgRERDIGJ1cy4gKi8KIAlpZiAoc2R2b3hfcmVnID09IFNEVk9CKSB7CkBAIC01MzgsMTAgKzUzOSwxNCBAQAogCiAJaW50ZWxfaGRtaS0+c2R2b3hfcmVnID0gc2R2b3hfcmVnOwogCi0JaWYgKCFIQVNfUENIX1NQTElUKGRldikpCisJaWYgKCFIQVNfUENIX1NQTElUKGRldikpIHsKIAkJaW50ZWxfaGRtaS0+d3JpdGVfaW5mb2ZyYW1lID0gaTl4eF93cml0ZV9pbmZvZnJhbWU7Ci0JZWxzZQorCQlJOTE1X1dSSVRFKFZJREVPX0RJUF9DVEwsIDApOworCX0gZWxzZSB7CiAJCWludGVsX2hkbWktPndyaXRlX2luZm9mcmFtZSA9IGlyb25sYWtlX3dyaXRlX2luZm9mcmFtZTsKKwkJZm9yX2VhY2hfcGlwZShpKQorCQkJSTkxNV9XUklURShUVklERU9fRElQX0NUTChpKSwgMCk7CisJfQogCiAJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmaW50ZWxfZW5jb2Rlci0+YmFzZSwgJmludGVsX2hkbWlfaGVscGVyX2Z1bmNzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwppbmRleCBkOThjZWU2Li5kMzBjY2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9pMmMuYwpAQCAtMjgsNiArMjgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgpAQCAtNDIyLDEzICs0MjMsNyBAQAogewogCXN0cnVjdCBpbnRlbF9nbWJ1cyAqYnVzID0gdG9faW50ZWxfZ21idXMoYWRhcHRlcik7CiAKLQkvKiBzcGVlZDoKLQkgKiAweDAgPSAxMDAgS0h6Ci0JICogMHgxID0gNTAgS0h6Ci0JICogMHgyID0gNDAwIEtIegotCSAqIDB4MyA9IDEwMDAgS2h6Ci0JICovCi0JYnVzLT5yZWcwID0gKGJ1cy0+cmVnMCAmIH4oMHgzIDw8IDgpKSB8IChzcGVlZCA8PCA4KTsKKwlidXMtPnJlZzAgPSAoYnVzLT5yZWcwICYgfigweDMgPDwgOCkpIHwgc3BlZWQ7CiB9CiAKIHZvaWQgaW50ZWxfZ21idXNfZm9yY2VfYml0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBmb3JjZV9iaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggMzFkYTc3Zi4uNDJmMTY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtODg4LDkgKzg4OCwxMSBAQAogCWludGVsX2VuY29kZXItPnR5cGUgPSBJTlRFTF9PVVRQVVRfTFZEUzsKIAogCWludGVsX2VuY29kZXItPmNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9MVkRTX0NMT05FX0JJVCk7Ci0JaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMSk7Ci0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDUpCi0JCWludGVsX2VuY29kZXItPmNydGNfbWFzayB8PSAoMSA8PCAwKTsKKwlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQorCQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpIHwgKDEgPDwgMik7CisJZWxzZQorCQlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAxKTsKKwogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmludGVsX2x2ZHNfaGVscGVyX2Z1bmNzKTsKIAlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLCAmaW50ZWxfbHZkc19jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKIAljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlciA9IFN1YlBpeGVsSG9yaXpvbnRhbFJHQjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9tb2Rlcy5jCmluZGV4IDNiMjZhM2IuLmJlMmM2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX21vZGVzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbW9kZXMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGRybS9kcm1fZWRpZC5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgpAQCAtNzQsNiArNzUsNyBAQAogCWlmIChlZGlkKSB7CiAJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIGVkaWQpOwogCQlyZXQgPSBkcm1fYWRkX2VkaWRfbW9kZXMoY29ubmVjdG9yLCBlZGlkKTsKKwkJZHJtX2VkaWRfdG9fZWxkKGNvbm5lY3RvciwgZWRpZCk7CiAJCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLnJhd19lZGlkID0gTlVMTDsKIAkJa2ZyZWUoZWRpZCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKaW5kZXggYjhlODE1OGIuLjI4OTE0MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYwpAQCAtNTEsNjEgKzUxLDYxIEBACiAjZGVmaW5lIE1CT1hfQVNMRSAgICAgICgxPDwyKQogCiBzdHJ1Y3Qgb3ByZWdpb25faGVhZGVyIHsKLSAgICAgICB1OCBzaWduYXR1cmVbMTZdOwotICAgICAgIHUzMiBzaXplOwotICAgICAgIHUzMiBvcHJlZ2lvbl92ZXI7Ci0gICAgICAgdTggYmlvc192ZXJbMzJdOwotICAgICAgIHU4IHZiaW9zX3ZlclsxNl07Ci0gICAgICAgdTggZHJpdmVyX3ZlclsxNl07Ci0gICAgICAgdTMyIG1ib3hlczsKLSAgICAgICB1OCByZXNlcnZlZFsxNjRdOworCXU4IHNpZ25hdHVyZVsxNl07CisJdTMyIHNpemU7CisJdTMyIG9wcmVnaW9uX3ZlcjsKKwl1OCBiaW9zX3ZlclszMl07CisJdTggdmJpb3NfdmVyWzE2XTsKKwl1OCBkcml2ZXJfdmVyWzE2XTsKKwl1MzIgbWJveGVzOworCXU4IHJlc2VydmVkWzE2NF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBPcFJlZ2lvbiBtYWlsYm94ICMxOiBwdWJsaWMgQUNQSSBtZXRob2RzICovCiBzdHJ1Y3Qgb3ByZWdpb25fYWNwaSB7Ci0gICAgICAgdTMyIGRyZHk7ICAgICAgIC8qIGRyaXZlciByZWFkaW5lc3MgKi8KLSAgICAgICB1MzIgY3N0czsgICAgICAgLyogbm90aWZpY2F0aW9uIHN0YXR1cyAqLwotICAgICAgIHUzMiBjZXZ0OyAgICAgICAvKiBjdXJyZW50IGV2ZW50ICovCi0gICAgICAgdTggcnN2ZDFbMjBdOwotICAgICAgIHUzMiBkaWRsWzhdOyAgICAvKiBzdXBwb3J0ZWQgZGlzcGxheSBkZXZpY2VzIElEIGxpc3QgKi8KLSAgICAgICB1MzIgY3BkbFs4XTsgICAgLyogY3VycmVudGx5IHByZXNlbnRlZCBkaXNwbGF5IGxpc3QgKi8KLSAgICAgICB1MzIgY2FkbFs4XTsgICAgLyogY3VycmVudGx5IGFjdGl2ZSBkaXNwbGF5IGxpc3QgKi8KLSAgICAgICB1MzIgbmFkbFs4XTsgICAgLyogbmV4dCBhY3RpdmUgZGV2aWNlcyBsaXN0ICovCi0gICAgICAgdTMyIGFzbHA7ICAgICAgIC8qIEFTTCBzbGVlcCB0aW1lLW91dCAqLwotICAgICAgIHUzMiB0aWR4OyAgICAgICAvKiB0b2dnbGUgdGFibGUgaW5kZXggKi8KLSAgICAgICB1MzIgY2hwZDsgICAgICAgLyogY3VycmVudCBob3RwbHVnIGVuYWJsZSBpbmRpY2F0b3IgKi8KLSAgICAgICB1MzIgY2xpZDsgICAgICAgLyogY3VycmVudCBsaWQgc3RhdGUqLwotICAgICAgIHUzMiBjZGNrOyAgICAgICAvKiBjdXJyZW50IGRvY2tpbmcgc3RhdGUgKi8KLSAgICAgICB1MzIgc3hzdzsgICAgICAgLyogU3ggc3RhdGUgcmVzdW1lICovCi0gICAgICAgdTMyIGV2dHM7ICAgICAgIC8qIEFTTCBzdXBwb3J0ZWQgZXZlbnRzICovCi0gICAgICAgdTMyIGNub3Q7ICAgICAgIC8qIGN1cnJlbnQgT1Mgbm90aWZpY2F0aW9uICovCi0gICAgICAgdTMyIG5yZHk7ICAgICAgIC8qIGRyaXZlciBzdGF0dXMgKi8KLSAgICAgICB1OCByc3ZkMls2MF07CisJdTMyIGRyZHk7ICAgICAgIC8qIGRyaXZlciByZWFkaW5lc3MgKi8KKwl1MzIgY3N0czsgICAgICAgLyogbm90aWZpY2F0aW9uIHN0YXR1cyAqLworCXUzMiBjZXZ0OyAgICAgICAvKiBjdXJyZW50IGV2ZW50ICovCisJdTggcnN2ZDFbMjBdOworCXUzMiBkaWRsWzhdOyAgICAvKiBzdXBwb3J0ZWQgZGlzcGxheSBkZXZpY2VzIElEIGxpc3QgKi8KKwl1MzIgY3BkbFs4XTsgICAgLyogY3VycmVudGx5IHByZXNlbnRlZCBkaXNwbGF5IGxpc3QgKi8KKwl1MzIgY2FkbFs4XTsgICAgLyogY3VycmVudGx5IGFjdGl2ZSBkaXNwbGF5IGxpc3QgKi8KKwl1MzIgbmFkbFs4XTsgICAgLyogbmV4dCBhY3RpdmUgZGV2aWNlcyBsaXN0ICovCisJdTMyIGFzbHA7ICAgICAgIC8qIEFTTCBzbGVlcCB0aW1lLW91dCAqLworCXUzMiB0aWR4OyAgICAgICAvKiB0b2dnbGUgdGFibGUgaW5kZXggKi8KKwl1MzIgY2hwZDsgICAgICAgLyogY3VycmVudCBob3RwbHVnIGVuYWJsZSBpbmRpY2F0b3IgKi8KKwl1MzIgY2xpZDsgICAgICAgLyogY3VycmVudCBsaWQgc3RhdGUqLworCXUzMiBjZGNrOyAgICAgICAvKiBjdXJyZW50IGRvY2tpbmcgc3RhdGUgKi8KKwl1MzIgc3hzdzsgICAgICAgLyogU3ggc3RhdGUgcmVzdW1lICovCisJdTMyIGV2dHM7ICAgICAgIC8qIEFTTCBzdXBwb3J0ZWQgZXZlbnRzICovCisJdTMyIGNub3Q7ICAgICAgIC8qIGN1cnJlbnQgT1Mgbm90aWZpY2F0aW9uICovCisJdTMyIG5yZHk7ICAgICAgIC8qIGRyaXZlciBzdGF0dXMgKi8KKwl1OCByc3ZkMls2MF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBPcFJlZ2lvbiBtYWlsYm94ICMyOiBTV1NDSSAqLwogc3RydWN0IG9wcmVnaW9uX3N3c2NpIHsKLSAgICAgICB1MzIgc2NpYzsgICAgICAgLyogU1dTQ0kgY29tbWFuZHxzdGF0dXN8ZGF0YSAqLwotICAgICAgIHUzMiBwYXJtOyAgICAgICAvKiBjb21tYW5kIHBhcmFtZXRlcnMgKi8KLSAgICAgICB1MzIgZHNscDsgICAgICAgLyogZHJpdmVyIHNsZWVwIHRpbWUtb3V0ICovCi0gICAgICAgdTggcnN2ZFsyNDRdOworCXUzMiBzY2ljOyAgICAgICAvKiBTV1NDSSBjb21tYW5kfHN0YXR1c3xkYXRhICovCisJdTMyIHBhcm07ICAgICAgIC8qIGNvbW1hbmQgcGFyYW1ldGVycyAqLworCXUzMiBkc2xwOyAgICAgICAvKiBkcml2ZXIgc2xlZXAgdGltZS1vdXQgKi8KKwl1OCByc3ZkWzI0NF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBPcFJlZ2lvbiBtYWlsYm94ICMzOiBBU0xFICovCiBzdHJ1Y3Qgb3ByZWdpb25fYXNsZSB7Ci0gICAgICAgdTMyIGFyZHk7ICAgICAgIC8qIGRyaXZlciByZWFkaW5lc3MgKi8KLSAgICAgICB1MzIgYXNsYzsgICAgICAgLyogQVNMRSBpbnRlcnJ1cHQgY29tbWFuZCAqLwotICAgICAgIHUzMiB0Y2hlOyAgICAgICAvKiB0ZWNobm9sb2d5IGVuYWJsZWQgaW5kaWNhdG9yICovCi0gICAgICAgdTMyIGFsc2k7ICAgICAgIC8qIGN1cnJlbnQgQUxTIGlsbHVtaW5hbmNlIHJlYWRpbmcgKi8KLSAgICAgICB1MzIgYmNscDsgICAgICAgLyogYmFja2xpZ2h0IGJyaWdodG5lc3MgdG8gc2V0ICovCi0gICAgICAgdTMyIHBmaXQ7ICAgICAgIC8qIHBhbmVsIGZpdHRpbmcgc3RhdGUgKi8KLSAgICAgICB1MzIgY2JsdjsgICAgICAgLyogY3VycmVudCBicmlnaHRuZXNzIGxldmVsICovCi0gICAgICAgdTE2IGJjbG1bMjBdOyAgIC8qIGJhY2tsaWdodCBsZXZlbCBkdXR5IGN5Y2xlIG1hcHBpbmcgdGFibGUgKi8KLSAgICAgICB1MzIgY3BmbTsgICAgICAgLyogY3VycmVudCBwYW5lbCBmaXR0aW5nIG1vZGUgKi8KLSAgICAgICB1MzIgZXBmbTsgICAgICAgLyogZW5hYmxlZCBwYW5lbCBmaXR0aW5nIG1vZGVzICovCi0gICAgICAgdTggcGx1dFs3NF07ICAgIC8qIHBhbmVsIExVVCBhbmQgaWRlbnRpZmllciAqLwotICAgICAgIHUzMiBwZm1iOyAgICAgICAvKiBQV00gZnJlcSBhbmQgbWluIGJyaWdodG5lc3MgKi8KLSAgICAgICB1OCByc3ZkWzEwMl07CisJdTMyIGFyZHk7ICAgICAgIC8qIGRyaXZlciByZWFkaW5lc3MgKi8KKwl1MzIgYXNsYzsgICAgICAgLyogQVNMRSBpbnRlcnJ1cHQgY29tbWFuZCAqLworCXUzMiB0Y2hlOyAgICAgICAvKiB0ZWNobm9sb2d5IGVuYWJsZWQgaW5kaWNhdG9yICovCisJdTMyIGFsc2k7ICAgICAgIC8qIGN1cnJlbnQgQUxTIGlsbHVtaW5hbmNlIHJlYWRpbmcgKi8KKwl1MzIgYmNscDsgICAgICAgLyogYmFja2xpZ2h0IGJyaWdodG5lc3MgdG8gc2V0ICovCisJdTMyIHBmaXQ7ICAgICAgIC8qIHBhbmVsIGZpdHRpbmcgc3RhdGUgKi8KKwl1MzIgY2JsdjsgICAgICAgLyogY3VycmVudCBicmlnaHRuZXNzIGxldmVsICovCisJdTE2IGJjbG1bMjBdOyAgIC8qIGJhY2tsaWdodCBsZXZlbCBkdXR5IGN5Y2xlIG1hcHBpbmcgdGFibGUgKi8KKwl1MzIgY3BmbTsgICAgICAgLyogY3VycmVudCBwYW5lbCBmaXR0aW5nIG1vZGUgKi8KKwl1MzIgZXBmbTsgICAgICAgLyogZW5hYmxlZCBwYW5lbCBmaXR0aW5nIG1vZGVzICovCisJdTggcGx1dFs3NF07ICAgIC8qIHBhbmVsIExVVCBhbmQgaWRlbnRpZmllciAqLworCXUzMiBwZm1iOyAgICAgICAvKiBQV00gZnJlcSBhbmQgbWluIGJyaWdodG5lc3MgKi8KKwl1OCByc3ZkWzEwMl07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBBU0xFIGlycSByZXF1ZXN0IGJpdHMgKi8KQEAgLTM2MSw3ICszNjEsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3BpX2NkZXYsICZhY3BpX3ZpZGVvX2J1cy0+Y2hpbGRyZW4sIG5vZGUpIHsKIAkJaWYgKGkgPj0gOCkgewotCQkJZGV2X3ByaW50ayAoS0VSTl9FUlIsICZkZXYtPnBkZXYtPmRldiwKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgIk1vcmUgdGhhbiA4IG91dHB1dHMgZGV0ZWN0ZWRcbiIpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0zODcsNyArMzg3LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKIAkJaW50IG91dHB1dF90eXBlID0gQUNQSV9PVEhFUl9PVVRQVVQ7CiAJCWlmIChpID49IDgpIHsKLQkJCWRldl9wcmludGsgKEtFUk5fRVJSLCAmZGV2LT5wZGV2LT5kZXYsCisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJNb3JlIHRoYW4gOCBvdXRwdXRzIGRldGVjdGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCmluZGV4IGQzNjAzODAuLmNkZjE3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKQEAgLTExNyw1NyArMTE3LDU3IEBACiAKIC8qIG1lbW9yeSBidWZmZXJkIG92ZXJsYXkgcmVnaXN0ZXJzICovCiBzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgewotICAgIHUzMiBPQlVGXzBZOwotICAgIHUzMiBPQlVGXzFZOwotICAgIHUzMiBPQlVGXzBVOwotICAgIHUzMiBPQlVGXzBWOwotICAgIHUzMiBPQlVGXzFVOwotICAgIHUzMiBPQlVGXzFWOwotICAgIHUzMiBPU1RSSURFOwotICAgIHUzMiBZUkdCX1ZQSDsKLSAgICB1MzIgVVZfVlBIOwotICAgIHUzMiBIT1JaX1BIOwotICAgIHUzMiBJTklUX1BIUzsKLSAgICB1MzIgRFdJTlBPUzsKLSAgICB1MzIgRFdJTlNaOwotICAgIHUzMiBTV0lEVEg7Ci0gICAgdTMyIFNXSURUSFNXOwotICAgIHUzMiBTSEVJR0hUOwotICAgIHUzMiBZUkdCU0NBTEU7Ci0gICAgdTMyIFVWU0NBTEU7Ci0gICAgdTMyIE9DTFJDMDsKLSAgICB1MzIgT0NMUkMxOwotICAgIHUzMiBEQ0xSS1Y7Ci0gICAgdTMyIERDTFJLTTsKLSAgICB1MzIgU0NMUktWSDsKLSAgICB1MzIgU0NMUktWTDsKLSAgICB1MzIgU0NMUktFTjsKLSAgICB1MzIgT0NPTkZJRzsKLSAgICB1MzIgT0NNRDsKLSAgICB1MzIgUkVTRVJWRUQxOyAvKiAweDZDICovCi0gICAgdTMyIE9TVEFSVF8wWTsKLSAgICB1MzIgT1NUQVJUXzFZOwotICAgIHUzMiBPU1RBUlRfMFU7Ci0gICAgdTMyIE9TVEFSVF8wVjsKLSAgICB1MzIgT1NUQVJUXzFVOwotICAgIHUzMiBPU1RBUlRfMVY7Ci0gICAgdTMyIE9USUxFT0ZGXzBZOwotICAgIHUzMiBPVElMRU9GRl8xWTsKLSAgICB1MzIgT1RJTEVPRkZfMFU7Ci0gICAgdTMyIE9USUxFT0ZGXzBWOwotICAgIHUzMiBPVElMRU9GRl8xVTsKLSAgICB1MzIgT1RJTEVPRkZfMVY7Ci0gICAgdTMyIEZBU1RIU0NBTEU7IC8qIDB4QTAgKi8KLSAgICB1MzIgVVZTQ0FMRVY7IC8qIDB4QTQgKi8KLSAgICB1MzIgUkVTRVJWRURDWygweDIwMCAtIDB4QTgpIC8gNF07IC8qIDB4QTggLSAweDFGQyAqLwotICAgIHUxNiBZX1ZDT0VGU1tOX1ZFUlRfWV9UQVBTICogTl9QSEFTRVNdOyAvKiAweDIwMCAqLwotICAgIHUxNiBSRVNFUlZFRERbMHgxMDAgLyAyIC0gTl9WRVJUX1lfVEFQUyAqIE5fUEhBU0VTXTsKLSAgICB1MTYgWV9IQ09FRlNbTl9IT1JJWl9ZX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4MzAwICovCi0gICAgdTE2IFJFU0VSVkVERVsweDIwMCAvIDIgLSBOX0hPUklaX1lfVEFQUyAqIE5fUEhBU0VTXTsKLSAgICB1MTYgVVZfVkNPRUZTW05fVkVSVF9VVl9UQVBTICogTl9QSEFTRVNdOyAvKiAweDUwMCAqLwotICAgIHUxNiBSRVNFUlZFREZbMHgxMDAgLyAyIC0gTl9WRVJUX1VWX1RBUFMgKiBOX1BIQVNFU107Ci0gICAgdTE2IFVWX0hDT0VGU1tOX0hPUklaX1VWX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4NjAwICovCi0gICAgdTE2IFJFU0VSVkVER1sweDEwMCAvIDIgLSBOX0hPUklaX1VWX1RBUFMgKiBOX1BIQVNFU107CisJdTMyIE9CVUZfMFk7CisJdTMyIE9CVUZfMVk7CisJdTMyIE9CVUZfMFU7CisJdTMyIE9CVUZfMFY7CisJdTMyIE9CVUZfMVU7CisJdTMyIE9CVUZfMVY7CisJdTMyIE9TVFJJREU7CisJdTMyIFlSR0JfVlBIOworCXUzMiBVVl9WUEg7CisJdTMyIEhPUlpfUEg7CisJdTMyIElOSVRfUEhTOworCXUzMiBEV0lOUE9TOworCXUzMiBEV0lOU1o7CisJdTMyIFNXSURUSDsKKwl1MzIgU1dJRFRIU1c7CisJdTMyIFNIRUlHSFQ7CisJdTMyIFlSR0JTQ0FMRTsKKwl1MzIgVVZTQ0FMRTsKKwl1MzIgT0NMUkMwOworCXUzMiBPQ0xSQzE7CisJdTMyIERDTFJLVjsKKwl1MzIgRENMUktNOworCXUzMiBTQ0xSS1ZIOworCXUzMiBTQ0xSS1ZMOworCXUzMiBTQ0xSS0VOOworCXUzMiBPQ09ORklHOworCXUzMiBPQ01EOworCXUzMiBSRVNFUlZFRDE7IC8qIDB4NkMgKi8KKwl1MzIgT1NUQVJUXzBZOworCXUzMiBPU1RBUlRfMVk7CisJdTMyIE9TVEFSVF8wVTsKKwl1MzIgT1NUQVJUXzBWOworCXUzMiBPU1RBUlRfMVU7CisJdTMyIE9TVEFSVF8xVjsKKwl1MzIgT1RJTEVPRkZfMFk7CisJdTMyIE9USUxFT0ZGXzFZOworCXUzMiBPVElMRU9GRl8wVTsKKwl1MzIgT1RJTEVPRkZfMFY7CisJdTMyIE9USUxFT0ZGXzFVOworCXUzMiBPVElMRU9GRl8xVjsKKwl1MzIgRkFTVEhTQ0FMRTsgLyogMHhBMCAqLworCXUzMiBVVlNDQUxFVjsgLyogMHhBNCAqLworCXUzMiBSRVNFUlZFRENbKDB4MjAwIC0gMHhBOCkgLyA0XTsgLyogMHhBOCAtIDB4MUZDICovCisJdTE2IFlfVkNPRUZTW05fVkVSVF9ZX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4MjAwICovCisJdTE2IFJFU0VSVkVERFsweDEwMCAvIDIgLSBOX1ZFUlRfWV9UQVBTICogTl9QSEFTRVNdOworCXUxNiBZX0hDT0VGU1tOX0hPUklaX1lfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHgzMDAgKi8KKwl1MTYgUkVTRVJWRURFWzB4MjAwIC8gMiAtIE5fSE9SSVpfWV9UQVBTICogTl9QSEFTRVNdOworCXUxNiBVVl9WQ09FRlNbTl9WRVJUX1VWX1RBUFMgKiBOX1BIQVNFU107IC8qIDB4NTAwICovCisJdTE2IFJFU0VSVkVERlsweDEwMCAvIDIgLSBOX1ZFUlRfVVZfVEFQUyAqIE5fUEhBU0VTXTsKKwl1MTYgVVZfSENPRUZTW05fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsgLyogMHg2MDAgKi8KKwl1MTYgUkVTRVJWRURHWzB4MTAwIC8gMiAtIE5fSE9SSVpfVVZfVEFQUyAqIE5fUEhBU0VTXTsKIH07CiAKIHN0cnVjdCBpbnRlbF9vdmVybGF5IHsKQEAgLTE5Miw3ICsxOTIsNyBAQAogc3RhdGljIHN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqCiBpbnRlbF9vdmVybGF5X21hcF9yZWdzKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQogewotICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gb3ZlcmxheS0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gb3ZlcmxheS0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3M7CiAKIAlpZiAoT1ZFUkxBWV9ORUVEU19QSFlTSUNBTChvdmVybGF5LT5kZXYpKQpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIAltb2RlID0gZHJtX21vZGVfZHVwbGljYXRlKGRldiwgJnZlc2FfNjQweDQ4MCk7CiAJZHJtX21vZGVfc2V0X2NydGNpbmZvKG1vZGUsIENSVENfSU5URVJMQUNFX0hBTFZFX1YpOwotCWlmKCFkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoJmNydGMtPmJhc2UsIG1vZGUsCisJaWYgKCFkcm1fY3J0Y19oZWxwZXJfc2V0X21vZGUoJmNydGMtPmJhc2UsIG1vZGUsCiAJCQkJICAgICAgIGNydGMtPmJhc2UueCwgY3J0Yy0+YmFzZS55LAogCQkJCSAgICAgICBjcnRjLT5iYXNlLmZiKSkKIAkJcmV0dXJuIDA7CkBAIC0zMzIsNyArMzMyLDcgQEAKIAkJCQkgIGJvb2wgbG9hZF9wb2x5cGhhc2VfZmlsdGVyKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7Ci0gICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIAl1MzIgZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOwogCXUzMiB0bXA7CkBAIC0zNTksNyArMzU5LDcgQEAKIAl9CiAJT1VUX1JJTkcoTUlfT1ZFUkxBWV9GTElQIHwgTUlfT1ZFUkxBWV9DT05USU5VRSk7CiAJT1VUX1JJTkcoZmxpcF9hZGRyKTsKLSAgICAgICAgQURWQU5DRV9MUF9SSU5HKCk7CisJQURWQU5DRV9MUF9SSU5HKCk7CiAKIAlyZXQgPSBpOTE1X2FkZF9yZXF1ZXN0KExQX1JJTkcoZGV2X3ByaXYpLCBOVUxMLCByZXF1ZXN0KTsKIAlpZiAocmV0KSB7CkBAIC01ODMsNyArNTgzLDcgQEAKIAlyZXQgPSAoKG9mZnNldCArIHdpZHRoICsgbWFzaykgPj4gc2hpZnQpIC0gKG9mZnNldCA+PiBzaGlmdCk7CiAJaWYgKCFJU19HRU4yKGRldikpCiAJCXJldCA8PD0gMTsKLQlyZXQgLT0xOworCXJldCAtPSAxOwogCXJldHVybiByZXQgPDwgMjsKIH0KIApAQCAtODE3LDcgKzgxNyw3IEBACiAJcmVncy0+U1dJRFRIU1cgPSBjYWxjX3N3aWR0aHN3KG92ZXJsYXktPmRldiwKIAkJCQkgICAgICAgcGFyYW1zLT5vZmZzZXRfWSwgdG1wX3dpZHRoKTsKIAlyZWdzLT5TSEVJR0hUID0gcGFyYW1zLT5zcmNfaDsKLQlyZWdzLT5PQlVGXzBZID0gbmV3X2JvLT5ndHRfb2Zmc2V0ICsgcGFyYW1zLT4gb2Zmc2V0X1k7CisJcmVncy0+T0JVRl8wWSA9IG5ld19iby0+Z3R0X29mZnNldCArIHBhcmFtcy0+b2Zmc2V0X1k7CiAJcmVncy0+T1NUUklERSA9IHBhcmFtcy0+c3RyaWRlX1k7CiAKIAlpZiAocGFyYW1zLT5mb3JtYXQgJiBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUikgewpAQCAtOTE3LDcgKzkxNyw3IEBACiAJICogbGluZSB3aXRoIHRoZSBpbnRlbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgaTk2NQogCSAqLwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7Ci0JICAgICAgIAkvKiBvbiBpOTY1IHVzZSB0aGUgUEdNIHJlZyB0byByZWFkIG91dCB0aGUgYXV0b3NjYWxlciB2YWx1ZXMgKi8KKwkJLyogb24gaTk2NSB1c2UgdGhlIFBHTSByZWcgdG8gcmVhZCBvdXQgdGhlIGF1dG9zY2FsZXIgdmFsdWVzICovCiAJCXJhdGlvID0gSTkxNV9SRUFEKFBGSVRfUEdNX1JBVElPUykgPj4gUEZJVF9WRVJUX1NDQUxFX1NISUZUXzk2NTsKIAl9IGVsc2UgewogCQlpZiAocGZpdF9jb250cm9sICYgVkVSVF9BVVRPX1NDQUxFKQpAQCAtMTA5OCw3ICsxMDk4LDcgQEAKIH0KIAogaW50IGludGVsX292ZXJsYXlfcHV0X2ltYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X3B1dF9pbWFnZSAqcHV0X2ltYWdlX3JlYyA9IGRhdGE7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMzAxLDEwICsxMzAxLDEwIEBACiB9CiAKIGludCBpbnRlbF9vdmVybGF5X2F0dHJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1faW50ZWxfb3ZlcmxheV9hdHRycyAqYXR0cnMgPSBkYXRhOwotICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKIAlzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3M7CiAJaW50IHJldDsKQEAgLTEzOTMsNyArMTM5Myw3IEBACiAKIHZvaWQgaW50ZWxfc2V0dXBfb3ZlcmxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqcmVnX2JvOwogCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVnczsKQEAgLTE0MjEsMjQgKzE0MjEsMjQgQEAKIAkJcmV0ID0gaTkxNV9nZW1fYXR0YWNoX3BoeXNfb2JqZWN0KGRldiwgcmVnX2JvLAogCQkJCQkJICBJOTE1X0dFTV9QSFlTX09WRVJMQVlfUkVHUywKIAkJCQkJCSAgUEFHRV9TSVpFKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBhdHRhY2ggcGh5cyBvdmVybGF5IHJlZ3NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfZnJlZV9ibzsKLSAgICAgICAgICAgICAgICB9CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGF0dGFjaCBwaHlzIG92ZXJsYXkgcmVnc1xuIik7CisJCQlnb3RvIG91dF9mcmVlX2JvOworCQl9CiAJCW92ZXJsYXktPmZsaXBfYWRkciA9IHJlZ19iby0+cGh5c19vYmotPmhhbmRsZS0+YnVzYWRkcjsKIAl9IGVsc2UgewogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKHJlZ19ibywgUEFHRV9TSVpFLCB0cnVlKTsKIAkJaWYgKHJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIG92ZXJsYXkgcmVnaXN0ZXIgYm9cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfZnJlZV9ibzsKLSAgICAgICAgICAgICAgICB9CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gb3ZlcmxheSByZWdpc3RlciBib1xuIik7CisJCQlnb3RvIG91dF9mcmVlX2JvOworCQl9CiAJCW92ZXJsYXktPmZsaXBfYWRkciA9IHJlZ19iby0+Z3R0X29mZnNldDsKIAogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ocmVnX2JvLCB0cnVlKTsKIAkJaWYgKHJldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gbW92ZSBvdmVybGF5IHJlZ2lzdGVyIGJvIGludG8gdGhlIEdUVFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dF91bnBpbl9ibzsKLSAgICAgICAgICAgICAgICB9CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtb3ZlIG92ZXJsYXkgcmVnaXN0ZXIgYm8gaW50byB0aGUgR1RUXG4iKTsKKwkJCWdvdG8gb3V0X3VucGluX2JvOworCQl9CiAJfQogCiAJLyogaW5pdCBhbGwgdmFsdWVzICovCkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogc3RydWN0IGludGVsX292ZXJsYXlfZXJyb3Jfc3RhdGUgKgogaW50ZWxfb3ZlcmxheV9jYXB0dXJlX2Vycm9yX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5ID0gZGV2X3ByaXYtPm92ZXJsYXk7CiAJc3RydWN0IGludGVsX292ZXJsYXlfZXJyb3Jfc3RhdGUgKmVycm9yOwogCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyBfX2lvbWVtICpyZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKaW5kZXggYTllMGM3Yi4uNDk5ZDRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCkBAIC04NCw3ICs4NCw3IEBACiAJCQlpZiAoc2NhbGVkX3dpZHRoID4gc2NhbGVkX2hlaWdodCkgeyAvKiBwaWxsYXIgKi8KIAkJCQl3aWR0aCA9IHNjYWxlZF9oZWlnaHQgLyBtb2RlLT52ZGlzcGxheTsKIAkJCQlpZiAod2lkdGggJiAxKQotCQkJCSAgICAJd2lkdGgrKzsKKwkJCQkJd2lkdGgrKzsKIAkJCQl4ID0gKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5IC0gd2lkdGggKyAxKSAvIDI7CiAJCQkJeSA9IDA7CiAJCQkJaGVpZ2h0ID0gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CkBAIC0yMDYsNyArMjA2LDcgQEAKIAkJaWYgKElTX1BJTkVWSUVXKGRldikpCiAJCQl2YWwgPj49IDE7CiAKLQkJaWYgKGlzX2JhY2tsaWdodF9jb21iaW5hdGlvbl9tb2RlKGRldikpeworCQlpZiAoaXNfYmFja2xpZ2h0X2NvbWJpbmF0aW9uX21vZGUoZGV2KSkgewogCQkJdTggbGJwYzsKIAogCQkJdmFsICY9IH4xOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwsIHZhbCB8IGxldmVsKTsKIH0KIAotdm9pZCBpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3N0YXRpYyB2b2lkIGludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHRtcDsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCWlmIChIQVNfUENIX1NQTElUKGRldikpCiAJCXJldHVybiBpbnRlbF9wY2hfcGFuZWxfc2V0X2JhY2tsaWdodChkZXYsIGxldmVsKTsKIAotCWlmIChpc19iYWNrbGlnaHRfY29tYmluYXRpb25fbW9kZShkZXYpKXsKKwlpZiAoaXNfYmFja2xpZ2h0X2NvbWJpbmF0aW9uX21vZGUoZGV2KSkgewogCQl1MzIgbWF4ID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2KTsKIAkJdTggbGJwYzsKIApAQCAtMjU0LDE2ICsyNTQsMjEgQEAKIAlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCB0bXAgfCBsZXZlbCk7CiB9CiAKK3ZvaWQgaW50ZWxfcGFuZWxfc2V0X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwgPSBsZXZlbDsKKwlpZiAoZGV2X3ByaXYtPmJhY2tsaWdodF9lbmFibGVkKQorCQlpbnRlbF9wYW5lbF9hY3R1YWxseV9zZXRfYmFja2xpZ2h0KGRldiwgbGV2ZWwpOworfQorCiB2b2lkIGludGVsX3BhbmVsX2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQpIHsKLQkJZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGludGVsX3BhbmVsX2dldF9iYWNrbGlnaHQoZGV2KTsKLQkJZGV2X3ByaXYtPmJhY2tsaWdodF9lbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JaW50ZWxfcGFuZWxfc2V0X2JhY2tsaWdodChkZXYsIDApOworCWRldl9wcml2LT5iYWNrbGlnaHRfZW5hYmxlZCA9IGZhbHNlOworCWludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoZGV2LCAwKTsKIH0KIAogdm9pZCBpbnRlbF9wYW5lbF9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0yNzMsOCArMjc4LDggQEAKIAlpZiAoZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9PSAwKQogCQlkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsID0gaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoZGV2KTsKIAotCWludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoZGV2LCBkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsKTsKIAlkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQgPSB0cnVlOworCWludGVsX3BhbmVsX2FjdHVhbGx5X3NldF9iYWNrbGlnaHQoZGV2LCBkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfcGFuZWxfaW5pdF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYwppbmRleCBjMzA2MjZlLi5jYTcwZTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCkBAIC0zNCw2ICszNCwxNiBAQAogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKIAorLyoKKyAqIDk2NSsgc3VwcG9ydCBQSVBFX0NPTlRST0wgY29tbWFuZHMsIHdoaWNoIHByb3ZpZGUgZmluZXIgZ3JhaW5lZCBjb250cm9sCisgKiBvdmVyIGNhY2hlIGZsdXNoaW5nLgorICovCitzdHJ1Y3QgcGlwZV9jb250cm9sIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXZvbGF0aWxlIHUzMiAqY3B1X3BhZ2U7CisJdTMyIGd0dF9vZmZzZXQ7Cit9OworCiBzdGF0aWMgaW5saW5lIGludCByaW5nX3NwYWNlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKIAlpbnQgc3BhY2UgPSAocmluZy0+aGVhZCAmIEhFQURfQUREUikgLSAocmluZy0+dGFpbCArIDgpOwpAQCAtMTIzLDYgKzEzMywxMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBFbWl0cyBhIFBJUEVfQ09OVFJPTCB3aXRoIGEgbm9uLXplcm8gcG9zdC1zeW5jIG9wZXJhdGlvbiwgZm9yCisgKiBpbXBsZW1lbnRpbmcgdHdvIHdvcmthcm91bmRzIG9uIGdlbjYuICBGcm9tIHNlY3Rpb24gMS40LjcuMQorICogIlBJUEVfQ09OVFJPTCIgb2YgdGhlIFNhbmR5IEJyaWRnZSBQUk0gdm9sdW1lIDIgcGFydCAxOgorICoKKyAqIFtEZXZTTkItQyt7Vy9BfV0gQmVmb3JlIGFueSBkZXB0aCBzdGFsbCBmbHVzaCAoaW5jbHVkaW5nIHRob3NlCisgKiBwcm9kdWNlZCBieSBub24tcGlwZWxpbmVkIHN0YXRlIGNvbW1hbmRzKSwgc29mdHdhcmUgbmVlZHMgdG8gZmlyc3QKKyAqIHNlbmQgYSBQSVBFX0NPTlRST0wgd2l0aCBubyBiaXRzIHNldCBleGNlcHQgUG9zdC1TeW5jIE9wZXJhdGlvbiAhPQorICogMC4KKyAqCisgKiBbRGV2LVNOQntXL0F9XTogQmVmb3JlIGEgUElQRV9DT05UUk9MIHdpdGggV3JpdGUgQ2FjaGUgRmx1c2ggRW5hYmxlCisgKiA9MSwgYSBQSVBFX0NPTlRST0wgd2l0aCBhbnkgbm9uLXplcm8gcG9zdC1zeW5jLW9wIGlzIHJlcXVpcmVkLgorICoKKyAqIEFuZCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlc2UgdHdvIHJlcXVpcmVzIHRoaXMgd29ya2Fyb3VuZCBmaXJzdDoKKyAqCisgKiBbRGV2LVNOQntXL0F9XTogUGlwZS1jb250cm9sIHdpdGggQ1Mtc3RhbGwgYml0IHNldCBtdXN0IGJlIHNlbnQKKyAqIEJFRk9SRSB0aGUgcGlwZS1jb250cm9sIHdpdGggYSBwb3N0LXN5bmMgb3AgYW5kIG5vIHdyaXRlLWNhY2hlCisgKiBmbHVzaGVzLgorICoKKyAqIEFuZCB0aGlzIGxhc3Qgd29ya2Fyb3VuZCBpcyB0cmlja3kgYmVjYXVzZSBvZiB0aGUgcmVxdWlyZW1lbnRzIG9uCisgKiB0aGF0IGJpdC4gIEZyb20gc2VjdGlvbiAxLjQuNy4yLjMgIlN0YWxsIiBvZiB0aGUgU2FuZHkgQnJpZGdlIFBSTQorICogdm9sdW1lIDIgcGFydCAxOgorICoKKyAqICAgICAiMSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYWxzbyBiZSBzZXQ6CisgKiAgICAgIC0gUmVuZGVyIFRhcmdldCBDYWNoZSBGbHVzaCBFbmFibGUgKFsxMl0gb2YgRFcxKQorICogICAgICAtIERlcHRoIENhY2hlIEZsdXNoIEVuYWJsZSAoWzBdIG9mIERXMSkKKyAqICAgICAgLSBTdGFsbCBhdCBQaXhlbCBTY29yZWJvYXJkIChbMV0gb2YgRFcxKQorICogICAgICAtIERlcHRoIFN0YWxsIChbMTNdIG9mIERXMSkKKyAqICAgICAgLSBQb3N0LVN5bmMgT3BlcmF0aW9uIChbMTNdIG9mIERXMSkKKyAqICAgICAgLSBOb3RpZnkgRW5hYmxlIChbOF0gb2YgRFcxKSIKKyAqCisgKiBUaGUgY2FjaGUgZmx1c2hlcyByZXF1aXJlIHRoZSB3b3JrYXJvdW5kIGZsdXNoIHRoYXQgdHJpZ2dlcmVkIHRoaXMKKyAqIG9uZSwgc28gd2UgY2FuJ3QgdXNlIGl0LiAgRGVwdGggc3RhbGwgd291bGQgdHJpZ2dlciB0aGUgc2FtZS4KKyAqIFBvc3Qtc3luYyBub256ZXJvIGlzIHdoYXQgdHJpZ2dlcmVkIHRoaXMgc2Vjb25kIHdvcmthcm91bmQsIHNvIHdlCisgKiBjYW4ndCB1c2UgdGhhdCBvbmUgZWl0aGVyLiAgTm90aWZ5IGVuYWJsZSBpcyBJUlFzLCB3aGljaCBhcmVuJ3QKKyAqIHJlYWxseSBvdXIgYnVzaW5lc3MuICBUaGF0IGxlYXZlcyBvbmx5IHN0YWxsIGF0IHNjb3JlYm9hcmQuCisgKi8KK3N0YXRpYyBpbnQKK2ludGVsX2VtaXRfcG9zdF9zeW5jX25vbnplcm9fZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjID0gcmluZy0+cHJpdmF0ZTsKKwl1MzIgc2NyYXRjaF9hZGRyID0gcGMtPmd0dF9vZmZzZXQgKyAxMjg7CisJaW50IHJldDsKKworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0woNSkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBQSVBFX0NPTlRST0xfQ1NfU1RBTEwgfAorCQkJUElQRV9DT05UUk9MX1NUQUxMX0FUX1NDT1JFQk9BUkQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzY3JhdGNoX2FkZHIgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7IC8qIGFkZHJlc3MgKi8KKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7IC8qIGxvdyBkd29yZCAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsgLyogaGlnaCBkd29yZCAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCg1KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIFBJUEVfQ09OVFJPTF9RV19XUklURSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNjcmF0Y2hfYWRkciB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsgLyogYWRkcmVzcyAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZW42X3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgaW52YWxpZGF0ZV9kb21haW5zLCB1MzIgZmx1c2hfZG9tYWlucykKK3sKKwl1MzIgZmxhZ3MgPSAwOworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjID0gcmluZy0+cHJpdmF0ZTsKKwl1MzIgc2NyYXRjaF9hZGRyID0gcGMtPmd0dF9vZmZzZXQgKyAxMjg7CisJaW50IHJldDsKKworCS8qIEZvcmNlIFNOQiB3b3JrYXJvdW5kcyBmb3IgUElQRV9DT05UUk9MIGZsdXNoZXMgKi8KKwlpbnRlbF9lbWl0X3Bvc3Rfc3luY19ub256ZXJvX2ZsdXNoKHJpbmcpOworCisJLyogSnVzdCBmbHVzaCBldmVyeXRoaW5nLiAgRXhwZXJpbWVudHMgaGF2ZSBzaG93biB0aGF0IHJlZHVjaW5nIHRoZQorCSAqIG51bWJlciBvZiBiaXRzIGJhc2VkIG9uIHRoZSB3cml0ZSBkb21haW5zIGhhcyBsaXR0bGUgcGVyZm9ybWFuY2UKKwkgKiBpbXBhY3QuCisJICovCisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX1JFTkRFUl9UQVJHRVRfQ0FDSEVfRkxVU0g7CisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX0lOU1RSVUNUSU9OX0NBQ0hFX0lOVkFMSURBVEU7CisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX1RFWFRVUkVfQ0FDSEVfSU5WQUxJREFURTsKKwlmbGFncyB8PSBQSVBFX0NPTlRST0xfREVQVEhfQ0FDSEVfRkxVU0g7CisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX1ZGX0NBQ0hFX0lOVkFMSURBVEU7CisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX0NPTlNUX0NBQ0hFX0lOVkFMSURBVEU7CisJZmxhZ3MgfD0gUElQRV9DT05UUk9MX1NUQVRFX0NBQ0hFX0lOVkFMSURBVEU7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCg1KSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIGZsYWdzKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2NyYXRjaF9hZGRyIHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsgLyogbG93ZXIgZHdvcmQgKi8KKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7IC8qIHVwcHdlciBkd29yZCAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcmluZ193cml0ZV90YWlsKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCSAgICB1MzIgdmFsdWUpCiB7CkBAIC0yMDYsMTYgKzMyOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiA5NjUrIHN1cHBvcnQgUElQRV9DT05UUk9MIGNvbW1hbmRzLCB3aGljaCBwcm92aWRlIGZpbmVyIGdyYWluZWQgY29udHJvbAotICogb3ZlciBjYWNoZSBmbHVzaGluZy4KLSAqLwotc3RydWN0IHBpcGVfY29udHJvbCB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQl2b2xhdGlsZSB1MzIgKmNwdV9wYWdlOwotCXUzMiBndHRfb2Zmc2V0OwotfTsKLQogc3RhdGljIGludAogaW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewpAQCAtMjk2LDggKzQwOCw3IEBACiAJCQkJICAgR0ZYX01PREVfRU5BQkxFKEdGWF9SRVBMQVlfTU9ERSkpOwogCX0KIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7Ci0JfSBlbHNlIGlmIChJU19HRU41KGRldikpIHsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSkgewogCQlyZXQgPSBpbml0X3BpcGVfY29udHJvbChyaW5nKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0zMTUsODMgKzQyNiwxMzEgQEAKIH0KIAogc3RhdGljIHZvaWQKLXVwZGF0ZV9zZW1hcGhvcmUoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgaSwgdTMyIHNlcW5vKQordXBkYXRlX21ib3hlcyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJICAgIHUzMiBzZXFubywKKwkgICAgdTMyIG1taW9fb2Zmc2V0KQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgaWQ7Ci0KLQkvKgotCSAqIGNzIC0+IDEgPSB2Y3MsIDAgPSBiY3MKLQkgKiB2Y3MgLT4gMSA9IGJjcywgMCA9IGNzLAotCSAqIGJjcyAtPiAxID0gY3MsIDAgPSB2Y3MuCi0JICovCi0JaWQgPSByaW5nIC0gZGV2X3ByaXYtPnJpbmc7Ci0JaWQgKz0gMiAtIGk7Ci0JaWQgJT0gMzsKLQotCWludGVsX3JpbmdfZW1pdChyaW5nLAotCQkJTUlfU0VNQVBIT1JFX01CT1ggfAotCQkJTUlfU0VNQVBIT1JFX1JFR0lTVEVSIHwKLQkJCU1JX1NFTUFQSE9SRV9VUERBVEUpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TRU1BUEhPUkVfTUJPWCB8CisJCQkgICAgICBNSV9TRU1BUEhPUkVfR0xPQkFMX0dUVCB8CisJCQkgICAgICBNSV9TRU1BUEhPUkVfUkVHSVNURVIgfAorCQkJICAgICAgTUlfU0VNQVBIT1JFX1VQREFURSk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywKLQkJCVJJTkdfU1lOQ18wKGRldl9wcml2LT5yaW5nW2lkXS5tbWlvX2Jhc2UpICsgNCppKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgbW1pb19vZmZzZXQpOwogfQogCisvKioKKyAqIGdlbjZfYWRkX3JlcXVlc3QgLSBVcGRhdGUgdGhlIHNlbWFwaG9yZSBtYWlsYm94IHJlZ2lzdGVycworICogCisgKiBAcmluZyAtIHJpbmcgdGhhdCBpcyBhZGRpbmcgYSByZXF1ZXN0CisgKiBAc2Vxbm8gLSByZXR1cm4gc2Vxbm8gc3R1Y2sgaW50byB0aGUgcmluZworICoKKyAqIFVwZGF0ZSB0aGUgbWFpbGJveCByZWdpc3RlcnMgaW4gdGhlICpvdGhlciogcmluZ3Mgd2l0aCB0aGUgY3VycmVudCBzZXFuby4KKyAqIFRoaXMgYWN0cyBsaWtlIGEgc2lnbmFsIGluIHRoZSBjYW5vbmljYWwgc2VtYXBob3JlLgorICovCiBzdGF0aWMgaW50CiBnZW42X2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJIHUzMiAqcmVzdWx0KQorCQkgdTMyICpzZXFubykKIHsKLQl1MzIgc2Vxbm87CisJdTMyIG1ib3gxX3JlZzsKKwl1MzIgbWJveDJfcmVnOwogCWludCByZXQ7CiAKIAlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDEwKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8ocmluZy0+ZGV2KTsKLQl1cGRhdGVfc2VtYXBob3JlKHJpbmcsIDAsIHNlcW5vKTsKLQl1cGRhdGVfc2VtYXBob3JlKHJpbmcsIDEsIHNlcW5vKTsKKwltYm94MV9yZWcgPSByaW5nLT5zaWduYWxfbWJveFswXTsKKwltYm94Ml9yZWcgPSByaW5nLT5zaWduYWxfbWJveFsxXTsKIAorCSpzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhyaW5nLT5kZXYpOworCisJdXBkYXRlX21ib3hlcyhyaW5nLCAqc2Vxbm8sIG1ib3gxX3JlZyk7CisJdXBkYXRlX21ib3hlcyhyaW5nLCAqc2Vxbm8sIG1ib3gyX3JlZyk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAqc2Vxbm8pOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9VU0VSX0lOVEVSUlVQVCk7CiAJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCi0JKnJlc3VsdCA9IHNlcW5vOwogCXJldHVybiAwOwogfQogCi1pbnQKLWludGVsX3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqdG8sCisvKioKKyAqIGludGVsX3Jpbmdfc3luYyAtIHN5bmMgdGhlIHdhaXRlciB0byB0aGUgc2lnbmFsbGVyIG9uIHNlcW5vCisgKgorICogQHdhaXRlciAtIHJpbmcgdGhhdCBpcyB3YWl0aW5nCisgKiBAc2lnbmFsbGVyIC0gcmluZyB3aGljaCBoYXMsIG9yIHdpbGwgc2lnbmFsCisgKiBAc2Vxbm8gLSBzZXFubyB3aGljaCB0aGUgd2FpdGVyIHdpbGwgYmxvY2sgb24KKyAqLworc3RhdGljIGludAoraW50ZWxfcmluZ19zeW5jKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqd2FpdGVyLAorCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnNpZ25hbGxlciwKKwkJaW50IHJpbmcsCiAJCXUzMiBzZXFubykKIHsKIAlpbnQgcmV0OworCXUzMiBkdzEgPSBNSV9TRU1BUEhPUkVfTUJPWCB8CisJCSAgTUlfU0VNQVBIT1JFX0NPTVBBUkUgfAorCQkgIE1JX1NFTUFQSE9SRV9SRUdJU1RFUjsKIAotCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbih3YWl0ZXIsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpbnRlbF9yaW5nX2VtaXQocmluZywKLQkJCU1JX1NFTUFQSE9SRV9NQk9YIHwKLQkJCU1JX1NFTUFQSE9SRV9SRUdJU1RFUiB8Ci0JCQlpbnRlbF9yaW5nX3N5bmNfaW5kZXgocmluZywgdG8pIDw8IDE3IHwKLQkJCU1JX1NFTUFQSE9SRV9DT01QQVJFKTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTk9PUCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCWludGVsX3JpbmdfZW1pdCh3YWl0ZXIsIGR3MSB8IHNpZ25hbGxlci0+c2VtYXBob3JlX3JlZ2lzdGVyW3JpbmddKTsKKwlpbnRlbF9yaW5nX2VtaXQod2FpdGVyLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgMCk7CisJaW50ZWxfcmluZ19lbWl0KHdhaXRlciwgTUlfTk9PUCk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHdhaXRlcik7CiAKIAlyZXR1cm4gMDsKIH0KIAorLyogVkNTLT5SQ1MgKFJWU1lOQykgb3IgQkNTLT5SQ1MgKFJCU1lOQykgKi8KK2ludAorcmVuZGVyX3Jpbmdfc3luY190byhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKndhaXRlciwKKwkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqc2lnbmFsbGVyLAorCQkgICAgdTMyIHNlcW5vKQoreworCVdBUk5fT04oc2lnbmFsbGVyLT5zZW1hcGhvcmVfcmVnaXN0ZXJbUkNTXSA9PSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEKTsKKwlyZXR1cm4gaW50ZWxfcmluZ19zeW5jKHdhaXRlciwKKwkJCSAgICAgICBzaWduYWxsZXIsCisJCQkgICAgICAgUkNTLAorCQkJICAgICAgIHNlcW5vKTsKK30KKworLyogUkNTLT5WQ1MgKFZSU1lOQykgb3IgQkNTLT5WQ1MgKFZCU1lOQykgKi8KK2ludAorZ2VuNl9ic2RfcmluZ19zeW5jX3RvKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqd2FpdGVyLAorCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnNpZ25hbGxlciwKKwkJICAgICAgdTMyIHNlcW5vKQoreworCVdBUk5fT04oc2lnbmFsbGVyLT5zZW1hcGhvcmVfcmVnaXN0ZXJbVkNTXSA9PSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEKTsKKwlyZXR1cm4gaW50ZWxfcmluZ19zeW5jKHdhaXRlciwKKwkJCSAgICAgICBzaWduYWxsZXIsCisJCQkgICAgICAgVkNTLAorCQkJICAgICAgIHNlcW5vKTsKK30KKworLyogUkNTLT5CQ1MgKEJSU1lOQykgb3IgVkNTLT5CQ1MgKEJWU1lOQykgKi8KK2ludAorZ2VuNl9ibHRfcmluZ19zeW5jX3RvKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqd2FpdGVyLAorCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnNpZ25hbGxlciwKKwkJICAgICAgdTMyIHNlcW5vKQoreworCVdBUk5fT04oc2lnbmFsbGVyLT5zZW1hcGhvcmVfcmVnaXN0ZXJbQkNTXSA9PSBNSV9TRU1BUEhPUkVfU1lOQ19JTlZBTElEKTsKKwlyZXR1cm4gaW50ZWxfcmluZ19zeW5jKHdhaXRlciwKKwkJCSAgICAgICBzaWduYWxsZXIsCisJCQkgICAgICAgQkNTLAorCQkJICAgICAgIHNlcW5vKTsKK30KKworCisKICNkZWZpbmUgUElQRV9DT05UUk9MX0ZMVVNIKHJpbmdfXywgYWRkcl9fKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCBHRlhfT1BfUElQRV9DT05UUk9MIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwJCVwKLQkJIFBJUEVfQ09OVFJPTF9ERVBUSF9TVEFMTCB8IDIpOwkJCQlcCisJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgR0ZYX09QX1BJUEVfQ09OVFJPTCg0KSB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CQlcCisJCSBQSVBFX0NPTlRST0xfREVQVEhfU1RBTEwpOwkJCQlcCiAJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgKGFkZHJfXykgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CQkJXAogCWludGVsX3JpbmdfZW1pdChyaW5nX18sIDApOwkJCQkJCQlcCiAJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgMCk7CQkJCQkJCVwKQEAgLTQxOSw4ICs1NzgsOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8Ci0JCQlQSVBFX0NPTlRST0xfV0NfRkxVU0ggfCBQSVBFX0NPTlRST0xfVENfRkxVU0gpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MKDQpIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKKwkJCVBJUEVfQ09OVFJPTF9XUklURV9GTFVTSCB8CisJCQlQSVBFX0NPTlRST0xfVEVYVFVSRV9DQUNIRV9JTlZBTElEQVRFKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgcGMtPmd0dF9vZmZzZXQgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKIAlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CkBAIC00MzUsOCArNTk1LDkgQEAKIAlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKIAlzY3JhdGNoX2FkZHIgKz0gMTI4OwogCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOwotCWludGVsX3JpbmdfZW1pdChyaW5nLCBHRlhfT1BfUElQRV9DT05UUk9MIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKLQkJCVBJUEVfQ09OVFJPTF9XQ19GTFVTSCB8IFBJUEVfQ09OVFJPTF9UQ19GTFVTSCB8CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0woNCkgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAorCQkJUElQRV9DT05UUk9MX1dSSVRFX0ZMVVNIIHwKKwkJCVBJUEVfQ09OVFJPTF9URVhUVVJFX0NBQ0hFX0lOVkFMSURBVEUgfAogCQkJUElQRV9DT05UUk9MX05PVElGWSk7CiAJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHBjLT5ndHRfb2Zmc2V0IHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOwogCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CkBAIC0xMDI2LDcgKzExODcsMTIgQEAKIAkuaXJxX2dldAkJPSByZW5kZXJfcmluZ19nZXRfaXJxLAogCS5pcnFfcHV0CQk9IHJlbmRlcl9yaW5nX3B1dF9pcnEsCiAJLmRpc3BhdGNoX2V4ZWNidWZmZXIJPSByZW5kZXJfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAotICAgICAgIC5jbGVhbnVwCQkJPSByZW5kZXJfcmluZ19jbGVhbnVwLAorCS5jbGVhbnVwCQk9IHJlbmRlcl9yaW5nX2NsZWFudXAsCisJLnN5bmNfdG8JCT0gcmVuZGVyX3Jpbmdfc3luY190bywKKwkuc2VtYXBob3JlX3JlZ2lzdGVyCT0ge01JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfUlYsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfUkJ9LAorCS5zaWduYWxfbWJveAkJPSB7R0VONl9WUlNZTkMsIEdFTjZfQlJTWU5DfSwKIH07CiAKIC8qIHJpbmcgYnVmZmVyIGZvciBiaXQtc3RyZWFtIGRlY29kZXIgKi8KQEAgLTEwNTAsMjMgKzEyMTYsMjMgQEAKIHN0YXRpYyB2b2lkIGdlbjZfYnNkX3Jpbmdfd3JpdGVfdGFpbChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJICAgICB1MzIgdmFsdWUpCiB7Ci0gICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAKICAgICAgICAvKiBFdmVyeSB0YWlsIG1vdmUgbXVzdCBmb2xsb3cgdGhlIHNlcXVlbmNlIGJlbG93ICovCi0gICAgICAgSTkxNV9XUklURShHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wsCi0JICAgICAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfTU9ESUZZX01BU0sgfAotCSAgICAgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfUkNfSUxETF9NRVNTQUdFX0RJU0FCTEUpOwotICAgICAgIEk5MTVfV1JJVEUoR0VONl9CU0RfUk5DSUQsIDB4MCk7CisJSTkxNV9XUklURShHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wsCisJCUdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfTU9ESUZZX01BU0sgfAorCQlHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfUkNfSUxETF9NRVNTQUdFX0RJU0FCTEUpOworCUk5MTVfV1JJVEUoR0VONl9CU0RfUk5DSUQsIDB4MCk7CiAKLSAgICAgICBpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wpICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfSURMRV9JTkRJQ0FUT1IpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgIDUwKSkKLSAgICAgICAgICAgICAgIERSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIElETEUgSW5kaWNhdG9yXG4iKTsKKwlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wpICYKKwkJR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX0lETEVfSU5ESUNBVE9SKSA9PSAwLAorCQk1MCkpCisJRFJNX0VSUk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgSURMRSBJbmRpY2F0b3JcbiIpOwogCi0gICAgICAgSTkxNV9XUklURV9UQUlMKHJpbmcsIHZhbHVlKTsKLSAgICAgICBJOTE1X1dSSVRFKEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTCwKLQkgICAgICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9NT0RJRllfTUFTSyB8Ci0JICAgICAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfRU5BQkxFKTsKKwlJOTE1X1dSSVRFX1RBSUwocmluZywgdmFsdWUpOworCUk5MTVfV1JJVEUoR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MLAorCQlHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfUkNfSUxETF9NRVNTQUdFX01PRElGWV9NQVNLIHwKKwkJR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9FTkFCTEUpOwogfQogCiBzdGF0aWMgaW50IGdlbjZfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCkBAIC0xMDk0LDE4ICsxMjYwLDE4IEBACiBnZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkgICAgICB1MzIgb2Zmc2V0LCB1MzIgbGVuKQogewotICAgICAgIGludCByZXQ7CisJaW50IHJldDsKIAotICAgICAgIHJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgMik7Ci0gICAgICAgaWYgKHJldCkKLQkgICAgICAgcmV0dXJuIHJldDsKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRV9JOTY1KTsKLSAgICAgICAvKiBiaXQwLTcgaXMgdGhlIGxlbmd0aCBvbiBHRU42KyAqLwotICAgICAgIGludGVsX3JpbmdfZW1pdChyaW5nLCBvZmZzZXQpOwotICAgICAgIGludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRV9JOTY1KTsKKwkvKiBiaXQwLTcgaXMgdGhlIGxlbmd0aCBvbiBHRU42KyAqLworCWludGVsX3JpbmdfZW1pdChyaW5nLCBvZmZzZXQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKIAotICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgYm9vbApAQCAtMTE1NCw2ICsxMzIwLDExIEBACiAJLmlycV9nZXQJCT0gZ2VuNl9ic2RfcmluZ19nZXRfaXJxLAogCS5pcnFfcHV0CQk9IGdlbjZfYnNkX3JpbmdfcHV0X2lycSwKIAkuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAorCS5zeW5jX3RvCQk9IGdlbjZfYnNkX3Jpbmdfc3luY190bywKKwkuc2VtYXBob3JlX3JlZ2lzdGVyCT0ge01JX1NFTUFQSE9SRV9TWU5DX1ZSLAorCQkJCSAgIE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUQsCisJCQkJICAgTUlfU0VNQVBIT1JFX1NZTkNfVkJ9LAorCS5zaWduYWxfbWJveAkJPSB7R0VONl9SVlNZTkMsIEdFTjZfQlZTWU5DfSwKIH07CiAKIC8qIEJsaXR0ZXIgc3VwcG9ydCAoU2FuZHlCcmlkZ2UrKSAqLwpAQCAtMTI3MiwxOSArMTQ0MywyNCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIGdlbjZfYmx0X3JpbmcgPSB7Ci0gICAgICAgLm5hbWUJCQk9ICJibHQgcmluZyIsCi0gICAgICAgLmlkCQkJPSBSSU5HX0JMVCwKLSAgICAgICAubW1pb19iYXNlCQk9IEJMVF9SSU5HX0JBU0UsCi0gICAgICAgLnNpemUJCQk9IDMyICogUEFHRV9TSVpFLAotICAgICAgIC5pbml0CQkJPSBibHRfcmluZ19pbml0LAotICAgICAgIC53cml0ZV90YWlsCQk9IHJpbmdfd3JpdGVfdGFpbCwKLSAgICAgICAuZmx1c2gJCQk9IGJsdF9yaW5nX2ZsdXNoLAotICAgICAgIC5hZGRfcmVxdWVzdAkJPSBnZW42X2FkZF9yZXF1ZXN0LAotICAgICAgIC5nZXRfc2Vxbm8JCT0gcmluZ19nZXRfc2Vxbm8sCi0gICAgICAgLmlycV9nZXQJCQk9IGJsdF9yaW5nX2dldF9pcnEsCi0gICAgICAgLmlycV9wdXQJCQk9IGJsdF9yaW5nX3B1dF9pcnEsCi0gICAgICAgLmRpc3BhdGNoX2V4ZWNidWZmZXIJPSBnZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlciwKLSAgICAgICAuY2xlYW51cAkJCT0gYmx0X3JpbmdfY2xlYW51cCwKKwkubmFtZQkJCT0gImJsdCByaW5nIiwKKwkuaWQJCQk9IFJJTkdfQkxULAorCS5tbWlvX2Jhc2UJCT0gQkxUX1JJTkdfQkFTRSwKKwkuc2l6ZQkJCT0gMzIgKiBQQUdFX1NJWkUsCisJLmluaXQJCQk9IGJsdF9yaW5nX2luaXQsCisJLndyaXRlX3RhaWwJCT0gcmluZ193cml0ZV90YWlsLAorCS5mbHVzaAkJCT0gYmx0X3JpbmdfZmx1c2gsCisJLmFkZF9yZXF1ZXN0CQk9IGdlbjZfYWRkX3JlcXVlc3QsCisJLmdldF9zZXFubwkJPSByaW5nX2dldF9zZXFubywKKwkuaXJxX2dldAkJPSBibHRfcmluZ19nZXRfaXJxLAorCS5pcnFfcHV0CQk9IGJsdF9yaW5nX3B1dF9pcnEsCisJLmRpc3BhdGNoX2V4ZWNidWZmZXIJPSBnZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlciwKKwkuY2xlYW51cAkJPSBibHRfcmluZ19jbGVhbnVwLAorCS5zeW5jX3RvCQk9IGdlbjZfYmx0X3Jpbmdfc3luY190bywKKwkuc2VtYXBob3JlX3JlZ2lzdGVyCT0ge01JX1NFTUFQSE9SRV9TWU5DX0JSLAorCQkJCSAgIE1JX1NFTUFQSE9SRV9TWU5DX0JWLAorCQkJCSAgIE1JX1NFTUFQSE9SRV9TWU5DX0lOVkFMSUR9LAorCS5zaWduYWxfbWJveAkJPSB7R0VONl9SQlNZTkMsIEdFTjZfVkJTWU5DfSwKIH07CiAKIGludCBpbnRlbF9pbml0X3JlbmRlcl9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTI5NSw2ICsxNDcxLDcgQEAKIAkqcmluZyA9IHJlbmRlcl9yaW5nOwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CiAJCXJpbmctPmFkZF9yZXF1ZXN0ID0gZ2VuNl9hZGRfcmVxdWVzdDsKKwkJcmluZy0+Zmx1c2ggPSBnZW42X3JlbmRlcl9yaW5nX2ZsdXNoOwogCQlyaW5nLT5pcnFfZ2V0ID0gZ2VuNl9yZW5kZXJfcmluZ19nZXRfaXJxOwogCQlyaW5nLT5pcnFfcHV0ID0gZ2VuNl9yZW5kZXJfcmluZ19wdXRfaXJxOwogCX0gZWxzZSBpZiAoSVNfR0VONShkZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKaW5kZXggMzlhYzJiNi4uNjgyODFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaApAQCAtMiwxMCArMiwxMCBAQAogI2RlZmluZSBfSU5URUxfUklOR0JVRkZFUl9IXwogCiBlbnVtIHsKLSAgICBSQ1MgPSAweDAsCi0gICAgVkNTLAotICAgIEJDUywKLSAgICBJOTE1X05VTV9SSU5HUywKKwlSQ1MgPSAweDAsCisJVkNTLAorCUJDUywKKwlJOTE1X05VTV9SSU5HUywKIH07CiAKIHN0cnVjdCAgaW50ZWxfaHdfc3RhdHVzX3BhZ2UgewpAQCAtNzUsNyArNzUsMTIgQEAKIAlpbnQJCSgqZGlzcGF0Y2hfZXhlY2J1ZmZlcikoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAogCQkJCQkgICAgICAgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCk7CiAJdm9pZAkJKCpjbGVhbnVwKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCWludAkJKCpzeW5jX3RvKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp0bywKKwkJCQkgICB1MzIgc2Vxbm8pOwogCisJdTMyCQlzZW1hcGhvcmVfcmVnaXN0ZXJbM107IC8qb3VyIG1ib3ggd3JpdHRlbiBieSBvdGhlcnMgKi8KKwl1MzIJCXNpZ25hbF9tYm94WzJdOyAvKiBtYm94ZXMgdGhpcyByaW5nIHNpZ25hbHMgdG8gKi8KIAkvKioKIAkgKiBMaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGludm9sdmVkIGluIHJlbmRlcmluZyBmcm9tIHRoZQogCSAqIHJpbmdidWZmZXIuCkBAIC0xODAsOSArMTg1LDYgQEAKIHZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CiAKIHUzMiBpbnRlbF9yaW5nX2dldF9zZXFubyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotaW50IGludGVsX3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAotCQkgICAgdTMyIHNlcW5vKTsKIAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IDYzNDhjNDkuLjMwMDNmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAiZHJtX2NydGMuaCIKQEAgLTQzLDcgKzQ0LDcgQEAKICNkZWZpbmUgU0RWT19UVl9NQVNLICAgKFNEVk9fT1VUUFVUX0NWQlMwIHwgU0RWT19PVVRQVVRfU1ZJRDApCiAKICNkZWZpbmUgU0RWT19PVVRQVVRfTUFTSyAoU0RWT19UTURTX01BU0sgfCBTRFZPX1JHQl9NQVNLIHwgU0RWT19MVkRTX01BU0sgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTRFZPX1RWX01BU0spCisJCQlTRFZPX1RWX01BU0spCiAKICNkZWZpbmUgSVNfVFYoYykJKGMtPm91dHB1dF9mbGFnICYgU0RWT19UVl9NQVNLKQogI2RlZmluZSBJU19UTURTKGMpCShjLT5vdXRwdXRfZmxhZyAmIFNEVk9fVE1EU19NQVNLKQpAQCAtMjg4LDExNyArMjg5LDExNyBAQAogCXU4IGNtZDsKIAljb25zdCBjaGFyICpuYW1lOwogfSBzZHZvX2NtZF9uYW1lc1tdID0gewotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfUkVTRVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0RFVklDRV9DQVBTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GSVJNV0FSRV9SRVYpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1RSQUlORURfSU5QVVRTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9BQ1RJVkVfT1VUUFVUUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQUNUSVZFX09VVFBVVFMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOX09VVF9NQVApLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOX09VVF9NQVApLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FUVEFDSEVEX0RJU1BMQVlTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IT1RfUExVR19TVVBQT1JUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BQ1RJVkVfSE9UX1BMVUcpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FDVElWRV9IT1RfUExVRyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5URVJSVVBUX0VWRU5UX1NPVVJDRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVEFSR0VUX0lOUFVUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UQVJHRVRfT1VUUFVUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9USU1JTkdTX1BBUlQyKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQyKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQxKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVVRQVVRfVElNSU5HU19QQVJUMiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9DUkVBVEVfUFJFRkVSUkVEX0lOUFVUX1RJTUlORyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR19QQVJUMSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR19QQVJUMiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5QVVRfUElYRUxfQ0xPQ0tfUkFOR0UpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9QSVhFTF9DTE9DS19SQU5HRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX0NMT0NLX1JBVEVfTVVMVFMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NMT0NLX1JBVEVfTVVMVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQ0xPQ0tfUkFURV9NVUxUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfVFZfRk9STUFUUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFZfRk9STUFUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UVl9GT1JNQVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9QT1dFUl9TVEFURVMpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1BPV0VSX1NUQVRFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9FTkNPREVSX1BPV0VSX1NUQVRFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9ESVNQTEFZX1BPV0VSX1NUQVRFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT05UUk9MX0JVU19TV0lUQ0gpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NEVFZfUkVTT0xVVElPTl9TVVBQT1JUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TQ0FMRURfSERUVl9SRVNPTFVUSU9OX1NVUFBPUlQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9FTkhBTkNFTUVOVFMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfUkVTRVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0RFVklDRV9DQVBTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GSVJNV0FSRV9SRVYpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1RSQUlORURfSU5QVVRTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9BQ1RJVkVfT1VUUFVUUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQUNUSVZFX09VVFBVVFMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0lOX09VVF9NQVApLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0lOX09VVF9NQVApLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FUVEFDSEVEX0RJU1BMQVlTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IT1RfUExVR19TVVBQT1JUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9BQ1RJVkVfSE9UX1BMVUcpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FDVElWRV9IT1RfUExVRyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5URVJSVVBUX0VWRU5UX1NPVVJDRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVEFSR0VUX0lOUFVUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UQVJHRVRfT1VUUFVUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9JTlBVVF9USU1JTkdTX1BBUlQyKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQyKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9JTlBVVF9USU1JTkdTX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVVRQVVRfVElNSU5HU19QQVJUMSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfT1VUUFVUX1RJTUlOR1NfUEFSVDIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9USU1JTkdTX1BBUlQxKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVVRQVVRfVElNSU5HU19QQVJUMiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9DUkVBVEVfUFJFRkVSUkVEX0lOUFVUX1RJTUlORyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR19QQVJUMSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUFJFRkVSUkVEX0lOUFVUX1RJTUlOR19QQVJUMiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSU5QVVRfUElYRUxfQ0xPQ0tfUkFOR0UpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09VVFBVVF9QSVhFTF9DTE9DS19SQU5HRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX0NMT0NLX1JBVEVfTVVMVFMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NMT0NLX1JBVEVfTVVMVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQ0xPQ0tfUkFURV9NVUxUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TVVBQT1JURURfVFZfRk9STUFUUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFZfRk9STUFUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9UVl9GT1JNQVQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9QT1dFUl9TVEFURVMpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1BPV0VSX1NUQVRFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9FTkNPREVSX1BPV0VSX1NUQVRFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9ESVNQTEFZX1BPV0VSX1NUQVRFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT05UUk9MX0JVU19TV0lUQ0gpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NEVFZfUkVTT0xVVElPTl9TVVBQT1JUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TQ0FMRURfSERUVl9SRVNPTFVUSU9OX1NVUFBPUlQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBPUlRFRF9FTkhBTkNFTUVOVFMpLAogCi0gICAgLyogQWRkIHRoZSBvcCBjb2RlIGZvciBTRFZPIGVuaGFuY2VtZW50cyAqLwotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9IUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IUE9TKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfVlBPUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVlBPUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVlBPUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1NBVFVSQVRJT04pLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NBVFVSQVRJT04pLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1NBVFVSQVRJT04pLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9IVUUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hVRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSFVFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfQ09OVFJBU1QpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTlRSQVNUKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9DT05UUkFTVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0JSSUdIVE5FU1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0JSSUdIVE5FU1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0JSSUdIVE5FU1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9PVkVSU0NBTl9IKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9PVkVSU0NBTl9IKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9PVkVSU0NBTl9IKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfT1ZFUlNDQU5fViksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1ZFUlNDQU5fViksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fViksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0ZMSUNLRVJfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GTElDS0VSX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRkxJQ0tFUl9GSUxURVIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9GTElDS0VSX0ZJTFRFUl9BREFQVElWRSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRkxJQ0tFUl9GSUxURVJfQURBUFRJVkUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0ZMSUNLRVJfRklMVEVSX0FEQVBUSVZFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfRkxJQ0tFUl9GSUxURVJfMkQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZMSUNLRVJfRklMVEVSXzJEKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9GTElDS0VSX0ZJTFRFUl8yRCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1NIQVJQTkVTUyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU0hBUlBORVNTKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9TSEFSUE5FU1MpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0RPVF9DUkFXTCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRE9UX0NSQVdMKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfVFZfQ0hST01BX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFZfQ0hST01BX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVFZfQ0hST01BX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1RWX0xVTUFfRklMVEVSKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9UVl9MVU1BX0ZJTFRFUiksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfVFZfTFVNQV9GSUxURVIpLAorCS8qIEFkZCB0aGUgb3AgY29kZSBmb3IgU0RWTyBlbmhhbmNlbWVudHMgKi8KKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfSFBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSFBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSFBPUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1ZQT1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1ZQT1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1ZQT1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9TQVRVUkFUSU9OKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9TQVRVUkFUSU9OKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9TQVRVUkFUSU9OKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfSFVFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IVUUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hVRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0NPTlRSQVNUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9DT05UUkFTVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQ09OVFJBU1QpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9CUklHSFRORVNTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9CUklHSFRORVNTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9CUklHSFRORVNTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfT1ZFUlNDQU5fSCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfT1ZFUlNDQU5fSCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfT1ZFUlNDQU5fSCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX09WRVJTQ0FOX1YpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX09WRVJTQ0FOX1YpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX09WRVJTQ0FOX1YpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9GTElDS0VSX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfRkxJQ0tFUl9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0ZMSUNLRVJfRklMVEVSKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9NQVhfRkxJQ0tFUl9GSUxURVJfQURBUFRJVkUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0ZMSUNLRVJfRklMVEVSX0FEQVBUSVZFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9GTElDS0VSX0ZJTFRFUl9BREFQVElWRSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX0ZMSUNLRVJfRklMVEVSXzJEKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9GTElDS0VSX0ZJTFRFUl8yRCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRkxJQ0tFUl9GSUxURVJfMkQpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9TSEFSUE5FU1MpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NIQVJQTkVTUyksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfU0hBUlBORVNTKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9ET1RfQ1JBV0wpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0RPVF9DUkFXTCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfTUFYX1RWX0NIUk9NQV9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1RWX0NIUk9NQV9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RWX0NIUk9NQV9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX01BWF9UVl9MVU1BX0ZJTFRFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfVFZfTFVNQV9GSUxURVIpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX1RWX0xVTUFfRklMVEVSKSwKIAotICAgIC8qIEhETUkgb3AgY29kZSAqLwotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1NVUFBfRU5DT0RFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9FTkNPREUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0VOQ09ERSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfUElYRUxfUkVQTEkpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX1BJWEVMX1JFUExJKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9DT0xPUklNRVRSWV9DQVApLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0NPTE9SSU1FVFJZKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9DT0xPUklNRVRSWSksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVVESU9fRU5DUllQVF9QUkVGRVIpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0FVRElPX1NUQVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0FVRElPX1NUQVQpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hCVUZfSU5ERVgpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hCVUZfSU5ERVgpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hCVUZfSU5GTyksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9BVl9TUExJVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9BVl9TUExJVCksCi0gICAgU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9UWFJBVEUpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hCVUZfVFhSQVRFKSwKLSAgICBTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IQlVGX0RBVEEpLAotICAgIFNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0hCVUZfREFUQSksCisJLyogSERNSSBvcCBjb2RlICovCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfU1VQUF9FTkNPREUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0VOQ09ERSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfRU5DT0RFKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9QSVhFTF9SRVBMSSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfUElYRUxfUkVQTEkpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTE9SSU1FVFJZX0NBUCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQ09MT1JJTUVUUlkpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfR0VUX0NPTE9SSU1FVFJZKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9BVURJT19FTkNSWVBUX1BSRUZFUiksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfQVVESU9fU1RBVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfQVVESU9fU1RBVCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9JTkRFWCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9JTkRFWCksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9JTkZPKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX0FWX1NQTElUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX1NFVF9IQlVGX0FWX1NQTElUKSwKKwlTRFZPX0NNRF9OQU1FX0VOVFJZKFNEVk9fQ01EX0dFVF9IQlVGX1RYUkFURSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9TRVRfSEJVRl9UWFJBVEUpLAorCVNEVk9fQ01EX05BTUVfRU5UUlkoU0RWT19DTURfU0VUX0hCVUZfREFUQSksCisJU0RWT19DTURfTkFNRV9FTlRSWShTRFZPX0NNRF9HRVRfSEJVRl9EQVRBKSwKIH07CiAKICNkZWZpbmUgSVNfU0RWT0IocmVnKQkocmVnID09IFNEVk9CIHx8IHJlZyA9PSBQQ0hfU0RWT0IpCkBAIC0xMjMyLDggKzEyMzMsNyBAQAogaW50ZWxfc2R2b19tdWx0aWZ1bmNfZW5jb2RlcihzdHJ1Y3QgaW50ZWxfc2R2byAqaW50ZWxfc2R2bykKIHsKIAkvKiBJcyB0aGVyZSBtb3JlIHRoYW4gb25lIHR5cGUgb2Ygb3V0cHV0PyAqLwotCWludCBjYXBzID0gaW50ZWxfc2R2by0+Y2Fwcy5vdXRwdXRfZmxhZ3MgJiAweGY7Ci0JcmV0dXJuIGNhcHMgJiAtY2FwczsKKwlyZXR1cm4gaHdlaWdodDE2KGludGVsX3Nkdm8tPmNhcHMub3V0cHV0X2ZsYWdzKSA+IDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZWRpZCAqCkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogfQogCiBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCi1pbnRlbF9zZHZvX2hkbWlfc2lua19kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK2ludGVsX3Nkdm9fdG1kc19zaW5rX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBpbnRlbF9zZHZvICppbnRlbF9zZHZvID0gaW50ZWxfYXR0YWNoZWRfc2R2byhjb25uZWN0b3IpOwogCWVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgc3RhdHVzOwpAQCAtMTM0OSw3ICsxMzQ5LDcgQEAKIAlpZiAoKGludGVsX3Nkdm9fY29ubmVjdG9yLT5vdXRwdXRfZmxhZyAmIHJlc3BvbnNlKSA9PSAwKQogCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAllbHNlIGlmIChJU19UTURTKGludGVsX3Nkdm9fY29ubmVjdG9yKSkKLQkJcmV0ID0gaW50ZWxfc2R2b19oZG1pX3NpbmtfZGV0ZWN0KGNvbm5lY3Rvcik7CisJCXJldCA9IGludGVsX3Nkdm9fdG1kc19zaW5rX2RldGVjdChjb25uZWN0b3IpOwogCWVsc2UgewogCQlzdHJ1Y3QgZWRpZCAqZWRpZDsKIApAQCAtMTg5Niw3ICsxODk2LDcgQEAKIAkJCSAgc3RydWN0IGludGVsX3Nkdm8gKnNkdm8sIHUzMiByZWcpCiB7CiAJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgKm1hcHBpbmc7Ci0JdTggcGluLCBzcGVlZDsKKwl1OCBwaW47CiAKIAlpZiAoSVNfU0RWT0IocmVnKSkKIAkJbWFwcGluZyA9ICZkZXZfcHJpdi0+c2R2b19tYXBwaW5nc1swXTsKQEAgLTE5MDQsMTggKzE5MDQsMTYgQEAKIAkJbWFwcGluZyA9ICZkZXZfcHJpdi0+c2R2b19tYXBwaW5nc1sxXTsKIAogCXBpbiA9IEdNQlVTX1BPUlRfRFBCOwotCXNwZWVkID0gR01CVVNfUkFURV8xTUhaID4+IDg7Ci0JaWYgKG1hcHBpbmctPmluaXRpYWxpemVkKSB7CisJaWYgKG1hcHBpbmctPmluaXRpYWxpemVkKQogCQlwaW4gPSBtYXBwaW5nLT5pMmNfcGluOwotCQlzcGVlZCA9IG1hcHBpbmctPmkyY19zcGVlZDsKLQl9CiAKIAlpZiAocGluIDwgR01CVVNfTlVNX1BPUlRTKSB7CiAJCXNkdm8tPmkyYyA9ICZkZXZfcHJpdi0+Z21idXNbcGluXS5hZGFwdGVyOwotCQlpbnRlbF9nbWJ1c19zZXRfc3BlZWQoc2R2by0+aTJjLCBzcGVlZCk7CisJCWludGVsX2dtYnVzX3NldF9zcGVlZChzZHZvLT5pMmMsIEdNQlVTX1JBVEVfMU1IWik7CiAJCWludGVsX2dtYnVzX2ZvcmNlX2JpdChzZHZvLT5pMmMsIHRydWUpOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNkdm8tPmkyYyA9ICZkZXZfcHJpdi0+Z21idXNbR01CVVNfUE9SVF9EUEJdLmFkYXB0ZXI7CisJfQogfQogCiBzdGF0aWMgYm9vbApAQCAtMjIwNiw3ICsyMjA0LDcgQEAKIAkJCSAgICAgIGJ5dGVzWzBdLCBieXRlc1sxXSk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JaW50ZWxfc2R2by0+YmFzZS5jcnRjX21hc2sgPSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCWludGVsX3Nkdm8tPmJhc2UuY3J0Y19tYXNrID0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC0yMjc1LDcgKzIyNzMsNyBAQAogCQlEUk1fREVCVUdfS01TKCNuYW1lICI6IG1heCAlZCwgZGVmYXVsdCAlZCwgY3VycmVudCAlZFxuIiwgXAogCQkJICAgICAgZGF0YV92YWx1ZVswXSwgZGF0YV92YWx1ZVsxXSwgcmVzcG9uc2UpOyBcCiAJfSBcCi19IHdoaWxlKDApCit9IHdoaWxlICgwKQogCiBzdGF0aWMgYm9vbAogaW50ZWxfc2R2b19jcmVhdGVfZW5oYW5jZV9wcm9wZXJ0eV90dihzdHJ1Y3QgaW50ZWxfc2R2byAqaW50ZWxfc2R2bywKQEAgLTI0NDIsNyArMjQ0MCw3IEBACiAKIAlpZiAoSVNfVFYoaW50ZWxfc2R2b19jb25uZWN0b3IpKQogCQlyZXR1cm4gaW50ZWxfc2R2b19jcmVhdGVfZW5oYW5jZV9wcm9wZXJ0eV90dihpbnRlbF9zZHZvLCBpbnRlbF9zZHZvX2Nvbm5lY3RvciwgZW5oYW5jZW1lbnRzLnJlcGx5KTsKLQllbHNlIGlmKElTX0xWRFMoaW50ZWxfc2R2b19jb25uZWN0b3IpKQorCWVsc2UgaWYgKElTX0xWRFMoaW50ZWxfc2R2b19jb25uZWN0b3IpKQogCQlyZXR1cm4gaW50ZWxfc2R2b19jcmVhdGVfZW5oYW5jZV9wcm9wZXJ0eV9sdmRzKGludGVsX3Nkdm8sIGludGVsX3Nkdm9fY29ubmVjdG9yLCBlbmhhbmNlbWVudHMucmVwbHkpOwogCWVsc2UKIAkJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvX3JlZ3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm9fcmVncy5oCmluZGV4IDRmNGUyM2IuLjRhYTZmMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm9fcmVncy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm9fcmVncy5oCkBAIC00Niw2MyArNDYsNjMgQEAKICNkZWZpbmUgU0RWT19PVVRQVVRfTEFTVCAgICAoMTQpCiAKIHN0cnVjdCBpbnRlbF9zZHZvX2NhcHMgewotICAgIHU4IHZlbmRvcl9pZDsKLSAgICB1OCBkZXZpY2VfaWQ7Ci0gICAgdTggZGV2aWNlX3Jldl9pZDsKLSAgICB1OCBzZHZvX3ZlcnNpb25fbWFqb3I7Ci0gICAgdTggc2R2b192ZXJzaW9uX21pbm9yOwotICAgIHVuc2lnbmVkIGludCBzZHZvX2lucHV0c19tYXNrOjI7Ci0gICAgdW5zaWduZWQgaW50IHNtb290aF9zY2FsaW5nOjE7Ci0gICAgdW5zaWduZWQgaW50IHNoYXJwX3NjYWxpbmc6MTsKLSAgICB1bnNpZ25lZCBpbnQgdXBfc2NhbGluZzoxOwotICAgIHVuc2lnbmVkIGludCBkb3duX3NjYWxpbmc6MTsKLSAgICB1bnNpZ25lZCBpbnQgc3RhbGxfc3VwcG9ydDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQ6MTsKLSAgICB1MTYgb3V0cHV0X2ZsYWdzOworCXU4IHZlbmRvcl9pZDsKKwl1OCBkZXZpY2VfaWQ7CisJdTggZGV2aWNlX3Jldl9pZDsKKwl1OCBzZHZvX3ZlcnNpb25fbWFqb3I7CisJdTggc2R2b192ZXJzaW9uX21pbm9yOworCXVuc2lnbmVkIGludCBzZHZvX2lucHV0c19tYXNrOjI7CisJdW5zaWduZWQgaW50IHNtb290aF9zY2FsaW5nOjE7CisJdW5zaWduZWQgaW50IHNoYXJwX3NjYWxpbmc6MTsKKwl1bnNpZ25lZCBpbnQgdXBfc2NhbGluZzoxOworCXVuc2lnbmVkIGludCBkb3duX3NjYWxpbmc6MTsKKwl1bnNpZ25lZCBpbnQgc3RhbGxfc3VwcG9ydDoxOworCXVuc2lnbmVkIGludCBwYWQ6MTsKKwl1MTYgb3V0cHV0X2ZsYWdzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoqIFRoaXMgbWF0Y2hlcyB0aGUgRURJRCBEVEQgc3RydWN0dXJlLCBtb3JlIG9yIGxlc3MgKi8KIHN0cnVjdCBpbnRlbF9zZHZvX2R0ZCB7Ci0gICAgc3RydWN0IHsKLQl1MTYgY2xvY2s7CQkvKio8IHBpeGVsIGNsb2NrLCBpbiAxMGtIeiB1bml0cyAqLwotCXU4IGhfYWN0aXZlOwkJLyoqPCBsb3dlciA4IGJpdHMgKHBpeGVscykgKi8KLQl1OCBoX2JsYW5rOwkJLyoqPCBsb3dlciA4IGJpdHMgKHBpeGVscykgKi8KLQl1OCBoX2hpZ2g7CQkvKio8IHVwcGVyIDQgYml0cyBlYWNoIGhfYWN0aXZlLCBoX2JsYW5rICovCi0JdTggdl9hY3RpdmU7CQkvKio8IGxvd2VyIDggYml0cyAobGluZXMpICovCi0JdTggdl9ibGFuazsJCS8qKjwgbG93ZXIgOCBiaXRzIChsaW5lcykgKi8KLQl1OCB2X2hpZ2g7CQkvKio8IHVwcGVyIDQgYml0cyBlYWNoIHZfYWN0aXZlLCB2X2JsYW5rICovCi0gICAgfSBwYXJ0MTsKKwlzdHJ1Y3QgeworCQl1MTYgY2xvY2s7CS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCisJCXU4IGhfYWN0aXZlOwkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLworCQl1OCBoX2JsYW5rOwkvKio8IGxvd2VyIDggYml0cyAocGl4ZWxzKSAqLworCQl1OCBoX2hpZ2g7CS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggaF9hY3RpdmUsIGhfYmxhbmsgKi8KKwkJdTggdl9hY3RpdmU7CS8qKjwgbG93ZXIgOCBiaXRzIChsaW5lcykgKi8KKwkJdTggdl9ibGFuazsJLyoqPCBsb3dlciA4IGJpdHMgKGxpbmVzKSAqLworCQl1OCB2X2hpZ2g7CS8qKjwgdXBwZXIgNCBiaXRzIGVhY2ggdl9hY3RpdmUsIHZfYmxhbmsgKi8KKwl9IHBhcnQxOwogCi0gICAgc3RydWN0IHsKLQl1OCBoX3N5bmNfb2ZmOwkvKio8IGxvd2VyIDggYml0cywgZnJvbSBoYmxhbmsgc3RhcnQgKi8KLQl1OCBoX3N5bmNfd2lkdGg7CS8qKjwgbG93ZXIgOCBiaXRzIChwaXhlbHMpICovCi0JLyoqIGxvd2VyIDQgYml0cyBlYWNoIHZzeW5jIG9mZnNldCwgdnN5bmMgd2lkdGggKi8KLQl1OCB2X3N5bmNfb2ZmX3dpZHRoOwotCS8qKgotCSAqIDIgaGlnaCBiaXRzIG9mIGhzeW5jIG9mZnNldCwgMiBoaWdoIGJpdHMgb2YgaHN5bmMgd2lkdGgsCi0JICogYml0cyA0LTUgb2YgdnN5bmMgb2Zmc2V0LCBhbmQgMiBoaWdoIGJpdHMgb2YgdnN5bmMgd2lkdGguCi0JICovCi0JdTggc3luY19vZmZfd2lkdGhfaGlnaDsKLQl1OCBkdGRfZmxhZ3M7Ci0JdTggc2R2b19mbGFnczsKLQkvKiogYml0cyA2LTcgb2YgdnN5bmMgb2Zmc2V0IGF0IGJpdHMgNi03ICovCi0JdTggdl9zeW5jX29mZl9oaWdoOwotCXU4IHJlc2VydmVkOwotICAgIH0gcGFydDI7CisJc3RydWN0IHsKKwkJdTggaF9zeW5jX29mZjsJLyoqPCBsb3dlciA4IGJpdHMsIGZyb20gaGJsYW5rIHN0YXJ0ICovCisJCXU4IGhfc3luY193aWR0aDsJLyoqPCBsb3dlciA4IGJpdHMgKHBpeGVscykgKi8KKwkJLyoqIGxvd2VyIDQgYml0cyBlYWNoIHZzeW5jIG9mZnNldCwgdnN5bmMgd2lkdGggKi8KKwkJdTggdl9zeW5jX29mZl93aWR0aDsKKwkJLyoqCisJCSogMiBoaWdoIGJpdHMgb2YgaHN5bmMgb2Zmc2V0LCAyIGhpZ2ggYml0cyBvZiBoc3luYyB3aWR0aCwKKwkJKiBiaXRzIDQtNSBvZiB2c3luYyBvZmZzZXQsIGFuZCAyIGhpZ2ggYml0cyBvZiB2c3luYyB3aWR0aC4KKwkJKi8KKwkJdTggc3luY19vZmZfd2lkdGhfaGlnaDsKKwkJdTggZHRkX2ZsYWdzOworCQl1OCBzZHZvX2ZsYWdzOworCQkvKiogYml0cyA2LTcgb2YgdnN5bmMgb2Zmc2V0IGF0IGJpdHMgNi03ICovCisJCXU4IHZfc3luY19vZmZfaGlnaDsKKwkJdTggcmVzZXJ2ZWQ7CisJfSBwYXJ0MjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBpbnRlbF9zZHZvX3BpeGVsX2Nsb2NrX3JhbmdlIHsKLSAgICB1MTYgbWluOwkJCS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCi0gICAgdTE2IG1heDsJCQkvKio8IHBpeGVsIGNsb2NrLCBpbiAxMGtIeiB1bml0cyAqLworCXUxNiBtaW47CS8qKjwgcGl4ZWwgY2xvY2ssIGluIDEwa0h6IHVuaXRzICovCisJdTE2IG1heDsJLyoqPCBwaXhlbCBjbG9jaywgaW4gMTBrSHogdW5pdHMgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBpbnRlbF9zZHZvX3ByZWZlcnJlZF9pbnB1dF90aW1pbmdfYXJncyB7Ci0gICAgdTE2IGNsb2NrOwotICAgIHUxNiB3aWR0aDsKLSAgICB1MTYgaGVpZ2h0OwotICAgIHU4CWludGVybGFjZToxOwotICAgIHU4CXNjYWxlZDoxOwotICAgIHU4CXBhZDo2OworCXUxNiBjbG9jazsKKwl1MTYgd2lkdGg7CisJdTE2IGhlaWdodDsKKwl1OAlpbnRlcmxhY2U6MTsKKwl1OAlzY2FsZWQ6MTsKKwl1OAlwYWQ6NjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIEkyQyByZWdpc3RlcnMgZm9yIFNEVk8gKi8KQEAgLTE1NCw5ICsxNTQsOSBAQAogICovCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9UUkFJTkVEX0lOUFVUUwkJCTB4MDMKIHN0cnVjdCBpbnRlbF9zZHZvX2dldF90cmFpbmVkX2lucHV0c19yZXNwb25zZSB7Ci0gICAgdW5zaWduZWQgaW50IGlucHV0MF90cmFpbmVkOjE7Ci0gICAgdW5zaWduZWQgaW50IGlucHV0MV90cmFpbmVkOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo2OworCXVuc2lnbmVkIGludCBpbnB1dDBfdHJhaW5lZDoxOworCXVuc2lnbmVkIGludCBpbnB1dDFfdHJhaW5lZDoxOworCXVuc2lnbmVkIGludCBwYWQ6NjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qKiBSZXR1cm5zIGEgc3RydWN0IGludGVsX3Nkdm9fb3V0cHV0X2ZsYWdzIG9mIGFjdGl2ZSBvdXRwdXRzLiAqLwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgKi8KICNkZWZpbmUgU0RWT19DTURfR0VUX0lOX09VVF9NQVAJCQkJMHgwNgogc3RydWN0IGludGVsX3Nkdm9faW5fb3V0X21hcCB7Ci0gICAgdTE2IGluMCwgaW4xOworCXUxNiBpbjAsIGluMTsKIH07CiAKIC8qKgpAQCAtMjEwLDEwICsyMTAsMTAgQEAKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfSU5URVJSVVBUX0VWRU5UX1NPVVJDRQkJMHgwZgogc3RydWN0IGludGVsX3Nkdm9fZ2V0X2ludGVycnVwdF9ldmVudF9zb3VyY2VfcmVzcG9uc2UgewotICAgIHUxNiBpbnRlcnJ1cHRfc3RhdHVzOwotICAgIHVuc2lnbmVkIGludCBhbWJpZW50X2xpZ2h0X2ludGVycnVwdDoxOwotICAgIHVuc2lnbmVkIGludCBoZG1pX2F1ZGlvX2VuY3J5cHRfY2hhbmdlOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo2OworCXUxNiBpbnRlcnJ1cHRfc3RhdHVzOworCXVuc2lnbmVkIGludCBhbWJpZW50X2xpZ2h0X2ludGVycnVwdDoxOworCXVuc2lnbmVkIGludCBoZG1pX2F1ZGlvX2VuY3J5cHRfY2hhbmdlOjE7CisJdW5zaWduZWQgaW50IHBhZDo2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoqCkBAIC0yMjUsOCArMjI1LDggQEAKICAqLwogI2RlZmluZSBTRFZPX0NNRF9TRVRfVEFSR0VUX0lOUFVUCQkJMHgxMAogc3RydWN0IGludGVsX3Nkdm9fc2V0X3RhcmdldF9pbnB1dF9hcmdzIHsKLSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0XzE6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkOjc7CisJdW5zaWduZWQgaW50IHRhcmdldF8xOjE7CisJdW5zaWduZWQgaW50IHBhZDo3OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoqCkBAIC0zMTQsNTcgKzMxNCw1NyBAQAogI2RlZmluZSBTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX1RWX0ZPUk1BVFMJCTB4MjcKIC8qKiA2IGJ5dGVzIG9mIGJpdCBmbGFncyBmb3IgVFYgZm9ybWF0cyBzaGFyZWQgYnkgYWxsIFRWIGZvcm1hdCBmdW5jdGlvbnMgKi8KIHN0cnVjdCBpbnRlbF9zZHZvX3R2X2Zvcm1hdCB7Ci0gICAgdW5zaWduZWQgaW50IG50c2NfbToxOwotICAgIHVuc2lnbmVkIGludCBudHNjX2o6MTsKLSAgICB1bnNpZ25lZCBpbnQgbnRzY180NDM6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2I6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2c6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2g6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2k6MTsKKwl1bnNpZ25lZCBpbnQgbnRzY19tOjE7CisJdW5zaWduZWQgaW50IG50c2NfajoxOworCXVuc2lnbmVkIGludCBudHNjXzQ0MzoxOworCXVuc2lnbmVkIGludCBwYWxfYjoxOworCXVuc2lnbmVkIGludCBwYWxfZDoxOworCXVuc2lnbmVkIGludCBwYWxfZzoxOworCXVuc2lnbmVkIGludCBwYWxfaDoxOworCXVuc2lnbmVkIGludCBwYWxfaToxOwogCi0gICAgdW5zaWduZWQgaW50IHBhbF9tOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF9uOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF9uYzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fYjoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9kOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2c6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fazoxOworCXVuc2lnbmVkIGludCBwYWxfbToxOworCXVuc2lnbmVkIGludCBwYWxfbjoxOworCXVuc2lnbmVkIGludCBwYWxfbmM6MTsKKwl1bnNpZ25lZCBpbnQgcGFsXzYwOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2I6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fZDoxOworCXVuc2lnbmVkIGludCBzZWNhbV9nOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2s6MTsKIAotICAgIHVuc2lnbmVkIGludCBzZWNhbV9rMToxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9sOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI0MG1fMTA4MGlfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNjBtXzEwODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81MDoxOworCXVuc2lnbmVkIGludCBzZWNhbV9rMToxOworCXVuc2lnbmVkIGludCBzZWNhbV9sOjE7CisJdW5zaWduZWQgaW50IHNlY2FtXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI0MG1fMTA4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNjBtXzEwODBpXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81MDoxOwogCi0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzIzOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMzA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF81MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yMzoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI0OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjU6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yOToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzMwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTA6MTsKIAotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk1bV8xMDgwaV81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBwXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5M21fNDgwcF81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk1bV8xMDgwaV81MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5M21fNDgwcF81OToxOwogCi0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzE3MG1fNDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2aV81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2cF81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQ6MzsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMTcwbV80ODBpXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZpXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX2l0dXJidDYwMV81NzZwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBpXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX2VpYV83NzAyYV80ODBwXzYwOjE7CisJdW5zaWduZWQgaW50IHBhZDozOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfVFZfRk9STUFUCQkJCTB4MjgKQEAgLTM3NCw1MyArMzc0LDUzIEBACiAvKiogUmV0dXJucyB0aGUgcmVzb2x1dGlvc24gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbiBUViBmb3JtYXQgKi8KICNkZWZpbmUgU0RWT19DTURfR0VUX1NEVFZfUkVTT0xVVElPTl9TVVBQT1JUCQkweDgzCiBzdHJ1Y3QgaW50ZWxfc2R2b19zZHR2X3Jlc29sdXRpb25fcmVxdWVzdCB7Ci0gICAgdW5zaWduZWQgaW50IG50c2NfbToxOwotICAgIHVuc2lnbmVkIGludCBudHNjX2o6MTsKLSAgICB1bnNpZ25lZCBpbnQgbnRzY180NDM6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2I6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2Q6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2c6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2g6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFsX2k6MTsKKwl1bnNpZ25lZCBpbnQgbnRzY19tOjE7CisJdW5zaWduZWQgaW50IG50c2NfajoxOworCXVuc2lnbmVkIGludCBudHNjXzQ0MzoxOworCXVuc2lnbmVkIGludCBwYWxfYjoxOworCXVuc2lnbmVkIGludCBwYWxfZDoxOworCXVuc2lnbmVkIGludCBwYWxfZzoxOworCXVuc2lnbmVkIGludCBwYWxfaDoxOworCXVuc2lnbmVkIGludCBwYWxfaToxOwogCi0gICAgdW5zaWduZWQgaW50IHBhbF9tOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF9uOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhbF9uYzoxOwotICAgIHVuc2lnbmVkIGludCBwYWxfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fYjoxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9kOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtX2c6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2VjYW1fazoxOworCXVuc2lnbmVkIGludCBwYWxfbToxOworCXVuc2lnbmVkIGludCBwYWxfbjoxOworCXVuc2lnbmVkIGludCBwYWxfbmM6MTsKKwl1bnNpZ25lZCBpbnQgcGFsXzYwOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2I6MTsKKwl1bnNpZ25lZCBpbnQgc2VjYW1fZDoxOworCXVuc2lnbmVkIGludCBzZWNhbV9nOjE7CisJdW5zaWduZWQgaW50IHNlY2FtX2s6MTsKIAotICAgIHVuc2lnbmVkIGludCBzZWNhbV9rMToxOwotICAgIHVuc2lnbmVkIGludCBzZWNhbV9sOjE7Ci0gICAgdW5zaWduZWQgaW50IHNlY2FtXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo1OworCXVuc2lnbmVkIGludCBzZWNhbV9rMToxOworCXVuc2lnbmVkIGludCBzZWNhbV9sOjE7CisJdW5zaWduZWQgaW50IHNlY2FtXzYwOjE7CisJdW5zaWduZWQgaW50IHBhZDo1OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGludGVsX3Nkdm9fc2R0dl9yZXNvbHV0aW9uX3JlcGx5IHsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzMyMHgyMDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzMyMHgyNDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzQwMHgzMDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzY0MHgzNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzY0MHg0MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzY0MHg0ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzcwNHg0ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzcwNHg1NzY6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzMyMHgyMDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzMyMHgyNDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzQwMHgzMDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzY0MHgzNTA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzY0MHg0MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzY0MHg0ODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzcwNHg0ODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzcwNHg1NzY6MTsKIAotICAgIHVuc2lnbmVkIGludCByZXNfNzIweDM1MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzIweDQwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzIweDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzIweDU0MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzIweDU3NjoxOwotICAgIHVuc2lnbmVkIGludCByZXNfNzY4eDU3NjoxOwotICAgIHVuc2lnbmVkIGludCByZXNfODAweDYwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfODMyeDYyNDoxOworCXVuc2lnbmVkIGludCByZXNfNzIweDM1MDoxOworCXVuc2lnbmVkIGludCByZXNfNzIweDQwMDoxOworCXVuc2lnbmVkIGludCByZXNfNzIweDQ4MDoxOworCXVuc2lnbmVkIGludCByZXNfNzIweDU0MDoxOworCXVuc2lnbmVkIGludCByZXNfNzIweDU3NjoxOworCXVuc2lnbmVkIGludCByZXNfNzY4eDU3NjoxOworCXVuc2lnbmVkIGludCByZXNfODAweDYwMDoxOworCXVuc2lnbmVkIGludCByZXNfODMyeDYyNDoxOwogCi0gICAgdW5zaWduZWQgaW50IHJlc185MjB4NzY2OjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMDI0eDc2ODoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTI4MHgxMDI0OjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo1OworCXVuc2lnbmVkIGludCByZXNfOTIweDc2NjoxOworCXVuc2lnbmVkIGludCByZXNfMTAyNHg3Njg6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzEyODB4MTAyNDoxOworCXVuc2lnbmVkIGludCBwYWQ6NTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIEdldCBzdXBwb3J0ZWQgcmVzb2x1dGlvbiB3aXRoIHNxdWlyZSBwaXhlbCBhc3BlY3QgcmF0aW8gdGhhdCBjYW4gYmUKQEAgLTQyOCw5MCArNDI4LDkwIEBACiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9TQ0FMRURfSERUVl9SRVNPTFVUSU9OX1NVUFBPUlQJCTB4ODUKIAogc3RydWN0IGludGVsX3Nkdm9faGR0dl9yZXNvbHV0aW9uX3JlcXVlc3QgewotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNDBtXzEwODBpXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI0MG1fMTA4MGlfNjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjYwbV8xMDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNjBtXzEwODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzYwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjM6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjQwbV8xMDgwaV81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNDBtXzEwODBpXzYwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI2MG1fMTA4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjYwbV8xMDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBpXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwaV82MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzIzOjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI1OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8zMDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzUwOjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNTk6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBpXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMjQ6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF8yNToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzI5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfMzA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjc0bV8xMDgwcF81MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yNzRtXzEwODBwXzU5OjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI3NG1fMTA4MHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk1bV8xMDgwaV81MDoxOwogCi0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5NW1fMTA4MHBfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjkzbV80ODBwXzU5OjE7Ci0gICAgdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzE3MG1fNDgwaV81OToxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2aV81MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9pdHVyYnQ2MDFfNTc2cF81MDoxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTVtXzEwODBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5Nm1fNzIwcF81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8yOTZtXzcyMHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfc21wdGVfMjk2bV83MjBwXzUwOjE7CisJdW5zaWduZWQgaW50IGhkdHZfc3RkX3NtcHRlXzI5M21fNDgwcF81OToxOworCXVuc2lnbmVkIGludCBoZHR2X3N0ZF9zbXB0ZV8xNzBtXzQ4MGlfNTk6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfaXR1cmJ0NjAxXzU3NmlfNTA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfaXR1cmJ0NjAxXzU3NnBfNTA6MTsKIAotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwaV82MDoxOwotICAgIHVuc2lnbmVkIGludCBoZHR2X3N0ZF9laWFfNzcwMmFfNDgwcF82MDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQ6NjsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MGlfNjA6MTsKKwl1bnNpZ25lZCBpbnQgaGR0dl9zdGRfZWlhXzc3MDJhXzQ4MHBfNjA6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaW50ZWxfc2R2b19oZHR2X3Jlc29sdXRpb25fcmVwbHkgewotICAgIHVuc2lnbmVkIGludCByZXNfNjQweDQ4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfODAweDYwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTAyNHg3Njg6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzEyODB4OTYwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xNDAweDEwNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE2MDB4MTIwMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTkyMHgxNDQwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18yMDQ4eDE1MzY6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzY0MHg0ODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzgwMHg2MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzEwMjR4NzY4OjE7CisJdW5zaWduZWQgaW50IHJlc18xMjgweDk2MDoxOworCXVuc2lnbmVkIGludCByZXNfMTQwMHgxMDUwOjE7CisJdW5zaWduZWQgaW50IHJlc18xNjAweDEyMDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE5MjB4MTQ0MDoxOworCXVuc2lnbmVkIGludCByZXNfMjA0OHgxNTM2OjE7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzI1NjB4MTkyMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMzIwMHgyNDAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18zODQweDI4ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkMTo1OworCXVuc2lnbmVkIGludCByZXNfMjU2MHgxOTIwOjE7CisJdW5zaWduZWQgaW50IHJlc18zMjAweDI0MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzM4NDB4Mjg4MDoxOworCXVuc2lnbmVkIGludCBwYWQxOjU7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzg0OHg0ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzEwNjR4NjAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMjgweDcyMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTM2MHg3Njg6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE3MDR4OTYwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xODY0eDEwNTA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE5MjB4MTA4MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMjEyOHgxMjAwOjE7CisJdW5zaWduZWQgaW50IHJlc184NDh4NDgwOjE7CisJdW5zaWduZWQgaW50IHJlc18xMDY0eDYwMDoxOworCXVuc2lnbmVkIGludCByZXNfMTI4MHg3MjA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzEzNjB4NzY4OjE7CisJdW5zaWduZWQgaW50IHJlc18xNzA0eDk2MDoxOworCXVuc2lnbmVkIGludCByZXNfMTg2NHgxMDUwOjE7CisJdW5zaWduZWQgaW50IHJlc18xOTIweDEwODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzIxMjh4MTIwMDoxOwogCi0gICAgdW5zaWduZWQgaW50IHJlc18yNTYweDE0MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzI3Mjh4MTUzNjoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMzQwOHgxOTIwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc180MjY0eDI0MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzUxMjB4Mjg4MDoxOwotICAgIHVuc2lnbmVkIGludCBwYWQyOjM7CisJdW5zaWduZWQgaW50IHJlc18yNTYweDE0MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzI3Mjh4MTUzNjoxOworCXVuc2lnbmVkIGludCByZXNfMzQwOHgxOTIwOjE7CisJdW5zaWduZWQgaW50IHJlc180MjY0eDI0MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzUxMjB4Mjg4MDoxOworCXVuc2lnbmVkIGludCBwYWQyOjM7CiAKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzc2OHg0ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzk2MHg2MDA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzExNTJ4NzIwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xMTI0eDc2ODoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTUzNng5NjA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzE2ODB4MTA1MDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMTcyOHgxMDgwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18xOTIweDEyMDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzc2OHg0ODA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzk2MHg2MDA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzExNTJ4NzIwOjE7CisJdW5zaWduZWQgaW50IHJlc18xMTI0eDc2ODoxOworCXVuc2lnbmVkIGludCByZXNfMTUzNng5NjA6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzE2ODB4MTA1MDoxOworCXVuc2lnbmVkIGludCByZXNfMTcyOHgxMDgwOjE7CisJdW5zaWduZWQgaW50IHJlc18xOTIweDEyMDA6MTsKIAotICAgIHVuc2lnbmVkIGludCByZXNfMjMwNHgxNDQwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc18yNDU2eDE1MzY6MTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzXzMwNzJ4MTkyMDoxOwotICAgIHVuc2lnbmVkIGludCByZXNfMzg0MHgyNDAwOjE7Ci0gICAgdW5zaWduZWQgaW50IHJlc180NjA4eDI4ODA6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkMzozOworCXVuc2lnbmVkIGludCByZXNfMjMwNHgxNDQwOjE7CisJdW5zaWduZWQgaW50IHJlc18yNDU2eDE1MzY6MTsKKwl1bnNpZ25lZCBpbnQgcmVzXzMwNzJ4MTkyMDoxOworCXVuc2lnbmVkIGludCByZXNfMzg0MHgyNDAwOjE7CisJdW5zaWduZWQgaW50IHJlc180NjA4eDI4ODA6MTsKKwl1bnNpZ25lZCBpbnQgcGFkMzozOwogCi0gICAgdW5zaWduZWQgaW50IHJlc18xMjgweDEwMjQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkNDo3OworCXVuc2lnbmVkIGludCByZXNfMTI4MHgxMDI0OjE7CisJdW5zaWduZWQgaW50IHBhZDQ6NzsKIAotICAgIHVuc2lnbmVkIGludCByZXNfMTI4MHg3Njg6MTsKLSAgICB1bnNpZ25lZCBpbnQgcGFkNTo3OworCXVuc2lnbmVkIGludCByZXNfMTI4MHg3Njg6MTsKKwl1bnNpZ25lZCBpbnQgcGFkNTo3OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogR2V0IHN1cHBvcnRlZCBwb3dlciBzdGF0ZSByZXR1cm5zIGluZm8gZm9yIGVuY29kZXIgYW5kIG1vbml0b3IsIHJlbHkgb24KQEAgLTUzOSwyNSArNTM5LDI1IEBACiAgKiBUaGUgaGlnaCBmaWVsZHMgYXJlIGJpdHMgODo5IG9mIHRoZSAxMC1iaXQgdmFsdWVzLgogICovCiBzdHJ1Y3Qgc2R2b19wYW5lbF9wb3dlcl9zZXF1ZW5jaW5nIHsKLSAgICB1OCB0MDsKLSAgICB1OCB0MTsKLSAgICB1OCB0MjsKLSAgICB1OCB0MzsKLSAgICB1OCB0NDsKKwl1OCB0MDsKKwl1OCB0MTsKKwl1OCB0MjsKKwl1OCB0MzsKKwl1OCB0NDsKIAotICAgIHVuc2lnbmVkIGludCB0MF9oaWdoOjI7Ci0gICAgdW5zaWduZWQgaW50IHQxX2hpZ2g6MjsKLSAgICB1bnNpZ25lZCBpbnQgdDJfaGlnaDoyOwotICAgIHVuc2lnbmVkIGludCB0M19oaWdoOjI7CisJdW5zaWduZWQgaW50IHQwX2hpZ2g6MjsKKwl1bnNpZ25lZCBpbnQgdDFfaGlnaDoyOworCXVuc2lnbmVkIGludCB0Ml9oaWdoOjI7CisJdW5zaWduZWQgaW50IHQzX2hpZ2g6MjsKIAotICAgIHVuc2lnbmVkIGludCB0NF9oaWdoOjI7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo2OworCXVuc2lnbmVkIGludCB0NF9oaWdoOjI7CisJdW5zaWduZWQgaW50IHBhZDo2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfTUFYX0JBQ0tMSUdIVF9MRVZFTAkJMHgzMAogc3RydWN0IHNkdm9fbWF4X2JhY2tsaWdodF9yZXBseSB7Ci0gICAgdTggbWF4X3ZhbHVlOwotICAgIHU4IGRlZmF1bHRfdmFsdWU7CisJdTggbWF4X3ZhbHVlOworCXU4IGRlZmF1bHRfdmFsdWU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9CQUNLTElHSFRfTEVWRUwJCQkweDMxCkBAIC01NjUsMTYgKzU2NSwxNiBAQAogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9BTUJJRU5UX0xJR0hUCQkJMHgzMwogc3RydWN0IHNkdm9fZ2V0X2FtYmllbnRfbGlnaHRfcmVwbHkgewotICAgIHUxNiB0cmlwX2xvdzsKLSAgICB1MTYgdHJpcF9oaWdoOwotICAgIHUxNiB2YWx1ZTsKKwl1MTYgdHJpcF9sb3c7CisJdTE2IHRyaXBfaGlnaDsKKwl1MTYgdmFsdWU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2RlZmluZSBTRFZPX0NNRF9TRVRfQU1CSUVOVF9MSUdIVAkJCTB4MzQKIHN0cnVjdCBzZHZvX3NldF9hbWJpZW50X2xpZ2h0X3JlcGx5IHsKLSAgICB1MTYgdHJpcF9sb3c7Ci0gICAgdTE2IHRyaXBfaGlnaDsKLSAgICB1bnNpZ25lZCBpbnQgZW5hYmxlOjE7Ci0gICAgdW5zaWduZWQgaW50IHBhZDo3OworCXUxNiB0cmlwX2xvdzsKKwl1MTYgdHJpcF9oaWdoOworCXVuc2lnbmVkIGludCBlbmFibGU6MTsKKwl1bnNpZ25lZCBpbnQgcGFkOjc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBTZXQgZGlzcGxheSBwb3dlciBzdGF0ZSAqLwpAQCAtNTg2LDIzICs1ODYsMjMgQEAKIAogI2RlZmluZSBTRFZPX0NNRF9HRVRfU1VQUE9SVEVEX0VOSEFOQ0VNRU5UUwkJMHg4NAogc3RydWN0IGludGVsX3Nkdm9fZW5oYW5jZW1lbnRzX3JlcGx5IHsKLSAgICB1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXJfYWRhcHRpdmU6MTsKLSAgICB1bnNpZ25lZCBpbnQgZmxpY2tlcl9maWx0ZXJfMmQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2F0dXJhdGlvbjoxOwotICAgIHVuc2lnbmVkIGludCBodWU6MTsKLSAgICB1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzczoxOwotICAgIHVuc2lnbmVkIGludCBjb250cmFzdDoxOwotICAgIHVuc2lnbmVkIGludCBvdmVyc2Nhbl9oOjE7CisJdW5zaWduZWQgaW50IGZsaWNrZXJfZmlsdGVyOjE7CisJdW5zaWduZWQgaW50IGZsaWNrZXJfZmlsdGVyX2FkYXB0aXZlOjE7CisJdW5zaWduZWQgaW50IGZsaWNrZXJfZmlsdGVyXzJkOjE7CisJdW5zaWduZWQgaW50IHNhdHVyYXRpb246MTsKKwl1bnNpZ25lZCBpbnQgaHVlOjE7CisJdW5zaWduZWQgaW50IGJyaWdodG5lc3M6MTsKKwl1bnNpZ25lZCBpbnQgY29udHJhc3Q6MTsKKwl1bnNpZ25lZCBpbnQgb3ZlcnNjYW5faDoxOwogCi0gICAgdW5zaWduZWQgaW50IG92ZXJzY2FuX3Y6MTsKLSAgICB1bnNpZ25lZCBpbnQgaHBvczoxOwotICAgIHVuc2lnbmVkIGludCB2cG9zOjE7Ci0gICAgdW5zaWduZWQgaW50IHNoYXJwbmVzczoxOwotICAgIHVuc2lnbmVkIGludCBkb3RfY3Jhd2w6MTsKLSAgICB1bnNpZ25lZCBpbnQgZGl0aGVyOjE7Ci0gICAgdW5zaWduZWQgaW50IHR2X2Nocm9tYV9maWx0ZXI6MTsKLSAgICB1bnNpZ25lZCBpbnQgdHZfbHVtYV9maWx0ZXI6MTsKKwl1bnNpZ25lZCBpbnQgb3ZlcnNjYW5fdjoxOworCXVuc2lnbmVkIGludCBocG9zOjE7CisJdW5zaWduZWQgaW50IHZwb3M6MTsKKwl1bnNpZ25lZCBpbnQgc2hhcnBuZXNzOjE7CisJdW5zaWduZWQgaW50IGRvdF9jcmF3bDoxOworCXVuc2lnbmVkIGludCBkaXRoZXI6MTsKKwl1bnNpZ25lZCBpbnQgdHZfY2hyb21hX2ZpbHRlcjoxOworCXVuc2lnbmVkIGludCB0dl9sdW1hX2ZpbHRlcjoxOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogUGljdHVyZSBlbmhhbmNlbWVudCBsaW1pdHMgYmVsb3cgYXJlIGRlcGVuZGVudCBvbiB0aGUgY3VycmVudCBUViBmb3JtYXQsCkBAIC02MjMsOCArNjIzLDggQEAKICNkZWZpbmUgU0RWT19DTURfR0VUX01BWF9UVl9DSFJPTUFfRklMVEVSCQkweDc0CiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9NQVhfVFZfTFVNQV9GSUxURVIJCQkweDc3CiBzdHJ1Y3QgaW50ZWxfc2R2b19lbmhhbmNlbWVudF9saW1pdHNfcmVwbHkgewotICAgIHUxNiBtYXhfdmFsdWU7Ci0gICAgdTE2IGRlZmF1bHRfdmFsdWU7CisJdTE2IG1heF92YWx1ZTsKKwl1MTYgZGVmYXVsdF92YWx1ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKICNkZWZpbmUgU0RWT19DTURfR0VUX0xWRFNfUEFORUxfSU5GT1JNQVRJT04JCTB4N2YKQEAgLTY2NSw4ICs2NjUsOCBAQAogI2RlZmluZSBTRFZPX0NNRF9HRVRfVFZfTFVNQV9GSUxURVIJCQkweDc4CiAjZGVmaW5lIFNEVk9fQ01EX1NFVF9UVl9MVU1BX0ZJTFRFUgkJCTB4NzkKIHN0cnVjdCBpbnRlbF9zZHZvX2VuaGFuY2VtZW50c19hcmcgewotICAgIHUxNiB2YWx1ZTsKLX1fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl1MTYgdmFsdWU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNEVk9fQ01EX0dFVF9ET1RfQ1JBV0wJCQkJMHg3MAogI2RlZmluZSBTRFZPX0NNRF9TRVRfRE9UX0NSQVdMCQkJCTB4NzEKQEAgLTcxNyw3ICs3MTcsNyBAQAogI2RlZmluZSBTRFZPX0NNRF9HRVRfQVVESU9fVFhfSU5GTwkweDljCiAjZGVmaW5lIFNEVk9fTkVFRF9UT19TVEFMTCAgKDEgPDwgNykKIAotc3RydWN0IGludGVsX3Nkdm9fZW5jb2RlewotICAgIHU4IGR2aV9yZXY7Ci0gICAgdTggaGRtaV9yZXY7CitzdHJ1Y3QgaW50ZWxfc2R2b19lbmNvZGUgeworCXU4IGR2aV9yZXY7CisJdTggaGRtaV9yZXY7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCmluZGV4IDIxMGQ1NzAuLmYzYzZhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwpAQCAtMTk0LDEwICsxOTQsMTAgQEAKICAqCiAgKiAgICAgaWYgKGYgPj0gMSkgewogICogICAgICAgICBleHAgPSAweDc7Ci0gKiAJICAgbWFudCA9IDEgPDwgODsKKyAqCSAgIG1hbnQgPSAxIDw8IDg7CiAgKiAgICAgfSBlbHNlIHsKICAqICAgICAgICAgZm9yIChleHAgPSAwOyBleHAgPCAzICYmIGYgPCAwLjU7IGV4cCsrKQotICogCSAgICAgICBmICo9IDIuMDsKKyAqCSAgIGYgKj0gMi4wOwogICogICAgICAgICBtYW50ID0gKGYgKiAoMSA8PCA5KSArIDAuNSk7CiAgKiAgICAgICAgIGlmIChtYW50ID49ICgxIDw8IDkpKQogICogICAgICAgICAgICAgbWFudCA9ICgxIDw8IDkpIC0gMTsKQEAgLTQzMCw3ICs0MzAsNyBAQAogCQkudnN5bmNfc3RhcnRfZjEJPSA2LAkJICAgIC52c3luY19zdGFydF9mMgk9IDcsCiAJCS52c3luY19sZW4JPSA2LAogCi0JCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDAsCisJCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxCT0gMCwKIAkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCiAKIAkJLnZpX2VuZF9mMQk9IDIwLAkJICAgIC52aV9lbmRfZjIJCT0gMjEsCkBAIC00NzIsNyArNDcyLDcgQEAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gNiwJCSAgICAudnN5bmNfc3RhcnRfZjIJPSA3LAogCQkudnN5bmNfbGVuCT0gNiwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSAwLAorCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMQk9IDAsCiAJCS52ZXFfc3RhcnRfZjIJPSAxLAkJICAgIC52ZXFfbGVuCQk9IDE4LAogCiAJCS52aV9lbmRfZjEJPSAyMCwJCSAgICAudmlfZW5kX2YyCQk9IDIxLApAQCAtNTE1LDcgKzUxNSw3IEBACiAJCS52c3luY19zdGFydF9mMQk9IDYsCSAgICAudnN5bmNfc3RhcnRfZjIJPSA3LAogCQkudnN5bmNfbGVuCT0gNiwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSAwLAorCQkudmVxX2VuYSAgICAgID0gdHJ1ZSwJICAgIC52ZXFfc3RhcnRfZjEJPSAwLAogCQkudmVxX3N0YXJ0X2YyID0gMSwJICAgIC52ZXFfbGVuCQk9IDE4LAogCiAJCS52aV9lbmRfZjEJPSAyMCwJCSAgICAudmlfZW5kX2YyCQk9IDIxLApAQCAtNTU4LDcgKzU1OCw3IEBACiAJCS52c3luY19zdGFydF9mMQk9IDYsCQkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNywKIAkJLnZzeW5jX2xlbgk9IDYsCiAKLQkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSAwLAogCQkudmVxX3N0YXJ0X2YyCT0gMSwJCSAgICAudmVxX2xlbgkJPSAxOCwKIAogCQkudmlfZW5kX2YxCT0gMjAsCQkgICAgLnZpX2VuZF9mMgkJPSAyMSwKQEAgLTYwMiwxNCArNjAyLDE0IEBACiAJCS52c3luY19zdGFydF9mMQk9IDYsCSAgIC52c3luY19zdGFydF9mMgk9IDcsCiAJCS52c3luY19sZW4JPSA2LAogCi0JCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxICAgIAk9IDAsCisJCS52ZXFfZW5hCT0gdHJ1ZSwJCSAgICAudmVxX3N0YXJ0X2YxCT0gMCwKIAkJLnZlcV9zdGFydF9mMgk9IDEsCQkgICAgLnZlcV9sZW4JCT0gMTgsCiAKIAkJLnZpX2VuZF9mMQk9IDI0LAkJICAgIC52aV9lbmRfZjIJCT0gMjUsCiAJCS5uYnJfZW5kCT0gMjg2LAogCiAJCS5idXJzdF9lbmEJPSB0cnVlLAotCQkuaGJ1cnN0X3N0YXJ0ID0gNzMsCSAgICAJICAgIC5oYnVyc3RfbGVuCQk9IDM0LAorCQkuaGJ1cnN0X3N0YXJ0ID0gNzMsCSAgICAuaGJ1cnN0X2xlbgkJPSAzNCwKIAkJLnZidXJzdF9zdGFydF9mMSA9IDgsCSAgICAudmJ1cnN0X2VuZF9mMQk9IDI4NSwKIAkJLnZidXJzdF9zdGFydF9mMiA9IDgsCSAgICAudmJ1cnN0X2VuZF9mMgk9IDI4NiwKIAkJLnZidXJzdF9zdGFydF9mMyA9IDksCSAgICAudmJ1cnN0X2VuZF9mMwk9IDI4NiwKQEAgLTY0Niw3ICs2NDYsNyBAQAogCQkudnN5bmNfc3RhcnRfZjEJPSA1LAkgICAgLnZzeW5jX3N0YXJ0X2YyCT0gNiwKIAkJLnZzeW5jX2xlbgk9IDUsCiAKLQkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gMCwKKwkJLnZlcV9lbmEJPSB0cnVlLAkgICAgLnZlcV9zdGFydF9mMQk9IDAsCiAJCS52ZXFfc3RhcnRfZjIJPSAxLAkgICAgLnZlcV9sZW4JCT0gMTUsCiAKIAkJLnZpX2VuZF9mMQk9IDI0LAkJICAgIC52aV9lbmRfZjIJCT0gMjUsCkBAIC02NzUsNyArNjc1LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUgICAgICAgPSAiNDgwcEA1OS45NEh6IiwKLQkJLmNsb2NrIAk9IDEwNzUyMCwKKwkJLmNsb2NrCQk9IDEwNzUyMCwKIAkJLnJlZnJlc2gJPSA1OTk0MCwKIAkJLm92ZXJzYW1wbGUgICAgID0gVFZfT1ZFUlNBTVBMRV80WCwKIAkJLmNvbXBvbmVudF9vbmx5ID0gMSwKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA2NCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMTIyLAogCQkuaGJsYW5rX3N0YXJ0ICAgPSA4NDIsICAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gODU3LAogCi0JCS5wcm9ncmVzc2l2ZSAgICA9IHRydWUsLnRyaWxldmVsX3N5bmMgPSBmYWxzZSwKKwkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwJCSAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDEyLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMiwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTIsCkBAIC02OTksNyArNjk5LDcgQEAKIAl9LAogCXsKIAkJLm5hbWUgICAgICAgPSAiNDgwcEA2MEh6IiwKLQkJLmNsb2NrIAk9IDEwNzUyMCwKKwkJLmNsb2NrCQk9IDEwNzUyMCwKIAkJLnJlZnJlc2gJPSA2MDAwMCwKIAkJLm92ZXJzYW1wbGUgICAgID0gVFZfT1ZFUlNBTVBMRV80WCwKIAkJLmNvbXBvbmVudF9vbmx5ID0gMSwKQEAgLTcwNyw3ICs3MDcsNyBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA2NCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMTIyLAogCQkuaGJsYW5rX3N0YXJ0ICAgPSA4NDIsICAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gODU2LAogCi0JCS5wcm9ncmVzc2l2ZSAgICA9IHRydWUsLnRyaWxldmVsX3N5bmMgPSBmYWxzZSwKKwkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwJCSAgICAudHJpbGV2ZWxfc3luYyA9IGZhbHNlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDEyLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMiwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTIsCkBAIC03MjMsNyArNzIzLDcgQEAKIAl9LAogCXsKIAkJLm5hbWUgICAgICAgPSAiNTc2cCIsCi0JCS5jbG9jayAJPSAxMDc1MjAsCisJCS5jbG9jawkJPSAxMDc1MjAsCiAJCS5yZWZyZXNoCT0gNTAwMDAsCiAJCS5vdmVyc2FtcGxlICAgICA9IFRWX09WRVJTQU1QTEVfNFgsCiAJCS5jb21wb25lbnRfb25seSA9IDEsCkBAIC03NTUsNyArNzU1LDcgQEAKIAkJLmhzeW5jX2VuZCAgICAgID0gODAsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDMwMCwKIAkJLmhibGFua19zdGFydCAgID0gMTU4MCwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDE2NDksCiAKLQkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwgCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCisJCS5wcm9ncmVzc2l2ZQk9IHRydWUsCQkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDEwLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMCwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTAsCkBAIC03NzksNyArNzc5LDcgQEAKIAkJLmhzeW5jX2VuZCAgICAgID0gODAsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDMwMCwKIAkJLmhibGFua19zdGFydCAgID0gMTU4MCwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDE2NTEsCiAKLQkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwgCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCisJCS5wcm9ncmVzc2l2ZQk9IHRydWUsCQkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDEwLCAgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSAxMCwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTAsCkBAIC04MDMsNyArODAzLDcgQEAKIAkJLmhzeW5jX2VuZCAgICAgID0gODAsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDMwMCwKIAkJLmhibGFua19zdGFydCAgID0gMTU4MCwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDE5NzksCiAKLQkJLnByb2dyZXNzaXZlICAgID0gdHJ1ZSwgCSAgICAgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCQkucHJvZ3Jlc3NpdmUJPSB0cnVlLAkJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKIAogCQkudnN5bmNfc3RhcnRfZjEgPSAxMCwgICAgICAgICAgICAgICAudnN5bmNfc3RhcnRfZjIgICAgID0gMTAsCiAJCS52c3luY19sZW4gICAgICA9IDEwLApAQCAtODI4LDEyICs4MjgsMTIgQEAKIAkJLmhzeW5jX2VuZCAgICAgID0gODgsICAgICAgICAgICAgICAgLmhibGFua19lbmQgICAgICAgICA9IDIzNSwKIAkJLmhibGFua19zdGFydCAgID0gMjE1NSwgICAgICAgICAgICAgLmh0b3RhbCAgICAgICAgICAgICA9IDI2MzksCiAKLQkJLnByb2dyZXNzaXZlICAgID0gZmFsc2UsIAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAorCQkucHJvZ3Jlc3NpdmUJPSBmYWxzZSwJICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gNCwgICAgICAgICAgICAgIC52c3luY19zdGFydF9mMiAgICAgPSA1LAogCQkudnN5bmNfbGVuICAgICAgPSAxMCwKIAotCQkudmVxX2VuYQk9IHRydWUsCQkgICAgLnZlcV9zdGFydF9mMSAgICAJPSA0LAorCQkudmVxX2VuYQk9IHRydWUsCSAgICAudmVxX3N0YXJ0X2YxCT0gNCwKIAkJLnZlcV9zdGFydF9mMiAgID0gNCwJICAgIC52ZXFfbGVuCQk9IDEwLAogCiAKQEAgLTg1NCwxMiArODU0LDEyIEBACiAJCS5oc3luY19lbmQgICAgICA9IDg4LCAgICAgICAgICAgICAgIC5oYmxhbmtfZW5kICAgICAgICAgPSAyMzUsCiAJCS5oYmxhbmtfc3RhcnQgICA9IDIxNTUsICAgICAgICAgICAgIC5odG90YWwgICAgICAgICAgICAgPSAyMTk5LAogCi0JCS5wcm9ncmVzc2l2ZSAgICA9IGZhbHNlLCAJICAgIC50cmlsZXZlbF9zeW5jID0gdHJ1ZSwKKwkJLnByb2dyZXNzaXZlCT0gZmFsc2UsCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCiAKIAkJLnZzeW5jX3N0YXJ0X2YxID0gNCwgICAgICAgICAgICAgICAudnN5bmNfc3RhcnRfZjIgICAgID0gNSwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTAsCiAKLQkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEgICAgCT0gNCwKKwkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSA0LAogCQkudmVxX3N0YXJ0X2YyCT0gNCwJCSAgICAudmVxX2xlbgkJPSAxMCwKIAogCkBAIC04ODAsMTYgKzg4MCwxNiBAQAogCQkuaHN5bmNfZW5kICAgICAgPSA4OCwgICAgICAgICAgICAgICAuaGJsYW5rX2VuZCAgICAgICAgID0gMjM1LAogCQkuaGJsYW5rX3N0YXJ0ICAgPSAyMTU1LCAgICAgICAgICAgICAuaHRvdGFsICAgICAgICAgICAgID0gMjIwMSwKIAotCQkucHJvZ3Jlc3NpdmUgICAgPSBmYWxzZSwgCSAgICAudHJpbGV2ZWxfc3luYyA9IHRydWUsCisJCS5wcm9ncmVzc2l2ZQk9IGZhbHNlLAkgICAgLnRyaWxldmVsX3N5bmMgPSB0cnVlLAogCiAJCS52c3luY19zdGFydF9mMSA9IDQsICAgICAgICAgICAgLnZzeW5jX3N0YXJ0X2YyICAgID0gNSwKIAkJLnZzeW5jX2xlbiAgICAgID0gMTAsCiAKIAkJLnZlcV9lbmEJPSB0cnVlLAkJICAgIC52ZXFfc3RhcnRfZjEJPSA0LAotCQkudmVxX3N0YXJ0X2YyID0gNCwJICAgIAkgICAgLnZlcV9sZW4gPSAxMCwKKwkJLnZlcV9zdGFydF9mMgk9IDQsCQkudmVxX2xlbgkgID0gMTAsCiAKIAotCQkudmlfZW5kX2YxICAgICAgPSAyMSwgICAgICAgICAgIC52aV9lbmRfZjIgICAgICAgICAJPSAyMiwKKwkJLnZpX2VuZF9mMQk9IDIxLAkJLnZpX2VuZF9mMgkgID0gMjIsCiAJCS5uYnJfZW5kICAgICAgICA9IDUzOSwKIAogCQkuYnVyc3RfZW5hICAgICAgPSBmYWxzZSwKQEAgLTkxNiw3ICs5MTYsNyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCXN3aXRjaChtb2RlKSB7CisJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgogCQlJOTE1X1dSSVRFKFRWX0NUTCwgSTkxNV9SRUFEKFRWX0NUTCkgfCBUVl9FTkNfRU5BQkxFKTsKIAkJYnJlYWs7CkBAIC05MzMsNyArOTMzLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZfbW9kZXMpIC8gc2l6ZW9mICh0dl9tb2Rlc1swXSk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHZfbW9kZXMpIC8gc2l6ZW9mKHR2X21vZGVzWzBdKTsgaSsrKSB7CiAJCWNvbnN0IHN0cnVjdCB0dl9tb2RlICp0dl9tb2RlID0gJnR2X21vZGVzW2ldOwogCiAJCWlmICghc3RyY21wKHR2X2Zvcm1hdCwgdHZfbW9kZS0+bmFtZSkpCkBAIC0xMTI4LDcgKzExMjgsNyBAQAogCWlmIChjb2xvcl9jb252ZXJzaW9uKSB7CiAJCUk5MTVfV1JJVEUoVFZfQ1NDX1ksIChjb2xvcl9jb252ZXJzaW9uLT5yeSA8PCAxNikgfAogCQkJICAgY29sb3JfY29udmVyc2lvbi0+Z3kpOwotCQlJOTE1X1dSSVRFKFRWX0NTQ19ZMiwoY29sb3JfY29udmVyc2lvbi0+YnkgPDwgMTYpIHwKKwkJSTkxNV9XUklURShUVl9DU0NfWTIsIChjb2xvcl9jb252ZXJzaW9uLT5ieSA8PCAxNikgfAogCQkJICAgY29sb3JfY29udmVyc2lvbi0+YXkpOwogCQlJOTE1X1dSSVRFKFRWX0NTQ19VLCAoY29sb3JfY29udmVyc2lvbi0+cnUgPDwgMTYpIHwKIAkJCSAgIGNvbG9yX2NvbnZlcnNpb24tPmd1KTsKQEAgLTEyMzIsNyArMTIzMiw3IEBACiAgKiBccmV0dXJuIGZhbHNlIGlmIFRWIGlzIGRpc2Nvbm5lY3RlZC4KICAqLwogc3RhdGljIGludAotaW50ZWxfdHZfZGV0ZWN0X3R5cGUgKHN0cnVjdCBpbnRlbF90diAqaW50ZWxfdHYsCitpbnRlbF90dl9kZXRlY3RfdHlwZShzdHJ1Y3QgaW50ZWxfdHYgKmludGVsX3R2LAogCQkgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZpbnRlbF90di0+YmFzZS5iYXNlOwpAQCAtMTQ4Niw3ICsxNDg2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWludGVsX3R2X2Rlc3Ryb3kgKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCitpbnRlbF90dl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoY29ubmVjdG9yKTsKIAlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmMKaW5kZXggNDJkMzE4Ny4uMzNkYWEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2FfZHJ2LmMKQEAgLTI5LDYgKzI5LDggQEAKICAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAibWdhX2RybS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffd2FycC5jIGIvZHJpdmVycy9ncHUvZHJtL21nYS9tZ2Ffd2FycC5jCmluZGV4IGYxNzJiZDUuLjcyMmE5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZ2EvbWdhX3dhcnAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWdhL21nYV93YXJwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2loZXguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKaW5kZXggMDU4MzY3Ny4uMzVlZjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKQEAgLTIxLDE2ICsyMSwxNyBAQAogICAgICAgICAgICAgIG52NDBfZ3JjdHgubyBudjUwX2dyY3R4Lm8gbnZjMF9ncmN0eC5vIFwKICAgICAgICAgICAgICBudjg0X2NyeXB0Lm8gXAogICAgICAgICAgICAgIG52YTNfY29weS5vIG52YzBfY29weS5vIFwKLSAgICAgICAgICAgICBudjQwX21wZWcubyBudjUwX21wZWcubyBcCisgICAgICAgICAgICAgbnYzMV9tcGVnLm8gbnY1MF9tcGVnLm8gXAogICAgICAgICAgICAgIG52MDRfaW5zdG1lbS5vIG52NTBfaW5zdG1lbS5vIG52YzBfaW5zdG1lbS5vIFwKLSAgICAgICAgICAgICBudjUwX2V2by5vIG52NTBfY3J0Yy5vIG52NTBfZGFjLm8gbnY1MF9zb3IubyBcCi0gICAgICAgICAgICAgbnY1MF9jdXJzb3IubyBudjUwX2Rpc3BsYXkubyBcCiAgICAgICAgICAgICAgbnYwNF9kYWMubyBudjA0X2RmcC5vIG52MDRfdHYubyBudjE3X3R2Lm8gbnYxN190dl9tb2Rlcy5vIFwKICAgICAgICAgICAgICBudjA0X2NydGMubyBudjA0X2Rpc3BsYXkubyBudjA0X2N1cnNvci5vIFwKKyAgICAgICAgICAgICBudjUwX2V2by5vIG52NTBfY3J0Yy5vIG52NTBfZGFjLm8gbnY1MF9zb3IubyBcCisgICAgICAgICAgICAgbnY1MF9jdXJzb3IubyBudjUwX2Rpc3BsYXkubyBcCisgICAgICAgICAgICAgbnZkMF9kaXNwbGF5Lm8gXAogICAgICAgICAgICAgIG52MDRfZmJjb24ubyBudjUwX2ZiY29uLm8gbnZjMF9mYmNvbi5vIFwKICAgICAgICAgICAgICBudjEwX2dwaW8ubyBudjUwX2dwaW8ubyBcCiAJICAgICBudjUwX2NhbGMubyBcCi0JICAgICBudjA0X3BtLm8gbnY1MF9wbS5vIG52YTNfcG0ubyBcCisJICAgICBudjA0X3BtLm8gbnY0MF9wbS5vIG52NTBfcG0ubyBudmEzX3BtLm8gbnZjMF9wbS5vIFwKIAkgICAgIG52NTBfdnJhbS5vIG52YzBfdnJhbS5vIFwKIAkgICAgIG52NTBfdm0ubyBudmMwX3ZtLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmFja2xpZ2h0LmMKaW5kZXggMDBhNTVkZi4uZmEyMmIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jCkBAIC0zNyw4ICszNywxMCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X3JlZy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgogCi1zdGF0aWMgaW50IG52NDBfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCitzdGF0aWMgaW50CitudjQwX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibF9nZXRfZGF0YShiZCk7CiAJaW50IHZhbCA9IChudl9yZDMyKGRldiwgTlY0MF9QTUNfQkFDS0xJR0hUKSAmIE5WNDBfUE1DX0JBQ0tMSUdIVF9NQVNLKQpAQCAtNDcsNyArNDksOCBAQAogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBpbnQgbnY0MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3N0YXRpYyBpbnQKK252NDBfc2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKIAlpbnQgdmFsID0gYmQtPnByb3BzLmJyaWdodG5lc3M7CkBAIC02NSwzMCArNjgsOCBAQAogCS51cGRhdGVfc3RhdHVzID0gbnY0MF9zZXRfaW50ZW5zaXR5LAogfTsKIAotc3RhdGljIGludCBudjUwX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibF9nZXRfZGF0YShiZCk7Ci0KLQlyZXR1cm4gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVCk7Ci19Ci0KLXN0YXRpYyBpbnQgbnY1MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxfZ2V0X2RhdGEoYmQpOwotCWludCB2YWwgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKLQotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9CQUNLTElHSFQsCi0JCXZhbCB8IE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVF9FTkFCTEUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY1MF9ibF9vcHMgPSB7Ci0JLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCi0JLmdldF9icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5LAotCS51cGRhdGVfc3RhdHVzID0gbnY1MF9zZXRfaW50ZW5zaXR5LAotfTsKLQotc3RhdGljIGludCBub3V2ZWF1X252NDBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3N0YXRpYyBpbnQKK252NDBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExMywzNCArOTQsMTI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbm91dmVhdV9udjUwX2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCitzdGF0aWMgaW50CitudjUwX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBibF9nZXRfZGF0YShiZCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2VuY29kZXItPmJhc2UuYmFzZS5kZXY7CisJaW50IG9yID0gbnZfZW5jb2Rlci0+b3I7CisJdTMyIGRpdiA9IDEwMjU7CisJdTMyIHZhbDsKKworCXZhbCAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChvcikpOworCXZhbCAmPSBOVjUwX1BESVNQX1NPUl9QV01fQ1RMX1ZBTDsKKwlyZXR1cm4gKCh2YWwgKiAxMDApICsgKGRpdiAvIDIpKSAvIGRpdjsKK30KKworc3RhdGljIGludAorbnY1MF9zZXRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gYmxfZ2V0X2RhdGEoYmQpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9lbmNvZGVyLT5iYXNlLmJhc2UuZGV2OworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBkaXYgPSAxMDI1OworCXUzMiB2YWwgPSAoYmQtPnByb3BzLmJyaWdodG5lc3MgKiBkaXYpIC8gMTAwOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BfU09SX1BXTV9DVEwob3IpLAorCQkgICAgIE5WNTBfUERJU1BfU09SX1BXTV9DVExfTkVXIHwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG52NTBfYmxfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS5nZXRfYnJpZ2h0bmVzcyA9IG52NTBfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyA9IG52NTBfc2V0X2ludGVuc2l0eSwKK307CisKK3N0YXRpYyBpbnQKK252YTNfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IGJsX2dldF9kYXRhKGJkKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfZW5jb2Rlci0+YmFzZS5iYXNlLmRldjsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKwl1MzIgZGl2LCB2YWw7CisKKwlkaXYgID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BfU09SX1BXTV9ESVYob3IpKTsKKwl2YWwgID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BfU09SX1BXTV9DVEwob3IpKTsKKwl2YWwgJj0gTlZBM19QRElTUF9TT1JfUFdNX0NUTF9WQUw7CisJaWYgKGRpdiAmJiBkaXYgPj0gdmFsKQorCQlyZXR1cm4gKCh2YWwgKiAxMDApICsgKGRpdiAvIDIpKSAvIGRpdjsKKworCXJldHVybiAxMDA7Cit9CisKK3N0YXRpYyBpbnQKK252YTNfc2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IGJsX2dldF9kYXRhKGJkKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfZW5jb2Rlci0+YmFzZS5iYXNlLmRldjsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKwl1MzIgZGl2LCB2YWw7CisKKwlkaXYgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0RJVihvcikpOworCXZhbCA9IChiZC0+cHJvcHMuYnJpZ2h0bmVzcyAqIGRpdikgLyAxMDA7CisJaWYgKGRpdikgeworCQludl93cjMyKGRldiwgTlY1MF9QRElTUF9TT1JfUFdNX0NUTChvciksIHZhbCB8CisJCQkgICAgIE5WNTBfUERJU1BfU09SX1BXTV9DVExfTkVXIHwKKwkJCSAgICAgTlZBM19QRElTUF9TT1JfUFdNX0NUTF9VTkspOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG52YTNfYmxfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS5nZXRfYnJpZ2h0bmVzcyA9IG52YTNfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyA9IG52YTNfc2V0X2ludGVuc2l0eSwKK307CisKK3N0YXRpYyBpbnQKK252NTBfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOwogCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgKm9wczsKIAotCWlmICghbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfU09SX0JBQ0tMSUdIVCkpCisJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcihjb25uZWN0b3IsIE9VVFBVVF9MVkRTKTsKKwlpZiAoIW52X2VuY29kZXIpIHsKKwkJbnZfZW5jb2RlciA9IGZpbmRfZW5jb2Rlcihjb25uZWN0b3IsIE9VVFBVVF9EUCk7CisJCWlmICghbnZfZW5jb2RlcikKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghbnZfcmQzMihkZXYsIE5WNTBfUERJU1BfU09SX1BXTV9DVEwobnZfZW5jb2Rlci0+b3IpKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPD0gMHhhMCB8fAorCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGFhIHx8CisJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4YWMpCisJCW9wcyA9ICZudjUwX2JsX29wczsKKwllbHNlCisJCW9wcyA9ICZudmEzX2JsX29wczsKKwogCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMpKTsKIAlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKLQlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IDEwMjU7Ci0JYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJudl9iYWNrbGlnaHQiLCAmY29ubmVjdG9yLT5rZGV2LCBkZXYsCi0JCQkJICAgICAgICZudjUwX2JsX29wcywgJnByb3BzKTsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IDEwMDsKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm52X2JhY2tsaWdodCIsICZjb25uZWN0b3ItPmtkZXYsCisJCQkJICAgICAgIG52X2VuY29kZXIsIG9wcywgJnByb3BzKTsKIAlpZiAoSVNfRVJSKGJkKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmQpOwogCiAJZGV2X3ByaXYtPmJhY2tsaWdodCA9IGJkOwotCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5KGJkKTsKKwliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IGJkLT5vcHMtPmdldF9icmlnaHRuZXNzKGJkKTsKIAliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCitpbnQKK25vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKIAlpZiAoYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpKSB7CkBAIC0xNTAsMjEgKzIyNiwyOCBAQAogCX0KICNlbmRpZgogCi0Jc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JY2FzZSBOVl80MDoKLQkJcmV0dXJuIG5vdXZlYXVfbnY0MF9iYWNrbGlnaHRfaW5pdChjb25uZWN0b3IpOwotCWNhc2UgTlZfNTA6Ci0JCXJldHVybiBub3V2ZWF1X252NTBfYmFja2xpZ2h0X2luaXQoY29ubmVjdG9yKTsKLQlkZWZhdWx0OgotCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMgJiYKKwkJICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgeworCQljYXNlIE5WXzQwOgorCQkJcmV0dXJuIG52NDBfYmFja2xpZ2h0X2luaXQoY29ubmVjdG9yKTsKKwkJY2FzZSBOVl81MDoKKwkJCXJldHVybiBudjUwX2JhY2tsaWdodF9pbml0KGNvbm5lY3Rvcik7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KIAorCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQordm9pZAorbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJaWYgKGRldl9wcml2LT5iYWNrbGlnaHQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMKaW5kZXggYjMxMWZhYi4uNWZjMjAxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMKQEAgLTI5Niw2ICsyOTYsMTEgQEAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQogCQlyZXR1cm4gcmVnOwogCisJaWYgKHJlZyAmIDB4ODAwMDAwMDApIHsKKwkJQlVHX09OKGJpb3MtPmRpc3BsYXkuY3J0YyA8IDApOworCQlyZWcgKz0gYmlvcy0+ZGlzcGxheS5jcnRjICogMHg4MDA7CisJfQorCiAJaWYgKHJlZyAmIDB4NDAwMDAwMDApIHsKIAkJQlVHX09OKCFkY2JlbnQpOwogCkBAIC0zMDQsNyArMzA5LDcgQEAKIAkJCXJlZyArPSAweDAwMDAwMDgwOwogCX0KIAotCXJlZyAmPSB+MHg2MDAwMDAwMDsKKwlyZWcgJj0gfjB4ZTAwMDAwMDA7CiAJcmV0dXJuIHJlZzsKIH0KIApAQCAtNjM1LDEwICs2NDAsOSBAQAogbnY1MF9wbGxfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgY2xrKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdWludDMyX3QgcmVnMCA9IG52X3JkMzIoZGV2LCByZWcgKyAwKTsKLQl1aW50MzJfdCByZWcxID0gbnZfcmQzMihkZXYsIHJlZyArIDQpOwogCXN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHBsbDsKIAlzdHJ1Y3QgcGxsX2xpbXMgcGxsX2xpbWl0czsKKwl1MzIgY3RybCwgbWFzaywgY29lZjsKIAlpbnQgcmV0OwogCiAJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCByZWcsICZwbGxfbGltaXRzKTsKQEAgLTY0OSwxNSArNjUzLDIwIEBACiAJaWYgKCFjbGspCiAJCXJldHVybiAtRVJBTkdFOwogCi0JcmVnMCA9IChyZWcwICYgMHhmZmY4ZmZmZikgfCAocGxsLmxvZzJQIDw8IDE2KTsKLQlyZWcxID0gKHJlZzEgJiAweGZmZmYwMDAwKSB8IChwbGwuTjEgPDwgOCkgfCBwbGwuTTE7Ci0KLQlpZiAoZGV2X3ByaXYtPnZiaW9zLmV4ZWN1dGUpIHsKLQkJc3RpbGxfYWxpdmUoKTsKLQkJbnZfd3IzMihkZXYsIHJlZyArIDQsIHJlZzEpOwotCQludl93cjMyKGRldiwgcmVnICsgMCwgcmVnMCk7CisJY29lZiA9IHBsbC5OMSA8PCA4IHwgcGxsLk0xOworCWN0cmwgPSBwbGwubG9nMlAgPDwgMTY7CisJbWFzayA9IDB4MDAwNzAwMDA7CisJaWYgKHJlZyA9PSAweDAwNDAwOCkgeworCQltYXNrIHw9IDB4MDFmODAwMDA7CisJCWN0cmwgfD0gKHBsbF9saW1pdHMubG9nMnBfYmlhcyA8PCAxOSk7CisJCWN0cmwgfD0gKHBsbC5sb2cyUCA8PCAyMik7CiAJfQogCisJaWYgKCFkZXZfcHJpdi0+dmJpb3MuZXhlY3V0ZSkKKwkJcmV0dXJuIDA7CisKKwludl9tYXNrKGRldiwgcmVnICsgMCwgbWFzaywgY3RybCk7CisJbnZfd3IzMihkZXYsIHJlZyArIDQsIGNvZWYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTc0LDIyICsxMTgzLDE5IEBACiAJICoKIAkgKi8KIAotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlID0gTlVMTDsKIAlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSBiaW9zLT5kaXNwbGF5Lm91dHB1dDsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmlvcy0+ZGV2OwogCXVpbnQ4X3QgY29uZCA9IGJpb3MtPmRhdGFbb2Zmc2V0ICsgMV07Ci0JaW50IGR1bW15OworCXVpbnQ4X3QgKnRhYmxlLCAqZW50cnk7CiAKIAlCSU9TTE9HKGJpb3MsICIweCUwNFg6IHN1Ym9wIDB4JTAyWFxuIiwgb2Zmc2V0LCBjb25kKTsKIAogCWlmICghaWV4ZWMtPmV4ZWN1dGUpCiAJCXJldHVybiAzOwogCi0JZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgZGNiLCAmZHVtbXkpOwotCWlmICghZHBlKSB7Ci0JCU5WX0VSUk9SKGRldiwgIjB4JTA0WDogSU5JVF8zQTogbm8gZW5jb2RlciB0YWJsZSEhXG4iLCBvZmZzZXQpOworCXRhYmxlID0gbm91dmVhdV9kcF9iaW9zX2RhdGEoZGV2LCBkY2IsICZlbnRyeSk7CisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIDM7Ci0JfQogCiAJc3dpdGNoIChjb25kKSB7CiAJY2FzZSAwOgpAQCAtMTIwMyw3ICsxMjA5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAxOgogCWNhc2UgMjoKLQkJaWYgKCEoZHBlLT51bmtub3duICYgY29uZCkpCisJCWlmICghKGVudHJ5WzVdICYgY29uZCkpCiAJCQlpZXhlYy0+ZXhlY3V0ZSA9IGZhbHNlOwogCQlicmVhazsKIAljYXNlIDU6CkBAIC0zMjIxLDYgKzMyMjcsNDkgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQKK2luaXRfZ3Bpb191bmtudjUwKHN0cnVjdCBudmJpb3MgKmJpb3MsIHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbykKK3sKKwljb25zdCB1aW50MzJfdCBudjUwX2dwaW9fY3RsWzJdID0geyAweGUxMDAsIDB4ZTI4YyB9OworCXUzMiByLCBzLCB2OworCisJLyogTm90IGEgY2x1ZSwgbmVlZHMgZGUtbWFnaWNpbmcgKi8KKwlyID0gbnY1MF9ncGlvX2N0bFtncGlvLT5saW5lID4+IDRdOworCXMgPSAoZ3Bpby0+bGluZSAmIDB4MGYpOworCXYgPSBiaW9zX3JkMzIoYmlvcywgcikgJiB+KDB4MDAwMTAwMDEgPDwgcyk7CisJc3dpdGNoICgoZ3Bpby0+ZW50cnkgJiAweDA2MDAwMDAwKSA+PiAyNSkgeworCWNhc2UgMToKKwkJdiB8PSAoMHgwMDAwMDAwMSA8PCBzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl2IHw9ICgweDAwMDEwMDAwIDw8IHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwliaW9zX3dyMzIoYmlvcywgciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X2dwaW9fdW5rbnZkMChzdHJ1Y3QgbnZiaW9zICpiaW9zLCBzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW8pCit7CisJdTMyIHYsIGk7CisKKwl2ICA9IGJpb3NfcmQzMihiaW9zLCAweDAwZDYxMCArIChncGlvLT5saW5lICogNCkpOworCXYgJj0gMHhmZmZmZmYwMDsKKwl2IHw9IChncGlvLT5lbnRyeSAmIDB4MDBmZjAwMDApID4+IDE2OworCWJpb3Nfd3IzMihiaW9zLCAweDAwZDYxMCArIChncGlvLT5saW5lICogNCksIHYpOworCisJaSA9IChncGlvLT5lbnRyeSAmIDB4MWYwMDAwMDApID4+IDI0OworCWlmIChpKSB7CisJCXYgID0gYmlvc19yZDMyKGJpb3MsIDB4MDBkNjQwICsgKChpIC0gMSkgKiA0KSk7CisJCXYgJj0gMHhmZmZmZmYwMDsKKwkJdiB8PSBncGlvLT5saW5lOworCQliaW9zX3dyMzIoYmlvcywgMHgwMGQ2NDAgKyAoKGkgLSAxKSAqIDQpLCB2KTsKKwl9Cit9CisKIHN0YXRpYyBpbnQKIGluaXRfZ3BpbyhzdHJ1Y3QgbnZiaW9zICpiaW9zLCB1aW50MTZfdCBvZmZzZXQsIHN0cnVjdCBpbml0X2V4ZWMgKmlleGVjKQogewpAQCAtMzIzNSw3ICszMjg0LDYgQEAKIAogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGJpb3MtPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKLQljb25zdCB1aW50MzJfdCBudjUwX2dwaW9fY3RsWzJdID0geyAweGUxMDAsIDB4ZTI4YyB9OwogCWludCBpOwogCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewpAQCAtMzI0OCwzMyArMzI5NiwyMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGJpb3MtPmRjYi5ncGlvLmVudHJpZXM7IGkrKykgewogCQlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW8gPSAmYmlvcy0+ZGNiLmdwaW8uZW50cnlbaV07Ci0JCXVpbnQzMl90IHIsIHMsIHY7CiAKIAkJQklPU0xPRyhiaW9zLCAiMHglMDRYOiBFbnRyeTogMHglMDhYXG4iLCBvZmZzZXQsIGdwaW8tPmVudHJ5KTsKIAogCQlCSU9TTE9HKGJpb3MsICIweCUwNFg6IHNldCBncGlvIDB4JTAyeCwgc3RhdGUgJWRcbiIsCiAJCQlvZmZzZXQsIGdwaW8tPnRhZywgZ3Bpby0+c3RhdGVfZGVmYXVsdCk7Ci0JCWlmIChiaW9zLT5leGVjdXRlKQotCQkJcGdwaW8tPnNldChiaW9zLT5kZXYsIGdwaW8tPnRhZywgZ3Bpby0+c3RhdGVfZGVmYXVsdCk7CiAKLQkJLyogVGhlIE5WSURJQSBiaW5hcnkgZHJpdmVyIGRvZXNuJ3QgYXBwZWFyIHRvIGFjdHVhbGx5IGRvCi0JCSAqIGFueSBvZiB0aGlzLCBteSBWQklPUyBkb2VzIGhvd2V2ZXIuCi0JCSAqLwotCQkvKiBOb3QgYSBjbHVlLCBuZWVkcyBkZS1tYWdpY2luZyAqLwotCQlyID0gbnY1MF9ncGlvX2N0bFtncGlvLT5saW5lID4+IDRdOwotCQlzID0gKGdwaW8tPmxpbmUgJiAweDBmKTsKLQkJdiA9IGJpb3NfcmQzMihiaW9zLCByKSAmIH4oMHgwMDAxMDAwMSA8PCBzKTsKLQkJc3dpdGNoICgoZ3Bpby0+ZW50cnkgJiAweDA2MDAwMDAwKSA+PiAyNSkgewotCQljYXNlIDE6Ci0JCQl2IHw9ICgweDAwMDAwMDAxIDw8IHMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXYgfD0gKDB4MDAwMTAwMDAgPDwgcyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJpb3Nfd3IzMihiaW9zLCByLCB2KTsKKwkJaWYgKCFiaW9zLT5leGVjdXRlKQorCQkJY29udGludWU7CisKKwkJcGdwaW8tPnNldChiaW9zLT5kZXYsIGdwaW8tPnRhZywgZ3Bpby0+c3RhdGVfZGVmYXVsdCk7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfRDApCisJCQlpbml0X2dwaW9fdW5rbnY1MChiaW9zLCBncGlvKTsKKwkJZWxzZQorCQkJaW5pdF9ncGlvX3Vua252ZDAoYmlvcywgZ3Bpbyk7CiAJfQogCiAJcmV0dXJuIDE7CkBAIC0zNzM3LDYgKzM3NzIsMTAgQEAKIAlpbnQgY291bnQgPSAwLCBpLCByZXQ7CiAJdWludDhfdCBpZDsKIAorCS8qIGNhdGNoIE5VTEwgc2NyaXB0IHBvaW50ZXJzICovCisJaWYgKG9mZnNldCA9PSAwKQorCQlyZXR1cm4gMDsKKwogCS8qCiAJICogTG9vcCB1bnRpbCBJTklUX0RPTkUgY2F1c2VzIHVzIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcAogCSAqIChvciB1bnRpbCBvZmZzZXQgPiBiaW9zIGxlbmd0aCBqdXN0IGluIGNhc2UuLi4gKQpAQCAtNDM4OSw4NiArNDQyOCwzNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdWludDhfdCAqCi1iaW9zX291dHB1dF9jb25maWdfbWF0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LAotCQkJIHVpbnQxNl90IHJlY29yZCwgaW50IHJlY29yZF9sZW4sIGludCByZWNvcmRfbnIsCi0JCQkgYm9vbCBtYXRjaF9saW5rKQorLyogQklUICdVJy8nZCcgdGFibGUgZW5jb2RlciBzdWJ0YWJsZXMgaGF2ZSBoYXNoZXMgbWF0Y2hpbmcgdGhlbSB0bworICogYSBwYXJ0aWN1bGFyIHNldCBvZiBlbmNvZGVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgRENCIGVudHJ5IG1hdGNoZXMuCisgKi8KK2Jvb2wKK2Jpb3NfZW5jb2Rlcl9tYXRjaChzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IsIHUzMiBoYXNoKQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7Ci0JdWludDMyX3QgZW50cnk7Ci0JdWludDE2X3QgdGFibGU7Ci0JaW50IGksIHY7CisJaWYgKChoYXNoICYgMHgwMDAwMDBmMCkgIT0gKGRjYi0+bG9jYXRpb24gPDwgNCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoKGhhc2ggJiAweDAwMDAwMDBmKSAhPSBkY2ItPnR5cGUpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIShoYXNoICYgKGRjYi0+b3IgPDwgMTYpKSkKKwkJcmV0dXJuIGZhbHNlOwogCi0Jc3dpdGNoIChkY2JlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGRjYi0+dHlwZSkgewogCWNhc2UgT1VUUFVUX1RNRFM6CiAJY2FzZSBPVVRQVVRfTFZEUzoKIAljYXNlIE9VVFBVVF9EUDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbWF0Y2hfbGluayA9IGZhbHNlOwotCQlicmVhazsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmVjb3JkX25yOyBpKyssIHJlY29yZCArPSByZWNvcmRfbGVuKSB7Ci0JCXRhYmxlID0gUk9NMTYoYmlvcy0+ZGF0YVtyZWNvcmRdKTsKLQkJaWYgKCF0YWJsZSkKLQkJCWNvbnRpbnVlOwotCQllbnRyeSA9IFJPTTMyKGJpb3MtPmRhdGFbdGFibGVdKTsKLQotCQlpZiAobWF0Y2hfbGluaykgewotCQkJdiA9IChlbnRyeSAmIDB4MDBjMDAwMDApID4+IDIyOwotCQkJaWYgKCEodiAmIGRjYmVudC0+c29yY29uZi5saW5rKSkKLQkJCQljb250aW51ZTsKKwkJaWYgKGhhc2ggJiAweDAwYzAwMDAwKSB7CisJCQlpZiAoIShoYXNoICYgKGRjYi0+c29yY29uZi5saW5rIDw8IDIyKSkpCisJCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0KLQkJdiA9IChlbnRyeSAmIDB4MDAwZjAwMDApID4+IDE2OwotCQlpZiAoISh2ICYgZGNiZW50LT5vcikpCi0JCQljb250aW51ZTsKLQotCQl2ID0gKGVudHJ5ICYgMHgwMDAwMDBmMCkgPj4gNDsKLQkJaWYgKHYgIT0gZGNiZW50LT5sb2NhdGlvbikKLQkJCWNvbnRpbnVlOwotCi0JCXYgPSAoZW50cnkgJiAweDAwMDAwMDBmKTsKLQkJaWYgKHYgIT0gZGNiZW50LT50eXBlKQotCQkJY29udGludWU7Ci0KLQkJcmV0dXJuICZiaW9zLT5kYXRhW3RhYmxlXTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gdHJ1ZTsKIAl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqCi1ub3V2ZWF1X2Jpb3NfZHBfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LAotCQkgICAgICBpbnQgKmxlbmd0aCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOwotCXVpbnQ4X3QgKnRhYmxlOwotCi0JaWYgKCFiaW9zLT5kaXNwbGF5LmRwX3RhYmxlX3B0cikgewotCQlOVl9FUlJPUihkZXYsICJObyBwb2ludGVyIHRvIERpc3BsYXlQb3J0IHRhYmxlXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRhYmxlID0gJmJpb3MtPmRhdGFbYmlvcy0+ZGlzcGxheS5kcF90YWJsZV9wdHJdOwotCi0JaWYgKHRhYmxlWzBdICE9IDB4MjAgJiYgdGFibGVbMF0gIT0gMHgyMSkgewotCQlOVl9FUlJPUihkZXYsICJEaXNwbGF5UG9ydCB0YWJsZSB2ZXJzaW9uIDB4JTAyeCB1bmtub3duXG4iLAotCQkJIHRhYmxlWzBdKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JKmxlbmd0aCA9IHRhYmxlWzRdOwotCXJldHVybiBiaW9zX291dHB1dF9jb25maWdfbWF0Y2goZGV2LCBkY2JlbnQsCi0JCQkJCWJpb3MtPmRpc3BsYXkuZHBfdGFibGVfcHRyICsgdGFibGVbMV0sCi0JCQkJCXRhYmxlWzJdLCB0YWJsZVszXSwgdGFibGVbMF0gPj0gMHgyMSk7CiB9CiAKIGludAotbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmVudCwKLQkJCSAgICAgICB1aW50MzJfdCBzdWIsIGludCBweGNsaykKK25vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MTYgdHlwZSwgaW50IHBjbGssCisJCQkgICAgICAgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LCBpbnQgY3J0YykKIHsKIAkvKgogCSAqIFRoZSBkaXNwbGF5IHNjcmlwdCB0YWJsZSBpcyBsb2NhdGVkIGJ5IHRoZSBCSVQgJ1UnIHRhYmxlLgpAQCAtNDQ5OCw3ICs0NDg4LDcgQEAKIAl1aW50OF90ICp0YWJsZSA9ICZiaW9zLT5kYXRhW2Jpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0cl07CiAJdWludDhfdCAqb3RhYmxlID0gTlVMTDsKIAl1aW50MTZfdCBzY3JpcHQ7Ci0JaW50IGkgPSAwOworCWludCBpOwogCiAJaWYgKCFiaW9zLT5kaXNwbGF5LnNjcmlwdF90YWJsZV9wdHIpIHsKIAkJTlZfRVJST1IoZGV2LCAiTm8gcG9pbnRlciB0byBvdXRwdXQgc2NyaXB0IHRhYmxlXG4iKTsKQEAgLTQ1NTAsMzAgKzQ1NDAsMzMgQEAKIAogCU5WX0RFQlVHX0tNUyhkZXYsICJTZWFyY2hpbmcgZm9yIG91dHB1dCBlbnRyeSBmb3IgJWQgJWQgJWRcbiIsCiAJCQlkY2JlbnQtPnR5cGUsIGRjYmVudC0+bG9jYXRpb24sIGRjYmVudC0+b3IpOwotCW90YWJsZSA9IGJpb3Nfb3V0cHV0X2NvbmZpZ19tYXRjaChkZXYsIGRjYmVudCwgdGFibGVbMV0gKwotCQkJCQkgIGJpb3MtPmRpc3BsYXkuc2NyaXB0X3RhYmxlX3B0ciwKLQkJCQkJICB0YWJsZVsyXSwgdGFibGVbM10sIHRhYmxlWzBdID49IDB4MjEpOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZVszXTsgaSsrKSB7CisJCW90YWJsZSA9IFJPTVBUUihiaW9zLCB0YWJsZVt0YWJsZVsxXSArIChpICogdGFibGVbMl0pXSk7CisJCWlmIChvdGFibGUgJiYgYmlvc19lbmNvZGVyX21hdGNoKGRjYmVudCwgUk9NMzIob3RhYmxlWzBdKSkpCisJCQlicmVhazsKKwl9CisKIAlpZiAoIW90YWJsZSkgewogCQlOVl9ERUJVR19LTVMoZGV2LCAiZmFpbGVkIHRvIG1hdGNoIGFueSBvdXRwdXQgdGFibGVcbiIpOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAocHhjbGsgPCAtMiB8fCBweGNsayA+IDApIHsKKwlpZiAocGNsayA8IC0yIHx8IHBjbGsgPiAwKSB7CiAJCS8qIFRyeSB0byBmaW5kIG1hdGNoaW5nIHNjcmlwdCB0YWJsZSBlbnRyeSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgb3RhYmxlWzVdOyBpKyspIHsKLQkJCWlmIChST00xNihvdGFibGVbdGFibGVbNF0gKyBpKjZdKSA9PSBzdWIpCisJCQlpZiAoUk9NMTYob3RhYmxlW3RhYmxlWzRdICsgaSo2XSkgPT0gdHlwZSkKIAkJCQlicmVhazsKIAkJfQogCiAJCWlmIChpID09IG90YWJsZVs1XSkgewogCQkJTlZfRVJST1IoZGV2LCAiVGFibGUgMHglMDR4IG5vdCBmb3VuZCBmb3IgJWQvJWQsICIKIAkJCQkgICAgICAidXNpbmcgZmlyc3RcbiIsCi0JCQkJIHN1YiwgZGNiZW50LT50eXBlLCBkY2JlbnQtPm9yKTsKKwkJCQkgdHlwZSwgZGNiZW50LT50eXBlLCBkY2JlbnQtPm9yKTsKIAkJCWkgPSAwOwogCQl9CiAJfQogCi0JaWYgKHB4Y2xrID09IDApIHsKKwlpZiAocGNsayA9PSAwKSB7CiAJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVs2XSk7CiAJCWlmICghc2NyaXB0KSB7CiAJCQlOVl9ERUJVR19LTVMoZGV2LCAib3V0cHV0IHNjcmlwdCAwIG5vdCBmb3VuZFxuIik7CkBAIC00NTgxLDkgKzQ1NzQsOSBAQAogCQl9CiAKIAkJTlZfREVCVUdfS01TKGRldiwgIjB4JTA0WDogcGFyc2luZyBvdXRwdXQgc2NyaXB0IDBcbiIsIHNjcmlwdCk7Ci0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50KTsKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQsIGNydGMpOwogCX0gZWxzZQotCWlmIChweGNsayA9PSAtMSkgeworCWlmIChwY2xrID09IC0xKSB7CiAJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVs4XSk7CiAJCWlmICghc2NyaXB0KSB7CiAJCQlOVl9ERUJVR19LTVMoZGV2LCAib3V0cHV0IHNjcmlwdCAxIG5vdCBmb3VuZFxuIik7CkBAIC00NTkxLDkgKzQ1ODQsOSBAQAogCQl9CiAKIAkJTlZfREVCVUdfS01TKGRldiwgIjB4JTA0WDogcGFyc2luZyBvdXRwdXQgc2NyaXB0IDFcbiIsIHNjcmlwdCk7Ci0JCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50KTsKKwkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQsIGNydGMpOwogCX0gZWxzZQotCWlmIChweGNsayA9PSAtMikgeworCWlmIChwY2xrID09IC0yKSB7CiAJCWlmICh0YWJsZVs0XSA+PSAxMikKIAkJCXNjcmlwdCA9IFJPTTE2KG90YWJsZVsxMF0pOwogCQllbHNlCkBAIC00NjA0LDMxICs0NTk3LDMxIEBACiAJCX0KIAogCQlOVl9ERUJVR19LTVMoZGV2LCAiMHglMDRYOiBwYXJzaW5nIG91dHB1dCBzY3JpcHQgMlxuIiwgc2NyaXB0KTsKLQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCwgY3J0Yyk7CiAJfSBlbHNlCi0JaWYgKHB4Y2xrID4gMCkgeworCWlmIChwY2xrID4gMCkgewogCQlzY3JpcHQgPSBST00xNihvdGFibGVbdGFibGVbNF0gKyBpKjYgKyAyXSk7CiAJCWlmIChzY3JpcHQpCi0JCQlzY3JpcHQgPSBjbGtjbXB0YWJsZShiaW9zLCBzY3JpcHQsIHB4Y2xrKTsKKwkJCXNjcmlwdCA9IGNsa2NtcHRhYmxlKGJpb3MsIHNjcmlwdCwgcGNsayk7CiAJCWlmICghc2NyaXB0KSB7CiAJCQlOVl9ERUJVR19LTVMoZGV2LCAiY2xvY2sgc2NyaXB0IDAgbm90IGZvdW5kXG4iKTsKIAkJCXJldHVybiAxOwogCQl9CiAKIAkJTlZfREVCVUdfS01TKGRldiwgIjB4JTA0WDogcGFyc2luZyBjbG9jayBzY3JpcHQgMFxuIiwgc2NyaXB0KTsKLQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBkY2JlbnQpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCwgY3J0Yyk7CiAJfSBlbHNlCi0JaWYgKHB4Y2xrIDwgMCkgeworCWlmIChwY2xrIDwgMCkgewogCQlzY3JpcHQgPSBST00xNihvdGFibGVbdGFibGVbNF0gKyBpKjYgKyA0XSk7CiAJCWlmIChzY3JpcHQpCi0JCQlzY3JpcHQgPSBjbGtjbXB0YWJsZShiaW9zLCBzY3JpcHQsIC1weGNsayk7CisJCQlzY3JpcHQgPSBjbGtjbXB0YWJsZShiaW9zLCBzY3JpcHQsIC1wY2xrKTsKIAkJaWYgKCFzY3JpcHQpIHsKIAkJCU5WX0RFQlVHX0tNUyhkZXYsICJjbG9jayBzY3JpcHQgMSBub3QgZm91bmRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAogCQlOVl9ERUJVR19LTVMoZGV2LCAiMHglMDRYOiBwYXJzaW5nIGNsb2NrIHNjcmlwdCAxXG4iLCBzY3JpcHQpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIGRjYmVudCk7CisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZGNiZW50LCBjcnRjKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTU0NzgsMTQgKzU0NzEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1wYXJzZV9iaXRfZGlzcGxheXBvcnRfdGJsX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsCi0JCQkJc3RydWN0IGJpdF9lbnRyeSAqYml0ZW50cnkpCi17Ci0JYmlvcy0+ZGlzcGxheS5kcF90YWJsZV9wdHIgPSBST00xNihiaW9zLT5kYXRhW2JpdGVudHJ5LT5vZmZzZXRdKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RydWN0IGJpdF90YWJsZSB7CiAJY29uc3QgY2hhciBpZDsKIAlpbnQgKCogY29uc3QgcGFyc2VfZm4pKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBudmJpb3MgKiwgc3RydWN0IGJpdF9lbnRyeSAqKTsKQEAgLTU1NTksNyArNTU0NCw2IEBACiAJcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnTCcsIGx2ZHMpKTsKIAlwYXJzZV9iaXRfdGFibGUoYmlvcywgYml0b2Zmc2V0LCAmQklUX1RBQkxFKCdUJywgdG1kcykpOwogCXBhcnNlX2JpdF90YWJsZShiaW9zLCBiaXRvZmZzZXQsICZCSVRfVEFCTEUoJ1UnLCBVKSk7Ci0JcGFyc2VfYml0X3RhYmxlKGJpb3MsIGJpdG9mZnNldCwgJkJJVF9UQUJMRSgnZCcsIGRpc3BsYXlwb3J0KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU4ODQsOSArNTg2OCwxNSBAQAogCQkJfQogCiAJCQllLT5saW5lID0gKGUtPmVudHJ5ICYgMHgwMDAwMDAxZikgPj4gMDsKLQkJCWUtPnN0YXRlX2RlZmF1bHQgPSAoZS0+ZW50cnkgJiAweDAxMDAwMDAwKSA+PiAyNDsKLQkJCWUtPnN0YXRlWzBdID0gKGUtPmVudHJ5ICYgMHgxODAwMDAwMCkgPj4gMjc7Ci0JCQllLT5zdGF0ZVsxXSA9IChlLT5lbnRyeSAmIDB4NjAwMDAwMDApID4+IDI5OworCQkJaWYgKGdwaW9bMF0gPT0gMHg0MCkgeworCQkJCWUtPnN0YXRlX2RlZmF1bHQgPSAoZS0+ZW50cnkgJiAweDAxMDAwMDAwKSA+PiAyNDsKKwkJCQllLT5zdGF0ZVswXSA9IChlLT5lbnRyeSAmIDB4MTgwMDAwMDApID4+IDI3OworCQkJCWUtPnN0YXRlWzFdID0gKGUtPmVudHJ5ICYgMHg2MDAwMDAwMCkgPj4gMjk7CisJCQl9IGVsc2UgeworCQkJCWUtPnN0YXRlX2RlZmF1bHQgPSAoZS0+ZW50cnkgJiAweDAwMDAwMDgwKSA+PiA3OworCQkJCWUtPnN0YXRlWzBdID0gKGVudHJ5WzRdID4+IDQpICYgMzsKKwkJCQllLT5zdGF0ZVsxXSA9IChlbnRyeVs0XSA+PiA2KSAmIDM7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTYxNTYsNyArNjE0NiwxNCBAQAogCX0KIAljYXNlIE9VVFBVVF9EUDoKIAkJZW50cnktPmRwY29uZi5zb3IubGluayA9IChjb25mICYgMHgwMDAwMDAzMCkgPj4gNDsKLQkJZW50cnktPmRwY29uZi5saW5rX2J3ID0gKGNvbmYgJiAweDAwZTAwMDAwKSA+PiAyMTsKKwkJc3dpdGNoICgoY29uZiAmIDB4MDBlMDAwMDApID4+IDIxKSB7CisJCWNhc2UgMDoKKwkJCWVudHJ5LT5kcGNvbmYubGlua19idyA9IDE2MjAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZW50cnktPmRwY29uZi5saW5rX2J3ID0gMjcwMDAwOworCQkJYnJlYWs7CisJCX0KIAkJc3dpdGNoICgoY29uZiAmIDB4MGYwMDAwMDApID4+IDI0KSB7CiAJCWNhc2UgMHhmOgogCQkJZW50cnktPmRwY29uZi5saW5rX25yID0gNDsKQEAgLTY3NjksNyArNjc2Niw3IEBACiAKIHZvaWQKIG5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MTZfdCB0YWJsZSwKLQkJCSAgICBzdHJ1Y3QgZGNiX2VudHJ5ICpkY2JlbnQpCisJCQkgICAgc3RydWN0IGRjYl9lbnRyeSAqZGNiZW50LCBpbnQgY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOwpAQCAtNjc3NywxMSArNjc3NCwyMiBAQAogCiAJc3Bpbl9sb2NrX2JoKCZiaW9zLT5sb2NrKTsKIAliaW9zLT5kaXNwbGF5Lm91dHB1dCA9IGRjYmVudDsKKwliaW9zLT5kaXNwbGF5LmNydGMgPSBjcnRjOwogCXBhcnNlX2luaXRfdGFibGUoYmlvcywgdGFibGUsICZpZXhlYyk7CiAJYmlvcy0+ZGlzcGxheS5vdXRwdXQgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2JoKCZiaW9zLT5sb2NrKTsKIH0KIAordm9pZAorbm91dmVhdV9iaW9zX2luaXRfZXhlYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MTZfdCB0YWJsZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOworCXN0cnVjdCBpbml0X2V4ZWMgaWV4ZWMgPSB7IHRydWUsIGZhbHNlIH07CisKKwlwYXJzZV9pbml0X3RhYmxlKGJpb3MsIHRhYmxlLCAmaWV4ZWMpOworfQorCiBzdGF0aWMgYm9vbCBOVkluaXRWQklPUyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02ODYzLDkgKzY4NzEsOCBAQAogCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKIAkJZm9yIChpID0gMDsgaSA8IGJpb3MtPmRjYi5lbnRyaWVzOyBpKyspIHsKLQkJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsCi0JCQkJCQkgICAgICAgJmJpb3MtPmRjYi5lbnRyeVtpXSwKLQkJCQkJCSAgICAgICAwLCAwKTsKKwkJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIDAsIDAsCisJCQkJCQkgICAgICAgJmJpb3MtPmRjYi5lbnRyeVtpXSwgLTEpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCmluZGV4IDA1MGMzMTQuLjhhZGI2OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5oCkBAIC0yODksOCArMjg5LDggQEAKIAogCXN0cnVjdCB7CiAJCXN0cnVjdCBkY2JfZW50cnkgKm91dHB1dDsKKwkJaW50IGNydGM7CiAJCXVpbnQxNl90IHNjcmlwdF90YWJsZV9wdHI7Ci0JCXVpbnQxNl90IGRwX3RhYmxlX3B0cjsKIAl9IGRpc3BsYXk7CiAKIAlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCmluZGV4IDg5MGQ1MGUuLjdjYzM3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMTAgJiYKIAkgICAgbnZiby0+dGlsZV9tb2RlICYmICh0eXBlICYgVFRNX1BMX0ZMQUdfVlJBTSkgJiYKLQkgICAgbnZiby0+Ym8ubWVtLm51bV9wYWdlcyA8IHZyYW1fcGFnZXMgLyAyKSB7CisJICAgIG52Ym8tPmJvLm1lbS5udW1fcGFnZXMgPCB2cmFtX3BhZ2VzIC8gNCkgewogCQkvKgogCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29sb3IgYW5kIGRlcHRoIGJ1ZmZlcnMgYXJlIGhhbmRsZWQKIAkJICogYnkgaW5kZXBlbmRlbnQgbWVtb3J5IGNvbnRyb2xsZXIgdW5pdHMuIFVwIHRvIGEgOXgKQEAgLTk1Niw3ICs5NTYsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCiAJCQlwYWdlX3NoaWZ0ID0gbm9kZS0+cGFnZV9zaGlmdDsKIAkJZWxzZQogCQkJcGFnZV9zaGlmdCA9IDEyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwppbmRleCBiMGQ3NTNmLi5iYjZlYzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwpAQCAtMTU4LDYgKzE1OCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPm52c3cudmJsX3dhaXQpOwogCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5udnN3LmZsaXApOwogCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hhbi0+ZmVuY2UubG9jayk7CiAKIAkvKiBzZXR1cCBjaGFubmVsJ3MgbWVtb3J5IGFuZCB2bSAqLwogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChjaGFuLCB2cmFtX2hhbmRsZSwgZ2FydF9oYW5kbGUpOwpAQCAtNDExLDEzICs0MTIsMTcgQEAKIAkJcmV0dXJuIHJldDsKIAlpbml0LT5jaGFubmVsICA9IGNoYW4tPmlkOwogCi0JaWYgKGNoYW4tPmRtYS5pYl9tYXgpCi0JCWluaXQtPnB1c2hidWZfZG9tYWlucyA9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNIHwKLQkJCQkJTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7Ci0JZWxzZSBpZiAoY2hhbi0+cHVzaGJ1Zl9iby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKQorCWlmIChub3V2ZWF1X3ZyYW1fcHVzaGJ1ZiA9PSAwKSB7CisJCWlmIChjaGFuLT5kbWEuaWJfbWF4KQorCQkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0gfAorCQkJCQkJTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CisJCWVsc2UgaWYgKGNoYW4tPnB1c2hidWZfYm8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKKwkJCWluaXQtPnB1c2hidWZfZG9tYWlucyA9IE5PVVZFQVVfR0VNX0RPTUFJTl9WUkFNOworCQllbHNlCisJCQlpbml0LT5wdXNoYnVmX2RvbWFpbnMgPSBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVDsKKwl9IGVsc2UgewogCQlpbml0LT5wdXNoYnVmX2RvbWFpbnMgPSBOT1VWRUFVX0dFTV9ET01BSU5fVlJBTTsKLQllbHNlCi0JCWluaXQtPnB1c2hidWZfZG9tYWlucyA9IE5PVVZFQVVfR0VNX0RPTUFJTl9HQVJUOworCX0KIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKIAkJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgPSBOdk0yTUY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYwppbmRleCA5MzlkNGRmLi5jZWE2Njk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIHZvaWQgbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICosIGludCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoKK3N0cnVjdCBub3V2ZWF1X2VuY29kZXIgKgogZmluZF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCB0eXBlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKQEAgLTExNiwxMCArMTE2LDYgQEAKIAkJCQkgICAgICBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnLCBjb25uZWN0b3IpOwogCX0KIAotCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTIHx8Ci0JICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKLQkJbm91dmVhdV9iYWNrbGlnaHRfZXhpdChjb25uZWN0b3IpOwotCiAJa2ZyZWUobnZfY29ubmVjdG9yLT5lZGlkKTsKIAlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShjb25uZWN0b3IpOwogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwpAQCAtNzEyLDEyICs3MDgsOSBAQAogCWNhc2UgT1VUUFVUX1RWOgogCQlyZXR1cm4gZ2V0X3NsYXZlX2Z1bmNzKGVuY29kZXIpLT5tb2RlX3ZhbGlkKGVuY29kZXIsIG1vZGUpOwogCWNhc2UgT1VUUFVUX0RQOgotCQlpZiAobnZfZW5jb2Rlci0+ZHAubGlua19idyA9PSBEUF9MSU5LX0JXXzJfNykKLQkJCW1heF9jbG9jayA9IG52X2VuY29kZXItPmRwLmxpbmtfbnIgKiAyNzAwMDA7Ci0JCWVsc2UKLQkJCW1heF9jbG9jayA9IG52X2VuY29kZXItPmRwLmxpbmtfbnIgKiAxNjIwMDA7Ci0KLQkJY2xvY2sgPSBjbG9jayAqIG5vdXZlYXVfY29ubmVjdG9yX2JwcChjb25uZWN0b3IpIC8gODsKKwkJbWF4X2Nsb2NrICA9IG52X2VuY29kZXItPmRwLmxpbmtfbnI7CisJCW1heF9jbG9jayAqPSBudl9lbmNvZGVyLT5kcC5saW5rX2J3OworCQljbG9jayA9IGNsb2NrICogbm91dmVhdV9jb25uZWN0b3JfYnBwKGNvbm5lY3RvcikgLyAxMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHX09OKDEpOwpAQCAtODcxLDcgKzg2NCw2IEBACiAJCQkJCWRldi0+bW9kZV9jb25maWcuc2NhbGluZ19tb2RlX3Byb3BlcnR5LAogCQkJCQludl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSk7CiAJCX0KLQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfQ09OTkVDVDsKIAkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzA6CiAJY2FzZSBEQ0JfQ09OTkVDVE9SX1RWXzE6CkBAIC04ODgsMjcgKzg4MCwyMCBAQAogCQkJCWRldi0+bW9kZV9jb25maWcuZGl0aGVyaW5nX21vZGVfcHJvcGVydHksCiAJCQkJbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nID8KIAkJCQlEUk1fTU9ERV9ESVRIRVJJTkdfT04gOiBEUk1fTU9ERV9ESVRIRVJJTkdfT0ZGKTsKLQotCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykgewotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQkJY29ubmVjdG9yLT5wb2xsZWQgPSBEUk1fQ09OTkVDVE9SX1BPTExfSFBEOwotCQkJZWxzZQotCQkJCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0NPTk5FQ1Q7Ci0JCX0KIAkJYnJlYWs7CiAJfQogCi0JaWYgKHBncGlvLT5pcnFfcmVnaXN0ZXIpIHsKKwlpZiAobnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnICE9IDB4ZmYgJiYgcGdwaW8tPmlycV9yZWdpc3RlcikgewogCQlwZ3Bpby0+aXJxX3JlZ2lzdGVyKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLAogCQkJCSAgICBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnLCBjb25uZWN0b3IpOworCisJCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKKwl9IGVsc2UgeworCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9DT05ORUNUOwogCX0KIAogCWRybV9zeXNmc19jb25uZWN0b3JfYWRkKGNvbm5lY3Rvcik7CiAKLQlpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUyB8fAotCSAgICBjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApCi0JCW5vdXZlYXVfYmFja2xpZ2h0X2luaXQoY29ubmVjdG9yKTsKLQogCWRjYi0+ZHJtID0gY29ubmVjdG9yOwogCXJldHVybiBkY2ItPmRybTsKIApAQCAtOTI1LDIyICs5MTAsMTMgQEAKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CiAKLQlOVl9JTkZPKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKLQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwlOVl9ERUJVRyhkZXYsICIlc3BsdWdnZWQgJXNcbiIsIHBsdWdnZWQgPyAiIiA6ICJ1biIsCisJCSBkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOwogCi0JaWYgKGNvbm5lY3Rvci0+ZW5jb2RlciAmJiBjb25uZWN0b3ItPmVuY29kZXItPmNydGMgJiYKLQkgICAgY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjLT5lbmFibGVkKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoY29ubmVjdG9yLT5lbmNvZGVyKTsKLQkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyID0KLQkJCWNvbm5lY3Rvci0+ZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7Ci0KLQkJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfRFApIHsKLQkJCWlmIChwbHVnZ2VkKQotCQkJCWhlbHBlci0+ZHBtcyhjb25uZWN0b3ItPmVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwotCQkJZWxzZQotCQkJCWhlbHBlci0+ZHBtcyhjb25uZWN0b3ItPmVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKLQkJfQotCX0KKwlpZiAocGx1Z2dlZCkKKwkJZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcyhjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT04pOworCWVsc2UKKwkJZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcyhjb25uZWN0b3IsIERSTV9NT0RFX0RQTVNfT0ZGKTsKIAogCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jcnRjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaAppbmRleCBjYjFjZTJhLi5iZjhlMTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NydGMuaApAQCAtODIsMTQgKzgyLDEzIEBACiB9CiAKIGludCBudjUwX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCk7Ci1pbnQgbnY1MF9jdXJzb3JfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jcnRjICopOwotdm9pZCBudjUwX2N1cnNvcl9maW5pKHN0cnVjdCBub3V2ZWF1X2NydGMgKik7CiBpbnQgbnY1MF9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpkcm1fY3J0Yywgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkgdWludDMyX3QgYnVmZmVyX2hhbmRsZSwgdWludDMyX3Qgd2lkdGgsCiAJCQkgdWludDMyX3QgaGVpZ2h0KTsKIGludCBudjUwX2NydGNfY3Vyc29yX21vdmUoc3RydWN0IGRybV9jcnRjICpkcm1fY3J0YywgaW50IHgsIGludCB5KTsKIAogaW50IG52MDRfY3Vyc29yX2luaXQoc3RydWN0IG5vdXZlYXVfY3J0YyAqKTsKK2ludCBudjUwX2N1cnNvcl9pbml0KHN0cnVjdCBub3V2ZWF1X2NydGMgKik7CiAKIHN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqCiBub3V2ZWF1X2NydGNfY29ubmVjdG9yX2dldChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpjcnRjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKaW5kZXggZWI1MTRlYS4uZGRiYWJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKQEAgLTEwNSw5ICsxMDUsMTIgQEAKIAkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApCiAJCQludl9mYi0+cl9mb3JtYXQgfD0gKHRpbGVfZmxhZ3MgPDwgOCk7CiAKLQkJaWYgKCF0aWxlX2ZsYWdzKQotCQkJbnZfZmItPnJfcGl0Y2ggPSAweDAwMTAwMDAwIHwgZmItPnBpdGNoOwotCQllbHNlIHsKKwkJaWYgKCF0aWxlX2ZsYWdzKSB7CisJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0QwKQorCQkJCW52X2ZiLT5yX3BpdGNoID0gMHgwMDEwMDAwMCB8IGZiLT5waXRjaDsKKwkJCWVsc2UKKwkJCQludl9mYi0+cl9waXRjaCA9IDB4MDEwMDAwMDAgfCBmYi0+cGl0Y2g7CisJCX0gZWxzZSB7CiAJCQl1MzIgbW9kZSA9IG52Ym8tPnRpbGVfbW9kZTsKIAkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKQogCQkJCW1vZGUgPj49IDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKaW5kZXggN2JlYjgyYS4uZGU1ZWZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwpAQCAtMjgsNDE4ICsyOCw2MTkgQEAKICNpbmNsdWRlICJub3V2ZWF1X2kyYy5oIgogI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCiAjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCisjaW5jbHVkZSAibm91dmVhdV9jcnRjLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGF1eCBjaGFubmVsIHV0aWwgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFVWF9EQkcoZm10LCBhcmdzLi4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChub3V2ZWF1X3JlZ19kZWJ1ZyAmIE5PVVZFQVVfUkVHX0RFQlVHX0FVWENIKSB7ICAgICAgICAgICAgICAgICAgICAgXAorCQlOVl9QUklOVEsoS0VSTl9ERUJVRywgZGV2LCAiQVVYQ0goJWQpOiAiIGZtdCwgY2gsICMjYXJncyk7ICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBBVVhfRVJSKGZtdCwgYXJncy4uLikgTlZfRVJST1IoZGV2LCAiQVVYQ0goJWQpOiAiIGZtdCwgY2gsICMjYXJncykKKworc3RhdGljIHZvaWQKK2F1eGNoX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoKQoreworCW52X21hc2soZGV2LCAweDAwZTRlNCArIChjaCAqIDB4NTApLCAweDAwMzEwMDAwLCAweDAwMDAwMDAwKTsKK30KIAogc3RhdGljIGludAotYXV4Y2hfcmQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWRkcmVzcywgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK2F1eGNoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7Ci0JaW50IHJldDsKKwljb25zdCB1MzIgdW5rc2VsID0gMTsgLyogbmZpIHdoaWNoIHRvIHVzZSwgb3IgaWYgaXQgbWF0dGVycy4uICovCisJY29uc3QgdTMyIHVyZXEgPSB1bmtzZWwgPyAweDAwMTAwMDAwIDogMHgwMDIwMDAwMDsKKwljb25zdCB1MzIgdXJlcCA9IHVua3NlbCA/IDB4MDEwMDAwMDAgOiAweDAyMDAwMDAwOworCXUzMiBjdHJsLCB0aW1lb3V0OwogCi0JYXV4Y2ggPSBub3V2ZWF1X2kyY19maW5kKGRldiwgbnZfZW5jb2Rlci0+ZGNiLT5pMmNfaW5kZXgpOwotCWlmICghYXV4Y2gpCi0JCXJldHVybiAtRU5PREVWOworCS8qIHdhaXQgdXAgdG8gMW1zIGZvciBhbnkgcHJldmlvdXMgdHJhbnNhY3Rpb24gdG8gYmUgZG9uZS4uLiAqLworCXRpbWVvdXQgPSAxMDAwOworCWRvIHsKKwkJY3RybCA9IG52X3JkMzIoZGV2LCAweDAwZTRlNCArIChjaCAqIDB4NTApKTsKKwkJdWRlbGF5KDEpOworCQlpZiAoIXRpbWVvdXQtLSkgeworCQkJQVVYX0VSUigiYmVnaW4gaWRsZSB0aW1lb3V0IDB4JTA4eCIsIGN0cmwpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0gd2hpbGUgKGN0cmwgJiAweDAzMDEwMDAwKTsKIAotCXJldCA9IG5vdXZlYXVfZHBfYXV4Y2goYXV4Y2gsIDksIGFkZHJlc3MsIGJ1Ziwgc2l6ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkvKiBzZXQgc29tZSBtYWdpYywgYW5kIHdhaXQgdXAgdG8gMW1zIGZvciBpdCB0byBhcHBlYXIgKi8KKwludl9tYXNrKGRldiwgMHgwMGU0ZTQgKyAoY2ggKiAweDUwKSwgMHgwMDMwMDAwMCwgdXJlcSk7CisJdGltZW91dCA9IDEwMDA7CisJZG8geworCQljdHJsID0gbnZfcmQzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCkpOworCQl1ZGVsYXkoMSk7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlBVVhfRVJSKCJtYWdpYyB3YWl0IDB4JTA4eFxuIiwgY3RybCk7CisJCQlhdXhjaF9maW5pKGRldiwgY2gpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0gd2hpbGUgKChjdHJsICYgMHgwMzAwMDAwMCkgIT0gdXJlcCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotYXV4Y2hfd3Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWRkcmVzcywgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK2F1eGNoX3R4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaCwgdTggdHlwZSwgdTMyIGFkZHIsIHU4ICpkYXRhLCB1OCBzaXplKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2g7Ci0JaW50IHJldDsKKwl1MzIgY3RybCwgc3RhdCwgdGltZW91dCwgcmV0cmllczsKKwl1MzIgeGJ1Zls0XSA9IHt9OworCWludCByZXQsIGk7CiAKLQlhdXhjaCA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7Ci0JaWYgKCFhdXhjaCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJQVVYX0RCRygiJWQ6IDB4JTA4eCAlZFxuIiwgdHlwZSwgYWRkciwgc2l6ZSk7CiAKLQlyZXQgPSBub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCA4LCBhZGRyZXNzLCBidWYsIHNpemUpOworCXJldCA9IGF1eGNoX2luaXQoZGV2LCBjaCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzdGF0ID0gbnZfcmQzMihkZXYsIDB4MDBlNGU4ICsgKGNoICogMHg1MCkpOworCWlmICghKHN0YXQgJiAweDEwMDAwMDAwKSkgeworCQlBVVhfREJHKCJzaW5rIG5vdCBkZXRlY3RlZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEodHlwZSAmIDEpKSB7CisJCW1lbWNweSh4YnVmLCBkYXRhLCBzaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKwkJCUFVWF9EQkcoIndyIDB4JTA4eFxuIiwgeGJ1ZltpIC8gNF0pOworCQkJbnZfd3IzMihkZXYsIDB4MDBlNGMwICsgKGNoICogMHg1MCkgKyBpLCB4YnVmW2kgLyA0XSk7CisJCX0KKwl9CisKKwljdHJsICA9IG52X3JkMzIoZGV2LCAweDAwZTRlNCArIChjaCAqIDB4NTApKTsKKwljdHJsICY9IH4weDAwMDFmMGZmOworCWN0cmwgfD0gdHlwZSA8PCAxMjsKKwljdHJsIHw9IHNpemUgLSAxOworCW52X3dyMzIoZGV2LCAweDAwZTRlMCArIChjaCAqIDB4NTApLCBhZGRyKTsKKworCS8qIHJldHJ5IHRyYW5zYWN0aW9uIGEgbnVtYmVyIG9mIHRpbWVzIG9uIGZhaWx1cmUuLi4gKi8KKwlyZXQgPSAtRVJFTU9URUlPOworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAzMjsgcmV0cmllcysrKSB7CisJCS8qIHJlc2V0LCBhbmQgZGVsYXkgYSB3aGlsZSBpZiB0aGlzIGlzIGEgcmV0cnkgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCksIDB4ODAwMDAwMDAgfCBjdHJsKTsKKwkJbnZfd3IzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCksIDB4MDAwMDAwMDAgfCBjdHJsKTsKKwkJaWYgKHJldHJpZXMpCisJCQl1ZGVsYXkoNDAwKTsKKworCQkvKiB0cmFuc2FjdGlvbiByZXF1ZXN0LCB3YWl0IHVwIHRvIDFtcyBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDBlNGU0ICsgKGNoICogMHg1MCksIDB4MDAwMTAwMDAgfCBjdHJsKTsKKworCQl0aW1lb3V0ID0gMTAwMDsKKwkJZG8geworCQkJY3RybCA9IG52X3JkMzIoZGV2LCAweDAwZTRlNCArIChjaCAqIDB4NTApKTsKKwkJCXVkZWxheSgxKTsKKwkJCWlmICghdGltZW91dC0tKSB7CisJCQkJQVVYX0VSUigidHggcmVxIHRpbWVvdXQgMHglMDh4XG4iLCBjdHJsKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSB3aGlsZSAoY3RybCAmIDB4MDAwMTAwMDApOworCisJCS8qIHJlYWQgc3RhdHVzLCBhbmQgY2hlY2sgaWYgdHJhbnNhY3Rpb24gY29tcGxldGVkIG9rICovCisJCXN0YXQgPSBudl9tYXNrKGRldiwgMHgwMGU0ZTggKyAoY2ggKiAweDUwKSwgMCwgMCk7CisJCWlmICghKHN0YXQgJiAweDAwMGYwZjAwKSkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJQVVYX0RCRygiJTAyZCAweCUwOHggMHglMDh4XG4iLCByZXRyaWVzLCBjdHJsLCBzdGF0KTsKKwl9CisKKwlpZiAodHlwZSAmIDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKKwkJCXhidWZbaSAvIDRdID0gbnZfcmQzMihkZXYsIDB4MDBlNGQwICsgKGNoICogMHg1MCkgKyBpKTsKKwkJCUFVWF9EQkcoInJkIDB4JTA4eFxuIiwgeGJ1ZltpIC8gNF0pOworCQl9CisJCW1lbWNweShkYXRhLCB4YnVmLCBzaXplKTsKKwl9CisKK291dDoKKwlhdXhjaF9maW5pKGRldiwgY2gpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLW5vdXZlYXVfZHBfbGFuZV9jb3VudF9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50OF90IGNtZCkKK3N0YXRpYyB1MzIKK2RwX2xpbmtfYndfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvciwgaW50IGxpbmspCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXVpbnQzMl90IHRtcDsKLQlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKLQotCXRtcCAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluaykpOwotCXRtcCAmPSB+KE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRCB8Ci0JCSBOVjUwX1NPUl9EUF9DVFJMX0xBTkVfTUFTSyk7Ci0JdG1wIHw9ICgoMSA8PCAoY21kICYgRFBfTEFORV9DT1VOVF9NQVNLKSkgLSAxKSA8PCAxNjsKLQlpZiAoY21kICYgRFBfTEFORV9DT1VOVF9FTkhBTkNFRF9GUkFNRV9FTikKLQkJdG1wIHw9IE5WNTBfU09SX0RQX0NUUkxfRU5IQU5DRURfRlJBTUVfRU5BQkxFRDsKLQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIHRtcCk7Ci0KLQlyZXR1cm4gYXV4Y2hfd3IoZW5jb2RlciwgRFBfTEFORV9DT1VOVF9TRVQsICZjbWQsIDEpOworCXUzMiBjdHJsID0gbnZfcmQzMihkZXYsIDB4NjE0MzAwICsgKG9yICogMHg4MDApKTsKKwlpZiAoIShjdHJsICYgMHgwMDBjMDAwMCkpCisJCXJldHVybiAxNjIwMDA7CisJcmV0dXJuIDI3MDAwMDsKIH0KIAogc3RhdGljIGludAotbm91dmVhdV9kcF9saW5rX2J3X3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHVpbnQ4X3QgY21kKQorZHBfbGFuZV9jb3VudF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG9yLCBpbnQgbGluaykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0JdWludDMyX3QgdG1wOwotCWludCByZWcgPSAweDYxNDMwMCArIChudl9lbmNvZGVyLT5vciAqIDB4ODAwKTsKKwl1MzIgY3RybCA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSk7CisJc3dpdGNoIChjdHJsICYgMHgwMDBmMDAwMCkgeworCWNhc2UgMHgwMDAxMDAwMDogcmV0dXJuIDE7CisJY2FzZSAweDAwMDMwMDAwOiByZXR1cm4gMjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gNDsKKwl9Cit9CiAKLQl0bXAgID0gbnZfcmQzMihkZXYsIHJlZyk7Ci0JdG1wICY9IDB4ZmZmM2ZmZmY7Ci0JaWYgKGNtZCA9PSBEUF9MSU5LX0JXXzJfNykKLQkJdG1wIHw9IDB4MDAwNDAwMDA7Ci0JbnZfd3IzMihkZXYsIHJlZywgdG1wKTsKK3ZvaWQKK25vdXZlYXVfZHBfdHVfdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvciwgaW50IGxpbmssIHUzMiBjbGssIHUzMiBicHApCit7CisJY29uc3QgdTMyIHN5bWJvbCA9IDEwMDAwMDsKKwlpbnQgYmVzdFRVID0gMCwgYmVzdFZUVWkgPSAwLCBiZXN0VlRVZiA9IDAsIGJlc3RWVFVhID0gMDsKKwlpbnQgVFUsIFZUVWksIFZUVWYsIFZUVWE7CisJdTY0IGxpbmtfZGF0YV9yYXRlLCBsaW5rX3JhdGlvLCB1bms7CisJdTMyIGJlc3RfZGlmZiA9IDY0ICogc3ltYm9sOworCXUzMiBsaW5rX25yLCBsaW5rX2J3LCByOwogCi0JcmV0dXJuIGF1eGNoX3dyKGVuY29kZXIsIERQX0xJTktfQldfU0VULCAmY21kLCAxKTsKKwkvKiBjYWxjdWxhdGUgcGFja2VkIGRhdGEgcmF0ZSBmb3IgZWFjaCBsYW5lICovCisJbGlua19uciA9IGRwX2xhbmVfY291bnRfZ2V0KGRldiwgb3IsIGxpbmspOworCWxpbmtfZGF0YV9yYXRlID0gKGNsayAqIGJwcCAvIDgpIC8gbGlua19ucjsKKworCS8qIGNhbGN1bGF0ZSByYXRpbyBvZiBwYWNrZWQgZGF0YSByYXRlIHRvIGxpbmsgc3ltYm9sIHJhdGUgKi8KKwlsaW5rX2J3ID0gZHBfbGlua19id19nZXQoZGV2LCBvciwgbGluayk7CisJbGlua19yYXRpbyA9IGxpbmtfZGF0YV9yYXRlICogc3ltYm9sOworCXIgPSBkb19kaXYobGlua19yYXRpbywgbGlua19idyk7CisKKwlmb3IgKFRVID0gNjQ7IFRVID49IDMyOyBUVS0tKSB7CisJCS8qIGNhbGN1bGF0ZSBhdmVyYWdlIG51bWJlciBvZiB2YWxpZCBzeW1ib2xzIGluIGVhY2ggVFUgKi8KKwkJdTMyIHR1X3ZhbGlkID0gbGlua19yYXRpbyAqIFRVOworCQl1MzIgY2FsYywgZGlmZjsKKworCQkvKiBmaW5kIGEgaHcgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBmcmFjdGlvbi4uICovCisJCVZUVWkgPSB0dV92YWxpZCAvIHN5bWJvbDsKKwkJY2FsYyA9IFZUVWkgKiBzeW1ib2w7CisJCWRpZmYgPSB0dV92YWxpZCAtIGNhbGM7CisJCWlmIChkaWZmKSB7CisJCQlpZiAoZGlmZiA+PSAoc3ltYm9sIC8gMikpIHsKKwkJCQlWVFVmID0gc3ltYm9sIC8gKHN5bWJvbCAtIGRpZmYpOworCQkJCWlmIChzeW1ib2wgLSAoVlRVZiAqIGRpZmYpKQorCQkJCQlWVFVmKys7CisKKwkJCQlpZiAoVlRVZiA8PSAxNSkgeworCQkJCQlWVFVhICA9IDE7CisJCQkJCWNhbGMgKz0gc3ltYm9sIC0gKHN5bWJvbCAvIFZUVWYpOworCQkJCX0gZWxzZSB7CisJCQkJCVZUVWEgID0gMDsKKwkJCQkJVlRVZiAgPSAxOworCQkJCQljYWxjICs9IHN5bWJvbDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVZUVWEgID0gMDsKKwkJCQlWVFVmICA9IG1pbigoaW50KShzeW1ib2wgLyBkaWZmKSwgMTUpOworCQkJCWNhbGMgKz0gc3ltYm9sIC8gVlRVZjsKKwkJCX0KKworCQkJZGlmZiA9IGNhbGMgLSB0dV92YWxpZDsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIHJlbWFpbmRlciwgYnV0IHRoZSBodyBkb2Vzbid0IGxpa2UgdGhlIGZyYWN0aW9uYWwKKwkJCSAqIHBhcnQgdG8gYmUgemVyby4gIGRlY3JlbWVudCB0aGUgaW50ZWdlciBwYXJ0IGFuZAorCQkJICogaGF2ZSB0aGUgZnJhY3Rpb24gYWRkIGEgd2hvbGUgc3ltYm9sIGJhY2sKKwkJCSAqLworCQkJVlRVYSA9IDA7CisJCQlWVFVmID0gMTsKKwkJCVZUVWktLTsKKwkJfQorCisJCWlmIChkaWZmIDwgYmVzdF9kaWZmKSB7CisJCQliZXN0X2RpZmYgPSBkaWZmOworCQkJYmVzdFRVID0gVFU7CisJCQliZXN0VlRVYSA9IFZUVWE7CisJCQliZXN0VlRVZiA9IFZUVWY7CisJCQliZXN0VlRVaSA9IFZUVWk7CisJCQlpZiAoZGlmZiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFiZXN0VFUpIHsKKwkJTlZfRVJST1IoZGV2LCAiRFA6IHVuYWJsZSB0byBmaW5kIHN1aXRhYmxlIGNvbmZpZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBYWFggY2xvc2UgdG8gdmJpb3MgbnVtYmVycywgYnV0IG5vdCByaWdodCAqLworCXVuayAgPSAoc3ltYm9sIC0gbGlua19yYXRpbykgKiBiZXN0VFU7CisJdW5rICo9IGxpbmtfcmF0aW87CisJciA9IGRvX2Rpdih1bmssIHN5bWJvbCk7CisJciA9IGRvX2Rpdih1bmssIHN5bWJvbCk7CisJdW5rICs9IDY7CisKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIDB4MDAwMDAxZmMsIGJlc3RUVSA8PCAyKTsKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfU0NGRyhvciwgbGluayksIDB4MDEwZjdmM2YsIGJlc3RWVFVhIDw8IDI0IHwKKwkJCQkJCQkgICAgIGJlc3RWVFVmIDw8IDE2IHwKKwkJCQkJCQkgICAgIGJlc3RWVFVpIDw8IDggfAorCQkJCQkJCSAgICAgdW5rKTsKK30KKwordTggKgorbm91dmVhdV9kcF9iaW9zX2RhdGEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiLCB1OCAqKmVudHJ5KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CisJc3RydWN0IGJpdF9lbnRyeSBkOworCXU4ICp0YWJsZTsKKwlpbnQgaTsKKworCWlmIChiaXRfdGFibGUoZGV2LCAnZCcsICZkKSkgeworCQlOVl9FUlJPUihkZXYsICJCSVQgJ2QnIHRhYmxlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChkLnZlcnNpb24gIT0gMSkgeworCQlOVl9FUlJPUihkZXYsICJCSVQgJ2QnIHRhYmxlIHZlcnNpb24gJWQgdW5rbm93blxuIiwgZC52ZXJzaW9uKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGFibGUgPSBST01QVFIoYmlvcywgZC5kYXRhWzBdKTsKKwlpZiAoIXRhYmxlKSB7CisJCU5WX0VSUk9SKGRldiwgImRpc3BsYXlwb3J0IHRhYmxlIHBvaW50ZXIgaW52YWxpZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAodGFibGVbMF0pIHsKKwljYXNlIDB4MjA6CisJY2FzZSAweDIxOgorCWNhc2UgMHgzMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiZGlzcGxheXBvcnQgdGFibGUgMHglMDJ4IHVua25vd25cbiIsIHRhYmxlWzBdKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHRhYmxlWzNdOyBpKyspIHsKKwkJKmVudHJ5ID0gUk9NUFRSKGJpb3MsIHRhYmxlW3RhYmxlWzFdICsgKGkgKiB0YWJsZVsyXSldKTsKKwkJaWYgKCplbnRyeSAmJiBiaW9zX2VuY29kZXJfbWF0Y2goZGNiLCBST00zMigoKmVudHJ5KVswXSkpKQorCQkJcmV0dXJuIHRhYmxlOworCX0KKworCU5WX0VSUk9SKGRldiwgImRpc3BsYXlwb3J0IGVuY29kZXIgdGFibGUgbm90IGZvdW5kXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbGluayB0cmFpbmluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGRwX3N0YXRlIHsKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2I7CisJdTggKnRhYmxlOworCXU4ICplbnRyeTsKKwlpbnQgYXV4Y2g7CisJaW50IGNydGM7CisJaW50IG9yOworCWludCBsaW5rOworCXU4ICpkcGNkOworCWludCBsaW5rX25yOworCXUzMiBsaW5rX2J3OworCXU4ICBzdGF0WzZdOworCXU4ICBjb25mWzRdOworfTsKKworc3RhdGljIHZvaWQKK2RwX3NldF9saW5rX2NvbmZpZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHBfc3RhdGUgKmRwKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IG9yID0gZHAtPm9yLCBsaW5rID0gZHAtPmxpbms7CisJdTggKmVudHJ5LCBzaW5rWzJdOworCXUzMiBkcF9jdHJsOworCXUxNiBzY3JpcHQ7CisKKwlOVl9ERUJVR19LTVMoZGV2LCAiJWQgbGFuZXMgYXQgJWQgS0Ivc1xuIiwgZHAtPmxpbmtfbnIsIGRwLT5saW5rX2J3KTsKKworCS8qIHNldCBzZWxlY3RlZCBsaW5rIHJhdGUgb24gc291cmNlICovCisJc3dpdGNoIChkcC0+bGlua19idykgeworCWNhc2UgMjcwMDAwOgorCQludl9tYXNrKGRldiwgMHg2MTQzMDAgKyAob3IgKiAweDgwMCksIDB4MDAwYzAwMDAsIDB4MDAwNDAwMDApOworCQlzaW5rWzBdID0gRFBfTElOS19CV18yXzc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW52X21hc2soZGV2LCAweDYxNDMwMCArIChvciAqIDB4ODAwKSwgMHgwMDBjMDAwMCwgMHgwMDAwMDAwMCk7CisJCXNpbmtbMF0gPSBEUF9MSU5LX0JXXzFfNjI7CisJCWJyZWFrOworCX0KKworCS8qIG9mZnNldCArMHgwYSBvZiBlYWNoIGRwIGVuY29kZXIgdGFibGUgZW50cnkgaXMgYSBwb2ludGVyIHRvIGFub3RoZXIKKwkgKiB0YWJsZSwgdGhhdCBoYXMgKGFtb25nIG90aGVyIHRoaW5ncykgcG9pbnRlcnMgdG8gbW9yZSBzY3JpcHRzIHRoYXQKKwkgKiBuZWVkIHRvIGJlIGV4ZWN1dGVkLCB0aGlzIHRpbWUgZGVwZW5kaW5nIG9uIGxpbmsgc3BlZWQuCisJICovCisJZW50cnkgPSBST01QVFIoJmRldl9wcml2LT52YmlvcywgZHAtPmVudHJ5WzEwXSk7CisJaWYgKGVudHJ5KSB7CisJCWlmIChkcC0+dGFibGVbMF0gPCAweDMwKSB7CisJCQl3aGlsZSAoZHAtPmxpbmtfYncgPCAoUk9NMTYoZW50cnlbMF0pICogMTApKQorCQkJCWVudHJ5ICs9IDQ7CisJCQlzY3JpcHQgPSBST00xNihlbnRyeVsyXSk7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoZHAtPmxpbmtfYncgPCAoZW50cnlbMF0gKiAyNzAwMCkpCisJCQkJZW50cnkgKz0gMzsKKwkJCXNjcmlwdCA9IFJPTTE2KGVudHJ5WzFdKTsKKwkJfQorCisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZHAtPmRjYiwgZHAtPmNydGMpOworCX0KKworCS8qIGNvbmZpZ3VyZSBsYW5lIGNvdW50IG9uIHRoZSBzb3VyY2UgKi8KKwlkcF9jdHJsID0gKCgxIDw8IGRwLT5saW5rX25yKSAtIDEpIDw8IDE2OworCXNpbmtbMV0gPSBkcC0+bGlua19ucjsKKwlpZiAoZHAtPmRwY2RbMl0gJiBEUF9FTkhBTkNFRF9GUkFNRV9DQVApIHsKKwkJZHBfY3RybCB8PSAweDAwMDA0MDAwOworCQlzaW5rWzFdIHw9IERQX0xBTkVfQ09VTlRfRU5IQU5DRURfRlJBTUVfRU47CisJfQorCisJbnZfbWFzayhkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspLCAweDAwMWY0MDAwLCBkcF9jdHJsKTsKKworCS8qIGluZm9ybSB0aGUgc2luayBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlhdXhjaF90eChkZXYsIGRwLT5hdXhjaCwgOCwgRFBfTElOS19CV19TRVQsIHNpbmssIDIpOworfQorCitzdGF0aWMgdm9pZAorZHBfc2V0X3RyYWluaW5nX3BhdHRlcm4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRwX3N0YXRlICpkcCwgdTggdHApCit7CisJdTggc2lua190cDsKKworCU5WX0RFQlVHX0tNUyhkZXYsICJ0cmFpbmluZyBwYXR0ZXJuICVkXG4iLCB0cCk7CisKKwludl9tYXNrKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChkcC0+b3IsIGRwLT5saW5rKSwgMHgwZjAwMDAwMCwgdHAgPDwgMjQpOworCisJYXV4Y2hfdHgoZGV2LCBkcC0+YXV4Y2gsIDksIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmc2lua190cCwgMSk7CisJc2lua190cCAmPSB+RFBfVFJBSU5JTkdfUEFUVEVSTl9NQVNLOworCXNpbmtfdHAgfD0gdHA7CisJYXV4Y2hfdHgoZGV2LCBkcC0+YXV4Y2gsIDgsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmc2lua190cCwgMSk7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBudjUwX2xhbmVfbWFwW10gPSB7IDE2LCA4LCAwLCAyNCB9Oworc3RhdGljIGNvbnN0IHU4IG52YWZfbGFuZV9tYXBbXSA9IHsgMjQsIDE2LCA4LCAwIH07CisKK3N0YXRpYyBpbnQKK2RwX2xpbmtfdHJhaW5fY29tbWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9zdGF0ZSAqZHApCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgbWFzayA9IDAsIGRydiA9IDAsIHByZSA9IDAsIHVuayA9IDA7CisJY29uc3QgdTggKnNoaWZ0czsKKwlpbnQgbGluayA9IGRwLT5saW5rOworCWludCBvciA9IGRwLT5vcjsKKwlpbnQgaTsKKworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGFmKQorCQlzaGlmdHMgPSBudjUwX2xhbmVfbWFwOworCWVsc2UKKwkJc2hpZnRzID0gbnZhZl9sYW5lX21hcDsKKworCWZvciAoaSA9IDA7IGkgPCBkcC0+bGlua19ucjsgaSsrKSB7CisJCXU4ICpjb25mID0gZHAtPmVudHJ5ICsgZHAtPnRhYmxlWzRdOworCQl1OCBsYW5lID0gKGRwLT5zdGF0WzQgKyAoaSA+PiAxKV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7CisJCXU4IGxwcmUgPSAobGFuZSAmIDB4MGMpID4+IDI7CisJCXU4IGx2c3cgPSAobGFuZSAmIDB4MDMpID4+IDA7CisKKwkJbWFzayB8PSAweGZmIDw8IHNoaWZ0c1tpXTsKKwkJdW5rIHw9IDEgPDwgKHNoaWZ0c1tpXSA+PiAzKTsKKworCQlkcC0+Y29uZltpXSA9IChscHJlIDw8IDMpIHwgbHZzdzsKKwkJaWYgKGx2c3cgPT0gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR18xMjAwKQorCQkJZHAtPmNvbmZbaV0gfD0gRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQ7CisJCWlmIChscHJlID09IERQX1RSQUlOX1BSRV9FTVBIQVNJU185XzUpCisJCQlkcC0+Y29uZltpXSB8PSBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQ7CisKKwkJTlZfREVCVUdfS01TKGRldiwgImNvbmZpZyBsYW5lICVkICUwMnhcbiIsIGksIGRwLT5jb25mW2ldKTsKKworCQlpZiAoZHAtPnRhYmxlWzBdIDwgMHgzMCkgeworCQkJdTggKmxhc3QgPSBjb25mICsgKGRwLT5lbnRyeVs0XSAqIGRwLT50YWJsZVs1XSk7CisJCQl3aGlsZSAobHZzdyAhPSBjb25mWzBdIHx8IGxwcmUgIT0gY29uZlsxXSkgeworCQkJCWNvbmYgKz0gZHAtPnRhYmxlWzVdOworCQkJCWlmIChjb25mID49IGxhc3QpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQljb25mICs9IDI7CisJCX0gZWxzZSB7CisJCQkvKiBubyBsb29rdXAgdGFibGUgYW55bW9yZSwgc2V0IGVudHJpZXMgZm9yIGVhY2gKKwkJCSAqIGNvbWJpbmF0aW9uIG9mIHZvbHRhZ2Ugc3dpbmcgYW5kIHByZS1lbXBoYXNpcworCQkJICogbGV2ZWwgYWxsb3dlZCBieSB0aGUgRFAgc3BlYy4KKwkJCSAqLworCQkJc3dpdGNoIChsdnN3KSB7CisJCQljYXNlIDA6IGxwcmUgKz0gMDsgYnJlYWs7CisJCQljYXNlIDE6IGxwcmUgKz0gNDsgYnJlYWs7CisJCQljYXNlIDI6IGxwcmUgKz0gNzsgYnJlYWs7CisJCQljYXNlIDM6IGxwcmUgKz0gOTsgYnJlYWs7CisJCQl9CisKKwkJCWNvbmYgPSBjb25mICsgKGxwcmUgKiBkcC0+dGFibGVbNV0pOworCQkJY29uZisrOworCQl9CisKKwkJZHJ2IHw9IGNvbmZbMF0gPDwgc2hpZnRzW2ldOworCQlwcmUgfD0gY29uZlsxXSA8PCBzaGlmdHNbaV07CisJCXVuayAgPSAodW5rICYgfjB4MDAwMGZmMDApIHwgKGNvbmZbMl0gPDwgOCk7CisJfQorCisJbnZfbWFzayhkZXYsIE5WNTBfU09SX0RQX1VOSzExOChvciwgbGluayksIG1hc2ssIGRydik7CisJbnZfbWFzayhkZXYsIE5WNTBfU09SX0RQX1VOSzEyMChvciwgbGluayksIG1hc2ssIHByZSk7CisJbnZfbWFzayhkZXYsIE5WNTBfU09SX0RQX1VOSzEzMChvciwgbGluayksIDB4MDAwMGZmMGYsIHVuayk7CisKKwlyZXR1cm4gYXV4Y2hfdHgoZGV2LCBkcC0+YXV4Y2gsIDgsIERQX1RSQUlOSU5HX0xBTkUwX1NFVCwgZHAtPmNvbmYsIDQpOwogfQogCiBzdGF0aWMgaW50Ci1ub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IHBhdHRlcm4pCitkcF9saW5rX3RyYWluX3VwZGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHBfc3RhdGUgKmRwLCB1MzIgZGVsYXkpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXVpbnQzMl90IHRtcDsKLQl1aW50OF90IGNtZDsKLQlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKIAlpbnQgcmV0OwogCi0JdG1wICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSk7Ci0JdG1wICY9IH5OVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk47Ci0JdG1wIHw9IChwYXR0ZXJuIDw8IDI0KTsKLQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIHRtcCk7CisJdWRlbGF5KGRlbGF5KTsKIAotCXJldCA9IGF1eGNoX3JkKGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmY21kLCAxKTsKKwlyZXQgPSBhdXhjaF90eChkZXYsIGRwLT5hdXhjaCwgOSwgRFBfTEFORTBfMV9TVEFUVVMsIGRwLT5zdGF0LCA2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWNtZCAmPSB+RFBfVFJBSU5JTkdfUEFUVEVSTl9NQVNLOwotCWNtZCB8PSAocGF0dGVybiAmIERQX1RSQUlOSU5HX1BBVFRFUk5fTUFTSyk7Ci0JcmV0dXJuIGF1eGNoX3dyKGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fU0VULCAmY21kLCAxKTsKKworCU5WX0RFQlVHX0tNUyhkZXYsICJzdGF0dXMgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSAgICAgZHAtPnN0YXRbMF0sIGRwLT5zdGF0WzFdLCBkcC0+c3RhdFsyXSwgZHAtPnN0YXRbM10sCisJCSAgICAgZHAtPnN0YXRbNF0sIGRwLT5zdGF0WzVdKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotbm91dmVhdV9kcF9tYXhfdm9sdGFnZV9zd2luZyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCitkcF9saW5rX3RyYWluX2NyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9zdGF0ZSAqZHApCiB7Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSAqZHBzZTsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKLQlpbnQgaSwgZHBlX2hlYWRlcmxlbiwgbWF4X3ZzID0gMDsKKwlib29sIGNyX2RvbmUgPSBmYWxzZSwgYWJvcnQgPSBmYWxzZTsKKwlpbnQgdm9sdGFnZSA9IGRwLT5jb25mWzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLOworCWludCB0cmllcyA9IDAsIGk7CiAKLQlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKLQlpZiAoIWRwZSkKLQkJcmV0dXJuIGZhbHNlOwotCWRwc2UgPSAodm9pZCAqKSgoY2hhciAqKWRwZSArIGRwZV9oZWFkZXJsZW4pOworCWRwX3NldF90cmFpbmluZ19wYXR0ZXJuKGRldiwgZHAsIERQX1RSQUlOSU5HX1BBVFRFUk5fMSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZHBlX2hlYWRlcmxlbjsgaSsrLCBkcHNlKyspIHsKLQkJaWYgKGRwc2UtPnZzX2xldmVsID4gbWF4X3ZzKQotCQkJbWF4X3ZzID0gZHBzZS0+dnNfbGV2ZWw7Ci0JfQotCi0JcmV0dXJuIG1heF92czsKLX0KLQotc3RhdGljIGludAotbm91dmVhdV9kcF9tYXhfcHJlX2VtcGhhc2lzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IHZzKQotewotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGVfZW50cnkgKmRwc2U7Ci0Jc3RydWN0IGJpdF9kaXNwbGF5cG9ydF9lbmNvZGVyX3RhYmxlICpkcGU7Ci0JaW50IGksIGRwZV9oZWFkZXJsZW4sIG1heF9wcmUgPSAwOwotCi0JZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7Ci0JaWYgKCFkcGUpCi0JCXJldHVybiBmYWxzZTsKLQlkcHNlID0gKHZvaWQgKikoKGNoYXIgKilkcGUgKyBkcGVfaGVhZGVybGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBkcGVfaGVhZGVybGVuOyBpKyssIGRwc2UrKykgewotCQlpZiAoZHBzZS0+dnNfbGV2ZWwgIT0gdnMpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZHBzZS0+cHJlX2xldmVsID4gbWF4X3ByZSkKLQkJCW1heF9wcmUgPSBkcHNlLT5wcmVfbGV2ZWw7Ci0JfQotCi0JcmV0dXJuIG1heF9wcmU7Ci19Ci0KLXN0YXRpYyBib29sCi1ub3V2ZWF1X2RwX2xpbmtfdHJhaW5fYWRqdXN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgdWludDhfdCAqY29uZmlnKQotewotCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKLQlpbnQgcmV0LCBpLCBkcGVfaGVhZGVybGVuLCB2cyA9IDAsIHByZSA9IDA7Ci0JdWludDhfdCByZXF1ZXN0WzJdOwotCi0JZHBlID0gbm91dmVhdV9iaW9zX2RwX3RhYmxlKGRldiwgbnZfZW5jb2Rlci0+ZGNiLCAmZHBlX2hlYWRlcmxlbik7Ci0JaWYgKCFkcGUpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldCA9IGF1eGNoX3JkKGVuY29kZXIsIERQX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEsIHJlcXVlc3QsIDIpOwotCWlmIChyZXQpCi0JCXJldHVybiBmYWxzZTsKLQotCU5WX0RFQlVHX0tNUyhkZXYsICJcdFx0YWRqdXN0IDB4JTAyeCAweCUwMnhcbiIsIHJlcXVlc3RbMF0sIHJlcXVlc3RbMV0pOwotCi0JLyogS2VlcCBhbGwgbGFuZXMgYXQgdGhlIHNhbWUgbGV2ZWwuLiAqLwotCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKLQkJaW50IGxhbmVfcmVxID0gKHJlcXVlc3RbaSA+PiAxXSA+PiAoKGkgJiAxKSA8PCAyKSkgJiAweGY7Ci0JCWludCBsYW5lX3ZzID0gbGFuZV9yZXEgJiAzOwotCQlpbnQgbGFuZV9wcmUgPSAobGFuZV9yZXEgPj4gMikgJiAzOwotCi0JCWlmIChsYW5lX3ZzID4gdnMpCi0JCQl2cyA9IGxhbmVfdnM7Ci0JCWlmIChsYW5lX3ByZSA+IHByZSkKLQkJCXByZSA9IGxhbmVfcHJlOwotCX0KLQotCWlmICh2cyA+PSBub3V2ZWF1X2RwX21heF92b2x0YWdlX3N3aW5nKGVuY29kZXIpKSB7Ci0JCXZzICA9IG5vdXZlYXVfZHBfbWF4X3ZvbHRhZ2Vfc3dpbmcoZW5jb2Rlcik7Ci0JCXZzIHw9IDQ7Ci0JfQotCi0JaWYgKHByZSA+PSBub3V2ZWF1X2RwX21heF9wcmVfZW1waGFzaXMoZW5jb2RlciwgdnMgJiAzKSkgewotCQlwcmUgID0gbm91dmVhdV9kcF9tYXhfcHJlX2VtcGhhc2lzKGVuY29kZXIsIHZzICYgMyk7Ci0JCXByZSB8PSA0OwotCX0KLQotCS8qIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYWxsIGxhbmVzLi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucjsgaSsrKQotCQljb25maWdbaV0gPSAocHJlIDw8IDMpIHwgdnM7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLW5vdXZlYXVfZHBfbGlua190cmFpbl9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1aW50OF90ICpjb25maWcpCi17Ci0Jc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSAqZHBzZTsKLQlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKLQlpbnQgb3IgPSBudl9lbmNvZGVyLT5vciwgbGluayA9ICEobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKTsKLQlpbnQgZHBlX2hlYWRlcmxlbiwgcmV0LCBpOwotCi0JTlZfREVCVUdfS01TKGRldiwgIlx0XHRjb25maWcgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAotCQkgY29uZmlnWzBdLCBjb25maWdbMV0sIGNvbmZpZ1syXSwgY29uZmlnWzNdKTsKLQotCWRwZSA9IG5vdXZlYXVfYmlvc19kcF90YWJsZShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwZV9oZWFkZXJsZW4pOwotCWlmICghZHBlKQotCQlyZXR1cm4gZmFsc2U7Ci0JZHBzZSA9ICh2b2lkICopKChjaGFyICopZHBlICsgZHBlX2hlYWRlcmxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHBlLT5yZWNvcmRfbnI7IGkrKywgZHBzZSsrKSB7Ci0JCWlmIChkcHNlLT52c19sZXZlbCA9PSAoY29uZmlnWzBdICYgMykgJiYKLQkJICAgIGRwc2UtPnByZV9sZXZlbCA9PSAoKGNvbmZpZ1swXSA+PiAzKSAmIDMpKQorCWRvIHsKKwkJaWYgKGRwX2xpbmtfdHJhaW5fY29tbWl0KGRldiwgZHApIHx8CisJCSAgICBkcF9saW5rX3RyYWluX3VwZGF0ZShkZXYsIGRwLCAxMDApKQogCQkJYnJlYWs7Ci0JfQotCUJVR19PTihpID09IGRwZS0+cmVjb3JkX25yKTsKIAotCWZvciAoaSA9IDA7IGkgPCBudl9lbmNvZGVyLT5kcC5saW5rX25yOyBpKyspIHsKLQkJY29uc3QgaW50IHNoaWZ0WzRdID0geyAxNiwgOCwgMCwgMjQgfTsKLQkJdWludDMyX3QgbWFzayA9IDB4ZmYgPDwgc2hpZnRbaV07Ci0JCXVpbnQzMl90IHJlZzAsIHJlZzEsIHJlZzI7CisJCWNyX2RvbmUgPSB0cnVlOworCQlmb3IgKGkgPSAwOyBpIDwgZHAtPmxpbmtfbnI7IGkrKykgeworCQkJdTggbGFuZSA9IChkcC0+c3RhdFtpID4+IDFdID4+ICgoaSAmIDEpICogNCkpICYgMHhmOworCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ1JfRE9ORSkpIHsKKwkJCQljcl9kb25lID0gZmFsc2U7CisJCQkJaWYgKGRwLT5jb25mW2ldICYgRFBfVFJBSU5fTUFYX1NXSU5HX1JFQUNIRUQpCisJCQkJCWFib3J0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCi0JCXJlZzAgID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX1VOSzExOChvciwgbGluaykpICYgfm1hc2s7Ci0JCXJlZzAgfD0gKGRwc2UtPnJlZzAgPDwgc2hpZnRbaV0pOwotCQlyZWcxICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMjAob3IsIGxpbmspKSAmIH5tYXNrOwotCQlyZWcxIHw9IChkcHNlLT5yZWcxIDw8IHNoaWZ0W2ldKTsKLQkJcmVnMiAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTMwKG9yLCBsaW5rKSkgJiAweGZmZmYwMGZmOwotCQlyZWcyIHw9IChkcHNlLT5yZWcyIDw8IDgpOwotCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTE4KG9yLCBsaW5rKSwgcmVnMCk7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1NPUl9EUF9VTksxMjAob3IsIGxpbmspLCByZWcxKTsKLQkJbnZfd3IzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEzMChvciwgbGluayksIHJlZzIpOwotCX0KKwkJaWYgKChkcC0+Y29uZlswXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgIT0gdm9sdGFnZSkgeworCQkJdm9sdGFnZSA9IGRwLT5jb25mWzBdICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLOworCQkJdHJpZXMgPSAwOworCQl9CisJfSB3aGlsZSAoIWNyX2RvbmUgJiYgIWFib3J0ICYmICsrdHJpZXMgPCA1KTsKIAotCXJldCA9IGF1eGNoX3dyKGVuY29kZXIsIERQX1RSQUlOSU5HX0xBTkUwX1NFVCwgY29uZmlnLCA0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIGNyX2RvbmUgPyAwIDogLTE7Cit9CiAKLQlyZXR1cm4gdHJ1ZTsKK3N0YXRpYyBpbnQKK2RwX2xpbmtfdHJhaW5fZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRwX3N0YXRlICpkcCkKK3sKKwlib29sIGVxX2RvbmUsIGNyX2RvbmUgPSB0cnVlOworCWludCB0cmllcyA9IDAsIGk7CisKKwlkcF9zZXRfdHJhaW5pbmdfcGF0dGVybihkZXYsIGRwLCBEUF9UUkFJTklOR19QQVRURVJOXzIpOworCisJZG8geworCQlpZiAoZHBfbGlua190cmFpbl91cGRhdGUoZGV2LCBkcCwgNDAwKSkKKwkJCWJyZWFrOworCisJCWVxX2RvbmUgPSAhIShkcC0+c3RhdFsyXSAmIERQX0lOVEVSTEFORV9BTElHTl9ET05FKTsKKwkJZm9yIChpID0gMDsgaSA8IGRwLT5saW5rX25yICYmIGVxX2RvbmU7IGkrKykgeworCQkJdTggbGFuZSA9IChkcC0+c3RhdFtpID4+IDFdID4+ICgoaSAmIDEpICogNCkpICYgMHhmOworCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ1JfRE9ORSkpCisJCQkJY3JfZG9uZSA9IGZhbHNlOworCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ0hBTk5FTF9FUV9ET05FKSB8fAorCQkJICAgICEobGFuZSAmIERQX0xBTkVfU1lNQk9MX0xPQ0tFRCkpCisJCQkJZXFfZG9uZSA9IGZhbHNlOworCQl9CisKKwkJaWYgKGRwX2xpbmtfdHJhaW5fY29tbWl0KGRldiwgZHApKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIWVxX2RvbmUgJiYgY3JfZG9uZSAmJiArK3RyaWVzIDw9IDUpOworCisJcmV0dXJuIGVxX2RvbmUgPyAwIDogLTE7CiB9CiAKIGJvb2wKLW5vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCitub3V2ZWF1X2RwX2xpbmtfdHJhaW4oc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCB1MzIgZGF0YXJhdGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOwotCXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZSAqZHBlOwotCWludCBkcGVfaGVhZGVybGVuOwotCXVpbnQ4X3QgY29uZmlnWzRdLCBzdGF0dXNbM107Ci0JYm9vbCBjcl9kb25lLCBjcl9tYXhfdnMsIGVxX2RvbmUsIGhwZF9zdGF0ZTsKLQlpbnQgcmV0ID0gMCwgaSwgdHJpZXMsIHZvbHRhZ2U7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9CisJCW5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoOworCWNvbnN0IHUzMiBid19saXN0W10gPSB7IDI3MDAwMCwgMTYyMDAwLCAwIH07CisJY29uc3QgdTMyICpsaW5rX2J3ID0gYndfbGlzdDsKKwlzdHJ1Y3QgZHBfc3RhdGUgZHA7CiAKLQlOVl9ERUJVR19LTVMoZGV2LCAibGluayB0cmFpbmluZyEhXG4iKTsKLQotCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOwotCWlmICghbnZfY29ubmVjdG9yKQorCWF1eGNoID0gbm91dmVhdV9pMmNfZmluZChkZXYsIG52X2VuY29kZXItPmRjYi0+aTJjX2luZGV4KTsKKwlpZiAoIWF1eGNoKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlkcGUgPSBub3V2ZWF1X2Jpb3NfZHBfdGFibGUoZGV2LCBudl9lbmNvZGVyLT5kY2IsICZkcGVfaGVhZGVybGVuKTsKLQlpZiAoIWRwZSkgewotCQlOVl9FUlJPUihkZXYsICJTT1ItJWQ6IG5vIERQIGVuY29kZXIgdGFibGUhXG4iLCBudl9lbmNvZGVyLT5vcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9CisJZHAudGFibGUgPSBub3V2ZWF1X2RwX2Jpb3NfZGF0YShkZXYsIG52X2VuY29kZXItPmRjYiwgJmRwLmVudHJ5KTsKKwlpZiAoIWRwLnRhYmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGRpc2FibGUgaG90cGx1ZyBkZXRlY3QsIHRoaXMgZmxpcHMgYXJvdW5kIG9uIHNvbWUgcGFuZWxzIGR1cmluZwotCSAqIGxpbmsgdHJhaW5pbmcuCisJZHAuZGNiID0gbnZfZW5jb2Rlci0+ZGNiOworCWRwLmNydGMgPSBudl9jcnRjLT5pbmRleDsKKwlkcC5hdXhjaCA9IGF1eGNoLT5yZDsKKwlkcC5vciA9IG52X2VuY29kZXItPm9yOworCWRwLmxpbmsgPSAhKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSk7CisJZHAuZHBjZCA9IG52X2VuY29kZXItPmRwLmRwY2Q7CisKKwkvKiBzb21lIHNpbmtzIHRvZ2dsZSBob3RwbHVnIGluIHJlc3BvbnNlIHRvIHNvbWUgb2YgdGhlIGFjdGlvbnMKKwkgKiB3ZSB0YWtlIGR1cmluZyBsaW5rIHRyYWluaW5nIChEUF9TRVRfUE9XRVIgaXMgb25lKSwgd2UgbmVlZAorCSAqIHRvIGlnbm9yZSB0aGVtIGZvciB0aGUgbW9tZW50IHRvIGF2b2lkIHJhY2VzLgogCSAqLwotCWhwZF9zdGF0ZSA9IHBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBmYWxzZSk7CisJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGZhbHNlKTsKIAotCWlmIChkcGUtPnNjcmlwdDApIHsKLQkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMFxuIiwgbnZfZW5jb2Rlci0+b3IpOwotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBsZTE2X3RvX2NwdShkcGUtPnNjcmlwdDApLAotCQkJCQkgICAgbnZfZW5jb2Rlci0+ZGNiKTsKKwkvKiBlbmFibGUgZG93bi1zcHJlYWRpbmcsIGlmIHBvc3NpYmxlICovCisJaWYgKGRwLnRhYmxlWzFdID49IDE2KSB7CisJCXUxNiBzY3JpcHQgPSBST00xNihkcC5lbnRyeVsxNF0pOworCQlpZiAobnZfZW5jb2Rlci0+ZHAuZHBjZFszXSAmIDEpCisJCQlzY3JpcHQgPSBST00xNihkcC5lbnRyeVsxMl0pOworCisJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgZHAuZGNiLCBkcC5jcnRjKTsKIAl9CiAKLXRyYWluOgotCWNyX2RvbmUgPSBlcV9kb25lID0gZmFsc2U7CisJLyogZXhlY3V0ZSBwcmUtdHJhaW4gc2NyaXB0IGZyb20gdmJpb3MgKi8KKwlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBST00xNihkcC5lbnRyeVs2XSksIGRwLmRjYiwgZHAuY3J0Yyk7CiAKLQkvKiBzZXQgbGluayBjb25maWd1cmF0aW9uICovCi0JTlZfREVCVUdfS01TKGRldiwgIlx0YmVnaW4gdHJhaW46IGJ3ICVkLCBsYW5lcyAlZFxuIiwKLQkJIG52X2VuY29kZXItPmRwLmxpbmtfYncsIG52X2VuY29kZXItPmRwLmxpbmtfbnIpOworCS8qIHN0YXJ0IG9mZiBhdCBoaWdoZXN0IGxpbmsgcmF0ZSBzdXBwb3J0ZWQgYnkgZW5jb2RlciBhbmQgZGlzcGxheSAqLworCXdoaWxlICgqbGlua19idyA+IG52X2VuY29kZXItPmRwLmxpbmtfYncpCisJCWxpbmtfYncrKzsKIAotCXJldCA9IG5vdXZlYXVfZHBfbGlua19id19zZXQoZW5jb2RlciwgbnZfZW5jb2Rlci0+ZHAubGlua19idyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIGZhbHNlOworCXdoaWxlIChsaW5rX2J3WzBdKSB7CisJCS8qIGZpbmQgbWluaW11bSByZXF1aXJlZCBsYW5lIGNvdW50IGF0IHRoaXMgbGluayByYXRlICovCisJCWRwLmxpbmtfbnIgPSBudl9lbmNvZGVyLT5kcC5saW5rX25yOworCQl3aGlsZSAoKGRwLmxpbmtfbnIgPj4gMSkgKiBsaW5rX2J3WzBdID4gZGF0YXJhdGUpCisJCQlkcC5saW5rX25yID4+PSAxOwogCi0JY29uZmlnWzBdID0gbnZfZW5jb2Rlci0+ZHAubGlua19ucjsKLQlpZiAobnZfZW5jb2Rlci0+ZHAuZHBjZF92ZXJzaW9uID49IDB4MTEgJiYKLQkgICAgbnZfZW5jb2Rlci0+ZHAuZW5oYW5jZWRfZnJhbWUpCi0JCWNvbmZpZ1swXSB8PSBEUF9MQU5FX0NPVU5UX0VOSEFOQ0VEX0ZSQU1FX0VOOworCQkvKiBkcm9wIGxpbmsgcmF0ZSB0byBtaW5pbXVtIHdpdGggdGhpcyBsYW5lIGNvdW50ICovCisJCXdoaWxlICgobGlua19id1sxXSAqIGRwLmxpbmtfbnIpID4gZGF0YXJhdGUpCisJCQlsaW5rX2J3Kys7CisJCWRwLmxpbmtfYncgPSBsaW5rX2J3WzBdOwogCi0JcmV0ID0gbm91dmVhdV9kcF9sYW5lX2NvdW50X3NldChlbmNvZGVyLCBjb25maWdbMF0pOwotCWlmIChyZXQpCi0JCXJldHVybiBmYWxzZTsKKwkJLyogcHJvZ3JhbSBzZWxlY3RlZCBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKwkJZHBfc2V0X2xpbmtfY29uZmlnKGRldiwgJmRwKTsKIAotCS8qIGNsb2NrIHJlY292ZXJ5ICovCi0JTlZfREVCVUdfS01TKGRldiwgIlx0YmVnaW4gY3JcbiIpOwotCXJldCA9IG5vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl8xKTsKLQlpZiAocmV0KQotCQlnb3RvIHN0b3A7Ci0KLQl0cmllcyA9IDA7Ci0Jdm9sdGFnZSA9IC0xOwotCW1lbXNldChjb25maWcsIDB4MDAsIHNpemVvZihjb25maWcpKTsKLQlmb3IgKDs7KSB7Ci0JCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluX2NvbW1pdChlbmNvZGVyLCBjb25maWcpKQorCQkvKiBhdHRlbXB0IHRvIHRyYWluIHRoZSBsaW5rIGF0IHRoaXMgY29uZmlndXJhdGlvbiAqLworCQltZW1zZXQoZHAuc3RhdCwgMHgwMCwgc2l6ZW9mKGRwLnN0YXQpKTsKKwkJaWYgKCFkcF9saW5rX3RyYWluX2NyKGRldiwgJmRwKSAmJgorCQkgICAgIWRwX2xpbmtfdHJhaW5fZXEoZGV2LCAmZHApKQogCQkJYnJlYWs7CiAKLQkJdWRlbGF5KDEwMCk7Ci0KLQkJcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfTEFORTBfMV9TVEFUVVMsIHN0YXR1cywgMik7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQkJTlZfREVCVUdfS01TKGRldiwgIlx0XHRzdGF0dXM6IDB4JTAyeCAweCUwMnhcbiIsCi0JCQkgc3RhdHVzWzBdLCBzdGF0dXNbMV0pOwotCi0JCWNyX2RvbmUgPSB0cnVlOwotCQljcl9tYXhfdnMgPSBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IG52X2VuY29kZXItPmRwLmxpbmtfbnI7IGkrKykgewotCQkJaW50IGxhbmUgPSAoc3RhdHVzW2kgPj4gMV0gPj4gKChpICYgMSkgKiA0KSkgJiAweGY7Ci0KLQkJCWlmICghKGxhbmUgJiBEUF9MQU5FX0NSX0RPTkUpKSB7Ci0JCQkJY3JfZG9uZSA9IGZhbHNlOwotCQkJCWlmIChjb25maWdbaV0gJiBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQpCi0JCQkJCWNyX21heF92cyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGNvbmZpZ1swXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSykgIT0gdm9sdGFnZSkgewotCQkJdm9sdGFnZSA9IGNvbmZpZ1swXSAmIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTSzsKLQkJCXRyaWVzID0gMDsKLQkJfQotCi0JCWlmIChjcl9kb25lIHx8IGNyX21heF92cyB8fCAoKyt0cmllcyA9PSA1KSkKLQkJCWJyZWFrOwotCi0JCWlmICghbm91dmVhdV9kcF9saW5rX3RyYWluX2FkanVzdChlbmNvZGVyLCBjb25maWcpKQotCQkJYnJlYWs7CisJCS8qIHJldHJ5IGF0IGxvd2VyIHJhdGUgKi8KKwkJbGlua19idysrOwogCX0KIAotCWlmICghY3JfZG9uZSkKLQkJZ290byBzdG9wOworCS8qIGZpbmlzaCBsaW5rIHRyYWluaW5nICovCisJZHBfc2V0X3RyYWluaW5nX3BhdHRlcm4oZGV2LCAmZHAsIERQX1RSQUlOSU5HX1BBVFRFUk5fRElTQUJMRSk7CiAKLQkvKiBjaGFubmVsIGVxdWFsaXNhdGlvbiAqLwotCU5WX0RFQlVHX0tNUyhkZXYsICJcdGJlZ2luIGVxXG4iKTsKLQlyZXQgPSBub3V2ZWF1X2RwX2xpbmtfdHJhaW5fc2V0KGVuY29kZXIsIERQX1RSQUlOSU5HX1BBVFRFUk5fMik7Ci0JaWYgKHJldCkKLQkJZ290byBzdG9wOwotCi0JZm9yICh0cmllcyA9IDA7IHRyaWVzIDw9IDU7IHRyaWVzKyspIHsKLQkJdWRlbGF5KDQwMCk7Ci0KLQkJcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgRFBfTEFORTBfMV9TVEFUVVMsIHN0YXR1cywgMyk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQkJTlZfREVCVUdfS01TKGRldiwgIlx0XHRzdGF0dXM6IDB4JTAyeCAweCUwMnhcbiIsCi0JCQkgc3RhdHVzWzBdLCBzdGF0dXNbMV0pOwotCi0JCWVxX2RvbmUgPSB0cnVlOwotCQlpZiAoIShzdGF0dXNbMl0gJiBEUF9JTlRFUkxBTkVfQUxJR05fRE9ORSkpCi0JCQllcV9kb25lID0gZmFsc2U7Ci0KLQkJZm9yIChpID0gMDsgZXFfZG9uZSAmJiBpIDwgbnZfZW5jb2Rlci0+ZHAubGlua19ucjsgaSsrKSB7Ci0JCQlpbnQgbGFuZSA9IChzdGF0dXNbaSA+PiAxXSA+PiAoKGkgJiAxKSAqIDQpKSAmIDB4ZjsKLQotCQkJaWYgKCEobGFuZSAmIERQX0xBTkVfQ1JfRE9ORSkpIHsKLQkJCQljcl9kb25lID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICghKGxhbmUgJiBEUF9MQU5FX0NIQU5ORUxfRVFfRE9ORSkgfHwKLQkJCSAgICAhKGxhbmUgJiBEUF9MQU5FX1NZTUJPTF9MT0NLRUQpKSB7Ci0JCQkJZXFfZG9uZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVxX2RvbmUgfHwgIWNyX2RvbmUpCi0JCQlicmVhazsKLQotCQlpZiAoIW5vdXZlYXVfZHBfbGlua190cmFpbl9hZGp1c3QoZW5jb2RlciwgY29uZmlnKSB8fAotCQkgICAgIW5vdXZlYXVfZHBfbGlua190cmFpbl9jb21taXQoZW5jb2RlciwgY29uZmlnKSkKLQkJCWJyZWFrOwotCX0KLQotc3RvcDoKLQkvKiBlbmQgbGluayB0cmFpbmluZyAqLwotCXJldCA9IG5vdXZlYXVfZHBfbGlua190cmFpbl9zZXQoZW5jb2RlciwgRFBfVFJBSU5JTkdfUEFUVEVSTl9ESVNBQkxFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiByZXRyeSBhdCBhIGxvd2VyIHNldHRpbmcsIGlmIHBvc3NpYmxlICovCi0JaWYgKCFyZXQgJiYgIShlcV9kb25lICYmIGNyX2RvbmUpKSB7Ci0JCU5WX0RFQlVHX0tNUyhkZXYsICJcdHdlIGZhaWxlZFxuIik7Ci0JCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ICE9IERQX0xJTktfQldfMV82MikgewotCQkJTlZfREVCVUdfS01TKGRldiwgInJldHJ5IGxpbmsgdHJhaW5pbmcgYXQgbG93IHJhdGVcbiIpOwotCQkJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IERQX0xJTktfQldfMV82MjsKLQkJCWdvdG8gdHJhaW47Ci0JCX0KLQl9Ci0KLQlpZiAoZHBlLT5zY3JpcHQxKSB7Ci0JCU5WX0RFQlVHX0tNUyhkZXYsICJTT1ItJWQ6IHJ1bm5pbmcgRFAgc2NyaXB0IDFcbiIsIG52X2VuY29kZXItPm9yKTsKLQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgbGUxNl90b19jcHUoZHBlLT5zY3JpcHQxKSwKLQkJCQkJICAgIG52X2VuY29kZXItPmRjYik7Ci0JfQorCS8qIGV4ZWN1dGUgcG9zdC10cmFpbiBzY3JpcHQgZnJvbSB2YmlvcyAqLworCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIFJPTTE2KGRwLmVudHJ5WzhdKSwgZHAuZGNiLCBkcC5jcnRjKTsKIAogCS8qIHJlLWVuYWJsZSBob3RwbHVnIGRldGVjdCAqLwotCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBocGRfc3RhdGUpOwotCi0JcmV0dXJuIGVxX2RvbmU7CisJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIHRydWUpOworCXJldHVybiB0cnVlOwogfQogCiBib29sCkBAIC00NDcsMzEgKzY0OCwzNCBAQAogewogCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQl1aW50OF90IGRwY2RbNF07CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmF1eGNoOworCXU4ICpkcGNkID0gbnZfZW5jb2Rlci0+ZHAuZHBjZDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYXV4Y2hfcmQoZW5jb2RlciwgMHgwMDAwLCBkcGNkLCA0KTsKKwlhdXhjaCA9IG5vdXZlYXVfaTJjX2ZpbmQoZGV2LCBudl9lbmNvZGVyLT5kY2ItPmkyY19pbmRleCk7CisJaWYgKCFhdXhjaCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0ID0gYXV4Y2hfdHgoZGV2LCBhdXhjaC0+cmQsIDksIERQX0RQQ0RfUkVWLCBkcGNkLCA4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gZmFsc2U7CiAKLQlOVl9ERUJVR19LTVMoZGV2LCAiZW5jb2RlcjogbGlua19idyAlZCwgbGlua19uciAlZFxuIgotCQkgICAgICAiZGlzcGxheTogbGlua19idyAlZCwgbGlua19uciAlZCB2ZXJzaW9uIDB4JTAyeFxuIiwKLQkJIG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfYncsCi0JCSBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yLAotCQkgZHBjZFsxXSwgZHBjZFsyXSAmIDB4MGYsIGRwY2RbMF0pOwotCi0JbnZfZW5jb2Rlci0+ZHAuZHBjZF92ZXJzaW9uID0gZHBjZFswXTsKLQotCW52X2VuY29kZXItPmRwLmxpbmtfYncgPSBkcGNkWzFdOwotCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX2J3ICE9IERQX0xJTktfQldfMV82MiAmJgotCSAgICAhbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idykKLQkJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IERQX0xJTktfQldfMV82MjsKLQorCW52X2VuY29kZXItPmRwLmxpbmtfYncgPSAyNzAwMCAqIGRwY2RbMV07CiAJbnZfZW5jb2Rlci0+ZHAubGlua19uciA9IGRwY2RbMl0gJiBEUF9NQVhfTEFORV9DT1VOVF9NQVNLOwotCWlmIChudl9lbmNvZGVyLT5kcC5saW5rX25yID4gbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19ucikKLQkJbnZfZW5jb2Rlci0+ZHAubGlua19uciA9IG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnI7CiAKLQludl9lbmNvZGVyLT5kcC5lbmhhbmNlZF9mcmFtZSA9IChkcGNkWzJdICYgRFBfRU5IQU5DRURfRlJBTUVfQ0FQKTsKKwlOVl9ERUJVR19LTVMoZGV2LCAiZGlzcGxheTogJWR4JWQgZHBjZCAweCUwMnhcbiIsCisJCSAgICAgbnZfZW5jb2Rlci0+ZHAubGlua19uciwgbnZfZW5jb2Rlci0+ZHAubGlua19idywgZHBjZFswXSk7CisJTlZfREVCVUdfS01TKGRldiwgImVuY29kZXI6ICVkeCVkXG4iLAorCQkgICAgIG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfbnIsCisJCSAgICAgbnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19idyk7CisKKwlpZiAobnZfZW5jb2Rlci0+ZGNiLT5kcGNvbmYubGlua19uciA8IG52X2VuY29kZXItPmRwLmxpbmtfbnIpCisJCW52X2VuY29kZXItPmRwLmxpbmtfbnIgPSBudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX25yOworCWlmIChudl9lbmNvZGVyLT5kY2ItPmRwY29uZi5saW5rX2J3IDwgbnZfZW5jb2Rlci0+ZHAubGlua19idykKKwkJbnZfZW5jb2Rlci0+ZHAubGlua19idyA9IG52X2VuY29kZXItPmRjYi0+ZHBjb25mLmxpbmtfYnc7CisKKwlOVl9ERUJVR19LTVMoZGV2LCAibWF4aW11bTogJWR4JWRcbiIsCisJCSAgICAgbnZfZW5jb2Rlci0+ZHAubGlua19uciwgbnZfZW5jb2Rlci0+ZHAubGlua19idyk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTQ4MCwxMDUgKzY4NCwxMyBAQAogbm91dmVhdV9kcF9hdXhjaChzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2gsIGludCBjbWQsIGludCBhZGRyLAogCQkgdWludDhfdCAqZGF0YSwgaW50IGRhdGFfbnIpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGF1eGNoLT5kZXY7Ci0JdWludDMyX3QgdG1wLCBjdHJsLCBzdGF0ID0gMCwgZGF0YTMyWzRdID0ge307Ci0JaW50IHJldCA9IDAsIGksIGluZGV4ID0gYXV4Y2gtPnJkOwotCi0JTlZfREVCVUdfS01TKGRldiwgImNoICVkIGNtZCAlZCBhZGRyIDB4JXggbGVuICVkXG4iLCBpbmRleCwgY21kLCBhZGRyLCBkYXRhX25yKTsKLQotCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChhdXhjaC0+cmQpLCB0bXAgfCAweDAwMTAwMDAwKTsKLQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCkpOwotCWlmICghKHRtcCAmIDB4MDEwMDAwMDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgImV4cGVjdGVkIGJpdCAyNCA9PSAxLCBnb3QgMHglMDh4XG4iLCB0bXApOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX1NUQVQoYXV4Y2gtPnJkKSk7Ci0JCWlmICh0bXAgJiBOVjUwX0FVWENIX1NUQVRfU1RBVEVfUkVBRFkpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwMCk7Ci0JfQotCi0JaWYgKGkgPT0gMykgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghKGNtZCAmIDEpKSB7Ci0JCW1lbWNweShkYXRhMzIsIGRhdGEsIGRhdGFfbnIpOwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlOVl9ERUJVR19LTVMoZGV2LCAid3IgJWQ6IDB4JTA4eFxuIiwgaSwgZGF0YTMyW2ldKTsKLQkJCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0RBVEFfT1VUKGluZGV4LCBpKSwgZGF0YTMyW2ldKTsKLQkJfQotCX0KLQotCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0FERFIoaW5kZXgpLCBhZGRyKTsKLQljdHJsICA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpKTsKLQljdHJsICY9IH4oTlY1MF9BVVhDSF9DVFJMX0NNRCB8IE5WNTBfQVVYQ0hfQ1RSTF9MRU4pOwotCWN0cmwgfD0gKGNtZCA8PCBOVjUwX0FVWENIX0NUUkxfQ01EX1NISUZUKTsKLQljdHJsIHw9ICgoZGF0YV9uciAtIDEpIDw8IE5WNTBfQVVYQ0hfQ1RSTF9MRU5fU0hJRlQpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCksIGN0cmwgfCAweDgwMDAwMDAwKTsKLQkJbnZfd3IzMihkZXYsIE5WNTBfQVVYQ0hfQ1RSTChpbmRleCksIGN0cmwpOwotCQludl93cjMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGluZGV4KSwgY3RybCB8IDB4MDAwMTAwMDApOwotCQlpZiAoIW52X3dhaXQoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpLAotCQkJICAgICAweDAwMDEwMDAwLCAweDAwMDAwMDAwKSkgewotCQkJTlZfRVJST1IoZGV2LCAiZXhwZWN0ZWQgYml0IDE2ID09IDAsIGdvdCAweCUwOHhcbiIsCi0JCQkJIG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoaW5kZXgpKSk7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXVkZWxheSg0MDApOwotCi0JCXN0YXQgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9TVEFUKGluZGV4KSk7Ci0JCWlmICgoc3RhdCAmIE5WNTBfQVVYQ0hfU1RBVF9SRVBMWV9BVVgpICE9Ci0JCQkgICAgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0FVWF9ERUZFUikKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID09IDE2KSB7Ci0JCU5WX0VSUk9SKGRldiwgImF1eGNoIERFRkVSIHRvbyBtYW55IHRpbWVzLCBiYWlsaW5nXG4iKTsKLQkJcmV0ID0gLUVSRU1PVEVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNtZCAmIDEpIHsKLQkJaWYgKChzdGF0ICYgTlY1MF9BVVhDSF9TVEFUX0NPVU5UKSAhPSBkYXRhX25yKSB7Ci0JCQlyZXQgPSAtRVJFTU9URUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlkYXRhMzJbaV0gPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9EQVRBX0lOKGluZGV4LCBpKSk7Ci0JCQlOVl9ERUJVR19LTVMoZGV2LCAicmQgJWQ6IDB4JTA4eFxuIiwgaSwgZGF0YTMyW2ldKTsKLQkJfQotCQltZW1jcHkoZGF0YSwgZGF0YTMyLCBkYXRhX25yKTsKLQl9Ci0KLW91dDoKLQl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9BVVhDSF9DVFJMKGF1eGNoLT5yZCkpOwotCW52X3dyMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSwgdG1wICYgfjB4MDAxMDAwMDApOwotCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX0FVWENIX0NUUkwoYXV4Y2gtPnJkKSk7Ci0JaWYgKHRtcCAmIDB4MDEwMDAwMDApIHsKLQkJTlZfRVJST1IoZGV2LCAiZXhwZWN0ZWQgYml0IDI0ID09IDAsIGdvdCAweCUwOHhcbiIsIHRtcCk7Ci0JCXJldCA9IC1FSU87Ci0JfQotCi0JdWRlbGF5KDQwMCk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogKHN0YXQgJiBOVjUwX0FVWENIX1NUQVRfUkVQTFkpOworCXJldHVybiBhdXhjaF90eChhdXhjaC0+ZGV2LCBhdXhjaC0+cmQsIGNtZCwgYWRkciwgZGF0YSwgZGF0YV9ucik7CiB9CiAKIHN0YXRpYyBpbnQKIG5vdXZlYXVfZHBfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqYXV4Y2ggPSAoc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKilhZGFwOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBhdXhjaC0+ZGV2OwogCXN0cnVjdCBpMmNfbXNnICptc2cgPSBtc2dzOwogCWludCByZXQsIG1jbnQgPSBudW07CiAKQEAgLTYwMiwxOSArNzE0LDYgQEAKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAKLQkJCXN3aXRjaCAocmV0ICYgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQykgewotCQkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0FDSzoKLQkJCQlicmVhazsKLQkJCWNhc2UgTlY1MF9BVVhDSF9TVEFUX1JFUExZX0kyQ19OQUNLOgotCQkJCXJldHVybiAtRVJFTU9URUlPOwotCQkJY2FzZSBOVjUwX0FVWENIX1NUQVRfUkVQTFlfSTJDX0RFRkVSOgotCQkJCXVkZWxheSgxMDApOwotCQkJCWNvbnRpbnVlOwotCQkJZGVmYXVsdDoKLQkJCQlOVl9FUlJPUihkZXYsICJiYWQgYXV4Y2ggcmVwbHk6IDB4JTA4eFxuIiwgcmV0KTsKLQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJCX0KLQogCQkJcHRyICs9IGNudDsKIAkJCXJlbWFpbmluZyAtPSBjbnQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCmluZGV4IGIzMGRkZDguLjlmN2JiMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYwpAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCkBAIC00MSw3ICs0Miw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoYWdwbW9kZSwgbm91dmVhdV9hZ3Btb2RlLCBpbnQsIDA0MDApOwogCiBNT0RVTEVfUEFSTV9ERVNDKG1vZGVzZXQsICJFbmFibGUga2VybmVsIG1vZGVzZXR0aW5nIik7Ci1zdGF0aWMgaW50IG5vdXZlYXVfbW9kZXNldCA9IC0xOyAvKiBrbXMgKi8KK2ludCBub3V2ZWF1X21vZGVzZXQgPSAtMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChtb2Rlc2V0LCBub3V2ZWF1X21vZGVzZXQsIGludCwgMDQwMCk7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmJpb3MsICJPdmVycmlkZSBkZWZhdWx0IFZCSU9TIGxvY2F0aW9uIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaAppbmRleCBkN2Q1MWRlLi4yOTgzN2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKQEAgLTQxNCwxMiArNDE0LDEzIEBACiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9wbV92b2x0YWdlX2xldmVsIHsKLQl1OCB2b2x0YWdlOwotCXU4IHZpZDsKKwl1MzIgdm9sdGFnZTsgLyogbWljcm92b2x0cyAqLworCXU4ICB2aWQ7CiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9wbV92b2x0YWdlIHsKIAlib29sIHN1cHBvcnRlZDsKKwl1OCB2ZXJzaW9uOwogCXU4IHZpZF9tYXNrOwogCiAJc3RydWN0IG5vdXZlYXVfcG1fdm9sdGFnZV9sZXZlbCAqbGV2ZWw7CkBAIC00MjgsMTcgKzQyOSw0OCBAQAogCiBzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgewogCWludCBpZDsKLQl1MzIgcmVnXzEwMDIyMDsKLQl1MzIgcmVnXzEwMDIyNDsKLQl1MzIgcmVnXzEwMDIyODsKLQl1MzIgcmVnXzEwMDIyYzsKLQl1MzIgcmVnXzEwMDIzMDsKLQl1MzIgcmVnXzEwMDIzNDsKLQl1MzIgcmVnXzEwMDIzODsKLQl1MzIgcmVnXzEwMDIzYzsKLQl1MzIgcmVnXzEwMDI0MDsKKwl1MzIgcmVnXzA7IC8qIDB4MTBmMjkwIG9uIEZlcm1pLCAweDEwMDIyMCBmb3Igb2xkZXIgKi8KKwl1MzIgcmVnXzE7CisJdTMyIHJlZ18yOworCXUzMiByZWdfMzsKKwl1MzIgcmVnXzQ7CisJdTMyIHJlZ181OworCXUzMiByZWdfNjsKKwl1MzIgcmVnXzc7CisJdTMyIHJlZ184OworCS8qIFRvIGJlIHdyaXR0ZW4gdG8gMHgxMDAyYzAgKi8KKwl1OCBDTDsKKwl1OCBXUjsKIH07CiAKK3N0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXJ7CisJdTggdmVyc2lvbjsKKwl1OCBoZWFkZXJfbGVuOworCXU4IGVudHJ5X2NudDsKKwl1OCBlbnRyeV9sZW47Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfZW50cnl7CisJdTggdFdSOworCXU4IHRVTktfMTsKKwl1OCB0Q0w7CisJdTggdFJQOwkJLyogQnl0ZSAzICovCisJdTggZW1wdHlfNDsKKwl1OCB0UkFTOwkvKiBCeXRlIDUgKi8KKwl1OCBlbXB0eV82OworCXU4IHRSRkM7CS8qIEJ5dGUgNyAqLworCXU4IGVtcHR5Xzg7CisJdTggdFJDOwkJLyogQnl0ZSA5ICovCisJdTggdFVOS18xMCwgdFVOS18xMSwgdFVOS18xMiwgdFVOS18xMywgdFVOS18xNDsKKwl1OCBlbXB0eV8xNSxlbXB0eV8xNixlbXB0eV8xNzsKKwl1OCB0VU5LXzE4LCB0VU5LXzE5LCB0VU5LXzIwLCB0VU5LXzIxOworfTsKKworLyogbm91dmVhdV9tZW0uYyAqLwordm9pZCBudjMwX21lbV90aW1pbmdfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciAqaGRyLAorCQkJCQkJCXN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSAqZSwgdWludDhfdCBtYWdpY19udW1iZXIsCisJCQkJCQkJc3RydWN0IG5vdXZlYXVfcG1fbWVtdGltaW5nICp0aW1pbmcpOworCiAjZGVmaW5lIE5PVVZFQVVfUE1fTUFYX0xFVkVMIDgKIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsIHsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKQEAgLTQ0OCwxMSArNDgwLDE5IEBACiAJdTMyIGNvcmU7CiAJdTMyIG1lbW9yeTsKIAl1MzIgc2hhZGVyOwotCXUzMiB1bmswNTsKLQl1MzIgdW5rMGE7CisJdTMyIHJvcDsKKwl1MzIgY29weTsKKwl1MzIgZGFlbW9uOworCXUzMiB2ZGVjOworCXUzMiB1bmswNTsJLyogbnY1MDpudmEzLCByb3VnaGx5Li4gKi8KKwl1MzIgdW5rYTA7CS8qIG52YTM6bnZjMCAqLworCXUzMiBodWIwMTsJLyogbnZjMC0gKi8KKwl1MzIgaHViMDY7CS8qIG52YzAtICovCisJdTMyIGh1YjA3OwkvKiBudmMwLSAqLwogCi0JdTggdm9sdGFnZTsKLQl1OCBmYW5zcGVlZDsKKwl1MzIgdm9sdF9taW47IC8qIG1pY3Jvdm9sdHMgKi8KKwl1MzIgdm9sdF9tYXg7CisJdTggIGZhbnNwZWVkOwogCiAJdTE2IG1lbXNjcmlwdDsKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZzsKQEAgLTQ5Niw2ICs1MzYsMTEgQEAKIAl2b2lkICooKmNsb2NrX3ByZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKiwKIAkJCSAgIHUzMiBpZCwgaW50IGtoeik7CiAJdm9pZCAoKmNsb2NrX3NldCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqKTsKKworCWludCAgKCpjbG9ja3NfZ2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqKTsKKwl2b2lkICooKmNsb2Nrc19wcmUpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOworCXZvaWQgKCpjbG9ja3Nfc2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOworCiAJaW50ICgqdm9sdGFnZV9nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKnZvbHRhZ2Vfc2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgdm9sdGFnZSk7CiAJaW50ICgqZmFuc3BlZWRfZ2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTUwNCw3ICs1NDksNyBAQAogfTsKIAogc3RydWN0IG5vdXZlYXVfdnJhbV9lbmdpbmUgewotCXN0cnVjdCBub3V2ZWF1X21tICptbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSBtbTsKIAogCWludCAgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAl2b2lkICgqdGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtNjIzLDYgKzY2OCw3IEBACiAJTlZfNDAgICAgICA9IDB4NDAsCiAJTlZfNTAgICAgICA9IDB4NTAsCiAJTlZfQzAgICAgICA9IDB4YzAsCisJTlZfRDAgICAgICA9IDB4ZDAKIH07CiAKIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlIHsKQEAgLTYzMyw4ICs2NzksOCBAQAogCWVudW0gbm91dmVhdV9jYXJkX3R5cGUgY2FyZF90eXBlOwogCS8qIGV4YWN0IGNoaXBzZXQsIGRlcml2ZWQgZnJvbSBOVl9QTUNfQk9PVF8wICovCiAJaW50IGNoaXBzZXQ7Ci0JaW50IHN0ZXBwaW5nOwogCWludCBmbGFnczsKKwl1MzIgY3J5c3RhbDsKIAogCXZvaWQgX19pb21lbSAqbW1pbzsKIApAQCAtNzIxLDcgKzc2Nyw2IEBACiAJdWludDY0X3QgdnJhbV9zaXplOwogCXVpbnQ2NF90IHZyYW1fc3lzX2Jhc2U7CiAKLQl1aW50NjRfdCBmYl9waHlzOwogCXVpbnQ2NF90IGZiX2F2YWlsYWJsZV9zaXplOwogCXVpbnQ2NF90IGZiX21hcHBhYmxlX3BhZ2VzOwogCXVpbnQ2NF90IGZiX2FwZXJfZnJlZTsKQEAgLTc4NCw2ICs4MjksNyBAQAogfQogCiAvKiBub3V2ZWF1X2Rydi5jICovCitleHRlcm4gaW50IG5vdXZlYXVfbW9kZXNldDsKIGV4dGVybiBpbnQgbm91dmVhdV9hZ3Btb2RlOwogZXh0ZXJuIGludCBub3V2ZWF1X2R1YWxsaW5rOwogZXh0ZXJuIGludCBub3V2ZWF1X3VzY3JpcHRfbHZkczsKQEAgLTgyNCw2ICs4NzAsOCBAQAogCQkJICAgIHVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKTsKIGV4dGVybiBib29sIG5vdXZlYXVfd2FpdF9uZShzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50NjRfdCB0aW1lb3V0LAogCQkJICAgIHVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKTsKK2V4dGVybiBib29sIG5vdXZlYXVfd2FpdF9jYihzdHJ1Y3QgZHJtX2RldmljZSAqLCB1NjQgdGltZW91dCwKKwkJCSAgICBib29sICgqY29uZCkodm9pZCAqKSwgdm9pZCAqKTsKIGV4dGVybiBib29sIG5vdXZlYXVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG5vdXZlYXVfY2FyZF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCkBAIC0xMDA2LDE1ICsxMDU0LDE1IEBACiAKIC8qIG5vdXZlYXVfYmFja2xpZ2h0LmMgKi8KICNpZmRlZiBDT05GSUdfRFJNX05PVVZFQVVfQkFDS0xJR0hUCi1leHRlcm4gaW50IG5vdXZlYXVfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRybV9jb25uZWN0b3IgKik7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fY29ubmVjdG9yICopOworZXh0ZXJuIGludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9iYWNrbGlnaHRfZXhpdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBub3V2ZWF1X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBub3V2ZWF1X2JhY2tsaWdodF9leGl0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpkZXYpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIG5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikgeyB9CiAjZW5kaWYKIAogLyogbm91dmVhdV9iaW9zLmMgKi8KQEAgLTEwMjIsNyArMTA3MCw4IEBACiBleHRlcm4gdm9pZCBub3V2ZWF1X2Jpb3NfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IG5vdXZlYXVfcnVuX3ZiaW9zX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDE2X3QgdGFibGUsCi0JCQkJCXN0cnVjdCBkY2JfZW50cnkgKik7CisJCQkJCXN0cnVjdCBkY2JfZW50cnkgKiwgaW50IGNydGMpOworZXh0ZXJuIHZvaWQgbm91dmVhdV9iaW9zX2luaXRfZXhlYyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50MTZfdCB0YWJsZSk7CiBleHRlcm4gc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqLAogCQkJCQkJICAgICAgZW51bSBkY2JfZ3Bpb190YWcpOwogZXh0ZXJuIHN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5ICoKQEAgLTEwMzAsMTEgKzEwNzksOCBAQAogZXh0ZXJuIHUzMiBnZXRfcGxsX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gcGxsX3R5cGVzKTsKIGV4dGVybiBpbnQgZ2V0X3BsbF9saW1pdHMoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDMyX3QgbGltaXRfbWF0Y2gsCiAJCQkgIHN0cnVjdCBwbGxfbGltcyAqKTsKLWV4dGVybiBpbnQgbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosCi0JCQkJCSAgc3RydWN0IGRjYl9lbnRyeSAqLAotCQkJCQkgIHVpbnQzMl90IHNjcmlwdCwgaW50IHB4Y2xrKTsKLWV4dGVybiB2b2lkICpub3V2ZWF1X2Jpb3NfZHBfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRjYl9lbnRyeSAqLAotCQkJCSAgIGludCAqbGVuZ3RoKTsKK2V4dGVybiBpbnQgbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIHUxNiBpZCwgaW50IGNsaywKKwkJCQkJICBzdHJ1Y3QgZGNiX2VudHJ5ICosIGludCBjcnRjKTsKIGV4dGVybiBib29sIG5vdXZlYXVfYmlvc19mcF9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICopOwogZXh0ZXJuIHVpbnQ4X3QgKm5vdXZlYXVfYmlvc19lbWJlZGRlZF9lZGlkKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCBub3V2ZWF1X2Jpb3NfcGFyc2VfbHZkc190YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgcHhjbGssCkBAIC0xMDQzLDYgKzEwODksNyBAQAogCQkJICBpbnQgaGVhZCwgaW50IHB4Y2xrKTsKIGV4dGVybiBpbnQgY2FsbF9sdmRzX3NjcmlwdChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICosIGludCBoZWFkLAogCQkJICAgIGVudW0gTFZEU19zY3JpcHQsIGludCBweGNsayk7Citib29sIGJpb3NfZW5jb2Rlcl9tYXRjaChzdHJ1Y3QgZGNiX2VudHJ5ICosIHUzMiBoYXNoKTsKIAogLyogbm91dmVhdV90dG0uYyAqLwogaW50IG5vdXZlYXVfdHRtX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICopOwpAQCAtMTA1Myw3ICsxMTAwLDkgQEAKIGludCBub3V2ZWF1X2RwX2F1eGNoKHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICphdXhjaCwgaW50IGNtZCwgaW50IGFkZHIsCiAJCSAgICAgdWludDhfdCAqZGF0YSwgaW50IGRhdGFfbnIpOwogYm9vbCBub3V2ZWF1X2RwX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKik7Ci1ib29sIG5vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKik7Citib29sIG5vdXZlYXVfZHBfbGlua190cmFpbihzdHJ1Y3QgZHJtX2VuY29kZXIgKiwgdTMyIGRhdGFyYXRlKTsKK3ZvaWQgbm91dmVhdV9kcF90dV91cGRhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCBpbnQsIHUzMiwgdTMyKTsKK3U4ICpub3V2ZWF1X2RwX2Jpb3NfZGF0YShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICosIHU4ICoqKTsKIAogLyogbnYwNF9mYi5jICovCiBleHRlcm4gaW50ICBudjA0X2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC0xMTc5LDggKzEyMjgsOCBAQAogLyogbnZjMF9jb3B5LmMgKi8KIGV4dGVybiBpbnQgIG52YzBfY29weV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSk7CiAKLS8qIG52NDBfbXBlZy5jICovCi1leHRlcm4gaW50ICBudjQwX21wZWdfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworLyogbnYzMV9tcGVnLmMgKi8KK2V4dGVybiBpbnQgIG52MzFfbXBlZ19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIC8qIG52NTBfbXBlZy5jICovCiBleHRlcm4gaW50ICBudjUwX21wZWdfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTI2NSw2ICsxMzE0LDExIEBACiBleHRlcm4gaW50IG52MDRfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnYwNF9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKik7CiAKKy8qIG52ZDBfZGlzcGxheS5jICovCitleHRlcm4gaW50IG52ZDBfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKik7CitleHRlcm4gaW50IG52ZDBfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnZkMF9kaXNwbGF5X2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKik7CisKIC8qIG52MDRfY3J0Yy5jICovCiBleHRlcm4gaW50IG52MDRfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGluZGV4KTsKIApAQCAtMTM3NCw2ICsxNDI4LDggQEAKIHZvaWQgbnY1MF9ncGlvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOwogaW50IG52NTBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOworaW50IG52ZDBfZ3Bpb19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKTsKK2ludCBudmQwX2dwaW9fc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgaW50IHN0YXRlKTsKIGludCAgbnY1MF9ncGlvX2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywKIAkJCSAgICB2b2lkICgqKSh2b2lkICosIGludCksIHZvaWQgKik7CiB2b2lkIG52NTBfZ3Bpb19pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywKQEAgLTE0NDgsNiArMTUwNCw4IEBACiAJbm91dmVhdV93YWl0X2VxKGRldiwgMjAwMDAwMDAwMFVMTCwgKHJlZyksIChtYXNrKSwgKHZhbCkpCiAjZGVmaW5lIG52X3dhaXRfbmUoZGV2LCByZWcsIG1hc2ssIHZhbCkgXAogCW5vdXZlYXVfd2FpdF9uZShkZXYsIDIwMDAwMDAwMDBVTEwsIChyZWcpLCAobWFzayksICh2YWwpKQorI2RlZmluZSBudl93YWl0X2NiKGRldiwgZnVuYywgZGF0YSkgXAorCW5vdXZlYXVfd2FpdF9jYihkZXYsIDIwMDAwMDAwMDBVTEwsIChmdW5jKSwgKGRhdGEpKQogCiAvKiBQUkFNSU4gYWNjZXNzICovCiBzdGF0aWMgaW5saW5lIHUzMiBudl9yaTMyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTE1MTQsNiArMTU3Miw3IEBACiAJTk9VVkVBVV9SRUdfREVCVUdfUk1WSU8gICAgICAgICAgPSAweDgwLAogCU5PVVZFQVVfUkVHX0RFQlVHX1ZHQUFUVFIgICAgICAgID0gMHgxMDAsCiAJTk9VVkVBVV9SRUdfREVCVUdfRVZPICAgICAgICAgICAgPSAweDIwMCwKKwlOT1VWRUFVX1JFR19ERUJVR19BVVhDSCAgICAgICAgICA9IDB4NDAwCiB9OwogCiAjZGVmaW5lIE5WX1JFR19ERUJVRyh0eXBlLCBkZXYsIGZtdCwgYXJnLi4uKSBkbyB7IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZW5jb2Rlci5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKaW5kZXggYWU2OWI2MS4uZTVkNmUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9lbmNvZGVyLmgKQEAgLTQ5LDE3ICs0OSwxNyBAQAogCiAJdW5pb24gewogCQlzdHJ1Y3QgewotCQkJaW50IG1jX3Vua25vd247Ci0JCQl1aW50MzJfdCB1bmswOwotCQkJdWludDMyX3QgdW5rMTsKLQkJCWludCBkcGNkX3ZlcnNpb247CisJCQl1OCAgZHBjZFs4XTsKIAkJCWludCBsaW5rX25yOwogCQkJaW50IGxpbmtfYnc7Ci0JCQlib29sIGVuaGFuY2VkX2ZyYW1lOworCQkJdTMyIGRhdGFyYXRlOwogCQl9IGRwOwogCX07CiB9OwogCitzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoKK2ZpbmRfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgdHlwZSk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbm91dmVhdV9lbmNvZGVyKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jKQogewogCXN0cnVjdCBkcm1fZW5jb2Rlcl9zbGF2ZSAqc2xhdmUgPSB0b19lbmNvZGVyX3NsYXZlKGVuYyk7CkBAIC04MywyMSArODMsNCBAQAogaW50IG52NTBfc29yX2NyZWF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICopOwogaW50IG52NTBfZGFjX2NyZWF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqLCBzdHJ1Y3QgZGNiX2VudHJ5ICopOwogCi1zdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgewotCXVpbnQzMl90IG1hdGNoOwotCXVpbnQ4X3QgIHJlY29yZF9ucjsKLQl1aW50OF90ICB1bmtub3duOwotCXVpbnQxNl90IHNjcmlwdDA7Ci0JdWludDE2X3Qgc2NyaXB0MTsKLQl1aW50MTZfdCB1bmtub3duX3RhYmxlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBiaXRfZGlzcGxheXBvcnRfZW5jb2Rlcl90YWJsZV9lbnRyeSB7Ci0JdWludDhfdCB2c19sZXZlbDsKLQl1aW50OF90IHByZV9sZXZlbDsKLQl1aW50OF90IHJlZzA7Ci0JdWludDhfdCByZWcxOwotCXVpbnQ4X3QgcmVnMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCiAjZW5kaWYgLyogX19OT1VWRUFVX0VOQ09ERVJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKaW5kZXggMTRhODYyNy4uM2E0Y2MzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwpAQCAtNDg3LDYgKzQ4Nyw3IEBACiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2OworCWludCBwcmVmZXJyZWRfYnBwOwogCWludCByZXQ7CiAKIAluZmJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9mYmRldiksIEdGUF9LRVJORUwpOwpAQCAtNTA1LDcgKzUwNiwxNSBAQAogCX0KIAogCWRybV9mYl9oZWxwZXJfc2luZ2xlX2FkZF9hbGxfY29ubmVjdG9ycygmbmZiZGV2LT5oZWxwZXIpOwotCWRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoJm5mYmRldi0+aGVscGVyLCAzMik7CisKKwlpZiAoZGV2X3ByaXYtPnZyYW1fc2l6ZSA8PSAzMiAqIDEwMjQgKiAxMDI0KQorCQlwcmVmZXJyZWRfYnBwID0gODsKKwllbHNlIGlmIChkZXZfcHJpdi0+dnJhbV9zaXplIDw9IDY0ICogMTAyNCAqIDEwMjQpCisJCXByZWZlcnJlZF9icHAgPSAxNjsKKwllbHNlCisJCXByZWZlcnJlZF9icHAgPSAzMjsKKworCWRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcoJm5mYmRldi0+aGVscGVyLCBwcmVmZXJyZWRfYnBwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCmluZGV4IGM5MTljZmMuLjJmNmRhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKQEAgLTUxOSw3ICs1MTksNyBAQAogCWlmIChVU0VfU0VNQShkZXYpICYmIGRldl9wcml2LT5jaGlwc2V0IDwgMHg4NCkgewogCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbTsKIAotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0ZST01fTUVNT1JZLAogCQkJCQkgICAgIG1lbS0+c3RhcnQgPDwgUEFHRV9TSElGVCwKIAkJCQkJICAgICBtZW0tPnNpemUsIE5WX01FTV9BQ0NFU1NfUlcsCiAJCQkJCSAgICAgTlZfTUVNX1RBUkdFVF9WUkFNLCAmb2JqKTsKQEAgLTUzOSw4ICs1MzksNiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlJTklUX0xJU1RfSEVBRCgmY2hhbi0+ZmVuY2UucGVuZGluZyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmZlbmNlLmxvY2spOwogCWF0b21pY19zZXQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxLCAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2kyYy5jCmluZGV4IGNiMzg5ZDAuLmQzOWIyMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pMmMuYwpAQCAtMjIsNiArMjIsOCBAQAogICogQXV0aG9yczogQmVuIFNrZWdncwogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfaTJjLmgiCkBAIC0xMDcsNiArMTA5LDEzIEBACiAJcmV0dXJuICEhKChudl9yZDMyKGRldiwgaTJjLT5yZCkgPj4gMTYpICYgOCk7CiB9CiAKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBudjUwX2kyY19wb3J0W10gPSB7CisJMHgwMGUxMzgsIDB4MDBlMTUwLCAweDAwZTE2OCwgMHgwMGUxODAsCisJMHgwMGUyNTQsIDB4MDBlMjc0LCAweDAwZTc2NCwgMHgwMGU3ODAsCisJMHgwMGU3OWMsIDB4MDBlN2I4Cit9OworI2RlZmluZSBOVjUwX0kyQ19QT1JUUyBBUlJBWV9TSVpFKG52NTBfaTJjX3BvcnQpCisKIHN0YXRpYyBpbnQKIG52NTBfaTJjX2dldHNjbCh2b2lkICpkYXRhKQogewpAQCAtMTMwLDI4ICsxMzksMzIgQEAKIG52NTBfaTJjX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGkyYy0+ZGV2OwogCi0JbnZfd3IzMihkZXYsIGkyYy0+d3IsIDQgfCAoaTJjLT5kYXRhID8gMiA6IDApIHwgKHN0YXRlID8gMSA6IDApKTsKKwludl93cjMyKGkyYy0+ZGV2LCBpMmMtPndyLCA0IHwgKGkyYy0+ZGF0YSA/IDIgOiAwKSB8IChzdGF0ZSA/IDEgOiAwKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBudjUwX2kyY19zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQogewogCXN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICppMmMgPSBkYXRhOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpMmMtPmRldjsKIAotCW52X3dyMzIoZGV2LCBpMmMtPndyLAotCQkJKG52X3JkMzIoZGV2LCBpMmMtPnJkKSAmIDEpIHwgNCB8IChzdGF0ZSA/IDIgOiAwKSk7CisJbnZfbWFzayhpMmMtPmRldiwgaTJjLT53ciwgMHgwMDAwMDAwNiwgNCB8IChzdGF0ZSA/IDIgOiAwKSk7CiAJaTJjLT5kYXRhID0gc3RhdGU7CiB9CiAKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBudjUwX2kyY19wb3J0W10gPSB7Ci0JMHgwMGUxMzgsIDB4MDBlMTUwLCAweDAwZTE2OCwgMHgwMGUxODAsCi0JMHgwMGUyNTQsIDB4MDBlMjc0LCAweDAwZTc2NCwgMHgwMGU3ODAsCi0JMHgwMGU3OWMsIDB4MDBlN2I4Ci19OwotI2RlZmluZSBOVjUwX0kyQ19QT1JUUyBBUlJBWV9TSVpFKG52NTBfaTJjX3BvcnQpCitzdGF0aWMgaW50CitudmQwX2kyY19nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9pMmNfY2hhbiAqaTJjID0gZGF0YTsKKwlyZXR1cm4gISEobnZfcmQzMihpMmMtPmRldiwgaTJjLT5yZCkgJiAweDEwKTsKK30KKworc3RhdGljIGludAorbnZkMF9pMmNfZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5vdXZlYXVfaTJjX2NoYW4gKmkyYyA9IGRhdGE7CisJcmV0dXJuICEhKG52X3JkMzIoaTJjLT5kZXYsIGkyYy0+cmQpICYgMHgyMCk7Cit9CiAKIGludAogbm91dmVhdV9pMmNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGNiX2kyY19lbnRyeSAqZW50cnksIGludCBpbmRleCkKQEAgLTE2Myw3ICsxNzYsOCBAQAogCWlmIChlbnRyeS0+Y2hhbikKIAkJcmV0dXJuIC1FRVhJU1Q7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJiBlbnRyeS0+cmVhZCA+PSBOVjUwX0kyQ19QT1JUUykgeworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmCisJICAgIGRldl9wcml2LT5jYXJkX3R5cGUgPD0gTlZfQzAgJiYgZW50cnktPnJlYWQgPj0gTlY1MF9JMkNfUE9SVFMpIHsKIAkJTlZfRVJST1IoZGV2LCAidW5rbm93biBpMmMgcG9ydCAlZFxuIiwgZW50cnktPnJlYWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xOTIsMTAgKzIwNiwxNyBAQAogCWNhc2UgNToKIAkJaTJjLT5iaXQuc2V0c2RhID0gbnY1MF9pMmNfc2V0c2RhOwogCQlpMmMtPmJpdC5zZXRzY2wgPSBudjUwX2kyY19zZXRzY2w7Ci0JCWkyYy0+Yml0LmdldHNkYSA9IG52NTBfaTJjX2dldHNkYTsKLQkJaTJjLT5iaXQuZ2V0c2NsID0gbnY1MF9pMmNfZ2V0c2NsOwotCQlpMmMtPnJkID0gbnY1MF9pMmNfcG9ydFtlbnRyeS0+cmVhZF07Ci0JCWkyYy0+d3IgPSBpMmMtPnJkOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0QwKSB7CisJCQlpMmMtPmJpdC5nZXRzZGEgPSBudjUwX2kyY19nZXRzZGE7CisJCQlpMmMtPmJpdC5nZXRzY2wgPSBudjUwX2kyY19nZXRzY2w7CisJCQlpMmMtPnJkID0gbnY1MF9pMmNfcG9ydFtlbnRyeS0+cmVhZF07CisJCQlpMmMtPndyID0gaTJjLT5yZDsKKwkJfSBlbHNlIHsKKwkJCWkyYy0+Yml0LmdldHNkYSA9IG52ZDBfaTJjX2dldHNkYTsKKwkJCWkyYy0+Yml0LmdldHNjbCA9IG52ZDBfaTJjX2dldHNjbDsKKwkJCWkyYy0+cmQgPSAweDAwZDAxNCArIChlbnRyeS0+cmVhZCAqIDB4MjApOworCQkJaTJjLT53ciA9IGkyYy0+cmQ7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSA2OgogCQlpMmMtPnJkID0gZW50cnktPnJlYWQ7CkBAIC0yNjcsNyArMjg4LDEwIEBACiAJCQl2YWwgID0gMHhlMDAxOwogCQl9CiAKLQkJbnZfd3IzMihkZXYsIHJlZywgKG52X3JkMzIoZGV2LCByZWcpICYgfjB4ZjAwMykgfCB2YWwpOworCQkvKiBuZmksIGJ1dCBuZWl0aGVyIGF1eGNoIG9yIGkyYyB3b3JrIGlmIGl0J3MgMSAqLworCQludl9tYXNrKGRldiwgcmVnICsgMHgwYywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJCS8qIG5maSwgYnV0IHN3aXRjaGVzIGF1eGNoIHZzIG5vcm1hbCBpMmMgKi8KKwkJbnZfbWFzayhkZXYsIHJlZyArIDB4MDAsIDB4MDAwMGYwMDMsIHZhbCk7CiAJfQogCiAJaWYgKCFpMmMtPmNoYW4gJiYgbm91dmVhdV9pMmNfaW5pdChkZXYsIGkyYywgaW5kZXgpKQpAQCAtMzA5LDcgKzMzMyw3IEBACiAKIAlOVl9ERUJVRyhkZXYsICJQcm9iaW5nICVzcyBvbiBJMkMgYnVzOiAlZFxuIiwgd2hhdCwgaW5kZXgpOwogCi0JZm9yIChpID0gMDsgaW5mb1tpXS5hZGRyOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpMmMgJiYgaW5mb1tpXS5hZGRyOyBpKyspIHsKIAkJaWYgKG5vdXZlYXVfcHJvYmVfaTJjX2FkZHIoaTJjLCBpbmZvW2ldLmFkZHIpICYmCiAJCSAgICAoIW1hdGNoIHx8IG1hdGNoKGkyYywgJmluZm9baV0pKSkgewogCQkJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCAlczogJXNcbiIsIHdoYXQsIGluZm9baV0udHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwppbmRleCBmOWFlMmZjLi4zNmJlYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKQEAgLTQwOCw4ICs0MDgsNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfcHJpdi0+ZmJfcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOwotCiAJcmV0ID0gbm91dmVhdV90dG1fZ2xvYmFsX2luaXQoZGV2X3ByaXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC01MDQsMzUgKzUwMiwxNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogWFhYOiBGb3Igbm93IGEgZHVtbXkuIE1vcmUgc2FtcGxlcyByZXF1aXJlZCwgcG9zc2libHkgZXZlbiBhIGNhcmQKKyAqIENhbGxlZCBmcm9tIG5vdXZlYXVfcGVyZi5jICovCit2b2lkIG52MzBfbWVtX3RpbWluZ19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICpoZHIsCisJCQkJCQkJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5ICplLCB1aW50OF90IG1hZ2ljX251bWJlciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZykgeworCisJTlZfREVCVUcoZGV2LCJUaW1pbmcgZW50cnkgZm9ybWF0IHVua25vd24sIHBsZWFzZSBjb250YWN0IG5vdXZlYXUgZGV2ZWxvcGVycyIpOworfQorCit2b2lkIG52NDBfbWVtX3RpbWluZ19lbnRyeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICpoZHIsCisJCQkJCQkJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2VudHJ5ICplLCB1aW50OF90IG1hZ2ljX251bWJlciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmcgKnRpbWluZykgeworCisJdGltaW5nLT5yZWdfMCA9IChlLT50UkMgPDwgMjQgfCBlLT50UkZDIDw8IDE2IHwgZS0+dFJBUyA8PCA4IHwgZS0+dFJQKTsKKworCS8qIFhYWDogSSBkb24ndCB0cnVzdCB0aGUgLTEncyBhbmQgKzEncy4uLiB0aGV5IG11c3QgY29tZQorCSAqICAgICAgZnJvbSBzb21ld2hlcmUhICovCisJdGltaW5nLT5yZWdfMSA9IChlLT50V1IgKyAyICsgbWFnaWNfbnVtYmVyKSA8PCAyNCB8CisJCQkJICAxIDw8IDE2IHwKKwkJCQkgIChlLT50VU5LXzEgKyAyICsgbWFnaWNfbnVtYmVyKSA8PCA4IHwKKwkJCQkgIChlLT50Q0wgKyAyIC0gbWFnaWNfbnVtYmVyKTsKKwl0aW1pbmctPnJlZ18yID0gKG1hZ2ljX251bWJlciA8PCAyNCB8IGUtPnRVTktfMTIgPDwgMTYgfCBlLT50VU5LXzExIDw8IDggfCBlLT50VU5LXzEwKTsKKwl0aW1pbmctPnJlZ18yIHw9IDB4MjAyMDAwMDA7CisKKwlOVl9ERUJVRyhkZXYsICJFbnRyeSAlZDogMjIwOiAlMDh4ICUwOHggJTA4eFxuIiwgdGltaW5nLT5pZCwKKwkJIHRpbWluZy0+cmVnXzAsIHRpbWluZy0+cmVnXzEsdGltaW5nLT5yZWdfMik7Cit9CisKK3ZvaWQgbnY1MF9tZW1fdGltaW5nX2VudHJ5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBiaXRfZW50cnkgKlAsIHN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgKmhkciwKKwkJCQkJCQlzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfZW50cnkgKmUsIHVpbnQ4X3QgbWFnaWNfbnVtYmVyLHN0cnVjdCBub3V2ZWF1X3BtX21lbXRpbWluZyAqdGltaW5nKSB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXVpbnQ4X3QgdW5rMTggPSAxLAorCQl1bmsxOSA9IDEsCisJCXVuazIwID0gMCwKKwkJdW5rMjEgPSAwOworCisJc3dpdGNoIChtaW4oaGRyLT5lbnRyeV9sZW4sICh1OCkgMjIpKSB7CisJY2FzZSAyMjoKKwkJdW5rMjEgPSBlLT50VU5LXzIxOworCWNhc2UgMjE6CisJCXVuazIwID0gZS0+dFVOS18yMDsKKwljYXNlIDIwOgorCQl1bmsxOSA9IGUtPnRVTktfMTk7CisJY2FzZSAxOToKKwkJdW5rMTggPSBlLT50VU5LXzE4OworCQlicmVhazsKKwl9CisKKwl0aW1pbmctPnJlZ18wID0gKGUtPnRSQyA8PCAyNCB8IGUtPnRSRkMgPDwgMTYgfCBlLT50UkFTIDw8IDggfCBlLT50UlApOworCisJLyogWFhYOiBJIGRvbid0IHRydXN0IHRoZSAtMSdzIGFuZCArMSdzLi4uIHRoZXkgbXVzdCBjb21lCisJICogICAgICBmcm9tIHNvbWV3aGVyZSEgKi8KKwl0aW1pbmctPnJlZ18xID0gKGUtPnRXUiArIHVuazE5ICsgMSArIG1hZ2ljX251bWJlcikgPDwgMjQgfAorCQkJCSAgbWF4KHVuazE4LCAodTgpIDEpIDw8IDE2IHwKKwkJCQkgIChlLT50VU5LXzEgKyB1bmsxOSArIDEgKyBtYWdpY19udW1iZXIpIDw8IDg7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTgpIHsKKwkJdGltaW5nLT5yZWdfMSB8PSAoZS0+dENMIC0gMSk7CisJfSBlbHNlIHsKKwkJdGltaW5nLT5yZWdfMSB8PSAoZS0+dENMICsgMiAtIG1hZ2ljX251bWJlcik7CisJfQorCXRpbWluZy0+cmVnXzIgPSAoZS0+dFVOS18xMiA8PCAxNiB8IGUtPnRVTktfMTEgPDwgOCB8IGUtPnRVTktfMTApOworCisJdGltaW5nLT5yZWdfNSA9IChlLT50UkFTIDw8IDI0IHwgZS0+dFJDKTsKKwl0aW1pbmctPnJlZ181ICs9IG1heChlLT50VU5LXzEwLCBlLT50VU5LXzExKSA8PCAxNjsKKworCWlmIChQLT52ZXJzaW9uID09IDEpIHsKKwkJdGltaW5nLT5yZWdfMiB8PSBtYWdpY19udW1iZXIgPDwgMjQ7CisJCXRpbWluZy0+cmVnXzMgPSAoMHgxNCArIGUtPnRDTCkgPDwgMjQgfAorCQkJCQkJMHgxNiA8PCAxNiB8CisJCQkJCQkoZS0+dENMIC0gMSkgPDwgOCB8CisJCQkJCQkoZS0+dENMIC0gMSk7CisJCXRpbWluZy0+cmVnXzQgPSAobnZfcmQzMihkZXYsMHgxMDAyMmMpICYgMHhmZmZmMDAwMCkgfCBlLT50VU5LXzEzIDw8IDggIHwgZS0+dFVOS18xMzsKKwkJdGltaW5nLT5yZWdfNSB8PSAoZS0+dENMICsgMikgPDwgODsKKwkJdGltaW5nLT5yZWdfNyA9IDB4NDAwMDIwMiB8IChlLT50Q0wgLSAxKSA8PCAxNjsKKwl9IGVsc2UgeworCQl0aW1pbmctPnJlZ18yIHw9ICh1bmsxOSAtIDEpIDw8IDI0OworCQkvKiBYWFg6IHJlZ18xMDAyMmMgZm9yIHJlY2VudGlzaCBjYXJkcyBwcmV0dHkgbXVjaCB1bmtub3duKi8KKwkJdGltaW5nLT5yZWdfMyA9IGUtPnRDTCAtIDE7CisJCXRpbWluZy0+cmVnXzQgPSAodW5rMjAgPDwgMjQgfCB1bmsyMSA8PCAxNiB8CisJCQkJCQkJZS0+dFVOS18xMyA8PCA4ICB8IGUtPnRVTktfMTMpOworCQkvKiBYWFg6ICs2PyAqLworCQl0aW1pbmctPnJlZ181IHw9ICh1bmsxOSArIDYpIDw8IDg7CisKKwkJLyogWFhYOiByZWdfMTAwMjNjIGN1cnJlbnRseSB1bmtub3duCisJCSAqIDEwMDIzYyBzZWVuIGFzIDA2eHh4eHh4LCAwYnh4eHh4eCBvciAwZnh4eHh4eCAqLworCQl0aW1pbmctPnJlZ183ID0gMHgyMDI7CisJfQorCisJTlZfREVCVUcoZGV2LCAiRW50cnkgJWQ6IDIyMDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgdGltaW5nLT5pZCwKKwkJIHRpbWluZy0+cmVnXzAsIHRpbWluZy0+cmVnXzEsCisJCSB0aW1pbmctPnJlZ18yLCB0aW1pbmctPnJlZ18zKTsKKwlOVl9ERUJVRyhkZXYsICIgICAgICAgICAyMzA6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCSB0aW1pbmctPnJlZ180LCB0aW1pbmctPnJlZ181LAorCQkgdGltaW5nLT5yZWdfNiwgdGltaW5nLT5yZWdfNyk7CisJTlZfREVCVUcoZGV2LCAiICAgICAgICAgMjQwOiAlMDh4XG4iLCB0aW1pbmctPnJlZ184KTsKK30KKwordm9pZCBudmMwX21lbV90aW1pbmdfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciAqaGRyLAorCQkJCQkJCXN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSAqZSwgc3RydWN0IG5vdXZlYXVfcG1fbWVtdGltaW5nICp0aW1pbmcpIHsKKwl0aW1pbmctPnJlZ18wID0gKGUtPnRSQyA8PCAyNCB8IChlLT50UkZDICYgMHg3ZikgPDwgMTcgfCBlLT50UkFTIDw8IDggfCBlLT50UlApOworCXRpbWluZy0+cmVnXzEgPSAobnZfcmQzMihkZXYsMHgxMGYyOTQpICYgMHhmZjAwMDAwMCkgfCAoZS0+dFVOS18xMSYweDBmKSA8PCAyMCB8IChlLT50VU5LXzE5IDw8IDcpIHwgKGUtPnRDTCAmIDB4MGYpOworCXRpbWluZy0+cmVnXzIgPSAobnZfcmQzMihkZXYsMHgxMGYyOTgpICYgMHhmZjAwMDBmZikgfCBlLT50V1IgPDwgMTYgfCBlLT50VU5LXzEgPDwgODsKKwl0aW1pbmctPnJlZ18zID0gZS0+dFVOS18yMCA8PCA5IHwgZS0+dFVOS18xMzsKKwl0aW1pbmctPnJlZ180ID0gKG52X3JkMzIoZGV2LDB4MTBmMmEwKSAmIDB4ZmZmMDAwZmYpIHwgZS0+dFVOS18xMiA8PCAxNTsKKwlOVl9ERUJVRyhkZXYsICJFbnRyeSAlZDogMjkwOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCB0aW1pbmctPmlkLAorCQkgdGltaW5nLT5yZWdfMCwgdGltaW5nLT5yZWdfMSwKKwkJIHRpbWluZy0+cmVnXzIsIHRpbWluZy0+cmVnXzMpOworCU5WX0RFQlVHKGRldiwgIiAgICAgICAgIDJhMDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJIHRpbWluZy0+cmVnXzQsIHRpbWluZy0+cmVnXzUsCisJCSB0aW1pbmctPnJlZ182LCB0aW1pbmctPnJlZ183KTsKK30KKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIE1lbW9yeSBUaW1pbmcgQklPUyB0YWJsZSwgc3RvcmVzIGdlbmVyYXRlZAorICogcmVnaXN0ZXIgdmFsdWVzCisgKiBAcHJlIGluaXQgc2NyaXB0cyB3ZXJlIHJ1biwgbWVtdGltaW5nIHJlZ3MgYXJlIGluaXRpYWxpemVkCisgKi8KIHZvaWQKIG5vdXZlYXVfbWVtX3RpbWluZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JLyogY2FyZHMgPCBOVkMwIG9ubHkgKi8KIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3BtX2VuZ2luZSAqcG0gPSAmZGV2X3ByaXYtPmVuZ2luZS5wbTsKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmdzICptZW10aW1pbmdzID0gJnBtLT5tZW10aW1pbmdzOwogCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOwogCXN0cnVjdCBiaXRfZW50cnkgUDsKLQl1OCB0VU5LXzAsIHRVTktfMSwgdFVOS18yOwotCXU4IHRSUDsJCS8qIEJ5dGUgMyAqLwotCXU4IHRSQVM7CS8qIEJ5dGUgNSAqLwotCXU4IHRSRkM7CS8qIEJ5dGUgNyAqLwotCXU4IHRSQzsJCS8qIEJ5dGUgOSAqLwotCXU4IHRVTktfMTAsIHRVTktfMTEsIHRVTktfMTIsIHRVTktfMTMsIHRVTktfMTQ7Ci0JdTggdFVOS18xOCwgdFVOS18xOSwgdFVOS18yMCwgdFVOS18yMTsKLQl1OCBtYWdpY19udW1iZXIgPSAwOyAvKiBZZWFoLi4uIHNvcnJ5Ki8KLQl1OCAqbWVtID0gTlVMTCwgKmVudHJ5OwotCWludCBpLCByZWNvcmRsZW4sIGVudHJpZXM7CisJc3RydWN0IG5vdXZlYXVfcG1fdGJsX2hlYWRlciAqaGRyID0gTlVMTDsKKwl1aW50OF90IG1hZ2ljX251bWJlcjsKKwl1OCAqZW50cnk7CisJaW50IGk7CiAKIAlpZiAoYmlvcy0+dHlwZSA9PSBOVkJJT1NfQklUKSB7CiAJCWlmIChiaXRfdGFibGUoZGV2LCAnUCcsICZQKSkKIAkJCXJldHVybjsKIAogCQlpZiAoUC52ZXJzaW9uID09IDEpCi0JCQltZW0gPSBST01QVFIoYmlvcywgUC5kYXRhWzRdKTsKKwkJCWhkciA9IChzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfaGVhZGVyICopIFJPTVBUUihiaW9zLCBQLmRhdGFbNF0pOwogCQllbHNlCiAJCWlmIChQLnZlcnNpb24gPT0gMikKLQkJCW1lbSA9IFJPTVBUUihiaW9zLCBQLmRhdGFbOF0pOworCQkJaGRyID0gKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgKikgUk9NUFRSKGJpb3MsIFAuZGF0YVs4XSk7CiAJCWVsc2UgewogCQkJTlZfV0FSTihkZXYsICJ1bmtub3duIG1lbSBmb3IgQklUIFAgJWRcbiIsIFAudmVyc2lvbik7CiAJCX0KQEAgLTU0MSwxNTAgKzY1MCw1NiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFtZW0pIHsKKwlpZiAoIWhkcikgewogCQlOVl9ERUJVRyhkZXYsICJtZW1vcnkgdGltaW5nIHRhYmxlIHBvaW50ZXIgaW52YWxpZFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobWVtWzBdICE9IDB4MTApIHsKLQkJTlZfV0FSTihkZXYsICJtZW1vcnkgdGltaW5nIHRhYmxlIDB4JTAyeCB1bmtub3duXG4iLCBtZW1bMF0pOworCWlmIChoZHItPnZlcnNpb24gIT0gMHgxMCkgeworCQlOVl9XQVJOKGRldiwgIm1lbW9yeSB0aW1pbmcgdGFibGUgMHglMDJ4IHVua25vd25cbiIsIGhkci0+dmVyc2lvbik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiB2YWxpZGF0ZSByZWNvcmQgbGVuZ3RoICovCi0JZW50cmllcyAgID0gbWVtWzJdOwotCXJlY29yZGxlbiA9IG1lbVszXTsKLQlpZiAocmVjb3JkbGVuIDwgMTUpIHsKLQkJTlZfRVJST1IoZGV2LCAibWVtIHRpbWluZyB0YWJsZSBsZW5ndGggdW5rbm93bjogJWRcbiIsIG1lbVszXSk7CisJaWYgKGhkci0+ZW50cnlfbGVuIDwgMTUpIHsKKwkJTlZfRVJST1IoZGV2LCAibWVtIHRpbWluZyB0YWJsZSBsZW5ndGggdW5rbm93bjogJWRcbiIsIGhkci0+ZW50cnlfbGVuKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHBhcnNlIHZiaW9zIGVudHJpZXMgaW50byBjb21tb24gZm9ybWF0ICovCiAJbWVtdGltaW5ncy0+dGltaW5nID0KLQkJa2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKm1lbXRpbWluZ3MtPnRpbWluZyksIEdGUF9LRVJORUwpOworCQlrY2FsbG9jKGhkci0+ZW50cnlfY250LCBzaXplb2YoKm1lbXRpbWluZ3MtPnRpbWluZyksIEdGUF9LRVJORUwpOwogCWlmICghbWVtdGltaW5ncy0+dGltaW5nKQogCQlyZXR1cm47CiAKIAkvKiBHZXQgInNvbWUgbnVtYmVyIiBmcm9tIHRoZSB0aW1pbmcgcmVnIGZvciBOVl80MCBhbmQgTlZfNTAKLQkgKiBVc2VkIGluIGNhbGN1bGF0aW9ucyBsYXRlciAqLwotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzQwICYmIGRldl9wcml2LT5jaGlwc2V0IDwgMHg5OCkgeworCSAqIFVzZWQgaW4gY2FsY3VsYXRpb25zIGxhdGVyLi4uIHNvdXJjZSB1bmtub3duICovCisJbWFnaWNfbnVtYmVyID0gMDsKKwlpZiAoUC52ZXJzaW9uID09IDEpIHsKIAkJbWFnaWNfbnVtYmVyID0gKG52X3JkMzIoZGV2LCAweDEwMDIyOCkgJiAweDBmMDAwMDAwKSA+PiAyNDsKIAl9CiAKLQllbnRyeSA9IG1lbSArIG1lbVsxXTsKLQlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrLCBlbnRyeSArPSByZWNvcmRsZW4pIHsKKwllbnRyeSA9ICh1OCopIGhkciArIGhkci0+aGVhZGVyX2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgaGRyLT5lbnRyeV9jbnQ7IGkrKywgZW50cnkgKz0gaGRyLT5lbnRyeV9sZW4pIHsKIAkJc3RydWN0IG5vdXZlYXVfcG1fbWVtdGltaW5nICp0aW1pbmcgPSAmcG0tPm1lbXRpbWluZ3MudGltaW5nW2ldOwogCQlpZiAoZW50cnlbMF0gPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXRVTktfMTggPSAxOwotCQl0VU5LXzE5ID0gMTsKLQkJdFVOS18yMCA9IDA7Ci0JCXRVTktfMjEgPSAwOwotCQlzd2l0Y2ggKG1pbihyZWNvcmRsZW4sIDIyKSkgewotCQljYXNlIDIyOgotCQkJdFVOS18yMSA9IGVudHJ5WzIxXTsKLQkJY2FzZSAyMToKLQkJCXRVTktfMjAgPSBlbnRyeVsyMF07Ci0JCWNhc2UgMjA6Ci0JCQl0VU5LXzE5ID0gZW50cnlbMTldOwotCQljYXNlIDE5OgotCQkJdFVOS18xOCA9IGVudHJ5WzE4XTsKLQkJZGVmYXVsdDoKLQkJCXRVTktfMCAgPSBlbnRyeVswXTsKLQkJCXRVTktfMSAgPSBlbnRyeVsxXTsKLQkJCXRVTktfMiAgPSBlbnRyeVsyXTsKLQkJCXRSUCAgICAgPSBlbnRyeVszXTsKLQkJCXRSQVMgICAgPSBlbnRyeVs1XTsKLQkJCXRSRkMgICAgPSBlbnRyeVs3XTsKLQkJCXRSQyAgICAgPSBlbnRyeVs5XTsKLQkJCXRVTktfMTAgPSBlbnRyeVsxMF07Ci0JCQl0VU5LXzExID0gZW50cnlbMTFdOwotCQkJdFVOS18xMiA9IGVudHJ5WzEyXTsKLQkJCXRVTktfMTMgPSBlbnRyeVsxM107Ci0JCQl0VU5LXzE0ID0gZW50cnlbMTRdOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl0aW1pbmctPnJlZ18xMDAyMjAgPSAodFJDIDw8IDI0IHwgdFJGQyA8PCAxNiB8IHRSQVMgPDwgOCB8IHRSUCk7Ci0KLQkJLyogWFhYOiBJIGRvbid0IHRydXN0IHRoZSAtMSdzIGFuZCArMSdzLi4uIHRoZXkgbXVzdCBjb21lCi0JCSAqICAgICAgZnJvbSBzb21ld2hlcmUhICovCi0JCXRpbWluZy0+cmVnXzEwMDIyNCA9ICh0VU5LXzAgKyB0VU5LXzE5ICsgMSArIG1hZ2ljX251bWJlcikgPDwgMjQgfAotCQkJCSAgICAgIG1heCh0VU5LXzE4LCAodTgpIDEpIDw8IDE2IHwKLQkJCQkgICAgICAodFVOS18xICsgdFVOS18xOSArIDEgKyBtYWdpY19udW1iZXIpIDw8IDg7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweGE4KSB7Ci0JCQl0aW1pbmctPnJlZ18xMDAyMjQgfD0gKHRVTktfMiAtIDEpOwotCQl9IGVsc2UgewotCQkJdGltaW5nLT5yZWdfMTAwMjI0IHw9ICh0VU5LXzIgKyAyIC0gbWFnaWNfbnVtYmVyKTsKLQkJfQotCi0JCXRpbWluZy0+cmVnXzEwMDIyOCA9ICh0VU5LXzEyIDw8IDE2IHwgdFVOS18xMSA8PCA4IHwgdFVOS18xMCk7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweGEzICYmIGRldl9wcml2LT5jaGlwc2V0IDwgMHhhYSkKLQkJCXRpbWluZy0+cmVnXzEwMDIyOCB8PSAodFVOS18xOSAtIDEpIDw8IDI0OwotCQllbHNlCi0JCQl0aW1pbmctPnJlZ18xMDAyMjggfD0gbWFnaWNfbnVtYmVyIDw8IDI0OwotCi0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKSB7Ci0JCQkvKiBOVjQwOiBkb24ndCBrbm93IHdoYXQgdGhlIHJlc3Qgb2YgdGhlIHJlZ3MgYXJlLi4KLQkJCSAqIEFuZCBkb24ndCBuZWVkIHRvIGtub3cgZWl0aGVyICovCi0JCQl0aW1pbmctPnJlZ18xMDAyMjggfD0gMHgyMDIwMDAwMDsKLQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7Ci0JCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4IHx8Ci0JCQkgICAgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4OTggJiYKLQkJCSAgICAgZGV2X3ByaXYtPnN0ZXBwaW5nIDw9IDB4YTEpKSB7Ci0JCQkJdGltaW5nLT5yZWdfMTAwMjJjID0gKDB4MTQgKyB0VU5LXzIpIDw8IDI0IHwKLQkJCQkJCSAgICAgMHgxNiA8PCAxNiB8Ci0JCQkJCQkgICAgICh0VU5LXzIgLSAxKSA8PCA4IHwKLQkJCQkJCSAgICAgKHRVTktfMiAtIDEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBYWFg6IHJlZ18xMDAyMmMgZm9yIHJlY2VudGlzaCBjYXJkcyAqLwotCQkJCXRpbWluZy0+cmVnXzEwMDIyYyA9IHRVTktfMiAtIDE7Ci0JCQl9Ci0KLQkJCXRpbWluZy0+cmVnXzEwMDIzMCA9ICh0VU5LXzIwIDw8IDI0IHwgdFVOS18yMSA8PCAxNiB8Ci0JCQkJCQkgIHRVTktfMTMgPDwgOCAgfCB0VU5LXzEzKTsKLQotCQkJdGltaW5nLT5yZWdfMTAwMjM0ID0gKHRSQVMgPDwgMjQgfCB0UkMpOwotCQkJdGltaW5nLT5yZWdfMTAwMjM0ICs9IG1heCh0VU5LXzEwLCB0VU5LXzExKSA8PCAxNjsKLQotCQkJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg5OCB8fAotCQkJICAgIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDk4ICYmCi0JCQkgICAgIGRldl9wcml2LT5zdGVwcGluZyA8PSAweGExKSkgewotCQkJCXRpbWluZy0+cmVnXzEwMDIzNCB8PSAodFVOS18yICsgMikgPDwgODsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogWFhYOiArNj8gKi8KLQkJCQl0aW1pbmctPnJlZ18xMDAyMzQgfD0gKHRVTktfMTkgKyA2KSA8PCA4OwotCQkJfQotCi0JCQkvKiBYWFg7IHJlZ18xMDAyMzgKLQkJCSAqIHJlZ18xMDAyMzg6IDB4MDA/Pz8/Pz8gKi8KLQkJCXRpbWluZy0+cmVnXzEwMDIzYyA9IDB4MjAyOwotCQkJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg5OCB8fAotCQkJICAgIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDk4ICYmCi0JCQkgICAgIGRldl9wcml2LT5zdGVwcGluZyA8PSAweGExKSkgewotCQkJCXRpbWluZy0+cmVnXzEwMDIzYyB8PSAweDQwMDAwMDAgfCAodFVOS18yIC0gMSkgPDwgMTY7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFhYWDogcmVnXzEwMDIzYwotCQkJCSAqIGN1cnJlbnRseSB1bmtub3duCi0JCQkJICogMTAwMjNjIHNlZW4gYXMgMDZ4eHh4eHgsIDBieHh4eHh4IG9yIDBmeHh4eHh4ICovCi0JCQl9Ci0KLQkJCS8qIFhYWDogcmVnXzEwMDI0MD8gKi8KLQkJfQogCQl0aW1pbmctPmlkID0gaTsKKwkJdGltaW5nLT5XUiA9IGVudHJ5WzBdOworCQl0aW1pbmctPkNMID0gZW50cnlbMl07CiAKLQkJTlZfREVCVUcoZGV2LCAiRW50cnkgJWQ6IDIyMDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgaSwKLQkJCSB0aW1pbmctPnJlZ18xMDAyMjAsIHRpbWluZy0+cmVnXzEwMDIyNCwKLQkJCSB0aW1pbmctPnJlZ18xMDAyMjgsIHRpbWluZy0+cmVnXzEwMDIyYyk7Ci0JCU5WX0RFQlVHKGRldiwgIiAgICAgICAgIDIzMDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJCSB0aW1pbmctPnJlZ18xMDAyMzAsIHRpbWluZy0+cmVnXzEwMDIzNCwKLQkJCSB0aW1pbmctPnJlZ18xMDAyMzgsIHRpbWluZy0+cmVnXzEwMDIzYyk7Ci0JCU5WX0RFQlVHKGRldiwgIiAgICAgICAgIDI0MDogJTA4eFxuIiwgdGltaW5nLT5yZWdfMTAwMjQwKTsKKwkJaWYoZGV2X3ByaXYtPmNhcmRfdHlwZSA8PSBOVl80MCkgeworCQkJbnY0MF9tZW1fdGltaW5nX2VudHJ5KGRldixoZHIsKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSopIGVudHJ5LG1hZ2ljX251bWJlciwmcG0tPm1lbXRpbWluZ3MudGltaW5nW2ldKTsKKwkJfSBlbHNlIGlmKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApeworCQkJbnY1MF9tZW1fdGltaW5nX2VudHJ5KGRldiwmUCxoZHIsKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSopIGVudHJ5LG1hZ2ljX251bWJlciwmcG0tPm1lbXRpbWluZ3MudGltaW5nW2ldKTsKKwkJfSBlbHNlIGlmKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfQzApIHsKKwkJCW52YzBfbWVtX3RpbWluZ19lbnRyeShkZXYsaGRyLChzdHJ1Y3Qgbm91dmVhdV9wbV90YmxfZW50cnkqKSBlbnRyeSwmcG0tPm1lbXRpbWluZ3MudGltaW5nW2ldKTsKKwkJfQogCX0KIAotCW1lbXRpbWluZ3MtPm5yX3RpbWluZyA9IGVudHJpZXM7Ci0JbWVtdGltaW5ncy0+c3VwcG9ydGVkID0gKGRldl9wcml2LT5jaGlwc2V0IDw9IDB4OTgpOworCW1lbXRpbWluZ3MtPm5yX3RpbWluZyA9IGhkci0+ZW50cnlfY250OworCW1lbXRpbWluZ3MtPnN1cHBvcnRlZCA9IFAudmVyc2lvbiA9PSAxOwogfQogCiB2b2lkCkBAIC02OTMsNyArNzA4LDEwIEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmdzICptZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5wbS5tZW10aW1pbmdzOwogCi0Ja2ZyZWUobWVtLT50aW1pbmcpOworCWlmKG1lbS0+dGltaW5nKSB7CisJCWtmcmVlKG1lbS0+dGltaW5nKTsKKwkJbWVtLT50aW1pbmcgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jCmluZGV4IDE2NDBkZWMuLmIyOWZmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJub3V2ZWF1X21tLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcmVnaW9uX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICphKQorcmVnaW9uX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmEpCiB7CiAJbGlzdF9kZWwoJmEtPm5sX2VudHJ5KTsKIAlsaXN0X2RlbCgmYS0+ZmxfZW50cnkpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqCi1yZWdpb25fc3BsaXQoc3RydWN0IG5vdXZlYXVfbW0gKnJtbSwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYSwgdTMyIHNpemUpCityZWdpb25fc3BsaXQoc3RydWN0IG5vdXZlYXVfbW0gKm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICphLCB1MzIgc2l6ZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpiOwogCkBAIC01NywzMyArNTcsMzMgQEAKIAlyZXR1cm4gYjsKIH0KIAotI2RlZmluZSBub2RlKHJvb3QsIGRpcikgKChyb290KS0+bmxfZW50cnkuZGlyID09ICZybW0tPm5vZGVzKSA/IE5VTEwgOiBcCisjZGVmaW5lIG5vZGUocm9vdCwgZGlyKSAoKHJvb3QpLT5ubF9lbnRyeS5kaXIgPT0gJm1tLT5ub2RlcykgPyBOVUxMIDogXAogCWxpc3RfZW50cnkoKHJvb3QpLT5ubF9lbnRyeS5kaXIsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KQogCiB2b2lkCi1ub3V2ZWF1X21tX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzKQorbm91dmVhdV9tbV9wdXQoc3RydWN0IG5vdXZlYXVfbW0gKm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzKQogewogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnByZXYgPSBub2RlKHRoaXMsIHByZXYpOwogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKm5leHQgPSBub2RlKHRoaXMsIG5leHQpOwogCi0JbGlzdF9hZGQoJnRoaXMtPmZsX2VudHJ5LCAmcm1tLT5mcmVlKTsKKwlsaXN0X2FkZCgmdGhpcy0+ZmxfZW50cnksICZtbS0+ZnJlZSk7CiAJdGhpcy0+dHlwZSA9IDA7CiAKIAlpZiAocHJldiAmJiBwcmV2LT50eXBlID09IDApIHsKIAkJcHJldi0+bGVuZ3RoICs9IHRoaXMtPmxlbmd0aDsKLQkJcmVnaW9uX3B1dChybW0sIHRoaXMpOworCQlyZWdpb25fcHV0KG1tLCB0aGlzKTsKIAkJdGhpcyA9IHByZXY7CiAJfQogCiAJaWYgKG5leHQgJiYgbmV4dC0+dHlwZSA9PSAwKSB7CiAJCW5leHQtPm9mZnNldCAgPSB0aGlzLT5vZmZzZXQ7CiAJCW5leHQtPmxlbmd0aCArPSB0aGlzLT5sZW5ndGg7Ci0JCXJlZ2lvbl9wdXQocm1tLCB0aGlzKTsKKwkJcmVnaW9uX3B1dChtbSwgdGhpcyk7CiAJfQogfQogCiBpbnQKLW5vdXZlYXVfbW1fZ2V0KHN0cnVjdCBub3V2ZWF1X21tICpybW0sIGludCB0eXBlLCB1MzIgc2l6ZSwgdTMyIHNpemVfbmMsCitub3V2ZWF1X21tX2dldChzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0sIGludCB0eXBlLCB1MzIgc2l6ZSwgdTMyIHNpemVfbmMsCiAJICAgICAgIHUzMiBhbGlnbiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqKnBub2RlKQogewogCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnByZXYsICp0aGlzLCAqbmV4dDsKQEAgLTkyLDE3ICs5MiwxNyBAQAogCXUzMiBzcGxpdG9mZjsKIAl1MzIgcywgZTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJnJtbS0+ZnJlZSwgZmxfZW50cnkpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZtbS0+ZnJlZSwgZmxfZW50cnkpIHsKIAkJZSA9IHRoaXMtPm9mZnNldCArIHRoaXMtPmxlbmd0aDsKIAkJcyA9IHRoaXMtPm9mZnNldDsKIAogCQlwcmV2ID0gbm9kZSh0aGlzLCBwcmV2KTsKIAkJaWYgKHByZXYgJiYgcHJldi0+dHlwZSAhPSB0eXBlKQotCQkJcyA9IHJvdW5kdXAocywgcm1tLT5ibG9ja19zaXplKTsKKwkJCXMgPSByb3VuZHVwKHMsIG1tLT5ibG9ja19zaXplKTsKIAogCQluZXh0ID0gbm9kZSh0aGlzLCBuZXh0KTsKIAkJaWYgKG5leHQgJiYgbmV4dC0+dHlwZSAhPSB0eXBlKQotCQkJZSA9IHJvdW5kZG93bihlLCBybW0tPmJsb2NrX3NpemUpOworCQkJZSA9IHJvdW5kZG93bihlLCBtbS0+YmxvY2tfc2l6ZSk7CiAKIAkJcyAgPSAocyArIGFsaWduX21hc2spICYgfmFsaWduX21hc2s7CiAJCWUgJj0gfmFsaWduX21hc2s7CkBAIC0xMTAsMTAgKzExMCwxMCBAQAogCQkJY29udGludWU7CiAKIAkJc3BsaXRvZmYgPSBzIC0gdGhpcy0+b2Zmc2V0OwotCQlpZiAoc3BsaXRvZmYgJiYgIXJlZ2lvbl9zcGxpdChybW0sIHRoaXMsIHNwbGl0b2ZmKSkKKwkJaWYgKHNwbGl0b2ZmICYmICFyZWdpb25fc3BsaXQobW0sIHRoaXMsIHNwbGl0b2ZmKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCXRoaXMgPSByZWdpb25fc3BsaXQocm1tLCB0aGlzLCBtaW4oc2l6ZSwgZSAtIHMpKTsKKwkJdGhpcyA9IHJlZ2lvbl9zcGxpdChtbSwgdGhpcywgbWluKHNpemUsIGUgLSBzKSk7CiAJCWlmICghdGhpcykKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjcsNTIgKzEyNyw0OSBAQAogfQogCiBpbnQKLW5vdXZlYXVfbW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9tbSAqKnBybW0sIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgsIHUzMiBibG9jaykKK25vdXZlYXVfbW1faW5pdChzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0sIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgsIHUzMiBibG9jaykKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tOwotCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmhlYXA7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqbm9kZTsKIAotCWhlYXAgPSBremFsbG9jKHNpemVvZigqaGVhcCksIEdGUF9LRVJORUwpOwotCWlmICghaGVhcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaGVhcC0+b2Zmc2V0ID0gcm91bmR1cChvZmZzZXQsIGJsb2NrKTsKLQloZWFwLT5sZW5ndGggPSByb3VuZGRvd24ob2Zmc2V0ICsgbGVuZ3RoLCBibG9jaykgLSBoZWFwLT5vZmZzZXQ7Ci0KLQlybW0gPSBremFsbG9jKHNpemVvZigqcm1tKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFybW0pIHsKLQkJa2ZyZWUoaGVhcCk7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChibG9jaykgeworCQltdXRleF9pbml0KCZtbS0+bXV0ZXgpOworCQlJTklUX0xJU1RfSEVBRCgmbW0tPm5vZGVzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm1tLT5mcmVlKTsKKwkJbW0tPmJsb2NrX3NpemUgPSBibG9jazsKKwkJbW0tPmhlYXBfbm9kZXMgPSAwOwogCX0KLQlybW0tPmJsb2NrX3NpemUgPSBibG9jazsKLQltdXRleF9pbml0KCZybW0tPm11dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmcm1tLT5ub2Rlcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJtbS0+ZnJlZSk7Ci0JbGlzdF9hZGQoJmhlYXAtPm5sX2VudHJ5LCAmcm1tLT5ub2Rlcyk7Ci0JbGlzdF9hZGQoJmhlYXAtPmZsX2VudHJ5LCAmcm1tLT5mcmVlKTsKIAotCSpwcm1tID0gcm1tOworCW5vZGUgPSBremFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbm9kZS0+b2Zmc2V0ID0gcm91bmR1cChvZmZzZXQsIG1tLT5ibG9ja19zaXplKTsKKwlub2RlLT5sZW5ndGggPSByb3VuZGRvd24ob2Zmc2V0ICsgbGVuZ3RoLCBtbS0+YmxvY2tfc2l6ZSkgLSBub2RlLT5vZmZzZXQ7CisKKwlsaXN0X2FkZF90YWlsKCZub2RlLT5ubF9lbnRyeSwgJm1tLT5ub2Rlcyk7CisJbGlzdF9hZGRfdGFpbCgmbm9kZS0+ZmxfZW50cnksICZtbS0+ZnJlZSk7CisJbW0tPmhlYXBfbm9kZXMrKzsKIAlyZXR1cm4gMDsKIH0KIAogaW50Ci1ub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKipwcm1tKQorbm91dmVhdV9tbV9maW5pKHN0cnVjdCBub3V2ZWF1X21tICptbSkKIHsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tID0gKnBybW07CiAJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqbm9kZSwgKmhlYXAgPQotCQlsaXN0X2ZpcnN0X2VudHJ5KCZybW0tPm5vZGVzLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlLCBubF9lbnRyeSk7CisJCWxpc3RfZmlyc3RfZW50cnkoJm1tLT5ub2Rlcywgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpOworCWludCBub2RlcyA9IDA7CiAKLQlpZiAoIWxpc3RfaXNfc2luZ3VsYXIoJnJtbS0+bm9kZXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm91dmVhdV9tbSBub3QgZW1wdHkgYXQgZGVzdHJveSB0aW1lIVxuIik7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJnJtbS0+bm9kZXMsIG5sX2VudHJ5KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIjB4JTAyeDogMHglMDh4IDB4JTA4eFxuIiwKLQkJCSAgICAgICBub2RlLT50eXBlLCBub2RlLT5vZmZzZXQsIG5vZGUtPmxlbmd0aCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmbW0tPm5vZGVzLCBubF9lbnRyeSkgeworCQlpZiAobm9kZXMrKyA9PSBtbS0+aGVhcF9ub2RlcykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJub3V2ZWF1X21tIGluIHVzZSBhdCBkZXN0cm95IHRpbWUhXG4iKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJm1tLT5ub2RlcywgbmxfZW50cnkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIjB4JTAyeDogMHglMDh4IDB4JTA4eFxuIiwKKwkJCQkgICAgICAgbm9kZS0+dHlwZSwgbm9kZS0+b2Zmc2V0LCBub2RlLT5sZW5ndGgpOworCQkJfQorCQkJV0FSTl9PTigxKTsKKwkJCXJldHVybiAtRUJVU1k7CiAJCX0KLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlrZnJlZShoZWFwKTsKLQlrZnJlZShybW0pOwotCSpwcm1tID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaAppbmRleCBiOWMwMTZkLi41N2E2MDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5oCkBAIC00MiwxMCArNDIsMTEgQEAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAKIAl1MzIgYmxvY2tfc2l6ZTsKKwlpbnQgaGVhcF9ub2RlczsKIH07CiAKLWludCAgbm91dmVhdV9tbV9pbml0KHN0cnVjdCBub3V2ZWF1X21tICoqLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spOwotaW50ICBub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKiopOworaW50ICBub3V2ZWF1X21tX2luaXQoc3RydWN0IG5vdXZlYXVfbW0gKiwgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCwgdTMyIGJsb2NrKTsKK2ludCAgbm91dmVhdV9tbV9maW5pKHN0cnVjdCBub3V2ZWF1X21tICopOwogaW50ICBub3V2ZWF1X21tX3ByZShzdHJ1Y3Qgbm91dmVhdV9tbSAqKTsKIGludCAgbm91dmVhdV9tbV9nZXQoc3RydWN0IG5vdXZlYXVfbW0gKiwgaW50IHR5cGUsIHUzMiBzaXplLCB1MzIgc2l6ZV9uYywKIAkJICAgIHUzMiBhbGlnbiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwppbmRleCAxNTliN2M0Li4wMjIyMmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKQEAgLTY5Myw2ICs2OTMsNyBAQAogc3RhdGljIGludAogbnZjMF9ncHVvYmpfY2hhbm5lbF9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBub3V2ZWF1X3ZtICp2bSkKIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QgPSBOVUxMOwogCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKQEAgLTcyMiw2ICs3MjMsOSBAQAogCW52X3dvMzIoY2hhbi0+cmFtaW4sIDB4MDIwYywgMHgwMDAwMDBmZik7CiAKIAkvKiBtYXAgZGlzcGxheSBzZW1hcGhvcmUgYnVmZmVycyBpbnRvIGNoYW5uZWwncyB2bSAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0QwKQorCQlyZXR1cm4gMDsKKwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJc3RydWN0IG52NTBfZGlzcGxheV9jcnRjICpkaXNwYyA9ICZudjUwX2Rpc3BsYXkoZGV2KS0+Y3J0Y1tpXTsKIApAQCAtNzQ2LDcgKzc1MCw3IEBACiAJaW50IHJldCwgaTsKIAogCU5WX0RFQlVHKGRldiwgImNoJWQgdnJhbT0weCUwOHggdHQ9MHglMDh4XG4iLCBjaGFuLT5pZCwgdnJhbV9oLCB0dF9oKTsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkKIAkJcmV0dXJuIG52YzBfZ3B1b2JqX2NoYW5uZWxfaW5pdChjaGFuLCB2bSk7CiAKIAkvKiBBbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeSBmb3IgcGVyLWNoYW5uZWwgb2JqZWN0IHN0b3JhZ2UgKi8KQEAgLTc5Myw3ICs3OTcsNyBAQAogCQkJcmV0dXJuIHJldDsKIAogCQkvKiBkbWEgb2JqZWN0cyBmb3IgZGlzcGxheSBzeW5jIGNoYW5uZWwgc2VtYXBob3JlIGJsb2NrcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjOyBpKyspIHsKIAkJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqc2VtID0gTlVMTDsKIAkJCXN0cnVjdCBudjUwX2Rpc3BsYXlfY3J0YyAqZGlzcGMgPQogCQkJCSZudjUwX2Rpc3BsYXkoZGV2KS0+Y3J0Y1tpXTsKQEAgLTg3NSwxOCArODc5LDE4IEBACiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwICYmIGRldl9wcml2LT5jYXJkX3R5cGUgPD0gTlZfQzApIHsKIAkJc3RydWN0IG52NTBfZGlzcGxheSAqZGlzcCA9IG52NTBfZGlzcGxheShkZXYpOwogCi0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bW9kZV9jb25maWcubnVtX2NydGM7IGkrKykgewogCQkJc3RydWN0IG52NTBfZGlzcGxheV9jcnRjICpkaXNwYyA9ICZkaXNwLT5jcnRjW2ldOwogCQkJbm91dmVhdV9ib192bWFfZGVsKGRpc3BjLT5zZW0uYm8sICZjaGFuLT5kaXNwY192bWFbaV0pOwogCQl9Ci0KLQkJbm91dmVhdV92bV9yZWYoTlVMTCwgJmNoYW4tPnZtLCBjaGFuLT52bV9wZCk7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+dm1fcGQpOwogCX0KIAorCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZjaGFuLT52bSwgY2hhbi0+dm1fcGQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+dm1fcGQpOworCiAJaWYgKGRybV9tbV9pbml0aWFsaXplZCgmY2hhbi0+cmFtaW5faGVhcCkpCiAJCWRybV9tbV90YWtlZG93bigmY2hhbi0+cmFtaW5faGVhcCk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1pbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BlcmYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCmluZGV4IGVmOWRlYzAuLjMzZDAzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcGVyZi5jCkBAIC0xMjcsMTMgKzEyNyw1NyBAQAogCiAJZW50cnkgKz0gcmFtY2ZnICogcmVjb3JkbGVuOwogCWlmIChlbnRyeVsxXSA+PSBwbS0+bWVtdGltaW5ncy5ucl90aW1pbmcpIHsKLQkJTlZfV0FSTihkZXYsICJ0aW1pbmdzZXQgJWQgZG9lcyBub3QgZXhpc3RcbiIsIGVudHJ5WzFdKTsKKwkJaWYgKGVudHJ5WzFdICE9IDB4ZmYpCisJCQlOVl9XQVJOKGRldiwgInRpbWluZ3NldCAlZCBkb2VzIG5vdCBleGlzdFxuIiwgZW50cnlbMV0pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlyZXR1cm4gJnBtLT5tZW10aW1pbmdzLnRpbWluZ1tlbnRyeVsxXV07CiB9CiAKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3BlcmZfdm9sdGFnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgYml0X2VudHJ5ICpQLAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YmlvcyAqYmlvcyA9ICZkZXZfcHJpdi0+dmJpb3M7CisJdTggKnZtYXA7CisJaW50IGlkOworCisJaWQgPSBwZXJmbHZsLT52b2x0X21pbjsKKwlwZXJmbHZsLT52b2x0X21pbiA9IDA7CisKKwkvKiBib2FyZHMgdXNpbmcgdm9sdGFnZSB0YWJsZSB2ZXJzaW9uIDwweDQwIHN0b3JlIHRoZSB2b2x0YWdlCisJICogbGV2ZWwgZGlyZWN0bHkgaW4gdGhlIHBlcmZsdmwgZW50cnkgYXMgYSBtdWx0aXBsZSBvZiAxMG1WCisJICovCisJaWYgKGRldl9wcml2LT5lbmdpbmUucG0udm9sdGFnZS52ZXJzaW9uIDwgMHg0MCkgeworCQlwZXJmbHZsLT52b2x0X21pbiA9IGlkICogMTAwMDA7CisJCXBlcmZsdmwtPnZvbHRfbWF4ID0gcGVyZmx2bC0+dm9sdF9taW47CisJCXJldHVybjsKKwl9CisKKwkvKiBvbiBuZXdlciBvbmVzLCB0aGUgcGVyZmx2bCBzdG9yZXMgYW4gaW5kZXggaW50byB5ZXQgYW5vdGhlcgorCSAqIHZiaW9zIHRhYmxlIGNvbnRhaW5pbmcgYSBtaW4vbWF4IHZvbHRhZ2UgdmFsdWUgZm9yIHRoZSBwZXJmbHZsCisJICovCisJaWYgKFAtPnZlcnNpb24gIT0gMiB8fCBQLT5sZW5ndGggPCAzNCkgeworCQlOVl9ERUJVRyhkZXYsICJ3aGVyZSdzIG91ciB2b2x0IG1hcCB0YWJsZSBwdHI/ICVkICVkXG4iLAorCQkJIFAtPnZlcnNpb24sIFAtPmxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwl2bWFwID0gUk9NUFRSKGJpb3MsIFAtPmRhdGFbMzJdKTsKKwlpZiAoIXZtYXApIHsKKwkJTlZfREVCVUcoZGV2LCAidm9sdCBtYXAgdGFibGUgcG9pbnRlciBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpZCA8IHZtYXBbM10pIHsKKwkJdm1hcCArPSB2bWFwWzFdICsgKHZtYXBbMl0gKiBpZCk7CisJCXBlcmZsdmwtPnZvbHRfbWluID0gUk9NMzIodm1hcFswXSk7CisJCXBlcmZsdmwtPnZvbHRfbWF4ID0gUk9NMzIodm1hcFs0XSk7CisJfQorfQorCiB2b2lkCiBub3V2ZWF1X3BlcmZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMTQxLDYgKzE4NSw4IEBACiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICpwbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnBtOwogCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOwogCXN0cnVjdCBiaXRfZW50cnkgUDsKKwlzdHJ1Y3Qgbm91dmVhdV9wbV9tZW10aW1pbmdzICptZW10aW1pbmdzID0gJnBtLT5tZW10aW1pbmdzOworCXN0cnVjdCBub3V2ZWF1X3BtX3RibF9oZWFkZXIgbXRfaGRyOwogCXU4IHZlcnNpb24sIGhlYWRlcmxlbiwgcmVjb3JkbGVuLCBlbnRyaWVzOwogCXU4ICpwZXJmLCAqZW50cnk7CiAJaW50IHZpZCwgaTsKQEAgLTE4OCw2ICsyMzQsMjIgQEAKIAl9CiAKIAllbnRyeSA9IHBlcmYgKyBoZWFkZXJsZW47CisKKwkvKiBGb3IgdmVyc2lvbiAweDE1LCBpbml0aWFsaXplIG1lbXRpbWluZyB0YWJsZSAqLworCWlmKHZlcnNpb24gPT0gMHgxNSkgeworCQltZW10aW1pbmdzLT50aW1pbmcgPQorCQkJCWtjYWxsb2MoZW50cmllcywgc2l6ZW9mKCptZW10aW1pbmdzLT50aW1pbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtZW10aW1pbmdzLT50aW1pbmcpIHsKKwkJCU5WX1dBUk4oZGV2LCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtdGltaW5nIHRhYmxlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW10X2hkci5lbnRyeV9jbnQgPSBlbnRyaWVzOworCQltdF9oZHIuZW50cnlfbGVuID0gMTQ7CisJCW10X2hkci52ZXJzaW9uID0gdmVyc2lvbjsKKwkJbXRfaGRyLmhlYWRlcl9sZW4gPSA0OworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKIAkJc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwgPSAmcG0tPnBlcmZsdmxbcG0tPm5yX3BlcmZsdmxdOwogCkBAIC0yMDMsNyArMjY1LDggQEAKIAkJY2FzZSAweDEzOgogCQljYXNlIDB4MTU6CiAJCQlwZXJmbHZsLT5mYW5zcGVlZCA9IGVudHJ5WzU1XTsKLQkJCXBlcmZsdmwtPnZvbHRhZ2UgPSAocmVjb3JkbGVuID4gNTYpID8gZW50cnlbNTZdIDogMDsKKwkJCWlmIChyZWNvcmRsZW4gPiA1NikKKwkJCQlwZXJmbHZsLT52b2x0X21pbiA9IGVudHJ5WzU2XTsKIAkJCXBlcmZsdmwtPmNvcmUgPSBST00zMihlbnRyeVsxXSkgKiAxMDsKIAkJCXBlcmZsdmwtPm1lbW9yeSA9IFJPTTMyKGVudHJ5WzVdKSAqIDIwOwogCQkJYnJlYWs7CkBAIC0yMTEsOSArMjc0LDEwIEBACiAJCWNhc2UgMHgyMzoKIAkJY2FzZSAweDI0OgogCQkJcGVyZmx2bC0+ZmFuc3BlZWQgPSBlbnRyeVs0XTsKLQkJCXBlcmZsdmwtPnZvbHRhZ2UgPSBlbnRyeVs1XTsKLQkJCXBlcmZsdmwtPmNvcmUgPSBST00xNihlbnRyeVs2XSkgKiAxMDAwOwotCisJCQlwZXJmbHZsLT52b2x0X21pbiA9IGVudHJ5WzVdOworCQkJcGVyZmx2bC0+c2hhZGVyID0gUk9NMTYoZW50cnlbNl0pICogMTAwMDsKKwkJCXBlcmZsdmwtPmNvcmUgPSBwZXJmbHZsLT5zaGFkZXI7CisJCQlwZXJmbHZsLT5jb3JlICs9IChzaWduZWQgY2hhcillbnRyeVs4XSAqIDEwMDA7CiAJCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0OSB8fAogCQkJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4NGIpCiAJCQkJcGVyZmx2bC0+bWVtb3J5ID0gUk9NMTYoZW50cnlbMTFdKSAqIDEwMDA7CkBAIC0yMjMsNyArMjg3LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIDB4MjU6CiAJCQlwZXJmbHZsLT5mYW5zcGVlZCA9IGVudHJ5WzRdOwotCQkJcGVyZmx2bC0+dm9sdGFnZSA9IGVudHJ5WzVdOworCQkJcGVyZmx2bC0+dm9sdF9taW4gPSBlbnRyeVs1XTsKIAkJCXBlcmZsdmwtPmNvcmUgPSBST00xNihlbnRyeVs2XSkgKiAxMDAwOwogCQkJcGVyZmx2bC0+c2hhZGVyID0gUk9NMTYoZW50cnlbMTBdKSAqIDEwMDA7CiAJCQlwZXJmbHZsLT5tZW1vcnkgPSBST00xNihlbnRyeVsxMl0pICogMTAwMDsKQEAgLTIzMiw3ICsyOTYsNyBAQAogCQkJcGVyZmx2bC0+bWVtc2NyaXB0ID0gUk9NMTYoZW50cnlbMl0pOwogCQljYXNlIDB4MzU6CiAJCQlwZXJmbHZsLT5mYW5zcGVlZCA9IGVudHJ5WzZdOwotCQkJcGVyZmx2bC0+dm9sdGFnZSA9IGVudHJ5WzddOworCQkJcGVyZmx2bC0+dm9sdF9taW4gPSBlbnRyeVs3XTsKIAkJCXBlcmZsdmwtPmNvcmUgPSBST00xNihlbnRyeVs4XSkgKiAxMDAwOwogCQkJcGVyZmx2bC0+c2hhZGVyID0gUk9NMTYoZW50cnlbMTBdKSAqIDEwMDA7CiAJCQlwZXJmbHZsLT5tZW1vcnkgPSBST00xNihlbnRyeVsxMl0pICogMTAwMDsKQEAgLTI0MCwzMCArMzA0LDM0IEBACiAJCQlwZXJmbHZsLT51bmswNSA9IFJPTTE2KGVudHJ5WzE2XSkgKiAxMDAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg0MDoKLSNkZWZpbmUgc3ViZW50KG4pIGVudHJ5W3BlcmZbMl0gKyAoKG4pICogcGVyZlszXSldCisjZGVmaW5lIHN1YmVudChuKSAoUk9NMTYoZW50cnlbcGVyZlsyXSArICgobikgKiBwZXJmWzNdKV0pICYgMHhmZmYpICogMTAwMAogCQkJcGVyZmx2bC0+ZmFuc3BlZWQgPSAwOyAvKlhYWCovCi0JCQlwZXJmbHZsLT52b2x0YWdlID0gZW50cnlbMl07CisJCQlwZXJmbHZsLT52b2x0X21pbiA9IGVudHJ5WzJdOwogCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCQlwZXJmbHZsLT5jb3JlID0gUk9NMTYoc3ViZW50KDApKSAmIDB4ZmZmOwotCQkJCXBlcmZsdmwtPnNoYWRlciA9IFJPTTE2KHN1YmVudCgxKSkgJiAweGZmZjsKLQkJCQlwZXJmbHZsLT5tZW1vcnkgPSBST00xNihzdWJlbnQoMikpICYgMHhmZmY7CisJCQkJcGVyZmx2bC0+Y29yZSAgID0gc3ViZW50KDApOworCQkJCXBlcmZsdmwtPnNoYWRlciA9IHN1YmVudCgxKTsKKwkJCQlwZXJmbHZsLT5tZW1vcnkgPSBzdWJlbnQoMik7CisJCQkJcGVyZmx2bC0+dmRlYyAgID0gc3ViZW50KDMpOworCQkJCXBlcmZsdmwtPnVua2EwICA9IHN1YmVudCg0KTsKIAkJCX0gZWxzZSB7Ci0JCQkJcGVyZmx2bC0+c2hhZGVyID0gUk9NMTYoc3ViZW50KDMpKSAmIDB4ZmZmOworCQkJCXBlcmZsdmwtPmh1YjA2ICA9IHN1YmVudCgwKTsKKwkJCQlwZXJmbHZsLT5odWIwMSAgPSBzdWJlbnQoMSk7CisJCQkJcGVyZmx2bC0+Y29weSAgID0gc3ViZW50KDIpOworCQkJCXBlcmZsdmwtPnNoYWRlciA9IHN1YmVudCgzKTsKKwkJCQlwZXJmbHZsLT5yb3AgICAgPSBzdWJlbnQoNCk7CisJCQkJcGVyZmx2bC0+bWVtb3J5ID0gc3ViZW50KDUpOworCQkJCXBlcmZsdmwtPnZkZWMgICA9IHN1YmVudCg2KTsKKwkJCQlwZXJmbHZsLT5kYWVtb24gPSBzdWJlbnQoMTApOworCQkJCXBlcmZsdmwtPmh1YjA3ICA9IHN1YmVudCgxMSk7CiAJCQkJcGVyZmx2bC0+Y29yZSAgID0gcGVyZmx2bC0+c2hhZGVyIC8gMjsKLQkJCQlwZXJmbHZsLT51bmswYSAgPSBST00xNihzdWJlbnQoNCkpICYgMHhmZmY7Ci0JCQkJcGVyZmx2bC0+bWVtb3J5ID0gUk9NMTYoc3ViZW50KDUpKSAmIDB4ZmZmOwogCQkJfQotCi0JCQlwZXJmbHZsLT5jb3JlICo9IDEwMDA7Ci0JCQlwZXJmbHZsLT5zaGFkZXIgKj0gMTAwMDsKLQkJCXBlcmZsdmwtPm1lbW9yeSAqPSAxMDAwOwotCQkJcGVyZmx2bC0+dW5rMGEgKj0gMTAwMDsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLyogbWFrZSBzdXJlIHZpZCBpcyB2YWxpZCAqLwotCQlpZiAocG0tPnZvbHRhZ2Uuc3VwcG9ydGVkICYmIHBlcmZsdmwtPnZvbHRhZ2UpIHsKLQkJCXZpZCA9IG5vdXZlYXVfdm9sdF92aWRfbG9va3VwKGRldiwgcGVyZmx2bC0+dm9sdGFnZSk7CisJCW5vdXZlYXVfcGVyZl92b2x0YWdlKGRldiwgJlAsIHBlcmZsdmwpOworCQlpZiAocG0tPnZvbHRhZ2Uuc3VwcG9ydGVkICYmIHBlcmZsdmwtPnZvbHRfbWluKSB7CisJCQl2aWQgPSBub3V2ZWF1X3ZvbHRfdmlkX2xvb2t1cChkZXYsIHBlcmZsdmwtPnZvbHRfbWluKTsKIAkJCWlmICh2aWQgPCAwKSB7CiAJCQkJTlZfREVCVUcoZGV2LCAiZHJvcCBwZXJmbHZsICVkLCBiYWQgdmlkXG4iLCBpKTsKIAkJCQllbnRyeSArPSByZWNvcmRsZW47CkBAIC0yNzIsNyArMzQwLDExIEBACiAJCX0KIAogCQkvKiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IHRpbWluZ3MgKi8KLQkJaWYgKHZlcnNpb24gPiAweDE1KSB7CisJCWlmICh2ZXJzaW9uID09IDB4MTUpIHsKKwkJCW1lbXRpbWluZ3MtPnRpbWluZ1tpXS5pZCA9IGk7CisJCQludjMwX21lbV90aW1pbmdfZW50cnkoZGV2LCZtdF9oZHIsKHN0cnVjdCBub3V2ZWF1X3BtX3RibF9lbnRyeSopICZlbnRyeVs0MV0sMCwmbWVtdGltaW5ncy0+dGltaW5nW2ldKTsKKwkJCXBlcmZsdmwtPnRpbWluZyA9ICZtZW10aW1pbmdzLT50aW1pbmdbaV07CisJCX0gZWxzZSBpZiAodmVyc2lvbiA+IDB4MTUpIHsKIAkJCS8qIGxhc3QgMyBhcmdzIGFyZSBmb3IgPCAweDQwLCBpZ25vcmVkIGZvciA+PSAweDQwICovCiAJCQlwZXJmbHZsLT50aW1pbmcgPQogCQkJCW5vdXZlYXVfcGVyZl90aW1pbmcoZGV2LCAmUCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYwppbmRleCBkYThkOTk0Li5hNTM5ZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5jCkBAIC02NCwxOCArNjQsMjYgQEAKIAlpZiAocGVyZmx2bCA9PSBwbS0+Y3VyKQogCQlyZXR1cm4gMDsKIAotCWlmIChwbS0+dm9sdGFnZS5zdXBwb3J0ZWQgJiYgcG0tPnZvbHRhZ2Vfc2V0ICYmIHBlcmZsdmwtPnZvbHRhZ2UpIHsKLQkJcmV0ID0gcG0tPnZvbHRhZ2Vfc2V0KGRldiwgcGVyZmx2bC0+dm9sdGFnZSk7CisJaWYgKHBtLT52b2x0YWdlLnN1cHBvcnRlZCAmJiBwbS0+dm9sdGFnZV9zZXQgJiYgcGVyZmx2bC0+dm9sdF9taW4pIHsKKwkJcmV0ID0gcG0tPnZvbHRhZ2Vfc2V0KGRldiwgcGVyZmx2bC0+dm9sdF9taW4pOwogCQlpZiAocmV0KSB7CiAJCQlOVl9FUlJPUihkZXYsICJ2b2x0YWdlX3NldCAlZCBmYWlsZWQ6ICVkXG4iLAotCQkJCSBwZXJmbHZsLT52b2x0YWdlLCByZXQpOworCQkJCSBwZXJmbHZsLT52b2x0X21pbiwgcmV0KTsKIAkJfQogCX0KIAotCW5vdXZlYXVfcG1fY2xvY2tfc2V0KGRldiwgcGVyZmx2bCwgUExMX0NPUkUsIHBlcmZsdmwtPmNvcmUpOwotCW5vdXZlYXVfcG1fY2xvY2tfc2V0KGRldiwgcGVyZmx2bCwgUExMX1NIQURFUiwgcGVyZmx2bC0+c2hhZGVyKTsKLQlub3V2ZWF1X3BtX2Nsb2NrX3NldChkZXYsIHBlcmZsdmwsIFBMTF9NRU1PUlksIHBlcmZsdmwtPm1lbW9yeSk7Ci0Jbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfVU5LMDUsIHBlcmZsdmwtPnVuazA1KTsKKwlpZiAocG0tPmNsb2Nrc19wcmUpIHsKKwkJdm9pZCAqc3RhdGUgPSBwbS0+Y2xvY2tzX3ByZShkZXYsIHBlcmZsdmwpOworCQlpZiAoSVNfRVJSKHN0YXRlKSkKKwkJCXJldHVybiBQVFJfRVJSKHN0YXRlKTsKKwkJcG0tPmNsb2Nrc19zZXQoZGV2LCBzdGF0ZSk7CisJfSBlbHNlCisJaWYgKHBtLT5jbG9ja19zZXQpIHsKKwkJbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfQ09SRSwgcGVyZmx2bC0+Y29yZSk7CisJCW5vdXZlYXVfcG1fY2xvY2tfc2V0KGRldiwgcGVyZmx2bCwgUExMX1NIQURFUiwgcGVyZmx2bC0+c2hhZGVyKTsKKwkJbm91dmVhdV9wbV9jbG9ja19zZXQoZGV2LCBwZXJmbHZsLCBQTExfTUVNT1JZLCBwZXJmbHZsLT5tZW1vcnkpOworCQlub3V2ZWF1X3BtX2Nsb2NrX3NldChkZXYsIHBlcmZsdmwsIFBMTF9VTkswNSwgcGVyZmx2bC0+dW5rMDUpOworCX0KIAogCXBtLT5jdXIgPSBwZXJmbHZsOwogCXJldHVybiAwOwpAQCAtOTIsOSArMTAwLDYgQEAKIAlpZiAobm91dmVhdV9wZXJmbHZsX3dyICE9IDc3NzcpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXBtLT5jbG9ja19zZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKCFzdHJuY21wKHByb2ZpbGUsICJib290IiwgNCkpCiAJCXBlcmZsdmwgPSAmcG0tPmJvb3Q7CiAJZWxzZSB7CkBAIC0xMjMsMzEgKzEyOCwzNyBAQAogCXN0cnVjdCBub3V2ZWF1X3BtX2VuZ2luZSAqcG0gPSAmZGV2X3ByaXYtPmVuZ2luZS5wbTsKIAlpbnQgcmV0OwogCi0JaWYgKCFwbS0+Y2xvY2tfZ2V0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCW1lbXNldChwZXJmbHZsLCAwLCBzaXplb2YoKnBlcmZsdmwpKTsKIAotCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfQ09SRSk7Ci0JaWYgKHJldCA+IDApCi0JCXBlcmZsdmwtPmNvcmUgPSByZXQ7CisJaWYgKHBtLT5jbG9ja3NfZ2V0KSB7CisJCXJldCA9IHBtLT5jbG9ja3NfZ2V0KGRldiwgcGVyZmx2bCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCWlmIChwbS0+Y2xvY2tfZ2V0KSB7CisJCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfQ09SRSk7CisJCWlmIChyZXQgPiAwKQorCQkJcGVyZmx2bC0+Y29yZSA9IHJldDsKIAotCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfTUVNT1JZKTsKLQlpZiAocmV0ID4gMCkKLQkJcGVyZmx2bC0+bWVtb3J5ID0gcmV0OworCQlyZXQgPSBwbS0+Y2xvY2tfZ2V0KGRldiwgUExMX01FTU9SWSk7CisJCWlmIChyZXQgPiAwKQorCQkJcGVyZmx2bC0+bWVtb3J5ID0gcmV0OwogCi0JcmV0ID0gcG0tPmNsb2NrX2dldChkZXYsIFBMTF9TSEFERVIpOwotCWlmIChyZXQgPiAwKQotCQlwZXJmbHZsLT5zaGFkZXIgPSByZXQ7CisJCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfU0hBREVSKTsKKwkJaWYgKHJldCA+IDApCisJCQlwZXJmbHZsLT5zaGFkZXIgPSByZXQ7CiAKLQlyZXQgPSBwbS0+Y2xvY2tfZ2V0KGRldiwgUExMX1VOSzA1KTsKLQlpZiAocmV0ID4gMCkKLQkJcGVyZmx2bC0+dW5rMDUgPSByZXQ7CisJCXJldCA9IHBtLT5jbG9ja19nZXQoZGV2LCBQTExfVU5LMDUpOworCQlpZiAocmV0ID4gMCkKKwkJCXBlcmZsdmwtPnVuazA1ID0gcmV0OworCX0KIAogCWlmIChwbS0+dm9sdGFnZS5zdXBwb3J0ZWQgJiYgcG0tPnZvbHRhZ2VfZ2V0KSB7CiAJCXJldCA9IHBtLT52b2x0YWdlX2dldChkZXYpOwotCQlpZiAocmV0ID4gMCkKLQkJCXBlcmZsdmwtPnZvbHRhZ2UgPSByZXQ7CisJCWlmIChyZXQgPiAwKSB7CisJCQlwZXJmbHZsLT52b2x0X21pbiA9IHJldDsKKwkJCXBlcmZsdmwtPnZvbHRfbWF4ID0gcmV0OworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNTYsNyArMTY3LDcgQEAKIHN0YXRpYyB2b2lkCiBub3V2ZWF1X3BtX3BlcmZsdmxfaW5mbyhzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCwgY2hhciAqcHRyLCBpbnQgbGVuKQogewotCWNoYXIgY1sxNl0sIHNbMTZdLCB2WzE2XSwgZlsxNl0sIHRbMTZdOworCWNoYXIgY1sxNl0sIHNbMTZdLCB2WzMyXSwgZlsxNl0sIHRbMTZdLCBtWzE2XTsKIAogCWNbMF0gPSAnXDAnOwogCWlmIChwZXJmbHZsLT5jb3JlKQpAQCAtMTY2LDkgKzE3NywxOSBAQAogCWlmIChwZXJmbHZsLT5zaGFkZXIpCiAJCXNucHJpbnRmKHMsIHNpemVvZihzKSwgIiBzaGFkZXIgJWRNSHoiLCBwZXJmbHZsLT5zaGFkZXIgLyAxMDAwKTsKIAorCW1bMF0gPSAnXDAnOworCWlmIChwZXJmbHZsLT5tZW1vcnkpCisJCXNucHJpbnRmKG0sIHNpemVvZihtKSwgIiBtZW1vcnkgJWRNSHoiLCBwZXJmbHZsLT5tZW1vcnkgLyAxMDAwKTsKKwogCXZbMF0gPSAnXDAnOwotCWlmIChwZXJmbHZsLT52b2x0YWdlKQotCQlzbnByaW50Zih2LCBzaXplb2YodiksICIgdm9sdGFnZSAlZG1WIiwgcGVyZmx2bC0+dm9sdGFnZSAqIDEwKTsKKwlpZiAocGVyZmx2bC0+dm9sdF9taW4gJiYgcGVyZmx2bC0+dm9sdF9taW4gIT0gcGVyZmx2bC0+dm9sdF9tYXgpIHsKKwkJc25wcmludGYodiwgc2l6ZW9mKHYpLCAiIHZvbHRhZ2UgJWRtVi0lZG1WIiwKKwkJCSBwZXJmbHZsLT52b2x0X21pbiAvIDEwMDAsIHBlcmZsdmwtPnZvbHRfbWF4IC8gMTAwMCk7CisJfSBlbHNlCisJaWYgKHBlcmZsdmwtPnZvbHRfbWluKSB7CisJCXNucHJpbnRmKHYsIHNpemVvZih2KSwgIiB2b2x0YWdlICVkbVYiLAorCQkJIHBlcmZsdmwtPnZvbHRfbWluIC8gMTAwMCk7CisJfQogCiAJZlswXSA9ICdcMCc7CiAJaWYgKHBlcmZsdmwtPmZhbnNwZWVkKQpAQCAtMTc4LDggKzE5OSw3IEBACiAJaWYgKHBlcmZsdmwtPnRpbWluZykKIAkJc25wcmludGYodCwgc2l6ZW9mKHQpLCAiIHRpbWluZyAlZCIsIHBlcmZsdmwtPnRpbWluZy0+aWQpOwogCi0Jc25wcmludGYocHRyLCBsZW4sICJtZW1vcnkgJWRNSHolcyVzJXMlcyVzXG4iLCBwZXJmbHZsLT5tZW1vcnkgLyAxMDAwLAotCQkgYywgcywgdiwgZiwgdCk7CisJc25wcmludGYocHRyLCBsZW4sICIlcyVzJXMlcyVzJXNcbiIsIGMsIHMsIG0sIHQsIHYsIGYpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMTkwLDcgKzIxMCw3IEBACiAJY2hhciAqcHRyID0gYnVmOwogCWludCBsZW4gPSBQQUdFX1NJWkU7CiAKLQlzbnByaW50ZihwdHIsIGxlbiwgIiVkOiAiLCBwZXJmbHZsLT5pZCk7CisJc25wcmludGYocHRyLCBsZW4sICIlZDoiLCBwZXJmbHZsLT5pZCk7CiAJcHRyICs9IHN0cmxlbihidWYpOwogCWxlbiAtPSBzdHJsZW4oYnVmKTsKIApAQCAtMjExLDkgKzIzMSw5IEBACiAJaWYgKCFwbS0+Y3VyKQogCQlzbnByaW50ZihwdHIsIGxlbiwgInNldHRpbmc6IGJvb3RcbiIpOwogCWVsc2UgaWYgKHBtLT5jdXIgPT0gJnBtLT5ib290KQotCQlzbnByaW50ZihwdHIsIGxlbiwgInNldHRpbmc6IGJvb3RcbmM6ICIpOworCQlzbnByaW50ZihwdHIsIGxlbiwgInNldHRpbmc6IGJvb3RcbmM6Iik7CiAJZWxzZQotCQlzbnByaW50ZihwdHIsIGxlbiwgInNldHRpbmc6IHN0YXRpYyAlZFxuYzogIiwgcG0tPmN1ci0+aWQpOworCQlzbnByaW50ZihwdHIsIGxlbiwgInNldHRpbmc6IHN0YXRpYyAlZFxuYzoiLCBwbS0+Y3VyLT5pZCk7CiAJcHRyICs9IHN0cmxlbihidWYpOwogCWxlbiAtPSBzdHJsZW4oYnVmKTsKIApAQCAtMjkyLDcgKzMxMiw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0hXTU9OCisjaWYgZGVmaW5lZChDT05GSUdfSFdNT04pIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfSFdNT05fTU9EVUxFKSkKIHN0YXRpYyBzc2l6ZV90CiBub3V2ZWF1X2h3bW9uX3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwgY2hhciAqYnVmKQogewpAQCAtNDA5LDcgKzQyOSw3IEBACiBzdGF0aWMgaW50CiBub3V2ZWF1X2h3bW9uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLSNpZmRlZiBDT05GSUdfSFdNT04KKyNpZiBkZWZpbmVkKENPTkZJR19IV01PTikgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19IV01PTl9NT0RVTEUpKQogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICpwbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnBtOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKQEAgLTQ0Miw3ICs0NjIsNyBAQAogc3RhdGljIHZvaWQKIG5vdXZlYXVfaHdtb25fZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotI2lmZGVmIENPTkZJR19IV01PTgorI2lmIGRlZmluZWQoQ09ORklHX0hXTU9OKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0hXTU9OX01PRFVMRSkpCiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9lbmdpbmUgKnBtID0gJmRldl9wcml2LT5lbmdpbmUucG07CiAKQEAgLTQ4OCw3ICs1MDgsNyBAQAogCU5WX0lORk8oZGV2LCAiJWQgYXZhaWxhYmxlIHBlcmZvcm1hbmNlIGxldmVsKHMpXG4iLCBwbS0+bnJfcGVyZmx2bCk7CiAJZm9yIChpID0gMDsgaSA8IHBtLT5ucl9wZXJmbHZsOyBpKyspIHsKIAkJbm91dmVhdV9wbV9wZXJmbHZsX2luZm8oJnBtLT5wZXJmbHZsW2ldLCBpbmZvLCBzaXplb2YoaW5mbykpOwotCQlOVl9JTkZPKGRldiwgIiVkOiAlcyIsIHBtLT5wZXJmbHZsW2ldLmlkLCBpbmZvKTsKKwkJTlZfSU5GTyhkZXYsICIlZDolcyIsIHBtLT5wZXJmbHZsW2ldLmlkLCBpbmZvKTsKIAl9CiAKIAkvKiBkZXRlcm1pbmUgY3VycmVudCAoImJvb3QiKSBwZXJmb3JtYW5jZSBsZXZlbCAqLwpAQCAtNDk4LDcgKzUxOCw3IEBACiAJCXBtLT5jdXIgPSAmcG0tPmJvb3Q7CiAKIAkJbm91dmVhdV9wbV9wZXJmbHZsX2luZm8oJnBtLT5ib290LCBpbmZvLCBzaXplb2YoaW5mbykpOwotCQlOVl9JTkZPKGRldiwgImM6ICVzIiwgaW5mbyk7CisJCU5WX0lORk8oZGV2LCAiYzolcyIsIGluZm8pOwogCX0KIAogCS8qIHN3aXRjaCBwZXJmb3JtYW5jZSBsZXZlbHMgbm93IGlmIHJlcXVlc3RlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5oCmluZGV4IDRhOTgzOGRkLi44YWMwMmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5oCkBAIC01Miw2ICs1MiwxMSBAQAogCQkJdTMyIGlkLCBpbnQga2h6KTsKIHZvaWQgbnYwNF9wbV9jbG9ja19zZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqKTsKIAorLyogbnY0MF9wbS5jICovCitpbnQgbnY0MF9wbV9jbG9ja3NfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOwordm9pZCAqbnY0MF9wbV9jbG9ja3NfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICopOwordm9pZCBudjQwX3BtX2Nsb2Nrc19zZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqKTsKKwogLyogbnY1MF9wbS5jICovCiBpbnQgbnY1MF9wbV9jbG9ja19nZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdTMyIGlkKTsKIHZvaWQgKm52NTBfcG1fY2xvY2tfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICosCkBAIC01OSwxMCArNjQsMTIgQEAKIHZvaWQgbnY1MF9wbV9jbG9ja19zZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqKTsKIAogLyogbnZhM19wbS5jICovCi1pbnQgbnZhM19wbV9jbG9ja19nZXQoc3RydWN0IGRybV9kZXZpY2UgKiwgdTMyIGlkKTsKLXZvaWQgKm52YTNfcG1fY2xvY2tfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICosCi0JCQl1MzIgaWQsIGludCBraHopOwotdm9pZCBudmEzX3BtX2Nsb2NrX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICopOworaW50IG52YTNfcG1fY2xvY2tzX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqKTsKK3ZvaWQgKm52YTNfcG1fY2xvY2tzX3ByZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqKTsKK3ZvaWQgbnZhM19wbV9jbG9ja3Nfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKik7CisKKy8qIG52YzBfcG0uYyAqLworaW50IG52YzBfcG1fY2xvY2tzX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqKTsKIAogLyogbm91dmVhdV90ZW1wLmMgKi8KIHZvaWQgbm91dmVhdV90ZW1wX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaAppbmRleCBmMThjZGZjLi40M2E5NmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKQEAgLTgyNiw5ICs4MjYsMTIgQEAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9CTEFOS0VEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURV9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MWMwODQKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9TT1JfQkFDS0xJR0hUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBmZmYKKyNkZWZpbmUgTlY1MF9QRElTUF9TT1JfUFdNX0RJVihpKSAgICAgICAgICAgICAgICAgICAgICgweDAwNjFjMDgwICsgKGkpICogMHg4MDApCisjZGVmaW5lIE5WNTBfUERJU1BfU09SX1BXTV9DVEwoaSkgICAgICAgICAgICAgICAgICAgICAoMHgwMDYxYzA4NCArIChpKSAqIDB4ODAwKQorI2RlZmluZSBOVjUwX1BESVNQX1NPUl9QV01fQ1RMX05FVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBOVkEzX1BESVNQX1NPUl9QV01fQ1RMX1VOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBOVjUwX1BESVNQX1NPUl9QV01fQ1RMX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDdmZgorI2RlZmluZSBOVkEzX1BESVNQX1NPUl9QV01fQ1RMX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmZmZmZgogI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMKGksIGwpICAgICAgICAgICAoMHgwMDYxYzEwYyArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKICNkZWZpbmUgTlY1MF9TT1JfRFBfQ1RSTF9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgTlY1MF9TT1JfRFBfQ1RSTF9FTkhBTkNFRF9GUkFNRV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKQEAgLTg0Myw3ICs4NDYsNyBAQAogI2RlZmluZSBOVjUwX1NPUl9EUF9DVFJMX1RSQUlOSU5HX1BBVFRFUk5fMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAogI2RlZmluZSBOVjUwX1NPUl9EUF9VTksxMTgoaSwgbCkgICAgICAgICAoMHgwMDYxYzExOCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKICNkZWZpbmUgTlY1MF9TT1JfRFBfVU5LMTIwKGksIGwpICAgICAgICAgKDB4MDA2MWMxMjAgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCi0jZGVmaW5lIE5WNTBfU09SX0RQX1VOSzEyOChpLCBsKSAgICAgICAgICgweDAwNjFjMTI4ICsgKGkpICogMHg4MDAgKyAobCkgKiAweDgwKQorI2RlZmluZSBOVjUwX1NPUl9EUF9TQ0ZHKGksIGwpICAgICAgICAgICAoMHgwMDYxYzEyOCArIChpKSAqIDB4ODAwICsgKGwpICogMHg4MCkKICNkZWZpbmUgTlY1MF9TT1JfRFBfVU5LMTMwKGksIGwpICAgICAgICAgKDB4MDA2MWMxMzAgKyAoaSkgKiAweDgwMCArIChsKSAqIDB4ODApCiAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9VU0VSKGkpICAgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAwMCArIDB4MDA2NDAwMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKaW5kZXggMjcwNmNiMy4uYjc1MjU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtMTIsOCArMTIsOCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAKIAlkbWFfYWRkcl90ICpwYWdlczsKLQlib29sICp0dG1fYWxsb2NlZDsKIAl1bnNpZ25lZCBucl9wYWdlczsKKwlib29sIHVubWFwX3BhZ2VzOwogCiAJdTY0IG9mZnNldDsKIAlib29sIGJvdW5kOwpAQCAtMjYsNDMgKzI2LDI4IEBACiB7CiAJc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKm52YmUgPSAoc3RydWN0IG5vdXZlYXVfc2dkbWFfYmUgKiliZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZiZS0+ZGV2OworCWludCBpOwogCiAJTlZfREVCVUcobnZiZS0+ZGV2LCAibnVtX3BhZ2VzID0gJWxkXG4iLCBudW1fcGFnZXMpOwogCi0JaWYgKG52YmUtPnBhZ2VzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwludmJlLT5wYWdlcyA9IGRtYV9hZGRyczsKKwludmJlLT5ucl9wYWdlcyA9IG51bV9wYWdlczsKKwludmJlLT51bm1hcF9wYWdlcyA9IHRydWU7CiAKLQludmJlLT5wYWdlcyA9IGttYWxsb2Moc2l6ZW9mKGRtYV9hZGRyX3QpICogbnVtX3BhZ2VzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW52YmUtPnBhZ2VzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW52YmUtPnR0bV9hbGxvY2VkID0ga21hbGxvYyhzaXplb2YoYm9vbCkgKiBudW1fcGFnZXMsIEdGUF9LRVJORUwpOwotCWlmICghbnZiZS0+dHRtX2FsbG9jZWQpIHsKLQkJa2ZyZWUobnZiZS0+cGFnZXMpOwotCQludmJlLT5wYWdlcyA9IE5VTEw7Ci0JCXJldHVybiAtRU5PTUVNOworCS8qIHRoaXMgY29kZSBwYXRoIGlzbid0IGNhbGxlZCBhbmQgaXMgaW5jb3JyZWN0IGFueXdheXMgKi8KKwlpZiAoMCkgeyAvKiBkbWFfYWRkcnNbMF0gIT0gRE1BX0VSUk9SX0NPREUpIHsgKi8KKwkJbnZiZS0+dW5tYXBfcGFnZXMgPSBmYWxzZTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JbnZiZS0+bnJfcGFnZXMgPSAwOwotCXdoaWxlIChudW1fcGFnZXMtLSkgewotCQkvKiB0aGlzIGNvZGUgcGF0aCBpc24ndCBjYWxsZWQgYW5kIGlzIGluY29ycmVjdCBhbnl3YXlzICovCi0JCWlmICgwKSB7IC8qZG1hX2FkZHJzW252YmUtPm5yX3BhZ2VzXSAhPSBETUFfRVJST1JfQ09ERSkqLwotCQkJbnZiZS0+cGFnZXNbbnZiZS0+bnJfcGFnZXNdID0KLQkJCQkJZG1hX2FkZHJzW252YmUtPm5yX3BhZ2VzXTsKLQkJIAludmJlLT50dG1fYWxsb2NlZFtudmJlLT5ucl9wYWdlc10gPSB0cnVlOwotCQl9IGVsc2UgewotCQkJbnZiZS0+cGFnZXNbbnZiZS0+bnJfcGFnZXNdID0KLQkJCQlwY2lfbWFwX3BhZ2UoZGV2LT5wZGV2LCBwYWdlc1tudmJlLT5ucl9wYWdlc10sIDAsCi0JCQkJICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRldi0+cGRldiwKLQkJCQkJCSAgbnZiZS0+cGFnZXNbbnZiZS0+bnJfcGFnZXNdKSkgewotCQkJCWJlLT5mdW5jLT5jbGVhcihiZSk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQludmJlLT50dG1fYWxsb2NlZFtudmJlLT5ucl9wYWdlc10gPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJbnZiZS0+cGFnZXNbaV0gPSBwY2lfbWFwX3BhZ2UoZGV2LT5wZGV2LCBwYWdlc1tpXSwgMCwKKwkJCQkJICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRldi0+cGRldiwgbnZiZS0+cGFnZXNbaV0pKSB7CisJCQludmJlLT5ucl9wYWdlcyA9IC0taTsKKwkJCWJlLT5mdW5jLT5jbGVhcihiZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCi0JCW52YmUtPm5yX3BhZ2VzKys7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03MiwyNSArNTcsMTYgQEAKIG5vdXZlYXVfc2dkbWFfY2xlYXIoc3RydWN0IHR0bV9iYWNrZW5kICpiZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52YmUtPmRldjsKIAotCWlmIChudmJlICYmIG52YmUtPnBhZ2VzKSB7Ci0JCWRldiA9IG52YmUtPmRldjsKLQkJTlZfREVCVUcoZGV2LCAiXG4iKTsKKwlpZiAobnZiZS0+Ym91bmQpCisJCWJlLT5mdW5jLT51bmJpbmQoYmUpOwogCi0JCWlmIChudmJlLT5ib3VuZCkKLQkJCWJlLT5mdW5jLT51bmJpbmQoYmUpOwotCisJaWYgKG52YmUtPnVubWFwX3BhZ2VzKSB7CiAJCXdoaWxlIChudmJlLT5ucl9wYWdlcy0tKSB7Ci0JCQlpZiAoIW52YmUtPnR0bV9hbGxvY2VkW252YmUtPm5yX3BhZ2VzXSkKLQkJCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIG52YmUtPnBhZ2VzW252YmUtPm5yX3BhZ2VzXSwKKwkJCXBjaV91bm1hcF9wYWdlKGRldi0+cGRldiwgbnZiZS0+cGFnZXNbbnZiZS0+bnJfcGFnZXNdLAogCQkJCSAgICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCX0KLQkJa2ZyZWUobnZiZS0+cGFnZXMpOwotCQlrZnJlZShudmJlLT50dG1fYWxsb2NlZCk7Ci0JCW52YmUtPnBhZ2VzID0gTlVMTDsKLQkJbnZiZS0+dHRtX2FsbG9jZWQgPSBOVUxMOwotCQludmJlLT5ucl9wYWdlcyA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKaW5kZXggMTA2NTZlNC4uZDg4MzFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYwpAQCAtMjg2LDkgKzI4Niw5IEBACiAJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gbnYxMF9ncGlvX2dldDsKIAkJZW5naW5lLT5ncGlvLnNldAkJPSBudjEwX2dwaW9fc2V0OwogCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBOVUxMOwotCQllbmdpbmUtPnBtLmNsb2NrX2dldAkJPSBudjA0X3BtX2Nsb2NrX2dldDsKLQkJZW5naW5lLT5wbS5jbG9ja19wcmUJCT0gbnYwNF9wbV9jbG9ja19wcmU7Ci0JCWVuZ2luZS0+cG0uY2xvY2tfc2V0CQk9IG52MDRfcG1fY2xvY2tfc2V0OworCQllbmdpbmUtPnBtLmNsb2Nrc19nZXQJCT0gbnY0MF9wbV9jbG9ja3NfZ2V0OworCQllbmdpbmUtPnBtLmNsb2Nrc19wcmUJCT0gbnY0MF9wbV9jbG9ja3NfcHJlOworCQllbmdpbmUtPnBtLmNsb2Nrc19zZXQJCT0gbnY0MF9wbV9jbG9ja3Nfc2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKIAkJZW5naW5lLT5wbS52b2x0YWdlX3NldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19zZXQ7CiAJCWVuZ2luZS0+cG0udGVtcF9nZXQJCT0gbnY0MF90ZW1wX2dldDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCWNhc2UgMHg1MDoKIAljYXNlIDB4ODA6IC8qIGdvdHRhIGxvdmUgTlZJRElBJ3MgY29uc2lzdGVuY3kuLiAqLwogCWNhc2UgMHg5MDoKLQljYXNlIDB4QTA6CisJY2FzZSAweGEwOgogCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjUwX2luc3RtZW1faW5pdDsKIAkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnY1MF9pbnN0bWVtX3Rha2Vkb3duOwogCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjUwX2luc3RtZW1fc3VzcGVuZDsKQEAgLTM1OSw5ICszNTksOSBAQAogCQkJZW5naW5lLT5wbS5jbG9ja19zZXQJPSBudjUwX3BtX2Nsb2NrX3NldDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZW5naW5lLT5wbS5jbG9ja19nZXQJPSBudmEzX3BtX2Nsb2NrX2dldDsKLQkJCWVuZ2luZS0+cG0uY2xvY2tfcHJlCT0gbnZhM19wbV9jbG9ja19wcmU7Ci0JCQllbmdpbmUtPnBtLmNsb2NrX3NldAk9IG52YTNfcG1fY2xvY2tfc2V0OworCQkJZW5naW5lLT5wbS5jbG9ja3NfZ2V0CT0gbnZhM19wbV9jbG9ja3NfZ2V0OworCQkJZW5naW5lLT5wbS5jbG9ja3NfcHJlCT0gbnZhM19wbV9jbG9ja3NfcHJlOworCQkJZW5naW5lLT5wbS5jbG9ja3Nfc2V0CT0gbnZhM19wbV9jbG9ja3Nfc2V0OwogCQkJYnJlYWs7CiAJCX0KIAkJZW5naW5lLT5wbS52b2x0YWdlX2dldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19nZXQ7CkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJZW5naW5lLT52cmFtLnB1dAkJPSBudjUwX3ZyYW1fZGVsOwogCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBudjUwX3ZyYW1fZmxhZ3NfdmFsaWQ7CiAJCWJyZWFrOwotCWNhc2UgMHhDMDoKKwljYXNlIDB4YzA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52YzBfaW5zdG1lbV9pbml0OwogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudmMwX2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52YzBfaW5zdG1lbV9zdXNwZW5kOwpAQCAtNDIyLDEyICs0MjIsNzMgQEAKIAkJZW5naW5lLT52cmFtLnB1dAkJPSBudjUwX3ZyYW1fZGVsOwogCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBudmMwX3ZyYW1fZmxhZ3NfdmFsaWQ7CiAJCWVuZ2luZS0+cG0udGVtcF9nZXQJCT0gbnY4NF90ZW1wX2dldDsKKwkJZW5naW5lLT5wbS5jbG9ja3NfZ2V0CQk9IG52YzBfcG1fY2xvY2tzX2dldDsKKwkJZW5naW5lLT5wbS52b2x0YWdlX2dldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+cG0udm9sdGFnZV9zZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fc2V0OworCQlicmVhazsKKwljYXNlIDB4ZDA6CisJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52YzBfaW5zdG1lbV9pbml0OworCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudmMwX2luc3RtZW1fdGFrZWRvd247CisJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52YzBfaW5zdG1lbV9zdXNwZW5kOworCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52YzBfaW5zdG1lbV9yZXN1bWU7CisJCWVuZ2luZS0+aW5zdG1lbS5nZXQJCT0gbnY1MF9pbnN0bWVtX2dldDsKKwkJZW5naW5lLT5pbnN0bWVtLnB1dAkJPSBudjUwX2luc3RtZW1fcHV0OworCQllbmdpbmUtPmluc3RtZW0ubWFwCQk9IG52NTBfaW5zdG1lbV9tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS51bm1hcAkJPSBudjUwX2luc3RtZW1fdW5tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjg0X2luc3RtZW1fZmx1c2g7CisJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnY1MF9tY19pbml0OworCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52NTBfbWNfdGFrZWRvd247CisJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CisJCWVuZ2luZS0+dGltZXIucmVhZAkJPSBudjA0X3RpbWVyX3JlYWQ7CisJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKKwkJZW5naW5lLT5mYi5pbml0CQkJPSBudmMwX2ZiX2luaXQ7CisJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnZjMF9mYl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDEyODsKKwkJZW5naW5lLT5maWZvLmluaXQJCT0gbnZjMF9maWZvX2luaXQ7CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBudmMwX2ZpZm9fdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52YzBfZmlmb19kaXNhYmxlOworCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52YzBfZmlmb19lbmFibGU7CisJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudmMwX2ZpZm9fcmVhc3NpZ247CisJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52YzBfZmlmb19jaGFubmVsX2lkOworCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudmMwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudmMwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnZjMF9maWZvX2xvYWRfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnZjMF9maWZvX3VubG9hZF9jb250ZXh0OworCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmRpc3BsYXkubGF0ZV90YWtlZG93bgk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5kaXNwbGF5LmNyZWF0ZQkJPSBudmQwX2Rpc3BsYXlfY3JlYXRlOworCQllbmdpbmUtPmRpc3BsYXkuaW5pdAkJPSBudmQwX2Rpc3BsYXlfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kJCT0gbnZkMF9kaXNwbGF5X2Rlc3Ryb3k7CisJCWVuZ2luZS0+Z3Bpby5pbml0CQk9IG52NTBfZ3Bpb19pbml0OworCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdwaW8uZ2V0CQk9IG52ZDBfZ3Bpb19nZXQ7CisJCWVuZ2luZS0+Z3Bpby5zZXQJCT0gbnZkMF9ncGlvX3NldDsKKwkJZW5naW5lLT5ncGlvLmlycV9yZWdpc3Rlcgk9IG52NTBfZ3Bpb19pcnFfcmVnaXN0ZXI7CisJCWVuZ2luZS0+Z3Bpby5pcnFfdW5yZWdpc3Rlcgk9IG52NTBfZ3Bpb19pcnFfdW5yZWdpc3RlcjsKKwkJZW5naW5lLT5ncGlvLmlycV9lbmFibGUJCT0gbnY1MF9ncGlvX2lycV9lbmFibGU7CisJCWVuZ2luZS0+dnJhbS5pbml0CQk9IG52YzBfdnJhbV9pbml0OworCQllbmdpbmUtPnZyYW0udGFrZWRvd24JCT0gbnY1MF92cmFtX2Zpbmk7CisJCWVuZ2luZS0+dnJhbS5nZXQJCT0gbnZjMF92cmFtX25ldzsKKwkJZW5naW5lLT52cmFtLnB1dAkJPSBudjUwX3ZyYW1fZGVsOworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBudmMwX3ZyYW1fZmxhZ3NfdmFsaWQ7CisJCWVuZ2luZS0+cG0uY2xvY2tzX2dldAkJPSBudmMwX3BtX2Nsb2Nrc19nZXQ7CisJCWVuZ2luZS0+cG0udm9sdGFnZV9nZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fZ2V0OworCQllbmdpbmUtPnBtLnZvbHRhZ2Vfc2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX3NldDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJTlZfRVJST1IoZGV2LCAiTlYlMDJ4IHVuc3VwcG9ydGVkXG4iLCBkZXZfcHJpdi0+Y2hpcHNldCk7CiAJCXJldHVybiAxOwogCX0KIAorCS8qIGhlYWRsZXNzIG1vZGUgKi8KKwlpZiAobm91dmVhdV9tb2Rlc2V0ID09IDIpIHsKKwkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQgPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmxhdGVfdGFrZWRvd24gPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+ZGlzcGxheS5jcmVhdGUgPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmluaXQgPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kgPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0OSwyMSArNTEwLDYgQEAKIAkJcmV0dXJuIFZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU07CiB9CiAKLXN0YXRpYyBpbnQKLW5vdXZlYXVfY2FyZF9pbml0X2NoYW5uZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfYWxsb2MoZGV2LCAmZGV2X3ByaXYtPmNoYW5uZWwsIE5VTEwsCi0JCQkJICAgIE52RG1hRkIsIE52RG1hVFQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIG5vdXZlYXVfc3dpdGNoZXJvb19zZXRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSBlbnVtIHZnYV9zd2l0Y2hlcm9vX3N0YXRlIHN0YXRlKQogewpAQCAtNTMzLDYgKzU3OSwxNCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2Rpc3BsYXlfZWFybHk7CiAKKwkvKiB3b3JrYXJvdW5kIGFuIG9kZCBpc3N1ZSBvbiBudmMxIGJ5IGRpc2FibGluZyB0aGUgZGV2aWNlJ3MKKwkgKiBub3Nub29wIGNhcGFiaWxpdHkuICBob3BlZnVsbHkgd29uJ3QgY2F1c2UgaXNzdWVzIHVudGlsIGEKKwkgKiBiZXR0ZXIgZml4IGlzIGZvdW5kIC0gYXNzdW1pbmcgdGhlcmUgaXMgb25lLi4uCisJICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4YzEpIHsKKwkJbnZfbWFzayhkZXYsIDB4MDAwODgwODAsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMDApOworCX0KKwogCW5vdXZlYXVfcG1faW5pdChkZXYpOwogCiAJcmV0ID0gZW5naW5lLT52cmFtLmluaXQoZGV2KTsKQEAgLTYzMCw4ICs2ODQsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApCi0JCQludjQwX21wZWdfY3JlYXRlKGRldik7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDMxIHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDM0IHx8CisJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDM2KQorCQkJbnYzMV9tcGVnX2NyZWF0ZShkZXYpOwogCQllbHNlCiAJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwICYmCiAJCSAgICAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDk4IHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4YTApKQpAQCAtNjUxLDQxICs3MDgsNjkgQEAKIAkJCWdvdG8gb3V0X2VuZ2luZTsKIAl9CiAKLQlyZXQgPSBlbmdpbmUtPmRpc3BsYXkuY3JlYXRlKGRldik7CisJcmV0ID0gbm91dmVhdV9pcnFfaW5pdChkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2ZpZm87CiAKLQlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCBudl90d29faGVhZHMoZGV2KSA/IDIgOiAxKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF92Ymxhbms7CisJLyogaW5pdGlhbGlzZSBnZW5lcmFsIG1vZGVzZXR0aW5nICovCisJZHJtX21vZGVfY29uZmlnX2luaXQoZGV2KTsKKwlkcm1fbW9kZV9jcmVhdGVfc2NhbGluZ19tb2RlX3Byb3BlcnR5KGRldik7CisJZHJtX21vZGVfY3JlYXRlX2RpdGhlcmluZ19wcm9wZXJ0eShkZXYpOworCWRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAodm9pZCAqKSZub3V2ZWF1X21vZGVfY29uZmlnX2Z1bmNzOworCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOworCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKKwlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMTApIHsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSAyMDQ4OworCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSAyMDQ4OworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OworCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA0MDk2OworCX0gZWxzZSB7CisJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gODE5MjsKKwkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKKwl9CiAKLQlyZXQgPSBub3V2ZWF1X2lycV9pbml0KGRldik7CisJcmV0ID0gZW5naW5lLT5kaXNwbGF5LmNyZWF0ZShkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X3ZibGFuazsKKwkJZ290byBvdXRfaXJxOwogCi0JLyogd2hhdCBhYm91dCBQVklERU8vUENSVEMvUFJBTURBQyBldGM/ICovCisJbm91dmVhdV9iYWNrbGlnaHRfaW5pdChkZXYpOwogCiAJaWYgKGRldl9wcml2LT5lbmdbTlZPQkpfRU5HSU5FX0dSXSkgewogCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX2luaXQoZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2lycTsKKwkJCWdvdG8gb3V0X2Rpc3A7CiAKLQkJcmV0ID0gbm91dmVhdV9jYXJkX2luaXRfY2hhbm5lbChkZXYpOworCQlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfYWxsb2MoZGV2LCAmZGV2X3ByaXYtPmNoYW5uZWwsIE5VTEwsCisJCQkJCSAgICBOdkRtYUZCLCBOdkRtYVRUKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2ZlbmNlOworCisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNoYW5uZWwtPm11dGV4KTsKIAl9CiAKLQlub3V2ZWF1X2ZiY29uX2luaXQoZGV2KTsKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2luaXQoZGV2KTsKKwlpZiAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YykgeworCQlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCBkZXYtPm1vZGVfY29uZmlnLm51bV9jcnRjKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2NoYW47CisKKwkJbm91dmVhdV9mYmNvbl9pbml0KGRldik7CisJCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdChkZXYpOworCX0KKwogCXJldHVybiAwOwogCitvdXRfY2hhbjoKKwlub3V2ZWF1X2NoYW5uZWxfcHV0X3VubG9ja2VkKCZkZXZfcHJpdi0+Y2hhbm5lbCk7CiBvdXRfZmVuY2U6CiAJbm91dmVhdV9mZW5jZV9maW5pKGRldik7CitvdXRfZGlzcDoKKwlub3V2ZWF1X2JhY2tsaWdodF9leGl0KGRldik7CisJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3koZGV2KTsKIG91dF9pcnE6CiAJbm91dmVhdV9pcnFfZmluaShkZXYpOwotb3V0X3ZibGFuazoKLQlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKLQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveShkZXYpOwogb3V0X2ZpZm86CiAJaWYgKCFkZXZfcHJpdi0+bm9hY2NlbCkKIAkJZW5naW5lLT5maWZvLnRha2Vkb3duKGRldik7CkBAIC03MzIsMTUgKzgxNywyMCBAQAogCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CiAJaW50IGU7CiAKLQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZGV2KTsKLQlub3V2ZWF1X2ZiY29uX2ZpbmkoZGV2KTsKKwlpZiAoZGV2LT5tb2RlX2NvbmZpZy5udW1fY3J0YykgeworCQlkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZGV2KTsKKwkJbm91dmVhdV9mYmNvbl9maW5pKGRldik7CisJCWRybV92YmxhbmtfY2xlYW51cChkZXYpOworCX0KIAogCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCkgewogCQlub3V2ZWF1X2NoYW5uZWxfcHV0X3VubG9ja2VkKCZkZXZfcHJpdi0+Y2hhbm5lbCk7CiAJCW5vdXZlYXVfZmVuY2VfZmluaShkZXYpOwogCX0KIAorCW5vdXZlYXVfYmFja2xpZ2h0X2V4aXQoZGV2KTsKIAllbmdpbmUtPmRpc3BsYXkuZGVzdHJveShkZXYpOworCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7CiAKIAlpZiAoIWRldl9wcml2LT5ub2FjY2VsKSB7CiAJCWVuZ2luZS0+Zmlmby50YWtlZG93bihkZXYpOwpAQCAtNzc0LDcgKzg2NCw2IEBACiAJZW5naW5lLT52cmFtLnRha2Vkb3duKGRldik7CiAKIAlub3V2ZWF1X2lycV9maW5pKGRldik7Ci0JZHJtX3ZibGFua19jbGVhbnVwKGRldik7CiAKIAlub3V2ZWF1X3BtX2ZpbmkoZGV2KTsKIAlub3V2ZWF1X2Jpb3NfdGFrZWRvd24oZGV2KTsKQEAgLTkwNyw3ICs5OTYsNyBAQAogaW50IG5vdXZlYXVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKLQl1aW50MzJfdCByZWcwOworCXVpbnQzMl90IHJlZzAsIHN0cmFwOwogCXJlc291cmNlX3NpemVfdCBtbWlvX3N0YXJ0X29mZnM7CiAJaW50IHJldDsKIApAQCAtOTUxLDEzICsxMDQwLDExIEBACiAKIAkvKiBUaW1lIHRvIGRldGVybWluZSB0aGUgY2FyZCBhcmNoaXRlY3R1cmUgKi8KIAlyZWcwID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0JPT1RfMCk7Ci0JZGV2X3ByaXYtPnN0ZXBwaW5nID0gMDsgLyogWFhYOiBhZGQgc3RlcHBpbmcgZm9yIHByZS1OVjEwPyAqLwogCiAJLyogV2UncmUgZGVhbGluZyB3aXRoID49TlYxMCAqLwogCWlmICgocmVnMCAmIDB4MGYwMDAwMDApID4gMCkgewogCQkvKiBCaXQgMjctMjAgY29udGFpbiB0aGUgYXJjaGl0ZWN0dXJlIGluIGhleCAqLwogCQlkZXZfcHJpdi0+Y2hpcHNldCA9IChyZWcwICYgMHhmZjAwMDAwKSA+PiAyMDsKLQkJZGV2X3ByaXYtPnN0ZXBwaW5nID0gKHJlZzAgJiAweGZmKTsKIAkvKiBOVjA0IG9yIE5WMDUgKi8KIAl9IGVsc2UgaWYgKChyZWcwICYgMHhmZjAwZmZmMCkgPT0gMHgyMDAwNDAwMCkgewogCQlpZiAocmVnMCAmIDB4MDBmMDAwMDApCkBAIC05ODcsNiArMTA3NCw5IEBACiAJY2FzZSAweGMwOgogCQlkZXZfcHJpdi0+Y2FyZF90eXBlID0gTlZfQzA7CiAJCWJyZWFrOworCWNhc2UgMHhkMDoKKwkJZGV2X3ByaXYtPmNhcmRfdHlwZSA9IE5WX0QwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlOVl9JTkZPKGRldiwgIlVuc3VwcG9ydGVkIGNoaXBzZXQgMHglMDh4XG4iLCByZWcwKTsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTk5Niw2ICsxMDg2LDIzIEBACiAJTlZfSU5GTyhkZXYsICJEZXRlY3RlZCBhbiBOViUyeCBnZW5lcmF0aW9uIGNhcmQgKDB4JTA4eClcbiIsCiAJCWRldl9wcml2LT5jYXJkX3R5cGUsIHJlZzApOwogCisJLyogZGV0ZXJtaW5lIGZyZXF1ZW5jeSBvZiB0aW1pbmcgY3J5c3RhbCAqLworCXN0cmFwID0gbnZfcmQzMihkZXYsIDB4MTAxMDAwKTsKKwlpZiAoIGRldl9wcml2LT5jaGlwc2V0IDwgMHgxNyB8fAorCSAgICAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgyMCAmJiBkZXZfcHJpdi0+Y2hpcHNldCA8PSAweDI1KSkKKwkJc3RyYXAgJj0gMHgwMDAwMDA0MDsKKwllbHNlCisJCXN0cmFwICY9IDB4MDA0MDAwNDA7CisKKwlzd2l0Y2ggKHN0cmFwKSB7CisJY2FzZSAweDAwMDAwMDAwOiBkZXZfcHJpdi0+Y3J5c3RhbCA9IDEzNTAwOyBicmVhazsKKwljYXNlIDB4MDAwMDAwNDA6IGRldl9wcml2LT5jcnlzdGFsID0gMTQzMTg7IGJyZWFrOworCWNhc2UgMHgwMDQwMDAwMDogZGV2X3ByaXYtPmNyeXN0YWwgPSAyNzAwMDsgYnJlYWs7CisJY2FzZSAweDAwNDAwMDQwOiBkZXZfcHJpdi0+Y3J5c3RhbCA9IDI1MDAwOyBicmVhazsKKwl9CisKKwlOVl9ERUJVRyhkZXYsICJjcnlzdGFsIGZyZXE6ICVkS0h6XG4iLCBkZXZfcHJpdi0+Y3J5c3RhbCk7CisKIAkvKiBEZXRlcm1pbmUgd2hldGhlciB3ZSdsbCBhdHRlbXB0IGFjY2VsZXJhdGlvbiBvciBub3QsIHNvbWUKIAkgKiBjYXJkcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBoZXJlIGR1ZSB0byB0aGVtIGJlaW5nIGtub3duCiAJICogbm9uLWZ1bmN0aW9uYWwsIG9yIG5ldmVyIGJlZW4gdGVzdGVkIGR1ZSB0byBsYWNrIG9mIGh3LgpAQCAtMTAwMywxMiArMTExMCwxMyBAQAogCWRldl9wcml2LT5ub2FjY2VsID0gISFub3V2ZWF1X25vYWNjZWw7CiAJaWYgKG5vdXZlYXVfbm9hY2NlbCA9PSAtMSkgewogCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7Ci0JCWNhc2UgMHhjMTogLyoga25vd24gYnJva2VuICovCi0JCWNhc2UgMHhjODogLyogbmV2ZXIgdGVzdGVkICovCisjaWYgMAorCQljYXNlIDB4WFg6IC8qIGtub3duIGJyb2tlbiAqLwogCQkJTlZfSU5GTyhkZXYsICJhY2NlbGVyYXRpb24gZGlzYWJsZWQgYnkgZGVmYXVsdCwgcGFzcyAiCiAJCQkJICAgICAibm9hY2NlbD0wIHRvIGZvcmNlIGVuYWJsZVxuIik7CiAJCQlkZXZfcHJpdi0+bm9hY2NlbCA9IHRydWU7CiAJCQlicmVhazsKKyNlbmRpZgogCQlkZWZhdWx0OgogCQkJZGV2X3ByaXYtPm5vYWNjZWwgPSBmYWxzZTsKIAkJCWJyZWFrOwpAQCAtMTAzMCw3ICsxMTM4LDcgQEAKIAkJCWlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcmFtaW5fYmFyKSwKIAkJCQlkZXZfcHJpdi0+cmFtaW5fc2l6ZSk7CiAJCWlmICghZGV2X3ByaXYtPnJhbWluKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gUFJBTUlOIEJBUiIpOworCQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIG1hcCBQUkFNSU4gQkFSXG4iKTsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9tbWlvOwogCQl9CkBAIC0xMTMwLDcgKzEyMzgsNyBAQAogCQlnZXRwYXJhbS0+dmFsdWUgPSAxOwogCQlicmVhazsKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fSEFTX1BBR0VGTElQOgotCQlnZXRwYXJhbS0+dmFsdWUgPSAxOworCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfRDA7CiAJCWJyZWFrOwogCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9HUkFQSF9VTklUUzoKIAkJLyogTlY0MCBhbmQgTlY1MCB2ZXJzaW9ucyBhcmUgcXVpdGUgZGlmZmVyZW50LCBidXQgcmVnaXN0ZXIKQEAgLTExOTgsNiArMTMwNiwyMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyogV2FpdCB1bnRpbCBjb25kKGRhdGEpID09IHRydWUsIHVwIHVudGlsIHRpbWVvdXQgaGFzIGhpdCAqLworYm9vbAorbm91dmVhdV93YWl0X2NiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU2NCB0aW1lb3V0LAorCQlib29sICgqY29uZCkodm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSAqcHRpbWVyID0gJmRldl9wcml2LT5lbmdpbmUudGltZXI7CisJdTY0IHN0YXJ0ID0gcHRpbWVyLT5yZWFkKGRldik7CisKKwlkbyB7CisJCWlmIChjb25kKGRhdGEpID09IHRydWUpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IHdoaWxlIChwdGltZXItPnJlYWQoZGV2KSAtIHN0YXJ0IDwgdGltZW91dCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIFdhaXRzIGZvciBQR1JBUEggdG8gZ28gY29tcGxldGVseSBpZGxlICovCiBib29sIG5vdXZlYXVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV90ZW1wLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3RlbXAuYwppbmRleCAwODFjYTdiLi41YTQ2NDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3RlbXAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3RlbXAuYwpAQCAtMjIsNiArMjIsOCBAQAogICogQXV0aG9yczogTWFydGluIFBlcmVzCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYwppbmRleCAyNDRmZDM4Li5lZjA4MzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCkBAIC0xNzIsOSArMTcyLDkgQEAKIAkJCXZtLT5tYXBfcGd0KHZwZ2QtPm9iaiwgcGRlLCB2cGd0LT5vYmopOwogCQl9CiAKLQkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBndCk7Ci0JCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCX0KIH0KIApAQCAtMTkxLDE4ICsxOTEsMTggQEAKIAlwZ3Rfc2l6ZSAgPSAoMSA8PCAodm0tPnBndF9iaXRzICsgMTIpKSA+PiB0eXBlOwogCXBndF9zaXplICo9IDg7CiAKLQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcodm0tPmRldiwgTlVMTCwgcGd0X3NpemUsIDB4MTAwMCwKIAkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmcGd0KTsKLQltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlyZXR1cm4gcmV0OwogCiAJLyogc29tZW9uZSBiZWF0IHVzIHRvIGZpbGxpbmcgdGhlIFBERSB3aGlsZSB3ZSBkaWRuJ3QgaGF2ZSB0aGUgbG9jayAqLwogCWlmICh1bmxpa2VseSh2cGd0LT5yZWZjb3VudFtiaWddKyspKSB7Ci0JCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIAkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZ3QpOwotCQltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwkJbXV0ZXhfbG9jaygmdm0tPm1tLm11dGV4KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMjMsMTAgKzIyMywxMCBAQAogCXUzMiBmcGRlLCBscGRlLCBwZGU7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOwotCXJldCA9IG5vdXZlYXVfbW1fZ2V0KHZtLT5tbSwgcGFnZV9zaGlmdCwgbXNpemUsIDAsIGFsaWduLCAmdm1hLT5ub2RlKTsKKwltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOworCXJldCA9IG5vdXZlYXVfbW1fZ2V0KCZ2bS0+bW0sIHBhZ2Vfc2hpZnQsIG1zaXplLCAwLCBhbGlnbiwgJnZtYS0+bm9kZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQltdXRleF91bmxvY2soJnZtLT5tbS5tdXRleCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yNDUsMTMgKzI0NSwxMyBAQAogCQlpZiAocmV0KSB7CiAJCQlpZiAocGRlICE9IGZwZGUpCiAJCQkJbm91dmVhdV92bV91bm1hcF9wZ3Qodm0sIGJpZywgZnBkZSwgcGRlIC0gMSk7Ci0JCQlub3V2ZWF1X21tX3B1dCh2bS0+bW0sIHZtYS0+bm9kZSk7Ci0JCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQkJbm91dmVhdV9tbV9wdXQoJnZtLT5tbSwgdm1hLT5ub2RlKTsKKwkJCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIAkJCXZtYS0+bm9kZSA9IE5VTEw7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQotCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCiAJdm1hLT52bSAgICAgPSB2bTsKIAl2bWEtPm9mZnNldCA9ICh1NjQpdm1hLT5ub2RlLT5vZmZzZXQgPDwgMTI7CkBAIC0yNzAsMTEgKzI3MCwxMSBAQAogCWZwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgPj4gdm0tPnBndF9iaXRzKTsKIAlscGRlID0gKHZtYS0+bm9kZS0+b2Zmc2V0ICsgdm1hLT5ub2RlLT5sZW5ndGggLSAxKSA+PiB2bS0+cGd0X2JpdHM7CiAKLQltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCW5vdXZlYXVfdm1fdW5tYXBfcGd0KHZtLCB2bWEtPm5vZGUtPnR5cGUgIT0gdm0tPnNwZ19zaGlmdCwgZnBkZSwgbHBkZSk7Ci0Jbm91dmVhdV9tbV9wdXQodm0tPm1tLCB2bWEtPm5vZGUpOworCW5vdXZlYXVfbW1fcHV0KCZ2bS0+bW0sIHZtYS0+bm9kZSk7CiAJdm1hLT5ub2RlID0gTlVMTDsKLQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmdm0tPm1tLm11dGV4KTsKIH0KIAogaW50CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJCWJsb2NrID0gbGVuZ3RoOwogCiAJfSBlbHNlCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfQzApIHsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkgewogCQl2bS0+bWFwX3BndCA9IG52YzBfdm1fbWFwX3BndDsKIAkJdm0tPm1hcCA9IG52YzBfdm1fbWFwOwogCQl2bS0+bWFwX3NnID0gbnZjMF92bV9tYXBfc2c7CkBAIC0zNjAsMTEgKzM2MCwxMSBAQAogCiAJbm91dmVhdV9ncHVvYmpfcmVmKHBnZCwgJnZwZ2QtPm9iaik7CiAKLQltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF9sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCWZvciAoaSA9IHZtLT5mcGRlOyBpIDw9IHZtLT5scGRlOyBpKyspCiAJCXZtLT5tYXBfcGd0KHBnZCwgaSwgdm0tPnBndFtpIC0gdm0tPmZwZGVdLm9iaik7CiAJbGlzdF9hZGQoJnZwZ2QtPmhlYWQsICZ2bS0+cGdkX2xpc3QpOwotCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0ubXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzcsNyArMzc3LDcgQEAKIAlpZiAoIW1wZ2QpCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCW11dGV4X2xvY2soJnZtLT5tbS5tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZwZ2QsIHRtcCwgJnZtLT5wZ2RfbGlzdCwgaGVhZCkgewogCQlpZiAodnBnZC0+b2JqID09IG1wZ2QpIHsKIAkJCXBnZCA9IHZwZ2QtPm9iajsKQEAgLTM4Niw3ICszODYsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwltdXRleF91bmxvY2soJnZtLT5tbS5tdXRleCk7CiAKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBnZCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmgKaW5kZXggNTc5Y2E4Yy4uNmNlOTk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uaApAQCAtNTEsNyArNTEsNyBAQAogCiBzdHJ1Y3Qgbm91dmVhdV92bSB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW07CisJc3RydWN0IG5vdXZlYXVfbW0gbW07CiAJaW50IHJlZmNvdW50OwogCiAJc3RydWN0IGxpc3RfaGVhZCBwZ2RfbGlzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm9sdC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92b2x0LmMKaW5kZXggNzVlODcyNzQuLjg2ZDAzZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm9sdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm9sdC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X3BtLmgiCiAKLXN0YXRpYyBjb25zdCBlbnVtIGRjYl9ncGlvX3RhZyB2aWR0YWdbXSA9IHsgMHgwNCwgMHgwNSwgMHgwNiwgMHgxYSB9Oworc3RhdGljIGNvbnN0IGVudW0gZGNiX2dwaW9fdGFnIHZpZHRhZ1tdID0geyAweDA0LCAweDA1LCAweDA2LCAweDFhLCAweDczIH07CiBzdGF0aWMgaW50IG5yX3ZpZHRhZyA9IHNpemVvZih2aWR0YWcpIC8gc2l6ZW9mKHZpZHRhZ1swXSk7CiAKIGludApAQCAtMTcwLDYgKzE3MCwxMyBAQAogCQkgKi8KIAkJdmlkc2hpZnQgID0gMjsKIAkJYnJlYWs7CisJY2FzZSAweDQwOgorCQloZWFkZXJsZW4gPSB2b2x0WzFdOworCQlyZWNvcmRsZW4gPSB2b2x0WzJdOworCQllbnRyaWVzICAgPSB2b2x0WzNdOyAvKiBub3QgYSBjbHVlIHdoYXQgdGhlIGVudHJpZXMgYXJlIGZvci4uICovCisJCXZpZG1hc2sgICA9IHZvbHRbMTFdOyAvKiBndWVzcy4uICovCisJCXZpZHNoaWZ0ICA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCU5WX1dBUk4oZGV2LCAidm9sdGFnZSB0YWJsZSAweCUwMnggdW5rbm93blxuIiwgdm9sdFswXSk7CiAJCXJldHVybjsKQEAgLTE5NywxNiArMjA0LDM3IEBACiAJfQogCiAJLyogcGFyc2UgdmJpb3MgZW50cmllcyBpbnRvIGNvbW1vbiBmb3JtYXQgKi8KLQl2b2x0YWdlLT5sZXZlbCA9IGtjYWxsb2MoZW50cmllcywgc2l6ZW9mKCp2b2x0YWdlLT5sZXZlbCksIEdGUF9LRVJORUwpOwotCWlmICghdm9sdGFnZS0+bGV2ZWwpCi0JCXJldHVybjsKKwl2b2x0YWdlLT52ZXJzaW9uID0gdm9sdFswXTsKKwlpZiAodm9sdGFnZS0+dmVyc2lvbiA8IDB4NDApIHsKKwkJdm9sdGFnZS0+bnJfbGV2ZWwgPSBlbnRyaWVzOworCQl2b2x0YWdlLT5sZXZlbCA9CisJCQlrY2FsbG9jKGVudHJpZXMsIHNpemVvZigqdm9sdGFnZS0+bGV2ZWwpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2b2x0YWdlLT5sZXZlbCkKKwkJCXJldHVybjsKIAotCWVudHJ5ID0gdm9sdCArIGhlYWRlcmxlbjsKLQlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrLCBlbnRyeSArPSByZWNvcmRsZW4pIHsKLQkJdm9sdGFnZS0+bGV2ZWxbaV0udm9sdGFnZSA9IGVudHJ5WzBdOwotCQl2b2x0YWdlLT5sZXZlbFtpXS52aWQgICAgID0gZW50cnlbMV0gPj4gdmlkc2hpZnQ7CisJCWVudHJ5ID0gdm9sdCArIGhlYWRlcmxlbjsKKwkJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKywgZW50cnkgKz0gcmVjb3JkbGVuKSB7CisJCQl2b2x0YWdlLT5sZXZlbFtpXS52b2x0YWdlID0gZW50cnlbMF0gKiAxMDAwMDsKKwkJCXZvbHRhZ2UtPmxldmVsW2ldLnZpZCAgICAgPSBlbnRyeVsxXSA+PiB2aWRzaGlmdDsKKwkJfQorCX0gZWxzZSB7CisJCXUzMiB2b2x0X3V2ID0gUk9NMzIodm9sdFs0XSk7CisJCXMxNiBzdGVwX3V2ID0gUk9NMTYodm9sdFs4XSk7CisJCXU4IHZpZDsKKworCQl2b2x0YWdlLT5ucl9sZXZlbCA9IHZvbHRhZ2UtPnZpZF9tYXNrICsgMTsKKwkJdm9sdGFnZS0+bGV2ZWwgPSBrY2FsbG9jKHZvbHRhZ2UtPm5yX2xldmVsLAorCQkJCQkgc2l6ZW9mKCp2b2x0YWdlLT5sZXZlbCksIEdGUF9LRVJORUwpOworCQlpZiAoIXZvbHRhZ2UtPmxldmVsKQorCQkJcmV0dXJuOworCisJCWZvciAodmlkID0gMDsgdmlkIDw9IHZvbHRhZ2UtPnZpZF9tYXNrOyB2aWQrKykgeworCQkJdm9sdGFnZS0+bGV2ZWxbdmlkXS52b2x0YWdlID0gdm9sdF91djsKKwkJCXZvbHRhZ2UtPmxldmVsW3ZpZF0udmlkID0gdmlkOworCQkJdm9sdF91diArPSBzdGVwX3V2OworCQl9CiAJfQotCXZvbHRhZ2UtPm5yX2xldmVsICA9IGVudHJpZXM7CisKIAl2b2x0YWdlLT5zdXBwb3J0ZWQgPSB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCmluZGV4IDE3MTVlMTQuLjZiZDg1MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCkBAIC0xMjYsMjcgKzEyNiw2IEBACiAKIAlub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKGRldiwgMSk7CiAKLQlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOwotCWRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkoZGV2KTsKLQlkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5KGRldik7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmbm91dmVhdV9tb2RlX2NvbmZpZ19mdW5jczsKLQotCWRldi0+bW9kZV9jb25maWcubWluX3dpZHRoID0gMDsKLQlkZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOwotCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgewotCWNhc2UgTlZfMDQ6Ci0JCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMjA0ODsKLQkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMjA0ODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OwotCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA0MDk2OwotCQlicmVhazsKLQl9Ci0KLQlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBkZXZfcHJpdi0+ZmJfcGh5czsKLQogCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAwKTsKIAlpZiAobnZfdHdvX2hlYWRzKGRldikpCiAJCW52MDRfY3J0Y19jcmVhdGUoZGV2LCAxKTsKQEAgLTIzNSw4ICsyMTQsNiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKQogCQljcnRjLT5mdW5jcy0+cmVzdG9yZShjcnRjKTsKIAotCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7Ci0KIAlub3V2ZWF1X2h3X3NhdmVfdmdhX2ZvbnRzKGRldiwgMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfcG0uYwppbmRleCBlYjFjNzBkLi45YWU5MmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9wbS5jCkBAIC02OCw2ICs2OCw3IEBACiBudjA0X3BtX2Nsb2NrX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpwcmVfc3RhdGUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgKnB0aW1lciA9ICZkZXZfcHJpdi0+ZW5naW5lLnRpbWVyOwogCXN0cnVjdCBudjA0X3BtX3N0YXRlICpzdGF0ZSA9IHByZV9zdGF0ZTsKIAl1MzIgcmVnID0gc3RhdGUtPnBsbC5yZWc7CiAKQEAgLTg1LDYgKzg2LDkgQEAKIAkJbnZfbWFzayhkZXYsIDB4MTAwMmMwLCAwLCAxIDw8IDgpOwogCX0KIAorCWlmIChyZWcgPT0gTlZfUFJBTURBQ19OVlBMTF9DT0VGRikKKwkJcHRpbWVyLT5pbml0KGRldik7CisKIAlrZnJlZShzdGF0ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdGltZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfdGltZXIuYwppbmRleCAxZDA5ZGRkLi4yNjMzMDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X3RpbWVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF90aW1lci5jCkBAIC02LDQzICs2LDc1IEBACiBpbnQKIG52MDRfdGltZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIG0sIG4sIGQ7CisKIAludl93cjMyKGRldiwgTlYwNF9QVElNRVJfSU5UUl9FTl8wLCAweDAwMDAwMDAwKTsKIAludl93cjMyKGRldiwgTlYwNF9QVElNRVJfSU5UUl8wLCAweEZGRkZGRkZGKTsKIAotCS8qIEp1c3QgdXNlIHRoZSBwcmUtZXhpc3RpbmcgdmFsdWVzIHdoZW4gcG9zc2libGUgZm9yIG5vdzsgdGhlc2UgcmVncwotCSAqIGFyZSBub3Qgd3JpdHRlbiBpbiBudiAoZHJpdmVyIHdyaXRlciBtaXNzZWQgYSAvNCBvbiB0aGUgYWRkcmVzcyksIGFuZAotCSAqIHdyaXRpbmcgOCBhbmQgMyB0byB0aGUgY29ycmVjdCByZWdzIGJyZWFrcyB0aGUgdGltaW5ncyBvbiB0aGUgTFZEUwotCSAqIGhhcmR3YXJlIHNlcXVlbmNpbmcgbWljcm9jb2RlLgotCSAqIEEgY29ycmVjdCBzb2x1dGlvbiAoaW52b2x2aW5nIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSBHUFUgUExMKSBjYW4KLQkgKiBiZSBkb25lIHdoZW4ga2VybmVsIG1vZGVzZXR0aW5nIGxhbmRzCi0JICovCi0JaWYgKCFudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfTlVNRVJBVE9SKSB8fAotCQkJCSFudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IpKSB7Ci0JCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IsIDB4MDAwMDAwMDgpOwotCQludl93cjMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IsIDB4MDAwMDAwMDMpOworCS8qIGFpbSBmb3IgMzEuMjVNSHosIHdoaWNoIGdpdmVzIHVzIG5hbm9zZWNvbmQgdGltZXN0YW1wcyAqLworCWQgPSAxMDAwMDAwIC8gMzI7CisKKwkvKiBkZXRlcm1pbmUgYmFzZSBjbG9jayBmb3IgdGltZXIgc291cmNlICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHg0MCkgeworCQluID0gZGV2X3ByaXYtPmVuZ2luZS5wbS5jbG9ja19nZXQoZGV2LCBQTExfQ09SRSk7CisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NDApIHsKKwkJLypYWFg6IGZpZ3VyZSB0aGlzIG91dCAqLworCQluID0gMDsKKwl9IGVsc2UgeworCQluID0gZGV2X3ByaXYtPmNyeXN0YWw7CisJCW0gPSAxOworCQl3aGlsZSAobiA8IChkICogMikpIHsKKwkJCW4gKz0gKG4gLyBtKTsKKwkJCW0rKzsKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDAwOTIyMCwgbSAtIDEpOwogCX0KIAorCWlmICghbikgeworCQlOVl9XQVJOKGRldiwgIlBUSU1FUjogdW5rbm93biBpbnB1dCBjbG9jayBmcmVxXG4iKTsKKwkJaWYgKCFudl9yZDMyKGRldiwgTlYwNF9QVElNRVJfTlVNRVJBVE9SKSB8fAorCQkgICAgIW52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9ERU5PTUlOQVRPUikpIHsKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BUSU1FUl9OVU1FUkFUT1IsIDEpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUFRJTUVSX0RFTk9NSU5BVE9SLCAxKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByZWR1Y2UgcmF0aW8gdG8gYWNjZXB0YWJsZSB2YWx1ZXMgKi8KKwl3aGlsZSAoKChuICUgNSkgPT0gMCkgJiYgKChkICUgNSkgPT0gMCkpIHsKKwkJbiAvPSA1OworCQlkIC89IDU7CisJfQorCisJd2hpbGUgKCgobiAlIDIpID09IDApICYmICgoZCAlIDIpID09IDApKSB7CisJCW4gLz0gMjsKKwkJZCAvPSAyOworCX0KKworCXdoaWxlIChuID4gMHhmZmZmIHx8IGQgPiAweGZmZmYpIHsKKwkJbiA+Pj0gMTsKKwkJZCA+Pj0gMTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwNF9QVElNRVJfTlVNRVJBVE9SLCBuKTsKKwludl93cjMyKGRldiwgTlYwNF9QVElNRVJfREVOT01JTkFUT1IsIGQpOwogCXJldHVybiAwOwogfQogCi11aW50NjRfdAordTY0CiBudjA0X3RpbWVyX3JlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQl1aW50MzJfdCBsb3c7Ci0JLyogRnJvbSBrbW1pbyBkdW1wcyBvbiBudjI4IHRoaXMgbG9va3MgbGlrZSBob3cgdGhlIGJsb2IgZG9lcyB0aGlzLgotCSAqIEl0IHJlYWRzIHRoZSBoaWdoIGR3b3JkIHR3aWNlLCBiZWZvcmUgYW5kIGFmdGVyLgotCSAqIFRoZSBvbmx5IGV4cGxhbmF0aW9uIHNlZW1zIHRvIGJlIHRoYXQgdGhlIDY0LWJpdCB0aW1lciBjb3VudGVyCi0JICogYWR2YW5jZXMgYmV0d2VlbiBoaWdoIGFuZCBsb3cgZHdvcmQgcmVhZHMgYW5kIG1heSBjb3JydXB0IHRoZQotCSAqIHJlc3VsdC4gTm90IGNvbmZpcm1lZC4KLQkgKi8KLQl1aW50MzJfdCBoaWdoMiA9IG52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9USU1FXzEpOwotCXVpbnQzMl90IGhpZ2gxOworCXUzMiBoaSwgbG87CisKIAlkbyB7Ci0JCWhpZ2gxID0gaGlnaDI7Ci0JCWxvdyA9IG52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9USU1FXzApOwotCQloaWdoMiA9IG52X3JkMzIoZGV2LCBOVjA0X1BUSU1FUl9USU1FXzEpOwotCX0gd2hpbGUgKGhpZ2gxICE9IGhpZ2gyKTsKLQlyZXR1cm4gKCgodWludDY0X3QpaGlnaDIpIDw8IDMyKSB8ICh1aW50NjRfdClsb3c7CisJCWhpID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMSk7CisJCWxvID0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMCk7CisJfSB3aGlsZSAoaGkgIT0gbnZfcmQzMihkZXYsIE5WMDRfUFRJTUVSX1RJTUVfMSkpOworCisJcmV0dXJuICgodTY0KWhpIDw8IDMyIHwgbG8pOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMxX21wZWcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzFfbXBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDZhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMxX21wZWcuYwpAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgorCitzdHJ1Y3QgbnYzMV9tcGVnX2VuZ2luZSB7CisJc3RydWN0IG5vdXZlYXVfZXhlY19lbmdpbmUgYmFzZTsKKwlhdG9taWNfdCByZWZjb3VudDsKK307CisKKworc3RhdGljIGludAorbnYzMV9tcGVnX2NvbnRleHRfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUpCit7CisJc3RydWN0IG52MzFfbXBlZ19lbmdpbmUgKnBtcGVnID0gbnZfZW5naW5lKGNoYW4tPmRldiwgZW5naW5lKTsKKworCWlmICghYXRvbWljX2FkZF91bmxlc3MoJnBtcGVnLT5yZWZjb3VudCwgMSwgMSkpCisJCXJldHVybiAtRUJVU1k7CisKKwljaGFuLT5lbmdjdHhbZW5naW5lXSA9ICh2b2lkICopMHhkZWFkY2FmZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252MzFfbXBlZ19jb250ZXh0X2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBudjMxX21wZWdfZW5naW5lICpwbXBlZyA9IG52X2VuZ2luZShjaGFuLT5kZXYsIGVuZ2luZSk7CisJYXRvbWljX2RlYygmcG1wZWctPnJlZmNvdW50KTsKKwljaGFuLT5lbmdjdHhbZW5naW5lXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK252NDBfbXBlZ19jb250ZXh0X25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMjY0ICogNCwgMTYsIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CisJCQkJIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmY3R4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbnZfd28zMihjdHgsIDB4NzgsIDB4MDIwMDFlYzEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJbnZfbWFzayhkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwlpZiAoKG52X3JkMzIoZGV2LCAweDAwMzIwNCkgJiAweDFmKSA9PSBjaGFuLT5pZCkKKwkJbnZfd3IzMihkZXYsIDB4MDAzMzBjLCBjdHgtPnBpbnN0ID4+IDQpOworCW52X3dvMzIoY2hhbi0+cmFtZmMsIDB4NTQsIGN0eC0+cGluc3QgPj4gNCk7CisJbnZfbWFzayhkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJY2hhbi0+ZW5nY3R4W2VuZ2luZV0gPSBjdHg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX21wZWdfY29udGV4dF9kZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4ID0gY2hhbi0+ZW5nY3R4W2VuZ2luZV07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnN0ID0gMHg4MDAwMDAwMCB8IChjdHgtPnBpbnN0ID4+IDQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwlpZiAobnZfcmQzMihkZXYsIDB4MDBiMzE4KSA9PSBpbnN0KQorCQludl9tYXNrKGRldiwgMHgwMGIzMTgsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDAwYjMyYywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY3R4KTsKKwljaGFuLT5lbmdjdHhbZW5naW5lXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK252MzFfbXBlZ19vYmplY3RfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUsCisJCSAgICAgIHUzMiBoYW5kbGUsIHUxNiBjbGFzcykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwgMjAsIDE2LCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJm9iaik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlvYmotPmVuZ2luZSA9IDI7CisJb2JqLT5jbGFzcyAgPSBjbGFzczsKKworCW52X3dvMzIob2JqLCAweDAwLCBjbGFzcyk7CisKKwlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChjaGFuLCBoYW5kbGUsIG9iaik7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZvYmopOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK252MzFfbXBlZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnYzMV9tcGVnX2VuZ2luZSAqcG1wZWcgPSBudl9lbmdpbmUoZGV2LCBlbmdpbmUpOworCWludCBpOworCisJLyogVlBFIGluaXQgKi8KKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4MDBiMGUwLCAweDAwMDAwMDIwKTsgLyogbnZpZGlhOiByZCAweDAxLCB3ciAweDIwICovCisJbnZfd3IzMihkZXYsIDB4MDBiMGU4LCAweDAwMDAwMDIwKTsgLyogbnZpZGlhOiByZCAweDAxLCB3ciAweDIwICovCisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5mYi5udW1fdGlsZXM7IGkrKykKKwkJcG1wZWctPmJhc2Uuc2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CisKKwkvKiBQTVBFRyBpbml0ICovCisJbnZfd3IzMihkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMGIzMTQsIDB4MDAwMDAxMDApOworCW52X3dyMzIoZGV2LCAweDAwYjIyMCwgbnY0NF9ncmFwaF9jbGFzcyhkZXYpID8gMHgwMDAwMDA0NCA6IDB4MDAwMDAwMzEpOworCW52X3dyMzIoZGV2LCAweDAwYjMwMCwgMHgwMjAwMWVjMSk7CisJbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKworCW52X3dyMzIoZGV2LCAweDAwYjEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDBiMTQwLCAweGZmZmZmZmZmKTsKKworCWlmICghbnZfd2FpdChkZXYsIDB4MDBiMjAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJQTVBFRyBpbml0OiAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDAwYjIwMCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjMxX21wZWdfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lLCBib29sIHN1c3BlbmQpCit7CisJLypYWFg6IGNvbnRleHQgc2F2ZT8gKi8KKwludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwYjE0MCwgMHgwMDAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MzFfbXBlZ19tdGhkX2RtYShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXUzMiBpbnN0ID0gZGF0YSA8PCA0OworCXUzMiBkbWEwID0gbnZfcmkzMihkZXYsIGluc3QgKyAwKTsKKwl1MzIgZG1hMSA9IG52X3JpMzIoZGV2LCBpbnN0ICsgNCk7CisJdTMyIGRtYTIgPSBudl9yaTMyKGRldiwgaW5zdCArIDgpOworCXUzMiBiYXNlID0gKGRtYTIgJiAweGZmZmZmMDAwKSB8IChkbWEwID4+IDIwKTsKKwl1MzIgc2l6ZSA9IGRtYTEgKyAxOworCisJLyogb25seSBhbGxvdyBsaW5lYXIgRE1BIG9iamVjdHMgKi8KKwlpZiAoIShkbWEwICYgMHgwMDAwMjAwMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG10aGQgPT0gMHgwMTkwKSB7CisJCS8qIERNQV9DTUQgKi8KKwkJbnZfbWFzayhkZXYsIDB4MDBiMzAwLCAweDAwMDMwMDAwLCAoZG1hMCAmIDB4MDAwMzAwMDApKTsKKwkJbnZfd3IzMihkZXYsIDB4MDBiMzM0LCBiYXNlKTsKKwkJbnZfd3IzMihkZXYsIDB4MDBiMzI0LCBzaXplKTsKKwl9IGVsc2UKKwlpZiAobXRoZCA9PSAweDAxYTApIHsKKwkJLyogRE1BX0RBVEEgKi8KKwkJbnZfbWFzayhkZXYsIDB4MDBiMzAwLCAweDAwMGMwMDAwLCAoZG1hMCAmIDB4MDAwMzAwMDApIDw8IDIpOworCQludl93cjMyKGRldiwgMHgwMGIzNjAsIGJhc2UpOworCQludl93cjMyKGRldiwgMHgwMGIzNjQsIHNpemUpOworCX0gZWxzZSB7CisJCS8qIERNQV9JTUFHRSwgVlJBTSBvbmx5ICovCisJCWlmIChkbWEwICYgMHgwMDBjMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW52X3dyMzIoZGV2LCAweDAwYjM3MCwgYmFzZSk7CisJCW52X3dyMzIoZGV2LCAweDAwYjM3NCwgc2l6ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252MzFfbXBlZ19pc3JfY2hpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgaW5zdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBoYXJkY29kZSBkcm0gY2hhbm5lbCBpZCBvbiBudjN4LCBzbyBzd210aGQgbG9va3VwIHdvcmtzICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl80MCkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJaWYgKCFkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldKQorCQkJY29udGludWU7CisKKwkJY3R4ID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXS0+ZW5nY3R4W05WT0JKX0VOR0lORV9NUEVHXTsKKwkJaWYgKGN0eCAmJiBjdHgtPnBpbnN0ID09IGluc3QpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQKK252MzFfdnBlX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKKworCW52X3dyMzIoZGV2LCAweDAwYjAwOCArIChpICogMHgxMCksIHRpbGUtPnBpdGNoKTsKKwludl93cjMyKGRldiwgMHgwMGIwMDQgKyAoaSAqIDB4MTApLCB0aWxlLT5saW1pdCk7CisJbnZfd3IzMihkZXYsIDB4MDBiMDAwICsgKGkgKiAweDEwKSwgdGlsZS0+YWRkcik7Cit9CisKK3N0YXRpYyB2b2lkCitudjMxX21wZWdfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIGluc3QgPSAobnZfcmQzMihkZXYsIDB4MDBiMzE4KSAmIDB4MDAwZmZmZmYpIDw8IDQ7CisJdTMyIGNoaWQgPSBudjMxX21wZWdfaXNyX2NoaWQoZGV2LCBpbnN0KTsKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDAwYjEwMCk7CisJdTMyIHR5cGUgPSBudl9yZDMyKGRldiwgMHgwMGIyMzApOworCXUzMiBtdGhkID0gbnZfcmQzMihkZXYsIDB4MDBiMjM0KTsKKwl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCAweDAwYjIzOCk7CisJdTMyIHNob3cgPSBzdGF0OworCisJaWYgKHN0YXQgJiAweDAxMDAwMDAwKSB7CisJCS8qIGhhcHBlbnMgb24gaW5pdGlhbCBiaW5kaW5nIG9mIHRoZSBvYmplY3QgKi8KKwkJaWYgKHR5cGUgPT0gMHgwMDAwMDAyMCAmJiBtdGhkID09IDB4MDAwMCkgeworCQkJbnZfbWFzayhkZXYsIDB4MDBiMzA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwkJCXNob3cgJj0gfjB4MDEwMDAwMDA7CisJCX0KKworCQlpZiAodHlwZSA9PSAweDAwMDAwMDEwKSB7CisJCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoZGV2LCBjaGlkLCAweDMxNzQsIG10aGQsIGRhdGEpKQorCQkJCXNob3cgJj0gfjB4MDEwMDAwMDA7CisJCX0KKwl9CisKKwludl93cjMyKGRldiwgMHgwMGIxMDAsIHN0YXQpOworCW52X3dyMzIoZGV2LCAweDAwYjIzMCwgMHgwMDAwMDAwMSk7CisKKwlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7CisJCU5WX0lORk8oZGV2LCAiUE1QRUc6IENoICVkIFsweCUwOHhdIDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKwkJCWNoaWQsIGluc3QsIHN0YXQsIHR5cGUsIG10aGQsIGRhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQKK252MzFfdnBlX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWlmIChudl9yZDMyKGRldiwgMHgwMGIxMDApKQorCQludjMxX21wZWdfaXNyKGRldik7CisKKwlpZiAobnZfcmQzMihkZXYsIDB4MDBiODAwKSkgeworCQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDAwYjgwMCk7CisJCU5WX0lORk8oZGV2LCAiUE1TUkNIOiAweCUwOHhcbiIsIHN0YXQpOworCQludl93cjMyKGRldiwgMHhiODAwLCBzdGF0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudjMxX21wZWdfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBudjMxX21wZWdfZW5naW5lICpwbXBlZyA9IG52X2VuZ2luZShkZXYsIGVuZ2luZSk7CisKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMCk7CisKKwlOVk9CSl9FTkdJTkVfREVMKGRldiwgTVBFRyk7CisJa2ZyZWUocG1wZWcpOworfQorCitpbnQKK252MzFfbXBlZ19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjMxX21wZWdfZW5naW5lICpwbXBlZzsKKworCXBtcGVnID0ga3phbGxvYyhzaXplb2YoKnBtcGVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbXBlZykKKwkJcmV0dXJuIC1FTk9NRU07CisJYXRvbWljX3NldCgmcG1wZWctPnJlZmNvdW50LCAwKTsKKworCXBtcGVnLT5iYXNlLmRlc3Ryb3kgPSBudjMxX21wZWdfZGVzdHJveTsKKwlwbXBlZy0+YmFzZS5pbml0ID0gbnYzMV9tcGVnX2luaXQ7CisJcG1wZWctPmJhc2UuZmluaSA9IG52MzFfbXBlZ19maW5pOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKKwkJcG1wZWctPmJhc2UuY29udGV4dF9uZXcgPSBudjMxX21wZWdfY29udGV4dF9uZXc7CisJCXBtcGVnLT5iYXNlLmNvbnRleHRfZGVsID0gbnYzMV9tcGVnX2NvbnRleHRfZGVsOworCX0gZWxzZSB7CisJCXBtcGVnLT5iYXNlLmNvbnRleHRfbmV3ID0gbnY0MF9tcGVnX2NvbnRleHRfbmV3OworCQlwbXBlZy0+YmFzZS5jb250ZXh0X2RlbCA9IG52NDBfbXBlZ19jb250ZXh0X2RlbDsKKwl9CisJcG1wZWctPmJhc2Uub2JqZWN0X25ldyA9IG52MzFfbXBlZ19vYmplY3RfbmV3OworCisJLyogSVNSIHZlY3RvciwgUE1DX0VOQUJMRSBiaXQsICBhbmQgVElMRSByZWdzIGFyZSBzaGFyZWQgYmV0d2VlbgorCSAqIGFsbCBWUEUgZW5naW5lcywgZm9yIHRoaXMgZHJpdmVyJ3MgcHVycG9zZXMgdGhlIFBNUEVHIGVuZ2luZQorCSAqIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgIm1hc3RlciIgYW5kIGhhbmRsZSB0aGUgZ2xvYmFsIFZQRQorCSAqIGJpdHMgdG9vCisJICovCisJcG1wZWctPmJhc2Uuc2V0X3RpbGVfcmVnaW9uID0gbnYzMV92cGVfc2V0X3RpbGVfcmVnaW9uOworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMCwgbnYzMV92cGVfaXNyKTsKKworCU5WT0JKX0VOR0lORV9BREQoZGV2LCBNUEVHLCAmcG1wZWctPmJhc2UpOworCU5WT0JKX0NMQVNTKGRldiwgMHgzMTc0LCBNUEVHKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MzE3NCwgMHgwMTkwLCBudjMxX21wZWdfbXRoZF9kbWEpOworCU5WT0JKX01USEQgKGRldiwgMHgzMTc0LCAweDAxYTAsIG52MzFfbXBlZ19tdGhkX2RtYSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDMxNzQsIDB4MDFiMCwgbnYzMV9tcGVnX210aGRfZG1hKTsKKworI2lmIDAKKwlOVk9CSl9FTkdJTkVfQUREKGRldiwgTUUsICZwbWUtPmJhc2UpOworCU5WT0JKX0NMQVNTKGRldiwgMHg0MDc1LCBNRSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9tcGVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21wZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwM2EwZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX21wZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEgUmVkIEhhdCBJbmMuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczogQmVuIFNrZWdncwotICovCi0KLSNpbmNsdWRlICJkcm1QLmgiCi0jaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKLSNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCi0KLXN0cnVjdCBudjQwX21wZWdfZW5naW5lIHsKLQlzdHJ1Y3Qgbm91dmVhdV9leGVjX2VuZ2luZSBiYXNlOwotfTsKLQotc3RhdGljIGludAotbnY0MF9tcGVnX2NvbnRleHRfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBlbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqY3R4ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAyNjQgKiA0LCAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZjdHgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQludl93bzMyKGN0eCwgMHg3OCwgMHgwMjAwMWVjMSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCWlmICgobnZfcmQzMihkZXYsIDB4MDAzMjA0KSAmIDB4MWYpID09IGNoYW4tPmlkKQotCQludl93cjMyKGRldiwgMHgwMDMzMGMsIGN0eC0+cGluc3QgPj4gNCk7Ci0JbnZfd28zMihjaGFuLT5yYW1mYywgMHg1NCwgY3R4LT5waW5zdCA+PiA0KTsKLQludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7Ci0KLQljaGFuLT5lbmdjdHhbZW5naW5lXSA9IGN0eDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLW52NDBfbXBlZ19jb250ZXh0X2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZW5naW5lKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHggPSBjaGFuLT5lbmdjdHhbZW5naW5lXTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGluc3QgPSAweDgwMDAwMDAwIHwgKGN0eC0+cGluc3QgPj4gNCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQludl9tYXNrKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCWlmIChudl9yZDMyKGRldiwgMHgwMGIzMTgpID09IGluc3QpCi0JCW52X21hc2soZGV2LCAweDAwYjMxOCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7Ci0JbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCi0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjdHgpOwotCWNoYW4tPmVuZ2N0eFtlbmdpbmVdID0gTlVMTDsKLX0KLQotc3RhdGljIGludAotbnY0MF9tcGVnX29iamVjdF9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGVuZ2luZSwKLQkJICAgICAgdTMyIGhhbmRsZSwgdTE2IGNsYXNzKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAyMCwgMTYsIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8Ci0JCQkJIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCW9iai0+ZW5naW5lID0gMjsKLQlvYmotPmNsYXNzICA9IGNsYXNzOwotCi0JbnZfd28zMihvYmosIDB4MDAsIGNsYXNzKTsKLQotCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGNoYW4sIGhhbmRsZSwgb2JqKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJm9iaik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotbnY0MF9tcGVnX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjQwX21wZWdfZW5naW5lICpwbXBlZyA9IG52X2VuZ2luZShkZXYsIGVuZ2luZSk7Ci0JaW50IGk7Ci0KLQkvKiBWUEUgaW5pdCAqLwotCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCk7Ci0JbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyKTsKLQludl93cjMyKGRldiwgMHgwMGIwZTAsIDB4MDAwMDAwMjApOyAvKiBudmlkaWE6IHJkIDB4MDEsIHdyIDB4MjAgKi8KLQludl93cjMyKGRldiwgMHgwMGIwZTgsIDB4MDAwMDAwMjApOyAvKiBudmlkaWE6IHJkIDB4MDEsIHdyIDB4MjAgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZiLm51bV90aWxlczsgaSsrKQotCQlwbXBlZy0+YmFzZS5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKLQotCS8qIFBNUEVHIGluaXQgKi8KLQludl93cjMyKGRldiwgMHgwMGIzMmMsIDB4MDAwMDAwMDApOwotCW52X3dyMzIoZGV2LCAweDAwYjMxNCwgMHgwMDAwMDEwMCk7Ci0JbnZfd3IzMihkZXYsIDB4MDBiMjIwLCAweDAwMDAwMDQ0KTsKLQludl93cjMyKGRldiwgMHgwMGIzMDAsIDB4MDIwMDFlYzEpOwotCW52X21hc2soZGV2LCAweDAwYjMyYywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7Ci0KLQludl93cjMyKGRldiwgMHgwMGIxMDAsIDB4ZmZmZmZmZmYpOwotCW52X3dyMzIoZGV2LCAweDAwYjE0MCwgMHhmZmZmZmZmZik7Ci0KLQlpZiAoIW52X3dhaXQoZGV2LCAweDAwYjIwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAiUE1QRUcgaW5pdDogMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgwMGIyMDApKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnY0MF9tcGVnX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSwgYm9vbCBzdXNwZW5kKQotewotCS8qWFhYOiBjb250ZXh0IHNhdmU/ICovCi0JbnZfbWFzayhkZXYsIDB4MDBiMzJjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKLQludl93cjMyKGRldiwgMHgwMGIxNDAsIDB4MDAwMDAwMDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfbXRoZF9kbWEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQl1MzIgaW5zdCA9IGRhdGEgPDwgNDsKLQl1MzIgZG1hMCA9IG52X3JpMzIoZGV2LCBpbnN0ICsgMCk7Ci0JdTMyIGRtYTEgPSBudl9yaTMyKGRldiwgaW5zdCArIDQpOwotCXUzMiBkbWEyID0gbnZfcmkzMihkZXYsIGluc3QgKyA4KTsKLQl1MzIgYmFzZSA9IChkbWEyICYgMHhmZmZmZjAwMCkgfCAoZG1hMCA+PiAyMCk7Ci0JdTMyIHNpemUgPSBkbWExICsgMTsKLQotCS8qIG9ubHkgYWxsb3cgbGluZWFyIERNQSBvYmplY3RzICovCi0JaWYgKCEoZG1hMCAmIDB4MDAwMDIwMDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChtdGhkID09IDB4MDE5MCkgewotCQkvKiBETUFfQ01EICovCi0JCW52X21hc2soZGV2LCAweDAwYjMwMCwgMHgwMDAzMDAwMCwgKGRtYTAgJiAweDAwMDMwMDAwKSk7Ci0JCW52X3dyMzIoZGV2LCAweDAwYjMzNCwgYmFzZSk7Ci0JCW52X3dyMzIoZGV2LCAweDAwYjMyNCwgc2l6ZSk7Ci0JfSBlbHNlCi0JaWYgKG10aGQgPT0gMHgwMWEwKSB7Ci0JCS8qIERNQV9EQVRBICovCi0JCW52X21hc2soZGV2LCAweDAwYjMwMCwgMHgwMDBjMDAwMCwgKGRtYTAgJiAweDAwMDMwMDAwKSA8PCAyKTsKLQkJbnZfd3IzMihkZXYsIDB4MDBiMzYwLCBiYXNlKTsKLQkJbnZfd3IzMihkZXYsIDB4MDBiMzY0LCBzaXplKTsKLQl9IGVsc2UgewotCQkvKiBETUFfSU1BR0UsIFZSQU0gb25seSAqLwotCQlpZiAoZG1hMCAmIDB4MDAwYzAwMDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQludl93cjMyKGRldiwgMHgwMGIzNzAsIGJhc2UpOwotCQludl93cjMyKGRldiwgMHgwMGIzNzQsIHNpemUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjQwX21wZWdfaXNyX2NoaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGluc3QpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCWlmICghZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXSkKLQkJCWNvbnRpbnVlOwotCi0JCWN0eCA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0tPmVuZ2N0eFtOVk9CSl9FTkdJTkVfTVBFR107Ci0JCWlmIChjdHggJiYgY3R4LT5waW5zdCA9PSBpbnN0KQotCQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjQwX3ZwZV9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07Ci0KLQludl93cjMyKGRldiwgMHgwMGIwMDggKyAoaSAqIDB4MTApLCB0aWxlLT5waXRjaCk7Ci0JbnZfd3IzMihkZXYsIDB4MDBiMDA0ICsgKGkgKiAweDEwKSwgdGlsZS0+bGltaXQpOwotCW52X3dyMzIoZGV2LCAweDAwYjAwMCArIChpICogMHgxMCksIHRpbGUtPmFkZHIpOwotfQotCi1zdGF0aWMgdm9pZAotbnY0MF9tcGVnX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXUzMiBpbnN0ID0gKG52X3JkMzIoZGV2LCAweDAwYjMxOCkgJiAweDAwMGZmZmZmKSA8PCA0OwotCXUzMiBjaGlkID0gbnY0MF9tcGVnX2lzcl9jaGlkKGRldiwgaW5zdCk7Ci0JdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHgwMGIxMDApOwotCXUzMiB0eXBlID0gbnZfcmQzMihkZXYsIDB4MDBiMjMwKTsKLQl1MzIgbXRoZCA9IG52X3JkMzIoZGV2LCAweDAwYjIzNCk7Ci0JdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgMHgwMGIyMzgpOwotCXUzMiBzaG93ID0gc3RhdDsKLQotCWlmIChzdGF0ICYgMHgwMTAwMDAwMCkgewotCQkvKiBoYXBwZW5zIG9uIGluaXRpYWwgYmluZGluZyBvZiB0aGUgb2JqZWN0ICovCi0JCWlmICh0eXBlID09IDB4MDAwMDAwMjAgJiYgbXRoZCA9PSAweDAwMDApIHsKLQkJCW52X21hc2soZGV2LCAweDAwYjMwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7Ci0JCQlzaG93ICY9IH4weDAxMDAwMDAwOwotCQl9Ci0KLQkJaWYgKHR5cGUgPT0gMHgwMDAwMDAxMCkgewotCQkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwyKGRldiwgY2hpZCwgMHgzMTc0LCBtdGhkLCBkYXRhKSkKLQkJCQlzaG93ICY9IH4weDAxMDAwMDAwOwotCQl9Ci0JfQotCi0JbnZfd3IzMihkZXYsIDB4MDBiMTAwLCBzdGF0KTsKLQludl93cjMyKGRldiwgMHgwMGIyMzAsIDB4MDAwMDAwMDEpOwotCi0JaWYgKHNob3cgJiYgbm91dmVhdV9yYXRlbGltaXQoKSkgewotCQlOVl9JTkZPKGRldiwgIlBNUEVHOiBDaCAlZCBbMHglMDh4XSAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCi0JCQljaGlkLCBpbnN0LCBzdGF0LCB0eXBlLCBtdGhkLCBkYXRhKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1udjQwX3ZwZV9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlpZiAobnZfcmQzMihkZXYsIDB4MDBiMTAwKSkKLQkJbnY0MF9tcGVnX2lzcihkZXYpOwotCi0JaWYgKG52X3JkMzIoZGV2LCAweDAwYjgwMCkpIHsKLQkJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHgwMGI4MDApOwotCQlOVl9JTkZPKGRldiwgIlBNU1JDSDogMHglMDh4XG4iLCBzdGF0KTsKLQkJbnZfd3IzMihkZXYsIDB4YjgwMCwgc3RhdCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotbnY0MF9tcGVnX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKLXsKLQlzdHJ1Y3QgbnY0MF9tcGVnX2VuZ2luZSAqcG1wZWcgPSBudl9lbmdpbmUoZGV2LCBlbmdpbmUpOwotCi0Jbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDApOwotCi0JTlZPQkpfRU5HSU5FX0RFTChkZXYsIE1QRUcpOwotCWtmcmVlKHBtcGVnKTsKLX0KLQotaW50Ci1udjQwX21wZWdfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG52NDBfbXBlZ19lbmdpbmUgKnBtcGVnOwotCi0JcG1wZWcgPSBremFsbG9jKHNpemVvZigqcG1wZWcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtcGVnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBtcGVnLT5iYXNlLmRlc3Ryb3kgPSBudjQwX21wZWdfZGVzdHJveTsKLQlwbXBlZy0+YmFzZS5pbml0ID0gbnY0MF9tcGVnX2luaXQ7Ci0JcG1wZWctPmJhc2UuZmluaSA9IG52NDBfbXBlZ19maW5pOwotCXBtcGVnLT5iYXNlLmNvbnRleHRfbmV3ID0gbnY0MF9tcGVnX2NvbnRleHRfbmV3OwotCXBtcGVnLT5iYXNlLmNvbnRleHRfZGVsID0gbnY0MF9tcGVnX2NvbnRleHRfZGVsOwotCXBtcGVnLT5iYXNlLm9iamVjdF9uZXcgPSBudjQwX21wZWdfb2JqZWN0X25ldzsKLQotCS8qIElTUiB2ZWN0b3IsIFBNQ19FTkFCTEUgYml0LCAgYW5kIFRJTEUgcmVncyBhcmUgc2hhcmVkIGJldHdlZW4KLQkgKiBhbGwgVlBFIGVuZ2luZXMsIGZvciB0aGlzIGRyaXZlcidzIHB1cnBvc2VzIHRoZSBQTVBFRyBlbmdpbmUKLQkgKiB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlICJtYXN0ZXIiIGFuZCBoYW5kbGUgdGhlIGdsb2JhbCBWUEUKLQkgKiBiaXRzIHRvbwotCSAqLwotCXBtcGVnLT5iYXNlLnNldF90aWxlX3JlZ2lvbiA9IG52NDBfdnBlX3NldF90aWxlX3JlZ2lvbjsKLQlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDAsIG52NDBfdnBlX2lzcik7Ci0KLQlOVk9CSl9FTkdJTkVfQUREKGRldiwgTVBFRywgJnBtcGVnLT5iYXNlKTsKLQlOVk9CSl9DTEFTUyhkZXYsIDB4MzE3NCwgTVBFRyk7Ci0JTlZPQkpfTVRIRCAoZGV2LCAweDMxNzQsIDB4MDE5MCwgbnY0MF9tcGVnX210aGRfZG1hKTsKLQlOVk9CSl9NVEhEIChkZXYsIDB4MzE3NCwgMHgwMWEwLCBudjQwX21wZWdfbXRoZF9kbWEpOwotCU5WT0JKX01USEQgKGRldiwgMHgzMTc0LCAweDAxYjAsIG52NDBfbXBlZ19tdGhkX2RtYSk7Ci0KLSNpZiAwCi0JTlZPQkpfRU5HSU5FX0FERChkZXYsIE1FLCAmcG1lLT5iYXNlKTsKLQlOVk9CSl9DTEFTUyhkZXYsIDB4NDA3NSwgTUUpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc2YjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9wbS5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Jpb3MuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3BtLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorCisjZGVmaW5lIG1pbjIoYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCitzdGF0aWMgdTMyCityZWFkX3BsbF8xKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiByZWcpCit7CisJdTMyIGN0cmwgPSBudl9yZDMyKGRldiwgcmVnICsgMHgwMCk7CisJaW50IFAgPSAoY3RybCAmIDB4MDAwNzAwMDApID4+IDE2OworCWludCBOID0gKGN0cmwgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCBNID0gKGN0cmwgJiAweDAwMDAwMGZmKSA+PiAwOworCXUzMiByZWYgPSAyNzAwMCwgY2xrID0gMDsKKworCWlmIChjdHJsICYgMHg4MDAwMDAwMCkKKwkJY2xrID0gcmVmICogTiAvIE07CisKKwlyZXR1cm4gY2xrID4+IFA7Cit9CisKK3N0YXRpYyB1MzIKK3JlYWRfcGxsXzIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHJlZykKK3sKKwl1MzIgY3RybCA9IG52X3JkMzIoZGV2LCByZWcgKyAweDAwKTsKKwl1MzIgY29lZiA9IG52X3JkMzIoZGV2LCByZWcgKyAweDA0KTsKKwlpbnQgTjIgPSAoY29lZiAmIDB4ZmYwMDAwMDApID4+IDI0OworCWludCBNMiA9IChjb2VmICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJaW50IE4xID0gKGNvZWYgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCBNMSA9IChjb2VmICYgMHgwMDAwMDBmZikgPj4gMDsKKwlpbnQgUCA9IChjdHJsICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJdTMyIHJlZiA9IDI3MDAwLCBjbGsgPSAwOworCisJaWYgKChjdHJsICYgMHg4MDAwMDAwMCkgJiYgTTEpIHsKKwkJY2xrID0gcmVmICogTjEgLyBNMTsKKwkJaWYgKChjdHJsICYgMHg0MDAwMDEwMCkgPT0gMHg0MDAwMDAwMCkgeworCQkJaWYgKE0yKQorCQkJCWNsayA9IGNsayAqIE4yIC8gTTI7CisJCQllbHNlCisJCQkJY2xrID0gMDsKKwkJfQorCX0KKworCXJldHVybiBjbGsgPj4gUDsKK30KKworc3RhdGljIHUzMgorcmVhZF9jbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNyYykKK3sKKwlzd2l0Y2ggKHNyYykgeworCWNhc2UgMzoKKwkJcmV0dXJuIHJlYWRfcGxsXzIoZGV2LCAweDAwNDAwMCk7CisJY2FzZSAyOgorCQlyZXR1cm4gcmVhZF9wbGxfMShkZXYsIDB4MDA0MDA4KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitudjQwX3BtX2Nsb2Nrc19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwpCit7CisJdTMyIGN0cmwgPSBudl9yZDMyKGRldiwgMHgwMGMwNDApOworCisJcGVyZmx2bC0+Y29yZSAgID0gcmVhZF9jbGsoZGV2LCAoY3RybCAmIDB4MDAwMDAwMDMpID4+IDApOworCXBlcmZsdmwtPnNoYWRlciA9IHJlYWRfY2xrKGRldiwgKGN0cmwgJiAweDAwMDAwMDMwKSA+PiA0KTsKKwlwZXJmbHZsLT5tZW1vcnkgPSByZWFkX3BsbF8yKGRldiwgMHg0MDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG52NDBfcG1fc3RhdGUgeworCXUzMiBjdHJsOworCXUzMiBucGxsX2N0cmw7CisJdTMyIG5wbGxfY29lZjsKKwl1MzIgc3BsbDsKKwl1MzIgbXBsbF9jdHJsOworCXUzMiBtcGxsX2NvZWY7Cit9OworCitzdGF0aWMgaW50CitudjQwX2NhbGNfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiByZWcsIHN0cnVjdCBwbGxfbGltcyAqcGxsLAorCSAgICAgIHUzMiBjbGssIGludCAqTjEsIGludCAqTTEsIGludCAqTjIsIGludCAqTTIsIGludCAqbG9nMlApCit7CisJc3RydWN0IG5vdXZlYXVfcGxsX3ZhbHMgY29lZjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCByZWcsIHBsbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbGsgPCBwbGwtPnZjbzEubWF4ZnJlcSkKKwkJcGxsLT52Y28yLm1heGZyZXEgPSAwOworCisJcmV0ID0gbm91dmVhdV9jYWxjX3BsbF9tbnAoZGV2LCBwbGwsIGNsaywgJmNvZWYpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkqTjEgPSBjb2VmLk4xOworCSpNMSA9IGNvZWYuTTE7CisJaWYgKE4yICYmIE0yKSB7CisJCWlmIChwbGwtPnZjbzIubWF4ZnJlcSkgeworCQkJKk4yID0gY29lZi5OMjsKKwkJCSpNMiA9IGNvZWYuTTI7CisJCX0gZWxzZSB7CisJCQkqTjIgPSAxOworCQkJKk0yID0gMTsKKwkJfQorCX0KKwkqbG9nMlAgPSBjb2VmLmxvZzJQOworCXJldHVybiAwOworfQorCit2b2lkICoKK252NDBfcG1fY2xvY2tzX3ByZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCkKK3sKKwlzdHJ1Y3QgbnY0MF9wbV9zdGF0ZSAqaW5mbzsKKwlzdHJ1Y3QgcGxsX2xpbXMgcGxsOworCWludCBOMSwgTjIsIE0xLCBNMiwgbG9nMlA7CisJaW50IHJldDsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKiBjb3JlL2dlb21ldHJpYyBjbG9jayAqLworCXJldCA9IG52NDBfY2FsY19wbGwoZGV2LCAweDAwNDAwMCwgJnBsbCwgcGVyZmx2bC0+Y29yZSwKKwkJCSAgICAmTjEsICZNMSwgJk4yLCAmTTIsICZsb2cyUCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKE4yID09IE0yKSB7CisJCWluZm8tPm5wbGxfY3RybCA9IDB4ODAwMDAxMDAgfCAobG9nMlAgPDwgMTYpOworCQlpbmZvLT5ucGxsX2NvZWYgPSAoTjEgPDwgOCkgfCBNMTsKKwl9IGVsc2UgeworCQlpbmZvLT5ucGxsX2N0cmwgPSAweGMwMDAwMDAwIHwgKGxvZzJQIDw8IDE2KTsKKwkJaW5mby0+bnBsbF9jb2VmID0gKE4yIDw8IDI0KSB8IChNMiA8PCAxNikgfCAoTjEgPDwgOCkgfCBNMTsKKwl9CisKKwkvKiB1c2UgdGhlIHNlY29uZCBQTEwgZm9yIHNoYWRlci9yb3AgY2xvY2ssIGlmIGl0IGRpZmZlcnMgZnJvbSBjb3JlICovCisJaWYgKHBlcmZsdmwtPnNoYWRlciAmJiBwZXJmbHZsLT5zaGFkZXIgIT0gcGVyZmx2bC0+Y29yZSkgeworCQlyZXQgPSBudjQwX2NhbGNfcGxsKGRldiwgMHgwMDQwMDgsICZwbGwsIHBlcmZsdmwtPnNoYWRlciwKKwkJCQkgICAgJk4xLCAmTTEsIE5VTEwsIE5VTEwsICZsb2cyUCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJaW5mby0+c3BsbCA9IDB4YzAwMDAwMDAgfCAobG9nMlAgPDwgMTYpIHwgKE4xIDw8IDgpIHwgTTE7CisJCWluZm8tPmN0cmwgPSAweDAwMDAwMjIzOworCX0gZWxzZSB7CisJCWluZm8tPnNwbGwgPSAweDAwMDAwMDAwOworCQlpbmZvLT5jdHJsID0gMHgwMDAwMDMzMzsKKwl9CisKKwkvKiBtZW1vcnkgY2xvY2sgKi8KKwlpZiAoIXBlcmZsdmwtPm1lbW9yeSkgeworCQlpbmZvLT5tcGxsX2N0cmwgPSAweDAwMDAwMDAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBudjQwX2NhbGNfcGxsKGRldiwgMHgwMDQwMjAsICZwbGwsIHBlcmZsdmwtPm1lbW9yeSwKKwkJCSAgICAmTjEsICZNMSwgJk4yLCAmTTIsICZsb2cyUCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaW5mby0+bXBsbF9jdHJsICA9IDB4ODAwMDAwMDAgfCAobG9nMlAgPDwgMTYpOworCWluZm8tPm1wbGxfY3RybCB8PSBtaW4yKHBsbC5sb2cycF9iaWFzICsgbG9nMlAsIHBsbC5tYXhfbG9nMnApIDw8IDIwOworCWlmIChOMiA9PSBNMikgeworCQlpbmZvLT5tcGxsX2N0cmwgfD0gMHgwMDAwMDEwMDsKKwkJaW5mby0+bXBsbF9jb2VmICA9IChOMSA8PCA4KSB8IE0xOworCX0gZWxzZSB7CisJCWluZm8tPm1wbGxfY3RybCB8PSAweDQwMDAwMDAwOworCQlpbmZvLT5tcGxsX2NvZWYgID0gKE4yIDw8IDI0KSB8IChNMiA8PCAxNikgfCAoTjEgPDwgOCkgfCBNMTsKKwl9CisKK291dDoKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShpbmZvKTsKKwkJaW5mbyA9IEVSUl9QVFIocmV0KTsKKwl9CisJcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyBib29sCitudjQwX3BtX2dyX2lkbGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGF0YTsKKworCWlmICgobnZfcmQzMihkZXYsIDB4NDAwNzYwKSAmIDB4MDAwMDAwZjApID4+IDQgIT0KKwkgICAgKG52X3JkMzIoZGV2LCAweDQwMDc2MCkgJiAweDAwMDAwMDBmKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG52X3JkMzIoZGV2LCAweDQwMDcwMCkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCit2b2lkCitudjQwX3BtX2Nsb2Nrc19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqcHJlX3N0YXRlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NDBfcG1fc3RhdGUgKmluZm8gPSBwcmVfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYml0X2VudHJ5IE07CisJdTMyIGNydGNfbWFzayA9IDA7CisJdTggc3IxWzJdOworCWludCBpOworCisJLyogZGV0ZXJtaW5lIHdoaWNoIENSVENzIGFyZSBhY3RpdmUsIGZldGNoIFZHQV9TUjEgZm9yIGVhY2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXUzMiB2YmwgPSBudl9yZDMyKGRldiwgMHg2MDA4MDggKyAoaSAqIDB4MjAwMCkpOworCQl1MzIgY250ID0gMDsKKwkJZG8geworCQkJaWYgKHZibCAhPSBudl9yZDMyKGRldiwgMHg2MDA4MDggKyAoaSAqIDB4MjAwMCkpKSB7CisJCQkJbnZfd3IwOChkZXYsIDB4MGMwM2M0ICsgKGkgKiAweDIwMDApLCAweDAxKTsKKwkJCQlzcjFbaV0gPSBudl9yZDA4KGRldiwgMHgwYzAzYzUgKyAoaSAqIDB4MjAwMCkpOworCQkJCWlmICghKHNyMVtpXSAmIDB4MjApKQorCQkJCQljcnRjX21hc2sgfD0gKDEgPDwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCX0gd2hpbGUgKGNudCsrIDwgMzIpOworCX0KKworCS8qIGhhbHQgYW5kIGlkbGUgZW5naW5lcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCW52X21hc2soZGV2LCAweDAwMjUwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJaWYgKCFudl93YWl0KGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDApKQorCQlnb3RvIHJlc3VtZTsKKwludl9tYXNrKGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCWlmICghbnZfd2FpdChkZXYsIDB4MDAzMjIwLCAweDAwMDAwMDEwLCAweDAwMDAwMDAwKSkKKwkJZ290byByZXN1bWU7CisJbnZfbWFzayhkZXYsIDB4MDAzMjAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwludjA0X2ZpZm9fY2FjaGVfcHVsbChkZXYsIGZhbHNlKTsKKworCWlmICghbnZfd2FpdF9jYihkZXYsIG52NDBfcG1fZ3JfaWRsZSwgZGV2KSkKKwkJZ290byByZXN1bWU7CisKKwkvKiBzZXQgZW5naW5lIGNsb2NrcyAqLworCW52X21hc2soZGV2LCAweDAwYzA0MCwgMHgwMDAwMDMzMywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDA0MDA0LCBpbmZvLT5ucGxsX2NvZWYpOworCW52X21hc2soZGV2LCAweDAwNDAwMCwgMHhjMDA3MDEwMCwgaW5mby0+bnBsbF9jdHJsKTsKKwludl9tYXNrKGRldiwgMHgwMDQwMDgsIDB4YzAwN2ZmZmYsIGluZm8tPnNwbGwpOworCW1kZWxheSg1KTsKKwludl9tYXNrKGRldiwgMHgwMGMwNDAsIDB4MDAwMDAzMzMsIGluZm8tPmN0cmwpOworCisJaWYgKCFpbmZvLT5tcGxsX2N0cmwpCisJCWdvdG8gcmVzdW1lOworCisJLyogd2FpdCBmb3IgdmJsYW5rIHN0YXJ0IG9uIGFjdGl2ZSBjcnRjcywgZGlzYWJsZSBtZW1vcnkgYWNjZXNzICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoIShjcnRjX21hc2sgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJbnZfd2FpdChkZXYsIDB4NjAwODA4ICsgKGkgKiAweDIwMDApLCAweDAwMDEwMDAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd2FpdChkZXYsIDB4NjAwODA4ICsgKGkgKiAweDIwMDApLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwKTsKKwkJbnZfd3IwOChkZXYsIDB4MGMwM2M0ICsgKGkgKiAweDIwMDApLCAweDAxKTsKKwkJbnZfd3IwOChkZXYsIDB4MGMwM2M1ICsgKGkgKiAweDIwMDApLCBzcjFbaV0gfCAweDIwKTsKKwl9CisKKwkvKiBwcmVwYXJlIHJhbSBmb3IgcmVjbG9ja2luZyAqLworCW52X3dyMzIoZGV2LCAweDEwMDJkNCwgMHgwMDAwMDAwMSk7IC8qIHByZWNoYXJnZSAqLworCW52X3dyMzIoZGV2LCAweDEwMDJkMCwgMHgwMDAwMDAwMSk7IC8qIHJlZnJlc2ggKi8KKwludl93cjMyKGRldiwgMHgxMDAyZDAsIDB4MDAwMDAwMDEpOyAvKiByZWZyZXNoICovCisJbnZfbWFzayhkZXYsIDB4MTAwMjEwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsgLyogbm8gYXV0byByZWZyZXNoICovCisJbnZfd3IzMihkZXYsIDB4MTAwMmRjLCAweDAwMDAwMDAxKTsgLyogZW5hYmxlIHNlbGYtcmVmcmVzaCAqLworCisJLyogY2hhbmdlIHRoZSBQTEwgb2YgZWFjaCBtZW1vcnkgcGFydGl0aW9uICovCisJbnZfbWFzayhkZXYsIDB4MDBjMDQwLCAweDAwMDBjMDAwLCAweDAwMDAwMDAwKTsKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweDQwOgorCWNhc2UgMHg0NToKKwljYXNlIDB4NDE6CisJY2FzZSAweDQyOgorCWNhc2UgMHg0NzoKKwkJbnZfbWFzayhkZXYsIDB4MDA0MDQ0LCAweGMwNzcxMTAwLCBpbmZvLT5tcGxsX2N0cmwpOworCQludl9tYXNrKGRldiwgMHgwMDQwMmMsIDB4YzA3NzExMDAsIGluZm8tPm1wbGxfY3RybCk7CisJCW52X3dyMzIoZGV2LCAweDAwNDA0OCwgaW5mby0+bXBsbF9jb2VmKTsKKwkJbnZfd3IzMihkZXYsIDB4MDA0MDMwLCBpbmZvLT5tcGxsX2NvZWYpOworCWNhc2UgMHg0MzoKKwljYXNlIDB4NDk6CisJY2FzZSAweDRiOgorCQludl9tYXNrKGRldiwgMHgwMDQwMzgsIDB4YzA3NzExMDAsIGluZm8tPm1wbGxfY3RybCk7CisJCW52X3dyMzIoZGV2LCAweDAwNDAzYywgaW5mby0+bXBsbF9jb2VmKTsKKwlkZWZhdWx0OgorCQludl9tYXNrKGRldiwgMHgwMDQwMjAsIDB4YzA3NzExMDAsIGluZm8tPm1wbGxfY3RybCk7CisJCW52X3dyMzIoZGV2LCAweDAwNDAyNCwgaW5mby0+bXBsbF9jb2VmKTsKKwkJYnJlYWs7CisJfQorCXVkZWxheSgxMDApOworCW52X21hc2soZGV2LCAweDAwYzA0MCwgMHgwMDAwYzAwMCwgMHgwMDAwYzAwMCk7CisKKwkvKiByZS1lbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBvZiBtZW1vcnkgY29udHJvbGxlciAqLworCW52X3dyMzIoZGV2LCAweDEwMDJkYywgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIDB4MTAwMjEwLCAweDgwMDAwMDAwLCAweDgwMDAwMDAwKTsKKwl1ZGVsYXkoMTAwKTsKKworCS8qIGV4ZWN1dGUgbWVtb3J5IHJlc2V0IHNjcmlwdCBmcm9tIHZiaW9zICovCisJaWYgKCFiaXRfdGFibGUoZGV2LCAnTScsICZNKSkKKwkJbm91dmVhdV9iaW9zX2luaXRfZXhlYyhkZXYsIFJPTTE2KE0uZGF0YVswXSkpOworCisJLyogbWFrZSBzdXJlIHdlJ3JlIGluIHZibGFuayAoaG9wZWZ1bGx5IHRoZSBzYW1lIG9uZSBhcyBiZWZvcmUpLCBhbmQKKwkgKiB0aGVuIHJlLWVuYWJsZSBjcnRjIG1lbW9yeSBhY2Nlc3MKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmICghKGNydGNfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQludl93YWl0KGRldiwgMHg2MDA4MDggKyAoaSAqIDB4MjAwMCksIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDApOworCQludl93cjA4KGRldiwgMHgwYzAzYzQgKyAoaSAqIDB4MjAwMCksIDB4MDEpOworCQludl93cjA4KGRldiwgMHgwYzAzYzUgKyAoaSAqIDB4MjAwMCksIHNyMVtpXSk7CisJfQorCisJLyogcmVzdW1lIGVuZ2luZXMgKi8KK3Jlc3VtZToKKwludl93cjMyKGRldiwgMHgwMDMyNTAsIDB4MDAwMDAwMDEpOworCW52X21hc2soZGV2LCAweDAwMzIyMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4MDAzMjAwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisKKwlrZnJlZShpbmZvKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKaW5kZXggNWQ5ODkwNzMuLjg4MjA4MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jCkBAIC0zMjksOCArMzI5LDYgQEAKIAogCWRybV9jcnRjX2NsZWFudXAoJm52X2NydGMtPmJhc2UpOwogCi0JbnY1MF9jdXJzb3JfZmluaShudl9jcnRjKTsKLQogCW5vdXZlYXVfYm9fdW5tYXAobnZfY3J0Yy0+bHV0Lm52Ym8pOwogCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5sdXQubnZibyk7CiAJbm91dmVhdV9ib191bm1hcChudl9jcnRjLT5jdXJzb3IubnZibyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2N1cnNvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jdXJzb3IuYwppbmRleCA5NzUyYzM1Li5hZGZjOWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2N1cnNvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3Vyc29yLmMKQEAgLTEzNywyMSArMTM3LDMgQEAKIAludl9jcnRjLT5jdXJzb3Iuc2hvdyA9IG52NTBfY3Vyc29yX3Nob3c7CiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQKLW52NTBfY3Vyc29yX2Zpbmkoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbnZfY3J0Yy0+YmFzZS5kZXY7Ci0JaW50IGlkeCA9IG52X2NydGMtPmluZGV4OwotCi0JTlZfREVCVUdfS01TKGRldiwgIlxuIik7Ci0KLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGlkeCksIDApOwotCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpZHgpLAotCQkgICAgIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMsIDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6IENVUlNPUl9DVFJMMl9TVEFUVVMgPT0gMFxuIik7Ci0JCU5WX0VSUk9SKGRldiwgIkNVUlNPUl9DVFJMMiA9IDB4JTA4eFxuIiwKLQkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGlkeCkpKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKaW5kZXggZGIxYTVmNC4uZDIzY2EwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKQEAgLTI0Nyw2ICsyNDcsMTYgQEAKIAkJfQogCX0KIAorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSwgMCk7CisJCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSwKKwkJCSAgICAgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyX1NUQVRVUywgMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6IENVUlNPUl9DVFJMMl9TVEFUVVMgPT0gMFxuIik7CisJCQlOVl9FUlJPUihkZXYsICJDVVJTT1JfQ1RSTDIgPSAweCUwOHhcbiIsCisJCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSkpKTsKKwkJfQorCX0KKwogCW52NTBfZXZvX2ZpbmkoZGV2KTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTI4NiwyMyArMjk2LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2X3ByaXYtPmVuZ2luZS5kaXNwbGF5LnByaXYgPSBwcml2OwogCi0JLyogaW5pdCBiYXNpYyBrZXJuZWwgbW9kZXNldHRpbmcgKi8KLQlkcm1fbW9kZV9jb25maWdfaW5pdChkZXYpOwotCi0JLyogSW5pdGlhbGlzZSBzb21lIG9wdGlvbmFsIGNvbm5lY3RvciBwcm9wZXJ0aWVzLiAqLwotCWRybV9tb2RlX2NyZWF0ZV9zY2FsaW5nX21vZGVfcHJvcGVydHkoZGV2KTsKLQlkcm1fbW9kZV9jcmVhdGVfZGl0aGVyaW5nX3Byb3BlcnR5KGRldik7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0aCA9IDA7Ci0JZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gMDsKLQotCWRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAodm9pZCAqKSZub3V2ZWF1X21vZGVfY29uZmlnX2Z1bmNzOwotCi0JZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwotCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDgxOTI7Ci0KLQlkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgPSBkZXZfcHJpdi0+ZmJfcGh5czsKLQogCS8qIENyZWF0ZSBDUlRDIG9iamVjdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQogCQludjUwX2NydGNfY3JlYXRlKGRldiwgaSk7CkBAIC0zNjQsOCArMzU3LDYgQEAKIAogCU5WX0RFQlVHX0tNUyhkZXYsICJcbiIpOwogCi0JZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKLQogCW52NTBfZGlzcGxheV9kaXNhYmxlKGRldik7CiAJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDI2KTsKIAlrZnJlZShkaXNwKTsKQEAgLTY5OCw3ICs2ODksNyBAQAogCQlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2IgPSAmZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyeVtpXTsKIAogCQlpZiAoZGNiLT50eXBlID09IHR5cGUgJiYgKGRjYi0+b3IgJiAoMSA8PCBvcikpKSB7Ci0JCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2IsIDAsIC0xKTsKKwkJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIDAsIC0xLCBkY2IsIC0xKTsKIAkJCWRpc3AtPmlycS5kY2IgPSBkY2I7CiAJCQlnb3RvIGFjazsKIAkJfQpAQCAtNzExLDM3ICs3MDIsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotbnY1MF9kaXNwbGF5X3VuazIwX2RwX2hhY2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRjYl9lbnRyeSAqZGNiKQotewotCWludCBvciA9IGZmcyhkY2ItPm9yKSAtIDEsIGxpbmsgPSAhKGRjYi0+ZHBjb25mLnNvci5saW5rICYgMSk7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCXVpbnQzMl90IHRtcCwgdW5rMCA9IDAsIHVuazEgPSAwOwotCi0JaWYgKGRjYi0+dHlwZSAhPSBPVVRQVVRfRFApCi0JCXJldHVybjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7Ci0KLQkJaWYgKG52X2VuY29kZXItPmRjYiA9PSBkY2IpIHsKLQkJCXVuazAgPSBudl9lbmNvZGVyLT5kcC51bmswOwotCQkJdW5rMSA9IG52X2VuY29kZXItPmRwLnVuazE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICh1bmswIHx8IHVuazEpIHsKLQkJdG1wICA9IG52X3JkMzIoZGV2LCBOVjUwX1NPUl9EUF9DVFJMKG9yLCBsaW5rKSk7Ci0JCXRtcCAmPSAweGZmZmZmZTAzOwotCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfQ1RSTChvciwgbGluayksIHRtcCB8IHVuazApOwotCi0JCXRtcCAgPSBudl9yZDMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTI4KG9yLCBsaW5rKSk7Ci0JCXRtcCAmPSAweGZlZjA4MGMwOwotCQludl93cjMyKGRldiwgTlY1MF9TT1JfRFBfVU5LMTI4KG9yLCBsaW5rKSwgdG1wIHwgdW5rMSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAogbnY1MF9kaXNwbGF5X3VuazIwX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzUzLDcgKzcxMyw3IEBACiAJTlZfREVCVUdfS01TKGRldiwgIjB4NjEwMDMwOiAweCUwOHhcbiIsIHVuazMwKTsKIAlkY2IgPSBkaXNwLT5pcnEuZGNiOwogCWlmIChkY2IpIHsKLQkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgZGNiLCAwLCAtMik7CisJCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIDAsIC0yLCBkY2IsIC0xKTsKIAkJZGlzcC0+aXJxLmRjYiA9IE5VTEw7CiAJfQogCkBAIC04MzcsOSArNzk3LDE1IEBACiAJfQogCiAJc2NyaXB0ID0gbnY1MF9kaXNwbGF5X3NjcmlwdF9zZWxlY3QoZGV2LCBkY2IsIG1jLCBwY2xrKTsKLQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBkY2IsIHNjcmlwdCwgcGNsayk7CisJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgc2NyaXB0LCBwY2xrLCBkY2IsIC0xKTsKIAotCW52NTBfZGlzcGxheV91bmsyMF9kcF9oYWNrKGRldiwgZGNiKTsKKwlpZiAodHlwZSA9PSBPVVRQVVRfRFApIHsKKwkJaW50IGxpbmsgPSAhKGRjYi0+ZHBjb25mLnNvci5saW5rICYgMSk7CisJCWlmICgobWMgJiAweDAwMGYwMDAwKSA9PSAweDAwMDIwMDAwKQorCQkJbm91dmVhdV9kcF90dV91cGRhdGUoZGV2LCBvciwgbGluaywgcGNsaywgMTgpOworCQllbHNlCisJCQlub3V2ZWF1X2RwX3R1X3VwZGF0ZShkZXYsIG9yLCBsaW5rLCBwY2xrLCAyNCk7CisJfQogCiAJaWYgKGRjYi0+dHlwZSAhPSBPVVRQVVRfQU5BTE9HKSB7CiAJCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9DTEtfQ1RSTDIob3IpKTsKQEAgLTkwNCw3ICs4NzAsNyBAQAogCWlmICghZGNiKQogCQlnb3RvIGFjazsKIAotCW5vdXZlYXVfYmlvc19ydW5fZGlzcGxheV90YWJsZShkZXYsIGRjYiwgc2NyaXB0LCAtcGNsayk7CisJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgc2NyaXB0LCAtcGNsaywgZGNiLCAtMSk7CiAJbnY1MF9kaXNwbGF5X3VuazQwX2RwX3NldF90bWRzKGRldiwgZGNiKTsKIAogYWNrOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYwppbmRleCBkNGY0MjA2Li43OTNhNWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYwpAQCAtOTgsNiArOTgsMzcgQEAKIH0KIAogaW50CitudmQwX2dwaW9fZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZykKK3sKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisJdTMyIHY7CisKKwlncGlvID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCB0YWcpOworCWlmICghZ3BpbykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl2ICA9IG52X3JkMzIoZGV2LCAweDAwZDYxMCArIChncGlvLT5saW5lICogNCkpOworCXYgJj0gMHgwMDAwNDAwMDsKKwlyZXR1cm4gKCEhdiA9PSAoZ3Bpby0+c3RhdGVbMV0gJiAxKSk7Cit9CisKK2ludAorbnZkMF9ncGlvX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisJdTMyIHY7CisKKwlncGlvID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCB0YWcpOworCWlmICghZ3BpbykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl2ID0gZ3Bpby0+c3RhdGVbc3RhdGVdIF4gMjsKKworCW52X21hc2soZGV2LCAweDAwZDYxMCArIChncGlvLT5saW5lICogNCksIDB4MDAwMDMwMDAsIHYgPDwgMTIpOworCXJldHVybiAwOworfQorCitpbnQKIG52NTBfZ3Bpb19pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLAogCQkgICAgICAgdm9pZCAoKmhhbmRsZXIpKHZvaWQgKiwgaW50KSwgdm9pZCAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYwppbmRleCBkNDNjNDZjLi5hYzYwMWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCkBAIC0xMjAsNzAgKzEyMCw2MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotbnY1MF9ncmFwaF9pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JdWludDMyX3QgcG1jX2UgPSBOVl9QTUNfRU5BQkxFX1BHUkFQSCB8ICgxIDw8IDIxKTsKLQlOVl9ERUJVRyhkZXYsICJcbiIpOwotCi0JbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJiB+cG1jX2UpOwotCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwgIHBtY19lKTsKLX0KLQotc3RhdGljIHZvaWQKLW52NTBfZ3JhcGhfaW5pdF9pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JTlZfREVCVUcoZGV2LCAiXG4iKTsKLQotCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweGZmZmZmZmZmKTsKLQludl93cjMyKGRldiwgMHg0MDAxMzgsIDB4ZmZmZmZmZmYpOwotCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9JTlRSX0VOLCAweGZmZmZmZmZmKTsKLX0KLQotc3RhdGljIHZvaWQKLW52NTBfZ3JhcGhfaW5pdF9yZWdzX19udihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIGludAorbnY1MF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCB1bml0cyA9IG52X3JkMzIoZGV2LCAweDE1NDApOworCXN0cnVjdCBudjUwX2dyYXBoX2VuZ2luZSAqcGdyYXBoID0gbnZfZW5naW5lKGRldiwgZW5naW5lKTsKKwl1MzIgdW5pdHMgPSBudl9yZDMyKGRldiwgMHgwMDE1NDApOwogCWludCBpOwogCiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAorCS8qIG1hc3RlciByZXNldCAqLworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDIwMTAwMCwgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMjAxMDAwLCAweDAwMjAxMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAwOGMsIDB4MDAwMDAwMDQpOyAvKiBIV19DVFhfU1dJVENIX0VOQUJMRUQgKi8KKworCS8qIHJlc2V0L2VuYWJsZSB0cmFwcyBhbmQgaW50ZXJydXB0cyAqLwogCW52X3dyMzIoZGV2LCAweDQwMDgwNCwgMHhjMDAwMDAwMCk7CiAJbnZfd3IzMihkZXYsIDB4NDA2ODAwLCAweGMwMDAwMDAwKTsKIAludl93cjMyKGRldiwgMHg0MDBjMDQsIDB4YzAwMDAwMDApOwogCW52X3dyMzIoZGV2LCAweDQwMTgwMCwgMHhjMDAwMDAwMCk7CiAJbnZfd3IzMihkZXYsIDB4NDA1MDE4LCAweGMwMDAwMDAwKTsKIAludl93cjMyKGRldiwgMHg0MDIwMDAsIDB4YzAwMDAwMDApOwotCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaWYgKHVuaXRzICYgMSA8PCBpKSB7Ci0JCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweGEwKSB7Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDA4OTAwICsgKGkgPDwgMTIpLCAweGMwMDAwMDAwKTsKLQkJCQludl93cjMyKGRldiwgMHg0MDhlMDggKyAoaSA8PCAxMiksIDB4YzAwMDAwMDApOwotCQkJCW52X3dyMzIoZGV2LCAweDQwODMxNCArIChpIDw8IDEyKSwgMHhjMDAwMDAwMCk7Ci0JCQl9IGVsc2UgewotCQkJCW52X3dyMzIoZGV2LCAweDQwODYwMCArIChpIDw8IDExKSwgMHhjMDAwMDAwMCk7Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDA4NzA4ICsgKGkgPDwgMTEpLCAweGMwMDAwMDAwKTsKLQkJCQludl93cjMyKGRldiwgMHg0MDgzMWMgKyAoaSA8PCAxMSksIDB4YzAwMDAwMDApOwotCQkJfQorCQlpZiAoISh1bml0cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApIHsKKwkJCW52X3dyMzIoZGV2LCAweDQwODkwMCArIChpIDw8IDEyKSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHg0MDhlMDggKyAoaSA8PCAxMiksIDB4YzAwMDAwMDApOworCQkJbnZfd3IzMihkZXYsIDB4NDA4MzE0ICsgKGkgPDwgMTIpLCAweGMwMDAwMDAwKTsKKwkJfSBlbHNlIHsKKwkJCW52X3dyMzIoZGV2LCAweDQwODYwMCArIChpIDw8IDExKSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHg0MDg3MDggKyAoaSA8PCAxMSksIDB4YzAwMDAwMDApOworCQkJbnZfd3IzMihkZXYsIDB4NDA4MzFjICsgKGkgPDwgMTEpLCAweGMwMDAwMDAwKTsKIAkJfQogCX0KIAogCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHhmZmZmZmZmZik7Ci0KLQludl93cjMyKGRldiwgMHg0MDA4MjQsIDB4MDAwMDQwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxM2MsIDB4ZmZmZmZmZmYpOwogCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAxMDAwMSk7Ci19CiAKLXN0YXRpYyB2b2lkCi1udjUwX2dyYXBoX2luaXRfemN1bGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBpOworCS8qIHVwbG9hZCBjb250ZXh0IHByb2dyYW0sIGluaXRpYWxpc2UgY3R4Y3RsIGRlZmF1bHRzICovCisJbnZfd3IzMihkZXYsIDB4NDAwMzI0LCAweDAwMDAwMDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGdyYXBoLT5jdHhwcm9nX3NpemU7IGkrKykKKwkJbnZfd3IzMihkZXYsIDB4NDAwMzI4LCBwZ3JhcGgtPmN0eHByb2dbaV0pOworCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwODI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDA4MmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDgzMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwNzI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAzMmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDMyMCwgNCk7CS8qIENUWENUTF9DTUQgPSBORVdDVFhETUEgKi8KIAotCU5WX0RFQlVHKGRldiwgIlxuIik7Ci0KKwkvKiBzb21lIHVua25vd24gemN1bGwgbWFnaWMgKi8KIAlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0ICYgMHhmMCkgewogCWNhc2UgMHg1MDoKIAljYXNlIDB4ODA6CkBAIC0yMTIsNDMgKzIwNCw3IEBACiAJCW52X3dyMzIoZGV2LCAweDQwMmMyOCArIChpICogOCksIDB4MDAwMDAwMDApOwogCQludl93cjMyKGRldiwgMHg0MDJjMmMgKyAoaSAqIDgpLCAweDAwMDAwMDAwKTsKIAl9Ci19CiAKLXN0YXRpYyBpbnQKLW52NTBfZ3JhcGhfaW5pdF9jdHhjdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbnY1MF9ncmFwaF9lbmdpbmUgKnBncmFwaCA9IG52X2VuZ2luZShkZXYsIE5WT0JKX0VOR0lORV9HUik7Ci0JaW50IGk7Ci0KLQlOVl9ERUJVRyhkZXYsICJcbiIpOwotCi0JbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9VQ09ERV9JTkRFWCwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IHBncmFwaC0+Y3R4cHJvZ19zaXplOyBpKyspCi0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9DVFhDVExfVUNPREVfREFUQSwgcGdyYXBoLT5jdHhwcm9nW2ldKTsKLQotCW52X3dyMzIoZGV2LCAweDQwMDA4YywgMHgwMDAwMDAwNCk7IC8qIEhXX0NUWF9TV0lUQ0hfRU5BQkxFRCAqLwotCW52X3dyMzIoZGV2LCAweDQwMDMyMCwgNCk7Ci0JbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsIDApOwotCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9DSEFOTkVMX0NUWF9QT0lOVEVSLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnY1MF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCi17Ci0JaW50IHJldDsKLQotCU5WX0RFQlVHKGRldiwgIlxuIik7Ci0KLQludjUwX2dyYXBoX2luaXRfcmVzZXQoZGV2KTsKLQludjUwX2dyYXBoX2luaXRfcmVnc19fbnYoZGV2KTsKLQludjUwX2dyYXBoX2luaXRfemN1bGwoZGV2KTsKLQotCXJldCA9IG52NTBfZ3JhcGhfaW5pdF9jdHhjdGwoZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JbnY1MF9ncmFwaF9pbml0X2ludHIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmN0eC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmN0eC5jCmluZGV4IGRlOWFiZmYuLjRiNDZkNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JjdHguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyY3R4LmMKQEAgLTQwLDYgKzQwLDEyIEBACiAjZGVmaW5lIENQX0ZMQUdfVU5LMEIgICAgICAgICAgICAgICAgICgoMCAqIDMyKSArIDB4YikKICNkZWZpbmUgQ1BfRkxBR19VTkswQl9DTEVBUiAgICAgICAgICAgMAogI2RlZmluZSBDUF9GTEFHX1VOSzBCX1NFVCAgICAgICAgICAgICAxCisjZGVmaW5lIENQX0ZMQUdfWEZFUl9TV0lUQ0ggICAgICAgICAgICgoMCAqIDMyKSArIDB4ZSkKKyNkZWZpbmUgQ1BfRkxBR19YRkVSX1NXSVRDSF9ESVNBQkxFICAgMAorI2RlZmluZSBDUF9GTEFHX1hGRVJfU1dJVENIX0VOQUJMRSAgICAxCisjZGVmaW5lIENQX0ZMQUdfU1RBVEUgICAgICAgICAgICAgICAgICgoMCAqIDMyKSArIDB4MWMpCisjZGVmaW5lIENQX0ZMQUdfU1RBVEVfU1RPUFBFRCAgICAgICAgIDAKKyNkZWZpbmUgQ1BfRkxBR19TVEFURV9SVU5OSU5HICAgICAgICAgMQogI2RlZmluZSBDUF9GTEFHX1VOSzFEICAgICAgICAgICAgICAgICAoKDAgKiAzMikgKyAweDFkKQogI2RlZmluZSBDUF9GTEFHX1VOSzFEX0NMRUFSICAgICAgICAgICAwCiAjZGVmaW5lIENQX0ZMQUdfVU5LMURfU0VUICAgICAgICAgICAgIDEKQEAgLTE5NCw2ICsyMDAsOSBAQAogCQkJCSAgICJ0aGUgZGV2cy5cbiIpOwogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CisKKwljcF9zZXQgKGN0eCwgU1RBVEUsIFJVTk5JTkcpOworCWNwX3NldCAoY3R4LCBYRkVSX1NXSVRDSCwgRU5BQkxFKTsKIAkvKiBkZWNpZGUgd2hldGhlciB3ZSdyZSBsb2FkaW5nL3VubG9hZGluZyB0aGUgY29udGV4dCAqLwogCWNwX2JyYSAoY3R4LCBBVVRPX1NBVkUsIFBFTkRJTkcsIGNwX3NldHVwX3NhdmUpOwogCWNwX2JyYSAoY3R4LCBVU0VSX1NBVkUsIFBFTkRJTkcsIGNwX3NldHVwX3NhdmUpOwpAQCAtMjYwLDYgKzI2OSw4IEBACiAJY3BfbmFtZShjdHgsIGNwX2V4aXQpOwogCWNwX3NldCAoY3R4LCBVU0VSX1NBVkUsIE5PVF9QRU5ESU5HKTsKIAljcF9zZXQgKGN0eCwgVVNFUl9MT0FELCBOT1RfUEVORElORyk7CisJY3Bfc2V0IChjdHgsIFhGRVJfU1dJVENILCBESVNBQkxFKTsKKwljcF9zZXQgKGN0eCwgU1RBVEUsIFNUT1BQRUQpOwogCWNwX291dCAoY3R4LCBDUF9FTkQpOwogCWN0eC0+Y3R4dmFsc19wb3MgKz0gMHg0MDA7IC8qIHBhZGRpbmcuLi4gbm8gaWRlYSB3aHkgeW91IG5lZWQgaXQgKi8KIApAQCAtNTkwLDcgKzYwMSw3IEBACiAJCQkJCWdyX2RlZihjdHgsIG9mZnNldCArIDB4MWMsIDB4MDA4ODAwMDApOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4ODY6Ci0JCQkJCWdyX2RlZihjdHgsIG9mZnNldCArIDB4MWMsIDB4MDA4YzAwMDApOworCQkJCQlncl9kZWYoY3R4LCBvZmZzZXQgKyAweDFjLCAweDAxOGMwMDAwKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAweDkyOgogCQkJCWNhc2UgMHg5NjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfcG0uYwppbmRleCA4YTI4MTAwLi4zZDVhODZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9wbS5jCkBAIC0xMTUsMTUgKzExNSwxNSBAQAogCSAgICBCSVRfTS52ZXJzaW9uID09IDEgJiYgQklUX00ubGVuZ3RoID49IDB4MGIpIHsKIAkJc2NyaXB0ID0gUk9NMTYoQklUX00uZGF0YVsweDA1XSk7CiAJCWlmIChzY3JpcHQpCi0JCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIE5VTEwpOworCQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBOVUxMLCAtMSk7CiAJCXNjcmlwdCA9IFJPTTE2KEJJVF9NLmRhdGFbMHgwN10pOwogCQlpZiAoc2NyaXB0KQotCQkJbm91dmVhdV9iaW9zX3J1bl9pbml0X3RhYmxlKGRldiwgc2NyaXB0LCBOVUxMKTsKKwkJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgTlVMTCwgLTEpOwogCQlzY3JpcHQgPSBST00xNihCSVRfTS5kYXRhWzB4MDldKTsKIAkJaWYgKHNjcmlwdCkKLQkJCW5vdXZlYXVfYmlvc19ydW5faW5pdF90YWJsZShkZXYsIHNjcmlwdCwgTlVMTCk7CisJCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBzY3JpcHQsIE5VTEwsIC0xKTsKIAotCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBwZXJmbHZsLT5tZW1zY3JpcHQsIE5VTEwpOworCQlub3V2ZWF1X2Jpb3NfcnVuX2luaXRfdGFibGUoZGV2LCBwZXJmbHZsLT5tZW1zY3JpcHQsIE5VTEwsIC0xKTsKIAl9CiAKIAlpZiAoc3RhdGUtPnR5cGUgPT0gUExMX01FTU9SWSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfc29yLmMKaW5kZXggZmZlOGI0OC4uMjYzM2FhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9zb3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3Nvci5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJaWYgKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTikgewogCQkJdTggc3RhdHVzID0gRFBfU0VUX1BPV0VSX0QwOwogCQkJbm91dmVhdV9kcF9hdXhjaChhdXhjaCwgOCwgRFBfU0VUX1BPV0VSLCAmc3RhdHVzLCAxKTsKLQkJCW5vdXZlYXVfZHBfbGlua190cmFpbihlbmNvZGVyKTsKKwkJCW5vdXZlYXVfZHBfbGlua190cmFpbihlbmNvZGVyLCBudl9lbmNvZGVyLT5kcC5kYXRhcmF0ZSk7CiAJCX0gZWxzZSB7CiAJCQl1OCBzdGF0dXMgPSBEUF9TRVRfUE9XRVJfRDM7CiAJCQlub3V2ZWF1X2RwX2F1eGNoKGF1eGNoLCA4LCBEUF9TRVRfUE9XRVIsICZzdGF0dXMsIDEpOwpAQCAtMTg3LDE0ICsxODcsMTMgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGVuY29kZXIpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfY3J0YyAqY3J0YyA9IG5vdXZlYXVfY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKIAl1aW50MzJfdCBtb2RlX2N0bCA9IDA7CiAJaW50IHJldDsKIAogCU5WX0RFQlVHX0tNUyhkZXYsICJvciAlZCB0eXBlICVkIC0+IGNydGMgJWRcbiIsCiAJCSAgICAgbnZfZW5jb2Rlci0+b3IsIG52X2VuY29kZXItPmRjYi0+dHlwZSwgY3J0Yy0+aW5kZXgpOwogCi0JbnY1MF9zb3JfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKLQogCXN3aXRjaCAobnZfZW5jb2Rlci0+ZGNiLT50eXBlKSB7CiAJY2FzZSBPVVRQVVRfVE1EUzoKIAkJaWYgKG52X2VuY29kZXItPmRjYi0+c29yY29uZi5saW5rICYgMSkgewpAQCAtMjA2LDcgKzIwNSwxNSBAQAogCQkJbW9kZV9jdGwgPSAweDAyMDA7CiAJCWJyZWFrOwogCWNhc2UgT1VUUFVUX0RQOgotCQltb2RlX2N0bCB8PSAobnZfZW5jb2Rlci0+ZHAubWNfdW5rbm93biA8PCAxNik7CisJCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCQlpZiAobnZfY29ubmVjdG9yICYmIG52X2Nvbm5lY3Rvci0+YmFzZS5kaXNwbGF5X2luZm8uYnBjID09IDYpIHsKKwkJCW52X2VuY29kZXItPmRwLmRhdGFyYXRlID0gY3J0Yy0+bW9kZS0+Y2xvY2sgKiAxOCAvIDg7CisJCQltb2RlX2N0bCB8PSAweDAwMDIwMDAwOworCQl9IGVsc2UgeworCQkJbnZfZW5jb2Rlci0+ZHAuZGF0YXJhdGUgPSBjcnRjLT5tb2RlLT5jbG9jayAqIDI0IC8gODsKKwkJCW1vZGVfY3RsIHw9IDB4MDAwNTAwMDA7CisJCX0KKwogCQlpZiAobnZfZW5jb2Rlci0+ZGNiLT5zb3Jjb25mLmxpbmsgJiAxKQogCQkJbW9kZV9jdGwgfD0gMHgwMDAwMDgwMDsKIAkJZWxzZQpAQCAtMjI3LDYgKzIzNCw4IEBACiAJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19OVlNZTkMpCiAJCW1vZGVfY3RsIHw9IE5WNTBfRVZPX1NPUl9NT0RFX0NUUkxfTlZTWU5DOwogCisJbnY1MF9zb3JfZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwogCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAyKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgIm5vIHNwYWNlIHdoaWxlIGNvbm5lY3RpbmcgU09SXG4iKTsKQEAgLTMxMywzMSArMzIyLDYgQEAKIAllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGVudHJ5LT5oZWFkczsKIAllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOwogCi0JaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSA9PSBPVVRQVVRfRFApIHsKLQkJaW50IG9yID0gbnZfZW5jb2Rlci0+b3IsIGxpbmsgPSAhKGVudHJ5LT5kcGNvbmYuc29yLmxpbmsgJiAxKTsKLQkJdWludDMyX3QgdG1wOwotCi0JCXRtcCA9IG52X3JkMzIoZGV2LCAweDYxYzcwMCArIChvciAqIDB4ODAwKSk7Ci0JCWlmICghdG1wKQotCQkJdG1wID0gbnZfcmQzMihkZXYsIDB4NjEwNzk4ICsgKG9yICogOCkpOwotCi0JCXN3aXRjaCAoKHRtcCAmIDB4MDAwMDBmMDApID4+IDgpIHsKLQkJY2FzZSA4OgotCQljYXNlIDk6Ci0JCQludl9lbmNvZGVyLT5kcC5tY191bmtub3duID0gKHRtcCAmIDB4MDAwZjAwMDApID4+IDE2OwotCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX0NUUkwob3IsIGxpbmspKTsKLQkJCW52X2VuY29kZXItPmRwLnVuazAgPSB0bXAgJiAweDAwMDAwMWZjOwotCQkJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfU09SX0RQX1VOSzEyOChvciwgbGluaykpOwotCQkJbnZfZW5jb2Rlci0+ZHAudW5rMSA9IHRtcCAmIDB4MDEwZjdmM2Y7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCFudl9lbmNvZGVyLT5kcC5tY191bmtub3duKQotCQkJbnZfZW5jb2Rlci0+ZHAubWNfdW5rbm93biA9IDU7Ci0JfQotCiAJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3ZyYW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jCmluZGV4IGFmMzJkYWUuLjJlNDVlNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jCkBAIC01MSw3ICs1MSw3IEBACiBudjUwX3ZyYW1fZGVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X21lbSAqKnBtZW0pCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBkZXZfcHJpdi0+ZW5naW5lLnZyYW0ubW07CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gJmRldl9wcml2LT5lbmdpbmUudnJhbS5tbTsKIAlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzOwogCXN0cnVjdCBub3V2ZWF1X21lbSAqbWVtOwogCkBAIC04Miw3ICs4Miw3IEBACiAJICAgICAgdTMyIG1lbXR5cGUsIHN0cnVjdCBub3V2ZWF1X21lbSAqKnBtZW0pCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBkZXZfcHJpdi0+ZW5naW5lLnZyYW0ubW07CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gJmRldl9wcml2LT5lbmdpbmUudnJhbS5tbTsKIAlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpyOwogCXN0cnVjdCBub3V2ZWF1X21lbSAqbWVtOwogCWludCBjb21wID0gKG1lbXR5cGUgJiAweDMwMCkgPj4gODsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCWNvbGJpdHMgID0gIChyNCAmIDB4MDAwMGYwMDApID4+IDEyOwogCXJvd2JpdHNhID0gKChyNCAmIDB4MDAwZjAwMDApID4+IDE2KSArIDg7CiAJcm93Yml0c2IgPSAoKHI0ICYgMHgwMGYwMDAwMCkgPj4gMjApICsgODsKLQliYW5rcyAgICA9ICgocjQgJiAweDAxMDAwMDAwKSA/IDggOiA0KTsKKwliYW5rcyAgICA9IDEgPDwgKCgocjQgJiAweDAzMDAwMDAwKSA+PiAyNCkgKyAyKTsKIAogCXJvd3NpemUgPSBwYXJ0cyAqIGJhbmtzICogKDEgPDwgY29sYml0cykgKiA4OwogCXByZWRpY3RlZCA9IHJvd3NpemUgPDwgcm93Yml0c2E7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmEzX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmEzX3BtLmMKaW5kZXggZTRiMmI5ZS4uNjE4YzE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZhM19wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YTNfcG0uYwpAQCAtMjcsMTc4ICsyNywzMTYgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Jpb3MuaCIKICNpbmNsdWRlICJub3V2ZWF1X3BtLmgiCiAKLS8qIFRoaXMgaXMgYWN0dWFsbHkgYSBsb3QgbW9yZSBjb21wbGV4IHRoYW4gaXQgYXBwZWFycyBoZXJlLCBidXQgaG9wZWZ1bGx5Ci0gKiB0aGlzIHNob3VsZCBiZSBhYmxlIHRvIGRlYWwgd2l0aCB3aGF0IHRoZSBWQklPUyBsZWF2ZXMgZm9yIHVzLi4KLSAqCi0gKiBJZiBub3QsIHdlbGwsIEknbGwganVtcCBvZmYgdGhhdCBicmlkZ2Ugd2hlbiBJIGNvbWUgdG8gaXQuCi0gKi8KK3N0YXRpYyB1MzIgcmVhZF9jbGsoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCBib29sKTsKK3N0YXRpYyB1MzIgcmVhZF9wbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCB1MzIpOwogCi1zdHJ1Y3QgbnZhM19wbV9zdGF0ZSB7Ci0JZW51bSBwbGxfdHlwZXMgdHlwZTsKLQl1MzIgc3JjMDsKLQl1MzIgc3JjMTsKLQl1MzIgY3RybDsKLQl1MzIgY29lZjsKLQl1MzIgb2xkX3BubTsKLQl1MzIgbmV3X3BubTsKLQl1MzIgbmV3X2RpdjsKK3N0YXRpYyB1MzIKK3JlYWRfdmNvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGspCit7CisJdTMyIHNjdGwgPSBudl9yZDMyKGRldiwgMHg0MTIwICsgKGNsayAqIDQpKTsKKwlpZiAoKHNjdGwgJiAweDAwMDAwMDMwKSAhPSAweDAwMDAwMDMwKQorCQlyZXR1cm4gcmVhZF9wbGwoZGV2LCAweDQxLCAweDAwZTgyMCk7CisJcmV0dXJuIHJlYWRfcGxsKGRldiwgMHg0MiwgMHgwMGU4YTApOworfQorCitzdGF0aWMgdTMyCityZWFkX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xrLCBib29sIGlnbm9yZV9lbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzY3RsLCBzZGl2LCBzY2xrOworCisJLyogcmVmY2xrIGZvciB0aGUgMHhlOHh4IHBsbHMgaXMgYSBmaXhlZCBmcmVxdWVuY3kgKi8KKwlpZiAoY2xrID49IDB4NDApIHsKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4YWYpIHsKKwkJCS8qIG5vIGpva2UuLiBzZXJpb3VzbHkuLiBzaWdoLi4gKi8KKwkJCXJldHVybiBudl9yZDMyKGRldiwgMHgwMDQ3MWMpICogMTAwMDsKKwkJfQorCisJCXJldHVybiBkZXZfcHJpdi0+Y3J5c3RhbDsKKwl9CisKKwlzY3RsID0gbnZfcmQzMihkZXYsIDB4NDEyMCArIChjbGsgKiA0KSk7CisJaWYgKCFpZ25vcmVfZW4gJiYgIShzY3RsICYgMHgwMDAwMDEwMCkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzY3RsICYgMHgwMDAwMzAwMCkgeworCWNhc2UgMHgwMDAwMDAwMDoKKwkJcmV0dXJuIGRldl9wcml2LT5jcnlzdGFsOworCWNhc2UgMHgwMDAwMjAwMDoKKwkJaWYgKHNjdGwgJiAweDAwMDAwMDQwKQorCQkJcmV0dXJuIDEwODAwMDsKKwkJcmV0dXJuIDEwMDAwMDsKKwljYXNlIDB4MDAwMDMwMDA6CisJCXNjbGsgPSByZWFkX3ZjbyhkZXYsIGNsayk7CisJCXNkaXYgPSAoKHNjdGwgJiAweDAwM2YwMDAwKSA+PiAxNikgKyAyOworCQlyZXR1cm4gKHNjbGsgKiAyKSAvIHNkaXY7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdTMyCityZWFkX3BsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xrLCB1MzIgcGxsKQoreworCXUzMiBjdHJsID0gbnZfcmQzMihkZXYsIHBsbCArIDApOworCXUzMiBzY2xrID0gMCwgUCA9IDEsIE4gPSAxLCBNID0gMTsKKworCWlmICghKGN0cmwgJiAweDAwMDAwMDA4KSkgeworCQlpZiAoY3RybCAmIDB4MDAwMDAwMDEpIHsKKwkJCXUzMiBjb2VmID0gbnZfcmQzMihkZXYsIHBsbCArIDQpOworCQkJTSA9IChjb2VmICYgMHgwMDAwMDBmZikgPj4gMDsKKwkJCU4gPSAoY29lZiAmIDB4MDAwMGZmMDApID4+IDg7CisJCQlQID0gKGNvZWYgJiAweDAwM2YwMDAwKSA+PiAxNjsKKworCQkJLyogbm8gcG9zdC1kaXZpZGVyIG9uIHRoZXNlLi4gKi8KKwkJCWlmICgocGxsICYgMHgwMGZmMDApID09IDB4MDBlODAwKQorCQkJCVAgPSAxOworCisJCQlzY2xrID0gcmVhZF9jbGsoZGV2LCAweDAwICsgY2xrLCBmYWxzZSk7CisJCX0KKwl9IGVsc2UgeworCQlzY2xrID0gcmVhZF9jbGsoZGV2LCAweDEwICsgY2xrLCBmYWxzZSk7CisJfQorCisJcmV0dXJuIHNjbGsgKiBOIC8gKE0gKiBQKTsKK30KKworc3RydWN0IGNyZWcgeworCXUzMiBjbGs7CisJdTMyIHBsbDsKIH07CiAKIHN0YXRpYyBpbnQKLW52YTNfcG1fcGxsX29mZnNldCh1MzIgaWQpCitjYWxjX2NsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xrLCB1MzIgcGxsLCB1MzIga2h6LCBzdHJ1Y3QgY3JlZyAqcmVnKQogewotCXN0YXRpYyBjb25zdCB1MzIgcGxsX21hcFtdID0gewotCQkweDAwLCBQTExfQ09SRSwKLQkJMHgwMSwgUExMX1NIQURFUiwKLQkJMHgwMiwgUExMX01FTU9SWSwKLQkJMHgwMCwgMHgwMAotCX07Ci0JY29uc3QgdTMyICptYXAgPSBwbGxfbWFwOworCXN0cnVjdCBwbGxfbGltcyBsaW1pdHM7CisJdTMyIG9jbGssIHNjbGssIHNkaXY7CisJaW50IFAsIE4sIE0sIGRpZmY7CisJaW50IHJldDsKIAotCXdoaWxlIChtYXBbMV0pIHsKLQkJaWYgKGlkID09IG1hcFsxXSkKLQkJCXJldHVybiBtYXBbMF07Ci0JCW1hcCArPSAyOworCXJlZy0+cGxsID0gMDsKKwlyZWctPmNsayA9IDA7CisJaWYgKCFraHopIHsKKwkJTlZfREVCVUcoZGV2LCAibm8gY2xvY2sgZm9yIDB4JTA0eC8weCUwMnhcbiIsIHBsbCwgY2xrKTsKKwkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIC1FTk9FTlQ7Ci19CisJc3dpdGNoIChraHopIHsKKwljYXNlIDI3MDAwOgorCQlyZWctPmNsayA9IDB4MDAwMDAxMDA7CisJCXJldHVybiBraHo7CisJY2FzZSAxMDAwMDA6CisJCXJlZy0+Y2xrID0gMHgwMDAwMjEwMDsKKwkJcmV0dXJuIGtoejsKKwljYXNlIDEwODAwMDoKKwkJcmVnLT5jbGsgPSAweDAwMDAyMTQwOworCQlyZXR1cm4ga2h6OworCWRlZmF1bHQ6CisJCXNjbGsgPSByZWFkX3ZjbyhkZXYsIGNsayk7CisJCXNkaXYgPSBtaW4oKHNjbGsgKiAyKSAvIChraHogLSAyOTk5KSwgKHUzMik2NSk7CisJCS8qIGlmIHRoZSBjbG9jayBoYXMgYSBQTEwgYXR0YWNoZWQsIGFuZCB3ZSBjYW4gZ2V0IGEgd2l0aGluCisJCSAqIFstMiwgMykgTUh6IG9mIGEgZGl2aWRlciwgd2UnbGwgZGlzYWJsZSB0aGUgUExMIGFuZCB1c2UKKwkJICogdGhlIGRpdmlkZXIgaW5zdGVhZC4KKwkJICoKKwkJICogZGl2aWRlciBjYW4gZ28gYXMgbG93IGFzIDIsIGxpbWl0ZWQgaGVyZSBiZWNhdXNlIE5WSURJQQorCQkgKiBhbmQgdGhlIFZCSU9TIG9uIG15IE5WQTggc2VlbSB0byBwcmVmZXIgdXNpbmcgdGhlIFBMTAorCQkgKiBmb3IgODEwTUh6IC0gaXMgdGhlcmUgYSBnb29kIHJlYXNvbj8KKwkJICovCisJCWlmIChzZGl2ID4gNCkgeworCQkJb2NsayA9IChzY2xrICogMikgLyBzZGl2OworCQkJZGlmZiA9IGtoeiAtIG9jbGs7CisJCQlpZiAoIXBsbCB8fCAoZGlmZiA+PSAtMjAwMCAmJiBkaWZmIDwgMzAwMCkpIHsKKwkJCQlyZWctPmNsayA9ICgoKHNkaXYgLSAyKSA8PCAxNikgfCAweDAwMDAzMTAwKTsKKwkJCQlyZXR1cm4gb2NsazsKKwkJCX0KKwkJfQogCi1pbnQKLW52YTNfcG1fY2xvY2tfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBpZCkKLXsKLQl1MzIgc3JjMCwgc3JjMSwgY3RybCwgY29lZjsKLQlzdHJ1Y3QgcGxsX2xpbXMgcGxsOwotCWludCByZXQsIG9mZjsKLQlpbnQgUCwgTiwgTTsKKwkJaWYgKCFwbGwpIHsKKwkJCU5WX0VSUk9SKGRldiwgImJhZCBmcmVxICUwMng6ICVkICVkXG4iLCBjbGssIGtoeiwgc2Nsayk7CisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJfQogCi0JcmV0ID0gZ2V0X3BsbF9saW1pdHMoZGV2LCBpZCwgJnBsbCk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGdldF9wbGxfbGltaXRzKGRldiwgcGxsLCAmbGltaXRzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2ZmID0gbnZhM19wbV9wbGxfb2Zmc2V0KGlkKTsKLQlpZiAob2ZmIDwgMCkKLQkJcmV0dXJuIG9mZjsKKwlsaW1pdHMucmVmY2xrID0gcmVhZF9jbGsoZGV2LCBjbGsgLSAweDEwLCB0cnVlKTsKKwlpZiAoIWxpbWl0cy5yZWZjbGspCisJCXJldHVybiAtRUlOVkFMOwogCi0Jc3JjMCA9IG52X3JkMzIoZGV2LCAweDQxMjAgKyAob2ZmICogNCkpOwotCXNyYzEgPSBudl9yZDMyKGRldiwgMHg0MTYwICsgKG9mZiAqIDQpKTsKLQljdHJsID0gbnZfcmQzMihkZXYsIHBsbC5yZWcgKyAwKTsKLQljb2VmID0gbnZfcmQzMihkZXYsIHBsbC5yZWcgKyA0KTsKLQlOVl9ERUJVRyhkZXYsICJQTEwgJTAyeDogMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAotCQkgICAgICBpZCwgc3JjMCwgc3JjMSwgY3RybCwgY29lZik7Ci0KLQlpZiAoY3RybCAmIDB4MDAwMDAwMDgpIHsKLQkJdTMyIGRpdiA9ICgoc3JjMSAmIDB4MDAzYzAwMDApID4+IDE4KSArIDE7Ci0JCXJldHVybiAocGxsLnJlZmNsayAqIDIpIC8gZGl2OworCXJldCA9IG52YTNfY2FsY19wbGwoZGV2LCAmbGltaXRzLCBraHosICZOLCBOVUxMLCAmTSwgJlApOworCWlmIChyZXQgPj0gMCkgeworCQlyZWctPmNsayA9IG52X3JkMzIoZGV2LCAweDQxMjAgKyAoY2xrICogNCkpOworCQlyZWctPnBsbCA9IChQIDw8IDE2KSB8IChOIDw8IDgpIHwgTTsKIAl9Ci0KLQlQID0gKGNvZWYgJiAweDAwM2YwMDAwKSA+PiAxNjsKLQlOID0gKGNvZWYgJiAweDAwMDBmZjAwKSA+PiA4OwotCU0gPSAoY29lZiAmIDB4MDAwMDAwZmYpOwotCXJldHVybiBwbGwucmVmY2xrICogTiAvIE0gLyBQOworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgKgotbnZhM19wbV9jbG9ja19wcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfcG1fbGV2ZWwgKnBlcmZsdmwsCi0JCSAgdTMyIGlkLCBpbnQga2h6KQorc3RhdGljIHZvaWQKK3Byb2dfcGxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjbGssIHUzMiBwbGwsIHN0cnVjdCBjcmVnICpyZWcpCiB7Ci0Jc3RydWN0IG52YTNfcG1fc3RhdGUgKnBsbDsKLQlzdHJ1Y3QgcGxsX2xpbXMgbGltaXRzOwotCWludCBOLCBNLCBQLCBkaWZmOwotCWludCByZXQsIG9mZjsKKwljb25zdCB1MzIgc3JjMCA9IDB4MDA0MTIwICsgKGNsayAqIDQpOworCWNvbnN0IHUzMiBzcmMxID0gMHgwMDQxNjAgKyAoY2xrICogNCk7CisJY29uc3QgdTMyIGN0cmwgPSBwbGwgKyAwOworCWNvbnN0IHUzMiBjb2VmID0gcGxsICsgNDsKKwl1MzIgY250bDsKIAotCXJldCA9IGdldF9wbGxfbGltaXRzKGRldiwgaWQsICZsaW1pdHMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gKHJldCA9PSAtRU5PRU5UKSA/IE5VTEwgOiBFUlJfUFRSKHJldCk7Ci0KLQlvZmYgPSBudmEzX3BtX3BsbF9vZmZzZXQoaWQpOwotCWlmIChpZCA8IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0KLQlwbGwgPSBremFsbG9jKHNpemVvZigqcGxsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbGwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCXBsbC0+dHlwZSA9IGlkOwotCXBsbC0+c3JjMCA9IDB4MDA0MTIwICsgKG9mZiAqIDQpOwotCXBsbC0+c3JjMSA9IDB4MDA0MTYwICsgKG9mZiAqIDQpOwotCXBsbC0+Y3RybCA9IGxpbWl0cy5yZWcgKyAwOwotCXBsbC0+Y29lZiA9IGxpbWl0cy5yZWcgKyA0OwotCi0JLyogSWYgdGFyZ2V0IGNsb2NrIGlzIHdpdGhpbiBbLTIsIDMpIE1IeiBvZiBhIGRpdmlzb3IsIHdlJ2xsCi0JICogdXNlIHRoYXQgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBNTlAgdmFsdWVzCi0JICovCi0JcGxsLT5uZXdfZGl2ID0gbWluKChsaW1pdHMucmVmY2xrICogMikgLyAoa2h6IC0gMjk5OSksIDE2KTsKLQlpZiAocGxsLT5uZXdfZGl2KSB7Ci0JCWRpZmYgPSBraHogLSAoKGxpbWl0cy5yZWZjbGsgKiAyKSAvIHBsbC0+bmV3X2Rpdik7Ci0JCWlmIChkaWZmIDwgLTIwMDAgfHwgZGlmZiA+PSAzMDAwKQotCQkJcGxsLT5uZXdfZGl2ID0gMDsKKwlpZiAoIXJlZy0+Y2xrICYmICFyZWctPnBsbCkgeworCQlOVl9ERUJVRyhkZXYsICJubyBjbG9jayBmb3IgJTAyeFxuIiwgY2xrKTsKKwkJcmV0dXJuOwogCX0KIAotCWlmICghcGxsLT5uZXdfZGl2KSB7Ci0JCXJldCA9IG52YTNfY2FsY19wbGwoZGV2LCAmbGltaXRzLCBraHosICZOLCBOVUxMLCAmTSwgJlApOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0KLQkJcGxsLT5uZXdfcG5tID0gKFAgPDwgMTYpIHwgKE4gPDwgOCkgfCBNOwotCQlwbGwtPm5ld19kaXYgPSAyIC0gMTsKKwljbnRsID0gbnZfcmQzMihkZXYsIGN0cmwpICYgMHhmZmZmZmZmMjsKKwlpZiAocmVnLT5wbGwpIHsKKwkJbnZfbWFzayhkZXYsIHNyYzAsIDB4MDAwMDAxMDEsIDB4MDAwMDAxMDEpOworCQludl93cjMyKGRldiwgY29lZiwgcmVnLT5wbGwpOworCQludl93cjMyKGRldiwgY3RybCwgY250bCB8IDB4MDAwMDAwMTUpOworCQludl9tYXNrKGRldiwgc3JjMSwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCBzcmMxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKIAl9IGVsc2UgewotCQlwbGwtPm5ld19wbm0gPSAwOwotCQlwbGwtPm5ld19kaXYtLTsKKwkJbnZfbWFzayhkZXYsIHNyYzEsIDB4MDAzZjMxNDEsIDB4MDAwMDAxMDEgfCByZWctPmNsayk7CisJCW52X3dyMzIoZGV2LCBjdHJsLCBjbnRsIHwgMHgwMDAwMDAxZCk7CisJCW52X21hc2soZGV2LCBjdHJsLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIHNyYzAsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDApOworCQludl9tYXNrKGRldiwgc3JjMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJvZ19jbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsaywgc3RydWN0IGNyZWcgKnJlZykKK3sKKwlpZiAoIXJlZy0+Y2xrKSB7CisJCU5WX0RFQlVHKGRldiwgIm5vIGNsb2NrIGZvciAlMDJ4XG4iLCBjbGspOworCQlyZXR1cm47CiAJfQogCi0JaWYgKChudl9yZDMyKGRldiwgcGxsLT5zcmMxKSAmIDB4MDAwMDAxMDEpICE9IDB4MDAwMDAxMDEpCi0JCXBsbC0+b2xkX3BubSA9IG52X3JkMzIoZGV2LCBwbGwtPmNvZWYpOwotCXJldHVybiBwbGw7CisJbnZfbWFzayhkZXYsIDB4MDA0MTIwICsgKGNsayAqIDQpLCAweDAwM2YzMTQxLCAweDAwMDAwMTAxIHwgcmVnLT5jbGspOworfQorCitpbnQKK252YTNfcG1fY2xvY2tzX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCkKK3sKKwlwZXJmbHZsLT5jb3JlICAgPSByZWFkX3BsbChkZXYsIDB4MDAsIDB4NDIwMCk7CisJcGVyZmx2bC0+c2hhZGVyID0gcmVhZF9wbGwoZGV2LCAweDAxLCAweDQyMjApOworCXBlcmZsdmwtPm1lbW9yeSA9IHJlYWRfcGxsKGRldiwgMHgwMiwgMHg0MDAwKTsKKwlwZXJmbHZsLT51bmthMCAgPSByZWFkX2NsayhkZXYsIDB4MjAsIGZhbHNlKTsKKwlwZXJmbHZsLT52ZGVjICAgPSByZWFkX2NsayhkZXYsIDB4MjEsIGZhbHNlKTsKKwlwZXJmbHZsLT5kYWVtb24gPSByZWFkX2NsayhkZXYsIDB4MjUsIGZhbHNlKTsKKwlwZXJmbHZsLT5jb3B5ICAgPSBwZXJmbHZsLT5jb3JlOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbnZhM19wbV9zdGF0ZSB7CisJc3RydWN0IGNyZWcgbmNsazsKKwlzdHJ1Y3QgY3JlZyBzY2xrOworCXN0cnVjdCBjcmVnIG1jbGs7CisJc3RydWN0IGNyZWcgdmRlYzsKKwlzdHJ1Y3QgY3JlZyB1bmthMDsKK307CisKK3ZvaWQgKgorbnZhM19wbV9jbG9ja3NfcHJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICpwZXJmbHZsKQoreworCXN0cnVjdCBudmEzX3BtX3N0YXRlICppbmZvOworCWludCByZXQ7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0ID0gY2FsY19jbGsoZGV2LCAweDEwLCAweDQyMDAsIHBlcmZsdmwtPmNvcmUsICZpbmZvLT5uY2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjYWxjX2NsayhkZXYsIDB4MTEsIDB4NDIyMCwgcGVyZmx2bC0+c2hhZGVyLCAmaW5mby0+c2Nsayk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gY2FsY19jbGsoZGV2LCAweDEyLCAweDQwMDAsIHBlcmZsdmwtPm1lbW9yeSwgJmluZm8tPm1jbGspOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGNhbGNfY2xrKGRldiwgMHgyMCwgMHgwMDAwLCBwZXJmbHZsLT51bmthMCwgJmluZm8tPnVua2EwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjYWxjX2NsayhkZXYsIDB4MjEsIDB4MDAwMCwgcGVyZmx2bC0+dmRlYywgJmluZm8tPnZkZWMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworb3V0OgorCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGluZm8pOworCQlpbmZvID0gRVJSX1BUUihyZXQpOworCX0KKwlyZXR1cm4gaW5mbzsKK30KKworc3RhdGljIGJvb2wKK252YTNfcG1fZ3JjcF9pZGxlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpZiAoIShudl9yZDMyKGRldiwgMHg0MDAzMDQpICYgMHgwMDAwMDAwMSkpCisJCXJldHVybiB0cnVlOworCWlmIChudl9yZDMyKGRldiwgMHg0MDAzMDgpID09IDB4MDA1MDAwMWMpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogdm9pZAotbnZhM19wbV9jbG9ja19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqcHJlX3N0YXRlKQorbnZhM19wbV9jbG9ja3Nfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKnByZV9zdGF0ZSkKIHsKLQlzdHJ1Y3QgbnZhM19wbV9zdGF0ZSAqcGxsID0gcHJlX3N0YXRlOwotCXUzMiBjdHJsID0gMDsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmEzX3BtX3N0YXRlICppbmZvID0gcHJlX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBGb3IgdGhlIG1lbW9yeSBjbG9jaywgTlZJRElBIHdpbGwgYnVpbGQgYSAic2NyaXB0IiBkZXNjcmliaW5nCi0JICogdGhlIHJlY2xvY2tpbmcgcHJvY2VzcyBhbmQgYXNrIFBEQUVNT04gdG8gZXhlY3V0ZSBpdC4KLQkgKi8KLQlpZiAocGxsLT50eXBlID09IFBMTF9NRU1PUlkpIHsKKwkvKiBwcmV2ZW50IGFueSBuZXcgZ3JjdHggc3dpdGNoZXMgZnJvbSBzdGFydGluZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCW52X3dyMzIoZGV2LCAweDQwMDMyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMzI4LCAweDAwNTAwMDFjKTsgLyogd2FpdCBmbGFnIDB4MWMgKi8KKwkvKiB3YWl0IGZvciBhbnkgcGVuZGluZyBncmN0eCBzd2l0Y2hlcyB0byBjb21wbGV0ZSAqLworCWlmICghbnZfd2FpdF9jYihkZXYsIG52YTNfcG1fZ3JjcF9pZGxlLCBkZXYpKSB7CisJCU5WX0VSUk9SKGRldiwgInBtOiBjdHhwcm9nIGRpZG4ndCBnbyBpZGxlXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwkvKiBmcmVlemUgUEZJRk8gKi8KKwludl9tYXNrKGRldiwgMHgwMDI1MDQsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCWlmICghbnZfd2FpdChkZXYsIDB4MDAyNTA0LCAweDAwMDAwMDEwLCAweDAwMDAwMDEwKSkgeworCQlOVl9FUlJPUihkZXYsICJwbTogZmlmbyBkaWRuJ3QgZ28gaWRsZVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlwcm9nX3BsbChkZXYsIDB4MDAsIDB4MDA0MjAwLCAmaW5mby0+bmNsayk7CisJcHJvZ19wbGwoZGV2LCAweDAxLCAweDAwNDIyMCwgJmluZm8tPnNjbGspOworCXByb2dfY2xrKGRldiwgMHgyMCwgJmluZm8tPnVua2EwKTsKKwlwcm9nX2NsayhkZXYsIDB4MjEsICZpbmZvLT52ZGVjKTsKKworCWlmIChpbmZvLT5tY2xrLmNsayB8fCBpbmZvLT5tY2xrLnBsbCkgewogCQludl93cjMyKGRldiwgMHgxMDAyMTAsIDApOwogCQludl93cjMyKGRldiwgMHgxMDAyZGMsIDEpOwogCQludl93cjMyKGRldiwgMHgwMDQwMTgsIDB4MDAwMDEwMDApOwotCQljdHJsID0gMHgxODAwMDEwMDsKLQl9Ci0KLQlpZiAocGxsLT5vbGRfcG5tIHx8ICFwbGwtPm5ld19wbm0pIHsKLQkJbnZfbWFzayhkZXYsIHBsbC0+c3JjMSwgMHgwMDNjMDEwMSwgMHgwMDAwMDEwMSB8Ci0JCQkJCQkgICAgKHBsbC0+bmV3X2RpdiA8PCAxOCkpOwotCQludl93cjMyKGRldiwgcGxsLT5jdHJsLCAweDAwMDEwMDFkIHwgY3RybCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPmN0cmwsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOwotCX0KLQotCWlmIChwbGwtPm5ld19wbm0pIHsKLQkJbnZfbWFzayhkZXYsIHBsbC0+c3JjMCwgMHgwMDAwMDEwMSwgMHgwMDAwMDEwMSk7Ci0JCW52X3dyMzIoZGV2LCBwbGwtPmNvZWYsIHBsbC0+bmV3X3BubSk7Ci0JCW52X3dyMzIoZGV2LCBwbGwtPmN0cmwsIDB4MDAwMTAwMWQgfCBjdHJsKTsKLQkJbnZfbWFzayhkZXYsIHBsbC0+Y3RybCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPmN0cmwsIDB4MDAwMjAwMTAsIDB4MDAwMjAwMTApOwotCQludl93cjMyKGRldiwgcGxsLT5jdHJsLCAweDAwMDEwMDE1IHwgY3RybCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPnNyYzEsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDApOwotCQludl9tYXNrKGRldiwgcGxsLT5zcmMxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKLQkJaWYgKHBsbC0+dHlwZSA9PSBQTExfTUVNT1JZKQotCQkJbnZfd3IzMihkZXYsIDB4NDAxOCwgMHgxMDAwNTAwMCk7Ci0JfSBlbHNlIHsKLQkJbnZfbWFzayhkZXYsIHBsbC0+Y3RybCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7Ci0JCW52X21hc2soZGV2LCBwbGwtPnNyYzAsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDApOwotCQludl9tYXNrKGRldiwgcGxsLT5zcmMwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKLQkJaWYgKHBsbC0+dHlwZSA9PSBQTExfTUVNT1JZKQotCQkJbnZfd3IzMihkZXYsIDB4NDAxOCwgMHgxMDAwZDAwMCk7Ci0JfQotCi0JaWYgKHBsbC0+dHlwZSA9PSBQTExfTUVNT1JZKSB7CisJCXByb2dfcGxsKGRldiwgMHgwMiwgMHgwMDQwMDAsICZpbmZvLT5tY2xrKTsKKwkJaWYgKG52X3JkMzIoZGV2LCAweDQwMDApICYgMHgwMDAwMDAwOCkKKwkJCW52X3dyMzIoZGV2LCAweDAwNDAxOCwgMHgxMDAwZDAwMCk7CisJCWVsc2UKKwkJCW52X3dyMzIoZGV2LCAweDAwNDAxOCwgMHgxMDAwNTAwMCk7CiAJCW52X3dyMzIoZGV2LCAweDEwMDJkYywgMCk7CiAJCW52X3dyMzIoZGV2LCAweDEwMDIxMCwgMHg4MDAwMDAwMCk7CiAJfQogCi0Ja2ZyZWUocGxsKTsKK2NsZWFudXA6CisJLyogdW5mcmVlemUgUEZJRk8gKi8KKwludl9tYXNrKGRldiwgMHgwMDI1MDQsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCS8qIHJlc3RvcmUgY3R4cHJvZyB0byBub3JtYWwgKi8KKwludl93cjMyKGRldiwgMHg0MDAzMjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDMyOCwgMHgwMDcwMDA5Yyk7IC8qIHNldCBmbGFnIDB4MWMgKi8KKwkvKiB1bmJsb2NrIGl0IGlmIG5lY2Vzc2FyeSAqLworCWlmIChudl9yZDMyKGRldiwgMHg0MDAzMDgpID09IDB4MDA1MDAwMWMpCisJCW52X21hc2soZGV2LCAweDQwMDgyNCwgMHgxMDAwMDAwMCwgMHgxMDAwMDAwMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlrZnJlZShpbmZvKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9mYi5jCmluZGV4IDA4ZTZiMTEuLjViZjU1MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiLmMKQEAgLTMyLDYgKzMyLDMwIEBACiAJZG1hX2FkZHJfdCByMTAwYzEwOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkCitudmMwX21mYl9zdWJwX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdW5pdCwgaW50IHN1YnApCit7CisJdTMyIHN1YnBfYmFzZSA9IDB4MTQxMDAwICsgKHVuaXQgKiAweDIwMDApICsgKHN1YnAgKiAweDQwMCk7CisJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgc3VicF9iYXNlICsgMHgwMjApOworCisJaWYgKHN0YXQpIHsKKwkJTlZfSU5GTyhkZXYsICJQTUZCJWRfU1VCUCVkOiAweCUwOHhcbiIsIHVuaXQsIHN1YnAsIHN0YXQpOworCQludl93cjMyKGRldiwgc3VicF9iYXNlICsgMHgwMjAsIHN0YXQpOworCX0KK30KKworc3RhdGljIHZvaWQKK252YzBfbWZiX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiB1bml0cyA9IG52X3JkMzIoZGV2LCAweDAwMDE3Yyk7CisJd2hpbGUgKHVuaXRzKSB7CisJCXUzMiBzdWJwLCB1bml0ID0gZmZzKHVuaXRzKSAtIDE7CisJCWZvciAoc3VicCA9IDA7IHN1YnAgPCAyOyBzdWJwKyspCisJCQludmMwX21mYl9zdWJwX2lzcihkZXYsIHVuaXQsIHN1YnApOworCQl1bml0cyAmPSB+KDEgPDwgdW5pdCk7CisJfQorfQorCiBzdGF0aWMgdm9pZAogbnZjMF9mYl9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC0zOSw2ICs2Myw4IEBACiAJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICpwZmIgPSAmZGV2X3ByaXYtPmVuZ2luZS5mYjsKIAlzdHJ1Y3QgbnZjMF9mYl9wcml2ICpwcml2ID0gcGZiLT5wcml2OwogCisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDI1KTsKKwogCWlmIChwcml2LT5yMTAwYzEwX3BhZ2UpIHsKIAkJcGNpX3VubWFwX3BhZ2UoZGV2LT5wZGV2LCBwcml2LT5yMTAwYzEwLCBQQUdFX1NJWkUsCiAJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKQEAgLTc0LDYgKzEwMCw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMjUsIG52YzBfbWZiX2lzcik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9maWZvLmMKaW5kZXggNmY5ZjM0MS4uZGNiZTBkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9maWZvLmMKQEAgLTMyMiw3ICszMjIsNyBAQAogCX0KIAogCS8qIFBTVUJGSUZPW25dICovCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zcG9vbl9ucjsgaSsrKSB7CiAJCW52X21hc2soZGV2LCAweDA0MDEzYyArIChpICogMHgyMDAwKSwgMHgxMDAwMDEwMCwgMHgwMDAwMDAwMCk7CiAJCW52X3dyMzIoZGV2LCAweDA0MDEwOCArIChpICogMHgyMDAwKSwgMHhmZmZmZmZmZik7IC8qIElOVFIgKi8KIAkJbnZfd3IzMihkZXYsIDB4MDQwMTBjICsgKGkgKiAweDIwMDApLCAweGZmZmZmZWZmKTsgLyogSU5UUl9FTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jCmluZGV4IDViMmY2ZjQuLmE3NGU1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImRybVAuaCIKIApAQCAtMTU2LDggKzE1Nyw4IEBACiAJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9IG52X2VuZ2luZShjaGFuLT5kZXYsIE5WT0JKX0VOR0lORV9HUik7CiAJc3RydWN0IG52YzBfZ3JhcGhfY2hhbiAqZ3JjaCA9IGNoYW4tPmVuZ2N0eFtOVk9CSl9FTkdJTkVfR1JdOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSA9IDAsIGdwYywgdHAsIHJldDsKLQl1MzIgbWFnaWM7CiAKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAweDIwMDAsIDI1NiwgTlZPQkpfRkxBR19WTSwKIAkJCQkgJmdyY2gtPnVuazQwODAwNCk7CkBAIC0yMDYsMTQgKzIwNywzNyBAQAogCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQxODgwYyk7CiAJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDgwMDAwMDE4KTsKIAotCW1hZ2ljID0gMHgwMjE4MDAwMDsKLQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDU4MzApOwotCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMpOwotCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgewotCQlmb3IgKHRwID0gMDsgdHAgPCBwcml2LT50cF9ucltncGNdOyB0cCsrLCBtYWdpYyArPSAweDAzMjQpIHsKLQkJCXUzMiByZWcgPSAweDUwNDUyMCArIChncGMgKiAweDgwMDApICsgKHRwICogMHgwODAwKTsKLQkJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgcmVnKTsKLQkJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMpOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGMxKSB7CisJCXUzMiBtYWdpYyA9IDB4MDIxODAwMDA7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQwNTgzMCk7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMpOworCQlmb3IgKGdwYyA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyspIHsKKwkJCQl1MzIgcmVnID0gVFBfVU5JVChncGMsIHRwLCAweDUyMCk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCByZWcpOworCQkJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMpOworCQkJCW1hZ2ljICs9IDB4MDMyNDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXUzMiBtYWdpYyA9IDB4MDIxODAwMDA7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQwNTgzMCk7CisJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMgfCAweDAwMDAyMTgpOworCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDY0YzQpOworCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA4NmZmZmYpOworCQlmb3IgKGdwYyA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyspIHsKKwkJCQl1MzIgcmVnID0gVFBfVU5JVChncGMsIHRwLCAweDUyMCk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCByZWcpOworCQkJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgKDEgPDwgMjgpIHwgbWFnaWMpOworCQkJCW1hZ2ljICs9IDB4MDMyNDsKKwkJCX0KKwkJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyspIHsKKwkJCQl1MzIgcmVnID0gVFBfVU5JVChncGMsIHRwLCAweDU0NCk7CisJCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCByZWcpOworCQkJCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgbWFnaWMpOworCQkJCW1hZ2ljICs9IDB4MDMyNDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzkwLDcgKzQxNCw3IEBACiAJfQogCiAJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDFiZDQpLCBtYWdpY2dwYzkxOCk7Ci0JbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YWMpLCBwcml2LT5yb3BfbnIpOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOGFjKSwgbnZfcmQzMihkZXYsIDB4MTAwODAwKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC03MDAsMjIgKzcyNCw2IEBACiAJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKIH0KIAotc3RhdGljIHZvaWQKLW52YzBfcnVuazE0MF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQl1MzIgdW5pdHMgPSBudl9yZDMyKGRldiwgMHgwMDAxN2MpICYgMHgxZjsKLQotCXdoaWxlICh1bml0cykgewotCQl1MzIgdW5pdCA9IGZmcyh1bml0cykgLSAxOwotCQl1MzIgcmVnID0gMHgxNDAwMDAgKyB1bml0ICogMHgyMDAwOwotCQl1MzIgc3QwID0gbnZfbWFzayhkZXYsIHJlZyArIDB4MTAyMCwgMCwgMCk7Ci0JCXUzMiBzdDEgPSBudl9tYXNrKGRldiwgcmVnICsgMHgxNDIwLCAwLCAwKTsKLQotCQlOVl9ERUJVRyhkZXYsICJQUlVOSzE0MDogJWQgMHglMDh4IDB4JTA4eFxuIiwgdW5pdCwgc3QwLCBzdDEpOwotCQl1bml0cyAmPSB+KDEgPDwgdW5pdCk7Ci0JfQotfQotCiBzdGF0aWMgaW50CiBudmMwX2dyYXBoX2NyZWF0ZV9mdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmd25hbWUsCiAJCSAgICAgc3RydWN0IG52YzBfZ3JhcGhfZnVjICpmdWMpCkBAIC03NjQsNyArNzcyLDYgQEAKIAl9CiAKIAlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOwotCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAyNSk7CiAKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnVuazQxODhiOCk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT51bms0MTg4YjQpOwpAQCAtODAzLDcgKzgxMCw2IEBACiAKIAlOVk9CSl9FTkdJTkVfQUREKGRldiwgR1IsICZwcml2LT5iYXNlKTsKIAlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDEyLCBudmMwX2dyYXBoX2lzcik7Ci0Jbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNSwgbnZjMF9ydW5rMTQwX2lzcik7CiAKIAlpZiAobm91dmVhdV9jdHhmdykgewogCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogdXNpbmcgZXh0ZXJuYWwgZmlybXdhcmVcbiIpOwpAQCAtODY0LDYgKzg3MCw5IEBACiAJY2FzZSAweGNlOiAvKiA0LzQvMC8wLCA0ICovCiAJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPSAweDAzOwogCQlicmVhazsKKwljYXNlIDB4Y2Y6IC8qIDQvMC8wLzAsIDMgKi8KKwkJcHJpdi0+bWFnaWNfbm90X3JvcF9uciA9IDB4MDM7CisJCWJyZWFrOwogCX0KIAogCWlmICghcHJpdi0+bWFnaWNfbm90X3JvcF9ucikgewpAQCAtODg5LDIwICs4OTgsMyBAQAogCW52YzBfZ3JhcGhfZGVzdHJveShkZXYsIE5WT0JKX0VOR0lORV9HUik7CiAJcmV0dXJuIHJldDsKIH0KLQotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzBfZnVjNDA5YyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzBfZnVjNDA5ZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzBfZnVjNDFhYyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzBfZnVjNDFhZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzNfZnVjNDA5YyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzNfZnVjNDA5ZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzNfZnVjNDFhYyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzNfZnVjNDFhZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzRfZnVjNDA5YyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzRfZnVjNDA5ZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzRfZnVjNDFhYyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L252YzRfZnVjNDFhZCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L2Z1YzQwOWMiKTsKLU1PRFVMRV9GSVJNV0FSRSgibm91dmVhdS9mdWM0MDlkIik7Ci1NT0RVTEVfRklSTVdBUkUoIm5vdXZlYXUvZnVjNDFhYyIpOwotTU9EVUxFX0ZJUk1XQVJFKCJub3V2ZWF1L2Z1YzQxYWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaAppbmRleCA1NTY4OWU5Li42MzZmZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5oCkBAIC04Miw2ICs4Miw3IEBACiAJY2FzZSAweGMzOgogCWNhc2UgMHhjNDoKIAljYXNlIDB4Y2U6IC8qIGd1ZXNzLCBtbWlvIHRyYWNlIHNob3dzIG9ubHkgMHg5MDk3IHN0YXRlICovCisJY2FzZSAweGNmOiAvKiBndWVzcywgbW1pbyB0cmFjZSBzaG93cyBvbmx5IDB4OTA5NyBzdGF0ZSAqLwogCQlyZXR1cm4gMHg5MDk3OwogCWNhc2UgMHhjMToKIAkJcmV0dXJuIDB4OTE5NzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JjdHguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JjdHguYwppbmRleCAzMTAxOGVhLi45NmIwYjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyY3R4LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jCkBAIC0xNjc4LDcgKzE2NzgsMTAgQEAKIAludl93cjMyKGRldiwgMHg0MTljMDQsIDB4MDAwMDAwMDYpOwogCW52X3dyMzIoZGV2LCAweDQxOWMwOCwgMHgwMDAwMDAwMik7CiAJbnZfd3IzMihkZXYsIDB4NDE5YzIwLCAweDAwMDAwMDAwKTsKLQludl93cjMyKGRldiwgMHg0MTljYjAsIDB4MDAwNjAwNDgpOyAvL1hYWDogMHhjZSAweDAwMDIwMDQ4CisJaWYgKGNoaXBzZXQgPT0gMHhjZSB8fCBjaGlwc2V0ID09IDB4Y2YpCisJCW52X3dyMzIoZGV2LCAweDQxOWNiMCwgMHgwMDAyMDA0OCk7CisJZWxzZQorCQludl93cjMyKGRldiwgMHg0MTljYjAsIDB4MDAwNjAwNDgpOwogCW52X3dyMzIoZGV2LCAweDQxOWNlOCwgMHgwMDAwMDAwMCk7CiAJbnZfd3IzMihkZXYsIDB4NDE5Y2Y0LCAweDAwMDAwMTgzKTsKIAludl93cjMyKGRldiwgMHg0MTlkMjAsIGNoaXBzZXQgIT0gMHhjMSA/IDB4MDIxODAwMDAgOiAweDEyMTgwMDAwKTsKQEAgLTE3ODMsMTEgKzE3ODYsNyBAQAogCW52X3dyMzIoZGV2LCAweDQwNTg3YywgMHgwMDAwMDAwMCk7CiAKIAlpZiAoMSkgewotCQljb25zdCB1OCBjaGlwc2V0X3RwX21heFtdID0geyAxNiwgNCwgMCwgNCwgOCwgMCwgMCwgMCwKLQkJCQkJICAgICAgMTYsIDAsIDAsIDAsIDAsIDAsIDgsIDAgfTsKLQkJdTggbWF4ID0gY2hpcHNldF90cF9tYXhbZGV2X3ByaXYtPmNoaXBzZXQgJiAweDBmXTsKLQkJdTggdHBucltHUENfTUFYXTsKLQkJdTggZGF0YVtUUF9NQVhdOworCQl1OCB0cG5yW0dQQ19NQVhdLCBkYXRhW1RQX01BWF07CiAKIAkJbWVtY3B5KHRwbnIsIHByaXYtPnRwX25yLCBzaXplb2YocHJpdi0+dHBfbnIpKTsKIAkJbWVtc2V0KGRhdGEsIDB4MWYsIHNpemVvZihkYXRhKSk7CkBAIC0xODAxLDcgKzE4MDAsNyBAQAogCQkJZGF0YVt0cF0gPSBncGM7CiAJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgbWF4IC8gNDsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJbnZfd3IzMihkZXYsIDB4NDA2MGE4ICsgKGkgKiA0KSwgKCh1MzIgKilkYXRhKVtpXSk7CiAJfQogCkBAIC0xODEzLDYgKzE4MTIsNyBAQAogCQkvKiBjYWxjdWxhdGUgZmlyc3Qgc2V0IG9mIG1hZ2ljcyAqLwogCQltZW1jcHkodHBuciwgcHJpdi0+dHBfbnIsIHNpemVvZihwcml2LT50cF9ucikpOwogCisJCWdwYyA9IC0xOwogCQlmb3IgKHRwID0gMDsgdHAgPCBwcml2LT50cF90b3RhbDsgdHArKykgewogCQkJZG8gewogCQkJCWdwYyA9IChncGMgKyAxKSAlIHByaXYtPmdwY19ucjsKQEAgLTE4NjIsMzAgKzE4NjIsMjYgQEAKIAogCWlmICgxKSB7CiAJCXUzMiB0cF9tYXNrID0gMCwgdHBfc2V0ID0gMDsKLQkJdTggIHRwbnJbR1BDX01BWF07CisJCXU4ICB0cG5yW0dQQ19NQVhdLCBhLCBiOwogCiAJCW1lbWNweSh0cG5yLCBwcml2LT50cF9uciwgc2l6ZW9mKHByaXYtPnRwX25yKSk7CiAJCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykKIAkJCXRwX21hc2sgfD0gKCgxIDw8IHByaXYtPnRwX25yW2dwY10pIC0gMSkgPDwgKGdwYyAqIDgpOwogCi0JCWdwYyA9IC0xOwotCQlmb3IgKGkgPSAwLCBncGMgPSAtMTsgaSA8IDMyOyBpKyspIHsKLQkJCWludCBsdHAgPSBpICogKHByaXYtPnRwX3RvdGFsIC0gMSkgLyAzMjsKKwkJZm9yIChpID0gMCwgZ3BjID0gLTEsIGIgPSAtMTsgaSA8IDMyOyBpKyspIHsKKwkJCWEgPSAoaSAqIChwcml2LT50cF90b3RhbCAtIDEpKSAvIDMyOworCQkJaWYgKGEgIT0gYikgeworCQkJCWIgPSBhOworCQkJCWRvIHsKKwkJCQkJZ3BjID0gKGdwYyArIDEpICUgcHJpdi0+Z3BjX25yOworCQkJCX0gd2hpbGUgKCF0cG5yW2dwY10pOworCQkJCXRwID0gcHJpdi0+dHBfbnJbZ3BjXSAtIHRwbnJbZ3BjXS0tOwogCi0JCQlkbyB7Ci0JCQkJZ3BjID0gKGdwYyArIDEpICUgcHJpdi0+Z3BjX25yOwotCQkJfSB3aGlsZSAoIXRwbnJbZ3BjXSk7Ci0JCQl0cCA9IHByaXYtPnRwX25yW2dwY10gLSB0cG5yW2dwY10tLTsKKwkJCQl0cF9zZXQgfD0gMSA8PCAoKGdwYyAqIDgpICsgdHApOworCQkJfQogCi0JCQl0cF9zZXQgfD0gMSA8PCAoKGdwYyAqIDgpICsgdHApOwotCi0JCQlkbyB7Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDA2ODAwICsgKGkgKiAweDIwKSwgdHBfc2V0KTsKLQkJCQl0cF9zZXQgXj0gdHBfbWFzazsKLQkJCQludl93cjMyKGRldiwgMHg0MDZjMDAgKyAoaSAqIDB4MjApLCB0cF9zZXQpOwotCQkJCXRwX3NldCBePSB0cF9tYXNrOwotCQkJfSB3aGlsZSAobHRwID09ICgrK2kgKiAocHJpdi0+dHBfdG90YWwgLSAxKSAvIDMyKSk7Ci0JCQlpLS07CisJCQludl93cjMyKGRldiwgMHg0MDY4MDAgKyAoaSAqIDB4MjApLCB0cF9zZXQpOworCQkJbnZfd3IzMihkZXYsIDB4NDA2YzAwICsgKGkgKiAweDIwKSwgdHBfc2V0IF4gdHBfbWFzayk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JncGMuZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMKaW5kZXggMGVjMmFkZC4uMDZmNWUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMKQEAgLTc3LDYgKzc3LDExIEBACiAuYjE2IG52YzBfZ3BjX21taW9fdGFpbAogLmIxNiBudmMwX3RwY19tbWlvX2hlYWQKIC5iMTYgbnZjM190cGNfbW1pb190YWlsCisuYjggIDB4Y2YgMCAwIDAKKy5iMTYgbnZjMF9ncGNfbW1pb19oZWFkCisuYjE2IG52YzBfZ3BjX21taW9fdGFpbAorLmIxNiBudmMwX3RwY19tbWlvX2hlYWQKKy5iMTYgbnZjZl90cGNfbW1pb190YWlsCiAuYjggIDAgMCAwIDAKIAogLy8gR1BDIG1taW8gbGlzdHMKQEAgLTEzNCw4ICsxMzksOSBAQAogbnZjMF90cGNfbW1pb190YWlsOgogbW1jdHhfZGF0YSgweDAwMDc1OCwgMSkKIG1tY3R4X2RhdGEoMHgwMDAyYzQsIDEpCi1tbWN0eF9kYXRhKDB4MDAwNGJjLCAxKQogbW1jdHhfZGF0YSgweDAwMDZlMCwgMSkKK252Y2ZfdHBjX21taW9fdGFpbDoKK21tY3R4X2RhdGEoMHgwMDA0YmMsIDEpCiBudmMzX3RwY19tbWlvX3RhaWw6CiBtbWN0eF9kYXRhKDB4MDAwNTQ0LCAxKQogbnZjMV90cGNfbW1pb190YWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JncGMuZnVjLmgKaW5kZXggMTg5NmM4OS4uNmY4MjAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmdwYy5mdWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyZ3BjLmZ1Yy5oCkBAIC0yNSwyMyArMjUsMjYgQEAKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDBjMCwKLQkweDAxMTAwMGIwLAotCTB4MDE2NDAxMTQsCisJMHgwMTFjMDBiYywKKwkweDAxNzAwMTIwLAogCTB4MDAwMDAwYzEsCi0JMHgwMTE0MDBiMCwKLQkweDAxNzgwMTE0LAorCTB4MDEyMDAwYmMsCisJMHgwMTg0MDEyMCwKIAkweDAwMDAwMGMzLAotCTB4MDExMDAwYjAsCi0JMHgwMTc0MDExNCwKKwkweDAxMWMwMGJjLAorCTB4MDE4MDAxMjAsCiAJMHgwMDAwMDBjNCwKLQkweDAxMTAwMGIwLAotCTB4MDE3NDAxMTQsCisJMHgwMTFjMDBiYywKKwkweDAxODAwMTIwLAogCTB4MDAwMDAwYzgsCi0JMHgwMTEwMDBiMCwKLQkweDAxNjQwMTE0LAorCTB4MDExYzAwYmMsCisJMHgwMTcwMDEyMCwKIAkweDAwMDAwMGNlLAotCTB4MDExMDAwYjAsCi0JMHgwMTc0MDExNCwKKwkweDAxMWMwMGJjLAorCTB4MDE4MDAxMjAsCisJMHgwMDAwMDBjZiwKKwkweDAxMWMwMGJjLAorCTB4MDE3YzAxMjAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMzgwLAogCTB4MTQwMDA0MDAsCkBAIC05MCw4ICs5Myw4IEBACiAJMHgwNDAwMDc1MCwKIAkweDAwMDAwNzU4LAogCTB4MDAwMDAyYzQsCi0JMHgwMDAwMDRiYywKIAkweDAwMDAwNmUwLAorCTB4MDAwMDA0YmMsCiAJMHgwMDAwMDU0NCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JodWIuZnVjIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMKaW5kZXggYTFhNTk5MS4uZTRmOGM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMKQEAgLTU2LDYgKzU2LDkgQEAKIC5iOCAgMHhjZSAwIDAgMAogLmIxNiBudmMwX2h1Yl9tbWlvX2hlYWQKIC5iMTYgbnZjMF9odWJfbW1pb190YWlsCisuYjggIDB4Y2YgMCAwIDAKKy5iMTYgbnZjMF9odWJfbW1pb19oZWFkCisuYjE2IG52YzBfaHViX21taW9fdGFpbAogLmI4ICAwIDAgMCAwCiAKIG52YzBfaHViX21taW9faGVhZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JodWIuZnVjLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyaHViLmZ1Yy5oCmluZGV4IGIzYjU0MWIuLjI0MWQzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JodWIuZnVjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmh1Yi5mdWMuaApAQCAtMjMsMTcgKzIzLDE5IEBACiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAogCTB4MDAwMDAwYzAsCi0JMHgwMTJjMDA5MCwKKwkweDAxMzQwMDk4LAogCTB4MDAwMDAwYzEsCi0JMHgwMTMwMDA5MCwKKwkweDAxMzgwMDk4LAogCTB4MDAwMDAwYzMsCi0JMHgwMTJjMDA5MCwKKwkweDAxMzQwMDk4LAogCTB4MDAwMDAwYzQsCi0JMHgwMTJjMDA5MCwKKwkweDAxMzQwMDk4LAogCTB4MDAwMDAwYzgsCi0JMHgwMTJjMDA5MCwKKwkweDAxMzQwMDk4LAogCTB4MDAwMDAwY2UsCi0JMHgwMTJjMDA5MCwKKwkweDAxMzQwMDk4LAorCTB4MDAwMDAwY2YsCisJMHgwMTM0MDA5OCwKIAkweDAwMDAwMDAwLAogCTB4MDQxN2U5MWMsCiAJMHgwNDQwMDIwNCwKQEAgLTE5MCw4ICsxOTIsNiBAQAogCTB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKIH07CiAKIHVpbnQzMl90IG52YzBfZ3JodWJfY29kZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOWFkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3BtLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfYmlvcy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcG0uaCIKKworc3RhdGljIHUzMiByZWFkX2RpdihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHUzMiwgdTMyKTsKK3N0YXRpYyB1MzIgcmVhZF9wbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgdTMyKTsKKworc3RhdGljIHUzMgorcmVhZF92Y28oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGRzcmMpCit7CisJdTMyIHNzcmMgPSBudl9yZDMyKGRldiwgZHNyYyk7CisJaWYgKCEoc3NyYyAmIDB4MDAwMDAxMDApKQorCQlyZXR1cm4gcmVhZF9wbGwoZGV2LCAweDAwZTgwMCk7CisJcmV0dXJuIHJlYWRfcGxsKGRldiwgMHgwMGU4MjApOworfQorCitzdGF0aWMgdTMyCityZWFkX3BsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgcGxsKQoreworCXUzMiBjdHJsID0gbnZfcmQzMihkZXYsIHBsbCArIDApOworCXUzMiBjb2VmID0gbnZfcmQzMihkZXYsIHBsbCArIDQpOworCXUzMiBQID0gKGNvZWYgJiAweDAwM2YwMDAwKSA+PiAxNjsKKwl1MzIgTiA9IChjb2VmICYgMHgwMDAwZmYwMCkgPj4gODsKKwl1MzIgTSA9IChjb2VmICYgMHgwMDAwMDBmZikgPj4gMDsKKwl1MzIgc2NsaywgZG9mZjsKKworCWlmICghKGN0cmwgJiAweDAwMDAwMDAxKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHBsbCAmIDB4ZmZmMDAwKSB7CisJY2FzZSAweDAwZTAwMDoKKwkJc2NsayA9IDI3MDAwOworCQlQID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDEzNzAwMDoKKwkJZG9mZiA9IChwbGwgLSAweDEzNzAwMCkgLyAweDIwOworCQlzY2xrID0gcmVhZF9kaXYoZGV2LCBkb2ZmLCAweDEzNzEyMCwgMHgxMzcxNDApOworCQlicmVhazsKKwljYXNlIDB4MTMyMDAwOgorCQlzd2l0Y2ggKHBsbCkgeworCQljYXNlIDB4MTMyMDAwOgorCQkJc2NsayA9IHJlYWRfcGxsKGRldiwgMHgxMzIwMjApOworCQkJYnJlYWs7CisJCWNhc2UgMHgxMzIwMjA6CisJCQlzY2xrID0gcmVhZF9kaXYoZGV2LCAwLCAweDEzNzMyMCwgMHgxMzczMzApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc2NsayAqIE4gLyBNIC8gUDsKK30KKworc3RhdGljIHUzMgorcmVhZF9kaXYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGRvZmYsIHUzMiBkc3JjLCB1MzIgZGN0bCkKK3sKKwl1MzIgc3NyYyA9IG52X3JkMzIoZGV2LCBkc3JjICsgKGRvZmYgKiA0KSk7CisJdTMyIHNjdGwgPSBudl9yZDMyKGRldiwgZGN0bCArIChkb2ZmICogNCkpOworCisJc3dpdGNoIChzc3JjICYgMHgwMDAwMDAwMykgeworCWNhc2UgMDoKKwkJaWYgKChzc3JjICYgMHgwMDAzMDAwMCkgIT0gMHgwMDAzMDAwMCkKKwkJCXJldHVybiAyNzAwMDsKKwkJcmV0dXJuIDEwODAwMDsKKwljYXNlIDI6CisJCXJldHVybiAxMDAwMDA7CisJY2FzZSAzOgorCQlpZiAoc2N0bCAmIDB4ODAwMDAwMDApIHsKKwkJCXUzMiBzY2xrID0gcmVhZF92Y28oZGV2LCBkc3JjICsgKGRvZmYgKiA0KSk7CisJCQl1MzIgc2RpdiA9IChzY3RsICYgMHgwMDAwMDAzZikgKyAyOworCQkJcmV0dXJuIChzY2xrICogMikgLyBzZGl2OworCQl9CisKKwkJcmV0dXJuIHJlYWRfdmNvKGRldiwgZHNyYyArIChkb2ZmICogNCkpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHUzMgorcmVhZF9tZW0oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3NlbCA9IG52X3JkMzIoZGV2LCAweDEzNzNmMCk7CisJaWYgKHNzZWwgJiAweDAwMDAwMDAxKQorCQlyZXR1cm4gcmVhZF9kaXYoZGV2LCAwLCAweDEzNzMwMCwgMHgxMzczMTApOworCXJldHVybiByZWFkX3BsbChkZXYsIDB4MTMyMDAwKTsKK30KKworc3RhdGljIHUzMgorcmVhZF9jbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsaykKK3sKKwl1MzIgc2N0bCA9IG52X3JkMzIoZGV2LCAweDEzNzI1MCArIChjbGsgKiA0KSk7CisJdTMyIHNzZWwgPSBudl9yZDMyKGRldiwgMHgxMzcxMDApOworCXUzMiBzY2xrLCBzZGl2OworCisJaWYgKHNzZWwgJiAoMSA8PCBjbGspKSB7CisJCWlmIChjbGsgPCA3KQorCQkJc2NsayA9IHJlYWRfcGxsKGRldiwgMHgxMzcwMDAgKyAoY2xrICogMHgyMCkpOworCQllbHNlCisJCQlzY2xrID0gcmVhZF9wbGwoZGV2LCAweDEzNzBlMCk7CisJCXNkaXYgPSAoKHNjdGwgJiAweDAwMDAzZjAwKSA+PiA4KSArIDI7CisJfSBlbHNlIHsKKwkJc2NsayA9IHJlYWRfZGl2KGRldiwgY2xrLCAweDEzNzE2MCwgMHgxMzcxZDApOworCQlzZGl2ID0gKChzY3RsICYgMHgwMDAwMDAzZikgPj4gMCkgKyAyOworCX0KKworCWlmIChzY3RsICYgMHg4MDAwMDAwMCkKKwkJcmV0dXJuIChzY2xrICogMikgLyBzZGl2OworCXJldHVybiBzY2xrOworfQorCitpbnQKK252YzBfcG1fY2xvY2tzX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqcGVyZmx2bCkKK3sKKwlwZXJmbHZsLT5zaGFkZXIgPSByZWFkX2NsayhkZXYsIDB4MDApOworCXBlcmZsdmwtPmNvcmUgICA9IHBlcmZsdmwtPnNoYWRlciAvIDI7CisJcGVyZmx2bC0+bWVtb3J5ID0gcmVhZF9tZW0oZGV2KTsKKwlwZXJmbHZsLT5yb3AgICAgPSByZWFkX2NsayhkZXYsIDB4MDEpOworCXBlcmZsdmwtPmh1YjA3ICA9IHJlYWRfY2xrKGRldiwgMHgwMik7CisJcGVyZmx2bC0+aHViMDYgID0gcmVhZF9jbGsoZGV2LCAweDA3KTsKKwlwZXJmbHZsLT5odWIwMSAgPSByZWFkX2NsayhkZXYsIDB4MDgpOworCXBlcmZsdmwtPmNvcHkgICA9IHJlYWRfY2xrKGRldiwgMHgwOSk7CisJcGVyZmx2bC0+ZGFlbW9uID0gcmVhZF9jbGsoZGV2LCAweDBjKTsKKwlwZXJmbHZsLT52ZGVjICAgPSByZWFkX2NsayhkZXYsIDB4MGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF92cmFtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZyYW0uYwppbmRleCBlNDVhMjRkLi5jZTk4NGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZyYW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZyYW0uYwpAQCAtNDMsNyArNDMsNyBAQAogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAJMCwgMCwgMCwgMywgMywgMywgMywgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwKIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLAotCTMsIDMsIDMsIDMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMywgMywgMywKIAkzLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAwLCAzLCAwLCAzLCAwLCAzLAogCTMsIDAsIDMsIDMsIDMsIDMsIDMsIDAsIDAsIDMsIDAsIDMsIDAsIDMsIDMsIDAsCiAJMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMCwgMSwgMSwgMApAQCAtNjEsNyArNjEsNyBAQAogCSAgICAgIHUzMiB0eXBlLCBzdHJ1Y3Qgbm91dmVhdV9tZW0gKipwbWVtKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gZGV2X3ByaXYtPmVuZ2luZS52cmFtLm1tOworCXN0cnVjdCBub3V2ZWF1X21tICptbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW0ubW07CiAJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcjsKIAlzdHJ1Y3Qgbm91dmVhdV9tZW0gKm1lbTsKIAlpbnQgcmV0OwpAQCAtMTA2LDEyICsxMDYsNTQgQEAKIAlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CiAJY29uc3QgdTMyIHJzdmRfaGVhZCA9ICggMjU2ICogMTAyNCkgPj4gMTI7IC8qIHZnYSBtZW1vcnkgKi8KIAljb25zdCB1MzIgcnN2ZF90YWlsID0gKDEwMjQgKiAxMDI0KSA+PiAxMjsgLyogdmJpb3MgZXRjICovCi0JdTMyIGxlbmd0aDsKKwl1MzIgcGFydHMgPSBudl9yZDMyKGRldiwgMHgxMjFjNzQpOworCXUzMiBic2l6ZSA9IG52X3JkMzIoZGV2LCAweDEwZjIwYyk7CisJdTMyIG9mZnNldCwgbGVuZ3RoOworCWJvb2wgdW5pZm9ybSA9IHRydWU7CisJaW50IHJldCwgcGFydDsKIAotCWRldl9wcml2LT52cmFtX3NpemUgID0gbnZfcmQzMihkZXYsIDB4MTBmMjBjKSA8PCAyMDsKLQlkZXZfcHJpdi0+dnJhbV9zaXplICo9IG52X3JkMzIoZGV2LCAweDEyMWM3NCk7CisJTlZfREVCVUcoZGV2LCAiMHgxMDA4MDA6IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MTAwODAwKSk7CisJTlZfREVCVUcoZGV2LCAicGFydHMgMHglMDh4IGJjYXN0X21lbV9hbW91bnQgMHglMDh4XG4iLCBwYXJ0cywgYnNpemUpOwogCi0JbGVuZ3RoID0gKGRldl9wcml2LT52cmFtX3NpemUgPj4gMTIpIC0gcnN2ZF9oZWFkIC0gcnN2ZF90YWlsOworCS8qIHJlYWQgYW1vdW50IG9mIHZyYW0gYXR0YWNoZWQgdG8gZWFjaCBtZW1vcnkgY29udHJvbGxlciAqLworCXBhcnQgPSAwOworCXdoaWxlIChwYXJ0cykgeworCQl1MzIgcHNpemUgPSBudl9yZDMyKGRldiwgMHgxMTAyMGMgKyAocGFydCsrICogMHgxMDAwKSk7CisJCWlmIChwc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCXBhcnRzLS07CiAKLQlyZXR1cm4gbm91dmVhdV9tbV9pbml0KCZ2cmFtLT5tbSwgcnN2ZF9oZWFkLCBsZW5ndGgsIDEpOworCQlpZiAocHNpemUgIT0gYnNpemUpIHsKKwkJCWlmIChwc2l6ZSA8IGJzaXplKQorCQkJCWJzaXplID0gcHNpemU7CisJCQl1bmlmb3JtID0gZmFsc2U7CisJCX0KKworCQlOVl9ERUJVRyhkZXYsICIlZDogbWVtX2Ftb3VudCAweCUwOHhcbiIsIHBhcnQsIHBzaXplKTsKKwkJZGV2X3ByaXYtPnZyYW1fc2l6ZSArPSAodTY0KXBzaXplIDw8IDIwOworCX0KKworCS8qIGlmIGFsbCBjb250cm9sbGVycyBoYXZlIHRoZSBzYW1lIGFtb3VudCBhdHRhY2hlZCwgdGhlcmUncyBubyBob2xlcyAqLworCWlmICh1bmlmb3JtKSB7CisJCW9mZnNldCA9IHJzdmRfaGVhZDsKKwkJbGVuZ3RoID0gKGRldl9wcml2LT52cmFtX3NpemUgPj4gMTIpIC0gcnN2ZF9oZWFkIC0gcnN2ZF90YWlsOworCQlyZXR1cm4gbm91dmVhdV9tbV9pbml0KCZ2cmFtLT5tbSwgb2Zmc2V0LCBsZW5ndGgsIDEpOworCX0KKworCS8qIG90aGVyd2lzZSwgYWRkcmVzcyBsb3dlc3QgY29tbW9uIGFtb3VudCBmcm9tIDBHaUIgKi8KKwlyZXQgPSBub3V2ZWF1X21tX2luaXQoJnZyYW0tPm1tLCByc3ZkX2hlYWQsIChic2l6ZSA8PCA4KSAqIHBhcnRzLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogYW5kIHRoZSByZXN0IHN0YXJ0aW5nIGZyb20gKDhHaUIgKyBjb21tb25fc2l6ZSkgKi8KKwlvZmZzZXQgPSAoMHgwMjAwMDAwMDAwVUxMID4+IDEyKSArIChic2l6ZSA8PCA4KTsKKwlsZW5ndGggPSAoZGV2X3ByaXYtPnZyYW1fc2l6ZSA+PiAxMikgLSAoYnNpemUgPDwgOCkgLSByc3ZkX3RhaWw7CisKKwlyZXQgPSBub3V2ZWF1X21tX2luaXQoJnZyYW0tPm1tLCBvZmZzZXQsIGxlbmd0aCwgMCk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X21tX2ZpbmkoJnZyYW0tPm1tKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252ZDBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNjNiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252ZDBfZGlzcGxheS5jCkBAIC0wLDAgKzEsMTQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY3J0Y19oZWxwZXIuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2VuY29kZXIuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworc3RydWN0IG52ZDBfZGlzcGxheSB7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICptZW07CisJc3RydWN0IHsKKwkJZG1hX2FkZHJfdCBoYW5kbGU7CisJCXUzMiAqcHRyOworCX0gZXZvWzFdOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CisJdTMyIG1vZGVzZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IG52ZDBfZGlzcGxheSAqCitudmQwX2Rpc3BsYXkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiBkZXZfcHJpdi0+ZW5naW5lLmRpc3BsYXkucHJpdjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V2b19pY21kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpZCwgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCWludCByZXQgPSAwOworCW52X21hc2soZGV2LCAweDYxMDcwMCArIChpZCAqIDB4MTApLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg2MTA3MDQgKyAoaWQgKiAweDEwKSwgZGF0YSk7CisJbnZfbWFzayhkZXYsIDB4NjEwNzA0ICsgKGlkICogMHgxMCksIDB4ODAwMDBmZmMsIDB4ODAwMDAwMDAgfCBtdGhkKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDYxMDcwNCArIChpZCAqIDB4MTApLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkKKwkJcmV0ID0gLUVCVVNZOworCW52X21hc2soZGV2LCAweDYxMDcwMCArIChpZCAqIDB4MTApLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyICoKK2V2b193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpZCwgaW50IG5yKQoreworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3AgPSBudmQwX2Rpc3BsYXkoZGV2KTsKKwl1MzIgcHV0ID0gbnZfcmQzMihkZXYsIDB4NjQwMDAwICsgKGlkICogMHgxMDAwKSkgLyA0OworCisJaWYgKHB1dCArIG5yID49IChQQUdFX1NJWkUgLyA0KSkgeworCQlkaXNwLT5ldm9baWRdLnB0cltwdXRdID0gMHgyMDAwMDAwMDsKKworCQludl93cjMyKGRldiwgMHg2NDAwMDAgKyAoaWQgKiAweDEwMDApLCAweDAwMDAwMDAwKTsKKwkJaWYgKCFudl93YWl0KGRldiwgMHg2NDAwMDQgKyAoaWQgKiAweDEwMDApLCB+MCwgMHgwMDAwMDAwMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgImV2byAlZCBkbWEgc3RhbGxlZFxuIiwgaWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlwdXQgPSAwOworCX0KKworCXJldHVybiBkaXNwLT5ldm9baWRdLnB0ciArIHB1dDsKK30KKworc3RhdGljIHZvaWQKK2V2b19raWNrKHUzMiAqcHVzaCwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGlkKQoreworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3AgPSBudmQwX2Rpc3BsYXkoZGV2KTsKKwludl93cjMyKGRldiwgMHg2NDAwMDAgKyAoaWQgKiAweDEwMDApLCAocHVzaCAtIGRpc3AtPmV2b1tpZF0ucHRyKSA8PCAyKTsKK30KKworI2RlZmluZSBldm9fbXRoZChwLG0scykgKigocCkrKykgPSAoKChzKSA8PCAxOCkgfCAobSkpCisjZGVmaW5lIGV2b19kYXRhKHAsZCkgICAqKChwKSsrKSA9IChkKQorCitzdGF0aWMgc3RydWN0IGRybV9jcnRjICoKK252ZDBfZGlzcGxheV9jcnRjX2dldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJcmV0dXJuIG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKS0+Y3J0YzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ1JUQworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAorbnZkMF9jcnRjX3NldF9kaXRoZXIoc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgYm9vbCBvbiwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG52X2NydGMtPmJhc2UuZGV2OworCXUzMiAqcHVzaCwgbW9kZTsKKworCW1vZGUgPSAweDAwMDAwMDAwOworCWlmIChvbikgeworCQkvKiAweDExOiA2YnBjIGR5bmFtaWMgMngyCisJCSAqIDB4MTM6IDhicGMgZHluYW1pYyAyeDIKKwkJICogMHgxOTogNmJwYyBzdGF0aWMgMngyCisJCSAqIDB4MWI6IDhicGMgc3RhdGljIDJ4MgorCQkgKiAweDIxOiA2YnBjIHRlbXBvcmFsCisJCSAqIDB4MjM6IDhicGMgdGVtcG9yYWwKKwkJICovCisJCW1vZGUgPSAweDAwMDAwMDExOworCX0KKworCXB1c2ggPSBldm9fd2FpdChkZXYsIDAsIDQpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ5MCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIG1vZGUpOworCQlpZiAodXBkYXRlKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCX0KKwkJZXZvX2tpY2socHVzaCwgZGV2LCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX3NldF9zY2FsZShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBpbnQgdHlwZSwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSAmbnZfY3J0Yy0+YmFzZS5tb2RlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKKwl1MzIgKnB1c2gsIG91dFgsIG91dFk7CisKKwlvdXRYID0gbW9kZS0+aGRpc3BsYXk7CisJb3V0WSA9IG1vZGUtPnZkaXNwbGF5OworCisJbnZfY29ubmVjdG9yID0gbm91dmVhdV9jcnRjX2Nvbm5lY3Rvcl9nZXQobnZfY3J0Yyk7CisJaWYgKG52X2Nvbm5lY3RvciAmJiBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpuYXRpdmUgPSBudl9jb25uZWN0b3ItPm5hdGl2ZV9tb2RlOworCQl1MzIgeHJhdGlvID0gKG5hdGl2ZS0+aGRpc3BsYXkgPDwgMTkpIC8gbW9kZS0+aGRpc3BsYXk7CisJCXUzMiB5cmF0aW8gPSAobmF0aXZlLT52ZGlzcGxheSA8PCAxOSkgLyBtb2RlLT52ZGlzcGxheTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBEUk1fTU9ERV9TQ0FMRV9BU1BFQ1Q6CisJCQlpZiAoeHJhdGlvID4geXJhdGlvKSB7CisJCQkJb3V0WCA9IChtb2RlLT5oZGlzcGxheSAqIHlyYXRpbykgPj4gMTk7CisJCQkJb3V0WSA9IChtb2RlLT52ZGlzcGxheSAqIHlyYXRpbykgPj4gMTk7CisJCQl9IGVsc2UgeworCQkJCW91dFggPSAobW9kZS0+aGRpc3BsYXkgKiB4cmF0aW8pID4+IDE5OworCQkJCW91dFkgPSAobW9kZS0+dmRpc3BsYXkgKiB4cmF0aW8pID4+IDE5OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRFJNX01PREVfU0NBTEVfRlVMTFNDUkVFTjoKKwkJCW91dFggPSBuYXRpdmUtPmhkaXNwbGF5OworCQkJb3V0WSA9IG5hdGl2ZS0+dmRpc3BsYXk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHVzaCA9IGV2b193YWl0KGRldiwgMCwgMTYpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDRjMCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMyk7CisJCWV2b19kYXRhKHB1c2gsIChvdXRZIDw8IDE2KSB8IG91dFgpOworCQlldm9fZGF0YShwdXNoLCAob3V0WSA8PCAxNikgfCBvdXRYKTsKKwkJZXZvX2RhdGEocHVzaCwgKG91dFkgPDwgMTYpIHwgb3V0WCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ5NCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQlldm9fbXRoZChwdXNoLCAweDA0YjggKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCAobW9kZS0+dmRpc3BsYXkgPDwgMTYpIHwgbW9kZS0+aGRpc3BsYXkpOworCQlpZiAodXBkYXRlKSB7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCX0KKwkJZXZvX2tpY2socHVzaCwgZGV2LCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX3NldF9pbWFnZShzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJICAgIGludCB4LCBpbnQgeSwgYm9vbCB1cGRhdGUpCit7CisJc3RydWN0IG5vdXZlYXVfZnJhbWVidWZmZXIgKm52ZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGZiKTsKKwl1MzIgKnB1c2g7CisKKwlwdXNoID0gZXZvX3dhaXQoZmItPmRldiwgMCwgMTYpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ2MCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIG52ZmItPm52Ym8tPmJvLm9mZnNldCA+PiA4KTsKKwkJZXZvX210aGQocHVzaCwgMHgwNDY4ICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCA0KTsKKwkJZXZvX2RhdGEocHVzaCwgKGZiLT5oZWlnaHQgPDwgMTYpIHwgZmItPndpZHRoKTsKKwkJZXZvX2RhdGEocHVzaCwgbnZmYi0+cl9waXRjaCk7CisJCWV2b19kYXRhKHB1c2gsIG52ZmItPnJfZm9ybWF0KTsKKwkJZXZvX2RhdGEocHVzaCwgbnZmYi0+cl9kbWEpOworCQlldm9fbXRoZChwdXNoLCAweDA0YjAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCAoeSA8PCAxNikgfCB4KTsKKwkJaWYgKHVwZGF0ZSkgeworCQkJZXZvX210aGQocHVzaCwgMHgwMDgwLCAxKTsKKwkJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQl9CisJCWV2b19raWNrKHB1c2gsIGZiLT5kZXYsIDApOworCX0KKworCW52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPSBudmZiLT5yX2RtYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252ZDBfY3J0Y19jdXJzb3Jfc2hvdyhzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCBib29sIHNob3csIGJvb2wgdXBkYXRlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBudl9jcnRjLT5iYXNlLmRldjsKKwl1MzIgKnB1c2ggPSBldm9fd2FpdChkZXYsIDAsIDE2KTsKKwlpZiAocHVzaCkgeworCQlpZiAoc2hvdykgeworCQkJZXZvX210aGQocHVzaCwgMHgwNDgwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAyKTsKKwkJCWV2b19kYXRhKHB1c2gsIDB4ODUwMDAwMDApOworCQkJZXZvX2RhdGEocHVzaCwgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm9mZnNldCA+PiA4KTsKKwkJCWV2b19tdGhkKHB1c2gsIDB4MDQ4YyArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCQlldm9fZGF0YShwdXNoLCBOdkV2b1ZSQU0pOworCQl9IGVsc2UgeworCQkJZXZvX210aGQocHVzaCwgMHgwNDgwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJCWV2b19kYXRhKHB1c2gsIDB4MDUwMDAwMDApOworCQkJZXZvX210aGQocHVzaCwgMHgwNDhjICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQl9CisKKwkJaWYgKHVwZGF0ZSkgeworCQkJZXZvX210aGQocHVzaCwgMHgwMDgwLCAxKTsKKwkJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQl9CisKKwkJZXZvX2tpY2socHVzaCwgZGV2LCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX3ByZXBhcmUoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJdTMyICpwdXNoOworCisJcHVzaCA9IGV2b193YWl0KGNydGMtPmRldiwgMCwgMik7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwNDc0ICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAxKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ0MCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDMwMDAwMDApOworCQlldm9fbXRoZChwdXNoLCAweDA0NWMgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwkJZXZvX2tpY2socHVzaCwgY3J0Yy0+ZGV2LCAwKTsKKwl9CisKKwludmQwX2NydGNfY3Vyc29yX3Nob3cobnZfY3J0YywgZmFsc2UsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJdTMyICpwdXNoOworCisJcHVzaCA9IGV2b193YWl0KGNydGMtPmRldiwgMCwgMzIpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQ3NCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIG52X2NydGMtPmZiLnRpbGVfZmxhZ3MpOworCQlldm9fbXRoZChwdXNoLCAweDA0NDAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDQpOworCQlldm9fZGF0YShwdXNoLCAweDgzMDAwMDAwKTsKKwkJZXZvX2RhdGEocHVzaCwgbnZfY3J0Yy0+bHV0Lm52Ym8tPmJvLm9mZnNldCA+PiA4KTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQlldm9fbXRoZChwdXNoLCAweDA0NWMgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCBOdkV2b1ZSQU0pOworCQlldm9fbXRoZChwdXNoLCAweDA0MzAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCAweGZmZmZmZjAwKTsKKwkJZXZvX2tpY2socHVzaCwgY3J0Yy0+ZGV2LCAwKTsKKwl9CisKKwludmQwX2NydGNfY3Vyc29yX3Nob3cobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLnZpc2libGUsIHRydWUpOworfQorCitzdGF0aWMgYm9vbAorbnZkMF9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX3N3YXBfZmJzKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBub3V2ZWF1X2ZyYW1lYnVmZmVyICpudmZiID0gbm91dmVhdV9mcmFtZWJ1ZmZlcihjcnRjLT5mYik7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfYm9fcGluKG52ZmItPm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAob2xkX2ZiKSB7CisJCW52ZmIgPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKG9sZF9mYik7CisJCW5vdXZlYXVfYm9fdW5waW4obnZmYi0+bnZibyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252ZDBfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp1bW9kZSwKKwkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsIGludCB4LCBpbnQgeSwKKwkJICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3I7CisJdTMyIGh0b3RhbCA9IG1vZGUtPmh0b3RhbDsKKwl1MzIgdnRvdGFsID0gbW9kZS0+dnRvdGFsOworCXUzMiBoc3luY3cgPSBtb2RlLT5oc3luY19lbmQgLSBtb2RlLT5oc3luY19zdGFydCAtIDE7CisJdTMyIHZzeW5jdyA9IG1vZGUtPnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5jX3N0YXJ0IC0gMTsKKwl1MzIgaGZybnRwID0gbW9kZS0+aHN5bmNfc3RhcnQgLSBtb2RlLT5oZGlzcGxheTsKKwl1MzIgdmZybnRwID0gbW9kZS0+dnN5bmNfc3RhcnQgLSBtb2RlLT52ZGlzcGxheTsKKwl1MzIgaGJhY2twID0gbW9kZS0+aHRvdGFsIC0gbW9kZS0+aHN5bmNfZW5kOworCXUzMiB2YmFja3AgPSBtb2RlLT52dG90YWwgLSBtb2RlLT52c3luY19lbmQ7CisJdTMyIGhzczJiZSA9IGhzeW5jdyArIGhiYWNrcDsKKwl1MzIgdnNzMmJlID0gdnN5bmN3ICsgdmJhY2twOworCXUzMiBoc3MyZGUgPSBodG90YWwgLSBoZnJudHA7CisJdTMyIHZzczJkZSA9IHZ0b3RhbCAtIHZmcm50cDsKKwl1MzIgc3luY3MsICpwdXNoOworCWludCByZXQ7CisKKwlzeW5jcyA9IDB4MDAwMDAwMDE7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19OSFNZTkMpCisJCXN5bmNzIHw9IDB4MDAwMDAwMDg7CisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19OVlNZTkMpCisJCXN5bmNzIHw9IDB4MDAwMDAwMTA7CisKKwlyZXQgPSBudmQwX2NydGNfc3dhcF9mYnMoY3J0Yywgb2xkX2ZiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcHVzaCA9IGV2b193YWl0KGNydGMtPmRldiwgMCwgNjQpOworCWlmIChwdXNoKSB7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQxMCArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgNSk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCQlldm9fZGF0YShwdXNoLCAodnRvdGFsIDw8IDE2KSB8IGh0b3RhbCk7CisJCWV2b19kYXRhKHB1c2gsICh2c3luY3cgPDwgMTYpIHwgaHN5bmN3KTsKKwkJZXZvX2RhdGEocHVzaCwgKHZzczJiZSA8PCAxNikgfCBoc3MyYmUpOworCQlldm9fZGF0YShwdXNoLCAodnNzMmRlIDw8IDE2KSB8IGhzczJkZSk7CisJCWV2b19tdGhkKHB1c2gsIDB4MDQyYyArIChudl9jcnRjLT5pbmRleCAqIDB4MzAwKSwgMSk7CisJCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOyAvKiA/Pz8gKi8KKwkJZXZvX210aGQocHVzaCwgMHgwNDUwICsgKG52X2NydGMtPmluZGV4ICogMHgzMDApLCAzKTsKKwkJZXZvX2RhdGEocHVzaCwgbW9kZS0+Y2xvY2sgKiAxMDAwKTsKKwkJZXZvX2RhdGEocHVzaCwgMHgwMDIwMDAwMCk7IC8qID8/PyAqLworCQlldm9fZGF0YShwdXNoLCBtb2RlLT5jbG9jayAqIDEwMDApOworCQlldm9fbXRoZChwdXNoLCAweDA0MDQgKyAobnZfY3J0Yy0+aW5kZXggKiAweDMwMCksIDEpOworCQlldm9fZGF0YShwdXNoLCBzeW5jcyk7CisJCWV2b19raWNrKHB1c2gsIGNydGMtPmRldiwgMCk7CisJfQorCisJbnZfY29ubmVjdG9yID0gbm91dmVhdV9jcnRjX2Nvbm5lY3Rvcl9nZXQobnZfY3J0Yyk7CisJbnZkMF9jcnRjX3NldF9kaXRoZXIobnZfY3J0YywgbnZfY29ubmVjdG9yLT51c2VfZGl0aGVyaW5nLCBmYWxzZSk7CisJbnZkMF9jcnRjX3NldF9zY2FsZShudl9jcnRjLCBudl9jb25uZWN0b3ItPnNjYWxpbmdfbW9kZSwgZmFsc2UpOworCW52ZDBfY3J0Y19zZXRfaW1hZ2UobnZfY3J0YywgY3J0Yy0+ZmIsIHgsIHksIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZkMF9jcnRjX21vZGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHksCisJCQlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwlpbnQgcmV0OworCisJaWYgKCFjcnRjLT5mYikgeworCQlOVl9ERUJVR19LTVMoY3J0Yy0+ZGV2LCAiTm8gRkIgYm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBudmQwX2NydGNfc3dhcF9mYnMoY3J0Yywgb2xkX2ZiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbnZkMF9jcnRjX3NldF9pbWFnZShudl9jcnRjLCBjcnRjLT5mYiwgeCwgeSwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252ZDBfY3J0Y19tb2RlX3NldF9iYXNlX2F0b21pYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCB4LCBpbnQgeSwKKwkJCSAgICAgICBlbnVtIG1vZGVfc2V0X2F0b21pYyBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCW52ZDBfY3J0Y19zZXRfaW1hZ2UobnZfY3J0YywgZmIsIHgsIHksIHRydWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jcnRjX2x1dF9sb2FkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXZvaWQgX19pb21lbSAqbHV0ID0gbnZib19rbWFwX29ial9pb3ZpcnR1YWwobnZfY3J0Yy0+bHV0Lm52Ym8pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXdyaXRldygweDYwMDAgKyAobnZfY3J0Yy0+bHV0LnJbaV0gPj4gMiksIGx1dCArIChpICogMHgyMCkgKyAwKTsKKwkJd3JpdGV3KDB4NjAwMCArIChudl9jcnRjLT5sdXQuZ1tpXSA+PiAyKSwgbHV0ICsgKGkgKiAweDIwKSArIDIpOworCQl3cml0ZXcoMHg2MDAwICsgKG52X2NydGMtPmx1dC5iW2ldID4+IDIpLCBsdXQgKyAoaSAqIDB4MjApICsgNCk7CisJfQorfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfY3Vyc29yX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87CisJYm9vbCB2aXNpYmxlID0gKGhhbmRsZSAhPSAwKTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICh2aXNpYmxlKSB7CisJCWlmICh3aWR0aCAhPSA2NCB8fCBoZWlnaHQgIT0gNjQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlnZW0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGhhbmRsZSk7CisJCWlmICh1bmxpa2VseSghZ2VtKSkKKwkJCXJldHVybiAtRU5PRU5UOworCQludmJvID0gbm91dmVhdV9nZW1fb2JqZWN0KGdlbSk7CisKKwkJcmV0ID0gbm91dmVhdV9ib19tYXAobnZibyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IDY0ICogNjQ7IGkrKykgeworCQkJCXUzMiB2ID0gbm91dmVhdV9ib19yZDMyKG52Ym8sIGkpOworCQkJCW5vdXZlYXVfYm9fd3IzMihudl9jcnRjLT5jdXJzb3IubnZibywgaSwgdik7CisJCQl9CisJCQlub3V2ZWF1X2JvX3VubWFwKG52Ym8pOworCQl9CisKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoZ2VtKTsKKwl9CisKKwlpZiAodmlzaWJsZSAhPSBudl9jcnRjLT5jdXJzb3IudmlzaWJsZSkgeworCQludmQwX2NydGNfY3Vyc29yX3Nob3cobnZfY3J0YywgdmlzaWJsZSwgdHJ1ZSk7CisJCW52X2NydGMtPmN1cnNvci52aXNpYmxlID0gdmlzaWJsZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitudmQwX2NydGNfY3Vyc29yX21vdmUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHkpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwljb25zdCB1MzIgZGF0YSA9ICh5IDw8IDE2KSB8IHg7CisKKwludl93cjMyKGNydGMtPmRldiwgMHg2NGQwODQgKyAobnZfY3J0Yy0+aW5kZXggKiAweDEwMDApLCBkYXRhKTsKKwludl93cjMyKGNydGMtPmRldiwgMHg2NGQwODAgKyAobnZfY3J0Yy0+aW5kZXggKiAweDEwMDApLCAweDAwMDAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252ZDBfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnIsIHUxNiAqZywgdTE2ICpiLAorCQkgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKKwl1MzIgZW5kID0gbWF4KHN0YXJ0ICsgc2l6ZSwgKHUzMikyNTYpOworCXUzMiBpOworCisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQludl9jcnRjLT5sdXQucltpXSA9IHJbaV07CisJCW52X2NydGMtPmx1dC5nW2ldID0gZ1tpXTsKKwkJbnZfY3J0Yy0+bHV0LmJbaV0gPSBiW2ldOworCX0KKworCW52ZDBfY3J0Y19sdXRfbG9hZChjcnRjKTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfY3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGNydGMpOworCW5vdXZlYXVfYm9fdW5tYXAobnZfY3J0Yy0+Y3Vyc29yLm52Ym8pOworCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5jdXJzb3IubnZibyk7CisJbm91dmVhdV9ib191bm1hcChudl9jcnRjLT5sdXQubnZibyk7CisJbm91dmVhdV9ib19yZWYoTlVMTCwgJm52X2NydGMtPmx1dC5udmJvKTsKKwlkcm1fY3J0Y19jbGVhbnVwKGNydGMpOworCWtmcmVlKGNydGMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBudmQwX2NydGNfaGZ1bmMgPSB7CisJLmRwbXMgPSBudmQwX2NydGNfZHBtcywKKwkucHJlcGFyZSA9IG52ZDBfY3J0Y19wcmVwYXJlLAorCS5jb21taXQgPSBudmQwX2NydGNfY29tbWl0LAorCS5tb2RlX2ZpeHVwID0gbnZkMF9jcnRjX21vZGVfZml4dXAsCisJLm1vZGVfc2V0ID0gbnZkMF9jcnRjX21vZGVfc2V0LAorCS5tb2RlX3NldF9iYXNlID0gbnZkMF9jcnRjX21vZGVfc2V0X2Jhc2UsCisJLm1vZGVfc2V0X2Jhc2VfYXRvbWljID0gbnZkMF9jcnRjX21vZGVfc2V0X2Jhc2VfYXRvbWljLAorCS5sb2FkX2x1dCA9IG52ZDBfY3J0Y19sdXRfbG9hZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgbnZkMF9jcnRjX2Z1bmMgPSB7CisJLmN1cnNvcl9zZXQgPSBudmQwX2NydGNfY3Vyc29yX3NldCwKKwkuY3Vyc29yX21vdmUgPSBudmQwX2NydGNfY3Vyc29yX21vdmUsCisJLmdhbW1hX3NldCA9IG52ZDBfY3J0Y19nYW1tYV9zZXQsCisJLnNldF9jb25maWcgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKKwkuZGVzdHJveSA9IG52ZDBfY3J0Y19kZXN0cm95LAorfTsKKworc3RhdGljIHZvaWQKK252ZDBfY3Vyc29yX3NldF9wb3Moc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YywgaW50IHgsIGludCB5KQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9jdXJzb3Jfc2V0X29mZnNldChzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjLCB1aW50MzJfdCBvZmZzZXQpCit7Cit9CisKK3N0YXRpYyBpbnQKK252ZDBfY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGM7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCByZXQsIGk7CisKKwludl9jcnRjID0ga3phbGxvYyhzaXplb2YoKm52X2NydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2NydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJbnZfY3J0Yy0+aW5kZXggPSBpbmRleDsKKwludl9jcnRjLT5zZXRfZGl0aGVyID0gbnZkMF9jcnRjX3NldF9kaXRoZXI7CisJbnZfY3J0Yy0+c2V0X3NjYWxlID0gbnZkMF9jcnRjX3NldF9zY2FsZTsKKwludl9jcnRjLT5jdXJzb3Iuc2V0X29mZnNldCA9IG52ZDBfY3Vyc29yX3NldF9vZmZzZXQ7CisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9wb3MgPSBudmQwX2N1cnNvcl9zZXRfcG9zOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQludl9jcnRjLT5sdXQucltpXSA9IGkgPDwgODsKKwkJbnZfY3J0Yy0+bHV0LmdbaV0gPSBpIDw8IDg7CisJCW52X2NydGMtPmx1dC5iW2ldID0gaSA8PCA4OworCX0KKworCWNydGMgPSAmbnZfY3J0Yy0+YmFzZTsKKwlkcm1fY3J0Y19pbml0KGRldiwgY3J0YywgJm52ZDBfY3J0Y19mdW5jKTsKKwlkcm1fY3J0Y19oZWxwZXJfYWRkKGNydGMsICZudmQwX2NydGNfaGZ1bmMpOworCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoY3J0YywgMjU2KTsKKworCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgNjQgKiA2NCAqIDQsIDB4MTAwLCBUVE1fUExfRkxBR19WUkFNLAorCQkJICAgICAwLCAweDAwMDAsICZudl9jcnRjLT5jdXJzb3IubnZibyk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gbm91dmVhdV9ib19waW4obnZfY3J0Yy0+Y3Vyc29yLm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IG5vdXZlYXVfYm9fbWFwKG52X2NydGMtPmN1cnNvci5udmJvKTsKKwkJaWYgKHJldCkKKwkJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5jdXJzb3IubnZibyk7CisJfQorCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIDgxOTIsIDB4MTAwLCBUVE1fUExfRkxBR19WUkFNLAorCQkJICAgICAwLCAweDAwMDAsICZudl9jcnRjLT5sdXQubnZibyk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gbm91dmVhdV9ib19waW4obnZfY3J0Yy0+bHV0Lm52Ym8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IG5vdXZlYXVfYm9fbWFwKG52X2NydGMtPmx1dC5udmJvKTsKKwkJaWYgKHJldCkKKwkJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZudl9jcnRjLT5sdXQubnZibyk7CisJfQorCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwludmQwX2NydGNfbHV0X2xvYWQoY3J0Yyk7CisKK291dDoKKwlpZiAocmV0KQorCQludmQwX2NydGNfZGVzdHJveShjcnRjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEQUMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitudmQwX2RhY19kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCWludCBvciA9IG52X2VuY29kZXItPm9yOworCXUzMiBkcG1zX2N0cmw7CisKKwlkcG1zX2N0cmwgPSAweDgwMDAwMDAwOworCWlmIChtb2RlID09IERSTV9NT0RFX0RQTVNfU1RBTkRCWSB8fCBtb2RlID09IERSTV9NT0RFX0RQTVNfT0ZGKQorCQlkcG1zX2N0cmwgfD0gMHgwMDAwMDAwMTsKKwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQgfHwgbW9kZSA9PSBEUk1fTU9ERV9EUE1TX09GRikKKwkJZHBtc19jdHJsIHw9IDB4MDAwMDAwMDQ7CisKKwludl93YWl0KGRldiwgMHg2MWEwMDQgKyAob3IgKiAweDA4MDApLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHg2MWEwMDQgKyAob3IgKiAweDA4MDApLCAweGMwMDAwMDdmLCBkcG1zX2N0cmwpOworCW52X3dhaXQoZGV2LCAweDYxYTAwNCArIChvciAqIDB4MDgwMCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgYm9vbAorbnZkMF9kYWNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKKworCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCWlmIChudl9jb25uZWN0b3IgJiYgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQlpZiAobnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgIT0gRFJNX01PREVfU0NBTEVfTk9ORSkgeworCQkJaW50IGlkID0gYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZDsKKwkJCSphZGp1c3RlZF9tb2RlID0gKm52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCQlhZGp1c3RlZF9tb2RlLT5iYXNlLmlkID0gaWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGFjX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kYWNfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGFjX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXUzMiAqcHVzaDsKKworCW52ZDBfZGFjX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PTik7CisKKwlwdXNoID0gZXZvX3dhaXQoZW5jb2Rlci0+ZGV2LCAwLCA0KTsKKwlpZiAocHVzaCkgeworCQlldm9fbXRoZChwdXNoLCAweDAxODAgKyAobnZfZW5jb2Rlci0+b3IgKiAweDIwKSwgMik7CisJCWV2b19kYXRhKHB1c2gsIDEgPDwgbnZfY3J0Yy0+aW5kZXgpOworCQlldm9fZGF0YShwdXNoLCAweDAwZmYpOworCQlldm9fa2ljayhwdXNoLCBlbmNvZGVyLT5kZXYsIDApOworCX0KKworCW52X2VuY29kZXItPmNydGMgPSBlbmNvZGVyLT5jcnRjOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kYWNfZGlzY29ubmVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXUzMiAqcHVzaDsKKworCWlmIChudl9lbmNvZGVyLT5jcnRjKSB7CisJCW52ZDBfY3J0Y19wcmVwYXJlKG52X2VuY29kZXItPmNydGMpOworCisJCXB1c2ggPSBldm9fd2FpdChkZXYsIDAsIDQpOworCQlpZiAocHVzaCkgeworCQkJZXZvX210aGQocHVzaCwgMHgwMTgwICsgKG52X2VuY29kZXItPm9yICogMHgyMCksIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCQlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCQl9CisKKwkJbnZfZW5jb2Rlci0+Y3J0YyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworbnZkMF9kYWNfZGV0ZWN0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXIgPSBub3V2ZWF1X2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKwl1MzIgbG9hZDsKKworCW52X3dyMzIoZGV2LCAweDYxYTAwYyArIChvciAqIDB4ODAwKSwgMHgwMDEwMDAwMCk7CisJdWRlbGF5KDk1MDApOworCW52X3dyMzIoZGV2LCAweDYxYTAwYyArIChvciAqIDB4ODAwKSwgMHg4MDAwMDAwMCk7CisKKwlsb2FkID0gbnZfcmQzMihkZXYsIDB4NjFhMDBjICsgKG9yICogMHg4MDApKTsKKwlpZiAoKGxvYWQgJiAweDM4MDAwMDAwKSA9PSAweDM4MDAwMDAwKQorCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKworCW52X3dyMzIoZGV2LCAweDYxYTAwYyArIChvciAqIDB4ODAwKSwgMHgwMDAwMDAwMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGFjX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJa2ZyZWUoZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52ZDBfZGFjX2hmdW5jID0geworCS5kcG1zID0gbnZkMF9kYWNfZHBtcywKKwkubW9kZV9maXh1cCA9IG52ZDBfZGFjX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudmQwX2RhY19wcmVwYXJlLAorCS5jb21taXQgPSBudmQwX2RhY19jb21taXQsCisJLm1vZGVfc2V0ID0gbnZkMF9kYWNfbW9kZV9zZXQsCisJLmRpc2FibGUgPSBudmQwX2RhY19kaXNjb25uZWN0LAorCS5nZXRfY3J0YyA9IG52ZDBfZGlzcGxheV9jcnRjX2dldCwKKwkuZGV0ZWN0ID0gbnZkMF9kYWNfZGV0ZWN0Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG52ZDBfZGFjX2Z1bmMgPSB7CisJLmRlc3Ryb3kgPSBudmQwX2RhY19kZXN0cm95LAorfTsKKworc3RhdGljIGludAorbnZkMF9kYWNfY3JlYXRlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkY2JfZW50cnkgKmRjYmUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCisJbnZfZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKCpudl9lbmNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFudl9lbmNvZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwludl9lbmNvZGVyLT5kY2IgPSBkY2JlOworCW52X2VuY29kZXItPm9yID0gZmZzKGRjYmUtPm9yKSAtIDE7CisKKwllbmNvZGVyID0gdG9fZHJtX2VuY29kZXIobnZfZW5jb2Rlcik7CisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSBkY2JlLT5oZWFkczsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmbnZkMF9kYWNfZnVuYywgRFJNX01PREVfRU5DT0RFUl9EQUMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJm52ZDBfZGFjX2hmdW5jKTsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTT1IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitudmQwX3Nvcl9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBkcm1fZW5jb2RlciAqcGFydG5lcjsKKwlpbnQgb3IgPSBudl9lbmNvZGVyLT5vcjsKKwl1MzIgZHBtc19jdHJsOworCisJbnZfZW5jb2Rlci0+bGFzdF9kcG1zID0gbW9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFydG5lciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X3BhcnRuZXIgPSBub3V2ZWF1X2VuY29kZXIocGFydG5lcik7CisKKwkJaWYgKHBhcnRuZXItPmVuY29kZXJfdHlwZSAhPSBEUk1fTU9ERV9FTkNPREVSX1RNRFMpCisJCQljb250aW51ZTsKKworCQlpZiAobnZfcGFydG5lciAhPSBudl9lbmNvZGVyICYmCisJCSAgICBudl9wYXJ0bmVyLT5kY2ItPm9yID09IG52X2VuY29kZXItPm9yKSB7CisJCQlpZiAobnZfcGFydG5lci0+bGFzdF9kcG1zID09IERSTV9NT0RFX0RQTVNfT04pCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkcG1zX2N0cmwgID0gKG1vZGUgPT0gRFJNX01PREVfRFBNU19PTik7CisJZHBtc19jdHJsIHw9IDB4ODAwMDAwMDA7CisKKwludl93YWl0KGRldiwgMHg2MWMwMDQgKyAob3IgKiAweDA4MDApLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHg2MWMwMDQgKyAob3IgKiAweDA4MDApLCAweDgwMDAwMDAxLCBkcG1zX2N0cmwpOworCW52X3dhaXQoZGV2LCAweDYxYzAwNCArIChvciAqIDB4MDgwMCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X3dhaXQoZGV2LCAweDYxYzAzMCArIChvciAqIDB4MDgwMCksIDB4MTAwMDAwMDAsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgYm9vbAorbnZkMF9zb3JfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvcjsKKworCW52X2Nvbm5lY3RvciA9IG5vdXZlYXVfZW5jb2Rlcl9jb25uZWN0b3JfZ2V0KG52X2VuY29kZXIpOworCWlmIChudl9jb25uZWN0b3IgJiYgbnZfY29ubmVjdG9yLT5uYXRpdmVfbW9kZSkgeworCQlpZiAobnZfY29ubmVjdG9yLT5zY2FsaW5nX21vZGUgIT0gRFJNX01PREVfU0NBTEVfTk9ORSkgeworCQkJaW50IGlkID0gYWRqdXN0ZWRfbW9kZS0+YmFzZS5pZDsKKwkJCSphZGp1c3RlZF9tb2RlID0gKm52X2Nvbm5lY3Rvci0+bmF0aXZlX21vZGU7CisJCQlhZGp1c3RlZF9tb2RlLT5iYXNlLmlkID0gaWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfc29yX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworfQorCitzdGF0aWMgdm9pZAorbnZkMF9zb3JfY29tbWl0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKK30KKworc3RhdGljIHZvaWQKK252ZDBfc29yX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnVtb2RlLAorCQkgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGVuY29kZXItPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnRjICpudl9jcnRjID0gbm91dmVhdV9jcnRjKGVuY29kZXItPmNydGMpOworCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yOworCXN0cnVjdCBudmJpb3MgKmJpb3MgPSAmZGV2X3ByaXYtPnZiaW9zOworCXUzMiBtb2RlX2N0cmwgPSAoMSA8PCBudl9jcnRjLT5pbmRleCk7CisJdTMyICpwdXNoLCBvcl9jb25maWc7CisKKwludl9jb25uZWN0b3IgPSBub3V2ZWF1X2VuY29kZXJfY29ubmVjdG9yX2dldChudl9lbmNvZGVyKTsKKwlzd2l0Y2ggKG52X2VuY29kZXItPmRjYi0+dHlwZSkgeworCWNhc2UgT1VUUFVUX1RNRFM6CisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnNvcmNvbmYubGluayAmIDEpIHsKKwkJCWlmIChtb2RlLT5jbG9jayA8IDE2NTAwMCkKKwkJCQltb2RlX2N0cmwgfD0gMHgwMDAwMDEwMDsKKwkJCWVsc2UKKwkJCQltb2RlX2N0cmwgfD0gMHgwMDAwMDUwMDsKKwkJfSBlbHNlIHsKKwkJCW1vZGVfY3RybCB8PSAweDAwMDAwMjAwOworCQl9CisKKwkJb3JfY29uZmlnID0gKG1vZGVfY3RybCAmIDB4MDAwMDBmMDApID4+IDg7CisJCWlmIChtb2RlLT5jbG9jayA+PSAxNjUwMDApCisJCQlvcl9jb25maWcgfD0gMHgwMTAwOworCQlicmVhazsKKwljYXNlIE9VVFBVVF9MVkRTOgorCQlvcl9jb25maWcgPSAobW9kZV9jdHJsICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJaWYgKGJpb3MtPmZwX25vX2RkYykgeworCQkJaWYgKGJpb3MtPmZwLmR1YWxfbGluaykKKwkJCQlvcl9jb25maWcgfD0gMHgwMTAwOworCQkJaWYgKGJpb3MtPmZwLmlmX2lzXzI0Yml0KQorCQkJCW9yX2NvbmZpZyB8PSAweDAyMDA7CisJCX0gZWxzZSB7CisJCQlpZiAobnZfY29ubmVjdG9yLT5kY2ItPnR5cGUgPT0gRENCX0NPTk5FQ1RPUl9MVkRTX1NQV0cpIHsKKwkJCQlpZiAoKCh1OCAqKW52X2Nvbm5lY3Rvci0+ZWRpZClbMTIxXSA9PSAyKQorCQkJCQlvcl9jb25maWcgfD0gMHgwMTAwOworCQkJfSBlbHNlCisJCQlpZiAobW9kZS0+Y2xvY2sgPj0gYmlvcy0+ZnAuZHVhbGxpbmtfdHJhbnNpdGlvbl9jbGspIHsKKwkJCQlvcl9jb25maWcgfD0gMHgwMTAwOworCQkJfQorCisJCQlpZiAob3JfY29uZmlnICYgMHgwMTAwKSB7CisJCQkJaWYgKGJpb3MtPmZwLnN0cmFwbGVzc19pc18yNGJpdCAmIDIpCisJCQkJCW9yX2NvbmZpZyB8PSAweDAyMDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChiaW9zLT5mcC5zdHJhcGxlc3NfaXNfMjRiaXQgJiAxKQorCQkJCQlvcl9jb25maWcgfD0gMHgwMjAwOworCQkJfQorCisJCQlpZiAobnZfY29ubmVjdG9yLT5iYXNlLmRpc3BsYXlfaW5mby5icGMgPT0gOCkKKwkJCQlvcl9jb25maWcgfD0gMHgwMjAwOworCisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHX09OKDEpOworCQlicmVhazsKKwl9CisKKwludmQwX3Nvcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCisJcHVzaCA9IGV2b193YWl0KGVuY29kZXItPmRldiwgMCwgNCk7CisJaWYgKHB1c2gpIHsKKwkJZXZvX210aGQocHVzaCwgMHgwMjAwICsgKG52X2VuY29kZXItPm9yICogMHgyMCksIDIpOworCQlldm9fZGF0YShwdXNoLCBtb2RlX2N0cmwpOworCQlldm9fZGF0YShwdXNoLCBvcl9jb25maWcpOworCQlldm9fa2ljayhwdXNoLCBlbmNvZGVyLT5kZXYsIDApOworCX0KKworCW52X2VuY29kZXItPmNydGMgPSBlbmNvZGVyLT5jcnRjOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9zb3JfZGlzY29ubmVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXUzMiAqcHVzaDsKKworCWlmIChudl9lbmNvZGVyLT5jcnRjKSB7CisJCW52ZDBfY3J0Y19wcmVwYXJlKG52X2VuY29kZXItPmNydGMpOworCisJCXB1c2ggPSBldm9fd2FpdChkZXYsIDAsIDQpOworCQlpZiAocHVzaCkgeworCQkJZXZvX210aGQocHVzaCwgMHgwMjAwICsgKG52X2VuY29kZXItPm9yICogMHgyMCksIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCQlldm9fbXRoZChwdXNoLCAweDAwODAsIDEpOworCQkJZXZvX2RhdGEocHVzaCwgMHgwMDAwMDAwMCk7CisJCQlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCQl9CisKKwkJbnZfZW5jb2Rlci0+Y3J0YyA9IE5VTEw7CisJCW52X2VuY29kZXItPmxhc3RfZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOworCX0KK30KKworc3RhdGljIHZvaWQKK252ZDBfc29yX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCWRybV9lbmNvZGVyX2NsZWFudXAoZW5jb2Rlcik7CisJa2ZyZWUoZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIG52ZDBfc29yX2hmdW5jID0geworCS5kcG1zID0gbnZkMF9zb3JfZHBtcywKKwkubW9kZV9maXh1cCA9IG52ZDBfc29yX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBudmQwX3Nvcl9wcmVwYXJlLAorCS5jb21taXQgPSBudmQwX3Nvcl9jb21taXQsCisJLm1vZGVfc2V0ID0gbnZkMF9zb3JfbW9kZV9zZXQsCisJLmRpc2FibGUgPSBudmQwX3Nvcl9kaXNjb25uZWN0LAorCS5nZXRfY3J0YyA9IG52ZDBfZGlzcGxheV9jcnRjX2dldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgbnZkMF9zb3JfZnVuYyA9IHsKKwkuZGVzdHJveSA9IG52ZDBfc29yX2Rlc3Ryb3ksCit9OworCitzdGF0aWMgaW50CitudmQwX3Nvcl9jcmVhdGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRjYl9lbnRyeSAqZGNiZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZW5jb2RlciAqbnZfZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CisKKwludl9lbmNvZGVyID0ga3phbGxvYyhzaXplb2YoKm52X2VuY29kZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW52X2VuY29kZXIpCisJCXJldHVybiAtRU5PTUVNOworCW52X2VuY29kZXItPmRjYiA9IGRjYmU7CisJbnZfZW5jb2Rlci0+b3IgPSBmZnMoZGNiZS0+b3IpIC0gMTsKKwludl9lbmNvZGVyLT5sYXN0X2RwbXMgPSBEUk1fTU9ERV9EUE1TX09GRjsKKworCWVuY29kZXIgPSB0b19kcm1fZW5jb2Rlcihudl9lbmNvZGVyKTsKKwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGRjYmUtPmhlYWRzOworCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZudmQwX3Nvcl9mdW5jLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJm52ZDBfc29yX2hmdW5jKTsKKworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2Rlcihjb25uZWN0b3IsIGVuY29kZXIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJUlEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgZGNiX2VudHJ5ICoKK2xvb2t1cF9kY2Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGlkLCB1MzIgbWMpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgdHlwZSwgb3IsIGk7CisKKwlpZiAoaWQgPCA0KSB7CisJCXR5cGUgPSBPVVRQVVRfQU5BTE9HOworCQlvciAgID0gaWQ7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChtYyAmIDB4MDAwMDBmMDApIHsKKwkJY2FzZSAweDAwMDAwMDAwOiB0eXBlID0gT1VUUFVUX0xWRFM7IGJyZWFrOworCQljYXNlIDB4MDAwMDAxMDA6IHR5cGUgPSBPVVRQVVRfVE1EUzsgYnJlYWs7CisJCWNhc2UgMHgwMDAwMDIwMDogdHlwZSA9IE9VVFBVVF9UTURTOyBicmVhazsKKwkJY2FzZSAweDAwMDAwNTAwOiB0eXBlID0gT1VUUFVUX1RNRFM7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJTlZfRVJST1IoZGV2LCAiUERJU1A6IHVua25vd24gU09SIG1jIDB4JTA4eFxuIiwgbWMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlvciA9IGlkIC0gNDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZiaW9zLmRjYi5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGRjYl9lbnRyeSAqZGNiID0gJmRldl9wcml2LT52Ymlvcy5kY2IuZW50cnlbaV07CisJCWlmIChkY2ItPnR5cGUgPT0gdHlwZSAmJiAoZGNiLT5vciAmICgxIDw8IG9yKSkpCisJCQlyZXR1cm4gZGNiOworCX0KKworCU5WX0VSUk9SKGRldiwgIlBESVNQOiBEQ0IgZm9yICVkLzB4JTA4eCBub3QgZm91bmRcbiIsIGlkLCBtYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2Rpc3BsYXlfdW5rMV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjcnRjLCB1MzIgbWFzaykKK3sKKwlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtYXNrICYmIGkgPCA4OyBpKyspIHsKKwkJdTMyIG1jYyA9IG52X3JkMzIoZGV2LCAweDY0MDE4MCArIChpICogMHgyMCkpOworCQlpZiAoIShtY2MgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlkY2IgPSBsb29rdXBfZGNiKGRldiwgaSwgbWNjKTsKKwkJaWYgKCFkY2IpCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCAweDAwMDAsIC0xLCBkY2IsIGNydGMpOworCX0KKworCW52X3dyMzIoZGV2LCAweDYxMDFkNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwOWQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTAxZDAsIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kaXNwbGF5X3VuazJfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgY3J0YywgdTMyIG1hc2spCit7CisJc3RydWN0IGRjYl9lbnRyeSAqZGNiOworCXUzMiBvciwgdG1wLCBwY2xrOworCWludCBpOworCisJZm9yIChpID0gMDsgbWFzayAmJiBpIDwgODsgaSsrKSB7CisJCXUzMiBtY2MgPSBudl9yZDMyKGRldiwgMHg2NDAxODAgKyAoaSAqIDB4MjApKTsKKwkJaWYgKCEobWNjICYgKDEgPDwgY3J0YykpKQorCQkJY29udGludWU7CisKKwkJZGNiID0gbG9va3VwX2RjYihkZXYsIGksIG1jYyk7CisJCWlmICghZGNiKQorCQkJY29udGludWU7CisKKwkJbm91dmVhdV9iaW9zX3J1bl9kaXNwbGF5X3RhYmxlKGRldiwgMHgwMDAwLCAtMiwgZGNiLCBjcnRjKTsKKwl9CisKKwlwY2xrID0gbnZfcmQzMihkZXYsIDB4NjYwNDUwICsgKGNydGMgKiAweDMwMCkpIC8gMTAwMDsKKwlpZiAobWFzayAmIDB4MDAwMTAwMDApIHsKKwkJbnY1MF9jcnRjX3NldF9jbG9jayhkZXYsIGNydGMsIHBjbGspOworCX0KKworCWZvciAoaSA9IDA7IG1hc2sgJiYgaSA8IDg7IGkrKykgeworCQl1MzIgbWNwID0gbnZfcmQzMihkZXYsIDB4NjYwMTgwICsgKGkgKiAweDIwKSk7CisJCXUzMiBjZmcgPSBudl9yZDMyKGRldiwgMHg2NjAxODQgKyAoaSAqIDB4MjApKTsKKwkJaWYgKCEobWNwICYgKDEgPDwgY3J0YykpKQorCQkJY29udGludWU7CisKKwkJZGNiID0gbG9va3VwX2RjYihkZXYsIGksIG1jcCk7CisJCWlmICghZGNiKQorCQkJY29udGludWU7CisJCW9yID0gZmZzKGRjYi0+b3IpIC0gMTsKKworCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBjZmcsIHBjbGssIGRjYiwgY3J0Yyk7CisKKwkJbnZfd3IzMihkZXYsIDB4NjEyMjAwICsgKGNydGMgKiAweDgwMCksIDB4MDAwMDAwMDApOworCQlzd2l0Y2ggKGRjYi0+dHlwZSkgeworCQljYXNlIE9VVFBVVF9BTkFMT0c6CisJCQludl93cjMyKGRldiwgMHg2MTIyODAgKyAob3IgKiAweDgwMCksIDB4MDAwMDAwMDApOworCQkJYnJlYWs7CisJCWNhc2UgT1VUUFVUX1RNRFM6CisJCWNhc2UgT1VUUFVUX0xWRFM6CisJCQlpZiAoY2ZnICYgMHgwMDAwMDEwMCkKKwkJCQl0bXAgPSAweDAwMDAwMTAxOworCQkJZWxzZQorCQkJCXRtcCA9IDB4MDAwMDAwMDA7CisKKwkJCW52X21hc2soZGV2LCAweDYxMjMwMCArIChvciAqIDB4ODAwKSwgMHgwMDAwMDcwNywgdG1wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwl9CisKKwludl93cjMyKGRldiwgMHg2MTAxZDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDYxMDlkNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwMWQwLCAweDgwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252ZDBfZGlzcGxheV91bms0X2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGNydGMsIHUzMiBtYXNrKQoreworCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKKwlpbnQgcGNsaywgaTsKKworCXBjbGsgPSBudl9yZDMyKGRldiwgMHg2NjA0NTAgKyAoY3J0YyAqIDB4MzAwKSkgLyAxMDAwOworCisJZm9yIChpID0gMDsgbWFzayAmJiBpIDwgODsgaSsrKSB7CisJCXUzMiBtY3AgPSBudl9yZDMyKGRldiwgMHg2NjAxODAgKyAoaSAqIDB4MjApKTsKKwkJdTMyIGNmZyA9IG52X3JkMzIoZGV2LCAweDY2MDE4NCArIChpICogMHgyMCkpOworCQlpZiAoIShtY3AgJiAoMSA8PCBjcnRjKSkpCisJCQljb250aW51ZTsKKworCQlkY2IgPSBsb29rdXBfZGNiKGRldiwgaSwgbWNwKTsKKwkJaWYgKCFkY2IpCisJCQljb250aW51ZTsKKworCQlub3V2ZWF1X2Jpb3NfcnVuX2Rpc3BsYXlfdGFibGUoZGV2LCBjZmcsIC1wY2xrLCBkY2IsIGNydGMpOworCX0KKworCW52X3dyMzIoZGV2LCAweDYxMDFkNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NjEwOWQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg2MTAxZDAsIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZkMF9kaXNwbGF5X2JoKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbnZkMF9kaXNwbGF5ICpkaXNwID0gbnZkMF9kaXNwbGF5KGRldik7CisJdTMyIG1hc2ssIGNydGM7CisJaW50IGk7CisKKwlpZiAoZHJtX2RlYnVnICYgKERSTV9VVF9EUklWRVIgfCBEUk1fVVRfS01TKSkgeworCQlOVl9JTkZPKGRldiwgIlBESVNQOiBtb2Rlc2V0IHJlcSAlZFxuIiwgZGlzcC0+bW9kZXNldCk7CisJCU5WX0lORk8oZGV2LCAiIFNUQVQ6IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJIG52X3JkMzIoZGV2LCAweDYxMDFkMCksCisJCQkgbnZfcmQzMihkZXYsIDB4NjEwMWQ0KSwgbnZfcmQzMihkZXYsIDB4NjEwOWQ0KSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCU5WX0lORk8oZGV2LCAiICVzJWQ6IDB4JTA4eCAweCUwOHhcbiIsCisJCQkJaSA8IDQgPyAiREFDIiA6ICJTT1IiLCBpLAorCQkJCW52X3JkMzIoZGV2LCAweDY0MDE4MCArIChpICogMHgyMCkpLAorCQkJCW52X3JkMzIoZGV2LCAweDY2MDE4MCArIChpICogMHgyMCkpKTsKKwkJfQorCX0KKworCW1hc2sgPSBudl9yZDMyKGRldiwgMHg2MTAxZDQpOworCWNydGMgPSAwOworCWlmICghbWFzaykgeworCQltYXNrID0gbnZfcmQzMihkZXYsIDB4NjEwOWQ0KTsKKwkJY3J0YyA9IDE7CisJfQorCisJaWYgKGRpc3AtPm1vZGVzZXQgJiAweDAwMDAwMDAxKQorCQludmQwX2Rpc3BsYXlfdW5rMV9oYW5kbGVyKGRldiwgY3J0YywgbWFzayk7CisJaWYgKGRpc3AtPm1vZGVzZXQgJiAweDAwMDAwMDAyKQorCQludmQwX2Rpc3BsYXlfdW5rMl9oYW5kbGVyKGRldiwgY3J0YywgbWFzayk7CisJaWYgKGRpc3AtPm1vZGVzZXQgJiAweDAwMDAwMDA0KQorCQludmQwX2Rpc3BsYXlfdW5rNF9oYW5kbGVyKGRldiwgY3J0YywgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkCitudmQwX2Rpc3BsYXlfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBudmQwX2Rpc3BsYXkgKmRpc3AgPSBudmQwX2Rpc3BsYXkoZGV2KTsKKwl1MzIgaW50ciA9IG52X3JkMzIoZGV2LCAweDYxMDA4OCk7CisKKwlpZiAoaW50ciAmIDB4MDAwMDAwMDIpIHsKKwkJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHg2MTAwOWMpOworCQlpbnQgY2hpZCA9IGZmcyhzdGF0KSAtIDE7CisJCWlmIChjaGlkID49IDApIHsKKwkJCXUzMiBtdGhkID0gbnZfcmQzMihkZXYsIDB4NjEwMWYwICsgKGNoaWQgKiAxMikpOworCQkJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgMHg2MTAxZjQgKyAoY2hpZCAqIDEyKSk7CisJCQl1MzIgdW5rbiA9IG52X3JkMzIoZGV2LCAweDYxMDFmOCArIChjaGlkICogMTIpKTsKKworCQkJTlZfSU5GTyhkZXYsICJFdm9DaDogY2hpZCAlZCBtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eCAiCisJCQkJICAgICAiMHglMDh4IDB4JTA4eFxuIiwKKwkJCQljaGlkLCAobXRoZCAmIDB4MDAwMGZmYyksIGRhdGEsIG10aGQsIHVua24pOworCQkJbnZfd3IzMihkZXYsIDB4NjEwMDljLCAoMSA8PCBjaGlkKSk7CisJCQludl93cjMyKGRldiwgMHg2MTAxZjAgKyAoY2hpZCAqIDEyKSwgMHg5MDAwMDAwMCk7CisJCX0KKworCQlpbnRyICY9IH4weDAwMDAwMDAyOworCX0KKworCWlmIChpbnRyICYgMHgwMDEwMDAwMCkgeworCQl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDYxMDBhYyk7CisKKwkJaWYgKHN0YXQgJiAweDAwMDAwMDA3KSB7CisJCQlkaXNwLT5tb2Rlc2V0ID0gc3RhdDsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRpc3AtPnRhc2tsZXQpOworCisJCQludl93cjMyKGRldiwgMHg2MTAwYWMsIChzdGF0ICYgMHgwMDAwMDAwNykpOworCQkJc3RhdCAmPSB+MHgwMDAwMDAwNzsKKwkJfQorCisJCWlmIChzdGF0KSB7CisJCQlOVl9JTkZPKGRldiwgIlBESVNQOiB1bmtub3duIGludHIyNCAweCUwOHhcbiIsIHN0YXQpOworCQkJbnZfd3IzMihkZXYsIDB4NjEwMGFjLCBzdGF0KTsKKwkJfQorCisJCWludHIgJj0gfjB4MDAxMDAwMDA7CisJfQorCisJaWYgKGludHIgJiAweDAxMDAwMDAwKSB7CisJCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4NjEwMGJjKTsKKwkJbnZfd3IzMihkZXYsIDB4NjEwMGJjLCBzdGF0KTsKKwkJaW50ciAmPSB+MHgwMTAwMDAwMDsKKwl9CisKKwlpZiAoaW50ciAmIDB4MDIwMDAwMDApIHsKKwkJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHg2MTA4YmMpOworCQludl93cjMyKGRldiwgMHg2MTA4YmMsIHN0YXQpOworCQlpbnRyICY9IH4weDAyMDAwMDAwOworCX0KKworCWlmIChpbnRyKQorCQlOVl9JTkZPKGRldiwgIlBESVNQOiB1bmtub3duIGludHIgMHglMDh4XG4iLCBpbnRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK252ZDBfZGlzcGxheV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwkvKiBmaW5pIGN1cnNvcnMgKi8KKwlmb3IgKGkgPSAxNDsgaSA+PSAxMzsgaS0tKSB7CisJCWlmICghKG52X3JkMzIoZGV2LCAweDYxMDQ5MCArIChpICogMHgxMCkpICYgMHgwMDAwMDAwMSkpCisJCQljb250aW51ZTsKKworCQludl9tYXNrKGRldiwgMHg2MTA0OTAgKyAoaSAqIDB4MTApLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwkJbnZfd2FpdChkZXYsIDB4NjEwNDkwICsgKGkgKiAweDEwKSwgMHgwMDAxMDAwMCwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCAweDYxMDA5MCwgMSA8PCBpLCAweDAwMDAwMDAwKTsKKwkJbnZfbWFzayhkZXYsIDB4NjEwMGEwLCAxIDw8IGksIDB4MDAwMDAwMDApOworCX0KKworCS8qIGZpbmkgbWFzdGVyICovCisJaWYgKG52X3JkMzIoZGV2LCAweDYxMDQ5MCkgJiAweDAwMDAwMDEwKSB7CisJCW52X21hc2soZGV2LCAweDYxMDQ5MCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCAweDYxMDQ5MCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCk7CisJCW52X3dhaXQoZGV2LCAweDYxMDQ5MCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCAweDYxMDA5MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJCW52X21hc2soZGV2LCAweDYxMDBhMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJfQorfQorCitpbnQKK252ZDBfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG52ZDBfZGlzcGxheSAqZGlzcCA9IG52ZDBfZGlzcGxheShkZXYpOworCXUzMiAqcHVzaDsKKwlpbnQgaTsKKworCWlmIChudl9yZDMyKGRldiwgMHg2MTAwYWMpICYgMHgwMDAwMDEwMCkgeworCQludl93cjMyKGRldiwgMHg2MTAwYWMsIDB4MDAwMDAxMDApOworCQludl9tYXNrKGRldiwgMHg2MTk0ZTgsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCQlpZiAoIW52X3dhaXQoZGV2LCAweDYxOTRlOCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCkpIHsKKwkJCU5WX0VSUk9SKGRldiwgIlBESVNQOiAweDYxOTRlOCAweCUwOHhcbiIsCisJCQkJIG52X3JkMzIoZGV2LCAweDYxOTRlOCkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCS8qIG5maSB3aGF0IHRoZXNlIGFyZSBleGFjdGx5LCBpIGRvIGtub3cgdGhhdCBTT1JfTU9ERV9DVFJMIHdvbid0CisJICogd29yayBhdCBhbGwgdW5sZXNzIHlvdSBkbyB0aGUgU09SIHBhcnQgYmVsb3cuCisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1MzIgZGFjID0gbnZfcmQzMihkZXYsIDB4NjFhMDAwICsgKGkgKiAweDgwMCkpOworCQludl93cjMyKGRldiwgMHg2MTAxYzAgKyAoaSAqIDB4ODAwKSwgZGFjKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXUzMiBzb3IgPSBudl9yZDMyKGRldiwgMHg2MWMwMDAgKyAoaSAqIDB4ODAwKSk7CisJCW52X3dyMzIoZGV2LCAweDYzMDFjNCArIChpICogMHg4MDApLCBzb3IpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdTMyIGNydGMwID0gbnZfcmQzMihkZXYsIDB4NjE2MTA0ICsgKGkgKiAweDgwMCkpOworCQl1MzIgY3J0YzEgPSBudl9yZDMyKGRldiwgMHg2MTYxMDggKyAoaSAqIDB4ODAwKSk7CisJCXUzMiBjcnRjMiA9IG52X3JkMzIoZGV2LCAweDYxNjEwYyArIChpICogMHg4MDApKTsKKwkJbnZfd3IzMihkZXYsIDB4NjEwMWI0ICsgKGkgKiAweDgwMCksIGNydGMwKTsKKwkJbnZfd3IzMihkZXYsIDB4NjEwMWI4ICsgKGkgKiAweDgwMCksIGNydGMxKTsKKwkJbnZfd3IzMihkZXYsIDB4NjEwMWJjICsgKGkgKiAweDgwMCksIGNydGMyKTsKKwl9CisKKwkvKiBwb2ludCBhdCBvdXIgaGFzaCB0YWJsZSAvIG9iamVjdHMsIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbnZfd3IzMihkZXYsIDB4NjEwMDEwLCAoZGlzcC0+bWVtLT52aW5zdCA+PiA4KSB8IDkpOworCW52X21hc2soZGV2LCAweDYxMDBiMCwgMHgwMDAwMDMwNywgMHgwMDAwMDMwNyk7CisKKwkvKiBpbml0IG1hc3RlciAqLworCW52X3dyMzIoZGV2LCAweDYxMDQ5NCwgKGRpc3AtPmV2b1swXS5oYW5kbGUgPj4gOCkgfCAzKTsKKwludl93cjMyKGRldiwgMHg2MTA0OTgsIDB4MDAwMTAwMDApOworCW52X3dyMzIoZGV2LCAweDYxMDQ5YywgMHgwMDAwMDAwMSk7CisJbnZfbWFzayhkZXYsIDB4NjEwNDkwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwKTsKKwludl93cjMyKGRldiwgMHg2NDAwMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDYxMDQ5MCwgMHgwMTAwMDAxMyk7CisJaWYgKCFudl93YWl0KGRldiwgMHg2MTA0OTAsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgIlBESVNQOiBtYXN0ZXIgMHglMDh4XG4iLAorCQkJIG52X3JkMzIoZGV2LCAweDYxMDQ5MCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwludl9tYXNrKGRldiwgMHg2MTAwOTAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCW52X21hc2soZGV2LCAweDYxMDBhMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisKKwkvKiBpbml0IGN1cnNvcnMgKi8KKwlmb3IgKGkgPSAxMzsgaSA8PSAxNDsgaSsrKSB7CisJCW52X3dyMzIoZGV2LCAweDYxMDQ5MCArIChpICogMHgxMCksIDB4MDAwMDAwMDEpOworCQlpZiAoIW52X3dhaXQoZGV2LCAweDYxMDQ5MCArIChpICogMHgxMCksIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDApKSB7CisJCQlOVl9FUlJPUihkZXYsICJQRElTUDogY3VycyVkIDB4JTA4eFxuIiwgaSwKKwkJCQkgbnZfcmQzMihkZXYsIDB4NjEwNDkwICsgKGkgKiAweDEwKSkpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCW52X21hc2soZGV2LCAweDYxMDA5MCwgMSA8PCBpLCAxIDw8IGkpOworCQludl9tYXNrKGRldiwgMHg2MTAwYTAsIDEgPDwgaSwgMSA8PCBpKTsKKwl9CisKKwlwdXNoID0gZXZvX3dhaXQoZGV2LCAwLCAzMik7CisJaWYgKCFwdXNoKQorCQlyZXR1cm4gLUVCVVNZOworCWV2b19tdGhkKHB1c2gsIDB4MDA4OCwgMSk7CisJZXZvX2RhdGEocHVzaCwgTnZFdm9TeW5jKTsKKwlldm9fbXRoZChwdXNoLCAweDAwODQsIDEpOworCWV2b19kYXRhKHB1c2gsIDB4MDAwMDAwMDApOworCWV2b19tdGhkKHB1c2gsIDB4MDA4NCwgMSk7CisJZXZvX2RhdGEocHVzaCwgMHg4MDAwMDAwMCk7CisJZXZvX210aGQocHVzaCwgMHgwMDhjLCAxKTsKKwlldm9fZGF0YShwdXNoLCAweDAwMDAwMDAwKTsKKwlldm9fa2ljayhwdXNoLCBkZXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252ZDBfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZkMF9kaXNwbGF5ICpkaXNwID0gbnZkMF9kaXNwbGF5KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CisKKwludmQwX2Rpc3BsYXlfZmluaShkZXYpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBQQUdFX1NJWkUsIGRpc3AtPmV2b1swXS5wdHIsIGRpc3AtPmV2b1swXS5oYW5kbGUpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZGlzcC0+bWVtKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMjYpOworCisJZGV2X3ByaXYtPmVuZ2luZS5kaXNwbGF5LnByaXYgPSBOVUxMOworCWtmcmVlKGRpc3ApOworfQorCitpbnQKK252ZDBfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICpwaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IGRjYl90YWJsZSAqZGNiID0gJmRldl9wcml2LT52Ymlvcy5kY2I7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgKnRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlzdHJ1Y3QgbnZkMF9kaXNwbGF5ICpkaXNwOworCXN0cnVjdCBkY2JfZW50cnkgKmRjYmU7CisJaW50IHJldCwgaTsKKworCWRpc3AgPSBremFsbG9jKHNpemVvZigqZGlzcCksIEdGUF9LRVJORUwpOworCWlmICghZGlzcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2X3ByaXYtPmVuZ2luZS5kaXNwbGF5LnByaXYgPSBkaXNwOworCisJLyogY3JlYXRlIGNydGMgb2JqZWN0cyB0byByZXByZXNlbnQgdGhlIGh3IGhlYWRzICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlyZXQgPSBudmQwX2NydGNfY3JlYXRlKGRldiwgaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjcmVhdGUgZW5jb2Rlci9jb25uZWN0b3Igb2JqZWN0cyBiYXNlZCBvbiBWQklPUyBEQ0IgdGFibGUgKi8KKwlmb3IgKGkgPSAwLCBkY2JlID0gJmRjYi0+ZW50cnlbMF07IGkgPCBkY2ItPmVudHJpZXM7IGkrKywgZGNiZSsrKSB7CisJCWNvbm5lY3RvciA9IG5vdXZlYXVfY29ubmVjdG9yX2NyZWF0ZShkZXYsIGRjYmUtPmNvbm5lY3Rvcik7CisJCWlmIChJU19FUlIoY29ubmVjdG9yKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkY2JlLT5sb2NhdGlvbiAhPSBEQ0JfTE9DX09OX0NISVApIHsKKwkJCU5WX1dBUk4oZGV2LCAic2tpcHBpbmcgb2ZmLWNoaXAgZW5jb2RlciAlZC8lZFxuIiwKKwkJCQlkY2JlLT50eXBlLCBmZnMoZGNiZS0+b3IpIC0gMSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoZGNiZS0+dHlwZSkgeworCQljYXNlIE9VVFBVVF9UTURTOgorCQljYXNlIE9VVFBVVF9MVkRTOgorCQkJbnZkMF9zb3JfY3JlYXRlKGNvbm5lY3RvciwgZGNiZSk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRQVVRfQU5BTE9HOgorCQkJbnZkMF9kYWNfY3JlYXRlKGNvbm5lY3RvciwgZGNiZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCU5WX1dBUk4oZGV2LCAic2tpcHBpbmcgdW5zdXBwb3J0ZWQgZW5jb2RlciAlZC8lZFxuIiwKKwkJCQlkY2JlLT50eXBlLCBmZnMoZGNiZS0+b3IpIC0gMSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qIGN1bGwgYW55IGNvbm5lY3RvcnMgd2UgY3JlYXRlZCB0aGF0IGRvbid0IGhhdmUgYW4gZW5jb2RlciAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb25uZWN0b3IsIHRtcCwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNvbm5lY3Rvci0+ZW5jb2Rlcl9pZHNbMF0pCisJCQljb250aW51ZTsKKworCQlOVl9XQVJOKGRldiwgIiVzIGhhcyBubyBlbmNvZGVycywgcmVtb3ZpbmdcbiIsCisJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOworCQljb25uZWN0b3ItPmZ1bmNzLT5kZXN0cm95KGNvbm5lY3Rvcik7CisJfQorCisJLyogc2V0dXAgaW50ZXJydXB0IGhhbmRsaW5nICovCisJdGFza2xldF9pbml0KCZkaXNwLT50YXNrbGV0LCBudmQwX2Rpc3BsYXlfYmgsICh1bnNpZ25lZCBsb25nKWRldik7CisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNiwgbnZkMF9kaXNwbGF5X2ludHIpOworCisJLyogaGFzaCB0YWJsZSBhbmQgZG1hIG9iamVjdHMgZm9yIHRoZSBtZW1vcnkgYXJlYXMgd2UgY2FyZSBhYm91dCAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDB4NDAwMCwgMHgxMDAwMCwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmZGlzcC0+bWVtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMDAsIDB4MDAwMDAwNDkpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMDQsIChkaXNwLT5tZW0tPnZpbnN0ICsgMHgyMDAwKSA+PiA4KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDA4LCAoZGlzcC0+bWVtLT52aW5zdCArIDB4MmZmZikgPj4gOCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAwYywgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAxMCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTAxNCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MDAwMCwgTnZFdm9TeW5jKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDA0LCAoMHgxMDAwIDw8IDkpIHwgMHgwMDAwMDAwMSk7CisKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDIwLCAweDAwMDAwMDQ5KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDI0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDI4LCAoZGV2X3ByaXYtPnZyYW1fc2l6ZSAtIDEpID4+IDgpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMmMsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMzAsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwMzQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDAwMDgsIE52RXZvVlJBTSk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MDAwYywgKDB4MTAyMCA8PCA5KSB8IDB4MDAwMDAwMDEpOworCisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA0MCwgMHgwMDAwMDAwOSk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA0NCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA0OCwgKGRldl9wcml2LT52cmFtX3NpemUgLSAxKSA+PiA4KTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDRjLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDUwLCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgxMDU0LCAweDAwMDAwMDAwKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDEwLCBOdkV2b1ZSQU1fTFApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDAwMTQsICgweDEwNDAgPDwgOSkgfCAweDAwMDAwMDAxKTsKKworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNjAsIDB4MGZlMDAwMDkpOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNjQsIDB4MDAwMDAwMDApOworCW52X3dvMzIoZGlzcC0+bWVtLCAweDEwNjgsIChkZXZfcHJpdi0+dnJhbV9zaXplIC0gMSkgPj4gOCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA2YywgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA3MCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MTA3NCwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihkaXNwLT5tZW0sIDB4MDAxOCwgTnZFdm9GQjMyKTsKKwludl93bzMyKGRpc3AtPm1lbSwgMHgwMDFjLCAoMHgxMDYwIDw8IDkpIHwgMHgwMDAwMDAwMSk7CisKKwlwaW5zdG1lbS0+Zmx1c2goZGV2KTsKKworCS8qIHB1c2ggYnVmZmVycyBmb3IgZXZvIGNoYW5uZWxzICovCisJZGlzcC0+ZXZvWzBdLnB0ciA9CisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgJmRpc3AtPmV2b1swXS5oYW5kbGUpOworCWlmICghZGlzcC0+ZXZvWzBdLnB0cikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBudmQwX2Rpc3BsYXlfaW5pdChkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCitvdXQ6CisJaWYgKHJldCkKKwkJbnZkMF9kaXNwbGF5X2Rlc3Ryb3koZGV2KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfY2NlLmMKaW5kZXggNTcwZTE5MC4uYmNhYzkwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2NjZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3IxMjgvcjEyOF9kcnYuYwppbmRleCBiOWU4ZWZkLi40Yzg3OTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcjEyOC9yMTI4X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yMTI4L3IxMjhfZHJ2LmMKQEAgLTI5LDYgKzI5LDggQEAKICAqICAgIEdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAicjEyOF9kcm0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCmluZGV4IDlmMzYzZTAuLmNmOGI0YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQpAQCAtNzAsNyArNzAsNyBAQAogCXIyMDAubyByYWRlb25fbGVnYWN5X3R2Lm8gcjYwMF9jcy5vIHI2MDBfYmxpdC5vIHI2MDBfYmxpdF9zaGFkZXJzLm8gXAogCXI2MDBfYmxpdF9rbXMubyByYWRlb25fcG0ubyBhdG9tYmlvc19kcC5vIHI2MDBfYXVkaW8ubyByNjAwX2hkbWkubyBcCiAJZXZlcmdyZWVuLm8gZXZlcmdyZWVuX2NzLm8gZXZlcmdyZWVuX2JsaXRfc2hhZGVycy5vIGV2ZXJncmVlbl9ibGl0X2ttcy5vIFwKLQlyYWRlb25fdHJhY2VfcG9pbnRzLm8gbmkubyBjYXltYW5fYmxpdF9zaGFkZXJzLm8KKwlyYWRlb25fdHJhY2VfcG9pbnRzLm8gbmkubyBjYXltYW5fYmxpdF9zaGFkZXJzLm8gYXRvbWJpb3NfZW5jb2RlcnMubwogCiByYWRlb24tJChDT05GSUdfQ09NUEFUKSArPSByYWRlb25faW9jMzIubwogcmFkZW9uLSQoQ09ORklHX1ZHQV9TV0lUQ0hFUk9PKSArPSByYWRlb25fYXRweF9oYW5kbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggYTUxNWIyYS4uODc2MzFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQkJCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKIAkJCWVuY29kZXJfbW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CiAJCQlpZiAoKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB8fAotCQkJICAgIHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkgeworCQkJICAgIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0gRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkpIHsKIAkJCQlpZiAoY29ubmVjdG9yKSB7CiAJCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCQkJCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9CkBAIC02MzgsNDQgKzYzOCwyOSBAQAogCQkJCWlmIChzc19lbmFibGVkICYmIHNzLT5wZXJjZW50YWdlKQogCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0Rpc3BQbGxDb25maWcgfD0KIAkJCQkJCURJU1BQTExfQ09ORklHX1NTX0VOQUJMRTsKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpIHx8Ci0JCQkJICAgIHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkgeworCQkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoZW5jb2Rlcl9tb2RlKSkgeworCQkJCQlhcmdzLnYzLnNJbnB1dC51Y0Rpc3BQbGxDb25maWcgfD0KKwkJCQkJCURJU1BQTExfQ09ORklHX0NPSEVSRU5UX01PREU7CisJCQkJCS8qIDE2MjAwIG9yIDI3MDAwICovCisJCQkJCWFyZ3MudjMuc0lucHV0LnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KGRwX2Nsb2NrIC8gMTApOworCQkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CiAJCQkJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCQkJCQlpZiAoZW5jb2Rlcl9tb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7CisJCQkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKKwkJCQkJCS8qIGRlZXAgY29sb3Igc3VwcG9ydCAqLworCQkJCQkJYXJncy52My5zSW5wdXQudXNQaXhlbENsb2NrID0KKwkJCQkJCQljcHVfdG9fbGUxNigobW9kZS0+Y2xvY2sgKiBicGMgLyA4KSAvIDEwKTsKKwkJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKIAkJCQkJCWFyZ3MudjMuc0lucHV0LnVjRGlzcFBsbENvbmZpZyB8PQogCQkJCQkJCURJU1BQTExfQ09ORklHX0NPSEVSRU5UX01PREU7Ci0JCQkJCQkvKiAxNjIwMCBvciAyNzAwMCAqLwotCQkJCQkJYXJncy52My5zSW5wdXQudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoZW5jb2Rlcl9tb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0hETUkpIHsKLQkJCQkJCQkvKiBkZWVwIGNvbG9yIHN1cHBvcnQgKi8KLQkJCQkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPQotCQkJCQkJCQljcHVfdG9fbGUxNigobW9kZS0+Y2xvY2sgKiBicGMgLyA4KSAvIDEwKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCi0JCQkJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnIHw9Ci0JCQkJCQkJCURJU1BQTExfQ09ORklHX0NPSEVSRU5UX01PREU7Ci0JCQkJCQlpZiAobW9kZS0+Y2xvY2sgPiAxNjUwMDApCi0JCQkJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnIHw9Ci0JCQkJCQkJCURJU1BQTExfQ09ORklHX0RVQUxfTElOSzsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQkJCWlmIChlbmNvZGVyX21vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKKwkJCQkJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQogCQkJCQkJYXJncy52My5zSW5wdXQudWNEaXNwUGxsQ29uZmlnIHw9Ci0JCQkJCQkJRElTUFBMTF9DT05GSUdfQ09IRVJFTlRfTU9ERTsKLQkJCQkJCS8qIDE2MjAwIG9yIDI3MDAwICovCi0JCQkJCQlhcmdzLnYzLnNJbnB1dC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKLQkJCQkJfSBlbHNlIGlmIChlbmNvZGVyX21vZGUgIT0gQVRPTV9FTkNPREVSX01PREVfTFZEUykgewotCQkJCQkJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQotCQkJCQkJCWFyZ3MudjMuc0lucHV0LnVjRGlzcFBsbENvbmZpZyB8PQotCQkJCQkJCQlESVNQUExMX0NPTkZJR19EVUFMX0xJTks7Ci0JCQkJCX0KKwkJCQkJCQlESVNQUExMX0NPTkZJR19EVUFMX0xJTks7CiAJCQkJfQotCQkJCWlmIChyYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpIHsKLQkJCQkJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOwotCQkJCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmV4dF9yYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGV4dF9lbmNvZGVyKTsKLQkJCQkJYXJncy52My5zSW5wdXQudWNFeHRUcmFuc21pdHRlcklEID0gZXh0X3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkOwotCQkJCX0gZWxzZQorCQkJCWlmIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0KKwkJCQkgICAgRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkKKwkJCQkJYXJncy52My5zSW5wdXQudWNFeHRUcmFuc21pdHRlcklEID0KKwkJCQkJCXJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChlbmNvZGVyKTsKKwkJCQllbHNlCiAJCQkJCWFyZ3MudjMuc0lucHV0LnVjRXh0VHJhbnNtaXR0ZXJJRCA9IDA7CiAKIAkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwKQEAgLTk0NSw2ICs5MzAsNyBAQAogCQlicGMgPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGM7CiAKIAkJc3dpdGNoIChlbmNvZGVyX21vZGUpIHsKKwkJY2FzZSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1Q6CiAJCWNhc2UgQVRPTV9FTkNPREVSX01PREVfRFA6CiAJCQkvKiBEUC9lRFAgKi8KIAkJCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2sgLyAxMDsKQEAgLTE0NTAsNyArMTQzNiw3IEBACiAJCQkJICogUFBMTC9EQ1BMTCBwcm9ncmFtbWluZyBhbmQgb25seSBwcm9ncmFtIHRoZSBEUCBEVE8gZm9yIHRoZQogCQkJCSAqIGNydGMgdmlydHVhbCBwaXhlbCBjbG9jay4KIAkJCQkgKi8KLQkJCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZSh0ZXN0X2VuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7CisJCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKHRlc3RfZW5jb2RlcikpKSB7CiAJCQkJCWlmIChBU0lDX0lTX0RDRTUocmRldikgfHwgcmRldi0+Y2xvY2suZHBfZXh0Y2xrKQogCQkJCQkJcmV0dXJuIEFUT01fUFBMTF9JTlZBTElEOwogCQkJCX0KQEAgLTE1MzYsMTIgKzE1MjIsNiBAQAogCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCS8qIGFkanVzdCBwbSB0byB1cGNvbWluZyBtb2RlIGNoYW5nZSAqLwotCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKLQogCWlmICghcmFkZW9uX2NydGNfc2NhbGluZ19tb2RlX2ZpeHVwKGNydGMsIG1vZGUsIGFkanVzdGVkX21vZGUpKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2RwLmMKaW5kZXggNzllOGViYy4uNmZiMzM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19kcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZHAuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCX0KIAl9CiAKLQlEUk1fRVJST1IoImF1eCBpMmMgdG9vIG1hbnkgcmV0cmllcywgZ2l2aW5nIHVwXG4iKTsKKwlEUk1fREVCVUdfS01TKCJhdXggaTJjIHRvbyBtYW55IHJldHJpZXMsIGdpdmluZyB1cFxuIik7CiAJcmV0dXJuIC1FUkVNT1RFSU87CiB9CiAKQEAgLTQ4Miw3ICs0ODIsOCBAQAogCWludCBicHAgPSBjb252ZXJ0X2JwY190b19icHAoY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjKTsKIAlpbnQgbGFuZV9udW0sIG1heF9waXhfY2xvY2s7CiAKLQlpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZShjb25uZWN0b3IpKQorCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfZ2V0X2RwX2JyaWRnZV9lbmNvZGVyX2lkKGNvbm5lY3RvcikgPT0KKwkgICAgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHKQogCQlyZXR1cm4gMjcwMDAwOwogCiAJbGFuZV9udW0gPSByYWRlb25fZHBfZ2V0X2RwX2xhbmVfbnVtYmVyKGNvbm5lY3RvciwgZHBjZCwgcGl4X2Nsb2NrKTsKQEAgLTU1MywxNyArNTU0LDMyIEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAJaW50IHBhbmVsX21vZGUgPSBEUF9QQU5FTF9NT0RFX0VYVEVSTkFMX0RQX01PREU7CiAKIAlpZiAoIUFTSUNfSVNfRENFNChyZGV2KSkKIAkJcmV0dXJuOwogCi0JaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19kcF9icmlkZ2UoY29ubmVjdG9yKSkKKwlpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChjb25uZWN0b3IpID09CisJICAgIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRykKIAkJcGFuZWxfbW9kZSA9IERQX1BBTkVMX01PREVfSU5URVJOQUxfRFAxX01PREU7CisJZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChjb25uZWN0b3IpID09CisJCSBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVMpCisJCXBhbmVsX21vZGUgPSBEUF9QQU5FTF9NT0RFX0lOVEVSTkFMX0RQMl9NT0RFOworCWVsc2UgaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgeworCQl1OCB0bXAgPSByYWRlb25fcmVhZF9kcGNkX3JlZyhyYWRlb25fY29ubmVjdG9yLCBEUF9FRFBfQ09ORklHVVJBVElPTl9DQVApOworCQlpZiAodG1wICYgMSkKKwkJCXBhbmVsX21vZGUgPSBEUF9QQU5FTF9NT0RFX0lOVEVSTkFMX0RQMl9NT0RFOworCX0KIAogCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsCiAJCQkJICAgQVRPTV9FTkNPREVSX0NNRF9TRVRVUF9QQU5FTF9NT0RFLAogCQkJCSAgIHBhbmVsX21vZGUpOworCisJaWYgKChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApICYmCisJICAgIChwYW5lbF9tb2RlID09IERQX1BBTkVMX01PREVfSU5URVJOQUxfRFAyX01PREUpKSB7CisJCXJhZGVvbl93cml0ZV9kcGNkX3JlZyhyYWRlb25fY29ubmVjdG9yLCBEUF9FRFBfQ09ORklHVVJBVElPTl9TRVQsIDEpOworCX0KIH0KIAogdm9pZCByYWRlb25fZHBfc2V0X2xpbmtfY29uZmlnKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2VuY29kZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2VuY29kZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljMDRjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfZW5jb2RlcnMuYwpAQCAtMCwwICsxLDIzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNy0xMSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBEYXZlIEFpcmxpZQorICogICAgICAgICAgQWxleCBEZXVjaGVyCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbi5oIgorI2luY2x1ZGUgImF0b20uaCIKKworZXh0ZXJuIGludCBhdG9tX2RlYnVnOworCisvKiBldmlsIGJ1dCBpbmNsdWRpbmcgYXRvbWJpb3MuaCBpcyBtdWNoIHdvcnNlICovCitib29sIHJhZGVvbl9hdG9tX2dldF90dl90aW1pbmdzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaW5kZXgsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworCisKK3N0YXRpYyBpbmxpbmUgYm9vbCByYWRlb25fZW5jb2Rlcl9pc19kaWdpdGFsKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yICoKK3JhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgcmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcykKKwkJCXJldHVybiBjb25uZWN0b3I7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbCByYWRlb25fYXRvbV9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwkvKiBzZXQgdGhlIGFjdGl2ZSBlbmNvZGVyIHRvIGNvbm5lY3RvciByb3V0aW5nICovCisJcmFkZW9uX2VuY29kZXJfc2V0X2FjdGl2ZV9kZXZpY2UoZW5jb2Rlcik7CisJZHJtX21vZGVfc2V0X2NydGNpbmZvKGFkanVzdGVkX21vZGUsIDApOworCisJLyogaHcgYnVnICovCisJaWYgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCSAgICAmJiAobW9kZS0+Y3J0Y192c3luY19zdGFydCA8IChtb2RlLT5jcnRjX3ZkaXNwbGF5ICsgMikpKQorCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX3N0YXJ0ID0gYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxheSArIDI7CisKKwkvKiBnZXQgdGhlIG5hdGl2ZSBtb2RlIGZvciBMVkRTICovCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJcmFkZW9uX3BhbmVsX21vZGVfZml4dXAoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CisKKwkvKiBnZXQgdGhlIG5hdGl2ZSBtb2RlIGZvciBUViAqLworCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkgeworCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKnR2X2RhYyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKKwkJaWYgKHR2X2RhYykgeworCQkJaWYgKHR2X2RhYy0+dHZfc3RkID09IFRWX1NURF9OVFNDIHx8CisJCQkgICAgdHZfZGFjLT50dl9zdGQgPT0gVFZfU1REX05UU0NfSiB8fAorCQkJICAgIHR2X2RhYy0+dHZfc3RkID09IFRWX1NURF9QQUxfTSkKKwkJCQlyYWRlb25fYXRvbV9nZXRfdHZfdGltaW5ncyhyZGV2LCAwLCBhZGp1c3RlZF9tb2RlKTsKKwkJCWVsc2UKKwkJCQlyYWRlb25fYXRvbV9nZXRfdHZfdGltaW5ncyhyZGV2LCAxLCBhZGp1c3RlZF9tb2RlKTsKKwkJfQorCX0KKworCWlmIChBU0lDX0lTX0RDRTMocmRldikgJiYKKwkgICAgKChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKKwkgICAgIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0gRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkpKSB7CisJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKKwkJcmFkZW9uX2RwX3NldF9saW5rX2NvbmZpZyhjb25uZWN0b3IsIG1vZGUpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorYXRvbWJpb3NfZGFjX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJREFDX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIGFyZ3M7CisJaW50IGluZGV4ID0gMDsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhY19pbmZvID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzFFbmNvZGVyQ29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzJFbmNvZGVyQ29udHJvbCk7CisJCWJyZWFrOworCX0KKworCWFyZ3MudWNBY3Rpb24gPSBhY3Rpb247CisKKwlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKQorCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfUFMyOworCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfQ1Y7CisJZWxzZSB7CisJCXN3aXRjaCAoZGFjX2luZm8tPnR2X3N0ZCkgeworCQljYXNlIFRWX1NURF9QQUw6CisJCWNhc2UgVFZfU1REX1BBTF9NOgorCQljYXNlIFRWX1NURF9TQ0FSVF9QQUw6CisJCWNhc2UgVFZfU1REX1NFQ0FNOgorCQljYXNlIFRWX1NURF9QQUxfQ046CisJCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfUEFMOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX05UU0M6CisJCWNhc2UgVFZfU1REX05UU0NfSjoKKwkJY2FzZSBUVl9TVERfUEFMXzYwOgorCQlkZWZhdWx0OgorCQkJYXJncy51Y0RhY1N0YW5kYXJkID0gQVRPTV9EQUMxX05UU0M7CisJCQlicmVhazsKKwkJfQorCX0KKwlhcmdzLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCit9CisKK3N0YXRpYyB2b2lkCithdG9tYmlvc190dl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCVRWX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIGFyZ3M7CisJaW50IGluZGV4ID0gMDsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhY19pbmZvID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVkVuY29kZXJDb250cm9sKTsKKworCWFyZ3Muc1RWRW5jb2Rlci51Y0FjdGlvbiA9IGFjdGlvbjsKKworCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfQ1Y7CisJZWxzZSB7CisJCXN3aXRjaCAoZGFjX2luZm8tPnR2X3N0ZCkgeworCQljYXNlIFRWX1NURF9OVFNDOgorCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQzsKKwkJCWJyZWFrOworCQljYXNlIFRWX1NURF9QQUw6CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUw7CisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfUEFMX006CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUxNOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX1BBTF82MDoKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDYwOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX05UU0NfSjoKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX05UU0NKOworCQkJYnJlYWs7CisJCWNhc2UgVFZfU1REX1NDQVJUX1BBTDoKKwkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDsgLyogPz8/ICovCisJCQlicmVhazsKKwkJY2FzZSBUVl9TVERfU0VDQU06CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9TRUNBTTsKKwkJCWJyZWFrOworCQljYXNlIFRWX1NURF9QQUxfQ046CisJCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUxDTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYXJncy5zVFZFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCit9CisKK3VuaW9uIGR2b19lbmNvZGVyX2NvbnRyb2wgeworCUVOQUJMRV9FWFRFUk5BTF9UTURTX0VOQ09ERVJfUFNfQUxMT0NBVElPTiBleHRfdG1kczsKKwlEVk9fRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gZHZvOworCURWT19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMyBkdm9fdjM7Cit9OworCit2b2lkCithdG9tYmlvc19kdm9fc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwl1bmlvbiBkdm9fZW5jb2Rlcl9jb250cm9sIGFyZ3M7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPRW5jb2RlckNvbnRyb2wpOworCXVpbnQ4X3QgZnJldiwgY3JldjsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGZyZXYpIHsKKwljYXNlIDE6CisJCXN3aXRjaCAoY3JldikgeworCQljYXNlIDE6CisJCQkvKiBSNHh4LCBSNXh4ICovCisJCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNFbmFibGUgPSBhY3Rpb247CisKKwkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy5leHRfdG1kcy5zWFRtZHNFbmNvZGVyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfRFVBTDsKKworCQkJYXJncy5leHRfdG1kcy5zWFRtZHNFbmNvZGVyLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qIFJTNjAwLzY5MC83NDAgKi8KKwkJCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOworCQkJYXJncy5kdm8uc0RWT0VuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJLyogREZQMSwgQ1JUMSwgVFYxIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBwb3J0ICovCisJCQlhcmdzLmR2by5zRFZPRW5jb2Rlci51Y0RldmljZVR5cGUgPSBBVE9NX0RFVklDRV9ERlAxX0lOREVYOworCisJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVzRGV2QXR0ci5zRGlnQXR0cmliLnVjQXR0cmlidXRlIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCS8qIFI2eHggKi8KKwkJCWFyZ3MuZHZvX3YzLnVjQWN0aW9uID0gYWN0aW9uOworCQkJYXJncy5kdm9fdjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJYXJncy5kdm9fdjMudWNEVk9Db25maWcgPSAwOyAvKiBYWFggKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCWJyZWFrOworCX0KKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworfQorCit1bmlvbiBsdmRzX2VuY29kZXJfY29udHJvbCB7CisJTFZEU19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiAgICB2MTsKKwlMVkRTX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OX1YyIHYyOworfTsKKwordm9pZAorYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCXVuaW9uIGx2ZHNfZW5jb2Rlcl9jb250cm9sIGFyZ3M7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgaGRtaV9kZXRlY3RlZCA9IDA7CisJdWludDhfdCBmcmV2LCBjcmV2OworCisJaWYgKCFkaWcpCisJCXJldHVybjsKKworCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0hETUkpCisJCWhkbWlfZGV0ZWN0ZWQgPSAxOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKKwkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVkRTRW5jb2RlckNvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFMxRW5jb2RlckNvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgorCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVkRTRW5jb2RlckNvbnRyb2wpOworCQllbHNlCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFMyRW5jb2RlckNvbnRyb2wpOworCQlicmVhazsKKwl9CisKKwlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmcmV2KSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJc3dpdGNoIChjcmV2KSB7CisJCWNhc2UgMToKKwkJCWFyZ3MudjEudWNNaXNjID0gMDsKKwkJCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247CisJCQlpZiAoaGRtaV9kZXRlY3RlZCkKKwkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfSERNSV9UWVBFOworCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7CisJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfRFVBTCkKKwkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7CisJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfODg4UkdCKQorCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX1RNRFNfTElOS0I7CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7CisJCQkJLyppZiAocFNjcm4tPnJnYkJpdHMgPT0gOCkgKi8KKwkJCQlhcmdzLnYxLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJYXJncy52Mi51Y01pc2MgPSAwOworCQkJYXJncy52Mi51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWlmIChjcmV2ID09IDMpIHsKKwkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQorCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfQ09IRVJFTlQ7CisJCQl9CisJCQlpZiAoaGRtaV9kZXRlY3RlZCkKKwkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfSERNSV9UWVBFOworCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQlhcmdzLnYyLnVjVHJ1bmNhdGUgPSAwOworCQkJYXJncy52Mi51Y1NwYXRpYWwgPSAwOworCQkJYXJncy52Mi51Y1RlbXBvcmFsID0gMDsKKwkJCWFyZ3MudjIudWNGUkMgPSAwOworCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX0RVQUwpCisJCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOworCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX1NQQVRJQUwpIHsKKwkJCQkJYXJncy52Mi51Y1NwYXRpYWwgPSBQQU5FTF9FTkNPREVSX1NQQVRJQUxfRElUSEVSX0VOOworCQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCisJCQkJCQlhcmdzLnYyLnVjU3BhdGlhbCB8PSBQQU5FTF9FTkNPREVSX1NQQVRJQUxfRElUSEVSX0RFUFRIOworCQkJCX0KKwkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ19URU1QT1JBTCkgeworCQkJCQlhcmdzLnYyLnVjVGVtcG9yYWwgPSBQQU5FTF9FTkNPREVSX1RFTVBPUkFMX0RJVEhFUl9FTjsKKwkJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfODg4UkdCKQorCQkJCQkJYXJncy52Mi51Y1RlbXBvcmFsIHw9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfRElUSEVSX0RFUFRIOworCQkJCQlpZiAoKChkaWctPmxjZF9taXNjID4+IEFUT01fUEFORUxfTUlTQ19HUkVZX0xFVkVMX1NISUZUKSAmIDB4MykgPT0gMikKKwkJCQkJCWFyZ3MudjIudWNUZW1wb3JhbCB8PSBQQU5FTF9FTkNPREVSX1RFTVBPUkFMX0xFVkVMXzQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX1RNRFNfTElOS0I7CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQlicmVhazsKKwl9CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKK30KKworaW50CithdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcjsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvcjsKKworCS8qIGRwIGJyaWRnZXMgYXJlIGFsd2F5cyBEUCAqLworCWlmIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0gRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkKKwkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOworCisJLyogRFZPIGlzIGFsd2F5cyBEVk8gKi8KKwlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gQVRPTV9FTkNPREVSX01PREVfRFZPKQorCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZPOworCisJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlIHlldCwganVzdCB1c2Ugb25lIG9mCisJICogdGhlIGNvbm5lY3RvcnMgdGllZCB0byB0aGUgZW5jb2Rlci4KKwkgKi8KKwlpZiAoIWNvbm5lY3RvcikKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKKwlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCisJc3dpdGNoIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlKSB7CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSToKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQjogLyogSERNSS1CIGlzIGJhc2ljYWxseSBETC1EVkk7IGFuYWxvZyB3b3JrcyBmaW5lICovCisJCWlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgJiYgcmFkZW9uX2F1ZGlvKSB7CisJCQkvKiBmaXggbWUgKi8KKwkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfSERNSTsKKwkJfSBlbHNlIGlmIChyYWRlb25fY29ubmVjdG9yLT51c2VfZGlnaXRhbCkKKwkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CisJCWVsc2UKKwkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9DUlQ7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ6CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE6CisJZGVmYXVsdDoKKwkJaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSAmJiByYWRlb25fYXVkaW8pIHsKKwkJCS8qIGZpeCBtZSAqLworCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOworCQkJZWxzZQorCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JOworCQl9IGVsc2UKKwkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0xWRFM6CisJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9MVkRTOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydDoKKwkJZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCQlpZiAoKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUKSB8fAorCQkgICAgKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX2VEUCkpCisJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7CisJCWVsc2UgaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSAmJiByYWRlb25fYXVkaW8pIHsKKwkJCS8qIGZpeCBtZSAqLworCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOworCQkJZWxzZQorCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JOworCQl9IGVsc2UKKwkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX2VEUDoKKwkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOworCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUE6CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBOgorCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfQ1JUOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9Db21wb3NpdGU6CisJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfU1ZJREVPOgorCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU46CisJCS8qIGZpeCBtZSAqLworCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfVFY7CisJCS8qcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0NWOyovCisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIERJRyBFbmNvZGVyL1RyYW5zbWl0dGVyIFNldHVwCisgKgorICogRENFIDMuMC8zLjEKKyAqIC0gMiBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzLiBVTklQSFkgKGxpbmtzIEEgYW5kIEIpIGFuZCBMVlRNQS4KKyAqIFN1cHBvcnRzIHVwIHRvIDMgZGlnaXRhbCBvdXRwdXRzCisgKiAtIDIgRElHIGVuY29kZXIgYmxvY2tzLgorICogRElHMSBjYW4gZHJpdmUgVU5JUEhZIGxpbmsgQSBvciBsaW5rIEIKKyAqIERJRzIgY2FuIGRyaXZlIFVOSVBIWSBsaW5rIEIgb3IgTFZUTUEKKyAqCisgKiBEQ0UgMy4yCisgKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2Nrcy4gVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgorICogU3VwcG9ydHMgdXAgdG8gNSBkaWdpdGFsIG91dHB1dHMKKyAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCisgKiBESUcxLzIgY2FuIGRyaXZlIFVOSVBIWTAvMS8yIGxpbmsgQSBvciBsaW5rIEIKKyAqCisgKiBEQ0UgNC4wLzUuMAorICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgorICogU3VwcG9ydHMgdXAgdG8gNiBkaWdpdGFsIG91dHB1dHMKKyAqIC0gNiBESUcgZW5jb2RlciBibG9ja3MuCisgKiAtIERJRyB0byBQSFkgbWFwcGluZyBpcyBoYXJkY29kZWQKKyAqIERJRzEgZHJpdmVzIFVOSVBIWTAgbGluayBBLCBBK0IKKyAqIERJRzIgZHJpdmVzIFVOSVBIWTAgbGluayBCCisgKiBESUczIGRyaXZlcyBVTklQSFkxIGxpbmsgQSwgQStCCisgKiBESUc0IGRyaXZlcyBVTklQSFkxIGxpbmsgQgorICogRElHNSBkcml2ZXMgVU5JUEhZMiBsaW5rIEEsIEErQgorICogRElHNiBkcml2ZXMgVU5JUEhZMiBsaW5rIEIKKyAqCisgKiBEQ0UgNC4xCisgKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBTdXBwb3J0cyB1cCB0byA2IGRpZ2l0YWwgb3V0cHV0cworICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KKyAqIERJRzEvMiBjYW4gZHJpdmUgVU5JUEhZMC8xLzIgbGluayBBIG9yIGxpbmsgQgorICoKKyAqIFJvdXRpbmcKKyAqIGNydGMgLT4gZGlnIGVuY29kZXIgLT4gVU5JUEhZL0xWVE1BICgxIG9yIDIgbGlua3MpCisgKiBFeGFtcGxlczoKKyAqIGNydGMwIC0+IGRpZzIgLT4gTFZUTUEgICBsaW5rcyBBK0IgLT4gVE1EUy9IRE1JCisgKiBjcnRjMSAtPiBkaWcxIC0+IFVOSVBIWTAgbGluayAgQiAgIC0+IERQCisgKiBjcnRjMCAtPiBkaWcxIC0+IFVOSVBIWTIgbGluayAgQSAgIC0+IExWRFMKKyAqIGNydGMxIC0+IGRpZzIgLT4gVU5JUEhZMSBsaW5rICBCK0EgLT4gVE1EUy9IRE1JCisgKi8KKwordW5pb24gZGlnX2VuY29kZXJfY29udHJvbCB7CisJRElHX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIHYxOworCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKKwlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjMgdjM7CisJRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1Y0IHY0OworfTsKKwordm9pZAorYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uLCBpbnQgcGFuZWxfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCXVuaW9uIGRpZ19lbmNvZGVyX2NvbnRyb2wgYXJnczsKKwlpbnQgaW5kZXggPSAwOworCXVpbnQ4X3QgZnJldiwgY3JldjsKKwlpbnQgZHBfY2xvY2sgPSAwOworCWludCBkcF9sYW5lX2NvdW50ID0gMDsKKwlpbnQgaHBkX2lkID0gUkFERU9OX0hQRF9OT05FOworCWludCBicGMgPSA4OworCisJaWYgKGNvbm5lY3RvcikgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3IgPQorCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisKKwkJZHBfY2xvY2sgPSBkaWdfY29ubmVjdG9yLT5kcF9jbG9jazsKKwkJZHBfbGFuZV9jb3VudCA9IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7CisJCWhwZF9pZCA9IHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQ7CisJCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKKwl9CisKKwkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLworCWlmIChkaWctPmRpZ19lbmNvZGVyID09IC0xKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisKKwlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJR3hFbmNvZGVyQ29udHJvbCk7CisJZWxzZSB7CisJCWlmIChkaWctPmRpZ19lbmNvZGVyKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBESUcyRW5jb2RlckNvbnRyb2wpOworCQllbHNlCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERJRzFFbmNvZGVyQ29udHJvbCk7CisJfQorCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCisJCXJldHVybjsKKworCXN3aXRjaCAoZnJldikgeworCWNhc2UgMToKKwkJc3dpdGNoIChjcmV2KSB7CisJCWNhc2UgMToKKwkJCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9FTkNPREVSX0NNRF9TRVRVUF9QQU5FTF9NT0RFKQorCQkJCWFyZ3MudjMudWNQYW5lbE1vZGUgPSBwYW5lbF9tb2RlOworCQkJZWxzZQorCQkJCWFyZ3MudjEudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52MS51Y0VuY29kZXJNb2RlKSkKKwkJCQlhcmdzLnYxLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52MS51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjEudWNMYW5lTnVtID0gNDsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnVjRW5jb2Rlck1vZGUpICYmIChkcF9jbG9jayA9PSAyNzAwMDApKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzJfNzBHSFo7CisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9FTkNPREVSX0NPTkZJR19WMl9UUkFOU01JVFRFUjE7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9FTkNPREVSX0NPTkZJR19WMl9UUkFOU01JVFRFUjI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCQkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fRU5DT0RFUl9DT05GSUdfVjJfVFJBTlNNSVRURVIzOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0xJTktCOworCQkJZWxzZQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LQTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCWFyZ3MudjMudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLnYzLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9FTkNPREVSX0NNRF9TRVRVUF9QQU5FTF9NT0RFKQorCQkJCWFyZ3MudjMudWNQYW5lbE1vZGUgPSBwYW5lbF9tb2RlOworCQkJZWxzZQorCQkJCWFyZ3MudjMudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52MS51Y0VuY29kZXJNb2RlKSkKKwkJCQlhcmdzLnYzLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52My51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjMudWNMYW5lTnVtID0gNDsKKworCQkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhcmdzLnYxLnVjRW5jb2Rlck1vZGUpICYmIChkcF9jbG9jayA9PSAyNzAwMDApKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzJfNzBHSFo7CisJCQlhcmdzLnYzLmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKKwkJCXN3aXRjaCAoYnBjKSB7CisJCQljYXNlIDA6CisJCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfQlBDX1VOREVGSU5FOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzZCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJZGVmYXVsdDoKKwkJCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfMTBCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzE2QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlhcmdzLnY0LnVjQWN0aW9uID0gYWN0aW9uOworCQkJYXJncy52NC51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQlpZiAoYWN0aW9uID09IEFUT01fRU5DT0RFUl9DTURfU0VUVVBfUEFORUxfTU9ERSkKKwkJCQlhcmdzLnY0LnVjUGFuZWxNb2RlID0gcGFuZWxfbW9kZTsKKwkJCWVsc2UKKwkJCQlhcmdzLnY0LnVjRW5jb2Rlck1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOworCisJCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGFyZ3MudjEudWNFbmNvZGVyTW9kZSkpCisJCQkJYXJncy52NC51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MudjQudWNMYW5lTnVtID0gODsKKwkJCWVsc2UKKwkJCQlhcmdzLnY0LnVjTGFuZU51bSA9IDQ7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52MS51Y0VuY29kZXJNb2RlKSkgeworCQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCisJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzJfNzBHSFo7CisJCQkJZWxzZSBpZiAoZHBfY2xvY2sgPT0gNTQwMDAwKQorCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV81XzQwR0haOworCQkJfQorCQkJYXJncy52NC5hY0NvbmZpZy51Y0RpZ1NlbCA9IGRpZy0+ZGlnX2VuY29kZXI7CisJCQlzd2l0Y2ggKGJwYykgeworCQkJY2FzZSAwOgorCQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMX0JQQ19VTkRFRklORTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF82QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCWRlZmF1bHQ6CisJCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgorCQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEwQklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfMTJCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxNjoKKwkJCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xNkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaHBkX2lkID09IFJBREVPTl9IUERfTk9ORSkKKwkJCQlhcmdzLnY0LnVjSFBEX0lEID0gMDsKKwkJCWVsc2UKKwkJCQlhcmdzLnY0LnVjSFBEX0lEID0gaHBkX2lkICsgMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCWJyZWFrOworCX0KKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCit9CisKK3VuaW9uIGRpZ190cmFuc21pdHRlcl9jb250cm9sIHsKKwlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIHYxOworCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjIgdjI7CisJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMyB2MzsKKwlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1Y0IHY0OworfTsKKwordm9pZAorYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbiwgdWludDhfdCBsYW5lX251bSwgdWludDhfdCBsYW5lX3NldCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwl1bmlvbiBkaWdfdHJhbnNtaXR0ZXJfY29udHJvbCBhcmdzOworCWludCBpbmRleCA9IDA7CisJdWludDhfdCBmcmV2LCBjcmV2OworCWJvb2wgaXNfZHAgPSBmYWxzZTsKKwlpbnQgcGxsX2lkID0gMDsKKwlpbnQgZHBfY2xvY2sgPSAwOworCWludCBkcF9sYW5lX2NvdW50ID0gMDsKKwlpbnQgY29ubmVjdG9yX29iamVjdF9pZCA9IDA7CisJaW50IGlncF9sYW5lX2luZm8gPSAwOworCWludCBkaWdfZW5jb2RlciA9IGRpZy0+ZGlnX2VuY29kZXI7CisKKwlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQpIHsKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKKwkJLyoganVzdCBuZWVkZWQgdG8gYXZvaWQgYmFpbGluZyBpbiB0aGUgZW5jb2RlciBjaGVjay4gIHRoZSBlbmNvZGVyCisJCSAqIGlzbid0IHVzZWQgZm9yIGluaXQKKwkJICovCisJCWRpZ19lbmNvZGVyID0gMDsKKwl9IGVsc2UKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CisKKwlpZiAoY29ubmVjdG9yKSB7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9CisJCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKKworCQlkcF9jbG9jayA9IGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrOworCQlkcF9sYW5lX2NvdW50ID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKKwkJY29ubmVjdG9yX29iamVjdF9pZCA9CisJCQkocmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZCAmIE9CSkVDVF9JRF9NQVNLKSA+PiBPQkpFQ1RfSURfU0hJRlQ7CisJCWlncF9sYW5lX2luZm8gPSBkaWdfY29ubmVjdG9yLT5pZ3BfbGFuZV9pbmZvOworCX0KKworCWlmIChlbmNvZGVyLT5jcnRjKSB7CisJCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwkJcGxsX2lkID0gcmFkZW9uX2NydGMtPnBsbF9pZDsKKwl9CisKKwkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLworCWlmIChkaWdfZW5jb2RlciA9PSAtMSkKKwkJcmV0dXJuOworCisJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpKSkKKwkJaXNfZHAgPSB0cnVlOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVU5JUEhZVHJhbnNtaXR0ZXJDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgTFZUTUFUcmFuc21pdHRlckNvbnRyb2wpOworCQlicmVhazsKKwl9CisKKwlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChmcmV2KSB7CisJY2FzZSAxOgorCQlzd2l0Y2ggKGNyZXYpIHsKKwkJY2FzZSAxOgorCQkJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgeworCQkJCWFyZ3MudjEudXNJbml0SW5mbyA9IGNwdV90b19sZTE2KGNvbm5lY3Rvcl9vYmplY3RfaWQpOworCQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVBfVlNFTVBIKSB7CisJCQkJYXJncy52MS5hc01vZGUudWNMYW5lU2VsID0gbGFuZV9udW07CisJCQkJYXJncy52MS5hc01vZGUudWNMYW5lU2V0ID0gbGFuZV9zZXQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc19kcCkKKwkJCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPQorCQkJCQkJY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7CisJCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAyKSAvIDEwKTsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJfQorCisJCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ0xLU1JDX1BQTEw7CisKKwkJCWlmIChkaWdfZW5jb2RlcikKKwkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0RJRzJfRU5DT0RFUjsKKwkJCWVsc2UKKwkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0RJRzFfRU5DT0RFUjsKKworCQkJaWYgKChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApICYmCisJCQkgICAgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWSkpIHsKKwkJCQlpZiAoaXNfZHAgfHwgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA8PSAxNjUwMDApKSB7CisJCQkJCWlmIChpZ3BfbGFuZV9pbmZvICYgMHgxKQorCQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfMzsKKwkJCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4MikKKwkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV80Xzc7CisJCQkJCWVsc2UgaWYgKGlncF9sYW5lX2luZm8gJiAweDQpCisJCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfOF8xMTsKKwkJCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4OCkKKwkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8xMl8xNTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoaWdwX2xhbmVfaW5mbyAmIDB4MykKKwkJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8wXzc7CisJCQkJCWVsc2UgaWYgKGlncF9sYW5lX2luZm8gJiAweGMpCisJCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfOF8xNTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChkaWctPmxpbmtiKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTElOS0I7CisJCQllbHNlCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MSU5LQTsKKworCQkJaWYgKGlzX2RwKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ09IRVJFTlQ7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKKwkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQorCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0NPSEVSRU5UOworCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfOExBTkVfTElOSzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlhcmdzLnYyLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklUKSB7CisJCQkJYXJncy52Mi51c0luaXRJbmZvID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKKwkJCQlhcmdzLnYyLmFzTW9kZS51Y0xhbmVTZWwgPSBsYW5lX251bTsKKwkJCQlhcmdzLnYyLmFzTW9kZS51Y0xhbmVTZXQgPSBsYW5lX3NldDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2RwKQorCQkJCQlhcmdzLnYyLnVzUGl4ZWxDbG9jayA9CisJCQkJCQljcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJCWFyZ3MudjIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYoKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDIpIC8gMTApOworCQkJCWVsc2UKKwkJCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQl9CisKKwkJCWFyZ3MudjIuYWNDb25maWcudWNFbmNvZGVyU2VsID0gZGlnX2VuY29kZXI7CisJCQlpZiAoZGlnLT5saW5rYikKKwkJCQlhcmdzLnYyLmFjQ29uZmlnLnVjTGlua1NlbCA9IDE7CisKKwkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCQkJCWFyZ3MudjIuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJCQkJYXJncy52Mi5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJCQlhcmdzLnYyLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAyOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaXNfZHApIHsKKwkJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOworCQkJCWFyZ3MudjIuYWNDb25maWcuZkRQQ29ubmVjdG9yID0gMTsKKwkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CisJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKKwkJCQkJYXJncy52Mi5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYyLmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJYXJncy52My51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgeworCQkJCWFyZ3MudjMudXNJbml0SW5mbyA9IGNwdV90b19sZTE2KGNvbm5lY3Rvcl9vYmplY3RfaWQpOworCQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVBfVlNFTVBIKSB7CisJCQkJYXJncy52My5hc01vZGUudWNMYW5lU2VsID0gbGFuZV9udW07CisJCQkJYXJncy52My5hc01vZGUudWNMYW5lU2V0ID0gbGFuZV9zZXQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc19kcCkKKwkJCQkJYXJncy52My51c1BpeGVsQ2xvY2sgPQorCQkJCQkJY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7CisJCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYzLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAyKSAvIDEwKTsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJfQorCisJCQlpZiAoaXNfZHApCisJCQkJYXJncy52My51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MudjMudWNMYW5lTnVtID0gODsKKwkJCWVsc2UKKwkJCQlhcmdzLnYzLnVjTGFuZU51bSA9IDQ7CisKKwkJCWlmIChkaWctPmxpbmtiKQorCQkJCWFyZ3MudjMuYWNDb25maWcudWNMaW5rU2VsID0gMTsKKwkJCWlmIChkaWdfZW5jb2RlciAmIDEpCisJCQkJYXJncy52My5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSAxOworCisJCQkvKiBTZWxlY3QgdGhlIFBMTCBmb3IgdGhlIFBIWQorCQkJICogRFAgUEhZIHNob3VsZCBiZSBjbG9ja2VkIGZyb20gZXh0ZXJuYWwgc3JjIGlmIHRoZXJlIGlzCisJCQkgKiBvbmUuCisJCQkgKi8KKwkJCS8qIE9uIERDRTQsIGlmIHRoZXJlIGlzIGFuIGV4dGVybmFsIGNsb2NrLCBpdCBnZW5lcmF0ZXMgdGhlIERQIHJlZiBjbG9jayAqLworCQkJaWYgKGlzX2RwICYmIHJkZXYtPmNsb2NrLmRwX2V4dGNsaykKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gMjsgLyogZXh0ZXJuYWwgc3JjICovCisJCQllbHNlCisJCQkJYXJncy52My5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IHBsbF9pZDsKKworCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCQkJYXJncy52My5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQkJCWFyZ3MudjMuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpc19kcCkKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOyAvKiBEUCByZXF1aXJlcyBjb2hlcmVudCAqLworCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CisJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKKwkJCQkJYXJncy52My5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnYzLmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJYXJncy52NC51Y0FjdGlvbiA9IGFjdGlvbjsKKwkJCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgeworCQkJCWFyZ3MudjQudXNJbml0SW5mbyA9IGNwdV90b19sZTE2KGNvbm5lY3Rvcl9vYmplY3RfaWQpOworCQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fU0VUVVBfVlNFTVBIKSB7CisJCQkJYXJncy52NC5hc01vZGUudWNMYW5lU2VsID0gbGFuZV9udW07CisJCQkJYXJncy52NC5hc01vZGUudWNMYW5lU2V0ID0gbGFuZV9zZXQ7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc19kcCkKKwkJCQkJYXJncy52NC51c1BpeGVsQ2xvY2sgPQorCQkJCQkJY3B1X3RvX2xlMTYoZHBfY2xvY2sgLyAxMCk7CisJCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnY0LnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAyKSAvIDEwKTsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjQudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJfQorCisJCQlpZiAoaXNfZHApCisJCQkJYXJncy52NC51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MudjQudWNMYW5lTnVtID0gODsKKwkJCWVsc2UKKwkJCQlhcmdzLnY0LnVjTGFuZU51bSA9IDQ7CisKKwkJCWlmIChkaWctPmxpbmtiKQorCQkJCWFyZ3MudjQuYWNDb25maWcudWNMaW5rU2VsID0gMTsKKwkJCWlmIChkaWdfZW5jb2RlciAmIDEpCisJCQkJYXJncy52NC5hY0NvbmZpZy51Y0VuY29kZXJTZWwgPSAxOworCisJCQkvKiBTZWxlY3QgdGhlIFBMTCBmb3IgdGhlIFBIWQorCQkJICogRFAgUEhZIHNob3VsZCBiZSBjbG9ja2VkIGZyb20gZXh0ZXJuYWwgc3JjIGlmIHRoZXJlIGlzCisJCQkgKiBvbmUuCisJCQkgKi8KKwkJCS8qIE9uIERDRTUgRENQTEwgdXN1YWxseSBnZW5lcmF0ZXMgdGhlIERQIHJlZiBjbG9jayAqLworCQkJaWYgKGlzX2RwKSB7CisJCQkJaWYgKHJkZXYtPmNsb2NrLmRwX2V4dGNsaykKKwkJCQkJYXJncy52NC5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IEVOQ09ERVJfUkVGQ0xLX1NSQ19FWFRDTEs7CisJCQkJZWxzZQorCQkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gRU5DT0RFUl9SRUZDTEtfU1JDX0RDUExMOworCQkJfSBlbHNlCisJCQkJYXJncy52NC5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IHBsbF9pZDsKKworCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCQkJYXJncy52NC5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQkJCWFyZ3MudjQuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpc19kcCkKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOyAvKiBEUCByZXF1aXJlcyBjb2hlcmVudCAqLworCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7CisJCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKKwkJCQkJYXJncy52NC5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCQlhcmdzLnY0LmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQlicmVhazsKKwl9CisKKwlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKK30KKworYm9vbAorYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByYWRlb25fY29ubmVjdG9yLT5iYXNlLmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5pb24gZGlnX3RyYW5zbWl0dGVyX2NvbnRyb2wgYXJnczsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBVTklQSFlUcmFuc21pdHRlckNvbnRyb2wpOworCXVpbnQ4X3QgZnJldiwgY3JldjsKKworCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlICE9IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApCisJCWdvdG8gZG9uZTsKKworCWlmICghQVNJQ19JU19EQ0U0KHJkZXYpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoKGFjdGlvbiAhPSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PTikgJiYKKwkgICAgKGFjdGlvbiAhPSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PRkYpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJZ290byBkb25lOworCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJYXJncy52MS51Y0FjdGlvbiA9IGFjdGlvbjsKKworCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCisJLyogd2FpdCBmb3IgdGhlIHBhbmVsIHRvIHBvd2VyIHVwICovCisJaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PTikgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzAwOyBpKyspIHsKKwkJCWlmIChyYWRlb25faHBkX3NlbnNlKHJkZXYsIHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpKQorCQkJCXJldHVybiB0cnVlOworCQkJbWRlbGF5KDEpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Citkb25lOgorCXJldHVybiB0cnVlOworfQorCit1bmlvbiBleHRlcm5hbF9lbmNvZGVyX2NvbnRyb2wgeworCUVYVEVSTkFMX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIHYxOworCUVYVEVSTkFMX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OX1YzIHYzOworfTsKKworc3RhdGljIHZvaWQKK2F0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIsCisJCQkJaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpleHRfcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihleHRfZW5jb2Rlcik7CisJdW5pb24gZXh0ZXJuYWxfZW5jb2Rlcl9jb250cm9sIGFyZ3M7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBFeHRlcm5hbEVuY29kZXJDb250cm9sKTsKKwl1OCBmcmV2LCBjcmV2OworCWludCBkcF9jbG9jayA9IDA7CisJaW50IGRwX2xhbmVfY291bnQgPSAwOworCWludCBjb25uZWN0b3Jfb2JqZWN0X2lkID0gMDsKKwl1MzIgZXh0X2VudW0gPSAoZXh0X3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gJiBFTlVNX0lEX01BU0spID4+IEVOVU1fSURfU0hJRlQ7CisJaW50IGJwYyA9IDg7CisKKwlpZiAoYWN0aW9uID09IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfSU5JVCkKKwkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXJfaW5pdChlbmNvZGVyKTsKKwllbHNlCisJCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKGNvbm5lY3RvcikgeworCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3JfYXRvbV9kaWcgKmRpZ19jb25uZWN0b3IgPQorCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CisKKwkJZHBfY2xvY2sgPSBkaWdfY29ubmVjdG9yLT5kcF9jbG9jazsKKwkJZHBfbGFuZV9jb3VudCA9IGRpZ19jb25uZWN0b3ItPmRwX2xhbmVfY291bnQ7CisJCWNvbm5lY3Rvcl9vYmplY3RfaWQgPQorCQkJKHJhZGVvbl9jb25uZWN0b3ItPmNvbm5lY3Rvcl9vYmplY3RfaWQgJiBPQkpFQ1RfSURfTUFTSykgPj4gT0JKRUNUX0lEX1NISUZUOworCQlicGMgPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGM7CisJfQorCisJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCisJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCisJCXJldHVybjsKKworCXN3aXRjaCAoZnJldikgeworCWNhc2UgMToKKwkJLyogbm8gcGFyYW1zIG9uIGZyZXYgMSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCXN3aXRjaCAoY3JldikgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247CisJCQlhcmdzLnYxLnNEaWdFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXJncy52MS5zRGlnRW5jb2Rlci51Y0VuY29kZXJNb2RlKSkgeworCQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCisJCQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzJfNzBHSFo7CisJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNMYW5lTnVtID0gNDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpCisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51c0Nvbm5lY3RvcklkID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7CisJCQllbHNlCisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7CisJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjRW5jb2Rlck1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOworCisJCQlpZiAoRU5DT0RFUl9NT0RFX0lTX0RQKGFyZ3MudjMuc0V4dEVuY29kZXIudWNFbmNvZGVyTW9kZSkpIHsKKwkJCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQorCQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCisJCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV81XzQwR0haOworCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKKwkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gODsKKwkJCWVsc2UKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjTGFuZU51bSA9IDQ7CisJCQlzd2l0Y2ggKGV4dF9lbnVtKSB7CisJCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMToKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIxOworCQkJCWJyZWFrOworCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDI6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQzOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKGJwYykgeworCQkJY2FzZSAwOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMX0JQQ19VTkRFRklORTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF82QklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCWRlZmF1bHQ6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQljYXNlIDEwOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEwQklUX1BFUl9DT0xPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfMTJCSVRfUEVSX0NPTE9SOworCQkJCWJyZWFrOworCQkJY2FzZSAxNjoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xNkJJVF9QRVJfQ09MT1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQlyZXR1cm47CisJfQorCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworfQorCitzdGF0aWMgdm9pZAorYXRvbWJpb3NfeXV2X3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlFTkFCTEVfWVVWX1BTX0FMTE9DQVRJT04gYXJnczsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBFbmFibGVZVVYpOworCXVpbnQzMl90IHRlbXAsIHJlZzsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKQorCQlyZWcgPSBSNjAwX0JJT1NfM19TQ1JBVENIOworCWVsc2UKKwkJcmVnID0gUkFERU9OX0JJT1NfM19TQ1JBVENIOworCisJLyogWFhYOiBmaXggdXAgc2NyYXRjaCByZWcgaGFuZGxpbmcgKi8KKwl0ZW1wID0gUlJFRzMyKHJlZyk7CisJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQlXUkVHMzIocmVnLCAoQVRPTV9TM19UVjFfQUNUSVZFIHwKKwkJCSAgICAgKHJhZGVvbl9jcnRjLT5jcnRjX2lkIDw8IDE4KSkpOworCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQlXUkVHMzIocmVnLCAoQVRPTV9TM19DVl9BQ1RJVkUgfCAocmFkZW9uX2NydGMtPmNydGNfaWQgPDwgMjQpKSk7CisJZWxzZQorCQlXUkVHMzIocmVnLCAwKTsKKworCWlmIChlbmFibGUpCisJCWFyZ3MudWNFbmFibGUgPSBBVE9NX0VOQUJMRTsKKwlhcmdzLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKKwlXUkVHMzIocmVnLCB0ZW1wKTsKK30KKworc3RhdGljIHZvaWQKK3JhZGVvbl9hdG9tX2VuY29kZXJfZHBtc19hdml2byhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlESVNQTEFZX0RFVklDRV9PVVRQVVRfQ09OVFJPTF9QU19BTExPQ0FUSU9OIGFyZ3M7CisJaW50IGluZGV4ID0gMDsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFNBT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgorCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERWT091dHB1dENvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CisJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgTENEMU91dHB1dENvbnRyb2wpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgorCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMQ0QxT3V0cHV0Q29udHJvbCk7CisJCWVsc2UKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgTFZUTUFPdXRwdXRDb250cm9sKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CisJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVFYxT3V0cHV0Q29udHJvbCk7CisJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDVjFPdXRwdXRDb250cm9sKTsKKwkJZWxzZQorCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMxT3V0cHV0Q29udHJvbCk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCisJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRWMU91dHB1dENvbnRyb2wpOworCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgQ1YxT3V0cHV0Q29udHJvbCk7CisJCWVsc2UKKwkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMk91dHB1dENvbnRyb2wpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQlhcmdzLnVjQWN0aW9uID0gQVRPTV9FTkFCTEU7CisJCS8qIHdvcmthcm91bmQgZm9yIERWT091dHB1dENvbnRyb2wgb24gc29tZSBSUzY5MCBzeXN0ZW1zICovCisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREkpIHsKKwkJCXUzMiByZWcgPSBSUkVHMzIoUkFERU9OX0JJT1NfM19TQ1JBVENIKTsKKwkJCVdSRUczMihSQURFT05fQklPU18zX1NDUkFUQ0gsIHJlZyAmIH5BVE9NX1MzX0RGUDJJX0FDVElWRSk7CisJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKwkJCVdSRUczMihSQURFT05fQklPU18zX1NDUkFUQ0gsIHJlZyk7CisJCX0gZWxzZQorCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKKwkJCWFyZ3MudWNBY3Rpb24gPSBBVE9NX0xDRF9CTE9OOworCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKKwkJYXJncy51Y0FjdGlvbiA9IEFUT01fRElTQUJMRTsKKwkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHsKKwkJCWFyZ3MudWNBY3Rpb24gPSBBVE9NX0xDRF9CTE9GRjsKKwkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3JhZGVvbl9hdG9tX2VuY29kZXJfZHBtc19kaWcoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gTlVMTDsKKwlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPSBOVUxMOworCisJaWYgKGNvbm5lY3RvcikgeworCQlyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCQlyYWRlb25fZGlnX2Nvbm5lY3RvciA9IHJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OworCX0KKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJLyogc29tZSBlYXJseSBkY2UzLjIgYm9hcmRzIGhhdmUgYSBidWcgaW4gdGhlaXIgdHJhbnNtaXR0ZXIgY29udHJvbCB0YWJsZSAqLworCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzEwKSB8fCAocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MzApKQorCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRSwgMCwgMCk7CisJCWVsc2UKKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEVfT1VUUFVULCAwLCAwKTsKKwkJaWYgKEVOQ09ERVJfTU9ERV9JU19EUChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpKSAmJiBjb25uZWN0b3IpIHsKKwkJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKKwkJCQlhdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKGNvbm5lY3RvciwKKwkJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKTsKKwkJCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZWRwX29uID0gdHJ1ZTsKKwkJCX0KKwkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PRkYsIDApOworCQkJcmFkZW9uX2RwX2xpbmtfdHJhaW4oZW5jb2RlciwgY29ubmVjdG9yKTsKKwkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PTiwgMCk7CisJCX0KKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9MQ0RfQkxPTiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFX09VVFBVVCwgMCwgMCk7CisJCWlmIChFTkNPREVSX01PREVfSVNfRFAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSkgJiYgY29ubmVjdG9yKSB7CisJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfRFBfVklERU9fT0ZGLCAwKTsKKwkJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApIHsKKwkJCQlhdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKGNvbm5lY3RvciwKKwkJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRik7CisJCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmVkcF9vbiA9IGZhbHNlOworCQkJfQorCQl9CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fTENEX0JMT0ZGLCAwLCAwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2V4dChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIsCisJCQkgICAgIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCWRlZmF1bHQ6CisJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQpOworCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HX09GRik7CisJCX0gZWxzZQorCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQlicmVhazsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgeworCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HKTsKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQpOworCQl9IGVsc2UKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK3JhZGVvbl9hdG9tX2VuY29kZXJfZHBtcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCisJRFJNX0RFQlVHX0tNUygiZW5jb2RlciBkcG1zICVkIHRvIG1vZGUgJWQsIGRldmljZXMgJTA4eCwgYWN0aXZlX2RldmljZXMgJTA4eFxuIiwKKwkJICByYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCwgbW9kZSwgcmFkZW9uX2VuY29kZXItPmRldmljZXMsCisJCSAgcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UpOworCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKKwkJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2F2aXZvKGVuY29kZXIsIG1vZGUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgorCQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXNfZGlnKGVuY29kZXIsIG1vZGUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgorCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCQkJYXRvbWJpb3NfZHZvX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKQorCQkJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2RpZyhlbmNvZGVyLCBtb2RlKTsKKwkJZWxzZQorCQkJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2F2aXZvKGVuY29kZXIsIG1vZGUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQkJc3dpdGNoIChtb2RlKSB7CisJCQljYXNlIERSTV9NT0RFX0RQTVNfT046CisJCQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQkJCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCXJhZGVvbl9hdG9tX2VuY29kZXJfZHBtc19hdml2byhlbmNvZGVyLCBtb2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWlmIChleHRfZW5jb2RlcikKKwkJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zX2V4dChlbmNvZGVyLCBleHRfZW5jb2RlciwgbW9kZSk7CisKKwlyYWRlb25fYXRvbWJpb3NfZW5jb2Rlcl9kcG1zX3NjcmF0Y2hfcmVncyhlbmNvZGVyLCAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKSA/IHRydWUgOiBmYWxzZSk7CisKK30KKwordW5pb24gY3J0Y19zb3VyY2VfcGFyYW0geworCVNFTEVDVF9DUlRDX1NPVVJDRV9QU19BTExPQ0FUSU9OIHYxOworCVNFTEVDVF9DUlRDX1NPVVJDRV9QQVJBTUVURVJTX1YyIHYyOworfTsKKworc3RhdGljIHZvaWQKK2F0b21iaW9zX3NldF9lbmNvZGVyX2NydGNfc291cmNlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOworCXVuaW9uIGNydGNfc291cmNlX3BhcmFtIGFyZ3M7CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgU2VsZWN0Q1JUQ19Tb3VyY2UpOworCXVpbnQ4X3QgZnJldiwgY3JldjsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKKworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGZyZXYpIHsKKwljYXNlIDE6CisJCXN3aXRjaCAoY3JldikgeworCQljYXNlIDE6CisJCWRlZmF1bHQ6CisJCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKKwkJCQlhcmdzLnYxLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCQkJZWxzZSB7CisJCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzEpIHsKKwkJCQkJYXJncy52MS51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKKwkJCQl9IGVsc2UgeworCQkJCQlhcmdzLnYxLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkIDw8IDI7CisJCQkJfQorCQkJfQorCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgorCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9ERlAxX0lOREVYOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpCisJCQkJCWFyZ3MudjEudWNEZXZpY2UgPSBBVE9NX0RFVklDRV9MQ0QxX0lOREVYOworCQkJCWVsc2UKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0RGUDNfSU5ERVg7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0RGUDJfSU5ERVg7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgorCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX1RWMV9JTkRFWDsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0NWX0lOREVYOworCQkJCWVsc2UKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0NSVDFfSU5ERVg7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX1RWMV9JTkRFWDsKKwkJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0NWX0lOREVYOworCQkJCWVsc2UKKwkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0NSVDJfSU5ERVg7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYXJncy52Mi51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKKwkJCWlmIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0gRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkgeworCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKKworCQkJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKQorCQkJCQlhcmdzLnYyLnVjRW5jb2RlTW9kZSA9IEFUT01fRU5DT0RFUl9NT0RFX0xWRFM7CisJCQkJZWxzZSBpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKQorCQkJCQlhcmdzLnYyLnVjRW5jb2RlTW9kZSA9IEFUT01fRU5DT0RFUl9NT0RFX0NSVDsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKwkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJCQkJZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCQkJCXN3aXRjaCAoZGlnLT5kaWdfZW5jb2RlcikgeworCQkJCWNhc2UgMDoKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzFfRU5DT0RFUl9JRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMl9FTkNPREVSX0lEOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUczX0VOQ09ERVJfSUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzRfRU5DT0RFUl9JRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHNV9FTkNPREVSX0lEOworCQkJCQlicmVhazsKKwkJCQljYXNlIDU6CisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUc2X0VOQ09ERVJfSUQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RWT19FTkNPREVSX0lEOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwkJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOworCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfVFZfRU5DT0RFUl9JRDsKKwkJCQllbHNlCisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9EQUMxX0VOQ09ERVJfSUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7CisJCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOworCQkJCWVsc2UKKwkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RBQzJfRU5DT0RFUl9JRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOworCQlyZXR1cm47CisJfQorCisJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7CisKKwkvKiB1cGRhdGUgc2NyYXRjaCByZWdzIHdpdGggbmV3IHJvdXRpbmcgKi8KKwlyYWRlb25fYXRvbWJpb3NfZW5jb2Rlcl9jcnRjX3NjcmF0Y2hfcmVncyhlbmNvZGVyLCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCithdG9tYmlvc19hcHBseV9lbmNvZGVyX3F1aXJrcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOworCisJLyogRnVua3kgbWFjYm9va3MgKi8KKwlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NzFDNSkgJiYKKwkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNmIpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDgwKSkgeworCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpIHsKKwkJCXVpbnQzMl90IGx2dG1hX2JpdF9kZXB0aF9jb250cm9sID0gUlJFRzMyKEFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MKTsKKworCQkJbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgJj0gfkFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MX1RSVU5DQVRFX0VOOworCQkJbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgJj0gfkFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MX1NQQVRJQUxfRElUSEVSX0VOOworCisJCQlXUkVHMzIoQVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0wsIGx2dG1hX2JpdF9kZXB0aF9jb250cm9sKTsKKwkJfQorCX0KKworCS8qIHNldCBzY2FsZXIgY2xlYXJzIHRoaXMgb24gc29tZSBjaGlwcyAqLworCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpICYmCisJICAgICghKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKSkpIHsKKwkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCQkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQkJV1JFRzMyKEVWRVJHUkVFTl9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkJCQkgICAgICAgRVZFUkdSRUVOX0lOVEVSTEVBVkVfRU4pOworCQkJZWxzZQorCQkJCVdSRUczMihFVkVSR1JFRU5fREFUQV9GT1JNQVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCQl9IGVsc2UgeworCQkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCisJCQkJV1JFRzMyKEFWSVZPX0QxTU9ERV9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkJCQkgICAgICAgQVZJVk9fRDFNT0RFX0lOVEVSTEVBVkVfRU4pOworCQkJZWxzZQorCQkJCVdSRUczMihBVklWT19EMU1PREVfREFUQV9GT1JNQVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHJhZGVvbl9hdG9tX3BpY2tfZGlnX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9lbmNvZGVyICp0ZXN0X2VuY29kZXI7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7CisJdWludDMyX3QgZGlnX2VuY19pbl91c2UgPSAwOworCisJLyogRENFNC81ICovCisJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCQkvKiBvbnRhcmlvIGZvbGxvd3MgRENFNCAqLworCQkJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHsKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDE7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZQorCQkJCS8qIGxsYW5vIGZvbGxvd3MgRENFMy4yICovCisJCQkJcmV0dXJuIHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJCXJldHVybiAxOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6CisJCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJCXJldHVybiAzOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIDI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJCQkJaWYgKGRpZy0+bGlua2IpCisJCQkJCXJldHVybiA1OworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBvbiBEQ0UzMiBhbmQgZW5jb2RlciBjYW4gZHJpdmVyIGFueSBibG9jayBzbyBqdXN0IGNydGMgaWQgKi8KKwlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgeworCQlyZXR1cm4gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJfQorCisJLyogb24gRENFMyAtIExWVE1BIGNhbiBvbmx5IGJlIGRyaXZlbiBieSBESUdCICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZXN0X2VuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl90ZXN0X2VuY29kZXI7CisKKwkJaWYgKGVuY29kZXIgPT0gdGVzdF9lbmNvZGVyKQorCQkJY29udGludWU7CisKKwkJaWYgKCFyYWRlb25fZW5jb2Rlcl9pc19kaWdpdGFsKHRlc3RfZW5jb2RlcikpCisJCQljb250aW51ZTsKKworCQlyYWRlb25fdGVzdF9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIodGVzdF9lbmNvZGVyKTsKKwkJZGlnID0gcmFkZW9uX3Rlc3RfZW5jb2Rlci0+ZW5jX3ByaXY7CisKKwkJaWYgKGRpZy0+ZGlnX2VuY29kZXIgPj0gMCkKKwkJCWRpZ19lbmNfaW5fdXNlIHw9ICgxIDw8IGRpZy0+ZGlnX2VuY29kZXIpOworCX0KKworCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUEpIHsKKwkJaWYgKGRpZ19lbmNfaW5fdXNlICYgMHgyKQorCQkJRFJNX0VSUk9SKCJMVkRTIHJlcXVpcmVkIGRpZ2l0YWwgZW5jb2RlciAyIGJ1dCBpdCB3YXMgaW4gdXNlIC0gc3RlYWxpbmdcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCEoZGlnX2VuY19pbl91c2UgJiAxKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgb25jZSBhdCBzdGFydHVwICovCit2b2lkCityYWRlb25fYXRvbV9lbmNvZGVyX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCisJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9JTklULCAwLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXh0X2VuY29kZXIgJiYgQVNJQ19JU19EQ0U0MShyZGV2KSkKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9JTklUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityYWRlb25fYXRvbV9lbmNvZGVyX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOworCisJcmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID0gYWRqdXN0ZWRfbW9kZS0+Y2xvY2s7CisKKwlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSAmJiAhQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCisJCQlhdG9tYmlvc195dXZfc2V0dXAoZW5jb2RlciwgdHJ1ZSk7CisJCWVsc2UKKwkJCWF0b21iaW9zX3l1dl9zZXR1cChlbmNvZGVyLCBmYWxzZSk7CisJfQorCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJCWF0b21iaW9zX2RpZ2l0YWxfc2V0dXAoZW5jb2RlciwgUEFORUxfRU5DT0RFUl9BQ1RJT05fRU5BQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKKwkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCQkJLyogZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFLCAwLCAwKTsKKwkJCS8qIHNldHVwIGFuZCBlbmFibGUgdGhlIGVuY29kZXIgKi8KKwkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfU0VUVVAsIDApOworCisJCQkvKiBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7CisJCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUsIDApOworCisJCQkvKiBzZXR1cCBhbmQgZW5hYmxlIHRoZSBlbmNvZGVyIGFuZCB0cmFuc21pdHRlciAqLworCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUsIDApOworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1NFVFVQLCAwLCAwKTsKKwkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9FTkFCTEUsIDAsIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgorCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMjoKKwkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkgeworCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCQlhdG9tYmlvc190dl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCQllbHNlCisJCQkJYXRvbWJpb3NfdHZfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoZXh0X2VuY29kZXIpIHsKKwkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAorCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfU0VUVVApOworCQllbHNlCisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJfQorCisJYXRvbWJpb3NfYXBwbHlfZW5jb2Rlcl9xdWlya3MoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CisKKwlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9IRE1JKSB7CisJCXI2MDBfaGRtaV9lbmFibGUoZW5jb2Rlcik7CisJCXI2MDBfaGRtaV9zZXRtb2RlKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOworCX0KK30KKworc3RhdGljIGJvb2wKK2F0b21iaW9zX2RhY19sb2FkX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCisJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQgfAorCQkJCSAgICAgICBBVE9NX0RFVklDRV9DVl9TVVBQT1JUIHwKKwkJCQkgICAgICAgQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKSB7CisJCURBQ19MT0FEX0RFVEVDVElPTl9QU19BTExPQ0FUSU9OIGFyZ3M7CisJCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQ19Mb2FkRGV0ZWN0aW9uKTsKKwkJdWludDhfdCBmcmV2LCBjcmV2OworCisJCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKworCQlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlhcmdzLnNEYWNsb2FkLnVjTWlzYyA9IDA7CisKKwkJaWYgKChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxKSB8fAorCQkgICAgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxKSkKKwkJCWFyZ3Muc0RhY2xvYWQudWNEYWNUeXBlID0gQVRPTV9EQUNfQTsKKwkJZWxzZQorCQkJYXJncy5zRGFjbG9hZC51Y0RhY1R5cGUgPSBBVE9NX0RBQ19COworCisJCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKQorCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKTsKKwkJZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkKKwkJCWFyZ3Muc0RhY2xvYWQudXNEZXZpY2VJRCA9IGNwdV90b19sZTE2KEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCk7CisJCWVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7CisJCQlhcmdzLnNEYWNsb2FkLnVzRGV2aWNlSUQgPSBjcHVfdG9fbGUxNihBVE9NX0RFVklDRV9DVl9TVVBQT1JUKTsKKwkJCWlmIChjcmV2ID49IDMpCisJCQkJYXJncy5zRGFjbG9hZC51Y01pc2MgPSBEQUNfTE9BRF9NSVNDX1lQclBiOworCQl9IGVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkgeworCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpOworCQkJaWYgKGNyZXYgPj0gMykKKwkJCQlhcmdzLnNEYWNsb2FkLnVjTWlzYyA9IERBQ19MT0FEX01JU0NfWVByUGI7CisJCX0KKworCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworcmFkZW9uX2F0b21fZGFjX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXVpbnQzMl90IGJpb3NfMF9zY3JhdGNoOworCisJaWYgKCFhdG9tYmlvc19kYWNfbG9hZF9kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKSkgeworCQlEUk1fREVCVUdfS01TKCJkZXRlY3QgcmV0dXJuZWQgZmFsc2UgXG4iKTsKKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93bjsKKwl9CisKKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKKwkJYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUjYwMF9CSU9TXzBfU0NSQVRDSCk7CisJZWxzZQorCQliaW9zXzBfc2NyYXRjaCA9IFJSRUczMihSQURFT05fQklPU18wX1NDUkFUQ0gpOworCisJRFJNX0RFQlVHX0tNUygiQmlvcyAwIHNjcmF0Y2ggJXggJTA4eFxuIiwgYmlvc18wX3NjcmF0Y2gsIHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzKTsKKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDFfTUFTSykKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpIHsKKwkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQyX01BU0spCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJfQorCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9DVl9NQVNLfEFUT01fUzBfQ1ZfTUFTS19BKSkKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9UVjFfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfQ09NUE9TSVRFIHwgQVRPTV9TMF9UVjFfQ09NUE9TSVRFX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBDVFYgKi8KKwkJZWxzZSBpZiAoYmlvc18wX3NjcmF0Y2ggJiAoQVRPTV9TMF9UVjFfU1ZJREVPIHwgQVRPTV9TMF9UVjFfU1ZJREVPX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOyAvKiBTVFYgKi8KKwl9CisJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworfQorCitzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cworcmFkZW9uX2F0b21fZGlnX2RldGVjdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisJdTMyIGJpb3NfMF9zY3JhdGNoOworCisJaWYgKCFBU0lDX0lTX0RDRTQocmRldikpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwlpZiAoIWV4dF9lbmNvZGVyKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOworCisJaWYgKChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpID09IDApCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisKKwkvKiBsb2FkIGRldGVjdCBvbiB0aGUgZHAgYnJpZGdlICovCisJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfREFDTE9BRF9ERVRFQ1RJT04pOworCisJYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUjYwMF9CSU9TXzBfU0NSQVRDSCk7CisKKwlEUk1fREVCVUdfS01TKCJCaW9zIDAgc2NyYXRjaCAleCAlMDh4XG4iLCBiaW9zXzBfc2NyYXRjaCwgcmFkZW9uX2VuY29kZXItPmRldmljZXMpOworCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMV9NQVNLKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkgeworCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDJfTUFTSykKKwkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwl9CisJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX0NWX01BU0t8QVRPTV9TMF9DVl9NQVNLX0EpKQorCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCX0KKwlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB7CisJCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9DT01QT1NJVEUgfCBBVE9NX1MwX1RWMV9DT01QT1NJVEVfQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIENUViAqLworCQllbHNlIGlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9TVklERU8gfCBBVE9NX1MwX1RWMV9TVklERU9fQSkpCisJCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIFNUViAqLworCX0KKwlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3ZvaWQKK3JhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKKworCWlmIChleHRfZW5jb2RlcikKKwkJLyogZGRjX3NldHVwIG9uIHRoZSBkcCBicmlkZ2UgKi8KKwkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0REQ19TRVRVUCk7CisKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZW5jb2Rlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOworCisJaWYgKChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmCisJICAgICAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHx8CisJICAgIChyYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoZW5jb2RlcikgIT0KKwkgICAgIEVOQ09ERVJfT0JKRUNUX0lEX05PTkUpKSB7CisJCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OworCQlpZiAoZGlnKQorCQkJZGlnLT5kaWdfZW5jb2RlciA9IHJhZGVvbl9hdG9tX3BpY2tfZGlnX2VuY29kZXIoZW5jb2Rlcik7CisJfQorCisJcmFkZW9uX2F0b21fb3V0cHV0X2xvY2soZW5jb2RlciwgdHJ1ZSk7CisJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKKworCWlmIChjb25uZWN0b3IpIHsKKwkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwkJLyogc2VsZWN0IHRoZSBjbG9jay9kYXRhIHBvcnQgaWYgaXQgdXNlcyBhIHJvdXRlciAqLworCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+cm91dGVyLmNkX3ZhbGlkKQorCQkJcmFkZW9uX3JvdXRlcl9zZWxlY3RfY2RfcG9ydChyYWRlb25fY29ubmVjdG9yKTsKKworCQkvKiB0dXJuIGVEUCBwYW5lbCBvbiBmb3IgbW9kZSBzZXQgKi8KKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKKwkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAorCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PTik7CisJfQorCisJLyogdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwbGwvc3Mgc2V0dXAgdG8gd29yayBjb3JyZWN0bHkgaW4gc29tZSBjYXNlcyAqLworCWF0b21iaW9zX3NldF9lbmNvZGVyX2NydGNfc291cmNlKGVuY29kZXIpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOworCXJhZGVvbl9hdG9tX291dHB1dF9sb2NrKGVuY29kZXIsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZW5jb2Rlcl9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7CisKKwkvKiBjaGVjayBmb3IgcHJlLURDRTMgY2FyZHMgd2l0aCBzaGFyZWQgZW5jb2RlcnM7CisJICogY2FuJ3QgcmVhbGx5IHVzZSB0aGUgbGlua3MgaW5kaXZpZHVhbGx5LCBzbyBkb24ndCBkaXNhYmxlCisJICogdGhlIGVuY29kZXIgaWYgaXQncyBpbiB1c2UgYnkgYW5vdGhlciBjb25uZWN0b3IKKwkgKi8KKwlpZiAoIUFTSUNfSVNfRENFMyhyZGV2KSkgeworCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKm90aGVyX2VuY29kZXI7CisJCXN0cnVjdCByYWRlb25fZW5jb2RlciAqb3RoZXJfcmFkZW9uX2VuY29kZXI7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvdGhlcl9lbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKKwkJCW90aGVyX3JhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIob3RoZXJfZW5jb2Rlcik7CisJCQlpZiAoKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IG90aGVyX3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSAmJgorCQkJICAgIGRybV9oZWxwZXJfZW5jb2Rlcl9pbl91c2Uob3RoZXJfZW5jb2RlcikpCisJCQkJZ290byBkaXNhYmxlX2RvbmU7CisJCX0KKwl9CisKKwlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCisJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgeworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6CisJCWF0b21iaW9zX2RpZ2l0YWxfc2V0dXAoZW5jb2RlciwgUEFORUxfRU5DT0RFUl9BQ1RJT05fRElTQUJMRSk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUsIDAsIDApOworCQllbHNlIHsKKwkJCS8qIGRpc2FibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCisJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7CisJCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUsIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgorCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CisJCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOworCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCB8IEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJYXRvbWJpb3NfdHZfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJYnJlYWs7CisJfQorCitkaXNhYmxlX2RvbmU6CisJaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RpZ2l0YWwoZW5jb2RlcikpIHsKKwkJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKKwkJCXI2MDBfaGRtaV9kaXNhYmxlKGVuY29kZXIpOworCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7CisJCWRpZy0+ZGlnX2VuY29kZXIgPSAtMTsKKwl9CisJcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgPSAwOworfQorCisvKiB0aGVzZSBhcmUgaGFuZGxlZCBieSB0aGUgcHJpbWFyeSBlbmNvZGVycyAqLworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2V4dF9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCit9CisKK3N0YXRpYyB2b2lkCityYWRlb25fYXRvbV9leHRfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2V4dF9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKworfQorCitzdGF0aWMgdm9pZAorcmFkZW9uX2F0b21fZXh0X2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKworfQorCitzdGF0aWMgYm9vbCByYWRlb25fYXRvbV9leHRfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZXh0X2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IHJhZGVvbl9hdG9tX2V4dF9kcG1zLAorCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2F0b21fZXh0X21vZGVfZml4dXAsCisJLnByZXBhcmUgPSByYWRlb25fYXRvbV9leHRfcHJlcGFyZSwKKwkubW9kZV9zZXQgPSByYWRlb25fYXRvbV9leHRfbW9kZV9zZXQsCisJLmNvbW1pdCA9IHJhZGVvbl9hdG9tX2V4dF9jb21taXQsCisJLmRpc2FibGUgPSByYWRlb25fYXRvbV9leHRfZGlzYWJsZSwKKwkvKiBubyBkZXRlY3QgZm9yIFRNRFMvTFZEUyB5ZXQgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9hdG9tX2RpZ19oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSByYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMsCisJLm1vZGVfZml4dXAgPSByYWRlb25fYXRvbV9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9wcmVwYXJlLAorCS5tb2RlX3NldCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfbW9kZV9zZXQsCisJLmNvbW1pdCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfY29tbWl0LAorCS5kaXNhYmxlID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9kaXNhYmxlLAorCS5kZXRlY3QgPSByYWRlb25fYXRvbV9kaWdfZGV0ZWN0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZGFjX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IHJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcywKKwkubW9kZV9maXh1cCA9IHJhZGVvbl9hdG9tX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldCwKKwkuY29tbWl0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9jb21taXQsCisJLmRldGVjdCA9IHJhZGVvbl9hdG9tX2RhY19kZXRlY3QsCit9OworCit2b2lkIHJhZGVvbl9lbmNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCWtmcmVlKHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdik7CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlrZnJlZShyYWRlb25fZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgcmFkZW9uX2F0b21fZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gcmFkZW9uX2VuY19kZXN0cm95LAorfTsKKworc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjICoKK3JhZGVvbl9hdG9tYmlvc19zZXRfZGFjX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmFkZW9uX2VuY29kZXItPmJhc2UuZGV2OworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyksIEdGUF9LRVJORUwpOworCisJaWYgKCFkYWMpCisJCXJldHVybiBOVUxMOworCisJZGFjLT50dl9zdGQgPSByYWRlb25fYXRvbWJpb3NfZ2V0X3R2X2luZm8ocmRldik7CisJcmV0dXJuIGRhYzsKK30KKworc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICoKK3JhZGVvbl9hdG9tYmlvc19zZXRfZGlnX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcikKK3sKKwlpbnQgZW5jb2Rlcl9lbnVtID0gKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gJiBFTlVNX0lEX01BU0spID4+IEVOVU1fSURfU0hJRlQ7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGlnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNvaGVyZW50IG1vZGUgYnkgZGVmYXVsdCAqLworCWRpZy0+Y29oZXJlbnRfbW9kZSA9IHRydWU7CisJZGlnLT5kaWdfZW5jb2RlciA9IC0xOworCisJaWYgKGVuY29kZXJfZW51bSA9PSAyKQorCQlkaWctPmxpbmtiID0gdHJ1ZTsKKwllbHNlCisJCWRpZy0+bGlua2IgPSBmYWxzZTsKKworCXJldHVybiBkaWc7Cit9CisKK3ZvaWQKK3JhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQl1aW50MzJfdCBlbmNvZGVyX2VudW0sCisJCQl1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAorCQkJdTE2IGNhcHMpCit7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyOworCisJLyogc2VlIGlmIHdlIGFscmVhZHkgYWRkZWQgaXQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgeworCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOworCQlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSA9PSBlbmNvZGVyX2VudW0pIHsKKwkJCXJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzIHw9IHN1cHBvcnRlZF9kZXZpY2U7CisJCQlyZXR1cm47CisJCX0KKworCX0KKworCS8qIGFkZCBhIG5ldyBvbmUgKi8KKwlyYWRlb25fZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmICghcmFkZW9uX2VuY29kZXIpCisJCXJldHVybjsKKworCWVuY29kZXIgPSAmcmFkZW9uX2VuY29kZXItPmJhc2U7CisJc3dpdGNoIChyZGV2LT5udW1fY3J0YykgeworCWNhc2UgMToKKwkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwlkZWZhdWx0OgorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4ZjsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4M2Y7CisJCWJyZWFrOworCX0KKworCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IE5VTEw7CisKKwlyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtID0gZW5jb2Rlcl9lbnVtOworCXJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID0gKGVuY29kZXJfZW51bSAmIE9CSkVDVF9JRF9NQVNLKSA+PiBPQkpFQ1RfSURfU0hJRlQ7CisJcmFkZW9uX2VuY29kZXItPmRldmljZXMgPSBzdXBwb3J0ZWRfZGV2aWNlOworCXJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZSA9IFJNWF9PRkY7CisJcmFkZW9uX2VuY29kZXItPnVuZGVyc2Nhbl90eXBlID0gVU5ERVJTQ0FOX09GRjsKKwlyYWRlb25fZW5jb2Rlci0+aXNfZXh0X2VuY29kZXIgPSBmYWxzZTsKKwlyYWRlb25fZW5jb2Rlci0+Y2FwcyA9IGNhcHM7CisKKwlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX0ZVTEw7CisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKwkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19nZXRfbHZkc19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCX0KKwkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKKwkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKwkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2RhY19oZWxwZXJfZnVuY3MpOworCQlicmVhazsKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgorCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9UVkRBQyk7CisJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19zZXRfZGFjX2luZm8ocmFkZW9uX2VuY29kZXIpOworCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kYWNfaGVscGVyX2Z1bmNzKTsKKwkJYnJlYWs7CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgeworCQkJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX0ZVTEw7CisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKwkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19nZXRfbHZkc19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpIHsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0RBQyk7CisJCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhyYWRlb25fZW5jb2Rlcik7CisJCX0KKwkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyk7CisJCWJyZWFrOworCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfU0kxNzBCOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfQ0g3MzAzOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfRVhURVJOQUxfU0RWT0E6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9FWFRFUk5BTF9TRFZPQjoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RJVEZQNTEzOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVlQxNjIzOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSERNSV9TSTE5MzA6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVM6CisJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9OVVRNRUc6CisJCS8qIHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHRoZSBwcmltYXJ5IGVuY29kZXJzICovCisJCXJhZGVvbl9lbmNvZGVyLT5pc19leHRfZW5jb2RlciA9IHRydWU7CisJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCisJCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKwkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKQorCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKKwkJZWxzZQorCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7CisJCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2V4dF9oZWxwZXJfZnVuY3MpOworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwppbmRleCBjNGZmYTE0Zi4uMWQ2MDNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyB2b2lkIGV2ZXJncmVlbl9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIGV2ZXJncmVlbl9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXN0YXRpYyB2b2lkIGV2ZXJncmVlbl9wY2llX2dlbjJfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiB2b2lkIGV2ZXJncmVlbl9maXhfcGNpX21heF9yZWFkX3JlcV9zaXplKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewpAQCAtMTU3LDYgKzE1Nyw1NyBAQAogCXJldHVybiBhY3R1YWxfdGVtcCAqIDEwMDA7CiB9CiAKK3ZvaWQgc3Vtb19wbV9pbml0X3Byb2ZpbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaW50IGlkeDsKKworCS8qIGRlZmF1bHQgKi8KKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0RFRkFVTFRfSURYXS5kcG1zX29mZl9wc19pZHggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfREVGQVVMVF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0RFRkFVTFRfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfREVGQVVMVF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKKworCS8qIGxvdyxtaWQgc2gvbWggKi8KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfTU9CSUxJVFkpCisJCWlkeCA9IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDApOworCWVsc2UKKwkJaWR4ID0gcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOworCisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29uX2NtX2lkeCA9IDA7CisKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKKworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAwOworCisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPSBpZHg7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX2NtX2lkeCA9IDA7CisKKwkvKiBoaWdoIHNoL21oICovCisJaWR4ID0gcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9IGlkeDsKKwlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb25fY21faWR4ID0KKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbaWR4XS5udW1fY2xvY2tfbW9kZXMgLSAxOworCisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0gaWR4OworCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpZHhdLm51bV9jbG9ja19tb2RlcyAtIDE7Cit9CisKIHZvaWQgZXZlcmdyZWVuX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHJlcV9wc19pZHggPSByZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXg7CkBAIC0zNTMsNiArNDA0LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CisJCXJhZGVvbl9ocGRfc2V0X3BvbGFyaXR5KHJkZXYsIHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpOwogCX0KIAlpZiAocmRldi0+aXJxLmluc3RhbGxlZCkKIAkJZXZlcmdyZWVuX2lycV9zZXQocmRldik7CkBAIC04OTMsNyArOTQ1LDcgQEAKIAl1MzIgdG1wOwogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkzNSw2ICs5ODcsOSBAQAogCVdSRUczMihWTV9DT05URVhUMV9DTlRMLCAwKTsKIAogCWV2ZXJncmVlbl9wY2llX2dhcnRfdGxiX2ZsdXNoKHJkZXYpOworCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTAxNmxsWCkuXG4iLAorCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPmdhcnQudGFibGVfYWRkcik7CiAJcmRldi0+Z2FydC5yZWFkeSA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CkBAIC05NDIsNyArOTk3LDYgQEAKIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7Ci0JaW50IHI7CiAKIAkvKiBEaXNhYmxlIGFsbCB0YWJsZXMgKi8KIAlXUkVHMzIoVk1fQ09OVEVYVDBfQ05UTCwgMCk7CkBAIC05NjIsMTQgKzEwMTYsNyBAQAogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIxX0NOVEwsIHRtcCk7CiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjJfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTUJfTDFfVExCM19DTlRMLCB0bXApOwotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKLQkJaWYgKGxpa2VseShyID09IDApKSB7Ci0JCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJfQotCX0KKwlyYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHJkZXYpOwogfQogCiB2b2lkIGV2ZXJncmVlbl9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTEyMjMsNyArMTI3MCw3IEBACiAJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLAogCQkJcmRldi0+bWMudnJhbV9lbmQgPj4gMTIpOwogCX0KLQlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgMCk7CisJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ERUZBVUxUX0FERFIsIHJkZXYtPnZyYW1fc2NyYXRjaC5ncHVfYWRkciA+PiAxMik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgewogCQl0bXAgPSBSUkVHMzIoTUNfRlVTX1ZNX0ZCX09GRlNFVCkgJiAweDAwMEZGRkZGOwogCQl0bXAgfD0gKChyZGV2LT5tYy52cmFtX2VuZCA+PiAyMCkgJiAweEYpIDw8IDI0OwpAQCAtMjU4Niw3ICsyNjMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGV2ZXJncmVlbl9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorc3RhdGljIHZvaWQgZXZlcmdyZWVuX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKIApAQCAtMjY5Nyw3ICsyNzQ0LDcgQEAKIAlyNjAwX3JsY19zdG9wKHJkZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiBldmVyZ3JlZW5fZ2V0X2loX3dwdHIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdTMyIGV2ZXJncmVlbl9nZXRfaWhfd3B0cihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgd3B0ciwgdG1wOwogCkBAIC0zMDAzLDggKzMwNTAsNyBAQAogCWludCByOwogCiAJLyogZW5hYmxlIHBjaWUgZ2VuMiBsaW5rICovCi0JaWYgKCFBU0lDX0lTX0RDRTUocmRldikpCi0JCWV2ZXJncmVlbl9wY2llX2dlbjJfZW5hYmxlKHJkZXYpOworCWV2ZXJncmVlbl9wY2llX2dlbjJfZW5hYmxlKHJkZXYpOwogCiAJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgewogCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdyB8fCAhcmRldi0+bWNfZncpIHsKQEAgLTMwMjksNiArMzA3NSwxMCBAQAogCQl9CiAJfQogCisJciA9IHI2MDBfdnJhbV9zY3JhdGNoX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJZXZlcmdyZWVuX21jX3Byb2dyYW0ocmRldik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlldmVyZ3JlZW5fYWdwX2VuYWJsZShyZGV2KTsKQEAgLTMwNDEsNyArMzA5MSw3IEBACiAKIAlyID0gZXZlcmdyZWVuX2JsaXRfaW5pdChyZGV2KTsKIAlpZiAocikgewotCQlldmVyZ3JlZW5fYmxpdF9maW5pKHJkZXYpOworCQlyNjAwX2JsaXRfZmluaShyZGV2KTsKIAkJcmRldi0+YXNpYy0+Y29weSA9IE5VTEw7CiAJCWRldl93YXJuKHJkZXYtPmRldiwgImZhaWxlZCBibGl0dGVyICglZCkgZmFsbGluZyBiYWNrIHRvIG1lbWNweVxuIiwgcik7CiAJfQpAQCAtMzEwNyw0NSArMzE1NywxNCBAQAogCiBpbnQgZXZlcmdyZWVuX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JaW50IHI7Ci0KIAkvKiBGSVhNRTogd2Ugc2hvdWxkIHdhaXQgZm9yIHJpbmcgdG8gYmUgZW1wdHkgKi8KIAlyNzAwX2NwX3N0b3AocmRldik7CiAJcmRldi0+Y3AucmVhZHkgPSBmYWxzZTsKIAlldmVyZ3JlZW5faXJxX3N1c3BlbmQocmRldik7CiAJcmFkZW9uX3diX2Rpc2FibGUocmRldik7CiAJZXZlcmdyZWVuX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOworCXI2MDBfYmxpdF9zdXNwZW5kKHJkZXYpOwogCi0JLyogdW5waW4gc2hhZGVycyBibyAqLwotCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOwotCWlmIChsaWtlbHkociA9PSAwKSkgewotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGV2ZXJncmVlbl9jb3B5X2JsaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQl1aW50NjRfdCBzcmNfb2Zmc2V0LAotCQkJdWludDY0X3QgZHN0X29mZnNldCwKLQkJCXVuc2lnbmVkIG51bV9ncHVfcGFnZXMsCi0JCQlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSkKLXsKLQlpbnQgcjsKLQotCW11dGV4X2xvY2soJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7Ci0JcmRldi0+cjYwMF9ibGl0LnZiX2liID0gTlVMTDsKLQlyID0gZXZlcmdyZWVuX2JsaXRfcHJlcGFyZV9jb3B5KHJkZXYsIG51bV9ncHVfcGFnZXMgKiBSQURFT05fR1BVX1BBR0VfU0laRSk7Ci0JaWYgKHIpIHsKLQkJaWYgKHJkZXYtPnI2MDBfYmxpdC52Yl9pYikKLQkJCXJhZGVvbl9pYl9mcmVlKHJkZXYsICZyZGV2LT5yNjAwX2JsaXQudmJfaWIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7Ci0JCXJldHVybiByOwotCX0KLQlldmVyZ3JlZW5fa21zX2JsaXRfY29weShyZGV2LCBzcmNfb2Zmc2V0LCBkc3Rfb2Zmc2V0LCBudW1fZ3B1X3BhZ2VzICogUkFERU9OX0dQVV9QQUdFX1NJWkUpOwotCWV2ZXJncmVlbl9ibGl0X2RvbmVfY29weShyZGV2LCBmZW5jZSk7Ci0JbXV0ZXhfdW5sb2NrKCZyZGV2LT5yNjAwX2JsaXQubXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0zMjU3LDEzICszMjc2LDE0IEBACiAKIHZvaWQgZXZlcmdyZWVuX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JZXZlcmdyZWVuX2JsaXRfZmluaShyZGV2KTsKKwlyNjAwX2JsaXRfZmluaShyZGV2KTsKIAlyNzAwX2NwX2ZpbmkocmRldik7CiAJcjYwMF9pcnFfZmluaShyZGV2KTsKIAlyYWRlb25fd2JfZmluaShyZGV2KTsKIAlyYWRlb25faWJfcG9vbF9maW5pKHJkZXYpOwogCXJhZGVvbl9pcnFfa21zX2ZpbmkocmRldik7CiAJZXZlcmdyZWVuX3BjaWVfZ2FydF9maW5pKHJkZXYpOworCXI2MDBfdnJhbV9zY3JhdGNoX2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwogCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CkBAIC0zMjczLDcgKzMyOTMsNyBAQAogCXJkZXYtPmJpb3MgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIGxpbmtfd2lkdGhfY250bCwgc3BlZWRfY250bDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKaW5kZXggMmViMjUxOC4uOTE0ZTVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCkBAIC01Niw3ICs1Niw5IEBACiAJaWYgKGggPCA4KQogCQloID0gODsKIAotCWNiX2NvbG9yX2luZm8gPSAoKGZvcm1hdCA8PCAyKSB8ICgxIDw8IDI0KSB8ICgxIDw8IDgpKTsKKwljYl9jb2xvcl9pbmZvID0gQ0JfRk9STUFUKGZvcm1hdCkgfAorCQlDQl9TT1VSQ0VfRk9STUFUKENCX1NGX0VYUE9SVF9OT1JNKSB8CisJCUNCX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOwogCXBpdGNoID0gKHcgLyA4KSAtIDE7CiAJc2xpY2UgPSAoKHcgKiBoKSAvIDY0KSAtIDE7CiAKQEAgLTY3LDcgKzY5LDcgQEAKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBzbGljZSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgY2JfY29sb3JfaW5mbyk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKDEgPDwgNCkpOworCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsICh3IC0gMSkgfCAoKGggLSAxKSA8PCAxNikpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDApOwpAQCAtOTIsNiArOTQsMTUgQEAKIAllbHNlCiAJCWNwX2NvaGVyX3NpemUgPSAoKHNpemUgKyAyNTUpID4+IDgpOwogCisJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0NBWU1BTikgeworCQkvKiBDUF9DT0hFUl9DTlRMMiBoYXMgdG8gYmUgc2V0IG1hbnVhbGx5IHdoZW4gc3VibWl0dGluZyBhIHN1cmZhY2Vfc3luYworCQkgKiB0byB0aGUgUkIgZGlyZWN0bHkuIEZvciBJQnMsIHRoZSBDUCBwcm9ncmFtcyB0aGlzIGFzIHBhcnQgb2YgdGhlCisJCSAqIHN1cmZhY2Vfc3luYyBwYWNrZXQuCisJCSAqLworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX0NPTkZJR19SRUcsIDEpKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgKDB4ODVlOCAtIFBBQ0tFVDNfU0VUX0NPTkZJR19SRUdfU1RBUlQpID4+IDIpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsgLyogQ1BfQ09IRVJfQ05UTDIgKi8KKwl9CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NVUkZBQ0VfU1lOQywgMykpOwogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHN5bmNfdHlwZSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgY3BfY29oZXJfc2l6ZSk7CkBAIC0xMzMsMTIgKzE0NCwxNiBAQAogCXUzMiBzcV92dHhfY29uc3RhbnRfd29yZDIsIHNxX3Z0eF9jb25zdGFudF93b3JkMzsKIAogCS8qIGhpZ2ggYWRkciwgc3RyaWRlICovCi0Jc3FfdnR4X2NvbnN0YW50X3dvcmQyID0gKCh1cHBlcl8zMl9iaXRzKGdwdV9hZGRyKSAmIDB4ZmYpIHwgKDE2IDw8IDgpKTsKKwlzcV92dHhfY29uc3RhbnRfd29yZDIgPSBTUV9WVFhDX0JBU0VfQUREUl9ISSh1cHBlcl8zMl9iaXRzKGdwdV9hZGRyKSAmIDB4ZmYpIHwKKwkJU1FfVlRYQ19TVFJJREUoMTYpOwogI2lmZGVmIF9fQklHX0VORElBTgotCXNxX3Z0eF9jb25zdGFudF93b3JkMiB8PSAoMiA8PCAzMCk7CisJc3FfdnR4X2NvbnN0YW50X3dvcmQyIHw9IFNRX1ZUWENfRU5ESUFOX1NXQVAoU1FfRU5ESUFOXzhJTjMyKTsKICNlbmRpZgogCS8qIHh5encgc3dpenpsZXMgKi8KLQlzcV92dHhfY29uc3RhbnRfd29yZDMgPSAoMCA8PCAzKSB8ICgxIDw8IDYpIHwgKDIgPDwgOSkgfCAoMyA8PCAxMik7CisJc3FfdnR4X2NvbnN0YW50X3dvcmQzID0gU1FfVlRDWF9TRUxfWChTUV9TRUxfWCkgfAorCQlTUV9WVENYX1NFTF9ZKFNRX1NFTF9ZKSB8CisJCVNRX1ZUQ1hfU0VMX1ooU1FfU0VMX1opIHwKKwkJU1FfVlRDWF9TRUxfVyhTUV9TRUxfVyk7CiAKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX1JFU09VUkNFLCA4KSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMHg1ODApOwpAQCAtMTQ5LDcgKzE2NCw3IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7Ci0JcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgU1FfVEVYX1ZUWF9WQUxJRF9CVUZGRVIgPDwgMzApOworCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFNfX1NRX0NPTlNUQU5UX1RZUEUoU1FfVEVYX1ZUWF9WQUxJRF9CVUZGRVIpKTsKIAogCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8CiAJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fApAQCAtMTY4LDcgKzE4Myw3IEBACiBzdGF0aWMgdm9pZAogc2V0X3RleF9yZXNvdXJjZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCwgaW50IHBpdGNoLAotCQkgdTY0IGdwdV9hZGRyKQorCQkgdTY0IGdwdV9hZGRyLCB1MzIgc2l6ZSkKIHsKIAl1MzIgc3FfdGV4X3Jlc291cmNlX3dvcmQwLCBzcV90ZXhfcmVzb3VyY2Vfd29yZDE7CiAJdTMyIHNxX3RleF9yZXNvdXJjZV93b3JkNCwgc3FfdGV4X3Jlc291cmNlX3dvcmQ3OwpAQCAtMTc2LDE0ICsxOTEsMjIgQEAKIAlpZiAoaCA8IDEpCiAJCWggPSAxOwogCi0Jc3FfdGV4X3Jlc291cmNlX3dvcmQwID0gKDEgPDwgMCk7IC8qIDJEICovCisJc3FfdGV4X3Jlc291cmNlX3dvcmQwID0gVEVYX0RJTShTUV9URVhfRElNXzJEKTsKIAlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgfD0gKCgoKHBpdGNoID4+IDMpIC0gMSkgPDwgNikgfAogCQkJCSAgKCh3IC0gMSkgPDwgMTgpKTsKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDEgPSAoKGggLSAxKSA8PCAwKSB8ICgxIDw8IDI4KTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDEgPSAoKGggLSAxKSA8PCAwKSB8CisJCQkJVEVYX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOwogCS8qIHh5encgc3dpenpsZXMgKi8KLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDQgPSAoMCA8PCAxNikgfCAoMSA8PCAxOSkgfCAoMiA8PCAyMikgfCAoMyA8PCAyNSk7CisJc3FfdGV4X3Jlc291cmNlX3dvcmQ0ID0gVEVYX0RTVF9TRUxfWChTUV9TRUxfWCkgfAorCQkJCVRFWF9EU1RfU0VMX1koU1FfU0VMX1kpIHwKKwkJCQlURVhfRFNUX1NFTF9aKFNRX1NFTF9aKSB8CisJCQkJVEVYX0RTVF9TRUxfVyhTUV9TRUxfVyk7CiAKLQlzcV90ZXhfcmVzb3VyY2Vfd29yZDcgPSBmb3JtYXQgfCAoU1FfVEVYX1ZUWF9WQUxJRF9URVhUVVJFIDw8IDMwKTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDcgPSBmb3JtYXQgfAorCQlTX19TUV9DT05TVEFOVF9UWVBFKFNRX1RFWF9WVFhfVkFMSURfVEVYVFVSRSk7CisKKwljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCisJCQkgICAgUEFDS0VUM19UQ19BQ1RJT05fRU5BLCBzaXplLCBncHVfYWRkcik7CiAKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfU0VUX1JFU09VUkNFLCA4KSk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CkBAIC01ODQsMzEgKzYwNyw2IEBACiAKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBpMmYodWludDMyX3QgaW5wdXQpCi17Ci0JdTMyIHJlc3VsdCwgaSwgZXhwb25lbnQsIGZyYWN0aW9uOwotCi0JaWYgKChpbnB1dCAmIDB4M2ZmZikgPT0gMCkKLQkJcmVzdWx0ID0gMDsgLyogMCBpcyBhIHNwZWNpYWwgY2FzZSAqLwotCWVsc2UgewotCQlleHBvbmVudCA9IDE0MDsgLyogZXhwb25lbnQgYmlhc2VkIGJ5IDEyNzsgKi8KLQkJZnJhY3Rpb24gPSAoaW5wdXQgJiAweDNmZmYpIDw8IDEwOyAvKiBjaGVhdCBhbmQgb25seQotCQkJCQkJICAgICAgaGFuZGxlIG51bWJlcnMgYmVsb3cgMl5eMTUgKi8KLQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKLQkJCWlmIChmcmFjdGlvbiAmIDB4ODAwMDAwKQotCQkJCWJyZWFrOwotCQkJZWxzZSB7Ci0JCQkJZnJhY3Rpb24gPSBmcmFjdGlvbiA8PCAxOyAvKiBrZWVwCi0JCQkJCQkJICAgICBzaGlmdGluZyBsZWZ0IHVudGlsIHRvcCBiaXQgPSAxICovCi0JCQkJZXhwb25lbnQgPSBleHBvbmVudCAtIDE7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gZXhwb25lbnQgPDwgMjMgfCAoZnJhY3Rpb24gJiAweDdmZmZmZik7IC8qIG1hc2sKLQkJCQkJCQkJICAgIG9mZiB0b3AgYml0OyBhc3N1bWVkIDEgKi8KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQogaW50IGV2ZXJncmVlbl9ibGl0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIG9ial9zaXplOwpAQCAtNjE3LDYgKzYxNSwyNiBAQAogCXUzMiBwYWNrZXQyc1sxNl07CiAJaW50IG51bV9wYWNrZXQycyA9IDA7CiAKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfcmVuZGVyX3RhcmdldCA9IHNldF9yZW5kZXJfdGFyZ2V0OworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLmNwX3NldF9zdXJmYWNlX3N5bmMgPSBjcF9zZXRfc3VyZmFjZV9zeW5jOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9zaGFkZXJzID0gc2V0X3NoYWRlcnM7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3Z0eF9yZXNvdXJjZSA9IHNldF92dHhfcmVzb3VyY2U7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3RleF9yZXNvdXJjZSA9IHNldF90ZXhfcmVzb3VyY2U7CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3NjaXNzb3JzID0gc2V0X3NjaXNzb3JzOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLmRyYXdfYXV0byA9IGRyYXdfYXV0bzsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfZGVmYXVsdF9zdGF0ZSA9IHNldF9kZWZhdWx0X3N0YXRlOworCisJcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9jb21tb24gPSA1NTsgLyogc2hhZGVycyArIGRlZiBzdGF0ZSAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDE2OyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDU7IC8qIGRvbmUgY29weSAqLworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uICs9IDE2OyAvKiBmZW5jZSBlbWl0IGZvciBkb25lIGNvcHkgKi8KKworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfcGVyX2xvb3AgPSA3NDsKKwlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfQ0FZTUFOKQorCQlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX3Blcl9sb29wICs9IDk7IC8qIGFkZGl0aW9uYWwgRFdzIGZvciBzdXJmYWNlIHN5bmMgKi8KKworCXJkZXYtPnI2MDBfYmxpdC5tYXhfZGltID0gMTYzODQ7CisKIAkvKiBwaW4gY29weSBzaGFkZXIgaW50byB2cmFtIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KIAlpZiAocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopCiAJCWdvdG8gZG9uZTsKQEAgLTcxMiwyNzcgKzczMCwzIEBACiAJcmFkZW9uX3R0bV9zZXRfYWN0aXZlX3ZyYW1fc2l6ZShyZGV2LCByZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSk7CiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQgZXZlcmdyZWVuX2JsaXRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlpbnQgcjsKLQotCXJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUocmRldiwgcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUpOwotCWlmIChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JLyogSWYgd2UgY2FuJ3QgcmVzZXJ2ZSB0aGUgYm8sIHVucmVmIHNob3VsZCBiZSBlbm91Z2ggdG8gZGVzdHJveQotCSAqIGl0IHdoZW4gaXQgYmVjb21lcyBpZGxlLgotCSAqLwotCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOwotCWlmICghcikgewotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQl9Ci0JcmFkZW9uX2JvX3VucmVmKCZyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci19Ci0KLXN0YXRpYyBpbnQgZXZlcmdyZWVuX3ZiX2liX2dldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlpbnQgcjsKLQlyID0gcmFkZW9uX2liX2dldChyZGV2LCAmcmRldi0+cjYwMF9ibGl0LnZiX2liKTsKLQlpZiAocikgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgSUIgZm9yIHZlcnRleCBidWZmZXJcbiIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlyZGV2LT5yNjAwX2JsaXQudmJfdG90YWwgPSA2NCoxMDI0OwotCXJkZXYtPnI2MDBfYmxpdC52Yl91c2VkID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXZlcmdyZWVuX3ZiX2liX3B1dChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlyYWRlb25fZmVuY2VfZW1pdChyZGV2LCByZGV2LT5yNjAwX2JsaXQudmJfaWItPmZlbmNlKTsKLQlyYWRlb25faWJfZnJlZShyZGV2LCAmcmRldi0+cjYwMF9ibGl0LnZiX2liKTsKLX0KLQotaW50IGV2ZXJncmVlbl9ibGl0X3ByZXBhcmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHNpemVfYnl0ZXMpCi17Ci0JaW50IHI7Ci0JaW50IHJpbmdfc2l6ZSwgbGluZV9zaXplOwotCWludCBtYXhfc2l6ZTsKLQkvKiBsb29wcyBvZiBlbWl0cyArIGZlbmNlIGVtaXQgcG9zc2libGUgKi8KLQlpbnQgZHdvcmRzX3Blcl9sb29wID0gNzQsIG51bV9sb29wczsKLQotCXIgPSBldmVyZ3JlZW5fdmJfaWJfZ2V0KHJkZXYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCS8qIDggYnBwIHZzIDMyIGJwcCBmb3IgeGZlciB1bml0ICovCi0JaWYgKHNpemVfYnl0ZXMgJiAzKQotCQlsaW5lX3NpemUgPSA4MTkyOwotCWVsc2UKLQkJbGluZV9zaXplID0gODE5MiAqIDQ7Ci0KLQltYXhfc2l6ZSA9IDgxOTIgKiBsaW5lX3NpemU7Ci0KLQkvKiBtYWpvciBsb29wcyBjb3ZlciB0aGUgbWF4IHNpemUgdHJhbnNmZXIgKi8KLQludW1fbG9vcHMgPSAoKHNpemVfYnl0ZXMgKyBtYXhfc2l6ZSkgLyBtYXhfc2l6ZSk7Ci0JLyogbWlub3IgbG9vcHMgY292ZXIgdGhlIGV4dHJhIG5vbiBhbGlnbmVkIGJpdHMgKi8KLQludW1fbG9vcHMgKz0gKChzaXplX2J5dGVzICUgbGluZV9zaXplKSA/IDEgOiAwKTsKLQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGxvb3BzIGNvcnJlY3RseSAqLwotCXJpbmdfc2l6ZSA9IG51bV9sb29wcyAqIGR3b3Jkc19wZXJfbG9vcDsKLQkvKiBzZXQgZGVmYXVsdCAgKyBzaGFkZXJzICovCi0JcmluZ19zaXplICs9IDU1OyAvKiBzaGFkZXJzICsgZGVmIHN0YXRlICovCi0JcmluZ19zaXplICs9IDEwOyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLwotCXJpbmdfc2l6ZSArPSA1OyAvKiBkb25lIGNvcHkgKi8KLQlyaW5nX3NpemUgKz0gMTA7IC8qIGZlbmNlIGVtaXQgZm9yIGRvbmUgY29weSAqLwotCXIgPSByYWRlb25fcmluZ19sb2NrKHJkZXYsIHJpbmdfc2l6ZSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0Jc2V0X2RlZmF1bHRfc3RhdGUocmRldik7IC8qIDM2ICovCi0Jc2V0X3NoYWRlcnMocmRldik7IC8qIDE2ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZXZlcmdyZWVuX2JsaXRfZG9uZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZSkKLXsKLQlpbnQgcjsKLQotCWlmIChyZGV2LT5yNjAwX2JsaXQudmJfaWIpCi0JCWV2ZXJncmVlbl92Yl9pYl9wdXQocmRldik7Ci0KLQlpZiAoZmVuY2UpCi0JCXIgPSByYWRlb25fZmVuY2VfZW1pdChyZGV2LCBmZW5jZSk7Ci0KLQlyYWRlb25fcmluZ191bmxvY2tfY29tbWl0KHJkZXYpOwotfQotCi12b2lkIGV2ZXJncmVlbl9rbXNfYmxpdF9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJICAgICB1NjQgc3JjX2dwdV9hZGRyLCB1NjQgZHN0X2dwdV9hZGRyLAotCQkJICAgICBpbnQgc2l6ZV9ieXRlcykKLXsKLQlpbnQgbWF4X2J5dGVzOwotCXU2NCB2Yl9ncHVfYWRkcjsKLQl1MzIgKnZiOwotCi0JRFJNX0RFQlVHKCJlbWl0dGluZyBjb3B5ICUxNmxseCAlMTZsbHggJWQgJWRcbiIsIHNyY19ncHVfYWRkciwgZHN0X2dwdV9hZGRyLAotCQkgIHNpemVfYnl0ZXMsIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkKTsKLQl2YiA9ICh1MzIgKikocmRldi0+cjYwMF9ibGl0LnZiX2liLT5wdHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZCk7Ci0JaWYgKChzaXplX2J5dGVzICYgMykgfHwgKHNyY19ncHVfYWRkciAmIDMpIHx8IChkc3RfZ3B1X2FkZHIgJiAzKSkgewotCQltYXhfYnl0ZXMgPSA4MTkyOwotCi0JCXdoaWxlIChzaXplX2J5dGVzKSB7Ci0JCQlpbnQgY3VyX3NpemUgPSBzaXplX2J5dGVzOwotCQkJaW50IHNyY194ID0gc3JjX2dwdV9hZGRyICYgMjU1OwotCQkJaW50IGRzdF94ID0gZHN0X2dwdV9hZGRyICYgMjU1OwotCQkJaW50IGggPSAxOwotCQkJc3JjX2dwdV9hZGRyID0gc3JjX2dwdV9hZGRyICYgfjI1NVVMTDsKLQkJCWRzdF9ncHVfYWRkciA9IGRzdF9ncHVfYWRkciAmIH4yNTVVTEw7Ci0KLQkJCWlmICghc3JjX3ggJiYgIWRzdF94KSB7Ci0JCQkJaCA9IChjdXJfc2l6ZSAvIG1heF9ieXRlcyk7Ci0JCQkJaWYgKGggPiA4MTkyKQotCQkJCQloID0gODE5MjsKLQkJCQlpZiAoaCA9PSAwKQotCQkJCQloID0gMTsKLQkJCQllbHNlCi0JCQkJCWN1cl9zaXplID0gbWF4X2J5dGVzOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3VyX3NpemUgPiBtYXhfYnl0ZXMpCi0JCQkJCWN1cl9zaXplID0gbWF4X2J5dGVzOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBkc3RfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIGRzdF94KTsKLQkJCQlpZiAoY3VyX3NpemUgPiAobWF4X2J5dGVzIC0gc3JjX3gpKQotCQkJCQljdXJfc2l6ZSA9IChtYXhfYnl0ZXMgLSBzcmNfeCk7Ci0JCQl9Ci0KLQkJCWlmICgocmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKyA0OCkgPiByZGV2LT5yNjAwX2JsaXQudmJfdG90YWwpIHsKLQkJCQlXQVJOX09OKDEpOwotCQkJfQotCi0JCQl2YlswXSA9IGkyZihkc3RfeCk7Ci0JCQl2YlsxXSA9IDA7Ci0JCQl2YlsyXSA9IGkyZihzcmNfeCk7Ci0JCQl2YlszXSA9IDA7Ci0KLQkJCXZiWzRdID0gaTJmKGRzdF94KTsKLQkJCXZiWzVdID0gaTJmKGgpOwotCQkJdmJbNl0gPSBpMmYoc3JjX3gpOwotCQkJdmJbN10gPSBpMmYoaCk7Ci0KLQkJCXZiWzhdID0gaTJmKGRzdF94ICsgY3VyX3NpemUpOwotCQkJdmJbOV0gPSBpMmYoaCk7Ci0JCQl2YlsxMF0gPSBpMmYoc3JjX3ggKyBjdXJfc2l6ZSk7Ci0JCQl2YlsxMV0gPSBpMmYoaCk7Ci0KLQkJCS8qIHNyYyAxMCAqLwotCQkJc2V0X3RleF9yZXNvdXJjZShyZGV2LCBGTVRfOCwKLQkJCQkJIHNyY194ICsgY3VyX3NpemUsIGgsIHNyY194ICsgY3VyX3NpemUsCi0JCQkJCSBzcmNfZ3B1X2FkZHIpOwotCi0JCQkvKiA1ICovCi0JCQljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCi0JCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIChzcmNfeCArIGN1cl9zaXplICogaCksIHNyY19ncHVfYWRkcik7Ci0KLQotCQkJLyogZHN0IDE3ICovCi0JCQlzZXRfcmVuZGVyX3RhcmdldChyZGV2LCBDT0xPUl84LAotCQkJCQkgIGRzdF94ICsgY3VyX3NpemUsIGgsCi0JCQkJCSAgZHN0X2dwdV9hZGRyKTsKLQotCQkJLyogc2Npc3NvcnMgMTIgKi8KLQkJCXNldF9zY2lzc29ycyhyZGV2LCBkc3RfeCwgMCwgZHN0X3ggKyBjdXJfc2l6ZSwgaCk7Ci0KLQkJCS8qIDE1ICovCi0JCQl2Yl9ncHVfYWRkciA9IHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+Z3B1X2FkZHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZDsKLQkJCXNldF92dHhfcmVzb3VyY2UocmRldiwgdmJfZ3B1X2FkZHIpOwotCi0JCQkvKiBkcmF3IDEwICovCi0JCQlkcmF3X2F1dG8ocmRldik7Ci0KLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfQ0JfQUNUSU9OX0VOQSB8IFBBQ0tFVDNfQ0IwX0RFU1RfQkFTRV9FTkEsCi0JCQkJCSAgICBjdXJfc2l6ZSAqIGgsIGRzdF9ncHVfYWRkcik7Ci0KLQkJCXZiICs9IDEyOwotCQkJcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKz0gMTIgKiA0OwotCi0JCQlzcmNfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJZHN0X2dwdV9hZGRyICs9IGN1cl9zaXplICogaDsKLQkJCXNpemVfYnl0ZXMgLT0gY3VyX3NpemUgKiBoOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWF4X2J5dGVzID0gODE5MiAqIDQ7Ci0KLQkJd2hpbGUgKHNpemVfYnl0ZXMpIHsKLQkJCWludCBjdXJfc2l6ZSA9IHNpemVfYnl0ZXM7Ci0JCQlpbnQgc3JjX3ggPSAoc3JjX2dwdV9hZGRyICYgMjU1KTsKLQkJCWludCBkc3RfeCA9IChkc3RfZ3B1X2FkZHIgJiAyNTUpOwotCQkJaW50IGggPSAxOwotCQkJc3JjX2dwdV9hZGRyID0gc3JjX2dwdV9hZGRyICYgfjI1NVVMTDsKLQkJCWRzdF9ncHVfYWRkciA9IGRzdF9ncHVfYWRkciAmIH4yNTVVTEw7Ci0KLQkJCWlmICghc3JjX3ggJiYgIWRzdF94KSB7Ci0JCQkJaCA9IChjdXJfc2l6ZSAvIG1heF9ieXRlcyk7Ci0JCQkJaWYgKGggPiA4MTkyKQotCQkJCQloID0gODE5MjsKLQkJCQlpZiAoaCA9PSAwKQotCQkJCQloID0gMTsKLQkJCQllbHNlCi0JCQkJCWN1cl9zaXplID0gbWF4X2J5dGVzOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3VyX3NpemUgPiBtYXhfYnl0ZXMpCi0JCQkJCWN1cl9zaXplID0gbWF4X2J5dGVzOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBkc3RfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIGRzdF94KTsKLQkJCQlpZiAoY3VyX3NpemUgPiAobWF4X2J5dGVzIC0gc3JjX3gpKQotCQkJCQljdXJfc2l6ZSA9IChtYXhfYnl0ZXMgLSBzcmNfeCk7Ci0JCQl9Ci0KLQkJCWlmICgocmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKyA0OCkgPiByZGV2LT5yNjAwX2JsaXQudmJfdG90YWwpIHsKLQkJCQlXQVJOX09OKDEpOwotCQkJfQotCi0JCQl2YlswXSA9IGkyZihkc3RfeCAvIDQpOwotCQkJdmJbMV0gPSAwOwotCQkJdmJbMl0gPSBpMmYoc3JjX3ggLyA0KTsKLQkJCXZiWzNdID0gMDsKLQotCQkJdmJbNF0gPSBpMmYoZHN0X3ggLyA0KTsKLQkJCXZiWzVdID0gaTJmKGgpOwotCQkJdmJbNl0gPSBpMmYoc3JjX3ggLyA0KTsKLQkJCXZiWzddID0gaTJmKGgpOwotCi0JCQl2Yls4XSA9IGkyZigoZHN0X3ggKyBjdXJfc2l6ZSkgLyA0KTsKLQkJCXZiWzldID0gaTJmKGgpOwotCQkJdmJbMTBdID0gaTJmKChzcmNfeCArIGN1cl9zaXplKSAvIDQpOwotCQkJdmJbMTFdID0gaTJmKGgpOwotCi0JCQkvKiBzcmMgMTAgKi8KLQkJCXNldF90ZXhfcmVzb3VyY2UocmRldiwgRk1UXzhfOF84XzgsCi0JCQkJCSAoc3JjX3ggKyBjdXJfc2l6ZSkgLyA0LAotCQkJCQkgaCwgKHNyY194ICsgY3VyX3NpemUpIC8gNCwKLQkJCQkJIHNyY19ncHVfYWRkcik7Ci0JCQkvKiA1ICovCi0JCQljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCi0JCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIChzcmNfeCArIGN1cl9zaXplICogaCksIHNyY19ncHVfYWRkcik7Ci0KLQkJCS8qIGRzdCAxNyAqLwotCQkJc2V0X3JlbmRlcl90YXJnZXQocmRldiwgQ09MT1JfOF84XzhfOCwKLQkJCQkJICAoZHN0X3ggKyBjdXJfc2l6ZSkgLyA0LCBoLAotCQkJCQkgIGRzdF9ncHVfYWRkcik7Ci0KLQkJCS8qIHNjaXNzb3JzIDEyICAqLwotCQkJc2V0X3NjaXNzb3JzKHJkZXYsIChkc3RfeCAvIDQpLCAwLCAoZHN0X3ggKyBjdXJfc2l6ZSAvIDQpLCBoKTsKLQotCQkJLyogVmVydGV4IGJ1ZmZlciBzZXR1cCAxNSAqLwotCQkJdmJfZ3B1X2FkZHIgPSByZGV2LT5yNjAwX2JsaXQudmJfaWItPmdwdV9hZGRyICsgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQ7Ci0JCQlzZXRfdnR4X3Jlc291cmNlKHJkZXYsIHZiX2dwdV9hZGRyKTsKLQotCQkJLyogZHJhdyAxMCAqLwotCQkJZHJhd19hdXRvKHJkZXYpOwotCi0JCQkvKiA1ICovCi0JCQljcF9zZXRfc3VyZmFjZV9zeW5jKHJkZXYsCi0JCQkJCSAgICBQQUNLRVQzX0NCX0FDVElPTl9FTkEgfCBQQUNLRVQzX0NCMF9ERVNUX0JBU0VfRU5BLAotCQkJCQkgICAgY3VyX3NpemUgKiBoLCBkc3RfZ3B1X2FkZHIpOwotCi0JCQkvKiA3NCByaW5nIGR3b3JkcyBwZXIgbG9vcCAqLwotCQkJdmIgKz0gMTI7Ci0JCQlyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArPSAxMiAqIDQ7Ci0KLQkJCXNyY19ncHVfYWRkciArPSBjdXJfc2l6ZSAqIGg7Ci0JCQlkc3RfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJc2l6ZV9ieXRlcyAtPSBjdXJfc2l6ZSAqIGg7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2NzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9jcy5jCmluZGV4IGExMzQ3OTAuLjdmZGZhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYwpAQCAtMTIyLDEyICsxMjIsNiBAQAogCXRyYWNrLT5kYl9zX3dyaXRlX2JvID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZXZlcmdyZWVuX2NzX3RyYWNrX3ZhbGlkYXRlX2NiKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgaSkKLXsKLQkvKiBYWFggZmlsbCBpbiAqLwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGV2ZXJncmVlbl9jc190cmFja19jaGVjayhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCkKIHsKIAlzdHJ1Y3QgZXZlcmdyZWVuX2NzX3RyYWNrICp0cmFjayA9IHAtPnRyYWNrOwpAQCAtMjM2LDI4ICsyMzAsNiBAQAogfQogCiAvKioKLSAqIGV2ZXJncmVlbl9jc19wYWNrZXRfbmV4dF9pc19wa3QzX25vcCgpIC0gdGVzdCBpZiBuZXh0IHBhY2tldCBpcyBwYWNrZXQzIG5vcCBmb3IgcmVsb2MKLSAqIEBwYXJzZXI6CQlwYXJzZXIgc3RydWN0dXJlIGhvbGRpbmcgcGFyc2luZyBjb250ZXh0LgotICoKLSAqIENoZWNrIG5leHQgcGFja2V0IGlzIHJlbG9jYXRpb24gcGFja2V0MywgZG8gYm8gdmFsaWRhdGlvbiBhbmQgY29tcHV0ZQotICogR1BVIG9mZnNldCB1c2luZyB0aGUgcHJvdmlkZWQgc3RhcnQuCi0gKiovCi1zdGF0aWMgaW5saW5lIGludCBldmVyZ3JlZW5fY3NfcGFja2V0X25leHRfaXNfcGt0M19ub3Aoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnApCi17Ci0Jc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgcDNyZWxvYzsKLQlpbnQgcjsKLQotCXIgPSBldmVyZ3JlZW5fY3NfcGFja2V0X3BhcnNlKHAsICZwM3JlbG9jLCBwLT5pZHgpOwotCWlmIChyKSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocDNyZWxvYy50eXBlICE9IFBBQ0tFVF9UWVBFMyB8fCBwM3JlbG9jLm9wY29kZSAhPSBQQUNLRVQzX05PUCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgogICogZXZlcmdyZWVuX2NzX3BhY2tldF9uZXh0X3ZsaW5lKCkgLSBwYXJzZSB1c2Vyc3BhY2UgVkxJTkUgcGFja2V0CiAgKiBAcGFyc2VyOgkJcGFyc2VyIHN0cnVjdHVyZSBob2xkaW5nIHBhcnNpbmcgY29udGV4dC4KICAqCkBAIC00MTQsNyArMzg2LDcgQEAKICAqIGlmIHJlZ2lzdGVyIGlzIHNhZmUuIElmIHJlZ2lzdGVyIGlzIG5vdCBmbGFnIGFzIHNhZmUgdGhpcyBmdW5jdGlvbgogICogd2lsbCB0ZXN0IGl0IGFnYWluc3QgYSBsaXN0IG9mIHJlZ2lzdGVyIG5lZWRpbmQgc3BlY2lhbCBoYW5kbGluZy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZXZlcmdyZWVuX2NzX2NoZWNrX3JlZyhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgdTMyIHJlZywgdTMyIGlkeCkKK3N0YXRpYyBpbnQgZXZlcmdyZWVuX2NzX2NoZWNrX3JlZyhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgdTMyIHJlZywgdTMyIGlkeCkKIHsKIAlzdHJ1Y3QgZXZlcmdyZWVuX2NzX3RyYWNrICp0cmFjayA9IChzdHJ1Y3QgZXZlcmdyZWVuX2NzX3RyYWNrICopcC0+dHJhY2s7CiAJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7CkBAIC05OTAsNyArOTYyLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGF0IHRoZSByZXNvdXJjZSBoYXMgdmFsaWQgZmllbGQgYW5kIHRoYXQKICAqIHRoZSB0ZXh0dXJlIGFuZCBtaXBtYXAgYm8gb2JqZWN0IGFyZSBiaWcgZW5vdWdoIHRvIGNvdmVyIHRoaXMgcmVzb3VyY2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGV2ZXJncmVlbl9jaGVja190ZXh0dXJlX3Jlc291cmNlKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCAgdTMyIGlkeCwKK3N0YXRpYyBpbnQgZXZlcmdyZWVuX2NoZWNrX3RleHR1cmVfcmVzb3VyY2Uoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsICB1MzIgaWR4LAogCQkJCQkJICAgc3RydWN0IHJhZGVvbl9ibyAqdGV4dHVyZSwKIAkJCQkJCSAgIHN0cnVjdCByYWRlb25fYm8gKm1pcG1hcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKaW5kZXggNzM2M2Q5ZC4uYjkzN2M0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmgKQEAgLTk0MSwxMSArOTQxLDE1IEBACiAjZGVmaW5lCUNCX0NPTE9SMF9TTElDRQkJCQkJMHgyOGM2OAogI2RlZmluZQlDQl9DT0xPUjBfVklFVwkJCQkJMHgyOGM2YwogI2RlZmluZQlDQl9DT0xPUjBfSU5GTwkJCQkJMHgyOGM3MAorIwlkZWZpbmUgQ0JfRk9STUFUKHgpCQkJCSgoeCkgPDwgMikKICMgICAgICAgZGVmaW5lIENCX0FSUkFZX01PREUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA8PCA4KQogIyAgICAgICBkZWZpbmUgQVJSQVlfTElORUFSX0dFTkVSQUwgICAgICAgICAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBBUlJBWV9MSU5FQVJfQUxJR05FRCAgICAgICAgICAgICAgICAgICAgIDEKICMgICAgICAgZGVmaW5lIEFSUkFZXzFEX1RJTEVEX1RISU4xICAgICAgICAgICAgICAgICAgICAgMgogIyAgICAgICBkZWZpbmUgQVJSQVlfMkRfVElMRURfVEhJTjEgICAgICAgICAgICAgICAgICAgICA0CisjCWRlZmluZSBDQl9TT1VSQ0VfRk9STUFUKHgpCQkJKCh4KSA8PCAyNCkKKyMJZGVmaW5lIENCX1NGX0VYUE9SVF9GVUxMCQkJMAorIwlkZWZpbmUgQ0JfU0ZfRVhQT1JUX05PUk0JCQkxCiAjZGVmaW5lCUNCX0NPTE9SMF9BVFRSSUIJCQkJMHgyOGM3NAogI2RlZmluZQlDQl9DT0xPUjBfRElNCQkJCQkweDI4Yzc4CiAvKiBvbmx5IENCMC03IGJsb2NrcyBoYXZlIHRoZXNlIHJlZ3MgKi8KQEAgLTExMDcsMTUgKzExMTEsNTMgQEAKICNkZWZpbmUJQ0JfQ09MT1I3X0NMRUFSX1dPUkQzCQkJCTB4MjhlM2MKIAogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDBfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAwCisjCWRlZmluZSBURVhfRElNKHgpCQkJCSgoeCkgPDwgMCkKKyMJZGVmaW5lIFNRX1RFWF9ESU1fMUQJCQkJMAorIwlkZWZpbmUgU1FfVEVYX0RJTV8yRAkJCQkxCisjCWRlZmluZSBTUV9URVhfRElNXzNECQkJCTIKKyMJZGVmaW5lIFNRX1RFWF9ESU1fQ1VCRU1BUAkJCTMKKyMJZGVmaW5lIFNRX1RFWF9ESU1fMURfQVJSQVkJCQk0CisjCWRlZmluZSBTUV9URVhfRElNXzJEX0FSUkFZCQkJNQorIwlkZWZpbmUgU1FfVEVYX0RJTV8yRF9NU0FBCQkJNgorIwlkZWZpbmUgU1FfVEVYX0RJTV8yRF9BUlJBWV9NU0FBCQkJNwogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDFfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDA0CiAjICAgICAgIGRlZmluZSBURVhfQVJSQVlfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMjgpCiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JEMl8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDgKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQzXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwQwogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDRfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDEwCisjCWRlZmluZSBURVhfRFNUX1NFTF9YKHgpCQkJCSgoeCkgPDwgMTYpCisjCWRlZmluZSBURVhfRFNUX1NFTF9ZKHgpCQkJCSgoeCkgPDwgMTkpCisjCWRlZmluZSBURVhfRFNUX1NFTF9aKHgpCQkJCSgoeCkgPDwgMjIpCisjCWRlZmluZSBURVhfRFNUX1NFTF9XKHgpCQkJCSgoeCkgPDwgMjUpCisjCWRlZmluZSBTUV9TRUxfWAkJCQkJMAorIwlkZWZpbmUgU1FfU0VMX1kJCQkJCTEKKyMJZGVmaW5lIFNRX1NFTF9aCQkJCQkyCisjCWRlZmluZSBTUV9TRUxfVwkJCQkJMworIwlkZWZpbmUgU1FfU0VMXzAJCQkJCTQKKyMJZGVmaW5lIFNRX1NFTF8xCQkJCQk1CiAjZGVmaW5lIFNRX1RFWF9SRVNPVVJDRV9XT1JENV8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMTQKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQ2XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxOAogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDdfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDFjCiAKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQwXzAJCQkJMHgzMDAwMAorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDFfMAkJCQkweDMwMDA0CisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEMl8wCQkJCTB4MzAwMDgKKyMJZGVmaW5lIFNRX1ZUWENfQkFTRV9BRERSX0hJKHgpCQkJKCh4KSA8PCAwKQorIwlkZWZpbmUgU1FfVlRYQ19TVFJJREUoeCkJCQkoKHgpIDw8IDgpCisjCWRlZmluZSBTUV9WVFhDX0VORElBTl9TV0FQKHgpCQkJKCh4KSA8PCAzMCkKKyMJZGVmaW5lIFNRX0VORElBTl9OT05FCQkJCTAKKyMJZGVmaW5lIFNRX0VORElBTl84SU4xNgkJCQkxCisjCWRlZmluZSBTUV9FTkRJQU5fOElOMzIJCQkJMgorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDNfMAkJCQkweDMwMDBDCisjCWRlZmluZSBTUV9WVENYX1NFTF9YKHgpCQkJCSgoeCkgPDwgMykKKyMJZGVmaW5lIFNRX1ZUQ1hfU0VMX1koeCkJCQkJKCh4KSA8PCA2KQorIwlkZWZpbmUgU1FfVlRDWF9TRUxfWih4KQkJCQkoKHgpIDw8IDkpCisjCWRlZmluZSBTUV9WVENYX1NFTF9XKHgpCQkJCSgoeCkgPDwgMTIpCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JENF8wCQkJCTB4MzAwMTAKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQ1XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxNAorI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDZfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDE4CisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEN18wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMWMKKwogLyogY2F5bWFuIDNEIHJlZ3MgKi8KICNkZWZpbmUgQ0FZTUFOX1ZHVF9PRkZDSElQX0xEU19CQVNFCQkJMHg4OUIwCiAjZGVmaW5lIENBWU1BTl9EQl9FUUFBCQkJCQkweDI4ODA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKaW5kZXggOGM3OWNhOS4uMGU1Nzk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJyYWRlb25fYXNpYy5oIgpAQCAtNDAsNiArNDEsNyBAQAogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX2lycV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgZXZlcmdyZWVuX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX2ZpeF9wY2lfbWF4X3JlYWRfcmVxX3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAjZGVmaW5lIEVWRVJHUkVFTl9QRlBfVUNPREVfU0laRSAxMTIwCiAjZGVmaW5lIEVWRVJHUkVFTl9QTTRfVUNPREVfU0laRSAxMzc2CkBAIC0yNjAsOCArMjYyLDExIEBACiAJCVdSRUczMihNQ19TRVFfU1VQX0NOVEwsIDB4MDAwMDAwMDEpOwogCiAJCS8qIHdhaXQgZm9yIHRyYWluaW5nIHRvIGNvbXBsZXRlICovCi0JCXdoaWxlICghKFJSRUczMihNQ19JT19QQURfQ05UTF9EMCkgJiBNRU1fRkFMTF9PVVRfQ01EKSkKLQkJCXVkZWxheSgxMCk7CisJCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQkJaWYgKFJSRUczMihNQ19JT19QQURfQ05UTF9EMCkgJiBNRU1fRkFMTF9PVVRfQ01EKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEpOworCQl9CiAKIAkJaWYgKHJ1bm5pbmcpCiAJCQlXUkVHMzIoTUNfU0hBUkVEX0JMQUNLT1VUX0NOVEwsIGJsYWNrb3V0KTsKQEAgLTkzMSw3ICs5MzYsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTk2NywxNCArOTcyLDE1IEBACiAJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIDApOwogCiAJY2F5bWFuX3BjaWVfZ2FydF90bGJfZmx1c2gocmRldik7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0gZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKHJkZXYtPm1jLmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBjYXltYW5fcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JaW50IHI7Ci0KIAkvKiBEaXNhYmxlIGFsbCB0YWJsZXMgKi8KIAlXUkVHMzIoVk1fQ09OVEVYVDBfQ05UTCwgMCk7CiAJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIDApOwpAQCAtOTkwLDE0ICs5OTYsNyBAQAogCVdSRUczMihWTV9MMl9DTlRMMiwgMCk7CiAJV1JFRzMyKFZNX0wyX0NOVEwzLCBMMl9DQUNIRV9CSUdLX0FTU09DSUFUSVZJVFkgfAogCSAgICAgICBMMl9DQUNIRV9CSUdLX0ZSQUdNRU5UX1NJWkUoNikpOwotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaikgewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosIGZhbHNlKTsKLQkJaWYgKGxpa2VseShyID09IDApKSB7Ci0JCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJfQotCX0KKwlyYWRlb25fZ2FydF90YWJsZV92cmFtX3VucGluKHJkZXYpOwogfQogCiB2b2lkIGNheW1hbl9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTEzNDEsNiArMTM0MCw5IEBACiB7CiAJaW50IHI7CiAKKwkvKiBlbmFibGUgcGNpZSBnZW4yIGxpbmsgKi8KKwlldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShyZGV2KTsKKwogCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3IHx8ICFyZGV2LT5tY19mdykgewogCQlyID0gbmlfaW5pdF9taWNyb2NvZGUocmRldik7CiAJCWlmIChyKSB7CkBAIC0xMzU0LDYgKzEzNTYsMTAgQEAKIAkJcmV0dXJuIHI7CiAJfQogCisJciA9IHI2MDBfdnJhbV9zY3JhdGNoX2luaXQocmRldik7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJZXZlcmdyZWVuX21jX3Byb2dyYW0ocmRldik7CiAJciA9IGNheW1hbl9wY2llX2dhcnRfZW5hYmxlKHJkZXYpOwogCWlmIChyKQpAQCAtMTM2Miw3ICsxMzY4LDcgQEAKIAogCXIgPSBldmVyZ3JlZW5fYmxpdF9pbml0KHJkZXYpOwogCWlmIChyKSB7Ci0JCWV2ZXJncmVlbl9ibGl0X2ZpbmkocmRldik7CisJCXI2MDBfYmxpdF9maW5pKHJkZXYpOwogCQlyZGV2LT5hc2ljLT5jb3B5ID0gTlVMTDsKIAkJZGV2X3dhcm4ocmRldi0+ZGV2LCAiZmFpbGVkIGJsaXR0ZXIgKCVkKSBmYWxsaW5nIGJhY2sgdG8gbWVtY3B5XG4iLCByKTsKIAl9CkBAIC0xNDIzLDIxICsxNDI5LDEzIEBACiAKIGludCBjYXltYW5fc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgcjsKLQogCS8qIEZJWE1FOiB3ZSBzaG91bGQgd2FpdCBmb3IgcmluZyB0byBiZSBlbXB0eSAqLwogCWNheW1hbl9jcF9lbmFibGUocmRldiwgZmFsc2UpOwogCXJkZXYtPmNwLnJlYWR5ID0gZmFsc2U7CiAJZXZlcmdyZWVuX2lycV9zdXNwZW5kKHJkZXYpOwogCXJhZGVvbl93Yl9kaXNhYmxlKHJkZXYpOwogCWNheW1hbl9wY2llX2dhcnRfZGlzYWJsZShyZGV2KTsKLQotCS8qIHVucGluIHNoYWRlcnMgYm8gKi8KLQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKLQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci0JfQorCXI2MDBfYmxpdF9zdXNwZW5kKHJkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTUwLDEzICsxNTQ4LDE0IEBACiAKIHZvaWQgY2F5bWFuX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JZXZlcmdyZWVuX2JsaXRfZmluaShyZGV2KTsKKwlyNjAwX2JsaXRfZmluaShyZGV2KTsKIAljYXltYW5fY3BfZmluaShyZGV2KTsKIAlyNjAwX2lycV9maW5pKHJkZXYpOwogCXJhZGVvbl93Yl9maW5pKHJkZXYpOwogCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAljYXltYW5fcGNpZV9nYXJ0X2ZpbmkocmRldik7CisJcjYwMF92cmFtX3NjcmF0Y2hfZmluaShyZGV2KTsKIAlyYWRlb25fZ2VtX2ZpbmkocmRldik7CiAJcmFkZW9uX2ZlbmNlX2RyaXZlcl9maW5pKHJkZXYpOwogCXJhZGVvbl9ib19maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYwppbmRleCA3ZmNkYmJiLi5hZDE1OGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYwpAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInIxMDBfcmVnX3NhZmUuaCIKICNpbmNsdWRlICJybjUwX3JlZ19zYWZlLmgiCkBAIC02OCw2ICs2OSwxMDggQEAKICAqIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MAogICovCiAKK2ludCByMTAwX3JlbG9jX3BpdGNoX29mZnNldChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKKwkJCSAgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAorCQkJICAgIHVuc2lnbmVkIGlkeCwKKwkJCSAgICB1bnNpZ25lZCByZWcpCit7CisJaW50IHI7CisJdTMyIHRpbGVfZmxhZ3MgPSAwOworCXUzMiB0bXA7CisJc3RydWN0IHJhZGVvbl9jc19yZWxvYyAqcmVsb2M7CisJdTMyIHZhbHVlOworCisJciA9IHIxMDBfY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKKwlpZiAocikgeworCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBpYlslZF09MHglMDRYXG4iLAorCQkJICBpZHgsIHJlZyk7CisJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJcmV0dXJuIHI7CisJfQorCXZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOworCXRtcCA9IHZhbHVlICYgMHgwMDNmZmZmZjsKKwl0bXAgKz0gKCgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpID4+IDEwKTsKKworCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQorCQl0aWxlX2ZsYWdzIHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykgeworCQlpZiAocmVnID09IFJBREVPTl9TUkNfUElUQ0hfT0ZGU0VUKSB7CisJCQlEUk1fRVJST1IoIkNhbm5vdCBzcmMgYmxpdCBmcm9tIG1pY3JvdGlsZWQgc3VyZmFjZVxuIik7CisJCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0aWxlX2ZsYWdzIHw9IFJBREVPTl9EU1RfVElMRV9NSUNSTzsKKwl9CisKKwl0bXAgfD0gdGlsZV9mbGFnczsKKwlwLT5pYi0+cHRyW2lkeF0gPSAodmFsdWUgJiAweDNmYzAwMDAwKSB8IHRtcDsKKwlyZXR1cm4gMDsKK30KKworaW50IHIxMDBfcGFja2V0M19sb2FkX3ZicG50cihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKKwkJCSAgICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKKwkJCSAgICAgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBjLCBpOworCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOworCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKKwlpbnQgciA9IDA7CisJdm9sYXRpbGUgdWludDMyX3QgKmliOworCXUzMiBpZHhfdmFsdWU7CisKKwlpYiA9IHAtPmliLT5wdHI7CisJdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKKwljID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrKykgJiAweDFGOworCWlmIChjID4gMTYpIHsKKwkgICAgRFJNX0VSUk9SKCJPbmx5IDE2IHZlcnRleCBidWZmZXJzIGFyZSBhbGxvd2VkICVkXG4iLAorCQkgICAgICBwa3QtPm9wY29kZSk7CisJICAgIHIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKKwlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSs9MiwgaWR4Kz0zKSB7CisJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAorCQkJCSAgcGt0LT5vcGNvZGUpOworCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJaWR4X3ZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOworCQlpYltpZHgrMV0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7CisKKwkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpZHhfdmFsdWUgPj4gODsKKwkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5lc2l6ZSAmPSAweDdGOworCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOworCQlpZiAocikgeworCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKKwkJCQkgIHBrdC0+b3Bjb2RlKTsKKwkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJCXJldHVybiByOworCQl9CisJCWliW2lkeCsyXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMikgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKKwkJdHJhY2stPmFycmF5c1tpICsgMV0ucm9iaiA9IHJlbG9jLT5yb2JqOworCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSA9IGlkeF92YWx1ZSA+PiAyNDsKKwkJdHJhY2stPmFycmF5c1tpICsgMV0uZXNpemUgJj0gMHg3RjsKKwl9CisJaWYgKGMgJiAxKSB7CisJCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7CisJCWlmIChyKSB7CisJCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAorCQkJCQkgIHBrdC0+b3Bjb2RlKTsKKwkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKKwkJCXJldHVybiByOworCQl9CisJCWlkeF92YWx1ZSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKKwkJaWJbaWR4KzFdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOworCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5yb2JqID0gcmVsb2MtPnJvYmo7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplID0gaWR4X3ZhbHVlID4+IDg7CisJCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplICY9IDB4N0Y7CisJfQorCXJldHVybiByOworfQorCiB2b2lkIHIxMDBfcHJlX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCiB7CiAJLyogZW5hYmxlIHRoZSBwZmxpcCBpbnQgKi8KQEAgLTQzNCw2ICs1MzcsNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KKwkJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAJfQogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkKQogCQlyMTAwX2lycV9zZXQocmRldik7CkBAIC00NzQsNyArNTc4LDcgQEAKIHsKIAlpbnQgcjsKIAotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHIpIHsKKwlpZiAocmRldi0+Z2FydC5wdHIpIHsKIAkJV0FSTigxLCAiUjEwMCBQQ0kgR0FSVCBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTEzLDYgKzYxNyw5IEBACiAJdG1wID0gUlJFRzMyKFJBREVPTl9BSUNfQ05UTCkgfCBSQURFT05fUENJR0FSVF9UUkFOU0xBVEVfRU47CiAJV1JFRzMyKFJBREVPTl9BSUNfQ05UTCwgdG1wKTsKIAlyMTAwX3BjaV9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtNTMwLDEwICs2MzcsMTIgQEAKIAogaW50IHIxMDBfcGNpX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKQogeworCXUzMiAqZ3R0ID0gcmRldi0+Z2FydC5wdHI7CisKIAlpZiAoaSA8IDAgfHwgaSA+IHJkZXYtPmdhcnQubnVtX2dwdV9wYWdlcykgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmRldi0+Z2FydC50YWJsZS5yYW0ucHRyW2ldID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhhZGRyKSk7CisJZ3R0W2ldID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhhZGRyKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4OCw3ICs2OTcsNyBAQAogCVdSRUczMihSXzAwMDA0NF9HRU5fSU5UX1NUQVRVUywgdG1wKTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCByMTAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdWludDMyX3QgcjEwMF9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IGlycXMgPSBSUkVHMzIoUkFERU9OX0dFTl9JTlRfU1RBVFVTKTsKIAl1aW50MzJfdCBpcnFfbWFzayA9IFJBREVPTl9TV19JTlRfVEVTVCB8CkBAIC0zMTQ3LDcgKzMyNTYsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHIxMDBfY3NfdHJhY2tfdGV4dHVyZV9wcmludChzdHJ1Y3QgcjEwMF9jc190cmFja190ZXh0dXJlICp0KQorc3RhdGljIHZvaWQgcjEwMF9jc190cmFja190ZXh0dXJlX3ByaW50KHN0cnVjdCByMTAwX2NzX3RyYWNrX3RleHR1cmUgKnQpCiB7CiAJRFJNX0VSUk9SKCJwaXRjaCAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwgdC0+cGl0Y2gpOwogCURSTV9FUlJPUigidXNlX3BpdGNoICAgICAgICAgICAgICAgICAgJWRcbiIsIHQtPnVzZV9waXRjaCk7CkBAIC0zOTY1LDMgKzQwNzQsNDMgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKK3VpbnQzMl90IHIxMDBfbW1fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKQoreworCWlmIChyZWcgPCByZGV2LT5ybW1pb19zaXplKQorCQlyZXR1cm4gcmVhZGwoKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyByZWcpOworCWVsc2UgeworCQl3cml0ZWwocmVnLCAoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIFJBREVPTl9NTV9JTkRFWCk7CisJCXJldHVybiByZWFkbCgoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIFJBREVPTl9NTV9EQVRBKTsKKwl9Cit9CisKK3ZvaWQgcjEwMF9tbV93cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpCit7CisJaWYgKHJlZyA8IHJkZXYtPnJtbWlvX3NpemUpCisJCXdyaXRlbCh2LCAoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIHJlZyk7CisJZWxzZSB7CisJCXdyaXRlbChyZWcsICgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgUkFERU9OX01NX0lOREVYKTsKKwkJd3JpdGVsKHYsICgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgUkFERU9OX01NX0RBVEEpOworCX0KK30KKwordTMyIHIxMDBfaW9fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZykKK3sKKwlpZiAocmVnIDwgcmRldi0+cmlvX21lbV9zaXplKQorCQlyZXR1cm4gaW9yZWFkMzIocmRldi0+cmlvX21lbSArIHJlZyk7CisJZWxzZSB7CisJCWlvd3JpdGUzMihyZWcsIHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fSU5ERVgpOworCQlyZXR1cm4gaW9yZWFkMzIocmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9EQVRBKTsKKwl9Cit9CisKK3ZvaWQgcjEwMF9pb193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnLCB1MzIgdikKK3sKKwlpZiAocmVnIDwgcmRldi0+cmlvX21lbV9zaXplKQorCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIHJlZyk7CisJZWxzZSB7CisJCWlvd3JpdGUzMihyZWcsIHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fSU5ERVgpOworCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9EQVRBKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBfdHJhY2suaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCmluZGV4IDY4NmY5ZGMuLjZhNjAzYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMF90cmFjay5oCkBAIC05MiwxMDYgKzkyLDEwIEBACiAJCSAgICAgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAogCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCByZWcpOwogCi0KLQotc3RhdGljIGlubGluZSBpbnQgcjEwMF9yZWxvY19waXRjaF9vZmZzZXQoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsCi0JCQkJCSAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKLQkJCQkJICB1bnNpZ25lZCBpZHgsCi0JCQkJCSAgdW5zaWduZWQgcmVnKQotewotCWludCByOwotCXUzMiB0aWxlX2ZsYWdzID0gMDsKLQl1MzIgdG1wOwotCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwotCXUzMiB2YWx1ZTsKLQotCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JaWYgKHIpIHsKLQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgaWJbJWRdPTB4JTA0WFxuIiwKLQkJCSAgaWR4LCByZWcpOwotCQlyMTAwX2NzX2R1bXBfcGFja2V0KHAsIHBrdCk7Ci0JCXJldHVybiByOwotCX0KLQl2YWx1ZSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKLQl0bXAgPSB2YWx1ZSAmIDB4MDAzZmZmZmY7Ci0JdG1wICs9ICgoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KSA+PiAxMCk7Ci0KLQlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykKLQkJdGlsZV9mbGFncyB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87Ci0JaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUlDUk8pIHsKLQkJaWYgKHJlZyA9PSBSQURFT05fU1JDX1BJVENIX09GRlNFVCkgewotCQkJRFJNX0VSUk9SKCJDYW5ub3Qgc3JjIGJsaXQgZnJvbSBtaWNyb3RpbGVkIHN1cmZhY2VcbiIpOwotCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJdGlsZV9mbGFncyB8PSBSQURFT05fRFNUX1RJTEVfTUlDUk87Ci0JfQotCi0JdG1wIHw9IHRpbGVfZmxhZ3M7Ci0JcC0+aWItPnB0cltpZHhdID0gKHZhbHVlICYgMHgzZmMwMDAwMCkgfCB0bXA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHIxMDBfcGFja2V0M19sb2FkX3ZicG50cihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwKLQkJCQkJICAgc3RydWN0IHJhZGVvbl9jc19wYWNrZXQgKnBrdCwKLQkJCQkJICAgaW50IGlkeCkKLXsKLQl1bnNpZ25lZCBjLCBpOwotCXN0cnVjdCByYWRlb25fY3NfcmVsb2MgKnJlbG9jOwotCXN0cnVjdCByMTAwX2NzX3RyYWNrICp0cmFjazsKLQlpbnQgciA9IDA7Ci0Jdm9sYXRpbGUgdWludDMyX3QgKmliOwotCXUzMiBpZHhfdmFsdWU7Ci0KLQlpYiA9IHAtPmliLT5wdHI7Ci0JdHJhY2sgPSAoc3RydWN0IHIxMDBfY3NfdHJhY2sgKilwLT50cmFjazsKLQljID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgrKykgJiAweDFGOwotCWlmIChjID4gMTYpIHsKLQkgICAgRFJNX0VSUk9SKCJPbmx5IDE2IHZlcnRleCBidWZmZXJzIGFyZSBhbGxvd2VkICVkXG4iLAotCQkgICAgICBwa3QtPm9wY29kZSk7Ci0JICAgIHIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkgICAgcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRyYWNrLT5udW1fYXJyYXlzID0gYzsKLQlmb3IgKGkgPSAwOyBpIDwgKGMgLSAxKTsgaSs9MiwgaWR4Kz0zKSB7Ci0JCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAotCQkJCSAgcGt0LT5vcGNvZGUpOwotCQkJcjEwMF9jc19kdW1wX3BhY2tldChwLCBwa3QpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJaWR4X3ZhbHVlID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHgpOwotCQlpYltpZHgrMV0gPSByYWRlb25fZ2V0X2liX3ZhbHVlKHAsIGlkeCArIDEpICsgKCh1MzIpcmVsb2MtPmxvYmouZ3B1X29mZnNldCk7Ci0KLQkJdHJhY2stPmFycmF5c1tpICsgMF0uZXNpemUgPSBpZHhfdmFsdWUgPj4gODsKLQkJdHJhY2stPmFycmF5c1tpICsgMF0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5lc2l6ZSAmPSAweDdGOwotCQlyID0gcjEwMF9jc19wYWNrZXRfbmV4dF9yZWxvYyhwLCAmcmVsb2MpOwotCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJObyByZWxvYyBmb3IgcGFja2V0MyAlZFxuIiwKLQkJCQkgIHBrdC0+b3Bjb2RlKTsKLQkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkJCXJldHVybiByOwotCQl9Ci0JCWliW2lkeCsyXSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4ICsgMikgKyAoKHUzMilyZWxvYy0+bG9iai5ncHVfb2Zmc2V0KTsKLQkJdHJhY2stPmFycmF5c1tpICsgMV0ucm9iaiA9IHJlbG9jLT5yb2JqOwotCQl0cmFjay0+YXJyYXlzW2kgKyAxXS5lc2l6ZSA9IGlkeF92YWx1ZSA+PiAyNDsKLQkJdHJhY2stPmFycmF5c1tpICsgMV0uZXNpemUgJj0gMHg3RjsKLQl9Ci0JaWYgKGMgJiAxKSB7Ci0JCXIgPSByMTAwX2NzX3BhY2tldF9uZXh0X3JlbG9jKHAsICZyZWxvYyk7Ci0JCWlmIChyKSB7Ci0JCQlEUk1fRVJST1IoIk5vIHJlbG9jIGZvciBwYWNrZXQzICVkXG4iLAotCQkJCQkgIHBrdC0+b3Bjb2RlKTsKLQkJCXIxMDBfY3NfZHVtcF9wYWNrZXQocCwgcGt0KTsKLQkJCXJldHVybiByOwotCQl9Ci0JCWlkeF92YWx1ZSA9IHJhZGVvbl9nZXRfaWJfdmFsdWUocCwgaWR4KTsKLQkJaWJbaWR4KzFdID0gcmFkZW9uX2dldF9pYl92YWx1ZShwLCBpZHggKyAxKSArICgodTMyKXJlbG9jLT5sb2JqLmdwdV9vZmZzZXQpOwotCQl0cmFjay0+YXJyYXlzW2kgKyAwXS5yb2JqID0gcmVsb2MtPnJvYmo7Ci0JCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplID0gaWR4X3ZhbHVlID4+IDg7Ci0JCXRyYWNrLT5hcnJheXNbaSArIDBdLmVzaXplICY9IDB4N0Y7Ci0JfQotCXJldHVybiByOwotfQoraW50IHIxMDBfcmVsb2NfcGl0Y2hfb2Zmc2V0KHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAorCQkJICAgIHN0cnVjdCByYWRlb25fY3NfcGFja2V0ICpwa3QsCisJCQkgICAgdW5zaWduZWQgaWR4LAorCQkJICAgIHVuc2lnbmVkIHJlZyk7CitpbnQgcjEwMF9wYWNrZXQzX2xvYWRfdmJwbnRyKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLAorCQkJICAgICBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCAqcGt0LAorCQkJICAgICBpbnQgaWR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKaW5kZXggNTVhN2YxOS4uNDAwYjI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogaW50IHJ2MzcwX3BjaWVfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpCiB7Ci0Jdm9pZCBfX2lvbWVtICpwdHIgPSAodm9pZCAqKXJkZXYtPmdhcnQudGFibGUudnJhbS5wdHI7CisJdm9pZCBfX2lvbWVtICpwdHIgPSByZGV2LT5nYXJ0LnB0cjsKIAogCWlmIChpIDwgMCB8fCBpID4gcmRldi0+Z2FydC5udW1fZ3B1X3BhZ2VzKSB7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTMsNyArOTMsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaikgewogCQlXQVJOKDEsICJSVjM3MCBQQ0lFIEdBUlQgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTExNiw3ICsxMTYsNyBAQAogCXVpbnQzMl90IHRtcDsKIAlpbnQgcjsKIAotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiA9PSBOVUxMKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaiA9PSBOVUxMKSB7CiAJCWRldl9lcnIocmRldi0+ZGV2LCAiTm8gVlJBTSBvYmplY3QgZm9yIFBDSUUgR0FSVC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNDQsOCArMTQ0LDkgQEAKIAl0bXAgfD0gUkFERU9OX1BDSUVfVFhfR0FSVF9VTk1BUFBFRF9BQ0NFU1NfRElTQ0FSRDsKIAlXUkVHMzJfUENJRShSQURFT05fUENJRV9UWF9HQVJUX0NOVEwsIHRtcCk7CiAJcnYzNzBfcGNpZV9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKLQlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwOFgpLlxuIiwKLQkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLCB0YWJsZV9hZGRyKTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyl0YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1Myw3ICsxNTQsNiBAQAogdm9pZCBydjM3MF9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwotCWludCByOwogCiAJV1JFRzMyX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9TVEFSVF9MTywgMCk7CiAJV1JFRzMyX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9FTkRfTE8sIDApOwpAQCAtMTYyLDE0ICsxNjIsNyBAQAogCXRtcCA9IFJSRUczMl9QQ0lFKFJBREVPTl9QQ0lFX1RYX0dBUlRfQ05UTCk7CiAJdG1wIHw9IFJBREVPTl9QQ0lFX1RYX0dBUlRfVU5NQVBQRURfQUNDRVNTX0RJU0NBUkQ7CiAJV1JFRzMyX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9DTlRMLCB0bXAgJiB+UkFERU9OX1BDSUVfVFhfR0FSVF9FTik7Ci0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7Ci0JCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwgZmFsc2UpOwotCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQl9Ci0JfQorCXJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4ocmRldik7CiB9CiAKIHZvaWQgcnYzNzBfcGNpZV9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBfY21kYnVmLmMKaW5kZXggYzVjMjc0Mi4uMWZlOThiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwX2NtZGJ1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMF9jbWRidWYuYwpAQCAtNzkxLDcgKzc5MSw3IEBACiAvKioKICAqIEVtaXQgdGhlIHNlcXVlbmNlIHRvIHBhY2lmeSBSMzAwLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHIzMDBfcGFjaWZ5KGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHIzMDBfcGFjaWZ5KGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKIHsKIAl1aW50MzJfdCBjYWNoZV96LCBjYWNoZV8zZCwgY2FjaGVfMmQ7CiAJUklOR19MT0NBTFM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCmluZGV4IDcyMGRkOTkuLjljZGRhMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCkBAIC0yODcsMjQgKzI4OCw2IEBACiAJCSAgcGNpZV9sYW5lcyk7CiB9CiAKLXN0YXRpYyBpbnQgcjYwMF9wbV9nZXRfdHlwZV9pbmRleChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkgIGVudW0gcmFkZW9uX3BtX3N0YXRlX3R5cGUgcHNfdHlwZSwKLQkJCQkgIGludCBpbnN0YW5jZSkKLXsKLQlpbnQgaTsKLQlpbnQgZm91bmRfaW5zdGFuY2UgPSAtMTsKLQotCWZvciAoaSA9IDA7IGkgPCByZGV2LT5wbS5udW1fcG93ZXJfc3RhdGVzOyBpKyspIHsKLQkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLnR5cGUgPT0gcHNfdHlwZSkgewotCQkJZm91bmRfaW5zdGFuY2UrKzsKLQkJCWlmIChmb3VuZF9pbnN0YW5jZSA9PSBpbnN0YW5jZSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCX0KLQkvKiByZXR1cm4gZGVmYXVsdCBpZiBubyBtYXRjaCAqLwotCXJldHVybiByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OwotfQotCiB2b2lkIHJzNzgwX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA9PSAyKSB7CkBAIC00MjAsNiArNDAzLDggQEAKIAogdm9pZCByNjAwX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwlpbnQgaWR4OworCiAJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1I2MDApIHsKIAkJLyogWFhYICovCiAJCS8qIGRlZmF1bHQgKi8KQEAgLTUwMSw4MSArNDg2LDQzIEBACiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0RFRkFVTFRfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwogCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ERUZBVUxUX0lEWF0uZHBtc19vbl9jbV9pZHggPSAyOwogCQkJLyogbG93IHNoICovCi0JCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfTU9CSUxJVFkpIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAwKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKLQkJCX0KKwkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkKKwkJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAwKTsKKwkJCWVsc2UKKwkJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMCk7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKIAkJCS8qIG1pZCBzaCAqLwotCQkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX01PQklMSVRZKSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWSwgMCk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAwKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX2NtX2lkeCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAwKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAwKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfU0hfSURYXS5kcG1zX29uX2NtX2lkeCA9IDE7Ci0JCQl9CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9TSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKIAkJCS8qIGhpZ2ggc2ggKi8KLQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAwKTsKLQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9TSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOworCQkJaWR4ID0gcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDApOworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfU0hfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwogCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX1NIX0lEWF0uZHBtc19vbl9jbV9pZHggPSAyOwogCQkJLyogbG93IG1oICovCi0JCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfTU9CSUxJVFkpIHsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAxKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlksIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9MT1dfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOwotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vZmZfY21faWR4ID0gMDsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKLQkJCX0KKwkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19NT0JJTElUWSkKKwkJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAxKTsKKwkJCWVsc2UKKwkJCQlpZHggPSByYWRlb25fcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRSwgMSk7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTE9XX01IX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0xPV19NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMDsKIAkJCS8qIG1pZCBtaCAqLwotCQkJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX01PQklMSVRZKSB7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29mZl9wc19pZHggPQotCQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWSwgMSk7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX3BzX2lkeCA9Ci0JCQkJCXI2MDBfcG1fZ2V0X3R5cGVfaW5kZXgocmRldiwgUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZLCAxKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX2NtX2lkeCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAxKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAxKTsKLQkJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7Ci0JCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9NSURfTUhfSURYXS5kcG1zX29uX2NtX2lkeCA9IDE7Ci0JCQl9CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9IGlkeDsKKwkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfTUlEX01IX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb2ZmX2NtX2lkeCA9IDA7CisJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX01JRF9NSF9JRFhdLmRwbXNfb25fY21faWR4ID0gMTsKIAkJCS8qIGhpZ2ggbWggKi8KLQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9NSF9JRFhdLmRwbXNfb2ZmX3BzX2lkeCA9Ci0JCQkJcjYwMF9wbV9nZXRfdHlwZV9pbmRleChyZGV2LCBQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFLCAxKTsKLQkJCXJkZXYtPnBtLnByb2ZpbGVzW1BNX1BST0ZJTEVfSElHSF9NSF9JRFhdLmRwbXNfb25fcHNfaWR4ID0KLQkJCQlyNjAwX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOworCQkJaWR4ID0gcmFkZW9uX3BtX2dldF90eXBlX2luZGV4KHJkZXYsIFBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0UsIDEpOworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vZmZfcHNfaWR4ID0gaWR4OworCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vbl9wc19pZHggPSBpZHg7CiAJCQlyZGV2LT5wbS5wcm9maWxlc1tQTV9QUk9GSUxFX0hJR0hfTUhfSURYXS5kcG1zX29mZl9jbV9pZHggPSAwOwogCQkJcmRldi0+cG0ucHJvZmlsZXNbUE1fUFJPRklMRV9ISUdIX01IX0lEWF0uZHBtc19vbl9jbV9pZHggPSAyOwogCQl9CkBAIC03NjIsMTMgKzcwOSwxNCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByZGV2LT5kZGV2OwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAKLQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7Ci0JCXUzMiB0bXAgPSBEQ19IUER4X0NPTk5FQ1RJT05fVElNRVIoMHg5YzQpIHwgRENfSFBEeF9SWF9JTlRfVElNRVIoMHhmYSk7Ci0JCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKQotCQkJdG1wIHw9IERDX0hQRHhfRU47CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewotCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKKwkJCXUzMiB0bXAgPSBEQ19IUER4X0NPTk5FQ1RJT05fVElNRVIoMHg5YzQpIHwgRENfSFBEeF9SWF9JTlRfVElNRVIoMHhmYSk7CisJCQlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkKKwkJCQl0bXAgfD0gRENfSFBEeF9FTjsKKwogCQkJc3dpdGNoIChyYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkKSB7CiAJCQljYXNlIFJBREVPTl9IUERfMToKIAkJCQlXUkVHMzIoRENfSFBEMV9DT05UUk9MLCB0bXApOwpAQCAtNzk4LDEwICs3NDYsNyBAQAogCQkJZGVmYXVsdDoKIAkJCQlicmVhazsKIAkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewotCQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJCX0gZWxzZSB7CiAJCQlzd2l0Y2ggKHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpIHsKIAkJCWNhc2UgUkFERU9OX0hQRF8xOgogCQkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QxX0NPTlRST0wsIERDX0hPVF9QTFVHX0RFVEVDVHhfRU4pOwpAQCAtODE5LDYgKzc2NCw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKwkJcmFkZW9uX2hwZF9zZXRfcG9sYXJpdHkocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCk7CiAJfQogCWlmIChyZGV2LT5pcnEuaW5zdGFsbGVkKQogCQlyNjAwX2lycV9zZXQocmRldik7CkBAIC04OTYsNyArODQyLDcgQEAKIAkvKiBmbHVzaCBoZHAgY2FjaGUgc28gdXBkYXRlcyBoaXQgdnJhbSAqLwogCWlmICgocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApICYmIChyZGV2LT5mYW1pbHkgPD0gQ0hJUF9SVjc0MCkgJiYKIAkgICAgIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApKSB7Ci0JCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucHRyOworCQl2b2lkIF9faW9tZW0gKnB0ciA9ICh2b2lkICopcmRldi0+Z2FydC5wdHI7CiAJCXUzMiB0bXA7CiAKIAkJLyogcjd4eCBodyBidWcuICB3cml0ZSB0byBIRFBfREVCVUcxIGZvbGxvd2VkIGJ5IGZiIHJlYWQKQEAgLTkzMSw3ICs4NzcsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaikgewogCQlXQVJOKDEsICJSNjAwIFBDSUUgR0FSVCBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTQ4LDcgKzg5NCw3IEBACiAJdTMyIHRtcDsKIAlpbnQgciwgaTsKIAotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiA9PSBOVUxMKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaiA9PSBOVUxMKSB7CiAJCWRldl9lcnIocmRldi0+ZGV2LCAiTm8gVlJBTSBvYmplY3QgZm9yIFBDSUUgR0FSVC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05OTMsNiArOTM5LDkgQEAKIAkJV1JFRzMyKFZNX0NPTlRFWFQwX0NOVEwgKyAoaSAqIDQpLCAwKTsKIAogCXI2MDBfcGNpZV9nYXJ0X3RsYl9mbHVzaChyZGV2KTsKKwlEUk1fSU5GTygiUENJRSBHQVJUIG9mICV1TSBlbmFibGVkICh0YWJsZSBhdCAweCUwMTZsbFgpLlxuIiwKKwkJICh1bnNpZ25lZCkocmRldi0+bWMuZ3R0X3NpemUgPj4gMjApLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5nYXJ0LnRhYmxlX2FkZHIpOwogCXJkZXYtPmdhcnQucmVhZHkgPSB0cnVlOwogCXJldHVybiAwOwogfQpAQCAtMTAwMCw3ICs5NDksNyBAQAogdm9pZCByNjAwX3BjaWVfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7Ci0JaW50IGksIHI7CisJaW50IGk7CiAKIAkvKiBEaXNhYmxlIGFsbCB0YWJsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQpAQCAtMTAyNywxNCArOTc2LDcgQEAKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9TWVNfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9SRF9IRFBfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTDFfVExCX01DQl9XUl9IRFBfQ05UTCwgdG1wKTsKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7Ci0JCWlmIChsaWtlbHkociA9PSAwKSkgewotCQkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCQlyYWRlb25fYm9fdW5waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7Ci0JCX0KLQl9CisJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihyZGV2KTsKIH0KIAogdm9pZCByNjAwX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTEzNCw3ICsxMDc2LDcgQEAKIAkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwgcmRldi0+bWMudnJhbV9zdGFydCA+PiAxMik7CiAJCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfSElHSF9BRERSLCByZGV2LT5tYy52cmFtX2VuZCA+PiAxMik7CiAJfQotCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfREVGQVVMVF9BRERSLCAwKTsKKwlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgcmRldi0+dnJhbV9zY3JhdGNoLmdwdV9hZGRyID4+IDEyKTsKIAl0bXAgPSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDI0KSAmIDB4RkZGRikgPDwgMTY7CiAJdG1wIHw9ICgocmRldi0+bWMudnJhbV9zdGFydCA+PiAyNCkgJiAweEZGRkYpOwogCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKQEAgLTEyNzMsNiArMTIxNSw1MyBAQAogCXJldHVybiAwOwogfQogCitpbnQgcjYwMF92cmFtX3NjcmF0Y2hfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlpbnQgcjsKKworCWlmIChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaiA9PSBOVUxMKSB7CisJCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIFJBREVPTl9HUFVfUEFHRV9TSVpFLAorCQkJCSAgICAgUEFHRV9TSVpFLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCSAgICAgJnJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKwkJaWYgKHIpIHsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpCisJCXJldHVybiByOworCXIgPSByYWRlb25fYm9fcGluKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLAorCQkJICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLCAmcmRldi0+dnJhbV9zY3JhdGNoLmdwdV9hZGRyKTsKKwlpZiAocikgeworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKKwkJcmV0dXJuIHI7CisJfQorCXIgPSByYWRlb25fYm9fa21hcChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaiwKKwkJCQkodm9pZCAqKikmcmRldi0+dnJhbV9zY3JhdGNoLnB0cik7CisJaWYgKHIpCisJCXJhZGVvbl9ib191bnBpbihyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCByNjAwX3ZyYW1fc2NyYXRjaF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJaWYgKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmosIGZhbHNlKTsKKwlpZiAobGlrZWx5KHIgPT0gMCkpIHsKKwkJcmFkZW9uX2JvX2t1bm1hcChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CisJCXJhZGVvbl9ib191bnBpbihyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOworCX0KKwlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKK30KKwogLyogV2UgZG9lc24ndCBjaGVjayB0aGF0IHRoZSBHUFUgcmVhbGx5IG5lZWRzIGEgcmVzZXQgd2Ugc2ltcGx5IGRvIHRoZQogICogcmVzZXQsIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgaWYgdGhlIEdQVSBuZWVkcyBvbmUuIFdlCiAgKiBtaWdodCBhZGQgYW4gaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQuCkBAIC0yMzI4LDYgKzIzMTcsMTQgQEAKIAlpZiAocmRldi0+d2IudXNlX2V2ZW50KSB7CiAJCXU2NCBhZGRyID0gcmRldi0+d2IuZ3B1X2FkZHIgKyBSNjAwX1dCX0VWRU5UX09GRlNFVCArCiAJCQkodTY0KShyZGV2LT5mZW5jZV9kcnYuc2NyYXRjaF9yZWcgLSByZGV2LT5zY3JhdGNoLnJlZ19iYXNlKTsKKwkJLyogZmx1c2ggcmVhZCBjYWNoZSBvdmVyIGdhcnQgKi8KKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NVUkZBQ0VfU1lOQywgMykpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzX1RDX0FDVElPTl9FTkEgfAorCQkJCQlQQUNLRVQzX1ZDX0FDVElPTl9FTkEgfAorCQkJCQlQQUNLRVQzX1NIX0FDVElPTl9FTkEpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAweEZGRkZGRkZGKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDEwKTsgLyogcG9sbCBpbnRlcnZhbCAqLwogCQkvKiBFVkVOVF9XUklURV9FT1AgLSBmbHVzaCBjYWNoZXMsIHNlbmQgaW50ICovCiAJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19FVkVOVF9XUklURV9FT1AsIDQpKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgRVZFTlRfVFlQRShDQUNIRV9GTFVTSF9BTkRfSU5WX0VWRU5UX1RTKSB8IEVWRU5UX0lOREVYKDUpKTsKQEAgLTIzMzYsNiArMjMzMywxNCBAQAogCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBmZW5jZS0+c2VxKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJfSBlbHNlIHsKKwkJLyogZmx1c2ggcmVhZCBjYWNoZSBvdmVyIGdhcnQgKi8KKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgUEFDS0VUMyhQQUNLRVQzX1NVUkZBQ0VfU1lOQywgMykpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzX1RDX0FDVElPTl9FTkEgfAorCQkJCQlQQUNLRVQzX1ZDX0FDVElPTl9FTkEgfAorCQkJCQlQQUNLRVQzX1NIX0FDVElPTl9FTkEpOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAweEZGRkZGRkZGKTsKKwkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDEwKTsgLyogcG9sbCBpbnRlcnZhbCAqLwogCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCBQQUNLRVQzKFBBQ0tFVDNfRVZFTlRfV1JJVEUsIDApKTsKIAkJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgRVZFTlRfVFlQRShDQUNIRV9GTFVTSF9BTkRfSU5WX0VWRU5UKSB8IEVWRU5UX0lOREVYKDApKTsKIAkJLyogd2FpdCBmb3IgM0QgaWRsZSBjbGVhbiAqLwpAQCAtMjM2MiwxOSArMjM2NywzMyBAQAogCiAJbXV0ZXhfbG9jaygmcmRldi0+cjYwMF9ibGl0Lm11dGV4KTsKIAlyZGV2LT5yNjAwX2JsaXQudmJfaWIgPSBOVUxMOwotCXIgPSByNjAwX2JsaXRfcHJlcGFyZV9jb3B5KHJkZXYsIG51bV9ncHVfcGFnZXMgKiBSQURFT05fR1BVX1BBR0VfU0laRSk7CisJciA9IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkocmRldiwgbnVtX2dwdV9wYWdlcyk7CiAJaWYgKHIpIHsKIAkJaWYgKHJkZXYtPnI2MDBfYmxpdC52Yl9pYikKIAkJCXJhZGVvbl9pYl9mcmVlKHJkZXYsICZyZGV2LT5yNjAwX2JsaXQudmJfaWIpOwogCQltdXRleF91bmxvY2soJnJkZXYtPnI2MDBfYmxpdC5tdXRleCk7CiAJCXJldHVybiByOwogCX0KLQlyNjAwX2ttc19ibGl0X2NvcHkocmRldiwgc3JjX29mZnNldCwgZHN0X29mZnNldCwgbnVtX2dwdV9wYWdlcyAqIFJBREVPTl9HUFVfUEFHRV9TSVpFKTsKKwlyNjAwX2ttc19ibGl0X2NvcHkocmRldiwgc3JjX29mZnNldCwgZHN0X29mZnNldCwgbnVtX2dwdV9wYWdlcyk7CiAJcjYwMF9ibGl0X2RvbmVfY29weShyZGV2LCBmZW5jZSk7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5yNjAwX2JsaXQubXV0ZXgpOwogCXJldHVybiAwOwogfQogCit2b2lkIHI2MDBfYmxpdF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWludCByOworCisJLyogdW5waW4gc2hhZGVycyBibyAqLworCWlmIChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaikgeworCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmosIGZhbHNlKTsKKwkJaWYgKCFyKSB7CisJCQlyYWRlb25fYm9fdW5waW4ocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOworCQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7CisJCX0KKwl9Cit9CisKIGludCByNjAwX3NldF9zdXJmYWNlX3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHJlZywKIAkJCSB1aW50MzJfdCB0aWxpbmdfZmxhZ3MsIHVpbnQzMl90IHBpdGNoLAogCQkJIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgb2JqX3NpemUpCkBAIC0yNDAzLDYgKzI0MjIsMTAgQEAKIAkJfQogCX0KIAorCXIgPSByNjAwX3ZyYW1fc2NyYXRjaF9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwogCXI2MDBfbWNfcHJvZ3JhbShyZGV2KTsKIAlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CiAJCXI2MDBfYWdwX2VuYWJsZShyZGV2KTsKQEAgLTI0OTQsOCArMjUxNyw2IEBACiAKIGludCByNjAwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JaW50IHI7Ci0KIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJLyogRklYTUU6IHdlIHNob3VsZCB3YWl0IGZvciByaW5nIHRvIGJlIGVtcHR5ICovCiAJcjYwMF9jcF9zdG9wKHJkZXYpOwpAQCAtMjUwMywxNCArMjUyNCw4IEBACiAJcjYwMF9pcnFfc3VzcGVuZChyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlyNjAwX3BjaWVfZ2FydF9kaXNhYmxlKHJkZXYpOwotCS8qIHVucGluIHNoYWRlcnMgYm8gKi8KLQlpZiAocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqLCBmYWxzZSk7Ci0JCWlmICghcikgewotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+cjYwMF9ibGl0LnNoYWRlcl9vYmopOwotCQl9Ci0JfQorCXI2MDBfYmxpdF9zdXNwZW5kKHJkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MzEsNiArMjY0Niw3IEBACiAJcmFkZW9uX2liX3Bvb2xfZmluaShyZGV2KTsKIAlyYWRlb25faXJxX2ttc19maW5pKHJkZXYpOwogCXI2MDBfcGNpZV9nYXJ0X2ZpbmkocmRldik7CisJcjYwMF92cmFtX3NjcmF0Y2hfZmluaShyZGV2KTsKIAlyYWRlb25fYWdwX2ZpbmkocmRldik7CiAJcmFkZW9uX2dlbV9maW5pKHJkZXYpOwogCXJhZGVvbl9mZW5jZV9kcml2ZXJfZmluaShyZGV2KTsKQEAgLTMxMzcsNyArMzE1Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByNjAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCitzdGF0aWMgdm9pZCByNjAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKIApAQCAtMzIzOCw3ICszMjU0LDcgQEAKIAlyNjAwX2Rpc2FibGVfaW50ZXJydXB0X3N0YXRlKHJkZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiByNjAwX2dldF9paF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorc3RhdGljIHUzMiByNjAwX2dldF9paF93cHRyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB3cHRyLCB0bXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfYmxpdC5jCmluZGV4IDdmMTA0MzQuLjNjMDMxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXQuYwpAQCAtNDEsNyArNDEsNyBAQAogI2RlZmluZSBDT0xPUl81XzZfNSAgICAgICAgICAgMHg4CiAjZGVmaW5lIENPTE9SXzhfOF84XzggICAgICAgICAweDFhCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIHNldF9yZW5kZXJfdGFyZ2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoLCB1NjQgZ3B1X2FkZHIpCiB7CiAJdTMyIGNiX2NvbG9yX2luZm87CkBAIC05OSw3ICs5OSw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGNwX3NldF9zdXJmYWNlX3N5bmMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAogCQkgICAgdTMyIHN5bmNfdHlwZSwgdTMyIHNpemUsIHU2NCBtY19hZGRyKQogewpAQCAtMTIxLDcgKzEyMSw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIHNldF9zaGFkZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE4NCw3ICsxODQsNyBAQAogCQkJICAgIFI2MDBfU0hfQUNUSU9OX0VOQSwgNTEyLCBncHVfYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIHNldF92dHhfcmVzb3VyY2UoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1NjQgZ3B1X2FkZHIpCiB7CiAJdWludDMyX3Qgc3FfdnR4X2NvbnN0YW50X3dvcmQyOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCQkJICAgIFI2MDBfVkNfQUNUSU9OX0VOQSwgNDgsIGdwdV9hZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3RleF9yZXNvdXJjZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCSBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgsIGludCBwaXRjaCwgdTY0IGdwdV9hZGRyKQogewpAQCAtMjU4LDcgKzI1OCw3IEBACiAKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCitzdGF0aWMgdm9pZAogc2V0X3NjaXNzb3JzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKQogewogCVJJTkdfTE9DQUxTOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIHZvaWQKIGRyYXdfYXV0byhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJUklOR19MT0NBTFM7CkBAIC0zMTEsNyArMzExLDcgQEAKIAlDT01NSVRfUklORygpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBzZXRfZGVmYXVsdF9zdGF0ZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCiB7CiAJaW50IGk7CkBAIC00ODksNyArNDg5LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCBpMmYodWludDMyX3QgaW5wdXQpCitzdGF0aWMgdWludDMyX3QgaTJmKHVpbnQzMl90IGlucHV0KQogewogCXUzMiByZXN1bHQsIGksIGV4cG9uZW50LCBmcmFjdGlvbjsKIApAQCAtNTE1LDcgKzUxNSw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgcjYwMF9ub21tX2dldF92YihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIGludCByNjAwX25vbW1fZ2V0X3ZiKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkZXZfcHJpdi0+YmxpdF92YiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKQEAgLTUyNiw3ICs1MjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjYwMF9ub21tX3B1dF92YihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcjYwMF9ub21tX3B1dF92YihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTUzNCw3ICs1MzQsNyBAQAogCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGRldl9wcml2LT5ibGl0X3ZiLT5maWxlX3ByaXYtPm1hc3RlciwgZGV2X3ByaXYtPmJsaXRfdmIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnI2MDBfbm9tbV9nZXRfdmJfcHRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCAqcjYwMF9ub21tX2dldF92Yl9wdHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXJldHVybiAoKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwX2JsaXRfa21zLmMKaW5kZXggOWFhNzRjM2YuLmUwOWQyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9ibGl0X2ttcy5jCkBAIC00Miw2ICs0Miw5IEBACiAjZGVmaW5lIENPTE9SXzVfNl81ICAgICAgICAgICAweDgKICNkZWZpbmUgQ09MT1JfOF84XzhfOCAgICAgICAgIDB4MWEKIAorI2RlZmluZSBSRUNUX1VOSVRfSCAgICAgICAgICAgMzIKKyNkZWZpbmUgUkVDVF9VTklUX1cgICAgICAgICAgIChSQURFT05fR1BVX1BBR0VfU0laRSAvIDQgLyBSRUNUX1VOSVRfSCkKKwogLyogZW1pdHMgMjEgb24gcnY3NzArLCAyMyBvbiByNjAwICovCiBzdGF0aWMgdm9pZAogc2V0X3JlbmRlcl90YXJnZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBmb3JtYXQsCkBAIC01NCw3ICs1Nyw5IEBACiAJaWYgKGggPCA4KQogCQloID0gODsKIAotCWNiX2NvbG9yX2luZm8gPSAoKGZvcm1hdCA8PCAyKSB8ICgxIDw8IDI3KSB8ICgxIDw8IDgpKTsKKwljYl9jb2xvcl9pbmZvID0gQ0JfRk9STUFUKGZvcm1hdCkgfAorCQlDQl9TT1VSQ0VfRk9STUFUKENCX1NGX0VYUE9SVF9OT1JNKSB8CisJCUNCX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOwogCXBpdGNoID0gKHcgLyA4KSAtIDE7CiAJc2xpY2UgPSAoKHcgKiBoKSAvIDY0KSAtIDE7CiAKQEAgLTE2NCw5ICsxNjksMTAgQEAKIHsKIAl1MzIgc3FfdnR4X2NvbnN0YW50X3dvcmQyOwogCi0Jc3FfdnR4X2NvbnN0YW50X3dvcmQyID0gKCh1cHBlcl8zMl9iaXRzKGdwdV9hZGRyKSAmIDB4ZmYpIHwgKDE2IDw8IDgpKTsKKwlzcV92dHhfY29uc3RhbnRfd29yZDIgPSBTUV9WVFhDX0JBU0VfQUREUl9ISSh1cHBlcl8zMl9iaXRzKGdwdV9hZGRyKSAmIDB4ZmYpIHwKKwkJU1FfVlRYQ19TVFJJREUoMTYpOwogI2lmZGVmIF9fQklHX0VORElBTgotCXNxX3Z0eF9jb25zdGFudF93b3JkMiB8PSAoMiA8PCAzMCk7CisJc3FfdnR4X2NvbnN0YW50X3dvcmQyIHw9ICBTUV9WVFhDX0VORElBTl9TV0FQKFNRX0VORElBTl84SU4zMik7CiAjZW5kaWYKIAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfUkVTT1VSQ0UsIDcpKTsKQEAgLTE5NSwyNSArMjAxLDI5IEBACiBzdGF0aWMgdm9pZAogc2V0X3RleF9yZXNvdXJjZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKIAkJIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCwgaW50IHBpdGNoLAotCQkgdTY0IGdwdV9hZGRyKQorCQkgdTY0IGdwdV9hZGRyLCB1MzIgc2l6ZSkKIHsKIAl1aW50MzJfdCBzcV90ZXhfcmVzb3VyY2Vfd29yZDAsIHNxX3RleF9yZXNvdXJjZV93b3JkMSwgc3FfdGV4X3Jlc291cmNlX3dvcmQ0OwogCiAJaWYgKGggPCAxKQogCQloID0gMTsKIAotCXNxX3RleF9yZXNvdXJjZV93b3JkMCA9ICgxIDw8IDApIHwgKDEgPDwgMyk7Ci0Jc3FfdGV4X3Jlc291cmNlX3dvcmQwIHw9ICgoKChwaXRjaCA+PiAzKSAtIDEpIDw8IDgpIHwKLQkJCQkgICgodyAtIDEpIDw8IDE5KSk7CisJc3FfdGV4X3Jlc291cmNlX3dvcmQwID0gU18wMzgwMDBfRElNKFZfMDM4MDAwX1NRX1RFWF9ESU1fMkQpIHwKKwkJU18wMzgwMDBfVElMRV9NT0RFKFZfMDM4MDAwX0FSUkFZXzFEX1RJTEVEX1RISU4xKTsKKwlzcV90ZXhfcmVzb3VyY2Vfd29yZDAgfD0gU18wMzgwMDBfUElUQ0goKHBpdGNoID4+IDMpIC0gMSkgfAorCQlTXzAzODAwMF9URVhfV0lEVEgodyAtIDEpOwogCi0Jc3FfdGV4X3Jlc291cmNlX3dvcmQxID0gKGZvcm1hdCA8PCAyNik7Ci0Jc3FfdGV4X3Jlc291cmNlX3dvcmQxIHw9ICgoaCAtIDEpIDw8IDApOworCXNxX3RleF9yZXNvdXJjZV93b3JkMSA9IFNfMDM4MDA0X0RBVEFfRk9STUFUKGZvcm1hdCk7CisJc3FfdGV4X3Jlc291cmNlX3dvcmQxIHw9IFNfMDM4MDA0X1RFWF9IRUlHSFQoaCAtIDEpOwogCi0Jc3FfdGV4X3Jlc291cmNlX3dvcmQ0ID0gKCgxIDw8IDE0KSB8Ci0JCQkJICgwIDw8IDE2KSB8Ci0JCQkJICgxIDw8IDE5KSB8Ci0JCQkJICgyIDw8IDIyKSB8Ci0JCQkJICgzIDw8IDI1KSk7CisJc3FfdGV4X3Jlc291cmNlX3dvcmQ0ID0gU18wMzgwMTBfUkVRVUVTVF9TSVpFKDEpIHwKKwkJU18wMzgwMTBfRFNUX1NFTF9YKFNRX1NFTF9YKSB8CisJCVNfMDM4MDEwX0RTVF9TRUxfWShTUV9TRUxfWSkgfAorCQlTXzAzODAxMF9EU1RfU0VMX1ooU1FfU0VMX1opIHwKKwkJU18wMzgwMTBfRFNUX1NFTF9XKFNRX1NFTF9XKTsKKworCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKKwkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIHNpemUsIGdwdV9hZGRyKTsKIAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIFBBQ0tFVDMoUEFDS0VUM19TRVRfUkVTT1VSQ0UsIDcpKTsKIAlyYWRlb25fcmluZ193cml0ZShyZGV2LCAwKTsKQEAgLTQ1MCw3ICs0NjAsNyBAQAogCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIHNxX3N0YWNrX3Jlc291cmNlX21nbXRfMik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgaTJmKHVpbnQzMl90IGlucHV0KQorc3RhdGljIHVpbnQzMl90IGkyZih1aW50MzJfdCBpbnB1dCkKIHsKIAl1MzIgcmVzdWx0LCBpLCBleHBvbmVudCwgZnJhY3Rpb247CiAKQEAgLTQ4Myw2ICs0OTMsMjcgQEAKIAl1MzIgcGFja2V0MnNbMTZdOwogCWludCBudW1fcGFja2V0MnMgPSAwOwogCisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3JlbmRlcl90YXJnZXQgPSBzZXRfcmVuZGVyX3RhcmdldDsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5jcF9zZXRfc3VyZmFjZV9zeW5jID0gY3Bfc2V0X3N1cmZhY2Vfc3luYzsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfc2hhZGVycyA9IHNldF9zaGFkZXJzOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF92dHhfcmVzb3VyY2UgPSBzZXRfdnR4X3Jlc291cmNlOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF90ZXhfcmVzb3VyY2UgPSBzZXRfdGV4X3Jlc291cmNlOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9zY2lzc29ycyA9IHNldF9zY2lzc29yczsKKwlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5kcmF3X2F1dG8gPSBkcmF3X2F1dG87CisJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X2RlZmF1bHRfc3RhdGUgPSBzZXRfZGVmYXVsdF9zdGF0ZTsKKworCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfY29tbW9uID0gNDA7IC8qIHNoYWRlcnMgKyBkZWYgc3RhdGUgKi8KKwlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX2NvbW1vbiArPSAxNjsgLyogZmVuY2UgZW1pdCBmb3IgVkIgSUIgKi8KKwlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX2NvbW1vbiArPSA1OyAvKiBkb25lIGNvcHkgKi8KKwlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX2NvbW1vbiArPSAxNjsgLyogZmVuY2UgZW1pdCBmb3IgZG9uZSBjb3B5ICovCisKKwlyZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX3Blcl9sb29wID0gNzY7CisJLyogc2V0X3JlbmRlcl90YXJnZXQgZW1pdHMgMiBleHRyYSBkd29yZHMgb24gcnY2eHggKi8KKwlpZiAocmRldi0+ZmFtaWx5ID4gQ0hJUF9SNjAwICYmIHJkZXYtPmZhbWlseSA8IENISVBfUlY3NzApCisJCXJkZXYtPnI2MDBfYmxpdC5yaW5nX3NpemVfcGVyX2xvb3AgKz0gMjsKKworCXJkZXYtPnI2MDBfYmxpdC5tYXhfZGltID0gODE5MjsKKwogCS8qIHBpbiBjb3B5IHNoYWRlciBpbnRvIHZyYW0gaWYgYWxyZWFkeSBpbml0aWFsaXplZCAqLwogCWlmIChyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaikKIAkJZ290byBkb25lOwpAQCAtNjAwLDQ3ICs2MzEsODAgQEAKIAlyYWRlb25faWJfZnJlZShyZGV2LCAmcmRldi0+cjYwMF9ibGl0LnZiX2liKTsKIH0KIAotaW50IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBzaXplX2J5dGVzKQorc3RhdGljIHVuc2lnbmVkIHI2MDBfYmxpdF9jcmVhdGVfcmVjdCh1bnNpZ25lZCBudW1fZ3B1X3BhZ2VzLAorCQkJCSAgICAgIGludCAqd2lkdGgsIGludCAqaGVpZ2h0LCBpbnQgbWF4X2RpbSkKK3sKKwl1bnNpZ25lZCBtYXhfcGFnZXM7CisJdW5zaWduZWQgcGFnZXMgPSBudW1fZ3B1X3BhZ2VzOworCWludCB3LCBoOworCisJaWYgKG51bV9ncHVfcGFnZXMgPT0gMCkgeworCQkvKiBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIHdpdGggbm8gcGFnZXMsIGJ1dCBqdXN0IGluIGNhc2UgKi8KKwkJaCA9IDA7CisJCXcgPSAwOworCQlwYWdlcyA9IDA7CisJCVdBUk5fT04oMSk7CisJfSBlbHNlIHsKKwkJaW50IHJlY3Rfb3JkZXIgPSAyOworCQloID0gUkVDVF9VTklUX0g7CisJCXdoaWxlIChudW1fZ3B1X3BhZ2VzIC8gcmVjdF9vcmRlcikgeworCQkJaCAqPSAyOworCQkJcmVjdF9vcmRlciAqPSA0OworCQkJaWYgKGggPj0gbWF4X2RpbSkgeworCQkJCWggPSBtYXhfZGltOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW1heF9wYWdlcyA9IChtYXhfZGltICogaCkgLyAoUkVDVF9VTklUX1cgKiBSRUNUX1VOSVRfSCk7CisJCWlmIChwYWdlcyA+IG1heF9wYWdlcykKKwkJCXBhZ2VzID0gbWF4X3BhZ2VzOworCQl3ID0gKHBhZ2VzICogUkVDVF9VTklUX1cgKiBSRUNUX1VOSVRfSCkgLyBoOworCQl3ID0gKHcgLyBSRUNUX1VOSVRfVykgKiBSRUNUX1VOSVRfVzsKKwkJcGFnZXMgPSAodyAqIGgpIC8gKFJFQ1RfVU5JVF9XICogUkVDVF9VTklUX0gpOworCQlCVUdfT04ocGFnZXMgPT0gMCk7CisJfQorCisKKwlEUk1fREVCVUcoImJsaXRfcmVjdGFuZ2xlOiBoPSVkLCB3PSVkLCBwYWdlcz0lZFxuIiwgaCwgdywgcGFnZXMpOworCisJLyogcmV0dXJuIHdpZHRoIGFuZCBoZWlnaHQgb25seSBvZiB0aGUgY2FsbGVyIHdhbnRzIGl0ICovCisJaWYgKGhlaWdodCkKKwkJKmhlaWdodCA9IGg7CisJaWYgKHdpZHRoKQorCQkqd2lkdGggPSB3OworCisJcmV0dXJuIHBhZ2VzOworfQorCisKK2ludCByNjAwX2JsaXRfcHJlcGFyZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBudW1fZ3B1X3BhZ2VzKQogewogCWludCByOwotCWludCByaW5nX3NpemUsIGxpbmVfc2l6ZTsKLQlpbnQgbWF4X3NpemU7Ci0JLyogbG9vcHMgb2YgZW1pdHMgNjQgKyBmZW5jZSBlbWl0IHBvc3NpYmxlICovCi0JaW50IGR3b3Jkc19wZXJfbG9vcCA9IDc2LCBudW1fbG9vcHM7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgbnVtX2xvb3BzID0gMDsKKwlpbnQgZHdvcmRzX3Blcl9sb29wID0gcmRldi0+cjYwMF9ibGl0LnJpbmdfc2l6ZV9wZXJfbG9vcDsKIAogCXIgPSByNjAwX3ZiX2liX2dldChyZGV2KTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQkvKiBzZXRfcmVuZGVyX3RhcmdldCBlbWl0cyAyIGV4dHJhIGR3b3JkcyBvbiBydjZ4eCAqLwotCWlmIChyZGV2LT5mYW1pbHkgPiBDSElQX1I2MDAgJiYgcmRldi0+ZmFtaWx5IDwgQ0hJUF9SVjc3MCkKLQkJZHdvcmRzX3Blcl9sb29wICs9IDI7CisJLyogbnVtIGxvb3BzICovCisJd2hpbGUgKG51bV9ncHVfcGFnZXMpIHsKKwkJbnVtX2dwdV9wYWdlcyAtPQorCQkJcjYwMF9ibGl0X2NyZWF0ZV9yZWN0KG51bV9ncHVfcGFnZXMsIE5VTEwsIE5VTEwsCisJCQkJCSAgICAgIHJkZXYtPnI2MDBfYmxpdC5tYXhfZGltKTsKKwkJbnVtX2xvb3BzKys7CisJfQogCi0JLyogOCBicHAgdnMgMzIgYnBwIGZvciB4ZmVyIHVuaXQgKi8KLQlpZiAoc2l6ZV9ieXRlcyAmIDMpCi0JCWxpbmVfc2l6ZSA9IDgxOTI7Ci0JZWxzZQotCQlsaW5lX3NpemUgPSA4MTkyKjQ7Ci0KLQltYXhfc2l6ZSA9IDgxOTIgKiBsaW5lX3NpemU7Ci0KLQkvKiBtYWpvciBsb29wcyBjb3ZlciB0aGUgbWF4IHNpemUgdHJhbnNmZXIgKi8KLQludW1fbG9vcHMgPSAoKHNpemVfYnl0ZXMgKyBtYXhfc2l6ZSkgLyBtYXhfc2l6ZSk7Ci0JLyogbWlub3IgbG9vcHMgY292ZXIgdGhlIGV4dHJhIG5vbiBhbGlnbmVkIGJpdHMgKi8KLQludW1fbG9vcHMgKz0gKChzaXplX2J5dGVzICUgbGluZV9zaXplKSA/IDEgOiAwKTsKIAkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGxvb3BzIGNvcnJlY3RseSAqLwogCXJpbmdfc2l6ZSA9IG51bV9sb29wcyAqIGR3b3Jkc19wZXJfbG9vcDsKLQkvKiBzZXQgZGVmYXVsdCAgKyBzaGFkZXJzICovCi0JcmluZ19zaXplICs9IDQwOyAvKiBzaGFkZXJzICsgZGVmIHN0YXRlICovCi0JcmluZ19zaXplICs9IDEwOyAvKiBmZW5jZSBlbWl0IGZvciBWQiBJQiAqLwotCXJpbmdfc2l6ZSArPSA1OyAvKiBkb25lIGNvcHkgKi8KLQlyaW5nX3NpemUgKz0gMTA7IC8qIGZlbmNlIGVtaXQgZm9yIGRvbmUgY29weSAqLworCXJpbmdfc2l6ZSArPSByZGV2LT5yNjAwX2JsaXQucmluZ19zaXplX2NvbW1vbjsKIAlyID0gcmFkZW9uX3JpbmdfbG9jayhyZGV2LCByaW5nX3NpemUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXNldF9kZWZhdWx0X3N0YXRlKHJkZXYpOyAvKiAxNCAqLwotCXNldF9zaGFkZXJzKHJkZXYpOyAvKiAyNiAqLworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9kZWZhdWx0X3N0YXRlKHJkZXYpOworCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLnNldF9zaGFkZXJzKHJkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC02NTksMTgyICs3MjMsNjEgQEAKIAogdm9pZCByNjAwX2ttc19ibGl0X2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQl1NjQgc3JjX2dwdV9hZGRyLCB1NjQgZHN0X2dwdV9hZGRyLAotCQkJaW50IHNpemVfYnl0ZXMpCisJCQl1bnNpZ25lZCBudW1fZ3B1X3BhZ2VzKQogewotCWludCBtYXhfYnl0ZXM7CiAJdTY0IHZiX2dwdV9hZGRyOwogCXUzMiAqdmI7CiAKLQlEUk1fREVCVUcoImVtaXR0aW5nIGNvcHkgJTE2bGx4ICUxNmxseCAlZCAlZFxuIiwgc3JjX2dwdV9hZGRyLCBkc3RfZ3B1X2FkZHIsCi0JCSAgc2l6ZV9ieXRlcywgcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQpOworCURSTV9ERUJVRygiZW1pdHRpbmcgY29weSAlMTZsbHggJTE2bGx4ICVkICVkXG4iLAorCQkgIHNyY19ncHVfYWRkciwgZHN0X2dwdV9hZGRyLAorCQkgIG51bV9ncHVfcGFnZXMsIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkKTsKIAl2YiA9ICh1MzIgKikocmRldi0+cjYwMF9ibGl0LnZiX2liLT5wdHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZCk7Ci0JaWYgKChzaXplX2J5dGVzICYgMykgfHwgKHNyY19ncHVfYWRkciAmIDMpIHx8IChkc3RfZ3B1X2FkZHIgJiAzKSkgewotCQltYXhfYnl0ZXMgPSA4MTkyOwogCi0JCXdoaWxlIChzaXplX2J5dGVzKSB7Ci0JCQlpbnQgY3VyX3NpemUgPSBzaXplX2J5dGVzOwotCQkJaW50IHNyY194ID0gc3JjX2dwdV9hZGRyICYgMjU1OwotCQkJaW50IGRzdF94ID0gZHN0X2dwdV9hZGRyICYgMjU1OwotCQkJaW50IGggPSAxOwotCQkJc3JjX2dwdV9hZGRyID0gc3JjX2dwdV9hZGRyICYgfjI1NVVMTDsKLQkJCWRzdF9ncHVfYWRkciA9IGRzdF9ncHVfYWRkciAmIH4yNTVVTEw7CisJd2hpbGUgKG51bV9ncHVfcGFnZXMpIHsKKwkJaW50IHcsIGg7CisJCXVuc2lnbmVkIHNpemVfaW5fYnl0ZXM7CisJCXVuc2lnbmVkIHBhZ2VzX3Blcl9sb29wID0KKwkJCXI2MDBfYmxpdF9jcmVhdGVfcmVjdChudW1fZ3B1X3BhZ2VzLCAmdywgJmgsCisJCQkJCSAgICAgIHJkZXYtPnI2MDBfYmxpdC5tYXhfZGltKTsKIAotCQkJaWYgKCFzcmNfeCAmJiAhZHN0X3gpIHsKLQkJCQloID0gKGN1cl9zaXplIC8gbWF4X2J5dGVzKTsKLQkJCQlpZiAoaCA+IDgxOTIpCi0JCQkJCWggPSA4MTkyOwotCQkJCWlmIChoID09IDApCi0JCQkJCWggPSAxOwotCQkJCWVsc2UKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJfc2l6ZSA+IG1heF9ieXRlcykKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIGRzdF94KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gZHN0X3gpOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBzcmNfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIHNyY194KTsKLQkJCX0KKwkJc2l6ZV9pbl9ieXRlcyA9IHBhZ2VzX3Blcl9sb29wICogUkFERU9OX0dQVV9QQUdFX1NJWkU7CisJCURSTV9ERUJVRygicmVjdGFuZ2xlIHc9JWQgaD0lZFxuIiwgdywgaCk7CiAKLQkJCWlmICgocmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKyA0OCkgPiByZGV2LT5yNjAwX2JsaXQudmJfdG90YWwpIHsKLQkJCQlXQVJOX09OKDEpOwotCQkJfQotCi0JCQl2YlswXSA9IGkyZihkc3RfeCk7Ci0JCQl2YlsxXSA9IDA7Ci0JCQl2YlsyXSA9IGkyZihzcmNfeCk7Ci0JCQl2YlszXSA9IDA7Ci0KLQkJCXZiWzRdID0gaTJmKGRzdF94KTsKLQkJCXZiWzVdID0gaTJmKGgpOwotCQkJdmJbNl0gPSBpMmYoc3JjX3gpOwotCQkJdmJbN10gPSBpMmYoaCk7Ci0KLQkJCXZiWzhdID0gaTJmKGRzdF94ICsgY3VyX3NpemUpOwotCQkJdmJbOV0gPSBpMmYoaCk7Ci0JCQl2YlsxMF0gPSBpMmYoc3JjX3ggKyBjdXJfc2l6ZSk7Ci0JCQl2YlsxMV0gPSBpMmYoaCk7Ci0KLQkJCS8qIHNyYyA5ICovCi0JCQlzZXRfdGV4X3Jlc291cmNlKHJkZXYsIEZNVF84LAotCQkJCQkgc3JjX3ggKyBjdXJfc2l6ZSwgaCwgc3JjX3ggKyBjdXJfc2l6ZSwKLQkJCQkJIHNyY19ncHVfYWRkcik7Ci0KLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfVENfQUNUSU9OX0VOQSwgKHNyY194ICsgY3VyX3NpemUgKiBoKSwgc3JjX2dwdV9hZGRyKTsKLQotCQkJLyogZHN0IDIzICovCi0JCQlzZXRfcmVuZGVyX3RhcmdldChyZGV2LCBDT0xPUl84LAotCQkJCQkgIGRzdF94ICsgY3VyX3NpemUsIGgsCi0JCQkJCSAgZHN0X2dwdV9hZGRyKTsKLQotCQkJLyogc2Npc3NvcnMgMTIgKi8KLQkJCXNldF9zY2lzc29ycyhyZGV2LCBkc3RfeCwgMCwgZHN0X3ggKyBjdXJfc2l6ZSwgaCk7Ci0KLQkJCS8qIDE0ICovCi0JCQl2Yl9ncHVfYWRkciA9IHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+Z3B1X2FkZHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZDsKLQkJCXNldF92dHhfcmVzb3VyY2UocmRldiwgdmJfZ3B1X2FkZHIpOwotCi0JCQkvKiBkcmF3IDEwICovCi0JCQlkcmF3X2F1dG8ocmRldik7Ci0KLQkJCS8qIDUgKi8KLQkJCWNwX3NldF9zdXJmYWNlX3N5bmMocmRldiwKLQkJCQkJICAgIFBBQ0tFVDNfQ0JfQUNUSU9OX0VOQSB8IFBBQ0tFVDNfQ0IwX0RFU1RfQkFTRV9FTkEsCi0JCQkJCSAgICBjdXJfc2l6ZSAqIGgsIGRzdF9ncHVfYWRkcik7Ci0KLQkJCXZiICs9IDEyOwotCQkJcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKz0gMTIgKiA0OwotCi0JCQlzcmNfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJZHN0X2dwdV9hZGRyICs9IGN1cl9zaXplICogaDsKLQkJCXNpemVfYnl0ZXMgLT0gY3VyX3NpemUgKiBoOworCQlpZiAoKHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkICsgNDgpID4gcmRldi0+cjYwMF9ibGl0LnZiX3RvdGFsKSB7CisJCQlXQVJOX09OKDEpOwogCQl9Ci0JfSBlbHNlIHsKLQkJbWF4X2J5dGVzID0gODE5MiAqIDQ7CiAKLQkJd2hpbGUgKHNpemVfYnl0ZXMpIHsKLQkJCWludCBjdXJfc2l6ZSA9IHNpemVfYnl0ZXM7Ci0JCQlpbnQgc3JjX3ggPSAoc3JjX2dwdV9hZGRyICYgMjU1KTsKLQkJCWludCBkc3RfeCA9IChkc3RfZ3B1X2FkZHIgJiAyNTUpOwotCQkJaW50IGggPSAxOwotCQkJc3JjX2dwdV9hZGRyID0gc3JjX2dwdV9hZGRyICYgfjI1NVVMTDsKLQkJCWRzdF9ncHVfYWRkciA9IGRzdF9ncHVfYWRkciAmIH4yNTVVTEw7CisJCXZiWzBdID0gMDsKKwkJdmJbMV0gPSAwOworCQl2YlsyXSA9IDA7CisJCXZiWzNdID0gMDsKIAotCQkJaWYgKCFzcmNfeCAmJiAhZHN0X3gpIHsKLQkJCQloID0gKGN1cl9zaXplIC8gbWF4X2J5dGVzKTsKLQkJCQlpZiAoaCA+IDgxOTIpCi0JCQkJCWggPSA4MTkyOwotCQkJCWlmIChoID09IDApCi0JCQkJCWggPSAxOwotCQkJCWVsc2UKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJfc2l6ZSA+IG1heF9ieXRlcykKLQkJCQkJY3VyX3NpemUgPSBtYXhfYnl0ZXM7Ci0JCQkJaWYgKGN1cl9zaXplID4gKG1heF9ieXRlcyAtIGRzdF94KSkKLQkJCQkJY3VyX3NpemUgPSAobWF4X2J5dGVzIC0gZHN0X3gpOwotCQkJCWlmIChjdXJfc2l6ZSA+IChtYXhfYnl0ZXMgLSBzcmNfeCkpCi0JCQkJCWN1cl9zaXplID0gKG1heF9ieXRlcyAtIHNyY194KTsKLQkJCX0KKwkJdmJbNF0gPSAwOworCQl2Yls1XSA9IGkyZihoKTsKKwkJdmJbNl0gPSAwOworCQl2Yls3XSA9IGkyZihoKTsKIAotCQkJaWYgKChyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArIDQ4KSA+IHJkZXYtPnI2MDBfYmxpdC52Yl90b3RhbCkgewotCQkJCVdBUk5fT04oMSk7Ci0JCQl9CisJCXZiWzhdID0gaTJmKHcpOworCQl2Yls5XSA9IGkyZihoKTsKKwkJdmJbMTBdID0gaTJmKHcpOworCQl2YlsxMV0gPSBpMmYoaCk7CiAKLQkJCXZiWzBdID0gaTJmKGRzdF94IC8gNCk7Ci0JCQl2YlsxXSA9IDA7Ci0JCQl2YlsyXSA9IGkyZihzcmNfeCAvIDQpOwotCQkJdmJbM10gPSAwOworCQlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfdGV4X3Jlc291cmNlKHJkZXYsIEZNVF84XzhfOF84LAorCQkJCQkJCSAgICB3LCBoLCB3LCBzcmNfZ3B1X2FkZHIsIHNpemVfaW5fYnl0ZXMpOworCQlyZGV2LT5yNjAwX2JsaXQucHJpbWl0aXZlcy5zZXRfcmVuZGVyX3RhcmdldChyZGV2LCBDT0xPUl84XzhfOF84LAorCQkJCQkJCSAgICAgdywgaCwgZHN0X2dwdV9hZGRyKTsKKwkJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3NjaXNzb3JzKHJkZXYsIDAsIDAsIHcsIGgpOworCQl2Yl9ncHVfYWRkciA9IHJkZXYtPnI2MDBfYmxpdC52Yl9pYi0+Z3B1X2FkZHIgKyByZGV2LT5yNjAwX2JsaXQudmJfdXNlZDsKKwkJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuc2V0X3Z0eF9yZXNvdXJjZShyZGV2LCB2Yl9ncHVfYWRkcik7CisJCXJkZXYtPnI2MDBfYmxpdC5wcmltaXRpdmVzLmRyYXdfYXV0byhyZGV2KTsKKwkJcmRldi0+cjYwMF9ibGl0LnByaW1pdGl2ZXMuY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAorCQkJCSAgICBQQUNLRVQzX0NCX0FDVElPTl9FTkEgfCBQQUNLRVQzX0NCMF9ERVNUX0JBU0VfRU5BLAorCQkJCSAgICBzaXplX2luX2J5dGVzLCBkc3RfZ3B1X2FkZHIpOwogCi0JCQl2Yls0XSA9IGkyZihkc3RfeCAvIDQpOwotCQkJdmJbNV0gPSBpMmYoaCk7Ci0JCQl2Yls2XSA9IGkyZihzcmNfeCAvIDQpOwotCQkJdmJbN10gPSBpMmYoaCk7Ci0KLQkJCXZiWzhdID0gaTJmKChkc3RfeCArIGN1cl9zaXplKSAvIDQpOwotCQkJdmJbOV0gPSBpMmYoaCk7Ci0JCQl2YlsxMF0gPSBpMmYoKHNyY194ICsgY3VyX3NpemUpIC8gNCk7Ci0JCQl2YlsxMV0gPSBpMmYoaCk7Ci0KLQkJCS8qIHNyYyA5ICovCi0JCQlzZXRfdGV4X3Jlc291cmNlKHJkZXYsIEZNVF84XzhfOF84LAotCQkJCQkgKHNyY194ICsgY3VyX3NpemUpIC8gNCwKLQkJCQkJIGgsIChzcmNfeCArIGN1cl9zaXplKSAvIDQsCi0JCQkJCSBzcmNfZ3B1X2FkZHIpOwotCQkJLyogNSAqLwotCQkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAotCQkJCQkgICAgUEFDS0VUM19UQ19BQ1RJT05fRU5BLCAoc3JjX3ggKyBjdXJfc2l6ZSAqIGgpLCBzcmNfZ3B1X2FkZHIpOwotCi0JCQkvKiBkc3QgMjMgKi8KLQkJCXNldF9yZW5kZXJfdGFyZ2V0KHJkZXYsIENPTE9SXzhfOF84XzgsCi0JCQkJCSAgKGRzdF94ICsgY3VyX3NpemUpIC8gNCwgaCwKLQkJCQkJICBkc3RfZ3B1X2FkZHIpOwotCi0JCQkvKiBzY2lzc29ycyAxMiAgKi8KLQkJCXNldF9zY2lzc29ycyhyZGV2LCAoZHN0X3ggLyA0KSwgMCwgKGRzdF94ICsgY3VyX3NpemUgLyA0KSwgaCk7Ci0KLQkJCS8qIFZlcnRleCBidWZmZXIgc2V0dXAgMTQgKi8KLQkJCXZiX2dwdV9hZGRyID0gcmRldi0+cjYwMF9ibGl0LnZiX2liLT5ncHVfYWRkciArIHJkZXYtPnI2MDBfYmxpdC52Yl91c2VkOwotCQkJc2V0X3Z0eF9yZXNvdXJjZShyZGV2LCB2Yl9ncHVfYWRkcik7Ci0KLQkJCS8qIGRyYXcgMTAgKi8KLQkJCWRyYXdfYXV0byhyZGV2KTsKLQotCQkJLyogNSAqLwotCQkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAotCQkJCQkgICAgUEFDS0VUM19DQl9BQ1RJT05fRU5BIHwgUEFDS0VUM19DQjBfREVTVF9CQVNFX0VOQSwKLQkJCQkJICAgIGN1cl9zaXplICogaCwgZHN0X2dwdV9hZGRyKTsKLQotCQkJLyogNzggcmluZyBkd29yZHMgcGVyIGxvb3AgKi8KLQkJCXZiICs9IDEyOwotCQkJcmRldi0+cjYwMF9ibGl0LnZiX3VzZWQgKz0gMTIgKiA0OwotCi0JCQlzcmNfZ3B1X2FkZHIgKz0gY3VyX3NpemUgKiBoOwotCQkJZHN0X2dwdV9hZGRyICs9IGN1cl9zaXplICogaDsKLQkJCXNpemVfYnl0ZXMgLT0gY3VyX3NpemUgKiBoOwotCQl9CisJCXZiICs9IDEyOworCQlyZGV2LT5yNjAwX2JsaXQudmJfdXNlZCArPSA0KjEyOworCQlzcmNfZ3B1X2FkZHIgKz0gc2l6ZV9pbl9ieXRlczsKKwkJZHN0X2dwdV9hZGRyICs9IHNpemVfaW5fYnl0ZXM7CisJCW51bV9ncHVfcGFnZXMgLT0gcGFnZXNfcGVyX2xvb3A7CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcC5jCmluZGV4IDQ1ZmQ1OTIuLmM5ZGI0OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcC5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiAgICAgQWxleCBEZXVjaGVyIDxhbGV4YW5kZXIuZGV1Y2hlckBhbWQuY29tPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJyYWRlb25fZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBfY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCmluZGV4IGNmODNhYTAuLjBhMmUwMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMF9jcy5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlbVl8wMzgwMDRfRk1UXzMyX0FTXzMyXzMyXzMyXzMyXSA9IHsgMSwgMSwgNCwgMCwgQ0hJUF9DRURBUn0sCiB9OwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZm10X2lzX3ZhbGlkX2NvbG9yKHUzMiBmb3JtYXQpCitzdGF0aWMgYm9vbCBmbXRfaXNfdmFsaWRfY29sb3IodTMyIGZvcm1hdCkKIHsKIAlpZiAoZm9ybWF0ID49IEFSUkFZX1NJWkUoY29sb3JfZm9ybWF0c190YWJsZSkpCiAJCXJldHVybiBmYWxzZTsKQEAgLTE3Myw3ICsxNzMsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGZtdF9pc192YWxpZF90ZXh0dXJlKHUzMiBmb3JtYXQsIGVudW0gcmFkZW9uX2ZhbWlseSBmYW1pbHkpCitzdGF0aWMgYm9vbCBmbXRfaXNfdmFsaWRfdGV4dHVyZSh1MzIgZm9ybWF0LCBlbnVtIHJhZGVvbl9mYW1pbHkgZmFtaWx5KQogewogCWlmIChmb3JtYXQgPj0gQVJSQVlfU0laRShjb2xvcl9mb3JtYXRzX3RhYmxlKSkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbXRfZ2V0X2Jsb2Nrc2l6ZSh1MzIgZm9ybWF0KQorc3RhdGljIGludCBmbXRfZ2V0X2Jsb2Nrc2l6ZSh1MzIgZm9ybWF0KQogewogCWlmIChmb3JtYXQgPj0gQVJSQVlfU0laRShjb2xvcl9mb3JtYXRzX3RhYmxlKSkKIAkJcmV0dXJuIDA7CkBAIC0xOTUsNyArMTk1LDcgQEAKIAlyZXR1cm4gY29sb3JfZm9ybWF0c190YWJsZVtmb3JtYXRdLmJsb2Nrc2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZm10X2dldF9uYmxvY2tzeCh1MzIgZm9ybWF0LCB1MzIgdykKK3N0YXRpYyBpbnQgZm10X2dldF9uYmxvY2tzeCh1MzIgZm9ybWF0LCB1MzIgdykKIHsKIAl1bnNpZ25lZCBidzsKIApAQCAtMjA5LDcgKzIwOSw3IEBACiAJcmV0dXJuICh3ICsgYncgLSAxKSAvIGJ3OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbXRfZ2V0X25ibG9ja3N5KHUzMiBmb3JtYXQsIHUzMiBoKQorc3RhdGljIGludCBmbXRfZ2V0X25ibG9ja3N5KHUzMiBmb3JtYXQsIHUzMiBoKQogewogCXVuc2lnbmVkIGJoOwogCkBAIC0yMjMsMjUgKzIyMyw2IEBACiAJcmV0dXJuIChoICsgYmggLSAxKSAvIGJoOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByNjAwX2JwZV9mcm9tX2Zvcm1hdCh1MzIgKmJwZSwgdTMyIGZvcm1hdCkKLXsKLSAJdW5zaWduZWQgcmVzOwotCi0JaWYgKGZvcm1hdCA+PSBBUlJBWV9TSVpFKGNvbG9yX2Zvcm1hdHNfdGFibGUpKQotCQlnb3RvIGZhaWw7Ci0KLQlyZXMgPSBjb2xvcl9mb3JtYXRzX3RhYmxlW2Zvcm1hdF0uYmxvY2tzaXplOwotCWlmIChyZXMgPT0gMCkKLQkJZ290byBmYWlsOwotCi0JKmJwZSA9IHJlczsKLQlyZXR1cm4gMDsKLQotZmFpbDoKLQkqYnBlID0gMTY7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0cnVjdCBhcnJheV9tb2RlX2NoZWNrZXIgewogCWludCBhcnJheV9tb2RlOwogCXUzMiBncm91cF9zaXplOwpAQCAtMjUyLDcgKzIzMyw3IEBACiB9OwogCiAvKiByZXR1cm5zIGFsaWdubWVudCBpbiBwaXhlbHMgZm9yIHBpdGNoL2hlaWdodC9kZXB0aCBhbmQgYnl0ZXMgZm9yIGJhc2UgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHI2MDBfZ2V0X2FycmF5X21vZGVfYWxpZ25tZW50KHN0cnVjdCBhcnJheV9tb2RlX2NoZWNrZXIgKnZhbHVlcywKK3N0YXRpYyBpbnQgcjYwMF9nZXRfYXJyYXlfbW9kZV9hbGlnbm1lbnQoc3RydWN0IGFycmF5X21vZGVfY2hlY2tlciAqdmFsdWVzLAogCQkJCQkJdTMyICpwaXRjaF9hbGlnbiwKIAkJCQkJCXUzMiAqaGVpZ2h0X2FsaWduLAogCQkJCQkJdTMyICpkZXB0aF9hbGlnbiwKQEAgLTMzMSw3ICszMTIsNyBAQAogCXRyYWNrLT5kYl9kZXB0aF9jb250cm9sID0gMHhGRkZGRkZGRjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcjYwMF9jc190cmFja192YWxpZGF0ZV9jYihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgaW50IGkpCitzdGF0aWMgaW50IHI2MDBfY3NfdHJhY2tfdmFsaWRhdGVfY2Ioc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBpKQogewogCXN0cnVjdCByNjAwX2NzX3RyYWNrICp0cmFjayA9IHAtPnRyYWNrOwogCXUzMiBzbGljZV90aWxlX21heCwgc2l6ZSwgdG1wOwpAQCAtNzM3LDcgKzcxOCw3IEBACiAgKiBDaGVjayBuZXh0IHBhY2tldCBpcyByZWxvY2F0aW9uIHBhY2tldDMsIGRvIGJvIHZhbGlkYXRpb24gYW5kIGNvbXB1dGUKICAqIEdQVSBvZmZzZXQgdXNpbmcgdGhlIHByb3ZpZGVkIHN0YXJ0LgogICoqLwotc3RhdGljIGlubGluZSBpbnQgcjYwMF9jc19wYWNrZXRfbmV4dF9pc19wa3QzX25vcChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCkKK3N0YXRpYyBpbnQgcjYwMF9jc19wYWNrZXRfbmV4dF9pc19wa3QzX25vcChzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCkKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwM3JlbG9jOwogCWludCByOwpAQCAtOTExLDcgKzg5Miw3IEBACiAgKiBpZiByZWdpc3RlciBpcyBzYWZlLiBJZiByZWdpc3RlciBpcyBub3QgZmxhZyBhcyBzYWZlIHRoaXMgZnVuY3Rpb24KICAqIHdpbGwgdGVzdCBpdCBhZ2FpbnN0IGEgbGlzdCBvZiByZWdpc3RlciBuZWVkaW5kIHNwZWNpYWwgaGFuZGxpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHI2MDBfY3NfY2hlY2tfcmVnKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCB1MzIgcmVnLCB1MzIgaWR4KQorc3RhdGljIGludCByNjAwX2NzX2NoZWNrX3JlZyhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgdTMyIHJlZywgdTMyIGlkeCkKIHsKIAlzdHJ1Y3QgcjYwMF9jc190cmFjayAqdHJhY2sgPSAoc3RydWN0IHI2MDBfY3NfdHJhY2sgKilwLT50cmFjazsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3JlbG9jICpyZWxvYzsKQEAgLTEyMTUsNyArMTE5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWlwX21pbmlmeSh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBsZXZlbCkKK3N0YXRpYyB1bnNpZ25lZCBtaXBfbWluaWZ5KHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGxldmVsKQogewogCXVuc2lnbmVkIHZhbDsKIApAQCAtMTI4NSw3ICsxMjY2LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayB0aGF0IHRoZSByZXNvdXJjZSBoYXMgdmFsaWQgZmllbGQgYW5kIHRoYXQKICAqIHRoZSB0ZXh0dXJlIGFuZCBtaXBtYXAgYm8gb2JqZWN0IGFyZSBiaWcgZW5vdWdoIHRvIGNvdmVyIHRoaXMgcmVzb3VyY2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHI2MDBfY2hlY2tfdGV4dHVyZV9yZXNvdXJjZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgIHUzMiBpZHgsCitzdGF0aWMgaW50IHI2MDBfY2hlY2tfdGV4dHVyZV9yZXNvdXJjZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgIHUzMiBpZHgsCiAJCQkJCSAgICAgIHN0cnVjdCByYWRlb25fYm8gKnRleHR1cmUsCiAJCQkJCSAgICAgIHN0cnVjdCByYWRlb25fYm8gKm1pcG1hcCwKIAkJCQkJICAgICAgdTY0IGJhc2Vfb2Zmc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCmluZGV4IDAyNDVhZTYuLmJmZTFiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTc5LDYgKzc5LDExIEBACiAjZGVmaW5lIENCX0NPTE9SMF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgwNjAKICNkZWZpbmUgQ0JfQ09MT1IwX1ZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODA4MAogI2RlZmluZSBDQl9DT0xPUjBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MGEwCisjCWRlZmluZSBDQl9GT1JNQVQoeCkJCQkJKCh4KSA8PCAyKQorIyAgICAgICBkZWZpbmUgQ0JfQVJSQVlfTU9ERSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDgpCisjCWRlZmluZSBDQl9TT1VSQ0VfRk9STUFUKHgpCQkJKCh4KSA8PCAyNykKKyMJZGVmaW5lIENCX1NGX0VYUE9SVF9GVUxMCQkJMAorIwlkZWZpbmUgQ0JfU0ZfRVhQT1JUX05PUk0JCQkxCiAjZGVmaW5lIENCX0NPTE9SMF9USUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgwYzAKICNkZWZpbmUgQ0JfQ09MT1IwX0ZSQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODBlMAogI2RlZmluZSBDQl9DT0xPUjBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MTAwCkBAIC00MTcsNiArNDIyLDE3IEBACiAjZGVmaW5lCVNRX1BHTV9TVEFSVF9WUwkJCQkJMHgyODg1OAogI2RlZmluZSBTUV9QR01fUkVTT1VSQ0VTX1ZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4ODY4CiAjZGVmaW5lIFNRX1BHTV9DRl9PRkZTRVRfVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Mjg4ZDAKKworI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDBfMAkJCQkweDMwMDAwCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEMV8wCQkJCTB4MzAwMDQKKyNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQyXzAJCQkJMHgzMDAwOAorIwlkZWZpbmUgU1FfVlRYQ19CQVNFX0FERFJfSEkoeCkJCQkoKHgpIDw8IDApCisjCWRlZmluZSBTUV9WVFhDX1NUUklERSh4KQkJCSgoeCkgPDwgOCkKKyMJZGVmaW5lIFNRX1ZUWENfRU5ESUFOX1NXQVAoeCkJCQkoKHgpIDw8IDMwKQorIwlkZWZpbmUgU1FfRU5ESUFOX05PTkUJCQkJMAorIwlkZWZpbmUgU1FfRU5ESUFOXzhJTjE2CQkJCTEKKyMJZGVmaW5lIFNRX0VORElBTl84SU4zMgkJCQkyCisjZGVmaW5lIFNRX1ZUWF9DT05TVEFOVF9XT1JEM18wCQkJCTB4MzAwMGMKICNkZWZpbmUJU1FfVlRYX0NPTlNUQU5UX1dPUkQ2XzAJCQkJMHgzODAxOAogI2RlZmluZQkJU19fU1FfVlRYX0NPTlNUQU5UX1RZUEUoeCkJCQkoKCh4KSAmIDMpIDw8IDMwKQogI2RlZmluZQkJR19fU1FfVlRYX0NPTlNUQU5UX1RZUEUoeCkJCQkoKCh4KSA+PiAzMCkgJiAzKQpAQCAtMTM1Miw2ICsxMzY4LDEyIEBACiAjZGVmaW5lICAgU18wMzgwMTBfRFNUX1NFTF9XKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDI1KQogI2RlZmluZSAgIEdfMDM4MDEwX0RTVF9TRUxfVyh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI1KSAmIDB4NykKICNkZWZpbmUgICBDXzAzODAxMF9EU1RfU0VMX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweEYxRkZGRkZGCisjCWRlZmluZSBTUV9TRUxfWAkJCQkJMAorIwlkZWZpbmUgU1FfU0VMX1kJCQkJCTEKKyMJZGVmaW5lIFNRX1NFTF9aCQkJCQkyCisjCWRlZmluZSBTUV9TRUxfVwkJCQkJMworIwlkZWZpbmUgU1FfU0VMXzAJCQkJCTQKKyMJZGVmaW5lIFNRX1NFTF8xCQkJCQk1CiAjZGVmaW5lICAgU18wMzgwMTBfQkFTRV9MRVZFTCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweEYpIDw8IDI4KQogI2RlZmluZSAgIEdfMDM4MDEwX0JBU0VfTEVWRUwoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDI4KSAmIDB4RikKICNkZWZpbmUgICBDXzAzODAxMF9CQVNFX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRkZGRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAppbmRleCBjMWUwNTZiLi5mYzVhMWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKQEAgLTkzLDYgKzkzLDcgQEAKIGV4dGVybiBpbnQgcmFkZW9uX2Rpc3BfcHJpb3JpdHk7CiBleHRlcm4gaW50IHJhZGVvbl9od19pMmM7CiBleHRlcm4gaW50IHJhZGVvbl9wY2llX2dlbjI7CitleHRlcm4gaW50IHJhZGVvbl9tc2k7CiAKIC8qCiAgKiBDb3B5IGZyb20gcmFkZW9uX2Rydi5oIHNvIHdlIGRvbid0IGhhdmUgdG8gaW5jbHVkZSBib3RoIGFuZCBoYXZlIGNvbmZsaWN0aW5nCkBAIC0xMDIsNyArMTAzLDcgQEAKICNkZWZpbmUgUkFERU9OX0ZFTkNFX0pJRkZJRVNfVElNRU9VVAkoSFogLyAyKQogLyogUkFERU9OX0lCX1BPT0xfU0laRSBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBSQURFT05fSUJfUE9PTF9TSVpFCQkxNgotI2RlZmluZSBSQURFT05fREVCVUdGU19NQVhfTlVNX0ZJTEVTCTMyCisjZGVmaW5lIFJBREVPTl9ERUJVR0ZTX01BWF9DT01QT05FTlRTCTMyCiAjZGVmaW5lIFJBREVPTkZCX0NPTk5fTElNSVQJCTQKICNkZWZpbmUgUkFERU9OX0JJT1NfTlVNX1NDUkFUQ0gJCTgKIApAQCAtMzA2LDMwICszMDcsMTcgQEAKICAqLwogc3RydWN0IHJhZGVvbl9tYzsKIAotc3RydWN0IHJhZGVvbl9nYXJ0X3RhYmxlX3JhbSB7Ci0Jdm9sYXRpbGUgdWludDMyX3QJCSpwdHI7Ci19OwotCi1zdHJ1Y3QgcmFkZW9uX2dhcnRfdGFibGVfdnJhbSB7Ci0Jc3RydWN0IHJhZGVvbl9ibwkJKnJvYmo7Ci0Jdm9sYXRpbGUgdWludDMyX3QJCSpwdHI7Ci19OwotCi11bmlvbiByYWRlb25fZ2FydF90YWJsZSB7Ci0Jc3RydWN0IHJhZGVvbl9nYXJ0X3RhYmxlX3JhbQlyYW07Ci0Jc3RydWN0IHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW0JdnJhbTsKLX07Ci0KICNkZWZpbmUgUkFERU9OX0dQVV9QQUdFX1NJWkUgNDA5NgogI2RlZmluZSBSQURFT05fR1BVX1BBR0VfTUFTSyAoUkFERU9OX0dQVV9QQUdFX1NJWkUgLSAxKQogI2RlZmluZSBSQURFT05fR1BVX1BBR0VfU0hJRlQgMTIKIAogc3RydWN0IHJhZGVvbl9nYXJ0IHsKIAlkbWFfYWRkcl90CQkJdGFibGVfYWRkcjsKKwlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKKwl2b2lkCQkJCSpwdHI7CiAJdW5zaWduZWQJCQludW1fZ3B1X3BhZ2VzOwogCXVuc2lnbmVkCQkJbnVtX2NwdV9wYWdlczsKIAl1bnNpZ25lZAkJCXRhYmxlX3NpemU7Ci0JdW5pb24gcmFkZW9uX2dhcnRfdGFibGUJCXRhYmxlOwogCXN0cnVjdCBwYWdlCQkJKipwYWdlczsKIAlkbWFfYWRkcl90CQkJKnBhZ2VzX2FkZHI7CiAJYm9vbAkJCQkqdHRtX2FsbG9jZWQ7CkBAIC0zNDAsNiArMzI4LDggQEAKIHZvaWQgcmFkZW9uX2dhcnRfdGFibGVfcmFtX2ZyZWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fYWxsb2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fZ2FydF90YWJsZV92cmFtX2ZyZWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fcGluKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcmFkZW9uX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25fZ2FydF91bmJpbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIG9mZnNldCwKQEAgLTM0Nyw2ICszMzcsNyBAQAogaW50IHJhZGVvbl9nYXJ0X2JpbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIG9mZnNldCwKIAkJICAgICBpbnQgcGFnZXMsIHN0cnVjdCBwYWdlICoqcGFnZWxpc3QsCiAJCSAgICAgZG1hX2FkZHJfdCAqZG1hX2FkZHIpOwordm9pZCByYWRlb25fZ2FydF9yZXN0b3JlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogCiAvKgpAQCAtNDM3LDI1ICs0MjgsMjYgQEAKIAlzdHJ1Y3QgZXZlcmdyZWVuX2lycV9zdGF0X3JlZ3MgZXZlcmdyZWVuOwogfTsKIAorI2RlZmluZSBSQURFT05fTUFYX0hQRF9QSU5TIDYKKyNkZWZpbmUgUkFERU9OX01BWF9DUlRDUyA2CisjZGVmaW5lIFJBREVPTl9NQVhfSERNSV9CTE9DS1MgMgorCiBzdHJ1Y3QgcmFkZW9uX2lycSB7CiAJYm9vbAkJaW5zdGFsbGVkOwogCWJvb2wJCXN3X2ludDsKLQkvKiBGSVhNRTogdXNlIGEgZGVmaW5lIG1heCBjcnRjIHJhdGhlciB0aGFuIGhhcmRjb2RlIGl0ICovCi0JYm9vbAkJY3J0Y192YmxhbmtfaW50WzZdOwotCWJvb2wJCXBmbGlwWzZdOworCWJvb2wJCWNydGNfdmJsYW5rX2ludFtSQURFT05fTUFYX0NSVENTXTsKKwlib29sCQlwZmxpcFtSQURFT05fTUFYX0NSVENTXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAl2YmxhbmtfcXVldWU7Ci0JLyogRklYTUU6IHVzZSBkZWZpbmVzIGZvciBtYXggaHBkL2RhY3MgKi8KLQlib29sICAgICAgICAgICAgaHBkWzZdOworCWJvb2wgICAgICAgICAgICBocGRbUkFERU9OX01BWF9IUERfUElOU107CiAJYm9vbCAgICAgICAgICAgIGd1aV9pZGxlOwogCWJvb2wgICAgICAgICAgICBndWlfaWRsZV9hY2tlZDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlpZGxlX3F1ZXVlOwotCS8qIEZJWE1FOiB1c2UgZGVmaW5lcyBmb3IgbWF4IEhETUkgYmxvY2tzICovCi0JYm9vbAkJaGRtaVsyXTsKKwlib29sCQloZG1pW1JBREVPTl9NQVhfSERNSV9CTE9DS1NdOwogCXNwaW5sb2NrX3Qgc3dfbG9jazsKIAlpbnQgc3dfcmVmY291bnQ7CiAJdW5pb24gcmFkZW9uX2lycV9zdGF0X3JlZ3Mgc3RhdF9yZWdzOwotCXNwaW5sb2NrX3QgcGZsaXBfbG9ja1s2XTsKLQlpbnQgcGZsaXBfcmVmY291bnRbNl07CisJc3BpbmxvY2tfdCBwZmxpcF9sb2NrW1JBREVPTl9NQVhfQ1JUQ1NdOworCWludCBwZmxpcF9yZWZjb3VudFtSQURFT05fTUFYX0NSVENTXTsKIH07CiAKIGludCByYWRlb25faXJxX2ttc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTUyMyw5ICs1MTUsMzAgQEAKIAlib29sICAgICAgICAgICAgICAgICAgICBlbmFibGVkOwogfTsKIAorc3RydWN0IHI2MDBfYmxpdF9jcF9wcmltaXRpdmVzIHsKKwl2b2lkICgqc2V0X3JlbmRlcl90YXJnZXQpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgZm9ybWF0LAorCQkJCSAgaW50IHcsIGludCBoLCB1NjQgZ3B1X2FkZHIpOworCXZvaWQgKCpjcF9zZXRfc3VyZmFjZV9zeW5jKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQkgICAgdTMyIHN5bmNfdHlwZSwgdTMyIHNpemUsCisJCQkJICAgIHU2NCBtY19hZGRyKTsKKwl2b2lkICgqc2V0X3NoYWRlcnMpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwl2b2lkICgqc2V0X3Z0eF9yZXNvdXJjZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHU2NCBncHVfYWRkcik7CisJdm9pZCAoKnNldF90ZXhfcmVzb3VyY2UpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCSBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgsIGludCBwaXRjaCwKKwkJCQkgdTY0IGdwdV9hZGRyLCB1MzIgc2l6ZSk7CisJdm9pZCAoKnNldF9zY2lzc29ycykoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCB4MSwgaW50IHkxLAorCQkJICAgICBpbnQgeDIsIGludCB5Mik7CisJdm9pZCAoKmRyYXdfYXV0bykoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCXZvaWQgKCpzZXRfZGVmYXVsdF9zdGF0ZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworfTsKKwogc3RydWN0IHI2MDBfYmxpdCB7CiAJc3RydWN0IG11dGV4CQltdXRleDsKIAlzdHJ1Y3QgcmFkZW9uX2JvCSpzaGFkZXJfb2JqOworCXN0cnVjdCByNjAwX2JsaXRfY3BfcHJpbWl0aXZlcyBwcmltaXRpdmVzOworCWludCBtYXhfZGltOworCWludCByaW5nX3NpemVfY29tbW9uOworCWludCByaW5nX3NpemVfcGVyX2xvb3A7CiAJdTY0IHNoYWRlcl9ncHVfYWRkcjsKIAl1MzIgdnNfb2Zmc2V0LCBwc19vZmZzZXQ7CiAJdTMyIHN0YXRlX29mZnNldDsKQEAgLTUzNCw2ICs1NDcsOCBAQAogCXN0cnVjdCByYWRlb25faWIgKnZiX2liOwogfTsKIAordm9pZCByNjAwX2JsaXRfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKIGludCByYWRlb25faWJfZ2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX2liICoqaWIpOwogdm9pZCByYWRlb25faWJfZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9pYiAqKmliKTsKIGludCByYWRlb25faWJfc2NoZWR1bGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25faWIgKmliKTsKQEAgLTYwMSwzMiArNjE2LDcgQEAKIAogZXh0ZXJuIGludCByYWRlb25fY3NfdXBkYXRlX3BhZ2VzKHN0cnVjdCByYWRlb25fY3NfcGFyc2VyICpwLCBpbnQgcGdfaWR4KTsKIGV4dGVybiBpbnQgcmFkZW9uX2NzX2ZpbmlzaF9wYWdlcyhzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCk7Ci0KLQotc3RhdGljIGlubGluZSB1MzIgcmFkZW9uX2dldF9pYl92YWx1ZShzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlciAqcCwgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYmMgPSAmcC0+Y2h1bmtzW3AtPmNodW5rX2liX2lkeF07Ci0JdTMyIHBnX2lkeCwgcGdfb2Zmc2V0OwotCXUzMiBpZHhfdmFsdWUgPSAwOwotCWludCBuZXdfcGFnZTsKLQotCXBnX2lkeCA9IChpZHggKiA0KSAvIFBBR0VfU0laRTsKLQlwZ19vZmZzZXQgPSAoaWR4ICogNCkgJSBQQUdFX1NJWkU7Ci0KLQlpZiAoaWJjLT5rcGFnZV9pZHhbMF0gPT0gcGdfaWR4KQotCQlyZXR1cm4gaWJjLT5rcGFnZVswXVtwZ19vZmZzZXQvNF07Ci0JaWYgKGliYy0+a3BhZ2VfaWR4WzFdID09IHBnX2lkeCkKLQkJcmV0dXJuIGliYy0+a3BhZ2VbMV1bcGdfb2Zmc2V0LzRdOwotCi0JbmV3X3BhZ2UgPSByYWRlb25fY3NfdXBkYXRlX3BhZ2VzKHAsIHBnX2lkeCk7Ci0JaWYgKG5ld19wYWdlIDwgMCkgewotCQlwLT5wYXJzZXJfZXJyb3IgPSBuZXdfcGFnZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWR4X3ZhbHVlID0gaWJjLT5rcGFnZVtuZXdfcGFnZV1bcGdfb2Zmc2V0LzRdOwotCXJldHVybiBpZHhfdmFsdWU7Ci19CitleHRlcm4gdTMyIHJhZGVvbl9nZXRfaWJfdmFsdWUoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBpZHgpOwogCiBzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCB7CiAJdW5zaWduZWQJaWR4OwpAQCAtNzk0LDggKzc4NCw3IEBACiAKIHN0cnVjdCByYWRlb25fcG93ZXJfc3RhdGUgewogCWVudW0gcmFkZW9uX3BtX3N0YXRlX3R5cGUgdHlwZTsKLQkvKiBYWFg6IHVzZSBhIGRlZmluZSBmb3IgbnVtIGNsb2NrIG1vZGVzICovCi0Jc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvIGNsb2NrX2luZm9bOF07CisJc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvICpjbG9ja19pbmZvOwogCS8qIG51bWJlciBvZiB2YWxpZCBjbG9jayBtb2RlcyBpbiB0aGlzIHBvd2VyIHN0YXRlICovCiAJaW50IG51bV9jbG9ja19tb2RlczsKIAlzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8gKmRlZmF1bHRfY2xvY2tfbW9kZTsKQEAgLTg2NSwxMSArODU0LDE0IEBACiAJc3RydWN0IGRldmljZQkgICAgICAgICppbnRfaHdtb25fZGV2OwogfTsKIAoraW50IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICAgZW51bSByYWRlb25fcG1fc3RhdGVfdHlwZSBwc190eXBlLAorCQkJICAgICBpbnQgaW5zdGFuY2UpOwogCiAvKgogICogQmVuY2htYXJraW5nCiAgKi8KLXZvaWQgcmFkZW9uX2JlbmNobWFyayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJhZGVvbl9iZW5jaG1hcmsoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCB0ZXN0X251bWJlcik7CiAKIAogLyoKQEAgLTExNDUsMTIgKzExMzcsNTUgQEAKIGludCByYWRlb25fZ2VtX2dldF90aWxpbmdfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHApOwogCi0vKiBWUkFNIHNjcmF0Y2ggcGFnZSBmb3IgSERQIGJ1ZyAqLwotc3RydWN0IHI3MDBfdnJhbV9zY3JhdGNoIHsKKy8qIFZSQU0gc2NyYXRjaCBwYWdlIGZvciBIRFAgYnVnLCBkZWZhdWx0IHZyYW0gcGFnZSAqLworc3RydWN0IHI2MDBfdnJhbV9zY3JhdGNoIHsKIAlzdHJ1Y3QgcmFkZW9uX2JvCQkqcm9iajsKIAl2b2xhdGlsZSB1aW50MzJfdAkJKnB0cjsKKwl1NjQJCQkJZ3B1X2FkZHI7CiB9OwogCisKKy8qCisgKiBNdXRleCB3aGljaCBhbGxvd3MgcmVjdXJzaXZlIGxvY2tpbmcgZnJvbSB0aGUgc2FtZSBwcm9jZXNzLgorICovCitzdHJ1Y3QgcmFkZW9uX211dGV4IHsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OworCXN0cnVjdCB0YXNrX3N0cnVjdAkqb3duZXI7CisJaW50CQkJbGV2ZWw7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX211dGV4X2luaXQoc3RydWN0IHJhZGVvbl9tdXRleCAqbXV0ZXgpCit7CisJbXV0ZXhfaW5pdCgmbXV0ZXgtPm11dGV4KTsKKwltdXRleC0+b3duZXIgPSBOVUxMOworCW11dGV4LT5sZXZlbCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fbXV0ZXhfbG9jayhzdHJ1Y3QgcmFkZW9uX211dGV4ICptdXRleCkKK3sKKwlpZiAobXV0ZXhfdHJ5bG9jaygmbXV0ZXgtPm11dGV4KSkgeworCQkvKiBUaGUgbXV0ZXggd2FzIHVubG9ja2VkIGJlZm9yZSwgc28gaXQncyBvdXJzIG5vdyAqLworCQltdXRleC0+b3duZXIgPSBjdXJyZW50OworCX0gZWxzZSBpZiAobXV0ZXgtPm93bmVyICE9IGN1cnJlbnQpIHsKKwkJLyogQW5vdGhlciBwcm9jZXNzIGxvY2tlZCB0aGUgbXV0ZXgsIHRha2UgaXQgKi8KKwkJbXV0ZXhfbG9jaygmbXV0ZXgtPm11dGV4KTsKKwkJbXV0ZXgtPm93bmVyID0gY3VycmVudDsKKwl9CisJLyogT3RoZXJ3aXNlIHRoZSBtdXRleCB3YXMgYWxyZWFkeSBsb2NrZWQgYnkgdGhpcyBwcm9jZXNzICovCisKKwltdXRleC0+bGV2ZWwrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhZGVvbl9tdXRleF91bmxvY2soc3RydWN0IHJhZGVvbl9tdXRleCAqbXV0ZXgpCit7CisJaWYgKC0tbXV0ZXgtPmxldmVsID4gMCkKKwkJcmV0dXJuOworCisJbXV0ZXgtPm93bmVyID0gTlVMTDsKKwltdXRleF91bmxvY2soJm11dGV4LT5tdXRleCk7Cit9CisKKwogLyoKICAqIENvcmUgc3RydWN0dXJlLCBmdW5jdGlvbnMgYW5kIGhlbHBlcnMuCiAgKi8KQEAgLTEyMDYsNyArMTI0MSw3IEBACiAJc3RydWN0IHJhZGVvbl9nZW0JCWdlbTsKIAlzdHJ1Y3QgcmFkZW9uX3BtCQlwbTsKIAl1aW50MzJfdAkJCWJpb3Nfc2NyYXRjaFtSQURFT05fQklPU19OVU1fU0NSQVRDSF07Ci0Jc3RydWN0IG11dGV4CQkJY3NfbXV0ZXg7CisJc3RydWN0IHJhZGVvbl9tdXRleAkJY3NfbXV0ZXg7CiAJc3RydWN0IHJhZGVvbl93YgkJd2I7CiAJc3RydWN0IHJhZGVvbl9kdW1teV9wYWdlCWR1bW15X3BhZ2U7CiAJYm9vbAkJCQlncHVfbG9ja3VwOwpAQCAtMTIyMCw3ICsxMjU1LDcgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnJsY19mdzsJLyogcjYvNzAwIFJMQyBmaXJtd2FyZSAqLwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbWNfZnc7CS8qIE5JIE1DIGZpcm13YXJlICovCiAJc3RydWN0IHI2MDBfYmxpdCByNjAwX2JsaXQ7Ci0Jc3RydWN0IHI3MDBfdnJhbV9zY3JhdGNoIHZyYW1fc2NyYXRjaDsKKwlzdHJ1Y3QgcjYwMF92cmFtX3NjcmF0Y2ggdnJhbV9zY3JhdGNoOwogCWludCBtc2lfZW5hYmxlZDsgLyogbXNpIGVuYWJsZWQgKi8KIAlzdHJ1Y3QgcjYwMF9paCBpaDsgLyogcjYvNzAwIGludGVycnVwdCByaW5nICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKQEAgLTEyNTIsNDUgKzEyODcsMTAgQEAKIHZvaWQgcmFkZW9uX2RldmljZV9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByYWRlb25fZ3B1X3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IHIxMDBfbW1fcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKQotewotCWlmIChyZWcgPCByZGV2LT5ybW1pb19zaXplKQotCQlyZXR1cm4gcmVhZGwoKHJkZXYtPnJtbWlvKSArIHJlZyk7Ci0JZWxzZSB7Ci0JCXdyaXRlbChyZWcsIChyZGV2LT5ybW1pbykgKyBSQURFT05fTU1fSU5ERVgpOwotCQlyZXR1cm4gcmVhZGwoKHJkZXYtPnJtbWlvKSArIFJBREVPTl9NTV9EQVRBKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByMTAwX21tX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdikKLXsKLQlpZiAocmVnIDwgcmRldi0+cm1taW9fc2l6ZSkKLQkJd3JpdGVsKHYsIChyZGV2LT5ybW1pbykgKyByZWcpOwotCWVsc2UgewotCQl3cml0ZWwocmVnLCAocmRldi0+cm1taW8pICsgUkFERU9OX01NX0lOREVYKTsKLQkJd3JpdGVsKHYsIChyZGV2LT5ybW1pbykgKyBSQURFT05fTU1fREFUQSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHUzMiByMTAwX2lvX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcpCi17Ci0JaWYgKHJlZyA8IHJkZXYtPnJpb19tZW1fc2l6ZSkKLQkJcmV0dXJuIGlvcmVhZDMyKHJkZXYtPnJpb19tZW0gKyByZWcpOwotCWVsc2UgewotCQlpb3dyaXRlMzIocmVnLCByZGV2LT5yaW9fbWVtICsgUkFERU9OX01NX0lOREVYKTsKLQkJcmV0dXJuIGlvcmVhZDMyKHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fREFUQSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcjEwMF9pb193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnLCB1MzIgdikKLXsKLQlpZiAocmVnIDwgcmRldi0+cmlvX21lbV9zaXplKQotCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIHJlZyk7Ci0JZWxzZSB7Ci0JCWlvd3JpdGUzMihyZWcsIHJkZXYtPnJpb19tZW0gKyBSQURFT05fTU1fSU5ERVgpOwotCQlpb3dyaXRlMzIodiwgcmRldi0+cmlvX21lbSArIFJBREVPTl9NTV9EQVRBKTsKLQl9Ci19Cit1aW50MzJfdCByMTAwX21tX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7Cit2b2lkIHIxMDBfbW1fd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2KTsKK3UzMiByMTAwX2lvX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcpOwordm9pZCByMTAwX2lvX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcsIHUzMiB2KTsKIAogLyoKICAqIENhc3QgaGVscGVyCkBAIC0xNDEzLDE5ICsxNDEzLDE5IEBACiAvKgogICogUklORyBoZWxwZXJzLgogICovCisKKyNpZiBEUk1fREVCVUdfQ09ERSA9PSAwCiBzdGF0aWMgaW5saW5lIHZvaWQgcmFkZW9uX3Jpbmdfd3JpdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHYpCiB7Ci0jaWYgRFJNX0RFQlVHX0NPREUKLQlpZiAocmRldi0+Y3AuY291bnRfZHcgPD0gMCkgewotCQlEUk1fRVJST1IoInJhZGVvbjogd3JpdHRpbmcgbW9yZSBkd29yZCB0byByaW5nIHRoYW4gZXhwZWN0ZWQgIVxuIik7Ci0JfQotI2VuZGlmCiAJcmRldi0+Y3AucmluZ1tyZGV2LT5jcC53cHRyKytdID0gdjsKIAlyZGV2LT5jcC53cHRyICY9IHJkZXYtPmNwLnB0cl9tYXNrOwogCXJkZXYtPmNwLmNvdW50X2R3LS07CiAJcmRldi0+Y3AucmluZ19mcmVlX2R3LS07CiB9Ci0KKyNlbHNlCisvKiBXaXRoIGRlYnVnZ2luZyB0aGlzIGlzIGp1c3QgdG9vIGJpZyB0byBpbmxpbmUgKi8KK3ZvaWQgcmFkZW9uX3Jpbmdfd3JpdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHYpOworI2VuZGlmCiAKIC8qCiAgKiBBU0lDcyBtYWNyby4KQEAgLTE0NzksOCArMTQ3OSw2IEBACiAvKiBBR1AgKi8KIGV4dGVybiBpbnQgcmFkZW9uX2dwdV9yZXNldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByYWRlb25fYWdwX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCByYWRlb25fZ2FydF90YWJsZV92cmFtX3BpbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByYWRlb25fZ2FydF9yZXN0b3JlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX21vZGVzZXRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByYWRlb25fbW9kZXNldF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBib29sIHJhZGVvbl9jYXJkX3Bvc3RlZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC0xNTA0LDYgKzE1MDIsMTIgQEAKIGV4dGVybiB2b2lkIHJhZGVvbl90dG1fc2V0X2FjdGl2ZV92cmFtX3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHU2NCBzaXplKTsKIAogLyoKKyAqIFI2MDAgdnJhbSBzY3JhdGNoIGZ1bmN0aW9ucworICovCitpbnQgcjYwMF92cmFtX3NjcmF0Y2hfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHI2MDBfdnJhbV9zY3JhdGNoX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCisvKgogICogcjYwMCBmdW5jdGlvbnMgdXNlZCBieSByYWRlb25fZW5jb2Rlci5jCiAgKi8KIGV4dGVybiB2b2lkIHI2MDBfaGRtaV9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwppbmRleCBkZjgyMThiLi5hMmUxZWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCkBAIC03NjUsOSArNzY1LDkgQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCiAJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKIAkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAotCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9ibGl0ID0gJnI2MDBfY29weV9ibGl0LAogCS5jb3B5X2RtYSA9IE5VTEwsCi0JLmNvcHkgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZyNjAwX2NvcHlfYmxpdCwKIAkuZ2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfZW5naW5lX2Nsb2NrLAogCS5zZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9lbmdpbmVfY2xvY2ssCiAJLmdldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X21lbW9yeV9jbG9jaywKQEAgLTgxMiw5ICs4MTIsOSBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmZXZlcmdyZWVuX2dldF92YmxhbmtfY291bnRlciwKIAkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAogCS5jc19wYXJzZSA9ICZldmVyZ3JlZW5fY3NfcGFyc2UsCi0JLmNvcHlfYmxpdCA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5X2JsaXQgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmNvcHlfZG1hID0gTlVMTCwKLQkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5ID0gJnI2MDBfY29weV9ibGl0LAogCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9IE5VTEwsCkBAIC04MzQsNyArODM0LDcgQEAKIAkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKIAkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKIAkucG1fZmluaXNoID0gJmV2ZXJncmVlbl9wbV9maW5pc2gsCi0JLnBtX2luaXRfcHJvZmlsZSA9ICZyczc4MF9wbV9pbml0X3Byb2ZpbGUsCisJLnBtX2luaXRfcHJvZmlsZSA9ICZzdW1vX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnI2MDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAogCS5wcmVfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwLAogCS5wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3BhZ2VfZmxpcCwKQEAgLTg1OSw5ICs4NTksOSBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmZXZlcmdyZWVuX2dldF92YmxhbmtfY291bnRlciwKIAkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAogCS5jc19wYXJzZSA9ICZldmVyZ3JlZW5fY3NfcGFyc2UsCi0JLmNvcHlfYmxpdCA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5X2JsaXQgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmNvcHlfZG1hID0gTlVMTCwKLQkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5ID0gJnI2MDBfY29weV9ibGl0LAogCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLApAQCAtOTA2LDkgKzkwNiw5IEBACiAJLmdldF92YmxhbmtfY291bnRlciA9ICZldmVyZ3JlZW5fZ2V0X3ZibGFua19jb3VudGVyLAogCS5mZW5jZV9yaW5nX2VtaXQgPSAmcjYwMF9mZW5jZV9yaW5nX2VtaXQsCiAJLmNzX3BhcnNlID0gJmV2ZXJncmVlbl9jc19wYXJzZSwKLQkuY29weV9ibGl0ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHlfYmxpdCA9ICZyNjAwX2NvcHlfYmxpdCwKIAkuY29weV9kbWEgPSBOVUxMLAotCS5jb3B5ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHkgPSAmcjYwMF9jb3B5X2JsaXQsCiAJLmdldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X2VuZ2luZV9jbG9jaywKIAkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAogCS5nZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9tZW1vcnlfY2xvY2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKaW5kZXggM2RlZGFhMC4uNTk5MTQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaApAQCAtMzY0LDExICszNjQsMTEgQEAKIGludCByNjAwX2hkbWlfYnVmZmVyX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiB2b2lkIHI2MDBfaGRtaV91cGRhdGVfYXVkaW9fc2V0dGluZ3Moc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIC8qIHI2MDAgYmxpdCAqLwotaW50IHI2MDBfYmxpdF9wcmVwYXJlX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBzaXplX2J5dGVzKTsKK2ludCByNjAwX2JsaXRfcHJlcGFyZV9jb3B5KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBudW1fZ3B1X3BhZ2VzKTsKIHZvaWQgcjYwMF9ibGl0X2RvbmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwogdm9pZCByNjAwX2ttc19ibGl0X2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQl1NjQgc3JjX2dwdV9hZGRyLCB1NjQgZHN0X2dwdV9hZGRyLAotCQkJaW50IHNpemVfYnl0ZXMpOworCQkJdW5zaWduZWQgbnVtX2dwdV9wYWdlcyk7CiAKIC8qCiAgKiBydjc3MCxydjczMCxydjcxMCxydjc0MApAQCAtNDAxLDkgKzQwMSw2IEBACiBpbnQgZXZlcmdyZWVuX2FzaWNfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBldmVyZ3JlZW5fYmFuZHdpZHRoX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIGV2ZXJncmVlbl9yaW5nX2liX2V4ZWN1dGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25faWIgKmliKTsKLWludCBldmVyZ3JlZW5fY29weV9ibGl0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAotCQkJdWludDY0X3Qgc3JjX29mZnNldCwgdWludDY0X3QgZHN0X29mZnNldCwKLQkJCXVuc2lnbmVkIG51bV9ncHVfcGFnZXMsIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKTsKIHZvaWQgZXZlcmdyZWVuX2hwZF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgZXZlcmdyZWVuX2hwZF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGJvb2wgZXZlcmdyZWVuX2hwZF9zZW5zZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgZW51bSByYWRlb25faHBkX2lkIGhwZCk7CkBAIC00MTYsMTggKzQxMywxMiBAQAogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3BtX3ByZXBhcmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3BtX2ZpbmlzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBzdW1vX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcHJlX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHUzMiBldmVyZ3JlZW5fcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKIHZvaWQgZXZlcmdyZWVuX2Rpc2FibGVfaW50ZXJydXB0X3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBldmVyZ3JlZW5fYmxpdF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLXZvaWQgZXZlcmdyZWVuX2JsaXRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0vKiBldmVyZ3JlZW4gYmxpdCAqLwotaW50IGV2ZXJncmVlbl9ibGl0X3ByZXBhcmVfY29weShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IHNpemVfYnl0ZXMpOwotdm9pZCBldmVyZ3JlZW5fYmxpdF9kb25lX2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKTsKLXZvaWQgZXZlcmdyZWVuX2ttc19ibGl0X2NvcHkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkgICAgIHU2NCBzcmNfZ3B1X2FkZHIsIHU2NCBkc3RfZ3B1X2FkZHIsCi0JCQkgICAgIGludCBzaXplX2J5dGVzKTsKIAogLyoKICAqIGNheW1hbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKaW5kZXggYmYyYjYxNS4uZDJkMTc5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCkBAIC02Miw3ICs2Miw3IEBACiAJc3RydWN0IF9BVE9NX1NVUFBPUlRFRF9ERVZJQ0VTX0lORk9fMmQxIGluZm9fMmQxOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIHJhZGVvbl9sb29rdXBfaTJjX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCitzdGF0aWMgc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyByYWRlb25fbG9va3VwX2kyY19ncGlvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAogCQkJCQkJCSAgICAgICB1aW50OF90IGlkKQogewogCXN0cnVjdCBhdG9tX2NvbnRleHQgKmN0eCA9IHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQ7CkBAIC0yMjgsNyArMjI4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJhZGVvbl9ncGlvX3JlYyByYWRlb25fbG9va3VwX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCitzdGF0aWMgc3RydWN0IHJhZGVvbl9ncGlvX3JlYyByYWRlb25fbG9va3VwX2dwaW8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJCQkJdTggaWQpCiB7CiAJc3RydWN0IGF0b21fY29udGV4dCAqY3R4ID0gcmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dDsKQEAgLTE5OTksNiArMTk5OSwxMCBAQAogCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPSBWT0xUQUdFX05PTkU7CiAJCXN3aXRjaCAoZnJldikgewogCQljYXNlIDE6CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mbyA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvKSAqIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mbykKKwkJCQlyZXR1cm4gc3RhdGVfaW5kZXg7CiAJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKIAkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQogCQkJCWxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVzTWVtb3J5Q2xvY2spOwpAQCAtMjAzNSw2ICsyMDM5LDEwIEBACiAJCQlzdGF0ZV9pbmRleCsrOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvID0KKwkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICogMSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvKQorCQkJCXJldHVybiBzdGF0ZV9pbmRleDsKIAkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOwogCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9CiAJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1lbW9yeUNsb2NrKTsKQEAgLTIwNzIsNiArMjA4MCwxMCBAQAogCQkJc3RhdGVfaW5kZXgrKzsKIAkJCWJyZWFrOwogCQljYXNlIDM6CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mbyA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvKSAqIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mbykKKwkJCQlyZXR1cm4gc3RhdGVfaW5kZXg7CiAJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKIAkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQogCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNZW1vcnlDbG9jayk7CkBAIC0yMjU3LDcgKzIyNjksNyBAQAogCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7CiAJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5kZWZhdWx0X2Nsb2NrX21vZGUgPQogCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXggLSAxXTsKLQkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpICYmICEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgewogCQkJLyogTkkgY2hpcHMgcG9zdCB3aXRob3V0IE1DIHVjb2RlLCBzbyBkZWZhdWx0IGNsb2NrcyBhcmUgc3Ryb2JlIG1vZGUgb25seSAqLwogCQkJcmRldi0+cG0uZGVmYXVsdF9zY2xrID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsazsKIAkJCXJkZXYtPnBtLmRlZmF1bHRfbWNsayA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGs7CkBAIC0yMzc3LDE3ICsyMzg5LDMxIEBACiAJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNOb25DbG9ja0luZm9BcnJheU9mZnNldCkgKwogCQkJIChwb3dlcl9zdGF0ZS0+djEudWNOb25DbG9ja1N0YXRlSW5kZXggKgogCQkJICBwb3dlcl9pbmZvLT5wcGxpYi51Y05vbkNsb2NrU2l6ZSkpOwotCQlmb3IgKGogPSAwOyBqIDwgKHBvd2VyX2luZm8tPnBwbGliLnVjU3RhdGVFbnRyeVNpemUgLSAxKTsgaisrKSB7Ci0JCQljbG9ja19pbmZvID0gKHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKikKLQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCi0JCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPnBwbGliLnVzQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKLQkJCQkgKHBvd2VyX3N0YXRlLT52MS51Y0Nsb2NrU3RhdGVJbmRpY2VzW2pdICoKLQkJCQkgIHBvd2VyX2luZm8tPnBwbGliLnVjQ2xvY2tJbmZvU2l6ZSkpOwotCQkJdmFsaWQgPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfY2xvY2tfaW5mbyhyZGV2LAotCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCi0JCQkJCQkJCSAgICAgICBjbG9ja19pbmZvKTsKLQkJCWlmICh2YWxpZCkKLQkJCQltb2RlX2luZGV4Kys7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLmNsb2NrX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICoKKwkJCQkJCQkgICAgICgocG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSAtIDEpID8KKwkJCQkJCQkgICAgICAocG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSAtIDEpIDogMSksCisJCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5jbG9ja19pbmZvKQorCQkJcmV0dXJuIHN0YXRlX2luZGV4OworCQlpZiAocG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSAtIDEpIHsKKwkJCWZvciAoaiA9IDA7IGogPCAocG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSAtIDEpOyBqKyspIHsKKwkJCQljbG9ja19pbmZvID0gKHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKikKKwkJCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNDbG9ja0luZm9BcnJheU9mZnNldCkgKworCQkJCQkgKHBvd2VyX3N0YXRlLT52MS51Y0Nsb2NrU3RhdGVJbmRpY2VzW2pdICoKKwkJCQkJICBwb3dlcl9pbmZvLT5wcGxpYi51Y0Nsb2NrSW5mb1NpemUpKTsKKwkJCQl2YWxpZCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9jbG9ja19pbmZvKHJkZXYsCisJCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCQkgICAgICAgY2xvY2tfaW5mbyk7CisJCQkJaWYgKHZhbGlkKQorCQkJCQltb2RlX2luZGV4Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KKwkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID0KKwkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X3NjbGs7CisJCQltb2RlX2luZGV4Kys7CiAJCX0KIAkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IG1vZGVfaW5kZXg7CiAJCWlmIChtb2RlX2luZGV4KSB7CkBAIC0yNDU2LDE4ICsyNDgyLDMyIEBACiAJCW5vbl9jbG9ja19hcnJheV9pbmRleCA9IGk7IC8qIHBvd2VyX3N0YXRlLT52Mi5ub25DbG9ja0luZm9JbmRleCAqLwogCQlub25fY2xvY2tfaW5mbyA9IChzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqKQogCQkJJm5vbl9jbG9ja19pbmZvX2FycmF5LT5ub25DbG9ja0luZm9bbm9uX2Nsb2NrX2FycmF5X2luZGV4XTsKLQkJZm9yIChqID0gMDsgaiA8IHBvd2VyX3N0YXRlLT52Mi51Y051bURQTUxldmVsczsgaisrKSB7Ci0JCQljbG9ja19hcnJheV9pbmRleCA9IHBvd2VyX3N0YXRlLT52Mi5jbG9ja0luZm9JbmRleFtqXTsKLQkJCS8qIFhYWCB0aGlzIG1pZ2h0IGJlIGFuIGluYWd1YSBidWcuLi4gKi8KLQkJCWlmIChjbG9ja19hcnJheV9pbmRleCA+PSBjbG9ja19pbmZvX2FycmF5LT51Y051bUVudHJpZXMpCi0JCQkJY29udGludWU7Ci0JCQljbG9ja19pbmZvID0gKHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKikKLQkJCQkmY2xvY2tfaW5mb19hcnJheS0+Y2xvY2tJbmZvW2Nsb2NrX2FycmF5X2luZGV4XTsKLQkJCXZhbGlkID0gcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX2Nsb2NrX2luZm8ocmRldiwKLQkJCQkJCQkJICAgICAgIHN0YXRlX2luZGV4LCBtb2RlX2luZGV4LAotCQkJCQkJCQkgICAgICAgY2xvY2tfaW5mbyk7Ci0JCQlpZiAodmFsaWQpCi0JCQkJbW9kZV9pbmRleCsrOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5jbG9ja19pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvKSAqCisJCQkJCQkJICAgICAocG93ZXJfc3RhdGUtPnYyLnVjTnVtRFBNTGV2ZWxzID8KKwkJCQkJCQkgICAgICBwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZlbHMgOiAxKSwKKwkJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLmNsb2NrX2luZm8pCisJCQlyZXR1cm4gc3RhdGVfaW5kZXg7CisJCWlmIChwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZlbHMpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZlbHM7IGorKykgeworCQkJCWNsb2NrX2FycmF5X2luZGV4ID0gcG93ZXJfc3RhdGUtPnYyLmNsb2NrSW5mb0luZGV4W2pdOworCQkJCS8qIFhYWCB0aGlzIG1pZ2h0IGJlIGFuIGluYWd1YSBidWcuLi4gKi8KKwkJCQlpZiAoY2xvY2tfYXJyYXlfaW5kZXggPj0gY2xvY2tfaW5mb19hcnJheS0+dWNOdW1FbnRyaWVzKQorCQkJCQljb250aW51ZTsKKwkJCQljbG9ja19pbmZvID0gKHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKikKKwkJCQkJJmNsb2NrX2luZm9fYXJyYXktPmNsb2NrSW5mb1tjbG9ja19hcnJheV9pbmRleF07CisJCQkJdmFsaWQgPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfY2xvY2tfaW5mbyhyZGV2LAorCQkJCQkJCQkJICAgICAgIHN0YXRlX2luZGV4LCBtb2RlX2luZGV4LAorCQkJCQkJCQkJICAgICAgIGNsb2NrX2luZm8pOworCQkJCWlmICh2YWxpZCkKKwkJCQkJbW9kZV9pbmRleCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9CisJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9CisJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOworCQkJbW9kZV9pbmRleCsrOwogCQl9CiAJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSBtb2RlX2luZGV4OwogCQlpZiAobW9kZV9pbmRleCkgewpAQCAtMjUyNCwxOSArMjU2NCwyMyBAQAogCX0gZWxzZSB7CiAJCXJkZXYtPnBtLnBvd2VyX3N0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wb3dlcl9zdGF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGUpIHsKLQkJCS8qIGFkZCB0aGUgZGVmYXVsdCBtb2RlICovCi0JCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOwotCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7Ci0JCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrOwotCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5kZWZhdWx0X2Nsb2NrX21vZGUgPQotCQkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXTsKLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9IFZPTFRBR0VfTk9ORTsKLQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0gMTY7Ci0JCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7Ci0JCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSAwOwotCQkJc3RhdGVfaW5kZXgrKzsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmNsb2NrX2luZm8gPQorCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fcG1fY2xvY2tfaW5mbykgKiAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS5jbG9ja19pbmZvKSB7CisJCQkJLyogYWRkIHRoZSBkZWZhdWx0IG1vZGUgKi8KKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X3NjbGs7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CisJCQkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXTsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPSBWT0xUQUdFX05PTkU7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPSAxNjsKKwkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gMDsKKwkJCQlzdGF0ZV9pbmRleCsrOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iZW5jaG1hcmsuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2JlbmNobWFyay5jCmluZGV4IDEwMTkxZDkuLjE3ZTFhOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2JlbmNobWFyay5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2JlbmNobWFyay5jCkBAIC0yNiwyMSArMjYsODEgQEAKICNpbmNsdWRlICJyYWRlb25fcmVnLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCiAKLXZvaWQgcmFkZW9uX2JlbmNobWFya19tb3ZlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1bnNpZ25lZCBic2l6ZSwKLQkJCSAgIHVuc2lnbmVkIHNkb21haW4sIHVuc2lnbmVkIGRkb21haW4pCisjZGVmaW5lIFJBREVPTl9CRU5DSE1BUktfQ09QWV9CTElUIDEKKyNkZWZpbmUgUkFERU9OX0JFTkNITUFSS19DT1BZX0RNQSAgMAorCisjZGVmaW5lIFJBREVPTl9CRU5DSE1BUktfSVRFUkFUSU9OUyAxMDI0CisjZGVmaW5lIFJBREVPTl9CRU5DSE1BUktfQ09NTU9OX01PREVTX04gMTcKKworc3RhdGljIGludCByYWRlb25fYmVuY2htYXJrX2RvX21vdmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIHNpemUsCisJCQkJICAgIHVpbnQ2NF90IHNhZGRyLCB1aW50NjRfdCBkYWRkciwKKwkJCQkgICAgaW50IGZsYWcsIGludCBuKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfamlmZmllczsKKwl1bnNpZ25lZCBsb25nIGVuZF9qaWZmaWVzOworCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlID0gTlVMTDsKKwlpbnQgaSwgcjsKKworCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJciA9IHJhZGVvbl9mZW5jZV9jcmVhdGUocmRldiwgJmZlbmNlKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlzd2l0Y2ggKGZsYWcpIHsKKwkJY2FzZSBSQURFT05fQkVOQ0hNQVJLX0NPUFlfRE1BOgorCQkJciA9IHJhZGVvbl9jb3B5X2RtYShyZGV2LCBzYWRkciwgZGFkZHIsCisJCQkJCSAgICBzaXplIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUsCisJCQkJCSAgICBmZW5jZSk7CisJCQlicmVhazsKKwkJY2FzZSBSQURFT05fQkVOQ0hNQVJLX0NPUFlfQkxJVDoKKwkJCXIgPSByYWRlb25fY29weV9ibGl0KHJkZXYsIHNhZGRyLCBkYWRkciwKKwkJCQkJICAgICBzaXplIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUsCisJCQkJCSAgICAgZmVuY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIlVua25vd24gY29weSBtZXRob2RcbiIpOworCQkJciA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKHIpCisJCQlnb3RvIGV4aXRfZG9fbW92ZTsKKwkJciA9IHJhZGVvbl9mZW5jZV93YWl0KGZlbmNlLCBmYWxzZSk7CisJCWlmIChyKQorCQkJZ290byBleGl0X2RvX21vdmU7CisJCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOworCX0KKwllbmRfamlmZmllcyA9IGppZmZpZXM7CisJciA9IGppZmZpZXNfdG9fbXNlY3MoZW5kX2ppZmZpZXMgLSBzdGFydF9qaWZmaWVzKTsKKworZXhpdF9kb19tb3ZlOgorCWlmIChmZW5jZSkKKwkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CisJcmV0dXJuIHI7Cit9CisKKworc3RhdGljIHZvaWQgcmFkZW9uX2JlbmNobWFya19sb2dfcmVzdWx0cyhpbnQgbiwgdW5zaWduZWQgc2l6ZSwKKwkJCQkJIHVuc2lnbmVkIGludCB0aW1lLAorCQkJCQkgdW5zaWduZWQgc2RvbWFpbiwgdW5zaWduZWQgZGRvbWFpbiwKKwkJCQkJIGNoYXIgKmtpbmQpCit7CisJdW5zaWduZWQgaW50IHRocm91Z2hwdXQgPSAobiAqIChzaXplID4+IDEwKSkgLyB0aW1lOworCURSTV9JTkZPKCJyYWRlb246ICVzICV1IGJvIG1vdmVzIG9mICV1IGtCIGZyb20iCisJCSAiICVkIHRvICVkIGluICV1IG1zLCB0aHJvdWdocHV0OiAldSBNYi9zIG9yICV1IE1CL3NcbiIsCisJCSBraW5kLCBuLCBzaXplID4+IDEwLCBzZG9tYWluLCBkZG9tYWluLCB0aW1lLAorCQkgdGhyb3VnaHB1dCAqIDgsIHRocm91Z2hwdXQpOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYmVuY2htYXJrX21vdmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVuc2lnbmVkIHNpemUsCisJCQkJICB1bnNpZ25lZCBzZG9tYWluLCB1bnNpZ25lZCBkZG9tYWluKQogewogCXN0cnVjdCByYWRlb25fYm8gKmRvYmogPSBOVUxMOwogCXN0cnVjdCByYWRlb25fYm8gKnNvYmogPSBOVUxMOwotCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlID0gTlVMTDsKIAl1aW50NjRfdCBzYWRkciwgZGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgZW5kX2ppZmZpZXM7Ci0JdW5zaWduZWQgbG9uZyB0aW1lOwotCXVuc2lnbmVkIGksIG4sIHNpemU7Ci0JaW50IHI7CisJaW50IHIsIG47CisJaW50IHRpbWU7CiAKLQlzaXplID0gYnNpemU7Ci0JbiA9IDEwMjQ7CisJbiA9IFJBREVPTl9CRU5DSE1BUktfSVRFUkFUSU9OUzsKIAlyID0gcmFkZW9uX2JvX2NyZWF0ZShyZGV2LCBzaXplLCBQQUdFX1NJWkUsIHRydWUsIHNkb21haW4sICZzb2JqKTsKIAlpZiAocikgewogCQlnb3RvIG91dF9jbGVhbnVwOwpAQCAtNjcsNjUgKzEyNywyNiBAQAogCX0KIAogCS8qIHIxMDAgZG9lc24ndCBoYXZlIGRtYSBlbmdpbmUgc28gc2tpcCB0aGUgdGVzdCAqLwotCWlmIChyZGV2LT5hc2ljLT5jb3B5X2RtYSkgewotCi0JCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOwotCQkJaWYgKHIpIHsKLQkJCQlnb3RvIG91dF9jbGVhbnVwOwotCQkJfQotCi0JCQlyID0gcmFkZW9uX2NvcHlfZG1hKHJkZXYsIHNhZGRyLCBkYWRkciwKLQkJCQkJc2l6ZSAvIFJBREVPTl9HUFVfUEFHRV9TSVpFLCBmZW5jZSk7Ci0KLQkJCWlmIChyKSB7Ci0JCQkJZ290byBvdXRfY2xlYW51cDsKLQkJCX0KLQkJCXIgPSByYWRlb25fZmVuY2Vfd2FpdChmZW5jZSwgZmFsc2UpOwotCQkJaWYgKHIpIHsKLQkJCQlnb3RvIG91dF9jbGVhbnVwOwotCQkJfQotCQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7Ci0JCX0KLQkJZW5kX2ppZmZpZXMgPSBqaWZmaWVzOwotCQl0aW1lID0gZW5kX2ppZmZpZXMgLSBzdGFydF9qaWZmaWVzOwotCQl0aW1lID0gamlmZmllc190b19tc2Vjcyh0aW1lKTsKLQkJaWYgKHRpbWUgPiAwKSB7Ci0JCQlpID0gKChuICogc2l6ZSkgPj4gMTApIC8gdGltZTsKLQkJCXByaW50ayhLRVJOX0lORk8gInJhZGVvbjogZG1hICV1IGJvIG1vdmVzIG9mICV1a2IgZnJvbSIKLQkJCQkJIiAlZCB0byAlZCBpbiAlbHVtcyAoJXVrYi9tcyAldWtiL3MgJXVNL3MpXG4iLAotCQkJCQluLCBzaXplID4+IDEwLAotCQkJCQlzZG9tYWluLCBkZG9tYWluLCB0aW1lLAotCQkJCQlpLCBpICogMTAwMCwgKGkgKiAxMDAwKSAvIDEwMjQpOwotCQl9CisJLyogYWxzbywgVlJBTS10by1WUkFNIHRlc3QgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgZm9yIERNQSAqLworCS8qIHNraXAgaXQgYXMgd2VsbCBpZiBkb21haW5zIGFyZSB0aGUgc2FtZSAqLworCWlmICgocmRldi0+YXNpYy0+Y29weV9kbWEpICYmIChzZG9tYWluICE9IGRkb21haW4pKSB7CisJCXRpbWUgPSByYWRlb25fYmVuY2htYXJrX2RvX21vdmUocmRldiwgc2l6ZSwgc2FkZHIsIGRhZGRyLAorCQkJCQkJUkFERU9OX0JFTkNITUFSS19DT1BZX0RNQSwgbik7CisJCWlmICh0aW1lIDwgMCkKKwkJCWdvdG8gb3V0X2NsZWFudXA7CisJCWlmICh0aW1lID4gMCkKKwkJCXJhZGVvbl9iZW5jaG1hcmtfbG9nX3Jlc3VsdHMobiwgc2l6ZSwgdGltZSwKKwkJCQkJCSAgICAgc2RvbWFpbiwgZGRvbWFpbiwgImRtYSIpOwogCX0KIAotCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJciA9IHJhZGVvbl9mZW5jZV9jcmVhdGUocmRldiwgJmZlbmNlKTsKLQkJaWYgKHIpIHsKLQkJCWdvdG8gb3V0X2NsZWFudXA7Ci0JCX0KLQkJciA9IHJhZGVvbl9jb3B5X2JsaXQocmRldiwgc2FkZHIsIGRhZGRyLCBzaXplIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUsIGZlbmNlKTsKLQkJaWYgKHIpIHsKLQkJCWdvdG8gb3V0X2NsZWFudXA7Ci0JCX0KLQkJciA9IHJhZGVvbl9mZW5jZV93YWl0KGZlbmNlLCBmYWxzZSk7Ci0JCWlmIChyKSB7Ci0JCQlnb3RvIG91dF9jbGVhbnVwOwotCQl9Ci0JCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOwotCX0KLQllbmRfamlmZmllcyA9IGppZmZpZXM7Ci0JdGltZSA9IGVuZF9qaWZmaWVzIC0gc3RhcnRfamlmZmllczsKLQl0aW1lID0gamlmZmllc190b19tc2Vjcyh0aW1lKTsKLQlpZiAodGltZSA+IDApIHsKLQkJaSA9ICgobiAqIHNpemUpID4+IDEwKSAvIHRpbWU7Ci0JCXByaW50ayhLRVJOX0lORk8gInJhZGVvbjogYmxpdCAldSBibyBtb3ZlcyBvZiAldWtiIGZyb20gJWQgdG8gJWQiCi0JCSAgICAgICAiIGluICVsdW1zICgldWtiL21zICV1a2IvcyAldU0vcylcbiIsIG4sIHNpemUgPj4gMTAsCi0JCSAgICAgICBzZG9tYWluLCBkZG9tYWluLCB0aW1lLCBpLCBpICogMTAwMCwgKGkgKiAxMDAwKSAvIDEwMjQpOwotCX0KKwl0aW1lID0gcmFkZW9uX2JlbmNobWFya19kb19tb3ZlKHJkZXYsIHNpemUsIHNhZGRyLCBkYWRkciwKKwkJCQkJUkFERU9OX0JFTkNITUFSS19DT1BZX0JMSVQsIG4pOworCWlmICh0aW1lIDwgMCkKKwkJZ290byBvdXRfY2xlYW51cDsKKwlpZiAodGltZSA+IDApCisJCXJhZGVvbl9iZW5jaG1hcmtfbG9nX3Jlc3VsdHMobiwgc2l6ZSwgdGltZSwKKwkJCQkJICAgICBzZG9tYWluLCBkZG9tYWluLCAiYmxpdCIpOworCiBvdXRfY2xlYW51cDoKIAlpZiAoc29iaikgewogCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUoc29iaiwgZmFsc2UpOwpAQCAtMTQzLDE4ICsxNjQsOTIgQEAKIAkJfQogCQlyYWRlb25fYm9fdW5yZWYoJmRvYmopOwogCX0KLQlpZiAoZmVuY2UpIHsKLQkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7Ci0JfQorCiAJaWYgKHIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3Igd2hpbGUgYmVuY2htYXJraW5nIEJPIG1vdmUuXG4iKTsKKwkJRFJNX0VSUk9SKCJFcnJvciB3aGlsZSBiZW5jaG1hcmtpbmcgQk8gbW92ZS5cbiIpOwogCX0KIH0KIAotdm9pZCByYWRlb25fYmVuY2htYXJrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQordm9pZCByYWRlb25fYmVuY2htYXJrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgdGVzdF9udW1iZXIpCiB7Ci0JcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIDEwMjQqMTAyNCwgUkFERU9OX0dFTV9ET01BSU5fR1RULAotCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSk7Ci0JcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIDEwMjQqMTAyNCwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKLQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX0dUVCk7CisJaW50IGk7CisJaW50IGNvbW1vbl9tb2Rlc1tSQURFT05fQkVOQ0hNQVJLX0NPTU1PTl9NT0RFU19OXSA9IHsKKwkJNjQwICogNDgwICogNCwKKwkJNzIwICogNDgwICogNCwKKwkJODAwICogNjAwICogNCwKKwkJODQ4ICogNDgwICogNCwKKwkJMTAyNCAqIDc2OCAqIDQsCisJCTExNTIgKiA3NjggKiA0LAorCQkxMjgwICogNzIwICogNCwKKwkJMTI4MCAqIDgwMCAqIDQsCisJCTEyODAgKiA4NTQgKiA0LAorCQkxMjgwICogOTYwICogNCwKKwkJMTI4MCAqIDEwMjQgKiA0LAorCQkxNDQwICogOTAwICogNCwKKwkJMTQwMCAqIDEwNTAgKiA0LAorCQkxNjgwICogMTA1MCAqIDQsCisJCTE2MDAgKiAxMjAwICogNCwKKwkJMTkyMCAqIDEwODAgKiA0LAorCQkxOTIwICogMTIwMCAqIDQKKwl9OworCisJc3dpdGNoICh0ZXN0X251bWJlcikgeworCWNhc2UgMToKKwkJLyogc2ltcGxlIHRlc3QsIFZSQU0gdG8gR1RUIGFuZCBHVFQgdG8gVlJBTSAqLworCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgMTAyNCoxMDI0LCBSQURFT05fR0VNX0RPTUFJTl9HVFQsCisJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSk7CisJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCAxMDI0KjEwMjQsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RUKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBzaW1wbGUgdGVzdCwgVlJBTSB0byBWUkFNICovCisJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCAxMDI0KjEwMjQsIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogR1RUIHRvIFZSQU0sIGJ1ZmZlciBzaXplIHN3ZWVwLCBwb3dlcnMgb2YgMiAqLworCQlmb3IgKGkgPSAxOyBpIDw9IDY1NTM2OyBpIDw8PSAxKQorCQkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIGkqMTAyNCwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkvKiBWUkFNIHRvIEdUVCwgYnVmZmVyIHNpemUgc3dlZXAsIHBvd2VycyBvZiAyICovCisJCWZvciAoaSA9IDE7IGkgPD0gNjU1MzY7IGkgPDw9IDEpCisJCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgaSoxMDI0LAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9HVFQpOworCQlicmVhazsKKwljYXNlIDU6CisJCS8qIFZSQU0gdG8gVlJBTSwgYnVmZmVyIHNpemUgc3dlZXAsIHBvd2VycyBvZiAyICovCisJCWZvciAoaSA9IDE7IGkgPD0gNjU1MzY7IGkgPDw9IDEpCisJCQlyYWRlb25fYmVuY2htYXJrX21vdmUocmRldiwgaSoxMDI0LAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQkvKiBHVFQgdG8gVlJBTSwgYnVmZmVyIHNpemUgc3dlZXAsIGNvbW1vbiBtb2RlcyAqLworCQlmb3IgKGkgPSAxOyBpIDwgUkFERU9OX0JFTkNITUFSS19DT01NT05fTU9ERVNfTjsgaSsrKQorCQkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIGNvbW1vbl9tb2Rlc1tpXSwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RULAorCQkJCQkgICAgICBSQURFT05fR0VNX0RPTUFJTl9WUkFNKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQkvKiBWUkFNIHRvIEdUVCwgYnVmZmVyIHNpemUgc3dlZXAsIGNvbW1vbiBtb2RlcyAqLworCQlmb3IgKGkgPSAxOyBpIDwgUkFERU9OX0JFTkNITUFSS19DT01NT05fTU9ERVNfTjsgaSsrKQorCQkJcmFkZW9uX2JlbmNobWFya19tb3ZlKHJkZXYsIGNvbW1vbl9tb2Rlc1tpXSwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKKwkJCQkJICAgICAgUkFERU9OX0dFTV9ET01BSU5fR1RUKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkvKiBWUkFNIHRvIFZSQU0sIGJ1ZmZlciBzaXplIHN3ZWVwLCBjb21tb24gbW9kZXMgKi8KKwkJZm9yIChpID0gMTsgaSA8IFJBREVPTl9CRU5DSE1BUktfQ09NTU9OX01PREVTX047IGkrKykKKwkJCXJhZGVvbl9iZW5jaG1hcmtfbW92ZShyZGV2LCBjb21tb25fbW9kZXNbaV0sCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sCisJCQkJCSAgICAgIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biBiZW5jaG1hcmtcbiIpOworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwppbmRleCA2MzY3NTI0Li44MWZjMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCkBAIC02MjAsOCArNjIwLDggQEAKIAkJaTJjLnlfZGF0YV9tYXNrID0gMHg4MDsKIAl9IGVsc2UgewogCQkvKiBkZWZhdWx0IG1hc2tzIGZvciBkZGMgcGFkcyAqLwotCQlpMmMubWFza19jbGtfbWFzayA9IFJBREVPTl9HUElPX0VOXzE7Ci0JCWkyYy5tYXNrX2RhdGFfbWFzayA9IFJBREVPTl9HUElPX0VOXzA7CisJCWkyYy5tYXNrX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fTUFTS18xOworCQlpMmMubWFza19kYXRhX21hc2sgPSBSQURFT05fR1BJT19NQVNLXzA7CiAJCWkyYy5hX2Nsa19tYXNrID0gUkFERU9OX0dQSU9fQV8xOwogCQlpMmMuYV9kYXRhX21hc2sgPSBSQURFT05fR1BJT19BXzA7CiAJCWkyYy5lbl9jbGtfbWFzayA9IFJBREVPTl9HUElPX0VOXzE7CkBAIC0yNTYzLDE0ICsyNTYzLDE3IEBACiAKIAkvKiBhbGxvY2F0ZSAyIHBvd2VyIHN0YXRlcyAqLwogCXJkZXYtPnBtLnBvd2VyX3N0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wb3dlcl9zdGF0ZSkgKiAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlKSB7Ci0JCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKLQkJcmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA9IDA7Ci0KLQkJcmRldi0+cG0uY3VycmVudF9wb3dlcl9zdGF0ZV9pbmRleCA9IHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXg7Ci0JCXJkZXYtPnBtLmN1cnJlbnRfY2xvY2tfbW9kZV9pbmRleCA9IDA7Ci0JCXJldHVybjsKLQl9CisJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlKSB7CisJCS8qIGFsbG9jYXRlIDEgY2xvY2sgbW9kZSBwZXIgc3RhdGUgKi8KKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mbyA9CisJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX3BtX2Nsb2NrX2luZm8pICogMSwgR0ZQX0tFUk5FTCk7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzFdLmNsb2NrX2luZm8gPQorCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9wbV9jbG9ja19pbmZvKSAqIDEsIEdGUF9LRVJORUwpOworCQlpZiAoIXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmNsb2NrX2luZm8gfHwKKwkJICAgICFyZGV2LT5wbS5wb3dlcl9zdGF0ZVsxXS5jbG9ja19pbmZvKQorCQkJZ290byBwbV9mYWlsZWQ7CisJfSBlbHNlCisJCWdvdG8gcG1fZmFpbGVkOwogCiAJLyogY2hlY2sgZm9yIGEgdGhlcm1hbCBjaGlwICovCiAJb2Zmc2V0ID0gY29tYmlvc19nZXRfdGFibGVfb2Zmc2V0KGRldiwgQ09NQklPU19PVkVSRFJJVkVfSU5GT19UQUJMRSk7CkBAIC0yNzM1LDYgKzI3MzgsMTQgQEAKIAogCXJkZXYtPnBtLmN1cnJlbnRfcG93ZXJfc3RhdGVfaW5kZXggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OwogCXJkZXYtPnBtLmN1cnJlbnRfY2xvY2tfbW9kZV9pbmRleCA9IDA7CisJcmV0dXJuOworCitwbV9mYWlsZWQ6CisJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OworCXJkZXYtPnBtLm51bV9wb3dlcl9zdGF0ZXMgPSAwOworCisJcmRldi0+cG0uY3VycmVudF9wb3dlcl9zdGF0ZV9pbmRleCA9IHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXg7CisJcmRldi0+cG0uY3VycmVudF9jbG9ja19tb2RlX2luZGV4ID0gMDsKIH0KIAogdm9pZCByYWRlb25fZXh0ZXJuYWxfdG1kc19zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKaW5kZXggNDQ5YzNkOC4uZTdjYjNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwpAQCAtNDQsOCArNDQsNiBAQAogcmFkZW9uX2xlZ2FjeV9iYWNrbGlnaHRfaW5pdChzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyLAogCQkJICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX2Nvbm5lY3Rvcik7CiAKLWJvb2wgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKLQogdm9pZCByYWRlb25fY29ubmVjdG9yX2hvdHBsdWcoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CkBAIC00MzIsNTUgKzQzMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTb21lIGludGVncmF0ZWQgQVRJIFJhZGVvbiBjaGlwc2V0IGltcGxlbWVudGF0aW9ucyAoZS4gZy4KLSAqIEFzdXMgTTJBLVZNIEhETUkpIG1heSBpbmRpY2F0ZSB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgRERDLAotICogZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gbW9uaXRvciBjb25uZWN0ZWQuIEZvciB0aGVzZSBjb25uZWN0b3JzCi0gKiBmb2xsb3dpbmcgRERDIHByb2JlIGV4dGVuc2lvbiB3aWxsIGJlIGFwcGxpZWQ6IGNoZWNrIGFsc28gZm9yIHRoZQotICogYXZhaWxhYmlsaXR5IG9mIEVESUQgd2l0aCBhdCBsZWFzdCBhIGNvcnJlY3QgRURJRCBoZWFkZXIuIE9ubHkgdGhlbiwKLSAqIEREQyBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyBkcm1fZ2V0X2VkaWQoKSBhbmQKLSAqIGRybV9lZGlkX2Jsb2NrX3ZhbGlkKCkgZnJvbSBwZXJpb2RpY2FsbHkgZHVtcGluZyBkYXRhIGFuZCBrZXJuZWwKLSAqIGVycm9ycyBpbnRvIHRoZSBsb2dzIGFuZCBvbnRvIHRoZSB0ZXJtaW5hbC4KLSAqLwotc3RhdGljIGJvb2wgcmFkZW9uX2Nvbm5lY3Rvcl9uZWVkc19leHRlbmRlZF9wcm9iZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqZGV2LAotCQkJCSAgICAgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSwKLQkJCQkgICAgIGludCBjb25uZWN0b3JfdHlwZSkKLXsKLQkvKiBBc3VzIE0yQS1WTSBIRE1JIGJvYXJkIHNlbmRzIGRhdGEgdG8gaTJjIGJ1cyBldmVuLAotCSAqIGlmIEhETUkgYWRkLW9uIGNhcmQgaXMgbm90IHBsdWdnZWQgaW4gb3IgSERNSSBpcyBkaXNhYmxlZCBpbgotCSAqIEJJT1MuIFZhbGlkIEREQyBjYW4gb25seSBiZSBhc3N1bWVkLCBpZiBhbHNvIGEgdmFsaWQgRURJRCBoZWFkZXIKLQkgKiBjYW4gYmUgcmV0cmlldmVkIHZpYSBpMmMgYnVzIGR1cmluZyBEREMgcHJvYmUgKi8KLQlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NzkxZSkgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNDMpICYmCi0JICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHg4MjZkKSkgewotCQlpZiAoKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQSkgJiYKLQkJICAgIChzdXBwb3J0ZWRfZGV2aWNlID09IEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogRUNTIEE3NDBHTS1NIHdpdGggQVRJIFJBREVPTiAyMTAwIHNlbmRzIGRhdGEgdG8gaTJjIGJ1cwotCSAqIGZvciBhIERWSSBjb25uZWN0b3IgdGhhdCBpcyBub3QgaW1wbGVtZW50ZWQgKi8KLQlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4Nzk2ZSkgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMTkpICYmCi0JICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgyNjE1KSkgewotCQlpZiAoKGNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEKSAmJgotCQkgICAgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQkvKiBUT1NISUJBIFNhdGVsbGl0ZSBMMzAwRCB3aXRoIEFUSSBNb2JpbGl0eSBSYWRlb24geDExMDAKLQkgKiAoUlM2OTBNKSBzZW5kcyBkYXRhIHRvIGkyYyBidXMgZm9yIGEgSERNSSBjb25uZWN0b3IgdGhhdAotCSAqIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3OTFmKSAmJgotCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTE3OSkgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweGZmNjgpKSB7Ci0JCWlmICgoY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKSAmJgotCQkgICAgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCS8qIERlZmF1bHQ6IG5vIEVESUQgaGVhZGVyIHByb2JlIHJlcXVpcmVkIGZvciBEREMgcHJvYmluZyAqLwotCXJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIHZvaWQgcmFkZW9uX2ZpeHVwX2x2ZHNfbmF0aXZlX21vZGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAogCQkJCQkgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CkBAIC03MjEsOSArNjcwLDkgQEAKIAkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CiAKIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKLQkJZHJldCA9IHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3RvciwKLQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+cmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpOworCQlkcmV0ID0gcmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKTsKIAlpZiAoZHJldCkgeworCQlyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ieV9sb2FkID0gZmFsc2U7CiAJCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCQlrZnJlZShyYWRlb25fY29ubmVjdG9yLT5lZGlkKTsKIAkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBOVUxMOwpAQCAtNzUwLDEyICs2OTksMjEgQEAKIAl9IGVsc2UgewogCiAJCS8qIGlmIHdlIGFyZW4ndCBmb3JjaW5nIGRvbid0IGRvIGRlc3RydWN0aXZlIHBvbGxpbmcgKi8KLQkJaWYgKCFmb3JjZSkKLQkJCXJldHVybiBjb25uZWN0b3ItPnN0YXR1czsKKwkJaWYgKCFmb3JjZSkgeworCQkJLyogb25seSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXR1cyBpZiB3ZSBsYXN0CisJCQkgKiBkZXRlY3RlZCBhIG1vbml0b3IgdmlhIGxvYWQuCisJCQkgKi8KKwkJCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ieV9sb2FkKQorCQkJCXJldHVybiBjb25uZWN0b3ItPnN0YXR1czsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gcmV0OworCQl9CiAKIAkJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRhY19sb2FkX2RldGVjdCAmJiBlbmNvZGVyKSB7CiAJCQllbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CiAJCQlyZXQgPSBlbmNvZGVyX2Z1bmNzLT5kZXRlY3QoZW5jb2RlciwgY29ubmVjdG9yKTsKKwkJCWlmIChyZXQgIT0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpCisJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfYnlfbG9hZCA9IHRydWU7CiAJCX0KIAl9CiAKQEAgLTg5NCw5ICs4NTIsOSBAQAogCWJvb2wgZHJldCA9IGZhbHNlOwogCiAJaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMpCi0JCWRyZXQgPSByYWRlb25fZGRjX3Byb2JlKHJhZGVvbl9jb25uZWN0b3IsCi0JCQkJCXJhZGVvbl9jb25uZWN0b3ItPnJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKTsKKwkJZHJldCA9IHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3Rvcik7CiAJaWYgKGRyZXQpIHsKKwkJcmFkZW9uX2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfYnlfbG9hZCA9IGZhbHNlOwogCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQkJa2ZyZWUocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gTlVMTDsKQEAgLTk1OSw4ICs5MTcsMTggQEAKIAlpZiAoKHJldCA9PSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkgJiYgKHJhZGVvbl9jb25uZWN0b3ItPnVzZV9kaWdpdGFsID09IHRydWUpKQogCQlnb3RvIG91dDsKIAorCS8qIERWSS1EIGFuZCBIRE1JLUEgYXJlIGRpZ2l0YWwgb25seSAqLworCWlmICgoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRCkgfHwKKwkgICAgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKSkKKwkJZ290byBvdXQ7CisKKwkvKiBpZiB3ZSBhcmVuJ3QgZm9yY2luZyBkb24ndCBkbyBkZXN0cnVjdGl2ZSBwb2xsaW5nICovCiAJaWYgKCFmb3JjZSkgewotCQlyZXQgPSBjb25uZWN0b3ItPnN0YXR1czsKKwkJLyogb25seSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXR1cyBpZiB3ZSBsYXN0CisJCSAqIGRldGVjdGVkIGEgbW9uaXRvciB2aWEgbG9hZC4KKwkJICovCisJCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ieV9sb2FkKQorCQkJcmV0ID0gY29ubmVjdG9yLT5zdGF0dXM7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtOTg1LDYgKzk1Myw4IEBACiAJCQkJCWlmIChyZXQgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQpIHsKIAkJCQkJCXJhZGVvbl9jb25uZWN0b3ItPnVzZV9kaWdpdGFsID0gZmFsc2U7CiAJCQkJCX0KKwkJCQkJaWYgKHJldCAhPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkKKwkJCQkJCXJhZGVvbl9jb25uZWN0b3ItPmRldGVjdGVkX2J5X2xvYWQgPSB0cnVlOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KQEAgLTExODEsNyArMTE1MSw4IEBACiAJCX0KIAl9IGVsc2UgewogCQkvKiBuZWVkIHRvIHNldHVwIGRkYyBvbiB0aGUgYnJpZGdlICovCi0JCWlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKGNvbm5lY3RvcikpIHsKKwkJaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoY29ubmVjdG9yKSAhPQorCQkJRU5DT0RFUl9PQkpFQ1RfSURfTk9ORSkgewogCQkJaWYgKGVuY29kZXIpCiAJCQkJcmFkZW9uX2F0b21fZXh0X2VuY29kZXJfc2V0dXBfZGRjKGVuY29kZXIpOwogCQl9CkBAIC0xMTkxLDEzICsxMTYyLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotYm9vbCByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit1MTYgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CiAJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcjsKIAlpbnQgaTsKLQlib29sIGZvdW5kID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRFJNX0NPTk5FQ1RPUl9NQVhfRU5DT0RFUjsgaSsrKSB7CiAJCWlmIChjb25uZWN0b3ItPmVuY29kZXJfaWRzW2ldID09IDApCkBAIC0xMjEzLDE0ICsxMTgzLDEzIEBACiAJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKIAkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVM6CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHOgotCQkJZm91bmQgPSB0cnVlOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQ7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCX0KIAotCXJldHVybiBmb3VuZDsKKwlyZXR1cm4gRU5DT0RFUl9PQkpFQ1RfSURfTk9ORTsKIH0KIAogYm9vbCByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfaGJyMihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQpAQCAtMTI5Nyw3ICsxMjY2LDggQEAKIAkJaWYgKCFyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZWRwX29uKQogCQkJYXRvbWJpb3Nfc2V0X2VkcF9wYW5lbF9wb3dlcihjb25uZWN0b3IsCiAJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRik7Ci0JfSBlbHNlIGlmIChyYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKGNvbm5lY3RvcikpIHsKKwl9IGVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoY29ubmVjdG9yKSAhPQorCQkgICBFTkNPREVSX09CSkVDVF9JRF9OT05FKSB7CiAJCS8qIERQIGJyaWRnZXMgYXJlIGFsd2F5cyBEUCAqLwogCQlyYWRlb25fZGlnX2Nvbm5lY3Rvci0+ZHBfc2lua190eXBlID0gQ09OTkVDVE9SX09CSkVDVF9JRF9ESVNQTEFZUE9SVDsKIAkJLyogZ2V0IHRoZSBEUENEIGZyb20gdGhlIGJyaWRnZSAqLwpAQCAtMTMwNiw4ICsxMjc2LDcgQEAKIAkJaWYgKGVuY29kZXIpIHsKIAkJCS8qIHNldHVwIGRkYyBvbiB0aGUgYnJpZGdlICovCiAJCQlyYWRlb25fYXRvbV9leHRfZW5jb2Rlcl9zZXR1cF9kZGMoZW5jb2Rlcik7Ci0JCQlpZiAocmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yLAotCQkJCQkgICAgIHJhZGVvbl9jb25uZWN0b3ItPnJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKSkgLyogdHJ5IEREQyAqLworCQkJaWYgKHJhZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3RvcikpIC8qIHRyeSBEREMgKi8KIAkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKIAkJCWVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRhY19sb2FkX2RldGVjdCkgeyAvKiB0cnkgbG9hZCBkZXRlY3Rpb24gKi8KIAkJCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CkBAIC0xMzI1LDggKzEyOTQsNyBAQAogCQkJCWlmIChyYWRlb25fZHBfZ2V0ZHBjZChyYWRlb25fY29ubmVjdG9yKSkKIAkJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQl9IGVsc2UgewotCQkJCWlmIChyYWRlb25fZGRjX3Byb2JlKHJhZGVvbl9jb25uZWN0b3IsCi0JCQkJCQkgICAgIHJhZGVvbl9jb25uZWN0b3ItPnJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKSkKKwkJCQlpZiAocmFkZW9uX2RkY19wcm9iZShyYWRlb25fY29ubmVjdG9yKSkKIAkJCQkJcmV0ID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQl9CiAJCX0KQEAgLTE0NzEsOSArMTQzOSw3IEBACiAJcmFkZW9uX2Nvbm5lY3Rvci0+c2hhcmVkX2RkYyA9IHNoYXJlZF9kZGM7CiAJcmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZCA9IGNvbm5lY3Rvcl9vYmplY3RfaWQ7CiAJcmFkZW9uX2Nvbm5lY3Rvci0+aHBkID0gKmhwZDsKLQlyYWRlb25fY29ubmVjdG9yLT5yZXF1aXJlc19leHRlbmRlZF9wcm9iZSA9Ci0JCXJhZGVvbl9jb25uZWN0b3JfbmVlZHNfZXh0ZW5kZWRfcHJvYmUocmRldiwgc3VwcG9ydGVkX2RldmljZSwKLQkJCQkJCQljb25uZWN0b3JfdHlwZSk7CisKIAlyYWRlb25fY29ubmVjdG9yLT5yb3V0ZXIgPSAqcm91dGVyOwogCWlmIChyb3V0ZXItPmRkY192YWxpZCB8fCByb3V0ZXItPmNkX3ZhbGlkKSB7CiAJCXJhZGVvbl9jb25uZWN0b3ItPnJvdXRlcl9idXMgPSByYWRlb25faTJjX2xvb2t1cChyZGV2LCAmcm91dGVyLT5pMmNfaW5mbyk7CkBAIC0xODIwLDkgKzE3ODYsNyBAQAogCXJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgPSBzdXBwb3J0ZWRfZGV2aWNlOwogCXJhZGVvbl9jb25uZWN0b3ItPmNvbm5lY3Rvcl9vYmplY3RfaWQgPSBjb25uZWN0b3Jfb2JqZWN0X2lkOwogCXJhZGVvbl9jb25uZWN0b3ItPmhwZCA9ICpocGQ7Ci0JcmFkZW9uX2Nvbm5lY3Rvci0+cmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUgPQotCQlyYWRlb25fY29ubmVjdG9yX25lZWRzX2V4dGVuZGVkX3Byb2JlKHJkZXYsIHN1cHBvcnRlZF9kZXZpY2UsCi0JCQkJCQkJY29ubmVjdG9yX3R5cGUpOworCiAJc3dpdGNoIChjb25uZWN0b3JfdHlwZSkgewogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1ZHQToKIAkJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fdmdhX2Nvbm5lY3Rvcl9mdW5jcywgY29ubmVjdG9yX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NwLmMKaW5kZXggMDQ1ZWM1OS4uNzJhZTgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3AuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcC5jCkBAIC0yOSw2ICsyOSw4IEBACiAgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImRybV9zYXJlYS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKaW5kZXggZmFlMDBjMC4uY2NhYTI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlzdHJ1Y3QgcmFkZW9uX2NzX2NodW5rICppYl9jaHVuazsKIAlpbnQgcjsKIAotCW11dGV4X2xvY2soJnJkZXYtPmNzX211dGV4KTsKKwlyYWRlb25fbXV0ZXhfbG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCS8qIGluaXRpYWxpemUgcGFyc2VyICovCiAJbWVtc2V0KCZwYXJzZXIsIDAsIHNpemVvZihzdHJ1Y3QgcmFkZW9uX2NzX3BhcnNlcikpOwogCXBhcnNlci5maWxwID0gZmlscDsKQEAgLTIzMywxNCArMjMzLDE0IEBACiAJaWYgKHIpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwYXJzZXIgIVxuIik7CiAJCXJhZGVvbl9jc19wYXJzZXJfZmluaSgmcGFyc2VyLCByKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CisJCXJhZGVvbl9tdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKIAkJcmV0dXJuIHI7CiAJfQogCXIgPSAgcmFkZW9uX2liX2dldChyZGV2LCAmcGFyc2VyLmliKTsKIAlpZiAocikgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBnZXQgaWIgIVxuIik7CiAJCXJhZGVvbl9jc19wYXJzZXJfZmluaSgmcGFyc2VyLCByKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CisJCXJhZGVvbl9tdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKIAkJcmV0dXJuIHI7CiAJfQogCXIgPSByYWRlb25fY3NfcGFyc2VyX3JlbG9jcygmcGFyc2VyKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBwYXJzZSByZWxvY2F0aW9uICVkIVxuIiwgcik7CiAJCXJhZGVvbl9jc19wYXJzZXJfZmluaSgmcGFyc2VyLCByKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CisJCXJhZGVvbl9tdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKIAkJcmV0dXJuIHI7CiAJfQogCS8qIENvcHkgdGhlIHBhY2tldCBpbnRvIHRoZSBJQiwgdGhlIHBhcnNlciB3aWxsIHJlYWQgZnJvbSB0aGUKQEAgLTI2MCwxNCArMjYwLDE0IEBACiAJaWYgKHIgfHwgcGFyc2VyLnBhcnNlcl9lcnJvcikgewogCQlEUk1fRVJST1IoIkludmFsaWQgY29tbWFuZCBzdHJlYW0gIVxuIik7CiAJCXJhZGVvbl9jc19wYXJzZXJfZmluaSgmcGFyc2VyLCByKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CisJCXJhZGVvbl9tdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKIAkJcmV0dXJuIHI7CiAJfQogCXIgPSByYWRlb25fY3NfZmluaXNoX3BhZ2VzKCZwYXJzZXIpOwogCWlmIChyKSB7CiAJCURSTV9FUlJPUigiSW52YWxpZCBjb21tYW5kIHN0cmVhbSAhXG4iKTsKIAkJcmFkZW9uX2NzX3BhcnNlcl9maW5pKCZwYXJzZXIsIHIpOwotCQltdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKwkJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9CiAJciA9IHJhZGVvbl9pYl9zY2hlZHVsZShyZGV2LCBwYXJzZXIuaWIpOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIHNjaGVkdWxlIElCICFcbiIpOwogCX0KIAlyYWRlb25fY3NfcGFyc2VyX2ZpbmkoJnBhcnNlciwgcik7Ci0JbXV0ZXhfdW5sb2NrKCZyZGV2LT5jc19tdXRleCk7CisJcmFkZW9uX211dGV4X3VubG9jaygmcmRldi0+Y3NfbXV0ZXgpOwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCmluZGV4IGI1MWUxNTcuLmM0ZDAwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCkBAIC03MTYsNyArNzE2LDcgQEAKIAogCS8qIG11dGV4IGluaXRpYWxpemF0aW9uIGFyZSBhbGwgZG9uZSBoZXJlIHNvIHdlCiAJICogY2FuIHJlY2FsbCBmdW5jdGlvbiB3aXRob3V0IGhhdmluZyBsb2NraW5nIGlzc3VlcyAqLwotCW11dGV4X2luaXQoJnJkZXYtPmNzX211dGV4KTsKKwlyYWRlb25fbXV0ZXhfaW5pdCgmcmRldi0+Y3NfbXV0ZXgpOwogCW11dGV4X2luaXQoJnJkZXYtPmliX3Bvb2wubXV0ZXgpOwogCW11dGV4X2luaXQoJnJkZXYtPmNwLm11dGV4KTsKIAltdXRleF9pbml0KCZyZGV2LT5kY19od19pMmNfbXV0ZXgpOwpAQCAtNzUwLDE0ICs3NTAsMTUgQEAKIAogCS8qIHNldCBETUEgbWFzayArIG5lZWRfZG1hMzIgZmxhZ3MuCiAJICogUENJRSAtIGNhbiBoYW5kbGUgNDAtYml0cy4KLQkgKiBJR1AgLSBjYW4gaGFuZGxlIDQwLWJpdHMgKGluIHRoZW9yeSkKKwkgKiBJR1AgLSBjYW4gaGFuZGxlIDQwLWJpdHMKIAkgKiBBR1AgLSBnZW5lcmFsbHkgZG1hMzIgaXMgc2FmZXN0Ci0JICogUENJIC0gb25seSBkbWEzMgorCSAqIFBDSSAtIGRtYTMyIGZvciBsZWdhY3kgcGNpIGdhcnQsIDQwIGJpdHMgb24gbmV3ZXIgYXNpY3MKIAkgKi8KIAlyZGV2LT5uZWVkX2RtYTMyID0gZmFsc2U7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkKIAkJcmRldi0+bmVlZF9kbWEzMiA9IHRydWU7Ci0JaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkKKwlpZiAoKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSSkgJiYKKwkgICAgKHJkZXYtPmZhbWlseSA8IENISVBfUlM0MDApKQogCQlyZGV2LT5uZWVkX2RtYTMyID0gdHJ1ZTsKIAogCWRtYV9iaXRzID0gcmRldi0+bmVlZF9kbWEzMiA/IDMyIDogNDA7CkBAIC04MTcsNyArODE4LDcgQEAKIAkJcmFkZW9uX3Rlc3RfbW92ZXMocmRldik7CiAJfQogCWlmIChyYWRlb25fYmVuY2htYXJraW5nKSB7Ci0JCXJhZGVvbl9iZW5jaG1hcmsocmRldik7CisJCXJhZGVvbl9iZW5jaG1hcmsocmRldiwgcmFkZW9uX2JlbmNobWFya2luZyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTU0LDYgKzk1NSw5IEBACiAJaW50IHI7CiAJaW50IHJlc2NoZWQ7CiAKKwkvKiBQcmV2ZW50IENTIGlvY3RsIGZyb20gaW50ZXJmZXJpbmcgKi8KKwlyYWRlb25fbXV0ZXhfbG9jaygmcmRldi0+Y3NfbXV0ZXgpOworCiAJcmFkZW9uX3NhdmVfYmlvc19zY3JhdGNoX3JlZ3MocmRldik7CiAJLyogYmxvY2sgVFRNICovCiAJcmVzY2hlZCA9IHR0bV9ib19sb2NrX2RlbGF5ZWRfd29ya3F1ZXVlKCZyZGV2LT5tbWFuLmJkZXYpOwpAQCAtOTY2LDEwICs5NzAsMTUgQEAKIAkJcmFkZW9uX3Jlc3RvcmVfYmlvc19zY3JhdGNoX3JlZ3MocmRldik7CiAJCWRybV9oZWxwZXJfcmVzdW1lX2ZvcmNlX21vZGUocmRldi0+ZGRldik7CiAJCXR0bV9ib191bmxvY2tfZGVsYXllZF93b3JrcXVldWUoJnJkZXYtPm1tYW4uYmRldiwgcmVzY2hlZCk7Ci0JCXJldHVybiAwOwogCX0KLQkvKiBiYWQgbmV3cywgaG93IHRvIHRlbGwgaXQgdG8gdXNlcnNwYWNlID8gKi8KLQlkZXZfaW5mbyhyZGV2LT5kZXYsICJHUFUgcmVzZXQgZmFpbGVkXG4iKTsKKworCXJhZGVvbl9tdXRleF91bmxvY2soJnJkZXYtPmNzX211dGV4KTsKKworCWlmIChyKSB7CisJCS8qIGJhZCBuZXdzLCBob3cgdG8gdGVsbCBpdCB0byB1c2Vyc3BhY2UgPyAqLworCQlkZXZfaW5mbyhyZGV2LT5kZXYsICJHUFUgcmVzZXQgZmFpbGVkXG4iKTsKKwl9CisKIAlyZXR1cm4gcjsKIH0KIApAQCAtOTgxLDcgKzk5MCw3IEBACiAJc3RydWN0IGRybV9pbmZvX2xpc3QJKmZpbGVzOwogCXVuc2lnbmVkCQludW1fZmlsZXM7CiB9Owotc3RhdGljIHN0cnVjdCByYWRlb25fZGVidWdmcyBfcmFkZW9uX2RlYnVnZnNbUkFERU9OX0RFQlVHRlNfTUFYX05VTV9GSUxFU107CitzdGF0aWMgc3RydWN0IHJhZGVvbl9kZWJ1Z2ZzIF9yYWRlb25fZGVidWdmc1tSQURFT05fREVCVUdGU19NQVhfQ09NUE9ORU5UU107CiBzdGF0aWMgdW5zaWduZWQgX3JhZGVvbl9kZWJ1Z2ZzX2NvdW50ID0gMDsKIAogaW50IHJhZGVvbl9kZWJ1Z2ZzX2FkZF9maWxlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKQEAgLTk5NiwxNCArMTAwNSwxNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKChfcmFkZW9uX2RlYnVnZnNfY291bnQgKyBuZmlsZXMpID4gUkFERU9OX0RFQlVHRlNfTUFYX05VTV9GSUxFUykgewotCQlEUk1fRVJST1IoIlJlYWNoZWQgbWF4aW11bSBudW1iZXIgb2YgZGVidWdmcyBmaWxlcy5cbiIpOwotCQlEUk1fRVJST1IoIlJlcG9ydCBzbyB3ZSBpbmNyZWFzZSBSQURFT05fREVCVUdGU19NQVhfTlVNX0ZJTEVTLlxuIik7CisKKwlpID0gX3JhZGVvbl9kZWJ1Z2ZzX2NvdW50ICsgMTsKKwlpZiAoaSA+IFJBREVPTl9ERUJVR0ZTX01BWF9DT01QT05FTlRTKSB7CisJCURSTV9FUlJPUigiUmVhY2hlZCBtYXhpbXVtIG51bWJlciBvZiBkZWJ1Z2ZzIGNvbXBvbmVudHMuXG4iKTsKKwkJRFJNX0VSUk9SKCJSZXBvcnQgc28gd2UgaW5jcmVhc2UgIgorCQkgICAgICAgICAgIlJBREVPTl9ERUJVR0ZTX01BWF9DT01QT05FTlRTLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlfcmFkZW9uX2RlYnVnZnNbX3JhZGVvbl9kZWJ1Z2ZzX2NvdW50XS5maWxlcyA9IGZpbGVzOwogCV9yYWRlb25fZGVidWdmc1tfcmFkZW9uX2RlYnVnZnNfY291bnRdLm51bV9maWxlcyA9IG5maWxlczsKLQlfcmFkZW9uX2RlYnVnZnNfY291bnQrKzsKKwlfcmFkZW9uX2RlYnVnZnNfY291bnQgPSBpOwogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogCWRybV9kZWJ1Z2ZzX2NyZWF0ZV9maWxlcyhmaWxlcywgbmZpbGVzLAogCQkJCSByZGV2LT5kZGV2LT5jb250cm9sLT5kZWJ1Z2ZzX3Jvb3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggNmFkYjNlNS4uYTIyZDZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwpAQCAtMzMsOCArMzMsNiBAQAogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgogI2luY2x1ZGUgImRybV9lZGlkLmgiCiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RkY19kdW1wKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwotCiBzdGF0aWMgdm9pZCBhdml2b19jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CkBAIC02NjksNyArNjY3LDYgQEAKIHN0YXRpYyBib29sIHJhZGVvbl9zZXR1cF9lbmNfY29ubihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX2Nvbm5lY3RvcjsKIAlib29sIHJldCA9IGZhbHNlOwogCiAJaWYgKHJkZXYtPmJpb3MpIHsKQEAgLTY4OSw4ICs2ODYsNiBAQAogCWlmIChyZXQpIHsKIAkJcmFkZW9uX3NldHVwX2VuY29kZXJfY2xvbmVzKGRldik7CiAJCXJhZGVvbl9wcmludF9kaXNwbGF5X3NldHVwKGRldik7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZHJtX2Nvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpCi0JCQlyYWRlb25fZGRjX2R1bXAoZHJtX2Nvbm5lY3Rvcik7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTcwOCw3ICs3MDMsOCBAQAogCiAJaWYgKChyYWRlb25fY29ubmVjdG9yLT5iYXNlLmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCkgfHwKIAkgICAgKHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkgfHwKLQkgICAgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2lzX2RwX2JyaWRnZSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSkpIHsKKwkgICAgKHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UpICE9CisJICAgICBFTkNPREVSX09CSkVDVF9JRF9OT05FKSkgewogCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7CiAKIAkJaWYgKChkaWctPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUIHx8CkBAIC03NDMsMzQgKzczOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RkY19kdW1wKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGVkaWQgKmVkaWQ7Ci0Jc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBvbiBodyB3aXRoIHJvdXRlcnMsIHNlbGVjdCByaWdodCBwb3J0ICovCi0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPnJvdXRlci5kZGNfdmFsaWQpCi0JCXJhZGVvbl9yb3V0ZXJfc2VsZWN0X2RkY19wb3J0KHJhZGVvbl9jb25uZWN0b3IpOwotCi0JaWYgKCFyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzKQotCQlyZXR1cm4gLTE7Ci0JZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsICZyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5hZGFwdGVyKTsKLQkvKiBMb2cgRURJRCByZXRyaWV2YWwgc3RhdHVzIGhlcmUuIEluIHBhcnRpY3VsYXIgd2l0aCByZWdhcmQgdG8KLQkgKiBjb25uZWN0b3JzIHdpdGggcmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUgZmxhZyBzZXQsIHRoYXQgd2lsbCBwcmV2ZW50Ci0JICogZnVuY3Rpb24gcmFkZW9uX2R2aV9kZXRlY3QoKSB0byBmZXRjaCBFRElEIG9uIHRoaXMgY29ubmVjdG9yLAotCSAqIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gdmFsaWQgRURJRCBoZWFkZXIgZm91bmQgKi8KLQlpZiAoZWRpZCkgewotCQlEUk1fSU5GTygiUmFkZW9uIGRpc3BsYXkgY29ubmVjdG9yICVzOiBGb3VuZCB2YWxpZCBFRElEIiwKLQkJCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9uYW1lKGNvbm5lY3RvcikpOwotCQlrZnJlZShlZGlkKTsKLQl9IGVsc2UgewotCQlEUk1fSU5GTygiUmFkZW9uIGRpc3BsYXkgY29ubmVjdG9yICVzOiBObyBtb25pdG9yIGNvbm5lY3RlZCBvciBpbnZhbGlkIEVESUQiLAotCQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KIC8qIGF2aXZvICovCiBzdGF0aWMgdm9pZCBhdml2b19nZXRfZmJfZGl2KHN0cnVjdCByYWRlb25fcGxsICpwbGwsCiAJCQkgICAgIHUzMiB0YXJnZXRfY2xvY2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCmluZGV4IGU3MWQyZWQuLmEwYjM1ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlICJkcm1fcGNpaWRzLmgiCiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAKIC8qCkBAIC0xMTgsNiArMTE5LDcgQEAKIGludCByYWRlb25fZGlzcF9wcmlvcml0eSA9IDA7CiBpbnQgcmFkZW9uX2h3X2kyYyA9IDA7CiBpbnQgcmFkZW9uX3BjaWVfZ2VuMiA9IDA7CitpbnQgcmFkZW9uX21zaSA9IC0xOwogCiBNT0RVTEVfUEFSTV9ERVNDKG5vX3diLCAiRGlzYWJsZSBBR1Agd3JpdGViYWNrIGZvciBzY3JhdGNoIHJlZ2lzdGVycyIpOwogbW9kdWxlX3BhcmFtX25hbWVkKG5vX3diLCByYWRlb25fbm9fd2IsIGludCwgMDQ0NCk7CkBAIC0xNjQsNiArMTY2LDkgQEAKIE1PRFVMRV9QQVJNX0RFU0MocGNpZV9nZW4yLCAiUENJRSBHZW4yIG1vZGUgKDEgPSBlbmFibGUpIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQocGNpZV9nZW4yLCByYWRlb25fcGNpZV9nZW4yLCBpbnQsIDA0NDQpOwogCitNT0RVTEVfUEFSTV9ERVNDKG1zaSwgIk1TSSBzdXBwb3J0ICgxID0gZW5hYmxlLCAwID0gZGlzYWJsZSwgLTEgPSBhdXRvKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1zaSwgcmFkZW9uX21zaSwgaW50LCAwNDQ0KTsKKwogc3RhdGljIGludCByYWRlb25fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCmluZGV4IGViM2Y2ZGMuLjA2ZTQxM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwpAQCAtMjksMTIgKzI5LDYgQEAKICNpbmNsdWRlICJyYWRlb24uaCIKICNpbmNsdWRlICJhdG9tLmgiCiAKLWV4dGVybiBpbnQgYXRvbV9kZWJ1ZzsKLQotLyogZXZpbCBidXQgaW5jbHVkaW5nIGF0b21iaW9zLmggaXMgbXVjaCB3b3JzZSAqLwotYm9vbCByYWRlb25fYXRvbV9nZXRfdHZfdGltaW5ncyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGluZGV4LAotCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKLQogc3RhdGljIHVpbnQzMl90IHJhZGVvbl9lbmNvZGVyX2Nsb25lcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKQEAgLTE1NiwyNyArMTUwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgcmFkZW9uX2VuY29kZXJfaXNfZGlnaXRhbChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCXJldHVybiB0cnVlOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KIHZvaWQKIHJhZGVvbl9saW5rX2VuY29kZXJfY29ubmVjdG9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC0yMjksMjMgKzIwMiw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqCi1yYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7Ci0JCXJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMpCi0JCQlyZXR1cm4gY29ubmVjdG9yOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCitzdHJ1Y3QgZHJtX2VuY29kZXIgKnJhZGVvbl9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CkBAIC0yNjYsOSArMjIzLDkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotYm9vbCByYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2Uoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQordTE2IHJhZGVvbl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICpvdGhlcl9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IGRybV9lbmNvZGVyICpvdGhlcl9lbmNvZGVyID0gcmFkZW9uX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOwogCiAJaWYgKG90aGVyX2VuY29kZXIpIHsKIAkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKG90aGVyX2VuY29kZXIpOwpAQCAtMzMyLDIxMDUgKzI4OSwzIEBACiAKIH0KIAotc3RhdGljIGJvb2wgcmFkZW9uX2F0b21fbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCi0JCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCi17Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JLyogc2V0IHRoZSBhY3RpdmUgZW5jb2RlciB0byBjb25uZWN0b3Igcm91dGluZyAqLwotCXJhZGVvbl9lbmNvZGVyX3NldF9hY3RpdmVfZGV2aWNlKGVuY29kZXIpOwotCWRybV9tb2RlX3NldF9jcnRjaW5mbyhhZGp1c3RlZF9tb2RlLCAwKTsKLQotCS8qIGh3IGJ1ZyAqLwotCWlmICgobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKLQkgICAgJiYgKG1vZGUtPmNydGNfdnN5bmNfc3RhcnQgPCAobW9kZS0+Y3J0Y192ZGlzcGxheSArIDIpKSkKLQkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCA9IGFkanVzdGVkX21vZGUtPmNydGNfdmRpc3BsYXkgKyAyOwotCi0JLyogZ2V0IHRoZSBuYXRpdmUgbW9kZSBmb3IgTFZEUyAqLwotCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCi0JCXJhZGVvbl9wYW5lbF9tb2RlX2ZpeHVwKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOwotCi0JLyogZ2V0IHRoZSBuYXRpdmUgbW9kZSBmb3IgVFYgKi8KLQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpIHsKLQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjICp0dl9kYWMgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCWlmICh0dl9kYWMpIHsKLQkJCWlmICh0dl9kYWMtPnR2X3N0ZCA9PSBUVl9TVERfTlRTQyB8fAotCQkJICAgIHR2X2RhYy0+dHZfc3RkID09IFRWX1NURF9OVFNDX0ogfHwKLQkJCSAgICB0dl9kYWMtPnR2X3N0ZCA9PSBUVl9TVERfUEFMX00pCi0JCQkJcmFkZW9uX2F0b21fZ2V0X3R2X3RpbWluZ3MocmRldiwgMCwgYWRqdXN0ZWRfbW9kZSk7Ci0JCQllbHNlCi0JCQkJcmFkZW9uX2F0b21fZ2V0X3R2X3RpbWluZ3MocmRldiwgMSwgYWRqdXN0ZWRfbW9kZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpICYmCi0JICAgICgocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQgfCBBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpIHx8Ci0JICAgICByYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpKSB7Ci0JCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQkJcmFkZW9uX2RwX3NldF9saW5rX2NvbmZpZyhjb25uZWN0b3IsIG1vZGUpOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotYXRvbWJpb3NfZGFjX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0JREFDX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIGFyZ3M7Ci0JaW50IGluZGV4ID0gMDsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhY19pbmZvID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0Jc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMxOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzFFbmNvZGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzJFbmNvZGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCX0KLQotCWFyZ3MudWNBY3Rpb24gPSBhY3Rpb247Ci0KLQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKQotCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfUFMyOwotCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfQ1Y7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZGFjX2luZm8tPnR2X3N0ZCkgewotCQljYXNlIFRWX1NURF9QQUw6Ci0JCWNhc2UgVFZfU1REX1BBTF9NOgotCQljYXNlIFRWX1NURF9TQ0FSVF9QQUw6Ci0JCWNhc2UgVFZfU1REX1NFQ0FNOgotCQljYXNlIFRWX1NURF9QQUxfQ046Ci0JCQlhcmdzLnVjRGFjU3RhbmRhcmQgPSBBVE9NX0RBQzFfUEFMOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX05UU0M6Ci0JCWNhc2UgVFZfU1REX05UU0NfSjoKLQkJY2FzZSBUVl9TVERfUEFMXzYwOgotCQlkZWZhdWx0OgotCQkJYXJncy51Y0RhY1N0YW5kYXJkID0gQVRPTV9EQUMxX05UU0M7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlhcmdzLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1hdG9tYmlvc190dl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCVRWX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OIGFyZ3M7Ci0JaW50IGluZGV4ID0gMDsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhY19pbmZvID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0JaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVkVuY29kZXJDb250cm9sKTsKLQotCWFyZ3Muc1RWRW5jb2Rlci51Y0FjdGlvbiA9IGFjdGlvbjsKLQotCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKLQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfQ1Y7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZGFjX2luZm8tPnR2X3N0ZCkgewotCQljYXNlIFRWX1NURF9OVFNDOgotCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQzsKLQkJCWJyZWFrOwotCQljYXNlIFRWX1NURF9QQUw6Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfUEFMX006Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUxNOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX1BBTF82MDoKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX05UU0NfSjoKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX05UU0NKOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFZfU1REX1NDQVJUX1BBTDoKLQkJCWFyZ3Muc1RWRW5jb2Rlci51Y1R2U3RhbmRhcmQgPSBBVE9NX1RWX1BBTDsgLyogPz8/ICovCi0JCQlicmVhazsKLQkJY2FzZSBUVl9TVERfU0VDQU06Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9TRUNBTTsKLQkJCWJyZWFrOwotCQljYXNlIFRWX1NURF9QQUxfQ046Ci0JCQlhcmdzLnNUVkVuY29kZXIudWNUdlN0YW5kYXJkID0gQVRPTV9UVl9QQUxDTjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYXJncy5zVFZFbmNvZGVyLnVjVHZTdGFuZGFyZCA9IEFUT01fVFZfTlRTQzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JYXJncy5zVFZFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCi19Ci0KLXVuaW9uIGR2b19lbmNvZGVyX2NvbnRyb2wgewotCUVOQUJMRV9FWFRFUk5BTF9UTURTX0VOQ09ERVJfUFNfQUxMT0NBVElPTiBleHRfdG1kczsKLQlEVk9fRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gZHZvOwotCURWT19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMyBkdm9fdjM7Ci19OwotCi12b2lkCi1hdG9tYmlvc19kdm9fc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQl1bmlvbiBkdm9fZW5jb2Rlcl9jb250cm9sIGFyZ3M7Ci0JaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPRW5jb2RlckNvbnRyb2wpOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0JaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewotCQkvKiBEQ0UzKyAqLwotCQlhcmdzLmR2b192My51Y0FjdGlvbiA9IGFjdGlvbjsKLQkJYXJncy5kdm9fdjMudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCQlhcmdzLmR2b192My51Y0RWT0NvbmZpZyA9IDA7IC8qIFhYWCAqLwotCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0UyKHJkZXYpKSB7Ci0JCS8qIERDRTIgKHByZS1EQ0UzIFI2eHgsIFJTNjAwLzY5MC83NDAgKi8KLQkJYXJncy5kdm8uc0RWT0VuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247Ci0JCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKLQkJLyogREZQMSwgQ1JUMSwgVFYxIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBwb3J0ICovCi0JCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVjRGV2aWNlVHlwZSA9IEFUT01fREVWSUNFX0RGUDFfSU5ERVg7Ci0KLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCWFyZ3MuZHZvLnNEVk9FbmNvZGVyLnVzRGV2QXR0ci5zRGlnQXR0cmliLnVjQXR0cmlidXRlIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOwotCX0gZWxzZSB7Ci0JCS8qIFI0eHgsIFI1eHggKi8KLQkJYXJncy5leHRfdG1kcy5zWFRtZHNFbmNvZGVyLnVjRW5hYmxlID0gYWN0aW9uOwotCi0JCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQlhcmdzLmV4dF90bWRzLnNYVG1kc0VuY29kZXIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOwotCi0JCS8qaWYgKHBTY3JuLT5yZ2JCaXRzID09IDgpKi8KLQkJYXJncy5leHRfdG1kcy5zWFRtZHNFbmNvZGVyLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOwotCX0KLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotfQotCi11bmlvbiBsdmRzX2VuY29kZXJfY29udHJvbCB7Ci0JTFZEU19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiAgICB2MTsKLQlMVkRTX0VOQ09ERVJfQ09OVFJPTF9QU19BTExPQ0FUSU9OX1YyIHYyOwotfTsKLQotdm9pZAotYXRvbWJpb3NfZGlnaXRhbF9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBhY3Rpb24pCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCXVuaW9uIGx2ZHNfZW5jb2Rlcl9jb250cm9sIGFyZ3M7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgaGRtaV9kZXRlY3RlZCA9IDA7Ci0JdWludDhfdCBmcmV2LCBjcmV2OwotCi0JaWYgKCFkaWcpCi0JCXJldHVybjsKLQotCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0hETUkpCi0JCWhkbWlfZGV0ZWN0ZWQgPSAxOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0Jc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVkRTRW5jb2RlckNvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgotCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFMxRW5jb2RlckNvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgotCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVkRTRW5jb2RlckNvbnRyb2wpOwotCQllbHNlCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFRNRFMyRW5jb2RlckNvbnRyb2wpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChmcmV2KSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJc3dpdGNoIChjcmV2KSB7Ci0JCWNhc2UgMToKLQkJCWFyZ3MudjEudWNNaXNjID0gMDsKLQkJCWFyZ3MudjEudWNBY3Rpb24gPSBhY3Rpb247Ci0JCQlpZiAoaGRtaV9kZXRlY3RlZCkKLQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfSERNSV9UWVBFOwotCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfRFVBTCkKLQkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0JCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfODg4UkdCKQotCQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX1RNRFNfTElOS0I7Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQkJYXJncy52MS51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0JCQkJLyppZiAocFNjcm4tPnJnYkJpdHMgPT0gOCkgKi8KLQkJCQlhcmdzLnYxLnVjTWlzYyB8PSBBVE9NX1BBTkVMX01JU0NfODg4UkdCOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJY2FzZSAzOgotCQkJYXJncy52Mi51Y01pc2MgPSAwOwotCQkJYXJncy52Mi51Y0FjdGlvbiA9IGFjdGlvbjsKLQkJCWlmIChjcmV2ID09IDMpIHsKLQkJCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQotCQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfQ09IRVJFTlQ7Ci0JCQl9Ci0JCQlpZiAoaGRtaV9kZXRlY3RlZCkKLQkJCQlhcmdzLnYyLnVjTWlzYyB8PSBQQU5FTF9FTkNPREVSX01JU0NfSERNSV9UWVBFOwotCQkJYXJncy52Mi51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JCQlhcmdzLnYyLnVjVHJ1bmNhdGUgPSAwOwotCQkJYXJncy52Mi51Y1NwYXRpYWwgPSAwOwotCQkJYXJncy52Mi51Y1RlbXBvcmFsID0gMDsKLQkJCWFyZ3MudjIudWNGUkMgPSAwOwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgewotCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX0RVQUwpCi0JCQkJCWFyZ3MudjIudWNNaXNjIHw9IFBBTkVMX0VOQ09ERVJfTUlTQ19EVUFMOwotCQkJCWlmIChkaWctPmxjZF9taXNjICYgQVRPTV9QQU5FTF9NSVNDX1NQQVRJQUwpIHsKLQkJCQkJYXJncy52Mi51Y1NwYXRpYWwgPSBQQU5FTF9FTkNPREVSX1NQQVRJQUxfRElUSEVSX0VOOwotCQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ184ODhSR0IpCi0JCQkJCQlhcmdzLnYyLnVjU3BhdGlhbCB8PSBQQU5FTF9FTkNPREVSX1NQQVRJQUxfRElUSEVSX0RFUFRIOwotCQkJCX0KLQkJCQlpZiAoZGlnLT5sY2RfbWlzYyAmIEFUT01fUEFORUxfTUlTQ19URU1QT1JBTCkgewotCQkJCQlhcmdzLnYyLnVjVGVtcG9yYWwgPSBQQU5FTF9FTkNPREVSX1RFTVBPUkFMX0RJVEhFUl9FTjsKLQkJCQkJaWYgKGRpZy0+bGNkX21pc2MgJiBBVE9NX1BBTkVMX01JU0NfODg4UkdCKQotCQkJCQkJYXJncy52Mi51Y1RlbXBvcmFsIHw9IFBBTkVMX0VOQ09ERVJfVEVNUE9SQUxfRElUSEVSX0RFUFRIOwotCQkJCQlpZiAoKChkaWctPmxjZF9taXNjID4+IEFUT01fUEFORUxfTUlTQ19HUkVZX0xFVkVMX1NISUZUKSAmIDB4MykgPT0gMikKLQkJCQkJCWFyZ3MudjIudWNUZW1wb3JhbCB8PSBQQU5FTF9FTkNPREVSX1RFTVBPUkFMX0xFVkVMXzQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX1RNRFNfTElOS0I7Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQkJYXJncy52Mi51Y01pc2MgfD0gUEFORUxfRU5DT0RFUl9NSVNDX0RVQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkLCAlZFxuIiwgZnJldiwgY3Jldik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOwotCQlicmVhazsKLQl9Ci0KLQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLX0KLQotaW50Ci1hdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvcjsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvcjsKLQotCS8qIGRwIGJyaWRnZXMgYXJlIGFsd2F5cyBEUCAqLwotCWlmIChyYWRlb25fZW5jb2Rlcl9pc19kcF9icmlkZ2UoZW5jb2RlcikpCi0JCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EUDsKLQotCS8qIERWTyBpcyBhbHdheXMgRFZPICovCi0JaWYgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEFUT01fRU5DT0RFUl9NT0RFX0RWTykKLQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWTzsKLQotCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwotCS8qIGlmIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGRldmljZSB5ZXQsIGp1c3QgdXNlIG9uZSBvZgotCSAqIHRoZSBjb25uZWN0b3JzIHRpZWQgdG8gdGhlIGVuY29kZXIuCi0JICovCi0JaWYgKCFjb25uZWN0b3IpCi0JCWNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyX2luaXQoZW5jb2Rlcik7Ci0JcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQotCXN3aXRjaCAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSkgewotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUk6Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUI6IC8qIEhETUktQiBpcyBiYXNpY2FsbHkgREwtRFZJOyBhbmFsb2cgd29ya3MgZmluZSAqLwotCQlpZiAoZHJtX2RldGVjdF9tb25pdG9yX2F1ZGlvKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpICYmIHJhZGVvbl9hdWRpbykgewotCQkJLyogZml4IG1lICovCi0JCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQotCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0hETUk7Ci0JCX0gZWxzZSBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+dXNlX2RpZ2l0YWwpCi0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQllbHNlCi0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfQ1JUOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOgotCWRlZmF1bHQ6Ci0JCWlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgJiYgcmFkZW9uX2F1ZGlvKSB7Ci0JCQkvKiBmaXggbWUgKi8KLQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfSERNSTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTOgotCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfTFZEUzsKLQkJYnJlYWs7Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ6Ci0JCWRpZ19jb25uZWN0b3IgPSByYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKLQkJaWYgKChkaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPT0gQ09OTkVDVE9SX09CSkVDVF9JRF9ESVNQTEFZUE9SVCkgfHwKLQkJICAgIChkaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPT0gQ09OTkVDVE9SX09CSkVDVF9JRF9lRFApKQotCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwotCQllbHNlIGlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgJiYgcmFkZW9uX2F1ZGlvKSB7Ci0JCQkvKiBmaXggbWUgKi8KLQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfSERNSTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwotCQlicmVhazsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9lRFA6Ci0JCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EUDsKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklBOgotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1ZHQToKLQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0NSVDsKLQkJYnJlYWs7Ci0JY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfQ29tcG9zaXRlOgotCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX1NWSURFTzoKLQljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOOgotCQkvKiBmaXggbWUgKi8KLQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX1RWOwotCQkvKnJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9DVjsqLwotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiBESUcgRW5jb2Rlci9UcmFuc21pdHRlciBTZXR1cAotICoKLSAqIERDRSAzLjAvMy4xCi0gKiAtIDIgRElHIHRyYW5zbWl0dGVyIGJsb2Nrcy4gVU5JUEhZIChsaW5rcyBBIGFuZCBCKSBhbmQgTFZUTUEuCi0gKiBTdXBwb3J0cyB1cCB0byAzIGRpZ2l0YWwgb3V0cHV0cwotICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KLSAqIERJRzEgY2FuIGRyaXZlIFVOSVBIWSBsaW5rIEEgb3IgbGluayBCCi0gKiBESUcyIGNhbiBkcml2ZSBVTklQSFkgbGluayBCIG9yIExWVE1BCi0gKgotICogRENFIDMuMgotICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MuIFVOSVBIWTAvMS8yIChsaW5rcyBBIGFuZCBCKS4KLSAqIFN1cHBvcnRzIHVwIHRvIDUgZGlnaXRhbCBvdXRwdXRzCi0gKiAtIDIgRElHIGVuY29kZXIgYmxvY2tzLgotICogRElHMS8yIGNhbiBkcml2ZSBVTklQSFkwLzEvMiBsaW5rIEEgb3IgbGluayBCCi0gKgotICogRENFIDQuMC81LjAKLSAqIC0gMyBESUcgdHJhbnNtaXR0ZXIgYmxvY2tzIFVOSVBIWTAvMS8yIChsaW5rcyBBIGFuZCBCKS4KLSAqIFN1cHBvcnRzIHVwIHRvIDYgZGlnaXRhbCBvdXRwdXRzCi0gKiAtIDYgRElHIGVuY29kZXIgYmxvY2tzLgotICogLSBESUcgdG8gUEhZIG1hcHBpbmcgaXMgaGFyZGNvZGVkCi0gKiBESUcxIGRyaXZlcyBVTklQSFkwIGxpbmsgQSwgQStCCi0gKiBESUcyIGRyaXZlcyBVTklQSFkwIGxpbmsgQgotICogRElHMyBkcml2ZXMgVU5JUEhZMSBsaW5rIEEsIEErQgotICogRElHNCBkcml2ZXMgVU5JUEhZMSBsaW5rIEIKLSAqIERJRzUgZHJpdmVzIFVOSVBIWTIgbGluayBBLCBBK0IKLSAqIERJRzYgZHJpdmVzIFVOSVBIWTIgbGluayBCCi0gKgotICogRENFIDQuMQotICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgotICogU3VwcG9ydHMgdXAgdG8gNiBkaWdpdGFsIG91dHB1dHMKLSAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCi0gKiBESUcxLzIgY2FuIGRyaXZlIFVOSVBIWTAvMS8yIGxpbmsgQSBvciBsaW5rIEIKLSAqCi0gKiBSb3V0aW5nCi0gKiBjcnRjIC0+IGRpZyBlbmNvZGVyIC0+IFVOSVBIWS9MVlRNQSAoMSBvciAyIGxpbmtzKQotICogRXhhbXBsZXM6Ci0gKiBjcnRjMCAtPiBkaWcyIC0+IExWVE1BICAgbGlua3MgQStCIC0+IFRNRFMvSERNSQotICogY3J0YzEgLT4gZGlnMSAtPiBVTklQSFkwIGxpbmsgIEIgICAtPiBEUAotICogY3J0YzAgLT4gZGlnMSAtPiBVTklQSFkyIGxpbmsgIEEgICAtPiBMVkRTCi0gKiBjcnRjMSAtPiBkaWcyIC0+IFVOSVBIWTEgbGluayAgQitBIC0+IFRNRFMvSERNSQotICovCi0KLXVuaW9uIGRpZ19lbmNvZGVyX2NvbnRyb2wgewotCURJR19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKLQlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjIgdjI7Ci0JRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzIHYzOwotCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WNCB2NDsKLX07Ci0KLXZvaWQKLWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IGFjdGlvbiwgaW50IHBhbmVsX21vZGUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQl1bmlvbiBkaWdfZW5jb2Rlcl9jb250cm9sIGFyZ3M7Ci0JaW50IGluZGV4ID0gMDsKLQl1aW50OF90IGZyZXYsIGNyZXY7Ci0JaW50IGRwX2Nsb2NrID0gMDsKLQlpbnQgZHBfbGFuZV9jb3VudCA9IDA7Ci0JaW50IGhwZF9pZCA9IFJBREVPTl9IUERfTk9ORTsKLQlpbnQgYnBjID0gODsKLQotCWlmIChjb25uZWN0b3IpIHsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0KLQkJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OwotCi0JCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2s7Ci0JCWRwX2xhbmVfY291bnQgPSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OwotCQlocGRfaWQgPSByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkOwotCQlicGMgPSBjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGM7Ci0JfQotCi0JLyogbm8gZGlnIGVuY29kZXIgYXNzaWduZWQgKi8KLQlpZiAoZGlnLT5kaWdfZW5jb2RlciA9PSAtMSkKLQkJcmV0dXJuOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0JaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBESUd4RW5jb2RlckNvbnRyb2wpOwotCWVsc2UgewotCQlpZiAoZGlnLT5kaWdfZW5jb2RlcikKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRElHMkVuY29kZXJDb250cm9sKTsKLQkJZWxzZQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBESUcxRW5jb2RlckNvbnRyb2wpOwotCX0KLQotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQotCQlyZXR1cm47Ci0KLQlhcmdzLnYxLnVjQWN0aW9uID0gYWN0aW9uOwotCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCWlmIChhY3Rpb24gPT0gQVRPTV9FTkNPREVSX0NNRF9TRVRVUF9QQU5FTF9NT0RFKQotCQlhcmdzLnYzLnVjUGFuZWxNb2RlID0gcGFuZWxfbW9kZTsKLQllbHNlCi0JCWFyZ3MudjEudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7Ci0KLQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgfHwKLQkgICAgKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QpKQotCQlhcmdzLnYxLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7Ci0JZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQlhcmdzLnYxLnVjTGFuZU51bSA9IDg7Ci0JZWxzZQotCQlhcmdzLnYxLnVjTGFuZU51bSA9IDQ7Ci0KLQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7Ci0JCWlmICgoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB8fAotCQkgICAgKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QpKSB7Ci0JCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQotCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzJfNzBHSFo7Ci0JCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCi0JCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfNV80MEdIWjsKLQkJfQotCQlhcmdzLnY0LmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKLQkJc3dpdGNoIChicGMpIHsKLQkJY2FzZSAwOgotCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfQlBDX1VOREVGSU5FOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzZCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJZGVmYXVsdDoKLQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQlhcmdzLnY0LnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMEJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEyQklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfMTZCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGhwZF9pZCA9PSBSQURFT05fSFBEX05PTkUpCi0JCQlhcmdzLnY0LnVjSFBEX0lEID0gMDsKLQkJZWxzZQotCQkJYXJncy52NC51Y0hQRF9JRCA9IGhwZF9pZCArIDE7Ci0JfSBlbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKLQkJaWYgKChhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApICYmIChkcF9jbG9jayA9PSAyNzAwMDApKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWjsKLQkJYXJncy52My5hY0NvbmZpZy51Y0RpZ1NlbCA9IGRpZy0+ZGlnX2VuY29kZXI7Ci0JCXN3aXRjaCAoYnBjKSB7Ci0JCWNhc2UgMDoKLQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMX0JQQ19VTkRFRklORTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF82QklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCWRlZmF1bHQ6Ci0JCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfMTBCSVRfUEVSX0NPTE9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMkJJVF9QRVJfQ09MT1I7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjoKLQkJCWFyZ3MudjMudWNCaXRQZXJDb2xvciA9IFBBTkVMXzE2QklUX1BFUl9DT0xPUjsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKChhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApICYmIChkcF9jbG9jayA9PSAyNzAwMDApKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX0VOQ09ERVJfQ09ORklHX1YyX1RSQU5TTUlUVEVSMTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCQkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fRU5DT0RFUl9DT05GSUdfVjJfVFJBTlNNSVRURVIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX0VOQ09ERVJfQ09ORklHX1YyX1RSQU5TTUlUVEVSMzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChkaWctPmxpbmtiKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0xJTktCOwotCQllbHNlCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0E7Ci0JfQotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLX0KLQotdW5pb24gZGlnX3RyYW5zbWl0dGVyX2NvbnRyb2wgewotCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7Ci0JRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKLQlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzIHYzOwotCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQgdjQ7Ci19OwotCi12b2lkCi1hdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgYWN0aW9uLCB1aW50OF90IGxhbmVfbnVtLCB1aW50OF90IGxhbmVfc2V0KQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXVuaW9uIGRpZ190cmFuc21pdHRlcl9jb250cm9sIGFyZ3M7Ci0JaW50IGluZGV4ID0gMDsKLQl1aW50OF90IGZyZXYsIGNyZXY7Ci0JYm9vbCBpc19kcCA9IGZhbHNlOwotCWludCBwbGxfaWQgPSAwOwotCWludCBkcF9jbG9jayA9IDA7Ci0JaW50IGRwX2xhbmVfY291bnQgPSAwOwotCWludCBjb25uZWN0b3Jfb2JqZWN0X2lkID0gMDsKLQlpbnQgaWdwX2xhbmVfaW5mbyA9IDA7Ci0JaW50IGRpZ19lbmNvZGVyID0gZGlnLT5kaWdfZW5jb2RlcjsKLQotCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgewotCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOwotCQkvKiBqdXN0IG5lZWRlZCB0byBhdm9pZCBiYWlsaW5nIGluIHRoZSBlbmNvZGVyIGNoZWNrLiAgdGhlIGVuY29kZXIKLQkJICogaXNuJ3QgdXNlZCBmb3IgaW5pdAotCQkgKi8KLQkJZGlnX2VuY29kZXIgPSAwOwotCX0gZWxzZQotCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCWlmIChjb25uZWN0b3IpIHsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCXN0cnVjdCByYWRlb25fY29ubmVjdG9yX2F0b21fZGlnICpkaWdfY29ubmVjdG9yID0KLQkJCXJhZGVvbl9jb25uZWN0b3ItPmNvbl9wcml2OwotCi0JCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2s7Ci0JCWRwX2xhbmVfY291bnQgPSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OwotCQljb25uZWN0b3Jfb2JqZWN0X2lkID0KLQkJCShyYWRlb25fY29ubmVjdG9yLT5jb25uZWN0b3Jfb2JqZWN0X2lkICYgT0JKRUNUX0lEX01BU0spID4+IE9CSkVDVF9JRF9TSElGVDsKLQkJaWdwX2xhbmVfaW5mbyA9IGRpZ19jb25uZWN0b3ItPmlncF9sYW5lX2luZm87Ci0JfQotCi0JLyogbm8gZGlnIGVuY29kZXIgYXNzaWduZWQgKi8KLQlpZiAoZGlnX2VuY29kZXIgPT0gLTEpCi0JCXJldHVybjsKLQotCWlmIChhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKQotCQlpc19kcCA9IHRydWU7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBVTklQSFlUcmFuc21pdHRlckNvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9MVlRNQToKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVlRNQVRyYW5zbWl0dGVyQ29udHJvbCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQotCQlyZXR1cm47Ci0KLQlhcmdzLnYxLnVjQWN0aW9uID0gYWN0aW9uOwotCWlmIChhY3Rpb24gPT0gQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fSU5JVCkgewotCQlhcmdzLnYxLnVzSW5pdEluZm8gPSBjcHVfdG9fbGUxNihjb25uZWN0b3Jfb2JqZWN0X2lkKTsKLQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUF9WU0VNUEgpIHsKLQkJYXJncy52MS5hc01vZGUudWNMYW5lU2VsID0gbGFuZV9udW07Ci0JCWFyZ3MudjEuYXNNb2RlLnVjTGFuZVNldCA9IGxhbmVfc2V0OwotCX0gZWxzZSB7Ci0JCWlmIChpc19kcCkKLQkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0KLQkJCQljcHVfdG9fbGUxNihkcF9jbG9jayAvIDEwKTsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJYXJncy52MS51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNigocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMikgLyAxMCk7Ci0JCWVsc2UKLQkJCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCX0KLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7Ci0JCWlmIChpc19kcCkKLQkJCWFyZ3MudjMudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJYXJncy52My51Y0xhbmVOdW0gPSA4OwotCQllbHNlCi0JCQlhcmdzLnYzLnVjTGFuZU51bSA9IDQ7Ci0KLQkJaWYgKGRpZy0+bGlua2IpCi0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjTGlua1NlbCA9IDE7Ci0JCWlmIChkaWdfZW5jb2RlciAmIDEpCi0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjRW5jb2RlclNlbCA9IDE7Ci0KLQkJLyogU2VsZWN0IHRoZSBQTEwgZm9yIHRoZSBQSFkKLQkJICogRFAgUEhZIHNob3VsZCBiZSBjbG9ja2VkIGZyb20gZXh0ZXJuYWwgc3JjIGlmIHRoZXJlIGlzCi0JCSAqIG9uZS4KLQkJICovCi0JCWlmIChlbmNvZGVyLT5jcnRjKSB7Ci0JCQlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7Ci0JCQlwbGxfaWQgPSByYWRlb25fY3J0Yy0+cGxsX2lkOwotCQl9Ci0KLQkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgewotCQkJLyogT24gRENFNSBEQ1BMTCB1c3VhbGx5IGdlbmVyYXRlcyB0aGUgRFAgcmVmIGNsb2NrICovCi0JCQlpZiAoaXNfZHApIHsKLQkJCQlpZiAocmRldi0+Y2xvY2suZHBfZXh0Y2xrKQotCQkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gRU5DT0RFUl9SRUZDTEtfU1JDX0VYVENMSzsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjQuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBFTkNPREVSX1JFRkNMS19TUkNfRENQTEw7Ci0JCQl9IGVsc2UKLQkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOwotCQl9IGVsc2UgewotCQkJLyogT24gRENFNCwgaWYgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgY2xvY2ssIGl0IGdlbmVyYXRlcyB0aGUgRFAgcmVmIGNsb2NrICovCi0JCQlpZiAoaXNfZHAgJiYgcmRldi0+Y2xvY2suZHBfZXh0Y2xrKQotCQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSAyOyAvKiBleHRlcm5hbCBzcmMgKi8KLQkJCWVsc2UKLQkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOwotCQl9Ci0KLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJCWFyZ3MudjMuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQkJYXJncy52My5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAyOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaXNfZHApCi0JCQlhcmdzLnYzLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOyAvKiBEUCByZXF1aXJlcyBjb2hlcmVudCAqLwotCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCkpIHsKLQkJCWlmIChkaWctPmNvaGVyZW50X21vZGUpCi0JCQkJYXJncy52My5hY0NvbmZpZy5mQ29oZXJlbnRNb2RlID0gMTsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQkJYXJncy52My5hY0NvbmZpZy5mRHVhbExpbmtDb25uZWN0b3IgPSAxOwotCQl9Ci0JfSBlbHNlIGlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7Ci0JCWFyZ3MudjIuYWNDb25maWcudWNFbmNvZGVyU2VsID0gZGlnX2VuY29kZXI7Ci0JCWlmIChkaWctPmxpbmtiKQotCQkJYXJncy52Mi5hY0NvbmZpZy51Y0xpbmtTZWwgPSAxOwotCi0JCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JCQlhcmdzLnYyLmFjQ29uZmlnLnVjVHJhbnNtaXR0ZXJTZWwgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQkJCWFyZ3MudjIuYWNDb25maWcudWNUcmFuc21pdHRlclNlbCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQkJYXJncy52Mi5hY0NvbmZpZy51Y1RyYW5zbWl0dGVyU2VsID0gMjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGlzX2RwKSB7Ci0JCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOwotCQkJYXJncy52Mi5hY0NvbmZpZy5mRFBDb25uZWN0b3IgPSAxOwotCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0RGUF9TVVBQT1JUKSkgewotCQkJaWYgKGRpZy0+Y29oZXJlbnRfbW9kZSkKLQkJCQlhcmdzLnYyLmFjQ29uZmlnLmZDb2hlcmVudE1vZGUgPSAxOwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQlhcmdzLnYyLmFjQ29uZmlnLmZEdWFsTGlua0Nvbm5lY3RvciA9IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlhcmdzLnYxLnVjQ29uZmlnID0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ0xLU1JDX1BQTEw7Ci0KLQkJaWYgKGRpZ19lbmNvZGVyKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19ESUcyX0VOQ09ERVI7Ci0JCWVsc2UKLQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfRElHMV9FTkNPREVSOwotCi0JCWlmICgocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSAmJgotCQkgICAgKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWSkpIHsKLQkJCWlmIChpc19kcCB8fCAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIDw9IDE2NTAwMCkpIHsKLQkJCQlpZiAoaWdwX2xhbmVfaW5mbyAmIDB4MSkKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzBfMzsKLQkJCQllbHNlIGlmIChpZ3BfbGFuZV9pbmZvICYgMHgyKQotCQkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fVFJBTlNNSVRURVJfQ09ORklHX0xBTkVfNF83OwotCQkJCWVsc2UgaWYgKGlncF9sYW5lX2luZm8gJiAweDQpCi0JCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV84XzExOwotCQkJCWVsc2UgaWYgKGlncF9sYW5lX2luZm8gJiAweDgpCi0JCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8xMl8xNTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlncF9sYW5lX2luZm8gJiAweDMpCi0JCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTEFORV8wXzc7Ci0JCQkJZWxzZSBpZiAoaWdwX2xhbmVfaW5mbyAmIDB4YykKLQkJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19MQU5FXzhfMTU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGlnLT5saW5rYikKLQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTElOS0I7Ci0JCWVsc2UKLQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfTElOS0E7Ci0KLQkJaWYgKGlzX2RwKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19DT0hFUkVOVDsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfREZQX1NVUFBPUlQpKSB7Ci0JCQlpZiAoZGlnLT5jb2hlcmVudF9tb2RlKQotCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfQ09IRVJFTlQ7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQotCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfOExBTkVfTElOSzsKLQkJfQotCX0KLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotfQotCi1ib29sCi1hdG9tYmlvc19zZXRfZWRwX3BhbmVsX3Bvd2VyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCBhY3Rpb24pCi17Ci0Jc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bmlvbiBkaWdfdHJhbnNtaXR0ZXJfY29udHJvbCBhcmdzOwotCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIFVOSVBIWVRyYW5zbWl0dGVyQ29udHJvbCk7Ci0JdWludDhfdCBmcmV2LCBjcmV2OwotCi0JaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgIT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKLQkJZ290byBkb25lOwotCi0JaWYgKCFBU0lDX0lTX0RDRTQocmRldikpCi0JCWdvdG8gZG9uZTsKLQotCWlmICgoYWN0aW9uICE9IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKSAmJgotCSAgICAoYWN0aW9uICE9IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRikpCi0JCWdvdG8gZG9uZTsKLQotCWlmICghYXRvbV9wYXJzZV9jbWRfaGVhZGVyKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAmZnJldiwgJmNyZXYpKQotCQlnb3RvIGRvbmU7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlhcmdzLnYxLnVjQWN0aW9uID0gYWN0aW9uOwotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcGFuZWwgdG8gcG93ZXIgdXAgKi8KLQlpZiAoYWN0aW9uID09IEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMDA7IGkrKykgewotCQkJaWYgKHJhZGVvbl9ocGRfc2Vuc2UocmRldiwgcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQltZGVsYXkoMSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXVuaW9uIGV4dGVybmFsX2VuY29kZXJfY29udHJvbCB7Ci0JRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7Ci0JRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjMgdjM7Ci19OwotCi1zdGF0aWMgdm9pZAotYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciwKLQkJCQlpbnQgYWN0aW9uKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmV4dF9yYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGV4dF9lbmNvZGVyKTsKLQl1bmlvbiBleHRlcm5hbF9lbmNvZGVyX2NvbnRyb2wgYXJnczsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEV4dGVybmFsRW5jb2RlckNvbnRyb2wpOwotCXU4IGZyZXYsIGNyZXY7Ci0JaW50IGRwX2Nsb2NrID0gMDsKLQlpbnQgZHBfbGFuZV9jb3VudCA9IDA7Ci0JaW50IGNvbm5lY3Rvcl9vYmplY3RfaWQgPSAwOwotCXUzMiBleHRfZW51bSA9IChleHRfcmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSAmIEVOVU1fSURfTUFTSykgPj4gRU5VTV9JRF9TSElGVDsKLQlpbnQgYnBjID0gODsKLQotCWlmIChhY3Rpb24gPT0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9JTklUKQotCQljb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2Rlcl9pbml0KGVuY29kZXIpOwotCWVsc2UKLQkJY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7Ci0KLQlpZiAoY29ubmVjdG9yKSB7Ci0JCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqZGlnX2Nvbm5lY3RvciA9Ci0JCQlyYWRlb25fY29ubmVjdG9yLT5jb25fcHJpdjsKLQotCQlkcF9jbG9jayA9IGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrOwotCQlkcF9sYW5lX2NvdW50ID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKLQkJY29ubmVjdG9yX29iamVjdF9pZCA9Ci0JCQkocmFkZW9uX2Nvbm5lY3Rvci0+Y29ubmVjdG9yX29iamVjdF9pZCAmIE9CSkVDVF9JRF9NQVNLKSA+PiBPQkpFQ1RfSURfU0hJRlQ7Ci0JCWJwYyA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYzsKLQl9Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpZiAoIWF0b21fcGFyc2VfY21kX2hlYWRlcihyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgJmZyZXYsICZjcmV2KSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChmcmV2KSB7Ci0JY2FzZSAxOgotCQkvKiBubyBwYXJhbXMgb24gZnJldiAxICovCi0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc3dpdGNoIChjcmV2KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0FjdGlvbiA9IGFjdGlvbjsKLQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwotCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKLQotCQkJaWYgKGFyZ3MudjEuc0RpZ0VuY29kZXIudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgewotCQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCi0JCQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzJfNzBHSFo7Ci0JCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OwotCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCi0JCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSA4OwotCQkJZWxzZQotCQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNMYW5lTnVtID0gNDsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOwotCQkJaWYgKGFjdGlvbiA9PSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpCi0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51c0Nvbm5lY3RvcklkID0gY3B1X3RvX2xlMTYoY29ubmVjdG9yX29iamVjdF9pZCk7Ci0JCQllbHNlCi0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51c1BpeGVsQ2xvY2sgPSBjcHVfdG9fbGUxNihyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgLyAxMCk7Ci0JCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjRW5jb2Rlck1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwotCi0JCQlpZiAoYXJncy52My5zRXh0RW5jb2Rlci51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7Ci0JCQkJaWYgKGRwX2Nsb2NrID09IDI3MDAwMCkKLQkJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzJfNzBHSFo7Ci0JCQkJZWxzZSBpZiAoZHBfY2xvY2sgPT0gNTQwMDAwKQotCQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfNV80MEdIWjsKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7Ci0JCQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjTGFuZU51bSA9IDg7Ci0JCQllbHNlCi0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0xhbmVOdW0gPSA0OwotCQkJc3dpdGNoIChleHRfZW51bSkgewotCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDE6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQyOgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMzoKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIzOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3dpdGNoIChicGMpIHsKLQkJCWNhc2UgMDoKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF9CUENfVU5ERUZJTkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDY6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfNkJJVF9QRVJfQ09MT1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQlkZWZhdWx0OgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMDoKLQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF8xMEJJVF9QRVJfQ09MT1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyOgotCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzEyQklUX1BFUl9DT0xPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0JpdFBlckNvbG9yID0gUEFORUxfMTZCSVRfUEVSX0NPTE9SOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbjogJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbjogJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKLQkJcmV0dXJuOwotCX0KLQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLX0KLQotc3RhdGljIHZvaWQKLWF0b21iaW9zX3l1dl9zZXR1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7Ci0JRU5BQkxFX1lVVl9QU19BTExPQ0FUSU9OIGFyZ3M7Ci0JaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRW5hYmxlWVVWKTsKLQl1aW50MzJfdCB0ZW1wLCByZWc7Ci0KLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKLQkJcmVnID0gUjYwMF9CSU9TXzNfU0NSQVRDSDsKLQllbHNlCi0JCXJlZyA9IFJBREVPTl9CSU9TXzNfU0NSQVRDSDsKLQotCS8qIFhYWDogZml4IHVwIHNjcmF0Y2ggcmVnIGhhbmRsaW5nICovCi0JdGVtcCA9IFJSRUczMihyZWcpOwotCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJV1JFRzMyKHJlZywgKEFUT01fUzNfVFYxX0FDVElWRSB8Ci0JCQkgICAgIChyYWRlb25fY3J0Yy0+Y3J0Y19pZCA8PCAxOCkpKTsKLQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKLQkJV1JFRzMyKHJlZywgKEFUT01fUzNfQ1ZfQUNUSVZFIHwgKHJhZGVvbl9jcnRjLT5jcnRjX2lkIDw8IDI0KSkpOwotCWVsc2UKLQkJV1JFRzMyKHJlZywgMCk7Ci0KLQlpZiAoZW5hYmxlKQotCQlhcmdzLnVjRW5hYmxlID0gQVRPTV9FTkFCTEU7Ci0JYXJncy51Y0NSVEMgPSByYWRlb25fY3J0Yy0+Y3J0Y19pZDsKLQotCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCi0JV1JFRzMyKHJlZywgdGVtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOwotCURJU1BMQVlfREVWSUNFX09VVFBVVF9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKLQlpbnQgaW5kZXggPSAwOwotCWJvb2wgaXNfZGlnID0gZmFsc2U7Ci0JYm9vbCBpc19kY2U1X2RhYyA9IGZhbHNlOwotCWJvb2wgaXNfZGNlNV9kdm8gPSBmYWxzZTsKLQotCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLQotCURSTV9ERUJVR19LTVMoImVuY29kZXIgZHBtcyAlZCB0byBtb2RlICVkLCBkZXZpY2VzICUwOHgsIGFjdGl2ZV9kZXZpY2VzICUwOHhcbiIsCi0JCSAgcmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQsIG1vZGUsIHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzLAotCQkgIHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlKTsKLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9UTURTMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9UTURTMToKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUTURTQU91dHB1dENvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCQlpc19kaWcgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6Ci0JCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JCWlmIChBU0lDX0lTX0RDRTUocmRldikpCi0JCQlpc19kY2U1X2R2byA9IHRydWU7Ci0JCWVsc2UgaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkKLQkJCWlzX2RpZyA9IHRydWU7Ci0JCWVsc2UKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRFZPT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKLQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMQ0QxT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIExDRDFPdXRwdXRDb250cm9sKTsKLQkJZWxzZQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBMVlRNQU91dHB1dENvbnRyb2wpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkKLQkJCWlzX2RjZTVfZGFjID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCi0JCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVjFPdXRwdXRDb250cm9sKTsKLQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgQ1YxT3V0cHV0Q29udHJvbCk7Ci0JCQllbHNlCi0JCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMxT3V0cHV0Q29udHJvbCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVFYxT3V0cHV0Q29udHJvbCk7Ci0JCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDVjFPdXRwdXRDb250cm9sKTsKLQkJZWxzZQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMyT3V0cHV0Q29udHJvbCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChpc19kaWcpIHsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PTjoKLQkJCS8qIHNvbWUgZWFybHkgZGNlMy4yIGJvYXJkcyBoYXZlIGEgYnVnIGluIHRoZWlyIHRyYW5zbWl0dGVyIGNvbnRyb2wgdGFibGUgKi8KLQkJCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlY3MTApIHx8IChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjczMCkpCi0JCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRSwgMCwgMCk7Ci0JCQllbHNlCi0JCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRV9PVVRQVVQsIDAsIDApOwotCQkJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKLQkJCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7Ci0KLQkJCQlpZiAoY29ubmVjdG9yICYmCi0JCQkJICAgIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApKSB7Ci0JCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQkJCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPQotCQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7Ci0JCQkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAotCQkJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09OKTsKLQkJCQkJcmFkZW9uX2RpZ19jb25uZWN0b3ItPmVkcF9vbiA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfRFBfVklERU9fT0ZGLCAwKTsKLQkJCQlyYWRlb25fZHBfbGlua190cmFpbihlbmNvZGVyLCBjb25uZWN0b3IpOwotCQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfRFBfVklERU9fT04sIDApOwotCQkJfQotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKLQkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fTENEX0JMT04sIDAsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgotCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9ESVNBQkxFX09VVFBVVCwgMCwgMCk7Ci0JCQlpZiAoYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgewotCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCQkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5DT0RFUl9DTURfRFBfVklERU9fT0ZGLCAwKTsKLQkJCQlpZiAoY29ubmVjdG9yICYmCi0JCQkJICAgIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApKSB7Ci0JCQkJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQkJCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyAqcmFkZW9uX2RpZ19jb25uZWN0b3IgPQotCQkJCQkJcmFkZW9uX2Nvbm5lY3Rvci0+Y29uX3ByaXY7Ci0JCQkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAotCQkJCQkJCQkgICAgIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX1BPV0VSX09GRik7Ci0JCQkJCXJhZGVvbl9kaWdfY29ubmVjdG9yLT5lZHBfb24gPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQotCQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9MQ0RfQkxPRkYsIDAsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGlzX2RjZTVfZGFjKSB7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCQlhdG9tYmlvc19kYWNfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgotCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKLQkJCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGlzX2RjZTVfZHZvKSB7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgotCQljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09GRjoKLQkJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgotCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fRU5BQkxFOwotCQkJLyogd29ya2Fyb3VuZCBmb3IgRFZPT3V0cHV0Q29udHJvbCBvbiBzb21lIFJTNjkwIHN5c3RlbXMgKi8KLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREkpIHsKLQkJCQl1MzIgcmVnID0gUlJFRzMyKFJBREVPTl9CSU9TXzNfU0NSQVRDSCk7Ci0JCQkJV1JFRzMyKFJBREVPTl9CSU9TXzNfU0NSQVRDSCwgcmVnICYgfkFUT01fUzNfREZQMklfQUNUSVZFKTsKLQkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQkJCQlXUkVHMzIoUkFERU9OX0JJT1NfM19TQ1JBVENILCByZWcpOwotCQkJfSBlbHNlCi0JCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0JCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKSB7Ci0JCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fTENEX0JMT047Ci0JCQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgotCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYXJncy51Y0FjdGlvbiA9IEFUT01fRElTQUJMRTsKLQkJCWF0b21fZXhlY3V0ZV90YWJsZShyZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRleCwgKHVpbnQzMl90ICopJmFyZ3MpOwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgewotCQkJCWFyZ3MudWNBY3Rpb24gPSBBVE9NX0xDRF9CTE9GRjsKLQkJCQlhdG9tX2V4ZWN1dGVfdGFibGUocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICh1aW50MzJfdCAqKSZhcmdzKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGV4dF9lbmNvZGVyKSB7Ci0JCXN3aXRjaCAobW9kZSkgewotCQljYXNlIERSTV9NT0RFX0RQTVNfT046Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgewotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCi0JCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQpOwotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCi0JCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkdfT0ZGKTsKLQkJCX0gZWxzZQotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRU5BQkxFKTsKLQkJCWJyZWFrOwotCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKLQkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6Ci0JCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgewotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCi0JCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkcpOwotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCi0JCQkJCQkJCUVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RJU0FCTEVfT1VUUFVUKTsKLQkJCX0gZWxzZQotCQkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRElTQUJMRSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJhZGVvbl9hdG9tYmlvc19lbmNvZGVyX2RwbXNfc2NyYXRjaF9yZWdzKGVuY29kZXIsIChtb2RlID09IERSTV9NT0RFX0RQTVNfT04pID8gdHJ1ZSA6IGZhbHNlKTsKLQotfQotCi11bmlvbiBjcnRjX3NvdXJjZV9wYXJhbSB7Ci0JU0VMRUNUX0NSVENfU09VUkNFX1BTX0FMTE9DQVRJT04gdjE7Ci0JU0VMRUNUX0NSVENfU09VUkNFX1BBUkFNRVRFUlNfVjIgdjI7Ci19OwotCi1zdGF0aWMgdm9pZAotYXRvbWJpb3Nfc2V0X2VuY29kZXJfY3J0Y19zb3VyY2Uoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7Ci0JdW5pb24gY3J0Y19zb3VyY2VfcGFyYW0gYXJnczsKLQlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBTZWxlY3RDUlRDX1NvdXJjZSk7Ci0JdWludDhfdCBmcmV2LCBjcmV2OwotCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnOwotCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCi0JaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoZnJldikgewotCWNhc2UgMToKLQkJc3dpdGNoIChjcmV2KSB7Ci0JCWNhc2UgMToKLQkJZGVmYXVsdDoKLQkJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQotCQkJCWFyZ3MudjEudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7Ci0JCQllbHNlIHsKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMSkgewotCQkJCQlhcmdzLnYxLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFyZ3MudjEudWNDUlRDID0gcmFkZW9uX2NydGMtPmNydGNfaWQgPDwgMjsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6Ci0JCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0RGUDFfSU5ERVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCkKLQkJCQkJYXJncy52MS51Y0RldmljZSA9IEFUT01fREVWSUNFX0xDRDFfSU5ERVg7Ci0JCQkJZWxzZQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfREZQM19JTkRFWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfREZQMl9JTkRFWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfVFYxX0lOREVYOwotCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1ZfSU5ERVg7Ci0JCQkJZWxzZQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1JUMV9JTkRFWDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfVFYxX0lOREVYOwotCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1ZfSU5ERVg7Ci0JCQkJZWxzZQotCQkJCQlhcmdzLnYxLnVjRGV2aWNlID0gQVRPTV9ERVZJQ0VfQ1JUMl9JTkRFWDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlhcmdzLnYyLnVjQ1JUQyA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCQkJaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RwX2JyaWRnZShlbmNvZGVyKSkgewotCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSByYWRlb25fZ2V0X2Nvbm5lY3Rvcl9mb3JfZW5jb2RlcihlbmNvZGVyKTsKLQotCQkJCWlmIChjb25uZWN0b3ItPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKQotCQkJCQlhcmdzLnYyLnVjRW5jb2RlTW9kZSA9IEFUT01fRU5DT0RFUl9NT0RFX0xWRFM7Ci0JCQkJZWxzZSBpZiAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfVkdBKQotCQkJCQlhcmdzLnYyLnVjRW5jb2RlTW9kZSA9IEFUT01fRU5DT0RFUl9NT0RFX0NSVDsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKLQkJCX0gZWxzZQotCQkJCWFyZ3MudjIudWNFbmNvZGVNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKLQkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCQkJZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCQkJCXN3aXRjaCAoZGlnLT5kaWdfZW5jb2RlcikgewotCQkJCWNhc2UgMDoKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzFfRU5DT0RFUl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHMl9FTkNPREVSX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUczX0VOQ09ERVJfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RJRzRfRU5DT0RFUl9JRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfRElHNV9FTkNPREVSX0lEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDU6Ci0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9ESUc2X0VOQ09ERVJfSUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RWT19FTkNPREVSX0lEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQkJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOwotCQkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJCQlhcmdzLnYyLnVjRW5jb2RlcklEID0gQVNJQ19JTlRfVFZfRU5DT0RFUl9JRDsKLQkJCQllbHNlCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9EQUMxX0VOQ09ERVJfSUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgotCQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX1RWX0VOQ09ERVJfSUQ7Ci0JCQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJCWFyZ3MudjIudWNFbmNvZGVySUQgPSBBU0lDX0lOVF9UVl9FTkNPREVSX0lEOwotCQkJCWVsc2UKLQkJCQkJYXJncy52Mi51Y0VuY29kZXJJRCA9IEFTSUNfSU5UX0RBQzJfRU5DT0RFUl9JRDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uOiAlZCwgJWRcbiIsIGZyZXYsIGNyZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLQkvKiB1cGRhdGUgc2NyYXRjaCByZWdzIHdpdGggbmV3IHJvdXRpbmcgKi8KLQlyYWRlb25fYXRvbWJpb3NfZW5jb2Rlcl9jcnRjX3NjcmF0Y2hfcmVncyhlbmNvZGVyLCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hdG9tYmlvc19hcHBseV9lbmNvZGVyX3F1aXJrcyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOwotCi0JLyogRnVua3kgbWFjYm9va3MgKi8KLQlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NzFDNSkgJiYKLQkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNmIpICYmCi0JICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDgwKSkgewotCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiBBVE9NX0RFVklDRV9MQ0QxX1NVUFBPUlQpIHsKLQkJCXVpbnQzMl90IGx2dG1hX2JpdF9kZXB0aF9jb250cm9sID0gUlJFRzMyKEFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MKTsKLQotCQkJbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgJj0gfkFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MX1RSVU5DQVRFX0VOOwotCQkJbHZ0bWFfYml0X2RlcHRoX2NvbnRyb2wgJj0gfkFWSVZPX0xWVE1BX0JJVF9ERVBUSF9DT05UUk9MX1NQQVRJQUxfRElUSEVSX0VOOwotCi0JCQlXUkVHMzIoQVZJVk9fTFZUTUFfQklUX0RFUFRIX0NPTlRST0wsIGx2dG1hX2JpdF9kZXB0aF9jb250cm9sKTsKLQkJfQotCX0KLQotCS8qIHNldCBzY2FsZXIgY2xlYXJzIHRoaXMgb24gc29tZSBjaGlwcyAqLwotCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpICYmCi0JICAgICghKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKSkpIHsKLQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewotCQkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCi0JCQkJV1JFRzMyKEVWRVJHUkVFTl9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkJCQkgICAgICAgRVZFUkdSRUVOX0lOVEVSTEVBVkVfRU4pOwotCQkJZWxzZQotCQkJCVdSRUczMihFVkVSR1JFRU5fREFUQV9GT1JNQVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOwotCQl9IGVsc2UgewotCQkJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpCi0JCQkJV1JFRzMyKEFWSVZPX0QxTU9ERV9EQVRBX0ZPUk1BVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKLQkJCQkgICAgICAgQVZJVk9fRDFNT0RFX0lOVEVSTEVBVkVfRU4pOwotCQkJZWxzZQotCQkJCVdSRUczMihBVklWT19EMU1PREVfREFUQV9GT1JNQVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHJhZGVvbl9hdG9tX3BpY2tfZGlnX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhlbmNvZGVyLT5jcnRjKTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICp0ZXN0X2VuY29kZXI7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7Ci0JdWludDMyX3QgZGlnX2VuY19pbl91c2UgPSAwOwotCi0JLyogRENFNC81ICovCi0JaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewotCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7Ci0JCQkvKiBvbnRhcmlvIGZvbGxvd3MgRENFNCAqLwotCQkJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHsKLQkJCQlpZiAoZGlnLT5saW5rYikKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZQotCQkJCS8qIGxsYW5vIGZvbGxvd3MgRENFMy4yICovCi0JCQkJcmV0dXJuIHJhZGVvbl9jcnRjLT5jcnRjX2lkOwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JCQkJaWYgKGRpZy0+bGlua2IpCi0JCQkJCXJldHVybiAxOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTE6Ci0JCQkJaWYgKGRpZy0+bGlua2IpCi0JCQkJCXJldHVybiAzOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCQkJaWYgKGRpZy0+bGlua2IpCi0JCQkJCXJldHVybiA1OwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIDQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBvbiBEQ0UzMiBhbmQgZW5jb2RlciBjYW4gZHJpdmVyIGFueSBibG9jayBzbyBqdXN0IGNydGMgaWQgKi8KLQlpZiAoQVNJQ19JU19EQ0UzMihyZGV2KSkgewotCQlyZXR1cm4gcmFkZW9uX2NydGMtPmNydGNfaWQ7Ci0JfQotCi0JLyogb24gRENFMyAtIExWVE1BIGNhbiBvbmx5IGJlIGRyaXZlbiBieSBESUdCICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZXN0X2VuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl90ZXN0X2VuY29kZXI7Ci0KLQkJaWYgKGVuY29kZXIgPT0gdGVzdF9lbmNvZGVyKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFyYWRlb25fZW5jb2Rlcl9pc19kaWdpdGFsKHRlc3RfZW5jb2RlcikpCi0JCQljb250aW51ZTsKLQotCQlyYWRlb25fdGVzdF9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIodGVzdF9lbmNvZGVyKTsKLQkJZGlnID0gcmFkZW9uX3Rlc3RfZW5jb2Rlci0+ZW5jX3ByaXY7Ci0KLQkJaWYgKGRpZy0+ZGlnX2VuY29kZXIgPj0gMCkKLQkJCWRpZ19lbmNfaW5fdXNlIHw9ICgxIDw8IGRpZy0+ZGlnX2VuY29kZXIpOwotCX0KLQotCWlmIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUEpIHsKLQkJaWYgKGRpZ19lbmNfaW5fdXNlICYgMHgyKQotCQkJRFJNX0VSUk9SKCJMVkRTIHJlcXVpcmVkIGRpZ2l0YWwgZW5jb2RlciAyIGJ1dCBpdCB3YXMgaW4gdXNlIC0gc3RlYWxpbmdcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCEoZGlnX2VuY19pbl91c2UgJiAxKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgb25jZSBhdCBzdGFydHVwICovCi12b2lkCi1yYWRlb25fYXRvbV9lbmNvZGVyX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJkZXYtPmRkZXY7Ci0Jc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7Ci0KLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0xWVE1BOgotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0lOSVQsIDAsIDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChleHRfZW5jb2RlciAmJiBBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXJhZGVvbl9hdG9tX2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKLQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZXh0X2VuY29kZXIgPSByYWRlb25fYXRvbV9nZXRfZXh0ZXJuYWxfZW5jb2RlcihlbmNvZGVyKTsKLQotCXJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA9IGFkanVzdGVkX21vZGUtPmNsb2NrOwotCi0JaWYgKEFTSUNfSVNfQVZJVk8ocmRldikgJiYgIUFTSUNfSVNfRENFNChyZGV2KSkgewotCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCB8IEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJYXRvbWJpb3NfeXV2X3NldHVwKGVuY29kZXIsIHRydWUpOwotCQllbHNlCi0JCQlhdG9tYmlvc195dXZfc2V0dXAoZW5jb2RlciwgZmFsc2UpOwotCX0KLQotCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWVE0xOgotCQlhdG9tYmlvc19kaWdpdGFsX3NldHVwKGVuY29kZXIsIFBBTkVMX0VOQ09ERVJfQUNUSU9OX0VOQUJMRSk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKLQkJCS8qIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyICovCi0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7Ci0JCQkvKiBzZXR1cCBhbmQgZW5hYmxlIHRoZSBlbmNvZGVyICovCi0JCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0VOQ09ERVJfQ01EX1NFVFVQLCAwKTsKLQotCQkJLyogZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLwotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0VOQUJMRSwgMCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBkaXNhYmxlIHRoZSBlbmNvZGVyIGFuZCB0cmFuc21pdHRlciAqLwotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUsIDAsIDApOwotCQkJYXRvbWJpb3NfZGlnX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFLCAwKTsKLQotCQkJLyogc2V0dXAgYW5kIGVuYWJsZSB0aGUgZW5jb2RlciBhbmQgdHJhbnNtaXR0ZXIgKi8KLQkJCWF0b21iaW9zX2RpZ19lbmNvZGVyX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFLCAwKTsKLQkJCWF0b21iaW9zX2RpZ190cmFuc21pdHRlcl9zZXR1cChlbmNvZGVyLCBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9TRVRVUCwgMCwgMCk7Ci0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRU5BQkxFLCAwLCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RESToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RWTzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJYXRvbWJpb3NfZHZvX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpIHsKLQkJCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQkJYXRvbWJpb3NfdHZfc2V0dXAoZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCQkJZWxzZQotCQkJCWF0b21iaW9zX3R2X3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGV4dF9lbmNvZGVyKSB7Ci0JCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQotCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX1NFVFVQKTsKLQkJZWxzZQotCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOwotCX0KLQotCWF0b21iaW9zX2FwcGx5X2VuY29kZXJfcXVpcmtzKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOwotCi0JaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkgewotCQlyNjAwX2hkbWlfZW5hYmxlKGVuY29kZXIpOwotCQlyNjAwX2hkbWlfc2V0bW9kZShlbmNvZGVyLCBhZGp1c3RlZF9tb2RlKTsKLQl9Ci19Ci0KLXN0YXRpYyBib29sCi1hdG9tYmlvc19kYWNfbG9hZF9kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQotCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUIHwKLQkJCQkgICAgICAgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCB8Ci0JCQkJICAgICAgIEFUT01fREVWSUNFX0NSVF9TVVBQT1JUKSkgewotCQlEQUNfTE9BRF9ERVRFQ1RJT05fUFNfQUxMT0NBVElPTiBhcmdzOwotCQlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUNfTG9hZERldGVjdGlvbik7Ci0JCXVpbnQ4X3QgZnJldiwgY3JldjsKLQotCQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0KLQkJaWYgKCFhdG9tX3BhcnNlX2NtZF9oZWFkZXIocmRldi0+bW9kZV9pbmZvLmF0b21fY29udGV4dCwgaW5kZXgsICZmcmV2LCAmY3JldikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYXJncy5zRGFjbG9hZC51Y01pc2MgPSAwOwotCi0JCWlmICgocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQgPT0gRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMSkgfHwKLQkJICAgIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCA9PSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMSkpCi0JCQlhcmdzLnNEYWNsb2FkLnVjRGFjVHlwZSA9IEFUT01fREFDX0E7Ci0JCWVsc2UKLQkJCWFyZ3Muc0RhY2xvYWQudWNEYWNUeXBlID0gQVRPTV9EQUNfQjsKLQotCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCkKLQkJCWFyZ3Muc0RhY2xvYWQudXNEZXZpY2VJRCA9IGNwdV90b19sZTE2KEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCk7Ci0JCWVsc2UgaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpCi0JCQlhcmdzLnNEYWNsb2FkLnVzRGV2aWNlSUQgPSBjcHVfdG9fbGUxNihBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQpOwotCQllbHNlIGlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkgewotCQkJYXJncy5zRGFjbG9hZC51c0RldmljZUlEID0gY3B1X3RvX2xlMTYoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCk7Ci0JCQlpZiAoY3JldiA+PSAzKQotCQkJCWFyZ3Muc0RhY2xvYWQudWNNaXNjID0gREFDX0xPQURfTUlTQ19ZUHJQYjsKLQkJfSBlbHNlIGlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpIHsKLQkJCWFyZ3Muc0RhY2xvYWQudXNEZXZpY2VJRCA9IGNwdV90b19sZTE2KEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKTsKLQkJCWlmIChjcmV2ID49IDMpCi0JCQkJYXJncy5zRGFjbG9hZC51Y01pc2MgPSBEQUNfTE9BRF9NSVNDX1lQclBiOwotCQl9Ci0KLQkJYXRvbV9leGVjdXRlX3RhYmxlKHJkZXYtPm1vZGVfaW5mby5hdG9tX2NvbnRleHQsIGluZGV4LCAodWludDMyX3QgKikmYXJncyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKLXJhZGVvbl9hdG9tX2RhY19kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQl1aW50MzJfdCBiaW9zXzBfc2NyYXRjaDsKLQotCWlmICghYXRvbWJpb3NfZGFjX2xvYWRfZGV0ZWN0KGVuY29kZXIsIGNvbm5lY3RvcikpIHsKLQkJRFJNX0RFQlVHX0tNUygiZGV0ZWN0IHJldHVybmVkIGZhbHNlIFxuIik7Ci0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247Ci0JfQotCi0JaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApCi0JCWJpb3NfMF9zY3JhdGNoID0gUlJFRzMyKFI2MDBfQklPU18wX1NDUkFUQ0gpOwotCWVsc2UKLQkJYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUkFERU9OX0JJT1NfMF9TQ1JBVENIKTsKLQotCURSTV9ERUJVR19LTVMoIkJpb3MgMCBzY3JhdGNoICV4ICUwOHhcbiIsIGJpb3NfMF9zY3JhdGNoLCByYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyk7Ci0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DUlQxX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgQVRPTV9TMF9DUlQxX01BU0spCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMl9TVVBQT1JUKSB7Ci0JCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMl9NQVNLKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCX0KLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NWX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfQ1ZfTUFTS3xBVE9NX1MwX0NWX01BU0tfQSkpCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JfQotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpIHsKLQkJaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX0NPTVBPU0lURSB8IEFUT01fUzBfVFYxX0NPTVBPU0lURV9BKSkKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogQ1RWICovCi0JCWVsc2UgaWYgKGJpb3NfMF9zY3JhdGNoICYgKEFUT01fUzBfVFYxX1NWSURFTyB8IEFUT01fUzBfVFYxX1NWSURFT19BKSkKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsgLyogU1RWICovCi0JfQotCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKLX0KLQotc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKLXJhZGVvbl9hdG9tX2RpZ19kZXRlY3Qoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmV4dF9lbmNvZGVyID0gcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoZW5jb2Rlcik7Ci0JdTMyIGJpb3NfMF9zY3JhdGNoOwotCi0JaWYgKCFBU0lDX0lTX0RDRTQocmRldikpCi0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247Ci0KLQlpZiAoIWV4dF9lbmNvZGVyKQotCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c191bmtub3duOwotCi0JaWYgKChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpID09IDApCi0JCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247Ci0KLQkvKiBsb2FkIGRldGVjdCBvbiB0aGUgZHAgYnJpZGdlICovCi0JYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKLQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfREFDTE9BRF9ERVRFQ1RJT04pOwotCi0JYmlvc18wX3NjcmF0Y2ggPSBSUkVHMzIoUjYwMF9CSU9TXzBfU0NSQVRDSCk7Ci0KLQlEUk1fREVCVUdfS01TKCJCaW9zIDAgc2NyYXRjaCAleCAlMDh4XG4iLCBiaW9zXzBfc2NyYXRjaCwgcmFkZW9uX2VuY29kZXItPmRldmljZXMpOwotCWlmIChyYWRlb25fY29ubmVjdG9yLT5kZXZpY2VzICYgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUKSB7Ci0JCWlmIChiaW9zXzBfc2NyYXRjaCAmIEFUT01fUzBfQ1JUMV9NQVNLKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCX0KLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCkgewotCQlpZiAoYmlvc18wX3NjcmF0Y2ggJiBBVE9NX1MwX0NSVDJfTUFTSykKLQkJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKLQl9Ci0JaWYgKHJhZGVvbl9jb25uZWN0b3ItPmRldmljZXMgJiBBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSB7Ci0JCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX0NWX01BU0t8QVRPTV9TMF9DVl9NQVNLX0EpKQotCQkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCX0KLQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGV2aWNlcyAmIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB7Ci0JCWlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9DT01QT1NJVEUgfCBBVE9NX1MwX1RWMV9DT01QT1NJVEVfQSkpCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIENUViAqLwotCQllbHNlIGlmIChiaW9zXzBfc2NyYXRjaCAmIChBVE9NX1MwX1RWMV9TVklERU8gfCBBVE9NX1MwX1RWMV9TVklERU9fQSkpCi0JCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7IC8qIFNUViAqLwotCX0KLQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Ci19Ci0KLXZvaWQKLXJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IGRybV9lbmNvZGVyICpleHRfZW5jb2RlciA9IHJhZGVvbl9hdG9tX2dldF9leHRlcm5hbF9lbmNvZGVyKGVuY29kZXIpOwotCi0JaWYgKGV4dF9lbmNvZGVyKQotCQkvKiBkZGNfc2V0dXAgb24gdGhlIGRwIGJyaWRnZSAqLwotCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLAotCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRERDX1NFVFVQKTsKLQotfQotCi1zdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7Ci0KLQlpZiAoKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYKLQkgICAgIChBVE9NX0RFVklDRV9ERlBfU1VQUE9SVCB8IEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgfHwKLQkgICAgcmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKGVuY29kZXIpKSB7Ci0JCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCQlpZiAoZGlnKQotCQkJZGlnLT5kaWdfZW5jb2RlciA9IHJhZGVvbl9hdG9tX3BpY2tfZGlnX2VuY29kZXIoZW5jb2Rlcik7Ci0JfQotCi0JcmFkZW9uX2F0b21fb3V0cHV0X2xvY2soZW5jb2RlciwgdHJ1ZSk7Ci0JcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKLQotCWlmIChjb25uZWN0b3IpIHsKLQkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0KLQkJLyogc2VsZWN0IHRoZSBjbG9jay9kYXRhIHBvcnQgaWYgaXQgdXNlcyBhIHJvdXRlciAqLwotCQlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+cm91dGVyLmNkX3ZhbGlkKQotCQkJcmFkZW9uX3JvdXRlcl9zZWxlY3RfY2RfcG9ydChyYWRlb25fY29ubmVjdG9yKTsKLQotCQkvKiB0dXJuIGVEUCBwYW5lbCBvbiBmb3IgbW9kZSBzZXQgKi8KLQkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkKLQkJCWF0b21iaW9zX3NldF9lZHBfcGFuZWxfcG93ZXIoY29ubmVjdG9yLAotCQkJCQkJICAgICBBVE9NX1RSQU5TTUlUVEVSX0FDVElPTl9QT1dFUl9PTik7Ci0JfQotCi0JLyogdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwbGwvc3Mgc2V0dXAgdG8gd29yayBjb3JyZWN0bHkgaW4gc29tZSBjYXNlcyAqLwotCWF0b21iaW9zX3NldF9lbmNvZGVyX2NydGNfc291cmNlKGVuY29kZXIpOwotfQotCi1zdGF0aWMgdm9pZCByYWRlb25fYXRvbV9lbmNvZGVyX2NvbW1pdChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0JcmFkZW9uX2F0b21fZW5jb2Rlcl9kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwotCXJhZGVvbl9hdG9tX291dHB1dF9sb2NrKGVuY29kZXIsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZW5jb2Rlcl9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWc7Ci0KLQkvKiBjaGVjayBmb3IgcHJlLURDRTMgY2FyZHMgd2l0aCBzaGFyZWQgZW5jb2RlcnM7Ci0JICogY2FuJ3QgcmVhbGx5IHVzZSB0aGUgbGlua3MgaW5kaXZpZHVhbGx5LCBzbyBkb24ndCBkaXNhYmxlCi0JICogdGhlIGVuY29kZXIgaWYgaXQncyBpbiB1c2UgYnkgYW5vdGhlciBjb25uZWN0b3IKLQkgKi8KLQlpZiAoIUFTSUNfSVNfRENFMyhyZGV2KSkgewotCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKm90aGVyX2VuY29kZXI7Ci0JCXN0cnVjdCByYWRlb25fZW5jb2RlciAqb3RoZXJfcmFkZW9uX2VuY29kZXI7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvdGhlcl9lbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGhlYWQpIHsKLQkJCW90aGVyX3JhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIob3RoZXJfZW5jb2Rlcik7Ci0JCQlpZiAoKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID09IG90aGVyX3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSAmJgotCQkJICAgIGRybV9oZWxwZXJfZW5jb2Rlcl9pbl91c2Uob3RoZXJfZW5jb2RlcikpCi0JCQkJZ290byBkaXNhYmxlX2RvbmU7Ci0JCX0KLQl9Ci0KLQlyYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMoZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOwotCi0Jc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZUTTE6Ci0JCWF0b21iaW9zX2RpZ2l0YWxfc2V0dXAoZW5jb2RlciwgUEFORUxfRU5DT0RFUl9BQ1RJT05fRElTQUJMRSk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWTI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCQkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLwotCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0RJU0FCTEUsIDAsIDApOwotCQllbHNlIHsKLQkJCS8qIGRpc2FibGUgdGhlIGVuY29kZXIgYW5kIHRyYW5zbWl0dGVyICovCi0JCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fRElTQUJMRSwgMCwgMCk7Ci0JCQlhdG9tYmlvc19kaWdfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUsIDApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRERJOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfRFZPMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6Ci0JCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0RJU0FCTEUpOwotCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCB8IEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJYXRvbWJpb3NfdHZfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKLQkJYnJlYWs7Ci0JfQotCi1kaXNhYmxlX2RvbmU6Ci0JaWYgKHJhZGVvbl9lbmNvZGVyX2lzX2RpZ2l0YWwoZW5jb2RlcikpIHsKLQkJaWYgKGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2RlcikgPT0gQVRPTV9FTkNPREVSX01PREVfSERNSSkKLQkJCXI2MDBfaGRtaV9kaXNhYmxlKGVuY29kZXIpOwotCQlkaWcgPSByYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXY7Ci0JCWRpZy0+ZGlnX2VuY29kZXIgPSAtMTsKLQl9Ci0JcmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgPSAwOwotfQotCi0vKiB0aGVzZSBhcmUgaGFuZGxlZCBieSB0aGUgcHJpbWFyeSBlbmNvZGVycyAqLwotc3RhdGljIHZvaWQgcmFkZW9uX2F0b21fZXh0X3ByZXBhcmUoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCi19Ci0KLXN0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2V4dF9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1yYWRlb25fYXRvbV9leHRfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAotCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQotewotCi19Ci0KLXN0YXRpYyB2b2lkIHJhZGVvbl9hdG9tX2V4dF9kaXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQotfQotCi1zdGF0aWMgdm9pZAotcmFkZW9uX2F0b21fZXh0X2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKLXsKLQotfQotCi1zdGF0aWMgYm9vbCByYWRlb25fYXRvbV9leHRfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCi0JCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAotCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKLXsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZXh0X2hlbHBlcl9mdW5jcyA9IHsKLQkuZHBtcyA9IHJhZGVvbl9hdG9tX2V4dF9kcG1zLAotCS5tb2RlX2ZpeHVwID0gcmFkZW9uX2F0b21fZXh0X21vZGVfZml4dXAsCi0JLnByZXBhcmUgPSByYWRlb25fYXRvbV9leHRfcHJlcGFyZSwKLQkubW9kZV9zZXQgPSByYWRlb25fYXRvbV9leHRfbW9kZV9zZXQsCi0JLmNvbW1pdCA9IHJhZGVvbl9hdG9tX2V4dF9jb21taXQsCi0JLmRpc2FibGUgPSByYWRlb25fYXRvbV9leHRfZGlzYWJsZSwKLQkvKiBubyBkZXRlY3QgZm9yIFRNRFMvTFZEUyB5ZXQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJhZGVvbl9hdG9tX2RpZ19oZWxwZXJfZnVuY3MgPSB7Ci0JLmRwbXMgPSByYWRlb25fYXRvbV9lbmNvZGVyX2RwbXMsCi0JLm1vZGVfZml4dXAgPSByYWRlb25fYXRvbV9tb2RlX2ZpeHVwLAotCS5wcmVwYXJlID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9wcmVwYXJlLAotCS5tb2RlX3NldCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfbW9kZV9zZXQsCi0JLmNvbW1pdCA9IHJhZGVvbl9hdG9tX2VuY29kZXJfY29tbWl0LAotCS5kaXNhYmxlID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9kaXNhYmxlLAotCS5kZXRlY3QgPSByYWRlb25fYXRvbV9kaWdfZGV0ZWN0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgcmFkZW9uX2F0b21fZGFjX2hlbHBlcl9mdW5jcyA9IHsKLQkuZHBtcyA9IHJhZGVvbl9hdG9tX2VuY29kZXJfZHBtcywKLQkubW9kZV9maXh1cCA9IHJhZGVvbl9hdG9tX21vZGVfZml4dXAsCi0JLnByZXBhcmUgPSByYWRlb25fYXRvbV9lbmNvZGVyX3ByZXBhcmUsCi0JLm1vZGVfc2V0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9tb2RlX3NldCwKLQkuY29tbWl0ID0gcmFkZW9uX2F0b21fZW5jb2Rlcl9jb21taXQsCi0JLmRldGVjdCA9IHJhZGVvbl9hdG9tX2RhY19kZXRlY3QsCi19OwotCi12b2lkIHJhZGVvbl9lbmNfZGVzdHJveShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCi17Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCWtmcmVlKHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdik7Ci0JZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKLQlrZnJlZShyYWRlb25fZW5jb2Rlcik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfZnVuY3MgcmFkZW9uX2F0b21fZW5jX2Z1bmNzID0gewotCS5kZXN0cm95ID0gcmFkZW9uX2VuY19kZXN0cm95LAotfTsKLQotc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGFjICoKLXJhZGVvbl9hdG9tYmlvc19zZXRfZGFjX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmFkZW9uX2VuY29kZXItPmJhc2UuZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kYWMgKmRhYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RhYyksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkYWMpCi0JCXJldHVybiBOVUxMOwotCi0JZGFjLT50dl9zdGQgPSByYWRlb25fYXRvbWJpb3NfZ2V0X3R2X2luZm8ocmRldik7Ci0JcmV0dXJuIGRhYzsKLX0KLQotc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICoKLXJhZGVvbl9hdG9tYmlvc19zZXRfZGlnX2luZm8oc3RydWN0IHJhZGVvbl9lbmNvZGVyICpyYWRlb25fZW5jb2RlcikKLXsKLQlpbnQgZW5jb2Rlcl9lbnVtID0gKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gJiBFTlVNX0lEX01BU0spID4+IEVOVU1fSURfU0hJRlQ7Ci0Jc3RydWN0IHJhZGVvbl9lbmNvZGVyX2F0b21fZGlnICpkaWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghZGlnKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIGNvaGVyZW50IG1vZGUgYnkgZGVmYXVsdCAqLwotCWRpZy0+Y29oZXJlbnRfbW9kZSA9IHRydWU7Ci0JZGlnLT5kaWdfZW5jb2RlciA9IC0xOwotCi0JaWYgKGVuY29kZXJfZW51bSA9PSAyKQotCQlkaWctPmxpbmtiID0gdHJ1ZTsKLQllbHNlCi0JCWRpZy0+bGlua2IgPSBmYWxzZTsKLQotCXJldHVybiBkaWc7Ci19Ci0KLXZvaWQKLXJhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQl1aW50MzJfdCBlbmNvZGVyX2VudW0sCi0JCQl1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAotCQkJdTE2IGNhcHMpCi17Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKLQlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyOwotCi0JLyogc2VlIGlmIHdlIGFscmVhZHkgYWRkZWQgaXQgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewotCQlyYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGVuY29kZXIpOwotCQlpZiAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfZW51bSA9PSBlbmNvZGVyX2VudW0pIHsKLQkJCXJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzIHw9IHN1cHBvcnRlZF9kZXZpY2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCS8qIGFkZCBhIG5ldyBvbmUgKi8KLQlyYWRlb25fZW5jb2RlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByYWRlb25fZW5jb2RlciksIEdGUF9LRVJORUwpOwotCWlmICghcmFkZW9uX2VuY29kZXIpCi0JCXJldHVybjsKLQotCWVuY29kZXIgPSAmcmFkZW9uX2VuY29kZXItPmJhc2U7Ci0Jc3dpdGNoIChyZGV2LT5udW1fY3J0YykgewotCWNhc2UgMToKLQkJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAweDE7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQlkZWZhdWx0OgotCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4MzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4ZjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IDB4M2Y7Ci0JCWJyZWFrOwotCX0KLQotCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IE5VTEw7Ci0KLQlyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtID0gZW5jb2Rlcl9lbnVtOwotCXJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkID0gKGVuY29kZXJfZW51bSAmIE9CSkVDVF9JRF9NQVNLKSA+PiBPQkpFQ1RfSURfU0hJRlQ7Ci0JcmFkZW9uX2VuY29kZXItPmRldmljZXMgPSBzdXBwb3J0ZWRfZGV2aWNlOwotCXJhZGVvbl9lbmNvZGVyLT5ybXhfdHlwZSA9IFJNWF9PRkY7Ci0JcmFkZW9uX2VuY29kZXItPnVuZGVyc2Nhbl90eXBlID0gVU5ERVJTQ0FOX09GRjsKLQlyYWRlb25fZW5jb2Rlci0+aXNfZXh0X2VuY29kZXIgPSBmYWxzZTsKLQlyYWRlb25fZW5jb2Rlci0+Y2FwcyA9IGNhcHM7Ci0KLQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVkRTOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9MVlRNMToKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgewotCQkJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX0ZVTEw7Ci0JCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKLQkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19nZXRfbHZkc19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJfSBlbHNlIHsKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOwotCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhyYWRlb25fZW5jb2Rlcik7Ci0JCX0KLQkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMToKLQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKLQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kYWNfaW5mbyhyYWRlb25fZW5jb2Rlcik7Ci0JCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2RhY19oZWxwZXJfZnVuY3MpOwotCQlicmVhazsKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzI6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgotCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9UVkRBQyk7Ci0JCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19zZXRfZGFjX2luZm8ocmFkZW9uX2VuY29kZXIpOwotCQlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZyYWRlb25fYXRvbV9kYWNfaGVscGVyX2Z1bmNzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EVk8xOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RWTzE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EREk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFk6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfTFZUTUE6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkgewotCQkJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX0ZVTEw7Ci0JCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKLQkJCXJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdiA9IHJhZGVvbl9hdG9tYmlvc19nZXRfbHZkc19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9DUlRfU1VQUE9SVCkpIHsKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX0RBQyk7Ci0JCQlyYWRlb25fZW5jb2Rlci0+ZW5jX3ByaXYgPSByYWRlb25fYXRvbWJpb3Nfc2V0X2RpZ19pbmZvKHJhZGVvbl9lbmNvZGVyKTsKLQkJfSBlbHNlIHsKLQkJCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmcmFkZW9uX2F0b21fZW5jX2Z1bmNzLCBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOwotCQkJcmFkZW9uX2VuY29kZXItPmVuY19wcml2ID0gcmFkZW9uX2F0b21iaW9zX3NldF9kaWdfaW5mbyhyYWRlb25fZW5jb2Rlcik7Ci0JCX0KLQkJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVyLCAmcmFkZW9uX2F0b21fZGlnX2hlbHBlcl9mdW5jcyk7Ci0JCWJyZWFrOwotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfU0kxNzBCOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfQ0g3MzAzOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfRVhURVJOQUxfU0RWT0E6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9FWFRFUk5BTF9TRFZPQjoKLQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RJVEZQNTEzOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVlQxNjIzOgotCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSERNSV9TSTE5MzA6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVM6Ci0JY2FzZSBFTkNPREVSX09CSkVDVF9JRF9OVVRNRUc6Ci0JCS8qIHRoZXNlIGFyZSBoYW5kbGVkIGJ5IHRoZSBwcmltYXJ5IGVuY29kZXJzICovCi0JCXJhZGVvbl9lbmNvZGVyLT5pc19leHRfZW5jb2RlciA9IHRydWU7Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+ZGV2aWNlcyAmIChBVE9NX0RFVklDRV9MQ0RfU1VQUE9SVCkpCi0JCQlkcm1fZW5jb2Rlcl9pbml0KGRldiwgZW5jb2RlciwgJnJhZGVvbl9hdG9tX2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfQ1JUX1NVUFBPUlQpKQotCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfREFDKTsKLQkJZWxzZQotCQkJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZyYWRlb25fYXRvbV9lbmNfZnVuY3MsIERSTV9NT0RFX0VOQ09ERVJfVE1EUyk7Ci0JCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJnJhZGVvbl9hdG9tX2V4dF9oZWxwZXJfZnVuY3MpOwotCQlicmVhazsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwppbmRleCAzNDc1YTA5Li43NmVjMGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQkgKi8KIAkJaWYgKHNlcSA9PSByZGV2LT5mZW5jZV9kcnYubGFzdF9zZXEgJiYgcmFkZW9uX2dwdV9pc19sb2NrdXAocmRldikpIHsKIAkJCS8qIGdvb2QgbmV3cyB3ZSBiZWxpZXZlIGl0J3MgYSBsb2NrdXAgKi8KLQkJCVdBUk4oMSwgIkdQVSBsb2NrdXAgKHdhaXRpbmcgZm9yIDB4JTA4WCBsYXN0IGZlbmNlIGlkIDB4JTA4WClcbiIsCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFUgbG9ja3VwICh3YWl0aW5nIGZvciAweCUwOFggbGFzdCBmZW5jZSBpZCAweCUwOFgpXG4iLAogCQkJICAgICBmZW5jZS0+c2VxLCBzZXEpOwogCQkJLyogRklYTUU6IHdoYXQgc2hvdWxkIHdlIGRvID8gbWFya2luZyBldmVyeW9uZQogCQkJICogYXMgc2lnbmFsZWQgZm9yIG5vdwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZ2FydC5jCmluZGV4IGE1MzNmNTIuLmJhN2FiNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2dhcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9nYXJ0LmMKQEAgLTQ5LDI3ICs0OSwyNyBAQAogCQkJICAgICAgcmRldi0+Z2FydC50YWJsZV9zaXplID4+IFBBR0VfU0hJRlQpOwogCX0KICNlbmRpZgotCXJkZXYtPmdhcnQudGFibGUucmFtLnB0ciA9IHB0cjsKLQltZW1zZXQoKHZvaWQgKilyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHIsIDAsIHJkZXYtPmdhcnQudGFibGVfc2l6ZSk7CisJcmRldi0+Z2FydC5wdHIgPSBwdHI7CisJbWVtc2V0KCh2b2lkICopcmRldi0+Z2FydC5wdHIsIDAsIHJkZXYtPmdhcnQudGFibGVfc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgcmFkZW9uX2dhcnRfdGFibGVfcmFtX2ZyZWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JaWYgKHJkZXYtPmdhcnQudGFibGUucmFtLnB0ciA9PSBOVUxMKSB7CisJaWYgKHJkZXYtPmdhcnQucHRyID09IE5VTEwpIHsKIAkJcmV0dXJuOwogCX0KICNpZmRlZiBDT05GSUdfWDg2CiAJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNDAwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNDgwIHx8CiAJICAgIHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwIHx8IHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNzQwKSB7Ci0JCXNldF9tZW1vcnlfd2IoKHVuc2lnbmVkIGxvbmcpcmRldi0+Z2FydC50YWJsZS5yYW0ucHRyLAorCQlzZXRfbWVtb3J5X3diKCh1bnNpZ25lZCBsb25nKXJkZXYtPmdhcnQucHRyLAogCQkJICAgICAgcmRldi0+Z2FydC50YWJsZV9zaXplID4+IFBBR0VfU0hJRlQpOwogCX0KICNlbmRpZgogCXBjaV9mcmVlX2NvbnNpc3RlbnQocmRldi0+cGRldiwgcmRldi0+Z2FydC50YWJsZV9zaXplLAotCQkJICAgICh2b2lkICopcmRldi0+Z2FydC50YWJsZS5yYW0ucHRyLAorCQkJICAgICh2b2lkICopcmRldi0+Z2FydC5wdHIsCiAJCQkgICAgcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKLQlyZGV2LT5nYXJ0LnRhYmxlLnJhbS5wdHIgPSBOVUxMOworCXJkZXYtPmdhcnQucHRyID0gTlVMTDsKIAlyZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPSAwOwogfQogCkBAIC03NywxMCArNzcsMTAgQEAKIHsKIAlpbnQgcjsKIAotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiA9PSBOVUxMKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaiA9PSBOVUxMKSB7CiAJCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIHJkZXYtPmdhcnQudGFibGVfc2l6ZSwKIAkJCQkgICAgIFBBR0VfU0laRSwgdHJ1ZSwgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwKLQkJCQkgICAgICZyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCQkJICAgICAmcmRldi0+Z2FydC5yb2JqKTsKIAkJaWYgKHIpIHsKIAkJCXJldHVybiByOwogCQl9CkBAIC05MywzOCArOTMsNDYgQEAKIAl1aW50NjRfdCBncHVfYWRkcjsKIAlpbnQgcjsKIAotCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwgZmFsc2UpOworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnJvYmosIGZhbHNlKTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkKIAkJcmV0dXJuIHI7Ci0JciA9IHJhZGVvbl9ib19waW4ocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmosCisJciA9IHJhZGVvbl9ib19waW4ocmRldi0+Z2FydC5yb2JqLAogCQkJCVJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZncHVfYWRkcik7CiAJaWYgKHIpIHsKLQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC5yb2JqKTsKIAkJcmV0dXJuIHI7CiAJfQotCXIgPSByYWRlb25fYm9fa21hcChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwKLQkJCQkodm9pZCAqKikmcmRldi0+Z2FydC50YWJsZS52cmFtLnB0cik7CisJciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPmdhcnQucm9iaiwgJnJkZXYtPmdhcnQucHRyKTsKIAlpZiAocikKLQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQucm9iaik7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnJvYmopOwogCXJkZXYtPmdhcnQudGFibGVfYWRkciA9IGdwdV9hZGRyOwogCXJldHVybiByOwogfQogCi12b2lkIHJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fZnJlZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3ZvaWQgcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcjsKIAotCWlmIChyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiA9PSBOVUxMKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaiA9PSBOVUxMKSB7CiAJCXJldHVybjsKIAl9Ci0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQucm9iaiwgZmFsc2UpOwogCWlmIChsaWtlbHkociA9PSAwKSkgewotCQlyYWRlb25fYm9fa3VubWFwKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaik7CisJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC5yb2JqKTsKKwkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQucm9iaik7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC5yb2JqKTsKKwkJcmRldi0+Z2FydC5wdHIgPSBOVUxMOwogCX0KLQlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKK30KKwordm9pZCByYWRlb25fZ2FydF90YWJsZV92cmFtX2ZyZWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJaWYgKHJkZXYtPmdhcnQucm9iaiA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJcmFkZW9uX2dhcnRfdGFibGVfdnJhbV91bnBpbihyZGV2KTsKKwlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPmdhcnQucm9iaik7CiB9CiAKIApAQCAtMTQyLDcgKzE1MCw3IEBACiAJdTY0IHBhZ2VfYmFzZTsKIAogCWlmICghcmRldi0+Z2FydC5yZWFkeSkgewotCQlXQVJOKDEsICJ0cnlpbmcgdG8gdW5iaW5kIG1lbW9yeSB0byB1bml0aWFsaXplZCBHQVJUICFcbiIpOworCQlXQVJOKDEsICJ0cnlpbmcgdG8gdW5iaW5kIG1lbW9yeSBmcm9tIHVuaW5pdGlhbGl6ZWQgR0FSVCAhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAl0ID0gb2Zmc2V0IC8gUkFERU9OX0dQVV9QQUdFX1NJWkU7CkBAIC0xNTEsMTIgKzE1OSwxNCBAQAogCQlpZiAocmRldi0+Z2FydC5wYWdlc1twXSkgewogCQkJaWYgKCFyZGV2LT5nYXJ0LnR0bV9hbGxvY2VkW3BdKQogCQkJCXBjaV91bm1hcF9wYWdlKHJkZXYtPnBkZXYsIHJkZXYtPmdhcnQucGFnZXNfYWRkcltwXSwKLQkJCQkgICAgICAgCQlQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCQlQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCQlyZGV2LT5nYXJ0LnBhZ2VzW3BdID0gTlVMTDsKIAkJCXJkZXYtPmdhcnQucGFnZXNfYWRkcltwXSA9IHJkZXYtPmR1bW15X3BhZ2UuYWRkcjsKIAkJCXBhZ2VfYmFzZSA9IHJkZXYtPmdhcnQucGFnZXNfYWRkcltwXTsKIAkJCWZvciAoaiA9IDA7IGogPCAoUEFHRV9TSVpFIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUpOyBqKyssIHQrKykgewotCQkJCXJhZGVvbl9nYXJ0X3NldF9wYWdlKHJkZXYsIHQsIHBhZ2VfYmFzZSk7CisJCQkJaWYgKHJkZXYtPmdhcnQucHRyKSB7CisJCQkJCXJhZGVvbl9nYXJ0X3NldF9wYWdlKHJkZXYsIHQsIHBhZ2VfYmFzZSk7CisJCQkJfQogCQkJCXBhZ2VfYmFzZSArPSBSQURFT05fR1BVX1BBR0VfU0laRTsKIAkJCX0KIAkJfQpAQCAtMTc0LDcgKzE4NCw3IEBACiAJaW50IGksIGo7CiAKIAlpZiAoIXJkZXYtPmdhcnQucmVhZHkpIHsKLQkJV0FSTigxLCAidHJ5aW5nIHRvIGJpbmQgbWVtb3J5IHRvIHVuaXRpYWxpemVkIEdBUlQgIVxuIik7CisJCVdBUk4oMSwgInRyeWluZyB0byBiaW5kIG1lbW9yeSB0byB1bmluaXRpYWxpemVkIEdBUlQgIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAl0ID0gb2Zmc2V0IC8gUkFERU9OX0dQVV9QQUdFX1NJWkU7CkBAIC0xOTksMTAgKzIwOSwxMiBAQAogCQkJfQogCQl9CiAJCXJkZXYtPmdhcnQucGFnZXNbcF0gPSBwYWdlbGlzdFtpXTsKLQkJcGFnZV9iYXNlID0gcmRldi0+Z2FydC5wYWdlc19hZGRyW3BdOwotCQlmb3IgKGogPSAwOyBqIDwgKFBBR0VfU0laRSAvIFJBREVPTl9HUFVfUEFHRV9TSVpFKTsgaisrLCB0KyspIHsKLQkJCXJhZGVvbl9nYXJ0X3NldF9wYWdlKHJkZXYsIHQsIHBhZ2VfYmFzZSk7Ci0JCQlwYWdlX2Jhc2UgKz0gUkFERU9OX0dQVV9QQUdFX1NJWkU7CisJCWlmIChyZGV2LT5nYXJ0LnB0cikgeworCQkJcGFnZV9iYXNlID0gcmRldi0+Z2FydC5wYWdlc19hZGRyW3BdOworCQkJZm9yIChqID0gMDsgaiA8IChQQUdFX1NJWkUgLyBSQURFT05fR1BVX1BBR0VfU0laRSk7IGorKywgdCsrKSB7CisJCQkJcmFkZW9uX2dhcnRfc2V0X3BhZ2UocmRldiwgdCwgcGFnZV9iYXNlKTsKKwkJCQlwYWdlX2Jhc2UgKz0gUkFERU9OX0dQVV9QQUdFX1NJWkU7CisJCQl9CiAJCX0KIAl9CiAJbWIoKTsKQEAgLTIxNSw2ICsyMjcsOSBAQAogCWludCBpLCBqLCB0OwogCXU2NCBwYWdlX2Jhc2U7CiAKKwlpZiAoIXJkZXYtPmdhcnQucHRyKSB7CisJCXJldHVybjsKKwl9CiAJZm9yIChpID0gMCwgdCA9IDA7IGkgPCByZGV2LT5nYXJ0Lm51bV9jcHVfcGFnZXM7IGkrKykgewogCQlwYWdlX2Jhc2UgPSByZGV2LT5nYXJ0LnBhZ2VzX2FkZHJbaV07CiAJCWZvciAoaiA9IDA7IGogPCAoUEFHRV9TSVpFIC8gUkFERU9OX0dQVV9QQUdFX1NJWkUpOyBqKyssIHQrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYwppbmRleCA2YzExMWMxLi43YmIxYjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pMmMuYwpAQCAtMjMsNiArMjMsOCBAQAogICogQXV0aG9yczogRGF2ZSBBaXJsaWUKICAqICAgICAgICAgIEFsZXggRGV1Y2hlcgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAicmFkZW9uX2RybS5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgpAQCAtMzIsNyArMzQsNyBAQAogICogcmFkZW9uX2RkY19wcm9iZQogICoKICAqLwotYm9vbCByYWRlb25fZGRjX3Byb2JlKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLCBib29sIHJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKQorYm9vbCByYWRlb25fZGRjX3Byb2JlKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yKQogewogCXU4IG91dCA9IDB4MDsKIAl1OCBidWZbOF07CkBAIC00NywxNSArNDksMTEgQEAKIAkJewogCQkJLmFkZHIgPSAweDUwLAogCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuID0gMSwKKwkJCS5sZW4gPSA4LAogCQkJLmJ1ZiA9IGJ1ZiwKIAkJfQogCX07CiAKLQkvKiBSZWFkIDggYnl0ZXMgZnJvbSBpMmMgZm9yIGV4dGVuZGVkIHByb2JlIG9mIEVESUQgaGVhZGVyICovCi0JaWYgKHJlcXVpcmVzX2V4dGVuZGVkX3Byb2JlKQotCQltc2dzWzFdLmxlbiA9IDg7Ci0KIAkvKiBvbiBodyB3aXRoIHJvdXRlcnMsIHNlbGVjdCByaWdodCBwb3J0ICovCiAJaWYgKHJhZGVvbl9jb25uZWN0b3ItPnJvdXRlci5kZGNfdmFsaWQpCiAJCXJhZGVvbl9yb3V0ZXJfc2VsZWN0X2RkY19wb3J0KHJhZGVvbl9jb25uZWN0b3IpOwpAQCAtNjQsMjUgKzYyLDI0IEBACiAJaWYgKHJldCAhPSAyKQogCQkvKiBDb3VsZG4ndCBmaW5kIGFuIGFjY2Vzc2libGUgRERDIG9uIHRoaXMgY29ubmVjdG9yICovCiAJCXJldHVybiBmYWxzZTsKLQlpZiAocmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmUpIHsKLQkJLyogUHJvYmUgYWxzbyBmb3IgdmFsaWQgRURJRCBoZWFkZXIKLQkJICogRURJRCBoZWFkZXIgc3RhcnRzIHdpdGg6Ci0JCSAqIDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMC4KLQkJICogT25seSB0aGUgZmlyc3QgNiBieXRlcyBtdXN0IGJlIHZhbGlkIGFzCi0JCSAqIGRybV9lZGlkX2Jsb2NrX3ZhbGlkKCkgY2FuIGZpeCB0aGUgbGFzdCAyIGJ5dGVzICovCi0JCWlmIChkcm1fZWRpZF9oZWFkZXJfaXNfdmFsaWQoYnVmKSA8IDYpIHsKLQkJCS8qIENvdWxkbid0IGZpbmQgYW4gYWNjZXNzaWJsZSBFRElEIG9uIHRoaXMKLQkJCSAqIGNvbm5lY3RvciAqLwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisJLyogUHJvYmUgYWxzbyBmb3IgdmFsaWQgRURJRCBoZWFkZXIKKwkgKiBFRElEIGhlYWRlciBzdGFydHMgd2l0aDoKKwkgKiAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAuCisJICogT25seSB0aGUgZmlyc3QgNiBieXRlcyBtdXN0IGJlIHZhbGlkIGFzCisJICogZHJtX2VkaWRfYmxvY2tfdmFsaWQoKSBjYW4gZml4IHRoZSBsYXN0IDIgYnl0ZXMgKi8KKwlpZiAoZHJtX2VkaWRfaGVhZGVyX2lzX3ZhbGlkKGJ1ZikgPCA2KSB7CisJCS8qIENvdWxkbid0IGZpbmQgYW4gYWNjZXNzaWJsZSBFRElEIG9uIHRoaXMKKwkJICogY29ubmVjdG9yICovCisJCXJldHVybiBmYWxzZTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CiAKIC8qIGJpdCBiYW5naW5nIGkyYyAqLwogCi1zdGF0aWMgdm9pZCByYWRlb25faTJjX2RvX2xvY2soc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjLCBpbnQgbG9ja19zdGF0ZSkKK3N0YXRpYyBpbnQgcHJlX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCkKIHsKKwlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGkyYy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjICpyZWMgPSAmaTJjLT5yZWM7CiAJdWludDMyX3QgdGVtcDsKQEAgLTEzNywxOSArMTM0LDMwIEBACiAJV1JFRzMyKHJlYy0+ZW5fZGF0YV9yZWcsIHRlbXApOwogCiAJLyogbWFzayB0aGUgZ3BpbyBwaW5zIGZvciBzb2Z0d2FyZSB1c2UgKi8KLQl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19jbGtfcmVnKTsKLQlpZiAobG9ja19zdGF0ZSkKLQkJdGVtcCB8PSByZWMtPm1hc2tfY2xrX21hc2s7Ci0JZWxzZQotCQl0ZW1wICY9IH5yZWMtPm1hc2tfY2xrX21hc2s7CisJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfY2xrX3JlZykgfCByZWMtPm1hc2tfY2xrX21hc2s7CiAJV1JFRzMyKHJlYy0+bWFza19jbGtfcmVnLCB0ZW1wKTsKIAl0ZW1wID0gUlJFRzMyKHJlYy0+bWFza19jbGtfcmVnKTsKIAorCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2RhdGFfcmVnKSB8IHJlYy0+bWFza19kYXRhX21hc2s7CisJV1JFRzMyKHJlYy0+bWFza19kYXRhX3JlZywgdGVtcCk7CiAJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpOwotCWlmIChsb2NrX3N0YXRlKQotCQl0ZW1wIHw9IHJlYy0+bWFza19kYXRhX21hc2s7Ci0JZWxzZQotCQl0ZW1wICY9IH5yZWMtPm1hc2tfZGF0YV9tYXNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3RfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKQoreworCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gaTJjLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgKnJlYyA9ICZpMmMtPnJlYzsKKwl1aW50MzJfdCB0ZW1wOworCisJLyogdW5tYXNrIHRoZSBncGlvIHBpbnMgZm9yIHNvZnR3YXJlIHVzZSAqLworCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcpICYgfnJlYy0+bWFza19jbGtfbWFzazsKKwlXUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcsIHRlbXApOworCXRlbXAgPSBSUkVHMzIocmVjLT5tYXNrX2Nsa19yZWcpOworCisJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpICYgfnJlYy0+bWFza19kYXRhX21hc2s7CiAJV1JFRzMyKHJlYy0+bWFza19kYXRhX3JlZywgdGVtcCk7CiAJdGVtcCA9IFJSRUczMihyZWMtPm1hc2tfZGF0YV9yZWcpOwogfQpAQCAtMjA5LDIyICsyMTcsNiBAQAogCVdSRUczMihyZWMtPmVuX2RhdGFfcmVnLCB2YWwpOwogfQogCi1zdGF0aWMgaW50IHByZV94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXApCi17Ci0Jc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7Ci0KLQlyYWRlb25faTJjX2RvX2xvY2soaTJjLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwb3N0X3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQotCXJhZGVvbl9pMmNfZG9fbG9jayhpMmMsIDApOwotfQotCiAvKiBodyBpMmMgKi8KIAogc3RhdGljIHUzMiByYWRlb25fZ2V0X2kyY19wcmVzY2FsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxLmMKaW5kZXggNDY1NzQ2Yi4uMDBkYTM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MzIgcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgKnI1MDBfZGlzcF9pbnQpCitzdGF0aWMgdTMyIHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyICpyNTAwX2Rpc3BfaW50KQogewogCXUzMiBpcnFzID0gUkFERU9OX1JFQUQoUkFERU9OX0dFTl9JTlRfU1RBVFVTKTsKIAl1MzIgaXJxX21hc2sgPSBSQURFT05fU1dfSU5UX1RFU1Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKaW5kZXggOWVjODMwYy4uOGY4NmFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYwpAQCAtNjcsMTAgKzY3LDEwIEBACiAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCiAJcmRldi0+aXJxLnN3X2ludCA9IGZhbHNlOwogCXJkZXYtPmlycS5ndWlfaWRsZSA9IGZhbHNlOwotCWZvciAoaSA9IDA7IGkgPCByZGV2LT5udW1fY3J0YzsgaSsrKQotCQlyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50W2ldID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX0hQRF9QSU5TOyBpKyspCiAJCXJkZXYtPmlycS5ocGRbaV0gPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9DUlRDUzsgaSsrKSB7CisJCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKIAkJcmRldi0+aXJxLnBmbGlwW2ldID0gZmFsc2U7CiAJfQogCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwpAQCAtOTksMTUgKzk5LDU1IEBACiAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCiAJcmRldi0+aXJxLnN3X2ludCA9IGZhbHNlOwogCXJkZXYtPmlycS5ndWlfaWRsZSA9IGZhbHNlOwotCWZvciAoaSA9IDA7IGkgPCByZGV2LT5udW1fY3J0YzsgaSsrKQotCQlyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50W2ldID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX0hQRF9QSU5TOyBpKyspCiAJCXJkZXYtPmlycS5ocGRbaV0gPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9DUlRDUzsgaSsrKSB7CisJCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKIAkJcmRldi0+aXJxLnBmbGlwW2ldID0gZmFsc2U7CiAJfQogCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwogfQogCitzdGF0aWMgYm9vbCByYWRlb25fbXNpX29rKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCS8qIFJWMzcwL1JWMzgwIHdhcyBmaXJzdCBhc2ljIHdpdGggTVNJIHN1cHBvcnQgKi8KKwlpZiAocmRldi0+ZmFtaWx5IDwgQ0hJUF9SVjM4MCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogTVNJcyBkb24ndCB3b3JrIG9uIEFHUCAqLworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApCisJCXJldHVybiBmYWxzZTsKKworCS8qIGZvcmNlIE1TSSBvbiAqLworCWlmIChyYWRlb25fbXNpID09IDEpCisJCXJldHVybiB0cnVlOworCWVsc2UgaWYgKHJhZGVvbl9tc2kgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUXVpcmtzICovCisJLyogSFAgUlM2OTAgb25seSBzZWVtcyB0byB3b3JrIHdpdGggTVNJcy4gKi8KKwlpZiAoKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDc5MWYpICYmCisJICAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAzYykgJiYKKwkgICAgKHJkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgzMGMyKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBEZWxsIFJTNjkwIG9ubHkgc2VlbXMgdG8gd29yayB3aXRoIE1TSXMuICovCisJaWYgKChyZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3OTFmKSAmJgorCSAgICAocmRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjgpICYmCisJICAgIChyZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDFmZCkpCisJCXJldHVybiB0cnVlOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQkvKiBBUFVzIHdvcmsgZmluZSB3aXRoIE1TSXMgKi8KKwkJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1BBTE0pCisJCQlyZXR1cm4gdHJ1ZTsKKwkJLyogbG90cyBvZiBJR1BzIGhhdmUgcHJvYmxlbXMgd2l0aCBNU0lzICovCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogaW50IHJhZGVvbl9pcnFfa21zX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IGk7CkBAIC0xMjQsMTIgKzE2NCw4IEBACiAJfQogCS8qIGVuYWJsZSBtc2kgKi8KIAlyZGV2LT5tc2lfZW5hYmxlZCA9IDA7Ci0JLyogTVNJcyBkb24ndCBzZWVtIHRvIHdvcmsgcmVsaWFibHkgb24gYWxsIElHUAotCSAqIGNoaXBzLiAgRGlzYWJsZSBNU0kgb24gdGhlbSBmb3Igbm93LgotCSAqLwotCWlmICgocmRldi0+ZmFtaWx5ID49IENISVBfUlYzODApICYmCi0JICAgICgoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB8fCAocmRldi0+ZmFtaWx5ID49IENISVBfUEFMTSkpICYmCi0JICAgICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkpKSB7CisKKwlpZiAocmFkZW9uX21zaV9vayhyZGV2KSkgewogCQlpbnQgcmV0ID0gcGNpX2VuYWJsZV9tc2kocmRldi0+cGRldik7CiAJCWlmICghcmV0KSB7CiAJCQlyZGV2LT5tc2lfZW5hYmxlZCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbGVnYWN5X2NydGMuYwppbmRleCA0MWE1ZDQ4Li5kYWFkZjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV9jcnRjLmMKQEAgLTk5MSwxMiArOTkxLDYgQEAKIAkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKIAkJCQkgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCS8qIGFkanVzdCBwbSB0byB1cGNvbWluZyBtb2RlIGNoYW5nZSAqLwotCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKLQogCWlmICghcmFkZW9uX2NydGNfc2NhbGluZ19tb2RlX2ZpeHVwKGNydGMsIG1vZGUsIGFkanVzdGVkX21vZGUpKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9sZWdhY3lfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV90di5jCmluZGV4IGM3YjZjYjQuLmIzN2VjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV90di5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2xlZ2FjeV90di5jCkBAIC04NjQsNyArODY0LDcgQEAKIAkqdl9zeW5jX3N0cnRfd2lkID0gdG1wOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfcG9zdF9kaXYoaW50IHZhbHVlKQorc3RhdGljIGludCBnZXRfcG9zdF9kaXYoaW50IHZhbHVlKQogewogCWludCBwb3N0X2RpdjsKIAlzd2l0Y2ggKHZhbHVlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKaW5kZXggNjg4MjBmNS4uMmMyZTc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaApAQCAtNDM4LDE1ICs0MzgsMTMgQEAKIAlzdHJ1Y3QgcmFkZW9uX2kyY19jaGFuICpkZGNfYnVzOwogCS8qIHNvbWUgc3lzdGVtcyBoYXZlIGFuIGhkbWkgYW5kIHZnYSBwb3J0IHdpdGggYSBzaGFyZWQgZGRjIGxpbmUgKi8KIAlib29sIHNoYXJlZF9kZGM7Ci0JLyogZm9yIHNvbWUgUmFkZW9uIGNoaXAgZmFtaWxpZXMgd2UgYXBwbHkgYW4gYWRkaXRpb25hbCBFRElEIGhlYWRlcgotCSAgIGNoZWNrIGFzIHBhcnQgb2YgdGhlIEREQyBwcm9iZSAqLwotCWJvb2wgcmVxdWlyZXNfZXh0ZW5kZWRfcHJvYmU7CiAJYm9vbCB1c2VfZGlnaXRhbDsKIAkvKiB3ZSBuZWVkIHRvIG1pbmQgdGhlIEVESUQgYmV0d2VlbiBkZXRlY3QKIAkgICBhbmQgZ2V0IG1vZGVzIGR1ZSB0byBhbmFsb2cvZGlnaXRhbC90dmVuY29kZXIgKi8KIAlzdHJ1Y3QgZWRpZCAqZWRpZDsKIAl2b2lkICpjb25fcHJpdjsKIAlib29sIGRhY19sb2FkX2RldGVjdDsKKwlib29sIGRldGVjdGVkX2J5X2xvYWQ7IC8qIGlmIHRoZSBjb25uZWN0aW9uIHN0YXR1cyB3YXMgZGV0ZXJtaW5lZCBieSBsb2FkICovCiAJdWludDE2X3QgY29ubmVjdG9yX29iamVjdF9pZDsKIAlzdHJ1Y3QgcmFkZW9uX2hwZCBocGQ7CiAJc3RydWN0IHJhZGVvbl9yb3V0ZXIgcm91dGVyOwpAQCAtNDU4LDYgKzQ1Niw4IEBACiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiB9OwogCisjZGVmaW5lIEVOQ09ERVJfTU9ERV9JU19EUChlbSkgKCgoZW0pID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB8fCBcCisJCQkJKChlbSkgPT0gQVRPTV9FTkNPREVSX01PREVfRFBfTVNUKSkKIAogZXh0ZXJuIGVudW0gcmFkZW9uX3R2X3N0ZAogcmFkZW9uX2NvbWJpb3NfZ2V0X3R2X2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtNDY3LDggKzQ2Nyw4IEBACiBleHRlcm4gc3RydWN0IGRybV9jb25uZWN0b3IgKgogcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAotZXh0ZXJuIGJvb2wgcmFkZW9uX2VuY29kZXJfaXNfZHBfYnJpZGdlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Ci1leHRlcm4gYm9vbCByYWRlb25fY29ubmVjdG9yX2VuY29kZXJfaXNfZHBfYnJpZGdlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworZXh0ZXJuIHUxNiByYWRlb25fZW5jb2Rlcl9nZXRfZHBfYnJpZGdlX2VuY29kZXJfaWQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiB1MTYgcmFkZW9uX2Nvbm5lY3Rvcl9lbmNvZGVyX2dldF9kcF9icmlkZ2VfZW5jb2Rlcl9pZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIGV4dGVybiBib29sIHJhZGVvbl9jb25uZWN0b3JfZW5jb2Rlcl9pc19oYnIyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogZXh0ZXJuIGJvb2wgcmFkZW9uX2Nvbm5lY3Rvcl9pc19kcDEyX2NhcGFibGUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7CiAKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCQkJCQkgICBpbnQgYWN0aW9uLCB1aW50OF90IGxhbmVfbnVtLAogCQkJCQkgICB1aW50OF90IGxhbmVfc2V0KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9hdG9tX2V4dF9lbmNvZGVyX3NldHVwX2RkYyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwotZXh0ZXJuIHN0cnVjdCBkcm1fZW5jb2RlciAqcmFkZW9uX2F0b21fZ2V0X2V4dGVybmFsX2VuY29kZXIoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK2V4dGVybiBzdHJ1Y3QgZHJtX2VuY29kZXIgKnJhZGVvbl9nZXRfZXh0ZXJuYWxfZW5jb2RlcihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogZXh0ZXJuIGludCByYWRlb25fZHBfaTJjX2F1eF9jaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlLAogCQkJCXU4IHdyaXRlX2J5dGUsIHU4ICpyZWFkX2J5dGUpOwogCkBAIC01MTgsOCArNTE4LDcgQEAKIAkJCQl1OCB2YWwpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX3JvdXRlcl9zZWxlY3RfZGRjX3BvcnQoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOwogZXh0ZXJuIHZvaWQgcmFkZW9uX3JvdXRlcl9zZWxlY3RfY2RfcG9ydChzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3Rvcik7Ci1leHRlcm4gYm9vbCByYWRlb25fZGRjX3Byb2JlKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yLAotCQkJYm9vbCByZXF1aXJlc19leHRlbmRlZF9wcm9iZSk7CitleHRlcm4gYm9vbCByYWRlb25fZGRjX3Byb2JlKHN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yKTsKIGV4dGVybiBpbnQgcmFkZW9uX2RkY19nZXRfbW9kZXMoc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IpOwogCiBleHRlcm4gc3RydWN0IGRybV9lbmNvZGVyICpyYWRlb25fYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwppbmRleCA5NzZjM2IxLi4xYzg1MTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuYwpAQCAtNTE1LDMgKzUxNSw0NCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworaW50IHJhZGVvbl9ib193YWl0KHN0cnVjdCByYWRlb25fYm8gKmJvLCB1MzIgKm1lbV90eXBlLCBib29sIG5vX3dhaXQpCit7CisJaW50IHI7CisKKwlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkKKwkJcmV0dXJuIHI7CisJc3Bpbl9sb2NrKCZiby0+dGJvLmJkZXYtPmZlbmNlX2xvY2spOworCWlmIChtZW1fdHlwZSkKKwkJKm1lbV90eXBlID0gYm8tPnRiby5tZW0ubWVtX3R5cGU7CisJaWYgKGJvLT50Ym8uc3luY19vYmopCisJCXIgPSB0dG1fYm9fd2FpdCgmYm8tPnRibywgdHJ1ZSwgdHJ1ZSwgbm9fd2FpdCk7CisJc3Bpbl91bmxvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7CisJdHRtX2JvX3VucmVzZXJ2ZSgmYm8tPnRibyk7CisJcmV0dXJuIHI7Cit9CisKKworLyoqCisgKiByYWRlb25fYm9fcmVzZXJ2ZSAtIHJlc2VydmUgYm8KKyAqIEBibzoJCWJvIHN0cnVjdHVyZQorICogQG5vX3dhaXQ6CQlkb24ndCBzbGVlcCB3aGlsZSB0cnlpbmcgdG8gcmVzZXJ2ZSAocmV0dXJuIC1FQlVTWSkKKyAqCisgKiBSZXR1cm5zOgorICogLUVCVVNZOiBidWZmZXIgaXMgYnVzeSBhbmQgQG5vX3dhaXQgaXMgdHJ1ZQorICogLUVSRVNUQVJUU1lTOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5CisgKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCisgKi8KK2ludCByYWRlb25fYm9fcmVzZXJ2ZShzdHJ1Y3QgcmFkZW9uX2JvICpibywgYm9vbCBub193YWl0KQoreworCWludCByOworCisJciA9IHR0bV9ib19yZXNlcnZlKCZiby0+dGJvLCB0cnVlLCBub193YWl0LCBmYWxzZSwgMCk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKKwkJaWYgKHIgIT0gLUVSRVNUQVJUU1lTKQorCQkJZGV2X2Vycihiby0+cmRldi0+ZGV2LCAiJXAgcmVzZXJ2ZSBmYWlsZWRcbiIsIGJvKTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaAppbmRleCBlZGU2YzEzLi5iMDdmMGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9vYmplY3QuaApAQCAtNTIsMjggKzUyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiByYWRlb25fYm9fcmVzZXJ2ZSAtIHJlc2VydmUgYm8KLSAqIEBibzoJCWJvIHN0cnVjdHVyZQotICogQG5vX3dhaXQ6CQlkb24ndCBzbGVlcCB3aGlsZSB0cnlpbmcgdG8gcmVzZXJ2ZSAocmV0dXJuIC1FQlVTWSkKLSAqCi0gKiBSZXR1cm5zOgotICogLUVCVVNZOiBidWZmZXIgaXMgYnVzeSBhbmQgQG5vX3dhaXQgaXMgdHJ1ZQotICogLUVSRVNUQVJUU1lTOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5Ci0gKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJhZGVvbl9ib19yZXNlcnZlKHN0cnVjdCByYWRlb25fYm8gKmJvLCBib29sIG5vX3dhaXQpCi17Ci0JaW50IHI7Ci0KLQlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkgewotCQlpZiAociAhPSAtRVJFU1RBUlRTWVMpCi0JCQlkZXZfZXJyKGJvLT5yZGV2LT5kZXYsICIlcCByZXNlcnZlIGZhaWxlZFxuIiwgYm8pOwotCQlyZXR1cm4gcjsKLQl9Ci0JcmV0dXJuIDA7Ci19CitpbnQgcmFkZW9uX2JvX3Jlc2VydmUoc3RydWN0IHJhZGVvbl9ibyAqYm8sIGJvb2wgbm9fd2FpdCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fYm9fdW5yZXNlcnZlKHN0cnVjdCByYWRlb25fYm8gKmJvKQogewpAQCAtMTE4LDIzICs5Nyw4IEBACiAJcmV0dXJuIGJvLT50Ym8uYWRkcl9zcGFjZV9vZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJhZGVvbl9ib193YWl0KHN0cnVjdCByYWRlb25fYm8gKmJvLCB1MzIgKm1lbV90eXBlLAotCQkJCQlib29sIG5vX3dhaXQpCi17Ci0JaW50IHI7Ci0KLQlyID0gdHRtX2JvX3Jlc2VydmUoJmJvLT50Ym8sIHRydWUsIG5vX3dhaXQsIGZhbHNlLCAwKTsKLQlpZiAodW5saWtlbHkociAhPSAwKSkKLQkJcmV0dXJuIHI7Ci0Jc3Bpbl9sb2NrKCZiby0+dGJvLmJkZXYtPmZlbmNlX2xvY2spOwotCWlmIChtZW1fdHlwZSkKLQkJKm1lbV90eXBlID0gYm8tPnRiby5tZW0ubWVtX3R5cGU7Ci0JaWYgKGJvLT50Ym8uc3luY19vYmopCi0JCXIgPSB0dG1fYm9fd2FpdCgmYm8tPnRibywgdHJ1ZSwgdHJ1ZSwgbm9fd2FpdCk7Ci0Jc3Bpbl91bmxvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7Ci0JdHRtX2JvX3VucmVzZXJ2ZSgmYm8tPnRibyk7Ci0JcmV0dXJuIHI7Ci19CitleHRlcm4gaW50IHJhZGVvbl9ib193YWl0KHN0cnVjdCByYWRlb25fYm8gKmJvLCB1MzIgKm1lbV90eXBlLAorCQkJICBib29sIG5vX3dhaXQpOwogCiBleHRlcm4gaW50IHJhZGVvbl9ib19jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCiAJCQkJdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgYnl0ZV9hbGlnbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCmluZGV4IDZmYWJlODkuLjc4YTY2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwpAQCAtNTMsNiArNTMsMjQgQEAKIAogI2RlZmluZSBBQ1BJX0FDX0NMQVNTICAgICAgICAgICAiYWNfYWRhcHRlciIKIAoraW50IHJhZGVvbl9wbV9nZXRfdHlwZV9pbmRleChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCSAgICAgZW51bSByYWRlb25fcG1fc3RhdGVfdHlwZSBwc190eXBlLAorCQkJICAgICBpbnQgaW5zdGFuY2UpCit7CisJaW50IGk7CisJaW50IGZvdW5kX2luc3RhbmNlID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlczsgaSsrKSB7CisJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS50eXBlID09IHBzX3R5cGUpIHsKKwkJCWZvdW5kX2luc3RhbmNlKys7CisJCQlpZiAoZm91bmRfaW5zdGFuY2UgPT0gaW5zdGFuY2UpCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJLyogcmV0dXJuIGRlZmF1bHQgaWYgbm8gbWF0Y2ggKi8KKwlyZXR1cm4gcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleDsKK30KKwogI2lmZGVmIENPTkZJR19BQ1BJCiBzdGF0aWMgaW50IHJhZGVvbl9hY3BpX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jCmluZGV4IDA4YzAyMzMuLjQ5ZDU4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMKQEAgLTM1LDYgKzM1LDQ0IEBACiAKIGludCByYWRlb25fZGVidWdmc19pYl9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAordTMyIHJhZGVvbl9nZXRfaWJfdmFsdWUoc3RydWN0IHJhZGVvbl9jc19wYXJzZXIgKnAsIGludCBpZHgpCit7CisJc3RydWN0IHJhZGVvbl9jc19jaHVuayAqaWJjID0gJnAtPmNodW5rc1twLT5jaHVua19pYl9pZHhdOworCXUzMiBwZ19pZHgsIHBnX29mZnNldDsKKwl1MzIgaWR4X3ZhbHVlID0gMDsKKwlpbnQgbmV3X3BhZ2U7CisKKwlwZ19pZHggPSAoaWR4ICogNCkgLyBQQUdFX1NJWkU7CisJcGdfb2Zmc2V0ID0gKGlkeCAqIDQpICUgUEFHRV9TSVpFOworCisJaWYgKGliYy0+a3BhZ2VfaWR4WzBdID09IHBnX2lkeCkKKwkJcmV0dXJuIGliYy0+a3BhZ2VbMF1bcGdfb2Zmc2V0LzRdOworCWlmIChpYmMtPmtwYWdlX2lkeFsxXSA9PSBwZ19pZHgpCisJCXJldHVybiBpYmMtPmtwYWdlWzFdW3BnX29mZnNldC80XTsKKworCW5ld19wYWdlID0gcmFkZW9uX2NzX3VwZGF0ZV9wYWdlcyhwLCBwZ19pZHgpOworCWlmIChuZXdfcGFnZSA8IDApIHsKKwkJcC0+cGFyc2VyX2Vycm9yID0gbmV3X3BhZ2U7CisJCXJldHVybiAwOworCX0KKworCWlkeF92YWx1ZSA9IGliYy0+a3BhZ2VbbmV3X3BhZ2VdW3BnX29mZnNldC80XTsKKwlyZXR1cm4gaWR4X3ZhbHVlOworfQorCit2b2lkIHJhZGVvbl9yaW5nX3dyaXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCB2KQoreworI2lmIERSTV9ERUJVR19DT0RFCisJaWYgKHJkZXYtPmNwLmNvdW50X2R3IDw9IDApIHsKKwkJRFJNX0VSUk9SKCJyYWRlb246IHdyaXR0aW5nIG1vcmUgZHdvcmQgdG8gcmluZyB0aGFuIGV4cGVjdGVkICFcbiIpOworCX0KKyNlbmRpZgorCXJkZXYtPmNwLnJpbmdbcmRldi0+Y3Aud3B0cisrXSA9IHY7CisJcmRldi0+Y3Aud3B0ciAmPSByZGV2LT5jcC5wdHJfbWFzazsKKwlyZGV2LT5jcC5jb3VudF9kdy0tOworCXJkZXYtPmNwLnJpbmdfZnJlZV9kdy0tOworfQorCiB2b2lkIHJhZGVvbl9pYl9ib2d1c19jbGVhbnVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXN0cnVjdCByYWRlb25faWIgKmliLCAqbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDkyZTdlYTcuLmU4NDIyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fc3RhdGUuYwpAQCAtMjcyLDEyICsyNzIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0Myhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCi0JCQkJCQkgICAgIGRldl9wcml2LAotCQkJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICoKLQkJCQkJCSAgICAgY21kYnVmLAotCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQorc3RhdGljIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgorCQkJCQkgIGRldl9wcml2LAorCQkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqCisJCQkJCSAgY21kYnVmLAorCQkJCQkgIHVuc2lnbmVkIGludCAqY21kc3opCiB7CiAJdTMyICpjbWQgPSBkcm1fYnVmZmVyX3BvaW50ZXJfdG9fZHdvcmQoY21kYnVmLT5idWZmZXIsIDApOwogCXUzMiBvZmZzZXQsIG5hcnJheXM7CkBAIC00NDYsOCArNDQ2LDggQEAKICAqIENQIGhhcmR3YXJlIHN0YXRlIHByb2dyYW1taW5nIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcmFkZW9uX2VtaXRfY2xpcF9yZWN0KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJCSAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCitzdGF0aWMgdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKKwkJCQkgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogYm94KQogewogCVJJTkdfTE9DQUxTOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNDAwLmMKaW5kZXggYWE2YTY2ZS4uMDZiOTBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczQwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM0MDAuYwpAQCAtNzcsNyArNzcsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUucmFtLnB0cikgeworCWlmIChyZGV2LT5nYXJ0LnB0cikgewogCQlXQVJOKDEsICJSUzQwMCBHQVJUIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xODIsNiArMTgyLDkgQEAKIAkvKiBFbmFibGUgZ2FydCAqLwogCVdSRUczMl9NQyhSUzQ4MF9BR1BfQUREUkVTU19TUEFDRV9TSVpFLCAoUlM0ODBfR0FSVF9FTiB8IHNpemVfcmVnKSk7CiAJcnM0MDBfZ2FydF90bGJfZmx1c2gocmRldik7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0gZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKHJkZXYtPm1jLmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwOSw2ICsyMTIsNyBAQAogaW50IHJzNDAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKQogewogCXVpbnQzMl90IGVudHJ5OworCXUzMiAqZ3R0ID0gcmRldi0+Z2FydC5wdHI7CiAKIAlpZiAoaSA8IDAgfHwgaSA+IHJkZXYtPmdhcnQubnVtX2dwdV9wYWdlcykgewogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxOCw3ICsyMjIsNyBAQAogCQkoKHVwcGVyXzMyX2JpdHMoYWRkcikgJiAweGZmKSA8PCA0KSB8CiAJCVJTNDAwX1BURV9XUklURUFCTEUgfCBSUzQwMF9QVEVfUkVBREFCTEU7CiAJZW50cnkgPSBjcHVfdG9fbGUzMihlbnRyeSk7Ci0JcmRldi0+Z2FydC50YWJsZS5yYW0ucHRyW2ldID0gZW50cnk7CisJZ3R0W2ldID0gZW50cnk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwppbmRleCA0YjVkMGU2Li40ODFiOTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCkBAIC0yODcsNiArMjg3LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CisJCXJhZGVvbl9ocGRfc2V0X3BvbGFyaXR5KHJkZXYsIHJhZGVvbl9jb25uZWN0b3ItPmhwZC5ocGQpOwogCX0KIAlpZiAocmRldi0+aXJxLmluc3RhbGxlZCkKIAkJcnM2MDBfaXJxX3NldChyZGV2KTsKQEAgLTQxMyw3ICs0MTQsNyBAQAogewogCWludCByOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7CisJaWYgKHJkZXYtPmdhcnQucm9iaikgewogCQlXQVJOKDEsICJSUzYwMCBHQVJUIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC00MzEsNyArNDMyLDcgQEAKIAl1MzIgdG1wOwogCWludCByLCBpOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ4NCw2ICs0ODUsOSBAQAogCXRtcCA9IFJSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSk7CiAJV1JFRzMyX01DKFJfMDAwMDA5X01DX0NOVEwxLCAodG1wIHwgU18wMDAwMDlfRU5BQkxFX1BBR0VfVEFCTEVTKDEpKSk7CiAJcnM2MDBfZ2FydF90bGJfZmx1c2gocmRldik7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0gZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKHJkZXYtPm1jLmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+Z2FydC50YWJsZV9hZGRyKTsKIAlyZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5MSwyMCArNDk1LDEyIEBACiB2b2lkIHJzNjAwX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwotCWludCByOwogCiAJLyogRklYTUU6IGRpc2FibGUgb3V0IG9mIGdhcnQgYWNjZXNzICovCiAJV1JFRzMyX01DKFJfMDAwMTAwX01DX1BUMF9DTlRMLCAwKTsKIAl0bXAgPSBSUkVHMzJfTUMoUl8wMDAwMDlfTUNfQ05UTDEpOwogCVdSRUczMl9NQyhSXzAwMDAwOV9NQ19DTlRMMSwgdG1wICYgQ18wMDAwMDlfRU5BQkxFX1BBR0VfVEFCTEVTKTsKLQlpZiAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopIHsKLQkJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqLCBmYWxzZSk7Ci0JCWlmIChyID09IDApIHsKLQkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQl9Ci0JfQorCXJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4ocmRldik7CiB9CiAKIHZvaWQgcnM2MDBfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtNTIyLDcgKzUxOCw3IEBACiAKIGludCByczYwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcikKIHsKLQl2b2lkIF9faW9tZW0gKnB0ciA9ICh2b2lkICopcmRldi0+Z2FydC50YWJsZS52cmFtLnB0cjsKKwl2b2lkIF9faW9tZW0gKnB0ciA9ICh2b2lkICopcmRldi0+Z2FydC5wdHI7CiAKIAlpZiAoaSA8IDAgfHwgaSA+IHJkZXYtPmdhcnQubnVtX2dwdV9wYWdlcykgewogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCBiMTNjMmVlLi5hOTgzZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAl1MzIgdG1wOwogCWludCByLCBpOwogCi0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqID09IE5VTEwpIHsKKwlpZiAocmRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKIAkJZGV2X2VycihyZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE2MSw2ICsxNjEsOSBAQAogCQlXUkVHMzIoVk1fQ09OVEVYVDBfQ05UTCArIChpICogNCksIDApOwogCiAJcjYwMF9wY2llX2dhcnRfdGxiX2ZsdXNoKHJkZXYpOworCURSTV9JTkZPKCJQQ0lFIEdBUlQgb2YgJXVNIGVuYWJsZWQgKHRhYmxlIGF0IDB4JTAxNmxsWCkuXG4iLAorCQkgKHVuc2lnbmVkKShyZGV2LT5tYy5ndHRfc2l6ZSA+PiAyMCksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJkZXYtPmdhcnQudGFibGVfYWRkcik7CiAJcmRldi0+Z2FydC5yZWFkeSA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNjgsNyArMTcxLDcgQEAKIHZvaWQgcnY3NzBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKLQlpbnQgaSwgcjsKKwlpbnQgaTsKIAogCS8qIERpc2FibGUgYWxsIHRhYmxlcyAqLwogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCkBAIC0xODgsMTQgKzE5MSw3IEBACiAJV1JFRzMyKE1DX1ZNX01CX0wxX1RMQjFfQ05UTCwgdG1wKTsKIAlXUkVHMzIoTUNfVk1fTUJfTDFfVExCMl9DTlRMLCB0bXApOwogCVdSRUczMihNQ19WTV9NQl9MMV9UTEIzX0NOVEwsIHRtcCk7Ci0JaWYgKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKSB7Ci0JCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5nYXJ0LnRhYmxlLnZyYW0ucm9iaiwgZmFsc2UpOwotCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJCXJhZGVvbl9ib19rdW5tYXAocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPmdhcnQudGFibGUudnJhbS5yb2JqKTsKLQkJCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+Z2FydC50YWJsZS52cmFtLnJvYmopOwotCQl9Ci0JfQorCXJhZGVvbl9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4ocmRldik7CiB9CiAKIHZvaWQgcnY3NzBfcGNpZV9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0yNzksNyArMjc1LDcgQEAKIAkJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9ISUdIX0FERFIsCiAJCQlyZGV2LT5tYy52cmFtX2VuZCA+PiAxMik7CiAJfQotCVdSRUczMihNQ19WTV9TWVNURU1fQVBFUlRVUkVfREVGQVVMVF9BRERSLCAwKTsKKwlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgcmRldi0+dnJhbV9zY3JhdGNoLmdwdV9hZGRyID4+IDEyKTsKIAl0bXAgPSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDI0KSAmIDB4RkZGRikgPDwgMTY7CiAJdG1wIHw9ICgocmRldi0+bWMudnJhbV9zdGFydCA+PiAyNCkgJiAweEZGRkYpOwogCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKQEAgLTk1Niw1NCArOTUyLDYgQEAKIAogfQogCi1zdGF0aWMgaW50IHJ2NzcwX3ZyYW1fc2NyYXRjaF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQotewotCWludCByOwotCXU2NCBncHVfYWRkcjsKLQotCWlmIChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaiA9PSBOVUxMKSB7Ci0JCXIgPSByYWRlb25fYm9fY3JlYXRlKHJkZXYsIFJBREVPTl9HUFVfUEFHRV9TSVpFLAotCQkJCSAgICAgUEFHRV9TSVpFLCB0cnVlLCBSQURFT05fR0VNX0RPTUFJTl9WUkFNLAotCQkJCSAgICAgJnJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKLQkJaWYgKHIpIHsKLQkJCXJldHVybiByOwotCQl9Ci0JfQotCi0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLCBmYWxzZSk7Ci0JaWYgKHVubGlrZWx5KHIgIT0gMCkpCi0JCXJldHVybiByOwotCXIgPSByYWRlb25fYm9fcGluKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLAotCQkJICBSQURFT05fR0VNX0RPTUFJTl9WUkFNLCAmZ3B1X2FkZHIpOwotCWlmIChyKSB7Ci0JCXJhZGVvbl9ib191bnJlc2VydmUocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCQlyZXR1cm4gcjsKLQl9Ci0JciA9IHJhZGVvbl9ib19rbWFwKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLAotCQkJCSh2b2lkICoqKSZyZGV2LT52cmFtX3NjcmF0Y2gucHRyKTsKLQlpZiAocikKLQkJcmFkZW9uX2JvX3VucGluKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKLQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKLQotCXJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCBydjc3MF92cmFtX3NjcmF0Y2hfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKLXsKLQlpbnQgcjsKLQotCWlmIChyZGV2LT52cmFtX3NjcmF0Y2gucm9iaiA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JciA9IHJhZGVvbl9ib19yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqLCBmYWxzZSk7Ci0JaWYgKGxpa2VseShyID09IDApKSB7Ci0JCXJhZGVvbl9ib19rdW5tYXAocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCQlyYWRlb25fYm9fdW5waW4ocmRldi0+dnJhbV9zY3JhdGNoLnJvYmopOwotCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKLQl9Ci0JcmFkZW9uX2JvX3VucmVmKCZyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7Ci19Ci0KIHZvaWQgcjcwMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpCiB7CiAJdTY0IHNpemVfYmYsIHNpemVfYWY7CkBAIC0xMTAzLDYgKzEwNTEsMTAgQEAKIAkJfQogCX0KIAorCXIgPSByNjAwX3ZyYW1fc2NyYXRjaF9pbml0KHJkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwogCXJ2NzcwX21jX3Byb2dyYW0ocmRldik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlydjc3MF9hZ3BfZW5hYmxlKHJkZXYpOwpAQCAtMTExMSw5ICsxMDYzLDcgQEAKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKIAl9Ci0JciA9IHJ2NzcwX3ZyYW1fc2NyYXRjaF9pbml0KHJkZXYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKKwogCXJ2NzcwX2dwdV9pbml0KHJkZXYpOwogCXIgPSByNjAwX2JsaXRfaW5pdChyZGV2KTsKIAlpZiAocikgewpAQCAtMTE4NCw4ICsxMTM0LDYgQEAKIAogaW50IHJ2NzcwX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JaW50IHI7Ci0KIAlyNjAwX2F1ZGlvX2ZpbmkocmRldik7CiAJLyogRklYTUU6IHdlIHNob3VsZCB3YWl0IGZvciByaW5nIHRvIGJlIGVtcHR5ICovCiAJcjcwMF9jcF9zdG9wKHJkZXYpOwpAQCAtMTE5MywxNCArMTE0MSw4IEBACiAJcjYwMF9pcnFfc3VzcGVuZChyZGV2KTsKIAlyYWRlb25fd2JfZGlzYWJsZShyZGV2KTsKIAlydjc3MF9wY2llX2dhcnRfZGlzYWJsZShyZGV2KTsKLQkvKiB1bnBpbiBzaGFkZXJzIGJvICovCi0JaWYgKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKSB7Ci0JCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaiwgZmFsc2UpOwotCQlpZiAobGlrZWx5KHIgPT0gMCkpIHsKLQkJCXJhZGVvbl9ib191bnBpbihyZGV2LT5yNjAwX2JsaXQuc2hhZGVyX29iaik7Ci0JCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJkZXYtPnI2MDBfYmxpdC5zaGFkZXJfb2JqKTsKLQkJfQotCX0KKwlyNjAwX2JsaXRfc3VzcGVuZChyZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzIxLDcgKzEyNjMsNyBAQAogCXJhZGVvbl9pYl9wb29sX2ZpbmkocmRldik7CiAJcmFkZW9uX2lycV9rbXNfZmluaShyZGV2KTsKIAlydjc3MF9wY2llX2dhcnRfZmluaShyZGV2KTsKLQlydjc3MF92cmFtX3NjcmF0Y2hfZmluaShyZGV2KTsKKwlyNjAwX3ZyYW1fc2NyYXRjaF9maW5pKHJkZXYpOwogCXJhZGVvbl9nZW1fZmluaShyZGV2KTsKIAlyYWRlb25fZmVuY2VfZHJpdmVyX2ZpbmkocmRldik7CiAJcmFkZW9uX2FncF9maW5pKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3NhdmFnZS9zYXZhZ2VfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9kcnYuYwppbmRleCA2NDY0NDkwLi41NDY4ZDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vc2F2YWdlL3NhdmFnZV9kcnYuYwpAQCAtMjMsNiArMjMsOCBAQAogICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInNhdmFnZV9kcm0uaCIKICNpbmNsdWRlICJzYXZhZ2VfZHJ2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vc2lzL3Npc19kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5jCmluZGV4IDQ2ZDViZTYuLmE5YzU3MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9zaXMvc2lzX2Rydi5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJzaXNfZHJtLmgiCiAjaW5jbHVkZSAic2lzX2Rydi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RkZngvdGRmeF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS90ZGZ4L3RkZnhfZHJ2LmMKaW5kZXggOGJmOTg4MS4uY2RhMjk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3RkZngvdGRmeF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGRmeC90ZGZ4X2Rydi5jCkBAIC0zMCw2ICszMCw4IEBACiAgKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInRkZnhfZHJ2LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCmluZGV4IGVmMDYxOTQuLjYxN2I2NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwpAQCAtMTI5Myw2ICsxMjkzLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHR0bV9ib19jcmVhdGUpOwogCiBzdGF0aWMgaW50IHR0bV9ib19mb3JjZV9saXN0X2NsZWFuKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAogCQkJCQl1bnNpZ25lZCBtZW1fdHlwZSwgYm9vbCBhbGxvd19lcnJvcnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwppbmRleCA1OGMyNzFlLi5mOWNjNTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV90dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkcm1fY2FjaGUuaCIKICNpbmNsdWRlICJkcm1fbWVtX3V0aWwuaCIKICNpbmNsdWRlICJ0dG0vdHRtX21vZHVsZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZpYS92aWFfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYwppbmRleCA5MjBhNTUyLi5hODNlODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmlhL3ZpYV9kcnYuYwpAQCAtMjIsNiArMjIsOCBAQAogICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJ2aWFfZHJtLmgiCiAjaW5jbHVkZSAidmlhX2Rydi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnCmluZGV4IDMwYWQxMzMuLjc5NGZmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L0tjb25maWcKQEAgLTcsNyArNyw4IEBACiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAlzZWxlY3QgRFJNX1RUTQogCWhlbHAKLQkgIEtNUyBlbmFibGVkIERSTSBkcml2ZXIgZm9yIFNWR0EyIHZpcnR1YWwgaGFyZHdhcmUuCi0KLQkgIElmIHVuc3VyZSBzYXkgbi4gVGhlIGNvbXBpbGVkIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgdm13Z2Z4LmtvCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdvdWxkIGxpa2UgdG8gcnVuIDNEIGFjY2VsZXJhdGlvbgorCSAgaW4gYSBWTXdhcmUgdmlydHVhbCBtYWNoaW5lLgorCSAgVGhpcyBpcyBhIEtNUyBlbmFibGVkIERSTSBkcml2ZXIgZm9yIHRoZSBWTXdhcmUgU1ZHQTIKKwkgIHZpcnR1YWwgaGFyZHdhcmUuCisJICBUaGUgY29tcGlsZWQgbW9kdWxlIHdpbGwgYmUgY2FsbGVkICJ2bXdnZngua28iLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvTWFrZWZpbGUKaW5kZXggYzkyODFhMS4uNTg2ODY5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogdm13Z2Z4LXkgOj0gdm13Z2Z4X2V4ZWNidWYubyB2bXdnZnhfZ21yLm8gdm13Z2Z4X2ttcy5vIHZtd2dmeF9kcnYubyBcCiAJICAgIHZtd2dmeF9mYi5vIHZtd2dmeF9pb2N0bC5vIHZtd2dmeF9yZXNvdXJjZS5vIHZtd2dmeF9idWZmZXIubyBcCiAJICAgIHZtd2dmeF9maWZvLm8gdm13Z2Z4X2lycS5vIHZtd2dmeF9sZHUubyB2bXdnZnhfdHRtX2dsdWUubyBcCi0JICAgIHZtd2dmeF9vdmVybGF5Lm8gdm13Z2Z4X2ZlbmNlLm8gdm13Z2Z4X2dtcmlkX21hbmFnZXIubworCSAgICB2bXdnZnhfb3ZlcmxheS5vIHZtd2dmeF9tYXJrZXIubyB2bXdnZnhfZ21yaWRfbWFuYWdlci5vIFwKKwkgICAgdm13Z2Z4X2ZlbmNlLm8gdm13Z2Z4X2RtYWJ1Zi5vIHZtd2dmeF9zY3JuLm8KIAogb2JqLSQoQ09ORklHX0RSTV9WTVdHRlgpIDo9IHZtd2dmeC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2EzZF9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYTNkX3JlZy5oCmluZGV4IDc3Y2I0NTMuLmQwZTA4NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYTNkX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYTNkX3JlZy5oCkBAIC01Nyw3ICs1Nyw4IEBACiAgICBTVkdBM0RfSFdWRVJTSU9OX1dTNl9CMSAgICA9IFNWR0EzRF9NQUtFX0hXVkVSU0lPTigxLCAxKSwKICAgIFNWR0EzRF9IV1ZFUlNJT05fRlVTSU9OXzExID0gU1ZHQTNEX01BS0VfSFdWRVJTSU9OKDEsIDQpLAogICAgU1ZHQTNEX0hXVkVSU0lPTl9XUzY1X0IxICAgPSBTVkdBM0RfTUFLRV9IV1ZFUlNJT04oMiwgMCksCi0gICBTVkdBM0RfSFdWRVJTSU9OX0NVUlJFTlQgICA9IFNWR0EzRF9IV1ZFUlNJT05fV1M2NV9CMSwKKyAgIFNWR0EzRF9IV1ZFUlNJT05fV1M4X0IxICAgID0gU1ZHQTNEX01BS0VfSFdWRVJTSU9OKDIsIDEpLAorICAgU1ZHQTNEX0hXVkVSU0lPTl9DVVJSRU5UICAgPSBTVkdBM0RfSFdWRVJTSU9OX1dTOF9CMSwKIH0gU1ZHQTNkSGFyZHdhcmVWZXJzaW9uOwogCiAvKgpAQCAtNjcsNyArNjgsOCBAQAogdHlwZWRlZiB1aW50MzIgU1ZHQTNkQm9vbDsgLyogMzItYml0IEJvb2wgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBTVkdBM0RfTlVNX0NMSVBQTEFORVMgICAgICAgICAgICAgICAgICAgNgogI2RlZmluZSBTVkdBM0RfTUFYX1NJTVVMVEFORU9VU19SRU5ERVJfVEFSR0VUUyAgOAotCisjZGVmaW5lIFNWR0EzRF9NQVhfQ09OVEVYVF9JRFMgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgU1ZHQTNEX01BWF9TVVJGQUNFX0lEUyAgICAgICAgICAgICAgICAgICgzMiAqIDEwMjQpCiAKIC8qCiAgKiBTdXJmYWNlIGZvcm1hdHMuCkBAIC03OSw3NiArODEsOTEgQEAKICAqLwogCiB0eXBlZGVmIGVudW0gU1ZHQTNkU3VyZmFjZUZvcm1hdCB7Ci0gICBTVkdBM0RfRk9STUFUX0lOVkFMSUQgPSAwLAorICAgU1ZHQTNEX0ZPUk1BVF9JTlZBTElEICAgICAgICAgICAgICAgPSAwLAogCi0gICBTVkdBM0RfWDhSOEc4QjggICAgICAgPSAxLAotICAgU1ZHQTNEX0E4UjhHOEI4ICAgICAgID0gMiwKKyAgIFNWR0EzRF9YOFI4RzhCOCAgICAgICAgICAgICAgICAgICAgID0gMSwKKyAgIFNWR0EzRF9BOFI4RzhCOCAgICAgICAgICAgICAgICAgICAgID0gMiwKIAotICAgU1ZHQTNEX1I1RzZCNSAgICAgICAgID0gMywKLSAgIFNWR0EzRF9YMVI1RzVCNSAgICAgICA9IDQsCi0gICBTVkdBM0RfQTFSNUc1QjUgICAgICAgPSA1LAotICAgU1ZHQTNEX0E0UjRHNEI0ICAgICAgID0gNiwKKyAgIFNWR0EzRF9SNUc2QjUgICAgICAgICAgICAgICAgICAgICAgID0gMywKKyAgIFNWR0EzRF9YMVI1RzVCNSAgICAgICAgICAgICAgICAgICAgID0gNCwKKyAgIFNWR0EzRF9BMVI1RzVCNSAgICAgICAgICAgICAgICAgICAgID0gNSwKKyAgIFNWR0EzRF9BNFI0RzRCNCAgICAgICAgICAgICAgICAgICAgID0gNiwKIAotICAgU1ZHQTNEX1pfRDMyICAgICAgICAgID0gNywKLSAgIFNWR0EzRF9aX0QxNiAgICAgICAgICA9IDgsCi0gICBTVkdBM0RfWl9EMjRTOCAgICAgICAgPSA5LAotICAgU1ZHQTNEX1pfRDE1UzEgICAgICAgID0gMTAsCisgICBTVkdBM0RfWl9EMzIgICAgICAgICAgICAgICAgICAgICAgICA9IDcsCisgICBTVkdBM0RfWl9EMTYgICAgICAgICAgICAgICAgICAgICAgICA9IDgsCisgICBTVkdBM0RfWl9EMjRTOCAgICAgICAgICAgICAgICAgICAgICA9IDksCisgICBTVkdBM0RfWl9EMTVTMSAgICAgICAgICAgICAgICAgICAgICA9IDEwLAogCi0gICBTVkdBM0RfTFVNSU5BTkNFOCAgICAgICAgICAgID0gMTEsCi0gICBTVkdBM0RfTFVNSU5BTkNFNF9BTFBIQTQgICAgID0gMTIsCi0gICBTVkdBM0RfTFVNSU5BTkNFMTYgICAgICAgICAgID0gMTMsCi0gICBTVkdBM0RfTFVNSU5BTkNFOF9BTFBIQTggICAgID0gMTQsCisgICBTVkdBM0RfTFVNSU5BTkNFOCAgICAgICAgICAgICAgICAgICA9IDExLAorICAgU1ZHQTNEX0xVTUlOQU5DRTRfQUxQSEE0ICAgICAgICAgICAgPSAxMiwKKyAgIFNWR0EzRF9MVU1JTkFOQ0UxNiAgICAgICAgICAgICAgICAgID0gMTMsCisgICBTVkdBM0RfTFVNSU5BTkNFOF9BTFBIQTggICAgICAgICAgICA9IDE0LAogCi0gICBTVkdBM0RfRFhUMSAgICAgICAgICAgPSAxNSwKLSAgIFNWR0EzRF9EWFQyICAgICAgICAgICA9IDE2LAotICAgU1ZHQTNEX0RYVDMgICAgICAgICAgID0gMTcsCi0gICBTVkdBM0RfRFhUNCAgICAgICAgICAgPSAxOCwKLSAgIFNWR0EzRF9EWFQ1ICAgICAgICAgICA9IDE5LAorICAgU1ZHQTNEX0RYVDEgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwKKyAgIFNWR0EzRF9EWFQyICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsCisgICBTVkdBM0RfRFhUMyAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LAorICAgU1ZHQTNEX0RYVDQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwKKyAgIFNWR0EzRF9EWFQ1ICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksCiAKLSAgIFNWR0EzRF9CVU1QVThWOCAgICAgICA9IDIwLAotICAgU1ZHQTNEX0JVTVBMNlY1VTUgICAgID0gMjEsCi0gICBTVkdBM0RfQlVNUFg4TDhWOFU4ICAgPSAyMiwKLSAgIFNWR0EzRF9CVU1QTDhWOFU4ICAgICA9IDIzLAorICAgU1ZHQTNEX0JVTVBVOFY4ICAgICAgICAgICAgICAgICAgICAgPSAyMCwKKyAgIFNWR0EzRF9CVU1QTDZWNVU1ICAgICAgICAgICAgICAgICAgID0gMjEsCisgICBTVkdBM0RfQlVNUFg4TDhWOFU4ICAgICAgICAgICAgICAgICA9IDIyLAorICAgU1ZHQTNEX0JVTVBMOFY4VTggICAgICAgICAgICAgICAgICAgPSAyMywKIAotICAgU1ZHQTNEX0FSR0JfUzEwRTUgICAgID0gMjQsICAgLyogMTYtYml0IGZsb2F0aW5nLXBvaW50IEFSR0IgKi8KLSAgIFNWR0EzRF9BUkdCX1MyM0U4ICAgICA9IDI1LCAgIC8qIDMyLWJpdCBmbG9hdGluZy1wb2ludCBBUkdCICovCisgICBTVkdBM0RfQVJHQl9TMTBFNSAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qIDE2LWJpdCBmbG9hdGluZy1wb2ludCBBUkdCICovCisgICBTVkdBM0RfQVJHQl9TMjNFOCAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qIDMyLWJpdCBmbG9hdGluZy1wb2ludCBBUkdCICovCiAKLSAgIFNWR0EzRF9BMlIxMEcxMEIxMCAgICA9IDI2LAorICAgU1ZHQTNEX0EyUjEwRzEwQjEwICAgICAgICAgICAgICAgICAgPSAyNiwKIAogICAgLyogc2lnbmVkIGZvcm1hdHMgKi8KLSAgIFNWR0EzRF9WOFU4ICAgICAgICAgICA9IDI3LAotICAgU1ZHQTNEX1E4VzhWOFU4ICAgICAgID0gMjgsCi0gICBTVkdBM0RfQ3hWOFU4ICAgICAgICAgPSAyOSwKKyAgIFNWR0EzRF9WOFU4ICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsCisgICBTVkdBM0RfUThXOFY4VTggICAgICAgICAgICAgICAgICAgICA9IDI4LAorICAgU1ZHQTNEX0N4VjhVOCAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwKIAogICAgLyogbWl4ZWQgZm9ybWF0cyAqLwotICAgU1ZHQTNEX1g4TDhWOFU4ICAgICAgID0gMzAsCi0gICBTVkdBM0RfQTJXMTBWMTBVMTAgICAgPSAzMSwKKyAgIFNWR0EzRF9YOEw4VjhVOCAgICAgICAgICAgICAgICAgICAgID0gMzAsCisgICBTVkdBM0RfQTJXMTBWMTBVMTAgICAgICAgICAgICAgICAgICA9IDMxLAogCi0gICBTVkdBM0RfQUxQSEE4ICAgICAgICAgPSAzMiwKKyAgIFNWR0EzRF9BTFBIQTggICAgICAgICAgICAgICAgICAgICAgID0gMzIsCiAKICAgIC8qIFNpbmdsZS0gYW5kIGR1YWwtY29tcG9uZW50IGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgKi8KLSAgIFNWR0EzRF9SX1MxMEU1ICAgICAgICA9IDMzLAotICAgU1ZHQTNEX1JfUzIzRTggICAgICAgID0gMzQsCi0gICBTVkdBM0RfUkdfUzEwRTUgICAgICAgPSAzNSwKLSAgIFNWR0EzRF9SR19TMjNFOCAgICAgICA9IDM2LAorICAgU1ZHQTNEX1JfUzEwRTUgICAgICAgICAgICAgICAgICAgICAgPSAzMywKKyAgIFNWR0EzRF9SX1MyM0U4ICAgICAgICAgICAgICAgICAgICAgID0gMzQsCisgICBTVkdBM0RfUkdfUzEwRTUgICAgICAgICAgICAgICAgICAgICA9IDM1LAorICAgU1ZHQTNEX1JHX1MyM0U4ICAgICAgICAgICAgICAgICAgICAgPSAzNiwKIAogICAgLyoKICAgICAqIEFueSBzdXJmYWNlIGNhbiBiZSB1c2VkIGFzIGEgYnVmZmVyIG9iamVjdCwgYnV0IFNWR0EzRF9CVUZGRVIgaXMKICAgICAqIHRoZSBtb3N0IGVmZmljaWVudCBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IHN1cmZhY2VzCiAgICAgKiBleHByZXNzbHkgZm9yIGluZGV4IG9yIHZlcnRleCBkYXRhLgogICAgICovCi0gICBTVkdBM0RfQlVGRkVSICAgICAgICAgPSAzNywKIAotICAgU1ZHQTNEX1pfRDI0WDggICAgICAgID0gMzgsCisgICBTVkdBM0RfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICA9IDM3LAogCi0gICBTVkdBM0RfVjE2VTE2ICAgICAgICAgPSAzOSwKKyAgIFNWR0EzRF9aX0QyNFg4ICAgICAgICAgICAgICAgICAgICAgID0gMzgsCiAKLSAgIFNWR0EzRF9HMTZSMTYgICAgICAgICA9IDQwLAotICAgU1ZHQTNEX0ExNkIxNkcxNlIxNiAgID0gNDEsCisgICBTVkdBM0RfVjE2VTE2ICAgICAgICAgICAgICAgICAgICAgICA9IDM5LAorCisgICBTVkdBM0RfRzE2UjE2ICAgICAgICAgICAgICAgICAgICAgICA9IDQwLAorICAgU1ZHQTNEX0ExNkIxNkcxNlIxNiAgICAgICAgICAgICAgICAgPSA0MSwKIAogICAgLyogUGFja2VkIFZpZGVvIGZvcm1hdHMgKi8KLSAgIFNWR0EzRF9VWVZZICAgICAgICAgICA9IDQyLAotICAgU1ZHQTNEX1lVWTIgICAgICAgICAgID0gNDMsCisgICBTVkdBM0RfVVlWWSAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLAorICAgU1ZHQTNEX1lVWTIgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywKKworICAgLyogUGxhbmFyIHZpZGVvIGZvcm1hdHMgKi8KKyAgIFNWR0EzRF9OVjEyICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQsCisKKyAgIC8qIFZpZGVvIGZvcm1hdCB3aXRoIGFscGhhICovCisgICBTVkdBM0RfQVlVViAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LAorCisgICBTVkdBM0RfQkM0X1VOT1JNICAgICAgICAgICAgICAgICAgICA9IDEwOCwKKyAgIFNWR0EzRF9CQzVfVU5PUk0gICAgICAgICAgICAgICAgICAgID0gMTExLAorCisgICAvKiBBZHZhbmNlZCBEM0Q5IGRlcHRoIGZvcm1hdHMuICovCisgICBTVkdBM0RfWl9ERjE2ICAgICAgICAgICAgICAgICAgICAgICA9IDExOCwKKyAgIFNWR0EzRF9aX0RGMjQgICAgICAgICAgICAgICAgICAgICAgID0gMTE5LAorICAgU1ZHQTNEX1pfRDI0UzhfSU5UICAgICAgICAgICAgICAgICAgPSAxMjAsCiAKICAgIFNWR0EzRF9GT1JNQVRfTUFYCiB9IFNWR0EzZFN1cmZhY2VGb3JtYXQ7CkBAIC00MTQsMTAgKzQzMSwyMCBAQAogICAgU1ZHQTNEX1JTX1NSQ0JMRU5EQUxQSEEgICAgICAgICAgICAgPSA5NCwgICAgLyogU1ZHQTNkQmxlbmRPcCAqLwogICAgU1ZHQTNEX1JTX0RTVEJMRU5EQUxQSEEgICAgICAgICAgICAgPSA5NSwgICAgLyogU1ZHQTNkQmxlbmRPcCAqLwogICAgU1ZHQTNEX1JTX0JMRU5ERVFVQVRJT05BTFBIQSAgICAgICAgPSA5NiwgICAgLyogU1ZHQTNkQmxlbmRFcXVhdGlvbiAqLworICAgU1ZHQTNEX1JTX1RSQU5TUEFSRU5DWUFOVElBTElBUyAgICAgPSA5NywgICAgLyogU1ZHQTNkVHJhbnNwYXJlbmN5QW50aWFsaWFzVHlwZSAqLworICAgU1ZHQTNEX1JTX0xJTkVBQSAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAgLyogU1ZHQTNkQm9vbCAqLworICAgU1ZHQTNEX1JTX0xJTkVXSURUSCAgICAgICAgICAgICAgICAgPSA5OSwgICAgLyogZmxvYXQgKi8KICAgIFNWR0EzRF9SU19NQVgKIH0gU1ZHQTNkUmVuZGVyU3RhdGVOYW1lOwogCiB0eXBlZGVmIGVudW0geworICAgU1ZHQTNEX1RSQU5TUEFSRU5DWUFOVElBTElBU19OT1JNQUwgICAgICAgICAgICA9IDAsCisgICBTVkdBM0RfVFJBTlNQQVJFTkNZQU5USUFMSUFTX0FMUEhBVE9DT1ZFUkFHRSAgID0gMSwKKyAgIFNWR0EzRF9UUkFOU1BBUkVOQ1lBTlRJQUxJQVNfU1VQRVJTQU1QTEUgICAgICAgPSAyLAorICAgU1ZHQTNEX1RSQU5TUEFSRU5DWUFOVElBTElBU19NQVgKK30gU1ZHQTNkVHJhbnNwYXJlbmN5QW50aWFsaWFzVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKICAgIFNWR0EzRF9WRVJURVhNQVRFUklBTF9OT05FICAgICA9IDAsICAgIC8qIFVzZSB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgKi8KICAgIFNWR0EzRF9WRVJURVhNQVRFUklBTF9ESUZGVVNFICA9IDEsICAgIC8qIFVzZSB0aGUgdmFsdWUgaW4gdGhlIGRpZmZ1c2UgY29tcG9uZW50ICovCiAgICBTVkdBM0RfVkVSVEVYTUFURVJJQUxfU1BFQ1VMQVIgPSAyLCAgICAvKiBVc2UgdGhlIHZhbHVlIGluIHRoZSBzcGVjdWxhciBjb21wb25lbnQgKi8KQEAgLTcyOCwxMCArNzU1LDEwIEBACiAgICBTVkdBM0RfVEVYX0ZJTFRFUl9ORUFSRVNUICAgICAgICA9IDEsCiAgICBTVkdBM0RfVEVYX0ZJTFRFUl9MSU5FQVIgICAgICAgICA9IDIsCiAgICBTVkdBM0RfVEVYX0ZJTFRFUl9BTklTT1RST1BJQyAgICA9IDMsCi0gICBTVkdBM0RfVEVYX0ZJTFRFUl9GTEFUQ1VCSUMgICAgICA9IDQsIC8vIERlcHJlY2F0ZWQsIG5vdCBpbXBsZW1lbnRlZAotICAgU1ZHQTNEX1RFWF9GSUxURVJfR0FVU1NJQU5DVUJJQyAgPSA1LCAvLyBEZXByZWNhdGVkLCBub3QgaW1wbGVtZW50ZWQKLSAgIFNWR0EzRF9URVhfRklMVEVSX1BZUkFNSURBTFFVQUQgID0gNiwgLy8gTm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAotICAgU1ZHQTNEX1RFWF9GSUxURVJfR0FVU1NJQU5RVUFEICAgPSA3LCAvLyBOb3QgY3VycmVudGx5IGltcGxlbWVudGVkCisgICBTVkdBM0RfVEVYX0ZJTFRFUl9GTEFUQ1VCSUMgICAgICA9IDQsIC8qIERlcHJlY2F0ZWQsIG5vdCBpbXBsZW1lbnRlZCAqLworICAgU1ZHQTNEX1RFWF9GSUxURVJfR0FVU1NJQU5DVUJJQyAgPSA1LCAvKiBEZXByZWNhdGVkLCBub3QgaW1wbGVtZW50ZWQgKi8KKyAgIFNWR0EzRF9URVhfRklMVEVSX1BZUkFNSURBTFFVQUQgID0gNiwgLyogTm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCAqLworICAgU1ZHQTNEX1RFWF9GSUxURVJfR0FVU1NJQU5RVUFEICAgPSA3LCAvKiBOb3QgY3VycmVudGx5IGltcGxlbWVudGVkICovCiAgICBTVkdBM0RfVEVYX0ZJTFRFUl9NQVgKIH0gU1ZHQTNkVGV4dHVyZUZpbHRlcjsKIApAQCAtNzk5LDE5ICs4MjYsMTkgQEAKIAogdHlwZWRlZiBlbnVtIHsKICAgIFNWR0EzRF9ERUNMVVNBR0VfUE9TSVRJT04gICAgID0gMCwKLSAgIFNWR0EzRF9ERUNMVVNBR0VfQkxFTkRXRUlHSFQsICAgICAgIC8vICAxCi0gICBTVkdBM0RfREVDTFVTQUdFX0JMRU5ESU5ESUNFUywgICAgICAvLyAgMgotICAgU1ZHQTNEX0RFQ0xVU0FHRV9OT1JNQUwsICAgICAgICAgICAgLy8gIDMKLSAgIFNWR0EzRF9ERUNMVVNBR0VfUFNJWkUsICAgICAgICAgICAgIC8vICA0Ci0gICBTVkdBM0RfREVDTFVTQUdFX1RFWENPT1JELCAgICAgICAgICAvLyAgNQotICAgU1ZHQTNEX0RFQ0xVU0FHRV9UQU5HRU5ULCAgICAgICAgICAgLy8gIDYKLSAgIFNWR0EzRF9ERUNMVVNBR0VfQklOT1JNQUwsICAgICAgICAgIC8vICA3Ci0gICBTVkdBM0RfREVDTFVTQUdFX1RFU1NGQUNUT1IsICAgICAgICAvLyAgOAotICAgU1ZHQTNEX0RFQ0xVU0FHRV9QT1NJVElPTlQsICAgICAgICAgLy8gIDkKLSAgIFNWR0EzRF9ERUNMVVNBR0VfQ09MT1IsICAgICAgICAgICAgIC8vIDEwCi0gICBTVkdBM0RfREVDTFVTQUdFX0ZPRywgICAgICAgICAgICAgICAvLyAxMQotICAgU1ZHQTNEX0RFQ0xVU0FHRV9ERVBUSCwgICAgICAgICAgICAgLy8gMTIKLSAgIFNWR0EzRF9ERUNMVVNBR0VfU0FNUExFLCAgICAgICAgICAgIC8vIDEzCisgICBTVkdBM0RfREVDTFVTQUdFX0JMRU5EV0VJR0hULCAgICAgICAvKiAgMSAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9CTEVORElORElDRVMsICAgICAgLyogIDIgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfTk9STUFMLCAgICAgICAgICAgIC8qICAzICovCisgICBTVkdBM0RfREVDTFVTQUdFX1BTSVpFLCAgICAgICAgICAgICAvKiAgNCAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9URVhDT09SRCwgICAgICAgICAgLyogIDUgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfVEFOR0VOVCwgICAgICAgICAgIC8qICA2ICovCisgICBTVkdBM0RfREVDTFVTQUdFX0JJTk9STUFMLCAgICAgICAgICAvKiAgNyAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9URVNTRkFDVE9SLCAgICAgICAgLyogIDggKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfUE9TSVRJT05ULCAgICAgICAgIC8qICA5ICovCisgICBTVkdBM0RfREVDTFVTQUdFX0NPTE9SLCAgICAgICAgICAgICAvKiAxMCAqLworICAgU1ZHQTNEX0RFQ0xVU0FHRV9GT0csICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgIFNWR0EzRF9ERUNMVVNBR0VfREVQVEgsICAgICAgICAgICAgIC8qIDEyICovCisgICBTVkdBM0RfREVDTFVTQUdFX1NBTVBMRSwgICAgICAgICAgICAvKiAxMyAqLwogICAgU1ZHQTNEX0RFQ0xVU0FHRV9NQVgKIH0gU1ZHQTNkRGVjbFVzYWdlOwogCkBAIC04MTksMTAgKzg0NiwxMCBAQAogICAgU1ZHQTNEX0RFQ0xNRVRIT0RfREVGQVVMVCAgICAgPSAwLAogICAgU1ZHQTNEX0RFQ0xNRVRIT0RfUEFSVElBTFUsCiAgICBTVkdBM0RfREVDTE1FVEhPRF9QQVJUSUFMViwKLSAgIFNWR0EzRF9ERUNMTUVUSE9EX0NST1NTVVYsICAgICAgICAgIC8vIE5vcm1hbAorICAgU1ZHQTNEX0RFQ0xNRVRIT0RfQ1JPU1NVViwgICAgICAgICAgLyogTm9ybWFsICovCiAgICBTVkdBM0RfREVDTE1FVEhPRF9VViwKLSAgIFNWR0EzRF9ERUNMTUVUSE9EX0xPT0tVUCwgICAgICAgICAgIC8vIExvb2t1cCBhIGRpc3BsYWNlbWVudCBtYXAKLSAgIFNWR0EzRF9ERUNMTUVUSE9EX0xPT0tVUFBSRVNBTVBMRUQsIC8vIExvb2t1cCBhIHByZS1zYW1wbGVkIGRpc3BsYWNlbWVudCBtYXAKKyAgIFNWR0EzRF9ERUNMTUVUSE9EX0xPT0tVUCwgICAgICAgICAgIC8qIExvb2t1cCBhIGRpc3BsYWNlbWVudCBtYXAgKi8KKyAgIFNWR0EzRF9ERUNMTUVUSE9EX0xPT0tVUFBSRVNBTVBMRUQsIC8qIExvb2t1cCBhIHByZS1zYW1wbGVkIGRpc3BsYWNlbWVudCBtYXAgKi8KIH0gU1ZHQTNkRGVjbE1ldGhvZDsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTkzMCw3ICs5NTcsNiBAQAogfSBTVkdBM2RDdWJlRmFjZTsKIAogdHlwZWRlZiBlbnVtIHsKLSAgIFNWR0EzRF9TSEFERVJUWVBFX0NPTVBJTEVEX0RYOCAgICAgICAgICAgICAgID0gMCwKICAgIFNWR0EzRF9TSEFERVJUWVBFX1ZTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKICAgIFNWR0EzRF9TSEFERVJUWVBFX1BTICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKICAgIFNWR0EzRF9TSEFERVJUWVBFX01BWApAQCAtOTY4LDEyICs5OTQsMTggQEAKIH0gU1ZHQTNkVHJhbnNmZXJUeXBlOwogCiAvKgotICogVGhlIG1heGltdW0gbnVtYmVyIHZlcnRleCBhcnJheXMgd2UncmUgZ3VhcmFudGVlZCB0byBzdXBwb3J0IGluCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmVydGV4IGFycmF5cyB3ZSdyZSBndWFyYW50ZWVkIHRvIHN1cHBvcnQgaW4KICAqIFNWR0FfM0RfQ01EX0RSQVdQUklNSVRJVkVTLgogICovCiAjZGVmaW5lIFNWR0EzRF9NQVhfVkVSVEVYX0FSUkFZUyAgIDMyCiAKIC8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJpbWl0aXZlIHJhbmdlcyB3ZSdyZSBndWFyYW50ZWVkIHRvIHN1cHBvcnQKKyAqIGluIFNWR0FfM0RfQ01EX0RSQVdQUklNSVRJVkVTLgorICovCisjZGVmaW5lIFNWR0EzRF9NQVhfRFJBV19QUklNSVRJVkVfUkFOR0VTIDMyCisKKy8qCiAgKiBJZGVudGlmaWVycyBmb3IgY29tbWFuZHMgaW4gdGhlIGNvbW1hbmQgRklGTy4KICAqCiAgKiBJRHMgYmV0d2VlbiAxMDAwIGFuZCAxMDM5IChpbmNsdXNpdmUpIHdlcmUgdXNlZCBieSBvYnNvbGV0ZSB2ZXJzaW9ucyBvZgpAQCAtOTkwLDcgKzEwMjIsNyBAQAogI2RlZmluZSBTVkdBXzNEX0NNRF9MRUdBQ1lfQkFTRSAgICAgICAgICAgIDEwMDAKICNkZWZpbmUgU1ZHQV8zRF9DTURfQkFTRSAgICAgICAgICAgICAgICAgICAxMDQwCiAKLSNkZWZpbmUgU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkUgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMAorI2RlZmluZSBTVkdBXzNEX0NNRF9TVVJGQUNFX0RFRklORSAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAwICAgICAvKiBEZXByZWNhdGVkICovCiAjZGVmaW5lIFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVTVFJPWSAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDEKICNkZWZpbmUgU1ZHQV8zRF9DTURfU1VSRkFDRV9DT1BZICAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMgogI2RlZmluZSBTVkdBXzNEX0NNRF9TVVJGQUNFX1NUUkVUQ0hCTFQgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAzCkBAIC0xMDA4LDcgKzEwNDAsNyBAQAogI2RlZmluZSBTVkdBXzNEX0NNRF9TRVRWSUVXUE9SVCAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAxNQogI2RlZmluZSBTVkdBXzNEX0NNRF9TRVRDTElQUExBTkUgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAxNgogI2RlZmluZSBTVkdBXzNEX0NNRF9DTEVBUiAgICAgICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAxNwotI2RlZmluZSBTVkdBXzNEX0NNRF9QUkVTRU5UICAgICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAxOCAgICAvLyBEZXByZWNhdGVkCisjZGVmaW5lIFNWR0FfM0RfQ01EX1BSRVNFTlQgICAgICAgICAgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDE4ICAgIC8qIERlcHJlY2F0ZWQgKi8KICNkZWZpbmUgU1ZHQV8zRF9DTURfU0hBREVSX0RFRklORSAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMTkKICNkZWZpbmUgU1ZHQV8zRF9DTURfU0hBREVSX0RFU1RST1kgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMjAKICNkZWZpbmUgU1ZHQV8zRF9DTURfU0VUX1NIQURFUiAgICAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMjEKQEAgLTEwMTgsOSArMTA1MCwxMyBAQAogI2RlZmluZSBTVkdBXzNEX0NNRF9CRUdJTl9RVUVSWSAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyNQogI2RlZmluZSBTVkdBXzNEX0NNRF9FTkRfUVVFUlkgICAgICAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyNgogI2RlZmluZSBTVkdBXzNEX0NNRF9XQUlUX0ZPUl9RVUVSWSAgICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyNwotI2RlZmluZSBTVkdBXzNEX0NNRF9QUkVTRU5UX1JFQURCQUNLICAgICAgIFNWR0FfM0RfQ01EX0JBU0UgKyAyOCAgICAvLyBEZXByZWNhdGVkCisjZGVmaW5lIFNWR0FfM0RfQ01EX1BSRVNFTlRfUkVBREJBQ0sgICAgICAgU1ZHQV8zRF9DTURfQkFTRSArIDI4ICAgIC8qIERlcHJlY2F0ZWQgKi8KICNkZWZpbmUgU1ZHQV8zRF9DTURfQkxJVF9TVVJGQUNFX1RPX1NDUkVFTiBTVkdBXzNEX0NNRF9CQVNFICsgMjkKLSNkZWZpbmUgU1ZHQV8zRF9DTURfTUFYICAgICAgICAgICAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMzAKKyNkZWZpbmUgU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkVfVjIgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMzAKKyNkZWZpbmUgU1ZHQV8zRF9DTURfR0VORVJBVEVfTUlQTUFQUyAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgMzEKKyNkZWZpbmUgU1ZHQV8zRF9DTURfQUNUSVZBVEVfU1VSRkFDRSAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgNDAKKyNkZWZpbmUgU1ZHQV8zRF9DTURfREVBQ1RJVkFURV9TVVJGQUNFICAgICBTVkdBXzNEX0NNRF9CQVNFICsgNDEKKyNkZWZpbmUgU1ZHQV8zRF9DTURfTUFYICAgICAgICAgICAgICAgICAgICBTVkdBXzNEX0NNRF9CQVNFICsgNDIKIAogI2RlZmluZSBTVkdBXzNEX0NNRF9GVVRVUkVfTUFYICAgICAgICAgICAgIDIwMDAKIApAQCAtMTAzMSw5ICsxMDY3LDkgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgIHVuaW9uIHsKICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICB1aW50MTYgIGZ1bmN0aW9uOyAgICAgICAvLyBTVkdBM2RGb2dGdW5jdGlvbgotICAgICAgICAgdWludDggICB0eXBlOyAgICAgICAgICAgLy8gU1ZHQTNkRm9nVHlwZQotICAgICAgICAgdWludDggICBiYXNlOyAgICAgICAgICAgLy8gU1ZHQTNkRm9nQmFzZQorICAgICAgICAgdWludDE2ICBmdW5jdGlvbjsgICAgICAgLyogU1ZHQTNkRm9nRnVuY3Rpb24gKi8KKyAgICAgICAgIHVpbnQ4ICAgdHlwZTsgICAgICAgICAgIC8qIFNWR0EzZEZvZ1R5cGUgKi8KKyAgICAgICAgIHVpbnQ4ICAgYmFzZTsgICAgICAgICAgIC8qIFNWR0EzZEZvZ0Jhc2UgKi8KICAgICAgIH07CiAgICAgICB1aW50MzIgICAgIHVpbnRWYWx1ZTsKICAgIH07CkBAIC0xMTA5LDYgKzExNDUsOCBAQAogICAgU1ZHQTNEX1NVUkZBQ0VfSElOVF9SRU5ERVJUQVJHRVQgICAgPSAoMSA8PCA2KSwKICAgIFNWR0EzRF9TVVJGQUNFX0hJTlRfREVQVEhTVEVOQ0lMICAgID0gKDEgPDwgNyksCiAgICBTVkdBM0RfU1VSRkFDRV9ISU5UX1dSSVRFT05MWSAgICAgICA9ICgxIDw8IDgpLAorICAgU1ZHQTNEX1NVUkZBQ0VfTUFTS0FCTEVfQU5USUFMSUFTICAgPSAoMSA8PCA5KSwKKyAgIFNWR0EzRF9TVVJGQUNFX0FVVE9HRU5NSVBNQVBTICAgICAgID0gKDEgPDwgMTApLAogfSBTVkdBM2RTdXJmYWNlRmxhZ3M7CiAKIHR5cGVkZWYKQEAgLTExMjEsNiArMTE1OSwxMiBAQAogICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgIHNpZDsKICAgIFNWR0EzZFN1cmZhY2VGbGFncyAgICAgICAgICBzdXJmYWNlRmxhZ3M7CiAgICBTVkdBM2RTdXJmYWNlRm9ybWF0ICAgICAgICAgZm9ybWF0OworICAgLyoKKyAgICAqIElmIHN1cmZhY2VGbGFncyBoYXMgU1ZHQTNEX1NVUkZBQ0VfQ1VCRU1BUCBiaXQgc2V0LCBhbGwgU1ZHQTNkU3VyZmFjZUZhY2UKKyAgICAqIHN0cnVjdHVyZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIG9mIG51bU1pcExldmVscyBmaWVsZC4KKyAgICAqIE90aGVyd2lzZSwgYWxsIGJ1dCB0aGUgZmlyc3QgU1ZHQTNkU3VyZmFjZUZhY2Ugc3RydWN0dXJlcyBtdXN0IGhhdmUgdGhlCisgICAgKiBudW1NaXBMZXZlbHMgc2V0IHRvIDAuCisgICAgKi8KICAgIFNWR0EzZFN1cmZhY2VGYWNlICAgICAgICAgICBmYWNlW1NWR0EzRF9NQVhfU1VSRkFDRV9GQUNFU107CiAgICAvKgogICAgICogRm9sbG93ZWQgYnkgYW4gU1ZHQTNkU2l6ZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggbWlwIGxldmVsIGluIGVhY2ggZmFjZS4KQEAgLTExMzUsNiArMTE3OSwzMSBAQAogCiB0eXBlZGVmCiBzdHJ1Y3QgeworICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgIHNpZDsKKyAgIFNWR0EzZFN1cmZhY2VGbGFncyAgICAgICAgICBzdXJmYWNlRmxhZ3M7CisgICBTVkdBM2RTdXJmYWNlRm9ybWF0ICAgICAgICAgZm9ybWF0OworICAgLyoKKyAgICAqIElmIHN1cmZhY2VGbGFncyBoYXMgU1ZHQTNEX1NVUkZBQ0VfQ1VCRU1BUCBiaXQgc2V0LCBhbGwgU1ZHQTNkU3VyZmFjZUZhY2UKKyAgICAqIHN0cnVjdHVyZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIG9mIG51bU1pcExldmVscyBmaWVsZC4KKyAgICAqIE90aGVyd2lzZSwgYWxsIGJ1dCB0aGUgZmlyc3QgU1ZHQTNkU3VyZmFjZUZhY2Ugc3RydWN0dXJlcyBtdXN0IGhhdmUgdGhlCisgICAgKiBudW1NaXBMZXZlbHMgc2V0IHRvIDAuCisgICAgKi8KKyAgIFNWR0EzZFN1cmZhY2VGYWNlICAgICAgICAgICBmYWNlW1NWR0EzRF9NQVhfU1VSRkFDRV9GQUNFU107CisgICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgbXVsdGlzYW1wbGVDb3VudDsKKyAgIFNWR0EzZFRleHR1cmVGaWx0ZXIgICAgICAgICBhdXRvZ2VuRmlsdGVyOworICAgLyoKKyAgICAqIEZvbGxvd2VkIGJ5IGFuIFNWR0EzZFNpemUgc3RydWN0dXJlIGZvciBlYWNoIG1pcCBsZXZlbCBpbiBlYWNoIGZhY2UuCisgICAgKgorICAgICogQSBub3RlIG9uIHN1cmZhY2Ugc2l6ZXM6IFNpemVzIGFyZSBhbHdheXMgc3BlY2lmaWVkIGluIHBpeGVscywKKyAgICAqIGV2ZW4gaWYgdGhlIHRydWUgc3VyZmFjZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBtaW5pbXVtCisgICAgKiBibG9jayBzaXplIG9mIHRoZSBzdXJmYWNlJ3MgZm9ybWF0LiBGb3IgZXhhbXBsZSwgYSAzeDN4MSBEWFQxCisgICAgKiBjb21wcmVzc2VkIHRleHR1cmUgd291bGQgYWN0dWFsbHkgYmUgc3RvcmVkIGFzIGEgNHg0eDEgaW1hZ2UgaW4KKyAgICAqIG1lbW9yeS4KKyAgICAqLworfSBTVkdBM2RDbWREZWZpbmVTdXJmYWNlX3YyOyAgICAgLyogU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkVfVjIgKi8KKwordHlwZWRlZgorc3RydWN0IHsKICAgIHVpbnQzMiAgICAgICAgICAgICAgIHNpZDsKIH0gU1ZHQTNkQ21kRGVzdHJveVN1cmZhY2U7ICAgICAgLyogU1ZHQV8zRF9DTURfU1VSRkFDRV9ERVNUUk9ZICovCiAKQEAgLTE0NzQsMTAgKzE1NDMsMTIgQEAKICAgICAqIFNWR0EzZENtZERyYXdQcmltaXRpdmVzIHN0cnVjdHVyZS4gSW4gb3JkZXIsCiAgICAgKiB0aGV5IGFyZToKICAgICAqCi0gICAgKiAxLiBTVkdBM2RWZXJ0ZXhEZWNsLCBxdWFudGl0eSAnbnVtVmVydGV4RGVjbHMnCi0gICAgKiAyLiBTVkdBM2RQcmltaXRpdmVSYW5nZSwgcXVhbnRpdHkgJ251bVJhbmdlcycKKyAgICAqIDEuIFNWR0EzZFZlcnRleERlY2wsIHF1YW50aXR5ICdudW1WZXJ0ZXhEZWNscycsIGJ1dCBubyBtb3JlIHRoYW4KKyAgICAqICAgIFNWR0EzRF9NQVhfVkVSVEVYX0FSUkFZUzsKKyAgICAqIDIuIFNWR0EzZFByaW1pdGl2ZVJhbmdlLCBxdWFudGl0eSAnbnVtUmFuZ2VzJywgYnV0IG5vIG1vcmUgdGhhbgorICAgICogICAgU1ZHQTNEX01BWF9EUkFXX1BSSU1JVElWRV9SQU5HRVM7CiAgICAgKiAzLiBPcHRpb25hbGx5LCBTVkdBM2RWZXJ0ZXhEaXZpc29yLCBxdWFudGl0eSAnbnVtVmVydGV4RGVjbHMnIChjb250YWlucwotICAgICogICAgdGhlIGZyZXF1ZW5jeSBkaXZpc29yIGZvciB0aGlzIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRleCBkZWNsKQorICAgICogICAgdGhlIGZyZXF1ZW5jeSBkaXZpc29yIGZvciB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0ZXggZGVjbCkuCiAgICAgKi8KIH0gU1ZHQTNkQ21kRHJhd1ByaW1pdGl2ZXM7ICAgICAgLyogU1ZHQV8zRF9DTURfRFJBV1BSSU1JVElWRVMgKi8KIApAQCAtMTY3MSw2ICsxNzQyLDEyIEBACiAgICAvKiBDbGlwcGluZzogemVybyBvciBtb3JlIFNWR0FTaWduZWRSZWN0cyBmb2xsb3cgKi8KIH0gU1ZHQTNkQ21kQmxpdFN1cmZhY2VUb1NjcmVlbjsgICAgICAgICAvKiBTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOICovCiAKK3R5cGVkZWYKK3N0cnVjdCB7CisgICB1aW50MzIgICAgICAgICAgICAgICBzaWQ7CisgICBTVkdBM2RUZXh0dXJlRmlsdGVyICBmaWx0ZXI7Cit9IFNWR0EzZENtZEdlbmVyYXRlTWlwbWFwczsgICAgICAgICAgICAgLyogU1ZHQV8zRF9DTURfR0VORVJBVEVfTUlQTUFQUyAqLworCiAKIC8qCiAgKiBDYXBhYmlsaXR5IHF1ZXJ5IGluZGV4LgpAQCAtMTc3NCw2ICsxODUxLDMyIEBACiAgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfQTE2QjE2RzE2UjE2ICAgICAgICAgICA9IDY3LAogICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX1VZVlkgICAgICAgICAgICAgICAgICAgPSA2OCwKICAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9ZVVkyICAgICAgICAgICAgICAgICAgID0gNjksCisgICBTVkdBM0RfREVWQ0FQX01VTFRJU0FNUExFX05PTk1BU0tBQkxFU0FNUExFUyAgICA9IDcwLAorICAgU1ZHQTNEX0RFVkNBUF9NVUxUSVNBTVBMRV9NQVNLQUJMRVNBTVBMRVMgICAgICAgPSA3MSwKKyAgIFNWR0EzRF9ERVZDQVBfQUxQSEFUT0NPVkVSQUdFICAgICAgICAgICAgICAgICAgID0gNzIsCisgICBTVkdBM0RfREVWQ0FQX1NVUEVSU0FNUExFICAgICAgICAgICAgICAgICAgICAgICA9IDczLAorICAgU1ZHQTNEX0RFVkNBUF9BVVRPR0VOTUlQTUFQUyAgICAgICAgICAgICAgICAgICAgPSA3NCwKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9OVjEyICAgICAgICAgICAgICAgICAgID0gNzUsCisgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfQVlVViAgICAgICAgICAgICAgICAgICA9IDc2LAorCisgICAvKgorICAgICogVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgU1ZHQSBjb250ZXh0IElEcyB0aGF0IHRoZSBndWVzdAorICAgICogY2FuIGRlZmluZSB1c2luZyBTVkdBXzNEX0NNRF9DT05URVhUX0RFRklORS4KKyAgICAqLworICAgU1ZHQTNEX0RFVkNBUF9NQVhfQ09OVEVYVF9JRFMgICAgICAgICAgICAgICAgICAgPSA3NywKKworICAgLyoKKyAgICAqIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFNWR0Egc3VyZmFjZSBJRHMgdGhhdCB0aGUgZ3Vlc3QKKyAgICAqIGNhbiBkZWZpbmUgdXNpbmcgU1ZHQV8zRF9DTURfU1VSRkFDRV9ERUZJTkUqLgorICAgICovCisgICBTVkdBM0RfREVWQ0FQX01BWF9TVVJGQUNFX0lEUyAgICAgICAgICAgICAgICAgICA9IDc4LAorCisgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfWl9ERjE2ICAgICAgICAgICAgICAgICA9IDc5LAorICAgU1ZHQTNEX0RFVkNBUF9TVVJGQUNFRk1UX1pfREYyNCAgICAgICAgICAgICAgICAgPSA4MCwKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9aX0QyNFM4X0lOVCAgICAgICAgICAgID0gODEsCisKKyAgIFNWR0EzRF9ERVZDQVBfU1VSRkFDRUZNVF9CQzRfVU5PUk0gICAgICAgICAgICAgID0gODIsCisgICBTVkdBM0RfREVWQ0FQX1NVUkZBQ0VGTVRfQkM1X1VOT1JNICAgICAgICAgICAgICA9IDgzLAogCiAgICAvKgogICAgICogRG9uJ3QgYWRkIG5ldyBjYXBzIGludG8gdGhlIHByZXZpb3VzIHNlY3Rpb247IHRoZSB2YWx1ZXMgaW4gdGhpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX2VzY2FwZS5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX2VzY2FwZS5oCmluZGV4IDdiODVlOWIuLjhlOGQ5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9lc2NhcGUuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfZXNjYXBlLmgKQEAgLTc1LDcgKzc1LDcgQEAKICAqLwogCiAjZGVmaW5lIFNWR0FfRVNDQVBFX1ZNV0FSRV9ISU5UICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBTVkdBX0VTQ0FQRV9WTVdBUkVfSElOVF9GVUxMU0NSRUVOICAgIDB4MDAwMzAwMDEgIC8vIERlcHJlY2F0ZWQKKyNkZWZpbmUgU1ZHQV9FU0NBUEVfVk1XQVJFX0hJTlRfRlVMTFNDUkVFTiAgICAweDAwMDMwMDAxICAvKiBEZXByZWNhdGVkICovCiAKIHR5cGVkZWYKIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2Ffb3ZlcmxheS5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX292ZXJsYXkuaAppbmRleCBmNzUzZDczLi5mMzg0MTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2Ffb3ZlcmxheS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9vdmVybGF5LmgKQEAgLTM4LDkgKzM4LDkgQEAKICAqIFZpZGVvIGZvcm1hdHMgd2Ugc3VwcG9ydAogICovCiAKLSNkZWZpbmUgVk1XQVJFX0ZPVVJDQ19ZVjEyIDB4MzIzMTU2NTkgLy8gJ1knICdWJyAnMScgJzInCi0jZGVmaW5lIFZNV0FSRV9GT1VSQ0NfWVVZMiAweDMyNTk1NTU5IC8vICdZJyAnVScgJ1knICcyJwotI2RlZmluZSBWTVdBUkVfRk9VUkNDX1VZVlkgMHg1OTU2NTk1NSAvLyAnVScgJ1knICdWJyAnWScKKyNkZWZpbmUgVk1XQVJFX0ZPVVJDQ19ZVjEyIDB4MzIzMTU2NTkgLyogJ1knICdWJyAnMScgJzInICovCisjZGVmaW5lIFZNV0FSRV9GT1VSQ0NfWVVZMiAweDMyNTk1NTU5IC8qICdZJyAnVScgJ1knICcyJyAqLworI2RlZmluZSBWTVdBUkVfRk9VUkNDX1VZVlkgMHg1OTU2NTk1NSAvKiAnVScgJ1knICdWJyAnWScgKi8KIAogdHlwZWRlZiBlbnVtIHsKICAgIFNWR0FfT1ZFUkxBWV9GT1JNQVRfSU5WQUxJRCA9IDAsCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICB1aW50MzIgc3RyZWFtSWQ7CiAgICB9IGhlYWRlcjsKIAotICAgLy8gTWF5IGluY2x1ZGUgemVybyBvciBtb3JlIGl0ZW1zLgorICAgLyogTWF5IGluY2x1ZGUgemVybyBvciBtb3JlIGl0ZW1zLiAqLwogICAgc3RydWN0IHsKICAgICAgIHVpbnQzMiByZWdpc3RlcklkOwogICAgICAgdWludDMyIHZhbHVlOwpAQCAtMTM0LDEyICsxMzQsMTIgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIGJvb2wKLVZNd2FyZVZpZGVvR2V0QXR0cmlidXRlcyhjb25zdCBTVkdBT3ZlcmxheUZvcm1hdCBmb3JtYXQsICAgIC8vIElOCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICp3aWR0aCwgICAgICAgICAgICAgICAgICAgICAvLyBJTiAvIE9VVAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqaGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgLy8gSU4gLyBPVVQKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKnNpemUsICAgICAgICAgICAgICAgICAgICAgIC8vIE9VVAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqcGl0Y2hlcywgICAgICAgICAgICAgICAgICAgLy8gT1VUIChvcHRpb25hbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKm9mZnNldHMpICAgICAgICAgICAgICAgICAgIC8vIE9VVCAob3B0aW9uYWwpCitWTXdhcmVWaWRlb0dldEF0dHJpYnV0ZXMoY29uc3QgU1ZHQU92ZXJsYXlGb3JtYXQgZm9ybWF0LCAgICAvKiBJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiAqd2lkdGgsICAgICAgICAgICAgICAgICAgICAgLyogSU4gLyBPVVQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKmhlaWdodCwgICAgICAgICAgICAgICAgICAgIC8qIElOIC8gT1VUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICpzaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiBPVVQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgKnBpdGNoZXMsICAgICAgICAgICAgICAgICAgIC8qIE9VVCAob3B0aW9uYWwpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyICpvZmZzZXRzKSAgICAgICAgICAgICAgICAgICAvKiBPVVQgKG9wdGlvbmFsKSAqLwogewogICAgIGludCB0bXA7CiAKQEAgLTE5OCw0ICsxOTgsNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0jZW5kaWYgLy8gX1NWR0FfT1ZFUkxBWV9IXworI2VuZGlmIC8qIF9TVkdBX09WRVJMQVlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvc3ZnYV9yZWcuaAppbmRleCAxYjk2YzJlLi4wMWY2M2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3N2Z2FfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9zdmdhX3JlZy5oCkBAIC0zOSw2ICszOSwxNSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9TVkdBMiAgICAgIDB4MDQwNQogCiAvKgorICogU1ZHQV9SRUdfRU5BQkxFIGJpdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBTVkdBX1JFR19FTkFCTEVfRElTQUJMRSAgICAgMAorI2RlZmluZSBTVkdBX1JFR19FTkFCTEVfRU5BQkxFICAgICAgMQorI2RlZmluZSBTVkdBX1JFR19FTkFCTEVfSElERSAgICAgICAgMgorI2RlZmluZSBTVkdBX1JFR19FTkFCTEVfRU5BQkxFX0hJREUgKFNWR0FfUkVHX0VOQUJMRV9FTkFCTEUgfFwKKwkJCQkgICAgIFNWR0FfUkVHX0VOQUJMRV9ISURFKQorCisvKgogICogTGVnYWwgdmFsdWVzIGZvciB0aGUgU1ZHQV9SRUdfQ1VSU09SX09OIHJlZ2lzdGVyIGluIG9sZC1mYXNoaW9uZWQKICAqIGN1cnNvciBieXBhc3MgbW9kZS4gVGhpcyBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBubyBuZXcgZ3Vlc3QKICAqIGRyaXZlcnMgc2hvdWxkIHVzZSBpdC4KQEAgLTE1OCw3ICsxNjcsOSBAQAogICAgU1ZHQV9SRUdfR01SX01BWF9ERVNDUklQVE9SX0xFTkdUSCA9IDQ0LAogCiAgICBTVkdBX1JFR19UUkFDRVMgPSA0NSwgICAgICAgICAgICAvKiBFbmFibGUgdHJhY2UtYmFzZWQgdXBkYXRlcyBldmVuIHdoZW4gRklGTyBpcyBvbiAqLwotICAgU1ZHQV9SRUdfVE9QID0gNDYsICAgICAgICAgICAgICAgLyogTXVzdCBiZSAxIG1vcmUgdGhhbiB0aGUgbGFzdCByZWdpc3RlciAqLworICAgU1ZHQV9SRUdfR01SU19NQVhfUEFHRVMgPSA0NiwgICAgLyogTWF4aW11bSBudW1iZXIgb2YgNEtCIHBhZ2VzIGZvciBhbGwgR01ScyAqLworICAgU1ZHQV9SRUdfTUVNT1JZX1NJWkUgPSA0NywgICAgICAgLyogVG90YWwgZGVkaWNhdGVkIGRldmljZSBtZW1vcnkgZXhjbHVkaW5nIEZJRk8gKi8KKyAgIFNWR0FfUkVHX1RPUCA9IDQ4LCAgICAgICAgICAgICAgIC8qIE11c3QgYmUgMSBtb3JlIHRoYW4gdGhlIGxhc3QgcmVnaXN0ZXIgKi8KIAogICAgU1ZHQV9QQUxFVFRFX0JBU0UgPSAxMDI0LCAgICAgICAgLyogQmFzZSBvZiBTVkdBIGNvbG9yIG1hcCAqLwogICAgLyogTmV4dCA3NjggKD09IDI1NiozKSByZWdpc3RlcnMgZXhpc3QgZm9yIGNvbG9ybWFwICovCkBAIC0yNjUsNyArMjc2LDcgQEAKICAqIHBvc3NpYmxlLgogICovCiAjZGVmaW5lIFNWR0FfR01SX05VTEwgICAgICAgICAoKHVpbnQzMikgLTEpCi0jZGVmaW5lIFNWR0FfR01SX0ZSQU1FQlVGRkVSICAoKHVpbnQzMikgLTIpICAvLyBHdWVzdCBGcmFtZWJ1ZmZlciAoR0ZCKQorI2RlZmluZSBTVkdBX0dNUl9GUkFNRUJVRkZFUiAgKCh1aW50MzIpIC0yKSAgLyogR3Vlc3QgRnJhbWVidWZmZXIgKEdGQikgKi8KIAogdHlwZWRlZgogc3RydWN0IFNWR0FHdWVzdE1lbURlc2NyaXB0b3IgewpAQCAtMzA2LDEzICszMTcsMzUgQEAKICAgICAgIHN0cnVjdCB7CiAgICAgICAgICB1aW50MzIgYml0c1BlclBpeGVsIDogODsKICAgICAgICAgIHVpbnQzMiBjb2xvckRlcHRoICAgOiA4OwotICAgICAgICAgdWludDMyIHJlc2VydmVkICAgICA6IDE2OyAgLy8gTXVzdCBiZSB6ZXJvCisgICAgICAgICB1aW50MzIgcmVzZXJ2ZWQgICAgIDogMTY7ICAvKiBNdXN0IGJlIHplcm8gKi8KICAgICAgIH07CiAKICAgICAgIHVpbnQzMiB2YWx1ZTsKICAgIH07CiB9IFNWR0FHTVJJbWFnZUZvcm1hdDsKIAordHlwZWRlZgorc3RydWN0IFNWR0FHdWVzdEltYWdlIHsKKyAgIFNWR0FHdWVzdFB0ciAgICAgICAgIHB0cjsKKworICAgLyoKKyAgICAqIEEgbm90ZSBvbiBpbnRlcnByZXRhdGlvbiBvZiBwaXRjaDogVGhpcyB2YWx1ZSBvZiBwaXRjaCBpcyB0aGUKKyAgICAqIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHZlcnRpY2FsbHkgYWRqYWNlbnQgaW1hZ2UKKyAgICAqIGJsb2Nrcy4gTm9ybWFsbHkgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gdGhlIGZpcnN0CisgICAgKiBwaXhlbCBvZiB0d28gYWRqYWNlbnQgc2NhbmxpbmVzLiBXaXRoIGNvbXByZXNzZWQgdGV4dHVyZXMsCisgICAgKiBob3dldmVyLCB0aGlzIG1heSByZXByZXNlbnQgdGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuCisgICAgKiBjb21wcmVzc2lvbiBibG9ja3MgcmF0aGVyIHRoYW4gYmV0d2VlbiByb3dzIG9mIHBpeGVscy4KKyAgICAqCisgICAgKiBYWFg6IENvbXByZXNzZWQgdGV4dHVyZXMgY3VycmVudGx5IG11c3QgYmUgdGlnaHRseSBwYWNrZWQgaW4gZ3Vlc3QgbWVtb3J5LgorICAgICoKKyAgICAqIElmIHRoZSBpbWFnZSBpcyAxLWRpbWVuc2lvbmFsLCBwaXRjaCBpcyBpZ25vcmVkLgorICAgICoKKyAgICAqIElmICdwaXRjaCcgaXMgemVybywgdGhlIFNWR0EzRCBkZXZpY2UgY2FsY3VsYXRlcyBhIHBpdGNoIHZhbHVlCisgICAgKiBhc3N1bWluZyBlYWNoIHJvdyBvZiBibG9ja3MgaXMgdGlnaHRseSBwYWNrZWQuCisgICAgKi8KKyAgIHVpbnQzMiBwaXRjaDsKK30gU1ZHQUd1ZXN0SW1hZ2U7CisKIC8qCiAgKiBTVkdBQ29sb3JCR1JYIC0tCiAgKgpAQCAtMzI4LDcgKzM2MSw3IEBACiAgICAgICAgICB1aW50MzIgYiA6IDg7CiAgICAgICAgICB1aW50MzIgZyA6IDg7CiAgICAgICAgICB1aW50MzIgciA6IDg7Ci0gICAgICAgICB1aW50MzIgeCA6IDg7ICAvLyBVbnVzZWQKKyAgICAgICAgIHVpbnQzMiB4IDogODsgIC8qIFVudXNlZCAqLwogICAgICAgfTsKIAogICAgICAgdWludDMyIHZhbHVlOwpAQCAtMzcwLDIzICs0MDMsMzQgQEAKICAqICBOb3RlIHRoZSBob2xlcyBpbiB0aGUgYml0ZmllbGQuIE1pc3NpbmcgYml0cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCwKICAqICBhbmQgbXVzdCBub3QgYmUgcmV1c2VkLiBUaG9zZSBjYXBhYmlsaXRpZXMgd2lsbCBuZXZlciBiZSByZXBvcnRlZAogICogIGJ5IG5ldyB2ZXJzaW9ucyBvZiB0aGUgU1ZHQSBkZXZpY2UuCisgKgorICogU1ZHQV9DQVBfR01SMiAtLQorICogICAgUHJvdmlkZXMgYXN5bmNocm9ub3VzIGNvbW1hbmRzIHRvIGRlZmluZSBhbmQgcmVtYXAgZ3Vlc3QgbWVtb3J5CisgKiAgICByZWdpb25zLiAgQWRkcyBkZXZpY2UgcmVnaXN0ZXJzIFNWR0FfUkVHX0dNUlNfTUFYX1BBR0VTIGFuZAorICogICAgU1ZHQV9SRUdfTUVNT1JZX1NJWkUuCisgKgorICogU1ZHQV9DQVBfU0NSRUVOX09CSkVDVF8yIC0tCisgKiAgICBBbGxvdyBzY3JlZW4gb2JqZWN0IHN1cHBvcnQsIGFuZCByZXF1aXJlIGJhY2tpbmcgc3RvcmVzIGZyb20gdGhlCisgKiAgICBndWVzdCBmb3IgZWFjaCBzY3JlZW4gb2JqZWN0LgogICovCiAKICNkZWZpbmUgU1ZHQV9DQVBfTk9ORSAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKICNkZWZpbmUgU1ZHQV9DQVBfUkVDVF9DT1BZICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgU1ZHQV9DQVBfQ1VSU09SICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1ZHQV9DQVBfQ1VSU09SX0JZUEFTUyAgICAgIDB4MDAwMDAwNDAgICAvLyBMZWdhY3kgKFVzZSBDdXJzb3IgQnlwYXNzIDMgaW5zdGVhZCkKLSNkZWZpbmUgU1ZHQV9DQVBfQ1VSU09SX0JZUEFTU18yICAgIDB4MDAwMDAwODAgICAvLyBMZWdhY3kgKFVzZSBDdXJzb3IgQnlwYXNzIDMgaW5zdGVhZCkKKyNkZWZpbmUgU1ZHQV9DQVBfQ1VSU09SX0JZUEFTUyAgICAgIDB4MDAwMDAwNDAgICAvKiBMZWdhY3kgKFVzZSBDdXJzb3IgQnlwYXNzIDMgaW5zdGVhZCkgKi8KKyNkZWZpbmUgU1ZHQV9DQVBfQ1VSU09SX0JZUEFTU18yICAgIDB4MDAwMDAwODAgICAvKiBMZWdhY3kgKFVzZSBDdXJzb3IgQnlwYXNzIDMgaW5zdGVhZCkgKi8KICNkZWZpbmUgU1ZHQV9DQVBfOEJJVF9FTVVMQVRJT04gICAgIDB4MDAwMDAxMDAKICNkZWZpbmUgU1ZHQV9DQVBfQUxQSEFfQ1VSU09SICAgICAgIDB4MDAwMDAyMDAKICNkZWZpbmUgU1ZHQV9DQVBfM0QgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKICNkZWZpbmUgU1ZHQV9DQVBfRVhURU5ERURfRklGTyAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgU1ZHQV9DQVBfTVVMVElNT04gICAgICAgICAgIDB4MDAwMTAwMDAgICAvLyBMZWdhY3kgbXVsdGktbW9uaXRvciBzdXBwb3J0CisjZGVmaW5lIFNWR0FfQ0FQX01VTFRJTU9OICAgICAgICAgICAweDAwMDEwMDAwICAgLyogTGVnYWN5IG11bHRpLW1vbml0b3Igc3VwcG9ydCAqLwogI2RlZmluZSBTVkdBX0NBUF9QSVRDSExPQ0sgICAgICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSBTVkdBX0NBUF9JUlFNQVNLICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBTVkdBX0NBUF9ESVNQTEFZX1RPUE9MT0dZICAgMHgwMDA4MDAwMCAgIC8vIExlZ2FjeSBtdWx0aS1tb25pdG9yIHN1cHBvcnQKKyNkZWZpbmUgU1ZHQV9DQVBfRElTUExBWV9UT1BPTE9HWSAgIDB4MDAwODAwMDAgICAvKiBMZWdhY3kgbXVsdGktbW9uaXRvciBzdXBwb3J0ICovCiAjZGVmaW5lIFNWR0FfQ0FQX0dNUiAgICAgICAgICAgICAgICAweDAwMTAwMDAwCiAjZGVmaW5lIFNWR0FfQ0FQX1RSQUNFUyAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNWR0FfQ0FQX0dNUjIgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIFNWR0FfQ0FQX1NDUkVFTl9PQkpFQ1RfMiAgICAweDAwODAwMDAwCiAKIAogLyoKQEAgLTQzMSw3ICs0NzUsNyBAQAogCiAgICBTVkdBX0ZJRk9fQ0FQQUJJTElUSUVTID0gNCwKICAgIFNWR0FfRklGT19GTEFHUywKLSAgIC8vIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9GRU5DRToKKyAgIC8qIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9GRU5DRTogKi8KICAgIFNWR0FfRklGT19GRU5DRSwKIAogICAgLyoKQEAgLTQ0NCwzMyArNDg4LDQ3IEBACiAgICAgKiBleHRlbmRlZCBGSUZPLgogICAgICovCiAKLSAgIC8vIFZhbGlkIGlmIGV4aXN0cyAoaS5lLiBpZiBleHRlbmRlZCBGSUZPIGVuYWJsZWQpOgorICAgLyogVmFsaWQgaWYgZXhpc3RzIChpLmUuIGlmIGV4dGVuZGVkIEZJRk8gZW5hYmxlZCk6ICovCiAgICBTVkdBX0ZJRk9fM0RfSFdWRVJTSU9OLCAgICAgICAvKiBTZWUgU1ZHQTNkSGFyZHdhcmVWZXJzaW9uIGluIHN2Z2EzZF9yZWcuaCAqLwotICAgLy8gVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1BJVENITE9DSzoKKyAgIC8qIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9QSVRDSExPQ0s6ICovCiAgICBTVkdBX0ZJRk9fUElUQ0hMT0NLLAogCi0gICAvLyBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfQ1VSU09SX0JZUEFTU18zOgorICAgLyogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX0NVUlNPUl9CWVBBU1NfMzogKi8KICAgIFNWR0FfRklGT19DVVJTT1JfT04sICAgICAgICAgIC8qIEN1cnNvciBieXBhc3MgMyBzaG93L2hpZGUgcmVnaXN0ZXIgKi8KICAgIFNWR0FfRklGT19DVVJTT1JfWCwgICAgICAgICAgIC8qIEN1cnNvciBieXBhc3MgMyB4IHJlZ2lzdGVyICovCiAgICBTVkdBX0ZJRk9fQ1VSU09SX1ksICAgICAgICAgICAvKiBDdXJzb3IgYnlwYXNzIDMgeSByZWdpc3RlciAqLwogICAgU1ZHQV9GSUZPX0NVUlNPUl9DT1VOVCwgICAgICAgLyogSW5jcmVtZW50ZWQgd2hlbiBhbnkgb2YgdGhlIG90aGVyIDMgY2hhbmdlICovCiAgICBTVkdBX0ZJRk9fQ1VSU09SX0xBU1RfVVBEQVRFRCwvKiBMYXN0IHRpbWUgdGhlIGhvc3QgdXBkYXRlZCB0aGUgY3Vyc29yICovCiAKLSAgIC8vIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9SRVNFUlZFOgorICAgLyogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1JFU0VSVkU6ICovCiAgICBTVkdBX0ZJRk9fUkVTRVJWRUQsICAgICAgICAgICAvKiBCeXRlcyBwYXN0IE5FWFRfQ01EIHdpdGggcmVhbCBjb250ZW50cyAqLwogCiAgICAvKgotICAgICogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1Q6CisgICAgKiBWYWxpZCB3aXRoIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMjoKICAgICAqCiAgICAgKiBCeSBkZWZhdWx0IHRoaXMgaXMgU1ZHQV9JRF9JTlZBTElELCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJzb3IKICAgICAqIGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIHZpcnR1YWwgcm9vdC4gSWYgdGhpcwogICAgICogaXMgc2V0IHRvIGEgc3BlY2lmaWMgc2NyZWVuIElELCBjdXJzb3IgcG9zaXRpb24gaXMgcmVpbnRlcnByZXRlZAotICAgICogYXMgYSBzaWduZWQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoYXQgc2NyZWVuJ3Mgb3JpZ2luLiBUaGlzIGlzIHRoZQotICAgICogb25seSB3YXkgdG8gcGxhY2UgdGhlIGN1cnNvciBvbiBhIG5vbi1yb290ZWQgc2NyZWVuLgorICAgICogYXMgYSBzaWduZWQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoYXQgc2NyZWVuJ3Mgb3JpZ2luLgogICAgICovCiAgICBTVkdBX0ZJRk9fQ1VSU09SX1NDUkVFTl9JRCwKIAogICAgLyoKKyAgICAqIFZhbGlkIHdpdGggU1ZHQV9GSUZPX0NBUF9ERUFECisgICAgKgorICAgICogQW4gYXJiaXRyYXJ5IHZhbHVlIHdyaXR0ZW4gYnkgdGhlIGhvc3QsIGRyaXZlcnMgc2hvdWxkIG5vdCB1c2UgaXQuCisgICAgKi8KKyAgIFNWR0FfRklGT19ERUFELAorCisgICAvKgorICAgICogVmFsaWQgd2l0aCBTVkdBX0ZJRk9fQ0FQXzNEX0hXVkVSU0lPTl9SRVZJU0VEOgorICAgICoKKyAgICAqIENvbnRhaW5zIDNEIEhXVkVSU0lPTiAoc2VlIFNWR0EzZEhhcmR3YXJlVmVyc2lvbiBpbiBzdmdhM2RfcmVnLmgpCisgICAgKiBvbiBwbGF0Zm9ybXMgdGhhdCBjYW4gZW5mb3JjZSBncmFwaGljcyByZXNvdXJjZSBsaW1pdHMuCisgICAgKi8KKyAgIFNWR0FfRklGT18zRF9IV1ZFUlNJT05fUkVWSVNFRCwKKworICAgLyoKICAgICAqIFhYWDogVGhlIGdhcCBoZXJlLCB1cCB1bnRpbCBTVkdBX0ZJRk9fM0RfQ0FQUywgY2FuIGJlIHVzZWQgZm9yIG5ldwogICAgICogcmVnaXN0ZXJzLCBidXQgdGhpcyBtdXN0IGJlIGRvbmUgY2FyZWZ1bGx5IGFuZCB3aXRoIGp1ZGljaW91cyB1c2Ugb2YKICAgICAqIGNhcGFiaWxpdHkgYml0cywgc2luY2UgY29tcGFyaXNvbnMgYmFzZWQgb24gU1ZHQV9GSUZPX01JTiBhcmVuJ3QKQEAgLTUwOCw3ICs1NjYsNyBAQAogICAgICogc2V0cyBTVkdBX0ZJRk9fTUlOIGhpZ2ggZW5vdWdoIHRvIGxlYXZlIHJvb20gZm9yIHRoZW0uCiAgICAgKi8KIAotICAgLy8gVmFsaWQgaWYgcmVnaXN0ZXIgZXhpc3RzOgorICAgLyogVmFsaWQgaWYgcmVnaXN0ZXIgZXhpc3RzOiAqLwogICAgU1ZHQV9GSUZPX0dVRVNUXzNEX0hXVkVSU0lPTiwgLyogR3Vlc3QgZHJpdmVyJ3MgM0QgdmVyc2lvbiAqLwogICAgU1ZHQV9GSUZPX0ZFTkNFX0dPQUwsICAgICAgICAgLyogTWF0Y2hpbmcgdGFyZ2V0IGZvciBTVkdBX0lSUUZMQUdfRkVOQ0VfR09BTCAqLwogICAgU1ZHQV9GSUZPX0JVU1ksICAgICAgICAgICAgICAgLyogU2VlICJGSUZPIFN5bmNocm9uaXphdGlvbiBSZWdpc3RlcnMiICovCkBAIC03MDksNiArNzY3LDM3IEBACiAgKgogICogICAgICAgLSBXaGVuIGEgc2NyZWVuIGlzIHJlc2l6ZWQsIGVpdGhlciB1c2luZyBTY3JlZW4gT2JqZWN0IGNvbW1hbmRzIG9yCiAgKiAgICAgICAgIGxlZ2FjeSBtdWx0aW1vbiByZWdpc3RlcnMsIGl0cyBjb250ZW50cyBhcmUgcHJlc2VydmVkLgorICoKKyAqIFNWR0FfRklGT19DQVBfR01SMiAtLQorICoKKyAqICAgIFByb3ZpZGVzIG5ldyBjb21tYW5kcyB0byBkZWZpbmUgYW5kIHJlbWFwIGd1ZXN0IG1lbW9yeSByZWdpb25zIChHTVIpLgorICoKKyAqICAgIE5ldyAyRCBjb21tYW5kczoKKyAqICAgICAgIERFRklORV9HTVIyLCBSRU1BUF9HTVIyLgorICoKKyAqIFNWR0FfRklGT19DQVBfM0RfSFdWRVJTSU9OX1JFVklTRUQgLS0KKyAqCisgKiAgICBJbmRpY2F0ZXMgbmV3IHJlZ2lzdGVyIFNWR0FfRklGT18zRF9IV1ZFUlNJT05fUkVWSVNFRCBleGlzdHMuCisgKiAgICBUaGlzIHJlZ2lzdGVyIG1heSByZXBsYWNlIFNWR0FfRklGT18zRF9IV1ZFUlNJT04gb24gcGxhdGZvcm1zCisgKiAgICB0aGF0IGVuZm9yY2UgZ3JhcGhpY3MgcmVzb3VyY2UgbGltaXRzLiAgVGhpcyBhbGxvd3MgdGhlIHBsYXRmb3JtCisgKiAgICB0byBjbGVhciBTVkdBX0ZJRk9fM0RfSFdWRVJTSU9OIGFuZCBkaXNhYmxlIDNEIGluIGxlZ2FjeSBndWVzdAorICogICAgZHJpdmVycyB0aGF0IGRvIG5vdCBsaW1pdCB0aGVpciByZXNvdXJjZXMuCisgKgorICogICAgTm90ZSB0aGlzIGlzIGFuIGFsaWFzIHRvIFNWR0FfRklGT19DQVBfR01SMiBiZWNhdXNlIHRoZXNlIGluZGljYXRvcnMKKyAqICAgIGFyZSBjb2RlcGVuZGVudCAoYW5kIHRodXMgd2UgdXNlIGEgc2luZ2xlIGNhcGFiaWxpdHkgYml0KS4KKyAqCisgKiBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMiAtLQorICoKKyAqICAgIE1vZGlmaWVzIHRoZSBERUZJTkVfU0NSRUVOIGNvbW1hbmQgdG8gaW5jbHVkZSBhIGd1ZXN0IHByb3ZpZGVkCisgKiAgICBiYWNraW5nIHN0b3JlIGluIEdNUiBtZW1vcnkgYW5kIHRoZSBieXRlc1BlckxpbmUgZm9yIHRoZSBiYWNraW5nCisgKiAgICBzdG9yZS4gIFRoaXMgY2FwYWJpbGl0eSByZXF1aXJlcyB0aGUgdXNlIG9mIGEgYmFja2luZyBzdG9yZSB3aGVuCisgKiAgICBjcmVhdGluZyBzY3JlZW4gb2JqZWN0cy4gIEhvd2V2ZXIgaWYgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUCisgKiAgICBpcyBwcmVzZW50IHRoZW4gYmFja2luZyBzdG9yZXMgYXJlIG9wdGlvbmFsLgorICoKKyAqIFNWR0FfRklGT19DQVBfREVBRCAtLQorICoKKyAqICAgIERyaXZlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcyBjYXAgYml0LiAgVGhpcyBjYXAgYml0IGNhbiBub3QgYmUKKyAqICAgIHJldXNlZCBzaW5jZSBzb21lIGhvc3RzIGFscmVhZHkgZXhwb3NlIGl0LgogICovCiAKICNkZWZpbmUgU1ZHQV9GSUZPX0NBUF9OT05FICAgICAgICAgICAgICAgICAgMApAQCAtNzIwLDYgKzgwOSwxMCBAQAogI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX0VTQ0FQRSAgICAgICAgICAgICgxPDw1KQogI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX1JFU0VSVkUgICAgICAgICAgICgxPDw2KQogI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QgICAgICgxPDw3KQorI2RlZmluZSBTVkdBX0ZJRk9fQ0FQX0dNUjIgICAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBTVkdBX0ZJRk9fQ0FQXzNEX0hXVkVSU0lPTl9SRVZJU0VEICBTVkdBX0ZJRk9fQ0FQX0dNUjIKKyNkZWZpbmUgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIgICAoMTw8OSkKKyNkZWZpbmUgU1ZHQV9GSUZPX0NBUF9ERUFEICAgICAgICAgICAgICAoMTw8MTApCiAKIAogLyoKQEAgLTczMCw3ICs4MjMsNyBAQAogCiAjZGVmaW5lIFNWR0FfRklGT19GTEFHX05PTkUgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgU1ZHQV9GSUZPX0ZMQUdfQUNDRUxGUk9OVCAgICAgICAoMTw8MCkKLSNkZWZpbmUgU1ZHQV9GSUZPX0ZMQUdfUkVTRVJWRUQgICAgICAgICgxPDwzMSkgLy8gSW50ZXJuYWwgdXNlIG9ubHkKKyNkZWZpbmUgU1ZHQV9GSUZPX0ZMQUdfUkVTRVJWRUQgICAgICAgICgxPDwzMSkgLyogSW50ZXJuYWwgdXNlIG9ubHkgKi8KIAogLyoKICAqIEZJRk8gcmVzZXJ2YXRpb24gc2VudGluZWwgdmFsdWUKQEAgLTc2MywyMiArODU2LDIyIEBACiAgICBTVkdBX1ZJREVPX0RBVEFfT0ZGU0VULAogICAgU1ZHQV9WSURFT19GT1JNQVQsCiAgICBTVkdBX1ZJREVPX0NPTE9SS0VZLAotICAgU1ZHQV9WSURFT19TSVpFLCAgICAgICAgICAvLyBEZXByZWNhdGVkCisgICBTVkdBX1ZJREVPX1NJWkUsICAgICAgICAgIC8qIERlcHJlY2F0ZWQgKi8KICAgIFNWR0FfVklERU9fV0lEVEgsCiAgICBTVkdBX1ZJREVPX0hFSUdIVCwKICAgIFNWR0FfVklERU9fU1JDX1gsCiAgICBTVkdBX1ZJREVPX1NSQ19ZLAogICAgU1ZHQV9WSURFT19TUkNfV0lEVEgsCiAgICBTVkdBX1ZJREVPX1NSQ19IRUlHSFQsCi0gICBTVkdBX1ZJREVPX0RTVF9YLCAgICAgICAgIC8vIFNpZ25lZCBpbnQzMgotICAgU1ZHQV9WSURFT19EU1RfWSwgICAgICAgICAvLyBTaWduZWQgaW50MzIKKyAgIFNWR0FfVklERU9fRFNUX1gsICAgICAgICAgLyogU2lnbmVkIGludDMyICovCisgICBTVkdBX1ZJREVPX0RTVF9ZLCAgICAgICAgIC8qIFNpZ25lZCBpbnQzMiAqLwogICAgU1ZHQV9WSURFT19EU1RfV0lEVEgsCiAgICBTVkdBX1ZJREVPX0RTVF9IRUlHSFQsCiAgICBTVkdBX1ZJREVPX1BJVENIXzEsCiAgICBTVkdBX1ZJREVPX1BJVENIXzIsCiAgICBTVkdBX1ZJREVPX1BJVENIXzMsCi0gICBTVkdBX1ZJREVPX0RBVEFfR01SSUQsICAgIC8vIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBTVkdBX0dNUl9GUkFNRUJVRkZFUgotICAgU1ZHQV9WSURFT19EU1RfU0NSRUVOX0lELCAvLyBPcHRpb25hbCwgZGVmYXVsdHMgdG8gdmlydHVhbCBjb29yZHMgKFNWR0FfSURfSU5WQUxJRCkKKyAgIFNWR0FfVklERU9fREFUQV9HTVJJRCwgICAgLyogT3B0aW9uYWwsIGRlZmF1bHRzIHRvIFNWR0FfR01SX0ZSQU1FQlVGRkVSICovCisgICBTVkdBX1ZJREVPX0RTVF9TQ1JFRU5fSUQsIC8qIE9wdGlvbmFsLCBkZWZhdWx0cyB0byB2aXJ0dWFsIGNvb3JkcyAoU1ZHQV9JRF9JTlZBTElEKSAqLwogICAgU1ZHQV9WSURFT19OVU1fUkVHUwogfTsKIApAQCAtODI5LDE1ICs5MjIsNTEgQEAKICAqICAgIGNvbXBhdGliaWxpdHkuIE5ldyBmbGFncyBjYW4gYmUgYWRkZWQsIGFuZCB0aGUgc3RydWN0IG1heSBncm93LAogICogICAgYnV0IGV4aXN0aW5nIGZpZWxkcyBtdXN0IHJldGFpbiB0aGVpciBtZWFuaW5nLgogICoKKyAqICAgIEFkZGVkIHdpdGggU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIgYXJlIHJlcXVpcmVkIGZpZWxkcyBvZgorICogICAgYSBTVkdBR3Vlc3RQdHIgdGhhdCBpcyB1c2VkIHRvIGJhY2sgdGhlIHNjcmVlbiBjb250ZW50cy4gIFRoaXMKKyAqICAgIG1lbW9yeSBtdXN0IGNvbWUgZnJvbSB0aGUgR0ZCLiAgVGhlIGd1ZXN0IGlzIG5vdCBhbGxvd2VkIHRvCisgKiAgICBhY2Nlc3MgdGhlIG1lbW9yeSBhbmQgZG9pbmcgc28gd2lsbCBoYXZlIHVuZGVmaW5lZCByZXN1bHRzLiAgVGhlCisgKiAgICBiYWNraW5nIHN0b3JlIGlzIHJlcXVpcmVkIHRvIGJlIHBhZ2UgYWxpZ25lZCBhbmQgdGhlIHNpemUgaXMKKyAqICAgIHBhZGRlZCB0byB0aGUgbmV4dCBwYWdlIGJvdW5kcnkuICBUaGUgbnVtYmVyIG9mIHBhZ2VzIGlzOgorICogICAgICAgKGJ5dGVzUGVyTGluZSAqIHNpemUud2lkdGggKiA0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkUKKyAqCisgKiAgICBUaGUgcGl0Y2ggaW4gdGhlIGJhY2tpbmdTdG9yZSBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCBsYXJnZQorICogICAgZW5vdWdoIHRvIGhvbGQgYSAzMmJicCBzY2FubGluZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlCisgKiAgICBkcml2ZXIgcGFkIGJ5dGVzUGVyTGluZSBmb3IgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ugd2luLgorICoKKyAqICAgIFRoZSBjbG9uZUNvdW50IGZpZWxkIGlzIHRyZWF0ZWQgYXMgYSBoaW50IGZyb20gdGhlIGd1ZXN0IHRoYXQKKyAqICAgIHRoZSB1c2VyIHdhbnRzIHRoaXMgZGlzcGxheSB0byBiZSBjbG9uZWQsIGNvdW50Q291bnQgdGltZXMuICBBCisgKiAgICB2YWx1ZSBvZiB6ZXJvIG1lYW5zIG5vIGNsb25pbmcgc2hvdWxkIGhhcHBlbi4KICAqLwogCi0jZGVmaW5lIFNWR0FfU0NSRUVOX0hBU19ST09UICAgICgxIDw8IDApICAvLyBTY3JlZW4gaXMgcHJlc2VudCBpbiB0aGUgdmlydHVhbCBjb29yZCBzcGFjZQotI2RlZmluZSBTVkdBX1NDUkVFTl9JU19QUklNQVJZICAoMSA8PCAxKSAgLy8gR3Vlc3QgY29uc2lkZXJzIHRoaXMgc2NyZWVuIHRvIGJlICdwcmltYXJ5JwotI2RlZmluZSBTVkdBX1NDUkVFTl9GVUxMU0NSRUVOX0hJTlQgKDEgPDwgMikgICAvLyBHdWVzdCBpcyBydW5uaW5nIGEgZnVsbHNjcmVlbiBhcHAgaGVyZQorI2RlZmluZSBTVkdBX1NDUkVFTl9NVVNUX0JFX1NFVCAgICAgKDEgPDwgMCkgLyogTXVzdCBiZSBzZXQgb3IgcmVzdWx0cyB1bmRlZmluZWQgKi8KKyNkZWZpbmUgU1ZHQV9TQ1JFRU5fSEFTX1JPT1QgU1ZHQV9TQ1JFRU5fTVVTVF9CRV9TRVQgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBTVkdBX1NDUkVFTl9JU19QUklNQVJZICAgICAgKDEgPDwgMSkgLyogR3Vlc3QgY29uc2lkZXJzIHRoaXMgc2NyZWVuIHRvIGJlICdwcmltYXJ5JyAqLworI2RlZmluZSBTVkdBX1NDUkVFTl9GVUxMU0NSRUVOX0hJTlQgKDEgPDwgMikgLyogR3Vlc3QgaXMgcnVubmluZyBhIGZ1bGxzY3JlZW4gYXBwIGhlcmUgKi8KKworLyoKKyAqIEFkZGVkIHdpdGggU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIuICBXaGVuIHRoZSBzY3JlZW4gaXMKKyAqIGRlYWN0aXZhdGVkIHRoZSBiYXNlIGxheWVyIGlzIGRlZmluZWQgdG8gbG9zZSBhbGwgY29udGVudHMgYW5kCisgKiBiZWNvbWUgYmxhY2suICBXaGVuIGEgc2NyZWVuIGlzIGRlYWN0aXZhdGVkIHRoZSBiYWNraW5nIHN0b3JlIGlzCisgKiBvcHRpb25hbC4gIFdoZW4gc2V0IGJhY2tpbmdQdHIgYW5kIGJ5dGVzUGVyTGluZSB3aWxsIGJlIGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgU1ZHQV9TQ1JFRU5fREVBQ1RJVkFURSAgKDEgPDwgMykKKworLyoKKyAqIEFkZGVkIHdpdGggU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIuICBXaGVuIHRoaXMgZmxhZyBpcyBzZXQKKyAqIHRoZSBzY3JlZW4gY29udGVudHMgd2lsbCBiZSBvdXRwdXR0ZWQgYXMgYWxsIGJsYWNrIHRvIHRoZSB1c2VyCisgKiB0aG91Z2ggdGhlIGJhc2UgbGF5ZXIgY29udGVudHMgaXMgcHJlc2VydmVkLiAgVGhlIHNjcmVlbiBiYXNlIGxheWVyCisgKiBjYW4gc3RpbGwgYmUgcmVhZCBhbmQgd3JpdHRlbiB0byBsaWtlIG5vcm1hbCB0aG91Z2ggdGhlIG5vIHZpc2libGUKKyAqIGVmZmVjdCB3aWxsIGJlIHNlZW4gYnkgdGhlIHVzZXIuICBXaGVuIHRoZSBmbGFnIGlzIGNoYW5nZWQgdGhlCisgKiBzY3JlZW4gd2lsbCBiZSBibGFua2VkIG9yIHJlZHJhd24gdG8gdGhlIGN1cnJlbnQgY29udGVudHMgYXMgbmVlZGVkCisgKiB3aXRob3V0IGFueSBleHRyYSBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIuICBUaGlzIGZsYWcgb25seSBoYXMgYW4KKyAqIGVmZmVjdCB3aGVuIHRoZSBzY3JlZW4gaXMgbm90IGRlYWN0aXZhdGVkLgorICovCisjZGVmaW5lIFNWR0FfU0NSRUVOX0JMQU5LSU5HICgxIDw8IDQpCiAKIHR5cGVkZWYKIHN0cnVjdCBTVkdBU2NyZWVuT2JqZWN0IHsKLSAgIHVpbnQzMiBzdHJ1Y3RTaXplOyAgIC8vIHNpemVvZihTVkdBU2NyZWVuT2JqZWN0KQorICAgdWludDMyIHN0cnVjdFNpemU7ICAgLyogc2l6ZW9mKFNWR0FTY3JlZW5PYmplY3QpICovCiAgICB1aW50MzIgaWQ7CiAgICB1aW50MzIgZmxhZ3M7CiAgICBzdHJ1Y3QgewpAQCAtODQ3LDcgKzk3NiwxNCBAQAogICAgc3RydWN0IHsKICAgICAgIGludDMyIHg7CiAgICAgICBpbnQzMiB5OwotICAgfSByb290OyAgICAgICAgICAgICAgLy8gT25seSB1c2VkIGlmIFNWR0FfU0NSRUVOX0hBU19ST09UIGlzIHNldC4KKyAgIH0gcm9vdDsKKworICAgLyoKKyAgICAqIEFkZGVkIGFuZCByZXF1aXJlZCBieSBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMiwgb3B0aW9uYWwKKyAgICAqIHdpdGggU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNULgorICAgICovCisgICBTVkdBR3Vlc3RJbWFnZSBiYWNraW5nU3RvcmU7CisgICB1aW50MzIgY2xvbmVDb3VudDsKIH0gU1ZHQVNjcmVlbk9iamVjdDsKIAogCkBAIC04ODUsNiArMTAyMSw4IEBACiAgICBTVkdBX0NNRF9CTElUX1NDUkVFTl9UT19HTVJGQiAgPSAzOCwKICAgIFNWR0FfQ01EX0FOTk9UQVRJT05fRklMTCAgICAgICA9IDM5LAogICAgU1ZHQV9DTURfQU5OT1RBVElPTl9DT1BZICAgICAgID0gNDAsCisgICBTVkdBX0NNRF9ERUZJTkVfR01SMiAgICAgICAgICAgPSA0MSwKKyAgIFNWR0FfQ01EX1JFTUFQX0dNUjIgICAgICAgICAgICA9IDQyLAogICAgU1ZHQV9DTURfTUFYCiB9IFNWR0FGaWZvQ21kSWQ7CiAKQEAgLTkyMCw3ICsxMDU4LDcgQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3Qgeworc3RydWN0IFNWR0FGaWZvQ21kVXBkYXRlIHsKICAgIHVpbnQzMiB4OwogICAgdWludDMyIHk7CiAgICB1aW50MzIgd2lkdGg7CkBAIC05MzksNyArMTA3Nyw3IEBACiAgKi8KIAogdHlwZWRlZgotc3RydWN0IHsKK3N0cnVjdCBTVkdBRmlmb0NtZFJlY3RDb3B5IHsKICAgIHVpbnQzMiBzcmNYOwogICAgdWludDMyIHNyY1k7CiAgICB1aW50MzIgZGVzdFg7CkBAIC05NjMsMTQgKzExMDEsMTQgQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3QgewotICAgdWludDMyIGlkOyAgICAgICAgICAgICAvLyBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgorc3RydWN0IFNWR0FGaWZvQ21kRGVmaW5lQ3Vyc29yIHsKKyAgIHVpbnQzMiBpZDsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4gKi8KICAgIHVpbnQzMiBob3RzcG90WDsKICAgIHVpbnQzMiBob3RzcG90WTsKICAgIHVpbnQzMiB3aWR0aDsKICAgIHVpbnQzMiBoZWlnaHQ7Ci0gICB1aW50MzIgYW5kTWFza0RlcHRoOyAgIC8vIFZhbHVlIG11c3QgYmUgMSBvciBlcXVhbCB0byBCSVRTX1BFUl9QSVhFTAotICAgdWludDMyIHhvck1hc2tEZXB0aDsgICAvLyBWYWx1ZSBtdXN0IGJlIDEgb3IgZXF1YWwgdG8gQklUU19QRVJfUElYRUwKKyAgIHVpbnQzMiBhbmRNYXNrRGVwdGg7ICAgLyogVmFsdWUgbXVzdCBiZSAxIG9yIGVxdWFsIHRvIEJJVFNfUEVSX1BJWEVMICovCisgICB1aW50MzIgeG9yTWFza0RlcHRoOyAgIC8qIFZhbHVlIG11c3QgYmUgMSBvciBlcXVhbCB0byBCSVRTX1BFUl9QSVhFTCAqLwogICAgLyoKICAgICAqIEZvbGxvd2VkIGJ5IHNjYW5saW5lIGRhdGEgZm9yIEFORCBtYXNrLCB0aGVuIFhPUiBtYXNrLgogICAgICogRWFjaCBzY2FubGluZSBpcyBwYWRkZWQgdG8gYSAzMi1iaXQgYm91bmRhcnkuCkBAIC05OTIsOCArMTEzMCw4IEBACiAgKi8KIAogdHlwZWRlZgotc3RydWN0IHsKLSAgIHVpbnQzMiBpZDsgICAgICAgICAgICAgLy8gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KK3N0cnVjdCBTVkdBRmlmb0NtZERlZmluZUFscGhhQ3Vyc29yIHsKKyAgIHVpbnQzMiBpZDsgICAgICAgICAgICAgLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4gKi8KICAgIHVpbnQzMiBob3RzcG90WDsKICAgIHVpbnQzMiBob3RzcG90WTsKICAgIHVpbnQzMiB3aWR0aDsKQEAgLTEwMTUsNyArMTE1Myw3IEBACiAgKi8KIAogdHlwZWRlZgotc3RydWN0IHsKK3N0cnVjdCBTVkdBRmlmb0NtZFVwZGF0ZVZlcmJvc2UgewogICAgdWludDMyIHg7CiAgICB1aW50MzIgeTsKICAgIHVpbnQzMiB3aWR0aDsKQEAgLTEwNDAsMTMgKzExNzgsMTMgQEAKICNkZWZpbmUgIFNWR0FfUk9QX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4MDMKIAogdHlwZWRlZgotc3RydWN0IHsKLSAgIHVpbnQzMiBjb2xvcjsgICAgIC8vIEluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgR0ZCCitzdHJ1Y3QgU1ZHQUZpZm9DbWRGcm9udFJvcEZpbGwgeworICAgdWludDMyIGNvbG9yOyAgICAgLyogSW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBHRkIgKi8KICAgIHVpbnQzMiB4OwogICAgdWludDMyIHk7CiAgICB1aW50MzIgd2lkdGg7CiAgICB1aW50MzIgaGVpZ2h0OwotICAgdWludDMyIHJvcDsgICAgICAgLy8gTXVzdCBiZSBTVkdBX1JPUF9DT1BZCisgICB1aW50MzIgcm9wOyAgICAgICAvKiBNdXN0IGJlIFNWR0FfUk9QX0NPUFkgKi8KIH0gU1ZHQUZpZm9DbWRGcm9udFJvcEZpbGw7CiAKIApAQCAtMTA4Myw3ICsxMjIxLDcgQEAKICAqLwogCiB0eXBlZGVmCi1zdHJ1Y3Qgeworc3RydWN0IFNWR0FGaWZvQ21kRXNjYXBlIHsKICAgIHVpbnQzMiBuc2lkOwogICAgdWludDMyIHNpemU7CiAgICAvKiBmb2xsb3dlZCBieSAnc2l6ZScgYnl0ZXMgb2YgZGF0YSAqLwpAQCAtMTExMywxMiArMTI1MSwxMiBAQAogICogICAgcmVnaXN0ZXJzIChTVkdBX1JFR19OVU1fR1VFU1RfRElTUExBWVMsIFNWR0FfUkVHX0RJU1BMQVlfKikuCiAgKgogICogQXZhaWxhYmlsaXR5OgotICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUCisgKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1Qgb3IgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIKICAqLwogCiB0eXBlZGVmCiBzdHJ1Y3QgewotICAgU1ZHQVNjcmVlbk9iamVjdCBzY3JlZW47ICAgLy8gVmFyaWFibGUtbGVuZ3RoIGFjY29yZGluZyB0byB2ZXJzaW9uCisgICBTVkdBU2NyZWVuT2JqZWN0IHNjcmVlbjsgICAvKiBWYXJpYWJsZS1sZW5ndGggYWNjb3JkaW5nIHRvIHZlcnNpb24gKi8KIH0gU1ZHQUZpZm9DbWREZWZpbmVTY3JlZW47CiAKIApAQCAtMTEyOSw3ICsxMjY3LDcgQEAKICAqICAgIHJlLXVzZS4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKQEAgLTExODIsNyArMTMyMCw3IEBACiAgKiAgICBHTVJGQi4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKQEAgLTEyMTksNyArMTM1Nyw3IEBACiAgKiAgICBTVkdBX0NNRF9BTk5PVEFUSU9OXyogY29tbWFuZHMgZm9yIGRldGFpbHMuCiAgKgogICogQXZhaWxhYmlsaXR5OgotICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUCisgKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1Qgb3IgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIKICAqLwogCiB0eXBlZGVmCkBAIC0xMjY3LDcgKzE0MDUsNyBAQAogICogICAgdGhlIHRpbWUgYW55IHN1YnNlcXVlbnQgRkVOQ0UgY29tbWFuZHMgYXJlIHJlYWNoZWQuCiAgKgogICogQXZhaWxhYmlsaXR5OgotICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUCisgKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1Qgb3IgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIKICAqLwogCiB0eXBlZGVmCkBAIC0xMzAyLDcgKzE0NDAsNyBAQAogICogICAgdXNlcidzIGRpc3BsYXkgaXMgYmVpbmcgcmVtb3RlZCBvdmVyIGEgbmV0d29yayBjb25uZWN0aW9uLgogICoKICAqIEF2YWlsYWJpbGl0eToKLSAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVAorICogICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUIG9yIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVF8yCiAgKi8KIAogdHlwZWRlZgpAQCAtMTMzNCw3ICsxNDcyLDcgQEAKICAqICAgIHVuZGVmaW5lZC4KICAqCiAgKiBBdmFpbGFiaWxpdHk6Ci0gKiAgICBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1QKKyAqICAgIFNWR0FfRklGT19DQVBfU0NSRUVOX09CSkVDVCBvciBTVkdBX0ZJRk9fQ0FQX1NDUkVFTl9PQkpFQ1RfMgogICovCiAKIHR5cGVkZWYKQEAgLTEzNDMsNCArMTQ4MSw3MiBAQAogICAgdWludDMyICAgICAgICAgICBzcmNTY3JlZW5JZDsKIH0gU1ZHQUZpZm9DbWRBbm5vdGF0aW9uQ29weTsKIAorCisvKgorICogU1ZHQV9DTURfREVGSU5FX0dNUjIgLS0KKyAqCisgKiAgICBEZWZpbmUgZ3Vlc3QgbWVtb3J5IHJlZ2lvbiB2Mi4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgR01ScyBhYm92ZS4KKyAqCisgKiBBdmFpbGFiaWxpdHk6CisgKiAgICBTVkdBX0NBUF9HTVIyCisgKi8KKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiBnbXJJZDsKKyAgIHVpbnQzMiBudW1QYWdlczsKK30gU1ZHQUZpZm9DbWREZWZpbmVHTVIyOworCisKKy8qCisgKiBTVkdBX0NNRF9SRU1BUF9HTVIyIC0tCisgKgorICogICAgUmVtYXAgZ3Vlc3QgbWVtb3J5IHJlZ2lvbiB2Mi4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgR01ScyBhYm92ZS4KKyAqCisgKiAgICBUaGlzIGNvbW1hbmQgYWxsb3dzIGd1ZXN0IHRvIG1vZGlmeSBhIHBvcnRpb24gb2YgYW4gZXhpc3RpbmcgR01SIGJ5CisgKiAgICBpbnZhbGlkYXRpbmcgaXQgb3IgcmVhc3NpZ25pbmcgaXQgdG8gZGlmZmVyZW50IGd1ZXN0IHBoeXNpY2FsIHBhZ2VzLgorICogICAgVGhlIHBhZ2VzIGFyZSBpZGVudGlmaWVkIGJ5IHBoeXNpY2FsIHBhZ2UgbnVtYmVyIChQUE4pLiAgVGhlIHBhZ2VzCisgKiAgICBhcmUgYXNzdW1lZCB0byBiZSBwaW5uZWQgYW5kIHZhbGlkIGZvciBETUEgb3BlcmF0aW9ucy4KKyAqCisgKiAgICBEZXNjcmlwdGlvbiBvZiBjb21tYW5kIGZsYWdzOgorICoKKyAqICAgIFNWR0FfUkVNQVBfR01SMl9WSUFfR01SOiBJZiBlbmFibGVkLCByZWZlcmVuY2VzIGEgUFBOIGxpc3QgaW4gYSBHTVIuCisgKiAgICAgICBUaGUgUFBOIGxpc3QgbXVzdCBub3Qgb3ZlcmxhcCB3aXRoIHRoZSByZW1hcCByZWdpb24gKHRoaXMgY2FuIGJlCisgKiAgICAgICBoYW5kbGVkIHRyaXZpYWxseSBieSByZWZlcmVuY2luZyBhIHNlcGFyYXRlIEdNUikuICBJZiBmbGFnIGlzCisgKiAgICAgICBkaXNhYmxlZCwgUFBOIGxpc3QgaXMgYXBwZW5kZWQgdG8gU1ZHQVJlbWFwR01SIGNvbW1hbmQuCisgKgorICogICAgU1ZHQV9SRU1BUF9HTVIyX1BQTjY0OiBJZiBzZXQsIFBQTiBsaXN0IGlzIGluIFBQTjY0IGZvcm1hdCwgb3RoZXJ3aXNlCisgKiAgICAgICBpdCBpcyBpbiBQUE4zMiBmb3JtYXQuCisgKgorICogICAgU1ZHQV9SRU1BUF9HTVIyX1NJTkdMRV9QUE46IElmIHNldCwgUFBOIGxpc3QgY29udGFpbnMgYSBzaW5nbGUgZW50cnkuCisgKiAgICAgICBBIHNpbmdsZSBQUE4gY2FuIGJlIHVzZWQgdG8gaW52YWxpZGF0ZSBhIHBvcnRpb24gb2YgYSBHTVIgb3IKKyAqICAgICAgIG1hcCBpdCB0byB0byBhIHNpbmdsZSBndWVzdCBzY3JhdGNoIHBhZ2UuCisgKgorICogQXZhaWxhYmlsaXR5OgorICogICAgU1ZHQV9DQVBfR01SMgorICovCisKK3R5cGVkZWYgZW51bSB7CisgICBTVkdBX1JFTUFQX0dNUjJfUFBOMzIgICAgICAgICA9IDAsCisgICBTVkdBX1JFTUFQX0dNUjJfVklBX0dNUiAgICAgICA9ICgxIDw8IDApLAorICAgU1ZHQV9SRU1BUF9HTVIyX1BQTjY0ICAgICAgICAgPSAoMSA8PCAxKSwKKyAgIFNWR0FfUkVNQVBfR01SMl9TSU5HTEVfUFBOICAgID0gKDEgPDwgMiksCit9IFNWR0FSZW1hcEdNUjJGbGFnczsKKwordHlwZWRlZgorc3RydWN0IHsKKyAgIHVpbnQzMiBnbXJJZDsKKyAgIFNWR0FSZW1hcEdNUjJGbGFncyBmbGFnczsKKyAgIHVpbnQzMiBvZmZzZXRQYWdlczsgLyogb2Zmc2V0IGluIHBhZ2VzIHRvIGJlZ2luIHJlbWFwICovCisgICB1aW50MzIgbnVtUGFnZXM7IC8qIG51bWJlciBvZiBwYWdlcyB0byByZW1hcCAqLworICAgLyoKKyAgICAqIEZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgZGF0YSBkZXBlbmRpbmcgb24gU1ZHQVJlbWFwR01SMkZsYWdzLgorICAgICoKKyAgICAqIElmIGZsYWcgU1ZHQV9SRU1BUF9HTVIyX1ZJQV9HTVIgaXMgc2V0LCBzaW5nbGUgU1ZHQUd1ZXN0UHRyIGZvbGxvd3MuCisgICAgKiBPdGhlcndpc2UgYW4gYXJyYXkgb2YgcGFnZSBkZXNjcmlwdG9ycyBpbiBQUE4zMiBvciBQUE42NCBmb3JtYXQKKyAgICAqIChhY2NvcmRpbmcgdG8gZmxhZyBTVkdBX1JFTUFQX0dNUjJfUFBONjQpIGZvbGxvd3MuICBJZiBmbGFnCisgICAgKiBTVkdBX1JFTUFQX0dNUjJfU0lOR0xFX1BQTiBpcyBzZXQsIGFycmF5IGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5LgorICAgICovCit9IFNWR0FGaWZvQ21kUmVtYXBHTVIyOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKaW5kZXggODdlNDNlMC4uNWE3MmVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfYnVmZmVyLmMKQEAgLTQyLDYgKzQyLDEwIEBACiBzdGF0aWMgdWludDMyX3QgZ21yX3BsYWNlbWVudF9mbGFncyA9IFZNV19QTF9GTEFHX0dNUiB8CiAJVFRNX1BMX0ZMQUdfQ0FDSEVEOwogCitzdGF0aWMgdWludDMyX3QgZ21yX25lX3BsYWNlbWVudF9mbGFncyA9IFZNV19QTF9GTEFHX0dNUiB8CisJVFRNX1BMX0ZMQUdfQ0FDSEVEIHwKKwlUVE1fUExfRkxBR19OT19FVklDVDsKKwogc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fcGxhY2VtZW50ID0gewogCS5mcGZuID0gMCwKIAkubHBmbiA9IDAsCkBAIC01Niw2ICs2MCwxMSBAQAogCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRAogfTsKIAorc3RhdGljIHVpbnQzMl90IGdtcl92cmFtX3BsYWNlbWVudF9mbGFnc1tdID0geworCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRCwKKwlUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVECit9OworCiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfdnJhbV9nbXJfcGxhY2VtZW50ID0gewogCS5mcGZuID0gMCwKIAkubHBmbiA9IDAsCkBAIC02NSw2ICs3NCwyMCBAQAogCS5idXN5X3BsYWNlbWVudCA9ICZnbXJfcGxhY2VtZW50X2ZsYWdzCiB9OwogCitzdGF0aWMgdWludDMyX3QgdnJhbV9nbXJfbmVfcGxhY2VtZW50X2ZsYWdzW10gPSB7CisJVFRNX1BMX0ZMQUdfVlJBTSB8IFRUTV9QTF9GTEFHX0NBQ0hFRCB8IFRUTV9QTF9GTEFHX05PX0VWSUNULAorCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRCB8IFRUTV9QTF9GTEFHX05PX0VWSUNUCit9OworCitzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfdnJhbV9nbXJfbmVfcGxhY2VtZW50ID0geworCS5mcGZuID0gMCwKKwkubHBmbiA9IDAsCisJLm51bV9wbGFjZW1lbnQgPSAyLAorCS5wbGFjZW1lbnQgPSB2cmFtX2dtcl9uZV9wbGFjZW1lbnRfZmxhZ3MsCisJLm51bV9idXN5X3BsYWNlbWVudCA9IDEsCisJLmJ1c3lfcGxhY2VtZW50ID0gJmdtcl9uZV9wbGFjZW1lbnRfZmxhZ3MKK307CisKIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX3N5c19wbGFjZW1lbnQgPSB7CiAJLmZwZm4gPSAwLAogCS5scGZuID0gMCwKQEAgLTkyLDYgKzExNSwzMCBAQAogCS5idXN5X3BsYWNlbWVudCA9ICZzeXNfcGxhY2VtZW50X2ZsYWdzCiB9OwogCitzdGF0aWMgdWludDMyX3QgZXZpY3RhYmxlX3BsYWNlbWVudF9mbGFnc1tdID0geworCVRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9GTEFHX0NBQ0hFRCwKKwlUVE1fUExfRkxBR19WUkFNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVELAorCVZNV19QTF9GTEFHX0dNUiB8IFRUTV9QTF9GTEFHX0NBQ0hFRAorfTsKKworc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X2V2aWN0YWJsZV9wbGFjZW1lbnQgPSB7CisJLmZwZm4gPSAwLAorCS5scGZuID0gMCwKKwkubnVtX3BsYWNlbWVudCA9IDMsCisJLnBsYWNlbWVudCA9IGV2aWN0YWJsZV9wbGFjZW1lbnRfZmxhZ3MsCisJLm51bV9idXN5X3BsYWNlbWVudCA9IDEsCisJLmJ1c3lfcGxhY2VtZW50ID0gJnN5c19wbGFjZW1lbnRfZmxhZ3MKK307CisKK3N0cnVjdCB0dG1fcGxhY2VtZW50IHZtd19zcmZfcGxhY2VtZW50ID0geworCS5mcGZuID0gMCwKKwkubHBmbiA9IDAsCisJLm51bV9wbGFjZW1lbnQgPSAxLAorCS5udW1fYnVzeV9wbGFjZW1lbnQgPSAyLAorCS5wbGFjZW1lbnQgPSAmZ21yX3BsYWNlbWVudF9mbGFncywKKwkuYnVzeV9wbGFjZW1lbnQgPSBnbXJfdnJhbV9wbGFjZW1lbnRfZmxhZ3MKK307CisKIHN0cnVjdCB2bXdfdHRtX2JhY2tlbmQgewogCXN0cnVjdCB0dG1fYmFja2VuZCBiYWNrZW5kOwogCXN0cnVjdCBwYWdlICoqcGFnZXM7CkBAIC0yNzQsMzkgKzMyMSwzOSBAQAogCiBzdGF0aWMgdm9pZCAqdm13X3N5bmNfb2JqX3JlZih2b2lkICpzeW5jX29iaikKIHsKLQlyZXR1cm4gc3luY19vYmo7CisKKwlyZXR1cm4gKHZvaWQgKikKKwkJdm13X2ZlbmNlX29ial9yZWZlcmVuY2UoKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICopIHN5bmNfb2JqKTsKIH0KIAogc3RhdGljIHZvaWQgdm13X3N5bmNfb2JqX3VucmVmKHZvaWQgKipzeW5jX29iaikKIHsKLQkqc3luY19vYmogPSBOVUxMOworCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICoqKSBzeW5jX29iaik7CiB9CiAKIHN0YXRpYyBpbnQgdm13X3N5bmNfb2JqX2ZsdXNoKHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZykKIHsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gKHN0cnVjdCB2bXdfcHJpdmF0ZSAqKXN5bmNfYXJnOwotCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX1NZTkMsIFNWR0FfU1lOQ19HRU5FUklDKTsKLQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJdm13X2ZlbmNlX29ial9mbHVzaCgoc3RydWN0IHZtd19mZW5jZV9vYmogKikgc3luY19vYmopOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgYm9vbCB2bXdfc3luY19vYmpfc2lnbmFsZWQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnKQogewotCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSAoc3RydWN0IHZtd19wcml2YXRlICopc3luY19hcmc7Ci0JdWludDMyX3Qgc2VxdWVuY2UgPSAodW5zaWduZWQgbG9uZykgc3luY19vYmo7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9ICh1bnNpZ25lZCBsb25nKSBzeW5jX2FyZzsKKwlyZXR1cm4Jdm13X2ZlbmNlX29ial9zaWduYWxlZCgoc3RydWN0IHZtd19mZW5jZV9vYmogKikgc3luY19vYmosCisJCQkJICAgICAgICh1aW50MzJfdCkgZmxhZ3MpOwogCi0JcmV0dXJuIHZtd19mZW5jZV9zaWduYWxlZChkZXZfcHJpdiwgc2VxdWVuY2UpOwogfQogCiBzdGF0aWMgaW50IHZtd19zeW5jX29ial93YWl0KHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZywKIAkJCSAgICAgYm9vbCBsYXp5LCBib29sIGludGVycnVwdGlibGUpCiB7Ci0Jc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IChzdHJ1Y3Qgdm13X3ByaXZhdGUgKilzeW5jX2FyZzsKLQl1aW50MzJfdCBzZXF1ZW5jZSA9ICh1bnNpZ25lZCBsb25nKSBzeW5jX29iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIHN5bmNfYXJnOwogCi0JcmV0dXJuIHZtd193YWl0X2ZlbmNlKGRldl9wcml2LCBmYWxzZSwgc2VxdWVuY2UsIGZhbHNlLCAzKkhaKTsKKwlyZXR1cm4gdm13X2ZlbmNlX29ial93YWl0KChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKSBzeW5jX29iaiwKKwkJCQkgICh1aW50MzJfdCkgZmxhZ3MsCisJCQkJICBsYXp5LCBpbnRlcnJ1cHRpYmxlLAorCQkJCSAgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVCk7CiB9CiAKIHN0cnVjdCB0dG1fYm9fZHJpdmVyIHZtd19ib19kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kbWFidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2RtYWJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTg4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kbWFidWYuYwpAQCAtMCwwICsxLDMyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQorICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0dG0vdHRtX3BsYWNlbWVudC5oIgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInZtd2dmeF9kcnYuaCIKKworCisvKioKKyAqIHZtd19kbWFidWZfdG9fcGxhY2VtZW50IC0gVmFsaWRhdGUgYSBidWZmZXIgdG8gcGxhY2VtZW50LgorICoKKyAqIEBkZXZfcHJpdjogIERyaXZlciBwcml2YXRlLgorICogQGJ1ZjogIERNQSBidWZmZXIgdG8gbW92ZS4KKyAqIEBwaW46ICBQaW4gYnVmZmVyIGlmIHRydWUuCisgKiBAaW50ZXJydXB0aWJsZTogIFVzZSBpbnRlcnJ1cHRpYmxlIHdhaXQuCisgKgorICogTWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjdXJyZW50IG1hc3RlciBzaW5jZSBpdCBhc3N1bWVzIHRoYXQgdGhlCisgKiBtYXN0ZXIgbG9jayBpcyB0aGUgY3VycmVudCBtYXN0ZXIncyBsb2NrLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbWFzdGVyJ3MgbG9jayBpbiB3cml0ZSBtb2RlLgorICogRmx1c2hlcyBhbmQgdW5waW5zIHRoZSBxdWVyeSBibyB0byBhdm9pZCBmYWlsdXJlcy4KKyAqCisgKiBSZXR1cm5zCisgKiAgLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorICovCitpbnQgdm13X2RtYWJ1Zl90b19wbGFjZW1lbnQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCSAgICBzdHJ1Y3QgdHRtX3BsYWNlbWVudCAqcGxhY2VtZW50LAorCQkJICAgIGJvb2wgaW50ZXJydXB0aWJsZSkKK3sKKwlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IGRldl9wcml2LT5hY3RpdmVfbWFzdGVyOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmYnVmLT5iYXNlOworCWludCByZXQ7CisKKwlyZXQgPSB0dG1fd3JpdGVfbG9jaygmdm1hc3Rlci0+bG9jaywgaW50ZXJydXB0aWJsZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXZtd19leGVjYnVmX3JlbGVhc2VfcGlubmVkX2JvKGRldl9wcml2LCBmYWxzZSwgMCk7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIGVycjsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgcGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UpOworCisJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisKK2VycjoKKwl0dG1fd3JpdGVfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZtd19kbWFidWZfdG9fdnJhbV9vcl9nbXIgLSBNb3ZlIGEgYnVmZmVyIHRvIHZyYW0gb3IgZ21yLgorICoKKyAqIE1heSBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY3VycmVudCBtYXN0ZXIgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZQorICogbWFzdGVyIGxvY2sgaXMgdGhlIGN1cnJlbnQgbWFzdGVyJ3MgbG9jay4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG1hc3RlcidzIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAqIEZsdXNoZXMgYW5kIHVucGlucyB0aGUgcXVlcnkgYm8gaWYgQHBpbiA9PSB0cnVlIHRvIGF2b2lkIGZhaWx1cmVzLgorICoKKyAqIEBkZXZfcHJpdjogIERyaXZlciBwcml2YXRlLgorICogQGJ1ZjogIERNQSBidWZmZXIgdG8gbW92ZS4KKyAqIEBwaW46ICBQaW4gYnVmZmVyIGlmIHRydWUuCisgKiBAaW50ZXJydXB0aWJsZTogIFVzZSBpbnRlcnJ1cHRpYmxlIHdhaXQuCisgKgorICogUmV0dXJucworICogLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorICovCitpbnQgdm13X2RtYWJ1Zl90b192cmFtX29yX2dtcihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWYsCisJCQkgICAgICBib29sIHBpbiwgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gZGV2X3ByaXYtPmFjdGl2ZV9tYXN0ZXI7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZidWYtPmJhc2U7CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gdHRtX3dyaXRlX2xvY2soJnZtYXN0ZXItPmxvY2ssIGludGVycnVwdGlibGUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGluKQorCQl2bXdfZXhlY2J1Zl9yZWxlYXNlX3Bpbm5lZF9ibyhkZXZfcHJpdiwgZmFsc2UsIDApOworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGludGVycnVwdGlibGUsIGZhbHNlLCBmYWxzZSwgMCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBlcnI7CisKKwkvKioKKwkgKiBQdXQgQk8gaW4gVlJBTSBpZiB0aGVyZSBpcyBzcGFjZSwgb3RoZXJ3aXNlIGFzIGEgR01SLgorCSAqIElmIHRoZXJlIGlzIG5vIHNwYWNlIGluIFZSQU0gYW5kIEdNUiBpZHMgYXJlIGFsbCB1c2VkIHVwLAorCSAqIHN0YXJ0IGV2aWN0aW5nIEdNUnMgdG8gbWFrZSByb29tLiBJZiB0aGUgRE1BIGJ1ZmZlciBjYW4ndCBiZQorCSAqIHVzZWQgYXMgYSBHTVIsIHRoaXMgd2lsbCByZXR1cm4gLUVOT01FTS4KKwkgKi8KKworCWlmIChwaW4pCisJCXBsYWNlbWVudCA9ICZ2bXdfdnJhbV9nbXJfbmVfcGxhY2VtZW50OworCWVsc2UKKwkJcGxhY2VtZW50ID0gJnZtd192cmFtX2dtcl9wbGFjZW1lbnQ7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sIHBsYWNlbWVudCwgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSB8fCByZXQgPT0gLUVSRVNUQVJUU1lTKQorCQlnb3RvIGVycl91bnJlc2VydmU7CisKKworCS8qKgorCSAqIElmIHRoYXQgZmFpbGVkLCB0cnkgVlJBTSBhZ2FpbiwgdGhpcyB0aW1lIGV2aWN0aW5nCisJICogcHJldmlvdXMgY29udGVudHMuCisJICovCisKKwlpZiAocGluKQorCQlwbGFjZW1lbnQgPSAmdm13X3ZyYW1fbmVfcGxhY2VtZW50OworCWVsc2UKKwkJcGxhY2VtZW50ID0gJnZtd192cmFtX3BsYWNlbWVudDsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgcGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UpOworCitlcnJfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUoYm8pOworZXJyOgorCXR0bV93cml0ZV91bmxvY2soJnZtYXN0ZXItPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X2RtYWJ1Zl90b192cmFtIC0gTW92ZSBhIGJ1ZmZlciB0byB2cmFtLgorICoKKyAqIE1heSBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY3VycmVudCBtYXN0ZXIgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZQorICogbWFzdGVyIGxvY2sgaXMgdGhlIGN1cnJlbnQgbWFzdGVyJ3MgbG9jay4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG1hc3RlcidzIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAqCisgKiBAZGV2X3ByaXY6ICBEcml2ZXIgcHJpdmF0ZS4KKyAqIEBidWY6ICBETUEgYnVmZmVyIHRvIG1vdmUuCisgKiBAcGluOiAgUGluIGJ1ZmZlciBpbiB2cmFtIGlmIHRydWUuCisgKiBAaW50ZXJydXB0aWJsZTogIFVzZSBpbnRlcnJ1cHRpYmxlIHdhaXQuCisgKgorICogUmV0dXJucworICogLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorICovCitpbnQgdm13X2RtYWJ1Zl90b192cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJICAgICAgIGJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpCit7CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudDsKKworCWlmIChwaW4pCisJCXBsYWNlbWVudCA9ICZ2bXdfdnJhbV9uZV9wbGFjZW1lbnQ7CisJZWxzZQorCQlwbGFjZW1lbnQgPSAmdm13X3ZyYW1fcGxhY2VtZW50OworCisJcmV0dXJuIHZtd19kbWFidWZfdG9fcGxhY2VtZW50KGRldl9wcml2LCBidWYsCisJCQkJICAgICAgIHBsYWNlbWVudCwKKwkJCQkgICAgICAgaW50ZXJydXB0aWJsZSk7Cit9CisKKy8qKgorICogdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtIC0gTW92ZSBhIGJ1ZmZlciB0byBzdGFydCBvZiB2cmFtLgorICoKKyAqIE1heSBvbmx5IGJlIGNhbGxlZCBieSB0aGUgY3VycmVudCBtYXN0ZXIgc2luY2UgaXQgYXNzdW1lcyB0aGF0IHRoZQorICogbWFzdGVyIGxvY2sgaXMgdGhlIGN1cnJlbnQgbWFzdGVyJ3MgbG9jay4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG1hc3RlcidzIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAqIEZsdXNoZXMgYW5kIHVucGlucyB0aGUgcXVlcnkgYm8gaWYgQHBpbiA9PSB0cnVlIHRvIGF2b2lkIGZhaWx1cmVzLgorICoKKyAqIEBkZXZfcHJpdjogIERyaXZlciBwcml2YXRlLgorICogQGJ1ZjogIERNQSBidWZmZXIgdG8gbW92ZS4KKyAqIEBwaW46ICBQaW4gYnVmZmVyIGluIHZyYW0gaWYgdHJ1ZS4KKyAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KKyAqCisgKiBSZXR1cm5zCisgKiAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK2ludCB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQlzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCQlib29sIHBpbiwgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gZGV2X3ByaXYtPmFjdGl2ZV9tYXN0ZXI7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZidWYtPmJhc2U7CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgcGxhY2VtZW50OworCWludCByZXQgPSAwOworCisJaWYgKHBpbikKKwkJcGxhY2VtZW50ID0gdm13X3ZyYW1fbmVfcGxhY2VtZW50OworCWVsc2UKKwkJcGxhY2VtZW50ID0gdm13X3ZyYW1fcGxhY2VtZW50OworCXBsYWNlbWVudC5scGZuID0gYm8tPm51bV9wYWdlczsKKworCXJldCA9IHR0bV93cml0ZV9sb2NrKCZ2bWFzdGVyLT5sb2NrLCBpbnRlcnJ1cHRpYmxlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBpbikKKwkJdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIGZhbHNlLCAwKTsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCBpbnRlcnJ1cHRpYmxlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gZXJyX3VubG9jazsKKworCS8qIElzIHRoaXMgYnVmZmVyIGFscmVhZHkgaW4gdnJhbSBidXQgbm90IGF0IHRoZSBzdGFydCBvZiBpdD8gKi8KKwlpZiAoYm8tPm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSAmJgorCSAgICBiby0+bWVtLnN0YXJ0IDwgYm8tPm51bV9wYWdlcyAmJgorCSAgICBiby0+bWVtLnN0YXJ0ID4gMCkKKwkJKHZvaWQpIHR0bV9ib192YWxpZGF0ZShibywgJnZtd19zeXNfcGxhY2VtZW50LCBmYWxzZSwKKwkJCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKKworCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJnBsYWNlbWVudCwgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlKTsKKworCS8qIEZvciBzb21lIHJlYXNvbiB3ZSBkaWRuJ3QgdXAgYXQgdGhlIHN0YXJ0IG9mIHZyYW0gKi8KKwlXQVJOX09OKHJldCA9PSAwICYmIGJvLT5vZmZzZXQgIT0gMCk7CisKKwl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKK2Vycl91bmxvY2s6CisJdHRtX3dyaXRlX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogdm13X2RtYWJ1Zl91cGluIC0gVW5waW4gdGhlIGJ1ZmZlciBnaXZlbiBidWZmZXIsIGRvZXMgbm90IG1vdmUgdGhlIGJ1ZmZlci4KKyAqCisgKiBNYXkgb25seSBiZSBjYWxsZWQgYnkgdGhlIGN1cnJlbnQgbWFzdGVyIHNpbmNlIGl0IGFzc3VtZXMgdGhhdCB0aGUKKyAqIG1hc3RlciBsb2NrIGlzIHRoZSBjdXJyZW50IG1hc3RlcidzIGxvY2suCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBtYXN0ZXIncyBsb2NrIGluIHdyaXRlIG1vZGUuCisgKgorICogQGRldl9wcml2OiAgRHJpdmVyIHByaXZhdGUuCisgKiBAYnVmOiAgRE1BIGJ1ZmZlciB0byB1bnBpbi4KKyAqIEBpbnRlcnJ1cHRpYmxlOiAgVXNlIGludGVycnVwdGlibGUgd2FpdC4KKyAqCisgKiBSZXR1cm5zCisgKiAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuCisgKi8KK2ludCB2bXdfZG1hYnVmX3VucGluKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWYsCisJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCS8qCisJICogV2UgY291bGQgaW4gdGhlb3J5IGVhcmx5IG91dCBpZiB0aGUgYnVmZmVyIGlzCisJICogdW5waW5uZWQgYnV0IHdlIG5lZWQgdG8gbG9jayBhbmQgcmVzZXJ2ZSB0aGUgYnVmZmVyCisJICogYW55d2F5cyBzbyB3ZSBkb24ndCBnYWluIG11Y2ggYnkgdGhhdC4KKwkgKi8KKwlyZXR1cm4gdm13X2RtYWJ1Zl90b19wbGFjZW1lbnQoZGV2X3ByaXYsIGJ1ZiwKKwkJCQkgICAgICAgJnZtd19ldmljdGFibGVfcGxhY2VtZW50LAorCQkJCSAgICAgICBpbnRlcnJ1cHRpYmxlKTsKK30KKworCisvKioKKyAqIHZtd19ib19nZXRfZ3Vlc3RfcHRyIC0gR2V0IHRoZSBndWVzdCBwdHIgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHBsYWNlbWVudAorICogb2YgYSBidWZmZXIuCisgKgorICogQGJvOiBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LiBNdXN0IGJlIHBpbm5lZCBvciByZXNlcnZlZC4KKyAqIEBwdHI6IFNWR0FHdWVzdFB0ciByZXR1cm5pbmcgdGhlIHJlc3VsdC4KKyAqLwordm9pZCB2bXdfYm9fZ2V0X2d1ZXN0X3B0cihjb25zdCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJICBTVkdBR3Vlc3RQdHIgKnB0cikKK3sKKwlpZiAoYm8tPm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkgeworCQlwdHItPmdtcklkID0gU1ZHQV9HTVJfRlJBTUVCVUZGRVI7CisJCXB0ci0+b2Zmc2V0ID0gYm8tPm9mZnNldDsKKwl9IGVsc2UgeworCQlwdHItPmdtcklkID0gYm8tPm1lbS5zdGFydDsKKwkJcHRyLT5vZmZzZXQgPSAwOworCX0KK30KKworCisvKioKKyAqIHZtd19ib19waW4gLSBQaW4gb3IgdW5waW4gYSBidWZmZXIgb2JqZWN0IHdpdGhvdXQgbW92aW5nIGl0LgorICoKKyAqIEBibzogVGhlIGJ1ZmZlciBvYmplY3QuIE11c3QgYmUgcmVzZXJ2ZWQsIGFuZCBwcmVzZW50IGVpdGhlciBpbiBWUkFNCisgKiBvciBHTVIgbWVtb3J5LgorICogQHBpbjogV2hldGhlciB0byBwaW4gb3IgdW5waW4uCisgKgorICovCit2b2lkIHZtd19ib19waW4oc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9vbCBwaW4pCit7CisJdWludDMyX3QgcGxfZmxhZ3M7CisJc3RydWN0IHR0bV9wbGFjZW1lbnQgcGxhY2VtZW50OworCXVpbnQzMl90IG9sZF9tZW1fdHlwZSA9IGJvLT5tZW0ubWVtX3R5cGU7CisJaW50IHJldDsKKworCUJVR19PTighYXRvbWljX3JlYWQoJmJvLT5yZXNlcnZlZCkpOworCUJVR19PTihvbGRfbWVtX3R5cGUgIT0gVFRNX1BMX1ZSQU0gJiYKKwkgICAgICAgb2xkX21lbV90eXBlICE9IFZNV19QTF9GTEFHX0dNUik7CisKKwlwbF9mbGFncyA9IFRUTV9QTF9GTEFHX1ZSQU0gfCBWTVdfUExfRkxBR19HTVIgfCBUVE1fUExfRkxBR19DQUNIRUQ7CisJaWYgKHBpbikKKwkJcGxfZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfTk9fRVZJQ1Q7CisKKwltZW1zZXQoJnBsYWNlbWVudCwgMCwgc2l6ZW9mKHBsYWNlbWVudCkpOworCXBsYWNlbWVudC5udW1fcGxhY2VtZW50ID0gMTsKKwlwbGFjZW1lbnQucGxhY2VtZW50ID0gJnBsX2ZsYWdzOworCisJcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmcGxhY2VtZW50LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisKKwlCVUdfT04ocmV0ICE9IDAgfHwgYm8tPm1lbS5tZW1fdHlwZSAhPSBvbGRfbWVtX3R5cGUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwppbmRleCA5Njk0OWI5Li5kZmY4ZmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuYwpAQCAtMjQsNiArMjQsNyBAQAogICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAidm13Z2Z4X2Rydi5oIgpAQCAtODIsMTcgKzgzLDMxIEBACiAjZGVmaW5lIERSTV9JT0NUTF9WTVdfRVhFQ0JVRgkJCQkJXAogCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfRVhFQ0JVRiwJCVwKIAkJc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcpCi0jZGVmaW5lIERSTV9JT0NUTF9WTVdfRklGT19ERUJVRwkJCQlcCi0JRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfRklGT19ERUJVRywJCVwKLQkJIHN0cnVjdCBkcm1fdm13X2ZpZm9fZGVidWdfYXJnKQorI2RlZmluZSBEUk1fSU9DVExfVk1XX0dFVF8zRF9DQVAJCQkJXAorCURSTV9JT1coRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfR0VUXzNEX0NBUCwJCVwKKwkJIHN0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnKQogI2RlZmluZSBEUk1fSU9DVExfVk1XX0ZFTkNFX1dBSVQJCQkJXAogCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVk1XX0ZFTkNFX1dBSVQsCQlcCiAJCSBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19GRU5DRV9TSUdOQUxFRAkJCQlcCisJRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQsCVwKKwkJIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3NpZ25hbGVkX2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19GRU5DRV9VTlJFRgkJCQlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19GRU5DRV9VTlJFRiwJCVwKKwkJIHN0cnVjdCBkcm1fdm13X2ZlbmNlX2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19GRU5DRV9FVkVOVAkJCQlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19GRU5DRV9FVkVOVCwJCVwKKwkJIHN0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZykKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19QUkVTRU5UCQkJCQlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19QUkVTRU5ULAkJXAorCQkgc3RydWN0IGRybV92bXdfcHJlc2VudF9hcmcpCisjZGVmaW5lIERSTV9JT0NUTF9WTVdfUFJFU0VOVF9SRUFEQkFDSwkJCQlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19QUkVTRU5UX1JFQURCQUNLLAlcCisJCSBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X3JlYWRiYWNrX2FyZykKICNkZWZpbmUgRFJNX0lPQ1RMX1ZNV19VUERBVEVfTEFZT1VUCQkJCVwKLQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19VUERBVEVfTEFZT1VULAlcCisJRFJNX0lPVyhEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZNV19VUERBVEVfTEFZT1VULAlcCiAJCSBzdHJ1Y3QgZHJtX3Ztd191cGRhdGVfbGF5b3V0X2FyZykKIAotCiAvKioKICAqIFRoZSBjb3JlIERSTSB2ZXJzaW9uIG9mIHRoaXMgbWFjcm8gZG9lc24ndCBhY2NvdW50IGZvcgogICogRFJNX0NPTU1BTkRfQkFTRS4KQEAgLTEzNSwxMiArMTUwLDI4IEBACiAJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKIAlWTVdfSU9DVExfREVGKFZNV19FWEVDQlVGLCB2bXdfZXhlY2J1Zl9pb2N0bCwKIAkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAotCVZNV19JT0NUTF9ERUYoVk1XX0ZJRk9fREVCVUcsIHZtd19maWZvX2RlYnVnX2lvY3RsLAotCQkgICAgICBEUk1fQVVUSCB8IERSTV9ST09UX09OTFkgfCBEUk1fTUFTVEVSIHwgRFJNX1VOTE9DS0VEKSwKLQlWTVdfSU9DVExfREVGKFZNV19GRU5DRV9XQUlULCB2bXdfZmVuY2Vfd2FpdF9pb2N0bCwKKwlWTVdfSU9DVExfREVGKFZNV19GRU5DRV9XQUlULCB2bXdfZmVuY2Vfb2JqX3dhaXRfaW9jdGwsCiAJCSAgICAgIERSTV9BVVRIIHwgRFJNX1VOTE9DS0VEKSwKLQlWTVdfSU9DVExfREVGKFZNV19VUERBVEVfTEFZT1VULCB2bXdfa21zX3VwZGF0ZV9sYXlvdXRfaW9jdGwsCi0JCSAgICAgIERSTV9NQVNURVIgfCBEUk1fQ09OVFJPTF9BTExPVyB8IERSTV9VTkxPQ0tFRCkKKwlWTVdfSU9DVExfREVGKFZNV19GRU5DRV9TSUdOQUxFRCwKKwkJICAgICAgdm13X2ZlbmNlX29ial9zaWduYWxlZF9pb2N0bCwKKwkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAorCVZNV19JT0NUTF9ERUYoVk1XX0ZFTkNFX1VOUkVGLCB2bXdfZmVuY2Vfb2JqX3VucmVmX2lvY3RsLAorCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisJVk1XX0lPQ1RMX0RFRihWTVdfRkVOQ0VfRVZFTlQsCisJCSAgICAgIHZtd19mZW5jZV9ldmVudF9pb2N0bCwKKwkJICAgICAgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAorCVZNV19JT0NUTF9ERUYoVk1XX0dFVF8zRF9DQVAsIHZtd19nZXRfY2FwXzNkX2lvY3RsLAorCQkgICAgICBEUk1fQVVUSCB8IERSTV9VTkxPQ0tFRCksCisKKwkvKiB0aGVzZSBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBmcmFtZWJ1ZmZlcnMgbWFyayBhcyBtYXN0ZXIgb25seSAqLworCVZNV19JT0NUTF9ERUYoVk1XX1BSRVNFTlQsIHZtd19wcmVzZW50X2lvY3RsLAorCQkgICAgICBEUk1fTUFTVEVSIHwgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAorCVZNV19JT0NUTF9ERUYoVk1XX1BSRVNFTlRfUkVBREJBQ0ssCisJCSAgICAgIHZtd19wcmVzZW50X3JlYWRiYWNrX2lvY3RsLAorCQkgICAgICBEUk1fTUFTVEVSIHwgRFJNX0FVVEggfCBEUk1fVU5MT0NLRUQpLAorCVZNV19JT0NUTF9ERUYoVk1XX1VQREFURV9MQVlPVVQsCisJCSAgICAgIHZtd19rbXNfdXBkYXRlX2xheW91dF9pb2N0bCwKKwkJICAgICAgRFJNX01BU1RFUiB8IERSTV9VTkxPQ0tFRCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdm13X3BjaV9pZF9saXN0W10gPSB7CkBAIC0xODksOCArMjIwLDc4IEBACiAJCURSTV9JTkZPKCIgIEdNUi5cbiIpOwogCWlmIChjYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9UUkFDRVMpCiAJCURSTV9JTkZPKCIgIFRyYWNlcy5cbiIpOworCWlmIChjYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIyKQorCQlEUk1fSU5GTygiICBHTVIyLlxuIik7CisJaWYgKGNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX1NDUkVFTl9PQkpFQ1RfMikKKwkJRFJNX0lORk8oIiAgU2NyZWVuIE9iamVjdCAyLlxuIik7CiB9CiAKKworLyoqCisgKiB2bXdfZXhlY2J1Zl9wcmVwYXJlX2R1bW15X3F1ZXJ5IC0gSW5pdGlhbGl6ZSBhIHF1ZXJ5IHJlc3VsdCBzdHJ1Y3R1cmUgYXQKKyAqIHRoZSBzdGFydCBvZiBhIGJ1ZmZlciBvYmplY3QuCisgKgorICogQGRldl9wcml2OiBUaGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpZGxlIHRoZSBidWZmZXIgdXNpbmcgYW4gdW5pbnRlcnJ1cHRpYmxlIHdhaXQsIHRoZW4KKyAqIG1hcCB0aGUgZmlyc3QgcGFnZSBhbmQgaW5pdGlhbGl6ZSBhIHBlbmRpbmcgb2NjbHVzaW9uIHF1ZXJ5IHJlc3VsdCBzdHJ1Y3R1cmUsCisgKiBGaW5hbGx5IGl0IHdpbGwgdW5tYXAgdGhlIGJ1ZmZlci4KKyAqCisgKiBUT0RPOiBTaW5jZSB3ZSdyZSBvbmx5IG1hcHBpbmcgYSBzaW5nbGUgcGFnZSwgd2Ugc2hvdWxkIG9wdGltaXplIHRoZSBtYXAKKyAqIHRvIHVzZSBrbWFwX2F0b21pYyAvIGlvbWFwX2F0b21pYy4KKyAqLworc3RhdGljIHZvaWQgdm13X2R1bW15X3F1ZXJ5X2JvX3ByZXBhcmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqIG1hcDsKKwl2b2xhdGlsZSBTVkdBM2RRdWVyeVJlc3VsdCAqcmVzdWx0OworCWJvb2wgZHVtbXk7CisJaW50IHJldDsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+YmRldjsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvOworCisJdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CisJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkodm9pZCkgdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGZhbHNlLCB0cnVlLCAwLCBmYWxzZSwKKwkJCQkJIDEwKkhaKTsKKworCXJldCA9IHR0bV9ib19rbWFwKGJvLCAwLCAxLCAmbWFwKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQlyZXN1bHQgPSB0dG1fa21hcF9vYmpfdmlydHVhbCgmbWFwLCAmZHVtbXkpOworCQlyZXN1bHQtPnRvdGFsU2l6ZSA9IHNpemVvZigqcmVzdWx0KTsKKwkJcmVzdWx0LT5zdGF0ZSA9IFNWR0EzRF9RVUVSWVNUQVRFX1BFTkRJTkc7CisJCXJlc3VsdC0+cmVzdWx0MzIgPSAweGZmOworCQl0dG1fYm9fa3VubWFwKCZtYXApOworCX0gZWxzZQorCQlEUk1fRVJST1IoIkR1bW15IHF1ZXJ5IGJ1ZmZlciBtYXAgZmFpbGVkLlxuIik7CisJdHRtX2JvX3VucmVzZXJ2ZShibyk7Cit9CisKKworLyoqCisgKiB2bXdfZHVtbXlfcXVlcnlfYm9fY3JlYXRlIC0gY3JlYXRlIGEgYm8gdG8gaG9sZCBhIGR1bW15IHF1ZXJ5IHJlc3VsdAorICoKKyAqIEBkZXZfcHJpdjogQSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc21hbGwgYnVmZmVyIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBxdWVyeQorICogcmVzdWx0IGZvciBkdW1teSBxdWVyaWVzIGVtaXR0ZWQgYXMgcXVlcnkgYmFycmllcnMuCisgKiBObyBpbnRlcnJ1cHRpYmxlIHdhaXRzIGFyZSBkb25lIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgYW4gZXJyb3IgaWYgYm8gY3JlYXRpb24gZmFpbHMuCisgKi8KK3N0YXRpYyBpbnQgdm13X2R1bW15X3F1ZXJ5X2JvX2NyZWF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiB0dG1fYm9fY3JlYXRlKCZkZXZfcHJpdi0+YmRldiwKKwkJCSAgICAgUEFHRV9TSVpFLAorCQkJICAgICB0dG1fYm9fdHlwZV9kZXZpY2UsCisJCQkgICAgICZ2bXdfdnJhbV9zeXNfcGxhY2VtZW50LAorCQkJICAgICAwLCAwLCBmYWxzZSwgTlVMTCwKKwkJCSAgICAgJmRldl9wcml2LT5kdW1teV9xdWVyeV9ibyk7Cit9CisKKwogc3RhdGljIGludCB2bXdfcmVxdWVzdF9kZXZpY2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKIAlpbnQgcmV0OwpAQCAtMjAwLDE2ICszMDEsNDIgQEAKIAkJRFJNX0VSUk9SKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBGSUZPLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQorCXZtd19mZW5jZV9maWZvX3VwKGRldl9wcml2LT5mbWFuKTsKKwlyZXQgPSB2bXdfZHVtbXlfcXVlcnlfYm9fY3JlYXRlKGRldl9wcml2KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9ub19xdWVyeV9ibzsKKwl2bXdfZHVtbXlfcXVlcnlfYm9fcHJlcGFyZShkZXZfcHJpdik7CiAKIAlyZXR1cm4gMDsKKworb3V0X25vX3F1ZXJ5X2JvOgorCXZtd19mZW5jZV9maWZvX2Rvd24oZGV2X3ByaXYtPmZtYW4pOworCXZtd19maWZvX3JlbGVhc2UoZGV2X3ByaXYsICZkZXZfcHJpdi0+Zmlmbyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgdm13X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CisJLyoKKwkgKiBQcmV2aW91cyBkZXN0cnVjdGlvbnMgc2hvdWxkJ3ZlIHJlbGVhc2VkCisJICogdGhlIHBpbm5lZCBiby4KKwkgKi8KKworCUJVR19PTihkZXZfcHJpdi0+cGlubmVkX2JvICE9IE5VTEwpOworCisJdHRtX2JvX3VucmVmKCZkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8pOworCXZtd19mZW5jZV9maWZvX2Rvd24oZGV2X3ByaXYtPmZtYW4pOwogCXZtd19maWZvX3JlbGVhc2UoZGV2X3ByaXYsICZkZXZfcHJpdi0+Zmlmbyk7CiB9CiAKLWludCB2bXdfM2RfcmVzb3VyY2VfaW5jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCisvKioKKyAqIEluY3JlYXNlIHRoZSAzZCByZXNvdXJjZSByZWZjb3VudC4KKyAqIElmIHRoZSBjb3VudCB3YXMgcHJldm91c2x5IHplcm8sIGluaXRpYWxpemUgdGhlIGZpZm8sIHN3aXRjaGluZyB0byBzdmdhCisgKiBtb2RlLiBOb3RlIHRoYXQgdGhlIG1hc3RlciBob2xkcyBhIHJlZiBhcyB3ZWxsLCBhbmQgbWF5IHJlcXVlc3QgYW4KKyAqIGV4cGxpY2l0IHN3aXRjaCB0byBzdmdhIG1vZGUgaWYgZmIgaXMgbm90IHJ1bm5pbmcsIHVzaW5nIEB1bmhpZGVfc3ZnYS4KKyAqLworaW50IHZtd18zZF9yZXNvdXJjZV9pbmMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCWJvb2wgdW5oaWRlX3N2Z2EpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTIxOCwxOSArMzQ1LDQyIEBACiAJCXJldCA9IHZtd19yZXF1ZXN0X2RldmljZShkZXZfcHJpdik7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQktLWRldl9wcml2LT5udW1fM2RfcmVzb3VyY2VzOworCX0gZWxzZSBpZiAodW5oaWRlX3N2Z2EpIHsKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19FTkFCTEUsCisJCQkgIHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19FTkFCTEUpICYKKwkJCSAgflNWR0FfUkVHX0VOQUJMRV9ISURFKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOwogCX0KKwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJlbGVhc2VfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKLQotdm9pZCB2bXdfM2RfcmVzb3VyY2VfZGVjKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCisvKioKKyAqIERlY3JlYXNlIHRoZSAzZCByZXNvdXJjZSByZWZjb3VudC4KKyAqIElmIHRoZSBjb3VudCByZWFjaGVzIHplcm8sIGRpc2FibGUgdGhlIGZpZm8sIHN3aXRjaGluZyB0byB2Z2EgbW9kZS4KKyAqIE5vdGUgdGhhdCB0aGUgbWFzdGVyIGhvbGRzIGEgcmVmY291bnQgYXMgd2VsbCwgYW5kIG1heSByZXF1ZXN0IGFuCisgKiBleHBsaWNpdCBzd2l0Y2ggdG8gdmdhIG1vZGUgd2hlbiBpdCByZWxlYXNlcyBpdHMgcmVmY291bnQgdG8gYWNjb3VudAorICogZm9yIHRoZSBzaXR1YXRpb24gb2YgYW4gWCBzZXJ2ZXIgdnQgc3dpdGNoIHRvIFZHQSB3aXRoIDNkIHJlc291cmNlcworICogYWN0aXZlLgorICovCit2b2lkIHZtd18zZF9yZXNvdXJjZV9kZWMoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSBib29sIGhpZGVfc3ZnYSkKIHsKIAlpbnQzMl90IG4zZDsKIAogCW11dGV4X2xvY2soJmRldl9wcml2LT5yZWxlYXNlX211dGV4KTsKIAlpZiAodW5saWtlbHkoLS1kZXZfcHJpdi0+bnVtXzNkX3Jlc291cmNlcyA9PSAwKSkKIAkJdm13X3JlbGVhc2VfZGV2aWNlKGRldl9wcml2KTsKKwllbHNlIGlmIChoaWRlX3N2Z2EpIHsKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19FTkFCTEUsCisJCQkgIHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19FTkFCTEUpIHwKKwkJCSAgU1ZHQV9SRUdfRU5BQkxFX0hJREUpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJfQorCiAJbjNkID0gKGludDMyX3QpIGRldl9wcml2LT5udW1fM2RfcmVzb3VyY2VzOwogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJlbGVhc2VfbXV0ZXgpOwogCkBAIC0yNTIsNyArNDAyLDcgQEAKIAogCWRldl9wcml2LT5kZXYgPSBkZXY7CiAJZGV2X3ByaXYtPnZtd19jaGlwc2V0ID0gY2hpcHNldDsKLQlkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlID0gKHVpbnQzMl90KSAtMTAwOworCWRldl9wcml2LT5sYXN0X3JlYWRfc2Vxbm8gPSAodWludDMyX3QpIC0xMDA7CiAJbXV0ZXhfaW5pdCgmZGV2X3ByaXYtPmh3X211dGV4KTsKIAltdXRleF9pbml0KCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKIAltdXRleF9pbml0KCZkZXZfcHJpdi0+cmVsZWFzZV9tdXRleCk7CkBAIC0yNjMsOCArNDEzLDEwIEBACiAJbXV0ZXhfaW5pdCgmZGV2X3ByaXYtPmluaXRfbXV0ZXgpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPmZpZm9fcXVldWUpOwotCWF0b21pY19zZXQoJmRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzLCAwKTsKKwlkZXZfcHJpdi0+ZmVuY2VfcXVldWVfd2FpdGVycyA9IDA7CiAJYXRvbWljX3NldCgmZGV2X3ByaXYtPmZpZm9fcXVldWVfd2FpdGVycywgMCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5zdXJmYWNlX2xydSk7CisJZGV2X3ByaXYtPnVzZWRfbWVtb3J5X3NpemUgPSAwOwogCiAJZGV2X3ByaXYtPmlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CiAJZGV2X3ByaXYtPnZyYW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKTsKQEAgLTI4NSw2ICs0MzcsMTAgQEAKIAogCWRldl9wcml2LT5jYXBhYmlsaXRpZXMgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfQ0FQQUJJTElUSUVTKTsKIAorCWRldl9wcml2LT52cmFtX3NpemUgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfVlJBTV9TSVpFKTsKKwlkZXZfcHJpdi0+bW1pb19zaXplID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01FTV9TSVpFKTsKKwlkZXZfcHJpdi0+ZmJfbWF4X3dpZHRoID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01BWF9XSURUSCk7CisJZGV2X3ByaXYtPmZiX21heF9oZWlnaHQgPSB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfTUFYX0hFSUdIVCk7CiAJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9HTVIpIHsKIAkJZGV2X3ByaXYtPm1heF9nbXJfZGVzY3JpcHRvcnMgPQogCQkJdm13X3JlYWQoZGV2X3ByaXYsCkBAIC0yOTIsMTEgKzQ0OCwxOSBAQAogCQlkZXZfcHJpdi0+bWF4X2dtcl9pZHMgPQogCQkJdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0dNUl9NQVhfSURTKTsKIAl9Ci0KLQlkZXZfcHJpdi0+dnJhbV9zaXplID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX1ZSQU1fU0laRSk7Ci0JZGV2X3ByaXYtPm1taW9fc2l6ZSA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19NRU1fU0laRSk7Ci0JZGV2X3ByaXYtPmZiX21heF93aWR0aCA9IHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19NQVhfV0lEVEgpOwotCWRldl9wcml2LT5mYl9tYXhfaGVpZ2h0ID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01BWF9IRUlHSFQpOworCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikgeworCQlkZXZfcHJpdi0+bWF4X2dtcl9wYWdlcyA9CisJCQl2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfR01SU19NQVhfUEFHRVMpOworCQlkZXZfcHJpdi0+bWVtb3J5X3NpemUgPQorCQkJdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX01FTU9SWV9TSVpFKTsKKwkJZGV2X3ByaXYtPm1lbW9yeV9zaXplIC09IGRldl9wcml2LT52cmFtX3NpemU7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQW4gYXJiaXRyYXJ5IGxpbWl0IG9mIDUxMk1pQiBvbiBzdXJmYWNlCisJCSAqIG1lbW9yeS4gQnV0IGFsbCBIV1Y4IGhhcmR3YXJlIHN1cHBvcnRzIEdNUjIuCisJCSAqLworCQlkZXZfcHJpdi0+bWVtb3J5X3NpemUgPSA1MTIqMTAyNCoxMDI0OworCX0KIAogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIApAQCAtMzA4LDYgKzQ3MiwxMiBAQAogCQlEUk1fSU5GTygiTWF4IEdNUiBkZXNjcmlwdG9ycyBpcyAldVxuIiwKIAkJCSAodW5zaWduZWQpZGV2X3ByaXYtPm1heF9nbXJfZGVzY3JpcHRvcnMpOwogCX0KKwlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUjIpIHsKKwkJRFJNX0lORk8oIk1heCBudW1iZXIgb2YgR01SIHBhZ2VzIGlzICV1XG4iLAorCQkJICh1bnNpZ25lZClkZXZfcHJpdi0+bWF4X2dtcl9wYWdlcyk7CisJCURSTV9JTkZPKCJNYXggZGVkaWNhdGVkIGh5cGVydmlzb3Igc3VyZmFjZSBtZW1vcnkgaXMgJXUga2lCXG4iLAorCQkJICh1bnNpZ25lZClkZXZfcHJpdi0+bWVtb3J5X3NpemUgLyAxMDI0KTsKKwl9CiAJRFJNX0lORk8oIlZSQU0gYXQgMHglMDh4IHNpemUgaXMgJXUga2lCXG4iLAogCQkgZGV2X3ByaXYtPnZyYW1fc3RhcnQsIGRldl9wcml2LT52cmFtX3NpemUgLyAxMDI0KTsKIAlEUk1fSU5GTygiTU1JTyBhdCAweCUwOHggc2l6ZSBpcyAldSBraUJcbiIsCkBAIC0zOTQsMjIgKzU2NCwzNCBAQAogCQkJZ290byBvdXRfbm9fZGV2aWNlOwogCQl9CiAJfQorCisJZGV2X3ByaXYtPmZtYW4gPSB2bXdfZmVuY2VfbWFuYWdlcl9pbml0KGRldl9wcml2KTsKKwlpZiAodW5saWtlbHkoZGV2X3ByaXYtPmZtYW4gPT0gTlVMTCkpCisJCWdvdG8gb3V0X25vX2ZtYW47CisKKwkvKiBOZWVkIHRvIHN0YXJ0IHRoZSBmaWZvIHRvIGNoZWNrIGlmIHdlIGNhbiBkbyBzY3JlZW4gb2JqZWN0cyAqLworCXJldCA9IHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYsIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X25vX2ZpZm87CisJdm13X2ttc19zYXZlX3ZnYShkZXZfcHJpdik7CisKKwkvKiBTdGFydCBrbXMgYW5kIG92ZXJsYXkgc3lzdGVtcywgbmVlZHMgZmlmby4gKi8KIAlyZXQgPSB2bXdfa21zX2luaXQoZGV2X3ByaXYpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X25vX2ttczsKIAl2bXdfb3ZlcmxheV9pbml0KGRldl9wcml2KTsKKworCS8qIDNEIERlcGVuZHMgb24gU2NyZWVuIE9iamVjdHMgYmVpbmcgdXNlZC4gKi8KKwlEUk1fSU5GTygiRGV0ZWN0ZWQgJXNkZXZpY2UgM0QgYXZhaWxhYmlsaXR5LlxuIiwKKwkJIHZtd19maWZvX2hhdmVfM2QoZGV2X3ByaXYpID8KKwkJICIiIDogIm5vICIpOworCisJLyogV2UgbWlnaHQgYmUgZG9uZSB3aXRoIHRoZSBmaWZvIG5vdyAqLwogCWlmIChkZXZfcHJpdi0+ZW5hYmxlX2ZiKSB7Ci0JCXJldCA9IHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYpOwotCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQkJZ290byBvdXRfbm9fZmlmbzsKLQkJdm13X2ttc19zYXZlX3ZnYShkZXZfcHJpdik7CiAJCXZtd19mYl9pbml0KGRldl9wcml2KTsKLQkJRFJNX0lORk8oIiVzIiwgdm13X2ZpZm9faGF2ZV8zZChkZXZfcHJpdikgPwotCQkJICJEZXRlY3RlZCBkZXZpY2UgM0QgYXZhaWxhYmlsaXR5LlxuIiA6Ci0JCQkgIkRldGVjdGVkIG5vIGRldmljZSAzRCBhdmFpbGFiaWxpdHkuXG4iKTsKIAl9IGVsc2UgewotCQlEUk1fSU5GTygiRGVsYXllZCAzRCBkZXRlY3Rpb24gc2luY2Ugd2UncmUgbm90ICIKLQkJCSAicnVubmluZyB0aGUgZGV2aWNlIGluIFNWR0EgbW9kZSB5ZXQuXG4iKTsKKwkJdm13X2ttc19yZXN0b3JlX3ZnYShkZXZfcHJpdik7CisJCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIHRydWUpOwogCX0KIAogCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfSVJRTUFTSykgewpAQCAtNDI2LDE1ICs2MDgsMTkgQEAKIAlyZXR1cm4gMDsKIAogb3V0X25vX2lycToKLQlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikgeworCWlmIChkZXZfcHJpdi0+ZW5hYmxlX2ZiKQogCQl2bXdfZmJfY2xvc2UoZGV2X3ByaXYpOwotCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKLQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdik7Ci0JfQotb3V0X25vX2ZpZm86CiAJdm13X292ZXJsYXlfY2xvc2UoZGV2X3ByaXYpOwogCXZtd19rbXNfY2xvc2UoZGV2X3ByaXYpOwogb3V0X25vX2ttczoKKwkvKiBXZSBzdGlsbCBoYXZlIGEgM0QgcmVzb3VyY2UgcmVmZXJlbmNlIGhlbGQgKi8KKwlpZiAoZGV2X3ByaXYtPmVuYWJsZV9mYikgeworCQl2bXdfa21zX3Jlc3RvcmVfdmdhKGRldl9wcml2KTsKKwkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgZmFsc2UpOworCX0KK291dF9ub19maWZvOgorCXZtd19mZW5jZV9tYW5hZ2VyX3Rha2Vkb3duKGRldl9wcml2LT5mbWFuKTsKK291dF9ub19mbWFuOgogCWlmIChkZXZfcHJpdi0+c3RlYWx0aCkKIAkJcGNpX3JlbGVhc2VfcmVnaW9uKGRldi0+cGRldiwgMik7CiAJZWxzZQpAQCAtNDY3LDE1ICs2NTMsMTggQEAKIAogCXVucmVnaXN0ZXJfcG1fbm90aWZpZXIoJmRldl9wcml2LT5wbV9uYik7CiAKKwlpZiAoZGV2X3ByaXYtPmN0eC5jbWRfYm91bmNlKQorCQl2ZnJlZShkZXZfcHJpdi0+Y3R4LmNtZF9ib3VuY2UpOwogCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfSVJRTUFTSykKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2X3ByaXYtPmRldik7CiAJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpIHsKIAkJdm13X2ZiX2Nsb3NlKGRldl9wcml2KTsKIAkJdm13X2ttc19yZXN0b3JlX3ZnYShkZXZfcHJpdik7Ci0JCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCBmYWxzZSk7CiAJfQogCXZtd19rbXNfY2xvc2UoZGV2X3ByaXYpOwogCXZtd19vdmVybGF5X2Nsb3NlKGRldl9wcml2KTsKKwl2bXdfZmVuY2VfbWFuYWdlcl90YWtlZG93bihkZXZfcHJpdi0+Zm1hbik7CiAJaWYgKGRldl9wcml2LT5zdGVhbHRoKQogCQlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LT5wZGV2LCAyKTsKIAllbHNlCkBAIC02NDYsNyArODM1LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghZGV2X3ByaXYtPmVuYWJsZV9mYikgewotCQlyZXQgPSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2KTsKKwkJcmV0ID0gdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgdHJ1ZSk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQlyZXR1cm4gcmV0OwogCQl2bXdfa21zX3NhdmVfdmdhKGRldl9wcml2KTsKQEAgLTY4OCw3ICs4NzcsNyBAQAogCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX1RSQUNFUywgMSk7CiAJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIAkJdm13X2ttc19yZXN0b3JlX3ZnYShkZXZfcHJpdik7Ci0JCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCB0cnVlKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTcwOSw3ICs4OTgsNyBAQAogCiAJdm13X2ZwLT5sb2NrZWRfbWFzdGVyID0gZHJtX21hc3Rlcl9nZXQoZmlsZV9wcml2LT5tYXN0ZXIpOwogCXJldCA9IHR0bV92dF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCBmYWxzZSwgdm13X2ZwLT50ZmlsZSk7Ci0Jdm13X2ttc19pZGxlX3dvcmtxdWV1ZXModm1hc3Rlcik7CisJdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIGZhbHNlLCAwKTsKIAogCWlmICh1bmxpa2VseSgocmV0ICE9IDApKSkgewogCQlEUk1fRVJST1IoIlVuYWJsZSB0byBsb2NrIFRUTSBhdCBWVCBzd2l0Y2guXG4iKTsKQEAgLTcyNiw3ICs5MTUsNyBAQAogCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX1RSQUNFUywgMSk7CiAJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIAkJdm13X2ttc19yZXN0b3JlX3ZnYShkZXZfcHJpdik7Ci0JCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCB0cnVlKTsKIAl9CiAKIAlkZXZfcHJpdi0+YWN0aXZlX21hc3RlciA9ICZkZXZfcHJpdi0+ZmJkZXZfbWFzdGVyOwpAQCAtNzYxLDYgKzk1MCw3IEBACiAJCSAqIFRoaXMgZW1wdGllcyBWUkFNIGFuZCB1bmJpbmRzIGFsbCBHTVIgYmluZGluZ3MuCiAJCSAqIEJ1ZmZlciBjb250ZW50cyBpcyBtb3ZlZCB0byBzd2FwcGFibGUgbWVtb3J5LgogCQkgKi8KKwkJdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oZGV2X3ByaXYsIGZhbHNlLCAwKTsKIAkJdHRtX2JvX3N3YXBvdXRfYWxsKCZkZXZfcHJpdi0+YmRldik7CiAKIAkJYnJlYWs7CkBAIC04MzUsNyArMTAyNSw3IEBACiAJICovCiAJZGV2X3ByaXYtPnN1c3BlbmRlZCA9IHRydWU7CiAJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpCi0JCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCQkJdm13XzNkX3Jlc291cmNlX2RlYyhkZXZfcHJpdiwgdHJ1ZSk7CiAKIAlpZiAoZGV2X3ByaXYtPm51bV8zZF9yZXNvdXJjZXMgIT0gMCkgewogCkBAIC04NDMsNyArMTAzMyw3IEBACiAJCQkgIndoaWxlIDNEIHJlc291cmNlcyBhcmUgYWN0aXZlLlxuIik7CiAKIAkJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpCi0JCQl2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2KTsKKwkJCXZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYsIHRydWUpOwogCQlkZXZfcHJpdi0+c3VzcGVuZGVkID0gZmFsc2U7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtODYyLDcgKzEwNTIsNyBAQAogCSAqIHN0YXJ0IGZpZm8uCiAJICovCiAJaWYgKGRldl9wcml2LT5lbmFibGVfZmIpCi0JCXZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYpOworCQkJdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOwogCiAJZGV2X3ByaXYtPnN1c3BlbmRlZCA9IGZhbHNlOwogfQpAQCAtODg2LDYgKzEwNzYsOCBAQAogCS5pcnFfdW5pbnN0YWxsID0gdm13X2lycV91bmluc3RhbGwsCiAJLmlycV9oYW5kbGVyID0gdm13X2lycV9oYW5kbGVyLAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSB2bXdfZ2V0X3ZibGFua19jb3VudGVyLAorCS5lbmFibGVfdmJsYW5rID0gdm13X2VuYWJsZV92YmxhbmssCisJLmRpc2FibGVfdmJsYW5rID0gdm13X2Rpc2FibGVfdmJsYW5rLAogCS5yZWNsYWltX2J1ZmZlcnNfbG9ja2VkID0gTlVMTCwKIAkuaW9jdGxzID0gdm13X2lvY3RscywKIAkubnVtX2lvY3RscyA9IERSTV9BUlJBWV9TSVpFKHZtd19pb2N0bHMpLApAQCAtOTAyLDcgKzEwOTQsOCBAQAogCQkgLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKIAkJIC51bmxvY2tlZF9pb2N0bCA9IHZtd191bmxvY2tlZF9pb2N0bCwKIAkJIC5tbWFwID0gdm13X21tYXAsCi0JCSAucG9sbCA9IGRybV9wb2xsLAorCQkgLnBvbGwgPSB2bXdfZm9wc19wb2xsLAorCQkgLnJlYWQgPSB2bXdfZm9wc19yZWFkLAogCQkgLmZhc3luYyA9IGRybV9mYXN5bmMsCiAjaWYgZGVmaW5lZChDT05GSUdfQ09NUEFUKQogCQkgLmNvbXBhdF9pb2N0bCA9IGRybV9jb21wYXRfaW9jdGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCmluZGV4IDEwZmMwMWYuLjhjY2E5MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCkBAIC0zOCwyMCArMzgsMjcgQEAKICNpbmNsdWRlICJ0dG0vdHRtX2xvY2suaCIKICNpbmNsdWRlICJ0dG0vdHRtX2V4ZWNidWZfdXRpbC5oIgogI2luY2x1ZGUgInR0bS90dG1fbW9kdWxlLmgiCisjaW5jbHVkZSAidm13Z2Z4X2ZlbmNlLmgiCiAKLSNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9EQVRFICIyMDEwMDkyNyIKLSNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9NQUpPUiAxCi0jZGVmaW5lIFZNV0dGWF9EUklWRVJfTUlOT1IgNAorI2RlZmluZSBWTVdHRlhfRFJJVkVSX0RBVEUgIjIwMTExMDI1IgorI2RlZmluZSBWTVdHRlhfRFJJVkVSX01BSk9SIDIKKyNkZWZpbmUgVk1XR0ZYX0RSSVZFUl9NSU5PUiAzCiAjZGVmaW5lIFZNV0dGWF9EUklWRVJfUEFUQ0hMRVZFTCAwCiAjZGVmaW5lIFZNV0dGWF9GSUxFX1BBR0VfT0ZGU0VUIDB4MDAxMDAwMDAKICNkZWZpbmUgVk1XR0ZYX0ZJRk9fU1RBVElDX1NJWkUgKDEwMjQqMTAyNCkKICNkZWZpbmUgVk1XR0ZYX01BWF9SRUxPQ0FUSU9OUyAyMDQ4Ci0jZGVmaW5lIFZNV0dGWF9NQVhfR01SUyAyMDQ4CisjZGVmaW5lIFZNV0dGWF9NQVhfVkFMSURBVElPTlMgMjA0OAogI2RlZmluZSBWTVdHRlhfTUFYX0RJU1BMQVlTIDE2CisjZGVmaW5lIFZNV0dGWF9DTURfQk9VTkNFX0lOSVRfU0laRSAzMjc2OAogCiAjZGVmaW5lIFZNV19QTF9HTVIgVFRNX1BMX1BSSVYwCiAjZGVmaW5lIFZNV19QTF9GTEFHX0dNUiBUVE1fUExfRkxBR19QUklWMAogCisjZGVmaW5lIFZNV19SRVNfQ09OVEVYVCB0dG1fZHJpdmVyX3R5cGUwCisjZGVmaW5lIFZNV19SRVNfU1VSRkFDRSB0dG1fZHJpdmVyX3R5cGUxCisjZGVmaW5lIFZNV19SRVNfU1RSRUFNIHR0bV9kcml2ZXJfdHlwZTIKKyNkZWZpbmUgVk1XX1JFU19GRU5DRSB0dG1fZHJpdmVyX3R5cGUzCisKIHN0cnVjdCB2bXdfZnByaXYgewogCXN0cnVjdCBkcm1fbWFzdGVyICpsb2NrZWRfbWFzdGVyOwogCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlOwpAQCAtNzIsOSArNzksMTEgQEAKIAlpbnQgaWQ7CiAJZW51bSB0dG1fb2JqZWN0X3R5cGUgcmVzX3R5cGU7CiAJYm9vbCBhdmFpbDsKKwl2b2lkICgqcmVtb3ZlX2Zyb21fbGlzdHMpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwogCXZvaWQgKCpod19kZXN0cm95KSAoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKIAl2b2lkICgqcmVzX2ZyZWUpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpOwotCisJc3RydWN0IGxpc3RfaGVhZCB2YWxpZGF0ZV9oZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgcXVlcnlfaGVhZDsgLyogUHJvdGVjdGVkIGJ5IHRoZSBjbWRidWYgbXV0ZXggKi8KIAkvKiBUT0RPIGlzIGEgZ2VuZXJpYyBzbm9vcGVyIG5lZWRlZD8gKi8KICNpZiAwCiAJdm9pZCAoKnNub29wKShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCkBAIC05MCw4ICs5OSwxMiBAQAogCXVpbnQzMl90ICppbWFnZTsKIH07CiAKK3N0cnVjdCB2bXdfZnJhbWVidWZmZXI7CitzdHJ1Y3Qgdm13X3N1cmZhY2Vfb2Zmc2V0OworCiBzdHJ1Y3Qgdm13X3N1cmZhY2UgewogCXN0cnVjdCB2bXdfcmVzb3VyY2UgcmVzOworCXN0cnVjdCBsaXN0X2hlYWQgbHJ1X2hlYWQ7IC8qIFByb3RlY3RlZCBieSB0aGUgcmVzb3VyY2UgbG9jayAqLwogCXVpbnQzMl90IGZsYWdzOwogCXVpbnQzMl90IGZvcm1hdDsKIAl1aW50MzJfdCBtaXBfbGV2ZWxzW0RSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVNdOwpAQCAtMTAyLDkgKzExNSwxMiBAQAogCiAJLyogVE9ETyBzbyBmYXIganVzdCBhIGV4dHJhIHBvaW50ZXIgKi8KIAlzdHJ1Y3Qgdm13X2N1cnNvcl9zbm9vcGVyIHNub29wZXI7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpiYWNrdXA7CisJc3RydWN0IHZtd19zdXJmYWNlX29mZnNldCAqb2Zmc2V0czsKKwl1aW50MzJfdCBiYWNrdXBfc2l6ZTsKIH07CiAKLXN0cnVjdCB2bXdfZmVuY2VfcXVldWUgeworc3RydWN0IHZtd19tYXJrZXJfcXVldWUgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAlzdHJ1Y3QgdGltZXNwZWMgbGFnOwogCXN0cnVjdCB0aW1lc3BlYyBsYWdfdGltZTsKQEAgLTExNSwxNiArMTMxLDEyIEBACiAJdW5zaWduZWQgbG9uZyByZXNlcnZlZF9zaXplOwogCV9fbGUzMiAqZHluYW1pY19idWZmZXI7CiAJX19sZTMyICpzdGF0aWNfYnVmZmVyOwotCV9fbGUzMiAqbGFzdF9idWZmZXI7Ci0JdWludDMyX3QgbGFzdF9kYXRhX3NpemU7Ci0JdWludDMyX3QgbGFzdF9idWZmZXJfc2l6ZTsKLQlib29sIGxhc3RfYnVmZmVyX2FkZDsKIAl1bnNpZ25lZCBsb25nIHN0YXRpY19idWZmZXJfc2l6ZTsKIAlib29sIHVzaW5nX2JvdW5jZV9idWZmZXI7CiAJdWludDMyX3QgY2FwYWJpbGl0aWVzOwogCXN0cnVjdCBtdXRleCBmaWZvX211dGV4OwogCXN0cnVjdCByd19zZW1hcGhvcmUgcndzZW07Ci0Jc3RydWN0IHZtd19mZW5jZV9xdWV1ZSBmZW5jZV9xdWV1ZTsKKwlzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSBtYXJrZXJfcXVldWU7CiB9OwogCiBzdHJ1Y3Qgdm13X3JlbG9jYXRpb24gewpAQCAtMTM2LDYgKzE0OCw4IEBACiAJc3RydWN0IGlkYSBib19saXN0OwogCXVpbnQzMl90IGxhc3RfY2lkOwogCWJvb2wgY2lkX3ZhbGlkOworCWJvb2wga2VybmVsOyAvKio8IGlzIHRoZSBjYWxsZWQgbWFkZSBmcm9tIHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpjdXJfY3R4OwogCXVpbnQzMl90IGxhc3Rfc2lkOwogCXVpbnQzMl90IHNpZF90cmFuc2xhdGlvbjsKIAlib29sIHNpZF92YWxpZDsKQEAgLTE0Myw4ICsxNTcsMTYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZhbGlkYXRlX25vZGVzOwogCXN0cnVjdCB2bXdfcmVsb2NhdGlvbiByZWxvY3NbVk1XR0ZYX01BWF9SRUxPQ0FUSU9OU107CiAJdWludDMyX3QgY3VyX3JlbG9jOwotCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHZhbF9idWZzW1ZNV0dGWF9NQVhfR01SU107CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgdmFsX2J1ZnNbVk1XR0ZYX01BWF9WQUxJREFUSU9OU107CiAJdWludDMyX3QgY3VyX3ZhbF9idWY7CisJdWludDMyX3QgKmNtZF9ib3VuY2U7CisJdWludDMyX3QgY21kX2JvdW5jZV9zaXplOworCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3VyY2VfbGlzdDsKKwl1aW50MzJfdCBmZW5jZV9mbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXJ5X2xpc3Q7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpjdXJfcXVlcnlfYm87CisJdWludDMyX3QgY3VyX3F1ZXJ5X2NpZDsKKwlib29sIHF1ZXJ5X2NpZF92YWxpZDsKIH07CiAKIHN0cnVjdCB2bXdfbGVnYWN5X2Rpc3BsYXk7CkBAIC0xODUsNiArMjA3LDggQEAKIAl1aW50MzJfdCBjYXBhYmlsaXRpZXM7CiAJdWludDMyX3QgbWF4X2dtcl9kZXNjcmlwdG9yczsKIAl1aW50MzJfdCBtYXhfZ21yX2lkczsKKwl1aW50MzJfdCBtYXhfZ21yX3BhZ2VzOworCXVpbnQzMl90IG1lbW9yeV9zaXplOwogCWJvb2wgaGFzX2dtcjsKIAlzdHJ1Y3QgbXV0ZXggaHdfbXV0ZXg7CiAKQEAgLTE5NSwxMiArMjE5LDcgQEAKIAlzdHJ1Y3Qgdm13X3ZnYV90b3BvbG9neV9zdGF0ZSB2Z2Ffc2F2ZVtWTVdHRlhfTUFYX0RJU1BMQVlTXTsKIAl1aW50MzJfdCB2Z2Ffd2lkdGg7CiAJdWludDMyX3QgdmdhX2hlaWdodDsKLQl1aW50MzJfdCB2Z2FfZGVwdGg7CiAJdWludDMyX3QgdmdhX2JwcDsKLQl1aW50MzJfdCB2Z2FfcHNldWRvOwotCXVpbnQzMl90IHZnYV9yZWRfbWFzazsKLQl1aW50MzJfdCB2Z2FfZ3JlZW5fbWFzazsKLQl1aW50MzJfdCB2Z2FfYmx1ZV9tYXNrOwogCXVpbnQzMl90IHZnYV9icGw7CiAJdWludDMyX3QgdmdhX3BpdGNobG9jazsKIApAQCAtMjEyLDYgKzIzMSw3IEBACiAKIAl2b2lkICpmYl9pbmZvOwogCXN0cnVjdCB2bXdfbGVnYWN5X2Rpc3BsYXkgKmxkdV9wcml2OworCXN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF9kaXNwbGF5ICpzb3VfcHJpdjsKIAlzdHJ1Y3Qgdm13X292ZXJsYXkgKm92ZXJsYXlfcHJpdjsKIAogCS8qCkBAIC0yNDAsMTMgKzI2MCwxNiBAQAogCSAqIEZlbmNpbmcgYW5kIElSUXMuCiAJICovCiAKLQlhdG9taWNfdCBmZW5jZV9zZXE7CisJYXRvbWljX3QgbWFya2VyX3NlcTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBmZW5jZV9xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBmaWZvX3F1ZXVlOwotCWF0b21pY190IGZlbmNlX3F1ZXVlX3dhaXRlcnM7CisJaW50IGZlbmNlX3F1ZXVlX3dhaXRlcnM7IC8qIFByb3RlY3RlZCBieSBod19tdXRleCAqLworCWludCBnb2FsX3F1ZXVlX3dhaXRlcnM7IC8qIFByb3RlY3RlZCBieSBod19tdXRleCAqLwogCWF0b21pY190IGZpZm9fcXVldWVfd2FpdGVyczsKLQl1aW50MzJfdCBsYXN0X3JlYWRfc2VxdWVuY2U7CisJdWludDMyX3QgbGFzdF9yZWFkX3NlcW5vOwogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuOworCXVpbnQzMl90IGlycV9tYXNrOwogCiAJLyoKIAkgKiBEZXZpY2Ugc3RhdGUKQEAgLTI4NSw2ICszMDgsMjYgQEAKIAogCXN0cnVjdCBtdXRleCByZWxlYXNlX211dGV4OwogCXVpbnQzMl90IG51bV8zZF9yZXNvdXJjZXM7CisKKwkvKgorCSAqIFF1ZXJ5IHByb2Nlc3NpbmcuIFRoZXNlIG1lbWJlcnMKKwkgKiBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBjbWRidWYgbXV0ZXguCisJICovCisKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmR1bW15X3F1ZXJ5X2JvOworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqcGlubmVkX2JvOworCXVpbnQzMl90IHF1ZXJ5X2NpZDsKKwlib29sIGR1bW15X3F1ZXJ5X2JvX3Bpbm5lZDsKKworCS8qCisJICogU3VyZmFjZSBzd2FwcGluZy4gVGhlICJzdXJmYWNlX2xydSIgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgdGhlCisJICogcmVzb3VyY2UgbG9jayBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGRlc3Ryb3kgYSBzdXJmYWNlIGFuZCB0YWtlCisJICogaXQgb2ZmIHRoZSBscnUgYXRvbWljYWxseS4gInVzZWRfbWVtb3J5X3NpemUiIGlzIGN1cnJlbnRseQorCSAqIHByb3RlY3RlZCBieSB0aGUgY21kYnVmIG11dGV4IGZvciBzaW1wbGljaXR5LgorCSAqLworCisJc3RydWN0IGxpc3RfaGVhZCBzdXJmYWNlX2xydTsKKwl1aW50MzJfdCB1c2VkX21lbW9yeV9zaXplOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0zMTksOCArMzYyLDggQEAKIAlyZXR1cm4gdmFsOwogfQogCi1pbnQgdm13XzNkX3Jlc291cmNlX2luYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKLXZvaWQgdm13XzNkX3Jlc291cmNlX2RlYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCB2bXdfM2RfcmVzb3VyY2VfaW5jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgdW5oaWRlX3N2Z2EpOwordm9pZCB2bXdfM2RfcmVzb3VyY2VfZGVjKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgaGlkZV9zdmdhKTsKIAogLyoqCiAgKiBHTVIgdXRpbGl0aWVzIC0gdm13Z2Z4X2dtci5jCkBAIC0zNDUsNyArMzg4LDggQEAKIAkJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCB2bXdfY29udGV4dF9jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKLQkJCSAgICAgaW50IGlkKTsKKwkJCSAgICAgaW50IGlkLAorCQkJICAgICBzdHJ1Y3Qgdm13X3Jlc291cmNlICoqcF9yZXMpOwogZXh0ZXJuIHZvaWQgdm13X3N1cmZhY2VfcmVzX2ZyZWUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKIGV4dGVybiBpbnQgdm13X3N1cmZhY2VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmLApAQCAtMzYzLDYgKzQwNyw4IEBACiBleHRlcm4gaW50IHZtd19zdXJmYWNlX2NoZWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkJICAgICB1aW50MzJfdCBoYW5kbGUsIGludCAqaWQpOworZXh0ZXJuIGludCB2bXdfc3VyZmFjZV92YWxpZGF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKTsKIGV4dGVybiB2b2lkIHZtd19kbWFidWZfYm9fZnJlZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKIGV4dGVybiBpbnQgdm13X2RtYWJ1Zl9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKnZtd19ibywKQEAgLTM3OCwxMCArNDI0LDYgQEAKIGV4dGVybiB2b2lkIHZtd19kbWFidWZfdmFsaWRhdGVfY2xlYXIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CiBleHRlcm4gaW50IHZtd191c2VyX2RtYWJ1Zl9sb29rdXAoc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCiAJCQkJICB1aW50MzJfdCBpZCwgc3RydWN0IHZtd19kbWFfYnVmZmVyICoqb3V0KTsKLWV4dGVybiBpbnQgdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCi0JCQkJICAgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8pOwotZXh0ZXJuIGludCB2bXdfZG1hYnVmX2Zyb21fdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAotCQkJCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8pOwogZXh0ZXJuIGludCB2bXdfc3RyZWFtX2NsYWltX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IHZtd19zdHJlYW1fdW5yZWZfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTM5MCw3ICs0MzIsMzAgQEAKIAkJCQkgIHN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlLAogCQkJCSAgdWludDMyX3QgKmlub3V0X2lkLAogCQkJCSAgc3RydWN0IHZtd19yZXNvdXJjZSAqKm91dCk7CitleHRlcm4gdm9pZCB2bXdfcmVzb3VyY2VfdW5yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogCisvKioKKyAqIERNQSBidWZmZXIgaGVscGVyIHJvdXRpbmVzIC0gdm13Z2Z4X2RtYWJ1Zi5jCisgKi8KK2V4dGVybiBpbnQgdm13X2RtYWJ1Zl90b19wbGFjZW1lbnQoc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKKwkJCQkgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJvLAorCQkJCSAgIHN0cnVjdCB0dG1fcGxhY2VtZW50ICpwbGFjZW1lbnQsCisJCQkJICAgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKK2V4dGVybiBpbnQgdm13X2RtYWJ1Zl90b192cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCSAgICAgIGJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpOworZXh0ZXJuIGludCB2bXdfZG1hYnVmX3RvX3ZyYW1fb3JfZ21yKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKKwkJCQkgICAgIGJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpOworZXh0ZXJuIGludCB2bXdfZG1hYnVmX3RvX3N0YXJ0X29mX3ZyYW0oc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpibywKKwkJCQkgICAgICAgYm9vbCBwaW4sIGJvb2wgaW50ZXJydXB0aWJsZSk7CitleHRlcm4gaW50IHZtd19kbWFidWZfdW5waW4oc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKKwkJCSAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJvLAorCQkJICAgIGJvb2wgaW50ZXJydXB0aWJsZSk7CitleHRlcm4gdm9pZCB2bXdfYm9fZ2V0X2d1ZXN0X3B0cihjb25zdCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJ1ZiwKKwkJCQkgU1ZHQUd1ZXN0UHRyICpwdHIpOworZXh0ZXJuIHZvaWQgdm13X2JvX3BpbihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIHBpbik7CiAKIC8qKgogICogTWlzYyBJb2N0bCBmdW5jdGlvbmFsaXR5IC0gdm13Z2Z4X2lvY3RsLmMKQEAgLTM5OCw4ICs0NjMsMTYgQEAKIAogZXh0ZXJuIGludCB2bXdfZ2V0cGFyYW1faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKLWV4dGVybiBpbnQgdm13X2ZpZm9fZGVidWdfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKK2V4dGVybiBpbnQgdm13X2dldF9jYXBfM2RfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19wcmVzZW50X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBpbnQgdm13X3ByZXNlbnRfcmVhZGJhY2tfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gdW5zaWduZWQgaW50IHZtd19mb3BzX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOworZXh0ZXJuIHNzaXplX3Qgdm13X2ZvcHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCk7CiAKIC8qKgogICogRmlmbyB1dGlsaXRpZXMgLSB2bXdnZnhfZmlmby5jCkBAIC00MTIsMTEgKzQ4NSwxMiBAQAogZXh0ZXJuIHZvaWQgKnZtd19maWZvX3Jlc2VydmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3QgYnl0ZXMpOwogZXh0ZXJuIHZvaWQgdm13X2ZpZm9fY29tbWl0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IGJ5dGVzKTsKIGV4dGVybiBpbnQgdm13X2ZpZm9fc2VuZF9mZW5jZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgIHVpbnQzMl90ICpzZXF1ZW5jZSk7CisJCQkgICAgICAgdWludDMyX3QgKnNlcW5vKTsKIGV4dGVybiB2b2lkIHZtd19maWZvX3BpbmdfaG9zdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1aW50MzJfdCByZWFzb24pOwotZXh0ZXJuIGludCB2bXdfZmlmb19tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBleHRlcm4gYm9vbCB2bXdfZmlmb19oYXZlXzNkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOwogZXh0ZXJuIGJvb2wgdm13X2ZpZm9faGF2ZV9waXRjaGxvY2soc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gaW50IHZtd19maWZvX2VtaXRfZHVtbXlfcXVlcnkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgIHVpbnQzMl90IGNpZCk7CiAKIC8qKgogICogVFRNIGdsdWUgLSB2bXdnZnhfdHRtX2dsdWUuYwpAQCAtNDM0LDcgKzUwOCwxMCBAQAogZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX25lX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfdnJhbV9zeXNfcGxhY2VtZW50OwogZXh0ZXJuIHN0cnVjdCB0dG1fcGxhY2VtZW50IHZtd192cmFtX2dtcl9wbGFjZW1lbnQ7CitleHRlcm4gc3RydWN0IHR0bV9wbGFjZW1lbnQgdm13X3ZyYW1fZ21yX25lX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfc3lzX3BsYWNlbWVudDsKK2V4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfZXZpY3RhYmxlX3BsYWNlbWVudDsKK2V4dGVybiBzdHJ1Y3QgdHRtX3BsYWNlbWVudCB2bXdfc3JmX3BsYWNlbWVudDsKIGV4dGVybiBzdHJ1Y3QgdHRtX2JvX2RyaXZlciB2bXdfYm9fZHJpdmVyOwogZXh0ZXJuIGludCB2bXdfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIApAQCAtNDQ0LDQ1ICs1MjEsNzAgQEAKIAogZXh0ZXJuIGludCB2bXdfZXhlY2J1Zl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gaW50IHZtd19leGVjYnVmX3Byb2Nlc3Moc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgICB2b2lkIF9fdXNlciAqdXNlcl9jb21tYW5kcywKKwkJCSAgICAgICB2b2lkICprZXJuZWxfY29tbWFuZHMsCisJCQkgICAgICAgdWludDMyX3QgY29tbWFuZF9zaXplLAorCQkJICAgICAgIHVpbnQ2NF90IHRocm90dGxlX3VzLAorCQkJICAgICAgIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIKKwkJCSAgICAgICAqdXNlcl9mZW5jZV9yZXApOworCitleHRlcm4gdm9pZAordm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgICAgIGJvb2wgb25seV9vbl9jaWRfbWF0Y2gsIHVpbnQzMl90IGNpZCk7CisKK2V4dGVybiBpbnQgdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJICAgICAgc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKnBfZmVuY2UsCisJCQkJICAgICAgdWludDMyX3QgKnBfaGFuZGxlKTsKK2V4dGVybiB2b2lkIHZtd19leGVjYnVmX2NvcHlfZmVuY2VfdXNlcihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQlzdHJ1Y3Qgdm13X2Zwcml2ICp2bXdfZnAsCisJCQkJCWludCByZXQsCisJCQkJCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIKKwkJCQkJKnVzZXJfZmVuY2VfcmVwLAorCQkJCQlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsCisJCQkJCXVpbnQzMl90IGZlbmNlX2hhbmRsZSk7CiAKIC8qKgogICogSVJRcyBhbmQgd2F0aW5nIC0gdm13Z2Z4X2lycS5jCiAgKi8KIAogZXh0ZXJuIGlycXJldHVybl90IHZtd19pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIGludCB2bXdfd2FpdF9mZW5jZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCBib29sIGxhenksCi0JCQkgIHVpbnQzMl90IHNlcXVlbmNlLCBib29sIGludGVycnVwdGlibGUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CitleHRlcm4gaW50IHZtd193YWl0X3NlcW5vKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGJvb2wgbGF6eSwKKwkJCSAgICAgdWludDMyX3Qgc2Vxbm8sIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIGV4dGVybiB2b2lkIHZtd19pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgdm13X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHZtd19pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIGJvb2wgdm13X2ZlbmNlX3NpZ25hbGVkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgICAgdWludDMyX3Qgc2VxdWVuY2UpOwotZXh0ZXJuIGludCB2bXdfZmVuY2Vfd2FpdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKK2V4dGVybiBib29sIHZtd19zZXFub19wYXNzZWQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQl1aW50MzJfdCBzZXFubyk7CiBleHRlcm4gaW50IHZtd19mYWxsYmFja193YWl0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgIGJvb2wgbGF6eSwKIAkJCSAgICAgYm9vbCBmaWZvX2lkbGUsCi0JCQkgICAgIHVpbnQzMl90IHNlcXVlbmNlLAorCQkJICAgICB1aW50MzJfdCBzZXFubywKIAkJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAogCQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwotZXh0ZXJuIHZvaWQgdm13X3VwZGF0ZV9zZXF1ZW5jZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorZXh0ZXJuIHZvaWQgdm13X3VwZGF0ZV9zZXFubyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZSk7Ci0KK2V4dGVybiB2b2lkIHZtd19zZXFub193YWl0ZXJfYWRkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgdm13X3NlcW5vX3dhaXRlcl9yZW1vdmUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2bXdfZ29hbF93YWl0ZXJfYWRkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgdm13X2dvYWxfd2FpdGVyX3JlbW92ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KTsKIAogLyoqCi0gKiBSdWRpbWVudGFyeSBmZW5jZSBvYmplY3RzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRocm90dGxpbmcgLQotICogdm13Z2Z4X2ZlbmNlLmMKKyAqIFJ1ZGltZW50YXJ5IGZlbmNlLWxpa2Ugb2JqZWN0cyBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciB0aHJvdHRsaW5nIC0KKyAqIHZtd2dmeF9tYXJrZXIuYwogICovCiAKLWV4dGVybiB2b2lkIHZtd19mZW5jZV9xdWV1ZV9pbml0KHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlKTsKLWV4dGVybiB2b2lkIHZtd19mZW5jZV9xdWV1ZV90YWtlZG93bihzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlICpxdWV1ZSk7Ci1leHRlcm4gaW50IHZtd19mZW5jZV9wdXNoKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlLAotCQkJICB1aW50MzJfdCBzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IHZtd19mZW5jZV9wdWxsKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlLAotCQkJICB1aW50MzJfdCBzaWduYWxlZF9zZXF1ZW5jZSk7CitleHRlcm4gdm9pZCB2bXdfbWFya2VyX3F1ZXVlX2luaXQoc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlKTsKK2V4dGVybiB2b2lkIHZtd19tYXJrZXJfcXVldWVfdGFrZWRvd24oc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlKTsKK2V4dGVybiBpbnQgdm13X21hcmtlcl9wdXNoKHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSwKKwkJCSAgdWludDMyX3Qgc2Vxbm8pOworZXh0ZXJuIGludCB2bXdfbWFya2VyX3B1bGwoc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLAorCQkJICB1aW50MzJfdCBzaWduYWxlZF9zZXFubyk7CiBleHRlcm4gaW50IHZtd193YWl0X2xhZyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHVzKTsKKwkJCXN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdXMpOwogCiAvKioKICAqIEtlcm5lbCBmcmFtZWJ1ZmZlciAtIHZtd2dmeF9mYi5jCkBAIC01MDgsMTYgKzYxMCwzMSBAQAogCQkJICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKIAkJCSAgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJCSAgU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIpOwotdm9pZCB2bXdfa21zX3dyaXRlX3N2Z2Eoc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiwKLQkJCXVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIHBpdGNoLAotCQkJdW5zaWduZWQgYmJwLCB1bnNpZ25lZCBkZXB0aCk7Ci1pbnQgdm13X2ttc191cGRhdGVfbGF5b3V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworaW50IHZtd19rbXNfd3JpdGVfc3ZnYShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAorCQkgICAgICAgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgcGl0Y2gsCisJCSAgICAgICB1bnNpZ25lZCBicHAsIHVuc2lnbmVkIGRlcHRoKTsKIHZvaWQgdm13X2ttc19pZGxlX3dvcmtxdWV1ZXMoc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIpOwogYm9vbCB2bXdfa21zX3ZhbGlkYXRlX21vZGVfdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJCXVpbnQzMl90IHBpdGNoLAogCQkJCXVpbnQzMl90IGhlaWdodCk7CiB1MzIgdm13X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CitpbnQgdm13X2VuYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwordm9pZCB2bXdfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOworaW50IHZtd19rbXNfcHJlc2VudChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIsCisJCSAgICBzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmZhY2UsCisJCSAgICB1aW50MzJfdCBzaWQsIGludDMyX3QgZGVzdFgsIGludDMyX3QgZGVzdFksCisJCSAgICBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpjbGlwcywKKwkJICAgIHVpbnQzMl90IG51bV9jbGlwcyk7CitpbnQgdm13X2ttc19yZWFkYmFjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkgICAgIHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYiwKKwkJICAgICBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgX191c2VyICp1c2VyX2ZlbmNlX3JlcCwKKwkJICAgICBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpjbGlwcywKKwkJICAgICB1aW50MzJfdCBudW1fY2xpcHMpOworaW50IHZtd19rbXNfdXBkYXRlX2xheW91dF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIAogLyoqCiAgKiBPdmVybGF5IGNvbnRyb2wgLSB2bXdnZnhfb3ZlcmxheS5jCkBAIC01NzYsNCArNjkzLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKnZtd19tZW1fZ2xvYihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiAoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICopIGRldl9wcml2LT5tZW1fZ2xvYmFsX3JlZi5vYmplY3Q7Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYwppbmRleCA0MWI5NWVkLi40MDkzMmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCkBAIC00NCwxMCArNDQsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdm13X3Jlc291cmNlX3RvX3ZhbGlkYXRlX2xpc3Qoc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCQkgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3JlcykKK3sKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMgPSAqcF9yZXM7CisKKwlpZiAobGlzdF9lbXB0eSgmcmVzLT52YWxpZGF0ZV9oZWFkKSkgeworCQlsaXN0X2FkZF90YWlsKCZyZXMtPnZhbGlkYXRlX2hlYWQsICZzd19jb250ZXh0LT5yZXNvdXJjZV9saXN0KTsKKwkJKnBfcmVzID0gTlVMTDsKKwl9IGVsc2UKKwkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKHBfcmVzKTsKK30KKworLyoqCisgKiB2bXdfYm9fdG9fdmFsaWRhdGVfbGlzdCAtIGFkZCBhIGJvIHRvIGEgdmFsaWRhdGUgbGlzdAorICoKKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCB1c2VkIGZvciB0aGlzIGNvbW1hbmQgc3VibWlzc2lvbiBiYXRjaC4KKyAqIEBibzogVGhlIGJ1ZmZlciBvYmplY3QgdG8gYWRkLgorICogQGZlbmNlX2ZsYWdzOiBGZW5jZSBmbGFncyB0byBiZSBvcidlZCB3aXRoIGFueSBvdGhlciBmZW5jZSBmbGFncyBmb3IKKyAqIHRoaXMgYnVmZmVyIG9uIHRoaXMgc3VibWlzc2lvbiBiYXRjaC4KKyAqIEBwX3ZhbF9ub2RlOiBJZiBub24tTlVMTCBXaWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgdmFsaWRhdGUgbm9kZSBudW1iZXIKKyAqIG9uIHJldHVybi4KKyAqCisgKiBSZXR1cm5zIC1FSU5WQUwgaWYgdGhlIGxpbWl0IG9mIG51bWJlciBvZiBidWZmZXIgb2JqZWN0cyBwZXIgY29tbWFuZAorICogc3VibWlzc2lvbiBpcyByZWFjaGVkLgorICovCitzdGF0aWMgaW50IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCSAgIHVpbnQzMl90IGZlbmNlX2ZsYWdzLAorCQkJCSAgIHVpbnQzMl90ICpwX3ZhbF9ub2RlKQoreworCXVpbnQzMl90IHZhbF9ub2RlOworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICp2YWxfYnVmOworCisJdmFsX25vZGUgPSB2bXdfZG1hYnVmX3ZhbGlkYXRlX25vZGUoYm8sIHN3X2NvbnRleHQtPmN1cl92YWxfYnVmKTsKKworCWlmICh1bmxpa2VseSh2YWxfbm9kZSA+PSBWTVdHRlhfTUFYX1ZBTElEQVRJT05TKSkgeworCQlEUk1fRVJST1IoIk1heCBudW1iZXIgb2YgRE1BIGJ1ZmZlcnMgcGVyIHN1Ym1pc3Npb24iCisJCQkgICIgZXhjZWVkZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFsX2J1ZiA9ICZzd19jb250ZXh0LT52YWxfYnVmc1t2YWxfbm9kZV07CisJaWYgKHVubGlrZWx5KHZhbF9ub2RlID09IHN3X2NvbnRleHQtPmN1cl92YWxfYnVmKSkgeworCQl2YWxfYnVmLT5uZXdfc3luY19vYmpfYXJnID0gTlVMTDsKKwkJdmFsX2J1Zi0+Ym8gPSB0dG1fYm9fcmVmZXJlbmNlKGJvKTsKKwkJbGlzdF9hZGRfdGFpbCgmdmFsX2J1Zi0+aGVhZCwgJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzKTsKKwkJKytzd19jb250ZXh0LT5jdXJfdmFsX2J1ZjsKKwl9CisKKwl2YWxfYnVmLT5uZXdfc3luY19vYmpfYXJnID0gKHZvaWQgKikKKwkJKCh1bnNpZ25lZCBsb25nKSB2YWxfYnVmLT5uZXdfc3luY19vYmpfYXJnIHwgZmVuY2VfZmxhZ3MpOworCXN3X2NvbnRleHQtPmZlbmNlX2ZsYWdzIHw9IGZlbmNlX2ZsYWdzOworCisJaWYgKHBfdmFsX25vZGUpCisJCSpwX3ZhbF9ub2RlID0gdmFsX25vZGU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2bXdfY21kX2NpZF9jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCiAJCQkgICAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQogeworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmN0eDsKKwogCXN0cnVjdCB2bXdfY2lkX2NtZCB7CiAJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CiAJCV9fbGUzMiBjaWQ7CkBAIC01OCw3ICsxMTksOCBAQAogCWlmIChsaWtlbHkoc3dfY29udGV4dC0+Y2lkX3ZhbGlkICYmIGNtZC0+Y2lkID09IHN3X2NvbnRleHQtPmxhc3RfY2lkKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSB2bXdfY29udGV4dF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dC0+dGZpbGUsIGNtZC0+Y2lkKTsKKwlyZXQgPSB2bXdfY29udGV4dF9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dC0+dGZpbGUsIGNtZC0+Y2lkLAorCQkJCSZjdHgpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJRFJNX0VSUk9SKCJDb3VsZCBub3QgZmluZCBvciB1c2UgY29udGV4dCAldVxuIiwKIAkJCSAgKHVuc2lnbmVkKSBjbWQtPmNpZCk7CkBAIC02Nyw2ICsxMjksOCBAQAogCiAJc3dfY29udGV4dC0+bGFzdF9jaWQgPSBjbWQtPmNpZDsKIAlzd19jb250ZXh0LT5jaWRfdmFsaWQgPSB0cnVlOworCXN3X2NvbnRleHQtPmN1cl9jdHggPSBjdHg7CisJdm13X3Jlc291cmNlX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwgJmN0eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc1LDI5ICsxMzksNDUgQEAKIAkJCSAgICAgc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAogCQkJICAgICB1aW50MzJfdCAqc2lkKQogeworCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmOworCWludCByZXQ7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOworCiAJaWYgKCpzaWQgPT0gU1ZHQTNEX0lOVkFMSURfSUQpCiAJCXJldHVybiAwOwogCi0JaWYgKHVubGlrZWx5KCghc3dfY29udGV4dC0+c2lkX3ZhbGlkICB8fAotCQkgICAgICAqc2lkICE9IHN3X2NvbnRleHQtPmxhc3Rfc2lkKSkpIHsKLQkJaW50IHJlYWxfaWQ7Ci0JCWludCByZXQgPSB2bXdfc3VyZmFjZV9jaGVjayhkZXZfcHJpdiwgc3dfY29udGV4dC0+dGZpbGUsCi0JCQkJCSAgICAqc2lkLCAmcmVhbF9pZCk7Ci0KLQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQkJRFJNX0VSUk9SKCJDb3VsZCBvdCBmaW5kIG9yIHVzZSBzdXJmYWNlIDB4JTA4eCAiCi0JCQkJICAiYWRkcmVzcyAweCUwOGx4XG4iLAotCQkJCSAgKHVuc2lnbmVkIGludCkgKnNpZCwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBzaWQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXN3X2NvbnRleHQtPmxhc3Rfc2lkID0gKnNpZDsKLQkJc3dfY29udGV4dC0+c2lkX3ZhbGlkID0gdHJ1ZTsKLQkJKnNpZCA9IHJlYWxfaWQ7Ci0JCXN3X2NvbnRleHQtPnNpZF90cmFuc2xhdGlvbiA9IHJlYWxfaWQ7Ci0JfSBlbHNlCisJaWYgKGxpa2VseSgoc3dfY29udGV4dC0+c2lkX3ZhbGlkICAmJgorCQkgICAgICAqc2lkID09IHN3X2NvbnRleHQtPmxhc3Rfc2lkKSkpIHsKIAkJKnNpZCA9IHN3X2NvbnRleHQtPnNpZF90cmFuc2xhdGlvbjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gdm13X3VzZXJfc3VyZmFjZV9sb29rdXBfaGFuZGxlKGRldl9wcml2LAorCQkJCQkgICAgIHN3X2NvbnRleHQtPnRmaWxlLAorCQkJCQkgICAgICpzaWQsICZzcmYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBvdCBmaW5kIG9yIHVzZSBzdXJmYWNlIDB4JTA4eCAiCisJCQkgICJhZGRyZXNzIDB4JTA4bHhcbiIsCisJCQkgICh1bnNpZ25lZCBpbnQpICpzaWQsCisJCQkgICh1bnNpZ25lZCBsb25nKSBzaWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHZtd19zdXJmYWNlX3ZhbGlkYXRlKGRldl9wcml2LCBzcmYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIkNvdWxkIG5vdCB2YWxpZGF0ZSBzdXJmYWNlLlxuIik7CisJCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzcmYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN3X2NvbnRleHQtPmxhc3Rfc2lkID0gKnNpZDsKKwlzd19jb250ZXh0LT5zaWRfdmFsaWQgPSB0cnVlOworCXN3X2NvbnRleHQtPnNpZF90cmFuc2xhdGlvbiA9IHNyZi0+cmVzLmlkOworCSpzaWQgPSBzd19jb250ZXh0LT5zaWRfdHJhbnNsYXRpb247CisKKwlyZXMgPSAmc3JmLT5yZXM7CisJdm13X3Jlc291cmNlX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwgJnJlcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2Niw2ICsyNDYsMTIgQEAKIAl9ICpjbWQ7CiAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3NpZF9jbWQsIGhlYWRlcik7CisKKwlpZiAodW5saWtlbHkoIXN3X2NvbnRleHQtPmtlcm5lbCkpIHsKKwkJRFJNX0VSUk9SKCJLZXJuZWwgb25seSBTVkdBM2QgY29tbWFuZDogJXUuXG4iLCBjbWQtPmhlYWRlci5pZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCiAJcmV0dXJuIHZtd19jbWRfc2lkX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCAmY21kLT5ib2R5LnNyY0ltYWdlLnNpZCk7CiB9CiAKQEAgLTE3OCwxMCArMjY0LDE3OSBAQAogCQlTVkdBM2RDbWRQcmVzZW50IGJvZHk7CiAJfSAqY21kOwogCisKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X3NpZF9jbWQsIGhlYWRlcik7CisKKwlpZiAodW5saWtlbHkoIXN3X2NvbnRleHQtPmtlcm5lbCkpIHsKKwkJRFJNX0VSUk9SKCJLZXJuZWwgb25seSBTVkdBM2QgY29tbWFuZDogJXUuXG4iLCBjbWQtPmhlYWRlci5pZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCiAJcmV0dXJuIHZtd19jbWRfc2lkX2NoZWNrKGRldl9wcml2LCBzd19jb250ZXh0LCAmY21kLT5ib2R5LnNpZCk7CiB9CiAKKy8qKgorICogdm13X3F1ZXJ5X2JvX3N3aXRjaF9wcmVwYXJlIC0gUHJlcGFyZSB0byBzd2l0Y2ggcGlubmVkIGJ1ZmZlciBmb3IgcXVlcmllcy4KKyAqCisgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiBAY2lkOiBUaGUgaGFyZHdhcmUgY29udGV4dCBmb3IgdGhlIG5leHQgcXVlcnkuCisgKiBAbmV3X3F1ZXJ5X2JvOiBUaGUgbmV3IGJ1ZmZlciBob2xkaW5nIHF1ZXJ5IHJlc3VsdHMuCisgKiBAc3dfY29udGV4dDogVGhlIHNvZnR3YXJlIGNvbnRleHQgdXNlZCBmb3IgdGhpcyBjb21tYW5kIHN1Ym1pc3Npb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBAbmV3X3F1ZXJ5X2JvIGlzIHN1aXRhYmxlIGZvciBob2xkaW5nCisgKiBxdWVyeSByZXN1bHRzLCBhbmQgaWYgYW5vdGhlciBidWZmZXIgY3VycmVudGx5IGlzIHBpbm5lZCBmb3IgcXVlcnkKKyAqIHJlc3VsdHMuIElmIHNvLCB0aGUgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHN0YXRlIG9mIEBzd19jb250ZXh0IGZvcgorICogc3dpdGNoaW5nIHBpbm5lZCBidWZmZXJzIGFmdGVyIHN1Y2Nlc3NmdWwgc3VibWlzc2lvbiBvZiB0aGUgY3VycmVudAorICogY29tbWFuZCBiYXRjaC4gSXQgYWxzbyBjaGVja3Mgd2hldGhlciB3ZSdyZSB1c2luZyBhIG5ldyBxdWVyeSBjb250ZXh0LgorICogSW4gdGhhdCBjYXNlLCBpdCBtYWtlcyBzdXJlIHdlIGVtaXQgYSBxdWVyeSBiYXJyaWVyIGZvciB0aGUgb2xkCisgKiBjb250ZXh0IGJlZm9yZSB0aGUgY3VycmVudCBxdWVyeSBidWZmZXIgaXMgZmVuY2VkLgorICovCitzdGF0aWMgaW50IHZtd19xdWVyeV9ib19zd2l0Y2hfcHJlcGFyZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgICB1aW50MzJfdCBjaWQsCisJCQkJICAgICAgIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqbmV3X3F1ZXJ5X2JvLAorCQkJCSAgICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQpCit7CisJaW50IHJldDsKKwlib29sIGFkZF9jaWQgPSBmYWxzZTsKKwl1aW50MzJfdCBjaWRfdG9fYWRkOworCisJaWYgKHVubGlrZWx5KG5ld19xdWVyeV9ibyAhPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8pKSB7CisKKwkJaWYgKHVubGlrZWx5KG5ld19xdWVyeV9iby0+bnVtX3BhZ2VzID4gNCkpIHsKKwkJCURSTV9FUlJPUigiUXVlcnkgYnVmZmVyIHRvbyBsYXJnZS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodW5saWtlbHkoc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvICE9IE5VTEwpKSB7CisJCQlCVUdfT04oIXN3X2NvbnRleHQtPnF1ZXJ5X2NpZF92YWxpZCk7CisJCQlhZGRfY2lkID0gdHJ1ZTsKKwkJCWNpZF90b19hZGQgPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfY2lkOworCQkJcmV0ID0gdm13X2JvX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwKKwkJCQkJCSAgICAgIHN3X2NvbnRleHQtPmN1cl9xdWVyeV9ibywKKwkJCQkJCSAgICAgIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDLAorCQkJCQkJICAgICAgTlVMTCk7CisJCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvID0gbmV3X3F1ZXJ5X2JvOworCisJCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN3X2NvbnRleHQsCisJCQkJCSAgICAgIGRldl9wcml2LT5kdW1teV9xdWVyeV9ibywKKwkJCQkJICAgICAgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMsCisJCQkJCSAgICAgIE5VTEwpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKworCX0KKworCWlmICh1bmxpa2VseShjaWQgIT0gc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2NpZCAmJgorCQkgICAgIHN3X2NvbnRleHQtPnF1ZXJ5X2NpZF92YWxpZCkpIHsKKwkJYWRkX2NpZCA9IHRydWU7CisJCWNpZF90b19hZGQgPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfY2lkOworCX0KKworCXN3X2NvbnRleHQtPmN1cl9xdWVyeV9jaWQgPSBjaWQ7CisJc3dfY29udGV4dC0+cXVlcnlfY2lkX3ZhbGlkID0gdHJ1ZTsKKworCWlmIChhZGRfY2lkKSB7CisJCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmN0eCA9IHN3X2NvbnRleHQtPmN1cl9jdHg7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmN0eC0+cXVlcnlfaGVhZCkpCisJCQlsaXN0X2FkZF90YWlsKCZjdHgtPnF1ZXJ5X2hlYWQsCisJCQkJICAgICAgJnN3X2NvbnRleHQtPnF1ZXJ5X2xpc3QpOworCQlyZXQgPSB2bXdfYm9fdG9fdmFsaWRhdGVfbGlzdChzd19jb250ZXh0LAorCQkJCQkgICAgICBkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8sCisJCQkJCSAgICAgIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDLAorCQkJCQkgICAgICBOVUxMKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKgorICogdm13X3F1ZXJ5X2JvX3N3aXRjaF9jb21taXQgLSBGaW5hbGl6ZSBzd2l0Y2hpbmcgcGlubmVkIHF1ZXJ5IGJ1ZmZlcgorICoKKyAqIEBkZXZfcHJpdjogVGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEBzd19jb250ZXh0OiBUaGUgc29mdHdhcmUgY29udGV4dCB1c2VkIGZvciB0aGlzIGNvbW1hbmQgc3VibWlzc2lvbiBiYXRjaC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgd2UncmUgc3dpdGNoaW5nIHF1ZXJ5IGJ1ZmZlcnMsIGFuZCB3aWxsIHRoZW4sCisgKiBpZiBubyBvdGhlciBxdWVyeSB3YWl0cyBhcmUgaXNzdWVkIHRoaXMgY29tbWFuZCBzdWJtaXNzaW9uIGJhdGNoLAorICogaXNzdWUgYSBkdW1teSBvY2NsdXNpb24gcXVlcnkgd2FpdCB1c2VkIGFzIGEgcXVlcnkgYmFycmllci4gV2hlbiB0aGUgZmVuY2UKKyAqIG9iamVjdCBmb2xsb3dpbmcgdGhhdCBxdWVyeSB3YWl0IGhhcyBzaWduYWxlZCwgd2UgYXJlIHN1cmUgdGhhdCBhbGwKKyAqIHByZXNlZGluZyBxdWVyaWVzIGhhdmUgZmluaXNoZWQsIGFuZCB0aGUgb2xkIHF1ZXJ5IGJ1ZmZlciBjYW4gYmUgdW5waW5uZWQuCisgKiBIb3dldmVyLCBzaW5jZSBib3RoIHRoZSBuZXcgcXVlcnkgYnVmZmVyIGFuZCB0aGUgb2xkIG9uZSBhcmUgZmVuY2VkIHdpdGgKKyAqIHRoYXQgZmVuY2UsIHdlIGNhbiBkbyBhbiBhc3luY2hyb251cyB1bnBpbiBub3csIGFuZCBiZSBzdXJlIHRoYXQgdGhlCisgKiBvbGQgcXVlcnkgYnVmZmVyIHdvbid0IGJlIG1vdmVkIHVudGlsIHRoZSBmZW5jZSBoYXMgc2lnbmFsZWQuCisgKgorICogQXMgbWVudGlvbmVkIGFib3ZlLCBib3RoIHRoZSBuZXcgLSBhbmQgb2xkIHF1ZXJ5IGJ1ZmZlcnMgbmVlZCB0byBiZSBmZW5jZWQKKyAqIHVzaW5nIGEgc2VxdWVuY2UgZW1pdHRlZCAqYWZ0ZXIqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdm13X3F1ZXJ5X2JvX3N3aXRjaF9jb21taXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCkKK3sKKworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKmN0eCwgKm5leHRfY3R4OworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSB2YWxpZGF0ZSBsaXN0IHNob3VsZCBzdGlsbCBob2xkIHJlZmVyZW5jZXMgdG8gYWxsCisJICogY29udGV4dHMgaGVyZS4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdHgsIG5leHRfY3R4LCAmc3dfY29udGV4dC0+cXVlcnlfbGlzdCwKKwkJCQkgcXVlcnlfaGVhZCkgeworCQlsaXN0X2RlbF9pbml0KCZjdHgtPnF1ZXJ5X2hlYWQpOworCisJCUJVR19PTihsaXN0X2VtcHR5KCZjdHgtPnZhbGlkYXRlX2hlYWQpKTsKKworCQlyZXQgPSB2bXdfZmlmb19lbWl0X2R1bW15X3F1ZXJ5KGRldl9wcml2LCBjdHgtPmlkKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJRFJNX0VSUk9SKCJPdXQgb2YgZmlmbyBzcGFjZSBmb3IgZHVtbXkgcXVlcnkuXG4iKTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPnBpbm5lZF9ibyAhPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfYm8pIHsKKwkJaWYgKGRldl9wcml2LT5waW5uZWRfYm8pIHsKKwkJCXZtd19ib19waW4oZGV2X3ByaXYtPnBpbm5lZF9ibywgZmFsc2UpOworCQkJdHRtX2JvX3VucmVmKCZkZXZfcHJpdi0+cGlubmVkX2JvKTsKKwkJfQorCisJCXZtd19ib19waW4oc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvLCB0cnVlKTsKKworCQkvKgorCQkgKiBXZSBwaW4gYWxzbyB0aGUgZHVtbXlfcXVlcnlfYm8gYnVmZmVyIHNvIHRoYXQgd2UKKwkJICogZG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpdCB3aGVuIGVtaXR0aW5nCisJCSAqIGR1bW15IHF1ZXJpZXMgaW4gY29udGV4dCBkZXN0cm95IHBhdGhzLgorCQkgKi8KKworCQl2bXdfYm9fcGluKGRldl9wcml2LT5kdW1teV9xdWVyeV9ibywgdHJ1ZSk7CisJCWRldl9wcml2LT5kdW1teV9xdWVyeV9ib19waW5uZWQgPSB0cnVlOworCisJCWRldl9wcml2LT5xdWVyeV9jaWQgPSBzd19jb250ZXh0LT5jdXJfcXVlcnlfY2lkOworCQlkZXZfcHJpdi0+cGlubmVkX2JvID0KKwkJCXR0bV9ib19yZWZlcmVuY2Uoc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2JvKTsKKwl9Cit9CisKKy8qKgorICogdm13X3F1ZXJ5X3N3aXRjaF9iYWNrb2ZmIC0gY2xlYXIgcXVlcnkgYmFycmllciBsaXN0CisgKiBAc3dfY29udGV4dDogVGhlIHN3IGNvbnRleHQgdXNlZCBmb3IgdGhpcyBzdWJtaXNzaW9uIGJhdGNoLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBwYXJ0IG9mIGFuIGVycm9yIHBhdGgsIHdoZXJlIGEgcHJldmlvdXNseQorICogc2V0IHVwIGxpc3Qgb2YgcXVlcnkgYmFycmllcnMgbmVlZHMgdG8gYmUgY2xlYXJlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHZtd19xdWVyeV9zd2l0Y2hfYmFja29mZihzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgbmV4dCwgJnN3X2NvbnRleHQtPnF1ZXJ5X2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdChsaXN0KTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdm13X3RyYW5zbGF0ZV9ndWVzdF9wdHIoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCiAJCQkJICAgU1ZHQUd1ZXN0UHRyICpwdHIsCkBAIC0xOTEsOCArNDQ2LDYgQEAKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOwogCXVpbnQzMl90IGhhbmRsZSA9IHB0ci0+Z21ySWQ7CiAJc3RydWN0IHZtd19yZWxvY2F0aW9uICpyZWxvYzsKLQl1aW50MzJfdCBjdXJfdmFsaWRhdGVfbm9kZTsKLQlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqdmFsX2J1ZjsKIAlpbnQgcmV0OwogCiAJcmV0ID0gdm13X3VzZXJfZG1hYnVmX2xvb2t1cChzd19jb250ZXh0LT50ZmlsZSwgaGFuZGxlLCAmdm13X2JvKTsKQEAgLTIxMiwyMiArNDY1LDExIEBACiAJcmVsb2MgPSAmc3dfY29udGV4dC0+cmVsb2NzW3N3X2NvbnRleHQtPmN1cl9yZWxvYysrXTsKIAlyZWxvYy0+bG9jYXRpb24gPSBwdHI7CiAKLQljdXJfdmFsaWRhdGVfbm9kZSA9IHZtd19kbWFidWZfdmFsaWRhdGVfbm9kZShibywgc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYpOwotCWlmICh1bmxpa2VseShjdXJfdmFsaWRhdGVfbm9kZSA+PSBWTVdHRlhfTUFYX0dNUlMpKSB7Ci0JCURSTV9FUlJPUigiTWF4IG51bWJlciBvZiBETUEgYnVmZmVycyBwZXIgc3VibWlzc2lvbiIKLQkJCSAgIiBleGNlZWRlZC5cbiIpOwotCQlyZXQgPSAtRUlOVkFMOworCXJldCA9IHZtd19ib190b192YWxpZGF0ZV9saXN0KHN3X2NvbnRleHQsIGJvLCBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQywKKwkJCQkgICAgICAmcmVsb2MtPmluZGV4KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9ub19yZWxvYzsKLQl9CiAKLQlyZWxvYy0+aW5kZXggPSBjdXJfdmFsaWRhdGVfbm9kZTsKLQlpZiAodW5saWtlbHkoY3VyX3ZhbGlkYXRlX25vZGUgPT0gc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYpKSB7Ci0JCXZhbF9idWYgPSAmc3dfY29udGV4dC0+dmFsX2J1ZnNbY3VyX3ZhbGlkYXRlX25vZGVdOwotCQl2YWxfYnVmLT5ibyA9IHR0bV9ib19yZWZlcmVuY2UoYm8pOwotCQl2YWxfYnVmLT5uZXdfc3luY19vYmpfYXJnID0gKHZvaWQgKikgZGV2X3ByaXY7Ci0JCWxpc3RfYWRkX3RhaWwoJnZhbF9idWYtPmhlYWQsICZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2Rlcyk7Ci0JCSsrc3dfY29udGV4dC0+Y3VyX3ZhbF9idWY7Ci0JfQogCSp2bXdfYm9fcCA9IHZtd19ibzsKIAlyZXR1cm4gMDsKIApAQCAtMjU5LDggKzUwMSwxMSBAQAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7CiAKKwlyZXQgPSB2bXdfcXVlcnlfYm9fc3dpdGNoX3ByZXBhcmUoZGV2X3ByaXYsIGNtZC0+cS5jaWQsCisJCQkJCSAgJnZtd19iby0+YmFzZSwgc3dfY29udGV4dCk7CisKIAl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2bXdfYm8pOwotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdm13X2NtZF93YWl0X3F1ZXJ5KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC0yNzMsNiArNTE4LDcgQEAKIAkJU1ZHQTNkQ21kV2FpdEZvclF1ZXJ5IHE7CiAJfSAqY21kOwogCWludCByZXQ7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqY3R4OwogCiAJY21kID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHZtd19xdWVyeV9jbWQsIGhlYWRlcik7CiAJcmV0ID0gdm13X2NtZF9jaWRfY2hlY2soZGV2X3ByaXYsIHN3X2NvbnRleHQsIGhlYWRlcik7CkBAIC0yODYsMTAgKzUzMiwxOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJdm13X2RtYWJ1Zl91bnJlZmVyZW5jZSgmdm13X2JvKTsKKworCS8qCisJICogVGhpcyB3YWl0IHdpbGwgYWN0IGFzIGEgYmFycmllciBmb3IgcHJldmlvdXMgd2FpdHMgZm9yIHRoaXMKKwkgKiBjb250ZXh0LgorCSAqLworCisJY3R4ID0gc3dfY29udGV4dC0+Y3VyX2N0eDsKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cXVlcnlfaGVhZCkpCisJCWxpc3RfZGVsX2luaXQoJmN0eC0+cXVlcnlfaGVhZCk7CisKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHZtd19jbWRfZG1hKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCSAgICAgICBzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQsCiAJCSAgICAgICBTVkdBM2RDbWRIZWFkZXIgKmhlYWRlcikKQEAgLTMwMiw2ICs1NTcsNyBAQAogCQlTVkdBM2RDbWRTdXJmYWNlRE1BIGRtYTsKIAl9ICpjbWQ7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXM7CiAKIAljbWQgPSBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3Qgdm13X2RtYV9jbWQsIGhlYWRlcik7CiAJcmV0ID0gdm13X3RyYW5zbGF0ZV9ndWVzdF9wdHIoZGV2X3ByaXYsIHN3X2NvbnRleHQsCkBAIC0zMTgsMTggKzU3NCwyOCBAQAogCQlnb3RvIG91dF9ub19yZWxvYzsKIAl9CiAKLQkvKioKKwlyZXQgPSB2bXdfc3VyZmFjZV92YWxpZGF0ZShkZXZfcHJpdiwgc3JmKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJRFJNX0VSUk9SKCJDdWxkIG5vdCB2YWxpZGF0ZSBzdXJmYWNlLlxuIik7CisJCWdvdG8gb3V0X25vX3ZhbGlkYXRlOworCX0KKworCS8qCiAJICogUGF0Y2ggY29tbWFuZCBzdHJlYW0gd2l0aCBkZXZpY2UgU0lELgogCSAqLwotCiAJY21kLT5kbWEuaG9zdC5zaWQgPSBzcmYtPnJlcy5pZDsKIAl2bXdfa21zX2N1cnNvcl9zbm9vcChzcmYsIHN3X2NvbnRleHQtPnRmaWxlLCBibywgaGVhZGVyKTsKLQkvKioKLQkgKiBGSVhNRTogTWF5IGRlYWRsb2NrIGhlcmUgd2hlbiBjYWxsZWQgZnJvbSB0aGUKLQkgKiBjb21tYW5kIHBhcnNpbmcgY29kZS4KLQkgKi8KLQl2bXdfc3VyZmFjZV91bnJlZmVyZW5jZSgmc3JmKTsKIAorCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7CisKKwlyZXMgPSAmc3JmLT5yZXM7CisJdm13X3Jlc291cmNlX3RvX3ZhbGlkYXRlX2xpc3Qoc3dfY29udGV4dCwgJnJlcyk7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX3ZhbGlkYXRlOgorCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzcmYpOwogb3V0X25vX3JlbG9jOgogCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJnZtd19ibyk7CiAJcmV0dXJuIHJldDsKQEAgLTQxOSw2ICs2ODUsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2bXdfY21kX2NoZWNrX2RlZmluZV9nbXJmYihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQkgICAgICB2b2lkICpidWYpCit7CisJc3RydWN0IHZtd19kbWFfYnVmZmVyICp2bXdfYm87CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWREZWZpbmVHTVJGQiBib2R5OworCX0gKmNtZCA9IGJ1ZjsKKworCXJldCA9IHZtd190cmFuc2xhdGVfZ3Vlc3RfcHRyKGRldl9wcml2LCBzd19jb250ZXh0LAorCQkJCSAgICAgICZjbWQtPmJvZHkucHRyLAorCQkJCSAgICAgICZ2bXdfYm8pOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2bXdfYm8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bXdfY21kX2NoZWNrX25vdF8zZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCXN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKKwkJCQl2b2lkICpidWYsIHVpbnQzMl90ICpzaXplKQoreworCXVpbnQzMl90IHNpemVfcmVtYWluaW5nID0gKnNpemU7CisJdWludDMyX3QgY21kX2lkOworCisJY21kX2lkID0gbGUzMl90b19jcHUoKCh1aW50MzJfdCAqKWJ1ZilbMF0pOworCXN3aXRjaCAoY21kX2lkKSB7CisJY2FzZSBTVkdBX0NNRF9VUERBVEU6CisJCSpzaXplID0gc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihTVkdBRmlmb0NtZFVwZGF0ZSk7CisJCWJyZWFrOworCWNhc2UgU1ZHQV9DTURfREVGSU5FX0dNUkZCOgorCQkqc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoU1ZHQUZpZm9DbWREZWZpbmVHTVJGQik7CisJCWJyZWFrOworCWNhc2UgU1ZHQV9DTURfQkxJVF9HTVJGQl9UT19TQ1JFRU46CisJCSpzaXplID0gc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihTVkdBRmlmb0NtZEJsaXRHTVJGQlRvU2NyZWVuKTsKKwkJYnJlYWs7CisJY2FzZSBTVkdBX0NNRF9CTElUX1NDUkVFTl9UT19HTVJGQjoKKwkJKnNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKFNWR0FGaWZvQ21kQmxpdEdNUkZCVG9TY3JlZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIlVuc3VwcG9ydGVkIFNWR0EgY29tbWFuZDogJXUuXG4iLCBjbWRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKnNpemUgPiBzaXplX3JlbWFpbmluZykgeworCQlEUk1fRVJST1IoIkludmFsaWQgU1ZHQSBjb21tYW5kIChzaXplIG1pc21hdGNoKToiCisJCQkgICIgJXUuXG4iLCBjbWRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodW5saWtlbHkoIXN3X2NvbnRleHQtPmtlcm5lbCkpIHsKKwkJRFJNX0VSUk9SKCJLZXJuZWwgb25seSBTVkdBIGNvbW1hbmQ6ICV1LlxuIiwgY21kX2lkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoY21kX2lkID09IFNWR0FfQ01EX0RFRklORV9HTVJGQikKKwkJcmV0dXJuIHZtd19jbWRfY2hlY2tfZGVmaW5lX2dtcmZiKGRldl9wcml2LCBzd19jb250ZXh0LCBidWYpOworCisJcmV0dXJuIDA7Cit9CiAKIHR5cGVkZWYgaW50ICgqdm13X2NtZF9mdW5jKSAoc3RydWN0IHZtd19wcml2YXRlICosCiAJCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqLApAQCAtNDcxLDExICs4MDIsMTEgQEAKIAlTVkdBM2RDbWRIZWFkZXIgKmhlYWRlciA9IChTVkdBM2RDbWRIZWFkZXIgKikgYnVmOwogCWludCByZXQ7CiAKLQljbWRfaWQgPSAoKHVpbnQzMl90ICopYnVmKVswXTsKLQlpZiAoY21kX2lkID09IFNWR0FfQ01EX1VQREFURSkgewotCQkqc2l6ZSA9IDUgPDwgMjsKLQkJcmV0dXJuIDA7Ci0JfQorCWNtZF9pZCA9IGxlMzJfdG9fY3B1KCgodWludDMyX3QgKilidWYpWzBdKTsKKwkvKiBIYW5kbGUgYW55IG5vbmUgM0QgY29tbWFuZHMgKi8KKwlpZiAodW5saWtlbHkoY21kX2lkIDwgU1ZHQV9DTURfTUFYKSkKKwkJcmV0dXJuIHZtd19jbWRfY2hlY2tfbm90XzNkKGRldl9wcml2LCBzd19jb250ZXh0LCBidWYsIHNpemUpOworCiAKIAljbWRfaWQgPSBsZTMyX3RvX2NwdShoZWFkZXItPmlkKTsKIAkqc2l6ZSA9IGxlMzJfdG9fY3B1KGhlYWRlci0+c2l6ZSkgKyBzaXplb2YoU1ZHQTNkQ21kSGVhZGVyKTsKQEAgLTUwMCw3ICs4MzEsOCBAQAogCiBzdGF0aWMgaW50IHZtd19jbWRfY2hlY2tfYWxsKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkgICAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKLQkJCSAgICAgdm9pZCAqYnVmLCB1aW50MzJfdCBzaXplKQorCQkJICAgICB2b2lkICpidWYsCisJCQkgICAgIHVpbnQzMl90IHNpemUpCiB7CiAJaW50MzJfdCBjdXJfc2l6ZSA9IHNpemU7CiAJaW50IHJldDsKQEAgLTU1MCw3ICs4ODIsMTEgQEAKIHN0YXRpYyB2b2lkIHZtd19jbGVhcl92YWxpZGF0aW9ucyhzdHJ1Y3Qgdm13X3N3X2NvbnRleHQgKnN3X2NvbnRleHQpCiB7CiAJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5LCAqbmV4dDsKKwlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsICpyZXNfbmV4dDsKIAorCS8qCisJICogRHJvcCByZWZlcmVuY2VzIHRvIERNQSBidWZmZXJzIGhlbGQgZHVyaW5nIGNvbW1hbmQgc3VibWlzc2lvbi4KKwkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2RlcywKIAkJCQkgaGVhZCkgewogCQlsaXN0X2RlbCgmZW50cnktPmhlYWQpOwpAQCAtNTU5LDYgKzg5NSwxNiBAQAogCQlzd19jb250ZXh0LT5jdXJfdmFsX2J1Zi0tOwogCX0KIAlCVUdfT04oc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYgIT0gMCk7CisKKwkvKgorCSAqIERyb3AgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMgaGVsZCBkdXJpbmcgY29tbWFuZCBzdWJtaXNzaW9uLgorCSAqLworCXZtd19yZXNvdXJjZV91bnJlc2VydmUoJnN3X2NvbnRleHQtPnJlc291cmNlX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIHJlc19uZXh0LCAmc3dfY29udGV4dC0+cmVzb3VyY2VfbGlzdCwKKwkJCQkgdmFsaWRhdGVfaGVhZCkgeworCQlsaXN0X2RlbF9pbml0KCZyZXMtPnZhbGlkYXRlX2hlYWQpOworCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7CisJfQogfQogCiBzdGF0aWMgaW50IHZtd192YWxpZGF0ZV9zaW5nbGVfYnVmZmVyKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC01NjYsNiArOTEyLDE2IEBACiB7CiAJaW50IHJldDsKIAorCisJLyoKKwkgKiBEb24ndCB2YWxpZGF0ZSBwaW5uZWQgYnVmZmVycy4KKwkgKi8KKworCWlmIChibyA9PSBkZXZfcHJpdi0+cGlubmVkX2JvIHx8CisJICAgIChibyA9PSBkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8gJiYKKwkgICAgIGRldl9wcml2LT5kdW1teV9xdWVyeV9ib19waW5uZWQpKQorCQlyZXR1cm4gMDsKKwogCS8qKgogCSAqIFB1dCBCTyBpbiBWUkFNIGlmIHRoZXJlIGlzIHNwYWNlLCBvdGhlcndpc2UgYXMgYSBHTVIuCiAJICogSWYgdGhlcmUgaXMgbm8gc3BhY2UgaW4gVlJBTSBhbmQgR01SIGlkcyBhcmUgYWxsIHVzZWQgdXAsCkBAIC02MDIsNTcgKzk1OCwyMDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZtd19leGVjYnVmX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorc3RhdGljIGludCB2bXdfcmVzaXplX2NtZF9ib3VuY2Uoc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0LAorCQkJCSB1aW50MzJfdCBzaXplKQogewotCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOwotCXN0cnVjdCBkcm1fdm13X2V4ZWNidWZfYXJnICphcmcgPSAoc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgKilkYXRhOwotCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBmZW5jZV9yZXA7Ci0Jc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqdXNlcl9mZW5jZV9yZXA7Ci0JaW50IHJldDsKLQl2b2lkICp1c2VyX2NtZDsKLQl2b2lkICpjbWQ7Ci0JdWludDMyX3Qgc2VxdWVuY2U7Ci0Jc3RydWN0IHZtd19zd19jb250ZXh0ICpzd19jb250ZXh0ID0gJmRldl9wcml2LT5jdHg7Ci0Jc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKKwlpZiAobGlrZWx5KHN3X2NvbnRleHQtPmNtZF9ib3VuY2Vfc2l6ZSA+PSBzaXplKSkKKwkJcmV0dXJuIDA7CiAKLQlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlyZXR1cm4gcmV0OworCWlmIChzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgPT0gMCkKKwkJc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplID0gVk1XR0ZYX0NNRF9CT1VOQ0VfSU5JVF9TSVpFOworCisJd2hpbGUgKHN3X2NvbnRleHQtPmNtZF9ib3VuY2Vfc2l6ZSA8IHNpemUpIHsKKwkJc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplID0KKwkJCVBBR0VfQUxJR04oc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplICsKKwkJCQkgICAoc3dfY29udGV4dC0+Y21kX2JvdW5jZV9zaXplID4+IDEpKTsKKwl9CisKKwlpZiAoc3dfY29udGV4dC0+Y21kX2JvdW5jZSAhPSBOVUxMKQorCQl2ZnJlZShzd19jb250ZXh0LT5jbWRfYm91bmNlKTsKKworCXN3X2NvbnRleHQtPmNtZF9ib3VuY2UgPSB2bWFsbG9jKHN3X2NvbnRleHQtPmNtZF9ib3VuY2Vfc2l6ZSk7CisKKwlpZiAoc3dfY29udGV4dC0+Y21kX2JvdW5jZSA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbW1hbmQgYm91bmNlIGJ1ZmZlci5cbiIpOworCQlzd19jb250ZXh0LT5jbWRfYm91bmNlX3NpemUgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyAtIGNyZWF0ZSBhbmQgc3VibWl0IGEgY29tbWFuZCBzdHJlYW0gZmVuY2UKKyAqCisgKiBDcmVhdGVzIGEgZmVuY2Ugb2JqZWN0IGFuZCBzdWJtaXRzIGEgY29tbWFuZCBzdHJlYW0gbWFya2VyLgorICogSWYgdGhpcyBmYWlscyBmb3Igc29tZSByZWFzb24sIFdlIHN5bmMgdGhlIGZpZm8gYW5kIHJldHVybiBOVUxMLgorICogSXQgaXMgdGhlbiBzYWZlIHRvIGZlbmNlIGJ1ZmZlcnMgd2l0aCBhIE5VTEwgcG9pbnRlci4KKyAqCisgKiBJZiBAcF9oYW5kbGUgaXMgbm90IE5VTEwgQGZpbGVfcHJpdiBtdXN0IGFsc28gbm90IGJlIE5VTEwuIENyZWF0ZXMKKyAqIGEgdXNlcnNwYWNlIGhhbmRsZSBpZiBAcF9oYW5kbGUgaXMgbm90IE5VTEwsIG90aGVyd2lzZSBub3QuCisgKi8KKworaW50IHZtd19leGVjYnVmX2ZlbmNlX2NvbW1hbmRzKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICAgICAgIHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19mZW5jZV9vYmogKipwX2ZlbmNlLAorCQkJICAgICAgIHVpbnQzMl90ICpwX2hhbmRsZSkKK3sKKwl1aW50MzJfdCBzZXF1ZW5jZTsKKwlpbnQgcmV0OworCWJvb2wgc3luY2VkID0gZmFsc2U7CisKKwkvKiBwX2hhbmRsZSBpbXBsaWVzIGZpbGVfcHJpdi4gKi8KKwlCVUdfT04ocF9oYW5kbGUgIT0gTlVMTCAmJiBmaWxlX3ByaXYgPT0gTlVMTCk7CisKKwlyZXQgPSB2bXdfZmlmb19zZW5kX2ZlbmNlKGRldl9wcml2LCAmc2VxdWVuY2UpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGZW5jZSBzdWJtaXNzaW9uIGVycm9yLiBTeW5jaW5nLlxuIik7CisJCXN5bmNlZCA9IHRydWU7CisJfQorCisJaWYgKHBfaGFuZGxlICE9IE5VTEwpCisJCXJldCA9IHZtd191c2VyX2ZlbmNlX2NyZWF0ZShmaWxlX3ByaXYsIGRldl9wcml2LT5mbWFuLAorCQkJCQkgICAgc2VxdWVuY2UsCisJCQkJCSAgICBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQywKKwkJCQkJICAgIHBfZmVuY2UsIHBfaGFuZGxlKTsKKwllbHNlCisJCXJldCA9IHZtd19mZW5jZV9jcmVhdGUoZGV2X3ByaXYtPmZtYW4sIHNlcXVlbmNlLAorCQkJCSAgICAgICBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQywKKwkJCQkgICAgICAgcF9mZW5jZSk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDAgJiYgIXN5bmNlZCkpIHsKKwkJKHZvaWQpIHZtd19mYWxsYmFja193YWl0KGRldl9wcml2LCBmYWxzZSwgZmFsc2UsCisJCQkJCSBzZXF1ZW5jZSwgZmFsc2UsCisJCQkJCSBWTVdfRkVOQ0VfV0FJVF9USU1FT1VUKTsKKwkJKnBfZmVuY2UgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZtd19leGVjYnVmX2NvcHlfZmVuY2VfdXNlciAtIGNvcHkgZmVuY2Ugb2JqZWN0IGluZm9ybWF0aW9uIHRvCisgKiB1c2VyLXNwYWNlLgorICoKKyAqIEBkZXZfcHJpdjogUG9pbnRlciB0byBhIHZtd19wcml2YXRlIHN0cnVjdC4KKyAqIEB2bXdfZnA6IFBvaW50ZXIgdG8gdGhlIHN0cnVjdCB2bXdfZnByaXYgcmVwcmVzZW50aW5nIHRoZSBjYWxsaW5nIGZpbGUuCisgKiBAcmV0OiBSZXR1cm4gdmFsdWUgZnJvbSBmZW5jZSBvYmplY3QgY3JlYXRpb24uCisgKiBAdXNlcl9mZW5jZV9yZXA6IFVzZXIgc3BhY2UgYWRkcmVzcyBvZiBhIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCB0bworICogd2hpY2ggdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBjb3BpZWQuCisgKiBAZmVuY2U6IFBvaW50ZXIgdG8gdGhlIGZlbmMgb2JqZWN0LgorICogQGZlbmNlX2hhbmRsZTogVXNlci1zcGFjZSBmZW5jZSBoYW5kbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgZmVuY2UgaW5mb3JtYXRpb24gdG8gdXNlci1zcGFjZS4gSWYgY29weWluZyBmYWlscywKKyAqIFRoZSB1c2VyLXNwYWNlIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcDo6ZXJyb3IgbWVtYmVyIGlzIGhvcGVmdWxseQorICogbGVmdCB1bnRvdWNoZWQsIGFuZCBpZiBpdCdzIHByZWxvYWRlZCB3aXRoIGFuIC1FRkFVTFQgYnkgdXNlci1zcGFjZSwKKyAqIHRoZSBlcnJvciB3aWxsIGhvcGVmdWxseSBiZSBkZXRlY3RlZC4KKyAqIEFsc28gaWYgY29weWluZyBmYWlscywgdXNlci1zcGFjZSB3aWxsIGJlIHVuYWJsZSB0byBzaWduYWwgdGhlIGZlbmNlCisgKiBvYmplY3Qgc28gd2Ugd2FpdCBmb3IgaXQgaW1tZWRpYXRlbHksIGFuZCB0aGVuIHVucmVmZXJlbmNlIHRoZQorICogdXNlci1zcGFjZSByZWZlcmVuY2UuCisgKi8KK3ZvaWQKK3Ztd19leGVjYnVmX2NvcHlfZmVuY2VfdXNlcihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgIHN0cnVjdCB2bXdfZnByaXYgKnZtd19mcCwKKwkJCSAgICBpbnQgcmV0LAorCQkJICAgIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwLAorCQkJICAgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKKwkJCSAgICB1aW50MzJfdCBmZW5jZV9oYW5kbGUpCit7CisJc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIGZlbmNlX3JlcDsKKworCWlmICh1c2VyX2ZlbmNlX3JlcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmZlbmNlX3JlcCwgMCwgc2l6ZW9mKGZlbmNlX3JlcCkpOworCisJZmVuY2VfcmVwLmVycm9yID0gcmV0OworCWlmIChyZXQgPT0gMCkgeworCQlCVUdfT04oZmVuY2UgPT0gTlVMTCk7CisKKwkJZmVuY2VfcmVwLmhhbmRsZSA9IGZlbmNlX2hhbmRsZTsKKwkJZmVuY2VfcmVwLnNlcW5vID0gZmVuY2UtPnNlcW5vOworCQl2bXdfdXBkYXRlX3NlcW5vKGRldl9wcml2LCAmZGV2X3ByaXYtPmZpZm8pOworCQlmZW5jZV9yZXAucGFzc2VkX3NlcW5vID0gZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubzsKKwl9CisKKwkvKgorCSAqIGNvcHlfdG9fdXNlciBlcnJvcnMgd2lsbCBiZSBkZXRlY3RlZCBieSB1c2VyIHNwYWNlIG5vdAorCSAqIHNlZWluZyBmZW5jZV9yZXA6OmVycm9yIGZpbGxlZCBpbi4gVHlwaWNhbGx5CisJICogdXNlci1zcGFjZSB3b3VsZCBoYXZlIHByZS1zZXQgdGhhdCBtZW1iZXIgdG8gLUVGQVVMVC4KKwkgKi8KKwlyZXQgPSBjb3B5X3RvX3VzZXIodXNlcl9mZW5jZV9yZXAsICZmZW5jZV9yZXAsCisJCQkgICBzaXplb2YoZmVuY2VfcmVwKSk7CisKKwkvKgorCSAqIFVzZXItc3BhY2UgbG9zdCB0aGUgZmVuY2Ugb2JqZWN0LiBXZSBuZWVkIHRvIHN5bmMKKwkgKiBhbmQgdW5yZWZlcmVuY2UgdGhlIGhhbmRsZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocmV0ICE9IDApICYmIChmZW5jZV9yZXAuZXJyb3IgPT0gMCkpIHsKKwkJdHRtX3JlZl9vYmplY3RfYmFzZV91bnJlZih2bXdfZnAtPnRmaWxlLAorCQkJCQkgIGZlbmNlX2hhbmRsZSwgVFRNX1JFRl9VU0FHRSk7CisJCURSTV9FUlJPUigiRmVuY2UgY29weSBlcnJvci4gU3luY2luZy5cbiIpOworCQkodm9pZCkgdm13X2ZlbmNlX29ial93YWl0KGZlbmNlLCBmZW5jZS0+c2lnbmFsX21hc2ssCisJCQkJCSAgZmFsc2UsIGZhbHNlLAorCQkJCQkgIFZNV19GRU5DRV9XQUlUX1RJTUVPVVQpOworCX0KK30KKworaW50IHZtd19leGVjYnVmX3Byb2Nlc3Moc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJdm9pZCBfX3VzZXIgKnVzZXJfY29tbWFuZHMsCisJCQl2b2lkICprZXJuZWxfY29tbWFuZHMsCisJCQl1aW50MzJfdCBjb21tYW5kX3NpemUsCisJCQl1aW50NjRfdCB0aHJvdHRsZV91cywKKwkJCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwKQoreworCXN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCA9ICZkZXZfcHJpdi0+Y3R4OworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZTsKKwl1aW50MzJfdCBoYW5kbGU7CisJdm9pZCAqY21kOworCWludCByZXQ7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIG91dF9ub19jbWRfbXV0ZXg7Ci0JfQorCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBhcmctPmNvbW1hbmRfc2l6ZSk7Ci0JaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgewotCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgZmlmbyBzcGFjZSBmb3IgY29tbWFuZHMuXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KKwlpZiAoa2VybmVsX2NvbW1hbmRzID09IE5VTEwpIHsKKwkJc3dfY29udGV4dC0+a2VybmVsID0gZmFsc2U7CiAKLQl1c2VyX2NtZCA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWFyZy0+Y29tbWFuZHM7Ci0JcmV0ID0gY29weV9mcm9tX3VzZXIoY21kLCB1c2VyX2NtZCwgYXJnLT5jb21tYW5kX3NpemUpOworCQlyZXQgPSB2bXdfcmVzaXplX2NtZF9ib3VuY2Uoc3dfY29udGV4dCwgY29tbWFuZF9zaXplKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKIAotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgY29weWluZyBjb21tYW5kcy5cbiIpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQorCisJCXJldCA9IGNvcHlfZnJvbV91c2VyKHN3X2NvbnRleHQtPmNtZF9ib3VuY2UsCisJCQkJICAgICB1c2VyX2NvbW1hbmRzLCBjb21tYW5kX3NpemUpOworCisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlEUk1fRVJST1IoIkZhaWxlZCBjb3B5aW5nIGNvbW1hbmRzLlxuIik7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJa2VybmVsX2NvbW1hbmRzID0gc3dfY29udGV4dC0+Y21kX2JvdW5jZTsKKwl9IGVsc2UKKwkJc3dfY29udGV4dC0+a2VybmVsID0gdHJ1ZTsKIAogCXN3X2NvbnRleHQtPnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOwogCXN3X2NvbnRleHQtPmNpZF92YWxpZCA9IGZhbHNlOwogCXN3X2NvbnRleHQtPnNpZF92YWxpZCA9IGZhbHNlOwogCXN3X2NvbnRleHQtPmN1cl9yZWxvYyA9IDA7CiAJc3dfY29udGV4dC0+Y3VyX3ZhbF9idWYgPSAwOworCXN3X2NvbnRleHQtPmZlbmNlX2ZsYWdzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmc3dfY29udGV4dC0+cXVlcnlfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnN3X2NvbnRleHQtPnJlc291cmNlX2xpc3QpOworCXN3X2NvbnRleHQtPmN1cl9xdWVyeV9ibyA9IGRldl9wcml2LT5waW5uZWRfYm87CisJc3dfY29udGV4dC0+Y3VyX3F1ZXJ5X2NpZCA9IGRldl9wcml2LT5xdWVyeV9jaWQ7CisJc3dfY29udGV4dC0+cXVlcnlfY2lkX3ZhbGlkID0gKGRldl9wcml2LT5waW5uZWRfYm8gIT0gTlVMTCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOwogCi0JcmV0ID0gdm13X2NtZF9jaGVja19hbGwoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGNtZCwgYXJnLT5jb21tYW5kX3NpemUpOworCXJldCA9IHZtd19jbWRfY2hlY2tfYWxsKGRldl9wcml2LCBzd19jb250ZXh0LCBrZXJuZWxfY29tbWFuZHMsCisJCQkJY29tbWFuZF9zaXplKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9lcnI7CisKIAlyZXQgPSB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2Rlcyk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfZXJyOwpAQCAtNjYzLDU3ICsxMTcwLDIwNiBAQAogCiAJdm13X2FwcGx5X3JlbG9jYXRpb25zKHN3X2NvbnRleHQpOwogCi0JaWYgKGFyZy0+dGhyb3R0bGVfdXMpIHsKLQkJcmV0ID0gdm13X3dhaXRfbGFnKGRldl9wcml2LCAmZGV2X3ByaXYtPmZpZm8uZmVuY2VfcXVldWUsCi0JCQkJICAgYXJnLT50aHJvdHRsZV91cyk7CisJaWYgKHRocm90dGxlX3VzKSB7CisJCXJldCA9IHZtd193YWl0X2xhZyhkZXZfcHJpdiwgJmRldl9wcml2LT5maWZvLm1hcmtlcl9xdWV1ZSwKKwkJCQkgICB0aHJvdHRsZV91cyk7CiAKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJCWdvdG8gb3V0X2VycjsKKwkJCWdvdG8gb3V0X3Rocm90dGxlOwogCX0KIAotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgYXJnLT5jb21tYW5kX3NpemUpOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGNvbW1hbmRfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgZmlmbyBzcGFjZSBmb3IgY29tbWFuZHMuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdGhyb3R0bGU7CisJfQogCi0JcmV0ID0gdm13X2ZpZm9fc2VuZF9mZW5jZShkZXZfcHJpdiwgJnNlcXVlbmNlKTsKKwltZW1jcHkoY21kLCBrZXJuZWxfY29tbWFuZHMsIGNvbW1hbmRfc2l6ZSk7CisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBjb21tYW5kX3NpemUpOwogCi0JdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2RlcywKLQkJCQkgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykgc2VxdWVuY2UpOwotCXZtd19jbGVhcl92YWxpZGF0aW9ucyhzd19jb250ZXh0KTsKLQltdXRleF91bmxvY2soJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwotCisJdm13X3F1ZXJ5X2JvX3N3aXRjaF9jb21taXQoZGV2X3ByaXYsIHN3X2NvbnRleHQpOworCXJldCA9IHZtd19leGVjYnVmX2ZlbmNlX2NvbW1hbmRzKGZpbGVfcHJpdiwgZGV2X3ByaXYsCisJCQkJCSAmZmVuY2UsCisJCQkJCSAodXNlcl9mZW5jZV9yZXApID8gJmhhbmRsZSA6IE5VTEwpOwogCS8qCiAJICogVGhpcyBlcnJvciBpcyBoYXJtbGVzcywgYmVjYXVzZSBpZiBmZW5jZSBzdWJtaXNzaW9uIGZhaWxzLAotCSAqIHZtd19maWZvX3NlbmRfZmVuY2Ugd2lsbCBzeW5jLgorCSAqIHZtd19maWZvX3NlbmRfZmVuY2Ugd2lsbCBzeW5jLiBUaGUgZXJyb3Igd2lsbCBiZSBwcm9wYWdhdGVkIHRvCisJICogdXNlci1zcGFjZSBpbiBAZmVuY2VfcmVwCiAJICovCiAKIAlpZiAocmV0ICE9IDApCiAJCURSTV9FUlJPUigiRmVuY2Ugc3VibWlzc2lvbiBlcnJvci4gU3luY2luZy5cbiIpOwogCi0JZmVuY2VfcmVwLmVycm9yID0gcmV0OwotCWZlbmNlX3JlcC5mZW5jZV9zZXEgPSAodWludDY0X3QpIHNlcXVlbmNlOwotCWZlbmNlX3JlcC5wYWQ2NCA9IDA7CisJdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2RlcywKKwkJCQkgICAgKHZvaWQgKikgZmVuY2UpOwogCi0JdXNlcl9mZW5jZV9yZXAgPSAoc3RydWN0IGRybV92bXdfZmVuY2VfcmVwIF9fdXNlciAqKQotCSAgICAodW5zaWduZWQgbG9uZylhcmctPmZlbmNlX3JlcDsKKwl2bXdfY2xlYXJfdmFsaWRhdGlvbnMoc3dfY29udGV4dCk7CisJdm13X2V4ZWNidWZfY29weV9mZW5jZV91c2VyKGRldl9wcml2LCB2bXdfZnByaXYoZmlsZV9wcml2KSwgcmV0LAorCQkJCSAgICB1c2VyX2ZlbmNlX3JlcCwgZmVuY2UsIGhhbmRsZSk7CiAKLQkvKgotCSAqIGNvcHlfdG9fdXNlciBlcnJvcnMgd2lsbCBiZSBkZXRlY3RlZCBieSB1c2VyIHNwYWNlIG5vdAotCSAqIHNlZWluZyBmZW5jZV9yZXA6OmVycm9yIGZpbGxlZCBpbi4KLQkgKi8KKwlpZiAobGlrZWx5KGZlbmNlICE9IE5VTEwpKQorCQl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7CiAKLQlyZXQgPSBjb3B5X3RvX3VzZXIodXNlcl9mZW5jZV9yZXAsICZmZW5jZV9yZXAsIHNpemVvZihmZW5jZV9yZXApKTsKLQotCXZtd19rbXNfY3Vyc29yX3Bvc3RfZXhlY2J1ZihkZXZfcHJpdik7Ci0JdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5jbWRidWZfbXV0ZXgpOwogCXJldHVybiAwOworCiBvdXRfZXJyOgogCXZtd19mcmVlX3JlbG9jYXRpb25zKHN3X2NvbnRleHQpOworb3V0X3Rocm90dGxlOgorCXZtd19xdWVyeV9zd2l0Y2hfYmFja29mZihzd19jb250ZXh0KTsKIAl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOwogCXZtd19jbGVhcl92YWxpZGF0aW9ucyhzd19jb250ZXh0KTsKLW91dF9jb21taXQ6Ci0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCAwKTsKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKLW91dF9ub19jbWRfbXV0ZXg6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB2bXdfZXhlY2J1Zl91bnBpbl9wYW5pYyAtIElkbGUgdGhlIGZpZm8gYW5kIHVucGluIHRoZSBxdWVyeSBidWZmZXIuCisgKgorICogQGRldl9wcml2OiBUaGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGlkbGUgdGhlIGZpZm8gYW5kIHVucGluIHRoZSBxdWVyeSBidWZmZXIKKyAqIGlmIHRoZSBub3JtYWwgd2F5IHRvIGRvIHRoaXMgaGl0cyBhbiBlcnJvciwgd2hpY2ggc2hvdWxkIHR5cGljYWxseSBiZQorICogZXh0cmVtZWx5IHJhcmUuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19leGVjYnVmX3VucGluX3BhbmljKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJRFJNX0VSUk9SKCJDYW4ndCB1bnBpbiBxdWVyeSBidWZmZXIuIFRyeWluZyB0byByZWNvdmVyLlxuIik7CisKKwkodm9pZCkgdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGZhbHNlLCB0cnVlLCAwLCBmYWxzZSwgMTAqSFopOworCXZtd19ib19waW4oZGV2X3ByaXYtPnBpbm5lZF9ibywgZmFsc2UpOworCXZtd19ib19waW4oZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvLCBmYWxzZSk7CisJZGV2X3ByaXYtPmR1bW15X3F1ZXJ5X2JvX3Bpbm5lZCA9IGZhbHNlOworfQorCisKKy8qKgorICogdm13X2V4ZWNidWZfcmVsZWFzZV9waW5uZWRfYm8gLSBGbHVzaCBxdWVyaWVzIGFuZCB1bnBpbiB0aGUgcGlubmVkCisgKiBxdWVyeSBiby4KKyAqCisgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiBAb25seV9vbl9jaWRfbWF0Y2g6IE9ubHkgZmx1c2ggYW5kIHVucGluIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBxdWVyeSBjaWQKKyAqIG1hdGNoZXMgQGNpZC4KKyAqIEBjaWQ6IE9wdGlvbmFsIGNvbnRleHQgaWQgdG8gbWF0Y2guCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB0byB1bnBpbiB0aGUgcGlubmVkIHF1ZXJ5IGJvLCBvcgorICogYXMgYSBxdWVyeSBiYXJyaWVyIHdoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcXVlcmllcyBoYXZlCisgKiBmaW5pc2hlZCBiZWZvcmUgdGhlIG5leHQgZmlmbyBjb21tYW5kLiAoRm9yIGV4YW1wbGUgb24gaGFyZHdhcmUKKyAqIGNvbnRleHQgZGVzdHJ1Y3Rpb25zIHdoZXJlIHRoZSBoYXJkd2FyZSBtYXkgb3RoZXJ3aXNlIGxlYWsgdW5maW5pc2hlZAorICogcXVlcmllcykuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYW55IGZhaWx1cmUgY29kZXMsIGJ1dCBtYWtlIGF0dGVtcHRzCisgKiB0byBkbyBzYWZlIHVucGlubmluZyBpbiBjYXNlIG9mIGVycm9ycy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gd2lsbCBzeW5jaHJvbml6ZSBvbiB0aGUgcHJldmlvdXMgcXVlcnkgYmFycmllciwgYW5kIHdpbGwKKyAqIHRodXMgbm90IGZpbmlzaCB1bnRpbCB0aGF0IGJhcnJpZXIgaGFzIGV4ZWN1dGVkLgorICovCit2b2lkIHZtd19leGVjYnVmX3JlbGVhc2VfcGlubmVkX2JvKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgYm9vbCBvbmx5X29uX2NpZF9tYXRjaCwgdWludDMyX3QgY2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgdmFsaWRhdGVfbGlzdDsKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciBwaW5uZWRfdmFsLCBxdWVyeV92YWw7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7CisKKwlpZiAoZGV2X3ByaXYtPnBpbm5lZF9ibyA9PSBOVUxMKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAob25seV9vbl9jaWRfbWF0Y2ggJiYgY2lkICE9IGRldl9wcml2LT5xdWVyeV9jaWQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCUlOSVRfTElTVF9IRUFEKCZ2YWxpZGF0ZV9saXN0KTsKKworCXBpbm5lZF92YWwubmV3X3N5bmNfb2JqX2FyZyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCURSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOworCXBpbm5lZF92YWwuYm8gPSB0dG1fYm9fcmVmZXJlbmNlKGRldl9wcml2LT5waW5uZWRfYm8pOworCWxpc3RfYWRkX3RhaWwoJnBpbm5lZF92YWwuaGVhZCwgJnZhbGlkYXRlX2xpc3QpOworCisJcXVlcnlfdmFsLm5ld19zeW5jX29ial9hcmcgPSBwaW5uZWRfdmFsLm5ld19zeW5jX29ial9hcmc7CisJcXVlcnlfdmFsLmJvID0gdHRtX2JvX3JlZmVyZW5jZShkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8pOworCWxpc3RfYWRkX3RhaWwoJnF1ZXJ5X3ZhbC5oZWFkLCAmdmFsaWRhdGVfbGlzdCk7CisKKwlkbyB7CisJCXJldCA9IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoJnZhbGlkYXRlX2xpc3QpOworCX0gd2hpbGUgKHJldCA9PSAtRVJFU1RBUlRTWVMpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQl2bXdfZXhlY2J1Zl91bnBpbl9wYW5pYyhkZXZfcHJpdik7CisJCWdvdG8gb3V0X25vX3Jlc2VydmU7CisJfQorCisJcmV0ID0gdm13X2ZpZm9fZW1pdF9kdW1teV9xdWVyeShkZXZfcHJpdiwgZGV2X3ByaXYtPnF1ZXJ5X2NpZCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQl2bXdfZXhlY2J1Zl91bnBpbl9wYW5pYyhkZXZfcHJpdik7CisJCWdvdG8gb3V0X25vX2VtaXQ7CisJfQorCisJdm13X2JvX3BpbihkZXZfcHJpdi0+cGlubmVkX2JvLCBmYWxzZSk7CisJdm13X2JvX3BpbihkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm8sIGZhbHNlKTsKKwlkZXZfcHJpdi0+ZHVtbXlfcXVlcnlfYm9fcGlubmVkID0gZmFsc2U7CisKKwkodm9pZCkgdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoTlVMTCwgZGV2X3ByaXYsICZmZW5jZSwgTlVMTCk7CisJdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKCZ2YWxpZGF0ZV9saXN0LCAodm9pZCAqKSBmZW5jZSk7CisKKwl0dG1fYm9fdW5yZWYoJnF1ZXJ5X3ZhbC5ibyk7CisJdHRtX2JvX3VucmVmKCZwaW5uZWRfdmFsLmJvKTsKKwl0dG1fYm9fdW5yZWYoJmRldl9wcml2LT5waW5uZWRfYm8pOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7CisJcmV0dXJuOworCitvdXRfbm9fZW1pdDoKKwl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigmdmFsaWRhdGVfbGlzdCk7CitvdXRfbm9fcmVzZXJ2ZToKKwl0dG1fYm9fdW5yZWYoJnF1ZXJ5X3ZhbC5ibyk7CisJdHRtX2JvX3VucmVmKCZwaW5uZWRfdmFsLmJvKTsKKwl0dG1fYm9fdW5yZWYoJmRldl9wcml2LT5waW5uZWRfYm8pOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7Cit9CisKKworaW50IHZtd19leGVjYnVmX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCBkcm1fdm13X2V4ZWNidWZfYXJnICphcmcgPSAoc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgKilkYXRhOworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CisJaW50IHJldDsKKworCS8qCisJICogVGhpcyB3aWxsIGFsbG93IHVzIHRvIGV4dGVuZCB0aGUgaW9jdGwgYXJndW1lbnQgd2hpbGUKKwkgKiBtYWludGFpbmluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKKwkgKiBXZSB0YWtlIGRpZmZlcmVudCBjb2RlIHBhdGhzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKKwkgKiBhcmctPnZlcnNpb24uCisJICovCisKKwlpZiAodW5saWtlbHkoYXJnLT52ZXJzaW9uICE9IERSTV9WTVdfRVhFQ0JVRl9WRVJTSU9OKSkgeworCQlEUk1fRVJST1IoIkluY29ycmVjdCBleGVjYnVmIHZlcnNpb24uXG4iKTsKKwkJRFJNX0VSUk9SKCJZb3UncmUgcnVubmluZyBvdXRkYXRlZCBleHBlcmltZW50YWwgIgorCQkJICAidm13Z2Z4IHVzZXItc3BhY2UgZHJpdmVycy4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHZtd19leGVjYnVmX3Byb2Nlc3MoZmlsZV9wcml2LCBkZXZfcHJpdiwKKwkJCQkgICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWFyZy0+Y29tbWFuZHMsCisJCQkJICBOVUxMLCBhcmctPmNvbW1hbmRfc2l6ZSwgYXJnLT50aHJvdHRsZV91cywKKwkJCQkgICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWFyZy0+ZmVuY2VfcmVwKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXZtd19rbXNfY3Vyc29yX3Bvc3RfZXhlY2J1ZihkZXZfcHJpdik7CisKK291dF91bmxvY2s6CiAJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMKaW5kZXggYmZhYjYwYy4uMzRlNTFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAidm13Z2Z4X2Rydi5oIgogCkBAIC0xNTgsMTAgKzE2MCwxNCBAQAogewogCXN0cnVjdCB2bXdfZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdiA9IHBhci0+dm13X3ByaXY7CisJaW50IHJldDsKIAotCXZtd19rbXNfd3JpdGVfc3ZnYSh2bXdfcHJpdiwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAotCQkJICAgaW5mby0+Zml4LmxpbmVfbGVuZ3RoLAotCQkJICAgcGFyLT5icHAsIHBhci0+ZGVwdGgpOworCXJldCA9IHZtd19rbXNfd3JpdGVfc3ZnYSh2bXdfcHJpdiwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAorCQkJCSBpbmZvLT5maXgubGluZV9sZW5ndGgsCisJCQkJIHBhci0+YnBwLCBwYXItPmRlcHRoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKHZtd19wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9ESVNQTEFZX1RPUE9MT0dZKSB7CiAJCS8qIFRPRE8gY2hlY2sgaWYgcGl0Y2ggYW5kIG9mZnNldCBjaGFuZ2VzICovCiAJCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfTlVNX0dVRVNUX0RJU1BMQVlTLCAxKTsKQEAgLTQwNSwxNCArNDExLDE0IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJdW5zaWduZWQgaW5pdGlhbF93aWR0aCwgaW5pdGlhbF9oZWlnaHQ7CiAJdW5zaWduZWQgZmJfd2lkdGgsIGZiX2hlaWdodDsKLQl1bnNpZ25lZCBmYl9iYnAsIGZiX2RlcHRoLCBmYl9vZmZzZXQsIGZiX3BpdGNoLCBmYl9zaXplOworCXVuc2lnbmVkIGZiX2JwcCwgZmJfZGVwdGgsIGZiX29mZnNldCwgZmJfcGl0Y2gsIGZiX3NpemU7CiAJaW50IHJldDsKIAogCS8qIFhYWCBUaGVzZSBzaG91bGRuJ3QgYmUgaGFyZGNvZGVkLiAqLwogCWluaXRpYWxfd2lkdGggPSA4MDA7CiAJaW5pdGlhbF9oZWlnaHQgPSA2MDA7CiAKLQlmYl9iYnAgPSAzMjsKKwlmYl9icHAgPSAzMjsKIAlmYl9kZXB0aCA9IDI0OwogCiAJLyogWFhYIEFzIHNob3VsZG4ndCB0aGVzZSBiZSBhcyB3ZWxsLiAqLwpAQCAtNDIyLDcgKzQyOCw3IEBACiAJaW5pdGlhbF93aWR0aCA9IG1pbihmYl93aWR0aCwgaW5pdGlhbF93aWR0aCk7CiAJaW5pdGlhbF9oZWlnaHQgPSBtaW4oZmJfaGVpZ2h0LCBpbml0aWFsX2hlaWdodCk7CiAKLQlmYl9waXRjaCA9IGZiX3dpZHRoICogZmJfYmJwIC8gODsKKwlmYl9waXRjaCA9IGZiX3dpZHRoICogZmJfYnBwIC8gODsKIAlmYl9zaXplID0gZmJfcGl0Y2ggKiBmYl9oZWlnaHQ7CiAJZmJfb2Zmc2V0ID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0ZCX09GRlNFVCk7CiAKQEAgLTQzNyw3ICs0NDMsNyBAQAogCXBhciA9IGluZm8tPnBhcjsKIAlwYXItPnZtd19wcml2ID0gdm13X3ByaXY7CiAJcGFyLT5kZXB0aCA9IGZiX2RlcHRoOwotCXBhci0+YnBwID0gZmJfYmJwOworCXBhci0+YnBwID0gZmJfYnBwOwogCXBhci0+dm1hbGxvYyA9IE5VTEw7CiAJcGFyLT5tYXhfd2lkdGggPSBmYl93aWR0aDsKIAlwYXItPm1heF9oZWlnaHQgPSBmYl9oZWlnaHQ7CkBAIC01ODgsNTggKzU5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB2bXdfZG1hYnVmX2Zyb21fdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAotCQkJIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqdm13X2JvKQotewotCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSAmdm13X2JvLT5iYXNlOwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZ2bXdfc3lzX3BsYWNlbWVudCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JdHRtX2JvX3VucmVzZXJ2ZShibyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCi0JCQkJc3RydWN0IHZtd19kbWFfYnVmZmVyICp2bXdfYm8pCi17Ci0Jc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZ2bXdfYm8tPmJhc2U7Ci0Jc3RydWN0IHR0bV9wbGFjZW1lbnQgbmVfcGxhY2VtZW50ID0gdm13X3ZyYW1fbmVfcGxhY2VtZW50OwotCWludCByZXQgPSAwOwotCi0JbmVfcGxhY2VtZW50LmxwZm4gPSBiby0+bnVtX3BhZ2VzOwotCi0JLyogaW50ZXJ1cHRhYmxlPyAqLwotCXJldCA9IHR0bV93cml0ZV9sb2NrKCZ2bXdfcHJpdi0+YWN0aXZlX21hc3Rlci0+bG9jaywgZmFsc2UpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBlcnJfdW5sb2NrOwotCi0JaWYgKGJvLT5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0gJiYKLQkgICAgYm8tPm1lbS5zdGFydCA8IGJvLT5udW1fcGFnZXMgJiYKLQkgICAgYm8tPm1lbS5zdGFydCA+IDApCi0JCSh2b2lkKSB0dG1fYm9fdmFsaWRhdGUoYm8sICZ2bXdfc3lzX3BsYWNlbWVudCwgZmFsc2UsCi0JCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoYm8sICZuZV9wbGFjZW1lbnQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JLyogQ291bGQgcHJvYmFibHkgYnVnIG9uICovCi0JV0FSTl9PTihiby0+b2Zmc2V0ICE9IDApOwotCi0JdHRtX2JvX3VucmVzZXJ2ZShibyk7Ci1lcnJfdW5sb2NrOgotCXR0bV93cml0ZV91bmxvY2soJnZtd19wcml2LT5hY3RpdmVfbWFzdGVyLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIGludCB2bXdfZmJfb2ZmKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CkBAIC02NjEsNyArNjE1LDcgQEAKIAlwYXItPmJvX3B0ciA9IE5VTEw7CiAJdHRtX2JvX2t1bm1hcCgmcGFyLT5tYXApOwogCi0Jdm13X2RtYWJ1Zl9mcm9tX3ZyYW0odm13X3ByaXYsIHBhci0+dm13X2JvKTsKKwl2bXdfZG1hYnVmX3VucGluKHZtd19wcml2LCBwYXItPnZtd19ibywgZmFsc2UpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODcsNyArNjQxLDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhhdCBhbGwgb3ZlcmxheXMgYXJlIHN0b3BlZCB3aGVuIHdlIHRha2Ugb3ZlciAqLwogCXZtd19vdmVybGF5X3N0b3BfYWxsKHZtd19wcml2KTsKIAotCXJldCA9IHZtd19kbWFidWZfdG9fc3RhcnRfb2ZfdnJhbSh2bXdfcHJpdiwgcGFyLT52bXdfYm8pOworCXJldCA9IHZtd19kbWFidWZfdG9fc3RhcnRfb2ZfdnJhbSh2bXdfcHJpdiwgcGFyLT52bXdfYm8sIHRydWUsIGZhbHNlKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IG1vdmUgYnVmZmVyIHRvIHN0YXJ0IG9mIFZSQU1cbiIpOwogCQlnb3RvIGVycl9ub19idWZmZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmVuY2UuYwppbmRleCA2MWVhY2MxLi4xNWZiMjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKQEAgLTI1LDE0OSArMjUsMTEwMCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCisjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgInZtd2dmeF9kcnYuaCIKIAotc3RydWN0IHZtd19mZW5jZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCXVpbnQzMl90IHNlcXVlbmNlOwotCXN0cnVjdCB0aW1lc3BlYyBzdWJtaXR0ZWQ7CisjZGVmaW5lIFZNV19GRU5DRV9XUkFQICgxIDw8IDMxKQorCitzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgeworCWludCBudW1fZmVuY2Vfb2JqZWN0czsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2xpc3Q7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdTMyIHVzZXJfZmVuY2Vfc2l6ZTsKKwl1MzIgZmVuY2Vfc2l6ZTsKKwl1MzIgZXZlbnRfZmVuY2VfYWN0aW9uX3NpemU7CisJYm9vbCBmaWZvX2Rvd247CisJc3RydWN0IGxpc3RfaGVhZCBjbGVhbnVwX2xpc3Q7CisJdWludDMyX3QgcGVuZGluZ19hY3Rpb25zW1ZNV19BQ1RJT05fTUFYXTsKKwlzdHJ1Y3QgbXV0ZXggZ29hbF9pcnFfbXV0ZXg7CisJYm9vbCBnb2FsX2lycV9vbjsgLyogUHJvdGVjdGVkIGJ5IEBnb2FsX2lycV9tdXRleCAqLworCWJvb2wgc2Vxbm9fdmFsaWQ7IC8qIFByb3RlY3RlZCBieSBAbG9jaywgYW5kIG1heSBub3QgYmUgc2V0IHRvIHRydWUKKwkJCSAgICAgd2l0aG91dCB0aGUgQGdvYWxfaXJxX211dGV4IGhlbGQuICovCiB9OwogCi12b2lkIHZtd19mZW5jZV9xdWV1ZV9pbml0KHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlKQotewotCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+aGVhZCk7Ci0JcXVldWUtPmxhZyA9IG5zX3RvX3RpbWVzcGVjKDApOwotCWdldHJhd21vbm90b25pYygmcXVldWUtPmxhZ190aW1lKTsKLQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOwotfQorc3RydWN0IHZtd191c2VyX2ZlbmNlIHsKKwlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0IGJhc2U7CisJc3RydWN0IHZtd19mZW5jZV9vYmogZmVuY2U7Cit9OwogCi12b2lkIHZtd19mZW5jZV9xdWV1ZV90YWtlZG93bihzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3Qgdm13X2ZlbmNlICpmZW5jZSwgKm5leHQ7CisvKioKKyAqIHN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uIC0gZmVuY2UgYWN0aW9uIHRoYXQgZGVsaXZlcnMgYSBkcm0gZXZlbnQuCisgKgorICogQGU6IEEgc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50IHRoYXQgY29udHJvbHMgdGhlIGV2ZW50IGRlbGl2ZXJ5LgorICogQGFjdGlvbjogQSBzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiB0byBob29rIHVwIHRvIGEgZmVuY2UuCisgKiBAZmVuY2U6IEEgcmVmZXJlbmNlZCBwb2ludGVyIHRvIHRoZSBmZW5jZSB0byBrZWVwIGl0IGFsaXZlIHdoaWxlIEBhY3Rpb24KKyAqIGhhbmdzIG9uIGl0LgorICogQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBkcm1fZGV2aWNlIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIGV2ZW50IHN0dWZmLgorICogQGtyZWY6IEJvdGggQGUgYW5kIEBhY3Rpb24gaGFzIGRlc3RydWN0b3JzLCBzbyB3ZSBuZWVkIHRvIHJlZmNvdW50LgorICogQHNpemU6IFNpemUgYWNjb3VudGVkIGZvciB0aGlzIG9iamVjdC4KKyAqIEB0dl9zZWM6IElmIG5vbi1udWxsLCB0aGUgdmFyaWFibGUgcG9pbnRlZCB0byB3aWxsIGJlIGFzc2lnbmVkCisgKiBjdXJyZW50IHRpbWUgdHZfc2VjIHZhbCB3aGVuIHRoZSBmZW5jZSBzaWduYWxzLgorICogQHR2X3VzZWM6IE11c3QgYmUgc2V0IGlmIEB0dl9zZWMgaXMgc2V0LCBhbmQgdGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gd2lsbAorICogYmUgYXNzaWduZWQgdGhlIGN1cnJlbnQgdGltZSB0dl91c2VjIHZhbCB3aGVuIHRoZSBmZW5jZSBzaWduYWxzLgorICovCitzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiB7CisJc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50IGU7CisJc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gYWN0aW9uOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBrcmVmIGtyZWY7CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCAqdHZfc2VjOworCXVpbnQzMl90ICp0dl91c2VjOworfTsKIAotCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgbmV4dCwgJnF1ZXVlLT5oZWFkLCBoZWFkKSB7CisvKioKKyAqIE5vdGUgb24gZmVuY2luZyBzdWJzeXN0ZW0gdXNhZ2Ugb2YgaXJxczoKKyAqIFR5cGljYWxseSB0aGUgdm13X2ZlbmNlc191cGRhdGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogYSkgV2hlbiBhIG5ldyBmZW5jZSBzZXFubyBoYXMgYmVlbiBzdWJtaXR0ZWQgYnkgdGhlIGZpZm8gY29kZS4KKyAqIGIpIE9uLWRlbWFuZCB3aGVuIHdlIGhhdmUgd2FpdGVycy4gU2xlZXBpbmcgd2FpdGVycyB3aWxsIHN3aXRjaCBvbiB0aGUKKyAqIEFOWV9GRU5DRSBpcnEgYW5kIGNhbGwgdm13X2ZlbmNlc191cGRhdGUgZnVuY3Rpb24gZWFjaCB0aW1lIGFuIEFOWV9GRU5DRQorICogaXJxIGlzIHJlY2VpdmVkLiBXaGVuIHRoZSBsYXN0IGZlbmNlIHdhaXRlciBpcyBnb25lLCB0aGF0IElSUSBpcyBtYXNrZWQKKyAqIGF3YXkuCisgKgorICogSW4gc2l0dWF0aW9ucyB3aGVyZSB0aGVyZSBhcmUgbm8gd2FpdGVycyBhbmQgd2UgZG9uJ3Qgc3VibWl0IGFueSBuZXcgZmVuY2VzLAorICogZmVuY2Ugb2JqZWN0cyBtYXkgbm90IGJlIHNpZ25hbGVkLiBUaGlzIGlzIHBlcmZlY3RseSBPSywgc2luY2UgdGhlcmUgYXJlCisgKiBubyBjb25zdW1lcnMgb2YgdGhlIHNpZ25hbGVkIGRhdGEsIGJ1dCB0aGF0IGlzIE5PVCBvayB3aGVuIHRoZXJlIGFyZSBmZW5jZQorICogYWN0aW9ucyBhdHRhY2hlZCB0byBhIGZlbmNlLiBUaGUgZmVuY2luZyBzdWJzeXN0ZW0gdGhlbiBtYWtlcyB1c2Ugb2YgdGhlCisgKiBGRU5DRV9HT0FMIGlycSBhbmQgc2V0cyB0aGUgZmVuY2UgZ29hbCBzZXFubyB0byB0aGF0IG9mIHRoZSBuZXh0IGZlbmNlCisgKiB3aGljaCBoYXMgYW4gYWN0aW9uIGF0dGFjaGVkLCBhbmQgZWFjaCB0aW1lIHZtd19mZW5jZXNfdXBkYXRlIGlzIGNhbGxlZCwKKyAqIHRoZSBzdWJzeXN0ZW0gbWFrZXMgc3VyZSB0aGUgZmVuY2UgZ29hbCBzZXFubyBpcyB1cGRhdGVkLgorICoKKyAqIFRoZSBmZW5jZSBnb2FsIHNlcW5vIGlycSBpcyBvbiBhcyBsb25nIGFzIHRoZXJlIGFyZSB1bnNpZ25hbGVkIGZlbmNlCisgKiBvYmplY3RzIHdpdGggYWN0aW9ucyBhdHRhY2hlZCB0byB0aGVtLgorICovCisKK3N0YXRpYyB2b2lkIHZtd19mZW5jZV9vYmpfZGVzdHJveV9sb2NrZWQoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB2bXdfZmVuY2Vfb2JqLCBrcmVmKTsKKworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGZlbmNlLT5mbWFuOworCXVuc2lnbmVkIGludCBudW1fZmVuY2VzOworCisJbGlzdF9kZWxfaW5pdCgmZmVuY2UtPmhlYWQpOworCW51bV9mZW5jZXMgPSAtLWZtYW4tPm51bV9mZW5jZV9vYmplY3RzOworCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7CisJaWYgKGZlbmNlLT5kZXN0cm95KQorCQlmZW5jZS0+ZGVzdHJveShmZW5jZSk7CisJZWxzZQogCQlrZnJlZShmZW5jZSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKwlzcGluX2xvY2tfaXJxKCZmbWFuLT5sb2NrKTsKIH0KIAotaW50IHZtd19mZW5jZV9wdXNoKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlLAotCQkgICB1aW50MzJfdCBzZXF1ZW5jZSkKKworLyoqCisgKiBFeGVjdXRlIHNpZ25hbCBhY3Rpb25zIG9uIGZlbmNlcyByZWNlbnRseSBzaWduYWxlZC4KKyAqIFRoaXMgaXMgZG9uZSBmcm9tIGEgd29ya3F1ZXVlIHNvIHdlIGRvbid0IGhhdmUgdG8gZXhlY3V0ZQorICogc2lnbmFsIGFjdGlvbnMgZnJvbSBhdG9taWMgY29udGV4dC4KKyAqLworCitzdGF0aWMgdm9pZCB2bXdfZmVuY2Vfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgdm13X2ZlbmNlICpmZW5jZSA9IGttYWxsb2Moc2l6ZW9mKCpmZW5jZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIsIHdvcmspOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uLCAqbmV4dF9hY3Rpb247CisJYm9vbCBzZXFub192YWxpZDsKIAotCWlmICh1bmxpa2VseSghZmVuY2UpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlkbyB7CisJCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKKwkJbXV0ZXhfbG9jaygmZm1hbi0+Z29hbF9pcnFfbXV0ZXgpOwogCi0JZmVuY2UtPnNlcXVlbmNlID0gc2VxdWVuY2U7Ci0JZ2V0cmF3bW9ub3RvbmljKCZmZW5jZS0+c3VibWl0dGVkKTsKLQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZmZW5jZS0+aGVhZCwgJnF1ZXVlLT5oZWFkKTsKLQlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCQlzcGluX2xvY2tfaXJxKCZmbWFuLT5sb2NrKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZm1hbi0+Y2xlYW51cF9saXN0LCAmbGlzdCk7CisJCXNlcW5vX3ZhbGlkID0gZm1hbi0+c2Vxbm9fdmFsaWQ7CisJCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7CiAKLQlyZXR1cm4gMDsKKwkJaWYgKCFzZXFub192YWxpZCAmJiBmbWFuLT5nb2FsX2lycV9vbikgeworCQkJZm1hbi0+Z29hbF9pcnFfb24gPSBmYWxzZTsKKwkJCXZtd19nb2FsX3dhaXRlcl9yZW1vdmUoZm1hbi0+ZGV2X3ByaXYpOworCQl9CisJCW11dGV4X3VubG9jaygmZm1hbi0+Z29hbF9pcnFfbXV0ZXgpOworCisJCWlmIChsaXN0X2VtcHR5KCZsaXN0KSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50LCBvbmx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIG1hbmlwdWxhdGUgdGhlCisJCSAqIGxpc3QgaGVhZHMgb2YgdGhlIGFjdGlvbnMgd2UgaGF2ZSBvbiB0aGUgcHJpdmF0ZSBsaXN0LgorCQkgKiBoZW5jZSBmbWFuOjpsb2NrIG5vdCBoZWxkLgorCQkgKi8KKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYWN0aW9uLCBuZXh0X2FjdGlvbiwgJmxpc3QsIGhlYWQpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmFjdGlvbi0+aGVhZCk7CisJCQlpZiAoYWN0aW9uLT5jbGVhbnVwKQorCQkJCWFjdGlvbi0+Y2xlYW51cChhY3Rpb24pOworCQl9CisJfSB3aGlsZSAoMSk7CiB9CiAKLWludCB2bXdfZmVuY2VfcHVsbChzdHJ1Y3Qgdm13X2ZlbmNlX3F1ZXVlICpxdWV1ZSwKLQkJICAgdWludDMyX3Qgc2lnbmFsZWRfc2VxdWVuY2UpCitzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKnZtd19mZW5jZV9tYW5hZ2VyX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKIHsKLQlzdHJ1Y3Qgdm13X2ZlbmNlICpmZW5jZSwgKm5leHQ7Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdzsKLQlib29sIHVwZGF0ZWQgPSBmYWxzZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBremFsbG9jKHNpemVvZigqZm1hbiksIEdGUF9LRVJORUwpOwogCi0Jc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JZ2V0cmF3bW9ub3RvbmljKCZub3cpOworCWlmICh1bmxpa2VseShmbWFuID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKIAotCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+aGVhZCkpIHsKLQkJcXVldWUtPmxhZyA9IG5zX3RvX3RpbWVzcGVjKDApOwotCQlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7Ci0JCXVwZGF0ZWQgPSB0cnVlOworCWZtYW4tPmRldl9wcml2ID0gZGV2X3ByaXY7CisJc3Bpbl9sb2NrX2luaXQoJmZtYW4tPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZmbWFuLT5mZW5jZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZm1hbi0+Y2xlYW51cF9saXN0KTsKKwlJTklUX1dPUksoJmZtYW4tPndvcmssICZ2bXdfZmVuY2Vfd29ya19mdW5jKTsKKwlmbWFuLT5maWZvX2Rvd24gPSB0cnVlOworCWZtYW4tPnVzZXJfZmVuY2Vfc2l6ZSA9IHR0bV9yb3VuZF9wb3Qoc2l6ZW9mKHN0cnVjdCB2bXdfdXNlcl9mZW5jZSkpOworCWZtYW4tPmZlbmNlX3NpemUgPSB0dG1fcm91bmRfcG90KHNpemVvZihzdHJ1Y3Qgdm13X2ZlbmNlX29iaikpOworCWZtYW4tPmV2ZW50X2ZlbmNlX2FjdGlvbl9zaXplID0KKwkJdHRtX3JvdW5kX3BvdChzaXplb2Yoc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24pKTsKKwltdXRleF9pbml0KCZmbWFuLT5nb2FsX2lycV9tdXRleCk7CisKKwlyZXR1cm4gZm1hbjsKK30KKwordm9pZCB2bXdfZmVuY2VfbWFuYWdlcl90YWtlZG93bihzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4pCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJYm9vbCBsaXN0c19lbXB0eTsKKworCSh2b2lkKSBjYW5jZWxfd29ya19zeW5jKCZmbWFuLT53b3JrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCWxpc3RzX2VtcHR5ID0gbGlzdF9lbXB0eSgmZm1hbi0+ZmVuY2VfbGlzdCkgJiYKKwkJbGlzdF9lbXB0eSgmZm1hbi0+Y2xlYW51cF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJQlVHX09OKCFsaXN0c19lbXB0eSk7CisJa2ZyZWUoZm1hbik7Cit9CisKK3N0YXRpYyBpbnQgdm13X2ZlbmNlX29ial9pbml0KHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiwKKwkJCSAgICAgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKKwkJCSAgICAgIHUzMiBzZXFubywKKwkJCSAgICAgIHVpbnQzMl90IG1hc2ssCisJCQkgICAgICB2b2lkICgqZGVzdHJveSkgKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSkpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgaW50IG51bV9mZW5jZXM7CisJaW50IHJldCA9IDA7CisKKwlmZW5jZS0+c2Vxbm8gPSBzZXFubzsKKwlJTklUX0xJU1RfSEVBRCgmZmVuY2UtPnNlcV9wYXNzZWRfYWN0aW9ucyk7CisJZmVuY2UtPmZtYW4gPSBmbWFuOworCWZlbmNlLT5zaWduYWxlZCA9IDA7CisJZmVuY2UtPnNpZ25hbF9tYXNrID0gbWFzazsKKwlrcmVmX2luaXQoJmZlbmNlLT5rcmVmKTsKKwlmZW5jZS0+ZGVzdHJveSA9IGRlc3Ryb3k7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZmVuY2UtPnF1ZXVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCWlmICh1bmxpa2VseShmbWFuLT5maWZvX2Rvd24pKSB7CisJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgbmV4dCwgJnF1ZXVlLT5oZWFkLCBoZWFkKSB7Ci0JCWlmIChzaWduYWxlZF9zZXF1ZW5jZSAtIGZlbmNlLT5zZXF1ZW5jZSA+ICgxIDw8IDMwKSkKLQkJCWNvbnRpbnVlOwotCi0JCXF1ZXVlLT5sYWcgPSB0aW1lc3BlY19zdWIobm93LCBmZW5jZS0+c3VibWl0dGVkKTsKLQkJcXVldWUtPmxhZ190aW1lID0gbm93OwotCQl1cGRhdGVkID0gdHJ1ZTsKLQkJbGlzdF9kZWwoJmZlbmNlLT5oZWFkKTsKLQkJa2ZyZWUoZmVuY2UpOwotCX0KKwlsaXN0X2FkZF90YWlsKCZmZW5jZS0+aGVhZCwgJmZtYW4tPmZlbmNlX2xpc3QpOworCW51bV9mZW5jZXMgPSArK2ZtYW4tPm51bV9mZW5jZV9vYmplY3RzOwogCiBvdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OwogCi0JcmV0dXJuICh1cGRhdGVkKSA/IDAgOiAtRUJVU1k7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgdm13X3RpbWVzcGVjX2FkZChzdHJ1Y3QgdGltZXNwZWMgdDEsCi0JCQkJCXN0cnVjdCB0aW1lc3BlYyB0MikKK3N0cnVjdCB2bXdfZmVuY2Vfb2JqICp2bXdfZmVuY2Vfb2JqX3JlZmVyZW5jZShzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpCiB7Ci0JdDEudHZfc2VjICs9IHQyLnR2X3NlYzsKLQl0MS50dl9uc2VjICs9IHQyLnR2X25zZWM7Ci0JaWYgKHQxLnR2X25zZWMgPj0gMTAwMDAwMDAwMEwpIHsKLQkJdDEudHZfc2VjICs9IDE7Ci0JCXQxLnR2X25zZWMgLT0gMTAwMDAwMDAwMEw7CisJaWYgKHVubGlrZWx5KGZlbmNlID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCWtyZWZfZ2V0KCZmZW5jZS0+a3JlZik7CisJcmV0dXJuIGZlbmNlOworfQorCisvKioKKyAqIHZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGVudGVyZWQgd2l0aCBkaXNhYmxlZCBpcnFzIHNpbmNlCisgKiBpdCBtYXkgcmUtZW5hYmxlIHRoZW0gaW4gdGhlIGRlc3Ryb3kgZnVuY3Rpb24uCisgKgorICovCit2b2lkIHZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2Uoc3RydWN0IHZtd19mZW5jZV9vYmogKipmZW5jZV9wKQoreworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSA9ICpmZW5jZV9wOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbjsKKworCWlmICh1bmxpa2VseShmZW5jZSA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJZm1hbiA9IGZlbmNlLT5mbWFuOworCSpmZW5jZV9wID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZmbWFuLT5sb2NrKTsKKwlCVUdfT04oYXRvbWljX3JlYWQoJmZlbmNlLT5rcmVmLnJlZmNvdW50KSA9PSAwKTsKKwlrcmVmX3B1dCgmZmVuY2UtPmtyZWYsIHZtd19mZW5jZV9vYmpfZGVzdHJveV9sb2NrZWQpOworCXNwaW5fdW5sb2NrX2lycSgmZm1hbi0+bG9jayk7Cit9CisKK3ZvaWQgdm13X2ZlbmNlc19wZXJmb3JtX2FjdGlvbnMoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gKmFjdGlvbiwgKm5leHRfYWN0aW9uOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFjdGlvbiwgbmV4dF9hY3Rpb24sIGxpc3QsIGhlYWQpIHsKKwkJbGlzdF9kZWxfaW5pdCgmYWN0aW9uLT5oZWFkKTsKKwkJZm1hbi0+cGVuZGluZ19hY3Rpb25zW2FjdGlvbi0+dHlwZV0tLTsKKwkJaWYgKGFjdGlvbi0+c2VxX3Bhc3NlZCAhPSBOVUxMKQorCQkJYWN0aW9uLT5zZXFfcGFzc2VkKGFjdGlvbik7CisKKwkJLyoKKwkJICogQWRkIHRoZSBjbGVhbnVwIGFjdGlvbiB0byB0aGUgY2xlYW51cCBsaXN0IHNvIHRoYXQKKwkJICogaXQgd2lsbCBiZSBwZXJmb3JtZWQgYnkgYSB3b3JrZXIgdGFzay4KKwkJICovCisKKwkJbGlzdF9hZGRfdGFpbCgmYWN0aW9uLT5oZWFkLCAmZm1hbi0+Y2xlYW51cF9saXN0KTsKKwl9Cit9CisKKy8qKgorICogdm13X2ZlbmNlX2dvYWxfbmV3X2xvY2tlZCAtIEZpZ3VyZSBvdXQgYSBuZXcgZGV2aWNlIGZlbmNlIGdvYWwKKyAqIHNlcW5vIGlmIG5lZWRlZC4KKyAqCisgKiBAZm1hbjogUG9pbnRlciB0byBhIGZlbmNlIG1hbmFnZXIuCisgKiBAcGFzc2VkX3NlcW5vOiBUaGUgc2Vxbm8gdGhlIGRldmljZSBjdXJyZW50bHkgc2lnbmFscyBhcyBwYXNzZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGZlbmNlIG1hbmFnZXIgbG9jayBoZWxkLgorICogSXQgaXMgdHlwaWNhbGx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgYSBuZXcgcGFzc2VkX3NlcW5vLCBhbmQKKyAqIHdlIG1pZ2h0IG5lZWQgdG8gdXBkYXRlIHRoZSBmZW5jZSBnb2FsLiBJdCBjaGVja3MgdG8gc2VlIHdoZXRoZXIKKyAqIHRoZSBjdXJyZW50IGZlbmNlIGdvYWwgaGFzIGFscmVhZHkgcGFzc2VkLCBhbmQsIGluIHRoYXQgY2FzZSwKKyAqIHNjYW5zIHRocm91Z2ggYWxsIHVuc2lnbmFsZWQgZmVuY2VzIHRvIGdldCB0aGUgbmV4dCBmZW5jZSBvYmplY3Qgd2l0aCBhbgorICogYWN0aW9uIGF0dGFjaGVkLCBhbmQgc2V0cyB0aGUgc2Vxbm8gb2YgdGhhdCBmZW5jZSBhcyBhIG5ldyBmZW5jZSBnb2FsLgorICoKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGdvYWwgc2Vxbm8gd2FzIHVwZGF0ZWQuIEZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgdm13X2ZlbmNlX2dvYWxfbmV3X2xvY2tlZChzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4sCisJCQkJICAgICAgdTMyIHBhc3NlZF9zZXFubykKK3sKKwl1MzIgZ29hbF9zZXFubzsKKwlfX2xlMzIgX19pb21lbSAqZmlmb19tZW07CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCisJaWYgKGxpa2VseSghZm1hbi0+c2Vxbm9fdmFsaWQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmaWZvX21lbSA9IGZtYW4tPmRldl9wcml2LT5tbWlvX3ZpcnQ7CisJZ29hbF9zZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFX0dPQUwpOworCWlmIChsaWtlbHkocGFzc2VkX3NlcW5vIC0gZ29hbF9zZXFubyA+PSBWTVdfRkVOQ0VfV1JBUCkpCisJCXJldHVybiBmYWxzZTsKKworCWZtYW4tPnNlcW5vX3ZhbGlkID0gZmFsc2U7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmZW5jZSwgJmZtYW4tPmZlbmNlX2xpc3QsIGhlYWQpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZmZW5jZS0+c2VxX3Bhc3NlZF9hY3Rpb25zKSkgeworCQkJZm1hbi0+c2Vxbm9fdmFsaWQgPSB0cnVlOworCQkJaW93cml0ZTMyKGZlbmNlLT5zZXFubywKKwkJCQkgIGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFX0dPQUwpOworCQkJYnJlYWs7CisJCX0KIAl9CiAKLQlyZXR1cm4gdDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgdm13X2ZpZm9fbGFnKHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCB0aW1lc3BlYyBub3c7Ci0KLQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKLQlnZXRyYXdtb25vdG9uaWMoJm5vdyk7Ci0JcXVldWUtPmxhZyA9IHZtd190aW1lc3BlY19hZGQocXVldWUtPmxhZywKLQkJCQkgICAgICB0aW1lc3BlY19zdWIobm93LCBxdWV1ZS0+bGFnX3RpbWUpKTsKLQlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7Ci0Jc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKLQlyZXR1cm4gcXVldWUtPmxhZzsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogCi1zdGF0aWMgYm9vbCB2bXdfbGFnX2x0KHN0cnVjdCB2bXdfZmVuY2VfcXVldWUgKnF1ZXVlLAotCQkgICAgICAgdWludDMyX3QgdXMpCisvKioKKyAqIHZtd19mZW5jZV9nb2FsX2NoZWNrX2xvY2tlZCAtIFJlcGxhY2UgdGhlIGRldmljZSBmZW5jZSBnb2FsIHNlcW5vIGlmCisgKiBuZWVkZWQuCisgKgorICogQGZlbmNlOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19mZW5jZV9vYmogdGhlIHNlcW5vIG9mIHdoaWNoIHNob3VsZCBiZQorICogY29uc2lkZXJlZCBhcyBhIGRldmljZSBmZW5jZSBnb2FsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBmZW5jZSBtYW5hZ2VyIGxvY2sgaGVsZC4KKyAqIEl0IGlzIHR5cGljYWxseSBjYWxsZWQgd2hlbiBhbiBhY3Rpb24gaGFzIGJlZW4gYXR0YWNoZWQgdG8gYSBmZW5jZSB0bworICogY2hlY2sgd2hldGhlciB0aGUgc2Vxbm8gb2YgdGhhdCBmZW5jZSBzaG91bGQgYmUgdXNlZCBmb3IgYSBmZW5jZQorICogZ29hbCBpbnRlcnJ1cHQuIFRoaXMgaXMgdHlwaWNhbGx5IG5lZWRlZCBpZiB0aGUgY3VycmVudCBmZW5jZSBnb2FsIGlzCisgKiBpbnZhbGlkLCBvciBoYXMgYSBoaWdoZXIgc2Vxbm8gdGhhbiB0aGF0IG9mIHRoZSBjdXJyZW50IGZlbmNlIG9iamVjdC4KKyAqCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBnb2FsIHNlcW5vIHdhcyB1cGRhdGVkLiBGYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHZtd19mZW5jZV9nb2FsX2NoZWNrX2xvY2tlZChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIGxhZywgY29uZDsKKwl1MzIgZ29hbF9zZXFubzsKKwlfX2xlMzIgX19pb21lbSAqZmlmb19tZW07CiAKLQljb25kID0gbnNfdG9fdGltZXNwZWMoKHM2NCkgdXMgKiAxMDAwKTsKLQlsYWcgPSB2bXdfZmlmb19sYWcocXVldWUpOwotCXJldHVybiAodGltZXNwZWNfY29tcGFyZSgmbGFnLCAmY29uZCkgPCAxKTsKKwlpZiAoZmVuY2UtPnNpZ25hbGVkICYgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMpCisJCXJldHVybiBmYWxzZTsKKworCWZpZm9fbWVtID0gZmVuY2UtPmZtYW4tPmRldl9wcml2LT5tbWlvX3ZpcnQ7CisJZ29hbF9zZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFX0dPQUwpOworCWlmIChsaWtlbHkoZmVuY2UtPmZtYW4tPnNlcW5vX3ZhbGlkICYmCisJCSAgIGdvYWxfc2Vxbm8gLSBmZW5jZS0+c2Vxbm8gPCBWTVdfRkVOQ0VfV1JBUCkpCisJCXJldHVybiBmYWxzZTsKKworCWlvd3JpdGUzMihmZW5jZS0+c2Vxbm8sIGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFX0dPQUwpOworCWZlbmNlLT5mbWFuLT5zZXFub192YWxpZCA9IHRydWU7CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotaW50IHZtd193YWl0X2xhZyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkgc3RydWN0IHZtd19mZW5jZV9xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHVzKQordm9pZCB2bXdfZmVuY2VzX3VwZGF0ZShzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4pCiB7Ci0Jc3RydWN0IHZtd19mZW5jZSAqZmVuY2U7Ci0JdWludDMyX3Qgc2VxdWVuY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UsICpuZXh0X2ZlbmNlOworCXN0cnVjdCBsaXN0X2hlYWQgYWN0aW9uX2xpc3Q7CisJYm9vbCBuZWVkc19yZXJ1bjsKKwl1aW50MzJfdCBzZXFubywgbmV3X3NlcW5vOworCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbSA9IGZtYW4tPmRldl9wcml2LT5tbWlvX3ZpcnQ7CisKKwlzZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKK3JlcnVuOgorCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZlbmNlLCBuZXh0X2ZlbmNlLCAmZm1hbi0+ZmVuY2VfbGlzdCwgaGVhZCkgeworCQlpZiAoc2Vxbm8gLSBmZW5jZS0+c2Vxbm8gPCBWTVdfRkVOQ0VfV1JBUCkgeworCQkJbGlzdF9kZWxfaW5pdCgmZmVuY2UtPmhlYWQpOworCQkJZmVuY2UtPnNpZ25hbGVkIHw9IERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOworCQkJSU5JVF9MSVNUX0hFQUQoJmFjdGlvbl9saXN0KTsKKwkJCWxpc3Rfc3BsaWNlX2luaXQoJmZlbmNlLT5zZXFfcGFzc2VkX2FjdGlvbnMsCisJCQkJCSAmYWN0aW9uX2xpc3QpOworCQkJdm13X2ZlbmNlc19wZXJmb3JtX2FjdGlvbnMoZm1hbiwgJmFjdGlvbl9saXN0KTsKKwkJCXdha2VfdXBfYWxsKCZmZW5jZS0+cXVldWUpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCW5lZWRzX3JlcnVuID0gdm13X2ZlbmNlX2dvYWxfbmV3X2xvY2tlZChmbWFuLCBzZXFubyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZtYW4tPmNsZWFudXBfbGlzdCkpCisJCSh2b2lkKSBzY2hlZHVsZV93b3JrKCZmbWFuLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFJlcnVuIGlmIHRoZSBmZW5jZSBnb2FsIHNlcW5vIHdhcyB1cGRhdGVkLCBhbmQgdGhlCisJICogaGFyZHdhcmUgbWlnaHQgaGF2ZSByYWNlZCB3aXRoIHRoYXQgdXBkYXRlLCBzbyB0aGF0CisJICogd2UgbWlzc2VkIGEgZmVuY2VfZ29hbCBpcnEuCisJICovCisKKwlpZiAodW5saWtlbHkobmVlZHNfcmVydW4pKSB7CisJCW5ld19zZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKKwkJaWYgKG5ld19zZXFubyAhPSBzZXFubykgeworCQkJc2Vxbm8gPSBuZXdfc2Vxbm87CisJCQlnb3RvIHJlcnVuOworCQl9CisJfQorfQorCitib29sIHZtd19mZW5jZV9vYmpfc2lnbmFsZWQoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJICAgIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiA9IGZlbmNlLT5mbWFuOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXVpbnQzMl90IHNpZ25hbGVkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisJc2lnbmFsZWQgPSBmZW5jZS0+c2lnbmFsZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKworCWZsYWdzICY9IGZlbmNlLT5zaWduYWxfbWFzazsKKwlpZiAoKHNpZ25hbGVkICYgZmxhZ3MpID09IGZsYWdzKQorCQlyZXR1cm4gMTsKKworCWlmICgoc2lnbmFsZWQgJiBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQykgPT0gMCkKKwkJdm13X2ZlbmNlc191cGRhdGUoZm1hbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKwlzaWduYWxlZCA9IGZlbmNlLT5zaWduYWxlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJcmV0dXJuICgoc2lnbmFsZWQgJiBmbGFncykgPT0gZmxhZ3MpOworfQorCitpbnQgdm13X2ZlbmNlX29ial93YWl0KHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKKwkJICAgICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGxhenksCisJCSAgICAgICBib29sIGludGVycnVwdGlibGUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gZmVuY2UtPmZtYW4tPmRldl9wcml2OworCWxvbmcgcmV0OworCisJaWYgKGxpa2VseSh2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKGZlbmNlLCBmbGFncykpKQorCQlyZXR1cm4gMDsKKworCXZtd19maWZvX3BpbmdfaG9zdChkZXZfcHJpdiwgU1ZHQV9TWU5DX0dFTkVSSUMpOworCXZtd19zZXFub193YWl0ZXJfYWRkKGRldl9wcml2KTsKKworCWlmIChpbnRlcnJ1cHRpYmxlKQorCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAorCQkJKGZlbmNlLT5xdWV1ZSwKKwkJCSB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkKGZlbmNlLCBmbGFncyksCisJCQkgdGltZW91dCk7CisJZWxzZQorCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQKKwkJCShmZW5jZS0+cXVldWUsCisJCQkgdm13X2ZlbmNlX29ial9zaWduYWxlZChmZW5jZSwgZmxhZ3MpLAorCQkJIHRpbWVvdXQpOworCisJdm13X3NlcW5vX3dhaXRlcl9yZW1vdmUoZGV2X3ByaXYpOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAwKSkKKwkJcmV0ID0gLUVCVVNZOworCWVsc2UgaWYgKGxpa2VseShyZXQgPiAwKSkKKwkJcmV0ID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdm13X2ZlbmNlX29ial9mbHVzaChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5mbWFuLT5kZXZfcHJpdjsKKworCXZtd19maWZvX3BpbmdfaG9zdChkZXZfcHJpdiwgU1ZHQV9TWU5DX0dFTkVSSUMpOworfQorCitzdGF0aWMgdm9pZCB2bXdfZmVuY2VfZGVzdHJveShzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpCit7CisJc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuID0gZmVuY2UtPmZtYW47CisKKwlrZnJlZShmZW5jZSk7CisJLyoKKwkgKiBGcmVlIGtlcm5lbCBzcGFjZSBhY2NvdW50aW5nLgorCSAqLworCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGZtYW4tPmRldl9wcml2KSwKKwkJCSAgICBmbWFuLT5mZW5jZV9zaXplKTsKK30KKworaW50IHZtd19mZW5jZV9jcmVhdGUoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorCQkgICAgIHVpbnQzMl90IHNlcW5vLAorCQkgICAgIHVpbnQzMl90IG1hc2ssCisJCSAgICAgc3RydWN0IHZtd19mZW5jZV9vYmogKipwX2ZlbmNlKQoreworCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPSB2bXdfbWVtX2dsb2IoZm1hbi0+ZGV2X3ByaXYpOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZTsKIAlpbnQgcmV0OwogCi0Jd2hpbGUgKCF2bXdfbGFnX2x0KHF1ZXVlLCB1cykpIHsKLQkJc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7Ci0JCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+aGVhZCkpCi0JCQlzZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+ZmVuY2Vfc2VxKTsKLQkJZWxzZSB7Ci0JCQlmZW5jZSA9IGxpc3RfZmlyc3RfZW50cnkoJnF1ZXVlLT5oZWFkLAotCQkJCQkJIHN0cnVjdCB2bXdfZmVuY2UsIGhlYWQpOwotCQkJc2VxdWVuY2UgPSBmZW5jZS0+c2VxdWVuY2U7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwlyZXQgPSB0dG1fbWVtX2dsb2JhbF9hbGxvYyhtZW1fZ2xvYiwgZm1hbi0+ZmVuY2Vfc2l6ZSwKKwkJCQkgICBmYWxzZSwgZmFsc2UpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CiAKLQkJcmV0ID0gdm13X3dhaXRfZmVuY2UoZGV2X3ByaXYsIGZhbHNlLCBzZXF1ZW5jZSwgdHJ1ZSwKLQkJCQkgICAgIDMqSFopOwotCi0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQlyZXR1cm4gcmV0OwotCi0JCSh2b2lkKSB2bXdfZmVuY2VfcHVsbChxdWV1ZSwgc2VxdWVuY2UpOworCWZlbmNlID0ga3phbGxvYyhzaXplb2YoKmZlbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGZlbmNlID09IE5VTEwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX29iamVjdDsKIAl9CisKKwlyZXQgPSB2bXdfZmVuY2Vfb2JqX2luaXQoZm1hbiwgZmVuY2UsIHNlcW5vLCBtYXNrLAorCQkJCSB2bXdfZmVuY2VfZGVzdHJveSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfZXJyX2luaXQ7CisKKwkqcF9mZW5jZSA9IGZlbmNlOworCXJldHVybiAwOworCitvdXRfZXJyX2luaXQ6CisJa2ZyZWUoZmVuY2UpOworb3V0X25vX29iamVjdDoKKwl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBmbWFuLT5mZW5jZV9zaXplKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIHZtd191c2VyX2ZlbmNlX2Rlc3Ryb3koc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlKQoreworCXN0cnVjdCB2bXdfdXNlcl9mZW5jZSAqdWZlbmNlID0KKwkJY29udGFpbmVyX29mKGZlbmNlLCBzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UsIGZlbmNlKTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBmZW5jZS0+Zm1hbjsKKworCWtmcmVlKHVmZW5jZSk7CisJLyoKKwkgKiBGcmVlIGtlcm5lbCBzcGFjZSBhY2NvdW50aW5nLgorCSAqLworCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGZtYW4tPmRldl9wcml2KSwKKwkJCSAgICBmbWFuLT51c2VyX2ZlbmNlX3NpemUpOworfQorCitzdGF0aWMgdm9pZCB2bXdfdXNlcl9mZW5jZV9iYXNlX3JlbGVhc2Uoc3RydWN0IHR0bV9iYXNlX29iamVjdCAqKnBfYmFzZSkKK3sKKwlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0ICpiYXNlID0gKnBfYmFzZTsKKwlzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UgKnVmZW5jZSA9CisJCWNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UsIGJhc2UpOworCXN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSA9ICZ1ZmVuY2UtPmZlbmNlOworCisJKnBfYmFzZSA9IE5VTEw7CisJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworfQorCitpbnQgdm13X3VzZXJfZmVuY2VfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICBzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4sCisJCQkgIHVpbnQzMl90IHNlcW5vLAorCQkJICB1aW50MzJfdCBtYXNrLAorCQkJICBzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqKnBfZmVuY2UsCisJCQkgIHVpbnQzMl90ICpwX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UgKnVmZW5jZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqdG1wOworCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPSB2bXdfbWVtX2dsb2IoZm1hbi0+ZGV2X3ByaXYpOworCWludCByZXQ7CisKKwkvKgorCSAqIEtlcm5lbCBtZW1vcnkgc3BhY2UgYWNjb3VudGluZywgc2luY2UgdGhpcyBvYmplY3QgbWF5CisJICogYmUgY3JlYXRlZCBieSBhIHVzZXItc3BhY2UgcmVxdWVzdC4KKwkgKi8KKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKG1lbV9nbG9iLCBmbWFuLT51c2VyX2ZlbmNlX3NpemUsCisJCQkJICAgZmFsc2UsIGZhbHNlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCisJdWZlbmNlID0ga3phbGxvYyhzaXplb2YoKnVmZW5jZSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSh1ZmVuY2UgPT0gTlVMTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fb2JqZWN0OworCX0KKworCXJldCA9IHZtd19mZW5jZV9vYmpfaW5pdChmbWFuLCAmdWZlbmNlLT5mZW5jZSwgc2Vxbm8sCisJCQkJIG1hc2ssIHZtd191c2VyX2ZlbmNlX2Rlc3Ryb3kpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJa2ZyZWUodWZlbmNlKTsKKwkJZ290byBvdXRfbm9fb2JqZWN0OworCX0KKworCS8qCisJICogVGhlIGJhc2Ugb2JqZWN0IGhvbGRzIGEgcmVmZXJlbmNlIHdoaWNoIGlzIGZyZWVkIGluCisJICogdm13X3VzZXJfZmVuY2VfYmFzZV9yZWxlYXNlLgorCSAqLworCXRtcCA9IHZtd19mZW5jZV9vYmpfcmVmZXJlbmNlKCZ1ZmVuY2UtPmZlbmNlKTsKKwlyZXQgPSB0dG1fYmFzZV9vYmplY3RfaW5pdCh0ZmlsZSwgJnVmZW5jZS0+YmFzZSwgZmFsc2UsCisJCQkJICAgVk1XX1JFU19GRU5DRSwKKwkJCQkgICAmdm13X3VzZXJfZmVuY2VfYmFzZV9yZWxlYXNlLCBOVUxMKTsKKworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkvKgorCQkgKiBGcmVlIHRoZSBiYXNlIG9iamVjdCdzIHJlZmVyZW5jZQorCQkgKi8KKwkJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmdG1wKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCSpwX2ZlbmNlID0gJnVmZW5jZS0+ZmVuY2U7CisJKnBfaGFuZGxlID0gdWZlbmNlLT5iYXNlLmhhc2gua2V5OworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXRtcCA9ICZ1ZmVuY2UtPmZlbmNlOworCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoJnRtcCk7CitvdXRfbm9fb2JqZWN0OgorCXR0bV9tZW1fZ2xvYmFsX2ZyZWUobWVtX2dsb2IsIGZtYW4tPnVzZXJfZmVuY2Vfc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHZtd19mZW5jZV9maWZvX2Rvd24gLSBzaWduYWwgYWxsIHVuc2lnbmFsZWQgZmVuY2Ugb2JqZWN0cy4KKyAqLworCit2b2lkIHZtd19mZW5jZV9maWZvX2Rvd24oc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgYWN0aW9uX2xpc3Q7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIGxpc3QgbWF5IGJlIGFsdGVyZWQgd2hpbGUgd2UgdHJhdmVyc2UgaXQsIHNvIGFsd2F5cworCSAqIHJlc3RhcnQgd2hlbiB3ZSd2ZSByZWxlYXNlZCB0aGUgZm1hbi0+bG9jay4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCWZtYW4tPmZpZm9fZG93biA9IHRydWU7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmbWFuLT5mZW5jZV9saXN0KSkgeworCQlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UgPQorCQkJbGlzdF9lbnRyeShmbWFuLT5mZW5jZV9saXN0LnByZXYsIHN0cnVjdCB2bXdfZmVuY2Vfb2JqLAorCQkJCSAgIGhlYWQpOworCQlrcmVmX2dldCgmZmVuY2UtPmtyZWYpOworCQlzcGluX3VubG9ja19pcnEoJmZtYW4tPmxvY2spOworCisJCXJldCA9IHZtd19mZW5jZV9vYmpfd2FpdChmZW5jZSwgZmVuY2UtPnNpZ25hbF9tYXNrLAorCQkJCQkgZmFsc2UsIGZhbHNlLAorCQkJCQkgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVCk7CisKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmZmVuY2UtPmhlYWQpOworCQkJZmVuY2UtPnNpZ25hbGVkIHw9IERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOworCQkJSU5JVF9MSVNUX0hFQUQoJmFjdGlvbl9saXN0KTsKKwkJCWxpc3Rfc3BsaWNlX2luaXQoJmZlbmNlLT5zZXFfcGFzc2VkX2FjdGlvbnMsCisJCQkJCSAmYWN0aW9uX2xpc3QpOworCQkJdm13X2ZlbmNlc19wZXJmb3JtX2FjdGlvbnMoZm1hbiwgJmFjdGlvbl9saXN0KTsKKwkJCXdha2VfdXBfYWxsKCZmZW5jZS0+cXVldWUpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycSgmZm1hbi0+bG9jayk7CisKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZmZW5jZS0+aGVhZCkpOworCQlrcmVmX3B1dCgmZmVuY2UtPmtyZWYsIHZtd19mZW5jZV9vYmpfZGVzdHJveV9sb2NrZWQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworfQorCit2b2lkIHZtd19mZW5jZV9maWZvX3VwKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbikKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmbWFuLT5sb2NrLCBpcnFfZmxhZ3MpOworCWZtYW4tPmZpZm9fZG93biA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7Cit9CisKKworaW50IHZtd19mZW5jZV9vYmpfd2FpdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZyAqYXJnID0KKwkgICAgKHN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2U7CisJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJaW50IHJldDsKKwl1aW50NjRfdCB3YWl0X3RpbWVvdXQgPSAoKHVpbnQ2NF90KWFyZy0+dGltZW91dF91cyAqIEhaKTsKKworCS8qCisJICogNjQtYml0IGRpdmlzaW9uIG5vdCBwcmVzZW50IG9uIDMyLWJpdCBzeXN0ZW1zLCBzbyBkbyBhbgorCSAqIGFwcHJveGltYXRpb24uIChEaXZpZGUgYnkgMTAwMDAwMCkuCisJICovCisKKwl3YWl0X3RpbWVvdXQgPSAod2FpdF90aW1lb3V0ID4+IDIwKSArICh3YWl0X3RpbWVvdXQgPj4gMjQpIC0KKwkgICh3YWl0X3RpbWVvdXQgPj4gMjYpOworCisJaWYgKCFhcmctPmNvb2tpZV92YWxpZCkgeworCQlhcmctPmNvb2tpZV92YWxpZCA9IDE7CisJCWFyZy0+a2VybmVsX2Nvb2tpZSA9IGppZmZpZXMgKyB3YWl0X3RpbWVvdXQ7CisJfQorCisJYmFzZSA9IHR0bV9iYXNlX29iamVjdF9sb29rdXAodGZpbGUsIGFyZy0+aGFuZGxlKTsKKwlpZiAodW5saWtlbHkoYmFzZSA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgIldhaXQgaW52YWxpZCBmZW5jZSBvYmplY3QgaGFuZGxlICIKKwkJICAgICAgICIweCUwOGx4LlxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWFyZy0+aGFuZGxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmVuY2UgPSAmKGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UsIGJhc2UpLT5mZW5jZSk7CisKKwl0aW1lb3V0ID0gamlmZmllczsKKwlpZiAodGltZV9hZnRlcl9lcSh0aW1lb3V0LCAodW5zaWduZWQgbG9uZylhcmctPmtlcm5lbF9jb29raWUpKSB7CisJCXJldCA9ICgodm13X2ZlbmNlX29ial9zaWduYWxlZChmZW5jZSwgYXJnLT5mbGFncykpID8KKwkJICAgICAgIDAgOiAtRUJVU1kpOworCQlnb3RvIG91dDsKKwl9CisKKwl0aW1lb3V0ID0gKHVuc2lnbmVkIGxvbmcpYXJnLT5rZXJuZWxfY29va2llIC0gdGltZW91dDsKKworCXJldCA9IHZtd19mZW5jZV9vYmpfd2FpdChmZW5jZSwgYXJnLT5mbGFncywgYXJnLT5sYXp5LCB0cnVlLCB0aW1lb3V0KTsKKworb3V0OgorCXR0bV9iYXNlX29iamVjdF91bnJlZigmYmFzZSk7CisKKwkvKgorCSAqIE9wdGlvbmFsbHkgdW5yZWYgdGhlIGZlbmNlIG9iamVjdC4KKwkgKi8KKworCWlmIChyZXQgPT0gMCAmJiAoYXJnLT53YWl0X29wdGlvbnMgJiBEUk1fVk1XX1dBSVRfT1BUSU9OX1VOUkVGKSkKKwkJcmV0dXJuIHR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodGZpbGUsIGFyZy0+aGFuZGxlLAorCQkJCQkJIFRUTV9SRUZfVVNBR0UpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB2bXdfZmVuY2Vfb2JqX3NpZ25hbGVkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3NpZ25hbGVkX2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X2ZlbmNlX3NpZ25hbGVkX2FyZyAqKSBkYXRhOworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKmJhc2U7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbjsKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKKworCWJhc2UgPSB0dG1fYmFzZV9vYmplY3RfbG9va3VwKHRmaWxlLCBhcmctPmhhbmRsZSk7CisJaWYgKHVubGlrZWx5KGJhc2UgPT0gTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGZW5jZSBzaWduYWxlZCBpbnZhbGlkIGZlbmNlIG9iamVjdCBoYW5kbGUgIgorCQkgICAgICAgIjB4JTA4bHguXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYXJnLT5oYW5kbGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmZW5jZSA9ICYoY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCB2bXdfdXNlcl9mZW5jZSwgYmFzZSktPmZlbmNlKTsKKwlmbWFuID0gZmVuY2UtPmZtYW47CisKKwlhcmctPnNpZ25hbGVkID0gdm13X2ZlbmNlX29ial9zaWduYWxlZChmZW5jZSwgYXJnLT5mbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmZm1hbi0+bG9jayk7CisKKwlhcmctPnNpZ25hbGVkX2ZsYWdzID0gZmVuY2UtPnNpZ25hbGVkOworCWFyZy0+cGFzc2VkX3NlcW5vID0gZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubzsKKwlzcGluX3VubG9ja19pcnEoJmZtYW4tPmxvY2spOworCisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZiYXNlKTsKKwogCXJldHVybiAwOwogfQogCiAKK2ludCB2bXdfZmVuY2Vfb2JqX3VucmVmX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9hcmcgKmFyZyA9CisJCShzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9hcmcgKikgZGF0YTsKKworCXJldHVybiB0dG1fcmVmX29iamVjdF9iYXNlX3VucmVmKHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZSwKKwkJCQkJIGFyZy0+aGFuZGxlLAorCQkJCQkgVFRNX1JFRl9VU0FHRSk7Cit9CisKKy8qKgorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZXN0cm95CisgKgorICogQGtyZWY6IFRoZSBzdHJ1Y3Qga3JlZiBlbWJlZGRlZCBpbiBhIHN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uLgorICoKKyAqIFRoZSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uIGRlc3RydWN0b3IgdGhhdCBtYXkgYmUgY2FsbGVkIGVpdGhlciBhZnRlcgorICogdGhlIGZlbmNlIGFjdGlvbiBjbGVhbnVwLCBvciB3aGVuIHRoZSBldmVudCBpcyBkZWxpdmVyZWQuCisgKiBJdCBmcmVlcyBib3RoIHRoZSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uIHN0cnVjdCBhbmQgdGhlIGFjdHVhbAorICogZXZlbnQgc3RydWN0dXJlIGNvcGllZCB0byB1c2VyLXNwYWNlLgorICovCitzdGF0aWMgdm9pZCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24gKmVhY3Rpb24gPQorCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24sIGtyZWYpOworCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPQorCQl2bXdfbWVtX2dsb2Iodm13X3ByaXYoZWFjdGlvbi0+ZGV2KSk7CisJdWludDMyX3Qgc2l6ZSA9IGVhY3Rpb24tPnNpemU7CisKKwlrZnJlZShlYWN0aW9uLT5lLmV2ZW50KTsKKwlrZnJlZShlYWN0aW9uKTsKKwl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBzaXplKTsKK30KKworCisvKioKKyAqIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fZGVsaXZlcmVkCisgKgorICogQGU6IFRoZSBzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgZW1iZWRkZWQgaW4gYSBzdHJ1Y3QKKyAqIHZtd19ldmVudF9mZW5jZV9hY3Rpb24uCisgKgorICogVGhlIHN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCBkZXN0cnVjdG9yIHRoYXQgaXMgY2FsbGVkIGJ5IGRybQorICogb25jZSB0aGUgZXZlbnQgaXMgZGVsaXZlcmVkLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBmdW5jdGlvbgorICogd2lsbCBiZSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBmZW5jZSBhY3Rpb24gZGVzdHJ1Y3Rvciwgd2UKKyAqIGZyZWUgYSByZWZjb3VudCBhbmQgZGVzdHJveSBpZiBpdCBiZWNvbWVzIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fZGVsaXZlcmVkKHN0cnVjdCBkcm1fcGVuZGluZ19ldmVudCAqZSkKK3sKKwlzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiAqZWFjdGlvbiA9CisJCWNvbnRhaW5lcl9vZihlLCBzdHJ1Y3Qgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbiwgZSk7CisKKwlrcmVmX3B1dCgmZWFjdGlvbi0+a3JlZiwgdm13X2V2ZW50X2ZlbmNlX2FjdGlvbl9kZXN0cm95KTsKK30KKworCisvKioKKyAqIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fc2VxX3Bhc3NlZAorICoKKyAqIEBhY3Rpb246IFRoZSBzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiBlbWJlZGRlZCBpbiBhIHN0cnVjdAorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXFubyBvZiB0aGUgZmVuY2Ugd2hlcmUgQGFjdGlvbiBpcworICogYXR0YWNoZWQgaGFzIHBhc3NlZC4gSXQgcXVldWVzIHRoZSBldmVudCBvbiB0aGUgc3VibWl0dGVyJ3MgZXZlbnQgbGlzdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBmcm9tIGF0b21pYyBjb250ZXh0LCBhbmQgbWF5IGJlIGNhbGxlZAorICogZnJvbSBpcnEgY29udGV4dC4gSXQgdXBzIGEgcmVmY291bnQgcmVmbGVjdGluZyB0aGF0IHdlIG5vdyBoYXZlIHR3bworICogZGVzdHJ1Y3RvcnMuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fc2VxX3Bhc3NlZChzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uKQoreworCXN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uICplYWN0aW9uID0KKwkJY29udGFpbmVyX29mKGFjdGlvbiwgc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24sIGFjdGlvbik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVhY3Rpb24tPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiA9IGVhY3Rpb24tPmUuZmlsZV9wcml2OworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJa3JlZl9nZXQoJmVhY3Rpb24tPmtyZWYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7CisKKwlpZiAobGlrZWx5KGVhY3Rpb24tPnR2X3NlYyAhPSBOVUxMKSkgeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJKmVhY3Rpb24tPnR2X3NlYyA9IHR2LnR2X3NlYzsKKwkJKmVhY3Rpb24tPnR2X3VzZWMgPSB0di50dl91c2VjOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmVhY3Rpb24tPmUubGluaywgJmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CisJd2FrZV91cF9hbGwoJmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBpcnFfZmxhZ3MpOworfQorCisvKioKKyAqIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY2xlYW51cAorICoKKyAqIEBhY3Rpb246IFRoZSBzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiBlbWJlZGRlZCBpbiBhIHN0cnVjdAorICogdm13X2V2ZW50X2ZlbmNlX2FjdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiBkZXN0cnVjdG9yLiBJdCdzIHR5cGljYWxseQorICogY2FsbGVkIGZyb20gYSB3b3JrcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fY2xlYW51cChzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uKQoreworCXN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uICplYWN0aW9uID0KKwkJY29udGFpbmVyX29mKGFjdGlvbiwgc3RydWN0IHZtd19ldmVudF9mZW5jZV9hY3Rpb24sIGFjdGlvbik7CisKKwl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZlYWN0aW9uLT5mZW5jZSk7CisJa3JlZl9wdXQoJmVhY3Rpb24tPmtyZWYsIHZtd19ldmVudF9mZW5jZV9hY3Rpb25fZGVzdHJveSk7Cit9CisKKworLyoqCisgKiB2bXdfZmVuY2Vfb2JqX2FkZF9hY3Rpb24gLSBBZGQgYW4gYWN0aW9uIHRvIGEgZmVuY2Ugb2JqZWN0LgorICoKKyAqIEBmZW5jZSAtIFRoZSBmZW5jZSBvYmplY3QuCisgKiBAYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBhZGQuCisgKgorICogTm90ZSB0aGF0IHRoZSBhY3Rpb24gY2FsbGJhY2tzIG1heSBiZSBleGVjdXRlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucy4KKyAqLwordm9pZCB2bXdfZmVuY2Vfb2JqX2FkZF9hY3Rpb24oc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJICAgICAgc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gKmFjdGlvbikKK3sKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBmZW5jZS0+Zm1hbjsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlib29sIHJ1bl91cGRhdGUgPSBmYWxzZTsKKworCW11dGV4X2xvY2soJmZtYW4tPmdvYWxfaXJxX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZm1hbi0+bG9jaywgaXJxX2ZsYWdzKTsKKworCWZtYW4tPnBlbmRpbmdfYWN0aW9uc1thY3Rpb24tPnR5cGVdKys7CisJaWYgKGZlbmNlLT5zaWduYWxlZCAmIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgYWN0aW9uX2xpc3Q7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmFjdGlvbl9saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmYWN0aW9uLT5oZWFkLCAmYWN0aW9uX2xpc3QpOworCQl2bXdfZmVuY2VzX3BlcmZvcm1fYWN0aW9ucyhmbWFuLCAmYWN0aW9uX2xpc3QpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJmFjdGlvbi0+aGVhZCwgJmZlbmNlLT5zZXFfcGFzc2VkX2FjdGlvbnMpOworCisJCS8qCisJCSAqIFRoaXMgZnVuY3Rpb24gbWF5IHNldCBmbWFuOjpzZXFub192YWxpZCwgc28gaXQgbXVzdAorCQkgKiBiZSBydW4gd2l0aCB0aGUgZ29hbF9pcnFfbXV0ZXggaGVsZC4KKwkJICovCisJCXJ1bl91cGRhdGUgPSB2bXdfZmVuY2VfZ29hbF9jaGVja19sb2NrZWQoZmVuY2UpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZtYW4tPmxvY2ssIGlycV9mbGFncyk7CisKKwlpZiAocnVuX3VwZGF0ZSkgeworCQlpZiAoIWZtYW4tPmdvYWxfaXJxX29uKSB7CisJCQlmbWFuLT5nb2FsX2lycV9vbiA9IHRydWU7CisJCQl2bXdfZ29hbF93YWl0ZXJfYWRkKGZtYW4tPmRldl9wcml2KTsKKwkJfQorCQl2bXdfZmVuY2VzX3VwZGF0ZShmbWFuKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZmbWFuLT5nb2FsX2lycV9tdXRleCk7CisKK30KKworLyoqCisgKiB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NyZWF0ZSAtIFBvc3QgYW4gZXZlbnQgZm9yIHNlbmRpbmcgd2hlbiBhIGZlbmNlCisgKiBvYmplY3Qgc2Vxbm8gaGFzIHBhc3NlZC4KKyAqCisgKiBAZmlsZV9wcml2OiBUaGUgZmlsZSBjb25uZWN0aW9uIG9uIHdoaWNoIHRoZSBldmVudCBzaG91bGQgYmUgcG9zdGVkLgorICogQGZlbmNlOiBUaGUgZmVuY2Ugb2JqZWN0IG9uIHdoaWNoIHRvIHBvc3QgdGhlIGV2ZW50LgorICogQGV2ZW50OiBFdmVudCB0byBiZSBwb3N0ZWQuIFRoaXMgZXZlbnQgc2hvdWxkJ3ZlIGJlZW4gYWxsb2NlZAorICogdXNpbmcga1ttel1hbGxvYywgYW5kIHNob3VsZCd2ZSBiZWVuIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQuCisgKiBAaW50ZXJydXB0aWJsZTogSW50ZXJydXB0aWJsZSB3YWl0cyBpZiBwb3NzaWJsZS4KKyAqCisgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgQGV2ZW50IG1heSBoYXZlIGJlZW4KKyAqIGZyZWVkIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgd2l0aAorICogYW4gZXJyb3IgY29kZSwgdGhlIGNhbGxlciBuZWVkcyB0byBmcmVlIHRoYXQgb2JqZWN0LgorICovCisKK2ludCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSwKKwkJCQkgIHN0cnVjdCBkcm1fZXZlbnQgKmV2ZW50LAorCQkJCSAgdWludDMyX3QgKnR2X3NlYywKKwkJCQkgIHVpbnQzMl90ICp0dl91c2VjLAorCQkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCXN0cnVjdCB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uICplYWN0aW9uOworCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPQorCQl2bXdfbWVtX2dsb2IoZmVuY2UtPmZtYW4tPmRldl9wcml2KTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4gPSBmZW5jZS0+Zm1hbjsKKwl1aW50MzJfdCBzaXplID0gZm1hbi0+ZXZlbnRfZmVuY2VfYWN0aW9uX3NpemUgKworCQl0dG1fcm91bmRfcG90KGV2ZW50LT5sZW5ndGgpOworCWludCByZXQ7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGludGVybmFsIHN0cnVjdHVyZSBzaXplIGFzIHdlbGwgYXMgdGhlCisJICogZXZlbnQgc2l6ZSBpdHNlbGYuCisJICovCisKKwlyZXQgPSB0dG1fbWVtX2dsb2JhbF9hbGxvYyhtZW1fZ2xvYiwgc2l6ZSwgZmFsc2UsIGludGVycnVwdGlibGUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwllYWN0aW9uID0ga3phbGxvYyhzaXplb2YoKmVhY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoZWFjdGlvbiA9PSBOVUxMKSkgeworCQl0dG1fbWVtX2dsb2JhbF9mcmVlKG1lbV9nbG9iLCBzaXplKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZWFjdGlvbi0+ZS5ldmVudCA9IGV2ZW50OworCWVhY3Rpb24tPmUuZmlsZV9wcml2ID0gZmlsZV9wcml2OworCWVhY3Rpb24tPmUuZGVzdHJveSA9IHZtd19ldmVudF9mZW5jZV9hY3Rpb25fZGVsaXZlcmVkOworCisJZWFjdGlvbi0+YWN0aW9uLnNlcV9wYXNzZWQgPSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX3NlcV9wYXNzZWQ7CisJZWFjdGlvbi0+YWN0aW9uLmNsZWFudXAgPSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NsZWFudXA7CisJZWFjdGlvbi0+YWN0aW9uLnR5cGUgPSBWTVdfQUNUSU9OX0VWRU5UOworCisJZWFjdGlvbi0+ZmVuY2UgPSB2bXdfZmVuY2Vfb2JqX3JlZmVyZW5jZShmZW5jZSk7CisJZWFjdGlvbi0+ZGV2ID0gZm1hbi0+ZGV2X3ByaXYtPmRldjsKKwllYWN0aW9uLT5zaXplID0gc2l6ZTsKKwllYWN0aW9uLT50dl9zZWMgPSB0dl9zZWM7CisJZWFjdGlvbi0+dHZfdXNlYyA9IHR2X3VzZWM7CisKKwlrcmVmX2luaXQoJmVhY3Rpb24tPmtyZWYpOworCXZtd19mZW5jZV9vYmpfYWRkX2FjdGlvbihmZW5jZSwgJmVhY3Rpb24tPmFjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZtd19mZW5jZV9ldmVudF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcgKmFyZyA9CisJCShzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcgKikgZGF0YTsKKwlzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UgPSBOVUxMOworCXN0cnVjdCB2bXdfZnByaXYgKnZtd19mcCA9IHZtd19mcHJpdihmaWxlX3ByaXYpOworCXN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwID0KKwkJKHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykKKwkJYXJnLT5mZW5jZV9yZXA7CisJdWludDMyX3QgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBkcm1fdm13X2V2ZW50X2ZlbmNlICpldmVudDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBMb29rIHVwIGFuIGV4aXN0aW5nIGZlbmNlIG9iamVjdCwKKwkgKiBhbmQgaWYgdXNlci1zcGFjZSB3YW50cyBhIG5ldyByZWZlcmVuY2UsCisJICogYWRkIG9uZS4KKwkgKi8KKwlpZiAoYXJnLT5oYW5kbGUpIHsKKwkJc3RydWN0IHR0bV9iYXNlX29iamVjdCAqYmFzZSA9CisJCQl0dG1fYmFzZV9vYmplY3RfbG9va3VwKHZtd19mcC0+dGZpbGUsIGFyZy0+aGFuZGxlKTsKKworCQlpZiAodW5saWtlbHkoYmFzZSA9PSBOVUxMKSkgeworCQkJRFJNX0VSUk9SKCJGZW5jZSBldmVudCBpbnZhbGlkIGZlbmNlIG9iamVjdCBoYW5kbGUgIgorCQkJCSAgIjB4JTA4bHguXG4iLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpYXJnLT5oYW5kbGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZmVuY2UgPSAmKGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgdm13X3VzZXJfZmVuY2UsCisJCQkJICAgICAgIGJhc2UpLT5mZW5jZSk7CisJCSh2b2lkKSB2bXdfZmVuY2Vfb2JqX3JlZmVyZW5jZShmZW5jZSk7CisKKwkJaWYgKHVzZXJfZmVuY2VfcmVwICE9IE5VTEwpIHsKKwkJCWJvb2wgZXhpc3RlZDsKKworCQkJcmV0ID0gdHRtX3JlZl9vYmplY3RfYWRkKHZtd19mcC0+dGZpbGUsIGJhc2UsCisJCQkJCQkgVFRNX1JFRl9VU0FHRSwgJmV4aXN0ZWQpOworCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlZmVyZW5jZSBhIGZlbmNlICIKKwkJCQkJICAib2JqZWN0LlxuIik7CisJCQkJZ290byBvdXRfbm9fcmVmX29iajsKKwkJCX0KKwkJCWhhbmRsZSA9IGJhc2UtPmhhc2gua2V5OworCQl9CisJCXR0bV9iYXNlX29iamVjdF91bnJlZigmYmFzZSk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBuZXcgZmVuY2Ugb2JqZWN0LgorCSAqLworCWlmICghZmVuY2UpIHsKKwkJcmV0ID0gdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoZmlsZV9wcml2LCBkZXZfcHJpdiwKKwkJCQkJCSAmZmVuY2UsCisJCQkJCQkgKHVzZXJfZmVuY2VfcmVwKSA/CisJCQkJCQkgJmhhbmRsZSA6IE5VTEwpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCQlEUk1fRVJST1IoIkZlbmNlIGV2ZW50IGZhaWxlZCB0byBjcmVhdGUgZmVuY2UuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlCVUdfT04oZmVuY2UgPT0gTlVMTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBpcnFfZmxhZ3MpOworCisJcmV0ID0gKGZpbGVfcHJpdi0+ZXZlbnRfc3BhY2UgPCBzaXplb2YoKmV2ZW50KSkgPyAtRUJVU1kgOiAwOworCWlmIChsaWtlbHkocmV0ID09IDApKQorCQlmaWxlX3ByaXYtPmV2ZW50X3NwYWNlIC09IHNpemVvZigqZXZlbnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBldmVudCBzcGFjZSBmb3IgdGhpcyBmaWxlLlxuIik7CisJCWdvdG8gb3V0X25vX2V2ZW50X3NwYWNlOworCX0KKworCWV2ZW50ID0ga3phbGxvYyhzaXplb2YoKmV2ZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGV2ZW50ID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGFuIGV2ZW50LlxuIik7CisJCWdvdG8gb3V0X25vX2V2ZW50OworCX0KKworCWV2ZW50LT5iYXNlLnR5cGUgPSBEUk1fVk1XX0VWRU5UX0ZFTkNFX1NJR05BTEVEOworCWV2ZW50LT5iYXNlLmxlbmd0aCA9IHNpemVvZigqZXZlbnQpOworCWV2ZW50LT51c2VyX2RhdGEgPSBhcmctPnVzZXJfZGF0YTsKKworCWlmIChhcmctPmZsYWdzICYgRFJNX1ZNV19GRV9GTEFHX1JFUV9USU1FKQorCQlyZXQgPSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NyZWF0ZShmaWxlX3ByaXYsIGZlbmNlLAorCQkJCQkJICAgICZldmVudC0+YmFzZSwKKwkJCQkJCSAgICAmZXZlbnQtPnR2X3NlYywKKwkJCQkJCSAgICAmZXZlbnQtPnR2X3VzZWMsCisJCQkJCQkgICAgdHJ1ZSk7CisJZWxzZQorCQlyZXQgPSB2bXdfZXZlbnRfZmVuY2VfYWN0aW9uX2NyZWF0ZShmaWxlX3ByaXYsIGZlbmNlLAorCQkJCQkJICAgICZldmVudC0+YmFzZSwKKwkJCQkJCSAgICBOVUxMLAorCQkJCQkJICAgIE5VTEwsCisJCQkJCQkgICAgdHJ1ZSk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYXR0YWNoIGV2ZW50IHRvIGZlbmNlLlxuIik7CisJCWdvdG8gb3V0X25vX2F0dGFjaDsKKwl9CisKKwl2bXdfZXhlY2J1Zl9jb3B5X2ZlbmNlX3VzZXIoZGV2X3ByaXYsIHZtd19mcCwgMCwgdXNlcl9mZW5jZV9yZXAsIGZlbmNlLAorCQkJCSAgICBoYW5kbGUpOworCXZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2UoJmZlbmNlKTsKKwlyZXR1cm4gMDsKK291dF9ub19hdHRhY2g6CisJa2ZyZWUoZXZlbnQpOworb3V0X25vX2V2ZW50OgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7CisJZmlsZV9wcml2LT5ldmVudF9zcGFjZSArPSBzaXplb2YoKmV2ZW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGlycV9mbGFncyk7CitvdXRfbm9fZXZlbnRfc3BhY2U6CisJaWYgKHVzZXJfZmVuY2VfcmVwICE9IE5VTEwpCisJCXR0bV9yZWZfb2JqZWN0X2Jhc2VfdW5yZWYodm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlLAorCQkJCQkgIGhhbmRsZSwgVFRNX1JFRl9VU0FHRSk7CitvdXRfbm9fcmVmX29iajoKKwl2bXdfZmVuY2Vfb2JqX3VucmVmZXJlbmNlKCZmZW5jZSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZlbmNlLmggYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mZW5jZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVk1XR0ZYX0ZFTkNFX0hfCisKKyNkZWZpbmUgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVCAoNSpIWikKKworc3RydWN0IHZtd19wcml2YXRlOworCitzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXI7CisKKy8qKgorICoKKyAqCisgKi8KK2VudW0gdm13X2FjdGlvbl90eXBlIHsKKwlWTVdfQUNUSU9OX0VWRU5UID0gMCwKKwlWTVdfQUNUSU9OX01BWAorfTsKKworc3RydWN0IHZtd19mZW5jZV9hY3Rpb24geworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwllbnVtIHZtd19hY3Rpb25fdHlwZSB0eXBlOworCXZvaWQgKCpzZXFfcGFzc2VkKSAoc3RydWN0IHZtd19mZW5jZV9hY3Rpb24gKmFjdGlvbik7CisJdm9pZCAoKmNsZWFudXApIChzdHJ1Y3Qgdm13X2ZlbmNlX2FjdGlvbiAqYWN0aW9uKTsKK307CisKK3N0cnVjdCB2bXdfZmVuY2Vfb2JqIHsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXUzMiBzZXFubzsKKworCXN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJdWludDMyX3Qgc2lnbmFsZWQ7CisJdWludDMyX3Qgc2lnbmFsX21hc2s7CisJc3RydWN0IGxpc3RfaGVhZCBzZXFfcGFzc2VkX2FjdGlvbnM7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSk7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7Cit9OworCitleHRlcm4gc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICoKK3Ztd19mZW5jZV9tYW5hZ2VyX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CisKK2V4dGVybiB2b2lkIHZtd19mZW5jZV9tYW5hZ2VyX3Rha2Vkb3duKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbik7CisKK2V4dGVybiB2b2lkIHZtd19mZW5jZV9vYmpfdW5yZWZlcmVuY2Uoc3RydWN0IHZtd19mZW5jZV9vYmogKipmZW5jZV9wKTsKKworZXh0ZXJuIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICoKK3Ztd19mZW5jZV9vYmpfcmVmZXJlbmNlKHN0cnVjdCB2bXdfZmVuY2Vfb2JqICpmZW5jZSk7CisKK2V4dGVybiB2b2lkIHZtd19mZW5jZXNfdXBkYXRlKHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbik7CisKK2V4dGVybiBib29sIHZtd19mZW5jZV9vYmpfc2lnbmFsZWQoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLAorCQkJCSAgIHVpbnQzMl90IGZsYWdzKTsKKworZXh0ZXJuIGludCB2bXdfZmVuY2Vfb2JqX3dhaXQoc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlLCB1aW50MzJfdCBmbGFncywKKwkJCSAgICAgIGJvb2wgbGF6eSwKKwkJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX29ial9mbHVzaChzdHJ1Y3Qgdm13X2ZlbmNlX29iaiAqZmVuY2UpOworCitleHRlcm4gaW50IHZtd19mZW5jZV9jcmVhdGUoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuLAorCQkJICAgIHVpbnQzMl90IHNlcW5vLAorCQkJICAgIHVpbnQzMl90IG1hc2ssCisJCQkgICAgc3RydWN0IHZtd19mZW5jZV9vYmogKipwX2ZlbmNlKTsKKworZXh0ZXJuIGludCB2bXdfdXNlcl9mZW5jZV9jcmVhdGUoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJIHN0cnVjdCB2bXdfZmVuY2VfbWFuYWdlciAqZm1hbiwKKwkJCQkgdWludDMyX3Qgc2VxdWVuY2UsCisJCQkJIHVpbnQzMl90IG1hc2ssCisJCQkJIHN0cnVjdCB2bXdfZmVuY2Vfb2JqICoqcF9mZW5jZSwKKwkJCQkgdWludDMyX3QgKnBfaGFuZGxlKTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX2ZpZm9fdXAoc3RydWN0IHZtd19mZW5jZV9tYW5hZ2VyICpmbWFuKTsKKworZXh0ZXJuIHZvaWQgdm13X2ZlbmNlX2ZpZm9fZG93bihzdHJ1Y3Qgdm13X2ZlbmNlX21hbmFnZXIgKmZtYW4pOworCitleHRlcm4gaW50IHZtd19mZW5jZV9vYmpfd2FpdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKK2V4dGVybiBpbnQgdm13X2ZlbmNlX29ial9zaWduYWxlZF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CisKK2V4dGVybiBpbnQgdm13X2ZlbmNlX29ial91bnJlZl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworZXh0ZXJuIGludCB2bXdfZmVuY2VfZXZlbnRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOworCisjZW5kaWYgLyogX1ZNV0dGWF9GRU5DRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jCmluZGV4IDYzNWMwZmYuLjAzYmJjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9maWZvLmMKQEAgLTQ1LDcgKzQ1LDExIEBACiAJaWYgKGh3dmVyc2lvbiA9PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoaHd2ZXJzaW9uIDwgU1ZHQTNEX0hXVkVSU0lPTl9XUzY1X0IxKQorCWlmIChod3ZlcnNpb24gPCBTVkdBM0RfSFdWRVJTSU9OX1dTOF9CMSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogTm9uLVNjcmVlbiBPYmplY3QgcGF0aCBkb2VzIG5vdCBzdXBwb3J0IHN1cmZhY2VzICovCisJaWYgKCFkZXZfcHJpdi0+c291X3ByaXYpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtNzIsMjIgKzc2LDEyIEBACiAJdWludDMyX3QgbWF4OwogCXVpbnQzMl90IG1pbjsKIAl1aW50MzJfdCBkdW1teTsKLQlpbnQgcmV0OwogCiAJZmlmby0+c3RhdGljX2J1ZmZlcl9zaXplID0gVk1XR0ZYX0ZJRk9fU1RBVElDX1NJWkU7CiAJZmlmby0+c3RhdGljX2J1ZmZlciA9IHZtYWxsb2MoZmlmby0+c3RhdGljX2J1ZmZlcl9zaXplKTsKIAlpZiAodW5saWtlbHkoZmlmby0+c3RhdGljX2J1ZmZlciA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmaWZvLT5sYXN0X2J1ZmZlcl9zaXplID0gVk1XR0ZYX0ZJRk9fU1RBVElDX1NJWkU7Ci0JZmlmby0+bGFzdF9kYXRhX3NpemUgPSAwOwotCWZpZm8tPmxhc3RfYnVmZmVyX2FkZCA9IGZhbHNlOwotCWZpZm8tPmxhc3RfYnVmZmVyID0gdm1hbGxvYyhmaWZvLT5sYXN0X2J1ZmZlcl9zaXplKTsKLQlpZiAodW5saWtlbHkoZmlmby0+bGFzdF9idWZmZXIgPT0gTlVMTCkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQogCWZpZm8tPmR5bmFtaWNfYnVmZmVyID0gTlVMTDsKIAlmaWZvLT5yZXNlcnZlZF9zaXplID0gMDsKIAlmaWZvLT51c2luZ19ib3VuY2VfYnVmZmVyID0gZmFsc2U7CkBAIC0xMzcsMTQgKzEzMSwxMCBAQAogCQkgKHVuc2lnbmVkIGludCkgbWluLAogCQkgKHVuc2lnbmVkIGludCkgZmlmby0+Y2FwYWJpbGl0aWVzKTsKIAotCWF0b21pY19zZXQoJmRldl9wcml2LT5mZW5jZV9zZXEsIGRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UpOwotCWlvd3JpdGUzMihkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlLCBmaWZvX21lbSArIFNWR0FfRklGT19GRU5DRSk7Ci0Jdm13X2ZlbmNlX3F1ZXVlX2luaXQoJmZpZm8tPmZlbmNlX3F1ZXVlKTsKKwlhdG9taWNfc2V0KCZkZXZfcHJpdi0+bWFya2VyX3NlcSwgZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyk7CisJaW93cml0ZTMyKGRldl9wcml2LT5sYXN0X3JlYWRfc2Vxbm8sIGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKKwl2bXdfbWFya2VyX3F1ZXVlX2luaXQoJmZpZm8tPm1hcmtlcl9xdWV1ZSk7CiAJcmV0dXJuIHZtd19maWZvX3NlbmRfZmVuY2UoZGV2X3ByaXYsICZkdW1teSk7Ci1vdXRfZXJyOgotCXZmcmVlKGZpZm8tPnN0YXRpY19idWZmZXIpOwotCWZpZm8tPnN0YXRpY19idWZmZXIgPSBOVUxMOwotCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgdm13X2ZpZm9fcGluZ19ob3N0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IHJlYXNvbikKQEAgLTE3MCw3ICsxNjAsNyBAQAogCXdoaWxlICh2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfQlVTWSkgIT0gMCkKIAkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19TWU5DLCBTVkdBX1NZTkNfR0VORVJJQyk7CiAKLQlkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOworCWRldl9wcml2LT5sYXN0X3JlYWRfc2Vxbm8gPSBpb3JlYWQzMihmaWZvX21lbSArIFNWR0FfRklGT19GRU5DRSk7CiAKIAl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0NPTkZJR19ET05FLAogCQkgIGRldl9wcml2LT5jb25maWdfZG9uZV9zdGF0ZSk7CkBAIC0xODAsMTIgKzE3MCw3IEBACiAJCSAgZGV2X3ByaXYtPnRyYWNlc19zdGF0ZSk7CiAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7Ci0Jdm13X2ZlbmNlX3F1ZXVlX3Rha2Vkb3duKCZmaWZvLT5mZW5jZV9xdWV1ZSk7Ci0KLQlpZiAobGlrZWx5KGZpZm8tPmxhc3RfYnVmZmVyICE9IE5VTEwpKSB7Ci0JCXZmcmVlKGZpZm8tPmxhc3RfYnVmZmVyKTsKLQkJZmlmby0+bGFzdF9idWZmZXIgPSBOVUxMOwotCX0KKwl2bXdfbWFya2VyX3F1ZXVlX3Rha2Vkb3duKCZmaWZvLT5tYXJrZXJfcXVldWUpOwogCiAJaWYgKGxpa2VseShmaWZvLT5zdGF0aWNfYnVmZmVyICE9IE5VTEwpKSB7CiAJCXZmcmVlKGZpZm8tPnN0YXRpY19idWZmZXIpOwpAQCAtMjYyLDkgKzI0Nyw4IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CiAJCW91dGwoU1ZHQV9JUlFGTEFHX0ZJRk9fUFJPR1JFU1MsCiAJCSAgICAgZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKLQkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLAotCQkJICB2bXdfcmVhZChkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSykgfAotCQkJICBTVkdBX0lSUUZMQUdfRklGT19QUk9HUkVTUyk7CisJCWRldl9wcml2LT5pcnFfbWFzayB8PSBTVkdBX0lSUUZMQUdfRklGT19QUk9HUkVTUzsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLCBkZXZfcHJpdi0+aXJxX21hc2spOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CiAJfQogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKQEAgLTI4Niw5ICsyNzAsOCBAQAogCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldl9wcml2LT5maWZvX3F1ZXVlX3dhaXRlcnMpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7Ci0JCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSywKLQkJCSAgdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0spICYKLQkJCSAgflNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5TVkdBX0lSUUZMQUdfRklGT19QUk9HUkVTUzsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLCBkZXZfcHJpdi0+aXJxX21hc2spOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CiAJfQogCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKQEAgLTI5Niw2ICsyNzksMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIFJlc2VydmUgQGJ5dGVzIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmlmby4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIE5VTEwgKGVycm9yKSBvbiB0d28gY29uZGl0aW9uczoKKyAqICBJZiBpdCB0aW1lb3V0cyB3YWl0aW5nIGZvciBmaWZvIHNwYWNlLCBvciBpZiBAYnl0ZXMgaXMgbGFyZ2VyIHRoYW4gdGhlCisgKiAgIGF2YWlsYWJsZSBmaWZvIHNwYWNlLgorICoKKyAqIFJldHVybnM6CisgKiAgIFBvaW50ZXIgdG8gdGhlIGZpZm8sIG9yIG51bGwgb24gZXJyb3IgKHBvc3NpYmxlIGhhcmR3YXJlIGhhbmcpLgorICovCiB2b2lkICp2bXdfZmlmb19yZXNlcnZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IGJ5dGVzKQogewogCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZSA9ICZkZXZfcHJpdi0+ZmlmbzsKQEAgLTQ2Niw3ICs0NTksNyBAQAogCW11dGV4X3VubG9jaygmZmlmb19zdGF0ZS0+Zmlmb19tdXRleCk7CiB9CiAKLWludCB2bXdfZmlmb19zZW5kX2ZlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90ICpzZXF1ZW5jZSkKK2ludCB2bXdfZmlmb19zZW5kX2ZlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90ICpzZXFubykKIHsKIAlzdHJ1Y3Qgdm13X2ZpZm9fc3RhdGUgKmZpZm9fc3RhdGUgPSAmZGV2X3ByaXYtPmZpZm87CiAJc3RydWN0IHN2Z2FfZmlmb19jbWRfZmVuY2UgKmNtZF9mZW5jZTsKQEAgLTQ3NiwxNiArNDY5LDE2IEBACiAKIAlmbSA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGJ5dGVzKTsKIAlpZiAodW5saWtlbHkoZm0gPT0gTlVMTCkpIHsKLQkJKnNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5mZW5jZV9zZXEpOworCQkqc2Vxbm8gPSBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1hcmtlcl9zZXEpOwogCQlyZXQgPSAtRU5PTUVNOwotCQkodm9pZCl2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsICpzZXF1ZW5jZSwKKwkJKHZvaWQpdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGZhbHNlLCB0cnVlLCAqc2Vxbm8sCiAJCQkJCWZhbHNlLCAzKkhaKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCWRvIHsKLQkJKnNlcXVlbmNlID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldl9wcml2LT5mZW5jZV9zZXEpOwotCX0gd2hpbGUgKCpzZXF1ZW5jZSA9PSAwKTsKKwkJKnNlcW5vID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldl9wcml2LT5tYXJrZXJfc2VxKTsKKwl9IHdoaWxlICgqc2Vxbm8gPT0gMCk7CiAKIAlpZiAoIShmaWZvX3N0YXRlLT5jYXBhYmlsaXRpZXMgJiBTVkdBX0ZJRk9fQ0FQX0ZFTkNFKSkgewogCkBAIC01MDIsNjEgKzQ5NSw2OCBAQAogCWNtZF9mZW5jZSA9IChzdHJ1Y3Qgc3ZnYV9maWZvX2NtZF9mZW5jZSAqKQogCSAgICAoKHVuc2lnbmVkIGxvbmcpZm0gKyBzaXplb2YoX19sZTMyKSk7CiAKLQlpb3dyaXRlMzIoKnNlcXVlbmNlLCAmY21kX2ZlbmNlLT5mZW5jZSk7Ci0JZmlmb19zdGF0ZS0+bGFzdF9idWZmZXJfYWRkID0gdHJ1ZTsKKwlpb3dyaXRlMzIoKnNlcW5vLCAmY21kX2ZlbmNlLT5mZW5jZSk7CiAJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBieXRlcyk7Ci0JZmlmb19zdGF0ZS0+bGFzdF9idWZmZXJfYWRkID0gZmFsc2U7Ci0JKHZvaWQpIHZtd19mZW5jZV9wdXNoKCZmaWZvX3N0YXRlLT5mZW5jZV9xdWV1ZSwgKnNlcXVlbmNlKTsKLQl2bXdfdXBkYXRlX3NlcXVlbmNlKGRldl9wcml2LCBmaWZvX3N0YXRlKTsKKwkodm9pZCkgdm13X21hcmtlcl9wdXNoKCZmaWZvX3N0YXRlLT5tYXJrZXJfcXVldWUsICpzZXFubyk7CisJdm13X3VwZGF0ZV9zZXFubyhkZXZfcHJpdiwgZmlmb19zdGF0ZSk7CiAKIG91dF9lcnI6CiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiBNYXAgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIEZJRk8gcmVhZC1vbmx5IHRvIHVzZXItc3BhY2UuCisgKiB2bXdfZmlmb19lbWl0X2R1bW15X3F1ZXJ5IC0gZW1pdHMgYSBkdW1teSBxdWVyeSB0byB0aGUgZmlmby4KKyAqCisgKiBAZGV2X3ByaXY6IFRoZSBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKiBAY2lkOiBUaGUgaGFyZHdhcmUgY29udGV4dCBpZCB1c2VkIGZvciB0aGUgcXVlcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVtaXQgYSBkdW1teSBvY2NsdXNpb24gcXVlcnkgd2l0aAorICogbm8gcHJpbWl0aXZlcyByZW5kZXJlZCBiZXR3ZWVuIHF1ZXJ5IGJlZ2luIGFuZCBxdWVyeSBlbmQuCisgKiBJdCdzIHVzZWQgdG8gcHJvdmlkZSBhIHF1ZXJ5IGJhcnJpZXIsIGluIG9yZGVyIHRvIGtub3cgdGhhdCB3aGVuCisgKiB0aGlzIHF1ZXJ5IGlzIGZpbmlzaGVkLCBhbGwgcHJlY2VkaW5nIHF1ZXJpZXMgYXJlIGFsc28gZmluaXNoZWQuCisgKgorICogQSBRdWVyeSByZXN1bHRzIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGF0IHRoZSBzdGFydAorICogb2YgdGhlIGRldl9wcml2LT5kdW1teV9xdWVyeV9ibyBidWZmZXIgb2JqZWN0LiBBbmQgdGhhdCBidWZmZXIgb2JqZWN0CisgKiBtdXN0IGFsc28gYmUgZWl0aGVyIHJlc2VydmVkIG9yIHBpbm5lZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIFJldHVybnMgLUVOT01FTSBvbiBmYWlsdXJlIHRvIHJlc2VydmUgZmlmbyBzcGFjZS4KICAqLwotCi1zdGF0aWMgaW50IHZtd19maWZvX3ZtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK2ludCB2bXdfZmlmb19lbWl0X2R1bW15X3F1ZXJ5KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICB1aW50MzJfdCBjaWQpCiB7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzczsKKwkvKgorCSAqIEEgcXVlcnkgd2FpdCB3aXRob3V0IGEgcHJlY2VkaW5nIHF1ZXJ5IGVuZCB3aWxsCisJICogYWN0dWFsbHkgZmluaXNoIGFsbCBxdWVyaWVzIGZvciB0aGlzIGNpZAorCSAqIHdpdGhvdXQgd3JpdGluZyB0byB0aGUgcXVlcnkgcmVzdWx0IHN0cnVjdHVyZS4KKwkgKi8KIAotCWlmIChhZGRyZXNzICE9IHZtYS0+dm1fc3RhcnQpCi0JCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGRldl9wcml2LT5kdW1teV9xdWVyeV9ibzsKKwlzdHJ1Y3QgeworCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCQlTVkdBM2RDbWRXYWl0Rm9yUXVlcnkgYm9keTsKKwl9ICpjbWQ7CiAKLQlyZXQgPSB2bV9pbnNlcnRfcGZuKHZtYSwgYWRkcmVzcywgdm1hLT52bV9wZ29mZik7Ci0JaWYgKGxpa2VseShyZXQgPT0gLUVCVVNZIHx8IHJldCA9PSAwKSkKLQkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKLQllbHNlIGlmIChyZXQgPT0gLUVOT01FTSkKLQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwogCi0JcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLX0KKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiT3V0IG9mIGZpZm8gc3BhY2UgZm9yIGR1bW15IHF1ZXJ5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCB2bXdfZmlmb192bV9vcHMgPSB7Ci0JLmZhdWx0ID0gdm13X2ZpZm9fdm1fZmF1bHQsCi0JLm9wZW4gPSBOVUxMLAotCS5jbG9zZSA9IE5VTEwKLX07CisJY21kLT5oZWFkZXIuaWQgPSBTVkdBXzNEX0NNRF9XQUlUX0ZPUl9RVUVSWTsKKwljbWQtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZC0+Ym9keSk7CisJY21kLT5ib2R5LmNpZCA9IGNpZDsKKwljbWQtPmJvZHkudHlwZSA9IFNWR0EzRF9RVUVSWVRZUEVfT0NDTFVTSU9OOwogCi1pbnQgdm13X2ZpZm9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7Ci0Jc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdjsKKwlpZiAoYm8tPm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkgeworCQljbWQtPmJvZHkuZ3Vlc3RSZXN1bHQuZ21ySWQgPSBTVkdBX0dNUl9GUkFNRUJVRkZFUjsKKwkJY21kLT5ib2R5Lmd1ZXN0UmVzdWx0Lm9mZnNldCA9IGJvLT5vZmZzZXQ7CisJfSBlbHNlIHsKKwkJY21kLT5ib2R5Lmd1ZXN0UmVzdWx0LmdtcklkID0gYm8tPm1lbS5zdGFydDsKKwkJY21kLT5ib2R5Lmd1ZXN0UmVzdWx0Lm9mZnNldCA9IDA7CisJfQogCi0JZmlsZV9wcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRldl9wcml2ID0gdm13X3ByaXYoZmlsZV9wcml2LT5taW5vci0+ZGV2KTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CiAKLQlpZiAodm1hLT52bV9wZ29mZiAhPSAoZGV2X3ByaXYtPm1taW9fc3RhcnQgPj4gUEFHRV9TSElGVCkgfHwKLQkgICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgIT0gUEFHRV9TSVpFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZtYS0+dm1fZmxhZ3MgJj0gfihWTV9XUklURSB8IFZNX01BWVdSSVRFKTsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUEZOTUFQIHwgVk1fRE9OVEVYUEFORCB8IFZNX1NIQVJFRDsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHZtX2dldF9wYWdlX3Byb3Qodm1hLT52bV9mbGFncyk7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSB0dG1faW9fcHJvdChUVE1fUExfRkxBR19VTkNBQ0hFRCwKLQkJCQkJdm1hLT52bV9wYWdlX3Byb3QpOwotCXZtYS0+dm1fb3BzID0gJnZtd19maWZvX3ZtX29wczsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKaW5kZXggZGUwYzU5NC4uZjRlNzc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yLmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIENvcHlyaWdodCDCqSAyMDA5LTIwMTEgVk13YXJlLCBJbmMuLCBQYWxvIEFsdG8sIENBLiwgVVNBCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCkBAIC0yOSw2ICsyOSw3NyBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJ0dG0vdHRtX2JvX2RyaXZlci5oIgogCisjZGVmaW5lIFZNV19QUE5fU0laRSBzaXplb2YodW5zaWduZWQgbG9uZykKKworc3RhdGljIGludCB2bXdfZ21yMl9iaW5kKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgc3RydWN0IHBhZ2UgKnBhZ2VzW10sCisJCQkgdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsCisJCQkgaW50IGdtcl9pZCkKK3sKKwlTVkdBRmlmb0NtZERlZmluZUdNUjIgZGVmaW5lX2NtZDsKKwlTVkdBRmlmb0NtZFJlbWFwR01SMiByZW1hcF9jbWQ7CisJdWludDMyX3QgZGVmaW5lX3NpemUgPSBzaXplb2YoZGVmaW5lX2NtZCkgKyA0OworCXVpbnQzMl90IHJlbWFwX3NpemUgPSBWTVdfUFBOX1NJWkUgKiBudW1fcGFnZXMgKyBzaXplb2YocmVtYXBfY21kKSArIDQ7CisJdWludDMyX3QgKmNtZDsKKwl1aW50MzJfdCAqY21kX29yaWc7CisJdWludDMyX3QgaTsKKworCWNtZF9vcmlnID0gY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgZGVmaW5lX3NpemUgKyByZW1hcF9zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlZmluZV9jbWQuZ21ySWQgPSBnbXJfaWQ7CisJZGVmaW5lX2NtZC5udW1QYWdlcyA9IG51bV9wYWdlczsKKworCXJlbWFwX2NtZC5nbXJJZCA9IGdtcl9pZDsKKwlyZW1hcF9jbWQuZmxhZ3MgPSAoVk1XX1BQTl9TSVpFID4gc2l6ZW9mKCpjbWQpKSA/CisJCVNWR0FfUkVNQVBfR01SMl9QUE42NCA6IFNWR0FfUkVNQVBfR01SMl9QUE4zMjsKKwlyZW1hcF9jbWQub2Zmc2V0UGFnZXMgPSAwOworCXJlbWFwX2NtZC5udW1QYWdlcyA9IG51bV9wYWdlczsKKworCSpjbWQrKyA9IFNWR0FfQ01EX0RFRklORV9HTVIyOworCW1lbWNweShjbWQsICZkZWZpbmVfY21kLCBzaXplb2YoZGVmaW5lX2NtZCkpOworCWNtZCArPSBzaXplb2YoZGVmaW5lX2NtZCkgLyBzaXplb2YodWludDMyKTsKKworCSpjbWQrKyA9IFNWR0FfQ01EX1JFTUFQX0dNUjI7CisJbWVtY3B5KGNtZCwgJnJlbWFwX2NtZCwgc2l6ZW9mKHJlbWFwX2NtZCkpOworCWNtZCArPSBzaXplb2YocmVtYXBfY21kKSAvIHNpemVvZih1aW50MzIpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKytpKSB7CisJCWlmIChWTVdfUFBOX1NJWkUgPiA0KQorCQkJKmNtZCA9IHBhZ2VfdG9fcGZuKCpwYWdlcysrKTsKKwkJZWxzZQorCQkJKigodWludDY0X3QgKiljbWQpID0gcGFnZV90b19wZm4oKnBhZ2VzKyspOworCisJCWNtZCArPSBWTVdfUFBOX1NJWkUgLyBzaXplb2YoKmNtZCk7CisJfQorCisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBkZWZpbmVfc2l6ZSArIHJlbWFwX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtd19nbXIyX3VuYmluZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgIGludCBnbXJfaWQpCit7CisJU1ZHQUZpZm9DbWREZWZpbmVHTVIyIGRlZmluZV9jbWQ7CisJdWludDMyX3QgZGVmaW5lX3NpemUgPSBzaXplb2YoZGVmaW5lX2NtZCkgKyA0OworCXVpbnQzMl90ICpjbWQ7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBkZWZpbmVfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkdNUjIgdW5iaW5kIGZhaWxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCWRlZmluZV9jbWQuZ21ySWQgPSBnbXJfaWQ7CisJZGVmaW5lX2NtZC5udW1QYWdlcyA9IDA7CisKKwkqY21kKysgPSBTVkdBX0NNRF9ERUZJTkVfR01SMjsKKwltZW1jcHkoY21kLCAmZGVmaW5lX2NtZCwgc2l6ZW9mKGRlZmluZV9jbWQpKTsKKworCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgZGVmaW5lX3NpemUpOworfQorCiAvKioKICAqIEZJWE1FOiBBZGp1c3QgdG8gdGhlIHR0bSBsb3dtZW0gLyBoaWdobWVtIHN0b3JhZ2UgdG8gbWluaW1pemUKICAqIHRoZSBudW1iZXIgb2YgdXNlZCBkZXNjcmlwdG9ycy4KQEAgLTE3MCw2ICsyNDEsOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZGVzY19wYWdlczsKIAlpbnQgcmV0OwogCisJaWYgKGxpa2VseShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikpCisJCXJldHVybiB2bXdfZ21yMl9iaW5kKGRldl9wcml2LCBwYWdlcywgbnVtX3BhZ2VzLCBnbXJfaWQpOworCiAJaWYgKHVubGlrZWx5KCEoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0dNUikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTkyLDYgKzI2NiwxMSBAQAogCiB2b2lkIHZtd19nbXJfdW5iaW5kKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBnbXJfaWQpCiB7CisJaWYgKGxpa2VseShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfR01SMikpIHsKKwkJdm13X2dtcjJfdW5iaW5kKGRldl9wcml2LCBnbXJfaWQpOworCQlyZXR1cm47CisJfQorCiAJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKIAl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0dNUl9JRCwgZ21yX2lkKTsKIAl3bWIoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtcmlkX21hbmFnZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2dtcmlkX21hbmFnZXIuYwppbmRleCBhYzZlMGQxLi41ZjcxNzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9nbXJpZF9tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZ21yaWRfbWFuYWdlci5jCkBAIC00MCw2ICs0MCw4IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBpZGEgZ21yX2lkYTsKIAl1aW50MzJfdCBtYXhfZ21yX2lkczsKKwl1aW50MzJfdCBtYXhfZ21yX3BhZ2VzOworCXVpbnQzMl90IHVzZWRfZ21yX3BhZ2VzOwogfTsKIAogc3RhdGljIGludCB2bXdfZ21yaWRfbWFuX2dldF9ub2RlKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLApAQCAtNDksMzMgKzUxLDUwIEBACiB7CiAJc3RydWN0IHZtd2dmeF9nbXJpZF9tYW4gKmdtYW4gPQogCQkoc3RydWN0IHZtd2dmeF9nbXJpZF9tYW4gKiltYW4tPnByaXY7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgaWQ7CiAKIAltZW0tPm1tX25vZGUgPSBOVUxMOwogCisJc3Bpbl9sb2NrKCZnbWFuLT5sb2NrKTsKKworCWlmIChnbWFuLT5tYXhfZ21yX3BhZ2VzID4gMCkgeworCQlnbWFuLT51c2VkX2dtcl9wYWdlcyArPSBiby0+bnVtX3BhZ2VzOworCQlpZiAodW5saWtlbHkoZ21hbi0+dXNlZF9nbXJfcGFnZXMgPiBnbWFuLT5tYXhfZ21yX3BhZ2VzKSkKKwkJCWdvdG8gb3V0X2Vycl9sb2NrZWQ7CisJfQorCiAJZG8gewotCQlpZiAodW5saWtlbHkoaWRhX3ByZV9nZXQoJmdtYW4tPmdtcl9pZGEsIEdGUF9LRVJORUwpID09IDApKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KKwkJc3Bpbl91bmxvY2soJmdtYW4tPmxvY2spOworCQlpZiAodW5saWtlbHkoaWRhX3ByZV9nZXQoJmdtYW4tPmdtcl9pZGEsIEdGUF9LRVJORUwpID09IDApKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZXJyOworCQl9CiAJCXNwaW5fbG9jaygmZ21hbi0+bG9jayk7Ci0JCXJldCA9IGlkYV9nZXRfbmV3KCZnbWFuLT5nbXJfaWRhLCAmaWQpOwogCisJCXJldCA9IGlkYV9nZXRfbmV3KCZnbWFuLT5nbXJfaWRhLCAmaWQpOwogCQlpZiAodW5saWtlbHkocmV0ID09IDAgJiYgaWQgPj0gZ21hbi0+bWF4X2dtcl9pZHMpKSB7CiAJCQlpZGFfcmVtb3ZlKCZnbWFuLT5nbXJfaWRhLCBpZCk7Ci0JCQlzcGluX3VubG9jaygmZ21hbi0+bG9jayk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dF9lcnJfbG9ja2VkOwogCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmdtYW4tPmxvY2spOwotCiAJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4pOwogCiAJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKIAkJbWVtLT5tbV9ub2RlID0gZ21hbjsKIAkJbWVtLT5zdGFydCA9IGlkOwotCX0KKwkJbWVtLT5udW1fcGFnZXMgPSBiby0+bnVtX3BhZ2VzOworCX0gZWxzZQorCQlnb3RvIG91dF9lcnJfbG9ja2VkOwogCisJc3Bpbl91bmxvY2soJmdtYW4tPmxvY2spOworCXJldHVybiAwOworCitvdXRfZXJyOgorCXNwaW5fbG9jaygmZ21hbi0+bG9jayk7CitvdXRfZXJyX2xvY2tlZDoKKwlnbWFuLT51c2VkX2dtcl9wYWdlcyAtPSBiby0+bnVtX3BhZ2VzOworCXNwaW5fdW5sb2NrKCZnbWFuLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04OCw2ICsxMDcsNyBAQAogCWlmIChtZW0tPm1tX25vZGUpIHsKIAkJc3Bpbl9sb2NrKCZnbWFuLT5sb2NrKTsKIAkJaWRhX3JlbW92ZSgmZ21hbi0+Z21yX2lkYSwgbWVtLT5zdGFydCk7CisJCWdtYW4tPnVzZWRfZ21yX3BhZ2VzIC09IG1lbS0+bnVtX3BhZ2VzOwogCQlzcGluX3VubG9jaygmZ21hbi0+bG9jayk7CiAJCW1lbS0+bW1fbm9kZSA9IE5VTEw7CiAJfQpAQCAtOTYsNiArMTE2LDggQEAKIHN0YXRpYyBpbnQgdm13X2dtcmlkX21hbl9pbml0KHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBwX3NpemUpCiB7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9CisJCWNvbnRhaW5lcl9vZihtYW4tPmJkZXYsIHN0cnVjdCB2bXdfcHJpdmF0ZSwgYmRldik7CiAJc3RydWN0IHZtd2dmeF9nbXJpZF9tYW4gKmdtYW4gPQogCQlremFsbG9jKHNpemVvZigqZ21hbiksIEdGUF9LRVJORUwpOwogCkBAIC0xMDMsNiArMTI1LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaW5pdCgmZ21hbi0+bG9jayk7CisJZ21hbi0+bWF4X2dtcl9wYWdlcyA9IGRldl9wcml2LT5tYXhfZ21yX3BhZ2VzOworCWdtYW4tPnVzZWRfZ21yX3BhZ2VzID0gMDsKIAlpZGFfaW5pdCgmZ21hbi0+Z21yX2lkYSk7CiAJZ21hbi0+bWF4X2dtcl9pZHMgPSBwX3NpemU7CiAJbWFuLT5wcml2ID0gKHZvaWQgKikgZ21hbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lvY3RsLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pb2N0bC5jCmluZGV4IDU3MGQ1NzcuLjNmNjM0MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lvY3RsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSAidm13Z2Z4X2Rydi5oIgogI2luY2x1ZGUgInZtd2dmeF9kcm0uaCIKKyNpbmNsdWRlICJ2bXdnZnhfa21zLmgiCiAKIGludCB2bXdfZ2V0cGFyYW1faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQpAQCAtNDUsOSArNDYsNiBAQAogCWNhc2UgRFJNX1ZNV19QQVJBTV8zRDoKIAkJcGFyYW0tPnZhbHVlID0gdm13X2ZpZm9faGF2ZV8zZChkZXZfcHJpdikgPyAxIDogMDsKIAkJYnJlYWs7Ci0JY2FzZSBEUk1fVk1XX1BBUkFNX0ZJRk9fT0ZGU0VUOgotCQlwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+bW1pb19zdGFydDsKLQkJYnJlYWs7CiAJY2FzZSBEUk1fVk1XX1BBUkFNX0hXX0NBUFM6CiAJCXBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5jYXBhYmlsaXRpZXM7CiAJCWJyZWFrOwpAQCAtNTcsNiArNTUsMTMgQEAKIAljYXNlIERSTV9WTVdfUEFSQU1fTUFYX0ZCX1NJWkU6CiAJCXBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT52cmFtX3NpemU7CiAJCWJyZWFrOworCWNhc2UgRFJNX1ZNV19QQVJBTV9GSUZPX0hXX1ZFUlNJT046CisJeworCQlfX2xlMzIgX19pb21lbSAqZmlmb19tZW0gPSBkZXZfcHJpdi0+bW1pb192aXJ0OworCisJCXBhcmFtLT52YWx1ZSA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTik7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlEUk1fRVJST1IoIklsbGVnYWwgdm13Z2Z4IGdldCBwYXJhbSByZXF1ZXN0OiAlZFxuIiwKIAkJCSAgcGFyYW0tPnBhcmFtKTsKQEAgLTY2LDI1ICs3MSwyNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZtd19maWZvX2RlYnVnX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisKK2ludCB2bXdfZ2V0X2NhcF8zZF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogeworCXN0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnICphcmcgPQorCQkoc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcgKikgZGF0YTsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm13X2ZpZm9fc3RhdGUgKmZpZm9fc3RhdGUgPSAmZGV2X3ByaXYtPmZpZm87Ci0Jc3RydWN0IGRybV92bXdfZmlmb19kZWJ1Z19hcmcgKmFyZyA9Ci0JICAgIChzdHJ1Y3QgZHJtX3Ztd19maWZvX2RlYnVnX2FyZyAqKWRhdGE7Ci0JX19sZTMyIF9fdXNlciAqYnVmZmVyID0gKF9fbGUzMiBfX3VzZXIgKikKLQkgICAgKHVuc2lnbmVkIGxvbmcpYXJnLT5kZWJ1Z19idWZmZXI7CisJdWludDMyX3Qgc2l6ZTsKKwlfX2xlMzIgX19pb21lbSAqZmlmb19tZW07CisJdm9pZCBfX3VzZXIgKmJ1ZmZlciA9ICh2b2lkIF9fdXNlciAqKSgodW5zaWduZWQgbG9uZykoYXJnLT5idWZmZXIpKTsKKwl2b2lkICpib3VuY2U7CisJaW50IHJldDsKIAotCWlmICh1bmxpa2VseShmaWZvX3N0YXRlLT5sYXN0X2J1ZmZlciA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkoYXJnLT5wYWQ2NCAhPSAwKSkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgR0VUXzNEX0NBUCBhcmd1bWVudC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhcmctPmRlYnVnX2J1ZmZlcl9zaXplIDwgZmlmb19zdGF0ZS0+bGFzdF9kYXRhX3NpemUpIHsKLQkJYXJnLT51c2VkX3NpemUgPSBhcmctPmRlYnVnX2J1ZmZlcl9zaXplOwotCQlhcmctPmRpZF9ub3RfZml0ID0gMTsKLQl9IGVsc2UgewotCQlhcmctPnVzZWRfc2l6ZSA9IGZpZm9fc3RhdGUtPmxhc3RfZGF0YV9zaXplOwotCQlhcmctPmRpZF9ub3RfZml0ID0gMDsKIAl9Ci0JcmV0dXJuIGNvcHlfdG9fdXNlcihidWZmZXIsIGZpZm9fc3RhdGUtPmxhc3RfYnVmZmVyLCBhcmctPnVzZWRfc2l6ZSk7CisKKwlzaXplID0gKFNWR0FfRklGT18zRF9DQVBTX0xBU1QgLSBTVkdBX0ZJRk9fM0RfQ0FQUyArIDEpIDw8IDI7CisKKwlpZiAoYXJnLT5tYXhfc2l6ZSA8IHNpemUpCisJCXNpemUgPSBhcmctPm1heF9zaXplOworCisJYm91bmNlID0gdm1hbGxvYyhzaXplKTsKKwlpZiAodW5saWtlbHkoYm91bmNlID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGJvdW5jZSBidWZmZXIgZm9yIDNEIGNhcHMuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlmb19tZW0gPSBkZXZfcHJpdi0+bW1pb192aXJ0OworCW1lbWNweV9mcm9taW8oYm91bmNlLCAmZmlmb19tZW1bU1ZHQV9GSUZPXzNEX0NBUFNdLCBzaXplKTsKKworCXJldCA9IGNvcHlfdG9fdXNlcihidWZmZXIsIGJvdW5jZSwgc2l6ZSk7CisJdmZyZWUoYm91bmNlKTsKKworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlcG9ydCAzRCBjYXBzIGluZm8uXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2bXdfcHJlc2VudF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnICopZGF0YTsKKwlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmZhY2U7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKKwlzdHJ1Y3QgZHJtX3Ztd19yZWN0IF9fdXNlciAqY2xpcHNfcHRyOworCXN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CisJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiOworCXVpbnQzMl90IG51bV9jbGlwczsKKwlpbnQgcmV0OworCisJbnVtX2NsaXBzID0gYXJnLT5udW1fY2xpcHM7CisJY2xpcHNfcHRyID0gKHN0cnVjdCBkcm1fdm13X3JlY3QgKikodW5zaWduZWQgbG9uZylhcmctPmNsaXBzX3B0cjsKKworCWlmICh1bmxpa2VseShudW1fY2xpcHMgPT0gMCkpCisJCXJldHVybiAwOworCisJaWYgKGNsaXBzX3B0ciA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiVmFyaWFibGUgY2xpcHNfcHRyIG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2NsaXBzOworCX0KKworCWNsaXBzID0ga3phbGxvYyhudW1fY2xpcHMgKiBzaXplb2YoKmNsaXBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaXBzID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2xpcCByZWN0IGxpc3QuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfY2xpcHM7CisJfQorCisJcmV0ID0gY29weV9mcm9tX3VzZXIoY2xpcHMsIGNsaXBzX3B0ciwgbnVtX2NsaXBzICogc2l6ZW9mKCpjbGlwcykpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gY29weSBjbGlwIHJlY3RzIGZyb20gdXNlcnNwYWNlLlxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X25vX2NvcHk7CisJfQorCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBvdXRfbm9fbW9kZV9tdXRleDsKKwl9CisKKwlvYmogPSBkcm1fbW9kZV9vYmplY3RfZmluZChkZXYsIGFyZy0+ZmJfaWQsIERSTV9NT0RFX09CSkVDVF9GQik7CisJaWYgKCFvYmopIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGZyYW1lYnVmZmVyIGlkLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X25vX2ZiOworCX0KKworCXZmYiA9IHZtd19mcmFtZWJ1ZmZlcl90b192ZmIob2JqX3RvX2ZiKG9iaikpOworCWlmICghdmZiLT5kbWFidWYpIHsKKwkJRFJNX0VSUk9SKCJGcmFtZWJ1ZmZlciBub3QgZG1hYnVmIGJhY2tlZC5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub19mYjsKKwl9CisKKwlyZXQgPSB0dG1fcmVhZF9sb2NrKCZ2bWFzdGVyLT5sb2NrLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlnb3RvIG91dF9ub190dG1fbG9jazsKKworCXJldCA9IHZtd191c2VyX3N1cmZhY2VfbG9va3VwX2hhbmRsZShkZXZfcHJpdiwgdGZpbGUsIGFyZy0+c2lkLAorCQkJCQkgICAgICZzdXJmYWNlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9ub19zdXJmYWNlOworCisJcmV0ID0gdm13X2ttc19wcmVzZW50KGRldl9wcml2LCBmaWxlX3ByaXYsCisJCQkgICAgICB2ZmIsIHN1cmZhY2UsIGFyZy0+c2lkLAorCQkJICAgICAgYXJnLT5kZXN0X3gsIGFyZy0+ZGVzdF95LAorCQkJICAgICAgY2xpcHMsIG51bV9jbGlwcyk7CisKKwkvKiB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cCB0YWtlcyBvbmUgcmVmIHNvIGRvZXMgbmV3X2ZiICovCisJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnN1cmZhY2UpOworCitvdXRfbm9fc3VyZmFjZToKKwl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOworb3V0X25vX3R0bV9sb2NrOgorb3V0X25vX2ZiOgorCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CitvdXRfbm9fbW9kZV9tdXRleDoKK291dF9ub19jb3B5OgorCWtmcmVlKGNsaXBzKTsKK291dF9jbGlwczoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm13X3ByZXNlbnRfcmVhZGJhY2tfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X3JlYWRiYWNrX2FyZyAqYXJnID0KKwkJKHN0cnVjdCBkcm1fdm13X3ByZXNlbnRfcmVhZGJhY2tfYXJnICopZGF0YTsKKwlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgX191c2VyICp1c2VyX2ZlbmNlX3JlcCA9CisJCShzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9yZXAgX191c2VyICopCisJCSh1bnNpZ25lZCBsb25nKWFyZy0+ZmVuY2VfcmVwOworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CisJc3RydWN0IGRybV92bXdfcmVjdCBfX3VzZXIgKmNsaXBzX3B0cjsKKwlzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpjbGlwcyA9IE5VTEw7CisJc3RydWN0IGRybV9tb2RlX29iamVjdCAqb2JqOworCXN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYjsKKwl1aW50MzJfdCBudW1fY2xpcHM7CisJaW50IHJldDsKKworCW51bV9jbGlwcyA9IGFyZy0+bnVtX2NsaXBzOworCWNsaXBzX3B0ciA9IChzdHJ1Y3QgZHJtX3Ztd19yZWN0ICopKHVuc2lnbmVkIGxvbmcpYXJnLT5jbGlwc19wdHI7CisKKwlpZiAodW5saWtlbHkobnVtX2NsaXBzID09IDApKQorCQlyZXR1cm4gMDsKKworCWlmIChjbGlwc19wdHIgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkFyZ3VtZW50IGNsaXBzX3B0ciBtdXN0IGJlIHNwZWNpZmllZC5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbGlwczsKKwl9CisKKwljbGlwcyA9IGt6YWxsb2MobnVtX2NsaXBzICogc2l6ZW9mKCpjbGlwcyksIEdGUF9LRVJORUwpOworCWlmIChjbGlwcyA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGNsaXAgcmVjdCBsaXN0LlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2NsaXBzOworCX0KKworCXJldCA9IGNvcHlfZnJvbV91c2VyKGNsaXBzLCBjbGlwc19wdHIsIG51bV9jbGlwcyAqIHNpemVvZigqY2xpcHMpKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNvcHkgY2xpcCByZWN0cyBmcm9tIHVzZXJzcGFjZS5cbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dF9ub19jb3B5OworCX0KKworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gb3V0X25vX21vZGVfbXV0ZXg7CisJfQorCisJb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBhcmctPmZiX2lkLCBEUk1fTU9ERV9PQkpFQ1RfRkIpOworCWlmICghb2JqKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBmcmFtZWJ1ZmZlciBpZC5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9ub19mYjsKKwl9CisKKwl2ZmIgPSB2bXdfZnJhbWVidWZmZXJfdG9fdmZiKG9ial90b19mYihvYmopKTsKKwlpZiAoIXZmYi0+ZG1hYnVmKSB7CisJCURSTV9FUlJPUigiRnJhbWVidWZmZXIgbm90IGRtYWJ1ZiBiYWNrZWQuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfbm9fZmI7CisJfQorCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfbm9fdHRtX2xvY2s7CisKKwlyZXQgPSB2bXdfa21zX3JlYWRiYWNrKGRldl9wcml2LCBmaWxlX3ByaXYsCisJCQkgICAgICAgdmZiLCB1c2VyX2ZlbmNlX3JlcCwKKwkJCSAgICAgICBjbGlwcywgbnVtX2NsaXBzKTsKKworCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CitvdXRfbm9fdHRtX2xvY2s6CitvdXRfbm9fZmI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKK291dF9ub19tb2RlX211dGV4Ogorb3V0X25vX2NvcHk6CisJa2ZyZWUoY2xpcHMpOworb3V0X2NsaXBzOgorCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiB2bXdfZm9wc19wb2xsIC0gd3JhcHBlciBhcm91bmQgdGhlIGRybV9wb2xsIGZ1bmN0aW9uCisgKgorICogQGZpbHA6IFNlZSB0aGUgbGludXggZm9wcyBwb2xsIGRvY3VtZW50YXRpb24uCisgKiBAd2FpdDogU2VlIHRoZSBsaW51eCBmb3BzIHBvbGwgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXcmFwcGVyIGFyb3VuZCB0aGUgZHJtX3BvbGwgZnVuY3Rpb24gdGhhdCBtYWtlcyBzdXJlIHRoZSBkZXZpY2UgaXMKKyAqIHByb2Nlc3NpbmcgdGhlIGZpZm8gaWYgZHJtX3BvbGwgZGVjaWRlcyB0byB3YWl0LgorICovCit1bnNpZ25lZCBpbnQgdm13X2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQl2bXdfcHJpdihmaWxlX3ByaXYtPm1pbm9yLT5kZXYpOworCisJdm13X2ZpZm9fcGluZ19ob3N0KGRldl9wcml2LCBTVkdBX1NZTkNfR0VORVJJQyk7CisJcmV0dXJuIGRybV9wb2xsKGZpbHAsIHdhaXQpOworfQorCisKKy8qKgorICogdm13X2ZvcHNfcmVhZCAtIHdyYXBwZXIgYXJvdW5kIHRoZSBkcm1fcmVhZCBmdW5jdGlvbgorICoKKyAqIEBmaWxwOiBTZWUgdGhlIGxpbnV4IGZvcHMgcmVhZCBkb2N1bWVudGF0aW9uLgorICogQGJ1ZmZlcjogU2VlIHRoZSBsaW51eCBmb3BzIHJlYWQgZG9jdW1lbnRhdGlvbi4KKyAqIEBjb3VudDogU2VlIHRoZSBsaW51eCBmb3BzIHJlYWQgZG9jdW1lbnRhdGlvbi4KKyAqIG9mZnNldDogU2VlIHRoZSBsaW51eCBmb3BzIHJlYWQgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXcmFwcGVyIGFyb3VuZCB0aGUgZHJtX3JlYWQgZnVuY3Rpb24gdGhhdCBtYWtlcyBzdXJlIHRoZSBkZXZpY2UgaXMKKyAqIHByb2Nlc3NpbmcgdGhlIGZpZm8gaWYgZHJtX3JlYWQgZGVjaWRlcyB0byB3YWl0LgorICovCitzc2l6ZV90IHZtd19mb3BzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9CisJCXZtd19wcml2KGZpbGVfcHJpdi0+bWlub3ItPmRldik7CisKKwl2bXdfZmlmb19waW5nX2hvc3QoZGV2X3ByaXYsIFNWR0FfU1lOQ19HRU5FUklDKTsKKwlyZXR1cm4gZHJtX3JlYWQoZmlscCwgYnVmZmVyLCBjb3VudCwgb2Zmc2V0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaXJxLmMKaW5kZXggZTkyMjk4YS4uY2FiYzk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaXJxLmMKQEAgLTM0LDI2ICszNCwzMyBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilhcmc7CiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7Ci0JdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHN0YXR1cywgbWFza2VkX3N0YXR1czsKIAogCXNwaW5fbG9jaygmZGV2X3ByaXYtPmlycV9sb2NrKTsKIAlzdGF0dXMgPSBpbmwoZGV2X3ByaXYtPmlvX3N0YXJ0ICsgVk1XR0ZYX0lSUVNUQVRVU19QT1JUKTsKKwltYXNrZWRfc3RhdHVzID0gc3RhdHVzICYgZGV2X3ByaXYtPmlycV9tYXNrOwogCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+aXJxX2xvY2spOwogCi0JaWYgKHN0YXR1cyAmIFNWR0FfSVJRRkxBR19BTllfRkVOQ0UpCi0JCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOwotCWlmIChzdGF0dXMgJiBTVkdBX0lSUUZMQUdfRklGT19QUk9HUkVTUykKLQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5maWZvX3F1ZXVlKTsKLQotCWlmIChsaWtlbHkoc3RhdHVzKSkgeworCWlmIChsaWtlbHkoc3RhdHVzKSkKIAkJb3V0bChzdGF0dXMsIGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKKworCWlmICghbWFza2VkX3N0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKG1hc2tlZF9zdGF0dXMgJiAoU1ZHQV9JUlFGTEFHX0FOWV9GRU5DRSB8CisJCQkgICAgIFNWR0FfSVJRRkxBR19GRU5DRV9HT0FMKSkgeworCQl2bXdfZmVuY2VzX3VwZGF0ZShkZXZfcHJpdi0+Zm1hbik7CisJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+ZmVuY2VfcXVldWUpOwogCX0KIAotCXJldHVybiBJUlFfTk9ORTsKKwlpZiAobWFza2VkX3N0YXR1cyAmIFNWR0FfSVJRRkxBR19GSUZPX1BST0dSRVNTKQorCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmZpZm9fcXVldWUpOworCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBib29sIHZtd19maWZvX2lkbGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdWludDMyX3Qgc2VxdWVuY2UpCitzdGF0aWMgYm9vbCB2bXdfZmlmb19pZGxlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsIHVpbnQzMl90IHNlcW5vKQogewogCXVpbnQzMl90IGJ1c3k7CiAKQEAgLTY0LDQzICs3MSw0MyBAQAogCXJldHVybiAoYnVzeSA9PSAwKTsKIH0KIAotdm9pZCB2bXdfdXBkYXRlX3NlcXVlbmNlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCit2b2lkIHZtd191cGRhdGVfc2Vxbm8oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSBzdHJ1Y3Qgdm13X2ZpZm9fc3RhdGUgKmZpZm9fc3RhdGUpCiB7CiAJX19sZTMyIF9faW9tZW0gKmZpZm9fbWVtID0gZGV2X3ByaXYtPm1taW9fdmlydDsKKwl1aW50MzJfdCBzZXFubyA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPX0ZFTkNFKTsKIAotCXVpbnQzMl90IHNlcXVlbmNlID0gaW9yZWFkMzIoZmlmb19tZW0gKyBTVkdBX0ZJRk9fRkVOQ0UpOwotCi0JaWYgKGRldl9wcml2LT5sYXN0X3JlYWRfc2VxdWVuY2UgIT0gc2VxdWVuY2UpIHsKLQkJZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXF1ZW5jZSA9IHNlcXVlbmNlOwotCQl2bXdfZmVuY2VfcHVsbCgmZmlmb19zdGF0ZS0+ZmVuY2VfcXVldWUsIHNlcXVlbmNlKTsKKwlpZiAoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyAhPSBzZXFubykgeworCQlkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vID0gc2Vxbm87CisJCXZtd19tYXJrZXJfcHVsbCgmZmlmb19zdGF0ZS0+bWFya2VyX3F1ZXVlLCBzZXFubyk7CisJCXZtd19mZW5jZXNfdXBkYXRlKGRldl9wcml2LT5mbWFuKTsKIAl9CiB9CiAKLWJvb2wgdm13X2ZlbmNlX3NpZ25hbGVkKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQl1aW50MzJfdCBzZXF1ZW5jZSkKK2Jvb2wgdm13X3NlcW5vX3Bhc3NlZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJIHVpbnQzMl90IHNlcW5vKQogewogCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmb19zdGF0ZTsKIAlib29sIHJldDsKIAotCWlmIChsaWtlbHkoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXF1ZW5jZSAtIHNlcXVlbmNlIDwgVk1XX0ZFTkNFX1dSQVApKQorCWlmIChsaWtlbHkoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyAtIHNlcW5vIDwgVk1XX0ZFTkNFX1dSQVApKQogCQlyZXR1cm4gdHJ1ZTsKIAogCWZpZm9fc3RhdGUgPSAmZGV2X3ByaXYtPmZpZm87Ci0Jdm13X3VwZGF0ZV9zZXF1ZW5jZShkZXZfcHJpdiwgZmlmb19zdGF0ZSk7Ci0JaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcXVlbmNlIC0gc2VxdWVuY2UgPCBWTVdfRkVOQ0VfV1JBUCkpCisJdm13X3VwZGF0ZV9zZXFubyhkZXZfcHJpdiwgZmlmb19zdGF0ZSk7CisJaWYgKGxpa2VseShkZXZfcHJpdi0+bGFzdF9yZWFkX3NlcW5vIC0gc2Vxbm8gPCBWTVdfRkVOQ0VfV1JBUCkpCiAJCXJldHVybiB0cnVlOwogCiAJaWYgKCEoZmlmb19zdGF0ZS0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9GSUZPX0NBUF9GRU5DRSkgJiYKLQkgICAgdm13X2ZpZm9faWRsZShkZXZfcHJpdiwgc2VxdWVuY2UpKQorCSAgICB2bXdfZmlmb19pZGxlKGRldl9wcml2LCBzZXFubykpCiAJCXJldHVybiB0cnVlOwogCiAJLyoqCi0JICogVGhlbiBjaGVjayBpZiB0aGUgc2VxdWVuY2UgaXMgaGlnaGVyIHRoYW4gd2hhdCB3ZSd2ZSBhY3R1YWxseQorCSAqIFRoZW4gY2hlY2sgaWYgdGhlIHNlcW5vIGlzIGhpZ2hlciB0aGFuIHdoYXQgd2UndmUgYWN0dWFsbHkKIAkgKiBlbWl0dGVkLiBUaGVuIHRoZSBmZW5jZSBpcyBzdGFsZSBhbmQgc2lnbmFsZWQuCiAJICovCiAKLQlyZXQgPSAoKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+ZmVuY2Vfc2VxKSAtIHNlcXVlbmNlKQorCXJldCA9ICgoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tYXJrZXJfc2VxKSAtIHNlcW5vKQogCSAgICAgICA+IFZNV19GRU5DRV9XUkFQKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMDksNyArMTE2LDcgQEAKIGludCB2bXdfZmFsbGJhY2tfd2FpdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkgICAgICBib29sIGxhenksCiAJCSAgICAgIGJvb2wgZmlmb19pZGxlLAotCQkgICAgICB1aW50MzJfdCBzZXF1ZW5jZSwKKwkJICAgICAgdWludDMyX3Qgc2Vxbm8sCiAJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKIAkJICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewpAQCAtMTIzLDcgKzEzMCw3IEBACiAJREVGSU5FX1dBSVQoX193YWl0KTsKIAogCXdhaXRfY29uZGl0aW9uID0gKGZpZm9faWRsZSkgPyAmdm13X2ZpZm9faWRsZSA6Ci0JCSZ2bXdfZmVuY2Vfc2lnbmFsZWQ7CisJCSZ2bXdfc2Vxbm9fcGFzc2VkOwogCiAJLyoqCiAJICogQmxvY2sgY29tbWFuZCBzdWJtaXNzaW9uIHdoaWxlIHdhaXRpbmcgZm9yIGlkbGUuCkBAIC0xMzEsMTQgKzEzOCwxNCBAQAogCiAJaWYgKGZpZm9faWRsZSkKIAkJZG93bl9yZWFkKCZmaWZvX3N0YXRlLT5yd3NlbSk7Ci0Jc2lnbmFsX3NlcSA9IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+ZmVuY2Vfc2VxKTsKKwlzaWduYWxfc2VxID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5tYXJrZXJfc2VxKTsKIAlyZXQgPSAwOwogCiAJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXQoJmRldl9wcml2LT5mZW5jZV9xdWV1ZSwgJl9fd2FpdCwKIAkJCQkoaW50ZXJydXB0aWJsZSkgPwogCQkJCVRBU0tfSU5URVJSVVBUSUJMRSA6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHdhaXRfY29uZGl0aW9uKGRldl9wcml2LCBzZXF1ZW5jZSkpCisJCWlmICh3YWl0X2NvbmRpdGlvbihkZXZfcHJpdiwgc2Vxbm8pKQogCQkJYnJlYWs7CiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZF9qaWZmaWVzKSkgewogCQkJRFJNX0VSUk9SKCJTVkdBIGRldmljZSBsb2NrdXAuXG4iKTsKQEAgLTE3NSw2OCArMTgyLDExMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB2bXdfd2FpdF9mZW5jZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkgICBib29sIGxhenksIHVpbnQzMl90IHNlcXVlbmNlLAotCQkgICBib29sIGludGVycnVwdGlibGUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3ZvaWQgdm13X3NlcW5vX3dhaXRlcl9hZGQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCWlmIChkZXZfcHJpdi0+ZmVuY2VfcXVldWVfd2FpdGVycysrID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwkJb3V0bChTVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFLAorCQkgICAgIGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7CisJCWRldl9wcml2LT5pcnFfbWFzayB8PSBTVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFOworCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssIGRldl9wcml2LT5pcnFfbWFzayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworfQorCit2b2lkIHZtd19zZXFub193YWl0ZXJfcmVtb3ZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwlpZiAoLS1kZXZfcHJpdi0+ZmVuY2VfcXVldWVfd2FpdGVycyA9PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CisJCWRldl9wcml2LT5pcnFfbWFzayAmPSB+U1ZHQV9JUlFGTEFHX0FOWV9GRU5DRTsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLCBkZXZfcHJpdi0+aXJxX21hc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKK30KKworCit2b2lkIHZtd19nb2FsX3dhaXRlcl9hZGQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCWlmIChkZXZfcHJpdi0+Z29hbF9xdWV1ZV93YWl0ZXJzKysgPT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOworCQlvdXRsKFNWR0FfSVJRRkxBR19GRU5DRV9HT0FMLAorCQkgICAgIGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7CisJCWRldl9wcml2LT5pcnFfbWFzayB8PSBTVkdBX0lSUUZMQUdfRkVOQ0VfR09BTDsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLCBkZXZfcHJpdi0+aXJxX21hc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKK30KKwordm9pZCB2bXdfZ29hbF93YWl0ZXJfcmVtb3ZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKKwlpZiAoLS1kZXZfcHJpdi0+Z29hbF9xdWV1ZV93YWl0ZXJzID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKKwkJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5TVkdBX0lSUUZMQUdfRkVOQ0VfR09BTDsKKwkJdm13X3dyaXRlKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLLCBkZXZfcHJpdi0+aXJxX21hc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycV9mbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKK30KKworaW50IHZtd193YWl0X3NlcW5vKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgIGJvb2wgbGF6eSwgdWludDMyX3Qgc2Vxbm8sCisJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewogCWxvbmcgcmV0OwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCXN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmbyA9ICZkZXZfcHJpdi0+ZmlmbzsKIAotCWlmIChsaWtlbHkoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXF1ZW5jZSAtIHNlcXVlbmNlIDwgVk1XX0ZFTkNFX1dSQVApKQorCWlmIChsaWtlbHkoZGV2X3ByaXYtPmxhc3RfcmVhZF9zZXFubyAtIHNlcW5vIDwgVk1XX0ZFTkNFX1dSQVApKQogCQlyZXR1cm4gMDsKIAotCWlmIChsaWtlbHkodm13X2ZlbmNlX3NpZ25hbGVkKGRldl9wcml2LCBzZXF1ZW5jZSkpKQorCWlmIChsaWtlbHkodm13X3NlcW5vX3Bhc3NlZChkZXZfcHJpdiwgc2Vxbm8pKSkKIAkJcmV0dXJuIDA7CiAKIAl2bXdfZmlmb19waW5nX2hvc3QoZGV2X3ByaXYsIFNWR0FfU1lOQ19HRU5FUklDKTsKIAogCWlmICghKGZpZm8tPmNhcGFiaWxpdGllcyAmIFNWR0FfRklGT19DQVBfRkVOQ0UpKQotCQlyZXR1cm4gdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGxhenksIHRydWUsIHNlcXVlbmNlLAorCQlyZXR1cm4gdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGxhenksIHRydWUsIHNlcW5vLAogCQkJCQkgaW50ZXJydXB0aWJsZSwgdGltZW91dCk7CiAKIAlpZiAoIShkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfSVJRTUFTSykpCi0JCXJldHVybiB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgbGF6eSwgZmFsc2UsIHNlcXVlbmNlLAorCQlyZXR1cm4gdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGxhenksIGZhbHNlLCBzZXFubywKIAkJCQkJIGludGVycnVwdGlibGUsIHRpbWVvdXQpOwogCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmh3X211dGV4KTsKLQlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzKSA+IDApIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKLQkJb3V0bChTVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFLAotCQkgICAgIGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7Ci0JCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9SRUdfSVJRTUFTSywKLQkJCSAgdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0spIHwKLQkJCSAgU1ZHQV9JUlFGTEFHX0FOWV9GRU5DRSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxX2ZsYWdzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCXZtd19zZXFub193YWl0ZXJfYWRkKGRldl9wcml2KTsKIAogCWlmIChpbnRlcnJ1cHRpYmxlKQogCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAogCQkgICAgKGRldl9wcml2LT5mZW5jZV9xdWV1ZSwKLQkJICAgICB2bXdfZmVuY2Vfc2lnbmFsZWQoZGV2X3ByaXYsIHNlcXVlbmNlKSwKKwkJICAgICB2bXdfc2Vxbm9fcGFzc2VkKGRldl9wcml2LCBzZXFubyksCiAJCSAgICAgdGltZW91dCk7CiAJZWxzZQogCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQKIAkJICAgIChkZXZfcHJpdi0+ZmVuY2VfcXVldWUsCi0JCSAgICAgdm13X2ZlbmNlX3NpZ25hbGVkKGRldl9wcml2LCBzZXF1ZW5jZSksCisJCSAgICAgdm13X3NlcW5vX3Bhc3NlZChkZXZfcHJpdiwgc2Vxbm8pLAogCQkgICAgIHRpbWVvdXQpOwogCisJdm13X3NlcW5vX3dhaXRlcl9yZW1vdmUoZGV2X3ByaXYpOworCiAJaWYgKHVubGlrZWx5KHJldCA9PSAwKSkKIAkJcmV0ID0gLUVCVVNZOwogCWVsc2UgaWYgKGxpa2VseShyZXQgPiAwKSkKIAkJcmV0ID0gMDsKIAotCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldl9wcml2LT5mZW5jZV9xdWV1ZV93YWl0ZXJzKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOwotCQl2bXdfd3JpdGUoZGV2X3ByaXYsIFNWR0FfUkVHX0lSUU1BU0ssCi0JCQkgIHZtd19yZWFkKGRldl9wcml2LCBTVkdBX1JFR19JUlFNQVNLKSAmCi0JCQkgIH5TVkdBX0lSUUZMQUdfQU5ZX0ZFTkNFKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFfZmxhZ3MpOwotCX0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5od19tdXRleCk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzMsMjUgKzMyMiwzIEBACiAJc3RhdHVzID0gaW5sKGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7CiAJb3V0bChzdGF0dXMsIGRldl9wcml2LT5pb19zdGFydCArIFZNV0dGWF9JUlFTVEFUVVNfUE9SVCk7CiB9Ci0KLSNkZWZpbmUgVk1XX0ZFTkNFX1dBSVRfVElNRU9VVCAzKkhaOwotCi1pbnQgdm13X2ZlbmNlX3dhaXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKLXsKLQlzdHJ1Y3QgZHJtX3Ztd19mZW5jZV93YWl0X2FyZyAqYXJnID0KLQkgICAgKHN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnICopZGF0YTsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlpZiAoIWFyZy0+Y29va2llX3ZhbGlkKSB7Ci0JCWFyZy0+Y29va2llX3ZhbGlkID0gMTsKLQkJYXJnLT5rZXJuZWxfY29va2llID0gamlmZmllcyArIFZNV19GRU5DRV9XQUlUX1RJTUVPVVQ7Ci0JfQotCi0JdGltZW91dCA9IGppZmZpZXM7Ci0JaWYgKHRpbWVfYWZ0ZXJfZXEodGltZW91dCwgKHVuc2lnbmVkIGxvbmcpYXJnLT5rZXJuZWxfY29va2llKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXRpbWVvdXQgPSAodW5zaWduZWQgbG9uZylhcmctPmtlcm5lbF9jb29raWUgLSB0aW1lb3V0OwotCXJldHVybiB2bXdfd2FpdF9mZW5jZSh2bXdfcHJpdihkZXYpLCB0cnVlLCBhcmctPnNlcXVlbmNlLCB0cnVlLCB0aW1lb3V0KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKaW5kZXggZGZlMzJlNi4uODgwZTI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKQEAgLTI3LDEyICsyNywxMCBAQAogCiAjaW5jbHVkZSAidm13Z2Z4X2ttcy5oIgogCisKIC8qIE1pZ2h0IG5lZWQgYSBocnRpbWVyIGhlcmU/ICovCiAjZGVmaW5lIFZNV0dGWF9QUkVTRU5UX1JBVEUgKChIWiAvIDYwID4gMCkgPyBIWiAvIDYwIDogMSkKIAotc3RhdGljIGludCB2bXdfc3VyZmFjZV9kbWFidWZfcGluKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYik7Ci1zdGF0aWMgaW50IHZtd19zdXJmYWNlX2RtYWJ1Zl91bnBpbihzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIpOwotCiB2b2lkIHZtd19kaXNwbGF5X3VuaXRfY2xlYW51cChzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHUpCiB7CiAJaWYgKGR1LT5jdXJzb3Jfc3VyZmFjZSkKQEAgLTEwNywxMiArMTA1LDE3IEBACiAJc3RydWN0IHZtd19kbWFfYnVmZmVyICpkbWFidWYgPSBOVUxMOwogCWludCByZXQ7CiAKKwkvKiBBIGxvdCBvZiB0aGUgY29kZSBhc3N1bWVzIHRoaXMgKi8KKwlpZiAoaGFuZGxlICYmICh3aWR0aCAhPSA2NCB8fCBoZWlnaHQgIT0gNjQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChoYW5kbGUpIHsKIAkJcmV0ID0gdm13X3VzZXJfc3VyZmFjZV9sb29rdXBfaGFuZGxlKGRldl9wcml2LCB0ZmlsZSwKIAkJCQkJCSAgICAgaGFuZGxlLCAmc3VyZmFjZSk7CiAJCWlmICghcmV0KSB7CiAJCQlpZiAoIXN1cmZhY2UtPnNub29wZXIuaW1hZ2UpIHsKIAkJCQlEUk1fRVJST1IoInN1cmZhY2Ugbm90IHN1aXRhYmxlIGZvciBjdXJzb3JcbiIpOworCQkJCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzdXJmYWNlKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTE3OCw3ICsxODEsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQl2bXdfY3Vyc29yX3VwZGF0ZV9wb3NpdGlvbihkZXZfcHJpdiwgdHJ1ZSwgZHUtPmN1cnNvcl94LCBkdS0+Y3Vyc29yX3kpOworCXZtd19jdXJzb3JfdXBkYXRlX3Bvc2l0aW9uKGRldl9wcml2LCB0cnVlLAorCQkJCSAgIGR1LT5jdXJzb3JfeCArIGR1LT5ob3RzcG90X3gsCisJCQkJICAgZHUtPmN1cnNvcl95ICsgZHUtPmhvdHNwb3RfeSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Myw3ICsxOTgsOCBAQAogCWR1LT5jdXJzb3JfeSA9IHkgKyBjcnRjLT55OwogCiAJdm13X2N1cnNvcl91cGRhdGVfcG9zaXRpb24oZGV2X3ByaXYsIHNob3duLAotCQkJCSAgIGR1LT5jdXJzb3JfeCwgZHUtPmN1cnNvcl95KTsKKwkJCQkgICBkdS0+Y3Vyc29yX3ggKyBkdS0+aG90c3BvdF94LAorCQkJCSAgIGR1LT5jdXJzb3JfeSArIGR1LT5ob3RzcG90X3kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTQsNyArMjIwLDcgQEAKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKIAkJU1ZHQTNkQ21kU3VyZmFjZURNQSBkbWE7CiAJfSAqY21kOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCWNtZCA9IGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCB2bXdfZG1hX2NtZCwgaGVhZGVyKTsKIApAQCAtMjM2LDE2ICsyNDIsMTkgQEAKIAlib3hfY291bnQgPSAoY21kLT5oZWFkZXIuc2l6ZSAtIHNpemVvZihTVkdBM2RDbWRTdXJmYWNlRE1BKSkgLwogCQkJc2l6ZW9mKFNWR0EzZENvcHlCb3gpOwogCi0JaWYgKGNtZC0+ZG1hLmd1ZXN0LnBpdGNoICE9ICg2NCAqIDQpIHx8Ci0JICAgIGNtZC0+ZG1hLmd1ZXN0LnB0ci5vZmZzZXQgJSBQQUdFX1NJWkUgfHwKKwlpZiAoY21kLT5kbWEuZ3Vlc3QucHRyLm9mZnNldCAlIFBBR0VfU0laRSB8fAogCSAgICBib3gtPnggIT0gMCAgICB8fCBib3gtPnkgIT0gMCAgICB8fCBib3gtPnogIT0gMCAgICB8fAogCSAgICBib3gtPnNyY3ggIT0gMCB8fCBib3gtPnNyY3kgIT0gMCB8fCBib3gtPnNyY3ogIT0gMCB8fAotCSAgICBib3gtPncgIT0gNjQgICB8fCBib3gtPmggIT0gNjQgICB8fCBib3gtPmQgIT0gMSAgICB8fAotCSAgICBib3hfY291bnQgIT0gMSkgeworCSAgICBib3gtPmQgIT0gMSAgICB8fCBib3hfY291bnQgIT0gMSkgewogCQkvKiBUT0RPIGhhbmRsZSBub25lIHBhZ2UgYWxpZ25lZCBvZmZzZXRzICovCi0JCS8qIFRPRE8gaGFuZGxlIHBhcnRpYWwgdXBsb2FkcyBhbmQgcGl0Y2ggIT0gMjU2ICovCi0JCS8qIFRPRE8gaGFuZGxlIG1vcmUgdGhlbiBvbmUgY29weSAoc2l6ZSAhPSA2NCkgKi8KLQkJRFJNX0VSUk9SKCJsYXp5IHByb2dyYW1tZXIsIGNhbid0IGhhbmRsZSB3ZWlyZCBzdHVmZlxuIik7CisJCS8qIFRPRE8gaGFuZGxlIG1vcmUgZHN0ICYgc3JjICE9IDAgKi8KKwkJLyogVE9ETyBoYW5kbGUgbW9yZSB0aGVuIG9uZSBjb3B5ICovCisJCURSTV9FUlJPUigiQ2FudCBzbm9vcCBkbWEgcmVxdWVzdCBmb3IgY3Vyc29yIVxuIik7CisJCURSTV9FUlJPUigiKCV1LCAldSwgJXUpICgldSwgJXUsICV1KSAoJXV4JXV4JXUpICV1ICV1XG4iLAorCQkJICBib3gtPnNyY3gsIGJveC0+c3JjeSwgYm94LT5zcmN6LAorCQkJICBib3gtPngsIGJveC0+eSwgYm94LT56LAorCQkJICBib3gtPncsIGJveC0+aCwgYm94LT5kLCBib3hfY291bnQsCisJCQkgIGNtZC0+ZG1hLmd1ZXN0LnB0ci5vZmZzZXQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNjQsNyArMjczLDE2IEBACiAKIAl2aXJ0dWFsID0gdHRtX2ttYXBfb2JqX3ZpcnR1YWwoJm1hcCwgJmR1bW15KTsKIAotCW1lbWNweShzcmYtPnNub29wZXIuaW1hZ2UsIHZpcnR1YWwsIDY0KjY0KjQpOworCWlmIChib3gtPncgPT0gNjQgJiYgY21kLT5kbWEuZ3Vlc3QucGl0Y2ggPT0gNjQqNCkgeworCQltZW1jcHkoc3JmLT5zbm9vcGVyLmltYWdlLCB2aXJ0dWFsLCA2NCo2NCo0KTsKKwl9IGVsc2UgeworCQkvKiBJbWFnZSBpcyB1bnNpZ25lZCBwb2ludGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgYm94LT5oOyBpKyspCisJCQltZW1jcHkoc3JmLT5zbm9vcGVyLmltYWdlICsgaSAqIDY0LAorCQkJICAgICAgIHZpcnR1YWwgKyBpICogY21kLT5kbWEuZ3Vlc3QucGl0Y2gsCisJCQkgICAgICAgYm94LT53ICogNCk7CisJfQorCiAJc3JmLT5zbm9vcGVyLmFnZSsrOwogCiAJLyogd2UgY2FuJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gdGhpcyBmdW5jdGlvbiBzaW5jZSBleGVjYnVmIGhhcwpAQCAtMzI5LDQxICszNDcsMTAgQEAKIAlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyIGJhc2U7CiAJc3RydWN0IHZtd19zdXJmYWNlICpzdXJmYWNlOwogCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZF93b3JrOwotCXN0cnVjdCBtdXRleCB3b3JrX2xvY2s7Ci0JYm9vbCBwcmVzZW50X2ZzOwogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyOwogfTsKIAotLyoqCi0gKiB2bXdfa21zX2lkbGVfd29ya3F1ZXVlcyAtIEZsdXNoIHdvcmtxdWV1ZXMgb24gdGhpcyBtYXN0ZXIKLSAqCi0gKiBAdm1hc3RlciAtIFBvaW50ZXIgaWRlbnRpZnlpbmcgdGhlIG1hc3RlciwgZm9yIHRoZSBzdXJmYWNlcyBvZiB3aGljaAotICogd2UgaWRsZSB0aGUgZGlydHkgd29yayBxdWV1ZXMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHR0bSBsb2NrIGhlbGQgaW4gZXhjbHVzaXZlIG1vZGUKLSAqIHRvIGlkbGUgYWxsIGRpcnR5IHdvcmsgcXVldWVzIGJlZm9yZSB0aGUgZmlmbyBpcyB0YWtlbiBkb3duLgotICoKLSAqIFRoZSB3b3JrIHRhc2sgbWF5IGFjdHVhbGx5IHJlcXVldWUgaXRzZWxmLCBidXQgYWZ0ZXIgdGhlIGZsdXNoIHJldHVybnMgd2UncmUKLSAqIHN1cmUgdGhhdCB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlc2VudCwgc2luY2UgdGhlIHR0bSBsb2NrIGlzIGhlbGQgaW4KLSAqIGV4Y2x1c2l2ZSBtb2RlLCBzbyB0aGUgZmlmbyB3aWxsIG5ldmVyIGdldCB1c2VkLgotICovCi0KLXZvaWQgdm13X2ttc19pZGxlX3dvcmtxdWV1ZXMoc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIpCi17Ci0Jc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICplbnRyeTsKLQotCW11dGV4X2xvY2soJnZtYXN0ZXItPmZiX3N1cmZfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZ2bWFzdGVyLT5mYl9zdXJmLCBoZWFkKSB7Ci0JCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVudHJ5LT5kX3dvcmspKQotCQkJKHZvaWQpIGVudHJ5LT5kX3dvcmsud29yay5mdW5jKCZlbnRyeS0+ZF93b3JrLndvcmspOwotCi0JCSh2b2lkKSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVudHJ5LT5kX3dvcmspOwotCX0KLQltdXRleF91bmxvY2soJnZtYXN0ZXItPmZiX3N1cmZfbXV0ZXgpOwotfQotCiB2b2lkIHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlX2Rlc3Ryb3koc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIpCiB7CiAJc3RydWN0IHZtd19mcmFtZWJ1ZmZlcl9zdXJmYWNlICp2ZmJzID0KQEAgLTM3NSw2NSArMzYyLDEyOSBAQAogCWxpc3RfZGVsKCZ2ZmJzLT5oZWFkKTsKIAltdXRleF91bmxvY2soJnZtYXN0ZXItPmZiX3N1cmZfbXV0ZXgpOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2ZmJzLT5kX3dvcmspOwogCWRybV9tYXN0ZXJfcHV0KCZ2ZmJzLT5tYXN0ZXIpOwogCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZyYW1lYnVmZmVyKTsKIAl2bXdfc3VyZmFjZV91bnJlZmVyZW5jZSgmdmZicy0+c3VyZmFjZSk7CisJdHRtX2Jhc2Vfb2JqZWN0X3VucmVmKCZ2ZmJzLT5iYXNlLnVzZXJfb2JqKTsKIAogCWtmcmVlKHZmYnMpOwogfQogCi1zdGF0aWMgdm9pZCB2bXdfZnJhbWVidWZmZXJfcHJlc2VudF9mc19jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgaW50IGRvX3N1cmZhY2VfZGlydHlfc291KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCisJCQkJdW5zaWduZWQgZmxhZ3MsIHVuc2lnbmVkIGNvbG9yLAorCQkJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKKwkJCQl1bnNpZ25lZCBudW1fY2xpcHMsIGludCBpbmMpCiB7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZF93b3JrID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSAqdmZicyA9Ci0JCWNvbnRhaW5lcl9vZihkX3dvcmssIHN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSwgZF93b3JrKTsKLQlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmYgPSB2ZmJzLT5zdXJmYWNlOwotCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZyYW1lYnVmZmVyID0gJnZmYnMtPmJhc2UuYmFzZTsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZnJhbWVidWZmZXItPmRldik7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzX3B0cjsKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdHNbVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTXTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKwlpbnQgaSwgbnVtX3VuaXRzOworCWludCByZXQgPSAwOyAvKiBzaWxlbmNlIHdhcm5pbmcgKi8KKwlpbnQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOwogCiAJc3RydWN0IHsKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKLQkJU1ZHQTNkQ21kUHJlc2VudCBib2R5OwotCQlTVkdBM2RDb3B5UmVjdCBjcjsKKwkJU1ZHQTNkQ21kQmxpdFN1cmZhY2VUb1NjcmVlbiBib2R5OwogCX0gKmNtZDsKKwlTVkdBU2lnbmVkUmVjdCAqYmxpdHM7CiAKLQkvKioKLQkgKiBTdHJpY3RseSB3ZSBzaG91bGQgdGFrZSB0aGUgdHRtX2xvY2sgaW4gcmVhZCBtb2RlIGJlZm9yZSBhY2Nlc3NpbmcKLQkgKiB0aGUgZmlmbywgdG8gbWFrZSBzdXJlIHRoZSBmaWZvIGlzIHByZXNlbnQgYW5kIHVwLiBIb3dldmVyLAotCSAqIGluc3RlYWQgd2UgZmx1c2ggYWxsIHdvcmtxdWV1ZXMgdW5kZXIgdGhlIHR0bSBsb2NrIGluIGV4Y2x1c2l2ZSBtb2RlCi0JICogYmVmb3JlIHRha2luZyBkb3duIHRoZSBmaWZvLgotCSAqLwotCW11dGV4X2xvY2soJnZmYnMtPndvcmtfbG9jayk7Ci0JaWYgKCF2ZmJzLT5wcmVzZW50X2ZzKQotCQlnb3RvIG91dF91bmxvY2s7CiAKLQljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwotCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpCi0JCWdvdG8gb3V0X3Jlc2NoZWQ7CisJbnVtX3VuaXRzID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXZfcHJpdi0+ZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsCisJCQkgICAgaGVhZCkgeworCQlpZiAoY3J0Yy0+ZmIgIT0gJmZyYW1lYnVmZmVyLT5iYXNlKQorCQkJY29udGludWU7CisJCXVuaXRzW251bV91bml0cysrXSA9IHZtd19jcnRjX3RvX2R1KGNydGMpOworCX0KIAotCWNtZC0+aGVhZGVyLmlkID0gY3B1X3RvX2xlMzIoU1ZHQV8zRF9DTURfUFJFU0VOVCk7Ci0JY21kLT5oZWFkZXIuc2l6ZSA9IGNwdV90b19sZTMyKHNpemVvZihjbWQtPmJvZHkpICsgc2l6ZW9mKGNtZC0+Y3IpKTsKLQljbWQtPmJvZHkuc2lkID0gY3B1X3RvX2xlMzIoc3VyZi0+cmVzLmlkKTsKLQljbWQtPmNyLnggPSBjcHVfdG9fbGUzMigwKTsKLQljbWQtPmNyLnkgPSBjcHVfdG9fbGUzMigwKTsKLQljbWQtPmNyLnNyY3ggPSBjbWQtPmNyLng7Ci0JY21kLT5jci5zcmN5ID0gY21kLT5jci55OwotCWNtZC0+Y3IudyA9IGNwdV90b19sZTMyKGZyYW1lYnVmZmVyLT53aWR0aCk7Ci0JY21kLT5jci5oID0gY3B1X3RvX2xlMzIoZnJhbWVidWZmZXItPmhlaWdodCk7Ci0JdmZicy0+cHJlc2VudF9mcyA9IGZhbHNlOwotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKLW91dF9yZXNjaGVkOgotCS8qKgotCSAqIFdpbGwgbm90IHJlLWFkZCBpZiBhbHJlYWR5IHBlbmRpbmcuCi0JICovCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ2ZmJzLT5kX3dvcmssIFZNV0dGWF9QUkVTRU5UX1JBVEUpOwotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnZmYnMtPndvcmtfbG9jayk7CisJQlVHX09OKCFjbGlwcyB8fCAhbnVtX2NsaXBzKTsKKworCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSArIHNpemVvZihTVkdBU2lnbmVkUmVjdCkgKiBudW1fY2xpcHM7CisJY21kID0ga3phbGxvYyhmaWZvX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJUZW1wb3JhcnkgZmlmbyBtZW1vcnkgYWxsb2MgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxlZnQgPSBjbGlwcy0+eDE7CisJcmlnaHQgPSBjbGlwcy0+eDI7CisJdG9wID0gY2xpcHMtPnkxOworCWJvdHRvbSA9IGNsaXBzLT55MjsKKworCS8qIHNraXAgdGhlIGZpcnN0IGNsaXAgcmVjdCAqLworCWZvciAoaSA9IDEsIGNsaXBzX3B0ciA9IGNsaXBzICsgaW5jOworCSAgICAgaSA8IG51bV9jbGlwczsgaSsrLCBjbGlwc19wdHIgKz0gaW5jKSB7CisJCWxlZnQgPSBtaW5fdChpbnQsIGxlZnQsIChpbnQpY2xpcHNfcHRyLT54MSk7CisJCXJpZ2h0ID0gbWF4X3QoaW50LCByaWdodCwgKGludCljbGlwc19wdHItPngyKTsKKwkJdG9wID0gbWluX3QoaW50LCB0b3AsIChpbnQpY2xpcHNfcHRyLT55MSk7CisJCWJvdHRvbSA9IG1heF90KGludCwgYm90dG9tLCAoaW50KWNsaXBzX3B0ci0+eTIpOworCX0KKworCS8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgKi8KKwltZW1zZXQoY21kLCAwLCBmaWZvX3NpemUpOworCWNtZC0+aGVhZGVyLmlkID0gY3B1X3RvX2xlMzIoU1ZHQV8zRF9DTURfQkxJVF9TVVJGQUNFX1RPX1NDUkVFTik7CisJY21kLT5oZWFkZXIuc2l6ZSA9IGNwdV90b19sZTMyKGZpZm9fc2l6ZSAtIHNpemVvZihjbWQtPmhlYWRlcikpOworCisJY21kLT5ib2R5LnNyY1JlY3QubGVmdCA9IGxlZnQ7CisJY21kLT5ib2R5LnNyY1JlY3QucmlnaHQgPSByaWdodDsKKwljbWQtPmJvZHkuc3JjUmVjdC50b3AgPSB0b3A7CisJY21kLT5ib2R5LnNyY1JlY3QuYm90dG9tID0gYm90dG9tOworCisJY2xpcHNfcHRyID0gY2xpcHM7CisJYmxpdHMgPSAoU1ZHQVNpZ25lZFJlY3QgKikmY21kWzFdOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7IGkrKywgY2xpcHNfcHRyICs9IGluYykgeworCQlibGl0c1tpXS5sZWZ0ICAgPSBjbGlwc19wdHItPngxIC0gbGVmdDsKKwkJYmxpdHNbaV0ucmlnaHQgID0gY2xpcHNfcHRyLT54MiAtIGxlZnQ7CisJCWJsaXRzW2ldLnRvcCAgICA9IGNsaXBzX3B0ci0+eTEgLSB0b3A7CisJCWJsaXRzW2ldLmJvdHRvbSA9IGNsaXBzX3B0ci0+eTIgLSB0b3A7CisJfQorCisJLyogZG8gcGVyIHVuaXQgd3JpdGluZywgcmV1c2UgZmlmbyBmb3IgZWFjaCAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fdW5pdHM7IGkrKykgeworCQlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdCA9IHVuaXRzW2ldOworCQlpbnQgY2xpcF94MSA9IGxlZnQgLSB1bml0LT5jcnRjLng7CisJCWludCBjbGlwX3kxID0gdG9wIC0gdW5pdC0+Y3J0Yy55OworCQlpbnQgY2xpcF94MiA9IHJpZ2h0IC0gdW5pdC0+Y3J0Yy54OworCQlpbnQgY2xpcF95MiA9IGJvdHRvbSAtIHVuaXQtPmNydGMueTsKKworCQkvKiBza2lwIGFueSBjcnRjcyB0aGF0IG1pc3NlcyB0aGUgY2xpcCByZWdpb24gKi8KKwkJaWYgKGNsaXBfeDEgPj0gdW5pdC0+Y3J0Yy5tb2RlLmhkaXNwbGF5IHx8CisJCSAgICBjbGlwX3kxID49IHVuaXQtPmNydGMubW9kZS52ZGlzcGxheSB8fAorCQkgICAgY2xpcF94MiA8PSAwIHx8IGNsaXBfeTIgPD0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIG5lZWQgdG8gcmVzZXQgc2lkIGFzIGl0IGlzIGNoYW5nZWQgYnkgZXhlY2J1ZiAqLworCQljbWQtPmJvZHkuc3JjSW1hZ2Uuc2lkID0gY3B1X3RvX2xlMzIoZnJhbWVidWZmZXItPnVzZXJfaGFuZGxlKTsKKworCQljbWQtPmJvZHkuZGVzdFNjcmVlbklkID0gdW5pdC0+dW5pdDsKKworCQkvKgorCQkgKiBUaGUgYmxpdCBjb21tYW5kIGlzIGEgbG90IG1vcmUgcmVzaWxpZW50IHRoZW4gdGhlCisJCSAqIHJlYWRiYWNrIGNvbW1hbmQgd2hlbiBpdCBjb21lcyB0byBjbGlwIHJlY3RzLiBTbyBpdHMKKwkJICogb2theSB0byBnbyBvdXQgb2YgYm91bmRzLgorCQkgKi8KKworCQljbWQtPmJvZHkuZGVzdFJlY3QubGVmdCA9IGNsaXBfeDE7CisJCWNtZC0+Ym9keS5kZXN0UmVjdC5yaWdodCA9IGNsaXBfeDI7CisJCWNtZC0+Ym9keS5kZXN0UmVjdC50b3AgPSBjbGlwX3kxOworCQljbWQtPmJvZHkuZGVzdFJlY3QuYm90dG9tID0gY2xpcF95MjsKKworCisJCXJldCA9IHZtd19leGVjYnVmX3Byb2Nlc3MoZmlsZV9wcml2LCBkZXZfcHJpdiwgTlVMTCwgY21kLAorCQkJCQkgIGZpZm9fc2l6ZSwgMCwgTlVMTCk7CisKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCWJyZWFrOworCX0KKworCWtmcmVlKGNtZCk7CisKKwlyZXR1cm4gcmV0OwogfQogCi0KIGludCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZV9kaXJ0eShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlciwKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkJCSAgdW5zaWduZWQgZmxhZ3MsIHVuc2lnbmVkIGNvbG9yLApAQCAtNDQ0LDQ0ICs0OTUsMjAgQEAKIAlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOwogCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSAqdmZicyA9CiAJCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJzKGZyYW1lYnVmZmVyKTsKLQlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmYgPSB2ZmJzLT5zdXJmYWNlOwogCXN0cnVjdCBkcm1fY2xpcF9yZWN0IG5vcmVjdDsKLQlTVkdBM2RDb3B5UmVjdCAqY3I7Ci0JaW50IGksIGluYyA9IDE7Ci0JaW50IHJldDsKLQotCXN0cnVjdCB7Ci0JCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7Ci0JCVNWR0EzZENtZFByZXNlbnQgYm9keTsKLQkJU1ZHQTNkQ29weVJlY3QgY3I7Ci0JfSAqY21kOworCWludCByZXQsIGluYyA9IDE7CiAKIAlpZiAodW5saWtlbHkodmZicy0+bWFzdGVyICE9IGZpbGVfcHJpdi0+bWFzdGVyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBSZXF1aXJlIFNjcmVlbk9iamVjdCBzdXBwb3J0IGZvciAzRCAqLworCWlmICghZGV2X3ByaXYtPnNvdV9wcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoIW51bV9jbGlwcyB8fAotCSAgICAhKGRldl9wcml2LT5maWZvLmNhcGFiaWxpdGllcyAmCi0JICAgICAgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUKSkgewotCQlpbnQgcmV0OwotCi0JCW11dGV4X2xvY2soJnZmYnMtPndvcmtfbG9jayk7Ci0JCXZmYnMtPnByZXNlbnRfZnMgPSB0cnVlOwotCQlyZXQgPSBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnZmYnMtPmRfd29yaywgVk1XR0ZYX1BSRVNFTlRfUkFURSk7Ci0JCW11dGV4X3VubG9jaygmdmZicy0+d29ya19sb2NrKTsKLQkJaWYgKHJldCkgewotCQkJLyoqCi0JCQkgKiBObyB3b3JrIHBlbmRpbmcsIEZvcmNlIGltbWVkaWF0ZSBwcmVzZW50LgotCQkJICovCi0JCQl2bXdfZnJhbWVidWZmZXJfcHJlc2VudF9mc19jYWxsYmFjaygmdmZicy0+ZF93b3JrLndvcmspOwotCQl9Ci0JCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmICghbnVtX2NsaXBzKSB7CiAJCW51bV9jbGlwcyA9IDE7CiAJCWNsaXBzID0gJm5vcmVjdDsKQEAgLTQ5MywyOSArNTIwLDEwIEBACiAJCWluYyA9IDI7IC8qIHNraXAgc291cmNlIHJlY3RzICovCiAJfQogCi0JY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpICsgKG51bV9jbGlwcyAtIDEpICogc2l6ZW9mKGNtZC0+Y3IpKTsKLQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7Ci0JCURSTV9FUlJPUigiRmlmbyByZXNlcnZlIGZhaWxlZC5cbiIpOwotCQl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJcmV0ID0gZG9fc3VyZmFjZV9kaXJ0eV9zb3UoZGV2X3ByaXYsIGZpbGVfcHJpdiwgJnZmYnMtPmJhc2UsCisJCQkJICAgZmxhZ3MsIGNvbG9yLAorCQkJCSAgIGNsaXBzLCBudW1fY2xpcHMsIGluYyk7CiAKLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOwotCi0JY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9QUkVTRU5UKTsKLQljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZW9mKGNtZC0+Ym9keSkgKyBudW1fY2xpcHMgKiBzaXplb2YoY21kLT5jcikpOwotCWNtZC0+Ym9keS5zaWQgPSBjcHVfdG9fbGUzMihzdXJmLT5yZXMuaWQpOwotCi0JZm9yIChpID0gMCwgY3IgPSAmY21kLT5jcjsgaSA8IG51bV9jbGlwczsgaSsrLCBjcisrLCBjbGlwcyArPSBpbmMpIHsKLQkJY3ItPnggPSBjcHVfdG9fbGUxNihjbGlwcy0+eDEpOwotCQljci0+eSA9IGNwdV90b19sZTE2KGNsaXBzLT55MSk7Ci0JCWNyLT5zcmN4ID0gY3ItPng7Ci0JCWNyLT5zcmN5ID0gY3ItPnk7Ci0JCWNyLT53ID0gY3B1X3RvX2xlMTYoY2xpcHMtPngyIC0gY2xpcHMtPngxKTsKLQkJY3ItPmggPSBjcHVfdG9fbGUxNihjbGlwcy0+eTIgLSBjbGlwcy0+eTEpOwotCX0KLQotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpICsgKG51bV9jbGlwcyAtIDEpICogc2l6ZW9mKGNtZC0+Y3IpKTsKIAl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwogCXJldHVybiAwOwogfQpAQCAtNTQwLDYgKzU0OCwxMCBAQAogCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CiAJaW50IHJldDsKIAorCS8qIDNEIGlzIG9ubHkgc3VwcG9ydGVkIG9uIEhXdjggaG9zdHMgd2hpY2ggc3VwcG9ydHMgc2NyZWVuIG9iamVjdHMgKi8KKwlpZiAoIWRldl9wcml2LT5zb3VfcHJpdikKKwkJcmV0dXJuIC1FTk9TWVM7CisKIAkvKgogCSAqIFNhbml0eSBjaGVja3MuCiAJICovCkBAIC01NjcsNiArNTc5LDkgQEAKIAljYXNlIDE1OgogCQlmb3JtYXQgPSBTVkdBM0RfQTFSNUc1QjU7CiAJCWJyZWFrOworCWNhc2UgODoKKwkJZm9ybWF0ID0gU1ZHQTNEX0xVTUlOQU5DRTg7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiSW52YWxpZCBjb2xvciBkZXB0aDogJWRcbiIsIG1vZGVfY21kLT5kZXB0aCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTk5LDE0ICs2MTQsMTEgQEAKIAl2ZmJzLT5iYXNlLmJhc2UuZGVwdGggPSBtb2RlX2NtZC0+ZGVwdGg7CiAJdmZicy0+YmFzZS5iYXNlLndpZHRoID0gbW9kZV9jbWQtPndpZHRoOwogCXZmYnMtPmJhc2UuYmFzZS5oZWlnaHQgPSBtb2RlX2NtZC0+aGVpZ2h0OwotCXZmYnMtPmJhc2UucGluID0gJnZtd19zdXJmYWNlX2RtYWJ1Zl9waW47Ci0JdmZicy0+YmFzZS51bnBpbiA9ICZ2bXdfc3VyZmFjZV9kbWFidWZfdW5waW47CiAJdmZicy0+c3VyZmFjZSA9IHN1cmZhY2U7CisJdmZicy0+YmFzZS51c2VyX2hhbmRsZSA9IG1vZGVfY21kLT5oYW5kbGU7CiAJdmZicy0+bWFzdGVyID0gZHJtX21hc3Rlcl9nZXQoZmlsZV9wcml2LT5tYXN0ZXIpOwotCW11dGV4X2luaXQoJnZmYnMtPndvcmtfbG9jayk7CiAKIAltdXRleF9sb2NrKCZ2bWFzdGVyLT5mYl9zdXJmX211dGV4KTsKLQlJTklUX0RFTEFZRURfV09SSygmdmZicy0+ZF93b3JrLCAmdm13X2ZyYW1lYnVmZmVyX3ByZXNlbnRfZnNfY2FsbGJhY2spOwogCWxpc3RfYWRkX3RhaWwoJnZmYnMtPmhlYWQsICZ2bWFzdGVyLT5mYl9zdXJmKTsKIAltdXRleF91bmxvY2soJnZtYXN0ZXItPmZiX3N1cmZfbXV0ZXgpOwogCkBAIC02NDEsMTAgKzY1MywxNzAgQEAKIAogCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZyYW1lYnVmZmVyKTsKIAl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZ2ZmJkLT5idWZmZXIpOworCXR0bV9iYXNlX29iamVjdF91bnJlZigmdmZiZC0+YmFzZS51c2VyX29iaik7CiAKIAlrZnJlZSh2ZmJkKTsKIH0KIAorc3RhdGljIGludCBkb19kbWFidWZfZGlydHlfbGR1KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCisJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MsIHVuc2lnbmVkIGNvbG9yLAorCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKKwkJCSAgICAgICB1bnNpZ25lZCBudW1fY2xpcHMsIGludCBpbmNyZW1lbnQpCit7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKwlpbnQgaTsKKworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWRVcGRhdGUgYm9keTsKKwl9ICpjbWQ7CisKKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCkgKiBudW1fY2xpcHM7CisJY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgZmlmb19zaXplKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmlmbyByZXNlcnZlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY21kLCAwLCBmaWZvX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7IGkrKywgY2xpcHMgKz0gaW5jcmVtZW50KSB7CisJCWNtZFtpXS5oZWFkZXIgPSBjcHVfdG9fbGUzMihTVkdBX0NNRF9VUERBVEUpOworCQljbWRbaV0uYm9keS54ID0gY3B1X3RvX2xlMzIoY2xpcHMtPngxKTsKKwkJY21kW2ldLmJvZHkueSA9IGNwdV90b19sZTMyKGNsaXBzLT55MSk7CisJCWNtZFtpXS5ib2R5LndpZHRoID0gY3B1X3RvX2xlMzIoY2xpcHMtPngyIC0gY2xpcHMtPngxKTsKKwkJY21kW2ldLmJvZHkuaGVpZ2h0ID0gY3B1X3RvX2xlMzIoY2xpcHMtPnkyIC0gY2xpcHMtPnkxKTsKKwl9CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fZG1hYnVmX2RlZmluZV9nbXJmYihzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgIHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICpmcmFtZWJ1ZmZlcikKK3sKKwlpbnQgZGVwdGggPSBmcmFtZWJ1ZmZlci0+YmFzZS5kZXB0aDsKKwlzaXplX3QgZmlmb19zaXplOworCWludCByZXQ7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBoZWFkZXI7CisJCVNWR0FGaWZvQ21kRGVmaW5lR01SRkIgYm9keTsKKwl9ICpjbWQ7CisKKwkvKiBFbXVsYXRlIFJHQkEgc3VwcG9ydCwgY29udHJhcnkgdG8gc3ZnYV9yZWcuaCB0aGlzIGlzIG5vdAorCSAqIHN1cHBvcnRlZCBieSBob3N0cy4gVGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBpZiB3ZSBhcmUgcmVhZGluZworCSAqIHRoaXMgdmFsdWUgbGF0ZXIgYW5kIGV4cGVjdGluZyB3aGF0IHdlIHVwbG9hZGVkIGJhY2suCisJICovCisJaWYgKGRlcHRoID09IDMyKQorCQlkZXB0aCA9IDI0OworCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpOworCWNtZCA9IGttYWxsb2MoZmlmb19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBjbWQgYnVmZmVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJY21kLT5oZWFkZXIgPSBTVkdBX0NNRF9ERUZJTkVfR01SRkI7CisJY21kLT5ib2R5LmZvcm1hdC5iaXRzUGVyUGl4ZWwgPSBmcmFtZWJ1ZmZlci0+YmFzZS5iaXRzX3Blcl9waXhlbDsKKwljbWQtPmJvZHkuZm9ybWF0LmNvbG9yRGVwdGggPSBkZXB0aDsKKwljbWQtPmJvZHkuZm9ybWF0LnJlc2VydmVkID0gMDsKKwljbWQtPmJvZHkuYnl0ZXNQZXJMaW5lID0gZnJhbWVidWZmZXItPmJhc2UucGl0Y2g7CisJY21kLT5ib2R5LnB0ci5nbXJJZCA9IGZyYW1lYnVmZmVyLT51c2VyX2hhbmRsZTsKKwljbWQtPmJvZHkucHRyLm9mZnNldCA9IDA7CisKKwlyZXQgPSB2bXdfZXhlY2J1Zl9wcm9jZXNzKGZpbGVfcHJpdiwgZGV2X3ByaXYsIE5VTEwsIGNtZCwKKwkJCQkgIGZpZm9fc2l6ZSwgMCwgTlVMTCk7CisKKwlrZnJlZShjbWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19kbWFidWZfZGlydHlfc291KHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJICAgICAgIHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCisJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MsIHVuc2lnbmVkIGNvbG9yLAorCQkJICAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcywKKwkJCSAgICAgICB1bnNpZ25lZCBudW1fY2xpcHMsIGludCBpbmNyZW1lbnQpCit7CisJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKnVuaXRzW1ZNV0dGWF9OVU1fRElTUExBWV9VTklUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzX3B0cjsKKwlpbnQgaSwgaywgbnVtX3VuaXRzLCByZXQ7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXNpemVfdCBmaWZvX3NpemU7CisKKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBoZWFkZXI7CisJCVNWR0FGaWZvQ21kQmxpdEdNUkZCVG9TY3JlZW4gYm9keTsKKwl9ICpibGl0czsKKworCXJldCA9IGRvX2RtYWJ1Zl9kZWZpbmVfZ21yZmIoZmlsZV9wcml2LCBkZXZfcHJpdiwgZnJhbWVidWZmZXIpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7IC8qIGRlZmluZV9nbXJmYiBwcmludHMgd2FybmluZ3MgKi8KKworCWZpZm9fc2l6ZSA9IHNpemVvZigqYmxpdHMpICogbnVtX2NsaXBzOworCWJsaXRzID0ga21hbGxvYyhmaWZvX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShibGl0cyA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgY21kIGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwludW1fdW5pdHMgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldl9wcml2LT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgeworCQlpZiAoY3J0Yy0+ZmIgIT0gJmZyYW1lYnVmZmVyLT5iYXNlKQorCQkJY29udGludWU7CisJCXVuaXRzW251bV91bml0cysrXSA9IHZtd19jcnRjX3RvX2R1KGNydGMpOworCX0KKworCWZvciAoayA9IDA7IGsgPCBudW1fdW5pdHM7IGsrKykgeworCQlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdCA9IHVuaXRzW2tdOworCQlpbnQgaGl0X251bSA9IDA7CisKKwkJY2xpcHNfcHRyID0gY2xpcHM7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7IGkrKywgY2xpcHNfcHRyICs9IGluY3JlbWVudCkgeworCQkJaW50IGNsaXBfeDEgPSBjbGlwc19wdHItPngxIC0gdW5pdC0+Y3J0Yy54OworCQkJaW50IGNsaXBfeTEgPSBjbGlwc19wdHItPnkxIC0gdW5pdC0+Y3J0Yy55OworCQkJaW50IGNsaXBfeDIgPSBjbGlwc19wdHItPngyIC0gdW5pdC0+Y3J0Yy54OworCQkJaW50IGNsaXBfeTIgPSBjbGlwc19wdHItPnkyIC0gdW5pdC0+Y3J0Yy55OworCisJCQkvKiBza2lwIGFueSBjcnRjcyB0aGF0IG1pc3NlcyB0aGUgY2xpcCByZWdpb24gKi8KKwkJCWlmIChjbGlwX3gxID49IHVuaXQtPmNydGMubW9kZS5oZGlzcGxheSB8fAorCQkJICAgIGNsaXBfeTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCQkgICAgY2xpcF94MiA8PSAwIHx8IGNsaXBfeTIgPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJYmxpdHNbaGl0X251bV0uaGVhZGVyID0gU1ZHQV9DTURfQkxJVF9HTVJGQl9UT19TQ1JFRU47CisJCQlibGl0c1toaXRfbnVtXS5ib2R5LmRlc3RTY3JlZW5JZCA9IHVuaXQtPnVuaXQ7CisJCQlibGl0c1toaXRfbnVtXS5ib2R5LnNyY09yaWdpbi54ID0gY2xpcHNfcHRyLT54MTsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuc3JjT3JpZ2luLnkgPSBjbGlwc19wdHItPnkxOworCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC5sZWZ0ID0gY2xpcF94MTsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcF95MTsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwX3gyOworCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC5ib3R0b20gPSBjbGlwX3kyOworCQkJaGl0X251bSsrOworCQl9CisKKwkJLyogbm8gY2xpcHMgaGl0IHRoZSBjcnRjICovCisJCWlmIChoaXRfbnVtID09IDApCisJCQljb250aW51ZTsKKworCQlmaWZvX3NpemUgPSBzaXplb2YoKmJsaXRzKSAqIGhpdF9udW07CisJCXJldCA9IHZtd19leGVjYnVmX3Byb2Nlc3MoZmlsZV9wcml2LCBkZXZfcHJpdiwgTlVMTCwgYmxpdHMsCisJCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoYmxpdHMpOworCisJcmV0dXJuIHJldDsKK30KKwogaW50IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfZGlydHkoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZnJhbWVidWZmZXIsCiAJCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAogCQkJCSB1bnNpZ25lZCBmbGFncywgdW5zaWduZWQgY29sb3IsCkBAIC02NTMsMTMgKzgyNSwxMCBAQAogewogCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihmcmFtZWJ1ZmZlci0+ZGV2KTsKIAlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOworCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfZG1hYnVmICp2ZmJkID0KKwkJdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYmQoZnJhbWVidWZmZXIpOwogCXN0cnVjdCBkcm1fY2xpcF9yZWN0IG5vcmVjdDsKLQlpbnQgcmV0OwotCXN0cnVjdCB7Ci0JCXVpbnQzMl90IGhlYWRlcjsKLQkJU1ZHQUZpZm9DbWRVcGRhdGUgYm9keTsKLQl9ICpjbWQ7Ci0JaW50IGksIGluY3JlbWVudCA9IDE7CisJaW50IHJldCwgaW5jcmVtZW50ID0gMTsKIAogCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC02NzYsMjUgKzg0NSwxOCBAQAogCQlpbmNyZW1lbnQgPSAyOwogCX0KIAotCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSAqIG51bV9jbGlwcyk7Ci0JaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgewotCQlEUk1fRVJST1IoIkZpZm8gcmVzZXJ2ZSBmYWlsZWQuXG4iKTsKLQkJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGRldl9wcml2LT5sZHVfcHJpdikgeworCQlyZXQgPSBkb19kbWFidWZfZGlydHlfbGR1KGRldl9wcml2LCAmdmZiZC0+YmFzZSwKKwkJCQkJICBmbGFncywgY29sb3IsCisJCQkJCSAgY2xpcHMsIG51bV9jbGlwcywgaW5jcmVtZW50KTsKKwl9IGVsc2UgeworCQlyZXQgPSBkb19kbWFidWZfZGlydHlfc291KGZpbGVfcHJpdiwgZGV2X3ByaXYsICZ2ZmJkLT5iYXNlLAorCQkJCQkgIGZsYWdzLCBjb2xvciwKKwkJCQkJICBjbGlwcywgbnVtX2NsaXBzLCBpbmNyZW1lbnQpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpcHM7IGkrKywgY2xpcHMgKz0gaW5jcmVtZW50KSB7Ci0JCWNtZFtpXS5oZWFkZXIgPSBjcHVfdG9fbGUzMihTVkdBX0NNRF9VUERBVEUpOwotCQljbWRbaV0uYm9keS54ID0gY3B1X3RvX2xlMzIoY2xpcHMtPngxKTsKLQkJY21kW2ldLmJvZHkueSA9IGNwdV90b19sZTMyKGNsaXBzLT55MSk7Ci0JCWNtZFtpXS5ib2R5LndpZHRoID0gY3B1X3RvX2xlMzIoY2xpcHMtPngyIC0gY2xpcHMtPngxKTsKLQkJY21kW2ldLmJvZHkuaGVpZ2h0ID0gY3B1X3RvX2xlMzIoY2xpcHMtPnkyIC0gY2xpcHMtPnkxKTsKLQl9Ci0KLQl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHNpemVvZigqY21kKSAqIG51bV9jbGlwcyk7CiAJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfZnVuY3MgPSB7CkBAIC03MDMsNDUgKzg2NSw5IEBACiAJLmNyZWF0ZV9oYW5kbGUgPSB2bXdfZnJhbWVidWZmZXJfY3JlYXRlX2hhbmRsZSwKIH07CiAKLXN0YXRpYyBpbnQgdm13X3N1cmZhY2VfZG1hYnVmX3BpbihzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyICp2ZmIpCi17Ci0Jc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KHZmYi0+YmFzZS5kZXYpOwotCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSAqdmZicyA9Ci0JCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJzKCZ2ZmItPmJhc2UpOwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHZmYnMtPmJhc2UuYmFzZS5waXRjaCAqIHZmYnMtPmJhc2UuYmFzZS5oZWlnaHQ7Ci0JaW50IHJldDsKLQotCXZmYnMtPmJ1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKCp2ZmJzLT5idWZmZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkodmZicy0+YnVmZmVyID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXZtd19vdmVybGF5X3BhdXNlX2FsbChkZXZfcHJpdik7Ci0JcmV0ID0gdm13X2RtYWJ1Zl9pbml0KGRldl9wcml2LCB2ZmJzLT5idWZmZXIsIHNpemUsCi0JCQkgICAgICAgJnZtd192cmFtX25lX3BsYWNlbWVudCwKLQkJCSAgICAgICBmYWxzZSwgJnZtd19kbWFidWZfYm9fZnJlZSk7Ci0Jdm13X292ZXJsYXlfcmVzdW1lX2FsbChkZXZfcHJpdik7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJdmZicy0+YnVmZmVyID0gTlVMTDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm13X3N1cmZhY2VfZG1hYnVmX3VucGluKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYikKLXsKLQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOwotCXN0cnVjdCB2bXdfZnJhbWVidWZmZXJfc3VyZmFjZSAqdmZicyA9Ci0JCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJzKCZ2ZmItPmJhc2UpOwotCi0JaWYgKHVubGlrZWx5KHZmYnMtPmJ1ZmZlciA9PSBOVUxMKSkKLQkJcmV0dXJuIDA7Ci0KLQlibyA9ICZ2ZmJzLT5idWZmZXItPmJhc2U7Ci0JdHRtX2JvX3VucmVmKCZibyk7Ci0JdmZicy0+YnVmZmVyID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCisvKioKKyAqIFBpbiB0aGUgZG1hYnVmZmVyIHRvIHRoZSBzdGFydCBvZiB2cmFtLgorICovCiBzdGF0aWMgaW50IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfcGluKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYikKIHsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYodmZiLT5iYXNlLmRldik7CkBAIC03NDksMTAgKzg3NSwxMiBAQAogCQl2bXdfZnJhbWVidWZmZXJfdG9fdmZiZCgmdmZiLT5iYXNlKTsKIAlpbnQgcmV0OwogCisJLyogVGhpcyBjb2RlIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHNjcmVlbiBvYmplY3RzICovCisJQlVHX09OKGRldl9wcml2LT5zb3VfcHJpdik7CiAKIAl2bXdfb3ZlcmxheV9wYXVzZV9hbGwoZGV2X3ByaXYpOwogCi0JcmV0ID0gdm13X2RtYWJ1Zl90b19zdGFydF9vZl92cmFtKGRldl9wcml2LCB2ZmJkLT5idWZmZXIpOworCXJldCA9IHZtd19kbWFidWZfdG9fc3RhcnRfb2ZfdnJhbShkZXZfcHJpdiwgdmZiZC0+YnVmZmVyLCB0cnVlLCBmYWxzZSk7CiAKIAl2bXdfb3ZlcmxheV9yZXN1bWVfYWxsKGRldl9wcml2KTsKIApAQCAtNzcyLDcgKzkwMCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXJldHVybiB2bXdfZG1hYnVmX2Zyb21fdnJhbShkZXZfcHJpdiwgdmZiZC0+YnVmZmVyKTsKKwlyZXR1cm4gdm13X2RtYWJ1Zl91bnBpbihkZXZfcHJpdiwgdmZiZC0+YnVmZmVyLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyBpbnQgdm13X2ttc19uZXdfZnJhbWVidWZmZXJfZG1hYnVmKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC03OTQsNiArOTIyLDMzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIExpbWl0ZWQgZnJhbWVidWZmZXIgY29sb3IgZGVwdGggc3VwcG9ydCBmb3Igc2NyZWVuIG9iamVjdHMgKi8KKwlpZiAoZGV2X3ByaXYtPnNvdV9wcml2KSB7CisJCXN3aXRjaCAobW9kZV9jbWQtPmRlcHRoKSB7CisJCWNhc2UgMzI6CisJCWNhc2UgMjQ6CisJCQkvKiBPbmx5IHN1cHBvcnQgMzIgYnBwIGZvciAzMiBhbmQgMjQgZGVwdGggZmJzICovCisJCQlpZiAobW9kZV9jbWQtPmJwcCA9PSAzMikKKwkJCQlicmVhazsKKworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG9yIGRlcHRoL2JicDogJWQgJWRcbiIsCisJCQkJICBtb2RlX2NtZC0+ZGVwdGgsIG1vZGVfY21kLT5icHApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgMTY6CisJCWNhc2UgMTU6CisJCQkvKiBPbmx5IHN1cHBvcnQgMTYgYnBwIGZvciAxNiBhbmQgMTUgZGVwdGggZmJzICovCisJCQlpZiAobW9kZV9jbWQtPmJwcCA9PSAxNikKKwkJCQlicmVhazsKKworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG9yIGRlcHRoL2JicDogJWQgJWRcbiIsCisJCQkJICBtb2RlX2NtZC0+ZGVwdGgsIG1vZGVfY21kLT5icHApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgZGVwdGg6ICVkXG4iLCBtb2RlX2NtZC0+ZGVwdGgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKIAl2ZmJkID0ga3phbGxvYyhzaXplb2YoKnZmYmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZmYmQpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTgxNSw5ICs5NzAsMTMgQEAKIAl2ZmJkLT5iYXNlLmJhc2UuZGVwdGggPSBtb2RlX2NtZC0+ZGVwdGg7CiAJdmZiZC0+YmFzZS5iYXNlLndpZHRoID0gbW9kZV9jbWQtPndpZHRoOwogCXZmYmQtPmJhc2UuYmFzZS5oZWlnaHQgPSBtb2RlX2NtZC0+aGVpZ2h0OwotCXZmYmQtPmJhc2UucGluID0gdm13X2ZyYW1lYnVmZmVyX2RtYWJ1Zl9waW47Ci0JdmZiZC0+YmFzZS51bnBpbiA9IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfdW5waW47CisJaWYgKCFkZXZfcHJpdi0+c291X3ByaXYpIHsKKwkJdmZiZC0+YmFzZS5waW4gPSB2bXdfZnJhbWVidWZmZXJfZG1hYnVmX3BpbjsKKwkJdmZiZC0+YmFzZS51bnBpbiA9IHZtd19mcmFtZWJ1ZmZlcl9kbWFidWZfdW5waW47CisJfQorCXZmYmQtPmJhc2UuZG1hYnVmID0gdHJ1ZTsKIAl2ZmJkLT5idWZmZXIgPSBkbWFidWY7CisJdmZiZC0+YmFzZS51c2VyX2hhbmRsZSA9IG1vZGVfY21kLT5oYW5kbGU7CiAJKm91dCA9ICZ2ZmJkLT5iYXNlOwogCiAJcmV0dXJuIDA7CkBAIC04NDMsNiArMTAwMiw3IEBACiAJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiID0gTlVMTDsKIAlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmZhY2UgPSBOVUxMOwogCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8gPSBOVUxMOworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKnVzZXJfb2JqOwogCXU2NCByZXF1aXJlZF9zaXplOwogCWludCByZXQ7CiAKQEAgLTg1NSw3ICsxMDE1LDIyIEBACiAJcmVxdWlyZWRfc2l6ZSA9IG1vZGVfY21kLT5waXRjaCAqIG1vZGVfY21kLT5oZWlnaHQ7CiAJaWYgKHVubGlrZWx5KHJlcXVpcmVkX3NpemUgPiAodTY0KSBkZXZfcHJpdi0+dnJhbV9zaXplKSkgewogCQlEUk1fRVJST1IoIlZSQU0gc2l6ZSBpcyB0b28gc21hbGwgZm9yIHJlcXVlc3RlZCBtb2RlLlxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwkvKgorCSAqIFRha2UgYSByZWZlcmVuY2Ugb24gdGhlIHVzZXIgb2JqZWN0IG9mIHRoZSByZXNvdXJjZQorCSAqIGJhY2tpbmcgdGhlIGttcyBmYi4gVGhpcyBlbnN1cmVzIHRoYXQgdXNlci1zcGFjZSBoYW5kbGUKKwkgKiBsb29rdXBzIG9uIHRoYXQgcmVzb3VyY2Ugd2lsbCBhbHdheXMgd29yayBhcyBsb25nIGFzCisJICogaXQncyByZWdpc3RlcmVkIHdpdGggYSBrbXMgZnJhbWVidWZmZXIuIFRoaXMgaXMgaW1wb3J0YW50LAorCSAqIHNpbmNlIHZtd19leGVjYnVmX3Byb2Nlc3MgaWRlbnRpZmllcyByZXNvdXJjZXMgaW4gdGhlCisJICogY29tbWFuZCBzdHJlYW0gdXNpbmcgdXNlci1zcGFjZSBoYW5kbGVzLgorCSAqLworCisJdXNlcl9vYmogPSB0dG1fYmFzZV9vYmplY3RfbG9va3VwKHRmaWxlLCBtb2RlX2NtZC0+aGFuZGxlKTsKKwlpZiAodW5saWtlbHkodXNlcl9vYmogPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJDb3VsZCBub3QgbG9jYXRlIHJlcXVlc3RlZCBrbXMgZnJhbWUgYnVmZmVyLlxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCX0KIAogCS8qKgpAQCAtODc4LDggKzEwNTMsMTAgQEAKIAogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHZtd19mcmFtZWJ1ZmZlcjogJWlcbiIsIHJldCk7CisJCXR0bV9iYXNlX29iamVjdF91bnJlZigmdXNlcl9vYmopOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCX0KKwl9IGVsc2UKKwkJdmZiLT51c2VyX29iaiA9IHVzZXJfb2JqOwogCXJldHVybiAmdmZiLT5iYXNlOwogCiB0cnlfZG1hYnVmOgpAQCAtODk5LDggKzEwNzYsMTAgQEAKIAogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHZtd19mcmFtZWJ1ZmZlcjogJWlcbiIsIHJldCk7CisJCXR0bV9iYXNlX29iamVjdF91bnJlZigmdXNlcl9vYmopOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCX0KKwl9IGVsc2UKKwkJdmZiLT51c2VyX29iaiA9IHVzZXJfb2JqOwogCiAJcmV0dXJuICZ2ZmItPmJhc2U7CiAKQEAgLTkwOCw2ICsxMDg3LDcgQEAKIAlEUk1fRVJST1IoInN1cmZhY2Ugbm90IG1hcmtlZCBhcyBzY2Fub3V0XG4iKTsKIAkvKiB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cCB0YWtlcyBvbmUgcmVmICovCiAJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnN1cmZhY2UpOworCXR0bV9iYXNlX29iamVjdF91bnJlZigmdXNlcl9vYmopOwogCiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9CkBAIC05MTYsNiArMTA5NiwyMTAgQEAKIAkuZmJfY3JlYXRlID0gdm13X2ttc19mYl9jcmVhdGUsCiB9OwogCitpbnQgdm13X2ttc19wcmVzZW50KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJICAgIHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYiwKKwkJICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3VyZmFjZSwKKwkJICAgIHVpbnQzMl90IHNpZCwKKwkJICAgIGludDMyX3QgZGVzdFgsIGludDMyX3QgZGVzdFksCisJCSAgICBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpjbGlwcywKKwkJICAgIHVpbnQzMl90IG51bV9jbGlwcykKK3sKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdHNbVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTXTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKwlpbnQgaSwgaywgbnVtX3VuaXRzOworCWludCByZXQgPSAwOyAvKiBzaWxlbmNlIHdhcm5pbmcgKi8KKworCXN0cnVjdCB7CisJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJCVNWR0EzZENtZEJsaXRTdXJmYWNlVG9TY3JlZW4gYm9keTsKKwl9ICpjbWQ7CisJU1ZHQVNpZ25lZFJlY3QgKmJsaXRzOworCisJbnVtX3VuaXRzID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXZfcHJpdi0+ZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNydGMtPmZiICE9ICZ2ZmItPmJhc2UpCisJCQljb250aW51ZTsKKwkJdW5pdHNbbnVtX3VuaXRzKytdID0gdm13X2NydGNfdG9fZHUoY3J0Yyk7CisJfQorCisJQlVHX09OKHN1cmZhY2UgPT0gTlVMTCk7CisJQlVHX09OKCFjbGlwcyB8fCAhbnVtX2NsaXBzKTsKKworCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSArIHNpemVvZihTVkdBU2lnbmVkUmVjdCkgKiBudW1fY2xpcHM7CisJY21kID0ga21hbGxvYyhmaWZvX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5IGZpZm8gbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgKi8KKwltZW1zZXQoY21kLCAwLCBmaWZvX3NpemUpOworCWNtZC0+aGVhZGVyLmlkID0gY3B1X3RvX2xlMzIoU1ZHQV8zRF9DTURfQkxJVF9TVVJGQUNFX1RPX1NDUkVFTik7CisJY21kLT5oZWFkZXIuc2l6ZSA9IGNwdV90b19sZTMyKGZpZm9fc2l6ZSAtIHNpemVvZihjbWQtPmhlYWRlcikpOworCisJY21kLT5ib2R5LnNyY1JlY3QubGVmdCA9IDA7CisJY21kLT5ib2R5LnNyY1JlY3QucmlnaHQgPSBzdXJmYWNlLT5zaXplc1swXS53aWR0aDsKKwljbWQtPmJvZHkuc3JjUmVjdC50b3AgPSAwOworCWNtZC0+Ym9keS5zcmNSZWN0LmJvdHRvbSA9IHN1cmZhY2UtPnNpemVzWzBdLmhlaWdodDsKKworCWJsaXRzID0gKFNWR0FTaWduZWRSZWN0ICopJmNtZFsxXTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsaXBzOyBpKyspIHsKKwkJYmxpdHNbaV0ubGVmdCAgID0gY2xpcHNbaV0ueDsKKwkJYmxpdHNbaV0ucmlnaHQgID0gY2xpcHNbaV0ueCArIGNsaXBzW2ldLnc7CisJCWJsaXRzW2ldLnRvcCAgICA9IGNsaXBzW2ldLnk7CisJCWJsaXRzW2ldLmJvdHRvbSA9IGNsaXBzW2ldLnkgKyBjbGlwc1tpXS5oOworCX0KKworCWZvciAoayA9IDA7IGsgPCBudW1fdW5pdHM7IGsrKykgeworCQlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdCA9IHVuaXRzW2tdOworCQlpbnQgY2xpcF94MSA9IGRlc3RYIC0gdW5pdC0+Y3J0Yy54OworCQlpbnQgY2xpcF95MSA9IGRlc3RZIC0gdW5pdC0+Y3J0Yy55OworCQlpbnQgY2xpcF94MiA9IGNsaXBfeDEgKyBzdXJmYWNlLT5zaXplc1swXS53aWR0aDsKKwkJaW50IGNsaXBfeTIgPSBjbGlwX3kxICsgc3VyZmFjZS0+c2l6ZXNbMF0uaGVpZ2h0OworCisJCS8qIHNraXAgYW55IGNydGNzIHRoYXQgbWlzc2VzIHRoZSBjbGlwIHJlZ2lvbiAqLworCQlpZiAoY2xpcF94MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKKwkJICAgIGNsaXBfeTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQkJY29udGludWU7CisKKwkJLyogbmVlZCB0byByZXNldCBzaWQgYXMgaXQgaXMgY2hhbmdlZCBieSBleGVjYnVmICovCisJCWNtZC0+Ym9keS5zcmNJbWFnZS5zaWQgPSBzaWQ7CisKKwkJY21kLT5ib2R5LmRlc3RTY3JlZW5JZCA9IHVuaXQtPnVuaXQ7CisKKwkJLyoKKwkJICogVGhlIGJsaXQgY29tbWFuZCBpcyBhIGxvdCBtb3JlIHJlc2lsaWVudCB0aGVuIHRoZQorCQkgKiByZWFkYmFjayBjb21tYW5kIHdoZW4gaXQgY29tZXMgdG8gY2xpcCByZWN0cy4gU28gaXRzCisJCSAqIG9rYXkgdG8gZ28gb3V0IG9mIGJvdW5kcy4KKwkJICovCisKKwkJY21kLT5ib2R5LmRlc3RSZWN0LmxlZnQgPSBjbGlwX3gxOworCQljbWQtPmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwX3gyOworCQljbWQtPmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcF95MTsKKwkJY21kLT5ib2R5LmRlc3RSZWN0LmJvdHRvbSA9IGNsaXBfeTI7CisKKwkJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBjbWQsCisJCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJYnJlYWs7CisJfQorCisJa2ZyZWUoY21kKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCB2bXdfa21zX3JlYWRiYWNrKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCSAgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiLAorCQkgICAgIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCBfX3VzZXIgKnVzZXJfZmVuY2VfcmVwLAorCQkgICAgIHN0cnVjdCBkcm1fdm13X3JlY3QgKmNsaXBzLAorCQkgICAgIHVpbnQzMl90IG51bV9jbGlwcykKK3sKKwlzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyX2RtYWJ1ZiAqdmZiZCA9CisJCXZtd19mcmFtZWJ1ZmZlcl90b192ZmJkKCZ2ZmItPmJhc2UpOworCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqZG1hYnVmID0gdmZiZC0+YnVmZmVyOworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0c1tWTVdHRlhfTlVNX0RJU1BMQVlfVU5JVFNdOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwlzaXplX3QgZmlmb19zaXplOworCWludCBpLCBrLCByZXQsIG51bV91bml0cywgYmxpdHNfcG9zOworCisJc3RydWN0IHsKKwkJdWludDMyX3QgaGVhZGVyOworCQlTVkdBRmlmb0NtZERlZmluZUdNUkZCIGJvZHk7CisJfSAqY21kOworCXN0cnVjdCB7CisJCXVpbnQzMl90IGhlYWRlcjsKKwkJU1ZHQUZpZm9DbWRCbGl0U2NyZWVuVG9HTVJGQiBib2R5OworCX0gKmJsaXRzOworCisJbnVtX3VuaXRzID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXZfcHJpdi0+ZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKKwkJaWYgKGNydGMtPmZiICE9ICZ2ZmItPmJhc2UpCisJCQljb250aW51ZTsKKwkJdW5pdHNbbnVtX3VuaXRzKytdID0gdm13X2NydGNfdG9fZHUoY3J0Yyk7CisJfQorCisJQlVHX09OKGRtYWJ1ZiA9PSBOVUxMKTsKKwlCVUdfT04oIWNsaXBzIHx8ICFudW1fY2xpcHMpOworCisJLyogdGFrZSBhIHNhZmUgZ3Vlc3MgYXQgZmlmbyBzaXplICovCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKCpibGl0cykgKiBudW1fY2xpcHMgKiBudW1fdW5pdHM7CisJY21kID0ga21hbGxvYyhmaWZvX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcG9yYXJ5IGZpZm8gbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJY21kLT5oZWFkZXIgPSBTVkdBX0NNRF9ERUZJTkVfR01SRkI7CisJY21kLT5ib2R5LmZvcm1hdC5iaXRzUGVyUGl4ZWwgPSB2ZmItPmJhc2UuYml0c19wZXJfcGl4ZWw7CisJY21kLT5ib2R5LmZvcm1hdC5jb2xvckRlcHRoID0gdmZiLT5iYXNlLmRlcHRoOworCWNtZC0+Ym9keS5mb3JtYXQucmVzZXJ2ZWQgPSAwOworCWNtZC0+Ym9keS5ieXRlc1BlckxpbmUgPSB2ZmItPmJhc2UucGl0Y2g7CisJY21kLT5ib2R5LnB0ci5nbXJJZCA9IHZmYi0+dXNlcl9oYW5kbGU7CisJY21kLT5ib2R5LnB0ci5vZmZzZXQgPSAwOworCisJYmxpdHMgPSAodm9pZCAqKSZjbWRbMV07CisJYmxpdHNfcG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3VuaXRzOyBpKyspIHsKKwkJc3RydWN0IGRybV92bXdfcmVjdCAqYyA9IGNsaXBzOworCQlmb3IgKGsgPSAwOyBrIDwgbnVtX2NsaXBzOyBrKyssIGMrKykgeworCQkJLyogdHJhbnNmb3JtIGNsaXAgY29vcmRzIHRvIGNydGMgb3JpZ2luIGJhc2VkIGNvb3JkcyAqLworCQkJaW50IGNsaXBfeDEgPSBjLT54IC0gdW5pdHNbaV0tPmNydGMueDsKKwkJCWludCBjbGlwX3gyID0gYy0+eCAtIHVuaXRzW2ldLT5jcnRjLnggKyBjLT53OworCQkJaW50IGNsaXBfeTEgPSBjLT55IC0gdW5pdHNbaV0tPmNydGMueTsKKwkJCWludCBjbGlwX3kyID0gYy0+eSAtIHVuaXRzW2ldLT5jcnRjLnkgKyBjLT5oOworCQkJaW50IGRlc3RfeCA9IGMtPng7CisJCQlpbnQgZGVzdF95ID0gYy0+eTsKKworCQkJLyogY29tcGVuc2F0ZSBmb3IgY2xpcHBpbmcsIHdlIG5lZ2F0ZQorCQkJICogYSBuZWdhdGl2ZSBudW1iZXIgYW5kIGFkZCB0aGF0LgorCQkJICovCisJCQlpZiAoY2xpcF94MSA8IDApCisJCQkJZGVzdF94ICs9IC1jbGlwX3gxOworCQkJaWYgKGNsaXBfeTEgPCAwKQorCQkJCWRlc3RfeSArPSAtY2xpcF95MTsKKworCQkJLyogY2xpcCAqLworCQkJY2xpcF94MSA9IG1heChjbGlwX3gxLCAwKTsKKwkJCWNsaXBfeTEgPSBtYXgoY2xpcF95MSwgMCk7CisJCQljbGlwX3gyID0gbWluKGNsaXBfeDIsIHVuaXRzW2ldLT5jcnRjLm1vZGUuaGRpc3BsYXkpOworCQkJY2xpcF95MiA9IG1pbihjbGlwX3kyLCB1bml0c1tpXS0+Y3J0Yy5tb2RlLnZkaXNwbGF5KTsKKworCQkJLyogYW5kIGN1bGwgYW55IHJlY3RzIHRoYXQgbWlzc2VzIHRoZSBjcnRjICovCisJCQlpZiAoY2xpcF94MSA+PSB1bml0c1tpXS0+Y3J0Yy5tb2RlLmhkaXNwbGF5IHx8CisJCQkgICAgY2xpcF95MSA+PSB1bml0c1tpXS0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCQkgICAgY2xpcF94MiA8PSAwIHx8IGNsaXBfeTIgPD0gMCkKKwkJCQljb250aW51ZTsKKworCQkJYmxpdHNbYmxpdHNfcG9zXS5oZWFkZXIgPSBTVkdBX0NNRF9CTElUX1NDUkVFTl9UT19HTVJGQjsKKwkJCWJsaXRzW2JsaXRzX3Bvc10uYm9keS5zcmNTY3JlZW5JZCA9IHVuaXRzW2ldLT51bml0OworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LmRlc3RPcmlnaW4ueCA9IGRlc3RfeDsKKwkJCWJsaXRzW2JsaXRzX3Bvc10uYm9keS5kZXN0T3JpZ2luLnkgPSBkZXN0X3k7CisKKwkJCWJsaXRzW2JsaXRzX3Bvc10uYm9keS5zcmNSZWN0LmxlZnQgPSBjbGlwX3gxOworCQkJYmxpdHNbYmxpdHNfcG9zXS5ib2R5LnNyY1JlY3QudG9wID0gY2xpcF95MTsKKwkJCWJsaXRzW2JsaXRzX3Bvc10uYm9keS5zcmNSZWN0LnJpZ2h0ID0gY2xpcF94MjsKKwkJCWJsaXRzW2JsaXRzX3Bvc10uYm9keS5zcmNSZWN0LmJvdHRvbSA9IGNsaXBfeTI7CisJCQlibGl0c19wb3MrKzsKKwkJfQorCX0KKwkvKiByZXNldCBzaXplIGhlcmUgYW5kIHVzZSBjYWxjdWxhdGVkIGV4YWN0IHNpemUgZnJvbSBsb29wcyAqLworCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSArIHNpemVvZigqYmxpdHMpICogYmxpdHNfcG9zOworCisJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBjbWQsIGZpZm9fc2l6ZSwKKwkJCQkgIDAsIHVzZXJfZmVuY2VfcmVwKTsKKworCWtmcmVlKGNtZCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgdm13X2ttc19pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CkBAIC05MjksNyArMTMxMyw5IEBACiAJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwogCWRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDgxOTI7CiAKLQlyZXQgPSB2bXdfa21zX2luaXRfbGVnYWN5X2Rpc3BsYXlfc3lzdGVtKGRldl9wcml2KTsKKwlyZXQgPSB2bXdfa21zX2luaXRfc2NyZWVuX29iamVjdF9kaXNwbGF5KGRldl9wcml2KTsKKwlpZiAocmV0KSAvKiBGYWxsYmFjayAqLworCQkodm9pZCl2bXdfa21zX2luaXRfbGVnYWN5X2Rpc3BsYXlfc3lzdGVtKGRldl9wcml2KTsKIAogCXJldHVybiAwOwogfQpAQCAtOTQyLDcgKzEzMjgsMTAgQEAKIAkgKiBkcm1fZW5jb2Rlcl9jbGVhbnVwIHdoaWNoIHRha2VzIHRoZSBsb2NrIHdlIGRlYWRsb2NrLgogCSAqLwogCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldl9wcml2LT5kZXYpOwotCXZtd19rbXNfY2xvc2VfbGVnYWN5X2Rpc3BsYXlfc3lzdGVtKGRldl9wcml2KTsKKwlpZiAoZGV2X3ByaXYtPnNvdV9wcml2KQorCQl2bXdfa21zX2Nsb3NlX3NjcmVlbl9vYmplY3RfZGlzcGxheShkZXZfcHJpdik7CisJZWxzZQorCQl2bXdfa21zX2Nsb3NlX2xlZ2FjeV9kaXNwbGF5X3N5c3RlbShkZXZfcHJpdik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4Nyw5ICsxMzc2LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHZtd19rbXNfd3JpdGVfc3ZnYShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAoraW50IHZtd19rbXNfd3JpdGVfc3ZnYShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAogCQkJdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgcGl0Y2gsCi0JCQl1bnNpZ25lZCBiYnAsIHVuc2lnbmVkIGRlcHRoKQorCQkJdW5zaWduZWQgYnBwLCB1bnNpZ25lZCBkZXB0aCkKIHsKIAlpZiAodm13X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX1BJVENITE9DSykKIAkJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19QSVRDSExPQ0ssIHBpdGNoKTsKQEAgLTk5NywxMSArMTM4NiwxNSBAQAogCQlpb3dyaXRlMzIocGl0Y2gsIHZtd19wcml2LT5tbWlvX3ZpcnQgKyBTVkdBX0ZJRk9fUElUQ0hMT0NLKTsKIAl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX1dJRFRILCB3aWR0aCk7CiAJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19IRUlHSFQsIGhlaWdodCk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19CSVRTX1BFUl9QSVhFTCwgYmJwKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0RFUFRILCBkZXB0aCk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19SRURfTUFTSywgMHgwMGZmMDAwMCk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19HUkVFTl9NQVNLLCAweDAwMDBmZjAwKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0JMVUVfTUFTSywgMHgwMDAwMDBmZik7CisJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19CSVRTX1BFUl9QSVhFTCwgYnBwKTsKKworCWlmICh2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfREVQVEgpICE9IGRlcHRoKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBkZXB0aCAldSBmb3IgJXUgYnBwLCBob3N0IGV4cGVjdHMgJXVcbiIsCisJCQkgIGRlcHRoLCBicHAsIHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19ERVBUSCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IHZtd19rbXNfc2F2ZV92Z2Eoc3RydWN0IHZtd19wcml2YXRlICp2bXdfcHJpdikKQEAgLTEwMTEsMTIgKzE0MDQsNyBAQAogCiAJdm13X3ByaXYtPnZnYV93aWR0aCA9IHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19XSURUSCk7CiAJdm13X3ByaXYtPnZnYV9oZWlnaHQgPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfSEVJR0hUKTsKLQl2bXdfcHJpdi0+dmdhX2RlcHRoID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0RFUFRIKTsKIAl2bXdfcHJpdi0+dmdhX2JwcCA9IHZtd19yZWFkKHZtd19wcml2LCBTVkdBX1JFR19CSVRTX1BFUl9QSVhFTCk7Ci0Jdm13X3ByaXYtPnZnYV9wc2V1ZG8gPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfUFNFVURPQ09MT1IpOwotCXZtd19wcml2LT52Z2FfcmVkX21hc2sgPSB2bXdfcmVhZCh2bXdfcHJpdiwgU1ZHQV9SRUdfUkVEX01BU0spOwotCXZtd19wcml2LT52Z2FfYmx1ZV9tYXNrID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0JMVUVfTUFTSyk7Ci0Jdm13X3ByaXYtPnZnYV9ncmVlbl9tYXNrID0gdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX0dSRUVOX01BU0spOwogCWlmICh2bXdfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfUElUQ0hMT0NLKQogCQl2bXdfcHJpdi0+dmdhX3BpdGNobG9jayA9CiAJCSAgdm13X3JlYWQodm13X3ByaXYsIFNWR0FfUkVHX1BJVENITE9DSyk7CkBAIC0xMDY1LDEyICsxNDUzLDcgQEAKIAogCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfV0lEVEgsIHZtd19wcml2LT52Z2Ffd2lkdGgpOwogCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfSEVJR0hULCB2bXdfcHJpdi0+dmdhX2hlaWdodCk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19ERVBUSCwgdm13X3ByaXYtPnZnYV9kZXB0aCk7CiAJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19CSVRTX1BFUl9QSVhFTCwgdm13X3ByaXYtPnZnYV9icHApOwotCXZtd193cml0ZSh2bXdfcHJpdiwgU1ZHQV9SRUdfUFNFVURPQ09MT1IsIHZtd19wcml2LT52Z2FfcHNldWRvKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX1JFRF9NQVNLLCB2bXdfcHJpdi0+dmdhX3JlZF9tYXNrKTsKLQl2bXdfd3JpdGUodm13X3ByaXYsIFNWR0FfUkVHX0dSRUVOX01BU0ssIHZtd19wcml2LT52Z2FfZ3JlZW5fbWFzayk7Ci0Jdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19CTFVFX01BU0ssIHZtd19wcml2LT52Z2FfYmx1ZV9tYXNrKTsKIAlpZiAodm13X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX1BJVENITE9DSykKIAkJdm13X3dyaXRlKHZtd19wcml2LCBTVkdBX1JFR19QSVRDSExPQ0ssCiAJCQkgIHZtd19wcml2LT52Z2FfcGl0Y2hsb2NrKTsKQEAgLTEwOTUsNiArMTQ3OCwzMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorYm9vbCB2bXdfa21zX3ZhbGlkYXRlX21vZGVfdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCXVpbnQzMl90IHBpdGNoLAorCQkJCXVpbnQzMl90IGhlaWdodCkKK3sKKwlyZXR1cm4gKCh1NjQpIHBpdGNoICogKHU2NCkgaGVpZ2h0KSA8ICh1NjQpIGRldl9wcml2LT52cmFtX3NpemU7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiBjYWxsZWQgYnkgRFJNIGNvZGUgY2FsbGVkIHdpdGggdmJsX2xvY2sgaGVsZC4KKyAqLwordTMyIHZtd19nZXRfdmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRnVuY3Rpb24gY2FsbGVkIGJ5IERSTSBjb2RlIGNhbGxlZCB3aXRoIHZibF9sb2NrIGhlbGQuCisgKi8KK2ludCB2bXdfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworLyoqCisgKiBGdW5jdGlvbiBjYWxsZWQgYnkgRFJNIGNvZGUgY2FsbGVkIHdpdGggdmJsX2xvY2sgaGVsZC4KKyAqLwordm9pZCB2bXdfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7Cit9CisKKworLyoKKyAqIFNtYWxsIHNoYXJlZCBrbXMgZnVuY3Rpb25zLgorICovCisKK2ludCB2bXdfZHVfdXBkYXRlX2xheW91dChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCBudW0sCisJCQkgc3RydWN0IGRybV92bXdfcmVjdCAqcmVjdHMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKmR1OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb247CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKworI2lmIDAKKwl7CisJCXVuc2lnbmVkIGludCBpOworCisJCURSTV9JTkZPKCIlczogbmV3IGxheW91dCAiLCBfX2Z1bmNfXyk7CisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCURSTV9JTkZPKCIoJWksICVpICV1eCV1KSAiLCByZWN0c1tpXS54LCByZWN0c1tpXS55LAorCQkJCSByZWN0c1tpXS53LCByZWN0c1tpXS5oKTsKKwkJRFJNX0lORk8oIlxuIik7CisJfQorI2VuZGlmCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbiwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJZHUgPSB2bXdfY29ubmVjdG9yX3RvX2R1KGNvbik7CisJCWlmIChudW0gPiBkdS0+dW5pdCkgeworCQkJZHUtPnByZWZfd2lkdGggPSByZWN0c1tkdS0+dW5pdF0udzsKKwkJCWR1LT5wcmVmX2hlaWdodCA9IHJlY3RzW2R1LT51bml0XS5oOworCQkJZHUtPnByZWZfYWN0aXZlID0gdHJ1ZTsKKwkJCWR1LT5ndWlfeCA9IHJlY3RzW2R1LT51bml0XS54OworCQkJZHUtPmd1aV95ID0gcmVjdHNbZHUtPnVuaXRdLnk7CisJCX0gZWxzZSB7CisJCQlkdS0+cHJlZl93aWR0aCA9IDgwMDsKKwkJCWR1LT5wcmVmX2hlaWdodCA9IDYwMDsKKwkJCWR1LT5wcmVmX2FjdGl2ZSA9IGZhbHNlOworCQl9CisJCWNvbi0+c3RhdHVzID0gdm13X2R1X2Nvbm5lY3Rvcl9kZXRlY3QoY29uLCB0cnVlKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm13X2R1X2NydGNfc2F2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7Cit9CisKK3ZvaWQgdm13X2R1X2NydGNfcmVzdG9yZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7Cit9CisKK3ZvaWQgdm13X2R1X2NydGNfZ2FtbWFfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgIHUxNiAqciwgdTE2ICpnLCB1MTYgKmIsCisJCQkgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoY3J0Yy0+ZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJRFJNX0RFQlVHKCIlZCByL2cvYiA9IDB4JTA0eCAvIDB4JTA0eCAvIDB4JTA0eFxuIiwgaSwKKwkJCSAgcltpXSwgZ1tpXSwgYltpXSk7CisJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9QQUxFVFRFX0JBU0UgKyBpICogMyArIDAsIHJbaV0gPj4gOCk7CisJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9QQUxFVFRFX0JBU0UgKyBpICogMyArIDEsIGdbaV0gPj4gOCk7CisJCXZtd193cml0ZShkZXZfcHJpdiwgU1ZHQV9QQUxFVFRFX0JBU0UgKyBpICogMyArIDIsIGJbaV0gPj4gOCk7CisJfQorfQorCit2b2lkIHZtd19kdV9jb25uZWN0b3JfZHBtcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgbW9kZSkKK3sKK30KKwordm9pZCB2bXdfZHVfY29ubmVjdG9yX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKK30KKwordm9pZCB2bXdfZHVfY29ubmVjdG9yX3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKK30KKworZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwordm13X2R1X2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKK3sKKwl1aW50MzJfdCBudW1fZGlzcGxheXM7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICpkdSA9IHZtd19jb25uZWN0b3JfdG9fZHUoY29ubmVjdG9yKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5od19tdXRleCk7CisJbnVtX2Rpc3BsYXlzID0gdm13X3JlYWQoZGV2X3ByaXYsIFNWR0FfUkVHX05VTV9ESVNQTEFZUyk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+aHdfbXV0ZXgpOworCisJcmV0dXJuICgodm13X2Nvbm5lY3Rvcl90b19kdShjb25uZWN0b3IpLT51bml0IDwgbnVtX2Rpc3BsYXlzICYmCisJCSBkdS0+cHJlZl9hY3RpdmUpID8KKwkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSB2bXdfa21zX2Nvbm5lY3Rvcl9idWlsdGluW10gPSB7CisJLyogNjQweDQ4MEA2MEh6ICovCisJeyBEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyNTE3NSwgNjQwLCA2NTYsCisJCSAgIDc1MiwgODAwLCAwLCA0ODAsIDQ4OSwgNDkyLCA1MjUsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCisJLyogODAweDYwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiODAweDYwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA0MDAwMCwgODAwLCA4NDAsCisJCSAgIDk2OCwgMTA1NiwgMCwgNjAwLCA2MDEsIDYwNSwgNjI4LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDEwMjR4NzY4QDYwSHogKi8KKwl7IERSTV9NT0RFKCIxMDI0eDc2OCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCA2NTAwMCwgMTAyNCwgMTA0OCwKKwkJICAgMTE4NCwgMTM0NCwgMCwgNzY4LCA3NzEsIDc3NywgODA2LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAorCS8qIDExNTJ4ODY0QDc1SHogKi8KKwl7IERSTV9NT0RFKCIxMTUyeDg2NCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDExNTIsIDEyMTYsCisJCSAgIDEzNDQsIDE2MDAsIDAsIDg2NCwgODY1LCA4NjgsIDkwMCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxMjgweDc2OEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTI4MHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNzk1MDAsIDEyODAsIDEzNDQsCisJCSAgIDE0NzIsIDE2NjQsIDAsIDc2OCwgNzcxLCA3NzgsIDc5OCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxMjgweDgwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTI4MHg4MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgODM1MDAsIDEyODAsIDEzNTIsCisJCSAgIDE0ODAsIDE2ODAsIDAsIDgwMCwgODAzLCA4MDksIDgzMSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKKwkvKiAxMjgweDk2MEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTI4MHg5NjAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxMjgwLCAxMzc2LAorCQkgICAxNDg4LCAxODAwLCAwLCA5NjAsIDk2MSwgOTY0LCAxMDAwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX1BIU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDEyODB4MTAyNEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTI4MHgxMDI0IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMTI4MCwgMTMyOCwKKwkJICAgMTQ0MCwgMTY4OCwgMCwgMTAyNCwgMTAyNSwgMTAyOCwgMTA2NiwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxMzYweDc2OEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTM2MHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgODU1MDAsIDEzNjAsIDE0MjQsCisJCSAgIDE1MzYsIDE3OTIsIDAsIDc2OCwgNzcxLCA3NzcsIDc5NSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxNDQweDEwNTBANjBIeiAqLworCXsgRFJNX01PREUoIjE0MDB4MTA1MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMjE3NTAsIDE0MDAsIDE0ODgsCisJCSAgIDE2MzIsIDE4NjQsIDAsIDEwNTAsIDEwNTMsIDEwNTcsIDEwODksIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTQ0MHg5MDBANjBIeiAqLworCXsgRFJNX01PREUoIjE0NDB4OTAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwNjUwMCwgMTQ0MCwgMTUyMCwKKwkJICAgMTY3MiwgMTkwNCwgMCwgOTAwLCA5MDMsIDkwOSwgOTM0LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDE2MDB4MTIwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTYwMHgxMjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDE2MjAwMCwgMTYwMCwgMTY2NCwKKwkJICAgMTg1NiwgMjE2MCwgMCwgMTIwMCwgMTIwMSwgMTIwNCwgMTI1MCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxNjgweDEwNTBANjBIeiAqLworCXsgRFJNX01PREUoIjE2ODB4MTA1MCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxNDYyNTAsIDE2ODAsIDE3ODQsCisJCSAgIDE5NjAsIDIyNDAsIDAsIDEwNTAsIDEwNTMsIDEwNTksIDEwODksIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTc5MngxMzQ0QDYwSHogKi8KKwl7IERSTV9NT0RFKCIxNzkyeDEzNDQiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjA0NzUwLCAxNzkyLCAxOTIwLAorCQkgICAyMTIwLCAyNDQ4LCAwLCAxMzQ0LCAxMzQ1LCAxMzQ4LCAxMzk0LCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDE4NTN4MTM5MkA2MEh6ICovCisJeyBEUk1fTU9ERSgiMTg1NngxMzkyIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDIxODI1MCwgMTg1NiwgMTk1MiwKKwkJICAgMjE3NiwgMjUyOCwgMCwgMTM5MiwgMTM5MywgMTM5NiwgMTQzOSwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiAxOTIweDEyMDBANjBIeiAqLworCXsgRFJNX01PREUoIjE5MjB4MTIwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxOTMyNTAsIDE5MjAsIDIwNTYsCisJCSAgIDIyNTYsIDI1OTIsIDAsIDEyMDAsIDEyMDMsIDEyMDksIDEyNDUsIDAsCisJCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCisJLyogMTkyMHgxNDQwQDYwSHogKi8KKwl7IERSTV9NT0RFKCIxOTIweDE0NDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjM0MDAwLCAxOTIwLCAyMDQ4LAorCQkgICAyMjU2LCAyNjAwLCAwLCAxNDQwLCAxNDQxLCAxNDQ0LCAxNTAwLCAwLAorCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAorCS8qIDI1NjB4MTYwMEA2MEh6ICovCisJeyBEUk1fTU9ERSgiMjU2MHgxNjAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDM0ODUwMCwgMjU2MCwgMjc1MiwKKwkJICAgMzAzMiwgMzUwNCwgMCwgMTYwMCwgMTYwMywgMTYwOSwgMTY1OCwgMCwKKwkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKKwkvKiBUZXJtaW5hdGUgKi8KKwl7IERSTV9NT0RFKCIiLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSB9LAorfTsKKworLyoqCisgKiB2bXdfZ3Vlc3NfbW9kZV90aW1pbmcgLSBQcm92aWRlIGZha2UgdGltaW5ncyBmb3IgYQorICogNjBIeiB2cmVmcmVzaCBtb2RlLgorICoKKyAqIEBtb2RlIC0gUG9pbnRlciB0byBhIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIHdpdGggaGRpc3BsYXkgYW5kIHZkaXNwbGF5CisgKiBtZW1iZXJzIGZpbGxlZCBpbi4KKyAqLworc3RhdGljIHZvaWQgdm13X2d1ZXNzX21vZGVfdGltaW5nKHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCW1vZGUtPmhzeW5jX3N0YXJ0ID0gbW9kZS0+aGRpc3BsYXkgKyA1MDsKKwltb2RlLT5oc3luY19lbmQgPSBtb2RlLT5oc3luY19zdGFydCArIDUwOworCW1vZGUtPmh0b3RhbCA9IG1vZGUtPmhzeW5jX2VuZCArIDUwOworCisJbW9kZS0+dnN5bmNfc3RhcnQgPSBtb2RlLT52ZGlzcGxheSArIDUwOworCW1vZGUtPnZzeW5jX2VuZCA9IG1vZGUtPnZzeW5jX3N0YXJ0ICsgNTA7CisJbW9kZS0+dnRvdGFsID0gbW9kZS0+dnN5bmNfZW5kICsgNTA7CisKKwltb2RlLT5jbG9jayA9ICh1MzIpbW9kZS0+aHRvdGFsICogKHUzMiltb2RlLT52dG90YWwgLyAxMDAgKiA2OworCW1vZGUtPnZyZWZyZXNoID0gZHJtX21vZGVfdnJlZnJlc2gobW9kZSk7Cit9CisKKworaW50IHZtd19kdV9jb25uZWN0b3JfZmlsbF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCXVpbnQzMl90IG1heF93aWR0aCwgdWludDMyX3QgbWF4X2hlaWdodCkKK3sKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHUgPSB2bXdfY29ubmVjdG9yX3RvX2R1KGNvbm5lY3Rvcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSB2bXdfcHJpdihkZXYpOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYm1vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgcHJlZm1vZGUgPSB7IERSTV9NT0RFKCJwcmVmZXJyZWQiLAorCQlEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQlEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKQorCX07CisJaW50IGk7CisKKwkvKiBBZGQgcHJlZmVycmVkIG1vZGUgKi8KKwl7CisJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmcHJlZm1vZGUpOworCQlpZiAoIW1vZGUpCisJCQlyZXR1cm4gMDsKKwkJbW9kZS0+aGRpc3BsYXkgPSBkdS0+cHJlZl93aWR0aDsKKwkJbW9kZS0+dmRpc3BsYXkgPSBkdS0+cHJlZl9oZWlnaHQ7CisJCXZtd19ndWVzc19tb2RlX3RpbWluZyhtb2RlKTsKKworCQlpZiAodm13X2ttc192YWxpZGF0ZV9tb2RlX3ZyYW0oZGV2X3ByaXYsIG1vZGUtPmhkaXNwbGF5ICogMiwKKwkJCQkJICAgICAgIG1vZGUtPnZkaXNwbGF5KSkgeworCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOworCQl9IGVsc2UgeworCQkJZHJtX21vZGVfZGVzdHJveShkZXYsIG1vZGUpOworCQkJbW9kZSA9IE5VTEw7CisJCX0KKworCQlpZiAoZHUtPnByZWZfbW9kZSkgeworCQkJbGlzdF9kZWxfaW5pdCgmZHUtPnByZWZfbW9kZS0+aGVhZCk7CisJCQlkcm1fbW9kZV9kZXN0cm95KGRldiwgZHUtPnByZWZfbW9kZSk7CisJCX0KKworCQkvKiBtb2RlIG1pZ2h0IGJlIG51bGwgaGVyZSwgdGhpcyBpcyBpbnRlbmRlZCAqLworCQlkdS0+cHJlZl9tb2RlID0gbW9kZTsKKwl9CisKKwlmb3IgKGkgPSAwOyB2bXdfa21zX2Nvbm5lY3Rvcl9idWlsdGluW2ldLnR5cGUgIT0gMDsgaSsrKSB7CisJCWJtb2RlID0gJnZtd19rbXNfY29ubmVjdG9yX2J1aWx0aW5baV07CisJCWlmIChibW9kZS0+aGRpc3BsYXkgPiBtYXhfd2lkdGggfHwKKwkJICAgIGJtb2RlLT52ZGlzcGxheSA+IG1heF9oZWlnaHQpCisJCQljb250aW51ZTsKKworCQlpZiAoIXZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKGRldl9wcml2LCBibW9kZS0+aGRpc3BsYXkgKiAyLAorCQkJCQkJYm1vZGUtPnZkaXNwbGF5KSkKKwkJCWNvbnRpbnVlOworCisJCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBibW9kZSk7CisJCWlmICghbW9kZSkKKwkJCXJldHVybiAwOworCQltb2RlLT52cmVmcmVzaCA9IGRybV9tb2RlX3ZyZWZyZXNoKG1vZGUpOworCisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwl9CisKKwkvKiBNb3ZlIHRoZSBwcmVmZXJlZCBtb2RlIGZpcnN0LCBoZWxwIGFwcHMgcGljayB0aGUgcmlnaHQgbW9kZS4gKi8KKwlpZiAoZHUtPnByZWZfbW9kZSkKKwkJbGlzdF9tb3ZlKCZkdS0+cHJlZl9tb2RlLT5oZWFkLCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZtd19kdV9jb25uZWN0b3Jfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwKKwkJCQkgIHVpbnQ2NF90IHZhbCkKK3sKKwlyZXR1cm4gMDsKK30KKworCiBpbnQgdm13X2ttc191cGRhdGVfbGF5b3V0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CkBAIC0xMTA2LDYgKzE3OTUsOCBAQAogCXN0cnVjdCBkcm1fdm13X3JlY3QgKnJlY3RzOwogCXVuc2lnbmVkIHJlY3RzX3NpemU7CiAJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOwogCiAJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTExMTMsNyArMTgwNCw3IEBACiAKIAlpZiAoIWFyZy0+bnVtX291dHB1dHMpIHsKIAkJc3RydWN0IGRybV92bXdfcmVjdCBkZWZfcmVjdCA9IHswLCAwLCA4MDAsIDYwMH07Ci0JCXZtd19rbXNfbGR1X3VwZGF0ZV9sYXlvdXQoZGV2X3ByaXYsIDEsICZkZWZfcmVjdCk7CisJCXZtd19kdV91cGRhdGVfbGF5b3V0KGRldl9wcml2LCAxLCAmZGVmX3JlY3QpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCkBAIC0xMTMyLDcgKzE4MjMsMTggQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQl2bXdfa21zX2xkdV91cGRhdGVfbGF5b3V0KGRldl9wcml2LCBhcmctPm51bV9vdXRwdXRzLCByZWN0cyk7CisJZm9yIChpID0gMDsgaSA8IGFyZy0+bnVtX291dHB1dHM7ICsraSkgeworCQlpZiAocmVjdHMtPnggPCAwIHx8CisJCSAgICByZWN0cy0+eSA8IDAgfHwKKwkJICAgIHJlY3RzLT54ICsgcmVjdHMtPncgPiBtb2RlX2NvbmZpZy0+bWF4X3dpZHRoIHx8CisJCSAgICByZWN0cy0+eSArIHJlY3RzLT5oID4gbW9kZV9jb25maWctPm1heF9oZWlnaHQpIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBHVUkgbGF5b3V0LlxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCX0KKworCXZtd19kdV91cGRhdGVfbGF5b3V0KGRldl9wcml2LCBhcmctPm51bV9vdXRwdXRzLCByZWN0cyk7CiAKIG91dF9mcmVlOgogCWtmcmVlKHJlY3RzKTsKQEAgLTExNDAsMTUgKzE4NDIsMyBAQAogCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KLQotYm9vbCB2bXdfa21zX3ZhbGlkYXRlX21vZGVfdnJhbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCXVpbnQzMl90IHBpdGNoLAotCQkJCXVpbnQzMl90IGhlaWdodCkKLXsKLQlyZXR1cm4gKCh1NjQpIHBpdGNoICogKHU2NCkgaGVpZ2h0KSA8ICh1NjQpIGRldl9wcml2LT52cmFtX3NpemU7Ci19Ci0KLXUzMiB2bXdfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQotewotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuaAppbmRleCA4YTM5OGEwLi5hZjhlNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9rbXMuaApAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCiAKKyNkZWZpbmUgVk1XR0ZYX05VTV9ESVNQTEFZX1VOSVRTIDgKKwogCiAjZGVmaW5lIHZtd19mcmFtZWJ1ZmZlcl90b192ZmIoeCkgXAogCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgdm13X2ZyYW1lYnVmZmVyLCBiYXNlKQpAQCAtNDUsNiArNDcsOSBAQAogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgYmFzZTsKIAlpbnQgKCpwaW4pKHN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKmZiKTsKIAlpbnQgKCp1bnBpbikoc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqZmIpOworCWJvb2wgZG1hYnVmOworCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKnVzZXJfb2JqOworCXVpbnQzMl90IHVzZXJfaGFuZGxlOwogfTsKIAogCkBAIC04MywyMiArODgsNjUgQEAKIAlpbnQgaG90c3BvdF95OwogCiAJdW5zaWduZWQgdW5pdDsKKworCS8qCisJICogUHJlZmVyZWQgbW9kZSB0cmFja2luZy4KKwkgKi8KKwl1bnNpZ25lZCBwcmVmX3dpZHRoOworCXVuc2lnbmVkIHByZWZfaGVpZ2h0OworCWJvb2wgcHJlZl9hY3RpdmU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnByZWZfbW9kZTsKKworCS8qCisJICogR3VpIHBvc2l0aW9uaW5nCisJICovCisJaW50IGd1aV94OworCWludCBndWlfeTsKKwlib29sIGlzX2ltcGxpY2l0OwogfTsKIAorI2RlZmluZSB2bXdfY3J0Y190b19kdSh4KSBcCisJY29udGFpbmVyX29mKHgsIHN0cnVjdCB2bXdfZGlzcGxheV91bml0LCBjcnRjKQorI2RlZmluZSB2bXdfY29ubmVjdG9yX3RvX2R1KHgpIFwKKwljb250YWluZXJfb2YoeCwgc3RydWN0IHZtd19kaXNwbGF5X3VuaXQsIGNvbm5lY3RvcikKKworCiAvKgogICogU2hhcmVkIGRpc3BsYXkgdW5pdCBmdW5jdGlvbnMgLSB2bXdnZnhfa21zLmMKICAqLwogdm9pZCB2bXdfZGlzcGxheV91bml0X2NsZWFudXAoc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKmR1KTsKK3ZvaWQgdm13X2R1X2NydGNfc2F2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwordm9pZCB2bXdfZHVfY3J0Y19yZXN0b3JlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Cit2b2lkIHZtd19kdV9jcnRjX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICB1MTYgKnIsIHUxNiAqZywgdTE2ICpiLAorCQkJICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IHNpemUpOwogaW50IHZtd19kdV9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKIAkJCSAgIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CiBpbnQgdm13X2R1X2NydGNfY3Vyc29yX21vdmUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHkpOwordm9pZCB2bXdfZHVfY29ubmVjdG9yX2RwbXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgaW50IG1vZGUpOwordm9pZCB2bXdfZHVfY29ubmVjdG9yX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cit2b2lkIHZtd19kdV9jb25uZWN0b3JfcmVzdG9yZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK2VudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK3Ztd19kdV9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpOworaW50IHZtd19kdV9jb25uZWN0b3JfZmlsbF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCXVpbnQzMl90IG1heF93aWR0aCwgdWludDMyX3QgbWF4X2hlaWdodCk7CitpbnQgdm13X2R1X2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCSAgdWludDY0X3QgdmFsKTsKKwogCiAvKgogICogTGVnYWN5IGRpc3BsYXkgdW5pdCBmdW5jdGlvbnMgLSB2bXdnZnhfbGR1LmMKICAqLwogaW50IHZtd19rbXNfaW5pdF9sZWdhY3lfZGlzcGxheV9zeXN0ZW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CiBpbnQgdm13X2ttc19jbG9zZV9sZWdhY3lfZGlzcGxheV9zeXN0ZW0oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7Ci1pbnQgdm13X2ttc19sZHVfdXBkYXRlX2xheW91dChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCBudW0sCisKKy8qCisgKiBTY3JlZW4gT2JqZWN0cyBkaXNwbGF5IGZ1bmN0aW9ucyAtIHZtd2dmeF9zY3JuLmMKKyAqLworaW50IHZtd19rbXNfaW5pdF9zY3JlZW5fb2JqZWN0X2Rpc3BsYXkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitpbnQgdm13X2ttc19jbG9zZV9zY3JlZW5fb2JqZWN0X2Rpc3BsYXkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdik7CitpbnQgdm13X2ttc19zb3VfdXBkYXRlX2xheW91dChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LCB1bnNpZ25lZCBudW0sCiAJCQkgICAgICBzdHJ1Y3QgZHJtX3Ztd19yZWN0ICpyZWN0cyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfbGR1LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYwppbmRleCBiM2EyY2Q1Li45MGM1ZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYwpAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAidm13Z2Z4X2ttcy5oIgogCi0jZGVmaW5lIFZNV0dGWF9MRFVfTlVNX0RVIDgKIAogI2RlZmluZSB2bXdfY3J0Y190b19sZHUoeCkgXAogCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5X3VuaXQsIGJhc2UuY3J0YykKQEAgLTUxLDExICs1MCw2IEBACiBzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5X3VuaXQgewogCXN0cnVjdCB2bXdfZGlzcGxheV91bml0IGJhc2U7CiAKLQl1bnNpZ25lZCBwcmVmX3dpZHRoOwotCXVuc2lnbmVkIHByZWZfaGVpZ2h0OwotCWJvb2wgcHJlZl9hY3RpdmU7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnByZWZfbW9kZTsKLQogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlOwogfTsKIApAQCAtNzEsMjAgKzY1LDYgQEAKICAqIExlZ2FjeSBEaXNwbGF5IFVuaXQgQ1JUQyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCB2bXdfbGR1X2NydGNfc2F2ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHZtd19sZHVfY3J0Y19yZXN0b3JlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLX0KLQotc3RhdGljIHZvaWQgdm13X2xkdV9jcnRjX2dhbW1hX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJICAgdTE2ICpyLCB1MTYgKmcsIHUxNiAqYiwKLQkJCQkgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3Qgc2l6ZSkKLXsKLX0KLQogc3RhdGljIHZvaWQgdm13X2xkdV9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXZtd19sZHVfZGVzdHJveSh2bXdfY3J0Y190b19sZHUoY3J0YykpOwpAQCAtMTE0LDEwICs5NCw4IEBACiAJCQlyZXR1cm4gMDsKIAkJZmIgPSBlbnRyeS0+YmFzZS5jcnRjLmZiOwogCi0JCXZtd19rbXNfd3JpdGVfc3ZnYShkZXZfcHJpdiwgdywgaCwgZmItPnBpdGNoLAotCQkJCSAgIGZiLT5iaXRzX3Blcl9waXhlbCwgZmItPmRlcHRoKTsKLQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHZtd19rbXNfd3JpdGVfc3ZnYShkZXZfcHJpdiwgdywgaCwgZmItPnBpdGNoLAorCQkJCQkgIGZiLT5iaXRzX3Blcl9waXhlbCwgZmItPmRlcHRoKTsKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmxkcy0+YWN0aXZlKSkgewpAQCAtMjY1LDkgKzI0Myw3IEBACiAKIAkJdm13X2xkdV9kZWxfYWN0aXZlKGRldl9wcml2LCBsZHUpOwogCi0JCXZtd19sZHVfY29tbWl0X2xpc3QoZGV2X3ByaXYpOwotCi0JCXJldHVybiAwOworCQlyZXR1cm4gdm13X2xkdV9jb21taXRfbGlzdChkZXZfcHJpdik7CiAJfQogCiAKQEAgLTI5MiwyMSArMjY4LDIwIEBACiAKIAl2bXdfbGR1X2FkZF9hY3RpdmUoZGV2X3ByaXYsIGxkdSwgdmZiKTsKIAotCXZtd19sZHVfY29tbWl0X2xpc3QoZGV2X3ByaXYpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHZtd19sZHVfY29tbWl0X2xpc3QoZGV2X3ByaXYpOwogfQogCiBzdGF0aWMgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHZtd19sZWdhY3lfY3J0Y19mdW5jcyA9IHsKLQkuc2F2ZSA9IHZtd19sZHVfY3J0Y19zYXZlLAotCS5yZXN0b3JlID0gdm13X2xkdV9jcnRjX3Jlc3RvcmUsCisJLnNhdmUgPSB2bXdfZHVfY3J0Y19zYXZlLAorCS5yZXN0b3JlID0gdm13X2R1X2NydGNfcmVzdG9yZSwKIAkuY3Vyc29yX3NldCA9IHZtd19kdV9jcnRjX2N1cnNvcl9zZXQsCiAJLmN1cnNvcl9tb3ZlID0gdm13X2R1X2NydGNfY3Vyc29yX21vdmUsCi0JLmdhbW1hX3NldCA9IHZtd19sZHVfY3J0Y19nYW1tYV9zZXQsCisJLmdhbW1hX3NldCA9IHZtd19kdV9jcnRjX2dhbW1hX3NldCwKIAkuZGVzdHJveSA9IHZtd19sZHVfY3J0Y19kZXN0cm95LAogCS5zZXRfY29uZmlnID0gdm13X2xkdV9jcnRjX3NldF9jb25maWcsCiB9OwogCisKIC8qCiAgKiBMZWdhY3kgRGlzcGxheSBVbml0IGVuY29kZXIgZnVuY3Rpb25zCiAgKi8KQEAgLTMyNCwxODMgKzI5OSwxOCBAQAogICogTGVnYWN5IERpc3BsYXkgVW5pdCBjb25uZWN0b3IgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHZvaWQgdm13X2xkdV9jb25uZWN0b3JfZHBtcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgbW9kZSkKLXsKLX0KLQotc3RhdGljIHZvaWQgdm13X2xkdV9jb25uZWN0b3Jfc2F2ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotfQotCi1zdGF0aWMgdm9pZCB2bXdfbGR1X2Nvbm5lY3Rvcl9yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci19Ci0KLXN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCi0Jdm13X2xkdV9jb25uZWN0b3JfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJIGJvb2wgZm9yY2UpCi17Ci0JaWYgKHZtd19jb25uZWN0b3JfdG9fbGR1KGNvbm5lY3RvciktPnByZWZfYWN0aXZlKQotCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7Ci0JcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgdm13X2xkdV9jb25uZWN0b3JfYnVpbHRpbltdID0gewotCS8qIDY0MHg0ODBANjBIeiAqLwotCXsgRFJNX01PREUoIjY0MHg0ODAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMjUxNzUsIDY0MCwgNjU2LAotCQkgICA3NTIsIDgwMCwgMCwgNDgwLCA0ODksIDQ5MiwgNTI1LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSB9LAotCS8qIDgwMHg2MDBANjBIeiAqLwotCXsgRFJNX01PREUoIjgwMHg2MDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNDAwMDAsIDgwMCwgODQwLAotCQkgICA5NjgsIDEwNTYsIDAsIDYwMCwgNjAxLCA2MDUsIDYyOCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxMDI0eDc2OEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTAyNHg3NjgiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgNjUwMDAsIDEwMjQsIDEwNDgsCi0JCSAgIDExODQsIDEzNDQsIDAsIDc2OCwgNzcxLCA3NzcsIDgwNiwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX05WU1lOQykgfSwKLQkvKiAxMTUyeDg2NEA3NUh6ICovCi0JeyBEUk1fTU9ERSgiMTE1Mng4NjQiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTA4MDAwLCAxMTUyLCAxMjE2LAotCQkgICAxMzQ0LCAxNjAwLCAwLCA4NjQsIDg2NSwgODY4LCA5MDAsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTI4MHg3NjhANjBIeiAqLwotCXsgRFJNX01PREUoIjEyODB4NzY4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDc5NTAwLCAxMjgwLCAxMzQ0LAotCQkgICAxNDcyLCAxNjY0LCAwLCA3NjgsIDc3MSwgNzc4LCA3OTgsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTI4MHg4MDBANjBIeiAqLwotCXsgRFJNX01PREUoIjEyODB4ODAwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDgzNTAwLCAxMjgwLCAxMzUyLAotCQkgICAxNDgwLCAxNjgwLCAwLCA4MDAsIDgwMywgODA5LCA4MzEsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19OVlNZTkMpIH0sCi0JLyogMTI4MHg5NjBANjBIeiAqLwotCXsgRFJNX01PREUoIjEyODB4OTYwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDEwODAwMCwgMTI4MCwgMTM3NiwKLQkJICAgMTQ4OCwgMTgwMCwgMCwgOTYwLCA5NjEsIDk2NCwgMTAwMCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19QSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxMjgweDEwMjRANjBIeiAqLwotCXsgRFJNX01PREUoIjEyODB4MTAyNCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDgwMDAsIDEyODAsIDEzMjgsCi0JCSAgIDE0NDAsIDE2ODgsIDAsIDEwMjQsIDEwMjUsIDEwMjgsIDEwNjYsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTM2MHg3NjhANjBIeiAqLwotCXsgRFJNX01PREUoIjEzNjB4NzY4IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDg1NTAwLCAxMzYwLCAxNDI0LAotCQkgICAxNTM2LCAxNzkyLCAwLCA3NjgsIDc3MSwgNzc3LCA3OTUsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTQ0MHgxMDUwQDYwSHogKi8KLQl7IERSTV9NT0RFKCIxNDAweDEwNTAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTIxNzUwLCAxNDAwLCAxNDg4LAotCQkgICAxNjMyLCAxODY0LCAwLCAxMDUwLCAxMDUzLCAxMDU3LCAxMDg5LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDE0NDB4OTAwQDYwSHogKi8KLQl7IERSTV9NT0RFKCIxNDQweDkwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxMDY1MDAsIDE0NDAsIDE1MjAsCi0JCSAgIDE2NzIsIDE5MDQsIDAsIDkwMCwgOTAzLCA5MDksIDkzNCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxNjAweDEyMDBANjBIeiAqLwotCXsgRFJNX01PREUoIjE2MDB4MTIwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAxNjIwMDAsIDE2MDAsIDE2NjQsCi0JCSAgIDE4NTYsIDIxNjAsIDAsIDEyMDAsIDEyMDEsIDEyMDQsIDEyNTAsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTY4MHgxMDUwQDYwSHogKi8KLQl7IERSTV9NT0RFKCIxNjgweDEwNTAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTQ2MjUwLCAxNjgwLCAxNzg0LAotCQkgICAxOTYwLCAyMjQwLCAwLCAxMDUwLCAxMDUzLCAxMDU5LCAxMDg5LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDE3OTJ4MTM0NEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTc5MngxMzQ0IiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDIwNDc1MCwgMTc5MiwgMTkyMCwKLQkJICAgMjEyMCwgMjQ0OCwgMCwgMTM0NCwgMTM0NSwgMTM0OCwgMTM5NCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAxODUzeDEzOTJANjBIeiAqLwotCXsgRFJNX01PREUoIjE4NTZ4MTM5MiIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAyMTgyNTAsIDE4NTYsIDE5NTIsCi0JCSAgIDIxNzYsIDI1MjgsIDAsIDEzOTIsIDEzOTMsIDEzOTYsIDE0MzksIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogMTkyMHgxMjAwQDYwSHogKi8KLQl7IERSTV9NT0RFKCIxOTIweDEyMDAiLCBEUk1fTU9ERV9UWVBFX0RSSVZFUiwgMTkzMjUwLCAxOTIwLCAyMDU2LAotCQkgICAyMjU2LCAyNTkyLCAwLCAxMjAwLCAxMjAzLCAxMjA5LCAxMjQ1LCAwLAotCQkgICBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKSB9LAotCS8qIDE5MjB4MTQ0MEA2MEh6ICovCi0JeyBEUk1fTU9ERSgiMTkyMHgxNDQwIiwgRFJNX01PREVfVFlQRV9EUklWRVIsIDIzNDAwMCwgMTkyMCwgMjA0OCwKLQkJICAgMjI1NiwgMjYwMCwgMCwgMTQ0MCwgMTQ0MSwgMTQ0NCwgMTUwMCwgMCwKLQkJICAgRFJNX01PREVfRkxBR19OSFNZTkMgfCBEUk1fTU9ERV9GTEFHX1BWU1lOQykgfSwKLQkvKiAyNTYweDE2MDBANjBIeiAqLwotCXsgRFJNX01PREUoIjI1NjB4MTYwMCIsIERSTV9NT0RFX1RZUEVfRFJJVkVSLCAzNDg1MDAsIDI1NjAsIDI3NTIsCi0JCSAgIDMwMzIsIDM1MDQsIDAsIDE2MDAsIDE2MDMsIDE2MDksIDE2NTgsIDAsCi0JCSAgIERSTV9NT0RFX0ZMQUdfTkhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCi0JLyogVGVybWluYXRlICovCi0JeyBEUk1fTU9ERSgiIiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkgfSwKLX07Ci0KLXN0YXRpYyBpbnQgdm13X2xkdV9jb25uZWN0b3JfZmlsbF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCQl1aW50MzJfdCBtYXhfd2lkdGgsIHVpbnQzMl90IG1heF9oZWlnaHQpCi17Ci0Jc3RydWN0IHZtd19sZWdhY3lfZGlzcGxheV91bml0ICpsZHUgPSB2bXdfY29ubmVjdG9yX3RvX2xkdShjb25uZWN0b3IpOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKLQlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IE5VTEw7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgcHJlZm1vZGUgPSB7IERSTV9NT0RFKCJwcmVmZXJyZWQiLAotCQlEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVELAotCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQlEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfUFZTWU5DKQotCX07Ci0JaW50IGk7Ci0KLQkvKiBBZGQgcHJlZmVycmVkIG1vZGUgKi8KLQl7Ci0JCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmcHJlZm1vZGUpOwotCQlpZiAoIW1vZGUpCi0JCQlyZXR1cm4gMDsKLQkJbW9kZS0+aGRpc3BsYXkgPSBsZHUtPnByZWZfd2lkdGg7Ci0JCW1vZGUtPnZkaXNwbGF5ID0gbGR1LT5wcmVmX2hlaWdodDsKLQkJbW9kZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKLQkJaWYgKHZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKGRldl9wcml2LCBtb2RlLT5oZGlzcGxheSAqIDIsCi0JCQkJCSAgICAgICBtb2RlLT52ZGlzcGxheSkpIHsKLQkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKLQotCQkJaWYgKGxkdS0+cHJlZl9tb2RlKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmbGR1LT5wcmVmX21vZGUtPmhlYWQpOwotCQkJCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBsZHUtPnByZWZfbW9kZSk7Ci0JCQl9Ci0KLQkJCWxkdS0+cHJlZl9tb2RlID0gbW9kZTsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IHZtd19sZHVfY29ubmVjdG9yX2J1aWx0aW5baV0udHlwZSAhPSAwOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmJtb2RlOwotCi0JCWJtb2RlID0gJnZtd19sZHVfY29ubmVjdG9yX2J1aWx0aW5baV07Ci0JCWlmIChibW9kZS0+aGRpc3BsYXkgPiBtYXhfd2lkdGggfHwKLQkJICAgIGJtb2RlLT52ZGlzcGxheSA+IG1heF9oZWlnaHQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXZtd19rbXNfdmFsaWRhdGVfbW9kZV92cmFtKGRldl9wcml2LCBibW9kZS0+aGRpc3BsYXkgKiAyLAotCQkJCQkJYm1vZGUtPnZkaXNwbGF5KSkKLQkJCWNvbnRpbnVlOwotCi0JCW1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBibW9kZSk7Ci0JCWlmICghbW9kZSkKLQkJCXJldHVybiAwOwotCQltb2RlLT52cmVmcmVzaCA9IGRybV9tb2RlX3ZyZWZyZXNoKG1vZGUpOwotCi0JCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKLQl9Ci0KLQlkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoY29ubmVjdG9yKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHZtd19sZHVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCQkgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAotCQkJCQkgIHVpbnQ2NF90IHZhbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgdm13X2xkdV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewogCXZtd19sZHVfZGVzdHJveSh2bXdfY29ubmVjdG9yX3RvX2xkdShjb25uZWN0b3IpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIHZtd19sZWdhY3lfY29ubmVjdG9yX2Z1bmNzID0gewotCS5kcG1zID0gdm13X2xkdV9jb25uZWN0b3JfZHBtcywKLQkuc2F2ZSA9IHZtd19sZHVfY29ubmVjdG9yX3NhdmUsCi0JLnJlc3RvcmUgPSB2bXdfbGR1X2Nvbm5lY3Rvcl9yZXN0b3JlLAotCS5kZXRlY3QgPSB2bXdfbGR1X2Nvbm5lY3Rvcl9kZXRlY3QsCi0JLmZpbGxfbW9kZXMgPSB2bXdfbGR1X2Nvbm5lY3Rvcl9maWxsX21vZGVzLAotCS5zZXRfcHJvcGVydHkgPSB2bXdfbGR1X2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHksCisJLmRwbXMgPSB2bXdfZHVfY29ubmVjdG9yX2RwbXMsCisJLnNhdmUgPSB2bXdfZHVfY29ubmVjdG9yX3NhdmUsCisJLnJlc3RvcmUgPSB2bXdfZHVfY29ubmVjdG9yX3Jlc3RvcmUsCisJLmRldGVjdCA9IHZtd19kdV9jb25uZWN0b3JfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gdm13X2R1X2Nvbm5lY3Rvcl9maWxsX21vZGVzLAorCS5zZXRfcHJvcGVydHkgPSB2bXdfZHVfY29ubmVjdG9yX3NldF9wcm9wZXJ0eSwKIAkuZGVzdHJveSA9IHZtd19sZHVfY29ubmVjdG9yX2Rlc3Ryb3ksCiB9OwogCkBAIC01MjMsMjMgKzMzMywyNiBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmxkdS0+YWN0aXZlKTsKIAotCWxkdS0+cHJlZl9hY3RpdmUgPSAodW5pdCA9PSAwKTsKLQlsZHUtPnByZWZfd2lkdGggPSA4MDA7Ci0JbGR1LT5wcmVmX2hlaWdodCA9IDYwMDsKLQlsZHUtPnByZWZfbW9kZSA9IE5VTEw7CisJbGR1LT5iYXNlLnByZWZfYWN0aXZlID0gKHVuaXQgPT0gMCk7CisJbGR1LT5iYXNlLnByZWZfd2lkdGggPSA4MDA7CisJbGR1LT5iYXNlLnByZWZfaGVpZ2h0ID0gNjAwOworCWxkdS0+YmFzZS5wcmVmX21vZGUgPSBOVUxMOworCWxkdS0+YmFzZS5pc19pbXBsaWNpdCA9IHRydWU7CiAKIAlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZ2bXdfbGVnYWN5X2Nvbm5lY3Rvcl9mdW5jcywKLQkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKTsKLQljb25uZWN0b3ItPnN0YXR1cyA9IHZtd19sZHVfY29ubmVjdG9yX2RldGVjdChjb25uZWN0b3IsIHRydWUpOworCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwpOworCWNvbm5lY3Rvci0+c3RhdHVzID0gdm13X2R1X2Nvbm5lY3Rvcl9kZXRlY3QoY29ubmVjdG9yLCB0cnVlKTsKIAogCWRybV9lbmNvZGVyX2luaXQoZGV2LCBlbmNvZGVyLCAmdm13X2xlZ2FjeV9lbmNvZGVyX2Z1bmNzLAotCQkJIERSTV9NT0RFX0VOQ09ERVJfTFZEUyk7CisJCQkgRFJNX01PREVfRU5DT0RFUl9WSVJUVUFMKTsKIAlkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKIAllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9ICgxIDw8IHVuaXQpOwogCWVuY29kZXItPnBvc3NpYmxlX2Nsb25lcyA9IDA7CiAKIAlkcm1fY3J0Y19pbml0KGRldiwgY3J0YywgJnZtd19sZWdhY3lfY3J0Y19mdW5jcyk7CiAKKwlkcm1fbW9kZV9jcnRjX3NldF9nYW1tYV9zaXplKGNydGMsIDI1Nik7CisKIAlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3IsCiAJCQkJICAgICAgZGV2LT5tb2RlX2NvbmZpZy5kaXJ0eV9pbmZvX3Byb3BlcnR5LAogCQkJCSAgICAgIDEpOwpAQCAtNTUwLDggKzM2Myw3IEBACiBpbnQgdm13X2ttc19pbml0X2xlZ2FjeV9kaXNwbGF5X3N5c3RlbShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwotCWludCBpOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCWlmIChkZXZfcHJpdi0+bGR1X3ByaXYpIHsKIAkJRFJNX0lORk8oImxkdSBzeXN0ZW0gYWxyZWFkeSBvblxuIik7CkBAIC01NTksNyArMzcxLDYgQEAKIAl9CiAKIAlkZXZfcHJpdi0+bGR1X3ByaXYgPSBrbWFsbG9jKHNpemVvZigqZGV2X3ByaXYtPmxkdV9wcml2KSwgR0ZQX0tFUk5FTCk7Ci0KIAlpZiAoIWRldl9wcml2LT5sZHVfcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTU2OCwxOCArMzc5LDMxIEBACiAJZGV2X3ByaXYtPmxkdV9wcml2LT5sYXN0X251bV9hY3RpdmUgPSAwOwogCWRldl9wcml2LT5sZHVfcHJpdi0+ZmIgPSBOVUxMOwogCi0JZHJtX21vZGVfY3JlYXRlX2RpcnR5X2luZm9fcHJvcGVydHkoZGV2X3ByaXYtPmRldik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX01VTFRJTU9OKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBWTVdHRlhfTERVX05VTV9EVTsgKytpKQotCQkJdm13X2xkdV9pbml0KGRldl9wcml2LCBpKTsKLQkJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgVk1XR0ZYX0xEVV9OVU1fRFUpOwotCX0gZWxzZSB7Ci0JCS8qIGZvciBvbGQgaGFyZHdhcmUgd2l0aG91dCBtdWx0aW1vbiBvbmx5IGVuYWJsZSBvbmUgZGlzcGxheSAqLwotCQl2bXdfbGR1X2luaXQoZGV2X3ByaXYsIDApOworCS8qIGZvciBvbGQgaGFyZHdhcmUgd2l0aG91dCBtdWx0aW1vbiBvbmx5IGVuYWJsZSBvbmUgZGlzcGxheSAqLworCWlmIChkZXZfcHJpdi0+Y2FwYWJpbGl0aWVzICYgU1ZHQV9DQVBfTVVMVElNT04pCisJCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIFZNV0dGWF9OVU1fRElTUExBWV9VTklUUyk7CisJZWxzZQogCQlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCAxKTsKLQl9CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycl9mcmVlOwogCisJcmV0ID0gZHJtX21vZGVfY3JlYXRlX2RpcnR5X2luZm9fcHJvcGVydHkoZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyX3ZibGFua19jbGVhbnVwOworCisJaWYgKGRldl9wcml2LT5jYXBhYmlsaXRpZXMgJiBTVkdBX0NBUF9NVUxUSU1PTikKKwkJZm9yIChpID0gMDsgaSA8IFZNV0dGWF9OVU1fRElTUExBWV9VTklUUzsgKytpKQorCQkJdm13X2xkdV9pbml0KGRldl9wcml2LCBpKTsKKwllbHNlCisJCXZtd19sZHVfaW5pdChkZXZfcHJpdiwgMCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3ZibGFua19jbGVhbnVwOgorCWRybV92YmxhbmtfY2xlYW51cChkZXYpOworZXJyX2ZyZWU6CisJa2ZyZWUoZGV2X3ByaXYtPmxkdV9wcml2KTsKKwlkZXZfcHJpdi0+bGR1X3ByaXYgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4Nyw1MiArNDExLDE0IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAKLQlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5sZHVfcHJpdikKIAkJcmV0dXJuIC1FTk9TWVM7CiAKKwlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKKwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPmxkdV9wcml2LT5hY3RpdmUpKTsKIAogCWtmcmVlKGRldl9wcml2LT5sZHVfcHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KLQotaW50IHZtd19rbXNfbGR1X3VwZGF0ZV9sYXlvdXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdW5zaWduZWQgbnVtLAotCQkJICAgICAgc3RydWN0IGRybV92bXdfcmVjdCAqcmVjdHMpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0Jc3RydWN0IHZtd19sZWdhY3lfZGlzcGxheV91bml0ICpsZHU7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbjsKLQlpbnQgaTsKLQotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCi0jaWYgMAotCURSTV9JTkZPKCIlczogbmV3IGxheW91dCAiLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IChpbnQpbnVtOyBpKyspCi0JCURSTV9JTkZPKCIoJWksICVpICV1eCV1KSAiLCByZWN0c1tpXS54LCByZWN0c1tpXS55LAotCQkJIHJlY3RzW2ldLncsIHJlY3RzW2ldLmgpOwotCURSTV9JTkZPKCJcbiIpOwotI2Vsc2UKLQkodm9pZClpOwotI2VuZGlmCi0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbiwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJbGR1ID0gdm13X2Nvbm5lY3Rvcl90b19sZHUoY29uKTsKLQkJaWYgKG51bSA+IGxkdS0+YmFzZS51bml0KSB7Ci0JCQlsZHUtPnByZWZfd2lkdGggPSByZWN0c1tsZHUtPmJhc2UudW5pdF0udzsKLQkJCWxkdS0+cHJlZl9oZWlnaHQgPSByZWN0c1tsZHUtPmJhc2UudW5pdF0uaDsKLQkJCWxkdS0+cHJlZl9hY3RpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJbGR1LT5wcmVmX3dpZHRoID0gODAwOwotCQkJbGR1LT5wcmVmX2hlaWdodCA9IDYwMDsKLQkJCWxkdS0+cHJlZl9hY3RpdmUgPSBmYWxzZTsKLQkJfQotCQljb24tPnN0YXR1cyA9IHZtd19sZHVfY29ubmVjdG9yX2RldGVjdChjb24sIHRydWUpOwotCX0KLQotCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X21hcmtlci5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4NzI1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9tYXJrZXIuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKKyAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpbmNsdWRlICJ2bXdnZnhfZHJ2LmgiCisKK3N0cnVjdCB2bXdfbWFya2VyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJdWludDMyX3Qgc2Vxbm87CisJc3RydWN0IHRpbWVzcGVjIHN1Ym1pdHRlZDsKK307CisKK3ZvaWQgdm13X21hcmtlcl9xdWV1ZV9pbml0KHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSkKK3sKKwlJTklUX0xJU1RfSEVBRCgmcXVldWUtPmhlYWQpOworCXF1ZXVlLT5sYWcgPSBuc190b190aW1lc3BlYygwKTsKKwlnZXRyYXdtb25vdG9uaWMoJnF1ZXVlLT5sYWdfdGltZSk7CisJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT5sb2NrKTsKK30KKwordm9pZCB2bXdfbWFya2VyX3F1ZXVlX3Rha2Vkb3duKHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3Qgdm13X21hcmtlciAqbWFya2VyLCAqbmV4dDsKKworCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtYXJrZXIsIG5leHQsICZxdWV1ZS0+aGVhZCwgaGVhZCkgeworCQlrZnJlZShtYXJrZXIpOworCX0KKwlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworfQorCitpbnQgdm13X21hcmtlcl9wdXNoKHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSwKKwkJICAgdWludDMyX3Qgc2Vxbm8pCit7CisJc3RydWN0IHZtd19tYXJrZXIgKm1hcmtlciA9IGttYWxsb2Moc2l6ZW9mKCptYXJrZXIpLCBHRlBfS0VSTkVMKTsKKworCWlmICh1bmxpa2VseSghbWFya2VyKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXJrZXItPnNlcW5vID0gc2Vxbm87CisJZ2V0cmF3bW9ub3RvbmljKCZtYXJrZXItPnN1Ym1pdHRlZCk7CisJc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmbWFya2VyLT5oZWFkLCAmcXVldWUtPmhlYWQpOworCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZtd19tYXJrZXJfcHVsbChzdHJ1Y3Qgdm13X21hcmtlcl9xdWV1ZSAqcXVldWUsCisJCSAgIHVpbnQzMl90IHNpZ25hbGVkX3NlcW5vKQoreworCXN0cnVjdCB2bXdfbWFya2VyICptYXJrZXIsICpuZXh0OworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJYm9vbCB1cGRhdGVkID0gZmFsc2U7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKwlnZXRyYXdtb25vdG9uaWMoJm5vdyk7CisKKwlpZiAobGlzdF9lbXB0eSgmcXVldWUtPmhlYWQpKSB7CisJCXF1ZXVlLT5sYWcgPSBuc190b190aW1lc3BlYygwKTsKKwkJcXVldWUtPmxhZ190aW1lID0gbm93OworCQl1cGRhdGVkID0gdHJ1ZTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtYXJrZXIsIG5leHQsICZxdWV1ZS0+aGVhZCwgaGVhZCkgeworCQlpZiAoc2lnbmFsZWRfc2Vxbm8gLSBtYXJrZXItPnNlcW5vID4gKDEgPDwgMzApKQorCQkJY29udGludWU7CisKKwkJcXVldWUtPmxhZyA9IHRpbWVzcGVjX3N1Yihub3csIG1hcmtlci0+c3VibWl0dGVkKTsKKwkJcXVldWUtPmxhZ190aW1lID0gbm93OworCQl1cGRhdGVkID0gdHJ1ZTsKKwkJbGlzdF9kZWwoJm1hcmtlci0+aGVhZCk7CisJCWtmcmVlKG1hcmtlcik7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKwlyZXR1cm4gKHVwZGF0ZWQpID8gMCA6IC1FQlVTWTsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB2bXdfdGltZXNwZWNfYWRkKHN0cnVjdCB0aW1lc3BlYyB0MSwKKwkJCQkJc3RydWN0IHRpbWVzcGVjIHQyKQoreworCXQxLnR2X3NlYyArPSB0Mi50dl9zZWM7CisJdDEudHZfbnNlYyArPSB0Mi50dl9uc2VjOworCWlmICh0MS50dl9uc2VjID49IDEwMDAwMDAwMDBMKSB7CisJCXQxLnR2X3NlYyArPSAxOworCQl0MS50dl9uc2VjIC09IDEwMDAwMDAwMDBMOworCX0KKworCXJldHVybiB0MTsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyB2bXdfZmlmb19sYWcoc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKwlnZXRyYXdtb25vdG9uaWMoJm5vdyk7CisJcXVldWUtPmxhZyA9IHZtd190aW1lc3BlY19hZGQocXVldWUtPmxhZywKKwkJCQkgICAgICB0aW1lc3BlY19zdWIobm93LCBxdWV1ZS0+bGFnX3RpbWUpKTsKKwlxdWV1ZS0+bGFnX3RpbWUgPSBub3c7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gcXVldWUtPmxhZzsKK30KKworCitzdGF0aWMgYm9vbCB2bXdfbGFnX2x0KHN0cnVjdCB2bXdfbWFya2VyX3F1ZXVlICpxdWV1ZSwKKwkJICAgICAgIHVpbnQzMl90IHVzKQoreworCXN0cnVjdCB0aW1lc3BlYyBsYWcsIGNvbmQ7CisKKwljb25kID0gbnNfdG9fdGltZXNwZWMoKHM2NCkgdXMgKiAxMDAwKTsKKwlsYWcgPSB2bXdfZmlmb19sYWcocXVldWUpOworCXJldHVybiAodGltZXNwZWNfY29tcGFyZSgmbGFnLCAmY29uZCkgPCAxKTsKK30KKworaW50IHZtd193YWl0X2xhZyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkgc3RydWN0IHZtd19tYXJrZXJfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB1cykKK3sKKwlzdHJ1Y3Qgdm13X21hcmtlciAqbWFya2VyOworCXVpbnQzMl90IHNlcW5vOworCWludCByZXQ7CisKKwl3aGlsZSAoIXZtd19sYWdfbHQocXVldWUsIHVzKSkgeworCQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5oZWFkKSkKKwkJCXNlcW5vID0gYXRvbWljX3JlYWQoJmRldl9wcml2LT5tYXJrZXJfc2VxKTsKKwkJZWxzZSB7CisJCQltYXJrZXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxdWV1ZS0+aGVhZCwKKwkJCQkJCSBzdHJ1Y3Qgdm13X21hcmtlciwgaGVhZCk7CisJCQlzZXFubyA9IG1hcmtlci0+c2Vxbm87CisJCX0KKwkJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworCQlyZXQgPSB2bXdfd2FpdF9zZXFubyhkZXZfcHJpdiwgZmFsc2UsIHNlcW5vLCB0cnVlLAorCQkJCQkzKkhaKTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKworCQkodm9pZCkgdm13X21hcmtlcl9wdWxsKHF1ZXVlLCBzZXFubyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfb3ZlcmxheS5jCmluZGV4IDA3Y2UwMmQuLjE0Mzk5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9vdmVybGF5LmMKQEAgLTg3LDQ4ICs4Nyw2IEBACiB9CiAKIC8qKgotICogUGluIG9yIHVucGluIGEgYnVmZmVyIGluIHZyYW0uCi0gKgotICogQGRldl9wcml2OiAgRHJpdmVyIHByaXZhdGUuCi0gKiBAYnVmOiAgRE1BIGJ1ZmZlciB0byBwaW4gb3IgdW5waW4uCi0gKiBAcGluOiAgUGluIGJ1ZmZlciBpbiB2cmFtIGlmIHRydWUuCi0gKiBAaW50ZXJydXB0aWJsZTogIFVzZSBpbnRlcnJ1cHRpYmxlIHdhaXQuCi0gKgotICogVGFrZXMgdGhlIGN1cnJlbnQgbWFzdGVycyB0dG0gbG9jayBpbiByZWFkLgotICoKLSAqIFJldHVybnMKLSAqIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KLSAqLwotc3RhdGljIGludCB2bXdfZG1hYnVmX3Bpbl9pbl92cmFtKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmJ1ZiwKLQkJCQkgIGJvb2wgcGluLCBib29sIGludGVycnVwdGlibGUpCi17Ci0Jc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9ICZidWYtPmJhc2U7Ci0Jc3RydWN0IHR0bV9wbGFjZW1lbnQgKm92ZXJsYXlfcGxhY2VtZW50ID0gJnZtd192cmFtX3BsYWNlbWVudDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdHRtX3JlYWRfbG9jaygmZGV2X3ByaXYtPmFjdGl2ZV9tYXN0ZXItPmxvY2ssIGludGVycnVwdGlibGUpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgaW50ZXJydXB0aWJsZSwgZmFsc2UsIGZhbHNlLCAwKTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIGVycjsKLQotCWlmIChwaW4pCi0JCW92ZXJsYXlfcGxhY2VtZW50ID0gJnZtd192cmFtX25lX3BsYWNlbWVudDsKLQotCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgb3ZlcmxheV9wbGFjZW1lbnQsIGludGVycnVwdGlibGUsIGZhbHNlLCBmYWxzZSk7Ci0KLQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKLQotZXJyOgotCXR0bV9yZWFkX3VubG9jaygmZGV2X3ByaXYtPmFjdGl2ZV9tYXN0ZXItPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCiAgKiBTZW5kIHB1dCBjb21tYW5kIHRvIGh3LgogICoKICAqIFJldHVybnMKQEAgLTEzOSw2OCArOTcsODAgQEAKIAkJCQlzdHJ1Y3QgZHJtX3Ztd19jb250cm9sX3N0cmVhbV9hcmcgKmFyZywKIAkJCQlib29sIGludGVycnVwdGlibGUpCiB7CisJc3RydWN0IHZtd19lc2NhcGVfdmlkZW9fZmx1c2ggKmZsdXNoOworCXNpemVfdCBmaWZvX3NpemU7CisJYm9vbCBoYXZlX3NvID0gZGV2X3ByaXYtPnNvdV9wcml2ID8gdHJ1ZSA6IGZhbHNlOworCWludCBpLCBudW1faXRlbXM7CisJU1ZHQUd1ZXN0UHRyIHB0cjsKKwogCXN0cnVjdCB7CiAJCXN0cnVjdCB2bXdfZXNjYXBlX2hlYWRlciBlc2NhcGU7CiAJCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgewotCQkJCXVpbnQzMl90IGNtZFR5cGU7Ci0JCQkJdWludDMyX3Qgc3RyZWFtSWQ7Ci0JCQl9IGhlYWRlcjsKLQkJCXN0cnVjdCB7Ci0JCQkJdWludDMyX3QgcmVnaXN0ZXJJZDsKLQkJCQl1aW50MzJfdCB2YWx1ZTsKLQkJCX0gaXRlbXNbU1ZHQV9WSURFT19QSVRDSF8zICsgMV07Ci0JCX0gYm9keTsKLQkJc3RydWN0IHZtd19lc2NhcGVfdmlkZW9fZmx1c2ggZmx1c2g7CisJCQl1aW50MzJfdCBjbWRUeXBlOworCQkJdWludDMyX3Qgc3RyZWFtSWQ7CisJCX0gaGVhZGVyOwogCX0gKmNtZHM7Ci0JdWludDMyX3Qgb2Zmc2V0OwotCWludCBpLCByZXQ7CisJc3RydWN0IHsKKwkJdWludDMyX3QgcmVnaXN0ZXJJZDsKKwkJdWludDMyX3QgdmFsdWU7CisJfSAqaXRlbXM7CiAKLQlmb3IgKDs7KSB7Ci0JCWNtZHMgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZHMpKTsKLQkJaWYgKGNtZHMpCi0JCQlicmVhazsKKwkvKiBkZWZpbmVzIGFyZSBhIGluZGV4IG5lZWRzICsgMSAqLworCWlmIChoYXZlX3NvKQorCQludW1faXRlbXMgPSBTVkdBX1ZJREVPX0RTVF9TQ1JFRU5fSUQgKyAxOworCWVsc2UKKwkJbnVtX2l0ZW1zID0gU1ZHQV9WSURFT19QSVRDSF8zICsgMTsKIAotCQlyZXQgPSB2bXdfZmFsbGJhY2tfd2FpdChkZXZfcHJpdiwgZmFsc2UsIHRydWUsIDAsCi0JCQkJCWludGVycnVwdGlibGUsIDMqSFopOwotCQlpZiAoaW50ZXJydXB0aWJsZSAmJiByZXQgPT0gLUVSRVNUQVJUU1lTKQotCQkJcmV0dXJuIHJldDsKLQkJZWxzZQotCQkJQlVHX09OKHJldCAhPSAwKTsKKwlmaWZvX3NpemUgPSBzaXplb2YoKmNtZHMpICsgc2l6ZW9mKCpmbHVzaCkgKyBzaXplb2YoKml0ZW1zKSAqIG51bV9pdGVtczsKKworCWNtZHMgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBmaWZvX3NpemUpOworCS8qIGhhcmR3YXJlIGhhcyBodW5nLCBjYW4ndCBkbyBhbnl0aGluZyBoZXJlICovCisJaWYgKCFjbWRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0ZW1zID0gKHR5cGVvZihpdGVtcykpJmNtZHNbMV07CisJZmx1c2ggPSAoc3RydWN0IHZtd19lc2NhcGVfdmlkZW9fZmx1c2ggKikmaXRlbXNbbnVtX2l0ZW1zXTsKKworCS8qIHRoZSBzaXplIGlzIGhlYWRlciArIG51bWJlciBvZiBpdGVtcyAqLworCWZpbGxfZXNjYXBlKCZjbWRzLT5lc2NhcGUsIHNpemVvZigqaXRlbXMpICogKG51bV9pdGVtcyArIDEpKTsKKworCWNtZHMtPmhlYWRlci5jbWRUeXBlID0gU1ZHQV9FU0NBUEVfVk1XQVJFX1ZJREVPX1NFVF9SRUdTOworCWNtZHMtPmhlYWRlci5zdHJlYW1JZCA9IGFyZy0+c3RyZWFtX2lkOworCisJLyogdGhlIElEcyBhcmUgbmVhdGx5IG51bWJlcmVkICovCisJZm9yIChpID0gMDsgaSA8IG51bV9pdGVtczsgaSsrKQorCQlpdGVtc1tpXS5yZWdpc3RlcklkID0gaTsKKworCXZtd19ib19nZXRfZ3Vlc3RfcHRyKCZidWYtPmJhc2UsICZwdHIpOworCXB0ci5vZmZzZXQgKz0gYXJnLT5vZmZzZXQ7CisKKwlpdGVtc1tTVkdBX1ZJREVPX0VOQUJMRURdLnZhbHVlICAgICA9IHRydWU7CisJaXRlbXNbU1ZHQV9WSURFT19GTEFHU10udmFsdWUgICAgICAgPSBhcmctPmZsYWdzOworCWl0ZW1zW1NWR0FfVklERU9fREFUQV9PRkZTRVRdLnZhbHVlID0gcHRyLm9mZnNldDsKKwlpdGVtc1tTVkdBX1ZJREVPX0ZPUk1BVF0udmFsdWUgICAgICA9IGFyZy0+Zm9ybWF0OworCWl0ZW1zW1NWR0FfVklERU9fQ09MT1JLRVldLnZhbHVlICAgID0gYXJnLT5jb2xvcl9rZXk7CisJaXRlbXNbU1ZHQV9WSURFT19TSVpFXS52YWx1ZSAgICAgICAgPSBhcmctPnNpemU7CisJaXRlbXNbU1ZHQV9WSURFT19XSURUSF0udmFsdWUgICAgICAgPSBhcmctPndpZHRoOworCWl0ZW1zW1NWR0FfVklERU9fSEVJR0hUXS52YWx1ZSAgICAgID0gYXJnLT5oZWlnaHQ7CisJaXRlbXNbU1ZHQV9WSURFT19TUkNfWF0udmFsdWUgICAgICAgPSBhcmctPnNyYy54OworCWl0ZW1zW1NWR0FfVklERU9fU1JDX1ldLnZhbHVlICAgICAgID0gYXJnLT5zcmMueTsKKwlpdGVtc1tTVkdBX1ZJREVPX1NSQ19XSURUSF0udmFsdWUgICA9IGFyZy0+c3JjLnc7CisJaXRlbXNbU1ZHQV9WSURFT19TUkNfSEVJR0hUXS52YWx1ZSAgPSBhcmctPnNyYy5oOworCWl0ZW1zW1NWR0FfVklERU9fRFNUX1hdLnZhbHVlICAgICAgID0gYXJnLT5kc3QueDsKKwlpdGVtc1tTVkdBX1ZJREVPX0RTVF9ZXS52YWx1ZSAgICAgICA9IGFyZy0+ZHN0Lnk7CisJaXRlbXNbU1ZHQV9WSURFT19EU1RfV0lEVEhdLnZhbHVlICAgPSBhcmctPmRzdC53OworCWl0ZW1zW1NWR0FfVklERU9fRFNUX0hFSUdIVF0udmFsdWUgID0gYXJnLT5kc3QuaDsKKwlpdGVtc1tTVkdBX1ZJREVPX1BJVENIXzFdLnZhbHVlICAgICA9IGFyZy0+cGl0Y2hbMF07CisJaXRlbXNbU1ZHQV9WSURFT19QSVRDSF8yXS52YWx1ZSAgICAgPSBhcmctPnBpdGNoWzFdOworCWl0ZW1zW1NWR0FfVklERU9fUElUQ0hfM10udmFsdWUgICAgID0gYXJnLT5waXRjaFsyXTsKKwlpZiAoaGF2ZV9zbykgeworCQlpdGVtc1tTVkdBX1ZJREVPX0RBVEFfR01SSURdLnZhbHVlICAgID0gcHRyLmdtcklkOworCQlpdGVtc1tTVkdBX1ZJREVPX0RTVF9TQ1JFRU5fSURdLnZhbHVlID0gU1ZHQV9JRF9JTlZBTElEOwogCX0KIAotCWZpbGxfZXNjYXBlKCZjbWRzLT5lc2NhcGUsIHNpemVvZihjbWRzLT5ib2R5KSk7Ci0JY21kcy0+Ym9keS5oZWFkZXIuY21kVHlwZSA9IFNWR0FfRVNDQVBFX1ZNV0FSRV9WSURFT19TRVRfUkVHUzsKLQljbWRzLT5ib2R5LmhlYWRlci5zdHJlYW1JZCA9IGFyZy0+c3RyZWFtX2lkOworCWZpbGxfZmx1c2goZmx1c2gsIGFyZy0+c3RyZWFtX2lkKTsKIAotCWZvciAoaSA9IDA7IGkgPD0gU1ZHQV9WSURFT19QSVRDSF8zOyBpKyspCi0JCWNtZHMtPmJvZHkuaXRlbXNbaV0ucmVnaXN0ZXJJZCA9IGk7Ci0KLQlvZmZzZXQgPSBidWYtPmJhc2Uub2Zmc2V0ICsgYXJnLT5vZmZzZXQ7Ci0KLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRU5BQkxFRF0udmFsdWUgICAgID0gdHJ1ZTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fRkxBR1NdLnZhbHVlICAgICAgID0gYXJnLT5mbGFnczsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fREFUQV9PRkZTRVRdLnZhbHVlID0gb2Zmc2V0OwotCWNtZHMtPmJvZHkuaXRlbXNbU1ZHQV9WSURFT19GT1JNQVRdLnZhbHVlICAgICAgPSBhcmctPmZvcm1hdDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fQ09MT1JLRVldLnZhbHVlICAgID0gYXJnLT5jb2xvcl9rZXk7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1NJWkVdLnZhbHVlICAgICAgICA9IGFyZy0+c2l6ZTsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fV0lEVEhdLnZhbHVlICAgICAgID0gYXJnLT53aWR0aDsKLQljbWRzLT5ib2R5Lml0ZW1zW1NWR0FfVklERU9fSEVJR0hUXS52YWx1ZSAgICAgID0gYXJnLT5oZWlnaHQ7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1NSQ19YXS52YWx1ZSAgICAgICA9IGFyZy0+c3JjLng7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1NSQ19ZXS52YWx1ZSAgICAgICA9IGFyZy0+c3JjLnk7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1NSQ19XSURUSF0udmFsdWUgICA9IGFyZy0+c3JjLnc7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1NSQ19IRUlHSFRdLnZhbHVlICA9IGFyZy0+c3JjLmg7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX0RTVF9YXS52YWx1ZSAgICAgICA9IGFyZy0+ZHN0Lng7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX0RTVF9ZXS52YWx1ZSAgICAgICA9IGFyZy0+ZHN0Lnk7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX0RTVF9XSURUSF0udmFsdWUgICA9IGFyZy0+ZHN0Lnc7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX0RTVF9IRUlHSFRdLnZhbHVlICA9IGFyZy0+ZHN0Lmg7Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1BJVENIXzFdLnZhbHVlICAgICA9IGFyZy0+cGl0Y2hbMF07Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1BJVENIXzJdLnZhbHVlICAgICA9IGFyZy0+cGl0Y2hbMV07Ci0JY21kcy0+Ym9keS5pdGVtc1tTVkdBX1ZJREVPX1BJVENIXzNdLnZhbHVlICAgICA9IGFyZy0+cGl0Y2hbMl07Ci0KLQlmaWxsX2ZsdXNoKCZjbWRzLT5mbHVzaCwgYXJnLT5zdHJlYW1faWQpOwotCi0Jdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZHMpKTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0OCw2ICsyMTgsMjUgQEAKIH0KIAogLyoqCisgKiBNb3ZlIGEgYnVmZmVyIHRvIHZyYW0gb3IgZ21yIGlmIEBwaW4gaXMgc2V0LCBlbHNlIHVucGluIHRoZSBidWZmZXIuCisgKgorICogV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHNjcmVlbiBvYmplY3RzIGJ1ZmZlcnMgY291bGQgbm93IGJlCisgKiB1c2VkIHdpdGggR01ScyBpbnN0ZWFkIG9mIGJlaW5nIGxvY2tlZCB0byB2cmFtLgorICovCitzdGF0aWMgaW50IHZtd19vdmVybGF5X21vdmVfYnVmZmVyKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJICAgc3RydWN0IHZtd19kbWFfYnVmZmVyICpidWYsCisJCQkJICAgYm9vbCBwaW4sIGJvb2wgaW50ZXIpCit7CisJaWYgKCFwaW4pCisJCXJldHVybiB2bXdfZG1hYnVmX3VucGluKGRldl9wcml2LCBidWYsIGludGVyKTsKKworCWlmICghZGV2X3ByaXYtPnNvdV9wcml2KQorCQlyZXR1cm4gdm13X2RtYWJ1Zl90b192cmFtKGRldl9wcml2LCBidWYsIHRydWUsIGludGVyKTsKKworCXJldHVybiB2bXdfZG1hYnVmX3RvX3ZyYW1fb3JfZ21yKGRldl9wcml2LCBidWYsIHRydWUsIGludGVyKTsKK30KKworLyoqCiAgKiBTdG9wIG9yIHBhdXNlIGEgc3RyZWFtLgogICoKICAqIElmIHRoZSBzdHJlYW0gaXMgcGF1c2VkIHRoZSBubyBldmljdCBmbGFnIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyCkBAIC0yNzksOCArMjY4LDggQEAKIAkJCXJldHVybiByZXQ7CiAKIAkJLyogV2UganVzdCByZW1vdmUgdGhlIE5PX0VWSUNUIGZsYWcgc28gbm8gLUVOT01FTSAqLwotCQlyZXQgPSB2bXdfZG1hYnVmX3Bpbl9pbl92cmFtKGRldl9wcml2LCBzdHJlYW0tPmJ1ZiwgZmFsc2UsCi0JCQkJCSAgICAgaW50ZXJydXB0aWJsZSk7CisJCXJldCA9IHZtd19vdmVybGF5X21vdmVfYnVmZmVyKGRldl9wcml2LCBzdHJlYW0tPmJ1ZiwgZmFsc2UsCisJCQkJCSAgICAgIGludGVycnVwdGlibGUpOwogCQlpZiAoaW50ZXJydXB0aWJsZSAmJiByZXQgPT0gLUVSRVNUQVJUU1lTKQogCQkJcmV0dXJuIHJldDsKIAkJZWxzZQpAQCAtMzQyLDcgKzMzMSw3IEBACiAJLyogV2UgZG9uJ3Qgc3RhcnQgdGhlIG9sZCBzdHJlYW0gaWYgd2UgYXJlIGludGVycnVwdGVkLgogCSAqIE1pZ2h0IHJldHVybiAtRU5PTUVNIGlmIGl0IGNhbid0IGZpdCB0aGUgYnVmZmVyIGluIHZyYW0uCiAJICovCi0JcmV0ID0gdm13X2RtYWJ1Zl9waW5faW5fdnJhbShkZXZfcHJpdiwgYnVmLCB0cnVlLCBpbnRlcnJ1cHRpYmxlKTsKKwlyZXQgPSB2bXdfb3ZlcmxheV9tb3ZlX2J1ZmZlcihkZXZfcHJpdiwgYnVmLCB0cnVlLCBpbnRlcnJ1cHRpYmxlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNTEsNyArMzQwLDggQEAKIAkJLyogVGhpcyBvbmUgbmVlZHMgdG8gaGFwcGVuIG5vIG1hdHRlciB3aGF0LiBXZSBvbmx5IHJlbW92ZQogCQkgKiB0aGUgTk9fRVZJQ1QgZmxhZyBzbyB0aGlzIGlzIHNhZmUgZnJvbSAtRU5PTUVNLgogCQkgKi8KLQkJQlVHX09OKHZtd19kbWFidWZfcGluX2luX3ZyYW0oZGV2X3ByaXYsIGJ1ZiwgZmFsc2UsIGZhbHNlKSAhPSAwKTsKKwkJQlVHX09OKHZtd19vdmVybGF5X21vdmVfYnVmZmVyKGRldl9wcml2LCBidWYsIGZhbHNlLCBmYWxzZSkKKwkJICAgICAgICE9IDApOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKaW5kZXggYmZlMWJjYy4uODZjNWU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCkBAIC0zMSwxMCArMzEsNiBAQAogI2luY2x1ZGUgInR0bS90dG1fcGxhY2VtZW50LmgiCiAjaW5jbHVkZSAiZHJtUC5oIgogCi0jZGVmaW5lIFZNV19SRVNfQ09OVEVYVCB0dG1fZHJpdmVyX3R5cGUwCi0jZGVmaW5lIFZNV19SRVNfU1VSRkFDRSB0dG1fZHJpdmVyX3R5cGUxCi0jZGVmaW5lIFZNV19SRVNfU1RSRUFNIHR0bV9kcml2ZXJfdHlwZTIKLQogc3RydWN0IHZtd191c2VyX2NvbnRleHQgewogCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgYmFzZTsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlIHJlczsKQEAgLTQzLDYgKzM5LDcgQEAKIHN0cnVjdCB2bXdfdXNlcl9zdXJmYWNlIHsKIAlzdHJ1Y3QgdHRtX2Jhc2Vfb2JqZWN0IGJhc2U7CiAJc3RydWN0IHZtd19zdXJmYWNlIHNyZjsKKwl1aW50MzJfdCBzaXplOwogfTsKIAogc3RydWN0IHZtd191c2VyX2RtYV9idWZmZXIgewpAQCAtNjUsNiArNjIsMTcgQEAKIAlzdHJ1Y3Qgdm13X3N0cmVhbSBzdHJlYW07CiB9OwogCitzdHJ1Y3Qgdm13X3N1cmZhY2Vfb2Zmc2V0IHsKKwl1aW50MzJfdCBmYWNlOworCXVpbnQzMl90IG1pcDsKKwl1aW50MzJfdCBib19vZmZzZXQ7Cit9OworCisKK3N0YXRpYyB1aW50NjRfdCB2bXdfdXNlcl9jb250ZXh0X3NpemU7CitzdGF0aWMgdWludDY0X3Qgdm13X3VzZXJfc3VyZmFjZV9zaXplOworc3RhdGljIHVpbnQ2NF90IHZtd191c2VyX3N0cmVhbV9zaXplOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqCiB2bXdfZG1hX2J1ZmZlcihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewpAQCAtODQsMTMgKzkyLDM2IEBACiAJcmV0dXJuIHJlczsKIH0KIAorCisvKioKKyAqIHZtd19yZXNvdXJjZV9yZWxlYXNlX2lkIC0gcmVsZWFzZSBhIHJlc291cmNlIGlkIHRvIHRoZSBpZCBtYW5hZ2VyLgorICoKKyAqIEByZXM6IFBvaW50ZXIgdG8gdGhlIHJlc291cmNlLgorICoKKyAqIFJlbGVhc2UgdGhlIHJlc291cmNlIGlkIHRvIHRoZSByZXNvdXJjZSBpZCBtYW5hZ2VyIGFuZCBzZXQgaXQgdG8gLTEKKyAqLworc3RhdGljIHZvaWQgdm13X3Jlc291cmNlX3JlbGVhc2VfaWQoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYgPSByZXMtPmRldl9wcml2OworCisJd3JpdGVfbG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCWlmIChyZXMtPmlkICE9IC0xKQorCQlpZHJfcmVtb3ZlKHJlcy0+aWRyLCByZXMtPmlkKTsKKwlyZXMtPmlkID0gLTE7CisJd3JpdGVfdW5sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIHZtd19yZXNvdXJjZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9CiAJICAgIGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgdm13X3Jlc291cmNlLCBrcmVmKTsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKKwlpbnQgaWQgPSByZXMtPmlkOworCXN0cnVjdCBpZHIgKmlkciA9IHJlcy0+aWRyOwogCi0JaWRyX3JlbW92ZShyZXMtPmlkciwgcmVzLT5pZCk7CisJcmVzLT5hdmFpbCA9IGZhbHNlOworCWlmIChyZXMtPnJlbW92ZV9mcm9tX2xpc3RzICE9IE5VTEwpCisJCXJlcy0+cmVtb3ZlX2Zyb21fbGlzdHMocmVzKTsKIAl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKIAogCWlmIChsaWtlbHkocmVzLT5od19kZXN0cm95ICE9IE5VTEwpKQpAQCAtMTAyLDYgKzEzMyw5IEBACiAJCWtmcmVlKHJlcyk7CiAKIAl3cml0ZV9sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CisKKwlpZiAoaWQgIT0gLTEpCisJCWlkcl9yZW1vdmUoaWRyLCBpZCk7CiB9CiAKIHZvaWQgdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKHN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3JlcykKQEAgLTExNSwyOCArMTQ5LDI5IEBACiAJd3JpdGVfdW5sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgdm13X3Jlc291cmNlX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKLQkJCSAgICAgc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzLAotCQkJICAgICBzdHJ1Y3QgaWRyICppZHIsCi0JCQkgICAgIGVudW0gdHRtX29iamVjdF90eXBlIG9ial90eXBlLAotCQkJICAgICB2b2lkICgqcmVzX2ZyZWUpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpKQorCisvKioKKyAqIHZtd19yZXNvdXJjZV9hbGxvY19pZCAtIHJlbGVhc2UgYSByZXNvdXJjZSBpZCB0byB0aGUgaWQgbWFuYWdlci4KKyAqCisgKiBAZGV2X3ByaXY6IFBvaW50ZXIgdG8gdGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4KKyAqIEByZXM6IFBvaW50ZXIgdG8gdGhlIHJlc291cmNlLgorICoKKyAqIEFsbG9jYXRlIHRoZSBsb3dlc3QgZnJlZSByZXNvdXJjZSBmcm9tIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBhbmQgc2V0CisgKiBAcmVzLT5pZCB0byB0aGF0IGlkLiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLUVOT01FTSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHZtd19yZXNvdXJjZV9hbGxvY19pZChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSBzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCiB7CiAJaW50IHJldDsKIAotCWtyZWZfaW5pdCgmcmVzLT5rcmVmKTsKLQlyZXMtPmh3X2Rlc3Ryb3kgPSBOVUxMOwotCXJlcy0+cmVzX2ZyZWUgPSByZXNfZnJlZTsKLQlyZXMtPnJlc190eXBlID0gb2JqX3R5cGU7Ci0JcmVzLT5pZHIgPSBpZHI7Ci0JcmVzLT5hdmFpbCA9IGZhbHNlOwotCXJlcy0+ZGV2X3ByaXYgPSBkZXZfcHJpdjsKKwlCVUdfT04ocmVzLT5pZCAhPSAtMSk7CiAKIAlkbyB7Ci0JCWlmICh1bmxpa2VseShpZHJfcHJlX2dldChpZHIsIEdGUF9LRVJORUwpID09IDApKQorCQlpZiAodW5saWtlbHkoaWRyX3ByZV9nZXQocmVzLT5pZHIsIEdGUF9LRVJORUwpID09IDApKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJd3JpdGVfbG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOwotCQlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZShpZHIsIHJlcywgMSwgJnJlcy0+aWQpOworCQlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZShyZXMtPmlkciwgcmVzLCAxLCAmcmVzLT5pZCk7CiAJCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOwogCiAJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4pOwpAQCAtMTQ0LDYgKzE3OSwzMyBAQAogCXJldHVybiByZXQ7CiB9CiAKKworc3RhdGljIGludCB2bXdfcmVzb3VyY2VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICBzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMsCisJCQkgICAgIHN0cnVjdCBpZHIgKmlkciwKKwkJCSAgICAgZW51bSB0dG1fb2JqZWN0X3R5cGUgb2JqX3R5cGUsCisJCQkgICAgIGJvb2wgZGVsYXlfaWQsCisJCQkgICAgIHZvaWQgKCpyZXNfZnJlZSkgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyksCisJCQkgICAgIHZvaWQgKCpyZW1vdmVfZnJvbV9saXN0cykKKwkJCSAgICAgKHN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcykpCit7CisJa3JlZl9pbml0KCZyZXMtPmtyZWYpOworCXJlcy0+aHdfZGVzdHJveSA9IE5VTEw7CisJcmVzLT5yZXNfZnJlZSA9IHJlc19mcmVlOworCXJlcy0+cmVtb3ZlX2Zyb21fbGlzdHMgPSByZW1vdmVfZnJvbV9saXN0czsKKwlyZXMtPnJlc190eXBlID0gb2JqX3R5cGU7CisJcmVzLT5pZHIgPSBpZHI7CisJcmVzLT5hdmFpbCA9IGZhbHNlOworCXJlcy0+ZGV2X3ByaXYgPSBkZXZfcHJpdjsKKwlJTklUX0xJU1RfSEVBRCgmcmVzLT5xdWVyeV9oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmcmVzLT52YWxpZGF0ZV9oZWFkKTsKKwlyZXMtPmlkID0gLTE7CisJaWYgKGRlbGF5X2lkKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiB2bXdfcmVzb3VyY2VfYWxsb2NfaWQoZGV2X3ByaXYsIHJlcyk7Cit9CisKIC8qKgogICogdm13X3Jlc291cmNlX2FjdGl2YXRlCiAgKgpAQCAtMTk4LDggKzI2MCwxMiBAQAogCXN0cnVjdCB7CiAJCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CiAJCVNWR0EzZENtZERlc3Ryb3lDb250ZXh0IGJvZHk7Ci0JfSAqY21kID0gdm13X2ZpZm9fcmVzZXJ2ZShkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKKwl9ICpjbWQ7CiAKKworCXZtd19leGVjYnVmX3JlbGVhc2VfcGlubmVkX2JvKGRldl9wcml2LCB0cnVlLCByZXMtPmlkKTsKKworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CiAJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgewogCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc3VyZmFjZSAiCiAJCQkgICJkZXN0cnVjdGlvbi5cbiIpOwpAQCAtMjExLDcgKzI3Nyw3IEBACiAJY21kLT5ib2R5LmNpZCA9IGNwdV90b19sZTMyKHJlcy0+aWQpOwogCiAJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwotCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYpOworCXZtd18zZF9yZXNvdXJjZV9kZWMoZGV2X3ByaXYsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCB2bXdfY29udGV4dF9pbml0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC0yMjYsMTQgKzI5MiwxNyBAQAogCX0gKmNtZDsKIAogCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsICZkZXZfcHJpdi0+Y29udGV4dF9pZHIsCi0JCQkJVk1XX1JFU19DT05URVhULCByZXNfZnJlZSk7CisJCQkJVk1XX1JFU19DT05URVhULCBmYWxzZSwgcmVzX2ZyZWUsIE5VTEwpOwogCiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQlpZiAocmVzX2ZyZWUgPT0gTlVMTCkKLQkJCWtmcmVlKHJlcyk7Ci0JCWVsc2UKLQkJCXJlc19mcmVlKHJlcyk7Ci0JCXJldHVybiByZXQ7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGEgcmVzb3VyY2UgaWQuXG4iKTsKKwkJZ290byBvdXRfZWFybHk7CisJfQorCisJaWYgKHVubGlrZWx5KHJlcy0+aWQgPj0gU1ZHQTNEX01BWF9DT05URVhUX0lEUykpIHsKKwkJRFJNX0VSUk9SKCJPdXQgb2YgaHcgY29udGV4dCBpZHMuXG4iKTsKKwkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzaXplb2YoKmNtZCkpOwpAQCAtMjQ4LDkgKzMxNywxNiBAQAogCWNtZC0+Ym9keS5jaWQgPSBjcHVfdG9fbGUzMihyZXMtPmlkKTsKIAogCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKLQkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdik7CisJKHZvaWQpIHZtd18zZF9yZXNvdXJjZV9pbmMoZGV2X3ByaXYsIGZhbHNlKTsKIAl2bXdfcmVzb3VyY2VfYWN0aXZhdGUocmVzLCB2bXdfaHdfY29udGV4dF9kZXN0cm95KTsKIAlyZXR1cm4gMDsKKworb3V0X2Vhcmx5OgorCWlmIChyZXNfZnJlZSA9PSBOVUxMKQorCQlrZnJlZShyZXMpOworCWVsc2UKKwkJcmVzX2ZyZWUocmVzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdHJ1Y3Qgdm13X3Jlc291cmNlICp2bXdfY29udGV4dF9hbGxvYyhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2KQpAQCAtMjczLDggKzM0OSwxMSBAQAogewogCXN0cnVjdCB2bXdfdXNlcl9jb250ZXh0ICpjdHggPQogCSAgICBjb250YWluZXJfb2YocmVzLCBzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCwgcmVzKTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKIAogCWtmcmVlKGN0eCk7CisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJICAgIHZtd191c2VyX2NvbnRleHRfc2l6ZSk7CiB9CiAKIC8qKgpAQCAtMzI4LDIzICs0MDcsNTYgQEAKIAkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7Ci0Jc3RydWN0IHZtd191c2VyX2NvbnRleHQgKmN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgdm13X3VzZXJfY29udGV4dCAqY3R4OwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICp0bXA7CiAJc3RydWN0IGRybV92bXdfY29udGV4dF9hcmcgKmFyZyA9IChzdHJ1Y3QgZHJtX3Ztd19jb250ZXh0X2FyZyAqKWRhdGE7CiAJc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUgPSB2bXdfZnByaXYoZmlsZV9wcml2KS0+dGZpbGU7CisJc3RydWN0IHZtd19tYXN0ZXIgKnZtYXN0ZXIgPSB2bXdfbWFzdGVyKGZpbGVfcHJpdi0+bWFzdGVyKTsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KGN0eCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIEFwcHJveGltYXRlIGlkciBtZW1vcnkgdXNhZ2Ugd2l0aCAxMjggYnl0ZXMuIEl0IHdpbGwgYmUgbGltaXRlZAorCSAqIGJ5IG1heGltdW0gbnVtYmVyX29mIGNvbnRleHRzIGFueXdheS4KKwkgKi8KKworCWlmICh1bmxpa2VseSh2bXdfdXNlcl9jb250ZXh0X3NpemUgPT0gMCkpCisJCXZtd191c2VyX2NvbnRleHRfc2l6ZSA9IHR0bV9yb3VuZF9wb3Qoc2l6ZW9mKCpjdHgpKSArIDEyODsKKworCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0dG1fbWVtX2dsb2JhbF9hbGxvYyh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJCSAgIHZtd191c2VyX2NvbnRleHRfc2l6ZSwKKwkJCQkgICBmYWxzZSwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCURSTV9FUlJPUigiT3V0IG9mIGdyYXBoaWNzIG1lbW9yeSBmb3IgY29udGV4dCIKKwkJCQkgICIgY3JlYXRpb24uXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoY3R4ID09IE5VTEwpKSB7CisJCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGRldl9wcml2KSwKKwkJCQkgICAgdm13X3VzZXJfY29udGV4dF9zaXplKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KIAogCXJlcyA9ICZjdHgtPnJlczsKIAljdHgtPmJhc2Uuc2hhcmVhYmxlID0gZmFsc2U7CiAJY3R4LT5iYXNlLnRmaWxlID0gTlVMTDsKIAorCS8qCisJICogRnJvbSBoZXJlIG9uLCB0aGUgZGVzdHJ1Y3RvciB0YWtlcyBvdmVyIHJlc291cmNlIGZyZWVpbmcuCisJICovCisKIAlyZXQgPSB2bXdfY29udGV4dF9pbml0KGRldl9wcml2LCByZXMsIHZtd191c2VyX2NvbnRleHRfZnJlZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJdG1wID0gdm13X3Jlc291cmNlX3JlZmVyZW5jZSgmY3R4LT5yZXMpOwogCXJldCA9IHR0bV9iYXNlX29iamVjdF9pbml0KHRmaWxlLCAmY3R4LT5iYXNlLCBmYWxzZSwgVk1XX1JFU19DT05URVhULApAQCAtMzU4LDEzICs0NzAsMTYgQEAKIAlhcmctPmNpZCA9IHJlcy0+aWQ7CiBvdXRfZXJyOgogCXZtd19yZXNvdXJjZV91bnJlZmVyZW5jZSgmcmVzKTsKK291dF91bmxvY2s6CisJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogCiB9CiAKIGludCB2bXdfY29udGV4dF9jaGVjayhzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkgICAgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKLQkJICAgICAgaW50IGlkKQorCQkgICAgICBpbnQgaWQsCisJCSAgICAgIHN0cnVjdCB2bXdfcmVzb3VyY2UgKipwX3JlcykKIHsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXM7CiAJaW50IHJldCA9IDA7CkBAIC0zNzYsNiArNDkxLDggQEAKIAkJCWNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfdXNlcl9jb250ZXh0LCByZXMpOwogCQlpZiAoY3R4LT5iYXNlLnRmaWxlICE9IHRmaWxlICYmICFjdHgtPmJhc2Uuc2hhcmVhYmxlKQogCQkJcmV0ID0gLUVQRVJNOworCQlpZiAocF9yZXMpCisJCQkqcF9yZXMgPSB2bXdfcmVzb3VyY2VfcmVmZXJlbmNlKHJlcyk7CiAJfSBlbHNlCiAJCXJldCA9IC1FSU5WQUw7CiAJcmVhZF91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKQEAgLTM4MywxMDIgKzUwMCw2MzggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3Qgdm13X2JwcCB7CisJdWludDhfdCBicHA7CisJdWludDhfdCBzX2JwcDsKK307CisKKy8qCisgKiBTaXplIHRhYmxlIGZvciB0aGUgc3VwcG9ydGVkIFNWR0EzRCBzdXJmYWNlIGZvcm1hdHMuIEl0IGNvbnNpc3RzIG9mCisgKiB0d28gdmFsdWVzLiBUaGUgYnBwIHZhbHVlIGFuZCB0aGUgc19icHAgdmFsdWUgd2hpY2ggaXMgc2hvcnQgZm9yCisgKiAic3RyaWRlIGJpdHMgcGVyIHBpeGVsIiBUaGUgdmFsdWVzIGFyZSBnaXZlbiBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlCisgKiBtaW5pbXVtIHN0cmlkZSBmb3IgdGhlIGltYWdlIGlzIGNhbGN1bGF0ZWQgdXNpbmcKKyAqCisgKiBtaW5fc3RyaWRlID0gdypzX2JwcAorICoKKyAqIGFuZCB0aGUgdG90YWwgbWVtb3J5IHJlcXVpcmVtZW50IGZvciB0aGUgaW1hZ2UgaXMKKyAqCisgKiBoKm1pbl9zdHJpZGUqYnBwL3NfYnBwCisgKgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZtd19icHAgdm13X3NmX2JwcFtdID0geworCVtTVkdBM0RfRk9STUFUX0lOVkFMSURdID0gezAsIDB9LAorCVtTVkdBM0RfWDhSOEc4QjhdID0gezMyLCAzMn0sCisJW1NWR0EzRF9BOFI4RzhCOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX1I1RzZCNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1gxUjVHNUI1XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfQTFSNUc1QjVdID0gezE2LCAxNn0sCisJW1NWR0EzRF9BNFI0RzRCNF0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX1pfRDMyXSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfWl9EMTZdID0gezE2LCAxNn0sCisJW1NWR0EzRF9aX0QyNFM4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfWl9EMTVTMV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0xVTUlOQU5DRThdID0gezgsIDh9LAorCVtTVkdBM0RfTFVNSU5BTkNFNF9BTFBIQTRdID0gezgsIDh9LAorCVtTVkdBM0RfTFVNSU5BTkNFMTZdID0gezE2LCAxNn0sCisJW1NWR0EzRF9MVU1JTkFOQ0U4X0FMUEhBOF0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0RYVDFdID0gezQsIDE2fSwKKwlbU1ZHQTNEX0RYVDJdID0gezgsIDMyfSwKKwlbU1ZHQTNEX0RYVDNdID0gezgsIDMyfSwKKwlbU1ZHQTNEX0RYVDRdID0gezgsIDMyfSwKKwlbU1ZHQTNEX0RYVDVdID0gezgsIDMyfSwKKwlbU1ZHQTNEX0JVTVBVOFY4XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfQlVNUEw2VjVVNV0gPSB7MTYsIDE2fSwKKwlbU1ZHQTNEX0JVTVBYOEw4VjhVOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0FSR0JfUzEwRTVdID0gezE2LCAxNn0sCisJW1NWR0EzRF9BUkdCX1MyM0U4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQTJSMTBHMTBCMTBdID0gezMyLCAzMn0sCisJW1NWR0EzRF9WOFU4XSA9IHsxNiwgMTZ9LAorCVtTVkdBM0RfUThXOFY4VThdID0gezMyLCAzMn0sCisJW1NWR0EzRF9DeFY4VThdID0gezE2LCAxNn0sCisJW1NWR0EzRF9YOEw4VjhVOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0EyVzEwVjEwVTEwXSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQUxQSEE4XSA9IHs4LCA4fSwKKwlbU1ZHQTNEX1JfUzEwRTVdID0gezE2LCAxNn0sCisJW1NWR0EzRF9SX1MyM0U4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfUkdfUzEwRTVdID0gezE2LCAxNn0sCisJW1NWR0EzRF9SR19TMjNFOF0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0JVRkZFUl0gPSB7OCwgOH0sCisJW1NWR0EzRF9aX0QyNFg4XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfVjE2VTE2XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfRzE2UjE2XSA9IHszMiwgMzJ9LAorCVtTVkdBM0RfQTE2QjE2RzE2UjE2XSA9IHs2NCwgIDY0fSwKKwlbU1ZHQTNEX1VZVlldID0gezEyLCAxMn0sCisJW1NWR0EzRF9ZVVkyXSA9IHsxMiwgMTJ9LAorCVtTVkdBM0RfTlYxMl0gPSB7MTIsIDh9LAorCVtTVkdBM0RfQVlVVl0gPSB7MzIsIDMyfSwKKwlbU1ZHQTNEX0JDNF9VTk9STV0gPSB7NCwgIDE2fSwKKwlbU1ZHQTNEX0JDNV9VTk9STV0gPSB7OCwgIDMyfSwKKwlbU1ZHQTNEX1pfREYxNl0gPSB7MTYsICAxNn0sCisJW1NWR0EzRF9aX0RGMjRdID0gezI0LCAgMjR9LAorCVtTVkdBM0RfWl9EMjRTOF9JTlRdID0gezMyLCAgMzJ9Cit9OworCiAKIC8qKgogICogU3VyZmFjZSBtYW5hZ2VtZW50LgogICovCiAKK3N0cnVjdCB2bXdfc3VyZmFjZV9kbWEgeworCVNWR0EzZENtZEhlYWRlciBoZWFkZXI7CisJU1ZHQTNkQ21kU3VyZmFjZURNQSBib2R5OworCVNWR0EzZENvcHlCb3ggY2I7CisJU1ZHQTNkQ21kU3VyZmFjZURNQVN1ZmZpeCBzdWZmaXg7Cit9OworCitzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVmaW5lIHsKKwlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCVNWR0EzZENtZERlZmluZVN1cmZhY2UgYm9keTsKK307CisKK3N0cnVjdCB2bXdfc3VyZmFjZV9kZXN0cm95IHsKKwlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOworCVNWR0EzZENtZERlc3Ryb3lTdXJmYWNlIGJvZHk7Cit9OworCisKKy8qKgorICogdm13X3N1cmZhY2VfZG1hX3NpemUgLSBDb21wdXRlIGZpZm8gc2l6ZSBmb3IgYSBkbWEgY29tbWFuZC4KKyAqCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlCisgKgorICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIHNpemUgZm9yIGEgc3VyZmFjZSBkbWEgY29tbWFuZCBmb3IgYmFja3VwIG9yCisgKiByZXN0b3JhdGlvbiBvZiB0aGUgc3VyZmFjZSByZXByZXNlbnRlZCBieSBAc3JmLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHZtd19zdXJmYWNlX2RtYV9zaXplKGNvbnN0IHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKQoreworCXJldHVybiBzcmYtPm51bV9zaXplcyAqIHNpemVvZihzdHJ1Y3Qgdm13X3N1cmZhY2VfZG1hKTsKK30KKworCisvKioKKyAqIHZtd19zdXJmYWNlX2RlZmluZV9zaXplIC0gQ29tcHV0ZSBmaWZvIHNpemUgZm9yIGEgc3VyZmFjZSBkZWZpbmUgY29tbWFuZC4KKyAqCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlCisgKgorICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIHNpemUgZm9yIGEgc3VyZmFjZSBkZWZpbmUgY29tbWFuZCBmb3IgdGhlIGRlZmluaXRpb24KKyAqIG9mIHRoZSBzdXJmYWNlIHJlcHJlc2VudGVkIGJ5IEBzcmYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgdm13X3N1cmZhY2VfZGVmaW5lX3NpemUoY29uc3Qgc3RydWN0IHZtd19zdXJmYWNlICpzcmYpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVmaW5lKSArIHNyZi0+bnVtX3NpemVzICoKKwkJc2l6ZW9mKFNWR0EzZFNpemUpOworfQorCisKKy8qKgorICogdm13X3N1cmZhY2VfZGVzdHJveV9zaXplIC0gQ29tcHV0ZSBmaWZvIHNpemUgZm9yIGEgc3VyZmFjZSBkZXN0cm95IGNvbW1hbmQuCisgKgorICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIHNpemUgZm9yIGEgc3VyZmFjZSBkZXN0cm95IGNvbW1hbmQgZm9yIHRoZSBkZXN0cnVjdGlvbgorICogb2YgYSBodyBzdXJmYWNlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHZtd19zdXJmYWNlX2Rlc3Ryb3lfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IHZtd19zdXJmYWNlX2Rlc3Ryb3kpOworfQorCisvKioKKyAqIHZtd19zdXJmYWNlX2Rlc3Ryb3lfZW5jb2RlIC0gRW5jb2RlIGEgc3VyZmFjZV9kZXN0cm95IGNvbW1hbmQuCisgKgorICogQGlkOiBUaGUgc3VyZmFjZSBpZAorICogQGNtZF9zcGFjZTogUG9pbnRlciB0byBtZW1vcnkgYXJlYSBpbiB3aGljaCB0aGUgY29tbWFuZHMgc2hvdWxkIGJlIGVuY29kZWQuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19zdXJmYWNlX2Rlc3Ryb3lfZW5jb2RlKHVpbnQzMl90IGlkLAorCQkJCSAgICAgICB2b2lkICpjbWRfc3BhY2UpCit7CisJc3RydWN0IHZtd19zdXJmYWNlX2Rlc3Ryb3kgKmNtZCA9IChzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVzdHJveSAqKQorCQljbWRfc3BhY2U7CisKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVTVFJPWTsKKwljbWQtPmhlYWRlci5zaXplID0gc2l6ZW9mKGNtZC0+Ym9keSk7CisJY21kLT5ib2R5LnNpZCA9IGlkOworfQorCisvKioKKyAqIHZtd19zdXJmYWNlX2RlZmluZV9lbmNvZGUgLSBFbmNvZGUgYSBzdXJmYWNlX2RlZmluZSBjb21tYW5kLgorICoKKyAqIEBzcmY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3N1cmZhY2Ugb2JqZWN0LgorICogQGNtZF9zcGFjZTogUG9pbnRlciB0byBtZW1vcnkgYXJlYSBpbiB3aGljaCB0aGUgY29tbWFuZHMgc2hvdWxkIGJlIGVuY29kZWQuCisgKi8KK3N0YXRpYyB2b2lkIHZtd19zdXJmYWNlX2RlZmluZV9lbmNvZGUoY29uc3Qgc3RydWN0IHZtd19zdXJmYWNlICpzcmYsCisJCQkJICAgICAgdm9pZCAqY21kX3NwYWNlKQoreworCXN0cnVjdCB2bXdfc3VyZmFjZV9kZWZpbmUgKmNtZCA9IChzdHJ1Y3Qgdm13X3N1cmZhY2VfZGVmaW5lICopCisJCWNtZF9zcGFjZTsKKwlzdHJ1Y3QgZHJtX3Ztd19zaXplICpzcmNfc2l6ZTsKKwlTVkdBM2RTaXplICpjbWRfc2l6ZTsKKwl1aW50MzJfdCBjbWRfbGVuOworCWludCBpOworCisJY21kX2xlbiA9IHNpemVvZihjbWQtPmJvZHkpICsgc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoU1ZHQTNkU2l6ZSk7CisKKwljbWQtPmhlYWRlci5pZCA9IFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVGSU5FOworCWNtZC0+aGVhZGVyLnNpemUgPSBjbWRfbGVuOworCWNtZC0+Ym9keS5zaWQgPSBzcmYtPnJlcy5pZDsKKwljbWQtPmJvZHkuc3VyZmFjZUZsYWdzID0gc3JmLT5mbGFnczsKKwljbWQtPmJvZHkuZm9ybWF0ID0gY3B1X3RvX2xlMzIoc3JmLT5mb3JtYXQpOworCWZvciAoaSA9IDA7IGkgPCBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTOyArK2kpCisJCWNtZC0+Ym9keS5mYWNlW2ldLm51bU1pcExldmVscyA9IHNyZi0+bWlwX2xldmVsc1tpXTsKKworCWNtZCArPSAxOworCWNtZF9zaXplID0gKFNWR0EzZFNpemUgKikgY21kOworCXNyY19zaXplID0gc3JmLT5zaXplczsKKworCWZvciAoaSA9IDA7IGkgPCBzcmYtPm51bV9zaXplczsgKytpLCBjbWRfc2l6ZSsrLCBzcmNfc2l6ZSsrKSB7CisJCWNtZF9zaXplLT53aWR0aCA9IHNyY19zaXplLT53aWR0aDsKKwkJY21kX3NpemUtPmhlaWdodCA9IHNyY19zaXplLT5oZWlnaHQ7CisJCWNtZF9zaXplLT5kZXB0aCA9IHNyY19zaXplLT5kZXB0aDsKKwl9Cit9CisKKworLyoqCisgKiB2bXdfc3VyZmFjZV9kbWFfZW5jb2RlIC0gRW5jb2RlIGEgc3VyZmFjZV9kbWEgY29tbWFuZC4KKyAqCisgKiBAc3JmOiBQb2ludGVyIHRvIGEgc3RydWN0IHZtd19zdXJmYWNlIG9iamVjdC4KKyAqIEBjbWRfc3BhY2U6IFBvaW50ZXIgdG8gbWVtb3J5IGFyZWEgaW4gd2hpY2ggdGhlIGNvbW1hbmRzIHNob3VsZCBiZSBlbmNvZGVkLgorICogQHB0cjogUG9pbnRlciB0byBhbiBTVkdBR3Vlc3RQdHIgaW5kaWNhdGluZyB3aGVyZSB0aGUgc3VyZmFjZSBjb250ZW50cworICogc2hvdWxkIGJlIHBsYWNlZCBvciByZWFkIGZyb20uCisgKiBAdG9fc3VyZmFjZTogQm9vbGVhbiB3aGV0aGVyIHRvIERNQSB0byB0aGUgc3VyZmFjZSBvciBmcm9tIHRoZSBzdXJmYWNlLgorICovCitzdGF0aWMgdm9pZCB2bXdfc3VyZmFjZV9kbWFfZW5jb2RlKHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmLAorCQkJCSAgIHZvaWQgKmNtZF9zcGFjZSwKKwkJCQkgICBjb25zdCBTVkdBR3Vlc3RQdHIgKnB0ciwKKwkJCQkgICBib29sIHRvX3N1cmZhY2UpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBicHAgPSB2bXdfc2ZfYnBwW3NyZi0+Zm9ybWF0XS5icHA7CisJdWludDMyX3Qgc3RyaWRlX2JwcCA9IHZtd19zZl9icHBbc3JmLT5mb3JtYXRdLnNfYnBwOworCXN0cnVjdCB2bXdfc3VyZmFjZV9kbWEgKmNtZCA9IChzdHJ1Y3Qgdm13X3N1cmZhY2VfZG1hICopY21kX3NwYWNlOworCisJZm9yIChpID0gMDsgaSA8IHNyZi0+bnVtX3NpemVzOyArK2kpIHsKKwkJU1ZHQTNkQ21kSGVhZGVyICpoZWFkZXIgPSAmY21kLT5oZWFkZXI7CisJCVNWR0EzZENtZFN1cmZhY2VETUEgKmJvZHkgPSAmY21kLT5ib2R5OworCQlTVkdBM2RDb3B5Qm94ICpjYiA9ICZjbWQtPmNiOworCQlTVkdBM2RDbWRTdXJmYWNlRE1BU3VmZml4ICpzdWZmaXggPSAmY21kLT5zdWZmaXg7CisJCWNvbnN0IHN0cnVjdCB2bXdfc3VyZmFjZV9vZmZzZXQgKmN1cl9vZmZzZXQgPSAmc3JmLT5vZmZzZXRzW2ldOworCQljb25zdCBzdHJ1Y3QgZHJtX3Ztd19zaXplICpjdXJfc2l6ZSA9ICZzcmYtPnNpemVzW2ldOworCisJCWhlYWRlci0+aWQgPSBTVkdBXzNEX0NNRF9TVVJGQUNFX0RNQTsKKwkJaGVhZGVyLT5zaXplID0gc2l6ZW9mKCpib2R5KSArIHNpemVvZigqY2IpICsgc2l6ZW9mKCpzdWZmaXgpOworCisJCWJvZHktPmd1ZXN0LnB0ciA9ICpwdHI7CisJCWJvZHktPmd1ZXN0LnB0ci5vZmZzZXQgKz0gY3VyX29mZnNldC0+Ym9fb2Zmc2V0OworCQlib2R5LT5ndWVzdC5waXRjaCA9IChjdXJfc2l6ZS0+d2lkdGggKiBzdHJpZGVfYnBwICsgNykgPj4gMzsKKwkJYm9keS0+aG9zdC5zaWQgPSBzcmYtPnJlcy5pZDsKKwkJYm9keS0+aG9zdC5mYWNlID0gY3VyX29mZnNldC0+ZmFjZTsKKwkJYm9keS0+aG9zdC5taXBtYXAgPSBjdXJfb2Zmc2V0LT5taXA7CisJCWJvZHktPnRyYW5zZmVyID0gKCh0b19zdXJmYWNlKSA/ICBTVkdBM0RfV1JJVEVfSE9TVF9WUkFNIDoKKwkJCQkgIFNWR0EzRF9SRUFEX0hPU1RfVlJBTSk7CisJCWNiLT54ID0gMDsKKwkJY2ItPnkgPSAwOworCQljYi0+eiA9IDA7CisJCWNiLT5zcmN4ID0gMDsKKwkJY2ItPnNyY3kgPSAwOworCQljYi0+c3JjeiA9IDA7CisJCWNiLT53ID0gY3VyX3NpemUtPndpZHRoOworCQljYi0+aCA9IGN1cl9zaXplLT5oZWlnaHQ7CisJCWNiLT5kID0gY3VyX3NpemUtPmRlcHRoOworCisJCXN1ZmZpeC0+c3VmZml4U2l6ZSA9IHNpemVvZigqc3VmZml4KTsKKwkJc3VmZml4LT5tYXhpbXVtT2Zmc2V0ID0gYm9keS0+Z3Vlc3QucGl0Y2gqY3VyX3NpemUtPmhlaWdodCoKKwkJCWN1cl9zaXplLT5kZXB0aCpicHAgLyBzdHJpZGVfYnBwOworCQlzdWZmaXgtPmZsYWdzLmRpc2NhcmQgPSAwOworCQlzdWZmaXgtPmZsYWdzLnVuc3luY2hyb25pemVkID0gMDsKKwkJc3VmZml4LT5mbGFncy5yZXNlcnZlZCA9IDA7CisJCSsrY21kOworCX0KK307CisKKwogc3RhdGljIHZvaWQgdm13X2h3X3N1cmZhY2VfZGVzdHJveShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCiB7CiAKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKLQlzdHJ1Y3QgewotCQlTVkdBM2RDbWRIZWFkZXIgaGVhZGVyOwotCQlTVkdBM2RDbWREZXN0cm95U3VyZmFjZSBib2R5OwotCX0gKmNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHNpemVvZigqY21kKSk7CisJc3RydWN0IHZtd19zdXJmYWNlICpzcmY7CisJdm9pZCAqY21kOwogCi0JaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgewotCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc3VyZmFjZSAiCi0JCQkgICJkZXN0cnVjdGlvbi5cbiIpOwotCQlyZXR1cm47CisJaWYgKHJlcy0+aWQgIT0gLTEpIHsKKworCQljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCB2bXdfc3VyZmFjZV9kZXN0cm95X3NpemUoKSk7CisJCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHJlc2VydmluZyBGSUZPIHNwYWNlIGZvciBzdXJmYWNlICIKKwkJCQkgICJkZXN0cnVjdGlvbi5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJdm13X3N1cmZhY2VfZGVzdHJveV9lbmNvZGUocmVzLT5pZCwgY21kKTsKKwkJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCB2bXdfc3VyZmFjZV9kZXN0cm95X3NpemUoKSk7CisKKwkJLyoKKwkJICogdXNlZF9tZW1vcnlfc2l6ZV9hdG9taWMsIG9yIHNlcGFyYXRlIGxvY2sKKwkJICogdG8gYXZvaWQgdGFraW5nIGRldl9wcml2OjpjbWRidWZfbXV0ZXggaW4KKwkJICogdGhlIGRlc3Ryb3kgcGF0aC4KKwkJICovCisKKwkJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmNtZGJ1Zl9tdXRleCk7CisJCXNyZiA9IGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfc3VyZmFjZSwgcmVzKTsKKwkJZGV2X3ByaXYtPnVzZWRfbWVtb3J5X3NpemUgLT0gc3JmLT5iYWNrdXBfc2l6ZTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+Y21kYnVmX211dGV4KTsKKwogCX0KLQotCWNtZC0+aGVhZGVyLmlkID0gY3B1X3RvX2xlMzIoU1ZHQV8zRF9DTURfU1VSRkFDRV9ERVNUUk9ZKTsKLQljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZW9mKGNtZC0+Ym9keSkpOwotCWNtZC0+Ym9keS5zaWQgPSBjcHVfdG9fbGUzMihyZXMtPmlkKTsKLQotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc2l6ZW9mKCpjbWQpKTsKLQl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2KTsKKwl2bXdfM2RfcmVzb3VyY2VfZGVjKGRldl9wcml2LCBmYWxzZSk7CiB9CiAKIHZvaWQgdm13X3N1cmZhY2VfcmVzX2ZyZWUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKQogewogCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmID0gY29udGFpbmVyX29mKHJlcywgc3RydWN0IHZtd19zdXJmYWNlLCByZXMpOwogCisJaWYgKHNyZi0+YmFja3VwKQorCQl0dG1fYm9fdW5yZWYoJnNyZi0+YmFja3VwKTsKKwlrZnJlZShzcmYtPm9mZnNldHMpOwogCWtmcmVlKHNyZi0+c2l6ZXMpOwogCWtmcmVlKHNyZi0+c25vb3Blci5pbWFnZSk7CiAJa2ZyZWUoc3JmKTsKIH0KIAorCisvKioKKyAqIHZtd19zdXJmYWNlX2RvX3ZhbGlkYXRlIC0gbWFrZSBhIHN1cmZhY2UgYXZhaWxhYmxlIHRvIHRoZSBkZXZpY2UuCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHNyZjogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfc3VyZmFjZS4KKyAqCisgKiBJZiB0aGUgc3VyZmFjZSBkb2Vzbid0IGhhdmUgYSBodyBpZCwgYWxsb2NhdGUgb25lLCBhbmQgb3B0aW9uYWxseQorICogRE1BIHRoZSBiYWNrZWQgdXAgc3VyZmFjZSBjb250ZW50cyB0byB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnMgLUVCVVNZIGlmIHRoZXJlIHdhc24ndCBzdWZmaWNpZW50IGRldmljZSByZXNvdXJjZXMgdG8KKyAqIGNvbXBsZXRlIHRoZSB2YWxpZGF0aW9uLiBSZXRyeSBhZnRlciBmcmVlaW5nIHVwIHJlc291cmNlcy4KKyAqCisgKiBNYXkgcmV0dXJuIG90aGVyIGVycm9ycyBpZiB0aGUga2VybmVsIGlzIG91dCBvZiBndWVzdCByZXNvdXJjZXMuCisgKi8KK2ludCB2bXdfc3VyZmFjZV9kb192YWxpZGF0ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKQoreworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9ICZzcmYtPnJlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZhbF9saXN0OworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHZhbF9idWY7CisJdWludDMyX3Qgc3VibWl0X3NpemU7CisJdWludDhfdCAqY21kOworCWludCByZXQ7CisKKwlpZiAobGlrZWx5KHJlcy0+aWQgIT0gLTEpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShkZXZfcHJpdi0+dXNlZF9tZW1vcnlfc2l6ZSArIHNyZi0+YmFja3VwX3NpemUgPj0KKwkJICAgICBkZXZfcHJpdi0+bWVtb3J5X3NpemUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBSZXNlcnZlLSBhbmQgdmFsaWRhdGUgdGhlIGJhY2t1cCBETUEgYm8uCisJICovCisKKwlpZiAoc3JmLT5iYWNrdXApIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnZhbF9saXN0KTsKKwkJdmFsX2J1Zi5ibyA9IHR0bV9ib19yZWZlcmVuY2Uoc3JmLT5iYWNrdXApOworCQl2YWxfYnVmLm5ld19zeW5jX29ial9hcmcgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgICBEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQyk7CisJCWxpc3RfYWRkX3RhaWwoJnZhbF9idWYuaGVhZCwgJnZhbF9saXN0KTsKKwkJcmV0ID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycygmdmFsX2xpc3QpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJZ290byBvdXRfbm9fcmVzZXJ2ZTsKKworCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoc3JmLT5iYWNrdXAsICZ2bXdfc3JmX3BsYWNlbWVudCwKKwkJCQkgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJZ290byBvdXRfbm9fdmFsaWRhdGU7CisJfQorCisJLyoKKwkgKiBBbGxvYyBpZCBmb3IgdGhlIHJlc291cmNlLgorCSAqLworCisJcmV0ID0gdm13X3Jlc291cmNlX2FsbG9jX2lkKGRldl9wcml2LCByZXMpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBzdXJmYWNlIGlkLlxuIik7CisJCWdvdG8gb3V0X25vX2lkOworCX0KKwlpZiAodW5saWtlbHkocmVzLT5pZCA+PSBTVkdBM0RfTUFYX1NVUkZBQ0VfSURTKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X25vX2ZpZm87CisJfQorCisKKwkvKgorCSAqIEVuY29kZSBzdXJmYWNlIGRlZmluZS0gYW5kIGRtYSBjb21tYW5kcy4KKwkgKi8KKworCXN1Ym1pdF9zaXplID0gdm13X3N1cmZhY2VfZGVmaW5lX3NpemUoc3JmKTsKKwlpZiAoc3JmLT5iYWNrdXApCisJCXN1Ym1pdF9zaXplICs9IHZtd19zdXJmYWNlX2RtYV9zaXplKHNyZik7CisKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc3VyZmFjZSAiCisJCQkgICJ2YWxpZGF0aW9uLlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX2ZpZm87CisJfQorCisJdm13X3N1cmZhY2VfZGVmaW5lX2VuY29kZShzcmYsIGNtZCk7CisJaWYgKHNyZi0+YmFja3VwKSB7CisJCVNWR0FHdWVzdFB0ciBwdHI7CisKKwkJY21kICs9IHZtd19zdXJmYWNlX2RlZmluZV9zaXplKHNyZik7CisJCXZtd19ib19nZXRfZ3Vlc3RfcHRyKHNyZi0+YmFja3VwLCAmcHRyKTsKKwkJdm13X3N1cmZhY2VfZG1hX2VuY29kZShzcmYsIGNtZCwgJnB0ciwgdHJ1ZSk7CisJfQorCisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7CisKKwkvKgorCSAqIENyZWF0ZSBhIGZlbmNlIG9iamVjdCBhbmQgZmVuY2UgdGhlIGJhY2t1cCBidWZmZXIuCisJICovCisKKwlpZiAoc3JmLT5iYWNrdXApIHsKKwkJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCisJCSh2b2lkKSB2bXdfZXhlY2J1Zl9mZW5jZV9jb21tYW5kcyhOVUxMLCBkZXZfcHJpdiwKKwkJCQkJCSAgJmZlbmNlLCBOVUxMKTsKKwkJdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKCZ2YWxfbGlzdCwgZmVuY2UpOworCQlpZiAobGlrZWx5KGZlbmNlICE9IE5VTEwpKQorCQkJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworCQl0dG1fYm9fdW5yZWYoJnZhbF9idWYuYm8pOworCQl0dG1fYm9fdW5yZWYoJnNyZi0+YmFja3VwKTsKKwl9CisKKwkvKgorCSAqIFN1cmZhY2UgbWVtb3J5IHVzYWdlIGFjY291bnRpbmcuCisJICovCisKKwlkZXZfcHJpdi0+dXNlZF9tZW1vcnlfc2l6ZSArPSBzcmYtPmJhY2t1cF9zaXplOworCisJcmV0dXJuIDA7CisKK291dF9ub19maWZvOgorCXZtd19yZXNvdXJjZV9yZWxlYXNlX2lkKHJlcyk7CitvdXRfbm9faWQ6CitvdXRfbm9fdmFsaWRhdGU6CisJaWYgKHNyZi0+YmFja3VwKQorCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbigmdmFsX2xpc3QpOworb3V0X25vX3Jlc2VydmU6CisJaWYgKHNyZi0+YmFja3VwKQorCQl0dG1fYm9fdW5yZWYoJnZhbF9idWYuYm8pOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdm13X3N1cmZhY2VfZXZpY3QgLSBFdmljdCBhIGh3IHN1cmZhY2UuCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHNyZjogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfc3VyZmFjZQorICoKKyAqIERNQSB0aGUgY29udGVudHMgb2YgYSBodyBzdXJmYWNlIHRvIGEgYmFja3VwIGd1ZXN0IGJ1ZmZlciBvYmplY3QsCisgKiBhbmQgZGVzdHJveSB0aGUgaHcgc3VyZmFjZSwgcmVsZWFzaW5nIGl0cyBpZC4KKyAqLworaW50IHZtd19zdXJmYWNlX2V2aWN0KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmKQoreworCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlcyA9ICZzcmYtPnJlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZhbF9saXN0OworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHZhbF9idWY7CisJdWludDMyX3Qgc3VibWl0X3NpemU7CisJdWludDhfdCAqY21kOworCWludCByZXQ7CisJc3RydWN0IHZtd19mZW5jZV9vYmogKmZlbmNlOworCVNWR0FHdWVzdFB0ciBwdHI7CisKKwlCVUdfT04ocmVzLT5pZCA9PSAtMSk7CisKKwkvKgorCSAqIENyZWF0ZSBhIHN1cmZhY2UgYmFja3VwIGJ1ZmZlciBvYmplY3QuCisJICovCisKKwlpZiAoIXNyZi0+YmFja3VwKSB7CisJCXJldCA9IHR0bV9ib19jcmVhdGUoJmRldl9wcml2LT5iZGV2LCBzcmYtPmJhY2t1cF9zaXplLAorCQkJCSAgICB0dG1fYm9fdHlwZV9kZXZpY2UsCisJCQkJICAgICZ2bXdfc3JmX3BsYWNlbWVudCwgMCwgMCwgdHJ1ZSwKKwkJCQkgICAgTlVMTCwgJnNyZi0+YmFja3VwKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBSZXNlcnZlLSBhbmQgdmFsaWRhdGUgdGhlIGJhY2t1cCBETUEgYm8uCisJICovCisKKwlJTklUX0xJU1RfSEVBRCgmdmFsX2xpc3QpOworCXZhbF9idWYuYm8gPSB0dG1fYm9fcmVmZXJlbmNlKHNyZi0+YmFja3VwKTsKKwl2YWxfYnVmLm5ld19zeW5jX29ial9hcmcgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQlEUk1fVk1XX0ZFTkNFX0ZMQUdfRVhFQzsKKwlsaXN0X2FkZF90YWlsKCZ2YWxfYnVmLmhlYWQsICZ2YWxfbGlzdCk7CisJcmV0ID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycygmdmFsX2xpc3QpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0X25vX3Jlc2VydmU7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoc3JmLT5iYWNrdXAsICZ2bXdfc3JmX3BsYWNlbWVudCwKKwkJCSAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBvdXRfbm9fdmFsaWRhdGU7CisKKworCS8qCisJICogRW5jb2RlIHRoZSBkbWEtIGFuZCBzdXJmYWNlIGRlc3Ryb3kgY29tbWFuZHMuCisJICovCisKKwlzdWJtaXRfc2l6ZSA9IHZtd19zdXJmYWNlX2RtYV9zaXplKHNyZikgKyB2bXdfc3VyZmFjZV9kZXN0cm95X3NpemUoKTsKKwljbWQgPSB2bXdfZmlmb19yZXNlcnZlKGRldl9wcml2LCBzdWJtaXRfc2l6ZSk7CisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZhaWxlZCByZXNlcnZpbmcgRklGTyBzcGFjZSBmb3Igc3VyZmFjZSAiCisJCQkgICJldmljdGlvbi5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub19maWZvOworCX0KKworCXZtd19ib19nZXRfZ3Vlc3RfcHRyKHNyZi0+YmFja3VwLCAmcHRyKTsKKwl2bXdfc3VyZmFjZV9kbWFfZW5jb2RlKHNyZiwgY21kLCAmcHRyLCBmYWxzZSk7CisJY21kICs9IHZtd19zdXJmYWNlX2RtYV9zaXplKHNyZik7CisJdm13X3N1cmZhY2VfZGVzdHJveV9lbmNvZGUocmVzLT5pZCwgY21kKTsKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKKworCS8qCisJICogU3VyZmFjZSBtZW1vcnkgdXNhZ2UgYWNjb3VudGluZy4KKwkgKi8KKworCWRldl9wcml2LT51c2VkX21lbW9yeV9zaXplIC09IHNyZi0+YmFja3VwX3NpemU7CisKKwkvKgorCSAqIENyZWF0ZSBhIGZlbmNlIG9iamVjdCBhbmQgZmVuY2UgdGhlIERNQSBidWZmZXIuCisJICovCisKKwkodm9pZCkgdm13X2V4ZWNidWZfZmVuY2VfY29tbWFuZHMoTlVMTCwgZGV2X3ByaXYsCisJCQkJCSAgJmZlbmNlLCBOVUxMKTsKKwl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnZhbF9saXN0LCBmZW5jZSk7CisJaWYgKGxpa2VseShmZW5jZSAhPSBOVUxMKSkKKwkJdm13X2ZlbmNlX29ial91bnJlZmVyZW5jZSgmZmVuY2UpOworCXR0bV9ib191bnJlZigmdmFsX2J1Zi5ibyk7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHN1cmZhY2UgSUQuCisJICovCisKKwl2bXdfcmVzb3VyY2VfcmVsZWFzZV9pZChyZXMpOworCisJcmV0dXJuIDA7CisKK291dF9ub19maWZvOgorb3V0X25vX3ZhbGlkYXRlOgorCWlmIChzcmYtPmJhY2t1cCkKKwkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24oJnZhbF9saXN0KTsKK291dF9ub19yZXNlcnZlOgorCXR0bV9ib191bnJlZigmdmFsX2J1Zi5ibyk7CisJdHRtX2JvX3VucmVmKCZzcmYtPmJhY2t1cCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIHZtd19zdXJmYWNlX3ZhbGlkYXRlIC0gbWFrZSBhIHN1cmZhY2UgYXZhaWxhYmxlIHRvIHRoZSBkZXZpY2UsIGV2aWN0aW5nCisgKiBvdGhlciBzdXJmYWNlcyBpZiBuZWVkZWQuCisgKgorICogQGRldl9wcml2OiBQb2ludGVyIHRvIGEgZGV2aWNlIHByaXZhdGUgc3RydWN0LgorICogQHNyZjogUG9pbnRlciB0byBhIHN0cnVjdCB2bXdfc3VyZmFjZS4KKyAqCisgKiBUcnkgdG8gdmFsaWRhdGUgYSBzdXJmYWNlIGFuZCBpZiBpdCBmYWlscyBkdWUgdG8gbGltaXRlZCBkZXZpY2UgcmVzb3VyY2VzLAorICogcmVwZWF0ZWRseSB0cnkgdG8gZXZpY3Qgb3RoZXIgc3VyZmFjZXMgdW50aWwgdGhlIHJlcXVlc3QgY2FuIGJlCisgKiBhY29tbW9kYXRlZC4KKyAqCisgKiBNYXkgcmV0dXJuIGVycm9ycyBpZiBvdXQgb2YgcmVzb3VyY2VzLgorICovCitpbnQgdm13X3N1cmZhY2VfdmFsaWRhdGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCSBzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2bXdfc3VyZmFjZSAqZXZpY3Rfc3JmOworCisJZG8geworCQl3cml0ZV9sb2NrKCZkZXZfcHJpdi0+cmVzb3VyY2VfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnNyZi0+bHJ1X2hlYWQpOworCQl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKworCQlyZXQgPSB2bXdfc3VyZmFjZV9kb192YWxpZGF0ZShkZXZfcHJpdiwgc3JmKTsKKwkJaWYgKGxpa2VseShyZXQgIT0gLUVCVVNZKSkKKwkJCWJyZWFrOworCisJCXdyaXRlX2xvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmRldl9wcml2LT5zdXJmYWNlX2xydSkpIHsKKwkJCURSTV9FUlJPUigiT3V0IG9mIGRldmljZSBtZW1vcnkgZm9yIHN1cmZhY2VzLlxuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZpY3Rfc3JmID0gdm13X3N1cmZhY2VfcmVmZXJlbmNlCisJCQkobGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPnN1cmZhY2VfbHJ1LAorCQkJCQkgIHN0cnVjdCB2bXdfc3VyZmFjZSwKKwkJCQkJICBscnVfaGVhZCkpOworCQlsaXN0X2RlbF9pbml0KCZldmljdF9zcmYtPmxydV9oZWFkKTsKKworCQl3cml0ZV91bmxvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKwkJKHZvaWQpIHZtd19zdXJmYWNlX2V2aWN0KGRldl9wcml2LCBldmljdF9zcmYpOworCisJCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZldmljdF9zcmYpOworCisJfSB3aGlsZSAoMSk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IDAgJiYgc3JmLT5yZXMuaWQgIT0gLTEpKSB7CisJCXdyaXRlX2xvY2soJmRldl9wcml2LT5yZXNvdXJjZV9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmc3JmLT5scnVfaGVhZCwgJmRldl9wcml2LT5zdXJmYWNlX2xydSk7CisJCXdyaXRlX3VubG9jaygmZGV2X3ByaXYtPnJlc291cmNlX2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiB2bXdfc3VyZmFjZV9yZW1vdmVfZnJvbV9saXN0cyAtIFJlbW92ZSBzdXJmYWNlIHJlc291cmNlcyBmcm9tIGxvb2t1cCBsaXN0cworICoKKyAqIEByZXM6IFBvaW50ZXIgdG8gYSBzdHJ1Y3Qgdm13X3Jlc291cmNlIGVtYmVkZGVkIGluIGEgc3RydWN0IHZtd19zdXJmYWNlCisgKgorICogQXMgcGFydCBvZiB0aGUgcmVzb3VyY2UgZGVzdHJ1Y3Rpb24sIHJlbW92ZSB0aGUgc3VyZmFjZSBmcm9tIGFueQorICogbG9va3VwIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCB2bXdfc3VyZmFjZV9yZW1vdmVfZnJvbV9saXN0cyhzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCit7CisJc3RydWN0IHZtd19zdXJmYWNlICpzcmYgPSBjb250YWluZXJfb2YocmVzLCBzdHJ1Y3Qgdm13X3N1cmZhY2UsIHJlcyk7CisKKwlsaXN0X2RlbF9pbml0KCZzcmYtPmxydV9oZWFkKTsKK30KKwogaW50IHZtd19zdXJmYWNlX2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJICAgICBzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZiwKIAkJICAgICB2b2lkICgqcmVzX2ZyZWUpIChzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHsKLQkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKLQkJU1ZHQTNkQ21kRGVmaW5lU3VyZmFjZSBib2R5OwotCX0gKmNtZDsKLQlTVkdBM2RTaXplICpjbWRfc2l6ZTsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMgPSAmc3JmLT5yZXM7Ci0Jc3RydWN0IGRybV92bXdfc2l6ZSAqc3JjX3NpemU7Ci0Jc2l6ZV90IHN1Ym1pdF9zaXplOwotCXVpbnQzMl90IGNtZF9sZW47Ci0JaW50IGk7CiAKIAlCVUdfT04ocmVzX2ZyZWUgPT0gTlVMTCk7CisJSU5JVF9MSVNUX0hFQUQoJnNyZi0+bHJ1X2hlYWQpOwogCXJldCA9IHZtd19yZXNvdXJjZV9pbml0KGRldl9wcml2LCByZXMsICZkZXZfcHJpdi0+c3VyZmFjZV9pZHIsCi0JCQkJVk1XX1JFU19TVVJGQUNFLCByZXNfZnJlZSk7CisJCQkJVk1XX1JFU19TVVJGQUNFLCB0cnVlLCByZXNfZnJlZSwKKwkJCQl2bXdfc3VyZmFjZV9yZW1vdmVfZnJvbV9saXN0cyk7CiAKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmVzX2ZyZWUocmVzKTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKLQlzdWJtaXRfc2l6ZSA9IHNpemVvZigqY21kKSArIHNyZi0+bnVtX3NpemVzICogc2l6ZW9mKFNWR0EzZFNpemUpOwotCWNtZF9sZW4gPSBzaXplb2YoY21kLT5ib2R5KSArIHNyZi0+bnVtX3NpemVzICogc2l6ZW9mKFNWR0EzZFNpemUpOworCS8qCisJICogVGhlIHN1cmZhY2Ugd29uJ3QgYmUgdmlzaWJsZSB0byBoYXJkd2FyZSB1bnRpbCBhCisJICogc3VyZmFjZSB2YWxpZGF0ZS4KKwkgKi8KIAotCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIHN1Ym1pdF9zaXplKTsKLQlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7Ci0JCURSTV9FUlJPUigiRmlmbyByZXNlcnZlIGZhaWxlZCBmb3IgY3JlYXRlIHN1cmZhY2UuXG4iKTsKLQkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQljbWQtPmhlYWRlci5pZCA9IGNwdV90b19sZTMyKFNWR0FfM0RfQ01EX1NVUkZBQ0VfREVGSU5FKTsKLQljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoY21kX2xlbik7Ci0JY21kLT5ib2R5LnNpZCA9IGNwdV90b19sZTMyKHJlcy0+aWQpOwotCWNtZC0+Ym9keS5zdXJmYWNlRmxhZ3MgPSBjcHVfdG9fbGUzMihzcmYtPmZsYWdzKTsKLQljbWQtPmJvZHkuZm9ybWF0ID0gY3B1X3RvX2xlMzIoc3JmLT5mb3JtYXQpOwotCWZvciAoaSA9IDA7IGkgPCBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTOyArK2kpIHsKLQkJY21kLT5ib2R5LmZhY2VbaV0ubnVtTWlwTGV2ZWxzID0KLQkJICAgIGNwdV90b19sZTMyKHNyZi0+bWlwX2xldmVsc1tpXSk7Ci0JfQotCi0JY21kICs9IDE7Ci0JY21kX3NpemUgPSAoU1ZHQTNkU2l6ZSAqKSBjbWQ7Ci0Jc3JjX3NpemUgPSBzcmYtPnNpemVzOwotCi0JZm9yIChpID0gMDsgaSA8IHNyZi0+bnVtX3NpemVzOyArK2ksIGNtZF9zaXplKyssIHNyY19zaXplKyspIHsKLQkJY21kX3NpemUtPndpZHRoID0gY3B1X3RvX2xlMzIoc3JjX3NpemUtPndpZHRoKTsKLQkJY21kX3NpemUtPmhlaWdodCA9IGNwdV90b19sZTMyKHNyY19zaXplLT5oZWlnaHQpOwotCQljbWRfc2l6ZS0+ZGVwdGggPSBjcHVfdG9fbGUzMihzcmNfc2l6ZS0+ZGVwdGgpOwotCX0KLQotCXZtd19maWZvX2NvbW1pdChkZXZfcHJpdiwgc3VibWl0X3NpemUpOwotCSh2b2lkKSB2bXdfM2RfcmVzb3VyY2VfaW5jKGRldl9wcml2KTsKKwkodm9pZCkgdm13XzNkX3Jlc291cmNlX2luYyhkZXZfcHJpdiwgZmFsc2UpOwogCXZtd19yZXNvdXJjZV9hY3RpdmF0ZShyZXMsIHZtd19od19zdXJmYWNlX2Rlc3Ryb3kpOwotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHZtd191c2VyX3N1cmZhY2VfZnJlZShzdHJ1Y3Qgdm13X3Jlc291cmNlICpyZXMpCkBAIC00ODYsMTIgKzExMzksNTggQEAKIAlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnNyZiA9IGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfc3VyZmFjZSwgcmVzKTsKIAlzdHJ1Y3Qgdm13X3VzZXJfc3VyZmFjZSAqdXNlcl9zcmYgPQogCSAgICBjb250YWluZXJfb2Yoc3JmLCBzdHJ1Y3Qgdm13X3VzZXJfc3VyZmFjZSwgc3JmKTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gc3JmLT5yZXMuZGV2X3ByaXY7CisJdWludDMyX3Qgc2l6ZSA9IHVzZXJfc3JmLT5zaXplOwogCisJaWYgKHNyZi0+YmFja3VwKQorCQl0dG1fYm9fdW5yZWYoJnNyZi0+YmFja3VwKTsKKwlrZnJlZShzcmYtPm9mZnNldHMpOwogCWtmcmVlKHNyZi0+c2l6ZXMpOwogCWtmcmVlKHNyZi0+c25vb3Blci5pbWFnZSk7CiAJa2ZyZWUodXNlcl9zcmYpOworCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGRldl9wcml2KSwgc2l6ZSk7CiB9CiAKKy8qKgorICogdm13X3Jlc291cmNlX3VucmVzZXJ2ZSAtIHVucmVzZXJ2ZSByZXNvdXJjZXMgcHJldmlvdXNseSByZXNlcnZlZCBmb3IKKyAqIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqCisgKiBAbGlzdF9oZWFkOiBsaXN0IG9mIHJlc291cmNlcyB0byB1bnJlc2VydmUuCisgKgorICogQ3VycmVudGx5IG9ubHkgc3VyZmFjZXMgYXJlIGNvbnNpZGVyZWQsIGFuZCB1bnJlc2VydmluZyBhIHN1cmZhY2UKKyAqIG1lYW5zIHB1dHRpbmcgaXQgYmFjayBvbiB0aGUgZGV2aWNlJ3Mgc3VyZmFjZSBscnUgbGlzdCwKKyAqIHNvIHRoYXQgaXQgY2FuIGJlIGV2aWN0ZWQgaWYgbmVjZXNzYXJ5LgorICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIHJlc291cmNlIGxpc3QgYW5kCisgKiBjaGVja3Mgd2hldGhlciByZXNvdXJjZXMgYXJlIHN1cmZhY2VzLCBhbmQgaW4gdGhhdCBjYXNlIHB1dHMgdGhlbSBiYWNrCisgKiBvbiB0aGUgZGV2aWNlJ3Mgc3VyZmFjZSBMUlUgbGlzdC4KKyAqLwordm9pZCB2bXdfcmVzb3VyY2VfdW5yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzOworCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmOworCXJ3bG9ja190ICpsb2NrID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCBsaXN0LCB2YWxpZGF0ZV9oZWFkKSB7CisKKwkJaWYgKHJlcy0+cmVzX2ZyZWUgIT0gJnZtd19zdXJmYWNlX3Jlc19mcmVlICYmCisJCSAgICByZXMtPnJlc19mcmVlICE9ICZ2bXdfdXNlcl9zdXJmYWNlX2ZyZWUpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkobG9jayA9PSBOVUxMKSkgeworCQkJbG9jayA9ICZyZXMtPmRldl9wcml2LT5yZXNvdXJjZV9sb2NrOworCQkJd3JpdGVfbG9jayhsb2NrKTsKKwkJfQorCisJCXNyZiA9IGNvbnRhaW5lcl9vZihyZXMsIHN0cnVjdCB2bXdfc3VyZmFjZSwgcmVzKTsKKwkJbGlzdF9kZWxfaW5pdCgmc3JmLT5scnVfaGVhZCk7CisJCWxpc3RfYWRkX3RhaWwoJnNyZi0+bHJ1X2hlYWQsICZyZXMtPmRldl9wcml2LT5zdXJmYWNlX2xydSk7CisJfQorCisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJd3JpdGVfdW5sb2NrKGxvY2spOworfQorCisKIGludCB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cF9oYW5kbGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKIAkJCQkgICB1aW50MzJfdCBoYW5kbGUsIHN0cnVjdCB2bXdfc3VyZmFjZSAqKm91dCkKQEAgLTU1Niw4ICsxMjU1LDcgQEAKIAkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiA9IHZtd19wcml2KGRldik7Ci0Jc3RydWN0IHZtd191c2VyX3N1cmZhY2UgKnVzZXJfc3JmID0KLQkgICAga21hbGxvYyhzaXplb2YoKnVzZXJfc3JmKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHZtd191c2VyX3N1cmZhY2UgKnVzZXJfc3JmOwogCXN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICp0bXA7CkBAIC01NjgsMTAgKzEyNjYsNTEgQEAKIAlzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSA9IHZtd19mcHJpdihmaWxlX3ByaXYpLT50ZmlsZTsKIAlzdHJ1Y3QgZHJtX3Ztd19zaXplIF9fdXNlciAqdXNlcl9zaXplczsKIAlpbnQgcmV0OwotCWludCBpOworCWludCBpLCBqOworCXVpbnQzMl90IGN1cl9ib19vZmZzZXQ7CisJc3RydWN0IGRybV92bXdfc2l6ZSAqY3VyX3NpemU7CisJc3RydWN0IHZtd19zdXJmYWNlX29mZnNldCAqY3VyX29mZnNldDsKKwl1aW50MzJfdCBzdHJpZGVfYnBwOworCXVpbnQzMl90IGJwcDsKKwl1aW50MzJfdCBudW1fc2l6ZXM7CisJdWludDMyX3Qgc2l6ZTsKKwlzdHJ1Y3Qgdm13X21hc3RlciAqdm1hc3RlciA9IHZtd19tYXN0ZXIoZmlsZV9wcml2LT5tYXN0ZXIpOwogCi0JaWYgKHVubGlrZWx5KHVzZXJfc3JmID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodW5saWtlbHkodm13X3VzZXJfc3VyZmFjZV9zaXplID09IDApKQorCQl2bXdfdXNlcl9zdXJmYWNlX3NpemUgPSB0dG1fcm91bmRfcG90KHNpemVvZigqdXNlcl9zcmYpKSArCisJCQkxMjg7CisKKwludW1fc2l6ZXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTOyArK2kpCisJCW51bV9zaXplcyArPSByZXEtPm1pcF9sZXZlbHNbaV07CisKKwlpZiAobnVtX3NpemVzID4gRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFUyAqCisJICAgIERSTV9WTVdfTUFYX01JUF9MRVZFTFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IHZtd191c2VyX3N1cmZhY2Vfc2l6ZSArIDEyOCArCisJCXR0bV9yb3VuZF9wb3QobnVtX3NpemVzICogc2l6ZW9mKHN0cnVjdCBkcm1fdm13X3NpemUpKSArCisJCXR0bV9yb3VuZF9wb3QobnVtX3NpemVzICogc2l6ZW9mKHN0cnVjdCB2bXdfc3VyZmFjZV9vZmZzZXQpKTsKKworCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkJICAgc2l6ZSwgZmFsc2UsIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIk91dCBvZiBncmFwaGljcyBtZW1vcnkgZm9yIHN1cmZhY2UiCisJCQkJICAiIGNyZWF0aW9uLlxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl1c2VyX3NyZiA9IGttYWxsb2Moc2l6ZW9mKCp1c2VyX3NyZiksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSh1c2VyX3NyZiA9PSBOVUxMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub191c2VyX3NyZjsKKwl9CiAKIAlzcmYgPSAmdXNlcl9zcmYtPnNyZjsKIAlyZXMgPSAmc3JmLT5yZXM7CkBAIC01NzksMjEgKzEzMTgsMjIgQEAKIAlzcmYtPmZsYWdzID0gcmVxLT5mbGFnczsKIAlzcmYtPmZvcm1hdCA9IHJlcS0+Zm9ybWF0OwogCXNyZi0+c2Nhbm91dCA9IHJlcS0+c2Nhbm91dDsKLQltZW1jcHkoc3JmLT5taXBfbGV2ZWxzLCByZXEtPm1pcF9sZXZlbHMsIHNpemVvZihzcmYtPm1pcF9sZXZlbHMpKTsKLQlzcmYtPm51bV9zaXplcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVM7ICsraSkKLQkJc3JmLT5udW1fc2l6ZXMgKz0gc3JmLT5taXBfbGV2ZWxzW2ldOworCXNyZi0+YmFja3VwID0gTlVMTDsKIAotCWlmIChzcmYtPm51bV9zaXplcyA+IERSTV9WTVdfTUFYX1NVUkZBQ0VfRkFDRVMgKgotCSAgICBEUk1fVk1XX01BWF9NSVBfTEVWRUxTKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2VycjA7Ci0JfQorCW1lbWNweShzcmYtPm1pcF9sZXZlbHMsIHJlcS0+bWlwX2xldmVscywgc2l6ZW9mKHNyZi0+bWlwX2xldmVscykpOworCXNyZi0+bnVtX3NpemVzID0gbnVtX3NpemVzOworCXVzZXJfc3JmLT5zaXplID0gc2l6ZTsKIAogCXNyZi0+c2l6ZXMgPSBrbWFsbG9jKHNyZi0+bnVtX3NpemVzICogc2l6ZW9mKCpzcmYtPnNpemVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KHNyZi0+c2l6ZXMgPT0gTlVMTCkpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfZXJyMDsKKwkJZ290byBvdXRfbm9fc2l6ZXM7CisJfQorCXNyZi0+b2Zmc2V0cyA9IGttYWxsb2Moc3JmLT5udW1fc2l6ZXMgKiBzaXplb2YoKnNyZi0+b2Zmc2V0cyksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KHNyZi0+c2l6ZXMgPT0gTlVMTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fb2Zmc2V0czsKIAl9CiAKIAl1c2VyX3NpemVzID0gKHN0cnVjdCBkcm1fdm13X3NpemUgX191c2VyICopKHVuc2lnbmVkIGxvbmcpCkBAIC02MDMsOSArMTM0MywzMiBAQAogCQkJICAgICBzcmYtPm51bV9zaXplcyAqIHNpemVvZigqc3JmLT5zaXplcykpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBvdXRfZXJyMTsKKwkJZ290byBvdXRfbm9fY29weTsKIAl9CiAKKwljdXJfYm9fb2Zmc2V0ID0gMDsKKwljdXJfb2Zmc2V0ID0gc3JmLT5vZmZzZXRzOworCWN1cl9zaXplID0gc3JmLT5zaXplczsKKworCWJwcCA9IHZtd19zZl9icHBbc3JmLT5mb3JtYXRdLmJwcDsKKwlzdHJpZGVfYnBwID0gdm13X3NmX2JwcFtzcmYtPmZvcm1hdF0uc19icHA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFJNX1ZNV19NQVhfU1VSRkFDRV9GQUNFUzsgKytpKSB7CisJCWZvciAoaiA9IDA7IGogPCBzcmYtPm1pcF9sZXZlbHNbaV07ICsraikgeworCQkJdWludDMyX3Qgc3RyaWRlID0KKwkJCQkoY3VyX3NpemUtPndpZHRoICogc3RyaWRlX2JwcCArIDcpID4+IDM7CisKKwkJCWN1cl9vZmZzZXQtPmZhY2UgPSBpOworCQkJY3VyX29mZnNldC0+bWlwID0gajsKKwkJCWN1cl9vZmZzZXQtPmJvX29mZnNldCA9IGN1cl9ib19vZmZzZXQ7CisJCQljdXJfYm9fb2Zmc2V0ICs9IHN0cmlkZSAqIGN1cl9zaXplLT5oZWlnaHQgKgorCQkJCWN1cl9zaXplLT5kZXB0aCAqIGJwcCAvIHN0cmlkZV9icHA7CisJCQkrK2N1cl9vZmZzZXQ7CisJCQkrK2N1cl9zaXplOworCQl9CisJfQorCXNyZi0+YmFja3VwX3NpemUgPSBjdXJfYm9fb2Zmc2V0OworCiAJaWYgKHNyZi0+c2Nhbm91dCAmJgogCSAgICBzcmYtPm51bV9zaXplcyA9PSAxICYmCiAJICAgIHNyZi0+c2l6ZXNbMF0ud2lkdGggPT0gNjQgJiYKQEAgLTYxNyw3ICsxMzgwLDcgQEAKIAkJaWYgKCFzcmYtPnNub29wZXIuaW1hZ2UpIHsKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGN1cnNvcl9pbWFnZVxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfZXJyMTsKKwkJCWdvdG8gb3V0X25vX2NvcHk7CiAJCX0KIAl9IGVsc2UgewogCQlzcmYtPnNub29wZXIuaW1hZ2UgPSBOVUxMOwpAQCAtNjM0LDcgKzEzOTcsNyBAQAogCiAJcmV0ID0gdm13X3N1cmZhY2VfaW5pdChkZXZfcHJpdiwgc3JmLCB2bXdfdXNlcl9zdXJmYWNlX2ZyZWUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCXRtcCA9IHZtd19yZXNvdXJjZV9yZWZlcmVuY2UoJnNyZi0+cmVzKTsKIAlyZXQgPSB0dG1fYmFzZV9vYmplY3RfaW5pdCh0ZmlsZSwgJnVzZXJfc3JmLT5iYXNlLApAQCAtNjQ0LDcgKzE0MDcsNyBAQAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZ0bXApOwogCQl2bXdfcmVzb3VyY2VfdW5yZWZlcmVuY2UoJnJlcyk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIAlyZXAtPnNpZCA9IHVzZXJfc3JmLT5iYXNlLmhhc2gua2V5OwpAQCAtNjUyLDExICsxNDE1LDE5IEBACiAJCURSTV9FUlJPUigiQ3JlYXRlZCBiYWQgU3VyZmFjZSBJRC5cbiIpOwogCiAJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOworCisJdHRtX3JlYWRfdW5sb2NrKCZ2bWFzdGVyLT5sb2NrKTsKIAlyZXR1cm4gMDsKLW91dF9lcnIxOgorb3V0X25vX2NvcHk6CisJa2ZyZWUoc3JmLT5vZmZzZXRzKTsKK291dF9ub19vZmZzZXRzOgogCWtmcmVlKHNyZi0+c2l6ZXMpOwotb3V0X2VycjA6CitvdXRfbm9fc2l6ZXM6CiAJa2ZyZWUodXNlcl9zcmYpOworb3V0X25vX3VzZXJfc3JmOgorCXR0bV9tZW1fZ2xvYmFsX2ZyZWUodm13X21lbV9nbG9iKGRldl9wcml2KSwgc2l6ZSk7CitvdXRfdW5sb2NrOgorCXR0bV9yZWFkX3VubG9jaygmdm1hc3Rlci0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTcwLDcgKzE3NDEsNyBAQAogCWludCByZXQ7CiAKIAlyZXQgPSB2bXdfcmVzb3VyY2VfaW5pdChkZXZfcHJpdiwgcmVzLCAmZGV2X3ByaXYtPnN0cmVhbV9pZHIsCi0JCQkJVk1XX1JFU19TVFJFQU0sIHJlc19mcmVlKTsKKwkJCQlWTVdfUkVTX1NUUkVBTSwgZmFsc2UsIHJlc19mcmVlLCBOVUxMKTsKIAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJaWYgKHJlc19mcmVlID09IE5VTEwpCkBAIC0xMDAwLDggKzE3NzEsMTEgQEAKIHsKIAlzdHJ1Y3Qgdm13X3VzZXJfc3RyZWFtICpzdHJlYW0gPQogCSAgICBjb250YWluZXJfb2YocmVzLCBzdHJ1Y3Qgdm13X3VzZXJfc3RyZWFtLCBzdHJlYW0ucmVzKTsKKwlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gcmVzLT5kZXZfcHJpdjsKIAogCWtmcmVlKHN0cmVhbSk7CisJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJICAgIHZtd191c2VyX3N0cmVhbV9zaXplKTsKIH0KIAogLyoqCkBAIC0xMDU1LDIzICsxODI5LDU2IEBACiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2ID0gdm13X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdm13X3VzZXJfc3RyZWFtICpzdHJlYW0gPSBrbWFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHZtd191c2VyX3N0cmVhbSAqc3RyZWFtOwogCXN0cnVjdCB2bXdfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3Qgdm13X3Jlc291cmNlICp0bXA7CiAJc3RydWN0IGRybV92bXdfc3RyZWFtX2FyZyAqYXJnID0gKHN0cnVjdCBkcm1fdm13X3N0cmVhbV9hcmcgKilkYXRhOwogCXN0cnVjdCB0dG1fb2JqZWN0X2ZpbGUgKnRmaWxlID0gdm13X2Zwcml2KGZpbGVfcHJpdiktPnRmaWxlOworCXN0cnVjdCB2bXdfbWFzdGVyICp2bWFzdGVyID0gdm13X21hc3RlcihmaWxlX3ByaXYtPm1hc3Rlcik7CiAJaW50IHJldDsKIAotCWlmICh1bmxpa2VseShzdHJlYW0gPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOworCS8qCisJICogQXBwcm94aW1hdGUgaWRyIG1lbW9yeSB1c2FnZSB3aXRoIDEyOCBieXRlcy4gSXQgd2lsbCBiZSBsaW1pdGVkCisJICogYnkgbWF4aW11bSBudW1iZXJfb2Ygc3RyZWFtcyBhbnl3YXk/CisJICovCisKKwlpZiAodW5saWtlbHkodm13X3VzZXJfc3RyZWFtX3NpemUgPT0gMCkpCisJCXZtd191c2VyX3N0cmVhbV9zaXplID0gdHRtX3JvdW5kX3BvdChzaXplb2YoKnN0cmVhbSkpICsgMTI4OworCisJcmV0ID0gdHRtX3JlYWRfbG9jaygmdm1hc3Rlci0+bG9jaywgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jKHZtd19tZW1fZ2xvYihkZXZfcHJpdiksCisJCQkJICAgdm13X3VzZXJfc3RyZWFtX3NpemUsCisJCQkJICAgZmFsc2UsIHRydWUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlEUk1fRVJST1IoIk91dCBvZiBncmFwaGljcyBtZW1vcnkgZm9yIHN0cmVhbSIKKwkJCQkgICIgY3JlYXRpb24uXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCisJc3RyZWFtID0ga21hbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShzdHJlYW0gPT0gTlVMTCkpIHsKKwkJdHRtX21lbV9nbG9iYWxfZnJlZSh2bXdfbWVtX2dsb2IoZGV2X3ByaXYpLAorCQkJCSAgICB2bXdfdXNlcl9zdHJlYW1fc2l6ZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAKIAlyZXMgPSAmc3RyZWFtLT5zdHJlYW0ucmVzOwogCXN0cmVhbS0+YmFzZS5zaGFyZWFibGUgPSBmYWxzZTsKIAlzdHJlYW0tPmJhc2UudGZpbGUgPSBOVUxMOwogCisJLyoKKwkgKiBGcm9tIGhlcmUgb24sIHRoZSBkZXN0cnVjdG9yIHRha2VzIG92ZXIgcmVzb3VyY2UgZnJlZWluZy4KKwkgKi8KKwogCXJldCA9IHZtd19zdHJlYW1faW5pdChkZXZfcHJpdiwgJnN0cmVhbS0+c3RyZWFtLCB2bXdfdXNlcl9zdHJlYW1fZnJlZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJdG1wID0gdm13X3Jlc291cmNlX3JlZmVyZW5jZShyZXMpOwogCXJldCA9IHR0bV9iYXNlX29iamVjdF9pbml0KHRmaWxlLCAmc3RyZWFtLT5iYXNlLCBmYWxzZSwgVk1XX1JFU19TVFJFQU0sCkBAIC0xMDg1LDYgKzE4OTIsOCBAQAogCWFyZy0+c3RyZWFtX2lkID0gcmVzLT5pZDsKIG91dF9lcnI6CiAJdm13X3Jlc291cmNlX3VucmVmZXJlbmNlKCZyZXMpOworb3V0X3VubG9jazoKKwl0dG1fcmVhZF91bmxvY2soJnZtYXN0ZXItPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Njcm4uYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Njcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVmZGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfc2Nybi5jCkBAIC0wLDAgKzEsNTM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInZtd2dmeF9rbXMuaCIKKworCisjZGVmaW5lIHZtd19jcnRjX3RvX3NvdSh4KSBcCisJY29udGFpbmVyX29mKHgsIHN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0LCBiYXNlLmNydGMpCisjZGVmaW5lIHZtd19lbmNvZGVyX3RvX3NvdSh4KSBcCisJY29udGFpbmVyX29mKHgsIHN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0LCBiYXNlLmVuY29kZXIpCisjZGVmaW5lIHZtd19jb25uZWN0b3JfdG9fc291KHgpIFwKKwljb250YWluZXJfb2YoeCwgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQsIGJhc2UuY29ubmVjdG9yKQorCitzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfZGlzcGxheSB7CisJdW5zaWduZWQgbnVtX2ltcGxpY2l0OworCisJc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqaW1wbGljaXRfZmI7Cit9OworCisvKioKKyAqIERpc3BsYXkgdW5pdCB1c2luZyBzY3JlZW4gb2JqZWN0cy4KKyAqLworc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgeworCXN0cnVjdCB2bXdfZGlzcGxheV91bml0IGJhc2U7CisKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zaXplOyAvKio8IFNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLworCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYnVmZmVyOyAvKio8IEJhY2tpbmcgc3RvcmUgYnVmZmVyICovCisKKwlib29sIGRlZmluZWQ7CisJYm9vbCBhY3RpdmVfaW1wbGljaXQ7Cit9OworCitzdGF0aWMgdm9pZCB2bXdfc291X2Rlc3Ryb3koc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSkKK3sKKwl2bXdfZGlzcGxheV91bml0X2NsZWFudXAoJnNvdS0+YmFzZSk7CisJa2ZyZWUoc291KTsKK30KKworCisvKgorICogU2NyZWVuIE9iamVjdCBEaXNwbGF5IFVuaXQgQ1JUQyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCB2bXdfc291X2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJdm13X3NvdV9kZXN0cm95KHZtd19jcnRjX3RvX3NvdShjcnRjKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtd19zb3VfZGVsX2FjdGl2ZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKnZtd19wcml2LAorCQkJICAgICAgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSkKK3sKKwlzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfZGlzcGxheSAqbGQgPSB2bXdfcHJpdi0+c291X3ByaXY7CisKKwlpZiAoc291LT5hY3RpdmVfaW1wbGljaXQpIHsKKwkJaWYgKC0tKGxkLT5udW1faW1wbGljaXQpID09IDApCisJCQlsZC0+aW1wbGljaXRfZmIgPSBOVUxMOworCQlzb3UtPmFjdGl2ZV9pbXBsaWNpdCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgdm13X3NvdV9hZGRfYWN0aXZlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqdm13X3ByaXYsCisJCQkgICAgICBzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291LAorCQkJICAgICAgc3RydWN0IHZtd19mcmFtZWJ1ZmZlciAqdmZiKQoreworCXN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF9kaXNwbGF5ICpsZCA9IHZtd19wcml2LT5zb3VfcHJpdjsKKworCUJVR19PTighbGQtPm51bV9pbXBsaWNpdCAmJiBsZC0+aW1wbGljaXRfZmIpOworCisJaWYgKCFzb3UtPmFjdGl2ZV9pbXBsaWNpdCAmJiBzb3UtPmJhc2UuaXNfaW1wbGljaXQpIHsKKwkJbGQtPmltcGxpY2l0X2ZiID0gdmZiOworCQlzb3UtPmFjdGl2ZV9pbXBsaWNpdCA9IHRydWU7CisJCWxkLT5udW1faW1wbGljaXQrKzsKKwl9Cit9CisKKy8qKgorICogU2VuZCB0aGUgZmlmbyBjb21tYW5kIHRvIGNyZWF0ZSBhIHNjcmVlbi4KKyAqLworc3RhdGljIGludCB2bXdfc291X2ZpZm9fY3JlYXRlKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgICAgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSwKKwkJCSAgICAgICB1aW50MzJfdCB4LCB1aW50MzJfdCB5LAorCQkJICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXNpemVfdCBmaWZvX3NpemU7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgY21kVHlwZTsKKwkJfSBoZWFkZXI7CisJCVNWR0FTY3JlZW5PYmplY3Qgb2JqOworCX0gKmNtZDsKKworCUJVR19PTighc291LT5idWZmZXIpOworCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisJLyogVGhlIGhhcmR3YXJlIGhhcyBodW5nLCBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdCBoZXJlLiAqLworCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJGaWZvIHJlc2VydmUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CisJY21kLT5oZWFkZXIuY21kVHlwZSA9IFNWR0FfQ01EX0RFRklORV9TQ1JFRU47CisJY21kLT5vYmouc3RydWN0U2l6ZSA9IHNpemVvZihTVkdBU2NyZWVuT2JqZWN0KTsKKwljbWQtPm9iai5pZCA9IHNvdS0+YmFzZS51bml0OworCWNtZC0+b2JqLmZsYWdzID0gU1ZHQV9TQ1JFRU5fSEFTX1JPT1QgfAorCQkoc291LT5iYXNlLnVuaXQgPT0gMCA/IFNWR0FfU0NSRUVOX0lTX1BSSU1BUlkgOiAwKTsKKwljbWQtPm9iai5zaXplLndpZHRoID0gbW9kZS0+aGRpc3BsYXk7CisJY21kLT5vYmouc2l6ZS5oZWlnaHQgPSBtb2RlLT52ZGlzcGxheTsKKwlpZiAoc291LT5iYXNlLmlzX2ltcGxpY2l0KSB7CisJCWNtZC0+b2JqLnJvb3QueCA9IHg7CisJCWNtZC0+b2JqLnJvb3QueSA9IHk7CisJfSBlbHNlIHsKKwkJY21kLT5vYmoucm9vdC54ID0gc291LT5iYXNlLmd1aV94OworCQljbWQtPm9iai5yb290LnkgPSBzb3UtPmJhc2UuZ3VpX3k7CisJfQorCisJLyogT2sgdG8gYXNzdW1lIHRoYXQgYnVmZmVyIGlzIHBpbm5lZCBpbiB2cmFtICovCisJdm13X2JvX2dldF9ndWVzdF9wdHIoJnNvdS0+YnVmZmVyLT5iYXNlLCAmY21kLT5vYmouYmFja2luZ1N0b3JlLnB0cik7CisJY21kLT5vYmouYmFja2luZ1N0b3JlLnBpdGNoID0gbW9kZS0+aGRpc3BsYXkgKiA0OworCisJdm13X2ZpZm9fY29tbWl0KGRldl9wcml2LCBmaWZvX3NpemUpOworCisJc291LT5kZWZpbmVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFNlbmQgdGhlIGZpZm8gY29tbWFuZCB0byBkZXN0cm95IGEgc2NyZWVuLgorICovCitzdGF0aWMgaW50IHZtd19zb3VfZmlmb19kZXN0cm95KHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSkKK3sKKwlzaXplX3QgZmlmb19zaXplOworCWludCByZXQ7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgY21kVHlwZTsKKwkJfSBoZWFkZXI7CisJCVNWR0FGaWZvQ21kRGVzdHJveVNjcmVlbiBib2R5OworCX0gKmNtZDsKKworCS8qIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KKwlpZiAodW5saWtlbHkoIXNvdS0+ZGVmaW5lZCkpCisJCXJldHVybiAwOworCisJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpOworCWNtZCA9IHZtd19maWZvX3Jlc2VydmUoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisJLyogdGhlIGhhcmR3YXJlIGhhcyBodW5nLCBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdCBoZXJlICovCisJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgeworCQlEUk1fRVJST1IoIkZpZm8gcmVzZXJ2ZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNtZCwgMCwgZmlmb19zaXplKTsKKwljbWQtPmhlYWRlci5jbWRUeXBlID0gU1ZHQV9DTURfREVTVFJPWV9TQ1JFRU47CisJY21kLT5ib2R5LnNjcmVlbklkID0gc291LT5iYXNlLnVuaXQ7CisKKwl2bXdfZmlmb19jb21taXQoZGV2X3ByaXYsIGZpZm9fc2l6ZSk7CisKKwkvKiBGb3JjZSBzeW5jICovCisJcmV0ID0gdm13X2ZhbGxiYWNrX3dhaXQoZGV2X3ByaXYsIGZhbHNlLCB0cnVlLCAwLCBmYWxzZSwgMypIWik7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gc3luYyB3aXRoIEhXIik7CisJZWxzZQorCQlzb3UtPmRlZmluZWQgPSBmYWxzZTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogRnJlZSB0aGUgYmFja2luZyBzdG9yZS4KKyAqLworc3RhdGljIHZvaWQgdm13X3NvdV9iYWNraW5nX2ZyZWUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgc3RydWN0IHZtd19zY3JlZW5fb2JqZWN0X3VuaXQgKnNvdSkKK3sKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOworCisJaWYgKHVubGlrZWx5KHNvdS0+YnVmZmVyID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlibyA9ICZzb3UtPmJ1ZmZlci0+YmFzZTsKKwl0dG1fYm9fdW5yZWYoJmJvKTsKKwlzb3UtPmJ1ZmZlciA9IE5VTEw7CisJc291LT5idWZmZXJfc2l6ZSA9IDA7Cit9CisKKy8qKgorICogQWxsb2NhdGUgdGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgdm13X3NvdV9iYWNraW5nX2FsbG9jKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJIHN0cnVjdCB2bXdfc2NyZWVuX29iamVjdF91bml0ICpzb3UsCisJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHNvdS0+YnVmZmVyX3NpemUgPT0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc291LT5idWZmZXIpCisJCXZtd19zb3VfYmFja2luZ19mcmVlKGRldl9wcml2LCBzb3UpOworCisJc291LT5idWZmZXIgPSBremFsbG9jKHNpemVvZigqc291LT5idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoc291LT5idWZmZXIgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWZ0ZXIgd2UgaGF2ZSBhbGxvY2VkIHRoZSBiYWNraW5nIHN0b3JlIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCisJICogcmVzdW1lIHRoZSBvdmVybGF5cywgdGhpcyBpcyBwcmVmZXJyZWQgdG8gZmFpbGluZyB0byBhbGxvYy4KKwkgKi8KKwl2bXdfb3ZlcmxheV9wYXVzZV9hbGwoZGV2X3ByaXYpOworCXJldCA9IHZtd19kbWFidWZfaW5pdChkZXZfcHJpdiwgc291LT5idWZmZXIsIHNpemUsCisJCQkgICAgICAmdm13X3ZyYW1fbmVfcGxhY2VtZW50LAorCQkJICAgICAgZmFsc2UsICZ2bXdfZG1hYnVmX2JvX2ZyZWUpOworCXZtd19vdmVybGF5X3Jlc3VtZV9hbGwoZGV2X3ByaXYpOworCisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJc291LT5idWZmZXIgPSBOVUxMOyAvKiB2bXdfZG1hYnVmX2luaXQgZnJlZXMgb24gZXJyb3IgKi8KKwllbHNlCisJCXNvdS0+YnVmZmVyX3NpemUgPSBzaXplOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bXdfc291X2NydGNfc2V0X2NvbmZpZyhzdHJ1Y3QgZHJtX21vZGVfc2V0ICpzZXQpCit7CisJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCB2bXdfZnJhbWVidWZmZXIgKnZmYjsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNldC0+Y3J0YykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBnZXQgdGhlIHNvdSAqLworCWNydGMgPSBzZXQtPmNydGM7CisJc291ID0gdm13X2NydGNfdG9fc291KGNydGMpOworCXZmYiA9IHNldC0+ZmIgPyB2bXdfZnJhbWVidWZmZXJfdG9fdmZiKHNldC0+ZmIpIDogTlVMTDsKKwlkZXZfcHJpdiA9IHZtd19wcml2KGNydGMtPmRldik7CisKKwlpZiAoc2V0LT5udW1fY29ubmVjdG9ycyA+IDEpIHsKKwkJRFJNX0VSUk9SKCJ0byBtYW55IGNvbm5lY3RvcnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc2V0LT5udW1fY29ubmVjdG9ycyA9PSAxICYmCisJICAgIHNldC0+Y29ubmVjdG9yc1swXSAhPSAmc291LT5iYXNlLmNvbm5lY3RvcikgeworCQlEUk1fRVJST1IoImNvbm5lY3RvciBkb2Vzbid0IG1hdGNoICVwICVwXG4iLAorCQkJc2V0LT5jb25uZWN0b3JzWzBdLCAmc291LT5iYXNlLmNvbm5lY3Rvcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNvdSBvbmx5IHN1cHBvcnRzIG9uZSBmYiBhY3RpdmUgYXQgdGhlIHRpbWUgKi8KKwlpZiAoc291LT5iYXNlLmlzX2ltcGxpY2l0ICYmCisJICAgIGRldl9wcml2LT5zb3VfcHJpdi0+aW1wbGljaXRfZmIgJiYgdmZiICYmCisJICAgICEoZGV2X3ByaXYtPnNvdV9wcml2LT5udW1faW1wbGljaXQgPT0gMSAmJgorCSAgICAgIHNvdS0+YWN0aXZlX2ltcGxpY2l0KSAmJgorCSAgICBkZXZfcHJpdi0+c291X3ByaXYtPmltcGxpY2l0X2ZiICE9IHZmYikgeworCQlEUk1fRVJST1IoIk11bHRpcGxlIGZyYW1lYnVmZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2luY2UgdGhleSBhbHdheXMgbWFwIG9uZSB0byBvbmUgdGhlc2UgYXJlIHNhZmUgKi8KKwljb25uZWN0b3IgPSAmc291LT5iYXNlLmNvbm5lY3RvcjsKKwllbmNvZGVyID0gJnNvdS0+YmFzZS5lbmNvZGVyOworCisJLyogc2hvdWxkIHdlIHR1cm4gdGhlIGNydGMgb2ZmICovCisJaWYgKHNldC0+bnVtX2Nvbm5lY3RvcnMgPT0gMCB8fCAhc2V0LT5tb2RlIHx8ICFzZXQtPmZiKSB7CisJCXJldCA9IHZtd19zb3VfZmlmb19kZXN0cm95KGRldl9wcml2LCBzb3UpOworCQkvKiB0aGUgaGFyZHdhcmUgaGFzIGh1bmcgZG9uJ3QgZG8gYW55dGhpbmcgbW9yZSAqLworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJcmV0dXJuIHJldDsKKworCQljb25uZWN0b3ItPmVuY29kZXIgPSBOVUxMOworCQllbmNvZGVyLT5jcnRjID0gTlVMTDsKKwkJY3J0Yy0+ZmIgPSBOVUxMOworCQljcnRjLT54ID0gMDsKKwkJY3J0Yy0+eSA9IDA7CisKKwkJdm13X3NvdV9kZWxfYWN0aXZlKGRldl9wcml2LCBzb3UpOworCisJCXZtd19zb3VfYmFja2luZ19mcmVlKGRldl9wcml2LCBzb3UpOworCisJCXJldHVybiAwOworCX0KKworCisJLyogd2Ugbm93IGtub3cgd2Ugd2FudCB0byBzZXQgYSBtb2RlICovCisJbW9kZSA9IHNldC0+bW9kZTsKKwlmYiA9IHNldC0+ZmI7CisKKwlpZiAoc2V0LT54ICsgbW9kZS0+aGRpc3BsYXkgPiBmYi0+d2lkdGggfHwKKwkgICAgc2V0LT55ICsgbW9kZS0+dmRpc3BsYXkgPiBmYi0+aGVpZ2h0KSB7CisJCURSTV9FUlJPUigic2V0IG91dHNpZGUgb2YgZnJhbWVidWZmZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2bXdfZmJfb2ZmKGRldl9wcml2KTsKKworCWlmIChtb2RlLT5oZGlzcGxheSAhPSBjcnRjLT5tb2RlLmhkaXNwbGF5IHx8CisJICAgIG1vZGUtPnZkaXNwbGF5ICE9IGNydGMtPm1vZGUudmRpc3BsYXkpIHsKKwkJLyogbm8gbmVlZCB0byBjaGVjayBpZiBkZXB0aCBpcyBkaWZmZXJlbnQsIGJlY2F1c2UgYmFja2luZworCQkgKiBzdG9yZSBkZXB0aCBpcyBmb3JjZWQgdG8gNCBieSB0aGUgZGV2aWNlLgorCQkgKi8KKworCQlyZXQgPSB2bXdfc291X2ZpZm9fZGVzdHJveShkZXZfcHJpdiwgc291KTsKKwkJLyogdGhlIGhhcmR3YXJlIGhhcyBodW5nIGRvbid0IGRvIGFueXRoaW5nIG1vcmUgKi8KKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCXJldHVybiByZXQ7CisKKwkJdm13X3NvdV9iYWNraW5nX2ZyZWUoZGV2X3ByaXYsIHNvdSk7CisJfQorCisJaWYgKCFzb3UtPmJ1ZmZlcikgeworCQkvKiBmb3JjZWQgdG8gZGVwdGggNCBieSB0aGUgZGV2aWNlICovCisJCXNpemVfdCBzaXplID0gbW9kZS0+aGRpc3BsYXkgKiBtb2RlLT52ZGlzcGxheSAqIDQ7CisJCXJldCA9IHZtd19zb3VfYmFja2luZ19hbGxvYyhkZXZfcHJpdiwgc291LCBzaXplKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdm13X3NvdV9maWZvX2NyZWF0ZShkZXZfcHJpdiwgc291LCBzZXQtPngsIHNldC0+eSwgbW9kZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkvKgorCQkgKiBXZSBhcmUgaW4gYSBiaXQgb2YgYSBzaXR1YXRpb24gaGVyZSwgdGhlIGhhcmR3YXJlIGhhcworCQkgKiBodW5nIGFuZCB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgYnVmZmVyIGhhbmdpbmcgb2YKKwkJICogdGhlIHNjcmVlbiBvYmplY3QsIGJlc3QgdGhpbmcgdG8gZG8gaXMgbm90IGRvIGFueXRoaW5nCisJCSAqIGlmIHdlIHdoZXJlIGRlZmluZWQsIGlmIG5vdCBqdXN0IHR1cm4gdGhlIGNydGMgb2YuCisJCSAqIE5vdCB3aGF0IHVzZXJzcGFjZSB3YW50cyBidXQgaXQgbmVlZHMgdG8gaHRmdS4KKwkJICovCisJCWlmIChzb3UtPmRlZmluZWQpCisJCQlyZXR1cm4gcmV0OworCisJCWNvbm5lY3Rvci0+ZW5jb2RlciA9IE5VTEw7CisJCWVuY29kZXItPmNydGMgPSBOVUxMOworCQljcnRjLT5mYiA9IE5VTEw7CisJCWNydGMtPnggPSAwOworCQljcnRjLT55ID0gMDsKKworCQlyZXR1cm4gcmV0OworCX0KKworCXZtd19zb3VfYWRkX2FjdGl2ZShkZXZfcHJpdiwgc291LCB2ZmIpOworCisJY29ubmVjdG9yLT5lbmNvZGVyID0gZW5jb2RlcjsKKwllbmNvZGVyLT5jcnRjID0gY3J0YzsKKwljcnRjLT5tb2RlID0gKm1vZGU7CisJY3J0Yy0+ZmIgPSBmYjsKKwljcnRjLT54ID0gc2V0LT54OworCWNydGMtPnkgPSBzZXQtPnk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY3J0Y19mdW5jcyB2bXdfc2NyZWVuX29iamVjdF9jcnRjX2Z1bmNzID0geworCS5zYXZlID0gdm13X2R1X2NydGNfc2F2ZSwKKwkucmVzdG9yZSA9IHZtd19kdV9jcnRjX3Jlc3RvcmUsCisJLmN1cnNvcl9zZXQgPSB2bXdfZHVfY3J0Y19jdXJzb3Jfc2V0LAorCS5jdXJzb3JfbW92ZSA9IHZtd19kdV9jcnRjX2N1cnNvcl9tb3ZlLAorCS5nYW1tYV9zZXQgPSB2bXdfZHVfY3J0Y19nYW1tYV9zZXQsCisJLmRlc3Ryb3kgPSB2bXdfc291X2NydGNfZGVzdHJveSwKKwkuc2V0X2NvbmZpZyA9IHZtd19zb3VfY3J0Y19zZXRfY29uZmlnLAorfTsKKworLyoKKyAqIFNjcmVlbiBPYmplY3QgRGlzcGxheSBVbml0IGVuY29kZXIgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgdm13X3NvdV9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXZtd19zb3VfZGVzdHJveSh2bXdfZW5jb2Rlcl90b19zb3UoZW5jb2RlcikpOworfQorCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIHZtd19zY3JlZW5fb2JqZWN0X2VuY29kZXJfZnVuY3MgPSB7CisJLmRlc3Ryb3kgPSB2bXdfc291X2VuY29kZXJfZGVzdHJveSwKK307CisKKy8qCisgKiBTY3JlZW4gT2JqZWN0IERpc3BsYXkgVW5pdCBjb25uZWN0b3IgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgdm13X3NvdV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXZtd19zb3VfZGVzdHJveSh2bXdfY29ubmVjdG9yX3RvX3NvdShjb25uZWN0b3IpKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIHZtd19sZWdhY3lfY29ubmVjdG9yX2Z1bmNzID0geworCS5kcG1zID0gdm13X2R1X2Nvbm5lY3Rvcl9kcG1zLAorCS5zYXZlID0gdm13X2R1X2Nvbm5lY3Rvcl9zYXZlLAorCS5yZXN0b3JlID0gdm13X2R1X2Nvbm5lY3Rvcl9yZXN0b3JlLAorCS5kZXRlY3QgPSB2bXdfZHVfY29ubmVjdG9yX2RldGVjdCwKKwkuZmlsbF9tb2RlcyA9IHZtd19kdV9jb25uZWN0b3JfZmlsbF9tb2RlcywKKwkuc2V0X3Byb3BlcnR5ID0gdm13X2R1X2Nvbm5lY3Rvcl9zZXRfcHJvcGVydHksCisJLmRlc3Ryb3kgPSB2bXdfc291X2Nvbm5lY3Rvcl9kZXN0cm95LAorfTsKKworc3RhdGljIGludCB2bXdfc291X2luaXQoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwgdW5zaWduZWQgdW5pdCkKK3sKKwlzdHJ1Y3Qgdm13X3NjcmVlbl9vYmplY3RfdW5pdCAqc291OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKworCXNvdSA9IGt6YWxsb2Moc2l6ZW9mKCpzb3UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb3UtPmJhc2UudW5pdCA9IHVuaXQ7CisJY3J0YyA9ICZzb3UtPmJhc2UuY3J0YzsKKwllbmNvZGVyID0gJnNvdS0+YmFzZS5lbmNvZGVyOworCWNvbm5lY3RvciA9ICZzb3UtPmJhc2UuY29ubmVjdG9yOworCisJc291LT5hY3RpdmVfaW1wbGljaXQgPSBmYWxzZTsKKworCXNvdS0+YmFzZS5wcmVmX2FjdGl2ZSA9ICh1bml0ID09IDApOworCXNvdS0+YmFzZS5wcmVmX3dpZHRoID0gODAwOworCXNvdS0+YmFzZS5wcmVmX2hlaWdodCA9IDYwMDsKKwlzb3UtPmJhc2UucHJlZl9tb2RlID0gTlVMTDsKKwlzb3UtPmJhc2UuaXNfaW1wbGljaXQgPSB0cnVlOworCisJZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLCAmdm13X2xlZ2FjeV9jb25uZWN0b3JfZnVuY3MsCisJCQkgICBEUk1fTU9ERV9DT05ORUNUT1JfVklSVFVBTCk7CisJY29ubmVjdG9yLT5zdGF0dXMgPSB2bXdfZHVfY29ubmVjdG9yX2RldGVjdChjb25uZWN0b3IsIHRydWUpOworCisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsICZ2bXdfc2NyZWVuX29iamVjdF9lbmNvZGVyX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VOQ09ERVJfVklSVFVBTCk7CisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKGNvbm5lY3RvciwgZW5jb2Rlcik7CisJZW5jb2Rlci0+cG9zc2libGVfY3J0Y3MgPSAoMSA8PCB1bml0KTsKKwllbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMgPSAwOworCisJZHJtX2NydGNfaW5pdChkZXYsIGNydGMsICZ2bXdfc2NyZWVuX29iamVjdF9jcnRjX2Z1bmNzKTsKKworCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoY3J0YywgMjU2KTsKKworCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkgICAgICBkZXYtPm1vZGVfY29uZmlnLmRpcnR5X2luZm9fcHJvcGVydHksCisJCQkJICAgICAgMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZtd19rbXNfaW5pdF9zY3JlZW5fb2JqZWN0X2Rpc3BsYXkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKwlpbnQgaSwgcmV0OworCisJaWYgKGRldl9wcml2LT5zb3VfcHJpdikgeworCQlEUk1fSU5GTygic291IHN5c3RlbSBhbHJlYWR5IG9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEoZGV2X3ByaXYtPmZpZm8uY2FwYWJpbGl0aWVzICYgU1ZHQV9GSUZPX0NBUF9TQ1JFRU5fT0JKRUNUXzIpKSB7CisJCURSTV9JTkZPKCJOb3QgdXNpbmcgc2NyZWVuIG9iamVjdHMsIgorCQkJICIgbWlzc2luZyBjYXAgU0NSRUVOX09CSkVDVF8yXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcmV0ID0gLUVOT01FTTsKKwlkZXZfcHJpdi0+c291X3ByaXYgPSBrbWFsbG9jKHNpemVvZigqZGV2X3ByaXYtPnNvdV9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFkZXZfcHJpdi0+c291X3ByaXYpKQorCQlnb3RvIGVycl9ub19tZW07CisKKwlkZXZfcHJpdi0+c291X3ByaXYtPm51bV9pbXBsaWNpdCA9IDA7CisJZGV2X3ByaXYtPnNvdV9wcml2LT5pbXBsaWNpdF9mYiA9IE5VTEw7CisKKwlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCBWTVdHRlhfTlVNX0RJU1BMQVlfVU5JVFMpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlyZXQgPSBkcm1fbW9kZV9jcmVhdGVfZGlydHlfaW5mb19wcm9wZXJ0eShkZXYpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gZXJyX3ZibGFua19jbGVhbnVwOworCisJZm9yIChpID0gMDsgaSA8IFZNV0dGWF9OVU1fRElTUExBWV9VTklUUzsgKytpKQorCQl2bXdfc291X2luaXQoZGV2X3ByaXYsIGkpOworCisJRFJNX0lORk8oIlNjcmVlbiBvYmplY3RzIHN5c3RlbSBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX3ZibGFua19jbGVhbnVwOgorCWRybV92YmxhbmtfY2xlYW51cChkZXYpOworZXJyX2ZyZWU6CisJa2ZyZWUoZGV2X3ByaXYtPnNvdV9wcml2KTsKKwlkZXZfcHJpdi0+c291X3ByaXYgPSBOVUxMOworZXJyX25vX21lbToKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdm13X2ttc19jbG9zZV9zY3JlZW5fb2JqZWN0X2Rpc3BsYXkoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKKworCWlmICghZGV2X3ByaXYtPnNvdV9wcml2KQorCQlyZXR1cm4gLUVOT1NZUzsKKworCWRybV92YmxhbmtfY2xlYW51cChkZXYpOworCisJa2ZyZWUoZGV2X3ByaXYtPnNvdV9wcml2KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfdHRtX2dsdWUuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3R0bV9nbHVlLmMKaW5kZXggMWU4ZWVkZC4uZDNjMTFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfdHRtX2dsdWUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF90dG1fZ2x1ZS5jCkBAIC0zNCw5ICszNCw4IEBACiAJc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdjsKIAogCWlmICh1bmxpa2VseSh2bWEtPnZtX3Bnb2ZmIDwgVk1XR0ZYX0ZJTEVfUEFHRV9PRkZTRVQpKSB7Ci0JCWlmICh2bXdfZmlmb19tbWFwKGZpbHAsIHZtYSkgPT0gMCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZHJtX21tYXAoZmlscCwgdm1hKTsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIGF0dGVtcHQgdG8gbW1hcCBvbGQgZmlmbyBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlmaWxlX3ByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYyBiL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCmluZGV4IDliYzdiMDMuLjI5OWQyMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCkBAIC0xODMsOSArMTgzLDYgQEAKIAkJaWYgKGhpZC0+cHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kgJiYKIAkJCQloaWQtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKQogCQkJdGFibGUgPSBtYWNib29rYWlyX2ZuX2tleXM7Ci0JCWVsc2UgaWYgKGhpZC0+cHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2X0FOU0kgJiYKLQkJCQloaWQtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNl9KSVMpCi0JCQl0YWJsZSA9IG1hY2Jvb2thaXJfZm5fa2V5czsKIAkJZWxzZSBpZiAoaGlkLT5wcm9kdWN0IDwgMHgyMWQgfHwgaGlkLT5wcm9kdWN0ID49IDB4MzAwKQogCQkJdGFibGUgPSBwb3dlcmJvb2tfZm5fa2V5czsKIAkJZWxzZQpAQCAtNDU4LDYgKzQ1NSw5IEBACiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19JU08pLAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB8CiAJCQlBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMTFfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfAorCQkJQVBQTEVfSVNPX0tFWUJPQVJEIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU19KSVMpLAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HX0FOU0kpLApAQCAtNTA4LDYgKzUwOCwxMiBAQAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzZBX0pJUyksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX1JERVNDX0pJUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9SREVTQ19KSVMgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfQU5TSSksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYwppbmRleCAzYmRiNDUwLi41YmU4NThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJoaWQtaWRzLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDkxYWRjYzUuLjg0OGE1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMTM2Miw2ICsxMzYyLDkgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSklTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfUkVWQl9BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfUkVWQl9JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9SRVZCX0pJUykgfSwKQEAgLTEzNzQsNiArMTM3Nyw3IEBACiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kpIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTykgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSklTKSB9LAorCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAxMV9JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVNVUywgVVNCX0RFVklDRV9JRF9BU1VTX1Q5MU1UKSB9LApAQCAtMTk0Miw2ICsxOTQ2LDkgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNV9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNUFfSklTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNl9BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNl9JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2X0pJUykgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jIGIvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMKaW5kZXggOWEyNDNjYS4uZWU4MGQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRyLmMgYi9kcml2ZXJzL2hpZC9oaWQtZHIuYwppbmRleCA2MWVlY2U0Li5lODMyZjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZHIuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZHIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYwppbmRleCBhNWRjMTNmLi45YmRkZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJoaWQtaWRzLmgiCiAjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWdhZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMKaW5kZXggMjc5YmE1My4uZjFlMWJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWdhZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImhpZC1pZHMuaCIKIAogI2lmZGVmIENPTkZJR19HUkVFTkFTSUFfRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1ob2x0ZWtmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWhvbHRla2ZmLmMKaW5kZXggOTFlM2EwMy4uNGU3NTQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWhvbHRla2ZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWhvbHRla2ZmLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMTY4MGU5OS4uMDZjZTk5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMTEyLDYgKzExMiw5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1JFVkJfQU5TSQkweDAyNGYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfUkVWQl9JU08JMHgwMjUwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1JFVkJfSklTCTB4MDI1MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9BTlNJCTB4MDI1MgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc1QV9JU08JMHgwMjUzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzVBX0pJUwkweDAyNTQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNkFfQU5TSQkweDAyNDkKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNkFfSVNPCTB4MDI0YQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc2QV9KSVMJMHgwMjRiCkBAIC0xMjEsNiArMTI0LDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9BTlNJICAweDAyMzkKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9JU08gICAweDAyM2EKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9KSVMgICAweDAyM2IKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAxMV9JU08gICAweDAyNTYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZCTB4MDMwYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWQkweDAzMGIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9BVFZfSVJDT05UUk9MCTB4ODI0MQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYyBiL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKaW5kZXggZmE1ZDdhMS4uZjFjOTA5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCkBAIC0yOTEsNyArMjkxLDYgQEAKIAkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwogCQkJdGQtPmxhc3RfZmllbGRfaW5kZXggPSBmaWVsZC0+aW5kZXg7CiAJCQl0ZC0+bGFzdF9tdF9jb2xsZWN0aW9uID0gdXNhZ2UtPmNvbGxlY3Rpb25faW5kZXg7Ci0JCQloZGV2LT5xdWlya3MgJj0gfkhJRF9RVUlSS19NVUxUSVRPVUNIOwogCQkJcmV0dXJuIDE7CiAJCWNhc2UgSElEX0RHX1dJRFRIOgogCQkJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LApAQCAtNTMwLDQ0ICs1MjksMTIgQEAKIAl9CiB9CiAKLS8qIGEgbGlzdCBvZiBkZXZpY2VzIGZvciB3aGljaCB0aGVyZSBpcyBhIHNwZWNpYWxpemVkIG11bHRpdG91Y2ggZHJpdmVyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgbXRfaGF2ZV9zcGVjaWFsX2RyaXZlcltdID0gewotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OVFJJRywgMHgwMDAxKSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OVFJJRywgMHgwMDA2KSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9RVUFOVEEsCi0JCQlVU0JfREVWSUNFX0lEX1BJWEFSVF9JTUFHSU5HX0lOQ19PUFRJQ0FMX1RPVUNIX1NDUkVFTikgfSwKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUVVBTlRBLAotCQkJVVNCX0RFVklDRV9JRF9RVUFOVEFfT1BUSUNBTF9UT1VDSCkgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBib29sIG10X21hdGNoX29uZV9pZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKLQkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQotewotCXJldHVybiBpZC0+YnVzID09IGhkZXYtPmJ1cyAmJgotCQkoaWQtPnZlbmRvciA9PSBISURfQU5ZX0lEIHx8IGlkLT52ZW5kb3IgPT0gaGRldi0+dmVuZG9yKSAmJgotCQkoaWQtPnByb2R1Y3QgPT0gSElEX0FOWV9JRCB8fCBpZC0+cHJvZHVjdCA9PSBoZGV2LT5wcm9kdWN0KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICptdF9tYXRjaF9pZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKLQkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQotewotCWZvciAoOyBpZC0+YnVzOyBpZCsrKQotCQlpZiAobXRfbWF0Y2hfb25lX2lkKGhkZXYsIGlkKSkKLQkJCXJldHVybiBpZDsKLQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50IG10X3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgbXRfZGV2aWNlICp0ZDsKIAlzdHJ1Y3QgbXRfY2xhc3MgKm10Y2xhc3MgPSBtdF9jbGFzc2VzOyAvKiBNVF9DTFNfREVGQVVMVCAqLwogCi0JaWYgKG10X21hdGNoX2lkKGhkZXYsIG10X2hhdmVfc3BlY2lhbF9kcml2ZXIpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWZvciAoaSA9IDA7IG10X2NsYXNzZXNbaV0ubmFtZSA7IGkrKykgewogCQlpZiAoaWQtPmRyaXZlcl9kYXRhID09IG10X2NsYXNzZXNbaV0ubmFtZSkgewogCQkJbXRjbGFzcyA9ICYobXRfY2xhc3Nlc1tpXSk7CkBAIC01NzUsNiArNTQyLDEwIEBACiAJCX0KIAl9CiAKKwkvKiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGNvcnJlY3RseSBzdXBwb3J0IGRldmljZXMKKwkgKiB0aGF0IGVtaXQgZXZlbnRzIG92ZXIgc2V2ZXJhbCBISUQgbWVzc2FnZXMuCisJICovCisJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT19JTlBVVF9TWU5DOwogCiAJdGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZCkgewpAQCAtNTkwLDE2ICs1NjEsMTAgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZmFpbDsKIAotCWhkZXYtPnF1aXJrcyB8PSBISURfUVVJUktfTVVMVElUT1VDSDsKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCi0JLyogVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBjb3JyZWN0bHkgc3VwcG9ydCBkZXZpY2VzCi0JICogdGhhdCBlbWl0IGV2ZW50cyBvdmVyIHNldmVyYWwgSElEIG1lc3NhZ2VzLgotCSAqLwotCWhkZXYtPnF1aXJrcyB8PSBISURfUVVJUktfTk9fSU5QVVRfU1lOQzsKLQogCXRkLT5zbG90cyA9IGt6YWxsb2ModGQtPm1heGNvbnRhY3RzICogc2l6ZW9mKHN0cnVjdCBtdF9zbG90KSwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXRkLT5zbG90cykgewpAQCAtNzkzLDEwICs3NTgsNiBAQAogCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1hBVCwKIAkJCVVTQl9ERVZJQ0VfSURfWEFUX0NTUikgfSwKIAotCS8qIFJlc3Qgb2YgdGhlIHdvcmxkICovCi0JeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfREVGQVVMVCwKLQkJSElEX1VTQl9ERVZJQ0UoSElEX0FOWV9JRCwgSElEX0FOWV9JRCkgfSwKLQogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBtdF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCmluZGV4IDE3ODI2OTMuLjAxZTdkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBQSUNPTENEX05BTUUgIlBpY29MQ0QgKGdyYXBoaWMpIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcGwuYyBiL2RyaXZlcnMvaGlkL2hpZC1wbC5jCmluZGV4IDA2ZTUzMDAuLjA3MGY5M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1wbC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wbC5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtY29tbW9uLmMKaW5kZXggZWRmODk4ZC4uYjA3ZTdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1jb21tb24uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWNvbW1vbi5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiaGlkLXJvY2NhdC1jb21tb24uaCIKIAogc3RhdGljIGlubGluZSB1aW50MTZfdCByb2NjYXRfY29tbW9uX2ZlYXR1cmVfcmVwb3J0KHVpbnQ4X3QgcmVwb3J0X2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jCmluZGV4IDU2NjZlNzUuLmI2ODViMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQtcm9jY2F0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgUk9DQ0FUX0ZJUlNUX01JTk9SIDAKICNkZWZpbmUgUk9DQ0FUX01BWF9ERVZJQ0VTIDgKQEAgLTE2MiwyNyArMTYzLDI3IEBACiAKIAlkZXZpY2UgPSBkZXZpY2VzW21pbm9yXTsKIAotCW11dGV4X2xvY2soJmRldmljZS0+cmVhZGVyc19sb2NrKTsKLQogCWlmICghZGV2aWNlKSB7CiAJCXByX2VtZXJnKCJyb2NjYXQgZGV2aWNlIHdpdGggbWlub3IgJWQgZG9lc24ndCBleGlzdFxuIiwgbWlub3IpOwogCQllcnJvciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdF9lcnI7CisJCWdvdG8gZXhpdF9lcnJfZGV2aWNlczsKIAl9CiAKKwltdXRleF9sb2NrKCZkZXZpY2UtPnJlYWRlcnNfbG9jayk7CisKIAlpZiAoIWRldmljZS0+b3BlbisrKSB7CiAJCS8qIHBvd2VyIG9uIGRldmljZSBvbiBhZGRpbmcgZmlyc3QgcmVhZGVyICovCiAJCWVycm9yID0gaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX0ZVTExPTik7CiAJCWlmIChlcnJvciA8IDApIHsKIAkJCS0tZGV2aWNlLT5vcGVuOwotCQkJZ290byBleGl0X2VycjsKKwkJCWdvdG8gZXhpdF9lcnJfcmVhZGVyczsKIAkJfQogCiAJCWVycm9yID0gaGlkX2h3X29wZW4oZGV2aWNlLT5oaWQpOwogCQlpZiAoZXJyb3IgPCAwKSB7CiAJCQloaWRfaHdfcG93ZXIoZGV2aWNlLT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKIAkJCS0tZGV2aWNlLT5vcGVuOwotCQkJZ290byBleGl0X2VycjsKKwkJCWdvdG8gZXhpdF9lcnJfcmVhZGVyczsKIAkJfQogCX0KIApAQCAtMTkzLDEzICsxOTQsMTMgQEAKIAlsaXN0X2FkZF90YWlsKCZyZWFkZXItPm5vZGUsICZkZXZpY2UtPnJlYWRlcnMpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHJlYWRlcjsKIAotZXhpdF91bmxvY2s6CitleGl0X2Vycl9yZWFkZXJzOgogCW11dGV4X3VubG9jaygmZGV2aWNlLT5yZWFkZXJzX2xvY2spOworZXhpdF9lcnJfZGV2aWNlczoKIAltdXRleF91bmxvY2soJmRldmljZXNfbG9jayk7CisJaWYgKGVycm9yKQorCQlrZnJlZShyZWFkZXIpOwogCXJldHVybiBlcnJvcjsKLWV4aXRfZXJyOgotCWtmcmVlKHJlYWRlcik7Ci0JZ290byBleGl0X3VubG9jazsKIH0KIAogc3RhdGljIGludCByb2NjYXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zam95LmMgYi9kcml2ZXJzL2hpZC9oaWQtc2pveS5jCmluZGV4IDY3MGRhOTEuLjRiMTQ0ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zam95LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNqb3kuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJoaWQtaWRzLmgiCiAKICNpZmRlZiBDT05GSUdfU01BUlRKT1lQTFVTX0ZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwppbmRleCA1NzU4NjJiLi44M2E5MzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXpwZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKaW5kZXggZjMxZmFiMC4uZjZiYTgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXpwZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJoaWQtaWRzLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCmluZGV4IDRlYTQ2NDEuLjUwMjhkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICIuLi9oaWQtaWRzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggOWIzNDdhYy4uOWVjODU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMzM1LDYgKzMzNSw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX0Y3MTgwNUYKIAl0cmlzdGF0ZSAiRmludGVrIEY3MTgwNUYvRkcsIEY3MTgwNkYvRkcgYW5kIEY3MTg3MkYvRkciCisJZGVwZW5kcyBvbiAhUFBDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKIAkgIGZlYXR1cmVzIG9mIHRoZSBGaW50ZWsgRjcxODA1Ri9GRywgRjcxODA2Ri9GRyBhbmQgRjcxODcyRi9GRwpAQCAtMzQ1LDYgKzM0Niw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX0Y3MTg4MkZHCiAJdHJpc3RhdGUgIkZpbnRlayBGNzE4ODJGRyBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiAhUFBDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKIAkgIGZlYXR1cmVzIG9mIG1hbnkgRmludGVrIFN1cGVyLUkvTyAoTFBDKSBjaGlwcy4gVGhlIGN1cnJlbnRseQpAQCAtNDY4LDYgKzQ3MCw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX0lUODcKIAl0cmlzdGF0ZSAiSVRFIElUODd4eCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiAhUFBDCiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBJVEUgSVQ4NzA1RiwgSVQ4NzEyRiwKQEAgLTgyNCw2ICs4MjcsNyBAQAogCiBjb25maWcgU0VOU09SU19QQzg3MzYwCiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCisJZGVwZW5kcyBvbiAhUFBDCiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKQEAgLTgzNyw2ICs4NDEsNyBAQAogCiBjb25maWcgU0VOU09SU19QQzg3NDI3CiAJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzQyNyIKKwlkZXBlbmRzIG9uICFQUEMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCiAJICBmdW5jdGlvbnMgb2YgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzQyNyBTdXBlci1JL08gY2hpcC4KQEAgLTkyOCw3ICs5MzMsNyBAQAogCiBjb25maWcgU0VOU09SU19ETUUxNzM3CiAJdHJpc3RhdGUgIlNNU0MgRE1FMTczNywgU0NIMzExeCBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMICYmICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nCkBAIC05NzAsNiArOTc1LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfU01TQzQ3TTEKIAl0cmlzdGF0ZSAiU01TQyBMUEM0N00xMHggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gIVBQQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBmYW4KIAkgIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wgY2FwYWJpbGl0aWVzIG9mIHRoZSBTTVNDIExQQzQ3QjI3eCwKQEAgLTEwMDMsNyArMTAwOSw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX1NNU0M0N0IzOTcKIAl0cmlzdGF0ZSAiU01TQyBMUEM0N0IzOTctTkMiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhUFBDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQwogCSAgc2Vuc29yIGNoaXAuCkBAIC0xMDE3LDYgKzEwMjMsNyBAQAogCiBjb25maWcgU0VOU09SU19TQ0g1NjI3CiAJdHJpc3RhdGUgIlNNU0MgU0NINTYyNyIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgU0VOU09SU19TQ0g1NlhYX0NPTU1PTgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZwpAQCAtMTAyNyw2ICsxMDM0LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfU0NINTYzNgogCXRyaXN0YXRlICJTTVNDIFNDSDU2MzYiCisJZGVwZW5kcyBvbiAhUFBDCiAJc2VsZWN0IFNFTlNPUlNfU0NINTZYWF9DT01NT04KIAloZWxwCiAJICBTTVNDIFNDSDU2MzYgU3VwZXIgSS9PIGNoaXBzIGluY2x1ZGUgYW4gZW1iZWRkZWQgbWljcm9jb250cm9sbGVyIGZvcgpAQCAtMTE1MCw2ICsxMTU4LDcgQEAKIAogY29uZmlnIFNFTlNPUlNfVlQxMjExCiAJdHJpc3RhdGUgIlZJQSBWVDEyMTEiCisJZGVwZW5kcyBvbiAhUFBDCiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgdGhlbiB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKQEAgLTEyNjIsNiArMTI3MSw3IEBACiAKIGNvbmZpZyBTRU5TT1JTX1c4MzYyN0hGCiAJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIFc4MzY4N1RIRiwgVzgzNjk3SEYiCisJZGVwZW5kcyBvbiAhUFBDCiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM2WDcgc2VyaWVzCkBAIC0xMjcyLDcgKzEyODIsOCBAQAogCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3aGYuCiAKIGNvbmZpZyBTRU5TT1JTX1c4MzYyN0VIRgotCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0VIRi9FSEcvREhHLCBXODM2NjdIRywgTkNUNjc3NUYsIE5DVDY3NzZGIgorCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0VIRi9FSEcvREhHL1VIRywgVzgzNjY3SEcsIE5DVDY3NzVGLCBOQ1Q2Nzc2RiIKKwlkZXBlbmRzIG9uICFQUEMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZQpAQCAtMTI4MSw3ICsxMjkyLDggQEAKIAkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIFc4MzYyN0VIRywgd2hpY2ggaXMgdGhlIGxlYWQtZnJlZQogCSAgdmVyc2lvbiBvZiB0aGUgVzgzNjI3RUhGLCBhbmQgdGhlIFc4MzYyN0RIRywgd2hpY2ggaXMgYSBzaW1pbGFyCiAJICBjaGlwIHN1aXRlZCBmb3Igc3BlY2lmaWMgSW50ZWwgcHJvY2Vzc29ycyB0aGF0IHVzZSBQRUNJIHN1Y2ggYXMKLQkgIHRoZSBDb3JlIDIgRHVvLgorCSAgdGhlIENvcmUgMiBEdW8uIEFuZCBhbHNvIHRoZSBXODM2MjdVSEcsIHdoaWNoIGlzIGEgc3RyaXBwZWQgZG93bgorCSAgdmVyc2lvbiBvZiB0aGUgVzgzNjI3REhHIChhcyBmYXIgYXMgaGFyZHdhcmUgbW9uaXRvcmluZyBnb2VzLikKIAogCSAgVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyBOdXZvdG9uIFc4MzY2N0hHLCBXODM2NjdIRy1CLCBOQ1Q2Nzc1RgogCSAgKGFsc28ga25vd24gYXMgVzgzNjY3SEctSSksIGFuZCBOQ1Q2Nzc2Ri4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWQ3NDE0LmMgYi9kcml2ZXJzL2h3bW9uL2FkNzQxNC5jCmluZGV4IGQ0NmMwYzcuLmRmMjlhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWQ3NDE0LmMKKysrIGIvZHJpdmVycy9od21vbi9hZDc0MTQuYwpAQCAtNTgsMTAgKzU4LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYWQ3NDE0X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQogewotCWlmIChyZWcgPT0gQUQ3NDE0X1JFR19URU1QKSB7Ci0JCWludCB2YWx1ZSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7Ci0JCXJldHVybiAodmFsdWUgPCAwKSA/IHZhbHVlIDogc3dhYjE2KHZhbHVlKTsKLQl9IGVsc2UKKwlpZiAocmVnID09IEFENzQxNF9SRUdfVEVNUCkKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZyk7CisJZWxzZQogCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZDc0MTguYyBiL2RyaXZlcnMvaHdtb24vYWQ3NDE4LmMKaW5kZXggZmZjNzgxZi4uOGNiNzE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZDc0MTguYworKysgYi9kcml2ZXJzL2h3bW9uL2FkNzQxOC5jCkBAIC03NiwyMCArNzYsNiBAQAogCS5pZF90YWJsZQk9IGFkNzQxOF9pZCwKIH07CiAKLS8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQsIGV4Y2VwdCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgotICogQUQ3NDE4IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbi4gRG8gTk9UIHVzZSB0aG9zZSBmdW5jdGlvbnMgdG8KLSAqIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgQ09ORiBhbmQgQ09ORjIsIGFzIHRoZXkgYXJlIGJ5dGUtc2l6ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFkNzQxOF9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKLXsKLQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhZDc0MThfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOwotfQotCiBzdGF0aWMgdm9pZCBhZDc0MThfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgYWQ3NDE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTEyOCw3ICsxMTQsOSBAQAogCQl1ZGVsYXkoMzApOwogCiAJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWRhdGEtPnRlbXBbaV0gPSBhZDc0MThfcmVhZChjbGllbnQsIEFENzQxOF9SRUdfVEVNUFtpXSk7CisJCQlkYXRhLT50ZW1wW2ldID0KKwkJCQlpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQkJQUQ3NDE4X1JFR19URU1QW2ldKTsKIAkJfQogCiAJCWZvciAoaSA9IDAsIGNoID0gNDsgaSA8IGRhdGEtPmFkY19tYXg7IGkrKywgY2gtLSkgewpAQCAtMTM4LDExICsxMjYsMTIgQEAKIAogCQkJdWRlbGF5KDE1KTsKIAkJCWRhdGEtPmluW2RhdGEtPmFkY19tYXggLSAxIC0gaV0gPQotCQkJCWFkNzQxOF9yZWFkKGNsaWVudCwgQUQ3NDE4X1JFR19BREMpOworCQkJCWkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQlBRDc0MThfUkVHX0FEQyk7CiAJCX0KIAogCQkvKiByZXN0b3JlIG9sZCBjb25maWd1cmF0aW9uIHZhbHVlICovCi0JCWFkNzQxOF93cml0ZShjbGllbnQsIEFENzQxOF9SRUdfQ09ORiwgY2ZnKTsKKwkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIEFENzQxOF9SRUdfQ09ORiwgY2ZnKTsKIAogCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwogCQlkYXRhLT52YWxpZCA9IDE7CkBAIC0xODIsNyArMTcxLDkgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCWRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdID0gTE03NV9URU1QX1RPX1JFRyh0ZW1wKTsKLQlhZDc0MThfd3JpdGUoY2xpZW50LCBBRDc0MThfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLCBkYXRhLT50ZW1wW2F0dHItPmluZGV4XSk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJICAgICBBRDc0MThfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLAorCQkJCSAgICAgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHMxMDE1LmMgYi9kcml2ZXJzL2h3bW9uL2FkczEwMTUuYwppbmRleCBlOWJlZWRhLi5lZWRjYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkczEwMTUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkczEwMTUuYwpAQCAtNTksMTkgKzU5LDYgQEAKIAlzdHJ1Y3QgYWRzMTAxNV9jaGFubmVsX2RhdGEgY2hhbm5lbF9kYXRhW0FEUzEwMTVfQ0hBTk5FTFNdOwogfTsKIAotc3RhdGljIHMzMiBhZHMxMDE1X3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JczMyIGRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCi0JcmV0dXJuIChkYXRhIDwgMCkgPyBkYXRhIDogc3dhYjE2KGRhdGEpOwotfQotCi1zdGF0aWMgczMyIGFkczEwMTVfd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgIHUxNiB2YWwpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWwpKTsKLX0KLQogc3RhdGljIGludCBhZHMxMDE1X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNoYW5uZWwsCiAJCQkgICAgICBpbnQgKnZhbHVlKQogewpAQCAtODcsNyArNzQsNyBAQAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIGdldCBjaGFubmVsIHBhcmFtZXRlcnMgKi8KLQlyZXMgPSBhZHMxMDE1X3JlYWRfcmVnKGNsaWVudCwgQURTMTAxNV9DT05GSUcpOworCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIEFEUzEwMTVfQ09ORklHKTsKIAlpZiAocmVzIDwgMCkKIAkJZ290byBlcnJfdW5sb2NrOwogCWNvbmZpZyA9IHJlczsKQEAgLTEwMSwxMyArODgsMTMgQEAKIAljb25maWcgfD0gKHBnYSAmIDB4MDAwNykgPDwgOTsKIAljb25maWcgfD0gKGRhdGFfcmF0ZSAmIDB4MDAwNykgPDwgNTsKIAotCXJlcyA9IGFkczEwMTVfd3JpdGVfcmVnKGNsaWVudCwgQURTMTAxNV9DT05GSUcsIGNvbmZpZyk7CisJcmVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIEFEUzEwMTVfQ09ORklHLCBjb25maWcpOwogCWlmIChyZXMgPCAwKQogCQlnb3RvIGVycl91bmxvY2s7CiAKIAkvKiB3YWl0IHVudGlsIGNvbnZlcnNpb24gZmluaXNoZWQgKi8KIAltc2xlZXAoY29udmVyc2lvbl90aW1lX21zKTsKLQlyZXMgPSBhZHMxMDE1X3JlYWRfcmVnKGNsaWVudCwgQURTMTAxNV9DT05GSUcpOworCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIEFEUzEwMTVfQ09ORklHKTsKIAlpZiAocmVzIDwgMCkKIAkJZ290byBlcnJfdW5sb2NrOwogCWNvbmZpZyA9IHJlczsKQEAgLTExNyw3ICsxMDQsNyBAQAogCQlnb3RvIGVycl91bmxvY2s7CiAJfQogCi0JcmVzID0gYWRzMTAxNV9yZWFkX3JlZyhjbGllbnQsIEFEUzEwMTVfQ09OVkVSU0lPTik7CisJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgQURTMTAxNV9DT05WRVJTSU9OKTsKIAlpZiAocmVzIDwgMCkKIAkJZ290byBlcnJfdW5sb2NrOwogCWNvbnZlcnNpb24gPSByZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Fkczc4MjguYyBiL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCmluZGV4IGM0MmM1YTYuLmNmY2MzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCkBAIC03NCwxMyArNzQsNiBAQAogc3RhdGljIGludCBhZHM3ODI4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKTsKIAotLyogVGhlIEFEUzc4MjggcmV0dXJucyB0aGUgMTItYml0IHNhbXBsZSBpbiB0d28gYnl0ZXMsCi0JdGhlc2UgYXJlIHJlYWQgYXMgYSB3b3JkIHRoZW4gYnl0ZS1zd2FwcGVkICovCi1zdGF0aWMgdTE2IGFkczc4MjhfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JcmV0dXJuIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpKTsKLX0KLQogc3RhdGljIGlubGluZSB1OCBjaGFubmVsX2NtZF9ieXRlKGludCBjaCkKIHsKIAkvKiBjbWQgYnl0ZSBDMixDMSxDMCAtIHNlZSBkYXRhc2hlZXQgKi8KQEAgLTEwNCw3ICs5Nyw4IEBACiAKIAkJZm9yIChjaCA9IDA7IGNoIDwgQURTNzgyOF9OQ0g7IGNoKyspIHsKIAkJCXU4IGNtZCA9IGNoYW5uZWxfY21kX2J5dGUoY2gpOwotCQkJZGF0YS0+YWRjX2lucHV0W2NoXSA9IGFkczc4MjhfcmVhZF92YWx1ZShjbGllbnQsIGNtZCk7CisJCQlkYXRhLT5hZGNfaW5wdXRbY2hdID0KKwkJCQlpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBjbWQpOwogCQl9CiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CiAJCWRhdGEtPnZhbGlkID0gMTsKQEAgLTIwMyw3ICsxOTcsNyBAQAogCWZvciAoY2ggPSAwOyBjaCA8IEFEUzc4MjhfTkNIOyBjaCsrKSB7CiAJCXUxNiBpbl9kYXRhOwogCQl1OCBjbWQgPSBjaGFubmVsX2NtZF9ieXRlKGNoKTsKLQkJaW5fZGF0YSA9IGFkczc4MjhfcmVhZF92YWx1ZShjbGllbnQsIGNtZCk7CisJCWluX2RhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBjbWQpOwogCQlpZiAoaW5fZGF0YSAmIDB4RjAwMCkgewogCQkJcHJfZGVidWcoIiVzIDogRG9lc24ndCBsb29rIGxpa2UgYW4gYWRzNzgyOCBkZXZpY2VcbiIsCiAJCQkJIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IGMwMmEwNTIuLmQ3YmQxZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtODI5LDE3ICs4MjksMTcgQEAKIAkJLyogY29udmVydCBmcm9tIElTQSB0byBMTTc1IEkyQyBhZGRyZXNzZXMgKi8KIAkJc3dpdGNoIChyZWcgJiAweGZmKSB7CiAJCWNhc2UgMHg1MDogLyogVEVNUCAqLwotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMCkpOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTI6IC8qIENPTkZJRyAqLwogCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsLCAxKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTM6IC8qIEhZU1QgKi8KLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDIpKTsKKwkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbCwgMik7CiAJCQlicmVhazsKIAkJY2FzZSAweDU1OiAvKiBNQVggKi8KIAkJZGVmYXVsdDoKLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDMpKTsKKwkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbCwgMyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTg3NywxMCArODc3LDEwIEBACiAJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsLCAxLCB2YWx1ZSAmIDB4ZmYpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1MzogLyogSFlTVCAqLwotCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbCwgMiwgc3dhYjE2KHZhbHVlKSk7CisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsLCAyLCB2YWx1ZSk7CiAJCQlicmVhazsKIAkJY2FzZSAweDU1OiAvKiBNQVggKi8KLQkJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2wsIDMsIHN3YWIxNih2YWx1ZSkpOworCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbCwgMywgdmFsdWUpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKaW5kZXggOTMyMzgzNy4uMTA0YjM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwpAQCAtNjAsMTQgKzYwLDEzIEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBUT19QSFlTX0lEKGNwdSkJCWNwdV9kYXRhKGNwdSkucGh5c19wcm9jX2lkCiAjZGVmaW5lIFRPX0NPUkVfSUQoY3B1KQkJY3B1X2RhdGEoY3B1KS5jcHVfY29yZV9pZAotI2RlZmluZSBUT19BVFRSX05PKGNwdSkJCShUT19DT1JFX0lEKGNwdSkgKyBCQVNFX1NZU0ZTX0FUVFJfTk8pCiAjZGVmaW5lIGZvcl9lYWNoX3NpYmxpbmcoaSwgY3B1KQlmb3JfZWFjaF9jcHUoaSwgY3B1X3NpYmxpbmdfbWFzayhjcHUpKQogI2Vsc2UKICNkZWZpbmUgVE9fUEhZU19JRChjcHUpCQkoY3B1KQogI2RlZmluZSBUT19DT1JFX0lEKGNwdSkJCShjcHUpCi0jZGVmaW5lIFRPX0FUVFJfTk8oY3B1KQkJKGNwdSkKICNkZWZpbmUgZm9yX2VhY2hfc2libGluZyhpLCBjcHUpCWZvciAoaSA9IDA7IGZhbHNlOyApCiAjZW5kaWYKKyNkZWZpbmUgVE9fQVRUUl9OTyhjcHUpCQkoVE9fQ09SRV9JRChjcHUpICsgQkFTRV9TWVNGU19BVFRSX05PKQogCiAvKgogICogUGVyLUNvcmUgVGVtcGVyYXR1cmUgRGF0YQpAQCAtMzI1LDE1ICszMjQsNiBAQAogCXJldHVybiBhZGp1c3RfdGptYXgoYywgaWQsIGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBnZXRfdWNvZGVfcmV2X29uX2NwdSh2b2lkICplZHgpCi17Ci0JdTMyIGVheDsKLQotCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7Ci0Jc3luY19jb3JlKCk7Ci0JcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCBlYXgsICoodTMyICopZWR4KTsKLX0KLQogc3RhdGljIGludCBjcmVhdGVfbmFtZV9hdHRyKHN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN5c2ZzX2F0dHJfaW5pdCgmcGRhdGEtPm5hbWVfYXR0ci5hdHRyKTsKQEAgLTM4MCwyNyArMzcwLDE2IEBACiBzdGF0aWMgaW50IF9fY3B1aW5pdCBjaGtfdWNvZGVfdmVyc2lvbih1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwotCWludCBlcnI7Ci0JdTMyIGVkeDsKIAogCS8qCiAJICogQ2hlY2sgaWYgd2UgaGF2ZSBwcm9ibGVtIHdpdGggZXJyYXRhIEFFMTggb2YgQ29yZSBwcm9jZXNzb3JzOgogCSAqIFJlYWRpbmdzIG1pZ2h0IHN0b3AgdXBkYXRlIHdoZW4gcHJvY2Vzc29yIHZpc2l0ZWQgdG9vIGRlZXAgc2xlZXAsCiAJICogZml4ZWQgZm9yIHN0ZXBwaW5nIEQwICg2RUMpLgogCSAqLwotCWlmIChjLT54ODZfbW9kZWwgPT0gMHhlICYmIGMtPng4Nl9tYXNrIDwgMHhjKSB7Ci0JCS8qIGNoZWNrIGZvciBtaWNyb2NvZGUgdXBkYXRlICovCi0JCWVyciA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGdldF91Y29kZV9yZXZfb25fY3B1LAotCQkJCQkgICAgICAgJmVkeCwgMSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiQ2Fubm90IGRldGVybWluZSBtaWNyb2NvZGUgcmV2aXNpb24gb2YgIgotCQkJICAgICAgICJDUFUjJXUgKCVkKSFcbiIsIGNwdSwgZXJyKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9IGVsc2UgaWYgKGVkeCA8IDB4MzkpIHsKLQkJCXByX2VycigiRXJyYXRhIEFFMTggbm90IGZpeGVkLCB1cGRhdGUgQklPUyBvciAiCi0JCQkgICAgICAgIm1pY3JvY29kZSBvZiB0aGUgQ1BVIVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQorCWlmIChjLT54ODZfbW9kZWwgPT0gMHhlICYmIGMtPng4Nl9tYXNrIDwgMHhjICYmIGMtPm1pY3JvY29kZSA8IDB4MzkpIHsKKwkJcHJfZXJyKCJFcnJhdGEgQUUxOCBub3QgZml4ZWQsIHVwZGF0ZSBCSU9TIG9yICIKKwkJICAgICAgICJtaWNyb2NvZGUgb2YgdGhlIENQVSFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwppbmRleCBlMTEzNjM0Li5lZjFhYzk5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kczE2MjEuYworKysgYi9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCkBAIC04MCwyNCArODAsNiBAQAogCXU4IGNvbmY7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCiB9OwogCi0vKiBUZW1wZXJhdHVyZSByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQuCi0gICBEUzE2MjEgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCi0gICB0aGUgU01CdXMgc3RhbmRhcmQuICovCi1zdGF0aWMgaW50IGRzMTYyMV9yZWFkX3RlbXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBzd2FiMTYocmV0KTsKLX0KLQotc3RhdGljIGludCBkczE2MjFfd3JpdGVfdGVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGRzMTYyMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXU4IGNvbmYsIG5ld19jb25mOwpAQCAtMTM2LDcgKzExOCw3IEBACiAJCWRhdGEtPmNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBEUzE2MjFfUkVHX0NPTkYpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPnRlbXApOyBpKyspCi0JCQlkYXRhLT50ZW1wW2ldID0gZHMxNjIxX3JlYWRfdGVtcChjbGllbnQsCisJCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKIAkJCQkJCQkgRFMxNjIxX1JFR19URU1QW2ldKTsKIAogCQkvKiByZXNldCBhbGFybXMgaWYgbmVjZXNzYXJ5ICovCkBAIC0xNzcsOCArMTU5LDggQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wW2F0dHItPmluZGV4XSA9IHZhbDsKLQlkczE2MjFfd3JpdGVfdGVtcChjbGllbnQsIERTMTYyMV9SRUdfVEVNUFthdHRyLT5pbmRleF0sCi0JCQkgIGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgRFMxNjIxX1JFR19URU1QW2F0dHItPmluZGV4XSwKKwkJCQkgICAgIGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RzNjIwLmMgYi9kcml2ZXJzL2h3bW9uL2RzNjIwLmMKaW5kZXggNGY3YzNmYy4uMjI1YWU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kczYyMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vZHM2MjAuYwpAQCAtNzUsMzMgKzc1LDEzIEBACiAJczE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZXMsIHdvcmQgKi8KIH07CiAKLS8qCi0gKiAgVGVtcGVyYXR1cmUgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLgotICogIERTNjIwIHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bwotICogIHRoZSBTTUJ1cyBzdGFuZGFyZC4KLSAqLwotc3RhdGljIGludCBkczYyMF9yZWFkX3RlbXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBzd2FiMTYocmV0KTsKLX0KLQotc3RhdGljIGludCBkczYyMF93cml0ZV90ZW1wKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQotewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKLX0KLQogc3RhdGljIHZvaWQgZHM2MjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgZHM2MjBfcGxhdGZvcm1fZGF0YSAqZHM2MjBfaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJdTE2IGNvbmYsIG5ld19jb25mOwogCiAJbmV3X2NvbmYgPSBjb25mID0KLQkgICAgc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GKSk7CisJICAgIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIERTNjIwX1JFR19DT05GKTsKIAogCS8qIHN3aXRjaCB0byBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAqLwogCW5ld19jb25mICY9IH5EUzYyMF9SRUdfQ09ORklHXzFTSE9UOwpAQCAtMTE4LDggKzk4LDcgQEAKIAluZXdfY29uZiB8PSBEUzYyMF9SRUdfQ09ORklHX1IxIHwgRFM2MjBfUkVHX0NPTkZJR19SMDsKIAogCWlmIChjb25mICE9IG5ld19jb25mKQotCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYsCi0JCQkJCSAgc3dhYjE2KG5ld19jb25mKSk7CisJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBEUzYyMF9SRUdfQ09ORiwgbmV3X2NvbmYpOwogCiAJLyogc3RhcnQgY29udmVyc2lvbiAqLwogCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgRFM2MjBfQ09NX1NUQVJUKTsKQEAgLTE0MSw4ICsxMjAsOCBAQAogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGRzNjIwIHVwZGF0ZVxuIik7CiAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+dGVtcCk7IGkrKykgewotCQkJcmVzID0gZHM2MjBfcmVhZF90ZW1wKGNsaWVudCwKLQkJCQkJICAgICAgRFM2MjBfUkVHX1RFTVBbaV0pOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCQkgIERTNjIwX1JFR19URU1QW2ldKTsKIAkJCWlmIChyZXMgPCAwKSB7CiAJCQkJcmV0ID0gRVJSX1BUUihyZXMpOwogCQkJCWdvdG8gYWJvcnQ7CkBAIC0xOTEsOCArMTcwLDggQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wW2F0dHItPmluZGV4XSA9IHZhbDsKLQlkczYyMF93cml0ZV90ZW1wKGNsaWVudCwgRFM2MjBfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLAotCQkJIGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgRFM2MjBfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLAorCQkJCSAgICAgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTIxMCwxNiArMTg5LDE1IEBACiAJCXJldHVybiBQVFJfRVJSKGRhdGEpOwogCiAJLyogcmVzZXQgYWxhcm1zIGlmIG5lY2Vzc2FyeSAqLwotCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GKTsKKwlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBEUzYyMF9SRUdfQ09ORik7CiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAKLQljb25mID0gc3dhYjE2KHJlcyk7Ci0JbmV3X2NvbmYgPSBjb25mOworCW5ld19jb25mID0gY29uZiA9IHJlczsKIAluZXdfY29uZiAmPSB+YXR0ci0+aW5kZXg7CiAJaWYgKGNvbmYgIT0gbmV3X2NvbmYpIHsKLQkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GLAotCQkJCQkJc3dhYjE2KG5ld19jb25mKSk7CisJCXJlcyA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBEUzYyMF9SRUdfQ09ORiwKKwkJCQkJCSAgIG5ld19jb25mKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gcmVzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKaW5kZXggZTdhZTU3NC4uYTEzZTJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUxOHNtLmMKQEAgLTU5MSw3ICs1OTEsNyBAQAogc3RhdGljIGludCBnbDUxOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKIHsKIAlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQotCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnKTsKIAllbHNlCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQpAQCAtNTk5LDcgKzU5OSw3IEBACiBzdGF0aWMgaW50IGdsNTE4X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQogewogCWlmICgocmVnID49IDB4MDcpICYmIChyZWcgPD0gMHgwYykpCi0JCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIHZhbHVlKTsKIAllbHNlCiAJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYyBiL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jCmluZGV4IDEzMWVhODYuLmNkNjA4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jCisrKyBiL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jCkBAIC04MjEsNyArODIxLDcgQEAKIHN0YXRpYyBpbnQgZ2w1MjBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCiB7CiAJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKLQkJcmV0dXJuIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpKTsKKwkJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIHJlZyk7CiAJZWxzZQogCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KQEAgLTgyOSw3ICs4MjksNyBAQAogc3RhdGljIGludCBnbDUyMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKIHsKIAlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQotCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7CisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiAJZWxzZQogCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi5jIGIvZHJpdmVycy9od21vbi9od21vbi5jCmluZGV4IGE2MWU3ODEuLjY0NjA0ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKQEAgLTI3LDggKzI3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqaHdtb25fY2xhc3M7CiAKLXN0YXRpYyBERUZJTkVfSURSKGh3bW9uX2lkcik7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlkcl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfSURBKGh3bW9uX2lkYSk7CiAKIC8qKgogICogaHdtb25fZGV2aWNlX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgdy8gaHdtb24KQEAgLTQyLDMwICs0MSwxNyBAQAogc3RydWN0IGRldmljZSAqaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpod2RldjsKLQlpbnQgaWQsIGVycjsKKwlpbnQgaWQ7CiAKLWFnYWluOgotCWlmICh1bmxpa2VseShpZHJfcHJlX2dldCgmaHdtb25faWRyLCBHRlBfS0VSTkVMKSA9PSAwKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWQgPSBpZGFfc2ltcGxlX2dldCgmaHdtb25faWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihpZCk7CiAKLQlzcGluX2xvY2soJmlkcl9sb2NrKTsKLQllcnIgPSBpZHJfZ2V0X25ldygmaHdtb25faWRyLCBOVUxMLCAmaWQpOwotCXNwaW5fdW5sb2NrKCZpZHJfbG9jayk7Ci0KLQlpZiAodW5saWtlbHkoZXJyID09IC1FQUdBSU4pKQotCQlnb3RvIGFnYWluOwotCWVsc2UgaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0KLQlpZCA9IGlkICYgTUFYX0lEX01BU0s7CiAJaHdkZXYgPSBkZXZpY2VfY3JlYXRlKGh3bW9uX2NsYXNzLCBkZXYsIE1LREVWKDAsIDApLCBOVUxMLAogCQkJICAgICAgSFdNT05fSURfRk9STUFULCBpZCk7CiAKLQlpZiAoSVNfRVJSKGh3ZGV2KSkgewotCQlzcGluX2xvY2soJmlkcl9sb2NrKTsKLQkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7Ci0JCXNwaW5fdW5sb2NrKCZpZHJfbG9jayk7Ci0JfQorCWlmIChJU19FUlIoaHdkZXYpKQorCQlpZGFfc2ltcGxlX3JlbW92ZSgmaHdtb25faWRhLCBpZCk7CiAKIAlyZXR1cm4gaHdkZXY7CiB9CkBAIC04MSw5ICs2Nyw3IEBACiAKIAlpZiAobGlrZWx5KHNzY2FuZihkZXZfbmFtZShkZXYpLCBIV01PTl9JRF9GT1JNQVQsICZpZCkgPT0gMSkpIHsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQkJc3Bpbl9sb2NrKCZpZHJfbG9jayk7Ci0JCWlkcl9yZW1vdmUoJmh3bW9uX2lkciwgaWQpOwotCQlzcGluX3VubG9jaygmaWRyX2xvY2spOworCQlpZGFfc2ltcGxlX3JlbW92ZSgmaHdtb25faWRhLCBpZCk7CiAJfSBlbHNlCiAJCWRldl9kYmcoZGV2LT5wYXJlbnQsCiAJCQkiaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoKSBmYWlsZWQ6IGJhZCBjbGFzcyBJRCFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1hZW0uYyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKaW5kZXggYzMxNjI5NC4uNmE5NjdkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1hZW0uYworKysgYi9kcml2ZXJzL2h3bW9uL2libWFlbS5jCkBAIC04OCw4ICs4OCw3IEBACiAjZGVmaW5lIEFFTV9NSU5fUE9XRVJfSU5URVJWQUwJMjAwCiAjZGVmaW5lIFVKX1BFUl9NSgkJMTAwMEwKIAotc3RhdGljIERFRklORV9JRFIoYWVtX2lkcik7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFlbV9pZHJfbG9jayk7CitzdGF0aWMgREVGSU5FX0lEQShhZW1faWRhKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWVtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpAQCAtMTQ4LDggKzE0Nyw5IEBACiAJaW50CQkJaWQ7CiAJc3RydWN0IGFlbV9pcG1pX2RhdGEJaXBtaTsKIAotCS8qIEZ1bmN0aW9uIHRvIHVwZGF0ZSBzZW5zb3JzICovCisJLyogRnVuY3Rpb24gYW5kIGJ1ZmZlciB0byB1cGRhdGUgc2Vuc29ycyAqLwogCXZvaWQgKCp1cGRhdGUpKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSk7CisJc3RydWN0IGFlbV9yZWFkX3NlbnNvcl9yZXNwICpyc19yZXNwOwogCiAJLyoKIAkgKiBBRU0gMS54IHNlbnNvcnM6CkBAIC0yNDYsOCArMjQ2LDYgQEAKIHN0YXRpYyB2b2lkIGFlbV9tc2dfaGFuZGxlcihzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLCB2b2lkICp1c2VyX21zZ19kYXRhKTsKIAogc3RhdGljIHZvaWQgYWVtX3JlbW92ZV9zZW5zb3JzKHN0cnVjdCBhZW1fZGF0YSAqZGF0YSk7Ci1zdGF0aWMgaW50IGFlbV9pbml0X2FlbTEoc3RydWN0IGFlbV9pcG1pX2RhdGEgKnByb2JlKTsKLXN0YXRpYyBpbnQgYWVtX2luaXRfYWVtMihzdHJ1Y3QgYWVtX2lwbWlfZGF0YSAqcHJvYmUpOwogc3RhdGljIGludCBhZW0xX2ZpbmRfc2Vuc29ycyhzdHJ1Y3QgYWVtX2RhdGEgKmRhdGEpOwogc3RhdGljIGludCBhZW0yX2ZpbmRfc2Vuc29ycyhzdHJ1Y3QgYWVtX2RhdGEgKmRhdGEpOwogc3RhdGljIHZvaWQgdXBkYXRlX2FlbTFfc2Vuc29ycyhzdHJ1Y3QgYWVtX2RhdGEgKmRhdGEpOwpAQCAtMzU2LDQ3ICszNTQsMTYgQEAKIAljb21wbGV0ZSgmZGF0YS0+cmVhZF9jb21wbGV0ZSk7CiB9CiAKLS8qIElEIGZ1bmN0aW9ucyAqLwotCi0vKiBPYnRhaW4gYW4gaWQgKi8KLXN0YXRpYyBpbnQgYWVtX2lkcl9nZXQoaW50ICppZCkKLXsKLQlpbnQgaSwgZXJyOwotCi1hZ2FpbjoKLQlpZiAodW5saWtlbHkoIWlkcl9wcmVfZ2V0KCZhZW1faWRyLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Bpbl9sb2NrKCZhZW1faWRyX2xvY2spOwotCWVyciA9IGlkcl9nZXRfbmV3KCZhZW1faWRyLCBOVUxMLCAmaSk7Ci0Jc3Bpbl91bmxvY2soJmFlbV9pZHJfbG9jayk7Ci0KLQlpZiAodW5saWtlbHkoZXJyID09IC1FQUdBSU4pKQotCQlnb3RvIGFnYWluOwotCWVsc2UgaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBlcnI7Ci0KLQkqaWQgPSBpICYgTUFYX0lEX01BU0s7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlbGVhc2UgYW4gb2JqZWN0IElEICovCi1zdGF0aWMgdm9pZCBhZW1faWRyX3B1dChpbnQgaWQpCi17Ci0Jc3Bpbl9sb2NrKCZhZW1faWRyX2xvY2spOwotCWlkcl9yZW1vdmUoJmFlbV9pZHIsIGlkKTsKLQlzcGluX3VubG9jaygmYWVtX2lkcl9sb2NrKTsKLX0KLQogLyogU2Vuc29yIHN1cHBvcnQgZnVuY3Rpb25zICovCiAKLS8qIFJlYWQgYSBzZW5zb3IgdmFsdWUgKi8KKy8qIFJlYWQgYSBzZW5zb3IgdmFsdWU7IG11c3QgYmUgY2FsbGVkIHdpdGggZGF0YS0+bG9jayBoZWxkICovCiBzdGF0aWMgaW50IGFlbV9yZWFkX3NlbnNvcihzdHJ1Y3QgYWVtX2RhdGEgKmRhdGEsIHU4IGVsdCwgdTggcmVnLAogCQkJICAgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlpbnQgcnNfc2l6ZSwgcmVzOwogCXN0cnVjdCBhZW1fcmVhZF9zZW5zb3JfcmVxIHJzX3JlcTsKLQlzdHJ1Y3QgYWVtX3JlYWRfc2Vuc29yX3Jlc3AgKnJzX3Jlc3A7CisJLyogVXNlIHByZWFsbG9jYXRlZCByeCBidWZmZXIgKi8KKwlzdHJ1Y3QgYWVtX3JlYWRfc2Vuc29yX3Jlc3AgKnJzX3Jlc3AgPSBkYXRhLT5yc19yZXNwOwogCXN0cnVjdCBhZW1faXBtaV9kYXRhICppcG1pID0gJmRhdGEtPmlwbWk7CiAKIAkvKiBBRU0gcmVnaXN0ZXJzIGFyZSAxLCAyLCA0IG9yIDggYnl0ZXMgKi8KQEAgLTQyMiwxMCArMzg5LDYgQEAKIAlpcG1pLT50eF9tZXNzYWdlLmRhdGFfbGVuID0gc2l6ZW9mKHJzX3JlcSk7CiAKIAlyc19zaXplID0gc2l6ZW9mKCpyc19yZXNwKSArIHNpemU7Ci0JcnNfcmVzcCA9IGt6YWxsb2MocnNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyc19yZXNwKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlwbWktPnJ4X21zZ19kYXRhID0gcnNfcmVzcDsKIAlpcG1pLT5yeF9tc2dfbGVuID0gcnNfc2l6ZTsKIApAQCAtNDY4LDcgKzQzMSw2IEBACiAJcmVzID0gMDsKIAogb3V0OgotCWtmcmVlKHJzX3Jlc3ApOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTUyNiwxMSArNDg4LDEyIEBACiB7CiAJbGlzdF9kZWwoJmRhdGEtPmxpc3QpOwogCWFlbV9yZW1vdmVfc2Vuc29ycyhkYXRhKTsKKwlrZnJlZShkYXRhLT5yc19yZXNwKTsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCWlwbWlfZGVzdHJveV91c2VyKGRhdGEtPmlwbWkudXNlcik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGF0YS0+cGRldiwgTlVMTCk7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+cGRldik7Ci0JYWVtX2lkcl9wdXQoZGF0YS0+aWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZhZW1faWRhLCBkYXRhLT5pZCk7CiAJa2ZyZWUoZGF0YSk7CiB9CiAKQEAgLTU4Nyw3ICs1NTAsOCBAQAogCQlkYXRhLT5wb3dlcl9wZXJpb2RbaV0gPSBBRU1fREVGQVVMVF9QT1dFUl9JTlRFUlZBTDsKIAogCS8qIENyZWF0ZSBzdWItZGV2aWNlIGZvciB0aGlzIGZ3IGluc3RhbmNlICovCi0JaWYgKGFlbV9pZHJfZ2V0KCZkYXRhLT5pZCkpCisJZGF0YS0+aWQgPSBpZGFfc2ltcGxlX2dldCgmYWVtX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEtPmlkIDwgMCkKIAkJZ290byBpZF9lcnI7CiAKIAlkYXRhLT5wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGRhdGEtPmlkKTsKQEAgLTYwMiwyNCArNTY2LDMxIEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGF0YS0+cGRldiwgZGF0YSk7CiAKIAkvKiBTZXQgdXAgSVBNSSBpbnRlcmZhY2UgKi8KLQlpZiAoYWVtX2luaXRfaXBtaV9kYXRhKCZkYXRhLT5pcG1pLCBwcm9iZS0+aW50ZXJmYWNlLAotCQkJICAgICAgIHByb2JlLT5ibWNfZGV2aWNlKSkKKwlyZXMgPSBhZW1faW5pdF9pcG1pX2RhdGEoJmRhdGEtPmlwbWksIHByb2JlLT5pbnRlcmZhY2UsCisJCQkJIHByb2JlLT5ibWNfZGV2aWNlKTsKKwlpZiAocmVzKQogCQlnb3RvIGlwbWlfZXJyOwogCiAJLyogUmVnaXN0ZXIgd2l0aCBod21vbiAqLwogCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmZGF0YS0+cGRldi0+ZGV2KTsKLQogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQlkZXZfZXJyKCZkYXRhLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gIgogCQkJImRldmljZSBmb3IgSVBNSSBpbnRlcmZhY2UgJWRcbiIsCiAJCQlwcm9iZS0+aW50ZXJmYWNlKTsKKwkJcmVzID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGh3bW9uX3JlZ19lcnI7CiAJfQogCiAJZGF0YS0+dXBkYXRlID0gdXBkYXRlX2FlbTFfc2Vuc29yczsKKwlkYXRhLT5yc19yZXNwID0ga3phbGxvYyhzaXplb2YoKihkYXRhLT5yc19yZXNwKSkgKyA4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEtPnJzX3Jlc3ApIHsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBhbGxvY19yZXNwX2VycjsKKwl9CiAKIAkvKiBGaW5kIHNlbnNvcnMgKi8KLQlpZiAoYWVtMV9maW5kX3NlbnNvcnMoZGF0YSkpCisJcmVzID0gYWVtMV9maW5kX3NlbnNvcnMoZGF0YSk7CisJaWYgKHJlcykKIAkJZ290byBzZW5zb3JfZXJyOwogCiAJLyogQWRkIHRvIG91ciBsaXN0IG9mIEFFTSBkZXZpY2VzICovCkBAIC02MzEsNiArNjAyLDggQEAKIAlyZXR1cm4gMDsKIAogc2Vuc29yX2VycjoKKwlrZnJlZShkYXRhLT5yc19yZXNwKTsKK2FsbG9jX3Jlc3BfZXJyOgogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiBod21vbl9yZWdfZXJyOgogCWlwbWlfZGVzdHJveV91c2VyKGRhdGEtPmlwbWkudXNlcik7CkBAIC02MzgsNyArNjExLDcgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkYXRhLT5wZGV2LCBOVUxMKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5wZGV2KTsKIGRldl9lcnI6Ci0JYWVtX2lkcl9wdXQoZGF0YS0+aWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZhZW1faWRhLCBkYXRhLT5pZCk7CiBpZF9lcnI6CiAJa2ZyZWUoZGF0YSk7CiAKQEAgLTY0Niw3ICs2MTksNyBAQAogfQogCiAvKiBGaW5kIGFuZCBpbml0aWFsaXplIGFsbCBBRU0xIGluc3RhbmNlcyAqLwotc3RhdGljIGludCBhZW1faW5pdF9hZW0xKHN0cnVjdCBhZW1faXBtaV9kYXRhICpwcm9iZSkKK3N0YXRpYyB2b2lkIGFlbV9pbml0X2FlbTEoc3RydWN0IGFlbV9pcG1pX2RhdGEgKnByb2JlKQogewogCWludCBudW0sIGksIGVycjsKIApAQCAtNjU3LDExICs2MzAsOCBAQAogCQkJZGV2X2Vycihwcm9iZS0+Ym1jX2RldmljZSwKIAkJCQkiRXJyb3IgJWQgaW5pdGlhbGl6aW5nIEFFTTEgMHglWFxuIiwKIAkJCQllcnIsIGkpOwotCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KLQotCXJldHVybiAwOwogfQogCiAvKiBQcm9iZSBmdW5jdGlvbnMgZm9yIEFFTTIgZGV2aWNlcyAqLwpAQCAtNzIwLDcgKzY5MCw4IEBACiAJCWRhdGEtPnBvd2VyX3BlcmlvZFtpXSA9IEFFTV9ERUZBVUxUX1BPV0VSX0lOVEVSVkFMOwogCiAJLyogQ3JlYXRlIHN1Yi1kZXZpY2UgZm9yIHRoaXMgZncgaW5zdGFuY2UgKi8KLQlpZiAoYWVtX2lkcl9nZXQoJmRhdGEtPmlkKSkKKwlkYXRhLT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZhZW1faWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YS0+aWQgPCAwKQogCQlnb3RvIGlkX2VycjsKIAogCWRhdGEtPnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgZGF0YS0+aWQpOwpAQCAtNzM1LDI0ICs3MDYsMzEgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkYXRhLT5wZGV2LCBkYXRhKTsKIAogCS8qIFNldCB1cCBJUE1JIGludGVyZmFjZSAqLwotCWlmIChhZW1faW5pdF9pcG1pX2RhdGEoJmRhdGEtPmlwbWksIHByb2JlLT5pbnRlcmZhY2UsCi0JCQkgICAgICAgcHJvYmUtPmJtY19kZXZpY2UpKQorCXJlcyA9IGFlbV9pbml0X2lwbWlfZGF0YSgmZGF0YS0+aXBtaSwgcHJvYmUtPmludGVyZmFjZSwKKwkJCQkgcHJvYmUtPmJtY19kZXZpY2UpOworCWlmIChyZXMpCiAJCWdvdG8gaXBtaV9lcnI7CiAKIAkvKiBSZWdpc3RlciB3aXRoIGh3bW9uICovCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZkYXRhLT5wZGV2LT5kZXYpOwotCiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWRldl9lcnIoJmRhdGEtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciBod21vbiAiCiAJCQkiZGV2aWNlIGZvciBJUE1JIGludGVyZmFjZSAlZFxuIiwKIAkJCXByb2JlLT5pbnRlcmZhY2UpOworCQlyZXMgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CiAJCWdvdG8gaHdtb25fcmVnX2VycjsKIAl9CiAKIAlkYXRhLT51cGRhdGUgPSB1cGRhdGVfYWVtMl9zZW5zb3JzOworCWRhdGEtPnJzX3Jlc3AgPSBremFsbG9jKHNpemVvZigqKGRhdGEtPnJzX3Jlc3ApKSArIDgsIEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+cnNfcmVzcCkgeworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX3Jlc3BfZXJyOworCX0KIAogCS8qIEZpbmQgc2Vuc29ycyAqLwotCWlmIChhZW0yX2ZpbmRfc2Vuc29ycyhkYXRhKSkKKwlyZXMgPSBhZW0yX2ZpbmRfc2Vuc29ycyhkYXRhKTsKKwlpZiAocmVzKQogCQlnb3RvIHNlbnNvcl9lcnI7CiAKIAkvKiBBZGQgdG8gb3VyIGxpc3Qgb2YgQUVNIGRldmljZXMgKi8KQEAgLTc2NCw2ICs3NDIsOCBAQAogCXJldHVybiAwOwogCiBzZW5zb3JfZXJyOgorCWtmcmVlKGRhdGEtPnJzX3Jlc3ApOworYWxsb2NfcmVzcF9lcnI6CiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIGh3bW9uX3JlZ19lcnI6CiAJaXBtaV9kZXN0cm95X3VzZXIoZGF0YS0+aXBtaS51c2VyKTsKQEAgLTc3MSw3ICs3NTEsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRhdGEtPnBkZXYsIE5VTEwpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPnBkZXYpOwogZGV2X2VycjoKLQlhZW1faWRyX3B1dChkYXRhLT5pZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmFlbV9pZGEsIGRhdGEtPmlkKTsKIGlkX2VycjoKIAlrZnJlZShkYXRhKTsKIApAQCAtNzc5LDcgKzc1OSw3IEBACiB9CiAKIC8qIEZpbmQgYW5kIGluaXRpYWxpemUgYWxsIEFFTTIgaW5zdGFuY2VzICovCi1zdGF0aWMgaW50IGFlbV9pbml0X2FlbTIoc3RydWN0IGFlbV9pcG1pX2RhdGEgKnByb2JlKQorc3RhdGljIHZvaWQgYWVtX2luaXRfYWVtMihzdHJ1Y3QgYWVtX2lwbWlfZGF0YSAqcHJvYmUpCiB7CiAJc3RydWN0IGFlbV9maW5kX2luc3RhbmNlX3Jlc3AgZmlfcmVzcDsKIAlpbnQgZXJyOwpAQCAtNzk4LDEyICs3NzgsOSBAQAogCQkJZGV2X2Vycihwcm9iZS0+Ym1jX2RldmljZSwKIAkJCQkiRXJyb3IgJWQgaW5pdGlhbGl6aW5nIEFFTTIgMHglWFxuIiwKIAkJCQllcnIsIGZpX3Jlc3AubW9kdWxlX2hhbmRsZSk7Ci0JCQlyZXR1cm4gZXJyOwogCQl9CiAJCWkrKzsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyogUHJvYmUgYSBCTUMgZm9yIEFFTSBmaXJtd2FyZSBpbnN0YW5jZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vamM0Mi5jIGIvZHJpdmVycy9od21vbi9qYzQyLmMKaW5kZXggMDJjZWJiNy4uMmQzZDcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9qYzQyLmMKKysrIGIvZHJpdmVycy9od21vbi9qYzQyLmMKQEAgLTE1NCw4ICsxNTQsNiBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwogc3RhdGljIGludCBqYzQyX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pOwogc3RhdGljIGludCBqYzQyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBpbnQgamM0Ml9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7Ci1zdGF0aWMgaW50IGpjNDJfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpOwogCiBzdGF0aWMgc3RydWN0IGpjNDJfZGF0YSAqamM0Ml91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKQEAgLTE4Nyw3ICsxODUsNyBAQAogCXN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWRhdGEtPmNvbmZpZyB8PSBKQzQyX0NGR19TSFVURE9XTjsKLQlqYzQyX3dyaXRlX3ZhbHVlKGNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5Nyw3ICsxOTUsNyBAQAogCXN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWRhdGEtPmNvbmZpZyAmPSB+SkM0Ml9DRkdfU0hVVERPV047Ci0JamM0Ml93cml0ZV92YWx1ZShjbGllbnQsIEpDNDJfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLCBkYXRhLT5jb25maWcpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTUsNyArMzEzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsJCQkJCVwKIAlkYXRhLT52YWx1ZSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7CQlcCi0JZXJyID0gamM0Ml93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOwkJXAorCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsJXAogCWlmIChlcnIgPCAwKQkJCQkJCQlcCiAJCXJldCA9IGVycjsJCQkJCQlcCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CQkJCVwKQEAgLTM1Nyw3ICszNTUsOCBAQAogCWRhdGEtPmNvbmZpZyA9IChkYXRhLT5jb25maWcKIAkJCSYgfihKQzQyX0NGR19IWVNUX01BU0sgPDwgSkM0Ml9DRkdfSFlTVF9TSElGVCkpCiAJICB8IChoeXN0IDw8IEpDNDJfQ0ZHX0hZU1RfU0hJRlQpOwotCWVyciA9IGpjNDJfd3JpdGVfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIEpDNDJfUkVHX0NPTkZJRywKKwkJCQkJICAgZGF0YS0+Y29uZmlnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0ID0gZXJyOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwpAQCAtNDUyLDEwICs0NTEsMTAgQEAKIAkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JY2FwID0gamM0Ml9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEpDNDJfUkVHX0NBUCk7Ci0JY29uZmlnID0gamM0Ml9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEpDNDJfUkVHX0NPTkZJRyk7Ci0JbWFuaWQgPSBqYzQyX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSkM0Ml9SRUdfTUFOSUQpOwotCWRldmlkID0gamM0Ml9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEpDNDJfUkVHX0RFVklDRUlEKTsKKwljYXAgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ0FQKTsKKwljb25maWcgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ09ORklHKTsKKwltYW5pZCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19NQU5JRCk7CisJZGV2aWQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQobmV3X2NsaWVudCwgSkM0Ml9SRUdfREVWSUNFSUQpOwogCiAJaWYgKGNhcCA8IDAgfHwgY29uZmlnIDwgMCB8fCBtYW5pZCA8IDAgfHwgZGV2aWQgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ4OSwxNCArNDg4LDE0IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWNhcCA9IGpjNDJfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBKQzQyX1JFR19DQVApOworCWNhcCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19DQVApOwogCWlmIChjYXAgPCAwKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdF9mcmVlOwogCX0KIAlkYXRhLT5leHRlbmRlZCA9ICEhKGNhcCAmIEpDNDJfQ0FQX1JBTkdFKTsKIAotCWNvbmZpZyA9IGpjNDJfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBKQzQyX1JFR19DT05GSUcpOworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChuZXdfY2xpZW50LCBKQzQyX1JFR19DT05GSUcpOwogCWlmIChjb25maWcgPCAwKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdF9mcmVlOwpAQCAtNTA0LDcgKzUwMyw4IEBACiAJZGF0YS0+b3JpZ19jb25maWcgPSBjb25maWc7CiAJaWYgKGNvbmZpZyAmIEpDNDJfQ0ZHX1NIVVRET1dOKSB7CiAJCWNvbmZpZyAmPSB+SkM0Ml9DRkdfU0hVVERPV047Ci0JCWpjNDJfd3JpdGVfdmFsdWUobmV3X2NsaWVudCwgSkM0Ml9SRUdfQ09ORklHLCBjb25maWcpOworCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKG5ld19jbGllbnQsIEpDNDJfUkVHX0NPTkZJRywKKwkJCQkJICAgICBjb25maWcpOwogCX0KIAlkYXRhLT5jb25maWcgPSBjb25maWc7CiAKQEAgLTUzNSwyNSArNTM1LDEyIEBACiAJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZqYzQyX2dyb3VwKTsKIAlpZiAoZGF0YS0+Y29uZmlnICE9IGRhdGEtPm9yaWdfY29uZmlnKQotCQlqYzQyX3dyaXRlX3ZhbHVlKGNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLCBkYXRhLT5vcmlnX2NvbmZpZyk7CisJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBKQzQyX1JFR19DT05GSUcsCisJCQkJCSAgICAgZGF0YS0+b3JpZ19jb25maWcpOwogCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQogCi0vKiBBbGwgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLiAqLwotc3RhdGljIGludCBqYzQyX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCWludCByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBzd2FiMTYocmV0KTsKLX0KLQotc3RhdGljIGludCBqYzQyX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQotewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKLX0KLQogc3RhdGljIHN0cnVjdCBqYzQyX2RhdGEgKmpjNDJfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKQEAgLTU2NCwyOCArNTUxLDI5IEBACiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgewotCQl2YWwgPSBqYzQyX3JlYWRfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19URU1QKTsKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgSkM0Ml9SRUdfVEVNUCk7CiAJCWlmICh2YWwgPCAwKSB7CiAJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAJCWRhdGEtPnRlbXBfaW5wdXQgPSB2YWw7CiAKLQkJdmFsID0gamM0Ml9yZWFkX3ZhbHVlKGNsaWVudCwgSkM0Ml9SRUdfVEVNUF9DUklUSUNBTCk7CisJCXZhbCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQkgIEpDNDJfUkVHX1RFTVBfQ1JJVElDQUwpOwogCQlpZiAodmFsIDwgMCkgewogCQkJcmV0ID0gRVJSX1BUUih2YWwpOwogCQkJZ290byBhYm9ydDsKIAkJfQogCQlkYXRhLT50ZW1wX2NyaXQgPSB2YWw7CiAKLQkJdmFsID0gamM0Ml9yZWFkX3ZhbHVlKGNsaWVudCwgSkM0Ml9SRUdfVEVNUF9MT1dFUik7CisJCXZhbCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIEpDNDJfUkVHX1RFTVBfTE9XRVIpOwogCQlpZiAodmFsIDwgMCkgewogCQkJcmV0ID0gRVJSX1BUUih2YWwpOwogCQkJZ290byBhYm9ydDsKIAkJfQogCQlkYXRhLT50ZW1wX21pbiA9IHZhbDsKIAotCQl2YWwgPSBqYzQyX3JlYWRfdmFsdWUoY2xpZW50LCBKQzQyX1JFR19URU1QX1VQUEVSKTsKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgSkM0Ml9SRUdfVEVNUF9VUFBFUik7CiAJCWlmICh2YWwgPCAwKSB7CiAJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CiAJCQlnb3RvIGFib3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTczLmMgYi9kcml2ZXJzL2h3bW9uL2xtNzMuYwppbmRleCAyOWI5MDMwLi45ZTY0ZDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzMuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzMuYwpAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBMTTczX1JFR19DVFJMCQkweDA0CiAjZGVmaW5lIExNNzNfUkVHX0lECQkweDA3CiAKLSNkZWZpbmUgTE03M19JRAkJCTB4OTAwMSAvKiBvciAweDE5MCBhZnRlciBhIHN3YWIxNigpICovCisjZGVmaW5lIExNNzNfSUQJCQkweDkwMDEJLyogMHgwMTkwLCBieXRlLXN3YXBwZWQgKi8KICNkZWZpbmUgRFJWTkFNRQkJCSJsbTczIgogI2RlZmluZSBMTTczX1RFTVBfTUlOCQkoLTQwKQogI2RlZmluZSBMTTczX1RFTVBfTUFYCQkxNTAKQEAgLTU3LDcgKzU3LDcgQEAKIAkvKiBXcml0ZSB2YWx1ZSAqLwogCXZhbHVlID0gKHNob3J0KSBTRU5TT1JTX0xJTUlUKHRlbXAvMjUwLCAoTE03M19URU1QX01JTio0KSwKIAkJKExNNzNfVEVNUF9NQVgqNCkpIDw8IDU7Ci0JaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIGF0dHItPmluZGV4LCBzd2FiMTYodmFsdWUpKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgYXR0ci0+aW5kZXgsIHZhbHVlKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTY4LDggKzY4LDggQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCS8qIHVzZSBpbnRlZ2VyIGRpdmlzaW9uIGluc3RlYWQgb2YgZXF1aXZhbGVudCByaWdodCBzaGlmdCB0bwogCSAgIGd1YXJhbnRlZSBhcml0aG1ldGljIHNoaWZ0IGFuZCBwcmVzZXJ2ZSB0aGUgc2lnbiAqLwotCWludCB0ZW1wID0gKChzMTYpIChzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKLQkJYXR0ci0+aW5kZXgpKSkqMjUwKSAvIDMyOworCWludCB0ZW1wID0gKChzMTYpIChpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkgICAgYXR0ci0+aW5kZXgpKSoyNTApIC8gMzI7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwogfQogCkBAIC0xNTAsMTcgKzE1MCwzMSBAQAogCQkJc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7Ci0JdTE2IGlkOwotCXU4IGN0cmw7CisJaW50IGlkLCBjdHJsLCBjb25mOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAogCQkJCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qCisJICogRG8gYXMgbXVjaCBkZXRlY3Rpb24gYXMgcG9zc2libGUgd2l0aCBieXRlIHJlYWRzIGZpcnN0LCBhcyB3b3JkCisJICogcmVhZHMgY2FuIGNvbmZ1c2Ugb3RoZXIgZGV2aWNlcy4KKwkgKi8KKwljdHJsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNNzNfUkVHX0NUUkwpOworCWlmIChjdHJsIDwgMCB8fCAoY3RybCAmIDB4MTApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNvbmYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE03M19SRUdfQ09ORik7CisJaWYgKGNvbmYgPCAwIHx8IChjb25mICYgMHgwYykpCisJCXJldHVybiAtRU5PREVWOworCisJaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE03M19SRUdfSUQpOworCWlmIChpZCA8IDAgfHwgaWQgIT0gKExNNzNfSUQgJiAweGZmKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBDaGVjayBkZXZpY2UgSUQgKi8KIAlpZCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShuZXdfY2xpZW50LCBMTTczX1JFR19JRCk7Ci0JY3RybCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTczX1JFR19DVFJMKTsKLQlpZiAoKGlkICE9IExNNzNfSUQpIHx8IChjdHJsICYgMHgxMCkpCisJaWYgKGlkIDwgMCB8fCBpZCAhPSBMTTczX0lEKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN0cmxjcHkoaW5mby0+dHlwZSwgImxtNzMiLCBJMkNfTkFNRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOTAxMjZhMi4uMTg4OGRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTM4NCwxMyArMzg0LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgbG03NV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKIHsKLQlpbnQgdmFsdWU7Ci0KIAlpZiAocmVnID09IExNNzVfUkVHX0NPTkYpCiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwotCi0JdmFsdWUgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCXJldHVybiAodmFsdWUgPCAwKSA/IHZhbHVlIDogc3dhYjE2KHZhbHVlKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcpOwogfQogCiBzdGF0aWMgaW50IGxtNzVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCkBAIC0zOTgsNyArMzk1LDcgQEAKIAlpZiAocmVnID09IExNNzVfUkVHX0NPTkYpCiAJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiAJZWxzZQotCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7CisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbG03NV9kYXRhICpsbTc1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc3LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzcuYwppbmRleCBiMjhhMjk3Li44ZGZjNjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzcuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzcuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAJaWYgKHJlZyA9PSBMTTc3X1JFR19DT05GKQogCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIAllbHNlCi0JCXJldHVybiBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKSk7CisJCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcpOwogfQogCiBzdGF0aWMgaW50IGxtNzdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCkBAIC0zNzMsNyArMzczLDcgQEAKIAlpZiAocmVnID09IExNNzdfUkVHX0NPTkYpCiAJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiAJZWxzZQotCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7CisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGxtNzdfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05MC5jIGIvZHJpdmVycy9od21vbi9sbTkwLmMKaW5kZXggOTBkZGI4Ny4uNjE1YmM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTkwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTkwLmMKQEAgLTExMDUsNDEgKzExMDUsMzcgQEAKICAqLwogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgbG05MF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCitzdGF0aWMgaW50IGxtOTBfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQlpbnQgYWRkcmVzcyA9IG5ld19jbGllbnQtPmFkZHI7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCWludCBhZGRyZXNzID0gY2xpZW50LT5hZGRyOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCWludCBtYW5faWQsIGNoaXBfaWQsIHJlZ19jb25maWcxLCByZWdfY29uZmlnMiwgcmVnX2NvbnZyYXRlOworCWludCBtYW5faWQsIGNoaXBfaWQsIGNvbmZpZzEsIGNvbmZpZzIsIGNvbnZyYXRlOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGRldGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb24gKi8KLQlpZiAoKG1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9NQU5fSUQpKSA8IDAKLQkgfHwgKGNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCUxNOTBfUkVHX1JfQ0hJUF9JRCkpIDwgMAotCSB8fCAocmVnX2NvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCUxNOTBfUkVHX1JfQ09ORklHMSkpIDwgMAotCSB8fCAocmVnX2NvbnZyYXRlID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlMTTkwX1JFR19SX0NPTlZSQVRFKSkgPCAwKQorCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1JfTUFOX0lEKTsKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfUl9DSElQX0lEKTsKKwljb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfUl9DT05GSUcxKTsKKwljb252cmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1JfQ09OVlJBVEUpOworCWlmIChtYW5faWQgPCAwIHx8IGNoaXBfaWQgPCAwIHx8IGNvbmZpZzEgPCAwIHx8IGNvbnZyYXRlIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAobWFuX2lkID09IDB4MDEgfHwgbWFuX2lkID09IDB4NUMgfHwgbWFuX2lkID09IDB4NDEpIHsKLQkJcmVnX2NvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCQkJCUxNOTBfUkVHX1JfQ09ORklHMik7Ci0JCWlmIChyZWdfY29uZmlnMiA8IDApCisJCWNvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19SX0NPTkZJRzIpOworCQlpZiAoY29uZmlnMiA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UKLQkJcmVnX2NvbmZpZzIgPSAwOwkvKiBNYWtlIGNvbXBpbGVyIGhhcHB5ICovCisJCWNvbmZpZzIgPSAwOwkJLyogTWFrZSBjb21waWxlciBoYXBweSAqLwogCiAJaWYgKChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQogCSAmJiBtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCi0JCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCi0JCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCi0JCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQlpZiAoKGNvbmZpZzEgJiAweDJBKSA9PSAweDAwCisJCSAmJiAoY29uZmlnMiAmIDB4RjgpID09IDB4MDAKKwkJICYmIGNvbnZyYXRlIDw9IDB4MDkpIHsKIAkJCWlmIChhZGRyZXNzID09IDB4NEMKIAkJCSAmJiAoY2hpcF9pZCAmIDB4RjApID09IDB4MjApIHsgLyogTE05MCAqLwogCQkJCW5hbWUgPSAibG05MCI7CkBAIC0xMTYzLDggKzExNTksOCBAQAogCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKIAkgJiYgbWFuX2lkID09IDB4NDEpIHsgLyogQW5hbG9nIERldmljZXMgKi8KIAkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHg0MCAvKiBBRE0xMDMyICovCi0JCSAmJiAocmVnX2NvbmZpZzEgJiAweDNGKSA9PSAweDAwCi0JCSAmJiByZWdfY29udnJhdGUgPD0gMHgwQSkgeworCQkgJiYgKGNvbmZpZzEgJiAweDNGKSA9PSAweDAwCisJCSAmJiBjb252cmF0ZSA8PSAweDBBKSB7CiAJCQluYW1lID0gImFkbTEwMzIiOwogCQkJLyogVGhlIEFETTEwMzIgc3VwcG9ydHMgUEVDLCBidXQgb25seSBpZiBjb21iaW5lZAogCQkJICAgdHJhbnNhY3Rpb25zIGFyZSBub3QgdXNlZC4gKi8KQEAgLTExNzMsMTggKzExNjksMTggQEAKIAkJCQlpbmZvLT5mbGFncyB8PSBJMkNfQ0xJRU5UX1BFQzsKIAkJfSBlbHNlCiAJCWlmIChjaGlwX2lkID09IDB4NTEgLyogQURUNzQ2MSAqLwotCQkgJiYgKHJlZ19jb25maWcxICYgMHgxQikgPT0gMHgwMAotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MEEpIHsKKwkJICYmIChjb25maWcxICYgMHgxQikgPT0gMHgwMAorCQkgJiYgY29udnJhdGUgPD0gMHgwQSkgewogCQkJbmFtZSA9ICJhZHQ3NDYxIjsKIAkJfSBlbHNlCiAJCWlmIChjaGlwX2lkID09IDB4NTcgLyogQURUNzQ2MUEsIE5DVDEwMDggKi8KLQkJICYmIChyZWdfY29uZmlnMSAmIDB4MUIpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDBBKSB7CisJCSAmJiAoY29uZmlnMSAmIDB4MUIpID09IDB4MDAKKwkJICYmIGNvbnZyYXRlIDw9IDB4MEEpIHsKIAkJCW5hbWUgPSAiYWR0NzQ2MWEiOwogCQl9CiAJfSBlbHNlCiAJaWYgKG1hbl9pZCA9PSAweDREKSB7IC8qIE1heGltICovCi0JCWludCByZWdfZW1lcmcsIHJlZ19lbWVyZzIsIHJlZ19zdGF0dXMyOworCQlpbnQgZW1lcmcsIGVtZXJnMiwgc3RhdHVzMjsKIAogCQkvKgogCQkgKiBXZSByZWFkIE1BWDY2NTlfUkVHX1JfUkVNT1RFX0VNRVJHIHR3aWNlLCBhbmQgcmUtcmVhZApAQCAtMTE5MiwxMyArMTE4OCwxNSBAQAogCQkgKiBleGlzdHMsIGJvdGggcmVhZGluZ3Mgd2lsbCByZWZsZWN0IHRoZSBzYW1lIHZhbHVlLiBPdGhlcndpc2UsCiAJCSAqIHRoZSByZWFkaW5ncyB3aWxsIGJlIGRpZmZlcmVudC4KIAkJICovCi0JCWlmICgocmVnX2VtZXJnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlNQVg2NjU5X1JFR19SX1JFTU9URV9FTUVSRykpIDwgMAotCQkgfHwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTBfUkVHX1JfTUFOX0lEKSA8IDAKLQkJIHx8IChyZWdfZW1lcmcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlNQVg2NjU5X1JFR19SX1JFTU9URV9FTUVSRykpIDwgMAotCQkgfHwgKHJlZ19zdGF0dXMyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlNQVg2Njk2X1JFR19SX1NUQVRVUzIpKSA8IDApCisJCWVtZXJnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSBNQVg2NjU5X1JFR19SX1JFTU9URV9FTUVSRyk7CisJCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgIExNOTBfUkVHX1JfTUFOX0lEKTsKKwkJZW1lcmcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgTUFYNjY1OV9SRUdfUl9SRU1PVEVfRU1FUkcpOworCQlzdGF0dXMyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgIE1BWDY2OTZfUkVHX1JfU1RBVFVTMik7CisJCWlmIChlbWVyZyA8IDAgfHwgbWFuX2lkIDwgMCB8fCBlbWVyZzIgPCAwIHx8IHN0YXR1czIgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJLyoKQEAgLTEyMTYsOCArMTIxNCw4IEBACiAJCSAqLwogCQlpZiAoY2hpcF9pZCA9PSBtYW5faWQKIAkJICYmIChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREIHx8IGFkZHJlc3MgPT0gMHg0RSkKLQkJICYmIChyZWdfY29uZmlnMSAmIDB4MUYpID09IChtYW5faWQgJiAweDBGKQotCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKKwkJICYmIChjb25maWcxICYgMHgxRikgPT0gKG1hbl9pZCAmIDB4MEYpCisJCSAmJiBjb252cmF0ZSA8PSAweDA5KSB7CiAJCQlpZiAoYWRkcmVzcyA9PSAweDRDKQogCQkJCW5hbWUgPSAibWF4NjY1NyI7CiAJCQllbHNlCkBAIC0xMjM1LDEwICsxMjMzLDEwIEBACiAJCSAqIG9uZSBvZiB0aG9zZSByZWdpc3RlcnMgZXhpc3RzLgogCQkgKi8KIAkJaWYgKGNoaXBfaWQgPT0gMHgwMQotCQkgJiYgKHJlZ19jb25maWcxICYgMHgxMCkgPT0gMHgwMAotCQkgJiYgKHJlZ19zdGF0dXMyICYgMHgwMSkgPT0gMHgwMAotCQkgJiYgcmVnX2VtZXJnID09IHJlZ19lbWVyZzIKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA3KSB7CisJCSAmJiAoY29uZmlnMSAmIDB4MTApID09IDB4MDAKKwkJICYmIChzdGF0dXMyICYgMHgwMSkgPT0gMHgwMAorCQkgJiYgZW1lcmcgPT0gZW1lcmcyCisJCSAmJiBjb252cmF0ZSA8PSAweDA3KSB7CiAJCQluYW1lID0gIm1heDY2OTYiOwogCQl9IGVsc2UKIAkJLyoKQEAgLTEyNDgsOCArMTI0Niw4IEBACiAJCSAqIHNlY29uZCB0byBsYXN0IGJpdCBvZiBjb25maWcxIChzb2Z0d2FyZSByZXNldCkuCiAJCSAqLwogCQlpZiAoY2hpcF9pZCA9PSAweDAxCi0JCSAmJiAocmVnX2NvbmZpZzEgJiAweDAzKSA9PSAweDAwCi0JCSAmJiByZWdfY29udnJhdGUgPD0gMHgwNykgeworCQkgJiYgKGNvbmZpZzEgJiAweDAzKSA9PSAweDAwCisJCSAmJiBjb252cmF0ZSA8PSAweDA3KSB7CiAJCQluYW1lID0gIm1heDY2ODAiOwogCQl9IGVsc2UKIAkJLyoKQEAgLTEyNTgsMjEgKzEyNTYsMjEgQEAKIAkJICogcmVnaXN0ZXIgYXJlIHVudXNlZCBhbmQgc2hvdWxkIHJldHVybiB6ZXJvIHdoZW4gcmVhZC4KIAkJICovCiAJCWlmIChjaGlwX2lkID09IDB4NTkKLQkJICYmIChyZWdfY29uZmlnMSAmIDB4M2YpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA3KSB7CisJCSAmJiAoY29uZmlnMSAmIDB4M2YpID09IDB4MDAKKwkJICYmIGNvbnZyYXRlIDw9IDB4MDcpIHsKIAkJCW5hbWUgPSAibWF4NjY0NiI7CiAJCX0KIAl9IGVsc2UKIAlpZiAoYWRkcmVzcyA9PSAweDRDCiAJICYmIG1hbl9pZCA9PSAweDVDKSB7IC8qIFdpbmJvbmQvTnV2b3RvbiAqLwotCQlpZiAoKHJlZ19jb25maWcxICYgMHgyQSkgPT0gMHgwMAotCQkgJiYgKHJlZ19jb25maWcyICYgMHhGOCkgPT0gMHgwMCkgeworCQlpZiAoKGNvbmZpZzEgJiAweDJBKSA9PSAweDAwCisJCSAmJiAoY29uZmlnMiAmIDB4RjgpID09IDB4MDApIHsKIAkJCWlmIChjaGlwX2lkID09IDB4MDEgLyogVzgzTDc3MVcvRyAqLwotCQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCQkgJiYgY29udnJhdGUgPD0gMHgwOSkgewogCQkJCW5hbWUgPSAidzgzbDc3MSI7CiAJCQl9IGVsc2UKIAkJCWlmICgoY2hpcF9pZCAmIDB4RkUpID09IDB4MTAgLyogVzgzTDc3MUFXRy9BU0cgKi8KLQkJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOCkgeworCQkJICYmIGNvbnZyYXRlIDw9IDB4MDgpIHsKIAkJCQluYW1lID0gInc4M2w3NzEiOwogCQkJfQogCQl9CkBAIC0xMjgwLDkgKzEyNzgsOSBAQAogCWlmIChhZGRyZXNzID49IDB4NDggJiYgYWRkcmVzcyA8PSAweDRGCiAJICYmIG1hbl9pZCA9PSAweEExKSB7IC8qICBOWFAgU2VtaWNvbmR1Y3Rvci9QaGlsaXBzICovCiAJCWlmIChjaGlwX2lkID09IDB4MDAKLQkJICYmIChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKLQkJICYmIChyZWdfY29uZmlnMiAmIDB4RkUpID09IDB4MDAKLQkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCSAmJiAoY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJICYmIChjb25maWcyICYgMHhGRSkgPT0gMHgwMAorCQkgJiYgY29udnJhdGUgPD0gMHgwOSkgewogCQkJbmFtZSA9ICJzYTU2MDA0IjsKIAkJfQogCX0KQEAgLTEzMDEsMTkgKzEyOTksMTggQEAKIAogc3RhdGljIHZvaWQgbG05MF9yZW1vdmVfZmlsZXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxtOTBfZGF0YSAqZGF0YSkKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfVEVNUDMpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtOTBfdGVtcDNfZ3JvdXApOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfdGVtcDNfZ3JvdXApOwogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9FTUVSR0VOQ1lfQUxBUk0pCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKLQkJCQkgICAmbG05MF9lbWVyZ2VuY3lfYWxhcm1fZ3JvdXApOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfZW1lcmdlbmN5X2FsYXJtX2dyb3VwKTsKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZKQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosCi0JCQkJICAgJmxtOTBfZW1lcmdlbmN5X2dyb3VwKTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZsbTkwX2VtZXJnZW5jeV9ncm91cCk7CiAJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX09GRlNFVCkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwKLQkJCQkgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX29mZnNldC5kZXZfYXR0cik7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3BlYyk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG05MF9ncm91cCk7CisJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfb2Zmc2V0LmRldl9hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGVjKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmxtOTBfZ3JvdXApOwogfQogCiBzdGF0aWMgdm9pZCBsbTkwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0xMzYyLDEwICsxMzU5LDExIEBACiAJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19XX0NPTkZJRzEsIGNvbmZpZyk7CiB9CiAKLXN0YXRpYyBpbnQgbG05MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKK3N0YXRpYyBpbnQgbG05MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIobmV3X2NsaWVudC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGRldi0+cGFyZW50KTsKIAlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhOwogCWludCBlcnI7CiAKQEAgLTEzNzQsMTQgKzEzNzIsMTQgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwogCX0KLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogU2V0IHRoZSBkZXZpY2UgdHlwZSAqLwogCWRhdGEtPmtpbmQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaWYgKGRhdGEtPmtpbmQgPT0gYWRtMTAzMikgewogCQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQotCQkJbmV3X2NsaWVudC0+ZmxhZ3MgJj0gfkkyQ19DTElFTlRfUEVDOworCQkJY2xpZW50LT5mbGFncyAmPSB+STJDX0NMSUVOVF9QRUM7CiAJfQogCiAJLyogRGlmZmVyZW50IGRldmljZXMgaGF2ZSBkaWZmZXJlbnQgYWxhcm0gYml0cyB0cmlnZ2VyaW5nIHRoZQpAQCAtMTM5Niw0MyArMTM5NCw0MSBAQAogCWRhdGEtPm1heF9jb252cmF0ZSA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLm1heF9jb252cmF0ZTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExNOTAgY2hpcCAqLwotCWxtOTBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJbG05MF9pbml0X2NsaWVudChjbGllbnQpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05MF9ncm91cCk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZsbTkwX2dyb3VwKTsKIAlpZiAoZXJyKQogCQlnb3RvIGV4aXRfZnJlZTsKLQlpZiAobmV3X2NsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX1BFQykgewotCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3BlYyk7CisJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX1BFQykgeworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGVjKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfQogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9PRkZTRVQpIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfb2Zmc2V0LmRldl9hdHRyKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfQogCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9FTUVSR0VOQ1kpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwKLQkJCQkJICZsbTkwX2VtZXJnZW5jeV9ncm91cCk7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmbG05MF9lbWVyZ2VuY3lfZ3JvdXApOwogCQlpZiAoZXJyKQogCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKIAl9CiAJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkgewotCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLAorCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwKIAkJCQkJICZsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwogCX0KIAlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfVEVNUDMpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwKLQkJCQkJICZsbTkwX3RlbXAzX2dyb3VwKTsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZsbTkwX3RlbXAzX2dyb3VwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfQogCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CiAJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CkBAIC0xNDQxLDcgKzE0MzcsNyBAQAogCXJldHVybiAwOwogCiBleGl0X3JlbW92ZV9maWxlczoKLQlsbTkwX3JlbW92ZV9maWxlcyhuZXdfY2xpZW50LCBkYXRhKTsKKwlsbTkwX3JlbW92ZV9maWxlcyhjbGllbnQsIGRhdGEpOwogZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05Mi5jIGIvZHJpdmVycy9od21vbi9sbTkyLmMKaW5kZXggN2MzMWU2Mi4uOGZjYmQ0ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05Mi5jCkBAIC0xMTcsMTYgKzExNywxNiBAQAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKQogCSB8fCAhZGF0YS0+dmFsaWQpIHsKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTkyIGRhdGFcbiIpOwotCQlkYXRhLT50ZW1wMV9pbnB1dCA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCSAgICBMTTkyX1JFR19URU1QKSk7Ci0JCWRhdGEtPnRlbXAxX2h5c3QgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKLQkJCQkgICAgTE05Ml9SRUdfVEVNUF9IWVNUKSk7Ci0JCWRhdGEtPnRlbXAxX2NyaXQgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKLQkJCQkgICAgTE05Ml9SRUdfVEVNUF9DUklUKSk7Ci0JCWRhdGEtPnRlbXAxX21pbiA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCSAgICBMTTkyX1JFR19URU1QX0xPVykpOwotCQlkYXRhLT50ZW1wMV9tYXggPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKLQkJCQkgICAgTE05Ml9SRUdfVEVNUF9ISUdIKSk7CisJCWRhdGEtPnRlbXAxX2lucHV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUCk7CisJCWRhdGEtPnRlbXAxX2h5c3QgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0hZU1QpOworCQlkYXRhLT50ZW1wMV9jcml0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUF9DUklUKTsKKwkJZGF0YS0+dGVtcDFfbWluID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkgICAgTE05Ml9SRUdfVEVNUF9MT1cpOworCQlkYXRhLT50ZW1wMV9tYXggPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCSAgICBMTTkyX1JFR19URU1QX0hJR0gpOwogCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CiAJCWRhdGEtPnZhbGlkID0gMTsKQEAgLTE1OCw3ICsxNTgsNyBAQAogIFwKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKIAlkYXRhLT52YWx1ZSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYoZGF0YS0+dmFsdWUpKTsgXAorCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCiAJcmV0dXJuIGNvdW50OyBcCiB9CkBAIC0xOTQsOCArMTk0LDggQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT50ZW1wMV9oeXN0ID0gVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wMV9jcml0KSAtIHZhbDsKLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgTE05Ml9SRUdfVEVNUF9IWVNULAotCQkJCSAgc3dhYjE2KFRFTVBfVE9fUkVHKGRhdGEtPnRlbXAxX2h5c3QpKSk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIExNOTJfUkVHX1RFTVBfSFlTVCwKKwkJCQkgICAgIFRFTVBfVE9fUkVHKGRhdGEtPnRlbXAxX2h5c3QpKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDE2MDY1LmMgYi9kcml2ZXJzL2h3bW9uL21heDE2MDY1LmMKaW5kZXggZGQyZDdiOS4uMzg1ODg2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgxNjA2NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4MTYwNjUuYwpAQCAtMTM3LDEwICsxMzcsMTAgQEAKIHsKIAlpbnQgcnY7CiAKLQlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJcnYgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCByZWcpOwogCWlmICh1bmxpa2VseShydiA8IDApKQogCQlyZXR1cm4gcnY7Ci0JcmV0dXJuICgocnYgJiAweGZmKSA8PCAyKSB8ICgocnYgPj4gMTQpICYgMHgwMyk7CisJcmV0dXJuIHJ2ID4+IDY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWF4MTYwNjVfZGF0YSAqbWF4MTYwNjVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21jMTM3ODMtYWRjLmMgYi9kcml2ZXJzL2h3bW9uL21jMTM3ODMtYWRjLmMKaW5kZXggZDUyMjZjOS4uZWY2NWFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYzEzNzgzLWFkYy5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWMxMzc4My1hZGMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBNQzEzNzgzX0FEQ19OQU1FCSJtYzEzNzgzLWFkYyIKIAogc3RydWN0IG1jMTM3ODNfYWRjX3ByaXYgewotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzOworCXN0cnVjdCBtYzEzeHh4ICptYzEzeHh4OwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIH07CiAKQEAgLTUxLDggKzUxLDggQEAKIAl1bnNpZ25lZCBpbnQgc2FtcGxlWzRdOwogCWludCByZXQ7CiAKLQlyZXQgPSBtYzEzNzgzX2FkY19kb19jb252ZXJzaW9uKHByaXYtPm1jMTM3ODMsCi0JCQlNQzEzNzgzX0FEQ19NT0RFX01VTFRfQ0hBTiwKKwlyZXQgPSBtYzEzeHh4X2FkY19kb19jb252ZXJzaW9uKHByaXYtPm1jMTN4eHgsCisJCQlNQzEzWFhYX0FEQ19NT0RFX01VTFRfQ0hBTiwKIAkJCWNoYW5uZWwsIHNhbXBsZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE0Nyw5ICsxNDcsOSBAQAogc3RhdGljIGludCBtYzEzNzgzX2FkY191c2VfdG91Y2hzY3JlZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWMxMzc4M19hZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGZsYWdzID0gbWMxMzc4M19nZXRfZmxhZ3MocHJpdi0+bWMxMzc4Myk7CisJdW5zaWduZWQgZmxhZ3MgPSBtYzEzeHh4X2dldF9mbGFncyhwcml2LT5tYzEzeHh4KTsKIAotCXJldHVybiBmbGFncyAmIE1DMTM3ODNfVVNFX1RPVUNIU0NSRUVOOworCXJldHVybiBmbGFncyAmIE1DMTNYWFhfVVNFX1RPVUNIU0NSRUVOOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBtYzEzNzgzX2FkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTYxLDcgKzE2MSw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaXYtPm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJcHJpdi0+bWMxM3h4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NodDIxLmMgYi9kcml2ZXJzL2h3bW9uL3NodDIxLmMKaW5kZXggMWM4Yzk4MS4uMTUzOTg3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zaHQyMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2h0MjEuYwpAQCAtODMsMjUgKzgzLDYgQEAKIH0KIAogLyoqCi0gKiBzaHQyMV9yZWFkX3dvcmRfZGF0YSgpIC0gcmVhZCB3b3JkIGZyb20gcmVnaXN0ZXIKLSAqIEBjbGllbnQ6IEkyQyBjbGllbnQgZGV2aWNlCi0gKiBAcmVnOiBJMkMgY29tbWFuZCBieXRlCi0gKgotICogUmV0dXJucyB2YWx1ZSwgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNodDIxX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKLXsKLQlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkvKgotCSAqIFNNQnVzIHNwZWNpZmllcyBsb3cgYnl0ZSBmaXJzdCwgYnV0IHRoZSBTSFQyMSByZXR1cm5zIE1TQgotCSAqIGZpcnN0LCBzbyB3ZSBoYXZlIHRvIHN3YWIxNiB0aGUgdmFsdWVzCi0JICovCi0JcmV0dXJuIHN3YWIxNihyZXQpOwotfQotCi0vKioKICAqIHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoKSAtIGdldCB1cGRhdGVkIG1lYXN1cmVtZW50cyBmcm9tIGRldmljZQogICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKICAqCkBAIC0xMTksMTIgKzEwMCwxMyBAQAogCSAqIG1heGltdW0gdHdvIG1lYXN1cmVtZW50cyBwZXIgc2Vjb25kIGF0IDEyYml0IGFjY3VyYWN5IHNoYWxsIGJlIG1hZGUuCiAJICovCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc2h0MjEtPmxhc3RfdXBkYXRlICsgSFogLyAyKSB8fCAhc2h0MjEtPnZhbGlkKSB7Ci0JCXJldCA9IHNodDIxX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgU0hUMjFfVFJJR19UX01FQVNVUkVNRU5UX0hNKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCSAgU0hUMjFfVFJJR19UX01FQVNVUkVNRU5UX0hNKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJc2h0MjEtPnRlbXBlcmF0dXJlID0gc2h0MjFfdGVtcF90aWNrc190b19taWxsaWNlbHNpdXMocmV0KTsKLQkJcmV0ID0gc2h0MjFfcmVhZF93b3JkX2RhdGEoY2xpZW50LAotCQkJCQlTSFQyMV9UUklHX1JIX01FQVNVUkVNRU5UX0hNKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCSAgU0hUMjFfVFJJR19SSF9NRUFTVVJFTUVOVF9ITSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJCXNodDIxLT5odW1pZGl0eSA9IHNodDIxX3JoX3RpY2tzX3RvX3Blcl9jZW50X21pbGxlKHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jIGIvZHJpdmVycy9od21vbi9zbW02NjUuYwppbmRleCA0MjVkZjViYy4uNDExNjM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbW02NjUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NtbTY2NS5jCkBAIC0yMTQsMzMgKzIxNCwyNiBAQAogCSAqCiAJICogTmVpdGhlciBpMmNfc21idXNfcmVhZF9ieXRlKCkgbm9yCiAJICogaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YSgpIHdvcmtlZCBoZXJlLAotCSAqIHNvIHVzZSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoKSBpbnN0ZWFkLgorCSAqIHNvIHVzZSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoKSBpbnN0ZWFkLgogCSAqIFdlIGNvdWxkIGFsc28gdHJ5IHRvIHVzZSBpMmNfbWFzdGVyX3JlY3YoKSwKIAkgKiBidXQgdGhhdCBpcyBub3QgYWx3YXlzIHN1cHBvcnRlZC4KIAkgKi8KLQlydiA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDApOworCXJ2ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgMCk7CiAJaWYgKHJ2IDwgMCkgewogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWFkIEFEQyB2YWx1ZTogZXJyb3IgJWQiLCBydik7CiAJCXJldHVybiAtMTsKIAl9CiAJLyoKIAkgKiBWYWxpZGF0ZS92ZXJpZnkgcmVhZGJhY2sgYWRjIGNoYW5uZWwgKGluIGJpdCAxMS4uMTQpLgotCSAqIEhpZ2ggYnl0ZSBpcyBpbiBsb3dlciA4IGJpdCBvZiBydiwgc28gb25seSBzaGlmdCBieSAzLgogCSAqLwotCXJhZGMgPSAocnYgPj4gMykgJiAweDBmOworCXJhZGMgPSAocnYgPj4gMTEpICYgMHgwZjsKIAlpZiAocmFkYyAhPSBhZGMpIHsKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVbmV4cGVjdGVkIFJBREM6IEV4cGVjdGVkICVkIGdvdCAlZCIsCiAJCQlhZGMsIHJhZGMpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JLyoKLQkgKiBDaGlwIHJlcGxpZXMgd2l0aCBIL0wsIHdoaWxlIFNNQnVzIGV4cGVjdHMgTC9ILgotCSAqIFRodXMsIGJ5dGUgb3JkZXIgaXMgcmV2ZXJzZWQsIGFuZCB3ZSBoYXZlIHRvIHN3YXAKLQkgKiB0aGUgcmVzdWx0LgotCSAqLwotCXJ2ID0gc3dhYjE2KHJ2KSAmIFNNTTY2NV9BRENfTUFTSzsKIAotCXJldHVybiBydjsKKwlyZXR1cm4gcnYgJiBTTU02NjVfQURDX01BU0s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc21tNjY1X2RhdGEgKnNtbTY2NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKaW5kZXggOWZiNzUxNi4uNjVjODhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXU4IHRlbXBbNF07CiB9OwogCi1zdGF0aWMgaW50IHNtc2M0N2IzOTdfcmVhZF92YWx1ZShzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhKiBkYXRhLCB1OCByZWcpCitzdGF0aWMgaW50IHNtc2M0N2IzOTdfcmVhZF92YWx1ZShzdHJ1Y3Qgc21zYzQ3YjM5N19kYXRhICpkYXRhLCB1OCByZWcpCiB7CiAJaW50IHJlczsKIApAQCAtMjY1LDcgKzI2NSw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbXNjNDdiMzk3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNtc2M0N2IzOTdfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JlbGVhc2U7CiAJfQpAQCAtMjc2LDcgKzI3Nyw4IEBACiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJnNtc2M0N2IzOTdfZ3JvdXApKSkKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJnNtc2M0N2IzOTdfZ3JvdXApOworCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfZnJlZTsKIAogCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkZXYpOwpAQCAtMzQ1LDcgKzM0Nyw3IEBACiAJc3VwZXJpb19lbnRlcigpOwogCWlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0RFVklEKTsKIAotCXN3aXRjaChpZCkgeworCXN3aXRjaCAoaWQpIHsKIAljYXNlIDB4ODE6CiAJCW5hbWUgPSAiU0NINTMwNy1OUyI7CiAJCWJyZWFrOwpAQCAtMzc5LDcgKzM4MSw4IEBACiAJdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKIAlpbnQgcmV0OwogCi0JaWYgKChyZXQgPSBzbXNjNDdiMzk3X2ZpbmQoJmFkZHJlc3MpKSkKKwlyZXQgPSBzbXNjNDdiMzk3X2ZpbmQoJmFkZHJlc3MpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNtc2M0N2IzOTdfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jCmluZGV4IDViZDE5NDk2Li42NDNhYThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKQEAgLTU1LDE5ICs1NSw2IEBACiAJaW50IHRlbXBbM107CiB9OwogCi0vKiBTTUJ1cyBzcGVjaWZpZXMgbG93IGJ5dGUgZmlyc3QsIGJ1dCB0aGUgVE1QMTAyIHJldHVybnMgaGlnaCBieXRlIGZpcnN0LAotICogc28gd2UgaGF2ZSB0byBzd2FiMTYgdGhlIHZhbHVlcyAqLwotc3RhdGljIGlubGluZSBpbnQgdG1wMTAyX3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKLXsKLQlpbnQgcmVzdWx0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKLQlyZXR1cm4gcmVzdWx0IDwgMCA/IHJlc3VsdCA6IHN3YWIxNihyZXN1bHQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0bXAxMDJfd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbCkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbCkpOwotfQotCiAvKiBjb252ZXJ0IGxlZnQgYWRqdXN0ZWQgMTMtYml0IFRNUDEwMiByZWdpc3RlciB2YWx1ZSB0byBtaWxsaUNlbHNpdXMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRtcDEwMl9yZWdfdG9fbUMoczE2IHZhbCkKIHsKQEAgLTk0LDcgKzgxLDggQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bXAxMDItPmxhc3RfdXBkYXRlICsgSFogLyAzKSkgewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG1wMTAyLT50ZW1wKTsgKytpKSB7Ci0JCQlpbnQgc3RhdHVzID0gdG1wMTAyX3JlYWRfcmVnKGNsaWVudCwgdG1wMTAyX3JlZ1tpXSk7CisJCQlpbnQgc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCQkJIHRtcDEwMl9yZWdbaV0pOwogCQkJaWYgKHN0YXR1cyA+IC0xKQogCQkJCXRtcDEwMi0+dGVtcFtpXSA9IHRtcDEwMl9yZWdfdG9fbUMoc3RhdHVzKTsKIAkJfQpAQCAtMTMwLDggKzExOCw4IEBACiAKIAltdXRleF9sb2NrKCZ0bXAxMDItPmxvY2spOwogCXRtcDEwMi0+dGVtcFtzZGEtPmluZGV4XSA9IHZhbDsKLQlzdGF0dXMgPSB0bXAxMDJfd3JpdGVfcmVnKGNsaWVudCwgdG1wMTAyX3JlZ1tzZGEtPmluZGV4XSwKLQkJCQkgIHRtcDEwMl9tQ190b19yZWcodmFsKSk7CisJc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHRtcDEwMl9yZWdbc2RhLT5pbmRleF0sCisJCQkJCSAgICAgIHRtcDEwMl9tQ190b19yZWcodmFsKSk7CiAJbXV0ZXhfdW5sb2NrKCZ0bXAxMDItPmxvY2spOwogCXJldHVybiBzdGF0dXMgPyA6IGNvdW50OwogfQpAQCAtMTc4LDE4ICsxNjYsMTkgQEAKIAl9CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdG1wMTAyKTsKIAotCXN0YXR1cyA9IHRtcDEwMl9yZWFkX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CisJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIHJlYWRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKIAkJZ290byBmYWlsX2ZyZWU7CiAJfQogCXRtcDEwMi0+Y29uZmlnX29yaWcgPSBzdGF0dXM7Ci0Jc3RhdHVzID0gdG1wMTAyX3dyaXRlX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRywgVE1QMTAyX0NPTkZJRyk7CisJc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRywKKwkJCQkJICAgICAgVE1QMTAyX0NPTkZJRyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJlcnJvciB3cml0aW5nIGNvbmZpZyByZWdpc3RlclxuIik7CiAJCWdvdG8gZmFpbF9yZXN0b3JlX2NvbmZpZzsKIAl9Ci0Jc3RhdHVzID0gdG1wMTAyX3JlYWRfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKKwlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZXJyb3IgcmVhZGluZyBjb25maWcgcmVnaXN0ZXJcbiIpOwogCQlnb3RvIGZhaWxfcmVzdG9yZV9jb25maWc7CkBAIC0yMjIsNyArMjExLDggQEAKIGZhaWxfcmVtb3ZlX3N5c2ZzOgogCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnRtcDEwMl9hdHRyX2dyb3VwKTsKIGZhaWxfcmVzdG9yZV9jb25maWc6Ci0JdG1wMTAyX3dyaXRlX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRywgdG1wMTAyLT5jb25maWdfb3JpZyk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRywKKwkJCQkgICAgIHRtcDEwMi0+Y29uZmlnX29yaWcpOwogZmFpbF9mcmVlOgogCWtmcmVlKHRtcDEwMik7CiAKQEAgLTI0MCwxMCArMjMwLDEwIEBACiAJaWYgKHRtcDEwMi0+Y29uZmlnX29yaWcgJiBUTVAxMDJfQ09ORl9TRCkgewogCQlpbnQgY29uZmlnOwogCi0JCWNvbmZpZyA9IHRtcDEwMl9yZWFkX3JlZyhjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CisJCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CiAJCWlmIChjb25maWcgPj0gMCkKLQkJCXRtcDEwMl93cml0ZV9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcsCi0JCQkJCSBjb25maWcgfCBUTVAxMDJfQ09ORl9TRCk7CisJCQlpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLAorCQkJCQkJICAgICBjb25maWcgfCBUTVAxMDJfQ09ORl9TRCk7CiAJfQogCiAJa2ZyZWUodG1wMTAyKTsKQEAgLTI1NywxMiArMjQ3LDEyIEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlpbnQgY29uZmlnOwogCi0JY29uZmlnID0gdG1wMTAyX3JlYWRfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHKTsKKwljb25maWcgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOwogCWlmIChjb25maWcgPCAwKQogCQlyZXR1cm4gY29uZmlnOwogCiAJY29uZmlnIHw9IFRNUDEwMl9DT05GX1NEOwotCXJldHVybiB0bXAxMDJfd3JpdGVfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCBjb25maWcpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCBjb25maWcpOwogfQogCiBzdGF0aWMgaW50IHRtcDEwMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjcwLDEyICsyNjAsMTIgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCWludCBjb25maWc7CiAKLQljb25maWcgPSB0bXAxMDJfcmVhZF9yZWcoY2xpZW50LCBUTVAxMDJfQ09ORl9SRUcpOworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbGllbnQsIFRNUDEwMl9DT05GX1JFRyk7CiAJaWYgKGNvbmZpZyA8IDApCiAJCXJldHVybiBjb25maWc7CiAKIAljb25maWcgJj0gflRNUDEwMl9DT05GX1NEOwotCXJldHVybiB0bXAxMDJfd3JpdGVfcmVnKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCBjb25maWcpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAyX0NPTkZfUkVHLCBjb25maWcpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdG1wMTAyX2Rldl9wbV9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMgYi9kcml2ZXJzL2h3bW9uL3VsdHJhNDVfZW52LmMKaW5kZXggMjdhNjI3MS4uM2NkMDdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi91bHRyYTQ1X2Vudi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdWx0cmE0NV9lbnYuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCA5OGFhYjRiLi45M2Y1ZmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICAgIHc4MzYyN2VoZiAtIERyaXZlciBmb3IgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSBvZgogCQl0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDUgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDExICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KICAgICBDb3B5cmlnaHQgKEMpIDIwMDYgIFl1YW4gTXUgKFdpbmJvbmQpLAogCQkJUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KIAkJCURhdmlkIEh1YmJhcmQgPGRhdmlkLmMuaHViYmFyZEBnbWFpbC5jb20+CkBAIC0zOSw2ICszOSw3IEBACiAJCQkJCSAgICAgICAweDg4NjAgMHhhMQogICAgIHc4MzYyN2RoZyAgICA5ICAgICAgNSAgICAgICA0ICAgICAgIDMgICAgICAweGEwMjAgMHhjMSAgICAweDVjYTMKICAgICB3ODM2MjdkaGctcCAgOSAgICAgIDUgICAgICAgNCAgICAgICAzICAgICAgMHhiMDcwIDB4YzEgICAgMHg1Y2EzCisgICAgdzgzNjI3dWhnICAgIDggICAgICAyICAgICAgIDIgICAgICAgMiAgICAgIDB4YTIzMCAweGMxICAgIDB4NWNhMwogICAgIHc4MzY2N2hnICAgICA5ICAgICAgNSAgICAgICAzICAgICAgIDMgICAgICAweGE1MTAgMHhjMSAgICAweDVjYTMKICAgICB3ODM2NjdoZy1iICAgOSAgICAgIDUgICAgICAgMyAgICAgICA0ICAgICAgMHhiMzUwIDB4YzEgICAgMHg1Y2EzCiAgICAgbmN0Njc3NWYgICAgIDkgICAgICA0ICAgICAgIDMgICAgICAgOSAgICAgIDB4YjQ3MCAweGMxICAgIDB4NWNhMwpAQCAtNjEsMTQgKzYyLDE3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKLWVudW0ga2luZHMgeyB3ODM2MjdlaGYsIHc4MzYyN2RoZywgdzgzNjI3ZGhnX3AsIHc4MzY2N2hnLCB3ODM2NjdoZ19iLCBuY3Q2Nzc1LAotCW5jdDY3NzYgfTsKK2VudW0ga2luZHMgeworCXc4MzYyN2VoZiwgdzgzNjI3ZGhnLCB3ODM2MjdkaGdfcCwgdzgzNjI3dWhnLAorCXc4MzY2N2hnLCB3ODM2NjdoZ19iLCBuY3Q2Nzc1LCBuY3Q2Nzc2LAorfTsKIAogLyogdXNlZCB0byBzZXQgZGF0YS0+bmFtZSA9IHc4MzYyN2VoZl9kZXZpY2VfbmFtZXNbZGF0YS0+c2lvX2tpbmRdICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHc4MzYyN2VoZl9kZXZpY2VfbmFtZXNbXSA9IHsKIAkidzgzNjI3ZWhmIiwKIAkidzgzNjI3ZGhnIiwKIAkidzgzNjI3ZGhnIiwKKwkidzgzNjI3dWhnIiwKIAkidzgzNjY3aGciLAogCSJ3ODM2NjdoZyIsCiAJIm5jdDY3NzUiLApAQCAtMTA0LDYgKzEwOCw3IEBACiAjZGVmaW5lIFNJT19XODM2MjdFSEdfSUQJMHg4ODYwCiAjZGVmaW5lIFNJT19XODM2MjdESEdfSUQJMHhhMDIwCiAjZGVmaW5lIFNJT19XODM2MjdESEdfUF9JRAkweGIwNzAKKyNkZWZpbmUgU0lPX1c4MzYyN1VIR19JRAkweGEyMzAKICNkZWZpbmUgU0lPX1c4MzY2N0hHX0lECQkweGE1MTAKICNkZWZpbmUgU0lPX1c4MzY2N0hHX0JfSUQJMHhiMzUwCiAjZGVmaW5lIFNJT19OQ1Q2Nzc1X0lECQkweGI0NzAKQEAgLTM4OCwxOCArMzkzLDIzIEBACiAJcmV0dXJuIDEgPDwgcmVnOwogfQogCi0vKiBTb21lIG9mIGFuYWxvZyBpbnB1dHMgaGF2ZSBpbnRlcm5hbCBzY2FsaW5nICgyeCksIDhtViBpcyBBREMgTFNCICovCisvKiBTb21lIG9mIHRoZSB2b2x0YWdlIGlucHV0cyBoYXZlIGludGVybmFsIHNjYWxpbmcsIHRoZSB0YWJsZXMgYmVsb3cKKyAqIGNvbnRhaW4gOCAodGhlIEFEQyBMU0IgaW4gbVYpICogc2NhbGluZyBmYWN0b3IgKiAxMDAgKi8KK3N0YXRpYyBjb25zdCB1MTYgc2NhbGVfaW5fY29tbW9uWzEwXSA9IHsKKwk4MDAsIDgwMCwgMTYwMCwgMTYwMCwgODAwLCA4MDAsIDgwMCwgMTYwMCwgMTYwMCwgODAwCit9Oworc3RhdGljIGNvbnN0IHUxNiBzY2FsZV9pbl93ODM2Mjd1aGdbOV0gPSB7CisJODAwLCA4MDAsIDMzMjgsIDM0MjQsIDgwMCwgODAwLCAwLCAzMzI4LCAzNDAwCit9OwogCi1zdGF0aWMgdTggc2NhbGVfaW5bMTBdID0geyA4LCA4LCAxNiwgMTYsIDgsIDgsIDgsIDE2LCAxNiwgOCB9OwotCi1zdGF0aWMgaW5saW5lIGxvbmcgaW5fZnJvbV9yZWcodTggcmVnLCB1OCBucikKK3N0YXRpYyBpbmxpbmUgbG9uZyBpbl9mcm9tX3JlZyh1OCByZWcsIHU4IG5yLCBjb25zdCB1MTYgKnNjYWxlX2luKQogewotCXJldHVybiByZWcgKiBzY2FsZV9pbltucl07CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHJlZyAqIHNjYWxlX2luW25yXSwgMTAwKTsKIH0KIAotc3RhdGljIGlubGluZSB1OCBpbl90b19yZWcodTMyIHZhbCwgdTggbnIpCitzdGF0aWMgaW5saW5lIHU4IGluX3RvX3JlZyh1MzIgdmFsLCB1OCBuciwgY29uc3QgdTE2ICpzY2FsZV9pbikKIHsKLQlyZXR1cm4gU0VOU09SU19MSU1JVCgoKHZhbCArIChzY2FsZV9pbltucl0gLyAyKSkgLyBzY2FsZV9pbltucl0pLCAwLAorCXJldHVybiBTRU5TT1JTX0xJTUlUKERJVl9ST1VORF9DTE9TRVNUKHZhbCAqIDEwMCwgc2NhbGVfaW5bbnJdKSwgMCwKIAkJCSAgICAgMjU1KTsKIH0KIApAQCAtNDMwLDYgKzQ0MCw3IEBACiAJY29uc3QgdTE2ICpSRUdfRkFOX1NUT1BfVElNRTsKIAljb25zdCB1MTYgKlJFR19GQU5fTUFYX09VVFBVVDsKIAljb25zdCB1MTYgKlJFR19GQU5fU1RFUF9PVVRQVVQ7CisJY29uc3QgdTE2ICpzY2FsZV9pbjsKIAogCXVuc2lnbmVkIGludCAoKmZhbl9mcm9tX3JlZykodTE2IHJlZywgdW5zaWduZWQgaW50IGRpdnJlZyk7CiAJdW5zaWduZWQgaW50ICgqZmFuX2Zyb21fcmVnX21pbikodTE2IHJlZywgdW5zaWduZWQgaW50IGRpdnJlZyk7CkBAIC00ODEsNyArNDkyLDggQEAKIAl1OCB2cm07CiAKIAl1MTYgaGF2ZV90ZW1wOwotCXU4IGluNl9za2lwOworCXU4IGluNl9za2lwOjE7CisJdTggdGVtcDNfdmFsX29ubHk6MTsKIH07CiAKIHN0cnVjdCB3ODM2MjdlaGZfc2lvX2RhdGEgewpAQCAtOTA3LDcgKzkxOSw4IEBACiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IFwKIAkJdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOyBcCiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbl9mcm9tX3JlZyhkYXRhLT5yZWdbbnJdLCBucikpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbl9mcm9tX3JlZyhkYXRhLT5yZWdbbnJdLCBuciwgXAorCQkgICAgICAgZGF0YS0+c2NhbGVfaW4pKTsgXAogfQogc2hvd19pbl9yZWcoaW4pCiBzaG93X2luX3JlZyhpbl9taW4pCkBAIC05MjgsNyArOTQxLDcgQEAKIAlpZiAoZXJyIDwgMCkgXAogCQlyZXR1cm4gZXJyOyBcCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JZGF0YS0+aW5fIyNyZWdbbnJdID0gaW5fdG9fcmVnKHZhbCwgbnIpOyBcCisJZGF0YS0+aW5fIyNyZWdbbnJdID0gaW5fdG9fcmVnKHZhbCwgbnIsIGRhdGEtPnNjYWxlX2luKTsgXAogCXc4MzYyN2VoZl93cml0ZV92YWx1ZShkYXRhLCBXODM2MjdFSEZfUkVHX0lOXyMjUkVHKG5yKSwgXAogCQkJICAgICAgZGF0YS0+aW5fIyNyZWdbbnJdKTsgXAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCkBAIC0xNjE3LDI1ICsxNjMwLDI4IEBACiAJCSAgICBzdG9yZV9mYW5fc3RlcF9vdXRwdXQsIDMpLAogfTsKIAorc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfc2YzX2FycmF5c19mYW4zW10gPSB7CisJU0VOU09SX0FUVFIocHdtM19zdG9wX3RpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX3RpbWUsCisJCSAgICBzdG9yZV9mYW5fc3RvcF90aW1lLCAyKSwKKwlTRU5TT1JfQVRUUihwd20zX3N0YXJ0X291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0YXJ0X291dHB1dCwKKwkJICAgIHN0b3JlX2Zhbl9zdGFydF9vdXRwdXQsIDIpLAorCVNFTlNPUl9BVFRSKHB3bTNfc3RvcF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX291dHB1dCwKKwkJICAgIHN0b3JlX2Zhbl9zdG9wX291dHB1dCwgMiksCit9OworCiBzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9zZjNfYXJyYXlzW10gPSB7CiAJU0VOU09SX0FUVFIocHdtMV9zdG9wX3RpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX3RpbWUsCiAJCSAgICBzdG9yZV9mYW5fc3RvcF90aW1lLCAwKSwKIAlTRU5TT1JfQVRUUihwd20yX3N0b3BfdGltZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3BfdGltZSwKIAkJICAgIHN0b3JlX2Zhbl9zdG9wX3RpbWUsIDEpLAotCVNFTlNPUl9BVFRSKHB3bTNfc3RvcF90aW1lLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RvcF90aW1lLAotCQkgICAgc3RvcmVfZmFuX3N0b3BfdGltZSwgMiksCiAJU0VOU09SX0FUVFIocHdtMV9zdGFydF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdGFydF9vdXRwdXQsCiAJCSAgICBzdG9yZV9mYW5fc3RhcnRfb3V0cHV0LCAwKSwKIAlTRU5TT1JfQVRUUihwd20yX3N0YXJ0X291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0YXJ0X291dHB1dCwKIAkJICAgIHN0b3JlX2Zhbl9zdGFydF9vdXRwdXQsIDEpLAotCVNFTlNPUl9BVFRSKHB3bTNfc3RhcnRfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RhcnRfb3V0cHV0LAotCQkgICAgc3RvcmVfZmFuX3N0YXJ0X291dHB1dCwgMiksCiAJU0VOU09SX0FUVFIocHdtMV9zdG9wX291dHB1dCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX3N0b3Bfb3V0cHV0LAogCQkgICAgc3RvcmVfZmFuX3N0b3Bfb3V0cHV0LCAwKSwKIAlTRU5TT1JfQVRUUihwd20yX3N0b3Bfb3V0cHV0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fc3RvcF9vdXRwdXQsCiAJCSAgICBzdG9yZV9mYW5fc3RvcF9vdXRwdXQsIDEpLAotCVNFTlNPUl9BVFRSKHB3bTNfc3RvcF9vdXRwdXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9zdG9wX291dHB1dCwKLQkJICAgIHN0b3JlX2Zhbl9zdG9wX291dHB1dCwgMiksCiB9OwogCiAKQEAgLTE3MjgsNiArMTc0NCw4IEBACiAJCSAgICBkYXRhLT5SRUdfRkFOX1NURVBfT1VUUFVUW2F0dHItPmluZGV4XSAhPSAweGZmKQogCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmF0dHItPmRldl9hdHRyKTsKIAl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2RhX3NmM19hcnJheXNfZmFuMyk7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV9zZjNfYXJyYXlzX2ZhbjNbaV0uZGV2X2F0dHIpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkYV9zZjNfYXJyYXlzX2ZhbjQpOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZzZGFfc2YzX2FycmF5c19mYW40W2ldLmRldl9hdHRyKTsKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+aW5fbnVtOyBpKyspIHsKQEAgLTE3NTYsNiArMTc3NCw4IEBACiAJCQljb250aW51ZTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV90ZW1wX2lucHV0W2ldLmRldl9hdHRyKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV90ZW1wX2xhYmVsW2ldLmRldl9hdHRyKTsKKwkJaWYgKGkgPT0gMiAmJiBkYXRhLT50ZW1wM192YWxfb25seSkKKwkJCWNvbnRpbnVlOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmc2RhX3RlbXBfbWF4W2ldLmRldl9hdHRyKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV90ZW1wX21heF9oeXN0W2ldLmRldl9hdHRyKTsKIAkJaWYgKGkgPiAyKQpAQCAtMTgwOCwxMSArMTgyOCwyNCBAQAogCWNhc2UgdzgzNjI3ZWhmOgogCQlkaW9kZSA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsIFc4MzYyN0VIRl9SRUdfRElPREUpOwogCQlicmVhazsKKwljYXNlIHc4MzYyN3VoZzoKKwkJZGlvZGUgPSAweDAwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkaW9kZSA9IDB4NzA7CiAJfQogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJaWYgKCh0bXAgJiAoMHgwMiA8PCBpKSkpCisJCWNvbnN0IGNoYXIgKmxhYmVsID0gTlVMTDsKKworCQlpZiAoZGF0YS0+dGVtcF9sYWJlbCkKKwkJCWxhYmVsID0gZGF0YS0+dGVtcF9sYWJlbFtkYXRhLT50ZW1wX3NyY1tpXV07CisKKwkJLyogRGlnaXRhbCBzb3VyY2Ugb3ZlcnJpZGVzIGFuYWxvZyB0eXBlICovCisJCWlmIChsYWJlbCAmJiBzdHJuY21wKGxhYmVsLCAiUEVDSSIsIDQpID09IDApCisJCQlkYXRhLT50ZW1wX3R5cGVbaV0gPSA2OworCQllbHNlIGlmIChsYWJlbCAmJiBzdHJuY21wKGxhYmVsLCAiQU1EIiwgMykgPT0gMCkKKwkJCWRhdGEtPnRlbXBfdHlwZVtpXSA9IDU7CisJCWVsc2UgaWYgKCh0bXAgJiAoMHgwMiA8PCBpKSkpCiAJCQlkYXRhLT50ZW1wX3R5cGVbaV0gPSAoZGlvZGUgJiAoMHgxMCA8PCBpKSkgPyAxIDogMzsKIAkJZWxzZQogCQkJZGF0YS0+dGVtcF90eXBlW2ldID0gNDsgLyogdGhlcm1pc3RvciAqLwpAQCAtMTg0NiwxMSArMTg3OSwzMSBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQKK3c4MzYyN2VoZl9zZXRfdGVtcF9yZWdfZWhmKHN0cnVjdCB3ODM2MjdlaGZfZGF0YSAqZGF0YSwgaW50IG5fdGVtcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuX3RlbXA7IGkrKykgeworCQlkYXRhLT5yZWdfdGVtcFtpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUFtpXTsKKwkJZGF0YS0+cmVnX3RlbXBfb3ZlcltpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9PVkVSW2ldOworCQlkYXRhLT5yZWdfdGVtcF9oeXN0W2ldID0gVzgzNjI3RUhGX1JFR19URU1QX0hZU1RbaV07CisJCWRhdGEtPnJlZ190ZW1wX2NvbmZpZ1tpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9DT05GSUdbaV07CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQKIHc4MzYyN2VoZl9jaGVja19mYW5faW5wdXRzKGNvbnN0IHN0cnVjdCB3ODM2MjdlaGZfc2lvX2RhdGEgKnNpb19kYXRhLAogCQkJICAgc3RydWN0IHc4MzYyN2VoZl9kYXRhICpkYXRhKQogewogCWludCBmYW4zcGluLCBmYW40cGluLCBmYW40bWluLCBmYW41cGluLCByZWd2YWw7CiAKKwkvKiBUaGUgVzgzNjI3VUhHIGlzIHNpbXBsZSwgb25seSB0d28gZmFuIGlucHV0cywgbm8gY29uZmlnICovCisJaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzYyN3VoZykgeworCQlkYXRhLT5oYXNfZmFuID0gMHgwMzsgLyogZmFuMSBhbmQgZmFuMiAqLworCQlkYXRhLT5oYXNfZmFuX21pbiA9IDB4MDM7CisJCXJldHVybjsKKwl9CisKIAlzdXBlcmlvX2VudGVyKHNpb19kYXRhLT5zaW9yZWcpOwogCiAJLyogZmFuNCBhbmQgZmFuNSBzaGFyZSBzb21lIHBpbnMgd2l0aCB0aGUgR1BJTyBhbmQgc2VyaWFsIGZsYXNoICovCkBAIC0xOTQyLDI0ICsxOTk1LDI1IEBACiAKIAkvKiA2MjdFSEcgYW5kIDYyN0VIRiBoYXZlIDEwIHZvbHRhZ2UgaW5wdXRzOyA2MjdESEcgYW5kIDY2N0hHIGhhdmUgOSAqLwogCWRhdGEtPmluX251bSA9IChzaW9fZGF0YS0+a2luZCA9PSB3ODM2MjdlaGYpID8gMTAgOiA5OwotCS8qIDY2N0hHLCBOQ1Q2Nzc1RiwgYW5kIE5DVDY3NzZGIGhhdmUgMyBwd21zICovCi0JZGF0YS0+cHdtX251bSA9IChzaW9fZGF0YS0+a2luZCA9PSB3ODM2NjdoZwotCQkJIHx8IHNpb19kYXRhLT5raW5kID09IHc4MzY2N2hnX2IKLQkJCSB8fCBzaW9fZGF0YS0+a2luZCA9PSBuY3Q2Nzc1Ci0JCQkgfHwgc2lvX2RhdGEtPmtpbmQgPT0gbmN0Njc3NikgPyAzIDogNDsKLQotCWRhdGEtPmhhdmVfdGVtcCA9IDB4MDc7Ci0JLyogQ2hlY2sgdGVtcDMgY29uZmlndXJhdGlvbiBiaXQgZm9yIDY2N0hHICovCi0JaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzY2N2hnKSB7Ci0JCXU4IHJlZzsKLQotCQlyZWcgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShkYXRhLCBXODM2MjdFSEZfUkVHX1RFTVBfQ09ORklHWzJdKTsKLQkJaWYgKHJlZyAmIDB4MDEpCi0JCQlkYXRhLT5oYXZlX3RlbXAgJj0gfigxIDw8IDIpOwotCQllbHNlCi0JCQlkYXRhLT5pbjZfc2tpcCA9IDE7CS8qIGVpdGhlciB0ZW1wMyBvciBpbjYgKi8KKwkvKiA2NjdIRywgTkNUNjc3NUYsIGFuZCBOQ1Q2Nzc2RiBoYXZlIDMgcHdtcywgYW5kIDYyN1VIRyBoYXMgb25seSAyICovCisJc3dpdGNoIChzaW9fZGF0YS0+a2luZCkgeworCWRlZmF1bHQ6CisJCWRhdGEtPnB3bV9udW0gPSA0OworCQlicmVhazsKKwljYXNlIHc4MzY2N2hnOgorCWNhc2UgdzgzNjY3aGdfYjoKKwljYXNlIG5jdDY3NzU6CisJY2FzZSBuY3Q2Nzc2OgorCQlkYXRhLT5wd21fbnVtID0gMzsKKwkJYnJlYWs7CisJY2FzZSB3ODM2Mjd1aGc6CisJCWRhdGEtPnB3bV9udW0gPSAyOworCQlicmVhazsKIAl9CiAKKwkvKiBEZWZhdWx0IHRvIDMgdGVtcGVyYXR1cmUgaW5wdXRzLCBjb2RlIGJlbG93IHdpbGwgYWRqdXN0IGFzIG5lZWRlZCAqLworCWRhdGEtPmhhdmVfdGVtcCA9IDB4MDc7CisKIAkvKiBEZWFsIHdpdGggdGVtcGVyYXR1cmUgcmVnaXN0ZXIgc2V0dXAgZmlyc3QuICovCiAJaWYgKHNpb19kYXRhLT5raW5kID09IG5jdDY3NzUgfHwgc2lvX2RhdGEtPmtpbmQgPT0gbmN0Njc3NikgewogCQlpbnQgbWFzayA9IDA7CkBAIC0yMDM1LDE2ICsyMDg5LDEyIEBACiAJfSBlbHNlIGlmIChzaW9fZGF0YS0+a2luZCA9PSB3ODM2NjdoZ19iKSB7CiAJCXU4IHJlZzsKIAorCQl3ODM2MjdlaGZfc2V0X3RlbXBfcmVnX2VoZihkYXRhLCA0KTsKKwogCQkvKgogCQkgKiBUZW1wZXJhdHVyZSBzb3VyY2VzIGFyZSBzZWxlY3RlZCB3aXRoIGJhbmsgMCwgcmVnaXN0ZXJzIDB4NDkKIAkJICogYW5kIDB4NGEuCiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShXODM2MjdFSEZfUkVHX1RFTVApOyBpKyspIHsKLQkJCWRhdGEtPnJlZ190ZW1wW2ldID0gVzgzNjI3RUhGX1JFR19URU1QW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfb3ZlcltpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9PVkVSW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfaHlzdFtpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9IWVNUW2ldOwotCQkJZGF0YS0+cmVnX3RlbXBfY29uZmlnW2ldID0gVzgzNjI3RUhGX1JFR19URU1QX0NPTkZJR1tpXTsKLQkJfQogCQlyZWcgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShkYXRhLCAweDRhKTsKIAkJZGF0YS0+dGVtcF9zcmNbMF0gPSByZWcgPj4gNTsKIAkJcmVnID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoZGF0YSwgMHg0OSk7CkBAIC0yMDc4LDEzICsyMTI4LDYwIEBACiAJCQlkYXRhLT5pbjZfc2tpcCA9IDE7CiAKIAkJZGF0YS0+dGVtcF9sYWJlbCA9IHc4MzY2N2hnX2JfdGVtcF9sYWJlbDsKKwl9IGVsc2UgaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzYyN3VoZykgeworCQl1OCByZWc7CisKKwkJdzgzNjI3ZWhmX3NldF90ZW1wX3JlZ19laGYoZGF0YSwgMyk7CisKKwkJLyoKKwkJICogVGVtcGVyYXR1cmUgc291cmNlcyBmb3IgdGVtcDEgYW5kIHRlbXAyIGFyZSBzZWxlY3RlZCB3aXRoCisJCSAqIGJhbmsgMCwgcmVnaXN0ZXJzIDB4NDkgYW5kIDB4NGEuCisJCSAqLworCQlkYXRhLT50ZW1wX3NyY1swXSA9IDA7CS8qIFNZU1RJTiAqLworCQlyZWcgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShkYXRhLCAweDQ5KSAmIDB4MDc7CisJCS8qIEFkanVzdCB0byBoYXZlIHRoZSBzYW1lIG1hcHBpbmcgYXMgb3RoZXIgc291cmNlIHJlZ2lzdGVycyAqLworCQlpZiAocmVnID09IDApCisJCQlkYXRhLT50ZW1wX3NyY1sxXSsrOworCQllbHNlIGlmIChyZWcgPj0gMiAmJiByZWcgPD0gNSkKKwkJCWRhdGEtPnRlbXBfc3JjWzFdICs9IDI7CisJCWVsc2UJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJZGF0YS0+aGF2ZV90ZW1wICY9IH4oMSA8PCAxKTsKKwkJcmVnID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoZGF0YSwgMHg0YSk7CisJCWRhdGEtPnRlbXBfc3JjWzJdID0gcmVnID4+IDU7CisKKwkJLyoKKwkJICogU2tpcCB0ZW1wMyBpZiBzb3VyY2UgaXMgaW52YWxpZCBvciB0aGUgc2FtZSBhcyB0ZW1wMQorCQkgKiBvciB0ZW1wMi4KKwkJICovCisJCWlmIChkYXRhLT50ZW1wX3NyY1syXSA9PSAyIHx8IGRhdGEtPnRlbXBfc3JjWzJdID09IDMgfHwKKwkJICAgIGRhdGEtPnRlbXBfc3JjWzJdID09IGRhdGEtPnRlbXBfc3JjWzBdIHx8CisJCSAgICAoKGRhdGEtPmhhdmVfdGVtcCAmICgxIDw8IDEpKSAmJgorCQkgICAgIGRhdGEtPnRlbXBfc3JjWzJdID09IGRhdGEtPnRlbXBfc3JjWzFdKSkKKwkJCWRhdGEtPmhhdmVfdGVtcCAmPSB+KDEgPDwgMik7CisJCWVsc2UKKwkJCWRhdGEtPnRlbXAzX3ZhbF9vbmx5ID0gMTsJLyogTm8gbGltaXQgcmVncyAqLworCisJCWRhdGEtPmluNl9za2lwID0gMTsJCQkvKiBObyBWSU4zICovCisKKwkJZGF0YS0+dGVtcF9sYWJlbCA9IHc4MzY2N2hnX2JfdGVtcF9sYWJlbDsKIAl9IGVsc2UgeworCQl3ODM2MjdlaGZfc2V0X3RlbXBfcmVnX2VoZihkYXRhLCAzKTsKKwogCQkvKiBUZW1wZXJhdHVyZSBzb3VyY2VzIGFyZSBmaXhlZCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlkYXRhLT5yZWdfdGVtcFtpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUFtpXTsKLQkJCWRhdGEtPnJlZ190ZW1wX292ZXJbaV0gPSBXODM2MjdFSEZfUkVHX1RFTVBfT1ZFUltpXTsKLQkJCWRhdGEtPnJlZ190ZW1wX2h5c3RbaV0gPSBXODM2MjdFSEZfUkVHX1RFTVBfSFlTVFtpXTsKLQkJCWRhdGEtPnJlZ190ZW1wX2NvbmZpZ1tpXSA9IFc4MzYyN0VIRl9SRUdfVEVNUF9DT05GSUdbaV07CisKKwkJaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzY2N2hnKSB7CisJCQl1OCByZWc7CisKKwkJCS8qCisJCQkgKiBDaGlwIHN1cHBvcnRzIGVpdGhlciBBVVhUSU4gb3IgVklOMy4gVHJ5IHRvIGZpbmQKKwkJCSAqIG91dCB3aGljaCBvbmUuCisJCQkgKi8KKwkJCXJlZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsCisJCQkJCQlXODM2MjdFSEZfUkVHX1RFTVBfQ09ORklHWzJdKTsKKwkJCWlmIChyZWcgJiAweDAxKQorCQkJCWRhdGEtPmhhdmVfdGVtcCAmPSB+KDEgPDwgMik7CisJCQllbHNlCisJCQkJZGF0YS0+aW42X3NraXAgPSAxOwogCQl9CiAJfQogCkBAIC0yMTQ0LDYgKzIyNDEsMTIgQEAKIAkJICBXODM2MjdFSEZfUkVHX0ZBTl9TVEVQX09VVFBVVF9DT01NT047CiAJfQogCisJLyogU2V0dXAgaW5wdXQgdm9sdGFnZSBzY2FsaW5nIGZhY3RvcnMgKi8KKwlpZiAoc2lvX2RhdGEtPmtpbmQgPT0gdzgzNjI3dWhnKQorCQlkYXRhLT5zY2FsZV9pbiA9IHNjYWxlX2luX3c4MzYyN3VoZzsKKwllbHNlCisJCWRhdGEtPnNjYWxlX2luID0gc2NhbGVfaW5fY29tbW9uOworCiAJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLwogCXc4MzYyN2VoZl9pbml0X2RldmljZShkYXRhLCBzaW9fZGF0YS0+a2luZCk7CiAKQEAgLTIxNjAsNyArMjI2Myw3IEBACiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXRfcmVsZWFzZTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoc2lvX2RhdGEtPmtpbmQgIT0gdzgzNjI3dWhnKSB7CiAJCXN1cGVyaW9fc2VsZWN0KHNpb19kYXRhLT5zaW9yZWcsIFc4MzYyN0VIRl9MRF9IV00pOwogCQlpZiAoc3VwZXJpb19pbmIoc2lvX2RhdGEtPnNpb3JlZywgU0lPX1JFR19WSURfQ1RSTCkgJiAweDgwKSB7CiAJCQkvKiBTZXQgVklEIGlucHV0IHNlbnNpYmlsaXR5IGlmIG5lZWRlZC4gSW4gdGhlb3J5IHRoZQpAQCAtMjI1MCw3ICsyMzUzLDE0IEBACiAJCQkJZ290byBleGl0X3JlbW92ZTsKIAkJfQogCX0KLQkvKiBpZiBmYW40IGlzIGVuYWJsZWQgY3JlYXRlIHRoZSBzZjMgZmlsZXMgZm9yIGl0ICovCisJLyogaWYgZmFuMyBhbmQgZmFuNCBhcmUgZW5hYmxlZCBjcmVhdGUgdGhlIHNmMyBmaWxlcyBmb3IgdGhlbSAqLworCWlmICgoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IDIpKSAmJiBkYXRhLT5wd21fbnVtID49IDMpCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkYV9zZjNfYXJyYXlzX2ZhbjMpOyBpKyspIHsKKwkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJCSZzZGFfc2YzX2FycmF5c19mYW4zW2ldLmRldl9hdHRyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3JlbW92ZTsKKwkJfQogCWlmICgoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IDMpKSAmJiBkYXRhLT5wd21fbnVtID49IDQpCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkYV9zZjNfYXJyYXlzX2ZhbjQpOyBpKyspIHsKIAkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCkBAIC0yMzE4LDYgKzI0MjgsOCBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGV4aXRfcmVtb3ZlOwogCQl9CisJCWlmIChpID09IDIgJiYgZGF0YS0+dGVtcDNfdmFsX29ubHkpCisJCQljb250aW51ZTsKIAkJaWYgKGRhdGEtPnJlZ190ZW1wX292ZXJbaV0pIHsKIAkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNkYV90ZW1wX21heFtpXS5kZXZfYXR0cik7CkBAIC0yNDAxLDYgKzI1MTMsNyBAQAogCXN0YXRpYyBjb25zdCBjaGFyIF9faW5pdGRhdGEgc2lvX25hbWVfVzgzNjI3RUhHW10gPSAiVzgzNjI3RUhHIjsKIAlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX1c4MzYyN0RIR1tdID0gIlc4MzYyN0RIRyI7CiAJc3RhdGljIGNvbnN0IGNoYXIgX19pbml0ZGF0YSBzaW9fbmFtZV9XODM2MjdESEdfUFtdID0gIlc4MzYyN0RIRy1QIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX1c4MzYyN1VIR1tdID0gIlc4MzYyN1VIRyI7CiAJc3RhdGljIGNvbnN0IGNoYXIgX19pbml0ZGF0YSBzaW9fbmFtZV9XODM2NjdIR1tdID0gIlc4MzY2N0hHIjsKIAlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX1c4MzY2N0hHX0JbXSA9ICJXODM2NjdIRy1CIjsKIAlzdGF0aWMgY29uc3QgY2hhciBfX2luaXRkYXRhIHNpb19uYW1lX05DVDY3NzVbXSA9ICJOQ1Q2Nzc1RiI7CkBAIC0yNDMzLDYgKzI1NDYsMTAgQEAKIAkJc2lvX2RhdGEtPmtpbmQgPSB3ODM2MjdkaGdfcDsKIAkJc2lvX25hbWUgPSBzaW9fbmFtZV9XODM2MjdESEdfUDsKIAkJYnJlYWs7CisJY2FzZSBTSU9fVzgzNjI3VUhHX0lEOgorCQlzaW9fZGF0YS0+a2luZCA9IHc4MzYyN3VoZzsKKwkJc2lvX25hbWUgPSBzaW9fbmFtZV9XODM2MjdVSEc7CisJCWJyZWFrOwogCWNhc2UgU0lPX1c4MzY2N0hHX0lEOgogCQlzaW9fZGF0YS0+a2luZCA9IHc4MzY2N2hnOwogCQlzaW9fbmFtZSA9IHNpb19uYW1lX1c4MzY2N0hHOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwppbmRleCBlZWQ0M2EwLi42NWI2ODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwpAQCAtMTI0NSwxNyArMTI0NSwxNyBAQAogCQkvKiBjb252ZXJ0IGZyb20gSVNBIHRvIExNNzUgSTJDIGFkZHJlc3NlcyAqLwogCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKIAkJY2FzZSAweDUwOgkvKiBURU1QICovCi0JCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAwKSk7CisJCQlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoY2wsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1MjoJLyogQ09ORklHICovCiAJCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2wsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg1MzoJLyogSFlTVCAqLwotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbCwgMikpOworCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNsLCAyKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTU6CS8qIE9WRVIgKi8KIAkJZGVmYXVsdDoKLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDMpKTsKKwkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfc3dhcHBlZChjbCwgMyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEyODksMTAgKzEyODksMTAgQEAKIAkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2wsIDEsIHZhbHVlICYgMHhmZik7CiAJCQlicmVhazsKIAkJY2FzZSAweDUzOgkvKiBIWVNUICovCi0JCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsLCAyLCBzd2FiMTYodmFsdWUpKTsKKwkJCWkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2wsIDIsIHZhbHVlKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTU6CS8qIE9WRVIgKi8KLQkJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2wsIDMsIHN3YWIxNih2YWx1ZSkpOworCQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbCwgMywgdmFsdWUpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3c3BpbmxvY2svS2NvbmZpZyBiL2RyaXZlcnMvaHdzcGlubG9jay9LY29uZmlnCmluZGV4IDFmMjliYWIuLmM3YzMxMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdzcGlubG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdzcGlubG9jay9LY29uZmlnCkBAIC0yLDIyICsyLDMxIEBACiAjIEdlbmVyaWMgSFdTUElOTE9DSyBmcmFtZXdvcmsKICMKIAorIyBIV1NQSU5MT0NLIGFsd2F5cyBnZXRzIHNlbGVjdGVkIGJ5IHdob2V2ZXIgd2FudHMgaXQuCiBjb25maWcgSFdTUElOTE9DSwotCXRyaXN0YXRlICJHZW5lcmljIEhhcmR3YXJlIFNwaW5sb2NrIGZyYW1ld29yayIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDQKLQloZWxwCi0JICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIGdlbmVyaWMgaGFyZHdhcmUgc3BpbmxvY2sgZnJhbWV3b3JrLgotCSAgWW91IG9ubHkgbmVlZCB0byBlbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBoYXJkd2FyZSBzcGlubG9jayBtb2R1bGUKLQkgIG9uIHlvdXIgc3lzdGVtICh1c3VhbGx5IG9ubHkgcmVsZXZhbnQgaWYgeW91ciBzeXN0ZW0gaGFzIHJlbW90ZSBzbGF2ZQotCSAgY29wcm9jZXNzb3JzKS4KKwl0cmlzdGF0ZQogCi0JICBJZiB1bnN1cmUsIHNheSBOLgorbWVudSAiSGFyZHdhcmUgU3BpbmxvY2sgZHJpdmVycyIKIAogY29uZmlnIEhXU1BJTkxPQ0tfT01BUAogCXRyaXN0YXRlICJPTUFQIEhhcmR3YXJlIFNwaW5sb2NrIGRldmljZSIKLQlkZXBlbmRzIG9uIEhXU1BJTkxPQ0sgJiYgQVJDSF9PTUFQNAorCWRlcGVuZHMgb24gQVJDSF9PTUFQNAorCXNlbGVjdCBIV1NQSU5MT0NLCiAJaGVscAogCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IHRoZSBPTUFQIEhhcmR3YXJlIFNwaW5sb2NrIGRldmljZSAoZmlyc3RseQogCSAgaW50cm9kdWNlZCBpbiBPTUFQNCkuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIU0VNX1U4NTAwCisJdHJpc3RhdGUgIlNURSBIYXJkd2FyZSBTZW1hcGhvcmUgZnVuY3Rpb25hbGl0eSIKKwlkZXBlbmRzIG9uIEFSQ0hfVTg1MDAKKwlzZWxlY3QgSFdTUElOTE9DSworCWhlbHAKKwkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgU1RFIEhhcmR3YXJlIFNlbWFwaG9yZSBmdW5jdGlvbmFsaXR5LCB3aGljaAorCSAgcHJvdmlkZXMgYSBzeW5jaHJvbmlzYXRpb24gbWVjaGFuaXNtIGZvciB0aGUgdmFyaW91cyBwcm9jZXNzb3Igb24gdGhlCisJICBTb0MuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdzcGlubG9jay9NYWtlZmlsZSBiL2RyaXZlcnMvaHdzcGlubG9jay9NYWtlZmlsZQppbmRleCA1NzI5YTNmLi45M2ViNjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3c3BpbmxvY2svTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od3NwaW5sb2NrL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogCiBvYmotJChDT05GSUdfSFdTUElOTE9DSykJCSs9IGh3c3BpbmxvY2tfY29yZS5vCiBvYmotJChDT05GSUdfSFdTUElOTE9DS19PTUFQKQkJKz0gb21hcF9od3NwaW5sb2NrLm8KK29iai0kKENPTkZJR19IU0VNX1U4NTAwKQkJKz0gdTg1MDBfaHNlbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19jb3JlLmMgYi9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19jb3JlLmMKaW5kZXggNDNhNjI3MS4uNjFjOWNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3NwaW5sb2NrL2h3c3BpbmxvY2tfY29yZS5jCisrKyBiL2RyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrX2NvcmUuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9od3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJod3NwaW5sb2NrX2ludGVybmFsLmgiCiAKQEAgLTUyLDEwICs1MywxMiBAQAogc3RhdGljIFJBRElYX1RSRUUoaHdzcGlubG9ja190cmVlLCBHRlBfS0VSTkVMKTsKIAogLyoKLSAqIFN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gdGhlIHRyZWUgaXMgYWNoaWV2ZWQgdXNpbmcgdGhpcyBzcGlubG9jaywKKyAqIFN5bmNocm9uaXphdGlvbiBvZiBhY2Nlc3MgdG8gdGhlIHRyZWUgaXMgYWNoaWV2ZWQgdXNpbmcgdGhpcyBtdXRleCwKICAqIGFzIHRoZSByYWRpeC10cmVlIEFQSSByZXF1aXJlcyB0aGF0IHVzZXJzIHByb3ZpZGUgYWxsIHN5bmNocm9uaXNhdGlvbi4KKyAqIEEgbXV0ZXggaXMgbmVlZGVkIGJlY2F1c2Ugd2UncmUgdXNpbmcgbm9uLWF0b21pYyByYWRpeCB0cmVlIGFsbG9jYXRpb25zLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaHdzcGlubG9ja190cmVlX2xvY2spOworCiAKIC8qKgogICogX19od3NwaW5fdHJ5bG9jaygpIC0gYXR0ZW1wdCB0byBsb2NrIGEgc3BlY2lmaWMgaHdzcGlubG9jawpAQCAtMTE0LDcgKzExNyw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiB0cnkgdG8gdGFrZSB0aGUgaHdzcGlubG9jayBkZXZpY2UgKi8KLQlyZXQgPSBod2xvY2stPm9wcy0+dHJ5bG9jayhod2xvY2spOworCXJldCA9IGh3bG9jay0+YmFuay0+b3BzLT50cnlsb2NrKGh3bG9jayk7CiAKIAkvKiBpZiBod2xvY2sgaXMgYWxyZWFkeSB0YWtlbiwgdW5kbyBzcGluX3RyeWxvY2tfKiBhbmQgZXhpdCAqLwogCWlmICghcmV0KSB7CkBAIC0xOTYsOCArMTk5LDggQEAKIAkJICogQWxsb3cgcGxhdGZvcm0tc3BlY2lmaWMgcmVsYXggaGFuZGxlcnMgdG8gcHJldmVudAogCQkgKiBob2dnaW5nIHRoZSBpbnRlcmNvbm5lY3QgKG5vIHNsZWVwaW5nLCB0aG91Z2gpCiAJCSAqLwotCQlpZiAoaHdsb2NrLT5vcHMtPnJlbGF4KQotCQkJaHdsb2NrLT5vcHMtPnJlbGF4KGh3bG9jayk7CisJCWlmIChod2xvY2stPmJhbmstPm9wcy0+cmVsYXgpCisJCQlod2xvY2stPmJhbmstPm9wcy0+cmVsYXgoaHdsb2NrKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjQyLDcgKzI0NSw3IEBACiAJICovCiAJbWIoKTsKIAotCWh3bG9jay0+b3BzLT51bmxvY2soaHdsb2NrKTsKKwlod2xvY2stPmJhbmstPm9wcy0+dW5sb2NrKGh3bG9jayk7CiAKIAkvKiBVbmRvIHRoZSBzcGluX3RyeWxvY2t7X2lycSwgX2lycXNhdmV9IGNhbGxlZCB3aGlsZSBsb2NraW5nICovCiAJaWYgKG1vZGUgPT0gSFdMT0NLX0lSUVNUQVRFKQpAQCAtMjU0LDY4ICsyNTcsMzcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9faHdzcGluX3VubG9jayk7CiAKLS8qKgotICogaHdzcGluX2xvY2tfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGEgbmV3IGh3IHNwaW5sb2NrCi0gKiBAaHdsb2NrOiBod3NwaW5sb2NrIHRvIHJlZ2lzdGVyLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLXNwZWNpZmljCi0gKiBpbXBsZW1lbnRhdGlvbiwgdG8gcmVnaXN0ZXIgYSBuZXcgaHdzcGlubG9jayBpbnN0YW5jZS4KLSAqCi0gKiBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHdpbGwgbm90IHNsZWVwKSBidXQgbm90IGZyb20KLSAqIHdpdGhpbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCi0gKi8KLWludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQorc3RhdGljIGludCBod3NwaW5fbG9ja19yZWdpc3Rlcl9zaW5nbGUoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaywgaW50IGlkKQogewogCXN0cnVjdCBod3NwaW5sb2NrICp0bXA7CiAJaW50IHJldDsKIAotCWlmICghaHdsb2NrIHx8ICFod2xvY2stPm9wcyB8fAotCQkhaHdsb2NrLT5vcHMtPnRyeWxvY2sgfHwgIWh3bG9jay0+b3BzLT51bmxvY2spIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtZXRlcnNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisKKwlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmaHdzcGlubG9ja190cmVlLCBpZCwgaHdsb2NrKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPT0gLUVFWElTVCkKKwkJCXByX2VycigiaHdzcGlubG9jayBpZCAlZCBhbHJlYWR5IGV4aXN0cyFcbiIsIGlkKTsKKwkJZ290byBvdXQ7CiAJfQogCi0Jc3Bpbl9sb2NrX2luaXQoJmh3bG9jay0+bG9jayk7Ci0KLQlzcGluX2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKLQotCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZod3NwaW5sb2NrX3RyZWUsIGh3bG9jay0+aWQsIGh3bG9jayk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAkvKiBtYXJrIHRoaXMgaHdzcGlubG9jayBhcyBhdmFpbGFibGUgKi8KLQl0bXAgPSByYWRpeF90cmVlX3RhZ19zZXQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrLT5pZCwKLQkJCQkJCQlIV1NQSU5MT0NLX1VOVVNFRCk7CisJdG1wID0gcmFkaXhfdHJlZV90YWdfc2V0KCZod3NwaW5sb2NrX3RyZWUsIGlkLCBIV1NQSU5MT0NLX1VOVVNFRCk7CiAKIAkvKiBzZWxmLXNhbml0eSBjaGVjayB3aGljaCBzaG91bGQgbmV2ZXIgZmFpbCAqLwogCVdBUk5fT04odG1wICE9IGh3bG9jayk7CiAKIG91dDoKLQlzcGluX3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwotCXJldHVybiByZXQ7CisJbXV0ZXhfdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChod3NwaW5fbG9ja19yZWdpc3Rlcik7CiAKLS8qKgotICogaHdzcGluX2xvY2tfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhbiBodyBzcGlubG9jawotICogQGlkOiBpbmRleCBvZiB0aGUgc3BlY2lmaWMgaHdzcGlubG9jayB0byB1bnJlZ2lzdGVyCi0gKgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMKLSAqIGltcGxlbWVudGF0aW9uLCB0byB1bnJlZ2lzdGVyIGFuIGV4aXN0aW5nIChhbmQgdW51c2VkKSBod3NwaW5sb2NrLgotICoKLSAqIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICogd2l0aGluIGludGVycnVwdCBjb250ZXh0LgotICoKLSAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgaHdzcGlubG9jayBAaWQgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlCi0gKi8KLXN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpZCkKK3N0YXRpYyBzdHJ1Y3QgaHdzcGlubG9jayAqaHdzcGluX2xvY2tfdW5yZWdpc3Rlcl9zaW5nbGUodW5zaWduZWQgaW50IGlkKQogewogCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2sgPSBOVUxMOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIGh3c3BpbmxvY2sgaXMgbm90IGluIHVzZSAodGFnIGlzIHNldCkgKi8KIAlyZXQgPSByYWRpeF90cmVlX3RhZ19nZXQoJmh3c3BpbmxvY2tfdHJlZSwgaWQsIEhXU1BJTkxPQ0tfVU5VU0VEKTsKQEAgLTMzMSw5ICszMDMsOTEgQEAKIAl9CiAKIG91dDoKLQlzcGluX3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOworCW11dGV4X3VubG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCXJldHVybiBod2xvY2s7CiB9CisKKy8qKgorICogaHdzcGluX2xvY2tfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGEgbmV3IGh3IHNwaW5sb2NrIGRldmljZQorICogQGJhbms6IHRoZSBod3NwaW5sb2NrIGRldmljZSwgd2hpY2ggdXN1YWxseSBwcm92aWRlcyBudW1lcm91cyBodyBsb2NrcworICogQGRldjogdGhlIGJhY2tpbmcgZGV2aWNlCisgKiBAb3BzOiBod3NwaW5sb2NrIGhhbmRsZXJzIGZvciB0aGlzIGRldmljZQorICogQGJhc2VfaWQ6IGlkIG9mIHRoZSBmaXJzdCBoYXJkd2FyZSBzcGlubG9jayBpbiB0aGlzIGJhbmsKKyAqIEBudW1fbG9ja3M6IG51bWJlciBvZiBod3NwaW5sb2NrcyBwcm92aWRlZCBieSB0aGlzIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLXNwZWNpZmljCisgKiBpbXBsZW1lbnRhdGlvbiwgdG8gcmVnaXN0ZXIgYSBuZXcgaHdzcGlubG9jayBkZXZpY2UgaW5zdGFuY2UuCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0IChtaWdodCBzbGVlcCkKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmssIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHMsIGludCBiYXNlX2lkLCBpbnQgbnVtX2xvY2tzKQoreworCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2s7CisJaW50IHJldCA9IDAsIGk7CisKKwlpZiAoIWJhbmsgfHwgIW9wcyB8fCAhZGV2IHx8ICFudW1fbG9ja3MgfHwgIW9wcy0+dHJ5bG9jayB8fAorCQkJCQkJCSFvcHMtPnVubG9jaykgeworCQlwcl9lcnIoImludmFsaWQgcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJhbmstPmRldiA9IGRldjsKKwliYW5rLT5vcHMgPSBvcHM7CisJYmFuay0+YmFzZV9pZCA9IGJhc2VfaWQ7CisJYmFuay0+bnVtX2xvY2tzID0gbnVtX2xvY2tzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9sb2NrczsgaSsrKSB7CisJCWh3bG9jayA9ICZiYW5rLT5sb2NrW2ldOworCisJCXNwaW5fbG9ja19pbml0KCZod2xvY2stPmxvY2spOworCQlod2xvY2stPmJhbmsgPSBiYW5rOworCisJCXJldCA9IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyX3NpbmdsZShod2xvY2ssIGkpOworCQlpZiAocmV0KQorCQkJZ290byByZWdfZmFpbGVkOworCX0KKworCXJldHVybiAwOworCityZWdfZmFpbGVkOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJaHdzcGluX2xvY2tfdW5yZWdpc3Rlcl9zaW5nbGUoaSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKTsKKworLyoqCisgKiBod3NwaW5fbG9ja191bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIGFuIGh3IHNwaW5sb2NrIGRldmljZQorICogQGJhbms6IHRoZSBod3NwaW5sb2NrIGRldmljZSwgd2hpY2ggdXN1YWxseSBwcm92aWRlcyBudW1lcm91cyBodyBsb2NrcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLXNwZWNpZmljCisgKiBpbXBsZW1lbnRhdGlvbiwgdG8gdW5yZWdpc3RlciBhbiBleGlzdGluZyAoYW5kIHVudXNlZCkgaHdzcGlubG9jay4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGh3c3Bpbl9sb2NrX3VucmVnaXN0ZXIoc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rKQoreworCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2ssICp0bXA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmFuay0+bnVtX2xvY2tzOyBpKyspIHsKKwkJaHdsb2NrID0gJmJhbmstPmxvY2tbaV07CisKKwkJdG1wID0gaHdzcGluX2xvY2tfdW5yZWdpc3Rlcl9zaW5nbGUoYmFuay0+YmFzZV9pZCArIGkpOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJLyogc2VsZi1zYW5pdHkgY2hlY2sgdGhhdCBzaG91bGQgbmV2ZXIgZmFpbCAqLworCQlXQVJOX09OKHRtcCAhPSBod2xvY2spOworCX0KKworCXJldHVybiAwOworfQogRVhQT1JUX1NZTUJPTF9HUEwoaHdzcGluX2xvY2tfdW5yZWdpc3Rlcik7CiAKIC8qKgpAQCAtMzQ4LDI0ICs0MDIsMjUgQEAKICAqLwogc3RhdGljIGludCBfX2h3c3Bpbl9sb2NrX3JlcXVlc3Qoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaykKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBod2xvY2stPmJhbmstPmRldjsKIAlzdHJ1Y3QgaHdzcGlubG9jayAqdG1wOwogCWludCByZXQ7CiAKIAkvKiBwcmV2ZW50IHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyByZW1vdmVkICovCi0JaWYgKCF0cnlfbW9kdWxlX2dldChod2xvY2stPm93bmVyKSkgewotCQlkZXZfZXJyKGh3bG9jay0+ZGV2LCAiJXM6IGNhbid0IGdldCBvd25lclxuIiwgX19mdW5jX18pOworCWlmICghdHJ5X21vZHVsZV9nZXQoZGV2LT5kcml2ZXItPm93bmVyKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBjYW4ndCBnZXQgb3duZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogbm90aWZ5IFBNIGNvcmUgdGhhdCBwb3dlciBpcyBub3cgbmVlZGVkICovCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhod2xvY2stPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaHdsb2NrLT5kZXYsICIlczogY2FuJ3QgcG93ZXIgb24gZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZGV2LCAiJXM6IGNhbid0IHBvd2VyIG9uIGRldmljZVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIG1hcmsgaHdzcGlubG9jayBhcyB1c2VkLCBzaG91bGQgbm90IGZhaWwgKi8KLQl0bXAgPSByYWRpeF90cmVlX3RhZ19jbGVhcigmaHdzcGlubG9ja190cmVlLCBod2xvY2stPmlkLAorCXRtcCA9IHJhZGl4X3RyZWVfdGFnX2NsZWFyKCZod3NwaW5sb2NrX3RyZWUsIGh3bG9ja190b19pZChod2xvY2spLAogCQkJCQkJCUhXU1BJTkxPQ0tfVU5VU0VEKTsKIAogCS8qIHNlbGYtc2FuaXR5IGNoZWNrIHRoYXQgc2hvdWxkIG5ldmVyIGZhaWwgKi8KQEAgLTM4Nyw3ICs0NDIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gaHdsb2NrLT5pZDsKKwlyZXR1cm4gaHdsb2NrX3RvX2lkKGh3bG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod3NwaW5fbG9ja19nZXRfaWQpOwogCkBAIC00MDAsOSArNDU1LDcgQEAKICAqIHRvIHRoZSByZW1vdGUgY29yZSBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiAodG8gZ2V0IHRoZQogICogaWQgb2YgYSBnaXZlbiBod2xvY2ssIHVzZSBod3NwaW5fbG9ja19nZXRfaWQoKSkuCiAgKgotICogQ2FuIGJlIGNhbGxlZCBmcm9tIGFuIGF0b21pYyBjb250ZXh0ICh3aWxsIG5vdCBzbGVlcCkgYnV0IG5vdCBmcm9tCi0gKiB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQgKHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHVzZSBjYXNlIGZvcgotICogdGhhdCB5ZXQpLgorICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgcHJvY2VzcyBjb250ZXh0IChtaWdodCBzbGVlcCkKICAqCiAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBhc3NpZ25lZCBod3NwaW5sb2NrLCBvciBOVUxMIG9uIGVycm9yCiAgKi8KQEAgLTQxMSw3ICs0NjQsNyBAQAogCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2s7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOworCW11dGV4X2xvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKIAogCS8qIGxvb2sgZm9yIGFuIHVudXNlZCBsb2NrICovCiAJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcoJmh3c3BpbmxvY2tfdHJlZSwgKHZvaWQgKiopJmh3bG9jaywKQEAgLTQzMSw3ICs0ODQsNyBAQAogCQlod2xvY2sgPSBOVUxMOwogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKIAlyZXR1cm4gaHdsb2NrOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaHdzcGluX2xvY2tfcmVxdWVzdCk7CkBAIC00NDUsOSArNDk4LDcgQEAKICAqIFVzdWFsbHkgZWFybHkgYm9hcmQgY29kZSB3aWxsIGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0bwogICogcmVzZXJ2ZSBzcGVjaWZpYyBod3NwaW5sb2NrIGlkcyBmb3IgcHJlZGVmaW5lZCBwdXJwb3Nlcy4KICAqCi0gKiBDYW4gYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleHQgKHdpbGwgbm90IHNsZWVwKSBidXQgbm90IGZyb20KLSAqIHdpdGhpbiBpbnRlcnJ1cHQgY29udGV4dCAoc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gdXNlIGNhc2UgZm9yCi0gKiB0aGF0IHlldCkuCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQgKG1pZ2h0IHNsZWVwKQogICoKICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFzc2lnbmVkIGh3c3BpbmxvY2ssIG9yIE5VTEwgb24gZXJyb3IKICAqLwpAQCAtNDU2LDcgKzUwNyw3IEBACiAJc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jazsKIAlpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJbXV0ZXhfbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCiAJLyogbWFrZSBzdXJlIHRoaXMgaHdzcGlubG9jayBleGlzdHMgKi8KIAlod2xvY2sgPSByYWRpeF90cmVlX2xvb2t1cCgmaHdzcGlubG9ja190cmVlLCBpZCk7CkBAIC00NjYsNyArNTE3LDcgQEAKIAl9CiAKIAkvKiBzYW5pdHkgY2hlY2sgKHRoaXMgc2hvdWxkbid0IGhhcHBlbikgKi8KLQlXQVJOX09OKGh3bG9jay0+aWQgIT0gaWQpOworCVdBUk5fT04oaHdsb2NrX3RvX2lkKGh3bG9jaykgIT0gaWQpOwogCiAJLyogbWFrZSBzdXJlIHRoaXMgaHdzcGlubG9jayBpcyB1bnVzZWQgKi8KIAlyZXQgPSByYWRpeF90cmVlX3RhZ19nZXQoJmh3c3BpbmxvY2tfdHJlZSwgaWQsIEhXU1BJTkxPQ0tfVU5VU0VEKTsKQEAgLTQ4Miw3ICs1MzMsNyBAQAogCQlod2xvY2sgPSBOVUxMOwogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKKwltdXRleF91bmxvY2soJmh3c3BpbmxvY2tfdHJlZV9sb2NrKTsKIAlyZXR1cm4gaHdsb2NrOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaHdzcGluX2xvY2tfcmVxdWVzdF9zcGVjaWZpYyk7CkBAIC00OTUsMTQgKzU0NiwxMyBAQAogICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYW4gQGh3bG9jayB0aGF0IHdhcyByZXRyaWV2ZWQgZnJvbQogICogYW4gZWFybGllciBjYWxsIHRvIG9tYXBfaHdzcGluX2xvY2tfcmVxdWVzdHtfc3BlY2lmaWN9LgogICoKLSAqIENhbiBiZSBjYWxsZWQgZnJvbSBhbiBhdG9taWMgY29udGV4dCAod2lsbCBub3Qgc2xlZXApIGJ1dCBub3QgZnJvbQotICogd2l0aGluIGludGVycnVwdCBjb250ZXh0IChzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyB1c2UgY2FzZSBmb3IKLSAqIHRoYXQgeWV0KS4KKyAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dCAobWlnaHQgc2xlZXApCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb24gZmFpbHVyZQogICovCiBpbnQgaHdzcGluX2xvY2tfZnJlZShzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh3bG9jay0+YmFuay0+ZGV2OwogCXN0cnVjdCBod3NwaW5sb2NrICp0bXA7CiAJaW50IHJldDsKIApAQCAtNTExLDM0ICs1NjEsMzQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc3Bpbl9sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJbXV0ZXhfbG9jaygmaHdzcGlubG9ja190cmVlX2xvY2spOwogCiAJLyogbWFrZSBzdXJlIHRoZSBod3NwaW5sb2NrIGlzIHVzZWQgKi8KLQlyZXQgPSByYWRpeF90cmVlX3RhZ19nZXQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrLT5pZCwKKwlyZXQgPSByYWRpeF90cmVlX3RhZ19nZXQoJmh3c3BpbmxvY2tfdHJlZSwgaHdsb2NrX3RvX2lkKGh3bG9jayksCiAJCQkJCQkJSFdTUElOTE9DS19VTlVTRUQpOwogCWlmIChyZXQgPT0gMSkgewotCQlkZXZfZXJyKGh3bG9jay0+ZGV2LCAiJXM6IGh3bG9jayBpcyBhbHJlYWR5IGZyZWVcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycihkZXYsICIlczogaHdsb2NrIGlzIGFscmVhZHkgZnJlZVxuIiwgX19mdW5jX18pOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIG5vdGlmeSB0aGUgdW5kZXJseWluZyBkZXZpY2UgdGhhdCBwb3dlciBpcyBub3QgbmVlZGVkICovCi0JcmV0ID0gcG1fcnVudGltZV9wdXQoaHdsb2NrLT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfcHV0KGRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJLyogbWFyayB0aGlzIGh3c3BpbmxvY2sgYXMgYXZhaWxhYmxlICovCi0JdG1wID0gcmFkaXhfdHJlZV90YWdfc2V0KCZod3NwaW5sb2NrX3RyZWUsIGh3bG9jay0+aWQsCisJdG1wID0gcmFkaXhfdHJlZV90YWdfc2V0KCZod3NwaW5sb2NrX3RyZWUsIGh3bG9ja190b19pZChod2xvY2spLAogCQkJCQkJCUhXU1BJTkxPQ0tfVU5VU0VEKTsKIAogCS8qIHNhbml0eSBjaGVjayAodGhpcyBzaG91bGRuJ3QgaGFwcGVuKSAqLwogCVdBUk5fT04odG1wICE9IGh3bG9jayk7CiAKLQltb2R1bGVfcHV0KGh3bG9jay0+b3duZXIpOworCW1vZHVsZV9wdXQoZGV2LT5kcml2ZXItPm93bmVyKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZod3NwaW5sb2NrX3RyZWVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGh3c3Bpbl9sb2NrX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3NwaW5sb2NrL2h3c3BpbmxvY2tfaW50ZXJuYWwuaCBiL2RyaXZlcnMvaHdzcGlubG9jay9od3NwaW5sb2NrX2ludGVybmFsLmgKaW5kZXggNjk5MzVlNi4uZDI2Zjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3NwaW5sb2NrL2h3c3BpbmxvY2tfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2h3c3BpbmxvY2svaHdzcGlubG9ja19pbnRlcm5hbC5oCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAorc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlOworCiAvKioKICAqIHN0cnVjdCBod3NwaW5sb2NrX29wcyAtIHBsYXRmb3JtLXNwZWNpZmljIGh3c3BpbmxvY2sgaGFuZGxlcnMKICAqCkBAIC0zOSwyMyArNDEsMzcgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaHdzcGlubG9jayAtIHRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgaHdzcGlubG9jayBpbnN0YW5jZQotICoKLSAqIEBkZXY6IHVuZGVybHlpbmcgZGV2aWNlLCB3aWxsIGJlIHVzZWQgdG8gaW52b2tlIHJ1bnRpbWUgUE0gYXBpCi0gKiBAb3BzOiBwbGF0Zm9ybS1zcGVjaWZpYyBod3NwaW5sb2NrIGhhbmRsZXJzCi0gKiBAaWQ6IGEgZ2xvYmFsLCB1bmlxdWUsIHN5c3RlbS13aWRlLCBpbmRleCBvZiB0aGUgbG9jay4KKyAqIEBiYW5rOiB0aGUgaHdzcGlubG9ja19kZXZpY2Ugc3RydWN0dXJlIHdoaWNoIG93bnMgdGhpcyBsb2NrCiAgKiBAbG9jazogaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYnkgaHdzcGlubG9jayBjb3JlCi0gKiBAb3duZXI6IHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gbW9kdWxlLCB1c2VkIHRvIG1haW50YWluIG1vZHVsZSByZWYgY291bnQKLSAqCi0gKiBOb3RlOiBjdXJyZW50bHkgc2ltcGxpY2l0eSB3YXMgb3B0ZWQgZm9yLCBidXQgbGF0ZXIgd2UgY2FuIHNxdWVlemUgc29tZQotICogbWVtb3J5IGJ5dGVzIGJ5IGdyb3VwaW5nIHRoZSBkZXYsIG9wcyBhbmQgb3duZXIgbWVtYmVycyBpbiBhIHNpbmdsZQotICogcGVyLXBsYXRmb3JtIHN0cnVjdCwgYW5kIGhhdmUgYWxsIGh3c3BpbmxvY2tzIHBvaW50IGF0IGl0LgorICogQHByaXY6IHByaXZhdGUgZGF0YSwgb3duZWQgYnkgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0tc3BlY2lmaWMgaHdzcGlubG9jayBkcnYKICAqLwogc3RydWN0IGh3c3BpbmxvY2sgeworCXN0cnVjdCBod3NwaW5sb2NrX2RldmljZSAqYmFuazsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCAqcHJpdjsKK307CisKKy8qKgorICogc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIC0gYSBkZXZpY2Ugd2hpY2ggdXN1YWxseSBzcGFucyBudW1lcm91cyBod3NwaW5sb2NrcworICogQGRldjogdW5kZXJseWluZyBkZXZpY2UsIHdpbGwgYmUgdXNlZCB0byBpbnZva2UgcnVudGltZSBQTSBhcGkKKyAqIEBvcHM6IHBsYXRmb3JtLXNwZWNpZmljIGh3c3BpbmxvY2sgaGFuZGxlcnMKKyAqIEBiYXNlX2lkOiBpZCBpbmRleCBvZiB0aGUgZmlyc3QgbG9jayBpbiB0aGlzIGRldmljZQorICogQG51bV9sb2NrczogbnVtYmVyIG9mIGxvY2tzIGluIHRoaXMgZGV2aWNlCisgKiBAbG9jazogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mICdzdHJ1Y3QgaHdzcGlubG9jaycKKyAqLworc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJY29uc3Qgc3RydWN0IGh3c3BpbmxvY2tfb3BzICpvcHM7Ci0JaW50IGlkOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlpbnQgYmFzZV9pZDsKKwlpbnQgbnVtX2xvY2tzOworCXN0cnVjdCBod3NwaW5sb2NrIGxvY2tbMF07CiB9OwogCitzdGF0aWMgaW5saW5lIGludCBod2xvY2tfdG9faWQoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaykKK3sKKwlpbnQgbG9jYWxfaWQgPSBod2xvY2sgLSAmaHdsb2NrLT5iYW5rLT5sb2NrWzBdOworCisJcmV0dXJuIGh3bG9jay0+YmFuay0+YmFzZV9pZCArIGxvY2FsX2lkOworfQorCiAjZW5kaWYgLyogX19IV1NQSU5MT0NLX0hXU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3NwaW5sb2NrL29tYXBfaHdzcGlubG9jay5jIGIvZHJpdmVycy9od3NwaW5sb2NrL29tYXBfaHdzcGlubG9jay5jCmluZGV4IGE4ZjAyNzMuLjg4N2QzNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdzcGlubG9jay9vbWFwX2h3c3BpbmxvY2suYworKysgYi9kcml2ZXJzL2h3c3BpbmxvY2svb21hcF9od3NwaW5sb2NrLmMKQEAgLTQxLDMzICs0MSwyMCBAQAogI2RlZmluZSBTUElOTE9DS19OT1RUQUtFTgkJKDApCS8qIGZyZWUgKi8KICNkZWZpbmUgU1BJTkxPQ0tfVEFLRU4JCQkoMSkJLyogbG9ja2VkICovCiAKLSNkZWZpbmUgdG9fb21hcF9od3NwaW5sb2NrKGxvY2spCVwKLQljb250YWluZXJfb2YobG9jaywgc3RydWN0IG9tYXBfaHdzcGlubG9jaywgbG9jaykKLQotc3RydWN0IG9tYXBfaHdzcGlubG9jayB7Ci0Jc3RydWN0IGh3c3BpbmxvY2sgbG9jazsKLQl2b2lkIF9faW9tZW0gKmFkZHI7Ci19OwotCi1zdHJ1Y3Qgb21hcF9od3NwaW5sb2NrX3N0YXRlIHsKLQlpbnQgbnVtX2xvY2tzOwkJCS8qIFRvdGFsIG51bWJlciBvZiBsb2NrcyBpbiBzeXN0ZW0gKi8KLQl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CQkvKiBNYXBwZWQgYmFzZSBhZGRyZXNzICovCi19OwotCiBzdGF0aWMgaW50IG9tYXBfaHdzcGlubG9ja190cnlsb2NrKHN0cnVjdCBod3NwaW5sb2NrICpsb2NrKQogewotCXN0cnVjdCBvbWFwX2h3c3BpbmxvY2sgKm9tYXBfbG9jayA9IHRvX29tYXBfaHdzcGlubG9jayhsb2NrKTsKKwl2b2lkIF9faW9tZW0gKmxvY2tfYWRkciA9IGxvY2stPnByaXY7CiAKIAkvKiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgYnkgcmVhZGluZyBpdHMgdmFsdWUgKi8KLQlyZXR1cm4gKFNQSU5MT0NLX05PVFRBS0VOID09IHJlYWRsKG9tYXBfbG9jay0+YWRkcikpOworCXJldHVybiAoU1BJTkxPQ0tfTk9UVEFLRU4gPT0gcmVhZGwobG9ja19hZGRyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfaHdzcGlubG9ja191bmxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmxvY2spCiB7Ci0Jc3RydWN0IG9tYXBfaHdzcGlubG9jayAqb21hcF9sb2NrID0gdG9fb21hcF9od3NwaW5sb2NrKGxvY2spOworCXZvaWQgX19pb21lbSAqbG9ja19hZGRyID0gbG9jay0+cHJpdjsKIAogCS8qIHJlbGVhc2UgdGhlIGxvY2sgYnkgd3JpdGluZyAwIHRvIGl0ICovCi0Jd3JpdGVsKFNQSU5MT0NLX05PVFRBS0VOLCBvbWFwX2xvY2stPmFkZHIpOworCXdyaXRlbChTUElOTE9DS19OT1RUQUtFTiwgbG9ja19hZGRyKTsKIH0KIAogLyoKQEAgLTkzLDI2ICs4MCwyMyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwX2h3c3BpbmxvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrICpvbWFwX2xvY2s7Ci0Jc3RydWN0IG9tYXBfaHdzcGlubG9ja19zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IGh3c3BpbmxvY2sgKmxvY2s7CisJc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rOworCXN0cnVjdCBod3NwaW5sb2NrICpod2xvY2s7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdm9pZCBfX2lvbWVtICppb19iYXNlOwotCWludCBpLCByZXQ7CisJaW50IG51bV9sb2NrcywgaSwgcmV0OworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0YXRlID0ga3phbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpb19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghaW9fYmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfc3RhdGU7Ci0JfQorCWlmICghaW9fYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGxvY2tzICovCiAJaSA9IHJlYWRsKGlvX2Jhc2UgKyBTWVNTVEFUVVNfT0ZGU0VUKTsKQEAgLTEyNCwxMCArMTA4LDE4IEBACiAJCWdvdG8gaW91bm1hcF9iYXNlOwogCX0KIAotCXN0YXRlLT5udW1fbG9ja3MgPSBpICogMzI7Ci0Jc3RhdGUtPmlvX2Jhc2UgPSBpb19iYXNlOworCW51bV9sb2NrcyA9IGkgKiAzMjsgLyogYWN0dWFsIG51bWJlciBvZiBsb2NrcyBpbiB0aGlzIGRldmljZSAqLwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc3RhdGUpOworCWJhbmsgPSBremFsbG9jKHNpemVvZigqYmFuaykgKyBudW1fbG9ja3MgKiBzaXplb2YoKmh3bG9jayksIEdGUF9LRVJORUwpOworCWlmICghYmFuaykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGlvdW5tYXBfYmFzZTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBiYW5rKTsKKworCWZvciAoaSA9IDAsIGh3bG9jayA9ICZiYW5rLT5sb2NrWzBdOyBpIDwgbnVtX2xvY2tzOyBpKyssIGh3bG9jaysrKQorCQlod2xvY2stPnByaXYgPSBpb19iYXNlICsgTE9DS19CQVNFX09GRlNFVCArIHNpemVvZih1MzIpICogaTsKIAogCS8qCiAJICogcnVudGltZSBQTSB3aWxsIG1ha2Ugc3VyZSB0aGUgY2xvY2sgb2YgdGhpcyBtb2R1bGUgaXMKQEAgLTEzNSw3OSArMTI3LDQ2IEBACiAJICovCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm51bV9sb2NrczsgaSsrKSB7Ci0JCW9tYXBfbG9jayA9IGt6YWxsb2Moc2l6ZW9mKCpvbWFwX2xvY2spLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFvbWFwX2xvY2spIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGZyZWVfbG9ja3M7Ci0JCX0KLQotCQlvbWFwX2xvY2stPmxvY2suZGV2ID0gJnBkZXYtPmRldjsKLQkJb21hcF9sb2NrLT5sb2NrLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCW9tYXBfbG9jay0+bG9jay5pZCA9IGk7Ci0JCW9tYXBfbG9jay0+bG9jay5vcHMgPSAmb21hcF9od3NwaW5sb2NrX29wczsKLQkJb21hcF9sb2NrLT5hZGRyID0gaW9fYmFzZSArIExPQ0tfQkFTRV9PRkZTRVQgKyBzaXplb2YodTMyKSAqIGk7Ci0KLQkJcmV0ID0gaHdzcGluX2xvY2tfcmVnaXN0ZXIoJm9tYXBfbG9jay0+bG9jayk7Ci0JCWlmIChyZXQpIHsKLQkJCWtmcmVlKG9tYXBfbG9jayk7Ci0JCQlnb3RvIGZyZWVfbG9ja3M7Ci0JCX0KLQl9CisJcmV0ID0gaHdzcGluX2xvY2tfcmVnaXN0ZXIoYmFuaywgJnBkZXYtPmRldiwgJm9tYXBfaHdzcGlubG9ja19vcHMsCisJCQkJCQlwZGF0YS0+YmFzZV9pZCwgbnVtX2xvY2tzKTsKKwlpZiAocmV0KQorCQlnb3RvIHJlZ19mYWlsOwogCiAJcmV0dXJuIDA7CiAKLWZyZWVfbG9ja3M6Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWxvY2sgPSBod3NwaW5fbG9ja191bnJlZ2lzdGVyKGkpOwotCQkvKiB0aGlzIHNob3VsZCd0IGhhcHBlbiwgYnV0IGxldCdzIGdpdmUgb3VyIGJlc3QgZWZmb3J0ICovCi0JCWlmICghbG9jaykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNsZWFudXBzIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJY29udGludWU7Ci0JCX0KLQkJb21hcF9sb2NrID0gdG9fb21hcF9od3NwaW5sb2NrKGxvY2spOwotCQlrZnJlZShvbWFwX2xvY2spOwotCX0KK3JlZ19mYWlsOgogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlrZnJlZShiYW5rKTsKIGlvdW5tYXBfYmFzZToKIAlpb3VubWFwKGlvX2Jhc2UpOwotZnJlZV9zdGF0ZToKLQlrZnJlZShzdGF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvbWFwX2h3c3BpbmxvY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwX2h3c3BpbmxvY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IG9tYXBfaHdzcGlubG9ja19zdGF0ZSAqc3RhdGUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgaHdzcGlubG9jayAqbG9jazsKLQlzdHJ1Y3Qgb21hcF9od3NwaW5sb2NrICpvbWFwX2xvY2s7Ci0JaW50IGk7CisJc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb19iYXNlID0gYmFuay0+bG9ja1swXS5wcml2IC0gTE9DS19CQVNFX09GRlNFVDsKKwlpbnQgcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IHN0YXRlLT5udW1fbG9ja3M7IGkrKykgewotCQlsb2NrID0gaHdzcGluX2xvY2tfdW5yZWdpc3RlcihpKTsKLQkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuIGF0IHRoaXMgcG9pbnQuIGlmIGl0IGRvZXMsIGF0IGxlYXN0Ci0JCSAqIGRvbid0IGNvbnRpbnVlIHdpdGggdGhlIHJlbW92ZSAqLwotCQlpZiAoIWxvY2spIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgb24gJWRcbiIsIF9fZnVuY19fLCBpKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQlvbWFwX2xvY2sgPSB0b19vbWFwX2h3c3BpbmxvY2sobG9jayk7Ci0JCWtmcmVlKG9tYXBfbG9jayk7CisJcmV0ID0gaHdzcGluX2xvY2tfdW5yZWdpc3RlcihiYW5rKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlpb3VubWFwKHN0YXRlLT5pb19iYXNlKTsKLQlrZnJlZShzdGF0ZSk7CisJaW91bm1hcChpb19iYXNlKTsKKwlrZnJlZShiYW5rKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2h3c3BpbmxvY2tfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvbWFwX2h3c3BpbmxvY2tfcHJvYmUsCi0JLnJlbW92ZQkJPSBvbWFwX2h3c3BpbmxvY2tfcmVtb3ZlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aob21hcF9od3NwaW5sb2NrX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gIm9tYXBfaHdzcGlubG9jayIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3c3BpbmxvY2svdTg1MDBfaHNlbS5jIGIvZHJpdmVycy9od3NwaW5sb2NrL3U4NTAwX2hzZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk4MGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od3NwaW5sb2NrL3U4NTAwX2hzZW0uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIHU4NTAwIEhXU0VNIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFNULUVyaWNzc29uCisgKgorICogSW1wbGVtZW50cyB1ODUwMCBzZW1hcGhvcmUgaGFuZGxpbmcgZm9yIHByb3RvY29sIDEsIG5vIGludGVycnVwdHMuCisgKgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICogSGVhdmlseSBib3Jyb3dlZCBmcm9tIHRoZSB3b3JrIG9mIDoKKyAqICAgU2ltb24gUXVlIDxzcXVlQHRpLmNvbT4KKyAqICAgSGFyaSBLYW5pZ2VyaSA8aC1rYW5pZ2VyaTJAdGkuY29tPgorICogICBPaGFkIEJlbi1Db2hlbiA8b2hhZEB3aXplcnkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9od3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJod3NwaW5sb2NrX2ludGVybmFsLmgiCisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBTVEUncyBIU2VtIHByb3RvY29sIDEgd2l0aG91dCBpbnRlcnJ1dHBzLgorICogVGhlIG9ubHkgbWFzdGVySUQgd2UgYWxsb3cgaXMgJzB4MDEnIHRvIGZvcmNlIHBlb3BsZSB0byB1c2UKKyAqIEhTZW1zIGZvciBzeW5jaHJvbmlzYXRpb24gYmV0d2VlbiBwcm9jZXNzb3JzIHJhdGhlciB0aGFuIHByb2Nlc3NlcworICogb24gdGhlIEFSTSBjb3JlLgorICovCisKKyNkZWZpbmUgVTg1MDBfTUFYX1NFTUFQSE9SRQkJMzIJLyogYSB0b3RhbCBvZiAzMiBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgUkVTRVRfU0VNQVBIT1JFCQkJKDApCS8qIGZyZWUgKi8KKworLyoKKyAqIENQVSBJRCBmb3IgbWFzdGVyIHJ1bm5pbmcgdTg1MDAga2VybmVsLgorICogSHN3cGlubG9ja3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBzeW5jaG9uaXNlIG9wZXJhdGlvbnMKKyAqIGJldHdlZW4gdGhlIENvcnRleCBBOSBjb3JlIGFuZCB0aGUgb3RoZXIgQ1BVcy4gIEhlbmNlCisgKiBmb3JjaW5nIHRoZSBtYXN0ZXJJRCB0byBhIHByZXNldCB2YWx1ZS4KKyAqLworI2RlZmluZSBIU0VNX01BU1RFUl9JRAkJCTB4MDEKKworI2RlZmluZSBIU0VNX1JFR0lTVEVSX09GRlNFVAkJMHgwOAorCisjZGVmaW5lIEhTRU1fQ1RSTF9SRUcJCQkweDAwCisjZGVmaW5lIEhTRU1fSUNSQUxMCQkJMHg5MAorI2RlZmluZSBIU0VNX1BST1RPQ09MXzEJCQkweDAxCisKK3N0YXRpYyBpbnQgdTg1MDBfaHNlbV90cnlsb2NrKHN0cnVjdCBod3NwaW5sb2NrICpsb2NrKQoreworCXZvaWQgX19pb21lbSAqbG9ja19hZGRyID0gbG9jay0+cHJpdjsKKworCXdyaXRlbChIU0VNX01BU1RFUl9JRCwgbG9ja19hZGRyKTsKKworCS8qIGdldCBvbmx5IGZpcnN0IDQgYml0IGFuZCBjb21wYXJlIHRvIG1hc3RlcklELgorCSAqIGlmIGVxdWFsLCB3ZSBoYXZlIHRoZSBzZW1hcGhvcmUsIG90aGVyd2lzZQorCSAqIHNvbWVvbmUgZWxzZSBoYXMgaXQuCisJICovCisJcmV0dXJuIChIU0VNX01BU1RFUl9JRCA9PSAoMHgwRiAmIHJlYWRsKGxvY2tfYWRkcikpKTsKK30KKworc3RhdGljIHZvaWQgdTg1MDBfaHNlbV91bmxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmxvY2spCit7CisJdm9pZCBfX2lvbWVtICpsb2NrX2FkZHIgPSBsb2NrLT5wcml2OworCisJLyogcmVsZWFzZSB0aGUgbG9jayBieSB3cml0aW5nIDAgdG8gaXQgKi8KKwl3cml0ZWwoUkVTRVRfU0VNQVBIT1JFLCBsb2NrX2FkZHIpOworfQorCisvKgorICogdTg1MDA6IHdoYXQgdmFsdWUgaXMgcmVjb21tZW5kZWQgaGVyZSA/CisgKi8KK3N0YXRpYyB2b2lkIHU4NTAwX2hzZW1fcmVsYXgoc3RydWN0IGh3c3BpbmxvY2sgKmxvY2spCit7CisJbmRlbGF5KDUwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBod3NwaW5sb2NrX29wcyB1ODUwMF9od3NwaW5sb2NrX29wcyA9IHsKKwkudHJ5bG9jawk9IHU4NTAwX2hzZW1fdHJ5bG9jaywKKwkudW5sb2NrCQk9IHU4NTAwX2hzZW1fdW5sb2NrLAorCS5yZWxheAkJPSB1ODUwMF9oc2VtX3JlbGF4LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdTg1MDBfaHNlbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBod3NwaW5sb2NrX3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBod3NwaW5sb2NrX2RldmljZSAqYmFuazsKKwlzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKKwlpbnQgaSwgcmV0LCBudW1fbG9ja3MgPSBVODUwMF9NQVhfU0VNQVBIT1JFOworCXVsb25nIHZhbDsKKworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpb19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghaW9fYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYWtlIHN1cmUgcHJvdG9jb2wgMSBpcyBzZWxlY3RlZCAqLworCXZhbCA9IHJlYWRsKGlvX2Jhc2UgKyBIU0VNX0NUUkxfUkVHKTsKKwl3cml0ZWwoKHZhbCAmIH5IU0VNX1BST1RPQ09MXzEpLCBpb19iYXNlICsgSFNFTV9DVFJMX1JFRyk7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCXdyaXRlbCgweEZGRkYsIGlvX2Jhc2UgKyBIU0VNX0lDUkFMTCk7CisKKwliYW5rID0ga3phbGxvYyhzaXplb2YoKmJhbmspICsgbnVtX2xvY2tzICogc2l6ZW9mKCpod2xvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJhbmspIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBpb3VubWFwX2Jhc2U7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmFuayk7CisKKwlmb3IgKGkgPSAwLCBod2xvY2sgPSAmYmFuay0+bG9ja1swXTsgaSA8IG51bV9sb2NrczsgaSsrLCBod2xvY2srKykKKwkJaHdsb2NrLT5wcml2ID0gaW9fYmFzZSArIEhTRU1fUkVHSVNURVJfT0ZGU0VUICsgc2l6ZW9mKHUzMikgKiBpOworCisJLyogbm8gcG0gbmVlZGVkIGZvciBIU2VtIGJ1dCByZXF1aXJlZCB0byBjb21wbHkgd2l0aCBod3NwaWxvY2sgY29yZSAqLworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCisJcmV0ID0gaHdzcGluX2xvY2tfcmVnaXN0ZXIoYmFuaywgJnBkZXYtPmRldiwgJnU4NTAwX2h3c3BpbmxvY2tfb3BzLAorCQkJCQkJcGRhdGEtPmJhc2VfaWQsIG51bV9sb2Nrcyk7CisJaWYgKHJldCkKKwkJZ290byByZWdfZmFpbDsKKworCXJldHVybiAwOworCityZWdfZmFpbDoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJa2ZyZWUoYmFuayk7Citpb3VubWFwX2Jhc2U6CisJaW91bm1hcChpb19iYXNlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB1ODUwMF9oc2VtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBod3NwaW5sb2NrX2RldmljZSAqYmFuayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9fYmFzZSA9IGJhbmstPmxvY2tbMF0ucHJpdiAtIEhTRU1fUkVHSVNURVJfT0ZGU0VUOworCWludCByZXQ7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCXdyaXRlbCgweEZGRkYsIGlvX2Jhc2UgKyBIU0VNX0lDUkFMTCk7CisKKwlyZXQgPSBod3NwaW5fbG9ja191bnJlZ2lzdGVyKGJhbmspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWlvdW5tYXAoaW9fYmFzZSk7CisJa2ZyZWUoYmFuayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdTg1MDBfaHNlbV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHU4NTAwX2hzZW1fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh1ODUwMF9oc2VtX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInU4NTAwX2hzZW0iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdTg1MDBfaHNlbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdTg1MDBfaHNlbV9kcml2ZXIpOworfQorLyogYm9hcmQgaW5pdCBjb2RlIG1pZ2h0IG5lZWQgdG8gcmVzZXJ2ZSBod3NwaW5sb2NrcyBmb3IgcHJlZGVmaW5lZCBwdXJwb3NlcyAqLworcG9zdGNvcmVfaW5pdGNhbGwodTg1MDBfaHNlbV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHU4NTAwX2hzZW1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ1ODUwMF9oc2VtX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh1ODUwMF9oc2VtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhcmR3YXJlIFNwaW5sb2NrIGRyaXZlciBmb3IgdTg1MDAiKTsKK01PRFVMRV9BVVRIT1IoIk1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCmluZGV4IGQ2ZDU4NjguLjg1NTg0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC00Nyw4ICs0Nyw4IEBACiAvKiAtLS0tLSBnbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwogCiBzdGF0aWMgaW50IGJpdF90ZXN0OwkvKiBzZWUgaWYgdGhlIGxpbmUtc2V0dGluZyBmdW5jdGlvbnMgd29yawkqLwotbW9kdWxlX3BhcmFtKGJpdF90ZXN0LCBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYml0X3Rlc3QsICJUZXN0IHRoZSBsaW5lcyBvZiB0aGUgYnVzIHRvIHNlZSBpZiBpdCBpcyBzdHVjayIpOworbW9kdWxlX3BhcmFtKGJpdF90ZXN0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhiaXRfdGVzdCwgImxpbmVzIHRlc3RpbmcgLSAwIG9mZjsgMSByZXBvcnQ7IDIgZmFpbCBpZiBzdHVjayIpOwogCiAjaWZkZWYgREVCVUcKIHN0YXRpYyBpbnQgaTJjX2RlYnVnID0gMTsKQEAgLTI1MCw3ICsyNTAsOSBAQAogCXNkYSA9IGdldHNkYShhZGFwKTsKIAlzY2wgPSAoYWRhcC0+Z2V0c2NsID09IE5VTEwpID8gMSA6IGdldHNjbChhZGFwKTsKIAlpZiAoIXNjbCB8fCAhc2RhKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBidXMgc2VlbXMgdG8gYmUgYnVzeVxuIiwgbmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogYnVzIHNlZW1zIHRvIGJlIGJ1c3kgKHNjbD0lZCwgc2RhPSVkKVxuIiwKKwkJICAgICAgIG5hbWUsIHNjbCwgc2RhKTsKIAkJZ290byBiYWlsb3V0OwogCX0KIApAQCAtNDQxLDcgKzQ0Myw3IEBACiAJCQkJCWFja25hayhpMmNfYWRhcCwgMCk7CiAJCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwgInJlYWRieXRlczogaW52YWxpZCAiCiAJCQkJCSJibG9jayBsZW5ndGggKCVkKVxuIiwgaW52YWwpOwotCQkJCXJldHVybiAtRVJFTU9URUlPOworCQkJCXJldHVybiAtRVBST1RPOwogCQkJfQogCQkJLyogVGhlIG9yaWdpbmFsIGNvdW50IHZhbHVlIGFjY291bnRzIGZvciB0aGUgZXh0cmEKIAkJCSAgIGJ5dGVzLCB0aGF0IGlzLCBlaXRoZXIgMSBmb3IgYSByZWd1bGFyIHRyYW5zYWN0aW9uLApAQCAtNDcwLDcgKzQ3Miw3IEBACiAgKiByZWFkcywgd3JpdGVzIGFzIHdlbGwgYXMgMTBiaXQtYWRkcmVzc2VzLgogICogcmV0dXJuczoKICAqICAwIGV2ZXJ5dGhpbmcgd2VudCBva2F5LCB0aGUgY2hpcCBhY2snZWQsIG9yIElHTk9SRV9OQUsgZmxhZyB3YXMgc2V0Ci0gKiAteCBhbiBlcnJvciBvY2N1cnJlZCAobGlrZTogLUVSRU1PVEVJTyBpZiB0aGUgZGV2aWNlIGRpZCBub3QgYW5zd2VyLCBvcgorICogLXggYW4gZXJyb3Igb2NjdXJyZWQgKGxpa2U6IC1FTlhJTyBpZiB0aGUgZGV2aWNlIGRpZCBub3QgYW5zd2VyLCBvcgogICoJLUVUSU1FRE9VVCwgZm9yIGV4YW1wbGUgaWYgdGhlIGxpbmVzIGFyZSBzdHVjay4uLikKICAqLwogc3RhdGljIGludCBiaXRfZG9BZGRyZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2cpCkBAIC00OTMsMTQgKzQ5NSwxNCBAQAogCQlpZiAoKHJldCAhPSAxKSAmJiAhbmFrX29rKSAgewogCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwKIAkJCQkiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGVcbiIpOwotCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJCS8qIHRoZSByZW1haW5pbmcgOCBiaXQgYWRkcmVzcyAqLwogCQlyZXQgPSBpMmNfb3V0YihpMmNfYWRhcCwgbXNnLT5hZGRyICYgMHg3Zik7CiAJCWlmICgocmV0ICE9IDEpICYmICFuYWtfb2spIHsKIAkJCS8qIHRoZSBjaGlwIGRpZCBub3QgYWNrIC8geG1pc3Npb24gZXJyb3Igb2NjdXJyZWQgKi8KIAkJCWRldl9lcnIoJmkyY19hZGFwLT5kZXYsICJkaWVkIGF0IDJuZCBhZGRyZXNzIGNvZGVcbiIpOwotCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJCWlmIChmbGFncyAmIEkyQ19NX1JEKSB7CiAJCQliaXRfZGJnKDMsICZpMmNfYWRhcC0+ZGV2LCAiZW1pdHRpbmcgcmVwZWF0ZWQgIgpAQCAtNTEyLDcgKzUxNCw3IEBACiAJCQlpZiAoKHJldCAhPSAxKSAmJiAhbmFrX29rKSB7CiAJCQkJZGV2X2VycigmaTJjX2FkYXAtPmRldiwKIAkJCQkJImRpZWQgYXQgcmVwZWF0ZWQgYWRkcmVzcyBjb2RlXG4iKTsKLQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CQkvKiBub3JtYWwgN2JpdCBhZGRyZXNzCSovCkBAIC01NzAsNyArNTcyLDcgQEAKIAkJCQkJcmV0LCByZXQgPT0gMSA/ICIiIDogInMiKTsKIAkJCWlmIChyZXQgPCBwbXNnLT5sZW4pIHsKIAkJCQlpZiAocmV0ID49IDApCi0JCQkJCXJldCA9IC1FUkVNT1RFSU87CisJCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBiYWlsb3V0OwogCQkJfQogCQl9IGVsc2UgewpAQCAtNTgxLDcgKzU4Myw3IEBACiAJCQkJCXJldCwgcmV0ID09IDEgPyAiIiA6ICJzIik7CiAJCQlpZiAocmV0IDwgcG1zZy0+bGVuKSB7CiAJCQkJaWYgKHJldCA+PSAwKQotCQkJCQlyZXQgPSAtRVJFTU9URUlPOworCQkJCQlyZXQgPSAtRUlPOwogCQkJCWdvdG8gYmFpbG91dDsKIAkJCX0KIAkJfQpAQCAtNjI0LDcgKzYyNiw3IEBACiAKIAlpZiAoYml0X3Rlc3QpIHsKIAkJcmV0ID0gdGVzdF9idXMoYWRhcCk7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAoYml0X3Rlc3QgPj0gMiAmJiByZXQgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCmluZGV4IDRjYTljZjkuLmJlYjlmZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWRldl9kYmcoJmkyY19hZGFwLT5kZXYsICJidXMgaXMgbm90IGlkbGUuIHN0YXR1cyBpcyAiCiAJCQkJIiUjMDR4XG4iLCBzdGF0ZSk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CiAKQEAgLTIyNCw3ICsyMjQsNyBAQAogCX0KIAogCWN1cm1zZyA9IDA7Ci0JcmV0ID0gLUVSRU1PVEVJTzsKKwlyZXQgPSAtRUlPOwogCXdoaWxlIChjdXJtc2cgPCBudW0pIHsKIAkJc3RhdGUgPSBwY2Ffc3RhdHVzKGFkYXApOwogCkBAIC0yNTksNiArMjU5LDcgQEAKIAkJY2FzZSAweDIwOiAvKiBTTEErVyBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwogCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErV1xuIik7CiAJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCXJldCA9IC1FTlhJTzsKIAkJCWdvdG8gb3V0OwogCiAJCWNhc2UgMHg0MDogLyogU0xBK1IgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLwpAQCAtMjgzLDYgKzI4NCw3IEBACiAJCWNhc2UgMHg0ODogLyogU0xBK1IgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KIAkJCURFQjIoIk5PVCBBQ0sgcmVjZWl2ZWQgYWZ0ZXIgU0xBK1JcbiIpOwogCQkJcGNhX3N0b3AoYWRhcCk7CisJCQlyZXQgPSAtRU5YSU87CiAJCQlnb3RvIG91dDsKIAogCQljYXNlIDB4MzA6IC8qIERhdGEgYnl0ZSBpbiBJMkNEQVQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IE5PVCBBQ0sgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggNjQ2MDY4ZS4uYTNhZmFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTExMCw3ICsxMTAsNiBAQAogY29uZmlnIEkyQ19JU0NICiAJdHJpc3RhdGUgIkludGVsIFNDSCBTTUJ1cyAxLjAiCiAJZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgTFBDX1NDSAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIFNNQnVzIGNvbnRyb2xsZXIgb24gdGhlIEludGVsIFNDSApAQCAtMzAxLDcgKzMwMCw3IEBACiAKIGNvbmZpZyBJMkNfQVUxNTUwCiAJdHJpc3RhdGUgIkF1MTU1MC9BdTEyMDAgU01CdXMgaW50ZXJmYWNlIgotCWRlcGVuZHMgb24gU09DX0FVMTU1MCB8fCBTT0NfQVUxMjAwCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKIAkgIEF1MTU1MCBhbmQgQXUxMjAwIFNNQnVzIGludGVyZmFjZS4KQEAgLTM1MCwxNSArMzQ5LDI1IEBACiAJICBkZXZpY2VzIHN1Y2ggYXMgRGFWaW5jaSBOSUMuCiAJICBGb3IgZGV0YWlscyBwbGVhc2Ugc2VlIGh0dHA6Ly93d3cudGkuY29tL2RhdmluY2kKIAotY29uZmlnIEkyQ19ERVNJR05XQVJFCi0JdHJpc3RhdGUgIlN5bm9wc3lzIERlc2lnbldhcmUiCitjb25maWcgSTJDX0RFU0lHTldBUkVfUExBVEZPUk0KKwl0cmlzdGF0ZSAiU3lub3BzeXMgRGVzaWduV2FyZSBQbGF0ZnJvbSIKIAlkZXBlbmRzIG9uIEhBVkVfQ0xLCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCiAJICBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyLiBPbmx5IG1hc3RlciBtb2RlIGlzIHN1cHBvcnRlZC4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWRlc2lnbndhcmUuCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtZGVzaWdud2FyZS1wbGF0Zm9ybS4KKworY29uZmlnIEkyQ19ERVNJR05XQVJFX1BDSQorCXRyaXN0YXRlICJTeW5vcHN5cyBEZXNpZ25XYXJlIFBDSSIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCSAgU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlci4gT25seSBtYXN0ZXIgbW9kZSBpcyBzdXBwb3J0ZWQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1kZXNpZ253YXJlLXBjaS4KIAogY29uZmlnIEkyQ19HUElPCiAJdHJpc3RhdGUgIkdQSU8tYmFzZWQgYml0YmFuZ2luZyBJMkMiCkBAIC03ODksNyArNzk4LDcgQEAKIAogY29uZmlnIEkyQ19FTEVLVE9SCiAJdHJpc3RhdGUgIkVsZWt0b3IgSVNBIGNhcmQiCi0JZGVwZW5kcyBvbiBJU0EgJiYgQlJPS0VOX09OX1NNUAorCWRlcGVuZHMgb24gSVNBICYmIEhBU19JT1BPUlQgJiYgQlJPS0VOX09OX1NNUAogCXNlbGVjdCBJMkNfQUxHT1BDRgogCWhlbHAKIAkgIFRoaXMgc3VwcG9ydHMgdGhlIFBDRjg1ODQgSVNBIGJ1cyBJMkMgYWRhcHRlci4gIFNheSBZIGlmIHlvdSBvd24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQppbmRleCBlNmNmMjk0Li5mYmE2ZGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCkBAIC0zMyw3ICszMywxMCBAQAogb2JqLSQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpCSs9IGkyYy1iZmluLXR3aS5vCiBvYmotJChDT05GSUdfSTJDX0NQTSkJCSs9IGkyYy1jcG0ubwogb2JqLSQoQ09ORklHX0kyQ19EQVZJTkNJKQkrPSBpMmMtZGF2aW5jaS5vCi1vYmotJChDT05GSUdfSTJDX0RFU0lHTldBUkUpCSs9IGkyYy1kZXNpZ253YXJlLm8KK29iai0kKENPTkZJR19JMkNfREVTSUdOV0FSRV9QTEFURk9STSkJKz0gaTJjLWRlc2lnbndhcmUtcGxhdGZvcm0ubworaTJjLWRlc2lnbndhcmUtcGxhdGZvcm0tb2JqcyA6PSBpMmMtZGVzaWdud2FyZS1wbGF0ZHJ2Lm8gaTJjLWRlc2lnbndhcmUtY29yZS5vCitvYmotJChDT05GSUdfSTJDX0RFU0lHTldBUkVfUENJKQkrPSBpMmMtZGVzaWdud2FyZS1wY2kubworaTJjLWRlc2lnbndhcmUtcGNpLW9ianMgOj0gaTJjLWRlc2lnbndhcmUtcGNpZHJ2Lm8gaTJjLWRlc2lnbndhcmUtY29yZS5vCiBvYmotJChDT05GSUdfSTJDX0dQSU8pCQkrPSBpMmMtZ3Bpby5vCiBvYmotJChDT05GSUdfSTJDX0hJR0hMQU5ERVIpCSs9IGkyYy1oaWdobGFuZGVyLm8KIG9iai0kKENPTkZJR19JMkNfSUJNX0lJQykJKz0gaTJjLWlibV9paWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKaW5kZXggNTMyODI4Yi4uZjMxNGQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jCkBAIC0zNiwzMiArMzYsNDQgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAKKyNkZWZpbmUgUFNDX1NFTAkJMHgwMAorI2RlZmluZSBQU0NfQ1RSTAkweDA0CisjZGVmaW5lIFBTQ19TTUJDRkcJMHgwOAorI2RlZmluZSBQU0NfU01CTVNLCTB4MEMKKyNkZWZpbmUgUFNDX1NNQlBDUgkweDEwCisjZGVmaW5lIFBTQ19TTUJTVEFUCTB4MTQKKyNkZWZpbmUgUFNDX1NNQkVWTlQJMHgxOAorI2RlZmluZSBQU0NfU01CVFhSWAkweDFDCisjZGVmaW5lIFBTQ19TTUJUTVIJMHgyMAorCiBzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhIHsKLQl1MzIJcHNjX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpwc2NfYmFzZTsKIAlpbnQJeGZlcl90aW1lb3V0OwotCWludAlhY2tfdGltZW91dDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvYXJlYTsKIH07CiAKLXN0YXRpYyBpbnQKLXdhaXRfeGZlcl9kb25lKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCitzdGF0aWMgaW5saW5lIHZvaWQgV1Ioc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYSwgaW50IHIsIHVuc2lnbmVkIGxvbmcgdikKIHsKLQl1MzIJc3RhdDsKLQlpbnQJaTsKLQl2b2xhdGlsZSBwc2Nfc21iX3QJKnNwOworCV9fcmF3X3dyaXRlbCh2LCBhLT5wc2NfYmFzZSArIHIpOworCXdtYigpOworfQogCi0Jc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopKGFkYXAtPnBzY19iYXNlKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBSRChzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphLCBpbnQgcikKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYS0+cHNjX2Jhc2UgKyByKTsKK30KIAotCS8qIFdhaXQgZm9yIFR4IEJ1ZmZlciBFbXB0eQotCSovCitzdGF0aWMgaW50IHdhaXRfeGZlcl9kb25lKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCit7CisJaW50IGk7CisKKwkvKiBXYWl0IGZvciBUeCBCdWZmZXIgRW1wdHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+eGZlcl90aW1lb3V0OyBpKyspIHsKLQkJc3RhdCA9IHNwLT5wc2Nfc21ic3RhdDsKLQkJYXVfc3luYygpOwotCQlpZiAoKHN0YXQgJiBQU0NfU01CU1RBVF9URSkgIT0gMCkKKwkJaWYgKFJEKGFkYXAsIFBTQ19TTUJTVEFUKSAmIFBTQ19TTUJTVEFUX1RFKQogCQkJcmV0dXJuIDA7CiAKIAkJdWRlbGF5KDEpOwpAQCAtNzAsNDEgKzgyLDI3IEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyBpbnQKLXdhaXRfYWNrKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCitzdGF0aWMgaW50IHdhaXRfYWNrKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCiB7Ci0JdTMyCXN0YXQ7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKwl1bnNpZ25lZCBsb25nIHN0YXQ7CiAKIAlpZiAod2FpdF94ZmVyX2RvbmUoYWRhcCkpCiAJCXJldHVybiAtRVRJTUVET1VUOwogCi0Jc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopKGFkYXAtPnBzY19iYXNlKTsKLQotCXN0YXQgPSBzcC0+cHNjX3NtYmV2bnQ7Ci0JYXVfc3luYygpOwotCisJc3RhdCA9IFJEKGFkYXAsIFBTQ19TTUJFVk5UKTsKIAlpZiAoKHN0YXQgJiAoUFNDX1NNQkVWTlRfRE4gfCBQU0NfU01CRVZOVF9BTiB8IFBTQ19TTUJFVk5UX0FMKSkgIT0gMCkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotd2FpdF9tYXN0ZXJfZG9uZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwKQorc3RhdGljIGludCB3YWl0X21hc3Rlcl9kb25lKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXApCiB7Ci0JdTMyCXN0YXQ7Ci0JaW50CWk7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKwlpbnQgaTsKIAotCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7Ci0KLQkvKiBXYWl0IGZvciBNYXN0ZXIgRG9uZS4KLQkqLwotCWZvciAoaSA9IDA7IGkgPCBhZGFwLT54ZmVyX3RpbWVvdXQ7IGkrKykgewotCQlzdGF0ID0gc3AtPnBzY19zbWJldm50OwotCQlhdV9zeW5jKCk7Ci0JCWlmICgoc3RhdCAmIFBTQ19TTUJFVk5UX01EKSAhPSAwKQorCS8qIFdhaXQgZm9yIE1hc3RlciBEb25lLiAqLworCWZvciAoaSA9IDA7IGkgPCAyICogYWRhcC0+eGZlcl90aW1lb3V0OyBpKyspIHsKKwkJaWYgKChSRChhZGFwLCBQU0NfU01CRVZOVCkgJiBQU0NfU01CRVZOVF9NRCkgIT0gMCkKIAkJCXJldHVybiAwOwogCQl1ZGVsYXkoMSk7CiAJfQpAQCAtMTE1LDI5ICsxMTMsMjAgQEAKIHN0YXRpYyBpbnQKIGRvX2FkZHJlc3Moc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdW5zaWduZWQgaW50IGFkZHIsIGludCByZCwgaW50IHEpCiB7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKLQl1MzIJCQlzdGF0OworCXVuc2lnbmVkIGxvbmcgc3RhdDsKIAotCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7Ci0KLQkvKiBSZXNldCB0aGUgRklGT3MsIGNsZWFyIGV2ZW50cy4KLQkqLwotCXN0YXQgPSBzcC0+cHNjX3NtYnN0YXQ7Ci0Jc3AtPnBzY19zbWJldm50ID0gUFNDX1NNQkVWTlRfQUxMQ0xSOwotCWF1X3N5bmMoKTsKKwkvKiBSZXNldCB0aGUgRklGT3MsIGNsZWFyIGV2ZW50cy4gKi8KKwlzdGF0ID0gUkQoYWRhcCwgUFNDX1NNQlNUQVQpOworCVdSKGFkYXAsIFBTQ19TTUJFVk5ULCBQU0NfU01CRVZOVF9BTExDTFIpOwogCiAJaWYgKCEoc3RhdCAmIFBTQ19TTUJTVEFUX1RFKSB8fCAhKHN0YXQgJiBQU0NfU01CU1RBVF9SRSkpIHsKLQkJc3AtPnBzY19zbWJwY3IgPSBQU0NfU01CUENSX0RDOwotCQlhdV9zeW5jKCk7Ci0JCWRvIHsKLQkJCXN0YXQgPSBzcC0+cHNjX3NtYnBjcjsKLQkJCWF1X3N5bmMoKTsKLQkJfSB3aGlsZSAoKHN0YXQgJiBQU0NfU01CUENSX0RDKSAhPSAwKTsKKwkJV1IoYWRhcCwgUFNDX1NNQlBDUiwgUFNDX1NNQlBDUl9EQyk7CisJCXdoaWxlICgoUkQoYWRhcCwgUFNDX1NNQlBDUikgJiBQU0NfU01CUENSX0RDKSAhPSAwKQorCQkJY3B1X3JlbGF4KCk7CiAJCXVkZWxheSg1MCk7CiAJfQogCi0JLyogV3JpdGUgb3V0IHRoZSBpMmMgY2hpcCBhZGRyZXNzIGFuZCBzcGVjaWZ5IG9wZXJhdGlvbgotCSovCisJLyogV3JpdGUgb3V0IHRoZSBpMmMgY2hpcCBhZGRyZXNzIGFuZCBzcGVjaWZ5IG9wZXJhdGlvbiAqLwogCWFkZHIgPDw9IDE7CiAJaWYgKHJkKQogCQlhZGRyIHw9IDE7CkBAIC0xNDYsNTYgKzEzNSw0MiBAQAogCWlmIChxKQogCQlhZGRyIHw9IFBTQ19TTUJUWFJYX1NUUDsKIAotCS8qIFB1dCBieXRlIGludG8gZmlmbywgc3RhcnQgdXAgbWFzdGVyLgotCSovCi0Jc3AtPnBzY19zbWJ0eHJ4ID0gYWRkcjsKLQlhdV9zeW5jKCk7Ci0Jc3AtPnBzY19zbWJwY3IgPSBQU0NfU01CUENSX01TOwotCWF1X3N5bmMoKTsKKwkvKiBQdXQgYnl0ZSBpbnRvIGZpZm8sIHN0YXJ0IHVwIG1hc3Rlci4gKi8KKwlXUihhZGFwLCBQU0NfU01CVFhSWCwgYWRkcik7CisJV1IoYWRhcCwgUFNDX1NNQlBDUiwgUFNDX1NNQlBDUl9NUyk7CiAJaWYgKHdhaXRfYWNrKGFkYXApKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gKHEpID8gd2FpdF9tYXN0ZXJfZG9uZShhZGFwKSA6IDA7CiB9CiAKLXN0YXRpYyB1MzIKLXdhaXRfZm9yX3J4X2J5dGUoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdTMyICpyZXRfZGF0YSkKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcnhfYnl0ZShzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7Ci0JaW50CWo7Ci0JdTMyCWRhdGEsIHN0YXQ7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90CSpzcDsKKwlpbnQgajsKIAogCWlmICh3YWl0X3hmZXJfZG9uZShhZGFwKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOwotCiAJaiA9ICBhZGFwLT54ZmVyX3RpbWVvdXQgKiAxMDA7CiAJZG8gewogCQlqLS07CiAJCWlmIChqIDw9IDApCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlzdGF0ID0gc3AtPnBzY19zbWJzdGF0OwotCQlhdV9zeW5jKCk7Ci0JCWlmICgoc3RhdCAmIFBTQ19TTUJTVEFUX1JFKSA9PSAwKQorCQlpZiAoKFJEKGFkYXAsIFBTQ19TTUJTVEFUKSAmIFBTQ19TTUJTVEFUX1JFKSA9PSAwKQogCQkJaiA9IDA7CiAJCWVsc2UKIAkJCXVkZWxheSgxKTsKIAl9IHdoaWxlIChqID4gMCk7Ci0JZGF0YSA9IHNwLT5wc2Nfc21idHhyeDsKLQlhdV9zeW5jKCk7Ci0JKnJldF9kYXRhID0gZGF0YTsKKworCSpvdXQgPSBSRChhZGFwLCBQU0NfU01CVFhSWCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotaTJjX3JlYWQoc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLAorc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICphZGFwLCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCSAgICB1bnNpZ25lZCBpbnQgbGVuKQogewotCWludAlpOwotCXUzMglkYXRhOwotCXZvbGF0aWxlIHBzY19zbWJfdAkqc3A7CisJaW50IGk7CiAKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAwOwpAQCAtMjA0LDYyICsxNzksNDYgQEAKIAkgKiB6ZXJvIGJ5dGVzIGZvciB0aW1pbmcsIHdhaXRpbmcgZm9yIGJ5dGVzIHRvIGFwcGVhciBpbiB0aGUKIAkgKiByZWNlaXZlIGZpZm8sIHRoZW4gcmVhZGluZyB0aGUgYnl0ZXMuCiAJICovCi0KLQlzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKikoYWRhcC0+cHNjX2Jhc2UpOwotCiAJaSA9IDA7Ci0Jd2hpbGUgKGkgPCAobGVuLTEpKSB7Ci0JCXNwLT5wc2Nfc21idHhyeCA9IDA7Ci0JCWF1X3N5bmMoKTsKLQkJaWYgKHdhaXRfZm9yX3J4X2J5dGUoYWRhcCwgJmRhdGEpKQorCXdoaWxlIChpIDwgKGxlbiAtIDEpKSB7CisJCVdSKGFkYXAsIFBTQ19TTUJUWFJYLCAwKTsKKwkJaWYgKHdhaXRfZm9yX3J4X2J5dGUoYWRhcCwgJmJ1ZltpXSkpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlidWZbaV0gPSBkYXRhOwogCQlpKys7CiAJfQogCi0JLyogVGhlIGxhc3QgYnl0ZSBoYXMgdG8gaW5kaWNhdGUgdHJhbnNmZXIgZG9uZS4KLQkqLwotCXNwLT5wc2Nfc21idHhyeCA9IFBTQ19TTUJUWFJYX1NUUDsKLQlhdV9zeW5jKCk7CisJLyogVGhlIGxhc3QgYnl0ZSBoYXMgdG8gaW5kaWNhdGUgdHJhbnNmZXIgZG9uZS4gKi8KKwlXUihhZGFwLCBQU0NfU01CVFhSWCwgUFNDX1NNQlRYUlhfU1RQKTsKIAlpZiAod2FpdF9tYXN0ZXJfZG9uZShhZGFwKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlkYXRhID0gc3AtPnBzY19zbWJ0eHJ4OwotCWF1X3N5bmMoKTsKLQlidWZbaV0gPSBkYXRhOworCWJ1ZltpXSA9ICh1bnNpZ25lZCBjaGFyKShSRChhZGFwLCBQU0NfU01CVFhSWCkgJiAweGZmKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotaTJjX3dyaXRlKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKK3N0YXRpYyBpbnQgaTJjX3dyaXRlKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewotCWludAlpOwotCXUzMglkYXRhOwotCXZvbGF0aWxlIHBzY19zbWJfdAkqc3A7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBkYXRhOwogCiAJaWYgKGxlbiA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXNwID0gKHZvbGF0aWxlIHBzY19zbWJfdCAqKShhZGFwLT5wc2NfYmFzZSk7Ci0KIAlpID0gMDsKIAl3aGlsZSAoaSA8IChsZW4tMSkpIHsKIAkJZGF0YSA9IGJ1ZltpXTsKLQkJc3AtPnBzY19zbWJ0eHJ4ID0gZGF0YTsKLQkJYXVfc3luYygpOworCQlXUihhZGFwLCBQU0NfU01CVFhSWCwgZGF0YSk7CiAJCWlmICh3YWl0X2FjayhhZGFwKSkKIAkJCXJldHVybiAtRUlPOwogCQlpKys7CiAJfQogCi0JLyogVGhlIGxhc3QgYnl0ZSBoYXMgdG8gaW5kaWNhdGUgdHJhbnNmZXIgZG9uZS4KLQkqLworCS8qIFRoZSBsYXN0IGJ5dGUgaGFzIHRvIGluZGljYXRlIHRyYW5zZmVyIGRvbmUuICovCiAJZGF0YSA9IGJ1ZltpXTsKIAlkYXRhIHw9IFBTQ19TTUJUWFJYX1NUUDsKLQlzcC0+cHNjX3NtYnR4cnggPSBkYXRhOwotCWF1X3N5bmMoKTsKKwlXUihhZGFwLCBQU0NfU01CVFhSWCwgZGF0YSk7CiAJaWYgKHdhaXRfbWFzdGVyX2RvbmUoYWRhcCkpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMjY5LDEyICsyMjgsMTAgQEAKIGF1MTU1MF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQogewogCXN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwotCXZvbGF0aWxlIHBzY19zbWJfdCAqc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopYWRhcC0+cHNjX2Jhc2U7CiAJc3RydWN0IGkyY19tc2cgKnA7CiAJaW50IGksIGVyciA9IDA7CiAKLQlzcC0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9FTkFCTEU7Ci0JYXVfc3luYygpOworCVdSKGFkYXAsIFBTQ19DVFJMLCBQU0NfQ1RSTF9FTkFCTEUpOwogCiAJZm9yIChpID0gMDsgIWVyciAmJiBpIDwgbnVtOyBpKyspIHsKIAkJcCA9ICZtc2dzW2ldOwpAQCAtMjkzLDE0ICsyNTAsMTIgQEAKIAlpZiAoZXJyID09IDApCiAJCWVyciA9IG51bTsKIAotCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX1NVU1BFTkQ7Ci0JYXVfc3luYygpOworCVdSKGFkYXAsIFBTQ19DVFJMLCBQU0NfQ1RSTF9TVVNQRU5EKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB1MzIKLWF1MTU1MF9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3N0YXRpYyB1MzIgYXUxNTUwX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOwogfQpAQCAtMzEyLDU3ICsyNjcsNDUgQEAKIAogc3RhdGljIHZvaWQgaTJjX2F1MTU1MF9zZXR1cChzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICpwcml2KQogewotCXZvbGF0aWxlIHBzY19zbWJfdCAqc3AgPSAodm9sYXRpbGUgcHNjX3NtYl90ICopcHJpdi0+cHNjX2Jhc2U7Ci0JdTMyIHN0YXQ7CisJdW5zaWduZWQgbG9uZyBjZmc7CiAKLQlzcC0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9ESVNBQkxFOwotCWF1X3N5bmMoKTsKLQlzcC0+cHNjX3NlbCA9IFBTQ19TRUxfUFNfU01CVVNNT0RFOwotCXNwLT5wc2Nfc21iY2ZnID0gMDsKLQlhdV9zeW5jKCk7Ci0Jc3AtPnBzY19jdHJsID0gUFNDX0NUUkxfRU5BQkxFOwotCWF1X3N5bmMoKTsKLQlkbyB7Ci0JCXN0YXQgPSBzcC0+cHNjX3NtYnN0YXQ7Ci0JCWF1X3N5bmMoKTsKLQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TTUJTVEFUX1NSKSA9PSAwKTsKKwlXUihwcml2LCBQU0NfQ1RSTCwgUFNDX0NUUkxfRElTQUJMRSk7CisJV1IocHJpdiwgUFNDX1NFTCwgUFNDX1NFTF9QU19TTUJVU01PREUpOworCVdSKHByaXYsIFBTQ19TTUJDRkcsIDApOworCVdSKHByaXYsIFBTQ19DVFJMLCBQU0NfQ1RSTF9FTkFCTEUpOworCXdoaWxlICgoUkQocHJpdiwgUFNDX1NNQlNUQVQpICYgUFNDX1NNQlNUQVRfU1IpID09IDApCisJCWNwdV9yZWxheCgpOwogCi0Jc3AtPnBzY19zbWJjZmcgPSAoUFNDX1NNQkNGR19SVF9GSUZPOCB8IFBTQ19TTUJDRkdfVFRfRklGTzggfAotCQkJCVBTQ19TTUJDRkdfRERfRElTQUJMRSk7CisJY2ZnID0gUFNDX1NNQkNGR19SVF9GSUZPOCB8IFBTQ19TTUJDRkdfVFRfRklGTzggfCBQU0NfU01CQ0ZHX0REX0RJU0FCTEU7CisJV1IocHJpdiwgUFNDX1NNQkNGRywgY2ZnKTsKIAogCS8qIERpdmlkZSBieSA4IHRvIGdldCBhIDYuMjUgTUh6IGNsb2NrLiAgVGhlIGxhdGVyIHByb3RvY29sCiAJICogdGltaW5ncyBhcmUgYmFzZWQgb24gdGhpcyBjbG9jay4KIAkgKi8KLQlzcC0+cHNjX3NtYmNmZyB8PSBQU0NfU01CQ0ZHX1NFVF9ESVYoUFNDX1NNQkNGR19ESVY4KTsKLQlzcC0+cHNjX3NtYm1zayA9IFBTQ19TTUJNU0tfQUxMTUFTSzsKLQlhdV9zeW5jKCk7CisJY2ZnIHw9IFBTQ19TTUJDRkdfU0VUX0RJVihQU0NfU01CQ0ZHX0RJVjgpOworCVdSKHByaXYsIFBTQ19TTUJDRkcsIGNmZyk7CisJV1IocHJpdiwgUFNDX1NNQk1TSywgUFNDX1NNQk1TS19BTExNQVNLKTsKIAogCS8qIFNldCB0aGUgcHJvdG9jb2wgdGltZXIgdmFsdWVzLiAgU2VlIFRhYmxlIDcxIGluIHRoZQogCSAqIEF1MTU1MCBEYXRhIEJvb2sgZm9yIHN0YW5kYXJkIHRpbWluZyB2YWx1ZXMuCiAJICovCi0Jc3AtPnBzY19zbWJ0bXIgPSBQU0NfU01CVE1SX1NFVF9USCgwKSB8IFBTQ19TTUJUTVJfU0VUX1BTKDE1KSB8IFwKKwlXUihwcml2LCBQU0NfU01CVE1SLCBQU0NfU01CVE1SX1NFVF9USCgwKSB8IFBTQ19TTUJUTVJfU0VUX1BTKDE1KSB8IFwKIAkJUFNDX1NNQlRNUl9TRVRfUFUoMTUpIHwgUFNDX1NNQlRNUl9TRVRfU0goMTUpIHwgXAogCQlQU0NfU01CVE1SX1NFVF9TVSgxNSkgfCBQU0NfU01CVE1SX1NFVF9DTCgxNSkgfCBcCi0JCVBTQ19TTUJUTVJfU0VUX0NIKDE1KTsKLQlhdV9zeW5jKCk7CisJCVBTQ19TTUJUTVJfU0VUX0NIKDE1KSk7CiAKLQlzcC0+cHNjX3NtYmNmZyB8PSBQU0NfU01CQ0ZHX0RFX0VOQUJMRTsKLQlkbyB7Ci0JCXN0YXQgPSBzcC0+cHNjX3NtYnN0YXQ7Ci0JCWF1X3N5bmMoKTsKLQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TTUJTVEFUX1NSKSA9PSAwKTsKKwljZmcgfD0gUFNDX1NNQkNGR19ERV9FTkFCTEU7CisJV1IocHJpdiwgUFNDX1NNQkNGRywgY2ZnKTsKKwl3aGlsZSAoKFJEKHByaXYsIFBTQ19TTUJTVEFUKSAmIFBTQ19TTUJTVEFUX1NSKSA9PSAwKQorCQljcHVfcmVsYXgoKTsKIAotCXNwLT5wc2NfY3RybCA9IFBTQ19DVFJMX1NVU1BFTkQ7Ci0JYXVfc3luYygpOworCVdSKHByaXYsIFBTQ19DVFJMLCBQU0NfQ1RSTF9TVVNQRU5EKTsKIH0KIAogc3RhdGljIHZvaWQgaTJjX2F1MTU1MF9kaXNhYmxlKHN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKnByaXYpCiB7Ci0Jdm9sYXRpbGUgcHNjX3NtYl90ICpzcCA9ICh2b2xhdGlsZSBwc2Nfc21iX3QgKilwcml2LT5wc2NfYmFzZTsKLQotCXNwLT5wc2Nfc21iY2ZnID0gMDsKLQlzcC0+cHNjX2N0cmwgPSBQU0NfQ1RSTF9ESVNBQkxFOwotCWF1X3N5bmMoKTsKKwlXUihwcml2LCBQU0NfU01CQ0ZHLCAwKTsKKwlXUihwcml2LCBQU0NfQ1RSTCwgUFNDX0NUUkxfRElTQUJMRSk7CiB9CiAKIC8qCkBAIC0zOTYsOSArMzM5LDEyIEBACiAJCWdvdG8gb3V0X21lbTsKIAl9CiAKLQlwcml2LT5wc2NfYmFzZSA9IENLU0VHMUFERFIoci0+c3RhcnQpOworCXByaXYtPnBzY19iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFwcml2LT5wc2NfYmFzZSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9tYXA7CisJfQogCXByaXYtPnhmZXJfdGltZW91dCA9IDIwMDsKLQlwcml2LT5hY2tfdGltZW91dCA9IDIwMDsKIAogCXByaXYtPmFkYXAubnIgPSBwZGV2LT5pZDsKIAlwcml2LT5hZGFwLmFsZ28gPSAmYXUxNTUwX2FsZ287CkBAIC00MDYsOCArMzUyLDcgQEAKIAlwcml2LT5hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXN0cmxjcHkocHJpdi0+YWRhcC5uYW1lLCAiQXUxeHh4IFBTQyBJMkMiLCBzaXplb2YocHJpdi0+YWRhcC5uYW1lKSk7CiAKLQkvKiBOb3csIHNldCB1cCB0aGUgUFNDIGZvciBTTUJ1cyBQSU8gbW9kZS4KLQkqLworCS8qIE5vdywgc2V0IHVwIHRoZSBQU0MgZm9yIFNNQnVzIFBJTyBtb2RlLiAqLwogCWkyY19hdTE1NTBfc2V0dXAocHJpdik7CiAKIAlyZXQgPSBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIoJnByaXYtPmFkYXApOwpAQCAtNDE3LDcgKzM2Miw4IEBACiAJfQogCiAJaTJjX2F1MTU1MF9kaXNhYmxlKHByaXYpOwotCisJaW91bm1hcChwcml2LT5wc2NfYmFzZSk7CitvdXRfbWFwOgogCXJlbGVhc2VfcmVzb3VyY2UocHJpdi0+aW9hcmVhKTsKIAlrZnJlZShwcml2LT5pb2FyZWEpOwogb3V0X21lbToKQEAgLTQyNiwxNCArMzcyLDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQKLWkyY19hdTE1NTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBpMmNfYXUxNTUwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBpMmNfYXUxNTUwX2RhdGEgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWkyY19kZWxfYWRhcHRlcigmcHJpdi0+YWRhcCk7CiAJaTJjX2F1MTU1MF9kaXNhYmxlKHByaXYpOworCWlvdW5tYXAocHJpdi0+cHNjX2Jhc2UpOwogCXJlbGVhc2VfcmVzb3VyY2UocHJpdi0+aW9hcmVhKTsKIAlrZnJlZShwcml2LT5pb2FyZWEpOwogCWtmcmVlKHByaXYpOwpAQCAtNDQxLDQ5ICszODcsNTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludAotaTJjX2F1MTU1MF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgaTJjX2F1MTU1MF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaTJjX2F1MTU1MF9kaXNhYmxlKHByaXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWkyY19hdTE1NTBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGkyY19hdTE1NTBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaTJjX2F1MTU1MF9kYXRhICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGkyY19hdTE1NTBfZGF0YSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaTJjX2F1MTU1MF9zZXR1cChwcml2KTsKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaTJjX2F1MTU1MF9wbW9wcyA9IHsKKwkuc3VzcGVuZAk9IGkyY19hdTE1NTBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGkyY19hdTE1NTBfcmVzdW1lLAorfTsKKworI2RlZmluZSBBVTFYUFNDX1NNQlVTX1BNT1BTICgmaTJjX2F1MTU1MF9wbW9wcykKKwogI2Vsc2UKLSNkZWZpbmUgaTJjX2F1MTU1MF9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgaTJjX2F1MTU1MF9yZXN1bWUJTlVMTAorI2RlZmluZSBBVTFYUFNDX1NNQlVTX1BNT1BTIE5VTEwKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4cHNjX3NtYnVzX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJhdTF4cHNjX3NtYnVzIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9IEFVMVhQU0NfU01CVVNfUE1PUFMsCiAJfSwKIAkucHJvYmUJCT0gaTJjX2F1MTU1MF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGkyY19hdTE1NTBfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IGkyY19hdTE1NTBfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGkyY19hdTE1NTBfcmVzdW1lLAogfTsKIAotc3RhdGljIGludCBfX2luaXQKLWkyY19hdTE1NTBfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaTJjX2F1MTU1MF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXUxeHBzY19zbWJ1c19kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWkyY19hdTE1NTBfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGkyY19hdTE1NTBfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdTF4cHNjX3NtYnVzX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKaW5kZXggY2JjOThhZS4uY2RiNTllNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwpAQCAtNjMxLDcgKzYzMSw3IEBACiAJc3RydWN0IGJmaW5fdHdpX2lmYWNlICppZmFjZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaW50IHJjID0gcmVxdWVzdF9pcnEoaWZhY2UtPmlycSwgYmZpbl90d2lfaW50ZXJydXB0X2VudHJ5LAotCQlJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLCBpZmFjZSk7CisJCTAsIHBkZXYtPm5hbWUsIGlmYWNlKTsKIAlpZiAocmMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IElSUSAlZCAhXG4iLCBpZmFjZS0+aXJxKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC03MDIsNyArNzAyLDcgQEAKIAl9CiAKIAlyYyA9IHJlcXVlc3RfaXJxKGlmYWNlLT5pcnEsIGJmaW5fdHdpX2ludGVycnVwdF9lbnRyeSwKLQkJSVJRRl9ESVNBQkxFRCwgcGRldi0+bmFtZSwgaWZhY2UpOworCQkwLCBwZGV2LT5uYW1lLCBpZmFjZSk7CiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBJUlEgJWQgIVxuIiwgaWZhY2UtPmlycSk7CiAJCXJjID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODc5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciBkcml2ZXIgKG1hc3RlciBvbmx5KS4KKyAqCisgKiBCYXNlZCBvbiB0aGUgVEkgREFWSU5DSSBJMkMgYWRhcHRlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFByb3ZpZ2VudCBMdGQuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJpMmMtZGVzaWdud2FyZS1jb3JlLmgiCisKKy8qCisgKiBSZWdpc3RlcnMgb2Zmc2V0CisgKi8KKyNkZWZpbmUgRFdfSUNfQ09OCQkweDAKKyNkZWZpbmUgRFdfSUNfVEFSCQkweDQKKyNkZWZpbmUgRFdfSUNfREFUQV9DTUQJCTB4MTAKKyNkZWZpbmUgRFdfSUNfU1NfU0NMX0hDTlQJMHgxNAorI2RlZmluZSBEV19JQ19TU19TQ0xfTENOVAkweDE4CisjZGVmaW5lIERXX0lDX0ZTX1NDTF9IQ05UCTB4MWMKKyNkZWZpbmUgRFdfSUNfRlNfU0NMX0xDTlQJMHgyMAorI2RlZmluZSBEV19JQ19JTlRSX1NUQVQJCTB4MmMKKyNkZWZpbmUgRFdfSUNfSU5UUl9NQVNLCQkweDMwCisjZGVmaW5lIERXX0lDX1JBV19JTlRSX1NUQVQJMHgzNAorI2RlZmluZSBEV19JQ19SWF9UTAkJMHgzOAorI2RlZmluZSBEV19JQ19UWF9UTAkJMHgzYworI2RlZmluZSBEV19JQ19DTFJfSU5UUgkJMHg0MAorI2RlZmluZSBEV19JQ19DTFJfUlhfVU5ERVIJMHg0NAorI2RlZmluZSBEV19JQ19DTFJfUlhfT1ZFUgkweDQ4CisjZGVmaW5lIERXX0lDX0NMUl9UWF9PVkVSCTB4NGMKKyNkZWZpbmUgRFdfSUNfQ0xSX1JEX1JFUQkweDUwCisjZGVmaW5lIERXX0lDX0NMUl9UWF9BQlJUCTB4NTQKKyNkZWZpbmUgRFdfSUNfQ0xSX1JYX0RPTkUJMHg1OAorI2RlZmluZSBEV19JQ19DTFJfQUNUSVZJVFkJMHg1YworI2RlZmluZSBEV19JQ19DTFJfU1RPUF9ERVQJMHg2MAorI2RlZmluZSBEV19JQ19DTFJfU1RBUlRfREVUCTB4NjQKKyNkZWZpbmUgRFdfSUNfQ0xSX0dFTl9DQUxMCTB4NjgKKyNkZWZpbmUgRFdfSUNfRU5BQkxFCQkweDZjCisjZGVmaW5lIERXX0lDX1NUQVRVUwkJMHg3MAorI2RlZmluZSBEV19JQ19UWEZMUgkJMHg3NAorI2RlZmluZSBEV19JQ19SWEZMUgkJMHg3OAorI2RlZmluZSBEV19JQ19UWF9BQlJUX1NPVVJDRQkweDgwCisjZGVmaW5lIERXX0lDX0NPTVBfUEFSQU1fMQkweGY0CisjZGVmaW5lIERXX0lDX0NPTVBfVFlQRQkJMHhmYworI2RlZmluZSBEV19JQ19DT01QX1RZUEVfVkFMVUUJMHg0NDU3MDE0MAorCisjZGVmaW5lIERXX0lDX0lOVFJfUlhfVU5ERVIJMHgwMDEKKyNkZWZpbmUgRFdfSUNfSU5UUl9SWF9PVkVSCTB4MDAyCisjZGVmaW5lIERXX0lDX0lOVFJfUlhfRlVMTAkweDAwNAorI2RlZmluZSBEV19JQ19JTlRSX1RYX09WRVIJMHgwMDgKKyNkZWZpbmUgRFdfSUNfSU5UUl9UWF9FTVBUWQkweDAxMAorI2RlZmluZSBEV19JQ19JTlRSX1JEX1JFUQkweDAyMAorI2RlZmluZSBEV19JQ19JTlRSX1RYX0FCUlQJMHgwNDAKKyNkZWZpbmUgRFdfSUNfSU5UUl9SWF9ET05FCTB4MDgwCisjZGVmaW5lIERXX0lDX0lOVFJfQUNUSVZJVFkJMHgxMDAKKyNkZWZpbmUgRFdfSUNfSU5UUl9TVE9QX0RFVAkweDIwMAorI2RlZmluZSBEV19JQ19JTlRSX1NUQVJUX0RFVAkweDQwMAorI2RlZmluZSBEV19JQ19JTlRSX0dFTl9DQUxMCTB4ODAwCisKKyNkZWZpbmUgRFdfSUNfSU5UUl9ERUZBVUxUX01BU0sJCShEV19JQ19JTlRSX1JYX0ZVTEwgfCBcCisJCQkJCSBEV19JQ19JTlRSX1RYX0VNUFRZIHwgXAorCQkJCQkgRFdfSUNfSU5UUl9UWF9BQlJUIHwgXAorCQkJCQkgRFdfSUNfSU5UUl9TVE9QX0RFVCkKKworI2RlZmluZSBEV19JQ19TVEFUVVNfQUNUSVZJVFkJMHgxCisKKyNkZWZpbmUgRFdfSUNfRVJSX1RYX0FCUlQJMHgxCisKKy8qCisgKiBzdGF0dXMgY29kZXMKKyAqLworI2RlZmluZSBTVEFUVVNfSURMRQkJCTB4MAorI2RlZmluZSBTVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1MJMHgxCisjZGVmaW5lIFNUQVRVU19SRUFEX0lOX1BST0dSRVNTCQkweDIKKworI2RlZmluZSBUSU1FT1VUCQkJMjAgLyogbXMgKi8KKworLyoKKyAqIGhhcmR3YXJlIGFib3J0IGNvZGVzIGZyb20gdGhlIERXX0lDX1RYX0FCUlRfU09VUkNFIHJlZ2lzdGVyCisgKgorICogb25seSBleHBlY3RlZCBhYm9ydCBjb2RlcyBhcmUgbGlzdGVkIGhlcmUKKyAqIHJlZmVyIHRvIHRoZSBkYXRhc2hlZXQgZm9yIHRoZSBmdWxsIGxpc3QKKyAqLworI2RlZmluZSBBQlJUXzdCX0FERFJfTk9BQ0sJMAorI2RlZmluZSBBQlJUXzEwQUREUjFfTk9BQ0sJMQorI2RlZmluZSBBQlJUXzEwQUREUjJfTk9BQ0sJMgorI2RlZmluZSBBQlJUX1RYREFUQV9OT0FDSwkzCisjZGVmaW5lIEFCUlRfR0NBTExfTk9BQ0sJNAorI2RlZmluZSBBQlJUX0dDQUxMX1JFQUQJCTUKKyNkZWZpbmUgQUJSVF9TQllURV9BQ0tERVQJNworI2RlZmluZSBBQlJUX1NCWVRFX05PUlNUUlQJOQorI2RlZmluZSBBQlJUXzEwQl9SRF9OT1JTVFJUCTEwCisjZGVmaW5lIEFCUlRfTUFTVEVSX0RJUwkJMTEKKyNkZWZpbmUgQVJCX0xPU1QJCTEyCisKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF83Ql9BRERSX05PQUNLCSgxVUwgPDwgQUJSVF83Ql9BRERSX05PQUNLKQorI2RlZmluZSBEV19JQ19UWF9BQlJUXzEwQUREUjFfTk9BQ0sJKDFVTCA8PCBBQlJUXzEwQUREUjFfTk9BQ0spCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBBRERSMl9OT0FDSwkoMVVMIDw8IEFCUlRfMTBBRERSMl9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9UWERBVEFfTk9BQ0sJKDFVTCA8PCBBQlJUX1RYREFUQV9OT0FDSykKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9HQ0FMTF9OT0FDSwkoMVVMIDw8IEFCUlRfR0NBTExfTk9BQ0spCisjZGVmaW5lIERXX0lDX1RYX0FCUlRfR0NBTExfUkVBRAkoMVVMIDw8IEFCUlRfR0NBTExfUkVBRCkKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9TQllURV9BQ0tERVQJKDFVTCA8PCBBQlJUX1NCWVRFX0FDS0RFVCkKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9TQllURV9OT1JTVFJUCSgxVUwgPDwgQUJSVF9TQllURV9OT1JTVFJUKQorI2RlZmluZSBEV19JQ19UWF9BQlJUXzEwQl9SRF9OT1JTVFJUCSgxVUwgPDwgQUJSVF8xMEJfUkRfTk9SU1RSVCkKKyNkZWZpbmUgRFdfSUNfVFhfQUJSVF9NQVNURVJfRElTCSgxVUwgPDwgQUJSVF9NQVNURVJfRElTKQorI2RlZmluZSBEV19JQ19UWF9BUkJfTE9TVAkJKDFVTCA8PCBBUkJfTE9TVCkKKworI2RlZmluZSBEV19JQ19UWF9BQlJUX05PQUNLCQkoRFdfSUNfVFhfQUJSVF83Ql9BRERSX05PQUNLIHwgXAorCQkJCQkgRFdfSUNfVFhfQUJSVF8xMEFERFIxX05PQUNLIHwgXAorCQkJCQkgRFdfSUNfVFhfQUJSVF8xMEFERFIyX05PQUNLIHwgXAorCQkJCQkgRFdfSUNfVFhfQUJSVF9UWERBVEFfTk9BQ0sgfCBcCisJCQkJCSBEV19JQ19UWF9BQlJUX0dDQUxMX05PQUNLKQorCitzdGF0aWMgY2hhciAqYWJvcnRfc291cmNlc1tdID0geworCVtBQlJUXzdCX0FERFJfTk9BQ0tdID0KKwkJInNsYXZlIGFkZHJlc3Mgbm90IGFja25vd2xlZGdlZCAoN2JpdCBtb2RlKSIsCisJW0FCUlRfMTBBRERSMV9OT0FDS10gPQorCQkiZmlyc3QgYWRkcmVzcyBieXRlIG5vdCBhY2tub3dsZWRnZWQgKDEwYml0IG1vZGUpIiwKKwlbQUJSVF8xMEFERFIyX05PQUNLXSA9CisJCSJzZWNvbmQgYWRkcmVzcyBieXRlIG5vdCBhY2tub3dsZWRnZWQgKDEwYml0IG1vZGUpIiwKKwlbQUJSVF9UWERBVEFfTk9BQ0tdID0KKwkJImRhdGEgbm90IGFja25vd2xlZGdlZCIsCisJW0FCUlRfR0NBTExfTk9BQ0tdID0KKwkJIm5vIGFja25vd2xlZGdlbWVudCBmb3IgYSBnZW5lcmFsIGNhbGwiLAorCVtBQlJUX0dDQUxMX1JFQURdID0KKwkJInJlYWQgYWZ0ZXIgZ2VuZXJhbCBjYWxsIiwKKwlbQUJSVF9TQllURV9BQ0tERVRdID0KKwkJInN0YXJ0IGJ5dGUgYWNrbm93bGVkZ2VkIiwKKwlbQUJSVF9TQllURV9OT1JTVFJUXSA9CisJCSJ0cnlpbmcgdG8gc2VuZCBzdGFydCBieXRlIHdoZW4gcmVzdGFydCBpcyBkaXNhYmxlZCIsCisJW0FCUlRfMTBCX1JEX05PUlNUUlRdID0KKwkJInRyeWluZyB0byByZWFkIHdoZW4gcmVzdGFydCBpcyBkaXNhYmxlZCAoMTBiaXQgbW9kZSkiLAorCVtBQlJUX01BU1RFUl9ESVNdID0KKwkJInRyeWluZyB0byB1c2UgZGlzYWJsZWQgYWRhcHRlciIsCisJW0FSQl9MT1NUXSA9CisJCSJsb3N0IGFyYml0cmF0aW9uIiwKK307CisKK3UzMiBkd19yZWFkbChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCBpbnQgb2Zmc2V0KQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGRldi0+YmFzZSArIG9mZnNldCk7CisKKwlpZiAoZGV2LT5zd2FiKQorCQlyZXR1cm4gc3dhYjMyKHZhbHVlKTsKKwllbHNlCisJCXJldHVybiB2YWx1ZTsKK30KKwordm9pZCBkd193cml0ZWwoc3RydWN0IGR3X2kyY19kZXYgKmRldiwgdTMyIGIsIGludCBvZmZzZXQpCit7CisJaWYgKGRldi0+c3dhYikKKwkJYiA9IHN3YWIzMihiKTsKKworCXdyaXRlbChiLCBkZXYtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdTMyCitpMmNfZHdfc2NsX2hjbnQodTMyIGljX2NsaywgdTMyIHRTWU1CT0wsIHUzMiB0ZiwgaW50IGNvbmQsIGludCBvZmZzZXQpCit7CisJLyoKKwkgKiBEZXNpZ25XYXJlIEkyQyBjb3JlIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHNvbGlkIHN0cmF0ZWd5IHRvIG1lZXQKKwkgKiB0aGUgdEhEO1NUQSB0aW1pbmcgc3BlYy4gIENvbmZpZ3VyaW5nIF9IQ05UIGJhc2VkIG9uIHRISUdIIHNwZWMKKwkgKiB3aWxsIHJlc3VsdCBpbiB2aW9sYXRpb24gb2YgdGhlIHRIRDtTVEEgc3BlYy4KKwkgKi8KKwlpZiAoY29uZCkKKwkJLyoKKwkJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKKwkJICoKKwkJICogICBJQ19bRlNdU19TQ0xfSENOVCArICgxKzQrMykgPj0gSUNfQ0xLICogdEhJR0gKKwkJICoKKwkJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgRFcgbWFudWFscywgYW5kIHJlcHJlc2VudHMgYW4gaWRlYWwKKwkJICogY29uZmlndXJhdGlvbi4gIFRoZSByZXN1bHRpbmcgSTJDIGJ1cyBzcGVlZCB3aWxsIGJlCisJCSAqIGZhc3RlciB0aGFuIGFueSBvZiB0aGUgb3RoZXJzLgorCQkgKgorCQkgKiBJZiB5b3VyIGhhcmR3YXJlIGlzIGZyZWUgZnJvbSB0SEQ7U1RBIGlzc3VlLCB0cnkgdGhpcyBvbmUuCisJCSAqLworCQlyZXR1cm4gKGljX2NsayAqIHRTWU1CT0wgKyA1MDAwKSAvIDEwMDAwIC0gOCArIG9mZnNldDsKKwllbHNlCisJCS8qCisJCSAqIENvbmRpdGlvbmFsIGV4cHJlc3Npb246CisJCSAqCisJCSAqICAgSUNfW0ZTXVNfU0NMX0hDTlQgKyAzID49IElDX0NMSyAqICh0SEQ7U1RBICsgdGYpCisJCSAqCisJCSAqIFRoaXMgaXMganVzdCBleHBlcmltZW50YWwgcnVsZTsgdGhlIHRIRDtTVEEgcGVyaW9kIHR1cm5lZAorCQkgKiBvdXQgdG8gYmUgcHJvcG9ydGluYWwgdG8gKF9IQ05UICsgMykuICBXaXRoIHRoaXMgc2V0dGluZywKKwkJICogd2UgY291bGQgbWVldCBib3RoIHRISUdIIGFuZCB0SEQ7U1RBIHRpbWluZyBzcGVjcy4KKwkJICoKKwkJICogSWYgdW5zdXJlLCB5b3UnZCBiZXR0ZXIgdG8gdGFrZSB0aGlzIGFsdGVybmF0aXZlLgorCQkgKgorCQkgKiBUaGUgcmVhc29uIHdoeSB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50ICJ0ZiIgaGVyZSwKKwkJICogaXMgdGhlIHNhbWUgYXMgZGVzY3JpYmVkIGluIGkyY19kd19zY2xfbGNudCgpLgorCQkgKi8KKwkJcmV0dXJuIChpY19jbGsgKiAodFNZTUJPTCArIHRmKSArIDUwMDApIC8gMTAwMDAgLSAzICsgb2Zmc2V0OworfQorCitzdGF0aWMgdTMyIGkyY19kd19zY2xfbGNudCh1MzIgaWNfY2xrLCB1MzIgdExPVywgdTMyIHRmLCBpbnQgb2Zmc2V0KQoreworCS8qCisJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKKwkgKgorCSAqICAgSUNfW0ZTXVNfU0NMX0xDTlQgKyAxID49IElDX0NMSyAqICh0TE9XICsgdGYpCisJICoKKwkgKiBEVyBJMkMgY29yZSBzdGFydHMgY291bnRpbmcgdGhlIFNDTCBDTlRzIGZvciB0aGUgTE9XIHBlcmlvZAorCSAqIG9mIHRoZSBTQ0wgY2xvY2sgKHRMT1cpIGFzIHNvb24gYXMgaXQgcHVsbHMgdGhlIFNDTCBsaW5lLgorCSAqIEluIG9yZGVyIHRvIG1lZXQgdGhlIHRMT1cgdGltaW5nIHNwZWMsIHdlIG5lZWQgdG8gdGFrZSBpbnRvCisJICogYWNjb3VudCB0aGUgZmFsbCB0aW1lIG9mIFNDTCBzaWduYWwgKHRmKS4gIERlZmF1bHQgdGYgdmFsdWUKKwkgKiBzaG91bGQgYmUgMC4zIHVzLCBmb3Igc2FmZXR5LgorCSAqLworCXJldHVybiAoKGljX2NsayAqICh0TE9XICsgdGYpICsgNTAwMCkgLyAxMDAwMCkgLSAxICsgb2Zmc2V0OworfQorCisvKioKKyAqIGkyY19kd19pbml0KCkgLSBpbml0aWFsaXplIHRoZSBkZXNpZ253YXJlIGkyYyBtYXN0ZXIgaGFyZHdhcmUKKyAqIEBkZXY6IGRldmljZSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9ucyBjb25maWd1cmVzIGFuZCBlbmFibGVzIHRoZSBJMkMgbWFzdGVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEkyQyBpbml0IGZ1bmN0aW9uLCBhbmQgaW4gY2FzZSBvZiB0aW1lb3V0IGF0CisgKiBydW4gdGltZS4KKyAqLworaW50IGkyY19kd19pbml0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJdTMyIGlucHV0X2Nsb2NrX2toejsKKwl1MzIgaGNudCwgbGNudDsKKwl1MzIgcmVnOworCisJaW5wdXRfY2xvY2tfa2h6ID0gZGV2LT5nZXRfY2xrX3JhdGVfa2h6KGRldik7CisKKwkvKiBDb25maWd1cmUgcmVnaXN0ZXIgZW5kaWFuZXNzIGFjY2VzcyAqLworCXJlZyA9IGR3X3JlYWRsKGRldiwgRFdfSUNfQ09NUF9UWVBFKTsKKwlpZiAocmVnID09IF9fX2NvbnN0YW50X3N3YWIzMihEV19JQ19DT01QX1RZUEVfVkFMVUUpKSB7CisJCWRldi0+c3dhYiA9IDE7CisJCXJlZyA9IERXX0lDX0NPTVBfVFlQRV9WQUxVRTsKKwl9CisKKwlpZiAocmVnICE9IERXX0lDX0NPTVBfVFlQRV9WQUxVRSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiVW5rbm93biBTeW5vcHN5cyBjb21wb25lbnQgdHlwZTogIgorCQkJIjB4JTA4eFxuIiwgcmVnKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLworCWR3X3dyaXRlbChkZXYsIDAsIERXX0lDX0VOQUJMRSk7CisKKwkvKiBzZXQgc3RhbmRhcmQgYW5kIGZhc3Qgc3BlZWQgZGV2aWRlcnMgZm9yIGhpZ2gvbG93IHBlcmlvZHMgKi8KKworCS8qIFN0YW5kYXJkLW1vZGUgKi8KKwloY250ID0gaTJjX2R3X3NjbF9oY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk0MCwJLyogdEhEO1NUQSA9IHRISUdIID0gNC4wIHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwLAkvKiAwOiBEVyBkZWZhdWx0LCAxOiBJZGVhbCAqLworCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KKwlsY250ID0gaTJjX2R3X3NjbF9sY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQk0NywJLyogdExPVyA9IDQuNyB1cyAqLworCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCWR3X3dyaXRlbChkZXYsIGhjbnQsIERXX0lDX1NTX1NDTF9IQ05UKTsKKwlkd193cml0ZWwoZGV2LCBsY250LCBEV19JQ19TU19TQ0xfTENOVCk7CisJZGV2X2RiZyhkZXYtPmRldiwgIlN0YW5kYXJkLW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOworCisJLyogRmFzdC1tb2RlICovCisJaGNudCA9IGkyY19kd19zY2xfaGNudChpbnB1dF9jbG9ja19raHosCisJCQkJNiwJLyogdEhEO1NUQSA9IHRISUdIID0gMC42IHVzICovCisJCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KKwkJCQkwLAkvKiAwOiBEVyBkZWZhdWx0LCAxOiBJZGVhbCAqLworCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KKwlsY250ID0gaTJjX2R3X3NjbF9sY250KGlucHV0X2Nsb2NrX2toeiwKKwkJCQkxMywJLyogdExPVyA9IDEuMyB1cyAqLworCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCisJCQkJMCk7CS8qIE5vIG9mZnNldCAqLworCWR3X3dyaXRlbChkZXYsIGhjbnQsIERXX0lDX0ZTX1NDTF9IQ05UKTsKKwlkd193cml0ZWwoZGV2LCBsY250LCBEV19JQ19GU19TQ0xfTENOVCk7CisJZGV2X2RiZyhkZXYtPmRldiwgIkZhc3QtbW9kZSBIQ05UOkxDTlQgPSAlZDolZFxuIiwgaGNudCwgbGNudCk7CisKKwkvKiBDb25maWd1cmUgVHgvUnggRklGTyB0aHJlc2hvbGQgbGV2ZWxzICovCisJZHdfd3JpdGVsKGRldiwgZGV2LT50eF9maWZvX2RlcHRoIC0gMSwgRFdfSUNfVFhfVEwpOworCWR3X3dyaXRlbChkZXYsIDAsIERXX0lDX1JYX1RMKTsKKworCS8qIGNvbmZpZ3VyZSB0aGUgaTJjIG1hc3RlciAqLworCWR3X3dyaXRlbChkZXYsIGRldi0+bWFzdGVyX2NmZyAsIERXX0lDX0NPTik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWl0aW5nIGZvciBidXMgbm90IGJ1c3kKKyAqLworc3RhdGljIGludCBpMmNfZHdfd2FpdF9idXNfbm90X2J1c3koc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwlpbnQgdGltZW91dCA9IFRJTUVPVVQ7CisKKwl3aGlsZSAoZHdfcmVhZGwoZGV2LCBEV19JQ19TVEFUVVMpICYgRFdfSUNfU1RBVFVTX0FDVElWSVRZKSB7CisJCWlmICh0aW1lb3V0IDw9IDApIHsKKwkJCWRldl93YXJuKGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBidXMgcmVhZHlcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJdGltZW91dC0tOworCQltZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19kd194ZmVyX2luaXQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX21zZyAqbXNncyA9IGRldi0+bXNnczsKKwl1MzIgaWNfY29uOworCisJLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLworCWR3X3dyaXRlbChkZXYsIDAsIERXX0lDX0VOQUJMRSk7CisKKwkvKiBzZXQgdGhlIHNsYXZlICh0YXJnZXQpIGFkZHJlc3MgKi8KKwlkd193cml0ZWwoZGV2LCBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYWRkciwgRFdfSUNfVEFSKTsKKworCS8qIGlmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIHRlbiBiaXQgYWRkcmVzcywgZW5hYmxlIDEwQklUQUREUiAqLworCWljX2NvbiA9IGR3X3JlYWRsKGRldiwgRFdfSUNfQ09OKTsKKwlpZiAobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmZsYWdzICYgSTJDX01fVEVOKQorCQlpY19jb24gfD0gRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVI7CisJZWxzZQorCQlpY19jb24gJj0gfkRXX0lDX0NPTl8xMEJJVEFERFJfTUFTVEVSOworCWR3X3dyaXRlbChkZXYsIGljX2NvbiwgRFdfSUNfQ09OKTsKKworCS8qIEVuYWJsZSB0aGUgYWRhcHRlciAqLworCWR3X3dyaXRlbChkZXYsIDEsIERXX0lDX0VOQUJMRSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCWR3X3dyaXRlbChkZXYsIERXX0lDX0lOVFJfREVGQVVMVF9NQVNLLCBEV19JQ19JTlRSX01BU0spOworfQorCisvKgorICogSW5pdGlhdGUgKGFuZCBjb250aW51ZSkgbG93IGxldmVsIG1hc3RlciByZWFkL3dyaXRlIHRyYW5zYWN0aW9uLgorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGkyY19kd19pc3IsIGFuZCBwdW1waW5nIGkyY19tc2cKKyAqIG1lc3NhZ2VzIGludG8gdGhlIHR4IGJ1ZmZlci4gIEV2ZW4gaWYgdGhlIHNpemUgb2YgaTJjX21zZyBkYXRhIGlzCisgKiBsb25nZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgdHggYnVmZmVyLCBpdCBoYW5kbGVzIGV2ZXJ5dGhpbmcuCisgKi8KK3ZvaWQKK2kyY19kd194ZmVyX21zZyhzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOworCXUzMiBpbnRyX21hc2s7CisJaW50IHR4X2xpbWl0LCByeF9saW1pdDsKKwl1MzIgYWRkciA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5hZGRyOworCXUzMiBidWZfbGVuID0gZGV2LT50eF9idWZfbGVuOworCXU4ICpidWYgPSBkZXYtPnR4X2J1ZjsKKworCWludHJfbWFzayA9IERXX0lDX0lOVFJfREVGQVVMVF9NQVNLOworCisJZm9yICg7IGRldi0+bXNnX3dyaXRlX2lkeCA8IGRldi0+bXNnc19udW07IGRldi0+bXNnX3dyaXRlX2lkeCsrKSB7CisJCS8qCisJCSAqIGlmIHRhcmdldCBhZGRyZXNzIGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvCisJCSAqIHJlcHJvZ3JhbSB0aGUgdGFyZ2V0IGFkZHJlc3MgaW4gdGhlIGkyYworCQkgKiBhZGFwdGVyIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHRyYW5zZmVyCisJCSAqLworCQlpZiAobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHIgIT0gYWRkcikgeworCQkJZGV2X2VycihkZXYtPmRldiwKKwkJCQkiJXM6IGludmFsaWQgdGFyZ2V0IGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKwkJCWRldi0+bXNnX2VyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0ubGVuID09IDApIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJIiVzOiBpbnZhbGlkIG1lc3NhZ2UgbGVuZ3RoXG4iLCBfX2Z1bmNfXyk7CisJCQlkZXYtPm1zZ19lcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShkZXYtPnN0YXR1cyAmIFNUQVRVU19XUklURV9JTl9QUk9HUkVTUykpIHsKKwkJCS8qIG5ldyBpMmNfbXNnICovCisJCQlidWYgPSBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYnVmOworCQkJYnVmX2xlbiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5sZW47CisJCX0KKworCQl0eF9saW1pdCA9IGRldi0+dHhfZmlmb19kZXB0aCAtIGR3X3JlYWRsKGRldiwgRFdfSUNfVFhGTFIpOworCQlyeF9saW1pdCA9IGRldi0+cnhfZmlmb19kZXB0aCAtIGR3X3JlYWRsKGRldiwgRFdfSUNfUlhGTFIpOworCisJCXdoaWxlIChidWZfbGVuID4gMCAmJiB0eF9saW1pdCA+IDAgJiYgcnhfbGltaXQgPiAwKSB7CisJCQlpZiAobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmZsYWdzICYgSTJDX01fUkQpIHsKKwkJCQlkd193cml0ZWwoZGV2LCAweDEwMCwgRFdfSUNfREFUQV9DTUQpOworCQkJCXJ4X2xpbWl0LS07CisJCQl9IGVsc2UKKwkJCQlkd193cml0ZWwoZGV2LCAqYnVmKyssIERXX0lDX0RBVEFfQ01EKTsKKwkJCXR4X2xpbWl0LS07IGJ1Zl9sZW4tLTsKKwkJfQorCisJCWRldi0+dHhfYnVmID0gYnVmOworCQlkZXYtPnR4X2J1Zl9sZW4gPSBidWZfbGVuOworCisJCWlmIChidWZfbGVuID4gMCkgeworCQkJLyogbW9yZSBieXRlcyB0byBiZSB3cml0dGVuICovCisJCQlkZXYtPnN0YXR1cyB8PSBTVEFUVVNfV1JJVEVfSU5fUFJPR1JFU1M7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlkZXYtPnN0YXR1cyAmPSB+U1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTOworCX0KKworCS8qCisJICogSWYgaTJjX21zZyBpbmRleCBzZWFyY2ggaXMgY29tcGxldGVkLCB3ZSBkb24ndCBuZWVkIFRYX0VNUFRZCisJICogaW50ZXJydXB0IGFueSBtb3JlLgorCSAqLworCWlmIChkZXYtPm1zZ193cml0ZV9pZHggPT0gZGV2LT5tc2dzX251bSkKKwkJaW50cl9tYXNrICY9IH5EV19JQ19JTlRSX1RYX0VNUFRZOworCisJaWYgKGRldi0+bXNnX2VycikKKwkJaW50cl9tYXNrID0gMDsKKworCWR3X3dyaXRlbChkZXYsIGludHJfbWFzaywgIERXX0lDX0lOVFJfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkCitpMmNfZHdfcmVhZChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOworCWludCByeF92YWxpZDsKKworCWZvciAoOyBkZXYtPm1zZ19yZWFkX2lkeCA8IGRldi0+bXNnc19udW07IGRldi0+bXNnX3JlYWRfaWR4KyspIHsKKwkJdTMyIGxlbjsKKwkJdTggKmJ1ZjsKKworCQlpZiAoIShtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5mbGFncyAmIEkyQ19NX1JEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKGRldi0+c3RhdHVzICYgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MpKSB7CisJCQlsZW4gPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5sZW47CisJCQlidWYgPSBtc2dzW2Rldi0+bXNnX3JlYWRfaWR4XS5idWY7CisJCX0gZWxzZSB7CisJCQlsZW4gPSBkZXYtPnJ4X2J1Zl9sZW47CisJCQlidWYgPSBkZXYtPnJ4X2J1ZjsKKwkJfQorCisJCXJ4X3ZhbGlkID0gZHdfcmVhZGwoZGV2LCBEV19JQ19SWEZMUik7CisKKwkJZm9yICg7IGxlbiA+IDAgJiYgcnhfdmFsaWQgPiAwOyBsZW4tLSwgcnhfdmFsaWQtLSkKKwkJCSpidWYrKyA9IGR3X3JlYWRsKGRldiwgRFdfSUNfREFUQV9DTUQpOworCisJCWlmIChsZW4gPiAwKSB7CisJCQlkZXYtPnN0YXR1cyB8PSBTVEFUVVNfUkVBRF9JTl9QUk9HUkVTUzsKKwkJCWRldi0+cnhfYnVmX2xlbiA9IGxlbjsKKwkJCWRldi0+cnhfYnVmID0gYnVmOworCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCWRldi0+c3RhdHVzICY9IH5TVEFUVVNfUkVBRF9JTl9QUk9HUkVTUzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaTJjX2R3X2hhbmRsZV90eF9hYm9ydChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgYWJvcnRfc291cmNlID0gZGV2LT5hYm9ydF9zb3VyY2U7CisJaW50IGk7CisKKwlpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQUJSVF9OT0FDSykgeworCQlmb3JfZWFjaF9zZXRfYml0KGksICZhYm9ydF9zb3VyY2UsIEFSUkFZX1NJWkUoYWJvcnRfc291cmNlcykpCisJCQlkZXZfZGJnKGRldi0+ZGV2LAorCQkJCSIlczogJXNcbiIsIF9fZnVuY19fLCBhYm9ydF9zb3VyY2VzW2ldKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJZm9yX2VhY2hfc2V0X2JpdChpLCAmYWJvcnRfc291cmNlLCBBUlJBWV9TSVpFKGFib3J0X3NvdXJjZXMpKQorCQlkZXZfZXJyKGRldi0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgYWJvcnRfc291cmNlc1tpXSk7CisKKwlpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQVJCX0xPU1QpCisJCXJldHVybiAtRUFHQUlOOworCWVsc2UgaWYgKGFib3J0X3NvdXJjZSAmIERXX0lDX1RYX0FCUlRfR0NBTExfUkVBRCkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIHdyb25nIG1zZ3NbXSBkYXRhICovCisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIFByZXBhcmUgY29udHJvbGxlciBmb3IgYSB0cmFuc2FjdGlvbiBhbmQgY2FsbCBpMmNfZHdfeGZlcl9tc2cKKyAqLworaW50CitpMmNfZHdfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhkZXYtPmRldiwgIiVzOiBtc2dzOiAlZFxuIiwgX19mdW5jX18sIG51bSk7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2LT5kZXYpOworCisJSU5JVF9DT01QTEVUSU9OKGRldi0+Y21kX2NvbXBsZXRlKTsKKwlkZXYtPm1zZ3MgPSBtc2dzOworCWRldi0+bXNnc19udW0gPSBudW07CisJZGV2LT5jbWRfZXJyID0gMDsKKwlkZXYtPm1zZ193cml0ZV9pZHggPSAwOworCWRldi0+bXNnX3JlYWRfaWR4ID0gMDsKKwlkZXYtPm1zZ19lcnIgPSAwOworCWRldi0+c3RhdHVzID0gU1RBVFVTX0lETEU7CisJZGV2LT5hYm9ydF9zb3VyY2UgPSAwOworCisJcmV0ID0gaTJjX2R3X3dhaXRfYnVzX25vdF9idXN5KGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCS8qIHN0YXJ0IHRoZSB0cmFuc2ZlcnMgKi8KKwlpMmNfZHdfeGZlcl9pbml0KGRldik7CisKKwkvKiB3YWl0IGZvciB0eCB0byBjb21wbGV0ZSAqLworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwgSFopOworCWlmIChyZXQgPT0gMCkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXRcbiIpOworCQlpMmNfZHdfaW5pdChkZXYpOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoZGV2LT5tc2dfZXJyKSB7CisJCXJldCA9IGRldi0+bXNnX2VycjsKKwkJZ290byBkb25lOworCX0KKworCS8qIG5vIGVycm9yICovCisJaWYgKGxpa2VseSghZGV2LT5jbWRfZXJyKSkgeworCQkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCisJCWR3X3dyaXRlbChkZXYsIDAsIERXX0lDX0VOQUJMRSk7CisJCXJldCA9IG51bTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFdlIGhhdmUgYW4gZXJyb3IgKi8KKwlpZiAoZGV2LT5jbWRfZXJyID09IERXX0lDX0VSUl9UWF9BQlJUKSB7CisJCXJldCA9IGkyY19kd19oYW5kbGVfdHhfYWJvcnQoZGV2KTsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSAtRUlPOworCitkb25lOgorCXBtX3J1bnRpbWVfcHV0KGRldi0+ZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCit1MzIgaTJjX2R3X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXJldHVybiBkZXYtPmZ1bmN0aW9uYWxpdHk7Cit9CisKK3N0YXRpYyB1MzIgaTJjX2R3X3JlYWRfY2xlYXJfaW50cmJpdHMoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwl1MzIgc3RhdDsKKworCS8qCisJICogVGhlIElDX0lOVFJfU1RBVCByZWdpc3RlciBqdXN0IGluZGljYXRlcyAiZW5hYmxlZCIgaW50ZXJydXB0cy4KKwkgKiBUaHMgdW5tYXNrZWQgcmF3IHZlcnNpb24gb2YgaW50ZXJydXB0IHN0YXR1cyBiaXRzIGFyZSBhdmFpbGFibGUKKwkgKiBpbiB0aGUgSUNfUkFXX0lOVFJfU1RBVCByZWdpc3Rlci4KKwkgKgorCSAqIFRoYXQgaXMsCisJICogICBzdGF0ID0gZHdfcmVhZGwoSUNfSU5UUl9TVEFUKTsKKwkgKiBlcXVhbHMgdG8sCisJICogICBzdGF0ID0gZHdfcmVhZGwoSUNfUkFXX0lOVFJfU1RBVCkgJiBkd19yZWFkbChJQ19JTlRSX01BU0spOworCSAqCisJICogVGhlIHJhdyB2ZXJzaW9uIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCSAqLworCXN0YXQgPSBkd19yZWFkbChkZXYsIERXX0lDX0lOVFJfU1RBVCk7CisKKwkvKgorCSAqIERvIG5vdCB1c2UgdGhlIElDX0NMUl9JTlRSIHJlZ2lzdGVyIHRvIGNsZWFyIGludGVycnVwdHMsIG9yCisJICogeW91J2xsIG1pc3Mgc29tZSBpbnRlcnJ1cHRzLCB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBwZXJpb2QgZnJvbQorCSAqIGR3X3JlYWRsKElDX0lOVFJfU1RBVCkgdG8gZHdfcmVhZGwoSUNfQ0xSX0lOVFIpLgorCSAqCisJICogSW5zdGVhZCwgdXNlIHRoZSBzZXBhcmF0ZWx5LXByZXBhcmVkIElDX0NMUl8qIHJlZ2lzdGVycy4KKwkgKi8KKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfVU5ERVIpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1JYX1VOREVSKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfT1ZFUikKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfUlhfT1ZFUik7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX09WRVIpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1RYX09WRVIpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SRF9SRVEpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1JEX1JFUSk7CisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0FCUlQpIHsKKwkJLyoKKwkJICogVGhlIElDX1RYX0FCUlRfU09VUkNFIHJlZ2lzdGVyIGlzIGNsZWFyZWQgd2hlbmV2ZXIKKwkJICogdGhlIElDX0NMUl9UWF9BQlJUIGlzIHJlYWQuICBQcmVzZXJ2ZSBpdCBiZWZvcmVoYW5kLgorCQkgKi8KKwkJZGV2LT5hYm9ydF9zb3VyY2UgPSBkd19yZWFkbChkZXYsIERXX0lDX1RYX0FCUlRfU09VUkNFKTsKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfVFhfQUJSVCk7CisJfQorCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9ET05FKQorCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9SWF9ET05FKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfQUNUSVZJVFkpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX0FDVElWSVRZKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfU1RPUF9ERVQpCisJCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX1NUT1BfREVUKTsKKwlpZiAoc3RhdCAmIERXX0lDX0lOVFJfU1RBUlRfREVUKQorCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9TVEFSVF9ERVQpOworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9HRU5fQ0FMTCkKKwkJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfR0VOX0NBTEwpOworCisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiBUaGlzIGdldHMgY2FsbGVkIHdoZW5ldmVyIGFuIEkyQyBpbnRlcnJ1cHQKKyAqIG9jY3Vycy4KKyAqLworaXJxcmV0dXJuX3QgaTJjX2R3X2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2ID0gZGV2X2lkOworCXUzMiBzdGF0LCBlbmFibGVkOworCisJZW5hYmxlZCA9IGR3X3JlYWRsKGRldiwgRFdfSUNfRU5BQkxFKTsKKwlzdGF0ID0gZHdfcmVhZGwoZGV2LCBEV19JQ19SQVdfSU5UUl9TVEFUKTsKKwlkZXZfZGJnKGRldi0+ZGV2LCAiJXM6ICAlcyBlbmFibGVkPSAweCV4IHN0YXQ9MHgleFxuIiwgX19mdW5jX18sCisJCWRldi0+YWRhcHRlci5uYW1lLCBlbmFibGVkLCBzdGF0KTsKKwlpZiAoIWVuYWJsZWQgfHwgIShzdGF0ICYgfkRXX0lDX0lOVFJfQUNUSVZJVFkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzdGF0ID0gaTJjX2R3X3JlYWRfY2xlYXJfaW50cmJpdHMoZGV2KTsKKworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9UWF9BQlJUKSB7CisJCWRldi0+Y21kX2VyciB8PSBEV19JQ19FUlJfVFhfQUJSVDsKKwkJZGV2LT5zdGF0dXMgPSBTVEFUVVNfSURMRTsKKworCQkvKgorCQkgKiBBbnl0aW1lIFRYX0FCUlQgaXMgc2V0LCB0aGUgY29udGVudHMgb2YgdGhlIHR4L3J4CisJCSAqIGJ1ZmZlcnMgYXJlIGZsdXNoZWQuICBNYWtlIHN1cmUgdG8gc2tpcCB0aGVtLgorCQkgKi8KKwkJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfSU5UUl9NQVNLKTsKKwkJZ290byB0eF9hYm9ydGVkOworCX0KKworCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9GVUxMKQorCQlpMmNfZHdfcmVhZChkZXYpOworCisJaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0VNUFRZKQorCQlpMmNfZHdfeGZlcl9tc2coZGV2KTsKKworCS8qCisJICogTm8gbmVlZCB0byBtb2RpZnkgb3IgZGlzYWJsZSB0aGUgaW50ZXJydXB0IG1hc2sgaGVyZS4KKwkgKiBpMmNfZHdfeGZlcl9tc2coKSB3aWxsIHRha2UgY2FyZSBvZiBpdCBhY2NvcmRpbmcgdG8KKwkgKiB0aGUgY3VycmVudCB0cmFuc21pdCBzdGF0dXMuCisJICovCisKK3R4X2Fib3J0ZWQ6CisJaWYgKChzdGF0ICYgKERXX0lDX0lOVFJfVFhfQUJSVCB8IERXX0lDX0lOVFJfU1RPUF9ERVQpKSB8fCBkZXYtPm1zZ19lcnIpCisJCWNvbXBsZXRlKCZkZXYtPmNtZF9jb21wbGV0ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgaTJjX2R3X2VuYWJsZShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworICAgICAgIC8qIEVuYWJsZSB0aGUgYWRhcHRlciAqLworCWR3X3dyaXRlbChkZXYsIDEsIERXX0lDX0VOQUJMRSk7Cit9CisKK3UzMiBpMmNfZHdfaXNfZW5hYmxlZChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXJldHVybiBkd19yZWFkbChkZXYsIERXX0lDX0VOQUJMRSk7Cit9CisKK3ZvaWQgaTJjX2R3X2Rpc2FibGUoc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwkvKiBEaXNhYmxlIGNvbnRyb2xsZXIgKi8KKwlkd193cml0ZWwoZGV2LCAwLCBEV19JQ19FTkFCTEUpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJ1cHRzICovCisJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfSU5UUl9NQVNLKTsKKwlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9JTlRSKTsKK30KKwordm9pZCBpMmNfZHdfY2xlYXJfaW50KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJZHdfcmVhZGwoZGV2LCBEV19JQ19DTFJfSU5UUik7Cit9CisKK3ZvaWQgaTJjX2R3X2Rpc2FibGVfaW50KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJZHdfd3JpdGVsKGRldiwgMCwgRFdfSUNfSU5UUl9NQVNLKTsKK30KKwordTMyIGkyY19kd19yZWFkX2NvbXBfcGFyYW0oc3RydWN0IGR3X2kyY19kZXYgKmRldikKK3sKKwlyZXR1cm4gZHdfcmVhZGwoZGV2LCBEV19JQ19DT01QX1BBUkFNXzEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkMWEyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIGRyaXZlciAobWFzdGVyIG9ubHkpLgorICoKKyAqIEJhc2VkIG9uIHRoZSBUSSBEQVZJTkNJIEkyQyBhZGFwdGVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUHJvdmlnZW50IEx0ZC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKworI2RlZmluZSBEV19JQ19DT05fTUFTVEVSCQkweDEKKyNkZWZpbmUgRFdfSUNfQ09OX1NQRUVEX1NURAkJMHgyCisjZGVmaW5lIERXX0lDX0NPTl9TUEVFRF9GQVNUCQkweDQKKyNkZWZpbmUgRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVIJMHgxMAorI2RlZmluZSBEV19JQ19DT05fUkVTVEFSVF9FTgkJMHgyMAorI2RlZmluZSBEV19JQ19DT05fU0xBVkVfRElTQUJMRQkJMHg0MAorCisKKy8qKgorICogc3RydWN0IGR3X2kyY19kZXYgLSBwcml2YXRlIGkyYy1kZXNpZ253YXJlIGRhdGEKKyAqIEBkZXY6IGRyaXZlciBtb2RlbCBkZXZpY2Ugbm9kZQorICogQGJhc2U6IElPIHJlZ2lzdGVycyBwb2ludGVyCisgKiBAY21kX2NvbXBsZXRlOiB0eCBjb21wbGV0aW9uIGluZGljYXRvcgorICogQGxvY2s6IHByb3RlY3QgdGhpcyBzdHJ1Y3QgYW5kIElPIHJlZ2lzdGVycworICogQGNsazogaW5wdXQgcmVmZXJlbmNlIGNsb2NrCisgKiBAY21kX2VycjogcnVuIHRpbWUgaGFkd2FyZSBlcnJvciBjb2RlCisgKiBAbXNnczogcG9pbnRzIHRvIGFuIGFycmF5IG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBiZWluZyB0cmFuc2ZlcmVkCisgKiBAbXNnc19udW06IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbXNncworICogQG1zZ193cml0ZV9pZHg6IHRoZSBlbGVtZW50IGluZGV4IG9mIHRoZSBjdXJyZW50IHR4IG1lc3NhZ2UgaW4gdGhlIG1zZ3MKKyAqCWFycmF5CisgKiBAdHhfYnVmX2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0eCBidWZmZXIKKyAqIEB0eF9idWY6IHRoZSBjdXJyZW50IHR4IGJ1ZmZlcgorICogQG1zZ19yZWFkX2lkeDogdGhlIGVsZW1lbnQgaW5kZXggb2YgdGhlIGN1cnJlbnQgcnggbWVzc2FnZSBpbiB0aGUgbXNncworICoJYXJyYXkKKyAqIEByeF9idWZfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHJ4IGJ1ZmZlcgorICogQHJ4X2J1ZjogdGhlIGN1cnJlbnQgcnggYnVmZmVyCisgKiBAbXNnX2VycjogZXJyb3Igc3RhdHVzIG9mIHRoZSBjdXJyZW50IHRyYW5zZmVyCisgKiBAc3RhdHVzOiBpMmMgbWFzdGVyIHN0YXR1cywgb25lIG9mIFNUQVRVU18qCisgKiBAYWJvcnRfc291cmNlOiBjb3B5IG9mIHRoZSBUWF9BQlJUX1NPVVJDRSByZWdpc3RlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIGkyYyBtYXN0ZXIKKyAqIEBhZGFwdGVyOiBpMmMgc3Vic3lzdGVtIGFkYXB0ZXIgbm9kZQorICogQHR4X2ZpZm9fZGVwdGg6IGRlcHRoIG9mIHRoZSBoYXJkd2FyZSB0eCBmaWZvCisgKiBAcnhfZmlmb19kZXB0aDogZGVwdGggb2YgdGhlIGhhcmR3YXJlIHJ4IGZpZm8KKyAqLworc3RydWN0IGR3X2kyY19kZXYgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCBjbGsJCSpjbGs7CisJdTMyCQkJKCpnZXRfY2xrX3JhdGVfa2h6KSAoc3RydWN0IGR3X2kyY19kZXYgKmRldik7CisJc3RydWN0IGR3X3BjaV9jb250cm9sbGVyICpjb250cm9sbGVyOworCWludAkJCWNtZF9lcnI7CisJc3RydWN0IGkyY19tc2cJCSptc2dzOworCWludAkJCW1zZ3NfbnVtOworCWludAkJCW1zZ193cml0ZV9pZHg7CisJdTMyCQkJdHhfYnVmX2xlbjsKKwl1OAkJCSp0eF9idWY7CisJaW50CQkJbXNnX3JlYWRfaWR4OworCXUzMgkJCXJ4X2J1Zl9sZW47CisJdTgJCQkqcnhfYnVmOworCWludAkJCW1zZ19lcnI7CisJdW5zaWduZWQgaW50CQlzdGF0dXM7CisJdTMyCQkJYWJvcnRfc291cmNlOworCWludAkJCWlycTsKKwlpbnQJCQlzd2FiOworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOworCXUzMgkJCWZ1bmN0aW9uYWxpdHk7CisJdTMyCQkJbWFzdGVyX2NmZzsKKwl1bnNpZ25lZCBpbnQJCXR4X2ZpZm9fZGVwdGg7CisJdW5zaWduZWQgaW50CQlyeF9maWZvX2RlcHRoOworfTsKKworZXh0ZXJuIHUzMiBkd19yZWFkbChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCBpbnQgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIGR3X3dyaXRlbChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCB1MzIgYiwgaW50IG9mZnNldCk7CitleHRlcm4gaW50IGkyY19kd19pbml0KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIGludCBpMmNfZHdfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwKKwkJaW50IG51bSk7CitleHRlcm4gdTMyIGkyY19kd19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CitleHRlcm4gaXJxcmV0dXJuX3QgaTJjX2R3X2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCk7CitleHRlcm4gdm9pZCBpMmNfZHdfZW5hYmxlKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIHUzMiBpMmNfZHdfaXNfZW5hYmxlZChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGkyY19kd19kaXNhYmxlKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgaTJjX2R3X2NsZWFyX2ludChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGkyY19kd19kaXNhYmxlX2ludChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKK2V4dGVybiB1MzIgaTJjX2R3X3JlYWRfY29tcF9wYXJhbShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wY2lkcnYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wY2lkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTg5ZTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBjaWRydi5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciBkcml2ZXIgKG1hc3RlciBvbmx5KS4KKyAqCisgKiBCYXNlZCBvbiB0aGUgVEkgREFWSU5DSSBJMkMgYWRhcHRlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFByb3ZpZ2VudCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSW50ZWwgY29ycG9yYXRpb24uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgImkyYy1kZXNpZ253YXJlLWNvcmUuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRSAiaTJjLWRlc2lnbndhcmUtcGNpIgorCitlbnVtIGR3X3BjaV9jdGxfaWRfdCB7CisJbW9vcmVzdG93bl8wLAorCW1vb3Jlc3Rvd25fMSwKKwltb29yZXN0b3duXzIsCisKKwltZWRmaWVsZF8wLAorCW1lZGZpZWxkXzEsCisJbWVkZmllbGRfMiwKKwltZWRmaWVsZF8zLAorCW1lZGZpZWxkXzQsCisJbWVkZmllbGRfNSwKK307CisKK3N0cnVjdCBkd19wY2lfY29udHJvbGxlciB7CisJdTMyIGJ1c19udW07CisJdTMyIGJ1c19jZmc7CisJdTMyIHR4X2ZpZm9fZGVwdGg7CisJdTMyIHJ4X2ZpZm9fZGVwdGg7CisJdTMyIGNsa19raHo7Cit9OworCisjZGVmaW5lIElOVEVMX01JRF9TVERfQ0ZHICAoRFdfSUNfQ09OX01BU1RFUiB8CQkJXAorCQkJCURXX0lDX0NPTl9TTEFWRV9ESVNBQkxFIHwJXAorCQkJCURXX0lDX0NPTl9SRVNUQVJUX0VOKQorCitzdGF0aWMgc3RydWN0ICBkd19wY2lfY29udHJvbGxlciAgZHdfcGNpX2NvbnRyb2xsZXJzW10gPSB7CisJW21vb3Jlc3Rvd25fMF0gPSB7CisJCS5idXNfbnVtICAgICA9IDAsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbW9vcmVzdG93bl8xXSA9IHsKKwkJLmJ1c19udW0gICAgID0gMSwKKwkJLmJ1c19jZmcgICA9IElOVEVMX01JRF9TVERfQ0ZHIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1QsCisJCS50eF9maWZvX2RlcHRoID0gMzIsCisJCS5yeF9maWZvX2RlcHRoID0gMzIsCisJCS5jbGtfa2h6ICAgICAgPSAyNTAwMCwKKwl9LAorCVttb29yZXN0b3duXzJdID0geworCQkuYnVzX251bSAgICAgPSAyLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfRkFTVCwKKwkJLnR4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLnJ4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLmNsa19raHogICAgICA9IDI1MDAwLAorCX0sCisJW21lZGZpZWxkXzBdID0geworCQkuYnVzX251bSAgICAgPSAwLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfRkFTVCwKKwkJLnR4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLnJ4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLmNsa19raHogICAgICA9IDI1MDAwLAorCX0sCisJW21lZGZpZWxkXzFdID0geworCQkuYnVzX251bSAgICAgPSAxLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfRkFTVCwKKwkJLnR4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLnJ4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLmNsa19raHogICAgICA9IDI1MDAwLAorCX0sCisJW21lZGZpZWxkXzJdID0geworCQkuYnVzX251bSAgICAgPSAyLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfRkFTVCwKKwkJLnR4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLnJ4X2ZpZm9fZGVwdGggPSAzMiwKKwkJLmNsa19raHogICAgICA9IDI1MDAwLAorCX0sCisJW21lZGZpZWxkXzNdID0geworCQkuYnVzX251bSAgICAgPSAzLAorCQkuYnVzX2NmZyAgID0gSU5URUxfTUlEX1NURF9DRkcgfCBEV19JQ19DT05fU1BFRURfU1RELAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfNF0gPSB7CisJCS5idXNfbnVtICAgICA9IDQsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKKwlbbWVkZmllbGRfNV0gPSB7CisJCS5idXNfbnVtICAgICA9IDUsCisJCS5idXNfY2ZnICAgPSBJTlRFTF9NSURfU1REX0NGRyB8IERXX0lDX0NPTl9TUEVFRF9GQVNULAorCQkudHhfZmlmb19kZXB0aCA9IDMyLAorCQkucnhfZmlmb19kZXB0aCA9IDMyLAorCQkuY2xrX2toeiAgICAgID0gMjUwMDAsCisJfSwKK307CitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX2R3X2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyCT0gaTJjX2R3X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBpMmNfZHdfZnVuYywKK307CisKK3N0YXRpYyBpbnQgaTJjX2R3X3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOworCXN0cnVjdCBkd19pMmNfZGV2ICppMmMgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IGVycjsKKworCisJaTJjX2R3X2Rpc2FibGUoaTJjKTsKKworCWVyciA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3NhdmVfc3RhdGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfc2V0X3Bvd2VyX3N0YXRlIGZhaWxlZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX2R3X3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJc3RydWN0IGR3X2kyY19kZXYgKmkyYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyOworCXUzMiBlbmFibGVkOworCisJZW5hYmxlZCA9IGkyY19kd19pc19lbmFibGVkKGkyYyk7CisJaWYgKGVuYWJsZWQpCisJCXJldHVybiAwOworCisJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3NldF9wb3dlcl9zdGF0ZSgpIGZhaWxlZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlpMmNfZHdfaW5pdChpMmMpOworCWkyY19kd19lbmFibGUoaTJjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMmNfZHdfcGNpX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IHBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCA1MDApOworCWRldl9kYmcoZGV2LCAicnVudGltZV9pZGxlIGNhbGxlZFxuIik7CisKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpMmNfZHdfcG1fb3BzID0geworCS5yZXN1bWUgICAgICAgICA9IGkyY19kd19wY2lfcmVzdW1lLAorCS5zdXNwZW5kICAgICAgICA9IGkyY19kd19wY2lfc3VzcGVuZCwKKwlTRVRfUlVOVElNRV9QTV9PUFMoaTJjX2R3X3BjaV9zdXNwZW5kLCBpMmNfZHdfcGNpX3Jlc3VtZSwKKwkJCSAgIGkyY19kd19wY2lfcnVudGltZV9pZGxlKQorfTsKKworc3RhdGljIHUzMiBpMmNfZHdfZ2V0X2Nsa19yYXRlX2toeihzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXJldHVybiBkZXYtPmNvbnRyb2xsZXItPmNsa19raHo7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGkyY19kd19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCitjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGR3X2kyY19kZXYgKmRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgbGVuOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgcjsKKwlzdHJ1Y3QgIGR3X3BjaV9jb250cm9sbGVyICpjb250cm9sbGVyOworCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA+PSBBUlJBWV9TSVpFKGR3X3BjaV9jb250cm9sbGVycykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkd19pMmNfcGNpX3Byb2JlOiBpbnZhbGlkIGRyaXZlciBkYXRhICVsZFxuIiwKKwkJCWlkLT5kcml2ZXJfZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbnRyb2xsZXIgPSAmZHdfcGNpX2NvbnRyb2xsZXJzW2lkLT5kcml2ZXJfZGF0YV07CisKKwlyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBJMkMgUENJIGRldmljZSAoJWQpXG4iLAorCQkJcik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIEkyQyBhcmVhICovCisJc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwlpZiAoIXN0YXJ0IHx8IGxlbiA9PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImJhc2UgYWRkcmVzcyBub3Qgc2V0XG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsIERSSVZFUl9OQU1FKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJMkMgcmVnaW9uICIKKwkJCSIweCVseC0weCVseFxuIiwgc3RhcnQsCisJCQkodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApKTsKKwkJZ290byBleGl0OworCX0KKworCWJhc2UgPSBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7CisJaWYgKCFiYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkvTyBtZW1vcnkgcmVtYXBwaW5nIGZhaWxlZFxuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkd19pMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCX0KKworCWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY29tcGxldGUpOworCW11dGV4X2luaXQoJmRldi0+bG9jayk7CisJZGV2LT5jbGsgPSBOVUxMOworCWRldi0+Y29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisJZGV2LT5nZXRfY2xrX3JhdGVfa2h6ID0gaTJjX2R3X2dldF9jbGtfcmF0ZV9raHo7CisJZGV2LT5iYXNlID0gYmFzZTsKKwlkZXYtPmRldiA9IGdldF9kZXZpY2UoJnBkZXYtPmRldik7CisJZGV2LT5mdW5jdGlvbmFsaXR5ID0KKwkJSTJDX0ZVTkNfSTJDIHwKKwkJSTJDX0ZVTkNfU01CVVNfQllURSB8CisJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8CisJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSzsKKwlkZXYtPm1hc3Rlcl9jZmcgPSAgY29udHJvbGxlci0+YnVzX2NmZzsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJZGV2LT50eF9maWZvX2RlcHRoID0gY29udHJvbGxlci0+dHhfZmlmb19kZXB0aDsKKwlkZXYtPnJ4X2ZpZm9fZGVwdGggPSBjb250cm9sbGVyLT5yeF9maWZvX2RlcHRoOworCXIgPSBpMmNfZHdfaW5pdChkZXYpOworCWlmIChyKQorCQlnb3RvIGVycl9pb3VubWFwOworCisJYWRhcCA9ICZkZXYtPmFkYXB0ZXI7CisJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBkZXYpOworCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJYWRhcC0+Y2xhc3MgPSAwOworCWFkYXAtPmFsZ28gPSAmaTJjX2R3X2FsZ287CisJYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJYWRhcC0+bnIgPSBjb250cm9sbGVyLT5idXNfbnVtOworCXNucHJpbnRmKGFkYXAtPm5hbWUsIHNpemVvZihhZGFwLT5uYW1lKSwgImkyYy1kZXNpZ253YXJlLXBjaS0lZCIsCisJCWFkYXAtPm5yKTsKKworCXIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGkyY19kd19pc3IsIElSUUZfU0hBUkVELCBhZGFwLT5uYW1lLCBkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgcmVxdWVzdGluZyBpcnEgJWlcbiIsIGRldi0+aXJxKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwlpMmNfZHdfZGlzYWJsZV9pbnQoZGV2KTsKKwlpMmNfZHdfY2xlYXJfaW50KGRldik7CisJciA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsdXJlIGFkZGluZyBhZGFwdGVyXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfYWxsb3coJnBkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKK2Vycl9pb3VubWFwOgorCWlvdW5tYXAoZGV2LT5iYXNlKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcHV0X2RldmljZSgmcGRldi0+ZGV2KTsKKwlrZnJlZShkZXYpOworZXJyX3JlbGVhc2VfcmVnaW9uOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK2V4aXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpMmNfZHdfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaTJjX2R3X2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX2ZvcmJpZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmcGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+YWRhcHRlcik7CisJcHV0X2RldmljZSgmcGRldi0+ZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWtmcmVlKGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworfQorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygiaTJjX2Rlc2lnbndhcmUtcGNpIik7CisKK0RFRklORV9QQ0lfREVWSUNFX1RBQkxFKGkyX2Rlc2lnbndhcmVfcGNpX2lkcykgPSB7CisJLyogTW9vcmVzdG93biAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgwMiksIG1vb3Jlc3Rvd25fMCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgwMyksIG1vb3Jlc3Rvd25fMSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgwNCksIG1vb3Jlc3Rvd25fMiB9LAorCS8qIE1lZGZpZWxkICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODE3KSwgbWVkZmllbGRfMyx9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgxOCksIG1lZGZpZWxkXzQgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA4MTkpLCBtZWRmaWVsZF81IH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODJDKSwgbWVkZmllbGRfMCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgyRCksIG1lZGZpZWxkXzEgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA4MkUpLCBtZWRmaWVsZF8yIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTJfZGVzaWdud2FyZV9wY2lfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGR3X2kyY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gaTJfZGVzaWdud2FyZV9wY2lfaWRzLAorCS5wcm9iZQkJPSBpMmNfZHdfcGNpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaTJjX2R3X3BjaV9yZW1vdmUpLAorCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLnBtICAgICA9ICZpMmNfZHdfcG1fb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkd19pMmNfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlyZXR1cm4gIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR3X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZHdfaTJjX2luaXRfZHJpdmVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IGR3X2kyY19leGl0X2RyaXZlcih2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHdfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkd19pMmNfZXhpdF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTeW5vcHN5cyBEZXNpZ25XYXJlIFBDSSBJMkMgYnVzIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzY1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciBkcml2ZXIgKG1hc3RlciBvbmx5KS4KKyAqCisgKiBCYXNlZCBvbiB0aGUgVEkgREFWSU5DSSBJMkMgYWRhcHRlciBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFByb3ZpZ2VudCBMdGQuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImkyYy1kZXNpZ253YXJlLWNvcmUuaCIKKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19kd19hbGdvID0geworCS5tYXN0ZXJfeGZlcgk9IGkyY19kd194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gaTJjX2R3X2Z1bmMsCit9Oworc3RhdGljIHUzMiBpMmNfZHdfZ2V0X2Nsa19yYXRlX2toeihzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoZGV2LT5jbGspLzEwMDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGR3X2kyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd19pMmNfZGV2ICpkZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOworCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaW9hcmVhOworCWludCBpcnEsIHI7CisKKwkvKiBOT1RFOiBkcml2ZXIgdXNlcyB0aGUgc3RhdGljIHJlZ2lzdGVyIG1hcHBpbmcgKi8KKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghbWVtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gaXJxOyAvKiAtRU5YSU8gKi8KKwl9CisKKwlpb2FyZWEgPSByZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pLAorCQkJcGRldi0+bmFtZSk7CisJaWYgKCFpb2FyZWEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSTJDIHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkd19pMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCX0KKworCWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY29tcGxldGUpOworCW11dGV4X2luaXQoJmRldi0+bG9jayk7CisJZGV2LT5kZXYgPSBnZXRfZGV2aWNlKCZwZGV2LT5kZXYpOworCWRldi0+aXJxID0gaXJxOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlkZXYtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJZGV2LT5nZXRfY2xrX3JhdGVfa2h6ID0gaTJjX2R3X2dldF9jbGtfcmF0ZV9raHo7CisKKwlpZiAoSVNfRVJSKGRldi0+Y2xrKSkgeworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCWNsa19lbmFibGUoZGV2LT5jbGspOworCisJZGV2LT5mdW5jdGlvbmFsaXR5ID0KKwkJSTJDX0ZVTkNfSTJDIHwKKwkJSTJDX0ZVTkNfMTBCSVRfQUREUiB8CisJCUkyQ19GVU5DX1NNQlVTX0JZVEUgfAorCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0s7CisJZGV2LT5tYXN0ZXJfY2ZnID0gIERXX0lDX0NPTl9NQVNURVIgfCBEV19JQ19DT05fU0xBVkVfRElTQUJMRSB8CisJCURXX0lDX0NPTl9SRVNUQVJUX0VOIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1Q7CisKKwlkZXYtPmJhc2UgPSBpb3JlbWFwKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJaWYgKGRldi0+YmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgbWFwcGluZyBpbyByZXNvdXJjZXNcbiIpOworCQlyID0gLUVCVVNZOworCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7CisJfQorCXsKKwkJdTMyIHBhcmFtMSA9IGkyY19kd19yZWFkX2NvbXBfcGFyYW0oZGV2KTsKKworCQlkZXYtPnR4X2ZpZm9fZGVwdGggPSAoKHBhcmFtMSA+PiAxNikgJiAweGZmKSArIDE7CisJCWRldi0+cnhfZmlmb19kZXB0aCA9ICgocGFyYW0xID4+IDgpICAmIDB4ZmYpICsgMTsKKwl9CisJciA9IGkyY19kd19pbml0KGRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX2lvdW5tYXA7CisKKwlpMmNfZHdfZGlzYWJsZV9pbnQoZGV2KTsKKwlyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGkyY19kd19pc3IsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCWFkYXAgPSAmZGV2LT5hZGFwdGVyOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgZGV2KTsKKwlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOworCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOworCXN0cmxjcHkoYWRhcC0+bmFtZSwgIlN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGFkYXB0ZXIiLAorCQkJc2l6ZW9mKGFkYXAtPm5hbWUpKTsKKwlhZGFwLT5hbGdvID0gJmkyY19kd19hbGdvOworCWFkYXAtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJYWRhcC0+bnIgPSBwZGV2LT5pZDsKKwlyID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOworCWlmIChyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgYWRkaW5nIGFkYXB0ZXJcbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChkZXYtPmJhc2UpOworZXJyX3VudXNlX2Nsb2NrczoKKwljbGtfZGlzYWJsZShkZXYtPmNsayk7CisJY2xrX3B1dChkZXYtPmNsayk7CisJZGV2LT5jbGsgPSBOVUxMOworZXJyX2ZyZWVfbWVtOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7CisJa2ZyZWUoZGV2KTsKK2Vycl9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkd19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaTJjX2RlbF9hZGFwdGVyKCZkZXYtPmFkYXB0ZXIpOworCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7CisKKwljbGtfZGlzYWJsZShkZXYtPmNsayk7CisJY2xrX3B1dChkZXYtPmNsayk7CisJZGV2LT5jbGsgPSBOVUxMOworCisJaTJjX2R3X2Rpc2FibGUoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlrZnJlZShkZXYpOworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlyZXR1cm4gMDsKK30KKworLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmkyY19kZXNpZ253YXJlIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X2kyY19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkd19pMmNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaTJjX2Rlc2lnbndhcmUiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHdfaTJjX2luaXRfZHJpdmVyKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHdfaTJjX2RyaXZlciwgZHdfaTJjX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGR3X2kyY19pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkd19pMmNfZXhpdF9kcml2ZXIodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHdfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkd19pMmNfZXhpdF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBidXMgYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MmI1MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NyArMCwwIEBACi0vKgotICogU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciBkcml2ZXIgKG1hc3RlciBvbmx5KS4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgVEkgREFWSU5DSSBJMkMgYWRhcHRlciBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRleGFzIEluc3RydW1lbnRzLgotICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA5IFByb3ZpZ2VudCBMdGQuCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKgotICogUmVnaXN0ZXJzIG9mZnNldAotICovCi0jZGVmaW5lIERXX0lDX0NPTgkJMHgwCi0jZGVmaW5lIERXX0lDX1RBUgkJMHg0Ci0jZGVmaW5lIERXX0lDX0RBVEFfQ01ECQkweDEwCi0jZGVmaW5lIERXX0lDX1NTX1NDTF9IQ05UCTB4MTQKLSNkZWZpbmUgRFdfSUNfU1NfU0NMX0xDTlQJMHgxOAotI2RlZmluZSBEV19JQ19GU19TQ0xfSENOVAkweDFjCi0jZGVmaW5lIERXX0lDX0ZTX1NDTF9MQ05UCTB4MjAKLSNkZWZpbmUgRFdfSUNfSU5UUl9TVEFUCQkweDJjCi0jZGVmaW5lIERXX0lDX0lOVFJfTUFTSwkJMHgzMAotI2RlZmluZSBEV19JQ19SQVdfSU5UUl9TVEFUCTB4MzQKLSNkZWZpbmUgRFdfSUNfUlhfVEwJCTB4MzgKLSNkZWZpbmUgRFdfSUNfVFhfVEwJCTB4M2MKLSNkZWZpbmUgRFdfSUNfQ0xSX0lOVFIJCTB4NDAKLSNkZWZpbmUgRFdfSUNfQ0xSX1JYX1VOREVSCTB4NDQKLSNkZWZpbmUgRFdfSUNfQ0xSX1JYX09WRVIJMHg0OAotI2RlZmluZSBEV19JQ19DTFJfVFhfT1ZFUgkweDRjCi0jZGVmaW5lIERXX0lDX0NMUl9SRF9SRVEJMHg1MAotI2RlZmluZSBEV19JQ19DTFJfVFhfQUJSVAkweDU0Ci0jZGVmaW5lIERXX0lDX0NMUl9SWF9ET05FCTB4NTgKLSNkZWZpbmUgRFdfSUNfQ0xSX0FDVElWSVRZCTB4NWMKLSNkZWZpbmUgRFdfSUNfQ0xSX1NUT1BfREVUCTB4NjAKLSNkZWZpbmUgRFdfSUNfQ0xSX1NUQVJUX0RFVAkweDY0Ci0jZGVmaW5lIERXX0lDX0NMUl9HRU5fQ0FMTAkweDY4Ci0jZGVmaW5lIERXX0lDX0VOQUJMRQkJMHg2YwotI2RlZmluZSBEV19JQ19TVEFUVVMJCTB4NzAKLSNkZWZpbmUgRFdfSUNfVFhGTFIJCTB4NzQKLSNkZWZpbmUgRFdfSUNfUlhGTFIJCTB4NzgKLSNkZWZpbmUgRFdfSUNfQ09NUF9QQVJBTV8xCTB4ZjQKLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF9TT1VSQ0UJMHg4MAotCi0jZGVmaW5lIERXX0lDX0NPTl9NQVNURVIJCTB4MQotI2RlZmluZSBEV19JQ19DT05fU1BFRURfU1RECQkweDIKLSNkZWZpbmUgRFdfSUNfQ09OX1NQRUVEX0ZBU1QJCTB4NAotI2RlZmluZSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUgkweDEwCi0jZGVmaW5lIERXX0lDX0NPTl9SRVNUQVJUX0VOCQkweDIwCi0jZGVmaW5lIERXX0lDX0NPTl9TTEFWRV9ESVNBQkxFCQkweDQwCi0KLSNkZWZpbmUgRFdfSUNfSU5UUl9SWF9VTkRFUgkweDAwMQotI2RlZmluZSBEV19JQ19JTlRSX1JYX09WRVIJMHgwMDIKLSNkZWZpbmUgRFdfSUNfSU5UUl9SWF9GVUxMCTB4MDA0Ci0jZGVmaW5lIERXX0lDX0lOVFJfVFhfT1ZFUgkweDAwOAotI2RlZmluZSBEV19JQ19JTlRSX1RYX0VNUFRZCTB4MDEwCi0jZGVmaW5lIERXX0lDX0lOVFJfUkRfUkVRCTB4MDIwCi0jZGVmaW5lIERXX0lDX0lOVFJfVFhfQUJSVAkweDA0MAotI2RlZmluZSBEV19JQ19JTlRSX1JYX0RPTkUJMHgwODAKLSNkZWZpbmUgRFdfSUNfSU5UUl9BQ1RJVklUWQkweDEwMAotI2RlZmluZSBEV19JQ19JTlRSX1NUT1BfREVUCTB4MjAwCi0jZGVmaW5lIERXX0lDX0lOVFJfU1RBUlRfREVUCTB4NDAwCi0jZGVmaW5lIERXX0lDX0lOVFJfR0VOX0NBTEwJMHg4MDAKLQotI2RlZmluZSBEV19JQ19JTlRSX0RFRkFVTFRfTUFTSwkJKERXX0lDX0lOVFJfUlhfRlVMTCB8IFwKLQkJCQkJIERXX0lDX0lOVFJfVFhfRU1QVFkgfCBcCi0JCQkJCSBEV19JQ19JTlRSX1RYX0FCUlQgfCBcCi0JCQkJCSBEV19JQ19JTlRSX1NUT1BfREVUKQotCi0jZGVmaW5lIERXX0lDX1NUQVRVU19BQ1RJVklUWQkweDEKLQotI2RlZmluZSBEV19JQ19FUlJfVFhfQUJSVAkweDEKLQotLyoKLSAqIHN0YXR1cyBjb2RlcwotICovCi0jZGVmaW5lIFNUQVRVU19JRExFCQkJMHgwCi0jZGVmaW5lIFNUQVRVU19XUklURV9JTl9QUk9HUkVTUwkweDEKLSNkZWZpbmUgU1RBVFVTX1JFQURfSU5fUFJPR1JFU1MJCTB4MgotCi0jZGVmaW5lIFRJTUVPVVQJCQkyMCAvKiBtcyAqLwotCi0vKgotICogaGFyZHdhcmUgYWJvcnQgY29kZXMgZnJvbSB0aGUgRFdfSUNfVFhfQUJSVF9TT1VSQ0UgcmVnaXN0ZXIKLSAqCi0gKiBvbmx5IGV4cGVjdGVkIGFib3J0IGNvZGVzIGFyZSBsaXN0ZWQgaGVyZQotICogcmVmZXIgdG8gdGhlIGRhdGFzaGVldCBmb3IgdGhlIGZ1bGwgbGlzdAotICovCi0jZGVmaW5lIEFCUlRfN0JfQUREUl9OT0FDSwkwCi0jZGVmaW5lIEFCUlRfMTBBRERSMV9OT0FDSwkxCi0jZGVmaW5lIEFCUlRfMTBBRERSMl9OT0FDSwkyCi0jZGVmaW5lIEFCUlRfVFhEQVRBX05PQUNLCTMKLSNkZWZpbmUgQUJSVF9HQ0FMTF9OT0FDSwk0Ci0jZGVmaW5lIEFCUlRfR0NBTExfUkVBRAkJNQotI2RlZmluZSBBQlJUX1NCWVRFX0FDS0RFVAk3Ci0jZGVmaW5lIEFCUlRfU0JZVEVfTk9SU1RSVAk5Ci0jZGVmaW5lIEFCUlRfMTBCX1JEX05PUlNUUlQJMTAKLSNkZWZpbmUgQUJSVF9NQVNURVJfRElTCQkxMQotI2RlZmluZSBBUkJfTE9TVAkJMTIKLQotI2RlZmluZSBEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sJKDFVTCA8PCBBQlJUXzdCX0FERFJfTk9BQ0spCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBBRERSMV9OT0FDSwkoMVVMIDw8IEFCUlRfMTBBRERSMV9OT0FDSykKLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF8xMEFERFIyX05PQUNLCSgxVUwgPDwgQUJSVF8xMEFERFIyX05PQUNLKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSwkoMVVMIDw8IEFCUlRfVFhEQVRBX05PQUNLKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX0dDQUxMX05PQUNLCSgxVUwgPDwgQUJSVF9HQ0FMTF9OT0FDSykKLSNkZWZpbmUgRFdfSUNfVFhfQUJSVF9HQ0FMTF9SRUFECSgxVUwgPDwgQUJSVF9HQ0FMTF9SRUFEKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX0FDS0RFVAkoMVVMIDw8IEFCUlRfU0JZVEVfQUNLREVUKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX1NCWVRFX05PUlNUUlQJKDFVTCA8PCBBQlJUX1NCWVRFX05PUlNUUlQpCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfMTBCX1JEX05PUlNUUlQJKDFVTCA8PCBBQlJUXzEwQl9SRF9OT1JTVFJUKQotI2RlZmluZSBEV19JQ19UWF9BQlJUX01BU1RFUl9ESVMJKDFVTCA8PCBBQlJUX01BU1RFUl9ESVMpCi0jZGVmaW5lIERXX0lDX1RYX0FSQl9MT1NUCQkoMVVMIDw8IEFSQl9MT1NUKQotCi0jZGVmaW5lIERXX0lDX1RYX0FCUlRfTk9BQ0sJCShEV19JQ19UWF9BQlJUXzdCX0FERFJfTk9BQ0sgfCBcCi0JCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjFfTk9BQ0sgfCBcCi0JCQkJCSBEV19JQ19UWF9BQlJUXzEwQUREUjJfTk9BQ0sgfCBcCi0JCQkJCSBEV19JQ19UWF9BQlJUX1RYREFUQV9OT0FDSyB8IFwKLQkJCQkJIERXX0lDX1RYX0FCUlRfR0NBTExfTk9BQ0spCi0KLXN0YXRpYyBjaGFyICphYm9ydF9zb3VyY2VzW10gPSB7Ci0JW0FCUlRfN0JfQUREUl9OT0FDS10gPQotCQkic2xhdmUgYWRkcmVzcyBub3QgYWNrbm93bGVkZ2VkICg3Yml0IG1vZGUpIiwKLQlbQUJSVF8xMEFERFIxX05PQUNLXSA9Ci0JCSJmaXJzdCBhZGRyZXNzIGJ5dGUgbm90IGFja25vd2xlZGdlZCAoMTBiaXQgbW9kZSkiLAotCVtBQlJUXzEwQUREUjJfTk9BQ0tdID0KLQkJInNlY29uZCBhZGRyZXNzIGJ5dGUgbm90IGFja25vd2xlZGdlZCAoMTBiaXQgbW9kZSkiLAotCVtBQlJUX1RYREFUQV9OT0FDS10gPQotCQkiZGF0YSBub3QgYWNrbm93bGVkZ2VkIiwKLQlbQUJSVF9HQ0FMTF9OT0FDS10gPQotCQkibm8gYWNrbm93bGVkZ2VtZW50IGZvciBhIGdlbmVyYWwgY2FsbCIsCi0JW0FCUlRfR0NBTExfUkVBRF0gPQotCQkicmVhZCBhZnRlciBnZW5lcmFsIGNhbGwiLAotCVtBQlJUX1NCWVRFX0FDS0RFVF0gPQotCQkic3RhcnQgYnl0ZSBhY2tub3dsZWRnZWQiLAotCVtBQlJUX1NCWVRFX05PUlNUUlRdID0KLQkJInRyeWluZyB0byBzZW5kIHN0YXJ0IGJ5dGUgd2hlbiByZXN0YXJ0IGlzIGRpc2FibGVkIiwKLQlbQUJSVF8xMEJfUkRfTk9SU1RSVF0gPQotCQkidHJ5aW5nIHRvIHJlYWQgd2hlbiByZXN0YXJ0IGlzIGRpc2FibGVkICgxMGJpdCBtb2RlKSIsCi0JW0FCUlRfTUFTVEVSX0RJU10gPQotCQkidHJ5aW5nIHRvIHVzZSBkaXNhYmxlZCBhZGFwdGVyIiwKLQlbQVJCX0xPU1RdID0KLQkJImxvc3QgYXJiaXRyYXRpb24iLAotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZHdfaTJjX2RldiAtIHByaXZhdGUgaTJjLWRlc2lnbndhcmUgZGF0YQotICogQGRldjogZHJpdmVyIG1vZGVsIGRldmljZSBub2RlCi0gKiBAYmFzZTogSU8gcmVnaXN0ZXJzIHBvaW50ZXIKLSAqIEBjbWRfY29tcGxldGU6IHR4IGNvbXBsZXRpb24gaW5kaWNhdG9yCi0gKiBAbG9jazogcHJvdGVjdCB0aGlzIHN0cnVjdCBhbmQgSU8gcmVnaXN0ZXJzCi0gKiBAY2xrOiBpbnB1dCByZWZlcmVuY2UgY2xvY2sKLSAqIEBjbWRfZXJyOiBydW4gdGltZSBoYWR3YXJlIGVycm9yIGNvZGUKLSAqIEBtc2dzOiBwb2ludHMgdG8gYW4gYXJyYXkgb2YgbWVzc2FnZXMgY3VycmVudGx5IGJlaW5nIHRyYW5zZmVycmVkCi0gKiBAbXNnc19udW06IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbXNncwotICogQG1zZ193cml0ZV9pZHg6IHRoZSBlbGVtZW50IGluZGV4IG9mIHRoZSBjdXJyZW50IHR4IG1lc3NhZ2UgaW4gdGhlIG1zZ3MKLSAqCWFycmF5Ci0gKiBAdHhfYnVmX2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0eCBidWZmZXIKLSAqIEB0eF9idWY6IHRoZSBjdXJyZW50IHR4IGJ1ZmZlcgotICogQG1zZ19yZWFkX2lkeDogdGhlIGVsZW1lbnQgaW5kZXggb2YgdGhlIGN1cnJlbnQgcnggbWVzc2FnZSBpbiB0aGUgbXNncwotICoJYXJyYXkKLSAqIEByeF9idWZfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHJ4IGJ1ZmZlcgotICogQHJ4X2J1ZjogdGhlIGN1cnJlbnQgcnggYnVmZmVyCi0gKiBAbXNnX2VycjogZXJyb3Igc3RhdHVzIG9mIHRoZSBjdXJyZW50IHRyYW5zZmVyCi0gKiBAc3RhdHVzOiBpMmMgbWFzdGVyIHN0YXR1cywgb25lIG9mIFNUQVRVU18qCi0gKiBAYWJvcnRfc291cmNlOiBjb3B5IG9mIHRoZSBUWF9BQlJUX1NPVVJDRSByZWdpc3RlcgotICogQGlycTogaW50ZXJydXB0IG51bWJlciBmb3IgdGhlIGkyYyBtYXN0ZXIKLSAqIEBhZGFwdGVyOiBpMmMgc3Vic3lzdGVtIGFkYXB0ZXIgbm9kZQotICogQHR4X2ZpZm9fZGVwdGg6IGRlcHRoIG9mIHRoZSBoYXJkd2FyZSB0eCBmaWZvCi0gKiBAcnhfZmlmb19kZXB0aDogZGVwdGggb2YgdGhlIGhhcmR3YXJlIHJ4IGZpZm8KLSAqLwotc3RydWN0IGR3X2kyY19kZXYgewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jdm9pZCBfX2lvbWVtCQkqYmFzZTsKLQlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7Ci0Jc3RydWN0IG11dGV4CQlsb2NrOwotCXN0cnVjdCBjbGsJCSpjbGs7Ci0JaW50CQkJY21kX2VycjsKLQlzdHJ1Y3QgaTJjX21zZwkJKm1zZ3M7Ci0JaW50CQkJbXNnc19udW07Ci0JaW50CQkJbXNnX3dyaXRlX2lkeDsKLQl1MzIJCQl0eF9idWZfbGVuOwotCXU4CQkJKnR4X2J1ZjsKLQlpbnQJCQltc2dfcmVhZF9pZHg7Ci0JdTMyCQkJcnhfYnVmX2xlbjsKLQl1OAkJCSpyeF9idWY7Ci0JaW50CQkJbXNnX2VycjsKLQl1bnNpZ25lZCBpbnQJCXN0YXR1czsKLQl1MzIJCQlhYm9ydF9zb3VyY2U7Ci0JaW50CQkJaXJxOwotCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOwotCXVuc2lnbmVkIGludAkJdHhfZmlmb19kZXB0aDsKLQl1bnNpZ25lZCBpbnQJCXJ4X2ZpZm9fZGVwdGg7Ci19OwotCi1zdGF0aWMgdTMyCi1pMmNfZHdfc2NsX2hjbnQodTMyIGljX2NsaywgdTMyIHRTWU1CT0wsIHUzMiB0ZiwgaW50IGNvbmQsIGludCBvZmZzZXQpCi17Ci0JLyoKLQkgKiBEZXNpZ25XYXJlIEkyQyBjb3JlIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHNvbGlkIHN0cmF0ZWd5IHRvIG1lZXQKLQkgKiB0aGUgdEhEO1NUQSB0aW1pbmcgc3BlYy4gIENvbmZpZ3VyaW5nIF9IQ05UIGJhc2VkIG9uIHRISUdIIHNwZWMKLQkgKiB3aWxsIHJlc3VsdCBpbiB2aW9sYXRpb24gb2YgdGhlIHRIRDtTVEEgc3BlYy4KLQkgKi8KLQlpZiAoY29uZCkKLQkJLyoKLQkJICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKLQkJICoKLQkJICogICBJQ19bRlNdU19TQ0xfSENOVCArICgxKzQrMykgPj0gSUNfQ0xLICogdEhJR0gKLQkJICoKLQkJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgRFcgbWFudWFscywgYW5kIHJlcHJlc2VudHMgYW4gaWRlYWwKLQkJICogY29uZmlndXJhdGlvbi4gIFRoZSByZXN1bHRpbmcgSTJDIGJ1cyBzcGVlZCB3aWxsIGJlCi0JCSAqIGZhc3RlciB0aGFuIGFueSBvZiB0aGUgb3RoZXJzLgotCQkgKgotCQkgKiBJZiB5b3VyIGhhcmR3YXJlIGlzIGZyZWUgZnJvbSB0SEQ7U1RBIGlzc3VlLCB0cnkgdGhpcyBvbmUuCi0JCSAqLwotCQlyZXR1cm4gKGljX2NsayAqIHRTWU1CT0wgKyA1MDAwKSAvIDEwMDAwIC0gOCArIG9mZnNldDsKLQllbHNlCi0JCS8qCi0JCSAqIENvbmRpdGlvbmFsIGV4cHJlc3Npb246Ci0JCSAqCi0JCSAqICAgSUNfW0ZTXVNfU0NMX0hDTlQgKyAzID49IElDX0NMSyAqICh0SEQ7U1RBICsgdGYpCi0JCSAqCi0JCSAqIFRoaXMgaXMganVzdCBleHBlcmltZW50YWwgcnVsZTsgdGhlIHRIRDtTVEEgcGVyaW9kIHR1cm5lZAotCQkgKiBvdXQgdG8gYmUgcHJvcG9ydGluYWwgdG8gKF9IQ05UICsgMykuICBXaXRoIHRoaXMgc2V0dGluZywKLQkJICogd2UgY291bGQgbWVldCBib3RoIHRISUdIIGFuZCB0SEQ7U1RBIHRpbWluZyBzcGVjcy4KLQkJICoKLQkJICogSWYgdW5zdXJlLCB5b3UnZCBiZXR0ZXIgdG8gdGFrZSB0aGlzIGFsdGVybmF0aXZlLgotCQkgKgotCQkgKiBUaGUgcmVhc29uIHdoeSB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50ICJ0ZiIgaGVyZSwKLQkJICogaXMgdGhlIHNhbWUgYXMgZGVzY3JpYmVkIGluIGkyY19kd19zY2xfbGNudCgpLgotCQkgKi8KLQkJcmV0dXJuIChpY19jbGsgKiAodFNZTUJPTCArIHRmKSArIDUwMDApIC8gMTAwMDAgLSAzICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgdTMyIGkyY19kd19zY2xfbGNudCh1MzIgaWNfY2xrLCB1MzIgdExPVywgdTMyIHRmLCBpbnQgb2Zmc2V0KQotewotCS8qCi0JICogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbjoKLQkgKgotCSAqICAgSUNfW0ZTXVNfU0NMX0xDTlQgKyAxID49IElDX0NMSyAqICh0TE9XICsgdGYpCi0JICoKLQkgKiBEVyBJMkMgY29yZSBzdGFydHMgY291bnRpbmcgdGhlIFNDTCBDTlRzIGZvciB0aGUgTE9XIHBlcmlvZAotCSAqIG9mIHRoZSBTQ0wgY2xvY2sgKHRMT1cpIGFzIHNvb24gYXMgaXQgcHVsbHMgdGhlIFNDTCBsaW5lLgotCSAqIEluIG9yZGVyIHRvIG1lZXQgdGhlIHRMT1cgdGltaW5nIHNwZWMsIHdlIG5lZWQgdG8gdGFrZSBpbnRvCi0JICogYWNjb3VudCB0aGUgZmFsbCB0aW1lIG9mIFNDTCBzaWduYWwgKHRmKS4gIERlZmF1bHQgdGYgdmFsdWUKLQkgKiBzaG91bGQgYmUgMC4zIHVzLCBmb3Igc2FmZXR5LgotCSAqLwotCXJldHVybiAoKGljX2NsayAqICh0TE9XICsgdGYpICsgNTAwMCkgLyAxMDAwMCkgLSAxICsgb2Zmc2V0OwotfQotCi0vKioKLSAqIGkyY19kd19pbml0KCkgLSBpbml0aWFsaXplIHRoZSBkZXNpZ253YXJlIGkyYyBtYXN0ZXIgaGFyZHdhcmUKLSAqIEBkZXY6IGRldmljZSBwcml2YXRlIGRhdGEKLSAqCi0gKiBUaGlzIGZ1bmN0aW9ucyBjb25maWd1cmVzIGFuZCBlbmFibGVzIHRoZSBJMkMgbWFzdGVyLgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIEkyQyBpbml0IGZ1bmN0aW9uLCBhbmQgaW4gY2FzZSBvZiB0aW1lb3V0IGF0Ci0gKiBydW4gdGltZS4KLSAqLwotc3RhdGljIHZvaWQgaTJjX2R3X2luaXQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKLXsKLQl1MzIgaW5wdXRfY2xvY2tfa2h6ID0gY2xrX2dldF9yYXRlKGRldi0+Y2xrKSAvIDEwMDA7Ci0JdTMyIGljX2NvbiwgaGNudCwgbGNudDsKLQotCS8qIERpc2FibGUgdGhlIGFkYXB0ZXIgKi8KLQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKLQotCS8qIHNldCBzdGFuZGFyZCBhbmQgZmFzdCBzcGVlZCBkZXZpZGVycyBmb3IgaGlnaC9sb3cgcGVyaW9kcyAqLwotCi0JLyogU3RhbmRhcmQtbW9kZSAqLwotCWhjbnQgPSBpMmNfZHdfc2NsX2hjbnQoaW5wdXRfY2xvY2tfa2h6LAotCQkJCTQwLAkvKiB0SEQ7U1RBID0gdEhJR0ggPSA0LjAgdXMgKi8KLQkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLwotCQkJCTAsCS8qIDA6IERXIGRlZmF1bHQsIDE6IElkZWFsICovCi0JCQkJMCk7CS8qIE5vIG9mZnNldCAqLwotCWxjbnQgPSBpMmNfZHdfc2NsX2xjbnQoaW5wdXRfY2xvY2tfa2h6LAotCQkJCTQ3LAkvKiB0TE9XID0gNC43IHVzICovCi0JCQkJMywJLyogdGYgPSAwLjMgdXMgKi8KLQkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCi0Jd3JpdGVsKGhjbnQsIGRldi0+YmFzZSArIERXX0lDX1NTX1NDTF9IQ05UKTsKLQl3cml0ZWwobGNudCwgZGV2LT5iYXNlICsgRFdfSUNfU1NfU0NMX0xDTlQpOwotCWRldl9kYmcoZGV2LT5kZXYsICJTdGFuZGFyZC1tb2RlIEhDTlQ6TENOVCA9ICVkOiVkXG4iLCBoY250LCBsY250KTsKLQotCS8qIEZhc3QtbW9kZSAqLwotCWhjbnQgPSBpMmNfZHdfc2NsX2hjbnQoaW5wdXRfY2xvY2tfa2h6LAotCQkJCTYsCS8qIHRIRDtTVEEgPSB0SElHSCA9IDAuNiB1cyAqLwotCQkJCTMsCS8qIHRmID0gMC4zIHVzICovCi0JCQkJMCwJLyogMDogRFcgZGVmYXVsdCwgMTogSWRlYWwgKi8KLQkJCQkwKTsJLyogTm8gb2Zmc2V0ICovCi0JbGNudCA9IGkyY19kd19zY2xfbGNudChpbnB1dF9jbG9ja19raHosCi0JCQkJMTMsCS8qIHRMT1cgPSAxLjMgdXMgKi8KLQkJCQkzLAkvKiB0ZiA9IDAuMyB1cyAqLwotCQkJCTApOwkvKiBObyBvZmZzZXQgKi8KLQl3cml0ZWwoaGNudCwgZGV2LT5iYXNlICsgRFdfSUNfRlNfU0NMX0hDTlQpOwotCXdyaXRlbChsY250LCBkZXYtPmJhc2UgKyBEV19JQ19GU19TQ0xfTENOVCk7Ci0JZGV2X2RiZyhkZXYtPmRldiwgIkZhc3QtbW9kZSBIQ05UOkxDTlQgPSAlZDolZFxuIiwgaGNudCwgbGNudCk7Ci0KLQkvKiBDb25maWd1cmUgVHgvUnggRklGTyB0aHJlc2hvbGQgbGV2ZWxzICovCi0Jd3JpdGVsKGRldi0+dHhfZmlmb19kZXB0aCAtIDEsIGRldi0+YmFzZSArIERXX0lDX1RYX1RMKTsKLQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfUlhfVEwpOwotCi0JLyogY29uZmlndXJlIHRoZSBpMmMgbWFzdGVyICovCi0JaWNfY29uID0gRFdfSUNfQ09OX01BU1RFUiB8IERXX0lDX0NPTl9TTEFWRV9ESVNBQkxFIHwKLQkJRFdfSUNfQ09OX1JFU1RBUlRfRU4gfCBEV19JQ19DT05fU1BFRURfRkFTVDsKLQl3cml0ZWwoaWNfY29uLCBkZXYtPmJhc2UgKyBEV19JQ19DT04pOwotfQotCi0vKgotICogV2FpdGluZyBmb3IgYnVzIG5vdCBidXN5Ci0gKi8KLXN0YXRpYyBpbnQgaTJjX2R3X3dhaXRfYnVzX25vdF9idXN5KHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCi17Ci0JaW50IHRpbWVvdXQgPSBUSU1FT1VUOwotCi0Jd2hpbGUgKHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1NUQVRVUykgJiBEV19JQ19TVEFUVVNfQUNUSVZJVFkpIHsKLQkJaWYgKHRpbWVvdXQgPD0gMCkgewotCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1cyByZWFkeVxuIik7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCQl0aW1lb3V0LS07Ci0JCW1kZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaTJjX2R3X3hmZXJfaW5pdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQotewotCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOwotCXUzMiBpY19jb247Ci0KLQkvKiBEaXNhYmxlIHRoZSBhZGFwdGVyICovCi0Jd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0VOQUJMRSk7Ci0KLQkvKiBzZXQgdGhlIHNsYXZlICh0YXJnZXQpIGFkZHJlc3MgKi8KLQl3cml0ZWwobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHIsIGRldi0+YmFzZSArIERXX0lDX1RBUik7Ci0KLQkvKiBpZiB0aGUgc2xhdmUgYWRkcmVzcyBpcyB0ZW4gYml0IGFkZHJlc3MsIGVuYWJsZSAxMEJJVEFERFIgKi8KLQlpY19jb24gPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DT04pOwotCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uZmxhZ3MgJiBJMkNfTV9URU4pCi0JCWljX2NvbiB8PSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKLQllbHNlCi0JCWljX2NvbiAmPSB+RFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVI7Ci0Jd3JpdGVsKGljX2NvbiwgZGV2LT5iYXNlICsgRFdfSUNfQ09OKTsKLQotCS8qIEVuYWJsZSB0aGUgYWRhcHRlciAqLwotCXdyaXRlbCgxLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgKi8KLQl3cml0ZWwoRFdfSUNfSU5UUl9ERUZBVUxUX01BU0ssIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7Ci19Ci0KLS8qCi0gKiBJbml0aWF0ZSAoYW5kIGNvbnRpbnVlKSBsb3cgbGV2ZWwgbWFzdGVyIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24uCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaTJjX2R3X2lzciwgYW5kIHB1bXBpbmcgaTJjX21zZwotICogbWVzc2FnZXMgaW50byB0aGUgdHggYnVmZmVyLiAgRXZlbiBpZiB0aGUgc2l6ZSBvZiBpMmNfbXNnIGRhdGEgaXMKLSAqIGxvbmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSB0eCBidWZmZXIsIGl0IGhhbmRsZXMgZXZlcnl0aGluZy4KLSAqLwotc3RhdGljIHZvaWQKLWkyY19kd194ZmVyX21zZyhzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQotewotCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOwotCXUzMiBpbnRyX21hc2s7Ci0JaW50IHR4X2xpbWl0LCByeF9saW1pdDsKLQl1MzIgYWRkciA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5hZGRyOwotCXUzMiBidWZfbGVuID0gZGV2LT50eF9idWZfbGVuOwotCXU4ICpidWYgPSBkZXYtPnR4X2J1ZjsKLQotCWludHJfbWFzayA9IERXX0lDX0lOVFJfREVGQVVMVF9NQVNLOwotCi0JZm9yICg7IGRldi0+bXNnX3dyaXRlX2lkeCA8IGRldi0+bXNnc19udW07IGRldi0+bXNnX3dyaXRlX2lkeCsrKSB7Ci0JCS8qCi0JCSAqIGlmIHRhcmdldCBhZGRyZXNzIGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvCi0JCSAqIHJlcHJvZ3JhbSB0aGUgdGFyZ2V0IGFkZHJlc3MgaW4gdGhlIGkyYwotCQkgKiBhZGFwdGVyIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHRyYW5zZmVyCi0JCSAqLwotCQlpZiAobXNnc1tkZXYtPm1zZ193cml0ZV9pZHhdLmFkZHIgIT0gYWRkcikgewotCQkJZGV2X2VycihkZXYtPmRldiwKLQkJCQkiJXM6IGludmFsaWQgdGFyZ2V0IGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJCWRldi0+bXNnX2VyciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0ubGVuID09IDApIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIG1lc3NhZ2UgbGVuZ3RoXG4iLCBfX2Z1bmNfXyk7Ci0JCQlkZXYtPm1zZ19lcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIShkZXYtPnN0YXR1cyAmIFNUQVRVU19XUklURV9JTl9QUk9HUkVTUykpIHsKLQkJCS8qIG5ldyBpMmNfbXNnICovCi0JCQlidWYgPSBtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uYnVmOwotCQkJYnVmX2xlbiA9IG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5sZW47Ci0JCX0KLQotCQl0eF9saW1pdCA9IGRldi0+dHhfZmlmb19kZXB0aCAtIHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1RYRkxSKTsKLQkJcnhfbGltaXQgPSBkZXYtPnJ4X2ZpZm9fZGVwdGggLSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19SWEZMUik7Ci0KLQkJd2hpbGUgKGJ1Zl9sZW4gPiAwICYmIHR4X2xpbWl0ID4gMCAmJiByeF9saW1pdCA+IDApIHsKLQkJCWlmIChtc2dzW2Rldi0+bXNnX3dyaXRlX2lkeF0uZmxhZ3MgJiBJMkNfTV9SRCkgewotCQkJCXdyaXRlbCgweDEwMCwgZGV2LT5iYXNlICsgRFdfSUNfREFUQV9DTUQpOwotCQkJCXJ4X2xpbWl0LS07Ci0JCQl9IGVsc2UKLQkJCQl3cml0ZWwoKmJ1ZisrLCBkZXYtPmJhc2UgKyBEV19JQ19EQVRBX0NNRCk7Ci0JCQl0eF9saW1pdC0tOyBidWZfbGVuLS07Ci0JCX0KLQotCQlkZXYtPnR4X2J1ZiA9IGJ1ZjsKLQkJZGV2LT50eF9idWZfbGVuID0gYnVmX2xlbjsKLQotCQlpZiAoYnVmX2xlbiA+IDApIHsKLQkJCS8qIG1vcmUgYnl0ZXMgdG8gYmUgd3JpdHRlbiAqLwotCQkJZGV2LT5zdGF0dXMgfD0gU1RBVFVTX1dSSVRFX0lOX1BST0dSRVNTOwotCQkJYnJlYWs7Ci0JCX0gZWxzZQotCQkJZGV2LT5zdGF0dXMgJj0gflNUQVRVU19XUklURV9JTl9QUk9HUkVTUzsKLQl9Ci0KLQkvKgotCSAqIElmIGkyY19tc2cgaW5kZXggc2VhcmNoIGlzIGNvbXBsZXRlZCwgd2UgZG9uJ3QgbmVlZCBUWF9FTVBUWQotCSAqIGludGVycnVwdCBhbnkgbW9yZS4KLQkgKi8KLQlpZiAoZGV2LT5tc2dfd3JpdGVfaWR4ID09IGRldi0+bXNnc19udW0pCi0JCWludHJfbWFzayAmPSB+RFdfSUNfSU5UUl9UWF9FTVBUWTsKLQotCWlmIChkZXYtPm1zZ19lcnIpCi0JCWludHJfbWFzayA9IDA7Ci0KLQl3cml0ZWwoaW50cl9tYXNrLCBkZXYtPmJhc2UgKyBEV19JQ19JTlRSX01BU0spOwotfQotCi1zdGF0aWMgdm9pZAotaTJjX2R3X3JlYWQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX21zZyAqbXNncyA9IGRldi0+bXNnczsKLQlpbnQgcnhfdmFsaWQ7Ci0KLQlmb3IgKDsgZGV2LT5tc2dfcmVhZF9pZHggPCBkZXYtPm1zZ3NfbnVtOyBkZXYtPm1zZ19yZWFkX2lkeCsrKSB7Ci0JCXUzMiBsZW47Ci0JCXU4ICpidWY7Ci0KLQkJaWYgKCEobXNnc1tkZXYtPm1zZ19yZWFkX2lkeF0uZmxhZ3MgJiBJMkNfTV9SRCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIShkZXYtPnN0YXR1cyAmIFNUQVRVU19SRUFEX0lOX1BST0dSRVNTKSkgewotCQkJbGVuID0gbXNnc1tkZXYtPm1zZ19yZWFkX2lkeF0ubGVuOwotCQkJYnVmID0gbXNnc1tkZXYtPm1zZ19yZWFkX2lkeF0uYnVmOwotCQl9IGVsc2UgewotCQkJbGVuID0gZGV2LT5yeF9idWZfbGVuOwotCQkJYnVmID0gZGV2LT5yeF9idWY7Ci0JCX0KLQotCQlyeF92YWxpZCA9IHJlYWRsKGRldi0+YmFzZSArIERXX0lDX1JYRkxSKTsKLQotCQlmb3IgKDsgbGVuID4gMCAmJiByeF92YWxpZCA+IDA7IGxlbi0tLCByeF92YWxpZC0tKQotCQkJKmJ1ZisrID0gcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfREFUQV9DTUQpOwotCi0JCWlmIChsZW4gPiAwKSB7Ci0JCQlkZXYtPnN0YXR1cyB8PSBTVEFUVVNfUkVBRF9JTl9QUk9HUkVTUzsKLQkJCWRldi0+cnhfYnVmX2xlbiA9IGxlbjsKLQkJCWRldi0+cnhfYnVmID0gYnVmOwotCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWRldi0+c3RhdHVzICY9IH5TVEFUVVNfUkVBRF9JTl9QUk9HUkVTUzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaTJjX2R3X2hhbmRsZV90eF9hYm9ydChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgYWJvcnRfc291cmNlID0gZGV2LT5hYm9ydF9zb3VyY2U7Ci0JaW50IGk7Ci0KLQlpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQUJSVF9OT0FDSykgewotCQlmb3JfZWFjaF9zZXRfYml0KGksICZhYm9ydF9zb3VyY2UsIEFSUkFZX1NJWkUoYWJvcnRfc291cmNlcykpCi0JCQlkZXZfZGJnKGRldi0+ZGV2LAotCQkJCSIlczogJXNcbiIsIF9fZnVuY19fLCBhYm9ydF9zb3VyY2VzW2ldKTsKLQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JfQotCi0JZm9yX2VhY2hfc2V0X2JpdChpLCAmYWJvcnRfc291cmNlLCBBUlJBWV9TSVpFKGFib3J0X3NvdXJjZXMpKQotCQlkZXZfZXJyKGRldi0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgYWJvcnRfc291cmNlc1tpXSk7Ci0KLQlpZiAoYWJvcnRfc291cmNlICYgRFdfSUNfVFhfQVJCX0xPU1QpCi0JCXJldHVybiAtRUFHQUlOOwotCWVsc2UgaWYgKGFib3J0X3NvdXJjZSAmIERXX0lDX1RYX0FCUlRfR0NBTExfUkVBRCkKLQkJcmV0dXJuIC1FSU5WQUw7IC8qIHdyb25nIG1zZ3NbXSBkYXRhICovCi0JZWxzZQotCQlyZXR1cm4gLUVJTzsKLX0KLQotLyoKLSAqIFByZXBhcmUgY29udHJvbGxlciBmb3IgYSB0cmFuc2FjdGlvbiBhbmQgY2FsbCBpMmNfZHdfeGZlcl9tc2cKLSAqLwotc3RhdGljIGludAotaTJjX2R3X3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCi17Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0JaW50IHJldDsKLQotCWRldl9kYmcoZGV2LT5kZXYsICIlczogbXNnczogJWRcbiIsIF9fZnVuY19fLCBudW0pOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQotCUlOSVRfQ09NUExFVElPTihkZXYtPmNtZF9jb21wbGV0ZSk7Ci0JZGV2LT5tc2dzID0gbXNnczsKLQlkZXYtPm1zZ3NfbnVtID0gbnVtOwotCWRldi0+Y21kX2VyciA9IDA7Ci0JZGV2LT5tc2dfd3JpdGVfaWR4ID0gMDsKLQlkZXYtPm1zZ19yZWFkX2lkeCA9IDA7Ci0JZGV2LT5tc2dfZXJyID0gMDsKLQlkZXYtPnN0YXR1cyA9IFNUQVRVU19JRExFOwotCWRldi0+YWJvcnRfc291cmNlID0gMDsKLQotCXJldCA9IGkyY19kd193YWl0X2J1c19ub3RfYnVzeShkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBzdGFydCB0aGUgdHJhbnNmZXJzICovCi0JaTJjX2R3X3hmZXJfaW5pdChkZXYpOwotCi0JLyogd2FpdCBmb3IgdHggdG8gY29tcGxldGUgKi8KLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmZGV2LT5jbWRfY29tcGxldGUsIEhaKTsKLQlpZiAocmV0ID09IDApIHsKLQkJZGV2X2VycihkZXYtPmRldiwgImNvbnRyb2xsZXIgdGltZWQgb3V0XG4iKTsKLQkJaTJjX2R3X2luaXQoZGV2KTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JaWYgKGRldi0+bXNnX2VycikgewotCQlyZXQgPSBkZXYtPm1zZ19lcnI7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBubyBlcnJvciAqLwotCWlmIChsaWtlbHkoIWRldi0+Y21kX2VycikpIHsKLQkJLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLwotCQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfRU5BQkxFKTsKLQkJcmV0ID0gbnVtOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogV2UgaGF2ZSBhbiBlcnJvciAqLwotCWlmIChkZXYtPmNtZF9lcnIgPT0gRFdfSUNfRVJSX1RYX0FCUlQpIHsKLQkJcmV0ID0gaTJjX2R3X2hhbmRsZV90eF9hYm9ydChkZXYpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IC1FSU87Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHUzMiBpMmNfZHdfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuCUkyQ19GVU5DX0kyQyB8Ci0JCUkyQ19GVU5DXzEwQklUX0FERFIgfAotCQlJMkNfRlVOQ19TTUJVU19CWVRFIHwKLQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKLQkJSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKLQkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLOwotfQotCi1zdGF0aWMgdTMyIGkyY19kd19yZWFkX2NsZWFyX2ludHJiaXRzKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCi17Ci0JdTMyIHN0YXQ7Ci0KLQkvKgotCSAqIFRoZSBJQ19JTlRSX1NUQVQgcmVnaXN0ZXIganVzdCBpbmRpY2F0ZXMgImVuYWJsZWQiIGludGVycnVwdHMuCi0JICogVGhzIHVubWFza2VkIHJhdyB2ZXJzaW9uIG9mIGludGVycnVwdCBzdGF0dXMgYml0cyBhcmUgYXZhaWxhYmxlCi0JICogaW4gdGhlIElDX1JBV19JTlRSX1NUQVQgcmVnaXN0ZXIuCi0JICoKLQkgKiBUaGF0IGlzLAotCSAqICAgc3RhdCA9IHJlYWRsKElDX0lOVFJfU1RBVCk7Ci0JICogZXF1YWxzIHRvLAotCSAqICAgc3RhdCA9IHJlYWRsKElDX1JBV19JTlRSX1NUQVQpICYgcmVhZGwoSUNfSU5UUl9NQVNLKTsKLQkgKgotCSAqIFRoZSByYXcgdmVyc2lvbiBtaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLQkgKi8KLQlzdGF0ID0gcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9TVEFUKTsKLQotCS8qCi0JICogRG8gbm90IHVzZSB0aGUgSUNfQ0xSX0lOVFIgcmVnaXN0ZXIgdG8gY2xlYXIgaW50ZXJydXB0cywgb3IKLQkgKiB5b3UnbGwgbWlzcyBzb21lIGludGVycnVwdHMsIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHBlcmlvZCBmcm9tCi0JICogcmVhZGwoSUNfSU5UUl9TVEFUKSB0byByZWFkbChJQ19DTFJfSU5UUikuCi0JICoKLQkgKiBJbnN0ZWFkLCB1c2UgdGhlIHNlcGFyYXRlbHktcHJlcGFyZWQgSUNfQ0xSXyogcmVnaXN0ZXJzLgotCSAqLwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9VTkRFUikKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1JYX1VOREVSKTsKLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfUlhfT1ZFUikKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1JYX09WRVIpOwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9UWF9PVkVSKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfVFhfT1ZFUik7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JEX1JFUSkKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX1JEX1JFUSk7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0FCUlQpIHsKLQkJLyoKLQkJICogVGhlIElDX1RYX0FCUlRfU09VUkNFIHJlZ2lzdGVyIGlzIGNsZWFyZWQgd2hlbmV2ZXIKLQkJICogdGhlIElDX0NMUl9UWF9BQlJUIGlzIHJlYWQuICBQcmVzZXJ2ZSBpdCBiZWZvcmVoYW5kLgotCQkgKi8KLQkJZGV2LT5hYm9ydF9zb3VyY2UgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19UWF9BQlJUX1NPVVJDRSk7Ci0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9UWF9BQlJUKTsKLQl9Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1JYX0RPTkUpCi0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9SWF9ET05FKTsKLQlpZiAoc3RhdCAmIERXX0lDX0lOVFJfQUNUSVZJVFkpCi0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9BQ1RJVklUWSk7Ci0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1NUT1BfREVUKQotCQlyZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DTFJfU1RPUF9ERVQpOwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9TVEFSVF9ERVQpCi0JCXJlYWRsKGRldi0+YmFzZSArIERXX0lDX0NMUl9TVEFSVF9ERVQpOwotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9HRU5fQ0FMTCkKLQkJcmVhZGwoZGV2LT5iYXNlICsgRFdfSUNfQ0xSX0dFTl9DQUxMKTsKLQotCXJldHVybiBzdGF0OwotfQotCi0vKgotICogSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gVGhpcyBnZXRzIGNhbGxlZCB3aGVuZXZlciBhbiBJMkMgaW50ZXJydXB0Ci0gKiBvY2N1cnMuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBpMmNfZHdfaXNyKGludCB0aGlzX2lycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBkZXZfaWQ7Ci0JdTMyIHN0YXQ7Ci0KLQlzdGF0ID0gaTJjX2R3X3JlYWRfY2xlYXJfaW50cmJpdHMoZGV2KTsKLQlkZXZfZGJnKGRldi0+ZGV2LCAiJXM6IHN0YXQ9MHgleFxuIiwgX19mdW5jX18sIHN0YXQpOwotCi0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0FCUlQpIHsKLQkJZGV2LT5jbWRfZXJyIHw9IERXX0lDX0VSUl9UWF9BQlJUOwotCQlkZXYtPnN0YXR1cyA9IFNUQVRVU19JRExFOwotCi0JCS8qCi0JCSAqIEFueXRpbWUgVFhfQUJSVCBpcyBzZXQsIHRoZSBjb250ZW50cyBvZiB0aGUgdHgvcngKLQkJICogYnVmZmVycyBhcmUgZmx1c2hlZC4gIE1ha2Ugc3VyZSB0byBza2lwIHRoZW0uCi0JCSAqLwotCQl3cml0ZWwoMCwgZGV2LT5iYXNlICsgRFdfSUNfSU5UUl9NQVNLKTsKLQkJZ290byB0eF9hYm9ydGVkOwotCX0KLQotCWlmIChzdGF0ICYgRFdfSUNfSU5UUl9SWF9GVUxMKQotCQlpMmNfZHdfcmVhZChkZXYpOwotCi0JaWYgKHN0YXQgJiBEV19JQ19JTlRSX1RYX0VNUFRZKQotCQlpMmNfZHdfeGZlcl9tc2coZGV2KTsKLQotCS8qCi0JICogTm8gbmVlZCB0byBtb2RpZnkgb3IgZGlzYWJsZSB0aGUgaW50ZXJydXB0IG1hc2sgaGVyZS4KLQkgKiBpMmNfZHdfeGZlcl9tc2coKSB3aWxsIHRha2UgY2FyZSBvZiBpdCBhY2NvcmRpbmcgdG8KLQkgKiB0aGUgY3VycmVudCB0cmFuc21pdCBzdGF0dXMuCi0JICovCi0KLXR4X2Fib3J0ZWQ6Ci0JaWYgKChzdGF0ICYgKERXX0lDX0lOVFJfVFhfQUJSVCB8IERXX0lDX0lOVFJfU1RPUF9ERVQpKSB8fCBkZXYtPm1zZ19lcnIpCi0JCWNvbXBsZXRlKCZkZXYtPmNtZF9jb21wbGV0ZSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfZHdfYWxnbyA9IHsKLQkubWFzdGVyX3hmZXIJPSBpMmNfZHdfeGZlciwKLQkuZnVuY3Rpb25hbGl0eQk9IGkyY19kd19mdW5jLAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgZHdfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGR3X2kyY19kZXYgKmRldjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7Ci0Jc3RydWN0IHJlc291cmNlICptZW0sICppb2FyZWE7Ci0JaW50IGlycSwgcjsKLQotCS8qIE5PVEU6IGRyaXZlciB1c2VzIHRoZSBzdGF0aWMgcmVnaXN0ZXIgbWFwcGluZyAqLwotCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFtZW0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gbWVtIHJlc291cmNlP1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIHJlc291cmNlP1xuIik7Ci0JCXJldHVybiBpcnE7IC8qIC1FTlhJTyAqLwotCX0KLQotCWlvYXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCi0JCQlwZGV2LT5uYW1lKTsKLQlpZiAoIWlvYXJlYSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJMkMgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2kyY19kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldikgewotCQlyID0gLUVOT01FTTsKLQkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7Ci0JbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKLQlkZXYtPmRldiA9IGdldF9kZXZpY2UoJnBkZXYtPmRldik7Ci0JZGV2LT5pcnEgPSBpcnE7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQotCWRldi0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQlpZiAoSVNfRVJSKGRldi0+Y2xrKSkgewotCQlyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfZnJlZV9tZW07Ci0JfQotCWNsa19lbmFibGUoZGV2LT5jbGspOwotCi0JZGV2LT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwotCWlmIChkZXYtPmJhc2UgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsdXJlIG1hcHBpbmcgaW8gcmVzb3VyY2VzXG4iKTsKLQkJciA9IC1FQlVTWTsKLQkJZ290byBlcnJfdW51c2VfY2xvY2tzOwotCX0KLQl7Ci0JCXUzMiBwYXJhbTEgPSByZWFkbChkZXYtPmJhc2UgKyBEV19JQ19DT01QX1BBUkFNXzEpOwotCi0JCWRldi0+dHhfZmlmb19kZXB0aCA9ICgocGFyYW0xID4+IDE2KSAmIDB4ZmYpICsgMTsKLQkJZGV2LT5yeF9maWZvX2RlcHRoID0gKChwYXJhbTEgPj4gOCkgICYgMHhmZikgKyAxOwotCX0KLQlpMmNfZHdfaW5pdChkZXYpOwotCi0Jd3JpdGVsKDAsIGRldi0+YmFzZSArIERXX0lDX0lOVFJfTUFTSyk7IC8qIGRpc2FibGUgSVJRICovCi0JciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpMmNfZHdfaXNyLCBJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLCBkZXYpOwotCWlmIChyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgcmVxdWVzdGluZyBpcnEgJWlcbiIsIGRldi0+aXJxKTsKLQkJZ290byBlcnJfaW91bm1hcDsKLQl9Ci0KLQlhZGFwID0gJmRldi0+YWRhcHRlcjsKLQlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7Ci0JYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlhZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19IV01PTjsKLQlzdHJsY3B5KGFkYXAtPm5hbWUsICJTeW5vcHN5cyBEZXNpZ25XYXJlIEkyQyBhZGFwdGVyIiwKLQkJCXNpemVvZihhZGFwLT5uYW1lKSk7Ci0JYWRhcC0+YWxnbyA9ICZpMmNfZHdfYWxnbzsKLQlhZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKLQotCWFkYXAtPm5yID0gcGRldi0+aWQ7Ci0JciA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKLQlpZiAocikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsdXJlIGFkZGluZyBhZGFwdGVyXG4iKTsKLQkJZ290byBlcnJfZnJlZV9pcnE7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2lycToKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLWVycl9pb3VubWFwOgotCWlvdW5tYXAoZGV2LT5iYXNlKTsKLWVycl91bnVzZV9jbG9ja3M6Ci0JY2xrX2Rpc2FibGUoZGV2LT5jbGspOwotCWNsa19wdXQoZGV2LT5jbGspOwotCWRldi0+Y2xrID0gTlVMTDsKLWVycl9mcmVlX21lbToKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlwdXRfZGV2aWNlKCZwZGV2LT5kZXYpOwotCWtmcmVlKGRldik7Ci1lcnJfcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgZHdfaTJjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkd19pMmNfZGV2ICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWkyY19kZWxfYWRhcHRlcigmZGV2LT5hZGFwdGVyKTsKLQlwdXRfZGV2aWNlKCZwZGV2LT5kZXYpOwotCi0JY2xrX2Rpc2FibGUoZGV2LT5jbGspOwotCWNsa19wdXQoZGV2LT5jbGspOwotCWRldi0+Y2xrID0gTlVMTDsKLQotCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBEV19JQ19FTkFCTEUpOwotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWtmcmVlKGRldik7Ci0KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwotCXJldHVybiAwOwotfQotCi0vKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KLU1PRFVMRV9BTElBUygicGxhdGZvcm06aTJjX2Rlc2lnbndhcmUiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdfaTJjX2RyaXZlciA9IHsKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGR3X2kyY19yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJpMmNfZGVzaWdud2FyZSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkd19pMmNfaW5pdF9kcml2ZXIodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZkd19pMmNfZHJpdmVyLCBkd19pMmNfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoZHdfaTJjX2luaXRfZHJpdmVyKTsKLQotc3RhdGljIHZvaWQgX19leGl0IGR3X2kyY19leGl0X2RyaXZlcih2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkd19pMmNfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGR3X2kyY19leGl0X2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkJhcnVjaCBTaWFjaCA8YmFydWNoQHRrb3MuY28uaWw+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlN5bm9wc3lzIERlc2lnbldhcmUgSTJDIGJ1cyBhZGFwdGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKaW5kZXggY2UxYTMyYi4uOGNlYmVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwpAQCAtNjQsNiArNjQsNyBAQAogI2RlZmluZSBURU5fQklUX0FERFJfREVGQVVMVAkweEYwMDAKICNkZWZpbmUgVEVOX0JJVF9BRERSX01BU0sJMHhGMAogI2RlZmluZSBQQ0hfU1RBUlQJCTB4MDAyMAorI2RlZmluZSBQQ0hfUkVTVEFSVAkJMHgwMDA0CiAjZGVmaW5lIFBDSF9FU1JfU1RBUlQJCTB4MDAwMQogI2RlZmluZSBQQ0hfQlVGRl9TVEFSVAkJMHgxCiAjZGVmaW5lIFBDSF9SRVBTVEFSVAkJMHgwMDA0CkBAIC0yNzMsMjMgKzI3NCwyNCBAQAogCQkJCSAgICAgczMyIHRpbWVvdXQpCiB7CiAJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlrdGltZV90IG5zX3ZhbDsKKworCWlmICgoaW9yZWFkMzIocCArIFBDSF9JMkNTUikgJiBJMkNNQkJfQklUKSA9PSAwKQorCQlyZXR1cm4gMDsKIAogCS8qIE1BWCB0aW1lb3V0IHZhbHVlIGlzIHRpbWVvdXQqMTAwMCoxMDAwbnNlYyAqLwotCWt0aW1lX3QgbnNfdmFsID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCB0aW1lb3V0KjEwMDAqMTAwMCk7CisJbnNfdmFsID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCB0aW1lb3V0KjEwMDAqMTAwMCk7CiAJZG8gewotCQlpZiAoKGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpICYgSTJDTUJCX0JJVCkgPT0gMCkKLQkJCWJyZWFrOwogCQltc2xlZXAoMjApOworCQlpZiAoKGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpICYgSTJDTUJCX0JJVCkgPT0gMCkKKwkJCXJldHVybiAwOwogCX0gd2hpbGUgKGt0aW1lX2x0KGt0aW1lX2dldCgpLCBuc192YWwpKTsKIAogCXBjaF9kYmcoYWRhcCwgIkkyQ1NSID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpKTsKKwlwY2hfZXJyKGFkYXAsICIlczogVGltZW91dCBFcnJvci5yZXR1cm4lZFxuIiwgX19mdW5jX18sIC1FVElNRSk7CisJcGNoX2kyY19pbml0KGFkYXApOwogCi0JaWYgKHRpbWVvdXQgPT0gMCkgewotCQlwY2hfZXJyKGFkYXAsICIlczogVGltZW91dCBFcnJvci5yZXR1cm4lZFxuIiwgX19mdW5jX18sIC1FVElNRSk7Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FVElNRTsKIH0KIAogLyoqCkBAIC0zMTEsMjEgKzMxMywxOSBAQAogICovCiBzdGF0aWMgczMyIHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCiB7Ci0JczMyIHJldDsKKwlsb25nIHJldDsKIAlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocGNoX2V2ZW50LAogCQkJKGFkYXAtPnBjaF9ldmVudF9mbGFnICE9IDApLCBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcGNoX2VycihhZGFwLCAidGltZW91dDogJXhcbiIsIGFkYXAtPnBjaF9ldmVudF9mbGFnKTsKLQkJcmV0dXJuIHJldDsKLQl9CiAKIAlpZiAocmV0ID09IDApIHsKIAkJcGNoX2VycihhZGFwLCAidGltZW91dDogJXhcbiIsIGFkYXAtPnBjaF9ldmVudF9mbGFnKTsKKwkJYWRhcC0+cGNoX2V2ZW50X2ZsYWcgPSAwOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKIAlpZiAoYWRhcC0+cGNoX2V2ZW50X2ZsYWcgJiBJMkNfRVJST1JfTUFTSykgewogCQlwY2hfZXJyKGFkYXAsICJlcnJvciBiaXRzIHNldDogJXhcbiIsIGFkYXAtPnBjaF9ldmVudF9mbGFnKTsKKwkJYWRhcC0+cGNoX2V2ZW50X2ZsYWcgPSAwOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTM5NCw2ICszOTQsNyBAQAogCXUzMiBhZGRyXzJfbXNiOwogCXUzMiBhZGRyXzhfbHNiOwogCXMzMiB3cmNvdW50OworCXMzMiBydG47CiAJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKIAogCWxlbmd0aCA9IG1zZ3MtPmxlbjsKQEAgLTQxMiwxNSArNDEzLDI5IEBACiAJfQogCiAJaWYgKG1zZ3MtPmZsYWdzICYgSTJDX01fVEVOKSB7Ci0JCWFkZHJfMl9tc2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNyk7CisJCWFkZHJfMl9tc2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNykgJiAweDA2OwogCQlpb3dyaXRlMzIoYWRkcl8yX21zYiB8IFRFTl9CSVRfQUREUl9NQVNLLCBwICsgUENIX0kyQ0RSKTsKIAkJaWYgKGZpcnN0KQogCQkJcGNoX2kyY19zdGFydChhZGFwKTsKLQkJaWYgKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwICYmCi0JCSAgICBwY2hfaTJjX2dldGFjayhhZGFwKSA9PSAwKSB7CisKKwkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOworCQlpZiAocnRuID09IDApIHsKKwkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKKwkJCQkJInNldHRpbmdcbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQogCQkJYWRkcl84X2xzYiA9IChhZGRyICYgSTJDX0FERFJfTVNLKTsKIAkJCWlvd3JpdGUzMihhZGRyXzhfbHNiLCBwICsgUENIX0kyQ0RSKTsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAvKiBBcmJpdHJhdGlvbiBMb3N0ICovCisJCQlwY2hfZXJyKGFkYXAsICJMb3N0IEFyYml0cmF0aW9uXG4iKTsKKwkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAorCQkJCSAgIEkyQ01BTF9CSVQpOworCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUlGX0JJVCk7CisJCQlwY2hfaTJjX2luaXQoYWRhcCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCiAJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CiAJCQlyZXR1cm4gLUVUSU1FOwogCQl9CkBAIC00MzEsMzEgKzQ0Niw1MiBAQAogCQkJcGNoX2kyY19zdGFydChhZGFwKTsKIAl9CiAKLQlpZiAoKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwKSAmJgotCSAgICAocGNoX2kyY19nZXRhY2soYWRhcCkgPT0gMCkpIHsKLQkJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbmd0aDsgKyt3cmNvdW50KSB7Ci0JCQkvKiB3cml0ZSBidWZmZXIgdmFsdWUgdG8gSTJDIGRhdGEgcmVnaXN0ZXIgKi8KLQkJCWlvd3JpdGUzMihidWZbd3Jjb3VudF0sIHAgKyBQQ0hfSTJDRFIpOwotCQkJcGNoX2RiZyhhZGFwLCAid3JpdGluZyAleCB0byBEYXRhIHJlZ2lzdGVyXG4iLAotCQkJCWJ1Zlt3cmNvdW50XSk7Ci0KLQkJCWlmIChwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCkgIT0gMCkKLQkJCQlyZXR1cm4gLUVUSU1FOwotCi0JCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpCi0JCQkJcmV0dXJuIC1FSU87CisJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOworCWlmIChydG4gPT0gMCkgeworCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKKwkJCQkic2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQotCi0JCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSAqLwotCQlpZiAobGFzdCkKLQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKLQkJZWxzZQotCQkJcGNoX2kyY19yZXBzdGFydChhZGFwKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocnRuID09IC1FSU8pIHsgLyogQXJiaXRyYXRpb24gTG9zdCAqLworCQlwY2hfZXJyKGFkYXAsICJMb3N0IEFyYml0cmF0aW9uXG4iKTsKKwkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsIEkyQ01BTF9CSVQpOworCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwgSTJDTUlGX0JJVCk7CisJCXBjaF9pMmNfaW5pdChhZGFwKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCiAJCXBjaF9pMmNfc3RvcChhZGFwKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRVRJTUU7CiAJfQogCisJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbmd0aDsgKyt3cmNvdW50KSB7CisJCS8qIHdyaXRlIGJ1ZmZlciB2YWx1ZSB0byBJMkMgZGF0YSByZWdpc3RlciAqLworCQlpb3dyaXRlMzIoYnVmW3dyY291bnRdLCBwICsgUENIX0kyQ0RSKTsKKwkJcGNoX2RiZyhhZGFwLCAid3JpdGluZyAleCB0byBEYXRhIHJlZ2lzdGVyXG4iLCBidWZbd3Jjb3VudF0pOworCisJCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwkJaWYgKHJ0biA9PSAwKSB7CisJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIGFkZHJlc3MiCisJCQkJCSJzZXR0aW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAorCQkJCSAgIEkyQ01DRl9CSVQpOworCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUlGX0JJVCk7CisJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQkJcGNoX2kyY19zdG9wKGFkYXApOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSAqLworCWlmIChsYXN0KQorCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJZWxzZQorCQlwY2hfaTJjX3JlcHN0YXJ0KGFkYXApOworCiAJcGNoX2RiZyhhZGFwLCAicmV0dXJuPSVkXG4iLCB3cmNvdW50KTsKIAogCXJldHVybiB3cmNvdW50OwpAQCAtNDg0LDYgKzUyMCwxOSBAQAogfQogCiAvKioKKyAqIHBjaF9pMmNfcmVzdGFydCgpIC0gR2VuZXJhdGUgSTJDIHJlc3RhcnQgY29uZGl0aW9uIGluIG5vcm1hbCBtb2RlLgorICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgorICoKKyAqIEdlbmVyYXRlIEkyQyByZXN0YXJ0IGNvbmRpdGlvbiBpbiBub3JtYWwgbW9kZSBieSBzZXR0aW5nIEkyQ0NUTC5JMkNSU1RBLgorICovCitzdGF0aWMgdm9pZCBwY2hfaTJjX3Jlc3RhcnQoc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQoreworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisJcGNoX2RiZyhhZGFwLCAiSTJDQ1RMID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQQ0hfSTJDQ1RMKSk7CisJcGNoX3NldGJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfUkVTVEFSVCk7Cit9CisKKy8qKgogICogcGNoX2kyY19yZWFkYnl0ZXMoKSAtIHJlYWQgZGF0YSAgZnJvbSBJMkMgYnVzIGluIG5vcm1hbCBtb2RlLgogICogQGkyY19hZGFwOglQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaTJjX2FkYXB0ZXIuCiAgKiBAbXNnczoJUG9pbnRlciB0byBpMmNfbXNnIHN0cnVjdHVyZS4KQEAgLTUwMCw3ICs1NDksOSBAQAogCXUzMiBsZW5ndGg7CiAJdTMyIGFkZHI7CiAJdTMyIGFkZHJfMl9tc2I7CisJdTMyIGFkZHJfOF9sc2I7CiAJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlzMzIgcnRuOwogCiAJbGVuZ3RoID0gbXNncy0+bGVuOwogCWJ1ZiA9IG1zZ3MtPmJ1ZjsKQEAgLTUxNSw5ICs1NjYsNTUgQEAKIAl9CiAKIAlpZiAobXNncy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKLQkJYWRkcl8yX21zYiA9ICgoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNykgfCAoSTJDX1JEKSk7CisJCWFkZHJfMl9tc2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNyk7CiAJCWlvd3JpdGUzMihhZGRyXzJfbXNiIHwgVEVOX0JJVF9BRERSX01BU0ssIHAgKyBQQ0hfSTJDRFIpOworCQlpZiAoZmlyc3QpCisJCQlwY2hfaTJjX3N0YXJ0KGFkYXApOwogCisJCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwkJaWYgKHJ0biA9PSAwKSB7CisJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIGFkZHJlc3MiCisJCQkJCSJzZXR0aW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWFkZHJfOF9sc2IgPSAoYWRkciAmIEkyQ19BRERSX01TSyk7CisJCQlpb3dyaXRlMzIoYWRkcl84X2xzYiwgcCArIFBDSF9JMkNEUik7CisJCX0gZWxzZSBpZiAocnRuID09IC1FSU8pIHsgLyogQXJiaXRyYXRpb24gTG9zdCAqLworCQkJcGNoX2VycihhZGFwLCAiTG9zdCBBcmJpdHJhdGlvblxuIik7CisJCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKKwkJCQkgICBJMkNNQUxfQklUKTsKKwkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAorCQkJCSAgIEkyQ01JRl9CSVQpOworCQkJcGNoX2kyY19pbml0KGFkYXApOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQkJcGNoX2kyY19zdG9wKGFkYXApOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCQlwY2hfaTJjX3Jlc3RhcnQoYWRhcCk7CisJCXJ0biA9IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKKwkJaWYgKHJ0biA9PSAwKSB7CisJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZlIE5BQ0sgZm9yIHNsYXZlIGFkZHJlc3MiCisJCQkJCSJzZXR0aW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWFkZHJfMl9tc2IgfD0gSTJDX1JEOworCQkJaW93cml0ZTMyKGFkZHJfMl9tc2IgfCBURU5fQklUX0FERFJfTUFTSywKKwkJCQkgIHAgKyBQQ0hfSTJDRFIpOworCQl9IGVsc2UgaWYgKHJ0biA9PSAtRUlPKSB7IC8qIEFyYml0cmF0aW9uIExvc3QgKi8KKwkJCXBjaF9lcnIoYWRhcCwgIkxvc3QgQXJiaXRyYXRpb25cbiIpOworCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCisJCQkJICAgSTJDTUFMX0JJVCk7CisJCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKKwkJCQkgICBJMkNNSUZfQklUKTsKKwkJCXBjaF9pMmNfaW5pdChhZGFwKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KKwkJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KIAl9IGVsc2UgewogCQkvKiA3IGFkZHJlc3MgYml0cyArIFIvVyBiaXQgKi8KIAkJYWRkciA9ICgoKGFkZHIpIDw8IDEpIHwgKEkyQ19SRCkpOwpAQCAtNTI4LDU2ICs2MjUsODEgQEAKIAlpZiAoZmlyc3QpCiAJCXBjaF9pMmNfc3RhcnQoYWRhcCk7CiAKLQlpZiAoKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwKSAmJgotCSAgICAocGNoX2kyY19nZXRhY2soYWRhcCkgPT0gMCkpIHsKLQkJcGNoX2RiZyhhZGFwLCAicmV0dXJuICVkXG4iLCAwKTsKKwlydG4gPSBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CisJaWYgKHJ0biA9PSAwKSB7CisJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgeworCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSBhZGRyZXNzIgorCQkJCSJzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAvKiBBcmJpdHJhdGlvbiBMb3N0ICovCisJCXBjaF9lcnIoYWRhcCwgIkxvc3QgQXJiaXRyYXRpb25cbiIpOworCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwgSTJDTUFMX0JJVCk7CisJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLCBJMkNNSUZfQklUKTsKKwkJcGNoX2kyY19pbml0KGFkYXApOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KKwkJcGNoX2kyY19zdG9wKGFkYXApOworCQlyZXR1cm4gLUVUSU1FOworCX0KIAotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKLQkJCWlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOyAvKiBEdW1teSByZWFkIG5lZWRzICovCisJaWYgKGxlbmd0aCA9PSAwKSB7CisJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJaW9yZWFkMzIocCArIFBDSF9JMkNEUik7IC8qIER1bW15IHJlYWQgbmVlZHMgKi8KIAotCQkJY291bnQgPSBsZW5ndGg7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcmVhZF9pbmRleDsKLQkJCWludCBsb29wOwotCQkJcGNoX2kyY19zZW5kYWNrKGFkYXApOworCQljb3VudCA9IGxlbmd0aDsKKwl9IGVsc2UgeworCQlpbnQgcmVhZF9pbmRleDsKKwkJaW50IGxvb3A7CisJCXBjaF9pMmNfc2VuZGFjayhhZGFwKTsKIAotCQkJLyogRHVtbXkgcmVhZCAqLwotCQkJZm9yIChsb29wID0gMSwgcmVhZF9pbmRleCA9IDA7IGxvb3AgPCBsZW5ndGg7IGxvb3ArKykgewotCQkJCWJ1ZltyZWFkX2luZGV4XSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOwotCi0JCQkJaWYgKGxvb3AgIT0gMSkKLQkJCQkJcmVhZF9pbmRleCsrOwotCi0JCQkJaWYgKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSAhPSAwKSB7Ci0JCQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKLQkJCQkJcmV0dXJuIC1FVElNRTsKLQkJCQl9Ci0JCQl9CS8qIGVuZCBmb3IgKi8KLQotCQkJcGNoX2kyY19zZW5kbmFjayhhZGFwKTsKLQorCQkvKiBEdW1teSByZWFkICovCisJCWZvciAobG9vcCA9IDEsIHJlYWRfaW5kZXggPSAwOyBsb29wIDwgbGVuZ3RoOyBsb29wKyspIHsKIAkJCWJ1ZltyZWFkX2luZGV4XSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOwogCi0JCQlpZiAobGVuZ3RoICE9IDEpCisJCQlpZiAobG9vcCAhPSAxKQogCQkJCXJlYWRfaW5kZXgrKzsKIAotCQkJaWYgKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwKSB7Ci0JCQkJaWYgKGxhc3QpCi0JCQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKLQkJCQllbHNlCi0JCQkJCXBjaF9pMmNfcmVwc3RhcnQoYWRhcCk7Ci0KLQkJCQlidWZbcmVhZF9pbmRleCsrXSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOwotCQkJCWNvdW50ID0gcmVhZF9pbmRleDsKLQkJCX0gZWxzZSB7Ci0JCQkJY291bnQgPSAtRVRJTUU7CisJCQlydG4gPSBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CisJCQlpZiAocnRuID09IDApIHsKKwkJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsKKwkJCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSIKKwkJCQkJCSJhZGRyZXNzIHNldHRpbmdcbiIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KKwkJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQkJcmV0dXJuIC1FVElNRTsKIAkJCX0KIAorCQl9CS8qIGVuZCBmb3IgKi8KKworCQlwY2hfaTJjX3NlbmRuYWNrKGFkYXApOworCisJCWJ1ZltyZWFkX2luZGV4XSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOyAvKiBSZWFkIGZpbmFsIC0gMSAqLworCisJCWlmIChsZW5ndGggIT0gMSkKKwkJCXJlYWRfaW5kZXgrKzsKKworCQlydG4gPSBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CisJCWlmIChydG4gPT0gMCkgeworCQkJaWYgKHBjaF9pMmNfZ2V0YWNrKGFkYXApKSB7CisJCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSIKKwkJCQkJImFkZHJlc3Mgc2V0dGluZ1xuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLworCQkJcGNoX2kyY19zdG9wKGFkYXApOworCQkJcmV0dXJuIC1FVElNRTsKIAkJfQotCX0gZWxzZSB7Ci0JCWNvdW50ID0gLUVUSU1FOwotCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisKKwkJaWYgKGxhc3QpCisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCWVsc2UKKwkJCXBjaF9pMmNfcmVwc3RhcnQoYWRhcCk7CisKKwkJYnVmW3JlYWRfaW5kZXgrK10gPSBpb3JlYWQzMihwICsgUENIX0kyQ0RSKTsgLyogUmVhZCBGaW5hbCAqLworCQljb3VudCA9IHJlYWRfaW5kZXg7CiAJfQogCiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oaWdobGFuZGVyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwppbmRleCAzODc2YTI0Li42M2JiMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpZ2hsYW5kZXIuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCWRldi0+aXJxID0gMDsKIAogCWlmIChkZXYtPmlycSkgewotCQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGlnaGxhbmRlcl9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGlnaGxhbmRlcl9pMmNfaXJxLCAwLAogCQkJCSAgcGRldi0+bmFtZSwgZGV2KTsKIAkJaWYgKHVubGlrZWx5KHJldCkpCiAJCQlnb3RvIGVycl91bm1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlteC5jCmluZGV4IDRjMmE2MmIuLjU4ODMyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYwpAQCAtNDgsNiArNDgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2kyYy5oPgogCiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMTI1LDYgKzEyOCwxMSBAQAogCXVuc2lnbmVkIGludAkJaWZkcjsgLyogSU1YX0kyQ19JRkRSICovCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfaW14X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDEtaTJjIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKIC8qKiBGdW5jdGlvbnMgZm9yIElNWCBJMkMgYWRhcHRlciBkcml2ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NjYsMTAgKzQ3NCwxMCBAQAogewogCXN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBpbXhpMmNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJcmVzb3VyY2Vfc2l6ZV90IHJlc19zaXplOwotCWludCBpcnE7CisJaW50IGlycSwgYml0cmF0ZTsKIAlpbnQgcmV0OwogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiPCVzPlxuIiwgX19mdW5jX18pOwpAQCAtNDg1LDE5ICs0OTMsMTEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgewotCQlyZXQgPSBwZGF0YS0+aW5pdCgmcGRldi0+ZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCiAJcmVzX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZSwgRFJJVkVSX05BTUUpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBmYWlsMDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzX3NpemUpOwpAQCAtNTIwLDYgKzUyMCw3IEBACiAJaTJjX2lteC0+YWRhcHRlci5hbGdvCQk9ICZpMmNfaW14X2FsZ287CiAJaTJjX2lteC0+YWRhcHRlci5kZXYucGFyZW50CT0gJnBkZXYtPmRldjsKIAlpMmNfaW14LT5hZGFwdGVyLm5yIAkJPSBwZGV2LT5pZDsKKwlpMmNfaW14LT5hZGFwdGVyLmRldi5vZl9ub2RlCT0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJaTJjX2lteC0+aXJxCQkJPSBpcnE7CiAJaTJjX2lteC0+YmFzZQkJCT0gYmFzZTsKIAlpMmNfaW14LT5yZXMJCQk9IHJlczsKQEAgLTU0NiwxMCArNTQ3LDEyIEBACiAJaTJjX3NldF9hZGFwZGF0YSgmaTJjX2lteC0+YWRhcHRlciwgaTJjX2lteCk7CiAKIAkvKiBTZXQgdXAgY2xvY2sgZGl2aWRlciAqLwotCWlmIChwZGF0YSAmJiBwZGF0YS0+Yml0cmF0ZSkKLQkJaTJjX2lteF9zZXRfY2xrKGkyY19pbXgsIHBkYXRhLT5iaXRyYXRlKTsKLQllbHNlCi0JCWkyY19pbXhfc2V0X2NsayhpMmNfaW14LCBJTVhfSTJDX0JJVF9SQVRFKTsKKwliaXRyYXRlID0gSU1YX0kyQ19CSVRfUkFURTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAiY2xvY2stZnJlcXVlbmN5IiwgJmJpdHJhdGUpOworCWlmIChyZXQgPCAwICYmIHBkYXRhICYmIHBkYXRhLT5iaXRyYXRlKQorCQliaXRyYXRlID0gcGRhdGEtPmJpdHJhdGU7CisJaTJjX2lteF9zZXRfY2xrKGkyY19pbXgsIGJpdHJhdGUpOwogCiAJLyogU2V0IHVwIGNoaXAgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzICovCiAJd3JpdGViKDAsIGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOwpAQCAtNTYyLDYgKzU2NSw4IEBACiAJCWdvdG8gZmFpbDU7CiAJfQogCisJb2ZfaTJjX3JlZ2lzdGVyX2RldmljZXMoJmkyY19pbXgtPmFkYXB0ZXIpOworCiAJLyogU2V0IHVwIHBsYXRmb3JtIGRyaXZlciBkYXRhICovCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjX2lteCk7CiAKQEAgLTU4NiwxNiArNTkxLDEyIEBACiAJaW91bm1hcChiYXNlKTsKIGZhaWwxOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotZmFpbDA6Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQotCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKIAlyZXR1cm4gcmV0OyAvKiBSZXR1cm4gZXJyb3IgbnVtYmVyICovCiB9CiAKIHN0YXRpYyBpbnQgX19leGl0IGkyY19pbXhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGlteF9pMmNfc3RydWN0ICppMmNfaW14ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGlteGkyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJLyogcmVtb3ZlIGFkYXB0ZXIgKi8KIAlkZXZfZGJnKCZpMmNfaW14LT5hZGFwdGVyLmRldiwgImFkYXB0ZXIgcmVtb3ZlZFxuIik7CkBAIC02MTEsMTAgKzYxMiw2IEBACiAJd3JpdGViKDAsIGkyY19pbXgtPmJhc2UgKyBJTVhfSTJDX0kyQ1IpOwogCXdyaXRlYigwLCBpMmNfaW14LT5iYXNlICsgSU1YX0kyQ19JMlNSKTsKIAotCS8qIFNodXQgZG93biBoYXJkd2FyZSAqLwotCWlmIChwZGF0YSAmJiBwZGF0YS0+ZXhpdCkKLQkJcGRhdGEtPmV4aXQoJnBkZXYtPmRldik7Ci0KIAljbGtfcHV0KGkyY19pbXgtPmNsayk7CiAKIAlpb3VubWFwKGkyY19pbXgtPmJhc2UpOwpAQCAtNjI4LDYgKzYyNSw3IEBACiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGkyY19pbXhfZHRfaWRzLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwMjAwMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKaW5kZXggNWQ4YWVkNS4uYzAxZTk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CS8qIFBpY2sgdXAgSVhQMjAwMC1zcGVjaWZpYyBiaXRzICovCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLWl4cDIwMDAuaD4KIAogc3RhdGljIGlubGluZSBpbnQgaXhwMjAwMF9zY2xfcGluKHZvaWQgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5vbWFkaWsuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCmluZGV4IGIyMjhlMDkuLjUyNjdhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCkBAIC02MywxMSArNjMsMTEgQEAKIC8qIE1hc3RlciBjb250cm9sbGVyIChNQ1IpIHJlZ2lzdGVyICovCiAjZGVmaW5lIEkyQ19NQ1JfT1AJCSgweDEgPDwgMCkJLyogT3BlcmF0aW9uICovCiAjZGVmaW5lIEkyQ19NQ1JfQTcJCSgweDdmIDw8IDEpCS8qIDctYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgSTJDX01DUl9FQTEwCQkoMHg3IDw8IDgpIAkvKiAxMC1iaXQgRXh0ZW5kZWQgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfTUNSX0VBMTAJCSgweDcgPDwgOCkJLyogMTAtYml0IEV4dGVuZGVkIGFkZHJlc3MgKi8KICNkZWZpbmUgSTJDX01DUl9TQgkJKDB4MSA8PCAxMSkJLyogRXh0ZW5kZWQgYWRkcmVzcyAqLwogI2RlZmluZSBJMkNfTUNSX0FNCQkoMHgzIDw8IDEyKQkvKiBBZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgSTJDX01DUl9TVE9QCQkoMHgxIDw8IDE0KSAJLyogU3RvcCBjb25kaXRpb24gKi8KLSNkZWZpbmUgSTJDX01DUl9MRU5HVEgJCSgweDdmZiA8PCAxNSkgCS8qIFRyYW5zYWN0aW9uIGxlbmd0aCAqLworI2RlZmluZSBJMkNfTUNSX1NUT1AJCSgweDEgPDwgMTQpCS8qIFN0b3AgY29uZGl0aW9uICovCisjZGVmaW5lIEkyQ19NQ1JfTEVOR1RICQkoMHg3ZmYgPDwgMTUpCS8qIFRyYW5zYWN0aW9uIGxlbmd0aCAqLwogCiAvKiBTdGF0dXMgcmVnaXN0ZXIgKFNSKSAqLwogI2RlZmluZSBJMkNfU1JfT1AJCSgweDMgPDwgMCkJLyogT3BlcmF0aW9uICovCkBAIC03Nyw3ICs3Nyw3IEBACiAjZGVmaW5lIEkyQ19TUl9MRU5HVEgJCSgweDdmZiA8PCA5KQkvKiBUcmFuc2ZlciBsZW5ndGggKi8KIAogLyogSW50ZXJydXB0IG1hc2sgc2V0L2NsZWFyIChJTVNDUikgYml0cyAqLwotI2RlZmluZSBJMkNfSVRfVFhGRSAJCSgweDEgPDwgMCkKKyNkZWZpbmUgSTJDX0lUX1RYRkUJCSgweDEgPDwgMCkKICNkZWZpbmUgSTJDX0lUX1RYRk5FCQkoMHgxIDw8IDEpCiAjZGVmaW5lIEkyQ19JVF9UWEZGCQkoMHgxIDw8IDIpCiAjZGVmaW5lIEkyQ19JVF9UWEZPVlIJCSgweDEgPDwgMykKQEAgLTEzNSwzMSArMTM1LDMxIEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBubWtfaTJjX2RldiAtIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2xsZXIKLSAqIEBwZGV2OiBwYXJlbnQgcGxhdGZvcm0gZGV2aWNlCi0gKiBAYWRhcDogY29ycmVzcG9uZGluZyBJMkMgYWRhcHRlcgotICogQGlycTogaW50ZXJydXB0IGxpbmUgZm9yIHRoZSBjb250cm9sbGVyCi0gKiBAdmlydGJhc2U6IHZpcnR1YWwgaW8gbWVtb3J5IGFyZWEKLSAqIEBjbGs6IGhhcmR3YXJlIGkyYyBibG9jayBjbG9jawotICogQGNmZzogbWFjaGluZSBwcm92aWRlZCBjb250cm9sbGVyIGNvbmZpZ3VyYXRpb24KLSAqIEBjbGk6IGhvbGRlciBvZiBjbGllbnQgc3BlY2lmaWMgZGF0YQotICogQHN0b3A6IHN0b3AgY29uZGl0aW9uCi0gKiBAeGZlcl9jb21wbGV0ZTogYWNrbm93bGVkZ2UgY29tcGxldGlvbiBmb3IgYSBJMkMgbWVzc2FnZQotICogQHJlc3VsdDogY29udHJvbGxlciBwcm9wb2dhdGVkIHJlc3VsdAotICogQHJlZ3VsYXRvcjogcG9pbnRlciB0byBpMmMgcmVndWxhdG9yCi0gKiBAYnVzeTogQnVzeSBkb2luZyB0cmFuc2ZlcgorICogc3RydWN0IG5ta19pMmNfZGV2IC0gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgY29udHJvbGxlci4KKyAqIEBwZGV2OiBwYXJlbnQgcGxhdGZvcm0gZGV2aWNlLgorICogQGFkYXA6IGNvcnJlc3BvbmRpbmcgSTJDIGFkYXB0ZXIuCisgKiBAaXJxOiBpbnRlcnJ1cHQgbGluZSBmb3IgdGhlIGNvbnRyb2xsZXIuCisgKiBAdmlydGJhc2U6IHZpcnR1YWwgaW8gbWVtb3J5IGFyZWEuCisgKiBAY2xrOiBoYXJkd2FyZSBpMmMgYmxvY2sgY2xvY2suCisgKiBAY2ZnOiBtYWNoaW5lIHByb3ZpZGVkIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbi4KKyAqIEBjbGk6IGhvbGRlciBvZiBjbGllbnQgc3BlY2lmaWMgZGF0YS4KKyAqIEBzdG9wOiBzdG9wIGNvbmRpdGlvbi4KKyAqIEB4ZmVyX2NvbXBsZXRlOiBhY2tub3dsZWRnZSBjb21wbGV0aW9uIGZvciBhIEkyQyBtZXNzYWdlLgorICogQHJlc3VsdDogY29udHJvbGxlciBwcm9wb2dhdGVkIHJlc3VsdC4KKyAqIEByZWd1bGF0b3I6IHBvaW50ZXIgdG8gaTJjIHJlZ3VsYXRvci4KKyAqIEBidXN5OiBCdXN5IGRvaW5nIHRyYW5zZmVyLgogICovCiBzdHJ1Y3Qgbm1rX2kyY19kZXYgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAJCWFkYXA7Ci0JaW50IAkJCQlpcnE7CisJc3RydWN0IGkyY19hZGFwdGVyCQlhZGFwOworCWludAkJCQlpcnE7CiAJdm9pZCBfX2lvbWVtCQkJKnZpcnRiYXNlOwogCXN0cnVjdCBjbGsJCQkqY2xrOwogCXN0cnVjdCBubWtfaTJjX2NvbnRyb2xsZXIJY2ZnOwogCXN0cnVjdCBpMmNfbm1rX2NsaWVudAkJY2xpOwotCWludCAJCQkJc3RvcDsKKwlpbnQJCQkJc3RvcDsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJeGZlcl9jb21wbGV0ZTsKLQlpbnQgCQkJCXJlc3VsdDsKKwlpbnQJCQkJcmVzdWx0OwogCXN0cnVjdCByZWd1bGF0b3IJCSpyZWd1bGF0b3I7CiAJYm9vbAkJCQlidXN5OwogfTsKQEAgLTIxNyw4ICsyMTcsOSBAQAogCQl9CiAJfQogCi0JZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJmbHVzaGluZyBvcGVyYXRpb24gdGltZWQgb3V0ICIKLQkJImdpdmluZyB1cCBhZnRlciAlZCBhdHRlbXB0cyIsIExPT1BfQVRURU1QVFMpOworCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkiZmx1c2hpbmcgb3BlcmF0aW9uIHRpbWVkIG91dCBnaXZpbmcgdXAgYWZ0ZXIgJWQgYXR0ZW1wdHMiLAorCQlMT09QX0FUVEVNUFRTKTsKIAogCXJldHVybiAtRVRJTUVET1VUOwogfQpAQCAtMjcwLDcgKzI3MSw3IEBACiB9CiAKIC8qIGVuYWJsZSBwZXJpcGhlcmFsLCBtYXN0ZXIgbW9kZSBvcGVyYXRpb24gKi8KLSNkZWZpbmUgREVGQVVMVF9JMkNfUkVHX0NSIAkoKDEgPDwgMSkgfCBJMkNfQ1JfUEUpCisjZGVmaW5lIERFRkFVTFRfSTJDX1JFR19DUgkoKDEgPDwgMSkgfCBJMkNfQ1JfUEUpCiAKIC8qKgogICogbG9hZF9pMmNfbWNyX3JlZygpIC0gbG9hZCB0aGUgTUNSIHJlZ2lzdGVyCkBAIC0zNjMsOCArMzY0LDggQEAKIAkgKiBhbmQgaGlnaCBzcGVlZCAodXAgdG8gMy40IE1iL3MpCiAJICovCiAJaWYgKGRldi0+Y2ZnLnNtID4gSTJDX0ZSRVFfTU9ERV9GQVNUKSB7Ci0JCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZG8gbm90IHN1cHBvcnQgdGhpcyBtb2RlICIKLQkJCSJkZWZhdWx0aW5nIHRvIHN0ZC4gbW9kZVxuIik7CisJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJImRvIG5vdCBzdXBwb3J0IHRoaXMgbW9kZSBkZWZhdWx0aW5nIHRvIHN0ZC4gbW9kZVxuIik7CiAJCWJyY3IyID0gaTJjX2Nsay8oMTAwMDAwICogMikgJiAweGZmZmY7CiAJCXdyaXRlbCgoYnJjcjEgfCBicmNyMiksIGRldi0+dmlydGJhc2UgKyBJMkNfQlJDUik7CiAJCXdyaXRlbChJMkNfRlJFUV9NT0RFX1NUQU5EQVJEIDw8IDQsCkBAIC00MjMsNyArNDI0LDcgQEAKIAogCWlmICh0aW1lb3V0IDwgMCkgewogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwKLQkJCSJ3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQiCisJCQkid2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0ICIKIAkJCSJyZXR1cm5lZCAlZCB3YWl0aW5nIGZvciBldmVudFxuIiwgdGltZW91dCk7CiAJCXN0YXR1cyA9IHRpbWVvdXQ7CiAJfQpAQCAtNTU2LDggKzU1Nyw4IEBACiAJCWlmICgoKGkyY19zciA+PiAyKSAmIDB4MykgPT0gMHgzKSB7CiAJCQkvKiBnZXQgdGhlIGFib3J0IGNhdXNlICovCiAJCQljYXVzZSA9CShpMmNfc3IgPj4gNCkgJiAweDc7Ci0JCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIiVzXG4iLCBjYXVzZQotCQkJCT49IEFSUkFZX1NJWkUoYWJvcnRfY2F1c2VzKSA/CisJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIiVzXG4iLAorCQkJCWNhdXNlID49IEFSUkFZX1NJWkUoYWJvcnRfY2F1c2VzKSA/CiAJCQkJInVua25vd24gcmVhc29uIiA6CiAJCQkJYWJvcnRfY2F1c2VzW2NhdXNlXSk7CiAJCX0KQEAgLTU4MiwxMyArNTgzLDEzIEBACiAgKgogICogTk9URToKICAqIFJFQUQgVFJBTlNGRVIgOiBXZSBpbXBvc2UgYSByZXN0cmljdGlvbiBvZiB0aGUgZmlyc3QgbWVzc2FnZSB0byBiZSB0aGUKLSAqIAkJaW5kZXggbWVzc2FnZSBmb3IgYW55IHJlYWQgdHJhbnNhY3Rpb24uCi0gKiAJCS0gYSBubyBpbmRleCBpcyBjb2RlZCBhcyAnMCcsCi0gKiAJCS0gMmJ5dGUgYmlnIGVuZGlhbiBpbmRleCBpcyBjb2RlZCBhcyAnMycKLSAqIAkJISEhIG1zZ1swXS5idWYgaG9sZHMgdGhlIGFjdHVhbCBpbmRleC4KLSAqIAkJVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggZ2VuZXJpYyBtZXNzYWdlcyBvZiBzbWJ1cyBlbXVsYXRvcgotICogCQl0aGF0IHNlbmQgYSBvbmUgYnl0ZSBpbmRleC4KLSAqIAkJZWcuIGEgSTJDIHRyYW5zYXRpb24gdG8gcmVhZCAyIGJ5dGVzIGZyb20gaW5kZXggMAorICoJCWluZGV4IG1lc3NhZ2UgZm9yIGFueSByZWFkIHRyYW5zYWN0aW9uLgorICoJCS0gYSBubyBpbmRleCBpcyBjb2RlZCBhcyAnMCcsCisgKgkJLSAyYnl0ZSBiaWcgZW5kaWFuIGluZGV4IGlzIGNvZGVkIGFzICczJworICoJCSEhISBtc2dbMF0uYnVmIGhvbGRzIHRoZSBhY3R1YWwgaW5kZXguCisgKgkJVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggZ2VuZXJpYyBtZXNzYWdlcyBvZiBzbWJ1cyBlbXVsYXRvcgorICoJCXRoYXQgc2VuZCBhIG9uZSBieXRlIGluZGV4LgorICoJCWVnLiBhIEkyQyB0cmFuc2F0aW9uIHRvIHJlYWQgMiBieXRlcyBmcm9tIGluZGV4IDAKICAqCQkJaWR4ID0gMDsKICAqCQkJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAgKgkJCW1zZ1swXS5mbGFncyA9IDB4MDsKQEAgLTY0NCw4ICs2NDUsOCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBudW1fbXNnczsgaSsrKSB7CiAJCQlpZiAodW5saWtlbHkobXNnc1tpXS5mbGFncyAmIEkyQ19NX1RFTikpIHsKLQkJCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIjEwIGJpdCBhZGRyZXNzaW5nIgotCQkJCQkJIm5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJCQkiMTAgYml0IGFkZHJlc3Npbmcgbm90IHN1cHBvcnRlZFxuIik7CiAKIAkJCQlzdGF0dXMgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwpAQCAtNzg5LDggKzc5MCw5IEBACiAKIAkJaWYgKGRldi0+Y2xpLmNvdW50KSB7CiAJCQlkZXYtPnJlc3VsdCA9IC1FSU87Ci0JCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgIiVsdSBieXRlcyBzdGlsbCByZW1haW4gdG8gYmUiCi0JCQkJCSJ4ZmVyZWRcbiIsIGRldi0+Y2xpLmNvdW50KTsKKwkJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LAorCQkJCSIlbHUgYnl0ZXMgc3RpbGwgcmVtYWluIHRvIGJlIHhmZXJlZFxuIiwKKwkJCQlkZXYtPmNsaS5jb3VudCk7CiAJCQkodm9pZCkgaW5pdF9odyhkZXYpOwogCQl9CiAJCWNvbXBsZXRlKCZkZXYtPnhmZXJfY29tcGxldGUpOwpAQCAtOTIzLDcgKzkyNSw3IEBACiAJfQogCiAJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCi0JCURSSVZFUl9OQU1FICJJL08gcmVnaW9uIikgPT0gCU5VTEwpCXsKKwkJRFJJVkVSX05BTUUgIkkvTyByZWdpb24iKSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJfbm9fcmVnaW9uOwogCX0KQEAgLTkzNSw3ICs5MzcsNyBAQAogCX0KIAogCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaTJjX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpMmNfaXJxX2hhbmRsZXIsIDAsCiAJCQkJRFJJVkVSX05BTUUsIGRldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY2xhaW0gdGhlIGlycSAlZFxuIiwgZGV2LT5pcnEpOwpAQCAtOTgwLDggKzk4Miw5IEBACiAKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW5pdGlhbGl6ZSAlcyBvbiB2aXJ0dWFsICIKLQkJImJhc2UgJXBcbiIsIGFkYXAtPm5hbWUsIGRldi0+dmlydGJhc2UpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSAiaW5pdGlhbGl6ZSAlcyBvbiB2aXJ0dWFsIGJhc2UgJXBcbiIsCisJCSBhZGFwLT5uYW1lLCBkZXYtPnZpcnRiYXNlKTsKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW51YzkwMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1udWM5MDAuYwppbmRleCA3MjQzNDI2Li44MzVlNDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW51YzkwMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbnVjOTAwLmMKQEAgLTYxMCw3ICs2MTAsNyBAQAogCQlnb3RvIGVycl9pb21hcDsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgbnVjOTAwX2kyY19pcnEsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgbnVjOTAwX2kyY19pcnEsIElSUUZfU0hBUkVELAogCQkJICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaTJjKTsKIAogCWlmIChyZXQgIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwppbmRleCAyZGZiNjMxLi5hNDNkMDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwpAQCAtNDIsMTIgKzQyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAvKiBJMkMgY29udHJvbGxlciByZXZpc2lvbnMgKi8KLSNkZWZpbmUgT01BUF9JMkNfUkVWXzIJCQkweDIwCisjZGVmaW5lIE9NQVBfSTJDX09NQVAxX1JFVl8yCQkweDIwCiAKIC8qIEkyQyBjb250cm9sbGVyIHJldmlzaW9ucyBwcmVzZW50IG9uIHNwZWNpZmljIGhhcmR3YXJlICovCiAjZGVmaW5lIE9NQVBfSTJDX1JFVl9PTl8yNDMwCQkweDM2CiAjZGVmaW5lIE9NQVBfSTJDX1JFVl9PTl8zNDMwCQkweDNDCi0jZGVmaW5lIE9NQVBfSTJDX1JFVl9PTl80NDMwCQkweDQwCisjZGVmaW5lIE9NQVBfSTJDX1JFVl9PTl8zNTMwXzQ0MzAJMHg0MAogCiAvKiB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSBjb250cm9sbGVyIHRvIHJlc3BvbmQgKi8KICNkZWZpbmUgT01BUF9JMkNfVElNRU9VVCAobXNlY3NfdG9famlmZmllcygxMDAwKSkKQEAgLTcyLDExICs3MiwxMiBAQAogCU9NQVBfSTJDX1NDTEhfUkVHLAogCU9NQVBfSTJDX1NZU1RFU1RfUkVHLAogCU9NQVBfSTJDX0JVRlNUQVRfUkVHLAotCU9NQVBfSTJDX1JFVk5CX0xPLAotCU9NQVBfSTJDX1JFVk5CX0hJLAotCU9NQVBfSTJDX0lSUVNUQVRVU19SQVcsCi0JT01BUF9JMkNfSVJRRU5BQkxFX1NFVCwKLQlPTUFQX0kyQ19JUlFFTkFCTEVfQ0xSLAorCS8qIG9ubHkgb24gT01BUDQ0MzAgKi8KKwlPTUFQX0kyQ19JUF9WMl9SRVZOQl9MTywKKwlPTUFQX0kyQ19JUF9WMl9SRVZOQl9ISSwKKwlPTUFQX0kyQ19JUF9WMl9JUlFTVEFUVVNfUkFXLAorCU9NQVBfSTJDX0lQX1YyX0lSUUVOQUJMRV9TRVQsCisJT01BUF9JMkNfSVBfVjJfSVJRRU5BQkxFX0NMUiwKIH07CiAKIC8qIEkyQyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChPTUFQX0kyQ19JRSk6ICovCkBAIC0xOTMsNyArMTk0LDYgQEAKIAkJCQkJCSAqLwogCXU4CQkJcmV2OwogCXVuc2lnbmVkCQliX2h3OjE7CQkvKiBiYWQgaC93IGZpeGVzICovCi0JdW5zaWduZWQJCWlkbGU6MTsKIAl1MTYJCQlpZXN0YXRlOwkvKiBTYXZlZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KIAl1MTYJCQlwc2NzdGF0ZTsKIAl1MTYJCQlzY2xsc3RhdGU7CkBAIC0yMDQsNyArMjA0LDcgQEAKIAl1MTYJCQllcnJhdGE7CiB9OwogCi1zdGF0aWMgY29uc3QgdTggcmVnX21hcFtdID0geworc3RhdGljIGNvbnN0IHU4IHJlZ19tYXBfaXBfdjFbXSA9IHsKIAlbT01BUF9JMkNfUkVWX1JFR10gPSAweDAwLAogCVtPTUFQX0kyQ19JRV9SRUddID0gMHgwMSwKIAlbT01BUF9JMkNfU1RBVF9SRUddID0gMHgwMiwKQEAgLTIyNSw3ICsyMjUsNyBAQAogCVtPTUFQX0kyQ19CVUZTVEFUX1JFR10gPSAweDEwLAogfTsKIAotc3RhdGljIGNvbnN0IHU4IG9tYXA0X3JlZ19tYXBbXSA9IHsKK3N0YXRpYyBjb25zdCB1OCByZWdfbWFwX2lwX3YyW10gPSB7CiAJW09NQVBfSTJDX1JFVl9SRUddID0gMHgwNCwKIAlbT01BUF9JMkNfSUVfUkVHXSA9IDB4MmMsCiAJW09NQVBfSTJDX1NUQVRfUkVHXSA9IDB4MjgsCkBAIC0yNDQsMTEgKzI0NCwxMSBAQAogCVtPTUFQX0kyQ19TQ0xIX1JFR10gPSAweGI4LAogCVtPTUFQX0kyQ19TWVNURVNUX1JFR10gPSAweGJDLAogCVtPTUFQX0kyQ19CVUZTVEFUX1JFR10gPSAweGMwLAotCVtPTUFQX0kyQ19SRVZOQl9MT10gPSAweDAwLAotCVtPTUFQX0kyQ19SRVZOQl9ISV0gPSAweDA0LAotCVtPTUFQX0kyQ19JUlFTVEFUVVNfUkFXXSA9IDB4MjQsCi0JW09NQVBfSTJDX0lSUUVOQUJMRV9TRVRdID0gMHgyYywKLQlbT01BUF9JMkNfSVJRRU5BQkxFX0NMUl0gPSAweDMwLAorCVtPTUFQX0kyQ19JUF9WMl9SRVZOQl9MT10gPSAweDAwLAorCVtPTUFQX0kyQ19JUF9WMl9SRVZOQl9ISV0gPSAweDA0LAorCVtPTUFQX0kyQ19JUF9WMl9JUlFTVEFUVVNfUkFXXSA9IDB4MjQsCisJW09NQVBfSTJDX0lQX1YyX0lSUUVOQUJMRV9TRVRdID0gMHgyYywKKwlbT01BUF9JMkNfSVBfVjJfSVJRRU5BQkxFX0NMUl0gPSAweDMwLAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG9tYXBfaTJjX3dyaXRlX3JlZyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICppMmNfZGV2LApAQCAtMjY2LDE3ICsyNjYsMTEgQEAKIAogc3RhdGljIHZvaWQgb21hcF9pMmNfdW5pZGxlKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCBvbWFwX2kyY19idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAKLQlXQVJOX09OKCFkZXYtPmlkbGUpOworCXBkYXRhID0gZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldi0+ZGV2KTsKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKLQotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCWlmIChwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX1JFU0VUX1JFR1NfUE9TVElETEUpIHsKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgMCk7CiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1BTQ19SRUcsIGRldi0+cHNjc3RhdGUpOwogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TQ0xMX1JFRywgZGV2LT5zY2xsc3RhdGUpOwpAQCAtMjg2LDcgKzI4MCw2IEBACiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1dFX1JFRywgZGV2LT53ZXN0YXRlKTsKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgT01BUF9JMkNfQ09OX0VOKTsKIAl9Ci0JZGV2LT5pZGxlID0gMDsKIAogCS8qCiAJICogRG9uJ3Qgd3JpdGUgdG8gdGhpcyByZWdpc3RlciBpZiB0aGUgSUUgc3RhdGUgaXMgMCBhcyBpdCBjYW4KQEAgLTI5OCwzMiArMjkxLDI1IEBACiAKIHN0YXRpYyB2b2lkIG9tYXBfaTJjX2lkbGUoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG9tYXBfaTJjX2J1c19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAl1MTYgaXY7CiAKLQlXQVJOX09OKGRldi0+aWRsZSk7Ci0KLQlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldi0+ZGV2KTsKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXBkYXRhID0gZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAKIAlkZXYtPmllc3RhdGUgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0lFX1JFRyk7Ci0JaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX1JFVl9PTl80NDMwKQotCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JUlFFTkFCTEVfQ0xSLCAxKTsKKwlpZiAocGRhdGEtPnJldiA9PSBPTUFQX0kyQ19JUF9WRVJTSU9OXzIpCisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0lQX1YyX0lSUUVOQUJMRV9DTFIsIDEpOwogCWVsc2UKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCAwKTsKIAotCWlmIChkZXYtPnJldiA8IE9NQVBfSTJDX1JFVl8yKSB7CisJaWYgKGRldi0+cmV2IDwgT01BUF9JMkNfT01BUDFfUkVWXzIpIHsKIAkJaXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0lWX1JFRyk7IC8qIFJlYWQgY2xlYXJzICovCiAJfSBlbHNlIHsKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1RBVF9SRUcsIGRldi0+aWVzdGF0ZSk7CiAKLQkJLyogRmx1c2ggcG9zdGVkIHdyaXRlIGJlZm9yZSB0aGUgZGV2LT5pZGxlIHN0b3JlIG9jY3VycyAqLworCQkvKiBGbHVzaCBwb3N0ZWQgd3JpdGUgKi8KIAkJb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRyk7CiAJfQotCWRldi0+aWRsZSA9IDE7Ci0KLQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IG9tYXBfaTJjX2luaXQoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQpAQCAtMzM0LDggKzMyMCwxMSBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAl1bnNpZ25lZCBsb25nIGludGVybmFsX2NsayA9IDA7CiAJc3RydWN0IGNsayAqZmNsazsKKwlzdHJ1Y3Qgb21hcF9pMmNfYnVzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCi0JaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX1JFVl8yKSB7CisJcGRhdGEgPSBkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKworCWlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19PTUFQMV9SRVZfMikgewogCQkvKiBEaXNhYmxlIEkyQyBjb250cm9sbGVyIGJlZm9yZSBzb2Z0IHJlc2V0ICovCiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsCiAJCQlvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcpICYKQEAgLTM3OCwxMiArMzY3LDEzIEBACiAJCQkgKiBSRVZJU0lUOiBTb21lIHdrdXAgc291cmNlcyBtaWdodCBub3QgYmUgbmVlZGVkLgogCQkJICovCiAJCQlkZXYtPndlc3RhdGUgPSBPTUFQX0kyQ19XRV9BTEw7Ci0JCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19XRV9SRUcsIGRldi0+d2VzdGF0ZSk7CisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19XRV9SRUcsCisJCQkJCQkJZGV2LT53ZXN0YXRlKTsKIAkJfQogCX0KIAlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCAwKTsKIAotCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkgeworCWlmIChwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX0FMV0FZU19BUk1YT1JfQ0xLKSB7CiAJCS8qCiAJCSAqIFRoZSBJMkMgZnVuY3Rpb25hbCBjbG9jayBpcyB0aGUgYXJteG9yX2NrLCBzbyB0aGVyZSdzCiAJCSAqIG5vIG5lZWQgdG8gZ2V0ICJhcm14b3JfY2siIHNlcGFyYXRlbHkuICBOb3csIGlmIE9NQVAyNDIwCkBAIC00MDcsNyArMzk3LDcgQEAKIAkJCXBzYyA9IGZjbGtfcmF0ZSAvIDEyMDAwMDAwOwogCX0KIAotCWlmICghKGNwdV9jbGFzc19pc19vbWFwMSgpIHx8IGNwdV9pc19vbWFwMjQyMCgpKSkgeworCWlmICghKHBkYXRhLT5mbGFncyAmIE9NQVBfSTJDX0ZMQUdfU0lNUExFX0NMT0NLKSkgewogCiAJCS8qCiAJCSAqIEhTSTJDIGNvbnRyb2xsZXIgaW50ZXJuYWwgY2xrIHJhdGUgc2hvdWxkIGJlIDE5LjIgTWh6IGZvcgpAQCAtNDE1LDcgKzQwNSw4IEBACiAJCSAqIHRvIGdldCBsb25nZXIgZmlsdGVyIHBlcmlvZCBmb3IgYmV0dGVyIG5vaXNlIHN1cHByZXNzaW9uLgogCQkgKiBUaGUgZmlsdGVyIGlzIGljbGsgKGZjbGsgZm9yIEhTKSBwZXJpb2QuCiAJCSAqLwotCQlpZiAoZGV2LT5zcGVlZCA+IDQwMCB8fCBjcHVfaXNfb21hcDI0MzAoKSkKKwkJaWYgKGRldi0+c3BlZWQgPiA0MDAgfHwKKwkJCSAgICAgICBwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX0ZPUkNFXzE5MjAwX0lOVF9DTEspCiAJCQlpbnRlcm5hbF9jbGsgPSAxOTIwMDsKIAkJZWxzZSBpZiAoZGV2LT5zcGVlZCA+IDEwMCkKIAkJCWludGVybmFsX2NsayA9IDk2MDA7CkBAIC00ODQsNyArNDc1LDcgQEAKIAogCWRldi0+ZXJyYXRhID0gMDsKIAotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkKKwlpZiAocGRhdGEtPmZsYWdzICYgT01BUF9JMkNfRkxBR19BUFBMWV9FUlJBVEFfSTIwNykKIAkJZGV2LT5lcnJhdGEgfD0gSTJDX09NQVBfRVJSQVRBX0kyMDc7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwpAQCAtNDkzLDcgKzQ4NCw3IEBACiAJCQlPTUFQX0kyQ19JRV9BTCkgIHwgKChkZXYtPmZpZm9fc2l6ZSkgPwogCQkJCShPTUFQX0kyQ19JRV9SRFIgfCBPTUFQX0kyQ19JRV9YRFIpIDogMCk7CiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCBkZXYtPmllc3RhdGUpOwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCWlmIChwZGF0YS0+ZmxhZ3MgJiBPTUFQX0kyQ19GTEFHX1JFU0VUX1JFR1NfUE9TVElETEUpIHsKIAkJZGV2LT5wc2NzdGF0ZSA9IHBzYzsKIAkJZGV2LT5zY2xsc3RhdGUgPSBzY2xsOwogCQlkZXYtPnNjbGhzdGF0ZSA9IHNjbGg7CkBAIC02NDIsNyArNjMzLDcgQEAKIAlpbnQgaTsKIAlpbnQgcjsKIAotCW9tYXBfaTJjX3VuaWRsZShkZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2LT5kZXYpOwogCiAJciA9IG9tYXBfaTJjX3dhaXRfZm9yX2JiKGRldik7CiAJaWYgKHIgPCAwKQpAQCAtNjY1LDcgKzY1Niw3IEBACiAKIAlvbWFwX2kyY193YWl0X2Zvcl9iYihkZXYpOwogb3V0OgotCW9tYXBfaTJjX2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX3B1dChkZXYtPmRldik7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTcyMCwxMiArNzExLDEyIEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKIAogc3RhdGljIGlycXJldHVybl90Ci1vbWFwX2kyY19yZXYxX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKK29tYXBfaTJjX29tYXAxX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYgPSBkZXZfaWQ7CiAJdTE2IGl2LCB3OwogCi0JaWYgKGRldi0+aWRsZSkKKwlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2LT5kZXYpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlpdiA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfSVZfUkVHKTsKQEAgLTc3NCw3ICs3NjUsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KICNlbHNlCi0jZGVmaW5lIG9tYXBfaTJjX3JldjFfaXNyCQlOVUxMCisjZGVmaW5lIG9tYXBfaTJjX29tYXAxX2lzcgkJTlVMTAogI2VuZGlmCiAKIC8qCkBAIC04MTMsOCArODA0LDExIEBACiAJdTE2IGJpdHM7CiAJdTE2IHN0YXQsIHc7CiAJaW50IGVyciwgY291bnQgPSAwOworCXN0cnVjdCBvbWFwX2kyY19idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAKLQlpZiAoZGV2LT5pZGxlKQorCXBkYXRhID0gZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2LT5kZXYpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAliaXRzID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcpOwpAQCAtODgxLDggKzg3NSw4IEBACiAJCQkJCSAqIERhdGEgcmVnIGluIDI0MzAsIG9tYXAzIGFuZAogCQkJCQkgKiBvbWFwNCBpcyA4IGJpdCB3aWRlCiAJCQkJCSAqLwotCQkJCQlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkgfHwKLQkJCQkJCQljcHVfaXNfb21hcDI0MjAoKSkgeworCQkJCQlpZiAocGRhdGEtPmZsYWdzICYKKwkJCQkJCSBPTUFQX0kyQ19GTEFHXzE2QklUX0RBVEFfUkVHKSB7CiAJCQkJCQlpZiAoZGV2LT5idWZfbGVuKSB7CiAJCQkJCQkJKmRldi0+YnVmKysgPSB3ID4+IDg7CiAJCQkJCQkJZGV2LT5idWZfbGVuLS07CkBAIC05MjQsOCArOTE4LDggQEAKIAkJCQkJICogRGF0YSByZWcgaW4gMjQzMCwgb21hcDMgYW5kCiAJCQkJCSAqIG9tYXA0IGlzIDggYml0IHdpZGUKIAkJCQkJICovCi0JCQkJCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSB8fAotCQkJCQkJCWNwdV9pc19vbWFwMjQyMCgpKSB7CisJCQkJCWlmIChwZGF0YS0+ZmxhZ3MgJgorCQkJCQkJIE9NQVBfSTJDX0ZMQUdfMTZCSVRfREFUQV9SRUcpIHsKIAkJCQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKIAkJCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7CiAJCQkJCQkJZGV2LT5idWZfbGVuLS07CkBAIC0xMDE2LDcgKzEwMTAsNiBAQAogCX0KIAogCWRldi0+c3BlZWQgPSBzcGVlZDsKLQlkZXYtPmlkbGUgPSAxOwogCWRldi0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkZXYtPmlycSA9IGlycS0+c3RhcnQ7CiAJZGV2LT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwpAQCAtMTAyNywyNyArMTAyMCwyMiBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAotCWlmIChjcHVfaXNfb21hcDd4eCgpKQotCQlkZXYtPnJlZ19zaGlmdCA9IDE7Ci0JZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCWRldi0+cmVnX3NoaWZ0ID0gMDsKLQllbHNlCi0JCWRldi0+cmVnX3NoaWZ0ID0gMjsKKwlkZXYtPnJlZ19zaGlmdCA9IChwZGF0YS0+ZmxhZ3MgPj4gT01BUF9JMkNfRkxBR19CVVNfU0hJRlRfX1NISUZUKSAmIDM7CiAKLQlpZiAoY3B1X2lzX29tYXA0NHh4KCkpCi0JCWRldi0+cmVncyA9ICh1OCAqKSBvbWFwNF9yZWdfbWFwOworCWlmIChwZGF0YS0+cmV2ID09IE9NQVBfSTJDX0lQX1ZFUlNJT05fMikKKwkJZGV2LT5yZWdzID0gKHU4ICopcmVnX21hcF9pcF92MjsKIAllbHNlCi0JCWRldi0+cmVncyA9ICh1OCAqKSByZWdfbWFwOworCQlkZXYtPnJlZ3MgPSAodTggKilyZWdfbWFwX2lwX3YxOwogCi0JcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7Ci0Jb21hcF9pMmNfdW5pZGxlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2LT5kZXYpOwogCiAJZGV2LT5yZXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKIAogCWlmIChkZXYtPnJldiA8PSBPTUFQX0kyQ19SRVZfT05fMzQzMCkKIAkJZGV2LT5lcnJhdGEgfD0gSTJDX09NQVAzXzFQMTUzOwogCi0JaWYgKCEoY3B1X2NsYXNzX2lzX29tYXAxKCkgfHwgY3B1X2lzX29tYXAyNDIwKCkpKSB7CisJaWYgKCEocGRhdGEtPmZsYWdzICYgT01BUF9JMkNfRkxBR19OT19GSUZPKSkgewogCQl1MTYgczsKIAogCQkvKiBTZXQgdXAgdGhlIGZpZm8gc2l6ZSAtIEdldCB0b3RhbCBzaXplICovCkBAIC0xMDU5LDcgKzEwNDcsNyBAQAogCQkgKiBzaXplLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHN0YXR1cyBvbiBpbnQKIAkJICogY2FsbCBiYWNrIGxhdGVuY2llcy4KIAkJICovCi0JCWlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fNDQzMCkgeworCQlpZiAoZGV2LT5yZXYgPj0gT01BUF9JMkNfUkVWX09OXzM1MzBfNDQzMCkgewogCQkJZGV2LT5maWZvX3NpemUgPSAwOwogCQkJZGV2LT5iX2h3ID0gMDsgLyogRGlzYWJsZSBoYXJkd2FyZSBmaXhlcyAqLwogCQl9IGVsc2UgewpAQCAtMTA3NSw3ICsxMDYzLDggQEAKIAkvKiByZXNldCBBU0FQLCBjbGVhcmluZyBhbnkgSVJRcyAqLwogCW9tYXBfaTJjX2luaXQoZGV2KTsKIAotCWlzciA9IChkZXYtPnJldiA8IE9NQVBfSTJDX1JFVl8yKSA/IG9tYXBfaTJjX3JldjFfaXNyIDogb21hcF9pMmNfaXNyOworCWlzciA9IChkZXYtPnJldiA8IE9NQVBfSTJDX09NQVAxX1JFVl8yKSA/IG9tYXBfaTJjX29tYXAxX2lzciA6CisJCQkJCQkJCSAgIG9tYXBfaTJjX2lzcjsKIAlyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGlzciwgMCwgcGRldi0+bmFtZSwgZGV2KTsKIAogCWlmIChyKSB7CkBAIC0xMDgzLDEwICsxMDcyLDEwIEBACiAJCWdvdG8gZXJyX3VudXNlX2Nsb2NrczsKIAl9CiAKLQlkZXZfaW5mbyhkZXYtPmRldiwgImJ1cyAlZCByZXYlZC4lZCBhdCAlZCBrSHpcbiIsCi0JCSBwZGV2LT5pZCwgZGV2LT5yZXYgPj4gNCwgZGV2LT5yZXYgJiAweGYsIGRldi0+c3BlZWQpOworCWRldl9pbmZvKGRldi0+ZGV2LCAiYnVzICVkIHJldiVkLiVkLiVkIGF0ICVkIGtIelxuIiwgcGRldi0+aWQsCisJCSBwZGF0YS0+cmV2LCBkZXYtPnJldiA+PiA0LCBkZXYtPnJldiAmIDB4ZiwgZGV2LT5zcGVlZCk7CiAKLQlvbWFwX2kyY19pZGxlKGRldik7CisJcG1fcnVudGltZV9wdXQoZGV2LT5kZXYpOwogCiAJYWRhcCA9ICZkZXYtPmFkYXB0ZXI7CiAJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBkZXYpOwpAQCAtMTExMCw3ICsxMDk5LDcgQEAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl91bnVzZV9jbG9ja3M6CiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgMCk7Ci0Jb21hcF9pMmNfaWRsZShkZXYpOworCXBtX3J1bnRpbWVfcHV0KGRldi0+ZGV2KTsKIAlpb3VubWFwKGRldi0+YmFzZSk7CiBlcnJfZnJlZV9tZW06CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC0xMTM5LDEyICsxMTI4LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBvbWFwX2kyY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwX2kyY19pZGxlKF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9pMmNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwX2kyY191bmlkbGUoX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIG9tYXBfaTJjX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gb21hcF9pMmNfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IG9tYXBfaTJjX3J1bnRpbWVfcmVzdW1lLAorfTsKKyNkZWZpbmUgT01BUF9JMkNfUE1fT1BTICgmb21hcF9pMmNfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgT01BUF9JMkNfUE1fT1BTIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2kyY19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9tYXBfaTJjX3Byb2JlLAogCS5yZW1vdmUJCT0gb21hcF9pMmNfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJvbWFwX2kyYyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSBPTUFQX0kyQ19QTV9PUFMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCmluZGV4IGRmYTdhZTkuLjEyNzA1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJcG1jbXNwdHdpX2RhdGEuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbGRldiwgMCk7CiAJaWYgKHBtY21zcHR3aV9kYXRhLmlycSkgewogCQlyYyA9IHJlcXVlc3RfaXJxKHBtY21zcHR3aV9kYXRhLmlycSwgJnBtY21zcHR3aV9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCisJCQlJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKIAkJCXBsZGV2LT5uYW1lLCAmcG1jbXNwdHdpX2RhdGEpOwogCQlpZiAocmMgPT0gMCkgewogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLXBjaS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEtcGNpLmMKaW5kZXggYjczZGE2Yy4uNjMyZTA4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEtcGNpLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEtcGNpLmMKQEAgLTMsNiArMyw3IEBACiAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHNsYXZlIG1vZGUsIHRoZSByZWdpc3RlciBzbGlnaHRseSBtb3ZlZC4gVGhpcyBQQ0kKICAqIGRldmljZSBwcm92aWRlcyB0aHJlZSBiYXJzLCBldmVyeSBjb250YWlucyBhIHNpbmdsZSBJMkMgY29udHJvbGxlci4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9weGEtaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCmluZGV4IGY4NGE2M2MuLjI3NTRjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIApAQCAtNzgsNiArODAsOCBAQAogCXN0cnVjdCByZXNvdXJjZQkJKmlvYXJlYTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcDsKIAorCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYwkqcGRhdGE7CisJaW50CQkJZ3Bpb3NbMl07CiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWZyZXFfdHJhbnNpdGlvbjsKICNlbmRpZgpAQCAtOTUsNiArOTksMTIgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGkyYy0+ZGV2KTsKIAllbnVtIHMzYzI0eHhfaTJjX3R5cGUgdHlwZTsKIAorI2lmZGVmIENPTkZJR19PRgorCWlmIChpMmMtPmRldi0+b2Zfbm9kZSkKKwkJcmV0dXJuIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGkyYy0+ZGV2LT5vZl9ub2RlLAorCQkJCSJzYW1zdW5nLHMzYzI0NDAtaTJjIik7CisjZW5kaWYKKwogCXR5cGUgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKIAlyZXR1cm4gdHlwZSA9PSBUWVBFX1MzQzI0NDA7CiB9CkBAIC02MjUsNyArNjM1LDcgQEAKIAogc3RhdGljIGludCBzM2MyNHh4X2kyY19jbG9ja3JhdGUoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIHVuc2lnbmVkIGludCAqZ290KQogewotCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGRhdGEgPSBpMmMtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhID0gaTJjLT5wZGF0YTsKIAl1bnNpZ25lZCBsb25nIGNsa2luID0gY2xrX2dldF9yYXRlKGkyYy0+Y2xrKTsKIAl1bnNpZ25lZCBpbnQgZGl2cywgZGl2MTsKIAl1bnNpZ25lZCBsb25nIHRhcmdldF9mcmVxdWVuY3k7CkBAIC03NDEsNiArNzUxLDQ5IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBzM2MyNHh4X2kyY19wYXJzZV9kdF9ncGlvKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCWludCBpZHgsIGdwaW8sIHJldDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspIHsKKwkJZ3BpbyA9IG9mX2dldF9ncGlvKGkyYy0+ZGV2LT5vZl9ub2RlLCBpZHgpOworCQlpZiAoIWdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJCWRldl9lcnIoaTJjLT5kZXYsICJpbnZhbGlkIGdwaW9bJWRdOiAlZFxuIiwgaWR4LCBncGlvKTsKKwkJCWdvdG8gZnJlZV9ncGlvOworCQl9CisKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJpMmMtYnVzIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoaTJjLT5kZXYsICJncGlvIFslZF0gcmVxdWVzdCBmYWlsZWRcbiIsIGdwaW8pOworCQkJZ290byBmcmVlX2dwaW87CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK2ZyZWVfZ3BpbzoKKwl3aGlsZSAoLS1pZHggPj0gMCkKKwkJZ3Bpb19mcmVlKGkyYy0+Z3Bpb3NbaWR4XSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0eHhfaTJjX2R0X2dwaW9fZnJlZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCWZvciAoaWR4ID0gMDsgaWR4IDwgMjsgaWR4KyspCisJCWdwaW9fZnJlZShpMmMtPmdwaW9zW2lkeF0pOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgczNjMjR4eF9pMmNfcGFyc2VfZHRfZ3BpbyhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgczNjMjR4eF9pMmNfZHRfZ3Bpb19mcmVlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworfQorI2VuZGlmCisKIC8qIHMzYzI0eHhfaTJjX2luaXQKICAqCiAgKiBpbml0aWFsaXNlIHRoZSBjb250cm9sbGVyLCBzZXQgdGhlIElPIGxpbmVzIGFuZCBmcmVxdWVuY3kKQEAgLTc1NCwxMiArODA3LDE1IEBACiAKIAkvKiBnZXQgdGhlIHBsYWZyb20gZGF0YSAqLwogCi0JcGRhdGEgPSBpMmMtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlwZGF0YSA9IGkyYy0+cGRhdGE7CiAKIAkvKiBpbml0aXRhbGlzZSB0aGUgZ3BpbyAqLwogCiAJaWYgKHBkYXRhLT5jZmdfZ3BpbykKIAkJcGRhdGEtPmNmZ19ncGlvKHRvX3BsYXRmb3JtX2RldmljZShpMmMtPmRldikpOworCWVsc2UKKwkJaWYgKHMzYzI0eHhfaTJjX3BhcnNlX2R0X2dwaW8oaTJjKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCiAJLyogd3JpdGUgc2xhdmUgYWRkcmVzcyAqLwogCkBAIC03ODUsNiArODQxLDM0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfT0YKKy8qIHMzYzI0eHhfaTJjX3BhcnNlX2R0CisgKgorICogUGFyc2UgdGhlIGRldmljZSB0cmVlIG5vZGUgYW5kIHJldHJlaXZlIHRoZSBwbGF0Zm9ybSBkYXRhLgorKi8KKworc3RhdGljIHZvaWQKK3MzYzI0eHhfaTJjX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQoreworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGRhdGEgPSBpMmMtPnBkYXRhOworCisJaWYgKCFucCkKKwkJcmV0dXJuOworCisJcGRhdGEtPmJ1c19udW0gPSAtMTsgLyogaTJjIGJ1cyBudW1iZXIgaXMgZHluYW1pY2FsbHkgYXNzaWduZWQgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNhbXN1bmcsaTJjLXNkYS1kZWxheSIsICZwZGF0YS0+c2RhX2RlbGF5KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNhbXN1bmcsaTJjLXNsYXZlLWFkZHIiLCAmcGRhdGEtPnNsYXZlX2FkZHIpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic2Ftc3VuZyxpMmMtbWF4LWJ1cy1mcmVxIiwKKwkJCQkodTMyICopJnBkYXRhLT5mcmVxdWVuY3kpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkCitzM2MyNHh4X2kyY19wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYKKwogLyogczNjMjR4eF9pMmNfcHJvYmUKICAqCiAgKiBjYWxsZWQgYnkgdGhlIGJ1cyBkcml2ZXIgd2hlbiBhIHN1aXRhYmxlIGRldmljZSBpcyBmb3VuZApAQCAtNzkzLDE0ICs4NzcsMTYgQEAKIHN0YXRpYyBpbnQgczNjMjR4eF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYzsKLQlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhOworCXN0cnVjdCBzM2MyNDEwX3BsYXRmb3JtX2kyYyAqcGRhdGEgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CiAKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJaWYgKCFwZGF0YSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAogCWkyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzM2MyNHh4X2kyYyksIEdGUF9LRVJORUwpOwpAQCAtODA5LDYgKzg5NSwxNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlpMmMtPnBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyYy0+cGRhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbm9jbGs7CisJfQorCisJaWYgKHBkYXRhKQorCQltZW1jcHkoaTJjLT5wZGF0YSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKKwllbHNlCisJCXMzYzI0eHhfaTJjX3BhcnNlX2R0KHBkZXYtPmRldi5vZl9ub2RlLCBpMmMpOworCiAJc3RybGNweShpMmMtPmFkYXAubmFtZSwgInMzYzI0MTAtaTJjIiwgc2l6ZW9mKGkyYy0+YWRhcC5uYW1lKSk7CiAJaTJjLT5hZGFwLm93bmVyICAgPSBUSElTX01PRFVMRTsKIAlpMmMtPmFkYXAuYWxnbyAgICA9ICZzM2MyNHh4X2kyY19hbGdvcml0aG07CkBAIC04ODMsNyArOTgwLDcgQEAKIAkJZ290byBlcnJfaW9tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaTJjLT5pcnEsIHMzYzI0eHhfaTJjX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShpMmMtPmlycSwgczNjMjR4eF9pMmNfaXJxLCAwLAogCQkJICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaTJjKTsKIAogCWlmIChyZXQgIT0gMCkgewpAQCAtOTAzLDcgKzEwMDAsOCBAQAogCSAqIGJlaW5nIGJ1cyAwLgogCSAqLwogCi0JaTJjLT5hZGFwLm5yID0gcGRhdGEtPmJ1c19udW07CisJaTJjLT5hZGFwLm5yID0gaTJjLT5wZGF0YS0+YnVzX251bTsKKwlpMmMtPmFkYXAuZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmaTJjLT5hZGFwKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtOTExLDYgKzEwMDksNyBAQAogCQlnb3RvIGVycl9jcHVmcmVxOwogCX0KIAorCW9mX2kyY19yZWdpc3Rlcl9kZXZpY2VzKCZpMmMtPmFkYXApOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyYyk7CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IFMzQyBJMkMgYWRhcHRlclxuIiwgZGV2X25hbWUoJmkyYy0+YWRhcC5kZXYpKTsKQEAgLTk1OSw2ICsxMDU4LDcgQEAKIAlpb3VubWFwKGkyYy0+cmVncyk7CiAKIAlyZWxlYXNlX3Jlc291cmNlKGkyYy0+aW9hcmVhKTsKKwlzM2MyNHh4X2kyY19kdF9ncGlvX2ZyZWUoaTJjKTsKIAlrZnJlZShpMmMtPmlvYXJlYSk7CiAJa2ZyZWUoaTJjKTsKIApAQCAtMTAxMiw2ICsxMTEyLDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgczNjMjR4eF9kcml2ZXJfaWRzKTsKIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczNjMjR4eF9pMmNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsczNjMjQxMC1pMmMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0NDAtaTJjIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHMzYzI0eHhfaTJjX21hdGNoKTsKKyNlbHNlCisjZGVmaW5lIHMzYzI0eHhfaTJjX21hdGNoIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNHh4X2kyY19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHMzYzI0eHhfaTJjX3Byb2JlLAogCS5yZW1vdmUJCT0gczNjMjR4eF9pMmNfcmVtb3ZlLApAQCAtMTAyMCw2ICsxMTMxLDcgQEAKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gInMzYy1pMmMiLAogCQkucG0JPSBTM0MyNFhYX0RFVl9QTV9PUFMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHMzYzI0eHhfaTJjX21hdGNoLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwppbmRleCAzY2FkOGZlLi5hNjcxMzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pMmMtc2g3NzYwLmg+CkBAIC01MDIsNyArNTAzLDcgQEAKIAl9CiAJT1VUMzIoaWQsIEkyQ0NDUiwgcmV0KTsKIAotCWlmIChyZXF1ZXN0X2lycShpZC0+aXJxLCBzaDc3NjBfaTJjX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaWQtPmlycSwgc2g3NzYwX2kyY19pcnEsIDAsCiAJCQlTSDc3NjBfSTJDX0RFVk5BTUUsIGlkKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGlycSAlZFxuIiwgaWQtPmlycSk7CiAJCXJldCA9IC1FQlVTWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCmluZGV4IGY2MzNhNTMuLjY3NWM5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYwpAQCAtNTQzLDcgKzU0Myw3IEBACiAKIAl3aGlsZSAoKHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfSVJRLCBrKSkpIHsKIAkJZm9yIChuID0gcmVzLT5zdGFydDsgaG9vayAmJiBuIDw9IHJlcy0+ZW5kOyBuKyspIHsKLQkJCWlmIChyZXF1ZXN0X2lycShuLCBzaF9tb2JpbGVfaTJjX2lzciwgSVJRRl9ESVNBQkxFRCwKKwkJCWlmIChyZXF1ZXN0X2lycShuLCBzaF9tb2JpbGVfaTJjX2lzciwgMCwKIAkJCQkJZGV2X25hbWUoJmRldi0+ZGV2KSwgZGV2KSkgewogCQkJCWZvciAobi0tOyBuID49IHJlcy0+c3RhcnQ7IG4tLSkKIAkJCQkJZnJlZV9pcnEobiwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dTMwMC5jCmluZGV4IDk5ODc5NjEuLjRkNDRhZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHUzMDAuYwpAQCAtOTE2LDcgKzkxNiw3IEBACiAJfQogCiAJZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc3R1MzAwX2lyaCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHN0dTMwMF9pcmgsIDAsCiAJCQlOQU1FLCBkZXYpKSB7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gZXJyX25vX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYwppbmRleCAzYzk0YzRhLi40NmI2NTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy10ZWdyYS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCkBAIC01NjYsNyArNTY3LDcgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsayAqaTJjX2NsazsKIAljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7Ci0Jdm9pZCAqYmFzZTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CiAJaW50IGlycTsKIAlpbnQgcmV0ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKaW5kZXggOTg2ZTVmNi4uOTFlMzQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCkBAIC01NTAsNyArNTUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2N4MjAwX3BjaV9kcnYgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY3gyMDBfcGNpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJjczU1MzUtc21iIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC01OTMsMTQgKzU5MywxNCBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE5vIElTQSBkZXZpY2VzOyByZWdpc3RlciB0aGUgcGxhdGZvcm0gZHJpdmVyIGZvciBQQ0ktYmFzZWQgZGV2aWNlcyAqLwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjeDIwMF9wY2lfZHJ2KTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzY3gyMDBfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzY3gyMDBfYWNiX2NsZWFudXAodm9pZCkKIHsKIAlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CiAKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2N4MjAwX3BjaV9kcnYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzY3gyMDBfcGNpX2RyaXZlcik7CiAKIAltdXRleF9sb2NrKCZzY3gyMDBfYWNiX2xpc3RfbXV0ZXgpOwogCXdoaWxlICgoaWZhY2UgPSBzY3gyMDBfYWNiX2xpc3QpICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1ib2FyZGluZm8uYyBiL2RyaXZlcnMvaTJjL2kyYy1ib2FyZGluZm8uYwppbmRleCAzY2EyZTAxLi4xMDI3NGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWJvYXJkaW5mby5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAKICNpbmNsdWRlICJpMmMtY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvS2NvbmZpZyBiL2RyaXZlcnMvaWRlL0tjb25maWcKaW5kZXggNzZiNmQ5OC4uNWEyNjU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lkZS9LY29uZmlnCkBAIC02NzcsMTkgKzY3NywxOSBAQAogCiBjb25maWcgQkxLX0RFVl9JREVfQVUxWFhYCiAgICAgICAgYm9vbCAiSURFIGZvciBBTUQgQWxjaGVteSBBdTEyMDAiCi0gICAgICAgZGVwZW5kcyBvbiBTT0NfQVUxMjAwCisgICAgICAgZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKICAgICAgICBzZWxlY3QgSURFX1hGRVJfTU9ERQogY2hvaWNlCiAgICAgICAgcHJvbXB0ICJJREUgTW9kZSBmb3IgQU1EIEFsY2hlbXkgQXUxMjAwIgogICAgICAgIGRlZmF1bHQgQkxLX0RFVl9JREVfQVUxWFhYX1BJT19EQkRNQQotICAgICAgIGRlcGVuZHMgb24gU09DX0FVMTIwMCAmJiBCTEtfREVWX0lERV9BVTFYWFgKKyAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfSURFX0FVMVhYWAogCiBjb25maWcgQkxLX0RFVl9JREVfQVUxWFhYX1BJT19EQkRNQQogICAgICAgIGJvb2wgIlBJTytEYkRNQSBJREUgZm9yIEFNRCBBbGNoZW15IEF1MTIwMCIKIAogY29uZmlnIEJMS19ERVZfSURFX0FVMVhYWF9NRE1BMl9EQkRNQQogICAgICAgIGJvb2wgIk1ETUEyK0RiRE1BIElERSBmb3IgQU1EIEFsY2hlbXkgQXUxMjAwIgotICAgICAgIGRlcGVuZHMgb24gU09DX0FVMTIwMCAmJiBCTEtfREVWX0lERV9BVTFYWFgKKyAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfSURFX0FVMVhYWAogZW5kY2hvaWNlCiAKIGNvbmZpZyBCTEtfREVWX0lERV9UWDQ5MzgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2F0OTFfaWRlLmMgYi9kcml2ZXJzL2lkZS9hdDkxX2lkZS5jCmluZGV4IDAwMGE3OGUuLjZkZWRlOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2F0OTFfaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvYXQ5MV9pZGUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAiYXQ5MV9pZGUiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMgYi9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKaW5kZXggYjI2YzIzNC4uMjU5Nzg2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYwpAQCAtMzYsMTMgKzM2LDE3IEBACiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImF1MTIwMC1pZGUiCiAjZGVmaW5lIERSVl9BVVRIT1IJIkVucmljbyBXYWx0aGVyIDxlbnJpY28ud2FsdGhlckBhbWQuY29tPiAvIFBldGUgUG9wb3YgPHBwb3BvdkBlbWJlZGRlZGFsbGV5LmNvbT4iCiAKKyNpZm5kZWYgSURFX1JFR19TSElGVAorI2RlZmluZSBJREVfUkVHX1NISUZUIDUKKyNlbmRpZgorCiAvKiBlbmFibGUgdGhlIGJ1cnN0bW9kZSBpbiB0aGUgZGJkbWEgKi8KICNkZWZpbmUgSURFX0FVMVhYWF9CVVJTVE1PREUJMQogCkBAIC0zMTcsMTAgKzMyMSwxMSBAQAogfQogI2VuZGlmIC8qIGVuZCBDT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYX01ETUEyX0RCRE1BICovCiAKLXN0YXRpYyB2b2lkIGF1aWRlX2luaXRfZGJkbWFfZGV2KGRiZGV2X3RhYl90ICpkZXYsIHUzMiBkZXZfaWQsIHUzMiB0c2l6ZSwgdTMyIGRldndpZHRoLCB1MzIgZmxhZ3MpCitzdGF0aWMgdm9pZCBhdWlkZV9pbml0X2RiZG1hX2RldihkYmRldl90YWJfdCAqZGV2LCB1MzIgZGV2X2lkLCB1MzIgdHNpemUsCisJCQkJIHUzMiBkZXZ3aWR0aCwgdTMyIGZsYWdzLCB1MzIgcmVnYmFzZSkKIHsKIAlkZXYtPmRldl9pZCAgICAgICAgICA9IGRldl9pZDsKLQlkZXYtPmRldl9waHlzYWRkciAgICA9ICh1MzIpSURFX1BIWVNfQUREUjsKKwlkZXYtPmRldl9waHlzYWRkciAgICA9IENQSFlTQUREUihyZWdiYXNlKTsKIAlkZXYtPmRldl9pbnRsZXZlbCAgICA9IDA7CiAJZGV2LT5kZXZfaW50cG9sYXJpdHkgPSAwOwogCWRldi0+ZGV2X3RzaXplICAgICAgID0gdHNpemU7CkBAIC0zNDQsNyArMzQ5LDcgQEAKIAlkYmRldl90YWJfdCBzb3VyY2VfZGV2X3RhYiwgdGFyZ2V0X2Rldl90YWI7CiAJdTMyIGRldl9pZCwgdHNpemUsIGRldndpZHRoLCBmbGFnczsKIAotCWRldl9pZAkgPSBJREVfRERNQV9SRVE7CisJZGV2X2lkCSA9IGh3aWYtPmRkbWFfaWQ7CiAKIAl0c2l6ZSAgICA9ICA4OyAvKiAgMSAqLwogCWRldndpZHRoID0gMzI7IC8qIDE2ICovCkBAIC0zNTYsMjAgKzM2MSwxNyBAQAogI2VuZGlmCiAKIAkvKiBzZXR1cCBkZXZfdGFiIGZvciB0eCBjaGFubmVsICovCi0JYXVpZGVfaW5pdF9kYmRtYV9kZXYoICZzb3VyY2VfZGV2X3RhYiwKLQkJCSAgICAgIGRldl9pZCwKLQkJCSAgICAgIHRzaXplLCBkZXZ3aWR0aCwgREVWX0ZMQUdTX09VVCB8IGZsYWdzKTsKKwlhdWlkZV9pbml0X2RiZG1hX2Rldigmc291cmNlX2Rldl90YWIsIGRldl9pZCwgdHNpemUsIGRldndpZHRoLAorCQkJICAgICBERVZfRkxBR1NfT1VUIHwgZmxhZ3MsIGF1aWRlLT5yZWdiYXNlKTsKICAJYXVpZGUtPnR4X2Rldl9pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoICZzb3VyY2VfZGV2X3RhYiApOwogCi0JYXVpZGVfaW5pdF9kYmRtYV9kZXYoICZzb3VyY2VfZGV2X3RhYiwKLQkJCSAgICAgIGRldl9pZCwKLQkJCSAgICAgIHRzaXplLCBkZXZ3aWR0aCwgREVWX0ZMQUdTX0lOIHwgZmxhZ3MpOworCWF1aWRlX2luaXRfZGJkbWFfZGV2KCZzb3VyY2VfZGV2X3RhYiwgZGV2X2lkLCB0c2l6ZSwgZGV2d2lkdGgsCisJCQkgICAgIERFVl9GTEFHU19JTiB8IGZsYWdzLCBhdWlkZS0+cmVnYmFzZSk7CiAgCWF1aWRlLT5yeF9kZXZfaWQgPSBhdTF4eHhfZGRtYV9hZGRfZGV2aWNlKCAmc291cmNlX2Rldl90YWIgKTsKIAkKIAkvKiBXZSBhbHNvIG5lZWQgdG8gYWRkIGEgdGFyZ2V0IGRldmljZSBmb3IgdGhlIERNQSAqLwotCWF1aWRlX2luaXRfZGJkbWFfZGV2KCAmdGFyZ2V0X2Rldl90YWIsCi0JCQkgICAgICAodTMyKURTQ1JfQ01EMF9BTFdBWVMsCi0JCQkgICAgICB0c2l6ZSwgZGV2d2lkdGgsIERFVl9GTEFHU19BTllVU0UpOworCWF1aWRlX2luaXRfZGJkbWFfZGV2KCZ0YXJnZXRfZGV2X3RhYiwgKHUzMilEU0NSX0NNRDBfQUxXQVlTLCB0c2l6ZSwKKwkJCSAgICAgZGV2d2lkdGgsIERFVl9GTEFHU19BTllVU0UsIGF1aWRlLT5yZWdiYXNlKTsKIAlhdWlkZS0+dGFyZ2V0X2Rldl9pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJnRhcmdldF9kZXZfdGFiKTsJCiAgCiAJLyogR2V0IGEgY2hhbm5lbCBmb3IgVFggKi8KQEAgLTQxMSwxNCArNDEzLDEyIEBACiAjZW5kaWYKIAogCS8qIHNldHVwIGRldl90YWIgZm9yIHR4IGNoYW5uZWwgKi8KLQlhdWlkZV9pbml0X2RiZG1hX2RldiggJnNvdXJjZV9kZXZfdGFiLAotCQkJICAgICAgKHUzMilEU0NSX0NNRDBfQUxXQVlTLAotCQkJICAgICAgOCwgMzIsIERFVl9GTEFHU19PVVQgfCBmbGFncyk7CisJYXVpZGVfaW5pdF9kYmRtYV9kZXYoJnNvdXJjZV9kZXZfdGFiLCAodTMyKURTQ1JfQ01EMF9BTFdBWVMsIDgsIDMyLAorCQkJICAgICBERVZfRkxBR1NfT1VUIHwgZmxhZ3MsIGF1aWRlLT5yZWdiYXNlKTsKICAJYXVpZGUtPnR4X2Rldl9pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoICZzb3VyY2VfZGV2X3RhYiApOwogCi0JYXVpZGVfaW5pdF9kYmRtYV9kZXYoICZzb3VyY2VfZGV2X3RhYiwKLQkJCSAgICAgICh1MzIpRFNDUl9DTUQwX0FMV0FZUywKLQkJCSAgICAgIDgsIDMyLCBERVZfRkxBR1NfSU4gfCBmbGFncyk7CisJYXVpZGVfaW5pdF9kYmRtYV9kZXYoJnNvdXJjZV9kZXZfdGFiLCAodTMyKURTQ1JfQ01EMF9BTFdBWVMsIDgsIDMyLAorCQkJICAgICBERVZfRkxBR1NfSU4gfCBmbGFncywgYXVpZGUtPnJlZ2Jhc2UpOwogIAlhdWlkZS0+cnhfZGV2X2lkID0gYXUxeHh4X2RkbWFfYWRkX2RldmljZSggJnNvdXJjZV9kZXZfdGFiICk7CiAJCiAJLyogR2V0IGEgY2hhbm5lbCBmb3IgVFggKi8KQEAgLTU0MCw2ICs1NDAsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCWlmICghcmVzKSB7CisJCXByX2RlYnVnKCIlczogbm8gRERNQSBJRCByZXNvdXJjZVxuIiwgRFJWX05BTUUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJYWh3aWYtPmRkbWFfaWQgPSByZXMtPnN0YXJ0OworCiAJbWVtc2V0KCZodywgMCwgc2l6ZW9mKGh3KSk7CiAJYXVpZGVfc2V0dXBfcG9ydHMoJmh3LCBhaHdpZik7CiAJaHcuaXJxID0gYWh3aWYtPmlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2J1ZGRoYS5jIGIvZHJpdmVycy9pZGUvYnVkZGhhLmMKaW5kZXggYWI0ZjE2OS4uYjFkMzg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYnVkZGhhLmMKKysrIGIvZHJpdmVycy9pZGUvYnVkZGhhLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY21kNjQwLmMgYi9kcml2ZXJzL2lkZS9jbWQ2NDAuYwppbmRleCBjYjEwMjAxLi5hODFiZDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jbWQ2NDAuYworKysgYi9kcml2ZXJzL2lkZS9jbWQ2NDAuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWFjcGkuYyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKaW5kZXggMmFmOGNiNC4uZjIyZWRjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWFjcGkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWF0YXBpLmMKaW5kZXggNmYyMThlMDEuLmZhYzNkOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCAwNGIwOTU2Li44MTI2ODI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtNDMsNyArNDMsNiBAQAogLyogRm9yIFNDU0kgLT4gQVRBUEkgY29tbWFuZCBjb252ZXJzaW9uICovCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlza19wcm9jLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlza19wcm9jLmMKaW5kZXggZjliYmQ5MC4uOGI1NzBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRpc2tfcHJvYy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrX3Byb2MuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgImlkZS1kaXNrLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYwppbmRleCBlNGNkZjc4Li4yODlkMTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKaW5kZXggZDQxMzY5MC4uMTdhNjVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWVoLmMgYi9kcml2ZXJzL2lkZS9pZGUtZWguYwppbmRleCBjMGFhOTNmLi4zMjk3MDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZWguYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZWguYwpAQCAtMSw1ICsxLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCA2MWZkZjU0NC4uM2Q0MjA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHlfcHJvYy5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMKaW5kZXggZDcxMWQ5Yi4uMTYwMDcyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweV9wcm9jLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvLXN0ZC5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLXN0ZC5jCmluZGV4IDQ2NzIxYzQuLjE5NzYzOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby1zdGQuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8tc3RkLmMKQEAgLTEsNSArMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0FSTSkgfHwgZGVmaW5lZChDT05GSUdfTTY4SykgfHwgZGVmaW5lZChDT05GSUdfTUlQUykgfHwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jIGIvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jCmluZGV4IDk5NjVlY2QuLjRkMTllYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pb2N0bHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMKQEAgLTIsNiArMiw3IEBACiAgKiBJREUgaW9jdGxzIGhhbmRsaW5nLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1sZWdhY3kuYyBiL2RyaXZlcnMvaWRlL2lkZS1sZWdhY3kuYwppbmRleCBiOTY1NGE3Li4zMGZlMzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtbGVnYWN5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxlZ2FjeS5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCiBzdGF0aWMgdm9pZCBpZGVfbGVnYWN5X2luaXRfb25lKHN0cnVjdCBpZGVfaHcgKipod3MsIHN0cnVjdCBpZGVfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IGUzODZhMzIuLmQ5Yzk4MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wbnAuYyBiL2RyaXZlcnMvaWRlL2lkZS1wbnAuYwppbmRleCAwMTdiMWRmLi5lNWYzZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcG5wLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBucC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJpZGUtcG5wIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCA3ZWNiMWFkLi5jZTgyMzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCmluZGV4IDYwMGM4OWEuLjViYzI4MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUteGZlci1tb2RlLmMgYi9kcml2ZXJzL2lkZS9pZGUteGZlci1tb2RlLmMKaW5kZXggNWZjOGQ1Yy4uZWI0MjE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXhmZXItbW9kZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS14ZmVyLW1vZGUuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbWFjaWRlLmMgYi9kcml2ZXJzL2lkZS9tYWNpZGUuYwppbmRleCA1MDVlYzQzLi5hZGM1ZmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9tYWNpZGUuYworKysgYi9kcml2ZXJzL2lkZS9tYWNpZGUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BtYWMuYyBiL2RyaXZlcnMvaWRlL3BtYWMuYwppbmRleCAxZGI3YzQzLi5lOTQ0YzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcG1hYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcTQwaWRlLmMgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwppbmRleCA5MDc4NjA4Li5lY2QwYTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xNDBpZGUuYworKysgYi9kcml2ZXJzL2lkZS9xNDBpZGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lkZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCmluZGV4IGFiM2RiNjEuLjM0YTVlNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCisrKyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jIGIvZHJpdmVycy9pZGUvdGM4NmMwMDEuYwppbmRleCBlNDQ0ZDI0Li40Nzk5ZDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCisrKyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJ0Yzg2YzAwMSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKaW5kZXggYTQ2ZGRkZi4uNWQyZjhlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9td2FpdC5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KIApAQCAtODEsNyArODIsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBsYXBpY190aW1lcl9yZWxpYWJsZV9zdGF0ZXMgPSAoMSA8PCAxKTsJIC8qIERlZmF1bHQgdG8gb25seSBDMSAqLwogCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfZGV2aWNlIF9fcGVyY3B1ICppbnRlbF9pZGxlX2NwdWlkbGVfZGV2aWNlczsKLXN0YXRpYyBpbnQgaW50ZWxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgaW50ZWxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaW5kZXgpOwogCiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgKmNwdWlkbGVfc3RhdGVfdGFibGU7CiAKQEAgLTEwOSw3ICsxMTEsNiBAQAogCXsgLyogTVdBSVQgQzEgKi8KIAkJLm5hbWUgPSAiQzEtTkhNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgwMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MDAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAogCQkuZXhpdF9sYXRlbmN5ID0gMywKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSA2LApAQCAtMTE3LDcgKzExOCw2IEBACiAJeyAvKiBNV0FJVCBDMiAqLwogCQkubmFtZSA9ICJDMy1OSE0iLAogCQkuZGVzYyA9ICJNV0FJVCAweDEwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgxMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCiAJCS5leGl0X2xhdGVuY3kgPSAyMCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSA4MCwKQEAgLTEyNSw3ICsxMjUsNiBAQAogCXsgLyogTVdBSVQgQzMgKi8KIAkJLm5hbWUgPSAiQzYtTkhNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgyMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MjAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMjAwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDgwMCwKQEAgLTEzNyw3ICsxMzYsNiBAQAogCXsgLyogTVdBSVQgQzEgKi8KIAkJLm5hbWUgPSAiQzEtU05CIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgwMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MDAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAogCQkuZXhpdF9sYXRlbmN5ID0gMSwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSAxLApAQCAtMTQ1LDcgKzE0Myw2IEBACiAJeyAvKiBNV0FJVCBDMiAqLwogCQkubmFtZSA9ICJDMy1TTkIiLAogCQkuZGVzYyA9ICJNV0FJVCAweDEwIiwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgxMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCiAJCS5leGl0X2xhdGVuY3kgPSA4MCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSAyMTEsCkBAIC0xNTMsNyArMTUwLDYgQEAKIAl7IC8qIE1XQUlUIEMzICovCiAJCS5uYW1lID0gIkM2LVNOQiIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MjAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDIwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEwNCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSAzNDUsCkBAIC0xNjEsNyArMTU3LDYgQEAKIAl7IC8qIE1XQUlUIEM0ICovCiAJCS5uYW1lID0gIkM3LVNOQiIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MzAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDMwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEwOSwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSAzNDUsCkBAIC0xNzMsNyArMTY4LDYgQEAKIAl7IC8qIE1XQUlUIEMxICovCiAJCS5uYW1lID0gIkMxLUFUTSIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MDAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDAwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEsCiAJCS50YXJnZXRfcmVzaWRlbmN5ID0gNCwKQEAgLTE4MSw3ICsxNzUsNiBAQAogCXsgLyogTVdBSVQgQzIgKi8KIAkJLm5hbWUgPSAiQzItQVRNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHgxMCIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4MTAsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELAogCQkuZXhpdF9sYXRlbmN5ID0gMjAsCiAJCS50YXJnZXRfcmVzaWRlbmN5ID0gODAsCkBAIC0xOTAsNyArMTgzLDYgQEAKIAl7IC8qIE1XQUlUIEM0ICovCiAJCS5uYW1lID0gIkM0LUFUTSIsCiAJCS5kZXNjID0gIk1XQUlUIDB4MzAiLAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDMwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEwMCwKIAkJLnRhcmdldF9yZXNpZGVuY3kgPSA0MDAsCkBAIC0xOTksMjMgKzE5MSw1NSBAQAogCXsgLyogTVdBSVQgQzYgKi8KIAkJLm5hbWUgPSAiQzYtQVRNIiwKIAkJLmRlc2MgPSAiTVdBSVQgMHg1MiIsCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopIDB4NTIsCiAJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElEIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMTQwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDU2MCwKIAkJLmVudGVyID0gJmludGVsX2lkbGUgfSwKIH07CiAKK3N0YXRpYyBpbnQgZ2V0X2RyaXZlcl9kYXRhKGludCBjc3RhdGUpCit7CisJaW50IGRyaXZlcl9kYXRhOworCXN3aXRjaCAoY3N0YXRlKSB7CisKKwljYXNlIDE6CS8qIE1XQUlUIEMxICovCisJCWRyaXZlcl9kYXRhID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgkvKiBNV0FJVCBDMiAqLworCQlkcml2ZXJfZGF0YSA9IDB4MTA7CisJCWJyZWFrOworCWNhc2UgMzoJLyogTVdBSVQgQzMgKi8KKwkJZHJpdmVyX2RhdGEgPSAweDIwOworCQlicmVhazsKKwljYXNlIDQ6CS8qIE1XQUlUIEM0ICovCisJCWRyaXZlcl9kYXRhID0gMHgzMDsKKwkJYnJlYWs7CisJY2FzZSA1OgkvKiBNV0FJVCBDNSAqLworCQlkcml2ZXJfZGF0YSA9IDB4NDA7CisJCWJyZWFrOworCWNhc2UgNjoJLyogTVdBSVQgQzYgKi8KKwkJZHJpdmVyX2RhdGEgPSAweDUyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcml2ZXJfZGF0YSA9IDB4MDA7CisJfQorCXJldHVybiBkcml2ZXJfZGF0YTsKK30KKwogLyoqCiAgKiBpbnRlbF9pZGxlCiAgKiBAZGV2OiBjcHVpZGxlX2RldmljZQotICogQHN0YXRlOiBjcHVpZGxlIHN0YXRlCisgKiBAZHJ2OiBjcHVpZGxlIGRyaXZlcgorICogQGluZGV4OiBpbmRleCBvZiBjcHVpZGxlIHN0YXRlCiAgKgogICovCi1zdGF0aWMgaW50IGludGVsX2lkbGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKK3N0YXRpYyBpbnQgaW50ZWxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCkKIHsKIAl1bnNpZ25lZCBsb25nIGVjeCA9IDE7IC8qIGJyZWFrIG9uIGludGVycnVwdCBmbGFnICovCi0JdW5zaWduZWQgbG9uZyBlYXggPSAodW5zaWduZWQgbG9uZyljcHVpZGxlX2dldF9zdGF0ZWRhdGEoc3RhdGUpOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSA9ICZkcnYtPnN0YXRlc1tpbmRleF07CisJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgKnN0YXRlX3VzYWdlID0gJmRldi0+c3RhdGVzX3VzYWdlW2luZGV4XTsKKwl1bnNpZ25lZCBsb25nIGVheCA9ICh1bnNpZ25lZCBsb25nKWNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZV91c2FnZSk7CiAJdW5zaWduZWQgaW50IGNzdGF0ZTsKIAlrdGltZV90IGt0X2JlZm9yZSwga3RfYWZ0ZXI7CiAJczY0IHVzZWNfZGVsdGE7CkBAIC0yNTYsNyArMjgwLDEwIEBACiAJaWYgKCEobGFwaWNfdGltZXJfcmVsaWFibGVfc3RhdGVzICYgKDEgPDwgKGNzdGF0ZSkpKSkKIAkJY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQsICZjcHUpOwogCi0JcmV0dXJuIHVzZWNfZGVsdGE7CisJLyogVXBkYXRlIGNwdWlkbGUgY291bnRlcnMgKi8KKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0gKGludCl1c2VjX2RlbHRhOworCisJcmV0dXJuIGluZGV4OwogfQogCiBzdGF0aWMgdm9pZCBfX3NldHVwX2Jyb2FkY2FzdF90aW1lcih2b2lkICphcmcpCkBAIC0zOTcsNiArNDI0LDYwIEBACiAJcmV0dXJuOwogfQogLyoKKyAqIGludGVsX2lkbGVfY3B1aWRsZV9kcml2ZXJfaW5pdCgpCisgKiBhbGxvY2F0ZSwgaW5pdGlhbGl6ZSBjcHVpZGxlX3N0YXRlcworICovCitzdGF0aWMgaW50IGludGVsX2lkbGVfY3B1aWRsZV9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCBjc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmaW50ZWxfaWRsZV9kcml2ZXI7CisKKwlkcnYtPnN0YXRlX2NvdW50ID0gMTsKKworCWZvciAoY3N0YXRlID0gMTsgY3N0YXRlIDwgTVdBSVRfTUFYX05VTV9DU1RBVEVTOyArK2NzdGF0ZSkgeworCQlpbnQgbnVtX3N1YnN0YXRlczsKKworCQlpZiAoY3N0YXRlID4gbWF4X2NzdGF0ZSkgeworCQkJcHJpbnRrKFBSRUZJWCAibWF4X2NzdGF0ZSAlZCByZWFjaGVkXG4iLAorCQkJCW1heF9jc3RhdGUpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBkb2VzIHRoZSBzdGF0ZSBleGlzdCBpbiBDUFVJRC5NV0FJVD8gKi8KKwkJbnVtX3N1YnN0YXRlcyA9IChtd2FpdF9zdWJzdGF0ZXMgPj4gKChjc3RhdGUpICogNCkpCisJCQkJCSYgTVdBSVRfU1VCU1RBVEVfTUFTSzsKKwkJaWYgKG51bV9zdWJzdGF0ZXMgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKiBpcyB0aGUgc3RhdGUgbm90IGVuYWJsZWQ/ICovCisJCWlmIChjcHVpZGxlX3N0YXRlX3RhYmxlW2NzdGF0ZV0uZW50ZXIgPT0gTlVMTCkgeworCQkJLyogZG9lcyB0aGUgZHJpdmVyIG5vdCBrbm93IGFib3V0IHRoZSBzdGF0ZT8gKi8KKwkJCWlmICgqY3B1aWRsZV9zdGF0ZV90YWJsZVtjc3RhdGVdLm5hbWUgPT0gJ1wwJykKKwkJCQlwcl9kZWJ1ZyhQUkVGSVggInVuYXdhcmUgb2YgbW9kZWwgMHgleCIKKwkJCQkJIiBNV0FJVCAlZCBwbGVhc2UiCisJCQkJCSIgY29udGFjdCBsZW5iQGtlcm5lbC5vcmciLAorCQkJCWJvb3RfY3B1X2RhdGEueDg2X21vZGVsLCBjc3RhdGUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKGNzdGF0ZSA+IDIpICYmCisJCQkhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDKSkKKwkJCW1hcmtfdHNjX3Vuc3RhYmxlKCJUU0MgaGFsdHMgaW4gaWRsZSIKKwkJCQkJIiBzdGF0ZXMgZGVlcGVyIHRoYW4gQzIiKTsKKworCQlkcnYtPnN0YXRlc1tkcnYtPnN0YXRlX2NvdW50XSA9CS8qIHN0cnVjdHVyZSBjb3B5ICovCisJCQljcHVpZGxlX3N0YXRlX3RhYmxlW2NzdGF0ZV07CisKKwkJZHJ2LT5zdGF0ZV9jb3VudCArPSAxOworCX0KKworCWlmIChhdXRvX2RlbW90aW9uX2Rpc2FibGVfZmxhZ3MpCisJCXNtcF9jYWxsX2Z1bmN0aW9uKGF1dG9fZGVtb3Rpb25fZGlzYWJsZSwgTlVMTCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgogICogaW50ZWxfaWRsZV9jcHVpZGxlX2RldmljZXNfaW5pdCgpCiAgKiBhbGxvY2F0ZSwgaW5pdGlhbGl6ZSwgcmVnaXN0ZXIgY3B1aWRsZV9kZXZpY2VzCiAgKi8KQEAgLTQzMCwyMiArNTExLDExIEBACiAJCQkJY29udGludWU7CiAJCQkvKiBpcyB0aGUgc3RhdGUgbm90IGVuYWJsZWQ/ICovCiAJCQlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZVtjc3RhdGVdLmVudGVyID09IE5VTEwpIHsKLQkJCQkvKiBkb2VzIHRoZSBkcml2ZXIgbm90IGtub3cgYWJvdXQgdGhlIHN0YXRlPyAqLwotCQkJCWlmICgqY3B1aWRsZV9zdGF0ZV90YWJsZVtjc3RhdGVdLm5hbWUgPT0gJ1wwJykKLQkJCQkJcHJfZGVidWcoUFJFRklYICJ1bmF3YXJlIG9mIG1vZGVsIDB4JXgiCi0JCQkJCQkiIE1XQUlUICVkIHBsZWFzZSIKLQkJCQkJCSIgY29udGFjdCBsZW5iQGtlcm5lbC5vcmciLAotCQkJCQlib290X2NwdV9kYXRhLng4Nl9tb2RlbCwgY3N0YXRlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKChjc3RhdGUgPiAyKSAmJgotCQkJCSFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTk9OU1RPUF9UU0MpKQotCQkJCW1hcmtfdHNjX3Vuc3RhYmxlKCJUU0MgaGFsdHMgaW4gaWRsZSIKLQkJCQkJIiBzdGF0ZXMgZGVlcGVyIHRoYW4gQzIiKTsKLQotCQkJZGV2LT5zdGF0ZXNbZGV2LT5zdGF0ZV9jb3VudF0gPQkvKiBzdHJ1Y3R1cmUgY29weSAqLwotCQkJCWNwdWlkbGVfc3RhdGVfdGFibGVbY3N0YXRlXTsKKwkJCWRldi0+c3RhdGVzX3VzYWdlW2Rldi0+c3RhdGVfY291bnRdLmRyaXZlcl9kYXRhID0KKwkJCQkodm9pZCAqKWdldF9kcml2ZXJfZGF0YShjc3RhdGUpOwogCiAJCQlkZXYtPnN0YXRlX2NvdW50ICs9IDE7CiAJCX0KQEAgLTQ1OCw4ICs1MjgsNiBAQAogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9Ci0JaWYgKGF1dG9fZGVtb3Rpb25fZGlzYWJsZV9mbGFncykKLQkJc21wX2NhbGxfZnVuY3Rpb24oYXV0b19kZW1vdGlvbl9kaXNhYmxlLCBOVUxMLCAxKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDc3LDYgKzU0NSw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAorCWludGVsX2lkbGVfY3B1aWRsZV9kcml2ZXJfaW5pdCgpOwogCXJldHZhbCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZpbnRlbF9pZGxlX2RyaXZlcik7CiAJaWYgKHJldHZhbCkgewogCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggImludGVsX2lkbGUgeWllbGRpbmcgdG8gJXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCmluZGV4IDIzNmFkOWEuLjY5MTI3NmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggZmMwZjJiZC4uOGI3MmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC04ODksNiArODkwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJQl9DTV9FU1RBQkxJU0hFRDoKIAkJc3Bpbl91bmxvY2tfaXJxKCZjbV9pZF9wcml2LT5sb2NrKTsKKwkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpCisJCQlicmVhazsKIAkJaWJfc2VuZF9jbV9kcmVxKGNtX2lkLCBOVUxMLCAwKTsKIAkJZ290byByZXRlc3Q7CiAJY2FzZSBJQl9DTV9EUkVRX1NFTlQ6CkBAIC0xMDA4LDcgKzEwMTEsNiBAQAogCXJlcV9tc2ctPnNlcnZpY2VfaWQgPSBwYXJhbS0+c2VydmljZV9pZDsKIAlyZXFfbXNnLT5sb2NhbF9jYV9ndWlkID0gY21faWRfcHJpdi0+aWQuZGV2aWNlLT5ub2RlX2d1aWQ7CiAJY21fcmVxX3NldF9sb2NhbF9xcG4ocmVxX21zZywgY3B1X3RvX2JlMzIocGFyYW0tPnFwX251bSkpOwotCWNtX3JlcV9zZXRfcmVzcF9yZXMocmVxX21zZywgcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXMpOwogCWNtX3JlcV9zZXRfaW5pdF9kZXB0aChyZXFfbXNnLCBwYXJhbS0+aW5pdGlhdG9yX2RlcHRoKTsKIAljbV9yZXFfc2V0X3JlbW90ZV9yZXNwX3RpbWVvdXQocmVxX21zZywKIAkJCQkgICAgICAgcGFyYW0tPnJlbW90ZV9jbV9yZXNwb25zZV90aW1lb3V0KTsKQEAgLTEwMTcsMTIgKzEwMTksMTYgQEAKIAljbV9yZXFfc2V0X3N0YXJ0aW5nX3BzbihyZXFfbXNnLCBjcHVfdG9fYmUzMihwYXJhbS0+c3RhcnRpbmdfcHNuKSk7CiAJY21fcmVxX3NldF9sb2NhbF9yZXNwX3RpbWVvdXQocmVxX21zZywKIAkJCQkgICAgICBwYXJhbS0+bG9jYWxfY21fcmVzcG9uc2VfdGltZW91dCk7Ci0JY21fcmVxX3NldF9yZXRyeV9jb3VudChyZXFfbXNnLCBwYXJhbS0+cmV0cnlfY291bnQpOwogCXJlcV9tc2ctPnBrZXkgPSBwYXJhbS0+cHJpbWFyeV9wYXRoLT5wa2V5OwogCWNtX3JlcV9zZXRfcGF0aF9tdHUocmVxX21zZywgcGFyYW0tPnByaW1hcnlfcGF0aC0+bXR1KTsKLQljbV9yZXFfc2V0X3Jucl9yZXRyeV9jb3VudChyZXFfbXNnLCBwYXJhbS0+cm5yX3JldHJ5X2NvdW50KTsKIAljbV9yZXFfc2V0X21heF9jbV9yZXRyaWVzKHJlcV9tc2csIHBhcmFtLT5tYXhfY21fcmV0cmllcyk7Ci0JY21fcmVxX3NldF9zcnEocmVxX21zZywgcGFyYW0tPnNycSk7CisKKwlpZiAocGFyYW0tPnFwX3R5cGUgIT0gSUJfUVBUX1hSQ19JTkkpIHsKKwkJY21fcmVxX3NldF9yZXNwX3JlcyhyZXFfbXNnLCBwYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlcyk7CisJCWNtX3JlcV9zZXRfcmV0cnlfY291bnQocmVxX21zZywgcGFyYW0tPnJldHJ5X2NvdW50KTsKKwkJY21fcmVxX3NldF9ybnJfcmV0cnlfY291bnQocmVxX21zZywgcGFyYW0tPnJucl9yZXRyeV9jb3VudCk7CisJCWNtX3JlcV9zZXRfc3JxKHJlcV9tc2csIHBhcmFtLT5zcnEpOworCX0KIAogCWlmIChwcmlfcGF0aC0+aG9wX2xpbWl0IDw9IDEpIHsKIAkJcmVxX21zZy0+cHJpbWFyeV9sb2NhbF9saWQgPSBwcmlfcGF0aC0+c2xpZDsKQEAgLTEwODAsNyArMTA4Niw4IEBACiAJaWYgKCFwYXJhbS0+cHJpbWFyeV9wYXRoKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwYXJhbS0+cXBfdHlwZSAhPSBJQl9RUFRfUkMgJiYgcGFyYW0tPnFwX3R5cGUgIT0gSUJfUVBUX1VDKQorCWlmIChwYXJhbS0+cXBfdHlwZSAhPSBJQl9RUFRfUkMgJiYgcGFyYW0tPnFwX3R5cGUgIT0gSUJfUVBUX1VDICYmCisJICAgIHBhcmFtLT5xcF90eXBlICE9IElCX1FQVF9YUkNfSU5JKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChwYXJhbS0+cHJpdmF0ZV9kYXRhICYmCkBAIC0xNjAxLDE4ICsxNjA4LDI0IEBACiAJY21fZm9ybWF0X21hZF9oZHIoJnJlcF9tc2ctPmhkciwgQ01fUkVQX0FUVFJfSUQsIGNtX2lkX3ByaXYtPnRpZCk7CiAJcmVwX21zZy0+bG9jYWxfY29tbV9pZCA9IGNtX2lkX3ByaXYtPmlkLmxvY2FsX2lkOwogCXJlcF9tc2ctPnJlbW90ZV9jb21tX2lkID0gY21faWRfcHJpdi0+aWQucmVtb3RlX2lkOwotCWNtX3JlcF9zZXRfbG9jYWxfcXBuKHJlcF9tc2csIGNwdV90b19iZTMyKHBhcmFtLT5xcF9udW0pKTsKIAljbV9yZXBfc2V0X3N0YXJ0aW5nX3BzbihyZXBfbXNnLCBjcHVfdG9fYmUzMihwYXJhbS0+c3RhcnRpbmdfcHNuKSk7CiAJcmVwX21zZy0+cmVzcF9yZXNvdXJjZXMgPSBwYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlczsKLQlyZXBfbXNnLT5pbml0aWF0b3JfZGVwdGggPSBwYXJhbS0+aW5pdGlhdG9yX2RlcHRoOwogCWNtX3JlcF9zZXRfdGFyZ2V0X2Fja19kZWxheShyZXBfbXNnLAogCQkJCSAgICBjbV9pZF9wcml2LT5hdi5wb3J0LT5jbV9kZXYtPmFja19kZWxheSk7CiAJY21fcmVwX3NldF9mYWlsb3ZlcihyZXBfbXNnLCBwYXJhbS0+ZmFpbG92ZXJfYWNjZXB0ZWQpOwotCWNtX3JlcF9zZXRfZmxvd19jdHJsKHJlcF9tc2csIHBhcmFtLT5mbG93X2NvbnRyb2wpOwogCWNtX3JlcF9zZXRfcm5yX3JldHJ5X2NvdW50KHJlcF9tc2csIHBhcmFtLT5ybnJfcmV0cnlfY291bnQpOwotCWNtX3JlcF9zZXRfc3JxKHJlcF9tc2csIHBhcmFtLT5zcnEpOwogCXJlcF9tc2ctPmxvY2FsX2NhX2d1aWQgPSBjbV9pZF9wcml2LT5pZC5kZXZpY2UtPm5vZGVfZ3VpZDsKIAorCWlmIChjbV9pZF9wcml2LT5xcF90eXBlICE9IElCX1FQVF9YUkNfVEdUKSB7CisJCXJlcF9tc2ctPmluaXRpYXRvcl9kZXB0aCA9IHBhcmFtLT5pbml0aWF0b3JfZGVwdGg7CisJCWNtX3JlcF9zZXRfZmxvd19jdHJsKHJlcF9tc2csIHBhcmFtLT5mbG93X2NvbnRyb2wpOworCQljbV9yZXBfc2V0X3NycShyZXBfbXNnLCBwYXJhbS0+c3JxKTsKKwkJY21fcmVwX3NldF9sb2NhbF9xcG4ocmVwX21zZywgY3B1X3RvX2JlMzIocGFyYW0tPnFwX251bSkpOworCX0gZWxzZSB7CisJCWNtX3JlcF9zZXRfc3JxKHJlcF9tc2csIDEpOworCQljbV9yZXBfc2V0X2xvY2FsX2VlY24ocmVwX21zZywgY3B1X3RvX2JlMzIocGFyYW0tPnFwX251bSkpOworCX0KKwogCWlmIChwYXJhbS0+cHJpdmF0ZV9kYXRhICYmIHBhcmFtLT5wcml2YXRlX2RhdGFfbGVuKQogCQltZW1jcHkocmVwX21zZy0+cHJpdmF0ZV9kYXRhLCBwYXJhbS0+cHJpdmF0ZV9kYXRhLAogCQkgICAgICAgcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4pOwpAQCAtMTY2MCw3ICsxNjczLDcgQEAKIAljbV9pZF9wcml2LT5pbml0aWF0b3JfZGVwdGggPSBwYXJhbS0+aW5pdGlhdG9yX2RlcHRoOwogCWNtX2lkX3ByaXYtPnJlc3BvbmRlcl9yZXNvdXJjZXMgPSBwYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlczsKIAljbV9pZF9wcml2LT5ycV9wc24gPSBjbV9yZXBfZ2V0X3N0YXJ0aW5nX3BzbihyZXBfbXNnKTsKLQljbV9pZF9wcml2LT5sb2NhbF9xcG4gPSBjbV9yZXBfZ2V0X2xvY2FsX3FwbihyZXBfbXNnKTsKKwljbV9pZF9wcml2LT5sb2NhbF9xcG4gPSBjcHVfdG9fYmUzMihwYXJhbS0+cXBfbnVtICYgMHhGRkZGRkYpOwogCiBvdXQ6CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTczMSw3ICsxNzQ0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWJfc2VuZF9jbV9ydHUpOwogCi1zdGF0aWMgdm9pZCBjbV9mb3JtYXRfcmVwX2V2ZW50KHN0cnVjdCBjbV93b3JrICp3b3JrKQorc3RhdGljIHZvaWQgY21fZm9ybWF0X3JlcF9ldmVudChzdHJ1Y3QgY21fd29yayAqd29yaywgZW51bSBpYl9xcF90eXBlIHFwX3R5cGUpCiB7CiAJc3RydWN0IGNtX3JlcF9tc2cgKnJlcF9tc2c7CiAJc3RydWN0IGliX2NtX3JlcF9ldmVudF9wYXJhbSAqcGFyYW07CkBAIC0xNzQwLDcgKzE3NTMsNyBAQAogCXBhcmFtID0gJndvcmstPmNtX2V2ZW50LnBhcmFtLnJlcF9yY3ZkOwogCXBhcmFtLT5yZW1vdGVfY2FfZ3VpZCA9IHJlcF9tc2ctPmxvY2FsX2NhX2d1aWQ7CiAJcGFyYW0tPnJlbW90ZV9xa2V5ID0gYmUzMl90b19jcHUocmVwX21zZy0+bG9jYWxfcWtleSk7Ci0JcGFyYW0tPnJlbW90ZV9xcG4gPSBiZTMyX3RvX2NwdShjbV9yZXBfZ2V0X2xvY2FsX3FwbihyZXBfbXNnKSk7CisJcGFyYW0tPnJlbW90ZV9xcG4gPSBiZTMyX3RvX2NwdShjbV9yZXBfZ2V0X3FwbihyZXBfbXNnLCBxcF90eXBlKSk7CiAJcGFyYW0tPnN0YXJ0aW5nX3BzbiA9IGJlMzJfdG9fY3B1KGNtX3JlcF9nZXRfc3RhcnRpbmdfcHNuKHJlcF9tc2cpKTsKIAlwYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlcyA9IHJlcF9tc2ctPmluaXRpYXRvcl9kZXB0aDsKIAlwYXJhbS0+aW5pdGlhdG9yX2RlcHRoID0gcmVwX21zZy0+cmVzcF9yZXNvdXJjZXM7CkBAIC0xODA4LDcgKzE4MjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljbV9mb3JtYXRfcmVwX2V2ZW50KHdvcmspOworCWNtX2Zvcm1hdF9yZXBfZXZlbnQod29yaywgY21faWRfcHJpdi0+cXBfdHlwZSk7CiAKIAlzcGluX2xvY2tfaXJxKCZjbV9pZF9wcml2LT5sb2NrKTsKIAlzd2l0Y2ggKGNtX2lkX3ByaXYtPmlkLnN0YXRlKSB7CkBAIC0xODIzLDcgKzE4MzYsNyBAQAogCiAJY21faWRfcHJpdi0+dGltZXdhaXRfaW5mby0+d29yay5yZW1vdGVfaWQgPSByZXBfbXNnLT5sb2NhbF9jb21tX2lkOwogCWNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8tPnJlbW90ZV9jYV9ndWlkID0gcmVwX21zZy0+bG9jYWxfY2FfZ3VpZDsKLQljbV9pZF9wcml2LT50aW1ld2FpdF9pbmZvLT5yZW1vdGVfcXBuID0gY21fcmVwX2dldF9sb2NhbF9xcG4ocmVwX21zZyk7CisJY21faWRfcHJpdi0+dGltZXdhaXRfaW5mby0+cmVtb3RlX3FwbiA9IGNtX3JlcF9nZXRfcXBuKHJlcF9tc2csIGNtX2lkX3ByaXYtPnFwX3R5cGUpOwogCiAJc3Bpbl9sb2NrKCZjbS5sb2NrKTsKIAkvKiBDaGVjayBmb3IgZHVwbGljYXRlIFJFUC4gKi8KQEAgLTE4NTAsNyArMTg2Myw3IEBACiAKIAljbV9pZF9wcml2LT5pZC5zdGF0ZSA9IElCX0NNX1JFUF9SQ1ZEOwogCWNtX2lkX3ByaXYtPmlkLnJlbW90ZV9pZCA9IHJlcF9tc2ctPmxvY2FsX2NvbW1faWQ7Ci0JY21faWRfcHJpdi0+cmVtb3RlX3FwbiA9IGNtX3JlcF9nZXRfbG9jYWxfcXBuKHJlcF9tc2cpOworCWNtX2lkX3ByaXYtPnJlbW90ZV9xcG4gPSBjbV9yZXBfZ2V0X3FwbihyZXBfbXNnLCBjbV9pZF9wcml2LT5xcF90eXBlKTsKIAljbV9pZF9wcml2LT5pbml0aWF0b3JfZGVwdGggPSByZXBfbXNnLT5yZXNwX3Jlc291cmNlczsKIAljbV9pZF9wcml2LT5yZXNwb25kZXJfcmVzb3VyY2VzID0gcmVwX21zZy0+aW5pdGlhdG9yX2RlcHRoOwogCWNtX2lkX3ByaXYtPnNxX3BzbiA9IGNtX3JlcF9nZXRfc3RhcnRpbmdfcHNuKHJlcF9tc2cpOwpAQCAtMzQ5Miw3ICszNTA1LDggQEAKIAkJcXBfYXR0ci0+cGF0aF9tdHUgPSBjbV9pZF9wcml2LT5wYXRoX210dTsKIAkJcXBfYXR0ci0+ZGVzdF9xcF9udW0gPSBiZTMyX3RvX2NwdShjbV9pZF9wcml2LT5yZW1vdGVfcXBuKTsKIAkJcXBfYXR0ci0+cnFfcHNuID0gYmUzMl90b19jcHUoY21faWRfcHJpdi0+cnFfcHNuKTsKLQkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1JDKSB7CisJCWlmIChjbV9pZF9wcml2LT5xcF90eXBlID09IElCX1FQVF9SQyB8fAorCQkgICAgY21faWRfcHJpdi0+cXBfdHlwZSA9PSBJQl9RUFRfWFJDX1RHVCkgewogCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMgfAogCQkJCQkgSUJfUVBfTUlOX1JOUl9USU1FUjsKIAkJCXFwX2F0dHItPm1heF9kZXN0X3JkX2F0b21pYyA9CkBAIC0zNTM3LDE1ICszNTUxLDIxIEBACiAJCWlmIChjbV9pZF9wcml2LT5pZC5sYXBfc3RhdGUgPT0gSUJfQ01fTEFQX1VOSU5JVCkgewogCQkJKnFwX2F0dHJfbWFzayA9IElCX1FQX1NUQVRFIHwgSUJfUVBfU1FfUFNOOwogCQkJcXBfYXR0ci0+c3FfcHNuID0gYmUzMl90b19jcHUoY21faWRfcHJpdi0+c3FfcHNuKTsKLQkJCWlmIChjbV9pZF9wcml2LT5xcF90eXBlID09IElCX1FQVF9SQykgewotCQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfVElNRU9VVCB8IElCX1FQX1JFVFJZX0NOVCB8Ci0JCQkJCQkgSUJfUVBfUk5SX1JFVFJZIHwKKwkJCXN3aXRjaCAoY21faWRfcHJpdi0+cXBfdHlwZSkgeworCQkJY2FzZSBJQl9RUFRfUkM6CisJCQljYXNlIElCX1FQVF9YUkNfSU5JOgorCQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfUkVUUllfQ05UIHwgSUJfUVBfUk5SX1JFVFJZIHwKIAkJCQkJCSBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDOwotCQkJCXFwX2F0dHItPnRpbWVvdXQgPSBjbV9pZF9wcml2LT5hdi50aW1lb3V0OwogCQkJCXFwX2F0dHItPnJldHJ5X2NudCA9IGNtX2lkX3ByaXYtPnJldHJ5X2NvdW50OwogCQkJCXFwX2F0dHItPnJucl9yZXRyeSA9IGNtX2lkX3ByaXYtPnJucl9yZXRyeV9jb3VudDsKLQkJCQlxcF9hdHRyLT5tYXhfcmRfYXRvbWljID0KLQkJCQkJY21faWRfcHJpdi0+aW5pdGlhdG9yX2RlcHRoOworCQkJCXFwX2F0dHItPm1heF9yZF9hdG9taWMgPSBjbV9pZF9wcml2LT5pbml0aWF0b3JfZGVwdGg7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlIElCX1FQVF9YUkNfVEdUOgorCQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfVElNRU9VVDsKKwkJCQlxcF9hdHRyLT50aW1lb3V0ID0gY21faWRfcHJpdi0+YXYudGltZW91dDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoY21faWRfcHJpdi0+YWx0X2F2LmFoX2F0dHIuZGxpZCkgewogCQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfUEFUSF9NSUdfU1RBVEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbV9tc2dzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbV9tc2dzLmgKaW5kZXggN2U2M2MwOC4uNTA1ZGIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21fbXNncy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtX21zZ3MuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExIEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtODYsNyArODYsNyBAQAogCV9fYmUxNiBwa2V5OwogCS8qIHBhdGggTVRVOjQsIFJEQyBleGlzdHM6MSwgUk5SIHJldHJ5IGNvdW50OjMuICovCiAJdTggb2Zmc2V0NTA7Ci0JLyogbWF4IENNIFJldHJpZXM6NCwgU1JROjEsIHJzdmQ6MyAqLworCS8qIG1heCBDTSBSZXRyaWVzOjQsIFNSUToxLCBleHRlbmRlZCB0cmFuc3BvcnQgdHlwZTozICovCiAJdTggb2Zmc2V0NTE7CiAKIAlfX2JlMTYgcHJpbWFyeV9sb2NhbF9saWQ7CkBAIC0xNzUsNiArMTc1LDExIEBACiAJc3dpdGNoKHRyYW5zcG9ydF90eXBlKSB7CiAJY2FzZSAwOiByZXR1cm4gSUJfUVBUX1JDOwogCWNhc2UgMTogcmV0dXJuIElCX1FQVF9VQzsKKwljYXNlIDM6CisJCXN3aXRjaCAocmVxX21zZy0+b2Zmc2V0NTEgJiAweDcpIHsKKwkJY2FzZSAxOiByZXR1cm4gSUJfUVBUX1hSQ19UR1Q7CisJCWRlZmF1bHQ6IHJldHVybiAwOworCQl9CiAJZGVmYXVsdDogcmV0dXJuIDA7CiAJfQogfQpAQCAtMTg4LDYgKzE5MywxMiBAQAogCQkJCQkJICByZXFfbXNnLT5vZmZzZXQ0MCkgJgogCQkJCQkJICAgMHhGRkZGRkZGOSkgfCAweDIpOwogCQlicmVhazsKKwljYXNlIElCX1FQVF9YUkNfSU5JOgorCQlyZXFfbXNnLT5vZmZzZXQ0MCA9IGNwdV90b19iZTMyKChiZTMyX3RvX2NwdSgKKwkJCQkJCSByZXFfbXNnLT5vZmZzZXQ0MCkgJgorCQkJCQkJICAgMHhGRkZGRkZGOSkgfCAweDYpOworCQlyZXFfbXNnLT5vZmZzZXQ1MSA9IChyZXFfbXNnLT5vZmZzZXQ1MSAmIDB4RjgpIHwgMTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVxX21zZy0+b2Zmc2V0NDAgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdSgKIAkJCQkJCSByZXFfbXNnLT5vZmZzZXQ0MCkgJgpAQCAtNTI3LDYgKzUzOCwyMyBAQAogCQkJICAgIChiZTMyX3RvX2NwdShyZXBfbXNnLT5vZmZzZXQxMikgJiAweDAwMDAwMEZGKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX19iZTMyIGNtX3JlcF9nZXRfbG9jYWxfZWVjbihzdHJ1Y3QgY21fcmVwX21zZyAqcmVwX21zZykKK3sKKwlyZXR1cm4gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUocmVwX21zZy0+b2Zmc2V0MTYpID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY21fcmVwX3NldF9sb2NhbF9lZWNuKHN0cnVjdCBjbV9yZXBfbXNnICpyZXBfbXNnLCBfX2JlMzIgZWVjbikKK3sKKwlyZXBfbXNnLT5vZmZzZXQxNiA9IGNwdV90b19iZTMyKChiZTMyX3RvX2NwdShlZWNuKSA8PCA4KSB8CisJCQkgICAgKGJlMzJfdG9fY3B1KHJlcF9tc2ctPm9mZnNldDE2KSAmIDB4MDAwMDAwRkYpKTsKK30KKworc3RhdGljIGlubGluZSBfX2JlMzIgY21fcmVwX2dldF9xcG4oc3RydWN0IGNtX3JlcF9tc2cgKnJlcF9tc2csIGVudW0gaWJfcXBfdHlwZSBxcF90eXBlKQoreworCXJldHVybiAocXBfdHlwZSA9PSBJQl9RUFRfWFJDX0lOSSkgPworCQljbV9yZXBfZ2V0X2xvY2FsX2VlY24ocmVwX21zZykgOiBjbV9yZXBfZ2V0X2xvY2FsX3FwbihyZXBfbXNnKTsKK30KKwogc3RhdGljIGlubGluZSBfX2JlMzIgY21fcmVwX2dldF9zdGFydGluZ19wc24oc3RydWN0IGNtX3JlcF9tc2cgKnJlcF9tc2cpCiB7CiAJcmV0dXJuIGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KHJlcF9tc2ctPm9mZnNldDIwKSA+PiA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKaW5kZXggY2E0YzVkYy4uNzVmZjgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CkBAIC04MSw2ICs4Miw3IEBACiBzdGF0aWMgREVGSU5FX0lEUih0Y3BfcHMpOwogc3RhdGljIERFRklORV9JRFIodWRwX3BzKTsKIHN0YXRpYyBERUZJTkVfSURSKGlwb2liX3BzKTsKK3N0YXRpYyBERUZJTkVfSURSKGliX3BzKTsKIAogc3RydWN0IGNtYV9kZXZpY2UgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKQEAgLTExNzksNiArMTE4MSwxNSBAQAogCWV2ZW50LT5wYXJhbS5jb25uLnFwX251bSA9IHJlcV9kYXRhLT5yZW1vdGVfcXBuOwogfQogCitzdGF0aWMgaW50IGNtYV9jaGVja19yZXFfcXBfdHlwZShzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIHN0cnVjdCBpYl9jbV9ldmVudCAqaWJfZXZlbnQpCit7CisJcmV0dXJuICgoKGliX2V2ZW50LT5ldmVudCA9PSBJQl9DTV9SRVFfUkVDRUlWRUQpIHx8CisJCSAoaWJfZXZlbnQtPnBhcmFtLnJlcV9yY3ZkLnFwX3R5cGUgPT0gaWQtPnFwX3R5cGUpKSB8fAorCQkoKGliX2V2ZW50LT5ldmVudCA9PSBJQl9DTV9TSURSX1JFUV9SRUNFSVZFRCkgJiYKKwkJIChpZC0+cXBfdHlwZSA9PSBJQl9RUFRfVUQpKSB8fAorCQkoIWlkLT5xcF90eXBlKSk7Cit9CisKIHN0YXRpYyBpbnQgY21hX3JlcV9oYW5kbGVyKHN0cnVjdCBpYl9jbV9pZCAqY21faWQsIHN0cnVjdCBpYl9jbV9ldmVudCAqaWJfZXZlbnQpCiB7CiAJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqbGlzdGVuX2lkLCAqY29ubl9pZDsKQEAgLTExODYsMTMgKzExOTcsMTYgQEAKIAlpbnQgb2Zmc2V0LCByZXQ7CiAKIAlsaXN0ZW5faWQgPSBjbV9pZC0+Y29udGV4dDsKKwlpZiAoIWNtYV9jaGVja19yZXFfcXBfdHlwZSgmbGlzdGVuX2lkLT5pZCwgaWJfZXZlbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChjbWFfZGlzYWJsZV9jYWxsYmFjayhsaXN0ZW5faWQsIFJETUFfQ01fTElTVEVOKSkKIAkJcmV0dXJuIC1FQ09OTkFCT1JURUQ7CiAKIAltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YgZXZlbnQpOwogCW9mZnNldCA9IGNtYV91c2VyX2RhdGFfb2Zmc2V0KGxpc3Rlbl9pZC0+aWQucHMpOwogCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q7Ci0JaWYgKGxpc3Rlbl9pZC0+aWQucXBfdHlwZSA9PSBJQl9RUFRfVUQpIHsKKwlpZiAoaWJfZXZlbnQtPmV2ZW50ID09IElCX0NNX1NJRFJfUkVRX1JFQ0VJVkVEKSB7CiAJCWNvbm5faWQgPSBjbWFfbmV3X3VkcF9pZCgmbGlzdGVuX2lkLT5pZCwgaWJfZXZlbnQpOwogCQlldmVudC5wYXJhbS51ZC5wcml2YXRlX2RhdGEgPSBpYl9ldmVudC0+cHJpdmF0ZV9kYXRhICsgb2Zmc2V0OwogCQlldmVudC5wYXJhbS51ZC5wcml2YXRlX2RhdGFfbGVuID0KQEAgLTEzMjgsNiArMTM0Miw4IEBACiAJCXN3aXRjaCAoaXdfZXZlbnQtPnN0YXR1cykgewogCQljYXNlIDA6CiAJCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQ7CisJCQlldmVudC5wYXJhbS5jb25uLmluaXRpYXRvcl9kZXB0aCA9IGl3X2V2ZW50LT5pcmQ7CisJCQlldmVudC5wYXJhbS5jb25uLnJlc3BvbmRlcl9yZXNvdXJjZXMgPSBpd19ldmVudC0+b3JkOwogCQkJYnJlYWs7CiAJCWNhc2UgLUVDT05OUkVTRVQ6CiAJCWNhc2UgLUVDT05OUkVGVVNFRDoKQEAgLTEzNDMsNiArMTM1OSw4IEBACiAJCWJyZWFrOwogCWNhc2UgSVdfQ01fRVZFTlRfRVNUQUJMSVNIRUQ6CiAJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwkJZXZlbnQucGFyYW0uY29ubi5pbml0aWF0b3JfZGVwdGggPSBpd19ldmVudC0+aXJkOworCQlldmVudC5wYXJhbS5jb25uLnJlc3BvbmRlcl9yZXNvdXJjZXMgPSBpd19ldmVudC0+b3JkOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUdfT04oMSk7CkBAIC0xNDMzLDggKzE0NTEsOCBAQAogCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q7CiAJZXZlbnQucGFyYW0uY29ubi5wcml2YXRlX2RhdGEgPSBpd19ldmVudC0+cHJpdmF0ZV9kYXRhOwogCWV2ZW50LnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhX2xlbiA9IGl3X2V2ZW50LT5wcml2YXRlX2RhdGFfbGVuOwotCWV2ZW50LnBhcmFtLmNvbm4uaW5pdGlhdG9yX2RlcHRoID0gYXR0ci5tYXhfcXBfaW5pdF9yZF9hdG9tOwotCWV2ZW50LnBhcmFtLmNvbm4ucmVzcG9uZGVyX3Jlc291cmNlcyA9IGF0dHIubWF4X3FwX3JkX2F0b207CisJZXZlbnQucGFyYW0uY29ubi5pbml0aWF0b3JfZGVwdGggPSBpd19ldmVudC0+aXJkOworCWV2ZW50LnBhcmFtLmNvbm4ucmVzcG9uZGVyX3Jlc291cmNlcyA9IGl3X2V2ZW50LT5vcmQ7CiAKIAkvKgogCSAqIFByb3RlY3QgYWdhaW5zdCB0aGUgdXNlciBkZXN0cm95aW5nIGNvbm5faWQgZnJvbSBhbm90aGVyIHRocmVhZApAQCAtMjIzNCw2ICsyMjUyLDkgQEAKIAljYXNlIFJETUFfUFNfSVBPSUI6CiAJCXBzID0gJmlwb2liX3BzOwogCQlicmVhazsKKwljYXNlIFJETUFfUFNfSUI6CisJCXBzID0gJmliX3BzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAl9CkBAIC0yNTY5LDcgKzI1OTAsNyBAQAogCXJlcS5zZXJ2aWNlX2lkID0gY21hX2dldF9zZXJ2aWNlX2lkKGlkX3ByaXYtPmlkLnBzLAogCQkJCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmcm91dGUtPmFkZHIuZHN0X2FkZHIpOwogCXJlcS5xcF9udW0gPSBpZF9wcml2LT5xcF9udW07Ci0JcmVxLnFwX3R5cGUgPSBJQl9RUFRfUkM7CisJcmVxLnFwX3R5cGUgPSBpZF9wcml2LT5pZC5xcF90eXBlOwogCXJlcS5zdGFydGluZ19wc24gPSBpZF9wcml2LT5zZXFfbnVtOwogCXJlcS5yZXNwb25kZXJfcmVzb3VyY2VzID0gY29ubl9wYXJhbS0+cmVzcG9uZGVyX3Jlc291cmNlczsKIAlyZXEuaW5pdGlhdG9yX2RlcHRoID0gY29ubl9wYXJhbS0+aW5pdGlhdG9yX2RlcHRoOwpAQCAtMjYxNiwxNCArMjYzNywxNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaXdfcGFyYW0ub3JkID0gY29ubl9wYXJhbS0+aW5pdGlhdG9yX2RlcHRoOwotCWl3X3BhcmFtLmlyZCA9IGNvbm5fcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXM7Ci0JaXdfcGFyYW0ucHJpdmF0ZV9kYXRhID0gY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhOwotCWl3X3BhcmFtLnByaXZhdGVfZGF0YV9sZW4gPSBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuOwotCWlmIChpZF9wcml2LT5pZC5xcCkKKwlpZiAoY29ubl9wYXJhbSkgeworCQlpd19wYXJhbS5vcmQgPSBjb25uX3BhcmFtLT5pbml0aWF0b3JfZGVwdGg7CisJCWl3X3BhcmFtLmlyZCA9IGNvbm5fcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXM7CisJCWl3X3BhcmFtLnByaXZhdGVfZGF0YSA9IGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YTsKKwkJaXdfcGFyYW0ucHJpdmF0ZV9kYXRhX2xlbiA9IGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW47CisJCWl3X3BhcmFtLnFwbiA9IGlkX3ByaXYtPmlkLnFwID8gaWRfcHJpdi0+cXBfbnVtIDogY29ubl9wYXJhbS0+cXBfbnVtOworCX0gZWxzZSB7CisJCW1lbXNldCgmaXdfcGFyYW0sIDAsIHNpemVvZiBpd19wYXJhbSk7CiAJCWl3X3BhcmFtLnFwbiA9IGlkX3ByaXYtPnFwX251bTsKLQllbHNlCi0JCWl3X3BhcmFtLnFwbiA9IGNvbm5fcGFyYW0tPnFwX251bTsKKwl9CiAJcmV0ID0gaXdfY21fY29ubmVjdChjbV9pZCwgJml3X3BhcmFtKTsKIG91dDoKIAlpZiAocmV0KSB7CkBAIC0yNzY1LDE0ICsyNzg4LDIwIEBACiAKIAlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGlkLT5kZXZpY2UtPm5vZGVfdHlwZSkpIHsKIAljYXNlIFJETUFfVFJBTlNQT1JUX0lCOgotCQlpZiAoaWQtPnFwX3R5cGUgPT0gSUJfUVBUX1VEKQotCQkJcmV0ID0gY21hX3NlbmRfc2lkcl9yZXAoaWRfcHJpdiwgSUJfU0lEUl9TVUNDRVNTLAotCQkJCQkJY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLAotCQkJCQkJY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7Ci0JCWVsc2UgaWYgKGNvbm5fcGFyYW0pCi0JCQlyZXQgPSBjbWFfYWNjZXB0X2liKGlkX3ByaXYsIGNvbm5fcGFyYW0pOwotCQllbHNlCi0JCQlyZXQgPSBjbWFfcmVwX3JlY3YoaWRfcHJpdik7CisJCWlmIChpZC0+cXBfdHlwZSA9PSBJQl9RUFRfVUQpIHsKKwkJCWlmIChjb25uX3BhcmFtKQorCQkJCXJldCA9IGNtYV9zZW5kX3NpZHJfcmVwKGlkX3ByaXYsIElCX1NJRFJfU1VDQ0VTUywKKwkJCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCisJCQkJCQkJY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7CisJCQllbHNlCisJCQkJcmV0ID0gY21hX3NlbmRfc2lkcl9yZXAoaWRfcHJpdiwgSUJfU0lEUl9TVUNDRVNTLAorCQkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJaWYgKGNvbm5fcGFyYW0pCisJCQkJcmV0ID0gY21hX2FjY2VwdF9pYihpZF9wcml2LCBjb25uX3BhcmFtKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBjbWFfcmVwX3JlY3YoaWRfcHJpdik7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBSRE1BX1RSQU5TUE9SVF9JV0FSUDoKIAkJcmV0ID0gY21hX2FjY2VwdF9pdyhpZF9wcml2LCBjb25uX3BhcmFtKTsKQEAgLTM0NjAsNiArMzQ4OSw3IEBACiAJaWRyX2Rlc3Ryb3koJnRjcF9wcyk7CiAJaWRyX2Rlc3Ryb3koJnVkcF9wcyk7CiAJaWRyX2Rlc3Ryb3koJmlwb2liX3BzKTsKKwlpZHJfZGVzdHJveSgmaWJfcHMpOwogfQogCiBtb2R1bGVfaW5pdChjbWFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9mbXJfcG9vbC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZm1yX3Bvb2wuYwppbmRleCA0NTA3MDQzLi4xNzZjOGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9mbXJfcG9vbC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2Ztcl9wb29sLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKaW5kZXggYTljMDQyMy4uMWE2OTZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxyZG1hL2l3X2NtLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9hZGRyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCmluZGV4IGI0ZDg2NzIuLjJmZTQyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZC5jCkBAIC0zNSw2ICszNSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxyZG1hL2liX2NhY2hlLmg+CiAKICNpbmNsdWRlICJtYWRfcHJpdi5oIgpAQCAtMTU5Niw2ICsxNTk3LDkgQEAKIAkJCQkJbWFkLT5tYWRfaGRyLmNsYXNzX3ZlcnNpb25dLmNsYXNzOwogCQkJaWYgKCFjbGFzcykKIAkJCQlnb3RvIG91dDsKKwkJCWlmIChjb252ZXJ0X21nbXRfY2xhc3MobWFkLT5tYWRfaGRyLm1nbXRfY2xhc3MpID49CisJCQkgICAgSUJfTUdNVF9NQVhfTUVUSE9EUykKKwkJCQlnb3RvIG91dDsKIAkJCW1ldGhvZCA9IGNsYXNzLT5tZXRob2RfdGFibGVbY29udmVydF9tZ210X2NsYXNzKAogCQkJCQkJCW1hZC0+bWFkX2hkci5tZ210X2NsYXNzKV07CiAJCQlpZiAobWV0aG9kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwppbmRleCA2OGI0MTYyLi5kMjM2MGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbmV0bGluay5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbmV0bGluay5jCmluZGV4IDkyMjdmNGEuLmQxYzgxOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL25ldGxpbmsuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9uZXRsaW5rLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6JXM6ICIgZm10LCBLQlVJTERfTU9ETkFNRSwgX19mdW5jX18KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvcGFja2VyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYwppbmRleCAwMTliZDRiLi4xYjY1OTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYwpAQCAtMzEsNiArMzEsNyBAQAogICogU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8cmRtYS9pYl9wYWNrLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwppbmRleCA5YWI1ZGY3Li5jNjFiY2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJjb3JlX3ByaXYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX21hZC5oPgpAQCAtMTg1LDE3ICsxODYsMzUgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcmF0ZSA9ICgyNSAqIGF0dHIuYWN0aXZlX3NwZWVkKSAvIDEwOworCiAJc3dpdGNoIChhdHRyLmFjdGl2ZV9zcGVlZCkgewotCWNhc2UgMjogc3BlZWQgPSAiIEREUiI7IGJyZWFrOwotCWNhc2UgNDogc3BlZWQgPSAiIFFEUiI7IGJyZWFrOworCWNhc2UgMjoKKwkJc3BlZWQgPSAiIEREUiI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3BlZWQgPSAiIFFEUiI7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3BlZWQgPSAiIEZEUjEwIjsKKwkJcmF0ZSA9IDEwOworCQlicmVhazsKKwljYXNlIDE2OgorCQlzcGVlZCA9ICIgRkRSIjsKKwkJcmF0ZSA9IDE0OworCQlicmVhazsKKwljYXNlIDMyOgorCQlzcGVlZCA9ICIgRURSIjsKKwkJcmF0ZSA9IDI1OworCQlicmVhazsKIAl9CiAKLQlyYXRlID0gMjUgKiBpYl93aWR0aF9lbnVtX3RvX2ludChhdHRyLmFjdGl2ZV93aWR0aCkgKiBhdHRyLmFjdGl2ZV9zcGVlZDsKKwlyYXRlICo9IGliX3dpZHRoX2VudW1fdG9faW50KGF0dHIuYWN0aXZlX3dpZHRoKTsKIAlpZiAocmF0ZSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQlcyBHYi9zZWMgKCVkWCVzKVxuIiwKLQkJICAgICAgIHJhdGUgLyAxMCwgcmF0ZSAlIDEwID8gIi41IiA6ICIiLAorCQkgICAgICAgcmF0ZSwgKGF0dHIuYWN0aXZlX3NwZWVkID09IDEpID8gIi41IiA6ICIiLAogCQkgICAgICAgaWJfd2lkdGhfZW51bV90b19pbnQoYXR0ci5hY3RpdmVfd2lkdGgpLCBzcGVlZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKaW5kZXggMDhmOTQ4ZC4uYjhhMGI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKQEAgLTExMjIsNyArMTEyMiw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIGJ1Ziwgc2l6ZW9mKGhkcikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChoZHIuY21kIDwgMCB8fCBoZHIuY21kID49IEFSUkFZX1NJWkUodWNtX2NtZF90YWJsZSkpCisJaWYgKGhkci5jbWQgPj0gQVJSQVlfU0laRSh1Y21fY21kX3RhYmxlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaGRyLmluICsgc2l6ZW9mKGhkcikgPiBsZW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKaW5kZXggNzFiZTVlZS4uYjM3YjBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxyZG1hL3JkbWFfdXNlcl9jbS5oPgogI2luY2x1ZGUgPHJkbWEvaWJfbWFyc2hhbGwuaD4KQEAgLTI3Niw3ICsyNzcsNyBAQAogCXVjbWFfc2V0X2V2ZW50X2NvbnRleHQoY3R4LCBldmVudCwgdWV2ZW50KTsKIAl1ZXZlbnQtPnJlc3AuZXZlbnQgPSBldmVudC0+ZXZlbnQ7CiAJdWV2ZW50LT5yZXNwLnN0YXR1cyA9IGV2ZW50LT5zdGF0dXM7Ci0JaWYgKGNtX2lkLT5wcyA9PSBSRE1BX1BTX1VEUCB8fCBjbV9pZC0+cHMgPT0gUkRNQV9QU19JUE9JQikKKwlpZiAoY21faWQtPnFwX3R5cGUgPT0gSUJfUVBUX1VEKQogCQl1Y21hX2NvcHlfdWRfZXZlbnQoJnVldmVudC0+cmVzcC5wYXJhbS51ZCwgJmV2ZW50LT5wYXJhbS51ZCk7CiAJZWxzZQogCQl1Y21hX2NvcHlfY29ubl9ldmVudCgmdWV2ZW50LT5yZXNwLnBhcmFtLmNvbm4sCkBAIC0zNzcsNiArMzc4LDkgQEAKIAljYXNlIFJETUFfUFNfSVBPSUI6CiAJCSpxcF90eXBlID0gSUJfUVBUX1VEOwogCQlyZXR1cm4gMDsKKwljYXNlIFJETUFfUFNfSUI6CisJCSpxcF90eXBlID0gY21kLT5xcF90eXBlOworCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMjcwLDcgKzEyNzQsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCBidWYsIHNpemVvZihoZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoaGRyLmNtZCA8IDAgfHwgaGRyLmNtZCA+PSBBUlJBWV9TSVpFKHVjbWFfY21kX3RhYmxlKSkKKwlpZiAoaGRyLmNtZCA+PSBBUlJBWV9TSVpFKHVjbWFfY21kX3RhYmxlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaGRyLmluICsgc2l6ZW9mKGhkcikgPiBsZW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91ZF9oZWFkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VkX2hlYWRlci5jCmluZGV4IDliNzM3ZmYuLjcyZmVlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VkX2hlYWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VkX2hlYWRlci5jCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAKICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VtZW0uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VtZW0uYwppbmRleCBiNjQ1ZTU1Li43MWYwYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91bWVtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1lbS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1hdHRycy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTEzNiw3ICsxMzcsNyBAQAogCiAJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAotCWxvY2tlZCAgICAgPSBucGFnZXMgKyBjdXJyZW50LT5tbS0+bG9ja2VkX3ZtOworCWxvY2tlZCAgICAgPSBucGFnZXMgKyBjdXJyZW50LT5tbS0+cGlubmVkX3ZtOwogCWxvY2tfbGltaXQgPSBybGltaXQoUkxJTUlUX01FTUxPQ0spID4+IFBBR0VfU0hJRlQ7CiAKIAlpZiAoKGxvY2tlZCA+IGxvY2tfbGltaXQpICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpIHsKQEAgLTIwNiw3ICsyMDcsNyBAQAogCQlfX2liX3VtZW1fcmVsZWFzZShjb250ZXh0LT5kZXZpY2UsIHVtZW0sIDApOwogCQlrZnJlZSh1bWVtKTsKIAl9IGVsc2UKLQkJY3VycmVudC0+bW0tPmxvY2tlZF92bSA9IGxvY2tlZDsKKwkJY3VycmVudC0+bW0tPnBpbm5lZF92bSA9IGxvY2tlZDsKIAogCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWlmICh2bWFfbGlzdCkKQEAgLTIyMiw3ICsyMjMsNyBAQAogCXN0cnVjdCBpYl91bWVtICp1bWVtID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpYl91bWVtLCB3b3JrKTsKIAogCWRvd25fd3JpdGUoJnVtZW0tPm1tLT5tbWFwX3NlbSk7Ci0JdW1lbS0+bW0tPmxvY2tlZF92bSAtPSB1bWVtLT5kaWZmOworCXVtZW0tPm1tLT5waW5uZWRfdm0gLT0gdW1lbS0+ZGlmZjsKIAl1cF93cml0ZSgmdW1lbS0+bW0tPm1tYXBfc2VtKTsKIAltbXB1dCh1bWVtLT5tbSk7CiAJa2ZyZWUodW1lbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXNlcl9tYWQuYwppbmRleCA4ZDI2MWI2Li4wN2RiMjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKQEAgLTQ1OCw4ICs0NTgsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAocGFja2V0LT5tYWQuaGRyLmlkIDwgMCB8fAotCSAgICBwYWNrZXQtPm1hZC5oZHIuaWQgPj0gSUJfVU1BRF9NQVhfQUdFTlRTKSB7CisJaWYgKHBhY2tldC0+bWFkLmhkci5pZCA+PSBJQl9VTUFEX01BWF9BR0VOVFMpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtNzAzLDcgKzcwMiw3IEBACiAJbXV0ZXhfbG9jaygmZmlsZS0+cG9ydC0+ZmlsZV9tdXRleCk7CiAJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwogCi0JaWYgKGlkIDwgMCB8fCBpZCA+PSBJQl9VTUFEX01BWF9BR0VOVFMgfHwgIV9fZ2V0X2FnZW50KGZpbGUsIGlkKSkgeworCWlmIChpZCA+PSBJQl9VTUFEX01BWF9BR0VOVFMgfHwgIV9fZ2V0X2FnZW50KGZpbGUsIGlkKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCmluZGV4IGEwNzhlNTYuLjViY2IyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCkBAIC03Niw2ICs3Niw4IEBACiAJc3RydWN0IGliX2RldmljZQkJICAgICAgICppYl9kZXY7CiAJaW50CQkJCQlkZXZudW07CiAJc3RydWN0IGNkZXYJCQkgICAgICAgIGNkZXY7CisJc3RydWN0IHJiX3Jvb3QJCQkJeHJjZF90cmVlOworCXN0cnVjdCBtdXRleAkJCQl4cmNkX3RyZWVfbXV0ZXg7CiB9OwogCiBzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgewpAQCAtMTIwLDYgKzEyMiwxNiBAQAogCXUzMgkJCWV2ZW50c19yZXBvcnRlZDsKIH07CiAKK3N0cnVjdCBpYl91eHJjZF9vYmplY3QgeworCXN0cnVjdCBpYl91b2JqZWN0CXVvYmplY3Q7CisJYXRvbWljX3QJCXJlZmNudDsKK307CisKK3N0cnVjdCBpYl91c3JxX29iamVjdCB7CisJc3RydWN0IGliX3VldmVudF9vYmplY3QJdWV2ZW50OworCXN0cnVjdCBpYl91eHJjZF9vYmplY3QgKnV4cmNkOworfTsKKwogc3RydWN0IGliX3VxcF9vYmplY3QgewogCXN0cnVjdCBpYl91ZXZlbnRfb2JqZWN0CXVldmVudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIAltY2FzdF9saXN0OwpAQCAtMTQyLDYgKzE1NCw3IEBACiBleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfY3FfaWRyOwogZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3FwX2lkcjsKIGV4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19zcnFfaWRyOworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3hyY2RfaWRyOwogCiB2b2lkIGlkcl9yZW1vdmVfdW9iaihzdHJ1Y3QgaWRyICppZHAsIHN0cnVjdCBpYl91b2JqZWN0ICp1b2JqKTsKIApAQCAtMTYxLDYgKzE3NCw3IEBACiB2b2lkIGliX3V2ZXJic19zcnFfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50LCB2b2lkICpjb250ZXh0X3B0cik7CiB2b2lkIGliX3V2ZXJic19ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAogCQkJICAgICBzdHJ1Y3QgaWJfZXZlbnQgKmV2ZW50KTsKK3ZvaWQgaWJfdXZlcmJzX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfeHJjZCAqeHJjZCk7CiAKICNkZWZpbmUgSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG5hbWUpCQkJCQlcCiAJc3NpemVfdCBpYl91dmVyYnNfIyNuYW1lKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwJCVwKQEAgLTE4MSw2ICsxOTUsNyBAQAogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHJlcV9ub3RpZnlfY3EpOwogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGRlc3Ryb3lfY3EpOwogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGNyZWF0ZV9xcCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQob3Blbl9xcCk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfcXApOwogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG1vZGlmeV9xcCk7CiBJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9xcCk7CkBAIC0xOTUsNSArMjEwLDggQEAKIElCX1VWRVJCU19ERUNMQVJFX0NNRChtb2RpZnlfc3JxKTsKIElCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9zcnEpOwogSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKGRlc3Ryb3lfc3JxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChjcmVhdGVfeHNycSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQob3Blbl94cmNkKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChjbG9zZV94cmNkKTsKIAogI2VuZGlmIC8qIFVWRVJCU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKaW5kZXggYzQyNjk5Mi4uMjU0ZjE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpAQCAtNDcsNiArNDcsNyBAQAogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBxcF9sb2NrX2tleTsKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgYWhfbG9ja19rZXk7CiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHNycV9sb2NrX2tleTsKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgeHJjZF9sb2NrX2tleTsKIAogI2RlZmluZSBJTklUX1VEQVRBKHVkYXRhLCBpYnVmLCBvYnVmLCBpbGVuLCBvbGVuKQkJCVwKIAlkbyB7CQkJCQkJCQlcCkBAIC0yNTUsNiArMjU2LDE4IEBACiAJcHV0X3VvYmpfcmVhZChzcnEtPnVvYmplY3QpOwogfQogCitzdGF0aWMgc3RydWN0IGliX3hyY2QgKmlkcl9yZWFkX3hyY2QoaW50IHhyY2RfaGFuZGxlLCBzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQsCisJCQkJICAgICBzdHJ1Y3QgaWJfdW9iamVjdCAqKnVvYmopCit7CisJKnVvYmogPSBpZHJfcmVhZF91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsIHhyY2RfaGFuZGxlLCBjb250ZXh0LCAwKTsKKwlyZXR1cm4gKnVvYmogPyAoKnVvYmopLT5vYmplY3QgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwdXRfeHJjZF9yZWFkKHN0cnVjdCBpYl91b2JqZWN0ICp1b2JqKQoreworCXB1dF91b2JqX3JlYWQodW9iaik7Cit9CisKIHNzaXplX3QgaWJfdXZlcmJzX2dldF9jb250ZXh0KHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKQEAgLTI5OCw2ICszMTEsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZ1Y29udGV4dC0+cXBfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnVjb250ZXh0LT5zcnFfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnVjb250ZXh0LT5haF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmdWNvbnRleHQtPnhyY2RfbGlzdCk7CiAJdWNvbnRleHQtPmNsb3NpbmcgPSAwOwogCiAJcmVzcC5udW1fY29tcF92ZWN0b3JzID0gZmlsZS0+ZGV2aWNlLT5udW1fY29tcF92ZWN0b3JzOwpAQCAtNTc5LDYgKzU5MywzMTAgQEAKIAlyZXR1cm4gaW5fbGVuOwogfQogCitzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSB7CisJc3RydWN0IHJiX25vZGUgIG5vZGU7CisJc3RydWN0IGliX3hyY2QgKnhyY2Q7CisJc3RydWN0IGlub2RlICAgKmlub2RlOworfTsKKworc3RhdGljIGludCB4cmNkX3RhYmxlX2luc2VydChzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGliX3hyY2QgKnhyY2QpCit7CisJc3RydWN0IHhyY2RfdGFibGVfZW50cnkgKmVudHJ5LCAqc2NhbjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmZGV2LT54cmNkX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5LT54cmNkICA9IHhyY2Q7CisJZW50cnktPmlub2RlID0gaW5vZGU7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXNjYW4gPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB4cmNkX3RhYmxlX2VudHJ5LCBub2RlKTsKKworCQlpZiAoaW5vZGUgPCBzY2FuLT5pbm9kZSkgeworCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKGlub2RlID4gc2Nhbi0+aW5vZGUpIHsKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlrZnJlZShlbnRyeSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmZW50cnktPm5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZlbnRyeS0+bm9kZSwgJmRldi0+eHJjZF90cmVlKTsKKwlpZ3JhYihpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSAqeHJjZF90YWJsZV9zZWFyY2goc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiwKKwkJCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSAqZW50cnk7CisJc3RydWN0IHJiX25vZGUgKnAgPSBkZXYtPnhyY2RfdHJlZS5yYl9ub2RlOworCisJd2hpbGUgKHApIHsKKwkJZW50cnkgPSByYl9lbnRyeShwLCBzdHJ1Y3QgeHJjZF90YWJsZV9lbnRyeSwgbm9kZSk7CisKKwkJaWYgKGlub2RlIDwgZW50cnktPmlub2RlKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGlub2RlID4gZW50cnktPmlub2RlKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZW50cnk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJfeHJjZCAqZmluZF94cmNkKHN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHhyY2RfdGFibGVfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSB4cmNkX3RhYmxlX3NlYXJjaChkZXYsIGlub2RlKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyeS0+eHJjZDsKK30KKworc3RhdGljIHZvaWQgeHJjZF90YWJsZV9kZWxldGUoc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHhyY2RfdGFibGVfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSB4cmNkX3RhYmxlX3NlYXJjaChkZXYsIGlub2RlKTsKKwlpZiAoZW50cnkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJiX2VyYXNlKCZlbnRyeS0+bm9kZSwgJmRldi0+eHJjZF90cmVlKTsKKwkJa2ZyZWUoZW50cnkpOworCX0KK30KKworc3NpemVfdCBpYl91dmVyYnNfb3Blbl94cmNkKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkCWNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX29wZW5feHJjZF9yZXNwCXJlc3A7CisJc3RydWN0IGliX3VkYXRhCQkJdWRhdGE7CisJc3RydWN0IGliX3V4cmNkX29iamVjdCAgICAgICAgICpvYmo7CisJc3RydWN0IGliX3hyY2QgICAgICAgICAgICAgICAgICp4cmNkID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAgICAgICAgKmYgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAgICAgICAgICAgICAgICAgICAqaW5vZGUgPSBOVUxMOworCWludAkJCQlyZXQgPSAwOworCWludAkJCQluZXdfeHJjZCA9IDA7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgIHJlc3ApOworCisJbXV0ZXhfbG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCisJaWYgKGNtZC5mZCAhPSAtMSkgeworCQkvKiBzZWFyY2ggZm9yIGZpbGUgZGVzY3JpcHRvciAqLworCQlmID0gZmdldChjbWQuZmQpOworCQlpZiAoIWYpIHsKKwkJCXJldCA9IC1FQkFERjsKKwkJCWdvdG8gZXJyX3RyZWVfbXV0ZXhfdW5sb2NrOworCQl9CisKKwkJaW5vZGUgPSBmLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKCFpbm9kZSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJZ290byBlcnJfdHJlZV9tdXRleF91bmxvY2s7CisJCX0KKworCQl4cmNkID0gZmluZF94cmNkKGZpbGUtPmRldmljZSwgaW5vZGUpOworCQlpZiAoIXhyY2QgJiYgIShjbWQub2ZsYWdzICYgT19DUkVBVCkpIHsKKwkJCS8qIG5vIGZpbGUgZGVzY3JpcHRvci4gTmVlZCBDUkVBVEUgZmxhZyAqLworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyX3RyZWVfbXV0ZXhfdW5sb2NrOworCQl9CisKKwkJaWYgKHhyY2QgJiYgY21kLm9mbGFncyAmIE9fRVhDTCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3RyZWVfbXV0ZXhfdW5sb2NrOworCQl9CisJfQorCisJb2JqID0ga21hbGxvYyhzaXplb2YgKm9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdHJlZV9tdXRleF91bmxvY2s7CisJfQorCisJaW5pdF91b2JqKCZvYmotPnVvYmplY3QsIDAsIGZpbGUtPnVjb250ZXh0LCAmeHJjZF9sb2NrX2tleSk7CisKKwlkb3duX3dyaXRlKCZvYmotPnVvYmplY3QubXV0ZXgpOworCisJaWYgKCF4cmNkKSB7CisJCXhyY2QgPSBmaWxlLT5kZXZpY2UtPmliX2Rldi0+YWxsb2NfeHJjZChmaWxlLT5kZXZpY2UtPmliX2RldiwKKwkJCQkJCQlmaWxlLT51Y29udGV4dCwgJnVkYXRhKTsKKwkJaWYgKElTX0VSUih4cmNkKSkgeworCQkJcmV0ID0gUFRSX0VSUih4cmNkKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJeHJjZC0+aW5vZGUgICA9IGlub2RlOworCQl4cmNkLT5kZXZpY2UgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXY7CisJCWF0b21pY19zZXQoJnhyY2QtPnVzZWNudCwgMCk7CisJCW11dGV4X2luaXQoJnhyY2QtPnRndF9xcF9tdXRleCk7CisJCUlOSVRfTElTVF9IRUFEKCZ4cmNkLT50Z3RfcXBfbGlzdCk7CisJCW5ld194cmNkID0gMTsKKwl9CisKKwlhdG9taWNfc2V0KCZvYmotPnJlZmNudCwgMCk7CisJb2JqLT51b2JqZWN0Lm9iamVjdCA9IHhyY2Q7CisJcmV0ID0gaWRyX2FkZF91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsICZvYmotPnVvYmplY3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lkcjsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AueHJjZF9oYW5kbGUgPSBvYmotPnVvYmplY3QuaWQ7CisKKwlpZiAoaW5vZGUpIHsKKwkJaWYgKG5ld194cmNkKSB7CisJCQkvKiBjcmVhdGUgbmV3IGlub2RlL3hyY2QgdGFibGUgZW50cnkgKi8KKwkJCXJldCA9IHhyY2RfdGFibGVfaW5zZXJ0KGZpbGUtPmRldmljZSwgaW5vZGUsIHhyY2QpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycl9pbnNlcnRfeHJjZDsKKwkJfQorCQlhdG9taWNfaW5jKCZ4cmNkLT51c2VjbnQpOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9jb3B5OworCX0KKworCWlmIChmKQorCQlmcHV0KGYpOworCisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJm9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnhyY2RfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CisKKwlvYmotPnVvYmplY3QubGl2ZSA9IDE7CisJdXBfd3JpdGUoJm9iai0+dW9iamVjdC5tdXRleCk7CisKKwltdXRleF91bmxvY2soJmZpbGUtPmRldmljZS0+eHJjZF90cmVlX211dGV4KTsKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfY29weToKKwlpZiAoaW5vZGUpIHsKKwkJaWYgKG5ld194cmNkKQorCQkJeHJjZF90YWJsZV9kZWxldGUoZmlsZS0+ZGV2aWNlLCBpbm9kZSk7CisJCWF0b21pY19kZWMoJnhyY2QtPnVzZWNudCk7CisJfQorCitlcnJfaW5zZXJ0X3hyY2Q6CisJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsICZvYmotPnVvYmplY3QpOworCitlcnJfaWRyOgorCWliX2RlYWxsb2NfeHJjZCh4cmNkKTsKKworZXJyOgorCXB1dF91b2JqX3dyaXRlKCZvYmotPnVvYmplY3QpOworCitlcnJfdHJlZV9tdXRleF91bmxvY2s6CisJaWYgKGYpCisJCWZwdXQoZik7CisKKwltdXRleF91bmxvY2soJmZpbGUtPmRldmljZS0+eHJjZF90cmVlX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2Nsb3NlX3hyY2Qoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Nsb3NlX3hyY2QgY21kOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAqdW9iajsKKwlzdHJ1Y3QgaWJfeHJjZCAgICAgICAgICAgICAgKnhyY2QgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAgICAgICAgICAgICAgICAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBpYl91eHJjZF9vYmplY3QgICAgICAqb2JqOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbXV0ZXhfbG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCXVvYmogPSBpZHJfd3JpdGVfdW9iaigmaWJfdXZlcmJzX3hyY2RfaWRyLCBjbWQueHJjZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KTsKKwlpZiAoIXVvYmopIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJeHJjZCAgPSB1b2JqLT5vYmplY3Q7CisJaW5vZGUgPSB4cmNkLT5pbm9kZTsKKwlvYmogICA9IGNvbnRhaW5lcl9vZih1b2JqLCBzdHJ1Y3QgaWJfdXhyY2Rfb2JqZWN0LCB1b2JqZWN0KTsKKwlpZiAoYXRvbWljX3JlYWQoJm9iai0+cmVmY250KSkgeworCQlwdXRfdW9ial93cml0ZSh1b2JqKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWlub2RlIHx8IGF0b21pY19kZWNfYW5kX3Rlc3QoJnhyY2QtPnVzZWNudCkpIHsKKwkJcmV0ID0gaWJfZGVhbGxvY194cmNkKHVvYmotPm9iamVjdCk7CisJCWlmICghcmV0KQorCQkJdW9iai0+bGl2ZSA9IDA7CisJfQorCisJbGl2ZSA9IHVvYmotPmxpdmU7CisJaWYgKGlub2RlICYmIHJldCkKKwkJYXRvbWljX2luYygmeHJjZC0+dXNlY250KTsKKworCXB1dF91b2JqX3dyaXRlKHVvYmopOworCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW5vZGUgJiYgIWxpdmUpCisJCXhyY2RfdGFibGVfZGVsZXRlKGZpbGUtPmRldmljZSwgaW5vZGUpOworCisJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfeHJjZF9pZHIsIHVvYmopOworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKKwlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXRleCk7CisKKwlwdXRfdW9iaih1b2JqKTsKKwlyZXQgPSBpbl9sZW47CisKK291dDoKKwltdXRleF91bmxvY2soJmZpbGUtPmRldmljZS0+eHJjZF90cmVlX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGliX3V2ZXJic19kZWFsbG9jX3hyY2Qoc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaWJfeHJjZCAqeHJjZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSB4cmNkLT5pbm9kZTsKKwlpZiAoaW5vZGUgJiYgIWF0b21pY19kZWNfYW5kX3Rlc3QoJnhyY2QtPnVzZWNudCkpCisJCXJldHVybjsKKworCWliX2RlYWxsb2NfeHJjZCh4cmNkKTsKKworCWlmIChpbm9kZSkKKwkJeHJjZF90YWJsZV9kZWxldGUoZGV2LCBpbm9kZSk7Cit9CisKIHNzaXplX3QgaWJfdXZlcmJzX3JlZ19tcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCiAJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSBpbnQgb3V0X2xlbikKQEAgLTEwNTIsOSArMTM3MCwxMiBAQAogCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwX3Jlc3AgcmVzcDsKIAlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgICAgIHVkYXRhOwogCXN0cnVjdCBpYl91cXBfb2JqZWN0ICAgICAgICAgICAqb2JqOwotCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICAqcGQ7Ci0Jc3RydWN0IGliX2NxICAgICAgICAgICAgICAgICAgICpzY3EsICpyY3E7Ci0Jc3RydWN0IGliX3NycSAgICAgICAgICAgICAgICAgICpzcnE7CisJc3RydWN0IGliX2RldmljZQkgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAgKnBkID0gTlVMTDsKKwlzdHJ1Y3QgaWJfeHJjZAkJICAgICAgICp4cmNkID0gTlVMTDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkgICAgICAgKnVuaW5pdGlhbGl6ZWRfdmFyKHhyY2RfdW9iaik7CisJc3RydWN0IGliX2NxICAgICAgICAgICAgICAgICAgICpzY3EgPSBOVUxMLCAqcmNxID0gTlVMTDsKKwlzdHJ1Y3QgaWJfc3JxICAgICAgICAgICAgICAgICAgKnNycSA9IE5VTEw7CiAJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgICAgICpxcDsKIAlzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICAgICAgICAgIGF0dHI7CiAJaW50IHJldDsKQEAgLTEwNzYsMTUgKzEzOTcsMzkgQEAKIAlpbml0X3VvYmooJm9iai0+dWV2ZW50LnVvYmplY3QsIGNtZC51c2VyX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsICZxcF9sb2NrX2tleSk7CiAJZG93bl93cml0ZSgmb2JqLT51ZXZlbnQudW9iamVjdC5tdXRleCk7CiAKLQlzcnEgPSBjbWQuaXNfc3JxID8gaWRyX3JlYWRfc3JxKGNtZC5zcnFfaGFuZGxlLCBmaWxlLT51Y29udGV4dCkgOiBOVUxMOwotCXBkICA9IGlkcl9yZWFkX3BkKGNtZC5wZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0KTsKLQlzY3EgPSBpZHJfcmVhZF9jcShjbWQuc2VuZF9jcV9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAwKTsKLQlyY3EgPSBjbWQucmVjdl9jcV9oYW5kbGUgPT0gY21kLnNlbmRfY3FfaGFuZGxlID8KLQkJc2NxIDogaWRyX3JlYWRfY3EoY21kLnJlY3ZfY3FfaGFuZGxlLCBmaWxlLT51Y29udGV4dCwgMSk7CisJaWYgKGNtZC5xcF90eXBlID09IElCX1FQVF9YUkNfVEdUKSB7CisJCXhyY2QgPSBpZHJfcmVhZF94cmNkKGNtZC5wZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmeHJjZF91b2JqKTsKKwkJaWYgKCF4cmNkKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcHV0OworCQl9CisJCWRldmljZSA9IHhyY2QtPmRldmljZTsKKwl9IGVsc2UgeworCQlwZCAgPSBpZHJfcmVhZF9wZChjbWQucGRfaGFuZGxlLCBmaWxlLT51Y29udGV4dCk7CisJCXNjcSA9IGlkcl9yZWFkX2NxKGNtZC5zZW5kX2NxX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsIDApOworCQlpZiAoIXBkIHx8ICFzY3EpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9wdXQ7CisJCX0KIAotCWlmICghcGQgfHwgIXNjcSB8fCAhcmNxIHx8IChjbWQuaXNfc3JxICYmICFzcnEpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3B1dDsKKwkJaWYgKGNtZC5xcF90eXBlID09IElCX1FQVF9YUkNfSU5JKSB7CisJCQljbWQubWF4X3JlY3Zfd3IgPSBjbWQubWF4X3JlY3Zfc2dlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjbWQuaXNfc3JxKSB7CisJCQkJc3JxID0gaWRyX3JlYWRfc3JxKGNtZC5zcnFfaGFuZGxlLCBmaWxlLT51Y29udGV4dCk7CisJCQkJaWYgKCFzcnEgfHwgc3JxLT5zcnFfdHlwZSAhPSBJQl9TUlFUX0JBU0lDKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCWdvdG8gZXJyX3B1dDsKKwkJCQl9CisJCQl9CisJCQlyY3EgPSAoY21kLnJlY3ZfY3FfaGFuZGxlID09IGNtZC5zZW5kX2NxX2hhbmRsZSkgPworCQkJICAgICAgIHNjcSA6IGlkcl9yZWFkX2NxKGNtZC5yZWN2X2NxX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQsIDEpOworCQkJaWYgKCFyY3EpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX3B1dDsKKwkJCX0KKwkJfQorCQlkZXZpY2UgPSBwZC0+ZGV2aWNlOwogCX0KIAogCWF0dHIuZXZlbnRfaGFuZGxlciA9IGliX3V2ZXJic19xcF9ldmVudF9oYW5kbGVyOwpAQCAtMTA5Miw2ICsxNDM3LDcgQEAKIAlhdHRyLnNlbmRfY3EgICAgICAgPSBzY3E7CiAJYXR0ci5yZWN2X2NxICAgICAgID0gcmNxOwogCWF0dHIuc3JxICAgICAgICAgICA9IHNycTsKKwlhdHRyLnhyY2QJICAgPSB4cmNkOwogCWF0dHIuc3Ffc2lnX3R5cGUgICA9IGNtZC5zcV9zaWdfYWxsID8gSUJfU0lHTkFMX0FMTF9XUiA6IElCX1NJR05BTF9SRVFfV1I7CiAJYXR0ci5xcF90eXBlICAgICAgID0gY21kLnFwX3R5cGU7CiAJYXR0ci5jcmVhdGVfZmxhZ3MgID0gMDsKQEAgLTExMDYsMjYgKzE0NTIsMzQgQEAKIAlJTklUX0xJU1RfSEVBRCgmb2JqLT51ZXZlbnQuZXZlbnRfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJm9iai0+bWNhc3RfbGlzdCk7CiAKLQlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgJmF0dHIsICZ1ZGF0YSk7CisJaWYgKGNtZC5xcF90eXBlID09IElCX1FQVF9YUkNfVEdUKQorCQlxcCA9IGliX2NyZWF0ZV9xcChwZCwgJmF0dHIpOworCWVsc2UKKwkJcXAgPSBkZXZpY2UtPmNyZWF0ZV9xcChwZCwgJmF0dHIsICZ1ZGF0YSk7CisKIAlpZiAoSVNfRVJSKHFwKSkgewogCQlyZXQgPSBQVFJfRVJSKHFwKTsKIAkJZ290byBlcnJfcHV0OwogCX0KIAotCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKLQlxcC0+cGQgICAgICAgICAJICA9IHBkOwotCXFwLT5zZW5kX2NxICAgIAkgID0gYXR0ci5zZW5kX2NxOwotCXFwLT5yZWN2X2NxICAgIAkgID0gYXR0ci5yZWN2X2NxOwotCXFwLT5zcnEJICAgICAgIAkgID0gYXR0ci5zcnE7Ci0JcXAtPnVvYmplY3QgICAgICAgPSAmb2JqLT51ZXZlbnQudW9iamVjdDsKLQlxcC0+ZXZlbnRfaGFuZGxlciA9IGF0dHIuZXZlbnRfaGFuZGxlcjsKLQlxcC0+cXBfY29udGV4dCAgICA9IGF0dHIucXBfY29udGV4dDsKLQlxcC0+cXBfdHlwZQkgID0gYXR0ci5xcF90eXBlOwotCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwotCWF0b21pY19pbmMoJmF0dHIuc2VuZF9jcS0+dXNlY250KTsKLQlhdG9taWNfaW5jKCZhdHRyLnJlY3ZfY3EtPnVzZWNudCk7Ci0JaWYgKGF0dHIuc3JxKQotCQlhdG9taWNfaW5jKCZhdHRyLnNycS0+dXNlY250KTsKKwlpZiAoY21kLnFwX3R5cGUgIT0gSUJfUVBUX1hSQ19UR1QpIHsKKwkJcXAtPnJlYWxfcXAJICA9IHFwOworCQlxcC0+ZGV2aWNlCSAgPSBkZXZpY2U7CisJCXFwLT5wZAkJICA9IHBkOworCQlxcC0+c2VuZF9jcQkgID0gYXR0ci5zZW5kX2NxOworCQlxcC0+cmVjdl9jcQkgID0gYXR0ci5yZWN2X2NxOworCQlxcC0+c3JxCQkgID0gYXR0ci5zcnE7CisJCXFwLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOworCQlxcC0+cXBfY29udGV4dAkgID0gYXR0ci5xcF9jb250ZXh0OworCQlxcC0+cXBfdHlwZQkgID0gYXR0ci5xcF90eXBlOworCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKKwkJYXRvbWljX2luYygmYXR0ci5zZW5kX2NxLT51c2VjbnQpOworCQlpZiAoYXR0ci5yZWN2X2NxKQorCQkJYXRvbWljX2luYygmYXR0ci5yZWN2X2NxLT51c2VjbnQpOworCQlpZiAoYXR0ci5zcnEpCisJCQlhdG9taWNfaW5jKCZhdHRyLnNycS0+dXNlY250KTsKKwl9CisJcXAtPnVvYmplY3QgPSAmb2JqLT51ZXZlbnQudW9iamVjdDsKIAogCW9iai0+dWV2ZW50LnVvYmplY3Qub2JqZWN0ID0gcXA7CiAJcmV0ID0gaWRyX2FkZF91b2JqKCZpYl91dmVyYnNfcXBfaWRyLCAmb2JqLT51ZXZlbnQudW9iamVjdCk7CkBAIC0xMTQ3LDkgKzE1MDEsMTMgQEAKIAkJZ290byBlcnJfY29weTsKIAl9CiAKLQlwdXRfcGRfcmVhZChwZCk7Ci0JcHV0X2NxX3JlYWQoc2NxKTsKLQlpZiAocmNxICE9IHNjcSkKKwlpZiAoeHJjZCkKKwkJcHV0X3hyY2RfcmVhZCh4cmNkX3VvYmopOworCWlmIChwZCkKKwkJcHV0X3BkX3JlYWQocGQpOworCWlmIChzY3EpCisJCXB1dF9jcV9yZWFkKHNjcSk7CisJaWYgKHJjcSAmJiByY3EgIT0gc2NxKQogCQlwdXRfY3FfcmVhZChyY3EpOwogCWlmIChzcnEpCiAJCXB1dF9zcnFfcmVhZChzcnEpOwpAQCAtMTE3MSw2ICsxNTI5LDggQEAKIAlpYl9kZXN0cm95X3FwKHFwKTsKIAogZXJyX3B1dDoKKwlpZiAoeHJjZCkKKwkJcHV0X3hyY2RfcmVhZCh4cmNkX3VvYmopOwogCWlmIChwZCkKIAkJcHV0X3BkX3JlYWQocGQpOwogCWlmIChzY3EpCkBAIC0xMTg0LDYgKzE1NDQsOTggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzc2l6ZV90IGliX3V2ZXJic19vcGVuX3FwKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19vcGVuX3FwICAgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXBfcmVzcCByZXNwOworCXN0cnVjdCBpYl91ZGF0YSAgICAgICAgICAgICAgICAgdWRhdGE7CisJc3RydWN0IGliX3VxcF9vYmplY3QgICAgICAgICAgICpvYmo7CisJc3RydWN0IGliX3hyY2QJCSAgICAgICAqeHJjZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkgICAgICAgKnVuaW5pdGlhbGl6ZWRfdmFyKHhyY2RfdW9iaik7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgICAgICpxcDsKKwlzdHJ1Y3QgaWJfcXBfb3Blbl9hdHRyICAgICAgICAgIGF0dHI7CisJaW50IHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCW9iaiA9IGttYWxsb2Moc2l6ZW9mICpvYmosIEdGUF9LRVJORUwpOworCWlmICghb2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfdW9iaigmb2JqLT51ZXZlbnQudW9iamVjdCwgY21kLnVzZXJfaGFuZGxlLCBmaWxlLT51Y29udGV4dCwgJnFwX2xvY2tfa2V5KTsKKwlkb3duX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0Lm11dGV4KTsKKworCXhyY2QgPSBpZHJfcmVhZF94cmNkKGNtZC5wZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmeHJjZF91b2JqKTsKKwlpZiAoIXhyY2QpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0OworCX0KKworCWF0dHIuZXZlbnRfaGFuZGxlciA9IGliX3V2ZXJic19xcF9ldmVudF9oYW5kbGVyOworCWF0dHIucXBfY29udGV4dCAgICA9IGZpbGU7CisJYXR0ci5xcF9udW0gICAgICAgID0gY21kLnFwbjsKKwlhdHRyLnFwX3R5cGUgICAgICAgPSBjbWQucXBfdHlwZTsKKworCW9iai0+dWV2ZW50LmV2ZW50c19yZXBvcnRlZCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+dWV2ZW50LmV2ZW50X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZvYmotPm1jYXN0X2xpc3QpOworCisJcXAgPSBpYl9vcGVuX3FwKHhyY2QsICZhdHRyKTsKKwlpZiAoSVNfRVJSKHFwKSkgeworCQlyZXQgPSBQVFJfRVJSKHFwKTsKKwkJZ290byBlcnJfcHV0OworCX0KKworCXFwLT51b2JqZWN0ID0gJm9iai0+dWV2ZW50LnVvYmplY3Q7CisKKwlvYmotPnVldmVudC51b2JqZWN0Lm9iamVjdCA9IHFwOworCXJldCA9IGlkcl9hZGRfdW9iaigmaWJfdXZlcmJzX3FwX2lkciwgJm9iai0+dWV2ZW50LnVvYmplY3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rlc3Ryb3k7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKwlyZXNwLnFwbiAgICAgICA9IHFwLT5xcF9udW07CisJcmVzcC5xcF9oYW5kbGUgPSBvYmotPnVldmVudC51b2JqZWN0LmlkOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX3JlbW92ZTsKKwl9CisKKwlwdXRfeHJjZF9yZWFkKHhyY2RfdW9iaik7CisKKwltdXRleF9sb2NrKCZmaWxlLT5tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmb2JqLT51ZXZlbnQudW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOworCisJb2JqLT51ZXZlbnQudW9iamVjdC5saXZlID0gMTsKKworCXVwX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0Lm11dGV4KTsKKworCXJldHVybiBpbl9sZW47CisKK2Vycl9yZW1vdmU6CisJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfcXBfaWRyLCAmb2JqLT51ZXZlbnQudW9iamVjdCk7CisKK2Vycl9kZXN0cm95OgorCWliX2Rlc3Ryb3lfcXAocXApOworCitlcnJfcHV0OgorCXB1dF94cmNkX3JlYWQoeHJjZF91b2JqKTsKKwlwdXRfdW9ial93cml0ZSgmb2JqLT51ZXZlbnQudW9iamVjdCk7CisJcmV0dXJuIHJldDsKK30KKwogc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfcXAoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAogCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSAgIGludCBvdXRfbGVuKQpAQCAtMTI4NCw2ICsxNzM2LDIwIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KIAorLyogUmVtb3ZlIGlnbm9yZWQgZmllbGRzIHNldCBpbiB0aGUgYXR0cmlidXRlIG1hc2sgKi8KK3N0YXRpYyBpbnQgbW9kaWZ5X3FwX21hc2soZW51bSBpYl9xcF90eXBlIHFwX3R5cGUsIGludCBtYXNrKQoreworCXN3aXRjaCAocXBfdHlwZSkgeworCWNhc2UgSUJfUVBUX1hSQ19JTkk6CisJCXJldHVybiBtYXNrICYgfihJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMgfCBJQl9RUF9NSU5fUk5SX1RJTUVSKTsKKwljYXNlIElCX1FQVF9YUkNfVEdUOgorCQlyZXR1cm4gbWFzayAmIH4oSUJfUVBfTUFYX1FQX1JEX0FUT01JQyB8IElCX1FQX1JFVFJZX0NOVCB8CisJCQkJSUJfUVBfUk5SX1JFVFJZKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbWFzazsKKwl9Cit9CisKIHNzaXplX3QgaWJfdXZlcmJzX21vZGlmeV9xcChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCiAJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKIAkJCSAgICBpbnQgb3V0X2xlbikKQEAgLTEzNTYsNyArMTgyMiwxMiBAQAogCWF0dHItPmFsdF9haF9hdHRyLmFoX2ZsYWdzIAkgICAgPSBjbWQuYWx0X2Rlc3QuaXNfZ2xvYmFsID8gSUJfQUhfR1JIIDogMDsKIAlhdHRyLT5hbHRfYWhfYXR0ci5wb3J0X251bSAJICAgID0gY21kLmFsdF9kZXN0LnBvcnRfbnVtOwogCi0JcmV0ID0gcXAtPmRldmljZS0+bW9kaWZ5X3FwKHFwLCBhdHRyLCBjbWQuYXR0cl9tYXNrLCAmdWRhdGEpOworCWlmIChxcC0+cmVhbF9xcCA9PSBxcCkgeworCQlyZXQgPSBxcC0+ZGV2aWNlLT5tb2RpZnlfcXAocXAsIGF0dHIsCisJCQltb2RpZnlfcXBfbWFzayhxcC0+cXBfdHlwZSwgY21kLmF0dHJfbWFzayksICZ1ZGF0YSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaWJfbW9kaWZ5X3FwKHFwLCBhdHRyLCBtb2RpZnlfcXBfbWFzayhxcC0+cXBfdHlwZSwgY21kLmF0dHJfbWFzaykpOworCX0KIAogCXB1dF9xcF9yZWFkKHFwKTsKIApAQCAtMTU1Myw3ICsyMDI0LDcgQEAKIAl9CiAKIAlyZXNwLmJhZF93ciA9IDA7Ci0JcmV0ID0gcXAtPmRldmljZS0+cG9zdF9zZW5kKHFwLCB3ciwgJmJhZF93cik7CisJcmV0ID0gcXAtPmRldmljZS0+cG9zdF9zZW5kKHFwLT5yZWFsX3FwLCB3ciwgJmJhZF93cik7CiAJaWYgKHJldCkKIAkJZm9yIChuZXh0ID0gd3I7IG5leHQ7IG5leHQgPSBuZXh0LT5uZXh0KSB7CiAJCQkrK3Jlc3AuYmFkX3dyOwpAQCAtMTY5MSw3ICsyMTYyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXNwLmJhZF93ciA9IDA7Ci0JcmV0ID0gcXAtPmRldmljZS0+cG9zdF9yZWN2KHFwLCB3ciwgJmJhZF93cik7CisJcmV0ID0gcXAtPmRldmljZS0+cG9zdF9yZWN2KHFwLT5yZWFsX3FwLCB3ciwgJmJhZF93cik7CiAKIAlwdXRfcXBfcmVhZChxcCk7CiAKQEAgLTE5NzUsMTcgKzI0NDYsMTgwIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKIH0KIAoraW50IF9fdXZlcmJzX2NyZWF0ZV94c3JxKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSBzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV94c3JxICpjbWQsCisJCQkgc3RydWN0IGliX3VkYXRhICp1ZGF0YSkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9zcnFfcmVzcCByZXNwOworCXN0cnVjdCBpYl91c3JxX29iamVjdCAgICAgICAgICAgKm9iajsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAgICpwZDsKKwlzdHJ1Y3QgaWJfc3JxICAgICAgICAgICAgICAgICAgICpzcnE7CisJc3RydWN0IGliX3VvYmplY3QgICAgICAgICAgICAgICAqdW5pbml0aWFsaXplZF92YXIoeHJjZF91b2JqKTsKKwlzdHJ1Y3QgaWJfc3JxX2luaXRfYXR0ciAgICAgICAgICBhdHRyOworCWludCByZXQ7CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZiAqb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X3VvYmooJm9iai0+dWV2ZW50LnVvYmplY3QsIGNtZC0+dXNlcl9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmc3JxX2xvY2tfa2V5KTsKKwlkb3duX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0Lm11dGV4KTsKKworCXBkICA9IGlkcl9yZWFkX3BkKGNtZC0+cGRfaGFuZGxlLCBmaWxlLT51Y29udGV4dCk7CisJaWYgKCFwZCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoY21kLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgeworCQlhdHRyLmV4dC54cmMuY3EgID0gaWRyX3JlYWRfY3EoY21kLT5jcV9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAwKTsKKwkJaWYgKCFhdHRyLmV4dC54cmMuY3EpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9wdXRfcGQ7CisJCX0KKworCQlhdHRyLmV4dC54cmMueHJjZCAgPSBpZHJfcmVhZF94cmNkKGNtZC0+eHJjZF9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmeHJjZF91b2JqKTsKKwkJaWYgKCFhdHRyLmV4dC54cmMueHJjZCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3B1dF9jcTsKKwkJfQorCisJCW9iai0+dXhyY2QgPSBjb250YWluZXJfb2YoeHJjZF91b2JqLCBzdHJ1Y3QgaWJfdXhyY2Rfb2JqZWN0LCB1b2JqZWN0KTsKKwkJYXRvbWljX2luYygmb2JqLT51eHJjZC0+cmVmY250KTsKKwl9CisKKwlhdHRyLmV2ZW50X2hhbmRsZXIgID0gaWJfdXZlcmJzX3NycV9ldmVudF9oYW5kbGVyOworCWF0dHIuc3JxX2NvbnRleHQgICAgPSBmaWxlOworCWF0dHIuc3JxX3R5cGUgICAgICAgPSBjbWQtPnNycV90eXBlOworCWF0dHIuYXR0ci5tYXhfd3IgICAgPSBjbWQtPm1heF93cjsKKwlhdHRyLmF0dHIubWF4X3NnZSAgID0gY21kLT5tYXhfc2dlOworCWF0dHIuYXR0ci5zcnFfbGltaXQgPSBjbWQtPnNycV9saW1pdDsKKworCW9iai0+dWV2ZW50LmV2ZW50c19yZXBvcnRlZCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+dWV2ZW50LmV2ZW50X2xpc3QpOworCisJc3JxID0gcGQtPmRldmljZS0+Y3JlYXRlX3NycShwZCwgJmF0dHIsIHVkYXRhKTsKKwlpZiAoSVNfRVJSKHNycSkpIHsKKwkJcmV0ID0gUFRSX0VSUihzcnEpOworCQlnb3RvIGVycl9wdXQ7CisJfQorCisJc3JxLT5kZXZpY2UgICAgICAgID0gcGQtPmRldmljZTsKKwlzcnEtPnBkICAgICAgICAgICAgPSBwZDsKKwlzcnEtPnNycV90eXBlCSAgID0gY21kLT5zcnFfdHlwZTsKKwlzcnEtPnVvYmplY3QgICAgICAgPSAmb2JqLT51ZXZlbnQudW9iamVjdDsKKwlzcnEtPmV2ZW50X2hhbmRsZXIgPSBhdHRyLmV2ZW50X2hhbmRsZXI7CisJc3JxLT5zcnFfY29udGV4dCAgID0gYXR0ci5zcnFfY29udGV4dDsKKworCWlmIChjbWQtPnNycV90eXBlID09IElCX1NSUVRfWFJDKSB7CisJCXNycS0+ZXh0LnhyYy5jcSAgID0gYXR0ci5leHQueHJjLmNxOworCQlzcnEtPmV4dC54cmMueHJjZCA9IGF0dHIuZXh0LnhyYy54cmNkOworCQlhdG9taWNfaW5jKCZhdHRyLmV4dC54cmMuY3EtPnVzZWNudCk7CisJCWF0b21pY19pbmMoJmF0dHIuZXh0LnhyYy54cmNkLT51c2VjbnQpOworCX0KKworCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCWF0b21pY19zZXQoJnNycS0+dXNlY250LCAwKTsKKworCW9iai0+dWV2ZW50LnVvYmplY3Qub2JqZWN0ID0gc3JxOworCXJldCA9IGlkcl9hZGRfdW9iaigmaWJfdXZlcmJzX3NycV9pZHIsICZvYmotPnVldmVudC51b2JqZWN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXN0cm95OworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5zcnFfaGFuZGxlID0gb2JqLT51ZXZlbnQudW9iamVjdC5pZDsKKwlyZXNwLm1heF93ciAgICAgPSBhdHRyLmF0dHIubWF4X3dyOworCXJlc3AubWF4X3NnZSAgICA9IGF0dHIuYXR0ci5tYXhfc2dlOworCWlmIChjbWQtPnNycV90eXBlID09IElCX1NSUVRfWFJDKQorCQlyZXNwLnNycW4gPSBzcnEtPmV4dC54cmMuc3JxX251bTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQtPnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfY29weTsKKwl9CisKKwlpZiAoY21kLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgeworCQlwdXRfdW9ial9yZWFkKHhyY2RfdW9iaik7CisJCXB1dF9jcV9yZWFkKGF0dHIuZXh0LnhyYy5jcSk7CisJfQorCXB1dF9wZF9yZWFkKHBkKTsKKworCW11dGV4X2xvY2soJmZpbGUtPm11dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPnVldmVudC51b2JqZWN0Lmxpc3QsICZmaWxlLT51Y29udGV4dC0+c3JxX2xpc3QpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0ZXgpOworCisJb2JqLT51ZXZlbnQudW9iamVjdC5saXZlID0gMTsKKworCXVwX3dyaXRlKCZvYmotPnVldmVudC51b2JqZWN0Lm11dGV4KTsKKworCXJldHVybiAwOworCitlcnJfY29weToKKwlpZHJfcmVtb3ZlX3VvYmooJmliX3V2ZXJic19zcnFfaWRyLCAmb2JqLT51ZXZlbnQudW9iamVjdCk7CisKK2Vycl9kZXN0cm95OgorCWliX2Rlc3Ryb3lfc3JxKHNycSk7CisKK2Vycl9wdXQ6CisJaWYgKGNtZC0+c3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpIHsKKwkJYXRvbWljX2RlYygmb2JqLT51eHJjZC0+cmVmY250KTsKKwkJcHV0X3VvYmpfcmVhZCh4cmNkX3VvYmopOworCX0KKworZXJyX3B1dF9jcToKKwlpZiAoY21kLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykKKwkJcHV0X2NxX3JlYWQoYXR0ci5leHQueHJjLmNxKTsKKworZXJyX3B1dF9wZDoKKwlwdXRfcGRfcmVhZChwZCk7CisKK2VycjoKKwlwdXRfdW9ial93cml0ZSgmb2JqLT51ZXZlbnQudW9iamVjdCk7CisJcmV0dXJuIHJldDsKK30KKwogc3NpemVfdCBpYl91dmVyYnNfY3JlYXRlX3NycShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCiAJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCiAJCQkgICAgIGludCBvdXRfbGVuKQogewogCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV94c3JxICAgICB4Y21kOwogCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycV9yZXNwIHJlc3A7CiAJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICAgdWRhdGE7Ci0Jc3RydWN0IGliX3VldmVudF9vYmplY3QgICAgICAgICAqb2JqOwotCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICAgKnBkOwotCXN0cnVjdCBpYl9zcnEgICAgICAgICAgICAgICAgICAgKnNycTsKLQlzdHJ1Y3QgaWJfc3JxX2luaXRfYXR0ciAgICAgICAgICBhdHRyOworCWludCByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXhjbWQucmVzcG9uc2UJID0gY21kLnJlc3BvbnNlOworCXhjbWQudXNlcl9oYW5kbGUgPSBjbWQudXNlcl9oYW5kbGU7CisJeGNtZC5zcnFfdHlwZQkgPSBJQl9TUlFUX0JBU0lDOworCXhjbWQucGRfaGFuZGxlCSA9IGNtZC5wZF9oYW5kbGU7CisJeGNtZC5tYXhfd3IJID0gY21kLm1heF93cjsKKwl4Y21kLm1heF9zZ2UJID0gY21kLm1heF9zZ2U7CisJeGNtZC5zcnFfbGltaXQJID0gY21kLnNycV9saW1pdDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwlyZXQgPSBfX3V2ZXJic19jcmVhdGVfeHNycShmaWxlLCAmeGNtZCwgJnVkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfY3JlYXRlX3hzcnEoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19jcmVhdGVfeHNycSAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3NycV9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICAgdWRhdGE7CiAJaW50IHJldDsKIAogCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCkBAIC0xOTk4LDgyICsyNjMyLDExIEBACiAJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKIAkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKIAotCW9iaiA9IGttYWxsb2Moc2l6ZW9mICpvYmosIEdGUF9LRVJORUwpOwotCWlmICghb2JqKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluaXRfdW9iaigmb2JqLT51b2JqZWN0LCBjbWQudXNlcl9oYW5kbGUsIGZpbGUtPnVjb250ZXh0LCAmc3JxX2xvY2tfa2V5KTsKLQlkb3duX3dyaXRlKCZvYmotPnVvYmplY3QubXV0ZXgpOwotCi0JcGQgID0gaWRyX3JlYWRfcGQoY21kLnBkX2hhbmRsZSwgZmlsZS0+dWNvbnRleHQpOwotCWlmICghcGQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JYXR0ci5ldmVudF9oYW5kbGVyICA9IGliX3V2ZXJic19zcnFfZXZlbnRfaGFuZGxlcjsKLQlhdHRyLnNycV9jb250ZXh0ICAgID0gZmlsZTsKLQlhdHRyLmF0dHIubWF4X3dyICAgID0gY21kLm1heF93cjsKLQlhdHRyLmF0dHIubWF4X3NnZSAgID0gY21kLm1heF9zZ2U7Ci0JYXR0ci5hdHRyLnNycV9saW1pdCA9IGNtZC5zcnFfbGltaXQ7Ci0KLQlvYmotPmV2ZW50c19yZXBvcnRlZCAgICAgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZvYmotPmV2ZW50X2xpc3QpOwotCi0Jc3JxID0gcGQtPmRldmljZS0+Y3JlYXRlX3NycShwZCwgJmF0dHIsICZ1ZGF0YSk7Ci0JaWYgKElTX0VSUihzcnEpKSB7Ci0JCXJldCA9IFBUUl9FUlIoc3JxKTsKLQkJZ290byBlcnJfcHV0OwotCX0KLQotCXNycS0+ZGV2aWNlICAgIAkgICA9IHBkLT5kZXZpY2U7Ci0Jc3JxLT5wZCAgICAgICAgCSAgID0gcGQ7Ci0Jc3JxLT51b2JqZWN0ICAgICAgID0gJm9iai0+dW9iamVjdDsKLQlzcnEtPmV2ZW50X2hhbmRsZXIgPSBhdHRyLmV2ZW50X2hhbmRsZXI7Ci0Jc3JxLT5zcnFfY29udGV4dCAgID0gYXR0ci5zcnFfY29udGV4dDsKLQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKLQlhdG9taWNfc2V0KCZzcnEtPnVzZWNudCwgMCk7Ci0KLQlvYmotPnVvYmplY3Qub2JqZWN0ID0gc3JxOwotCXJldCA9IGlkcl9hZGRfdW9iaigmaWJfdXZlcmJzX3NycV9pZHIsICZvYmotPnVvYmplY3QpOworCXJldCA9IF9fdXZlcmJzX2NyZWF0ZV94c3JxKGZpbGUsICZjbWQsICZ1ZGF0YSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfZGVzdHJveTsKLQotCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOwotCXJlc3Auc3JxX2hhbmRsZSA9IG9iai0+dW9iamVjdC5pZDsKLQlyZXNwLm1heF93ciAgICAgPSBhdHRyLmF0dHIubWF4X3dyOwotCXJlc3AubWF4X3NnZSAgICA9IGF0dHIuYXR0ci5tYXhfc2dlOwotCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKLQkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX2NvcHk7Ci0JfQotCi0JcHV0X3BkX3JlYWQocGQpOwotCi0JbXV0ZXhfbG9jaygmZmlsZS0+bXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJm9iai0+dW9iamVjdC5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnNycV9saXN0KTsKLQltdXRleF91bmxvY2soJmZpbGUtPm11dGV4KTsKLQotCW9iai0+dW9iamVjdC5saXZlID0gMTsKLQotCXVwX3dyaXRlKCZvYmotPnVvYmplY3QubXV0ZXgpOworCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIGluX2xlbjsKLQotZXJyX2NvcHk6Ci0JaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfc3JxX2lkciwgJm9iai0+dW9iamVjdCk7Ci0KLWVycl9kZXN0cm95OgotCWliX2Rlc3Ryb3lfc3JxKHNycSk7Ci0KLWVycl9wdXQ6Ci0JcHV0X3BkX3JlYWQocGQpOwotCi1lcnI6Ci0JcHV0X3VvYmpfd3JpdGUoJm9iai0+dW9iamVjdCk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3NpemVfdCBpYl91dmVyYnNfbW9kaWZ5X3NycShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCA1Njg5OGI2Li44Nzk2MzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTcyLDYgKzcyLDcgQEAKIERFRklORV9JRFIoaWJfdXZlcmJzX2NxX2lkcik7CiBERUZJTkVfSURSKGliX3V2ZXJic19xcF9pZHIpOwogREVGSU5FX0lEUihpYl91dmVyYnNfc3JxX2lkcik7CitERUZJTkVfSURSKGliX3V2ZXJic194cmNkX2lkcik7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWFwX2xvY2spOwogc3RhdGljIERFQ0xBUkVfQklUTUFQKGRldl9tYXAsIElCX1VWRVJCU19NQVhfREVWSUNFUyk7CkBAIC0xMDcsNiArMTA4LDEwIEBACiAJW0lCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9TUlFdCQk9IGliX3V2ZXJic19tb2RpZnlfc3JxLAogCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9TUlFdCQk9IGliX3V2ZXJic19xdWVyeV9zcnEsCiAJW0lCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfU1JRXQkJPSBpYl91dmVyYnNfZGVzdHJveV9zcnEsCisJW0lCX1VTRVJfVkVSQlNfQ01EX09QRU5fWFJDRF0JCT0gaWJfdXZlcmJzX29wZW5feHJjZCwKKwlbSUJfVVNFUl9WRVJCU19DTURfQ0xPU0VfWFJDRF0JCT0gaWJfdXZlcmJzX2Nsb3NlX3hyY2QsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9YU1JRXQkJPSBpYl91dmVyYnNfY3JlYXRlX3hzcnEsCisJW0lCX1VTRVJfVkVSQlNfQ01EX09QRU5fUVBdCQk9IGliX3V2ZXJic19vcGVuX3FwCiB9OwogCiBzdGF0aWMgdm9pZCBpYl91dmVyYnNfYWRkX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpOwpAQCAtMjAyLDggKzIwNywxMiBAQAogCQkJY29udGFpbmVyX29mKHVvYmosIHN0cnVjdCBpYl91cXBfb2JqZWN0LCB1ZXZlbnQudW9iamVjdCk7CiAKIAkJaWRyX3JlbW92ZV91b2JqKCZpYl91dmVyYnNfcXBfaWRyLCB1b2JqKTsKLQkJaWJfdXZlcmJzX2RldGFjaF91bWNhc3QocXAsIHVxcCk7Ci0JCWliX2Rlc3Ryb3lfcXAocXApOworCQlpZiAocXAgIT0gcXAtPnJlYWxfcXApIHsKKwkJCWliX2Nsb3NlX3FwKHFwKTsKKwkJfSBlbHNlIHsKKwkJCWliX3V2ZXJic19kZXRhY2hfdW1jYXN0KHFwLCB1cXApOworCQkJaWJfZGVzdHJveV9xcChxcCk7CisJCX0KIAkJaWJfdXZlcmJzX3JlbGVhc2VfdWV2ZW50KGZpbGUsICZ1cXAtPnVldmVudCk7CiAJCWtmcmVlKHVxcCk7CiAJfQpAQCAtMjQxLDYgKzI1MCwxOCBAQAogCQlrZnJlZSh1b2JqKTsKIAl9CiAKKwltdXRleF9sb2NrKCZmaWxlLT5kZXZpY2UtPnhyY2RfdHJlZV9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVvYmosIHRtcCwgJmNvbnRleHQtPnhyY2RfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfeHJjZCAqeHJjZCA9IHVvYmotPm9iamVjdDsKKwkJc3RydWN0IGliX3V4cmNkX29iamVjdCAqdXhyY2QgPQorCQkJY29udGFpbmVyX29mKHVvYmosIHN0cnVjdCBpYl91eHJjZF9vYmplY3QsIHVvYmplY3QpOworCisJCWlkcl9yZW1vdmVfdW9iaigmaWJfdXZlcmJzX3hyY2RfaWRyLCB1b2JqKTsKKwkJaWJfdXZlcmJzX2RlYWxsb2NfeHJjZChmaWxlLT5kZXZpY2UsIHhyY2QpOworCQlrZnJlZSh1eHJjZCk7CisJfQorCW11dGV4X3VubG9jaygmZmlsZS0+ZGV2aWNlLT54cmNkX3RyZWVfbXV0ZXgpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVvYmosIHRtcCwgJmNvbnRleHQtPnBkX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IGliX3BkICpwZCA9IHVvYmotPm9iamVjdDsKIApAQCAtNTU3LDggKzU3OCw3IEBACiAJaWYgKGhkci5pbl93b3JkcyAqIDQgIT0gY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGhkci5jb21tYW5kIDwgMAkJCQl8fAotCSAgICBoZHIuY29tbWFuZCA+PSBBUlJBWV9TSVpFKHV2ZXJic19jbWRfdGFibGUpIHx8CisJaWYgKGhkci5jb21tYW5kID49IEFSUkFZX1NJWkUodXZlcmJzX2NtZF90YWJsZSkgfHwKIAkgICAgIXV2ZXJic19jbWRfdGFibGVbaGRyLmNvbW1hbmRdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzQxLDYgKzc2MSw4IEBACiAKIAlrcmVmX2luaXQoJnV2ZXJic19kZXYtPnJlZik7CiAJaW5pdF9jb21wbGV0aW9uKCZ1dmVyYnNfZGV2LT5jb21wKTsKKwl1dmVyYnNfZGV2LT54cmNkX3RyZWUgPSBSQl9ST09UOworCW11dGV4X2luaXQoJnV2ZXJic19kZXYtPnhyY2RfdHJlZV9tdXRleCk7CiAKIAlzcGluX2xvY2soJm1hcF9sb2NrKTsKIAlkZXZudW0gPSBmaW5kX2ZpcnN0X3plcm9fYml0KGRldl9tYXAsIElCX1VWRVJCU19NQVhfREVWSUNFUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFyc2hhbGwuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYXJzaGFsbC5jCmluZGV4IDFiMTE0NmYuLmU3YmVlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYXJzaGFsbC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYXJzaGFsbC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9tYXJzaGFsbC5oPgogCiB2b2lkIGliX2NvcHlfYWhfYXR0cl90b191c2VyKHN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciAqZHN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKaW5kZXggYWY3YThiMC4uNjAyYjFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCkBAIC0zOCw3ICszOCw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX2NhY2hlLmg+CkBAIC03Nyw2ICs3OSwzMSBAQAogfQogRVhQT1JUX1NZTUJPTChtdWx0X3RvX2liX3JhdGUpOwogCitpbnQgaWJfcmF0ZV90b19tYnBzKGVudW0gaWJfcmF0ZSByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgSUJfUkFURV8yXzVfR0JQUzogcmV0dXJuIDI1MDA7CisJY2FzZSBJQl9SQVRFXzVfR0JQUzogICByZXR1cm4gNTAwMDsKKwljYXNlIElCX1JBVEVfMTBfR0JQUzogIHJldHVybiAxMDAwMDsKKwljYXNlIElCX1JBVEVfMjBfR0JQUzogIHJldHVybiAyMDAwMDsKKwljYXNlIElCX1JBVEVfMzBfR0JQUzogIHJldHVybiAzMDAwMDsKKwljYXNlIElCX1JBVEVfNDBfR0JQUzogIHJldHVybiA0MDAwMDsKKwljYXNlIElCX1JBVEVfNjBfR0JQUzogIHJldHVybiA2MDAwMDsKKwljYXNlIElCX1JBVEVfODBfR0JQUzogIHJldHVybiA4MDAwMDsKKwljYXNlIElCX1JBVEVfMTIwX0dCUFM6IHJldHVybiAxMjAwMDA7CisJY2FzZSBJQl9SQVRFXzE0X0dCUFM6ICByZXR1cm4gMTQwNjI7CisJY2FzZSBJQl9SQVRFXzU2X0dCUFM6ICByZXR1cm4gNTYyNTA7CisJY2FzZSBJQl9SQVRFXzExMl9HQlBTOiByZXR1cm4gMTEyNTAwOworCWNhc2UgSUJfUkFURV8xNjhfR0JQUzogcmV0dXJuIDE2ODc1MDsKKwljYXNlIElCX1JBVEVfMjVfR0JQUzogIHJldHVybiAyNTc4MTsKKwljYXNlIElCX1JBVEVfMTAwX0dCUFM6IHJldHVybiAxMDMxMjU7CisJY2FzZSBJQl9SQVRFXzIwMF9HQlBTOiByZXR1cm4gMjA2MjUwOworCWNhc2UgSUJfUkFURV8zMDBfR0JQUzogcmV0dXJuIDMwOTM3NTsKKwlkZWZhdWx0OgkgICAgICAgcmV0dXJuIC0xOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWJfcmF0ZV90b19tYnBzKTsKKwogZW51bSByZG1hX3RyYW5zcG9ydF90eXBlCiByZG1hX25vZGVfZ2V0X3RyYW5zcG9ydChlbnVtIHJkbWFfbm9kZV90eXBlIG5vZGVfdHlwZSkKIHsKQEAgLTI1MCw2ICsyNzcsMTMgQEAKIAkJc3JxLT51b2JqZWN0ICAgICAgID0gTlVMTDsKIAkJc3JxLT5ldmVudF9oYW5kbGVyID0gc3JxX2luaXRfYXR0ci0+ZXZlbnRfaGFuZGxlcjsKIAkJc3JxLT5zcnFfY29udGV4dCAgID0gc3JxX2luaXRfYXR0ci0+c3JxX2NvbnRleHQ7CisJCXNycS0+c3JxX3R5cGUgICAgICA9IHNycV9pbml0X2F0dHItPnNycV90eXBlOworCQlpZiAoc3JxLT5zcnFfdHlwZSA9PSBJQl9TUlFUX1hSQykgeworCQkJc3JxLT5leHQueHJjLnhyY2QgPSBzcnFfaW5pdF9hdHRyLT5leHQueHJjLnhyY2Q7CisJCQlzcnEtPmV4dC54cmMuY3EgICA9IHNycV9pbml0X2F0dHItPmV4dC54cmMuY3E7CisJCQlhdG9taWNfaW5jKCZzcnEtPmV4dC54cmMueHJjZC0+dXNlY250KTsKKwkJCWF0b21pY19pbmMoJnNycS0+ZXh0LnhyYy5jcS0+dXNlY250KTsKKwkJfQogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAkJYXRvbWljX3NldCgmc3JxLT51c2VjbnQsIDApOwogCX0KQEAgLTI3OSwxNiArMzEzLDI5IEBACiBpbnQgaWJfZGVzdHJveV9zcnEoc3RydWN0IGliX3NycSAqc3JxKQogewogCXN0cnVjdCBpYl9wZCAqcGQ7CisJZW51bSBpYl9zcnFfdHlwZSBzcnFfdHlwZTsKKwlzdHJ1Y3QgaWJfeHJjZCAqdW5pbml0aWFsaXplZF92YXIoeHJjZCk7CisJc3RydWN0IGliX2NxICp1bmluaXRpYWxpemVkX3ZhcihjcSk7CiAJaW50IHJldDsKIAogCWlmIChhdG9taWNfcmVhZCgmc3JxLT51c2VjbnQpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJcGQgPSBzcnEtPnBkOworCXNycV90eXBlID0gc3JxLT5zcnFfdHlwZTsKKwlpZiAoc3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpIHsKKwkJeHJjZCA9IHNycS0+ZXh0LnhyYy54cmNkOworCQljcSA9IHNycS0+ZXh0LnhyYy5jcTsKKwl9CiAKIAlyZXQgPSBzcnEtPmRldmljZS0+ZGVzdHJveV9zcnEoc3JxKTsKLQlpZiAoIXJldCkKKwlpZiAoIXJldCkgewogCQlhdG9taWNfZGVjKCZwZC0+dXNlY250KTsKKwkJaWYgKHNycV90eXBlID09IElCX1NSUVRfWFJDKSB7CisJCQlhdG9taWNfZGVjKCZ4cmNkLT51c2VjbnQpOworCQkJYXRvbWljX2RlYygmY3EtPnVzZWNudCk7CisJCX0KKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjk2LDI4ICszNDMsMTIzIEBACiAKIC8qIFF1ZXVlIHBhaXJzICovCiAKK3N0YXRpYyB2b2lkIF9faWJfc2hhcmVkX3FwX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50ICpldmVudCwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgaWJfcXAgKnFwID0gY29udGV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQtPmVsZW1lbnQucXAsICZxcC0+b3Blbl9saXN0LCBvcGVuX2xpc3QpCisJCWV2ZW50LT5lbGVtZW50LnFwLT5ldmVudF9oYW5kbGVyKGV2ZW50LCBldmVudC0+ZWxlbWVudC5xcC0+cXBfY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faWJfaW5zZXJ0X3hyY2RfcXAoc3RydWN0IGliX3hyY2QgKnhyY2QsIHN0cnVjdCBpYl9xcCAqcXApCit7CisJbXV0ZXhfbG9jaygmeHJjZC0+dGd0X3FwX211dGV4KTsKKwlsaXN0X2FkZCgmcXAtPnhyY2RfbGlzdCwgJnhyY2QtPnRndF9xcF9saXN0KTsKKwltdXRleF91bmxvY2soJnhyY2QtPnRndF9xcF9tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJfcXAgKl9faWJfb3Blbl9xcChzdHJ1Y3QgaWJfcXAgKnJlYWxfcXAsCisJCQkJICB2b2lkICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKiksCisJCQkJICB2b2lkICpxcF9jb250ZXh0KQoreworCXN0cnVjdCBpYl9xcCAqcXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXFwID0ga3phbGxvYyhzaXplb2YgKnFwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFwKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXFwLT5yZWFsX3FwID0gcmVhbF9xcDsKKwlhdG9taWNfaW5jKCZyZWFsX3FwLT51c2VjbnQpOworCXFwLT5kZXZpY2UgPSByZWFsX3FwLT5kZXZpY2U7CisJcXAtPmV2ZW50X2hhbmRsZXIgPSBldmVudF9oYW5kbGVyOworCXFwLT5xcF9jb250ZXh0ID0gcXBfY29udGV4dDsKKwlxcC0+cXBfbnVtID0gcmVhbF9xcC0+cXBfbnVtOworCXFwLT5xcF90eXBlID0gcmVhbF9xcC0+cXBfdHlwZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZWFsX3FwLT5kZXZpY2UtPmV2ZW50X2hhbmRsZXJfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZxcC0+b3Blbl9saXN0LCAmcmVhbF9xcC0+b3Blbl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWFsX3FwLT5kZXZpY2UtPmV2ZW50X2hhbmRsZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHFwOworfQorCitzdHJ1Y3QgaWJfcXAgKmliX29wZW5fcXAoc3RydWN0IGliX3hyY2QgKnhyY2QsCisJCQkgc3RydWN0IGliX3FwX29wZW5fYXR0ciAqcXBfb3Blbl9hdHRyKQoreworCXN0cnVjdCBpYl9xcCAqcXAsICpyZWFsX3FwOworCisJaWYgKHFwX29wZW5fYXR0ci0+cXBfdHlwZSAhPSBJQl9RUFRfWFJDX1RHVCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlxcCA9IEVSUl9QVFIoLUVJTlZBTCk7CisJbXV0ZXhfbG9jaygmeHJjZC0+dGd0X3FwX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWxfcXAsICZ4cmNkLT50Z3RfcXBfbGlzdCwgeHJjZF9saXN0KSB7CisJCWlmIChyZWFsX3FwLT5xcF9udW0gPT0gcXBfb3Blbl9hdHRyLT5xcF9udW0pIHsKKwkJCXFwID0gX19pYl9vcGVuX3FwKHJlYWxfcXAsIHFwX29wZW5fYXR0ci0+ZXZlbnRfaGFuZGxlciwKKwkJCQkJICBxcF9vcGVuX2F0dHItPnFwX2NvbnRleHQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCXJldHVybiBxcDsKK30KK0VYUE9SVF9TWU1CT0woaWJfb3Blbl9xcCk7CisKIHN0cnVjdCBpYl9xcCAqaWJfY3JlYXRlX3FwKHN0cnVjdCBpYl9wZCAqcGQsCiAJCQkgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICpxcF9pbml0X2F0dHIpCiB7Ci0Jc3RydWN0IGliX3FwICpxcDsKKwlzdHJ1Y3QgaWJfcXAgKnFwLCAqcmVhbF9xcDsKKwlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7CiAKLQlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgcXBfaW5pdF9hdHRyLCBOVUxMKTsKKwlkZXZpY2UgPSBwZCA/IHBkLT5kZXZpY2UgOiBxcF9pbml0X2F0dHItPnhyY2QtPmRldmljZTsKKwlxcCA9IGRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIsIE5VTEwpOwogCiAJaWYgKCFJU19FUlIocXApKSB7Ci0JCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKLQkJcXAtPnBkICAgICAgICAgCSAgPSBwZDsKLQkJcXAtPnNlbmRfY3EgICAgCSAgPSBxcF9pbml0X2F0dHItPnNlbmRfY3E7Ci0JCXFwLT5yZWN2X2NxICAgIAkgID0gcXBfaW5pdF9hdHRyLT5yZWN2X2NxOwotCQlxcC0+c3JxCSAgICAgICAJICA9IHFwX2luaXRfYXR0ci0+c3JxOwotCQlxcC0+dW9iamVjdCAgICAgICA9IE5VTEw7Ci0JCXFwLT5ldmVudF9oYW5kbGVyID0gcXBfaW5pdF9hdHRyLT5ldmVudF9oYW5kbGVyOwotCQlxcC0+cXBfY29udGV4dCAgICA9IHFwX2luaXRfYXR0ci0+cXBfY29udGV4dDsKLQkJcXAtPnFwX3R5cGUJICA9IHFwX2luaXRfYXR0ci0+cXBfdHlwZTsKLQkJYXRvbWljX2luYygmcGQtPnVzZWNudCk7Ci0JCWF0b21pY19pbmMoJnFwX2luaXRfYXR0ci0+c2VuZF9jcS0+dXNlY250KTsKLQkJYXRvbWljX2luYygmcXBfaW5pdF9hdHRyLT5yZWN2X2NxLT51c2VjbnQpOwotCQlpZiAocXBfaW5pdF9hdHRyLT5zcnEpCi0JCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnNycS0+dXNlY250KTsKKwkJcXAtPmRldmljZSAgICAgPSBkZXZpY2U7CisJCXFwLT5yZWFsX3FwICAgID0gcXA7CisJCXFwLT51b2JqZWN0ICAgID0gTlVMTDsKKwkJcXAtPnFwX3R5cGUgICAgPSBxcF9pbml0X2F0dHItPnFwX3R5cGU7CisKKwkJaWYgKHFwX2luaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfWFJDX1RHVCkgeworCQkJcXAtPmV2ZW50X2hhbmRsZXIgPSBfX2liX3NoYXJlZF9xcF9ldmVudF9oYW5kbGVyOworCQkJcXAtPnFwX2NvbnRleHQgPSBxcDsKKwkJCXFwLT5wZCA9IE5VTEw7CisJCQlxcC0+c2VuZF9jcSA9IHFwLT5yZWN2X2NxID0gTlVMTDsKKwkJCXFwLT5zcnEgPSBOVUxMOworCQkJcXAtPnhyY2QgPSBxcF9pbml0X2F0dHItPnhyY2Q7CisJCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnhyY2QtPnVzZWNudCk7CisJCQlJTklUX0xJU1RfSEVBRCgmcXAtPm9wZW5fbGlzdCk7CisJCQlhdG9taWNfc2V0KCZxcC0+dXNlY250LCAwKTsKKworCQkJcmVhbF9xcCA9IHFwOworCQkJcXAgPSBfX2liX29wZW5fcXAocmVhbF9xcCwgcXBfaW5pdF9hdHRyLT5ldmVudF9oYW5kbGVyLAorCQkJCQkgIHFwX2luaXRfYXR0ci0+cXBfY29udGV4dCk7CisJCQlpZiAoIUlTX0VSUihxcCkpCisJCQkJX19pYl9pbnNlcnRfeHJjZF9xcChxcF9pbml0X2F0dHItPnhyY2QsIHJlYWxfcXApOworCQkJZWxzZQorCQkJCXJlYWxfcXAtPmRldmljZS0+ZGVzdHJveV9xcChyZWFsX3FwKTsKKwkJfSBlbHNlIHsKKwkJCXFwLT5ldmVudF9oYW5kbGVyID0gcXBfaW5pdF9hdHRyLT5ldmVudF9oYW5kbGVyOworCQkJcXAtPnFwX2NvbnRleHQgPSBxcF9pbml0X2F0dHItPnFwX2NvbnRleHQ7CisJCQlpZiAocXBfaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfSU5JKSB7CisJCQkJcXAtPnJlY3ZfY3EgPSBOVUxMOworCQkJCXFwLT5zcnEgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlxcC0+cmVjdl9jcSA9IHFwX2luaXRfYXR0ci0+cmVjdl9jcTsKKwkJCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnJlY3ZfY3EtPnVzZWNudCk7CisJCQkJcXAtPnNycSA9IHFwX2luaXRfYXR0ci0+c3JxOworCQkJCWlmIChxcC0+c3JxKQorCQkJCQlhdG9taWNfaW5jKCZxcF9pbml0X2F0dHItPnNycS0+dXNlY250KTsKKwkJCX0KKworCQkJcXAtPnBkCSAgICA9IHBkOworCQkJcXAtPnNlbmRfY3EgPSBxcF9pbml0X2F0dHItPnNlbmRfY3E7CisJCQlxcC0+eHJjZCAgICA9IE5VTEw7CisKKwkJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCQkJYXRvbWljX2luYygmcXBfaW5pdF9hdHRyLT5zZW5kX2NxLT51c2VjbnQpOworCQl9CiAJfQogCiAJcmV0dXJuIHFwOwpAQCAtMzI2LDggKzQ2OCw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludAkJCXZhbGlkOwotCWVudW0gaWJfcXBfYXR0cl9tYXNrCXJlcV9wYXJhbVtJQl9RUFRfUkFXX0VUSEVSVFlQRSArIDFdOwotCWVudW0gaWJfcXBfYXR0cl9tYXNrCW9wdF9wYXJhbVtJQl9RUFRfUkFXX0VUSEVSVFlQRSArIDFdOworCWVudW0gaWJfcXBfYXR0cl9tYXNrCXJlcV9wYXJhbVtJQl9RUFRfTUFYXTsKKwllbnVtIGliX3FwX2F0dHJfbWFzawlvcHRfcGFyYW1bSUJfUVBUX01BWF07CiB9IHFwX3N0YXRlX3RhYmxlW0lCX1FQU19FUlIgKyAxXVtJQl9RUFNfRVJSICsgMV0gPSB7CiAJW0lCX1FQU19SRVNFVF0gPSB7CiAJCVtJQl9RUFNfUkVTRVRdID0geyAudmFsaWQgPSAxIH0sCkBAIC0zNDMsNiArNDg1LDEyIEBACiAJCQkJW0lCX1FQVF9SQ10gID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKIAkJCQkJCUlCX1FQX1BPUlQJCQl8CiAJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MpLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAorCQkJCQkJSUJfUVBfUE9SVAkJCXwKKwkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUyksCisJCQkJW0lCX1FQVF9YUkNfVEdUXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CisJCQkJCQlJQl9RUF9QT1JUCQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTKSwKIAkJCQlbSUJfUVBUX1NNSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJSUJfUVBfUUtFWSksCiAJCQkJW0lCX1FQVF9HU0ldID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKQEAgLTM2NSw2ICs1MTMsMTIgQEAKIAkJCQlbSUJfUVBUX1JDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJSUJfUVBfUE9SVAkJCXwKIAkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUyksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CisJCQkJCQlJQl9RUF9QT1JUCQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKKwkJCQkJCUlCX1FQX1BPUlQJCQl8CisJCQkJCQlJQl9RUF9BQ0NFU1NfRkxBR1MpLAogCQkJCVtJQl9RUFRfU01JXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CiAJCQkJCQlJQl9RUF9RS0VZKSwKIAkJCQlbSUJfUVBUX0dTSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfApAQCAtMzg0LDYgKzUzOCwxNiBAQAogCQkJCQkJSUJfUVBfUlFfUFNOCQkJfAogCQkJCQkJSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDCXwKIAkJCQkJCUlCX1FQX01JTl9STlJfVElNRVIpLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfQVYJCQl8CisJCQkJCQlJQl9RUF9QQVRIX01UVQkJCXwKKwkJCQkJCUlCX1FQX0RFU1RfUVBOCQkJfAorCQkJCQkJSUJfUVBfUlFfUFNOKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX0FWCQkJfAorCQkJCQkJSUJfUVBfUEFUSF9NVFUJCQl8CisJCQkJCQlJQl9RUF9ERVNUX1FQTgkJCXwKKwkJCQkJCUlCX1FQX1JRX1BTTgkJCXwKKwkJCQkJCUlCX1FQX01BWF9ERVNUX1JEX0FUT01JQwl8CisJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSKSwKIAkJCX0sCiAJCQkub3B0X3BhcmFtID0gewogCQkJCSBbSUJfUVBUX1VEXSAgPSAoSUJfUVBfUEtFWV9JTkRFWAkJfApAQCAtMzk0LDYgKzU1OCwxMiBAQAogCQkJCSBbSUJfUVBUX1JDXSAgPSAoSUJfUVBfQUxUX1BBVEgJCQl8CiAJCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CiAJCQkJCQkgSUJfUVBfUEtFWV9JTkRFWCksCisJCQkJIFtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfQUxUX1BBVEgJCXwKKwkJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCSBJQl9RUF9QS0VZX0lOREVYKSwKKwkJCQkgW0lCX1FQVF9YUkNfVEdUXSA9IChJQl9RUF9BTFRfUEFUSAkJfAorCQkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUwkJfAorCQkJCQkJIElCX1FQX1BLRVlfSU5ERVgpLAogCQkJCSBbSUJfUVBUX1NNSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJIElCX1FQX1FLRVkpLAogCQkJCSBbSUJfUVBUX0dTSV0gPSAoSUJfUVBfUEtFWV9JTkRFWAkJfApAQCAtNDE0LDYgKzU4NCwxMyBAQAogCQkJCQkJSUJfUVBfUk5SX1JFVFJZCQkJfAogCQkJCQkJSUJfUVBfU1FfUFNOCQkJfAogCQkJCQkJSUJfUVBfTUFYX1FQX1JEX0FUT01JQyksCisJCQkJW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9USU1FT1VUCQl8CisJCQkJCQlJQl9RUF9SRVRSWV9DTlQJCQl8CisJCQkJCQlJQl9RUF9STlJfUkVUUlkJCQl8CisJCQkJCQlJQl9RUF9TUV9QU04JCQl8CisJCQkJCQlJQl9RUF9NQVhfUVBfUkRfQVRPTUlDKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX1RJTUVPVVQJCXwKKwkJCQkJCUlCX1FQX1NRX1BTTiksCiAJCQkJW0lCX1FQVF9TTUldID0gSUJfUVBfU1FfUFNOLAogCQkJCVtJQl9RUFRfR1NJXSA9IElCX1FQX1NRX1BTTiwKIAkJCX0sCkBAIC00MjksNiArNjA2LDE1IEBACiAJCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CiAJCQkJCQkgSUJfUVBfTUlOX1JOUl9USU1FUgkJfAogCQkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKKwkJCQkgW0lCX1FQVF9YUkNfSU5JXSA9IChJQl9RUF9DVVJfU1RBVEUJCXwKKwkJCQkJCSBJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MJCXwKKwkJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSksCisJCQkJIFtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CisJCQkJCQkgSUJfUVBfQUxUX1BBVEgJCQl8CisJCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQkgSUJfUVBfTUlOX1JOUl9USU1FUgkJfAorCQkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQkgW0lCX1FQVF9TTUldID0gKElCX1FQX0NVUl9TVEFURQkJfAogCQkJCQkJIElCX1FQX1FLRVkpLAogCQkJCSBbSUJfUVBUX0dTSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CkBAIC00NTMsNiArNjM5LDE1IEBACiAJCQkJCQlJQl9RUF9BTFRfUEFUSAkJCXwKIAkJCQkJCUlCX1FQX1BBVEhfTUlHX1NUQVRFCQl8CiAJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSKSwKKwkJCQlbSUJfUVBUX1hSQ19JTkldID0gKElCX1FQX0NVUl9TVEFURQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCUlCX1FQX1BBVEhfTUlHX1NUQVRFKSwKKwkJCQlbSUJfUVBUX1hSQ19UR1RdID0gKElCX1FQX0NVUl9TVEFURQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCUlCX1FQX1BBVEhfTUlHX1NUQVRFCQl8CisJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSKSwKIAkJCQlbSUJfUVBUX1NNSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQkJfAogCQkJCQkJSUJfUVBfUUtFWSksCiAJCQkJW0lCX1FQVF9HU0ldID0gKElCX1FQX0NVUl9TVEFURQkJCXwKQEAgLTQ2NSw2ICs2NjAsOCBAQAogCQkJCVtJQl9RUFRfVURdICA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlksCiAJCQkJW0lCX1FQVF9VQ10gID0gSUJfUVBfRU5fU1FEX0FTWU5DX05PVElGWSwKIAkJCQlbSUJfUVBUX1JDXSAgPSBJQl9RUF9FTl9TUURfQVNZTkNfTk9USUZZLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSBJQl9RUF9FTl9TUURfQVNZTkNfTk9USUZZLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSBJQl9RUF9FTl9TUURfQVNZTkNfTk9USUZZLCAvKiA/Pz8gKi8KIAkJCQlbSUJfUVBUX1NNSV0gPSBJQl9RUF9FTl9TUURfQVNZTkNfTk9USUZZLAogCQkJCVtJQl9RUFRfR1NJXSA9IElCX1FQX0VOX1NRRF9BU1lOQ19OT1RJRlkKIAkJCX0KQEAgLTQ4Nyw2ICs2ODQsMTUgQEAKIAkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUwkJfAogCQkJCQkJSUJfUVBfTUlOX1JOUl9USU1FUgkJfAogCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CisJCQkJCQlJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUwkJfAorCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAorCQkJCVtJQl9RUFRfWFJDX1RHVF0gPSAoSUJfUVBfQ1VSX1NUQVRFCQl8CisJCQkJCQlJQl9RUF9BTFRfUEFUSAkJCXwKKwkJCQkJCUlCX1FQX0FDQ0VTU19GTEFHUwkJfAorCQkJCQkJSUJfUVBfTUlOX1JOUl9USU1FUgkJfAorCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAogCQkJCVtJQl9RUFRfU01JXSA9IChJQl9RUF9DVVJfU1RBVEUJCQl8CiAJCQkJCQlJQl9RUF9RS0VZKSwKIAkJCQlbSUJfUVBUX0dTSV0gPSAoSUJfUVBfQ1VSX1NUQVRFCQkJfApAQCAtNTE1LDYgKzcyMSwyNSBAQAogCQkJCQkJSUJfUVBfUEtFWV9JTkRFWAkJfAogCQkJCQkJSUJfUVBfTUlOX1JOUl9USU1FUgkJfAogCQkJCQkJSUJfUVBfUEFUSF9NSUdfU1RBVEUpLAorCQkJCVtJQl9RUFRfWFJDX0lOSV0gPSAoSUJfUVBfUE9SVAkJCXwKKwkJCQkJCUlCX1FQX0FWCQkJfAorCQkJCQkJSUJfUVBfVElNRU9VVAkJCXwKKwkJCQkJCUlCX1FQX1JFVFJZX0NOVAkJCXwKKwkJCQkJCUlCX1FQX1JOUl9SRVRSWQkJCXwKKwkJCQkJCUlCX1FQX01BWF9RUF9SRF9BVE9NSUMJCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9QS0VZX0lOREVYCQl8CisJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCisJCQkJW0lCX1FQVF9YUkNfVEdUXSA9IChJQl9RUF9QT1JUCQkJfAorCQkJCQkJSUJfUVBfQVYJCQl8CisJCQkJCQlJQl9RUF9USU1FT1VUCQkJfAorCQkJCQkJSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDCXwKKwkJCQkJCUlCX1FQX0FMVF9QQVRICQkJfAorCQkJCQkJSUJfUVBfQUNDRVNTX0ZMQUdTCQl8CisJCQkJCQlJQl9RUF9QS0VZX0lOREVYCQl8CisJCQkJCQlJQl9RUF9NSU5fUk5SX1RJTUVSCQl8CisJCQkJCQlJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW0lCX1FQVF9TTUldID0gKElCX1FQX1BLRVlfSU5ERVgJCXwKIAkJCQkJCUlCX1FQX1FLRVkpLAogCQkJCVtJQl9RUFRfR1NJXSA9IChJQl9RUF9QS0VZX0lOREVYCQl8CkBAIC01NzksNyArODA0LDcgQEAKIAkJIHN0cnVjdCBpYl9xcF9hdHRyICpxcF9hdHRyLAogCQkgaW50IHFwX2F0dHJfbWFzaykKIHsKLQlyZXR1cm4gcXAtPmRldmljZS0+bW9kaWZ5X3FwKHFwLCBxcF9hdHRyLCBxcF9hdHRyX21hc2ssIE5VTEwpOworCXJldHVybiBxcC0+ZGV2aWNlLT5tb2RpZnlfcXAocXAtPnJlYWxfcXAsIHFwX2F0dHIsIHFwX2F0dHJfbWFzaywgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKGliX21vZGlmeV9xcCk7CiAKQEAgLTU4OSwxMSArODE0LDU5IEBACiAJCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKnFwX2luaXRfYXR0cikKIHsKIAlyZXR1cm4gcXAtPmRldmljZS0+cXVlcnlfcXAgPwotCQlxcC0+ZGV2aWNlLT5xdWVyeV9xcChxcCwgcXBfYXR0ciwgcXBfYXR0cl9tYXNrLCBxcF9pbml0X2F0dHIpIDoKKwkJcXAtPmRldmljZS0+cXVlcnlfcXAocXAtPnJlYWxfcXAsIHFwX2F0dHIsIHFwX2F0dHJfbWFzaywgcXBfaW5pdF9hdHRyKSA6CiAJCS1FTk9TWVM7CiB9CiBFWFBPUlRfU1lNQk9MKGliX3F1ZXJ5X3FwKTsKIAoraW50IGliX2Nsb3NlX3FwKHN0cnVjdCBpYl9xcCAqcXApCit7CisJc3RydWN0IGliX3FwICpyZWFsX3FwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWFsX3FwID0gcXAtPnJlYWxfcXA7CisJaWYgKHJlYWxfcXAgPT0gcXApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJlYWxfcXAtPmRldmljZS0+ZXZlbnRfaGFuZGxlcl9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnFwLT5vcGVuX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlYWxfcXAtPmRldmljZS0+ZXZlbnRfaGFuZGxlcl9sb2NrLCBmbGFncyk7CisKKwlhdG9taWNfZGVjKCZyZWFsX3FwLT51c2VjbnQpOworCWtmcmVlKHFwKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpYl9jbG9zZV9xcCk7CisKK3N0YXRpYyBpbnQgX19pYl9kZXN0cm95X3NoYXJlZF9xcChzdHJ1Y3QgaWJfcXAgKnFwKQoreworCXN0cnVjdCBpYl94cmNkICp4cmNkOworCXN0cnVjdCBpYl9xcCAqcmVhbF9xcDsKKwlpbnQgcmV0OworCisJcmVhbF9xcCA9IHFwLT5yZWFsX3FwOworCXhyY2QgPSByZWFsX3FwLT54cmNkOworCisJbXV0ZXhfbG9jaygmeHJjZC0+dGd0X3FwX211dGV4KTsKKwlpYl9jbG9zZV9xcChxcCk7CisJaWYgKGF0b21pY19yZWFkKCZyZWFsX3FwLT51c2VjbnQpID09IDApCisJCWxpc3RfZGVsKCZyZWFsX3FwLT54cmNkX2xpc3QpOworCWVsc2UKKwkJcmVhbF9xcCA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCisJaWYgKHJlYWxfcXApIHsKKwkJcmV0ID0gaWJfZGVzdHJveV9xcChyZWFsX3FwKTsKKwkJaWYgKCFyZXQpCisJCQlhdG9taWNfZGVjKCZ4cmNkLT51c2VjbnQpOworCQllbHNlCisJCQlfX2liX2luc2VydF94cmNkX3FwKHhyY2QsIHJlYWxfcXApOworCX0KKworCXJldHVybiAwOworfQorCiBpbnQgaWJfZGVzdHJveV9xcChzdHJ1Y3QgaWJfcXAgKnFwKQogewogCXN0cnVjdCBpYl9wZCAqcGQ7CkBAIC02MDEsMTYgKzg3NCwyNSBAQAogCXN0cnVjdCBpYl9zcnEgKnNycTsKIAlpbnQgcmV0OwogCi0JcGQgID0gcXAtPnBkOwotCXNjcSA9IHFwLT5zZW5kX2NxOwotCXJjcSA9IHFwLT5yZWN2X2NxOwotCXNycSA9IHFwLT5zcnE7CisJaWYgKGF0b21pY19yZWFkKCZxcC0+dXNlY250KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChxcC0+cmVhbF9xcCAhPSBxcCkKKwkJcmV0dXJuIF9faWJfZGVzdHJveV9zaGFyZWRfcXAocXApOworCisJcGQgICA9IHFwLT5wZDsKKwlzY3EgID0gcXAtPnNlbmRfY3E7CisJcmNxICA9IHFwLT5yZWN2X2NxOworCXNycSAgPSBxcC0+c3JxOwogCiAJcmV0ID0gcXAtPmRldmljZS0+ZGVzdHJveV9xcChxcCk7CiAJaWYgKCFyZXQpIHsKLQkJYXRvbWljX2RlYygmcGQtPnVzZWNudCk7Ci0JCWF0b21pY19kZWMoJnNjcS0+dXNlY250KTsKLQkJYXRvbWljX2RlYygmcmNxLT51c2VjbnQpOworCQlpZiAocGQpCisJCQlhdG9taWNfZGVjKCZwZC0+dXNlY250KTsKKwkJaWYgKHNjcSkKKwkJCWF0b21pY19kZWMoJnNjcS0+dXNlY250KTsKKwkJaWYgKHJjcSkKKwkJCWF0b21pY19kZWMoJnJjcS0+dXNlY250KTsKIAkJaWYgKHNycSkKIAkJCWF0b21pY19kZWMoJnNycS0+dXNlY250KTsKIAl9CkBAIC05MjAsMyArMTIwMiw0MiBAQAogCXJldHVybiBxcC0+ZGV2aWNlLT5kZXRhY2hfbWNhc3QocXAsIGdpZCwgbGlkKTsKIH0KIEVYUE9SVF9TWU1CT0woaWJfZGV0YWNoX21jYXN0KTsKKworc3RydWN0IGliX3hyY2QgKmliX2FsbG9jX3hyY2Qoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBpYl94cmNkICp4cmNkOworCisJaWYgKCFkZXZpY2UtPmFsbG9jX3hyY2QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCisJeHJjZCA9IGRldmljZS0+YWxsb2NfeHJjZChkZXZpY2UsIE5VTEwsIE5VTEwpOworCWlmICghSVNfRVJSKHhyY2QpKSB7CisJCXhyY2QtPmRldmljZSA9IGRldmljZTsKKwkJeHJjZC0+aW5vZGUgPSBOVUxMOworCQlhdG9taWNfc2V0KCZ4cmNkLT51c2VjbnQsIDApOworCQltdXRleF9pbml0KCZ4cmNkLT50Z3RfcXBfbXV0ZXgpOworCQlJTklUX0xJU1RfSEVBRCgmeHJjZC0+dGd0X3FwX2xpc3QpOworCX0KKworCXJldHVybiB4cmNkOworfQorRVhQT1JUX1NZTUJPTChpYl9hbGxvY194cmNkKTsKKworaW50IGliX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCkKK3sKKwlzdHJ1Y3QgaWJfcXAgKnFwOworCWludCByZXQ7CisKKwlpZiAoYXRvbWljX3JlYWQoJnhyY2QtPnVzZWNudCkpCisJCXJldHVybiAtRUJVU1k7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnhyY2QtPnRndF9xcF9saXN0KSkgeworCQlxcCA9IGxpc3RfZW50cnkoeHJjZC0+dGd0X3FwX2xpc3QubmV4dCwgc3RydWN0IGliX3FwLCB4cmNkX2xpc3QpOworCQlyZXQgPSBpYl9kZXN0cm95X3FwKHFwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHhyY2QtPmRldmljZS0+ZGVhbGxvY194cmNkKHhyY2QpOworfQorRVhQT1JUX1NZTUJPTChpYl9kZWFsbG9jX3hyY2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2FlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWUuYwppbmRleCAyNGY5ZTNhLi4zMmQzNGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWUuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWUuYwpAQCAtMjg4LDYgKzI4OCwxMSBAQAogCQljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0KIAkJCWJlMzJfdG9fY3B1KHJlcS0+cHJpdmF0ZV9kYXRhX2xlbmd0aCk7CiAJCWNtX2V2ZW50LnByaXZhdGVfZGF0YSA9IHJlcS0+cHJpdmF0ZV9kYXRhOworCQkvKgorCQkgKiBVbnRpbCBpcmQvb3JkIG5lZ290aWF0aW9uIHZpYSBNUEF2MiBzdXBwb3J0IGlzIGFkZGVkLCBzZW5kCisJCSAqIG1heCBzdXBwb3J0ZWQgdmFsdWVzCisJCSAqLworCQljbV9ldmVudC5pcmQgPSBjbV9ldmVudC5vcmQgPSAxMjg7CiAKIAkJaWYgKGNtX2lkLT5ldmVudF9oYW5kbGVyKQogCQkJY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfaW50ci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2ludHIuYwppbmRleCAwZWJlNGU4Li44OTUxZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfaW50ci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9pbnRyLmMKQEAgLTE4Myw2ICsxODMsMTEgQEAKIAljYXNlIElXX0NNX0VWRU5UX0VTVEFCTElTSEVEOgogCQljMl9zZXRfcXBfc3RhdGUocmVxLT5xcCwKIAkJCQlDMl9RUF9TVEFURV9SVFMpOworCQkvKgorCQkgKiBVbnRpbCBpcmQvb3JkIG5lZ290aWF0aW9uIHZpYSBNUEF2MiBzdXBwb3J0IGlzIGFkZGVkLCBzZW5kCisJCSAqIG1heCBzdXBwb3J0ZWQgdmFsdWVzCisJCSAqLworCQljbV9ldmVudC5pcmQgPSBjbV9ldmVudC5vcmQgPSAxMjg7CiAJY2FzZSBJV19DTV9FVkVOVF9DTE9TRToKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYwppbmRleCBmMTAxYmI3Li4xMmY5MjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYwpAQCAtNzUzLDEwICs3NTMsNyBAQAogCW1lbWNweV9mcm9taW8obmV0ZGV2LT5kZXZfYWRkciwgYzJkZXYtPmt2YSArIEMyX1JFR1NfUkRNQV9FTkFERFIsIDYpOwogCiAJLyogUHJpbnQgb3V0IHRoZSBNQUMgYWRkcmVzcyAqLwotCXByX2RlYnVnKCIlczogTUFDICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAotCQluZXRkZXYtPm5hbWUsCi0JCW5ldGRldi0+ZGV2X2FkZHJbMF0sIG5ldGRldi0+ZGV2X2FkZHJbMV0sIG5ldGRldi0+ZGV2X2FkZHJbMl0sCi0JCW5ldGRldi0+ZGV2X2FkZHJbM10sIG5ldGRldi0+ZGV2X2FkZHJbNF0sIG5ldGRldi0+ZGV2X2FkZHJbNV0pOworCXByX2RlYnVnKCIlczogTUFDICVwTVxuIiwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYtPmRldl9hZGRyKTsKIAogI2lmIDAKIAkvKiBEaXNhYmxlIG5ldHdvcmsgcGFja2V0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKaW5kZXggNmNkNjQyYS4uZGU2ZDA3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCkBAIC03NTMsNiArNzUzLDExIEBACiAJZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IGVwLT5wbGVuOwogCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsgc2l6ZW9mKHN0cnVjdCBtcGFfbWVzc2FnZSk7CiAJZXZlbnQucHJvdmlkZXJfZGF0YSA9IGVwOworCS8qCisJICogVW50aWwgaXJkL29yZCBuZWdvdGlhdGlvbiB2aWEgTVBBdjIgc3VwcG9ydCBpcyBhZGRlZCwgc2VuZCBtYXgKKwkgKiBzdXBwb3J0ZWQgdmFsdWVzCisJICovCisJZXZlbnQuaXJkID0gZXZlbnQub3JkID0gODsKIAlpZiAoc3RhdGVfcmVhZCgmZXAtPnBhcmVudF9lcC0+Y29tKSAhPSBERUFEKSB7CiAJCWdldF9lcCgmZXAtPmNvbSk7CiAJCWVwLT5wYXJlbnRfZXAtPmNvbS5jbV9pZC0+ZXZlbnRfaGFuZGxlcigKQEAgLTc3MCw2ICs3NzUsMTEgQEAKIAlQREJHKCIlcyBlcCAlcFxuIiwgX19mdW5jX18sIGVwKTsKIAltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKIAlldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0VTVEFCTElTSEVEOworCS8qCisJICogVW50aWwgaXJkL29yZCBuZWdvdGlhdGlvbiB2aWEgTVBBdjIgc3VwcG9ydCBpcyBhZGRlZCwgc2VuZCBtYXgKKwkgKiBzdXBwb3J0ZWQgdmFsdWVzCisJICovCisJZXZlbnQuaXJkID0gZXZlbnQub3JkID0gODsKIAlpZiAoZXAtPmNvbS5jbV9pZCkgewogCQlQREJHKCIlcyBlcCAlcCB0aWQgJWRcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAkJZXAtPmNvbS5jbV9pZC0+ZXZlbnRfaGFuZGxlcihlcC0+Y29tLmNtX2lkLCAmZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfZXYuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2V2LmMKaW5kZXggNzFlMGQ4NC4uYWJjYzllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfZXYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9ldi5jCkBAIC00Niw2ICs0Niw3IEBACiAJc3RydWN0IGliX2V2ZW50IGV2ZW50OwogCXN0cnVjdCBpd2NoX3FwX2F0dHJpYnV0ZXMgYXR0cnM7CiAJc3RydWN0IGl3Y2hfcXAgKnFocDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CiAKIAlzcGluX2xvY2soJnJuaWNwLT5sb2NrKTsKIAlxaHAgPSBnZXRfcWhwKHJuaWNwLCBDUUVfUVBJRChyc3BfbXNnLT5jcWUpKTsKQEAgLTk0LDcgKzk1LDkgQEAKIAlpZiAocWhwLT5pYnFwLmV2ZW50X2hhbmRsZXIpCiAJCSgqcWhwLT5pYnFwLmV2ZW50X2hhbmRsZXIpKCZldmVudCwgcWhwLT5pYnFwLnFwX2NvbnRleHQpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCSgqY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJmNocC0+aWJjcSwgY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFocC0+cmVmY250KSkKIAkJd2FrZV91cCgmcWhwLT53YWl0KTsKQEAgLTEwNyw2ICsxMTAsNyBAQAogCXN0cnVjdCBpd2NoX2NxICpjaHA7CiAJc3RydWN0IGl3Y2hfcXAgKnFocDsKIAl1MzIgY3FpZCA9IFJTUFFfQ1FJRChyc3BfbXNnKTsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CiAKIAlybmljcCA9IChzdHJ1Y3QgaXdjaF9kZXYgKikgcmRldl9wLT51bHA7CiAJc3Bpbl9sb2NrKCZybmljcC0+bG9jayk7CkBAIC0xNzAsNyArMTc0LDkgQEAKIAkJICovCiAJCWlmIChxaHAtPmVwICYmIFNRX1RZUEUocnNwX21zZy0+Y3FlKSkKIAkJCWRzdF9jb25maXJtKHFocC0+ZXAtPmRzdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKIAkJKCpjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmY2hwLT5pYmNxLCBjaHAtPmliY3EuY3FfY29udGV4dCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCQlicmVhazsKIAogCWNhc2UgVFBUX0VSUl9TVEFHOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKaW5kZXggYzdkOTQxMS4uMzdjMjI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCkBAIC0xOTAsNiArMTkwLDcgQEAKIAljaHAtPnJocCA9IHJocDsKIAljaHAtPmliY3EuY3FlID0gMSA8PCBjaHAtPmNxLnNpemVfbG9nMjsKIAlzcGluX2xvY2tfaW5pdCgmY2hwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hwLT5jb21wX2hhbmRsZXJfbG9jayk7CiAJYXRvbWljX3NldCgmY2hwLT5yZWZjbnQsIDEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNocC0+d2FpdCk7CiAJaWYgKGluc2VydF9oYW5kbGUocmhwLCAmcmhwLT5jcWlkciwgY2hwLCBjaHAtPmNxLmNxaWQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuaAppbmRleCA5YTM0MmM5Li44N2MxNGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmgKQEAgLTEwMyw2ICsxMDMsNyBAQAogCXN0cnVjdCBpd2NoX2RldiAqcmhwOwogCXN0cnVjdCB0M19jcSBjcTsKIAlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBjb21wX2hhbmRsZXJfbG9jazsKIAlhdG9taWNfdCByZWZjbnQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIAl1MzIgX191c2VyICp1c2VyX3JwdHJfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCmluZGV4IGVjZDMxM2YuLmJlYTU4MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYwpAQCAtODIyLDggKzgyMiwxMSBAQAogCWZsdXNoZWQgPSBjeGlvX2ZsdXNoX3JxKCZxaHAtPndxLCAmcmNocC0+Y3EsIGNvdW50KTsKIAlzcGluX3VubG9jaygmcWhwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5sb2NrLCAqZmxhZyk7Ci0JaWYgKGZsdXNoZWQpCisJaWYgKGZsdXNoZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCAqZmxhZyk7CiAJCSgqcmNocC0+aWJjcS5jb21wX2hhbmRsZXIpKCZyY2hwLT5pYmNxLCByY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOworCX0KIAogCS8qIGxvY2tpbmcgaGllcmFyY2h5OiBjcSBsb2NrIGZpcnN0LCB0aGVuIHFwIGxvY2suICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmxvY2ssICpmbGFnKTsKQEAgLTgzMyw4ICs4MzYsMTEgQEAKIAlmbHVzaGVkID0gY3hpb19mbHVzaF9zcSgmcWhwLT53cSwgJnNjaHAtPmNxLCBjb3VudCk7CiAJc3Bpbl91bmxvY2soJnFocC0+bG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+bG9jaywgKmZsYWcpOwotCWlmIChmbHVzaGVkKQorCWlmIChmbHVzaGVkKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOwogCQkoKnNjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmc2NocC0+aWJjcSwgc2NocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+Y29tcF9oYW5kbGVyX2xvY2ssICpmbGFnKTsKKwl9CiAKIAkvKiBkZXJlZiAqLwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxaHAtPnJlZmNudCkpCkBAIC04NTMsMTEgKzg1OSwxNSBAQAogCWlmIChxaHAtPmlicXAudW9iamVjdCkgewogCQljeGlvX3NldF93cV9pbl9lcnJvcigmcWhwLT53cSk7CiAJCWN4aW9fc2V0X2NxX2luX2Vycm9yKCZyY2hwLT5jcSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOwogCQkoKnJjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmcmNocC0+aWJjcSwgcmNocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssICpmbGFnKTsKIAkJaWYgKHNjaHAgIT0gcmNocCkgewogCQkJY3hpb19zZXRfY3FfaW5fZXJyb3IoJnNjaHAtPmNxKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgKmZsYWcpOwogCQkJKCpzY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJnNjaHAtPmliY3EsCiAJCQkJCQkgICBzY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+Y29tcF9oYW5kbGVyX2xvY2ssICpmbGFnKTsKIAkJfQogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwppbmRleCA3N2Y3NjlkLi5iMzZjZGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwpAQCAtMTAzLDcgKzEwMyw4IEBACiBzdGF0aWMgaW50IG1wYV9yZXYgPSAxOwogbW9kdWxlX3BhcmFtKG1wYV9yZXYsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1wYV9yZXYsICJNUEEgUmV2aXNpb24sIDAgc3VwcG9ydHMgYW1zbzExMDAsICIKLQkJICIxIGlzIHNwZWMgY29tcGxpYW50LiAoZGVmYXVsdD0xKSIpOworCQkiMSBpcyBSRkMwNTQ0IHNwZWMgY29tcGxpYW50LCAyIGlzIElFVEYgTVBBIFBlZXIgQ29ubmVjdCBEcmFmdCIKKwkJIiBjb21wbGlhbnQgKGRlZmF1bHQ9MSkiKTsKIAogc3RhdGljIGludCBtYXJrZXJzX2VuYWJsZWQ7CiBtb2R1bGVfcGFyYW0obWFya2Vyc19lbmFibGVkLCBpbnQsIDA2NDQpOwpAQCAtNDk3LDE3ICs0OTgsMjEgQEAKIAlyZXR1cm4gYzRpd19sMnRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYiwgZXAtPmwydCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbmRfbXBhX3JlcShzdHJ1Y3QgYzRpd19lcCAqZXAsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBzZW5kX21wYV9yZXEoc3RydWN0IGM0aXdfZXAgKmVwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQl1OCBtcGFfcmV2X3RvX3VzZSkKIHsKIAlpbnQgbXBhbGVuLCB3cmxlbjsKIAlzdHJ1Y3QgZndfb2ZsZF90eF9kYXRhX3dyICpyZXE7CiAJc3RydWN0IG1wYV9tZXNzYWdlICptcGE7CisJc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyBtcGFfdjJfcGFyYW1zOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IHBkX2xlbiAlZFxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQsIGVwLT5wbGVuKTsKIAogCUJVR19PTihza2JfY2xvbmVkKHNrYikpOwogCiAJbXBhbGVuID0gc2l6ZW9mKCptcGEpICsgZXAtPnBsZW47CisJaWYgKG1wYV9yZXZfdG9fdXNlID09IDIpCisJCW1wYWxlbiArPSBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyk7CiAJd3JsZW4gPSByb3VuZHVwKG1wYWxlbiArIHNpemVvZiAqcmVxLCAxNik7CiAJc2tiID0gZ2V0X3NrYihza2IsIHdybGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikgewpAQCAtNTMzLDEyICs1MzgsMzkgQEAKIAltcGEgPSAoc3RydWN0IG1wYV9tZXNzYWdlICopKHJlcSArIDEpOwogCW1lbWNweShtcGEtPmtleSwgTVBBX0tFWV9SRVEsIHNpemVvZihtcGEtPmtleSkpOwogCW1wYS0+ZmxhZ3MgPSAoY3JjX2VuYWJsZWQgPyBNUEFfQ1JDIDogMCkgfAotCQkgICAgIChtYXJrZXJzX2VuYWJsZWQgPyBNUEFfTUFSS0VSUyA6IDApOworCQkgICAgIChtYXJrZXJzX2VuYWJsZWQgPyBNUEFfTUFSS0VSUyA6IDApIHwKKwkJICAgICAobXBhX3Jldl90b191c2UgPT0gMiA/IE1QQV9FTkhBTkNFRF9SRE1BX0NPTk4gOiAwKTsKIAltcGEtPnByaXZhdGVfZGF0YV9zaXplID0gaHRvbnMoZXAtPnBsZW4pOwotCW1wYS0+cmV2aXNpb24gPSBtcGFfcmV2OworCW1wYS0+cmV2aXNpb24gPSBtcGFfcmV2X3RvX3VzZTsKKwlpZiAobXBhX3Jldl90b191c2UgPT0gMSkKKwkJZXAtPnRyaWVkX3dpdGhfbXBhX3YxID0gMTsKIAotCWlmIChlcC0+cGxlbikKLQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLCBlcC0+bXBhX3BrdCArIHNpemVvZigqbXBhKSwgZXAtPnBsZW4pOworCWlmIChtcGFfcmV2X3RvX3VzZSA9PSAyKSB7CisJCW1wYS0+cHJpdmF0ZV9kYXRhX3NpemUgKz0KKwkJCWh0b25zKHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKSk7CisJCW1wYV92Ml9wYXJhbXMuaXJkID0gaHRvbnMoKHUxNillcC0+aXJkKTsKKwkJbXBhX3YyX3BhcmFtcy5vcmQgPSBodG9ucygodTE2KWVwLT5vcmQpOworCisJCWlmIChwZWVyMnBlZXIpIHsKKwkJCW1wYV92Ml9wYXJhbXMuaXJkIHw9IGh0b25zKE1QQV9WMl9QRUVSMlBFRVJfTU9ERUwpOworCQkJaWYgKHAycF90eXBlID09IEZXX1JJX0lOSVRfUDJQVFlQRV9SRE1BX1dSSVRFKQorCQkJCW1wYV92Ml9wYXJhbXMub3JkIHw9CisJCQkJCWh0b25zKE1QQV9WMl9SRE1BX1dSSVRFX1JUUik7CisJCQllbHNlIGlmIChwMnBfdHlwZSA9PSBGV19SSV9JTklUX1AyUFRZUEVfUkVBRF9SRVEpCisJCQkJbXBhX3YyX3BhcmFtcy5vcmQgfD0KKwkJCQkJaHRvbnMoTVBBX1YyX1JETUFfUkVBRF9SVFIpOworCQl9CisJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgJm1wYV92Ml9wYXJhbXMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcykpOworCisJCWlmIChlcC0+cGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpLAorCQkJICAgICAgIGVwLT5tcGFfcGt0ICsgc2l6ZW9mKCptcGEpLCBlcC0+cGxlbik7CisJfSBlbHNlCisJCWlmIChlcC0+cGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwKKwkJCQkJZXAtPm1wYV9wa3QgKyBzaXplb2YoKm1wYSksIGVwLT5wbGVuKTsKIAogCS8qCiAJICogUmVmZXJlbmNlIHRoZSBtcGEgc2tiLiAgVGhpcyBlbnN1cmVzIHRoZSBkYXRhIGFyZWEKQEAgLTU2MiwxMCArNTk0LDEzIEBACiAJc3RydWN0IGZ3X29mbGRfdHhfZGF0YV93ciAqcmVxOwogCXN0cnVjdCBtcGFfbWVzc2FnZSAqbXBhOwogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyBtcGFfdjJfcGFyYW1zOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IHBkX2xlbiAlZFxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQsIGVwLT5wbGVuKTsKIAogCW1wYWxlbiA9IHNpemVvZigqbXBhKSArIHBsZW47CisJaWYgKGVwLT5tcGFfYXR0ci52ZXJzaW9uID09IDIgJiYgZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikKKwkJbXBhbGVuICs9IHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKTsKIAl3cmxlbiA9IHJvdW5kdXAobXBhbGVuICsgc2l6ZW9mICpyZXEsIDE2KTsKIAogCXNrYiA9IGdldF9za2IoTlVMTCwgd3JsZW4sIEdGUF9LRVJORUwpOwpAQCAtNTk1LDggKzYzMCwyOSBAQAogCW1wYS0+ZmxhZ3MgPSBNUEFfUkVKRUNUOwogCW1wYS0+cmV2aXNpb24gPSBtcGFfcmV2OwogCW1wYS0+cHJpdmF0ZV9kYXRhX3NpemUgPSBodG9ucyhwbGVuKTsKLQlpZiAocGxlbikKLQkJbWVtY3B5KG1wYS0+cHJpdmF0ZV9kYXRhLCBwZGF0YSwgcGxlbik7CisKKwlpZiAoZXAtPm1wYV9hdHRyLnZlcnNpb24gPT0gMiAmJiBlcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uKSB7CisJCW1wYS0+ZmxhZ3MgfD0gTVBBX0VOSEFOQ0VEX1JETUFfQ09OTjsKKwkJbXBhLT5wcml2YXRlX2RhdGFfc2l6ZSArPQorCQkJaHRvbnMoc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpKTsKKwkJbXBhX3YyX3BhcmFtcy5pcmQgPSBodG9ucygoKHUxNillcC0+aXJkKSB8CisJCQkJCSAgKHBlZXIycGVlciA/IE1QQV9WMl9QRUVSMlBFRVJfTU9ERUwgOgorCQkJCQkgICAwKSk7CisJCW1wYV92Ml9wYXJhbXMub3JkID0gaHRvbnMoKCh1MTYpZXAtPm9yZCkgfCAocGVlcjJwZWVyID8KKwkJCQkJICAocDJwX3R5cGUgPT0KKwkJCQkJICAgRldfUklfSU5JVF9QMlBUWVBFX1JETUFfV1JJVEUgPworCQkJCQkgICBNUEFfVjJfUkRNQV9XUklURV9SVFIgOiBwMnBfdHlwZSA9PQorCQkJCQkgICBGV19SSV9JTklUX1AyUFRZUEVfUkVBRF9SRVEgPworCQkJCQkgICBNUEFfVjJfUkRNQV9SRUFEX1JUUiA6IDApIDogMCkpOworCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEsICZtcGFfdjJfcGFyYW1zLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpKTsKKworCQlpZiAoZXAtPnBsZW4pCisJCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKSwgcGRhdGEsIHBsZW4pOworCX0gZWxzZQorCQlpZiAocGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgcGRhdGEsIHBsZW4pOwogCiAJLyoKIAkgKiBSZWZlcmVuY2UgdGhlIG1wYSBza2IgYWdhaW4uICBUaGlzIGVuc3VyZXMgdGhlIGRhdGEgYXJlYQpAQCAtNjE3LDEwICs2NzMsMTMgQEAKIAlzdHJ1Y3QgZndfb2ZsZF90eF9kYXRhX3dyICpyZXE7CiAJc3RydWN0IG1wYV9tZXNzYWdlICptcGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zIG1wYV92Ml9wYXJhbXM7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXUgcGRfbGVuICVkXG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCwgZXAtPnBsZW4pOwogCiAJbXBhbGVuID0gc2l6ZW9mKCptcGEpICsgcGxlbjsKKwlpZiAoZXAtPm1wYV9hdHRyLnZlcnNpb24gPT0gMiAmJiBlcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uKQorCQltcGFsZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpOwogCXdybGVuID0gcm91bmR1cChtcGFsZW4gKyBzaXplb2YgKnJlcSwgMTYpOwogCiAJc2tiID0gZ2V0X3NrYihOVUxMLCB3cmxlbiwgR0ZQX0tFUk5FTCk7CkBAIC02NDksMTAgKzcwOCwzNiBAQAogCW1lbWNweShtcGEtPmtleSwgTVBBX0tFWV9SRVAsIHNpemVvZihtcGEtPmtleSkpOwogCW1wYS0+ZmxhZ3MgPSAoZXAtPm1wYV9hdHRyLmNyY19lbmFibGVkID8gTVBBX0NSQyA6IDApIHwKIAkJICAgICAobWFya2Vyc19lbmFibGVkID8gTVBBX01BUktFUlMgOiAwKTsKLQltcGEtPnJldmlzaW9uID0gbXBhX3JldjsKKwltcGEtPnJldmlzaW9uID0gZXAtPm1wYV9hdHRyLnZlcnNpb247CiAJbXBhLT5wcml2YXRlX2RhdGFfc2l6ZSA9IGh0b25zKHBsZW4pOwotCWlmIChwbGVuKQotCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEsIHBkYXRhLCBwbGVuKTsKKworCWlmIChlcC0+bXBhX2F0dHIudmVyc2lvbiA9PSAyICYmIGVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4pIHsKKwkJbXBhLT5mbGFncyB8PSBNUEFfRU5IQU5DRURfUkRNQV9DT05OOworCQltcGEtPnByaXZhdGVfZGF0YV9zaXplICs9CisJCQlodG9ucyhzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcykpOworCQltcGFfdjJfcGFyYW1zLmlyZCA9IGh0b25zKCh1MTYpZXAtPmlyZCk7CisJCW1wYV92Ml9wYXJhbXMub3JkID0gaHRvbnMoKHUxNillcC0+b3JkKTsKKwkJaWYgKHBlZXIycGVlciAmJiAoZXAtPm1wYV9hdHRyLnAycF90eXBlICE9CisJCQkJCUZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRCkpIHsKKwkJCW1wYV92Ml9wYXJhbXMuaXJkIHw9IGh0b25zKE1QQV9WMl9QRUVSMlBFRVJfTU9ERUwpOworCisJCQlpZiAocDJwX3R5cGUgPT0gRldfUklfSU5JVF9QMlBUWVBFX1JETUFfV1JJVEUpCisJCQkJbXBhX3YyX3BhcmFtcy5vcmQgfD0KKwkJCQkJaHRvbnMoTVBBX1YyX1JETUFfV1JJVEVfUlRSKTsKKwkJCWVsc2UgaWYgKHAycF90eXBlID09IEZXX1JJX0lOSVRfUDJQVFlQRV9SRUFEX1JFUSkKKwkJCQltcGFfdjJfcGFyYW1zLm9yZCB8PQorCQkJCQlodG9ucyhNUEFfVjJfUkRNQV9SRUFEX1JUUik7CisJCX0KKworCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEsICZtcGFfdjJfcGFyYW1zLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpKTsKKworCQlpZiAoZXAtPnBsZW4pCisJCQltZW1jcHkobXBhLT5wcml2YXRlX2RhdGEgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKSwgcGRhdGEsIHBsZW4pOworCX0gZWxzZQorCQlpZiAocGxlbikKKwkJCW1lbWNweShtcGEtPnByaXZhdGVfZGF0YSwgcGRhdGEsIHBsZW4pOwogCiAJLyoKIAkgKiBSZWZlcmVuY2UgdGhlIG1wYSBza2IuICBUaGlzIGVuc3VyZXMgdGhlIGRhdGEgYXJlYQpAQCAtNjk1LDcgKzc4MCwxMCBAQAogCiAJLyogc3RhcnQgTVBBIG5lZ290aWF0aW9uICovCiAJc2VuZF9mbG93YyhlcCwgTlVMTCk7Ci0Jc2VuZF9tcGFfcmVxKGVwLCBza2IpOworCWlmIChlcC0+cmV0cnlfd2l0aF9tcGFfdjEpCisJCXNlbmRfbXBhX3JlcShlcCwgc2tiLCAxKTsKKwllbHNlCisJCXNlbmRfbXBhX3JlcShlcCwgc2tiLCBtcGFfcmV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNzY5LDggKzg1NywxOSBAQAogCWV2ZW50LnJlbW90ZV9hZGRyID0gZXAtPmNvbS5yZW1vdGVfYWRkcjsKIAogCWlmICgoc3RhdHVzID09IDApIHx8IChzdGF0dXMgPT0gLUVDT05OUkVGVVNFRCkpIHsKLQkJZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IGVwLT5wbGVuOwotCQlldmVudC5wcml2YXRlX2RhdGEgPSBlcC0+bXBhX3BrdCArIHNpemVvZihzdHJ1Y3QgbXBhX21lc3NhZ2UpOworCQlpZiAoIWVwLT50cmllZF93aXRoX21wYV92MSkgeworCQkJLyogdGhpcyBtZWFucyBNUEFfdjIgaXMgdXNlZCAqLworCQkJZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IGVwLT5wbGVuIC0KKwkJCQlzaXplb2Yoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyk7CisJCQlldmVudC5wcml2YXRlX2RhdGEgPSBlcC0+bXBhX3BrdCArCisJCQkJc2l6ZW9mKHN0cnVjdCBtcGFfbWVzc2FnZSkgKworCQkJCXNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoaXMgbWVhbnMgTVBBX3YxIGlzIHVzZWQgKi8KKwkJCWV2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSBlcC0+cGxlbjsKKwkJCWV2ZW50LnByaXZhdGVfZGF0YSA9IGVwLT5tcGFfcGt0ICsKKwkJCQlzaXplb2Yoc3RydWN0IG1wYV9tZXNzYWdlKTsKKwkJfQogCX0KIAogCVBEQkcoIiVzIGVwICVwIHRpZCAldSBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBlcCwKQEAgLTc5Myw5ICs4OTIsMjIgQEAKIAlldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDsKIAlldmVudC5sb2NhbF9hZGRyID0gZXAtPmNvbS5sb2NhbF9hZGRyOwogCWV2ZW50LnJlbW90ZV9hZGRyID0gZXAtPmNvbS5yZW1vdGVfYWRkcjsKLQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW47Ci0JZXZlbnQucHJpdmF0ZV9kYXRhID0gZXAtPm1wYV9wa3QgKyBzaXplb2Yoc3RydWN0IG1wYV9tZXNzYWdlKTsKIAlldmVudC5wcm92aWRlcl9kYXRhID0gZXA7CisJaWYgKCFlcC0+dHJpZWRfd2l0aF9tcGFfdjEpIHsKKwkJLyogdGhpcyBtZWFucyBNUEFfdjIgaXMgdXNlZCAqLworCQlldmVudC5vcmQgPSBlcC0+b3JkOworCQlldmVudC5pcmQgPSBlcC0+aXJkOworCQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZXAtPnBsZW4gLQorCQkJc2l6ZW9mKHN0cnVjdCBtcGFfdjJfY29ubl9wYXJhbXMpOworCQlldmVudC5wcml2YXRlX2RhdGEgPSBlcC0+bXBhX3BrdCArIHNpemVvZihzdHJ1Y3QgbXBhX21lc3NhZ2UpICsKKwkJCXNpemVvZihzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zKTsKKwl9IGVsc2UgeworCQkvKiB0aGlzIG1lYW5zIE1QQV92MSBpcyB1c2VkLiBTZW5kIG1heCBzdXBwb3J0ZWQgKi8KKwkJZXZlbnQub3JkID0gYzRpd19tYXhfcmVhZF9kZXB0aDsKKwkJZXZlbnQuaXJkID0gYzRpd19tYXhfcmVhZF9kZXB0aDsKKwkJZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IGVwLT5wbGVuOworCQlldmVudC5wcml2YXRlX2RhdGEgPSBlcC0+bXBhX3BrdCArIHNpemVvZihzdHJ1Y3QgbXBhX21lc3NhZ2UpOworCX0KIAlpZiAoc3RhdGVfcmVhZCgmZXAtPnBhcmVudF9lcC0+Y29tKSAhPSBERUFEKSB7CiAJCWM0aXdfZ2V0X2VwKCZlcC0+Y29tKTsKIAkJZXAtPnBhcmVudF9lcC0+Y29tLmNtX2lkLT5ldmVudF9oYW5kbGVyKApAQCAtODEzLDYgKzkyNSw4IEBACiAJUERCRygiJXMgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCk7CiAJbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CiAJZXZlbnQuZXZlbnQgPSBJV19DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwlldmVudC5pcmQgPSBlcC0+aXJkOworCWV2ZW50Lm9yZCA9IGVwLT5vcmQ7CiAJaWYgKGVwLT5jb20uY21faWQpIHsKIAkJUERCRygiJXMgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgZXAsIGVwLT5od3RpZCk7CiAJCWVwLT5jb20uY21faWQtPmV2ZW50X2hhbmRsZXIoZXAtPmNvbS5jbV9pZCwgJmV2ZW50KTsKQEAgLTg0OCw3ICs5NjIsMTAgQEAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfbXBhX3JlcGx5KHN0cnVjdCBjNGl3X2VwICplcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbXBhX21lc3NhZ2UgKm1wYTsKKwlzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zICptcGFfdjJfcGFyYW1zOwogCXUxNiBwbGVuOworCXUxNiByZXNwX2lyZCwgcmVzcF9vcmQ7CisJdTggcnRyX21pc21hdGNoID0gMCwgaW5zdWZmX2lyZCA9IDA7CiAJc3RydWN0IGM0aXdfcXBfYXR0cmlidXRlcyBhdHRyczsKIAllbnVtIGM0aXdfcXBfYXR0cl9tYXNrIG1hc2s7CiAJaW50IGVycjsKQEAgLTg4OCw3ICsxMDA1LDkgQEAKIAltcGEgPSAoc3RydWN0IG1wYV9tZXNzYWdlICopIGVwLT5tcGFfcGt0OwogCiAJLyogVmFsaWRhdGUgTVBBIGhlYWRlci4gKi8KLQlpZiAobXBhLT5yZXZpc2lvbiAhPSBtcGFfcmV2KSB7CisJaWYgKG1wYS0+cmV2aXNpb24gPiBtcGFfcmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIE1QQSB2ZXJzaW9uIG1pc21hdGNoLiBMb2NhbCA9ICVkLCIKKwkJICAgICAgICIgUmVjZWl2ZWQgPSAlZFxuIiwgX19mdW5jX18sIG1wYV9yZXYsIG1wYS0+cmV2aXNpb24pOwogCQllcnIgPSAtRVBST1RPOwogCQlnb3RvIGVycjsKIAl9CkBAIC05MzgsMTMgKzEwNTcsNjYgQEAKIAllcC0+bXBhX2F0dHIuY3JjX2VuYWJsZWQgPSAobXBhLT5mbGFncyAmIE1QQV9DUkMpIHwgY3JjX2VuYWJsZWQgPyAxIDogMDsKIAllcC0+bXBhX2F0dHIucmVjdl9tYXJrZXJfZW5hYmxlZCA9IG1hcmtlcnNfZW5hYmxlZDsKIAllcC0+bXBhX2F0dHIueG1pdF9tYXJrZXJfZW5hYmxlZCA9IG1wYS0+ZmxhZ3MgJiBNUEFfTUFSS0VSUyA/IDEgOiAwOwotCWVwLT5tcGFfYXR0ci52ZXJzaW9uID0gbXBhX3JldjsKLQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPSBwZWVyMnBlZXIgPyBwMnBfdHlwZSA6Ci0JCQkJCSAgICBGV19SSV9JTklUX1AyUFRZUEVfRElTQUJMRUQ7CisJZXAtPm1wYV9hdHRyLnZlcnNpb24gPSBtcGEtPnJldmlzaW9uOworCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9IEZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRDsKKworCWlmIChtcGEtPnJldmlzaW9uID09IDIpIHsKKwkJZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubiA9CisJCQltcGEtPmZsYWdzICYgTVBBX0VOSEFOQ0VEX1JETUFfQ09OTiA/IDEgOiAwOworCQlpZiAoZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikgeworCQkJbXBhX3YyX3BhcmFtcyA9IChzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zICopCisJCQkJKGVwLT5tcGFfcGt0ICsgc2l6ZW9mKCptcGEpKTsKKwkJCXJlc3BfaXJkID0gbnRvaHMobXBhX3YyX3BhcmFtcy0+aXJkKSAmCisJCQkJTVBBX1YyX0lSRF9PUkRfTUFTSzsKKwkJCXJlc3Bfb3JkID0gbnRvaHMobXBhX3YyX3BhcmFtcy0+b3JkKSAmCisJCQkJTVBBX1YyX0lSRF9PUkRfTUFTSzsKKworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBkb3VibGUtY2hlY2suIElkZWFsbHksIGJlbG93IGNoZWNrcyBhcmUKKwkJCSAqIG5vdCByZXF1aXJlZCBzaW5jZSBpcmQvb3JkIHN0dWZmIGhhcyBiZWVuIHRha2VuCisJCQkgKiBjYXJlIG9mIGluIGM0aXdfYWNjZXB0X2NyCisJCQkgKi8KKwkJCWlmICgoZXAtPmlyZCA8IHJlc3Bfb3JkKSB8fCAoZXAtPm9yZCA+IHJlc3BfaXJkKSkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZXAtPmlyZCA9IHJlc3Bfb3JkOworCQkJCWVwLT5vcmQgPSByZXNwX2lyZDsKKwkJCQlpbnN1ZmZfaXJkID0gMTsKKwkJCX0KKworCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJgorCQkJCQlNUEFfVjJfUEVFUjJQRUVSX01PREVMKSB7CisJCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPm9yZCkgJgorCQkJCQkJTVBBX1YyX1JETUFfV1JJVEVfUlRSKQorCQkJCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPQorCQkJCQkJRldfUklfSU5JVF9QMlBUWVBFX1JETUFfV1JJVEU7CisJCQkJZWxzZSBpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+b3JkKSAmCisJCQkJCQlNUEFfVjJfUkRNQV9SRUFEX1JUUikKKwkJCQkJZXAtPm1wYV9hdHRyLnAycF90eXBlID0KKwkJCQkJCUZXX1JJX0lOSVRfUDJQVFlQRV9SRUFEX1JFUTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAobXBhLT5yZXZpc2lvbiA9PSAxKQorCQlpZiAocGVlcjJwZWVyKQorCQkJZXAtPm1wYV9hdHRyLnAycF90eXBlID0gcDJwX3R5cGU7CisKIAlQREJHKCIlcyAtIGNyY19lbmFibGVkPSVkLCByZWN2X21hcmtlcl9lbmFibGVkPSVkLCAiCi0JICAgICAieG1pdF9tYXJrZXJfZW5hYmxlZD0lZCwgdmVyc2lvbj0lZFxuIiwgX19mdW5jX18sCi0JICAgICBlcC0+bXBhX2F0dHIuY3JjX2VuYWJsZWQsIGVwLT5tcGFfYXR0ci5yZWN2X21hcmtlcl9lbmFibGVkLAotCSAgICAgZXAtPm1wYV9hdHRyLnhtaXRfbWFya2VyX2VuYWJsZWQsIGVwLT5tcGFfYXR0ci52ZXJzaW9uKTsKKwkgICAgICJ4bWl0X21hcmtlcl9lbmFibGVkPSVkLCB2ZXJzaW9uPSVkIHAycF90eXBlPSVkIGxvY2FsLXAycF90eXBlID0gIgorCSAgICAgIiVkXG4iLCBfX2Z1bmNfXywgZXAtPm1wYV9hdHRyLmNyY19lbmFibGVkLAorCSAgICAgZXAtPm1wYV9hdHRyLnJlY3ZfbWFya2VyX2VuYWJsZWQsCisJICAgICBlcC0+bXBhX2F0dHIueG1pdF9tYXJrZXJfZW5hYmxlZCwgZXAtPm1wYV9hdHRyLnZlcnNpb24sCisJICAgICBlcC0+bXBhX2F0dHIucDJwX3R5cGUsIHAycF90eXBlKTsKKworCS8qCisJICogSWYgcmVzcG9uZGVyJ3MgUlRSIGRvZXMgbm90IG1hdGNoIHdpdGggdGhhdCBvZiBpbml0aWF0b3IsIGFzc2lnbgorCSAqIEZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRCBpbiBtcGEgYXR0cmlidXRlcyBzbyB0aGF0IFJUUiBpcyBub3QKKwkgKiBnZW5lcmF0ZWQgd2hlbiBtb3ZpbmcgUVAgdG8gUlRTIHN0YXRlLgorCSAqIEEgVEVSTSBtZXNzYWdlIHdpbGwgYmUgc2VudCBhZnRlciBRUCBoYXMgbW92ZWQgdG8gUlRTIHN0YXRlCisJICovCisJaWYgKChlcC0+bXBhX2F0dHIudmVyc2lvbiA9PSAyKSAmJgorCQkJKGVwLT5tcGFfYXR0ci5wMnBfdHlwZSAhPSBwMnBfdHlwZSkpIHsKKwkJZXAtPm1wYV9hdHRyLnAycF90eXBlID0gRldfUklfSU5JVF9QMlBUWVBFX0RJU0FCTEVEOworCQlydHJfbWlzbWF0Y2ggPSAxOworCX0KIAogCWF0dHJzLm1wYV9hdHRyID0gZXAtPm1wYV9hdHRyOwogCWF0dHJzLm1heF9pcmQgPSBlcC0+aXJkOwpAQCAtOTYxLDYgKzExMzMsMzkgQEAKIAkJCSAgICAgZXAtPmNvbS5xcCwgbWFzaywgJmF0dHJzLCAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjsKKworCS8qCisJICogSWYgcmVzcG9uZGVyJ3MgUlRSIHJlcXVpcmVtZW50IGRpZCBub3QgbWF0Y2ggd2l0aCB3aGF0IGluaXRpYXRvcgorCSAqIHN1cHBvcnRzLCBnZW5lcmF0ZSBURVJNIG1lc3NhZ2UKKwkgKi8KKwlpZiAocnRyX21pc21hdGNoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJUUiBtaXNtYXRjaCwgc2VuZGluZyBURVJNXG4iLCBfX2Z1bmNfXyk7CisJCWF0dHJzLmxheWVyX2V0eXBlID0gTEFZRVJfTVBBIHwgRERQX0xMUDsKKwkJYXR0cnMuZWNvZGUgPSBNUEFfTk9NQVRDSF9SVFI7CisJCWF0dHJzLm5leHRfc3RhdGUgPSBDNElXX1FQX1NUQVRFX1RFUk1JTkFURTsKKwkJZXJyID0gYzRpd19tb2RpZnlfcXAoZXAtPmNvbS5xcC0+cmhwLCBlcC0+Y29tLnFwLAorCQkJCUM0SVdfUVBfQVRUUl9ORVhUX1NUQVRFLCAmYXR0cnMsIDApOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEdlbmVyYXRlIFRFUk0gaWYgaW5pdGlhdG9yIElSRCBpcyBub3Qgc3VmZmljaWVudCBmb3IgcmVzcG9uZGVyCisJICogcHJvdmlkZWQgT1JELiBDdXJyZW50bHksIHdlIGRvIHRoZSBzYW1lIGJlaGF2aW91ciBldmVuIHdoZW4KKwkgKiByZXNwb25kZXIgcHJvdmlkZWQgSVJEIGlzIGFsc28gbm90IHN1ZmZpY2llbnQgYXMgcmVnYXJkcyB0bworCSAqIGluaXRpYXRvciBPUkQuCisJICovCisJaWYgKGluc3VmZl9pcmQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW5zdWZmaWNpZW50IElSRCwgc2VuZGluZyBURVJNXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJYXR0cnMubGF5ZXJfZXR5cGUgPSBMQVlFUl9NUEEgfCBERFBfTExQOworCQlhdHRycy5lY29kZSA9IE1QQV9JTlNVRkZfSVJEOworCQlhdHRycy5uZXh0X3N0YXRlID0gQzRJV19RUF9TVEFURV9URVJNSU5BVEU7CisJCWVyciA9IGM0aXdfbW9kaWZ5X3FwKGVwLT5jb20ucXAtPnJocCwgZXAtPmNvbS5xcCwKKwkJCQlDNElXX1FQX0FUVFJfTkVYVF9TVEFURSwgJmF0dHJzLCAwKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCWdvdG8gb3V0OwogZXJyOgogCXN0YXRlX3NldCgmZXAtPmNvbSwgQUJPUlRJTkcpOwpAQCAtOTczLDYgKzExNzgsNyBAQAogc3RhdGljIHZvaWQgcHJvY2Vzc19tcGFfcmVxdWVzdChzdHJ1Y3QgYzRpd19lcCAqZXAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG1wYV9tZXNzYWdlICptcGE7CisJc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyAqbXBhX3YyX3BhcmFtczsKIAl1MTYgcGxlbjsKIAogCVBEQkcoIiVzIGVwICVwIHRpZCAldVxuIiwgX19mdW5jX18sIGVwLCBlcC0+aHd0aWQpOwpAQCAtMTAxMyw3ICsxMjE5LDkgQEAKIAkvKgogCSAqIFZhbGlkYXRlIE1QQSBIZWFkZXIuCiAJICovCi0JaWYgKG1wYS0+cmV2aXNpb24gIT0gbXBhX3JldikgeworCWlmIChtcGEtPnJldmlzaW9uID4gbXBhX3JldikgeworCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyBNUEEgdmVyc2lvbiBtaXNtYXRjaC4gTG9jYWwgPSAlZCwiCisJCSAgICAgICAiIFJlY2VpdmVkID0gJWRcbiIsIF9fZnVuY19fLCBtcGFfcmV2LCBtcGEtPnJldmlzaW9uKTsKIAkJYWJvcnRfY29ubmVjdGlvbihlcCwgc2tiLCBHRlBfS0VSTkVMKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEwNTYsOSArMTI2NCwzNyBAQAogCWVwLT5tcGFfYXR0ci5jcmNfZW5hYmxlZCA9IChtcGEtPmZsYWdzICYgTVBBX0NSQykgfCBjcmNfZW5hYmxlZCA/IDEgOiAwOwogCWVwLT5tcGFfYXR0ci5yZWN2X21hcmtlcl9lbmFibGVkID0gbWFya2Vyc19lbmFibGVkOwogCWVwLT5tcGFfYXR0ci54bWl0X21hcmtlcl9lbmFibGVkID0gbXBhLT5mbGFncyAmIE1QQV9NQVJLRVJTID8gMSA6IDA7Ci0JZXAtPm1wYV9hdHRyLnZlcnNpb24gPSBtcGFfcmV2OwotCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9IHBlZXIycGVlciA/IHAycF90eXBlIDoKLQkJCQkJICAgIEZXX1JJX0lOSVRfUDJQVFlQRV9ESVNBQkxFRDsKKwllcC0+bXBhX2F0dHIudmVyc2lvbiA9IG1wYS0+cmV2aXNpb247CisJaWYgKG1wYS0+cmV2aXNpb24gPT0gMSkKKwkJZXAtPnRyaWVkX3dpdGhfbXBhX3YxID0gMTsKKwllcC0+bXBhX2F0dHIucDJwX3R5cGUgPSBGV19SSV9JTklUX1AyUFRZUEVfRElTQUJMRUQ7CisKKwlpZiAobXBhLT5yZXZpc2lvbiA9PSAyKSB7CisJCWVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4gPQorCQkJbXBhLT5mbGFncyAmIE1QQV9FTkhBTkNFRF9SRE1BX0NPTk4gPyAxIDogMDsKKwkJaWYgKGVwLT5tcGFfYXR0ci5lbmhhbmNlZF9yZG1hX2Nvbm4pIHsKKwkJCW1wYV92Ml9wYXJhbXMgPSAoc3RydWN0IG1wYV92Ml9jb25uX3BhcmFtcyAqKQorCQkJCShlcC0+bXBhX3BrdCArIHNpemVvZigqbXBhKSk7CisJCQllcC0+aXJkID0gbnRvaHMobXBhX3YyX3BhcmFtcy0+aXJkKSAmCisJCQkJTVBBX1YyX0lSRF9PUkRfTUFTSzsKKwkJCWVwLT5vcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKKwkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJiBNUEFfVjJfUEVFUjJQRUVSX01PREVMKQorCQkJCWlmIChwZWVyMnBlZXIpIHsKKwkJCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPm9yZCkgJgorCQkJCQkJCU1QQV9WMl9SRE1BX1dSSVRFX1JUUikKKwkJCQkJCWVwLT5tcGFfYXR0ci5wMnBfdHlwZSA9CisJCQkJCQlGV19SSV9JTklUX1AyUFRZUEVfUkRNQV9XUklURTsKKwkJCQkJZWxzZSBpZiAobnRvaHMobXBhX3YyX3BhcmFtcy0+b3JkKSAmCisJCQkJCQkJTVBBX1YyX1JETUFfUkVBRF9SVFIpCisJCQkJCQllcC0+bXBhX2F0dHIucDJwX3R5cGUgPQorCQkJCQkJRldfUklfSU5JVF9QMlBUWVBFX1JFQURfUkVROworCQkJCX0KKwkJfQorCX0gZWxzZSBpZiAobXBhLT5yZXZpc2lvbiA9PSAxKQorCQlpZiAocGVlcjJwZWVyKQorCQkJZXAtPm1wYV9hdHRyLnAycF90eXBlID0gcDJwX3R5cGU7CisKIAlQREJHKCIlcyAtIGNyY19lbmFibGVkPSVkLCByZWN2X21hcmtlcl9lbmFibGVkPSVkLCAiCiAJICAgICAieG1pdF9tYXJrZXJfZW5hYmxlZD0lZCwgdmVyc2lvbj0lZCBwMnBfdHlwZT0lZFxuIiwgX19mdW5jX18sCiAJICAgICBlcC0+bXBhX2F0dHIuY3JjX2VuYWJsZWQsIGVwLT5tcGFfYXR0ci5yZWN2X21hcmtlcl9lbmFibGVkLApAQCAtMTU1MCw2ICsxNzg2LDExMiBAQAogCSAgICAgICBzdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0U7CiB9CiAKK3N0YXRpYyBpbnQgYzRpd19yZWNvbm5lY3Qoc3RydWN0IGM0aXdfZXAgKmVwKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBuZXRfZGV2aWNlICpwZGV2OworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCWludCBzdGVwOworCisJUERCRygiJXMgcXAgJXAgY21faWQgJXBcbiIsIF9fZnVuY19fLCBlcC0+Y29tLnFwLCBlcC0+Y29tLmNtX2lkKTsKKwlpbml0X3RpbWVyKCZlcC0+dGltZXIpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBhY3RpdmUgVElEIHRvIGluaXRpYXRlIGEgVENQIGNvbm5lY3Rpb24uCisJICovCisJZXAtPmF0aWQgPSBjeGdiNF9hbGxvY19hdGlkKGVwLT5jb20uZGV2LT5yZGV2LmxsZGkudGlkcywgZXApOworCWlmIChlcC0+YXRpZCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBhbGxvYyBhdGlkLlxuIiwgX19mdW5jX18pOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwyOworCX0KKworCS8qIGZpbmQgYSByb3V0ZSAqLworCXJ0ID0gZmluZF9yb3V0ZShlcC0+Y29tLmRldiwKKwkJCWVwLT5jb20uY21faWQtPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyLAorCQkJZXAtPmNvbS5jbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyLAorCQkJZXAtPmNvbS5jbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCwKKwkJCWVwLT5jb20uY21faWQtPnJlbW90ZV9hZGRyLnNpbl9wb3J0LCAwKTsKKwlpZiAoIXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGZpbmQgcm91dGUuXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCWdvdG8gZmFpbDM7CisJfQorCWVwLT5kc3QgPSAmcnQtPmRzdDsKKworCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZXAtPmRzdCk7CisKKwkvKiBnZXQgYSBsMnQgZW50cnkgKi8KKwlpZiAobmVpZ2gtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkJUERCRygiJXMgTE9PUEJBQ0tcbiIsIF9fZnVuY19fKTsKKwkJcGRldiA9IGlwX2Rldl9maW5kKCZpbml0X25ldCwKKwkJCQkgICBlcC0+Y29tLmNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpOworCQllcC0+bDJ0ID0gY3hnYjRfbDJ0X2dldChlcC0+Y29tLmRldi0+cmRldi5sbGRpLmwydCwKKwkJCQkJbmVpZ2gsIHBkZXYsIDApOworCQllcC0+bXR1ID0gcGRldi0+bXR1OworCQllcC0+dHhfY2hhbiA9IGN4Z2I0X3BvcnRfY2hhbihwZGV2KTsKKwkJZXAtPnNtYWNfaWR4ID0gKGN4Z2I0X3BvcnRfdmlpZChwZGV2KSAmIDB4N0YpIDw8IDE7CisJCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm50eHEgLworCQkJZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKKwkJZXAtPnR4cV9pZHggPSBjeGdiNF9wb3J0X2lkeChwZGV2KSAqIHN0ZXA7CisJCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5yeHEgLworCQkJZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKKwkJZXAtPmN0cmxxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KHBkZXYpOworCQllcC0+cnNzX3FpZCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkucnhxX2lkc1sKKwkJCWN4Z2I0X3BvcnRfaWR4KHBkZXYpICogc3RlcF07CisJCWRldl9wdXQocGRldik7CisJfSBlbHNlIHsKKwkJZXAtPmwydCA9IGN4Z2I0X2wydF9nZXQoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5sMnQsCisJCQkJCW5laWdoLCBuZWlnaC0+ZGV2LCAwKTsKKwkJZXAtPm10dSA9IGRzdF9tdHUoZXAtPmRzdCk7CisJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKG5laWdoLT5kZXYpOworCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKG5laWdoLT5kZXYpICYgMHg3RikgPDwgMTsKKwkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnR4cSAvCisJCQllcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOworCQllcC0+dHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpICogc3RlcDsKKwkJZXAtPmN0cmxxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpOworCQlzdGVwID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5ucnhxIC8KKwkJCWVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47CisJCWVwLT5yc3NfcWlkID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5yeHFfaWRzWworCQkJY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwXTsKKwl9CisJaWYgKCFlcC0+bDJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGFsbG9jIGwyZS5cbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsNDsKKwl9CisKKwlQREJHKCIlcyB0eHFfaWR4ICV1IHR4X2NoYW4gJXUgc21hY19pZHggJXUgcnNzX3FpZCAldSBsMnRfaWR4ICV1XG4iLAorCSAgICAgX19mdW5jX18sIGVwLT50eHFfaWR4LCBlcC0+dHhfY2hhbiwgZXAtPnNtYWNfaWR4LCBlcC0+cnNzX3FpZCwKKwkgICAgIGVwLT5sMnQtPmlkeCk7CisKKwlzdGF0ZV9zZXQoJmVwLT5jb20sIENPTk5FQ1RJTkcpOworCWVwLT50b3MgPSAwOworCisJLyogc2VuZCBjb25uZWN0IHJlcXVlc3QgdG8gcm5pYyAqLworCWVyciA9IHNlbmRfY29ubmVjdChlcCk7CisJaWYgKCFlcnIpCisJCWdvdG8gb3V0OworCisJY3hnYjRfbDJ0X3JlbGVhc2UoZXAtPmwydCk7CitmYWlsNDoKKwlkc3RfcmVsZWFzZShlcC0+ZHN0KTsKK2ZhaWwzOgorCWN4Z2I0X2ZyZWVfYXRpZChlcC0+Y29tLmRldi0+cmRldi5sbGRpLnRpZHMsIGVwLT5hdGlkKTsKK2ZhaWwyOgorCS8qCisJICogcmVtZW1iZXIgdG8gc2VuZCBub3RpZmljYXRpb24gdG8gdXBwZXIgbGF5ZXIuCisJICogV2UgYXJlIGluIGhlcmUgc28gdGhlIHVwcGVyIGxheWVyIGlzIG5vdCBhd2FyZSB0aGF0IHRoaXMgaXMKKwkgKiByZS1jb25uZWN0IGF0dGVtcHQgYW5kIHNvLCB1cHBlciBsYXllciBpcyBzdGlsbCB3YWl0aW5nIGZvcgorCSAqIHJlc3BvbnNlIG9mIDFzdCBjb25uZWN0IHJlcXVlc3QuCisJICovCisJY29ubmVjdF9yZXBseV91cGNhbGwoZXAsIC1FQ09OTlJFU0VUKTsKKwljNGl3X3B1dF9lcCgmZXAtPmNvbSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBwZWVyX2Fib3J0KHN0cnVjdCBjNGl3X2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBjcGxfYWJvcnRfcmVxX3JzcyAqcmVxID0gY3BsaGRyKHNrYik7CkBAIC0xNTczLDggKzE5MTUsMTEgQEAKIAogCS8qCiAJICogV2FrZSB1cCBhbnkgdGhyZWFkcyBpbiByZG1hX2luaXQoKSBvciByZG1hX2ZpbmkoKS4KKwkgKiBIb3dldmVyLCB0aGlzIGlzIG5vdCBuZWVkZWQgaWYgY29tIHN0YXRlIGlzIGp1c3QKKwkgKiBNUEFfUkVRX1NFTlQKIAkgKi8KLQljNGl3X3dha2VfdXAoJmVwLT5jb20ud3Jfd2FpdCwgLUVDT05OUkVTRVQpOworCWlmIChlcC0+Y29tLnN0YXRlICE9IE1QQV9SRVFfU0VOVCkKKwkJYzRpd193YWtlX3VwKCZlcC0+Y29tLndyX3dhaXQsIC1FQ09OTlJFU0VUKTsKIAogCW11dGV4X2xvY2soJmVwLT5jb20ubXV0ZXgpOwogCXN3aXRjaCAoZXAtPmNvbS5zdGF0ZSkgewpAQCAtMTU4NSw3ICsxOTMwLDIxIEBACiAJCWJyZWFrOwogCWNhc2UgTVBBX1JFUV9TRU5UOgogCQlzdG9wX2VwX3RpbWVyKGVwKTsKLQkJY29ubmVjdF9yZXBseV91cGNhbGwoZXAsIC1FQ09OTlJFU0VUKTsKKwkJaWYgKG1wYV9yZXYgPT0gMiAmJiBlcC0+dHJpZWRfd2l0aF9tcGFfdjEpCisJCQljb25uZWN0X3JlcGx5X3VwY2FsbChlcCwgLUVDT05OUkVTRVQpOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiB3ZSBqdXN0IGRvbid0IHNlbmQgbm90aWZpY2F0aW9uIHVwd2FyZHMgYmVjYXVzZSB3ZQorCQkJICogd2FudCB0byByZXRyeSB3aXRoIG1wYV92MSB3aXRob3V0IHVwcGVyIGxheWVycyBldmVuCisJCQkgKiBrbm93aW5nIGl0LgorCQkJICoKKwkJCSAqIGRvIHNvbWUgaG91c2VrZWVwaW5nIHNvIGFzIHRvIHJlLWluaXRpYXRlIHRoZQorCQkJICogY29ubmVjdGlvbgorCQkJICovCisJCQlQREJHKCIlczogbXBhX3Jldj0lZC4gUmV0cnlpbmcgd2l0aCBtcGF2MVxuIiwgX19mdW5jX18sCisJCQkgICAgIG1wYV9yZXYpOworCQkJZXAtPnJldHJ5X3dpdGhfbXBhX3YxID0gMTsKKwkJfQogCQlicmVhazsKIAljYXNlIE1QQV9SRVBfU0VOVDoKIAkJYnJlYWs7CkBAIC0xNjIxLDcgKzE5ODAsOSBAQAogCWRzdF9jb25maXJtKGVwLT5kc3QpOwogCWlmIChlcC0+Y29tLnN0YXRlICE9IEFCT1JUSU5HKSB7CiAJCV9fc3RhdGVfc2V0KCZlcC0+Y29tLCBERUFEKTsKLQkJcmVsZWFzZSA9IDE7CisJCS8qIHdlIGRvbid0IHJlbGVhc2UgaWYgd2Ugd2FudCB0byByZXRyeSB3aXRoIG1wYV92MSAqLworCQlpZiAoIWVwLT5yZXRyeV93aXRoX21wYV92MSkKKwkJCXJlbGVhc2UgPSAxOwogCX0KIAltdXRleF91bmxvY2soJmVwLT5jb20ubXV0ZXgpOwogCkBAIC0xNjQxLDYgKzIwMDIsMTUgQEAKIG91dDoKIAlpZiAocmVsZWFzZSkKIAkJcmVsZWFzZV9lcF9yZXNvdXJjZXMoZXApOworCisJLyogcmV0cnkgd2l0aCBtcGEtdjEgKi8KKwlpZiAoZXAgJiYgZXAtPnJldHJ5X3dpdGhfbXBhX3YxKSB7CisJCWN4Z2I0X3JlbW92ZV90aWQoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS50aWRzLCAwLCBlcC0+aHd0aWQpOworCQlkc3RfcmVsZWFzZShlcC0+ZHN0KTsKKwkJY3hnYjRfbDJ0X3JlbGVhc2UoZXAtPmwydCk7CisJCWM0aXdfcmVjb25uZWN0KGVwKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5MiwxOCArMjE2Miw0MCBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQljbV9pZC0+YWRkX3JlZihjbV9pZCk7Ci0JZXAtPmNvbS5jbV9pZCA9IGNtX2lkOwotCWVwLT5jb20ucXAgPSBxcDsKKwlpZiAoZXAtPm1wYV9hdHRyLnZlcnNpb24gPT0gMiAmJiBlcC0+bXBhX2F0dHIuZW5oYW5jZWRfcmRtYV9jb25uKSB7CisJCWlmIChjb25uX3BhcmFtLT5vcmQgPiBlcC0+aXJkKSB7CisJCQllcC0+aXJkID0gY29ubl9wYXJhbS0+aXJkOworCQkJZXAtPm9yZCA9IGNvbm5fcGFyYW0tPm9yZDsKKwkJCXNlbmRfbXBhX3JlamVjdChlcCwgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLAorCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKwkJCWFib3J0X2Nvbm5lY3Rpb24oZXAsIE5VTEwsIEdGUF9LRVJORUwpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChjb25uX3BhcmFtLT5pcmQgPiBlcC0+b3JkKSB7CisJCQlpZiAoIWVwLT5vcmQpCisJCQkJY29ubl9wYXJhbS0+aXJkID0gMTsKKwkJCWVsc2UgeworCQkJCWFib3J0X2Nvbm5lY3Rpb24oZXAsIE5VTEwsIEdGUF9LRVJORUwpOworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KIAorCX0KIAllcC0+aXJkID0gY29ubl9wYXJhbS0+aXJkOwogCWVwLT5vcmQgPSBjb25uX3BhcmFtLT5vcmQ7CiAKLQlpZiAocGVlcjJwZWVyICYmIGVwLT5pcmQgPT0gMCkKLQkJZXAtPmlyZCA9IDE7CisJaWYgKGVwLT5tcGFfYXR0ci52ZXJzaW9uICE9IDIpCisJCWlmIChwZWVyMnBlZXIgJiYgZXAtPmlyZCA9PSAwKQorCQkJZXAtPmlyZCA9IDE7CiAKIAlQREJHKCIlcyAlZCBpcmQgJWQgb3JkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGVwLT5pcmQsIGVwLT5vcmQpOwogCisJY21faWQtPmFkZF9yZWYoY21faWQpOworCWVwLT5jb20uY21faWQgPSBjbV9pZDsKKwllcC0+Y29tLnFwID0gcXA7CisKIAkvKiBiaW5kIFFQIHRvIEVQIGFuZCBtb3ZlIHRvIFJUUyAqLwogCWF0dHJzLm1wYV9hdHRyID0gZXAtPm1wYV9hdHRyOwogCWF0dHJzLm1heF9pcmQgPSBlcC0+aXJkOwpAQCAtMTk0NCw2ICsyMzM2LDggQEAKIAkJICAgICAgIGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47CiAJCWVwLT5yc3NfcWlkID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5yeHFfaWRzWwogCQkJICAgICAgY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwXTsKKwkJZXAtPnJldHJ5X3dpdGhfbXBhX3YxID0gMDsKKwkJZXAtPnRyaWVkX3dpdGhfbXBhX3YxID0gMDsKIAl9CiAJaWYgKCFlcC0+bDJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGFsbG9jIGwyZS5cbiIsIF9fZnVuY19fKTsKQEAgLTIzMjMsOCArMjcxNywxMSBAQAogCiAJLyoKIAkgKiBXYWtlIHVwIGFueSB0aHJlYWRzIGluIHJkbWFfaW5pdCgpIG9yIHJkbWFfZmluaSgpLgorCSAqIEhvd2V2ZXIsIHRoaXMgaXMgbm90IG5lZWRlZCBpZiBjb20gc3RhdGUgaXMganVzdAorCSAqIE1QQV9SRVFfU0VOVAogCSAqLwotCWM0aXdfd2FrZV91cCgmZXAtPmNvbS53cl93YWl0LCAtRUNPTk5SRVNFVCk7CisJaWYgKGVwLT5jb20uc3RhdGUgIT0gTVBBX1JFUV9TRU5UKQorCQljNGl3X3dha2VfdXAoJmVwLT5jb20ud3Jfd2FpdCwgLUVDT05OUkVTRVQpOwogCXNjaGVkKGRldiwgc2tiKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMKaW5kZXggMTcyMGRjNy4uZjM1YTkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NxLmMKQEAgLTE4NSw3ICsxODUsNyBAQAogCQkJCSBWX0NRRV9PUENPREUoRldfUklfU0VORCkgfAogCQkJCSBWX0NRRV9UWVBFKDApIHwKIAkJCQkgVl9DUUVfU1dDUUUoMSkgfAotCQkJCSBWX0NRRV9RUElEKHdxLT5ycS5xaWQpKTsKKwkJCQkgVl9DUUVfUVBJRCh3cS0+c3EucWlkKSk7CiAJY3FlLmJpdHNfdHlwZV90cyA9IGNwdV90b19iZTY0KFZfQ1FFX0dFTkJJVCgodTY0KWNxLT5nZW4pKTsKIAljcS0+c3dfcXVldWVbY3EtPnN3X3BpZHhdID0gY3FlOwogCXQ0X3N3Y3FfcHJvZHVjZShjcSk7CkBAIC04MTgsNiArODE4LDcgQEAKIAljaHAtPmNxLnNpemUtLTsJCQkJLyogc3RhdHVzIHBhZ2UgKi8KIAljaHAtPmliY3EuY3FlID0gZW50cmllcyAtIDI7CiAJc3Bpbl9sb2NrX2luaXQoJmNocC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2spOwogCWF0b21pY19zZXQoJmNocC0+cmVmY250LCAxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaHAtPndhaXQpOwogCXJldCA9IGluc2VydF9oYW5kbGUocmhwLCAmcmhwLT5jcWlkciwgY2hwLCBjaHAtPmNxLmNxaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCmluZGV4IDQwYTEzY2MuLjZkMGRmNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKQEAgLTM3NiwxMCArMzc2LDggQEAKIAlzdHJ1Y3QgYzRpd19kZXYgKmRldjsKIH07CiAKLXN0YXRpYyB2b2lkIGM0aXdfcmVtb3ZlKHN0cnVjdCB1bGRfY3R4ICpjdHgpCitzdGF0aWMgdm9pZCBjNGl3X2RlYWxsb2Moc3RydWN0IHVsZF9jdHggKmN0eCkKIHsKLQlQREJHKCIlcyBjNGl3X2RldiAlcFxuIiwgX19mdW5jX18sICBjdHgtPmRldik7Ci0JYzRpd191bnJlZ2lzdGVyX2RldmljZShjdHgtPmRldik7CiAJYzRpd19yZGV2X2Nsb3NlKCZjdHgtPmRldi0+cmRldik7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5jcWlkcik7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5xcGlkcik7CkBAIC0zODksMTEgKzM4NywzMCBAQAogCWN0eC0+ZGV2ID0gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgYzRpd19yZW1vdmUoc3RydWN0IHVsZF9jdHggKmN0eCkKK3sKKwlQREJHKCIlcyBjNGl3X2RldiAlcFxuIiwgX19mdW5jX18sICBjdHgtPmRldik7CisJYzRpd191bnJlZ2lzdGVyX2RldmljZShjdHgtPmRldik7CisJYzRpd19kZWFsbG9jKGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgcmRtYV9zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICppbmZvcCkKK3sKKwlyZXR1cm4gaW5mb3AtPnZyLT5zdGFnLnNpemUgPiAwICYmIGluZm9wLT52ci0+cGJsLnNpemUgPiAwICYmCisJICAgICAgIGluZm9wLT52ci0+cnEuc2l6ZSA+IDAgJiYgaW5mb3AtPnZyLT5xcC5zaXplID4gMCAmJgorCSAgICAgICBpbmZvcC0+dnItPmNxLnNpemUgPiAwICYmIGluZm9wLT52ci0+b2NxLnNpemUgPiAwOworfQorCiBzdGF0aWMgc3RydWN0IGM0aXdfZGV2ICpjNGl3X2FsbG9jKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqaW5mb3ApCiB7CiAJc3RydWN0IGM0aXdfZGV2ICpkZXZwOwogCWludCByZXQ7CiAKKwlpZiAoIXJkbWFfc3VwcG9ydGVkKGluZm9wKSkgeworCQlwcmludGsoS0VSTl9JTkZPIE1PRCAiJXM6IFJETUEgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShpbmZvcC0+cGRldikpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwl9CiAJZGV2cCA9IChzdHJ1Y3QgYzRpd19kZXYgKilpYl9hbGxvY19kZXZpY2Uoc2l6ZW9mKCpkZXZwKSk7CiAJaWYgKCFkZXZwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIkNhbm5vdCBhbGxvY2F0ZSBpYiBkZXZpY2VcbiIpOwpAQCAtNDE0LDcgKzQzMSw2IEBACiAKIAlyZXQgPSBjNGl3X3JkZXZfb3BlbigmZGV2cC0+cmRldik7CiAJaWYgKHJldCkgewotCQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIlVuYWJsZSB0byBvcGVuIENYSU8gcmRldiBlcnIgJWRcbiIsIHJldCk7CiAJCWliX2RlYWxsb2NfZGV2aWNlKCZkZXZwLT5pYmRldik7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CkBAIC01MTksMTUgKzUzNSwyNCBAQAogCWNhc2UgQ1hHQjRfU1RBVEVfVVA6CiAJCXByaW50ayhLRVJOX0lORk8gTU9EICIlczogVXBcbiIsIHBjaV9uYW1lKGN0eC0+bGxkaS5wZGV2KSk7CiAJCWlmICghY3R4LT5kZXYpIHsKLQkJCWludCByZXQgPSAwOworCQkJaW50IHJldDsKIAogCQkJY3R4LT5kZXYgPSBjNGl3X2FsbG9jKCZjdHgtPmxsZGkpOwotCQkJaWYgKCFJU19FUlIoY3R4LT5kZXYpKQotCQkJCXJldCA9IGM0aXdfcmVnaXN0ZXJfZGV2aWNlKGN0eC0+ZGV2KTsKLQkJCWlmIChJU19FUlIoY3R4LT5kZXYpIHx8IHJldCkKKwkJCWlmIChJU19FUlIoY3R4LT5kZXYpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIE1PRAorCQkJCSAgICAgICAiJXM6IGluaXRpYWxpemF0aW9uIGZhaWxlZDogJWxkXG4iLAorCQkJCSAgICAgICBwY2lfbmFtZShjdHgtPmxsZGkucGRldiksCisJCQkJICAgICAgIFBUUl9FUlIoY3R4LT5kZXYpKTsKKwkJCQljdHgtPmRldiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBjNGl3X3JlZ2lzdGVyX2RldmljZShjdHgtPmRldik7CisJCQlpZiAocmV0KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSIE1PRAogCQkJCSAgICAgICAiJXM6IFJETUEgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsCiAJCQkJICAgICAgIHBjaV9uYW1lKGN0eC0+bGxkaS5wZGV2KSwgcmV0KTsKKwkJCQljNGl3X2RlYWxsb2MoY3R4KTsKKwkJCX0KIAkJfQogCQlicmVhazsKIAljYXNlIENYR0I0X1NUQVRFX0RPV046CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZXYuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9ldi5jCmluZGV4IGMxMzA0MWEuLjM5N2NiMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9ldi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9ldi5jCkBAIC00Miw2ICs0Miw3IEBACiB7CiAJc3RydWN0IGliX2V2ZW50IGV2ZW50OwogCXN0cnVjdCBjNGl3X3FwX2F0dHJpYnV0ZXMgYXR0cnM7CisJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJaWYgKChxaHAtPmF0dHIuc3RhdGUgPT0gQzRJV19RUF9TVEFURV9FUlJPUikgfHwKIAkgICAgKHFocC0+YXR0ci5zdGF0ZSA9PSBDNElXX1FQX1NUQVRFX1RFUk1JTkFURSkpIHsKQEAgLTcyLDcgKzczLDkgQEAKIAlpZiAocWhwLT5pYnFwLmV2ZW50X2hhbmRsZXIpCiAJCSgqcWhwLT5pYnFwLmV2ZW50X2hhbmRsZXIpKCZldmVudCwgcWhwLT5pYnFwLnFwX2NvbnRleHQpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCSgqY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJmNocC0+aWJjcSwgY2hwLT5pYmNxLmNxX2NvbnRleHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogfQogCiB2b2lkIGM0aXdfZXZfZGlzcGF0Y2goc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCB0NF9jcWUgKmVycl9jcWUpCkBAIC0xODMsMTEgKzE4NiwxNCBAQAogaW50IGM0aXdfZXZfaGFuZGxlcihzdHJ1Y3QgYzRpd19kZXYgKmRldiwgdTMyIHFpZCkKIHsKIAlzdHJ1Y3QgYzRpd19jcSAqY2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCWNocCA9IGdldF9jaHAoZGV2LCBxaWQpOwotCWlmIChjaHApCisJaWYgKGNocCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CiAJCSgqY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJmNocC0+aWJjcSwgY2hwLT5pYmNxLmNxX2NvbnRleHQpOwotCWVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CisJfSBlbHNlCiAJCVBEQkcoIiVzIHVua25vd24gY3FpZCAweCV4XG4iLCBfX2Z1bmNfXywgcWlkKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKaW5kZXggNGYwNDUzNy4uMTM1N2M1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKQEAgLTMwOSw2ICszMDksNyBAQAogCXN0cnVjdCBjNGl3X2RldiAqcmhwOwogCXN0cnVjdCB0NF9jcSBjcTsKIAlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBjb21wX2hhbmRsZXJfbG9jazsKIAlhdG9taWNfdCByZWZjbnQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIH07CkBAIC0zMjMsNiArMzI0LDcgQEAKIAl1OCByZWN2X21hcmtlcl9lbmFibGVkOwogCXU4IHhtaXRfbWFya2VyX2VuYWJsZWQ7CiAJdTggY3JjX2VuYWJsZWQ7CisJdTggZW5oYW5jZWRfcmRtYV9jb25uOwogCXU4IHZlcnNpb247CiAJdTggcDJwX3R5cGU7CiB9OwpAQCAtMzQ5LDYgKzM1MSw4IEBACiAJdTggaXNfdGVybWluYXRlX2xvY2FsOwogCXN0cnVjdCBjNGl3X21wYV9hdHRyaWJ1dGVzIG1wYV9hdHRyOwogCXN0cnVjdCBjNGl3X2VwICpsbHBfc3RyZWFtX2hhbmRsZTsKKwl1OCBsYXllcl9ldHlwZTsKKwl1OCBlY29kZTsKIH07CiAKIHN0cnVjdCBjNGl3X3FwIHsKQEAgLTUwMSwxMSArNTA1LDE4IEBACiAjZGVmaW5lIE1QQV9LRVlfUkVQICJNUEEgSUQgUmVwIEZyYW1lIgogCiAjZGVmaW5lIE1QQV9NQVhfUFJJVkFURV9EQVRBCTI1NgorI2RlZmluZSBNUEFfRU5IQU5DRURfUkRNQV9DT05OCTB4MTAKICNkZWZpbmUgTVBBX1JFSkVDVAkJMHgyMAogI2RlZmluZSBNUEFfQ1JDCQkJMHg0MAogI2RlZmluZSBNUEFfTUFSS0VSUwkJMHg4MAogI2RlZmluZSBNUEFfRkxBR1NfTUFTSwkJMHhFMAogCisjZGVmaW5lIE1QQV9WMl9QRUVSMlBFRVJfTU9ERUwgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIE1QQV9WMl9aRVJPX0xFTl9GUERVX1JUUiAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1QQV9WMl9SRE1BX1dSSVRFX1JUUiAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIE1QQV9WMl9SRE1BX1JFQURfUlRSICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1QQV9WMl9JUkRfT1JEX01BU0sgICAgICAgICAgICAgMHgzRkZGCisKICNkZWZpbmUgYzRpd19wdXRfZXAoZXApIHsgXAogCVBEQkcoInB1dF9lcCAodmlhICVzOiV1KSBlcCAlcCByZWZjbnQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgIFwKIAkgICAgIGVwLCBhdG9taWNfcmVhZCgmKChlcCktPmtyZWYucmVmY291bnQpKSk7IFwKQEAgLTUyOCw2ICs1MzksMTEgQEAKIAl1OCBwcml2YXRlX2RhdGFbMF07CiB9OwogCitzdHJ1Y3QgbXBhX3YyX2Nvbm5fcGFyYW1zIHsKKwlfX2JlMTYgaXJkOworCV9fYmUxNiBvcmQ7Cit9OworCiBzdHJ1Y3QgdGVybWluYXRlX21lc3NhZ2UgewogCXU4IGxheWVyX2V0eXBlOwogCXU4IGVjb2RlOwpAQCAtNTgwLDcgKzU5NiwxMCBAQAogCiBlbnVtIGM0aXdfbXBhX2Vjb2RlcyB7CiAJTVBBX0NSQ19FUlIJCT0gMHgwMiwKLQlNUEFfTUFSS0VSX0VSUgkJPSAweDAzCisJTVBBX01BUktFUl9FUlIgICAgICAgICAgPSAweDAzLAorCU1QQV9MT0NBTF9DQVRBICAgICAgICAgID0gMHgwNSwKKwlNUEFfSU5TVUZGX0lSRCAgICAgICAgICA9IDB4MDYsCisJTVBBX05PTUFUQ0hfUlRSICAgICAgICAgPSAweDA3LAogfTsKIAogZW51bSBjNGl3X2VwX3N0YXRlIHsKQEAgLTY1MSw2ICs2NzAsOCBAQAogCXUxNiB0eHFfaWR4OwogCXUxNiBjdHJscV9pZHg7CiAJdTggdG9zOworCXU4IHJldHJ5X3dpdGhfbXBhX3YxOworCXU4IHRyaWVkX3dpdGhfbXBhX3YxOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYzRpd19lcCAqdG9fZXAoc3RydWN0IGl3X2NtX2lkICpjbV9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKaW5kZXggYTQxNTc4ZS4uNWY5NDBhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKQEAgLTI5LDYgKzI5LDkgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICAqIFNPRlRXQVJFLgogICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgIml3X2N4Z2I0LmgiCiAKIHN0YXRpYyBpbnQgb2NxcF9zdXBwb3J0ID0gMTsKQEAgLTkxNyw3ICs5MjAsMTEgQEAKIAl3cWUtPnUudGVybWluYXRlLnR5cGUgPSBGV19SSV9UWVBFX1RFUk1JTkFURTsKIAl3cWUtPnUudGVybWluYXRlLmltbWRsZW4gPSBjcHVfdG9fYmUzMihzaXplb2YgKnRlcm0pOwogCXRlcm0gPSAoc3RydWN0IHRlcm1pbmF0ZV9tZXNzYWdlICopd3FlLT51LnRlcm1pbmF0ZS50ZXJtbXNnOwotCWJ1aWxkX3Rlcm1fY29kZXMoZXJyX2NxZSwgJnRlcm0tPmxheWVyX2V0eXBlLCAmdGVybS0+ZWNvZGUpOworCWlmIChxaHAtPmF0dHIubGF5ZXJfZXR5cGUgPT0gKExBWUVSX01QQXxERFBfTExQKSkgeworCQl0ZXJtLT5sYXllcl9ldHlwZSA9IHFocC0+YXR0ci5sYXllcl9ldHlwZTsKKwkJdGVybS0+ZWNvZGUgPSBxaHAtPmF0dHIuZWNvZGU7CisJfSBlbHNlCisJCWJ1aWxkX3Rlcm1fY29kZXMoZXJyX2NxZSwgJnRlcm0tPmxheWVyX2V0eXBlLCAmdGVybS0+ZWNvZGUpOwogCWM0aXdfb2ZsZF9zZW5kKCZxaHAtPnJocC0+cmRldiwgc2tiKTsKIH0KIApAQCAtOTQxLDggKzk0OCwxMSBAQAogCWZsdXNoZWQgPSBjNGl3X2ZsdXNoX3JxKCZxaHAtPndxLCAmcmNocC0+Y3EsIGNvdW50KTsKIAlzcGluX3VubG9jaygmcWhwLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyY2hwLT5sb2NrLCBmbGFnKTsKLQlpZiAoZmx1c2hlZCkKKwlpZiAoZmx1c2hlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOwogCQkoKnJjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmcmNocC0+aWJjcSwgcmNocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOworCX0KIAogCS8qIGxvY2tpbmcgaGllcmFyY2h5OiBjcSBsb2NrIGZpcnN0LCB0aGVuIHFwIGxvY2suICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmxvY2ssIGZsYWcpOwpAQCAtOTUyLDEzICs5NjIsMTcgQEAKIAlmbHVzaGVkID0gYzRpd19mbHVzaF9zcSgmcWhwLT53cSwgJnNjaHAtPmNxLCBjb3VudCk7CiAJc3Bpbl91bmxvY2soJnFocC0+bG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NocC0+bG9jaywgZmxhZyk7Ci0JaWYgKGZsdXNoZWQpCisJaWYgKGZsdXNoZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKIAkJKCpzY2hwLT5pYmNxLmNvbXBfaGFuZGxlcikoJnNjaHAtPmliY3EsIHNjaHAtPmliY3EuY3FfY29udGV4dCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGZsdXNoX3FwKHN0cnVjdCBjNGl3X3FwICpxaHApCiB7CiAJc3RydWN0IGM0aXdfY3EgKnJjaHAsICpzY2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCXJjaHAgPSBnZXRfY2hwKHFocC0+cmhwLCBxaHAtPmF0dHIucmNxKTsKIAlzY2hwID0gZ2V0X2NocChxaHAtPnJocCwgcWhwLT5hdHRyLnNjcSk7CkBAIC05NjYsOCArOTgwLDE2IEBACiAJaWYgKHFocC0+aWJxcC51b2JqZWN0KSB7CiAJCXQ0X3NldF93cV9pbl9lcnJvcigmcWhwLT53cSk7CiAJCXQ0X3NldF9jcV9pbl9lcnJvcigmcmNocC0+Y3EpOwotCQlpZiAoc2NocCAhPSByY2hwKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOworCQkoKnJjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmcmNocC0+aWJjcSwgcmNocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmNocC0+Y29tcF9oYW5kbGVyX2xvY2ssIGZsYWcpOworCQlpZiAoc2NocCAhPSByY2hwKSB7CiAJCQl0NF9zZXRfY3FfaW5fZXJyb3IoJnNjaHAtPmNxKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hwLT5jb21wX2hhbmRsZXJfbG9jaywgZmxhZyk7CisJCQkoKnNjaHAtPmliY3EuY29tcF9oYW5kbGVyKSgmc2NocC0+aWJjcSwKKwkJCQkJc2NocC0+aWJjcS5jcV9jb250ZXh0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaHAtPmNvbXBfaGFuZGxlcl9sb2NrLCBmbGFnKTsKKwkJfQogCQlyZXR1cm47CiAJfQogCV9fZmx1c2hfcXAocWhwLCByY2hwLCBzY2hwKTsKQEAgLTEwMTIsNiArMTAzNCw3IEBACiAKIHN0YXRpYyB2b2lkIGJ1aWxkX3J0cl9tc2codTggcDJwX3R5cGUsIHN0cnVjdCBmd19yaV9pbml0ICppbml0KQogeworCVBEQkcoIiVzIHAycF90eXBlID0gJWRcbiIsIF9fZnVuY19fLCBwMnBfdHlwZSk7CiAJbWVtc2V0KCZpbml0LT51LCAwLCBzaXplb2YgaW5pdC0+dSk7CiAJc3dpdGNoIChwMnBfdHlwZSkgewogCWNhc2UgRldfUklfSU5JVF9QMlBUWVBFX1JETUFfV1JJVEU6CkBAIC0xMjA2LDEyICsxMjI5LDE2IEBACiAJCQkJZGlzY29ubmVjdCA9IDE7CiAJCQkJYzRpd19nZXRfZXAoJnFocC0+ZXAtPmNvbSk7CiAJCQl9CisJCQlpZiAocWhwLT5pYnFwLnVvYmplY3QpCisJCQkJdDRfc2V0X3dxX2luX2Vycm9yKCZxaHAtPndxKTsKIAkJCXJldCA9IHJkbWFfZmluaShyaHAsIHFocCwgZXApOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGVycjsKIAkJCWJyZWFrOwogCQljYXNlIEM0SVdfUVBfU1RBVEVfVEVSTUlOQVRFOgogCQkJc2V0X3N0YXRlKHFocCwgQzRJV19RUF9TVEFURV9URVJNSU5BVEUpOworCQkJcWhwLT5hdHRyLmxheWVyX2V0eXBlID0gYXR0cnMtPmxheWVyX2V0eXBlOworCQkJcWhwLT5hdHRyLmVjb2RlID0gYXR0cnMtPmVjb2RlOwogCQkJaWYgKHFocC0+aWJxcC51b2JqZWN0KQogCQkJCXQ0X3NldF93cV9pbl9lcnJvcigmcWhwLT53cSk7CiAJCQllcCA9IHFocC0+ZXA7CkBAIC0xMjIyLDYgKzEyNDksOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgQzRJV19RUF9TVEFURV9FUlJPUjoKIAkJCXNldF9zdGF0ZShxaHAsIEM0SVdfUVBfU1RBVEVfRVJST1IpOworCQkJaWYgKHFocC0+aWJxcC51b2JqZWN0KQorCQkJCXQ0X3NldF93cV9pbl9lcnJvcigmcWhwLT53cSk7CiAJCQlpZiAoIWludGVybmFsKSB7CiAJCQkJYWJvcnQgPSAxOwogCQkJCWRpc2Nvbm5lY3QgPSAxOwpAQCAtMTMzNCw3ICsxMzYzLDEwIEBACiAJcmhwID0gcWhwLT5yaHA7CiAKIAlhdHRycy5uZXh0X3N0YXRlID0gQzRJV19RUF9TVEFURV9FUlJPUjsKLQljNGl3X21vZGlmeV9xcChyaHAsIHFocCwgQzRJV19RUF9BVFRSX05FWFRfU1RBVEUsICZhdHRycywgMCk7CisJaWYgKHFocC0+YXR0ci5zdGF0ZSA9PSBDNElXX1FQX1NUQVRFX1RFUk1JTkFURSkKKwkJYzRpd19tb2RpZnlfcXAocmhwLCBxaHAsIEM0SVdfUVBfQVRUUl9ORVhUX1NUQVRFLCAmYXR0cnMsIDEpOworCWVsc2UKKwkJYzRpd19tb2RpZnlfcXAocmhwLCBxaHAsIEM0SVdfUVBfQVRUUl9ORVhUX1NUQVRFLCAmYXR0cnMsIDApOwogCXdhaXRfZXZlbnQocWhwLT53YWl0LCAhcWhwLT5lcCk7CiAKIAlyZW1vdmVfaGFuZGxlKHJocCwgJnJocC0+cXBpZHIsIHFocC0+d3Euc3EucWlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfZXEuYwppbmRleCBkOWIxYmI0Li44MThkNzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2VxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9lcS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJdGFza2xldF9pbml0KCZlcS0+aW50ZXJydXB0X3Rhc2ssIGVoY2FfdGFza2xldF9lcSwgKGxvbmcpc2hjYSk7CiAKIAkJcmV0ID0gaWJtZWJ1c19yZXF1ZXN0X2lycShlcS0+aXN0LCBlaGNhX2ludGVycnVwdF9lcSwKLQkJCQkJICBJUlFGX0RJU0FCTEVELCAiZWhjYV9lcSIsCisJCQkJCSAgMCwgImVoY2FfZXEiLAogCQkJCQkgICh2b2lkICopc2hjYSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZWhjYV9lcnIoaWJfZGV2LCAiQ2FuJ3QgbWFwIGludGVycnVwdCBoYW5kbGVyLiIpOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCXRhc2tsZXRfaW5pdCgmZXEtPmludGVycnVwdF90YXNrLCBlaGNhX3Rhc2tsZXRfbmVxLCAobG9uZylzaGNhKTsKIAogCQlyZXQgPSBpYm1lYnVzX3JlcXVlc3RfaXJxKGVxLT5pc3QsIGVoY2FfaW50ZXJydXB0X25lcSwKLQkJCQkJICBJUlFGX0RJU0FCTEVELCAiZWhjYV9uZXEiLAorCQkJCQkgIDAsICJlaGNhX25lcSIsCiAJCQkJCSAgKHZvaWQgKilzaGNhKTsKIAkJaWYgKHJldCA8IDApCiAJCQllaGNhX2VycihpYl9kZXYsICJDYW4ndCBtYXAgaW50ZXJydXB0IGhhbmRsZXIuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKaW5kZXggMzJmYjM0Mi4uOTY0Zjg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYwpAQCAtOTc3LDYgKzk3Nyw5IEBACiAJc3RydWN0IGhjcF9tb2RpZnlfcXBfY29udHJvbF9ibG9jayAqbXFwY2I7CiAJdTY0IGhyZXQsIHVwZGF0ZV9tYXNrOwogCisJaWYgKHNycV9pbml0X2F0dHItPnNycV90eXBlICE9IElCX1NSUVRfQkFTSUMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCiAJLyogRm9yIGNvbW1vbiBhdHRyaWJ1dGVzLCBpbnRlcm5hbF9jcmVhdGVfcXAoKSB0YWtlcyBpdHMgaW5mbwogCSAqIG91dCBvZiBxcF9pbml0X2F0dHIsIHNvIGNvcHkgYWxsIGNvbW1vbiBhdHRycyB0aGVyZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCmluZGV4IGRhZWY2MWQuLjcxNDI5M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwppbmRleCBiZTI0YWM3Li5iZmNhMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgogI2luY2x1ZGUgImlwYXRoX3ZlcmJzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCmluZGV4IDg2OTdlY2EuLjczNmQ5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKaW5kZXggN2MxZWViZS4uNDliMDljNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2luaXRfY2hpcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYwpAQCAtMzMsNyArMzMsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3NycS5jCmluZGV4IDM4NmUyYzcuLjI2MjcxOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zcnEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3JxLmMKQEAgLTEwNyw2ICsxMDcsMTEgQEAKIAl1MzIgc3o7CiAJc3RydWN0IGliX3NycSAqcmV0OwogCisJaWYgKHNycV9pbml0X2F0dHItPnNycV90eXBlICE9IElCX1NSUVRfQkFTSUMpIHsKKwkJcmV0ID0gRVJSX1BUUigtRU5PU1lTKTsKKwkJZ290byBkb25lOworCX0KKwogCWlmIChzcnFfaW5pdF9hdHRyLT5hdHRyLm1heF93ciA9PSAwKSB7CiAJCXJldCA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKaW5kZXggODk5MTY3Ny4uNzU1NThmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKICNpbmNsdWRlICJpcGF0aF92ZXJicy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91c2VyX3BhZ2VzLmMKaW5kZXggY2ZlZDUzOS4uZGM2NmM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9wYWdlcy5jCkBAIC03OSw3ICs3OSw3IEBACiAJCQlnb3RvIGJhaWxfcmVsZWFzZTsKIAl9CiAKLQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtICs9IG51bV9wYWdlczsKKwljdXJyZW50LT5tbS0+cGlubmVkX3ZtICs9IG51bV9wYWdlczsKIAogCXJldCA9IDA7CiAJZ290byBiYWlsOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAKIAlfX2lwYXRoX3JlbGVhc2VfdXNlcl9wYWdlcyhwLCBudW1fcGFnZXMsIDEpOwogCi0JY3VycmVudC0+bW0tPmxvY2tlZF92bSAtPSBudW1fcGFnZXM7CisJY3VycmVudC0+bW0tPnBpbm5lZF92bSAtPSBudW1fcGFnZXM7CiAKIAl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIH0KQEAgLTE5NSw3ICsxOTUsNyBAQAogCQljb250YWluZXJfb2YoX3dvcmssIHN0cnVjdCBpcGF0aF91c2VyX3BhZ2VzX3dvcmssIHdvcmspOwogCiAJZG93bl93cml0ZSgmd29yay0+bW0tPm1tYXBfc2VtKTsKLQl3b3JrLT5tbS0+bG9ja2VkX3ZtIC09IHdvcmstPm51bV9wYWdlczsKKwl3b3JrLT5tbS0+cGlubmVkX3ZtIC09IHdvcmstPm51bV9wYWdlczsKIAl1cF93cml0ZSgmd29yay0+bW0tPm1tYXBfc2VtKTsKIAltbXB1dCh3b3JrLT5tbSk7CiAJa2ZyZWUod29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jCmluZGV4IGRkN2YyNmQuLjQzOWMzNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8cmRtYS9pYl91c2VyX3ZlcmJzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCmluZGV4IGZhNjQzZjQuLjc3ZjNkYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKQEAgLTEyOCw2ICsxMjgsOCBAQAogCSAgICAoZGV2LT5kZXYtPmNhcHMuYm1tZV9mbGFncyAmIE1MWDRfQk1NRV9GTEFHX1JFTU9URV9JTlYpICYmCiAJICAgIChkZXYtPmRldi0+Y2Fwcy5ibW1lX2ZsYWdzICYgTUxYNF9CTU1FX0ZMQUdfRkFTVF9SRUdfV1IpKQogCQlwcm9wcy0+ZGV2aWNlX2NhcF9mbGFncyB8PSBJQl9ERVZJQ0VfTUVNX01HVF9FWFRFTlNJT05TOworCWlmIChkZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1hSQykKKwkJcHJvcHMtPmRldmljZV9jYXBfZmxhZ3MgfD0gSUJfREVWSUNFX1hSQzsKIAogCXByb3BzLT52ZW5kb3JfaWQJICAgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSAob3V0X21hZC0+ZGF0YSArIDM2KSkgJgogCQkweGZmZmZmZjsKQEAgLTE4MSw4ICsxODMsMTIgQEAKIAogc3RhdGljIGludCBpYl9saW5rX3F1ZXJ5X3BvcnQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQsCiAJCQkgICAgICBzdHJ1Y3QgaWJfcG9ydF9hdHRyICpwcm9wcywKKwkJCSAgICAgIHN0cnVjdCBpYl9zbXAgKmluX21hZCwKIAkJCSAgICAgIHN0cnVjdCBpYl9zbXAgKm91dF9tYWQpCiB7CisJaW50IGV4dF9hY3RpdmVfc3BlZWQ7CisJaW50IGVycjsKKwogCXByb3BzLT5saWQJCT0gYmUxNl90b19jcHVwKChfX2JlMTYgKikgKG91dF9tYWQtPmRhdGEgKyAxNikpOwogCXByb3BzLT5sbWMJCT0gb3V0X21hZC0+ZGF0YVszNF0gJiAweDc7CiAJcHJvcHMtPnNtX2xpZAkJPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDE4KSk7CkBAIC0yMDMsNiArMjA5LDM5IEBACiAJcHJvcHMtPm1heF92bF9udW0JPSBvdXRfbWFkLT5kYXRhWzM3XSA+PiA0OwogCXByb3BzLT5pbml0X3R5cGVfcmVwbHkJPSBvdXRfbWFkLT5kYXRhWzQxXSA+PiA0OwogCisJLyogQ2hlY2sgaWYgZXh0ZW5kZWQgc3BlZWRzIChFRFIvRkRSLy4uLikgYXJlIHN1cHBvcnRlZCAqLworCWlmIChwcm9wcy0+cG9ydF9jYXBfZmxhZ3MgJiBJQl9QT1JUX0VYVEVOREVEX1NQRUVEU19TVVApIHsKKwkJZXh0X2FjdGl2ZV9zcGVlZCA9IG91dF9tYWQtPmRhdGFbNjJdID4+IDQ7CisKKwkJc3dpdGNoIChleHRfYWN0aXZlX3NwZWVkKSB7CisJCWNhc2UgMToKKwkJCXByb3BzLT5hY3RpdmVfc3BlZWQgPSAxNjsgLyogRkRSICovCisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcHJvcHMtPmFjdGl2ZV9zcGVlZCA9IDMyOyAvKiBFRFIgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSWYgcmVwb3J0ZWQgYWN0aXZlIHNwZWVkIGlzIFFEUiwgY2hlY2sgaWYgaXMgRkRSLTEwICovCisJaWYgKHByb3BzLT5hY3RpdmVfc3BlZWQgPT0gNCkgeworCQlpZiAodG9fbWRldihpYmRldiktPmRldi0+Y2Fwcy5leHRfcG9ydF9jYXBbcG9ydF0gJgorCQkgICAgTUxYX0VYVF9QT1JUX0NBUF9GTEFHX0VYVEVOREVEX1BPUlRfSU5GTykgeworCQkJaW5pdF9xdWVyeV9tYWQoaW5fbWFkKTsKKwkJCWluX21hZC0+YXR0cl9pZCA9IE1MWDRfQVRUUl9FWFRFTkRFRF9QT1JUX0lORk87CisJCQlpbl9tYWQtPmF0dHJfbW9kID0gY3B1X3RvX2JlMzIocG9ydCk7CisKKwkJCWVyciA9IG1seDRfTUFEX0lGQyh0b19tZGV2KGliZGV2KSwgMSwgMSwgcG9ydCwKKwkJCQkJICAgTlVMTCwgTlVMTCwgaW5fbWFkLCBvdXRfbWFkKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJLyogQ2hlY2tpbmcgTGlua1NwZWVkQWN0aXZlIGZvciBGRFItMTAgKi8KKwkJCWlmIChvdXRfbWFkLT5kYXRhWzE1XSAmIDB4MSkKKwkJCQlwcm9wcy0+YWN0aXZlX3NwZWVkID0gODsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yMjcsNyArMjY2LDcgQEAKIAlwcm9wcy0+cGtleV90YmxfbGVuCT0gMTsKIAlwcm9wcy0+YmFkX3BrZXlfY250cgk9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopIChvdXRfbWFkLT5kYXRhICsgNDYpKTsKIAlwcm9wcy0+cWtleV92aW9sX2NudHIJPSBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSAob3V0X21hZC0+ZGF0YSArIDQ4KSk7Ci0JcHJvcHMtPm1heF9tdHUJCT0gSUJfTVRVXzIwNDg7CisJcHJvcHMtPm1heF9tdHUJCT0gSUJfTVRVXzQwOTY7CiAJcHJvcHMtPnN1Ym5ldF90aW1lb3V0CT0gMDsKIAlwcm9wcy0+bWF4X3ZsX251bQk9IG91dF9tYWQtPmRhdGFbMzddID4+IDQ7CiAJcHJvcHMtPmluaXRfdHlwZV9yZXBseQk9IDA7CkBAIC0yNzQsNyArMzEzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAllcnIgPSBtbHg0X2liX3BvcnRfbGlua19sYXllcihpYmRldiwgcG9ydCkgPT0gSUJfTElOS19MQVlFUl9JTkZJTklCQU5EID8KLQkJaWJfbGlua19xdWVyeV9wb3J0KGliZGV2LCBwb3J0LCBwcm9wcywgb3V0X21hZCkgOgorCQlpYl9saW5rX3F1ZXJ5X3BvcnQoaWJkZXYsIHBvcnQsIHByb3BzLCBpbl9tYWQsIG91dF9tYWQpIDoKIAkJZXRoX2xpbmtfcXVlcnlfcG9ydChpYmRldiwgcG9ydCwgcHJvcHMsIG91dF9tYWQpOwogCiBvdXQ6CkBAIC01NjYsNiArNjA1LDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWJfeHJjZCAqbWx4NF9pYl9hbGxvY194cmNkKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAorCQkJCQkgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwKKwkJCQkJICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQoreworCXN0cnVjdCBtbHg0X2liX3hyY2QgKnhyY2Q7CisJaW50IGVycjsKKworCWlmICghKHRvX21kZXYoaWJkZXYpLT5kZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKworCXhyY2QgPSBrbWFsbG9jKHNpemVvZiAqeHJjZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4cmNkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVyciA9IG1seDRfeHJjZF9hbGxvYyh0b19tZGV2KGliZGV2KS0+ZGV2LCAmeHJjZC0+eHJjZG4pOworCWlmIChlcnIpCisJCWdvdG8gZXJyMTsKKworCXhyY2QtPnBkID0gaWJfYWxsb2NfcGQoaWJkZXYpOworCWlmIChJU19FUlIoeHJjZC0+cGQpKSB7CisJCWVyciA9IFBUUl9FUlIoeHJjZC0+cGQpOworCQlnb3RvIGVycjI7CisJfQorCisJeHJjZC0+Y3EgPSBpYl9jcmVhdGVfY3EoaWJkZXYsIE5VTEwsIE5VTEwsIHhyY2QsIDEsIDApOworCWlmIChJU19FUlIoeHJjZC0+Y3EpKSB7CisJCWVyciA9IFBUUl9FUlIoeHJjZC0+Y3EpOworCQlnb3RvIGVycjM7CisJfQorCisJcmV0dXJuICZ4cmNkLT5pYnhyY2Q7CisKK2VycjM6CisJaWJfZGVhbGxvY19wZCh4cmNkLT5wZCk7CitlcnIyOgorCW1seDRfeHJjZF9mcmVlKHRvX21kZXYoaWJkZXYpLT5kZXYsIHhyY2QtPnhyY2RuKTsKK2VycjE6CisJa2ZyZWUoeHJjZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBtbHg0X2liX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCkKK3sKKwlpYl9kZXN0cm95X2NxKHRvX214cmNkKHhyY2QpLT5jcSk7CisJaWJfZGVhbGxvY19wZCh0b19teHJjZCh4cmNkKS0+cGQpOworCW1seDRfeHJjZF9mcmVlKHRvX21kZXYoeHJjZC0+ZGV2aWNlKS0+ZGV2LCB0b19teHJjZCh4cmNkKS0+eHJjZG4pOworCWtmcmVlKHhyY2QpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYWRkX2dpZF9lbnRyeShzdHJ1Y3QgaWJfcXAgKmlicXAsIHVuaW9uIGliX2dpZCAqZ2lkKQogewogCXN0cnVjdCBtbHg0X2liX3FwICptcXAgPSB0b19tcXAoaWJxcCk7CkBAIC0xMDQ0LDcgKzExMzQsOSBAQAogCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfU1JRKQkJfAogCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfU1JRKQkJfAogCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9TUlEpCQl8Ci0JCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfU1JRKTsKKwkJKDF1bGwgPDwgSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9TUlEpCQl8CisJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9YU1JRKQkJfAorCQkoMXVsbCA8PCBJQl9VU0VSX1ZFUkJTX0NNRF9PUEVOX1FQKTsKIAogCWliZGV2LT5pYl9kZXYucXVlcnlfZGV2aWNlCT0gbWx4NF9pYl9xdWVyeV9kZXZpY2U7CiAJaWJkZXYtPmliX2Rldi5xdWVyeV9wb3J0CT0gbWx4NF9pYl9xdWVyeV9wb3J0OwpAQCAtMTA5Myw2ICsxMTg1LDE0IEBACiAJaWJkZXYtPmliX2Rldi51bm1hcF9mbXIJCT0gbWx4NF9pYl91bm1hcF9mbXI7CiAJaWJkZXYtPmliX2Rldi5kZWFsbG9jX2Ztcgk9IG1seDRfaWJfZm1yX2RlYWxsb2M7CiAKKwlpZiAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDKSB7CisJCWliZGV2LT5pYl9kZXYuYWxsb2NfeHJjZCA9IG1seDRfaWJfYWxsb2NfeHJjZDsKKwkJaWJkZXYtPmliX2Rldi5kZWFsbG9jX3hyY2QgPSBtbHg0X2liX2RlYWxsb2NfeHJjZDsKKwkJaWJkZXYtPmliX2Rldi51dmVyYnNfY21kX21hc2sgfD0KKwkJCSgxdWxsIDw8IElCX1VTRVJfVkVSQlNfQ01EX09QRU5fWFJDRCkgfAorCQkJKDF1bGwgPDwgSUJfVVNFUl9WRVJCU19DTURfQ0xPU0VfWFJDRCk7CisJfQorCiAJc3Bpbl9sb2NrX2luaXQoJmlib2UtPmxvY2spOwogCiAJaWYgKGluaXRfbm9kZV9kYXRhKGliZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAppbmRleCBlNGJmMmNmLi5lZDgwMzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCkBAIC01Niw2ICs1NiwxMyBAQAogCXUzMgkJCXBkbjsKIH07CiAKK3N0cnVjdCBtbHg0X2liX3hyY2QgeworCXN0cnVjdCBpYl94cmNkCQlpYnhyY2Q7CisJdTMyCQkJeHJjZG47CisJc3RydWN0IGliX3BkCSAgICAgICAqcGQ7CisJc3RydWN0IGliX2NxCSAgICAgICAqY3E7Cit9OworCiBzdHJ1Y3QgbWx4NF9pYl9jcV9idWYgewogCXN0cnVjdCBtbHg0X2J1ZgkJYnVmOwogCXN0cnVjdCBtbHg0X210dAkJbXR0OwpAQCAtMTM4LDYgKzE0NSw3IEBACiAJc3RydWN0IG1seDRfbXR0CQltdHQ7CiAJaW50CQkJYnVmX3NpemU7CiAJc3RydWN0IG11dGV4CQltdXRleDsKKwl1MTYJCQl4cmNkbjsKIAl1MzIJCQlmbGFnczsKIAl1OAkJCXBvcnQ7CiAJdTgJCQlhbHRfcG9ydDsKQEAgLTIxMSw2ICsyMTksMTEgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGlicGQsIHN0cnVjdCBtbHg0X2liX3BkLCBpYnBkKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWx4NF9pYl94cmNkICp0b19teHJjZChzdHJ1Y3QgaWJfeHJjZCAqaWJ4cmNkKQoreworCXJldHVybiBjb250YWluZXJfb2YoaWJ4cmNkLCBzdHJ1Y3QgbWx4NF9pYl94cmNkLCBpYnhyY2QpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtbHg0X2liX2NxICp0b19tY3Eoc3RydWN0IGliX2NxICppYmNxKQogewogCXJldHVybiBjb250YWluZXJfb2YoaWJjcSwgc3RydWN0IG1seDRfaWJfY3EsIGliY3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKaW5kZXggM2E5MWQ5ZC4uYTE2ZjBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCkBAIC0zMDIsMTUgKzMwMiwxNCBAQAogfQogCiBzdGF0aWMgaW50IHNldF9ycV9zaXplKHN0cnVjdCBtbHg0X2liX2RldiAqZGV2LCBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCi0JCSAgICAgICBpbnQgaXNfdXNlciwgaW50IGhhc19zcnEsIHN0cnVjdCBtbHg0X2liX3FwICpxcCkKKwkJICAgICAgIGludCBpc191c2VyLCBpbnQgaGFzX3JxLCBzdHJ1Y3QgbWx4NF9pYl9xcCAqcXApCiB7CiAJLyogU2FuaXR5IGNoZWNrIFJRIHNpemUgYmVmb3JlIHByb2NlZWRpbmcgKi8KIAlpZiAoY2FwLT5tYXhfcmVjdl93ciAgPiBkZXYtPmRldi0+Y2Fwcy5tYXhfd3FlcyAgfHwKIAkgICAgY2FwLT5tYXhfcmVjdl9zZ2UgPiBkZXYtPmRldi0+Y2Fwcy5tYXhfcnFfc2cpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGhhc19zcnEpIHsKLQkJLyogUVBzIGF0dGFjaGVkIHRvIGFuIFNSUSBzaG91bGQgaGF2ZSBubyBSUSAqLworCWlmICghaGFzX3JxKSB7CiAJCWlmIChjYXAtPm1heF9yZWN2X3dyKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTQ2Myw2ICs0NjIsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBxcF9oYXNfcnEoc3RydWN0IGliX3FwX2luaXRfYXR0ciAqYXR0cikKK3sKKwlpZiAoYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfWFJDX0lOSSB8fCBhdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfVEdUKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAhYXR0ci0+c3JxOworfQorCiBzdGF0aWMgaW50IGNyZWF0ZV9xcF9jb21tb24oc3RydWN0IG1seDRfaWJfZGV2ICpkZXYsIHN0cnVjdCBpYl9wZCAqcGQsCiAJCQkgICAgc3RydWN0IGliX3FwX2luaXRfYXR0ciAqaW5pdF9hdHRyLAogCQkJICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsIGludCBzcXBuLCBzdHJ1Y3QgbWx4NF9pYl9xcCAqcXApCkBAIC00NzksNyArNDg2LDcgQEAKIAlpZiAoaW5pdF9hdHRyLT5zcV9zaWdfdHlwZSA9PSBJQl9TSUdOQUxfQUxMX1dSKQogCQlxcC0+c3Ffc2lnbmFsX2JpdHMgPSBjcHVfdG9fYmUzMihNTFg0X1dRRV9DVFJMX0NRX1VQREFURSk7CiAKLQllcnIgPSBzZXRfcnFfc2l6ZShkZXYsICZpbml0X2F0dHItPmNhcCwgISFwZC0+dW9iamVjdCwgISFpbml0X2F0dHItPnNycSwgcXApOworCWVyciA9IHNldF9ycV9zaXplKGRldiwgJmluaXRfYXR0ci0+Y2FwLCAhIXBkLT51b2JqZWN0LCBxcF9oYXNfcnEoaW5pdF9hdHRyKSwgcXApOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOwogCkBAIC01MTMsNyArNTIwLDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX210dDsKIAotCQlpZiAoIWluaXRfYXR0ci0+c3JxKSB7CisJCWlmIChxcF9oYXNfcnEoaW5pdF9hdHRyKSkgewogCQkJZXJyID0gbWx4NF9pYl9kYl9tYXBfdXNlcih0b19tdWNvbnRleHQocGQtPnVvYmplY3QtPmNvbnRleHQpLAogCQkJCQkJICB1Y21kLmRiX2FkZHIsICZxcC0+ZGIpOwogCQkJaWYgKGVycikKQEAgLTUzMiw3ICs1MzksNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBlcnI7CiAKLQkJaWYgKCFpbml0X2F0dHItPnNycSkgeworCQlpZiAocXBfaGFzX3JxKGluaXRfYXR0cikpIHsKIAkJCWVyciA9IG1seDRfZGJfYWxsb2MoZGV2LT5kZXYsICZxcC0+ZGIsIDApOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGVycjsKQEAgLTU3NSw2ICs1ODIsOSBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3FwbjsKIAorCWlmIChpbml0X2F0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpCisJCXFwLT5tcXAucXBuIHw9ICgxIDw8IDIzKTsKKwogCS8qCiAJICogSGFyZHdhcmUgd2FudHMgUVBOIHdyaXR0ZW4gaW4gYmlnLWVuZGlhbiBvcmRlciAoYWZ0ZXIKIAkgKiBzaGlmdGluZykgZm9yIHNlbmQgZG9vcmJlbGwuICBQcmVjb21wdXRlIHRoaXMgdmFsdWUgdG8gc2F2ZQpAQCAtNTkyLDkgKzYwMiw4IEBACiAKIGVycl93cmlkOgogCWlmIChwZC0+dW9iamVjdCkgewotCQlpZiAoIWluaXRfYXR0ci0+c3JxKQotCQkJbWx4NF9pYl9kYl91bm1hcF91c2VyKHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCksCi0JCQkJCSAgICAgICZxcC0+ZGIpOworCQlpZiAocXBfaGFzX3JxKGluaXRfYXR0cikpCisJCQltbHg0X2liX2RiX3VubWFwX3VzZXIodG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KSwgJnFwLT5kYik7CiAJfSBlbHNlIHsKIAkJa2ZyZWUocXAtPnNxLndyaWQpOwogCQlrZnJlZShxcC0+cnEud3JpZCk7CkBAIC02MTAsNyArNjE5LDcgQEAKIAkJbWx4NF9idWZfZnJlZShkZXYtPmRldiwgcXAtPmJ1Zl9zaXplLCAmcXAtPmJ1Zik7CiAKIGVycl9kYjoKLQlpZiAoIXBkLT51b2JqZWN0ICYmICFpbml0X2F0dHItPnNycSkKKwlpZiAoIXBkLT51b2JqZWN0ICYmIHFwX2hhc19ycShpbml0X2F0dHIpKQogCQltbHg0X2RiX2ZyZWUoZGV2LT5kZXYsICZxcC0+ZGIpOwogCiBlcnI6CkBAIC02NzEsNiArNjgwLDMzIEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IG1seDRfaWJfcGQgKmdldF9wZChzdHJ1Y3QgbWx4NF9pYl9xcCAqcXApCit7CisJaWYgKHFwLT5pYnFwLnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpCisJCXJldHVybiB0b19tcGQodG9fbXhyY2QocXAtPmlicXAueHJjZCktPnBkKTsKKwllbHNlCisJCXJldHVybiB0b19tcGQocXAtPmlicXAucGQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfY3FzKHN0cnVjdCBtbHg0X2liX3FwICpxcCwKKwkJICAgIHN0cnVjdCBtbHg0X2liX2NxICoqc2VuZF9jcSwgc3RydWN0IG1seDRfaWJfY3EgKipyZWN2X2NxKQoreworCXN3aXRjaCAocXAtPmlicXAucXBfdHlwZSkgeworCWNhc2UgSUJfUVBUX1hSQ19UR1Q6CisJCSpzZW5kX2NxID0gdG9fbWNxKHRvX214cmNkKHFwLT5pYnFwLnhyY2QpLT5jcSk7CisJCSpyZWN2X2NxID0gKnNlbmRfY3E7CisJCWJyZWFrOworCWNhc2UgSUJfUVBUX1hSQ19JTkk6CisJCSpzZW5kX2NxID0gdG9fbWNxKHFwLT5pYnFwLnNlbmRfY3EpOworCQkqcmVjdl9jcSA9ICpzZW5kX2NxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqc2VuZF9jcSA9IHRvX21jcShxcC0+aWJxcC5zZW5kX2NxKTsKKwkJKnJlY3ZfY3EgPSB0b19tY3EocXAtPmlicXAucmVjdl9jcSk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgZGVzdHJveV9xcF9jb21tb24oc3RydWN0IG1seDRfaWJfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2liX3FwICpxcCwKIAkJCSAgICAgIGludCBpc191c2VyKQogewpAQCAtNjgyLDggKzcxOCw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtbHg0X2liOiBtb2RpZnkgUVAgJTA2eCB0byBSRVNFVCBmYWlsZWQuXG4iLAogCQkJICAgICAgIHFwLT5tcXAucXBuKTsKIAotCXNlbmRfY3EgPSB0b19tY3EocXAtPmlicXAuc2VuZF9jcSk7Ci0JcmVjdl9jcSA9IHRvX21jcShxcC0+aWJxcC5yZWN2X2NxKTsKKwlnZXRfY3FzKHFwLCAmc2VuZF9jcSwgJnJlY3ZfY3EpOwogCiAJbWx4NF9pYl9sb2NrX2NxcyhzZW5kX2NxLCByZWN2X2NxKTsKIApAQCAtNzA2LDcgKzc0MSw3IEBACiAJbWx4NF9tdHRfY2xlYW51cChkZXYtPmRldiwgJnFwLT5tdHQpOwogCiAJaWYgKGlzX3VzZXIpIHsKLQkJaWYgKCFxcC0+aWJxcC5zcnEpCisJCWlmIChxcC0+cnEud3FlX2NudCkKIAkJCW1seDRfaWJfZGJfdW5tYXBfdXNlcih0b19tdWNvbnRleHQocXAtPmlicXAudW9iamVjdC0+Y29udGV4dCksCiAJCQkJCSAgICAgICZxcC0+ZGIpOwogCQlpYl91bWVtX3JlbGVhc2UocXAtPnVtZW0pOwpAQCAtNzE0LDcgKzc0OSw3IEBACiAJCWtmcmVlKHFwLT5zcS53cmlkKTsKIAkJa2ZyZWUocXAtPnJxLndyaWQpOwogCQltbHg0X2J1Zl9mcmVlKGRldi0+ZGV2LCBxcC0+YnVmX3NpemUsICZxcC0+YnVmKTsKLQkJaWYgKCFxcC0+aWJxcC5zcnEpCisJCWlmIChxcC0+cnEud3FlX2NudCkKIAkJCW1seDRfZGJfZnJlZShkZXYtPmRldiwgJnFwLT5kYik7CiAJfQogCkBAIC03MjUsMTAgKzc2MCwxMCBAQAogCQkJCXN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKmluaXRfYXR0ciwKIAkJCQlzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQogewotCXN0cnVjdCBtbHg0X2liX2RldiAqZGV2ID0gdG9fbWRldihwZC0+ZGV2aWNlKTsKIAlzdHJ1Y3QgbWx4NF9pYl9zcXAgKnNxcDsKIAlzdHJ1Y3QgbWx4NF9pYl9xcCAqcXA7CiAJaW50IGVycjsKKwl1MTYgeHJjZG4gPSAwOwogCiAJLyoKIAkgKiBXZSBvbmx5IHN1cHBvcnQgTFNPIGFuZCBtdWx0aWNhc3QgbG9vcGJhY2sgYmxvY2tpbmcsIGFuZApAQCAtNzM5LDEwICs3NzQsMjAgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlpZiAoaW5pdF9hdHRyLT5jcmVhdGVfZmxhZ3MgJiYKLQkgICAgKHBkLT51b2JqZWN0IHx8IGluaXRfYXR0ci0+cXBfdHlwZSAhPSBJQl9RUFRfVUQpKQorCSAgICAodWRhdGEgfHwgaW5pdF9hdHRyLT5xcF90eXBlICE9IElCX1FQVF9VRCkpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJc3dpdGNoIChpbml0X2F0dHItPnFwX3R5cGUpIHsKKwljYXNlIElCX1FQVF9YUkNfVEdUOgorCQlwZCA9IHRvX214cmNkKGluaXRfYXR0ci0+eHJjZCktPnBkOworCQl4cmNkbiA9IHRvX214cmNkKGluaXRfYXR0ci0+eHJjZCktPnhyY2RuOworCQlpbml0X2F0dHItPnNlbmRfY3EgPSB0b19teHJjZChpbml0X2F0dHItPnhyY2QpLT5jcTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJQl9RUFRfWFJDX0lOSToKKwkJaWYgKCEodG9fbWRldihwZC0+ZGV2aWNlKS0+ZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCQlpbml0X2F0dHItPnJlY3ZfY3EgPSBpbml0X2F0dHItPnNlbmRfY3E7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgSUJfUVBUX1JDOgogCWNhc2UgSUJfUVBUX1VDOgogCWNhc2UgSUJfUVBUX1VEOgpAQCAtNzUxLDEzICs3OTYsMTQgQEAKIAkJaWYgKCFxcCkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JCWVyciA9IGNyZWF0ZV9xcF9jb21tb24oZGV2LCBwZCwgaW5pdF9hdHRyLCB1ZGF0YSwgMCwgcXApOworCQllcnIgPSBjcmVhdGVfcXBfY29tbW9uKHRvX21kZXYocGQtPmRldmljZSksIHBkLCBpbml0X2F0dHIsIHVkYXRhLCAwLCBxcCk7CiAJCWlmIChlcnIpIHsKIAkJCWtmcmVlKHFwKTsKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CiAJCX0KIAogCQlxcC0+aWJxcC5xcF9udW0gPSBxcC0+bXFwLnFwbjsKKwkJcXAtPnhyY2RuID0geHJjZG47CiAKIAkJYnJlYWs7CiAJfQpAQCAtNzY1LDcgKzgxMSw3IEBACiAJY2FzZSBJQl9RUFRfR1NJOgogCXsKIAkJLyogVXNlcnNwYWNlIGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBzcGVjaWFsIFFQczogKi8KLQkJaWYgKHBkLT51b2JqZWN0KQorCQlpZiAodWRhdGEpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCQlzcXAgPSBremFsbG9jKHNpemVvZiAqc3FwLCBHRlBfS0VSTkVMKTsKQEAgLTc3NCw4ICs4MjAsOCBAQAogCiAJCXFwID0gJnNxcC0+cXA7CiAKLQkJZXJyID0gY3JlYXRlX3FwX2NvbW1vbihkZXYsIHBkLCBpbml0X2F0dHIsIHVkYXRhLAotCQkJCSAgICAgICBkZXYtPmRldi0+Y2Fwcy5zcXBfc3RhcnQgKworCQllcnIgPSBjcmVhdGVfcXBfY29tbW9uKHRvX21kZXYocGQtPmRldmljZSksIHBkLCBpbml0X2F0dHIsIHVkYXRhLAorCQkJCSAgICAgICB0b19tZGV2KHBkLT5kZXZpY2UpLT5kZXYtPmNhcHMuc3FwX3N0YXJ0ICsKIAkJCQkgICAgICAgKGluaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfU01JID8gMCA6IDIpICsKIAkJCQkgICAgICAgaW5pdF9hdHRyLT5wb3J0X251bSAtIDEsCiAJCQkJICAgICAgIHFwKTsKQEAgLTgwMSwxMSArODQ3LDEzIEBACiB7CiAJc3RydWN0IG1seDRfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHFwLT5kZXZpY2UpOwogCXN0cnVjdCBtbHg0X2liX3FwICptcXAgPSB0b19tcXAocXApOworCXN0cnVjdCBtbHg0X2liX3BkICpwZDsKIAogCWlmIChpc19xcDAoZGV2LCBtcXApKQogCQltbHg0X0NMT1NFX1BPUlQoZGV2LT5kZXYsIG1xcC0+cG9ydCk7CiAKLQlkZXN0cm95X3FwX2NvbW1vbihkZXYsIG1xcCwgISFxcC0+cGQtPnVvYmplY3QpOworCXBkID0gZ2V0X3BkKG1xcCk7CisJZGVzdHJveV9xcF9jb21tb24oZGV2LCBtcXAsICEhcGQtPmlicGQudW9iamVjdCk7CiAKIAlpZiAoaXNfc3FwKGRldiwgbXFwKSkKIAkJa2ZyZWUodG9fbXNxcChtcXApKTsKQEAgLTgyMSw2ICs4NjksOCBAQAogCWNhc2UgSUJfUVBUX1JDOgkJcmV0dXJuIE1MWDRfUVBfU1RfUkM7CiAJY2FzZSBJQl9RUFRfVUM6CQlyZXR1cm4gTUxYNF9RUF9TVF9VQzsKIAljYXNlIElCX1FQVF9VRDoJCXJldHVybiBNTFg0X1FQX1NUX1VEOworCWNhc2UgSUJfUVBUX1hSQ19JTkk6CisJY2FzZSBJQl9RUFRfWFJDX1RHVDoJcmV0dXJuIE1MWDRfUVBfU1RfWFJDOwogCWNhc2UgSUJfUVBUX1NNSToKIAljYXNlIElCX1FQVF9HU0k6CXJldHVybiBNTFg0X1FQX1NUX01MWDsKIAlkZWZhdWx0OgkJcmV0dXJuIC0xOwpAQCAtOTU5LDYgKzEwMDksOCBAQAogewogCXN0cnVjdCBtbHg0X2liX2RldiAqZGV2ID0gdG9fbWRldihpYnFwLT5kZXZpY2UpOwogCXN0cnVjdCBtbHg0X2liX3FwICpxcCA9IHRvX21xcChpYnFwKTsKKwlzdHJ1Y3QgbWx4NF9pYl9wZCAqcGQ7CisJc3RydWN0IG1seDRfaWJfY3EgKnNlbmRfY3EsICpyZWN2X2NxOwogCXN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKmNvbnRleHQ7CiAJZW51bSBtbHg0X3FwX29wdHBhciBvcHRwYXIgPSAwOwogCWludCBzcWRfZXZlbnQ7CkBAIC0xMDE0LDggKzEwNjYsMTAgQEAKIAkJY29udGV4dC0+c3Ffc2l6ZV9zdHJpZGUgPSBpbG9nMihxcC0+c3Eud3FlX2NudCkgPDwgMzsKIAljb250ZXh0LT5zcV9zaXplX3N0cmlkZSB8PSBxcC0+c3Eud3FlX3NoaWZ0IC0gNDsKIAotCWlmIChjdXJfc3RhdGUgPT0gSUJfUVBTX1JFU0VUICYmIG5ld19zdGF0ZSA9PSBJQl9RUFNfSU5JVCkKKwlpZiAoY3VyX3N0YXRlID09IElCX1FQU19SRVNFVCAmJiBuZXdfc3RhdGUgPT0gSUJfUVBTX0lOSVQpIHsKIAkJY29udGV4dC0+c3Ffc2l6ZV9zdHJpZGUgfD0gISFxcC0+c3Ffbm9fcHJlZmV0Y2ggPDwgNzsKKwkJY29udGV4dC0+eHJjZCA9IGNwdV90b19iZTMyKCh1MzIpIHFwLT54cmNkbik7CisJfQogCiAJaWYgKHFwLT5pYnFwLnVvYmplY3QpCiAJCWNvbnRleHQtPnVzcl9wYWdlID0gY3B1X3RvX2JlMzIodG9fbXVjb250ZXh0KGlicXAtPnVvYmplY3QtPmNvbnRleHQpLT51YXIuaW5kZXgpOwpAQCAtMTA3OSw4ICsxMTMzLDEyIEBACiAJCW9wdHBhciB8PSBNTFg0X1FQX09QVFBBUl9BTFRfQUREUl9QQVRIOwogCX0KIAotCWNvbnRleHQtPnBkCSAgICA9IGNwdV90b19iZTMyKHRvX21wZChpYnFwLT5wZCktPnBkbik7Ci0JY29udGV4dC0+cGFyYW1zMSAgICA9IGNwdV90b19iZTMyKE1MWDRfSUJfQUNLX1JFUV9GUkVRIDw8IDI4KTsKKwlwZCA9IGdldF9wZChxcCk7CisJZ2V0X2NxcyhxcCwgJnNlbmRfY3EsICZyZWN2X2NxKTsKKwljb250ZXh0LT5wZCAgICAgICA9IGNwdV90b19iZTMyKHBkLT5wZG4pOworCWNvbnRleHQtPmNxbl9zZW5kID0gY3B1X3RvX2JlMzIoc2VuZF9jcS0+bWNxLmNxbik7CisJY29udGV4dC0+Y3FuX3JlY3YgPSBjcHVfdG9fYmUzMihyZWN2X2NxLT5tY3EuY3FuKTsKKwljb250ZXh0LT5wYXJhbXMxICA9IGNwdV90b19iZTMyKE1MWDRfSUJfQUNLX1JFUV9GUkVRIDw8IDI4KTsKIAogCS8qIFNldCAiZmFzdCByZWdpc3RyYXRpb24gZW5hYmxlZCIgZm9yIGFsbCBrZXJuZWwgUVBzICovCiAJaWYgKCFxcC0+aWJxcC51b2JqZWN0KQpAQCAtMTEwNiw4ICsxMTY0LDYgQEAKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfU1FfUFNOKQogCQljb250ZXh0LT5uZXh0X3NlbmRfcHNuID0gY3B1X3RvX2JlMzIoYXR0ci0+c3FfcHNuKTsKIAotCWNvbnRleHQtPmNxbl9zZW5kID0gY3B1X3RvX2JlMzIodG9fbWNxKGlicXAtPnNlbmRfY3EpLT5tY3EuY3FuKTsKLQogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMpIHsKIAkJaWYgKGF0dHItPm1heF9kZXN0X3JkX2F0b21pYykKIAkJCWNvbnRleHQtPnBhcmFtczIgfD0KQEAgLTExMzAsOCArMTE4Niw2IEBACiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX1JRX1BTTikKIAkJY29udGV4dC0+cm5yX25leHRyZWN2cHNuIHw9IGNwdV90b19iZTMyKGF0dHItPnJxX3Bzbik7CiAKLQljb250ZXh0LT5jcW5fcmVjdiA9IGNwdV90b19iZTMyKHRvX21jcShpYnFwLT5yZWN2X2NxKS0+bWNxLmNxbik7Ci0KIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUUtFWSkgewogCQljb250ZXh0LT5xa2V5ID0gY3B1X3RvX2JlMzIoYXR0ci0+cWtleSk7CiAJCW9wdHBhciB8PSBNTFg0X1FQX09QVFBBUl9RX0tFWTsKQEAgLTExNDAsNyArMTE5NCw3IEBACiAJaWYgKGlicXAtPnNycSkKIAkJY29udGV4dC0+c3JxbiA9IGNwdV90b19iZTMyKDEgPDwgMjQgfCB0b19tc3JxKGlicXAtPnNycSktPm1zcnEuc3Jxbik7CiAKLQlpZiAoIWlicXAtPnNycSAmJiBjdXJfc3RhdGUgPT0gSUJfUVBTX1JFU0VUICYmIG5ld19zdGF0ZSA9PSBJQl9RUFNfSU5JVCkKKwlpZiAocXAtPnJxLndxZV9jbnQgJiYgY3VyX3N0YXRlID09IElCX1FQU19SRVNFVCAmJiBuZXdfc3RhdGUgPT0gSUJfUVBTX0lOSVQpCiAJCWNvbnRleHQtPmRiX3JlY19hZGRyID0gY3B1X3RvX2JlNjQocXAtPmRiLmRtYSk7CiAKIAlpZiAoY3VyX3N0YXRlID09IElCX1FQU19JTklUICYmCkBAIC0xMjI1LDE3ICsxMjc5LDE3IEBACiAJICogZW50cmllcyBhbmQgcmVpbml0aWFsaXplIHRoZSBRUC4KIAkgKi8KIAlpZiAobmV3X3N0YXRlID09IElCX1FQU19SRVNFVCAmJiAhaWJxcC0+dW9iamVjdCkgewotCQltbHg0X2liX2NxX2NsZWFuKHRvX21jcShpYnFwLT5yZWN2X2NxKSwgcXAtPm1xcC5xcG4sCisJCW1seDRfaWJfY3FfY2xlYW4ocmVjdl9jcSwgcXAtPm1xcC5xcG4sCiAJCQkJIGlicXAtPnNycSA/IHRvX21zcnEoaWJxcC0+c3JxKTogTlVMTCk7Ci0JCWlmIChpYnFwLT5zZW5kX2NxICE9IGlicXAtPnJlY3ZfY3EpCi0JCQltbHg0X2liX2NxX2NsZWFuKHRvX21jcShpYnFwLT5zZW5kX2NxKSwgcXAtPm1xcC5xcG4sIE5VTEwpOworCQlpZiAoc2VuZF9jcSAhPSByZWN2X2NxKQorCQkJbWx4NF9pYl9jcV9jbGVhbihzZW5kX2NxLCBxcC0+bXFwLnFwbiwgTlVMTCk7CiAKIAkJcXAtPnJxLmhlYWQgPSAwOwogCQlxcC0+cnEudGFpbCA9IDA7CiAJCXFwLT5zcS5oZWFkID0gMDsKIAkJcXAtPnNxLnRhaWwgPSAwOwogCQlxcC0+c3FfbmV4dF93cWUgPSAwOwotCQlpZiAoIWlicXAtPnNycSkKKwkJaWYgKHFwLT5ycS53cWVfY250KQogCQkJKnFwLT5kYi5kYiAgPSAwOwogCX0KIApAQCAtMTU0NywxNCArMTYwMSwxMyBAQAogfQogCiBzdGF0aWMgdm9pZCBzZXRfZGF0YWdyYW1fc2VnKHN0cnVjdCBtbHg0X3dxZV9kYXRhZ3JhbV9zZWcgKmRzZWcsCi0JCQkgICAgIHN0cnVjdCBpYl9zZW5kX3dyICp3ciwgX19iZTE2ICp2bGFuKQorCQkJICAgICBzdHJ1Y3QgaWJfc2VuZF93ciAqd3IpCiB7CiAJbWVtY3B5KGRzZWctPmF2LCAmdG9fbWFoKHdyLT53ci51ZC5haCktPmF2LCBzaXplb2YgKHN0cnVjdCBtbHg0X2F2KSk7CiAJZHNlZy0+ZHFwbiA9IGNwdV90b19iZTMyKHdyLT53ci51ZC5yZW1vdGVfcXBuKTsKIAlkc2VnLT5xa2V5ID0gY3B1X3RvX2JlMzIod3ItPndyLnVkLnJlbW90ZV9xa2V5KTsKIAlkc2VnLT52bGFuID0gdG9fbWFoKHdyLT53ci51ZC5haCktPmF2LmV0aC52bGFuOwogCW1lbWNweShkc2VnLT5tYWMsIHRvX21haCh3ci0+d3IudWQuYWgpLT5hdi5ldGgubWFjLCA2KTsKLQkqdmxhbiA9IGRzZWctPnZsYW47CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9tbHhfaWNyY19zZWcodm9pZCAqZHNlZykKQEAgLTE2NTcsNyArMTcxMCw2IEBACiAJX19iZTMyIHVuaW5pdGlhbGl6ZWRfdmFyKGxzb19oZHJfc3opOwogCV9fYmUzMiBibGg7CiAJaW50IGk7Ci0JX19iZTE2IHZsYW4gPSBjcHVfdG9fYmUxNigweGZmZmYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zcS5sb2NrLCBmbGFncyk7CiAKQEAgLTE3NjEsNyArMTgxMyw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIElCX1FQVF9VRDoKLQkJCXNldF9kYXRhZ3JhbV9zZWcod3FlLCB3ciwgJnZsYW4pOworCQkJc2V0X2RhdGFncmFtX3NlZyh3cWUsIHdyKTsKIAkJCXdxZSAgKz0gc2l6ZW9mIChzdHJ1Y3QgbWx4NF93cWVfZGF0YWdyYW1fc2VnKTsKIAkJCXNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgbWx4NF93cWVfZGF0YWdyYW1fc2VnKSAvIDE2OwogCkBAIC0xODI0LDExICsxODc2LDYgQEAKIAkJY3RybC0+ZmVuY2Vfc2l6ZSA9ICh3ci0+c2VuZF9mbGFncyAmIElCX1NFTkRfRkVOQ0UgPwogCQkJCSAgICBNTFg0X1dRRV9DVFJMX0ZFTkNFIDogMCkgfCBzaXplOwogCi0JCWlmIChiZTE2X3RvX2NwdSh2bGFuKSA8IDB4MTAwMCkgewotCQkJY3RybC0+aW5zX3ZsYW4gPSAxIDw8IDY7Ci0JCQljdHJsLT52bGFuX3RhZyA9IHZsYW47Ci0JCX0KLQogCQkvKgogCQkgKiBNYWtlIHN1cmUgZGVzY3JpcHRvciBpcyBmdWxseSB3cml0dGVuIGJlZm9yZQogCQkgKiBzZXR0aW5nIG93bmVyc2hpcCBiaXQgKGJlY2F1c2UgSFcgY2FuIHN0YXJ0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9zcnEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3NycS5jCmluZGV4IDgxOGI3ZWMuLjM5NTQyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3NycS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3NycS5jCkBAIC03Niw2ICs3Niw4IEBACiAJc3RydWN0IG1seDRfaWJfc3JxICpzcnE7CiAJc3RydWN0IG1seDRfd3FlX3NycV9uZXh0X3NlZyAqbmV4dDsKIAlzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKnNjYXR0ZXI7CisJdTMyIGNxbjsKKwl1MTYgeHJjZG47CiAJaW50IGRlc2Nfc2l6ZTsKIAlpbnQgYnVmX3NpemU7CiAJaW50IGVycjsKQEAgLTE3NCwxMiArMTc2LDE4IEBACiAJCX0KIAl9CiAKLQllcnIgPSBtbHg0X3NycV9hbGxvYyhkZXYtPmRldiwgdG9fbXBkKHBkKS0+cGRuLCAmc3JxLT5tdHQsCisJY3FuID0gKGluaXRfYXR0ci0+c3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpID8KKwkJdG9fbWNxKGluaXRfYXR0ci0+ZXh0LnhyYy5jcSktPm1jcS5jcW4gOiAwOworCXhyY2RuID0gKGluaXRfYXR0ci0+c3JxX3R5cGUgPT0gSUJfU1JRVF9YUkMpID8KKwkJdG9fbXhyY2QoaW5pdF9hdHRyLT5leHQueHJjLnhyY2QpLT54cmNkbiA6CisJCSh1MTYpIGRldi0+ZGV2LT5jYXBzLnJlc2VydmVkX3hyY2RzOworCWVyciA9IG1seDRfc3JxX2FsbG9jKGRldi0+ZGV2LCB0b19tcGQocGQpLT5wZG4sIGNxbiwgeHJjZG4sICZzcnEtPm10dCwKIAkJCSAgICAgc3JxLT5kYi5kbWEsICZzcnEtPm1zcnEpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3dyaWQ7CiAKIAlzcnEtPm1zcnEuZXZlbnQgPSBtbHg0X2liX3NycV9ldmVudDsKKwlzcnEtPmlic3JxLmV4dC54cmMuc3JxX251bSA9IHNycS0+bXNycS5zcnFuOwogCiAJaWYgKHBkLT51b2JqZWN0KQogCQlpZiAoaWJfY29weV90b191ZGF0YSh1ZGF0YSwgJnNycS0+bXNycS5zcnFuLCBzaXplb2YgKF9fdTMyKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKaW5kZXggZTRhMDhjMi4uNzEyZDJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NhdGFzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwppbmRleCAzMDgyYjNiLi45ZDNlNWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxyZG1hL2liX21hZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwppbmRleCBhYjg3NmY5Li5lZDlhOTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIAlidWRkeS0+Yml0cyA9IGt6YWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSAqIHNpemVvZiAobG9uZyAqKSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwotCWJ1ZGR5LT5udW1fZnJlZSA9IGt6YWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSAqIHNpemVvZiAoaW50ICopLAorCWJ1ZGR5LT5udW1fZnJlZSA9IGtjYWxsb2MoKGJ1ZGR5LT5tYXhfb3JkZXIgKyAxKSwgc2l6ZW9mICpidWRkeS0+bnVtX2ZyZWUsCiAJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZGR5LT5iaXRzIHx8ICFidWRkeS0+bnVtX2ZyZWUpCiAJCWdvdG8gZXJyX291dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggMzY1ZmUwZS4uNWI3MWQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKQEAgLTQwLDcgKzQwLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCiAjaW5jbHVkZSAibXRoY2FfY21kLmgiCkBAIC00MzgsNiArNDQwLDkgQEAKIAlzdHJ1Y3QgbXRoY2Ffc3JxICpzcnE7CiAJaW50IGVycjsKIAorCWlmIChpbml0X2F0dHItPnNycV90eXBlICE9IElCX1NSUVRfQkFTSUMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCiAJc3JxID0ga21hbGxvYyhzaXplb2YgKnNycSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcnEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9NYWtlZmlsZSBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvTWFrZWZpbGUKaW5kZXggMzUxNDg1MS4uOTc4MjBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0lORklOSUJBTkRfTkVTKSArPSBpd19uZXMubwogCi1pd19uZXMtb2JqcyA6PSBuZXMubyBuZXNfaHcubyBuZXNfbmljLm8gbmVzX3V0aWxzLm8gbmVzX3ZlcmJzLm8gbmVzX2NtLm8KK2l3X25lcy1vYmpzIDo9IG5lcy5vIG5lc19ody5vIG5lc19uaWMubyBuZXNfdXRpbHMubyBuZXNfdmVyYnMubyBuZXNfY20ubyBuZXNfbWd0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5jCmluZGV4IDJkNjY4YzYuLjU5NjViM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuYwpAQCAtODQsNyArODQsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhzZW5kX2ZpcnN0LCAiU2VuZCBSRE1BIE1lc3NhZ2UgRmlyc3Qgb24gQWN0aXZlIENvbm5lY3Rpb24iKTsKIAogCi11bnNpZ25lZCBpbnQgbmVzX2Rydl9vcHQgPSAwOwordW5zaWduZWQgaW50IG5lc19kcnZfb3B0ID0gTkVTX0RSVl9PUFRfRElTQUJMRV9JTlRfTU9EIHwgTkVTX0RSVl9PUFRfRU5BQkxFX1BBVTsKIG1vZHVsZV9wYXJhbShuZXNfZHJ2X29wdCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobmVzX2Rydl9vcHQsICJEcml2ZXIgb3B0aW9uIHBhcmFtZXRlcnMiKTsKIApAQCAtMTMwLDkgKzEzMCw2IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBuZXNfbmV0X2V2ZW50CiB9OwogCi0KLQotCiAvKioKICAqIG5lc19pbmV0YWRkcl9ldmVudAogICovCkBAIC0zMjEsNiArMzE4LDkgQEAKIAl9CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbmVzcXAtPnJlZmNvdW50KSkgeworCQlpZiAobmVzcXAtPnBhdV9tb2RlKQorCQkJbmVzX2Rlc3Ryb3lfcGF1X3FwKG5lc2RldiwgbmVzcXApOworCiAJCS8qIERlc3Ryb3kgdGhlIFFQICovCiAJCWNxcF9yZXF1ZXN0ID0gbmVzX2dldF9jcXBfcmVxdWVzdChuZXNkZXYpOwogCQlpZiAoY3FwX3JlcXVlc3QgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzLmgKaW5kZXggNmZlNzk4Ny4uNTY4YjRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lcy5oCkBAIC0xMDIsNiArMTAyLDcgQEAKICNkZWZpbmUgTkVTX0RSVl9PUFRfTk9fSU5MSU5FX0RBVEEgICAgICAgMHgwMDAwMDA4MAogI2RlZmluZSBORVNfRFJWX09QVF9ESVNBQkxFX0lOVF9NT0QgICAgICAweDAwMDAwMTAwCiAjZGVmaW5lIE5FU19EUlZfT1BUX0RJU0FCTEVfVklSVF9XUSAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTkVTX0RSVl9PUFRfRU5BQkxFX1BBVSAgICAgICAgICAgMHgwMDAwMDQwMAogCiAjZGVmaW5lIE5FU19BRVFfRVZFTlRfVElNRU9VVCAgICAgICAgIDI1MDAKICNkZWZpbmUgTkVTX0RJU0NPTk5FQ1RfRVZFTlRfVElNRU9VVCAgMjAwMApAQCAtMTI4LDYgKzEyOSw3IEBACiAjZGVmaW5lIE5FU19EQkdfSVdfUlggICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSBORVNfREJHX0lXX1RYICAgICAgIDB4MDAwNDAwMDAKICNkZWZpbmUgTkVTX0RCR19TSFVURE9XTiAgICAweDAwMDgwMDAwCisjZGVmaW5lIE5FU19EQkdfUEFVICAgICAgICAgMHgwMDEwMDAwMAogI2RlZmluZSBORVNfREJHX1JTVkQxICAgICAgIDB4MTAwMDAwMDAKICNkZWZpbmUgTkVTX0RCR19SU1ZEMiAgICAgICAweDIwMDAwMDAwCiAjZGVmaW5lIE5FU19EQkdfUlNWRDMgICAgICAgMHg0MDAwMDAwMApAQCAtMTYyLDYgKzE2NCw3IEBACiAjaW5jbHVkZSAibmVzX2NvbnRleHQuaCIKICNpbmNsdWRlICJuZXNfdXNlci5oIgogI2luY2x1ZGUgIm5lc19jbS5oIgorI2luY2x1ZGUgIm5lc19tZ3QuaCIKIAogZXh0ZXJuIGludCBtYXhfbXR1OwogI2RlZmluZSBtYXhfZnJhbWVfbGVuIChtYXhfbXR1K0VUSF9ITEVOKQpAQCAtMjAyLDYgKzIwNSw4IEBACiBleHRlcm4gYXRvbWljX3QgY21fbm9kZXNfZGVzdHJveWVkOwogZXh0ZXJuIGF0b21pY190IGNtX2FjY2VsX2Ryb3BwZWRfcGt0czsKIGV4dGVybiBhdG9taWNfdCBjbV9yZXNldHNfcmVjdmQ7CitleHRlcm4gYXRvbWljX3QgcGF1X3Fwc19jcmVhdGVkOworZXh0ZXJuIGF0b21pY190IHBhdV9xcHNfZGVzdHJveWVkOwogCiBleHRlcm4gdTMyIGludF9tb2RfdGltZXJfaW5pdDsKIGV4dGVybiB1MzIgaW50X21vZF9jcV9kZXB0aF8yNTY7CkBAIC0yNzMsNiArMjc4LDE0IEBACiAJdTggICAgICAgICAgICAgICAgICAgICBsaW5rX3JlY2hlY2s7CiB9OwogCisvKiBSZWNlaXZlIHNrYiBwcml2YXRlIGFyZWEgLSBtdXN0IGZpdCBpbiBza2ItPmNiIGFyZWEgKi8KK3N0cnVjdCBuZXNfcnNrYl9jYiB7CisJdTY0ICAgICAgICAgICAgICAgICAgICBidXNhZGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAgbWFwbGVuOworCXUzMiAgICAgICAgICAgICAgICAgICAgc2VxbnVtOworCXU4ICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc3RhcnQ7CisJc3RydWN0IG5lc19xcCAgICAgICAgICAqbmVzcXA7Cit9OwogCiBzdGF0aWMgaW5saW5lIF9fbGUzMiBnZXRfY3JjX3ZhbHVlKHN0cnVjdCBuZXNfdjRfcXVhZCAqbmVzX3F1YWQpCiB7CkBAIC0zMDUsOCArMzE4LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKHN0cnVjdCBuZXNfaHdfY3FwX3dxZSAqY3FwX3dxZSwgc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldikKIHsKLQlzZXRfd3FlXzY0Yml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfQ09NUF9DVFhfTE9XX0lEWCwKLQkJCSh1NjQpKCh1bnNpZ25lZCBsb25nKSAmbmVzZGV2LT5jcXApKTsKKwljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfQ09NUF9DVFhfTE9XX0lEWF0gICAgICAgPSAwOworCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX0NUWF9ISUdIX0lEWF0gICAgICA9IDA7CiAJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0NPTVBfU0NSQVRDSF9MT1dfSURYXSAgID0gMDsKIAljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfQ09NUF9TQ1JBVENIX0hJR0hfSURYXSAgPSAwOwogCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1NUQUdfV1FFX1BCTF9CTEtfQ09VTlRfSURYXSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwppbmRleCBjMTE4NjYzLi5kZmNlOWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKQEAgLTc3LDI2ICs3NywxOSBAQAogYXRvbWljX3QgY21fYWNjZWxfZHJvcHBlZF9wa3RzOwogYXRvbWljX3QgY21fcmVzZXRzX3JlY3ZkOwogCi1zdGF0aWMgaW5saW5lIGludCBtaW5pX2NtX2FjY2VsZXJhdGVkKHN0cnVjdCBuZXNfY21fY29yZSAqLAotCXN0cnVjdCBuZXNfY21fbm9kZSAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICptaW5pX2NtX2xpc3RlbihzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwKLQlzdHJ1Y3QgbmVzX3ZuaWMgKiwgc3RydWN0IG5lc19jbV9pbmZvICopOworc3RhdGljIGlubGluZSBpbnQgbWluaV9jbV9hY2NlbGVyYXRlZChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOworc3RhdGljIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKm1pbmlfY21fbGlzdGVuKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX3ZuaWMgKiwgc3RydWN0IG5lc19jbV9pbmZvICopOwogc3RhdGljIGludCBtaW5pX2NtX2RlbF9saXN0ZW4oc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKik7Ci1zdGF0aWMgc3RydWN0IG5lc19jbV9ub2RlICptaW5pX2NtX2Nvbm5lY3Qoc3RydWN0IG5lc19jbV9jb3JlICosCi0Jc3RydWN0IG5lc192bmljICosIHUxNiwgdm9pZCAqLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKik7CitzdGF0aWMgc3RydWN0IG5lc19jbV9ub2RlICptaW5pX2NtX2Nvbm5lY3Qoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfdm5pYyAqLCB1MTYsIHZvaWQgKiwgc3RydWN0IG5lc19jbV9pbmZvICopOwogc3RhdGljIGludCBtaW5pX2NtX2Nsb3NlKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7Ci1zdGF0aWMgaW50IG1pbmlfY21fYWNjZXB0KHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgKiwKLQlzdHJ1Y3QgbmVzX2NtX25vZGUgKik7Ci1zdGF0aWMgaW50IG1pbmlfY21fcmVqZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgKiwKLQlzdHJ1Y3QgbmVzX2NtX25vZGUgKik7Ci1zdGF0aWMgaW50IG1pbmlfY21fcmVjdl9wa3Qoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfdm5pYyAqLAotCXN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBtaW5pX2NtX2FjY2VwdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOworc3RhdGljIGludCBtaW5pX2NtX3JlamVjdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOworc3RhdGljIGludCBtaW5pX2NtX3JlY3ZfcGt0KHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX3ZuaWMgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBzdGF0aWMgaW50IG1pbmlfY21fZGVhbGxvY19jb3JlKHN0cnVjdCBuZXNfY21fY29yZSAqKTsKIHN0YXRpYyBpbnQgbWluaV9jbV9nZXQoc3RydWN0IG5lc19jbV9jb3JlICopOwogc3RhdGljIGludCBtaW5pX2NtX3NldChzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgdTMyLCB1MzIpOwogCi1zdGF0aWMgdm9pZCBmb3JtX2NtX2ZyYW1lKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXNfY21fbm9kZSAqLAotCXZvaWQgKiwgdTMyLCB2b2lkICosIHUzMiwgdTgpOworc3RhdGljIHZvaWQgZm9ybV9jbV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgdm9pZCAqLCB1MzIsIHZvaWQgKiwgdTMyLCB1OCk7CiBzdGF0aWMgaW50IGFkZF9yZWZfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CiBzdGF0aWMgaW50IHJlbV9yZWZfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOwogCkBAIC0xMTEsMTYgKzEwNCwxNCBAQAogc3RhdGljIGludCBzZW5kX3Jlc2V0KHN0cnVjdCBuZXNfY21fbm9kZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0YXRpYyBpbnQgc2VuZF9hY2soc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyBpbnQgc2VuZF9maW4oc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcGFja2V0KHN0cnVjdCBuZXNfY21fbm9kZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAotCXN0cnVjdCBuZXNfY21fY29yZSAqKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGFja2V0KHN0cnVjdCBuZXNfY21fbm9kZSAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmVzX2NtX2NvcmUgKik7CiAKIHN0YXRpYyB2b2lkIGFjdGl2ZV9vcGVuX2VycihzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgc3RydWN0IHNrX2J1ZmYgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHBhc3NpdmVfb3Blbl9lcnIoc3RydWN0IG5lc19jbV9ub2RlICosIHN0cnVjdCBza19idWZmICosIGludCk7CiBzdGF0aWMgdm9pZCBjbGVhbnVwX3JldHJhbnNfZW50cnkoc3RydWN0IG5lc19jbV9ub2RlICopOwogc3RhdGljIHZvaWQgaGFuZGxlX3Jjdl9tcGEoc3RydWN0IG5lc19jbV9ub2RlICosIHN0cnVjdCBza19idWZmICopOwogc3RhdGljIHZvaWQgZnJlZV9yZXRyYW5zX2VudHJ5KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSk7Ci1zdGF0aWMgaW50IGhhbmRsZV90Y3Bfb3B0aW9ucyhzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9wdGlvbnNpemUsIGludCBwYXNzaXZlKTsKK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF9vcHRpb25zKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHRjcGhkciAqdGNwaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9wdGlvbnNpemUsIGludCBwYXNzaXZlKTsKIAogLyogQ00gZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGNtX2V2ZW50X2Nvbm5lY3RlZChzdHJ1Y3QgbmVzX2NtX2V2ZW50ICopOwpAQCAtMTMwLDYgKzEyMSwxMiBAQAogc3RhdGljIHZvaWQgY21fZXZlbnRfbXBhX3JlamVjdChzdHJ1Y3QgbmVzX2NtX2V2ZW50ICopOwogc3RhdGljIHZvaWQgaGFuZGxlX3JlY3ZfZW50cnkoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCB1MzIgcmVtX25vZGUpOwogCisvKiBNUEEgYnVpbGQgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGNtX2J1aWxkX21wYV9mcmFtZShzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgdTggKiosIHUxNiAqLCB1OCAqLCB1OCk7CitzdGF0aWMgdm9pZCBidWlsZF9tcGFfdjIoc3RydWN0IG5lc19jbV9ub2RlICosIHZvaWQgKiwgdTgpOworc3RhdGljIHZvaWQgYnVpbGRfbXBhX3YxKHN0cnVjdCBuZXNfY21fbm9kZSAqLCB2b2lkICosIHU4KTsKK3N0YXRpYyB2b2lkIGJ1aWxkX3JkbWEwX21zZyhzdHJ1Y3QgbmVzX2NtX25vZGUgKiwgc3RydWN0IG5lc19xcCAqKik7CisKIHN0YXRpYyB2b2lkIHByaW50X2NvcmUoc3RydWN0IG5lc19jbV9jb3JlICpjb3JlKTsKIAogLyogRXh0ZXJuYWwgQ00gQVBJIEludGVyZmFjZSAqLwpAQCAtMTU5LDEyICsxNTYsMjEgQEAKIGF0b21pY190IGNtX2Nvbm5lY3RfcmVxczsKIGF0b21pY190IGNtX3JlamVjdHM7CiAKK2ludCBuZXNfYWRkX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKK3sKKwlyZXR1cm4gYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOworfQorCitpbnQgbmVzX3JlbV9yZWZfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCit7CisJcmV0dXJuIHJlbV9yZWZfY21fbm9kZShjbV9ub2RlLT5jbV9jb3JlLCBjbV9ub2RlKTsKK30KIAogLyoqCiAgKiBjcmVhdGVfZXZlbnQKICAqLwotc3RhdGljIHN0cnVjdCBuZXNfY21fZXZlbnQgKmNyZWF0ZV9ldmVudChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsCi0JCWVudW0gbmVzX2NtX2V2ZW50X3R5cGUgdHlwZSkKK3N0YXRpYyBzdHJ1Y3QgbmVzX2NtX2V2ZW50ICpjcmVhdGVfZXZlbnQoc3RydWN0IG5lc19jbV9ub2RlICoJY21fbm9kZSwKKwkJCQkJIGVudW0gbmVzX2NtX2V2ZW50X3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgbmVzX2NtX2V2ZW50ICpldmVudDsKIApAQCAtMTg2LDEwICsxOTIsMTAgQEAKIAlldmVudC0+Y21faW5mby5jbV9pZCA9IGNtX25vZGUtPmNtX2lkOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJjbV9ub2RlPSVwIENyZWF0ZWQgZXZlbnQ9JXAsIHR5cGU9JXUsICIKLQkJImRzdF9hZGRyPSUwOHhbJXhdLCBzcmNfYWRkcj0lMDh4WyV4XVxuIiwKLQkJY21fbm9kZSwgZXZlbnQsIHR5cGUsIGV2ZW50LT5jbV9pbmZvLmxvY19hZGRyLAotCQlldmVudC0+Y21faW5mby5sb2NfcG9ydCwgZXZlbnQtPmNtX2luZm8ucmVtX2FkZHIsCi0JCWV2ZW50LT5jbV9pbmZvLnJlbV9wb3J0KTsKKwkJICAiZHN0X2FkZHI9JTA4eFsleF0sIHNyY19hZGRyPSUwOHhbJXhdXG4iLAorCQkgIGNtX25vZGUsIGV2ZW50LCB0eXBlLCBldmVudC0+Y21faW5mby5sb2NfYWRkciwKKwkJICBldmVudC0+Y21faW5mby5sb2NfcG9ydCwgZXZlbnQtPmNtX2luZm8ucmVtX2FkZHIsCisJCSAgZXZlbnQtPmNtX2luZm8ucmVtX3BvcnQpOwogCiAJbmVzX2NtX3Bvc3RfZXZlbnQoZXZlbnQpOwogCXJldHVybiBldmVudDsKQEAgLTIwMSwxNCArMjA3LDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgc2VuZF9tcGFfcmVxdWVzdChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJdTggc3RhcnRfYWRkciA9IDA7CisJdTggKnN0YXJ0X3B0ciA9ICZzdGFydF9hZGRyOworCXU4ICoqc3RhcnRfYnVmZiA9ICZzdGFydF9wdHI7CisJdTE2IGJ1ZmZfbGVuID0gMDsKKwogCWlmICghc2tiKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAic2tiIHNldCB0byBOVUxMXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIHNlbmQgYW4gTVBBIFJlcXVlc3QgZnJhbWUgKi8KLQlmb3JtX2NtX2ZyYW1lKHNrYiwgY21fbm9kZSwgTlVMTCwgMCwgJmNtX25vZGUtPm1wYV9mcmFtZSwKLQkJCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplLCBTRVRfQUNLKTsKKwljbV9idWlsZF9tcGFfZnJhbWUoY21fbm9kZSwgc3RhcnRfYnVmZiwgJmJ1ZmZfbGVuLCBOVUxMLCBNUEFfS0VZX1JFUVVFU1QpOworCWZvcm1fY21fZnJhbWUoc2tiLCBjbV9ub2RlLCBOVUxMLCAwLCAqc3RhcnRfYnVmZiwgYnVmZl9sZW4sIFNFVF9BQ0spOwogCiAJcmV0dXJuIHNjaGVkdWxlX25lc190aW1lcihjbV9ub2RlLCBza2IsIE5FU19USU1FUl9UWVBFX1NFTkQsIDEsIDApOwogfQpAQCAtMjE3LDcgKzIyOCwxMSBAQAogCiBzdGF0aWMgaW50IHNlbmRfbXBhX3JlamVjdChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgICpza2IgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXU4IHN0YXJ0X2FkZHIgPSAwOworCXU4ICpzdGFydF9wdHIgPSAmc3RhcnRfYWRkcjsKKwl1OCAqKnN0YXJ0X2J1ZmYgPSAmc3RhcnRfcHRyOworCXUxNiBidWZmX2xlbiA9IDA7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9DTV9CVUZGRVIpOwogCWlmICghc2tiKSB7CkBAIC0yMjYsOCArMjQxLDggQEAKIAl9CiAKIAkvKiBzZW5kIGFuIE1QQSByZWplY3QgZnJhbWUgKi8KLQlmb3JtX2NtX2ZyYW1lKHNrYiwgY21fbm9kZSwgTlVMTCwgMCwgJmNtX25vZGUtPm1wYV9mcmFtZSwKLQkJCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplLCBTRVRfQUNLIHwgU0VUX0ZJTik7CisJY21fYnVpbGRfbXBhX2ZyYW1lKGNtX25vZGUsIHN0YXJ0X2J1ZmYsICZidWZmX2xlbiwgTlVMTCwgTVBBX0tFWV9SRVBMWSk7CisJZm9ybV9jbV9mcmFtZShza2IsIGNtX25vZGUsIE5VTEwsIDAsICpzdGFydF9idWZmLCBidWZmX2xlbiwgU0VUX0FDSyB8IFNFVF9GSU4pOwogCiAJY21fbm9kZS0+c3RhdGUgPSBORVNfQ01fU1RBVEVfRklOX1dBSVQxOwogCXJldHVybiBzY2hlZHVsZV9uZXNfdGltZXIoY21fbm9kZSwgc2tiLCBORVNfVElNRVJfVFlQRV9TRU5ELCAxLCAwKTsKQEAgLTIzOSwyNCArMjU0LDMxIEBACiAgKiBJRVRGIE1QQSBmcmFtZQogICovCiBzdGF0aWMgaW50IHBhcnNlX21wYShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHU4ICpidWZmZXIsIHUzMiAqdHlwZSwKLQkJdTMyIGxlbikKKwkJICAgICB1MzIgbGVuKQogewotCXN0cnVjdCBpZXRmX21wYV9mcmFtZSAqbXBhX2ZyYW1lOworCXN0cnVjdCBpZXRmX21wYV92MSAqbXBhX2ZyYW1lOworCXN0cnVjdCBpZXRmX21wYV92MiAqbXBhX3YyX2ZyYW1lOworCXN0cnVjdCBpZXRmX3J0cl9tc2cgKnJ0cl9tc2c7CisJaW50IG1wYV9oZHJfbGVuOworCWludCBwcml2X2RhdGFfbGVuOwogCiAJKnR5cGUgPSBORVNfTVBBX1JFUVVFU1RfQUNDRVBUOwogCiAJLyogYXNzdW1lIHJlcSBmcmFtZSBpcyBpbiB0Y3AgZGF0YSBwYXlsb2FkICovCi0JaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpKSB7CisJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfdjEpKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVGhlIHJlY2VpdmVkIGlldGYgYnVmZmVyIHdhcyB0b28gc21hbGwgKCV4KVxuIiwgbGVuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbXBhX2ZyYW1lID0gKHN0cnVjdCBpZXRmX21wYV9mcmFtZSAqKWJ1ZmZlcjsKLQljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IG50b2hzKG1wYV9mcmFtZS0+cHJpdl9kYXRhX2xlbik7CisJLyogcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lLCB3aGljaCBjb3VsZCBiZSBNUEEgVjEgb3IgVjIgKi8KKwltcGFfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX3YxICopYnVmZmVyOworCW1wYV9oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92MSk7CisJcHJpdl9kYXRhX2xlbiA9IG50b2hzKG1wYV9mcmFtZS0+cHJpdl9kYXRhX2xlbik7CisKIAkvKiBtYWtlIHN1cmUgbXBhIHByaXZhdGUgZGF0YSBsZW4gaXMgbGVzcyB0aGFuIDUxMiBieXRlcyAqLwotCWlmIChjbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA+IElFVEZfTUFYX1BSSVZfREFUQV9MRU4pIHsKKwlpZiAocHJpdl9kYXRhX2xlbiA+IElFVEZfTUFYX1BSSVZfREFUQV9MRU4pIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJUaGUgcmVjZWl2ZWQgTGVuZ3RoIG9mIFByaXZhdGUiCi0JCQkiIERhdGEgZmllbGQgZXhjZWVkcyA1MTIgb2N0ZXRzXG4iKTsKKwkJCSAgIiBEYXRhIGZpZWxkIGV4Y2VlZHMgNTEyIG9jdGV0c1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgpAQCAtMjY0LDExICsyODYsMjIgQEAKIAkgKiByZWNlaXZlZCBNUEEgdmVyc2lvbiBhbmQgTVBBIGtleSBpbmZvcm1hdGlvbgogCSAqCiAJICovCi0JaWYgKG1wYV9mcmFtZS0+cmV2ICE9IG1wYV92ZXJzaW9uKSB7CisJaWYgKG1wYV9mcmFtZS0+cmV2ICE9IElFVEZfTVBBX1YxICYmIG1wYV9mcmFtZS0+cmV2ICE9IElFVEZfTVBBX1YyKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVGhlIHJlY2VpdmVkIG1wYSB2ZXJzaW9uIgotCQkJCSIgY2FuIG5vdCBiZSBpbnRlcm9wZXJhdGVkXG4iKTsKKwkJCSAgIiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCS8qCisJKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5CisJKi8KKwlpZiAobXBhX2ZyYW1lLT5yZXYgPiBjbV9ub2RlLT5tcGFfZnJhbWVfcmV2KSB7CisJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVGhlIHJlY2VpdmVkIG1wYSB2ZXJzaW9uIgorCQkJIiBjYW4gbm90IGJlIGludGVyb3BlcmF0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQljbV9ub2RlLT5tcGFfZnJhbWVfcmV2ID0gbXBhX2ZyYW1lLT5yZXY7CisJfQorCiAJaWYgKGNtX25vZGUtPnN0YXRlICE9IE5FU19DTV9TVEFURV9NUEFSRVFfU0VOVCkgewogCQlpZiAobWVtY21wKG1wYV9mcmFtZS0+a2V5LCBJRUZUX01QQV9LRVlfUkVRLCBJRVRGX01QQV9LRVlfU0laRSkpIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiVW5leHBlY3RlZCBNUEEgS2V5IHJlY2VpdmVkIFxuIik7CkBAIC0yODEsMjUgKzMxNCw3NSBAQAogCQl9CiAJfQogCi0JaWYgKGNtX25vZGUtPm1wYV9mcmFtZV9zaXplICsgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSkgIT0gbGVuKSB7CisKKwlpZiAocHJpdl9kYXRhX2xlbiArIG1wYV9oZHJfbGVuICE9IGxlbikgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlRoZSByZWNlaXZlZCBpZXRmIGJ1ZmZlciB3YXMgbm90IHJpZ2h0IgotCQkJCSIgY29tcGxldGUgKCV4ICsgJXggIT0gJXgpXG4iLAotCQkJCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplLAotCQkJCSh1MzIpc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSksIGxlbik7CisJCQkiIGNvbXBsZXRlICgleCArICV4ICE9ICV4KVxuIiwKKwkJCXByaXZfZGF0YV9sZW4sIG1wYV9oZHJfbGVuLCBsZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogbWFrZSBzdXJlIGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4IHNpemUgKi8KIAlpZiAobGVuID4gTUFYX0NNX0JVRkZFUikgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlRoZSByZWNlaXZlZCBpZXRmIGJ1ZmZlciB3YXMgdG9vIGxhcmdlIgotCQkJCSIgKCV4ICsgJXggIT0gJXgpXG4iLAotCQkJCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplLAotCQkJCSh1MzIpc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSksIGxlbik7CisJCQkiICgleCArICV4ICE9ICV4KVxuIiwKKwkJCXByaXZfZGF0YV9sZW4sIG1wYV9oZHJfbGVuLCBsZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IHByaXZfZGF0YV9sZW47CisKKwlzd2l0Y2ggKG1wYV9mcmFtZS0+cmV2KSB7CisJY2FzZSBJRVRGX01QQV9WMjogeworCQl1MTYgaXJkX3NpemU7CisJCXUxNiBvcmRfc2l6ZTsKKwkJbXBhX3YyX2ZyYW1lID0gKHN0cnVjdCBpZXRmX21wYV92MiAqKWJ1ZmZlcjsKKwkJbXBhX2hkcl9sZW4gKz0gSUVURl9SVFJfTVNHX1NJWkU7CisJCWNtX25vZGUtPm1wYV9mcmFtZV9zaXplIC09IElFVEZfUlRSX01TR19TSVpFOworCQlydHJfbXNnID0gJm1wYV92Ml9mcmFtZS0+cnRyX21zZzsKKworCQkvKiBwYXJzZSBydHIgbWVzc2FnZSAqLworCQlydHJfbXNnLT5jdHJsX2lyZCA9IG50b2hzKHJ0cl9tc2ctPmN0cmxfaXJkKTsKKwkJcnRyX21zZy0+Y3RybF9vcmQgPSBudG9ocyhydHJfbXNnLT5jdHJsX29yZCk7CisJCWlyZF9zaXplID0gcnRyX21zZy0+Y3RybF9pcmQgJiBJRVRGX05PX0lSRF9PUkQ7CisJCW9yZF9zaXplID0gcnRyX21zZy0+Y3RybF9vcmQgJiBJRVRGX05PX0lSRF9PUkQ7CisKKwkJaWYgKCEocnRyX21zZy0+Y3RybF9pcmQgJiBJRVRGX1BFRVJfVE9fUEVFUikpIHsKKwkJCS8qIHNlbmQgcmVzZXQgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNtX25vZGUtPnN0YXRlICE9IE5FU19DTV9TVEFURV9NUEFSRVFfU0VOVCkgeworCQkJLyogcmVzcG9uZGVyICovCisJCQlpZiAoY21fbm9kZS0+b3JkX3NpemUgPiBpcmRfc2l6ZSkKKwkJCQljbV9ub2RlLT5vcmRfc2l6ZSA9IGlyZF9zaXplOworCQl9IGVsc2UgeworCQkJLyogaW5pdGlhdG9yICovCisJCQlpZiAoY21fbm9kZS0+b3JkX3NpemUgPiBpcmRfc2l6ZSkKKwkJCQljbV9ub2RlLT5vcmRfc2l6ZSA9IGlyZF9zaXplOworCisJCQlpZiAoY21fbm9kZS0+aXJkX3NpemUgPCBvcmRfc2l6ZSkgeworCQkJCS8qIG5vIHJlc291cmNlcyBhdmFpbGFibGUgKi8KKwkJCQkvKiBzZW5kIHRlcm1pbmF0ZSBtZXNzYWdlICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQlpZiAocnRyX21zZy0+Y3RybF9vcmQgJiBJRVRGX1JETUEwX1JFQUQpIHsKKwkJCWNtX25vZGUtPnNlbmRfcmRtYTBfb3AgPSBTRU5EX1JETUFfUkVBRF9aRVJPOworCQl9IGVsc2UgaWYgKHJ0cl9tc2ctPmN0cmxfb3JkICYgSUVURl9SRE1BMF9XUklURSkgeworCQkJY21fbm9kZS0+c2VuZF9yZG1hMF9vcCA9IFNFTkRfUkRNQV9XUklURV9aRVJPOworCQl9IGVsc2UgeyAgICAgICAgLyogTm90IHN1cHBvcnRlZCBSRE1BMCBvcGVyYXRpb24gKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElFVEZfTVBBX1YxOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCS8qIGNvcHkgZW50aXJlIE1QQSBmcmFtZSB0byBvdXIgY21fbm9kZSdzIGZyYW1lICovCi0JbWVtY3B5KGNtX25vZGUtPm1wYV9mcmFtZV9idWYsIGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpLAotCQkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUpOworCW1lbWNweShjbV9ub2RlLT5tcGFfZnJhbWVfYnVmLCBidWZmZXIgKyBtcGFfaGRyX2xlbiwgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUpOwogCiAJaWYgKG1wYV9mcmFtZS0+ZmxhZ3MgJiBJRVRGX01QQV9GTEFHU19SRUpFQ1QpCiAJCSp0eXBlID0gTkVTX01QQV9SRVFVRVNUX1JFSkVDVDsKQEAgLTMxMiw4ICszOTUsOCBAQAogICogbm9kZSBpbmZvIHRvIGJ1aWxkLgogICovCiBzdGF0aWMgdm9pZCBmb3JtX2NtX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCi0Jc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCB2b2lkICpvcHRpb25zLCB1MzIgb3B0aW9uc2l6ZSwKLQl2b2lkICpkYXRhLCB1MzIgZGF0YXNpemUsIHU4IGZsYWdzKQorCQkJICBzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHZvaWQgKm9wdGlvbnMsIHUzMiBvcHRpb25zaXplLAorCQkJICB2b2lkICpkYXRhLCB1MzIgZGF0YXNpemUsIHU4IGZsYWdzKQogewogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJc3RydWN0IGlwaGRyICppcGg7CkBAIC0zMjIsMTQgKzQwNSwxNCBAQAogCXUxNiBwYWNrZXRzaXplID0gc2l6ZW9mKCppcGgpOwogCiAJcGFja2V0c2l6ZSArPSBzaXplb2YoKnRjcGgpOwotCXBhY2tldHNpemUgKz0gIG9wdGlvbnNpemUgKyBkYXRhc2l6ZTsKKwlwYWNrZXRzaXplICs9IG9wdGlvbnNpemUgKyBkYXRhc2l6ZTsKIAorCXNrYl90cmltKHNrYiwgMCk7CiAJbWVtc2V0KHNrYi0+ZGF0YSwgMHgwMCwgRVRIX0hMRU4gKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcGgpKTsKIAotCXNrYi0+bGVuID0gMDsKIAlidWYgPSBza2JfcHV0KHNrYiwgcGFja2V0c2l6ZSArIEVUSF9ITEVOKTsKIAotCWV0aGggPSAoc3RydWN0IGV0aGhkciAqKSBidWY7CisJZXRoaCA9IChzdHJ1Y3QgZXRoaGRyICopYnVmOwogCWJ1ZiArPSBFVEhfSExFTjsKIAogCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilidWY7CkBAIC0zMzcsNyArNDIwLDcgQEAKIAl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKilidWY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgRVRIX0hMRU4pOwotCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIEVUSF9ITEVOK3NpemVvZigqaXBoKSk7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgRVRIX0hMRU4gKyBzaXplb2YoKmlwaCkpOwogCWJ1ZiArPSBzaXplb2YoKnRjcGgpOwogCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwpAQCAtMzUwLDE0ICs0MzMsMTQgQEAKIAlldGhoLT5oX3Byb3RvID0gaHRvbnMoMHgwODAwKTsKIAogCWlwaC0+dmVyc2lvbiA9IElQVkVSU0lPTjsKLQlpcGgtPmlobCA9IDU7CQkvKiA1ICogNEJ5dGUgd29yZHMsIElQIGhlYWRyIGxlbiAqLworCWlwaC0+aWhsID0gNTsgICAgICAgICAgIC8qIDUgKiA0Qnl0ZSB3b3JkcywgSVAgaGVhZHIgbGVuICovCiAJaXBoLT50b3MgPSAwOwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHBhY2tldHNpemUpOwogCWlwaC0+aWQgPSBodG9ucygrK2NtX25vZGUtPnRjcF9jbnR4dC5sb2NfaWQpOwogCiAJaXBoLT5mcmFnX29mZiA9IGh0b25zKDB4NDAwMCk7CiAJaXBoLT50dGwgPSAweDQwOwotCWlwaC0+cHJvdG9jb2wgPSAweDA2OwkvKiBJUFBST1RPX1RDUCAqLworCWlwaC0+cHJvdG9jb2wgPSAweDA2OyAgIC8qIElQUFJPVE9fVENQICovCiAKIAlpcGgtPnNhZGRyID0gaHRvbmwoY21fbm9kZS0+bG9jX2FkZHIpOwogCWlwaC0+ZGFkZHIgPSBodG9ubChjbV9ub2RlLT5yZW1fYWRkcik7CkBAIC0zNzAsMTQgKzQ1MywxNiBAQAogCQljbV9ub2RlLT50Y3BfY250eHQubG9jX2Fja19udW0gPSBjbV9ub2RlLT50Y3BfY250eHQucmN2X254dDsKIAkJdGNwaC0+YWNrX3NlcSA9IGh0b25sKGNtX25vZGUtPnRjcF9jbnR4dC5sb2NfYWNrX251bSk7CiAJCXRjcGgtPmFjayA9IDE7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJdGNwaC0+YWNrX3NlcSA9IDA7CisJfQogCiAJaWYgKGZsYWdzICYgU0VUX1NZTikgewogCQljbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0rKzsKIAkJdGNwaC0+c3luID0gMTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQljbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0gKz0gZGF0YXNpemU7CisJfQogCiAJaWYgKGZsYWdzICYgU0VUX0ZJTikgewogCQljbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0rKzsKQEAgLTM5OCwxMCArNDgzLDggQEAKIAogCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAwOwogCWNtX3BhY2tldHNfY3JlYXRlZCsrOwotCiB9CiAKLQogLyoqCiAgKiBwcmludF9jb3JlIC0gZHVtcCBhIGNtIGNvcmUKICAqLwpAQCAtNDEzLDcgKzQ5Niw3IEBACiAJCXJldHVybjsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKLQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlN0YXRlICAgICAgICAgOiAldSBcbiIsICBjb3JlLT5zdGF0ZSk7CisJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJTdGF0ZSAgICAgICAgIDogJXUgXG4iLCBjb3JlLT5zdGF0ZSk7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIkxpc3RlbiBOb2RlcyAgOiAldSBcbiIsIGF0b21pY19yZWFkKCZjb3JlLT5saXN0ZW5fbm9kZV9jbnQpKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIkFjdGl2ZSBOb2RlcyAgOiAldSBcbiIsIGF0b21pY19yZWFkKCZjb3JlLT5ub2RlX2NudCkpOwpAQCAtNDIzLDYgKzUwNiwxNDcgQEAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIi0tLS0tLS0tLS0tLS0tIGVuZCBjb3JlIC0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKKy8qKgorICogY21fYnVpbGRfbXBhX2ZyYW1lIC0gYnVpbGQgYSBNUEEgVjEgZnJhbWUgb3IgTVBBIFYyIGZyYW1lCisgKi8KK3N0YXRpYyBpbnQgY21fYnVpbGRfbXBhX2ZyYW1lKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgdTggKipzdGFydF9idWZmLAorCQkJICAgICAgdTE2ICpidWZmX2xlbiwgdTggKnBjaV9tZW0sIHU4IG1wYV9rZXkpCit7CisJaW50IHJldCA9IDA7CisKKwkqc3RhcnRfYnVmZiA9IChwY2lfbWVtKSA/IHBjaV9tZW0gOiAmY21fbm9kZS0+bXBhX2ZyYW1lX2J1ZlswXTsKKworCXN3aXRjaCAoY21fbm9kZS0+bXBhX2ZyYW1lX3JldikgeworCWNhc2UgSUVURl9NUEFfVjE6CisJCSpzdGFydF9idWZmID0gKHU4ICopKnN0YXJ0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGlldGZfcnRyX21zZyk7CisJCSpidWZmX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfdjEpICsgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CisJCWJ1aWxkX21wYV92MShjbV9ub2RlLCAqc3RhcnRfYnVmZiwgbXBhX2tleSk7CisJCWJyZWFrOworCWNhc2UgSUVURl9NUEFfVjI6CisJCSpidWZmX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfdjIpICsgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CisJCWJ1aWxkX21wYV92MihjbV9ub2RlLCAqc3RhcnRfYnVmZiwgbXBhX2tleSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYnVpbGRfbXBhX3YyIC0gYnVpbGQgYSBNUEEgVjIgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgYnVpbGRfbXBhX3YyKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwKKwkJCSB2b2lkICpzdGFydF9hZGRyLCB1OCBtcGFfa2V5KQoreworCXN0cnVjdCBpZXRmX21wYV92MiAqbXBhX2ZyYW1lID0gKHN0cnVjdCBpZXRmX21wYV92MiAqKXN0YXJ0X2FkZHI7CisJc3RydWN0IGlldGZfcnRyX21zZyAqcnRyX21zZyA9ICZtcGFfZnJhbWUtPnJ0cl9tc2c7CisKKwkvKiBpbml0aWFsaXplIHRoZSB1cHBlciA1IGJ5dGVzIG9mIHRoZSBmcmFtZSAqLworCWJ1aWxkX21wYV92MShjbV9ub2RlLCBzdGFydF9hZGRyLCBtcGFfa2V5KTsKKwltcGFfZnJhbWUtPmZsYWdzIHw9IElFVEZfTVBBX1YyX0ZMQUc7IC8qIHNldCBhIGJpdCB0byBpbmRpY2F0ZSBNUEEgVjIgKi8KKwltcGFfZnJhbWUtPnByaXZfZGF0YV9sZW4gKz0gaHRvbnMoSUVURl9SVFJfTVNHX1NJWkUpOworCisJLyogaW5pdGlhbGl6ZSBSVFIgbXNnICovCisJcnRyX21zZy0+Y3RybF9pcmQgPSAoY21fbm9kZS0+aXJkX3NpemUgPiBJRVRGX05PX0lSRF9PUkQpID8KKwkJCSAgICBJRVRGX05PX0lSRF9PUkQgOiBjbV9ub2RlLT5pcmRfc2l6ZTsKKwlydHJfbXNnLT5jdHJsX29yZCA9IChjbV9ub2RlLT5vcmRfc2l6ZSA+IElFVEZfTk9fSVJEX09SRCkgPworCQkJICAgIElFVEZfTk9fSVJEX09SRCA6IGNtX25vZGUtPm9yZF9zaXplOworCisJcnRyX21zZy0+Y3RybF9pcmQgfD0gSUVURl9QRUVSX1RPX1BFRVI7CisJcnRyX21zZy0+Y3RybF9pcmQgfD0gSUVURl9GTFBEVV9aRVJPX0xFTjsKKworCXN3aXRjaCAobXBhX2tleSkgeworCWNhc2UgTVBBX0tFWV9SRVFVRVNUOgorCQlydHJfbXNnLT5jdHJsX29yZCB8PSBJRVRGX1JETUEwX1dSSVRFOworCQlydHJfbXNnLT5jdHJsX29yZCB8PSBJRVRGX1JETUEwX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgTVBBX0tFWV9SRVBMWToKKwkJc3dpdGNoIChjbV9ub2RlLT5zZW5kX3JkbWEwX29wKSB7CisJCWNhc2UgU0VORF9SRE1BX1dSSVRFX1pFUk86CisJCQlydHJfbXNnLT5jdHJsX29yZCB8PSBJRVRGX1JETUEwX1dSSVRFOworCQkJYnJlYWs7CisJCWNhc2UgU0VORF9SRE1BX1JFQURfWkVSTzoKKwkJCXJ0cl9tc2ctPmN0cmxfb3JkIHw9IElFVEZfUkRNQTBfUkVBRDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJ0cl9tc2ctPmN0cmxfaXJkID0gaHRvbnMocnRyX21zZy0+Y3RybF9pcmQpOworCXJ0cl9tc2ctPmN0cmxfb3JkID0gaHRvbnMocnRyX21zZy0+Y3RybF9vcmQpOworfQorCisvKioKKyAqIGJ1aWxkX21wYV92MSAtIGJ1aWxkIGEgTVBBIFYxIGZyYW1lCisgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX21wYV92MShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHZvaWQgKnN0YXJ0X2FkZHIsIHU4IG1wYV9rZXkpCit7CisJc3RydWN0IGlldGZfbXBhX3YxICptcGFfZnJhbWUgPSAoc3RydWN0IGlldGZfbXBhX3YxICopc3RhcnRfYWRkcjsKKworCXN3aXRjaCAobXBhX2tleSkgeworCWNhc2UgTVBBX0tFWV9SRVFVRVNUOgorCQltZW1jcHkobXBhX2ZyYW1lLT5rZXksIElFRlRfTVBBX0tFWV9SRVEsIElFVEZfTVBBX0tFWV9TSVpFKTsKKwkJYnJlYWs7CisJY2FzZSBNUEFfS0VZX1JFUExZOgorCQltZW1jcHkobXBhX2ZyYW1lLT5rZXksIElFRlRfTVBBX0tFWV9SRVAsIElFVEZfTVBBX0tFWV9TSVpFKTsKKwkJYnJlYWs7CisJfQorCW1wYV9mcmFtZS0+ZmxhZ3MgPSBJRVRGX01QQV9GTEFHU19DUkM7CisJbXBhX2ZyYW1lLT5yZXYgPSBjbV9ub2RlLT5tcGFfZnJhbWVfcmV2OworCW1wYV9mcmFtZS0+cHJpdl9kYXRhX2xlbiA9IGh0b25zKGNtX25vZGUtPm1wYV9mcmFtZV9zaXplKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfcmRtYTBfbXNnKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IG5lc19xcCAqKm5lc3FwX2FkZHIpCit7CisJdTY0IHU2NHRlbXA7CisJc3RydWN0IG5lc19xcCAqbmVzcXAgPSAqbmVzcXBfYWRkcjsKKwlzdHJ1Y3QgbmVzX2h3X3FwX3dxZSAqd3FlID0gJm5lc3FwLT5od3FwLnNxX3ZiYXNlWzBdOworCisJdTY0dGVtcCA9ICh1bnNpZ25lZCBsb25nKW5lc3FwOworCXU2NHRlbXAgfD0gTkVTX1NXX0NPTlRFWFRfQUxJR04gPj4gMTsKKwlzZXRfd3FlXzY0Yml0X3ZhbHVlKHdxZS0+d3FlX3dvcmRzLCBORVNfSVdBUlBfU1FfV1FFX0NPTVBfQ1RYX0xPV19JRFgsIHU2NHRlbXApOworCisJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9MT1dfSURYXSA9IDA7CisJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9ISUdIX0lEWF0gPSAwOworCisJc3dpdGNoIChjbV9ub2RlLT5zZW5kX3JkbWEwX29wKSB7CisJY2FzZSBTRU5EX1JETUFfV1JJVEVfWkVSTzoKKwkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJTZW5kaW5nIGZpcnN0IHdyaXRlLlxuIik7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfTUlTQ19JRFhdID0KKwkJCWNwdV90b19sZTMyKE5FU19JV0FSUF9TUV9PUF9SRE1BVyk7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfVE9UQUxfUEFZTE9BRF9JRFhdID0gMDsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9MRU5HVEgwX0lEWF0gPSAwOworCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1NUQUcwX0lEWF0gPSAwOworCQlicmVhazsKKworCWNhc2UgU0VORF9SRE1BX1JFQURfWkVSTzoKKwlkZWZhdWx0OgorCQlpZiAoY21fbm9kZS0+c2VuZF9yZG1hMF9vcCAhPSBTRU5EX1JETUFfUkVBRF9aRVJPKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XTogVW5zdXBwb3J0ZWQgUkRNQTAgbGVuIG9wZXJhdGlvbj0ldVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBjbV9ub2RlLT5zZW5kX3JkbWEwX29wKTsKKwkJCVdBUk5fT04oMSk7CisJCX0KKwkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJTZW5kaW5nIGZpcnN0IHJkbWEgb3BlcmF0aW9uLlxuIik7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfTUlTQ19JRFhdID0KKwkJCWNwdV90b19sZTMyKE5FU19JV0FSUF9TUV9PUF9SRE1BUik7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfUkRNQV9UT19MT1dfSURYXSA9IDE7CisJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfUkRNQV9UT19ISUdIX0lEWF0gPSAwOworCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1JETUFfTEVOR1RIX0lEWF0gPSAwOworCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1JETUFfU1RBR19JRFhdID0gMTsKKwkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9TVEFHMF9JRFhdID0gMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG5lc3FwLT5zcV9rbWFwcGVkKSB7CisJCW5lc3FwLT5zcV9rbWFwcGVkID0gMDsKKwkJa3VubWFwKG5lc3FwLT5wYWdlKTsKKwl9CisKKwkvKnVzZSB0aGUgcmVzZXJ2ZWQgc3BvdCBvbiB0aGUgV1EgZm9yIHRoZSBleHRyYSBmaXJzdCBXUUUqLworCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5pcmRfb3JkX3NpemVzICY9IGNwdV90b19sZTMyKH4oTkVTX1FQQ09OVEVYVF9PUkRJUkRfTFNNTV9QUkVTRU5UIHwKKwkJCQkJCQkgICAgIE5FU19RUENPTlRFWFRfT1JESVJEX1dSUERVIHwKKwkJCQkJCQkgICAgIE5FU19RUENPTlRFWFRfT1JESVJEX0FMU01NKSk7CisJbmVzcXAtPnNraXBfbHNtbSA9IDE7CisJbmVzcXAtPmh3cXAuc3FfdGFpbCA9IDA7Cit9CiAKIC8qKgogICogc2NoZWR1bGVfbmVzX3RpbWVyCkBAIC00MzAsMTAgKzY1NCwxMCBAQAogICoJCQlyZW1fcmVmX2NtX25vZGUoY21fY29yZSwgY21fbm9kZSk7YWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwogICovCiBpbnQgc2NoZWR1bGVfbmVzX3RpbWVyKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJZW51bSBuZXNfdGltZXJfdHlwZSB0eXBlLCBpbnQgc2VuZF9yZXRyYW5zLAotCQlpbnQgY2xvc2Vfd2hlbl9jb21wbGV0ZSkKKwkJICAgICAgIGVudW0gbmVzX3RpbWVyX3R5cGUgdHlwZSwgaW50IHNlbmRfcmV0cmFucywKKwkJICAgICAgIGludCBjbG9zZV93aGVuX2NvbXBsZXRlKQogewotCXVuc2lnbmVkIGxvbmcgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlID0gY21fbm9kZS0+Y21fY29yZTsKIAlzdHJ1Y3QgbmVzX3RpbWVyX2VudHJ5ICpuZXdfc2VuZDsKIAlpbnQgcmV0ID0gMDsKQEAgLTQ1NCw3ICs2NzgsNyBAQAogCW5ld19zZW5kLT5jbG9zZV93aGVuX2NvbXBsZXRlID0gY2xvc2Vfd2hlbl9jb21wbGV0ZTsKIAogCWlmICh0eXBlID09IE5FU19USU1FUl9UWVBFX0NMT1NFKSB7Ci0JCW5ld19zZW5kLT50aW1ldG9zZW5kICs9IChIWi8xMCk7CisJCW5ld19zZW5kLT50aW1ldG9zZW5kICs9IChIWiAvIDEwKTsKIAkJaWYgKGNtX25vZGUtPnJlY3ZfZW50cnkpIHsKIAkJCWtmcmVlKG5ld19zZW5kKTsKIAkJCVdBUk5fT04oMSk7CkBAIC00NzUsNyArNjk5LDcgQEAKIAkJcmV0ID0gbmVzX25pY19jbV94bWl0KG5ld19zZW5kLT5za2IsIGNtX25vZGUtPm5ldGRldik7CiAJCWlmIChyZXQgIT0gTkVUREVWX1RYX09LKSB7CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkVycm9yIHNlbmRpbmcgcGFja2V0ICVwICIKLQkJCQkiKGppZmZpZXMgPSAlbHUpXG4iLCBuZXdfc2VuZCwgamlmZmllcyk7CisJCQkJICAiKGppZmZpZXMgPSAlbHUpXG4iLCBuZXdfc2VuZCwgamlmZmllcyk7CiAJCQluZXdfc2VuZC0+dGltZXRvc2VuZCA9IGppZmZpZXM7CiAJCQlyZXQgPSBORVRERVZfVFhfT0s7CiAJCX0gZWxzZSB7CkBAIC01MDQsNiArNzI4LDcgQEAKIAlzdHJ1Y3QgaXdfY21faWQgKmNtX2lkID0gY21fbm9kZS0+Y21faWQ7CiAJZW51bSBuZXNfY21fbm9kZV9zdGF0ZSBzdGF0ZSA9IGNtX25vZGUtPnN0YXRlOwogCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX0NMT1NFRDsKKwogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIE5FU19DTV9TVEFURV9TWU5fUkNWRDoKIAljYXNlIE5FU19DTV9TVEFURV9DTE9TSU5HOgpAQCAtNTM2LDEwICs3NjEsMTAgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc3FwLT5sb2NrLCBxcGxvY2tmbGFncyk7CiAJCWlmIChuZXNxcC0+Y21faWQpIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldTogY21faWQgPSAlcCwgIgotCQkJCSJyZWZjb3VudCA9ICVkOiBISVQgQSAiCi0JCQkJIk5FU19USU1FUl9UWVBFX0NMT1NFIHdpdGggc29tZXRoaW5nICIKLQkJCQkidG8gZG8hISFcbiIsIG5lc3FwLT5od3FwLnFwX2lkLCBjbV9pZCwKLQkJCQlhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CisJCQkJICAicmVmY291bnQgPSAlZDogSElUIEEgIgorCQkJCSAgIk5FU19USU1FUl9UWVBFX0NMT1NFIHdpdGggc29tZXRoaW5nICIKKwkJCQkgICJ0byBkbyEhIVxuIiwgbmVzcXAtPmh3cXAucXBfaWQsIGNtX2lkLAorCQkJCSAgYXRvbWljX3JlYWQoJm5lc3FwLT5yZWZjb3VudCkpOwogCQkJbmVzcXAtPmh3X3RjcF9zdGF0ZSA9IE5FU19BRVFFX1RDUF9TVEFURV9DTE9TRUQ7CiAJCQluZXNxcC0+bGFzdF9hZXEgPSBORVNfQUVRRV9BRUlEX1JFU0VUX1NFTlQ7CiAJCQluZXNxcC0+aWJxcF9zdGF0ZSA9IElCX1FQU19FUlI7CkBAIC01NDgsMTAgKzc3MywxMCBAQAogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPmxvY2ssIHFwbG9ja2ZsYWdzKTsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldTogY21faWQgPSAlcCwgIgotCQkJCSJyZWZjb3VudCA9ICVkOiBISVQgQSAiCi0JCQkJIk5FU19USU1FUl9UWVBFX0NMT1NFIHdpdGggbm90aGluZyAiCi0JCQkJInRvIGRvISEhXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwgY21faWQsCi0JCQkJYXRvbWljX3JlYWQoJm5lc3FwLT5yZWZjb3VudCkpOworCQkJCSAgInJlZmNvdW50ID0gJWQ6IEhJVCBBICIKKwkJCQkgICJORVNfVElNRVJfVFlQRV9DTE9TRSB3aXRoIG5vdGhpbmcgIgorCQkJCSAgInRvIGRvISEhXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwgY21faWQsCisJCQkJICBhdG9taWNfcmVhZCgmbmVzcXAtPnJlZmNvdW50KSk7CiAJCX0KIAl9IGVsc2UgaWYgKHJlbV9ub2RlKSB7CiAJCS8qIFRJTUVfV0FJVCBzdGF0ZSAqLwpAQCAtNTgwLDExICs4MDUsMTIgQEAKIAlpbnQgcmV0ID0gTkVUREVWX1RYX09LOwogCiAJc3RydWN0IGxpc3RfaGVhZCB0aW1lcl9saXN0OworCiAJSU5JVF9MSVNUX0hFQUQoJnRpbWVyX2xpc3QpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9jb3JlLT5odF9sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBsaXN0X2NvcmVfdGVtcCwKLQkJCQkmY21fY29yZS0+Y29ubmVjdGVkX25vZGVzKSB7CisJCQkgICAmY21fY29yZS0+Y29ubmVjdGVkX25vZGVzKSB7CiAJCWNtX25vZGUgPSBjb250YWluZXJfb2YobGlzdF9ub2RlLCBzdHJ1Y3QgbmVzX2NtX25vZGUsIGxpc3QpOwogCQlpZiAoKGNtX25vZGUtPnJlY3ZfZW50cnkpIHx8IChjbV9ub2RlLT5zZW5kX2VudHJ5KSkgewogCQkJYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwpAQCAtNTk1LDE4ICs4MjEsMTkgQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X25vZGUsIGxpc3RfY29yZV90ZW1wLCAmdGltZXJfbGlzdCkgewogCQljbV9ub2RlID0gY29udGFpbmVyX29mKGxpc3Rfbm9kZSwgc3RydWN0IG5lc19jbV9ub2RlLAotCQkJCQl0aW1lcl9lbnRyeSk7CisJCQkJICAgICAgIHRpbWVyX2VudHJ5KTsKIAkJcmVjdl9lbnRyeSA9IGNtX25vZGUtPnJlY3ZfZW50cnk7CiAKIAkJaWYgKHJlY3ZfZW50cnkpIHsKIAkJCWlmICh0aW1lX2FmdGVyKHJlY3ZfZW50cnktPnRpbWV0b3NlbmQsIGppZmZpZXMpKSB7CiAJCQkJaWYgKG5leHR0aW1lb3V0ID4gcmVjdl9lbnRyeS0+dGltZXRvc2VuZCB8fAotCQkJCQkJIXNldHRpbWVyKSB7CisJCQkJICAgICFzZXR0aW1lcikgewogCQkJCQluZXh0dGltZW91dCA9IHJlY3ZfZW50cnktPnRpbWV0b3NlbmQ7CiAJCQkJCXNldHRpbWVyID0gMTsKIAkJCQl9Ci0JCQl9IGVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJaGFuZGxlX3JlY3ZfZW50cnkoY21fbm9kZSwgMSk7CisJCQl9CiAJCX0KIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21fbm9kZS0+cmV0cmFuc19saXN0X2xvY2ssIGZsYWdzKTsKQEAgLTYxNyw4ICs4NDQsOCBAQAogCQkJaWYgKHRpbWVfYWZ0ZXIoc2VuZF9lbnRyeS0+dGltZXRvc2VuZCwgamlmZmllcykpIHsKIAkJCQlpZiAoY21fbm9kZS0+c3RhdGUgIT0gTkVTX0NNX1NUQVRFX1RTQSkgewogCQkJCQlpZiAoKG5leHR0aW1lb3V0ID4KLQkJCQkJCXNlbmRfZW50cnktPnRpbWV0b3NlbmQpIHx8Ci0JCQkJCQkhc2V0dGltZXIpIHsKKwkJCQkJICAgICBzZW5kX2VudHJ5LT50aW1ldG9zZW5kKSB8fAorCQkJCQkgICAgIXNldHRpbWVyKSB7CiAJCQkJCQluZXh0dGltZW91dCA9CiAJCQkJCQkJc2VuZF9lbnRyeS0+dGltZXRvc2VuZDsKIAkJCQkJCXNldHRpbWVyID0gMTsKQEAgLTYzMCwxMyArODU3LDEzIEBACiAJCQl9CiAKIAkJCWlmICgoY21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX1RTQSkgfHwKLQkJCQkoY21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX0NMT1NFRCkpIHsKKwkJCSAgICAoY21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX0NMT1NFRCkpIHsKIAkJCQlmcmVlX3JldHJhbnNfZW50cnkoY21fbm9kZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCWlmICghc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50IHx8Ci0JCQkJIXNlbmRfZW50cnktPnJldHJ5Y291bnQpIHsKKwkJCSAgICAhc2VuZF9lbnRyeS0+cmV0cnljb3VudCkgewogCQkJCWNtX3BhY2tldHNfZHJvcHBlZCsrOwogCQkJCWZyZWVfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKIApAQCAtNjQ1LDI4ICs4NzIsMjggQEAKIAkJCQluZXNfcmV0cmFuc19leHBpcmVkKGNtX25vZGUpOwogCQkJCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX0NMT1NFRDsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21fbm9kZS0+cmV0cmFuc19saXN0X2xvY2ssCi0JCQkJCWZsYWdzKTsKKwkJCQkJCSAgZmxhZ3MpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYXRvbWljX2luYygmc2VuZF9lbnRyeS0+c2tiLT51c2Vycyk7CiAJCQljbV9wYWNrZXRzX3JldHJhbnMrKzsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUmV0cmFuc21pdHRpbmcgc2VuZF9lbnRyeSAlcCAiCi0JCQkJImZvciBub2RlICVwLCBqaWZmaWVzID0gJWx1LCB0aW1lIHRvIHNlbmQgPSAiCi0JCQkJIiVsdSwgcmV0cmFuc2NvdW50ID0gJXUsIHNlbmRfZW50cnktPnNlcV9udW0gPSAiCi0JCQkJIjB4JTA4WCwgY21fbm9kZS0+dGNwX2NudHh0LnJlbV9hY2tfbnVtID0gIgotCQkJCSIweCUwOFhcbiIsIHNlbmRfZW50cnksIGNtX25vZGUsIGppZmZpZXMsCi0JCQkJc2VuZF9lbnRyeS0+dGltZXRvc2VuZCwKLQkJCQlzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQsCi0JCQkJc2VuZF9lbnRyeS0+c2VxX251bSwKLQkJCQljbV9ub2RlLT50Y3BfY250eHQucmVtX2Fja19udW0pOworCQkJCSAgImZvciBub2RlICVwLCBqaWZmaWVzID0gJWx1LCB0aW1lIHRvIHNlbmQgPSAiCisJCQkJICAiJWx1LCByZXRyYW5zY291bnQgPSAldSwgc2VuZF9lbnRyeS0+c2VxX251bSA9ICIKKwkJCQkgICIweCUwOFgsIGNtX25vZGUtPnRjcF9jbnR4dC5yZW1fYWNrX251bSA9ICIKKwkJCQkgICIweCUwOFhcbiIsIHNlbmRfZW50cnksIGNtX25vZGUsIGppZmZpZXMsCisJCQkJICBzZW5kX2VudHJ5LT50aW1ldG9zZW5kLAorCQkJCSAgc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50LAorCQkJCSAgc2VuZF9lbnRyeS0+c2VxX251bSwKKwkJCQkgIGNtX25vZGUtPnRjcF9jbnR4dC5yZW1fYWNrX251bSk7CiAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtX25vZGUtPnJldHJhbnNfbGlzdF9sb2NrLAotCQkJCWZsYWdzKTsKKwkJCQkJICAgICAgIGZsYWdzKTsKIAkJCXJldCA9IG5lc19uaWNfY21feG1pdChzZW5kX2VudHJ5LT5za2IsIGNtX25vZGUtPm5ldGRldik7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21fbm9kZS0+cmV0cmFuc19saXN0X2xvY2ssIGZsYWdzKTsKIAkJCWlmIChyZXQgIT0gTkVUREVWX1RYX09LKSB7CiAJCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJyZXhtaXQgZmFpbGVkIGZvciAiCi0JCQkJCSJub2RlPSVwXG4iLCBjbV9ub2RlKTsKKwkJCQkJICAibm9kZT0lcFxuIiwgY21fbm9kZSk7CiAJCQkJY21fcGFja2V0c19ib3VuY2VkKys7CiAJCQkJc2VuZF9lbnRyeS0+cmV0cnljb3VudC0tOwogCQkJCW5leHR0aW1lb3V0ID0gamlmZmllcyArIE5FU19TSE9SVF9USU1FOwpAQCAtNjc2LDE4ICs5MDMsMTggQEAKIAkJCQljbV9wYWNrZXRzX3NlbnQrKzsKIAkJCX0KIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUGFja2V0IFNlbnQ6IHJldHJhbnMgY291bnQgPSAiCi0JCQkJIiV1LCByZXRyeSBjb3VudCA9ICV1LlxuIiwKLQkJCQlzZW5kX2VudHJ5LT5yZXRyYW5zY291bnQsCi0JCQkJc2VuZF9lbnRyeS0+cmV0cnljb3VudCk7CisJCQkJICAiJXUsIHJldHJ5IGNvdW50ID0gJXUuXG4iLAorCQkJCSAgc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50LAorCQkJCSAgc2VuZF9lbnRyeS0+cmV0cnljb3VudCk7CiAJCQlpZiAoc2VuZF9lbnRyeS0+c2VuZF9yZXRyYW5zKSB7CiAJCQkJc2VuZF9lbnRyeS0+cmV0cmFuc2NvdW50LS07CiAJCQkJdGltZXRvc2VuZCA9IChORVNfUkVUUllfVElNRU9VVCA8PAotCQkJCQkoTkVTX0RFRkFVTFRfUkVUUkFOUyAtIHNlbmRfZW50cnktPnJldHJhbnNjb3VudCkpOworCQkJCQkgICAgICAoTkVTX0RFRkFVTFRfUkVUUkFOUyAtIHNlbmRfZW50cnktPnJldHJhbnNjb3VudCkpOwogCiAJCQkJc2VuZF9lbnRyeS0+dGltZXRvc2VuZCA9IGppZmZpZXMgKwotCQkJCQltaW4odGltZXRvc2VuZCwgTkVTX01BWF9USU1FT1VUKTsKKwkJCQkJCQkgbWluKHRpbWV0b3NlbmQsIE5FU19NQVhfVElNRU9VVCk7CiAJCQkJaWYgKG5leHR0aW1lb3V0ID4gc2VuZF9lbnRyeS0+dGltZXRvc2VuZCB8fAotCQkJCQkhc2V0dGltZXIpIHsKKwkJCQkgICAgIXNldHRpbWVyKSB7CiAJCQkJCW5leHR0aW1lb3V0ID0gc2VuZF9lbnRyeS0+dGltZXRvc2VuZDsKIAkJCQkJc2V0dGltZXIgPSAxOwogCQkJCX0KQEAgLTY5NiwxMSArOTIzLDExIEBACiAJCQkJY2xvc2Vfd2hlbl9jb21wbGV0ZSA9CiAJCQkJCXNlbmRfZW50cnktPmNsb3NlX3doZW5fY29tcGxldGU7CiAJCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJjbV9ub2RlPSVwIHN0YXRlPSVkXG4iLAotCQkJCQljbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSk7CisJCQkJCSAgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUpOwogCQkJCWZyZWVfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKIAkJCQlpZiAoY2xvc2Vfd2hlbl9jb21wbGV0ZSkKIAkJCQkJcmVtX3JlZl9jbV9ub2RlKGNtX25vZGUtPmNtX2NvcmUsCi0JCQkJCQljbV9ub2RlKTsKKwkJCQkJCQljbV9ub2RlKTsKIAkJCX0KIAkJfSB3aGlsZSAoMCk7CiAKQEAgLTcxMCw3ICs5MzcsNyBAQAogCiAJaWYgKHNldHRpbWVyKSB7CiAJCWlmICghdGltZXJfcGVuZGluZygmY21fY29yZS0+dGNwX3RpbWVyKSkgewotCQkJY21fY29yZS0+dGNwX3RpbWVyLmV4cGlyZXMgID0gbmV4dHRpbWVvdXQ7CisJCQljbV9jb3JlLT50Y3BfdGltZXIuZXhwaXJlcyA9IG5leHR0aW1lb3V0OwogCQkJYWRkX3RpbWVyKCZjbV9jb3JlLT50Y3BfdGltZXIpOwogCQl9CiAJfQpAQCAtNzIxLDEzICs5NDgsMTMgQEAKICAqIHNlbmRfc3luCiAgKi8KIHN0YXRpYyBpbnQgc2VuZF9zeW4oc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCB1MzIgc2VuZGFjaywKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgcmV0OwogCWludCBmbGFncyA9IFNFVF9TWU47CiAJY2hhciBvcHRpb25zYnVmZmVyW3NpemVvZihzdHJ1Y3Qgb3B0aW9uX21zcykgKwotCQlzaXplb2Yoc3RydWN0IG9wdGlvbl93aW5kb3dzY2FsZSkgKyBzaXplb2Yoc3RydWN0IG9wdGlvbl9iYXNlKSArCi0JCVRDUF9PUFRJT05TX1BBRERJTkddOworCQkJICAgc2l6ZW9mKHN0cnVjdCBvcHRpb25fd2luZG93c2NhbGUpICsgc2l6ZW9mKHN0cnVjdCBvcHRpb25fYmFzZSkgKworCQkJICAgVENQX09QVElPTlNfUEFERElOR107CiAKIAlpbnQgb3B0aW9uc3NpemUgPSAwOwogCS8qIFNlbmRpbmcgTVNTIG9wdGlvbiAqLwpAQCAtODU0LDcgKzEwODEsNyBAQAogICogZmluZF9ub2RlIC0gZmluZCBhIGNtIG5vZGUgdGhhdCBtYXRjaGVzIHRoZSByZWZlcmVuY2UgY20gbm9kZQogICovCiBzdGF0aWMgc3RydWN0IG5lc19jbV9ub2RlICpmaW5kX25vZGUoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCQl1MTYgcmVtX3BvcnQsIG5lc19hZGRyX3QgcmVtX2FkZHIsIHUxNiBsb2NfcG9ydCwgbmVzX2FkZHJfdCBsb2NfYWRkcikKKwkJCQkgICAgIHUxNiByZW1fcG9ydCwgbmVzX2FkZHJfdCByZW1fYWRkciwgdTE2IGxvY19wb3J0LCBuZXNfYWRkcl90IGxvY19hZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqaHRlOwpAQCAtODY4LDEyICsxMDk1LDEyIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbV9ub2RlLCBodGUsIGxpc3QpIHsKIAkJLyogY29tcGFyZSBxdWFkLCByZXR1cm4gbm9kZSBoYW5kbGUgaWYgYSBtYXRjaCAqLwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImZpbmRpbmcgbm9kZSAleDoleCA9PyAleDoleCBeICV4OiV4ID0/ICV4OiV4XG4iLAotCQkJCWNtX25vZGUtPmxvY19hZGRyLCBjbV9ub2RlLT5sb2NfcG9ydCwKLQkJCQlsb2NfYWRkciwgbG9jX3BvcnQsCi0JCQkJY21fbm9kZS0+cmVtX2FkZHIsIGNtX25vZGUtPnJlbV9wb3J0LAotCQkJCXJlbV9hZGRyLCByZW1fcG9ydCk7CisJCQkgIGNtX25vZGUtPmxvY19hZGRyLCBjbV9ub2RlLT5sb2NfcG9ydCwKKwkJCSAgbG9jX2FkZHIsIGxvY19wb3J0LAorCQkJICBjbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsCisJCQkgIHJlbV9hZGRyLCByZW1fcG9ydCk7CiAJCWlmICgoY21fbm9kZS0+bG9jX2FkZHIgPT0gbG9jX2FkZHIpICYmIChjbV9ub2RlLT5sb2NfcG9ydCA9PSBsb2NfcG9ydCkgJiYKLQkJCQkoY21fbm9kZS0+cmVtX2FkZHIgPT0gcmVtX2FkZHIpICYmIChjbV9ub2RlLT5yZW1fcG9ydCA9PSByZW1fcG9ydCkpIHsKKwkJICAgIChjbV9ub2RlLT5yZW1fYWRkciA9PSByZW1fYWRkcikgJiYgKGNtX25vZGUtPnJlbV9wb3J0ID09IHJlbV9wb3J0KSkgewogCQkJYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fY29yZS0+aHRfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIGNtX25vZGU7CkBAIC04OTAsNyArMTExNyw3IEBACiAgKiBmaW5kX2xpc3RlbmVyIC0gZmluZCBhIGNtIG5vZGUgbGlzdGVuaW5nIG9uIHRoaXMgYWRkci1wb3J0IHBhaXIKICAqLwogc3RhdGljIHN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmZpbmRfbGlzdGVuZXIoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCQluZXNfYWRkcl90IGRzdF9hZGRyLCB1MTYgZHN0X3BvcnQsIGVudW0gbmVzX2NtX2xpc3RlbmVyX3N0YXRlIGxpc3RlbmVyX3N0YXRlKQorCQkJCQkgICAgIG5lc19hZGRyX3QgZHN0X2FkZHIsIHUxNiBkc3RfcG9ydCwgZW51bSBuZXNfY21fbGlzdGVuZXJfc3RhdGUgbGlzdGVuZXJfc3RhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5fbm9kZTsKQEAgLTkwMCw5ICsxMTI3LDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpc3Rlbl9ub2RlLCAmY21fY29yZS0+bGlzdGVuX2xpc3QubGlzdCwgbGlzdCkgewogCQkvKiBjb21wYXJlIG5vZGUgcGFpciwgcmV0dXJuIG5vZGUgaGFuZGxlIGlmIGEgbWF0Y2ggKi8KIAkJaWYgKCgobGlzdGVuX25vZGUtPmxvY19hZGRyID09IGRzdF9hZGRyKSB8fAotCQkJCWxpc3Rlbl9ub2RlLT5sb2NfYWRkciA9PSAweDAwMDAwMDAwKSAmJgotCQkJCShsaXN0ZW5fbm9kZS0+bG9jX3BvcnQgPT0gZHN0X3BvcnQpICYmCi0JCQkJKGxpc3RlbmVyX3N0YXRlICYgbGlzdGVuX25vZGUtPmxpc3RlbmVyX3N0YXRlKSkgeworCQkgICAgIGxpc3Rlbl9ub2RlLT5sb2NfYWRkciA9PSAweDAwMDAwMDAwKSAmJgorCQkgICAgKGxpc3Rlbl9ub2RlLT5sb2NfcG9ydCA9PSBkc3RfcG9ydCkgJiYKKwkJICAgIChsaXN0ZW5lcl9zdGF0ZSAmIGxpc3Rlbl9ub2RlLT5saXN0ZW5lcl9zdGF0ZSkpIHsKIAkJCWF0b21pY19pbmMoJmxpc3Rlbl9ub2RlLT5yZWZfY291bnQpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fY29yZS0+bGlzdGVuX2xpc3RfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIGxpc3Rlbl9ub2RlOwpAQCAtOTI3LDcgKzExNTQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQWRkaW5nIE5vZGUgJXAgdG8gQWN0aXZlIENvbm5lY3Rpb24gSFRcbiIsCi0JCWNtX25vZGUpOworCQkgIGNtX25vZGUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNtX2NvcmUtPmh0X2xvY2ssIGZsYWdzKTsKIApAQCAtOTQ2LDcgKzExNzMsNyBAQAogICogbWluaV9jbV9kZWNfcmVmY250X2xpc3RlbgogICovCiBzdGF0aWMgaW50IG1pbmlfY21fZGVjX3JlZmNudF9saXN0ZW4oc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCXN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3RlbmVyLCBpbnQgZnJlZV9oYW5naW5nX25vZGVzKQorCQkJCSAgICAgc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXIsIGludCBmcmVlX2hhbmdpbmdfbm9kZXMpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJaW50IGVyciA9IDA7CkBAIC05NTcsOCArMTE4NCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCByZXNldF9saXN0OwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJhdHRlbXB0aW5nIGxpc3RlbmVyPSAlcCBmcmVlX25vZGVzPSAlZCwgIgotCQkicmVmY250PSVkXG4iLCBsaXN0ZW5lciwgZnJlZV9oYW5naW5nX25vZGVzLAotCQlhdG9taWNfcmVhZCgmbGlzdGVuZXItPnJlZl9jb3VudCkpOworCQkgICJyZWZjbnQ9JWRcbiIsIGxpc3RlbmVyLCBmcmVlX2hhbmdpbmdfbm9kZXMsCisJCSAgYXRvbWljX3JlYWQoJmxpc3RlbmVyLT5yZWZfY291bnQpKTsKIAkvKiBmcmVlIG5vbi1hY2NlbGVyYXRlZCBjaGlsZCBub2RlcyBmb3IgdGhpcyBsaXN0ZW5lciAqLwogCUlOSVRfTElTVF9IRUFEKCZyZXNldF9saXN0KTsKIAlpZiAoZnJlZV9oYW5naW5nX25vZGVzKSB7CkBAIC05NjYsNyArMTE5Myw3IEBACiAJCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF90ZW1wLAogCQkJCSAgICZnX2NtX2NvcmUtPmNvbm5lY3RlZF9ub2RlcykgewogCQkJY21fbm9kZSA9IGNvbnRhaW5lcl9vZihsaXN0X3Bvcywgc3RydWN0IG5lc19jbV9ub2RlLAotCQkJCWxpc3QpOworCQkJCQkgICAgICAgbGlzdCk7CiAJCQlpZiAoKGNtX25vZGUtPmxpc3RlbmVyID09IGxpc3RlbmVyKSAmJgogCQkJICAgICghY21fbm9kZS0+YWNjZWxlcmF0ZWQpKSB7CiAJCQkJYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwpAQCAtOTc4LDcgKzEyMDUsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3RlbXAsICZyZXNldF9saXN0KSB7CiAJCWNtX25vZGUgPSBjb250YWluZXJfb2YobGlzdF9wb3MsIHN0cnVjdCBuZXNfY21fbm9kZSwKLQkJCQlyZXNldF9lbnRyeSk7CisJCQkJICAgICAgIHJlc2V0X2VudHJ5KTsKIAkJewogCQkJc3RydWN0IG5lc19jbV9ub2RlICpsb29wYmFjayA9IGNtX25vZGUtPmxvb3BiYWNrcGFydG5lcjsKIAkJCWVudW0gbmVzX2NtX25vZGVfc3RhdGUgb2xkX3N0YXRlOwpAQCAtOTkwLDcgKzEyMTcsNyBAQAogCQkJCQllcnIgPSBzZW5kX3Jlc2V0KGNtX25vZGUsIE5VTEwpOwogCQkJCQlpZiAoZXJyKSB7CiAJCQkJCQljbV9ub2RlLT5zdGF0ZSA9Ci0JCQkJCQkJIE5FU19DTV9TVEFURV9DTE9TRUQ7CisJCQkJCQkJTkVTX0NNX1NUQVRFX0NMT1NFRDsKIAkJCQkJCVdBUk5fT04oMSk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlvbGRfc3RhdGUgPSBjbV9ub2RlLT5zdGF0ZTsKQEAgLTEwMzUsMTAgKzEyNjIsOSBAQAogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtX2NvcmUtPmxpc3Rlbl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCQlpZiAobGlzdGVuZXItPm5lc3ZuaWMpIHsKKwkJaWYgKGxpc3RlbmVyLT5uZXN2bmljKQogCQkJbmVzX21hbmFnZV9hcGJ2dChsaXN0ZW5lci0+bmVzdm5pYywgbGlzdGVuZXItPmxvY19wb3J0LAotCQkJCQlQQ0lfRlVOQyhsaXN0ZW5lci0+bmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSwgTkVTX01BTkFHRV9BUEJWVF9ERUwpOwotCQl9CisJCQkJCSBQQ0lfRlVOQyhsaXN0ZW5lci0+bmVzdm5pYy0+bmVzZGV2LT5wY2lkZXYtPmRldmZuKSwgTkVTX01BTkFHRV9BUEJWVF9ERUwpOwogCiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZGVzdHJveWluZyBsaXN0ZW5lciAoJXApXG4iLCBsaXN0ZW5lcik7CiAKQEAgLTEwNTIsOCArMTI3OCw4IEBACiAJaWYgKGxpc3RlbmVyKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmbGlzdGVuZXItPnBlbmRfYWNjZXB0c19jbnQpID4gMCkKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZGVzdHJveWluZyBsaXN0ZW5lciAoJXApIgotCQkJCQkiIHdpdGggbm9uLXplcm8gcGVuZGluZyBhY2NlcHRzPSV1XG4iLAotCQkJCQlsaXN0ZW5lciwgYXRvbWljX3JlYWQoJmxpc3RlbmVyLT5wZW5kX2FjY2VwdHNfY250KSk7CisJCQkJICAiIHdpdGggbm9uLXplcm8gcGVuZGluZyBhY2NlcHRzPSV1XG4iLAorCQkJCSAgbGlzdGVuZXIsIGF0b21pY19yZWFkKCZsaXN0ZW5lci0+cGVuZF9hY2NlcHRzX2NudCkpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xMDY0LDcgKzEyOTAsNyBAQAogICogbWluaV9jbV9kZWxfbGlzdGVuCiAgKi8KIHN0YXRpYyBpbnQgbWluaV9jbV9kZWxfbGlzdGVuKHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQkJc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXIpCisJCQkgICAgICBzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lcikKIHsKIAlsaXN0ZW5lci0+bGlzdGVuZXJfc3RhdGUgPSBORVNfQ01fTElTVEVORVJfUEFTU0lWRV9TVEFURTsKIAlsaXN0ZW5lci0+Y21faWQgPSBOVUxMOyAvKiBnb2luZyB0byBiZSBkZXN0cm95ZWQgcHJldHR5IHNvb24gKi8KQEAgLTEwNzYsOSArMTMwMiwxMCBAQAogICogbWluaV9jbV9hY2NlbGVyYXRlZAogICovCiBzdGF0aWMgaW5saW5lIGludCBtaW5pX2NtX2FjY2VsZXJhdGVkKHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQkJc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQorCQkJCSAgICAgIHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKIHsKIAl1MzIgd2FzX3RpbWVyX3NldDsKKwogCWNtX25vZGUtPmFjY2VsZXJhdGVkID0gMTsKIAogCWlmIChjbV9ub2RlLT5hY2NlcHRfcGVuZCkgewpAQCAtMTExMiw3ICsxMzM5LDcgQEAKIAlydCA9IGlwX3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIGh0b25sKGRzdF9pcCksIDAsIDAsIDApOwogCWlmIChJU19FUlIocnQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlwX3JvdXRlX291dHB1dF9rZXkgZmFpbGVkIGZvciAweCUwOFhcbiIsCi0JCQkJX19mdW5jX18sIGRzdF9pcCk7CisJCSAgICAgICBfX2Z1bmNfXywgZHN0X2lwKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTEzMCw3ICsxMzU3LDcgQEAKIAogCQkJaWYgKGFycGluZGV4ID49IDApIHsKIAkJCQlpZiAoIW1lbWNtcChuZXNhZGFwdGVyLT5hcnBfdGFibGVbYXJwaW5kZXhdLm1hY19hZGRyLAotCQkJCQkJCW5laWdoLT5oYSwgRVRIX0FMRU4pKXsKKwkJCQkJICAgIG5laWdoLT5oYSwgRVRIX0FMRU4pKSB7CiAJCQkJCS8qIE1hYyBhZGRyZXNzIHNhbWUgYXMgaW4gbmVzX2FycF90YWJsZSAqLwogCQkJCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKIAkJCQkJaXBfcnRfcHV0KHJ0KTsKQEAgLTExMzgsOCArMTM2NSw4IEBACiAJCQkJfQogCiAJCQkJbmVzX21hbmFnZV9hcnBfY2FjaGUobmVzdm5pYy0+bmV0ZGV2LAotCQkJCQkJbmVzYWRhcHRlci0+YXJwX3RhYmxlW2FycGluZGV4XS5tYWNfYWRkciwKLQkJCQkJCWRzdF9pcCwgTkVTX0FSUF9ERUxFVEUpOworCQkJCQkJICAgICBuZXNhZGFwdGVyLT5hcnBfdGFibGVbYXJwaW5kZXhdLm1hY19hZGRyLAorCQkJCQkJICAgICBkc3RfaXAsIE5FU19BUlBfREVMRVRFKTsKIAkJCX0KIAogCQkJbmVzX21hbmFnZV9hcnBfY2FjaGUobmVzdm5pYy0+bmV0ZGV2LCBuZWlnaC0+aGEsCkBAIC0xMTYxLDggKzEzODgsOCBAQAogICogbWFrZV9jbV9ub2RlIC0gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgY20gbm9kZQogICovCiBzdGF0aWMgc3RydWN0IG5lc19jbV9ub2RlICptYWtlX2NtX25vZGUoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCQlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfY21faW5mbyAqY21faW5mbywKLQkJc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXIpCisJCQkJCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19jbV9pbmZvICpjbV9pbmZvLAorCQkJCQlzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICpsaXN0ZW5lcikKIHsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGU7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwpAQCAtMTE4MSw3ICsxNDA4LDEyIEBACiAJY21fbm9kZS0+cmVtX2FkZHIgPSBjbV9pbmZvLT5yZW1fYWRkcjsKIAljbV9ub2RlLT5sb2NfcG9ydCA9IGNtX2luZm8tPmxvY19wb3J0OwogCWNtX25vZGUtPnJlbV9wb3J0ID0gY21faW5mby0+cmVtX3BvcnQ7Ci0JY21fbm9kZS0+c2VuZF93cml0ZTAgPSBzZW5kX2ZpcnN0OworCisJY21fbm9kZS0+bXBhX2ZyYW1lX3JldiA9IG1wYV92ZXJzaW9uOworCWNtX25vZGUtPnNlbmRfcmRtYTBfb3AgPSBTRU5EX1JETUFfUkVBRF9aRVJPOworCWNtX25vZGUtPmlyZF9zaXplID0gSUVURl9OT19JUkRfT1JEOworCWNtX25vZGUtPm9yZF9zaXplID0gSUVURl9OT19JUkRfT1JEOworCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJNYWtlIG5vZGUgYWRkcmVzc2VzIDogbG9jID0gJXBJNDoleCwgcmVtID0gJXBJNDoleFxuIiwKIAkJICAmY21fbm9kZS0+bG9jX2FkZHIsIGNtX25vZGUtPmxvY19wb3J0LAogCQkgICZjbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQpOwpAQCAtMTE5MSw3ICsxNDIzLDcgQEAKIAltZW1jcHkoY21fbm9kZS0+bG9jX21hYywgbmVzdm5pYy0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJsaXN0ZW5lcj0lcCwgY21faWQ9JXBcbiIsIGNtX25vZGUtPmxpc3RlbmVyLAotCQkJY21fbm9kZS0+Y21faWQpOworCQkgIGNtX25vZGUtPmNtX2lkKTsKIAogCXNwaW5fbG9ja19pbml0KCZjbV9ub2RlLT5yZXRyYW5zX2xpc3RfbG9jayk7CiAKQEAgLTEyMDIsMTEgKzE0MzQsMTEgQEAKIAljbV9ub2RlLT50Y3BfY250eHQubG9jX2lkID0gTkVTX0NNX0RFRl9MT0NBTF9JRDsKIAljbV9ub2RlLT50Y3BfY250eHQucmN2X3dzY2FsZSA9IE5FU19DTV9ERUZBVUxUX1JDVl9XTkRfU0NBTEU7CiAJY21fbm9kZS0+dGNwX2NudHh0LnJjdl93bmQgPSBORVNfQ01fREVGQVVMVF9SQ1ZfV05EX1NDQUxFRCA+PgotCQkJTkVTX0NNX0RFRkFVTFRfUkNWX1dORF9TQ0FMRTsKKwkJCQkgICAgIE5FU19DTV9ERUZBVUxUX1JDVl9XTkRfU0NBTEU7CiAJdHMgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAJY21fbm9kZS0+dGNwX2NudHh0LmxvY19zZXFfbnVtID0gaHRvbmwodHMudHZfbnNlYyk7CiAJY21fbm9kZS0+dGNwX2NudHh0Lm1zcyA9IG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgLQotCQkJc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIC0gRVRIX0hMRU4gLSBWTEFOX0hMRU47CisJCQkJIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSAtIEVUSF9ITEVOIC0gVkxBTl9ITEVOOwogCWNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0ID0gMDsKIAkvKiBnZXQgYSB1bmlxdWUgc2Vzc2lvbiBJRCAsIGFkZCB0aHJlYWRfaWQgdG8gYW4gdXBjb3VudGVyIHRvIGhhbmRsZSByYWNlICovCiAJYXRvbWljX2luYygmY21fY29yZS0+bm9kZV9jbnQpOwpAQCAtMTIyMiwxMiArMTQ1NCwxMSBAQAogCWNtX25vZGUtPmxvb3BiYWNrcGFydG5lciA9IE5VTEw7CiAKIAkvKiBnZXQgdGhlIG1hYyBhZGRyIGZvciB0aGUgcmVtb3RlIG5vZGUgKi8KLQlpZiAoaXB2NF9pc19sb29wYmFjayhodG9ubChjbV9ub2RlLT5yZW1fYWRkcikpKQorCWlmIChpcHY0X2lzX2xvb3BiYWNrKGh0b25sKGNtX25vZGUtPnJlbV9hZGRyKSkpIHsKIAkJYXJwaW5kZXggPSBuZXNfYXJwX3RhYmxlKG5lc2RldiwgbnRvaGwobmVzdm5pYy0+bG9jYWxfaXBhZGRyKSwgTlVMTCwgTkVTX0FSUF9SRVNPTFZFKTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlvbGRhcnBpbmRleCA9IG5lc19hcnBfdGFibGUobmVzZGV2LCBjbV9ub2RlLT5yZW1fYWRkciwgTlVMTCwgTkVTX0FSUF9SRVNPTFZFKTsKIAkJYXJwaW5kZXggPSBuZXNfYWRkcl9yZXNvbHZlX25laWdoKG5lc3ZuaWMsIGNtX2luZm8tPnJlbV9hZGRyLCBvbGRhcnBpbmRleCk7Ci0KIAl9CiAJaWYgKGFycGluZGV4IDwgMCkgewogCQlrZnJlZShjbV9ub2RlKTsKQEAgLTEyNjAsNyArMTQ5MSw3IEBACiAgKiByZW1fcmVmX2NtX25vZGUgLSBkZXN0cm95IGFuIGluc3RhbmNlIG9mIGEgY20gbm9kZQogICovCiBzdGF0aWMgaW50IHJlbV9yZWZfY21fbm9kZShzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0Jc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQorCQkJICAgc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5lc19xcCAqbmVzcXA7CkBAIC0xMjkxLDkgKzE1MjIsOSBAQAogCX0gZWxzZSB7CiAJCWlmIChjbV9ub2RlLT5hcGJ2dF9zZXQgJiYgY21fbm9kZS0+bmVzdm5pYykgewogCQkJbmVzX21hbmFnZV9hcGJ2dChjbV9ub2RlLT5uZXN2bmljLCBjbV9ub2RlLT5sb2NfcG9ydCwKLQkJCQlQQ0lfRlVOQygKLQkJCQljbV9ub2RlLT5uZXN2bmljLT5uZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLAotCQkJCU5FU19NQU5BR0VfQVBCVlRfREVMKTsKKwkJCQkJIFBDSV9GVU5DKAorCQkJCQkJIGNtX25vZGUtPm5lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LT5kZXZmbiksCisJCQkJCSBORVNfTUFOQUdFX0FQQlZUX0RFTCk7CiAJCX0KIAl9CiAKQEAgLTEzMTQsNyArMTU0NSw3IEBACiAgKiBwcm9jZXNzX29wdGlvbnMKICAqLwogc3RhdGljIGludCBwcm9jZXNzX29wdGlvbnMoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCB1OCAqb3B0aW9uc2xvYywKLQl1MzIgb3B0aW9uc2l6ZSwgdTMyIHN5bl9wYWNrZXQpCisJCQkgICB1MzIgb3B0aW9uc2l6ZSwgdTMyIHN5bl9wYWNrZXQpCiB7CiAJdTMyIHRtcDsKIAl1MzIgb2Zmc2V0ID0gMDsKQEAgLTEzMzIsMTUgKzE1NjMsMTUgQEAKIAkJCWNvbnRpbnVlOwogCQljYXNlIE9QVElPTl9OVU1CRVJfTVNTOgogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlczogTVNTIExlbmd0aDogJWQgT2Zmc2V0OiAlZCAiCi0JCQkJIlNpemU6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlhbGxfb3B0aW9ucy0+YXNfbXNzLmxlbmd0aCwgb2Zmc2V0LCBvcHRpb25zaXplKTsKKwkJCQkgICJTaXplOiAlZFxuIiwgX19mdW5jX18sCisJCQkJICBhbGxfb3B0aW9ucy0+YXNfbXNzLmxlbmd0aCwgb2Zmc2V0LCBvcHRpb25zaXplKTsKIAkJCWdvdF9tc3Nfb3B0aW9uID0gMTsKIAkJCWlmIChhbGxfb3B0aW9ucy0+YXNfbXNzLmxlbmd0aCAhPSA0KSB7CiAJCQkJcmV0dXJuIDE7CiAJCQl9IGVsc2UgewogCQkJCXRtcCA9IG50b2hzKGFsbF9vcHRpb25zLT5hc19tc3MubXNzKTsKIAkJCQlpZiAodG1wID4gMCAmJiB0bXAgPAotCQkJCQljbV9ub2RlLT50Y3BfY250eHQubXNzKQorCQkJCSAgICBjbV9ub2RlLT50Y3BfY250eHQubXNzKQogCQkJCQljbV9ub2RlLT50Y3BfY250eHQubXNzID0gdG1wOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMzQ4LDEyICsxNTc5LDkgQEAKIAkJCWNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd3NjYWxlID0KIAkJCQlhbGxfb3B0aW9ucy0+YXNfd2luZG93c2NhbGUuc2hpZnRjb3VudDsKIAkJCWJyZWFrOwotCQljYXNlIE9QVElPTl9OVU1CRVJfV1JJVEUwOgotCQkJY21fbm9kZS0+c2VuZF93cml0ZTAgPSAxOwotCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlRDUCBPcHRpb24gbm90IHVuZGVyc3Rvb2Q6ICV4XG4iLAotCQkJCWFsbF9vcHRpb25zLT5hc19iYXNlLm9wdGlvbm51bSk7CisJCQkJICBhbGxfb3B0aW9ucy0+YXNfYmFzZS5vcHRpb25udW0pOwogCQkJYnJlYWs7CiAJCX0KIAkJb2Zmc2V0ICs9IGFsbF9vcHRpb25zLT5hc19iYXNlLmxlbmd0aDsKQEAgLTEzNzIsOCArMTYwMCw4IEBACiBzdGF0aWMgdm9pZCBoYW5kbGVfZmluX3BrdChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCiB7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJSZWNlaXZlZCBGSU4sIGNtX25vZGUgPSAlcCwgc3RhdGUgPSAldS4gIgotCQkicmVmY250PSVkXG4iLCBjbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSwKLQkJYXRvbWljX3JlYWQoJmNtX25vZGUtPnJlZl9jb3VudCkpOworCQkgICJyZWZjbnQ9JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlLAorCQkgIGF0b21pY19yZWFkKCZjbV9ub2RlLT5yZWZfY291bnQpKTsKIAlzd2l0Y2ggKGNtX25vZGUtPnN0YXRlKSB7CiAJY2FzZSBORVNfQ01fU1RBVEVfU1lOX1JDVkQ6CiAJY2FzZSBORVNfQ01fU1RBVEVfU1lOX1NFTlQ6CkBAIC0xNDM5LDcgKzE2NjcsMjAgQEAKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlc1sldV0gY3JlYXRlIGFib3J0IGZvciBjbV9ub2RlPSVwICIKIAkJCSJsaXN0ZW5lcj0lcCBzdGF0ZT0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjbV9ub2RlLAogCQkJY21fbm9kZS0+bGlzdGVuZXIsIGNtX25vZGUtPnN0YXRlKTsKLQkJYWN0aXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgcmVzZXQpOworCQlzd2l0Y2ggKGNtX25vZGUtPm1wYV9mcmFtZV9yZXYpIHsKKwkJY2FzZSBJRVRGX01QQV9WMjoKKwkJCWNtX25vZGUtPm1wYV9mcmFtZV9yZXYgPSBJRVRGX01QQV9WMTsKKwkJCS8qIHNlbmQgYSBzeW4gYW5kIGdvdG8gc3luIHNlbnQgc3RhdGUgKi8KKwkJCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX1NZTl9TRU5UOworCQkJaWYgKHNlbmRfc3luKGNtX25vZGUsIDAsIE5VTEwpKSB7CisJCQkJYWN0aXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgcmVzZXQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUVURl9NUEFfVjE6CisJCWRlZmF1bHQ6CisJCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCByZXNldCk7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIE5FU19DTV9TVEFURV9NUEFSRVFfUkNWRDoKIAkJYXRvbWljX2luYygmY21fbm9kZS0+cGFzc2l2ZV9zdGF0ZSk7CkBAIC0xNDc1LDIxICsxNzE2LDIxIEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9yY3ZfbXBhKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQotCWludAlyZXQgPSAwOworCWludCByZXQgPSAwOwogCWludCBkYXRhc2l6ZSA9IHNrYi0+bGVuOwogCXU4ICpkYXRhbG9jID0gc2tiLT5kYXRhOwogCiAJZW51bSBuZXNfY21fZXZlbnRfdHlwZSB0eXBlID0gTkVTX0NNX0VWRU5UX1VOS05PV047Ci0JdTMyICAgICByZXNfdHlwZTsKKwl1MzIgcmVzX3R5cGU7CisKIAlyZXQgPSBwYXJzZV9tcGEoY21fbm9kZSwgZGF0YWxvYywgJnJlc190eXBlLCBkYXRhc2l6ZSk7CiAJaWYgKHJldCkgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImRpZG4ndCBsaWtlIE1QQSBSZXF1ZXN0XG4iKTsKIAkJaWYgKGNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9NUEFSRVFfU0VOVCkgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlc1sldV0gY3JlYXRlIGFib3J0IGZvciAiCi0JCQkJImNtX25vZGU9JXAgbGlzdGVuZXI9JXAgc3RhdGU9JWRcbiIsIF9fZnVuY19fLAotCQkJCV9fTElORV9fLCBjbV9ub2RlLCBjbV9ub2RlLT5saXN0ZW5lciwKLQkJCQljbV9ub2RlLT5zdGF0ZSk7CisJCQkJICAiY21fbm9kZT0lcCBsaXN0ZW5lcj0lcCBzdGF0ZT0lZFxuIiwgX19mdW5jX18sCisJCQkJICBfX0xJTkVfXywgY21fbm9kZSwgY21fbm9kZS0+bGlzdGVuZXIsCisJCQkJICBjbV9ub2RlLT5zdGF0ZSk7CiAJCQlhY3RpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCAxKTsKIAkJfSBlbHNlIHsKIAkJCXBhc3NpdmVfb3Blbl9lcnIoY21fbm9kZSwgc2tiLCAxKTsKQEAgLTE0OTksMTYgKzE3NDAsMTUgQEAKIAogCXN3aXRjaCAoY21fbm9kZS0+c3RhdGUpIHsKIAljYXNlIE5FU19DTV9TVEFURV9FU1RBQkxJU0hFRDoKLQkJaWYgKHJlc190eXBlID09IE5FU19NUEFfUkVRVUVTVF9SRUpFQ1QpIHsKKwkJaWYgKHJlc190eXBlID09IE5FU19NUEFfUkVRVUVTVF9SRUpFQ1QpCiAJCQkvKkJJRyBwcm9ibGVtIGFzIHdlIGFyZSByZWNlaXZpbmcgdGhlIE1QQS4uIFNvIHNob3VsZAotCQkJKiBub3QgYmUgUkVKRUNULi4gVGhpcyBpcyBQYXNzaXZlIE9wZW4uLiBXZSBjYW4KLQkJCSogb25seSByZWNlaXZlIGl0IFJlamVjdCBmb3IgQWN0aXZlIE9wZW4uLi4qLworCQkJICogbm90IGJlIFJFSkVDVC4uIFRoaXMgaXMgUGFzc2l2ZSBPcGVuLi4gV2UgY2FuCisJCQkgKiBvbmx5IHJlY2VpdmUgaXQgUmVqZWN0IGZvciBBY3RpdmUgT3Blbi4uLiovCiAJCQlXQVJOX09OKDEpOwotCQl9CiAJCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX01QQVJFUV9SQ1ZEOwogCQl0eXBlID0gTkVTX0NNX0VWRU5UX01QQV9SRVE7CiAJCWF0b21pY19zZXQoJmNtX25vZGUtPnBhc3NpdmVfc3RhdGUsCi0JCQkJTkVTX1BBU1NJVkVfU1RBVEVfSU5ESUNBVEVEKTsKKwkJCSAgIE5FU19QQVNTSVZFX1NUQVRFX0lORElDQVRFRCk7CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX1NUQVRFX01QQVJFUV9TRU5UOgogCQljbGVhbnVwX3JldHJhbnNfZW50cnkoY21fbm9kZSk7CkBAIC0xNTM1LDggKzE3NzUsOCBAQAogCWNhc2UgTkVTX0NNX1NUQVRFX1NZTl9TRU5UOgogCWNhc2UgTkVTX0NNX1NUQVRFX01QQVJFUV9TRU5UOgogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIiVzWyV1XSBjcmVhdGUgYWJvcnQgZm9yIGNtX25vZGU9JXAgIgotCQkJImxpc3RlbmVyPSVwIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNtX25vZGUsCi0JCQljbV9ub2RlLT5saXN0ZW5lciwgY21fbm9kZS0+c3RhdGUpOworCQkJICAibGlzdGVuZXI9JXAgc3RhdGU9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY21fbm9kZSwKKwkJCSAgY21fbm9kZS0+bGlzdGVuZXIsIGNtX25vZGUtPnN0YXRlKTsKIAkJYWN0aXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgMSk7CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX1NUQVRFX0VTVEFCTElTSEVEOgpAQCAtMTU1MCwxMSArMTc5MCwxMSBAQAogfQogCiBzdGF0aWMgaW50IGNoZWNrX3N5bihzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYikKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBlcnI7CiAKLQllcnIgPSAoKG50b2hsKHRjcGgtPmFja19zZXEpID09IGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSkpPyAwIDogMTsKKwllcnIgPSAoKG50b2hsKHRjcGgtPmFja19zZXEpID09IGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSkpID8gMCA6IDE7CiAJaWYgKGVycikKIAkJYWN0aXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgMSk7CiAKQEAgLTE1NjIsNyArMTgwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfc2VxKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHRjcGhkciAqdGNwaCwKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVyciA9IDA7CiAJdTMyIHNlcTsKQEAgLTE1NzAsMjEgKzE4MTAsMjIgQEAKIAl1MzIgbG9jX3NlcV9udW0gPSBjbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW07CiAJdTMyIHJjdl9ueHQgPSBjbV9ub2RlLT50Y3BfY250eHQucmN2X254dDsKIAl1MzIgcmN2X3duZDsKKwogCXNlcSA9IG50b2hsKHRjcGgtPnNlcSk7CiAJYWNrX3NlcSA9IG50b2hsKHRjcGgtPmFja19zZXEpOwogCXJjdl93bmQgPSBjbV9ub2RlLT50Y3BfY250eHQucmN2X3duZDsKIAlpZiAoYWNrX3NlcSAhPSBsb2Nfc2VxX251bSkKIAkJZXJyID0gMTsKLQllbHNlIGlmICghYmV0d2VlbihzZXEsIHJjdl9ueHQsIChyY3Zfbnh0K3Jjdl93bmQpKSkKKwllbHNlIGlmICghYmV0d2VlbihzZXEsIHJjdl9ueHQsIChyY3Zfbnh0ICsgcmN2X3duZCkpKQogCQllcnIgPSAxOwogCWlmIChlcnIpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIlc1sldV0gY3JlYXRlIGFib3J0IGZvciBjbV9ub2RlPSVwICIKLQkJCSJsaXN0ZW5lcj0lcCBzdGF0ZT0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjbV9ub2RlLAotCQkJY21fbm9kZS0+bGlzdGVuZXIsIGNtX25vZGUtPnN0YXRlKTsKKwkJCSAgImxpc3RlbmVyPSVwIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNtX25vZGUsCisJCQkgIGNtX25vZGUtPmxpc3RlbmVyLCBjbV9ub2RlLT5zdGF0ZSk7CiAJCWluZGljYXRlX3BrdF9lcnIoY21fbm9kZSwgc2tiKTsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJzZXEgRVJST1IgY21fbm9kZSA9JXAgc2VxPTB4JTA4WCAiCi0JCQkicmN2X254dD0weCUwOFggcmN2X3duZD0weCV4XG4iLCBjbV9ub2RlLCBzZXEsIHJjdl9ueHQsCi0JCQlyY3Zfd25kKTsKKwkJCSAgInJjdl9ueHQ9MHglMDhYIHJjdl93bmQ9MHgleFxuIiwgY21fbm9kZSwgc2VxLCByY3Zfbnh0LAorCQkJICByY3Zfd25kKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE1OTQsOSArMTgzNSw4IEBACiAgKiBpcyBjcmVhdGVkIHdpdGggYSBsaXN0ZW5lciBvciBpdCBtYXkgY29tZWluIGFzIHJleG1pdHRlZCBwYWNrZXQgd2hpY2ggaW4KICAqIHRoYXQgY2FzZSB3aWxsIGJlIGp1c3QgZHJvcHBlZC4KICAqLwotCiBzdGF0aWMgdm9pZCBoYW5kbGVfc3luX3BrdChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IsCi0Jc3RydWN0IHRjcGhkciAqdGNwaCkKKwkJCSAgIHN0cnVjdCB0Y3BoZHIgKnRjcGgpCiB7CiAJaW50IHJldDsKIAl1MzIgaW5jX3NlcXVlbmNlOwpAQCAtMTYxNSwxNSArMTg1NSwxNSBAQAogCWNhc2UgTkVTX0NNX1NUQVRFX0xJU1RFTklORzoKIAkJLyogUGFzc2l2ZSBPUEVOICovCiAJCWlmIChhdG9taWNfcmVhZCgmY21fbm9kZS0+bGlzdGVuZXItPnBlbmRfYWNjZXB0c19jbnQpID4KLQkJCQljbV9ub2RlLT5saXN0ZW5lci0+YmFja2xvZykgeworCQkgICAgY21fbm9kZS0+bGlzdGVuZXItPmJhY2tsb2cpIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZHJvcCBzeW4gZHVlIHRvIGJhY2tsb2cgIgotCQkJCSJwcmVzc3VyZSBcbiIpOworCQkJCSAgInByZXNzdXJlIFxuIik7CiAJCQljbV9iYWNrbG9nX2Ryb3BzKys7CiAJCQlwYXNzaXZlX29wZW5fZXJyKGNtX25vZGUsIHNrYiwgMCk7CiAJCQlicmVhazsKIAkJfQogCQlyZXQgPSBoYW5kbGVfdGNwX29wdGlvbnMoY21fbm9kZSwgdGNwaCwgc2tiLCBvcHRpb25zaXplLAotCQkJMSk7CisJCQkJCSAxKTsKIAkJaWYgKHJldCkgewogCQkJcGFzc2l2ZV9vcGVuX2VycihjbV9ub2RlLCBza2IsIDApOwogCQkJLyogZHJvcCBwa3QgKi8KQEAgLTE2NTcsOSArMTg5Nyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9zeW5hY2tfcGt0KHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoKQorCQkJICAgICAgc3RydWN0IHRjcGhkciAqdGNwaCkKIHsKLQogCWludCByZXQ7CiAJdTMyIGluY19zZXF1ZW5jZTsKIAlpbnQgb3B0aW9uc2l6ZTsKQEAgLTE2NzgsNyArMTkxNyw3IEBACiAJCXJldCA9IGhhbmRsZV90Y3Bfb3B0aW9ucyhjbV9ub2RlLCB0Y3BoLCBza2IsIG9wdGlvbnNpemUsIDApOwogCQlpZiAocmV0KSB7CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGU9JXAgdGNwX29wdGlvbnMgZmFpbGVkXG4iLAotCQkJCWNtX25vZGUpOworCQkJCSAgY21fbm9kZSk7CiAJCQlicmVhazsKIAkJfQogCQljbGVhbnVwX3JldHJhbnNfZW50cnkoY21fbm9kZSk7CkBAIC0xNzE3LDEyICsxOTU2LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgaGFuZGxlX2Fja19wa3Qoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCXN0cnVjdCB0Y3BoZHIgKnRjcGgpCisJCQkgIHN0cnVjdCB0Y3BoZHIgKnRjcGgpCiB7CiAJaW50IGRhdGFzaXplID0gMDsKIAl1MzIgaW5jX3NlcXVlbmNlOwogCWludCByZXQgPSAwOwogCWludCBvcHRpb25zaXplOworCiAJb3B0aW9uc2l6ZSA9ICh0Y3BoLT5kb2ZmIDw8IDIpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwogCiAJaWYgKGNoZWNrX3NlcShjbV9ub2RlLCB0Y3BoLCBza2IpKQpAQCAtMTc0Myw4ICsxOTgzLDkgQEAKIAkJaWYgKGRhdGFzaXplKSB7CiAJCQljbV9ub2RlLT50Y3BfY250eHQucmN2X254dCA9IGluY19zZXF1ZW5jZSArIGRhdGFzaXplOwogCQkJaGFuZGxlX3Jjdl9tcGEoY21fbm9kZSwgc2tiKTsKLQkJfSBlbHNlICAvKiByY3ZkIEFDSyBvbmx5ICovCisJCX0gZWxzZSB7IC8qIHJjdmQgQUNLIG9ubHkgKi8KIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fU1RBVEVfRVNUQUJMSVNIRUQ6CiAJCS8qIFBhc3NpdmUgT1BFTiAqLwpAQCAtMTc1MiwxNiArMTk5MywxOCBAQAogCQlpZiAoZGF0YXNpemUpIHsKIAkJCWNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0ID0gaW5jX3NlcXVlbmNlICsgZGF0YXNpemU7CiAJCQloYW5kbGVfcmN2X21wYShjbV9ub2RlLCBza2IpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCWRyb3BfcGFja2V0KHNrYik7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBORVNfQ01fU1RBVEVfTVBBUkVRX1NFTlQ6CiAJCWNtX25vZGUtPnRjcF9jbnR4dC5yZW1fYWNrX251bSA9IG50b2hsKHRjcGgtPmFja19zZXEpOwogCQlpZiAoZGF0YXNpemUpIHsKIAkJCWNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfbnh0ID0gaW5jX3NlcXVlbmNlICsgZGF0YXNpemU7CiAJCQloYW5kbGVfcmN2X21wYShjbV9ub2RlLCBza2IpOwotCQl9IGVsc2UgIC8qIENvdWxkIGJlIGp1c3QgYW4gYWNrIHBrdC4uICovCisJCX0gZWxzZSB7IC8qIENvdWxkIGJlIGp1c3QgYW4gYWNrIHBrdC4uICovCiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX1NUQVRFX0xJU1RFTklORzoKIAkJY2xlYW51cF9yZXRyYW5zX2VudHJ5KGNtX25vZGUpOwpAQCAtMTgwMiwxNCArMjA0NSwxNSBAQAogCiAKIHN0YXRpYyBpbnQgaGFuZGxlX3RjcF9vcHRpb25zKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHRjcGhkciAqdGNwaCwKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0aW9uc2l6ZSwgaW50IHBhc3NpdmUpCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3B0aW9uc2l6ZSwgaW50IHBhc3NpdmUpCiB7CiAJdTggKm9wdGlvbnNsb2MgPSAodTggKikmdGNwaFsxXTsKKwogCWlmIChvcHRpb25zaXplKSB7CiAJCWlmIChwcm9jZXNzX29wdGlvbnMoY21fbm9kZSwgb3B0aW9uc2xvYywgb3B0aW9uc2l6ZSwKLQkJCSh1MzIpdGNwaC0+c3luKSkgeworCQkJCSAgICAodTMyKXRjcGgtPnN5bikpIHsKIAkJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiJXM6IE5vZGUgJXAsIFNlbmRpbmcgUkVTRVRcbiIsCi0JCQkJX19mdW5jX18sIGNtX25vZGUpOworCQkJCSAgX19mdW5jX18sIGNtX25vZGUpOwogCQkJaWYgKHBhc3NpdmUpCiAJCQkJcGFzc2l2ZV9vcGVuX2VycihjbV9ub2RlLCBza2IsIDEpOwogCQkJZWxzZQpAQCAtMTgxOSw3ICsyMDYzLDcgQEAKIAl9CiAKIAljbV9ub2RlLT50Y3BfY250eHQuc25kX3duZCA9IG50b2hzKHRjcGgtPndpbmRvdykgPDwKLQkJCWNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd3NjYWxlOworCQkJCSAgICAgY21fbm9kZS0+dGNwX2NudHh0LnNuZF93c2NhbGU7CiAKIAlpZiAoY21fbm9kZS0+dGNwX2NudHh0LnNuZF93bmQgPiBjbV9ub2RlLT50Y3BfY250eHQubWF4X3NuZF93bmQpCiAJCWNtX25vZGUtPnRjcF9jbnR4dC5tYXhfc25kX3duZCA9IGNtX25vZGUtPnRjcF9jbnR4dC5zbmRfd25kOwpAQCAtMTgzMCwxOCArMjA3NCwxOCBAQAogICogYWN0aXZlX29wZW5fZXJyKCkgd2lsbCBzZW5kIHJlc2V0KCkgaWYgZmxhZyBzZXQuLgogICogSXQgd2lsbCBhbHNvIHNlbmQgQUJPUlQgZXZlbnQuCiAgKi8KLQogc3RhdGljIHZvaWQgYWN0aXZlX29wZW5fZXJyKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQlpbnQgcmVzZXQpCisJCQkgICAgaW50IHJlc2V0KQogewogCWNsZWFudXBfcmV0cmFuc19lbnRyeShjbV9ub2RlKTsKIAlpZiAocmVzZXQpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJFUlJPUiBhY3RpdmUgZXJyIGNhbGxlZCBmb3IgY21fbm9kZT0lcCwgIgotCQkJCSJzdGF0ZT0lZFxuIiwgY21fbm9kZSwgY21fbm9kZS0+c3RhdGUpOworCQkJICAic3RhdGU9JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlKTsKIAkJYWRkX3JlZl9jbV9ub2RlKGNtX25vZGUpOwogCQlzZW5kX3Jlc2V0KGNtX25vZGUsIHNrYik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CiAKIAljbV9ub2RlLT5zdGF0ZSA9IE5FU19DTV9TVEFURV9DTE9TRUQ7CiAJY3JlYXRlX2V2ZW50KGNtX25vZGUsIE5FU19DTV9FVkVOVF9BQk9SVEVEKTsKQEAgLTE4NTEsMTUgKzIwOTUsMTQgQEAKICAqIHBhc3NpdmVfb3Blbl9lcnIoKSB3aWxsIGVpdGhlciBkbyBhIHJlc2V0KCkgb3Igd2lsbCBmcmVlIHVwIHRoZSBza2IgYW5kCiAgKiByZW1vdmUgdGhlIGNtX25vZGUuCiAgKi8KLQogc3RhdGljIHZvaWQgcGFzc2l2ZV9vcGVuX2VycihzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IsCi0JaW50IHJlc2V0KQorCQkJICAgICBpbnQgcmVzZXQpCiB7CiAJY2xlYW51cF9yZXRyYW5zX2VudHJ5KGNtX25vZGUpOwogCWNtX25vZGUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX0NMT1NFRDsKIAlpZiAocmVzZXQpIHsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJwYXNzaXZlX29wZW5fZXJyIHNlbmRpbmcgUlNUIGZvciAiCi0JCQkiY21fbm9kZT0lcCBzdGF0ZSA9JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlKTsKKwkJCSAgImNtX25vZGU9JXAgc3RhdGUgPSVkXG4iLCBjbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSk7CiAJCXNlbmRfcmVzZXQoY21fbm9kZSwgc2tiKTsKIAl9IGVsc2UgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTg3NCw2ICsyMTE3LDcgQEAKIHN0YXRpYyB2b2lkIGZyZWVfcmV0cmFuc19lbnRyeShzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCiB7CiAJc3RydWN0IG5lc190aW1lcl9lbnRyeSAqc2VuZF9lbnRyeTsKKwogCXNlbmRfZW50cnkgPSBjbV9ub2RlLT5zZW5kX2VudHJ5OwogCWlmIChzZW5kX2VudHJ5KSB7CiAJCWNtX25vZGUtPnNlbmRfZW50cnkgPSBOVUxMOwpAQCAtMTg5NywyNiArMjE0MSwyOCBAQAogICogUmV0dXJucyBza2IgaWYgdG8gYmUgZnJlZWQsIGVsc2UgaXQgd2lsbCByZXR1cm4gTlVMTCBpZiBhbHJlYWR5IHVzZWQuLgogICovCiBzdGF0aWMgdm9pZCBwcm9jZXNzX3BhY2tldChzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUsIHN0cnVjdCBza19idWZmICpza2IsCi0Jc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlKQorCQkJICAgc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlKQogewotCWVudW0gbmVzX3RjcGlwX3BrdF90eXBlCXBrdF90eXBlID0gTkVTX1BLVF9UWVBFX1VOS05PV047CisJZW51bSBuZXNfdGNwaXBfcGt0X3R5cGUgcGt0X3R5cGUgPSBORVNfUEtUX1RZUEVfVU5LTk9XTjsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoID0gdGNwX2hkcihza2IpOwotCXUzMiAgICAgZmluX3NldCA9IDA7CisJdTMyIGZpbl9zZXQgPSAwOwogCWludCByZXQgPSAwOworCiAJc2tiX3B1bGwoc2tiLCBpcF9oZHIoc2tiKS0+aWhsIDw8IDIpOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJwcm9jZXNzX3BhY2tldDogY21fbm9kZT0lcCBzdGF0ZSA9JWQgc3luPSVkICIKLQkJImFjaz0lZCByc3Q9JWQgZmluPSVkXG4iLCBjbV9ub2RlLCBjbV9ub2RlLT5zdGF0ZSwgdGNwaC0+c3luLAotCQl0Y3BoLT5hY2ssIHRjcGgtPnJzdCwgdGNwaC0+ZmluKTsKKwkJICAiYWNrPSVkIHJzdD0lZCBmaW49JWRcbiIsIGNtX25vZGUsIGNtX25vZGUtPnN0YXRlLCB0Y3BoLT5zeW4sCisJCSAgdGNwaC0+YWNrLCB0Y3BoLT5yc3QsIHRjcGgtPmZpbik7CiAKLQlpZiAodGNwaC0+cnN0KQorCWlmICh0Y3BoLT5yc3QpIHsKIAkJcGt0X3R5cGUgPSBORVNfUEtUX1RZUEVfUlNUOwotCWVsc2UgaWYgKHRjcGgtPnN5bikgeworCX0gZWxzZSBpZiAodGNwaC0+c3luKSB7CiAJCXBrdF90eXBlID0gTkVTX1BLVF9UWVBFX1NZTjsKIAkJaWYgKHRjcGgtPmFjaykKIAkJCXBrdF90eXBlID0gTkVTX1BLVF9UWVBFX1NZTkFDSzsKLQl9IGVsc2UgaWYgKHRjcGgtPmFjaykKKwl9IGVsc2UgaWYgKHRjcGgtPmFjaykgewogCQlwa3RfdHlwZSA9IE5FU19QS1RfVFlQRV9BQ0s7CisJfQogCWlmICh0Y3BoLT5maW4pCiAJCWZpbl9zZXQgPSAxOwogCkBAIC0xOTQ3LDE3ICsyMTkzLDE3IEBACiAgKiBtaW5pX2NtX2xpc3RlbiAtIGNyZWF0ZSBhIGxpc3RlbiBub2RlIHdpdGggcGFyYW1zCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyICptaW5pX2NtX2xpc3RlbihzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsCi0Jc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3QgbmVzX2NtX2luZm8gKmNtX2luZm8pCisJCQkJCSAgICAgIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYywgc3RydWN0IG5lc19jbV9pbmZvICpjbV9pbmZvKQogewogCXN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3RlbmVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIlNlYXJjaCBmb3IgMHglMDh4IDogMHglMDR4XG4iLAotCQljbV9pbmZvLT5sb2NfYWRkciwgY21faW5mby0+bG9jX3BvcnQpOworCQkgIGNtX2luZm8tPmxvY19hZGRyLCBjbV9pbmZvLT5sb2NfcG9ydCk7CiAKIAkvKiBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBtYXRjaGluZyBsaXN0ZW5lcnMgKi8KIAlsaXN0ZW5lciA9IGZpbmRfbGlzdGVuZXIoY21fY29yZSwgaHRvbmwoY21faW5mby0+bG9jX2FkZHIpLAotCQkJaHRvbnMoY21faW5mby0+bG9jX3BvcnQpLCBORVNfQ01fTElTVEVORVJfRUlUSEVSX1NUQVRFKTsKKwkJCQkgaHRvbnMoY21faW5mby0+bG9jX3BvcnQpLCBORVNfQ01fTElTVEVORVJfRUlUSEVSX1NUQVRFKTsKIAlpZiAobGlzdGVuZXIgJiYgbGlzdGVuZXItPmxpc3RlbmVyX3N0YXRlID09IE5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUpIHsKIAkJLyogZmluZCBhdXRvbWF0aWNhbGx5IGluY3MgcmVmIGNvdW50ID8/PyAqLwogCQlhdG9taWNfZGVjKCZsaXN0ZW5lci0+cmVmX2NvdW50KTsKQEAgLTIwMDMsOSArMjI0OSw5IEBACiAJfQogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJBcGkgLSBsaXN0ZW4oKTogYWRkcj0weCUwOFgsIHBvcnQ9MHglMDR4LCIKLQkJCSIgbGlzdGVuZXIgPSAlcCwgYmFja2xvZyA9ICVkLCBjbV9pZCA9ICVwLlxuIiwKLQkJCWNtX2luZm8tPmxvY19hZGRyLCBjbV9pbmZvLT5sb2NfcG9ydCwKLQkJCWxpc3RlbmVyLCBsaXN0ZW5lci0+YmFja2xvZywgbGlzdGVuZXItPmNtX2lkKTsKKwkJICAiIGxpc3RlbmVyID0gJXAsIGJhY2tsb2cgPSAlZCwgY21faWQgPSAlcC5cbiIsCisJCSAgY21faW5mby0+bG9jX2FkZHIsIGNtX2luZm8tPmxvY19wb3J0LAorCQkgIGxpc3RlbmVyLCBsaXN0ZW5lci0+YmFja2xvZywgbGlzdGVuZXItPmNtX2lkKTsKIAogCXJldHVybiBsaXN0ZW5lcjsKIH0KQEAgLTIwMTUsMjYgKzIyNjEsMjAgQEAKICAqIG1pbmlfY21fY29ubmVjdCAtIG1ha2UgYSBjb25uZWN0aW9uIG5vZGUgd2l0aCBwYXJhbXMKICAqLwogc3RhdGljIHN0cnVjdCBuZXNfY21fbm9kZSAqbWluaV9jbV9jb25uZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHUxNiBwcml2YXRlX2RhdGFfbGVuLAotCXZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IG5lc19jbV9pbmZvICpjbV9pbmZvKQorCQkJCQkgICBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHUxNiBwcml2YXRlX2RhdGFfbGVuLAorCQkJCQkgICB2b2lkICpwcml2YXRlX2RhdGEsIHN0cnVjdCBuZXNfY21faW5mbyAqY21faW5mbykKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGU7CiAJc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbG9vcGJhY2tyZW1vdGVsaXN0ZW5lcjsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmxvb3BiYWNrcmVtb3Rlbm9kZTsKIAlzdHJ1Y3QgbmVzX2NtX2luZm8gbG9vcGJhY2tfY21faW5mbzsKLQl1MTYgbXBhX2ZyYW1lX3NpemUgPSBzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSArIHByaXZhdGVfZGF0YV9sZW47Ci0Jc3RydWN0IGlldGZfbXBhX2ZyYW1lICptcGFfZnJhbWUgPSBOVUxMOworCXU4ICpzdGFydF9idWZmOwogCiAJLyogY3JlYXRlIGEgQ00gY29ubmVjdGlvbiBub2RlICovCiAJY21fbm9kZSA9IG1ha2VfY21fbm9kZShjbV9jb3JlLCBuZXN2bmljLCBjbV9pbmZvLCBOVUxMKTsKIAlpZiAoIWNtX25vZGUpCiAJCXJldHVybiBOVUxMOwotCW1wYV9mcmFtZSA9ICZjbV9ub2RlLT5tcGFfZnJhbWU7Ci0JbWVtY3B5KG1wYV9mcmFtZS0+a2V5LCBJRUZUX01QQV9LRVlfUkVRLCBJRVRGX01QQV9LRVlfU0laRSk7Ci0JbXBhX2ZyYW1lLT5mbGFncyA9IElFVEZfTVBBX0ZMQUdTX0NSQzsKLQltcGFfZnJhbWUtPnJldiA9ICBJRVRGX01QQV9WRVJTSU9OOwotCW1wYV9mcmFtZS0+cHJpdl9kYXRhX2xlbiA9IGh0b25zKHByaXZhdGVfZGF0YV9sZW4pOwogCiAJLyogc2V0IG91ciBub2RlIHNpZGUgdG8gY2xpZW50IChhY3RpdmUpIHNpZGUgKi8KIAljbV9ub2RlLT50Y3BfY250eHQuY2xpZW50ID0gMTsKQEAgLTIwNDIsOCArMjI4Miw4IEBACiAKIAlpZiAoY21faW5mby0+bG9jX2FkZHIgPT0gY21faW5mby0+cmVtX2FkZHIpIHsKIAkJbG9vcGJhY2tyZW1vdGVsaXN0ZW5lciA9IGZpbmRfbGlzdGVuZXIoY21fY29yZSwKLQkJCQludG9obChuZXN2bmljLT5sb2NhbF9pcGFkZHIpLCBjbV9ub2RlLT5yZW1fcG9ydCwKLQkJCQlORVNfQ01fTElTVEVORVJfQUNUSVZFX1NUQVRFKTsKKwkJCQkJCSAgICAgICBudG9obChuZXN2bmljLT5sb2NhbF9pcGFkZHIpLCBjbV9ub2RlLT5yZW1fcG9ydCwKKwkJCQkJCSAgICAgICBORVNfQ01fTElTVEVORVJfQUNUSVZFX1NUQVRFKTsKIAkJaWYgKGxvb3BiYWNrcmVtb3RlbGlzdGVuZXIgPT0gTlVMTCkgewogCQkJY3JlYXRlX2V2ZW50KGNtX25vZGUsIE5FU19DTV9FVkVOVF9BQk9SVEVEKTsKIAkJfSBlbHNlIHsKQEAgLTIwNTIsNyArMjI5Miw3IEBACiAJCQlsb29wYmFja19jbV9pbmZvLnJlbV9wb3J0ID0gY21faW5mby0+bG9jX3BvcnQ7CiAJCQlsb29wYmFja19jbV9pbmZvLmNtX2lkID0gbG9vcGJhY2tyZW1vdGVsaXN0ZW5lci0+Y21faWQ7CiAJCQlsb29wYmFja3JlbW90ZW5vZGUgPSBtYWtlX2NtX25vZGUoY21fY29yZSwgbmVzdm5pYywKLQkJCQkmbG9vcGJhY2tfY21faW5mbywgbG9vcGJhY2tyZW1vdGVsaXN0ZW5lcik7CisJCQkJCQkJICAmbG9vcGJhY2tfY21faW5mbywgbG9vcGJhY2tyZW1vdGVsaXN0ZW5lcik7CiAJCQlpZiAoIWxvb3BiYWNrcmVtb3Rlbm9kZSkgewogCQkJCXJlbV9yZWZfY21fbm9kZShjbV9ub2RlLT5jbV9jb3JlLCBjbV9ub2RlKTsKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTIwNjMsNyArMjMwMyw3IEBACiAJCQkJTkVTX0NNX0RFRkFVTFRfUkNWX1dORF9TQ0FMRTsKIAkJCWNtX25vZGUtPmxvb3BiYWNrcGFydG5lciA9IGxvb3BiYWNrcmVtb3Rlbm9kZTsKIAkJCW1lbWNweShsb29wYmFja3JlbW90ZW5vZGUtPm1wYV9mcmFtZV9idWYsIHByaXZhdGVfZGF0YSwKLQkJCQlwcml2YXRlX2RhdGFfbGVuKTsKKwkJCSAgICAgICBwcml2YXRlX2RhdGFfbGVuKTsKIAkJCWxvb3BiYWNrcmVtb3Rlbm9kZS0+bXBhX2ZyYW1lX3NpemUgPSBwcml2YXRlX2RhdGFfbGVuOwogCiAJCQkvKiB3ZSBhcmUgZG9uZSBoYW5kbGluZyB0aGlzIHN0YXRlLiAqLwpAQCAtMjA5MSwxMiArMjMzMSwxMCBAQAogCQlyZXR1cm4gY21fbm9kZTsKIAl9CiAKLQkvKiBzZXQgb3VyIG5vZGUgc2lkZSB0byBjbGllbnQgKGFjdGl2ZSkgc2lkZSAqLwotCWNtX25vZGUtPnRjcF9jbnR4dC5jbGllbnQgPSAxOwotCS8qIGluaXQgb3VyIE1QQSBmcmFtZSBwdHIgKi8KLQltZW1jcHkobXBhX2ZyYW1lLT5wcml2X2RhdGEsIHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbik7CisJc3RhcnRfYnVmZiA9ICZjbV9ub2RlLT5tcGFfZnJhbWVfYnVmWzBdICsgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92Mik7CisJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgPSBwcml2YXRlX2RhdGFfbGVuOwogCi0JY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgPSBtcGFfZnJhbWVfc2l6ZTsKKwltZW1jcHkoc3RhcnRfYnVmZiwgcHJpdmF0ZV9kYXRhLCBwcml2YXRlX2RhdGFfbGVuKTsKIAogCS8qIHNlbmQgYSBzeW4gYW5kIGdvdG8gc3luIHNlbnQgc3RhdGUgKi8KIAljbV9ub2RlLT5zdGF0ZSA9IE5FU19DTV9TVEFURV9TWU5fU0VOVDsKQEAgLTIxMDUsMTggKzIzNDMsMTkgQEAKIAlpZiAocmV0KSB7CiAJCS8qIGVycm9yIGluIHNlbmRpbmcgdGhlIHN5biBmcmVlIHVwIHRoZSBjbV9ub2RlIHN0cnVjdCAqLwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkFwaSAtIGNvbm5lY3QoKSBGQUlMRUQ6IGRlc3QgIgotCQkJImFkZHI9MHglMDhYLCBwb3J0PTB4JTA0eCwgY21fbm9kZT0lcCwgY21faWQgPSAlcC5cbiIsCi0JCQljbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsIGNtX25vZGUsCi0JCQljbV9ub2RlLT5jbV9pZCk7CisJCQkgICJhZGRyPTB4JTA4WCwgcG9ydD0weCUwNHgsIGNtX25vZGU9JXAsIGNtX2lkID0gJXAuXG4iLAorCQkJICBjbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsIGNtX25vZGUsCisJCQkgIGNtX25vZGUtPmNtX2lkKTsKIAkJcmVtX3JlZl9jbV9ub2RlKGNtX25vZGUtPmNtX2NvcmUsIGNtX25vZGUpOwogCQljbV9ub2RlID0gTlVMTDsKIAl9CiAKLQlpZiAoY21fbm9kZSkKKwlpZiAoY21fbm9kZSkgewogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIkFwaSAtIGNvbm5lY3QoKTogZGVzdCBhZGRyPTB4JTA4WCwiCi0JCQkicG9ydD0weCUwNHgsIGNtX25vZGU9JXAsIGNtX2lkID0gJXAuXG4iLAotCQkJY21fbm9kZS0+cmVtX2FkZHIsIGNtX25vZGUtPnJlbV9wb3J0LCBjbV9ub2RlLAotCQkJY21fbm9kZS0+Y21faWQpOworCQkJICAicG9ydD0weCUwNHgsIGNtX25vZGU9JXAsIGNtX2lkID0gJXAuXG4iLAorCQkJICBjbV9ub2RlLT5yZW1fYWRkciwgY21fbm9kZS0+cmVtX3BvcnQsIGNtX25vZGUsCisJCQkgIGNtX25vZGUtPmNtX2lkKTsKKwl9CiAKIAlyZXR1cm4gY21fbm9kZTsKIH0KQEAgLTIxMjYsOCArMjM2NSw3IEBACiAgKiBtaW5pX2NtX2FjY2VwdCAtIGFjY2VwdCBhIGNvbm5lY3Rpb24KICAqIFRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkCiAgKi8KLXN0YXRpYyBpbnQgbWluaV9jbV9hY2NlcHQoc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlLAotCXN0cnVjdCBpZXRmX21wYV9mcmFtZSAqbXBhX2ZyYW1lLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGUpCitzdGF0aWMgaW50IG1pbmlfY21fYWNjZXB0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwgc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQogewogCXJldHVybiAwOwogfQpAQCAtMjEzNiw4ICsyMzc0LDcgQEAKIC8qKgogICogbWluaV9jbV9yZWplY3QgLSByZWplY3QgYW5kIHRlYXJkb3duIGEgY29ubmVjdGlvbgogICovCi1zdGF0aWMgaW50IG1pbmlfY21fcmVqZWN0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQlzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgKm1wYV9mcmFtZSwgc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKQorc3RhdGljIGludCBtaW5pX2NtX3JlamVjdChzdHJ1Y3QgbmVzX2NtX2NvcmUgKmNtX2NvcmUsIHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgZXJyID0gMDsKQEAgLTIxNDcsNyArMjM4NCw3IEBACiAJc3RydWN0IG5lc19jbV9ub2RlICpsb29wYmFjayA9IGNtX25vZGUtPmxvb3BiYWNrcGFydG5lcjsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiJXMgY21fbm9kZT0lcCB0eXBlPSVkIHN0YXRlPSVkXG4iLAotCQlfX2Z1bmNfXywgY21fbm9kZSwgY21fbm9kZS0+dGNwX2NudHh0LmNsaWVudCwgY21fbm9kZS0+c3RhdGUpOworCQkgIF9fZnVuY19fLCBjbV9ub2RlLCBjbV9ub2RlLT50Y3BfY250eHQuY2xpZW50LCBjbV9ub2RlLT5zdGF0ZSk7CiAKIAlpZiAoY21fbm9kZS0+dGNwX2NudHh0LmNsaWVudCkKIAkJcmV0dXJuIHJldDsKQEAgLTIxNjgsOCArMjQwNSw5IEBACiAJCQkJCWVyciA9IHNlbmRfcmVzZXQoY21fbm9kZSwgTlVMTCk7CiAJCQkJCWlmIChlcnIpCiAJCQkJCQlXQVJOX09OKDEpOwotCQkJCX0gZWxzZQorCQkJCX0gZWxzZSB7CiAJCQkJCWNtX2lkLT5hZGRfcmVmKGNtX2lkKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9IGVsc2UgewpAQCAtMjI0NCw3ICsyNDgyLDcgQEAKIAljYXNlIE5FU19DTV9TVEFURV9UU0E6CiAJCWlmIChjbV9ub2RlLT5zZW5kX2VudHJ5KQogCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBDbG9zZSBnb3QgY2FsbGVkIGZyb20gU1RBVEVfVFNBICIKLQkJCQkic2VuZF9lbnRyeT0lcFxuIiwgY21fbm9kZS0+c2VuZF9lbnRyeSk7CisJCQkgICAgICAgInNlbmRfZW50cnk9JXBcbiIsIGNtX25vZGUtPnNlbmRfZW50cnkpOwogCQlyZXQgPSByZW1fcmVmX2NtX25vZGUoY21fY29yZSwgY21fbm9kZSk7CiAJCWJyZWFrOwogCX0KQEAgLTIyNTcsNyArMjQ5NSw3IEBACiAgKiBub2RlIHN0YXRlIG1hY2hpbmUKICAqLwogc3RhdGljIGludCBtaW5pX2NtX3JlY3ZfcGt0KHN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZSwKLQlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBza19idWZmICpza2IpCisJCQkgICAgc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSA9IE5VTEw7CiAJc3RydWN0IG5lc19jbV9saXN0ZW5lciAqbGlzdGVuZXIgPSBOVUxMOwpAQCAtMjI2OSw5ICsyNTA3LDggQEAKIAogCWlmICghc2tiKQogCQlyZXR1cm4gMDsKLQlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkgeworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOwogCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CkBAIC0yMjg5LDggKzI1MjYsOCBAQAogCiAJZG8gewogCQljbV9ub2RlID0gZmluZF9ub2RlKGNtX2NvcmUsCi0JCQluZm8ucmVtX3BvcnQsIG5mby5yZW1fYWRkciwKLQkJCW5mby5sb2NfcG9ydCwgbmZvLmxvY19hZGRyKTsKKwkJCQkgICAgbmZvLnJlbV9wb3J0LCBuZm8ucmVtX2FkZHIsCisJCQkJICAgIG5mby5sb2NfcG9ydCwgbmZvLmxvY19hZGRyKTsKIAogCQlpZiAoIWNtX25vZGUpIHsKIAkJCS8qIE9ubHkgdHlwZSBvZiBwYWNrZXQgYWNjZXB0ZWQgYXJlIGZvciAqLwpAQCAtMjMwMCw4ICsyNTM3LDggQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWxpc3RlbmVyID0gZmluZF9saXN0ZW5lcihjbV9jb3JlLCBuZm8ubG9jX2FkZHIsCi0JCQkJbmZvLmxvY19wb3J0LAotCQkJCU5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUpOworCQkJCQkJIG5mby5sb2NfcG9ydCwKKwkJCQkJCSBORVNfQ01fTElTVEVORVJfQUNUSVZFX1NUQVRFKTsKIAkJCWlmICghbGlzdGVuZXIpIHsKIAkJCQluZm8uY21faWQgPSBOVUxMOwogCQkJCW5mby5jb25uX3R5cGUgPSAwOwpAQCAtMjMxMiwxMCArMjU0OSwxMCBAQAogCQkJbmZvLmNtX2lkID0gbGlzdGVuZXItPmNtX2lkOwogCQkJbmZvLmNvbm5fdHlwZSA9IGxpc3RlbmVyLT5jb25uX3R5cGU7CiAJCQljbV9ub2RlID0gbWFrZV9jbV9ub2RlKGNtX2NvcmUsIG5lc3ZuaWMsICZuZm8sCi0JCQkJbGlzdGVuZXIpOworCQkJCQkgICAgICAgbGlzdGVuZXIpOwogCQkJaWYgKCFjbV9ub2RlKSB7CiAJCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmFibGUgdG8gYWxsb2NhdGUgIgotCQkJCQkibm9kZVxuIik7CisJCQkJCSAgIm5vZGVcbiIpOwogCQkJCWNtX3BhY2tldHNfZHJvcHBlZCsrOwogCQkJCWF0b21pY19kZWMoJmxpc3RlbmVyLT5yZWZfY291bnQpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0yMzMxLDkgKzI1NjgsMTMgQEAKIAkJCX0KIAkJCWFkZF9yZWZfY21fbm9kZShjbV9ub2RlKTsKIAkJfSBlbHNlIGlmIChjbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfVFNBKSB7Ci0JCQlyZW1fcmVmX2NtX25vZGUoY21fY29yZSwgY21fbm9kZSk7Ci0JCQlhdG9taWNfaW5jKCZjbV9hY2NlbF9kcm9wcGVkX3BrdHMpOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWlmIChjbV9ub2RlLT5uZXNxcC0+cGF1X21vZGUpCisJCQkJbmVzX3F1ZXVlX21ndF9za2JzKHNrYiwgbmVzdm5pYywgY21fbm9kZS0+bmVzcXApOworCQkJZWxzZSB7CisJCQkJcmVtX3JlZl9jbV9ub2RlKGNtX2NvcmUsIGNtX25vZGUpOworCQkJCWF0b21pY19pbmMoJmNtX2FjY2VsX2Ryb3BwZWRfcGt0cyk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwpAQCAtMjM2Myw3ICsyNjA0LDcgQEAKIAlpbml0X3RpbWVyKCZjbV9jb3JlLT50Y3BfdGltZXIpOwogCWNtX2NvcmUtPnRjcF90aW1lci5mdW5jdGlvbiA9IG5lc19jbV90aW1lcl90aWNrOwogCi0JY21fY29yZS0+bXR1ICAgPSBORVNfQ01fREVGQVVMVF9NVFU7CisJY21fY29yZS0+bXR1ID0gTkVTX0NNX0RFRkFVTFRfTVRVOwogCWNtX2NvcmUtPnN0YXRlID0gTkVTX0NNX1NUQVRFX0lOSVRFRDsKIAljbV9jb3JlLT5mcmVlX3R4X3BrdF9tYXggPSBORVNfQ01fREVGQVVMVF9GUkVFX1BLVFM7CiAKQEAgLTI0MDEsOSArMjY0Miw4IEBACiAKIAliYXJyaWVyKCk7CiAKLQlpZiAodGltZXJfcGVuZGluZygmY21fY29yZS0+dGNwX3RpbWVyKSkgeworCWlmICh0aW1lcl9wZW5kaW5nKCZjbV9jb3JlLT50Y3BfdGltZXIpKQogCQlkZWxfdGltZXIoJmNtX2NvcmUtPnRjcF90aW1lcik7Ci0JfQogCiAJZGVzdHJveV93b3JrcXVldWUoY21fY29yZS0+ZXZlbnRfd3EpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGNtX2NvcmUtPmRpc2Nvbm5fd3EpOwpAQCAtMjQ1OCw4ICsyNjk4LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+bWlzYyB8PSBjcHVfdG9fbGUzMihORVNfUVBDT05URVhUX01JU0NfSVBWNCB8Ci0JCQlORVNfUVBDT05URVhUX01JU0NfTk9fTkFHTEUgfCBORVNfUVBDT05URVhUX01JU0NfRE9fTk9UX0ZSQUcgfAotCQkJTkVTX1FQQ09OVEVYVF9NSVNDX0RST1MpOworCQkJCQkJICBORVNfUVBDT05URVhUX01JU0NfTk9fTkFHTEUgfCBORVNfUVBDT05URVhUX01JU0NfRE9fTk9UX0ZSQUcgfAorCQkJCQkJICBORVNfUVBDT05URVhUX01JU0NfRFJPUyk7CiAKIAlpZiAoY21fbm9kZS0+dGNwX2NudHh0LnNuZF93c2NhbGUgfHwgY21fbm9kZS0+dGNwX2NudHh0LnJjdl93c2NhbGUpCiAJCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5taXNjIHw9IGNwdV90b19sZTMyKE5FU19RUENPTlRFWFRfTUlTQ19XU0NBTEUpOwpAQCAtMjQ2OSwxNSArMjcwOSwxNSBAQAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5tc3MgfD0gY3B1X3RvX2xlMzIoKCh1MzIpY21fbm9kZS0+dGNwX2NudHh0Lm1zcykgPDwgMTYpOwogCiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnRjcF9zdGF0ZV9mbG93X2xhYmVsIHw9IGNwdV90b19sZTMyKAotCQkJKHUzMilORVNfUVBDT05URVhUX1RDUFNUQVRFX0VTVCA8PCBORVNfUVBDT05URVhUX1RDUEZMT1dfVENQX1NUQVRFX1NISUZUKTsKKwkJKHUzMilORVNfUVBDT05URVhUX1RDUFNUQVRFX0VTVCA8PCBORVNfUVBDT05URVhUX1RDUEZMT1dfVENQX1NUQVRFX1NISUZUKTsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5wZF9pbmRleF93c2NhbGUgfD0gY3B1X3RvX2xlMzIoCi0JCQkoY21fbm9kZS0+dGNwX2NudHh0LnNuZF93c2NhbGUgPDwgTkVTX1FQQ09OVEVYVF9QRFdTQ0FMRV9TTkRfV1NDQUxFX1NISUZUKSAmCi0JCQlORVNfUVBDT05URVhUX1BEV1NDQUxFX1NORF9XU0NBTEVfTUFTSyk7CisJCShjbV9ub2RlLT50Y3BfY250eHQuc25kX3dzY2FsZSA8PCBORVNfUVBDT05URVhUX1BEV1NDQUxFX1NORF9XU0NBTEVfU0hJRlQpICYKKwkJTkVTX1FQQ09OVEVYVF9QRFdTQ0FMRV9TTkRfV1NDQUxFX01BU0spOwogCiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnBkX2luZGV4X3dzY2FsZSB8PSBjcHVfdG9fbGUzMigKLQkJCShjbV9ub2RlLT50Y3BfY250eHQucmN2X3dzY2FsZSA8PCBORVNfUVBDT05URVhUX1BEV1NDQUxFX1JDVl9XU0NBTEVfU0hJRlQpICYKLQkJCU5FU19RUENPTlRFWFRfUERXU0NBTEVfUkNWX1dTQ0FMRV9NQVNLKTsKKwkJKGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd3NjYWxlIDw8IE5FU19RUENPTlRFWFRfUERXU0NBTEVfUkNWX1dTQ0FMRV9TSElGVCkgJgorCQlORVNfUVBDT05URVhUX1BEV1NDQUxFX1JDVl9XU0NBTEVfTUFTSyk7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+a2VlcGFsaXZlID0gY3B1X3RvX2xlMzIoMHg4MCk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnRzX3JlY2VudCA9IDA7CkBAIC0yNDg2LDI0ICsyNzI2LDI0IEBACiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF93bmQgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQuc25kX3duZCk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl9ueHQgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQucmN2X254dCk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl93bmQgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQucmN2X3duZCA8PAotCQkJY21fbm9kZS0+dGNwX2NudHh0LnJjdl93c2NhbGUpOworCQkJCQkJICAgIGNtX25vZGUtPnRjcF9jbnR4dC5yY3Zfd3NjYWxlKTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX21heCA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5sb2Nfc2VxX251bSk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF91bmEgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0pOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5zcnR0ID0gMDsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+cnR0dmFyID0gY3B1X3RvX2xlMzIoMHg2KTsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+c3N0aHJlc2ggPSBjcHVfdG9fbGUzMigweDNGRkZDMDAwKTsKLQluZXNxcC0+bmVzcXBfY29udGV4dC0+Y3duZCA9IGNwdV90b19sZTMyKDIqY21fbm9kZS0+dGNwX2NudHh0Lm1zcyk7CisJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmN3bmQgPSBjcHVfdG9fbGUzMigyICogY21fbm9kZS0+dGNwX2NudHh0Lm1zcyk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF93bDEgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQucmN2X254dCk7CiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF93bDIgPSBjcHVfdG9fbGUzMihjbV9ub2RlLT50Y3BfY250eHQubG9jX3NlcV9udW0pOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5tYXhfc25kX3duZCA9IGNwdV90b19sZTMyKGNtX25vZGUtPnRjcF9jbnR4dC5tYXhfc25kX3duZCk7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIlFQJXU6IHJjdl9ueHQgPSAweCUwOFgsIHNuZF9ueHQgPSAweCUwOFgsIgotCQkJIiBTZXR0aW5nIE1TUyB0byAldSwgUERXc2NhbGUgPSAweCUwOFgsIHJjdl93bmQgPSAldSwgY29udGV4dCBtaXNjID0gMHglMDhYLlxuIiwKLQkJCW5lc3FwLT5od3FwLnFwX2lkLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X254dCksCi0JCQlsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX254dCksCi0JCQljbV9ub2RlLT50Y3BfY250eHQubXNzLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cGRfaW5kZXhfd3NjYWxlKSwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5yY3Zfd25kKSwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5taXNjKSk7CisJCSAgIiBTZXR0aW5nIE1TUyB0byAldSwgUERXc2NhbGUgPSAweCUwOFgsIHJjdl93bmQgPSAldSwgY29udGV4dCBtaXNjID0gMHglMDhYLlxuIiwKKwkJICBuZXNxcC0+aHdxcC5xcF9pZCwgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl9ueHQpLAorCQkgIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5zbmRfbnh0KSwKKwkJICBjbV9ub2RlLT50Y3BfY250eHQubXNzLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cGRfaW5kZXhfd3NjYWxlKSwKKwkJICBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X3duZCksCisJCSAgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPm1pc2MpKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIiAgc25kX3duZCAgPSAweCUwOFguXG4iLCBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+c25kX3duZCkpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiICBzbmRfY3duZCA9IDB4JTA4WC5cbiIsIGxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5jd25kKSk7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICIgIG1heF9zd25kID0gMHglMDhYLlxuIiwgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPm1heF9zbmRfd25kKSk7CkBAIC0yNTI0LDcgKzI3NjQsNyBAQAogCiAJd29yayA9IGt6YWxsb2Moc2l6ZW9mICp3b3JrLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXdvcmspCi0JCXJldHVybiAtRU5PTUVNOyAvKiBUaW1lciB3aWxsIGNsZWFuIHVwICovCisJCXJldHVybiAtRU5PTUVNOyAgLyogVGltZXIgd2lsbCBjbGVhbiB1cCAqLwogCiAJbmVzX2FkZF9yZWYoJm5lc3FwLT5pYnFwKTsKIAl3b3JrLT5uZXNxcCA9IG5lc3FwOwpAQCAtMjU0NCw3ICsyNzg0LDcgQEAKIAogCWtmcmVlKGR3b3JrKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgInByb2Nlc3NpbmcgQUVRRSBpZCAweCUwNFggZm9yIFFQJXUuXG4iLAotCQkJbmVzcXAtPmxhc3RfYWVxLCBuZXNxcC0+aHdxcC5xcF9pZCk7CisJCSAgbmVzcXAtPmxhc3RfYWVxLCBuZXNxcC0+aHdxcC5xcF9pZCk7CiAJbmVzX2NtX2Rpc2Nvbm5fdHJ1ZShuZXNxcCk7CiAJbmVzX3JlbV9yZWYoJm5lc3FwLT5pYnFwKTsKIH0KQEAgLTI1ODAsNyArMjgyMCw3IEBACiAJLyogbWFrZSBzdXJlIHdlIGhhdmVudCBhbHJlYWR5IGNsb3NlZCB0aGlzIGNvbm5lY3Rpb24gKi8KIAlpZiAoIWNtX2lkKSB7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldSBkaXNjb25uZWN0X3dvcmtlciBjbWlkIGlzIE5VTExcbiIsCi0JCQkJbmVzcXAtPmh3cXAucXBfaWQpOworCQkJICBuZXNxcC0+aHdxcC5xcF9pZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc3FwLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yNTg5LDcgKzI4MjksNyBAQAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiRGlzY29ubmVjdGluZyBRUCV1XG4iLCBuZXNxcC0+aHdxcC5xcF9pZCk7CiAKIAlvcmlnaW5hbF9od190Y3Bfc3RhdGUgPSBuZXNxcC0+aHdfdGNwX3N0YXRlOwotCW9yaWdpbmFsX2licXBfc3RhdGUgICA9IG5lc3FwLT5pYnFwX3N0YXRlOworCW9yaWdpbmFsX2licXBfc3RhdGUgPSBuZXNxcC0+aWJxcF9zdGF0ZTsKIAlsYXN0X2FlID0gbmVzcXAtPmxhc3RfYWVxOwogCiAJaWYgKG5lc3FwLT50ZXJtX2ZsYWdzKSB7CkBAIC0yNjQ3LDE2ICsyODg3LDE2IEBACiAJCQljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0gMDsKIAogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJHZW5lcmF0aW5nIGEgQ00gRGlzY29ubmVjdCBFdmVudCIKLQkJCQkiIGZvciAgUVAldSwgU1EgSGVhZCA9ICV1LCBTUSBUYWlsID0gJXUuICIKLQkJCQkiY21faWQgPSAlcCwgcmVmY291bnQgPSAldS5cbiIsCi0JCQkJbmVzcXAtPmh3cXAucXBfaWQsIG5lc3FwLT5od3FwLnNxX2hlYWQsCi0JCQkJbmVzcXAtPmh3cXAuc3FfdGFpbCwgY21faWQsCi0JCQkJYXRvbWljX3JlYWQoJm5lc3FwLT5yZWZjb3VudCkpOworCQkJCSAgIiBmb3IgIFFQJXUsIFNRIEhlYWQgPSAldSwgU1EgVGFpbCA9ICV1LiAiCisJCQkJICAiY21faWQgPSAlcCwgcmVmY291bnQgPSAldS5cbiIsCisJCQkJICBuZXNxcC0+aHdxcC5xcF9pZCwgbmVzcXAtPmh3cXAuc3FfaGVhZCwKKwkJCQkgIG5lc3FwLT5od3FwLnNxX3RhaWwsIGNtX2lkLAorCQkJCSAgYXRvbWljX3JlYWQoJm5lc3FwLT5yZWZjb3VudCkpOwogCiAJCQlyZXQgPSBjbV9pZC0+ZXZlbnRfaGFuZGxlcihjbV9pZCwgJmNtX2V2ZW50KTsKIAkJCWlmIChyZXQpCiAJCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJPRkEgQ00gZXZlbnRfaGFuZGxlciAiCi0JCQkJCSJyZXR1cm5lZCwgcmV0PSVkXG4iLCByZXQpOworCQkJCQkgICJyZXR1cm5lZCwgcmV0PSVkXG4iLCByZXQpOwogCQl9CiAKIAkJaWYgKGlzc3VlX2Nsb3NlKSB7CkBAIC0yNjc0LDkgKzI5MTQsOCBAQAogCQkJY21fZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9IDA7CiAKIAkJCXJldCA9IGNtX2lkLT5ldmVudF9oYW5kbGVyKGNtX2lkLCAmY21fZXZlbnQpOwotCQkJaWYgKHJldCkgeworCQkJaWYgKHJldCkKIAkJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIk9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCByZXQ9JWRcbiIsIHJldCk7Ci0JCQl9CiAKIAkJCWNtX2lkLT5yZW1fcmVmKGNtX2lkKTsKIAkJfQpAQCAtMjcxNiw4ICsyOTU1LDggQEAKIAkJCWlmIChuZXNxcC0+bHNtbV9tcikKIAkJCQluZXNpYmRldi0+aWJkZXYuZGVyZWdfbXIobmVzcXAtPmxzbW1fbXIpOwogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChuZXNkZXYtPnBjaWRldiwKLQkJCQkJbmVzcXAtPnByaXZhdGVfZGF0YV9sZW4rc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSksCi0JCQkJCW5lc3FwLT5pZXRmX2ZyYW1lLCBuZXNxcC0+aWV0Zl9mcmFtZV9wYmFzZSk7CisJCQkJCSAgICBuZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbiArIG5lc3FwLT5pZXRmX2ZyYW1lX3NpemUsCisJCQkJCSAgICBuZXNxcC0+aWV0Zl9mcmFtZSwgbmVzcXAtPmlldGZfZnJhbWVfcGJhc2UpOwogCQl9CiAJfQogCkBAIC0yNzU2LDYgKzI5OTUsMTIgQEAKIAlzdHJ1Y3QgaWJfcGh5c19idWYgaWJwaHlzYnVmOwogCXN0cnVjdCBuZXNfcGQgKm5lc3BkOwogCXU2NCB0YWdnZWRfb2Zmc2V0OworCXU4IG1wYV9mcmFtZV9vZmZzZXQgPSAwOworCXN0cnVjdCBpZXRmX21wYV92MiAqbXBhX3YyX2ZyYW1lOworCXU4IHN0YXJ0X2FkZHIgPSAwOworCXU4ICpzdGFydF9wdHIgPSAmc3RhcnRfYWRkcjsKKwl1OCAqKnN0YXJ0X2J1ZmYgPSAmc3RhcnRfcHRyOworCXUxNiBidWZmX2xlbiA9IDA7CiAKIAlpYnFwID0gbmVzX2dldF9xcChjbV9pZC0+ZGV2aWNlLCBjb25uX3BhcmFtLT5xcG4pOwogCWlmICghaWJxcCkKQEAgLTI3OTYsNTMgKzMwNDEsNDkgQEAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIm5ldGRldiByZWZjbnQgPSAldS5cbiIsCiAJCQluZXRkZXZfcmVmY250X3JlYWQobmVzdm5pYy0+bmV0ZGV2KSk7CiAKKwluZXNxcC0+aWV0Zl9mcmFtZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92Mik7CiAJLyogYWxsb2NhdGUgdGhlIGlldGYgZnJhbWUgYW5kIHNwYWNlIGZvciBwcml2YXRlIGRhdGEgKi8KIAluZXNxcC0+aWV0Zl9mcmFtZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LAotCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSArIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4sCi0JCSZuZXNxcC0+aWV0Zl9mcmFtZV9wYmFzZSk7CisJCQkJCQkgbmVzcXAtPmlldGZfZnJhbWVfc2l6ZSArIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4sCisJCQkJCQkgJm5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlKTsKIAogCWlmICghbmVzcXAtPmlldGZfZnJhbWUpIHsKLQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwcml2YXRlICIKLQkJCSJkYXRhXG4iKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwcml2YXRlIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJbXBhX3YyX2ZyYW1lID0gKHN0cnVjdCBpZXRmX21wYV92MiAqKW5lc3FwLT5pZXRmX2ZyYW1lOwogCisJaWYgKGNtX25vZGUtPm1wYV9mcmFtZV9yZXYgPT0gSUVURl9NUEFfVjEpCisJCW1wYV9mcmFtZV9vZmZzZXQgPSA0OwogCi0JLyogc2V0dXAgdGhlIE1QQSBmcmFtZSAqLworCW1lbWNweShtcGFfdjJfZnJhbWUtPnByaXZfZGF0YSwgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLAorCSAgICAgICBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKworCWNtX2J1aWxkX21wYV9mcmFtZShjbV9ub2RlLCBzdGFydF9idWZmLCAmYnVmZl9sZW4sIG5lc3FwLT5pZXRmX2ZyYW1lLCBNUEFfS0VZX1JFUExZKTsKIAluZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbiA9IGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW47Ci0JbWVtY3B5KG5lc3FwLT5pZXRmX2ZyYW1lLT5rZXksIElFRlRfTVBBX0tFWV9SRVAsIElFVEZfTVBBX0tFWV9TSVpFKTsKLQotCW1lbWNweShuZXNxcC0+aWV0Zl9mcmFtZS0+cHJpdl9kYXRhLCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCi0JCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKLQotCW5lc3FwLT5pZXRmX2ZyYW1lLT5wcml2X2RhdGFfbGVuID0KLQkJY3B1X3RvX2JlMTYoY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7Ci0JbmVzcXAtPmlldGZfZnJhbWUtPnJldiA9IG1wYV92ZXJzaW9uOwotCW5lc3FwLT5pZXRmX2ZyYW1lLT5mbGFncyA9IElFVEZfTVBBX0ZMQUdTX0NSQzsKIAogCS8qIHNldHVwIG91ciBmaXJzdCBvdXRnb2luZyBpV2FycCBzZW5kIFdRRSAodGhlIElFVEYgZnJhbWUgcmVzcG9uc2UpICovCiAJd3FlID0gJm5lc3FwLT5od3FwLnNxX3ZiYXNlWzBdOwogCiAJaWYgKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIgIT0KLQkJCWNtX2lkLT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkcikgeworCSAgICBjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKIAkJdTY0dGVtcCA9ICh1bnNpZ25lZCBsb25nKW5lc3FwOwogCQluZXNpYmRldiA9IG5lc3ZuaWMtPm5lc2liZGV2OwogCQluZXNwZCA9IG5lc3FwLT5uZXNwZDsKLQkJaWJwaHlzYnVmLmFkZHIgPSBuZXNxcC0+aWV0Zl9mcmFtZV9wYmFzZTsKLQkJaWJwaHlzYnVmLnNpemUgPSBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSk7Ci0JCXRhZ2dlZF9vZmZzZXQgPSAodTY0KSh1bnNpZ25lZCBsb25nKW5lc3FwLT5pZXRmX2ZyYW1lOworCQlpYnBoeXNidWYuYWRkciA9IG5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlICsgbXBhX2ZyYW1lX29mZnNldDsKKwkJaWJwaHlzYnVmLnNpemUgPSBidWZmX2xlbjsKKwkJdGFnZ2VkX29mZnNldCA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpKnN0YXJ0X2J1ZmY7CiAJCWlibXIgPSBuZXNpYmRldi0+aWJkZXYucmVnX3BoeXNfbXIoKHN0cnVjdCBpYl9wZCAqKW5lc3BkLAotCQkJCQkJJmlicGh5c2J1ZiwgMSwKLQkJCQkJCUlCX0FDQ0VTU19MT0NBTF9XUklURSwKLQkJCQkJCSZ0YWdnZWRfb2Zmc2V0KTsKKwkJCQkJCSAgICZpYnBoeXNidWYsIDEsCisJCQkJCQkgICBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUsCisJCQkJCQkgICAmdGFnZ2VkX29mZnNldCk7CiAJCWlmICghaWJtcikgewogCQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmFibGUgdG8gcmVnaXN0ZXIgbWVtb3J5IHJlZ2lvbiIKLQkJCQkJImZvciBsU01NIGZvciBjbV9ub2RlID0gJXAgXG4iLAotCQkJCQljbV9ub2RlKTsKKwkJCQkgICJmb3IgbFNNTSBmb3IgY21fbm9kZSA9ICVwIFxuIiwKKwkJCQkgIGNtX25vZGUpOwogCQkJcGNpX2ZyZWVfY29uc2lzdGVudChuZXNkZXYtPnBjaWRldiwKLQkJCQluZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbitzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSwKLQkJCQluZXNxcC0+aWV0Zl9mcmFtZSwgbmVzcXAtPmlldGZfZnJhbWVfcGJhc2UpOworCQkJCQkgICAgbmVzcXAtPnByaXZhdGVfZGF0YV9sZW4gKyBuZXNxcC0+aWV0Zl9mcmFtZV9zaXplLAorCQkJCQkgICAgbmVzcXAtPmlldGZfZnJhbWUsIG5lc3FwLT5pZXRmX2ZyYW1lX3BiYXNlKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKQEAgLTI4NTAsMjIgKzMwOTEsMjAgQEAKIAkJaWJtci0+ZGV2aWNlID0gbmVzcGQtPmlicGQuZGV2aWNlOwogCQluZXNxcC0+bHNtbV9tciA9IGlibXI7CiAKLQkJdTY0dGVtcCB8PSBORVNfU1dfQ09OVEVYVF9BTElHTj4+MTsKKwkJdTY0dGVtcCB8PSBORVNfU1dfQ09OVEVYVF9BTElHTiA+PiAxOwogCQlzZXRfd3FlXzY0Yml0X3ZhbHVlKHdxZS0+d3FlX3dvcmRzLAotCQkJTkVTX0lXQVJQX1NRX1dRRV9DT01QX0NUWF9MT1dfSURYLAotCQkJdTY0dGVtcCk7CisJCQkJICAgIE5FU19JV0FSUF9TUV9XUUVfQ09NUF9DVFhfTE9XX0lEWCwKKwkJCQkgICAgdTY0dGVtcCk7CiAJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfTUlTQ19JRFhdID0KIAkJCWNwdV90b19sZTMyKE5FU19JV0FSUF9TUV9XUUVfU1RSRUFNSU5HIHwKLQkJCU5FU19JV0FSUF9TUV9XUUVfV1JQRFUpOworCQkJCSAgICBORVNfSVdBUlBfU1FfV1FFX1dSUERVKTsKIAkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9UT1RBTF9QQVlMT0FEX0lEWF0gPQotCQkJY3B1X3RvX2xlMzIoY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiArCi0JCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSk7CisJCQljcHVfdG9fbGUzMihidWZmX2xlbik7CiAJCXNldF93cWVfNjRiaXRfdmFsdWUod3FlLT53cWVfd29yZHMsCi0JCQkJCU5FU19JV0FSUF9TUV9XUUVfRlJBRzBfTE9XX0lEWCwKLQkJCQkJKHU2NCkodW5zaWduZWQgbG9uZyluZXNxcC0+aWV0Zl9mcmFtZSk7CisJCQkJICAgIE5FU19JV0FSUF9TUV9XUUVfRlJBRzBfTE9XX0lEWCwKKwkJCQkgICAgKHU2NCkodW5zaWduZWQgbG9uZykoKnN0YXJ0X2J1ZmYpKTsKIAkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9MRU5HVEgwX0lEWF0gPQotCQkJY3B1X3RvX2xlMzIoY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbiArCi0JCQlzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSk7CisJCQljcHVfdG9fbGUzMihidWZmX2xlbik7CiAJCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfU1RBRzBfSURYXSA9IGlibXItPmxrZXk7CiAJCWlmIChuZXNxcC0+c3Ffa21hcHBlZCkgewogCQkJbmVzcXAtPnNxX2ttYXBwZWQgPSAwOwpAQCAtMjg3NCw3ICszMTEzLDcgQEAKIAogCQluZXNxcC0+bmVzcXBfY29udGV4dC0+aXJkX29yZF9zaXplcyB8PQogCQkJY3B1X3RvX2xlMzIoTkVTX1FQQ09OVEVYVF9PUkRJUkRfTFNNTV9QUkVTRU5UIHwKLQkJCU5FU19RUENPTlRFWFRfT1JESVJEX1dSUERVKTsKKwkJCQkgICAgTkVTX1FQQ09OVEVYVF9PUkRJUkRfV1JQRFUpOwogCX0gZWxzZSB7CiAJCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5pcmRfb3JkX3NpemVzIHw9CiAJCQljcHVfdG9fbGUzMihORVNfUVBDT05URVhUX09SRElSRF9XUlBEVSk7CkBAIC0yODg4LDExICszMTI3LDExIEBACiAKIAkvKiAgbmVzcXAtPmNtX25vZGUgPSAodm9pZCAqKWNtX2lkLT5wcm92aWRlcl9kYXRhOyAqLwogCWNtX2lkLT5wcm92aWRlcl9kYXRhID0gbmVzcXA7Ci0JbmVzcXAtPmFjdGl2ZV9jb25uICAgPSAwOworCW5lc3FwLT5hY3RpdmVfY29ubiA9IDA7CiAKIAlpZiAoY21fbm9kZS0+c3RhdGUgPT0gTkVTX0NNX1NUQVRFX1RTQSkKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJBbHJlYWR5IHN0YXRlID0gVFNBIGZvciBjbV9ub2RlPSVwXG4iLAotCQkJY21fbm9kZSk7CisJCQkgIGNtX25vZGUpOwogCiAJbmVzX2NtX2luaXRfdHNhX2Nvbm4obmVzcXAsIGNtX25vZGUpOwogCkBAIC0yOTA5LDEzICszMTQ4LDEzIEBACiAJCQljcHVfdG9fbGUzMihudG9obChjbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKSk7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+bWlzYzIgfD0gY3B1X3RvX2xlMzIoCi0JCQkodTMyKVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbikgPDwKLQkJCU5FU19RUENPTlRFWFRfTUlTQzJfU1JDX0lQX1NISUZUKTsKKwkJKHUzMilQQ0lfRlVOQyhuZXNkZXYtPnBjaWRldi0+ZGV2Zm4pIDw8CisJCU5FU19RUENPTlRFWFRfTUlTQzJfU1JDX0lQX1NISUZUKTsKIAogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5hcnBfaW5kZXhfdmxhbiB8PQogCQljcHVfdG9fbGUzMihuZXNfYXJwX3RhYmxlKG5lc2RldiwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5pcDApLCBOVUxMLAotCQkJTkVTX0FSUF9SRVNPTFZFKSA8PCAxNik7CisJCQkJCSAgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPmlwMCksIE5VTEwsCisJCQkJCSAgTkVTX0FSUF9SRVNPTFZFKSA8PCAxNik7CiAKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+dHNfdmFsX2RlbHRhID0gY3B1X3RvX2xlMzIoCiAJCWppZmZpZXMgLSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9UQ1BfTk9XKSk7CkBAIC0yOTQxLDcgKzMxODAsNyBAQAogCWNyY192YWx1ZSA9IGdldF9jcmNfdmFsdWUoJm5lc19xdWFkKTsKIAluZXNxcC0+aHRlX2luZGV4ID0gY3B1X3RvX2JlMzIoY3JjX3ZhbHVlIF4gMHhmZmZmZmZmZik7CiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJIVEUgSW5kZXggPSAweCUwOFgsIENSQyA9IDB4JTA4WFxuIiwKLQkJbmVzcXAtPmh0ZV9pbmRleCwgbmVzcXAtPmh0ZV9pbmRleCAmIGFkYXB0ZXItPmh0ZV9pbmRleF9tYXNrKTsKKwkJICBuZXNxcC0+aHRlX2luZGV4LCBuZXNxcC0+aHRlX2luZGV4ICYgYWRhcHRlci0+aHRlX2luZGV4X21hc2spOwogCiAJbmVzcXAtPmh0ZV9pbmRleCAmPSBhZGFwdGVyLT5odGVfaW5kZXhfbWFzazsKIAluZXNxcC0+bmVzcXBfY29udGV4dC0+aHRlX2luZGV4ID0gY3B1X3RvX2xlMzIobmVzcXAtPmh0ZV9pbmRleCk7CkBAIC0yOTQ5LDE3ICszMTg4LDE1IEBACiAJY21fbm9kZS0+Y21fY29yZS0+YXBpLT5hY2NlbGVyYXRlZChjbV9ub2RlLT5jbV9jb3JlLCBjbV9ub2RlKTsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldSwgRGVzdGluYXRpb24gSVAgPSAweCUwOFg6MHglMDRYLCBsb2NhbCA9ICIKLQkJCSIweCUwOFg6MHglMDRYLCByY3Zfbnh0PTB4JTA4WCwgc25kX254dD0weCUwOFgsIG1wYSArICIKLQkJCSJwcml2YXRlIGRhdGEgbGVuZ3RoPSV6dS5cbiIsIG5lc3FwLT5od3FwLnFwX2lkLAotCQkJbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCQludG9ocyhjbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQpLAotCQkJbnRvaGwoY21faWQtPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKLQkJCW50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5yY3Zfbnh0KSwKLQkJCWxlMzJfdG9fY3B1KG5lc3FwLT5uZXNxcF9jb250ZXh0LT5zbmRfbnh0KSwKLQkJCWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4gKwotCQkJc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSkpOwotCisJCSAgIjB4JTA4WDoweCUwNFgsIHJjdl9ueHQ9MHglMDhYLCBzbmRfbnh0PTB4JTA4WCwgbXBhICsgIgorCQkgICJwcml2YXRlIGRhdGEgbGVuZ3RoPSV1LlxuIiwgbmVzcXAtPmh3cXAucXBfaWQsCisJCSAgbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCSAgbnRvaHMoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9wb3J0KSwKKwkJICBudG9obChjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkgIG50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKKwkJICBsZTMyX3RvX2NwdShuZXNxcC0+bmVzcXBfY29udGV4dC0+cmN2X254dCksCisJCSAgbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnNuZF9ueHQpLAorCQkgIGJ1ZmZfbGVuKTsKIAogCS8qIG5vdGlmeSBPRiBsYXllciB0aGF0IGFjY2VwdCBldmVudCB3YXMgc3VjY2Vzc2Z1bCAqLwogCWNtX2lkLT5hZGRfcmVmKGNtX2lkKTsKQEAgLTI5ODAsMTIgKzMyMTcsMTIgQEAKIAkJCW5lc3FwLT5wcml2YXRlX2RhdGFfbGVuOwogCQkvKiBjb3B5IGVudGlyZSBNUEEgZnJhbWUgdG8gb3VyIGNtX25vZGUncyBmcmFtZSAqLwogCQltZW1jcHkoY21fbm9kZS0+bG9vcGJhY2twYXJ0bmVyLT5tcGFfZnJhbWVfYnVmLAotCQkJbmVzcXAtPmlldGZfZnJhbWUtPnByaXZfZGF0YSwgbmVzcXAtPnByaXZhdGVfZGF0YV9sZW4pOworCQkgICAgICAgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKIAkJY3JlYXRlX2V2ZW50KGNtX25vZGUtPmxvb3BiYWNrcGFydG5lciwgTkVTX0NNX0VWRU5UX0NPTk5FQ1RFRCk7CiAJfQogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdIE9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCAiCi0JCQkicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CisJCSAgICAgICAicmV0PSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5OTgsMzQgKzMyMzUsMjggQEAKIHsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGU7CiAJc3RydWN0IG5lc19jbV9ub2RlICpsb29wYmFjazsKLQogCXN0cnVjdCBuZXNfY21fY29yZSAqY21fY29yZTsKKwl1OCAqc3RhcnRfYnVmZjsKIAogCWF0b21pY19pbmMoJmNtX3JlamVjdHMpOwotCWNtX25vZGUgPSAoc3RydWN0IG5lc19jbV9ub2RlICopIGNtX2lkLT5wcm92aWRlcl9kYXRhOworCWNtX25vZGUgPSAoc3RydWN0IG5lc19jbV9ub2RlICopY21faWQtPnByb3ZpZGVyX2RhdGE7CiAJbG9vcGJhY2sgPSBjbV9ub2RlLT5sb29wYmFja3BhcnRuZXI7CiAJY21fY29yZSA9IGNtX25vZGUtPmNtX2NvcmU7CiAJY21fbm9kZS0+Y21faWQgPSBjbV9pZDsKLQljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpICsgcGRhdGFfbGVuOwogCi0JaWYgKGNtX25vZGUtPm1wYV9mcmFtZV9zaXplID4gTUFYX0NNX0JVRkZFUikKKwlpZiAocGRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV92MikgPiBNQVhfQ01fQlVGRkVSKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbWNweSgmY21fbm9kZS0+bXBhX2ZyYW1lLmtleVswXSwgSUVGVF9NUEFfS0VZX1JFUCwgSUVURl9NUEFfS0VZX1NJWkUpOwogCWlmIChsb29wYmFjaykgewogCQltZW1jcHkoJmxvb3BiYWNrLT5tcGFfZnJhbWUucHJpdl9kYXRhLCBwZGF0YSwgcGRhdGFfbGVuKTsKIAkJbG9vcGJhY2stPm1wYV9mcmFtZS5wcml2X2RhdGFfbGVuID0gcGRhdGFfbGVuOwotCQlsb29wYmFjay0+bXBhX2ZyYW1lX3NpemUgPSBzaXplb2Yoc3RydWN0IGlldGZfbXBhX2ZyYW1lKSArCi0JCQkJcGRhdGFfbGVuOworCQlsb29wYmFjay0+bXBhX2ZyYW1lX3NpemUgPSBwZGF0YV9sZW47CiAJfSBlbHNlIHsKLQkJbWVtY3B5KCZjbV9ub2RlLT5tcGFfZnJhbWUucHJpdl9kYXRhLCBwZGF0YSwgcGRhdGFfbGVuKTsKLQkJY21fbm9kZS0+bXBhX2ZyYW1lLnByaXZfZGF0YV9sZW4gPSBjcHVfdG9fYmUxNihwZGF0YV9sZW4pOworCQlzdGFydF9idWZmID0gJmNtX25vZGUtPm1wYV9mcmFtZV9idWZbMF0gKyBzaXplb2Yoc3RydWN0IGlldGZfbXBhX3YyKTsKKwkJY21fbm9kZS0+bXBhX2ZyYW1lX3NpemUgPSBwZGF0YV9sZW47CisJCW1lbWNweShzdGFydF9idWZmLCBwZGF0YSwgcGRhdGFfbGVuKTsKIAl9Ci0KLQljbV9ub2RlLT5tcGFfZnJhbWUucmV2ID0gbXBhX3ZlcnNpb247Ci0JY21fbm9kZS0+bXBhX2ZyYW1lLmZsYWdzID0gSUVURl9NUEFfRkxBR1NfQ1JDIHwgSUVURl9NUEFfRkxBR1NfUkVKRUNUOwotCi0JcmV0dXJuIGNtX2NvcmUtPmFwaS0+cmVqZWN0KGNtX2NvcmUsICZjbV9ub2RlLT5tcGFfZnJhbWUsIGNtX25vZGUpOworCXJldHVybiBjbV9jb3JlLT5hcGktPnJlamVjdChjbV9jb3JlLCBjbV9ub2RlKTsKIH0KIAogCkBAIC0zMDUyLDcgKzMyODMsNyBAQAogCW5lc3ZuaWMgPSB0b19uZXN2bmljKG5lc3FwLT5pYnFwLmRldmljZSk7CiAJaWYgKCFuZXN2bmljKQogCQlyZXR1cm4gLUVJTlZBTDsKLQluZXNkZXYgID0gbmVzdm5pYy0+bmVzZGV2OworCW5lc2RldiA9IG5lc3ZuaWMtPm5lc2RldjsKIAlpZiAoIW5lc2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTMwNjAsMTIgKzMyOTEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIlFQJXUsIGN1cnJlbnQgSVAgPSAweCUwOFgsIERlc3RpbmF0aW9uIElQID0gIgotCQkiMHglMDhYOjB4JTA0WCwgbG9jYWwgPSAweCUwOFg6MHglMDRYLlxuIiwgbmVzcXAtPmh3cXAucXBfaWQsCi0JCW50b2hsKG5lc3ZuaWMtPmxvY2FsX2lwYWRkciksCi0JCW50b2hsKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpLAotCQludG9ocyhjbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQpLAotCQludG9obChjbV9pZC0+bG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIpLAotCQludG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCkpOworCQkgICIweCUwOFg6MHglMDRYLCBsb2NhbCA9IDB4JTA4WDoweCUwNFguXG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwKKwkJICBudG9obChuZXN2bmljLT5sb2NhbF9pcGFkZHIpLAorCQkgIG50b2hsKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkgIG50b2hzKGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fcG9ydCksCisJCSAgbnRvaGwoY21faWQtPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyKSwKKwkJICBudG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCkpOwogCiAJYXRvbWljX2luYygmY21fY29ubmVjdHMpOwogCW5lc3FwLT5hY3RpdmVfY29ubiA9IDE7CkBAIC0zMDc5LDEyICszMzEwLDEyIEBACiAJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmlyZF9vcmRfc2l6ZXMgfD0gY3B1X3RvX2xlMzIoKHUzMiljb25uX3BhcmFtLT5vcmQpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAicmVxdWVzdGVkIG9yZCA9IDB4JTA4WC5cbiIsICh1MzIpY29ubl9wYXJhbS0+b3JkKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgIm1wYSBwcml2YXRlIGRhdGEgbGVuID0ldVxuIiwKLQkJY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7CisJCSAgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbik7CiAKIAlpZiAoY21faWQtPmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyICE9Ci0JCWNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKKwkgICAgY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcikgewogCQluZXNfbWFuYWdlX2FwYnZ0KG5lc3ZuaWMsIG50b2hzKGNtX2lkLT5sb2NhbF9hZGRyLnNpbl9wb3J0KSwKLQkJCVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbiksIE5FU19NQU5BR0VfQVBCVlRfQUREKTsKKwkJCQkgUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSwgTkVTX01BTkFHRV9BUEJWVF9BREQpOwogCQlhcGJ2dF9zZXQgPSAxOwogCX0KIApAQCAtMzEwMCwxMyArMzMzMSwxMyBAQAogCiAJLyogY3JlYXRlIGEgY29ubmVjdCBDTSBub2RlIGNvbm5lY3Rpb24gKi8KIAljbV9ub2RlID0gZ19jbV9jb3JlLT5hcGktPmNvbm5lY3QoZ19jbV9jb3JlLCBuZXN2bmljLAotCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuLCAodm9pZCAqKWNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YSwKLQkJJmNtX2luZm8pOworCQkJCQkgIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW4sICh2b2lkICopY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLAorCQkJCQkgICZjbV9pbmZvKTsKIAlpZiAoIWNtX25vZGUpIHsKIAkJaWYgKGFwYnZ0X3NldCkKIAkJCW5lc19tYW5hZ2VfYXBidnQobmVzdm5pYywgbnRvaHMoY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQpLAotCQkJCVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbiksCi0JCQkJTkVTX01BTkFHRV9BUEJWVF9ERUwpOworCQkJCQkgUENJX0ZVTkMobmVzZGV2LT5wY2lkZXYtPmRldmZuKSwKKwkJCQkJIE5FU19NQU5BR0VfQVBCVlRfREVMKTsKIAogCQljbV9pZC0+cmVtX3JlZihjbV9pZCk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMzE1Niw3ICszMzg3LDcgQEAKIAljbV9ub2RlID0gZ19jbV9jb3JlLT5hcGktPmxpc3RlbihnX2NtX2NvcmUsIG5lc3ZuaWMsICZjbV9pbmZvKTsKIAlpZiAoIWNtX25vZGUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc1sldV0gRXJyb3IgcmV0dXJuZWQgZnJvbSBsaXN0ZW4gQVBJIGNhbGxcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzE2NCwxMiArMzM5NSwxMiBAQAogCiAJaWYgKCFjbV9ub2RlLT5yZXVzZWRfbm9kZSkgewogCQllcnIgPSBuZXNfbWFuYWdlX2FwYnZ0KG5lc3ZuaWMsCi0JCQludG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCksCi0JCQlQQ0lfRlVOQyhuZXN2bmljLT5uZXNkZXYtPnBjaWRldi0+ZGV2Zm4pLAotCQkJTkVTX01BTkFHRV9BUEJWVF9BREQpOworCQkJCSAgICAgICBudG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCksCisJCQkJICAgICAgIFBDSV9GVU5DKG5lc3ZuaWMtPm5lc2Rldi0+cGNpZGV2LT5kZXZmbiksCisJCQkJICAgICAgIE5FU19NQU5BR0VfQVBCVlRfQUREKTsKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJuZXNfbWFuYWdlX2FwYnZ0IGNhbGwgcmV0dXJuZWQgJWQuXG4iLAotCQkJCWVycik7CisJCQkgICAgICAgZXJyKTsKIAkJCWdfY21fY29yZS0+YXBpLT5zdG9wX2xpc3RlbmVyKGdfY21fY29yZSwgKHZvaWQgKiljbV9ub2RlKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTMyMDYsMTMgKzM0MzcsMTMgQEAKIGludCBuZXNfY21fcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2aWNlKQogewogCWludCByYyA9IDA7CisKIAljbV9wYWNrZXRzX3JlY2VpdmVkKys7Ci0JaWYgKChnX2NtX2NvcmUpICYmIChnX2NtX2NvcmUtPmFwaSkpIHsKKwlpZiAoKGdfY21fY29yZSkgJiYgKGdfY21fY29yZS0+YXBpKSkKIAkJcmMgPSBnX2NtX2NvcmUtPmFwaS0+cmVjdl9wa3QoZ19jbV9jb3JlLCBuZXRkZXZfcHJpdihuZXRkZXZpY2UpLCBza2IpOwotCX0gZWxzZSB7CisJZWxzZQogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIlVuYWJsZSB0byBwcm9jZXNzIHBhY2tldCBmb3IgQ00sIgotCQkJCSIgY20gaXMgbm90IHNldHVwIHByb3Blcmx5LlxuIik7Ci0JfQorCQkJICAiIGNtIGlzIG5vdCBzZXR1cCBwcm9wZXJseS5cbiIpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMzIyNywxMSArMzQ1OCwxMCBAQAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiXG4iKTsKIAkvKiBjcmVhdGUgdGhlIHByaW1hcnkgQ00gY29yZSwgcGFzcyB0aGlzIGhhbmRsZSB0byBzdWJzZXF1ZW50IGNvcmUgaW5pdHMgKi8KIAlnX2NtX2NvcmUgPSBuZXNfY21fYWxsb2NfY29yZSgpOwotCWlmIChnX2NtX2NvcmUpIHsKKwlpZiAoZ19jbV9jb3JlKQogCQlyZXR1cm4gMDsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogfQogCiAKQEAgLTMyNTIsNyArMzQ4Miw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNtX2V2ZW50X2Nvbm5lY3RlZChzdHJ1Y3QgbmVzX2NtX2V2ZW50ICpldmVudCkKIHsKLQl1NjQgdTY0dGVtcDsKIAlzdHJ1Y3QgbmVzX3FwICpuZXNxcDsKIAlzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWM7CiAJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldjsKQEAgLTMyNjEsNyArMzQ5MCw2IEBACiAJc3RydWN0IGliX3FwX2F0dHIgYXR0cjsKIAlzdHJ1Y3QgaXdfY21faWQgKmNtX2lkOwogCXN0cnVjdCBpd19jbV9ldmVudCBjbV9ldmVudDsKLQlzdHJ1Y3QgbmVzX2h3X3FwX3dxZSAqd3FlOwogCXN0cnVjdCBuZXNfdjRfcXVhZCBuZXNfcXVhZDsKIAl1MzIgY3JjX3ZhbHVlOwogCWludCByZXQ7CkBAIC0zMjc1LDE3ICszNTAzLDE2IEBACiAJbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwogCW5lc2FkYXB0ZXIgPSBuZXNkZXYtPm5lc2FkYXB0ZXI7CiAKLQlpZiAobmVzcXAtPmRlc3Ryb3llZCkgeworCWlmIChuZXNxcC0+ZGVzdHJveWVkKQogCQlyZXR1cm47Ci0JfQogCWF0b21pY19pbmMoJmNtX2Nvbm5lY3RlZHMpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUVAldSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gIDB4JTA4WDoweCUwNFggb24iCi0JCQkiIGxvY2FsIHBvcnQgMHglMDRYLiBqaWZmaWVzID0gJWx1LlxuIiwKLQkJCW5lc3FwLT5od3FwLnFwX2lkLAotCQkJbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCQludG9ocyhjbV9pZC0+cmVtb3RlX2FkZHIuc2luX3BvcnQpLAotCQkJbnRvaHMoY21faWQtPmxvY2FsX2FkZHIuc2luX3BvcnQpLAotCQkJamlmZmllcyk7CisJCSAgIiBsb2NhbCBwb3J0IDB4JTA0WC4gamlmZmllcyA9ICVsdS5cbiIsCisJCSAgbmVzcXAtPmh3cXAucXBfaWQsCisJCSAgbnRvaGwoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCSAgbnRvaHMoY21faWQtPnJlbW90ZV9hZGRyLnNpbl9wb3J0KSwKKwkJICBudG9ocyhjbV9pZC0+bG9jYWxfYWRkci5zaW5fcG9ydCksCisJCSAgamlmZmllcyk7CiAKIAluZXNfY21faW5pdF90c2FfY29ubihuZXNxcCwgY21fbm9kZSk7CiAKQEAgLTMzMTYsNDAgKzM1NDMsMTIgQEAKIAkJCU5FU19RUENPTlRFWFRfT1JESVJEX0lXQVJQX01PREVfU0hJRlQpOwogCiAJLyogQWRqdXN0IHRhaWwgZm9yIG5vdCBoYXZpbmcgYSBMU01NICovCi0JbmVzcXAtPmh3cXAuc3FfdGFpbCA9IDE7CisJLypuZXNxcC0+aHdxcC5zcV90YWlsID0gMTsqLwogCi0jaWYgZGVmaW5lZChORVNfU0VORF9GSVJTVF9XUklURSkKLQlpZiAoY21fbm9kZS0+c2VuZF93cml0ZTApIHsKLQkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJTZW5kaW5nIGZpcnN0IHdyaXRlLlxuIik7Ci0JCXdxZSA9ICZuZXNxcC0+aHdxcC5zcV92YmFzZVswXTsKLQkJdTY0dGVtcCA9ICh1bnNpZ25lZCBsb25nKW5lc3FwOwotCQl1NjR0ZW1wIHw9IE5FU19TV19DT05URVhUX0FMSUdOPj4xOwotCQlzZXRfd3FlXzY0Yml0X3ZhbHVlKHdxZS0+d3FlX3dvcmRzLAotCQkJCU5FU19JV0FSUF9TUV9XUUVfQ09NUF9DVFhfTE9XX0lEWCwgdTY0dGVtcCk7Ci0JCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfTUlTQ19JRFhdID0KLQkJCWNwdV90b19sZTMyKE5FU19JV0FSUF9TUV9PUF9SRE1BVyk7Ci0JCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfVE9UQUxfUEFZTE9BRF9JRFhdID0gMDsKLQkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9GUkFHMF9MT1dfSURYXSA9IDA7Ci0JCXdxZS0+d3FlX3dvcmRzW05FU19JV0FSUF9TUV9XUUVfRlJBRzBfSElHSF9JRFhdID0gMDsKLQkJd3FlLT53cWVfd29yZHNbTkVTX0lXQVJQX1NRX1dRRV9MRU5HVEgwX0lEWF0gPSAwOwotCQl3cWUtPndxZV93b3Jkc1tORVNfSVdBUlBfU1FfV1FFX1NUQUcwX0lEWF0gPSAwOworCWJ1aWxkX3JkbWEwX21zZyhjbV9ub2RlLCAmbmVzcXApOwogCi0JCWlmIChuZXNxcC0+c3Ffa21hcHBlZCkgewotCQkJbmVzcXAtPnNxX2ttYXBwZWQgPSAwOwotCQkJa3VubWFwKG5lc3FwLT5wYWdlKTsKLQkJfQotCi0JCS8qIHVzZSB0aGUgcmVzZXJ2ZWQgc3BvdCBvbiB0aGUgV1EgZm9yIHRoZSBleHRyYSBmaXJzdCBXUUUgKi8KLQkJbmVzcXAtPm5lc3FwX2NvbnRleHQtPmlyZF9vcmRfc2l6ZXMgJj0KLQkJCWNwdV90b19sZTMyKH4oTkVTX1FQQ09OVEVYVF9PUkRJUkRfTFNNTV9QUkVTRU5UIHwKLQkJCQkJCU5FU19RUENPTlRFWFRfT1JESVJEX1dSUERVIHwKLQkJCQkJCU5FU19RUENPTlRFWFRfT1JESVJEX0FMU01NKSk7Ci0JCW5lc3FwLT5za2lwX2xzbW0gPSAxOwotCQluZXNxcC0+aHdxcC5zcV90YWlsID0gMDsKLQkJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX1dRRV9BTExPQywKLQkJCQkoMSA8PCAyNCkgfCAweDAwODAwMDAwIHwgbmVzcXAtPmh3cXAucXBfaWQpOwotCX0KLSNlbmRpZgorCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsCisJCSAgICAoMSA8PCAyNCkgfCAweDAwODAwMDAwIHwgbmVzcXAtPmh3cXAucXBfaWQpOwogCiAJbWVtc2V0KCZuZXNfcXVhZCwgMCwgc2l6ZW9mKG5lc19xdWFkKSk7CiAKQEAgLTMzNjYsMTMgKzM1NjUsMTMgQEAKIAljcmNfdmFsdWUgPSBnZXRfY3JjX3ZhbHVlKCZuZXNfcXVhZCk7CiAJbmVzcXAtPmh0ZV9pbmRleCA9IGNwdV90b19iZTMyKGNyY192YWx1ZSBeIDB4ZmZmZmZmZmYpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiSFRFIEluZGV4ID0gMHglMDhYLCBBZnRlciBDUkMgPSAweCUwOFhcbiIsCi0JCQluZXNxcC0+aHRlX2luZGV4LCBuZXNxcC0+aHRlX2luZGV4ICYgbmVzYWRhcHRlci0+aHRlX2luZGV4X21hc2spOworCQkgIG5lc3FwLT5odGVfaW5kZXgsIG5lc3FwLT5odGVfaW5kZXggJiBuZXNhZGFwdGVyLT5odGVfaW5kZXhfbWFzayk7CiAKIAluZXNxcC0+aHRlX2luZGV4ICY9IG5lc2FkYXB0ZXItPmh0ZV9pbmRleF9tYXNrOwogCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5odGVfaW5kZXggPSBjcHVfdG9fbGUzMihuZXNxcC0+aHRlX2luZGV4KTsKIAogCW5lc3FwLT5pZXRmX2ZyYW1lID0gJmNtX25vZGUtPm1wYV9mcmFtZTsKLQluZXNxcC0+cHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCkgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CisJbmVzcXAtPnByaXZhdGVfZGF0YV9sZW4gPSAodTgpY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CiAJY21fbm9kZS0+Y21fY29yZS0+YXBpLT5hY2NlbGVyYXRlZChjbV9ub2RlLT5jbV9jb3JlLCBjbV9ub2RlKTsKIAogCS8qIG5vdGlmeSBPRiBsYXllciB3ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB0aGUgcmVxdWVzdGVkIGNvbm5lY3Rpb24gKi8KQEAgLTMzODQsNyArMzU4Myw5IEBACiAJY21fZXZlbnQucmVtb3RlX2FkZHIgPSBjbV9pZC0+cmVtb3RlX2FkZHI7CiAKIAljbV9ldmVudC5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWV2ZW50LT5jbV9ub2RlLT5tcGFfZnJhbWVfYnVmOwotCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAodTgpIGV2ZW50LT5jbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0gKHU4KWV2ZW50LT5jbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwljbV9ldmVudC5pcmQgPSBjbV9ub2RlLT5pcmRfc2l6ZTsKKwljbV9ldmVudC5vcmQgPSBjbV9ub2RlLT5vcmRfc2l6ZTsKIAogCWNtX2V2ZW50LmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID0gZXZlbnQtPmNtX2luZm8ucmVtX2FkZHI7CiAJcmV0ID0gY21faWQtPmV2ZW50X2hhbmRsZXIoY21faWQsICZjbV9ldmVudCk7CkBAIC0zMzkyLDEyICszNTkzLDEyIEBACiAKIAlpZiAocmV0KQogCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XSBPRkEgQ00gZXZlbnRfaGFuZGxlciByZXR1cm5lZCwgIgotCQkJInJldD0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXQpOworCQkgICAgICAgInJldD0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCWF0dHIucXBfc3RhdGUgPSBJQl9RUFNfUlRTOwogCW5lc19tb2RpZnlfcXAoJm5lc3FwLT5pYnFwLCAmYXR0ciwgSUJfUVBfU1RBVEUsIE5VTEwpOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJFeGl0aW5nIGNvbm5lY3QgdGhyZWFkIGZvciBRUCV1LiBqaWZmaWVzID0gIgotCQkiJWx1XG4iLCBuZXNxcC0+aHdxcC5xcF9pZCwgamlmZmllcyk7CisJCSAgIiVsdVxuIiwgbmVzcXAtPmh3cXAucXBfaWQsIGppZmZpZXMpOwogCiAJcmV0dXJuOwogfQpAQCAtMzQxOCwxNiArMzYxOSwxNCBAQAogCQlyZXR1cm47CiAKIAljbV9pZCA9IGV2ZW50LT5jbV9ub2RlLT5jbV9pZDsKLQlpZiAoIWNtX2lkKSB7CisJaWYgKCFjbV9pZCkKIAkJcmV0dXJuOwotCX0KIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZT0lcCwgY21faWQ9JXBcbiIsIGV2ZW50LT5jbV9ub2RlLCBjbV9pZCk7CiAJbmVzcXAgPSBjbV9pZC0+cHJvdmlkZXJfZGF0YTsKIAotCWlmICghbmVzcXApIHsKKwlpZiAoIW5lc3FwKQogCQlyZXR1cm47Ci0JfQogCiAJLyogbm90aWZ5IE9GIGxheWVyIGFib3V0IHRoaXMgY29ubmVjdGlvbiBlcnJvciBldmVudCAqLwogCS8qIGNtX2lkLT5yZW1fcmVmKGNtX2lkKTsgKi8KQEAgLTM0NDIsMTQgKzM2NDEsMTQgQEAKIAljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuID0gMDsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY2FsbCBDTV9FVkVOVCBSRUpFQ1RFRCwgbG9jYWxfYWRkcj0lMDh4LCAiCi0JCSJyZW1vdmVfYWRkcj0lMDh4XG4iLCBjbV9ldmVudC5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkciwKLQkJY21fZXZlbnQucmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKKwkJICAicmVtb3ZlX2FkZHI9JTA4eFxuIiwgY21fZXZlbnQubG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIsCisJCSAgY21fZXZlbnQucmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKIAogCXJldCA9IGNtX2lkLT5ldmVudF9oYW5kbGVyKGNtX2lkLCAmY21fZXZlbnQpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiT0ZBIENNIGV2ZW50X2hhbmRsZXIgcmV0dXJuZWQsIHJldD0lZFxuIiwgcmV0KTsKIAlpZiAocmV0KQogCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XSBPRkEgQ00gZXZlbnRfaGFuZGxlciByZXR1cm5lZCwgIgotCQkJInJldD0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXQpOworCQkgICAgICAgInJldD0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCWNtX2lkLT5yZW1fcmVmKGNtX2lkKTsKIAogCXJlbV9yZWZfY21fbm9kZShldmVudC0+Y21fbm9kZS0+Y21fY29yZSwgZXZlbnQtPmNtX25vZGUpOwpAQCAtMzUxOSw3ICszNzE4LDcgQEAKICAqLwogc3RhdGljIHZvaWQgY21fZXZlbnRfbXBhX3JlcShzdHJ1Y3QgbmVzX2NtX2V2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgaXdfY21faWQgICAqY21faWQ7CisJc3RydWN0IGl3X2NtX2lkICpjbV9pZDsKIAlzdHJ1Y3QgaXdfY21fZXZlbnQgY21fZXZlbnQ7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGU7CkBAIC0zNTMxLDcgKzM3MzAsNyBAQAogCiAJYXRvbWljX2luYygmY21fY29ubmVjdF9yZXFzKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGUgPSAlcCAtIGNtX2lkID0gJXAsIGppZmZpZXMgPSAlbHVcbiIsCi0JCQljbV9ub2RlLCBjbV9pZCwgamlmZmllcyk7CisJCSAgY21fbm9kZSwgY21faWQsIGppZmZpZXMpOwogCiAJY21fZXZlbnQuZXZlbnQgPSBJV19DTV9FVkVOVF9DT05ORUNUX1JFUVVFU1Q7CiAJY21fZXZlbnQuc3RhdHVzID0gMDsKQEAgLTM1NDUsMTkgKzM3NDQsMjEgQEAKIAljbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fcG9ydCA9IGh0b25zKGV2ZW50LT5jbV9pbmZvLnJlbV9wb3J0KTsKIAljbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChldmVudC0+Y21faW5mby5yZW1fYWRkcik7CiAJY21fZXZlbnQucHJpdmF0ZV9kYXRhID0gY21fbm9kZS0+bXBhX2ZyYW1lX2J1ZjsKLQljbV9ldmVudC5wcml2YXRlX2RhdGFfbGVuICA9ICh1OCkgY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CisJY21fZXZlbnQucHJpdmF0ZV9kYXRhX2xlbiA9ICh1OCljbV9ub2RlLT5tcGFfZnJhbWVfc2l6ZTsKKwljbV9ldmVudC5pcmQgPSBjbV9ub2RlLT5pcmRfc2l6ZTsKKwljbV9ldmVudC5vcmQgPSBjbV9ub2RlLT5vcmRfc2l6ZTsKIAogCXJldCA9IGNtX2lkLT5ldmVudF9oYW5kbGVyKGNtX2lkLCAmY21fZXZlbnQpOwogCWlmIChyZXQpCiAJCXByaW50ayhLRVJOX0VSUiAiJXNbJXVdIE9GQSBDTSBldmVudF9oYW5kbGVyIHJldHVybmVkLCByZXQ9JWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQpOworCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXQpOwogCXJldHVybjsKIH0KIAogCiBzdGF0aWMgdm9pZCBjbV9ldmVudF9tcGFfcmVqZWN0KHN0cnVjdCBuZXNfY21fZXZlbnQgKmV2ZW50KQogewotCXN0cnVjdCBpd19jbV9pZCAgICpjbV9pZDsKKwlzdHJ1Y3QgaXdfY21faWQgKmNtX2lkOwogCXN0cnVjdCBpd19jbV9ldmVudCBjbV9ldmVudDsKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgKmNtX25vZGU7CiAJaW50IHJldDsKQEAgLTM1NjksNyArMzc3MCw3IEBACiAKIAlhdG9taWNfaW5jKCZjbV9jb25uZWN0X3JlcXMpOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiY21fbm9kZSA9ICVwIC0gY21faWQgPSAlcCwgamlmZmllcyA9ICVsdVxuIiwKLQkJCWNtX25vZGUsIGNtX2lkLCBqaWZmaWVzKTsKKwkJICBjbV9ub2RlLCBjbV9pZCwgamlmZmllcyk7CiAKIAljbV9ldmVudC5ldmVudCA9IElXX0NNX0VWRU5UX0NPTk5FQ1RfUkVQTFk7CiAJY21fZXZlbnQuc3RhdHVzID0gLUVDT05OUkVGVVNFRDsKQEAgLTM1ODQsMTcgKzM3ODUsMTcgQEAKIAljbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChldmVudC0+Y21faW5mby5yZW1fYWRkcik7CiAKIAljbV9ldmVudC5wcml2YXRlX2RhdGEgPSBjbV9ub2RlLT5tcGFfZnJhbWVfYnVmOwotCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAodTgpIGNtX25vZGUtPm1wYV9mcmFtZV9zaXplOworCWNtX2V2ZW50LnByaXZhdGVfZGF0YV9sZW4gPSAodTgpY21fbm9kZS0+bXBhX2ZyYW1lX3NpemU7CiAKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImNhbGwgQ01fRVZFTlRfTVBBX1JFSkVDVEVELCBsb2NhbF9hZGRyPSUwOHgsICIKLQkJCSJyZW1vdmVfYWRkcj0lMDh4XG4iLAotCQkJY21fZXZlbnQubG9jYWxfYWRkci5zaW5fYWRkci5zX2FkZHIsCi0JCQljbV9ldmVudC5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpOworCQkgICJyZW1vdmVfYWRkcj0lMDh4XG4iLAorCQkgIGNtX2V2ZW50LmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyLAorCQkgIGNtX2V2ZW50LnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcik7CiAKIAlyZXQgPSBjbV9pZC0+ZXZlbnRfaGFuZGxlcihjbV9pZCwgJmNtX2V2ZW50KTsKIAlpZiAocmV0KQogCQlwcmludGsoS0VSTl9FUlIgIiVzWyV1XSBPRkEgQ00gZXZlbnRfaGFuZGxlciByZXR1cm5lZCwgcmV0PSVkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmV0KTsKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmV0KTsKIAogCXJldHVybjsKIH0KQEAgLTM2MTMsNyArMzgxNCw3IEBACiAJZXZlbnQtPmNtX2luZm8uY21faWQtPmFkZF9yZWYoZXZlbnQtPmNtX2luZm8uY21faWQpOwogCUlOSVRfV09SSygmZXZlbnQtPmV2ZW50X3dvcmssIG5lc19jbV9ldmVudF9oYW5kbGVyKTsKIAluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGU9JXAgcXVldWVfd29yaywgZXZlbnQ9JXBcbiIsCi0JCWV2ZW50LT5jbV9ub2RlLCBldmVudCk7CisJCSAgZXZlbnQtPmNtX25vZGUsIGV2ZW50KTsKIAogCXF1ZXVlX3dvcmsoZXZlbnQtPmNtX25vZGUtPmNtX2NvcmUtPmV2ZW50X3dxLCAmZXZlbnQtPmV2ZW50X3dvcmspOwogCkBAIC0zNjMwLDcgKzM4MzEsNyBAQAogc3RhdGljIHZvaWQgbmVzX2NtX2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBuZXNfY21fZXZlbnQgKmV2ZW50ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZXNfY21fZXZlbnQsCi0JCQlldmVudF93b3JrKTsKKwkJCQkJCSAgZXZlbnRfd29yayk7CiAJc3RydWN0IG5lc19jbV9jb3JlICpjbV9jb3JlOwogCiAJaWYgKCghZXZlbnQpIHx8ICghZXZlbnQtPmNtX25vZGUpIHx8ICghZXZlbnQtPmNtX25vZGUtPmNtX2NvcmUpKQpAQCAtMzYzOCwyOSArMzgzOSwyOSBAQAogCiAJY21fY29yZSA9IGV2ZW50LT5jbV9ub2RlLT5jbV9jb3JlOwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiZXZlbnQ9JXAsIGV2ZW50LT50eXBlPSV1LCBldmVudHMgcG9zdGVkPSV1XG4iLAotCQlldmVudCwgZXZlbnQtPnR5cGUsIGF0b21pY19yZWFkKCZjbV9jb3JlLT5ldmVudHNfcG9zdGVkKSk7CisJCSAgZXZlbnQsIGV2ZW50LT50eXBlLCBhdG9taWNfcmVhZCgmY21fY29yZS0+ZXZlbnRzX3Bvc3RlZCkpOwogCiAJc3dpdGNoIChldmVudC0+dHlwZSkgewogCWNhc2UgTkVTX0NNX0VWRU5UX01QQV9SRVE6CiAJCWNtX2V2ZW50X21wYV9yZXEoZXZlbnQpOwogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGU9JXAgQ00gRXZlbnQ6IE1QQSBSRVFVRVNUXG4iLAotCQkJZXZlbnQtPmNtX25vZGUpOworCQkJICBldmVudC0+Y21fbm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX0VWRU5UX1JFU0VUOgogCQluZXNfZGVidWcoTkVTX0RCR19DTSwgImNtX25vZGUgPSAlcCBDTSBFdmVudDogUkVTRVRcbiIsCi0JCQlldmVudC0+Y21fbm9kZSk7CisJCQkgIGV2ZW50LT5jbV9ub2RlKTsKIAkJY21fZXZlbnRfcmVzZXQoZXZlbnQpOwogCQlicmVhazsKIAljYXNlIE5FU19DTV9FVkVOVF9DT05ORUNURUQ6CiAJCWlmICgoIWV2ZW50LT5jbV9ub2RlLT5jbV9pZCkgfHwKLQkJCShldmVudC0+Y21fbm9kZS0+c3RhdGUgIT0gTkVTX0NNX1NUQVRFX1RTQSkpCisJCSAgICAoZXZlbnQtPmNtX25vZGUtPnN0YXRlICE9IE5FU19DTV9TVEFURV9UU0EpKQogCQkJYnJlYWs7CiAJCWNtX2V2ZW50X2Nvbm5lY3RlZChldmVudCk7CiAJCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiQ00gRXZlbnQ6IENPTk5FQ1RFRFxuIik7CiAJCWJyZWFrOwogCWNhc2UgTkVTX0NNX0VWRU5UX01QQV9SRUpFQ1Q6CiAJCWlmICgoIWV2ZW50LT5jbV9ub2RlLT5jbV9pZCkgfHwKLQkJCQkoZXZlbnQtPmNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9UU0EpKQorCQkgICAgKGV2ZW50LT5jbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfVFNBKSkKIAkJCWJyZWFrOwogCQljbV9ldmVudF9tcGFfcmVqZWN0KGV2ZW50KTsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJDTSBFdmVudDogUkVKRUNUXG4iKTsKQEAgLTM2NjgsNyArMzg2OSw3IEBACiAKIAljYXNlIE5FU19DTV9FVkVOVF9BQk9SVEVEOgogCQlpZiAoKCFldmVudC0+Y21fbm9kZS0+Y21faWQpIHx8Ci0JCQkoZXZlbnQtPmNtX25vZGUtPnN0YXRlID09IE5FU19DTV9TVEFURV9UU0EpKQorCQkgICAgKGV2ZW50LT5jbV9ub2RlLT5zdGF0ZSA9PSBORVNfQ01fU1RBVEVfVFNBKSkKIAkJCWJyZWFrOwogCQljbV9ldmVudF9jb25uZWN0X2Vycm9yKGV2ZW50KTsKIAkJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJDTSBFdmVudDogQUJPUlRFRFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uaAppbmRleCBkOTgyNWZkLi5iZGZhMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmgKQEAgLTQ4LDcgKzQ4LDE2IEBACiAjZGVmaW5lIElFVEZfTVBBX0tFWV9TSVpFIDE2CiAjZGVmaW5lIElFVEZfTVBBX1ZFUlNJT04gIDEKICNkZWZpbmUgSUVURl9NQVhfUFJJVl9EQVRBX0xFTiA1MTIKLSNkZWZpbmUgSUVURl9NUEFfRlJBTUVfU0laRSAgICAgMjAKKyNkZWZpbmUgSUVURl9NUEFfRlJBTUVfU0laRSAgICAyMAorI2RlZmluZSBJRVRGX1JUUl9NU0dfU0laRSAgICAgIDQKKyNkZWZpbmUgSUVURl9NUEFfVjJfRkxBRyAgICAgICAweDEwCisKKy8qIElFVEYgUlRSIE1TRyBGaWVsZHMgICAgICAgICAgICAgICAqLworI2RlZmluZSBJRVRGX1BFRVJfVE9fUEVFUiAgICAgICAweDgwMDAKKyNkZWZpbmUgSUVURl9GTFBEVV9aRVJPX0xFTiAgICAgMHg0MDAwCisjZGVmaW5lIElFVEZfUkRNQTBfV1JJVEUgICAgICAgIDB4ODAwMAorI2RlZmluZSBJRVRGX1JETUEwX1JFQUQgICAgICAgICAweDQwMDAKKyNkZWZpbmUgSUVURl9OT19JUkRfT1JEICAgICAgICAgMHgzRkZGCiAKIGVudW0gaWV0Zl9tcGFfZmxhZ3MgewogCUlFVEZfTVBBX0ZMQUdTX01BUktFUlMgPSAweDgwLAkvKiByZWNlaXZlIE1hcmtlcnMgKi8KQEAgLTU2LDcgKzY1LDcgQEAKIAlJRVRGX01QQV9GTEFHU19SRUpFQ1QgID0gMHgyMCwJLyogUmVqZWN0ICovCiB9OwogCi1zdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUgeworc3RydWN0IGlldGZfbXBhX3YxIHsKIAl1OCBrZXlbSUVURl9NUEFfS0VZX1NJWkVdOwogCXU4IGZsYWdzOwogCXU4IHJldjsKQEAgLTY2LDYgKzc1LDIwIEBACiAKICNkZWZpbmUgaWV0Zl9tcGFfcmVxX3Jlc3BfZnJhbWUgaWV0Zl9tcGFfZnJhbWUKIAorc3RydWN0IGlldGZfcnRyX21zZyB7CisJX19iZTE2IGN0cmxfaXJkOworCV9fYmUxNiBjdHJsX29yZDsKK307CisKK3N0cnVjdCBpZXRmX21wYV92MiB7CisJdTgga2V5W0lFVEZfTVBBX0tFWV9TSVpFXTsKKwl1OCBmbGFnczsKKwl1OCByZXY7CisJIF9fYmUxNiBwcml2X2RhdGFfbGVuOworCXN0cnVjdCBpZXRmX3J0cl9tc2cgcnRyX21zZzsKKwl1OCBwcml2X2RhdGFbMF07Cit9OworCiBzdHJ1Y3QgbmVzX3Y0X3F1YWQgewogCXUzMiByc3ZkMDsKIAlfX2xlMzIgRHN0SXBBZHJJbmRleDsJLyogT25seSBtb3N0IHNpZ25pZmljYW50IDUgYml0cyBhcmUgdmFsaWQgKi8KQEAgLTE3MSw4ICsxOTQsNyBAQAogCiAjZGVmaW5lIE5FU19DTV9ERUZfU0VRMiAgICAgIDB4MThlZDU3NDAKICNkZWZpbmUgTkVTX0NNX0RFRl9MT0NBTF9JRDIgMHhiODA3Ci0jZGVmaW5lCU1BWF9DTV9CVUZGRVIJKElFVEZfTVBBX0ZSQU1FX1NJWkUgKyBJRVRGX01BWF9QUklWX0RBVEFfTEVOKQotCisjZGVmaW5lCU1BWF9DTV9CVUZGRVIJKElFVEZfTVBBX0ZSQU1FX1NJWkUgKyBJRVRGX1JUUl9NU0dfU0laRSArIElFVEZfTUFYX1BSSVZfREFUQV9MRU4pCiAKIHR5cGVkZWYgdTMyIG5lc19hZGRyX3Q7CiAKQEAgLTIwNCw2ICsyMjYsMjEgQEAKIAlORVNfQ01fU1RBVEVfQ0xPU0VECiB9OwogCitlbnVtIG1wYV9mcmFtZV92ZXJzaW9uIHsKKwlJRVRGX01QQV9WMSA9IDEsCisJSUVURl9NUEFfVjIgPSAyCit9OworCitlbnVtIG1wYV9mcmFtZV9rZXkgeworCU1QQV9LRVlfUkVRVUVTVCwKKwlNUEFfS0VZX1JFUExZCit9OworCitlbnVtIHNlbmRfcmRtYTAgeworCVNFTkRfUkRNQV9SRUFEX1pFUk8gPSAxLAorCVNFTkRfUkRNQV9XUklURV9aRVJPID0gMgorfTsKKwogZW51bSBuZXNfdGNwaXBfcGt0X3R5cGUgewogCU5FU19QS1RfVFlQRV9VTktOT1dOLAogCU5FU19QS1RfVFlQRV9TWU4sCkBAIC0yNDUsOSArMjgyLDkgQEAKIAogCiBlbnVtIG5lc19jbV9saXN0ZW5lcl9zdGF0ZSB7Ci0JTkVTX0NNX0xJU1RFTkVSX1BBU1NJVkVfU1RBVEU9MSwKLQlORVNfQ01fTElTVEVORVJfQUNUSVZFX1NUQVRFPTIsCi0JTkVTX0NNX0xJU1RFTkVSX0VJVEhFUl9TVEFURT0zCisJTkVTX0NNX0xJU1RFTkVSX1BBU1NJVkVfU1RBVEUgPSAxLAorCU5FU19DTV9MSVNURU5FUl9BQ1RJVkVfU1RBVEUgPSAyLAorCU5FU19DTV9MSVNURU5FUl9FSVRIRVJfU1RBVEUgPSAzCiB9OwogCiBzdHJ1Y3QgbmVzX2NtX2xpc3RlbmVyIHsKQEAgLTI4MywxNiArMzIwLDIwIEBACiAKIAlzdHJ1Y3QgbmVzX2NtX25vZGUgICAgICAgICpsb29wYmFja3BhcnRuZXI7CiAKLQlzdHJ1Y3QgbmVzX3RpbWVyX2VudHJ5CSpzZW5kX2VudHJ5OwotCisJc3RydWN0IG5lc190aW1lcl9lbnRyeQkgICpzZW5kX2VudHJ5OworCXN0cnVjdCBuZXNfdGltZXJfZW50cnkgICAgKnJlY3ZfZW50cnk7CiAJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICByZXRyYW5zX2xpc3RfbG9jazsKLQlzdHJ1Y3QgbmVzX3RpbWVyX2VudHJ5ICAqcmVjdl9lbnRyeTsKKwllbnVtIHNlbmRfcmRtYTAgICAgICAgICAgIHNlbmRfcmRtYTBfb3A7CiAKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfd3JpdGUwOwogCXVuaW9uIHsKLQkJc3RydWN0IGlldGZfbXBhX2ZyYW1lIG1wYV9mcmFtZTsKLQkJdTggICAgICAgICAgICAgICAgICAgIG1wYV9mcmFtZV9idWZbTUFYX0NNX0JVRkZFUl07CisJCXN0cnVjdCBpZXRmX21wYV92MSBtcGFfZnJhbWU7CisJCXN0cnVjdCBpZXRmX21wYV92MiBtcGFfdjJfZnJhbWU7CisJCXU4ICAgICAgICAgICAgICAgICBtcGFfZnJhbWVfYnVmW01BWF9DTV9CVUZGRVJdOwogCX07CisJZW51bSBtcGFfZnJhbWVfdmVyc2lvbiAgICBtcGFfZnJhbWVfcmV2OworCXUxNgkJCSAgaXJkX3NpemU7CisJdTE2ICAgICAgICAgICAgICAgICAgICAgICBvcmRfc2l6ZTsKKwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgbXBhX2ZyYW1lX3NpemU7CiAJc3RydWN0IGl3X2NtX2lkICAgICAgICAgICAqY21faWQ7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICBsaXN0OwpAQCAtMzk5LDEwICs0NDAsOCBAQAogCQkJc3RydWN0IG5lc192bmljICosIHUxNiwgdm9pZCAqLAogCQkJc3RydWN0IG5lc19jbV9pbmZvICopOwogCWludCAoKmNsb3NlKShzdHJ1Y3QgbmVzX2NtX2NvcmUgKiwgc3RydWN0IG5lc19jbV9ub2RlICopOwotCWludCAoKmFjY2VwdCkoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBpZXRmX21wYV9mcmFtZSAqLAotCQkJc3RydWN0IG5lc19jbV9ub2RlICopOwotCWludCAoKnJlamVjdCkoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBpZXRmX21wYV9mcmFtZSAqLAotCQkJc3RydWN0IG5lc19jbV9ub2RlICopOworCWludCAoKmFjY2VwdCkoc3RydWN0IG5lc19jbV9jb3JlICosIHN0cnVjdCBuZXNfY21fbm9kZSAqKTsKKwlpbnQgKCpyZWplY3QpKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX2NtX25vZGUgKik7CiAJaW50ICgqcmVjdl9wa3QpKHN0cnVjdCBuZXNfY21fY29yZSAqLCBzdHJ1Y3QgbmVzX3ZuaWMgKiwKIAkJCXN0cnVjdCBza19idWZmICopOwogCWludCAoKmRlc3Ryb3lfY21fY29yZSkoc3RydWN0IG5lc19jbV9jb3JlICopOwpAQCAtNDIyLDUgKzQ2MSw3IEBACiBpbnQgbmVzX2NtX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiBpbnQgbmVzX2NtX3N0YXJ0KHZvaWQpOwogaW50IG5lc19jbV9zdG9wKHZvaWQpOworaW50IG5lc19hZGRfcmVmX2NtX25vZGUoc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlKTsKK2ludCBuZXNfcmVtX3JlZl9jbV9ub2RlKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSk7CiAKICNlbmRpZgkJCS8qIE5FU19DTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuYwppbmRleCBiZTM2Y2JlLi43YzBmZjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmMKQEAgLTExMCw2ICsxMTAsMTQgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2lwKHN0cnVjdCBuZXNfY21fbm9kZSAqY21fbm9kZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpyZW1fYWRkcjsKKwlpZiAoY21fbm9kZSkgeworCQlyZW1fYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJmNtX25vZGUtPnJlbV9hZGRyOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJSZW1vdGUgSVAgYWRkcjogJXBJNFxuIiwgcmVtX2FkZHIpOworCX0KK30KIAogLyoqCiAgKiBuZXNfbmljX2luaXRfdGltZXJfZGVmYXVsdHMKQEAgLTE1NTUsNiArMTU2Myw3IEBACiAJc3RydWN0IG5lc19od19uaWNfcnFfd3FlICpuaWNfcnFlOwogCXN0cnVjdCBuZXNfaHdfbmljICpuZXNuaWM7CiAJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOwogCXUzMiByeF93cWVzX3Bvc3RlZCA9IDA7CiAKIAluZXNuaWMgPSAmbmVzdm5pYy0+bmljOwpAQCAtMTU4MCw2ICsxNTg5LDkgQEAKIAogCQkJYnVzX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwKIAkJCQkJc2tiLT5kYXRhLCBuZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQkJY2ItPmJ1c2FkZHIgPSBidXNfYWRkcmVzczsKKwkJCWNiLT5tYXBsZW4gPSBuZXN2bmljLT5tYXhfZnJhbWVfc2l6ZTsKIAogCQkJbmljX3JxZSA9ICZuZXNuaWMtPnJxX3ZiYXNlW25lc3ZuaWMtPm5pYy5ycV9oZWFkXTsKIAkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfMV8wX0lEWF0gPQpAQCAtMTY2OSw2ICsxNjgxLDcgQEAKIAl1MzIgY3FwX2hlYWQ7CiAJdTMyIGNvdW50ZXI7CiAJdTMyIHdxZV9jb3VudDsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOwogCXU4IGp1bWJvbW9kZT0wOwogCiAJLyogQWxsb2NhdGUgZnJhZ21lbnQsIFNRLCBSUSwgYW5kIENROyBSZXVzZSBDRVEgYmFzZWQgb24gdGhlIFBDSSBmdW5jdGlvbiAqLwpAQCAtMTg0NSw2ICsxODU4LDkgQEAKIAogCQlwbWVtID0gcGNpX21hcF9zaW5nbGUobmVzZGV2LT5wY2lkZXYsIHNrYi0+ZGF0YSwKIAkJCQluZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCWNiLT5idXNhZGRyID0gcG1lbTsKKwkJY2ItPm1hcGxlbiA9IG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplOwogCiAJCW5pY19ycWUgPSAmbmVzdm5pYy0+bmljLnJxX3ZiYXNlW2NvdW50ZXJdOwogCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfTEVOR1RIXzFfMF9JRFhdID0gY3B1X3RvX2xlMzIobmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUpOwpAQCAtMTg3Myw2ICsxODg5LDEzIEBACiAJCQlqdW1ib21vZGUgPSAxOwogCQluZXNfbmljX2luaXRfdGltZXJfZGVmYXVsdHMobmVzZGV2LCBqdW1ib21vZGUpOwogCX0KKwlpZiAoKG5lc2Rldi0+bmVzYWRhcHRlci0+YWxsb3dfdW5hbGlnbmVkX2ZwZHVzKSAmJgorCQkobmVzX2luaXRfbWd0X3FwKG5lc2RldiwgbmV0ZGV2LCBuZXN2bmljKSkpIHsKKwkJCW5lc19kZWJ1ZyhORVNfREJHX0lOSVQsICIlczogT3V0IG9mIG1lbW9yeSBmb3IgcGF1IG5pY1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCW5lc19kZXN0cm95X25pY19xcChuZXN2bmljKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJbmVzdm5pYy0+bHJvX21nci5tYXhfYWdnciAgICAgICA9IG5lc19scm9fbWF4X2FnZ3I7CiAJbmVzdm5pYy0+bHJvX21nci5tYXhfZGVzYyAgICAgICA9IE5FU19NQVhfTFJPX0RFU0NSSVBUT1JTOwogCW5lc3ZuaWMtPmxyb19tZ3IubHJvX2FyciAgICAgICAgPSBuZXN2bmljLT5scm9fZGVzYzsKQEAgLTE4OTUsMjggKzE5MTgsMjkgQEAKIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwogCXN0cnVjdCBuZXNfaHdfY3FwX3dxZSAqY3FwX3dxZTsKIAlzdHJ1Y3QgbmVzX2h3X25pY19zcV93cWUgKm5pY19zcWU7Ci0Jc3RydWN0IG5lc19od19uaWNfcnFfd3FlICpuaWNfcnFlOwogCV9fbGUxNiAqd3FlX2ZyYWdtZW50X2xlbmd0aDsKIAl1MTYgIHdxZV9mcmFnbWVudF9pbmRleDsKLQl1NjQgd3FlX2ZyYWc7CiAJdTMyIGNxcF9oZWFkOwogCXUzMiB3cW1fY2ZnMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJc3RydWN0IG5lc19yc2tiX2NiICpjYjsKIAlpbnQgcmV0OwogCisJaWYgKG5lc2Rldi0+bmVzYWRhcHRlci0+YWxsb3dfdW5hbGlnbmVkX2ZwZHVzKQorCQluZXNfZGVzdHJveV9tZ3QobmVzdm5pYyk7CisKIAkvKiBjbGVhciB3cWUgc3RhbGwgYmVmb3JlIGRlc3Ryb3lpbmcgTklDIFFQICovCiAJd3FtX2NmZzAgPSBuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9XUU1fQ09ORklHMCk7CiAJbmVzX3dyaXRlX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1dRTV9DT05GSUcwLCB3cW1fY2ZnMCAmIDB4RkZGRjdGRkYpOwogCiAJLyogRnJlZSByZW1haW5pbmcgTklDIHJlY2VpdmUgYnVmZmVycyAqLwogCXdoaWxlIChuZXN2bmljLT5uaWMucnFfaGVhZCAhPSBuZXN2bmljLT5uaWMucnFfdGFpbCkgewotCQluaWNfcnFlICAgPSAmbmVzdm5pYy0+bmljLnJxX3ZiYXNlW25lc3ZuaWMtPm5pYy5ycV90YWlsXTsKLQkJd3FlX2ZyYWcgID0gKHU2NClsZTMyX3RvX2NwdSgKLQkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9GUkFHMF9MT1dfSURYXSk7Ci0JCXdxZV9mcmFnIHw9ICgodTY0KWxlMzJfdG9fY3B1KAotCQkJbmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0hJR0hfSURYXSkpPDwzMjsKLQkJcGNpX3VubWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgKGRtYV9hZGRyX3Qpd3FlX2ZyYWcsCi0JCQkJbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4X3NrYiA9IG5lc3ZuaWMtPm5pYy5yeF9za2JbbmVzdm5pYy0+bmljLnJxX3RhaWxdOworCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmcnhfc2tiLT5jYlswXTsKKwkJcGNpX3VubWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgY2ItPmJ1c2FkZHIsIGNiLT5tYXBsZW4sCisJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCiAJCWRldl9rZnJlZV9za2IobmVzdm5pYy0+bmljLnJ4X3NrYltuZXN2bmljLT5uaWMucnFfdGFpbCsrXSk7CiAJCW5lc3ZuaWMtPm5pYy5ycV90YWlsICY9IChuZXN2bmljLT5uaWMucnFfc2l6ZSAtIDEpOwogCX0KQEAgLTI3NzUsNiArMjc5OSw3IEBACiAJc3RydWN0IG5lc19od19uaWNfc3Ffd3FlICpuaWNfc3FlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOwogCV9fbGUxNiAqd3FlX2ZyYWdtZW50X2xlbmd0aDsKIAl1MzIgaGVhZDsKIAl1MzIgY3Ffc2l6ZTsKQEAgLTI4NTksNiArMjg4NCw4IEBACiAJCQkJYnVzX2FkZHJlc3MgKz0gKCh1NjQpbGUzMl90b19jcHUobmljX3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0hJR0hfSURYXSkpIDw8IDMyOwogCQkJCXBjaV91bm1hcF9zaW5nbGUobmVzZGV2LT5wY2lkZXYsIGJ1c19hZGRyZXNzLAogCQkJCQkJbmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnJ4X3NrYi0+Y2JbMF07CisJCQkJY2ItPmJ1c2FkZHIgPSAwOwogCQkJCS8qIHJ4X3NrYi0+dGFpbCA9IHJ4X3NrYi0+ZGF0YSArIHJ4X3BrdF9zaXplOyAqLwogCQkJCS8qIHJ4X3NrYi0+bGVuID0gcnhfcGt0X3NpemU7ICovCiAJCQkJcnhfc2tiLT5sZW4gPSAwOyAgLyogVE9ETzogc2VlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5ICovCkBAIC0yOTgzLDYgKzMwMTAsNyBAQAogfQogCiAKKwogLyoqCiAgKiBuZXNfY3FwX2NlX2hhbmRsZXIKICAqLwpAQCAtMjk5Nyw2ICszMDI1LDggQEAKIAl1MzIgY3Ffc2l6ZTsKIAl1MzIgY3FlX2NvdW50PTA7CiAJdTMyIGVycm9yX2NvZGU7CisJdTMyIG9wY29kZTsKKwl1MzIgY3R4X2luZGV4OwogCS8qIHUzMiBjb3VudGVyOyAqLwogCiAJaGVhZCA9IGNxLT5jcV9oZWFkOwpAQCAtMzAwNywxMiArMzAzNyw5IEBACiAJCS8qIG5lc19kZWJ1ZyhORVNfREJHX0NRUCwgImhlYWQ9JXUgY3FlX3dvcmRzPSUwOFhcbiIsIGhlYWQsCiAJCQkgIGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX0NRRV9PUENPREVfSURYXSkpOyAqLwogCi0JCWlmIChsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19DUUVfT1BDT0RFX0lEWF0pICYgTkVTX0NRRV9WQUxJRCkgewotCQkJdTY0dGVtcCA9ICgoKHU2NCkobGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLgotCQkJCQljcWVfd29yZHNbTkVTX0NRRV9DT01QX0NPTVBfQ1RYX0hJR0hfSURYXSkpKSA8PCAzMikgfAotCQkJCQkoKHU2NCkobGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLgotCQkJCQljcWVfd29yZHNbTkVTX0NRRV9DT01QX0NPTVBfQ1RYX0xPV19JRFhdKSkpOwotCQkJY3FwID0gKigoc3RydWN0IG5lc19od19jcXAgKiopJnU2NHRlbXApOworCQlvcGNvZGUgPSBsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19DUUVfT1BDT0RFX0lEWF0pOworCQlpZiAob3Bjb2RlICYgTkVTX0NRRV9WQUxJRCkgeworCQkJY3FwID0gJm5lc2Rldi0+Y3FwOwogCiAJCQllcnJvcl9jb2RlID0gbGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLmNxZV93b3Jkc1tORVNfQ1FFX0VSUk9SX0NPREVfSURYXSk7CiAJCQlpZiAoZXJyb3JfY29kZSkgewpAQCAtMzAyMSwxNSArMzA0OCwxNCBAQAogCQkJCQkJbGUzMl90b19jcHUoY3EtPmNxX3ZiYXNlW2hlYWRdLmNxZV93b3Jkc1tORVNfQ1FFX09QQ09ERV9JRFhdKSYweDNmLAogCQkJCQkJKHUxNikoZXJyb3JfY29kZSA+PiAxNiksCiAJCQkJCQkodTE2KWVycm9yX2NvZGUpOwotCQkJCW5lc19kZWJ1ZyhORVNfREJHX0NRUCwgImNxcDogcXBfaWQ9JXUsIHNxX2hlYWQ9JXUsIHNxX3RhaWw9JXVcbiIsCi0JCQkJCQljcXAtPnFwX2lkLCBjcXAtPnNxX2hlYWQsIGNxcC0+c3FfdGFpbCk7CiAJCQl9CiAKLQkJCXU2NHRlbXAgPSAoKCh1NjQpKGxlMzJfdG9fY3B1KG5lc2Rldi0+Y3FwLnNxX3ZiYXNlW2NxcC0+c3FfdGFpbF0uCi0JCQkJCXdxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfSElHSF9JRFhdKSkpIDw8IDMyKSB8Ci0JCQkJCSgodTY0KShsZTMyX3RvX2NwdShuZXNkZXYtPmNxcC5zcV92YmFzZVtjcXAtPnNxX3RhaWxdLgotCQkJCQl3cWVfd29yZHNbTkVTX0NRUF9XUUVfQ09NUF9TQ1JBVENIX0xPV19JRFhdKSkpOwotCQkJY3FwX3JlcXVlc3QgPSAqKChzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICoqKSZ1NjR0ZW1wKTsKKwkJCXU2NHRlbXAgPSAoKCh1NjQpKGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS4KKwkJCQkJY3FlX3dvcmRzW05FU19DUUVfQ09NUF9DT01QX0NUWF9ISUdIX0lEWF0pKSkgPDwgMzIpIHwKKwkJCQkJKCh1NjQpKGxlMzJfdG9fY3B1KGNxLT5jcV92YmFzZVtoZWFkXS4KKwkJCQkJY3FlX3dvcmRzW05FU19DUUVfQ09NUF9DT01QX0NUWF9MT1dfSURYXSkpKTsKKworCQkJY3FwX3JlcXVlc3QgPSAoc3RydWN0IG5lc19jcXBfcmVxdWVzdCAqKSh1bnNpZ25lZCBsb25nKXU2NHRlbXA7CiAJCQlpZiAoY3FwX3JlcXVlc3QpIHsKIAkJCQlpZiAoY3FwX3JlcXVlc3QtPndhaXRpbmcpIHsKIAkJCQkJLyogbmVzX2RlYnVnKE5FU19EQkdfQ1FQLCAiJXM6IFdha2luZyB1cCByZXF1ZXN0b3JcbiIpOyAqLwpAQCAtMzA3NSw5ICszMTAxLDE1IEBACiAJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbaGVhZF07CiAJCW1lbWNweShjcXBfd3FlLCAmY3FwX3JlcXVlc3QtPmNxcF93cWUsIHNpemVvZigqY3FwX3dxZSkpOwogCQliYXJyaWVyKCk7Ci0JCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfTE9XX0lEWF0gPQorCisJCW9wY29kZSA9IGNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9PUENPREVfSURYXTsKKwkJaWYgKChvcGNvZGUgJiBORVNfQ1FQX09QQ09ERV9NQVNLKSA9PSBORVNfQ1FQX0RPV05MT0FEX1NFR01FTlQpCisJCQljdHhfaW5kZXggPSBORVNfQ1FQX1dRRV9ETF9DT01QX0NUWF9MT1dfSURYOworCQllbHNlCisJCQljdHhfaW5kZXggPSBORVNfQ1FQX1dRRV9DT01QX0NUWF9MT1dfSURYOworCQljcXBfd3FlLT53cWVfd29yZHNbY3R4X2luZGV4XSA9CiAJCQljcHVfdG9fbGUzMigodTMyKSgodW5zaWduZWQgbG9uZyljcXBfcmVxdWVzdCkpOwotCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfQ09NUF9TQ1JBVENIX0hJR0hfSURYXSA9CisJCWNxcF93cWUtPndxZV93b3Jkc1tjdHhfaW5kZXggKyAxXSA9CiAJCQljcHVfdG9fbGUzMigodTMyKSh1cHBlcl8zMl9iaXRzKCh1bnNpZ25lZCBsb25nKWNxcF9yZXF1ZXN0KSkpOwogCQluZXNfZGVidWcoTkVTX0RCR19DUVAsICJDUVAgcmVxdWVzdCAlcCAob3Bjb2RlIDB4JTAyWCkgcHV0IG9uIENRUHMgU1Egd3FlJXUuXG4iLAogCQkJCWNxcF9yZXF1ZXN0LCBsZTMyX3RvX2NwdShjcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfT1BDT0RFX0lEWF0pJjB4M2YsIGhlYWQpOwpAQCAtMzA5Myw3ICszMTI1LDYgQEAKIAluZXNfcmVhZDMyKG5lc2Rldi0+cmVncytORVNfQ1FFX0FMTE9DKTsKIH0KIAotCiBzdGF0aWMgdTggKmxvY2F0ZV9tcGEodTggKnBrdCwgdTMyIGFlcV9pbmZvKQogewogCWlmIChhZXFfaW5mbyAmIE5FU19BRVFFX1EyX0RBVEFfRVRIRVJORVQpIHsKQEAgLTM1NTMsOSArMzU4NCw5IEBACiAKIAlhZXFlX2NxX2lkID0gbGUzMl90b19jcHUoYWVxZS0+YWVxZV93b3Jkc1tORVNfQUVRRV9DT01QX1FQX0NRX0lEX0lEWF0pOwogCWlmIChhZXFfaW5mbyAmIE5FU19BRVFFX1FQKSB7Ci0JCWlmICgoIW5lc19pc19yZXNvdXJjZV9hbGxvY2F0ZWQobmVzYWRhcHRlciwgbmVzYWRhcHRlci0+YWxsb2NhdGVkX3FwcywKLQkJCQlhZXFlX2NxX2lkKSkgfHwKLQkJCQkoYXRvbWljX3JlYWQoJm5lc3FwLT5jbG9zZV90aW1lcl9zdGFydGVkKSkpCisJCWlmICghbmVzX2lzX3Jlc291cmNlX2FsbG9jYXRlZChuZXNhZGFwdGVyLAorCQkJCW5lc2FkYXB0ZXItPmFsbG9jYXRlZF9xcHMsCisJCQkJYWVxZV9jcV9pZCkpCiAJCQlyZXR1cm47CiAJfQogCkBAIC0zNTY2LDggKzM1OTcsNyBAQAogCiAJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJm5lc3FwLT5jbG9zZV90aW1lcl9zdGFydGVkKSA9PSAxKSB7CiAJCQkJaWYgKCh0Y3Bfc3RhdGUgPT0gTkVTX0FFUUVfVENQX1NUQVRFX0NMT1NFX1dBSVQpICYmCi0JCQkJCShuZXNxcC0+aWJxcF9zdGF0ZSA9PSBJQl9RUFNfUlRTKSAmJgotCQkJCQkoKG5lc2FkYXB0ZXItPmVlcHJvbV92ZXJzaW9uID4+IDE2KSAhPSBORVNfQTApKSB7CisJCQkJCShuZXNxcC0+aWJxcF9zdGF0ZSA9PSBJQl9RUFNfUlRTKSkgewogCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKIAkJCQkJbmVzcXAtPmh3X2l3YXJwX3N0YXRlID0gaXdhcnBfc3RhdGU7CiAJCQkJCW5lc3FwLT5od190Y3Bfc3RhdGUgPSB0Y3Bfc3RhdGU7CkBAIC0zNTk0LDkgKzM2MjQsMTAgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPmxvY2ssIGZsYWdzKTsKLQkJCW5lc3FwLT5od19pd2FycF9zdGF0ZSA9IE5FU19BRVFFX0lXQVJQX1NUQVRFX0NMT1NJTkc7CisJCQluZXNxcC0+aHdfaXdhcnBfc3RhdGUgPSBpd2FycF9zdGF0ZTsKKwkJCW5lc3FwLT5od190Y3Bfc3RhdGUgPSB0Y3Bfc3RhdGU7CisJCQluZXNxcC0+bGFzdF9hZXEgPSBhc3luY19ldmVudF9pZDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc3FwLT5sb2NrLCBmbGFncyk7Ci0JCQluZXNfaHdfbW9kaWZ5X3FwKG5lc2RldiwgbmVzcXAsIE5FU19DUVBfUVBfSVdBUlBfU1RBVEVfQ0xPU0lORywgMCwgMCk7CiAJCQluZXNfY21fZGlzY29ubihuZXNxcCk7CiAJCQlicmVhazsKIApAQCAtMzY5NCw3ICszNzI1LDkgQEAKIAkJY2FzZSBORVNfQUVRRV9BRUlEX1JPRV9JTlZBTElEX1JETUFfV1JJVEVfT1JfUkVBRF9SRVNQOgogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUVBbJXVdIGFzeW5jX2V2ZW50X2lkPTB4JTA0WCBJQl9FVkVOVF9RUF9GQVRBTFxuIiwKIAkJCQkJbmVzcXAtPmh3cXAucXBfaWQsIGFzeW5jX2V2ZW50X2lkKTsKLQkJCW5lc190ZXJtaW5hdGVfY29ubmVjdGlvbihuZXNkZXYsIG5lc3FwLCBhZXFlLCBJQl9FVkVOVF9RUF9GQVRBTCk7CisJCQlwcmludF9pcChuZXNxcC0+Y21fbm9kZSk7CisJCQlpZiAoIWF0b21pY19yZWFkKCZuZXNxcC0+Y2xvc2VfdGltZXJfc3RhcnRlZCkpCisJCQkJbmVzX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKG5lc2RldiwgbmVzcXAsIGFlcWUsIElCX0VWRU5UX1FQX0ZBVEFMKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTkVTX0FFUUVfQUVJRF9DUV9PUEVSQVRJT05fRVJST1I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfaHcuaAppbmRleCBjMzI0MTQ3Li4wYjU5MGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19ody5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2h3LmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAjZGVmaW5lIE5FU19NVUxUSUNBU1RfUEZfTUFYIDgKICNkZWZpbmUgTkVTX0EwIDMKIAorI2RlZmluZSBORVNfRU5BQkxFX1BBVSAweDA3MDAwMDAxCisjZGVmaW5lIE5FU19ESVNBQkxFX1BBVSAweDA3MDAwMDAwCisjZGVmaW5lIE5FU19QQVVfQ09VTlRFUiAxMAorI2RlZmluZSBORVNfQ1FQX09QQ09ERV9NQVNLIDB4M2YKKwogZW51bSBwY2lfcmVncyB7CiAJTkVTX0lOVF9TVEFUID0gMHgwMDAwLAogCU5FU19JTlRfTUFTSyA9IDB4MDAwNCwKQEAgLTczLDggKzc4LDEwIEBACiAJTkVTX0lEWF9RUF9DT05UUk9MID0gMHgwMDQwLAogCU5FU19JRFhfRkxNX0NPTlRST0wgPSAweDAwODAsCiAJTkVTX0lEWF9JTlRfQ1BVX1NUQVRVUyA9IDB4MDBhMCwKKwlORVNfSURYX0dQUl9UUklHR0VSID0gMHgwMGJjLAogCU5FU19JRFhfR1BJT19DT05UUk9MID0gMHgwMGYwLAogCU5FU19JRFhfR1BJT19EQVRBID0gMHgwMGY0LAorCU5FU19JRFhfR1BSMiA9IDB4MDEwYywKIAlORVNfSURYX1RDUF9DT05GSUcwID0gMHgwMWU0LAogCU5FU19JRFhfVENQX1RJTUVSX0NPTkZJRyA9IDB4MDFlYywKIAlORVNfSURYX1RDUF9OT1cgPSAweDAxZjAsCkBAIC0yMDIsNiArMjA5LDcgQEAKIAlORVNfQ1FQX1JFR0lTVEVSX1NIQVJFRF9TVEFHID0gMHgwYywKIAlORVNfQ1FQX0RFQUxMT0NBVEVfU1RBRyA9IDB4MGQsCiAJTkVTX0NRUF9NQU5BR0VfQVJQX0NBQ0hFID0gMHgwZiwKKwlORVNfQ1FQX0RPV05MT0FEX1NFR01FTlQgPSAweDEwLAogCU5FU19DUVBfU1VTUEVORF9RUFMgPSAweDExLAogCU5FU19DUVBfVVBMT0FEX0NPTlRFWFQgPSAweDEzLAogCU5FU19DUVBfQ1JFQVRFX0NFUSA9IDB4MTYsCkBAIC0yMTAsNyArMjE4LDggQEAKIAlORVNfQ1FQX0RFU1RST1lfQUVRID0gMHgxYiwKIAlORVNfQ1FQX0xNSV9BQ0NFU1MgPSAweDIwLAogCU5FU19DUVBfRkxVU0hfV1FFUyA9IDB4MjIsCi0JTkVTX0NRUF9NQU5BR0VfQVBCVlQgPSAweDIzCisJTkVTX0NRUF9NQU5BR0VfQVBCVlQgPSAweDIzLAorCU5FU19DUVBfTUFOQUdFX1FVQURfSEFTSCA9IDB4MjUKIH07CiAKIGVudW0gbmVzX2NxcF93cWVfd29yZF9pZHggewpAQCAtMjIyLDYgKzIzMSwxNCBAQAogCU5FU19DUVBfV1FFX0NPTVBfU0NSQVRDSF9ISUdIX0lEWCA9IDUsCiB9OwogCitlbnVtIG5lc19jcXBfd3FlX3dvcmRfZG93bmxvYWRfaWR4IHsgLyogZm9ybWF0IGRpZmZlcnMgZnJvbSBvdGhlciBjcXAgb3BzICovCisJTkVTX0NRUF9XUUVfRExfT1BDT0RFX0lEWCA9IDAsCisJTkVTX0NRUF9XUUVfRExfQ09NUF9DVFhfTE9XX0lEWCA9IDEsCisJTkVTX0NRUF9XUUVfRExfQ09NUF9DVFhfSElHSF9JRFggPSAyLAorCU5FU19DUVBfV1FFX0RMX0xFTkdUSF8wX1RPVEFMX0lEWCA9IDMKKwkvKiBGb3IgaW5kZXggdmFsdWVzIDQtMTUgdXNlIE5FU19OSUNfU1FfV1FFXyB2YWx1ZXMgKi8KK307CisKIGVudW0gbmVzX2NxcF9jcV93cWV3b3JkX2lkeCB7CiAJTkVTX0NRUF9DUV9XUUVfUEJMX0xPV19JRFggPSA2LAogCU5FU19DUVBfQ1FfV1FFX1BCTF9ISUdIX0lEWCA9IDcsCkBAIC0yNDIsNiArMjU5LDcgQEAKIAlORVNfQ1FQX1NUQUdfV1FFX1BCTF9MRU5fSURYID0gMTQKIH07CiAKKyNkZWZpbmUgTkVTX0NRUF9PUF9MT0dJQ0FMX1BPUlRfU0hJRlQgMjYKICNkZWZpbmUgTkVTX0NRUF9PUF9JV0FSUF9TVEFURV9TSElGVCAyOAogI2RlZmluZSBORVNfQ1FQX09QX1RFUk1MRU5fU0hJRlQgICAgIDI4CiAKQEAgLTU5OSw2ICs2MTcsNyBAQAogCiBlbnVtIG5lc19uaWNfY3FlX3dvcmRfaWR4IHsKIAlORVNfTklDX0NRRV9BQ0NRUF9JRF9JRFggPSAwLAorCU5FU19OSUNfQ1FFX0hBU0hfUkNWTlhUID0gMSwKIAlORVNfTklDX0NRRV9UQUdfUEtUX1RZUEVfSURYID0gMiwKIAlORVNfTklDX0NRRV9NSVNDX0lEWCA9IDMsCiB9OwpAQCAtMTAwNSw2ICsxMDI0LDExIEBACiAjZGVmaW5lIE5FU19OSUNfQ1FfRE9XTldBUkRfVFJFTkQgICAxNgogI2RlZmluZSBORVNfUEZUX1NJWkUJCSAgICA0OAogCisjZGVmaW5lIE5FU19NR1RfV1FfQ09VTlQgMzIKKyNkZWZpbmUgTkVTX01HVF9DVFhfU0laRSAoKE5FU19OSUNfQ1RYX1JRX1NJWkVfMzIpIHwgKE5FU19OSUNfQ1RYX1NRX1NJWkVfMzIpKQorI2RlZmluZSBORVNfTUdUX1FQX09GRlNFVCAzNgorI2RlZmluZSBORVNfTUdUX1FQX0NPVU5UIDQKKwogc3RydWN0IG5lc19od190dW5lX3RpbWVyIHsKICAgICAvKiB1MTYgY3FfY291bnQ7ICovCiAgICAgdTE2IHRocmVzaG9sZF9sb3c7CkBAIC0xMTE4LDYgKzExNDIsNyBAQAogCXUzMiBldF9yYXRlX3NhbXBsZV9pbnRlcnZhbDsKIAl1MzIgdGltZXJfaW50X2xpbWl0OwogCXUzMiB3cW1fcXVhbnRhOworCXU4IGFsbG93X3VuYWxpZ25lZF9mcGR1czsKIAogCS8qIEFkYXB0ZXIgYmFzZSBNQUMgYWRkcmVzcyAqLwogCXUzMiBtYWNfYWRkcl9sb3c7CkBAIC0xMjUxLDYgKzEyNzYsMTQgQEAKIAllbnVtIGliX2V2ZW50X3R5cGUgZGVsYXllZF9ldmVudDsKIAllbnVtIGliX2V2ZW50X3R5cGUgbGFzdF9kaXNwYXRjaGVkX2V2ZW50OwogCXNwaW5sb2NrX3QgcG9ydF9pYmV2ZW50X2xvY2s7CisJdTMyIG1ndF9tZW1fc2l6ZTsKKwl2b2lkICptZ3RfdmJhc2U7CisJZG1hX2FkZHJfdCBtZ3RfcGJhc2U7CisJc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pY1tORVNfTUdUX1FQX0NPVU5UXTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1ndF90aHJlYWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbWd0X3dhaXRfcXVldWU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBtZ3Rfc2tiX2xpc3Q7CisKIH07CiAKIHN0cnVjdCBuZXNfaWJfZGV2aWNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX21ndC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbWd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiMmEyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX21ndC5jCkBAIC0wLDAgKzEsMTE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDkgSW50ZWwtTkUsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgIm5lcy5oIgorI2luY2x1ZGUgIm5lc19tZ3QuaCIKKworYXRvbWljX3QgcGF1X3Fwc19jcmVhdGVkOworYXRvbWljX3QgcGF1X3Fwc19kZXN0cm95ZWQ7CisKK3N0YXRpYyB2b2lkIG5lc19yZXBsZW5pc2hfbWd0X3JxKHN0cnVjdCBuZXNfdm5pY19tZ3QgKm1ndHZuaWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkbWFfYWRkcl90IGJ1c19hZGRyZXNzOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5lc19od19uaWNfcnFfd3FlICpuaWNfcnFlOworCXN0cnVjdCBuZXNfaHdfbWd0ICpuZXNtZ3Q7CisJc3RydWN0IG5lc19kZXZpY2UgKm5lc2RldjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOworCXUzMiByeF93cWVzX3Bvc3RlZCA9IDA7CisKKwluZXNtZ3QgPSAmbWd0dm5pYy0+bWd0OworCW5lc2RldiA9IG1ndHZuaWMtPm5lc3ZuaWMtPm5lc2RldjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJaWYgKG5lc21ndC0+cmVwbGVuaXNoaW5nX3JxICE9IDApIHsKKwkJaWYgKCgobmVzbWd0LT5ycV9zaXplIC0gMSkgPT0gYXRvbWljX3JlYWQoJm1ndHZuaWMtPnJ4X3NrYnNfbmVlZGVkKSkgJiYKKwkJICAgIChhdG9taWNfcmVhZCgmbWd0dm5pYy0+cnhfc2tiX3RpbWVyX3J1bm5pbmcpID09IDApKSB7CisJCQlhdG9taWNfc2V0KCZtZ3R2bmljLT5yeF9za2JfdGltZXJfcnVubmluZywgMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNtZ3QtPnJxX2xvY2ssIGZsYWdzKTsKKwkJCW1ndHZuaWMtPnJxX3dxZXNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsgICAgICAvKiAxLzIgc2Vjb25kICovCisJCQlhZGRfdGltZXIoJm1ndHZuaWMtPnJxX3dxZXNfdGltZXIpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuOworCX0KKwluZXNtZ3QtPnJlcGxlbmlzaGluZ19ycSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJZG8geworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG1ndHZuaWMtPm5lc3ZuaWMtPm1heF9mcmFtZV9zaXplKTsKKwkJaWYgKHNrYikgeworCQkJc2tiLT5kZXYgPSBtZ3R2bmljLT5uZXN2bmljLT5uZXRkZXY7CisKKwkJCWJ1c19hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUobmVzZGV2LT5wY2lkZXYsCisJCQkJCQkgICAgIHNrYi0+ZGF0YSwgbWd0dm5pYy0+bmVzdm5pYy0+bWF4X2ZyYW1lX3NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwkJCWNiLT5idXNhZGRyID0gYnVzX2FkZHJlc3M7CisJCQljYi0+bWFwbGVuID0gbWd0dm5pYy0+bmVzdm5pYy0+bWF4X2ZyYW1lX3NpemU7CisKKwkJCW5pY19ycWUgPSAmbmVzbWd0LT5ycV92YmFzZVttZ3R2bmljLT5tZ3QucnFfaGVhZF07CisJCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfTEVOR1RIXzFfMF9JRFhdID0KKwkJCQljcHVfdG9fbGUzMihtZ3R2bmljLT5uZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSk7CisJCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfTEVOR1RIXzNfMl9JRFhdID0gMDsKKwkJCW5pY19ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9GUkFHMF9MT1dfSURYXSA9CisJCQkJY3B1X3RvX2xlMzIoKHUzMilidXNfYWRkcmVzcyk7CisJCQluaWNfcnFlLT53cWVfd29yZHNbTkVTX05JQ19SUV9XUUVfRlJBRzBfSElHSF9JRFhdID0KKwkJCQljcHVfdG9fbGUzMigodTMyKSgodTY0KWJ1c19hZGRyZXNzID4+IDMyKSk7CisJCQluZXNtZ3QtPnJ4X3NrYltuZXNtZ3QtPnJxX2hlYWRdID0gc2tiOworCQkJbmVzbWd0LT5ycV9oZWFkKys7CisJCQluZXNtZ3QtPnJxX2hlYWQgJj0gbmVzbWd0LT5ycV9zaXplIC0gMTsKKwkJCWF0b21pY19kZWMoJm1ndHZuaWMtPnJ4X3NrYnNfbmVlZGVkKTsKKwkJCWJhcnJpZXIoKTsKKwkJCWlmICgrK3J4X3dxZXNfcG9zdGVkID09IDI1NSkgeworCQkJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsIChyeF93cWVzX3Bvc3RlZCA8PCAyNCkgfCBuZXNtZ3QtPnFwX2lkKTsKKwkJCQlyeF93cWVzX3Bvc3RlZCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJCQlpZiAoKChuZXNtZ3QtPnJxX3NpemUgLSAxKSA9PSBhdG9taWNfcmVhZCgmbWd0dm5pYy0+cnhfc2tic19uZWVkZWQpKSAmJgorCQkJICAgIChhdG9taWNfcmVhZCgmbWd0dm5pYy0+cnhfc2tiX3RpbWVyX3J1bm5pbmcpID09IDApKSB7CisJCQkJYXRvbWljX3NldCgmbWd0dm5pYy0+cnhfc2tiX3RpbWVyX3J1bm5pbmcsIDEpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc21ndC0+cnFfbG9jaywgZmxhZ3MpOworCQkJCW1ndHZuaWMtPnJxX3dxZXNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsgICAgICAvKiAxLzIgc2Vjb25kICovCisJCQkJYWRkX3RpbWVyKCZtZ3R2bmljLT5ycV93cWVzX3RpbWVyKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzbWd0LT5ycV9sb2NrLCBmbGFncyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGF0b21pY19yZWFkKCZtZ3R2bmljLT5yeF9za2JzX25lZWRlZCkpOworCWJhcnJpZXIoKTsKKwlpZiAocnhfd3Flc19wb3N0ZWQpCisJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsIChyeF93cWVzX3Bvc3RlZCA8PCAyNCkgfCBuZXNtZ3QtPnFwX2lkKTsKKwluZXNtZ3QtPnJlcGxlbmlzaGluZ19ycSA9IDA7Cit9CisKKy8qKgorICogbmVzX21ndF9ycV93cWVzX3RpbWVvdXQKKyAqLworc3RhdGljIHZvaWQgbmVzX21ndF9ycV93cWVzX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwYXJtKQoreworCXN0cnVjdCBuZXNfdm5pY19tZ3QgKm1ndHZuaWMgPSAoc3RydWN0IG5lc192bmljX21ndCAqKXBhcm07CisKKwlhdG9taWNfc2V0KCZtZ3R2bmljLT5yeF9za2JfdGltZXJfcnVubmluZywgMCk7CisJaWYgKGF0b21pY19yZWFkKCZtZ3R2bmljLT5yeF9za2JzX25lZWRlZCkpCisJCW5lc19yZXBsZW5pc2hfbWd0X3JxKG1ndHZuaWMpOworfQorCisvKioKKyAqIG5lc19tZ3RfZnJlZV9za2IgLSB1bm1hcCBhbmQgZnJlZSBza2IKKyAqLworc3RhdGljIHZvaWQgbmVzX21ndF9mcmVlX3NrYihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZGlyKQoreworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisKKwljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwlwY2lfdW5tYXBfc2luZ2xlKG5lc2Rldi0+cGNpZGV2LCBjYi0+YnVzYWRkciwgY2ItPm1hcGxlbiwgZGlyKTsKKwljYi0+YnVzYWRkciA9IDA7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK30KKworLyoqCisgKiBuZXNfZG93bmxvYWRfY2FsbGJhY2sgLSBoYW5kbGUgZG93bmxvYWQgY29tcGxldGlvbnMKKyAqLworc3RhdGljIHZvaWQgbmVzX2Rvd25sb2FkX2NhbGxiYWNrKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXNfY3FwX3JlcXVlc3QgKmNxcF9yZXF1ZXN0KQoreworCXN0cnVjdCBwYXVfZnBkdV9pbmZvICpmcGR1X2luZm8gPSBjcXBfcmVxdWVzdC0+Y3FwX2NhbGxiYWNrX3BvaW50ZXI7CisJc3RydWN0IG5lc19xcCAqbmVzcXAgPSBmcGR1X2luZm8tPm5lc3FwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnBkdV9pbmZvLT5mcmFnX2NudDsgaSsrKSB7CisJCXNrYiA9IGZwZHVfaW5mby0+ZnJhZ3NbaV0uc2tiOworCQlpZiAoZnBkdV9pbmZvLT5mcmFnc1tpXS5jbXBsdCkgeworCQkJbmVzX21ndF9mcmVlX3NrYihuZXNkZXYsIHNrYiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQluZXNfcmVtX3JlZl9jbV9ub2RlKG5lc3FwLT5jbV9ub2RlKTsKKwkJfQorCX0KKworCWlmIChmcGR1X2luZm8tPmhkcl92YmFzZSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuZXNkZXYtPnBjaWRldiwgZnBkdV9pbmZvLT5oZHJfbGVuLAorCQkJCSAgICBmcGR1X2luZm8tPmhkcl92YmFzZSwgZnBkdV9pbmZvLT5oZHJfcGJhc2UpOworCWtmcmVlKGZwZHVfaW5mbyk7Cit9CisKKy8qKgorICogbmVzX2dldF9zZXEgLSBHZXQgdGhlIHNlcSwgYWNrX3NlcSBhbmQgd2luZG93IGZyb20gdGhlIHBhY2tldAorICovCitzdGF0aWMgdTMyIG5lc19nZXRfc2VxKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqYWNrLCB1MTYgKnduZCwgdTMyICpmaW5fcmN2ZCwgdTMyICpyc3RfcmN2ZCkKK3sKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKShjYi0+ZGF0YV9zdGFydCArIEVUSF9ITEVOKTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKChjaGFyICopaXBoKSArICg0ICogaXBoLT5paGwpKTsKKworCSphY2sgPSBiZTMyX3RvX2NwdSh0Y3BoLT5hY2tfc2VxKTsKKwkqd25kID0gYmUxNl90b19jcHUodGNwaC0+d2luZG93KTsKKwkqZmluX3JjdmQgPSB0Y3BoLT5maW47CisJKnJzdF9yY3ZkID0gdGNwaC0+cnN0OworCXJldHVybiBiZTMyX3RvX2NwdSh0Y3BoLT5zZXEpOworfQorCisvKioKKyAqIG5lc19nZXRfbmV4dF9za2IgLSBHZXQgdGhlIG5leHQgc2tiIGJhc2VkIG9uIHdoZXJlIGN1cnJlbnQgc2tiIGlzIGluIHRoZSBxdWV1ZQorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm5lc19nZXRfbmV4dF9za2Ioc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19xcCAqbmVzcXAsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsIHUzMiBuZXh0c2VxLCB1MzIgKmFjaywKKwkJCQkJdTE2ICp3bmQsIHUzMiAqZmluX3JjdmQsIHUzMiAqcnN0X3JjdmQpCit7CisJdTMyIHNlcTsKKwlib29sIHByb2Nlc3NhY2tzOworCXN0cnVjdCBza19idWZmICpvbGRfc2tiOworCisJaWYgKHNrYikgeworCQkvKiBDb250aW51ZSBwcm9jZXNzaW5nIGZwZHUgKi8KKwkJaWYgKHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmbmVzcXAtPnBhdV9saXN0KQorCQkJZ290byBvdXQ7CisJCXNrYiA9IHNrYi0+bmV4dDsKKwkJcHJvY2Vzc2Fja3MgPSBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBTdGFydGluZyBhIG5ldyBvbmUgKi8KKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmbmVzcXAtPnBhdV9saXN0KSkKKwkJCWdvdG8gb3V0OworCQlza2IgPSBza2JfcGVlaygmbmVzcXAtPnBhdV9saXN0KTsKKwkJcHJvY2Vzc2Fja3MgPSB0cnVlOworCX0KKworCXdoaWxlICgxKSB7CisJCXNlcSA9IG5lc19nZXRfc2VxKHNrYiwgYWNrLCB3bmQsIGZpbl9yY3ZkLCByc3RfcmN2ZCk7CisJCWlmIChzZXEgPT0gbmV4dHNlcSkgeworCQkJaWYgKHNrYi0+bGVuIHx8IHByb2Nlc3NhY2tzKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGFmdGVyKHNlcSwgbmV4dHNlcSkpIHsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmbmVzcXAtPnBhdV9saXN0KQorCQkJZ290byBvdXQ7CisKKwkJb2xkX3NrYiA9IHNrYjsKKwkJc2tiID0gc2tiLT5uZXh0OworCQlza2JfdW5saW5rKG9sZF9za2IsICZuZXNxcC0+cGF1X2xpc3QpOworCQluZXNfbWd0X2ZyZWVfc2tiKG5lc2Rldiwgb2xkX3NrYiwgUENJX0RNQV9UT0RFVklDRSk7CisJCW5lc19yZW1fcmVmX2NtX25vZGUobmVzcXAtPmNtX25vZGUpOworCX0KKwlyZXR1cm4gc2tiOworCitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZ2V0X2ZwZHVfaW5mbyAtIEZpbmQgdGhlIG5leHQgY29tcGxldGUgZnBkdSBhbmQgcmV0dXJuIGl0cyBmcmFnbWVudHMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZwZHVfaW5mbyhzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCwKKwkJCSBzdHJ1Y3QgcGF1X2ZwZHVfaW5mbyAqKnBhdV9mcGR1X2luZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoOworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisJc3RydWN0IHBhdV9mcGR1X2luZm8gKmZwZHVfaW5mbyA9IE5VTEw7CisJc3RydWN0IHBhdV9mcGR1X2ZyYWcgZnJhZ3NbTUFYX0ZQRFVfRlJBR1NdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGZwZHVfbGVuID0gMDsKKwl1MzIgdG1wX2xlbjsKKwlpbnQgZnJhZ19jbnQgPSAwOworCXUzMiB0b3RfbGVuOworCXUzMiBmcmFnX3RvdDsKKwl1MzIgYWNrOworCXUzMiBmaW5fcmN2ZDsKKwl1MzIgcnN0X3JjdmQ7CisJdTE2IHduZDsKKwlpbnQgaTsKKwlpbnQgcmMgPSAwOworCisJKnBhdV9mcGR1X2luZm8gPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworCXNrYiA9IG5lc19nZXRfbmV4dF9za2IobmVzZGV2LCBuZXNxcCwgTlVMTCwgbmVzcXAtPnBhdV9yY3Zfbnh0LCAmYWNrLCAmd25kLCAmZmluX3JjdmQsICZyc3RfcmN2ZCk7CisJaWYgKCFza2IpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwlpZiAoc2tiLT5sZW4pIHsKKwkJZnBkdV9sZW4gPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSBza2ItPmRhdGEpICsgTVBBX0ZSQU1JTkc7CisJCWZwZHVfbGVuID0gKGZwZHVfbGVuICsgMykgJiAweGZmZmZmZmZjOworCQl0bXBfbGVuID0gZnBkdV9sZW47CisKKwkJLyogU2VlIGlmIHdlIGhhdmUgYWxsIG9mIHRoZSBmcGR1ICovCisJCWZyYWdfdG90ID0gMDsKKwkJbWVtc2V0KCZmcmFncywgMCwgc2l6ZW9mIGZyYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9GUERVX0ZSQUdTOyBpKyspIHsKKwkJCWZyYWdzW2ldLnBoeXNhZGRyID0gY2ItPmJ1c2FkZHI7CisJCQlmcmFnc1tpXS5waHlzYWRkciArPSBza2ItPmRhdGEgLSBjYi0+ZGF0YV9zdGFydDsKKwkJCWZyYWdzW2ldLmZyYWdfbGVuID0gbWluKHRtcF9sZW4sIHNrYi0+bGVuKTsKKwkJCWZyYWdzW2ldLnNrYiA9IHNrYjsKKwkJCWZyYWdzW2ldLmNtcGx0ID0gKHNrYi0+bGVuID09IGZyYWdzW2ldLmZyYWdfbGVuKTsKKwkJCWZyYWdfdG90ICs9IGZyYWdzW2ldLmZyYWdfbGVuOworCQkJZnJhZ19jbnQrKzsKKworCQkJdG1wX2xlbiAtPSBmcmFnc1tpXS5mcmFnX2xlbjsKKwkJCWlmICh0bXBfbGVuID09IDApCisJCQkJYnJlYWs7CisKKwkJCXNrYiA9IG5lc19nZXRfbmV4dF9za2IobmVzZGV2LCBuZXNxcCwgc2tiLAorCQkJCQkgICAgICAgbmVzcXAtPnBhdV9yY3Zfbnh0ICsgZnJhZ190b3QsICZhY2ssICZ3bmQsICZmaW5fcmN2ZCwgJnJzdF9yY3ZkKTsKKwkJCWlmICghc2tiKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHJzdF9yY3ZkKSB7CisJCQkJLyogcnN0IHJlY2VpdmVkIGluIHRoZSBtaWRkbGUgb2YgZnBkdSAqLworCQkJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJCQlza2JfdW5saW5rKGZyYWdzW2ldLnNrYiwgJm5lc3FwLT5wYXVfbGlzdCk7CisJCQkJCW5lc19tZ3RfZnJlZV9za2IobmVzZGV2LCBmcmFnc1tpXS5za2IsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCX0KKwkJCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwkJCQlmcmFnc1swXS5waHlzYWRkciA9IGNiLT5idXNhZGRyOworCQkJCWZyYWdzWzBdLnBoeXNhZGRyICs9IHNrYi0+ZGF0YSAtIGNiLT5kYXRhX3N0YXJ0OworCQkJCWZyYWdzWzBdLmZyYWdfbGVuID0gc2tiLT5sZW47CisJCQkJZnJhZ3NbMF0uc2tiID0gc2tiOworCQkJCWZyYWdzWzBdLmNtcGx0ID0gdHJ1ZTsKKwkJCQlmcmFnX2NudCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQl9CisJfSBlbHNlIHsKKwkJLyogbm8gZGF0YSAqLworCQlmcmFnc1swXS5waHlzYWRkciA9IGNiLT5idXNhZGRyOworCQlmcmFnc1swXS5mcmFnX2xlbiA9IDA7CisJCWZyYWdzWzBdLnNrYiA9IHNrYjsKKwkJZnJhZ3NbMF0uY21wbHQgPSB0cnVlOworCQlmcmFnX2NudCA9IDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisKKwkvKiBGb3VuZCBvbmUgKi8KKwlmcGR1X2luZm8gPSBremFsbG9jKHNpemVvZigqZnBkdV9pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKGZwZHVfaW5mbyA9PSBOVUxMKSB7CisJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIkZhaWxlZCB0byBhbGxvYyBhIGZwZHVfaW5mby5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWZwZHVfaW5mby0+Y3FwX3JlcXVlc3QgPSBuZXNfZ2V0X2NxcF9yZXF1ZXN0KG5lc2Rldik7CisJaWYgKGZwZHVfaW5mby0+Y3FwX3JlcXVlc3QgPT0gTlVMTCkgeworCQluZXNfZGVidWcoTkVTX0RCR19QQVUsICJGYWlsZWQgdG8gZ2V0IGEgY3FwX3JlcXVlc3QuXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmZnJhZ3NbMF0uc2tiLT5jYlswXTsKKwlpcGggPSAoc3RydWN0IGlwaGRyICopKGNiLT5kYXRhX3N0YXJ0ICsgRVRIX0hMRU4pOworCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKGNoYXIgKilpcGgpICsgKDQgKiBpcGgtPmlobCkpOworCWZwZHVfaW5mby0+aGRyX2xlbiA9ICgoKHVuc2lnbmVkIGNoYXIgKil0Y3BoKSArIDQgKiAodGNwaC0+ZG9mZikpIC0gY2ItPmRhdGFfc3RhcnQ7CisJZnBkdV9pbmZvLT5kYXRhX2xlbiA9IGZwZHVfbGVuOworCXRvdF9sZW4gPSBmcGR1X2luZm8tPmhkcl9sZW4gKyBmcGR1X2xlbiAtIEVUSF9ITEVOOworCisJaWYgKGZyYWdzWzBdLmNtcGx0KSB7CisJCWZwZHVfaW5mby0+aGRyX3BiYXNlID0gY2ItPmJ1c2FkZHI7CisJCWZwZHVfaW5mby0+aGRyX3ZiYXNlID0gTlVMTDsKKwl9IGVsc2UgeworCQlmcGR1X2luZm8tPmhkcl92YmFzZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LAorCQkJCQkJCSAgICBmcGR1X2luZm8tPmhkcl9sZW4sICZmcGR1X2luZm8tPmhkcl9wYmFzZSk7CisJCWlmICghZnBkdV9pbmZvLT5oZHJfdmJhc2UpIHsKKwkJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhdSBmaXJzdCBmcmFnXG4iKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogQ29weSBoZHJzLCBhZGp1c3RpbmcgbGVuIGFuZCBzZXFudW0gKi8KKwkJbWVtY3B5KGZwZHVfaW5mby0+aGRyX3ZiYXNlLCBjYi0+ZGF0YV9zdGFydCwgZnBkdV9pbmZvLT5oZHJfbGVuKTsKKwkJaXBoID0gKHN0cnVjdCBpcGhkciAqKShmcGR1X2luZm8tPmhkcl92YmFzZSArIEVUSF9ITEVOKTsKKwkJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCgoY2hhciAqKWlwaCkgKyAoNCAqIGlwaC0+aWhsKSk7CisJfQorCisJaXBoLT50b3RfbGVuID0gY3B1X3RvX2JlMTYodG90X2xlbik7CisJaXBoLT5zYWRkciA9IGNwdV90b19iZTMyKDB4N2YwMDAwMDEpOworCisJdGNwaC0+c2VxID0gY3B1X3RvX2JlMzIobmVzcXAtPnBhdV9yY3Zfbnh0KTsKKwl0Y3BoLT5hY2tfc2VxID0gY3B1X3RvX2JlMzIoYWNrKTsKKwl0Y3BoLT53aW5kb3cgPSBjcHVfdG9fYmUxNih3bmQpOworCisJbmVzcXAtPnBhdV9yY3Zfbnh0ICs9IGZwZHVfbGVuICsgZmluX3JjdmQ7CisKKwltZW1jcHkoZnBkdV9pbmZvLT5mcmFncywgZnJhZ3MsIHNpemVvZihmcGR1X2luZm8tPmZyYWdzKSk7CisJZnBkdV9pbmZvLT5mcmFnX2NudCA9IGZyYWdfY250OworCWZwZHVfaW5mby0+bmVzcXAgPSBuZXNxcDsKKwkqcGF1X2ZwZHVfaW5mbyA9IGZwZHVfaW5mbzsKKworCS8qIFVwZGF0ZSBza2IncyBmb3IgbmV4dCBwYXNzICovCisJZm9yIChpID0gMDsgaSA8IGZyYWdfY250OyBpKyspIHsKKwkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJmZyYWdzW2ldLnNrYi0+Y2JbMF07CisJCXNrYl9wdWxsKGZyYWdzW2ldLnNrYiwgZnJhZ3NbaV0uZnJhZ19sZW4pOworCisJCWlmIChmcmFnc1tpXS5za2ItPmxlbiA9PSAwKSB7CisJCQkvKiBQdWxsIHNrYiBvZmYgdGhlIGxpc3QgLSBpdCB3aWxsIGJlIGZyZWVkIGluIHRoZSBjYWxsYmFjayAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworCQkJc2tiX3VubGluayhmcmFnc1tpXS5za2IsICZuZXNxcC0+cGF1X2xpc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiBMYXN0IHNrYiBzdGlsbCBoYXMgZGF0YSBzbyB1cGRhdGUgdGhlIHNlcSAqLworCQkJaXBoID0gKHN0cnVjdCBpcGhkciAqKShjYi0+ZGF0YV9zdGFydCArIEVUSF9ITEVOKTsKKwkJCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKGNoYXIgKilpcGgpICsgKDQgKiBpcGgtPmlobCkpOworCQkJdGNwaC0+c2VxID0gY3B1X3RvX2JlMzIobmVzcXAtPnBhdV9yY3Zfbnh0KTsKKwkJfQorCX0KKworb3V0OgorCWlmIChyYykgeworCQlpZiAoZnBkdV9pbmZvKSB7CisJCQlpZiAoZnBkdV9pbmZvLT5jcXBfcmVxdWVzdCkKKwkJCQluZXNfcHV0X2NxcF9yZXF1ZXN0KG5lc2RldiwgZnBkdV9pbmZvLT5jcXBfcmVxdWVzdCk7CisJCQlrZnJlZShmcGR1X2luZm8pOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBmb3J3YXJkX2ZwZHUgLSBzZW5kIGNvbXBsZXRlIGZwZHVzLCBvbmUgYXQgYSB0aW1lCisgKi8KK3N0YXRpYyBpbnQgZm9yd2FyZF9mcGR1cyhzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKQoreworCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYgPSBuZXN2bmljLT5uZXNkZXY7CisJc3RydWN0IHBhdV9mcGR1X2luZm8gKmZwZHVfaW5mbzsKKwlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJc3RydWN0IG5lc19jcXBfcmVxdWVzdCAqY3FwX3JlcXVlc3Q7CisJdTY0IHU2NHRtcDsKKwl1MzIgdTMydG1wOworCWludCByYzsKKworCXdoaWxlICgxKSB7CisJCXJjID0gZ2V0X2ZwZHVfaW5mbyhuZXNkZXYsIG5lc3FwLCAmZnBkdV9pbmZvKTsKKwkJaWYgKGZwZHVfaW5mbyA9PSBOVUxMKQorCQkJcmV0dXJuIHJjOworCisJCWNxcF9yZXF1ZXN0ID0gZnBkdV9pbmZvLT5jcXBfcmVxdWVzdDsKKwkJY3FwX3dxZSA9ICZjcXBfcmVxdWVzdC0+Y3FwX3dxZTsKKwkJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9ETF9PUENPREVfSURYLAorCQkJCSAgICBORVNfQ1FQX0RPV05MT0FEX1NFR01FTlQgfAorCQkJCSAgICAoKCh1MzIpbmVzdm5pYy0+bG9naWNhbF9wb3J0KSA8PCBORVNfQ1FQX09QX0xPR0lDQUxfUE9SVF9TSElGVCkpOworCisJCXUzMnRtcCA9IGZwZHVfaW5mby0+aGRyX2xlbiA8PCAxNjsKKwkJdTMydG1wIHw9IGZwZHVfaW5mby0+aGRyX2xlbiArICh1MzIpZnBkdV9pbmZvLT5kYXRhX2xlbjsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfV1FFX0RMX0xFTkdUSF8wX1RPVEFMX0lEWCwKKwkJCQkgICAgdTMydG1wKTsKKworCQl1MzJ0bXAgPSAoZnBkdV9pbmZvLT5mcmFnc1sxXS5mcmFnX2xlbiA8PCAxNikgfCBmcGR1X2luZm8tPmZyYWdzWzBdLmZyYWdfbGVuOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfTEVOR1RIXzJfMV9JRFgsCisJCQkJICAgIHUzMnRtcCk7CisKKwkJdTMydG1wID0gKGZwZHVfaW5mby0+ZnJhZ3NbM10uZnJhZ19sZW4gPDwgMTYpIHwgZnBkdV9pbmZvLT5mcmFnc1syXS5mcmFnX2xlbjsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0xFTkdUSF80XzNfSURYLAorCQkJCSAgICB1MzJ0bXApOworCisJCXU2NHRtcCA9ICh1NjQpZnBkdV9pbmZvLT5oZHJfcGJhc2U7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHMF9MT1dfSURYLAorCQkJCSAgICBsb3dlcl8zMl9iaXRzKHU2NHRtcCkpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzBfSElHSF9JRFgsCisJCQkJICAgIHVwcGVyXzMyX2JpdHModTY0dG1wID4+IDMyKSk7CisKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUcxX0xPV19JRFgsCisJCQkJICAgIGxvd2VyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1swXS5waHlzYWRkcikpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzFfSElHSF9JRFgsCisJCQkJICAgIHVwcGVyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1swXS5waHlzYWRkcikpOworCisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHMl9MT1dfSURYLAorCQkJCSAgICBsb3dlcl8zMl9iaXRzKGZwZHVfaW5mby0+ZnJhZ3NbMV0ucGh5c2FkZHIpKTsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUcyX0hJR0hfSURYLAorCQkJCSAgICB1cHBlcl8zMl9iaXRzKGZwZHVfaW5mby0+ZnJhZ3NbMV0ucGh5c2FkZHIpKTsKKworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzNfTE9XX0lEWCwKKwkJCQkgICAgbG93ZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzJdLnBoeXNhZGRyKSk7CisJCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfTklDX1NRX1dRRV9GUkFHM19ISUdIX0lEWCwKKwkJCQkgICAgdXBwZXJfMzJfYml0cyhmcGR1X2luZm8tPmZyYWdzWzJdLnBoeXNhZGRyKSk7CisKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19OSUNfU1FfV1FFX0ZSQUc0X0xPV19JRFgsCisJCQkJICAgIGxvd2VyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1szXS5waHlzYWRkcikpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX05JQ19TUV9XUUVfRlJBRzRfSElHSF9JRFgsCisJCQkJICAgIHVwcGVyXzMyX2JpdHMoZnBkdV9pbmZvLT5mcmFnc1szXS5waHlzYWRkcikpOworCisJCWNxcF9yZXF1ZXN0LT5jcXBfY2FsbGJhY2tfcG9pbnRlciA9IGZwZHVfaW5mbzsKKwkJY3FwX3JlcXVlc3QtPmNhbGxiYWNrID0gMTsKKwkJY3FwX3JlcXVlc3QtPmNxcF9jYWxsYmFjayA9IG5lc19kb3dubG9hZF9jYWxsYmFjazsKKworCQlhdG9taWNfc2V0KCZjcXBfcmVxdWVzdC0+cmVmY291bnQsIDEpOworCQluZXNfcG9zdF9jcXBfcmVxdWVzdChuZXNkZXYsIGNxcF9yZXF1ZXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19mcGR1cyhzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKQoreworCWludCBhZ2FpbiA9IDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRvIHsKKwkJLyogSWdub3JlIHJjIC0gaWYgaXQgZmFpbGVkLCB0Y3AgcmV0cmllcyB3aWxsIGNhdXNlIGl0IHRvIHRyeSBhZ2FpbiAqLworCQlmb3J3YXJkX2ZwZHVzKG5lc3ZuaWMsIG5lc3FwKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJCWlmIChuZXNxcC0+cGF1X3BlbmRpbmcpIHsKKwkJCW5lc3FwLT5wYXVfcGVuZGluZyA9IDA7CisJCX0gZWxzZSB7CisJCQluZXNxcC0+cGF1X2J1c3kgPSAwOworCQkJYWdhaW4gPSAwOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzcXAtPnBhdV9sb2NrLCBmbGFncyk7CisJfSB3aGlsZSAoYWdhaW4pOworfQorCisvKioKKyAqIHF1ZXVlX2ZwZHVzIC0gSGFuZGxlIGZwZHUncyB0aGF0IGh3IHBhc3NlZCB1cCB0byBzdworICovCitzdGF0aWMgdm9pZCBxdWV1ZV9mcGR1cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKQoreworCXN0cnVjdCBza19idWZmICp0bXBza2I7CisJc3RydWN0IG5lc19yc2tiX2NiICpjYjsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoOworCXVuc2lnbmVkIGNoYXIgKnRjcGhfZW5kOworCXUzMiByY3Zfbnh0OworCXUzMiByY3Zfd25kOworCXUzMiBzZXFudW07CisJdTMyIGxlbjsKKwlib29sIHByb2Nlc3NfaXQgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTW92ZSBkYXRhIHB0ciB0byBhZnRlciB0Y3AgaGVhZGVyICovCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKwl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKChjaGFyICopaXBoKSArICg0ICogaXBoLT5paGwpKTsKKwlzZXFudW0gPSBiZTMyX3RvX2NwdSh0Y3BoLT5zZXEpOworCXRjcGhfZW5kID0gKCgoY2hhciAqKXRjcGgpICsgKDQgKiB0Y3BoLT5kb2ZmKSk7CisKKwlsZW4gPSBiZTE2X3RvX2NwdShpcGgtPnRvdF9sZW4pOworCWlmIChza2ItPmxlbiA+IGxlbikKKwkJc2tiX3RyaW0oc2tiLCBsZW4pOworCXNrYl9wdWxsKHNrYiwgdGNwaF9lbmQgLSBza2ItPmRhdGEpOworCisJLyogSW5pdGlhbGl6ZSB0cmFja2luZyB2YWx1ZXMgKi8KKwljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmc2tiLT5jYlswXTsKKwljYi0+c2VxbnVtID0gc2VxbnVtOworCisJLyogTWFrZSBzdXJlIGRhdGEgaXMgaW4gdGhlIHJlY2VpdmUgd2luZG93ICovCisJcmN2X254dCA9IG5lc3FwLT5wYXVfcmN2X254dDsKKwlyY3Zfd25kID0gbGUzMl90b19jcHUobmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl93bmQpOworCWlmICghYmV0d2VlbihzZXFudW0sIHJjdl9ueHQsIChyY3Zfbnh0ICsgcmN2X3duZCkpKSB7CisJCW5lc19tZ3RfZnJlZV9za2IobmVzdm5pYy0+bmVzZGV2LCBza2IsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQluZXNfcmVtX3JlZl9jbV9ub2RlKG5lc3FwLT5jbV9ub2RlKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKworCWlmIChuZXNxcC0+cGF1X2J1c3kpCisJCW5lc3FwLT5wYXVfcGVuZGluZyA9IDE7CisJZWxzZQorCQluZXNxcC0+cGF1X2J1c3kgPSAxOworCisJLyogUXVldWUgc2tiIGJ5IHNlcXVlbmNlIG51bWJlciAqLworCWlmIChza2JfcXVldWVfbGVuKCZuZXNxcC0+cGF1X2xpc3QpID09IDApIHsKKwkJc2tiX3F1ZXVlX2hlYWQoJm5lc3FwLT5wYXVfbGlzdCwgc2tiKTsKKwl9IGVsc2UgeworCQl0bXBza2IgPSBuZXNxcC0+cGF1X2xpc3QubmV4dDsKKwkJd2hpbGUgKHRtcHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmbmVzcXAtPnBhdV9saXN0KSB7CisJCQljYiA9IChzdHJ1Y3QgbmVzX3Jza2JfY2IgKikmdG1wc2tiLT5jYlswXTsKKwkJCWlmIChiZWZvcmUoc2VxbnVtLCBjYi0+c2VxbnVtKSkKKwkJCQlicmVhazsKKwkJCXRtcHNrYiA9IHRtcHNrYi0+bmV4dDsKKwkJfQorCQlza2JfaW5zZXJ0KHRtcHNrYiwgc2tiLCAmbmVzcXAtPnBhdV9saXN0KTsKKwl9CisJaWYgKG5lc3FwLT5wYXVfc3RhdGUgPT0gUEFVX1JFQURZKQorCQlwcm9jZXNzX2l0ID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXNxcC0+cGF1X2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzX2l0KQorCQlwcm9jZXNzX2ZwZHVzKG5lc3ZuaWMsIG5lc3FwKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBtZ3RfdGhyZWFkIC0gSGFuZGxlIG1ndCBza2JzIGluIGEgc2FmZSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbnQgbWd0X3RocmVhZCh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYyA9IGNvbnRleHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG5lc3ZuaWMtPm1ndF93YWl0X3F1ZXVlLAorCQkJCQkgc2tiX3F1ZXVlX2xlbigmbmVzdm5pYy0+bWd0X3NrYl9saXN0KSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCQl3aGlsZSAoKHNrYl9xdWV1ZV9sZW4oJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCkpICYmICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZuZXN2bmljLT5tZ3Rfc2tiX2xpc3QpOworCQkJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJCQljYi0+ZGF0YV9zdGFydCA9IHNrYi0+ZGF0YSAtIEVUSF9ITEVOOworCQkJY2ItPmJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShuZXN2bmljLT5uZXNkZXYtPnBjaWRldiwgY2ItPmRhdGFfc3RhcnQsCisJCQkJCQkgICAgIG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXF1ZXVlX2ZwZHVzKHNrYiwgbmVzdm5pYywgY2ItPm5lc3FwKTsKKwkJfQorCX0KKworCS8qIENsb3NpbmcgZG93biBzbyBkZWxldGUgYW55IGVudHJpZXMgb24gdGhlIHF1ZXVlICovCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCkpIHsKKwkJc2tiID0gc2tiX2RlcXVldWUoJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCk7CisJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQluZXNfcmVtX3JlZl9jbV9ub2RlKGNiLT5uZXNxcC0+Y21fbm9kZSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG5lc19xdWV1ZV9za2JzIC0gUXVldWUgc2tiIHNvIGl0IGNhbiBiZSBoYW5kbGVkIGluIGEgdGhyZWFkIGNvbnRleHQKKyAqLwordm9pZCBuZXNfcXVldWVfbWd0X3NrYnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCkKK3sKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOworCisJY2IgPSAoc3RydWN0IG5lc19yc2tiX2NiICopJnNrYi0+Y2JbMF07CisJY2ItPm5lc3FwID0gbmVzcXA7CisJc2tiX3F1ZXVlX3RhaWwoJm5lc3ZuaWMtPm1ndF9za2JfbGlzdCwgc2tiKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5lc3ZuaWMtPm1ndF93YWl0X3F1ZXVlKTsKK30KKwordm9pZCBuZXNfZGVzdHJveV9wYXVfcXAoc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19xcCAqbmVzcXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF0b21pY19pbmMoJnBhdV9xcHNfZGVzdHJveWVkKTsKKworCS8qIEZyZWUgcGFja2V0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZvcndhcmRlZCAqLworCS8qIExvY2sgaXMgYWNxdWlyZWQgYnkgc2tiX2RlcXVldWUgd2hlbiByZW1vdmluZyB0aGUgc2tiICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworCXdoaWxlIChza2JfcXVldWVfbGVuKCZuZXNxcC0+cGF1X2xpc3QpKSB7CisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZuZXNxcC0+cGF1X2xpc3QpOworCQluZXNfbWd0X2ZyZWVfc2tiKG5lc2Rldiwgc2tiLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJbmVzX3JlbV9yZWZfY21fbm9kZShuZXNxcC0+Y21fbm9kZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc3FwLT5wYXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBuZXNfY2hnX3FoX2hhbmRsZXIoc3RydWN0IG5lc19kZXZpY2UgKm5lc2Rldiwgc3RydWN0IG5lc19jcXBfcmVxdWVzdCAqY3FwX3JlcXVlc3QpCit7CisJc3RydWN0IHBhdV9xaF9jaGcgKnFoX2NoZyA9IGNxcF9yZXF1ZXN0LT5jcXBfY2FsbGJhY2tfcG9pbnRlcjsKKwlzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICpuZXdfcmVxdWVzdDsKKwlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJc3RydWN0IG5lc19hZGFwdGVyICpuZXNhZGFwdGVyOworCXN0cnVjdCBuZXNfcXAgKm5lc3FwOworCXN0cnVjdCBuZXNfdjRfcXVhZCBuZXNfcXVhZDsKKwl1MzIgY3JjX3ZhbHVlOworCXU2NCB1NjR0ZW1wOworCisJbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKKwluZXNxcCA9IHFoX2NoZy0+bmVzcXA7CisKKwkvKiBTaG91bGQgd2UgaGFuZGxlIHRoZSBiYWQgY29tcGxldGlvbiAqLworCWlmIChjcXBfcmVxdWVzdC0+bWFqb3JfY29kZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGNxcF9yZXF1ZXN0IG1ham9yX2NvZGU9MHgleFxuIiwKKwkJICAgICAgIGNxcF9yZXF1ZXN0LT5tYWpvcl9jb2RlKTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwlzd2l0Y2ggKG5lc3FwLT5wYXVfc3RhdGUpIHsKKwljYXNlIFBBVV9ERUxfUUg6CisJCS8qIE9sZCBoYXNoIGNvZGUgZGVsZXRlZCwgbm93IHNldCB0aGUgbmV3IG9uZSAqLworCQluZXNxcC0+cGF1X3N0YXRlID0gUEFVX0FERF9MQl9RSDsKKwkJbmV3X3JlcXVlc3QgPSBuZXNfZ2V0X2NxcF9yZXF1ZXN0KG5lc2Rldik7CisJCWlmIChuZXdfcmVxdWVzdCA9PSBOVUxMKSB7CisJCQluZXNfZGVidWcoTkVTX0RCR19QQVUsICJGYWlsZWQgdG8gZ2V0IGEgbmV3X3JlcXVlc3QuXG4iKTsKKwkJCVdBUk5fT04oMSk7CisJCQlyZXR1cm47CisJCX0KKworCQltZW1zZXQoJm5lc19xdWFkLCAwLCBzaXplb2YobmVzX3F1YWQpKTsKKwkJbmVzX3F1YWQuRHN0SXBBZHJJbmRleCA9CisJCQljcHVfdG9fbGUzMigodTMyKVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbikgPDwgMjQpOworCQluZXNfcXVhZC5TcmNJcGFkciA9IGNwdV90b19iZTMyKDB4N2YwMDAwMDEpOworCQluZXNfcXVhZC5UY3BQb3J0c1swXSA9IHN3YWIxNihuZXNxcC0+bmVzcXBfY29udGV4dC0+dGNwUG9ydHNbMV0pOworCQluZXNfcXVhZC5UY3BQb3J0c1sxXSA9IHN3YWIxNihuZXNxcC0+bmVzcXBfY29udGV4dC0+dGNwUG9ydHNbMF0pOworCisJCS8qIFByb2R1Y2UgaGFzaCBrZXkgKi8KKwkJY3JjX3ZhbHVlID0gZ2V0X2NyY192YWx1ZSgmbmVzX3F1YWQpOworCQluZXNxcC0+aHRlX2luZGV4ID0gY3B1X3RvX2JlMzIoY3JjX3ZhbHVlIF4gMHhmZmZmZmZmZik7CisJCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIm5ldyBIVEUgSW5kZXggPSAweCUwOFgsIENSQyA9IDB4JTA4WFxuIiwKKwkJCSAgbmVzcXAtPmh0ZV9pbmRleCwgbmVzcXAtPmh0ZV9pbmRleCAmIG5lc2FkYXB0ZXItPmh0ZV9pbmRleF9tYXNrKTsKKworCQluZXNxcC0+aHRlX2luZGV4ICY9IG5lc2FkYXB0ZXItPmh0ZV9pbmRleF9tYXNrOworCQluZXNxcC0+bmVzcXBfY29udGV4dC0+aHRlX2luZGV4ID0gY3B1X3RvX2xlMzIobmVzcXAtPmh0ZV9pbmRleCk7CisJCW5lc3FwLT5uZXNxcF9jb250ZXh0LT5pcDAgPSBjcHVfdG9fbGUzMigweDdmMDAwMDAxKTsKKwkJbmVzcXAtPm5lc3FwX2NvbnRleHQtPnJjdl9ueHQgPSBjcHVfdG9fbGUzMihuZXNxcC0+cGF1X3Jjdl9ueHQpOworCisJCWNxcF93cWUgPSAmbmV3X3JlcXVlc3QtPmNxcF93cWU7CisJCW5lc19maWxsX2luaXRfY3FwX3dxZShjcXBfd3FlLCBuZXNkZXYpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywKKwkJCQkgICAgTkVTX0NRUF9XUUVfT1BDT0RFX0lEWCwgTkVTX0NRUF9NQU5BR0VfUVVBRF9IQVNIIHwKKwkJCQkgICAgTkVTX0NRUF9RUF9UWVBFX0lXQVJQIHwgTkVTX0NRUF9RUF9DT05URVhUX1ZBTElEIHwgTkVTX0NRUF9RUF9JV0FSUF9TVEFURV9SVFMpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfSURfSURYLCBuZXNxcC0+aHdxcC5xcF9pZCk7CisJCXU2NHRlbXAgPSAodTY0KW5lc3FwLT5uZXNxcF9jb250ZXh0X3BiYXNlOworCQlzZXRfd3FlXzY0Yml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9RUF9XUUVfQ09OVEVYVF9MT1dfSURYLCB1NjR0ZW1wKTsKKworCQluZXNfZGVidWcoTkVTX0RCR19QQVUsICJXYWl0aW5nIGZvciBDUVAgY29tcGxldGlvbiBmb3IgYWRkaW5nIHRoZSBxdWFkIGhhc2guXG4iKTsKKworCQluZXdfcmVxdWVzdC0+Y3FwX2NhbGxiYWNrX3BvaW50ZXIgPSBxaF9jaGc7CisJCW5ld19yZXF1ZXN0LT5jYWxsYmFjayA9IDE7CisJCW5ld19yZXF1ZXN0LT5jcXBfY2FsbGJhY2sgPSBuZXNfY2hnX3FoX2hhbmRsZXI7CisJCWF0b21pY19zZXQoJm5ld19yZXF1ZXN0LT5yZWZjb3VudCwgMSk7CisJCW5lc19wb3N0X2NxcF9yZXF1ZXN0KG5lc2RldiwgbmV3X3JlcXVlc3QpOworCQlicmVhazsKKworCWNhc2UgUEFVX0FERF9MQl9RSDoKKwkJLyogU3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWVkIGZwZHUncyAqLworCQluZXNxcC0+cGF1X3N0YXRlID0gUEFVX1JFQURZOworCQlwcm9jZXNzX2ZwZHVzKHFoX2NoZy0+bmVzdm5pYywgcWhfY2hnLT5uZXNxcCk7CisJCWtmcmVlKHFoX2NoZyk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBuZXNfY2hhbmdlX3F1YWRfaGFzaAorICovCitzdGF0aWMgaW50IG5lc19jaGFuZ2VfcXVhZF9oYXNoKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsCisJCQkJc3RydWN0IG5lc192bmljICpuZXN2bmljLCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCkKK3sKKwlzdHJ1Y3QgbmVzX2NxcF9yZXF1ZXN0ICpjcXBfcmVxdWVzdCA9IE5VTEw7CisJc3RydWN0IHBhdV9xaF9jaGcgKnFoX2NoZyA9IE5VTEw7CisJdTY0IHU2NHRlbXA7CisJc3RydWN0IG5lc19od19jcXBfd3FlICpjcXBfd3FlOworCWludCByZXQgPSAwOworCisJY3FwX3JlcXVlc3QgPSBuZXNfZ2V0X2NxcF9yZXF1ZXN0KG5lc2Rldik7CisJaWYgKGNxcF9yZXF1ZXN0ID09IE5VTEwpIHsKKwkJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAiRmFpbGVkIHRvIGdldCBhIGNxcF9yZXF1ZXN0LlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2hnX3FoX2VycjsKKwl9CisKKwlxaF9jaGcgPSBrbWFsbG9jKHNpemVvZiAqcWhfY2hnLCBHRlBfQVRPTUlDKTsKKwlpZiAocWhfY2hnID09IE5VTEwpIHsKKwkJbmVzX2RlYnVnKE5FU19EQkdfUEFVLCAiRmFpbGVkIHRvIGdldCBhIGNxcF9yZXF1ZXN0LlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2hnX3FoX2VycjsKKwl9CisJcWhfY2hnLT5uZXNkZXYgPSBuZXNkZXY7CisJcWhfY2hnLT5uZXN2bmljID0gbmVzdm5pYzsKKwlxaF9jaGctPm5lc3FwID0gbmVzcXA7CisJbmVzcXAtPnBhdV9zdGF0ZSA9IFBBVV9ERUxfUUg7CisKKwljcXBfd3FlID0gJmNxcF9yZXF1ZXN0LT5jcXBfd3FlOworCW5lc19maWxsX2luaXRfY3FwX3dxZShjcXBfd3FlLCBuZXNkZXYpOworCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLAorCQkJICAgIE5FU19DUVBfV1FFX09QQ09ERV9JRFgsIE5FU19DUVBfTUFOQUdFX1FVQURfSEFTSCB8IE5FU19DUVBfUVBfREVMX0hURSB8CisJCQkgICAgTkVTX0NRUF9RUF9UWVBFX0lXQVJQIHwgTkVTX0NRUF9RUF9DT05URVhUX1ZBTElEIHwgTkVTX0NRUF9RUF9JV0FSUF9TVEFURV9SVFMpOworCXNldF93cWVfMzJiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9JRF9JRFgsIG5lc3FwLT5od3FwLnFwX2lkKTsKKwl1NjR0ZW1wID0gKHU2NCluZXNxcC0+bmVzcXBfY29udGV4dF9wYmFzZTsKKwlzZXRfd3FlXzY0Yml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9RUF9XUUVfQ09OVEVYVF9MT1dfSURYLCB1NjR0ZW1wKTsKKworCW5lc19kZWJ1ZyhORVNfREJHX1BBVSwgIldhaXRpbmcgZm9yIENRUCBjb21wbGV0aW9uIGZvciBkZWxldGluZyB0aGUgcXVhZCBoYXNoLlxuIik7CisKKwljcXBfcmVxdWVzdC0+Y3FwX2NhbGxiYWNrX3BvaW50ZXIgPSBxaF9jaGc7CisJY3FwX3JlcXVlc3QtPmNhbGxiYWNrID0gMTsKKwljcXBfcmVxdWVzdC0+Y3FwX2NhbGxiYWNrID0gbmVzX2NoZ19xaF9oYW5kbGVyOworCWF0b21pY19zZXQoJmNxcF9yZXF1ZXN0LT5yZWZjb3VudCwgMSk7CisJbmVzX3Bvc3RfY3FwX3JlcXVlc3QobmVzZGV2LCBjcXBfcmVxdWVzdCk7CisKKwlyZXR1cm4gcmV0OworCitjaGdfcWhfZXJyOgorCWtmcmVlKHFoX2NoZyk7CisJaWYgKGNxcF9yZXF1ZXN0KQorCQluZXNfcHV0X2NxcF9yZXF1ZXN0KG5lc2RldiwgY3FwX3JlcXVlc3QpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbmVzX21ndF9jZV9oYW5kbGVyCisgKiBUaGlzIG1hbmFnZW1lbnQgY29kZSBkZWFscyB3aXRoIGFueSBwYWNrZWQgYW5kIHVuYWxpZ25lZCAocGF1KSBmcGR1J3MKKyAqIHRoYXQgdGhlIGhhcmR3YXJlIGNhbm5vdCBoYW5kbGUuCisgKi8KK3N0YXRpYyB2b2lkIG5lc19tZ3RfY2VfaGFuZGxlcihzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX2h3X25pY19jcSAqY3EpCit7CisJc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pYyA9IGNvbnRhaW5lcl9vZihjcSwgc3RydWN0IG5lc192bmljX21ndCwgbWd0X2NxKTsKKwlzdHJ1Y3QgbmVzX2FkYXB0ZXIgKm5lc2FkYXB0ZXIgPSBuZXNkZXYtPm5lc2FkYXB0ZXI7CisJdTMyIGhlYWQ7CisJdTMyIGNxX3NpemU7CisJdTMyIGNxZV9jb3VudCA9IDA7CisJdTMyIGNxZV9taXNjOworCXUzMiBxcF9pZCA9IDA7CisJdTMyIHNrYnNfbmVlZGVkOworCXVuc2lnbmVkIGxvbmcgY29udGV4dDsKKwlzdHJ1Y3QgbmVzX3FwICpuZXNxcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCXN0cnVjdCBuZXNfcnNrYl9jYiAqY2I7CisKKwloZWFkID0gY3EtPmNxX2hlYWQ7CisJY3Ffc2l6ZSA9IGNxLT5jcV9zaXplOworCisJd2hpbGUgKDEpIHsKKwkJY3FlX21pc2MgPSBsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19OSUNfQ1FFX01JU0NfSURYXSk7CisJCWlmICghKGNxZV9taXNjICYgTkVTX05JQ19DUUVfVkFMSUQpKQorCQkJYnJlYWs7CisKKwkJbmVzcXAgPSBOVUxMOworCQlpZiAoY3FlX21pc2MgJiBORVNfTklDX0NRRV9BQ0NRUF9WQUxJRCkgeworCQkJcXBfaWQgPSBsZTMyX3RvX2NwdShjcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19OSUNfQ1FFX0FDQ1FQX0lEX0lEWF0pOworCQkJcXBfaWQgJj0gMHgwMDFmZmZmZjsKKwkJCWlmIChxcF9pZCA8IG5lc2FkYXB0ZXItPm1heF9xcCkgeworCQkJCWNvbnRleHQgPSAodW5zaWduZWQgbG9uZyluZXNhZGFwdGVyLT5xcF90YWJsZVtxcF9pZCAtIE5FU19GSVJTVF9RUE5dOworCQkJCW5lc3FwID0gKHN0cnVjdCBuZXNfcXAgKiljb250ZXh0OworCQkJfQorCQl9CisKKwkJaWYgKG5lc3FwKSB7CisJCQlpZiAobmVzcXAtPnBhdV9tb2RlID09IGZhbHNlKSB7CisJCQkJbmVzcXAtPnBhdV9tb2RlID0gdHJ1ZTsgLyogRmlyc3QgdGltZSBmb3IgdGhpcyBxcCAqLworCQkJCW5lc3FwLT5wYXVfcmN2X254dCA9IGxlMzJfdG9fY3B1KAorCQkJCQljcS0+Y3FfdmJhc2VbaGVhZF0uY3FlX3dvcmRzW05FU19OSUNfQ1FFX0hBU0hfUkNWTlhUXSk7CisJCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmVzcXAtPnBhdV9saXN0KTsKKwkJCQlzcGluX2xvY2tfaW5pdCgmbmVzcXAtPnBhdV9sb2NrKTsKKwkJCQlhdG9taWNfaW5jKCZwYXVfcXBzX2NyZWF0ZWQpOworCQkJCW5lc19jaGFuZ2VfcXVhZF9oYXNoKG5lc2RldiwgbWd0dm5pYy0+bmVzdm5pYywgbmVzcXApOworCQkJfQorCisJCQlyeF9za2IgPSBtZ3R2bmljLT5tZ3Qucnhfc2tiW21ndHZuaWMtPm1ndC5ycV90YWlsXTsKKwkJCXJ4X3NrYi0+bGVuID0gMDsKKwkJCXNrYl9wdXQocnhfc2tiLCBjcWVfbWlzYyAmIDB4MDAwMGZmZmYpOworCQkJcnhfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHJ4X3NrYiwgbWd0dm5pYy0+bmVzdm5pYy0+bmV0ZGV2KTsKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZyeF9za2ItPmNiWzBdOworCQkJcGNpX3VubWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgY2ItPmJ1c2FkZHIsIGNiLT5tYXBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQljYi0+YnVzYWRkciA9IDA7CisJCQltZ3R2bmljLT5tZ3QucnFfdGFpbCsrOworCQkJbWd0dm5pYy0+bWd0LnJxX3RhaWwgJj0gbWd0dm5pYy0+bWd0LnJxX3NpemUgLSAxOworCisJCQluZXNfYWRkX3JlZl9jbV9ub2RlKG5lc3FwLT5jbV9ub2RlKTsKKwkJCW5lc19xdWV1ZV9tZ3Rfc2ticyhyeF9za2IsIG1ndHZuaWMtPm5lc3ZuaWMsIG5lc3FwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgUVAgJWQgZm9yIHBhY2tlZC91bmFsaWduZWQgaGFuZGxpbmdcbiIsIHFwX2lkKTsKKwkJfQorCisJCWNxLT5jcV92YmFzZVtoZWFkXS5jcWVfd29yZHNbTkVTX05JQ19DUUVfTUlTQ19JRFhdID0gMDsKKwkJY3FlX2NvdW50Kys7CisJCWlmICgrK2hlYWQgPj0gY3Ffc2l6ZSkKKwkJCWhlYWQgPSAwOworCisJCWlmIChjcWVfY291bnQgPT0gMjU1KSB7CisJCQkvKiBSZXBsZW5pc2ggbWd0IENRICovCisJCQluZXNfd3JpdGUzMihuZXNkZXYtPnJlZ3MgKyBORVNfQ1FFX0FMTE9DLCBjcS0+Y3FfbnVtYmVyIHwgKGNxZV9jb3VudCA8PCAxNikpOworCQkJbmVzZGV2LT5jdXJyY3FfY291bnQgKz0gY3FlX2NvdW50OworCQkJY3FlX2NvdW50ID0gMDsKKwkJfQorCisJCXNrYnNfbmVlZGVkID0gYXRvbWljX2luY19yZXR1cm4oJm1ndHZuaWMtPnJ4X3NrYnNfbmVlZGVkKTsKKwkJaWYgKHNrYnNfbmVlZGVkID4gKG1ndHZuaWMtPm1ndC5ycV9zaXplID4+IDEpKQorCQkJbmVzX3JlcGxlbmlzaF9tZ3RfcnEobWd0dm5pYyk7CisJfQorCisJY3EtPmNxX2hlYWQgPSBoZWFkOworCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19DUUVfQUxMT0MsIE5FU19DUUVfQUxMT0NfTk9USUZZX05FWFQgfAorCQkgICAgY3EtPmNxX251bWJlciB8IChjcWVfY291bnQgPDwgMTYpKTsKKwluZXNfcmVhZDMyKG5lc2Rldi0+cmVncyArIE5FU19DUUVfQUxMT0MpOworCW5lc2Rldi0+Y3VycmNxX2NvdW50ICs9IGNxZV9jb3VudDsKK30KKworLyoqCisgKiBuZXNfaW5pdF9tZ3RfcXAKKyAqLworaW50IG5lc19pbml0X21ndF9xcChzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMpCit7CisJc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pYzsKKwl1MzIgY291bnRlcjsKKwl2b2lkICp2bWVtOworCWRtYV9hZGRyX3QgcG1lbTsKKwlzdHJ1Y3QgbmVzX2h3X2NxcF93cWUgKmNxcF93cWU7CisJdTMyIGNxcF9oZWFkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5lc19od19uaWNfcXBfY29udGV4dCAqbWd0X2NvbnRleHQ7CisJdTY0IHU2NHRlbXA7CisJc3RydWN0IG5lc19od19uaWNfcnFfd3FlICptZ3RfcnFlOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIHdxZV9jb3VudDsKKwlzdHJ1Y3QgbmVzX3Jza2JfY2IgKmNiOworCXUzMiBtZ3RfbWVtX3NpemU7CisJdm9pZCAqbWd0X3ZiYXNlOworCWRtYV9hZGRyX3QgbWd0X3BiYXNlOworCWludCBpOworCWludCByZXQ7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSB0aGUgYWxsIG1ndCBRUHMgb25jZSAqLworCW1ndHZuaWMgPSBremFsbG9jKE5FU19NR1RfUVBfQ09VTlQgKiBzaXplb2Yoc3RydWN0IG5lc192bmljX21ndCksIEdGUF9LRVJORUwpOworCWlmIChtZ3R2bmljID09IE5VTEwpIHsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1ndCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBmcmFnbWVudCwgUlEsIGFuZCBDUTsgUmV1c2UgQ0VRIGJhc2VkIG9uIHRoZSBQQ0kgZnVuY3Rpb24gKi8KKwkvKiBXZSBhcmUgbm90IHNlbmRpbmcgZnJvbSB0aGlzIE5JQyBzbyBzcSBpcyBub3QgYWxsb2NhdGVkICovCisJbWd0X21lbV9zaXplID0gMjU2ICsKKwkJICAgICAgIChORVNfTUdUX1dRX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBuZXNfaHdfbmljX3JxX3dxZSkpICsKKwkJICAgICAgIChORVNfTUdUX1dRX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBuZXNfaHdfbmljX2NxZSkpICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbmVzX2h3X25pY19xcF9jb250ZXh0KTsKKwltZ3RfbWVtX3NpemUgPSAobWd0X21lbV9zaXplICsgUEFHRV9TSVpFIC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpOworCW1ndF92YmFzZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LCBORVNfTUdUX1FQX0NPVU5UICogbWd0X21lbV9zaXplLCAmbWd0X3BiYXNlKTsKKwlpZiAoIW1ndF92YmFzZSkgeworCQlrZnJlZShtZ3R2bmljKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1ndCBob3N0IGRlc2NyaXB0b3IgcmluZ3NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwluZXN2bmljLT5tZ3RfbWVtX3NpemUgPSBORVNfTUdUX1FQX0NPVU5UICogbWd0X21lbV9zaXplOworCW5lc3ZuaWMtPm1ndF92YmFzZSA9IG1ndF92YmFzZTsKKwluZXN2bmljLT5tZ3RfcGJhc2UgPSBtZ3RfcGJhc2U7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZuZXN2bmljLT5tZ3Rfc2tiX2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5lc3ZuaWMtPm1ndF93YWl0X3F1ZXVlKTsKKwluZXN2bmljLT5tZ3RfdGhyZWFkID0ga3RocmVhZF9ydW4obWd0X3RocmVhZCwgbmVzdm5pYywgIm5lc19tZ3RfdGhyZWFkIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkVTX01HVF9RUF9DT1VOVDsgaSsrKSB7CisJCW1ndHZuaWMtPm5lc3ZuaWMgPSBuZXN2bmljOworCQltZ3R2bmljLT5tZ3QucXBfaWQgPSBuZXNkZXYtPm1hY19pbmRleCArIE5FU19NR1RfUVBfT0ZGU0VUICsgaTsKKwkJbWVtc2V0KG1ndF92YmFzZSwgMCwgbWd0X21lbV9zaXplKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIkFsbG9jYXRlZCBtZ3QgUVAgc3RydWN0dXJlcyBhdCAlcCAocGh5cyA9ICUwMTZsWCksIHNpemUgPSAldS5cbiIsCisJCQkgIG1ndF92YmFzZSwgKHVuc2lnbmVkIGxvbmcpbWd0X3BiYXNlLCBtZ3RfbWVtX3NpemUpOworCisJCXZtZW0gPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpbWd0X3ZiYXNlICsgKDI1NiAtIDEpKSAmCisJCQkJfih1bnNpZ25lZCBsb25nKSgyNTYgLSAxKSk7CisJCXBtZW0gPSAoZG1hX2FkZHJfdCkoKCh1bnNpZ25lZCBsb25nIGxvbmcpbWd0X3BiYXNlICsgKDI1NiAtIDEpKSAmCisJCQkJICAgIH4odW5zaWduZWQgbG9uZyBsb25nKSgyNTYgLSAxKSk7CisKKwkJc3Bpbl9sb2NrX2luaXQoJm1ndHZuaWMtPm1ndC5ycV9sb2NrKTsKKworCQkvKiBzZXR1cCB0aGUgUlEgKi8KKwkJbWd0dm5pYy0+bWd0LnJxX3ZiYXNlID0gdm1lbTsKKwkJbWd0dm5pYy0+bWd0LnJxX3BiYXNlID0gcG1lbTsKKwkJbWd0dm5pYy0+bWd0LnJxX2hlYWQgPSAwOworCQltZ3R2bmljLT5tZ3QucnFfdGFpbCA9IDA7CisJCW1ndHZuaWMtPm1ndC5ycV9zaXplID0gTkVTX01HVF9XUV9DT1VOVDsKKworCQkvKiBzZXR1cCB0aGUgQ1EgKi8KKwkJdm1lbSArPSAoTkVTX01HVF9XUV9DT1VOVCAqIHNpemVvZihzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUpKTsKKwkJcG1lbSArPSAoTkVTX01HVF9XUV9DT1VOVCAqIHNpemVvZihzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUpKTsKKworCQltZ3R2bmljLT5tZ3RfY3EuY3FfbnVtYmVyID0gbWd0dm5pYy0+bWd0LnFwX2lkOworCQltZ3R2bmljLT5tZ3RfY3EuY3FfdmJhc2UgPSB2bWVtOworCQltZ3R2bmljLT5tZ3RfY3EuY3FfcGJhc2UgPSBwbWVtOworCQltZ3R2bmljLT5tZ3RfY3EuY3FfaGVhZCA9IDA7CisJCW1ndHZuaWMtPm1ndF9jcS5jcV9zaXplID0gTkVTX01HVF9XUV9DT1VOVDsKKworCQltZ3R2bmljLT5tZ3RfY3EuY2VfaGFuZGxlciA9IG5lc19tZ3RfY2VfaGFuZGxlcjsKKworCQkvKiBTZW5kIENyZWF0ZUNRIHJlcXVlc3QgdG8gQ1FQICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNkZXYtPmNxcC5sb2NrLCBmbGFncyk7CisJCWNxcF9oZWFkID0gbmVzZGV2LT5jcXAuc3FfaGVhZDsKKworCQljcXBfd3FlID0gJm5lc2Rldi0+Y3FwLnNxX3ZiYXNlW2NxcF9oZWFkXTsKKwkJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX09QQ09ERV9JRFhdID0gY3B1X3RvX2xlMzIoCisJCQlORVNfQ1FQX0NSRUFURV9DUSB8IE5FU19DUVBfQ1FfQ0VRX1ZBTElEIHwKKwkJCSgodTMyKW1ndHZuaWMtPm1ndF9jcS5jcV9zaXplIDw8IDE2KSk7CisJCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9JRF9JRFhdID0gY3B1X3RvX2xlMzIoCisJCQltZ3R2bmljLT5tZ3RfY3EuY3FfbnVtYmVyIHwgKCh1MzIpbmVzZGV2LT5jZXFfaW5kZXggPDwgMTYpKTsKKwkJdTY0dGVtcCA9ICh1NjQpbWd0dm5pYy0+bWd0X2NxLmNxX3BiYXNlOworCQlzZXRfd3FlXzY0Yml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9DUV9XUUVfUEJMX0xPV19JRFgsIHU2NHRlbXApOworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9DUV9XUUVfQ1FfQ09OVEVYVF9ISUdIX0lEWF0gPSAwOworCQl1NjR0ZW1wID0gKHVuc2lnbmVkIGxvbmcpJm1ndHZuaWMtPm1ndF9jcTsKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfQ1FfV1FFX0NRX0NPTlRFWFRfTE9XX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKSh1NjR0ZW1wID4+IDEpKTsKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfQ1FfV1FFX0NRX0NPTlRFWFRfSElHSF9JRFhdID0KKwkJCWNwdV90b19sZTMyKCgodTMyKSgodTY0dGVtcCkgPj4gMzMpKSAmIDB4N0ZGRkZGRkYpOworCQljcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9DUV9XUUVfRE9PUkJFTExfSU5ERVhfSElHSF9JRFhdID0gMDsKKworCQlpZiAoKytjcXBfaGVhZCA+PSBuZXNkZXYtPmNxcC5zcV9zaXplKQorCQkJY3FwX2hlYWQgPSAwOworCQljcXBfd3FlID0gJm5lc2Rldi0+Y3FwLnNxX3ZiYXNlW2NxcF9oZWFkXTsKKwkJbmVzX2ZpbGxfaW5pdF9jcXBfd3FlKGNxcF93cWUsIG5lc2Rldik7CisKKwkJLyogU2VuZCBDcmVhdGVRUCByZXF1ZXN0IHRvIENRUCAqLworCQltZ3RfY29udGV4dCA9ICh2b2lkICopKCZtZ3R2bmljLT5tZ3RfY3EuY3FfdmJhc2VbbWd0dm5pYy0+bWd0X2NxLmNxX3NpemVdKTsKKwkJbWd0X2NvbnRleHQtPmNvbnRleHRfd29yZHNbTkVTX05JQ19DVFhfTUlTQ19JRFhdID0KKwkJCWNwdV90b19sZTMyKCh1MzIpTkVTX01HVF9DVFhfU0laRSB8CisJCQkJICAgICgodTMyKVBDSV9GVU5DKG5lc2Rldi0+cGNpZGV2LT5kZXZmbikgPDwgMTIpKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIlJYX1dJTkRPV19CVUZGRVJfUEFHRV9UQUJMRV9TSVpFID0gMHglMDhYLCBSWF9XSU5ET1dfQlVGRkVSX1NJWkUgPSAweCUwOFhcbiIsCisJCQkgIG5lc19yZWFkX2luZGV4ZWQobmVzZGV2LCBORVNfSURYX1JYX1dJTkRPV19CVUZGRVJfUEFHRV9UQUJMRV9TSVpFKSwKKwkJCSAgbmVzX3JlYWRfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfUlhfV0lORE9XX0JVRkZFUl9TSVpFKSk7CisJCWlmIChuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9SWF9XSU5ET1dfQlVGRkVSX1NJWkUpICE9IDApCisJCQltZ3RfY29udGV4dC0+Y29udGV4dF93b3Jkc1tORVNfTklDX0NUWF9NSVNDX0lEWF0gfD0gY3B1X3RvX2xlMzIoTkVTX05JQ19CQUNLX1NUT1JFKTsKKworCQl1NjR0ZW1wID0gKHU2NCltZ3R2bmljLT5tZ3QucnFfcGJhc2U7CisJCW1ndF9jb250ZXh0LT5jb250ZXh0X3dvcmRzW05FU19OSUNfQ1RYX1NRX0xPV19JRFhdID0gY3B1X3RvX2xlMzIoKHUzMil1NjR0ZW1wKTsKKwkJbWd0X2NvbnRleHQtPmNvbnRleHRfd29yZHNbTkVTX05JQ19DVFhfU1FfSElHSF9JRFhdID0gY3B1X3RvX2xlMzIoKHUzMikodTY0dGVtcCA+PiAzMikpOworCQl1NjR0ZW1wID0gKHU2NCltZ3R2bmljLT5tZ3QucnFfcGJhc2U7CisJCW1ndF9jb250ZXh0LT5jb250ZXh0X3dvcmRzW05FU19OSUNfQ1RYX1JRX0xPV19JRFhdID0gY3B1X3RvX2xlMzIoKHUzMil1NjR0ZW1wKTsKKwkJbWd0X2NvbnRleHQtPmNvbnRleHRfd29yZHNbTkVTX05JQ19DVFhfUlFfSElHSF9JRFhdID0gY3B1X3RvX2xlMzIoKHUzMikodTY0dGVtcCA+PiAzMikpOworCisJCWNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9PUENPREVfSURYXSA9IGNwdV90b19sZTMyKE5FU19DUVBfQ1JFQVRFX1FQIHwKKwkJCQkJCQkJCSBORVNfQ1FQX1FQX1RZUEVfTklDKTsKKwkJY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0lEX0lEWF0gPSBjcHVfdG9fbGUzMihtZ3R2bmljLT5tZ3QucXBfaWQpOworCQl1NjR0ZW1wID0gKHU2NCltZ3R2bmljLT5tZ3RfY3EuY3FfcGJhc2UgKworCQkJICAobWd0dm5pYy0+bWd0X2NxLmNxX3NpemUgKiBzaXplb2Yoc3RydWN0IG5lc19od19uaWNfY3FlKSk7CisJCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1FQX1dRRV9DT05URVhUX0xPV19JRFgsIHU2NHRlbXApOworCisJCWlmICgrK2NxcF9oZWFkID49IG5lc2Rldi0+Y3FwLnNxX3NpemUpCisJCQljcXBfaGVhZCA9IDA7CisJCW5lc2Rldi0+Y3FwLnNxX2hlYWQgPSBjcXBfaGVhZDsKKworCQliYXJyaWVyKCk7CisKKwkJLyogUmluZyBkb29yYmVsbCAoMiBXUUVzKSAqLworCQluZXNfd3JpdGUzMihuZXNkZXYtPnJlZ3MgKyBORVNfV1FFX0FMTE9DLCAweDAyODAwMDAwIHwgbmVzZGV2LT5jcXAucXBfaWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc2Rldi0+Y3FwLmxvY2ssIGZsYWdzKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIldhaXRpbmcgZm9yIGNyZWF0ZSBNR1QgUVAldSB0byBjb21wbGV0ZS5cbiIsCisJCQkgIG1ndHZuaWMtPm1ndC5xcF9pZCk7CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG5lc2Rldi0+Y3FwLndhaXRxLCAobmVzZGV2LT5jcXAuc3FfdGFpbCA9PSBjcXBfaGVhZCksCisJCQkJCSBORVNfRVZFTlRfVElNRU9VVCk7CisJCW5lc19kZWJ1ZyhORVNfREJHX0lOSVQsICJDcmVhdGUgTUdUIFFQJXUgY29tcGxldGVkLCB3YWl0X2V2ZW50X3RpbWVvdXQgcmV0ID0gJXUuXG4iLAorCQkJICBtZ3R2bmljLT5tZ3QucXBfaWQsIHJldCk7CisJCWlmICghcmV0KSB7CisJCQluZXNfZGVidWcoTkVTX0RCR19JTklULCAiTUdUIFFQJXUgY3JlYXRlIHRpbWVvdXQgZXhwaXJlZFxuIiwgbWd0dm5pYy0+bWd0LnFwX2lkKTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5lc2Rldi0+cGNpZGV2LCBuZXN2bmljLT5tZ3RfbWVtX3NpemUsIG5lc3ZuaWMtPm1ndF92YmFzZSwKKwkJCQkJCSAgICBuZXN2bmljLT5tZ3RfcGJhc2UpOworCQkJCWtmcmVlKG1ndHZuaWMpOworCQkJfSBlbHNlIHsKKwkJCQluZXNfZGVzdHJveV9tZ3QobmVzdm5pYyk7CisJCQl9CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIFBvcHVsYXRlIHRoZSBSUSAqLworCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgKE5FU19NR1RfV1FfQ09VTlQgLSAxKTsgY291bnRlcisrKSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplKTsKKwkJCWlmICghc2tiKSB7CisJCQkJbmVzX2RlYnVnKE5FU19EQkdfSU5JVCwgIiVzOiBvdXQgb2YgbWVtb3J5IGZvciByZWNlaXZlIHNrYlxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJc2tiLT5kZXYgPSBuZXRkZXY7CisKKwkJCXBtZW0gPSBwY2lfbWFwX3NpbmdsZShuZXNkZXYtPnBjaWRldiwgc2tiLT5kYXRhLAorCQkJCQkgICAgICBuZXN2bmljLT5tYXhfZnJhbWVfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWNiID0gKHN0cnVjdCBuZXNfcnNrYl9jYiAqKSZza2ItPmNiWzBdOworCQkJY2ItPmJ1c2FkZHIgPSBwbWVtOworCQkJY2ItPm1hcGxlbiA9IG5lc3ZuaWMtPm1heF9mcmFtZV9zaXplOworCisJCQltZ3RfcnFlID0gJm1ndHZuaWMtPm1ndC5ycV92YmFzZVtjb3VudGVyXTsKKwkJCW1ndF9ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfMV8wX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKW5lc3ZuaWMtPm1heF9mcmFtZV9zaXplKTsKKwkJCW1ndF9ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9MRU5HVEhfM18yX0lEWF0gPSAwOworCQkJbWd0X3JxZS0+d3FlX3dvcmRzW05FU19OSUNfUlFfV1FFX0ZSQUcwX0xPV19JRFhdID0gY3B1X3RvX2xlMzIoKHUzMilwbWVtKTsKKwkJCW1ndF9ycWUtPndxZV93b3Jkc1tORVNfTklDX1JRX1dRRV9GUkFHMF9ISUdIX0lEWF0gPSBjcHVfdG9fbGUzMigodTMyKSgodTY0KXBtZW0gPj4gMzIpKTsKKwkJCW1ndHZuaWMtPm1ndC5yeF9za2JbY291bnRlcl0gPSBza2I7CisJCX0KKworCQlpbml0X3RpbWVyKCZtZ3R2bmljLT5ycV93cWVzX3RpbWVyKTsKKwkJbWd0dm5pYy0+cnFfd3Flc190aW1lci5mdW5jdGlvbiA9IG5lc19tZ3RfcnFfd3Flc190aW1lb3V0OworCQltZ3R2bmljLT5ycV93cWVzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyltZ3R2bmljOworCisJCXdxZV9jb3VudCA9IE5FU19NR1RfV1FfQ09VTlQgLSAxOworCQltZ3R2bmljLT5tZ3QucnFfaGVhZCA9IHdxZV9jb3VudDsKKwkJYmFycmllcigpOworCQlkbyB7CisJCQljb3VudGVyID0gbWluKHdxZV9jb3VudCwgKCh1MzIpMjU1KSk7CisJCQl3cWVfY291bnQgLT0gY291bnRlcjsKKwkJCW5lc193cml0ZTMyKG5lc2Rldi0+cmVncyArIE5FU19XUUVfQUxMT0MsIChjb3VudGVyIDw8IDI0KSB8IG1ndHZuaWMtPm1ndC5xcF9pZCk7CisJCX0gd2hpbGUgKHdxZV9jb3VudCk7CisKKwkJbmVzX3dyaXRlMzIobmVzZGV2LT5yZWdzICsgTkVTX0NRRV9BTExPQywgTkVTX0NRRV9BTExPQ19OT1RJRllfTkVYVCB8CisJCQkgICAgbWd0dm5pYy0+bWd0X2NxLmNxX251bWJlcik7CisJCW5lc19yZWFkMzIobmVzZGV2LT5yZWdzICsgTkVTX0NRRV9BTExPQyk7CisKKwkJbWd0X3ZiYXNlICs9IG1ndF9tZW1fc2l6ZTsKKwkJbWd0X3BiYXNlICs9IG1ndF9tZW1fc2l6ZTsKKwkJbmVzdm5pYy0+bWd0dm5pY1tpXSA9IG1ndHZuaWMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBuZXNfZGVzdHJveV9tZ3Qoc3RydWN0IG5lc192bmljICpuZXN2bmljKQoreworCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYgPSBuZXN2bmljLT5uZXNkZXY7CisJc3RydWN0IG5lc192bmljX21ndCAqbWd0dm5pYzsKKwlzdHJ1Y3QgbmVzX3ZuaWNfbWd0ICpmaXJzdF9tZ3R2bmljOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5lc19od19jcXBfd3FlICpjcXBfd3FlOworCXUzMiBjcXBfaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCWludCBpOworCWludCByZXQ7CisKKwlrdGhyZWFkX3N0b3AobmVzdm5pYy0+bWd0X3RocmVhZCk7CisKKwkvKiBGcmVlIHJlbWFpbmluZyBOSUMgcmVjZWl2ZSBidWZmZXJzICovCisJZmlyc3RfbWd0dm5pYyA9IG5lc3ZuaWMtPm1ndHZuaWNbMF07CisJZm9yIChpID0gMDsgaSA8IE5FU19NR1RfUVBfQ09VTlQ7IGkrKykgeworCQltZ3R2bmljID0gbmVzdm5pYy0+bWd0dm5pY1tpXTsKKwkJaWYgKG1ndHZuaWMgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlIChtZ3R2bmljLT5tZ3QucnFfaGVhZCAhPSBtZ3R2bmljLT5tZ3QucnFfdGFpbCkgeworCQkJcnhfc2tiID0gbWd0dm5pYy0+bWd0LnJ4X3NrYlttZ3R2bmljLT5tZ3QucnFfdGFpbF07CisJCQluZXNfbWd0X2ZyZWVfc2tiKG5lc2Rldiwgcnhfc2tiLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbWd0dm5pYy0+bWd0LnJxX3RhaWwrKzsKKwkJCW1ndHZuaWMtPm1ndC5ycV90YWlsICY9IChtZ3R2bmljLT5tZ3QucnFfc2l6ZSAtIDEpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5lc2Rldi0+Y3FwLmxvY2ssIGZsYWdzKTsKKworCQkvKiBEZXN0cm95IE5JQyBRUCAqLworCQljcXBfaGVhZCA9IG5lc2Rldi0+Y3FwLnNxX2hlYWQ7CisJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwX2hlYWRdOworCQluZXNfZmlsbF9pbml0X2NxcF93cWUoY3FwX3dxZSwgbmVzZGV2KTsKKworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfT1BDT0RFX0lEWCwKKwkJCQkgICAgKE5FU19DUVBfREVTVFJPWV9RUCB8IE5FU19DUVBfUVBfVFlQRV9OSUMpKTsKKwkJc2V0X3dxZV8zMmJpdF92YWx1ZShjcXBfd3FlLT53cWVfd29yZHMsIE5FU19DUVBfV1FFX0lEX0lEWCwKKwkJCQkgICAgbWd0dm5pYy0+bWd0LnFwX2lkKTsKKworCQlpZiAoKytjcXBfaGVhZCA+PSBuZXNkZXYtPmNxcC5zcV9zaXplKQorCQkJY3FwX2hlYWQgPSAwOworCisJCWNxcF93cWUgPSAmbmVzZGV2LT5jcXAuc3FfdmJhc2VbY3FwX2hlYWRdOworCisJCS8qIERlc3Ryb3kgTklDIENRICovCisJCW5lc19maWxsX2luaXRfY3FwX3dxZShjcXBfd3FlLCBuZXNkZXYpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfT1BDT0RFX0lEWCwKKwkJCQkgICAgKE5FU19DUVBfREVTVFJPWV9DUSB8ICgodTMyKW1ndHZuaWMtPm1ndF9jcS5jcV9zaXplIDw8IDE2KSkpOworCQlzZXRfd3FlXzMyYml0X3ZhbHVlKGNxcF93cWUtPndxZV93b3JkcywgTkVTX0NRUF9XUUVfSURfSURYLAorCQkJCSAgICAobWd0dm5pYy0+bWd0X2NxLmNxX251bWJlciB8ICgodTMyKW5lc2Rldi0+Y2VxX2luZGV4IDw8IDE2KSkpOworCisJCWlmICgrK2NxcF9oZWFkID49IG5lc2Rldi0+Y3FwLnNxX3NpemUpCisJCQljcXBfaGVhZCA9IDA7CisKKwkJbmVzZGV2LT5jcXAuc3FfaGVhZCA9IGNxcF9oZWFkOworCQliYXJyaWVyKCk7CisKKwkJLyogUmluZyBkb29yYmVsbCAoMiBXUUVzKSAqLworCQluZXNfd3JpdGUzMihuZXNkZXYtPnJlZ3MgKyBORVNfV1FFX0FMTE9DLCAweDAyODAwMDAwIHwgbmVzZGV2LT5jcXAucXBfaWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5lc2Rldi0+Y3FwLmxvY2ssIGZsYWdzKTsKKwkJbmVzX2RlYnVnKE5FU19EQkdfU0hVVERPV04sICJXYWl0aW5nIGZvciBDUVAsIGNxcF9oZWFkPSV1LCBjcXAuc3FfaGVhZD0ldSwiCisJCQkgICIgY3FwLnNxX3RhaWw9JXUsIGNxcC5zcV9zaXplPSV1XG4iLAorCQkJICBjcXBfaGVhZCwgbmVzZGV2LT5jcXAuc3FfaGVhZCwKKwkJCSAgbmVzZGV2LT5jcXAuc3FfdGFpbCwgbmVzZGV2LT5jcXAuc3Ffc2l6ZSk7CisKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG5lc2Rldi0+Y3FwLndhaXRxLCAobmVzZGV2LT5jcXAuc3FfdGFpbCA9PSBjcXBfaGVhZCksCisJCQkJCSBORVNfRVZFTlRfVElNRU9VVCk7CisKKwkJbmVzX2RlYnVnKE5FU19EQkdfU0hVVERPV04sICJEZXN0cm95IE1HVCBRUCByZXR1cm5lZCwgd2FpdF9ldmVudF90aW1lb3V0IHJldCA9ICV1LCBjcXBfaGVhZD0ldSwiCisJCQkgICIgY3FwLnNxX2hlYWQ9JXUsIGNxcC5zcV90YWlsPSV1XG4iLAorCQkJICByZXQsIGNxcF9oZWFkLCBuZXNkZXYtPmNxcC5zcV9oZWFkLCBuZXNkZXYtPmNxcC5zcV90YWlsKTsKKwkJaWYgKCFyZXQpCisJCQluZXNfZGVidWcoTkVTX0RCR19TSFVURE9XTiwgIk1HVCBRUCV1IGRlc3Ryb3kgdGltZW91dCBleHBpcmVkXG4iLAorCQkJCSAgbWd0dm5pYy0+bWd0LnFwX2lkKTsKKworCQluZXN2bmljLT5tZ3R2bmljW2ldID0gTlVMTDsKKwl9CisKKwlpZiAobmVzdm5pYy0+bWd0X3ZiYXNlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmVzZGV2LT5wY2lkZXYsIG5lc3ZuaWMtPm1ndF9tZW1fc2l6ZSwgbmVzdm5pYy0+bWd0X3ZiYXNlLAorCQkJCSAgICBuZXN2bmljLT5tZ3RfcGJhc2UpOworCQluZXN2bmljLT5tZ3RfdmJhc2UgPSBOVUxMOworCQluZXN2bmljLT5tZ3RfcGJhc2UgPSAwOworCX0KKworCWtmcmVlKGZpcnN0X21ndHZuaWMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbWd0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19tZ3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhhZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbWd0LmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyogQ29weXJpZ2h0IChjKSAyMDEwIEludGVsLU5FLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyoKKyogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgIGRpc2NsYWltZXIuCisqCisqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorKiBTT0ZUV0FSRS4KKyovCisKKyNpZm5kZWYgX19ORVNfTUdUX0gKKyNkZWZpbmUgX19ORVNfTUdUX0gKKworI2RlZmluZSBNUEFfRlJBTUlORyA2CS8qIGxlbmd0aCBpcyAyIGJ5dGVzLCBjcmMgaXMgNCBieXRlcyAqLworCitpbnQgbmVzX2luaXRfbWd0X3FwKHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYyk7Cit2b2lkIG5lc19xdWV1ZV9tZ3Rfc2ticyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmVzX3ZuaWMgKm5lc3ZuaWMsIHN0cnVjdCBuZXNfcXAgKm5lc3FwKTsKK3ZvaWQgbmVzX2Rlc3Ryb3lfbWd0KHN0cnVjdCBuZXNfdm5pYyAqbmVzdm5pYyk7Cit2b2lkIG5lc19kZXN0cm95X3BhdV9xcChzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCBzdHJ1Y3QgbmVzX3FwICpuZXNxcCk7CisKK3N0cnVjdCBuZXNfaHdfbWd0IHsKKwlzdHJ1Y3QgbmVzX2h3X25pY19ycV93cWUgKnJxX3ZiYXNlOwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcnEgKi8KKwlkbWFfYWRkcl90IHJxX3BiYXNlOwkJCS8qIFBDSSBtZW1vcnkgZm9yIGhvc3QgcmluZ3MgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiW05FU19OSUNfV1FfU0laRV07CisJdTE2IHFwX2lkOworCXUxNiBzcV9oZWFkOworCXUxNiBycV9oZWFkOworCXUxNiBycV90YWlsOworCXUxNiBycV9zaXplOworCXU4IHJlcGxlbmlzaGluZ19ycTsKKwl1OCByZXNlcnZlZDsKKwlzcGlubG9ja190IHJxX2xvY2s7Cit9OworCitzdHJ1Y3QgbmVzX3ZuaWNfbWd0IHsKKwlzdHJ1Y3QgbmVzX3ZuaWMgICAgICAgICpuZXN2bmljOworCXN0cnVjdCBuZXNfaHdfbWd0ICAgICAgbWd0OworCXN0cnVjdCBuZXNfaHdfbmljX2NxICAgbWd0X2NxOworCWF0b21pY190ICAgICAgICAgICAgICAgcnhfc2tic19uZWVkZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICBycV93cWVzX3RpbWVyOworCWF0b21pY190ICAgICAgICAgICAgICAgcnhfc2tiX3RpbWVyX3J1bm5pbmc7Cit9OworCisjZGVmaW5lIE1BWF9GUERVX0ZSQUdTIDQKK3N0cnVjdCBwYXVfZnBkdV9mcmFnIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICpza2I7CisJdTY0ICAgICAgICAgICAgICAgICAgICBwaHlzYWRkcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGZyYWdfbGVuOworCWJvb2wgICAgICAgICAgICAgICAgICAgY21wbHQ7Cit9OworCitzdHJ1Y3QgcGF1X2ZwZHVfaW5mbyB7CisJc3RydWN0IG5lc19xcCAgICAgICAgICAqbmVzcXA7CisJc3RydWN0IG5lc19jcXBfcmVxdWVzdCAqY3FwX3JlcXVlc3Q7CisJdm9pZCAgICAgICAgICAgICAgICAgICAqaGRyX3ZiYXNlOworCWRtYV9hZGRyX3QgICAgICAgICAgICAgaGRyX3BiYXNlOworCWludCAgICAgICAgICAgICAgICAgICAgaGRyX2xlbjsKKwl1MTYgICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOworCXUxNiAgICAgICAgICAgICAgICAgICAgZnJhZ19jbnQ7CisJc3RydWN0IHBhdV9mcGR1X2ZyYWcgICBmcmFnc1tNQVhfRlBEVV9GUkFHU107Cit9OworCitlbnVtIHBhdV9xaF9zdGF0ZSB7CisJUEFVX0RFTF9RSCwKKwlQQVVfQUREX0xCX1FILAorCVBBVV9SRUFEWQorfTsKKworc3RydWN0IHBhdV9xaF9jaGcgeworCXN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXY7CisJc3RydWN0IG5lc192bmljICpuZXN2bmljOworCXN0cnVjdCBuZXNfcXAgKm5lc3FwOworfTsKKworI2VuZGlmICAgICAgICAgIC8qIF9fTkVTX01HVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCmluZGV4IDQ3YjJlZTQuLmMwMGQyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCkBAIC0xMDkxLDYgKzEwOTEsOCBAQAogCSJMUk8gYWdncmVnYXRlZCIsCiAJIkxSTyBmbHVzaGVkIiwKIAkiTFJPIG5vX2Rlc2MiLAorCSJQQVUgQ3JlYXRlUVBzIiwKKwkiUEFVIERlc3Ryb3lRUHMiLAogfTsKICNkZWZpbmUgTkVTX0VUSFRPT0xfU1RBVF9DT1VOVCAgQVJSQVlfU0laRShuZXNfZXRodG9vbF9zdHJpbmdzZXQpCiAKQEAgLTEzMDYsNiArMTMwOCw4IEBACiAJdGFyZ2V0X3N0YXRfdmFsdWVzWysraW5kZXhdID0gbmVzdm5pYy0+bHJvX21nci5zdGF0cy5hZ2dyZWdhdGVkOwogCXRhcmdldF9zdGF0X3ZhbHVlc1srK2luZGV4XSA9IG5lc3ZuaWMtPmxyb19tZ3Iuc3RhdHMuZmx1c2hlZDsKIAl0YXJnZXRfc3RhdF92YWx1ZXNbKytpbmRleF0gPSBuZXN2bmljLT5scm9fbWdyLnN0YXRzLm5vX2Rlc2M7CisJdGFyZ2V0X3N0YXRfdmFsdWVzWysraW5kZXhdID0gYXRvbWljX3JlYWQoJnBhdV9xcHNfY3JlYXRlZCk7CisJdGFyZ2V0X3N0YXRfdmFsdWVzWysraW5kZXhdID0gYXRvbWljX3JlYWQoJnBhdV9xcHNfZGVzdHJveWVkKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc191dGlscy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdXRpbHMuYwppbmRleCBmOWM0MTdjLi5jZDEwOTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc191dGlscy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3V0aWxzLmMKQEAgLTUxLDEzICs1MSwzNCBAQAogCiAjaW5jbHVkZSAibmVzLmgiCiAKLQotCiBzdGF0aWMgdTE2IG5lc19yZWFkMTZfZWVwcm9tKHZvaWQgX19pb21lbSAqYWRkciwgdTE2IG9mZnNldCk7CiAKIHUzMiBtaF9kZXRlY3RlZDsKIHUzMiBtaF9wYXVzZXNfc2VudDsKIAordTMyIG5lc19zZXRfcGF1KHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYpCit7CisJdTMyIHJldCA9IDA7CisJdTMyIGNvdW50ZXI7CisKKwluZXNfd3JpdGVfaW5kZXhlZChuZXNkZXYsIE5FU19JRFhfR1BSMiwgTkVTX0VOQUJMRV9QQVUpOworCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9HUFJfVFJJR0dFUiwgMSk7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgTkVTX1BBVV9DT1VOVEVSOyBjb3VudGVyKyspIHsKKwkJdWRlbGF5KDMwKTsKKwkJaWYgKCFuZXNfcmVhZF9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9HUFIyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlBBVSBpcyBzdXBwb3J0ZWQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCW5lc193cml0ZV9pbmRleGVkKG5lc2RldiwgTkVTX0lEWF9HUFJfVFJJR0dFUiwgMSk7CisJfQorCWlmIChjb3VudGVyID09IE5FU19QQVVfQ09VTlRFUikgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUEFVIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBuZXNfcmVhZF9lZXByb21fdmFsdWVzIC0KICAqLwpAQCAtMTg3LDYgKzIwOCwxMSBAQAogCQlpZiAoKChtYWpvcl92ZXIgPT0gMykgJiYgKG1pbm9yX3ZlciA+PSAxNikpIHx8IChtYWpvcl92ZXIgPiAzKSkKIAkJCW5lc2FkYXB0ZXItPnNlbmRfdGVybV9vayA9IDE7CiAKKwkJaWYgKG5lc19kcnZfb3B0ICYgTkVTX0RSVl9PUFRfRU5BQkxFX1BBVSkgeworCQkJaWYgKCFuZXNfc2V0X3BhdShuZXNkZXYpKQorCQkJCW5lc2FkYXB0ZXItPmFsbG93X3VuYWxpZ25lZF9mcGR1cyA9IDE7CisJCX0KKwogCQluZXNhZGFwdGVyLT5maXJtd2FyZV92ZXJzaW9uID0gKCgodTMyKSh1OCkoZWVwcm9tX2RhdGE+PjgpKSAgPDwgIDE2KSArCiAJCQkJKHUzMikoKHU4KWVlcHJvbV9kYXRhKTsKIApAQCAtNTk0LDYgKzYyMCw3IEBACiAJCW5lc19mcmVlX2NxcF9yZXF1ZXN0KG5lc2RldiwgY3FwX3JlcXVlc3QpOwogfQogCisKIC8qKgogICogbmVzX3Bvc3RfY3FwX3JlcXVlc3QKICAqLwpAQCAtNjA0LDYgKzYzMSw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgY3FwX2hlYWQ7CiAJdTY0IHU2NHRlbXA7CisJdTMyIG9wY29kZTsKKwlpbnQgY3R4X2luZGV4ID0gTkVTX0NRUF9XUUVfQ09NUF9DVFhfTE9XX0lEWDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuZXNkZXYtPmNxcC5sb2NrLCBmbGFncyk7CiAKQEAgLTYxNCwxNyArNjQzLDIwIEBACiAJCW5lc2Rldi0+Y3FwLnNxX2hlYWQgJj0gbmVzZGV2LT5jcXAuc3Ffc2l6ZS0xOwogCQljcXBfd3FlID0gJm5lc2Rldi0+Y3FwLnNxX3ZiYXNlW2NxcF9oZWFkXTsKIAkJbWVtY3B5KGNxcF93cWUsICZjcXBfcmVxdWVzdC0+Y3FwX3dxZSwgc2l6ZW9mKCpjcXBfd3FlKSk7CisJCW9wY29kZSA9IGxlMzJfdG9fY3B1KGNxcF93cWUtPndxZV93b3Jkc1tORVNfQ1FQX1dRRV9PUENPREVfSURYXSk7CisJCWlmICgob3Bjb2RlICYgTkVTX0NRUF9PUENPREVfTUFTSykgPT0gTkVTX0NRUF9ET1dOTE9BRF9TRUdNRU5UKQorCQkJY3R4X2luZGV4ID0gTkVTX0NRUF9XUUVfRExfQ09NUF9DVFhfTE9XX0lEWDsKIAkJYmFycmllcigpOwogCQl1NjR0ZW1wID0gKHVuc2lnbmVkIGxvbmcpY3FwX3JlcXVlc3Q7Ci0JCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBORVNfQ1FQX1dRRV9DT01QX1NDUkFUQ0hfTE9XX0lEWCwKLQkJCQkgICAgdTY0dGVtcCk7CisJCXNldF93cWVfNjRiaXRfdmFsdWUoY3FwX3dxZS0+d3FlX3dvcmRzLCBjdHhfaW5kZXgsIHU2NHRlbXApOwogCQluZXNfZGVidWcoTkVTX0RCR19DUVAsICJDUVAgcmVxdWVzdCAob3Bjb2RlIDB4JTAyWCksIGxpbmUgMSA9IDB4JTA4WCBwdXQgb24gQ1FQcyBTUSwiCi0JCQkJIiByZXF1ZXN0ID0gJXAsIGNxcF9oZWFkID0gJXUsIGNxcF90YWlsID0gJXUsIGNxcF9zaXplID0gJXUsIgotCQkJCSIgd2FpdGluZyA9ICVkLCByZWZjb3VudCA9ICVkLlxuIiwKLQkJCQlsZTMyX3RvX2NwdShjcXBfd3FlLT53cWVfd29yZHNbTkVTX0NRUF9XUUVfT1BDT0RFX0lEWF0pJjB4M2YsCi0JCQkJbGUzMl90b19jcHUoY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0lEX0lEWF0pLCBjcXBfcmVxdWVzdCwKLQkJCQluZXNkZXYtPmNxcC5zcV9oZWFkLCBuZXNkZXYtPmNxcC5zcV90YWlsLCBuZXNkZXYtPmNxcC5zcV9zaXplLAotCQkJCWNxcF9yZXF1ZXN0LT53YWl0aW5nLCBhdG9taWNfcmVhZCgmY3FwX3JlcXVlc3QtPnJlZmNvdW50KSk7CisJCQkiIHJlcXVlc3QgPSAlcCwgY3FwX2hlYWQgPSAldSwgY3FwX3RhaWwgPSAldSwgY3FwX3NpemUgPSAldSwiCisJCQkiIHdhaXRpbmcgPSAlZCwgcmVmY291bnQgPSAlZC5cbiIsCisJCQlvcGNvZGUgJiBORVNfQ1FQX09QQ09ERV9NQVNLLAorCQkJbGUzMl90b19jcHUoY3FwX3dxZS0+d3FlX3dvcmRzW05FU19DUVBfV1FFX0lEX0lEWF0pLCBjcXBfcmVxdWVzdCwKKwkJCW5lc2Rldi0+Y3FwLnNxX2hlYWQsIG5lc2Rldi0+Y3FwLnNxX3RhaWwsIG5lc2Rldi0+Y3FwLnNxX3NpemUsCisJCQljcXBfcmVxdWVzdC0+d2FpdGluZywgYXRvbWljX3JlYWQoJmNxcF9yZXF1ZXN0LT5yZWZjb3VudCkpOworCiAJCWJhcnJpZXIoKTsKIAogCQkvKiBSaW5nIGRvb3JiZWxsICgxIFdRRXMpICovCkBAIC02NDUsNyArNjc3LDYgQEAKIAlyZXR1cm47CiB9CiAKLQogLyoqCiAgKiBuZXNfYXJwX3RhYmxlCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jCmluZGV4IDlmMmY3ZDRiLi41MDk1YmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmMKQEAgLTE0NTgsNyArMTQ1OCw3IEBACiAJc3RydWN0IGliX3FwX2F0dHIgYXR0cjsKIAlzdHJ1Y3QgaXdfY21faWQgKmNtX2lkOwogCXN0cnVjdCBpd19jbV9ldmVudCBjbV9ldmVudDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJYXRvbWljX2luYygmc3dfcXBzX2Rlc3Ryb3llZCk7CiAJbmVzcXAtPmRlc3Ryb3llZCA9IDE7CkBAIC0xNTExLDcgKzE1MTEsNiBAQAogCQlpZiAoKG5lc3FwLT5uZXNyY3EpICYmIChuZXNxcC0+bmVzcmNxICE9IG5lc3FwLT5uZXNzY3EpKQogCQkJbmVzX2NsZWFuX2NxKG5lc3FwLCBuZXNxcC0+bmVzcmNxKTsKIAl9Ci0KIAluZXNfcmVtX3JlZigmbmVzcXAtPmlicXApOwogCXJldHVybiAwOwogfQpAQCAtMjMzOCw4ICsyMzM3LDEwIEBACiAKIAlza2lwX3BhZ2VzID0gKCh1MzIpcmVnaW9uLT5vZmZzZXQpID4+IDEyOwogCi0JaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmcmVxLCB1ZGF0YSwgc2l6ZW9mKHJlcSkpKQorCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnJlcSwgdWRhdGEsIHNpemVvZihyZXEpKSkgeworCQlpYl91bWVtX3JlbGVhc2UocmVnaW9uKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJfQogCW5lc19kZWJ1ZyhORVNfREJHX01SLCAiTWVtb3J5IFJlZ2lzdHJhdGlvbiB0eXBlID0gJTA4WC5cbiIsIHJlcS5yZWdfdHlwZSk7CiAKIAlzd2l0Y2ggKHJlcS5yZWdfdHlwZSkgewpAQCAtMjYzMSw2ICsyNjMyLDcgQEAKIAkJCXJldHVybiAmbmVzbXItPmlibXI7CiAJfQogCisJaWJfdW1lbV9yZWxlYXNlKHJlZ2lvbik7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5oCmluZGV4IDJkZjk5OTNlLi5mZTZiNmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc192ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3ZlcmJzLmgKQEAgLTEzOSw3ICsxMzksOCBAQAogCXN0cnVjdCBuZXNfY3EgICAgICAgICAqbmVzcmNxOwogCXN0cnVjdCBuZXNfcGQgICAgICAgICAqbmVzcGQ7CiAJdm9pZCAqY21fbm9kZTsgLyogaGFuZGxlIG9mIHRoZSBub2RlIHRoaXMgUVAgaXMgYXNzb2NpYXRlZCB3aXRoICovCi0Jc3RydWN0IGlldGZfbXBhX2ZyYW1lICppZXRmX2ZyYW1lOworCXZvaWQgICAgICAgICAgICAgICAgICAqaWV0Zl9mcmFtZTsKKwl1OCAgICAgICAgICAgICAgICAgICAgaWV0Zl9mcmFtZV9zaXplOwogCWRtYV9hZGRyX3QgICAgICAgICAgICBpZXRmX2ZyYW1lX3BiYXNlOwogCXN0cnVjdCBpYl9tciAgICAgICAgICAqbHNtbV9tcjsKIAlzdHJ1Y3QgbmVzX2h3X3FwICAgICAgaHdxcDsKQEAgLTE1NCw2ICsxNTUsNyBAQAogCXUzMiAgICAgICAgICAgICAgICAgICBtbWFwX3NxX2RiX2luZGV4OwogCXUzMiAgICAgICAgICAgICAgICAgICBtbWFwX3JxX2RiX2luZGV4OwogCXNwaW5sb2NrX3QgICAgICAgICAgICBsb2NrOworCXNwaW5sb2NrX3QgICAgICAgICAgICBwYXVfbG9jazsKIAlzdHJ1Y3QgbmVzX3FwX2NvbnRleHQgKm5lc3FwX2NvbnRleHQ7CiAJZG1hX2FkZHJfdCAgICAgICAgICAgIG5lc3FwX2NvbnRleHRfcGJhc2U7CiAJdm9pZAkgICAgICAgICAgICAgICpwYmxfdmJhc2U7CkBAIC0xNjEsNiArMTYzLDggQEAKIAlzdHJ1Y3QgcGFnZSAgICAgICAgICAgKnBhZ2U7CiAJc3RydWN0IHRpbWVyX2xpc3QgICAgIHRlcm1pbmF0ZV90aW1lcjsKIAllbnVtIGliX2V2ZW50X3R5cGUgICAgdGVybWluYXRlX2V2ZW50dHlwZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgcGF1X2xpc3Q7CisJdTMyICAgICAgICAgICAgICAgICAgIHBhdV9yY3Zfbnh0OwogCXUxNiAgICAgICAgICAgICAgICAgICBhY3RpdmVfY29ubjoxOwogCXUxNiAgICAgICAgICAgICAgICAgICBza2lwX2xzbW06MTsKIAl1MTYgICAgICAgICAgICAgICAgICAgdXNlcl9tb2RlOjE7CkBAIC0xNjgsNyArMTcyLDggQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgZmx1c2hfaXNzdWVkOjE7CiAJdTE2ICAgICAgICAgICAgICAgICAgIGRlc3Ryb3llZDoxOwogCXUxNiAgICAgICAgICAgICAgICAgICBzaWdfYWxsOjE7Ci0JdTE2ICAgICAgICAgICAgICAgICAgIHJzdmQ6OTsKKwl1MTYgICAgICAgICAgICAgICAgICAgcGF1X21vZGU6MTsKKwl1MTYgICAgICAgICAgICAgICAgICAgcnN2ZDo4OwogCXUxNiAgICAgICAgICAgICAgICAgICBwcml2YXRlX2RhdGFfbGVuOwogCXUxNiAgICAgICAgICAgICAgICAgICB0ZXJtX3NxX2ZsdXNoX2NvZGU7CiAJdTE2ICAgICAgICAgICAgICAgICAgIHRlcm1fcnFfZmx1c2hfY29kZTsKQEAgLTE3Niw1ICsxODEsOCBAQAogCXU4ICAgICAgICAgICAgICAgICAgICBod190Y3Bfc3RhdGU7CiAJdTggICAgICAgICAgICAgICAgICAgIHRlcm1fZmxhZ3M7CiAJdTggICAgICAgICAgICAgICAgICAgIHNxX2ttYXBwZWQ7CisJdTggICAgICAgICAgICAgICAgICAgIHBhdV9idXN5OworCXU4ICAgICAgICAgICAgICAgICAgICBwYXVfcGVuZGluZzsKKwl1OCAgICAgICAgICAgICAgICAgICAgcGF1X3N0YXRlOwogfTsKICNlbmRpZgkJCS8qIE5FU19WRVJCU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaAppbmRleCBjOTYyNGVhLi5iODgxYmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKQEAgLTE3MSw3ICsxNzEsOSBAQAogCS8qIGhvdyBtYW55IGFsbG9jX3BhZ2VzKCkgY2h1bmtzIGluIHJjdmVncmJ1Zl9wYWdlcyAqLwogCXUzMiByY3ZlZ3JidWZfY2h1bmtzOwogCS8qIGhvdyBtYW55IGVncmJ1ZnMgcGVyIGNodW5rICovCi0JdTMyIHJjdmVncmJ1ZnNfcGVyY2h1bms7CisJdTE2IHJjdmVncmJ1ZnNfcGVyY2h1bms7CisJLyogaWxvZzIgb2YgYWJvdmUgKi8KKwl1MTYgcmN2ZWdyYnVmc19wZXJjaHVua19zaGlmdDsKIAkvKiBvcmRlciBmb3IgcmN2ZWdyYnVmX3BhZ2VzICovCiAJc2l6ZV90IHJjdmVncmJ1Zl9zaXplOwogCS8qIHJjdmhkcnEgc2l6ZSAoZm9yIGZyZWVpbmcpICovCkBAIC0yMjEsNiArMjIzLDkgQEAKIAkvKiBjdHh0IHJjdmhkcnEgaGVhZCBvZmZzZXQgKi8KIAl1MzIgaGVhZDsKIAl1MzIgcGt0X2NvdW50OworCS8qIGxvb2thc2lkZSBmaWVsZHMgKi8KKwlzdHJ1Y3QgcWliX3FwICpsb29rYXNpZGVfcXA7CisJdTMyIGxvb2thc2lkZV9xcG47CiAJLyogUVBzIHdhaXRpbmcgZm9yIGNvbnRleHQgcHJvY2Vzc2luZyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcXBfd2FpdF9saXN0OwogfTsKQEAgLTgwNyw2ICs4MTIsMTAgQEAKIAkgKiBzdXBwb3J0cywgbGVzcyBnaXZlcyBtb3JlIHBpbyBidWZzL2N0eHQsIGV0Yy4KIAkgKi8KIAl1MzIgY2ZnY3R4dHM7CisJLyoKKwkgKiBudW1iZXIgb2YgY3R4dHMgYXZhaWxhYmxlIGZvciBQU00gb3BlbgorCSAqLworCXUzMiBmcmVlY3R4dHM7CiAKIAkvKgogCSAqIGhpbnQgdGhhdCB3ZSBzaG91bGQgdXBkYXRlIHBpb2F2YWlsc2hhZG93IGJlZm9yZQpAQCAtOTM2LDcgKzk0NSw5IEBACiAJLyogY2hpcCBhZGRyZXNzIHNwYWNlIHVzZWQgYnkgNGsgcGlvIGJ1ZmZlcnMgKi8KIAl1MzIgYWxpZ240azsKIAkvKiBzaXplIG9mIGVhY2ggcmN2ZWdyYnVmZmVyICovCi0JdTMyIHJjdmVncmJ1ZnNpemU7CisJdTE2IHJjdmVncmJ1ZnNpemU7CisJLyogbG9nMiBvZiBhYm92ZSAqLworCXUxNiByY3ZlZ3JidWZzaXplX3NoaWZ0OwogCS8qIGxvY2FsYnVzIHdpZHRoICgxLCAyLDQsOCwxNiwzMikgZnJvbSBjb25maWcgc3BhY2UgICovCiAJdTMyIGxidXNfd2lkdGg7CiAJLyogbG9jYWxidXMgc3BlZWQgaW4gTUh6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kaWFnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kaWFnLmMKaW5kZXggMjA0YzRkZC4uOTg5MjQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZGlhZy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RpYWcuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKaW5kZXggMjNlNTg0Zi4uYzkwYTU1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInFpYi5oIgogCkBAIC0yNzksMTAgKzI4MCwxMCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKnFpYl9nZXRfZWdyYnVmKGNvbnN0IHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgdTMyIGV0YWlsKQogewotCWNvbnN0IHUzMiBjaHVuayA9IGV0YWlsIC8gcmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rOwotCWNvbnN0IHUzMiBpZHggPSAgZXRhaWwgJSByY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bms7CisJY29uc3QgdTMyIGNodW5rID0gZXRhaWwgPj4gcmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rX3NoaWZ0OworCWNvbnN0IHUzMiBpZHggPSAgZXRhaWwgJiAoKHUzMilyY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bmsgLSAxKTsKIAotCXJldHVybiByY2QtPnJjdmVncmJ1ZltjaHVua10gKyBpZHggKiByY2QtPmRkLT5yY3ZlZ3JidWZzaXplOworCXJldHVybiByY2QtPnJjdmVncmJ1ZltjaHVua10gKyAoaWR4IDw8IHJjZC0+ZGQtPnJjdmVncmJ1ZnNpemVfc2hpZnQpOwogfQogCiAvKgpAQCAtMzEwLDcgKzMxMSw2IEBACiAJCXUzMiBvcGNvZGU7CiAJCXUzMiBwc247CiAJCWludCBkaWZmOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCS8qIFNhbml0eSBjaGVjayBwYWNrZXQgKi8KIAkJaWYgKHRsZW4gPCAyNCkKQEAgLTM2NSw3ICszNjUsNiBAQAogCiAJCQlzd2l0Y2ggKHFwLT5pYnFwLnFwX3R5cGUpIHsKIAkJCWNhc2UgSUJfUVBUX1JDOgotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CiAJCQkJcnVjX3JlcyA9CiAJCQkJCXFpYl9ydWNfY2hlY2tfaGRyKAogCQkJCQkJaWJwLCBoZHIsCkBAIC0zNzMsMTEgKzM3Miw4IEBACiAJCQkJCQlxcCwKIAkJCQkJCWJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkpOwogCQkJCWlmIChydWNfcmVzKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssCi0JCQkJCQkJICAgICAgIGZsYWdzKTsKIAkJCQkJZ290byB1bmxvY2s7CiAJCQkJfQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAogCQkJCS8qIE9ubHkgZGVhbCB3aXRoIFJETUEgV3JpdGVzIGZvciBub3cgKi8KIAkJCQlpZiAob3Bjb2RlIDwKQEAgLTU0Nyw2ICs1NDMsMTUgQEAKIAkJCXVwZGVnciA9IDA7CiAJCX0KIAl9CisJLyoKKwkgKiBOb3RpZnkgcWliX2Rlc3Ryb3lfcXAoKSBpZiBpdCBpcyB3YWl0aW5nCisJICogZm9yIGxvb2thc2lkZV9xcCB0byBmaW5pc2guCisJICovCisJaWYgKHJjZC0+bG9va2FzaWRlX3FwKSB7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY2QtPmxvb2thc2lkZV9xcC0+cmVmY291bnQpKQorCQkJd2FrZV91cCgmcmNkLT5sb29rYXNpZGVfcXAtPndhaXQpOworCQlyY2QtPmxvb2thc2lkZV9xcCA9IE5VTEw7CisJfQogCiAJcmNkLT5oZWFkID0gbDsKIAlyY2QtPnBrdF9jb3VudCArPSBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKaW5kZXggMjYyNTMwMy4uNTc0NjAwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInFpYi5oIgogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKQEAgLTEyODQsNiArMTI4NSw3IEBACiAJc3RybGNweShyY2QtPmNvbW0sIGN1cnJlbnQtPmNvbW0sIHNpemVvZihyY2QtPmNvbW0pKTsKIAljdHh0X2ZwKGZwKSA9IHJjZDsKIAlxaWJfc3RhdHMuc3BzX2N0eHRzKys7CisJZGQtPmZyZWVjdHh0cysrOwogCXJldCA9IDA7CiAJZ290byBiYWlsOwogCkBAIC0xNzkyLDYgKzE3OTQsNyBAQAogCQlpZiAoZGQtPnBhZ2VzaGFkb3cpCiAJCQl1bmxvY2tfZXhwZWN0ZWRfdGlkcyhyY2QpOwogCQlxaWJfc3RhdHMuc3BzX2N0eHRzLS07CisJCWRkLT5mcmVlY3R4dHMtLTsKIAl9CiAKIAltdXRleF91bmxvY2soJnFpYl9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE2MTIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE2MTIwLmMKaW5kZXggZDhjYTBhMC4uNzgxYTgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNjEyMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYwpAQCAtMzI3Myw2ICszMjczLDggQEAKIAkvKiB3ZSBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgMjA0OCBieXRlcyBmb3IgZWFnZXIgYnVmZmVycyAqLwogCXJldCA9IGliX210dV9lbnVtX3RvX2ludChxaWJfaWJtdHUpOwogCWRkLT5yY3ZlZ3JidWZzaXplID0gcmV0ICE9IC0xID8gbWF4KHJldCwgMjA0OCkgOiBRSUJfREVGQVVMVF9NVFU7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKGRkLT5yY3ZlZ3JidWZzaXplKSk7CisJZGQtPnJjdmVncmJ1ZnNpemVfc2hpZnQgPSBpbG9nMihkZC0+cmN2ZWdyYnVmc2l6ZSk7CiAKIAlxaWJfNjEyMF90aWR0ZW1wbGF0ZShkZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYwppbmRleCBlMWY5NDc0Li40MzlkM2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KIApAQCAtNDA4NSw2ICs0MDg2LDggQEAKIAkvKiB3ZSBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgMjA0OCBieXRlcyBmb3IgZWFnZXIgYnVmZmVycyAqLwogCXJldCA9IGliX210dV9lbnVtX3RvX2ludChxaWJfaWJtdHUpOwogCWRkLT5yY3ZlZ3JidWZzaXplID0gcmV0ICE9IC0xID8gbWF4KHJldCwgMjA0OCkgOiBRSUJfREVGQVVMVF9NVFU7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKGRkLT5yY3ZlZ3JidWZzaXplKSk7CisJZGQtPnJjdmVncmJ1ZnNpemVfc2hpZnQgPSBpbG9nMihkZC0+cmN2ZWdyYnVmc2l6ZSk7CiAKIAlxaWJfNzIyMF90aWR0ZW1wbGF0ZShkZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwppbmRleCA1ZWE5ZWNlLi41YmQyMTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9zbWkuaD4KIApAQCAtMjMxMCwxMiArMjMxMSwxNSBAQAogCXZhbCA9IHBwZC0+Y3BzcGVjLT5pYmNjdHJsX2EgfCAoUUxPR0lDX0lCX0lCQ0NfTElOS0lOSVRDTURfRElTQUJMRSA8PAogCQlRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9TSElGVCk7CiAKKwlwcGQtPmNwc3BlYy0+aWJjY3RybF9hID0gdmFsOwogCS8qCiAJICogUmVzZXQgdGhlIFBDUyBpbnRlcmZhY2UgdG8gdGhlIHNlcmRlcyAoYW5kIGFsc28gaWJjLCB3aGljaCBpcyBzdGlsbAogCSAqIGluIHJlc2V0IGZyb20gYWJvdmUpLiAgV3JpdGVzIG5ldyB2YWx1ZSBvZiBpYmNjdHJsX2EgYXMgbGFzdCBzdGVwLgogCSAqLwogCXFpYl83MzIyX21pbmlfcGNzX3Jlc2V0KHBwZCk7CiAJcWliX3dyaXRlX2tyZWcoZGQsIGtyX3NjcmF0Y2gsIDBVTEwpOworCS8qIGNsZWFyIHRoZSBsaW5raW5pdCBjbWRzICovCisJcHBkLT5jcHNwZWMtPmliY2N0cmxfYSAmPSB+U1lNX01BU0soSUJDQ3RybEFfMCwgTGlua0luaXRDbWQpOwogCiAJaWYgKCFwcGQtPmNwc3BlYy0+aWJjY3RybF9iKSB7CiAJCXVuc2lnbmVkIGxzZSA9IHBwZC0+bGlua19zcGVlZF9lbmFibGVkOwpAQCAtMjM4NywxMSArMjM5MSw2IEBACiAJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9yY3ZjdHJsLCBwcGQtPnBfcmN2Y3RybCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPmNzcGVjLT5yY3Ztb2RfbG9jaywgZmxhZ3MpOwogCi0JLyogSG9sZCB0aGUgbGluayBzdGF0ZSBtYWNoaW5lIGZvciBtZXp6IGJvYXJkcyAqLwotCWlmIChJU19RTUgoZGQpIHx8IElTX1FNRShkZCkpCi0JCXFpYl9zZXRfaWJfNzMyMl9sc3RhdGUocHBkLCAwLAotCQkJCSAgICAgICBRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9ESVNBQkxFKTsKLQogCS8qIEFsc28gZW5hYmxlIElCU1RBVFVTQ0hHIGludGVycnVwdC4gICovCiAJdmFsID0gcWliX3JlYWRfa3JlZ19wb3J0KHBwZCwga3JwX2Vycm1hc2spOwogCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfZXJybWFzaywKQEAgLTI4NTMsOSArMjg1Miw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBkZC0+Zmlyc3RfdXNlcl9jdHh0OyBpKyspIHsKIAkJCWlmIChjdHh0cmJpdHMgJiBybWFzaykgewogCQkJCWN0eHRyYml0cyAmPSB+cm1hc2s7Ci0JCQkJaWYgKGRkLT5yY2RbaV0pIHsKKwkJCQlpZiAoZGQtPnJjZFtpXSkKIAkJCQkJcWliX2tyZWNlaXZlKGRkLT5yY2RbaV0sIE5VTEwsICZucGt0cyk7Ci0JCQkJfQogCQkJfQogCQkJcm1hc2sgPDw9IDE7CiAJCX0KQEAgLTUyMzAsNiArNTIyOCw4IEBACiAJCQkJICAgICBRSUJMX0lCX0FVVE9ORUdfSU5QUk9HKSkpCiAJCQlzZXRfNzMyMl9pYnNwZWVkX2Zhc3QocHBkLCBwcGQtPmxpbmtfc3BlZWRfZW5hYmxlZCk7CiAJCWlmICghKHBwZC0+bGZsYWdzICYgUUlCTF9JQl9BVVRPTkVHX0lOUFJPRykpIHsKKwkJCXN0cnVjdCBxaWJfcXNmcF9kYXRhICpxZCA9CisJCQkJJnBwZC0+Y3BzcGVjLT5xc2ZwX2RhdGE7CiAJCQkvKiB1bmxvY2sgdGhlIFR4IHNldHRpbmdzLCBzcGVlZCBtYXkgY2hhbmdlICovCiAJCQlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3R4X2RlZW1waF9vdmVycmlkZSwKIAkJCQlTWU1fTUFTSyhJQlNEX1RYX0RFRU1QSEFTSVNfT1ZFUlJJREVfMCwKQEAgLTUyMzcsNiArNTIzNywxMiBAQAogCQkJcWliX2NhbmNlbF9zZW5kcyhwcGQpOwogCQkJLyogb24gbGluayBkb3duLCBlbnN1cmUgc2FuZSBwY3Mgc3RhdGUgKi8KIAkJCXFpYl83MzIyX21pbmlfcGNzX3Jlc2V0KHBwZCk7CisJCQkvKiBzY2hlZHVsZSB0aGUgcXNmcCByZWZyZXNoIHdoaWNoIHNob3VsZCB0dXJuIHRoZSBsaW5rCisJCQkgICBvZmYgKi8KKwkJCWlmIChwcGQtPmRkLT5mbGFncyAmIFFJQl9IQVNfUVNGUCkgeworCQkJCXFkLT50X2luc2VydCA9IGdldF9qaWZmaWVzXzY0KCk7CisJCQkJc2NoZWR1bGVfd29yaygmcWQtPndvcmspOworCQkJfQogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+c2RtYV9sb2NrLCBmbGFncyk7CiAJCQlpZiAoX19xaWJfc2RtYV9ydW5uaW5nKHBwZCkpCiAJCQkJX19xaWJfc2RtYV9wcm9jZXNzX2V2ZW50KHBwZCwKQEAgLTU1ODcsNDMgKzU1OTMsNzkgQEAKIAlzdHJ1Y3QgcWliX3FzZnBfZGF0YSAqcWQ7CiAJc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZDsKIAl1NjQgcHdydXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCXUzMiBsZTI7CiAKIAlxZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWliX3FzZnBfZGF0YSwgd29yayk7CiAJcHBkID0gcWQtPnBwZDsKLQlwd3J1cCA9IHFkLT50X2luc2VydCArIG1zZWNzX3RvX2ppZmZpZXMoUVNGUF9QV1JfTEFHX01TRUMpOworCXB3cnVwID0gcWQtPnRfaW5zZXJ0ICsKKwkJbXNlY3NfdG9famlmZmllcyhRU0ZQX1BXUl9MQUdfTVNFQyAtIFFTRlBfTU9EUFJTX0xBR19NU0VDKTsKIAotCS8qCi0JICogU29tZSBRU0ZQJ3Mgbm90IG9ubHkgZG8gbm90IHJlc3BvbmQgdW50aWwgdGhlIGZ1bGwgcG93ZXItdXAKLQkgKiB0aW1lLCBidXQgbWF5IGJlaGF2ZSBiYWRseSBpZiB3ZSB0cnkuIFNvIGhvbGQgb2ZmIHJlc3BvbmRpbmcKLQkgKiB0byBpbnNlcnRpb24uCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJdTY0IG5vdyA9IGdldF9qaWZmaWVzXzY0KCk7Ci0JCWlmICh0aW1lX2FmdGVyNjQobm93LCBwd3J1cCkpCi0JCQlicmVhazsKLQkJbXNsZWVwKDIwKTsKLQl9Ci0JcmV0ID0gcWliX3JlZnJlc2hfcXNmcF9jYWNoZShwcGQsICZxZC0+Y2FjaGUpOwotCS8qCi0JICogTmVlZCB0byBjaGFuZ2UgTEUyIGJhY2sgdG8gZGVmYXVsdHMgaWYgd2UgY291bGRuJ3QKLQkgKiByZWFkIHRoZSBjYWJsZSB0eXBlICh0byBoYW5kbGUgY2FibGUgc3dhcHMpLCBzbyBkbyB0aGlzCi0JICogZXZlbiBvbiBmYWlsdXJlIHRvIHJlYWQgY2FibGUgaW5mb3JtYXRpb24uICBXZSBkb24ndAotCSAqIGdldCBoZXJlIGZvciBRTUUsIHNvIElTX1FNRSBjaGVjayBub3QgbmVlZGVkIGhlcmUuCi0JICovCi0JaWYgKCFyZXQgJiYgIXBwZC0+ZGQtPmNzcGVjLT5yMSkgewotCQlpZiAoUVNGUF9JU19BQ1RJVkVfRkFSKHFkLT5jYWNoZS50ZWNoKSkKLQkJCWxlMiA9IExFMl9RTUU7Ci0JCWVsc2UgaWYgKHFkLT5jYWNoZS5hdHRlblsxXSA+PSBxaWJfbG9uZ19hdHRlbiAmJgotCQkJIFFTRlBfSVNfQ1UocWQtPmNhY2hlLnRlY2gpKQotCQkJbGUyID0gTEUyXzVtOwotCQllbHNlCisJLyogRGVsYXkgZm9yIDIwIG1zZWNzIHRvIGFsbG93IE1vZFBycyByZXNpc3RvciB0byBzZXR1cCAqLworCW1kZWxheShRU0ZQX01PRFBSU19MQUdfTVNFQyk7CisKKwlpZiAoIXFpYl9xc2ZwX21vZF9wcmVzZW50KHBwZCkpIHsKKwkJcHBkLT5jcHNwZWMtPnFzZnBfZGF0YS5tb2RwcmVzZW50ID0gMDsKKwkJLyogU2V0IHRoZSBwaHlzaWNhbCBsaW5rIHRvIGRpc2FibGVkICovCisJCXFpYl9zZXRfaWJfNzMyMl9sc3RhdGUocHBkLCAwLAorCQkJCSAgICAgICBRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9ESVNBQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKKwkJcHBkLT5sZmxhZ3MgJj0gflFJQkxfTElOS1Y7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTb21lIFFTRlAncyBub3Qgb25seSBkbyBub3QgcmVzcG9uZCB1bnRpbCB0aGUgZnVsbCBwb3dlci11cAorCQkgKiB0aW1lLCBidXQgbWF5IGJlaGF2ZSBiYWRseSBpZiB3ZSB0cnkuIFNvIGhvbGQgb2ZmIHJlc3BvbmRpbmcKKwkJICogdG8gaW5zZXJ0aW9uLgorCQkgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCXU2NCBub3cgPSBnZXRfamlmZmllc182NCgpOworCQkJaWYgKHRpbWVfYWZ0ZXI2NChub3csIHB3cnVwKSkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgyMCk7CisJCX0KKworCQlyZXQgPSBxaWJfcmVmcmVzaF9xc2ZwX2NhY2hlKHBwZCwgJnFkLT5jYWNoZSk7CisKKwkJLyoKKwkJICogTmVlZCB0byBjaGFuZ2UgTEUyIGJhY2sgdG8gZGVmYXVsdHMgaWYgd2UgY291bGRuJ3QKKwkJICogcmVhZCB0aGUgY2FibGUgdHlwZSAodG8gaGFuZGxlIGNhYmxlIHN3YXBzKSwgc28gZG8gdGhpcworCQkgKiBldmVuIG9uIGZhaWx1cmUgdG8gcmVhZCBjYWJsZSBpbmZvcm1hdGlvbi4gIFdlIGRvbid0CisJCSAqIGdldCBoZXJlIGZvciBRTUUsIHNvIElTX1FNRSBjaGVjayBub3QgbmVlZGVkIGhlcmUuCisJCSAqLworCQlpZiAoIXJldCAmJiAhcHBkLT5kZC0+Y3NwZWMtPnIxKSB7CisJCQlpZiAoUVNGUF9JU19BQ1RJVkVfRkFSKHFkLT5jYWNoZS50ZWNoKSkKKwkJCQlsZTIgPSBMRTJfUU1FOworCQkJZWxzZSBpZiAocWQtPmNhY2hlLmF0dGVuWzFdID49IHFpYl9sb25nX2F0dGVuICYmCisJCQkJIFFTRlBfSVNfQ1UocWQtPmNhY2hlLnRlY2gpKQorCQkJCWxlMiA9IExFMl81bTsKKwkJCWVsc2UKKwkJCQlsZTIgPSBMRTJfREVGQVVMVDsKKwkJfSBlbHNlCiAJCQlsZTIgPSBMRTJfREVGQVVMVDsKLQl9IGVsc2UKLQkJbGUyID0gTEUyX0RFRkFVTFQ7Ci0JaWJzZF93cl9hbGxjaGFucyhwcGQsIDEzLCAobGUyIDw8IDcpLCBCTUFTSyg5LCA3KSk7Ci0JaW5pdF90eGRkc190YWJsZShwcGQsIDApOworCQlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTMsIChsZTIgPDwgNyksIEJNQVNLKDksIDcpKTsKKwkJLyoKKwkJICogV2UgYWx3YXlzIGNoYW5nZSBwYXJhbWV0ZXRlcnMsIHNpbmNlIHdlIGNhbiBjaG9vc2UKKwkJICogdmFsdWVzIGZvciBjYWJsZXMgd2l0aG91dCBlZXByb21zLCBhbmQgdGhlIGNhYmxlIG1heSBoYXZlCisJCSAqIGNoYW5nZWQgZnJvbSBhIGNhYmxlIHdpdGggZnVsbCBvciBwYXJ0aWFsIGVlcHJvbSBjb250ZW50CisJCSAqIHRvIG9uZSB3aXRoIHBhcnRpYWwgb3Igbm8gY29udGVudC4KKwkJICovCisJCWluaXRfdHhkZHNfdGFibGUocHBkLCAwKTsKKwkJLyogVGhlIHBoeXNpY2FsIGxpbmsgaXMgYmVpbmcgcmUtZW5hYmxlZCBvbmx5IHdoZW4gdGhlCisJCSAqIHByZXZpb3VzIHN0YXRlIHdhcyBESVNBQkxFRCBhbmQgdGhlIFZBTElEIGJpdCBpcyBub3QKKwkJICogc2V0LiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuICB0aGUgY2FibGUgaGFzIGJlZW4KKwkJICogcGh5c2ljYWxseSBwdWxsZWQuICovCisJCWlmICghcHBkLT5jcHNwZWMtPnFzZnBfZGF0YS5tb2RwcmVzZW50ICYmCisJCSAgICAocHBkLT5sZmxhZ3MgJiAoUUlCTF9MSU5LViB8IFFJQkxfSUJfTElOS19ESVNBQkxFRCkpKSB7CisJCQlwcGQtPmNwc3BlYy0+cXNmcF9kYXRhLm1vZHByZXNlbnQgPSAxOworCQkJcWliX3NldF9pYl83MzIyX2xzdGF0ZShwcGQsIDAsCisJCQkJUUxPR0lDX0lCX0lCQ0NfTElOS0lOSVRDTURfU0xFRVApOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKKwkJCXBwZC0+bGZsYWdzIHw9IFFJQkxfTElOS1Y7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcGQtPmxmbGFnc19sb2NrLCBmbGFncyk7CisJCX0KKwl9CiB9CiAKIC8qCkBAIC01NzI3LDcgKzU3NjksOCBAQAogCQkJLyogbm93IGNoYW5nZSB0aGUgSUJDIGFuZCBzZXJkZXMsIG92ZXJyaWRpbmcgZ2VuZXJpYyAqLwogCQkJaW5pdF90eGRkc190YWJsZShwcGQsIDEpOwogCQkJLyogUmUtZW5hYmxlIHRoZSBwaHlzaWNhbCBzdGF0ZSBtYWNoaW5lIG9uIG1lenogYm9hcmRzCi0JCQkgKiBub3cgdGhhdCB0aGUgY29ycmVjdCBzZXR0aW5ncyBoYXZlIGJlZW4gc2V0LiAqLworCQkJICogbm93IHRoYXQgdGhlIGNvcnJlY3Qgc2V0dGluZ3MgaGF2ZSBiZWVuIHNldC4KKwkJCSAqIFFTRlAgYm9hcmRzIGFyZSBoYW5kbGVzIGJ5IHRoZSBRU0ZQIGV2ZW50IGhhbmRsZXIgKi8KIAkJCWlmIChJU19RTUgoZGQpIHx8IElTX1FNRShkZCkpCiAJCQkJcWliX3NldF9pYl83MzIyX2xzdGF0ZShwcGQsIDAsCiAJCQkJCSAgICBRTE9HSUNfSUJfSUJDQ19MSU5LSU5JVENNRF9TTEVFUCk7CkBAIC02MjA1LDYgKzYyNDgsOCBAQAogCiAJLyogd2UgYWx3YXlzIGFsbG9jYXRlIGF0IGxlYXN0IDIwNDggYnl0ZXMgZm9yIGVhZ2VyIGJ1ZmZlcnMgKi8KIAlkZC0+cmN2ZWdyYnVmc2l6ZSA9IG1heChtdHUsIDIwNDgpOworCUJVR19PTighaXNfcG93ZXJfb2ZfMihkZC0+cmN2ZWdyYnVmc2l6ZSkpOworCWRkLT5yY3ZlZ3JidWZzaXplX3NoaWZ0ID0gaWxvZzIoZGQtPnJjdmVncmJ1ZnNpemUpOwogCiAJcWliXzczMjJfdGlkdGVtcGxhdGUoZGQpOwogCkBAIC03MTQ3LDcgKzcxOTIsOCBAQAogCQl9CiAJfQogCi0JLyogTG9va3VwIHNlcmRlcyBzZXR0aW5nIGJ5IGNhYmxlIHR5cGUgYW5kIGF0dGVudWF0aW9uICovCisJLyogQWN0aXZlIGNhYmxlcyBkb24ndCBoYXZlIGF0dGVudWF0aW9uIHNvIHdlIG9ubHkgc2V0IFNFUkRFUworCSAqIHNldHRpbmdzIHRvIGFjY291bnQgZm9yIHRoZSBhdHRlbnVhdGlvbiBvZiB0aGUgYm9hcmQgdHJhY2VzLiAqLwogCWlmICghb3ZlcnJpZGUgJiYgUVNGUF9JU19BQ1RJVkUocWQtPnRlY2gpKSB7CiAJCSpzZHJfZGRzID0gdHhkZHNfc2RyICsgcHBkLT5kZC0+Ym9hcmRfYXR0ZW47CiAJCSpkZHJfZGRzID0gdHhkZHNfZGRyICsgcHBkLT5kZC0+Ym9hcmRfYXR0ZW47CkBAIC03NDY0LDEyICs3NTEwLDYgQEAKIAl1MzIgbGVfdmFsLCByeGNhbGRvbmU7CiAJaW50IGNoYW4sIGNoYW5fZG9uZSA9ICgxIDw8IFNFUkRFU19DSEFOUykgLSAxOwogCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBUeCBERFMgdGFibGVzLiAgQWxzbyBkb25lIGV2ZXJ5IFFTRlAgZXZlbnQsCi0JICogZm9yIGFkYXB0ZXJzIHdpdGggUVNGUAotCSAqLwotCWluaXRfdHhkZHNfdGFibGUocHBkLCAwKTsKLQogCS8qIENsZWFyIGNtb2RlLW92ZXJyaWRlLCBtYXkgYmUgc2V0IGZyb20gb2xkZXIgZHJpdmVyICovCiAJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDEwLCAwIDw8IDE0LCAxIDw8IDE0KTsKIApAQCAtNzY1NSw2ICs3Njk1LDEyIEBACiAJLyogVkdBIG91dHB1dCBjb21tb24gbW9kZSAqLwogCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgKDMgPDwgMiksIEJNQVNLKDMsIDIpKTsKIAorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVHggRERTIHRhYmxlcy4gIEFsc28gZG9uZSBldmVyeSBRU0ZQIGV2ZW50LAorCSAqIGZvciBhZGFwdGVycyB3aXRoIFFTRlAKKwkgKi8KKwlpbml0X3R4ZGRzX3RhYmxlKHBwZCwgMCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW5pdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW5pdC5jCmluZGV4IGEwMWYzZmMuLjU4YjBmOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2luaXQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInFpYi5oIgogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKQEAgLTE4Myw2ICsxODQsOSBAQAogCQlyY2QtPnJjdmVncmJ1Zl9jaHVua3MgPSAocmNkLT5yY3ZlZ3JjbnQgKwogCQkJcmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rIC0gMSkgLwogCQkJcmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rOworCQlCVUdfT04oIWlzX3Bvd2VyX29mXzIocmNkLT5yY3ZlZ3JidWZzX3BlcmNodW5rKSk7CisJCXJjZC0+cmN2ZWdyYnVmc19wZXJjaHVua19zaGlmdCA9CisJCQlpbG9nMihyY2QtPnJjdmVncmJ1ZnNfcGVyY2h1bmspOwogCX0KIAlyZXR1cm4gcmNkOwogfQpAQCAtMzk4LDYgKzQwMiw3IEBACiAJCWlmIChyY2QpCiAJCQlkZC0+Zl9yY3ZjdHJsKHJjZC0+cHBkLCByY3ZtYXNrLCBpKTsKIAl9CisJZGQtPmZyZWVjdHh0cyA9IGRkLT5jZmdjdHh0cyAtIGRkLT5maXJzdF91c2VyX2N0eHQ7CiB9CiAKIHN0YXRpYyB2b2lkIHZlcmlmeV9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBvcGFxdWUpCkBAIC01ODEsMTAgKzU4Niw2IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIGxldCBsaW5rIGNvbWUgdXAsIGFuZCBlbmFibGUgSUJDICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcGQtPmxmbGFnc19sb2NrLCBmbGFncyk7Ci0JCXBwZC0+bGZsYWdzICY9IH5RSUJMX0lCX0xJTktfRElTQUJMRUQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+bGZsYWdzX2xvY2ssIGZsYWdzKTsKIAkJcG9ydG9rKys7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9wY2llLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9wY2llLmMKaW5kZXggNDQyNjc4Mi4uOTdhOGJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcGNpZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3BjaWUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Flci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCmluZGV4IGUxNjc1MWYuLjdlN2UxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYwpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAKICNpbmNsdWRlICJxaWIuaCIKIApAQCAtMjA0LDYgKzIwNSwxMyBAQAogCQljbGVhcl9iaXQocXBuICYgQklUU19QRVJfUEFHRV9NQVNLLCBtYXAtPnBhZ2UpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHFwbl9oYXNoKHN0cnVjdCBxaWJfaWJkZXYgKmRldiwgdTMyIHFwbikKK3sKKwlyZXR1cm4gamhhc2hfMXdvcmQocXBuLCBkZXYtPnFwX3JuZCkgJgorCQkoZGV2LT5xcF90YWJsZV9zaXplIC0gMSk7Cit9CisKKwogLyoKICAqIFB1dCB0aGUgUVAgaW50byB0aGUgaGFzaCB0YWJsZS4KICAqIFRoZSBoYXNoIHRhYmxlIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBRUC4KQEAgLTIxMSwyMiArMjE5LDIzIEBACiBzdGF0aWMgdm9pZCBpbnNlcnRfcXAoc3RydWN0IHFpYl9pYmRldiAqZGV2LCBzdHJ1Y3QgcWliX3FwICpxcCkKIHsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gdG9faXBvcnQocXAtPmlicXAuZGV2aWNlLCBxcC0+cG9ydF9udW0pOwotCXVuc2lnbmVkIG4gPSBxcC0+aWJxcC5xcF9udW0gJSBkZXYtPnFwX3RhYmxlX3NpemU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBuID0gcXBuX2hhc2goZGV2LCBxcC0+aWJxcC5xcF9udW0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChxcC0+aWJxcC5xcF9udW0gPT0gMCkKLQkJaWJwLT5xcDAgPSBxcDsKLQllbHNlIGlmIChxcC0+aWJxcC5xcF9udW0gPT0gMSkKLQkJaWJwLT5xcDEgPSBxcDsKLQllbHNlIHsKLQkJcXAtPm5leHQgPSBkZXYtPnFwX3RhYmxlW25dOwotCQlkZXYtPnFwX3RhYmxlW25dID0gcXA7Ci0JfQogCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CiAKKwlpZiAocXAtPmlicXAucXBfbnVtID09IDApCisJCXJjdV9hc3NpZ25fcG9pbnRlcihpYnAtPnFwMCwgcXApOworCWVsc2UgaWYgKHFwLT5pYnFwLnFwX251bSA9PSAxKQorCQlyY3VfYXNzaWduX3BvaW50ZXIoaWJwLT5xcDEsIHFwKTsKKwllbHNlIHsKKwkJcXAtPm5leHQgPSBkZXYtPnFwX3RhYmxlW25dOworCQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT5xcF90YWJsZVtuXSwgcXApOworCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogLyoKQEAgLTIzNiwyOSArMjQ1LDMyIEBACiBzdGF0aWMgdm9pZCByZW1vdmVfcXAoc3RydWN0IHFpYl9pYmRldiAqZGV2LCBzdHJ1Y3QgcWliX3FwICpxcCkKIHsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gdG9faXBvcnQocXAtPmlicXAuZGV2aWNlLCBxcC0+cG9ydF9udW0pOwotCXN0cnVjdCBxaWJfcXAgKnEsICoqcXBwOworCXVuc2lnbmVkIG4gPSBxcG5faGFzaChkZXYsIHFwLT5pYnFwLnFwX251bSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXFwcCA9ICZkZXYtPnFwX3RhYmxlW3FwLT5pYnFwLnFwX251bSAlIGRldi0+cXBfdGFibGVfc2l6ZV07Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5xcHRfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGlicC0+cXAwID09IHFwKSB7Ci0JCWlicC0+cXAwID0gTlVMTDsKIAkJYXRvbWljX2RlYygmcXAtPnJlZmNvdW50KTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlicC0+cXAwLCBOVUxMKTsKIAl9IGVsc2UgaWYgKGlicC0+cXAxID09IHFwKSB7Ci0JCWlicC0+cXAxID0gTlVMTDsKIAkJYXRvbWljX2RlYygmcXAtPnJlZmNvdW50KTsKLQl9IGVsc2UKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlicC0+cXAxLCBOVUxMKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcWliX3FwICpxLCAqKnFwcDsKKworCQlxcHAgPSAmZGV2LT5xcF90YWJsZVtuXTsKIAkJZm9yICg7IChxID0gKnFwcCkgIT0gTlVMTDsgcXBwID0gJnEtPm5leHQpCiAJCQlpZiAocSA9PSBxcCkgewotCQkJCSpxcHAgPSBxcC0+bmV4dDsKLQkJCQlxcC0+bmV4dCA9IE5VTEw7CiAJCQkJYXRvbWljX2RlYygmcXAtPnJlZmNvdW50KTsKKwkJCQlyY3VfYXNzaWduX3BvaW50ZXIoKnFwcCwgcXAtPm5leHQpOworCQkJCXFwLT5uZXh0ID0gTlVMTDsKIAkJCQlicmVhazsKIAkJCX0KKwl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnFwdF9sb2NrLCBmbGFncyk7CisJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIC8qKgpAQCAtMjgwLDIxICsyOTIsMjQgQEAKIAogCQlpZiAoIXFpYl9tY2FzdF90cmVlX2VtcHR5KGlicCkpCiAJCQlxcF9pbnVzZSsrOwotCQlpZiAoaWJwLT5xcDApCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaWYgKHJjdV9kZXJlZmVyZW5jZShpYnAtPnFwMCkpCiAJCQlxcF9pbnVzZSsrOwotCQlpZiAoaWJwLT5xcDEpCisJCWlmIChyY3VfZGVyZWZlcmVuY2UoaWJwLT5xcDEpKQogCQkJcXBfaW51c2UrKzsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKIAlmb3IgKG4gPSAwOyBuIDwgZGV2LT5xcF90YWJsZV9zaXplOyBuKyspIHsKIAkJcXAgPSBkZXYtPnFwX3RhYmxlW25dOwotCQlkZXYtPnFwX3RhYmxlW25dID0gTlVMTDsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+cXBfdGFibGVbbl0sIE5VTEwpOwogCiAJCWZvciAoOyBxcDsgcXAgPSBxcC0+bmV4dCkKIAkJCXFwX2ludXNlKys7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCXJldHVybiBxcF9pbnVzZTsKIH0KQEAgLTMwOSwyNSArMzI0LDI4IEBACiAgKi8KIHN0cnVjdCBxaWJfcXAgKnFpYl9sb29rdXBfcXBuKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHUzMiBxcG4pCiB7Ci0Jc3RydWN0IHFpYl9pYmRldiAqZGV2ID0gJnBwZF9mcm9tX2licChpYnApLT5kZC0+dmVyYnNfZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHFpYl9xcCAqcXA7CisJc3RydWN0IHFpYl9xcCAqcXAgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cXB0X2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkocXBuIDw9IDEpKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaWYgKHFwbiA9PSAwKQorCQkJcXAgPSByY3VfZGVyZWZlcmVuY2UoaWJwLT5xcDApOworCQllbHNlCisJCQlxcCA9IHJjdV9kZXJlZmVyZW5jZShpYnAtPnFwMSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHFpYl9pYmRldiAqZGV2ID0gJnBwZF9mcm9tX2licChpYnApLT5kZC0+dmVyYnNfZGV2OworCQl1bnNpZ25lZCBuID0gcXBuX2hhc2goZGV2LCBxcG4pOwogCi0JaWYgKHFwbiA9PSAwKQotCQlxcCA9IGlicC0+cXAwOwotCWVsc2UgaWYgKHFwbiA9PSAxKQotCQlxcCA9IGlicC0+cXAxOwotCWVsc2UKLQkJZm9yIChxcCA9IGRldi0+cXBfdGFibGVbcXBuICUgZGV2LT5xcF90YWJsZV9zaXplXTsgcXA7Ci0JCSAgICAgcXAgPSBxcC0+bmV4dCkKKwkJcmN1X3JlYWRfbG9jaygpOworCQlmb3IgKHFwID0gZGV2LT5xcF90YWJsZVtuXTsgcmN1X2RlcmVmZXJlbmNlKHFwKTsgcXAgPSBxcC0+bmV4dCkKIAkJCWlmIChxcC0+aWJxcC5xcF9udW0gPT0gcXBuKQogCQkJCWJyZWFrOworCX0KIAlpZiAocXApCi0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmcXAtPnJlZmNvdW50KSkpCisJCQlxcCA9IE5VTEw7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnFwdF9sb2NrLCBmbGFncyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHFwOwogfQogCkBAIC03NjUsOCArNzgzLDEwIEBACiAJCX0KIAl9CiAKLQlpZiAoYXR0cl9tYXNrICYgSUJfUVBfUEFUSF9NVFUpCisJaWYgKGF0dHJfbWFzayAmIElCX1FQX1BBVEhfTVRVKSB7CiAJCXFwLT5wYXRoX210dSA9IHBtdHU7CisJCXFwLT5wbXR1ID0gaWJfbXR1X2VudW1fdG9faW50KHBtdHUpOworCX0KIAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9SRVRSWV9DTlQpIHsKIAkJcXAtPnNfcmV0cnlfY250ID0gYXR0ci0+cmV0cnlfY250OwpAQCAtNzgxLDggKzgwMSwxMiBAQAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9NSU5fUk5SX1RJTUVSKQogCQlxcC0+cl9taW5fcm5yX3RpbWVyID0gYXR0ci0+bWluX3Jucl90aW1lcjsKIAotCWlmIChhdHRyX21hc2sgJiBJQl9RUF9USU1FT1VUKQorCWlmIChhdHRyX21hc2sgJiBJQl9RUF9USU1FT1VUKSB7CiAJCXFwLT50aW1lb3V0ID0gYXR0ci0+dGltZW91dDsKKwkJcXAtPnRpbWVvdXRfamlmZmllcyA9CisJCQl1c2Vjc190b19qaWZmaWVzKCg0MDk2VUwgKiAoMVVMIDw8IHFwLT50aW1lb3V0KSkgLworCQkJCTEwMDBVTCk7CisJfQogCiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX1FLRVkpCiAJCXFwLT5xa2V5ID0gYXR0ci0+cWtleTsKQEAgLTEwMTMsNiArMTAzNywxMCBAQAogCQkJcmV0ID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJCWdvdG8gYmFpbF9zd3E7CiAJCX0KKwkJUkNVX0lOSVRfUE9JTlRFUihxcC0+bmV4dCwgTlVMTCk7CisJCXFwLT50aW1lb3V0X2ppZmZpZXMgPQorCQkJdXNlY3NfdG9famlmZmllcygoNDA5NlVMICogKDFVTCA8PCBxcC0+dGltZW91dCkpIC8KKwkJCQkxMDAwVUwpOwogCQlpZiAoaW5pdF9hdHRyLT5zcnEpCiAJCQlzeiA9IDA7CiAJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXNmcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXNmcC5jCmluZGV4IDMzNzRhNTIuLmUwNmM0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FzZnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmMKQEAgLTI3MywxOCArMjczLDEyIEBACiAJaW50IHJldDsKIAlpbnQgaWR4OwogCXUxNiBja3M7Ci0JdTMyIG1hc2s7CiAJdTggcGVla1s0XTsKIAogCS8qIGVuc3VyZSBzYW5lIGNvbnRlbnRzIG9uIGludmFsaWQgcmVhZHMsIGZvciBjYWJsZSBzd2FwcyAqLwogCW1lbXNldChjcCwgMCwgc2l6ZW9mKCpjcCkpOwogCi0JbWFzayA9IFFTRlBfR1BJT19NT0RfUFJTX047Ci0JaWYgKHBwZC0+aHdfcGlkeCkKLQkJbWFzayA8PD0gUVNGUF9HUElPX1BPUlQyX1NISUZUOwotCi0JcmV0ID0gcHBkLT5kZC0+Zl9ncGlvX21vZChwcGQtPmRkLCAwLCAwLCAwKTsKLQlpZiAocmV0ICYgbWFzaykgeworCWlmICghcWliX3FzZnBfbW9kX3ByZXNlbnQocHBkKSkgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtNDQ0LDYgKzQzOCwxOSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdyX2NvZGVzID0gIjEuNVcyLjBXMi41VzMuNVciOwogCitpbnQgcWliX3FzZnBfbW9kX3ByZXNlbnQoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCkKK3sKKwl1MzIgbWFzazsKKwlpbnQgcmV0OworCisJbWFzayA9IFFTRlBfR1BJT19NT0RfUFJTX04gPDwKKwkJKHBwZC0+aHdfcGlkeCAqIFFTRlBfR1BJT19QT1JUMl9TSElGVCk7CisJcmV0ID0gcHBkLT5kZC0+Zl9ncGlvX21vZChwcGQtPmRkLCAwLCAwLCAwKTsKKworCXJldHVybiAhKChyZXQgJiBtYXNrKSA+PgorCQkgKChwcGQtPmh3X3BpZHggKiBRU0ZQX0dQSU9fUE9SVDJfU0hJRlQpICsgMykpOworfQorCiAvKgogICogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzIHRoYXQgY29udHJvbCBhY2Nlc3MgdG8gUVNGUC4gQ2FsbGVkIG9uY2UgcGVyIHBvcnQKICAqIG9uIGNhcmRzIHRoYXQgc3VwcG9ydCBRU0ZQLgpAQCAtNDUyLDcgKzQ1OSw2IEBACiAJCSAgIHZvaWQgKCpmZXZlbnQpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKIHsKIAl1MzIgbWFzaywgaGlnaHM7Ci0JaW50IHBpbnM7CiAKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gcWQtPnBwZC0+ZGQ7CiAKQEAgLTQ4MCw4ICs0ODYsNyBAQAogCQltYXNrIDw8PSBRU0ZQX0dQSU9fUE9SVDJfU0hJRlQ7CiAKIAkvKiBEbyBub3QgdHJ5IHRvIHdhaXQgaGVyZS4gQmV0dGVyIHRvIGxldCBldmVudCBoYW5kbGUgaXQgKi8KLQlwaW5zID0gZGQtPmZfZ3Bpb19tb2QoZGQsIDAsIDAsIDApOwotCWlmIChwaW5zICYgbWFzaykKKwlpZiAoIXFpYl9xc2ZwX21vZF9wcmVzZW50KHFkLT5wcGQpKQogCQlnb3RvIGJhaWw7CiAJLyogV2Ugc2VlIGEgbW9kdWxlLCBidXQgaXQgbWF5IGJlIHVud2lzZSB0byBsb29rIHlldC4gSnVzdCBzY2hlZHVsZSAqLwogCXFkLT50X2luc2VydCA9IGdldF9qaWZmaWVzXzY0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xc2ZwLmgKaW5kZXggYzEwOWJiZC4uNDYwMDJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXNmcC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FzZnAuaApAQCAtMzQsNiArMzQsNyBAQAogCiAjZGVmaW5lIFFTRlBfREVWIDB4QTAKICNkZWZpbmUgUVNGUF9QV1JfTEFHX01TRUMgMjAwMAorI2RlZmluZSBRU0ZQX01PRFBSU19MQUdfTVNFQyAyMAogCiAvKgogICogQmVsb3cgYXJlIG1hc2tzIGZvciB2YXJpb3VzIFFTRlAgc2lnbmFscywgZm9yIFBvcnQgMS4KQEAgLTE3NywxMCArMTc4LDEyIEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IHFpYl9xc2ZwX2NhY2hlIGNhY2hlOwogCXU2NCB0X2luc2VydDsKKwl1OCBtb2RwcmVzZW50OwogfTsKIAogZXh0ZXJuIGludCBxaWJfcmVmcmVzaF9xc2ZwX2NhY2hlKHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQsCiAJCQkJICBzdHJ1Y3QgcWliX3FzZnBfY2FjaGUgKmNwKTsKK2V4dGVybiBpbnQgcWliX3FzZnBfbW9kX3ByZXNlbnQoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCk7CiBleHRlcm4gdm9pZCBxaWJfcXNmcF9pbml0KHN0cnVjdCBxaWJfcXNmcF9kYXRhICpxZCwKIAkJCSAgdm9pZCAoKmZldmVudCkoc3RydWN0IHdvcmtfc3RydWN0ICopKTsKIGV4dGVybiB2b2lkIHFpYl9xc2ZwX2RlaW5pdChzdHJ1Y3QgcWliX3FzZnBfZGF0YSAqcWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKaW5kZXggZWNhMGM0MS4uODk0YWZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCkBAIC01OSw4ICs1OSw3IEBACiAJcXAtPnNfZmxhZ3MgfD0gUUlCX1NfVElNRVI7CiAJcXAtPnNfdGltZXIuZnVuY3Rpb24gPSByY190aW1lb3V0OwogCS8qIDQuMDk2IHVzZWMuICogKDEgPDwgcXAtPnRpbWVvdXQpICovCi0JcXAtPnNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQl1c2Vjc190b19qaWZmaWVzKCg0MDk2VUwgKiAoMVVMIDw8IHFwLT50aW1lb3V0KSkgLyAxMDAwVUwpOworCXFwLT5zX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcXAtPnRpbWVvdXRfamlmZmllczsKIAlhZGRfdGltZXIoJnFwLT5zX3RpbWVyKTsKIH0KIApAQCAtMjM5LDcgKzIzOCw3IEBACiAJdTMyIGxlbjsKIAl1MzIgYnRoMDsKIAl1MzIgYnRoMjsKLQl1MzIgcG10dSA9IGliX210dV9lbnVtX3RvX2ludChxcC0+cGF0aF9tdHUpOworCXUzMiBwbXR1ID0gcXAtPnBtdHU7CiAJY2hhciBuZXdyZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKQEAgLTI3MiwxMyArMjcxLDkgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCQl3cWUgPSBnZXRfc3dxZV9wdHIocXAsIHFwLT5zX2xhc3QpOwotCQl3aGlsZSAocXAtPnNfbGFzdCAhPSBxcC0+c19hY2tlZCkgewotCQkJcWliX3NlbmRfY29tcGxldGUocXAsIHdxZSwgSUJfV0NfU1VDQ0VTUyk7Ci0JCQlpZiAoKytxcC0+c19sYXN0ID49IHFwLT5zX3NpemUpCi0JCQkJcXAtPnNfbGFzdCA9IDA7Ci0JCQl3cWUgPSBnZXRfc3dxZV9wdHIocXAsIHFwLT5zX2xhc3QpOwotCQl9Ci0JCXFpYl9zZW5kX2NvbXBsZXRlKHFwLCB3cWUsIElCX1dDX1dSX0ZMVVNIX0VSUik7CisJCXFpYl9zZW5kX2NvbXBsZXRlKHFwLCB3cWUsIHFwLT5zX2xhc3QgIT0gcXAtPnNfYWNrZWQgPworCQkJSUJfV0NfU1VDQ0VTUyA6IElCX1dDX1dSX0ZMVVNIX0VSUik7CisJCS8qIHdpbGwgZ2V0IGNhbGxlZCBhZ2FpbiAqLwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0xNTE5LDkgKzE1MTQsNyBAQAogCQkgKiA0LjA5NiB1c2VjLiAqICgxIDw8IHFwLT50aW1lb3V0KQogCQkgKi8KIAkJcXAtPnNfZmxhZ3MgfD0gUUlCX1NfVElNRVI7Ci0JCW1vZF90aW1lcigmcXAtPnNfdGltZXIsIGppZmZpZXMgKwotCQkJdXNlY3NfdG9famlmZmllcygoNDA5NlVMICogKDFVTCA8PCBxcC0+dGltZW91dCkpIC8KLQkJCQkJIDEwMDBVTCkpOworCQltb2RfdGltZXIoJnFwLT5zX3RpbWVyLCBqaWZmaWVzICsgcXAtPnRpbWVvdXRfamlmZmllcyk7CiAJCWlmIChxcC0+c19mbGFncyAmIFFJQl9TX1dBSVRfQUNLKSB7CiAJCQlxcC0+c19mbGFncyAmPSB+UUlCX1NfV0FJVF9BQ0s7CiAJCQlxaWJfc2NoZWR1bGVfc2VuZChxcCk7CkBAIC0xNzMyLDcgKzE3MjUsNyBAQAogCQkgKiBzYW1lIHJlcXVlc3QuCiAJCSAqLwogCQlvZmZzZXQgPSAoKHBzbiAtIGUtPnBzbikgJiBRSUJfUFNOX01BU0spICoKLQkJCWliX210dV9lbnVtX3RvX2ludChxcC0+cGF0aF9tdHUpOworCQkJcXAtPnBtdHU7CiAJCWxlbiA9IGJlMzJfdG9fY3B1KHJldGgtPmxlbmd0aCk7CiAJCWlmICh1bmxpa2VseShvZmZzZXQgKyBsZW4gIT0gZS0+cmRtYV9zZ2Uuc2dlX2xlbmd0aCkpCiAJCQlnb3RvIHVubG9ja19kb25lOwpAQCAtMTg3Niw3ICsxODY5LDcgQEAKIAl1MzIgcHNuOwogCXUzMiBwYWQ7CiAJc3RydWN0IGliX3djIHdjOwotCXUzMiBwbXR1ID0gaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7CisJdTMyIHBtdHUgPSBxcC0+cG10dTsKIAlpbnQgZGlmZjsKIAlzdHJ1Y3QgaWJfcmV0aCAqcmV0aDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTg5MiwxMCArMTg4NSw4IEBACiAJfQogCiAJb3Bjb2RlID0gYmUzMl90b19jcHUob2hkci0+YnRoWzBdKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogCWlmIChxaWJfcnVjX2NoZWNrX2hkcihpYnAsIGhkciwgaGFzX2dyaCwgcXAsIG9wY29kZSkpCi0JCWdvdG8gc3VubG9jazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKIAogCXBzbiA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsyXSk7CiAJb3Bjb2RlID4+PSAyNDsKQEAgLTE5NTUsOCArMTk0Niw2IEBACiAJCWJyZWFrOwogCX0KIAotCW1lbXNldCgmd2MsIDAsIHNpemVvZiB3Yyk7Ci0KIAlpZiAocXAtPnN0YXRlID09IElCX1FQU19SVFIgJiYgIShxcC0+cl9mbGFncyAmIFFJQl9SX0NPTU1fRVNUKSkgewogCQlxcC0+cl9mbGFncyB8PSBRSUJfUl9DT01NX0VTVDsKIAkJaWYgKHFwLT5pYnFwLmV2ZW50X2hhbmRsZXIpIHsKQEAgLTIwMDksMTYgKzE5OTgsMTkgQEAKIAkJCWdvdG8gcm5yX25hazsKIAkJcXAtPnJfcmN2X2xlbiA9IDA7CiAJCWlmIChvcGNvZGUgPT0gT1AoU0VORF9PTkxZKSkKLQkJCWdvdG8gc2VuZF9sYXN0OwotCQkvKiBGQUxMVEhST1VHSCAqLworCQkJZ290byBub19pbW1lZGlhdGVfZGF0YTsKKwkJLyogRkFMTFRIUk9VR0ggZm9yIFNFTkRfT05MWV9XSVRIX0lNTUVESUFURSAqLwogCWNhc2UgT1AoU0VORF9MQVNUX1dJVEhfSU1NRURJQVRFKToKIHNlbmRfbGFzdF9pbW06CiAJCXdjLmV4LmltbV9kYXRhID0gb2hkci0+dS5pbW1fZGF0YTsKIAkJaGRyc2l6ZSArPSA0OwogCQl3Yy53Y19mbGFncyA9IElCX1dDX1dJVEhfSU1NOwotCQkvKiBGQUxMVEhST1VHSCAqLworCQlnb3RvIHNlbmRfbGFzdDsKIAljYXNlIE9QKFNFTkRfTEFTVCk6CiAJY2FzZSBPUChSRE1BX1dSSVRFX0xBU1QpOgorbm9faW1tZWRpYXRlX2RhdGE6CisJCXdjLndjX2ZsYWdzID0gMDsKKwkJd2MuZXguaW1tX2RhdGEgPSAwOwogc2VuZF9sYXN0OgogCQkvKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgbWVzc2FnZSB3YXMgcGFkZGVkIGJ5LiAqLwogCQlwYWQgPSAoYmUzMl90b19jcHUob2hkci0+YnRoWzBdKSA+PiAyMCkgJiAzOwpAQCAtMjA1MSw2ICsyMDQzLDEyIEBACiAJCXdjLnNyY19xcCA9IHFwLT5yZW1vdGVfcXBuOwogCQl3Yy5zbGlkID0gcXAtPnJlbW90ZV9haF9hdHRyLmRsaWQ7CiAJCXdjLnNsID0gcXAtPnJlbW90ZV9haF9hdHRyLnNsOworCQkvKiB6ZXJvIGZpZWxkcyB0aGF0IGFyZSBOL0EgKi8KKwkJd2MudmVuZG9yX2VyciA9IDA7CisJCXdjLnBrZXlfaW5kZXggPSAwOworCQl3Yy5kbGlkX3BhdGhfYml0cyA9IDA7CisJCXdjLnBvcnRfbnVtID0gMDsKKwkJd2MuY3N1bV9vayA9IDA7CiAJCS8qIFNpZ25hbCBjb21wbGV0aW9uIGV2ZW50IGlmIHRoZSBzb2xpY2l0ZWQgYml0IGlzIHNldC4gKi8KIAkJcWliX2NxX2VudGVyKHRvX2ljcShxcC0+aWJxcC5yZWN2X2NxKSwgJndjLAogCQkJICAgICAob2hkci0+YnRoWzBdICYKQEAgLTIwODksNyArMjA4Nyw3IEBACiAJCWlmIChvcGNvZGUgPT0gT1AoUkRNQV9XUklURV9GSVJTVCkpCiAJCQlnb3RvIHNlbmRfbWlkZGxlOwogCQllbHNlIGlmIChvcGNvZGUgPT0gT1AoUkRNQV9XUklURV9PTkxZKSkKLQkJCWdvdG8gc2VuZF9sYXN0OworCQkJZ290byBub19pbW1lZGlhdGVfZGF0YTsKIAkJcmV0ID0gcWliX2dldF9yd3FlKHFwLCAxKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG5hY2tfb3BfZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYwppbmRleCBlYjc4ZDkzLi5iNGIzN2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYwpAQCAtMjYwLDEyICsyNjAsMTUgQEAKIAogLyoKICAqCi0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgUVAgc19sb2NrIGhlbGQuCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgUVAgcl9sb2NrIGhlbGQuCisgKgorICogVGhlIHNfbG9jayB3aWxsIGJlIGFjcXVpcmVkIGFyb3VuZCB0aGUgcWliX21pZ3JhdGVfcXAoKSBjYWxsLgogICovCiBpbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKIAkJICAgICAgaW50IGhhc19ncmgsIHN0cnVjdCBxaWJfcXAgKnFwLCB1MzIgYnRoMCkKIHsKIAlfX2JlNjQgZ3VpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHFwLT5zX21pZ19zdGF0ZSA9PSBJQl9NSUdfQVJNRUQgJiYgKGJ0aDAgJiBJQl9CVEhfTUlHX1JFUSkpIHsKIAkJaWYgKCFoYXNfZ3JoKSB7CkBAIC0yOTUsNyArMjk4LDkgQEAKIAkJaWYgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzNdKSAhPSBxcC0+YWx0X2FoX2F0dHIuZGxpZCB8fAogCQkgICAgcHBkX2Zyb21faWJwKGlicCktPnBvcnQgIT0gcXAtPmFsdF9haF9hdHRyLnBvcnRfbnVtKQogCQkJZ290byBlcnI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CiAJCXFpYl9taWdyYXRlX3FwKHFwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7CiAJCWlmICghaGFzX2dyaCkgewogCQkJaWYgKHFwLT5yZW1vdGVfYWhfYXR0ci5haF9mbGFncyAmIElCX0FIX0dSSCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3NkNzIyMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2Q3MjIwLmMKaW5kZXggZTlmOWY4Yi4uZGUxYTRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2Q3MjIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2Q3MjIwLmMKQEAgLTM4LDYgKzM4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgInFpYi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2RtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc2RtYS5jCmluZGV4IGNhZDQ0NDkuLjEyYTk2MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zZG1hLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgInFpYi5oIgogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3JxLmMKaW5kZXggYzNlYzhlZi4uZDYyMzU5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3JxLmMKQEAgLTEwNyw2ICsxMDcsMTEgQEAKIAl1MzIgc3o7CiAJc3RydWN0IGliX3NycSAqcmV0OwogCisJaWYgKHNycV9pbml0X2F0dHItPnNycV90eXBlICE9IElCX1NSUVRfQkFTSUMpIHsKKwkJcmV0ID0gRVJSX1BUUigtRU5PU1lTKTsKKwkJZ290byBkb25lOworCX0KKwogCWlmIChzcnFfaW5pdF9hdHRyLT5hdHRyLm1heF9zZ2UgPT0gMCB8fAogCSAgICBzcnFfaW5pdF9hdHRyLT5hdHRyLm1heF9zZ2UgPiBpYl9xaWJfbWF4X3NycV9zZ2VzIHx8CiAJICAgIHNycV9pbml0X2F0dHItPmF0dHIubWF4X3dyID09IDAgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9zeXNmcy5jCmluZGV4IDE0ZDEyOWQuLjc4ZmJkNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfc3lzZnMuYwpAQCAtNTE1LDggKzUxNSw3IEBACiAJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IGRkX2Zyb21fZGV2KGRldik7CiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmcmVlIHVzZXIgcG9ydHMgKGNvbnRleHRzKSBhdmFpbGFibGUuICovCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBkZC0+Y2ZnY3R4dHMgLQotCQlkZC0+Zmlyc3RfdXNlcl9jdHh0IC0gKHUzMilxaWJfc3RhdHMuc3BzX2N0eHRzKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGRkLT5mcmVlY3R4dHMpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X3NlcmlhbChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl90eC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdHguYwppbmRleCA3ZjM2NDU0Li4xYmY2MjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl90eC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3R4LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jCmluZGV4IDMyY2NmM2MuLjg0N2U3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYwpAQCAtNTEsNyArNTEsNyBAQAogCXUzMiBod29yZHM7CiAJdTMyIGJ0aDA7CiAJdTMyIGxlbjsKLQl1MzIgcG10dSA9IGliX210dV9lbnVtX3RvX2ludChxcC0+cGF0aF9tdHUpOworCXUzMiBwbXR1ID0gcXAtPnBtdHU7CiAJaW50IHJldCA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwpAQCAtMjQzLDEzICsyNDMsMTIgQEAKIAkJaW50IGhhc19ncmgsIHZvaWQgKmRhdGEsIHUzMiB0bGVuLCBzdHJ1Y3QgcWliX3FwICpxcCkKIHsKIAlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwc247CiAJdTMyIHBhZDsKIAlzdHJ1Y3QgaWJfd2Mgd2M7Ci0JdTMyIHBtdHUgPSBpYl9tdHVfZW51bV90b19pbnQocXAtPnBhdGhfbXR1KTsKKwl1MzIgcG10dSA9IHFwLT5wbXR1OwogCXN0cnVjdCBpYl9yZXRoICpyZXRoOwogCWludCByZXQ7CiAKQEAgLTI2MywxNCArMjYyLDExIEBACiAJfQogCiAJb3Bjb2RlID0gYmUzMl90b19jcHUob2hkci0+YnRoWzBdKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogCWlmIChxaWJfcnVjX2NoZWNrX2hkcihpYnAsIGhkciwgaGFzX2dyaCwgcXAsIG9wY29kZSkpCi0JCWdvdG8gc3VubG9jazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKIAogCXBzbiA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsyXSk7CiAJb3Bjb2RlID4+PSAyNDsKLQltZW1zZXQoJndjLCAwLCBzaXplb2Ygd2MpOwogCiAJLyogQ29tcGFyZSB0aGUgUFNOIHZlcnNlcyB0aGUgZXhwZWN0ZWQgUFNOLiAqLwogCWlmICh1bmxpa2VseShxaWJfY21wMjQocHNuLCBxcC0+cl9wc24pICE9IDApKSB7CkBAIC0zNzAsNyArMzY2LDcgQEAKIAkJfQogCQlxcC0+cl9yY3ZfbGVuID0gMDsKIAkJaWYgKG9wY29kZSA9PSBPUChTRU5EX09OTFkpKQotCQkJZ290byBzZW5kX2xhc3Q7CisJCQlnb3RvIG5vX2ltbWVkaWF0ZV9kYXRhOwogCQllbHNlIGlmIChvcGNvZGUgPT0gT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFKSkKIAkJCWdvdG8gc2VuZF9sYXN0X2ltbTsKIAkJLyogRkFMTFRIUk9VR0ggKi8KQEAgLTM4OSw4ICszODUsMTEgQEAKIAkJd2MuZXguaW1tX2RhdGEgPSBvaGRyLT51LmltbV9kYXRhOwogCQloZHJzaXplICs9IDQ7CiAJCXdjLndjX2ZsYWdzID0gSUJfV0NfV0lUSF9JTU07Ci0JCS8qIEZBTExUSFJPVUdIICovCisJCWdvdG8gc2VuZF9sYXN0OwogCWNhc2UgT1AoU0VORF9MQVNUKToKK25vX2ltbWVkaWF0ZV9kYXRhOgorCQl3Yy5leC5pbW1fZGF0YSA9IDA7CisJCXdjLndjX2ZsYWdzID0gMDsKIHNlbmRfbGFzdDoKIAkJLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIG1lc3NhZ2Ugd2FzIHBhZGRlZCBieS4gKi8KIAkJcGFkID0gKGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkgPj4gMjApICYgMzsKQEAgLTQxOCw2ICs0MTcsMTIgQEAKIAkJd2Muc3JjX3FwID0gcXAtPnJlbW90ZV9xcG47CiAJCXdjLnNsaWQgPSBxcC0+cmVtb3RlX2FoX2F0dHIuZGxpZDsKIAkJd2Muc2wgPSBxcC0+cmVtb3RlX2FoX2F0dHIuc2w7CisJCS8qIHplcm8gZmllbGRzIHRoYXQgYXJlIE4vQSAqLworCQl3Yy52ZW5kb3JfZXJyID0gMDsKKwkJd2MucGtleV9pbmRleCA9IDA7CisJCXdjLmRsaWRfcGF0aF9iaXRzID0gMDsKKwkJd2MucG9ydF9udW0gPSAwOworCQl3Yy5jc3VtX29rID0gMDsKIAkJLyogU2lnbmFsIGNvbXBsZXRpb24gZXZlbnQgaWYgdGhlIHNvbGljaXRlZCBiaXQgaXMgc2V0LiAqLwogCQlxaWJfY3FfZW50ZXIodG9faWNxKHFwLT5pYnFwLnJlY3ZfY3EpLCAmd2MsCiAJCQkgICAgIChvaGRyLT5idGhbMF0gJgpAQCAtNTQ2LDYgKzU1MSw0IEBACiAJcWliX3JjX2Vycm9yKHFwLCBJQl9XQ19MT0NfUVBfT1BfRVJSKTsKIAlyZXR1cm47CiAKLXN1bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdXNlcl9wYWdlcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdXNlcl9wYWdlcy5jCmluZGV4IDc2ODllNDkuLjJiYzFkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VzZXJfcGFnZXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3BhZ2VzLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAkJCWdvdG8gYmFpbF9yZWxlYXNlOwogCX0KIAotCWN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gKz0gbnVtX3BhZ2VzOworCWN1cnJlbnQtPm1tLT5waW5uZWRfdm0gKz0gbnVtX3BhZ2VzOwogCiAJcmV0ID0gMDsKIAlnb3RvIGJhaWw7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAlfX3FpYl9yZWxlYXNlX3VzZXJfcGFnZXMocCwgbnVtX3BhZ2VzLCAxKTsKIAogCWlmIChjdXJyZW50LT5tbSkgewotCQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtIC09IG51bV9wYWdlczsKKwkJY3VycmVudC0+bW0tPnBpbm5lZF92bSAtPSBudW1fcGFnZXM7CiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jCmluZGV4IDlmYWI0MDQuLmE4OTQ3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYwpAQCAtMzUsMTQgKzM1LDE2IEBACiAjaW5jbHVkZSA8cmRtYS9pYl9tYWQuaD4KICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2luY2x1ZGUgInFpYi5oIgogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCBpYl9xaWJfcXBfdGFibGVfc2l6ZSA9IDI1MTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWJfcWliX3FwX3RhYmxlX3NpemUgPSAyNTY7CiBtb2R1bGVfcGFyYW1fbmFtZWQocXBfdGFibGVfc2l6ZSwgaWJfcWliX3FwX3RhYmxlX3NpemUsIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhxcF90YWJsZV9zaXplLCAiUVAgdGFibGUgc2l6ZSIpOwogCkBAIC02NTksMTcgKzY2MSwyNSBAQAogCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJm1jYXN0LT5yZWZjb3VudCkgPD0gMSkKIAkJCXdha2VfdXAoJm1jYXN0LT53YWl0KTsKIAl9IGVsc2UgewotCQlxcCA9IHFpYl9sb29rdXBfcXBuKGlicCwgcXBfbnVtKTsKLQkJaWYgKCFxcCkKLQkJCWdvdG8gZHJvcDsKKwkJaWYgKHJjZC0+bG9va2FzaWRlX3FwKSB7CisJCQlpZiAocmNkLT5sb29rYXNpZGVfcXBuICE9IHFwX251bSkgeworCQkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KAorCQkJCQkmcmNkLT5sb29rYXNpZGVfcXAtPnJlZmNvdW50KSkKKwkJCQkJd2FrZV91cCgKKwkJCQkJICZyY2QtPmxvb2thc2lkZV9xcC0+d2FpdCk7CisJCQkJCXJjZC0+bG9va2FzaWRlX3FwID0gTlVMTDsKKwkJCQl9CisJCX0KKwkJaWYgKCFyY2QtPmxvb2thc2lkZV9xcCkgeworCQkJcXAgPSBxaWJfbG9va3VwX3FwbihpYnAsIHFwX251bSk7CisJCQlpZiAoIXFwKQorCQkJCWdvdG8gZHJvcDsKKwkJCXJjZC0+bG9va2FzaWRlX3FwID0gcXA7CisJCQlyY2QtPmxvb2thc2lkZV9xcG4gPSBxcF9udW07CisJCX0gZWxzZQorCQkJcXAgPSByY2QtPmxvb2thc2lkZV9xcDsKIAkJaWJwLT5uX3VuaWNhc3RfcmN2Kys7CiAJCXFpYl9xcF9yY3YocmNkLCBoZHIsIGxuaCA9PSBRSUJfTFJIX0dSSCwgZGF0YSwgdGxlbiwgcXApOwotCQkvKgotCQkgKiBOb3RpZnkgcWliX2Rlc3Ryb3lfcXAoKSBpZiBpdCBpcyB3YWl0aW5nCi0JCSAqIGZvciB1cyB0byBmaW5pc2guCi0JCSAqLwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKIAl9CiAJcmV0dXJuOwogCkBAIC0xOTc0LDYgKzE5ODQsOCBAQAogCWlicC0+el9leGNlc3NpdmVfYnVmZmVyX292ZXJydW5fZXJyb3JzID0KIAkJY250cnMuZXhjZXNzaXZlX2J1ZmZlcl9vdmVycnVuX2Vycm9yczsKIAlpYnAtPnpfdmwxNV9kcm9wcGVkID0gY250cnMudmwxNV9kcm9wcGVkOworCVJDVV9JTklUX1BPSU5URVIoaWJwLT5xcDAsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIoaWJwLT5xcDEsIE5VTEwpOwogfQogCiAvKioKQEAgLTE5OTAsMTIgKzIwMDIsMTUgQEAKIAlpbnQgcmV0OwogCiAJZGV2LT5xcF90YWJsZV9zaXplID0gaWJfcWliX3FwX3RhYmxlX3NpemU7Ci0JZGV2LT5xcF90YWJsZSA9IGt6YWxsb2MoZGV2LT5xcF90YWJsZV9zaXplICogc2l6ZW9mICpkZXYtPnFwX3RhYmxlLAorCWdldF9yYW5kb21fYnl0ZXMoJmRldi0+cXBfcm5kLCBzaXplb2YoZGV2LT5xcF9ybmQpKTsKKwlkZXYtPnFwX3RhYmxlID0ga21hbGxvYyhkZXYtPnFwX3RhYmxlX3NpemUgKiBzaXplb2YgKmRldi0+cXBfdGFibGUsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPnFwX3RhYmxlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3FwdDsKIAl9CisJZm9yIChpID0gMDsgaSA8IGRldi0+cXBfdGFibGVfc2l6ZTsgaSsrKQorCQlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+cXBfdGFibGVbaV0sIE5VTEwpOwogCiAJZm9yIChpID0gMDsgaSA8IGRkLT5udW1fcHBvcnRzOyBpKyspCiAJCWluaXRfaWJwb3J0KHBwZCArIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKaW5kZXggOTVlNWI0Ny4uMGMxOWVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCkBAIC00ODUsNiArNDg1LDcgQEAKIAl1OCBhbHRfdGltZW91dDsgICAgICAgICAvKiBBbHRlcm5hdGUgcGF0aCB0aW1lb3V0IGZvciB0aGlzIFFQICovCiAJdTggcG9ydF9udW07CiAJZW51bSBpYl9tdHUgcGF0aF9tdHU7CisJdTMyIHBtdHU7CQkvKiBkZWNvZGVkIGZyb20gcGF0aF9tdHUgKi8KIAl1MzIgcmVtb3RlX3FwbjsKIAl1MzIgcWtleTsgICAgICAgICAgICAgICAvKiBRS0VZIGZvciB0aGlzIFFQIChmb3IgVUQgb3IgUkQpICovCiAJdTMyIHNfc2l6ZTsgICAgICAgICAgICAgLyogc2VuZCB3b3JrIHF1ZXVlIHNpemUgKi8KQEAgLTQ5NSw2ICs0OTYsNyBAQAogCXUzMiBzX2xhc3Q7ICAgICAgICAgICAgIC8qIGxhc3QgY29tcGxldGVkIGVudHJ5ICovCiAJdTMyIHNfc3NuOyAgICAgICAgICAgICAgLyogU1NOIG9mIHRhaWwgZW50cnkgKi8KIAl1MzIgc19sc247ICAgICAgICAgICAgICAvKiBsaW1pdCBzZXF1ZW5jZSBudW1iZXIgKGNyZWRpdCkgKi8KKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfamlmZmllczsgIC8qIGNvbXB1dGVkIGZyb20gdGltZW91dCAqLwogCXN0cnVjdCBxaWJfc3dxZSAqc193cTsgIC8qIHNlbmQgd29yayBxdWV1ZSAqLwogCXN0cnVjdCBxaWJfc3dxZSAqc193cWU7CiAJc3RydWN0IHFpYl9ycSByX3JxOyAgICAgICAgICAgICAvKiByZWNlaXZlIHdvcmsgcXVldWUgKi8KQEAgLTcyMyw3ICs3MjUsOCBAQAogCWRtYV9hZGRyX3QgcGlvX2hkcnNfcGh5czsKIAkvKiBsaXN0IG9mIFFQcyB3YWl0aW5nIGZvciBSTlIgdGltZXIgKi8KIAlzcGlubG9ja190IHBlbmRpbmdfbG9jazsgLyogcHJvdGVjdCB3YWl0IGxpc3RzLCBQTUEgY291bnRlcnMsIGV0Yy4gKi8KLQl1bnNpZ25lZCBxcF90YWJsZV9zaXplOyAvKiBzaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCisJdTMyIHFwX3RhYmxlX3NpemU7IC8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwl1MzIgcXBfcm5kOyAvKiByYW5kb20gYnl0ZXMgZm9yIGhhc2ggKi8KIAlzcGlubG9ja190IHFwdF9sb2NrOwogCiAJdTMyIG5fcGlvd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYwppbmRleCBjNzQ1NDhhLi4wMTQ1MDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJpcG9pYi5oIgogCkBAIC04NCw3ICs4NSw3IEBACiAJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgbWFwcGluZ1swXSwgSVBPSUJfQ01fSEVBRF9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJZm9yIChpID0gMDsgaSA8IGZyYWdzOyArK2kpCi0JCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsIG1hcHBpbmdbaSArIDFdLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWliX2RtYV91bm1hcF9wYWdlKHByaXYtPmNhLCBtYXBwaW5nW2kgKyAxXSwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogfQogCiBzdGF0aWMgaW50IGlwb2liX2NtX3Bvc3RfcmVjZWl2ZV9zcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlkKQpAQCAtMTgzLDcgKzE4NCw3IEBACiAJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgbWFwcGluZ1swXSwgSVBPSUJfQ01fSEVBRF9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJZm9yICg7IGkgPiAwOyAtLWkpCi0JCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsIG1hcHBpbmdbaV0sIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWJfZG1hX3VubWFwX3BhZ2UocHJpdi0+Y2EsIG1hcHBpbmdbaV0sIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIE5VTEw7CkBAIC0xNDk3LDYgKzE0OTgsNyBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGliX3NycV9pbml0X2F0dHIgc3JxX2luaXRfYXR0ciA9IHsKKwkJLnNycV90eXBlID0gSUJfU1JRVF9CQVNJQywKIAkJLmF0dHIgPSB7CiAJCQkubWF4X3dyICA9IGlwb2liX3JlY3ZxX3NpemUsCiAJCQkubWF4X3NnZSA9IG1heF9zZ2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZnMuYwppbmRleCA4NmVhZTIyLi41MDA2MTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9mcy5jCkBAIC0zNyw2ICszNyw3IEBACiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zOwogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiaXBvaWIuaCIKIApAQCAtMjEyLDE2ICsyMTMsMTUgQEAKIAkJICAgZ2lkX2J1ZiwgcGF0aC5wYXRocmVjLmRsaWQgPyAieWVzIiA6ICJubyIpOwogCiAJaWYgKHBhdGgucGF0aHJlYy5kbGlkKSB7Ci0JCXJhdGUgPSBpYl9yYXRlX3RvX211bHQocGF0aC5wYXRocmVjLnJhdGUpICogMjU7CisJCXJhdGUgPSBpYl9yYXRlX3RvX21icHMocGF0aC5wYXRocmVjLnJhdGUpOwogCiAJCXNlcV9wcmludGYoZmlsZSwKIAkJCSAgICIgIERMSUQ6ICAgICAweCUwNHhcbiIKIAkJCSAgICIgIFNMOiAlMTJkXG4iCi0JCQkgICAiICByYXRlOiAlKmQlcyBHYi9zZWNcbiIsCisJCQkgICAiICByYXRlOiAlOGQuJWQgR2Ivc2VjXG4iLAogCQkJICAgYmUxNl90b19jcHUocGF0aC5wYXRocmVjLmRsaWQpLAogCQkJICAgcGF0aC5wYXRocmVjLnNsLAotCQkJICAgMTAgLSAoKHJhdGUgJSAxMCkgPyAyIDogMCksCi0JCQkgICByYXRlIC8gMTAsIHJhdGUgJSAxMCA/ICIuNSIgOiAiIik7CisJCQkgICByYXRlIC8gMTAwMCwgcmF0ZSAlIDEwMDApOwogCX0KIAogCXNlcV9wdXRjKGZpbGUsICdcbicpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCmluZGV4IDJiMDYwZjQuLjBlZjlhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwppbmRleCBlY2VhNGZlLi4xYjdhOTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCmluZGV4IDljNjFiOWMuLjdlNzM3M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogCkBAIC0xNTEsNyArMTUyLDYgQEAKIAl0eF9kZXNjLT50eF9zZ1swXS5sZW5ndGggPSBJU0VSX0hFQURFUlNfTEVOOwogCXR4X2Rlc2MtPnR4X3NnWzBdLmxrZXkgICA9IGRldmljZS0+bXItPmxrZXk7CiAKLQlpc2VyX3Rhc2stPmhlYWRlcnNfaW5pdGlhbGl6ZWQJPSAxOwogCWlzZXJfdGFzay0+aXNlcl9jb25uCQk9IGlzZXJfY29ubjsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2Niw4ICsxNjYsNyBAQAogewogCXN0cnVjdCBpc2NzaV9pc2VyX3Rhc2sgKmlzZXJfdGFzayA9IHRhc2stPmRkX2RhdGE7CiAKLQlpZiAoIWlzZXJfdGFzay0+aGVhZGVyc19pbml0aWFsaXplZCkKLQkJaWYgKGlzZXJfaW5pdGlhbGl6ZV90YXNrX2hlYWRlcnModGFzaywgJmlzZXJfdGFzay0+ZGVzYykpCisJaWYgKGlzZXJfaW5pdGlhbGl6ZV90YXNrX2hlYWRlcnModGFzaywgJmlzZXJfdGFzay0+ZGVzYykpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIG1nbXQgdGFzayAqLwpAQCAtMjc4LDYgKzI3NywxMyBAQAogc3RhdGljIHZvaWQgaXNjc2lfaXNlcl9jbGVhbnVwX3Rhc2soc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCiB7CiAJc3RydWN0IGlzY3NpX2lzZXJfdGFzayAqaXNlcl90YXNrID0gdGFzay0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNlcl90eF9kZXNjCSp0eF9kZXNjID0gJmlzZXJfdGFzay0+ZGVzYzsKKworCXN0cnVjdCBpc2NzaV9pc2VyX2Nvbm4gKmlzZXJfY29ubiA9IHRhc2stPmNvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzZXJfZGV2aWNlICAgICAqZGV2aWNlICAgID0gaXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2U7CisKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKGRldmljZS0+aWJfZGV2aWNlLAorCQl0eF9kZXNjLT5kbWFfYWRkciwgSVNFUl9IRUFERVJTX0xFTiwgRE1BX1RPX0RFVklDRSk7CiAKIAkvKiBtZ210IHRhc2tzIGRvIG5vdCBuZWVkIHNwZWNpYWwgY2xlYW51cCAqLwogCWlmICghdGFzay0+c2MpCkBAIC02MzIsNiArNjM4LDU5IEBACiAJaXNlcl9jb25uX3Rlcm1pbmF0ZShpYl9jb25uKTsKIH0KIAorc3RhdGljIG1vZGVfdCBpc2VyX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIElTQ1NJX1BBUkFNOgorCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fUElOR19UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fUkVDVl9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1IyVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTU1fREFUQV9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GSVJTVF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fUERVX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkRfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9BQk9SVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaXNjc2lfaXNlcl9zaHQgPSB7CiAJLm1vZHVsZSAgICAgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJpU0NTSSBJbml0aWF0b3Igb3ZlciBpU0VSLCB2LiIgRFJWX1ZFUiwKQEAgLTY1MywzMiArNzEyLDYgQEAKIAkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImlzZXIiLAogCS5jYXBzICAgICAgICAgICAgICAgICAgID0gQ0FQX1JFQ09WRVJZX0wwIHwgQ0FQX01VTFRJX1IyVCwKLQkucGFyYW1fbWFzawkJPSBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIIHwKLQkJCQkgIElTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAotCQkJCSAgSVNDU0lfSERSREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBREdTVF9FTiB8Ci0JCQkJICBJU0NTSV9JTklUSUFMX1IyVF9FTiB8Ci0JCQkJICBJU0NTSV9NQVhfUjJUIHwKLQkJCQkgIElTQ1NJX0lNTV9EQVRBX0VOIHwKLQkJCQkgIElTQ1NJX0ZJUlNUX0JVUlNUIHwKLQkJCQkgIElTQ1NJX01BWF9CVVJTVCB8Ci0JCQkJICBJU0NTSV9QRFVfSU5PUkRFUl9FTiB8Ci0JCQkJICBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfAotCQkJCSAgSVNDU0lfQ09OTl9QT1JUIHwKLQkJCQkgIElTQ1NJX0NPTk5fQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9FWFBfU1RBVFNOIHwKLQkJCQkgIElTQ1NJX1BFUlNJU1RFTlRfUE9SVCB8Ci0JCQkJICBJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MgfAotCQkJCSAgSVNDU0lfVEFSR0VUX05BTUUgfCBJU0NTSV9UUEdUIHwKLQkJCQkgIElTQ1NJX1VTRVJOQU1FIHwgSVNDU0lfUEFTU1dPUkQgfAotCQkJCSAgSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8Ci0JCQkJICBJU0NTSV9GQVNUX0FCT1JUIHwgSVNDU0lfQUJPUlRfVE1PIHwKLQkJCQkgIElTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAotCQkJCSAgSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8Ci0JCQkJICBJU0NTSV9JRkFDRV9OQU1FIHwgSVNDU0lfSU5JVElBVE9SX05BTUUsCi0JLmhvc3RfcGFyYW1fbWFzawk9IElTQ1NJX0hPU1RfSFdBRERSRVNTIHwKLQkJCQkgIElTQ1NJX0hPU1RfTkVUREVWX05BTUUgfAotCQkJCSAgSVNDU0lfSE9TVF9JTklUSUFUT1JfTkFNRSwKIAkvKiBzZXNzaW9uIG1hbmFnZW1lbnQgKi8KIAkuY3JlYXRlX3Nlc3Npb24gICAgICAgICA9IGlzY3NpX2lzZXJfc2Vzc2lvbl9jcmVhdGUsCiAJLmRlc3Ryb3lfc2Vzc2lvbiAgICAgICAgPSBpc2NzaV9pc2VyX3Nlc3Npb25fZGVzdHJveSwKQEAgLTY4Niw2ICs3MTksNyBAQAogCS5jcmVhdGVfY29ubiAgICAgICAgICAgID0gaXNjc2lfaXNlcl9jb25uX2NyZWF0ZSwKIAkuYmluZF9jb25uICAgICAgICAgICAgICA9IGlzY3NpX2lzZXJfY29ubl9iaW5kLAogCS5kZXN0cm95X2Nvbm4gICAgICAgICAgID0gaXNjc2lfaXNlcl9jb25uX2Rlc3Ryb3ksCisJLmF0dHJfaXNfdmlzaWJsZQk9IGlzZXJfYXR0cl9pc192aXNpYmxlLAogCS5zZXRfcGFyYW0gICAgICAgICAgICAgID0gaXNjc2lfaXNlcl9zZXRfcGFyYW0sCiAJLmdldF9jb25uX3BhcmFtCQk9IGlzY3NpX2Nvbm5fZ2V0X3BhcmFtLAogCS5nZXRfZXBfcGFyYW0JCT0gaXNjc2lfaXNlcl9nZXRfZXBfcGFyYW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaAppbmRleCBkYjZmM2NlLi5kYjdlYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmgKQEAgLTI1Nyw3ICsyNTcsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJICAgICBjb25uX2xpc3Q7ICAgICAgIC8qIGVudHJ5IGluIGlnIGNvbm4gbGlzdCAqLwogCiAJY2hhciAgCQkJICAgICAqbG9naW5fYnVmOwotCXU2NCAJCQkgICAgIGxvZ2luX2RtYTsKKwljaGFyCQkJICAgICAqbG9naW5fcmVxX2J1ZiwgKmxvZ2luX3Jlc3BfYnVmOworCXU2NAkJCSAgICAgbG9naW5fcmVxX2RtYSwgbG9naW5fcmVzcF9kbWE7CiAJdW5zaWduZWQgaW50IAkJICAgICByeF9kZXNjX2hlYWQ7CiAJc3RydWN0IGlzZXJfcnhfZGVzYwkgICAgICpyeF9kZXNjczsKIAlzdHJ1Y3QgaWJfcmVjdl93cgkgICAgIHJ4X3dyW0lTRVJfTUlOX1BPU1RFRF9SWF07CkBAIC0yNzcsNyArMjc4LDYgQEAKIAlzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAgICAgICAgIHJkbWFfcmVnZFtJU0VSX0RJUlNfTlVNXTsvKiByZWdkIHJkbWEgYnVmICovCiAJc3RydWN0IGlzZXJfZGF0YV9idWYgICAgICAgICBkYXRhW0lTRVJfRElSU19OVU1dOyAgICAgLyogb3JpZy4gZGF0YSBkZXMqLwogCXN0cnVjdCBpc2VyX2RhdGFfYnVmICAgICAgICAgZGF0YV9jb3B5W0lTRVJfRElSU19OVU1dOy8qIGNvbnRpZy4gY29weSAgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNfaW5pdGlhbGl6ZWQ7CiB9OwogCiBzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCmluZGV4IGYyOTlkZTYuLmE2MDc1NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCkBAIC0yMjEsOCArMjIxLDE0IEBACiAJc3RydWN0IGlzZXJfZGV2aWNlICpkZXZpY2UgPSBpYl9jb25uLT5kZXZpY2U7CiAKIAlpZiAoaWJfY29ubi0+bG9naW5fYnVmKSB7Ci0JCWliX2RtYV91bm1hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UsIGliX2Nvbm4tPmxvZ2luX2RtYSwKLQkJCUlTRVJfUlhfTE9HSU5fU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGliX2Nvbm4tPmxvZ2luX3JlcV9kbWEpCisJCQlpYl9kbWFfdW5tYXBfc2luZ2xlKGRldmljZS0+aWJfZGV2aWNlLAorCQkJCWliX2Nvbm4tPmxvZ2luX3JlcV9kbWEsCisJCQkJSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4sIERNQV9UT19ERVZJQ0UpOworCQlpZiAoaWJfY29ubi0+bG9naW5fcmVzcF9kbWEpCisJCQlpYl9kbWFfdW5tYXBfc2luZ2xlKGRldmljZS0+aWJfZGV2aWNlLAorCQkJCWliX2Nvbm4tPmxvZ2luX3Jlc3BfZG1hLAorCQkJCUlTRVJfUlhfTE9HSU5fU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAkJa2ZyZWUoaWJfY29ubi0+bG9naW5fYnVmKTsKIAl9CiAKQEAgLTM5NCw2ICs0MDAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZGF0YV9zZWdfbGVuOwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBpc2VyX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBpc2VyX2Nvbm4gKmliX2Nvbm4gPSBpc2VyX2Nvbm4tPmliX2Nvbm47CiAKIAkvKiBidWlsZCB0aGUgdHggZGVzYyByZWdkIGhlYWRlciBhbmQgYWRkIGl0IHRvIHRoZSB0eCBkZXNjIGR0byAqLwogCW1kZXNjLT50eXBlID0gSVNDU0lfVFhfQ09OVFJPTDsKQEAgLTQwOSw5ICs0MTYsMTkgQEAKIAkJCWlzZXJfZXJyKCJkYXRhIHByZXNlbnQgb24gbm9uIGxvZ2luIHRhc2shISFcbiIpOwogCQkJZ290byBzZW5kX2NvbnRyb2xfZXJyb3I7CiAJCX0KLQkJbWVtY3B5KGlzZXJfY29ubi0+aWJfY29ubi0+bG9naW5fYnVmLCB0YXNrLT5kYXRhLAorCisJCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldmljZS0+aWJfZGV2aWNlLAorCQkJaWJfY29ubi0+bG9naW5fcmVxX2RtYSwgdGFzay0+ZGF0YV9jb3VudCwKKwkJCURNQV9UT19ERVZJQ0UpOworCisJCW1lbWNweShpc2VyX2Nvbm4tPmliX2Nvbm4tPmxvZ2luX3JlcV9idWYsIHRhc2stPmRhdGEsCiAJCQkJCQkJdGFzay0+ZGF0YV9jb3VudCk7Ci0JCXR4X2RzZy0+YWRkciAgICA9IGlzZXJfY29ubi0+aWJfY29ubi0+bG9naW5fZG1hOworCisJCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldmljZS0+aWJfZGV2aWNlLAorCQkJaWJfY29ubi0+bG9naW5fcmVxX2RtYSwgdGFzay0+ZGF0YV9jb3VudCwKKwkJCURNQV9UT19ERVZJQ0UpOworCisJCXR4X2RzZy0+YWRkciAgICA9IGlzZXJfY29ubi0+aWJfY29ubi0+bG9naW5fcmVxX2RtYTsKIAkJdHhfZHNnLT5sZW5ndGggID0gdGFzay0+ZGF0YV9jb3VudDsKIAkJdHhfZHNnLT5sa2V5ICAgID0gZGV2aWNlLT5tci0+bGtleTsKIAkJbWRlc2MtPm51bV9zZ2UgPSAyOwpAQCAtNDQ1LDggKzQ2Miw4IEBACiAJaW50IHJ4X2J1Zmxlbiwgb3V0c3RhbmRpbmcsIGNvdW50LCBlcnI7CiAKIAkvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbG9naW4gdG8gYWxsIG90aGVyIFBEVXMgKi8KLQlpZiAoKGNoYXIgKilyeF9kZXNjID09IGliX2Nvbm4tPmxvZ2luX2J1ZikgewotCQlyeF9kbWEgPSBpYl9jb25uLT5sb2dpbl9kbWE7CisJaWYgKChjaGFyICopcnhfZGVzYyA9PSBpYl9jb25uLT5sb2dpbl9yZXNwX2J1ZikgeworCQlyeF9kbWEgPSBpYl9jb25uLT5sb2dpbl9yZXNwX2RtYTsKIAkJcnhfYnVmbGVuID0gSVNFUl9SWF9MT0dJTl9TSVpFOwogCX0gZWxzZSB7CiAJCXJ4X2RtYSA9IHJ4X2Rlc2MtPmRtYV9hZGRyOwpAQCAtNDczLDcgKzQ5MCw3IEBACiAJICogZm9yIHRoZSBwb3N0ZWQgcnggYnVmcyByZWZjb3VudCB0byBiZWNvbWUgemVybyBoYW5kbGVzIGV2ZXJ5dGhpbmcgICAqLwogCWNvbm4tPmliX2Nvbm4tPnBvc3RfcmVjdl9idWZfY291bnQtLTsKIAotCWlmIChyeF9kbWEgPT0gaWJfY29ubi0+bG9naW5fZG1hKQorCWlmIChyeF9kbWEgPT0gaWJfY29ubi0+bG9naW5fcmVzcF9kbWEpCiAJCXJldHVybjsKIAogCW91dHN0YW5kaW5nID0gaWJfY29ubi0+cG9zdF9yZWN2X2J1Zl9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl92ZXJicy5jCmluZGV4IGVkZTE0NzUuLmUyODg3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYwpAQCAtMTU1LDIwICsxNTUsMzkgQEAKIHsKIAlzdHJ1Y3QgaXNlcl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyCWluaXRfYXR0cjsKLQlpbnQJCQlyZXQgPSAtRU5PTUVNOworCWludAkJCXJlcV9lcnIsIHJlc3BfZXJyLCByZXQgPSAtRU5PTUVNOwogCXN0cnVjdCBpYl9mbXJfcG9vbF9wYXJhbSBwYXJhbXM7CiAKIAlCVUdfT04oaWJfY29ubi0+ZGV2aWNlID09IE5VTEwpOwogCiAJZGV2aWNlID0gaWJfY29ubi0+ZGV2aWNlOwogCi0JaWJfY29ubi0+bG9naW5fYnVmID0ga21hbGxvYyhJU0VSX1JYX0xPR0lOX1NJWkUsIEdGUF9LRVJORUwpOworCWliX2Nvbm4tPmxvZ2luX2J1ZiA9IGttYWxsb2MoSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4gKworCQkJCQlJU0VSX1JYX0xPR0lOX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghaWJfY29ubi0+bG9naW5fYnVmKQogCQlnb3RvIG91dF9lcnI7CiAKLQlpYl9jb25uLT5sb2dpbl9kbWEgPSBpYl9kbWFfbWFwX3NpbmdsZShpYl9jb25uLT5kZXZpY2UtPmliX2RldmljZSwKLQkJCQkodm9pZCAqKWliX2Nvbm4tPmxvZ2luX2J1ZiwgSVNFUl9SWF9MT0dJTl9TSVpFLAotCQkJCURNQV9GUk9NX0RFVklDRSk7CisJaWJfY29ubi0+bG9naW5fcmVxX2J1ZiAgPSBpYl9jb25uLT5sb2dpbl9idWY7CisJaWJfY29ubi0+bG9naW5fcmVzcF9idWYgPSBpYl9jb25uLT5sb2dpbl9idWYgKyBJU0NTSV9ERUZfTUFYX1JFQ1ZfU0VHX0xFTjsKKworCWliX2Nvbm4tPmxvZ2luX3JlcV9kbWEgPSBpYl9kbWFfbWFwX3NpbmdsZShpYl9jb25uLT5kZXZpY2UtPmliX2RldmljZSwKKwkJCQkodm9pZCAqKWliX2Nvbm4tPmxvZ2luX3JlcV9idWYsCisJCQkJSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4sIERNQV9UT19ERVZJQ0UpOworCisJaWJfY29ubi0+bG9naW5fcmVzcF9kbWEgPSBpYl9kbWFfbWFwX3NpbmdsZShpYl9jb25uLT5kZXZpY2UtPmliX2RldmljZSwKKwkJCQkodm9pZCAqKWliX2Nvbm4tPmxvZ2luX3Jlc3BfYnVmLAorCQkJCUlTRVJfUlhfTE9HSU5fU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCXJlcV9lcnIgID0gaWJfZG1hX21hcHBpbmdfZXJyb3IoZGV2aWNlLT5pYl9kZXZpY2UsIGliX2Nvbm4tPmxvZ2luX3JlcV9kbWEpOworCXJlc3BfZXJyID0gaWJfZG1hX21hcHBpbmdfZXJyb3IoZGV2aWNlLT5pYl9kZXZpY2UsIGliX2Nvbm4tPmxvZ2luX3Jlc3BfZG1hKTsKKworCWlmIChyZXFfZXJyIHx8IHJlc3BfZXJyKSB7CisJCWlmIChyZXFfZXJyKQorCQkJaWJfY29ubi0+bG9naW5fcmVxX2RtYSA9IDA7CisJCWlmIChyZXNwX2VycikKKwkJCWliX2Nvbm4tPmxvZ2luX3Jlc3BfZG1hID0gMDsKKwkJZ290byBvdXRfZXJyOworCX0KIAogCWliX2Nvbm4tPnBhZ2VfdmVjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlzZXJfcGFnZV92ZWMpICsKIAkJCQkgICAgKHNpemVvZih1NjQpICogKElTQ1NJX0lTRVJfU0dfVEFCTEVTSVpFICsxKSksCkBAIC02NTgsMTEgKzY3NywxMSBAQAogCXN0cnVjdCBpYl9zZ2UJICBzZ2U7CiAJaW50IGliX3JldDsKIAotCXNnZS5hZGRyICAgPSBpYl9jb25uLT5sb2dpbl9kbWE7CisJc2dlLmFkZHIgICA9IGliX2Nvbm4tPmxvZ2luX3Jlc3BfZG1hOwogCXNnZS5sZW5ndGggPSBJU0VSX1JYX0xPR0lOX1NJWkU7CiAJc2dlLmxrZXkgICA9IGliX2Nvbm4tPmRldmljZS0+bXItPmxrZXk7CiAKLQlyeF93ci53cl9pZCAgID0gKHVuc2lnbmVkIGxvbmcpaWJfY29ubi0+bG9naW5fYnVmOworCXJ4X3dyLndyX2lkICAgPSAodW5zaWduZWQgbG9uZylpYl9jb25uLT5sb2dpbl9yZXNwX2J1ZjsKIAlyeF93ci5zZ19saXN0ID0gJnNnZTsKIAlyeF93ci5udW1fc2dlID0gMTsKIAlyeF93ci5uZXh0ICAgID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvS2NvbmZpZwppbmRleCAyM2U4MmU0Ni4uMDAxYjE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIAogbWVudSAiSW5wdXQgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhUzM5MAorCWRlcGVuZHMgb24gIVMzOTAgJiYgIVVNTAogCiBjb25maWcgSU5QVVQKIAl0cmlzdGF0ZSAiR2VuZXJpYyBpbnB1dCBsYXllciAobmVlZGVkIGZvciBrZXlib2FyZCwgbW91c2UsIC4uLikiIGlmIEVYUEVSVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMgYi9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwppbmRleCAzMzY3Zjc2Li40ODBlYjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYworKysgYi9kcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwpAQCAtMzA5LDkgKzMwOSwxMCBAQAogICogT25jZSBmZiBkZXZpY2UgaXMgY3JlYXRlZCB5b3UgbmVlZCB0byBzZXR1cCBpdHMgdXBsb2FkLCBlcmFzZSwKICAqIHBsYXliYWNrIGFuZCBvdGhlciBoYW5kbGVycyBiZWZvcmUgcmVnaXN0ZXJpbmcgaW5wdXQgZGV2aWNlCiAgKi8KLWludCBpbnB1dF9mZl9jcmVhdGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgbWF4X2VmZmVjdHMpCitpbnQgaW5wdXRfZmZfY3JlYXRlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IG1heF9lZmZlY3RzKQogewogCXN0cnVjdCBmZl9kZXZpY2UgKmZmOworCXNpemVfdCBmZl9kZXZfc2l6ZTsKIAlpbnQgaTsKIAogCWlmICghbWF4X2VmZmVjdHMpIHsKQEAgLTMxOSw4ICszMjAsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmZfZGV2aWNlKSArCi0JCSAgICAgbWF4X2VmZmVjdHMgKiBzaXplb2Yoc3RydWN0IGZpbGUgKiksIEdGUF9LRVJORUwpOworCWZmX2Rldl9zaXplID0gc2l6ZW9mKHN0cnVjdCBmZl9kZXZpY2UpICsKKwkJCQltYXhfZWZmZWN0cyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKKwlpZiAoZmZfZGV2X3NpemUgPCBtYXhfZWZmZWN0cykgLyogb3ZlcmZsb3cgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmZiA9IGt6YWxsb2MoZmZfZGV2X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghZmYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuYwppbmRleCAxYWNjYjg5Li5lNDZhODY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMKQEAgLTgsNiArOCw3IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImlucHV0LWNvbXBhdC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LW10LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LW10LmMKaW5kZXggYzQ4YzgxZi4uZjY1ODA4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC1tdC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNkZWZpbmUgVFJLSURfU0dOCSgoVFJLSURfTUFYICsgMSkgPj4gMSkKQEAgLTExNyw2ICsxMTgsNyBAQAogCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBCVE5fVE9PTF9ET1VCTEVUQVAsIGNvdW50ID09IDIpOwogCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBCVE5fVE9PTF9UUklQTEVUQVAsIGNvdW50ID09IDMpOwogCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBCVE5fVE9PTF9RVUFEVEFQLCBjb3VudCA9PSA0KTsKKwlpbnB1dF9ldmVudChkZXYsIEVWX0tFWSwgQlROX1RPT0xfUVVJTlRUQVAsIGNvdW50ID09IDUpOwogfQogRVhQT1JUX1NZTUJPTChpbnB1dF9tdF9yZXBvcnRfZmluZ2VyX2NvdW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYwppbmRleCBiMWFhYmRlLi43ZGZlMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KIAogTU9EVUxFX0FVVEhPUigiRG1pdHJ5IFRvcm9raG92IDxkdG9yQG1haWwucnU+Iik7CkBAIC00OSw4ICs1MCwxMCBAQAogCQlkZXYtPm9wZW4oZGV2KTsKIAogCS8qIE9ubHkgc3RhcnQgcG9sbGluZyBpZiBwb2xsaW5nIGlzIGVuYWJsZWQgKi8KLQlpZiAoZGV2LT5wb2xsX2ludGVydmFsID4gMCkKLQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9mcmVlemFibGVfd3EsICZkZXYtPndvcmssIDApOworCWlmIChkZXYtPnBvbGxfaW50ZXJ2YWwgPiAwKSB7CisJCWRldi0+cG9sbChkZXYpOworCQlpbnB1dF9wb2xsZGV2X3F1ZXVlX3dvcmsoZGV2KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYXM1MDExLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FzNTAxMS5jCmluZGV4IGY2NzMyYjUuLjZkNmU3NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYXM1MDExLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hczUwMTEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvYXM1MDExLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSSVZFUl9ERVNDICJEcml2ZXIgZm9yIEF1c3RyaWEgTWljcm9zeXN0ZW1zIEFTNTAxMSBqb3lzdGljayIKICNkZWZpbmUgTU9EVUxFX0RFVklDRV9BTElBUyAiYXM1MDExIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCmluZGV4IGI0ZGVlOWQuLjYxNWMyMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKQEAgLTMzLDEwICszMywxMCBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkcDU1ODgta2V5cy4KIAogY29uZmlnIEtFWUJPQVJEX0FEUDU1ODkKLQl0cmlzdGF0ZSAiQURQNTU4OSBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIiCisJdHJpc3RhdGUgIkFEUDU1ODUvQURQNTU4OSBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIEFEUDU1ODkgYXR0YWNoZWQgdG8geW91cgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBBRFA1NTg1L0FEUDU1ODkgYXR0YWNoZWQgdG8geW91cgogCSAgc3lzdGVtIEkyQyBidXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OC1rZXlzLmMKaW5kZXggZTM0ZWViOC4uNGE3ZjUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODgta2V5cy5jCkBAIC01NTAsNyArNTUwLDcgQEAKIAl9CiAKIAllcnJvciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBhZHA1NTg4X2lycSwKLQkJCSAgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfRElTQUJMRUQsCisJCQkgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkgICAgY2xpZW50LT5kZXYuZHJpdmVyLT5uYW1lLCBrcGFkKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIGNsaWVudC0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OS1rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkcDU1ODkta2V5cy5jCmluZGV4IGM3NzA4MjYuLjAyYjVkNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRwNTU4OS1rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg5LWtleXMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEZXNjcmlwdGlvbjogIGtleXBhZCBkcml2ZXIgZm9yIEFEUDU1ODkKKyAqIERlc2NyaXB0aW9uOiAga2V5cGFkIGRyaXZlciBmb3IgQURQNTU4OSwgQURQNTU4NQogICoJCSBJMkMgUVdFUlRZIEtleXBhZCBhbmQgSU8gRXhwYW5kZXIKICAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoKQEAgLTIyLDM1ICsyMiwxNjUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2FkcDU1ODkuaD4KIAorLyogQURQNTU4OS9BRFA1NTg1IENvbW1vbiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURQNTU4OV81X0lECQkJMHgwMAorI2RlZmluZSBBRFA1NTg5XzVfSU5UX1NUQVRVUwkJMHgwMQorI2RlZmluZSBBRFA1NTg5XzVfU1RBVFVTCQkweDAyCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzEJCTB4MDMKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fMgkJMHgwNAorI2RlZmluZSBBRFA1NTg5XzVfRklGT18zCQkweDA1CisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzQJCTB4MDYKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fNQkJMHgwNworI2RlZmluZSBBRFA1NTg5XzVfRklGT182CQkweDA4CisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzcJCTB4MDkKKyNkZWZpbmUgQURQNTU4OV81X0ZJRk9fOAkJMHgwQQorI2RlZmluZSBBRFA1NTg5XzVfRklGT185CQkweDBCCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzEwCQkweDBDCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzExCQkweDBECisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzEyCQkweDBFCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzEzCQkweDBGCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzE0CQkweDEwCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzE1CQkweDExCisjZGVmaW5lIEFEUDU1ODlfNV9GSUZPXzE2CQkweDEyCisjZGVmaW5lIEFEUDU1ODlfNV9HUElfSU5UX1NUQVRfQQkweDEzCisjZGVmaW5lIEFEUDU1ODlfNV9HUElfSU5UX1NUQVRfQgkweDE0CisKKy8qIEFEUDU1ODkgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9TVEFUX0MJCTB4MTUKKyNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0EJCTB4MTYKKyNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0IJCTB4MTcKKyNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0MJCTB4MTgKKyNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfQQkJMHgxOQorI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19CCQkweDFBCisjZGVmaW5lIEFEUDU1ODlfUlBVTExfQ09ORklHX0MJCTB4MUIKKyNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfRAkJMHgxQworI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19FCQkweDFECisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9BCQkweDFFCisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9CCQkweDFGCisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9DCQkweDIwCisjZGVmaW5lIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0EJCTB4MjEKKyNkZWZpbmUgQURQNTU4OV9HUElfRVZFTlRfRU5fQgkJMHgyMgorI2RlZmluZSBBRFA1NTg5X0dQSV9FVkVOVF9FTl9DCQkweDIzCisjZGVmaW5lIEFEUDU1ODlfR1BJX0lOVEVSUlVQVF9FTl9BCTB4MjQKKyNkZWZpbmUgQURQNTU4OV9HUElfSU5URVJSVVBUX0VOX0IJMHgyNQorI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQwkweDI2CisjZGVmaW5lIEFEUDU1ODlfREVCT1VOQ0VfRElTX0EJCTB4MjcKKyNkZWZpbmUgQURQNTU4OV9ERUJPVU5DRV9ESVNfQgkJMHgyOAorI2RlZmluZSBBRFA1NTg5X0RFQk9VTkNFX0RJU19DCQkweDI5CisjZGVmaW5lIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EJCTB4MkEKKyNkZWZpbmUgQURQNTU4OV9HUE9fREFUQV9PVVRfQgkJMHgyQgorI2RlZmluZSBBRFA1NTg5X0dQT19EQVRBX09VVF9DCQkweDJDCisjZGVmaW5lIEFEUDU1ODlfR1BPX09VVF9NT0RFX0EJCTB4MkQKKyNkZWZpbmUgQURQNTU4OV9HUE9fT1VUX01PREVfQgkJMHgyRQorI2RlZmluZSBBRFA1NTg5X0dQT19PVVRfTU9ERV9DCQkweDJGCisjZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQQkweDMwCisjZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQgkweDMxCisjZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQwkweDMyCisjZGVmaW5lIEFEUDU1ODlfVU5MT0NLMQkJCTB4MzMKKyNkZWZpbmUgQURQNTU4OV9VTkxPQ0syCQkJMHgzNAorI2RlZmluZSBBRFA1NTg5X0VYVF9MT0NLX0VWRU5UCQkweDM1CisjZGVmaW5lIEFEUDU1ODlfVU5MT0NLX1RJTUVSUwkJMHgzNgorI2RlZmluZSBBRFA1NTg5X0xPQ0tfQ0ZHCQkweDM3CisjZGVmaW5lIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0EJCTB4MzgKKyNkZWZpbmUgQURQNTU4OV9SRVNFVDFfRVZFTlRfQgkJMHgzOQorI2RlZmluZSBBRFA1NTg5X1JFU0VUMV9FVkVOVF9DCQkweDNBCisjZGVmaW5lIEFEUDU1ODlfUkVTRVQyX0VWRU5UX0EJCTB4M0IKKyNkZWZpbmUgQURQNTU4OV9SRVNFVDJfRVZFTlRfQgkJMHgzQworI2RlZmluZSBBRFA1NTg5X1JFU0VUX0NGRwkJMHgzRAorI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0xPVwkJMHgzRQorI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0hJR0gJCTB4M0YKKyNkZWZpbmUgQURQNTU4OV9QV01fT05UX0xPVwkJMHg0MAorI2RlZmluZSBBRFA1NTg5X1BXTV9PTlRfSElHSAkJMHg0MQorI2RlZmluZSBBRFA1NTg5X1BXTV9DRkcJCQkweDQyCisjZGVmaW5lIEFEUDU1ODlfQ0xPQ0tfRElWX0NGRwkJMHg0MworI2RlZmluZSBBRFA1NTg5X0xPR0lDXzFfQ0ZHCQkweDQ0CisjZGVmaW5lIEFEUDU1ODlfTE9HSUNfMl9DRkcJCTB4NDUKKyNkZWZpbmUgQURQNTU4OV9MT0dJQ19GRl9DRkcJCTB4NDYKKyNkZWZpbmUgQURQNTU4OV9MT0dJQ19JTlRfRVZFTlRfRU4JMHg0NworI2RlZmluZSBBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHCQkweDQ4CisjZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19BCQkweDQ5CisjZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19CCQkweDRBCisjZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19DCQkweDRCCisjZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19ECQkweDRDCisjZGVmaW5lIEFEUDU1ODlfR0VORVJBTF9DRkcJCTB4NEQKKyNkZWZpbmUgQURQNTU4OV9JTlRfRU4JCQkweDRFCisKKy8qIEFEUDU1ODUgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFEUDU1ODVfR1BJX1NUQVRVU19BCQkweDE1CisjZGVmaW5lIEFEUDU1ODVfR1BJX1NUQVRVU19CCQkweDE2CisjZGVmaW5lIEFEUDU1ODVfUlBVTExfQ09ORklHX0EJCTB4MTcKKyNkZWZpbmUgQURQNTU4NV9SUFVMTF9DT05GSUdfQgkJMHgxOAorI2RlZmluZSBBRFA1NTg1X1JQVUxMX0NPTkZJR19DCQkweDE5CisjZGVmaW5lIEFEUDU1ODVfUlBVTExfQ09ORklHX0QJCTB4MUEKKyNkZWZpbmUgQURQNTU4NV9HUElfSU5UX0xFVkVMX0EJCTB4MUIKKyNkZWZpbmUgQURQNTU4NV9HUElfSU5UX0xFVkVMX0IJCTB4MUMKKyNkZWZpbmUgQURQNTU4NV9HUElfRVZFTlRfRU5fQQkJMHgxRAorI2RlZmluZSBBRFA1NTg1X0dQSV9FVkVOVF9FTl9CCQkweDFFCisjZGVmaW5lIEFEUDU1ODVfR1BJX0lOVEVSUlVQVF9FTl9BCTB4MUYKKyNkZWZpbmUgQURQNTU4NV9HUElfSU5URVJSVVBUX0VOX0IJMHgyMAorI2RlZmluZSBBRFA1NTg1X0RFQk9VTkNFX0RJU19BCQkweDIxCisjZGVmaW5lIEFEUDU1ODVfREVCT1VOQ0VfRElTX0IJCTB4MjIKKyNkZWZpbmUgQURQNTU4NV9HUE9fREFUQV9PVVRfQQkJMHgyMworI2RlZmluZSBBRFA1NTg1X0dQT19EQVRBX09VVF9CCQkweDI0CisjZGVmaW5lIEFEUDU1ODVfR1BPX09VVF9NT0RFX0EJCTB4MjUKKyNkZWZpbmUgQURQNTU4NV9HUE9fT1VUX01PREVfQgkJMHgyNgorI2RlZmluZSBBRFA1NTg1X0dQSU9fRElSRUNUSU9OX0EJMHgyNworI2RlZmluZSBBRFA1NTg1X0dQSU9fRElSRUNUSU9OX0IJMHgyOAorI2RlZmluZSBBRFA1NTg1X1JFU0VUMV9FVkVOVF9BCQkweDI5CisjZGVmaW5lIEFEUDU1ODVfUkVTRVQxX0VWRU5UX0IJCTB4MkEKKyNkZWZpbmUgQURQNTU4NV9SRVNFVDFfRVZFTlRfQwkJMHgyQgorI2RlZmluZSBBRFA1NTg1X1JFU0VUMl9FVkVOVF9BCQkweDJDCisjZGVmaW5lIEFEUDU1ODVfUkVTRVQyX0VWRU5UX0IJCTB4MkQKKyNkZWZpbmUgQURQNTU4NV9SRVNFVF9DRkcJCTB4MkUKKyNkZWZpbmUgQURQNTU4NV9QV01fT0ZGVF9MT1cJCTB4MkYKKyNkZWZpbmUgQURQNTU4NV9QV01fT0ZGVF9ISUdICQkweDMwCisjZGVmaW5lIEFEUDU1ODVfUFdNX09OVF9MT1cJCTB4MzEKKyNkZWZpbmUgQURQNTU4NV9QV01fT05UX0hJR0gJCTB4MzIKKyNkZWZpbmUgQURQNTU4NV9QV01fQ0ZHCQkJMHgzMworI2RlZmluZSBBRFA1NTg1X0xPR0lDX0NGRwkJMHgzNAorI2RlZmluZSBBRFA1NTg1X0xPR0lDX0ZGX0NGRwkJMHgzNQorI2RlZmluZSBBRFA1NTg1X0xPR0lDX0lOVF9FVkVOVF9FTgkweDM2CisjZGVmaW5lIEFEUDU1ODVfUE9MTF9QVElNRV9DRkcJCTB4MzcKKyNkZWZpbmUgQURQNTU4NV9QSU5fQ09ORklHX0EJCTB4MzgKKyNkZWZpbmUgQURQNTU4NV9QSU5fQ09ORklHX0IJCTB4MzkKKyNkZWZpbmUgQURQNTU4NV9QSU5fQ09ORklHX0QJCTB4M0EKKyNkZWZpbmUgQURQNTU4NV9HRU5FUkFMX0NGRwkJMHgzQgorI2RlZmluZSBBRFA1NTg1X0lOVF9FTgkJCTB4M0MKKworLyogSUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURQNTU4OV81X0RFVklDRV9JRF9NQVNLCTB4RgorI2RlZmluZSBBRFA1NTg5XzVfTUFOX0lEX01BU0sJCTB4RgorI2RlZmluZSBBRFA1NTg5XzVfTUFOX0lEX1NISUZUCQk0CisjZGVmaW5lIEFEUDU1ODlfNV9NQU5fSUQJCTB4MDIKKwogLyogR0VORVJBTF9DRkcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgT1NDX0VOCQkoMSA8PCA3KQogI2RlZmluZSBDT1JFX0NMSyh4KQkoKCh4KSAmIDB4MykgPDwgNSkKLSNkZWZpbmUgTENLX1RSS19MT0dJQwkoMSA8PCA0KQotI2RlZmluZSBMQ0tfVFJLX0dQSQkoMSA8PCAzKQorI2RlZmluZSBMQ0tfVFJLX0xPR0lDCSgxIDw8IDQpCS8qIEFEUDU1ODkgb25seSAqLworI2RlZmluZSBMQ0tfVFJLX0dQSQkoMSA8PCAzKQkvKiBBRFA1NTg5IG9ubHkgKi8KICNkZWZpbmUgSU5UX0NGRwkJKDEgPDwgMSkKICNkZWZpbmUgUlNUX0NGRwkJKDEgPDwgMCkKIAogLyogSU5UX0VOIFJlZ2lzdGVyICovCi0jZGVmaW5lIExPR0lDMl9JRU4JKDEgPDwgNSkKKyNkZWZpbmUgTE9HSUMyX0lFTgkoMSA8PCA1KQkvKiBBRFA1NTg5IG9ubHkgKi8KICNkZWZpbmUgTE9HSUMxX0lFTgkoMSA8PCA0KQotI2RlZmluZSBMT0NLX0lFTgkoMSA8PCAzKQorI2RlZmluZSBMT0NLX0lFTgkoMSA8PCAzKQkvKiBBRFA1NTg5IG9ubHkgKi8KICNkZWZpbmUgT1ZSRkxPV19JRU4JKDEgPDwgMikKICNkZWZpbmUgR1BJX0lFTgkJKDEgPDwgMSkKICNkZWZpbmUgRVZFTlRfSUVOCSgxIDw8IDApCiAKIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE9HSUMyX0lOVAkoMSA8PCA1KQorI2RlZmluZSBMT0dJQzJfSU5UCSgxIDw8IDUpCS8qIEFEUDU1ODkgb25seSAqLwogI2RlZmluZSBMT0dJQzFfSU5UCSgxIDw8IDQpCi0jZGVmaW5lIExPQ0tfSU5UCSgxIDw8IDMpCisjZGVmaW5lIExPQ0tfSU5UCSgxIDw8IDMpCS8qIEFEUDU1ODkgb25seSAqLwogI2RlZmluZSBPVlJGTE9XX0lOVAkoMSA8PCAyKQogI2RlZmluZSBHUElfSU5UCQkoMSA8PCAxKQogI2RlZmluZSBFVkVOVF9JTlQJKDEgPDwgMCkKIAogLyogU1RBVFVTIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgTE9HSUMyX1NUQVQJKDEgPDwgNykKKyNkZWZpbmUgTE9HSUMyX1NUQVQJKDEgPDwgNykJLyogQURQNTU4OSBvbmx5ICovCiAjZGVmaW5lIExPR0lDMV9TVEFUCSgxIDw8IDYpCi0jZGVmaW5lIExPQ0tfU1RBVAkoMSA8PCA1KQorI2RlZmluZSBMT0NLX1NUQVQJKDEgPDwgNSkJLyogQURQNTU4OSBvbmx5ICovCiAjZGVmaW5lIEtFQwkJMHhGCiAKIC8qIFBJTl9DT05GSUdfRCBSZWdpc3RlciAqLwpAQCAtNjEsMjcgKzE5MSw1NCBAQAogI2RlZmluZSBMT0NLX0VOCQkoMSA8PCAwKQogCiAjZGVmaW5lIFBUSU1FX01BU0sJMHgzCi0jZGVmaW5lIExUSU1FX01BU0sJMHgzCisjZGVmaW5lIExUSU1FX01BU0sJMHgzCQkvKiBBRFA1NTg5IG9ubHkgKi8KIAogLyogS2V5IEV2ZW50IFJlZ2lzdGVyIHh5ICovCiAjZGVmaW5lIEtFWV9FVl9QUkVTU0VECQkoMSA8PCA3KQogI2RlZmluZSBLRVlfRVZfTUFTSwkJKDB4N0YpCiAKICNkZWZpbmUgS0VZUF9NQVhfRVZFTlQJCTE2CisjZGVmaW5lIEFEUDU1ODlfTUFYR1BJTwkJMTkKKyNkZWZpbmUgQURQNTU4NV9NQVhHUElPCQkxMSAvKiAxMCBvbiB0aGUgQURQNTU4NS0wMSwgMTEgb24gQURQNTU4NS0wMiAqLwogCi0jZGVmaW5lIE1BWEdQSU8JCQkxOQotI2RlZmluZSBBRFBfQkFOSyhvZmZzKQkJKChvZmZzKSA+PiAzKQotI2RlZmluZSBBRFBfQklUKG9mZnMpCQkoMXUgPDwgKChvZmZzKSAmIDB4NykpCitlbnVtIHsKKwlBRFA1NTg5LAorCUFEUDU1ODVfMDEsCisJQURQNTU4NV8wMgorfTsKKworc3RydWN0IGFkcF9jb25zdGFudHMgeworCXU4IG1heGdwaW87CisJdTgga2V5bWFwc2l6ZTsKKwl1OCBncGlfcGluX3Jvd19iYXNlOworCXU4IGdwaV9waW5fcm93X2VuZDsKKwl1OCBncGlfcGluX2NvbF9iYXNlOworCXU4IGdwaV9waW5fYmFzZTsKKwl1OCBncGlfcGluX2VuZDsKKwl1OCBncGltYXBzaXplX21heDsKKwl1OCBtYXhfcm93X251bTsKKwl1OCBtYXhfY29sX251bTsKKwl1OCByb3dfbWFzazsKKwl1OCBjb2xfbWFzazsKKwl1OCBjb2xfc2hpZnQ7CisJdTggYzRfZXh0ZW5kX2NmZzsKKwl1OCAoKmJhbmspICh1OCBvZmZzZXQpOworCXU4ICgqYml0KSAodTggb2Zmc2V0KTsKKwl1OCAoKnJlZykgKHU4IHJlZyk7Cit9OwogCiBzdHJ1Y3QgYWRwNTU4OV9rcGFkIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCWNvbnN0IHN0cnVjdCBhZHBfY29uc3RhbnRzICp2YXI7CiAJdW5zaWduZWQgc2hvcnQga2V5Y29kZVtBRFA1NTg5X0tFWU1BUFNJWkVdOwogCWNvbnN0IHN0cnVjdCBhZHA1NTg5X2dwaV9tYXAgKmdwaW1hcDsKIAl1bnNpZ25lZCBzaG9ydCBncGltYXBzaXplOwogCXVuc2lnbmVkIGV4dGVuZF9jZmc7CisJYm9vbCBpc19hZHA1NTg1OworCWJvb2wgYWRwNTU4NV9zdXBwb3J0X3JvdzU7CiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKLQl1bnNpZ25lZCBjaGFyIGdwaW9tYXBbTUFYR1BJT107CisJdW5zaWduZWQgY2hhciBncGlvbWFwW0FEUDU1ODlfTUFYR1BJT107CiAJYm9vbCBleHBvcnRfZ3BpbzsKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOwogCXN0cnVjdCBtdXRleCBncGlvX2xvY2s7CS8qIFByb3RlY3QgY2FjaGVkIGRpciwgZGF0X291dCAqLwpAQCAtOTAsNiArMjQ3LDEyOSBAQAogI2VuZGlmCiB9OwogCisvKgorICogIEFEUDU1ODkgLyBBRFA1NTg1IGRlcml2YXRpdmUgLyB2YXJpYW50IGhhbmRsaW5nCisgKi8KKworCisvKiBBRFA1NTg5ICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFkcDU1ODlfYmFuayh1bnNpZ25lZCBjaGFyIG9mZnNldCkKK3sKKwlyZXR1cm4gb2Zmc2V0ID4+IDM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFkcDU1ODlfYml0KHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQoreworCXJldHVybiAxdSA8PCAob2Zmc2V0ICYgMHg3KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4OV9yZWcodW5zaWduZWQgY2hhciByZWcpCit7CisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZHBfY29uc3RhbnRzIGNvbnN0X2FkcDU1ODkgPSB7CisJLm1heGdwaW8JCT0gQURQNTU4OV9NQVhHUElPLAorCS5rZXltYXBzaXplCQk9IEFEUDU1ODlfS0VZTUFQU0laRSwKKwkuZ3BpX3Bpbl9yb3dfYmFzZQk9IEFEUDU1ODlfR1BJX1BJTl9ST1dfQkFTRSwKKwkuZ3BpX3Bpbl9yb3dfZW5kCT0gQURQNTU4OV9HUElfUElOX1JPV19FTkQsCisJLmdwaV9waW5fY29sX2Jhc2UJPSBBRFA1NTg5X0dQSV9QSU5fQ09MX0JBU0UsCisJLmdwaV9waW5fYmFzZQkJPSBBRFA1NTg5X0dQSV9QSU5fQkFTRSwKKwkuZ3BpX3Bpbl9lbmQJCT0gQURQNTU4OV9HUElfUElOX0VORCwKKwkuZ3BpbWFwc2l6ZV9tYXgJCT0gQURQNTU4OV9HUElNQVBTSVpFX01BWCwKKwkuYzRfZXh0ZW5kX2NmZwkJPSAxMiwKKwkubWF4X3Jvd19udW0JCT0gQURQNTU4OV9NQVhfUk9XX05VTSwKKwkubWF4X2NvbF9udW0JCT0gQURQNTU4OV9NQVhfQ09MX05VTSwKKwkucm93X21hc2sJCT0gQURQNTU4OV9ST1dfTUFTSywKKwkuY29sX21hc2sJCT0gQURQNTU4OV9DT0xfTUFTSywKKwkuY29sX3NoaWZ0CQk9IEFEUDU1ODlfQ09MX1NISUZULAorCS5iYW5rCQkJPSBhZHA1NTg5X2JhbmssCisJLmJpdAkJCT0gYWRwNTU4OV9iaXQsCisJLnJlZwkJCT0gYWRwNTU4OV9yZWcsCit9OworCisvKiBBRFA1NTg1ICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFkcDU1ODVfYmFuayh1bnNpZ25lZCBjaGFyIG9mZnNldCkKK3sKKwlyZXR1cm4gb2Zmc2V0ID4gQURQNTU4NV9NQVhfUk9XX05VTTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRwNTU4NV9iaXQodW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisJcmV0dXJuIChvZmZzZXQgPiBBRFA1NTg1X01BWF9ST1dfTlVNKSA/CisJCTF1IDw8IChvZmZzZXQgLSBBRFA1NTg1X0NPTF9TSElGVCkgOiAxdSA8PCBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFkcDU1ODVfcmVnX2x1dFtdID0geworCVtBRFA1NTg5X0dQSV9TVEFUVVNfQV0JCT0gQURQNTU4NV9HUElfU1RBVFVTX0EsCisJW0FEUDU1ODlfR1BJX1NUQVRVU19CXQkJPSBBRFA1NTg1X0dQSV9TVEFUVVNfQiwKKwlbQURQNTU4OV9SUFVMTF9DT05GSUdfQV0JPSBBRFA1NTg1X1JQVUxMX0NPTkZJR19BLAorCVtBRFA1NTg5X1JQVUxMX0NPTkZJR19CXQk9IEFEUDU1ODVfUlBVTExfQ09ORklHX0IsCisJW0FEUDU1ODlfUlBVTExfQ09ORklHX0NdCT0gQURQNTU4NV9SUFVMTF9DT05GSUdfQywKKwlbQURQNTU4OV9SUFVMTF9DT05GSUdfRF0JPSBBRFA1NTg1X1JQVUxMX0NPTkZJR19ELAorCVtBRFA1NTg5X0dQSV9JTlRfTEVWRUxfQV0JPSBBRFA1NTg1X0dQSV9JTlRfTEVWRUxfQSwKKwlbQURQNTU4OV9HUElfSU5UX0xFVkVMX0JdCT0gQURQNTU4NV9HUElfSU5UX0xFVkVMX0IsCisJW0FEUDU1ODlfR1BJX0VWRU5UX0VOX0FdCT0gQURQNTU4NV9HUElfRVZFTlRfRU5fQSwKKwlbQURQNTU4OV9HUElfRVZFTlRfRU5fQl0JPSBBRFA1NTg1X0dQSV9FVkVOVF9FTl9CLAorCVtBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQV0JPSBBRFA1NTg1X0dQSV9JTlRFUlJVUFRfRU5fQSwKKwlbQURQNTU4OV9HUElfSU5URVJSVVBUX0VOX0JdCT0gQURQNTU4NV9HUElfSU5URVJSVVBUX0VOX0IsCisJW0FEUDU1ODlfREVCT1VOQ0VfRElTX0FdCT0gQURQNTU4NV9ERUJPVU5DRV9ESVNfQSwKKwlbQURQNTU4OV9ERUJPVU5DRV9ESVNfQl0JPSBBRFA1NTg1X0RFQk9VTkNFX0RJU19CLAorCVtBRFA1NTg5X0dQT19EQVRBX09VVF9BXQk9IEFEUDU1ODVfR1BPX0RBVEFfT1VUX0EsCisJW0FEUDU1ODlfR1BPX0RBVEFfT1VUX0JdCT0gQURQNTU4NV9HUE9fREFUQV9PVVRfQiwKKwlbQURQNTU4OV9HUE9fT1VUX01PREVfQV0JPSBBRFA1NTg1X0dQT19PVVRfTU9ERV9BLAorCVtBRFA1NTg5X0dQT19PVVRfTU9ERV9CXQk9IEFEUDU1ODVfR1BPX09VVF9NT0RFX0IsCisJW0FEUDU1ODlfR1BJT19ESVJFQ1RJT05fQV0JPSBBRFA1NTg1X0dQSU9fRElSRUNUSU9OX0EsCisJW0FEUDU1ODlfR1BJT19ESVJFQ1RJT05fQl0JPSBBRFA1NTg1X0dQSU9fRElSRUNUSU9OX0IsCisJW0FEUDU1ODlfUkVTRVQxX0VWRU5UX0FdCT0gQURQNTU4NV9SRVNFVDFfRVZFTlRfQSwKKwlbQURQNTU4OV9SRVNFVDFfRVZFTlRfQl0JPSBBRFA1NTg1X1JFU0VUMV9FVkVOVF9CLAorCVtBRFA1NTg5X1JFU0VUMV9FVkVOVF9DXQk9IEFEUDU1ODVfUkVTRVQxX0VWRU5UX0MsCisJW0FEUDU1ODlfUkVTRVQyX0VWRU5UX0FdCT0gQURQNTU4NV9SRVNFVDJfRVZFTlRfQSwKKwlbQURQNTU4OV9SRVNFVDJfRVZFTlRfQl0JPSBBRFA1NTg1X1JFU0VUMl9FVkVOVF9CLAorCVtBRFA1NTg5X1JFU0VUX0NGR10JCT0gQURQNTU4NV9SRVNFVF9DRkcsCisJW0FEUDU1ODlfUFdNX09GRlRfTE9XXQkJPSBBRFA1NTg1X1BXTV9PRkZUX0xPVywKKwlbQURQNTU4OV9QV01fT0ZGVF9ISUdIXQkJPSBBRFA1NTg1X1BXTV9PRkZUX0hJR0gsCisJW0FEUDU1ODlfUFdNX09OVF9MT1ddCQk9IEFEUDU1ODVfUFdNX09OVF9MT1csCisJW0FEUDU1ODlfUFdNX09OVF9ISUdIXQkJPSBBRFA1NTg1X1BXTV9PTlRfSElHSCwKKwlbQURQNTU4OV9QV01fQ0ZHXQkJPSBBRFA1NTg1X1BXTV9DRkcsCisJW0FEUDU1ODlfTE9HSUNfMV9DRkddCQk9IEFEUDU1ODVfTE9HSUNfQ0ZHLAorCVtBRFA1NTg5X0xPR0lDX0ZGX0NGR10JCT0gQURQNTU4NV9MT0dJQ19GRl9DRkcsCisJW0FEUDU1ODlfTE9HSUNfSU5UX0VWRU5UX0VOXQk9IEFEUDU1ODVfTE9HSUNfSU5UX0VWRU5UX0VOLAorCVtBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHXQk9IEFEUDU1ODVfUE9MTF9QVElNRV9DRkcsCisJW0FEUDU1ODlfUElOX0NPTkZJR19BXQkJPSBBRFA1NTg1X1BJTl9DT05GSUdfQSwKKwlbQURQNTU4OV9QSU5fQ09ORklHX0JdCQk9IEFEUDU1ODVfUElOX0NPTkZJR19CLAorCVtBRFA1NTg5X1BJTl9DT05GSUdfRF0JCT0gQURQNTU4NV9QSU5fQ09ORklHX0QsCisJW0FEUDU1ODlfR0VORVJBTF9DRkddCQk9IEFEUDU1ODVfR0VORVJBTF9DRkcsCisJW0FEUDU1ODlfSU5UX0VOXQkJPSBBRFA1NTg1X0lOVF9FTiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFkcDU1ODVfcmVnKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCXJldHVybiBhZHA1NTg1X3JlZ19sdXRbcmVnXTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZHBfY29uc3RhbnRzIGNvbnN0X2FkcDU1ODUgPSB7CisJLm1heGdwaW8JCT0gQURQNTU4NV9NQVhHUElPLAorCS5rZXltYXBzaXplCQk9IEFEUDU1ODVfS0VZTUFQU0laRSwKKwkuZ3BpX3Bpbl9yb3dfYmFzZQk9IEFEUDU1ODVfR1BJX1BJTl9ST1dfQkFTRSwKKwkuZ3BpX3Bpbl9yb3dfZW5kCT0gQURQNTU4NV9HUElfUElOX1JPV19FTkQsCisJLmdwaV9waW5fY29sX2Jhc2UJPSBBRFA1NTg1X0dQSV9QSU5fQ09MX0JBU0UsCisJLmdwaV9waW5fYmFzZQkJPSBBRFA1NTg1X0dQSV9QSU5fQkFTRSwKKwkuZ3BpX3Bpbl9lbmQJCT0gQURQNTU4NV9HUElfUElOX0VORCwKKwkuZ3BpbWFwc2l6ZV9tYXgJCT0gQURQNTU4NV9HUElNQVBTSVpFX01BWCwKKwkuYzRfZXh0ZW5kX2NmZwkJPSAxMCwKKwkubWF4X3Jvd19udW0JCT0gQURQNTU4NV9NQVhfUk9XX05VTSwKKwkubWF4X2NvbF9udW0JCT0gQURQNTU4NV9NQVhfQ09MX05VTSwKKwkucm93X21hc2sJCT0gQURQNTU4NV9ST1dfTUFTSywKKwkuY29sX21hc2sJCT0gQURQNTU4NV9DT0xfTUFTSywKKwkuY29sX3NoaWZ0CQk9IEFEUDU1ODVfQ09MX1NISUZULAorCS5iYW5rCQkJPSBhZHA1NTg1X2JhbmssCisJLmJpdAkJCT0gYWRwNTU4NV9iaXQsCisJLnJlZwkJCT0gYWRwNTU4NV9yZWcsCit9OworCiBzdGF0aWMgaW50IGFkcDU1ODlfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCiB7CiAJaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CkBAIC0xMDksMTkgKzM4OSwyMCBAQAogc3RhdGljIGludCBhZHA1NTg5X2dwaW9fZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZikKIHsKIAlzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBhZHA1NTg5X2twYWQsIGdjKTsKLQl1bnNpZ25lZCBpbnQgYmFuayA9IEFEUF9CQU5LKGtwYWQtPmdwaW9tYXBbb2ZmXSk7Ci0JdW5zaWduZWQgaW50IGJpdCA9IEFEUF9CSVQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYmFuayA9IGtwYWQtPnZhci0+YmFuayhrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiaXQgPSBrcGFkLT52YXItPmJpdChrcGFkLT5ncGlvbWFwW29mZl0pOwogCi0JcmV0dXJuICEhKGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BJX1NUQVRVU19BICsgYmFuaykgJgotCQkgIGJpdCk7CisJcmV0dXJuICEhKGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsCisJCQkgICAgICAga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HUElfU1RBVFVTX0EpICsgYmFuaykgJgorCQkJICAgICAgIGJpdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkcDU1ODlfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKIAkJCQkgICB1bnNpZ25lZCBvZmYsIGludCB2YWwpCiB7CiAJc3RydWN0IGFkcDU1ODlfa3BhZCAqa3BhZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTU4OV9rcGFkLCBnYyk7Ci0JdW5zaWduZWQgaW50IGJhbmsgPSBBRFBfQkFOSyhrcGFkLT5ncGlvbWFwW29mZl0pOwotCXVuc2lnbmVkIGludCBiaXQgPSBBRFBfQklUKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJhbmsgPSBrcGFkLT52YXItPmJhbmsoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0ga3BhZC0+dmFyLT5iaXQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKIAogCW11dGV4X2xvY2soJmtwYWQtPmdwaW9fbG9jayk7CiAKQEAgLTEzMCw4ICs0MTEsOCBAQAogCWVsc2UKIAkJa3BhZC0+ZGF0X291dFtiYW5rXSAmPSB+Yml0OwogCi0JYWRwNTU4OV93cml0ZShrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EgKyBiYW5rLAotCQkgICAgICBrcGFkLT5kYXRfb3V0W2JhbmtdKTsKKwlhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HUE9fREFUQV9PVVRfQSkgKworCQkgICAgICBiYW5rLCBrcGFkLT5kYXRfb3V0W2JhbmtdKTsKIAogCW11dGV4X3VubG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKIH0KQEAgLTEzOSwxNCArNDIwLDE1IEBACiBzdGF0aWMgaW50IGFkcDU1ODlfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2ZmKQogewogCXN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGFkcDU1ODlfa3BhZCwgZ2MpOwotCXVuc2lnbmVkIGludCBiYW5rID0gQURQX0JBTksoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKLQl1bnNpZ25lZCBpbnQgYml0ID0gQURQX0JJVChrcGFkLT5ncGlvbWFwW29mZl0pOworCXVuc2lnbmVkIGludCBiYW5rID0ga3BhZC0+dmFyLT5iYW5rKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJpdCA9IGtwYWQtPnZhci0+Yml0KGtwYWQtPmdwaW9tYXBbb2ZmXSk7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmtwYWQtPmdwaW9fbG9jayk7CiAKIAlrcGFkLT5kaXJbYmFua10gJj0gfmJpdDsKLQlyZXQgPSBhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElPX0RJUkVDVElPTl9BICsgYmFuaywKKwlyZXQgPSBhZHA1NTg5X3dyaXRlKGtwYWQtPmNsaWVudCwKKwkJCSAgICBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dQSU9fRElSRUNUSU9OX0EpICsgYmFuaywKIAkJCSAgICBrcGFkLT5kaXJbYmFua10pOwogCiAJbXV0ZXhfdW5sb2NrKCZrcGFkLT5ncGlvX2xvY2spOwpAQCAtMTU4LDggKzQ0MCw4IEBACiAJCQkJCSB1bnNpZ25lZCBvZmYsIGludCB2YWwpCiB7CiAJc3RydWN0IGFkcDU1ODlfa3BhZCAqa3BhZCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYWRwNTU4OV9rcGFkLCBnYyk7Ci0JdW5zaWduZWQgaW50IGJhbmsgPSBBRFBfQkFOSyhrcGFkLT5ncGlvbWFwW29mZl0pOwotCXVuc2lnbmVkIGludCBiaXQgPSBBRFBfQklUKGtwYWQtPmdwaW9tYXBbb2ZmXSk7CisJdW5zaWduZWQgaW50IGJhbmsgPSBrcGFkLT52YXItPmJhbmsoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKKwl1bnNpZ25lZCBpbnQgYml0ID0ga3BhZC0+dmFyLT5iaXQoa3BhZC0+Z3Bpb21hcFtvZmZdKTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygma3BhZC0+Z3Bpb19sb2NrKTsKQEAgLTE3MSw5ICs0NTMsMTAgQEAKIAllbHNlCiAJCWtwYWQtPmRhdF9vdXRbYmFua10gJj0gfmJpdDsKIAotCXJldCA9IGFkcDU1ODlfd3JpdGUoa3BhZC0+Y2xpZW50LCBBRFA1NTg5X0dQT19EQVRBX09VVF9BICsgYmFuaywKLQkJCSAgICBrcGFkLT5kYXRfb3V0W2JhbmtdKTsKLQlyZXQgfD0gYWRwNTU4OV93cml0ZShrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQSArIGJhbmssCisJcmV0ID0gYWRwNTU4OV93cml0ZShrcGFkLT5jbGllbnQsIGtwYWQtPnZhci0+cmVnKEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EpCisJCQkgICAgKyBiYW5rLCBrcGFkLT5kYXRfb3V0W2JhbmtdKTsKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShrcGFkLT5jbGllbnQsCisJCQkgICAgIGtwYWQtPnZhci0+cmVnKEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQSkgKyBiYW5rLAogCQkJICAgICBrcGFkLT5kaXJbYmFua10pOwogCiAJbXV0ZXhfdW5sb2NrKCZrcGFkLT5ncGlvX2xvY2spOwpAQCAtMTg0LDI2ICs0NjcsMjkgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1ODlfYnVpbGRfZ3Bpb21hcChzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkLAogCQkJCWNvbnN0IHN0cnVjdCBhZHA1NTg5X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7Ci0JYm9vbCBwaW5fdXNlZFtNQVhHUElPXTsKKwlib29sIHBpbl91c2VkW0FEUDU1ODlfTUFYR1BJT107CiAJaW50IG5fdW51c2VkID0gMDsKIAlpbnQgaTsKIAogCW1lbXNldChwaW5fdXNlZCwgZmFsc2UsIHNpemVvZihwaW5fdXNlZCkpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWEdQSU87IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwga3BhZC0+dmFyLT5tYXhncGlvOyBpKyspCiAJCWlmIChwZGF0YS0+a2V5cGFkX2VuX21hc2sgJiAoMSA8PCBpKSkKIAkJCXBpbl91c2VkW2ldID0gdHJ1ZTsKIAogCWZvciAoaSA9IDA7IGkgPCBrcGFkLT5ncGltYXBzaXplOyBpKyspCi0JCXBpbl91c2VkW2twYWQtPmdwaW1hcFtpXS5waW4gLSBBRFA1NTg5X0dQSV9QSU5fQkFTRV0gPSB0cnVlOworCQlwaW5fdXNlZFtrcGFkLT5ncGltYXBbaV0ucGluIC0ga3BhZC0+dmFyLT5ncGlfcGluX2Jhc2VdID0gdHJ1ZTsKIAogCWlmIChrcGFkLT5leHRlbmRfY2ZnICYgUjRfRVhURU5EX0NGRykKIAkJcGluX3VzZWRbNF0gPSB0cnVlOwogCiAJaWYgKGtwYWQtPmV4dGVuZF9jZmcgJiBDNF9FWFRFTkRfQ0ZHKQotCQlwaW5fdXNlZFsxMl0gPSB0cnVlOworCQlwaW5fdXNlZFtrcGFkLT52YXItPmM0X2V4dGVuZF9jZmddID0gdHJ1ZTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhHUElPOyBpKyspCisJaWYgKCFrcGFkLT5hZHA1NTg1X3N1cHBvcnRfcm93NSkKKwkJcGluX3VzZWRbNV0gPSB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IGtwYWQtPnZhci0+bWF4Z3BpbzsgaSsrKQogCQlpZiAoIXBpbl91c2VkW2ldKQogCQkJa3BhZC0+Z3Bpb21hcFtuX3VudXNlZCsrXSA9IGk7CiAKQEAgLTI0NiwxMSArNTMyLDExIEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDw9IEFEUF9CQU5LKE1BWEdQSU8pOyBpKyspIHsKLQkJa3BhZC0+ZGF0X291dFtpXSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsCi0JCQkJCQlBRFA1NTg5X0dQT19EQVRBX09VVF9BICsgaSk7Ci0JCWtwYWQtPmRpcltpXSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsCi0JCQkJCSAgICBBRFA1NTg5X0dQSU9fRElSRUNUSU9OX0EgKyBpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IGtwYWQtPnZhci0+YmFuayhrcGFkLT52YXItPm1heGdwaW8pOyBpKyspIHsKKwkJa3BhZC0+ZGF0X291dFtpXSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIGtwYWQtPnZhci0+cmVnKAorCQkJCQkJQURQNTU4OV9HUE9fREFUQV9PVVRfQSkgKyBpKTsKKwkJa3BhZC0+ZGlyW2ldID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwga3BhZC0+dmFyLT5yZWcoCisJCQkJCSAgICBBRFA1NTg5X0dQSU9fRElSRUNUSU9OX0EpICsgaSk7CiAJfQogCiAJaWYgKGdwaW9fZGF0YS0+c2V0dXApIHsKQEAgLTMxNywxMSArNjAzLDExIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZXZfY250OyBpKyspIHsKLQkJaW50IGtleSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIEFEUDU1ODlfRklGT18xICsgaSk7CisJCWludCBrZXkgPSBhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LCBBRFA1NTg5XzVfRklGT18xICsgaSk7CiAJCWludCBrZXlfdmFsID0ga2V5ICYgS0VZX0VWX01BU0s7CiAKLQkJaWYgKGtleV92YWwgPj0gQURQNTU4OV9HUElfUElOX0JBU0UgJiYKLQkJICAgIGtleV92YWwgPD0gQURQNTU4OV9HUElfUElOX0VORCkgeworCQlpZiAoa2V5X3ZhbCA+PSBrcGFkLT52YXItPmdwaV9waW5fYmFzZSAmJgorCQkgICAga2V5X3ZhbCA8PSBrcGFkLT52YXItPmdwaV9waW5fZW5kKSB7CiAJCQlhZHA1NTg5X3JlcG9ydF9zd2l0Y2hlcyhrcGFkLCBrZXksIGtleV92YWwpOwogCQl9IGVsc2UgewogCQkJaW5wdXRfcmVwb3J0X2tleShrcGFkLT5pbnB1dCwKQEAgLTMzNywyOSArNjIzLDMwIEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGtwYWQtPmNsaWVudDsKIAlpbnQgc3RhdHVzLCBldl9jbnQ7CiAKLQlzdGF0dXMgPSBhZHA1NTg5X3JlYWQoY2xpZW50LCBBRFA1NTg5X0lOVF9TVEFUVVMpOworCXN0YXR1cyA9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfNV9JTlRfU1RBVFVTKTsKIAogCWlmIChzdGF0dXMgJiBPVlJGTE9XX0lOVCkJLyogVW5saWtlbHkgYW5kIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFdmVudCBPdmVyZmxvdyBFcnJvclxuIik7CiAKIAlpZiAoc3RhdHVzICYgRVZFTlRfSU5UKSB7Ci0JCWV2X2NudCA9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfU1RBVFVTKSAmIEtFQzsKKwkJZXZfY250ID0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV81X1NUQVRVUykgJiBLRUM7CiAJCWlmIChldl9jbnQpIHsKIAkJCWFkcDU1ODlfcmVwb3J0X2V2ZW50cyhrcGFkLCBldl9jbnQpOwogCQkJaW5wdXRfc3luYyhrcGFkLT5pbnB1dCk7CiAJCX0KIAl9CiAKLQlhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9JTlRfU1RBVFVTLCBzdGF0dXMpOwkvKiBTdGF0dXMgaXMgVzFDICovCisJYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfNV9JTlRfU1RBVFVTLCBzdGF0dXMpOyAvKiBTdGF0dXMgaXMgVzFDICovCiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkcDU1ODlfZ2V0X2V2Y29kZShzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkLCB1bnNpZ25lZCBzaG9ydCBrZXkpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHA1NTg5X2dldF9ldmNvZGUoc3RydWN0IGFkcDU1ODlfa3BhZCAqa3BhZCwKKwkJCQkJdW5zaWduZWQgc2hvcnQga2V5KQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFEUDU1ODlfS0VZTUFQU0laRTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBrcGFkLT52YXItPmtleW1hcHNpemU7IGkrKykKIAkJaWYgKGtleSA9PSBrcGFkLT5rZXljb2RlW2ldKQogCQkJcmV0dXJuIChpICsgMSkgfCBLRVlfRVZfUFJFU1NFRDsKIApAQCAtMzcyLDE5ICs2NTksMjMgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0ga3BhZC0+Y2xpZW50OwogCWNvbnN0IHN0cnVjdCBhZHA1NTg5X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQotCSAgICBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCBpLCByZXQ7CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdTggKCpyZWcpICh1OCkgPSBrcGFkLT52YXItPnJlZzsKIAl1bnNpZ25lZCBjaGFyIGV2dF9tb2RlMSA9IDAsIGV2dF9tb2RlMiA9IDAsIGV2dF9tb2RlMyA9IDA7CiAJdW5zaWduZWQgY2hhciBwdWxsX21hc2sgPSAwOworCWludCBpLCByZXQ7CiAKLQlyZXQgPSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9QSU5fQ09ORklHX0EsCi0JCQkgICAgcGRhdGEtPmtleXBhZF9lbl9tYXNrICYgMHhGRik7Ci0JcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1BJTl9DT05GSUdfQiwKLQkJCSAgICAgKHBkYXRhLT5rZXlwYWRfZW5fbWFzayA+PiA4KSAmIDB4RkYpOwotCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9QSU5fQ09ORklHX0MsCi0JCQkgICAgIChwZGF0YS0+a2V5cGFkX2VuX21hc2sgPj4gMTYpICYgMHhGRik7CisJcmV0ID0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X1BJTl9DT05GSUdfQSksCisJCQkgICAgcGRhdGEtPmtleXBhZF9lbl9tYXNrICYga3BhZC0+dmFyLT5yb3dfbWFzayk7CisJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9QSU5fQ09ORklHX0IpLAorCQkJICAgICAocGRhdGEtPmtleXBhZF9lbl9tYXNrID4+IGtwYWQtPnZhci0+Y29sX3NoaWZ0KSAmCisJCQkgICAgIGtwYWQtPnZhci0+Y29sX21hc2spOwogCi0JaWYgKHBkYXRhLT5lbl9rZXlsb2NrKSB7CisJaWYgKCFrcGFkLT5pc19hZHA1NTg1KQorCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUElOX0NPTkZJR19DLAorCQkJCSAgICAgKHBkYXRhLT5rZXlwYWRfZW5fbWFzayA+PiAxNikgJiAweEZGKTsKKworCWlmICgha3BhZC0+aXNfYWRwNTU4NSAmJiBwZGF0YS0+ZW5fa2V5bG9jaykgewogCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfVU5MT0NLMSwKIAkJCQkgICAgIHBkYXRhLT51bmxvY2tfa2V5MSk7CiAJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9VTkxPQ0syLApAQCAtMzk1LDk2ICs2ODYsMTMwIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEtFWVBfTUFYX0VWRU5UOyBpKyspCi0JCXJldCB8PSBhZHA1NTg5X3JlYWQoY2xpZW50LCBBRFA1NTg5X0ZJRk9fMSArIGkpOworCQlyZXQgfD0gYWRwNTU4OV9yZWFkKGNsaWVudCwgQURQNTU4OV81X0ZJRk9fMSArIGkpOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5ncGltYXBzaXplOyBpKyspIHsKIAkJdW5zaWduZWQgc2hvcnQgcGluID0gcGRhdGEtPmdwaW1hcFtpXS5waW47CiAKLQkJaWYgKHBpbiA8PSBBRFA1NTg5X0dQSV9QSU5fUk9XX0VORCkgewotCQkJZXZ0X21vZGUxIHw9ICgxIDw8IChwaW4gLSBBRFA1NTg5X0dQSV9QSU5fUk9XX0JBU0UpKTsKKwkJaWYgKHBpbiA8PSBrcGFkLT52YXItPmdwaV9waW5fcm93X2VuZCkgeworCQkJZXZ0X21vZGUxIHw9ICgxIDw8IChwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fcm93X2Jhc2UpKTsKIAkJfSBlbHNlIHsKIAkJCWV2dF9tb2RlMiB8PQotCQkJICAgICgoMSA8PCAocGluIC0gQURQNTU4OV9HUElfUElOX0NPTF9CQVNFKSkgJiAweEZGKTsKLQkJCWV2dF9tb2RlMyB8PQotCQkJICAgICgoMSA8PCAocGluIC0gQURQNTU4OV9HUElfUElOX0NPTF9CQVNFKSkgPj4gOCk7CisJCQkgICAgKCgxIDw8IChwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fY29sX2Jhc2UpKSAmIDB4RkYpOworCQkJaWYgKCFrcGFkLT5pc19hZHA1NTg1KQorCQkJCWV2dF9tb2RlMyB8PSAoKDEgPDwgKHBpbiAtCisJCQkJCWtwYWQtPnZhci0+Z3BpX3Bpbl9jb2xfYmFzZSkpID4+IDgpOwogCQl9CiAJfQogCiAJaWYgKHBkYXRhLT5ncGltYXBzaXplKSB7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9HUElfRVZFTlRfRU5fQSwgZXZ0X21vZGUxKTsKLQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0dQSV9FVkVOVF9FTl9CLCBldnRfbW9kZTIpOwotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0MsIGV2dF9tb2RlMyk7CisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfR1BJX0VWRU5UX0VOX0EpLAorCQkJCSAgICAgZXZ0X21vZGUxKTsKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9HUElfRVZFTlRfRU5fQiksCisJCQkJICAgICBldnRfbW9kZTIpOworCQlpZiAoIWtwYWQtPmlzX2FkcDU1ODUpCisJCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsCisJCQkJCSAgICAgcmVnKEFEUDU1ODlfR1BJX0VWRU5UX0VOX0MpLAorCQkJCQkgICAgIGV2dF9tb2RlMyk7CiAJfQogCiAJaWYgKHBkYXRhLT5wdWxsX2Rpc19tYXNrICYgcGRhdGEtPnB1bGx1cF9lbl8xMDBrICYKLQkgICAgcGRhdGEtPnB1bGx1cF9lbl8zMDBrICYgcGRhdGEtPnB1bGxkb3duX2VuXzMwMGspCisJCXBkYXRhLT5wdWxsdXBfZW5fMzAwayAmIHBkYXRhLT5wdWxsZG93bl9lbl8zMDBrKQogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJDb25mbGljdGluZyBwdWxsIHJlc2lzdG9yIGNvbmZpZ1xuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYR1BJTzsgaSsrKSB7Ci0JCXVuc2lnbmVkIHZhbCA9IDA7Ci0KLQkJaWYgKHBkYXRhLT5wdWxsdXBfZW5fMzAwayAmICgxIDw8IGkpKQorCWZvciAoaSA9IDA7IGkgPD0ga3BhZC0+dmFyLT5tYXhfcm93X251bTsgaSsrKSB7CisJCXVuc2lnbmVkIHZhbCA9IDAsIGJpdCA9ICgxIDw8IGkpOworCQlpZiAocGRhdGEtPnB1bGx1cF9lbl8zMDBrICYgYml0KQogCQkJdmFsID0gMDsKLQkJZWxzZSBpZiAocGRhdGEtPnB1bGxkb3duX2VuXzMwMGsgJiAoMSA8PCBpKSkKKwkJZWxzZSBpZiAocGRhdGEtPnB1bGxkb3duX2VuXzMwMGsgJiBiaXQpCiAJCQl2YWwgPSAxOwotCQllbHNlIGlmIChwZGF0YS0+cHVsbHVwX2VuXzEwMGsgJiAoMSA8PCBpKSkKKwkJZWxzZSBpZiAocGRhdGEtPnB1bGx1cF9lbl8xMDBrICYgYml0KQogCQkJdmFsID0gMjsKLQkJZWxzZSBpZiAocGRhdGEtPnB1bGxfZGlzX21hc2sgJiAoMSA8PCBpKSkKKwkJZWxzZSBpZiAocGRhdGEtPnB1bGxfZGlzX21hc2sgJiBiaXQpCiAJCQl2YWwgPSAzOwogCiAJCXB1bGxfbWFzayB8PSB2YWwgPDwgKDIgKiAoaSAmIDB4MykpOwogCi0JCWlmICgoaSAmIDB4MykgPT0gMHgzIHx8IGkgPT0gTUFYR1BJTyAtIDEpIHsKKwkJaWYgKGkgPT0gMyB8fCBpID09IGtwYWQtPnZhci0+bWF4X3Jvd19udW0pIHsKKwkJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODVfUlBVTExfQ09ORklHX0EpCisJCQkJCSAgICAgKyAoaSA+PiAyKSwgcHVsbF9tYXNrKTsKKwkJCXB1bGxfbWFzayA9IDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IGtwYWQtPnZhci0+bWF4X2NvbF9udW07IGkrKykgeworCQl1bnNpZ25lZCB2YWwgPSAwLCBiaXQgPSAxIDw8IChpICsga3BhZC0+dmFyLT5jb2xfc2hpZnQpOworCQlpZiAocGRhdGEtPnB1bGx1cF9lbl8zMDBrICYgYml0KQorCQkJdmFsID0gMDsKKwkJZWxzZSBpZiAocGRhdGEtPnB1bGxkb3duX2VuXzMwMGsgJiBiaXQpCisJCQl2YWwgPSAxOworCQllbHNlIGlmIChwZGF0YS0+cHVsbHVwX2VuXzEwMGsgJiBiaXQpCisJCQl2YWwgPSAyOworCQllbHNlIGlmIChwZGF0YS0+cHVsbF9kaXNfbWFzayAmIGJpdCkKKwkJCXZhbCA9IDM7CisKKwkJcHVsbF9tYXNrIHw9IHZhbCA8PCAoMiAqIChpICYgMHgzKSk7CisKKwkJaWYgKGkgPT0gMyB8fCBpID09IGtwYWQtPnZhci0+bWF4X2NvbF9udW0pIHsKIAkJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwKLQkJCQkJICAgICBBRFA1NTg5X1JQVUxMX0NPTkZJR19BICsgKGkgPj4gMiksCi0JCQkJCSAgICAgcHVsbF9tYXNrKTsKKwkJCQkJICAgICByZWcoQURQNTU4NV9SUFVMTF9DT05GSUdfQykgKworCQkJCQkgICAgIChpID4+IDIpLCBwdWxsX21hc2spOwogCQkJcHVsbF9tYXNrID0gMDsKIAkJfQogCX0KIAogCWlmIChwZGF0YS0+cmVzZXQxX2tleV8xICYmIHBkYXRhLT5yZXNldDFfa2V5XzIgJiYgcGRhdGEtPnJlc2V0MV9rZXlfMykgewotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0EsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUkVTRVQxX0VWRU5UX0EpLAogCQkJCSAgICAgYWRwNTU4OV9nZXRfZXZjb2RlKGtwYWQsCiAJCQkJCQkJcGRhdGEtPnJlc2V0MV9rZXlfMSkpOwotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0IsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUkVTRVQxX0VWRU5UX0IpLAogCQkJCSAgICAgYWRwNTU4OV9nZXRfZXZjb2RlKGtwYWQsCiAJCQkJCQkJcGRhdGEtPnJlc2V0MV9rZXlfMikpOwotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0MsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUkVTRVQxX0VWRU5UX0MpLAogCQkJCSAgICAgYWRwNTU4OV9nZXRfZXZjb2RlKGtwYWQsCiAJCQkJCQkJcGRhdGEtPnJlc2V0MV9rZXlfMykpOwogCQlrcGFkLT5leHRlbmRfY2ZnIHw9IFI0X0VYVEVORF9DRkc7CiAJfQogCiAJaWYgKHBkYXRhLT5yZXNldDJfa2V5XzEgJiYgcGRhdGEtPnJlc2V0Ml9rZXlfMikgewotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVQyX0VWRU5UX0EsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUkVTRVQyX0VWRU5UX0EpLAogCQkJCSAgICAgYWRwNTU4OV9nZXRfZXZjb2RlKGtwYWQsCiAJCQkJCQkJcGRhdGEtPnJlc2V0Ml9rZXlfMSkpOwotCQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfUkVTRVQyX0VWRU5UX0IsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUkVTRVQyX0VWRU5UX0IpLAogCQkJCSAgICAgYWRwNTU4OV9nZXRfZXZjb2RlKGtwYWQsCiAJCQkJCQkJcGRhdGEtPnJlc2V0Ml9rZXlfMikpOwogCQlrcGFkLT5leHRlbmRfY2ZnIHw9IEM0X0VYVEVORF9DRkc7CiAJfQogCiAJaWYgKGtwYWQtPmV4dGVuZF9jZmcpIHsKLQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X1JFU0VUX0NGRywKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9SRVNFVF9DRkcpLAogCQkJCSAgICAgcGRhdGEtPnJlc2V0X2NmZyk7Ci0JCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9QSU5fQ09ORklHX0QsCisJCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgcmVnKEFEUDU1ODlfUElOX0NPTkZJR19EKSwKIAkJCQkgICAgIGtwYWQtPmV4dGVuZF9jZmcpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPD0gQURQX0JBTksoTUFYR1BJTyk7IGkrKykKLQkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0RFQk9VTkNFX0RJU19BICsgaSwKLQkJCQkgICAgIHBkYXRhLT5kZWJvdW5jZV9kaXNfbWFzayA+PiAoaSAqIDgpKTsKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0RFQk9VTkNFX0RJU19BKSwKKwkJCSAgICBwZGF0YS0+ZGVib3VuY2VfZGlzX21hc2sgJiBrcGFkLT52YXItPnJvd19tYXNrKTsKIAotCXJldCB8PSBhZHA1NTg5X3dyaXRlKGNsaWVudCwgQURQNTU4OV9QT0xMX1BUSU1FX0NGRywKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0RFQk9VTkNFX0RJU19CKSwKKwkJCSAgICAgKHBkYXRhLT5kZWJvdW5jZV9kaXNfbWFzayA+PiBrcGFkLT52YXItPmNvbF9zaGlmdCkKKwkJCSAgICAgJiBrcGFkLT52YXItPmNvbF9tYXNrKTsKKworCWlmICgha3BhZC0+aXNfYWRwNTU4NSkKKwkJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9ERUJPVU5DRV9ESVNfQyksCisJCQkJICAgICAocGRhdGEtPmRlYm91bmNlX2Rpc19tYXNrID4+IDE2KSAmIDB4RkYpOworCisJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9QT0xMX1BUSU1FX0NGRyksCiAJCQkgICAgIHBkYXRhLT5zY2FuX2N5Y2xlX3RpbWUgJiBQVElNRV9NQVNLKTsKLQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfSU5UX1NUQVRVUywgTE9HSUMyX0lOVCB8Ci0JCQkgICAgIExPR0lDMV9JTlQgfCBPVlJGTE9XX0lOVCB8IExPQ0tfSU5UIHwKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfNV9JTlRfU1RBVFVTLAorCQkJICAgICAoa3BhZC0+aXNfYWRwNTU4NSA/IDAgOiBMT0dJQzJfSU5UKSB8CisJCQkgICAgIExPR0lDMV9JTlQgfCBPVlJGTE9XX0lOVCB8CisJCQkgICAgIChrcGFkLT5pc19hZHA1NTg1ID8gMCA6IExPQ0tfSU5UKSB8CiAJCQkgICAgIEdQSV9JTlQgfCBFVkVOVF9JTlQpOwkvKiBTdGF0dXMgaXMgVzFDICovCiAKLQlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIEFEUDU1ODlfR0VORVJBTF9DRkcsCisJcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCByZWcoQURQNTU4OV9HRU5FUkFMX0NGRyksCiAJCQkgICAgIElOVF9DRkcgfCBPU0NfRU4gfCBDT1JFX0NMSygzKSk7Ci0JcmV0IHw9IGFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0lOVF9FTiwKKwlyZXQgfD0gYWRwNTU4OV93cml0ZShjbGllbnQsIHJlZyhBRFA1NTg5X0lOVF9FTiksCiAJCQkgICAgIE9WUkZMT1dfSUVOIHwgR1BJX0lFTiB8IEVWRU5UX0lFTik7CiAKIAlpZiAocmV0IDwgMCkgewpAQCAtNDk3LDMwICs4MjIsMzMgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGFkcDU1ODlfcmVwb3J0X3N3aXRjaF9zdGF0ZShzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkKQogewotCWludCBncGlfc3RhdDEgPSBhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LCBBRFA1NTg5X0dQSV9TVEFUVVNfQSk7Ci0JaW50IGdwaV9zdGF0MiA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsIEFEUDU1ODlfR1BJX1NUQVRVU19CKTsKLQlpbnQgZ3BpX3N0YXQzID0gYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElfU1RBVFVTX0MpOwogCWludCBncGlfc3RhdF90bXAsIHBpbl9sb2M7CiAJaW50IGk7CisJaW50IGdwaV9zdGF0MSA9IGFkcDU1ODlfcmVhZChrcGFkLT5jbGllbnQsCisJCQkJICAgICBrcGFkLT52YXItPnJlZyhBRFA1NTg5X0dQSV9TVEFUVVNfQSkpOworCWludCBncGlfc3RhdDIgPSBhZHA1NTg5X3JlYWQoa3BhZC0+Y2xpZW50LAorCQkJCSAgICAga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HUElfU1RBVFVTX0IpKTsKKwlpbnQgZ3BpX3N0YXQzID0gIWtwYWQtPmlzX2FkcDU1ODUgPworCQkJYWRwNTU4OV9yZWFkKGtwYWQtPmNsaWVudCwgQURQNTU4OV9HUElfU1RBVFVTX0MpIDogMDsKIAogCWZvciAoaSA9IDA7IGkgPCBrcGFkLT5ncGltYXBzaXplOyBpKyspIHsKIAkJdW5zaWduZWQgc2hvcnQgcGluID0ga3BhZC0+Z3BpbWFwW2ldLnBpbjsKIAotCQlpZiAocGluIDw9IEFEUDU1ODlfR1BJX1BJTl9ST1dfRU5EKSB7CisJCWlmIChwaW4gPD0ga3BhZC0+dmFyLT5ncGlfcGluX3Jvd19lbmQpIHsKIAkJCWdwaV9zdGF0X3RtcCA9IGdwaV9zdGF0MTsKLQkJCXBpbl9sb2MgPSBwaW4gLSBBRFA1NTg5X0dQSV9QSU5fUk9XX0JBU0U7Ci0JCX0gZWxzZSBpZiAoKHBpbiAtIEFEUDU1ODlfR1BJX1BJTl9DT0xfQkFTRSkgPCA4KSB7CisJCQlwaW5fbG9jID0gcGluIC0ga3BhZC0+dmFyLT5ncGlfcGluX3Jvd19iYXNlOworCQl9IGVsc2UgaWYgKChwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fY29sX2Jhc2UpIDwgOCkgewogCQkJZ3BpX3N0YXRfdG1wID0gZ3BpX3N0YXQyOwotCQkJcGluX2xvYyA9IHBpbiAtIEFEUDU1ODlfR1BJX1BJTl9DT0xfQkFTRTsKKwkJCXBpbl9sb2MgPSBwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fY29sX2Jhc2U7CiAJCX0gZWxzZSB7CiAJCQlncGlfc3RhdF90bXAgPSBncGlfc3RhdDM7Ci0JCQlwaW5fbG9jID0gcGluIC0gQURQNTU4OV9HUElfUElOX0NPTF9CQVNFIC0gODsKKwkJCXBpbl9sb2MgPSBwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fY29sX2Jhc2UgLSA4OwogCQl9CiAKIAkJaWYgKGdwaV9zdGF0X3RtcCA8IDApIHsKIAkJCWRldl9lcnIoJmtwYWQtPmNsaWVudC0+ZGV2LAotCQkJCSJDYW4ndCByZWFkIEdQSU9fREFUX1NUQVQgc3dpdGNoIgotCQkJCSIgJWQgZGVmYXVsdCB0byBPRkZcbiIsIHBpbik7CisJCQkJIkNhbid0IHJlYWQgR1BJT19EQVRfU1RBVCBzd2l0Y2ggJWQsIGRlZmF1bHQgdG8gT0ZGXG4iLAorCQkJCXBpbik7CiAJCQlncGlfc3RhdF90bXAgPSAwOwogCQl9CiAKQEAgLTUzNiw3ICs4NjQsOCBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYWRwNTU4OV9rcGFkICprcGFkOwotCWNvbnN0IHN0cnVjdCBhZHA1NTg5X2twYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJY29uc3Qgc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CiAJdW5zaWduZWQgaW50IHJldmlkOwogCWludCByZXQsIGk7CkBAIC01NDgsNTYgKzg3Nyw3OSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwZGF0YSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCEoKHBkYXRhLT5rZXlwYWRfZW5fbWFzayAmIDB4RkYpICYmCi0JCQkocGRhdGEtPmtleXBhZF9lbl9tYXNrID4+IDgpKSB8fCAhcGRhdGEtPmtleW1hcCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHJvd3MsIGNvbHMgb3Iga2V5bWFwIGZyb20gcGRhdGFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlrcGFkID0ga3phbGxvYyhzaXplb2YoKmtwYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtwYWQpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoIChpZC0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIEFEUDU1ODVfMDI6CisJCWtwYWQtPmFkcDU1ODVfc3VwcG9ydF9yb3c1ID0gdHJ1ZTsKKwljYXNlIEFEUDU1ODVfMDE6CisJCWtwYWQtPmlzX2FkcDU1ODUgPSB0cnVlOworCQlrcGFkLT52YXIgPSAmY29uc3RfYWRwNTU4NTsKKwkJYnJlYWs7CisJY2FzZSBBRFA1NTg5OgorCQlrcGFkLT52YXIgPSAmY29uc3RfYWRwNTU4OTsKKwkJYnJlYWs7CiAJfQogCi0JaWYgKHBkYXRhLT5rZXltYXBzaXplICE9IEFEUDU1ODlfS0VZTUFQU0laRSkgeworCWlmICghKChwZGF0YS0+a2V5cGFkX2VuX21hc2sgJiBrcGFkLT52YXItPnJvd19tYXNrKSAmJgorCQkJKHBkYXRhLT5rZXlwYWRfZW5fbWFzayA+PiBrcGFkLT52YXItPmNvbF9zaGlmdCkpIHx8CisJCQkhcGRhdGEtPmtleW1hcCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHJvd3MsIGNvbHMgb3Iga2V5bWFwIGZyb20gcGRhdGFcbiIpOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWlmIChwZGF0YS0+a2V5bWFwc2l6ZSAhPSBrcGFkLT52YXItPmtleW1hcHNpemUpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIGtleW1hcHNpemVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKIAlpZiAoIXBkYXRhLT5ncGltYXAgJiYgcGRhdGEtPmdwaW1hcHNpemUpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIGdwaW1hcCBmcm9tIHBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCi0JaWYgKHBkYXRhLT5ncGltYXBzaXplID4gQURQNTU4OV9HUElNQVBTSVpFX01BWCkgeworCWlmIChwZGF0YS0+Z3BpbWFwc2l6ZSA+IGtwYWQtPnZhci0+Z3BpbWFwc2l6ZV9tYXgpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIGdwaW1hcHNpemVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPmdwaW1hcHNpemU7IGkrKykgewogCQl1bnNpZ25lZCBzaG9ydCBwaW4gPSBwZGF0YS0+Z3BpbWFwW2ldLnBpbjsKIAotCQlpZiAocGluIDwgQURQNTU4OV9HUElfUElOX0JBU0UgfHwgcGluID4gQURQNTU4OV9HUElfUElOX0VORCkgeworCQlpZiAocGluIDwga3BhZC0+dmFyLT5ncGlfcGluX2Jhc2UgfHwKKwkJCQlwaW4gPiBrcGFkLT52YXItPmdwaV9waW5fZW5kKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpIHBpbiBkYXRhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBlcnJfZnJlZV9tZW07CiAJCX0KIAotCQlpZiAoKDEgPDwgKHBpbiAtIEFEUDU1ODlfR1BJX1BJTl9ST1dfQkFTRSkpICYKKwkJaWYgKCgxIDw8IChwaW4gLSBrcGFkLT52YXItPmdwaV9waW5fcm93X2Jhc2UpKSAmCiAJCQkJcGRhdGEtPmtleXBhZF9lbl9tYXNrKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ3BpIHJvdy9jb2wgZGF0YVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCQl9CiAJfQogCiAJaWYgKCFjbGllbnQtPmlycSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIElSUT9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKLQlrcGFkID0ga3phbGxvYyhzaXplb2YoKmtwYWQpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICgha3BhZCB8fCAhaW5wdXQpIHsKKwlpZiAoIWlucHV0KSB7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQpAQCAtNjA1LDEzICs5NTcsMTMgQEAKIAlrcGFkLT5jbGllbnQgPSBjbGllbnQ7CiAJa3BhZC0+aW5wdXQgPSBpbnB1dDsKIAotCXJldCA9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfSUQpOworCXJldCA9IGFkcDU1ODlfcmVhZChjbGllbnQsIEFEUDU1ODlfNV9JRCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZXJyb3IgPSByZXQ7Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOworCQlnb3RvIGVycl9mcmVlX2lucHV0OwogCX0KIAotCXJldmlkID0gKHU4KSByZXQgJiBBRFA1NTg5X0RFVklDRV9JRF9NQVNLOworCXJldmlkID0gKHU4KSByZXQgJiBBRFA1NTg5XzVfREVWSUNFX0lEX01BU0s7CiAKIAlpbnB1dC0+bmFtZSA9IGNsaWVudC0+bmFtZTsKIAlpbnB1dC0+cGh5cyA9ICJhZHA1NTg5LWtleXMvaW5wdXQwIjsKQEAgLTY1Miw3ICsxMDA0LDcgQEAKIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOworCQlnb3RvIGVycl9mcmVlX2lucHV0OwogCX0KIAogCWVycm9yID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsIE5VTEwsIGFkcDU1ODlfaXJxLApAQCAtNjg1LDggKzEwMzcsOSBAQAogZXJyX3VucmVnX2RldjoKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dCk7CiAJaW5wdXQgPSBOVUxMOwotZXJyX2ZyZWVfbWVtOgorZXJyX2ZyZWVfaW5wdXQ6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOworZXJyX2ZyZWVfbWVtOgogCWtmcmVlKGtwYWQpOwogCiAJcmV0dXJuIGVycm9yOwpAQCAtNjk2LDcgKzEwNDksNyBAQAogewogCXN0cnVjdCBhZHA1NTg5X2twYWQgKmtwYWQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCWFkcDU1ODlfd3JpdGUoY2xpZW50LCBBRFA1NTg5X0dFTkVSQUxfQ0ZHLCAwKTsKKwlhZHA1NTg5X3dyaXRlKGNsaWVudCwga3BhZC0+dmFyLT5yZWcoQURQNTU4OV9HRU5FUkFMX0NGRyksIDApOwogCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBrcGFkKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShrcGFkLT5pbnB1dCk7CiAJYWRwNTU4OV9ncGlvX3JlbW92ZShrcGFkKTsKQEAgLTczNiw3ICsxMDg5LDkgQEAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhZHA1NTg5X2Rldl9wbV9vcHMsIGFkcDU1ODlfc3VzcGVuZCwgYWRwNTU4OV9yZXN1bWUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWRwNTU4OV9pZFtdID0gewotCXsiYWRwNTU4OS1rZXlzIiwgMH0sCisJeyJhZHA1NTg5LWtleXMiLCBBRFA1NTg5fSwKKwl7ImFkcDU1ODUta2V5cyIsIEFEUDU1ODVfMDF9LAorCXsiYWRwNTU4NS0wMi1rZXlzIiwgQURQNTU4NV8wMn0sIC8qIEFkZHMgUk9XNSB0byBBRFA1NTg1ICovCiAJe30KIH07CiAKQEAgLTc2Nyw0ICsxMTIyLDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQURQNTU4OSBLZXlwYWQgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFEUDU1ODkvQURQNTU4NSBLZXlwYWQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2RhdmluY2lfa2V5c2Nhbi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9kYXZpbmNpX2tleXNjYW4uYwppbmRleCBjZDg5ZDE3MS4uOWQ4MmIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9kYXZpbmNpX2tleXNjYW4uYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2RhdmluY2lfa2V5c2Nhbi5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAl9CiAKIAllcnJvciA9IHJlcXVlc3RfaXJxKGRhdmluY2lfa3MtPmlycSwgZGF2aW5jaV9rc19pbnRlcnJ1cHQsCi0JCQkgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGRhdmluY2lfa3MpOworCQkJICAwLCBwZGV2LT5uYW1lLCBkYXZpbmNpX2tzKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGRhdmluY2kga2V5IHNjYW4gaW50ZXJydXB0XG4iKTsKIAkJZ290byBmYWlsNTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZXA5M3h4X2tleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9lcDkzeHhfa2V5cGFkLmMKaW5kZXggYWExN2UwMi4uNDY2MmM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9lcDkzeHhfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9lcDkzeHhfa2V5cGFkLmMKQEAgLTMyMyw3ICszMjMsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGtleXBhZCk7CiAKIAllcnIgPSByZXF1ZXN0X2lycShrZXlwYWQtPmlycSwgZXA5M3h4X2tleXBhZF9pcnFfaGFuZGxlciwKLQkJCSAgSVJRRl9ESVNBQkxFRCwgcGRldi0+bmFtZSwga2V5cGFkKTsKKwkJCSAgMCwgcGRldi0+bmFtZSwga2V5cGFkKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWxlZF9mcmVlX2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKaW5kZXggNjdkZjkxYS4uZWQxZWQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCkBAIC00NjEsOCArNDYxLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsICpwcDsKIAlpbnQgaTsKIAlzdHJ1Y3QgZ3Bpb19rZXlzX2J1dHRvbiAqYnV0dG9uczsKLQljb25zdCB1MzIgKnJlZzsKLQlpbnQgbGVuOworCXUzMiByZWc7CiAKIAlub2RlID0gZGV2LT5vZl9ub2RlOwogCWlmIChub2RlID09IE5VTEwpCkBAIC00NzAsNyArNDY5LDcgQEAKIAogCW1lbXNldChwZGF0YSwgMCwgc2l6ZW9mICpwZGF0YSk7CiAKLQlwZGF0YS0+cmVwID0gISFvZl9nZXRfcHJvcGVydHkobm9kZSwgImF1dG9yZXBlYXQiLCAmbGVuKTsKKwlwZGF0YS0+cmVwID0gISFvZl9nZXRfcHJvcGVydHkobm9kZSwgImF1dG9yZXBlYXQiLCBOVUxMKTsKIAogCS8qIEZpcnN0IGNvdW50IHRoZSBzdWJub2RlcyAqLwogCXBkYXRhLT5uYnV0dG9ucyA9IDA7CkBAIC00OTgsMjIgKzQ5NywyNSBAQAogCQlidXR0b25zW2ldLmdwaW8gPSBvZl9nZXRfZ3Bpb19mbGFncyhwcCwgMCwgJmZsYWdzKTsKIAkJYnV0dG9uc1tpXS5hY3RpdmVfbG93ID0gZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1c7CiAKLQkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KHBwLCAibGludXgsY29kZSIsICZsZW4pOwotCQlpZiAoIXJlZykgeworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocHAsICJsaW51eCxjb2RlIiwgJnJlZykpIHsKIAkJCWRldl9lcnIoZGV2LCAiQnV0dG9uIHdpdGhvdXQga2V5Y29kZTogMHgleFxuIiwgYnV0dG9uc1tpXS5ncGlvKTsKIAkJCWdvdG8gb3V0X2ZhaWw7CiAJCX0KLQkJYnV0dG9uc1tpXS5jb2RlID0gYmUzMl90b19jcHVwKHJlZyk7CisJCWJ1dHRvbnNbaV0uY29kZSA9IHJlZzsKIAotCQlidXR0b25zW2ldLmRlc2MgPSBvZl9nZXRfcHJvcGVydHkocHAsICJsYWJlbCIsICZsZW4pOworCQlidXR0b25zW2ldLmRlc2MgPSBvZl9nZXRfcHJvcGVydHkocHAsICJsYWJlbCIsIE5VTEwpOwogCi0JCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgImxpbnV4LGlucHV0LXR5cGUiLCAmbGVuKTsKLQkJYnV0dG9uc1tpXS50eXBlID0gcmVnID8gYmUzMl90b19jcHVwKHJlZykgOiBFVl9LRVk7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwcCwgImxpbnV4LGlucHV0LXR5cGUiLCAmcmVnKSA9PSAwKQorCQkJYnV0dG9uc1tpXS50eXBlID0gcmVnOworCQllbHNlCisJCQlidXR0b25zW2ldLnR5cGUgPSBFVl9LRVk7CiAKIAkJYnV0dG9uc1tpXS53YWtldXAgPSAhIW9mX2dldF9wcm9wZXJ0eShwcCwgImdwaW8ta2V5LHdha2V1cCIsIE5VTEwpOwogCi0JCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgImRlYm91bmNlLWludGVydmFsIiwgJmxlbik7Ci0JCWJ1dHRvbnNbaV0uZGVib3VuY2VfaW50ZXJ2YWwgPSByZWcgPyBiZTMyX3RvX2NwdXAocmVnKSA6IDU7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwcCwgImRlYm91bmNlLWludGVydmFsIiwgJnJlZykgPT0gMCkKKwkJCWJ1dHRvbnNbaV0uZGVib3VuY2VfaW50ZXJ2YWwgPSByZWc7CisJCWVsc2UKKwkJCWJ1dHRvbnNbaV0uZGVib3VuY2VfaW50ZXJ2YWwgPSA1OwogCiAJCWkrKzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2lteF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaW14X2tleXBhZC5jCmluZGV4IGQ5MmMxNWMuLmNjZWJkMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaW14X2tleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaW14X2tleXBhZC5jCkBAIC01MTAsNyArNTEwLDcgQEAKIAkvKiBFbnN1cmUgdGhhdCB0aGUga2V5cGFkIHdpbGwgc3RheSBkb3JtYW50IHVudGlsIG9wZW5lZCAqLwogCWlteF9rZXlwYWRfaW5oaWJpdChrZXlwYWQpOwogCi0JZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGlteF9rZXlwYWRfaXJxX2hhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIGlteF9rZXlwYWRfaXJxX2hhbmRsZXIsIDAsCiAJCQkgICAgcGRldi0+bmFtZSwga2V5cGFkKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKQEAgLTU2NywxMCArNTY3LDU0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgaW14X2tiZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGlteF9rZXlwYWQgKmtiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGtiZC0+aW5wdXRfZGV2OworCisJLyogaW14IGtiZCBjYW4gd2FrZSB1cCBzeXN0ZW0gZXZlbiBjbG9jayBpcyBkaXNhYmxlZCAqLworCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJaWYgKGlucHV0X2Rldi0+dXNlcnMpCisJCWNsa19kaXNhYmxlKGtiZC0+Y2xrKTsKKworCW11dGV4X3VubG9jaygmaW5wdXRfZGV2LT5tdXRleCk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWVuYWJsZV9pcnFfd2FrZShrYmQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbXhfa2JkX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpbXhfa2V5cGFkICprYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBrYmQtPmlucHV0X2RldjsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShrYmQtPmlycSk7CisKKwltdXRleF9sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCWlmIChpbnB1dF9kZXYtPnVzZXJzKQorCQljbGtfZW5hYmxlKGtiZC0+Y2xrKTsKKworCW11dGV4X3VubG9jaygmaW5wdXRfZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoaW14X2tiZF9wbV9vcHMsIGlteF9rYmRfc3VzcGVuZCwgaW14X2tiZF9yZXN1bWUpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXhfa2V5cGFkX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiaW14LWtleXBhZCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmaW14X2tiZF9wbV9vcHMsCiAJfSwKIAkucHJvYmUJCT0gaW14X2tleXBhZF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGlteF9rZXlwYWRfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYwppbmRleCAyY2QzZTFkLi4wYWE2NzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2pvcm5hZGE3MjBfa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogCWVyciA9IHJlcXVlc3RfaXJxKElSUV9HUElPMCwKIAkJCSAgam9ybmFkYTcyMF9rYmRfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJICAiam9ybmFkYWtiZCIsIHBkZXYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiam9ybmFkYWtiZDcyMF9rYmQ6IFVuYWJsZSB0byBncmFiIElSUVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYwppbmRleCA3NTYzNDhhLi44MmQxZGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKQEAgLTc4OCw3ICs3ODgsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAvKgogICogV2UgZG9uJ3QgbmVlZCB0byBleHBsaWNpdGx5IHN1c3BlbmQgdGhlIGNoaXAsIGFzIGl0IGFscmVhZHkgc3dpdGNoZXMgb2ZmCiAgKiB3aGVuIHRoZXJlJ3Mgbm8gYWN0aXZpdHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL21hdHJpeF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCmluZGV4IGIwMmU0MjYuLmUyYWU2NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWF0cml4X2tleXBhZC5jCkBAIC0zNDMsNyArMzQzLDYgQEAKIAkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcm93X2dwaW9zOyBpKyspIHsKIAkJCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5yb3dfZ3Bpb3NbaV0pLAogCQkJCQltYXRyaXhfa2V5cGFkX2ludGVycnVwdCwKLQkJCQkJSVJRRl9ESVNBQkxFRCB8CiAJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfAogCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKIAkJCQkJIm1hdHJpeC1rZXlwYWQiLCBrZXlwYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ub21hZGlrLXNrZS1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbm9tYWRpay1za2Uta2V5cGFkLmMKaW5kZXggNmUwZjIzMC4uZmNkZWM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ub21hZGlrLXNrZS1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25vbWFkaWstc2tlLWtleXBhZC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwbGF0L3NrZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKaW5kZXggMzNkMGJkYy4uMzIzYmNkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2tleXBhZC5oPgogI2luY2x1ZGUgPHBsYXQvbWVuZWxhdXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTI3eF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jCmluZGV4IDRiMGVjMzUuLmVjYTZhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jCkBAIC01MzUsNyArNTM1LDcgQEAKIAkJaW5wdXRfZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9SRUwpOwogCX0KIAotCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBweGEyN3hfa2V5cGFkX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBweGEyN3hfa2V5cGFkX2lycV9oYW5kbGVyLCAwLAogCQkJICAgIHBkZXYtPm5hbWUsIGtleXBhZCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTkzMF9yb3RhcnkuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jCmluZGV4IGI3MTIzYTQuLjM1NDUxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlyLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CiAJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCByKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgcm90YXJ5X2lycSwgSVJRRl9ESVNBQkxFRCwKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIHJvdGFyeV9pcnEsIDAsCiAJCQkiZW5oYW5jZWQgcm90YXJ5Iiwgcik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90YzM1ODl4LWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90YzM1ODl4LWtleXBhZC5jCmluZGV4IDk5MTIyZjUuLmY2MGM5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGMzNTg5eC1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RjMzU4OXgta2V5cGFkLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAlib29sIGtleXBhZF9zdG9wcGVkOwogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgdGMzNTg5eF9rZXlwYWRfaW5pdF9rZXlfaGFyZHdhcmUoc3RydWN0IHRjX2tleXBhZCAqa2V5cGFkKQorc3RhdGljIGludCB0YzM1ODl4X2tleXBhZF9pbml0X2tleV9oYXJkd2FyZShzdHJ1Y3QgdGNfa2V5cGFkICprZXlwYWQpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IGtleXBhZC0+dGMzNTg5eDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCmluZGV4IGE1YTc3OTEuLmNmMzIyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwpAQCAtNTUsNiArNTUsNyBAQAogCiAjZGVmaW5lIEtCQ19ST1dfQ0ZHMF8wCTB4OAogI2RlZmluZSBLQkNfQ09MX0NGRzBfMAkweDE4CisjZGVmaW5lIEtCQ19UT19DTlRfMAkweDI0CiAjZGVmaW5lIEtCQ19JTklUX0RMWV8wCTB4MjgKICNkZWZpbmUgS0JDX1JQVF9ETFlfMAkweDJjCiAjZGVmaW5lIEtCQ19LUF9FTlQwXzAJMHgzMApAQCAtNzAsNiArNzEsNyBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAl1bnNpZ25lZCBpbnQgcmVwb2xsX2RseTsKIAl1bnNpZ25lZCBsb25nIGNwX2RseV9qaWZmaWVzOworCXVuc2lnbmVkIGludCBjcF90b193a3VwX2RseTsKIAlib29sIHVzZV9mbl9tYXA7CiAJYm9vbCB1c2VfZ2hvc3RfZmlsdGVyOwogCWNvbnN0IHN0cnVjdCB0ZWdyYV9rYmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CkBAIC0yNTgsMTIgKzI2MCwxMCBAQAogCXUzMiB2YWwgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCBudW1fZG93biA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGZuX2tleXByZXNzID0gZmFsc2U7CiAJYm9vbCBrZXlfaW5fc2FtZV9yb3cgPSBmYWxzZTsKIAlib29sIGtleV9pbl9zYW1lX2NvbCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBLQkNfTUFYX0tQRU5UOyBpKyspIHsKIAkJaWYgKChpICUgNCkgPT0gMCkKIAkJCXZhbCA9IHJlYWRsKGtiYy0+bW1pbyArIEtCQ19LUF9FTlQwXzAgKyBpKTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCSAqIGFueSAyIG9mIHRoZSAzIGtleXMgc2hhcmUgYSByb3csIGFuZCBhbnkgMiBvZiB0aGVtIHNoYXJlIGEgY29sdW1uLgogCSAqIElmIHNvIGlnbm9yZSB0aGUga2V5IHByZXNzZXMgZm9yIHRoaXMgaXRlcmF0aW9uLgogCSAqLwotCWlmICgoa2JjLT51c2VfZ2hvc3RfZmlsdGVyKSAmJiAobnVtX2Rvd24gPj0gMykpIHsKKwlpZiAoa2JjLT51c2VfZ2hvc3RfZmlsdGVyICYmIG51bV9kb3duID49IDMpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9kb3duOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCBqOwogCQkJdTggY3Vycl9jb2wgPSBzY2FuY29kZXNbaV0gJiAweDA3OwpAQCAtMzI1LDggKzMyNSw2IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmMtPmxvY2ssIGZsYWdzKTsKLQogCS8qIElnbm9yZSB0aGUga2V5IHByZXNzZXMgZm9yIHRoaXMgaXRlcmF0aW9uPyAqLwogCWlmIChrZXlfaW5fc2FtZV9jb2wgJiYga2V5X2luX3NhbWVfcm93KQogCQlyZXR1cm47CkBAIC0zNDEsNiArMzM5LDE4IEBACiAJa2JjLT5udW1fcHJlc3NlZF9rZXlzID0gbnVtX2Rvd247CiB9CiAKK3N0YXRpYyB2b2lkIHRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoc3RydWN0IHRlZ3JhX2tiYyAqa2JjLCBib29sIGVuYWJsZSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7CisJaWYgKGVuYWJsZSkKKwkJdmFsIHw9IEtCQ19DT05UUk9MX0ZJRk9fQ05UX0lOVF9FTjsKKwllbHNlCisJCXZhbCAmPSB+S0JDX0NPTlRST0xfRklGT19DTlRfSU5UX0VOOworCXdyaXRlbCh2YWwsIGtiYy0+bW1pbyArIEtCQ19DT05UUk9MXzApOworfQorCiBzdGF0aWMgdm9pZCB0ZWdyYV9rYmNfa2V5cHJlc3NfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB0ZWdyYV9rYmMgKmtiYyA9IChzdHJ1Y3QgdGVncmFfa2JjICopZGF0YTsKQEAgLTM0OCw2ICszNTgsOCBAQAogCXUzMiB2YWw7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgma2JjLT5sb2NrLCBmbGFncyk7CisKIAl2YWwgPSAocmVhZGwoa2JjLT5tbWlvICsgS0JDX0lOVF8wKSA+PiA0KSAmIDB4ZjsKIAlpZiAodmFsKSB7CiAJCXVuc2lnbmVkIGxvbmcgZGx5OwpAQCAtMzY5LDI2ICszODEsMTkgQEAKIAkJa2JjLT5udW1fcHJlc3NlZF9rZXlzID0gMDsKIAogCQkvKiBBbGwga2V5cyBhcmUgcmVsZWFzZWQgc28gZW5hYmxlIHRoZSBrZXlwcmVzcyBpbnRlcnJ1cHQgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSByZWFkbChrYmMtPm1taW8gKyBLQkNfQ09OVFJPTF8wKTsKLQkJdmFsIHw9IEtCQ19DT05UUk9MX0ZJRk9fQ05UX0lOVF9FTjsKLQkJd3JpdGVsKHZhbCwga2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtiYy0+bG9jaywgZmxhZ3MpOworCQl0ZWdyYV9rYmNfc2V0X2ZpZm9faW50ZXJydXB0KGtiYywgdHJ1ZSk7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2JjLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0ZWdyYV9rYmNfaXNyKGludCBpcnEsIHZvaWQgKmFyZ3MpCiB7CiAJc3RydWN0IHRlZ3JhX2tiYyAqa2JjID0gYXJnczsKLQl1MzIgdmFsLCBjdGw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOwogCi0JLyoKLQkgKiBVbnRpbCBhbGwga2V5cyBhcmUgcmVsZWFzZWQsIGRlZmVyIGZ1cnRoZXIgcHJvY2Vzc2luZyB0bwotCSAqIHRoZSBwb2xsaW5nIGxvb3AgaW4gdGVncmFfa2JjX2tleXByZXNzX3RpbWVyCi0JICovCi0JY3RsID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7Ci0JY3RsICY9IH5LQkNfQ09OVFJPTF9GSUZPX0NOVF9JTlRfRU47Ci0Jd3JpdGVsKGN0bCwga2JjLT5tbWlvICsgS0JDX0NPTlRST0xfMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBRdWlja2x5IGJhaWwgb3V0ICYgcmVlbmFibGUgaW50ZXJydXB0cyBpZiB0aGUgZmlmbyB0aHJlc2hvbGQKQEAgLTM5OSwxNSArNDA0LDE1IEBACiAKIAlpZiAodmFsICYgS0JDX0lOVF9GSUZPX0NOVF9JTlRfU1RBVFVTKSB7CiAJCS8qCi0JCSAqIFNjaGVkdWxlIHRpbWVyIHRvIHJ1biB3aGVuIGhhcmR3YXJlIGlzIGluIGNvbnRpbnVvdXMKLQkJICogcG9sbGluZyBtb2RlLgorCQkgKiBVbnRpbCBhbGwga2V5cyBhcmUgcmVsZWFzZWQsIGRlZmVyIGZ1cnRoZXIgcHJvY2Vzc2luZyB0bworCQkgKiB0aGUgcG9sbGluZyBsb29wIGluIHRlZ3JhX2tiY19rZXlwcmVzc190aW1lci4KIAkJICovCisJCXRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoa2JjLCBmYWxzZSk7CiAJCW1vZF90aW1lcigma2JjLT50aW1lciwgamlmZmllcyArIGtiYy0+Y3BfZGx5X2ppZmZpZXMpOwotCX0gZWxzZSB7Ci0JCWN0bCB8PSBLQkNfQ09OVFJPTF9GSUZPX0NOVF9JTlRfRU47Ci0JCXdyaXRlbChjdGwsIGtiYy0+bW1pbyArIEtCQ19DT05UUk9MXzApOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtiYy0+bG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC00NTUsNyArNDYwLDYgQEAKIHN0YXRpYyBpbnQgdGVncmFfa2JjX3N0YXJ0KHN0cnVjdCB0ZWdyYV9rYmMgKmtiYykKIHsKIAljb25zdCBzdHJ1Y3QgdGVncmFfa2JjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0ga2JjLT5wZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBkZWJvdW5jZV9jbnQ7CiAJdTMyIHZhbCA9IDA7CiAKQEAgLTQ5Myw3ICs0OTcsNiBAQAogCSAqIEF0b21pY2FsbHkgY2xlYXIgb3V0IGFueSByZW1haW5pbmcgZW50cmllcyBpbiB0aGUga2V5IEZJRk8KIAkgKiBhbmQgZW5hYmxlIGtleWJvYXJkIGludGVycnVwdHMuCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtiYy0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICgxKSB7CiAJCXZhbCA9IHJlYWRsKGtiYy0+bW1pbyArIEtCQ19JTlRfMCk7CiAJCXZhbCA+Pj0gNDsKQEAgLTUwNCw3ICs1MDcsNiBAQAogCQl2YWwgPSByZWFkbChrYmMtPm1taW8gKyBLQkNfS1BfRU5UMV8wKTsKIAl9CiAJd3JpdGVsKDB4Nywga2JjLT5tbWlvICsgS0JDX0lOVF8wKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYmMtPmxvY2ssIGZsYWdzKTsKIAogCWVuYWJsZV9pcnEoa2JjLT5pcnEpOwogCkBAIC03MzQsMTggKzczNiwzMCBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgdGVncmFfa2JjICprYmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCW11dGV4X2xvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkgewotCQl0ZWdyYV9rYmNfc2V0dXBfd2FrZWtleXMoa2JjLCB0cnVlKTsKLQkJZW5hYmxlX2lycV93YWtlKGtiYy0+aXJxKTsKKwkJZGlzYWJsZV9pcnEoa2JjLT5pcnEpOworCQlkZWxfdGltZXJfc3luYygma2JjLT50aW1lcik7CisJCXRlZ3JhX2tiY19zZXRfZmlmb19pbnRlcnJ1cHQoa2JjLCBmYWxzZSk7CisKIAkJLyogRm9yY2VmdWxseSBjbGVhciB0aGUgaW50ZXJydXB0IHN0YXR1cyAqLwogCQl3cml0ZWwoMHg3LCBrYmMtPm1taW8gKyBLQkNfSU5UXzApOworCQkvKgorCQkgKiBTdG9yZSB0aGUgcHJldmlvdXMgcmVzaWRlbnQgdGltZSBvZiBjb250aW51b3VzIHBvbGxpbmcgbW9kZS4KKwkJICogRm9yY2UgdGhlIGtleWJvYXJkIGludG8gaW50ZXJydXB0IG1vZGUuCisJCSAqLworCQlrYmMtPmNwX3RvX3drdXBfZGx5ID0gcmVhZGwoa2JjLT5tbWlvICsgS0JDX1RPX0NOVF8wKTsKKwkJd3JpdGVsKDAsIGtiYy0+bW1pbyArIEtCQ19UT19DTlRfMCk7CisKKwkJdGVncmFfa2JjX3NldHVwX3dha2VrZXlzKGtiYywgdHJ1ZSk7CiAJCW1zbGVlcCgzMCk7CisKKwkJZW5hYmxlX2lycV93YWtlKGtiYy0+aXJxKTsKIAl9IGVsc2UgewotCQltdXRleF9sb2NrKCZrYmMtPmlkZXYtPm11dGV4KTsKIAkJaWYgKGtiYy0+aWRldi0+dXNlcnMpCiAJCQl0ZWdyYV9rYmNfc3RvcChrYmMpOwotCQltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCX0KKwltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NTYsMTUgKzc3MCwyMiBAQAogCXN0cnVjdCB0ZWdyYV9rYmMgKmtiYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBlcnIgPSAwOwogCisJbXV0ZXhfbG9jaygma2JjLT5pZGV2LT5tdXRleCk7CiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCWRpc2FibGVfaXJxX3dha2Uoa2JjLT5pcnEpOwogCQl0ZWdyYV9rYmNfc2V0dXBfd2FrZWtleXMoa2JjLCBmYWxzZSk7CisKKwkJLyogUmVzdG9yZSB0aGUgcmVzaWRlbnQgdGltZSBvZiBjb250aW51b3VzIHBvbGxpbmcgbW9kZS4gKi8KKwkJd3JpdGVsKGtiYy0+Y3BfdG9fd2t1cF9kbHksIGtiYy0+bW1pbyArIEtCQ19UT19DTlRfMCk7CisKKwkJdGVncmFfa2JjX3NldF9maWZvX2ludGVycnVwdChrYmMsIHRydWUpOworCisJCWVuYWJsZV9pcnEoa2JjLT5pcnEpOwogCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCQlpZiAoa2JjLT5pZGV2LT51c2VycykKIAkJCWVyciA9IHRlZ3JhX2tiY19zdGFydChrYmMpOwotCQltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCX0KKwltdXRleF91bmxvY2soJmtiYy0+aWRldi0+bXV0ZXgpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdG5ldHYxMDd4LWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKaW5kZXggMWM1ODY4MS4uNjZlNTVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90bmV0djEwN3gta2V5cGFkLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBCSVRTKHgpCQkJKEJJVCh4KSAtIDEpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdzkwcDkxMF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdzkwcDkxMF9rZXlwYWQuYwppbmRleCBlZTJiZjZiLi4zMTg1ODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3c5MHA5MTBfa2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC93OTBwOTEwX2tleXBhZC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJCQkgICBpbnB1dF9kZXYtPmtleWNvZGUsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoa2V5cGFkLT5pcnEsIHc5MHA5MTBfa2V5cGFkX2lycV9oYW5kbGVyLAotCQkJICAgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGtleXBhZCk7CisJCQkgICAgMCwgcGRldi0+bmFtZSwga2V5cGFkKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKIAkJZ290byBmYWlsZWRfcHV0X2NsazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKaW5kZXggYzkxMDRiYi4uMjJkODc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKQEAgLTYyLDYgKzYyLDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDcxNHgtc3BpLgogCitjb25maWcgSU5QVVRfQk1BMTUwCisJdHJpc3RhdGUgIkJNQTE1MC9TTUIzODAgYWNjZWxlcmF0aW9uIHNlbnNvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElOUFVUX1BPTExERVYKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEJvc2NoIFNlbnNvcnRlYydzIEJNQTE1MCBvciBTTUIzODAKKwkgIGFjY2VsZXJhdGlvbiBzZW5zb3IgaG9va2VkIHRvIGFuIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJtYTE1MC4KKwogY29uZmlnIElOUFVUX1BDU1BLUgogCXRyaXN0YXRlICJQQyBTcGVha2VyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ1NQS1JfUExBVEZPUk0KQEAgLTc0LDYgKzg1LDI5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwY3Nwa3IuCiAKK2NvbmZpZyBJTlBVVF9QTThYWFhfVklCUkFUT1IKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gUE04WFhYIHZpYnJhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNRkRfUE04WFhYCisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIHZpYnJhdG9yCisJICBvbiBRdWFsY29tbSBQTTh4eHggY2hpcC4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgZmYtbWVtbGVzcyBpbnRlcmZhY2UKKwkgIGZyb20gaW5wdXQgZnJhbWV3b3JrLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcG04eHh4LXZpYnJhdG9yLgorCitjb25maWcgSU5QVVRfUE1JQzhYWFhfUFdSS0VZCisJdHJpc3RhdGUgIlBNSUM4WFhYIHBvd2VyIGtleSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX1BNOFhYWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIFBNSUM4WFhYIHBvd2VyIGtleS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcG1pYzh4eHgtcHdya2V5LgorCiBjb25maWcgSU5QVVRfU1BBUkNTUEtSCiAJdHJpc3RhdGUgIlNQQVJDIFNwZWFrZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTUEFSQzY0CkBAIC0xMDAsNiArMTM0LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtYXg4OTI1X29ua2V5LgogCitjb25maWcgSU5QVVRfTUMxMzc4M19QV1JCVVRUT04KKwl0cmlzdGF0ZSAiTUMxMzc4MyBPTiBidXR0b25zIgorCWRlcGVuZHMgb24gTUZEX01DMTM3ODMKKwloZWxwCisJICBTdXBwb3J0IHRoZSBPTiBidXR0b25zIG9mIE1DMTM3ODMgUE1JQyBhcyBhbiBpbnB1dCBkZXZpY2UKKwkgIHJlcG9ydGluZyBwb3dlciBidXR0b24gc3RhdHVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYzEzNzgzLXB3cmJ1dHRvbi4KKwogY29uZmlnIElOUFVUX01NQTg0NTAKIAl0cmlzdGF0ZSAiTU1BODQ1MCAtIEZyZWVzY2FsZSdzIDMtQXhpcywgOC8xMi1iaXQgRGlnaXRhbCBBY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xODMsMjIgKzIyNyw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBhdGxhc19idG5zLgogCi1jb25maWcgSU5QVVRfQVRJX1JFTU9URQotCXRyaXN0YXRlICJBVEkgLyBYMTAgVVNCIFJGIHJlbW90ZSBjb250cm9sIgotCWRlcGVuZHMgb24gVVNCX0FSQ0hfSEFTX0hDRAotCXNlbGVjdCBVU0IKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBBVEkgb3IgWDEwICJMb2xhIiBVU0IgcmVtb3RlIGNvbnRyb2wuCi0JICBUaGVzZSBhcmUgUkYgcmVtb3RlcyB3aXRoIFVTQiByZWNlaXZlcnMuCi0JICBUaGUgQVRJIHJlbW90ZSBjb21lcyB3aXRoIG1hbnkgb2YgQVRJJ3MgQWxsLUluLVdvbmRlciB2aWRlbyBjYXJkcy4KLQkgIFRoZSBYMTAgIkxvbGEiIHJlbW90ZSBpcyBhdmFpbGFibGUgYXQ6Ci0JICAgICA8aHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bT4KLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIG1vdXNlIHBvaW50ZXIsIGxlZnQgYW5kIHJpZ2h0IG1vdXNlIGJ1dHRvbnMsCi0JICBhbmQgbWFwcyBhbGwgdGhlIG90aGVyIHJlbW90ZSBidXR0b25zIHRvIGtleXByZXNzIGV2ZW50cy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgYXRpX3JlbW90ZS4KLQogY29uZmlnIElOUFVUX0FUSV9SRU1PVEUyCiAJdHJpc3RhdGUgIkFUSSAvIFBoaWxpcHMgVVNCIFJGIHJlbW90ZSBjb250cm9sIgogCWRlcGVuZHMgb24gVVNCX0FSQ0hfSEFTX0hDRApAQCAtMzc5LDE3ICs0MDcsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgcHdtLWJlZXBlci4KIAotY29uZmlnIElOUFVUX1BNSUM4WFhYX1BXUktFWQotCXRyaXN0YXRlICJQTUlDOFhYWCBwb3dlciBrZXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1GRF9QTThYWFgKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBQTUlDOFhYWCBwb3dlciBrZXkuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBtaWM4eHh4LXB3cmtleS4KLQogY29uZmlnIElOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIKIAl0cmlzdGF0ZSAiUm90YXJ5IGVuY29kZXJzIGNvbm5lY3RlZCB0byBHUElPIHBpbnMiCiAJZGVwZW5kcyBvbiBHUElPTElCICYmIEdFTkVSSUNfR1BJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCmluZGV4IDI5OWFkNWUuLmEyNDRmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKQEAgLTEzLDEwICsxMywxMCBAQAogb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfSTJDKQkJKz0gYWR4bDM0eC1pMmMubwogb2JqLSQoQ09ORklHX0lOUFVUX0FEWEwzNFhfU1BJKQkJKz0gYWR4bDM0eC1zcGkubwogb2JqLSQoQ09ORklHX0lOUFVUX0FQQU5FTCkJCSs9IGFwYW5lbC5vCi1vYmotJChDT05GSUdfSU5QVVRfQVRJX1JFTU9URSkJCSs9IGF0aV9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyKQkJKz0gYXRpX3JlbW90ZTIubwogb2JqLSQoQ09ORklHX0lOUFVUX0FUTEFTX0JUTlMpCQkrPSBhdGxhc19idG5zLm8KIG9iai0kKENPTkZJR19JTlBVVF9CRklOX1JPVEFSWSkJCSs9IGJmaW5fcm90YXJ5Lm8KK29iai0kKENPTkZJR19JTlBVVF9CTUExNTApCQkrPSBibWExNTAubwogb2JqLSQoQ09ORklHX0lOUFVUX0NNMTA5KQkJKz0gY20xMDkubwogb2JqLSQoQ09ORklHX0lOUFVUX0NNQTMwMDApCQkrPSBjbWEzMDAwX2QweC5vCiBvYmotJChDT05GSUdfSU5QVVRfQ01BMzAwMF9JMkMpCQkrPSBjbWEzMDAwX2QweF9pMmMubwpAQCAtMjgsMTUgKzI4LDE3IEBACiBvYmotJChDT05GSUdfSU5QVVRfS1hUSjkpCQkrPSBreHRqOS5vCiBvYmotJChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQkJKz0gbTY4a3Nwa3Iubwogb2JqLSQoQ09ORklHX0lOUFVUX01BWDg5MjVfT05LRVkpCSs9IG1heDg5MjVfb25rZXkubworb2JqLSQoQ09ORklHX0lOUFVUX01DMTM3ODNfUFdSQlVUVE9OKQkrPSBtYzEzNzgzLXB3cmJ1dHRvbi5vCiBvYmotJChDT05GSUdfSU5QVVRfTU1BODQ1MCkJCSs9IG1tYTg0NTAubwogb2JqLSQoQ09ORklHX0lOUFVUX01QVTMwNTApCQkrPSBtcHUzMDUwLm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0FQKQkJKz0gcGNhcF9rZXlzLm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y1MDYzM19QTVUpCSs9IHBjZjUwNjMzLWlucHV0Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y4NTc0KQkJKz0gcGNmODU3NF9rZXlwYWQubwogb2JqLSQoQ09ORklHX0lOUFVUX1BDU1BLUikJCSs9IHBjc3Brci5vCitvYmotJChDT05GSUdfSU5QVVRfUE04WFhYX1ZJQlJBVE9SKQkrPSBwbTh4eHgtdmlicmF0b3Iubworb2JqLSQoQ09ORklHX0lOUFVUX1BNSUM4WFhYX1BXUktFWSkJKz0gcG1pYzh4eHgtcHdya2V5Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QT1dFUk1BVEUpCQkrPSBwb3dlcm1hdGUubwogb2JqLSQoQ09ORklHX0lOUFVUX1BXTV9CRUVQRVIpCQkrPSBwd20tYmVlcGVyLm8KLW9iai0kKENPTkZJR19JTlBVVF9QTUlDOFhYWF9QV1JLRVkpCSs9IHBtaWM4eHh4LXB3cmtleS5vCiBvYmotJChDT05GSUdfSU5QVVRfUkI1MzJfQlVUVE9OKQkrPSByYjUzMl9idXR0b24ubwogb2JqLSQoQ09ORklHX0lOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIpCSs9IHJvdGFyeV9lbmNvZGVyLm8KIG9iai0kKENPTkZJR19JTlBVVF9TR0lfQlROUykJCSs9IHNnaV9idG5zLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHgtaTJjLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LWkyYy5jCmluZGV4IDAyNTQxN2QuLjU2ODEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHgtaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC1pMmMuYwpAQCAtMTE2LDEzICsxMTYsMTMgQEAKIAkuaWRfdGFibGUgPSBhZDcxNHhfaWQsCiB9OwogCi1zdGF0aWMgX19pbml0IGludCBhZDcxNHhfaTJjX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFkNzE0eF9pMmNfaW5pdCh2b2lkKQogewogCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTR4X2kyY19kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoYWQ3MTR4X2kyY19pbml0KTsKIAotc3RhdGljIF9fZXhpdCB2b2lkIGFkNzE0eF9pMmNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGFkNzE0eF9pMmNfZXhpdCh2b2lkKQogewogCWkyY19kZWxfZHJpdmVyKCZhZDcxNHhfaTJjX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvYWQ3MTR4LmMKaW5kZXggY2E0MmM3ZC4uMGFjNzViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2FkNzE0eC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHguYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9hZDcxNHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhZDcxNHguaCIKIAogI2RlZmluZSBBRDcxNFhfUFdSX0NUUkwgICAgICAgICAgIDB4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LmMKaW5kZXggMTQ0ZGRiZC4uMDkyNDQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2FkeGwzNHguYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYWR4bDM0eC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2FkeGwzNHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImFkeGwzNHguaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTU3MTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDg2NyArMCwwIEBACi0vKgotICogIFVTQiBBVEkgUmVtb3RlIHN1cHBvcnQKLSAqCi0gKiAgVmVyc2lvbiAyLjIuMCBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KLSAqICBWZXJzaW9uIDIuMS4xIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKLSAqCi0gKiAgVGhpcyAyLjIuMCB2ZXJzaW9uIGlzIGEgcmV3cml0ZSAvIGNsZWFudXAgb2YgdGhlIDIuMS4xIGRyaXZlciwgaW5jbHVkaW5nCi0gKiAgcG9ydGluZyB0byB0aGUgMi42IGtlcm5lbCBpbnRlcmZhY2VzLCBhbG9uZyB3aXRoIG90aGVyIG1vZGlmaWNhdGlvbgotICogIHRvIGJldHRlciBtYXRjaCB0aGUgc3R5bGUgb2YgdGhlIGV4aXN0aW5nIHVzYi9pbnB1dCBkcml2ZXJzLiAgSG93ZXZlciwgdGhlCi0gKiAgcHJvdG9jb2wgYW5kIGhhcmR3YXJlIGhhbmRsaW5nIGlzIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIDIuMS4xLgotICoKLSAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5Ci0gKiAgVm9qdGVjaCBQYXZsaWsuCi0gKgotICogIENoYW5nZXM6Ci0gKgotICogIEZlYiAyMDA0OiBUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PgotICogICAgICAgICAgICBWZXJzaW9uIDIuMi4wCi0gKiAgSnVuIDIwMDQ6IFRvcnJleSBIb2ZmbWFuIDx0aG9mZm1hbkBhcm5vci5uZXQ+Ci0gKiAgICAgICAgICAgIFZlcnNpb24gMi4yLjEKLSAqICAgICAgICAgICAgQWRkZWQga2V5IHJlcGVhdCBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5OgotICogICAgICAgICAgICAgICAgVmluY2VudCBWYW5hY2tlcmUgPHZhbmFja2VyZUBsaWYudW5pdi1tcnMuZnI+Ci0gKiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSAiTG9sYSIgcmVtb3RlIGNvbnRyaWJ1dGVkIGJ5OgotICogICAgICAgICAgICAgICAgU2V0aCBDb2huIDxzZXRoY29obkB5YWhvby5jb20+Ci0gKgotICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgotICoKLSAqIEhhcmR3YXJlICYgc29mdHdhcmUgbm90ZXMKLSAqCi0gKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyCi0gKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYQotICogIlVTQiBSZWNlaXZlciIgd2l0aCBtYW51ZmFjdHVyZXIgIlgxMCBXaXJlbGVzcyBUZWNobm9sb2d5IEluYyIuCi0gKgotICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOgotICogICAgaHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bQotICogVGhlIExvbGEgaXMgc2ltaWxhciB0byB0aGUgQVRJIHJlbW90ZSBidXQgaGFzIG5vIG1vdXNlIHN1cHBvcnQsIGFuZCBzbGlnaHRseQotICogZGlmZmVyZW50IGtleXMuCi0gKgotICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMKLSAqIHNpbXVsdGFuZW91c2x5IGJ5IGNvbmZpZ3VyaW5nIHRoZW0gdG8gdXNlIHNwZWNpZmljIGNoYW5uZWxzLgotICoKLSAqIFRoZSBSRiBwcm90b2NvbCB1c2VkIGJ5IHRoZSByZW1vdGUgc3VwcG9ydHMgMTYgZGlzdGluY3QgY2hhbm5lbHMsIDEgdG8gMTYuCi0gKiBBY3R1YWxseSwgaXQgbWF5IGV2ZW4gc3VwcG9ydCBtb3JlLCBhdCBsZWFzdCBpbiBzb21lIHJldmlzaW9ucyBvZiB0aGUKLSAqIGhhcmR3YXJlLgotICoKLSAqIEVhY2ggcmVtb3RlIGNhbiBiZSBjb25maWd1cmVkIHRvIHRyYW5zbWl0IG9uIG9uZSBjaGFubmVsIGFzIGZvbGxvd3M6Ci0gKiAgIC0gUHJlc3MgYW5kIGhvbGQgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KLSAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uCi0gKiAgIC0gV2hlbiBpdCBzdG9wcyBibGlua2luZywgaW5wdXQgdGhlIGNoYW5uZWwgY29kZSBhcyB0d28gZGlnaXRzLCBmcm9tIDAxCi0gKiAgICAgdG8gMTYsIGFuZCBwcmVzcyB0aGUgaGFuZCBpY29uIGFnYWluLgotICoKLSAqIFRoZSB0aW1pbmcgY2FuIGJlIGEgbGl0dGxlIHRyaWNreS4gIFRyeSBsb2FkaW5nIHRoZSBtb2R1bGUgd2l0aCBkZWJ1Zz0xCi0gKiB0byBoYXZlIHRoZSBrZXJuZWwgcHJpbnQgb3V0IG1lc3NhZ2VzIGFib3V0IHRoZSByZW1vdGUgY29udHJvbCBudW1iZXIKLSAqIGFuZCBtYXNrLiAgTm90ZTogZGVidWdnaW5nIHByaW50cyByZW1vdGUgbnVtYmVycyBhcyB6ZXJvLWJhc2VkIGhleGFkZWNpbWFsLgotICoKLSAqIFRoZSBkcml2ZXIgaGFzIGEgImNoYW5uZWxfbWFzayIgcGFyYW1ldGVyLiBUaGlzIGJpdG1hc2sgc3BlY2lmaWVzIHdoaWNoCi0gKiBjaGFubmVscyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1vZHVsZS4gIFRvIG1hc2sgb3V0IGNoYW5uZWxzLCBqdXN0IGFkZAotICogYWxsIHRoZSAyXmNoYW5uZWxfbnVtYmVyIHZhbHVlcyB0b2dldGhlci4KLSAqCi0gKiBGb3IgaW5zdGFuY2UsIHNldCBjaGFubmVsX21hc2sgPSAyXjQgPSAxNiAoYmluYXJ5IDEwMDAwKSB0byBtYWtlIGF0aV9yZW1vdGUKLSAqIGlnbm9yZSBzaWduYWxzIGNvbWluZyBmcm9tIHJlbW90ZSBjb250cm9scyB0cmFuc21pdHRpbmcgb24gY2hhbm5lbCA0LCBidXQKLSAqIGFjY2VwdCBhbGwgb3RoZXIgY2hhbm5lbHMuCi0gKgotICogT3IsIHNldCBjaGFubmVsX21hc2sgPSA2NTUzMywgKDB4RkZGRCksIGFuZCBhbGwgY2hhbm5lbHMgZXhjZXB0IDEgd2lsbCBiZQotICogaWdub3JlZC4KLSAqCi0gKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMKLSAqIHBhcmFtZXRlciBhcmUgdW51c2VkLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0KLS8qCi0gKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24sIE1vZHVsZSBQYXJhbWV0ZXJzCi0gKi8KLQotI2RlZmluZSBBVElfUkVNT1RFX1ZFTkRPUl9JRAkJMHgwYmM3Ci0jZGVmaW5lIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQJCTB4MDAwMgotI2RlZmluZSBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDAzCi0jZGVmaW5lIEFUSV9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDA0Ci0jZGVmaW5lIE5WSURJQV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwMDUKLSNkZWZpbmUgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwNgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSAgICAgICAgIjIuMi4xIgotI2RlZmluZSBEUklWRVJfQVVUSE9SICAgICAgICAgICAiVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgICAgICJBVEkvWDEwIFJGIFVTQiBSZW1vdGUgQ29udHJvbCIKLQotI2RlZmluZSBOQU1FX0JVRlNJWkUgICAgICA4MCAgICAvKiBzaXplIG9mIHByb2R1Y3QgbmFtZSwgcGF0aCBidWZmZXJzICovCi0jZGVmaW5lIERBVEFfQlVGU0laRSAgICAgIDYzICAgIC8qIHNpemUgb2YgVVJCIGRhdGEgYnVmZmVycyAqLwotCi0vKgotICogRHVwbGljYXRlIGV2ZW50IGZpbHRlcmluZyB0aW1lLgotICogU2VxdWVudGlhbCwgaWRlbnRpY2FsIEtJTkRfRklMVEVSRUQgaW5wdXRzIHdpdGggbGVzcyB0aGFuCi0gKiBGSUxURVJfVElNRSBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGVtIGFyZSBjb25zaWRlcmVkIGFzIHJlcGVhdAotICogZXZlbnRzLiBUaGUgaGFyZHdhcmUgZ2VuZXJhdGVzIDUgZXZlbnRzIGZvciB0aGUgZmlyc3Qga2V5cHJlc3MKLSAqIGFuZCB3ZSBoYXZlIHRvIHRha2UgdGhpcyBpbnRvIGFjY291bnQgZm9yIGFuIGFjY3VyYXRlIHJlcGVhdAotICogYmVoYXZpb3VyLgotICovCi0jZGVmaW5lIEZJTFRFUl9USU1FCTYwIC8qIG1zZWMgKi8KLSNkZWZpbmUgUkVQRUFUX0RFTEFZCTUwMCAvKiBtc2VjICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoYW5uZWxfbWFzazsKLW1vZHVsZV9wYXJhbShjaGFubmVsX21hc2ssIHVsb25nLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbF9tYXNrLCAiQml0bWFzayBvZiByZW1vdGUgY29udHJvbCBjaGFubmVscyB0byBpZ25vcmUiKTsKLQotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZXh0cmEgZGVidWcgbWVzc2FnZXMgYW5kIGluZm9ybWF0aW9uIik7Ci0KLXN0YXRpYyBpbnQgcmVwZWF0X2ZpbHRlciA9IEZJTFRFUl9USU1FOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9maWx0ZXIsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlcGVhdF9maWx0ZXIsICJSZXBlYXQgZmlsdGVyIHRpbWUsIGRlZmF1bHQgPSA2MCBtc2VjIik7Ci0KLXN0YXRpYyBpbnQgcmVwZWF0X2RlbGF5ID0gUkVQRUFUX0RFTEFZOwotbW9kdWxlX3BhcmFtKHJlcGVhdF9kZWxheSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmVwZWF0X2RlbGF5LCAiRGVsYXkgYmVmb3JlIHNlbmRpbmcgcmVwZWF0cywgZGVmYXVsdCA9IDUwMCBtc2VjIik7Ci0KLSNkZWZpbmUgZGJnaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0ICwgIyMgYXJnKQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRpX3JlbW90ZV90YWJsZVtdID0gewotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRCkgfSwKLQl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIExPTEEyX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgQVRJX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTlZJRElBX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lEKSB9LAotCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYXRpX3JlbW90ZV90YWJsZSk7Ci0KLS8qIEdldCBoaSBhbmQgbG93IGJ5dGVzIG9mIGEgMTYtYml0cyBpbnQgKi8KLSNkZWZpbmUgSEkoYSkJKCh1bnNpZ25lZCBjaGFyKSgoYSkgPj4gOCkpCi0jZGVmaW5lIExPKGEpCSgodW5zaWduZWQgY2hhcikoKGEpICYgMHhmZikpCi0KLSNkZWZpbmUgU0VORF9GTEFHX0lOX1BST0dSRVNTCTEKLSNkZWZpbmUgU0VORF9GTEFHX0NPTVBMRVRFCTIKLQotLyogRGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KLXN0YXRpYyBjaGFyIGluaXQxW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQgfTsKLXN0YXRpYyBjaGFyIGluaXQyW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4MjAsIDB4MjAsIDB4MjAgfTsKLQotc3RydWN0IGF0aV9yZW1vdGUgewotCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQotCXN0cnVjdCB1cmIgKmlycV91cmI7Ci0Jc3RydWN0IHVyYiAqb3V0X3VyYjsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50X2luOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfb3V0OwotCXVuc2lnbmVkIGNoYXIgKmluYnVmOwotCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZjsKLQlkbWFfYWRkcl90IGluYnVmX2RtYTsKLQlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7Ci0KLQl1bnNpZ25lZCBjaGFyIG9sZF9kYXRhWzJdOyAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBldmVudHMgKi8KLQl1bnNpZ25lZCBsb25nIG9sZF9qaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgYWNjX2ppZmZpZXM7ICAvKiBoYW5kbGUgYWNjZWxlcmF0aW9uICovCi0JdW5zaWduZWQgbG9uZyBmaXJzdF9qaWZmaWVzOwotCi0JdW5zaWduZWQgaW50IHJlcGVhdF9jb3VudDsKLQotCWNoYXIgbmFtZVtOQU1FX0JVRlNJWkVdOwotCWNoYXIgcGh5c1tOQU1FX0JVRlNJWkVdOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlpbnQgc2VuZF9mbGFnczsKLX07Ci0KLS8qICJLaW5kcyIgb2YgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBoYXJkd2FyZSB0byB0aGUgZHJpdmVyLiAqLwotI2RlZmluZSBLSU5EX0VORCAgICAgICAgMAotI2RlZmluZSBLSU5EX0xJVEVSQUwgICAgMSAgIC8qIFNpbXBseSBwYXNzIHRvIGlucHV0IHN5c3RlbSAqLwotI2RlZmluZSBLSU5EX0ZJTFRFUkVEICAgMiAgIC8qIEFkZCBhcnRpZmljaWFsIGtleS11cCBldmVudHMsIGRyb3Aga2V5cmVwZWF0cyAqLwotI2RlZmluZSBLSU5EX0xVICAgICAgICAgMyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCBkaWFnb25hbHMgLSBsZWZ0IHVwLCAqLwotI2RlZmluZSBLSU5EX1JVICAgICAgICAgNCAgIC8qICAgcmlnaHQgdXAsICAqLwotI2RlZmluZSBLSU5EX0xEICAgICAgICAgNSAgIC8qICAgbGVmdCBkb3duLCAqLwotI2RlZmluZSBLSU5EX1JEICAgICAgICAgNiAgIC8qICAgcmlnaHQgZG93biAqLwotI2RlZmluZSBLSU5EX0FDQ0VMICAgICAgNyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCAtIGxlZnQsIHJpZ2h0LCB1cCwgZG93bi4qLwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmcm9tIGhhcmR3YXJlIG1lc3NhZ2VzIHRvIGlucHV0IGV2ZW50cy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXNob3J0IGtpbmQ7Ci0JdW5zaWduZWQgY2hhciBkYXRhMSwgZGF0YTI7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgaW50IGNvZGU7Ci0JaW50IHZhbHVlOwotfSAgYXRpX3JlbW90ZV90YmxbXSA9IHsKLQkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBheGVzICovCi0Je0tJTkRfQUNDRUwsICAgMHgzNSwgMHg3MCwgRVZfUkVMLCBSRUxfWCwgLTF9LAkgLyogbGVmdCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzYsIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzcsIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwJIC8qIHVwICovCi0Je0tJTkRfQUNDRUwsICAgMHgzOCwgMHg3MywgRVZfUkVMLCBSRUxfWSwgMX0sICAgIC8qIGRvd24gKi8KLQkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBkaWFnb25hbHMgKi8KLQl7S0lORF9MVSwgICAgICAweDM5LCAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLwotCXtLSU5EX1JVLCAgICAgIDB4M2EsIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLwotCXtLSU5EX0xELCAgICAgIDB4M2MsIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KLQl7S0lORF9SRCwgICAgICAweDNiLCAweDc2LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgZG93biAqLwotCi0JLyogIk1vdXNlIGJ1dHRvbiIgYnV0dG9ucyAqLwotCXtLSU5EX0xJVEVSQUwsIDB4M2QsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHgzZSwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCi0Je0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLwotCi0JLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KLQkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCi0Je0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCi0Je0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLwotCi0JLyoga2V5Ym9hcmQuICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDIsIDB4MGQsIEVWX0tFWSwgS0VZXzEsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQzLCAweDBlLCBFVl9LRVksIEtFWV8yLCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkNCwgMHgwZiwgRVZfS0VZLCBLRVlfMywgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDUsIDB4MTAsIEVWX0tFWSwgS0VZXzQsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQ2LCAweDExLCBFVl9LRVksIEtFWV81LCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkNywgMHgxMiwgRVZfS0VZLCBLRVlfNiwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZDgsIDB4MTMsIEVWX0tFWSwgS0VZXzcsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGQ5LCAweDE0LCBFVl9LRVksIEtFWV84LCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhkYSwgMHgxNSwgRVZfS0VZLCBLRVlfOSwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZGMsIDB4MTcsIEVWX0tFWSwgS0VZXzAsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGM1LCAweDAwLCBFVl9LRVksIEtFWV9BLCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhjNiwgMHgwMSwgRVZfS0VZLCBLRVlfQiwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZGUsIDB4MTksIEVWX0tFWSwgS0VZX0MsIDF9LAotCXtLSU5EX0ZJTFRFUkVELCAweGUwLCAweDFiLCBFVl9LRVksIEtFWV9ELCAxfSwKLQl7S0lORF9GSUxURVJFRCwgMHhlNiwgMHgyMSwgRVZfS0VZLCBLRVlfRSwgMX0sCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTgsIDB4MjMsIEVWX0tFWSwgS0VZX0YsIDF9LAotCi0JLyogInNwZWNpYWwiIGtleXMgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkZCwgMHgxOCwgRVZfS0VZLCBLRVlfS1BFTlRFUiwgMX0sICAgIC8qICJjaGVjayIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkYiwgMHgxNiwgRVZfS0VZLCBLRVlfTUVOVSwgMX0sICAgICAgIC8qICJtZW51IiAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGM3LCAweDAyLCBFVl9LRVksIEtFWV9QT1dFUiwgMX0sICAgICAgLyogUG93ZXIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjOCwgMHgwMywgRVZfS0VZLCBLRVlfVFYsIDF9LCAgICAgICAgIC8qIFRWICovCi0Je0tJTkRfRklMVEVSRUQsIDB4YzksIDB4MDQsIEVWX0tFWSwgS0VZX0RWRCwgMX0sICAgICAgICAvKiBEVkQgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjYSwgMHgwNSwgRVZfS0VZLCBLRVlfV1dXLCAxfSwgICAgICAgIC8qIFdFQiAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGNiLCAweDA2LCBFVl9LRVksIEtFWV9CT09LTUFSS1MsIDF9LCAgLyogImJvb2siICovCi0Je0tJTkRfRklMVEVSRUQsIDB4Y2MsIDB4MDcsIEVWX0tFWSwgS0VZX0VESVQsIDF9LCAgICAgICAvKiAiaGFuZCIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlMSwgMHgxYywgRVZfS0VZLCBLRVlfQ09GRkVFLCAxfSwgICAgIC8qICJ0aW1lciIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlNSwgMHgyMCwgRVZfS0VZLCBLRVlfRlJPTlQsIDF9LCAgICAgIC8qICJtYXgiICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTIsIDB4MWQsIEVWX0tFWSwgS0VZX0xFRlQsIDF9LCAgICAgICAvKiBsZWZ0ICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTQsIDB4MWYsIEVWX0tFWSwgS0VZX1JJR0hULCAxfSwgICAgICAvKiByaWdodCAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGU3LCAweDIyLCBFVl9LRVksIEtFWV9ET1dOLCAxfSwgICAgICAgLyogZG93biAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGRmLCAweDFhLCBFVl9LRVksIEtFWV9VUCwgMX0sICAgICAgICAgLyogdXAgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlMywgMHgxZSwgRVZfS0VZLCBLRVlfT0ssIDF9LCAgICAgICAgIC8qICJPSyIgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhjZSwgMHgwOSwgRVZfS0VZLCBLRVlfVk9MVU1FRE9XTiwgMX0sIC8qIFZPTCArICovCi0Je0tJTkRfRklMVEVSRUQsIDB4Y2QsIDB4MDgsIEVWX0tFWSwgS0VZX1ZPTFVNRVVQLCAxfSwgICAvKiBWT0wgLSAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGNmLCAweDBhLCBFVl9LRVksIEtFWV9NVVRFLCAxfSwgICAgICAgLyogTVVURSAgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkMCwgMHgwYiwgRVZfS0VZLCBLRVlfQ0hBTk5FTFVQLCAxfSwgIC8qIENIICsgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhkMSwgMHgwYywgRVZfS0VZLCBLRVlfQ0hBTk5FTERPV04sIDF9LC8qIENIIC0gKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlYywgMHgyNywgRVZfS0VZLCBLRVlfUkVDT1JELCAxfSwgICAgIC8qICggbykgcmVkICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWEsIDB4MjUsIEVWX0tFWSwgS0VZX1BMQVksIDF9LCAgICAgICAvKiAoID4pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZTksIDB4MjQsIEVWX0tFWSwgS0VZX1JFV0lORCwgMX0sICAgICAvKiAoPDwpICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWIsIDB4MjYsIEVWX0tFWSwgS0VZX0ZPUldBUkQsIDF9LCAgICAvKiAoPj4pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWQsIDB4MjgsIEVWX0tFWSwgS0VZX1NUT1AsIDF9LCAgICAgICAvKiAoW10pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWUsIDB4MjksIEVWX0tFWSwgS0VZX1BBVVNFLCAxfSwgICAgICAvKiAoJycpICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjAsIDB4MmIsIEVWX0tFWSwgS0VZX1BSRVZJT1VTLCAxfSwgICAvKiAoPC0pICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZWYsIDB4MmEsIEVWX0tFWSwgS0VZX05FWFQsIDF9LCAgICAgICAvKiAoPispICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjIsIDB4MkQsIEVWX0tFWSwgS0VZX0lORk8sIDF9LCAgICAgICAvKiBQTEFZSU5HICovCi0Je0tJTkRfRklMVEVSRUQsIDB4ZjMsIDB4MkUsIEVWX0tFWSwgS0VZX0hPTUUsIDF9LCAgICAgICAvKiBUT1AgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhmNCwgMHgyRiwgRVZfS0VZLCBLRVlfRU5ELCAxfSwgICAgICAgIC8qIEVORCAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGY1LCAweDMwLCBFVl9LRVksIEtFWV9TRUxFQ1QsIDF9LCAgICAgLyogU0VMRUNUICovCi0KLQl7S0lORF9FTkQsIDB4MDAsIDB4MDAsIEVWX01BWCArIDEsIDAsIDB9Ci19OwotCi0vKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfb3BlbgkJKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfY2xvc2UJCShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldik7Ci1zdGF0aWMgaW50IGF0aV9yZW1vdGVfc2VuZHBhY2tldAkoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUsIHUxNiBjbWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpOwotc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pcnFfb3V0CQkoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaXJxX2luCQkoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfcmVwb3J0CShzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIGludCBhdGlfcmVtb3RlX2luaXRpYWxpemUJKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKTsKLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9wcm9iZQkJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QJKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOwotCi0vKiB1c2Igc3BlY2lmaWMgb2JqZWN0IHRvIHJlZ2lzdGVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhdGlfcmVtb3RlX2RyaXZlciA9IHsKLQkubmFtZSAgICAgICAgID0gImF0aV9yZW1vdGUiLAotCS5wcm9iZSAgICAgICAgPSBhdGlfcmVtb3RlX3Byb2JlLAotCS5kaXNjb25uZWN0ICAgPSBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlICAgICA9IGF0aV9yZW1vdGVfdGFibGUsCi19OwotCi0vKgotICoJYXRpX3JlbW90ZV9kdW1wX2lucHV0Ci0gKi8KLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfZHVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkgICAgdW5zaWduZWQgaW50IGxlbikKLXsKLQlpZiAoKGxlbiA9PSAxKSAmJiAoZGF0YVswXSAhPSAodW5zaWduZWQgY2hhcikweGZmKSAmJiAoZGF0YVswXSAhPSAweDAwKSkKLQkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgYnl0ZSAweCUwMnhcbiIsIGRhdGFbMF0pOwotCWVsc2UgaWYgKGxlbiA9PSA0KQotCQlkZXZfd2FybihkZXYsICJXZWlyZCBrZXkgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkJICAgICBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKLQllbHNlCi0JCWRldl93YXJuKGRldiwgIldlaXJkIGRhdGEsIGxlbj0lZCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAuLi5cbiIsCi0JCSAgICAgbGVuLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdKTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfb3BlbgotICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKLXsKLQlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0ZGV2KTsKLQotCS8qIE9uIGZpcnN0IG9wZW4sIHN1Ym1pdCB0aGUgcmVhZCB1cmIgd2hpY2ggd2FzIHNldCB1cCBwcmV2aW91c2x5LiAqLwotCWF0aV9yZW1vdGUtPmlycV91cmItPmRldiA9IGF0aV9yZW1vdGUtPnVkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIsIEdGUF9LRVJORUwpKSB7Ci0JCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAotCQkJIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9jbG9zZQotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQotewotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRkZXYpOwotCi0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotfQotCi0vKgotICoJCWF0aV9yZW1vdGVfaXJxX291dAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gdXJiLT5jb250ZXh0OwotCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwKLQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzIHw9IFNFTkRfRkxBR19DT01QTEVURTsKLQl3bWIoKTsKLQl3YWtlX3VwKCZhdGlfcmVtb3RlLT53YWl0KTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfc2VuZHBhY2tldAotICoKLSAqCVVzZWQgdG8gc2VuZCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3RyaW5ncwotICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfc2VuZHBhY2tldChzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSwgdTE2IGNtZCwgdW5zaWduZWQgY2hhciAqZGF0YSkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCS8qIFNldCB1cCBvdXRfdXJiICovCi0JbWVtY3B5KGF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlciArIDEsIGRhdGEsIExPKGNtZCkpOwotCSgoY2hhciAqKSBhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIpWzBdID0gSEkoY21kKTsKLQotCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBMTyhjbWQpICsgMTsKLQlhdGlfcmVtb3RlLT5vdXRfdXJiLT5kZXYgPSBhdGlfcmVtb3RlLT51ZGV2OwotCWF0aV9yZW1vdGUtPnNlbmRfZmxhZ3MgPSBTRU5EX0ZMQUdfSU5fUFJPR1JFU1M7Ci0KLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAotCQkJICJzZW5kcGFja2V0OiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXdhaXRfZXZlbnRfdGltZW91dChhdGlfcmVtb3RlLT53YWl0LAotCQkoKGF0aV9yZW1vdGUtPm91dF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHx8Ci0JCQkoYXRpX3JlbW90ZS0+c2VuZF9mbGFncyAmIFNFTkRfRkxBR19DT01QTEVURSkpLAotCQlIWik7Ci0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfZXZlbnRfbG9va3VwCi0gKi8KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9ldmVudF9sb29rdXAoaW50IHJlbSwgdW5zaWduZWQgY2hhciBkMSwgdW5zaWduZWQgY2hhciBkMikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGVfdGJsW2ldLmtpbmQgIT0gS0lORF9FTkQ7IGkrKykgewotCQkvKgotCQkgKiBEZWNpZGUgaWYgdGhlIHRhYmxlIGVudHJ5IG1hdGNoZXMgdGhlIHJlbW90ZSBpbnB1dC4KLQkJICovCi0JCWlmICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSAmIDB4MGYpID09IChkMSAmIDB4MGYpKSkgJiYKLQkJICAgICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSA+PiA0KSAtCi0JCSAgICAgICAoZDEgPj4gNCkgKyByZW0pICYgMHgwZikgPT0gMHgwZikgJiYKLQkJICAgIChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMiA9PSBkMikpCi0JCQlyZXR1cm4gaTsKLQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX2NvbXB1dGVfYWNjZWwKLSAqCi0gKiBJbXBsZW1lbnRzIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgZGlyZWN0aW9uYWwgY29udHJvbCBwYWQKLSAqIElmIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IGV2ZW50IGlzID4gMS80IHNlY29uZCwgdXNlciAic3RvcHBlZCIsCi0gKiBzbyByZXNldCBhY2NlbGVyYXRpb24uIE90aGVyd2lzZSwgdXNlciBpcyBwcm9iYWJseSBob2xkaW5nIHRoZSBjb250cm9sCi0gKiBwYWQgZG93biwgc28gd2UgaW5jcmVhc2UgYWNjZWxlcmF0aW9uLCByYW1waW5nIHVwIG92ZXIgdHdvIHNlY29uZHMgdG8KLSAqIGEgbWF4aW11bSBzcGVlZC4KLSAqLwotc3RhdGljIGludCBhdGlfcmVtb3RlX2NvbXB1dGVfYWNjZWwoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgYWNjZWxbXSA9IHsgMSwgMiwgNCwgNiwgOSwgMTMsIDIwIH07Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCWludCBhY2M7Ci0KLQlpZiAodGltZV9hZnRlcihub3csIGF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKSkgewotCQlhY2MgPSAxOwotCQlhdGlfcmVtb3RlLT5hY2NfamlmZmllcyA9IG5vdzsKLQl9Ci0JZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTI1KSkpCi0JCWFjYyA9IGFjY2VsWzBdOwotCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCkpKQotCQlhY2MgPSBhY2NlbFsxXTsKLQllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApKSkKLQkJYWNjID0gYWNjZWxbMl07Ci0JZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKQotCQlhY2MgPSBhY2NlbFszXTsKLQllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxNTAwKSkpCi0JCWFjYyA9IGFjY2VsWzRdOwotCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKSkKLQkJYWNjID0gYWNjZWxbNV07Ci0JZWxzZQotCQlhY2MgPSBhY2NlbFs2XTsKLQotCXJldHVybiBhY2M7Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX3JlcG9ydF9pbnB1dAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X3JlcG9ydChzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YT0gYXRpX3JlbW90ZS0+aW5idWY7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gYXRpX3JlbW90ZS0+aWRldjsKLQlpbnQgaW5kZXgsIGFjYzsKLQlpbnQgcmVtb3RlX251bTsKLQotCS8qIERlYWwgd2l0aCBzdHJhbmdlIGxvb2tpbmcgaW5wdXRzICovCi0JaWYgKCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IDQpIHx8IChkYXRhWzBdICE9IDB4MTQpIHx8Ci0JCSgoZGF0YVszXSAmIDB4MGYpICE9IDB4MDApICkgewotCQlhdGlfcmVtb3RlX2R1bXAoJnVyYi0+ZGV2LT5kZXYsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBNYXNrIHVud2FudGVkIHJlbW90ZSBjaGFubmVscy4gICovCi0JLyogbm90ZTogcmVtb3RlX251bSBpcyAwLWJhc2VkLCBjaGFubmVsIDEgb24gcmVtb3RlID09IDAgaGVyZSAqLwotCXJlbW90ZV9udW0gPSAoZGF0YVszXSA+PiA0KSAmIDB4MGY7Ci0gICAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCAocmVtb3RlX251bSArIDEpKSkgewotCQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJCSJNYXNrZWQgaW5wdXQgZnJvbSBjaGFubmVsIDB4JTAyeDogZGF0YSAlMDJ4LCUwMngsIG1hc2s9IDB4JTAybHhcbiIsCi0JCQlyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdLCBjaGFubmVsX21hc2spOwotCQlyZXR1cm47Ci0JfQotCi0JLyogTG9vayB1cCBldmVudCBjb2RlIGluZGV4IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCi0JaW5kZXggPSBhdGlfcmVtb3RlX2V2ZW50X2xvb2t1cChyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdKTsKLQlpZiAoaW5kZXggPCAwKSB7Ci0JCWRldl93YXJuKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJCSAiVW5rbm93biBpbnB1dCBmcm9tIGNoYW5uZWwgMHglMDJ4OiBkYXRhICUwMngsJTAyeFxuIiwKLQkJCSByZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdKTsKLQkJcmV0dXJuOwotCX0KLQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKLQkJImNoYW5uZWwgMHglMDJ4OyBkYXRhICUwMngsJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCi0JCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIGluZGV4LCBhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSk7Ci0KLQlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9MSVRFUkFMKSB7Ci0JCWlucHV0X2V2ZW50KGRldiwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLnR5cGUsCi0JCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKLQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS52YWx1ZSk7Ci0JCWlucHV0X3N5bmMoZGV2KTsKLQotCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IGppZmZpZXM7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQgPT0gS0lORF9GSUxURVJFRCkgewotCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0KLQkJLyogRmlsdGVyIGR1cGxpY2F0ZSBldmVudHMgd2hpY2ggaGFwcGVuICJ0b28gY2xvc2UiIHRvZ2V0aGVyLiAqLwotCQlpZiAoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPT0gZGF0YVsxXSAmJgotCQkgICAgYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPT0gZGF0YVsyXSAmJgotCQkgICAgdGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArCi0JCQkJICAgICBtc2Vjc190b19qaWZmaWVzKHJlcGVhdF9maWx0ZXIpKSkgewotCQkJYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50Kys7Ci0JCX0gZWxzZSB7Ci0JCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPSAwOwotCQkJYXRpX3JlbW90ZS0+Zmlyc3RfamlmZmllcyA9IG5vdzsKLQkJfQotCi0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzBdID0gZGF0YVsxXTsKLQkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPSBkYXRhWzJdOwotCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IG5vdzsKLQotCQkvKiBFbnN1cmUgd2Ugc2tpcCBhdCBsZWFzdCB0aGUgNCBmaXJzdCBkdXBsaWNhdGUgZXZlbnRzIChnZW5lcmF0ZWQKLQkJICogYnkgYSBzaW5nbGUga2V5cHJlc3MpLCBhbmQgY29udGludWUgc2tpcHBpbmcgdW50aWwgcmVwZWF0X2RlbGF5Ci0JCSAqIG1zZWNzIGhhdmUgcGFzc2VkCi0JCSAqLwotCQlpZiAoYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50ID4gMCAmJgotCQkgICAgKGF0aV9yZW1vdGUtPnJlcGVhdF9jb3VudCA8IDUgfHwKLQkJICAgICB0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmZpcnN0X2ppZmZpZXMgKwotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMocmVwZWF0X2RlbGF5KSkpKQotCQkJcmV0dXJuOwotCi0KLQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKLQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhkZXYpOwotCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAotCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsIDApOwotCQlpbnB1dF9zeW5jKGRldik7Ci0KLQl9IGVsc2UgewotCi0JCS8qCi0JCSAqIE90aGVyIGV2ZW50IGtpbmRzIGFyZSBmcm9tIHRoZSBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCwgYW5kIGhhdmUgYW4KLQkJICogYWNjZWxlcmF0aW9uIGZhY3RvciBhcHBsaWVkIHRvIHRoZW0uICBXaXRob3V0IHRoaXMgYWNjZWxlcmF0aW9uLCB0aGUKLQkJICogY29udHJvbCBwYWQgaXMgbW9zdGx5IHVudXNhYmxlLgotCQkgKi8KLQkJYWNjID0gYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKGF0aV9yZW1vdGUpOwotCi0JCXN3aXRjaCAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQpIHsKLQkJY2FzZSBLSU5EX0FDQ0VMOgotCQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKLQkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKLQkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUgKiBhY2MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0lORF9MVToKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgLWFjYyk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIC1hY2MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0lORF9SVToKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgYWNjKTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgLWFjYyk7Ci0JCQlicmVhazsKLQkJY2FzZSBLSU5EX0xEOgotCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9YLCAtYWNjKTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgYWNjKTsKLQkJCWJyZWFrOwotCQljYXNlIEtJTkRfUkQ6Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGFjYyk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIGFjYyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiYXRpX3JlbW90ZSBraW5kPSVkXG4iLAotCQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kKTsKLQkJfQotCQlpbnB1dF9zeW5jKGRldik7Ci0KLQkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOwotCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07Ci0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKLQl9Ci19Ci0KLS8qCi0gKglhdGlfcmVtb3RlX2lycV9pbgotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHJldHZhbDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLwotCQlhdGlfcmVtb3RlX2lucHV0X3JlcG9ydCh1cmIpOwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQljYXNlIC1FTk9FTlQ6Ci0JY2FzZSAtRVNIVVRET1dOOgotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1cmIgZXJyb3Igc3RhdHVzLCB1bmxpbms/IFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCX0KLQotCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKLQkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIoKT0lZFxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzCi0gKi8KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCSAgICBzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKLXsKLQlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCBEQVRBX0JVRlNJWkUsIEdGUF9BVE9NSUMsCi0JCQkJCSAgICAgICAmYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKLQlpZiAoIWF0aV9yZW1vdGUtPmluYnVmKQotCQlyZXR1cm4gLTE7Ci0KLQlhdGlfcmVtb3RlLT5vdXRidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQodWRldiwgREFUQV9CVUZTSVpFLCBHRlBfQVRPTUlDLAotCQkJCQkgICAgICAgICZhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKLQlpZiAoIWF0aV9yZW1vdGUtPm91dGJ1ZikKLQkJcmV0dXJuIC0xOwotCi0JYXRpX3JlbW90ZS0+aXJxX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdGlfcmVtb3RlLT5pcnFfdXJiKQotCQlyZXR1cm4gLTE7Ci0KLQlhdGlfcmVtb3RlLT5vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF0aV9yZW1vdGUtPm91dF91cmIpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMKLSAqLwotc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCi17Ci0JdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLQotCXVzYl9mcmVlX2NvaGVyZW50KGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKLQkJYXRpX3JlbW90ZS0+aW5idWYsIGF0aV9yZW1vdGUtPmluYnVmX2RtYSk7Ci0KLQl1c2JfZnJlZV9jb2hlcmVudChhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCi0JCWF0aV9yZW1vdGUtPm91dGJ1ZiwgYXRpX3JlbW90ZS0+b3V0YnVmX2RtYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfaW5pdChzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gYXRpX3JlbW90ZS0+aWRldjsKLQlpbnQgaTsKLQotCWlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFTCk7Ci0JaWRldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9NT1VTRSldID0gQklUX01BU0soQlROX0xFRlQpIHwKLQkJQklUX01BU0soQlROX1JJR0hUKSB8IEJJVF9NQVNLKEJUTl9TSURFKSB8IEJJVF9NQVNLKEJUTl9FWFRSQSk7Ci0JaWRldi0+cmVsYml0WzBdID0gQklUX01BU0soUkVMX1gpIHwgQklUX01BU0soUkVMX1kpOwotCWZvciAoaSA9IDA7IGF0aV9yZW1vdGVfdGJsW2ldLmtpbmQgIT0gS0lORF9FTkQ7IGkrKykKLQkJaWYgKGF0aV9yZW1vdGVfdGJsW2ldLnR5cGUgPT0gRVZfS0VZKQotCQkJc2V0X2JpdChhdGlfcmVtb3RlX3RibFtpXS5jb2RlLCBpZGV2LT5rZXliaXQpOwotCi0JaW5wdXRfc2V0X2RydmRhdGEoaWRldiwgYXRpX3JlbW90ZSk7Ci0KLQlpZGV2LT5vcGVuID0gYXRpX3JlbW90ZV9vcGVuOwotCWlkZXYtPmNsb3NlID0gYXRpX3JlbW90ZV9jbG9zZTsKLQotCWlkZXYtPm5hbWUgPSBhdGlfcmVtb3RlLT5uYW1lOwotCWlkZXYtPnBoeXMgPSBhdGlfcmVtb3RlLT5waHlzOwotCi0JdXNiX3RvX2lucHV0X2lkKGF0aV9yZW1vdGUtPnVkZXYsICZpZGV2LT5pZCk7Ci0JaWRldi0+ZGV2LnBhcmVudCA9ICZhdGlfcmVtb3RlLT51ZGV2LT5kZXY7Ci19Ci0KLXN0YXRpYyBpbnQgYXRpX3JlbW90ZV9pbml0aWFsaXplKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKLQlpbnQgcGlwZSwgbWF4cDsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF0aV9yZW1vdGUtPndhaXQpOwotCi0JLyogU2V0IHVwIGlycV91cmIgKi8KLQlwaXBlID0gdXNiX3JjdmludHBpcGUodWRldiwgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfaW4tPmJFbmRwb2ludEFkZHJlc3MpOwotCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKLQltYXhwID0gKG1heHAgPiBEQVRBX0JVRlNJWkUpID8gREFUQV9CVUZTSVpFIDogbWF4cDsKLQotCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+aW5idWYsCi0JCQkgbWF4cCwgYXRpX3JlbW90ZV9pcnFfaW4sIGF0aV9yZW1vdGUsCi0JCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfaW4tPmJJbnRlcnZhbCk7Ci0JYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+aW5idWZfZG1hOwotCWF0aV9yZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCi0JLyogU2V0IHVwIG91dF91cmIgKi8KLQlwaXBlID0gdXNiX3NuZGludHBpcGUodWRldiwgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iRW5kcG9pbnRBZGRyZXNzKTsKLQltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0JbWF4cCA9IChtYXhwID4gREFUQV9CVUZTSVpFKSA/IERBVEFfQlVGU0laRSA6IG1heHA7Ci0KLQl1c2JfZmlsbF9pbnRfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIsIHVkZXYsIHBpcGUsIGF0aV9yZW1vdGUtPm91dGJ1ZiwKLQkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9vdXQsIGF0aV9yZW1vdGUsCi0JCQkgYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0LT5iSW50ZXJ2YWwpOwotCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2RtYSA9IGF0aV9yZW1vdGUtPm91dGJ1Zl9kbWE7Ci0JYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0KLQkvKiBzZW5kIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KLQlpZiAoKGF0aV9yZW1vdGVfc2VuZHBhY2tldChhdGlfcmVtb3RlLCAweDgwMDQsIGluaXQxKSkgfHwKLQkgICAgKGF0aV9yZW1vdGVfc2VuZHBhY2tldChhdGlfcmVtb3RlLCAweDgwMDcsIGluaXQyKSkpIHsKLQkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCi0JCQkgIkluaXRpYWxpemluZyBhdGlfcmVtb3RlIGhhcmR3YXJlIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfcHJvYmUKLSAqLwotc3RhdGljIGludCBhdGlfcmVtb3RlX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9ob3N0ID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50X2luLCAqZW5kcG9pbnRfb3V0OwotCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQotCWlmIChpZmFjZV9ob3N0LT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgewotCQllcnIoIiVzOiBVbmV4cGVjdGVkIGRlc2MuYk51bUVuZHBvaW50c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQllbmRwb2ludF9pbiA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFswXS5kZXNjOwotCWVuZHBvaW50X291dCA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFsxXS5kZXNjOwotCi0JaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50X2luKSkgewotCQllcnIoIiVzOiBVbmV4cGVjdGVkIGVuZHBvaW50X2luXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAobGUxNl90b19jcHUoZW5kcG9pbnRfaW4tPndNYXhQYWNrZXRTaXplKSA9PSAwKSB7Ci0JCWVycigiJXM6IGVuZHBvaW50X2luIG1lc3NhZ2Ugc2l6ZT09MD8gXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF0aV9yZW1vdGUgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGF0aV9yZW1vdGUpLCBHRlBfS0VSTkVMKTsKLQlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWF0aV9yZW1vdGUgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsMTsKLQotCS8qIEFsbG9jYXRlIFVSQiBidWZmZXJzLCBVUkJzICovCi0JaWYgKGF0aV9yZW1vdGVfYWxsb2NfYnVmZmVycyh1ZGV2LCBhdGlfcmVtb3RlKSkKLQkJZ290byBmYWlsMjsKLQotCWF0aV9yZW1vdGUtPmVuZHBvaW50X2luID0gZW5kcG9pbnRfaW47Ci0JYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0ID0gZW5kcG9pbnRfb3V0OwotCWF0aV9yZW1vdGUtPnVkZXYgPSB1ZGV2OwotCWF0aV9yZW1vdGUtPmlkZXYgPSBpbnB1dF9kZXY7Ci0JYXRpX3JlbW90ZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCi0JdXNiX21ha2VfcGF0aCh1ZGV2LCBhdGlfcmVtb3RlLT5waHlzLCBzaXplb2YoYXRpX3JlbW90ZS0+cGh5cykpOwotCXN0cmxjYXQoYXRpX3JlbW90ZS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoYXRpX3JlbW90ZS0+cGh5cykpOwotCi0JaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikKLQkJc3RybGNweShhdGlfcmVtb3RlLT5uYW1lLCB1ZGV2LT5tYW51ZmFjdHVyZXIsIHNpemVvZihhdGlfcmVtb3RlLT5uYW1lKSk7Ci0KLQlpZiAodWRldi0+cHJvZHVjdCkKLQkJc25wcmludGYoYXRpX3JlbW90ZS0+bmFtZSwgc2l6ZW9mKGF0aV9yZW1vdGUtPm5hbWUpLAotCQkJICIlcyAlcyIsIGF0aV9yZW1vdGUtPm5hbWUsIHVkZXYtPnByb2R1Y3QpOwotCi0JaWYgKCFzdHJsZW4oYXRpX3JlbW90ZS0+bmFtZSkpCi0JCXNucHJpbnRmKGF0aV9yZW1vdGUtPm5hbWUsIHNpemVvZihhdGlfcmVtb3RlLT5uYW1lKSwKLQkJCURSSVZFUl9ERVNDICIoJTA0eCwlMDR4KSIsCi0JCQlsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCWxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0KLQlhdGlfcmVtb3RlX2lucHV0X2luaXQoYXRpX3JlbW90ZSk7Ci0KLQkvKiBEZXZpY2UgSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24gLSBmaWxscyBpbiBhdGlfcmVtb3RlLT5pZGV2IGZyb20gdWRldi4gKi8KLQllcnIgPSBhdGlfcmVtb3RlX2luaXRpYWxpemUoYXRpX3JlbW90ZSk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsMzsKLQotCS8qIFNldCB1cCBhbmQgcmVnaXN0ZXIgaW5wdXQgZGV2aWNlICovCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPmlkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDM7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgYXRpX3JlbW90ZSk7Ci0JcmV0dXJuIDA7Ci0KLSBmYWlsMzoJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLSBmYWlsMjoJYXRpX3JlbW90ZV9mcmVlX2J1ZmZlcnMoYXRpX3JlbW90ZSk7Ci0gZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0Ja2ZyZWUoYXRpX3JlbW90ZSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfZGlzY29ubmVjdAotICovCi1zdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKLXsKLQlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZTsKLQotCWF0aV9yZW1vdGUgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotCWlmICghYXRpX3JlbW90ZSkgewotCQlkZXZfd2FybigmaW50ZXJmYWNlLT5kZXYsICIlcyAtIG51bGwgZGV2aWNlP1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwotCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhdGlfcmVtb3RlLT5pZGV2KTsKLQlhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycyhhdGlfcmVtb3RlKTsKLQlrZnJlZShhdGlfcmVtb3RlKTsKLX0KLQotLyoKLSAqCWF0aV9yZW1vdGVfaW5pdAotICovCi1zdGF0aWMgaW50IF9faW5pdCBhdGlfcmVtb3RlX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZhdGlfcmVtb3RlX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FCi0JCSAgICAgICAiOiB1c2JfcmVnaXN0ZXIgZXJyb3IgIyVkXG4iLCByZXN1bHQpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9WRVJTSU9OICI6IgotCQkgICAgICAgRFJJVkVSX0RFU0MgIlxuIik7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotICoJYXRpX3JlbW90ZV9leGl0Ci0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdGlfcmVtb3RlX2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3RlcigmYXRpX3JlbW90ZV9kcml2ZXIpOwotfQotCi0vKgotICoJbW9kdWxlIHNwZWNpZmljYXRpb24KLSAqLwotCi1tb2R1bGVfaW5pdChhdGlfcmVtb3RlX2luaXQpOwotbW9kdWxlX2V4aXQoYXRpX3JlbW90ZV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXRpX3JlbW90ZTIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCmluZGV4IDFkZTU4ZTguLjhkMzQ1ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIkFUSS9QaGlsaXBzIFVTQiBSRiByZW1vdGUgZHJpdmVyIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4zIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2JtYTE1MC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2JtYTE1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTViNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYm1hMTUwLmMKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQm9zY2ggU2Vuc29ydGVjIEdtYkgKKyAqIENvcHlyaWdodCAoYykgMjAxMSBVbml4cGhlcmUKKyAqCisgKiBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEJvc2NoIFNlbnNvcnRlYydzIGRpZ2l0YWwgYWNjZWxlcmF0aW9uCisgKiBzZW5zb3JzIEJNQTE1MCBhbmQgU01CMzgwLgorICogVGhlIFNNQjM4MCBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggQk1BMTUwIGFuZCBvbmx5IGRpZmZlcnMgaW4gcGFja2FnaW5nLgorICoKKyAqIFRoZSBkYXRhc2hlZXQgZm9yIHRoZSBCTUExNTAgY2hpcCBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly93d3cuYm9zY2gtc2Vuc29ydGVjLmNvbS9jb250ZW50L2xhbmd1YWdlMS9kb3dubG9hZHMvQlNULUJNQTE1MC1EUzAwMC0wNy5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JtYTE1MC5oPgorCisjZGVmaW5lIEFCU01BWF9BQ0NfVkFMCQkweDAxRkYKKyNkZWZpbmUgQUJTTUlOX0FDQ19WQUwJCS0oQUJTTUFYX0FDQ19WQUwpCisKKy8qIEVhY2ggYXhpcyBpcyByZXByZXNlbnRlZCBieSBhIDItYnl0ZSBkYXRhIHdvcmQgKi8KKyNkZWZpbmUgQk1BMTUwX1hZWl9EQVRBX1NJWkUJNgorCisvKiBJbnB1dCBwb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBCTUExNTBfUE9MTF9JTlRFUlZBTAkxMAorI2RlZmluZSBCTUExNTBfUE9MTF9NQVgJCTIwMAorI2RlZmluZSBCTUExNTBfUE9MTF9NSU4JCTAKKworI2RlZmluZSBCTUExNTBfQldfMjVIWgkJMAorI2RlZmluZSBCTUExNTBfQldfNTBIWgkJMQorI2RlZmluZSBCTUExNTBfQldfMTAwSFoJCTIKKyNkZWZpbmUgQk1BMTUwX0JXXzE5MEhaCQkzCisjZGVmaW5lIEJNQTE1MF9CV18zNzVIWgkJNAorI2RlZmluZSBCTUExNTBfQldfNzUwSFoJCTUKKyNkZWZpbmUgQk1BMTUwX0JXXzE1MDBIWgk2CisKKyNkZWZpbmUgQk1BMTUwX1JBTkdFXzJHCQkwCisjZGVmaW5lIEJNQTE1MF9SQU5HRV80RwkJMQorI2RlZmluZSBCTUExNTBfUkFOR0VfOEcJCTIKKworI2RlZmluZSBCTUExNTBfTU9ERV9OT1JNQUwJMAorI2RlZmluZSBCTUExNTBfTU9ERV9TTEVFUAkyCisjZGVmaW5lIEJNQTE1MF9NT0RFX1dBS0VfVVAJMworCisvKiBEYXRhIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBCTUExNTBfREFUQV8wX1JFRwkweDAwCisjZGVmaW5lIEJNQTE1MF9EQVRBXzFfUkVHCTB4MDEKKyNkZWZpbmUgQk1BMTUwX0RBVEFfMl9SRUcJMHgwMgorCisvKiBDb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBCTUExNTBfQ1RSTF8wX1JFRwkweDBBCisjZGVmaW5lIEJNQTE1MF9DVFJMXzFfUkVHCTB4MEIKKyNkZWZpbmUgQk1BMTUwX0NUUkxfMl9SRUcJMHgxNAorI2RlZmluZSBCTUExNTBfQ1RSTF8zX1JFRwkweDE1CisKKy8qIENvbmZpZ3VyYXRpb24vU2V0dGluZyByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQk1BMTUwX0NGR18wX1JFRwkweDBDCisjZGVmaW5lIEJNQTE1MF9DRkdfMV9SRUcJMHgwRAorI2RlZmluZSBCTUExNTBfQ0ZHXzJfUkVHCTB4MEUKKyNkZWZpbmUgQk1BMTUwX0NGR18zX1JFRwkweDBGCisjZGVmaW5lIEJNQTE1MF9DRkdfNF9SRUcJMHgxMAorI2RlZmluZSBCTUExNTBfQ0ZHXzVfUkVHCTB4MTEKKworI2RlZmluZSBCTUExNTBfQ0hJUF9JRAkJMgorI2RlZmluZSBCTUExNTBfQ0hJUF9JRF9SRUcJQk1BMTUwX0RBVEFfMF9SRUcKKworI2RlZmluZSBCTUExNTBfQUNDX1hfTFNCX1JFRwlCTUExNTBfREFUQV8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9TTEVFUF9QT1MJMAorI2RlZmluZSBCTUExNTBfU0xFRVBfTVNLCTB4MDEKKyNkZWZpbmUgQk1BMTUwX1NMRUVQX1JFRwlCTUExNTBfQ1RSTF8wX1JFRworCisjZGVmaW5lIEJNQTE1MF9CQU5EV0lEVEhfUE9TCTAKKyNkZWZpbmUgQk1BMTUwX0JBTkRXSURUSF9NU0sJMHgwNworI2RlZmluZSBCTUExNTBfQkFORFdJRFRIX1JFRwlCTUExNTBfQ1RSTF8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9SQU5HRV9QT1MJMworI2RlZmluZSBCTUExNTBfUkFOR0VfTVNLCTB4MTgKKyNkZWZpbmUgQk1BMTUwX1JBTkdFX1JFRwlCTUExNTBfQ1RSTF8yX1JFRworCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX1BPUwkwCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX01TSwkweDAxCisjZGVmaW5lIEJNQTE1MF9XQUtFX1VQX1JFRwlCTUExNTBfQ1RSTF8zX1JFRworCisjZGVmaW5lIEJNQTE1MF9TV19SRVNfUE9TCTEKKyNkZWZpbmUgQk1BMTUwX1NXX1JFU19NU0sJMHgwMgorI2RlZmluZSBCTUExNTBfU1dfUkVTX1JFRwlCTUExNTBfQ1RSTF8wX1JFRworCisvKiBBbnktbW90aW9uIGludGVycnVwdCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fUE9TCTYKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fTVNLCTB4NDAKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRU5fUkVHCUJNQTE1MF9DVFJMXzFfUkVHCisKKyNkZWZpbmUgQk1BMTUwX0FOWV9NT1RJT05fRFVSX1BPUwk2CisjZGVmaW5lIEJNQTE1MF9BTllfTU9USU9OX0RVUl9NU0sJMHhDMAorI2RlZmluZSBCTUExNTBfQU5ZX01PVElPTl9EVVJfUkVHCUJNQTE1MF9DRkdfNV9SRUcKKworI2RlZmluZSBCTUExNTBfQU5ZX01PVElPTl9USFJFU19SRUcJQk1BMTUwX0NGR180X1JFRworCisvKiBBZHZhbmNlZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEJNQTE1MF9BRFZfSU5UX0VOX1BPUwkJNgorI2RlZmluZSBCTUExNTBfQURWX0lOVF9FTl9NU0sJCTB4NDAKKyNkZWZpbmUgQk1BMTUwX0FEVl9JTlRfRU5fUkVHCQlCTUExNTBfQ1RSTF8zX1JFRworCisvKiBIaWdoLUcgaW50ZXJydXB0IHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX1BPUwkJMQorI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX01TSwkJMHgwMgorI2RlZmluZSBCTUExNTBfSElHSF9HX0VOX1JFRwkJQk1BMTUwX0NUUkxfMV9SRUcKKworI2RlZmluZSBCTUExNTBfSElHSF9HX0hZU1RfUE9TCQkzCisjZGVmaW5lIEJNQTE1MF9ISUdIX0dfSFlTVF9NU0sJCTB4MzgKKyNkZWZpbmUgQk1BMTUwX0hJR0hfR19IWVNUX1JFRwkJQk1BMTUwX0NGR181X1JFRworCisjZGVmaW5lIEJNQTE1MF9ISUdIX0dfRFVSX1JFRwkJQk1BMTUwX0NGR18zX1JFRworI2RlZmluZSBCTUExNTBfSElHSF9HX1RIUkVTX1JFRwkJQk1BMTUwX0NGR18yX1JFRworCisvKiBMb3ctRyBpbnRlcnJ1cHQgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIEJNQTE1MF9MT1dfR19FTl9QT1MJCTAKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0VOX01TSwkJMHgwMQorI2RlZmluZSBCTUExNTBfTE9XX0dfRU5fUkVHCQlCTUExNTBfQ1RSTF8xX1JFRworCisjZGVmaW5lIEJNQTE1MF9MT1dfR19IWVNUX1BPUwkJMAorI2RlZmluZSBCTUExNTBfTE9XX0dfSFlTVF9NU0sJCTB4MDcKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0hZU1RfUkVHCQlCTUExNTBfQ0ZHXzVfUkVHCisKKyNkZWZpbmUgQk1BMTUwX0xPV19HX0RVUl9SRUcJCUJNQTE1MF9DRkdfMV9SRUcKKyNkZWZpbmUgQk1BMTUwX0xPV19HX1RIUkVTX1JFRwkJQk1BMTUwX0NGR18wX1JFRworCitzdHJ1Y3QgYm1hMTUwX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlucHV0X3BvbGxlZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwl1OCBtb2RlOworfTsKKworLyoKKyAqIFRoZSBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIHJhbmdlLCBiYW5kd2lkdGggYW5kIGludGVycnVwdCBmZWF0dXJlcworICogYXJlIHN0YXRlZCBhbmQgdmVyaWZpZWQgYnkgQm9zY2ggU2Vuc29ydGVjIHdoZXJlIHRoZXkgYXJlIGNvbmZpZ3VyZWQKKyAqIHRvIHByb3ZpZGUgYSBnZW5lcmljIHNlbnNpdGl2aXR5IHBlcmZvcm1hbmNlLgorICovCitzdGF0aWMgc3RydWN0IGJtYTE1MF9jZmcgZGVmYXVsdF9jZmcgX19kZXZpbml0ZGF0YSA9IHsKKwkuYW55X21vdGlvbl9pbnQgPSAxLAorCS5oZ19pbnQgPSAxLAorCS5sZ19pbnQgPSAxLAorCS5hbnlfbW90aW9uX2R1ciA9IDAsCisJLmFueV9tb3Rpb25fdGhyZXMgPSAwLAorCS5oZ19oeXN0ID0gMCwKKwkuaGdfZHVyID0gMTUwLAorCS5oZ190aHJlcyA9IDE2MCwKKwkubGdfaHlzdCA9IDAsCisJLmxnX2R1ciA9IDE1MCwKKwkubGdfdGhyZXMgPSAyMCwKKwkucmFuZ2UgPSBCTUExNTBfUkFOR0VfMkcsCisJLmJhbmR3aWR0aCA9IEJNQTE1MF9CV181MEhaCit9OworCitzdGF0aWMgaW50IGJtYTE1MF93cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsKQoreworCXMzMiByZXQ7CisKKwkvKiBBcyBwZXIgc3BlY2lmaWNhdGlvbiwgZGlzYWJsZSBpcnEgaW4gYmV0d2VlbiByZWdpc3RlciB3cml0ZXMgKi8KKwlpZiAoY2xpZW50LT5pcnEpCisJCWRpc2FibGVfaXJxX25vc3luYyhjbGllbnQtPmlycSk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWwpOworCisJaWYgKGNsaWVudC0+aXJxKQorCQllbmFibGVfaXJxKGNsaWVudC0+aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm1hMTUwX3NldF9yZWdfYml0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCQlpbnQgdmFsLCBpbnQgc2hpZnQsIHU4IG1hc2ssIHU4IHJlZykKK3sKKwlpbnQgZGF0YTsKKworCWRhdGEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChkYXRhIDwgMCkKKwkJcmV0dXJuIGRhdGE7CisKKwlkYXRhID0gKGRhdGEgJiB+bWFzaykgfCAoKHZhbCA8PCBzaGlmdCkgJiBtYXNrKTsKKwlyZXR1cm4gYm1hMTUwX3dyaXRlX2J5dGUoY2xpZW50LCByZWcsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9zZXRfbW9kZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggbW9kZSkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIG1vZGUsIEJNQTE1MF9XQUtFX1VQX1BPUywKKwkJCQlCTUExNTBfV0FLRV9VUF9NU0ssIEJNQTE1MF9XQUtFX1VQX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIG1vZGUsIEJNQTE1MF9TTEVFUF9QT1MsCisJCQkJQk1BMTUwX1NMRUVQX01TSywgQk1BMTUwX1NMRUVQX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAobW9kZSA9PSBCTUExNTBfTU9ERV9OT1JNQUwpCisJCW1zbGVlcCgyKTsKKworCWJtYTE1MC0+bW9kZSA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9zb2Z0X3Jlc2V0KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgMSwgQk1BMTUwX1NXX1JFU19QT1MsCisJCQkJQk1BMTUwX1NXX1JFU19NU0ssIEJNQTE1MF9TV19SRVNfUkVHKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW1zbGVlcCgyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX3NldF9yYW5nZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggcmFuZ2UpCit7CisJcmV0dXJuIGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIHJhbmdlLCBCTUExNTBfUkFOR0VfUE9TLAorCQkJCUJNQTE1MF9SQU5HRV9NU0ssIEJNQTE1MF9SQU5HRV9SRUcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwgdTggYncpCit7CisJcmV0dXJuIGJtYTE1MF9zZXRfcmVnX2JpdHMoYm1hMTUwLT5jbGllbnQsIGJ3LCBCTUExNTBfQkFORFdJRFRIX1BPUywKKwkJCQlCTUExNTBfQkFORFdJRFRIX01TSywgQk1BMTUwX0JBTkRXSURUSF9SRUcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfc2V0X2xvd19nX2ludGVycnVwdChzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCwKKwkJCQkJdTggZW5hYmxlLCB1OCBoeXN0LCB1OCBkdXIsIHU4IHRocmVzKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgaHlzdCwKKwkJCQlCTUExNTBfTE9XX0dfSFlTVF9QT1MsIEJNQTE1MF9MT1dfR19IWVNUX01TSywKKwkJCQlCTUExNTBfTE9XX0dfSFlTVF9SRUcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfd3JpdGVfYnl0ZShibWExNTAtPmNsaWVudCwgQk1BMTUwX0xPV19HX0RVUl9SRUcsIGR1cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF93cml0ZV9ieXRlKGJtYTE1MC0+Y2xpZW50LCBCTUExNTBfTE9XX0dfVEhSRVNfUkVHLCB0aHJlcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgISFlbmFibGUsCisJCQkJQk1BMTUwX0xPV19HX0VOX1BPUywgQk1BMTUwX0xPV19HX0VOX01TSywKKwkJCQlCTUExNTBfTE9XX0dfRU5fUkVHKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX3NldF9oaWdoX2dfaW50ZXJydXB0KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwLAorCQkJCQl1OCBlbmFibGUsIHU4IGh5c3QsIHU4IGR1ciwgdTggdGhyZXMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCBoeXN0LAorCQkJCUJNQTE1MF9ISUdIX0dfSFlTVF9QT1MsIEJNQTE1MF9ISUdIX0dfSFlTVF9NU0ssCisJCQkJQk1BMTUwX0hJR0hfR19IWVNUX1JFRyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGJtYTE1MF93cml0ZV9ieXRlKGJtYTE1MC0+Y2xpZW50LAorCQkJCUJNQTE1MF9ISUdIX0dfRFVSX1JFRywgZHVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3dyaXRlX2J5dGUoYm1hMTUwLT5jbGllbnQsCisJCQkJQk1BMTUwX0hJR0hfR19USFJFU19SRUcsIHRocmVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCAhIWVuYWJsZSwKKwkJCQlCTUExNTBfSElHSF9HX0VOX1BPUywgQk1BMTUwX0hJR0hfR19FTl9NU0ssCisJCQkJQk1BMTUwX0hJR0hfR19FTl9SRUcpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9zZXRfYW55X21vdGlvbl9pbnRlcnJ1cHQoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJCQl1OCBlbmFibGUsIHU4IGR1ciwgdTggdGhyZXMpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCBkdXIsCisJCQkJQk1BMTUwX0FOWV9NT1RJT05fRFVSX1BPUywKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9EVVJfTVNLLAorCQkJCUJNQTE1MF9BTllfTU9USU9OX0RVUl9SRUcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfd3JpdGVfYnl0ZShibWExNTAtPmNsaWVudCwKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9USFJFU19SRUcsIHRocmVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yZWdfYml0cyhibWExNTAtPmNsaWVudCwgISFlbmFibGUsCisJCQkJQk1BMTUwX0FEVl9JTlRfRU5fUE9TLCBCTUExNTBfQURWX0lOVF9FTl9NU0ssCisJCQkJQk1BMTUwX0FEVl9JTlRfRU5fUkVHKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBibWExNTBfc2V0X3JlZ19iaXRzKGJtYTE1MC0+Y2xpZW50LCAhIWVuYWJsZSwKKwkJCQlCTUExNTBfQU5ZX01PVElPTl9FTl9QT1MsCisJCQkJQk1BMTUwX0FOWV9NT1RJT05fRU5fTVNLLAorCQkJCUJNQTE1MF9BTllfTU9USU9OX0VOX1JFRyk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9yZXBvcnRfeHl6KHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCXU4IGRhdGFbQk1BMTUwX1hZWl9EQVRBX1NJWkVdOworCXMxNiB4LCB5LCB6OworCXMzMiByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShibWExNTAtPmNsaWVudCwKKwkJCUJNQTE1MF9BQ0NfWF9MU0JfUkVHLCBCTUExNTBfWFlaX0RBVEFfU0laRSwgZGF0YSk7CisJaWYgKHJldCAhPSBCTUExNTBfWFlaX0RBVEFfU0laRSkKKwkJcmV0dXJuOworCisJeCA9ICgoMHhjMCAmIGRhdGFbMF0pID4+IDYpIHwgKGRhdGFbMV0gPDwgMik7CisJeSA9ICgoMHhjMCAmIGRhdGFbMl0pID4+IDYpIHwgKGRhdGFbM10gPDwgMik7CisJeiA9ICgoMHhjMCAmIGRhdGFbNF0pID4+IDYpIHwgKGRhdGFbNV0gPDwgMik7CisKKwkvKiBzaWduIGV4dGVuc2lvbiAqLworCXggPSAoczE2KSAoeCA8PCA2KSA+PiA2OworCXkgPSAoczE2KSAoeSA8PCA2KSA+PiA2OworCXogPSAoczE2KSAoeiA8PCA2KSA+PiA2OworCisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWSwgeSk7CisJaW5wdXRfcmVwb3J0X2FicyhibWExNTAtPmlucHV0LCBBQlNfWiwgeik7CisJaW5wdXRfc3luYyhibWExNTAtPmlucHV0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJtYTE1MF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlibWExNTBfcmVwb3J0X3h5eihkZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBibWExNTBfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2KQoreworCWJtYTE1MF9yZXBvcnRfeHl6KGRldi0+cHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYm1hMTUwX29wZW4oc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTApCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZibWExNTAtPmNsaWVudC0+ZGV2KTsKKwlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gLUVOT1NZUykKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBTZWUgaWYgcnVudGltZSBQTSB3b2tlIHVwIHRoZSBkZXZpY2UuIElmIHJ1bnRpbWUgUE0KKwkgKiBpcyBkaXNhYmxlZCB3ZSBuZWVkIHRvIGRvIGl0IG91cnNlbHZlcy4KKwkgKi8KKwlpZiAoYm1hMTUwLT5tb2RlICE9IEJNQTE1MF9NT0RFX05PUk1BTCkgeworCQllcnJvciA9IGJtYTE1MF9zZXRfbW9kZShibWExNTAsIEJNQTE1MF9NT0RFX05PUk1BTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm1hMTUwX2Nsb3NlKHN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwKQoreworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmJtYTE1MC0+Y2xpZW50LT5kZXYpOworCisJaWYgKGJtYTE1MC0+bW9kZSAhPSBCTUExNTBfTU9ERV9TTEVFUCkKKwkJYm1hMTUwX3NldF9tb2RlKGJtYTE1MCwgQk1BMTUwX01PREVfU0xFRVApOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9pcnFfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0KTsKKworCXJldHVybiBibWExNTBfb3BlbihibWExNTApOworfQorCitzdGF0aWMgdm9pZCBibWExNTBfaXJxX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCisJYm1hMTUwX2Nsb3NlKGJtYTE1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9wb2xsX29wZW4oc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwb2xsX2RldikKK3sKKwlzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCA9IGlwb2xsX2Rldi0+cHJpdmF0ZTsKKworCWJtYTE1MF9vcGVuKGJtYTE1MCk7Cit9CisKK3N0YXRpYyB2b2lkIGJtYTE1MF9wb2xsX2Nsb3NlKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICppcG9sbF9kZXYpCit7CisJc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAgPSBpcG9sbF9kZXYtPnByaXZhdGU7CisKKwlibWExNTBfY2xvc2UoYm1hMTUwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm1hMTUwX2luaXRpYWxpemUoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBibWExNTBfY2ZnICpjZmcpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc29mdF9yZXNldChibWExNTApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBibWExNTBfc2V0X2JhbmR3aWR0aChibWExNTAsIGNmZy0+YmFuZHdpZHRoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYm1hMTUwX3NldF9yYW5nZShibWExNTAsIGNmZy0+cmFuZ2UpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGJtYTE1MC0+Y2xpZW50LT5pcnEpIHsKKwkJZXJyb3IgPSBibWExNTBfc2V0X2FueV9tb3Rpb25faW50ZXJydXB0KGJtYTE1MCwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX2ludCwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX2R1ciwKKwkJCQkJY2ZnLT5hbnlfbW90aW9uX3RocmVzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCWVycm9yID0gYm1hMTUwX3NldF9oaWdoX2dfaW50ZXJydXB0KGJtYTE1MCwKKwkJCQkJY2ZnLT5oZ19pbnQsIGNmZy0+aGdfaHlzdCwKKwkJCQkJY2ZnLT5oZ19kdXIsIGNmZy0+aGdfdGhyZXMpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJZXJyb3IgPSBibWExNTBfc2V0X2xvd19nX2ludGVycnVwdChibWExNTAsCisJCQkJCWNmZy0+bGdfaW50LCBjZmctPmxnX2h5c3QsCisJCQkJCWNmZy0+bGdfZHVyLCBjZmctPmxnX3RocmVzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiBibWExNTBfc2V0X21vZGUoYm1hMTUwLCBCTUExNTBfTU9ERV9TTEVFUCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBibWExNTBfaW5pdF9pbnB1dF9kZXZpY2Uoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAsCisJCQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCWlkZXYtPm5hbWUgPSBCTUExNTBfRFJJVkVSOworCWlkZXYtPnBoeXMgPSBCTUExNTBfRFJJVkVSICIvaW5wdXQwIjsKKwlpZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmJtYTE1MC0+Y2xpZW50LT5kZXY7CisKKwlpZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1gsIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1ksIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1osIEFCU01JTl9BQ0NfVkFMLCBBQlNNQVhfQUNDX1ZBTCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYTE1MF9yZWdpc3Rlcl9pbnB1dF9kZXZpY2Uoc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTApCit7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwlpbnQgZXJyb3I7CisKKwlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJtYTE1MF9pbml0X2lucHV0X2RldmljZShibWExNTAsIGlkZXYpOworCisJaWRldi0+b3BlbiA9IGJtYTE1MF9pcnFfb3BlbjsKKwlpZGV2LT5jbG9zZSA9IGJtYTE1MF9pcnFfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaWRldiwgYm1hMTUwKTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlkZXYpOworCWlmIChlcnJvcikgeworCQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWJtYTE1MC0+aW5wdXQgPSBpZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShzdHJ1Y3QgYm1hMTUwX2RhdGEgKmJtYTE1MCkKK3sKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBvbGxfZGV2OworCWludCBlcnJvcjsKKworCWlwb2xsX2RldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKKwlpZiAoIWlwb2xsX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcG9sbF9kZXYtPnByaXZhdGUgPSBibWExNTA7CisJaXBvbGxfZGV2LT5vcGVuID0gYm1hMTUwX3BvbGxfb3BlbjsKKwlpcG9sbF9kZXYtPmNsb3NlID0gYm1hMTUwX3BvbGxfY2xvc2U7CisJaXBvbGxfZGV2LT5wb2xsID0gYm1hMTUwX3BvbGw7CisJaXBvbGxfZGV2LT5wb2xsX2ludGVydmFsID0gQk1BMTUwX1BPTExfSU5URVJWQUw7CisJaXBvbGxfZGV2LT5wb2xsX2ludGVydmFsX21pbiA9IEJNQTE1MF9QT0xMX01JTjsKKwlpcG9sbF9kZXYtPnBvbGxfaW50ZXJ2YWxfbWF4ID0gQk1BMTUwX1BPTExfTUFYOworCisJYm1hMTUwX2luaXRfaW5wdXRfZGV2aWNlKGJtYTE1MCwgaXBvbGxfZGV2LT5pbnB1dCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoaXBvbGxfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGlwb2xsX2Rldik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlibWExNTAtPmlucHV0X3BvbGxlZCA9IGlwb2xsX2RldjsKKwlibWExNTAtPmlucHV0ID0gaXBvbGxfZGV2LT5pbnB1dDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWExNTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgYm1hMTUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwljb25zdCBzdHJ1Y3QgYm1hMTUwX2NmZyAqY2ZnOworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwOworCWludCBjaGlwX2lkOworCWludCBlcnJvcjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQk1BMTUwX0NISVBfSURfUkVHKTsKKwlpZiAoY2hpcF9pZCAhPSBCTUExNTBfQ0hJUF9JRCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkJNQTE1MCBjaGlwIGlkIGVycm9yOiAlZFxuIiwgY2hpcF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJtYTE1MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibWExNTBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYm1hMTUwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJtYTE1MC0+Y2xpZW50ID0gY2xpZW50OworCisJaWYgKHBkYXRhKSB7CisJCWlmIChwZGF0YS0+aXJxX2dwaW9fY2ZnKSB7CisJCQllcnJvciA9IHBkYXRhLT5pcnFfZ3Bpb19jZmcoKTsKKwkJCWlmIChlcnJvcikgeworCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkiSVJRIEdQSU8gY29uZi4gZXJyb3IgJWQsIGVycm9yICVkXG4iLAorCQkJCQljbGllbnQtPmlycSwgZXJyb3IpOworCQkJCWdvdG8gZXJyX2ZyZWVfbWVtOworCQkJfQorCQl9CisJCWNmZyA9ICZwZGF0YS0+Y2ZnOworCX0gZWxzZSB7CisJCWNmZyA9ICZkZWZhdWx0X2NmZzsKKwl9CisKKwllcnJvciA9IGJtYTE1MF9pbml0aWFsaXplKGJtYTE1MCwgY2ZnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQllcnJvciA9IGJtYTE1MF9yZWdpc3Rlcl9pbnB1dF9kZXZpY2UoYm1hMTUwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJfZnJlZV9tZW07CisKKwkJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJCQkJTlVMTCwgYm1hMTUwX2lycV90aHJlYWQsCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJCUJNQTE1MF9EUklWRVIsIGJtYTE1MCk7CisJCWlmIChlcnJvcikgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJImlycSByZXF1ZXN0IGZhaWxlZCAlZCwgZXJyb3IgJWRcbiIsCisJCQkJY2xpZW50LT5pcnEsIGVycm9yKTsKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJtYTE1MC0+aW5wdXQpOworCQkJZ290byBlcnJfZnJlZV9tZW07CisJCX0KKwl9IGVsc2UgeworCQllcnJvciA9IGJtYTE1MF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGJtYTE1MCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGJtYTE1MCk7CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmY2xpZW50LT5kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX21lbToKKwlrZnJlZShibWExNTApOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYm1hMTUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmNsaWVudC0+ZGV2KTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGJtYTE1MCk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJtYTE1MC0+aW5wdXQpOworCX0gZWxzZSB7CisJCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShibWExNTAtPmlucHV0X3BvbGxlZCk7CisJCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShibWExNTAtPmlucHV0X3BvbGxlZCk7CisJfQorCisJa2ZyZWUoYm1hMTUwKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJtYTE1MF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBibWExNTBfZGF0YSAqYm1hMTUwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXR1cm4gYm1hMTUwX3NldF9tb2RlKGJtYTE1MCwgQk1BMTUwX01PREVfU0xFRVApOworfQorCitzdGF0aWMgaW50IGJtYTE1MF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGJtYTE1MF9kYXRhICpibWExNTAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBibWExNTBfc2V0X21vZGUoYm1hMTUwLCBCTUExNTBfTU9ERV9OT1JNQUwpOworfQorI2VuZGlmCisKK3N0YXRpYyBVTklWRVJTQUxfREVWX1BNX09QUyhibWExNTBfcG0sIGJtYTE1MF9zdXNwZW5kLCBibWExNTBfcmVzdW1lLCBOVUxMKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJtYTE1MF9pZFtdID0geworCXsgImJtYTE1MCIsIDAgfSwKKwl7ICJzbWIzODAiLCAwIH0sCisJeyAiYm1hMDIzIiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGJtYTE1MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBibWExNTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9IEJNQTE1MF9EUklWRVIsCisJCS5wbQk9ICZibWExNTBfcG0sCisJfSwKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5pZF90YWJsZQk9IGJtYTE1MF9pZCwKKwkucHJvYmUJCT0gYm1hMTUwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYm1hMTUwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBCTUExNTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYm1hMTUwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBCTUExNTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZibWExNTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxiZXJ0IFpoYW5nIDx4dS56aGFuZ0Bib3NjaC1zZW5zb3J0ZWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCTUExNTAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KEJNQTE1MF9pbml0KTsKK21vZHVsZV9leGl0KEJNQTE1MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9jbWEzMDAwX2QweC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKaW5kZXggMTYzM2I2My4uODA3OTNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9jbWEzMDAwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJjbWEzMDAwX2QweC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2RtMzU1ZXZtX2tleXMuYwppbmRleCAxOWFmNjgyLi43MjgzZGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvZG0zNTVldm1fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9kbTM1NWV2bV9rZXlzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy9kbTM1NWV2bV9tc3AuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2l4cDR4eC1iZWVwZXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9peHA0eHgtYmVlcGVyLmMKaW5kZXggMWYzODMwMi4uMzAyYWI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2l4cDR4eC1iZWVwZXIuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvaXhwNHh4LWJlZXBlci5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlpbnB1dF9kZXYtPmV2ZW50ID0gaXhwNHh4X3Nwa3JfZXZlbnQ7CiAKIAllcnIgPSByZXF1ZXN0X2lycShJUlFfSVhQNFhYX1RJTUVSMiwgJml4cDR4eF9zcGtyX2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfTk9fU1VTUEVORCwgIml4cDR4eC1iZWVwZXIiLAorCQkJICBJUlFGX05PX1NVU1BFTkQsICJpeHA0eHgtYmVlcGVyIiwKIAkJCSAgKHZvaWQgKikgZGV2LT5pZCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvbWMxMzc4My1wd3JidXR0b24uYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tYzEzNzgzLXB3cmJ1dHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjA1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbWMxMzc4My1wd3JidXR0b24uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGhpbGlwcGUgUsOpdG9ybmF6CisgKgorICogQmFzZWQgb24gdHdsNDAzMC1wd3JidXR0b24gZHJpdmVyIGJ5OgorICogICAgIFBldGVyIERlIFNjaHJpanZlciA8cGV0ZXIuZGUtc2NocmlqdmVyQG5va2lhLmNvbT4KKyAqICAgICBGZWxpcGUgQmFsYmkgPGZlbGlwZS5iYWxiaUBub2tpYS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBTdWl0ZSA1MDAsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IG1jMTM3ODNfcHdyYiB7CisJc3RydWN0IGlucHV0X2RldiAqcHdyOworCXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzOworI2RlZmluZSBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVAkoMSA8PCAwKQorI2RlZmluZSBNQzEzNzgzX1BXUkJfQjJfUE9MX0lOVkVSVAkoMSA8PCAxKQorI2RlZmluZSBNQzEzNzgzX1BXUkJfQjNfUE9MX0lOVkVSVAkoMSA8PCAyKQorCWludCBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBrZXltYXBbM107Cit9OworCisjZGVmaW5lIE1DMTM3ODNfUkVHX0lOVEVSUlVQVF9TRU5TRV8xCQk1CisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEMVMJCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEMlMJCSgxIDw8IDQpCisjZGVmaW5lIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEM1MJCSgxIDw8IDUpCisKKyNkZWZpbmUgTUMxMzc4M19SRUdfUE9XRVJfQ09OVFJPTF8yCQkxNQorI2RlZmluZSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCREJOQwk0CisjZGVmaW5lIE1DMTM3ODNfUE9XRVJfQ09OVFJPTF8yX09OMkJEQk5DCTYKKyNkZWZpbmUgTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04zQkRCTkMJOAorI2RlZmluZSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCUlNURU4JKDEgPDwgMSkKKyNkZWZpbmUgTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04yQlJTVEVOCSgxIDw8IDIpCisjZGVmaW5lIE1DMTM3ODNfUE9XRVJfQ09OVFJPTF8yX09OM0JSU1RFTgkoMSA8PCAzKQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYnV0dG9uX2lycShpbnQgaXJxLCB2b2lkICpfcHJpdikKK3sKKwlzdHJ1Y3QgbWMxMzc4M19wd3JiICpwcml2ID0gX3ByaXY7CisJaW50IHZhbDsKKworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzNzgzLCBpcnEpOworCW1jMTN4eHhfcmVnX3JlYWQocHJpdi0+bWMxMzc4MywgTUMxMzc4M19SRUdfSU5URVJSVVBUX1NFTlNFXzEsICZ2YWwpOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIE1DMTM3ODNfSVJRX09OT0ZEMToKKwkJdmFsID0gdmFsICYgTUMxMzc4M19JUlFTRU5TRTFfT05PRkQxUyA/IDEgOiAwOworCQlpZiAocHJpdi0+ZmxhZ3MgJiBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVCkKKwkJCXZhbCBePSAxOworCQlpbnB1dF9yZXBvcnRfa2V5KHByaXYtPnB3ciwgcHJpdi0+a2V5bWFwWzBdLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgTUMxMzc4M19JUlFfT05PRkQyOgorCQl2YWwgPSB2YWwgJiBNQzEzNzgzX0lSUVNFTlNFMV9PTk9GRDJTID8gMSA6IDA7CisJCWlmIChwcml2LT5mbGFncyAmIE1DMTM3ODNfUFdSQl9CMl9QT0xfSU5WRVJUKQorCQkJdmFsIF49IDE7CisJCWlucHV0X3JlcG9ydF9rZXkocHJpdi0+cHdyLCBwcml2LT5rZXltYXBbMV0sIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBNQzEzNzgzX0lSUV9PTk9GRDM6CisJCXZhbCA9IHZhbCAmIE1DMTM3ODNfSVJRU0VOU0UxX09OT0ZEM1MgPyAxIDogMDsKKwkJaWYgKHByaXYtPmZsYWdzICYgTUMxMzc4M19QV1JCX0IzX1BPTF9JTlZFUlQpCisJCQl2YWwgXj0gMTsKKwkJaW5wdXRfcmVwb3J0X2tleShwcml2LT5wd3IsIHByaXYtPmtleW1hcFsyXSwgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJaW5wdXRfc3luYyhwcml2LT5wd3IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYzEzNzgzX3B3cmJ1dHRvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG1jMTN4eHggKm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGlucHV0X2RldiAqcHdyOworCXN0cnVjdCBtYzEzNzgzX3B3cmIgKnByaXY7CisJaW50IGVyciA9IDA7CisJaW50IHJlZyA9IDA7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwd3IgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXB3cikgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBwb3dlciBidXR0b25cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgcG93ZXIgYnV0dG9uXG4iKTsKKwkJZ290byBmcmVlX2lucHV0X2RldjsKKwl9CisKKwlyZWcgfD0gKHBkYXRhLT5iMW9uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCREJOQzsKKwlyZWcgfD0gKHBkYXRhLT5iMm9uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjJCREJOQzsKKwlyZWcgfD0gKHBkYXRhLT5iM29uX2ZsYWdzICYgMHgzKSA8PCBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjNCREJOQzsKKworCXByaXYtPnB3ciA9IHB3cjsKKwlwcml2LT5tYzEzNzgzID0gbWMxMzc4MzsKKworCW1jMTN4eHhfbG9jayhtYzEzNzgzKTsKKworCWlmIChwZGF0YS0+YjFvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX0VOQUJMRSkgeworCQlwcml2LT5rZXltYXBbMF0gPSBwZGF0YS0+YjFvbl9rZXk7CisJCWlmIChwZGF0YS0+YjFvbl9rZXkgIT0gS0VZX1JFU0VSVkVEKQorCQkJX19zZXRfYml0KHBkYXRhLT5iMW9uX2tleSwgcHdyLT5rZXliaXQpOworCisJCWlmIChwZGF0YS0+YjFvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX1BPTF9JTlZFUlQpCisJCQlwcml2LT5mbGFncyB8PSBNQzEzNzgzX1BXUkJfQjFfUE9MX0lOVkVSVDsKKworCQlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9SRVNFVF9FTikKKwkJCXJlZyB8PSBNQzEzNzgzX1BPV0VSX0NPTlRST0xfMl9PTjFCUlNURU47CisKKwkJZXJyID0gbWMxM3h4eF9pcnFfcmVxdWVzdChtYzEzNzgzLCBNQzEzNzgzX0lSUV9PTk9GRDEsCisJCQkJCSAgYnV0dG9uX2lycSwgImIxb24iLCBwcml2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBpcnFcbiIpOworCQkJZ290byBmcmVlX3ByaXY7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpIHsKKwkJcHJpdi0+a2V5bWFwWzFdID0gcGRhdGEtPmIyb25fa2V5OworCQlpZiAocGRhdGEtPmIyb25fa2V5ICE9IEtFWV9SRVNFUlZFRCkKKwkJCV9fc2V0X2JpdChwZGF0YS0+YjJvbl9rZXksIHB3ci0+a2V5Yml0KTsKKworCQlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUKQorCQkJcHJpdi0+ZmxhZ3MgfD0gTUMxMzc4M19QV1JCX0IyX1BPTF9JTlZFUlQ7CisKKwkJaWYgKHBkYXRhLT5iMm9uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fUkVTRVRfRU4pCisJCQlyZWcgfD0gTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04yQlJTVEVOOworCisJCWVyciA9IG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQyLAorCQkJCQkgIGJ1dHRvbl9pcnEsICJiMm9uIiwgcHJpdik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgaXJxXG4iKTsKKwkJCWdvdG8gZnJlZV9pcnFfYjE7CisJCX0KKwl9CisKKwlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpIHsKKwkJcHJpdi0+a2V5bWFwWzJdID0gcGRhdGEtPmIzb25fa2V5OworCQlpZiAocGRhdGEtPmIzb25fa2V5ICE9IEtFWV9SRVNFUlZFRCkKKwkJCV9fc2V0X2JpdChwZGF0YS0+YjNvbl9rZXksIHB3ci0+a2V5Yml0KTsKKworCQlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUKQorCQkJcHJpdi0+ZmxhZ3MgfD0gTUMxMzc4M19QV1JCX0IzX1BPTF9JTlZFUlQ7CisKKwkJaWYgKHBkYXRhLT5iM29uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fUkVTRVRfRU4pCisJCQlyZWcgfD0gTUMxMzc4M19QT1dFUl9DT05UUk9MXzJfT04zQlJTVEVOOworCisJCWVyciA9IG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQzLAorCQkJCQkgIGJ1dHRvbl9pcnEsICJiM29uIiwgcHJpdik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlcXVlc3QgaXJxOiAlZFxuIiwgZXJyKTsKKwkJCWdvdG8gZnJlZV9pcnFfYjI7CisJCX0KKwl9CisKKwltYzEzeHh4X3JlZ19ybXcobWMxMzc4MywgTUMxMzc4M19SRUdfUE9XRVJfQ09OVFJPTF8yLCAweDNGRSwgcmVnKTsKKworCW1jMTN4eHhfdW5sb2NrKG1jMTM3ODMpOworCisJcHdyLT5uYW1lID0gIm1jMTM3ODNfcHdyYnV0dG9uIjsKKwlwd3ItPnBoeXMgPSAibWMxMzc4M19wd3JidXR0b24vaW5wdXQwIjsKKwlwd3ItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJcHdyLT5rZXljb2RlID0gcHJpdi0+a2V5bWFwOworCXB3ci0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUocHJpdi0+a2V5bWFwKTsKKwlwd3ItPmtleWNvZGVzaXplID0gc2l6ZW9mKHByaXYtPmtleW1hcFswXSk7CisJX19zZXRfYml0KEVWX0tFWSwgcHdyLT5ldmJpdCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHdyKTsKKwlpZiAoZXJyKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHBvd2VyIGJ1dHRvbjogJWRcbiIsIGVycik7CisJCWdvdG8gZnJlZV9pcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlyZXR1cm4gMDsKKworZnJlZV9pcnE6CisJbWMxM3h4eF9sb2NrKG1jMTM3ODMpOworCisJaWYgKHBkYXRhLT5iM29uX2ZsYWdzICYgTUMxMzc4M19CVVRUT05fRU5BQkxFKQorCQltYzEzeHh4X2lycV9mcmVlKG1jMTM3ODMsIE1DMTM3ODNfSVJRX09OT0ZEMywgcHJpdik7CisKK2ZyZWVfaXJxX2IyOgorCWlmIChwZGF0YS0+YjJvbl9mbGFncyAmIE1DMTM3ODNfQlVUVE9OX0VOQUJMRSkKKwkJbWMxM3h4eF9pcnFfZnJlZShtYzEzNzgzLCBNQzEzNzgzX0lSUV9PTk9GRDIsIHByaXYpOworCitmcmVlX2lycV9iMToKKwlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUobWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQxLCBwcml2KTsKKworZnJlZV9wcml2OgorCW1jMTN4eHhfdW5sb2NrKG1jMTM3ODMpOworCWtmcmVlKHByaXYpOworCitmcmVlX2lucHV0X2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShwd3IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWMxMzc4M19wd3JidXR0b25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1jMTM3ODNfcHdyYiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWNvbnN0IHN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxMzc4Myk7CisKKwlpZiAocGRhdGEtPmIzb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQzLCBwcml2KTsKKwlpZiAocGRhdGEtPmIyb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQyLCBwcml2KTsKKwlpZiAocGRhdGEtPmIxb25fZmxhZ3MgJiBNQzEzNzgzX0JVVFRPTl9FTkFCTEUpCisJCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfT05PRkQxLCBwcml2KTsKKworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTM3ODMpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+cHdyKTsKKwlrZnJlZShwcml2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jMTM3ODNfcHdyYnV0dG9uX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbWMxMzc4M19wd3JidXR0b25fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYzEzNzgzX3B3cmJ1dHRvbl9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYzEzNzgzLXB3cmJ1dHRvbiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYzEzNzgzX3B3cmJ1dHRvbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWMxMzc4M19wd3JidXR0b25fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1jMTM3ODNfcHdyYnV0dG9uX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWMxMzc4M19wd3JidXR0b25fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYzEzNzgzX3B3cmJ1dHRvbl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWMxMzc4M19wd3JidXR0b25fZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06bWMxMzc4My1wd3JidXR0b24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUMxMzc4MyBQb3dlciBCdXR0b24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlBoaWxpcHBlIFJldG9ybmF6Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYwppbmRleCAwNzk0Nzc4Li40ZDYwMDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKQEAgLTg4LDEzICs4OCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1tYTg0NTBfcmVhZF94eXooc3RydWN0IG1tYTg0NTAgKm0sIGludCAqeCwgaW50ICp5LCBpbnQgKnopCitzdGF0aWMgaW50IG1tYTg0NTBfcmVhZF9ibG9jayhzdHJ1Y3QgbW1hODQ1MCAqbSwgdW5zaWduZWQgb2ZmLAorCQkJICAgICAgdTggKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmMgPSBtLT5jbGllbnQ7Ci0JdTggYnVmZls2XTsKIAlpbnQgZXJyOwogCi0JZXJyID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoYywgTU1BODQ1MF9PVVRfWF9MU0IsIDYsIGJ1ZmYpOworCWVyciA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGMsIG9mZiwgc2l6ZSwgYnVmKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZjLT5kZXYsCiAJCQkiZmFpbGVkIHRvIHJlYWQgYmxvY2sgZGF0YSBhdCAweCUwMngsIGVycm9yICVkXG4iLApAQCAtMTAyLDEwICsxMDIsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCSp4ID0gKChidWZmWzFdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbMF0gJiAweGYpOwotCSp5ID0gKChidWZmWzNdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbMl0gJiAweGYpOwotCSp6ID0gKChidWZmWzVdIDw8IDQpICYgMHhmZjApIHwgKGJ1ZmZbNF0gJiAweGYpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNCw3ICsxMTAsNyBAQAogCXN0cnVjdCBtbWE4NDUwICptID0gZGV2LT5wcml2YXRlOwogCWludCB4LCB5LCB6OwogCWludCByZXQ7Ci0JaW50IGVycjsKKwl1OCBidWZbNl07CiAKIAlyZXQgPSBtbWE4NDUwX3JlYWQobSwgTU1BODQ1MF9TVEFUVVMpOwogCWlmIChyZXQgPCAwKQpAQCAtMTIzLDEwICsxMTksMTQgQEAKIAlpZiAoIShyZXQgJiBNTUE4NDUwX1NUQVRVU19aWFlEUikpCiAJCXJldHVybjsKIAotCWVyciA9IG1tYTg0NTBfcmVhZF94eXoobSwgJngsICZ5LCAmeik7Ci0JaWYgKGVycikKKwlyZXQgPSBtbWE4NDUwX3JlYWRfYmxvY2sobSwgTU1BODQ1MF9PVVRfWF9MU0IsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyZXQgPCAwKQogCQlyZXR1cm47CiAKKwl4ID0gKChidWZbMV0gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzBdICYgMHhmKTsKKwl5ID0gKChidWZbM10gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzJdICYgMHhmKTsKKwl6ID0gKChidWZbNV0gPDwgNCkgJiAweGZmMCkgfCAoYnVmWzRdICYgMHhmKTsKKwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1gsIHgpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1ksIHkpOwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dCwgQUJTX1osIHopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3BtOHh4eC12aWJyYXRvci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3BtOHh4eC12aWJyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTkyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcG04eHh4LXZpYnJhdG9yLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvcG04eHh4L2NvcmUuaD4KKworI2RlZmluZSBWSUJfRFJWCQkJMHg0QQorCisjZGVmaW5lIFZJQl9EUlZfU0VMX01BU0sJMHhmOAorI2RlZmluZSBWSUJfRFJWX1NFTF9TSElGVAkweDAzCisjZGVmaW5lIFZJQl9EUlZfRU5fTUFOVUFMX01BU0sJMHhmYworCisjZGVmaW5lIFZJQl9NQVhfTEVWRUxfbVYJKDMxMDApCisjZGVmaW5lIFZJQl9NSU5fTEVWRUxfbVYJKDEyMDApCisjZGVmaW5lIFZJQl9NQVhfTEVWRUxTCQkoVklCX01BWF9MRVZFTF9tViAtIFZJQl9NSU5fTEVWRUxfbVYpCisKKyNkZWZpbmUgTUFYX0ZGX1NQRUVECQkweGZmCisKKy8qKgorICogc3RydWN0IHBtOHh4eF92aWIgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB2aWJyYXRvciBkYXRhCisgKiBAdmliX2lucHV0X2RldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgZm9yY2UgZmVlZGJhY2sKKyAqIEB3b3JrOiB3b3JrIHN0cnVjdHVyZSB0byBzZXQgdGhlIHZpYnJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAZGV2OiBkZXZpY2Ugc3VwcG9ydGluZyBmb3JjZSBmZWVkYmFjaworICogQHNwZWVkOiBzcGVlZCBvZiB2aWJyYXRpb24gc2V0IGZyb20gdXNlcmxhbmQKKyAqIEBhY3RpdmU6IHN0YXRlIG9mIHZpYnJhdG9yCisgKiBAbGV2ZWw6IGxldmVsIG9mIHZpYnJhdGlvbiB0byBzZXQgaW4gdGhlIGNoaXAKKyAqIEByZWdfdmliX2RydjogVklCX0RSViByZWdpc3RlciB2YWx1ZQorICovCitzdHJ1Y3QgcG04eHh4X3ZpYiB7CisJc3RydWN0IGlucHV0X2RldiAqdmliX2lucHV0X2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHNwZWVkOworCWludCBsZXZlbDsKKwlib29sIGFjdGl2ZTsKKwl1OCAgcmVnX3ZpYl9kcnY7Cit9OworCisvKioKKyAqIHBtOHh4eF92aWJfcmVhZF91OCAtIGhlbHBlciB0byByZWFkIGEgYnl0ZSBmcm9tIHBtaWMgY2hpcAorICogQHZpYjogcG9pbnRlciB0byB2aWJyYXRvciBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiBwbGFjZWhvbGRlciBmb3IgZGF0YSB0byBiZSByZWFkCisgKiBAcmVnOiByZWdpc3RlciBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgcG04eHh4X3ZpYl9yZWFkX3U4KHN0cnVjdCBwbTh4eHhfdmliICp2aWIsCisJCQkJIHU4ICpkYXRhLCB1MTYgcmVnKQoreworCWludCByYzsKKworCXJjID0gcG04eHh4X3JlYWRiKHZpYi0+ZGV2LT5wYXJlbnQsIHJlZywgZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJZGV2X3dhcm4odmliLT5kZXYsICJFcnJvciByZWFkaW5nIHBtOHh4eCByZWcgMHgleCgweCV4KVxuIiwKKwkJCQlyZWcsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcG04eHh4X3ZpYl93cml0ZV91OCAtIGhlbHBlciB0byB3cml0ZSBhIGJ5dGUgdG8gcG1pYyBjaGlwCisgKiBAdmliOiBwb2ludGVyIHRvIHZpYnJhdG9yIHN0cnVjdHVyZQorICogQGRhdGE6IGRhdGEgdG8gd3JpdGUKKyAqIEByZWc6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3dyaXRlX3U4KHN0cnVjdCBwbTh4eHhfdmliICp2aWIsCisJCQkJIHU4IGRhdGEsIHUxNiByZWcpCit7CisJaW50IHJjOworCisJcmMgPSBwbTh4eHhfd3JpdGViKHZpYi0+ZGV2LT5wYXJlbnQsIHJlZywgZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJZGV2X3dhcm4odmliLT5kZXYsICJFcnJvciB3cml0aW5nIHBtOHh4eCByZWcgMHgleCgweCV4KVxuIiwKKwkJCQlyZWcsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogcG04eHh4X3ZpYl9zZXQgLSBoYW5kbGVyIHRvIHN0YXJ0L3N0b3AgdmlicmF0aW9uCisgKiBAdmliOiBwb2ludGVyIHRvIHZpYnJhdG9yIHN0cnVjdHVyZQorICogQG9uOiBzdGF0ZSB0byBzZXQKKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3NldChzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliLCBib29sIG9uKQoreworCWludCByYzsKKwl1OCB2YWwgPSB2aWItPnJlZ192aWJfZHJ2OworCisJaWYgKG9uKQorCQl2YWwgfD0gKCh2aWItPmxldmVsIDw8IFZJQl9EUlZfU0VMX1NISUZUKSAmIFZJQl9EUlZfU0VMX01BU0spOworCWVsc2UKKwkJdmFsICY9IH5WSUJfRFJWX1NFTF9NQVNLOworCisJcmMgPSBwbTh4eHhfdmliX3dyaXRlX3U4KHZpYiwgdmFsLCBWSUJfRFJWKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwl2aWItPnJlZ192aWJfZHJ2ID0gdmFsOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtOHh4eF93b3JrX2hhbmRsZXIgLSB3b3JrZXIgdG8gc2V0IHZpYnJhdGlvbiBsZXZlbAorICogQHdvcms6IHBvaW50ZXIgdG8gd29ya19zdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgcG04eHh4X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBtOHh4eF92aWIgKnZpYiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG04eHh4X3ZpYiwgd29yayk7CisJaW50IHJjOworCXU4IHZhbDsKKworCXJjID0gcG04eHh4X3ZpYl9yZWFkX3U4KHZpYiwgJnZhbCwgVklCX0RSVik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBwbWljIHZpYnJhdG9yIHN1cHBvcnRzIHZvbHRhZ2UgcmFuZ2VzIGZyb20gMS4yIHRvIDMuMVYsIHNvCisJICogc2NhbGUgdGhlIGxldmVsIHRvIGZpdCBpbnRvIHRoZXNlIHJhbmdlcy4KKwkgKi8KKwlpZiAodmliLT5zcGVlZCkgeworCQl2aWItPmFjdGl2ZSA9IHRydWU7CisJCXZpYi0+bGV2ZWwgPSAoKFZJQl9NQVhfTEVWRUxTICogdmliLT5zcGVlZCkgLyBNQVhfRkZfU1BFRUQpICsKKwkJCQkJCVZJQl9NSU5fTEVWRUxfbVY7CisJCXZpYi0+bGV2ZWwgLz0gMTAwOworCX0gZWxzZSB7CisJCXZpYi0+YWN0aXZlID0gZmFsc2U7CisJCXZpYi0+bGV2ZWwgPSBWSUJfTUlOX0xFVkVMX21WIC8gMTAwOworCX0KKworCXBtOHh4eF92aWJfc2V0KHZpYiwgdmliLT5hY3RpdmUpOworfQorCisvKioKKyAqIHBtOHh4eF92aWJfY2xvc2UgLSBjYWxsYmFjayBvZiBpbnB1dCBjbG9zZSBjYWxsYmFjaworICogQGRldjogaW5wdXQgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBUdXJucyBvZmYgdGhlIHZpYnJhdG9yLgorICovCitzdGF0aWMgdm9pZCBwbTh4eHhfdmliX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNhbmNlbF93b3JrX3N5bmMoJnZpYi0+d29yayk7CisJaWYgKHZpYi0+YWN0aXZlKQorCQlwbTh4eHhfdmliX3NldCh2aWIsIGZhbHNlKTsKK30KKworLyoqCisgKiBwbTh4eHhfdmliX3BsYXlfZWZmZWN0IC0gZnVuY3Rpb24gdG8gaGFuZGxlIHZpYiBlZmZlY3RzLgorICogQGRldjogaW5wdXQgZGV2aWNlIHBvaW50ZXIKKyAqIEBkYXRhOiBkYXRhIG9mIGVmZmVjdAorICogQGVmZmVjdDogZWZmZWN0IHRvIHBsYXkKKyAqCisgKiBDdXJyZW50bHkgdGhpcyBkcml2ZXIgc3VwcG9ydHMgb25seSBydW1ibGUgZWZmZWN0cy4KKyAqLworc3RhdGljIGludCBwbTh4eHhfdmliX3BsYXlfZWZmZWN0KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCQkgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXZpYi0+c3BlZWQgPSBlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGUgPj4gODsKKwlpZiAoIXZpYi0+c3BlZWQpCisJCXZpYi0+c3BlZWQgPSBlZmZlY3QtPnUucnVtYmxlLndlYWtfbWFnbml0dWRlID4+IDk7CisKKwlzY2hlZHVsZV93b3JrKCZ2aWItPndvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtOHh4eF92aWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKKworeworCXN0cnVjdCBwbTh4eHhfdmliICp2aWI7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKwl1OCB2YWw7CisKKwl2aWIgPSBremFsbG9jKHNpemVvZigqdmliKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF2aWIgfHwgIWlucHV0X2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCUlOSVRfV09SSygmdmliLT53b3JrLCBwbTh4eHhfd29ya19oYW5kbGVyKTsKKwl2aWItPmRldiA9ICZwZGV2LT5kZXY7CisJdmliLT52aWJfaW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCisJLyogb3BlcmF0ZSBpbiBtYW51YWwgbW9kZSAqLworCWVycm9yID0gcG04eHh4X3ZpYl9yZWFkX3U4KHZpYiwgJnZhbCwgVklCX0RSVik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJfZnJlZV9tZW07CisJdmFsICY9IH5WSUJfRFJWX0VOX01BTlVBTF9NQVNLOworCWVycm9yID0gcG04eHh4X3ZpYl93cml0ZV91OCh2aWIsIHZhbCwgVklCX0RSVik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJfZnJlZV9tZW07CisKKwl2aWItPnJlZ192aWJfZHJ2ID0gdmFsOworCisJaW5wdXRfZGV2LT5uYW1lID0gInBtOHh4eF92aWJfZmZtZW1sZXNzIjsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAxOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5wdXRfZGV2LT5jbG9zZSA9IHBtOHh4eF92aWJfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB2aWIpOworCWlucHV0X3NldF9jYXBhYmlsaXR5KHZpYi0+dmliX2lucHV0X2RldiwgRVZfRkYsIEZGX1JVTUJMRSk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGlucHV0X2RldiwgTlVMTCwKKwkJCQkJcG04eHh4X3ZpYl9wbGF5X2VmZmVjdCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJjb3VsZG4ndCByZWdpc3RlciB2aWJyYXRvciBhcyBGRiBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9kZXN0cm95X21lbWxlc3M7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdmliKTsKKwlyZXR1cm4gMDsKKworZXJyX2Rlc3Ryb3lfbWVtbGVzczoKKwlpbnB1dF9mZl9kZXN0cm95KGlucHV0X2Rldik7CitlcnJfZnJlZV9tZW06CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZSh2aWIpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbTh4eHhfdmliX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTh4eHhfdmliICp2aWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHZpYi0+dmliX2lucHV0X2Rldik7CisJa2ZyZWUodmliKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgcG04eHh4X3ZpYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG04eHh4X3ZpYiAqdmliID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiBUdXJuIG9mZiB0aGUgdmlicmF0b3IgKi8KKwlwbTh4eHhfdmliX3NldCh2aWIsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwbTh4eHhfdmliX3BtX29wcywgcG04eHh4X3ZpYl9zdXNwZW5kLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG04eHh4X3ZpYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBtOHh4eF92aWJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbTh4eHhfdmliX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBtOHh4eC12aWIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnBtOHh4eF92aWJfcG1fb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbTh4eHhfdmliX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbTh4eHhfdmliX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwbTh4eHhfdmliX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcG04eHh4X3ZpYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBtOHh4eF92aWJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBtOHh4eF92aWJfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06cG04eHh4X3ZpYiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQTUlDOHh4eCB2aWJyYXRvciBkcml2ZXIgYmFzZWQgb24gZmYtbWVtbGVzcyBmcmFtZXdvcmsiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkFteSBNYWxvY2hlIDxhbWFsb2NoZUBjb2RlYXVyb3JhLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy90d2w2MDQwLXZpYnJhLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdHdsNjA0MC12aWJyYS5jCmluZGV4IGM0MzAwMmUuLmFkMTUzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy90d2w2MDQwLXZpYnJhLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3R3bDYwNDAtdmlicmEuYwpAQCAtNzQsMTIgKzc0LDEyIEBACiAJaWYgKHN0YXR1cyAmIFRXTDYwNDBfVklCTE9DREVUKSB7CiAJCWRldl93YXJuKGluZm8tPmRldiwgIkxlZnQgVmlicmF0b3Igb3ZlcmN1cnJlbnQgZGV0ZWN0ZWRcbiIpOwogCQl0d2w2MDQwX2NsZWFyX2JpdHModHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMTCwKLQkJCQkgICBUV0w2MDQwX1ZJQkVOQUwpOworCQkJCSAgIFRXTDYwNDBfVklCRU5BKTsKIAl9CiAJaWYgKHN0YXR1cyAmIFRXTDYwNDBfVklCUk9DREVUKSB7CiAJCWRldl93YXJuKGluZm8tPmRldiwgIlJpZ2h0IFZpYnJhdG9yIG92ZXJjdXJyZW50IGRldGVjdGVkXG4iKTsKIAkJdHdsNjA0MF9jbGVhcl9iaXRzKHR3bDYwNDAsIFRXTDYwNDBfUkVHX1ZJQkNUTFIsCi0JCQkJICAgVFdMNjA0MF9WSUJFTkFSKTsKKwkJCQkgICBUV0w2MDQwX1ZJQkVOQSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtOTcsMjMgKzk3LDIzIEBACiAJfQogCiAJdHdsNjA0MF9wb3dlcihpbmZvLT50d2w2MDQwLCAxKTsKLQlpZiAodHdsNjA0MC0+cmV2IDw9IFRXTDYwNDBfUkVWX0VTMV8xKSB7CisJaWYgKHR3bDYwNDBfZ2V0X3JldmlkKHR3bDYwNDApIDw9IFRXTDYwNDBfUkVWX0VTMV8xKSB7CiAJCS8qCiAJCSAqIEVSUkFUQTogRGlzYWJsZSBvdmVyY3VycmVudCBwcm90ZWN0aW9uIGZvciBhdCBsZWFzdAogCQkgKiAzbXMgd2hlbiBlbmFibGluZyB2aWJyYXRvciBkcml2ZXJzIHRvIGF2b2lkIGZhbHNlCiAJCSAqIG92ZXJjdXJyZW50IGRldGVjdGlvbgogCQkgKi8KIAkJdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMTCwKLQkJCQkgIFRXTDYwNDBfVklCRU5BTCB8IFRXTDYwNDBfVklCQ1RSTEwpOworCQkJCSAgVFdMNjA0MF9WSUJFTkEgfCBUV0w2MDQwX1ZJQkNUUkwpOwogCQl0d2w2MDQwX3JlZ193cml0ZSh0d2w2MDQwLCBUV0w2MDQwX1JFR19WSUJDVExSLAotCQkJCSAgVFdMNjA0MF9WSUJFTkFSIHwgVFdMNjA0MF9WSUJDVFJMUik7CisJCQkJICBUV0w2MDQwX1ZJQkVOQSB8IFRXTDYwNDBfVklCQ1RSTCk7CiAJCXVzbGVlcF9yYW5nZSgzMDAwLCAzNTAwKTsKIAl9CiAKIAl0d2w2MDQwX3JlZ193cml0ZSh0d2w2MDQwLCBUV0w2MDQwX1JFR19WSUJDVExMLAotCQkJICBUV0w2MDQwX1ZJQkVOQUwpOworCQkJICBUV0w2MDQwX1ZJQkVOQSk7CiAJdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgVFdMNjA0MF9SRUdfVklCQ1RMUiwKLQkJCSAgVFdMNjA0MF9WSUJFTkFSKTsKKwkJCSAgVFdMNjA0MF9WSUJFTkEpOwogCiAJaW5mby0+ZW5hYmxlZCA9IHRydWU7CiB9CkBAIC0yMDEsNiArMjAxLDEzIEBACiAJc3RydWN0IHZpYnJhX2luZm8gKmluZm8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dCk7CiAJaW50IHJldDsKIAorCS8qIERvIG5vdCBhbGxvdyBlZmZlY3QsIHdoaWxlIHRoZSByb3V0aW5nIGlzIHNldCB0byB1c2UgYXVkaW8gKi8KKwlyZXQgPSB0d2w2MDQwX2dldF92aWJyYWxyX3N0YXR1cyhpbmZvLT50d2w2MDQwKTsKKwlpZiAocmV0ICYgVFdMNjA0MF9WSUJTRUwpIHsKKwkJZGV2X2luZm8oJmlucHV0LT5kZXYsICJWaWJyYSBpcyBjb25maWd1cmVkIGZvciBhdWRpb1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJaW5mby0+d2Vha19zcGVlZCA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CiAJaW5mby0+c3Ryb25nX3NwZWVkID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOwogCWluZm8tPmRpcmVjdGlvbiA9IGVmZmVjdC0+ZGlyZWN0aW9uIDwgRUZGRUNUX0RJUl8xODBfREVHID8gMSA6IC0xOwpAQCAtMjI4LDcgKzIzNSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CiB9CiAKLSNpZiBDT05GSUdfUE1fU0xFRVAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgdHdsNjA0MF92aWJyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDk5ZDU4NzYuLjAwMzU4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgInBzbW91c2UuaCIKICNpbmNsdWRlICJhbHBzLmgiCiAKLSN1bmRlZiBERUJVRwotI2lmZGVmIERFQlVHCi0jZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiYWxwcy5jOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KICNkZWZpbmUgQUxQU19PTERQUk9UTwkJMHgwMQkvKiBvbGQgc3R5bGUgaW5wdXQgKi8KICNkZWZpbmUgQUxQU19EVUFMUE9JTlQJCTB4MDIJLyogdG91Y2hwYWQgaGFzIHRyYWNrc3RpY2sgKi8KICNkZWZpbmUgQUxQU19QQVNTCQkweDA0CS8qIGRldmljZSBoYXMgYSBwYXNzLXRocm91Z2ggcG9ydCAqLwpAQCAtMjk3LDEwICsyOTAsMTAgQEAKIAkJICAgICAgcHNtb3VzZS0+cGFja2V0WzRdIHwKIAkJICAgICAgcHNtb3VzZS0+cGFja2V0WzVdKSAmIDB4ODApIHx8CiAJCSAgICAoIWFscHNfaXNfdmFsaWRfZmlyc3RfYnl0ZShwcml2LT5pLCBwc21vdXNlLT5wYWNrZXRbNl0pKSkgewotCQkJZGJnKCJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggJXggIgotCQkJICAgICIoc3VzcGVjdGVkIGludGVybGVhdmVkIHBzLzIpXG4iLAotCQkJICAgIHBzbW91c2UtPnBhY2tldFszXSwgcHNtb3VzZS0+cGFja2V0WzRdLAotCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSwgcHNtb3VzZS0+cGFja2V0WzZdKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggJXggKHN1c3BlY3RlZCBpbnRlcmxlYXZlZCBwcy8yKVxuIiwKKwkJCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCisJCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSwgcHNtb3VzZS0+cGFja2V0WzZdKTsKIAkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCQl9CiAKQEAgLTMxOSwxMyArMzEyLDEzIEBACiAJCSAqIFRoZXJlIGlzIGFsc28gcG9zc2liaWxpdHkgdGhhdCB3ZSBnb3QgNi1ieXRlIEFMUFMKIAkJICogcGFja2V0IGZvbGxvd2VkICBieSAzLWJ5dGUgcGFja2V0IGZyb20gdHJhY2twb2ludC4gV2UKIAkJICogY2FuIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZXNlIDIgc2NlbmFyaW9zIGJ1dAotCQkgKiBiZWNhc2UgdGhlIGxhdHRlciBpcyB1bmxpa2VseSB0byBoYXBwZW4gaW4gY291cnNlIG9mCisJCSAqIGJlY2F1c2UgdGhlIGxhdHRlciBpcyB1bmxpa2VseSB0byBoYXBwZW4gaW4gY291cnNlIG9mCiAJCSAqIG5vcm1hbCBvcGVyYXRpb24gKHVzZXIgd291bGQgbmVlZCB0byBwcmVzcyBhbGwKIAkJICogYnV0dG9ucyBvbiB0aGUgcGFkIGFuZCBzdGFydCBtb3ZpbmcgdHJhY2twb2ludAogCQkgKiB3aXRob3V0IHRvdWNoaW5nIHRoZSBwYWQgc3VyZmFjZSkgd2UgYXNzdW1lIGZvcm1lci4KIAkJICogRXZlbiBpZiB3ZSBhcmUgd3JvbmcgdGhlIHdvc3QgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW4KIAkJICogdGhlIGN1cnNvciB3b3VsZCBqdW1wIGJ1dCB3ZSBzaG91bGQgbm90IGdldCBwcm90b2NvbAotCQkgKiBkZXN5bmNocm9uaXphdGlvbi4KKwkJICogZGUtc3luY2hyb25pemF0aW9uLgogCQkgKi8KIAogCQlhbHBzX3JlcG9ydF9iYXJlX3BzMl9wYWNrZXQocHNtb3VzZSwgJnBzbW91c2UtPnBhY2tldFszXSwKQEAgLTM2MSwxMCArMzU0LDEwIEBACiAJCWlmICgocHNtb3VzZS0+cGFja2V0WzNdIHwKIAkJICAgICBwc21vdXNlLT5wYWNrZXRbNF0gfAogCQkgICAgIHBzbW91c2UtPnBhY2tldFs1XSkgJiAweDgwKSB7Ci0JCQlkYmcoInJlZnVzaW5nIHBhY2tldCAleCAleCAleCAiCi0JCQkgICAgIihzdXNwZWN0ZWQgaW50ZXJsZWF2ZWQgcHMvMilcbiIsCi0JCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCi0JCQkgICAgcHNtb3VzZS0+cGFja2V0WzVdKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJyZWZ1c2luZyBwYWNrZXQgJXggJXggJXggKHN1c3BlY3RlZCBpbnRlcmxlYXZlZCBwcy8yKVxuIiwKKwkJCQkgICAgcHNtb3VzZS0+cGFja2V0WzNdLCBwc21vdXNlLT5wYWNrZXRbNF0sCisJCQkJICAgIHBzbW91c2UtPnBhY2tldFs1XSk7CiAJCX0gZWxzZSB7CiAJCQlhbHBzX3Byb2Nlc3NfcGFja2V0KHBzbW91c2UpOwogCQl9CkBAIC0zOTYsMTYgKzM4OSwxOCBAQAogCX0KIAogCWlmICghYWxwc19pc192YWxpZF9maXJzdF9ieXRlKG1vZGVsLCBwc21vdXNlLT5wYWNrZXRbMF0pKSB7Ci0JCWRiZygicmVmdXNpbmcgcGFja2V0WzBdID0gJXggKG1hc2swID0gJXgsIGJ5dGUwID0gJXgpXG4iLAotCQkgICAgcHNtb3VzZS0+cGFja2V0WzBdLCBtb2RlbC0+bWFzazAsIG1vZGVsLT5ieXRlMCk7CisJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkgICAgInJlZnVzaW5nIHBhY2tldFswXSA9ICV4IChtYXNrMCA9ICV4LCBieXRlMCA9ICV4KVxuIiwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMF0sIG1vZGVsLT5tYXNrMCwgbW9kZWwtPmJ5dGUwKTsKIAkJcmV0dXJuIFBTTU9VU0VfQkFEX0RBVEE7CiAJfQogCiAJLyogQnl0ZXMgMiAtIDYgc2hvdWxkIGhhdmUgMCBpbiB0aGUgaGlnaGVzdCBiaXQgKi8KIAlpZiAocHNtb3VzZS0+cGt0Y250ID49IDIgJiYgcHNtb3VzZS0+cGt0Y250IDw9IDYgJiYKIAkgICAgKHBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQgLSAxXSAmIDB4ODApKSB7Ci0JCWRiZygicmVmdXNpbmcgcGFja2V0WyVpXSA9ICV4XG4iLAotCQkgICAgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHNtb3VzZS0+cGFja2V0W3BzbW91c2UtPnBrdGNudCAtIDFdKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInJlZnVzaW5nIHBhY2tldFslaV0gPSAleFxuIiwKKwkJCSAgICBwc21vdXNlLT5wa3RjbnQgLSAxLAorCQkJICAgIHBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQgLSAxXSk7CiAJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCX0KIApAQCAtNDM5LDcgKzQzNCw4IEBACiAJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX0dFVElORk8pKQogCQlyZXR1cm4gTlVMTDsKIAotCWRiZygiRTYgcmVwb3J0OiAlMi4yeCAlMi4yeCAlMi4yeCIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCXBzbW91c2VfZGJnKHBzbW91c2UsICJFNiByZXBvcnQ6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwKKwkJICAgIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwogCiAJaWYgKHBhcmFtWzBdICE9IDAgfHwgcGFyYW1bMV0gIT0gMCB8fCAocGFyYW1bMl0gIT0gMTAgJiYgcGFyYW1bMl0gIT0gMTAwKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC00NTksNyArNDU1LDggQEAKIAlpZiAocHMyX2NvbW1hbmQocHMyZGV2LCBwYXJhbSwgUFNNT1VTRV9DTURfR0VUSU5GTykpCiAJCXJldHVybiBOVUxMOwogCi0JZGJnKCJFNyByZXBvcnQ6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwgIkU3IHJlcG9ydDogJTIuMnggJTIuMnggJTIuMngiLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlpZiAodmVyc2lvbikgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcykgJiYgcGFyYW1bMl0gIT0gcmF0ZXNbaV07IGkrKykKQEAgLTUyNyw3ICs1MjQsOCBAQAogCSAgICBwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkKIAkJcmV0dXJuIC0xOwogCi0JZGJnKCJTdGF0dXM6ICUyLjJ4ICUyLjJ4ICUyLjJ4IiwgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwgIlN0YXR1czogJTIuMnggJTIuMnggJTIuMngiLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNSwxMiArNjAzLDEyIEBACiAJfQogCiAJaWYgKGFscHNfdGFwX21vZGUocHNtb3VzZSwgdHJ1ZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxwcy5jOiBGYWlsZWQgdG8gZW5hYmxlIGhhcmR3YXJlIHRhcHBpbmdcbiIpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byBlbmFibGUgaGFyZHdhcmUgdGFwcGluZ1xuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoYWxwc19hYnNvbHV0ZV9tb2RlKHBzbW91c2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWxwcy5jOiBGYWlsZWQgdG8gZW5hYmxlIGFic29sdXRlIG1vZGVcbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiRmFpbGVkIHRvIGVuYWJsZSBhYnNvbHV0ZSBtb2RlXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjIxLDcgKzYxOSw3IEBACiAKIAkvKiBBTFBTIG5lZWRzIHN0cmVhbSBtb2RlLCBvdGhlcndpc2UgaXQgd29uJ3QgcmVwb3J0IGFueSBkYXRhICovCiAJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNUUkVBTSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhbHBzLmM6IEZhaWxlZCB0byBlbmFibGUgc3RyZWFtIG1vZGVcbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiRmFpbGVkIHRvIGVuYWJsZSBzdHJlYW0gbW9kZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYwppbmRleCAzMjUwMzU2Li4wOWI5M2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5jCkBAIC0xMCw4ICsxMCw2IEBACiAgKiBUcmFkZW1hcmtzIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCiAgKi8KIAotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfQkFTRU5BTUUgIjogIiBmbXQKLQogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjUsMTMgKzIzLDEwIEBACiAjZGVmaW5lIGVsYW50ZWNoX2RlYnVnKGZtdCwgLi4uKQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKGV0ZC0+ZGVidWcpCQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pOwlcCisJCQlwc21vdXNlX3ByaW50ayhLRVJOX0RFQlVHLCBwc21vdXNlLAkJXAorCQkJCQlmbXQsICMjX19WQV9BUkdTX18pOwkJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBib29sIGZvcmNlX2VsYW50ZWNoOwotbW9kdWxlX3BhcmFtX25hbWVkKGZvcmNlX2VsYW50ZWNoLCBmb3JjZV9lbGFudGVjaCwgYm9vbCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2VsYW50ZWNoLCAiRm9yY2UgdGhlIEVsYW50ZWNoIFBTLzIgcHJvdG9jb2wgZXh0ZW5zaW9uIHRvIGJlIHVzZWQsIDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKGRlZmF1bHQpLiIpOwotCiAvKgogICogU2VuZCBhIFN5bmFwdGljcyBzdHlsZSBzbGljZWQgcXVlcnkgY29tbWFuZAogICovCkBAIC00MCw3ICszNSw3IEBACiB7CiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgYykgfHwKIAkgICAgcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgcGFyYW0sIFBTTU9VU0VfQ01EX0dFVElORk8pKSB7Ci0JCXByX2Vycigic3luYXB0aWNzX3NlbmRfY21kIHF1ZXJ5IDB4JTAyeCBmYWlsZWQuXG4iLCBjKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIiVzIHF1ZXJ5IDB4JTAyeCBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgYyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY5LDcgKzY0LDcgQEAKIAl9IHdoaWxlICh0cmllcyA+IDApOwogCiAJaWYgKHJjKQotCQlwcl9lcnIoInBzMiBjb21tYW5kIDB4JTAyeCBmYWlsZWQuXG4iLCBjb21tYW5kKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgInBzMiBjb21tYW5kIDB4JTAyeCBmYWlsZWQuXG4iLCBjb21tYW5kKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTg0LDcgKzc5LDcgQEAKIAl1bnNpZ25lZCBjaGFyIHBhcmFtWzNdOwogCWludCByYyA9IDA7CiAKLQlpZiAocmVnIDwgMHgxMCB8fCByZWcgPiAweDI2KQorCWlmIChyZWcgPCAweDA3IHx8IHJlZyA+IDB4MjYpCiAJCXJldHVybiAtMTsKIAogCWlmIChyZWcgPiAweDExICYmIHJlZyA8IDB4MjApCkBAIC0xMDgsMTIgKzEwMywyNCBAQAogCQkJcmMgPSAtMTsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMyAuLi4gNDoKKwkJaWYgKGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUkVHSVNURVJfUkVBRFdSSVRFKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1BTMl9DVVNUT01fQ09NTUFORCkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIHJlZykgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkgeworCQkJcmMgPSAtMTsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgMHglMDJ4LlxuIiwgcmVnKTsKLQllbHNlCisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcmVhZCByZWdpc3RlciAweCUwMnguXG4iLCByZWcpOworCWVsc2UgaWYgKGV0ZC0+aHdfdmVyc2lvbiAhPSA0KQogCQkqdmFsID0gcGFyYW1bMF07CisJZWxzZQorCQkqdmFsID0gcGFyYW1bMV07CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMjcsNyArMTM0LDcgQEAKIAlzdHJ1Y3QgZWxhbnRlY2hfZGF0YSAqZXRkID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKHJlZyA8IDB4MTAgfHwgcmVnID4gMHgyNikKKwlpZiAocmVnIDwgMHgwNyB8fCByZWcgPiAweDI2KQogCQlyZXR1cm4gLTE7CiAKIAlpZiAocmVnID4gMHgxMSAmJiByZWcgPCAweDIwKQpAQCAtMTU0LDExICsxNjEsMzggQEAKIAkJCXJjID0gLTE7CiAJCX0KIAkJYnJlYWs7CisKKwljYXNlIDM6CisJCWlmIChlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCByZWcpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgdmFsKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgUFNNT1VTRV9DTURfU0VUU0NBTEUxMSkpIHsKKwkJCXJjID0gLTE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCWlmIChlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCByZWcpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBFVFBfUFMyX0NVU1RPTV9DT01NQU5EKSB8fAorCQkgICAgZWxhbnRlY2hfcHMyX2NvbW1hbmQocHNtb3VzZSwgTlVMTCwgRVRQX1JFR0lTVEVSX1JFQURXUklURSkgfHwKKwkJICAgIGVsYW50ZWNoX3BzMl9jb21tYW5kKHBzbW91c2UsIE5VTEwsIEVUUF9QUzJfQ1VTVE9NX0NPTU1BTkQpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCB2YWwpIHx8CisJCSAgICBlbGFudGVjaF9wczJfY29tbWFuZChwc21vdXNlLCBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSkgeworCQkJcmMgPSAtMTsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyIDB4JTAyeCB3aXRoIHZhbHVlIDB4JTAyeC5cbiIsCi0JCQlyZWcsIHZhbCk7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsCisJCQkgICAgImZhaWxlZCB0byB3cml0ZSByZWdpc3RlciAweCUwMnggd2l0aCB2YWx1ZSAweCUwMnguXG4iLAorCQkJICAgIHJlZywgdmFsKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTE2NiwxMyArMjAwLDEzIEBACiAvKgogICogRHVtcCBhIGNvbXBsZXRlIG1vdXNlIG1vdmVtZW50IHBhY2tldCB0byB0aGUgc3lzbG9nCiAgKi8KLXN0YXRpYyB2b2lkIGVsYW50ZWNoX3BhY2tldF9kdW1wKHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBlbGFudGVjaF9wYWNrZXRfZHVtcChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKIAlpbnQJaTsKIAotCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiUFMvMiBwYWNrZXQgWyIpKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlwcmludGsoIiVzMHglMDJ4ICIsIChpKSA/ICIsICIgOiAiICIsIHBhY2tldFtpXSk7CisJcHNtb3VzZV9wcmludGsoS0VSTl9ERUJVRywgcHNtb3VzZSwgIlBTLzIgcGFja2V0IFsiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHNtb3VzZS0+cGt0c2l6ZTsgaSsrKQorCQlwcmludGsoIiVzMHglMDJ4ICIsIGkgPyAiLCAiIDogIiAiLCBwc21vdXNlLT5wYWNrZXRbaV0pOwogCXByaW50aygiXVxuIik7CiB9CiAKQEAgLTIyMyw3ICsyNTcsNyBAQAogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCiAJCQkoKHBhY2tldFsxXSAmIDB4MGMpIDw8IDYpIHwgcGFja2V0WzJdKTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAotCQkJRVRQX1lNQVhfVjEgLSAoKChwYWNrZXRbMV0gJiAweDAzKSA8PCA4KSB8IHBhY2tldFszXSkpOworCQkJZXRkLT55X21heCAtICgoKHBhY2tldFsxXSAmIDB4MDMpIDw8IDgpIHwgcGFja2V0WzNdKSk7CiAJfQogCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0ZJTkdFUiwgZmluZ2VycyA9PSAxKTsKQEAgLTIzMyw3ICsyNjcsNyBAQAogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOwogCiAJaWYgKGV0ZC0+ZndfdmVyc2lvbiA8IDB4MDIwMDAwICYmCi0JICAgIChldGQtPmNhcGFiaWxpdGllcyAmIEVUUF9DQVBfSEFTX1JPQ0tFUikpIHsKKwkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzWzBdICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgewogCQkvKiByb2NrZXIgdXAgKi8KIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBwYWNrZXRbMF0gJiAweDQwKTsKIAkJLyogcm9ja2VyIGRvd24gKi8KQEAgLTI3MywxMSArMzA3LDExIEBACiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKLQl1bnNpZ25lZCBpbnQgZmluZ2VycywgeDEgPSAwLCB5MSA9IDAsIHgyID0gMCwgeTIgPSAwLCB3aWR0aCA9IDAsIHByZXMgPSAwOworCXVuc2lnbmVkIGludCBmaW5nZXJzLCB4MSA9IDAsIHkxID0gMCwgeDIgPSAwLCB5MiA9IDA7CisJdW5zaWduZWQgaW50IHdpZHRoID0gMCwgcHJlcyA9IDA7CiAKIAkvKiBieXRlIDA6IG4xICBuMCAgIC4gICAuICAgLiAgIC4gICBSICAgTCAqLwogCWZpbmdlcnMgPSAocGFja2V0WzBdICYgMHhjMCkgPj4gNjsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBmaW5nZXJzICE9IDApOwogCiAJc3dpdGNoIChmaW5nZXJzKSB7CiAJY2FzZSAzOgpAQCAtMjkwLDE4ICszMjQsMTUgQEAKIAkJLyogcGFzcyB0aHJvdWdoLi4uICovCiAJY2FzZSAxOgogCQkvKgotCQkgKiBieXRlIDE6ICAuICAgLiAgIC4gICAuICAgLiAgeDEwIHg5ICB4OAorCQkgKiBieXRlIDE6ICAuICAgLiAgIC4gICAuICB4MTEgeDEwIHg5ICB4OAogCQkgKiBieXRlIDI6IHg3ICB4NiAgeDUgIHg0ICB4NCAgeDIgIHgxICB4MAogCQkgKi8KLQkJeDEgPSAoKHBhY2tldFsxXSAmIDB4MDcpIDw8IDgpIHwgcGFja2V0WzJdOworCQl4MSA9ICgocGFja2V0WzFdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbMl07CiAJCS8qCi0JCSAqIGJ5dGUgNDogIC4gICAuICAgLiAgIC4gICAuICAgLiAgeTkgIHk4CisJCSAqIGJ5dGUgNDogIC4gICAuICAgLiAgIC4gIHkxMSB5MTAgeTkgIHk4CiAJCSAqIGJ5dGUgNTogeTcgIHk2ICB5NSAgeTQgIHkzICB5MiAgeTEgIHkwCiAJCSAqLwotCQl5MSA9IEVUUF9ZTUFYX1YyIC0gKCgocGFja2V0WzRdICYgMHgwMykgPDwgOCkgfCBwYWNrZXRbNV0pOwotCi0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwkJeTEgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOwogCiAJCXByZXMgPSAocGFja2V0WzFdICYgMHhmMCkgfCAoKHBhY2tldFs0XSAmIDB4ZjApID4+IDQpOwogCQl3aWR0aCA9ICgocGFja2V0WzBdICYgMHgzMCkgPj4gMikgfCAoKHBhY2tldFszXSAmIDB4MzApID4+IDQpOwpAQCAtMzE0LDIyICszNDUsMTggQEAKIAkJICogYnl0ZSAwOiAgLiAgIC4gIGF5OCBheDggIC4gICAuICAgLiAgIC4KIAkJICogYnl0ZSAxOiBheDcgYXg2IGF4NSBheDQgYXgzIGF4MiBheDEgYXgwCiAJCSAqLwotCQl4MSA9ICgocGFja2V0WzBdICYgMHgxMCkgPDwgNCkgfCBwYWNrZXRbMV07CisJCXgxID0gKCgocGFja2V0WzBdICYgMHgxMCkgPDwgNCkgfCBwYWNrZXRbMV0pIDw8IDI7CiAJCS8qIGJ5dGUgMjogYXk3IGF5NiBheTUgYXk0IGF5MyBheTIgYXkxIGF5MCAqLwotCQl5MSA9IEVUUF8yRlRfWU1BWCAtICgoKHBhY2tldFswXSAmIDB4MjApIDw8IDMpIHwgcGFja2V0WzJdKTsKKwkJeTEgPSBldGQtPnlfbWF4IC0KKwkJCSgoKChwYWNrZXRbMF0gJiAweDIwKSA8PCAzKSB8IHBhY2tldFsyXSkgPDwgMik7CiAJCS8qCiAJCSAqIGJ5dGUgMzogIC4gICAuICBieTggYng4ICAuICAgLiAgIC4gICAuCiAJCSAqIGJ5dGUgNDogYng3IGJ4NiBieDUgYng0IGJ4MyBieDIgYngxIGJ4MAogCQkgKi8KLQkJeDIgPSAoKHBhY2tldFszXSAmIDB4MTApIDw8IDQpIHwgcGFja2V0WzRdOworCQl4MiA9ICgoKHBhY2tldFszXSAmIDB4MTApIDw8IDQpIHwgcGFja2V0WzRdKSA8PCAyOwogCQkvKiBieXRlIDU6IGJ5NyBieTggYnk1IGJ5NCBieTMgYnkyIGJ5MSBieTAgKi8KLQkJeTIgPSBFVFBfMkZUX1lNQVggLSAoKChwYWNrZXRbM10gJiAweDIwKSA8PCAzKSB8IHBhY2tldFs1XSk7Ci0JCS8qCi0JCSAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFggU3luYXB0aWNzIGRyaXZlciBzY2FsZSB1cAotCQkgKiBvbmUgY29vcmRpbmF0ZSBhbmQgcmVwb3J0IGFzIG9yZGluYXJ5IG1vdXNlIG1vdmVudAotCQkgKi8KLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4MSA8PCAyKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5MSA8PCAyKTsKKwkJeTIgPSBldGQtPnlfbWF4IC0KKwkJCSgoKChwYWNrZXRbM10gJiAweDIwKSA8PCAzKSB8IHBhY2tldFs1XSkgPDwgMik7CiAKIAkJLyogVW5rbm93biBzbyBqdXN0IHJlcG9ydCBzZW5zaWJsZSB2YWx1ZXMgKi8KIAkJcHJlcyA9IDEyNzsKQEAgLTMzNyw2ICszNjQsMTEgQEAKIAkJYnJlYWs7CiAJfQogCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZmluZ2VycyAhPSAwKTsKKwlpZiAoZmluZ2VycyAhPSAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwl9CiAJZWxhbnRlY2hfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsIGZpbmdlcnMsIHgxLCB5MSwgeDIsIHkyKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBmaW5nZXJzID09IDEpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIGZpbmdlcnMgPT0gMik7CkBAIC0zNTIsNyArMzg0LDIwOCBAQAogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotc3RhdGljIGludCBlbGFudGVjaF9jaGVja19wYXJpdHlfdjEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCisvKgorICogSW50ZXJwcmV0IGNvbXBsZXRlIGRhdGEgcGFja2V0cyBhbmQgcmVwb3J0IGFic29sdXRlIG1vZGUgaW5wdXQgZXZlbnRzIGZvcgorICogaGFyZHdhcmUgdmVyc2lvbiAzLiAoMTIgYnl0ZSBwYWNrZXRzIGZvciB0d28gZmluZ2VycykKKyAqLworc3RhdGljIHZvaWQgZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3YzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCQlpbnQgcGFja2V0X3R5cGUpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKwl1bnNpZ25lZCBpbnQgZmluZ2VycyA9IDAsIHgxID0gMCwgeTEgPSAwLCB4MiA9IDAsIHkyID0gMDsKKwl1bnNpZ25lZCBpbnQgd2lkdGggPSAwLCBwcmVzID0gMDsKKworCS8qIGJ5dGUgMDogbjEgIG4wICAgLiAgIC4gICAuICAgLiAgIFIgICBMICovCisJZmluZ2VycyA9IChwYWNrZXRbMF0gJiAweGMwKSA+PiA2OworCisJc3dpdGNoIChmaW5nZXJzKSB7CisJY2FzZSAzOgorCWNhc2UgMToKKwkJLyoKKwkJICogYnl0ZSAxOiAgLiAgIC4gICAuICAgLiAgeDExIHgxMCB4OSAgeDgKKwkJICogYnl0ZSAyOiB4NyAgeDYgIHg1ICB4NCAgeDQgIHgyICB4MSAgeDAKKwkJICovCisJCXgxID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJLyoKKwkJICogYnl0ZSA0OiAgLiAgIC4gICAuICAgLiAgeTExIHkxMCB5OSAgeTgKKwkJICogYnl0ZSA1OiB5NyAgeTYgIHk1ICB5NCAgeTMgIHkyICB5MSAgeTAKKwkJICovCisJCXkxID0gZXRkLT55X21heCAtICgoKHBhY2tldFs0XSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzVdKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmIChwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVjNfSEVBRCkgeworCQkJLyoKKwkJCSAqIGJ5dGUgMTogICAuICAgIC4gICAgLiAgICAuICBheDExIGF4MTAgYXg5ICBheDgKKwkJCSAqIGJ5dGUgMjogYXg3ICBheDYgIGF4NSAgYXg0ICBheDMgIGF4MiAgYXgxICBheDAKKwkJCSAqLworCQkJZXRkLT5tdFswXS54ID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJCS8qCisJCQkgKiBieXRlIDQ6ICAgLiAgICAuICAgIC4gICAgLiAgYXkxMSBheTEwIGF5OSAgYXk4CisJCQkgKiBieXRlIDU6IGF5NyAgYXk2ICBheTUgIGF5NCAgYXkzICBheTIgIGF5MSAgYXkwCisJCQkgKi8KKwkJCWV0ZC0+bXRbMF0ueSA9IGV0ZC0+eV9tYXggLQorCQkJCSgoKHBhY2tldFs0XSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzVdKTsKKwkJCS8qCisJCQkgKiB3YWl0IGZvciBuZXh0IHBhY2tldAorCQkJICovCisJCQlyZXR1cm47CisJCX0KKworCQkvKiBwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVjNfVEFJTCAqLworCQl4MSA9IGV0ZC0+bXRbMF0ueDsKKwkJeTEgPSBldGQtPm10WzBdLnk7CisJCXgyID0gKChwYWNrZXRbMV0gJiAweDBmKSA8PCA4KSB8IHBhY2tldFsyXTsKKwkJeTIgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOworCQlicmVhazsKKwl9CisKKwlwcmVzID0gKHBhY2tldFsxXSAmIDB4ZjApIHwgKChwYWNrZXRbNF0gJiAweGYwKSA+PiA0KTsKKwl3aWR0aCA9ICgocGFja2V0WzBdICYgMHgzMCkgPj4gMikgfCAoKHBhY2tldFszXSAmIDB4MzApID4+IDQpOworCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZmluZ2VycyAhPSAwKTsKKwlpZiAoZmluZ2VycyAhPSAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeDEpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkxKTsKKwl9CisJZWxhbnRlY2hfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsIGZpbmdlcnMsIHgxLCB5MSwgeDIsIHkyKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBmaW5nZXJzID09IDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIGZpbmdlcnMgPT0gMik7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1RSSVBMRVRBUCwgZmluZ2VycyA9PSAzKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIHByZXMpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVE9PTF9XSURUSCwgd2lkdGgpOworCisJaW5wdXRfc3luYyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBlbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihkZXYsIHRydWUpOworCWlucHV0X3N5bmMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wYWNrZXRfc3RhdHVzX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisJdW5zaWduZWQgZmluZ2VyczsKKwlpbnQgaTsKKworCS8qIG5vdGlmeSBmaW5nZXIgc3RhdGUgY2hhbmdlICovCisJZmluZ2VycyA9IHBhY2tldFsxXSAmIDB4MWY7CisJZm9yIChpID0gMDsgaSA8IEVUUF9NQVhfRklOR0VSUzsgaSsrKSB7CisJCWlmICgoZmluZ2VycyAmICgxIDw8IGkpKSA9PSAwKSB7CisJCQlpbnB1dF9tdF9zbG90KGRldiwgaSk7CisJCQlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCBmYWxzZSk7CisJCX0KKwl9CisKKwllbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHBzbW91c2UpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BhY2tldF9oZWFkX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwlzdHJ1Y3QgZWxhbnRlY2hfZGF0YSAqZXRkID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisJaW50IGlkID0gKChwYWNrZXRbM10gJiAweGUwKSA+PiA1KSAtIDE7CisJaW50IHByZXMsIHRyYWNlczsKKworCWlmIChpZCA8IDApCisJCXJldHVybjsKKworCWV0ZC0+bXRbaWRdLnggPSAoKHBhY2tldFsxXSAmIDB4MGYpIDw8IDgpIHwgcGFja2V0WzJdOworCWV0ZC0+bXRbaWRdLnkgPSBldGQtPnlfbWF4IC0gKCgocGFja2V0WzRdICYgMHgwZikgPDwgOCkgfCBwYWNrZXRbNV0pOworCXByZXMgPSAocGFja2V0WzFdICYgMHhmMCkgfCAoKHBhY2tldFs0XSAmIDB4ZjApID4+IDQpOworCXRyYWNlcyA9IChwYWNrZXRbMF0gJiAweGYwKSA+PiA0OworCisJaW5wdXRfbXRfc2xvdChkZXYsIGlkKTsKKwlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCB0cnVlKTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgZXRkLT5tdFtpZF0ueCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W2lkXS55KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1BSRVNTVVJFLCBwcmVzKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1RPVUNIX01BSk9SLCB0cmFjZXMgKiBldGQtPndpZHRoKTsKKwkvKiByZXBvcnQgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIHRyYWNlcyk7CisKKwllbGFudGVjaF9pbnB1dF9zeW5jX3Y0KHBzbW91c2UpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BhY2tldF9tb3Rpb25fdjQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKwlpbnQgd2VpZ2h0LCBkZWx0YV94MSA9IDAsIGRlbHRhX3kxID0gMCwgZGVsdGFfeDIgPSAwLCBkZWx0YV95MiA9IDA7CisJaW50IGlkLCBzaWQ7CisKKwlpZCA9ICgocGFja2V0WzBdICYgMHhlMCkgPj4gNSkgLSAxOworCWlmIChpZCA8IDApCisJCXJldHVybjsKKworCXNpZCA9ICgocGFja2V0WzNdICYgMHhlMCkgPj4gNSkgLSAxOworCXdlaWdodCA9IChwYWNrZXRbMF0gJiAweDEwKSA/IEVUUF9XRUlHSFRfVkFMVUUgOiAxOworCS8qCisJICogTW90aW9uIHBhY2tldHMgZ2l2ZSB1cyB0aGUgZGVsdGEgb2YgeCwgeSB2YWx1ZXMgb2Ygc3BlY2lmaWMgZmluZ2VycywKKwkgKiBidXQgaW4gdHdvJ3MgY29tcGxlbWVudC4gTGV0IHRoZSBjb21waWxlciBkbyB0aGUgY29udmVyc2lvbiBmb3IgdXMuCisJICogQWxzbyBfZW5sYXJnZV8gdGhlIG51bWJlcnMgdG8gaW50LCBpbiBjYXNlIG9mIG92ZXJmbG93LgorCSAqLworCWRlbHRhX3gxID0gKHNpZ25lZCBjaGFyKXBhY2tldFsxXTsKKwlkZWx0YV95MSA9IChzaWduZWQgY2hhcilwYWNrZXRbMl07CisJZGVsdGFfeDIgPSAoc2lnbmVkIGNoYXIpcGFja2V0WzRdOworCWRlbHRhX3kyID0gKHNpZ25lZCBjaGFyKXBhY2tldFs1XTsKKworCWV0ZC0+bXRbaWRdLnggKz0gZGVsdGFfeDEgKiB3ZWlnaHQ7CisJZXRkLT5tdFtpZF0ueSAtPSBkZWx0YV95MSAqIHdlaWdodDsKKwlpbnB1dF9tdF9zbG90KGRldiwgaWQpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgZXRkLT5tdFtpZF0ueCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W2lkXS55KTsKKworCWlmIChzaWQgPj0gMCkgeworCQlldGQtPm10W3NpZF0ueCArPSBkZWx0YV94MiAqIHdlaWdodDsKKwkJZXRkLT5tdFtzaWRdLnkgLT0gZGVsdGFfeTIgKiB3ZWlnaHQ7CisJCWlucHV0X210X3Nsb3QoZGV2LCBzaWQpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIGV0ZC0+bXRbc2lkXS54KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QT1NJVElPTl9ZLCBldGQtPm10W3NpZF0ueSk7CisJfQorCisJZWxhbnRlY2hfaW5wdXRfc3luY192NChwc21vdXNlKTsKK30KKworc3RhdGljIHZvaWQgZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3Y0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCQlpbnQgcGFja2V0X3R5cGUpCit7CisJc3dpdGNoIChwYWNrZXRfdHlwZSkgeworCWNhc2UgUEFDS0VUX1Y0X1NUQVRVUzoKKwkJcHJvY2Vzc19wYWNrZXRfc3RhdHVzX3Y0KHBzbW91c2UpOworCQlicmVhazsKKworCWNhc2UgUEFDS0VUX1Y0X0hFQUQ6CisJCXByb2Nlc3NfcGFja2V0X2hlYWRfdjQocHNtb3VzZSk7CisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfVjRfTU9USU9OOgorCQlwcm9jZXNzX3BhY2tldF9tb3Rpb25fdjQocHNtb3VzZSk7CisJCWJyZWFrOworCisJY2FzZSBQQUNLRVRfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQkvKiBpbXBvc3NpYmxlIHRvIGdldCBoZXJlICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBlbGFudGVjaF9wYWNrZXRfY2hlY2tfdjEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OwpAQCAtMzc2LDMxICs2MDksMTQyIEBACiAJICAgICAgIGV0ZC0+cGFyaXR5W3BhY2tldFszXV0gPT0gcDM7CiB9CiAKK3N0YXRpYyBpbnQgZWxhbnRlY2hfZGVib3VuY2VfY2hlY2tfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZW5jb3VudGVyIHBhY2tldCB0aGF0IG1hdGNoZXMgdGhpcyBleGFjdGx5LCBpdCBtZWFucyB0aGUKKyAgICAgICAgICogaGFyZHdhcmUgaXMgaW4gZGVib3VuY2Ugc3RhdHVzLiBKdXN0IGlnbm9yZSB0aGUgd2hvbGUgcGFja2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgdTggZGVib3VuY2VfcGFja2V0W10gPSB7IDB4ODQsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4ZmYsIDB4ZmYgfTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCisgICAgICAgIHJldHVybiAhbWVtY21wKHBhY2tldCwgZGVib3VuY2VfcGFja2V0LCBzaXplb2YoZGVib3VuY2VfcGFja2V0KSk7Cit9CisKK3N0YXRpYyBpbnQgZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKKworCS8qCisJICogVjIgaGFyZHdhcmUgaGFzIHR3byBmbGF2b3JzLiBPbGRlciBvbmVzIHRoYXQgZG8gbm90IHJlcG9ydCBwcmVzc3VyZSwKKwkgKiBhbmQgbmV3ZXIgb25lcyB0aGF0IHJlcG9ydHMgcHJlc3N1cmUgYW5kIHdpZHRoLiBXaXRoIG5ld2VyIG9uZXMsIGFsbAorCSAqIHBhY2tldHMgKDEsIDIsIDMgZmluZ2VyIHRvdWNoKSBoYXZlIHRoZSBzYW1lIGNvbnN0YW50IGJpdHMuIFdpdGgKKwkgKiBvbGRlciBvbmVzLCAxLzMgZmluZ2VyIHRvdWNoIHBhY2tldHMgYW5kIDIgZmluZ2VyIHRvdWNoIHBhY2tldHMKKwkgKiBoYXZlIGRpZmZlcmVudCBjb25zdGFudCBiaXRzLgorCSAqIFdpdGggYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgY29uc3RhbnQgYml0cyBhcmUgbm90IGV4YWN0bHkgd2hhdCBJCisJICogZXhwZWN0ZWQsIEkgY29uc2lkZXIgdGhlbSBpbnZhbGlkLgorCSAqLworCWlmIChldGQtPnJlcG9ydHNfcHJlc3N1cmUpCisJCXJldHVybiAocGFja2V0WzBdICYgMHgwYykgPT0gMHgwNCAmJgorCQkgICAgICAgKHBhY2tldFszXSAmIDB4MGYpID09IDB4MDI7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4YzApID09IDB4ODApCisJCXJldHVybiAocGFja2V0WzBdICYgMHgwYykgPT0gMHgwYyAmJgorCQkgICAgICAgKHBhY2tldFszXSAmIDB4MGUpID09IDB4MDg7CisKKwlyZXR1cm4gKHBhY2tldFswXSAmIDB4M2MpID09IDB4M2MgJiYKKwkgICAgICAgKHBhY2tldFsxXSAmIDB4ZjApID09IDB4MDAgJiYKKwkgICAgICAgKHBhY2tldFszXSAmIDB4M2UpID09IDB4MzggJiYKKwkgICAgICAgKHBhY2tldFs0XSAmIDB4ZjApID09IDB4MDA7Cit9CisKKy8qCisgKiBXZSBjaGVjayB0aGUgY29uc3RhbnQgYml0cyB0byBkZXRlcm1pbmUgd2hhdCBwYWNrZXQgdHlwZSB3ZSBnZXQsCisgKiBzbyBwYWNrZXQgY2hlY2tpbmcgaXMgbWFuZGF0b3J5IGZvciB2MyBhbmQgbGF0ZXIgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyBpbnQgZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCWNvbnN0IHU4IGRlYm91bmNlX3BhY2tldFtdID0geyAweGM0LCAweGZmLCAweGZmLCAweDAyLCAweGZmLCAweGZmIH07CisJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCisJLyoKKwkgKiBjaGVjayBkZWJvdW5jZSBmaXJzdCwgaXQgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBpbiBieXRlIDAKKwkgKiBhbmQgYnl0ZSAzIGFzIFBBQ0tFVF9WM19IRUFELgorCSAqLworCWlmICghbWVtY21wKHBhY2tldCwgZGVib3VuY2VfcGFja2V0LCBzaXplb2YoZGVib3VuY2VfcGFja2V0KSkpCisJCXJldHVybiBQQUNLRVRfREVCT1VOQ0U7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYgKHBhY2tldFszXSAmIDB4Y2YpID09IDB4MDIpCisJCXJldHVybiBQQUNLRVRfVjNfSEVBRDsKKworCWlmICgocGFja2V0WzBdICYgMHgwYykgPT0gMHgwYyAmJiAocGFja2V0WzNdICYgMHhjZSkgPT0gMHgwYykKKwkJcmV0dXJuIFBBQ0tFVF9WM19UQUlMOworCisJcmV0dXJuIFBBQ0tFVF9VTktOT1dOOworfQorCitzdGF0aWMgaW50IGVsYW50ZWNoX3BhY2tldF9jaGVja192NChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQgPSBwc21vdXNlLT5wYWNrZXQ7CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYKKwkgICAgKHBhY2tldFszXSAmIDB4MWYpID09IDB4MTEpCisJCXJldHVybiBQQUNLRVRfVjRfSEVBRDsKKworCWlmICgocGFja2V0WzBdICYgMHgwYykgPT0gMHgwNCAmJgorCSAgICAocGFja2V0WzNdICYgMHgxZikgPT0gMHgxMikKKwkJcmV0dXJuIFBBQ0tFVF9WNF9NT1RJT047CisKKwlpZiAoKHBhY2tldFswXSAmIDB4MGMpID09IDB4MDQgJiYKKwkgICAgKHBhY2tldFszXSAmIDB4MWYpID09IDB4MTApCisJCXJldHVybiBQQUNLRVRfVjRfU1RBVFVTOworCisJcmV0dXJuIFBBQ0tFVF9VTktOT1dOOworfQorCiAvKgogICogUHJvY2VzcyBieXRlIHN0cmVhbSBmcm9tIG1vdXNlIGFuZCBoYW5kbGUgY29tcGxldGUgcGFja2V0cwogICovCiBzdGF0aWMgcHNtb3VzZV9yZXRfdCBlbGFudGVjaF9wcm9jZXNzX2J5dGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CisJaW50IHBhY2tldF90eXBlOwogCiAJaWYgKHBzbW91c2UtPnBrdGNudCA8IHBzbW91c2UtPnBrdHNpemUpCiAJCXJldHVybiBQU01PVVNFX0dPT0RfREFUQTsKIAogCWlmIChldGQtPmRlYnVnID4gMSkKLQkJZWxhbnRlY2hfcGFja2V0X2R1bXAocHNtb3VzZS0+cGFja2V0LCBwc21vdXNlLT5wa3RzaXplKTsKKwkJZWxhbnRlY2hfcGFja2V0X2R1bXAocHNtb3VzZSk7CiAKIAlzd2l0Y2ggKGV0ZC0+aHdfdmVyc2lvbikgewogCWNhc2UgMToKLQkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX2NoZWNrX3Bhcml0eV92MShwc21vdXNlKSkKKwkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX3BhY2tldF9jaGVja192MShwc21vdXNlKSkKIAkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCiAJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92MShwc21vdXNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIDI6Ci0JCS8qIFdlIGRvbid0IGtub3cgaG93IHRvIGNoZWNrIHBhcml0eSBpbiBwcm90b2NvbCB2MiAqLworCQkvKiBpZ25vcmUgZGVib3VuY2UgKi8KKwkJaWYgKGVsYW50ZWNoX2RlYm91bmNlX2NoZWNrX3YyKHBzbW91c2UpKQorCQkJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CisKKwkJaWYgKGV0ZC0+cGFyaXR5Y2hlY2sgJiYgIWVsYW50ZWNoX3BhY2tldF9jaGVja192Mihwc21vdXNlKSkKKwkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOworCiAJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92Mihwc21vdXNlKTsKIAkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBhY2tldF90eXBlID0gZWxhbnRlY2hfcGFja2V0X2NoZWNrX3YzKHBzbW91c2UpOworCQkvKiBpZ25vcmUgZGVib3VuY2UgKi8KKwkJaWYgKHBhY2tldF90eXBlID09IFBBQ0tFVF9ERUJPVU5DRSkKKwkJCXJldHVybiBQU01PVVNFX0ZVTExfUEFDS0VUOworCisJCWlmIChwYWNrZXRfdHlwZSA9PSBQQUNLRVRfVU5LTk9XTikKKwkJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOworCisJCWVsYW50ZWNoX3JlcG9ydF9hYnNvbHV0ZV92Myhwc21vdXNlLCBwYWNrZXRfdHlwZSk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlwYWNrZXRfdHlwZSA9IGVsYW50ZWNoX3BhY2tldF9jaGVja192NChwc21vdXNlKTsKKwkJaWYgKHBhY2tldF90eXBlID09IFBBQ0tFVF9VTktOT1dOKQorCQkJcmV0dXJuIFBTTU9VU0VfQkFEX0RBVEE7CisKKwkJZWxhbnRlY2hfcmVwb3J0X2Fic29sdXRlX3Y0KHBzbW91c2UsIHBhY2tldF90eXBlKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CkBAIC00MzUsMTUgKzc3OSwyOSBAQAogCQkgICAgZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MTEsIGV0ZC0+cmVnXzExKSB8fAogCQkgICAgZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MjEsIGV0ZC0+cmVnXzIxKSkgewogCQkJcmMgPSAtMTsKLQkJCWJyZWFrOwogCQl9CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlldGQtPnJlZ18xMCA9IDB4MGI7CisJCWlmIChlbGFudGVjaF93cml0ZV9yZWcocHNtb3VzZSwgMHgxMCwgZXRkLT5yZWdfMTApKQorCQkJcmMgPSAtMTsKKworCQlicmVhazsKKworCWNhc2UgNDoKKwkJZXRkLT5yZWdfMDcgPSAweDAxOworCQlpZiAoZWxhbnRlY2hfd3JpdGVfcmVnKHBzbW91c2UsIDB4MDcsIGV0ZC0+cmVnXzA3KSkKKwkJCXJjID0gLTE7CisKKwkJZ290byBza2lwX3JlYWRiYWNrX3JlZ18xMDsgLyogdjQgaGFzIG5vIHJlZyAweDEwIHRvIHJlYWQgKi8KIAl9CiAKIAlpZiAocmMgPT0gMCkgewogCQkvKgogCQkgKiBSZWFkIGJhY2sgcmVnIDB4MTAuIEZvciBoYXJkd2FyZSB2ZXJzaW9uIDEgd2UgbXVzdCBtYWtlCiAJCSAqIHN1cmUgdGhlIGFic29sdXRlIG1vZGUgYml0IGlzIHNldC4gRm9yIGhhcmR3YXJlIHZlcnNpb24gMgotCQkgKiB0aGUgdG91Y2hwYWQgaXMgcHJvYmFibHkgaW5pdGFsaXNpbmcgYW5kIG5vdCByZWFkeSB1bnRpbAorCQkgKiB0aGUgdG91Y2hwYWQgaXMgcHJvYmFibHkgaW5pdGlhbGl6aW5nIGFuZCBub3QgcmVhZHkgdW50aWwKIAkJICogd2UgcmVhZCBiYWNrIHRoZSB2YWx1ZSB3ZSBqdXN0IHdyb3RlLgogCQkgKi8KIAkJZG8gewpAQCAtNDU2LDI3ICs4MTQsMTE1IEBACiAJCX0gd2hpbGUgKHRyaWVzID4gMCk7CiAKIAkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoImZhaWxlZCB0byByZWFkIGJhY2sgcmVnaXN0ZXIgMHgxMC5cbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgImZhaWxlZCB0byByZWFkIGJhY2sgcmVnaXN0ZXIgMHgxMC5cbiIpOwogCQl9IGVsc2UgaWYgKGV0ZC0+aHdfdmVyc2lvbiA9PSAxICYmCiAJCQkgICAhKHZhbCAmIEVUUF9SMTBfQUJTT0xVVEVfTU9ERSkpIHsKLQkJCXByX2VycigidG91Y2hwYWQgcmVmdXNlcyB0byBzd2l0Y2ggdG8gYWJzb2x1dGUgbW9kZS5cbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgInRvdWNocGFkIHJlZnVzZXMgdG8gc3dpdGNoIHRvIGFic29sdXRlIG1vZGUuXG4iKTsKIAkJCXJjID0gLTE7CiAJCX0KIAl9CiAKKyBza2lwX3JlYWRiYWNrX3JlZ18xMDoKIAlpZiAocmMpCi0JCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpc2UgcmVnaXN0ZXJzLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gaW5pdGlhbGlzZSByZWdpc3RlcnMuXG4iKTsKIAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBlbGFudGVjaF9zZXRfcmFuZ2Uoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnhfbWluLCB1bnNpZ25lZCBpbnQgKnlfbWluLAorCQkJICAgICAgdW5zaWduZWQgaW50ICp4X21heCwgdW5zaWduZWQgaW50ICp5X21heCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqd2lkdGgpCit7CisJc3RydWN0IGVsYW50ZWNoX2RhdGEgKmV0ZCA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBwYXJhbVszXTsKKwl1bnNpZ25lZCBjaGFyIHRyYWNlczsKKworCXN3aXRjaCAoZXRkLT5od192ZXJzaW9uKSB7CisJY2FzZSAxOgorCQkqeF9taW4gPSBFVFBfWE1JTl9WMTsKKwkJKnlfbWluID0gRVRQX1lNSU5fVjE7CisJCSp4X21heCA9IEVUUF9YTUFYX1YxOworCQkqeV9tYXggPSBFVFBfWU1BWF9WMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmIChldGQtPmZ3X3ZlcnNpb24gPT0gMHgwMjA4MDAgfHwKKwkJICAgIGV0ZC0+ZndfdmVyc2lvbiA9PSAweDAyMGIwMCB8fAorCQkgICAgZXRkLT5md192ZXJzaW9uID09IDB4MDIwMDMwKSB7CisJCQkqeF9taW4gPSBFVFBfWE1JTl9WMjsKKwkJCSp5X21pbiA9IEVUUF9ZTUlOX1YyOworCQkJKnhfbWF4ID0gRVRQX1hNQVhfVjI7CisJCQkqeV9tYXggPSBFVFBfWU1BWF9WMjsKKwkJfSBlbHNlIHsKKwkJCWludCBpOworCQkJaW50IGZpeGVkX2RwaTsKKworCQkJaSA9IChldGQtPmZ3X3ZlcnNpb24gPiAweDAyMDgwMCAmJgorCQkJICAgICBldGQtPmZ3X3ZlcnNpb24gPCAweDAyMDkwMCkgPyAxIDogMjsKKworCQkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBFVFBfRldfSURfUVVFUlksIHBhcmFtKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWZpeGVkX2RwaSA9IHBhcmFtWzFdICYgMHgxMDsKKworCQkJaWYgKCgoZXRkLT5md192ZXJzaW9uID4+IDE2KSA9PSAweDE0KSAmJiBmaXhlZF9kcGkpIHsKKwkJCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9TQU1QTEVfUVVFUlksIHBhcmFtKSkKKwkJCQkJcmV0dXJuIC0xOworCisJCQkJKnhfbWF4ID0gKGV0ZC0+Y2FwYWJpbGl0aWVzWzFdIC0gaSkgKiBwYXJhbVsxXSAvIDI7CisJCQkJKnlfbWF4ID0gKGV0ZC0+Y2FwYWJpbGl0aWVzWzJdIC0gaSkgKiBwYXJhbVsyXSAvIDI7CisJCQl9IGVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA9PSAweDA0MDIxNikgeworCQkJCSp4X21heCA9IDgxOTsKKwkJCQkqeV9tYXggPSA0MDU7CisJCQl9IGVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA9PSAweDA0MDIxOSB8fCBldGQtPmZ3X3ZlcnNpb24gPT0gMHgwNDAyMTUpIHsKKwkJCQkqeF9tYXggPSA5MDA7CisJCQkJKnlfbWF4ID0gNTAwOworCQkJfSBlbHNlIHsKKwkJCQkqeF9tYXggPSAoZXRkLT5jYXBhYmlsaXRpZXNbMV0gLSBpKSAqIDY0OworCQkJCSp5X21heCA9IChldGQtPmNhcGFiaWxpdGllc1syXSAtIGkpICogNjQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX0lEX1FVRVJZLCBwYXJhbSkpCisJCQlyZXR1cm4gLTE7CisKKwkJKnhfbWF4ID0gKDB4MGYgJiBwYXJhbVswXSkgPDwgOCB8IHBhcmFtWzFdOworCQkqeV9tYXggPSAoMHhmMCAmIHBhcmFtWzBdKSA8PCA0IHwgcGFyYW1bMl07CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9GV19JRF9RVUVSWSwgcGFyYW0pKQorCQkJcmV0dXJuIC0xOworCisJCSp4X21heCA9ICgweDBmICYgcGFyYW1bMF0pIDw8IDggfCBwYXJhbVsxXTsKKwkJKnlfbWF4ID0gKDB4ZjAgJiBwYXJhbVswXSkgPDwgNCB8IHBhcmFtWzJdOworCQl0cmFjZXMgPSBldGQtPmNhcGFiaWxpdGllc1sxXTsKKwkJaWYgKCh0cmFjZXMgPCAyKSB8fCAodHJhY2VzID4gKnhfbWF4KSkKKwkJCXJldHVybiAtMTsKKworCQkqd2lkdGggPSAqeF9tYXggLyAodHJhY2VzIC0gMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogU2V0IHRoZSBhcHByb3ByaWF0ZSBldmVudCBiaXRzIGZvciB0aGUgaW5wdXQgc3Vic3lzdGVtCiAgKi8KLXN0YXRpYyB2b2lkIGVsYW50ZWNoX3NldF9pbnB1dF9wYXJhbXMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCitzdGF0aWMgaW50IGVsYW50ZWNoX3NldF9pbnB1dF9wYXJhbXMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQgPSBwc21vdXNlLT5wcml2YXRlOworCXVuc2lnbmVkIGludCB4X21pbiA9IDAsIHlfbWluID0gMCwgeF9tYXggPSAwLCB5X21heCA9IDAsIHdpZHRoID0gMDsKKworCWlmIChlbGFudGVjaF9zZXRfcmFuZ2UocHNtb3VzZSwgJnhfbWluLCAmeV9taW4sICZ4X21heCwgJnlfbWF4LCAmd2lkdGgpKQorCQlyZXR1cm4gLTE7CiAKIAlfX3NldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKIAlfX3NldF9iaXQoRVZfQUJTLCBkZXYtPmV2Yml0KTsKQEAgLTQ5NCwzMCArOTQwLDY0IEBACiAJY2FzZSAxOgogCQkvKiBSb2NrZXIgYnV0dG9uICovCiAJCWlmIChldGQtPmZ3X3ZlcnNpb24gPCAweDAyMDAwMCAmJgotCQkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgeworCQkgICAgKGV0ZC0+Y2FwYWJpbGl0aWVzWzBdICYgRVRQX0NBUF9IQVNfUk9DS0VSKSkgewogCQkJX19zZXRfYml0KEJUTl9GT1JXQVJELCBkZXYtPmtleWJpdCk7CiAJCQlfX3NldF9iaXQoQlROX0JBQ0ssIGRldi0+a2V5Yml0KTsKIAkJfQotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCBFVFBfWE1JTl9WMSwgRVRQX1hNQVhfVjEsIDAsIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCBFVFBfWU1JTl9WMSwgRVRQX1lNQVhfVjEsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCB4X21pbiwgeF9tYXgsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCB5X21pbiwgeV9tYXgsIDAsIDApOwogCQlicmVhazsKIAogCWNhc2UgMjoKIAkJX19zZXRfYml0KEJUTl9UT09MX1FVQURUQVAsIGRldi0+a2V5Yml0KTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgRVRQX1hNSU5fVjIsIEVUUF9YTUFYX1YyLCAwLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWSwgRVRQX1lNSU5fVjIsIEVUUF9ZTUFYX1YyLCAwLCAwKTsKKwkJX19zZXRfYml0KElOUFVUX1BST1BfU0VNSV9NVCwgZGV2LT5wcm9wYml0KTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAzOgorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19YLCB4X21pbiwgeF9tYXgsIDAsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCB5X21pbiwgeV9tYXgsIDAsIDApOwogCQlpZiAoZXRkLT5yZXBvcnRzX3ByZXNzdXJlKSB7CiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19QUkVTU1VSRSwgRVRQX1BNSU5fVjIsCiAJCQkJCSAgICAgRVRQX1BNQVhfVjIsIDAsIDApOwogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVE9PTF9XSURUSCwgRVRQX1dNSU5fVjIsCiAJCQkJCSAgICAgRVRQX1dNQVhfVjIsIDAsIDApOwogCQl9Ci0JCV9fc2V0X2JpdChJTlBVVF9QUk9QX1NFTUlfTVQsIGRldi0+cHJvcGJpdCk7CiAJCWlucHV0X210X2luaXRfc2xvdHMoZGV2LCAyKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgRVRQX1hNSU5fVjIsIEVUUF9YTUFYX1YyLCAwLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgRVRQX1lNSU5fVjIsIEVUUF9ZTUFYX1YyLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeF9taW4sIHhfbWF4LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgeV9taW4sIHlfbWF4LCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYtPmtleWJpdCk7CisJCS8qIEZvciBYIHRvIHJlY29nbml6ZSBtZSBhcyB0b3VjaHBhZC4gKi8KKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgeF9taW4sIHhfbWF4LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWSwgeV9taW4sIHlfbWF4LCAwLCAwKTsKKwkJLyoKKwkJICogcmFuZ2Ugb2YgcHJlc3N1cmUgYW5kIHdpZHRoIGlzIHRoZSBzYW1lIGFzIHYyLAorCQkgKiByZXBvcnQgQUJTX1BSRVNTVVJFLCBBQlNfVE9PTF9XSURUSCBmb3IgY29tcGF0aWJpbGl0eS4KKwkJICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1BSRVNTVVJFLCBFVFBfUE1JTl9WMiwKKwkJCQkgICAgIEVUUF9QTUFYX1YyLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVE9PTF9XSURUSCwgRVRQX1dNSU5fVjIsCisJCQkJICAgICBFVFBfV01BWF9WMiwgMCwgMCk7CisJCS8qIE11bHRpdG91Y2ggY2FwYWJsZSBwYWQsIHVwIHRvIDUgZmluZ2Vycy4gKi8KKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhkZXYsIEVUUF9NQVhfRklOR0VSUyk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIHhfbWluLCB4X21heCwgMCwgMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1ksIHlfbWluLCB5X21heCwgMCwgMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BSRVNTVVJFLCBFVFBfUE1JTl9WMiwKKwkJCQkgICAgIEVUUF9QTUFYX1YyLCAwLCAwKTsKKwkJLyoKKwkJICogVGhlIGZpcm13YXJlIHJlcG9ydHMgaG93IG1hbnkgdHJhY2UgbGluZXMgdGhlIGZpbmdlciBzcGFucywKKwkJICogY29udmVydCB0byBzdXJmYWNlIHVuaXQgYXMgUHJvdG9jb2wtQiByZXF1aXJlcy4KKwkJICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1RPVUNIX01BSk9SLCAwLAorCQkJCSAgICAgRVRQX1dNQVhfVjIgKiB3aWR0aCwgMCwgMCk7CiAJCWJyZWFrOwogCX0KKworCWV0ZC0+eV9tYXggPSB5X21heDsKKwlldGQtPndpZHRoID0gd2lkdGg7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGVsYW50ZWNoX2F0dHJfZGF0YSB7CkBAIC01ODcsNiArMTA2Nyw3IEBACiAJCQkgICAgZWxhbnRlY2hfc2hvd19pbnRfYXR0ciwJCQlcCiAJCQkgICAgZWxhbnRlY2hfc2V0X2ludF9hdHRyKQogCitFTEFOVEVDSF9JTlRfQVRUUihyZWdfMDcsIDB4MDcpOwogRUxBTlRFQ0hfSU5UX0FUVFIocmVnXzEwLCAweDEwKTsKIEVMQU5URUNIX0lOVF9BVFRSKHJlZ18xMSwgMHgxMSk7CiBFTEFOVEVDSF9JTlRfQVRUUihyZWdfMjAsIDB4MjApOwpAQCAtNjAwLDYgKzEwODEsNyBAQAogRUxBTlRFQ0hfSU5UX0FUVFIocGFyaXR5Y2hlY2ssIDApOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZWxhbnRlY2hfYXR0cnNbXSA9IHsKKwkmcHNtb3VzZV9hdHRyX3JlZ18wNy5kYXR0ci5hdHRyLAogCSZwc21vdXNlX2F0dHJfcmVnXzEwLmRhdHRyLmF0dHIsCiAJJnBzbW91c2VfYXR0cl9yZWdfMTEuZGF0dHIuYXR0ciwKIAkmcHNtb3VzZV9hdHRyX3JlZ18yMC5kYXR0ci5hdHRyLApAQCAtNjUxLDcgKzExMzMsNyBAQAogCSAgICBwczJfY29tbWFuZChwczJkZXYsICBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSB8fAogCSAgICBwczJfY29tbWFuZChwczJkZXYsICBOVUxMLCBQU01PVVNFX0NNRF9TRVRTQ0FMRTExKSB8fAogCSAgICBwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkgewotCQlwcl9kZWJ1Zygic2VuZGluZyBFbGFudGVjaCBtYWdpYyBrbm9jayBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInNlbmRpbmcgRWxhbnRlY2ggbWFnaWMga25vY2sgZmFpbGVkLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY1OSw5ICsxMTQxLDExIEBACiAJICogUmVwb3J0IHRoaXMgaW4gY2FzZSB0aGVyZSBhcmUgRWxhbnRlY2ggbW9kZWxzIHRoYXQgdXNlIGEgZGlmZmVyZW50CiAJICogc2V0IG9mIG1hZ2ljIG51bWJlcnMKIAkgKi8KLQlpZiAocGFyYW1bMF0gIT0gMHgzYyB8fCBwYXJhbVsxXSAhPSAweDAzIHx8IHBhcmFtWzJdICE9IDB4YzgpIHsKLQkJcHJfZGVidWcoInVuZXhwZWN0ZWQgbWFnaWMga25vY2sgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAotCQkJIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCWlmIChwYXJhbVswXSAhPSAweDNjIHx8IHBhcmFtWzFdICE9IDB4MDMgfHwKKwkgICAgKHBhcmFtWzJdICE9IDB4YzggJiYgcGFyYW1bMl0gIT0gMHgwMCkpIHsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAidW5leHBlY3RlZCBtYWdpYyBrbm9jayByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCisJCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY3MSwyMCArMTE1NSwxOCBAQAogCSAqIHRvIEVsYW50ZWNoIG1hZ2ljIGtub2NrIGFuZCB0aGVyZSBtaWdodCBiZSBtb3JlLgogCSAqLwogCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX1ZFUlNJT05fUVVFUlksIHBhcmFtKSkgewotCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIHF1ZXJ5IGZpcm13YXJlIHZlcnNpb24uXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgImZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSB2ZXJzaW9uLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcl9kZWJ1ZygiRWxhbnRlY2ggdmVyc2lvbiBxdWVyeSByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCi0JCSBwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKKwlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkgICAgIkVsYW50ZWNoIHZlcnNpb24gcXVlcnkgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAorCQkgICAgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSk7CiAKIAlpZiAoIWVsYW50ZWNoX2lzX3NpZ25hdHVyZV92YWxpZChwYXJhbSkpIHsKLQkJaWYgKCFmb3JjZV9lbGFudGVjaCkgewotCQkJcHJfZGVidWcoIlByb2JhYmx5IG5vdCBhIHJlYWwgRWxhbnRlY2ggdG91Y2hwYWQuIEFib3J0aW5nLlxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiUHJvYmFibHkgbm90IGEgcmVhbCBFbGFudGVjaCB0b3VjaHBhZC4gRW5hYmxpbmcgYW55d2F5IGR1ZSB0byBmb3JjZV9lbGFudGVjaC5cbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkJICAgICJQcm9iYWJseSBub3QgYSByZWFsIEVsYW50ZWNoIHRvdWNocGFkLiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CkBAIC03MTUsNyArMTE5Nyw4IEBACiAJCXJldHVybiAtMTsKIAogCWlmIChlbGFudGVjaF9zZXRfYWJzb2x1dGVfbW9kZShwc21vdXNlKSkgewotCQlwcl9lcnIoImZhaWxlZCB0byBwdXQgdG91Y2hwYWQgYmFjayBpbnRvIGFic29sdXRlIG1vZGUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiZmFpbGVkIHRvIHB1dCB0b3VjaHBhZCBiYWNrIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC03MjMsNiArMTIwNiw0OCBAQAogfQogCiAvKgorICogZGV0ZXJtaW5lIGhhcmR3YXJlIHZlcnNpb24gYW5kIHNldCBzb21lIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIGl0LgorICovCitzdGF0aWMgaW50IGVsYW50ZWNoX3NldF9wcm9wZXJ0aWVzKHN0cnVjdCBlbGFudGVjaF9kYXRhICpldGQpCit7CisJaW50IHZlciA9IChldGQtPmZ3X3ZlcnNpb24gJiAweDBmMDAwMCkgPj4gMTY7CisKKwlpZiAoZXRkLT5md192ZXJzaW9uIDwgMHgwMjAwMzAgfHwgZXRkLT5md192ZXJzaW9uID09IDB4MDIwNjAwKQorCQlldGQtPmh3X3ZlcnNpb24gPSAxOworCWVsc2UgaWYgKGV0ZC0+ZndfdmVyc2lvbiA8IDB4MTUwNjAwKQorCQlldGQtPmh3X3ZlcnNpb24gPSAyOworCWVsc2UgaWYgKHZlciA9PSA1KQorCQlldGQtPmh3X3ZlcnNpb24gPSAzOworCWVsc2UgaWYgKHZlciA9PSA2KQorCQlldGQtPmh3X3ZlcnNpb24gPSA0OworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBUdXJuIG9uIHBhY2tldCBjaGVja2luZyBieSBkZWZhdWx0LgorCSAqLworCWV0ZC0+cGFyaXR5Y2hlY2sgPSAxOworCisJLyoKKwkgKiBUaGlzIGZpcm13YXJlIHN1ZmZlcnMgZnJvbSBtaXNyZXBvcnRpbmcgY29vcmRpbmF0ZXMgd2hlbgorCSAqIGEgdG91Y2ggYWN0aW9uIHN0YXJ0cyBjYXVzaW5nIHRoZSBtb3VzZSBjdXJzb3Igb3Igc2Nyb2xsZWQgcGFnZQorCSAqIHRvIGp1bXAuIEVuYWJsZSBhIHdvcmthcm91bmQuCisJICovCisJZXRkLT5qdW1weV9jdXJzb3IgPQorCQkoZXRkLT5md192ZXJzaW9uID09IDB4MDIwMDIyIHx8IGV0ZC0+ZndfdmVyc2lvbiA9PSAweDAyMDYwMCk7CisKKwlpZiAoZXRkLT5od192ZXJzaW9uID4gMSkgeworCQkvKiBGb3Igbm93IHNob3cgZXh0cmEgZGVidWcgaW5mb3JtYXRpb24gKi8KKwkJZXRkLT5kZWJ1ZyA9IDE7CisKKwkJaWYgKGV0ZC0+ZndfdmVyc2lvbiA+PSAweDAyMDgwMCkKKwkJCWV0ZC0+cmVwb3J0c19wcmVzc3VyZSA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBJbml0aWFsaXplIHRoZSB0b3VjaHBhZCBhbmQgY3JlYXRlIHN5c2ZzIGVudHJpZXMKICAqLwogaW50IGVsYW50ZWNoX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC03NDMsNzAgKzEyNjgsNTMgQEAKIAkgKiBEbyB0aGUgdmVyc2lvbiBxdWVyeSBhZ2FpbiBzbyB3ZSBjYW4gc3RvcmUgdGhlIHJlc3VsdAogCSAqLwogCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgRVRQX0ZXX1ZFUlNJT05fUVVFUlksIHBhcmFtKSkgewotCQlwcl9lcnIoImZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSB2ZXJzaW9uLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcXVlcnkgZmlybXdhcmUgdmVyc2lvbi5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9Ci0KIAlldGQtPmZ3X3ZlcnNpb24gPSAocGFyYW1bMF0gPDwgMTYpIHwgKHBhcmFtWzFdIDw8IDgpIHwgcGFyYW1bMl07CiAKLQkvKgotCSAqIEFzc3VtZSBldmVyeSB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzIGlzIG5ldyBFZWVQQyBzdHlsZQotCSAqIGhhcmR3YXJlIHdpdGggNiBieXRlIHBhY2tldHMKLQkgKi8KLQlpZiAoZXRkLT5md192ZXJzaW9uID49IDB4MDIwMDMwKSB7Ci0JCWV0ZC0+aHdfdmVyc2lvbiA9IDI7Ci0JCS8qIEZvciBub3cgc2hvdyBleHRyYSBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwotCQlldGQtPmRlYnVnID0gMTsKLQkJLyogRG9uJ3Qga25vdyBob3cgdG8gZG8gcGFyaXR5IGNoZWNraW5nIGZvciB2ZXJzaW9uIDIgKi8KLQkJZXRkLT5wYXJpdHljaGVjayA9IDA7Ci0KLQkJaWYgKGV0ZC0+ZndfdmVyc2lvbiA+PSAweDAyMDgwMCkKLQkJCWV0ZC0+cmVwb3J0c19wcmVzc3VyZSA9IHRydWU7Ci0KLQl9IGVsc2UgewotCQlldGQtPmh3X3ZlcnNpb24gPSAxOwotCQlldGQtPnBhcml0eWNoZWNrID0gMTsKLQl9Ci0KLQlwcl9pbmZvKCJhc3N1bWluZyBoYXJkd2FyZSB2ZXJzaW9uICVkLCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCQlldGQtPmh3X3ZlcnNpb24sIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwotCi0JaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBFVFBfQ0FQQUJJTElUSUVTX1FVRVJZLCBwYXJhbSkpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gcXVlcnkgY2FwYWJpbGl0aWVzLlxuIik7CisJaWYgKGVsYW50ZWNoX3NldF9wcm9wZXJ0aWVzKGV0ZCkpIHsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgInVua25vd24gaGFyZHdhcmUgdmVyc2lvbiwgYWJvcnRpbmcuLi5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9Ci0JcHJfaW5mbygiU3luYXB0aWNzIGNhcGFiaWxpdGllcyBxdWVyeSByZXN1bHQgMHglMDJ4LCAweCUwMngsIDB4JTAyeC5cbiIsCi0JCXBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwotCWV0ZC0+Y2FwYWJpbGl0aWVzID0gcGFyYW1bMF07CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCSAgICAgImFzc3VtaW5nIGhhcmR3YXJlIHZlcnNpb24gJWQgKHdpdGggZmlybXdhcmUgdmVyc2lvbiAweCUwMnglMDJ4JTAyeClcbiIsCisJCSAgICAgZXRkLT5od192ZXJzaW9uLCBwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKIAotCS8qCi0JICogVGhpcyBmaXJtd2FyZSBzdWZmZXJzIGZyb20gbWlzcmVwb3J0aW5nIGNvb3JkaW5hdGVzIHdoZW4KLQkgKiBhIHRvdWNoIGFjdGlvbiBzdGFydHMgY2F1c2luZyB0aGUgbW91c2UgY3Vyc29yIG9yIHNjcm9sbGVkIHBhZ2UKLQkgKiB0byBqdW1wLiBFbmFibGUgYSB3b3JrYXJvdW5kLgotCSAqLwotCWlmIChldGQtPmZ3X3ZlcnNpb24gPT0gMHgwMjAwMjIgfHwgZXRkLT5md192ZXJzaW9uID09IDB4MDIwNjAwKSB7Ci0JCXByX2luZm8oImZpcm13YXJlIHZlcnNpb24gMi4wLjM0LzIuNi4wIGRldGVjdGVkLCBlbmFibGluZyBqdW1weSBjdXJzb3Igd29ya2Fyb3VuZFxuIik7Ci0JCWV0ZC0+anVtcHlfY3Vyc29yID0gdHJ1ZTsKKwlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIEVUUF9DQVBBQklMSVRJRVNfUVVFUlksCisJICAgIGV0ZC0+Y2FwYWJpbGl0aWVzKSkgeworCQlwc21vdXNlX2Vycihwc21vdXNlLCAiZmFpbGVkIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcy5cbiIpOworCQlnb3RvIGluaXRfZmFpbDsKIAl9CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCSAgICAgIlN5bmFwdGljcyBjYXBhYmlsaXRpZXMgcXVlcnkgcmVzdWx0IDB4JTAyeCwgMHglMDJ4LCAweCUwMnguXG4iLAorCQkgICAgIGV0ZC0+Y2FwYWJpbGl0aWVzWzBdLCBldGQtPmNhcGFiaWxpdGllc1sxXSwKKwkJICAgICBldGQtPmNhcGFiaWxpdGllc1syXSk7CiAKIAlpZiAoZWxhbnRlY2hfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gcHV0IHRvdWNocGFkIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOworCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJICAgICJmYWlsZWQgdG8gcHV0IHRvdWNocGFkIGludG8gYWJzb2x1dGUgbW9kZS5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKLQllbGFudGVjaF9zZXRfaW5wdXRfcGFyYW1zKHBzbW91c2UpOworCWlmIChlbGFudGVjaF9zZXRfaW5wdXRfcGFyYW1zKHBzbW91c2UpKSB7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJmYWlsZWQgdG8gcXVlcnkgdG91Y2hwYWQgcmFuZ2UuXG4iKTsKKwkJZ290byBpbml0X2ZhaWw7CisJfQogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LmtvYmosCiAJCQkJICAgJmVsYW50ZWNoX2F0dHJfZ3JvdXApOwogCWlmIChlcnJvcikgewotCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcywgZXJyb3I6ICVkLlxuIiwgZXJyb3IpOworCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJICAgICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXMsIGVycm9yOiAlZC5cbiIsCisJCQkgICAgZXJyb3IpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gZWxhbnRlY2hfcHJvY2Vzc19ieXRlOwogCXBzbW91c2UtPmRpc2Nvbm5lY3QgPSBlbGFudGVjaF9kaXNjb25uZWN0OwogCXBzbW91c2UtPnJlY29ubmVjdCA9IGVsYW50ZWNoX3JlY29ubmVjdDsKLQlwc21vdXNlLT5wa3RzaXplID0gZXRkLT5od192ZXJzaW9uID09IDIgPyA2IDogNDsKKwlwc21vdXNlLT5wa3RzaXplID0gZXRkLT5od192ZXJzaW9uID4gMSA/IDYgOiA0OwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guaAppbmRleCBmYWJiMmI5Li45ZTVmMWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5oCkBAIC0xNiwxNCArMTYsMTcgQEAKIC8qCiAgKiBDb21tYW5kIHZhbHVlcyBmb3IgU3luYXB0aWNzIHN0eWxlIHF1ZXJpZXMKICAqLworI2RlZmluZSBFVFBfRldfSURfUVVFUlkJCQkweDAwCiAjZGVmaW5lIEVUUF9GV19WRVJTSU9OX1FVRVJZCQkweDAxCiAjZGVmaW5lIEVUUF9DQVBBQklMSVRJRVNfUVVFUlkJCTB4MDIKKyNkZWZpbmUgRVRQX1NBTVBMRV9RVUVSWQkJMHgwMwogCiAvKgogICogQ29tbWFuZCB2YWx1ZXMgZm9yIHJlZ2lzdGVyIHJlYWRpbmcgb3Igd3JpdGluZwogICovCiAjZGVmaW5lIEVUUF9SRUdJU1RFUl9SRUFECQkweDEwCiAjZGVmaW5lIEVUUF9SRUdJU1RFUl9XUklURQkJMHgxMQorI2RlZmluZSBFVFBfUkVHSVNURVJfUkVBRFdSSVRFCQkweDAwCiAKIC8qCiAgKiBIYXJkd2FyZSB2ZXJzaW9uIDIgY3VzdG9tIFBTLzIgY29tbWFuZCB2YWx1ZQpAQCAtNjYsMTYgKzY5LDEzIEBACiAjZGVmaW5lIEVUUF9ZTUFYX1YxCQkJKDM4NCAtIEVUUF9FREdFX0ZVWlpfVjEpCiAKIC8qCi0gKiBJdCBzZWVtcyB0aGUgcmVzb2x1dGlvbiBmb3IgaGFyZHdhcmUgdmVyc2lvbiAyIGRvdWJsZWQuCi0gKiBIZW5jZSB0aGUgWCBhbmQgWSByYW5nZXMgYXJlIGRvdWJsZWQgdG9vLgotICogVGhlIGJlemVsIGFyb3VuZCB0aGUgcGFkIGFsc28gYXBwZWFycyB0byBiZSBzbWFsbGVyCisgKiBUaGUgcmVzb2x1dGlvbiBmb3Igb2xkZXIgdjIgaGFyZHdhcmUgZG91YmxlZC4KKyAqIChuZXdlciB2MidzIGZpcm13YXJlIHByb3ZpZGVzIGNvbW1hbmQgc28gd2UgY2FuIHF1ZXJ5KQogICovCi0jZGVmaW5lIEVUUF9FREdFX0ZVWlpfVjIJCTgKLQotI2RlZmluZSBFVFBfWE1JTl9WMgkJCSggICAwICsgRVRQX0VER0VfRlVaWl9WMikKLSNkZWZpbmUgRVRQX1hNQVhfVjIJCQkoMTE1MiAtIEVUUF9FREdFX0ZVWlpfVjIpCi0jZGVmaW5lIEVUUF9ZTUlOX1YyCQkJKCAgIDAgKyBFVFBfRURHRV9GVVpaX1YyKQotI2RlZmluZSBFVFBfWU1BWF9WMgkJCSggNzY4IC0gRVRQX0VER0VfRlVaWl9WMikKKyNkZWZpbmUgRVRQX1hNSU5fVjIJCQkwCisjZGVmaW5lIEVUUF9YTUFYX1YyCQkJMTE1MgorI2RlZmluZSBFVFBfWU1JTl9WMgkJCTAKKyNkZWZpbmUgRVRQX1lNQVhfVjIJCQk3NjgKIAogI2RlZmluZSBFVFBfUE1JTl9WMgkJCTAKICNkZWZpbmUgRVRQX1BNQVhfVjIJCQkyNTUKQEAgLTgzLDE3ICs4MywzNyBAQAogI2RlZmluZSBFVFBfV01BWF9WMgkJCTE1CiAKIC8qCi0gKiBGb3IgdHdvIGZpbmdlciB0b3VjaGVzIHRoZSBjb29yZGluYXRlIG9mIGVhY2ggZmluZ2VyIGdldHMgcmVwb3J0ZWQKLSAqIHNlcGFyYXRlbHkgYnV0IHdpdGggcmVkdWNlZCByZXNvbHV0aW9uLgorICogdjMgaGFyZHdhcmUgaGFzIDIga2luZHMgb2YgcGFja2V0IHR5cGVzLAorICogdjQgaGFyZHdhcmUgaGFzIDMuCiAgKi8KLSNkZWZpbmUgRVRQXzJGVF9GVVpaCQkJNAorI2RlZmluZSBQQUNLRVRfVU5LTk9XTgkJCTB4MDEKKyNkZWZpbmUgUEFDS0VUX0RFQk9VTkNFCQkJMHgwMgorI2RlZmluZSBQQUNLRVRfVjNfSEVBRAkJCTB4MDMKKyNkZWZpbmUgUEFDS0VUX1YzX1RBSUwJCQkweDA0CisjZGVmaW5lIFBBQ0tFVF9WNF9IRUFECQkJMHgwNQorI2RlZmluZSBQQUNLRVRfVjRfTU9USU9OCQkweDA2CisjZGVmaW5lIFBBQ0tFVF9WNF9TVEFUVVMJCTB4MDcKIAotI2RlZmluZSBFVFBfMkZUX1hNSU4JCQkoICAwICsgRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1hNQVgJCQkoMjg4IC0gRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1lNSU4JCQkoICAwICsgRVRQXzJGVF9GVVpaKQotI2RlZmluZSBFVFBfMkZUX1lNQVgJCQkoMTkyIC0gRVRQXzJGVF9GVVpaKQorLyoKKyAqIHRyYWNrIHVwIHRvIDUgZmluZ2VycyBmb3IgdjQgaGFyZHdhcmUKKyAqLworI2RlZmluZSBFVFBfTUFYX0ZJTkdFUlMJCQk1CisKKy8qCisgKiB3ZWlnaHQgdmFsdWUgZm9yIHY0IGhhcmR3YXJlCisgKi8KKyNkZWZpbmUgRVRQX1dFSUdIVF9WQUxVRQkJNQorCisvKgorICogVGhlIGJhc2UgcG9zaXRpb24gZm9yIG9uZSBmaW5nZXIsIHY0IGhhcmR3YXJlCisgKi8KK3N0cnVjdCBmaW5nZXJfcG9zIHsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKK307CiAKIHN0cnVjdCBlbGFudGVjaF9kYXRhIHsKKwl1bnNpZ25lZCBjaGFyIHJlZ18wNzsKIAl1bnNpZ25lZCBjaGFyIHJlZ18xMDsKIAl1bnNpZ25lZCBjaGFyIHJlZ18xMTsKIAl1bnNpZ25lZCBjaGFyIHJlZ18yMDsKQEAgLTEwNCwxMyArMTI0LDE2IEBACiAJdW5zaWduZWQgY2hhciByZWdfMjU7CiAJdW5zaWduZWQgY2hhciByZWdfMjY7CiAJdW5zaWduZWQgY2hhciBkZWJ1ZzsKLQl1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllczsKKwl1bnNpZ25lZCBjaGFyIGNhcGFiaWxpdGllc1szXTsKIAlib29sIHBhcml0eWNoZWNrOwogCWJvb2wganVtcHlfY3Vyc29yOwogCWJvb2wgcmVwb3J0c19wcmVzc3VyZTsKIAl1bnNpZ25lZCBjaGFyIGh3X3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGZ3X3ZlcnNpb247CiAJdW5zaWduZWQgaW50IHNpbmdsZV9maW5nZXJfcmVwb3J0czsKKwl1bnNpZ25lZCBpbnQgeV9tYXg7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXN0cnVjdCBmaW5nZXJfcG9zIG10W0VUUF9NQVhfRklOR0VSU107CiAJdW5zaWduZWQgY2hhciBwYXJpdHlbMjU2XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKaW5kZXggNGQxN2Q5Zi4uMDQ3MGRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKQEAgLTEzNiwxMCArMTM2LDEwIEBACiAJLyogZGlzY2FyZCBpZiB0b28gYmlnLCBvciBoYWxmIHRoYXQgYnV0ID4gNCB0aW1lcyB0aGUgcHJldiBkZWx0YSAqLwogCWlmIChhdnggPiByZWNhbGliX2RlbHRhIHx8CiAJCShhdnggPiByZWNhbGliX2RlbHRhIC8gMiAmJiAoKGF2eCAvIDQpID4gcHJpdi0+eGxhc3QpKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgJWRweCBqdW1wIGluIHhcbiIsIHgpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgImRldGVjdGVkICVkcHgganVtcCBpbiB4XG4iLCB4KTsKIAkJcHJpdi0+eGJpZ2ogPSBhdng7CiAJfSBlbHNlIGlmIChhcHByb3hfaGFsZihhdngsIHByaXYtPnhiaWdqKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgc2Vjb25kYXJ5ICVkcHgganVtcCBpbiB4XG4iLCB4KTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJkZXRlY3RlZCBzZWNvbmRhcnkgJWRweCBqdW1wIGluIHhcbiIsIHgpOwogCQlwcml2LT54YmlnaiA9IGF2eDsKIAkJcHJpdi0+eHNhd19zZWNvbmRhcnkrKzsKIAl9IGVsc2UgewpAQCAtMTUxLDEwICsxNTEsMTAgQEAKIAogCWlmIChhdnkgPiByZWNhbGliX2RlbHRhIHx8CiAJCShhdnkgPiByZWNhbGliX2RlbHRhIC8gMiAmJiAoKGF2eSAvIDQpID4gcHJpdi0+eWxhc3QpKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgJWRweCBqdW1wIGluIHlcbiIsIHkpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgImRldGVjdGVkICVkcHgganVtcCBpbiB5XG4iLCB5KTsKIAkJcHJpdi0+eWJpZ2ogPSBhdnk7CiAJfSBlbHNlIGlmIChhcHByb3hfaGFsZihhdnksIHByaXYtPnliaWdqKSkgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZGV0ZWN0ZWQgc2Vjb25kYXJ5ICVkcHgganVtcCBpbiB5XG4iLCB5KTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJkZXRlY3RlZCBzZWNvbmRhcnkgJWRweCBqdW1wIGluIHlcbiIsIHkpOwogCQlwcml2LT55YmlnaiA9IGF2eTsKIAkJcHJpdi0+eXNhd19zZWNvbmRhcnkrKzsKIAl9IGVsc2UgewpAQCAtMTY4LDcgKzE2OCw3IEBACiAJcHJpdi0+eWxhc3QgPSBhdnk7CiAKIAlpZiAoZG9fcmVjYWwgJiYganVtcHlfZGVsYXkpIHsKLQkJaGdwa19lcnIocHNtb3VzZSwgInNjaGVkdWxpbmcgcmVjYWxpYnJhdGlvblxuIik7CisJCXBzbW91c2Vfd2Fybihwc21vdXNlLCAic2NoZWR1bGluZyByZWNhbGlicmF0aW9uXG4iKTsKIAkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoanVtcHlfZGVsYXkpKTsKIAl9CkBAIC0yNjAsOCArMjYwLDggQEAKIAkJICogbW92ZW1lbnQsIGl0IGlzIHByb2JhYmx5IGEgY2FzZSBvZiB0aGUgdXNlciBtb3ZpbmcgdGhlCiAJCSAqIGN1cnNvciB2ZXJ5IHNsb3dseSBhY3Jvc3MgdGhlIHNjcmVlbi4gKi8KIAkJaWYgKGFicyhwcml2LT54X3RhbGx5KSA8IDMgJiYgYWJzKHByaXYtPnlfdGFsbHkpIDwgMykgewotCQkJaGdwa19lcnIocHNtb3VzZSwgInBhY2tldCBzcGV3IGRldGVjdGVkICglZCwlZClcbiIsCi0JCQkJIHByaXYtPnhfdGFsbHksIHByaXYtPnlfdGFsbHkpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJwYWNrZXQgc3BldyBkZXRlY3RlZCAoJWQsJWQpXG4iLAorCQkJCSAgICAgcHJpdi0+eF90YWxseSwgcHJpdi0+eV90YWxseSk7CiAJCQlwcml2LT5zcGV3X2ZsYWcgPSBSRUNBTElCUkFUSU5HOwogCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAogCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKHNwZXdfZGVsYXkpKTsKQEAgLTMzMywxMiArMzMzLDEyIEBACiAJfQogCiAJaWYgKCF2YWxpZCkKLQkJaGdwa19kYmcocHNtb3VzZSwKLQkJCSAiYmFkIGRhdGEsIG1vZGUgJWQgKCVkKSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkJCSBwcml2LT5tb2RlLCBwa3RjbnQsCi0JCQkgcHNtb3VzZS0+cGFja2V0WzBdLCBwc21vdXNlLT5wYWNrZXRbMV0sCi0JCQkgcHNtb3VzZS0+cGFja2V0WzJdLCBwc21vdXNlLT5wYWNrZXRbM10sCi0JCQkgcHNtb3VzZS0+cGFja2V0WzRdLCBwc21vdXNlLT5wYWNrZXRbNV0pOworCQlwc21vdXNlX2RiZyhwc21vdXNlLAorCQkJICAgICJiYWQgZGF0YSwgbW9kZSAlZCAoJWQpICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJICAgIHByaXYtPm1vZGUsIHBrdGNudCwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMF0sIHBzbW91c2UtPnBhY2tldFsxXSwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbMl0sIHBzbW91c2UtPnBhY2tldFszXSwKKwkJCSAgICBwc21vdXNlLT5wYWNrZXRbNF0sIHBzbW91c2UtPnBhY2tldFs1XSk7CiAKIAlyZXR1cm4gdmFsaWQ7CiB9CkBAIC0zNjEsMTkgKzM2MSwyMCBAQAogCiAJCWlucHV0X3JlcG9ydF9hYnMoaWRldiwgQUJTX1BSRVNTVVJFLCB6KTsKIAkJaWYgKHRwZGVidWcpCi0JCQloZ3BrX2RiZyhwc21vdXNlLCAicGQ9JWQgZmQ9JWQgej0lZCIsCi0JCQkJIHB0X2Rvd24sIGZpbmdlcl9kb3duLCB6KTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsICJwZD0lZCBmZD0lZCB6PSVkIiwKKwkJCQkgICAgcHRfZG93biwgZmluZ2VyX2Rvd24sIHopOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFBlblRhYmxldCBtb2RlIGRvZXMgbm90IHJlcG9ydCBwcmVzc3VyZSwgc28gd2UgZG9uJ3QKIAkJICogcmVwb3J0IGl0IGhlcmUKIAkJICovCiAJCWlmICh0cGRlYnVnKQotCQkJaGdwa19kYmcocHNtb3VzZSwgInBkPSVkICIsIGRvd24pOworCQkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInBkPSVkICIsIGRvd24pOwogCX0KIAogCWlmICh0cGRlYnVnKQotCQloZ3BrX2RiZyhwc21vdXNlLCAibD0lZCByPSVkIHg9JWQgeT0lZFxuIiwgbGVmdCwgcmlnaHQsIHgsIHkpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAibD0lZCByPSVkIHg9JWQgeT0lZFxuIiwKKwkJCSAgICBsZWZ0LCByaWdodCwgeCwgeSk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIEJUTl9UT1VDSCwgZG93bik7CiAJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fTEVGVCwgbGVmdCk7CkBAIC0zOTUsNyArMzk2LDcgQEAKIAlpZiAoeCA9PSBwcml2LT5hYnNfeCAmJiB5ID09IHByaXYtPmFic195KSB7CiAJCWlmICgrK3ByaXYtPmR1cGVfY291bnQgPiBTUEVXX1dBVENIX0NPVU5UKSB7CiAJCQlpZiAodHBkZWJ1ZykKLQkJCQloZ3BrX2RiZyhwc21vdXNlLCAiaGFyZCBzcGV3IGRldGVjdGVkXG4iKTsKKwkJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiaGFyZCBzcGV3IGRldGVjdGVkXG4iKTsKIAkJCXByaXYtPnNwZXdfZmxhZyA9IFJFQ0FMSUJSQVRJTkc7CiAJCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCiAJCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoc3Bld19kZWxheSkpOwpAQCAtNDEyLDcgKzQxMyw3IEBACiAJCWludCB5X2RpZmYgPSBwcml2LT5hYnNfeSAtIHk7CiAJCWlmIChoZ3BrX2Rpc2NhcmRfZGVjYXlfaGFjayhwc21vdXNlLCB4X2RpZmYsIHlfZGlmZikpIHsKIAkJCWlmICh0cGRlYnVnKQotCQkJCWhncGtfZGJnKHBzbW91c2UsICJkaXNjYXJkaW5nXG4iKTsKKwkJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJaGdwa19zcGV3aW5nX2hhY2socHNtb3VzZSwgbGVmdCwgcmlnaHQsIHhfZGlmZiwgeV9kaWZmKTsKQEAgLTQzNywyMCArNDM4LDIxIEBACiAJaW50IHkgPSAoKHBhY2tldFswXSA8PCAzKSAmIDB4MTAwKSAtIHBhY2tldFsyXTsKIAogCWlmIChwYWNrZXRbMF0gJiAweGMwKQotCQloZ3BrX2RiZyhwc21vdXNlLAotCQkJICJvdmVyZmxvdyAtLSAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKLQkJCSBwYWNrZXRbMF0sIHBhY2tldFsxXSwgcGFja2V0WzJdKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAib3ZlcmZsb3cgLS0gMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCisJCQkgICAgcGFja2V0WzBdLCBwYWNrZXRbMV0sIHBhY2tldFsyXSk7CiAKIAlpZiAoaGdwa19kaXNjYXJkX2RlY2F5X2hhY2socHNtb3VzZSwgeCwgeSkpIHsKIAkJaWYgKHRwZGVidWcpCi0JCQloZ3BrX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CisJCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiZGlzY2FyZGluZ1xuIik7CiAJCXJldHVybjsKIAl9CiAKIAloZ3BrX3NwZXdpbmdfaGFjayhwc21vdXNlLCBsZWZ0LCByaWdodCwgeCwgeSk7CiAKIAlpZiAodHBkZWJ1ZykKLQkJaGdwa19kYmcocHNtb3VzZSwgImw9JWQgcj0lZCB4PSVkIHk9JWRcbiIsIGxlZnQsIHJpZ2h0LCB4LCB5KTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgImw9JWQgcj0lZCB4PSVkIHk9JWRcbiIsCisJCQkgICAgbGVmdCwgcmlnaHQsIHgsIHkpOwogCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCBsZWZ0KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCByaWdodCk7CkBAIC00ODIsOSArNDg0LDggQEAKIAkJCSAqIHVnaCwgZ290IGEgcGFja2V0IGluc2lkZSBvdXIgcmVjYWxpYnJhdGlvbgogCQkJICogd2luZG93LCBzY2hlZHVsZSBhbm90aGVyIHJlY2FsaWJyYXRpb24uCiAJCQkgKi8KLQkJCWhncGtfZGJnKHBzbW91c2UsCi0JCQkJICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgIgotCQkJCSAicXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgcXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKIAkJCXBzbW91c2VfcXVldWVfd29yayhwc21vdXNlLCAmcHJpdi0+cmVjYWxpYl93cSwKIAkJCQkJbXNlY3NfdG9famlmZmllcyhwb3N0X2ludGVycnVwdF9kZWxheSkpOwogCQl9CkBAIC02MjgsNyArNjI5LDcgQEAKIAogCWVyciA9IGhncGtfc2VsZWN0X21vZGUocHNtb3VzZSk7CiAJaWYgKGVycikgewotCQloZ3BrX2Vycihwc21vdXNlLCAiZmFpbGVkIHRvIHNlbGVjdCBtb2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgImZhaWxlZCB0byBzZWxlY3QgbW9kZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC02NDgsMTEgKzY0OSwxMSBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghYXV0b3JlY2FsKSB7Ci0JCWhncGtfZGJnKHBzbW91c2UsICJyZWNhbGlicmF0aW9ucyBkaXNhYmxlZCwgaWdub3JpbmdcbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGlvbiBkaXNhYmxlZCwgaWdub3JpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQloZ3BrX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGluZyB0b3VjaHBhZC4uXG4iKTsKKwlwc21vdXNlX2RiZyhwc21vdXNlLCAicmVjYWxpYnJhdGluZyB0b3VjaHBhZC4uXG4iKTsKIAogCS8qIHdlIGRvbid0IHdhbnQgdG8gcmFjZSB3aXRoIHRoZSBpcnEgaGFuZGxlciwgbm9yIHdpdGggcmVzeW5jcyAqLwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSU5JVElBTElaSU5HKTsKQEAgLTY3NSw3ICs2NzYsNyBAQAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQUNUSVZBVEVEKTsKIAogCWlmICh0cGRlYnVnKQotCQloZ3BrX2RiZyhwc21vdXNlLCAidG91Y2hwYWQgcmVhY3RpdmF0ZWRcbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAidG91Y2hwYWQgcmVhY3RpdmF0ZWRcbiIpOwogCiAJLyoKIAkgKiBJZiB3ZSBnZXQgcGFja2V0cyByaWdodCBhd2F5IGFmdGVyIHJlY2FsaWJyYXRpbmcsIGl0J3MgbGlrZWx5CkBAIC03MjcsMTYgKzcyOCwxNiBAQAogCiAJCWVyciA9IGhncGtfcmVzZXRfZGV2aWNlKHBzbW91c2UsIGZhbHNlKTsKIAkJaWYgKGVycikgewotCQkJaGdwa19lcnIocHNtb3VzZSwgIkZhaWxlZCB0byByZXNldCBkZXZpY2UhXG4iKTsKKwkJCXBzbW91c2VfZXJyKHBzbW91c2UsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlIVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKIAkJLyogc2hvdWxkIGJlIGFsbCBzZXQsIGVuYWJsZSB0aGUgdG91Y2hwYWQgKi8KIAkJcHMyX2NvbW1hbmQoJnBzbW91c2UtPnBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfRU5BQkxFKTsKIAkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9BQ1RJVkFURUQpOwotCQloZ3BrX2RiZyhwc21vdXNlLCAiVG91Y2hwYWQgcG93ZXJlZCB1cC5cbiIpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiVG91Y2hwYWQgcG93ZXJlZCB1cC5cbiIpOwogCX0gZWxzZSB7Ci0JCWhncGtfZGJnKHBzbW91c2UsICJQb3dlcmluZyBvZmYgdG91Y2hwYWQuXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwgIlBvd2VyaW5nIG9mZiB0b3VjaHBhZC5cbiIpOwogCiAJCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZWMpIHx8CiAJCSAgICBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIDB4ZWMpIHx8CkBAIC05MjMsNyArOTI0LDcgQEAKIAlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSA9IHByaXYtPnBzbW91c2U7CiAKIAlpZiAoaGdwa19mb3JjZV9yZWNhbGlicmF0ZShwc21vdXNlKSkKLQkJaGdwa19lcnIocHNtb3VzZSwgInJlY2FsaWJyYXRpb24gZmFpbGVkIVxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJyZWNhbGlicmF0aW9uIGZhaWxlZCFcbiIpOwogfQogCiBzdGF0aWMgaW50IGhncGtfcmVnaXN0ZXIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC05NDcsMTQgKzk0OCwxNSBAQAogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYsCiAJCQkJICZwc21vdXNlX2F0dHJfcG93ZXJlZC5kYXR0cik7CiAJaWYgKGVycikgewotCQloZ3BrX2Vycihwc21vdXNlLCAiRmFpbGVkIGNyZWF0aW5nICdwb3dlcmVkJyBzeXNmcyBub2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIkZhaWxlZCBjcmVhdGluZyAncG93ZXJlZCcgc3lzZnMgbm9kZVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwc21vdXNlLT5wczJkZXYuc2VyaW8tPmRldiwKIAkJCQkgJnBzbW91c2VfYXR0cl9oZ3BrX21vZGUuZGF0dHIpOwogCWlmIChlcnIpIHsKLQkJaGdwa19lcnIocHNtb3VzZSwgIkZhaWxlZCBjcmVhdGluZyAnaGdwa19tb2RlJyBzeXNmcyBub2RlXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiRmFpbGVkIGNyZWF0aW5nICdoZ3BrX21vZGUnIHN5c2ZzIG5vZGVcbiIpOwogCQlnb3RvIGVycl9yZW1vdmVfcG93ZXJlZDsKIAl9CiAKQEAgLTk2Myw4ICs5NjUsOCBAQAogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAogCQkJCQkgJnBzbW91c2VfYXR0cl9yZWNhbGlicmF0ZS5kYXR0cik7CiAJCWlmIChlcnIpIHsKLQkJCWhncGtfZXJyKHBzbW91c2UsCi0JCQkJIkZhaWxlZCBjcmVhdGluZyAncmVjYWxpYnJhdGUnIHN5c2ZzIG5vZGVcbiIpOworCQkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCQkgICAgIkZhaWxlZCBjcmVhdGluZyAncmVjYWxpYnJhdGUnIHN5c2ZzIG5vZGVcbiIpOwogCQkJZ290byBlcnJfcmVtb3ZlX21vZGU7CiAJCX0KIAl9CkBAIC0xMDI3LDEzICsxMDI5LDEzIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWhncGtfZGJnKHBzbW91c2UsICJJRDogJTAyeCAlMDJ4ICUwMnhcbiIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOworCXBzbW91c2VfZGJnKHBzbW91c2UsICJJRDogJTAyeCAlMDJ4ICUwMnhcbiIsIHBhcmFtWzBdLCBwYXJhbVsxXSwgcGFyYW1bMl0pOwogCiAJLyogSEdQSyBzaWduYXR1cmU6IDB4NjcsIDB4MDAsIDB4PG1vZGVsPiAqLwogCWlmIChwYXJhbVswXSAhPSAweDY3IHx8IHBhcmFtWzFdICE9IDB4MDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JaGdwa19pbmZvKHBzbW91c2UsICJPTFBDIHRvdWNocGFkIHJldmlzaW9uIDB4JXhcbiIsIHBhcmFtWzJdKTsKKwlwc21vdXNlX2luZm8ocHNtb3VzZSwgIk9MUEMgdG91Y2hwYWQgcmV2aXNpb24gMHgleFxuIiwgcGFyYW1bMl0pOwogCiAJcmV0dXJuIHBhcmFtWzJdOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaAppbmRleCAzMTFjMGU4Li5kZDY4Njc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuaApAQCAtNDYsMTcgKzQ2LDYgQEAKIAlpbnQgeHNhd19zZWNvbmRhcnksIHlzYXdfc2Vjb25kYXJ5OyAvKiBqdW1waW5lc3MgZGV0ZWN0aW9uICovCiB9OwogCi0jZGVmaW5lIGhncGtfZGJnKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9kYmcoJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsIGZvcm1hdCwgIyMgYXJnKQotI2RlZmluZSBoZ3BrX2Vycihwc21vdXNlLCBmb3JtYXQsIGFyZy4uLikJCVwKLQlkZXZfZXJyKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa19pbmZvKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9pbmZvKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa193YXJuKHBzbW91c2UsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl93YXJuKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LCBmb3JtYXQsICMjIGFyZykKLSNkZWZpbmUgaGdwa19ub3RpY2UocHNtb3VzZSwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X25vdGljZSgmKHBzbW91c2UpLT5wczJkZXYuc2VyaW8tPmRldiwgZm9ybWF0LCAjIyBhcmcpCi0KICNpZmRlZiBDT05GSUdfTU9VU0VfUFMyX09MUEMKIHZvaWQgaGdwa19tb2R1bGVfaW5pdCh2b2lkKTsKIGludCBoZ3BrX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgYm9vbCBzZXRfcHJvcGVydGllcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKaW5kZXggODNiY2FiYS4uMmM0ZGI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpAQCAtMTY5LDggKzE2OSw4IEBACiAKIAlpZiAocmVsYXRpdmVfcGFja2V0KSB7CiAJCWlmICghZGV2MikKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxpZmVib29rLmM6IGdvdCByZWxhdGl2ZSBwYWNrZXQgIgotCQkJCSJidXQgbm8gcmVsYXRpdmUgZGV2aWNlIHNldCB1cFxuIik7CisJCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwKKwkJCQkgICAgICJnb3QgcmVsYXRpdmUgcGFja2V0IGJ1dCBubyByZWxhdGl2ZSBkZXZpY2Ugc2V0IHVwXG4iKTsKIAl9IGVsc2UgewogCQlpZiAobGlmZWJvb2tfdXNlXzZieXRlX3Byb3RvKSB7CiAJCQlpbnB1dF9yZXBvcnRfYWJzKGRldjEsIEFCU19YLApAQCAtMjEyLDcgKzIxMiw3IEBACiAKIAkvKgogCSAqIEVuYWJsZSBhYnNvbHV0ZSBvdXRwdXQgLS0gcHMyX2NvbW1hbmQgZmFpbHMgYWx3YXlzIGJ1dCBpZgotCSAqIHlvdSBsZWF2ZSB0aGlzIGNhbGwgb3V0IHRoZSB0b3VjaHNyZWVuIHdpbGwgbmV2ZXIgc2VuZAorCSAqIHlvdSBsZWF2ZSB0aGlzIGNhbGwgb3V0IHRoZSB0b3VjaHNjcmVlbiB3aWxsIG5ldmVyIHNlbmQKIAkgKiBhYnNvbHV0ZSBjb29yZGluYXRlcwogCSAqLwogCXBhcmFtID0gbGlmZWJvb2tfdXNlXzZieXRlX3Byb3RvID8gMHgwOCA6IDB4MDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYwppbmRleCBjOTk4M2FlLi5mYWFjMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKQEAgLTgyLDExICs4MiwxMSBAQAogCQkJcGFja2V0WzBdID0gcGFja2V0WzJdIHwgMHgwODsKIAkJCWJyZWFrOwogCi0jaWZkZWYgREVCVUcKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogUmVjZWl2ZWQgUFMyKysgcGFja2V0ICMleCwgYnV0IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZS5cbiIsCi0JCQkJKHBhY2tldFsxXSA+PiA0KSB8IChwYWNrZXRbMF0gJiAweDMwKSk7Ci0jZW5kaWYKKwkJCXBzbW91c2VfZGJnKHBzbW91c2UsCisJCQkJICAgICJSZWNlaXZlZCBQUzIrKyBwYWNrZXQgIyV4LCBidXQgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlLlxuIiwKKwkJCQkgICAgKHBhY2tldFsxXSA+PiA0KSB8IChwYWNrZXRbMF0gJiAweDMwKSk7CisJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFN0YW5kYXJkIFBTLzIgbW90aW9uIGRhdGEgKi8KQEAgLTM4Miw3ICszODIsNyBAQAogCQl9CiAKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2dpcHMycHA6IERldGVjdGVkIHVua25vd24gbG9naXRlY2ggbW91c2UgbW9kZWwgJWRcbiIsIG1vZGVsKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJEZXRlY3RlZCB1bmtub3duIExvZ2l0ZWNoIG1vdXNlIG1vZGVsICVkXG4iLCBtb2RlbCk7CiAJfQogCiAJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CkBAIC00MDAsOSArNDAwLDkgQEAKIAkJCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXYsCiAJCQkJCQkJICAgJnBzbW91c2VfYXR0cl9zbWFydHNjcm9sbC5kYXR0cik7CiAJCQkJaWYgKGVycm9yKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkJImxvZ2lwczJwcC5jOiBmYWlsZWQgdG8gY3JlYXRlIHNtYXJ0c2Nyb2xsICIKLQkJCQkJCSJzeXNmcyBhdHRyaWJ1dGUsIGVycm9yOiAlZFxuIiwgZXJyb3IpOworCQkJCQlwc21vdXNlX2Vycihwc21vdXNlLAorCQkJCQkJICAgICJmYWlsZWQgdG8gY3JlYXRlIHNtYXJ0c2Nyb2xsIHN5c2ZzIGF0dHJpYnV0ZSwgZXJyb3I6ICVkXG4iLAorCQkJCQkJICAgIGVycm9yKTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDNmNzRiYWUuLjlmMzUyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwpAQCAtMTEsNiArMTEsOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpCQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorI2RlZmluZSBwc21vdXNlX2ZtdChmbXQpCWZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yNTEsMTEgKzI1NCwxNCBAQAogCXN3aXRjaCAocmMpIHsKIAljYXNlIFBTTU9VU0VfQkFEX0RBVEE6CiAJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiAlcyBhdCAlcyBsb3N0IHN5bmMgYXQgYnl0ZSAlZFxuIiwKLQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiJXMgYXQgJXMgbG9zdCBzeW5jIGF0IGJ5dGUgJWRcbiIsCisJCQkJICAgICBwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLAorCQkJCSAgICAgcHNtb3VzZS0+cGt0Y250KTsKIAkJCWlmICgrK3BzbW91c2UtPm91dF9vZl9zeW5jX2NudCA9PSBwc21vdXNlLT5yZXNldGFmdGVyKSB7CiAJCQkJX19wc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJwc21vdXNlLmM6IGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOworCQkJCXBzbW91c2Vfbm90aWNlKHBzbW91c2UsCisJCQkJCQkiaXNzdWluZyByZWNvbm5lY3QgcmVxdWVzdFxuIik7CiAJCQkJc2VyaW9fcmVjb25uZWN0KHBzbW91c2UtPnBzMmRldi5zZXJpbyk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQpAQCAtMjY3LDggKzI3Myw5IEBACiAJCXBzbW91c2UtPnBrdGNudCA9IDA7CiAJCWlmIChwc21vdXNlLT5vdXRfb2Zfc3luY19jbnQpIHsKIAkJCXBzbW91c2UtPm91dF9vZl9zeW5jX2NudCA9IDA7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgInBzbW91c2UuYzogJXMgYXQgJXMgLSBkcml2ZXIgcmVzeW5jaGVkLlxuIiwKLQkJCQlwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzKTsKKwkJCXBzbW91c2Vfbm90aWNlKHBzbW91c2UsCisJCQkJCSIlcyBhdCAlcyAtIGRyaXZlciByZXN5bmNlZC5cbiIsCisJCQkJCXBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0yOTUsOSArMzAyLDEwIEBACiAJCSAgICAgKChmbGFncyAmIFNFUklPX1BBUklUWSkgJiYgIXBzbW91c2UtPmlnbm9yZV9wYXJpdHkpKSkgewogCiAJCWlmIChwc21vdXNlLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2UuYzogYmFkIGRhdGEgZnJvbSBLQkMgLSVzJXNcbiIsCi0JCQkJZmxhZ3MgJiBTRVJJT19USU1FT1VUID8gIiB0aW1lb3V0IiA6ICIiLAotCQkJCWZsYWdzICYgU0VSSU9fUEFSSVRZID8gIiBiYWQgcGFyaXR5IiA6ICIiKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImJhZCBkYXRhIGZyb20gS0JDIC0lcyVzXG4iLAorCQkJCSAgICAgZmxhZ3MgJiBTRVJJT19USU1FT1VUID8gIiB0aW1lb3V0IiA6ICIiLAorCQkJCSAgICAgZmxhZ3MgJiBTRVJJT19QQVJJVFkgPyAiIGJhZCBwYXJpdHkiIDogIiIpOwogCQlwczJfY21kX2Fib3J0ZWQoJnBzbW91c2UtPnBzMmRldik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMxNSw4ICszMjMsOCBAQAogCiAJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfQUNUSVZBVEVEICYmCiAJICAgIHBzbW91c2UtPnBrdGNudCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHBzbW91c2UtPmxhc3QgKyBIWi8yKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJwc21vdXNlLmM6ICVzIGF0ICVzIGxvc3Qgc3luY2hyb25pemF0aW9uLCB0aHJvd2luZyAlZCBieXRlcyBhd2F5LlxuIiwKLQkJICAgICAgIHBzbW91c2UtPm5hbWUsIHBzbW91c2UtPnBoeXMsIHBzbW91c2UtPnBrdGNudCk7CisJCXBzbW91c2VfaW5mbyhwc21vdXNlLCAiJXMgYXQgJXMgbG9zdCBzeW5jaHJvbml6YXRpb24sIHRocm93aW5nICVkIGJ5dGVzIGF3YXkuXG4iLAorCQkJICAgICBwc21vdXNlLT5uYW1lLCBwc21vdXNlLT5waHlzLCBwc21vdXNlLT5wa3RjbnQpOwogCQlwc21vdXNlLT5iYWRieXRlID0gcHNtb3VzZS0+cGFja2V0WzBdOwogCQlfX3BzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfUkVTWU5DSU5HKTsKIAkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwc21vdXNlLT5yZXN5bmNfd29yaywgMCk7CkBAIC05NDMsNyArOTUxLDggQEAKICAqLwogCiAJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfUkVTRVRfRElTKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBGYWlsZWQgdG8gcmVzZXQgbW91c2Ugb24gJXNcbiIsIHBzMmRldi0+c2VyaW8tPnBoeXMpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byByZXNldCBtb3VzZSBvbiAlc1xuIiwKKwkJCSAgICAgcHMyZGV2LT5zZXJpby0+cGh5cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDUsOCArMTAxNCw4IEBACiBzdGF0aWMgdm9pZCBwc21vdXNlX2FjdGl2YXRlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9FTkFCTEUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6IEZhaWxlZCB0byBlbmFibGUgbW91c2Ugb24gJXNcbiIsCi0JCQlwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMpOworCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgIkZhaWxlZCB0byBlbmFibGUgbW91c2Ugb24gJXNcbiIsCisJCQkgICAgIHBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CiAKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0FDVElWQVRFRCk7CiB9CkBAIC0xMDIwLDE0ICsxMDI5LDE0IEBACiBzdGF0aWMgdm9pZCBwc21vdXNlX2RlYWN0aXZhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJaWYgKHBzMl9jb21tYW5kKCZwc21vdXNlLT5wczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0RJU0FCTEUpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwc21vdXNlLmM6IEZhaWxlZCB0byBkZWFjdGl2YXRlIG1vdXNlIG9uICVzXG4iLAotCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJGYWlsZWQgdG8gZGVhY3RpdmF0ZSBtb3VzZSBvbiAlc1xuIiwKKwkJCSAgICAgcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKIAogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogfQogCiAvKgotICogcHNtb3VzZV9wb2xsKCkgLSBkZWZhdWx0IHBvbGwgaGFubGRlci4gRXZlcnlvbmUgZXhjZXB0IGZvciBBTFBTIHVzZXMgaXQuCisgKiBwc21vdXNlX3BvbGwoKSAtIGRlZmF1bHQgcG9sbCBoYW5kbGVyLiBFdmVyeW9uZSBleGNlcHQgZm9yIEFMUFMgdXNlcyBpdC4KICAqLwogCiBzdGF0aWMgaW50IHBzbW91c2VfcG9sbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKQEAgLTExMTUsMTQgKzExMjQsMTUgQEAKIAl9CiAKIAlpZiAoIWVuYWJsZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAotCQkJcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5waHlzKTsKKwkJcHNtb3VzZV93YXJuKHBzbW91c2UsICJmYWlsZWQgdG8gcmUtZW5hYmxlIG1vdXNlIG9uICVzXG4iLAorCQkJICAgICBwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMpOwogCQlmYWlsZWQgPSB0cnVlOwogCX0KIAogCWlmIChmYWlsZWQpIHsKIAkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOwotCQlwcmludGsoS0VSTl9JTkZPICJwc21vdXNlLmM6IHJlc3luYyBmYWlsZWQsIGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOworCQlwc21vdXNlX2luZm8ocHNtb3VzZSwKKwkJCSAgICAgInJlc3luYyBmYWlsZWQsIGlzc3VpbmcgcmVjb25uZWN0IHJlcXVlc3RcbiIpOwogCQlzZXJpb19yZWNvbm5lY3Qoc2VyaW8pOwogCX0gZWxzZQogCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0FDVElWQVRFRCk7CkBAIC0xMTU1LDggKzExNjUsOCBAQAogCSAqIERpc2FibGUgc3RyZWFtIG1vZGUgc28gY2xlYW51cCByb3V0aW5lIGNhbiBwcm9jZWVkIHVuZGlzdHVyYmVkLgogCSAqLwogCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBOVUxMLCBQU01PVVNFX0NNRF9ESVNBQkxFKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHNtb3VzZS5jOiBGYWlsZWQgdG8gZGlzYWJsZSBtb3VzZSBvbiAlc1xuIiwKLQkJCXBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CisJCXBzbW91c2Vfd2Fybihwc21vdXNlLCAiRmFpbGVkIHRvIGRpc2FibGUgbW91c2Ugb24gJXNcbiIsCisJCQkgICAgIHBzbW91c2UtPnBzMmRldi5zZXJpby0+cGh5cyk7CiAKIAlpZiAocHNtb3VzZS0+Y2xlYW51cCkKIAkJcHNtb3VzZS0+Y2xlYW51cChwc21vdXNlKTsKQEAgLTE0MDAsNyArMTQxMCw4IEBACiAJaW50IHJjID0gLTE7CiAKIAlpZiAoIWRydiB8fCAhcHNtb3VzZSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicHNtb3VzZTogcmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKKwkJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJCSAgICAicmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTQyNyw4ICsxNDM4LDkgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCS8qIG9rLCB0aGUgZGV2aWNlIHR5cGUgKGFuZCBjYXBhYmlsaXRpZXMpIG1hdGNoIHRoZSBvbGQgb25lLAotCSAqIHdlIGNhbiBjb250aW51ZSB1c2luZyBpdCwgY29tcGxldGUgaW50aWFsaXphdGlvbgorCS8qCisJICogT0ssIHRoZSBkZXZpY2UgdHlwZSAoYW5kIGNhcGFiaWxpdGllcykgbWF0Y2ggdGhlIG9sZCBvbmUsCisJICogd2UgY2FuIGNvbnRpbnVlIHVzaW5nIGl0LCBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgogCSAqLwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogCkBAIC0xNTg2LDkgKzE1OTgsOCBAQAogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZXJpby0+Y2hpbGRyZW4pKSB7CiAJCWlmICgrK3JldHJ5ID4gMykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJwc21vdXNlOiBmYWlsZWQgdG8gZGVzdHJveSBjaGlsZHJlbiBwb3J0cywgIgotCQkJCSJwcm90b2NvbCBjaGFuZ2UgYWJvcnRlZC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZmFpbGVkIHRvIGRlc3Ryb3kgY2hpbGRyZW4gcG9ydHMsIHByb3RvY29sIGNoYW5nZSBhYm9ydGVkLlxuIik7CiAJCQlpbnB1dF9mcmVlX2RldmljZShuZXdfZGV2KTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0xNzE1LDcgKzE3MjYsNyBAQAogCiAJa3BzbW91c2VkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtwc21vdXNlZCIpOwogCWlmICgha3BzbW91c2VkX3dxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHNtb3VzZTogZmFpbGVkIHRvIGNyZWF0ZSBrcHNtb3VzZWQgd29ya3F1ZXVlXG4iKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKaW5kZXggNTkzZTkxMC4uOWI4NGIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLmgKQEAgLTE1MCw0ICsxNTAsMjkgQEAKIAlzdGF0aWMgc3NpemVfdCBfc2V0KHN0cnVjdCBwc21vdXNlICosIHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwlcCiAJX19QU01PVVNFX0RFRklORV9BVFRSX1ZBUihfbmFtZSwgX21vZGUsIF9kYXRhLCBOVUxMLCBfc2V0LCB0cnVlKQogCisjaWZuZGVmIHBzbW91c2VfZm10CisjZGVmaW5lIHBzbW91c2VfZm10KGZtdCkJS0JVSUxEX0JBU0VOQU1FICI6ICIgZm10CisjZW5kaWYKKworI2RlZmluZSBwc21vdXNlX2RiZyhwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfZGJnKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAkJXAorCQlwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX2luZm8ocHNtb3VzZSwgZm9ybWF0LCAuLi4pCQlcCisJZGV2X2luZm8oJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCQlcCisJCSBwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX3dhcm4ocHNtb3VzZSwgZm9ybWF0LCAuLi4pCQlcCisJZGV2X3dhcm4oJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCQlcCisJCSBwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX2Vycihwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfZXJyKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAkJXAorCQlwc21vdXNlX2ZtdChmb3JtYXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwc21vdXNlX25vdGljZShwc21vdXNlLCBmb3JtYXQsIC4uLikJCVwKKwlkZXZfbm90aWNlKCYocHNtb3VzZSktPnBzMmRldi5zZXJpby0+ZGV2LAlcCisJCSAgIHBzbW91c2VfZm10KGZvcm1hdCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHBzbW91c2VfcHJpbnRrKGxldmVsLCBwc21vdXNlLCBmb3JtYXQsIC4uLikJXAorCWRldl9wcmludGsobGV2ZWwsCQkJCVwKKwkJICAgJihwc21vdXNlKS0+cHMyZGV2LnNlcmlvLT5kZXYsCVwKKwkJICAgcHNtb3VzZV9mbXQoZm9ybWF0KSwgIyNfX1ZBX0FSR1NfXykKKworCiAjZW5kaWYgLyogX1BTTU9VU0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jCmluZGV4IDZjNWQ4NGYuLmVlM2IwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHhhOTMwX3Rya2JhbGwuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCS8qIGhlbGQgdGhlIG1vZHVsZSBpbiByZXNldCwgd2lsbCBiZSBlbmFibGVkIGluIG9wZW4oKSAqLwogCXB4YTkzMF90cmtiYWxsX2Rpc2FibGUodHJrYmFsbCk7CiAKLQllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBweGE5MzBfdHJrYmFsbF9pbnRlcnJ1cHQsIDAsCiAJCQkgICAgcGRldi0+bmFtZSwgdHJrYmFsbCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIGVycm9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYwppbmRleCAyZmM4ODdhLi5jNWIxMmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jCkBAIC02MDcsMTEgKzYwNywxMiBAQAogCiAJcHMyX3BhY2tldF9jbnQrKzsKIAlqaWZmaWVzX21zZWMgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwotCXByaW50ayhLRVJOX0RFQlVHICIlMDhkbXMgUFMvMiBwYWNrZXRzOiAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iLAotCQlqaWZmaWVzX21zZWMsIHBhY2tldFswXSwgcGFja2V0WzFdLCBwYWNrZXRbMl0sIHBhY2tldFszXSk7CisJcHNtb3VzZV9kYmcocHNtb3VzZSwKKwkJICAgICIlMDhkbXMgUFMvMiBwYWNrZXRzOiAlMDJ4LCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iLAorCQkgICAgamlmZmllc19tc2VjLCBwYWNrZXRbMF0sIHBhY2tldFsxXSwgcGFja2V0WzJdLCBwYWNrZXRbM10pOwogCiAJaWYgKGppZmZpZXNfbXNlYyAtIHBzMl9sYXN0X3NlY29uZCA+IDEwMDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlBTLzIgcGFja2V0cy9zZWMgPSAlZFxuIiwgcHMyX3BhY2tldF9jbnQpOworCQlwc21vdXNlX2RiZyhwc21vdXNlLCAiUFMvMiBwYWNrZXRzL3NlYyA9ICVkXG4iLCBwczJfcGFja2V0X2NudCk7CiAJCXBzMl9wYWNrZXRfY250ID0gMDsKIAkJcHMyX2xhc3Rfc2Vjb25kID0gamlmZmllc19tc2VjOwogCX0KQEAgLTgyMCw5ICs4MjEsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JCSJGaW5nZXIgU2Vuc2luZyBQYWQsIGh3OiAlZC4lZC4lZCwgc3c6ICVzLCBidXR0b25zOiAlZFxuIiwKLQkJdmVyID4+IDQsIHZlciAmIDB4MEYsIHJldiwgZnNwX2Rydl92ZXIsIGJ1dHRvbnMgJiA3KTsKKwlwc21vdXNlX2luZm8ocHNtb3VzZSwKKwkJICAgICAiRmluZ2VyIFNlbnNpbmcgUGFkLCBodzogJWQuJWQuJWQsIHN3OiAlcywgYnV0dG9uczogJWRcbiIsCisJCSAgICAgdmVyID4+IDQsIHZlciAmIDB4MEYsIHJldiwgZnNwX2Rydl92ZXIsIGJ1dHRvbnMgJiA3KTsKIAogCXBzbW91c2UtPnByaXZhdGUgPSBwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZzcF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKaW5kZXggNTUzOGZjNi4uYzA4MGI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC00NCw2ICs0NCwxNiBAQAogI2RlZmluZSBZTUlOX05PTUlOQUwgMTQwOAogI2RlZmluZSBZTUFYX05PTUlOQUwgNDQ0OAogCisvKgorICogU3luYXB0aWNzIHRvdWNocGFkcyByZXBvcnQgdGhlIHkgY29vcmRpbmF0ZSBmcm9tIGJvdHRvbSB0byB0b3AsIHdoaWNoIGlzCisgKiBvcHBvc2l0ZSBmcm9tIHdoYXQgdXNlcnNwYWNlIGV4cGVjdHMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW52ZXJ0IHkgYmVmb3JlIHJlcG9ydGluZy4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3NfaW52ZXJ0X3koaW50IHkpCit7CisJcmV0dXJuIFlNQVhfTk9NSU5BTCArIFlNSU5fTk9NSU5BTCAtIHk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglTdHVmZiB3ZSBuZWVkIGV2ZW4gd2hlbiB3ZSBkbyBub3Qgd2FudCBuYXRpdmUgU3luYXB0aWNzIHN1cHBvcnQKQEAgLTE1Nyw4ICsxNjcsOCBAQAogCiAJaWYgKFNZTl9FWFRfQ0FQX1JFUVVFU1RTKHByaXYtPmNhcGFiaWxpdGllcykgPj0gMSkgewogCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIFNZTl9RVUVfRVhUX0NBUEFCLCBjYXApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlN5bmFwdGljcyBjbGFpbXMgdG8gaGF2ZSBleHRlbmRlZCBjYXBhYmlsaXRpZXMsIgotCQkJICAgICAgICIgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIHRoZW0uXG4iKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImRldmljZSBjbGFpbXMgdG8gaGF2ZSBleHRlbmRlZCBjYXBhYmlsaXRpZXMsIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCB0aGVtLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5leHRfY2FwID0gKGNhcFswXSA8PCAxNikgfCAoY2FwWzFdIDw8IDgpIHwgY2FwWzJdOwogCkBAIC0xNzMsOCArMTgzLDggQEAKIAogCWlmIChTWU5fRVhUX0NBUF9SRVFVRVNUUyhwcml2LT5jYXBhYmlsaXRpZXMpID49IDQpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9DQVBBQl8wQywgY2FwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgZXh0ZW5kZWQgY2FwYWJpbGl0eSAweDBjLCIKLQkJCSAgICAgICAiIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIGV4dGVuZGVkIGNhcGFiaWxpdHkgMHgwYywgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5leHRfY2FwXzBjID0gKGNhcFswXSA8PCAxNikgfCAoY2FwWzFdIDw8IDgpIHwgY2FwWzJdOwogCQl9CkBAIC0yMjIsOCArMjMyLDggQEAKIAlpZiAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA1ICYmCiAJICAgIFNZTl9DQVBfTUFYX0RJTUVOU0lPTlMocHJpdi0+ZXh0X2NhcF8wYykpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9NQVhfQ09PUkRTLCByZXNwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgbWF4IGNvb3JkaW5hdGVzIgotCQkJICAgICAgICIgcXVlcnksIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIG1heCBjb29yZGluYXRlcyBxdWVyeSwgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT54X21heCA9IChyZXNwWzBdIDw8IDUpIHwgKChyZXNwWzFdICYgMHgwZikgPDwgMSk7CiAJCQlwcml2LT55X21heCA9IChyZXNwWzJdIDw8IDUpIHwgKChyZXNwWzFdICYgMHhmMCkgPj4gMyk7CkBAIC0yMzMsOCArMjQzLDggQEAKIAlpZiAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA3ICYmCiAJICAgIFNZTl9DQVBfTUlOX0RJTUVOU0lPTlMocHJpdi0+ZXh0X2NhcF8wYykpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9NSU5fQ09PUkRTLCByZXNwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTeW5hcHRpY3MgY2xhaW1zIHRvIGhhdmUgbWluIGNvb3JkaW5hdGVzIgotCQkJICAgICAgICIgcXVlcnksIGJ1dCBJJ20gbm90IGFibGUgdG8gcmVhZCBpdC5cbiIpOworCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCisJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIG1pbiBjb29yZGluYXRlcyBxdWVyeSwgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT54X21pbiA9IChyZXNwWzBdIDw8IDUpIHwgKChyZXNwWzFdICYgMHgwZikgPDwgMSk7CiAJCQlwcml2LT55X21pbiA9IChyZXNwWzJdIDw8IDUpIHwgKChyZXNwWzFdICYgMHhmMCkgPj4gMyk7CkBAIC0yOTQsNyArMzA0LDggQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJhbSA9IDB4Yzg7CiAJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAotCWlmICghU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkKKwlpZiAoIShTWU5fQ0FQX0FEVl9HRVNUVVJFKHByaXYtPmV4dF9jYXBfMGMpIHx8CisJCQlTWU5fQ0FQX0lNQUdFX1NFTlNPUihwcml2LT5leHRfY2FwXzBjKSkpCiAJCXJldHVybiAwOwogCiAJaWYgKHBzbW91c2Vfc2xpY2VkX2NvbW1hbmQocHNtb3VzZSwgU1lOX1FVRV9NT0RFTCkpCkBAIC0zNzcsNyArMzg4LDggQEAKIAkJCXByaXYtPm1vZGUgJj0gflNZTl9CSVRfRk9VUl9CWVRFX0NMSUVOVDsKIAogCQlpZiAoc3luYXB0aWNzX21vZGVfY21kKHBzbW91c2UsIHByaXYtPm1vZGUpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAic3luYXB0aWNzOiBmYWlsZWQgdG8gc3dpdGNoIGd1ZXN0IHByb3RvY29sXG4iKTsKKwkJCXBzbW91c2Vfd2Fybihwc21vdXNlLAorCQkJCSAgICAgImZhaWxlZCB0byBzd2l0Y2ggZ3Vlc3QgcHJvdG9jb2xcbiIpOwogCX0KIH0KIApAQCAtMzg3LDcgKzM5OSw4IEBACiAKIAlzZXJpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpbyksIEdGUF9LRVJORUwpOwogCWlmICghc2VyaW8pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzeW5hcHRpY3M6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHBhc3MtdGhyb3VnaCBwb3J0XG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIHBhc3MtdGhyb3VnaCBwb3J0XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDAxLDcgKzQxNCw4IEBACiAKIAlwc21vdXNlLT5wdF9hY3RpdmF0ZSA9IHN5bmFwdGljc19wdF9hY3RpdmF0ZTsKIAotCXByaW50ayhLRVJOX0lORk8gInNlcmlvOiAlcyBwb3J0IGF0ICVzXG4iLCBzZXJpby0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7CisJcHNtb3VzZV9pbmZvKHBzbW91c2UsICJzZXJpbzogJXMgcG9ydCBhdCAlc1xuIiwKKwkJICAgICBzZXJpby0+bmFtZSwgcHNtb3VzZS0+cGh5cyk7CiAJc2VyaW9fcmVnaXN0ZXJfcG9ydChzZXJpbyk7CiB9CiAKQEAgLTQwOSw2ICs0MjMsNDQgQEAKICAqCUZ1bmN0aW9ucyB0byBpbnRlcnByZXQgdGhlIGFic29sdXRlIG1vZGUgcGFja2V0cwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19tdF9zdGF0ZV9zZXQoc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqc3RhdGUsIGludCBjb3VudCwKKwkJCQkgICBpbnQgc2dtLCBpbnQgYWdtKQoreworCXN0YXRlLT5jb3VudCA9IGNvdW50OworCXN0YXRlLT5zZ20gPSBzZ207CisJc3RhdGUtPmFnbSA9IGFnbTsKK30KKworc3RhdGljIHZvaWQgc3luYXB0aWNzX3BhcnNlX2FnbShjb25zdCB1bnNpZ25lZCBjaGFyIGJ1ZltdLAorCQkJCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwKKwkJCQlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKK3sKKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICphZ20gPSAmcHJpdi0+YWdtOworCWludCBhZ21fcGFja2V0X3R5cGU7CisKKwlhZ21fcGFja2V0X3R5cGUgPSAoYnVmWzVdICYgMHgzMCkgPj4gNDsKKwlzd2l0Y2ggKGFnbV9wYWNrZXRfdHlwZSkgeworCWNhc2UgMToKKwkJLyogR2VzdHVyZSBwYWNrZXQ6ICh4LCB5LCB6KSBoYWxmIHJlc29sdXRpb24gKi8KKwkJYWdtLT53ID0gaHctPnc7CisJCWFnbS0+eCA9ICgoKGJ1Zls0XSAmIDB4MGYpIDw8IDgpIHwgYnVmWzFdKSA8PCAxOworCQlhZ20tPnkgPSAoKChidWZbNF0gJiAweGYwKSA8PCA0KSB8IGJ1ZlsyXSkgPDwgMTsKKwkJYWdtLT56ID0gKChidWZbM10gJiAweDMwKSB8IChidWZbNV0gJiAweDBmKSkgPDwgMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8qIEFHTS1DT05UQUNUIHBhY2tldDogKGNvdW50LCBzZ20sIGFnbSkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldCgmYWdtLT5tdF9zdGF0ZSwgYnVmWzFdLCBidWZbMl0sIGJ1Zls0XSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogUmVjb3JkIHRoYXQgYXQgbGVhc3Qgb25lIEFHTSBoYXMgYmVlbiByZWNlaXZlZCBzaW5jZSBsYXN0IFNHTSAqLworCXByaXYtPmFnbV9wZW5kaW5nID0gdHJ1ZTsKK30KKwogc3RhdGljIGludCBzeW5hcHRpY3NfcGFyc2VfaHdfc3RhdGUoY29uc3QgdW5zaWduZWQgY2hhciBidWZbXSwKIAkJCQkgICAgc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2LAogCQkJCSAgICBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKQEAgLTQ0MiwxMSArNDk0LDEwIEBACiAJCQlody0+ZG93biA9ICgoYnVmWzBdIF4gYnVmWzNdKSAmIDB4MDIpID8gMSA6IDA7CiAJCX0KIAotCQlpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSAmJiBody0+dyA9PSAyKSB7Ci0JCQkvKiBHZXN0dXJlIHBhY2tldDogKHgsIHksIHopIGF0IGhhbGYgcmVzb2x1dGlvbiAqLwotCQkJcHJpdi0+bXQueCA9ICgoKGJ1Zls0XSAmIDB4MGYpIDw8IDgpIHwgYnVmWzFdKSA8PCAxOwotCQkJcHJpdi0+bXQueSA9ICgoKGJ1Zls0XSAmIDB4ZjApIDw8IDQpIHwgYnVmWzJdKSA8PCAxOwotCQkJcHJpdi0+bXQueiA9ICgoYnVmWzNdICYgMHgzMCkgfCAoYnVmWzVdICYgMHgwZikpIDw8IDE7CisJCWlmICgoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSB8fAorCQkJU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpICYmCisJCSAgICBody0+dyA9PSAyKSB7CisJCQlzeW5hcHRpY3NfcGFyc2VfYWdtKGJ1ZiwgcHJpdiwgaHcpOwogCQkJcmV0dXJuIDE7CiAJCX0KIApAQCAtNTAyLDggKzU1Myw3IEBACiAJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoZGV2LCBNVF9UT09MX0ZJTkdFUiwgYWN0aXZlKTsKIAlpZiAoYWN0aXZlKSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKLQkJCQkgWU1BWF9OT01JTkFMICsgWU1JTl9OT01JTkFMIC0geSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgc3luYXB0aWNzX2ludmVydF95KHkpKTsKIAl9CiB9CiAKQEAgLTUyNiw2ICs1NzYsMzg4IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X2J1dHRvbnMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwc21vdXNlLT5kZXY7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwlpbnQgaTsKKworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgaHctPmxlZnQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LT5yaWdodCk7CisKKwlpZiAoU1lOX0NBUF9NSURETEVfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBody0+bWlkZGxlKTsKKworCWlmIChTWU5fQ0FQX0ZPVVJfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpIHsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBody0+dXApOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGh3LT5kb3duKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCk7IGkrKykKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wICsgaSwgaHctPmV4dF9idXR0b25zICYgKDEgPDwgaSkpOworfQorCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X3Nsb3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2xvdCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzeW5hcHRpY3NfaHdfc3RhdGUgKmh3KQoreworCWlucHV0X210X3Nsb3QoZGV2LCBzbG90KTsKKwlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShkZXYsIE1UX1RPT0xfRklOR0VSLCAoaHcgIT0gTlVMTCkpOworCWlmICghaHcpCisJCXJldHVybjsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgaHctPngpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgc3luYXB0aWNzX2ludmVydF95KGh3LT55KSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NVF9QUkVTU1VSRSwgaHctPnopOworfQorCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcmVwb3J0X210X2RhdGEoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgICBzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICptdF9zdGF0ZSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzeW5hcHRpY3NfaHdfc3RhdGUgKnNnbSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwc21vdXNlLT5kZXY7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICphZ20gPSAmcHJpdi0+YWdtOworCXN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm9sZCA9ICZwcml2LT5tdF9zdGF0ZTsKKworCXN3aXRjaCAobXRfc3RhdGUtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKwkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKG10X3N0YXRlLT5zZ20gPT0gLTEpIHsKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDAsIE5VTEwpOworCQkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCX0gZWxzZSBpZiAobXRfc3RhdGUtPnNnbSA9PSAwKSB7CisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBzZ20pOworCQkJc3luYXB0aWNzX3JlcG9ydF9zbG90KGRldiwgMSwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIHNnbSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogSWYgdGhlIGZpbmdlciBzbG90IGNvbnRhaW5lZCBpbiBTR00gaXMgdmFsaWQsIGFuZCBlaXRoZXIKKwkJICogaGFzbid0IGNoYW5nZWQsIG9yIGlzIG5ldywgdGhlbiByZXBvcnQgU0dNIGluIE1UQiBzbG90IDAuCisJCSAqIE90aGVyd2lzZSwgZW1wdHkgTVRCIHNsb3QgMC4KKwkJICovCisJCWlmIChtdF9zdGF0ZS0+c2dtICE9IC0xICYmCisJCSAgICAobXRfc3RhdGUtPnNnbSA9PSBvbGQtPnNnbSB8fCBvbGQtPnNnbSA9PSAtMSkpCisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBzZ20pOworCQllbHNlCisJCQlzeW5hcHRpY3NfcmVwb3J0X3Nsb3QoZGV2LCAwLCBOVUxMKTsKKworCQkvKgorCQkgKiBJZiB0aGUgZmluZ2VyIHNsb3QgY29udGFpbmVkIGluIEFHTSBpcyB2YWxpZCwgYW5kIGVpdGhlcgorCQkgKiBoYXNuJ3QgY2hhbmdlZCwgb3IgaXMgbmV3LCB0aGVuIHJlcG9ydCBBR00gaW4gTVRCIHNsb3QgMS4KKwkJICogT3RoZXJ3aXNlLCBlbXB0eSBNVEIgc2xvdCAxLgorCQkgKi8KKwkJaWYgKG10X3N0YXRlLT5hZ20gIT0gLTEgJiYKKwkJICAgIChtdF9zdGF0ZS0+YWdtID09IG9sZC0+YWdtIHx8IG9sZC0+YWdtID09IC0xKSkKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIGFnbSk7CisJCWVsc2UKKwkJCXN5bmFwdGljc19yZXBvcnRfc2xvdChkZXYsIDEsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwkvKiBEb24ndCB1c2UgYWN0aXZlIHNsb3QgY291bnQgdG8gZ2VuZXJhdGUgQlROX1RPT0wgZXZlbnRzLiAqLworCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihkZXYsIGZhbHNlKTsKKworCS8qIFNlbmQgdGhlIG51bWJlciBvZiBmaW5nZXJzIHJlcG9ydGVkIGJ5IHRvdWNocGFkIGl0c2VsZi4gKi8KKwlpbnB1dF9tdF9yZXBvcnRfZmluZ2VyX2NvdW50KGRldiwgbXRfc3RhdGUtPmNvdW50KTsKKworCXN5bmFwdGljc19yZXBvcnRfYnV0dG9ucyhwc21vdXNlLCBzZ20pOworCisJaW5wdXRfc3luYyhkZXYpOworfQorCisvKiBIYW5kbGUgY2FzZSB3aGVyZSBtdF9zdGF0ZS0+Y291bnQgPSAwICovCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzBmKHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICptdF9zdGF0ZSkKK3sKKwlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAwLCAtMSwgLTEpOworCXByaXYtPm10X3N0YXRlX2xvc3QgPSBmYWxzZTsKK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gMSAqLworc3RhdGljIHZvaWQgc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8xZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqbXRfc3RhdGUpCit7CisJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqYWdtID0gJnByaXYtPmFnbTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlICpvbGQgPSAmcHJpdi0+bXRfc3RhdGU7CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IEFHTSB3YXMgKDAsMCwwKSwgYW5kIHRoZXJlIGlzIG9ubHkgb25lIGZpbmdlciBsZWZ0LAorCSAqIHRoZW4gd2UgYWJzb2x1dGVseSBrbm93IHRoYXQgU0dNIGNvbnRhaW5zIHNsb3QgMCwgYW5kIGFsbCBvdGhlcgorCSAqIGZpbmdlcnMgaGF2ZSBiZWVuIHJlbW92ZWQuCisJICovCisJaWYgKHByaXYtPmFnbV9wZW5kaW5nICYmIGFnbS0+eiA9PSAwKSB7CisJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIDAsIC0xKTsKKwkJcHJpdi0+bXRfc3RhdGVfbG9zdCA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChvbGQtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAwLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyoKKwkJICogSWYgbXRfc3RhdGVfbG9zdCwgdGhlbiB0aGUgcHJldmlvdXMgdHJhbnNpdGlvbiB3YXMgMy0+MSwKKwkJICogYW5kIFNHTSBub3cgY29udGFpbnMgZWl0aGVyIHNsb3QgMCBvciAxLCBidXQgd2UgZG9uJ3Qga25vdworCQkgKiB3aGljaC4gIFNvLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSBTR00gbm93IGNvbnRhaW5zIHNsb3QgMS4KKwkJICoKKwkJICogSWYgcGVuZGluZyBBR00gYW5kIGVpdGhlcjoKKwkJICogICAoYSkgdGhlIHByZXZpb3VzIFNHTSBzbG90IGNvbnRhaW5zIHNsb3QgMCwgb3IKKwkJICogICAoYikgdGhlcmUgd2FzIG5vIFNHTSBzbG90CisJCSAqIHRoZW4sIHRoZSBTR00gbm93IGNvbnRhaW5zIHNsb3QgMQorCQkgKgorCQkgKiBDYXNlIChhKSBoYXBwZW5zIHdpdGggdmVyeSByYXBpZCAiZHJ1bSByb2xsIiBnZXN0dXJlcywgd2hlcmUKKwkJICogc2xvdCAwIGZpbmdlciBpcyBsaWZ0ZWQgYW5kIGEgbmV3IHNsb3QgMSBmaW5nZXIgdG91Y2hlcworCQkgKiB3aXRoaW4gb25lIHJlcG9ydGluZyBpbnRlcnZhbC4KKwkJICoKKwkJICogQ2FzZSAoYikgaGFwcGVucyBpZiBpbml0aWFsbHkgdHdvIG9yIG1vcmUgZmluZ2VycyB0YXAKKwkJICogYnJpZWZseSwgYW5kIGFsbCBidXQgb25lIGxpZnQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGZpcnN0CisJCSAqIHJlcG9ydGluZyBpbnRlcnZhbC4KKwkJICoKKwkJICogKEluIGJvdGggdGhlc2UgY2FzZXMsIHNsb3QgMCB3aWxsIGJlY29tZXMgZW1wdHksIHNvIFNHTQorCQkgKiBjb250YWlucyBzbG90IDEgd2l0aCB0aGUgbmV3IGZpbmdlcikKKwkJICoKKwkJICogRWxzZSwgaWYgdGhlcmUgd2FzIG5vIHByZXZpb3VzIFNHTSwgaXQgbm93IGNvbnRhaW5zIHNsb3QgMC4KKwkJICoKKwkJICogT3RoZXJ3aXNlLCBTR00gc3RpbGwgY29udGFpbnMgdGhlIHNhbWUgc2xvdC4KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0IHx8CisJCSAgICAocHJpdi0+YWdtX3BlbmRpbmcgJiYgb2xkLT5zZ20gPD0gMCkpCisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAxLCAtMSk7CisJCWVsc2UgaWYgKG9sZC0+c2dtID09IC0xKQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMSwgMCwgLTEpOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qCisJCSAqIElmIG10X3N0YXRlX2xvc3QsIHdlIGRvbid0IGtub3cgd2hpY2ggZmluZ2VyIFNHTSBjb250YWlucy4KKwkJICoKKwkJICogU28sIHJlcG9ydCAxIGZpbmdlciwgYnV0IHdpdGggYm90aCBzbG90cyBlbXB0eS4KKwkJICogV2Ugd2lsbCB1c2Ugc2xvdCAxIG9uIHN1YnNlcXVlbnQgMS0+MQorCQkgKi8KKwkJaWYgKHByaXYtPm10X3N0YXRlX2xvc3QpIHsKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIC0xLCAtMSk7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBTaW5jZSB0aGUgbGFzdCBBR00gd2FzIE5PVCAoMCwwLDApLCBpdCB3YXMgdGhlIGZpbmdlciBpbgorCQkgKiBzbG90IDAgdGhhdCBoYXMgYmVlbiByZW1vdmVkLgorCQkgKiBTbywgU0dNIG5vdyBjb250YWlucyBwcmV2aW91cyBBR00ncyBzbG90LCBhbmQgQUdNIGlzIG5vdworCQkgKiBlbXB0eS4KKwkJICovCisJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDEsIG9sZC0+YWdtLCAtMSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyoKKwkJICogU2luY2UgbGFzdCBBR00gd2FzIG5vdCAoMCwwLDApLCB3ZSBkb24ndCBrbm93IHdoaWNoIGZpbmdlcgorCQkgKiBpcyBsZWZ0LgorCQkgKgorCQkgKiBTbywgcmVwb3J0IDEgZmluZ2VyLCBidXQgd2l0aCBib3RoIHNsb3RzIGVtcHR5LgorCQkgKiBXZSB3aWxsIHVzZSBzbG90IDEgb24gc3Vic2VxdWVudCAxLT4xCisJCSAqLworCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAxLCAtMSwgLTEpOworCQlwcml2LT5tdF9zdGF0ZV9sb3N0ID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJLyogbXRfc3RhdGUgd2FzIHVwZGF0ZWQgYnkgQUdNLUNPTlRBQ1QgcGFja2V0ICovCisJCWJyZWFrOworCX0KK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gMiAqLworc3RhdGljIHZvaWQgc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8yZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqbXRfc3RhdGUpCit7CisJc3RydWN0IHN5bmFwdGljc19tdF9zdGF0ZSAqb2xkID0gJnByaXYtPm10X3N0YXRlOworCisJc3dpdGNoIChvbGQtPmNvdW50KSB7CisJY2FzZSAwOgorCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAyLCAwLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKgorCQkgKiBJZiBwcmV2aW91cyBTR00gY29udGFpbmVkIHNsb3QgMSBvciBoaWdoZXIsIFNHTSBub3cgY29udGFpbnMKKwkJICogc2xvdCAwICh0aGUgbmV3bHkgdG91Y2hpbmcgZmluZ2VyKSBhbmQgQUdNIGNvbnRhaW5zIFNHTSdzCisJCSAqIHByZXZpb3VzIHNsb3QuCisJCSAqCisJCSAqIE90aGVyd2lzZSwgU0dNIHN0aWxsIGNvbnRhaW5zIHNsb3QgMCBhbmQgQUdNIG5vdyBjb250YWlucworCQkgKiBzbG90IDEuCisJCSAqLworCQlpZiAob2xkLT5zZ20gPj0gMSkKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDIsIDAsIG9sZC0+c2dtKTsKKwkJZWxzZQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgMCwgMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyoKKwkJICogSWYgbXRfc3RhdGVfbG9zdCwgU0dNIG5vdyBjb250YWlucyBlaXRoZXIgZmluZ2VyIDEgb3IgMiwgYnV0CisJCSAqIHdlIGRvbid0IGtub3cgd2hpY2guCisJCSAqIFNvLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZSBTR00gY29udGFpbnMgc2xvdCAwIGFuZCBBR00gMS4KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0KQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgMCwgMSk7CisJCS8qCisJCSAqIE90aGVyd2lzZSwgdXNlIHRoZSBzYW1lIG10X3N0YXRlLCBzaW5jZSBpdCBlaXRoZXIgaGFzbid0CisJCSAqIGNoYW5nZWQsIG9yIHdhcyB1cGRhdGVkIGJ5IGEgcmVjZW50bHkgcmVjZWl2ZWQgQUdNLUNPTlRBQ1QKKwkJICogcGFja2V0LgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKgorCQkgKiAzLT4yIHRyYW5zaXRpb25zIGhhdmUgdHdvIHVuc29sdmFibGUgcHJvYmxlbXM6CisJCSAqICAxKSBubyBpbmRpY2F0aW9uIGlzIGdpdmVuIHdoaWNoIGZpbmdlciB3YXMgcmVtb3ZlZAorCQkgKiAgMikgbm8gd2F5IHRvIHRlbGwgaWYgYWdtIHBhY2tldCB3YXMgZm9yIGZpbmdlciAzCisJCSAqICAgICBiZWZvcmUgMy0+Miwgb3IgZmluZ2VyIDIgYWZ0ZXIgMy0+Mi4KKwkJICoKKwkJICogU28sIHJlcG9ydCAyIGZpbmdlcnMsIGJ1dCBlbXB0eSBhbGwgc2xvdHMuCisJCSAqIFdlIHdpbGwgZ3Vlc3Mgc2xvdHMgWzAsMV0gb24gc3Vic2VxdWVudCAyLT4yLgorCQkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMiwgLTEsIC0xKTsKKwkJcHJpdi0+bXRfc3RhdGVfbG9zdCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJCS8qIG10X3N0YXRlIHdhcyB1cGRhdGVkIGJ5IEFHTS1DT05UQUNUIHBhY2tldCAqLworCQlicmVhazsKKwl9Cit9CisKKy8qIEhhbmRsZSBjYXNlIHdoZXJlIG10X3N0YXRlLT5jb3VudCA9IDMgKi8KK3N0YXRpYyB2b2lkIHN5bmFwdGljc19pbWFnZV9zZW5zb3JfM2Yoc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm10X3N0YXRlKQoreworCXN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm9sZCA9ICZwcml2LT5tdF9zdGF0ZTsKKworCXN3aXRjaCAob2xkLT5jb3VudCkgeworCWNhc2UgMDoKKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgMik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyoKKwkJICogSWYgcHJldmlvdXMgU0dNIGNvbnRhaW5lZCBzbG90IDIgb3IgaGlnaGVyLCBTR00gbm93IGNvbnRhaW5zCisJCSAqIHNsb3QgMCAob25lIG9mIHRoZSBuZXdseSB0b3VjaGluZyBmaW5nZXJzKSBhbmQgQUdNIGNvbnRhaW5zCisJCSAqIFNHTSdzIHByZXZpb3VzIHNsb3QuCisJCSAqCisJCSAqIE90aGVyd2lzZSwgU0dNIG5vdyBjb250YWlucyBzbG90IDAgYW5kIEFHTSBjb250YWlucyBzbG90IDIuCisJCSAqLworCQlpZiAob2xkLT5zZ20gPj0gMikKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDMsIDAsIG9sZC0+c2dtKTsKKwkJZWxzZQorCQkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgMik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyoKKwkJICogSWYgdGhlIEFHTSBwcmV2aW91c2x5IGNvbnRhaW5lZCBzbG90IDMgb3IgaGlnaGVyLCB0aGVuIHRoZQorCQkgKiBuZXdseSB0b3VjaGluZyBmaW5nZXIgaXMgaW4gdGhlIGxvd2VzdCBhdmFpbGFibGUgc2xvdC4KKwkJICoKKwkJICogSWYgU0dNIHdhcyBwcmV2aW91c2x5IDEgb3IgaGlnaGVyLCB0aGVuIHRoZSBuZXcgU0dNIGlzCisJCSAqIG5vdyBzbG90IDAgKHdpdGggYSBuZXcgZmluZ2VyKSwgb3RoZXJ3aXNlLCB0aGUgbmV3IGZpbmdlcgorCQkgKiBpcyBub3cgaW4gYSBoaWRkZW4gc2xvdCBiZXR3ZWVuIDAgYW5kIEFHTSdzIHNsb3QuCisJCSAqCisJCSAqIEluIGFsbCBzdWNoIGNhc2VzLCB0aGUgU0dNIG5vdyBjb250YWlucyBzbG90IDAsIGFuZCB0aGUgQUdNCisJCSAqIGNvbnRpbnVlcyB0byBjb250YWluIHRoZSBzYW1lIHNsb3QgYXMgYmVmb3JlLgorCQkgKi8KKwkJaWYgKG9sZC0+YWdtID49IDMpIHsKKwkJCXN5bmFwdGljc19tdF9zdGF0ZV9zZXQobXRfc3RhdGUsIDMsIDAsIG9sZC0+YWdtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQWZ0ZXIgc29tZSAzLT4xIGFuZCBhbGwgMy0+MiB0cmFuc2l0aW9ucywgd2UgbG9zZSB0cmFjaworCQkgKiBvZiB3aGljaCBzbG90IGlzIHJlcG9ydGVkIGJ5IFNHTSBhbmQgQUdNLgorCQkgKgorCQkgKiBGb3IgMi0+MyBpbiB0aGlzIHN0YXRlLCByZXBvcnQgMyBmaW5nZXJzLCBidXQgZW1wdHkgYWxsCisJCSAqIHNsb3RzLCBhbmQgd2Ugd2lsbCBndWVzcyAoMCwyKSBvbiBhIHN1YnNlcXVlbnQgMC0+My4KKwkJICoKKwkJICogVG8gdXNlcnNwYWNlLCB0aGUgcmVzdWx0aW5nIHRyYW5zaXRpb24gd2lsbCBsb29rIGxpa2U6CisJCSAqICAgIDI6WzAsMV0gLT4gMzpbLTEsLTFdIC0+IDM6WzAsMl0KKwkJICovCisJCWlmIChwcml2LT5tdF9zdGF0ZV9sb3N0KSB7CisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAzLCAtMSwgLTEpOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgKFNHTSxBR00pIHJlYWxseSBwcmV2aW91c2x5IGNvbnRhaW5lZCBzbG90cyAoMCwgMSksCisJCSAqIHRoZW4gd2UgY2Fubm90IGtub3cgd2hhdCBzbG90IHdhcyBqdXN0IHJlcG9ydGVkIGJ5IHRoZSBBR00sCisJCSAqIGJlY2F1c2UgdGhlIDItPjMgdHJhbnNpdGlvbiBjYW4gb2NjdXIgZWl0aGVyIGJlZm9yZSBvciBhZnRlcgorCQkgKiB0aGUgQUdNIHBhY2tldC4gVGh1cywgdGhpcyBtb3N0IHJlY2VudCBBR00gY291bGQgY29udGFpbgorCQkgKiBlaXRoZXIgdGhlIHNhbWUgb2xkIHNsb3QgMSBvciB0aGUgbmV3IHNsb3QgMi4KKwkJICogU3Vic2VxdWVudCBBR01zIHdpbGwgYmUgcmVwb3J0aW5nIHNsb3QgMi4KKwkJICoKKwkJICogVG8gdXNlcnNwYWNlLCB0aGUgcmVzdWx0aW5nIHRyYW5zaXRpb24gd2lsbCBsb29rIGxpa2U6CisJCSAqICAgIDI6WzAsMV0gLT4gMzpbMCwtMV0gLT4gMzpbMCwyXQorCQkgKi8KKwkJc3luYXB0aWNzX210X3N0YXRlX3NldChtdF9zdGF0ZSwgMywgMCwgLTEpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qCisJCSAqIElmLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgcHJldmlvdXMgYWdtIHdhcyBpbnZhbGlkLAorCQkgKiBBc3N1bWUgU0dNIG5vdyBjb250YWlucyBzbG90IDAsIEFHTSBub3cgY29udGFpbnMgc2xvdCAyLgorCQkgKi8KKwkJaWYgKG9sZC0+YWdtIDw9IDIpCisJCQlzeW5hcHRpY3NfbXRfc3RhdGVfc2V0KG10X3N0YXRlLCAzLCAwLCAyKTsKKwkJLyoKKwkJICogbXRfc3RhdGUgZWl0aGVyIGhhc24ndCBjaGFuZ2VkLCBvciB3YXMgdXBkYXRlZCBieSBhIHJlY2VudGx5CisJCSAqIHJlY2VpdmVkIEFHTS1DT05UQUNUIHBhY2tldC4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSA0OgorCWNhc2UgNToKKwkJLyogbXRfc3RhdGUgd2FzIHVwZGF0ZWQgYnkgQUdNLUNPTlRBQ1QgcGFja2V0ICovCisJCWJyZWFrOworCX0KK30KKworLyogSGFuZGxlIGNhc2Ugd2hlcmUgbXRfc3RhdGUtPmNvdW50ID0gNCwgb3IgPSA1ICovCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzQ1ZihzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBzeW5hcHRpY3NfbXRfc3RhdGUgKm10X3N0YXRlKQoreworCS8qIG10X3N0YXRlIHdhcyB1cGRhdGVkIGNvcnJlY3RseSBieSBBR00tQ09OVEFDVCBwYWNrZXQgKi8KKwlwcml2LT5tdF9zdGF0ZV9sb3N0ID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19pbWFnZV9zZW5zb3JfcHJvY2VzcyhzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCQkJICAgc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqc2dtKQoreworCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqYWdtID0gJnByaXYtPmFnbTsKKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOworCisJLyogSW5pdGlhbGl6ZSB1c2luZyBjdXJyZW50IG10X3N0YXRlIChhcyB1cGRhdGVkIGJ5IGxhc3QgYWdtKSAqLworCW10X3N0YXRlID0gYWdtLT5tdF9zdGF0ZTsKKworCS8qCisJICogVXBkYXRlIG10X3N0YXRlIHVzaW5nIHRoZSBuZXcgZmluZ2VyIGNvdW50IGFuZCBjdXJyZW50IG10X3N0YXRlLgorCSAqLworCWlmIChzZ20tPnogPT0gMCkKKwkJc3luYXB0aWNzX2ltYWdlX3NlbnNvcl8wZihwcml2LCAmbXRfc3RhdGUpOworCWVsc2UgaWYgKHNnbS0+dyA+PSA0KQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzFmKHByaXYsICZtdF9zdGF0ZSk7CisJZWxzZSBpZiAoc2dtLT53ID09IDApCisJCXN5bmFwdGljc19pbWFnZV9zZW5zb3JfMmYocHJpdiwgJm10X3N0YXRlKTsKKwllbHNlIGlmIChzZ20tPncgPT0gMSAmJiBtdF9zdGF0ZS5jb3VudCA8PSAzKQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzNmKHByaXYsICZtdF9zdGF0ZSk7CisJZWxzZQorCQlzeW5hcHRpY3NfaW1hZ2Vfc2Vuc29yXzQ1Zihwcml2LCAmbXRfc3RhdGUpOworCisJLyogU2VuZCByZXN1bHRpbmcgaW5wdXQgZXZlbnRzIHRvIHVzZXIgc3BhY2UgKi8KKwlzeW5hcHRpY3NfcmVwb3J0X210X2RhdGEocHNtb3VzZSwgJm10X3N0YXRlLCBzZ20pOworCisJLyogU3RvcmUgdXBkYXRlZCBtdF9zdGF0ZSAqLworCXByaXYtPm10X3N0YXRlID0gYWdtLT5tdF9zdGF0ZSA9IG10X3N0YXRlOworCXByaXYtPmFnbV9wZW5kaW5nID0gZmFsc2U7Cit9CisKIC8qCiAgKiAgY2FsbGVkIGZvciBlYWNoIGZ1bGwgcmVjZWl2ZWQgcGFja2V0IGZyb20gdGhlIHRvdWNocGFkCiAgKi8KQEAgLTUzNiwxMSArOTY4LDE1IEBACiAJc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSBodzsKIAlpbnQgbnVtX2ZpbmdlcnM7CiAJaW50IGZpbmdlcl93aWR0aDsKLQlpbnQgaTsKIAogCWlmIChzeW5hcHRpY3NfcGFyc2VfaHdfc3RhdGUocHNtb3VzZS0+cGFja2V0LCBwcml2LCAmaHcpKQogCQlyZXR1cm47CiAKKwlpZiAoU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwkJc3luYXB0aWNzX2ltYWdlX3NlbnNvcl9wcm9jZXNzKHBzbW91c2UsICZodyk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoaHcuc2Nyb2xsKSB7CiAJCXByaXYtPnNjcm9sbCArPSBody5zY3JvbGw7CiAKQEAgLTU4Niw3ICsxMDIyLDggQEAKIAl9CiAKIAlpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkKLQkJc3luYXB0aWNzX3JlcG9ydF9zZW1pX210X2RhdGEoZGV2LCAmaHcsICZwcml2LT5tdCwgbnVtX2ZpbmdlcnMpOworCQlzeW5hcHRpY3NfcmVwb3J0X3NlbWlfbXRfZGF0YShkZXYsICZodywgJnByaXYtPmFnbSwKKwkJCQkJICAgICAgbnVtX2ZpbmdlcnMpOwogCiAJLyogUG9zdCBldmVudHMKIAkgKiBCVE5fVE9VQ0ggaGFzIHRvIGJlIGZpcnN0IGFzIG1vdXNlZGV2IHJlbGllcyBvbiBpdCB3aGVuIGRvaW5nCkBAIC01OTcsNyArMTAzNCw3IEBACiAKIAlpZiAobnVtX2ZpbmdlcnMgPiAwKSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgaHcueCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgWU1BWF9OT01JTkFMICsgWU1JTl9OT01JTkFMIC0gaHcueSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgc3luYXB0aWNzX2ludmVydF95KGh3LnkpKTsKIAl9CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgaHcueik7CiAKQEAgLTYwNSwzNSArMTA0MiwyNSBAQAogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RPT0xfV0lEVEgsIGZpbmdlcl93aWR0aCk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBudW1fZmluZ2VycyA9PSAxKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGh3LmxlZnQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGh3LnJpZ2h0KTsKLQogCWlmIChTWU5fQ0FQX01VTFRJRklOR0VSKHByaXYtPmNhcGFiaWxpdGllcykpIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX0RPVUJMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMik7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9UUklQTEVUQVAsIG51bV9maW5nZXJzID09IDMpOwogCX0KIAotCWlmIChTWU5fQ0FQX01JRERMRV9CVVRUT04ocHJpdi0+Y2FwYWJpbGl0aWVzKSkKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGh3Lm1pZGRsZSk7Ci0KLQlpZiAoU1lOX0NBUF9GT1VSX0JVVFRPTihwcml2LT5jYXBhYmlsaXRpZXMpKSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRk9SV0FSRCwgaHcudXApOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGh3LmRvd24pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBTWU5fQ0FQX01VTFRJX0JVVFRPTl9OTyhwcml2LT5leHRfY2FwKTsgaSsrKQotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzAgKyBpLCBody5leHRfYnV0dG9ucyAmICgxIDw8IGkpKTsKKwlzeW5hcHRpY3NfcmVwb3J0X2J1dHRvbnMocHNtb3VzZSwgJmh3KTsKIAogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotc3RhdGljIGludCBzeW5hcHRpY3NfdmFsaWRhdGVfYnl0ZSh1bnNpZ25lZCBjaGFyIHBhY2tldFtdLCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyIHBrdF90eXBlKQorc3RhdGljIGludCBzeW5hcHRpY3NfdmFsaWRhdGVfYnl0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCQkgICBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyIHBrdF90eXBlKQogewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ld2Fic19tYXNrW10JPSB7IDB4QzgsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAgfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuZXdhYnNfcmVsX21hc2tbXQk9IHsgMHhDMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHgwMCB9OwogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ld2Fic19yc2x0W10JPSB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MDAgfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvbGRhYnNfbWFza1tdCT0geyAweEMwLCAweDYwLCAweDAwLCAweEMwLCAweDYwIH07CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb2xkYWJzX3JzbHRbXQk9IHsgMHhDMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCB9OworCWNvbnN0IGNoYXIgKnBhY2tldCA9IHBzbW91c2UtPnBhY2tldDsKIAogCWlmIChpZHggPCAwIHx8IGlkeCA+IDQpCiAJCXJldHVybiAwOwpAQCAtNjUxLDcgKzEwNzgsNyBAQAogCQlyZXR1cm4gKHBhY2tldFtpZHhdICYgb2xkYWJzX21hc2tbaWR4XSkgPT0gb2xkYWJzX3JzbHRbaWR4XTsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAic3luYXB0aWNzOiB1bmtub3duIHBhY2tldCB0eXBlICVkXG4iLCBwa3RfdHlwZSk7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJ1bmtub3duIHBhY2tldCB0eXBlICVkXG4iLCBwa3RfdHlwZSk7CiAJCXJldHVybiAwOwogCX0KIH0KQEAgLTY2MSw4ICsxMDg4LDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCWlmICghc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZS0+cGFja2V0LCBpLCBTWU5fTkVXQUJTX1NUUklDVCkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInN5bmFwdGljczogdXNpbmcgcmVsYXhlZCBwYWNrZXQgdmFsaWRhdGlvblxuIik7CisJCWlmICghc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZSwgaSwgU1lOX05FV0FCU19TVFJJQ1QpKSB7CisJCQlwc21vdXNlX2luZm8ocHNtb3VzZSwgInVzaW5nIHJlbGF4ZWQgcGFja2V0IHZhbGlkYXRpb25cbiIpOwogCQkJcmV0dXJuIFNZTl9ORVdBQlNfUkVMQVhFRDsKIAkJfQogCkBAIC02ODcsNDYgKzExMTQsNTYgQEAKIAkJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CiAJfQogCi0JcmV0dXJuIHN5bmFwdGljc192YWxpZGF0ZV9ieXRlKHBzbW91c2UtPnBhY2tldCwgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHJpdi0+cGt0X3R5cGUpID8KKwlyZXR1cm4gc3luYXB0aWNzX3ZhbGlkYXRlX2J5dGUocHNtb3VzZSwgcHNtb3VzZS0+cGt0Y250IC0gMSwgcHJpdi0+cGt0X3R5cGUpID8KIAkJUFNNT1VTRV9HT09EX0RBVEEgOiBQU01PVVNFX0JBRF9EQVRBOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCURyaXZlciBpbml0aWFsaXphdGlvbi9jbGVhbnVwIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCisJCQkJICAgIHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwgaW50IHhfY29kZSwKKwkJCQkgICAgaW50IHlfY29kZSkKK3sKKwlpbnQgeF9taW4gPSBwcml2LT54X21pbiA/OiBYTUlOX05PTUlOQUw7CisJaW50IHhfbWF4ID0gcHJpdi0+eF9tYXggPzogWE1BWF9OT01JTkFMOworCWludCB5X21pbiA9IHByaXYtPnlfbWluID86IFlNSU5fTk9NSU5BTDsKKwlpbnQgeV9tYXggPSBwcml2LT55X21heCA/OiBZTUFYX05PTUlOQUw7CisJaW50IGZ1enogPSBTWU5fQ0FQX1JFRFVDRURfRklMVEVSSU5HKHByaXYtPmV4dF9jYXBfMGMpID8KKwkJCVNZTl9SRURVQ0VEX0ZJTFRFUl9GVVpaIDogMDsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgeF9jb2RlLCB4X21pbiwgeF9tYXgsIGZ1enosIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgeV9jb2RlLCB5X21pbiwgeV9tYXgsIGZ1enosIDApOworCWlucHV0X2Fic19zZXRfcmVzKGRldiwgeF9jb2RlLCBwcml2LT54X3Jlcyk7CisJaW5wdXRfYWJzX3NldF9yZXMoZGV2LCB5X2NvZGUsIHByaXYtPnlfcmVzKTsKK30KKwogc3RhdGljIHZvaWQgc2V0X2lucHV0X3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdikKIHsKIAlpbnQgaTsKLQlpbnQgZnV6eiA9IFNZTl9DQVBfUkVEVUNFRF9GSUxURVJJTkcocHJpdi0+ZXh0X2NhcF8wYykgPwotCQkJU1lOX1JFRFVDRURfRklMVEVSX0ZVWlogOiAwOwogCiAJX19zZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgZGV2LT5wcm9wYml0KTsKIAogCV9fc2V0X2JpdChFVl9BQlMsIGRldi0+ZXZiaXQpOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1gsCi0JCQkgICAgIHByaXYtPnhfbWluID86IFhNSU5fTk9NSU5BTCwKLQkJCSAgICAgcHJpdi0+eF9tYXggPzogWE1BWF9OT01JTkFMLAotCQkJICAgICBmdXp6LCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLAotCQkJICAgICBwcml2LT55X21pbiA/OiBZTUlOX05PTUlOQUwsCi0JCQkgICAgIHByaXYtPnlfbWF4ID86IFlNQVhfTk9NSU5BTCwKLQkJCSAgICAgZnV6eiwgMCk7CisJc2V0X2Fic19wb3NpdGlvbl9wYXJhbXMoZGV2LCBwcml2LCBBQlNfWCwgQUJTX1kpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1BSRVNTVVJFLCAwLCAyNTUsIDAsIDApOwogCi0JaWYgKFNZTl9DQVBfQURWX0dFU1RVUkUocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwlpZiAoU1lOX0NBUF9JTUFHRV9TRU5TT1IocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhkZXYsIDIpOworCQlzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhkZXYsIHByaXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQlBQlNfTVRfUE9TSVRJT05fWSk7CisJCS8qIEltYWdlIHNlbnNvcnMgY2FuIHJlcG9ydCBwZXItY29udGFjdCBwcmVzc3VyZSAqLworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19NVF9QUkVTU1VSRSwgMCwgMjU1LCAwLCAwKTsKKworCQkvKiBJbWFnZSBzZW5zb3JzIGNhbiBzaWduYWwgNCBhbmQgNSBmaW5nZXIgY2xpY2tzICovCisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUlOVFRBUCwgZGV2LT5rZXliaXQpOworCX0gZWxzZSBpZiAoU1lOX0NBUF9BRFZfR0VTVFVSRShwcml2LT5leHRfY2FwXzBjKSkgeworCQkvKiBOb24taW1hZ2Ugc2Vuc29ycyB3aXRoIEFHTSB1c2Ugc2VtaS1tdCAqLwogCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9TRU1JX01ULCBkZXYtPnByb3BiaXQpOwogCQlpbnB1dF9tdF9pbml0X3Nsb3RzKGRldiwgMik7Ci0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsCi0JCQkJICAgICBwcml2LT54X21pbiA/OiBYTUlOX05PTUlOQUwsCi0JCQkJICAgICBwcml2LT54X21heCA/OiBYTUFYX05PTUlOQUwsCi0JCQkJICAgICBmdXp6LCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKLQkJCQkgICAgIHByaXYtPnlfbWluID86IFlNSU5fTk9NSU5BTCwKLQkJCQkgICAgIHByaXYtPnlfbWF4ID86IFlNQVhfTk9NSU5BTCwKLQkJCQkgICAgIGZ1enosIDApOwotCi0JCWlucHV0X2Fic19zZXRfcmVzKGRldiwgQUJTX01UX1BPU0lUSU9OX1gsIHByaXYtPnhfcmVzKTsKLQkJaW5wdXRfYWJzX3NldF9yZXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgcHJpdi0+eV9yZXMpOworCQlzZXRfYWJzX3Bvc2l0aW9uX3BhcmFtcyhkZXYsIHByaXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQlBQlNfTVRfUE9TSVRJT05fWSk7CiAJfQogCiAJaWYgKFNZTl9DQVBfUEFMTURFVEVDVChwcml2LT5jYXBhYmlsaXRpZXMpKQpAQCAtNzU5LDkgKzExOTYsNiBAQAogCV9fY2xlYXJfYml0KFJFTF9YLCBkZXYtPnJlbGJpdCk7CiAJX19jbGVhcl9iaXQoUkVMX1ksIGRldi0+cmVsYml0KTsKIAotCWlucHV0X2Fic19zZXRfcmVzKGRldiwgQUJTX1gsIHByaXYtPnhfcmVzKTsKLQlpbnB1dF9hYnNfc2V0X3JlcyhkZXYsIEFCU19ZLCBwcml2LT55X3Jlcyk7Ci0KIAlpZiAoU1lOX0NBUF9DTElDS1BBRChwcml2LT5leHRfY2FwXzBjKSkgewogCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9CVVRUT05QQUQsIGRldi0+cHJvcGJpdCk7CiAJCS8qIENsaWNrcGFkcyByZXBvcnQgb25seSBsZWZ0IGJ1dHRvbiAqLwpAQCAtNzkzLDIxICsxMjI3LDIxIEBACiAJCXJldHVybiAtMTsKIAogCWlmIChyZXRyeSA+IDEpCi0JCXByaW50ayhLRVJOX0RFQlVHICJTeW5hcHRpY3MgcmVjb25uZWN0ZWQgYWZ0ZXIgJWQgdHJpZXNcbiIsCi0JCQlyZXRyeSk7CisJCXBzbW91c2VfZGJnKHBzbW91c2UsICJyZWNvbm5lY3RlZCBhZnRlciAlZCB0cmllc1xuIiwgcmV0cnkpOwogCiAJaWYgKHN5bmFwdGljc19xdWVyeV9oYXJkd2FyZShwc21vdXNlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBxdWVyeSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBxdWVyeSBkZXZpY2UuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChzeW5hcHRpY3Nfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHN5bmFwdGljc19zZXRfYWR2YW5jZWRfZ2VzdHVyZV9tb2RlKHBzbW91c2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQWR2YW5jZWQgZ2VzdHVyZSBtb2RlIHJlY29ubmVjdCBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiQWR2YW5jZWQgZ2VzdHVyZSBtb2RlIHJlY29ubmVjdCBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtODE1LDEyICsxMjQ5LDEyIEBACiAJICAgIG9sZF9wcml2Lm1vZGVsX2lkICE9IHByaXYtPm1vZGVsX2lkIHx8CiAJICAgIG9sZF9wcml2LmNhcGFiaWxpdGllcyAhPSBwcml2LT5jYXBhYmlsaXRpZXMgfHwKIAkgICAgb2xkX3ByaXYuZXh0X2NhcCAhPSBwcml2LT5leHRfY2FwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3luYXB0aWNzIGhhcmR3YXJlIGFwcGVhcnMgdG8gYmUgZGlmZmVyZW50OiAiCi0JCQkiaWQoJWxkLSVsZCksIG1vZGVsKCVsZC0lbGQpLCBjYXBzKCVseC0lbHgpLCBleHQoJWx4LSVseCkuXG4iLAotCQkJb2xkX3ByaXYuaWRlbnRpdHksIHByaXYtPmlkZW50aXR5LAotCQkJb2xkX3ByaXYubW9kZWxfaWQsIHByaXYtPm1vZGVsX2lkLAotCQkJb2xkX3ByaXYuY2FwYWJpbGl0aWVzLCBwcml2LT5jYXBhYmlsaXRpZXMsCi0JCQlvbGRfcHJpdi5leHRfY2FwLCBwcml2LT5leHRfY2FwKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwKKwkJCSAgICAiaGFyZHdhcmUgYXBwZWFycyB0byBiZSBkaWZmZXJlbnQ6IGlkKCVsZC0lbGQpLCBtb2RlbCglbGQtJWxkKSwgY2FwcyglbHgtJWx4KSwgZXh0KCVseC0lbHgpLlxuIiwKKwkJCSAgICBvbGRfcHJpdi5pZGVudGl0eSwgcHJpdi0+aWRlbnRpdHksCisJCQkgICAgb2xkX3ByaXYubW9kZWxfaWQsIHByaXYtPm1vZGVsX2lkLAorCQkJICAgIG9sZF9wcml2LmNhcGFiaWxpdGllcywgcHJpdi0+Y2FwYWJpbGl0aWVzLAorCQkJICAgIG9sZF9wcml2LmV4dF9jYXAsIHByaXYtPmV4dF9jYXApOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05MDEsNyArMTMzNSw4IEBACiAJICoganVzdCBmaW5lLgogCSAqLwogCWlmIChicm9rZW5fb2xwY19lYykgewotCQlwcmludGsoS0VSTl9JTkZPICJzeW5hcHRpY3M6IE9MUEMgWE8gZGV0ZWN0ZWQsIG5vdCBlbmFibGluZyBTeW5hcHRpY3MgcHJvdG9jb2wuXG4iKTsKKwkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkgICAgICJPTFBDIFhPIGRldGVjdGVkLCBub3QgZW5hYmxpbmcgU3luYXB0aWNzIHByb3RvY29sLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtOTEyLDI2ICsxMzQ3LDI4IEBACiAJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKIAogCWlmIChzeW5hcHRpY3NfcXVlcnlfaGFyZHdhcmUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcXVlcnkgU3luYXB0aWNzIGhhcmR3YXJlLlxuIik7CisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJVbmFibGUgdG8gcXVlcnkgZGV2aWNlLlxuIik7CiAJCWdvdG8gaW5pdF9mYWlsOwogCX0KIAogCWlmIChzeW5hcHRpY3Nfc2V0X2Fic29sdXRlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTeW5hcHRpY3MgaGFyZHdhcmUuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlpZiAoc3luYXB0aWNzX3NldF9hZHZhbmNlZF9nZXN0dXJlX21vZGUocHNtb3VzZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJBZHZhbmNlZCBnZXN0dXJlIG1vZGUgaW5pdCBmYWlsZWQuXG4iKTsKKwkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIkFkdmFuY2VkIGdlc3R1cmUgbW9kZSBpbml0IGZhaWxlZC5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKIAlwcml2LT5wa3RfdHlwZSA9IFNZTl9NT0RFTF9ORVdBQlMocHJpdi0+bW9kZWxfaWQpID8gU1lOX05FV0FCUyA6IFNZTl9PTERBQlM7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTeW5hcHRpY3MgVG91Y2hwYWQsIG1vZGVsOiAlbGQsIGZ3OiAlbGQuJWxkLCBpZDogJSNseCwgY2FwczogJSNseC8lI2x4LyUjbHhcbiIsCi0JCVNZTl9JRF9NT0RFTChwcml2LT5pZGVudGl0eSksCi0JCVNZTl9JRF9NQUpPUihwcml2LT5pZGVudGl0eSksIFNZTl9JRF9NSU5PUihwcml2LT5pZGVudGl0eSksCi0JCXByaXYtPm1vZGVsX2lkLCBwcml2LT5jYXBhYmlsaXRpZXMsIHByaXYtPmV4dF9jYXAsIHByaXYtPmV4dF9jYXBfMGMpOworCXBzbW91c2VfaW5mbyhwc21vdXNlLAorCQkgICAgICJUb3VjaHBhZCBtb2RlbDogJWxkLCBmdzogJWxkLiVsZCwgaWQ6ICUjbHgsIGNhcHM6ICUjbHgvJSNseC8lI2x4XG4iLAorCQkgICAgIFNZTl9JRF9NT0RFTChwcml2LT5pZGVudGl0eSksCisJCSAgICAgU1lOX0lEX01BSk9SKHByaXYtPmlkZW50aXR5KSwgU1lOX0lEX01JTk9SKHByaXYtPmlkZW50aXR5KSwKKwkJICAgICBwcml2LT5tb2RlbF9pZCwKKwkJICAgICBwcml2LT5jYXBhYmlsaXRpZXMsIHByaXYtPmV4dF9jYXAsIHByaXYtPmV4dF9jYXBfMGMpOwogCiAJc2V0X2lucHV0X3BhcmFtcyhwc21vdXNlLT5kZXYsIHByaXYpOwogCkBAIC05NjMsOCArMTQwMCw5IEBACiAJICogdGhlIHNhbWUgcmF0ZSBhcyBhIHN0YW5kYXJkIFBTLzIgbW91c2UpLgogCSAqLwogCWlmIChwc21vdXNlLT5yYXRlID49IDgwICYmIGltcGFpcmVkX3Rvc2hpYmFfa2JjKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInN5bmFwdGljczogVG9zaGliYSAlcyBkZXRlY3RlZCwgbGltaXRpbmcgcmF0ZSB0byA0MHBwcy5cbiIsCi0JCQlkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpKTsKKwkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkgICAgICJUb3NoaWJhICVzIGRldGVjdGVkLCBsaW1pdGluZyByYXRlIHRvIDQwcHBzLlxuIiwKKwkJCSAgICAgZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKSk7CiAJCXBzbW91c2UtPnJhdGUgPSA0MDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCmluZGV4IGNhMDQwYWEuLjYyMmFlYThkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCkBAIC03NCw2ICs3NCw4IEBACiAgKiAyCTB4MDQJcmVkdWNlZCBmaWx0ZXJpbmcJZmlybXdhcmUgZG9lcyBsZXNzIGZpbHRlcmluZyBvbgogICoJCQkJCXBvc2l0aW9uIGRhdGEsIGRyaXZlciBzaG91bGQgd2F0Y2gKICAqCQkJCQlmb3Igbm9pc2UuCisgKiAyCTB4MDgJaW1hZ2Ugc2Vuc29yCQlpbWFnZSBzZW5zb3IgdHJhY2tzIDUgZmluZ2VycywgYnV0IG9ubHkKKyAqCQkJCQlyZXBvcnRzIDIuCiAgKiAyCTB4MjAJcmVwb3J0IG1pbgkJcXVlcnkgMHgwZiBnaXZlcyBtaW4gY29vcmQgcmVwb3J0ZWQKICAqLwogI2RlZmluZSBTWU5fQ0FQX0NMSUNLUEFEKGV4MGMpCQkoKGV4MGMpICYgMHgxMDAwMDApIC8qIDEtYnV0dG9uIENsaWNrUGFkICovCkBAIC04Miw2ICs4NCw3IEBACiAjZGVmaW5lIFNZTl9DQVBfTUlOX0RJTUVOU0lPTlMoZXgwYykJKChleDBjKSAmIDB4MDAyMDAwKQogI2RlZmluZSBTWU5fQ0FQX0FEVl9HRVNUVVJFKGV4MGMpCSgoZXgwYykgJiAweDA4MDAwMCkKICNkZWZpbmUgU1lOX0NBUF9SRURVQ0VEX0ZJTFRFUklORyhleDBjKQkoKGV4MGMpICYgMHgwMDA0MDApCisjZGVmaW5lIFNZTl9DQVBfSU1BR0VfU0VOU09SKGV4MGMpCSgoZXgwYykgJiAweDAwMDgwMCkKIAogLyogc3luYXB0aWNzIG1vZGVzIHF1ZXJ5IGJpdHMgKi8KICNkZWZpbmUgU1lOX01PREVfQUJTT0xVVEUobSkJCSgobSkgJiAoMSA8PCA3KSkKQEAgLTExMiw5ICsxMTUsMTggQEAKICNkZWZpbmUgU1lOX1JFRFVDRURfRklMVEVSX0ZVWloJCTgKIAogLyoKKyAqIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHdoaWNoIGludGVybmFsIHRvdWNocGFkIGZpbmdlciBzbG90cyBhcmUgYmVpbmcKKyAqIHJlcG9ydGVkIGluIHJhdyBwYWNrZXRzLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIHsKKwlpbnQgY291bnQ7CQkJLyogbnVtIGZpbmdlcnMgYmVpbmcgdHJhY2tlZCAqLworCWludCBzZ207CQkJLyogd2hpY2ggc2xvdCBpcyByZXBvcnRlZCBieSBzZ20gcGt0ICovCisJaW50IGFnbTsJCQkvKiB3aGljaCBzbG90IGlzIHJlcG9ydGVkIGJ5IGFnbSBwa3QqLworfTsKKworLyoKICAqIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiB0aGUgdG91Y2hwYWQgaGFyZHdhcmUgKGJ1dHRvbnMgYW5kIHBhZCkKICAqLwotCiBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlIHsKIAlpbnQgeDsKIAlpbnQgeTsKQEAgLTEyNyw2ICsxMzksOSBAQAogCXVuc2lnbmVkIGludCBkb3duOjE7CiAJdW5zaWduZWQgY2hhciBleHRfYnV0dG9uczsKIAlzaWduZWQgY2hhciBzY3JvbGw7CisKKwkvKiBBcyByZXBvcnRlZCBpbiBsYXN0IEFHTS1DT05UQUNUIHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOwogfTsKIAogc3RydWN0IHN5bmFwdGljc19kYXRhIHsKQEAgLTE0Niw3ICsxNjEsMTUgQEAKIAogCXN0cnVjdCBzZXJpbyAqcHRfcG9ydDsJCQkvKiBQYXNzLXRocm91Z2ggc2VyaW8gcG9ydCAqLwogCi0Jc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSBtdDsJCS8qIGN1cnJlbnQgZ2VzdHVyZSBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX210X3N0YXRlIG10X3N0YXRlOwkvKiBDdXJyZW50IG10IGZpbmdlciBzdGF0ZSAqLworCWJvb2wgbXRfc3RhdGVfbG9zdDsJCQkvKiBtdF9zdGF0ZSBtYXkgYmUgaW5jb3JyZWN0ICovCisKKwkvKgorCSAqIExhc3QgcmVjZWl2ZWQgQWR2YW5jZWQgR2VzdHVyZSBNb2RlIChBR00pIHBhY2tldC4gQW4gQUdNIHBhY2tldAorCSAqIGNvbnRhaW5zIHBvc2l0aW9uIGRhdGEgZm9yIGEgc2Vjb25kIGNvbnRhY3QsIGF0IGhhbGYgcmVzb2x1dGlvbi4KKwkgKi8KKwlzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlIGFnbTsKKwlib29sIGFnbV9wZW5kaW5nOwkJCS8qIG5ldyBBR00gcGFja2V0IHJlY2VpdmVkICovCiB9OwogCiB2b2lkIHN5bmFwdGljc19tb2R1bGVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzX2kyYy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKaW5kZXggY2JhM2M4NC4uNGI3NTVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3NfaTJjLmMKQEAgLTU3MCw3ICs1NzAsNyBAQAogCQkJICJSZXF1ZXN0aW5nIElSUTogJWRcbiIsIHRvdWNoLT5jbGllbnQtPmlycSk7CiAKIAkJcmV0ID0gcmVxdWVzdF9pcnEodG91Y2gtPmNsaWVudC0+aXJxLCBzeW5hcHRpY3NfaTJjX2lycSwKLQkJCQkgIElSUUZfRElTQUJMRUR8SVJRX1RZUEVfRURHRV9GQUxMSU5HLAorCQkJCSAgSVJRX1RZUEVfRURHRV9GQUxMSU5HLAogCQkJCSAgRFJJVkVSX05BTUUsIHRvdWNoKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X3dhcm4oJnRvdWNoLT5jbGllbnQtPmRldiwKQEAgLTYxOSw3ICs2MTksNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHN5bmFwdGljc19pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCmluZGV4IGI3YmE0NTkuLjRkNGNkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYwpAQCAtOSw2ICs5LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CkBAIC0zMywxNSArMzQsMTYgQEAKIAl1bnNpZ25lZCBpbnQgdGFpbCwgaGVhZDsKIAogCWNoYXIgbmFtZVsxNl07Ci0JdW5zaWduZWQgaW50IHJlZmNudDsKKwlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBzZXJpbyAqc2VyaW87CiAJc3RydWN0IG1pc2NkZXZpY2UgZGV2OwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCWJvb2wgZGVhZDsKIH07CiAKLXN0cnVjdCBzZXJpb19yYXdfbGlzdCB7CitzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCB7CiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwpAQCAtNDksNyArNTEsNiBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKHNlcmlvX3Jhd19tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKHNlcmlvX3Jhd19saXN0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaW9fcmF3X25vOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBJbnRlcmZhY2Ugd2l0aCB1c2Vyc3BhY2UgKGZpbGUgb3BlcmF0aW9ucykgICAgICAgICAgICAqCkBAIC01Nyw5ICs1OCw5IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fcmF3X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZsaXN0LT5mYXN5bmMpOworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmNsaWVudC0+ZmFzeW5jKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3Jhd19sb2NhdGUoaW50IG1pbm9yKQpAQCAtNzcsOCArNzgsOCBAQAogc3RhdGljIGludCBzZXJpb19yYXdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0OwotCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQ7CisJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VyaW9fcmF3X211dGV4KTsKIAlpZiAocmV0dmFsKQpAQCAtOTAsNjAgKzkxLDYxIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICghc2VyaW9fcmF3LT5zZXJpbykgeworCWlmIChzZXJpb19yYXctPmRlYWQpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQogCi0JbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXdfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghbGlzdCkgeworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXdfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnQpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JbGlzdC0+c2VyaW9fcmF3ID0gc2VyaW9fcmF3OwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGxpc3Q7CisJY2xpZW50LT5zZXJpb19yYXcgPSBzZXJpb19yYXc7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2xpZW50OwogCi0Jc2VyaW9fcmF3LT5yZWZjbnQrKzsKLQlsaXN0X2FkZF90YWlsKCZsaXN0LT5ub2RlLCAmc2VyaW9fcmF3LT5saXN0KTsKKwlrcmVmX2dldCgmc2VyaW9fcmF3LT5rcmVmKTsKKworCXNlcmlvX3BhdXNlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOworCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bm9kZSwgJnNlcmlvX3Jhdy0+Y2xpZW50X2xpc3QpOworCXNlcmlvX2NvbnRpbnVlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgc2VyaW9fcmF3X2NsZWFudXAoc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3KQorc3RhdGljIHZvaWQgc2VyaW9fcmF3X2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0JaWYgKC0tc2VyaW9fcmF3LT5yZWZjbnQgPT0gMCkgewotCQltaXNjX2RlcmVnaXN0ZXIoJnNlcmlvX3Jhdy0+ZGV2KTsKLQkJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKLQkJa2ZyZWUoc2VyaW9fcmF3KTsKKwlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPQorCQkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzZXJpb19yYXcsIGtyZWYpOwogCi0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOworCXB1dF9kZXZpY2UoJnNlcmlvX3Jhdy0+c2VyaW8tPmRldik7CisJa2ZyZWUoc2VyaW9fcmF3KTsKIH0KIAogc3RhdGljIGludCBzZXJpb19yYXdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gbGlzdC0+c2VyaW9fcmF3OworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gY2xpZW50LT5zZXJpb19yYXc7CiAKLQltdXRleF9sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCXNlcmlvX3BhdXNlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOworCWxpc3RfZGVsKCZjbGllbnQtPm5vZGUpOworCXNlcmlvX2NvbnRpbnVlX3J4KHNlcmlvX3Jhdy0+c2VyaW8pOwogCi0Jc2VyaW9fcmF3X2NsZWFudXAoc2VyaW9fcmF3KTsKKwlrZnJlZShjbGllbnQpOwogCi0JbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCWtyZWZfcHV0KCZzZXJpb19yYXctPmtyZWYsIHNlcmlvX3Jhd19mcmVlKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNlcmlvX3Jhd19mZXRjaF9ieXRlKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdywgY2hhciAqYykKK3N0YXRpYyBib29sIHNlcmlvX3Jhd19mZXRjaF9ieXRlKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdywgY2hhciAqYykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKKwlib29sIGVtcHR5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNlcmlvX3Jhdy0+c2VyaW8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpb19wYXVzZV9yeChzZXJpb19yYXctPnNlcmlvKTsKIAogCWVtcHR5ID0gc2VyaW9fcmF3LT5oZWFkID09IHNlcmlvX3Jhdy0+dGFpbDsKIAlpZiAoIWVtcHR5KSB7CkBAIC0xNTEsMzAgKzE1MywzMSBAQAogCQlzZXJpb19yYXctPnRhaWwgPSAoc2VyaW9fcmF3LT50YWlsICsgMSkgJSBTRVJJT19SQVdfUVVFVUVfTEVOOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcmlvX3Jhdy0+c2VyaW8tPmxvY2ssIGZsYWdzKTsKKwlzZXJpb19jb250aW51ZV9yeChzZXJpb19yYXctPnNlcmlvKTsKIAogCXJldHVybiAhZW1wdHk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdyA9IGxpc3QtPnNlcmlvX3JhdzsKKwlzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCAqY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdyA9IGNsaWVudC0+c2VyaW9fcmF3OwogCWNoYXIgdW5pbml0aWFsaXplZF92YXIoYyk7CiAJc3NpemVfdCByZXR2YWwgPSAwOwogCi0JaWYgKCFzZXJpb19yYXctPnNlcmlvKQorCWlmIChzZXJpb19yYXctPmRlYWQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHNlcmlvX3Jhdy0+aGVhZCA9PSBzZXJpb19yYXctPnRhaWwgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobGlzdC0+c2VyaW9fcmF3LT53YWl0LAotCQkJCQkgIHNlcmlvX3Jhdy0+aGVhZCAhPSBzZXJpb19yYXctPnRhaWwgfHwgIXNlcmlvX3Jhdy0+c2VyaW8pOworCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJpb19yYXctPndhaXQsCisJCQlzZXJpb19yYXctPmhlYWQgIT0gc2VyaW9fcmF3LT50YWlsIHx8IHNlcmlvX3Jhdy0+ZGVhZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWlmICghc2VyaW9fcmF3LT5zZXJpbykKKwlpZiAoc2VyaW9fcmF3LT5kZWFkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXdoaWxlIChyZXR2YWwgPCBjb3VudCAmJiBzZXJpb19yYXdfZmV0Y2hfYnl0ZShzZXJpb19yYXcsICZjKSkgewpAQCAtMTg2LDkgKzE4OSwxMSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNlcmlvX3Jhd193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBzZXJpb19yYXdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gY2xpZW50LT5zZXJpb19yYXc7CiAJc3NpemVfdCB3cml0dGVuID0gMDsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgYzsKQEAgLTE5Nyw3ICsyMDIsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlpZiAoIWxpc3QtPnNlcmlvX3Jhdy0+c2VyaW8pIHsKKwlpZiAoc2VyaW9fcmF3LT5kZWFkKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIxMCw3ICsyMTUsNyBAQAogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmIChzZXJpb193cml0ZShsaXN0LT5zZXJpb19yYXctPnNlcmlvLCBjKSkgeworCQlpZiAoc2VyaW9fd3JpdGUoc2VyaW9fcmF3LT5zZXJpbywgYykpIHsKIAkJCXJldHZhbCA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMjI0LDQ2ICsyMjksNDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpb19yYXdfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNlcmlvX3Jhd19jbGllbnQgKmNsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPSBjbGllbnQtPnNlcmlvX3JhdzsKKwl1bnNpZ25lZCBpbnQgbWFzazsKIAotCXBvbGxfd2FpdChmaWxlLCAmbGlzdC0+c2VyaW9fcmF3LT53YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnNlcmlvX3Jhdy0+d2FpdCwgd2FpdCk7CiAKLQlpZiAobGlzdC0+c2VyaW9fcmF3LT5oZWFkICE9IGxpc3QtPnNlcmlvX3Jhdy0+dGFpbCkKKwltYXNrID0gc2VyaW9fcmF3LT5kZWFkID8gUE9MTEhVUCB8IFBPTExFUlIgOiBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlpZiAoc2VyaW9fcmF3LT5oZWFkICE9IHNlcmlvX3Jhdy0+dGFpbCkKIAkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VyaW9fcmF3X2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm9wZW4gPQkJc2VyaW9fcmF3X29wZW4sCi0JLnJlbGVhc2UgPQlzZXJpb19yYXdfcmVsZWFzZSwKLQkucmVhZCA9CQlzZXJpb19yYXdfcmVhZCwKLQkud3JpdGUgPQlzZXJpb19yYXdfd3JpdGUsCi0JLnBvbGwgPQkJc2VyaW9fcmF3X3BvbGwsCi0JLmZhc3luYyA9CXNlcmlvX3Jhd19mYXN5bmMsCi0JLmxsc2VlayA9IG5vb3BfbGxzZWVrLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBzZXJpb19yYXdfb3BlbiwKKwkucmVsZWFzZQk9IHNlcmlvX3Jhd19yZWxlYXNlLAorCS5yZWFkCQk9IHNlcmlvX3Jhd19yZWFkLAorCS53cml0ZQkJPSBzZXJpb19yYXdfd3JpdGUsCisJLnBvbGwJCT0gc2VyaW9fcmF3X3BvbGwsCisJLmZhc3luYwkJPSBzZXJpb19yYXdfZmFzeW5jLAorCS5sbHNlZWsJCT0gbm9vcF9sbHNlZWssCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIHNlcmlvIHBvcnQgICAJICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSB3aXRoIHNlcmlvIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzZXJpb19yYXdfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwKIAkJCQkJdW5zaWduZWQgaW50IGRmbCkKIHsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXcgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7Ci0Jc3RydWN0IHNlcmlvX3Jhd19saXN0ICpsaXN0OworCXN0cnVjdCBzZXJpb19yYXdfY2xpZW50ICpjbGllbnQ7CiAJdW5zaWduZWQgaW50IGhlYWQgPSBzZXJpb19yYXctPmhlYWQ7CiAKLQkvKiB3ZSBhcmUgaG9sZGluZyBzZXJpby0+bG9jayBoZXJlIHNvIHdlIGFyZSBwcm9vdGVjdGVkICovCisJLyogd2UgYXJlIGhvbGRpbmcgc2VyaW8tPmxvY2sgaGVyZSBzbyB3ZSBhcmUgcHJvdGVjdGVkICovCiAJc2VyaW9fcmF3LT5xdWV1ZVtoZWFkXSA9IGRhdGE7CiAJaGVhZCA9IChoZWFkICsgMSkgJSBTRVJJT19SQVdfUVVFVUVfTEVOOwogCWlmIChsaWtlbHkoaGVhZCAhPSBzZXJpb19yYXctPnRhaWwpKSB7CiAJCXNlcmlvX3Jhdy0+aGVhZCA9IGhlYWQ7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdCwgJnNlcmlvX3Jhdy0+bGlzdCwgbm9kZSkKLQkJCWtpbGxfZmFzeW5jKCZsaXN0LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZzZXJpb19yYXctPmNsaWVudF9saXN0LCBub2RlKQorCQkJa2lsbF9mYXN5bmMoJmNsaWVudC0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VyaW9fcmF3LT53YWl0KTsKIAl9CiAKQEAgLTI3MiwyOSArMjgwLDM3IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fcmF3X2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQogeworCXN0YXRpYyBhdG9taWNfdCBzZXJpb19yYXdfbm8gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CiAJaW50IGVycjsKIAotCWlmICghKHNlcmlvX3JhdyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19yYXcpLCBHRlBfS0VSTkVMKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzZXJpb19yYXcuYzogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIGRldmljZVxuIik7CisJc2VyaW9fcmF3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvX3JhdyksIEdGUF9LRVJORUwpOworCWlmICghc2VyaW9fcmF3KSB7CisJCWRldl9kYmcoJnNlcmlvLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbXV0ZXhfbG9jaygmc2VyaW9fcmF3X211dGV4KTsKLQotCXNucHJpbnRmKHNlcmlvX3Jhdy0+bmFtZSwgc2l6ZW9mKHNlcmlvX3Jhdy0+bmFtZSksICJzZXJpb19yYXclZCIsIHNlcmlvX3Jhd19ubysrKTsKLQlzZXJpb19yYXctPnJlZmNudCA9IDE7Ci0Jc2VyaW9fcmF3LT5zZXJpbyA9IHNlcmlvOwotCUlOSVRfTElTVF9IRUFEKCZzZXJpb19yYXctPmxpc3QpOworCXNucHJpbnRmKHNlcmlvX3Jhdy0+bmFtZSwgc2l6ZW9mKHNlcmlvX3Jhdy0+bmFtZSksCisJCSAic2VyaW9fcmF3JWxkIiwgKGxvbmcpYXRvbWljX2luY19yZXR1cm4oJnNlcmlvX3Jhd19ubykgLSAxKTsKKwlrcmVmX2luaXQoJnNlcmlvX3Jhdy0+a3JlZik7CisJSU5JVF9MSVNUX0hFQUQoJnNlcmlvX3Jhdy0+Y2xpZW50X2xpc3QpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcmlvX3Jhdy0+d2FpdCk7CiAKKwlzZXJpb19yYXctPnNlcmlvID0gc2VyaW87CisJZ2V0X2RldmljZSgmc2VyaW8tPmRldik7CisKIAlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgc2VyaW9fcmF3KTsKIAogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBvdXRfZnJlZTsKKwkJZ290byBlcnJfZnJlZTsKKworCWVyciA9IG11dGV4X2xvY2tfa2lsbGFibGUoJnNlcmlvX3Jhd19tdXRleCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2xvc2U7CiAKIAlsaXN0X2FkZF90YWlsKCZzZXJpb19yYXctPm5vZGUsICZzZXJpb19yYXdfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogCiAJc2VyaW9fcmF3LT5kZXYubWlub3IgPSBQU01PVVNFX01JTk9SOwogCXNlcmlvX3Jhdy0+ZGV2Lm5hbWUgPSBzZXJpb19yYXctPm5hbWU7CkBAIC0zMDgsMjMgKzMyNCwyMyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2VyaW9fcmF3OiBmYWlsZWQgdG8gcmVnaXN0ZXIgcmF3IGFjY2VzcyBkZXZpY2UgZm9yICVzXG4iLAorCQlkZXZfZXJyKCZzZXJpby0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciByYXcgYWNjZXNzIGRldmljZSBmb3IgJXNcbiIsCiAJCQlzZXJpby0+cGh5cyk7Ci0JCWdvdG8gb3V0X2Nsb3NlOworCQlnb3RvIGVycl91bmxpbms7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAic2VyaW9fcmF3OiByYXcgYWNjZXNzIGVuYWJsZWQgb24gJXMgKCVzLCBtaW5vciAlZClcbiIsCi0JCXNlcmlvLT5waHlzLCBzZXJpb19yYXctPm5hbWUsIHNlcmlvX3Jhdy0+ZGV2Lm1pbm9yKTsKLQlnb3RvIG91dDsKKwlkZXZfaW5mbygmc2VyaW8tPmRldiwgInJhdyBhY2Nlc3MgZW5hYmxlZCBvbiAlcyAoJXMsIG1pbm9yICVkKVxuIiwKKwkJIHNlcmlvLT5waHlzLCBzZXJpb19yYXctPm5hbWUsIHNlcmlvX3Jhdy0+ZGV2Lm1pbm9yKTsKKwlyZXR1cm4gMDsKIAotb3V0X2Nsb3NlOgotCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2Vycl91bmxpbms6CiAJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKLW91dF9mcmVlOgorZXJyX2Nsb3NlOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2Vycl9mcmVlOgogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlrZnJlZShzZXJpb19yYXcpOwotb3V0OgotCW11dGV4X3VubG9jaygmc2VyaW9fcmF3X211dGV4KTsKKwlrcmVmX3B1dCgmc2VyaW9fcmF3LT5rcmVmLCBzZXJpb19yYXdfZnJlZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzM0LDcgKzM1MCw4IEBACiAJc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2ID0gc2VyaW8tPmRydjsKIAogCWlmICghZHJ2IHx8ICFzZXJpb19yYXcpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInNlcmlvX3JhdzogcmVjb25uZWN0IHJlcXVlc3QsIGJ1dCBzZXJpbyBpcyBkaXNjb25uZWN0ZWQsIGlnbm9yaW5nLi4uXG4iKTsKKwkJZGV2X2RiZygmc2VyaW8tPmRldiwKKwkJCSJyZWNvbm5lY3QgcmVxdWVzdCwgYnV0IHNlcmlvIGlzIGRpc2Nvbm5lY3RlZCwgaWdub3JpbmcuLi5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zNDUsMjIgKzM2Miw0MCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogV2FrZSB1cCB1c2VycyB3YWl0aW5nIGZvciBJTyBzbyB0aGV5IGNhbiBkaXNjb25uZWN0IGZyb20KKyAqIGRlYWQgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBzZXJpb19yYXdfaGFuZ3VwKHN0cnVjdCBzZXJpb19yYXcgKnNlcmlvX3JhdykKK3sKKwlzdHJ1Y3Qgc2VyaW9fcmF3X2NsaWVudCAqY2xpZW50OworCisJc2VyaW9fcGF1c2Vfcngoc2VyaW9fcmF3LT5zZXJpbyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZzZXJpb19yYXctPmNsaWVudF9saXN0LCBub2RlKQorCQlraWxsX2Zhc3luYygmY2xpZW50LT5mYXN5bmMsIFNJR0lPLCBQT0xMX0hVUCk7CisJc2VyaW9fY29udGludWVfcngoc2VyaW9fcmF3LT5zZXJpbyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlcmlvX3Jhdy0+d2FpdCk7Cit9CisKKwogc3RhdGljIHZvaWQgc2VyaW9fcmF3X2Rpc2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzdHJ1Y3Qgc2VyaW9fcmF3ICpzZXJpb19yYXc7CisJc3RydWN0IHNlcmlvX3JhdyAqc2VyaW9fcmF3ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJbWlzY19kZXJlZ2lzdGVyKCZzZXJpb19yYXctPmRldik7CiAKIAltdXRleF9sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOworCXNlcmlvX3Jhdy0+ZGVhZCA9IHRydWU7CisJbGlzdF9kZWxfaW5pdCgmc2VyaW9fcmF3LT5ub2RlKTsKKwltdXRleF91bmxvY2soJnNlcmlvX3Jhd19tdXRleCk7CiAKLQlzZXJpb19yYXcgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJc2VyaW9fcmF3X2hhbmd1cChzZXJpb19yYXcpOwogCiAJc2VyaW9fY2xvc2Uoc2VyaW8pOworCWtyZWZfcHV0KCZzZXJpb19yYXctPmtyZWYsIHNlcmlvX3Jhd19mcmVlKTsKKwogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQotCXNlcmlvX3Jhdy0+c2VyaW8gPSBOVUxMOwotCWlmICghc2VyaW9fcmF3X2NsZWFudXAoc2VyaW9fcmF3KSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXJpb19yYXctPndhaXQpOwotCi0JbXV0ZXhfdW5sb2NrKCZzZXJpb19yYXdfbXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IHNlcmlvX2RldmljZV9pZCBzZXJpb19yYXdfc2VyaW9faWRzW10gPSB7CkBAIC0zOTEsNyArNDI2LDcgQEAKIAkuY29ubmVjdAk9IHNlcmlvX3Jhd19jb25uZWN0LAogCS5yZWNvbm5lY3QJPSBzZXJpb19yYXdfcmVjb25uZWN0LAogCS5kaXNjb25uZWN0CT0gc2VyaW9fcmF3X2Rpc2Nvbm5lY3QsCi0JLm1hbnVhbF9iaW5kCT0gMSwKKwkubWFudWFsX2JpbmQJPSB0cnVlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2VyaW9fcmF3X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jIGIvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKaW5kZXggZmRiNmEzOS4uNzVmYjA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zcGFyc2Uta2V5bWFwLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogTU9EVUxFX0FVVEhPUigiRG1pdHJ5IFRvcm9raG92IDxkdG9yQG1haWwucnU+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbS5oIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb20uaAppbmRleCAyMzMxN2JkLi4wNzgzODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbS5oCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tLmgKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAgRGFuaWVsIEVnZ2VyCQk8ZWdnZXJAc3VzZS5kZT4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDEgRnJlZGVyaWMgTGVwaWVkCQk8ZmxlcGllZEBtYW5kcmFrZXNvZnQuY29tPgogICogIENvcHlyaWdodCAoYykgMjAwNCBQYW5hZ2lvdGlzIElzc2FyaXMJPHBhbmFnaW90aXMuaXNzYXJpc0BtZWNoLmt1bGV1dmVuLmFjLmJlPgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA5IFBpbmcgQ2hlbmcJCTxwaW5nY0B3YWNvbS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMTEgUGluZyBDaGVuZwkJPHBpbmdjQHdhY29tLmNvbT4KICAqCiAgKiAgQ2hhbmdlTG9nOgogICogICAgICB2MC4xICh2cCkgIC0gSW5pdGlhbCByZWxlYXNlCkBAIC05Myw3ICs5Myw3IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS41MiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjUzIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIFdhY29tIHRhYmxldCBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCkBAIC0xMTQsNiArMTE0LDEyIEBACiAJc3RydWN0IG11dGV4IGxvY2s7CiAJYm9vbCBvcGVuOwogCWNoYXIgcGh5c1szMl07CisJc3RydWN0IHdhY29tX2xlZCB7CisJCXU4IHNlbGVjdFsyXTsgLyogc3RhdHVzIGxlZCBzZWxlY3RvciAoMC4uMykgKi8KKwkJdTggbGx2OyAgICAgICAvKiBzdGF0dXMgbGVkIGJyaWdodG5lc3Mgbm8gYnV0dG9uICgxLi4xMjcpICovCisJCXU4IGhsdjsgICAgICAgLyogc3RhdHVzIGxlZCBicmlnaHRuZXNzIGJ1dHRvbiBwcmVzc2VkICgxLi4xMjcpICovCisJCXU4IGltZ19sdW07ICAgLyogT0xFRCBtYXRyaXggZGlzcGxheSBicmlnaHRuZXNzICovCisJfSBsZWQ7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2Fjb21faWRzW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV9zeXMuYyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCmluZGV4IDk1OGI0ZWIuLjFjMWI3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3N5cy5jCkBAIC00OCwyNyArNDgsNDkgQEAKIC8qIGRlZmluZXMgdG8gZ2V0L3NldCBVU0IgbWVzc2FnZSAqLwogI2RlZmluZSBVU0JfUkVRX0dFVF9SRVBPUlQJMHgwMQogI2RlZmluZSBVU0JfUkVRX1NFVF9SRVBPUlQJMHgwOQorCiAjZGVmaW5lIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQJMHgwMwogI2RlZmluZSBXQUNfTVNHX1JFVFJJRVMJCTUKIAotc3RhdGljIGludCB1c2JfZ2V0X3JlcG9ydChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgY2hhciB0eXBlLAotCQkJCXVuc2lnbmVkIGNoYXIgaWQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCisjZGVmaW5lIFdBQ19DTURfTEVEX0NPTlRST0wJMHgyMAorI2RlZmluZSBXQUNfQ01EX0lDT05fU1RBUlQJMHgyMQorI2RlZmluZSBXQUNfQ01EX0lDT05fWEZFUgkweDIzCisjZGVmaW5lIFdBQ19DTURfUkVUUklFUwkJMTAKKworc3RhdGljIGludCB3YWNvbV9nZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1OCB0eXBlLCB1OCBpZCwKKwkJCSAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgcmV0cmllcykKIHsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCXVzYl9yY3ZjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKLQkJVVNCX1JFUV9HRVRfUkVQT1JULCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCi0JCSh0eXBlIDw8IDgpICsgaWQsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAotCQlidWYsIHNpemUsIDEwMCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IHJldHZhbDsKKworCWRvIHsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkJVVNCX1JFUV9HRVRfUkVQT1JULAorCQkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkodHlwZSA8PCA4KSArIGlkLAorCQkJCWludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJCWJ1Ziwgc2l6ZSwgMTAwKTsKKwl9IHdoaWxlICgocmV0dmFsID09IC1FVElNRURPVVQgfHwgcmV0dmFsID09IC1FUElQRSkgJiYgLS1yZXRyaWVzKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX3NldF9yZXBvcnQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHVuc2lnbmVkIGNoYXIgdHlwZSwKLQkJCQl1bnNpZ25lZCBjaGFyIGlkLCB2b2lkICpidWYsIGludCBzaXplKQorc3RhdGljIGludCB3YWNvbV9zZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1OCB0eXBlLCB1OCBpZCwKKwkJCSAgICB2b2lkICpidWYsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgcmV0cmllcykKIHsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCXVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKLSAgICAgICAgICAgICAgICBVU0JfUkVRX1NFVF9SRVBPUlQsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJYnVmLCBzaXplLCAxMDAwKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgcmV0dmFsOworCisJZG8geworCQlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCQlVU0JfUkVRX1NFVF9SRVBPUlQsCisJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSh0eXBlIDw8IDgpICsgaWQsCisJCQkJaW50Zi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJYnVmLCBzaXplLCAxMDAwKTsKKwl9IHdoaWxlICgocmV0dmFsID09IC1FVElNRURPVVQgfHwgcmV0dmFsID09IC1FUElQRSkgJiYgLS1yZXRyaWVzKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIHdhY29tX3N5c19pcnEoc3RydWN0IHVyYiAqdXJiKQpAQCAtMzE5LDIzICszNDEsMjMgQEAKIAkJCXJlcF9kYXRhWzJdID0gMDsKIAkJCXJlcF9kYXRhWzNdID0gMDsKIAkJCXJlcG9ydF9pZCA9IDM7Ci0JCQllcnJvciA9IHVzYl9zZXRfcmVwb3J0KGludGYsIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQsCi0JCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgNCk7CisJCQllcnJvciA9IHdhY29tX3NldF9yZXBvcnQoaW50ZiwgV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwKKwkJCQkJCSByZXBvcnRfaWQsIHJlcF9kYXRhLCA0LCAxKTsKIAkJCWlmIChlcnJvciA+PSAwKQotCQkJCWVycm9yID0gdXNiX2dldF9yZXBvcnQoaW50ZiwKLQkJCQkJV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwgcmVwb3J0X2lkLAotCQkJCQlyZXBfZGF0YSwgNCk7CisJCQkJZXJyb3IgPSB3YWNvbV9nZXRfcmVwb3J0KGludGYsCisJCQkJCQlXQUNfSElEX0ZFQVRVUkVfUkVQT1JULAorCQkJCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgNCwgMSk7CiAJCX0gd2hpbGUgKChlcnJvciA8IDAgfHwgcmVwX2RhdGFbMV0gIT0gNCkgJiYgbGltaXQrKyA8IFdBQ19NU0dfUkVUUklFUyk7CiAJfSBlbHNlIGlmIChmZWF0dXJlcy0+dHlwZSAhPSBUQUJMRVRQQykgewogCQlkbyB7CiAJCQlyZXBfZGF0YVswXSA9IDI7CiAJCQlyZXBfZGF0YVsxXSA9IDI7Ci0JCQllcnJvciA9IHVzYl9zZXRfcmVwb3J0KGludGYsIFdBQ19ISURfRkVBVFVSRV9SRVBPUlQsCi0JCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgMik7CisJCQllcnJvciA9IHdhY29tX3NldF9yZXBvcnQoaW50ZiwgV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwKKwkJCQkJCSByZXBvcnRfaWQsIHJlcF9kYXRhLCAyLCAxKTsKIAkJCWlmIChlcnJvciA+PSAwKQotCQkJCWVycm9yID0gdXNiX2dldF9yZXBvcnQoaW50ZiwKLQkJCQkJV0FDX0hJRF9GRUFUVVJFX1JFUE9SVCwgcmVwb3J0X2lkLAotCQkJCQlyZXBfZGF0YSwgMik7CisJCQkJZXJyb3IgPSB3YWNvbV9nZXRfcmVwb3J0KGludGYsCisJCQkJCQlXQUNfSElEX0ZFQVRVUkVfUkVQT1JULAorCQkJCQkJcmVwb3J0X2lkLCByZXBfZGF0YSwgMiwgMSk7CiAJCX0gd2hpbGUgKChlcnJvciA8IDAgfHwgcmVwX2RhdGFbMV0gIT0gMikgJiYgbGltaXQrKyA8IFdBQ19NU0dfUkVUUklFUyk7CiAJfQogCkBAIC00NTQsNiArNDc2LDI3NSBAQAogCX0KIH0KIAorc3RhdGljIGludCB3YWNvbV9sZWRfY29udHJvbChzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmV0dmFsLCBsZWQgPSAwOworCisJYnVmID0ga3phbGxvYyg5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy50eXBlID09IFdBQ09NXzIxVVgyKQorCQlsZWQgPSAod2Fjb20tPmxlZC5zZWxlY3RbMV0gPDwgNCkgfCAweDQwOworCisJbGVkIHw9ICB3YWNvbS0+bGVkLnNlbGVjdFswXSB8IDB4NDsKKworCWJ1ZlswXSA9IFdBQ19DTURfTEVEX0NPTlRST0w7CisJYnVmWzFdID0gbGVkOworCWJ1ZlsyXSA9IHdhY29tLT5sZWQubGx2OworCWJ1ZlszXSA9IHdhY29tLT5sZWQuaGx2OworCWJ1Zls0XSA9IHdhY29tLT5sZWQuaW1nX2x1bTsKKworCXJldHZhbCA9IHdhY29tX3NldF9yZXBvcnQod2Fjb20tPmludGYsIDB4MDMsIFdBQ19DTURfTEVEX0NPTlRST0wsCisJCQkJICBidWYsIDksIFdBQ19DTURfUkVUUklFUyk7CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkX3B1dGltYWdlKHN0cnVjdCB3YWNvbSAqd2Fjb20sIGludCBidXR0b25faWQsIGNvbnN0IHZvaWQgKmltZykKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGksIHJldHZhbDsKKworCWJ1ZiA9IGt6YWxsb2MoMjU5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTZW5kICdzdGFydCcgY29tbWFuZCAqLworCWJ1ZlswXSA9IFdBQ19DTURfSUNPTl9TVEFSVDsKKwlidWZbMV0gPSAxOworCXJldHZhbCA9IHdhY29tX3NldF9yZXBvcnQod2Fjb20tPmludGYsIDB4MDMsIFdBQ19DTURfSUNPTl9TVEFSVCwKKwkJCQkgIGJ1ZiwgMiwgV0FDX0NNRF9SRVRSSUVTKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlidWZbMF0gPSBXQUNfQ01EX0lDT05fWEZFUjsKKwlidWZbMV0gPSBidXR0b25faWQgJiAweDA3OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYnVmWzJdID0gaTsKKwkJbWVtY3B5KGJ1ZiArIDMsIGltZyArIGkgKiAyNTYsIDI1Nik7CisKKwkJcmV0dmFsID0gd2Fjb21fc2V0X3JlcG9ydCh3YWNvbS0+aW50ZiwgMHgwMywgV0FDX0NNRF9JQ09OX1hGRVIsCisJCQkJCSAgYnVmLCAyNTksIFdBQ19DTURfUkVUUklFUyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJYnJlYWs7CisJfQorCisJLyogU2VuZCAnc3RvcCcgKi8KKwlidWZbMF0gPSBXQUNfQ01EX0lDT05fU1RBUlQ7CisJYnVmWzFdID0gMDsKKwl3YWNvbV9zZXRfcmVwb3J0KHdhY29tLT5pbnRmLCAweDAzLCBXQUNfQ01EX0lDT05fU1RBUlQsCisJCQkgYnVmLCAyLCBXQUNfQ01EX1JFVFJJRVMpOworCitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCB3YWNvbV9sZWRfc2VsZWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNldF9pZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGlkOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91aW50KGJ1ZiwgMTAsICZpZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKworCXdhY29tLT5sZWQuc2VsZWN0W3NldF9pZF0gPSBpZCAmIDB4MzsKKwllcnIgPSB3YWNvbV9sZWRfY29udHJvbCh3YWNvbSk7CisKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKKworCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7Cit9CisKKyNkZWZpbmUgREVWSUNFX0xFRF9TRUxFQ1RfQVRUUihTRVRfSUQpCQkJCQlcCitzdGF0aWMgc3NpemVfdCB3YWNvbV9sZWQjI1NFVF9JRCMjX3NlbGVjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHdhY29tX2xlZF9zZWxlY3Rfc3RvcmUoZGV2LCBTRVRfSUQsIGJ1ZiwgY291bnQpOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2xlZCMjU0VUX0lEIyNfc2VsZWN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMiwgIiVkXG4iLCB3YWNvbS0+bGVkLnNlbGVjdFtTRVRfSURdKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXNfbGVkIyNTRVRfSUQjI19zZWxlY3QsIFNfSVdVU1IgfCBTX0lSVVNSLAlcCisJCSAgICB3YWNvbV9sZWQjI1NFVF9JRCMjX3NlbGVjdF9zaG93LAkJCVwKKwkJICAgIHdhY29tX2xlZCMjU0VUX0lEIyNfc2VsZWN0X3N0b3JlKQorCitERVZJQ0VfTEVEX1NFTEVDVF9BVFRSKDApOworREVWSUNFX0xFRF9TRUxFQ1RfQVRUUigxKTsKKworc3RhdGljIHNzaXplX3Qgd2Fjb21fbHVtaW5hbmNlX3N0b3JlKHN0cnVjdCB3YWNvbSAqd2Fjb20sIHU4ICpkZXN0LAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91aW50KGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKworCSpkZXN0ID0gdmFsdWUgJiAweDdmOworCWVyciA9IHdhY29tX2xlZF9jb250cm9sKHdhY29tKTsKKworCW11dGV4X3VubG9jaygmd2Fjb20tPmxvY2spOworCisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBjb3VudDsKK30KKworI2RlZmluZSBERVZJQ0VfTFVNSU5BTkNFX0FUVFIobmFtZSwgZmllbGQpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tXyMjbmFtZSMjX2x1bWluYW5jZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHdhY29tICp3YWNvbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gd2Fjb21fbHVtaW5hbmNlX3N0b3JlKHdhY29tLCAmd2Fjb20tPmxlZC5maWVsZCwJCVwKKwkJCQkgICAgIGJ1ZiwgY291bnQpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSMjX2x1bWluYW5jZSwgU19JV1VTUiwJCQkJXAorCQkgICBOVUxMLCB3YWNvbV8jI25hbWUjI19sdW1pbmFuY2Vfc3RvcmUpCisKK0RFVklDRV9MVU1JTkFOQ0VfQVRUUihzdGF0dXMwLCBsbHYpOworREVWSUNFX0xVTUlOQU5DRV9BVFRSKHN0YXR1czEsIGhsdik7CitERVZJQ0VfTFVNSU5BTkNFX0FUVFIoYnV0dG9ucywgaW1nX2x1bSk7CisKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2J1dHRvbl9pbWFnZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBidXR0b25faWQsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGNvdW50ICE9IDEwMjQpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOworCisJZXJyID0gd2Fjb21fbGVkX3B1dGltYWdlKHdhY29tLCBidXR0b25faWQsIGJ1Zik7CisKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKKworCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7Cit9CisKKyNkZWZpbmUgREVWSUNFX0JUTklNR19BVFRSKEJVVFRPTl9JRCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHdhY29tX2J0bmltZyMjQlVUVE9OX0lEIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXJldHVybiB3YWNvbV9idXR0b25faW1hZ2Vfc3RvcmUoZGV2LCBCVVRUT05fSUQsIGJ1ZiwgY291bnQpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGJ1dHRvbiMjQlVUVE9OX0lEIyNfcmF3aW1nLCBTX0lXVVNSLAkJCVwKKwkJICAgTlVMTCwgd2Fjb21fYnRuaW1nIyNCVVRUT05fSUQjI19zdG9yZSkKKworREVWSUNFX0JUTklNR19BVFRSKDApOworREVWSUNFX0JUTklNR19BVFRSKDEpOworREVWSUNFX0JUTklNR19BVFRSKDIpOworREVWSUNFX0JUTklNR19BVFRSKDMpOworREVWSUNFX0JUTklNR19BVFRSKDQpOworREVWSUNFX0JUTklNR19BVFRSKDUpOworREVWSUNFX0JUTklNR19BVFRSKDYpOworREVWSUNFX0JUTklNR19BVFRSKDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2ludGlxX2xlZF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zdGF0dXNfbGVkMF9zZWxlY3QuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdHVzX2xlZDFfc2VsZWN0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2ludGlxX2xlZF9hdHRyX2dyb3VwID0geworCS5uYW1lID0gIndhY29tX2xlZCIsCisJLmF0dHJzID0gY2ludGlxX2xlZF9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnR1b3M0X2xlZF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zdGF0dXMwX2x1bWluYW5jZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMxX2x1bWluYW5jZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXNfbGVkMF9zZWxlY3QuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uc19sdW1pbmFuY2UuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMF9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMV9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uMl9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uM19yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNF9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNV9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uNl9yYXdpbWcuYXR0ciwKKwkmZGV2X2F0dHJfYnV0dG9uN19yYXdpbWcuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnR1b3M0X2xlZF9hdHRyX2dyb3VwID0geworCS5uYW1lID0gIndhY29tX2xlZCIsCisJLmF0dHJzID0gaW50dW9zNF9sZWRfYXR0cnMsCit9OworCitzdGF0aWMgaW50IHdhY29tX2luaXRpYWxpemVfbGVkcyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCWludCBlcnJvcjsKKworCS8qIEluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzd2l0Y2ggKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMudHlwZSkgeworCWNhc2UgSU5UVU9TNDoKKwljYXNlIElOVFVPUzRMOgorCQl3YWNvbS0+bGVkLnNlbGVjdFswXSA9IDA7CisJCXdhY29tLT5sZWQuc2VsZWN0WzFdID0gMDsKKwkJd2Fjb20tPmxlZC5sbHYgPSAxMDsKKwkJd2Fjb20tPmxlZC5obHYgPSAyMDsKKwkJd2Fjb20tPmxlZC5pbWdfbHVtID0gMTA7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ3YWNvbS0+aW50Zi0+ZGV2LmtvYmosCisJCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisKKwljYXNlIFdBQ09NXzIxVVgyOgorCQl3YWNvbS0+bGVkLnNlbGVjdFswXSA9IDA7CisJCXdhY29tLT5sZWQuc2VsZWN0WzFdID0gMDsKKwkJd2Fjb20tPmxlZC5sbHYgPSAwOworCQl3YWNvbS0+bGVkLmhsdiA9IDA7CisJCXdhY29tLT5sZWQuaW1nX2x1bSA9IDA7CisKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJndhY29tLT5pbnRmLT5kZXYua29iaiwKKwkJCQkJICAgJmNpbnRpcV9sZWRfYXR0cl9ncm91cCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJndhY29tLT5pbnRmLT5kZXYsCisJCQkiY2Fubm90IGNyZWF0ZSBzeXNmcyBncm91cCBlcnI6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJd2Fjb21fbGVkX2NvbnRyb2wod2Fjb20pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhY29tX2Rlc3Ryb3lfbGVkcyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCXN3aXRjaCAod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy50eXBlKSB7CisJY2FzZSBJTlRVT1M0OgorCWNhc2UgSU5UVU9TNEw6CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmd2Fjb20tPmludGYtPmRldi5rb2JqLAorCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisKKwljYXNlIFdBQ09NXzIxVVgyOgorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJndhY29tLT5pbnRmLT5kZXYua29iaiwKKwkJCQkgICAmY2ludGlxX2xlZF9hdHRyX2dyb3VwKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW50IHdhY29tX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CkBAIC01NDIsMTYgKzgzMywyMSBAQAogCXdhY29tLT5pcnEtPnRyYW5zZmVyX2RtYSA9IHdhY29tLT5kYXRhX2RtYTsKIAl3YWNvbS0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJZXJyb3IgPSB3YWNvbV9pbml0aWFsaXplX2xlZHMod2Fjb20pOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsNDsKIAorCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw1OworCiAJLyogTm90ZSB0aGF0IGlmIHF1ZXJ5IGZhaWxzIGl0IGlzIG5vdCBhIGhhcmQgZmFpbHVyZSAqLwogCXdhY29tX3F1ZXJ5X3RhYmxldF9kYXRhKGludGYsIGZlYXR1cmVzKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgd2Fjb20pOwogCXJldHVybiAwOwogCisgZmFpbDU6IHdhY29tX2Rlc3Ryb3lfbGVkcyh3YWNvbSk7CiAgZmFpbDQ6CXdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YSh3YWNvbV93YWMpOwogIGZhaWwzOgl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CiAgZmFpbDI6CXVzYl9mcmVlX2NvaGVyZW50KGRldiwgV0FDT01fUEtHTEVOX01BWCwgd2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOwpAQCAtNTY4LDYgKzg2NCw3IEBACiAKIAl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7CiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPndhY29tX3dhYy5pbnB1dCk7CisJd2Fjb21fZGVzdHJveV9sZWRzKHdhY29tKTsKIAl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CiAJdXNiX2ZyZWVfY29oZXJlbnQoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgV0FDT01fUEtHTEVOX01BWCwKIAkJCXdhY29tLT53YWNvbV93YWMuZGF0YSwgd2Fjb20tPmRhdGFfZG1hKTsKQEAgLTU5MCwxNyArODg3LDE2IEBACiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHdhY29tX2ZlYXR1cmVzICpmZWF0dXJlcyA9ICZ3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzOwotCWludCBydjsKKwlpbnQgcnYgPSAwOwogCiAJbXV0ZXhfbG9jaygmd2Fjb20tPmxvY2spOwogCiAJLyogc3dpdGNoIHRvIHdhY29tIG1vZGUgZmlyc3QgKi8KIAl3YWNvbV9xdWVyeV90YWJsZXRfZGF0YShpbnRmLCBmZWF0dXJlcyk7CisJd2Fjb21fbGVkX2NvbnRyb2wod2Fjb20pOwogCi0JaWYgKHdhY29tLT5vcGVuKQotCQlydiA9IHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9OT0lPKTsKLQllbHNlCi0JCXJ2ID0gMDsKKwlpZiAod2Fjb20tPm9wZW4gJiYgdXNiX3N1Ym1pdF91cmIod2Fjb20tPmlycSwgR0ZQX05PSU8pIDwgMCkKKwkJcnYgPSAtRUlPOwogCiAJbXV0ZXhfdW5sb2NrKCZ3YWNvbS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKaW5kZXggOWRlYTcxOC4uZGEwZDg3NjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwpAQCAtODc0LDcgKzg3NCwxNSBAQAogCQl4ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVsyXSk7CiAJCXkgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzRdKTsKIAkJcCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbNl0pOwotCQlkID0gZGF0YVs4XTsKKwkJLyoKKwkJICogQ29udmVydCBkaXN0YW5jZSBmcm9tIG91dCBwcm94IHRvIGRpc3RhbmNlIGZyb20gdGFibGV0LgorCQkgKiBkaXN0YW5jZSB3aWxsIGJlIGdyZWF0ZXIgdGhhbiBkaXN0YW5jZV9tYXggb25jZQorCQkgKiB0b3VjaGluZyBhbmQgYXBwbHlpbmcgcHJlc3N1cmU7IGRvIG5vdCByZXBvcnQgbmVnYXRpdmUKKwkJICogZGlzdGFuY2UuCisJCSAqLworCQlpZiAoZGF0YVs4XSA8PSB3YWNvbS0+ZmVhdHVyZXMuZGlzdGFuY2VfbWF4KQorCQkJZCA9IHdhY29tLT5mZWF0dXJlcy5kaXN0YW5jZV9tYXggLSBkYXRhWzhdOworCiAJCXBlbiA9IGRhdGFbMV0gJiAweDAxOwogCQlidG4xID0gZGF0YVsxXSAmIDB4MDI7CiAJCWJ0bjIgPSBkYXRhWzFdICYgMHgwNDsKQEAgLTEwMzAsOCArMTAzOCw2IEBACiAJCWZlYXR1cmVzLT55X21heCA8PD0gNTsKIAkJZmVhdHVyZXMtPnhfZnV6eiA8PD0gNTsKIAkJZmVhdHVyZXMtPnlfZnV6eiA8PD0gNTsKLQkJZmVhdHVyZXMtPnByZXNzdXJlX21heCA9IDI1NjsKLQkJZmVhdHVyZXMtPnByZXNzdXJlX2Z1enogPSAxNjsKIAkJZmVhdHVyZXMtPnF1aXJrcyB8PSBXQUNPTV9RVUlSS19CQlRPVUNIX0xPV1JFUzsKIAl9CiB9CkBAIC0xMjQxLDE0ICsxMjQ3LDE0IEBACiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAogCQkJCQkgICAgIDAsIGZlYXR1cmVzLT55X21heCwKIAkJCQkJICAgICBmZWF0dXJlcy0+eV9mdXp6LCAwKTsKLQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1BSRVNTVVJFLAotCQkJCQkgICAgIDAsIGZlYXR1cmVzLT5wcmVzc3VyZV9tYXgsCi0JCQkJCSAgICAgZmVhdHVyZXMtPnByZXNzdXJlX2Z1enosIDApOwogCQl9IGVsc2UgaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSA9PSBCVE5fVE9PTF9QRU4pIHsKIAkJCV9fc2V0X2JpdChCVE5fVE9PTF9SVUJCRVIsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAkJCV9fc2V0X2JpdChCVE5fVE9PTF9QRU4sIGlucHV0X2Rldi0+a2V5Yml0KTsKIAkJCV9fc2V0X2JpdChCVE5fU1RZTFVTLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCQlfX3NldF9iaXQoQlROX1NUWUxVUzIsIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX0RJU1RBTkNFLCAwLAorCQkJCQkgICAgICBmZWF0dXJlcy0+ZGlzdGFuY2VfbWF4LAorCQkJCQkgICAgICAwLCAwKTsKIAkJfQogCQlicmVhazsKIAl9CkBAIC0xNDY5LDM3ICsxNDc1LDM3IEBACiAJICAzMSwgSU5UVU9TLCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDAgPQogCXsgIldhY29tIEJhbWJvbyAyRkciLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQxID0KIAl7ICJXYWNvbSBCYW1ib28gMkZHIDR4NSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAgIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhEMiA9CiAJeyAiV2Fjb20gQmFtYm9vIENyYWZ0IiwgICBXQUNPTV9QS0dMRU5fQkJGVU4sICAgICAxNDcyMCwgIDkyMDAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDMgPQotCXsgIldhY29tIEJhbWJvbyAyRkcgNng4IiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMjE2NDgsIDEzNTMwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCXsgIldhY29tIEJhbWJvbyAyRkcgNng4IiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgICAgMjE2NDgsIDEzNzAwLCAxMDIzLAorCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQ0ID0KIAl7ICJXYWNvbSBCYW1ib28gUGVuIiwgICAgIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAgIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhENSA9Ci0JeyAiV2Fjb20gQmFtYm9vIFBlbiA2eDgiLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAyMTY0OCwgMTM1MzAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJeyAiV2Fjb20gQmFtYm9vIFBlbiA2eDgiLCAgICAgV0FDT01fUEtHTEVOX0JCRlVOLCAyMTY0OCwgMTM3MDAsIDEwMjMsCisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RDYgPQogCXsgIldhY29tIEJhbWJvb1BUIDJGRyA0eDUiLCBXQUNPTV9QS0dMRU5fQkJGVU4sICAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weEQ3ID0KIAl7ICJXYWNvbSBCYW1ib29QVCAyRkcgU21hbGwiLCBXQUNPTV9QS0dMRU5fQkJGVU4sIDE0NzIwLCAgOTIwMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhEOCA9Ci0JeyAiV2Fjb20gQmFtYm9vIENvbWljIDJGRyIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAyMTY0OCwgMTM1MzAsIDEwMjMsCi0JICA2MywgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CisJeyAiV2Fjb20gQmFtYm9vIENvbWljIDJGRyIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgICAyMTY0OCwgMTM3MDAsIDEwMjMsCisJICAzMSwgQkFNQk9PX1BULCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4REEgPQogCXsgIldhY29tIEJhbWJvbyAyRkcgNHg1IFNFIiwgV0FDT01fUEtHTEVOX0JCRlVOLCAgMTQ3MjAsICA5MjAwLCAxMDIzLAotCSAgNjMsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9OworCSAgMzEsIEJBTUJPT19QVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weERCID0KLQl7ICJXYWNvbSBCYW1ib28gMkZHIDZ4OCBTRSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgIDIxNjQ4LCAxMzUzMCwgMTAyMywKLQkgIDYzLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKKwl7ICJXYWNvbSBCYW1ib28gMkZHIDZ4OCBTRSIsIFdBQ09NX1BLR0xFTl9CQkZVTiwgIDIxNjQ4LCAxMzcwMCwgMTAyMywKKwkgIDMxLCBCQU1CT09fUFQsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHg2MDA0ID0KIAl7ICJJU0QtVjQiLCAgICAgICAgICAgICAgIFdBQ09NX1BLR0xFTl9HUkFQSElSRSwgIDEyODAwLCAgODAwMCwgIDI1NSwKIAkgIDAsIFRBQkxFVFBDLCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggY2FiZDllNS4uMzQ4OGZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtNjUxLDYgKzY1MSwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdG91Y2hpdDIxMy4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1RTQ19TRVJJTworCXRyaXN0YXRlICJUU0MtMTAvMjUvNDAgc2VyaWFsIHRvdWNoc2NyZWVuIHN1cHBvcnQiCisJc2VsZWN0IFNFUklPCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFRTQy0xMCwgMjUgb3IgNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGNvbm5lY3RlZAorCSAgdG8geW91ciBzeXN0ZW0uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRzYzQwLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fVFNDMjAwNQogICAgICAgICB0cmlzdGF0ZSAiVFNDMjAwNSBiYXNlZCB0b3VjaHNjcmVlbnMiCiAgICAgICAgIGRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBHRU5FUklDX0hBUkRJUlFTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQppbmRleCAyODJkNmY3Li5mOTU3Njc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKQEAgLTQ2LDYgKzQ2LDcgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzKQkrPSB0b3VjaGl0MjEzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTikJKz0gdG91Y2h3aW4ubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQ19TRVJJTykJKz0gdHNjNDAubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDUpCSs9IHRzYzIwMDUubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDcpCSs9IHRzYzIwMDcubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDApCSs9IHVjYjE0MDBfdHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzcuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc3LmMKaW5kZXggNzE0ZDRlMC4uNDAwMTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzcuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3Ny5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjZGVmaW5lCVRTX1BFTl9VUF9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1pMmMuYwppbmRleCA0ZTRlNThjLi5jNzg5Yjk3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBBRDc4NzlfREVWSUQJCTB4NzkJLyogQUQ3ODc5LTEvQUQ3ODg5LTEgKi8KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBhZDc4NzlfaTJjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CkBAIC0zNiw5ICszNiw5IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYWQ3ODc5X2kyY19wbSwgYWQ3ODc5X2kyY19zdXNwZW5kLCBhZDc4NzlfaTJjX3Jlc3VtZSk7Ci0jZW5kaWYKIAogLyogQWxsIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZC4KICAqIEFENzg3OSB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24uCkBAIC0xMTksOSArMTE5LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJhZDc4NzkiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtCT0gJmFkNzg3OV9pMmNfcG0sCi0jZW5kaWYKIAl9LAogCS5wcm9iZQkJPSBhZDc4NzlfaTJjX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ3ODc5X2kyY19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4Nzktc3BpLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYwppbmRleCBkZGY3MzJmLi5iMTY0M2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS1zcGkuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgkvKiBCVVNfU1BJICovCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJhZDc4NzkuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKaW5kZXggMTMxZjlkMWMuLjNiMmU5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhZDc4NzkuaCIKIAogI2RlZmluZSBBRDc4NzlfUkVHX1pFUk9TCQkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGQ1MDdiOWIuLmRlMzFlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMKaW5kZXggZjVkNjY4NS4uYTU5NmMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX214dF90cy5jCkBAIC05MTAsMTIgKzkxMCwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbmZvLm9iamVjdF9udW07IGkrKykgewogCQlvYmplY3QgPSBkYXRhLT5vYmplY3RfdGFibGUgKyBpOwogCi0JCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsCi0JCQkJIk9iamVjdCBUYWJsZSBFbGVtZW50ICVkKFR5cGUgJWQpXG4iLAorCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJIk9iamVjdFslZF0gKFR5cGUgJWQpXG4iLAogCQkJCWkgKyAxLCBvYmplY3QtPnR5cGUpOworCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAKIAkJaWYgKCFteHRfb2JqZWN0X3JlYWRhYmxlKG9iamVjdC0+dHlwZSkpIHsKLQkJCWNvdW50ICs9IHNwcmludGYoYnVmICsgY291bnQsICJcbiIpOworCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCQkiXG4iKTsKKwkJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC05MjUsMTEgKzkzMCwxNSBAQAogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKIAotCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwKLQkJCQkJIiAgQnl0ZSAlZDogMHgleCAoJWQpXG4iLCBqLCB2YWwsIHZhbCk7CisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJCSJcdFslMmRdOiAlMDJ4ICglZClcbiIsIGosIHZhbCwgdmFsKTsKKwkJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCisJCQkJcmV0dXJuIFBBR0VfU0laRSAtIDE7CiAJCX0KIAotCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiXG4iKTsKKwkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiXG4iKTsKKwkJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKKwkJCXJldHVybiBQQUdFX1NJWkUgLSAxOwogCX0KIAogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX3RzYWRjYy5jCmluZGV4IDQzMmM2OWIuLjEyMmE4NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfdHNhZGNjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF90c2FkY2MuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOwogCX0KIAotCWVyciA9IHJlcXVlc3RfaXJxKHRzX2Rldi0+aXJxLCBhdG1lbF90c2FkY2NfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVyciA9IHJlcXVlc3RfaXJxKHRzX2Rldi0+aXJxLCBhdG1lbF90c2FkY2NfaW50ZXJydXB0LCAwLAogCQkJcGRldi0+ZGV2LmRyaXZlci0+bmFtZSwgdHNfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpcnEuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYnUyMTAxM190cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKaW5kZXggMTUwN2NlMS4uOTAyYzcyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9idTIxMDEzX3RzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9idTIxMDEzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFBFTl9ET1dOX0lOVFIJMAogI2RlZmluZSBNQVhfRklOR0VSUwkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKaW5kZXggMjExODExYS4uNjEwN2U1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYwpAQCAtMzk2LDE0ICszOTYsMTQgQEAKIAlzZXRfR1BJT19JUlFfZWRnZShHUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIEdQSU9fUklTSU5HX0VER0UpOwogCiAJaWYgKHJlcXVlc3RfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIGFjdGlvbl9idXR0b25faGFuZGxlciwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgImgzNjAwX2FjdGlvbiIsIHRzLT5kZXYpKSB7CisJCQlJUlFGX1NIQVJFRCwgImgzNjAwX2FjdGlvbiIsIHRzLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaDM2MDB0cy5jOiBDb3VsZCBub3QgYWxsb2NhdGUgQWN0aW9uIEJ1dHRvbiBJUlEhXG4iKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGZhaWwxOwogCX0KIAogCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBucG93ZXJfYnV0dG9uX2hhbmRsZXIsCi0JCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICJoMzYwMF9zdXNwZW5kIiwgdHMtPmRldikpIHsKKwkJCUlSUUZfU0hBUkVELCAiaDM2MDBfc3VzcGVuZCIsIHRzLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaDM2MDB0cy5jOiBDb3VsZCBub3QgYWxsb2NhdGUgUG93ZXIgQnV0dG9uIElSUSFcbiIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZmFpbDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMKaW5kZXggZGQ0ZThmMC4uNjM5YTYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYwpAQCAtOTMsNyArOTMsNyBAQAogCWhwNjgwX3RzX2Rldi0+cGh5cyA9ICJocDY4MF90cy9pbnB1dDAiOwogCiAJaWYgKHJlcXVlc3RfaXJxKEhQNjgwX1RTX0lSUSwgaHA2ODBfdHNfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgTU9ETkFNRSwgMCkgPCAwKSB7CisJCQkwLCBNT0ROQU1FLCAwKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJocDY4MF90b3VjaHNjcmVlbi5jOiBDYW4ndCBhbGxvY2F0ZSBpcnEgJWRcbiIsCiAJCSAgICAgICBIUDY4MF9UU19JUlEpOwogCQllcnIgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2pvcm5hZGE3MjBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCmluZGV4IDRiMGEwNjEuLjUwMDc2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX0dQSU85LAogCQkJam9ybmFkYTcyMF90c19pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCiAJCQkiSFA3WFggVG91Y2hzY3JlZW4gZHJpdmVyIiwgcGRldik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkhQN1hYIFRTIDogVW5hYmxlIHRvIGFjcXVpcmUgaXJxIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2xwYzMyeHhfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCmluZGV4IGRjZjgwM2YuLjBhNDg0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbHBjMzJ4eF90cy5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dCwgdHNjKTsKIAogCWVycm9yID0gcmVxdWVzdF9pcnEodHNjLT5pcnEsIGxwYzMyeHhfdHNfaW50ZXJydXB0LAotCQkJICAgIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIHRzYyk7CisJCQkgICAgMCwgcGRldi0+bmFtZSwgdHNjKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHJlcXVlc3RpbmcgaW50ZXJydXB0XG4iKTsKIAkJZ290byBlcnJfcHV0X2Nsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tYzEzNzgzX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYwppbmRleCBjNWJjNjJkLi5lZGUwMjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBzdHJ1Y3QgbWMxMzc4M190c19wcml2IHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OwotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzOworCXN0cnVjdCBtYzEzeHh4ICptYzEzeHh4OwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3E7CiAJdW5zaWduZWQgaW50IHNhbXBsZVs0XTsKQEAgLTQ1LDcgKzQ1LDcgQEAKIHsKIAlzdHJ1Y3QgbWMxMzc4M190c19wcml2ICpwcml2ID0gZGF0YTsKIAotCW1jMTM3ODNfaXJxX2Fjayhwcml2LT5tYzEzNzgzLCBpcnEpOworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzeHh4LCBpcnEpOwogCiAJLyoKIAkgKiBLaWNrIG9mZiByZWFkaW5nIGNvb3JkaW5hdGVzLiBOb3RlIHRoYXQgaWYgd29yayBoYXBwZW5zIGFscmVhZHkKQEAgLTEyMSwxMCArMTIxLDEwIEBACiB7CiAJc3RydWN0IG1jMTM3ODNfdHNfcHJpdiAqcHJpdiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWMxMzc4M190c19wcml2LCB3b3JrLndvcmspOwotCXVuc2lnbmVkIGludCBtb2RlID0gTUMxMzc4M19BRENfTU9ERV9UUzsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IE1DMTNYWFhfQURDX01PREVfVFM7CiAJdW5zaWduZWQgaW50IGNoYW5uZWwgPSAxMjsKIAotCWlmIChtYzEzNzgzX2FkY19kb19jb252ZXJzaW9uKHByaXYtPm1jMTM3ODMsCisJaWYgKG1jMTN4eHhfYWRjX2RvX2NvbnZlcnNpb24ocHJpdi0+bWMxM3h4eCwKIAkJCQltb2RlLCBjaGFubmVsLCBwcml2LT5zYW1wbGUpID09IDApCiAJCW1jMTM3ODNfdHNfcmVwb3J0X3NhbXBsZShwcml2KTsKIH0KQEAgLTEzNCwyMSArMTM0LDIxIEBACiAJc3RydWN0IG1jMTM3ODNfdHNfcHJpdiAqcHJpdiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldDsKIAotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CiAKLQltYzEzNzgzX2lycV9hY2socHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfVFMpOworCW1jMTN4eHhfaXJxX2Fjayhwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UUyk7CiAKLQlyZXQgPSBtYzEzNzgzX2lycV9yZXF1ZXN0KHByaXYtPm1jMTM3ODMsIE1DMTM3ODNfSVJRX1RTLAorCXJldCA9IG1jMTN4eHhfaXJxX3JlcXVlc3QocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9JUlFfVFMsCiAJCW1jMTM3ODNfdHNfaGFuZGxlciwgTUMxMzc4M19UU19OQU1FLCBwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXJldCA9IG1jMTM3ODNfcmVnX3Jtdyhwcml2LT5tYzEzNzgzLCBNQzEzNzgzX0FEQzAsCi0JCQlNQzEzNzgzX0FEQzBfVFNNT0RfTUFTSywgTUMxMzc4M19BREMwX1RTTU9EMCk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcm13KHByaXYtPm1jMTN4eHgsIE1DMTNYWFhfQURDMCwKKwkJCU1DMTNYWFhfQURDMF9UU01PRF9NQVNLLCBNQzEzWFhYX0FEQzBfVFNNT0QwKTsKIAlpZiAocmV0KQotCQltYzEzNzgzX2lycV9mcmVlKHByaXYtPm1jMTM3ODMsIE1DMTM3ODNfSVJRX1RTLCBwcml2KTsKKwkJbWMxM3h4eF9pcnFfZnJlZShwcml2LT5tYzEzeHh4LCBNQzEzWFhYX0lSUV9UUywgcHJpdik7CiBvdXQ6Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTU2LDExICsxNTYsMTEgQEAKIHsKIAlzdHJ1Y3QgbWMxMzc4M190c19wcml2ICpwcml2ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKLQltYzEzNzgzX3JlZ19ybXcocHJpdi0+bWMxMzc4MywgTUMxMzc4M19BREMwLAotCQkJTUMxMzc4M19BREMwX1RTTU9EX01BU0ssIDApOwotCW1jMTM3ODNfaXJxX2ZyZWUocHJpdi0+bWMxMzc4MywgTUMxMzc4M19JUlFfVFMsIHByaXYpOwotCW1jMTM3ODNfdW5sb2NrKHByaXYtPm1jMTM3ODMpOworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwltYzEzeHh4X3JlZ19ybXcocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9BREMwLAorCQkJTUMxM1hYWF9BREMwX1RTTU9EX01BU0ssIDApOworCW1jMTN4eHhfaXJxX2ZyZWUocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9JUlFfVFMsIHByaXYpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT53b3JrKTsKIH0KQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQlnb3RvIGVycl9mcmVlX21lbTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53b3JrLCBtYzEzNzgzX3RzX3dvcmspOwotCXByaXYtPm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJcHJpdi0+bWMxM3h4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlwcml2LT5pZGV2ID0gaWRldjsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3Blbm1vdW50LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3Blbm1vdW50LmMKaW5kZXggYzdmOWNlYi4uNGMwMTJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9wZW5tb3VudC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vcGVubW91bnQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIFBlbm1vdW50IHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUmljayBLb2NoIDxuMWdwQGhvdG1haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDExIEpvaG4gU3VuZyA8cGVubW91bnQudG91Y2hAZ21haWwuY29tPgogICoKICAqIEJhc2VkIG9uIEVMTyBkcml2ZXIgKGRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxvLmMpCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVm9qdGVjaCBQYXZsaWsKQEAgLTE4LDEyICsxOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L210Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLSNkZWZpbmUgRFJJVkVSX0RFU0MJIlBlbm1vdW50IHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJQZW5Nb3VudCBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyIgogCiBNT0RVTEVfQVVUSE9SKCJSaWNrIEtvY2ggPG4xZ3BAaG90bWFpbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJKb2huIFN1bmcgPHBlbm1vdW50LnRvdWNoQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTMxLDcgKzM0LDE5IEBACiAgKiBEZWZpbml0aW9ucyAmIGdsb2JhbCBhcnJheXMuCiAgKi8KIAotI2RlZmluZQlQTV9NQVhfTEVOR1RICTUKKyNkZWZpbmUJUE1fTUFYX0xFTkdUSAk2CisjZGVmaW5lCVBNX01BWF9NVFNMT1QJMTYKKyNkZWZpbmUJUE1fMzAwMF9NVFNMT1QJMgorI2RlZmluZQlQTV82MjUwX01UU0xPVAkxMgorCisvKgorICogTXVsdGktdG91Y2ggc2xvdAorICovCisKK3N0cnVjdCBtdF9zbG90IHsKKwl1bnNpZ25lZCBzaG9ydCB4LCB5OworCWJvb2wgYWN0aXZlOyAvKiBpcyB0aGUgdG91Y2ggdmFsaWQ/ICovCit9OwogCiAvKgogICogUGVyLXRvdWNoc2NyZWVuIGRhdGEuCkBAIC00MywyNSArNTgsMTE5IEBACiAJaW50IGlkeDsKIAl1bnNpZ25lZCBjaGFyIGRhdGFbUE1fTUFYX0xFTkdUSF07CiAJY2hhciBwaHlzWzMyXTsKKwl1bnNpZ25lZCBjaGFyIHBhY2tldHNpemU7CisJdW5zaWduZWQgY2hhciBtYXhjb250YWN0czsKKwlzdHJ1Y3QgbXRfc2xvdCBzbG90c1tQTV9NQVhfTVRTTE9UXTsKKwl2b2lkICgqcGFyc2VfcGFja2V0KShzdHJ1Y3QgcG0gKik7CiB9OwogCisvKgorICogcG1fbXRldmVudCgpIHNlbmRzIG10IGV2ZW50cyBhbmQgYWxzbyBlbXVsYXRlcyBwb2ludGVyIG1vdmVtZW50CisgKi8KKworc3RhdGljIHZvaWQgcG1fbXRldmVudChzdHJ1Y3QgcG0gKnBtLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwbS0+bWF4Y29udGFjdHM7ICsraSkgeworCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpKTsKKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXQsIE1UX1RPT0xfRklOR0VSLAorCQkJCXBtLT5zbG90c1tpXS5hY3RpdmUpOworCQlpZiAocG0tPnNsb3RzW2ldLmFjdGl2ZSkgeworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1gsIHBtLT5zbG90c1tpXS54KTsKKwkJCWlucHV0X2V2ZW50KGlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9ZLCBwbS0+c2xvdHNbaV0ueSk7CisJCX0KKwl9CisKKwlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oaW5wdXQsIHRydWUpOworCWlucHV0X3N5bmMoaW5wdXQpOworfQorCisvKgorICogcG1fY2hlY2twYWNrZXQoKSBjaGVja3MgaWYgZGF0YSBwYWNrZXQgaXMgdmFsaWQKKyAqLworCitzdGF0aWMgYm9vbCBwbV9jaGVja3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrZXQpCit7CisJaW50IHRvdGFsID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXRvdGFsICs9IHBhY2tldFtpXTsKKworCXJldHVybiBwYWNrZXRbNV0gPT0gKHVuc2lnbmVkIGNoYXIpfih0b3RhbCAmIDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV85MDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweDgwKSAmJiBwbS0+cGFja2V0c2l6ZSA9PSArK3BtLT5pZHgpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBwbS0+ZGF0YVsxXSAqIDEyOCArIHBtLT5kYXRhWzJdKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBwbS0+ZGF0YVszXSAqIDEyOCArIHBtLT5kYXRhWzRdKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgISEocG0tPmRhdGFbMF0gJiAweDQwKSk7CisJCWlucHV0X3N5bmMoZGV2KTsKKwkJcG0tPmlkeCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV82MDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweGJmKSA9PSAweDMwICYmIHBtLT5wYWNrZXRzaXplID09ICsrcG0tPmlkeCkgeworCQlpZiAocG1fY2hlY2twYWNrZXQocG0tPmRhdGEpKSB7CisJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsCisJCQkJCXBtLT5kYXRhWzJdICogMjU2ICsgcG0tPmRhdGFbMV0pOworCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAorCQkJCQlwbS0+ZGF0YVs0XSAqIDI1NiArIHBtLT5kYXRhWzNdKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIHBtLT5kYXRhWzBdICYgMHg0MCk7CisJCQlpbnB1dF9zeW5jKGRldik7CisJCX0KKwkJcG0tPmlkeCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbV9wYXJzZV8zMDAwKHN0cnVjdCBwbSAqcG0pCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcG0tPmRldjsKKworCWlmICgocG0tPmRhdGFbMF0gJiAweGNlKSA9PSAweDQwICYmIHBtLT5wYWNrZXRzaXplID09ICsrcG0tPmlkeCkgeworCQlpZiAocG1fY2hlY2twYWNrZXQocG0tPmRhdGEpKSB7CisJCQlpbnQgc2xvdG51bSA9IHBtLT5kYXRhWzBdICYgMHgwZjsKKwkJCXBtLT5zbG90c1tzbG90bnVtXS5hY3RpdmUgPSBwbS0+ZGF0YVswXSAmIDB4MzA7CisJCQlwbS0+c2xvdHNbc2xvdG51bV0ueCA9IHBtLT5kYXRhWzJdICogMjU2ICsgcG0tPmRhdGFbMV07CisJCQlwbS0+c2xvdHNbc2xvdG51bV0ueSA9IHBtLT5kYXRhWzRdICogMjU2ICsgcG0tPmRhdGFbM107CisJCQlwbV9tdGV2ZW50KHBtLCBkZXYpOworCQl9CisJCXBtLT5pZHggPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcG1fcGFyc2VfNjI1MChzdHJ1Y3QgcG0gKnBtKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBtLT5kZXY7CisKKwlpZiAoKHBtLT5kYXRhWzBdICYgMHhiMCkgPT0gMHgzMCAmJiBwbS0+cGFja2V0c2l6ZSA9PSArK3BtLT5pZHgpIHsKKwkJaWYgKHBtX2NoZWNrcGFja2V0KHBtLT5kYXRhKSkgeworCQkJaW50IHNsb3RudW0gPSBwbS0+ZGF0YVswXSAmIDB4MGY7CisJCQlwbS0+c2xvdHNbc2xvdG51bV0uYWN0aXZlID0gcG0tPmRhdGFbMF0gJiAweDQwOworCQkJcG0tPnNsb3RzW3Nsb3RudW1dLnggPSBwbS0+ZGF0YVsyXSAqIDI1NiArIHBtLT5kYXRhWzFdOworCQkJcG0tPnNsb3RzW3Nsb3RudW1dLnkgPSBwbS0+ZGF0YVs0XSAqIDI1NiArIHBtLT5kYXRhWzNdOworCQkJcG1fbXRldmVudChwbSwgZGV2KTsKKwkJfQorCQlwbS0+aWR4ID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBwbV9pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKIAkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHBtICpwbSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwbS0+ZGV2OwogCiAJcG0tPmRhdGFbcG0tPmlkeF0gPSBkYXRhOwogCi0JaWYgKHBtLT5kYXRhWzBdICYgMHg4MCkgewotCQlpZiAoUE1fTUFYX0xFTkdUSCA9PSArK3BtLT5pZHgpIHsKLQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgcG0tPmRhdGFbMl0gKiAxMjggKyBwbS0+ZGF0YVsxXSk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHBtLT5kYXRhWzRdICogMTI4ICsgcG0tPmRhdGFbM10pOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgISEocG0tPmRhdGFbMF0gJiAweDQwKSk7Ci0JCQlpbnB1dF9zeW5jKGRldik7Ci0JCQlwbS0+aWR4ID0gMDsKLQkJfQotCX0KKwlwbS0+cGFyc2VfcGFja2V0KHBtKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc0LDE3ICsxODMsMTcgQEAKIHsKIAlzdHJ1Y3QgcG0gKnBtID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOwogCi0JaW5wdXRfZ2V0X2RldmljZShwbS0+ZGV2KTsKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwbS0+ZGV2KTsKIAlzZXJpb19jbG9zZShzZXJpbyk7Ci0Jc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X3B1dF9kZXZpY2UocG0tPmRldik7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwbS0+ZGV2KTsKIAlrZnJlZShwbSk7CisKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CiB9CiAKIC8qCiAgKiBwbV9jb25uZWN0KCkgaXMgdGhlIHJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiBzb21lb25lIGFkZHMgYQotICogbmV3IHNlcmlvIGRldmljZSB0aGF0IHN1cHBvcnRzIEd1bnplIHByb3RvY29sIGFuZCByZWdpc3RlcnMgaXQgYXMKKyAqIG5ldyBzZXJpbyBkZXZpY2UgdGhhdCBzdXBwb3J0cyBQZW5Nb3VudCBwcm90b2NvbCBhbmQgcmVnaXN0ZXJzIGl0IGFzCiAgKiBhbiBpbnB1dCBkZXZpY2UuCiAgKi8KIApAQCAtOTIsNiArMjAxLDcgQEAKIHsKIAlzdHJ1Y3QgcG0gKnBtOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgbWF4X3gsIG1heF95OwogCWludCBlcnI7CiAKIAlwbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbSksIEdGUF9LRVJORUwpOwpAQCAtMTA0LDggKzIxNCw5IEBACiAJcG0tPnNlcmlvID0gc2VyaW87CiAJcG0tPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50ZihwbS0+cGh5cywgc2l6ZW9mKHBtLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKwlwbS0+bWF4Y29udGFjdHMgPSAxOwogCi0JaW5wdXRfZGV2LT5uYW1lID0gIlBlbm1vdW50IFNlcmlhbCBUb3VjaFNjcmVlbiI7CisJaW5wdXRfZGV2LT5uYW1lID0gIlBlbk1vdW50IFNlcmlhbCBUb3VjaFNjcmVlbiI7CiAJaW5wdXRfZGV2LT5waHlzID0gcG0tPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1JTMjMyOwogCWlucHV0X2Rldi0+aWQudmVuZG9yID0gU0VSSU9fUEVOTU9VTlQ7CkBAIC0xMTMsMTAgKzIyNCw1MiBAQAogCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAotICAgICAgICBpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7Ci0gICAgICAgIGlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKLSAgICAgICAgaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1gsIDAsIDB4M2ZmLCAwLCAwKTsKLSAgICAgICAgaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1ksIDAsIDB4M2ZmLCAwLCAwKTsKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJc3dpdGNoIChzZXJpby0+aWQuaWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkJcG0tPnBhY2tldHNpemUgPSA1OworCQlwbS0+cGFyc2VfcGFja2V0ID0gcG1fcGFyc2VfOTAwMDsKKwkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHg5MDAwOworCQltYXhfeCA9IG1heF95ID0gMHgzZmY7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlwbS0+cGFja2V0c2l6ZSA9IDY7CisJCXBtLT5wYXJzZV9wYWNrZXQgPSBwbV9wYXJzZV82MDAwOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDYwMDA7CisJCW1heF94ID0gbWF4X3kgPSAweDNmZjsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXBtLT5wYWNrZXRzaXplID0gNjsKKwkJcG0tPnBhcnNlX3BhY2tldCA9IHBtX3BhcnNlXzMwMDA7CisJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MzAwMDsKKwkJbWF4X3ggPSBtYXhfeSA9IDB4N2ZmOworCQlwbS0+bWF4Y29udGFjdHMgPSBQTV8zMDAwX01UU0xPVDsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBtLT5wYWNrZXRzaXplID0gNjsKKwkJcG0tPnBhcnNlX3BhY2tldCA9IHBtX3BhcnNlXzYyNTA7CisJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4NjI1MDsKKwkJbWF4X3ggPSBtYXhfeSA9IDB4M2ZmOworCQlwbS0+bWF4Y29udGFjdHMgPSBQTV82MjUwX01UU0xPVDsKKwkJYnJlYWs7CisJfQorCisJaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwgQUJTX1gsIDAsIG1heF94LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwbS0+ZGV2LCBBQlNfWSwgMCwgbWF4X3ksIDAsIDApOworCisJaWYgKHBtLT5tYXhjb250YWN0cyA+IDEpIHsKKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhwbS0+ZGV2LCBwbS0+bWF4Y29udGFjdHMpOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwbS0+ZGV2LAorCQkJCSAgICAgQUJTX01UX1BPU0lUSU9OX1gsIDAsIG1heF94LCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMocG0tPmRldiwKKwkJCQkgICAgIEFCU19NVF9QT1NJVElPTl9ZLCAwLCBtYXhfeSwgMCwgMCk7CisJfQogCiAJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHBtKTsKIApAQCAtMTU1LDcgKzMwOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2VyaW9fZHJpdmVyIHBtX2RydiA9IHsKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicGVubW91bnRscGMiLAorCQkubmFtZQk9ICJzZXJpby1wZW5tb3VudCIsCiAJfSwKIAkuZGVzY3JpcHRpb24JPSBEUklWRVJfREVTQywKIAkuaWRfdGFibGUJPSBwbV9zZXJpb19pZHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3MzYzI0MTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCmluZGV4IDhmZWI3ZjMuLjY0Y2U2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vczNjMjQxMF90cy5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAl0cy5zaGlmdCA9IGluZm8tPm92ZXJzYW1wbGluZ19zaGlmdDsKIAl0cy5mZWF0dXJlcyA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldiktPmRyaXZlcl9kYXRhOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEodHMuaXJxX3RjLCBzdHlsdXNfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKHRzLmlycV90Yywgc3R5bHVzX2lycSwgMCwKIAkJCSAgInMzYzI0MTBfdHNfcGVuIiwgdHMuaW5wdXQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IFRDIGludGVycnVwdFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCmluZGV4IGZhZGMxMTUuLjFmNjc0Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCkBAIC02Niw3ICs2Niw2IEBACiBzdHJ1Y3QgdHNjMjAwNyB7CiAJc3RydWN0IGlucHV0X2RldgkqaW5wdXQ7CiAJY2hhcgkJCXBoeXNbMzJdOwotCXN0cnVjdCBkZWxheWVkX3dvcmsJd29yazsKIAogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAKQEAgLTc2LDkgKzc1LDExIEBACiAJdW5zaWduZWQgbG9uZwkJcG9sbF9kZWxheTsKIAl1bnNpZ25lZCBsb25nCQlwb2xsX3BlcmlvZDsKIAotCWJvb2wJCQlwZW5kb3duOwogCWludAkJCWlycTsKIAorCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisJYm9vbAkJCXN0b3BwZWQ7CisKIAlpbnQJCQkoKmdldF9wZW5kb3duX3N0YXRlKSh2b2lkKTsKIAl2b2lkCQkJKCpjbGVhcl9wZW5pcnEpKHZvaWQpOwogfTsKQEAgLTE0MSwyNSArMTQyLDggQEAKIAlyZXR1cm4gcnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRzYzIwMDdfc2VuZF91cF9ldmVudChzdHJ1Y3QgdHNjMjAwNyAqdHNjKQorc3RhdGljIGJvb2wgdHNjMjAwN19pc19wZW5fZG93bihzdHJ1Y3QgdHNjMjAwNyAqdHMpCiB7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0c2MtPmlucHV0OwotCi0JZGV2X2RiZygmdHNjLT5jbGllbnQtPmRldiwgIlVQXG4iKTsKLQotCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMCk7Ci0JaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCAwKTsKLQlpbnB1dF9zeW5jKGlucHV0KTsKLX0KLQotc3RhdGljIHZvaWQgdHNjMjAwN193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHNjMjAwNyAqdHMgPQotCQljb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLCBzdHJ1Y3QgdHNjMjAwNywgd29yayk7Ci0JYm9vbCBkZWJvdW5jZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgdHNfZXZlbnQgdGM7Ci0JdTMyIHJ0OwotCiAJLyoKIAkgKiBOT1RFOiBXZSBjYW4ndCByZWx5IG9uIHRoZSBwcmVzc3VyZSB0byBkZXRlcm1pbmUgdGhlIHBlbiBkb3duCiAJICogc3RhdGUsIGV2ZW4gdGhvdWdoIHRoaXMgY29udHJvbGxlciBoYXMgYSBwcmVzc3VyZSBzZW5zb3IuCkBAIC0xNzAsOTcgKzE1NCwxMjMgQEAKIAkgKiBUaGUgb25seSBzYWZlIHdheSB0byBjaGVjayBmb3IgdGhlIHBlbiB1cCBjb25kaXRpb24gaXMgaW4gdGhlCiAJICogd29yayBmdW5jdGlvbiBieSByZWFkaW5nIHRoZSBwZW4gc2lnbmFsIHN0YXRlIChpdCdzIGEgR1BJTwogCSAqIGFuZCBJUlEpLiBVbmZvcnR1bmF0ZWx5IHN1Y2ggY2FsbGJhY2sgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsCi0JICogaW4gdGhhdCBjYXNlIHdlIGhhdmUgcmVseSBvbiB0aGUgcHJlc3N1cmUgYW55d2F5LgorCSAqIGluIHRoYXQgY2FzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgcGVuIGlzIGRvd24gYW5kIGV4cGVjdCBjYWxsZXIKKwkgKiB0byBmYWxsIGJhY2sgb24gdGhlIHByZXNzdXJlIHJlYWRpbmcuCiAJICovCi0JaWYgKHRzLT5nZXRfcGVuZG93bl9zdGF0ZSkgewotCQlpZiAodW5saWtlbHkoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSgpKSkgewotCQkJdHNjMjAwN19zZW5kX3VwX2V2ZW50KHRzKTsKLQkJCXRzLT5wZW5kb3duID0gZmFsc2U7Ci0JCQlnb3RvIG91dDsKLQkJfQogCi0JCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBlbiBpcyBzdGlsbCBkb3duXG4iKTsKLQl9CisJaWYgKCF0cy0+Z2V0X3BlbmRvd25fc3RhdGUpCisJCXJldHVybiB0cnVlOwogCi0JdHNjMjAwN19yZWFkX3ZhbHVlcyh0cywgJnRjKTsKLQotCXJ0ID0gdHNjMjAwN19jYWxjdWxhdGVfcHJlc3N1cmUodHMsICZ0Yyk7Ci0JaWYgKHJ0ID4gdHMtPm1heF9ydCkgewotCQkvKgotCQkgKiBTYW1wbGUgZm91bmQgaW5jb25zaXN0ZW50IGJ5IGRlYm91bmNpbmcgb3IgcHJlc3N1cmUgaXMKLQkJICogYmV5b25kIHRoZSBtYXhpbXVtLiBEb24ndCByZXBvcnQgaXQgdG8gdXNlciBzcGFjZSwKLQkJICogcmVwZWF0IGF0IGxlYXN0IG9uY2UgbW9yZSB0aGUgbWVhc3VyZW1lbnQuCi0JCSAqLwotCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJpZ25vcmVkIHByZXNzdXJlICVkXG4iLCBydCk7Ci0JCWRlYm91bmNlZCA9IHRydWU7Ci0JCWdvdG8gb3V0OwotCi0JfQotCi0JaWYgKHJ0KSB7Ci0JCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gdHMtPmlucHV0OwotCi0JCWlmICghdHMtPnBlbmRvd24pIHsKLQkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgIkRPV05cbiIpOwotCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOwotCQkJdHMtPnBlbmRvd24gPSB0cnVlOwotCQl9Ci0KLQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHRjLngpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWSwgdGMueSk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgcnQpOwotCi0JCWlucHV0X3N5bmMoaW5wdXQpOwotCi0JCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBvaW50KCU0ZCwlNGQpLCBwcmVzc3VyZSAoJTR1KVxuIiwKLQkJCXRjLngsIHRjLnksIHJ0KTsKLQotCX0gZWxzZSBpZiAoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSAmJiB0cy0+cGVuZG93bikgewotCQkvKgotCQkgKiBXZSBkb24ndCBoYXZlIGNhbGxiYWNrIHRvIGNoZWNrIHBlbmRvd24gc3RhdGUsIHNvIHdlCi0JCSAqIGhhdmUgdG8gYXNzdW1lIHRoYXQgc2luY2UgcHJlc3N1cmUgcmVwb3J0ZWQgaXMgMCB0aGUKLQkJICogcGVuIHdhcyBsaWZ0ZWQgdXAuCi0JCSAqLwotCQl0c2MyMDA3X3NlbmRfdXBfZXZlbnQodHMpOwotCQl0cy0+cGVuZG93biA9IGZhbHNlOwotCX0KLQotIG91dDoKLQlpZiAodHMtPnBlbmRvd24gfHwgZGVib3VuY2VkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRzLT53b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHMtPnBvbGxfcGVyaW9kKSk7Ci0JZWxzZQotCQllbmFibGVfaXJxKHRzLT5pcnEpOworCXJldHVybiB0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHRzYzIwMDdfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2MyMDA3X3NvZnRfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBoYW5kbGU7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cy0+aW5wdXQ7CisJc3RydWN0IHRzX2V2ZW50IHRjOworCXUzMiBydDsKIAotCWlmICghdHMtPmdldF9wZW5kb3duX3N0YXRlIHx8IGxpa2VseSh0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKSkpIHsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKHRzLT5pcnEpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRzLT53b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHMtPnBvbGxfZGVsYXkpKTsKKwl3aGlsZSAoIXRzLT5zdG9wcGVkICYmIHRzYzIwMDdfaXNfcGVuX2Rvd24odHMpKSB7CisKKwkJLyogcGVuIGlzIGRvd24sIGNvbnRpbnVlIHdpdGggdGhlIG1lYXN1cmVtZW50ICovCisJCXRzYzIwMDdfcmVhZF92YWx1ZXModHMsICZ0Yyk7CisKKwkJcnQgPSB0c2MyMDA3X2NhbGN1bGF0ZV9wcmVzc3VyZSh0cywgJnRjKTsKKworCQlpZiAocnQgPT0gMCAmJiAhdHMtPmdldF9wZW5kb3duX3N0YXRlKSB7CisJCQkvKgorCQkJICogSWYgcHJlc3N1cmUgcmVwb3J0ZWQgaXMgMCBhbmQgd2UgZG9uJ3QgaGF2ZQorCQkJICogY2FsbGJhY2sgdG8gY2hlY2sgcGVuZG93biBzdGF0ZSwgd2UgaGF2ZSB0bworCQkJICogYXNzdW1lIHRoYXQgcGVuIHdhcyBsaWZ0ZWQgdXAuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJ0IDw9IHRzLT5tYXhfcnQpIHsKKwkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwKKwkJCQkiRE9XTiBwb2ludCglNGQsJTRkKSwgcHJlc3N1cmUgKCU0dSlcbiIsCisJCQkJdGMueCwgdGMueSwgcnQpOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHRjLngpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1ksIHRjLnkpOworCQkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCBydCk7CisKKwkJCWlucHV0X3N5bmMoaW5wdXQpOworCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU2FtcGxlIGZvdW5kIGluY29uc2lzdGVudCBieSBkZWJvdW5jaW5nIG9yIHByZXNzdXJlIGlzCisJCQkgKiBiZXlvbmQgdGhlIG1heGltdW0uIERvbid0IHJlcG9ydCBpdCB0byB1c2VyIHNwYWNlLAorCQkJICogcmVwZWF0IGF0IGxlYXN0IG9uY2UgbW9yZSB0aGUgbWVhc3VyZW1lbnQuCisJCQkgKi8KKwkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgImlnbm9yZWQgcHJlc3N1cmUgJWRcbiIsIHJ0KTsKKwkJfQorCisJCXdhaXRfZXZlbnRfdGltZW91dCh0cy0+d2FpdCwgdHMtPnN0b3BwZWQsCisJCQkJICAgbXNlY3NfdG9famlmZmllcyh0cy0+cG9sbF9wZXJpb2QpKTsKIAl9CiAKKwlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJVUFxuIik7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDApOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgMCk7CisJaW5wdXRfc3luYyhpbnB1dCk7CisKIAlpZiAodHMtPmNsZWFyX3BlbmlycSkKIAkJdHMtPmNsZWFyX3BlbmlycSgpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCB0c2MyMDA3X2ZyZWVfaXJxKHN0cnVjdCB0c2MyMDA3ICp0cykKK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2MyMDA3X2hhcmRfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKIHsKLQlmcmVlX2lycSh0cy0+aXJxLCB0cyk7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdHMtPndvcmspKSB7Ci0JCS8qCi0JCSAqIFdvcmsgd2FzIHBlbmRpbmcsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGVuYWJsZQotCQkgKiBJUlEgaGVyZSB0byBiYWxhbmNlIHRoZSBkaXNhYmxlX2lycSgpIGRvbmUgaW4gdGhlCi0JCSAqIGludGVycnVwdCBoYW5kbGVyLgotCQkgKi8KLQkJZW5hYmxlX2lycSh0cy0+aXJxKTsKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBoYW5kbGU7CisKKwlpZiAoIXRzLT5nZXRfcGVuZG93bl9zdGF0ZSB8fCBsaWtlbHkodHMtPmdldF9wZW5kb3duX3N0YXRlKCkpKQorCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCisJaWYgKHRzLT5jbGVhcl9wZW5pcnEpCisJCXRzLT5jbGVhcl9wZW5pcnEoKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHNjMjAwN19zdG9wKHN0cnVjdCB0c2MyMDA3ICp0cykKK3sKKwl0cy0+c3RvcHBlZCA9IHRydWU7CisJbWIoKTsKKwl3YWtlX3VwKCZ0cy0+d2FpdCk7CisKKwlkaXNhYmxlX2lycSh0cy0+aXJxKTsKK30KKworc3RhdGljIGludCB0c2MyMDA3X29wZW4oc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2KQoreworCXN0cnVjdCB0c2MyMDA3ICp0cyA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7CisJaW50IGVycjsKKworCXRzLT5zdG9wcGVkID0gZmFsc2U7CisJbWIoKTsKKworCWVuYWJsZV9pcnEodHMtPmlycSk7CisKKwkvKiBQcmVwYXJlIGZvciB0b3VjaCByZWFkaW5ncyAtIHBvd2VyIGRvd24gQURDIGFuZCBlbmFibGUgUEVOSVJRICovCisJZXJyID0gdHNjMjAwN194ZmVyKHRzLCBQV1JET1dOKTsKKwlpZiAoZXJyIDwgMCkgeworCQl0c2MyMDA3X3N0b3AodHMpOworCQlyZXR1cm4gZXJyOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0c2MyMDA3X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldikKK3sKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShpbnB1dF9kZXYpOworCisJdHNjMjAwN19zdG9wKHRzKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdHNjMjAwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjkwLDcgKzMwMCw3IEBACiAJdHMtPmNsaWVudCA9IGNsaWVudDsKIAl0cy0+aXJxID0gY2xpZW50LT5pcnE7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OwotCUlOSVRfREVMQVlFRF9XT1JLKCZ0cy0+d29yaywgdHNjMjAwN193b3JrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0cy0+d2FpdCk7CiAKIAl0cy0+bW9kZWwgICAgICAgICAgICAgPSBwZGF0YS0+bW9kZWw7CiAJdHMtPnhfcGxhdGVfb2htcyAgICAgID0gcGRhdGEtPnhfcGxhdGVfb2htczsKQEAgLTMwMCw2ICszMTAsMTIgQEAKIAl0cy0+Z2V0X3BlbmRvd25fc3RhdGUgPSBwZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGU7CiAJdHMtPmNsZWFyX3BlbmlycSAgICAgID0gcGRhdGEtPmNsZWFyX3BlbmlycTsKIAorCWlmIChwZGF0YS0+eF9wbGF0ZV9vaG1zID09IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ4X3BsYXRlX29obXMgaXMgbm90IHNldCB1cCBpbiBwbGF0Zm9ybSBkYXRhIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKwogCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLAogCQkgIiVzL2lucHV0MCIsIGRldl9uYW1lKCZjbGllbnQtPmRldikpOwogCkBAIC0zMDcsNiArMzIzLDExIEBACiAJaW5wdXRfZGV2LT5waHlzID0gdHMtPnBoeXM7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKIAorCWlucHV0X2Rldi0+b3BlbiA9IHRzYzIwMDdfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gdHNjMjAwN19jbG9zZTsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgdHMpOworCiAJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOwogCWlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKIApAQCAtMzE4LDE3ICszMzksMTQgQEAKIAlpZiAocGRhdGEtPmluaXRfcGxhdGZvcm1faHcpCiAJCXBkYXRhLT5pbml0X3BsYXRmb3JtX2h3KCk7CiAKLQllcnIgPSByZXF1ZXN0X2lycSh0cy0+aXJxLCB0c2MyMDA3X2lycSwgMCwKLQkJCWNsaWVudC0+ZGV2LmRyaXZlci0+bmFtZSwgdHMpOworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHRzLT5pcnEsIHRzYzIwMDdfaGFyZF9pcnEsIHRzYzIwMDdfc29mdF9pcnEsCisJCQkJICAgSVJRRl9PTkVTSE9ULCBjbGllbnQtPmRldi5kcml2ZXItPm5hbWUsIHRzKTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlycSAlZCBidXN5P1xuIiwgdHMtPmlycSk7CiAJCWdvdG8gZXJyX2ZyZWVfbWVtOwogCX0KIAotCS8qIFByZXBhcmUgZm9yIHRvdWNoIHJlYWRpbmdzIC0gcG93ZXIgZG93biBBREMgYW5kIGVuYWJsZSBQRU5JUlEgKi8KLQllcnIgPSB0c2MyMDA3X3hmZXIodHMsIFBXUkRPV04pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycl9mcmVlX2lycTsKKwl0c2MyMDA3X3N0b3AodHMpOwogCiAJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAJaWYgKGVycikKQEAgLTMzOSw3ICszNTcsNyBAQAogCXJldHVybiAwOwogCiAgZXJyX2ZyZWVfaXJxOgotCXRzYzIwMDdfZnJlZV9pcnEodHMpOworCWZyZWVfaXJxKHRzLT5pcnEsIHRzKTsKIAlpZiAocGRhdGEtPmV4aXRfcGxhdGZvcm1faHcpCiAJCXBkYXRhLT5leGl0X3BsYXRmb3JtX2h3KCk7CiAgZXJyX2ZyZWVfbWVtOgpAQCAtMzUzLDcgKzM3MSw3IEBACiAJc3RydWN0IHRzYzIwMDcJKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JdHNjMjAwN19mcmVlX2lycSh0cyk7CisJZnJlZV9pcnEodHMtPmlycSwgdHMpOwogCiAJaWYgKHBkYXRhLT5leGl0X3BsYXRmb3JtX2h3KQogCQlwZGF0YS0+ZXhpdF9wbGF0Zm9ybV9odygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2M0MC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2M0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDVlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzQwLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBUU0MtNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aAorICogVFNDLTEwIGFuZCAyNS4KKyAqCisgKiBBdXRob3I6IFNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vhc3lAbGludXRyb25peC5kZT4KKyAqIExpY2Vuc2U6IEdQTHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRlNGLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBQQUNLRVRfTEVOR1RIICA1CitzdHJ1Y3QgdHNjX3NlciB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCBzZXJpbyAqc2VyaW87CisJdTMyIGlkeDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbUEFDS0VUX0xFTkdUSF07CisJY2hhciBwaHlzWzMyXTsKK307CisKK3N0YXRpYyB2b2lkIHRzY19wcm9jZXNzX2RhdGEoc3RydWN0IHRzY19zZXIgKnB0c2MpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHRzYy0+ZGV2OworCXU4ICpkYXRhID0gcHRzYy0+ZGF0YTsKKwl1MzIgeDsKKwl1MzIgeTsKKworCXggPSAoKGRhdGFbMV0gJiAweDAzKSA8PCA4KSB8IGRhdGFbMl07CisJeSA9ICgoZGF0YVszXSAmIDB4MDMpIDw8IDgpIHwgZGF0YVs0XTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAxKTsKKworCWlucHV0X3N5bmMoZGV2KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRzY19pbnRlcnJ1cHQoc3RydWN0IHNlcmlvICpzZXJpbywKKwkJdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHRzY19zZXIgKnB0c2MgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHRzYy0+ZGV2OworCisJcHRzYy0+ZGF0YVtwdHNjLT5pZHhdID0gZGF0YTsKKwlzd2l0Y2ggKHB0c2MtPmlkeCsrKSB7CisJY2FzZSAwOgorCQlpZiAodW5saWtlbHkoKGRhdGEgJiAweDNlKSAhPSAweDEwKSkgeworCQkJZGV2X2RiZygmc2VyaW8tPmRldiwKKwkJCQkidW5zeW5jaHJvbml6ZWQgcGFja2V0IHN0YXJ0ICgweCUwMngpXG4iLCBkYXRhKTsKKwkJCXB0c2MtPmlkeCA9IDA7CisJCX0gZWxzZSBpZiAoIShkYXRhICYgMHgwMSkpIHsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIDApOworCQkJaW5wdXRfc3luYyhkZXYpOworCQkJcHRzYy0+aWR4ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMToKKwljYXNlIDM6CisJCWlmICh1bmxpa2VseShkYXRhICYgMHhmYykpIHsKKwkJCWRldl9kYmcoJnNlcmlvLT5kZXYsCisJCQkJInVuc3luY2hyb25pemVkIGRhdGEgMHglMDJ4IGF0IG9mZnNldCAlZFxuIiwKKwkJCQlkYXRhLCBwdHNjLT5pZHggLSAxKTsKKwkJCXB0c2MtPmlkeCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCXRzY19wcm9jZXNzX2RhdGEocHRzYyk7CisJCXB0c2MtPmlkeCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0c2NfY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHRzY19zZXIgKnB0c2M7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKworCXB0c2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHNjX3NlciksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghcHRzYyB8fCAhaW5wdXRfZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlwdHNjLT5zZXJpbyA9IHNlcmlvOworCXB0c2MtPmRldiA9IGlucHV0X2RldjsKKwlzbnByaW50ZihwdHNjLT5waHlzLCBzaXplb2YocHRzYy0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiVFNDLTEwLzI1LzQwIFNlcmlhbCBUb3VjaFNjcmVlbiI7CisJaW5wdXRfZGV2LT5waHlzID0gcHRzYy0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUlMyMzI7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBTRVJJT19UU0M0MDsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSA0MDsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAwMDE7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnNlcmlvLT5kZXY7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXRfZGV2LT5rZXliaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHB0c2MtPmRldiwgQUJTX1gsIDAsIDB4M2ZmLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhwdHNjLT5kZXYsIEFCU19ZLCAwLCAweDNmZiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocHRzYy0+ZGV2LCBBQlNfUFJFU1NVUkUsIDAsIDAsIDAsIDApOworCisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHB0c2MpOworCisJZXJyb3IgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsMjsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHB0c2MtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CisKK2ZhaWwzOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2ZhaWwyOgorCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKK2ZhaWwxOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUocHRzYyk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCB0c2NfZGlzY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCXN0cnVjdCB0c2Nfc2VyICpwdHNjID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJc2VyaW9fY2xvc2Uoc2VyaW8pOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHRzYy0+ZGV2KTsKKwlrZnJlZShwdHNjKTsKKworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgdHNjX3NlcmlvX2lkc1tdID0geworCXsKKwkJLnR5cGUgICA9IFNFUklPX1JTMjMyLAorCQkucHJvdG8gID0gU0VSSU9fVFNDNDAsCisJCS5pZCAgICAgPSBTRVJJT19BTlksCisJCS5leHRyYSAgPSBTRVJJT19BTlksCisJfSwKKwl7IDAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc2VyaW8sIHRzY19zZXJpb19pZHMpOworCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICJUU0MtMTAvMjUvNDAgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlciIKKworc3RhdGljIHN0cnVjdCBzZXJpb19kcml2ZXIgdHNjX2RydiA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZSAgID0gInRzYzQwIiwKKwl9LAorCS5kZXNjcmlwdGlvbiAgICA9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZQk9IHRzY19zZXJpb19pZHMsCisJLmludGVycnVwdCAgICAgID0gdHNjX2ludGVycnVwdCwKKwkuY29ubmVjdAk9IHRzY19jb25uZWN0LAorCS5kaXNjb25uZWN0ICAgICA9IHRzY19kaXNjb25uZWN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHNjX3Nlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdHNjX2Rydik7Cit9Cittb2R1bGVfaW5pdCh0c2Nfc2VyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHNjX2V4aXQodm9pZCkKK3sKKwlzZXJpb191bnJlZ2lzdGVyX2RyaXZlcigmdHNjX2Rydik7Cit9Cittb2R1bGVfZXhpdCh0c2NfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vhc3lAbGludXRyb25peC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3c5MHA5MTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCmluZGV4IDdhNDVkNjguLjIxN2FhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdzkwcDkxMF90cy5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCXc5MHA5MTBfdHMtPmlycV9udW0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChyZXF1ZXN0X2lycSh3OTBwOTEwX3RzLT5pcnFfbnVtLCB3OTBwOTEwX3RzX2ludGVycnVwdCwKLQkJCUlSUUZfRElTQUJMRUQsICJ3OTBwOTEwdHMiLCB3OTBwOTEwX3RzKSkgeworCQkJMCwgInc5MHA5MTB0cyIsIHc5MHA5MTBfdHMpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmYWlsNDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMKaW5kZXggOTk0MWQzOS4uMTU2OWEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYwpAQCAtMzY3LDYgKzM2NywyMCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCB3ODAwMV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdzgwMDEgKnc4MDAxID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfU1RBUlQsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgdzgwMDFfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB3ODAwMSAqdzgwMDEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJdzgwMDFfY29tbWFuZCh3ODAwMSwgVzgwMDFfQ01EX1NUT1AsIGZhbHNlKTsKK30KKwogc3RhdGljIGludCB3ODAwMV9zZXR1cChzdHJ1Y3QgdzgwMDEgKnc4MDAxKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHc4MDAxLT5kZXY7CkBAIC00NzYsNyArNDkwLDcgQEAKIAogCXN0cmxjYXQodzgwMDEtPm5hbWUsICIgVG91Y2hzY3JlZW4iLCBzaXplb2YodzgwMDEtPm5hbWUpKTsKIAotCXJldHVybiB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfU1RBUlQsIGZhbHNlKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ4NywxMiArNTAxLDEyIEBACiB7CiAJc3RydWN0IHc4MDAxICp3ODAwMSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAotCWlucHV0X2dldF9kZXZpY2UodzgwMDEtPmRldik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJc2VyaW9fY2xvc2Uoc2VyaW8pOwotCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9wdXRfZGV2aWNlKHc4MDAxLT5kZXYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJa2ZyZWUodzgwMDEpOworCisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwogfQogCiAvKgpAQCAtNTM2LDYgKzU1MCwxMSBAQAogCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKIAorCWlucHV0X2Rldi0+b3BlbiA9IHc4MDAxX29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IHc4MDAxX2Nsb3NlOworCisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB3ODAwMSk7CisKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvS2NvbmZpZyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwppbmRleCA3ZDdlYWExLi41NDE0MjUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwpAQCAtMTEyLDQgKzExMiwyMyBAQAogCSAgVG8gdXNlIHgyYXBpYyBtb2RlIGluIHRoZSBDUFUncyB3aGljaCBzdXBwb3J0IHgyQVBJQyBlbmhhbmNlbWVudHMgb3IKIAkgIHRvIHN1cHBvcnQgcGxhdGZvcm1zIHdpdGggQ1BVJ3MgaGF2aW5nID4gOCBiaXQgQVBJQyBJRCwgc2F5IFkuCiAKKyMgT01BUCBJT01NVSBzdXBwb3J0Citjb25maWcgT01BUF9JT01NVQorCWJvb2wgIk9NQVAgSU9NTVUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUAorCXNlbGVjdCBJT01NVV9BUEkKKworY29uZmlnIE9NQVBfSU9WTU0KKwl0cmlzdGF0ZSAiT01BUCBJTyBWaXJ0dWFsIE1lbW9yeSBNYW5hZ2VyIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBPTUFQX0lPTU1VCisKK2NvbmZpZyBPTUFQX0lPTU1VX0RFQlVHCisgICAgICAgdHJpc3RhdGUgIkV4cG9ydCBPTUFQIElPTU1VL0lPVk1NIGludGVybmFscyBpbiBEZWJ1Z0ZTIgorICAgICAgIGRlcGVuZHMgb24gT01BUF9JT1ZNTSAmJiBERUJVR19GUworICAgICAgIGhlbHAKKyAgICAgICAgIFNlbGVjdCB0aGlzIHRvIHNlZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBPTUFQIElPTU1VL0lPVk1NIGluIGRlYnVnZnMuCisKKyAgICAgICAgIFNheSBOIHVubGVzcyB5b3Uga25vdyB5b3UgbmVlZCB0aGlzLgorCiBlbmRpZiAjIElPTU1VX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUgYi9kcml2ZXJzL2lvbW11L01ha2VmaWxlCmluZGV4IDYzOTQ5OTRhLi4yZjQ0NDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKQEAgLTQsMyArNCw2IEBACiBvYmotJChDT05GSUdfRE1BUl9UQUJMRSkgKz0gZG1hci5vCiBvYmotJChDT05GSUdfSU5URUxfSU9NTVUpICs9IGlvdmEubyBpbnRlbC1pb21tdS5vCiBvYmotJChDT05GSUdfSVJRX1JFTUFQKSArPSBpbnRyX3JlbWFwcGluZy5vCitvYmotJChDT05GSUdfT01BUF9JT01NVSkgKz0gb21hcC1pb21tdS5vCitvYmotJChDT05GSUdfT01BUF9JT1ZNTSkgKz0gb21hcC1pb3ZtbS5vCitvYmotJChDT05GSUdfT01BUF9JT01NVV9ERUJVRykgKz0gb21hcC1pb21tdS1kZWJ1Zy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwppbmRleCAwZTQyMjdmLi40ZWUyNzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKQEAgLTEyODMsNyArMTI4Myw3IEBACiAJCWlmICghcHRlIHx8ICFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKIAkJCWNvbnRpbnVlOwogCi0JCWRtYV9vcHNfcmVzZXJ2ZV9hZGRyZXNzZXMoZG1hX2RvbSwgaSA8PCBQQUdFX1NISUZULCAxKTsKKwkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBpID4+IFBBR0VfU0hJRlQsIDEpOwogCX0KIAogCXVwZGF0ZV9kb21haW4oJmRtYV9kb20tPmRvbWFpbik7CkBAIC0yNDk1LDcgKzI0OTUsNyBAQAogCiB2b2lkIF9faW5pdCBhbWRfaW9tbXVfaW5pdF9hcGkodm9pZCkKIHsKLQlyZWdpc3Rlcl9pb21tdSgmYW1kX2lvbW11X29wcyk7CisJYnVzX3NldF9pb21tdSgmcGNpX2J1c190eXBlLCAmYW1kX2lvbW11X29wcyk7CiB9CiAKIGludCBfX2luaXQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCmluZGV4IGJlMTk1M2MuLmMwYzc4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM2NDIsNyArMzY0Myw3IEBACiAKIAlpbml0X2lvbW11X3BtX29wcygpOwogCi0JcmVnaXN0ZXJfaW9tbXUoJmludGVsX2lvbW11X29wcyk7CisJYnVzX3NldF9pb21tdSgmcGNpX2J1c190eXBlLCAmaW50ZWxfaW9tbXVfb3BzKTsKIAogCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmZGV2aWNlX25iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCmluZGV4IDZlNmI2YTEuLjJmYjI5NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2lvbW11LmMKQEAgLTE2LDYgKzE2LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjMsMzIgKzI1LDc4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgogCi1zdGF0aWMgc3RydWN0IGlvbW11X29wcyAqaW9tbXVfb3BzOwotCi12b2lkIHJlZ2lzdGVyX2lvbW11KHN0cnVjdCBpb21tdV9vcHMgKm9wcykKK3N0YXRpYyB2b2lkIGlvbW11X2J1c19pbml0KHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgaW9tbXVfb3BzICpvcHMpCiB7Ci0JaWYgKGlvbW11X29wcykKLQkJQlVHKCk7Ci0KLQlpb21tdV9vcHMgPSBvcHM7CiB9CiAKLWJvb2wgaW9tbXVfZm91bmQodm9pZCkKKy8qKgorICogYnVzX3NldF9pb21tdSAtIHNldCBpb21tdS1jYWxsYmFja3MgZm9yIHRoZSBidXMKKyAqIEBidXM6IGJ1cy4KKyAqIEBvcHM6IHRoZSBjYWxsYmFja3MgcHJvdmlkZWQgYnkgdGhlIGlvbW11LWRyaXZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFuIGlvbW11IGRyaXZlciB0byBzZXQgdGhlIGlvbW11IG1ldGhvZHMKKyAqIHVzZWQgZm9yIGEgcGFydGljdWxhciBidXMuIERyaXZlcnMgZm9yIGRldmljZXMgb24gdGhhdCBidXMgY2FuIHVzZQorICogdGhlIGlvbW11LWFwaSBhZnRlciB0aGVzZSBvcHMgYXJlIHJlZ2lzdGVyZWQuCisgKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgbmVlZGVkIGJlY2F1c2UgSU9NTVVzIGFyZSB1c3VhbGx5IGRldmljZXMgb24KKyAqIHRoZSBidXMgaXRzZWxmLCBzbyB0aGUgaW9tbXUgZHJpdmVycyBhcmUgbm90IGluaXRpYWxpemVkIHdoZW4gdGhlIGJ1cworICogaXMgc2V0IHVwLiBXaXRoIHRoaXMgZnVuY3Rpb24gdGhlIGlvbW11LWRyaXZlciBjYW4gc2V0IHRoZSBpb21tdS1vcHMKKyAqIGFmdGVyd2FyZHMuCisgKi8KK2ludCBidXNfc2V0X2lvbW11KHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgaW9tbXVfb3BzICpvcHMpCiB7Ci0JcmV0dXJuIGlvbW11X29wcyAhPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfZm91bmQpOworCWlmIChidXMtPmlvbW11X29wcyAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOwogCi1zdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Modm9pZCkKKwlidXMtPmlvbW11X29wcyA9IG9wczsKKworCS8qIERvIElPTU1VIHNwZWNpZmljIHNldHVwIGZvciB0aGlzIGJ1cy10eXBlICovCisJaW9tbXVfYnVzX2luaXQoYnVzLCBvcHMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidXNfc2V0X2lvbW11KTsKKworYm9vbCBpb21tdV9wcmVzZW50KHN0cnVjdCBidXNfdHlwZSAqYnVzKQoreworCXJldHVybiBidXMtPmlvbW11X29wcyAhPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfcHJlc2VudCk7CisKKy8qKgorICogaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIoKSAtIHNldCBhIGZhdWx0IGhhbmRsZXIgZm9yIGFuIGlvbW11IGRvbWFpbgorICogQGRvbWFpbjogaW9tbXUgZG9tYWluCisgKiBAaGFuZGxlcjogZmF1bHQgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgYnkgSU9NTVUgdXNlcnMgd2hpY2ggd2FudCB0byBiZSBub3RpZmllZAorICogd2hlbmV2ZXIgYW4gSU9NTVUgZmF1bHQgaGFwcGVucy4KKyAqCisgKiBUaGUgZmF1bHQgaGFuZGxlciBpdHNlbGYgc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuZCBhbiBhcHByb3ByaWF0ZQorICogZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCQlpb21tdV9mYXVsdF9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlCVUdfT04oIWRvbWFpbik7CisKKwlkb21haW4tPmhhbmRsZXIgPSBoYW5kbGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIpOworCitzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Moc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOwogCWludCByZXQ7CiAKKwlpZiAoYnVzID09IE5VTEwgfHwgYnVzLT5pb21tdV9vcHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKIAlkb21haW4gPSBrbWFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkb21haW4pCiAJCXJldHVybiBOVUxMOwogCi0JcmV0ID0gaW9tbXVfb3BzLT5kb21haW5faW5pdChkb21haW4pOworCWRvbWFpbi0+b3BzID0gYnVzLT5pb21tdV9vcHM7CisKKwlyZXQgPSBkb21haW4tPm9wcy0+ZG9tYWluX2luaXQoZG9tYWluKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC02Myw2MiArMTExLDc4IEBACiAKIHZvaWQgaW9tbXVfZG9tYWluX2ZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQogewotCWlvbW11X29wcy0+ZG9tYWluX2Rlc3Ryb3koZG9tYWluKTsKKwlpZiAobGlrZWx5KGRvbWFpbi0+b3BzLT5kb21haW5fZGVzdHJveSAhPSBOVUxMKSkKKwkJZG9tYWluLT5vcHMtPmRvbWFpbl9kZXN0cm95KGRvbWFpbik7CisKIAlrZnJlZShkb21haW4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfZG9tYWluX2ZyZWUpOwogCiBpbnQgaW9tbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5hdHRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmF0dGFjaF9kZXYgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGRvbWFpbi0+b3BzLT5hdHRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2F0dGFjaF9kZXZpY2UpOwogCiB2b2lkIGlvbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW9tbXVfb3BzLT5kZXRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmRldGFjaF9kZXYgPT0gTlVMTCkpCisJCXJldHVybjsKKworCWRvbWFpbi0+b3BzLT5kZXRhY2hfZGV2KGRvbWFpbiwgZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2RldGFjaF9kZXZpY2UpOwogCiBwaHlzX2FkZHJfdCBpb21tdV9pb3ZhX3RvX3BoeXMoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW92YSkKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5pb3ZhX3RvX3BoeXMoZG9tYWluLCBpb3ZhKTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPmlvdmFfdG9fcGh5cyA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPmlvdmFfdG9fcGh5cyhkb21haW4sIGlvdmEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfaW92YV90b19waHlzKTsKIAogaW50IGlvbW11X2RvbWFpbl9oYXNfY2FwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCSB1bnNpZ25lZCBsb25nIGNhcCkKIHsKLQlyZXR1cm4gaW9tbXVfb3BzLT5kb21haW5faGFzX2NhcChkb21haW4sIGNhcCk7CisJaWYgKHVubGlrZWx5KGRvbWFpbi0+b3BzLT5kb21haW5faGFzX2NhcCA9PSBOVUxMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPmRvbWFpbl9oYXNfY2FwKGRvbWFpbiwgY2FwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X2RvbWFpbl9oYXNfY2FwKTsKIAogaW50IGlvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwKIAkgICAgICBwaHlzX2FkZHJfdCBwYWRkciwgaW50IGdmcF9vcmRlciwgaW50IHByb3QpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbnZhbGlkX21hc2s7CiAJc2l6ZV90IHNpemU7CiAKLQlzaXplICAgICAgICAgPSAweDEwMDBVTCA8PCBnZnBfb3JkZXI7Ci0JaW52YWxpZF9tYXNrID0gc2l6ZSAtIDE7CisJaWYgKHVubGlrZWx5KGRvbWFpbi0+b3BzLT5tYXAgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PREVWOwogCi0JQlVHX09OKChpb3ZhIHwgcGFkZHIpICYgaW52YWxpZF9tYXNrKTsKKwlzaXplICAgICAgICAgPSBQQUdFX1NJWkUgPDwgZ2ZwX29yZGVyOwogCi0JcmV0dXJuIGlvbW11X29wcy0+bWFwKGRvbWFpbiwgaW92YSwgcGFkZHIsIGdmcF9vcmRlciwgcHJvdCk7CisJQlVHX09OKCFJU19BTElHTkVEKGlvdmEgfCBwYWRkciwgc2l6ZSkpOworCisJcmV0dXJuIGRvbWFpbi0+b3BzLT5tYXAoZG9tYWluLCBpb3ZhLCBwYWRkciwgZ2ZwX29yZGVyLCBwcm90KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X21hcCk7CiAKIGludCBpb21tdV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGdmcF9vcmRlcikKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsaWRfbWFzazsKIAlzaXplX3Qgc2l6ZTsKIAotCXNpemUgICAgICAgICA9IDB4MTAwMFVMIDw8IGdmcF9vcmRlcjsKLQlpbnZhbGlkX21hc2sgPSBzaXplIC0gMTsKKwlpZiAodW5saWtlbHkoZG9tYWluLT5vcHMtPnVubWFwID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCUJVR19PTihpb3ZhICYgaW52YWxpZF9tYXNrKTsKKwlzaXplICAgICAgICAgPSBQQUdFX1NJWkUgPDwgZ2ZwX29yZGVyOwogCi0JcmV0dXJuIGlvbW11X29wcy0+dW5tYXAoZG9tYWluLCBpb3ZhLCBnZnBfb3JkZXIpOworCUJVR19PTighSVNfQUxJR05FRChpb3ZhLCBzaXplKSk7CisKKwlyZXR1cm4gZG9tYWluLT5vcHMtPnVubWFwKGRvbWFpbiwgaW92YSwgZ2ZwX29yZGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X3VubWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L21zbV9pb21tdS5jCmluZGV4IDFhNTg0ZTAuLjU4NjVkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9tc21faW9tbXUuYwpAQCAtNTQzLDYgKzU0MywxMyBAQAogCX0KIAogCXJldCA9IF9fZmx1c2hfaW90bGIoZG9tYWluKTsKKworCS8qCisJICogdGhlIElPTU1VIEFQSSByZXF1aXJlcyB1cyB0byByZXR1cm4gdGhlIG9yZGVyIG9mIHRoZSB1bm1hcHBlZAorCSAqIHBhZ2UgKG9uIHN1Y2Nlc3MpLgorCSAqLworCWlmICghcmV0KQorCQlyZXQgPSBvcmRlcjsKIGZhaWw6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2lvbW11X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzIxLDcgKzcyOCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBtc21faW9tbXVfaW5pdCh2b2lkKQogewogCXNldHVwX2lvbW11X3RleF9jbGFzc2VzKCk7Ci0JcmVnaXN0ZXJfaW9tbXUoJm1zbV9pb21tdV9vcHMpOworCWJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmbXNtX2lvbW11X29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS1kZWJ1Zy5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvbW11LWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ZGE1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS1kZWJ1Zy5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogb21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CisjaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgorCisjaW5jbHVkZSA8cGxhdC9pb3BndGFibGUuaD4KKworI2RlZmluZSBNQVhDT0xVTU4gMTAwIC8qIGZvciBzaG9ydCBtZXNzYWdlcyAqLworCitzdGF0aWMgREVGSU5FX01VVEVYKGlvbW11X2RlYnVnX2xvY2spOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqaW9tbXVfZGVidWdfcm9vdDsKKworc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF92ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJdTMyIHZlciA9IG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uKCk7CisJY2hhciBidWZbTUFYQ09MVU1OXSwgKnAgPSBidWY7CisKKwlwICs9IHNwcmludGYocCwgIkgvVyB2ZXJzaW9uOiAlZC4lZFxuIiwgKHZlciA+PiA0KSAmIDB4ZiAsIHZlciAmIDB4Zik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfcmVncyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpwLCAqYnVmOworCXNzaXplX3QgYnl0ZXM7CisKKwlidWYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJYnl0ZXMgPSBvbWFwX2lvbW11X2R1bXBfY3R4KG9iaiwgcCwgY291bnQpOworCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgYnl0ZXMpOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkX3RsYihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnAsICpidWY7CisJc3NpemVfdCBieXRlcywgcmVzdDsKKworCWJ1ZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwID0gYnVmOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlwICs9IHNwcmludGYocCwgIiU4cyAlOHNcbiIsICJjYW06IiwgInJhbToiKTsKKwlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlyZXN0ID0gY291bnQgLSAocCAtIGJ1Zik7CisJcCArPSBvbWFwX2R1bXBfdGxiX2VudHJpZXMob2JqLCBwLCByZXN0KTsKKworCWJ5dGVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7CisKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3dyaXRlX3BhZ2V0YWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdGxiX2VudHJ5IGU7CisJc3RydWN0IGNyX3JlZ3MgY3I7CisJaW50IGVycjsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmW01BWENPTFVNTl0sICpwID0gYnVmOworCisJY291bnQgPSBtaW4oY291bnQsIHNpemVvZihidWYpKTsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWlmIChjb3B5X2Zyb21fdXNlcihwLCB1c2VyYnVmLCBjb3VudCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3NjYW5mKHAsICIleCAleCIsICZjci5jYW0sICZjci5yYW0pOworCWlmICghY3IuY2FtIHx8ICFjci5yYW0pIHsKKwkJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb21hcF9pb3RsYl9jcl90b19lKCZjciwgJmUpOworCWVyciA9IG9tYXBfaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KG9iaiwgJmUpOworCWlmIChlcnIpCisJCWRldl9lcnIob2JqLT5kZXYsICIlczogZmFpbCB0byBzdG9yZSBjclxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUobHYsIGRhLCB2YWwpCQkJXAorCSh7CQkJCQkJCVwKKwkJaW50IF9fZXJyID0gMDsJCQkJCVwKKwkJc3NpemVfdCBieXRlczsJCQkJCVwKKwkJY29uc3QgaW50IG1heGNvbCA9IDIyOwkJCQlcCisJCWNvbnN0IGNoYXIgKnN0ciA9ICIlZDogJTA4eCAlMDh4XG4iOwkJXAorCQlieXRlcyA9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLCBsdiwgZGEsIHZhbCk7CVwKKwkJcCArPSBieXRlczsJCQkJCVwKKwkJbGVuIC09IGJ5dGVzOwkJCQkJXAorCQlpZiAobGVuIDwgbWF4Y29sKQkJCQlcCisJCQlfX2VyciA9IC1FTk9NRU07CQkJXAorCQlfX2VycjsJCQkJCQlcCisJfSkKKworc3RhdGljIHNzaXplX3QgZHVtcF9pb3B0YWJsZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgbGVuKQoreworCWludCBpOworCXUzMiAqaW9wZ2Q7CisJY2hhciAqcCA9IGJ1ZjsKKworCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QR0Q7IGkrKywgaW9wZ2QrKykgeworCQlpbnQgaiwgZXJyOworCQl1MzIgKmlvcHRlOworCQl1MzIgZGE7CisKKwkJaWYgKCEqaW9wZ2QpCisJCQljb250aW51ZTsKKworCQlpZiAoISgqaW9wZ2QgJiBJT1BHRF9UQUJMRSkpIHsKKwkJCWRhID0gaSA8PCBJT1BHRF9TSElGVDsKKworCQkJZXJyID0gZHVtcF9pb3B0YWJsZV9lbnRyeV9vbmUoMSwgZGEsICppb3BnZCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0KKworCQlpb3B0ZSA9IGlvcHRlX29mZnNldChpb3BnZCwgMCk7CisKKwkJZm9yIChqID0gMDsgaiA8IFBUUlNfUEVSX0lPUFRFOyBqKyssIGlvcHRlKyspIHsKKwkJCWlmICghKmlvcHRlKQorCQkJCWNvbnRpbnVlOworCisJCQlkYSA9IChpIDw8IElPUEdEX1NISUZUKSArIChqIDw8IElPUFRFX1NISUZUKTsKKwkJCWVyciA9IGR1bXBfaW9wdGFibGVfZW50cnlfb25lKDIsIGRhLCAqaW9wZ2QpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfcGFnZXRhYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpwLCAqYnVmOworCXNpemVfdCBieXRlczsKKworCWJ1ZiA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwID0gYnVmOworCisJcCArPSBzcHJpbnRmKHAsICJMOiAlOHMgJThzXG4iLCAiZGE6IiwgInBhOiIpOworCXAgKz0gc3ByaW50ZihwLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlieXRlcyA9IFBBR0VfU0laRSAtIChwIC0gYnVmKTsKKwlwICs9IGR1bXBfaW9wdGFibGUob2JqLCBwLCBieXRlcyk7CisKKwlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworCisJbXV0ZXhfdW5sb2NrKCZpb21tdV9kZWJ1Z19sb2NrKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKworCXJldHVybiBieXRlczsKK30KKworc3RhdGljIHNzaXplX3QgZGVidWdfcmVhZF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnAsICpidWY7CisJc3RydWN0IGlvdm1fc3RydWN0ICp0bXA7CisJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGkpOworCXNzaXplX3QgYnl0ZXM7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCXAgKz0gc3ByaW50ZihwLCAiJS0zcyAlLThzICUtOHMgJTZzICU4c1xuIiwKKwkJICAgICAiTm8iLCAic3RhcnQiLCAiZW5kIiwgInNpemUiLCAiZmxhZ3MiKTsKKwlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJbXV0ZXhfbG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCQlzaXplX3QgbGVuOworCQljb25zdCBjaGFyICpzdHIgPSAiJTNkICUwOHgtJTA4eCAlNnggJTh4XG4iOworCQljb25zdCBpbnQgbWF4Y29sID0gMzk7CisKKwkJbGVuID0gdG1wLT5kYV9lbmQgLSB0bXAtPmRhX3N0YXJ0OworCQlwICs9IHNucHJpbnRmKHAsIG1heGNvbCwgc3RyLAorCQkJICAgICAgaSwgdG1wLT5kYV9zdGFydCwgdG1wLT5kYV9lbmQsIGxlbiwgdG1wLT5mbGFncyk7CisKKwkJaWYgKFBBR0VfU0laRSAtIChwIC0gYnVmKSA8IG1heGNvbCkKKwkJCWJyZWFrOworCQlpKys7CisJfQorCisJYnl0ZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwIC0gYnVmKTsKKworCW11dGV4X3VubG9jaygmaW9tbXVfZGVidWdfbG9jayk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWRfbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqcCwgKmJ1ZjsKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7CisJc3NpemVfdCBieXRlczsKKworCWNvdW50ID0gbWluX3Qoc3NpemVfdCwgY291bnQsIFBBR0VfU0laRSk7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJYXJlYSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEob2JqLCAodTMyKXBwb3MpOworCWlmIChJU19FUlIoYXJlYSkpIHsKKwkJYnl0ZXMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbWNweShwLCBhcmVhLT52YSwgY291bnQpOworCXAgKz0gY291bnQ7CisKKwlieXRlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworZXJyX291dDoKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z193cml0ZV9tZW0oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCWNoYXIgKnAsICpidWY7CisKKwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSk7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcCA9IGJ1ZjsKKworCW11dGV4X2xvY2soJmlvbW11X2RlYnVnX2xvY2spOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJidWYsIGNvdW50KSkgeworCQljb3VudCA9ICAtRUZBVUxUOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJYXJlYSA9IG9tYXBfZmluZF9pb3ZtX2FyZWEob2JqLCAodTMyKXBwb3MpOworCWlmIChJU19FUlIoYXJlYSkpIHsKKwkJY291bnQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW1lbWNweShhcmVhLT52YSwgcCwgY291bnQpOworZXJyX291dDoKKwltdXRleF91bmxvY2soJmlvbW11X2RlYnVnX2xvY2spOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGRlYnVnX29wZW5fZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIERFQlVHX0ZPUFMobmFtZSkJCQkJCQlcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfIyNuYW1lIyNfZm9wcyA9IHsJXAorCQkub3BlbiA9IGRlYnVnX29wZW5fZ2VuZXJpYywJCQkJXAorCQkucmVhZCA9IGRlYnVnX3JlYWRfIyNuYW1lLAkJCQlcCisJCS53cml0ZSA9IGRlYnVnX3dyaXRlXyMjbmFtZSwJCQkJXAorCQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywJCQkJXAorCX07CisKKyNkZWZpbmUgREVCVUdfRk9QU19STyhuYW1lKQkJCQkJCVwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z18jI25hbWUjI19mb3BzID0gewlcCisJCS5vcGVuID0gZGVidWdfb3Blbl9nZW5lcmljLAkJCQlcCisJCS5yZWFkID0gZGVidWdfcmVhZF8jI25hbWUsCQkJCVwKKwkJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKKwl9OworCitERUJVR19GT1BTX1JPKHZlcik7CitERUJVR19GT1BTX1JPKHJlZ3MpOworREVCVUdfRk9QU19STyh0bGIpOworREVCVUdfRk9QUyhwYWdldGFibGUpOworREVCVUdfRk9QU19STyhtbWFwKTsKK0RFQlVHX0ZPUFMobWVtKTsKKworI2RlZmluZSBfX0RFQlVHX0FERF9GSUxFKGF0dHIsIG1vZGUpCQkJCQlcCisJewkJCQkJCQkJXAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OwkJCQkJXAorCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgjYXR0ciwgbW9kZSwgcGFyZW50LAkJXAorCQkJCQkgICBvYmosICZkZWJ1Z18jI2F0dHIjI19mb3BzKTsJXAorCQlpZiAoIWRlbnQpCQkJCQkJXAorCQkJcmV0dXJuIC1FTk9NRU07CQkJCQlcCisJfQorCisjZGVmaW5lIERFQlVHX0FERF9GSUxFKG5hbWUpIF9fREVCVUdfQUREX0ZJTEUobmFtZSwgNjAwKQorI2RlZmluZSBERUJVR19BRERfRklMRV9STyhuYW1lKSBfX0RFQlVHX0FERF9GSUxFKG5hbWUsIDQwMCkKKworc3RhdGljIGludCBpb21tdV9kZWJ1Z19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmogPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZGVudHJ5ICpkLCAqcGFyZW50OworCisJaWYgKCFvYmogfHwgIW9iai0+ZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIob2JqLT5uYW1lLCBpb21tdV9kZWJ1Z19yb290KTsKKwlpZiAoIWQpCisJCXJldHVybiAtRU5PTUVNOworCXBhcmVudCA9IGQ7CisKKwlkID0gZGVidWdmc19jcmVhdGVfdTgoIm5yX3RsYl9lbnRyaWVzIiwgNDAwLCBwYXJlbnQsCisJCQkgICAgICAodTggKikmb2JqLT5ucl90bGJfZW50cmllcyk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCURFQlVHX0FERF9GSUxFX1JPKHZlcik7CisJREVCVUdfQUREX0ZJTEVfUk8ocmVncyk7CisJREVCVUdfQUREX0ZJTEVfUk8odGxiKTsKKwlERUJVR19BRERfRklMRShwYWdldGFibGUpOworCURFQlVHX0FERF9GSUxFX1JPKG1tYXApOworCURFQlVHX0FERF9GSUxFKG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9tbXVfZGVidWdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmQ7CisJaW50IGVycjsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImlvbW11IiwgTlVMTCk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpb21tdV9kZWJ1Z19yb290ID0gZDsKKworCWVyciA9IG9tYXBfZm9yZWFjaF9pb21tdV9kZXZpY2UoZCwgaW9tbXVfZGVidWdfcmVnaXN0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGlvbW11X2RlYnVnX2luaXQpCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpb21tdV9kZWJ1Z2ZzX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaW9tbXVfZGVidWdfcm9vdCk7Cit9Cittb2R1bGVfZXhpdChpb21tdV9kZWJ1Z2ZzX2V4aXQpCisKK01PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogZGVidWdmcyBpbnRlcmZhY2UiKTsKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMmIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb21tdS5jCkBAIC0wLDAgKzEsMTI0NSBAQAorLyoKKyAqIG9tYXAgaW9tbXU6IHRsYiBhbmQgcGFnZXRhYmxlIHByaW1pdGl2ZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFdyaXR0ZW4gYnkgSGlyb3NoaSBET1lVIDxIaXJvc2hpLkRPWVVAbm9raWEuY29tPiwKKyAqCQlQYXVsIE11bmR0IGFuZCBUb3NoaWhpcm8gS29iYXlhc2hpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgPHBsYXQvaW9tbXUuaD4KKworI2luY2x1ZGUgPHBsYXQvaW9wZ3RhYmxlLmg+CisKKyNkZWZpbmUgZm9yX2VhY2hfaW90bGJfY3Iob2JqLCBuLCBfX2ksIGNyKQkJCQlcCisJZm9yIChfX2kgPSAwOwkJCQkJCQlcCisJICAgICAoX19pIDwgKG4pKSAmJiAoY3IgPSBfX2lvdGxiX3JlYWRfY3IoKG9iaiksIF9faSksIHRydWUpOwlcCisJICAgICBfX2krKykKKworLyoqCisgKiBzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gLSBvbWFwIGlvbW11IGRvbWFpbgorICogQHBndGFibGU6CXRoZSBwYWdlIHRhYmxlCisgKiBAaW9tbXVfZGV2OglhbiBvbWFwIGlvbW11IGRldmljZSBhdHRhY2hlZCB0byB0aGlzIGRvbWFpbi4gb25seSBhIHNpbmdsZQorICoJCWlvbW11IGRldmljZSBjYW4gYmUgYXR0YWNoZWQgZm9yIG5vdy4KKyAqIEBsb2NrOglkb21haW4gbG9jaywgc2hvdWxkIGJlIHRha2VuIHdoZW4gYXR0YWNoaW5nL2RldGFjaGluZworICovCitzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4geworCXUzMiAqcGd0YWJsZTsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqaW9tbXVfZGV2OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIGFjY29tbW9kYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb21hcDEgYW5kIG9tYXAyLzMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICphcmNoX2lvbW11OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2lvbW11X2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW9wdGVfY2FjaGVwOworCisvKioKKyAqIG9tYXBfaW5zdGFsbF9pb21tdV9hcmNoIC0gSW5zdGFsbCBhcmNodGVjdXJlIHNwZWNpZmljIGlvbW11IGZ1bmN0aW9ucworICogQG9wczoJYSBwb2ludGVyIHRvIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKKyAqCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBraW5kIG9mIGlvbW11IGFsZ29yaXRobSh0bGIsIHBhZ2V0YWJsZSkgYW1vbmcKKyAqIG9tYXAgc2VyaWVzLiBUaGlzIGludGVyZmFjZSBpbnN0YWxscyBzdWNoIGFuIGlvbW11IGFsZ29yaWdobS4KKyAqKi8KK2ludCBvbWFwX2luc3RhbGxfaW9tbXVfYXJjaChjb25zdCBzdHJ1Y3QgaW9tbXVfZnVuY3Rpb25zICpvcHMpCit7CisJaWYgKGFyY2hfaW9tbXUpCisJCXJldHVybiAtRUJVU1k7CisKKwlhcmNoX2lvbW11ID0gb3BzOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9pbnN0YWxsX2lvbW11X2FyY2gpOworCisvKioKKyAqIG9tYXBfdW5pbnN0YWxsX2lvbW11X2FyY2ggLSBVbmluc3RhbGwgYXJjaHRlY3VyZSBzcGVjaWZpYyBpb21tdSBmdW5jdGlvbnMKKyAqIEBvcHM6CWEgcG9pbnRlciB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW9tbXUgZnVuY3Rpb25zCisgKgorICogVGhpcyBpbnRlcmZhY2UgdW5pbnN0YWxscyB0aGUgaW9tbXUgYWxnb3JpZ2htIGluc3RhbGxlZCBwcmV2aW91c2x5LgorICoqLwordm9pZCBvbWFwX3VuaW5zdGFsbF9pb21tdV9hcmNoKGNvbnN0IHN0cnVjdCBpb21tdV9mdW5jdGlvbnMgKm9wcykKK3sKKwlpZiAoYXJjaF9pb21tdSAhPSBvcHMpCisJCXByX2VycigiJXM6IG5vdCB5b3VyIGFyY2hcbiIsIF9fZnVuY19fKTsKKworCWFyY2hfaW9tbXUgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF91bmluc3RhbGxfaW9tbXVfYXJjaCk7CisKKy8qKgorICogb21hcF9pb21tdV9zYXZlX2N0eCAtIFNhdmUgcmVnaXN0ZXJzIGZvciBwbSBvZmYtbW9kZSBzdXBwb3J0CisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3ZvaWQgb21hcF9pb21tdV9zYXZlX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCWFyY2hfaW9tbXUtPnNhdmVfY3R4KG9iaik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3NhdmVfY3R4KTsKKworLyoqCisgKiBvbWFwX2lvbW11X3Jlc3RvcmVfY3R4IC0gUmVzdG9yZSByZWdpc3RlcnMgZm9yIHBtIG9mZi1tb2RlIHN1cHBvcnQKKyAqIEBvYmo6CXRhcmdldCBpb21tdQorICoqLwordm9pZCBvbWFwX2lvbW11X3Jlc3RvcmVfY3R4KHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJYXJjaF9pb21tdS0+cmVzdG9yZV9jdHgob2JqKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfcmVzdG9yZV9jdHgpOworCisvKioKKyAqIG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uIC0gUmV0dXJuIHJ1bm5pbmcgaW9tbXUgYXJjaCB2ZXJzaW9uCisgKiovCit1MzIgb21hcF9pb21tdV9hcmNoX3ZlcnNpb24odm9pZCkKK3sKKwlyZXR1cm4gYXJjaF9pb21tdS0+dmVyc2lvbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfYXJjaF92ZXJzaW9uKTsKKworc3RhdGljIGludCBpb21tdV9lbmFibGUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaikKK3sKKwlpbnQgZXJyOworCisJaWYgKCFvYmopCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhcmNoX2lvbW11KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNsa19lbmFibGUob2JqLT5jbGspOworCisJZXJyID0gYXJjaF9pb21tdS0+ZW5hYmxlKG9iaik7CisKKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCWlmICghb2JqKQorCQlyZXR1cm47CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWFyY2hfaW9tbXUtPmRpc2FibGUob2JqKTsKKworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKK30KKworLyoKKyAqCVRMQiBvcGVyYXRpb25zCisgKi8KK3ZvaWQgb21hcF9pb3RsYl9jcl90b19lKHN0cnVjdCBjcl9yZWdzICpjciwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQoreworCUJVR19PTighY3IgfHwgIWUpOworCisJYXJjaF9pb21tdS0+Y3JfdG9fZShjciwgZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvdGxiX2NyX3RvX2UpOworCitzdGF0aWMgaW5saW5lIGludCBpb3RsYl9jcl92YWxpZChzdHJ1Y3QgY3JfcmVncyAqY3IpCit7CisJaWYgKCFjcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYXJjaF9pb21tdS0+Y3JfdmFsaWQoY3IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcl9yZWdzICppb3RsYl9hbGxvY19jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkgICAgIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFyY2hfaW9tbXUtPmFsbG9jX2NyKG9iaiwgZSk7Cit9CisKK3N0YXRpYyB1MzIgaW90bGJfY3JfdG9fdmlydChzdHJ1Y3QgY3JfcmVncyAqY3IpCit7CisJcmV0dXJuIGFyY2hfaW9tbXUtPmNyX3RvX3ZpcnQoY3IpOworfQorCitzdGF0aWMgdTMyIGdldF9pb3B0ZV9hdHRyKHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gYXJjaF9pb21tdS0+Z2V0X3B0ZV9hdHRyKGUpOworfQorCitzdGF0aWMgdTMyIGlvbW11X3JlcG9ydF9mYXVsdChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgKmRhKQoreworCXJldHVybiBhcmNoX2lvbW11LT5mYXVsdF9pc3Iob2JqLCBkYSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvdGxiX2xvY2tfZ2V0KHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9sb2NrICpsKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBpb21tdV9yZWFkX3JlZyhvYmosIE1NVV9MT0NLKTsKKworCWwtPmJhc2UgPSBNTVVfTE9DS19CQVNFKHZhbCk7CisJbC0+dmljdCA9IE1NVV9MT0NLX1ZJQ1QodmFsKTsKKworfQorCitzdGF0aWMgdm9pZCBpb3RsYl9sb2NrX3NldChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfbG9jayAqbCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKGwtPmJhc2UgPDwgTU1VX0xPQ0tfQkFTRV9TSElGVCk7CisJdmFsIHw9IChsLT52aWN0IDw8IE1NVV9MT0NLX1ZJQ1RfU0hJRlQpOworCisJaW9tbXVfd3JpdGVfcmVnKG9iaiwgdmFsLCBNTVVfTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvdGxiX3JlYWRfY3Ioc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNyKQoreworCWFyY2hfaW9tbXUtPnRsYl9yZWFkX2NyKG9iaiwgY3IpOworfQorCitzdGF0aWMgdm9pZCBpb3RsYl9sb2FkX2NyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBjcl9yZWdzICpjcikKK3sKKwlhcmNoX2lvbW11LT50bGJfbG9hZF9jcihvYmosIGNyKTsKKworCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9GTFVTSF9FTlRSWSk7CisJaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0xEX1RMQik7Cit9CisKKy8qKgorICogaW90bGJfZHVtcF9jciAtIER1bXAgYW4gaW9tbXUgdGxiIGVudHJ5IGludG8gYnVmCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqIEBjcjoJCWNvbnRlbnRzIG9mIGNhbSBhbmQgcmFtIHJlZ2lzdGVyCisgKiBAYnVmOglvdXRwdXQgYnVmZmVyCisgKiovCitzdGF0aWMgaW5saW5lIHNzaXplX3QgaW90bGJfZHVtcF9jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgY3JfcmVncyAqY3IsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlCVUdfT04oIWNyIHx8ICFidWYpOworCisJcmV0dXJuIGFyY2hfaW9tbXUtPmR1bXBfY3Iob2JqLCBjciwgYnVmKTsKK30KKworLyogb25seSB1c2VkIGluIGlvdGxiIGl0ZXJhdGlvbiBmb3ItbG9vcCAqLworc3RhdGljIHN0cnVjdCBjcl9yZWdzIF9faW90bGJfcmVhZF9jcihzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBpbnQgbikKK3sKKwlzdHJ1Y3QgY3JfcmVncyBjcjsKKwlzdHJ1Y3QgaW90bGJfbG9jayBsOworCisJaW90bGJfbG9ja19nZXQob2JqLCAmbCk7CisJbC52aWN0ID0gbjsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKKwlpb3RsYl9yZWFkX2NyKG9iaiwgJmNyKTsKKworCXJldHVybiBjcjsKK30KKworLyoqCisgKiBsb2FkX2lvdGxiX2VudHJ5IC0gU2V0IGFuIGlvbW11IHRsYiBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCisgKiovCisjaWZkZWYgUFJFRkVUQ0hfSU9UTEIKK3N0YXRpYyBpbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlvdGxiX2xvY2sgbDsKKwlzdHJ1Y3QgY3JfcmVncyAqY3I7CisKKwlpZiAoIW9iaiB8fCAhb2JqLT5ucl90bGJfZW50cmllcyB8fCAhZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJmwpOworCWlmIChsLmJhc2UgPT0gb2JqLT5ucl90bGJfZW50cmllcykgeworCQlkZXZfd2FybihvYmotPmRldiwgIiVzOiBwcmVzZXJ2ZSBlbnRyaWVzIGZ1bGxcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFlLT5wcnN2ZCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNyX3JlZ3MgdG1wOworCisJCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgb2JqLT5ucl90bGJfZW50cmllcywgaSwgdG1wKQorCQkJaWYgKCFpb3RsYl9jcl92YWxpZCgmdG1wKSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKSB7CisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IGZ1bGw6IG5vIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlvdGxiX2xvY2tfZ2V0KG9iaiwgJmwpOworCX0gZWxzZSB7CisJCWwudmljdCA9IGwuYmFzZTsKKwkJaW90bGJfbG9ja19zZXQob2JqLCAmbCk7CisJfQorCisJY3IgPSBpb3RsYl9hbGxvY19jcihvYmosIGUpOworCWlmIChJU19FUlIoY3IpKSB7CisJCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3IpOworCX0KKworCWlvdGxiX2xvYWRfY3Iob2JqLCBjcik7CisJa2ZyZWUoY3IpOworCisJaWYgKGUtPnByc3ZkKQorCQlsLmJhc2UrKzsKKwkvKiBpbmNyZW1lbnQgdmljdGltIGZvciBuZXh0IHRsYiBsb2FkICovCisJaWYgKCsrbC52aWN0ID09IG9iai0+bnJfdGxiX2VudHJpZXMpCisJCWwudmljdCA9IGwuYmFzZTsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKK291dDoKKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisJcmV0dXJuIGVycjsKK30KKworI2Vsc2UgLyogIVBSRUZFVENIX0lPVExCICovCisKK3N0YXRpYyBpbnQgbG9hZF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhUFJFRkVUQ0hfSU9UTEIgKi8KKworc3RhdGljIGludCBwcmVmZXRjaF9pb3RsYl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBzdHJ1Y3QgaW90bGJfZW50cnkgKmUpCit7CisJcmV0dXJuIGxvYWRfaW90bGJfZW50cnkob2JqLCBlKTsKK30KKworLyoqCisgKiBmbHVzaF9pb3RsYl9wYWdlIC0gQ2xlYXIgYW4gaW9tbXUgdGxiIGVudHJ5CisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBDbGVhciBhbiBpb21tdSB0bGIgZW50cnkgd2hpY2ggaW5jbHVkZXMgJ2RhJyBhZGRyZXNzLgorICoqLworc3RhdGljIHZvaWQgZmx1c2hfaW90bGJfcGFnZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJaW50IGk7CisJc3RydWN0IGNyX3JlZ3MgY3I7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWZvcl9lYWNoX2lvdGxiX2NyKG9iaiwgb2JqLT5ucl90bGJfZW50cmllcywgaSwgY3IpIHsKKwkJdTMyIHN0YXJ0OworCQlzaXplX3QgYnl0ZXM7CisKKwkJaWYgKCFpb3RsYl9jcl92YWxpZCgmY3IpKQorCQkJY29udGludWU7CisKKwkJc3RhcnQgPSBpb3RsYl9jcl90b192aXJ0KCZjcik7CisJCWJ5dGVzID0gaW9wZ3N6X3RvX2J5dGVzKGNyLmNhbSAmIDMpOworCisJCWlmICgoc3RhcnQgPD0gZGEpICYmIChkYSA8IHN0YXJ0ICsgYnl0ZXMpKSB7CisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHg8PSUwOHgoJXgpXG4iLAorCQkJCV9fZnVuY19fLCBzdGFydCwgZGEsIGJ5dGVzKTsKKwkJCWlvdGxiX2xvYWRfY3Iob2JqLCAmY3IpOworCQkJaW9tbXVfd3JpdGVfcmVnKG9iaiwgMSwgTU1VX0ZMVVNIX0VOVFJZKTsKKwkJfQorCX0KKwljbGtfZGlzYWJsZShvYmotPmNsayk7CisKKwlpZiAoaSA9PSBvYmotPm5yX3RsYl9lbnRyaWVzKQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IG5vIHBhZ2UgZm9yICUwOHhcbiIsIF9fZnVuY19fLCBkYSk7Cit9CisKKy8qKgorICogZmx1c2hfaW90bGJfYWxsIC0gQ2xlYXIgYWxsIGlvbW11IHRsYiBlbnRyaWVzCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2lvdGxiX2FsbChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqKQoreworCXN0cnVjdCBpb3RsYl9sb2NrIGw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWwuYmFzZSA9IDA7CisJbC52aWN0ID0gMDsKKwlpb3RsYl9sb2NrX3NldChvYmosICZsKTsKKworCWlvbW11X3dyaXRlX3JlZyhvYmosIDEsIE1NVV9HRkxVU0gpOworCisJY2xrX2Rpc2FibGUob2JqLT5jbGspOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9JT01NVV9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9JT01NVV9ERUJVR19NT0RVTEUpCisKK3NzaXplX3Qgb21hcF9pb21tdV9kdW1wX2N0eChzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCBjaGFyICpidWYsIHNzaXplX3QgYnl0ZXMpCit7CisJaWYgKCFvYmogfHwgIWJ1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKworCWJ5dGVzID0gYXJjaF9pb21tdS0+ZHVtcF9jdHgob2JqLCBidWYsIGJ5dGVzKTsKKworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKworCXJldHVybiBieXRlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfZHVtcF9jdHgpOworCitzdGF0aWMgaW50CitfX2R1bXBfdGxiX2VudHJpZXMoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGNyX3JlZ3MgKmNycywgaW50IG51bSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaW90bGJfbG9jayBzYXZlZDsKKwlzdHJ1Y3QgY3JfcmVncyB0bXA7CisJc3RydWN0IGNyX3JlZ3MgKnAgPSBjcnM7CisKKwljbGtfZW5hYmxlKG9iai0+Y2xrKTsKKwlpb3RsYl9sb2NrX2dldChvYmosICZzYXZlZCk7CisKKwlmb3JfZWFjaF9pb3RsYl9jcihvYmosIG51bSwgaSwgdG1wKSB7CisJCWlmICghaW90bGJfY3JfdmFsaWQoJnRtcCkpCisJCQljb250aW51ZTsKKwkJKnArKyA9IHRtcDsKKwl9CisKKwlpb3RsYl9sb2NrX3NldChvYmosICZzYXZlZCk7CisJY2xrX2Rpc2FibGUob2JqLT5jbGspOworCisJcmV0dXJuICBwIC0gY3JzOworfQorCisvKioKKyAqIG9tYXBfZHVtcF90bGJfZW50cmllcyAtIGR1bXAgY3IgYXJyYXlzIHRvIGdpdmVuIGJ1ZmZlcgorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAYnVmOglvdXRwdXQgYnVmZmVyCisgKiovCitzaXplX3Qgb21hcF9kdW1wX3RsYl9lbnRyaWVzKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNoYXIgKmJ1Ziwgc3NpemVfdCBieXRlcykKK3sKKwlpbnQgaSwgbnVtOworCXN0cnVjdCBjcl9yZWdzICpjcjsKKwljaGFyICpwID0gYnVmOworCisJbnVtID0gYnl0ZXMgLyBzaXplb2YoKmNyKTsKKwludW0gPSBtaW4ob2JqLT5ucl90bGJfZW50cmllcywgbnVtKTsKKworCWNyID0ga2NhbGxvYyhudW0sIHNpemVvZigqY3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNyKQorCQlyZXR1cm4gMDsKKworCW51bSA9IF9fZHVtcF90bGJfZW50cmllcyhvYmosIGNyLCBudW0pOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcCArPSBpb3RsYl9kdW1wX2NyKG9iaiwgY3IgKyBpLCBwKTsKKwlrZnJlZShjcik7CisKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZHVtcF90bGJfZW50cmllcyk7CisKK2ludCBvbWFwX2ZvcmVhY2hfaW9tbXVfZGV2aWNlKHZvaWQgKmRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpCit7CisJcmV0dXJuIGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJm9tYXBfaW9tbXVfZHJpdmVyLmRyaXZlciwKKwkJCQkgICAgICBOVUxMLCBkYXRhLCBmbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZvcmVhY2hfaW9tbXVfZGV2aWNlKTsKKworI2VuZGlmIC8qIENPTkZJR19PTUFQX0lPTU1VX0RFQlVHX01PRFVMRSAqLworCisvKgorICoJSC9XIHBhZ2V0YWJsZSBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2lvcGdkX3JhbmdlKHUzMiAqZmlyc3QsIHUzMiAqbGFzdCkKK3sKKwkvKiBGSVhNRTogTDIgY2FjaGUgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgaWYgaXQgZXhpc3RzICovCisJZG8geworCQlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzEwLCAxIEAgZmx1c2hfcGdkIgorCQkgICAgOiA6ICJyIiAoZmlyc3QpKTsKKwkJZmlyc3QgKz0gTDFfQ0FDSEVfQllURVMgLyBzaXplb2YoKmZpcnN0KTsKKwl9IHdoaWxlIChmaXJzdCA8PSBsYXN0KTsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfaW9wdGVfcmFuZ2UodTMyICpmaXJzdCwgdTMyICpsYXN0KQoreworCS8qIEZJWE1FOiBMMiBjYWNoZSBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBpZiBpdCBleGlzdHMgKi8KKwlkbyB7CisJCWFzbSgibWNyCXAxNSwgMCwgJTAsIGM3LCBjMTAsIDEgQCBmbHVzaF9wdGUiCisJCSAgICA6IDogInIiIChmaXJzdCkpOworCQlmaXJzdCArPSBMMV9DQUNIRV9CWVRFUyAvIHNpemVvZigqZmlyc3QpOworCX0gd2hpbGUgKGZpcnN0IDw9IGxhc3QpOworfQorCitzdGF0aWMgdm9pZCBpb3B0ZV9mcmVlKHUzMiAqaW9wdGUpCit7CisJLyogTm90ZTogZnJlZWQgaW9wdGUncyBtdXN0IGJlIGNsZWFuIHJlYWR5IGZvciByZS11c2UgKi8KKwlrbWVtX2NhY2hlX2ZyZWUoaW9wdGVfY2FjaGVwLCBpb3B0ZSk7Cit9CisKK3N0YXRpYyB1MzIgKmlvcHRlX2FsbG9jKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiAqaW9wZ2QsIHUzMiBkYSkKK3sKKwl1MzIgKmlvcHRlOworCisJLyogYSB0YWJsZSBoYXMgYWxyZWFkeSBleGlzdGVkICovCisJaWYgKCppb3BnZCkKKwkJZ290byBwdGVfcmVhZHk7CisKKwkvKgorCSAqIGRvIHRoZSBhbGxvY2F0aW9uIG91dHNpZGUgdGhlIHBhZ2UgdGFibGUgbG9jaworCSAqLworCXNwaW5fdW5sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7CisJaW9wdGUgPSBrbWVtX2NhY2hlX3phbGxvYyhpb3B0ZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCXNwaW5fbG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJaWYgKCEqaW9wZ2QpIHsKKwkJaWYgKCFpb3B0ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCSppb3BnZCA9IHZpcnRfdG9fcGh5cyhpb3B0ZSkgfCBJT1BHRF9UQUJMRTsKKwkJZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkKTsKKworCQlkZXZfdmRiZyhvYmotPmRldiwgIiVzOiBhIG5ldyBwdGU6JXBcbiIsIF9fZnVuY19fLCBpb3B0ZSk7CisJfSBlbHNlIHsKKwkJLyogV2UgcmFjZWQsIGZyZWUgdGhlIHJlZHVuaW92YW50IHRhYmxlICovCisJCWlvcHRlX2ZyZWUoaW9wdGUpOworCX0KKworcHRlX3JlYWR5OgorCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwlkZXZfdmRiZyhvYmotPmRldiwKKwkJICIlczogZGE6JTA4eCBwZ2Q6JXAgKnBnZDolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCisJCSBfX2Z1bmNfXywgZGEsIGlvcGdkLCAqaW9wZ2QsIGlvcHRlLCAqaW9wdGUpOworCisJcmV0dXJuIGlvcHRlOworfQorCitzdGF0aWMgaW50IGlvcGdkX2FsbG9jX3NlY3Rpb24oc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgcGEsIHUzMiBwcm90KQoreworCXUzMiAqaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7CisKKwlpZiAoKGRhIHwgcGEpICYgfklPU0VDVElPTl9NQVNLKSB7CisJCWRldl9lcnIob2JqLT5kZXYsICIlczogJTA4eDolMDh4IHNob3VsZCBhbGlnbmVkIG9uICUwOGx4XG4iLAorCQkJX19mdW5jX18sIGRhLCBwYSwgSU9TRUNUSU9OX1NJWkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqaW9wZ2QgPSAocGEgJiBJT1NFQ1RJT05fTUFTSykgfCBwcm90IHwgSU9QR0RfU0VDVElPTjsKKwlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvcGdkX2FsbG9jX3N1cGVyKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKK3sKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCWludCBpOworCisJaWYgKChkYSB8IHBhKSAmIH5JT1NVUEVSX01BU0spIHsKKwkJZGV2X2VycihvYmotPmRldiwgIiVzOiAlMDh4OiUwOHggc2hvdWxkIGFsaWduZWQgb24gJTA4bHhcbiIsCisJCQlfX2Z1bmNfXywgZGEsIHBhLCBJT1NVUEVSX1NJWkUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJKihpb3BnZCArIGkpID0gKHBhICYgSU9TVVBFUl9NQVNLKSB8IHByb3QgfCBJT1BHRF9TVVBFUjsKKwlmbHVzaF9pb3BnZF9yYW5nZShpb3BnZCwgaW9wZ2QgKyAxNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9wdGVfYWxsb2NfcGFnZShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEsIHUzMiBwYSwgdTMyIHByb3QpCit7CisJdTMyICppb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKKwl1MzIgKmlvcHRlID0gaW9wdGVfYWxsb2Mob2JqLCBpb3BnZCwgZGEpOworCisJaWYgKElTX0VSUihpb3B0ZSkpCisJCXJldHVybiBQVFJfRVJSKGlvcHRlKTsKKworCSppb3B0ZSA9IChwYSAmIElPUEFHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9TTUFMTDsKKwlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUpOworCisJZGV2X3ZkYmcob2JqLT5kZXYsICIlczogZGE6JTA4eCBwYTolMDh4IHB0ZTolcCAqcHRlOiUwOHhcbiIsCisJCSBfX2Z1bmNfXywgZGEsIHBhLCBpb3B0ZSwgKmlvcHRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvcHRlX2FsbG9jX2xhcmdlKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwgdTMyIHBhLCB1MzIgcHJvdCkKK3sKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCXUzMiAqaW9wdGUgPSBpb3B0ZV9hbGxvYyhvYmosIGlvcGdkLCBkYSk7CisJaW50IGk7CisKKwlpZiAoKGRhIHwgcGEpICYgfklPTEFSR0VfTUFTSykgeworCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6ICUwOHg6JTA4eCBzaG91bGQgYWxpZ25lZCBvbiAlMDhseFxuIiwKKwkJCV9fZnVuY19fLCBkYSwgcGEsIElPTEFSR0VfU0laRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChJU19FUlIoaW9wdGUpKQorCQlyZXR1cm4gUFRSX0VSUihpb3B0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJKihpb3B0ZSArIGkpID0gKHBhICYgSU9MQVJHRV9NQVNLKSB8IHByb3QgfCBJT1BURV9MQVJHRTsKKwlmbHVzaF9pb3B0ZV9yYW5nZShpb3B0ZSwgaW9wdGUgKyAxNSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lvcGd0YWJsZV9zdG9yZV9lbnRyeV9jb3JlKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3RsYl9lbnRyeSAqZSkKK3sKKwlpbnQgKCpmbikoc3RydWN0IG9tYXBfaW9tbXUgKiwgdTMyLCB1MzIsIHUzMik7CisJdTMyIHByb3Q7CisJaW50IGVycjsKKworCWlmICghb2JqIHx8ICFlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZS0+cGdzeikgeworCWNhc2UgTU1VX0NBTV9QR1NaXzE2TToKKwkJZm4gPSBpb3BnZF9hbGxvY19zdXBlcjsKKwkJYnJlYWs7CisJY2FzZSBNTVVfQ0FNX1BHU1pfMU06CisJCWZuID0gaW9wZ2RfYWxsb2Nfc2VjdGlvbjsKKwkJYnJlYWs7CisJY2FzZSBNTVVfQ0FNX1BHU1pfNjRLOgorCQlmbiA9IGlvcHRlX2FsbG9jX2xhcmdlOworCQlicmVhazsKKwljYXNlIE1NVV9DQU1fUEdTWl80SzoKKwkJZm4gPSBpb3B0ZV9hbGxvY19wYWdlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbiA9IE5VTEw7CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlwcm90ID0gZ2V0X2lvcHRlX2F0dHIoZSk7CisKKwlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKwllcnIgPSBmbihvYmosIGUtPmRhLCBlLT5wYSwgcHJvdCk7CisJc3Bpbl91bmxvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkgLSBNYWtlIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZToJCWFuIGlvbW11IHRsYiBlbnRyeSBpbmZvCisgKiovCitpbnQgb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgc3RydWN0IGlvdGxiX2VudHJ5ICplKQoreworCWludCBlcnI7CisKKwlmbHVzaF9pb3RsYl9wYWdlKG9iaiwgZS0+ZGEpOworCWVyciA9IGlvcGd0YWJsZV9zdG9yZV9lbnRyeV9jb3JlKG9iaiwgZSk7CisJaWYgKCFlcnIpCisJCXByZWZldGNoX2lvdGxiX2VudHJ5KG9iaiwgZSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9wZ3RhYmxlX3N0b3JlX2VudHJ5KTsKKworLyoqCisgKiBpb3BndGFibGVfbG9va3VwX2VudHJ5IC0gTG9va3VwIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKiBAcHBnZDoJaW9tbXUgcGdkIGVudHJ5IHBvaW50ZXIgdG8gYmUgcmV0dXJuZWQKKyAqIEBwcHRlOglpb21tdSBwdGUgZW50cnkgcG9pbnRlciB0byBiZSByZXR1cm5lZAorICoqLworc3RhdGljIHZvaWQKK2lvcGd0YWJsZV9sb29rdXBfZW50cnkoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLCB1MzIgKipwcGdkLCB1MzIgKipwcHRlKQoreworCXUzMiAqaW9wZ2QsICppb3B0ZSA9IE5VTEw7CisKKwlpb3BnZCA9IGlvcGdkX29mZnNldChvYmosIGRhKTsKKwlpZiAoISppb3BnZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW9wZ2RfaXNfdGFibGUoKmlvcGdkKSkKKwkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIGRhKTsKK291dDoKKwkqcHBnZCA9IGlvcGdkOworCSpwcHRlID0gaW9wdGU7Cit9CisKK3N0YXRpYyBzaXplX3QgaW9wZ3RhYmxlX2NsZWFyX2VudHJ5X2NvcmUoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKQoreworCXNpemVfdCBieXRlczsKKwl1MzIgKmlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCWludCBuZW50ID0gMTsKKworCWlmICghKmlvcGdkKQorCQlyZXR1cm4gMDsKKworCWlmIChpb3BnZF9pc190YWJsZSgqaW9wZ2QpKSB7CisJCWludCBpOworCQl1MzIgKmlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwkJYnl0ZXMgPSBJT1BURV9TSVpFOworCQlpZiAoKmlvcHRlICYgSU9QVEVfTEFSR0UpIHsKKwkJCW5lbnQgKj0gMTY7CisJCQkvKiByZXdpbmQgdG8gdGhlIDFzdCBlbnRyeSAqLworCQkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIChkYSAmIElPTEFSR0VfTUFTSykpOworCQl9CisJCWJ5dGVzICo9IG5lbnQ7CisJCW1lbXNldChpb3B0ZSwgMCwgbmVudCAqIHNpemVvZigqaW9wdGUpKTsKKwkJZmx1c2hfaW9wdGVfcmFuZ2UoaW9wdGUsIGlvcHRlICsgKG5lbnQgLSAxKSAqIHNpemVvZigqaW9wdGUpKTsKKworCQkvKgorCQkgKiBkbyB0YWJsZSB3YWxrIHRvIGNoZWNrIGlmIHRoaXMgdGFibGUgaXMgbmVjZXNzYXJ5IG9yIG5vdAorCQkgKi8KKwkJaW9wdGUgPSBpb3B0ZV9vZmZzZXQoaW9wZ2QsIDApOworCQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfSU9QVEU7IGkrKykKKwkJCWlmIChpb3B0ZVtpXSkKKwkJCQlnb3RvIG91dDsKKworCQlpb3B0ZV9mcmVlKGlvcHRlKTsKKwkJbmVudCA9IDE7IC8qIGZvciB0aGUgbmV4dCBMMSBlbnRyeSAqLworCX0gZWxzZSB7CisJCWJ5dGVzID0gSU9QR0RfU0laRTsKKwkJaWYgKCgqaW9wZ2QgJiBJT1BHRF9TVVBFUikgPT0gSU9QR0RfU1VQRVIpIHsKKwkJCW5lbnQgKj0gMTY7CisJCQkvKiByZXdpbmQgdG8gdGhlIDFzdCBlbnRyeSAqLworCQkJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCAoZGEgJiBJT1NVUEVSX01BU0spKTsKKwkJfQorCQlieXRlcyAqPSBuZW50OworCX0KKwltZW1zZXQoaW9wZ2QsIDAsIG5lbnQgKiBzaXplb2YoKmlvcGdkKSk7CisJZmx1c2hfaW9wZ2RfcmFuZ2UoaW9wZ2QsIGlvcGdkICsgKG5lbnQgLSAxKSAqIHNpemVvZigqaW9wZ2QpKTsKK291dDoKKwlyZXR1cm4gYnl0ZXM7Cit9CisKKy8qKgorICogaW9wZ3RhYmxlX2NsZWFyX2VudHJ5IC0gUmVtb3ZlIGFuIGlvbW11IHB0ZSBlbnRyeQorICogQG9iajoJdGFyZ2V0IGlvbW11CisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKiovCitzdGF0aWMgc2l6ZV90IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc2l6ZV90IGJ5dGVzOworCisJc3Bpbl9sb2NrKCZvYmotPnBhZ2VfdGFibGVfbG9jayk7CisKKwlieXRlcyA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeV9jb3JlKG9iaiwgZGEpOworCWZsdXNoX2lvdGxiX3BhZ2Uob2JqLCBkYSk7CisKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgdm9pZCBpb3BndGFibGVfY2xlYXJfZW50cnlfYWxsKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJaW50IGk7CisKKwlzcGluX2xvY2soJm9iai0+cGFnZV90YWJsZV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9JT1BHRDsgaSsrKSB7CisJCXUzMiBkYTsKKwkJdTMyICppb3BnZDsKKworCQlkYSA9IGkgPDwgSU9QR0RfU0hJRlQ7CisJCWlvcGdkID0gaW9wZ2Rfb2Zmc2V0KG9iaiwgZGEpOworCisJCWlmICghKmlvcGdkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlvcGdkX2lzX3RhYmxlKCppb3BnZCkpCisJCQlpb3B0ZV9mcmVlKGlvcHRlX29mZnNldChpb3BnZCwgMCkpOworCisJCSppb3BnZCA9IDA7CisJCWZsdXNoX2lvcGdkX3JhbmdlKGlvcGdkLCBpb3BnZCk7CisJfQorCisJZmx1c2hfaW90bGJfYWxsKG9iaik7CisKKwlzcGluX3VubG9jaygmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworfQorCisvKgorICoJRGV2aWNlIElPTU1VIGdlbmVyaWMgb3BlcmF0aW9ucworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9tbXVfZmF1bHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXUzMiBkYSwgZXJyczsKKwl1MzIgKmlvcGdkLCAqaW9wdGU7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9iaiA9IGRhdGE7CisJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0gb2JqLT5kb21haW47CisKKwlpZiAoIW9iai0+cmVmY291bnQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWNsa19lbmFibGUob2JqLT5jbGspOworCWVycnMgPSBpb21tdV9yZXBvcnRfZmF1bHQob2JqLCAmZGEpOworCWNsa19kaXNhYmxlKG9iai0+Y2xrKTsKKwlpZiAoZXJycyA9PSAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBGYXVsdCBjYWxsYmFjayBvciBUTEIvUFRFIER5bmFtaWMgbG9hZGluZyAqLworCWlmICghcmVwb3J0X2lvbW11X2ZhdWx0KGRvbWFpbiwgb2JqLT5kZXYsIGRhLCAwKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaW9tbXVfZGlzYWJsZShvYmopOworCisJaW9wZ2QgPSBpb3BnZF9vZmZzZXQob2JqLCBkYSk7CisKKwlpZiAoIWlvcGdkX2lzX3RhYmxlKCppb3BnZCkpIHsKKwkJZGV2X2VycihvYmotPmRldiwgIiVzOiBlcnJzOjB4JTA4eCBkYToweCUwOHggcGdkOjB4JXAgIgorCQkJIipwZ2Q6cHglMDh4XG4iLCBvYmotPm5hbWUsIGVycnMsIGRhLCBpb3BnZCwgKmlvcGdkKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvcHRlID0gaW9wdGVfb2Zmc2V0KGlvcGdkLCBkYSk7CisKKwlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IGVycnM6MHglMDh4IGRhOjB4JTA4eCBwZ2Q6MHglcCAqcGdkOjB4JTA4eCAiCisJCSJwdGU6MHglcCAqcHRlOjB4JTA4eFxuIiwgb2JqLT5uYW1lLCBlcnJzLCBkYSwgaW9wZ2QsICppb3BnZCwKKwkJaW9wdGUsICppb3B0ZSk7CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgZGV2aWNlX21hdGNoX2J5X2FsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gdG9faW9tbXUoZGV2KTsKKwljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKKworCXByX2RlYnVnKCIlczogJXMgJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUsIG5hbWUpOworCisJcmV0dXJuIHN0cmNtcChvYmotPm5hbWUsIG5hbWUpID09IDA7Cit9CisKKy8qKgorICogb21hcF9maW5kX2lvbW11X2RldmljZSgpIC0gZmluZCBhbiBvbWFwIGlvbW11IGRldmljZSBieSBuYW1lCisgKiBAbmFtZToJbmFtZSBvZiB0aGUgaW9tbXUgZGV2aWNlCisgKgorICogVGhlIGdlbmVyaWMgaW9tbXUgQVBJIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gcHJvdmlkZSB0aGUgZGV2aWNlCisgKiBoZSB3aXNoZXMgdG8gYXR0YWNoIHRvIGEgY2VydGFpbiBpb21tdSBkb21haW4uCisgKgorICogRHJpdmVycyBnZW5lcmFsbHkgc2hvdWxkIG5vdCBib3RoZXIgd2l0aCB0aGlzIGFzIGl0IHNob3VsZCBqdXN0CisgKiBiZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBETUEtQVBJIHVzaW5nIGRldl9hcmNoZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFzIGFuIGludGVyaW0gc29sdXRpb24gdW50aWwgdGhlIGxhdHRlcgorICogbWF0ZXJpYWxpemVzLCBhbmQgb21hcDNpc3AgaXMgZnVsbHkgbWlncmF0ZWQgdG8gdGhlIERNQS1BUEkuCisgKi8KK3N0cnVjdCBkZXZpY2UgKm9tYXBfZmluZF9pb21tdV9kZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZHJpdmVyX2ZpbmRfZGV2aWNlKCZvbWFwX2lvbW11X2RyaXZlci5kcml2ZXIsIE5VTEwsCisJCQkJKHZvaWQgKiluYW1lLAorCQkJCWRldmljZV9tYXRjaF9ieV9hbGlhcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZpbmRfaW9tbXVfZGV2aWNlKTsKKworLyoqCisgKiBvbWFwX2lvbW11X2F0dGFjaCgpIC0gYXR0YWNoIGlvbW11IGRldmljZSB0byBhbiBpb21tdSBkb21haW4KKyAqIEBkZXY6CXRhcmdldCBvbWFwIGlvbW11IGRldmljZQorICogQGlvcGdkOglwYWdlIHRhYmxlCisgKiovCitzdGF0aWMgc3RydWN0IG9tYXBfaW9tbXUgKm9tYXBfaW9tbXVfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyICppb3BnZCkKK3sKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gdG9faW9tbXUoZGV2KTsKKworCXNwaW5fbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCS8qIGFuIGlvbW11IGRldmljZSBjYW4gb25seSBiZSBhdHRhY2hlZCBvbmNlICovCisJaWYgKCsrb2JqLT5yZWZjb3VudCA+IDEpIHsKKwkJZGV2X2VycihkZXYsICIlczogYWxyZWFkeSBhdHRhY2hlZCFcbiIsIG9iai0+bmFtZSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCW9iai0+aW9wZ2QgPSBpb3BnZDsKKwllcnIgPSBpb21tdV9lbmFibGUob2JqKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9lbmFibGU7CisJZmx1c2hfaW90bGJfYWxsKG9iaik7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG9iai0+b3duZXIpKQorCQlnb3RvIGVycl9tb2R1bGU7CisKKwlzcGluX3VubG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCWRldl9kYmcob2JqLT5kZXYsICIlczogJXNcbiIsIF9fZnVuY19fLCBvYmotPm5hbWUpOworCXJldHVybiBvYmo7CisKK2Vycl9tb2R1bGU6CisJaWYgKG9iai0+cmVmY291bnQgPT0gMSkKKwkJaW9tbXVfZGlzYWJsZShvYmopOworZXJyX2VuYWJsZToKKwlvYmotPnJlZmNvdW50LS07CisJc3Bpbl91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBvbWFwX2lvbW11X2RldGFjaCAtIHJlbGVhc2UgaW9tbXUgZGV2aWNlCisgKiBAb2JqOgl0YXJnZXQgaW9tbXUKKyAqKi8KK3N0YXRpYyB2b2lkIG9tYXBfaW9tbXVfZGV0YWNoKHN0cnVjdCBvbWFwX2lvbW11ICpvYmopCit7CisJaWYgKCFvYmogfHwgSVNfRVJSKG9iaikpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmb2JqLT5pb21tdV9sb2NrKTsKKworCWlmICgtLW9iai0+cmVmY291bnQgPT0gMCkKKwkJaW9tbXVfZGlzYWJsZShvYmopOworCisJbW9kdWxlX3B1dChvYmotPm93bmVyKTsKKworCW9iai0+aW9wZ2QgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJm9iai0+aW9tbXVfbG9jayk7CisKKwlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICVzXG4iLCBfX2Z1bmNfXywgb2JqLT5uYW1lKTsKK30KKworLyoKKyAqCU9NQVAgRGV2aWNlIE1NVShJT01NVSkgZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG9tYXBfaW9tbXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlpbnQgaXJxOworCXN0cnVjdCBvbWFwX2lvbW11ICpvYmo7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGlvbW11X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpvYmopICsgTU1VX1JFR19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvYmotPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgcGRhdGEtPmNsa19uYW1lKTsKKwlpZiAoSVNfRVJSKG9iai0+Y2xrKSkKKwkJZ290byBlcnJfY2xrOworCisJb2JqLT5ucl90bGJfZW50cmllcyA9IHBkYXRhLT5ucl90bGJfZW50cmllczsKKwlvYmotPm5hbWUgPSBwZGF0YS0+bmFtZTsKKwlvYmotPmRldiA9ICZwZGV2LT5kZXY7CisJb2JqLT5jdHggPSAodm9pZCAqKW9iaiArIHNpemVvZigqb2JqKTsKKwlvYmotPmRhX3N0YXJ0ID0gcGRhdGEtPmRhX3N0YXJ0OworCW9iai0+ZGFfZW5kID0gcGRhdGEtPmRhX2VuZDsKKworCXNwaW5fbG9ja19pbml0KCZvYmotPmlvbW11X2xvY2spOworCW11dGV4X2luaXQoJm9iai0+bW1hcF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqLT5wYWdlX3RhYmxlX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZvYmotPm1tYXApOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9tZW07CisJfQorCisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkgZGV2X25hbWUoJnBkZXYtPmRldikpOworCWlmICghcmVzKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlvYmotPnJlZ2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFvYmotPnJlZ2Jhc2UpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBpb21tdV9mYXVsdF9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIG9iaik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2lycTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvYmopOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlZ2lzdGVyZWRcbiIsIG9iai0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2Vycl9pcnE6CisJaW91bm1hcChvYmotPnJlZ2Jhc2UpOworZXJyX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitlcnJfbWVtOgorCWNsa19wdXQob2JqLT5jbGspOworZXJyX2NsazoKKwlrZnJlZShvYmopOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfaW9tbXVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGlycTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlvcGd0YWJsZV9jbGVhcl9lbnRyeV9hbGwob2JqKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZnJlZV9pcnEoaXJxLCBvYmopOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaW91bm1hcChvYmotPnJlZ2Jhc2UpOworCisJY2xrX3B1dChvYmotPmNsayk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHJlbW92ZWRcbiIsIG9iai0+bmFtZSk7CisJa2ZyZWUob2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9pb21tdV9kcml2ZXIgPSB7CisJLnByb2JlCT0gb21hcF9pb21tdV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3Aob21hcF9pb21tdV9yZW1vdmUpLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gIm9tYXAtaW9tbXUiLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBpb3B0ZV9jYWNoZXBfY3Rvcih2b2lkICppb3B0ZSkKK3sKKwljbGVhbl9kY2FjaGVfYXJlYShpb3B0ZSwgSU9QVEVfVEFCTEVfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9pb21tdV9tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGRhLAorCQkJIHBoeXNfYWRkcl90IHBhLCBpbnQgb3JkZXIsIGludCBwcm90KQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9pb21tdSA9IG9tYXBfZG9tYWluLT5pb21tdV9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gb2lvbW11LT5kZXY7CisJc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFIDw8IG9yZGVyOworCXN0cnVjdCBpb3RsYl9lbnRyeSBlOworCWludCBvbWFwX3Bnc3o7CisJdTMyIHJldCwgZmxhZ3M7CisKKwkvKiB3ZSBvbmx5IHN1cHBvcnQgbWFwcGluZyBhIHNpbmdsZSBpb21tdSBwYWdlIGZvciBub3cgKi8KKwlvbWFwX3Bnc3ogPSBieXRlc190b19pb3Bnc3ooYnl0ZXMpOworCWlmIChvbWFwX3Bnc3ogPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBzaXplIHRvIG1hcDogJWRcbiIsIGJ5dGVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkZXYsICJtYXBwaW5nIGRhIDB4JWx4IHRvIHBhIDB4JXggc2l6ZSAweCV4XG4iLCBkYSwgcGEsIGJ5dGVzKTsKKworCWZsYWdzID0gb21hcF9wZ3N6IHwgcHJvdDsKKworCWlvdGxiX2luaXRfZW50cnkoJmUsIGRhLCBwYSwgZmxhZ3MpOworCisJcmV0ID0gb21hcF9pb3BndGFibGVfc3RvcmVfZW50cnkob2lvbW11LCAmZSk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJvbWFwX2lvcGd0YWJsZV9zdG9yZV9lbnRyeSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvbWFwX2lvbW11X3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBkYSwKKwkJCSAgICBpbnQgb3JkZXIpCit7CisJc3RydWN0IG9tYXBfaW9tbXVfZG9tYWluICpvbWFwX2RvbWFpbiA9IGRvbWFpbi0+cHJpdjsKKwlzdHJ1Y3Qgb21hcF9pb21tdSAqb2lvbW11ID0gb21hcF9kb21haW4tPmlvbW11X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBvaW9tbXUtPmRldjsKKwlzaXplX3QgdW5tYXBfc2l6ZTsKKworCWRldl9kYmcoZGV2LCAidW5tYXBwaW5nIGRhIDB4JWx4IG9yZGVyICVkXG4iLCBkYSwgb3JkZXIpOworCisJdW5tYXBfc2l6ZSA9IGlvcGd0YWJsZV9jbGVhcl9lbnRyeShvaW9tbXUsIGRhKTsKKworCXJldHVybiB1bm1hcF9zaXplID8gZ2V0X29yZGVyKHVubWFwX3NpemUpIDogLUVJTlZBTDsKK30KKworc3RhdGljIGludAorb21hcF9pb21tdV9hdHRhY2hfZGV2KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW4gPSBkb21haW4tPnByaXY7CisJc3RydWN0IG9tYXBfaW9tbXUgKm9pb21tdTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmb21hcF9kb21haW4tPmxvY2spOworCisJLyogb25seSBhIHNpbmdsZSBkZXZpY2UgaXMgc3VwcG9ydGVkIHBlciBkb21haW4gZm9yIG5vdyAqLworCWlmIChvbWFwX2RvbWFpbi0+aW9tbXVfZGV2KSB7CisJCWRldl9lcnIoZGV2LCAiaW9tbXUgZG9tYWluIGlzIGFscmVhZHkgYXR0YWNoZWRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdldCBhIGhhbmRsZSB0byBhbmQgZW5hYmxlIHRoZSBvbWFwIGlvbW11ICovCisJb2lvbW11ID0gb21hcF9pb21tdV9hdHRhY2goZGV2LCBvbWFwX2RvbWFpbi0+cGd0YWJsZSk7CisJaWYgKElTX0VSUihvaW9tbXUpKSB7CisJCXJldCA9IFBUUl9FUlIob2lvbW11KTsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgb21hcCBpb21tdTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW9tYXBfZG9tYWluLT5pb21tdV9kZXYgPSBvaW9tbXU7CisJb2lvbW11LT5kb21haW4gPSBkb21haW47CisKK291dDoKKwlzcGluX3VubG9jaygmb21hcF9kb21haW4tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfaW9tbXVfZGV0YWNoX2RldihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCXN0cnVjdCBvbWFwX2lvbW11ICpvaW9tbXUgPSB0b19pb21tdShkZXYpOworCisJc3Bpbl9sb2NrKCZvbWFwX2RvbWFpbi0+bG9jayk7CisKKwkvKiBvbmx5IGEgc2luZ2xlIGRldmljZSBpcyBzdXBwb3J0ZWQgcGVyIGRvbWFpbiBmb3Igbm93ICovCisJaWYgKG9tYXBfZG9tYWluLT5pb21tdV9kZXYgIT0gb2lvbW11KSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBpb21tdSBkZXZpY2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpb3BndGFibGVfY2xlYXJfZW50cnlfYWxsKG9pb21tdSk7CisKKwlvbWFwX2lvbW11X2RldGFjaChvaW9tbXUpOworCisJb21hcF9kb21haW4tPmlvbW11X2RldiA9IE5VTEw7CisKK291dDoKKwlzcGluX3VubG9jaygmb21hcF9kb21haW4tPmxvY2spOworfQorCitzdGF0aWMgaW50IG9tYXBfaW9tbXVfZG9tYWluX2luaXQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBvbWFwX2lvbW11X2RvbWFpbiAqb21hcF9kb21haW47CisKKwlvbWFwX2RvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpvbWFwX2RvbWFpbiksIEdGUF9LRVJORUwpOworCWlmICghb21hcF9kb21haW4pIHsKKwkJcHJfZXJyKCJremFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCW9tYXBfZG9tYWluLT5wZ3RhYmxlID0ga3phbGxvYyhJT1BHRF9UQUJMRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9tYXBfZG9tYWluLT5wZ3RhYmxlKSB7CisJCXByX2Vycigia3phbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxfbm9tZW07CisJfQorCisJLyoKKwkgKiBzaG91bGQgbmV2ZXIgZmFpbCwgYnV0IHBsZWFzZSBrZWVwIHRoaXMgYXJvdW5kIHRvIGVuc3VyZQorCSAqIHdlIGtlZXAgdGhlIGhhcmR3YXJlIGhhcHB5CisJICovCisJQlVHX09OKCFJU19BTElHTkVEKChsb25nKW9tYXBfZG9tYWluLT5wZ3RhYmxlLCBJT1BHRF9UQUJMRV9TSVpFKSk7CisKKwljbGVhbl9kY2FjaGVfYXJlYShvbWFwX2RvbWFpbi0+cGd0YWJsZSwgSU9QR0RfVEFCTEVfU0laRSk7CisJc3Bpbl9sb2NrX2luaXQoJm9tYXBfZG9tYWluLT5sb2NrKTsKKworCWRvbWFpbi0+cHJpdiA9IG9tYXBfZG9tYWluOworCisJcmV0dXJuIDA7CisKK2ZhaWxfbm9tZW06CisJa2ZyZWUob21hcF9kb21haW4pOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCisvKiBhc3N1bWUgZGV2aWNlIHdhcyBhbHJlYWR5IGRldGFjaGVkICovCitzdGF0aWMgdm9pZCBvbWFwX2lvbW11X2RvbWFpbl9kZXN0cm95KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCisJZG9tYWluLT5wcml2ID0gTlVMTDsKKworCWtmcmVlKG9tYXBfZG9tYWluLT5wZ3RhYmxlKTsKKwlrZnJlZShvbWFwX2RvbWFpbik7Cit9CisKK3N0YXRpYyBwaHlzX2FkZHJfdCBvbWFwX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJCSAgdW5zaWduZWQgbG9uZyBkYSkKK3sKKwlzdHJ1Y3Qgb21hcF9pb21tdV9kb21haW4gKm9tYXBfZG9tYWluID0gZG9tYWluLT5wcml2OworCXN0cnVjdCBvbWFwX2lvbW11ICpvaW9tbXUgPSBvbWFwX2RvbWFpbi0+aW9tbXVfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG9pb21tdS0+ZGV2OworCXUzMiAqcGdkLCAqcHRlOworCXBoeXNfYWRkcl90IHJldCA9IDA7CisKKwlpb3BndGFibGVfbG9va3VwX2VudHJ5KG9pb21tdSwgZGEsICZwZ2QsICZwdGUpOworCisJaWYgKHB0ZSkgeworCQlpZiAoaW9wdGVfaXNfc21hbGwoKnB0ZSkpCisJCQlyZXQgPSBvbWFwX2lvbW11X3RyYW5zbGF0ZSgqcHRlLCBkYSwgSU9QVEVfTUFTSyk7CisJCWVsc2UgaWYgKGlvcHRlX2lzX2xhcmdlKCpwdGUpKQorCQkJcmV0ID0gb21hcF9pb21tdV90cmFuc2xhdGUoKnB0ZSwgZGEsIElPTEFSR0VfTUFTSyk7CisJCWVsc2UKKwkJCWRldl9lcnIoZGV2LCAiYm9ndXMgcHRlIDB4JXgiLCAqcHRlKTsKKwl9IGVsc2UgeworCQlpZiAoaW9wZ2RfaXNfc2VjdGlvbigqcGdkKSkKKwkJCXJldCA9IG9tYXBfaW9tbXVfdHJhbnNsYXRlKCpwZ2QsIGRhLCBJT1NFQ1RJT05fTUFTSyk7CisJCWVsc2UgaWYgKGlvcGdkX2lzX3N1cGVyKCpwZ2QpKQorCQkJcmV0ID0gb21hcF9pb21tdV90cmFuc2xhdGUoKnBnZCwgZGEsIElPU1VQRVJfTUFTSyk7CisJCWVsc2UKKwkJCWRldl9lcnIoZGV2LCAiYm9ndXMgcGdkIDB4JXgiLCAqcGdkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYXBfaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNhcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgb21hcF9pb21tdV9vcHMgPSB7CisJLmRvbWFpbl9pbml0CT0gb21hcF9pb21tdV9kb21haW5faW5pdCwKKwkuZG9tYWluX2Rlc3Ryb3kJPSBvbWFwX2lvbW11X2RvbWFpbl9kZXN0cm95LAorCS5hdHRhY2hfZGV2CT0gb21hcF9pb21tdV9hdHRhY2hfZGV2LAorCS5kZXRhY2hfZGV2CT0gb21hcF9pb21tdV9kZXRhY2hfZGV2LAorCS5tYXAJCT0gb21hcF9pb21tdV9tYXAsCisJLnVubWFwCQk9IG9tYXBfaW9tbXVfdW5tYXAsCisJLmlvdmFfdG9fcGh5cwk9IG9tYXBfaW9tbXVfaW92YV90b19waHlzLAorCS5kb21haW5faGFzX2NhcAk9IG9tYXBfaW9tbXVfZG9tYWluX2hhc19jYXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2lvbW11X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqcDsKKwljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOworCXNpemVfdCBhbGlnbiA9IDEgPDwgMTA7IC8qIEwyIHBhZ2V0YWJsZSBhbGlnbmVtZW50ICovCisKKwlwID0ga21lbV9jYWNoZV9jcmVhdGUoImlvcHRlX2NhY2hlIiwgSU9QVEVfVEFCTEVfU0laRSwgYWxpZ24sIGZsYWdzLAorCQkJICAgICAgaW9wdGVfY2FjaGVwX2N0b3IpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW9wdGVfY2FjaGVwID0gcDsKKworCWJ1c19zZXRfaW9tbXUoJnBsYXRmb3JtX2J1c190eXBlLCAmb21hcF9pb21tdV9vcHMpOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9pb21tdV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQob21hcF9pb21tdV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBfaW9tbXVfZXhpdCh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShpb3B0ZV9jYWNoZXApOworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfaW9tbXVfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXBfaW9tbXVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigib21hcCBpb21tdTogdGxiIGFuZCBwYWdldGFibGUgcHJpbWl0aXZlcyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvbWFwLWlvbW11Iik7CitNT0RVTEVfQVVUSE9SKCJIaXJvc2hpIERPWVUsIFBhdWwgTXVuZHQgYW5kIFRvc2hpaGlybyBLb2JheWFzaGkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb21hcC1pb3ZtbS5jIGIvZHJpdmVycy9pb21tdS9vbWFwLWlvdm1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiZTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW9tbXUvb21hcC1pb3ZtbS5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogb21hcCBpb21tdTogc2ltcGxlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IEhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxwbGF0L2lvbW11Lmg+CisjaW5jbHVkZSA8cGxhdC9pb3ZtbS5oPgorCisjaW5jbHVkZSA8cGxhdC9pb3BndGFibGUuaD4KKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb3ZtX2FyZWFfY2FjaGVwOworCisvKiByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2NhdHRlcmxpc3QgZW50cnkgaW4gYSBzZyB0YWJsZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBzZ3RhYmxlX29mZnNldChjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKK3sKKwlpZiAoIXNndCB8fCAhc2d0LT5uZW50cykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2d0LT5zZ2wtPm9mZnNldDsKK30KKworLyogcmV0dXJuIHRvdGFsIGJ5dGVzIG9mIHNnIGJ1ZmZlcnMgKi8KK3N0YXRpYyBzaXplX3Qgc2d0YWJsZV9sZW4oY29uc3Qgc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJdW5zaWduZWQgaW50IGksIHRvdGFsID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJaWYgKCFzZ3QpCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCWlmICghaW9wZ3N6X29rKGJ5dGVzKSkgeworCQkJcHJfZXJyKCIlczogc2dbJWRdIG5vdCBpb21tdSBwYWdlc2l6ZSgldSAldSlcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGksIGJ5dGVzLCBzZy0+b2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGkgJiYgc2ctPm9mZnNldCkgeworCQkJcHJfZXJyKCIlczogc2dbJWRdIG9mZnNldCBub3QgYWxsb3dlZCBpbiBpbnRlcm5hbCAiCisJCQkJCSJlbnRyaWVzXG4iLCBfX2Z1bmNfXywgaSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXRvdGFsICs9IGJ5dGVzOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKyNkZWZpbmUgc2d0YWJsZV9vayh4KQkoISFzZ3RhYmxlX2xlbih4KSkKKworc3RhdGljIHVuc2lnbmVkIG1heF9hbGlnbm1lbnQodTMyIGFkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgcGFnZXNpemVbXSA9IHsgU1pfMTZNLCBTWl8xTSwgU1pfNjRLLCBTWl80SywgfTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYWdlc2l6ZSkgJiYgYWRkciAmIChwYWdlc2l6ZVtpXSAtIDEpOyBpKyspCisJCTsKKwlyZXR1cm4gKGkgPCBBUlJBWV9TSVpFKHBhZ2VzaXplKSkgPyBwYWdlc2l6ZVtpXSA6IDA7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIG9wdGltYWwgbnVtYmVyIHNnIGVsZW1lbnRzIGZyb20gdG90YWwgYnl0ZXMgYmFzZWQgb24KKyAqIGlvbW11IHN1cGVycGFnZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIHNndGFibGVfbmVudHMoc2l6ZV90IGJ5dGVzLCB1MzIgZGEsIHUzMiBwYSkKK3sKKwl1bnNpZ25lZCBucl9lbnRyaWVzID0gMCwgZW50X3N6OworCisJaWYgKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKSB7CisJCXByX2VycigiJXM6IHdyb25nIHNpemUgJTA4eFxuIiwgX19mdW5jX18sIGJ5dGVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGJ5dGVzKSB7CisJCWVudF9zeiA9IG1heF9hbGlnbm1lbnQoZGEgfCBwYSk7CisJCWVudF9zeiA9IG1pbl90KHVuc2lnbmVkLCBlbnRfc3osIGlvcGdzel9tYXgoYnl0ZXMpKTsKKwkJbnJfZW50cmllcysrOworCQlkYSArPSBlbnRfc3o7CisJCXBhICs9IGVudF9zejsKKwkJYnl0ZXMgLT0gZW50X3N6OworCX0KKworCXJldHVybiBucl9lbnRyaWVzOworfQorCisvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzZ190YWJsZSBoZWFkZXIoYSBraW5kIG9mICdzdXBlcmJsb2NrJykgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnNndGFibGVfYWxsb2MoY29uc3Qgc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MsCisJCQkJCQkJdTMyIGRhLCB1MzIgcGEpCit7CisJdW5zaWduZWQgaW50IG5yX2VudHJpZXM7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKKworCWlmICghYnl0ZXMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaWYgKCFJU19BTElHTkVEKGJ5dGVzLCBQQUdFX1NJWkUpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlmIChmbGFncyAmIElPVk1GX0xJTkVBUikgeworCQlucl9lbnRyaWVzID0gc2d0YWJsZV9uZW50cyhieXRlcywgZGEsIHBhKTsKKwkJaWYgKCFucl9lbnRyaWVzKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfSBlbHNlCisJCW5yX2VudHJpZXMgPSAgYnl0ZXMgLyBQQUdFX1NJWkU7CisKKwlzZ3QgPSBremFsbG9jKHNpemVvZigqc2d0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZ3QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gc2dfYWxsb2NfdGFibGUoc2d0LCBucl9lbnRyaWVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHNndCk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJcHJfZGVidWcoIiVzOiBzZ3Q6JXAoJWQgZW50cmllcylcbiIsIF9fZnVuY19fLCBzZ3QsIG5yX2VudHJpZXMpOworCisJcmV0dXJuIHNndDsKK30KKworLyogZnJlZSBzZ190YWJsZSBoZWFkZXIoYSBraW5kIG9mIHN1cGVyYmxvY2spICovCitzdGF0aWMgdm9pZCBzZ3RhYmxlX2ZyZWUoc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJaWYgKCFzZ3QpCisJCXJldHVybjsKKworCXNnX2ZyZWVfdGFibGUoc2d0KTsKKwlrZnJlZShzZ3QpOworCisJcHJfZGVidWcoIiVzOiBzZ3Q6JXBcbiIsIF9fZnVuY19fLCBzZ3QpOworfQorCisvKiBtYXAgJ3NnbGlzdCcgdG8gYSBjb250aWd1b3VzIG1wdSB2aXJ0dWFsIGFyZWEgYW5kIHJldHVybiAndmEnICovCitzdGF0aWMgdm9pZCAqdm1hcF9zZyhjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCkKK3sKKwl1MzIgdmE7CisJc2l6ZV90IHRvdGFsOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHZtX3N0cnVjdCAqbmV3OworCWNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqbXR5cGU7CisKKwltdHlwZSA9IGdldF9tZW1fdHlwZShNVF9ERVZJQ0UpOworCWlmICghbXR5cGUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJdG90YWwgPSBzZ3RhYmxlX2xlbihzZ3QpOworCWlmICghdG90YWwpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbmV3ID0gX19nZXRfdm1fYXJlYSh0b3RhbCwgVk1fSU9SRU1BUCwgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQpOworCWlmICghbmV3KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl2YSA9ICh1MzIpbmV3LT5hZGRyOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKwkJdTMyIHBhOworCQlpbnQgZXJyOworCisJCXBhID0gc2dfcGh5cyhzZykgLSBzZy0+b2Zmc2V0OworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCUJVR19PTihieXRlcyAhPSBQQUdFX1NJWkUpOworCisJCWVyciA9IGlvcmVtYXBfcGFnZSh2YSwgIHBhLCBtdHlwZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJdmEgKz0gYnl0ZXM7CisJfQorCisJZmx1c2hfY2FjaGVfdm1hcCgodW5zaWduZWQgbG9uZyluZXctPmFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKG5ldy0+YWRkciArIHRvdGFsKSk7CisJcmV0dXJuIG5ldy0+YWRkcjsKKworZXJyX291dDoKKwlXQVJOX09OKDEpOyAvKiBGSVhNRTogY2xlYW51cCBzb21lIG1wdSBtYXBwaW5ncyAqLworCXZ1bm1hcChuZXctPmFkZHIpOworCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdnVubWFwX3NnKGNvbnN0IHZvaWQgKnZhKQoreworCXZ1bm1hcCh2YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW92bV9zdHJ1Y3QgKl9fZmluZF9pb3ZtX2FyZWEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwKKwkJCQkJCQljb25zdCB1MzIgZGEpCit7CisJc3RydWN0IGlvdm1fc3RydWN0ICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCQlpZiAoKGRhID49IHRtcC0+ZGFfc3RhcnQpICYmIChkYSA8IHRtcC0+ZGFfZW5kKSkgeworCQkJc2l6ZV90IGxlbjsKKworCQkJbGVuID0gdG1wLT5kYV9lbmQgLSB0bXAtPmRhX3N0YXJ0OworCisJCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6ICUwOHgtJTA4eC0lMDh4KCV4KSAlMDh4XG4iLAorCQkJCV9fZnVuY19fLCB0bXAtPmRhX3N0YXJ0LCBkYSwgdG1wLT5kYV9lbmQsIGxlbiwKKwkJCQl0bXAtPmZsYWdzKTsKKworCQkJcmV0dXJuIHRtcDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG9tYXBfZmluZF9pb3ZtX2FyZWEgIC0gIGZpbmQgaW92bWEgd2hpY2ggaW5jbHVkZXMgQGRhCisgKiBAZGE6CQlpb21tdSBkZXZpY2UgdmlydHVhbCBhZGRyZXNzCisgKgorICogRmluZCB0aGUgZXhpc3RpbmcgaW92bWEgc3RhcnRpbmcgYXQgQGRhCisgKi8KK3N0cnVjdCBpb3ZtX3N0cnVjdCAqb21hcF9maW5kX2lvdm1fYXJlYShzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCisJbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOworCWFyZWEgPSBfX2ZpbmRfaW92bV9hcmVhKG9iaiwgZGEpOworCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJcmV0dXJuIGFyZWE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2ZpbmRfaW92bV9hcmVhKTsKKworLyoKKyAqIFRoaXMgZmluZHMgdGhlIGhvbGUoYXJlYSkgd2hpY2ggZml0cyB0aGUgcmVxdWVzdGVkIGFkZHJlc3MgYW5kIGxlbgorICogaW4gaW92bWFzIG1tYXAsIGFuZCByZXR1cm5zIHRoZSBuZXcgYWxsb2NhdGVkIGlvdm1hLgorICovCitzdGF0aWMgc3RydWN0IGlvdm1fc3RydWN0ICphbGxvY19pb3ZtX2FyZWEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhLAorCQkJCQkgICBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKm5ldywgKnRtcDsKKwl1MzIgc3RhcnQsIHByZXZfZW5kLCBhbGlnbm1lbnQ7CisKKwlpZiAoIW9iaiB8fCAhYnl0ZXMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJc3RhcnQgPSBkYTsKKwlhbGlnbm1lbnQgPSBQQUdFX1NJWkU7CisKKwlpZiAofmZsYWdzICYgSU9WTUZfREFfRklYRUQpIHsKKwkJLyogRG9uJ3QgbWFwIGFkZHJlc3MgMCAqLworCQlzdGFydCA9IG9iai0+ZGFfc3RhcnQgPyBvYmotPmRhX3N0YXJ0IDogYWxpZ25tZW50OworCisJCWlmIChmbGFncyAmIElPVk1GX0xJTkVBUikKKwkJCWFsaWdubWVudCA9IGlvcGdzel9tYXgoYnl0ZXMpOworCQlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIGFsaWdubWVudCk7CisJfSBlbHNlIGlmIChzdGFydCA8IG9iai0+ZGFfc3RhcnQgfHwgc3RhcnQgPiBvYmotPmRhX2VuZCB8fAorCQkJCQlvYmotPmRhX2VuZCAtIHN0YXJ0IDwgYnl0ZXMpIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJdG1wID0gTlVMTDsKKwlpZiAobGlzdF9lbXB0eSgmb2JqLT5tbWFwKSkKKwkJZ290byBmb3VuZDsKKworCXByZXZfZW5kID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm9iai0+bW1hcCwgbGlzdCkgeworCisJCWlmIChwcmV2X2VuZCA+IHN0YXJ0KQorCQkJYnJlYWs7CisKKwkJaWYgKHRtcC0+ZGFfc3RhcnQgPiBzdGFydCAmJiAodG1wLT5kYV9zdGFydCAtIHN0YXJ0KSA+PSBieXRlcykKKwkJCWdvdG8gZm91bmQ7CisKKwkJaWYgKHRtcC0+ZGFfZW5kID49IHN0YXJ0ICYmIH5mbGFncyAmIElPVk1GX0RBX0ZJWEVEKQorCQkJc3RhcnQgPSByb3VuZHVwKHRtcC0+ZGFfZW5kICsgMSwgYWxpZ25tZW50KTsKKworCQlwcmV2X2VuZCA9IHRtcC0+ZGFfZW5kOworCX0KKworCWlmICgoc3RhcnQgPj0gcHJldl9lbmQpICYmIChvYmotPmRhX2VuZCAtIHN0YXJ0ID49IGJ5dGVzKSkKKwkJZ290byBmb3VuZDsKKworCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gc3BhY2UgdG8gZml0ICUwOHgoJXgpIGZsYWdzOiAlMDh4XG4iLAorCQlfX2Z1bmNfXywgZGEsIGJ5dGVzLCBmbGFncyk7CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworZm91bmQ6CisJbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoaW92bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXcpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbmV3LT5pb21tdSA9IG9iajsKKwluZXctPmRhX3N0YXJ0ID0gc3RhcnQ7CisJbmV3LT5kYV9lbmQgPSBzdGFydCArIGJ5dGVzOworCW5ldy0+ZmxhZ3MgPSBmbGFnczsKKworCS8qCisJICoga2VlcCBhc2NlbmRpbmcgb3JkZXIgb2YgaW92bWFzCisJICovCisJaWYgKHRtcCkKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCAmdG1wLT5saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkKCZuZXctPmxpc3QsICZvYmotPm1tYXApOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBmb3VuZCAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwKKwkJX19mdW5jX18sIG5ldy0+ZGFfc3RhcnQsIHN0YXJ0LCBuZXctPmRhX2VuZCwgYnl0ZXMsIGZsYWdzKTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaW92bV9hcmVhKHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHN0cnVjdCBpb3ZtX3N0cnVjdCAqYXJlYSkKK3sKKwlzaXplX3QgYnl0ZXM7CisKKwlCVUdfT04oIW9iaiB8fCAhYXJlYSk7CisKKwlieXRlcyA9IGFyZWEtPmRhX2VuZCAtIGFyZWEtPmRhX3N0YXJ0OworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4LSUwOHgoJXgpICUwOHhcbiIsCisJCV9fZnVuY19fLCBhcmVhLT5kYV9zdGFydCwgYXJlYS0+ZGFfZW5kLCBieXRlcywgYXJlYS0+ZmxhZ3MpOworCisJbGlzdF9kZWwoJmFyZWEtPmxpc3QpOworCWttZW1fY2FjaGVfZnJlZShpb3ZtX2FyZWFfY2FjaGVwLCBhcmVhKTsKK30KKworLyoqCisgKiBvbWFwX2RhX3RvX3ZhIC0gY29udmVydCAoZCkgdG8gKHYpCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqIEB2YToJCW1wdSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIG1wdSB2aXJ0dWFsIGFkZHIgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBkZXZpY2UgdmlydHVhbCBhZGRyCisgKi8KK3ZvaWQgKm9tYXBfZGFfdG9fdmEoc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwgdTMyIGRhKQoreworCXZvaWQgKnZhID0gTlVMTDsKKwlzdHJ1Y3QgaW92bV9zdHJ1Y3QgKmFyZWE7CisKKwltdXRleF9sb2NrKCZvYmotPm1tYXBfbG9jayk7CisKKwlhcmVhID0gX19maW5kX2lvdm1fYXJlYShvYmosIGRhKTsKKwlpZiAoIWFyZWEpIHsKKwkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBubyBkYSBhcmVhKCUwOHgpXG4iLCBfX2Z1bmNfXywgZGEpOworCQlnb3RvIG91dDsKKwl9CisJdmEgPSBhcmVhLT52YTsKK291dDoKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKworCXJldHVybiB2YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfZGFfdG9fdmEpOworCitzdGF0aWMgdm9pZCBzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqX3ZhKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdm9pZCAqdmEgPSBfdmE7CisJdm9pZCAqdmFfZW5kOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXN0cnVjdCBwYWdlICpwZzsKKwkJY29uc3Qgc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFOworCisJCS8qCisJCSAqIGlvbW11ICdzdXBlcnBhZ2UnIGlzbid0IHN1cHBvcnRlZCB3aXRoICdvbWFwX2lvbW11X3ZtYWxsb2MoKScKKwkJICovCisJCXBnID0gdm1hbGxvY190b19wYWdlKHZhKTsKKwkJQlVHX09OKCFwZyk7CisJCXNnX3NldF9wYWdlKHNnLCBwZywgYnl0ZXMsIDApOworCisJCXZhICs9IGJ5dGVzOworCX0KKworCXZhX2VuZCA9IF92YSArIFBBR0VfU0laRSAqIGk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ3RhYmxlX2RyYWluX3ZtYWxsb2Moc3RydWN0IHNnX3RhYmxlICpzZ3QpCit7CisJLyoKKwkgKiBBY3R1YWxseSB0aGlzIGlzIG5vdCBuZWNlc3NhcnkgYXQgYWxsLCBqdXN0IGV4aXN0cyBmb3IKKwkgKiBjb25zaXN0ZW5jeSBvZiB0aGUgY29kZSByZWFkYWJpbGl0eS4KKwkgKi8KKwlCVUdfT04oIXNndCk7Cit9CisKKy8qIGNyZWF0ZSAnZGEnIDwtPiAncGEnIG1hcHBpbmcgZnJvbSAnc2d0JyAqLworc3RhdGljIGludCBtYXBfaW92bV9hcmVhKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGlvdm1fc3RydWN0ICpuZXcsCisJCQljb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdTMyIGZsYWdzKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1MzIgZGEgPSBuZXctPmRhX3N0YXJ0OworCWludCBvcmRlcjsKKworCWlmICghZG9tYWluIHx8ICFzZ3QpCisJCXJldHVybiAtRUlOVkFMOworCisJQlVHX09OKCFzZ3RhYmxlX29rKHNndCkpOworCisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXUzMiBwYTsKKwkJc2l6ZV90IGJ5dGVzOworCisJCXBhID0gc2dfcGh5cyhzZykgLSBzZy0+b2Zmc2V0OworCQlieXRlcyA9IHNnLT5sZW5ndGggKyBzZy0+b2Zmc2V0OworCisJCWZsYWdzICY9IH5JT1ZNRl9QR1NaX01BU0s7CisKKwkJaWYgKGJ5dGVzX3RvX2lvcGdzeihieXRlcykgPCAwKQorCQkJZ290byBlcnJfb3V0OworCisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQlwcl9kZWJ1ZygiJXM6IFslZF0gJTA4eCAlMDh4KCV4KVxuIiwgX19mdW5jX18sCisJCQkgaSwgZGEsIHBhLCBieXRlcyk7CisKKwkJZXJyID0gaW9tbXVfbWFwKGRvbWFpbiwgZGEsIHBhLCBvcmRlciwgZmxhZ3MpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCisJCWRhICs9IGJ5dGVzOworCX0KKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkYSA9IG5ldy0+ZGFfc3RhcnQ7CisKKwlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgc2csIGksIGopIHsKKwkJc2l6ZV90IGJ5dGVzOworCisJCWJ5dGVzID0gc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQ7CisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQkvKiBpZ25vcmUgZmFpbHVyZXMuLiB3ZSdyZSBhbHJlYWR5IGhhbmRsaW5nIG9uZSAqLworCQlpb21tdV91bm1hcChkb21haW4sIGRhLCBvcmRlcik7CisKKwkJZGEgKz0gYnl0ZXM7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIHJlbGVhc2UgJ2RhJyA8LT4gJ3BhJyBtYXBwaW5nICovCitzdGF0aWMgdm9pZCB1bm1hcF9pb3ZtX2FyZWEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhKQoreworCXUzMiBzdGFydDsKKwlzaXplX3QgdG90YWwgPSBhcmVhLT5kYV9lbmQgLSBhcmVhLT5kYV9zdGFydDsKKwljb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IGFyZWEtPnNndDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpLCBlcnI7CisKKwlCVUdfT04oIXNndGFibGVfb2soc2d0KSk7CisJQlVHX09OKCghdG90YWwpIHx8ICFJU19BTElHTkVEKHRvdGFsLCBQQUdFX1NJWkUpKTsKKworCXN0YXJ0ID0gYXJlYS0+ZGFfc3RhcnQ7CisJZm9yX2VhY2hfc2coc2d0LT5zZ2wsIHNnLCBzZ3QtPm5lbnRzLCBpKSB7CisJCXNpemVfdCBieXRlczsKKwkJaW50IG9yZGVyOworCisJCWJ5dGVzID0gc2ctPmxlbmd0aCArIHNnLT5vZmZzZXQ7CisJCW9yZGVyID0gZ2V0X29yZGVyKGJ5dGVzKTsKKworCQllcnIgPSBpb21tdV91bm1hcChkb21haW4sIHN0YXJ0LCBvcmRlcik7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJZGV2X2RiZyhvYmotPmRldiwgIiVzOiB1bm1hcCAlMDh4KCV4KSAlMDh4XG4iLAorCQkJCV9fZnVuY19fLCBzdGFydCwgYnl0ZXMsIGFyZWEtPmZsYWdzKTsKKworCQlCVUdfT04oIUlTX0FMSUdORUQoYnl0ZXMsIFBBR0VfU0laRSkpOworCisJCXRvdGFsIC09IGJ5dGVzOworCQlzdGFydCArPSBieXRlczsKKwl9CisJQlVHX09OKHRvdGFsKTsKK30KKworLyogdGVtcGxhdGUgZnVuY3Rpb24gZm9yIGFsbCB1bm1hcHBpbmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKnVubWFwX3ZtX2FyZWEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICAgIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIGNvbnN0IHUzMiBkYSwKKwkJCQkgICAgICB2b2lkICgqZm4pKGNvbnN0IHZvaWQgKiksIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IE5VTEw7CisJc3RydWN0IGlvdm1fc3RydWN0ICphcmVhOworCisJaWYgKCFJU19BTElHTkVEKGRhLCBQQUdFX1NJWkUpKSB7CisJCWRldl9lcnIob2JqLT5kZXYsICIlczogYWxpZ25tZW50IGVyciglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXV0ZXhfbG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJYXJlYSA9IF9fZmluZF9pb3ZtX2FyZWEob2JqLCBkYSk7CisJaWYgKCFhcmVhKSB7CisJCWRldl9kYmcob2JqLT5kZXYsICIlczogbm8gZGEgYXJlYSglMDh4KVxuIiwgX19mdW5jX18sIGRhKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChhcmVhLT5mbGFncyAmIGZsYWdzKSAhPSBmbGFncykgeworCQlkZXZfZXJyKG9iai0+ZGV2LCAiJXM6IHdyb25nIGZsYWdzKCUwOHgpXG4iLCBfX2Z1bmNfXywKKwkJCWFyZWEtPmZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCXNndCA9IChzdHJ1Y3Qgc2dfdGFibGUgKilhcmVhLT5zZ3Q7CisKKwl1bm1hcF9pb3ZtX2FyZWEoZG9tYWluLCBvYmosIGFyZWEpOworCisJZm4oYXJlYS0+dmEpOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiAlMDh4LSUwOHgtJTA4eCgleCkgJTA4eFxuIiwgX19mdW5jX18sCisJCWFyZWEtPmRhX3N0YXJ0LCBkYSwgYXJlYS0+ZGFfZW5kLAorCQlhcmVhLT5kYV9lbmQgLSBhcmVhLT5kYV9zdGFydCwgYXJlYS0+ZmxhZ3MpOworCisJZnJlZV9pb3ZtX2FyZWEob2JqLCBhcmVhKTsKK291dDoKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKworCXJldHVybiBzZ3Q7Cit9CisKK3N0YXRpYyB1MzIgbWFwX2lvbW11X3JlZ2lvbihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosCisJCQkJdTMyIGRhLCBjb25zdCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwgdm9pZCAqdmEsCisJCQkJc2l6ZV90IGJ5dGVzLCB1MzIgZmxhZ3MpCit7CisJaW50IGVyciA9IC1FTk9NRU07CisJc3RydWN0IGlvdm1fc3RydWN0ICpuZXc7CisKKwltdXRleF9sb2NrKCZvYmotPm1tYXBfbG9jayk7CisKKwluZXcgPSBhbGxvY19pb3ZtX2FyZWEob2JqLCBkYSwgYnl0ZXMsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKG5ldykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXcpOworCQlnb3RvIGVycl9hbGxvY19pb3ZtYTsKKwl9CisJbmV3LT52YSA9IHZhOworCW5ldy0+c2d0ID0gc2d0OworCisJaWYgKG1hcF9pb3ZtX2FyZWEoZG9tYWluLCBuZXcsIHNndCwgbmV3LT5mbGFncykpCisJCWdvdG8gZXJyX21hcDsKKworCW11dGV4X3VubG9jaygmb2JqLT5tbWFwX2xvY2spOworCisJZGV2X2RiZyhvYmotPmRldiwgIiVzOiBkYTolMDh4KCV4KSBmbGFnczolMDh4IHZhOiVwXG4iLAorCQlfX2Z1bmNfXywgbmV3LT5kYV9zdGFydCwgYnl0ZXMsIG5ldy0+ZmxhZ3MsIHZhKTsKKworCXJldHVybiBuZXctPmRhX3N0YXJ0OworCitlcnJfbWFwOgorCWZyZWVfaW92bV9hcmVhKG9iaiwgbmV3KTsKK2Vycl9hbGxvY19pb3ZtYToKKwltdXRleF91bmxvY2soJm9iai0+bW1hcF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX19pb21tdV92bWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IG9tYXBfaW9tbXUgKm9iaiwKKwkJCQl1MzIgZGEsIGNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LAorCQkJCXZvaWQgKnZhLCBzaXplX3QgYnl0ZXMsIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gbWFwX2lvbW11X3JlZ2lvbihkb21haW4sIG9iaiwgZGEsIHNndCwgdmEsIGJ5dGVzLCBmbGFncyk7Cit9CisKKy8qKgorICogb21hcF9pb21tdV92bWFwICAtICAoZCktKHApLSh2KSBhZGRyZXNzIG1hcHBlcgorICogQG9iajoJb2JqZWN0aXZlIGlvbW11CisgKiBAc2d0OglhZGRyZXNzIG9mIHNjYXR0ZXIgZ2F0aGVyIHRhYmxlCisgKiBAZmxhZ3M6CWlvdm1hIGFuZCBwYWdlIHByb3BlcnR5CisgKgorICogQ3JlYXRlcyAxLW4tMSBtYXBwaW5nIHdpdGggZ2l2ZW4gQHNndCBhbmQgcmV0dXJucyBAZGEuCisgKiBBbGwgQHNndCBlbGVtZW50IG11c3QgYmUgaW8gcGFnZSBzaXplIGFsaWduZWQuCisgKi8KK3UzMiBvbWFwX2lvbW11X3ZtYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEsCisJCWNvbnN0IHN0cnVjdCBzZ190YWJsZSAqc2d0LCB1MzIgZmxhZ3MpCit7CisJc2l6ZV90IGJ5dGVzOworCXZvaWQgKnZhID0gTlVMTDsKKworCWlmICghb2JqIHx8ICFvYmotPmRldiB8fCAhc2d0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ5dGVzID0gc2d0YWJsZV9sZW4oc2d0KTsKKwlpZiAoIWJ5dGVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOworCisJaWYgKGZsYWdzICYgSU9WTUZfTU1JTykgeworCQl2YSA9IHZtYXBfc2coc2d0KTsKKwkJaWYgKElTX0VSUih2YSkpCisJCQlyZXR1cm4gUFRSX0VSUih2YSk7CisJfQorCisJZmxhZ3MgfD0gSU9WTUZfRElTQ09OVDsKKwlmbGFncyB8PSBJT1ZNRl9NTUlPOworCisJZGEgPSBfX2lvbW11X3ZtYXAoZG9tYWluLCBvYmosIGRhLCBzZ3QsIHZhLCBieXRlcywgZmxhZ3MpOworCWlmIChJU19FUlJfVkFMVUUoZGEpKQorCQl2dW5tYXBfc2codmEpOworCisJcmV0dXJuIGRhICsgc2d0YWJsZV9vZmZzZXQoc2d0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9tYXBfaW9tbXVfdm1hcCk7CisKKy8qKgorICogb21hcF9pb21tdV92dW5tYXAgIC0gIHJlbGVhc2UgdmlydHVhbCBtYXBwaW5nIG9idGFpbmVkIGJ5ICdvbWFwX2lvbW11X3ZtYXAoKScKKyAqIEBvYmo6CW9iamVjdGl2ZSBpb21tdQorICogQGRhOgkJaW9tbXUgZGV2aWNlIHZpcnR1YWwgYWRkcmVzcworICoKKyAqIEZyZWUgdGhlIGlvbW11IHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0CisgKiBAZGEsIHdoaWNoIHdhcyByZXR1cm5lZCBieSAnb21hcF9pb21tdV92bWFwKCknLgorICovCitzdHJ1Y3Qgc2dfdGFibGUgKgorb21hcF9pb21tdV92dW5tYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLCB1MzIgZGEpCit7CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisJLyoKKwkgKiAnc2d0JyBpcyBhbGxvY2F0ZWQgYmVmb3JlICdvbWFwX2lvbW11X3ZtYWxsb2MoKScgaXMgY2FsbGVkLgorCSAqIEp1c3QgcmV0dXJucyAnc2d0JyB0byB0aGUgY2FsbGVyIHRvIGZyZWUKKwkgKi8KKwlkYSAmPSBQQUdFX01BU0s7CisJc2d0ID0gdW5tYXBfdm1fYXJlYShkb21haW4sIG9iaiwgZGEsIHZ1bm1hcF9zZywKKwkJCQkJSU9WTUZfRElTQ09OVCB8IElPVk1GX01NSU8pOworCWlmICghc2d0KQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOworCXJldHVybiBzZ3Q7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3Z1bm1hcCk7CisKKy8qKgorICogb21hcF9pb21tdV92bWFsbG9jICAtICAoZCktKHApLSh2KSBhZGRyZXNzIGFsbG9jYXRvciBhbmQgbWFwcGVyCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWNvbnRpZ3VvdXMgaW9tbXUgdmlydHVhbCBtZW1vcnkKKyAqIEBieXRlczoJYWxsb2NhdGlvbiBzaXplCisgKiBAZmxhZ3M6CWlvdm1hIGFuZCBwYWdlIHByb3BlcnR5CisgKgorICogQWxsb2NhdGUgQGJ5dGVzIGxpbmVhcmx5IGFuZCBjcmVhdGVzIDEtbi0xIG1hcHBpbmcgYW5kIHJldHVybnMKKyAqIEBkYSBhZ2Fpbiwgd2hpY2ggbWlnaHQgYmUgYWRqdXN0ZWQgaWYgJ0lPVk1GX0RBX0ZJWEVEJyBpcyBub3Qgc2V0LgorICovCit1MzIKK29tYXBfaW9tbXVfdm1hbGxvYyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBvbWFwX2lvbW11ICpvYmosIHUzMiBkYSwKKwkJCQkJCXNpemVfdCBieXRlcywgdTMyIGZsYWdzKQoreworCXZvaWQgKnZhOworCXN0cnVjdCBzZ190YWJsZSAqc2d0OworCisJaWYgKCFvYmogfHwgIW9iai0+ZGV2IHx8ICFieXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlcyA9IFBBR0VfQUxJR04oYnl0ZXMpOworCisJdmEgPSB2bWFsbG9jKGJ5dGVzKTsKKwlpZiAoIXZhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZsYWdzIHw9IElPVk1GX0RJU0NPTlQ7CisJZmxhZ3MgfD0gSU9WTUZfQUxMT0M7CisKKwlzZ3QgPSBzZ3RhYmxlX2FsbG9jKGJ5dGVzLCBmbGFncywgZGEsIDApOworCWlmIChJU19FUlIoc2d0KSkgeworCQlkYSA9IFBUUl9FUlIoc2d0KTsKKwkJZ290byBlcnJfc2d0X2FsbG9jOworCX0KKwlzZ3RhYmxlX2ZpbGxfdm1hbGxvYyhzZ3QsIHZhKTsKKworCWRhID0gX19pb21tdV92bWFwKGRvbWFpbiwgb2JqLCBkYSwgc2d0LCB2YSwgYnl0ZXMsIGZsYWdzKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKKwkJZ290byBlcnJfaW9tbXVfdm1hcDsKKworCXJldHVybiBkYTsKKworZXJyX2lvbW11X3ZtYXA6CisJc2d0YWJsZV9kcmFpbl92bWFsbG9jKHNndCk7CisJc2d0YWJsZV9mcmVlKHNndCk7CitlcnJfc2d0X2FsbG9jOgorCXZmcmVlKHZhKTsKKwlyZXR1cm4gZGE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2lvbW11X3ZtYWxsb2MpOworCisvKioKKyAqIG9tYXBfaW9tbXVfdmZyZWUgIC0gIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSAnb21hcF9pb21tdV92bWFsbG9jKCknCisgKiBAb2JqOglvYmplY3RpdmUgaW9tbXUKKyAqIEBkYToJCWlvbW11IGRldmljZSB2aXJ0dWFsIGFkZHJlc3MKKyAqCisgKiBGcmVlcyB0aGUgaW9tbXUgdmlydHVhbGx5IGNvbnRpbnVvdXMgbWVtb3J5IGFyZWEgc3RhcnRpbmcgYXQKKyAqIEBkYSwgYXMgb2J0YWluZWQgZnJvbSAnb21hcF9pb21tdV92bWFsbG9jKCknLgorICovCit2b2lkIG9tYXBfaW9tbXVfdmZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3Qgb21hcF9pb21tdSAqb2JqLAorCQkJCQkJCQljb25zdCB1MzIgZGEpCit7CisJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CisKKwlzZ3QgPSB1bm1hcF92bV9hcmVhKGRvbWFpbiwgb2JqLCBkYSwgdmZyZWUsCisJCQkJCQlJT1ZNRl9ESVNDT05UIHwgSU9WTUZfQUxMT0MpOworCWlmICghc2d0KQorCQlkZXZfZGJnKG9iai0+ZGV2LCAiJXM6IE5vIHNndFxuIiwgX19mdW5jX18pOworCXNndGFibGVfZnJlZShzZ3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9pb21tdV92ZnJlZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlvdm1tX2luaXQodm9pZCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU0xBQl9IV0NBQ0hFX0FMSUdOOworCXN0cnVjdCBrbWVtX2NhY2hlICpwOworCisJcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpb3ZtX2FyZWFfY2FjaGUiLCBzaXplb2Yoc3RydWN0IGlvdm1fc3RydWN0KSwgMCwKKwkJCSAgICAgIGZsYWdzLCBOVUxMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCWlvdm1fYXJlYV9jYWNoZXAgPSBwOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpb3ZtbV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGlvdm1tX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaW92bV9hcmVhX2NhY2hlcCk7Cit9Cittb2R1bGVfZXhpdChpb3ZtbV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJvbWFwIGlvbW11OiBzaW1wbGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hbmFnZW1lbnQiKTsKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgRE9ZVSA8SGlyb3NoaS5ET1lVQG5va2lhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL0tjb25maWcKaW5kZXggNGZiNjAxNi4uYTIzM2VkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL0tjb25maWcKQEAgLTUsNyArNSw3IEBACiBtZW51Y29uZmlnIElTRE4KIAlib29sICJJU0ROIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiAhUzM5MCAmJiAhVU1MCiAJLS0taGVscC0tLQogCSAgSVNETiAoIkludGVncmF0ZWQgU2VydmljZXMgRGlnaXRhbCBOZXR3b3JrIiwgY2FsbGVkIFJOSVMgaW4gRnJhbmNlKQogCSAgaXMgYSBmdWxseSBkaWdpdGFsIHRlbGVwaG9uZSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZvaWNlIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCmluZGV4IGVhMmRmZjYuLjhkNTFjZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBjaGFyICpzdGF0ZTJzdHIodW5zaWduZWQgc2hvcnQgc3RhdGUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9hc3luY2RhdGEuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCmluZGV4IGMzYjFkYzMuLmZkZGFlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSAiZ2lnYXNldC5oIgogI2luY2x1ZGUgPGxpbnV4L2NyYy1jY2l0dC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKiBjaGVjayBpZiBieXRlIG11c3QgYmUgc3R1ZmZlZC9lc2NhcGVkCiAgKiBJJ20gbm90IHN1cmUgd2hpY2ggZGF0YSBzaG91bGQgYmUgZW5jb2RlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NhcGkuYwppbmRleCA2NThlNzVmLi42ZDVjZWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvY2FwaS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpdXRpbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKiBtaXNzaW5nIGZyb20ga2VybmVsY2FwaS5oICovCiAjZGVmaW5lIENhcGlOY3BpTm90U3VwcG9ydGVkQnlQcm90b2NvbAkweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2R1bW15bGwuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2R1bW15bGwuYwppbmRleCBiZDBiMWVhLi4xOWIxYzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9kdW1teWxsLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZHVtbXlsbC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZ2lnYXNldC5oIgogCiB2b2lkIGdpZ2FzZXRfc2tiX3NlbnQoc3RydWN0IGJjX3N0YXRlICpiY3MsIHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYwppbmRleCBiYTc0NjQ2Li42ZDEyNjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJnaWdhc2V0LmgiCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2k0bC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKaW5kZXggOWJlYzhiOS4uMDQyMzFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9pc2RuaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2RlZmluZSBTQlVGU0laRQk0MDk2CS8qIHNrX2J1ZmYgcGF5bG9hZCBzaXplICovCiAjZGVmaW5lIFRSQU5TQlVGU0laRQk3NjgJLyogYnl0ZXMgcGVyIHNrYiBmb3IgdHJhbnNwYXJlbnQgcmVjZWl2ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwppbmRleCBlMzUwNThiLi5lZTBhNTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9naWdhc2V0X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qKiogb3VyIGlvY3RscyAqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlzYXIuYwppbmRleCBkMTNmYTViLi43MDM0YWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pc2FyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXNhci5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbUlTRE5ody5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImlzYXIuaCIKIAogI2RlZmluZSBJU0FSX1JFVgkiMi4xIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwppbmRleCAzN2U2ODVlLi5jNDg5N2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwpAQCAtNjUsNyArNjUsNyBAQAogCXJldHVybiAoc3RydWN0IElzZG5DYXJkU3RhdGUgKikgMDsKIH0KIAotc3RhdGljIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkgdm9pZAorc3RhdGljIF9fcHJpbnRmKDMsIDQpIHZvaWQKIGxpbmtfZGVidWcoc3RydWN0IENoYW5uZWwgKmNoYW5wLCBpbnQgZGlyZWN0aW9uLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKSB2b2lkCitzdGF0aWMgX19wcmludGYoMiwgMykgdm9pZAogY2FsbGNfZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCmluZGV4IDBhNWM0MmEuLmFmZjQ1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oCkBAIC0xMjg3LDkgKzEyODcsOSBAQAogCiBpbnQgSGlTYXhfY29tbWFuZChpc2RuX2N0cmwgKiBpYyk7CiBpbnQgSGlTYXhfd3JpdGVidWZfc2tiKGludCBpZCwgaW50IGNoYW4sIGludCBhY2ssIHN0cnVjdCBza19idWZmICpza2IpOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIHZvaWQgSGlTYXhfcHV0c3RhdHVzKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgY2hhciAqaGVhZCwgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgMCkpKQorX19wcmludGYoMywgMCkKIHZvaWQgVkhpU2F4X3B1dHN0YXR1cyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGNoYXIgKmhlYWQsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIHZvaWQgSGlTYXhfcmVwb3J0Y2FyZChpbnQgY2FyZG5yLCBpbnQgc2VsKTsKIGludCBRdWlja0hleChjaGFyICp0eHQsIHVfY2hhciAqIHAsIGludCBjbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5oCmluZGV4IDQyNWQ4NjEuLjY2ZGRjYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNkZWZpbmUgQl9YTVRCVUZSRUFEWQkxCiAjZGVmaW5lIEJfQUNLUEVORElORwkyCiAKLV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK19fcHJpbnRmKDIsIDMpCiB2b2lkIGRlYnVnbDEoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBjaGFyICpmbXQsIC4uLik7CiB2b2lkIERDaGFubmVsX3Byb2NfeG10KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CiB2b2lkIERDaGFubmVsX3Byb2NfcmN2KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMKaW5kZXggYWQyOTFmMi4uMWMyNGU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYwpAQCAtNjYsNyArNjYsNyBAQAogCSJFVl9USU1FT1VUIiwKIH07CiAKLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpIHZvaWQKK3N0YXRpYyBfX3ByaW50ZigyLCAzKSB2b2lkCiBsM21fZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMKaW5kZXggYjBkOWFiMS4uNmE4YWNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2wzZHNzMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9sM2RzczEuYwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCQkgICAgICAgICB7IGwzZHNzMV9kdW1teV9pbnZva2Uoc3QsIGNyLCBpZCwgaWRlbnQsIHAsIG5sZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotI2lmZGVmIEhJU0FYX0RFX0FPQworI2lmZGVmIENPTkZJR19ERV9BT0MKIAkJCXsKIAogI2RlZmluZSBGT08xKHMsYSxiKSBcCkBAIC00MjIsOSArNDIyLDkgQEAKICN1bmRlZiBGT08xCiAKIAkJCX0KLSNlbHNlICAvKiBub3QgSElTQVhfREVfQU9DICovCisjZWxzZSAgLyogbm90IENPTkZJR19ERV9BT0MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGwzX2RlYnVnKHN0LCAiaW52b2tlIGJyZWFrIik7Ci0jZW5kaWYgLyogbm90IEhJU0FYX0RFX0FPQyAqLworI2VuZGlmIC8qIG5vdCBDT05GSUdfREVfQU9DICovCiAJCQlicmVhazsKIAkJY2FzZSAyOgkvKiByZXR1cm4gcmVzdWx0ICovCiAJCQkgLyogaWYgbm8gcHJvY2VzcyBhdmFpbGFibGUgaGFuZGxlIHNlcGFyYXRlbHkgKi8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2QuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCmluZGV4IDQ0MDgyNjMuLmRiMjQ3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl7U1RfTDFfRjgsIEVWX0lORF9SU1ksICAgICAgICAgICBsMV9pZ25vcmV9LAogfTsKIAotc3RhdGljIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK3N0YXRpYyBfX3ByaW50ZigyLCAzKQogdm9pZCBsMW1fZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkiRVZfRE9VVF9VTkRFUlJVTiIsCiB9OwogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorc3RhdGljIF9fcHJpbnRmKDIsIDMpCiB2b2lkIGRvdXRfZGVidWcoc3RydWN0IEZzbUluc3QgKmZpLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKaW5kZXggZTU1NDZjYi4uMmMyNmI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwpAQCAtNzUwLDYgKzc1MCw3IEBACiAgKiBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgKENBUEkgMi4wIHBhcnQgSUlJKQogICovCiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludAogaXNkbl90dHlfY2FwaV9mYWNpbGl0eShjYXBpX21zZyAqY20pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9jbG9jay5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKaW5kZXggMWZhNjI5Yi4uNzQxOGYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21JU0ROaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAKIHN0YXRpYyB1X2ludCAqZGVidWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMKaW5kZXggOWM3YzY0NS4uYjhmMThiZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfYXVkaW8uYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2F1ZGlvLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21JU0ROaWYuaD4KICNpbmNsdWRlIDxsaW51eC9tSVNETmRzcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJkc3AuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCmluZGV4IDYyMWYzMTAuLmI2YzlhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tSVNETmlmLmg+CiAjaW5jbHVkZSA8bGludXgvbUlTRE5kc3AuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJkc3AuaCIKICNpbmNsdWRlICJkc3BfaHdlYy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMKaW5kZXggOGUzMjUyMi4uNzM4ZWE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9zb2NrZXQuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbUlTRE5pZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAKIHN0YXRpYyB1X2ludAkqZGVidWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvS2NvbmZpZyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCmluZGV4IDgwN2M4NzUuLmZmMjAzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCkBAIC0xMTMsMTQgKzExMyw2IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUENFbmdpbmVzIFdSQVAgcHJvZ3JhbW1hYmxlIExFRHMuCiAKLWNvbmZpZyBMRURTX0FMSVgyCi0JdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBBTElYLjIgYW5kIEFMSVguMyBzZXJpZXMiCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBYODYgJiYgIUdQSU9fQ1M1NTM1ICYmICFDUzU1MzVfR1BJTwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBDRW5naW5lcyBBTElYLjIgYW5kIEFMSVguMyBMRURzLgotCSAgWW91IGhhdmUgdG8gc2V0IGxlZHMtYWxpeDIuZm9yY2U9MSBmb3IgYm9hcmRzIHdpdGggQXdhcmQgQklPUy4KLQogY29uZmlnIExFRFNfQ09CQUxUX1FVQkUKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBDb2JhbHQgUXViZSBzZXJpZXMgZnJvbnQgTEVEIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUwpAQCAtMzgzLDYgKzM3NSwxOCBAQAogCSAgY2Fubm90IGJlIHVzZWQuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGhhcmR3YXJlIGJsaW5raW5nIHdpdGggYW4gb24rb2ZmCiAJICBwZXJpb2QgZnJvbSA2Mm1zIHRvIDEyNXMuIFNheSBZIHRvIGVuYWJsZSBMRURzIG9uIHRoZSBIUCBpUEFRIGh4NDcwMC4KIAorY29uZmlnIExFRFNfUkVORVNBU19UUFUKKwlib29sICJMRUQgc3VwcG9ydCBmb3IgUmVuZXNhcyBUUFUiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEhBVkVfQ0xLICYmIEdFTkVSSUNfR1BJTworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYnVpbGQgb2YgdGhlIExFRCBUUFUgcGxhdGZvcm0gZHJpdmVyLAorCSAgc3VpdGFibGUgdG8gZHJpdmUgYW55IFRQVSBjaGFubmVsIG9uIG5ld2VyIFJlbmVzYXMgU29Dcy4KKwkgIFRoZSBkcml2ZXIgY29udHJvbHMgdGhlIEdQSU8gcGluIGNvbm5lY3RlZCB0byB0aGUgTEVEIHZpYQorCSAgdGhlIEdQSU8gZnJhbWV3b3JrIGFuZCBleHBlY3RzIHRoZSBMRUQgdG8gYmUgY29ubmVjdGVkIHRvCisJICBhIHBpbiB0aGF0IGNhbiBiZSBkcml2ZW4gaW4gYm90aCBHUElPIG1vZGUgYW5kIHVzaW5nIFRQVQorCSAgcGluIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIHRvIHN1cHBvcnQgYnJpZ2h0bmVzcyBjb250cm9sLgorCSAgQnJpZ2h0bmVzcyBjb250cm9sIGlzIHN1cHBvcnRlZCBidXQgaGFyZHdhcmUgYmxpbmtpbmcgaXMgbm90LgorCiBjb25maWcgTEVEU19UUklHR0VSUwogCWJvb2wgIkxFRCBUcmlnZ2VyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBMRURTX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggYmJmZDJlMy4uZTRmNmJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNiBAQAogb2JqLSQoQ09ORklHX0xFRFNfTkVUNDhYWCkJCSs9IGxlZHMtbmV0NDh4eC5vCiBvYmotJChDT05GSUdfTEVEU19ORVQ1NTAxKQkJKz0gbGVkcy1uZXQ1NTAxLm8KIG9iai0kKENPTkZJR19MRURTX1dSQVApCQkJKz0gbGVkcy13cmFwLm8KLW9iai0kKENPTkZJR19MRURTX0FMSVgyKQkJKz0gbGVkcy1hbGl4Mi5vCiBvYmotJChDT05GSUdfTEVEU19DT0JBTFRfUVVCRSkJCSs9IGxlZHMtY29iYWx0LXF1YmUubwogb2JqLSQoQ09ORklHX0xFRFNfQ09CQUxUX1JBUSkJCSs9IGxlZHMtY29iYWx0LXJhcS5vCiBvYmotJChDT05GSUdfTEVEU19TVU5GSVJFKQkJKz0gbGVkcy1zdW5maXJlLm8KQEAgLTQzLDYgKzQyLDcgQEAKIG9iai0kKENPTkZJR19MRURTX05TMikJCQkrPSBsZWRzLW5zMi5vCiBvYmotJChDT05GSUdfTEVEU19ORVRYQklHKQkJKz0gbGVkcy1uZXR4YmlnLm8KIG9iai0kKENPTkZJR19MRURTX0FTSUMzKQkJKz0gbGVkcy1hc2ljMy5vCitvYmotJChDT05GSUdfTEVEU19SRU5FU0FTX1RQVSkJCSs9IGxlZHMtcmVuZXNhcy10cHUubwogCiAjIExFRCBTUEkgRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfREFDMTI0UzA4NSkJCSs9IGxlZHMtZGFjMTI0czA4NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvZGVsbC1sZWQuYyBiL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCmluZGV4IDUyNTkwMjkuLmU1YzU3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCisrKyBiL2RyaXZlcnMvbGVkcy9kZWxsLWxlZC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkxvdWlzIERhdmlzL0ppbSBEYWlsZXkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRGVsbCBMRUQgQ29udHJvbCBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYwppbmRleCBkYzNkM2Q4Li42NjFiNjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCkBAIC0yNjcsOSArMjY3LDE0IEBACiAJCSAgIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAogCQkgICB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpCiB7CisJZGVsX3RpbWVyX3N5bmMoJmxlZF9jZGV2LT5ibGlua190aW1lcik7CisKIAlpZiAobGVkX2NkZXYtPmJsaW5rX3NldCAmJgotCSAgICAhbGVkX2NkZXYtPmJsaW5rX3NldChsZWRfY2RldiwgZGVsYXlfb24sIGRlbGF5X29mZikpCisJICAgICFsZWRfY2Rldi0+Ymxpbmtfc2V0KGxlZF9jZGV2LCBkZWxheV9vbiwgZGVsYXlfb2ZmKSkgeworCQlsZWRfY2Rldi0+YmxpbmtfZGVsYXlfb24gPSAqZGVsYXlfb247CisJCWxlZF9jZGV2LT5ibGlua19kZWxheV9vZmYgPSAqZGVsYXlfb2ZmOwogCQlyZXR1cm47CisJfQogCiAJLyogYmxpbmsgd2l0aCAxIEh6IGFzIGRlZmF1bHQgaWYgbm90aGluZyBzcGVjaWZpZWQgKi8KIAlpZiAoISpkZWxheV9vbiAmJiAhKmRlbGF5X29mZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYyBiL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYwppbmRleCA0YmViYWU3Li42ZjFmZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC10cmlnZ2Vycy5jCkBAIC0yNjEsOSArMjYxLDEyIEBACiAJaWYgKHRyaWdnZXIpIHsKIAkJdHJpZ2dlci0+bmFtZSA9IG5hbWU7CiAJCWVyciA9IGxlZF90cmlnZ2VyX3JlZ2lzdGVyKHRyaWdnZXIpOwotCQlpZiAoZXJyIDwgMCkKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKHRyaWdnZXIpOworCQkJdHJpZ2dlciA9IE5VTEw7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJMRUQgdHJpZ2dlciAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIiCiAJCQkJIiAoJWQpXG4iLCBuYW1lLCBlcnIpOworCQl9CiAJfSBlbHNlCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxFRCB0cmlnZ2VyICVzIGZhaWxlZCB0byByZWdpc3RlciIKIAkJCSIgKG5vIG1lbW9yeSlcbiIsIG5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtODhwbTg2MHguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLTg4cG04NjB4LmMKaW5kZXggMGQ0YzE2Ni4uMDgxMDYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtODhwbTg2MHguYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy04OHBtODYweC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIExFRF9QV01fU0hJRlQJCSgzKQogI2RlZmluZSBMRURfUFdNX01BU0sJCSgweDFGKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYWxpeDIuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFsaXgyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OWZmYWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYWxpeDIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTEVEcyBkcml2ZXIgZm9yIFBDRW5naW5lcyBBTElYLjIgYW5kIEFMSVguMwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QG1pbWFzLnJ1PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotc3RhdGljIGludCBmb3JjZSA9IDA7Ci1tb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkFzc3VtZSBzeXN0ZW0gaGFzIEFMSVguMi9BTElYLjMgc3R5bGUgTEVEcyIpOwotCi0jZGVmaW5lIE1TUl9MQkFSX0dQSU8JCTB4NTE0MDAwMEMKLSNkZWZpbmUgQ1M1NTM1X0dQSU9fU0laRQkyNTYKLQotc3RhdGljIHUzMiBncGlvX2Jhc2U7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkaXZpbF9wY2lbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X0lTQSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EpIH0sCi0JeyB9IC8qIE5VTEwgZW50cnkgKi8KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGl2aWxfcGNpKTsKLQotc3RydWN0IGFsaXhfbGVkIHsKLQlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7Ci0JdW5zaWduZWQgc2hvcnQgcG9ydDsKLQl1bnNpZ25lZCBpbnQgb25fdmFsdWU7Ci0JdW5zaWduZWQgaW50IG9mZl92YWx1ZTsKLX07Ci0KLXN0YXRpYyB2b2lkIGFsaXhfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCSBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IGFsaXhfbGVkICpsZWRfZGV2ID0KLQkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYWxpeF9sZWQsIGNkZXYpOwotCi0JaWYgKGJyaWdodG5lc3MpCi0JCW91dGwobGVkX2Rldi0+b25fdmFsdWUsIGdwaW9fYmFzZSArIGxlZF9kZXYtPnBvcnQpOwotCWVsc2UKLQkJb3V0bChsZWRfZGV2LT5vZmZfdmFsdWUsIGdwaW9fYmFzZSArIGxlZF9kZXYtPnBvcnQpOwotfQotCi1zdGF0aWMgc3RydWN0IGFsaXhfbGVkIGFsaXhfbGVkc1tdID0gewotCXsKLQkJLmNkZXYgPSB7Ci0JCQkubmFtZSA9ICJhbGl4OjEiLAotCQkJLmJyaWdodG5lc3Nfc2V0ID0gYWxpeF9sZWRfc2V0LAotCQl9LAotCQkucG9ydCA9IDB4MDAsCi0JCS5vbl92YWx1ZSA9IDEgPDwgMjIsCi0JCS5vZmZfdmFsdWUgPSAxIDw8IDYsCi0JfSwKLQl7Ci0JCS5jZGV2ID0gewotCQkJLm5hbWUgPSAiYWxpeDoyIiwKLQkJCS5icmlnaHRuZXNzX3NldCA9IGFsaXhfbGVkX3NldCwKLQkJfSwKLQkJLnBvcnQgPSAweDgwLAotCQkub25fdmFsdWUgPSAxIDw8IDI1LAotCQkub2ZmX3ZhbHVlID0gMSA8PCA5LAotCX0sCi0JewotCQkuY2RldiA9IHsKLQkJCS5uYW1lID0gImFsaXg6MyIsCi0JCQkuYnJpZ2h0bmVzc19zZXQgPSBhbGl4X2xlZF9zZXQsCi0JCX0sCi0JCS5wb3J0ID0gMHg4MCwKLQkJLm9uX3ZhbHVlID0gMSA8PCAyNywKLQkJLm9mZl92YWx1ZSA9IDEgPDwgMTEsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsaXhfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGk7Ci0JaW50IHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsaXhfbGVkcyk7IGkrKykgewotCQlhbGl4X2xlZHNbaV0uY2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwotCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmFsaXhfbGVkc1tpXS5jZGV2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JfQotCXJldHVybiAwOwotCi1mYWlsOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFsaXhfbGVkc1tpXS5jZGV2KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFsaXhfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxpeF9sZWRzKTsgaSsrKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYWxpeF9sZWRzW2ldLmNkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbGl4X2xlZF9kcml2ZXIgPSB7Ci0JLnJlbW92ZSA9IGFsaXhfbGVkX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWxpeF9wcmVzZW50KHVuc2lnbmVkIGxvbmcgYmlvc19waHlzLAotCQkJCWNvbnN0IGNoYXIgKmFsaXhfc2lnLAotCQkJCXNpemVfdCBhbGl4X3NpZ19sZW4pCi17Ci0JY29uc3Qgc2l6ZV90IGJpb3NfbGVuID0gMHgwMDAxMDAwMDsKLQljb25zdCBjaGFyICpiaW9zX3ZpcnQ7Ci0JY29uc3QgY2hhciAqc2Nhbl9lbmQ7Ci0JY29uc3QgY2hhciAqcDsKLQljaGFyIG5hbWVbNjRdOwotCi0JaWYgKGZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGZvcmNlZCB0byBza2lwIEJJT1MgdGVzdCwgIgotCQkgICAgICAgImFzc3VtZSBzeXN0ZW0gaGFzIEFMSVguMiBzdHlsZSBMRURzXG4iLAotCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQliaW9zX3ZpcnQgPSBwaHlzX3RvX3ZpcnQoYmlvc19waHlzKTsKLQlzY2FuX2VuZCA9IGJpb3NfdmlydCArIGJpb3NfbGVuIC0gKGFsaXhfc2lnX2xlbiArIDIpOwotCWZvciAocCA9IGJpb3NfdmlydDsgcCA8IHNjYW5fZW5kOyBwKyspIHsKLQkJY29uc3QgY2hhciAqdGFpbDsKLQkJY2hhciAqYTsKLQotCQlpZiAobWVtY21wKHAsIGFsaXhfc2lnLCBhbGl4X3NpZ19sZW4pICE9IDApCi0JCQljb250aW51ZTsKLQotCQltZW1jcHkobmFtZSwgcCwgc2l6ZW9mKG5hbWUpKTsKLQotCQkvKiByZW1vdmUgdGhlIGZpcnN0IFwwIGNoYXJhY3RlciBmcm9tIHN0cmluZyAqLwotCQlhID0gc3RyY2hyKG5hbWUsICdcMCcpOwotCQlpZiAoYSkKLQkJCSphID0gJyAnOwotCi0JCS8qIGN1dCB0aGUgc3RyaW5nIGF0IGEgbmV3bGluZSAqLwotCQlhID0gc3RyY2hyKG5hbWUsICdccicpOwotCQlpZiAoYSkKLQkJCSphID0gJ1wwJzsKLQotCQl0YWlsID0gcCArIGFsaXhfc2lnX2xlbjsKLQkJaWYgKCh0YWlsWzBdID09ICcyJyB8fCB0YWlsWzBdID09ICczJykpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiJXM6IHN5c3RlbSBpcyByZWNvZ25pemVkIGFzIFwiJXNcIlxuIiwKLQkJCSAgICAgICBLQlVJTERfTU9ETkFNRSwgbmFtZSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQotc3RhdGljIGludCBfX2luaXQgYWxpeF9wY2lfbGVkX2luaXQodm9pZCkKLXsKLQl1MzIgbG93LCBoaTsKLQotCWlmIChwY2lfZGV2X3ByZXNlbnQoZGl2aWxfcGNpKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgS0JVSUxEX01PRE5BTUUiOiBESVZJTCBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBHcmFiIHRoZSBHUElPIEkvTyByYW5nZSAqLwotCXJkbXNyKE1TUl9MQkFSX0dQSU8sIGxvdywgaGkpOwotCi0JLyogQ2hlY2sgdGhlIG1hc2sgYW5kIHdoZXRoZXIgR1BJTyBpcyBlbmFibGVkIChzYW5pdHkgY2hlY2spICovCi0JaWYgKGhpICE9IDB4MDAwMGYwMDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRSI6IEdQSU8gbm90IGVuYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBNYXNrIG9mZiB0aGUgSU8gYmFzZSBhZGRyZXNzICovCi0JZ3Bpb19iYXNlID0gbG93ICYgMHgwMDAwZmYwMDsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oZ3Bpb19iYXNlLCBDUzU1MzVfR1BJT19TSVpFLCBLQlVJTERfTU9ETkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FIjogY2FuJ3QgYWxsb2NhdGUgSS9PIGZvciBHUElPXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogU2V0IEdQSU8gZnVuY3Rpb24gdG8gb3V0cHV0ICovCi0Jb3V0bCgxIDw8IDYsIGdwaW9fYmFzZSArIDB4MDQpOwotCW91dGwoMSA8PCA5LCBncGlvX2Jhc2UgKyAweDg0KTsKLQlvdXRsKDEgPDwgMTEsIGdwaW9fYmFzZSArIDB4ODQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsaXhfbGVkX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQljb25zdCBjaGFyIHRpbnliaW9zX3NpZ1tdID0gIlBDIEVuZ2luZXMgQUxJWC4iOwotCWNvbnN0IGNoYXIgY29yZWJvb3Rfc2lnW10gPSAiUEMgRW5naW5lc1wwQUxJWC4iOwotCi0JaWYgKGFsaXhfcHJlc2VudCgweGYwMDAwLCB0aW55Ymlvc19zaWcsIHNpemVvZih0aW55Ymlvc19zaWcpIC0gMSkgfHwKLQkgICAgYWxpeF9wcmVzZW50KDB4NTAwLCBjb3JlYm9vdF9zaWcsIHNpemVvZihjb3JlYm9vdF9zaWcpIC0gMSkpCi0JCXJldCA9IGFsaXhfcGNpX2xlZF9pbml0KCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEtCVUlMRF9NT0ROQU1FLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKCFJU19FUlIocGRldikpIHsKLQkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhbGl4X2xlZF9kcml2ZXIsIGFsaXhfbGVkX3Byb2JlKTsKLQkJaWYgKHJldCkKLQkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotCX0gZWxzZQotCQlyZXQgPSBQVFJfRVJSKHBkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsaXhfbGVkX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWxpeF9sZWRfZHJpdmVyKTsKLQlyZWxlYXNlX3JlZ2lvbihncGlvX2Jhc2UsIENTNTUzNV9HUElPX1NJWkUpOwotfQotCi1tb2R1bGVfaW5pdChhbGl4X2xlZF9pbml0KTsKLW1vZHVsZV9leGl0KGFsaXhfbGVkX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QG1pbWFzLnJ1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0VuZ2luZXMgQUxJWC4yIGFuZCBBTElYLjMgTEVEIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYXNpYzMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFzaWMzLmMKaW5kZXggMjJmODQ3Yy4uNDhkOWZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYXNpYzMuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1hc2ljMy5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvYXNpYzMuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICoJVGhlIEhUQyBBU0lDMyBMRUQgR1BJT3MgYXJlIGlucHV0cywgbm90IG91dHB1dHMuCkBAIC0xMDcsOSArMTA4LDEwIEBACiAJfQogCiAJbGVkLT5jZGV2LT5uYW1lID0gbGVkLT5uYW1lOwotCWxlZC0+Y2Rldi0+ZGVmYXVsdF90cmlnZ2VyID0gbGVkLT5kZWZhdWx0X3RyaWdnZXI7CisJbGVkLT5jZGV2LT5mbGFncyA9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CiAJbGVkLT5jZGV2LT5icmlnaHRuZXNzX3NldCA9IGJyaWdodG5lc3Nfc2V0OwogCWxlZC0+Y2Rldi0+Ymxpbmtfc2V0ID0gYmxpbmtfc2V0OworCWxlZC0+Y2Rldi0+ZGVmYXVsdF90cmlnZ2VyID0gbGVkLT5kZWZhdWx0X3RyaWdnZXI7CiAKIAlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgbGVkLT5jZGV2KTsKIAlpZiAocmV0IDwgMCkKQEAgLTEzNiwxMiArMTM4LDQ0IEBACiAJcmV0dXJuIG1mZF9jZWxsX2Rpc2FibGUocGRldik7CiB9CiAKK3N0YXRpYyBpbnQgYXNpYzNfbGVkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBtZmRfZ2V0X2NlbGwocGRldik7CisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKGNlbGwtPnN1c3BlbmQpCisJCXJldCA9ICgqY2VsbC0+c3VzcGVuZCkocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzaWMzX2xlZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBtZmRfZ2V0X2NlbGwocGRldik7CisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKGNlbGwtPnJlc3VtZSkKKwkJcmV0ID0gKCpjZWxsLT5yZXN1bWUpKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGFzaWMzX2xlZF9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBhc2ljM19sZWRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFzaWMzX2xlZF9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc2ljM19sZWRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBhc2ljM19sZWRfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhc2ljM19sZWRfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAibGVkcy1hc2ljMyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmYXNpYzNfbGVkX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1hdG1lbC1wd20uYwppbmRleCBjOTQxZDkwNi4uMTA5Yzg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbF9wd20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RydWN0IHB3bWxlZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jb2JhbHQtcmFxLmMKaW5kZXggNDM4ZDQ4My4uYWFjMWMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY29iYWx0LXJhcS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNvYmFsdC1yYXEuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2RlZmluZSBMRURfV0VCCQkweDA0CiAjZGVmaW5lIExFRF9QT1dFUl9PRkYJMHgwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYwppbmRleCBkMTFkMDViLi40OWFjZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1mc2cuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKaW5kZXggM2Q4YmMzMi4uMzk5YTg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCkBAIC0xMjEsNyArMTIyLDcgQEAKIAl9CiAJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGdwaW9fbGVkX3NldDsKIAlpZiAodGVtcGxhdGUtPmRlZmF1bHRfc3RhdGUgPT0gTEVEU19HUElPX0RFRlNUQVRFX0tFRVApCi0JCXN0YXRlID0gISFncGlvX2dldF92YWx1ZShsZWRfZGF0LT5ncGlvKSBeIGxlZF9kYXQtPmFjdGl2ZV9sb3c7CisJCXN0YXRlID0gISFncGlvX2dldF92YWx1ZV9jYW5zbGVlcChsZWRfZGF0LT5ncGlvKSBeIGxlZF9kYXQtPmFjdGl2ZV9sb3c7CiAJZWxzZQogCQlzdGF0ZSA9ICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfT04pOwogCWxlZF9kYXQtPmNkZXYuYnJpZ2h0bmVzcyA9IHN0YXRlID8gTEVEX0ZVTEwgOiBMRURfT0ZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbG0zNTMwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwppbmRleCAzZGQ3MDkwLi4wNjMwZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1sbTM1MzAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xlZC1sbTM1MzAuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIExNMzUzMF9MRURfREVWICJsY2QtYmFja2xpZ2h0IgogI2RlZmluZSBMTTM1MzBfTkFNRSAibG0zNTMwLWxlZCIKQEAgLTQyMSw3ICs0MjIsNiBAQAogZXJyX3JlZ19pbml0OgogCXJlZ3VsYXRvcl9wdXQoZHJ2ZGF0YS0+cmVndWxhdG9yKTsKIGVycl9yZWd1bGF0b3JfZ2V0OgotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwogCWtmcmVlKGRydmRhdGEpOwogZXJyX291dDoKIAlyZXR1cm4gZXJyOwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTM1MzBfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUgPSBsbTM1MzBfcHJvYmUsCi0JLnJlbW92ZSA9IGxtMzUzMF9yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGxtMzUzMF9yZW1vdmUpLAogCS5pZF90YWJsZSA9IGxtMzUzMF9pZCwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IExNMzUzMF9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbG9jb21vLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYwppbmRleCAxZjdjMTBmLi44MGJhMDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwppbmRleCA5ZmMxMjJjLi5jYjY0MWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwpAQCAtOTcsNiArOTcsOSBAQAogLyogU3RhdHVzICovCiAjZGVmaW5lIExQNTUyMV9FWFRfQ0xLX1VTRUQJCTB4MDgKIAorLyogZGVmYXVsdCBSIGNoYW5uZWwgY3VycmVudCByZWdpc3RlciB2YWx1ZSAqLworI2RlZmluZSBMUDU1MjFfUkVHX1JfQ1VSUl9ERUZBVUxUCTB4QUYKKwogc3RydWN0IGxwNTUyMV9lbmdpbmUgewogCWludAkJaWQ7CiAJdTgJCW1vZGU7CkBAIC0xNzUsMTQgKzE3OCwxNCBAQAogCQltb2RlID0gTFA1NTIxX0NNRF9ESVJFQ1Q7CiAKIAlyZXQgPSBscDU1MjFfcmVhZChjbGllbnQsIExQNTUyMV9SRUdfT1BfTU9ERSwgJmVuZ2luZV9zdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBzZXQgbW9kZSBvbmx5IGZvciB0aGlzIGVuZ2luZSAqLwogCWVuZ2luZV9zdGF0ZSAmPSB+KGVuZ2luZS0+ZW5naW5lX21hc2spOwogCW1vZGUgJj0gZW5naW5lLT5lbmdpbmVfbWFzazsKIAllbmdpbmVfc3RhdGUgfD0gbW9kZTsKLQlyZXQgfD0gbHA1NTIxX3dyaXRlKGNsaWVudCwgTFA1NTIxX1JFR19PUF9NT0RFLCBlbmdpbmVfc3RhdGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbHA1NTIxX3dyaXRlKGNsaWVudCwgTFA1NTIxX1JFR19PUF9NT0RFLCBlbmdpbmVfc3RhdGUpOwogfQogCiBzdGF0aWMgaW50IGxwNTUyMV9sb2FkX3Byb2dyYW0oc3RydWN0IGxwNTUyMV9lbmdpbmUgKmVuZywgY29uc3QgdTggKnBhdHRlcm4pCkBAIC02NDMsNiArNjQ2LDcgQEAKIAlzdHJ1Y3QgbHA1NTIxX2NoaXAJCSpjaGlwOwogCXN0cnVjdCBscDU1MjFfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiAJaW50IHJldCwgaSwgbGVkOworCXU4IGJ1ZjsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkKQEAgLTY4MSw2ICs2ODUsMjAgQEAKIAkJCQkgICAgICogRXhhY3QgdmFsdWUgaXMgbm90IGF2YWlsYWJsZS4gMTAgLSAyMG1zCiAJCQkJICAgICAqIGFwcGVhcnMgdG8gYmUgZW5vdWdoIGZvciByZXNldC4KIAkJCQkgICAgICovCisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBjaGlwIGlzIHJlc2V0IGJ5IHJlYWRpbmcgYmFjayB0aGUgciBjaGFubmVsCisJICogY3VycmVudCByZWcuIFRoaXMgaXMgZHVtbXkgcmVhZCBpcyByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3JtcyAtCisJICogb3RoZXJ3aXNlIGZ1cnRoZXIgYWNjZXNzIHRvIHRoZSBSIEcgQiBjaGFubmVscyBpbiB0aGUKKwkgKiBMUDU1MjFfUkVHX0VOQUJMRSByZWdpc3RlciB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QgLSBzdHJhbmdlIQorCSAqLworCWxwNTUyMV9yZWFkKGNsaWVudCwgTFA1NTIxX1JFR19SX0NVUlJFTlQsICZidWYpOworCWlmIChidWYgIT0gTFA1NTIxX1JFR19SX0NVUlJfREVGQVVMVCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIGluIHJlc2V0aW5nIGNoaXBcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKKwogCXJldCA9IGxwNTUyMV9kZXRlY3QoY2xpZW50KTsKIAogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWx0MzU5My5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKaW5kZXggMjU3OTY3OC4uNTNmNjdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbHQzNTkzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBsdDM1OTNfbGVkX2RhdGEgewogCXN0cnVjdCBsZWRfY2xhc3NkZXYgY2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW1jMTM3ODMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLW1jMTM3ODMuYwppbmRleCBmMzY5ZTU2Li5iMzM5M2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1tYzEzNzgzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbWMxMzc4My5jCkBAIC0yMSwxMyArMjEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21jMTM3ODMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWMxM3h4eC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogc3RydWN0IG1jMTM3ODNfbGVkIHsKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2CWNkZXY7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0Jc3RydWN0IG1jMTM3ODMJCSptYXN0ZXI7CisJc3RydWN0IG1jMTN4eHgJCSptYXN0ZXI7CiAJZW51bSBsZWRfYnJpZ2h0bmVzcwluZXdfYnJpZ2h0bmVzczsKIAlpbnQJCQlpZDsKIH07CkBAIC0xMTEsMTEgKzExMSwxMSBAQAogCQlicmVhazsKIAl9CiAKLQltYzEzNzgzX2xvY2sobGVkLT5tYXN0ZXIpOworCW1jMTN4eHhfbG9jayhsZWQtPm1hc3Rlcik7CiAKLQltYzEzNzgzX3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzaywgdmFsdWUpOworCW1jMTN4eHhfcmVnX3JtdyhsZWQtPm1hc3RlciwgcmVnLCBtYXNrLCB2YWx1ZSk7CiAKLQltYzEzNzgzX3VubG9jayhsZWQtPm1hc3Rlcik7CisJbWMxM3h4eF91bmxvY2sobGVkLT5tYXN0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBtYzEzNzgzX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCkBAIC0xNzIsMjMgKzE3MiwyMyBAQAogCQlicmVhazsKIAl9CiAKLQltYzEzNzgzX2xvY2sobGVkLT5tYXN0ZXIpOworCW1jMTN4eHhfbG9jayhsZWQtPm1hc3Rlcik7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzayA8PCBzaGlmdCwKKwlyZXQgPSBtYzEzeHh4X3JlZ19ybXcobGVkLT5tYXN0ZXIsIHJlZywgbWFzayA8PCBzaGlmdCwKIAkJCQkJCXZhbHVlIDw8IHNoaWZ0KTsKIAotCW1jMTM3ODNfdW5sb2NrKGxlZC0+bWFzdGVyKTsKKwltYzEzeHh4X3VubG9jayhsZWQtPm1hc3Rlcik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbWMxMzc4M19sZWRzX3ByZXBhcmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgbWMxMzc4MyAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBtYzEzeHh4ICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAJaW50IHJlZyA9IDA7CiAKLQltYzEzNzgzX2xvY2soZGV2KTsKKwltYzEzeHh4X2xvY2soZGV2KTsKIAogCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzNzgzX0xFRF9UQzFIQUxGKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQzFfVEMxSEFMRl9CSVQ7CkBAIC0xOTYsNyArMTk2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfU0xFV0xJTVRDKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQ3hfU0xFV0xJTV9CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzEsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8xLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMDYsNyArMjA2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfU0xFV0xJTUJMKQogCQlyZWcgfD0gTUMxMzc4M19MRURfQ3hfU0xFV0xJTV9CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzIsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMSkKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8zLCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMikKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzQsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF80LCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlpZiAocGRhdGEtPmZsYWdzICYgTUMxMzc4M19MRURfVFJJT0RFX1RDMykKIAkJcmVnIHw9IE1DMTM3ODNfTEVEX0N4X1RSSU9ERV9UQ19CSVQ7CiAKLQlyZXQgPSBtYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzUsIHJlZyk7CisJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCByZWcpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0yNTUsMTcgKzI1NSwxNyBAQAogCXJlZyB8PSAocGRhdGEtPmFicmVmICYgTUMxMzc4M19MRURfQzBfQUJSRUZfTUFTSykgPDwKIAkJCQkJCQlNQzEzNzgzX0xFRF9DMF9BQlJFRjsKIAotCXJldCA9IG1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMCwgcmVnKTsKKwlyZXQgPSBtYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIHJlZyk7CiAKIG91dDoKLQltYzEzNzgzX3VubG9jayhkZXYpOworCW1jMTN4eHhfdW5sb2NrKGRldik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgbWMxMzc4M19sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgbWMxMzc4M19sZWRfcGxhdGZvcm1fZGF0YSAqbGVkX2N1cjsKKwlzdHJ1Y3QgbWMxM3h4eF9sZWRzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9sZWRfcGxhdGZvcm1fZGF0YSAqbGVkX2N1cjsKIAlzdHJ1Y3QgbWMxMzc4M19sZWQgKmxlZCwgKmxlZF9kYXQ7CiAJaW50IHJldCwgaTsKIAlpbnQgaW5pdF9sZWQgPSAwOwpAQCAtMzUxLDkgKzM1MSw5IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1jMTM3ODNfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtYzEzNzgzX2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCBtYzEzNzgzX2xlZCAqbGVkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1jMTM3ODMgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWMxM3h4eCAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKSB7CkBAIC0zNjEsMTYgKzM2MSwxNiBAQAogCQljYW5jZWxfd29ya19zeW5jKCZsZWRbaV0ud29yayk7CiAJfQogCi0JbWMxMzc4M19sb2NrKGRldik7CisJbWMxM3h4eF9sb2NrKGRldik7CiAKLQltYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIDApOwotCW1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMSwgMCk7Ci0JbWMxMzc4M19yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCAwKTsKLQltYzEzNzgzX3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIDApOwotCW1jMTM3ODNfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfNCwgMCk7Ci0JbWMxMzc4M19yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCAwKTsKKwltYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzAsIDApOworCW1jMTN4eHhfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfMSwgMCk7CisJbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF8yLCAwKTsKKwltYzEzeHh4X3JlZ193cml0ZShkZXYsIE1DMTM3ODNfUkVHX0xFRF9DT05UUk9MXzMsIDApOworCW1jMTN4eHhfcmVnX3dyaXRlKGRldiwgTUMxMzc4M19SRUdfTEVEX0NPTlRST0xfNCwgMCk7CisJbWMxM3h4eF9yZWdfd3JpdGUoZGV2LCBNQzEzNzgzX1JFR19MRURfQ09OVFJPTF81LCAwKTsKIAotCW1jMTM3ODNfdW5sb2NrKGRldik7CisJbWMxM3h4eF91bmxvY2soZGV2KTsKIAogCWtmcmVlKGxlZCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMKaW5kZXggOTM5ODdhMS4uZjExN2Y3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbmV0NDh4eC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDQ4eHguYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L25zY19ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2N4MjAwX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZOQU1FICJuZXQ0OHh4LWxlZCIKICNkZWZpbmUgTkVUNDhYWF9FUlJPUl9MRURfR1BJTwkyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbmV0NTUwMS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbmV0NTUwMS5jCmluZGV4IDdlNzY0YjguLjA1NTVkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDU1MDEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ1NTAxLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW5zMi5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKaW5kZXggZjc3ZDQ4ZC4uMzdiN2QwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbnMyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtYWNoL2xlZHMtbnMyLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1yZW5lc2FzLXRwdS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcmVuZXNhcy10cHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU1NDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtcmVuZXNhcy10cHUuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIExFRCBjb250cm9sIHVzaW5nIFJlbmVzYXMgVFBVCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbGVkcy1yZW5lc2FzLXRwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitlbnVtIHJfdHB1X3BpbiB7IFJfVFBVX1BJTl9VTlVTRUQsIFJfVFBVX1BJTl9HUElPLCBSX1RQVV9QSU5fR1BJT19GTiB9OworZW51bSByX3RwdV90aW1lciB7IFJfVFBVX1RJTUVSX1VOVVNFRCwgUl9UUFVfVElNRVJfT04gfTsKKworc3RydWN0IHJfdHB1X3ByaXYgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGRldjsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2U7CisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJZW51bSByX3RwdV9waW4gcGluX3N0YXRlOworCWVudW0gcl90cHVfdGltZXIgdGltZXJfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBtaW5fcmF0ZTsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF9yYXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCWVudW0gbGVkX2JyaWdodG5lc3MgbmV3X2JyaWdodG5lc3M7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJfdHB1X2xvY2spOworCisjZGVmaW5lIFRTVFIgLTEgLyogVGltZXIgc3RhcnQgcmVnaXN0ZXIgKHNoYXJlZCByZWdpc3RlcikgKi8KKyNkZWZpbmUgVENSICAwIC8qIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgKCsweDAwKSAqLworI2RlZmluZSBUTURSIDEgLyogVGltZXIgbW9kZSByZWdpc3RlciAoKzB4MDQpICovCisjZGVmaW5lIFRJT1IgMiAvKiBUaW1lciBJL08gY29udHJvbCByZWdpc3RlciAoKzB4MDgpICovCisjZGVmaW5lIFRJRVIgMyAvKiBUaW1lciBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICgrMHgwYykgKi8KKyNkZWZpbmUgVFNSICA0IC8qIFRpbWVyIHN0YXR1cyByZWdpc3RlciAoKzB4MTApICovCisjZGVmaW5lIFRDTlQgNSAvKiBUaW1lciBjb3VudGVyICgrMHgxNCkgKi8KKyNkZWZpbmUgVEdSQSA2IC8qIFRpbWVyIGdlbmVyYWwgcmVnaXN0ZXIgQSAoKzB4MTgpICovCisjZGVmaW5lIFRHUkIgNyAvKiBUaW1lciBnZW5lcmFsIHJlZ2lzdGVyIEIgKCsweDFjKSAqLworI2RlZmluZSBUR1JDIDggLyogVGltZXIgZ2VuZXJhbCByZWdpc3RlciBDICgrMHgyMCkgKi8KKyNkZWZpbmUgVEdSRCA5IC8qIFRpbWVyIGdlbmVyYWwgcmVnaXN0ZXIgRCAoKzB4MjQpICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcl90cHVfcmVhZChzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgaW50IHJlZ19ucikKK3sKKwlzdHJ1Y3QgbGVkX3JlbmVzYXNfdHB1X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSByZWdfbnIgPDwgMjsKKworCWlmIChyZWdfbnIgPT0gVFNUUikKKwkJcmV0dXJuIGlvcmVhZDE2KGJhc2UgLSBjZmctPmNoYW5uZWxfb2Zmc2V0KTsKKworCXJldHVybiBpb3JlYWQxNihiYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByX3RwdV93cml0ZShzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgaW50IHJlZ19uciwKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbGVkX3JlbmVzYXNfdHB1X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9mZnMgPSByZWdfbnIgPDwgMjsKKworCWlmIChyZWdfbnIgPT0gVFNUUikgeworCQlpb3dyaXRlMTYodmFsdWUsIGJhc2UgLSBjZmctPmNoYW5uZWxfb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKworCWlvd3JpdGUxNih2YWx1ZSwgYmFzZSArIG9mZnMpOworfQorCitzdGF0aWMgdm9pZCByX3RwdV9zdGFydF9zdG9wX2NoKHN0cnVjdCByX3RwdV9wcml2ICpwLCBpbnQgc3RhcnQpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbHVlOworCisJLyogc3RhcnQgc3RvcCByZWdpc3RlciBzaGFyZWQgYnkgbXVsdGlwbGUgdGltZXIgY2hhbm5lbHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcl90cHVfbG9jaywgZmxhZ3MpOworCXZhbHVlID0gcl90cHVfcmVhZChwLCBUU1RSKTsKKworCWlmIChzdGFydCkKKwkJdmFsdWUgfD0gMSA8PCBjZmctPnRpbWVyX2JpdDsKKwllbHNlCisJCXZhbHVlICY9IH4oMSA8PCBjZmctPnRpbWVyX2JpdCk7CisKKwlyX3RwdV93cml0ZShwLCBUU1RSLCB2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcl90cHVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJfdHB1X2VuYWJsZShzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCBsZWRfcmVuZXNhc190cHVfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcHJlc2NhbGVyW10gPSB7IDEsIDQsIDE2LCA2NCB9OworCWludCBrLCByZXQ7CisJdW5zaWduZWQgbG9uZyByYXRlLCB0bXA7CisKKwlpZiAocC0+dGltZXJfc3RhdGUgPT0gUl9UUFVfVElNRVJfT04pCisJCXJldHVybiAwOworCisJLyogd2FrZSB1cCBkZXZpY2UgYW5kIGVuYWJsZSBjbG9jayAqLworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnAtPnBkZXYtPmRldik7CisJcmV0ID0gY2xrX2VuYWJsZShwLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiY2Fubm90IGVuYWJsZSBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKwlyX3RwdV9zdGFydF9zdG9wX2NoKHAsIDApOworCisJLyogZ2V0IGNsb2NrIHJhdGUgYWZ0ZXIgZW5hYmxpbmcgaXQgKi8KKwlyYXRlID0gY2xrX2dldF9yYXRlKHAtPmNsayk7CisKKwkvKiBwaWNrIHRoZSBsb3dlc3QgYWNjZXB0YWJsZSByYXRlICovCisJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJlc2NhbGVyKTsgaysrKQorCQlpZiAoKHJhdGUgLyBwcmVzY2FsZXJba10pIDwgcC0+bWluX3JhdGUpCisJCQlicmVhazsKKworCWlmICghaykgeworCQlkZXZfZXJyKCZwLT5wZGV2LT5kZXYsICJjbG9jayByYXRlIG1pc21hdGNoXG4iKTsKKwkJZ290byBlcnIwOworCX0KKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJyYXRlID0gJWx1LCBwcmVzY2FsZXIgJXVcbiIsCisJCXJhdGUsIHByZXNjYWxlcltrIC0gMV0pOworCisJLyogY2xlYXIgVENOVCBvbiBUR1JCIG1hdGNoLCBjb3VudCBvbiByaXNpbmcgZWRnZSwgc2V0IHByZXNjYWxlciAqLworCXJfdHB1X3dyaXRlKHAsIFRDUiwgMHgwMDQwIHwgKGsgLSAxKSk7CisKKwkvKiBvdXRwdXQgMCB1bnRpbCBUR1JBLCBvdXRwdXQgMSB1bnRpbCBUR1JCICovCisJcl90cHVfd3JpdGUocCwgVElPUiwgMHgwMDAyKTsKKworCXJhdGUgLz0gcHJlc2NhbGVyW2sgLSAxXSAqIHAtPnJlZnJlc2hfcmF0ZTsKKwlyX3RwdV93cml0ZShwLCBUR1JCLCByYXRlKTsKKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJUUkdCID0gMHglMDRseFxuIiwgcmF0ZSk7CisKKwl0bXAgPSAoY2ZnLT5tYXhfYnJpZ2h0bmVzcyAtIGJyaWdodG5lc3MpICogcmF0ZTsKKwlyX3RwdV93cml0ZShwLCBUR1JBLCB0bXAgLyBjZmctPm1heF9icmlnaHRuZXNzKTsKKwlkZXZfZGJnKCZwLT5wZGV2LT5kZXYsICJUUkdBID0gMHglMDRseFxuIiwgdG1wIC8gY2ZnLT5tYXhfYnJpZ2h0bmVzcyk7CisKKwkvKiBQV00gbW9kZSAqLworCXJfdHB1X3dyaXRlKHAsIFRNRFIsIDB4MDAwMik7CisKKwkvKiBlbmFibGUgY2hhbm5lbCAqLworCXJfdHB1X3N0YXJ0X3N0b3BfY2gocCwgMSk7CisKKwlwLT50aW1lcl9zdGF0ZSA9IFJfVFBVX1RJTUVSX09OOworCXJldHVybiAwOworIGVycjA6CisJY2xrX2Rpc2FibGUocC0+Y2xrKTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZwLT5wZGV2LT5kZXYpOworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIHJfdHB1X2Rpc2FibGUoc3RydWN0IHJfdHB1X3ByaXYgKnApCit7CisJaWYgKHAtPnRpbWVyX3N0YXRlID09IFJfVFBVX1RJTUVSX1VOVVNFRCkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBjaGFubmVsICovCisJcl90cHVfc3RhcnRfc3RvcF9jaChwLCAwKTsKKworCS8qIHN0b3AgY2xvY2sgYW5kIG1hcmsgZGV2aWNlIGFzIGlkbGUgKi8KKwljbGtfZGlzYWJsZShwLT5jbGspOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnAtPnBkZXYtPmRldik7CisKKwlwLT50aW1lcl9zdGF0ZSA9IFJfVFBVX1RJTUVSX1VOVVNFRDsKK30KKworc3RhdGljIHZvaWQgcl90cHVfc2V0X3BpbihzdHJ1Y3Qgcl90cHVfcHJpdiAqcCwgZW51bSByX3RwdV9waW4gbmV3X3N0YXRlLAorCQkJICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBuZXdfc3RhdGUpIHsKKwkJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykKKwkJCWdwaW9fc2V0X3ZhbHVlKGNmZy0+cGluX2dwaW8sIGJyaWdodG5lc3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykKKwkJZ3Bpb19mcmVlKGNmZy0+cGluX2dwaW8pOworCisJaWYgKHAtPnBpbl9zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJT19GTikKKwkJZ3Bpb19mcmVlKGNmZy0+cGluX2dwaW9fZm4pOworCisJaWYgKG5ld19zdGF0ZSA9PSBSX1RQVV9QSU5fR1BJTykgeworCQlncGlvX3JlcXVlc3QoY2ZnLT5waW5fZ3BpbywgY2ZnLT5uYW1lKTsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNmZy0+cGluX2dwaW8sICEhYnJpZ2h0bmVzcyk7CisJfQorCWlmIChuZXdfc3RhdGUgPT0gUl9UUFVfUElOX0dQSU9fRk4pCisJCWdwaW9fcmVxdWVzdChjZmctPnBpbl9ncGlvX2ZuLCBjZmctPm5hbWUpOworCisJcC0+cGluX3N0YXRlID0gbmV3X3N0YXRlOworfQorCitzdGF0aWMgdm9pZCByX3RwdV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgcl90cHVfcHJpdiAqcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgcl90cHVfcHJpdiwgd29yayk7CisJZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzID0gcC0+bmV3X2JyaWdodG5lc3M7CisKKwlyX3RwdV9kaXNhYmxlKHApOworCisJLyogb2ZmIGFuZCBtYXhpbXVtIGFyZSBoYW5kbGVkIGFzIEdQSU8gcGlucywgaW4gYmV0d2VlbiBQV00gKi8KKwlpZiAoKGJyaWdodG5lc3MgPT0gMCkgfHwgKGJyaWdodG5lc3MgPT0gcC0+bGRldi5tYXhfYnJpZ2h0bmVzcykpCisJCXJfdHB1X3NldF9waW4ocCwgUl9UUFVfUElOX0dQSU8sIGJyaWdodG5lc3MpOworCWVsc2UgeworCQlyX3RwdV9zZXRfcGluKHAsIFJfVFBVX1BJTl9HUElPX0ZOLCAwKTsKKwkJcl90cHVfZW5hYmxlKHAsIGJyaWdodG5lc3MpOworCX0KK30KKworc3RhdGljIHZvaWQgcl90cHVfc2V0X2JyaWdodG5lc3Moc3RydWN0IGxlZF9jbGFzc2RldiAqbGRldiwKKwkJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCByX3RwdV9wcml2ICpwID0gY29udGFpbmVyX29mKGxkZXYsIHN0cnVjdCByX3RwdV9wcml2LCBsZGV2KTsKKwlwLT5uZXdfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJc2NoZWR1bGVfd29yaygmcC0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJfdHB1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCByX3RwdV9wcml2ICpwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAtRU5YSU87CisKKwlpZiAoIWNmZykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJLyogbWFwIG1lbW9yeSwgbGV0IG1hcGJhc2UgcG9pbnQgdG8gb3VyIGNoYW5uZWwgKi8KKwlwLT5tYXBiYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKHAtPm1hcGJhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBnZXQgaG9sZCBvZiBjbG9jayAqLworCXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgY2xvY2tcbiIpOworCQlyZXQgPSBQVFJfRVJSKHAtPmNsayk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlwLT5wZGV2ID0gcGRldjsKKwlwLT5waW5fc3RhdGUgPSBSX1RQVV9QSU5fVU5VU0VEOworCXAtPnRpbWVyX3N0YXRlID0gUl9UUFVfVElNRVJfVU5VU0VEOworCXAtPnJlZnJlc2hfcmF0ZSA9IGNmZy0+cmVmcmVzaF9yYXRlID8gY2ZnLT5yZWZyZXNoX3JhdGUgOiAxMDA7CisJcl90cHVfc2V0X3BpbihwLCBSX1RQVV9QSU5fR1BJTywgTEVEX09GRik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcCk7CisKKwlJTklUX1dPUksoJnAtPndvcmssIHJfdHB1X3dvcmspOworCisJcC0+bGRldi5uYW1lID0gY2ZnLT5uYW1lOworCXAtPmxkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJcC0+bGRldi5tYXhfYnJpZ2h0bmVzcyA9IGNmZy0+bWF4X2JyaWdodG5lc3M7CisJcC0+bGRldi5icmlnaHRuZXNzX3NldCA9IHJfdHB1X3NldF9icmlnaHRuZXNzOworCXAtPmxkZXYuZmxhZ3MgfD0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnAtPmxkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjM7CisKKwkvKiBtYXhfYnJpZ2h0bmVzcyBtYXkgYmUgdXBkYXRlZCBieSB0aGUgTEVEIGNvcmUgY29kZSAqLworCXAtPm1pbl9yYXRlID0gcC0+bGRldi5tYXhfYnJpZ2h0bmVzcyAqIHAtPnJlZnJlc2hfcmF0ZTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworCisgZXJyMzoKKwlyX3RwdV9zZXRfcGluKHAsIFJfVFBVX1BJTl9VTlVTRUQsIExFRF9PRkYpOworCWNsa19wdXQocC0+Y2xrKTsKKyBlcnIyOgorCWlvdW5tYXAocC0+bWFwYmFzZSk7CisgZXJyMToKKwlrZnJlZShwKTsKKyBlcnIwOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHJfdHB1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByX3RwdV9wcml2ICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyX3RwdV9zZXRfYnJpZ2h0bmVzcygmcC0+bGRldiwgTEVEX09GRik7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnAtPmxkZXYpOworCWNhbmNlbF93b3JrX3N5bmMoJnAtPndvcmspOworCXJfdHB1X2Rpc2FibGUocCk7CisJcl90cHVfc2V0X3BpbihwLCBSX1RQVV9QSU5fVU5VU0VELCBMRURfT0ZGKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwljbGtfcHV0KHAtPmNsayk7CisKKwlpb3VubWFwKHAtPm1hcGJhc2UpOworCWtmcmVlKHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByX3RwdV9kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZQkJPSByX3RwdV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJfdHB1X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxlZHMtcmVuZXNhcy10cHUiLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJfdHB1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyX3RwdV9kZXZpY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJfdHB1X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmcl90cHVfZGV2aWNlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJfdHB1X2luaXQpOworbW9kdWxlX2V4aXQocl90cHVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgVFBVIExFRCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYwppbmRleCBhNzc3NzFkLi4yOWY4YjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1zM2MyNHh4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtczNjMjR4eC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdtODMxeC1zdGF0dXMuYwppbmRleCBlZjVjMjQxLi5iMWViMzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13bTgzMXgtc3RhdHVzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd204MzF4LXN0YXR1cy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9wZGF0YS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvc3RhdHVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RydWN0IHdtODMxeF9zdGF0dXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtd204MzUwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYwppbmRleCBmMTRlZGQ4Li40YTEyNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy13bTgzNTAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvcG1pYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljcm9hbXBzICovCiBzdGF0aWMgY29uc3QgaW50IGlzaW5rX2N1cltdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCmluZGV4IDI5ODJjODYuLjZlMjFlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy13cmFwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVk5BTUUgIndyYXAtbGVkIgogI2RlZmluZSBXUkFQX1BPV0VSX0xFRF9HUElPCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYyBiL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYwppbmRleCAyNTM1OTMzLi5iNWZkY2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9jb3JlLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvY29yZS5jCkBAIC0yMzIsNiArMjMyLDEzIEBACiAJCQl9CiAJCX0KIAorCQkvKgorCQkgKiBBbGwgbG9uZy1saXZlZCBrZXJuZWwgbG9vcHMgbmVlZCB0byBjaGVjayB3aXRoIHRoaXMgaG9ycmlibGUKKwkJICogdGhpbmcgY2FsbGVkIHRoZSBmcmVlemVyLiAgSWYgdGhlIEhvc3QgaXMgdHJ5aW5nIHRvIHN1c3BlbmQsCisJCSAqIGl0IHN0b3BzIHVzLgorCQkgKi8KKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCiAJCS8qIENoZWNrIGZvciBzaWduYWxzICovCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0yNDYsMTMgKzI1Myw2IEBACiAJCQl0cnlfZGVsaXZlcl9pbnRlcnJ1cHQoY3B1LCBpcnEsIG1vcmUpOwogCiAJCS8qCi0JCSAqIEFsbCBsb25nLWxpdmVkIGtlcm5lbCBsb29wcyBuZWVkIHRvIGNoZWNrIHdpdGggdGhpcyBob3JyaWJsZQotCQkgKiB0aGluZyBjYWxsZWQgdGhlIGZyZWV6ZXIuICBJZiB0aGUgSG9zdCBpcyB0cnlpbmcgdG8gc3VzcGVuZCwKLQkJICogaXQgc3RvcHMgdXMuCi0JCSAqLwotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyoKIAkJICogSnVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUgR3Vlc3QgaXMgc3RpbGwgYWxpdmUuICBPbmUgb2YKIAkJICogdGhvc2UgaHlwZXJjYWxscyBjb3VsZCBoYXZlIGJlZW4gZmF0YWwsIGZvciBleGFtcGxlLgogCQkgKi8KQEAgLTMxMyw3ICszMTMsNyBAQAogCWludCBlcnI7CiAKIAkvKiBMZ3Vlc3QgY2FuJ3QgcnVuIHVuZGVyIFhlbiwgVk1JIG9yIGl0c2VsZi4gIEl0IGRvZXMgVHJpY2t5IFN0dWZmLiAqLwotCWlmIChwYXJhdmlydF9lbmFibGVkKCkpIHsKKwlpZiAoZ2V0X2tlcm5lbF9ycGwoKSAhPSAwKSB7CiAJCXByaW50aygibGd1ZXN0IGlzIGFmcmFpZCBvZiBiZWluZyBhIGd1ZXN0XG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKaW5kZXggNTI4OWZmYS4uMGRjMzBmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19yaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKaW5kZXggZjk3ZTYyNS4uZmY0YTBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAibGcuaCIKIAogLypMOjA1NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYwppbmRleCA4MTdmMzdhLi5jOTU3MGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWkuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJZXJyID0gbWFjaWlfaW5pdF92aWEoKTsKIAlpZiAoZXJyKSBnb3RvIG91dDsKIAotCWVyciA9IHJlcXVlc3RfaXJxKElSUV9NQUNfQURCLCBtYWNpaV9pbnRlcnJ1cHQsIElSUV9GTEdfTE9DSywgIkFEQiIsCisJZXJyID0gcmVxdWVzdF9pcnEoSVJRX01BQ19BREIsIG1hY2lpX2ludGVycnVwdCwgMCwgIkFEQiIsCiAJCQkgIG1hY2lpX2ludGVycnVwdCk7CiAJaWYgKGVycikgZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtbWFjaWlzaS5jCmluZGV4IDlhYjViMGMuLjM0ZDAyYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1tYWNpaXNpLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLW1hY2lpc2kuYwpAQCAtMTIyLDggKzEyMiw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKElSUV9NQUNfQURCLCBtYWNpaXNpX2ludGVycnVwdCwgSVJRX0ZMR19MT0NLIHwgSVJRX0ZMR19GQVNULCAKLQkJCSJBREIiLCBtYWNpaXNpX2ludGVycnVwdCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19BREIsIG1hY2lpc2lfaW50ZXJydXB0LCAwLCAiQURCIiwKKwkJCW1hY2lpc2lfaW50ZXJydXB0KSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1hY2lpc2lfaW5pdDogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgSVJRX01BQ19BREIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL0tjb25maWcgYi9kcml2ZXJzL21kL0tjb25maWcKaW5kZXggZjc1YTY2ZS4uZmFhNDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMjA4LDYgKzIwOCwxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRE1fQlVGSU8KKyAgICAgICB0cmlzdGF0ZQorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKyAgICAgICAtLS1oZWxwLS0tCisJIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gZG8gYnVmZmVyZWQgSS9PIG9uIGEgZGV2aWNlIGFuZCBhY3RzCisJIGFzIGEgY2FjaGUsIGhvbGRpbmcgcmVjZW50bHktcmVhZCBibG9ja3MgaW4gbWVtb3J5IGFuZCBwZXJmb3JtaW5nCisJIGRlbGF5ZWQgd3JpdGVzLgorCitzb3VyY2UgImRyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL0tjb25maWciCisKIGNvbmZpZyBETV9DUllQVAogCXRyaXN0YXRlICJDcnlwdCB0YXJnZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMS19ERVZfRE0KQEAgLTIzMyw2ICsyNDMsMzIgQEAKICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBBbGxvdyB2b2x1bWUgbWFuYWdlcnMgdG8gdGFrZSB3cml0YWJsZSBzbmFwc2hvdHMgb2YgYSBkZXZpY2UuCiAKK2NvbmZpZyBETV9USElOX1BST1ZJU0lPTklORworICAgICAgIHRyaXN0YXRlICJUaGluIHByb3Zpc2lvbmluZyB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0RNICYmIEVYUEVSSU1FTlRBTAorICAgICAgIHNlbGVjdCBETV9QRVJTSVNURU5UX0RBVEEKKyAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICBQcm92aWRlcyB0aGluIHByb3Zpc2lvbmluZyBhbmQgc25hcHNob3RzIHRoYXQgc2hhcmUgYSBkYXRhIHN0b3JlLgorCitjb25maWcgRE1fREVCVUdfQkxPQ0tfU1RBQ0tfVFJBQ0lORworCWJvb2xlYW4gIktlZXAgc3RhY2sgdHJhY2Ugb2YgdGhpbiBwcm92aXNpb25pbmcgYmxvY2sgbG9jayBob2xkZXJzIgorCWRlcGVuZHMgb24gU1RBQ0tUUkFDRV9TVVBQT1JUICYmIERNX1RISU5fUFJPVklTSU9OSU5HCisJc2VsZWN0IFNUQUNLVFJBQ0UKKwktLS1oZWxwLS0tCisJICBFbmFibGUgdGhpcyBmb3IgbWVzc2FnZXMgdGhhdCBtYXkgaGVscCBkZWJ1ZyBwcm9ibGVtcyB3aXRoIHRoZQorCSAgYmxvY2sgbWFuYWdlciBsb2NraW5nIHVzZWQgYnkgdGhpbiBwcm92aXNpb25pbmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBETV9ERUJVR19TUEFDRV9NQVBTCisJYm9vbGVhbiAiRXh0cmEgdmFsaWRhdGlvbiBmb3IgdGhpbiBwcm92aXNpb25pbmcgc3BhY2UgbWFwcyIKKwlkZXBlbmRzIG9uIERNX1RISU5fUFJPVklTSU9OSU5HCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHRoaXMgZm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGhlbHAgZGVidWcgcHJvYmxlbXMgd2l0aCB0aGUKKwkgIHNwYWNlIG1hcHMgdXNlZCBieSB0aGluIHByb3Zpc2lvbmluZy4KKworICAgICAgICAgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBETV9NSVJST1IKICAgICAgICB0cmlzdGF0ZSAiTWlycm9yIHRhcmdldCIKICAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvTWFrZWZpbGUgYi9kcml2ZXJzL21kL01ha2VmaWxlCmluZGV4IDQ0ODgzOGIuLjA0Njg2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogZG0tbWlycm9yLXkJKz0gZG0tcmFpZDEubwogZG0tbG9nLXVzZXJzcGFjZS15IFwKIAkJKz0gZG0tbG9nLXVzZXJzcGFjZS1iYXNlLm8gZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5vCitkbS10aGluLXBvb2wteQkrPSBkbS10aGluLm8gZG0tdGhpbi1tZXRhZGF0YS5vCiBtZC1tb2QteQkrPSBtZC5vIGJpdG1hcC5vCiByYWlkNDU2LXkJKz0gcmFpZDUubwogCkBAIC0yNyw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfTURfRkFVTFRZKQkJKz0gZmF1bHR5Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX01EKQkrPSBtZC1tb2Qubwogb2JqLSQoQ09ORklHX0JMS19ERVZfRE0pCSs9IGRtLW1vZC5vCitvYmotJChDT05GSUdfRE1fQlVGSU8pCQkrPSBkbS1idWZpby5vCiBvYmotJChDT05GSUdfRE1fQ1JZUFQpCQkrPSBkbS1jcnlwdC5vCiBvYmotJChDT05GSUdfRE1fREVMQVkpCQkrPSBkbS1kZWxheS5vCiBvYmotJChDT05GSUdfRE1fRkxBS0VZKQkJKz0gZG0tZmxha2V5Lm8KQEAgLTM0LDEwICszNiwxMiBAQAogb2JqLSQoQ09ORklHX0RNX01VTFRJUEFUSF9RTCkJKz0gZG0tcXVldWUtbGVuZ3RoLm8KIG9iai0kKENPTkZJR19ETV9NVUxUSVBBVEhfU1QpCSs9IGRtLXNlcnZpY2UtdGltZS5vCiBvYmotJChDT05GSUdfRE1fU05BUFNIT1QpCSs9IGRtLXNuYXBzaG90Lm8KK29iai0kKENPTkZJR19ETV9QRVJTSVNURU5UX0RBVEEpCSs9IHBlcnNpc3RlbnQtZGF0YS8KIG9iai0kKENPTkZJR19ETV9NSVJST1IpCQkrPSBkbS1taXJyb3IubyBkbS1sb2cubyBkbS1yZWdpb24taGFzaC5vCiBvYmotJChDT05GSUdfRE1fTE9HX1VTRVJTUEFDRSkJKz0gZG0tbG9nLXVzZXJzcGFjZS5vCiBvYmotJChDT05GSUdfRE1fWkVSTykJCSs9IGRtLXplcm8ubwogb2JqLSQoQ09ORklHX0RNX1JBSUQpCSs9IGRtLXJhaWQubworb2JqLSQoQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HKQkrPSBkbS10aGluLXBvb2wubwogCiBpZmVxICgkKENPTkZJR19ETV9VRVZFTlQpLHkpCiBkbS1tb2Qtb2JqcwkJCSs9IGRtLXVldmVudC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2ODA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uYwpAQCAtMCwwICsxLDE3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogQXV0aG9yOiBNaWt1bGFzIFBhdG9ja2EgPG1wYXRvY2thQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ1ZmlvLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggImJ1ZmlvIgorCisvKgorICogTWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5OgorICoJTGltaXQgdGhlIG51bWJlciBvZiBidWZmZXJzIHRvIERNX0JVRklPX01FTU9SWV9QRVJDRU5UIG9mIG1haW4gbWVtb3J5CisgKglvciBETV9CVUZJT19WTUFMTE9DX1BFUkNFTlQgb2Ygdm1hbGxvYyBtZW1vcnkgKHdoaWNoZXZlciBpcyBsb3dlcikuCisgKglBbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgRE1fQlVGSU9fTUlOX0JVRkZFUlMgYnVmZmVycy4KKyAqCVN0YXJ0IGJhY2tncm91bmQgd3JpdGViYWNrIHdoZW4gdGhlcmUgYXJlIERNX0JVRklPX1dSSVRFQkFDS19QRVJDRU5UCisgKglkaXJ0eSBidWZmZXJzLgorICovCisjZGVmaW5lIERNX0JVRklPX01JTl9CVUZGRVJTCQk4CisKKyNkZWZpbmUgRE1fQlVGSU9fTUVNT1JZX1BFUkNFTlQJCTIKKyNkZWZpbmUgRE1fQlVGSU9fVk1BTExPQ19QRVJDRU5UCTI1CisjZGVmaW5lIERNX0JVRklPX1dSSVRFQkFDS19QRVJDRU5UCTc1CisKKy8qCisgKiBDaGVjayBidWZmZXIgYWdlcyBpbiB0aGlzIGludGVydmFsIChzZWNvbmRzKQorICovCisjZGVmaW5lIERNX0JVRklPX1dPUktfVElNRVJfU0VDUwkxMAorCisvKgorICogRnJlZSBidWZmZXJzIHdoZW4gdGhleSBhcmUgb2xkZXIgdGhhbiB0aGlzIChzZWNvbmRzKQorICovCisjZGVmaW5lIERNX0JVRklPX0RFRkFVTFRfQUdFX1NFQ1MJNjAKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgYnZlYyBlbnRyaWVzIHRoYXQgYXJlIGVtYmVkZGVkIGRpcmVjdGx5IGluIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgY2h1bmsgc2l6ZSBpcyBsYXJnZXIsIGRtLWlvIGlzIHVzZWQgdG8gZG8gdGhlIGlvLgorICovCisjZGVmaW5lIERNX0JVRklPX0lOTElORV9WRUNTCQkxNgorCisvKgorICogQnVmZmVyIGhhc2gKKyAqLworI2RlZmluZSBETV9CVUZJT19IQVNIX0JJVFMJMjAKKyNkZWZpbmUgRE1fQlVGSU9fSEFTSChibG9jaykgXAorCSgoKChibG9jaykgPj4gRE1fQlVGSU9fSEFTSF9CSVRTKSBeIChibG9jaykpICYgXAorCSAoKDEgPDwgRE1fQlVGSU9fSEFTSF9CSVRTKSAtIDEpKQorCisvKgorICogRG9uJ3QgdHJ5IHRvIHVzZSBrbWVtX2NhY2hlX2FsbG9jIGZvciBibG9ja3MgbGFyZ2VyIHRoYW4gdGhpcy4KKyAqIEZvciBleHBsYW5hdGlvbiwgc2VlIGFsbG9jX2J1ZmZlcl9kYXRhIGJlbG93LgorICovCisjZGVmaW5lIERNX0JVRklPX0JMT0NLX1NJWkVfU0xBQl9MSU1JVAkoUEFHRV9TSVpFID4+IDEpCisjZGVmaW5lIERNX0JVRklPX0JMT0NLX1NJWkVfR0ZQX0xJTUlUCShQQUdFX1NJWkUgPDwgKE1BWF9PUkRFUiAtIDEpKQorCisvKgorICogZG1fYnVmZmVyLT5saXN0X21vZGUKKyAqLworI2RlZmluZSBMSVNUX0NMRUFOCTAKKyNkZWZpbmUgTElTVF9ESVJUWQkxCisjZGVmaW5lIExJU1RfU0laRQkyCisKKy8qCisgKiBMaW5raW5nIG9mIGJ1ZmZlcnM6CisgKglBbGwgYnVmZmVycyBhcmUgbGlua2VkIHRvIGNhY2hlX2hhc2ggd2l0aCB0aGVpciBoYXNoX2xpc3QgZmllbGQuCisgKgorICoJQ2xlYW4gYnVmZmVycyB0aGF0IGFyZSBub3QgYmVpbmcgd3JpdHRlbiAoQl9XUklUSU5HIG5vdCBzZXQpCisgKglhcmUgbGlua2VkIHRvIGxydVtMSVNUX0NMRUFOXSB3aXRoIHRoZWlyIGxydV9saXN0IGZpZWxkLgorICoKKyAqCURpcnR5IGFuZCBjbGVhbiBidWZmZXJzIHRoYXQgYXJlIGJlaW5nIHdyaXR0ZW4gYXJlIGxpbmtlZCB0bworICoJbHJ1W0xJU1RfRElSVFldIHdpdGggdGhlaXIgbHJ1X2xpc3QgZmllbGQuIFdoZW4gdGhlIHdyaXRlCisgKglmaW5pc2hlcywgdGhlIGJ1ZmZlciBjYW5ub3QgYmUgcmVsaW5rZWQgaW1tZWRpYXRlbHkgKGJlY2F1c2Ugd2UKKyAqCWFyZSBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgcmVsaW5raW5nIHJlcXVpcmVzIHByb2Nlc3MKKyAqCWNvbnRleHQpLCBzbyBzb21lIGNsZWFuLW5vdC13cml0aW5nIGJ1ZmZlcnMgY2FuIGJlIGhlbGQgb24KKyAqCWRpcnR5X2xydSB0b28uICBUaGV5IGFyZSBsYXRlciBhZGRlZCB0byBscnUgaW4gdGhlIHByb2Nlc3MKKyAqCWNvbnRleHQuCisgKi8KK3N0cnVjdCBkbV9idWZpb19jbGllbnQgeworCXN0cnVjdCBtdXRleCBsb2NrOworCisJc3RydWN0IGxpc3RfaGVhZCBscnVbTElTVF9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIG5fYnVmZmVyc1tMSVNUX1NJWkVdOworCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwl1bnNpZ25lZCBibG9ja19zaXplOworCXVuc2lnbmVkIGNoYXIgc2VjdG9yc19wZXJfYmxvY2tfYml0czsKKwl1bnNpZ25lZCBjaGFyIHBhZ2VzX3Blcl9ibG9ja19iaXRzOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzX3Blcl9wYWdlX2JpdHM7CisJdW5zaWduZWQgYXV4X3NpemU7CisJdm9pZCAoKmFsbG9jX2NhbGxiYWNrKShzdHJ1Y3QgZG1fYnVmZmVyICopOworCXZvaWQgKCp3cml0ZV9jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKTsKKworCXN0cnVjdCBkbV9pb19jbGllbnQgKmRtX2lvOworCisJc3RydWN0IGxpc3RfaGVhZCByZXNlcnZlZF9idWZmZXJzOworCXVuc2lnbmVkIG5lZWRfcmVzZXJ2ZWRfYnVmZmVyczsKKworCXN0cnVjdCBobGlzdF9oZWFkICpjYWNoZV9oYXNoOworCXdhaXRfcXVldWVfaGVhZF90IGZyZWVfYnVmZmVyX3dhaXQ7CisKKwlpbnQgYXN5bmNfd3JpdGVfZXJyb3I7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNsaWVudF9saXN0OworCXN0cnVjdCBzaHJpbmtlciBzaHJpbmtlcjsKK307CisKKy8qCisgKiBCdWZmZXIgc3RhdGUgYml0cy4KKyAqLworI2RlZmluZSBCX1JFQURJTkcJMAorI2RlZmluZSBCX1dSSVRJTkcJMQorI2RlZmluZSBCX0RJUlRZCQkyCisKKy8qCisgKiBEZXNjcmliZXMgaG93IHRoZSBibG9jayB3YXMgYWxsb2NhdGVkOgorICoga21lbV9jYWNoZV9hbGxvYygpLCBfX2dldF9mcmVlX3BhZ2VzKCkgb3Igdm1hbGxvYygpLgorICogU2VlIHRoZSBjb21tZW50IGF0IGFsbG9jX2J1ZmZlcl9kYXRhLgorICovCitlbnVtIGRhdGFfbW9kZSB7CisJREFUQV9NT0RFX1NMQUIgPSAwLAorCURBVEFfTU9ERV9HRVRfRlJFRV9QQUdFUyA9IDEsCisJREFUQV9NT0RFX1ZNQUxMT0MgPSAyLAorCURBVEFfTU9ERV9MSU1JVCA9IDMKK307CisKK3N0cnVjdCBkbV9idWZmZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OworCXNlY3Rvcl90IGJsb2NrOworCXZvaWQgKmRhdGE7CisJZW51bSBkYXRhX21vZGUgZGF0YV9tb2RlOworCXVuc2lnbmVkIGNoYXIgbGlzdF9tb2RlOwkJLyogTElTVF8qICovCisJdW5zaWduZWQgaG9sZF9jb3VudDsKKwlpbnQgcmVhZF9lcnJvcjsKKwlpbnQgd3JpdGVfZXJyb3I7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWNjZXNzZWQ7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYzsKKwlzdHJ1Y3QgYmlvIGJpbzsKKwlzdHJ1Y3QgYmlvX3ZlYyBiaW9fdmVjW0RNX0JVRklPX0lOTElORV9WRUNTXTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZG1fYnVmaW9fY2FjaGVzW1BBR0VfU0hJRlQgLSBTRUNUT1JfU0hJRlRdOworc3RhdGljIGNoYXIgKmRtX2J1ZmlvX2NhY2hlX25hbWVzW1BBR0VfU0hJRlQgLSBTRUNUT1JfU0hJRlRdOworCitzdGF0aWMgaW5saW5lIGludCBkbV9idWZpb19jYWNoZV9pbmRleChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXVuc2lnbmVkIHJldCA9IGMtPmJsb2Nrc19wZXJfcGFnZV9iaXRzIC0gMTsKKworCUJVR19PTihyZXQgPj0gQVJSQVlfU0laRShkbV9idWZpb19jYWNoZXMpKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgRE1fQlVGSU9fQ0FDSEUoYykJKGRtX2J1ZmlvX2NhY2hlc1tkbV9idWZpb19jYWNoZV9pbmRleChjKV0pCisjZGVmaW5lIERNX0JVRklPX0NBQ0hFX05BTUUoYykJKGRtX2J1ZmlvX2NhY2hlX25hbWVzW2RtX2J1ZmlvX2NhY2hlX2luZGV4KGMpXSkKKworI2RlZmluZSBkbV9idWZpb19pbl9yZXF1ZXN0KCkJKCEhY3VycmVudC0+YmlvX2xpc3QpCisKK3N0YXRpYyB2b2lkIGRtX2J1ZmlvX2xvY2soc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwltdXRleF9sb2NrX25lc3RlZCgmYy0+bG9jaywgZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKK30KKworc3RhdGljIGludCBkbV9idWZpb190cnlsb2NrKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJcmV0dXJuIG11dGV4X3RyeWxvY2soJmMtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkbV9idWZpb191bmxvY2soc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwltdXRleF91bmxvY2soJmMtPmxvY2spOworfQorCisvKgorICogRklYTUUgTW92ZSB0byBzY2hlZC5oPworICovCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZCisjICBkZWZpbmUgZG1fYnVmaW9fY29uZF9yZXNjaGVkKCkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKHVubGlrZWx5KG5lZWRfcmVzY2hlZCgpKSkJCVwKKwkJX2NvbmRfcmVzY2hlZCgpOwkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgZG1fYnVmaW9fY29uZF9yZXNjaGVkKCkgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBEZWZhdWx0IGNhY2hlIHNpemU6IGF2YWlsYWJsZSBtZW1vcnkgZGl2aWRlZCBieSB0aGUgcmF0aW8uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX2RlZmF1bHRfY2FjaGVfc2l6ZTsKKworLyoKKyAqIFRvdGFsIGNhY2hlIHNpemUgc2V0IGJ5IHRoZSB1c2VyLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplOworCisvKgorICogQSBjb3B5IG9mIGRtX2J1ZmlvX2NhY2hlX3NpemUgYmVjYXVzZSBkbV9idWZpb19jYWNoZV9zaXplIGNhbiBjaGFuZ2UKKyAqIGF0IGFueSB0aW1lLiAgSWYgaXQgZGlzYWdyZWVzLCB0aGUgdXNlciBoYXMgY2hhbmdlZCBjYWNoZSBzaXplLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFtX3NwaW5sb2NrKTsKKworLyoKKyAqIEJ1ZmZlcnMgYXJlIGZyZWVkIGFmdGVyIHRoaXMgdGltZW91dAorICovCitzdGF0aWMgdW5zaWduZWQgZG1fYnVmaW9fbWF4X2FnZSA9IERNX0JVRklPX0RFRkFVTFRfQUdFX1NFQ1M7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX3BlYWtfYWxsb2NhdGVkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1fYnVmaW9fYWxsb2NhdGVkX2ttZW1fY2FjaGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19hbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19hbGxvY2F0ZWRfdm1hbGxvYzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUGVyLWNsaWVudCBjYWNoZTogZG1fYnVmaW9fY2FjaGVfc2l6ZSAvIGRtX2J1ZmlvX2NsaWVudF9jb3VudAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbV9idWZpb19jYWNoZV9zaXplX3Blcl9jbGllbnQ7CisKKy8qCisgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgY2xpZW50cy4KKyAqLworc3RhdGljIGludCBkbV9idWZpb19jbGllbnRfY291bnQ7CisKKy8qCisgKiBUaGUgbGlzdCBvZiBhbGwgY2xpZW50cy4KKyAqLworc3RhdGljIExJU1RfSEVBRChkbV9idWZpb19hbGxfY2xpZW50cyk7CisKKy8qCisgKiBUaGlzIG11dGV4IHByb3RlY3RzIGRtX2J1ZmlvX2NhY2hlX3NpemVfbGF0Y2gsCisgKiBkbV9idWZpb19jYWNoZV9zaXplX3Blcl9jbGllbnQgYW5kIGRtX2J1ZmlvX2NsaWVudF9jb3VudAorICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIGFkanVzdF90b3RhbF9hbGxvY2F0ZWQoZW51bSBkYXRhX21vZGUgZGF0YV9tb2RlLCBsb25nIGRpZmYpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgKiBjb25zdCBjbGFzc19wdHJbREFUQV9NT0RFX0xJTUlUXSA9IHsKKwkJJmRtX2J1ZmlvX2FsbG9jYXRlZF9rbWVtX2NhY2hlLAorCQkmZG1fYnVmaW9fYWxsb2NhdGVkX2dldF9mcmVlX3BhZ2VzLAorCQkmZG1fYnVmaW9fYWxsb2NhdGVkX3ZtYWxsb2MsCisJfTsKKworCXNwaW5fbG9jaygmcGFyYW1fc3BpbmxvY2spOworCisJKmNsYXNzX3B0cltkYXRhX21vZGVdICs9IGRpZmY7CisKKwlkbV9idWZpb19jdXJyZW50X2FsbG9jYXRlZCArPSBkaWZmOworCisJaWYgKGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkID4gZG1fYnVmaW9fcGVha19hbGxvY2F0ZWQpCisJCWRtX2J1ZmlvX3BlYWtfYWxsb2NhdGVkID0gZG1fYnVmaW9fY3VycmVudF9hbGxvY2F0ZWQ7CisKKwlzcGluX3VubG9jaygmcGFyYW1fc3BpbmxvY2spOworfQorCisvKgorICogQ2hhbmdlIHRoZSBudW1iZXIgb2YgY2xpZW50cyBhbmQgcmVjYWxjdWxhdGUgcGVyLWNsaWVudCBsaW1pdC4KKyAqLworc3RhdGljIHZvaWQgX19jYWNoZV9zaXplX3JlZnJlc2godm9pZCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fYnVmaW9fY2xpZW50c19sb2NrKSk7CisJQlVHX09OKGRtX2J1ZmlvX2NsaWVudF9jb3VudCA8IDApOworCisJZG1fYnVmaW9fY2FjaGVfc2l6ZV9sYXRjaCA9IGRtX2J1ZmlvX2NhY2hlX3NpemU7CisKKwliYXJyaWVyKCk7CisKKwkvKgorCSAqIFVzZSBkZWZhdWx0IGlmIHNldCB0byAwIGFuZCByZXBvcnQgdGhlIGFjdHVhbCBjYWNoZSBzaXplIHVzZWQuCisJICovCisJaWYgKCFkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoKSB7CisJCSh2b2lkKWNtcHhjaGcoJmRtX2J1ZmlvX2NhY2hlX3NpemUsIDAsCisJCQkgICAgICBkbV9idWZpb19kZWZhdWx0X2NhY2hlX3NpemUpOworCQlkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoID0gZG1fYnVmaW9fZGVmYXVsdF9jYWNoZV9zaXplOworCX0KKworCWRtX2J1ZmlvX2NhY2hlX3NpemVfcGVyX2NsaWVudCA9IGRtX2J1ZmlvX2NhY2hlX3NpemVfbGF0Y2ggLworCQkJCQkgKGRtX2J1ZmlvX2NsaWVudF9jb3VudCA/IDogMSk7Cit9CisKKy8qCisgKiBBbGxvY2F0aW5nIGJ1ZmZlciBkYXRhLgorICoKKyAqIFNtYWxsIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCB3aXRoIGttZW1fY2FjaGUsIHRvIHVzZSBzcGFjZSBvcHRpbWFsbHkuCisgKgorICogRm9yIGxhcmdlIGJ1ZmZlcnMsIHdlIGNob29zZSBiZXR3ZWVuIGdldF9mcmVlX3BhZ2VzIGFuZCB2bWFsbG9jLgorICogRWFjaCBoYXMgYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcy4KKyAqCisgKiBfX2dldF9mcmVlX3BhZ2VzIGNhbiByYW5kb21seSBmYWlsIGlmIHRoZSBtZW1vcnkgaXMgZnJhZ21lbnRlZC4KKyAqIF9fdm1hbGxvYyB3b24ndCByYW5kb21seSBmYWlsLCBidXQgdm1hbGxvYyBzcGFjZSBpcyBsaW1pdGVkIChpdCBtYXkgYmUKKyAqIGFzIGxvdyBhcyAxMjhNKSBzbyB1c2luZyBpdCBmb3IgY2FjaGluZyBpcyBub3QgYXBwcm9wcmlhdGUuCisgKgorICogSWYgdGhlIGFsbG9jYXRpb24gbWF5IGZhaWwgd2UgdXNlIF9fZ2V0X2ZyZWVfcGFnZXMuIE1lbW9yeSBmcmFnbWVudGF0aW9uCisgKiB3b24ndCBoYXZlIGEgZmF0YWwgZWZmZWN0IGhlcmUsIGJ1dCBpdCBqdXN0IGNhdXNlcyBmbHVzaGVzIG9mIHNvbWUgb3RoZXIKKyAqIGJ1ZmZlcnMgYW5kIG1vcmUgSS9PIHdpbGwgYmUgcGVyZm9ybWVkLiBEb24ndCB1c2UgX19nZXRfZnJlZV9wYWdlcyBpZiBpdAorICogYWx3YXlzIGZhaWxzIChpLmUuIG9yZGVyID49IE1BWF9PUkRFUikuCisgKgorICogSWYgdGhlIGFsbG9jYXRpb24gc2hvdWxkbid0IGZhaWwgd2UgdXNlIF9fdm1hbGxvYy4gVGhpcyBpcyBvbmx5IGZvciB0aGUKKyAqIGluaXRpYWwgcmVzZXJ2ZSBhbGxvY2F0aW9uLCBzbyB0aGVyZSdzIG5vIHJpc2sgb2Ygd2FzdGluZyBhbGwgdm1hbGxvYworICogc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkICphbGxvY19idWZmZXJfZGF0YShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBnZnBfdCBnZnBfbWFzaywKKwkJCSAgICAgICBlbnVtIGRhdGFfbW9kZSAqZGF0YV9tb2RlKQoreworCWlmIChjLT5ibG9ja19zaXplIDw9IERNX0JVRklPX0JMT0NLX1NJWkVfU0xBQl9MSU1JVCkgeworCQkqZGF0YV9tb2RlID0gREFUQV9NT0RFX1NMQUI7CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKERNX0JVRklPX0NBQ0hFKGMpLCBnZnBfbWFzayk7CisJfQorCisJaWYgKGMtPmJsb2NrX3NpemUgPD0gRE1fQlVGSU9fQkxPQ0tfU0laRV9HRlBfTElNSVQgJiYKKwkgICAgZ2ZwX21hc2sgJiBfX0dGUF9OT1JFVFJZKSB7CisJCSpkYXRhX21vZGUgPSBEQVRBX01PREVfR0VUX0ZSRUVfUEFHRVM7CisJCXJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwX21hc2ssCisJCQkJCQljLT5wYWdlc19wZXJfYmxvY2tfYml0cyk7CisJfQorCisJKmRhdGFfbW9kZSA9IERBVEFfTU9ERV9WTUFMTE9DOworCXJldHVybiBfX3ZtYWxsb2MoYy0+YmxvY2tfc2l6ZSwgZ2ZwX21hc2ssIFBBR0VfS0VSTkVMKTsKK30KKworLyoKKyAqIEZyZWUgYnVmZmVyJ3MgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9idWZmZXJfZGF0YShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLAorCQkJICAgICB2b2lkICpkYXRhLCBlbnVtIGRhdGFfbW9kZSBkYXRhX21vZGUpCit7CisJc3dpdGNoIChkYXRhX21vZGUpIHsKKwljYXNlIERBVEFfTU9ERV9TTEFCOgorCQlrbWVtX2NhY2hlX2ZyZWUoRE1fQlVGSU9fQ0FDSEUoYyksIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgREFUQV9NT0RFX0dFVF9GUkVFX1BBR0VTOgorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWRhdGEsIGMtPnBhZ2VzX3Blcl9ibG9ja19iaXRzKTsKKwkJYnJlYWs7CisKKwljYXNlIERBVEFfTU9ERV9WTUFMTE9DOgorCQl2ZnJlZShkYXRhKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUNSSVQoImRtX2J1ZmlvX2ZyZWVfYnVmZmVyX2RhdGE6IGJhZCBkYXRhIG1vZGU6ICVkIiwKKwkJICAgICAgIGRhdGFfbW9kZSk7CisJCUJVRygpOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGJ1ZmZlciBhbmQgaXRzIGRhdGEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1fYnVmZmVyICphbGxvY19idWZmZXIoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IGRtX2J1ZmZlciAqYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbV9idWZmZXIpICsgYy0+YXV4X3NpemUsCisJCQkJICAgICAgZ2ZwX21hc2spOworCisJaWYgKCFiKQorCQlyZXR1cm4gTlVMTDsKKworCWItPmMgPSBjOworCisJYi0+ZGF0YSA9IGFsbG9jX2J1ZmZlcl9kYXRhKGMsIGdmcF9tYXNrLCAmYi0+ZGF0YV9tb2RlKTsKKwlpZiAoIWItPmRhdGEpIHsKKwkJa2ZyZWUoYik7CisJCXJldHVybiBOVUxMOworCX0KKworCWFkanVzdF90b3RhbF9hbGxvY2F0ZWQoYi0+ZGF0YV9tb2RlLCAobG9uZyljLT5ibG9ja19zaXplKTsKKworCXJldHVybiBiOworfQorCisvKgorICogRnJlZSBidWZmZXIgYW5kIGl0cyBkYXRhLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJYWRqdXN0X3RvdGFsX2FsbG9jYXRlZChiLT5kYXRhX21vZGUsIC0obG9uZyljLT5ibG9ja19zaXplKTsKKworCWZyZWVfYnVmZmVyX2RhdGEoYywgYi0+ZGF0YSwgYi0+ZGF0YV9tb2RlKTsKKwlrZnJlZShiKTsKK30KKworLyoKKyAqIExpbmsgYnVmZmVyIHRvIHRoZSBoYXNoIGxpc3QgYW5kIGNsZWFuIG9yIGRpcnR5IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX2xpbmtfYnVmZmVyKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IGJsb2NrLCBpbnQgZGlydHkpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9IGItPmM7CisKKwljLT5uX2J1ZmZlcnNbZGlydHldKys7CisJYi0+YmxvY2sgPSBibG9jazsKKwliLT5saXN0X21vZGUgPSBkaXJ0eTsKKwlsaXN0X2FkZCgmYi0+bHJ1X2xpc3QsICZjLT5scnVbZGlydHldKTsKKwlobGlzdF9hZGRfaGVhZCgmYi0+aGFzaF9saXN0LCAmYy0+Y2FjaGVfaGFzaFtETV9CVUZJT19IQVNIKGJsb2NrKV0pOworCWItPmxhc3RfYWNjZXNzZWQgPSBqaWZmaWVzOworfQorCisvKgorICogVW5saW5rIGJ1ZmZlciBmcm9tIHRoZSBoYXNoIGxpc3QgYW5kIGRpcnR5IG9yIGNsZWFuIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3VubGlua19idWZmZXIoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjID0gYi0+YzsKKworCUJVR19PTighYy0+bl9idWZmZXJzW2ItPmxpc3RfbW9kZV0pOworCisJYy0+bl9idWZmZXJzW2ItPmxpc3RfbW9kZV0tLTsKKwlobGlzdF9kZWwoJmItPmhhc2hfbGlzdCk7CisJbGlzdF9kZWwoJmItPmxydV9saXN0KTsKK30KKworLyoKKyAqIFBsYWNlIHRoZSBidWZmZXIgdG8gdGhlIGhlYWQgb2YgZGlydHkgb3IgY2xlYW4gTFJVIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBfX3JlbGlua19scnUoc3RydWN0IGRtX2J1ZmZlciAqYiwgaW50IGRpcnR5KQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJQlVHX09OKCFjLT5uX2J1ZmZlcnNbYi0+bGlzdF9tb2RlXSk7CisKKwljLT5uX2J1ZmZlcnNbYi0+bGlzdF9tb2RlXS0tOworCWMtPm5fYnVmZmVyc1tkaXJ0eV0rKzsKKwliLT5saXN0X21vZGUgPSBkaXJ0eTsKKwlsaXN0X2RlbCgmYi0+bHJ1X2xpc3QpOworCWxpc3RfYWRkKCZiLT5scnVfbGlzdCwgJmMtPmxydVtkaXJ0eV0pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1Ym1pdCBJL08gb24gdGhlIGJ1ZmZlci4KKyAqCisgKiBCaW8gaW50ZXJmYWNlIGlzIGZhc3RlciBidXQgaXQgaGFzIHNvbWUgcHJvYmxlbXM6CisgKgl0aGUgdmVjdG9yIGxpc3QgaXMgbGltaXRlZCAoaW5jcmVhc2luZyB0aGlzIGxpbWl0IGluY3JlYXNlcworICoJbWVtb3J5LWNvbnN1bXB0aW9uIHBlciBidWZmZXIsIHNvIGl0IGlzIG5vdCB2aWFibGUpOworICoKKyAqCXRoZSBtZW1vcnkgbXVzdCBiZSBkaXJlY3QtbWFwcGVkLCBub3Qgdm1hbGxvY2VkOworICoKKyAqCXRoZSBJL08gZHJpdmVyIGNhbiByZWplY3QgcmVxdWVzdHMgc3B1cmlvdXNseSBpZiBpdCB0aGlua3MgdGhhdAorICoJdGhlIHJlcXVlc3RzIGFyZSB0b28gYmlnIGZvciB0aGUgZGV2aWNlIG9yIGlmIHRoZXkgY3Jvc3MgYQorICoJY29udHJvbGxlci1kZWZpbmVkIG1lbW9yeSBib3VuZGFyeS4KKyAqCisgKiBJZiB0aGUgYnVmZmVyIGlzIHNtYWxsIGVub3VnaCAodXAgdG8gRE1fQlVGSU9fSU5MSU5FX1ZFQ1MgcGFnZXMpIGFuZAorICogaXQgaXMgbm90IHZtYWxsb2NlZCwgdHJ5IHVzaW5nIHRoZSBiaW8gaW50ZXJmYWNlLgorICoKKyAqIElmIHRoZSBidWZmZXIgaXMgYmlnLCBpZiBpdCBpcyB2bWFsbG9jZWQgb3IgaWYgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisgKiByZWplY3RzIHRoZSBiaW8gYmVjYXVzZSBpdCBpcyB0b28gbGFyZ2UsIHVzZSBkbS1pbyBsYXllciB0byBkbyB0aGUgSS9PLgorICogVGhlIGRtLWlvIGxheWVyIHNwbGl0cyB0aGUgSS9PIGludG8gbXVsdGlwbGUgcmVxdWVzdHMsIGF2b2lkaW5nIHRoZSBhYm92ZQorICogc2hvcnRjb21pbmdzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBkbS1pbyBjb21wbGV0aW9uIHJvdXRpbmUuIEl0IGp1c3QgY2FsbHMgYi0+YmlvLmJpX2VuZF9pbywgcHJldGVuZGluZworICogdGhhdCB0aGUgcmVxdWVzdCB3YXMgaGFuZGxlZCBkaXJlY3RseSB3aXRoIGJpbyBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGRtaW9fY29tcGxldGUodW5zaWduZWQgbG9uZyBlcnJvciwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGV4dDsKKworCWItPmJpby5iaV9lbmRfaW8oJmItPmJpbywgZXJyb3IgPyAtRUlPIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZV9kbWlvKHN0cnVjdCBkbV9idWZmZXIgKmIsIGludCBydywgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgYmlvX2VuZF9pb190ICplbmRfaW8pCit7CisJaW50IHI7CisJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0geworCQkuYmlfcncgPSBydywKKwkJLm5vdGlmeS5mbiA9IGRtaW9fY29tcGxldGUsCisJCS5ub3RpZnkuY29udGV4dCA9IGIsCisJCS5jbGllbnQgPSBiLT5jLT5kbV9pbywKKwl9OworCXN0cnVjdCBkbV9pb19yZWdpb24gcmVnaW9uID0geworCQkuYmRldiA9IGItPmMtPmJkZXYsCisJCS5zZWN0b3IgPSBibG9jayA8PCBiLT5jLT5zZWN0b3JzX3Blcl9ibG9ja19iaXRzLAorCQkuY291bnQgPSBiLT5jLT5ibG9ja19zaXplID4+IFNFQ1RPUl9TSElGVCwKKwl9OworCisJaWYgKGItPmRhdGFfbW9kZSAhPSBEQVRBX01PREVfVk1BTExPQykgeworCQlpb19yZXEubWVtLnR5cGUgPSBETV9JT19LTUVNOworCQlpb19yZXEubWVtLnB0ci5hZGRyID0gYi0+ZGF0YTsKKwl9IGVsc2UgeworCQlpb19yZXEubWVtLnR5cGUgPSBETV9JT19WTUE7CisJCWlvX3JlcS5tZW0ucHRyLnZtYSA9IGItPmRhdGE7CisJfQorCisJYi0+YmlvLmJpX2VuZF9pbyA9IGVuZF9pbzsKKworCXIgPSBkbV9pbygmaW9fcmVxLCAxLCAmcmVnaW9uLCBOVUxMKTsKKwlpZiAocikKKwkJZW5kX2lvKCZiLT5iaW8sIHIpOworfQorCitzdGF0aWMgdm9pZCB1c2VfaW5saW5lX2JpbyhzdHJ1Y3QgZG1fYnVmZmVyICpiLCBpbnQgcncsIHNlY3Rvcl90IGJsb2NrLAorCQkJICAgYmlvX2VuZF9pb190ICplbmRfaW8pCit7CisJY2hhciAqcHRyOworCWludCBsZW47CisKKwliaW9faW5pdCgmYi0+YmlvKTsKKwliLT5iaW8uYmlfaW9fdmVjID0gYi0+YmlvX3ZlYzsKKwliLT5iaW8uYmlfbWF4X3ZlY3MgPSBETV9CVUZJT19JTkxJTkVfVkVDUzsKKwliLT5iaW8uYmlfc2VjdG9yID0gYmxvY2sgPDwgYi0+Yy0+c2VjdG9yc19wZXJfYmxvY2tfYml0czsKKwliLT5iaW8uYmlfYmRldiA9IGItPmMtPmJkZXY7CisJYi0+YmlvLmJpX2VuZF9pbyA9IGVuZF9pbzsKKworCS8qCisJICogV2UgYXNzdW1lIHRoYXQgaWYgbGVuID49IFBBR0VfU0laRSBwdHIgaXMgcGFnZS1hbGlnbmVkLgorCSAqIElmIGxlbiA8IFBBR0VfU0laRSB0aGUgYnVmZmVyIGRvZXNuJ3QgY3Jvc3MgcGFnZSBib3VuZGFyeS4KKwkgKi8KKwlwdHIgPSBiLT5kYXRhOworCWxlbiA9IGItPmMtPmJsb2NrX3NpemU7CisKKwlpZiAobGVuID49IFBBR0VfU0laRSkKKwkJQlVHX09OKCh1bnNpZ25lZCBsb25nKXB0ciAmIChQQUdFX1NJWkUgLSAxKSk7CisJZWxzZQorCQlCVUdfT04oKHVuc2lnbmVkIGxvbmcpcHRyICYgKGxlbiAtIDEpKTsKKworCWRvIHsKKwkJaWYgKCFiaW9fYWRkX3BhZ2UoJmItPmJpbywgdmlydF90b19wYWdlKHB0ciksCisJCQkJICBsZW4gPCBQQUdFX1NJWkUgPyBsZW4gOiBQQUdFX1NJWkUsCisJCQkJICB2aXJ0X3RvX3BoeXMocHRyKSAmIChQQUdFX1NJWkUgLSAxKSkpIHsKKwkJCUJVR19PTihiLT5jLT5ibG9ja19zaXplIDw9IFBBR0VfU0laRSk7CisJCQl1c2VfZG1pbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7CisJCQlyZXR1cm47CisJCX0KKworCQlsZW4gLT0gUEFHRV9TSVpFOworCQlwdHIgKz0gUEFHRV9TSVpFOworCX0gd2hpbGUgKGxlbiA+IDApOworCisJc3VibWl0X2JpbyhydywgJmItPmJpbyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9pbyhzdHJ1Y3QgZG1fYnVmZmVyICpiLCBpbnQgcncsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgICBiaW9fZW5kX2lvX3QgKmVuZF9pbykKK3sKKwlpZiAocncgPT0gV1JJVEUgJiYgYi0+Yy0+d3JpdGVfY2FsbGJhY2spCisJCWItPmMtPndyaXRlX2NhbGxiYWNrKGIpOworCisJaWYgKGItPmMtPmJsb2NrX3NpemUgPD0gRE1fQlVGSU9fSU5MSU5FX1ZFQ1MgKiBQQUdFX1NJWkUgJiYKKwkgICAgYi0+ZGF0YV9tb2RlICE9IERBVEFfTU9ERV9WTUFMTE9DKQorCQl1c2VfaW5saW5lX2JpbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7CisJZWxzZQorCQl1c2VfZG1pbyhiLCBydywgYmxvY2ssIGVuZF9pbyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV3JpdGluZyBkaXJ0eSBidWZmZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoZSBlbmRpbyByb3V0aW5lIGZvciB3cml0ZS4KKyAqCisgKiBTZXQgdGhlIGVycm9yLCBjbGVhciBCX1dSSVRJTkcgYml0IGFuZCB3YWtlIGFueW9uZSB3aG8gd2FzIHdhaXRpbmcgb24KKyAqIGl0LgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGFpbmVyX29mKGJpbywgc3RydWN0IGRtX2J1ZmZlciwgYmlvKTsKKworCWItPndyaXRlX2Vycm9yID0gZXJyb3I7CisJaWYgKGVycm9yKSB7CisJCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCQkodm9pZCljbXB4Y2hnKCZjLT5hc3luY193cml0ZV9lcnJvciwgMCwgZXJyb3IpOworCX0KKworCUJVR19PTighdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKTsKKworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKworCXdha2VfdXBfYml0KCZiLT5zdGF0ZSwgQl9XUklUSU5HKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2FpdF9vbl9iaXQgaXMgYWN0dWFsbHkgd2FpdGluZy4KKyAqLworc3RhdGljIGludCBkb19pb19zY2hlZHVsZSh2b2lkICp3b3JkKQoreworCWlvX3NjaGVkdWxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYXRlIGEgd3JpdGUgb24gYSBkaXJ0eSBidWZmZXIsIGJ1dCBkb24ndCB3YWl0IGZvciBpdC4KKyAqCisgKiAtIElmIHRoZSBidWZmZXIgaXMgbm90IGRpcnR5LCBleGl0LgorICogLSBJZiB0aGVyZSBzb21lIHByZXZpb3VzIHdyaXRlIGdvaW5nIG9uLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggKHdlIGNhbid0CisgKiAgIGhhdmUgdHdvIHdyaXRlcyBvbiB0aGUgc2FtZSBidWZmZXIgc2ltdWx0YW5lb3VzbHkpLgorICogLSBTdWJtaXQgb3VyIHdyaXRlIGFuZCBkb24ndCB3YWl0IG9uIGl0LiBXZSBzZXQgQl9XUklUSU5HIGluZGljYXRpbmcKKyAqICAgdGhhdCB0aGVyZSBpcyBhIHdyaXRlIGluIHByb2dyZXNzLgorICovCitzdGF0aWMgdm9pZCBfX3dyaXRlX2RpcnR5X2J1ZmZlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCWlmICghdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSkKKwkJcmV0dXJuOworCisJY2xlYXJfYml0KEJfRElSVFksICZiLT5zdGF0ZSk7CisJd2FpdF9vbl9iaXRfbG9jaygmYi0+c3RhdGUsIEJfV1JJVElORywKKwkJCSBkb19pb19zY2hlZHVsZSwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJc3VibWl0X2lvKGIsIFdSSVRFLCBiLT5ibG9jaywgd3JpdGVfZW5kaW8pOworfQorCisvKgorICogV2FpdCB1bnRpbCBhbnkgYWN0aXZpdHkgb24gdGhlIGJ1ZmZlciBmaW5pc2hlcy4gIFBvc3NpYmx5IHdyaXRlIHRoZQorICogYnVmZmVyIGlmIGl0IGlzIGRpcnR5LiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGZpbmlzaGVzLCB0aGVyZSBpcyBubyBJL08KKyAqIHJ1bm5pbmcgb24gdGhlIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBpcyBub3QgZGlydHkuCisgKi8KK3N0YXRpYyB2b2lkIF9fbWFrZV9idWZmZXJfY2xlYW4oc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlCVUdfT04oYi0+aG9sZF9jb3VudCk7CisKKwlpZiAoIWItPnN0YXRlKQkvKiBmYXN0IGNhc2UgKi8KKwkJcmV0dXJuOworCisJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1JFQURJTkcsIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJX193cml0ZV9kaXJ0eV9idWZmZXIoYik7CisJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CisKKy8qCisgKiBGaW5kIHNvbWUgYnVmZmVyIHRoYXQgaXMgbm90IGhlbGQgYnkgYW55Ym9keSwgY2xlYW4gaXQsIHVubGluayBpdCBhbmQKKyAqIHJldHVybiBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fZ2V0X3VuY2xhaW1lZF9idWZmZXIoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGIsICZjLT5scnVbTElTVF9DTEVBTl0sIGxydV9saXN0KSB7CisJCUJVR19PTih0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpOworCQlCVUdfT04odGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSk7CisKKwkJaWYgKCFiLT5ob2xkX2NvdW50KSB7CisJCQlfX21ha2VfYnVmZmVyX2NsZWFuKGIpOworCQkJX191bmxpbmtfYnVmZmVyKGIpOworCQkJcmV0dXJuIGI7CisJCX0KKwkJZG1fYnVmaW9fY29uZF9yZXNjaGVkKCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGIsICZjLT5scnVbTElTVF9ESVJUWV0sIGxydV9saXN0KSB7CisJCUJVR19PTih0ZXN0X2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSkpOworCisJCWlmICghYi0+aG9sZF9jb3VudCkgeworCQkJX19tYWtlX2J1ZmZlcl9jbGVhbihiKTsKKwkJCV9fdW5saW5rX2J1ZmZlcihiKTsKKwkJCXJldHVybiBiOworCQl9CisJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogV2FpdCB1bnRpbCBzb21lIG90aGVyIHRocmVhZHMgZnJlZSBzb21lIGJ1ZmZlciBvciByZWxlYXNlIGhvbGQgY291bnQgb24KKyAqIHNvbWUgYnVmZmVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCB3aXRoIGMtPmxvY2sgaGVsZCwgZHJvcHMgaXQgYW5kIHJlZ2FpbnMgaXQKKyAqIGJlZm9yZSBleGl0aW5nLgorICovCitzdGF0aWMgdm9pZCBfX3dhaXRfZm9yX2ZyZWVfYnVmZmVyKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmYy0+ZnJlZV9idWZmZXJfd2FpdCwgJndhaXQpOworCXNldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlkbV9idWZpb191bmxvY2soYyk7CisKKwlpb19zY2hlZHVsZSgpOworCisJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYy0+ZnJlZV9idWZmZXJfd2FpdCwgJndhaXQpOworCisJZG1fYnVmaW9fbG9jayhjKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4gSWYgdGhlIGFsbG9jYXRpb24gaXMgbm90IHBvc3NpYmxlLCB3YWl0IHVudGlsCisgKiBzb21lIG90aGVyIHRocmVhZCBmcmVlcyBhIGJ1ZmZlci4KKyAqCisgKiBNYXkgZHJvcCB0aGUgbG9jayBhbmQgcmVnYWluIGl0LgorICovCitzdGF0aWMgc3RydWN0IGRtX2J1ZmZlciAqX19hbGxvY19idWZmZXJfd2FpdF9ub19jYWxsYmFjayhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXN0cnVjdCBkbV9idWZmZXIgKmI7CisKKwkvKgorCSAqIGRtLWJ1ZmlvIGlzIHJlc2lzdGFudCB0byBhbGxvY2F0aW9uIGZhaWx1cmVzIChpdCBqdXN0IGtlZXBzCisJICogb25lIGJ1ZmZlciByZXNlcnZlZCBpbiBjYXNlcyBhbGwgdGhlIGFsbG9jYXRpb25zIGZhaWwpLgorCSAqIFNvIHNldCBmbGFncyB0byBub3QgdHJ5IHRvbyBoYXJkOgorCSAqCUdGUF9OT0lPOiBkb24ndCByZWN1cnNlIGludG8gdGhlIEkvTyBsYXllcgorCSAqCV9fR0ZQX05PUkVUUlk6IGRvbid0IHJldHJ5IGFuZCByYXRoZXIgcmV0dXJuIGZhaWx1cmUKKwkgKglfX0dGUF9OT01FTUFMTE9DOiBkb24ndCB1c2UgZW1lcmdlbmN5IHJlc2VydmVzCisJICoJX19HRlBfTk9XQVJOOiBkb24ndCBwcmludCBhIHdhcm5pbmcgaW4gY2FzZSBvZiBmYWlsdXJlCisJICoKKwkgKiBGb3IgZGVidWdnaW5nLCBpZiB3ZSBzZXQgdGhlIGNhY2hlIHNpemUgdG8gMSwgbm8gbmV3IGJ1ZmZlcnMgd2lsbAorCSAqIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoZG1fYnVmaW9fY2FjaGVfc2l6ZV9sYXRjaCAhPSAxKSB7CisJCQliID0gYWxsb2NfYnVmZmVyKGMsIEdGUF9OT0lPIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PTUVNQUxMT0MgfCBfX0dGUF9OT1dBUk4pOworCQkJaWYgKGIpCisJCQkJcmV0dXJuIGI7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCQliID0gbGlzdF9lbnRyeShjLT5yZXNlcnZlZF9idWZmZXJzLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBkbV9idWZmZXIsIGxydV9saXN0KTsKKwkJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCQljLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMrKzsKKworCQkJcmV0dXJuIGI7CisJCX0KKworCQliID0gX19nZXRfdW5jbGFpbWVkX2J1ZmZlcihjKTsKKwkJaWYgKGIpCisJCQlyZXR1cm4gYjsKKworCQlfX3dhaXRfZm9yX2ZyZWVfYnVmZmVyKGMpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fYWxsb2NfYnVmZmVyX3dhaXQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gX19hbGxvY19idWZmZXJfd2FpdF9ub19jYWxsYmFjayhjKTsKKworCWlmIChjLT5hbGxvY19jYWxsYmFjaykKKwkJYy0+YWxsb2NfY2FsbGJhY2soYik7CisKKwlyZXR1cm4gYjsKK30KKworLyoKKyAqIEZyZWUgYSBidWZmZXIgYW5kIHdha2Ugb3RoZXIgdGhyZWFkcyB3YWl0aW5nIGZvciBmcmVlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZnJlZV9idWZmZXJfd2FrZShzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJaWYgKCFjLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMpCisJCWZyZWVfYnVmZmVyKGIpOworCWVsc2UgeworCQlsaXN0X2FkZCgmYi0+bHJ1X2xpc3QsICZjLT5yZXNlcnZlZF9idWZmZXJzKTsKKwkJYy0+bmVlZF9yZXNlcnZlZF9idWZmZXJzLS07CisJfQorCisJd2FrZV91cCgmYy0+ZnJlZV9idWZmZXJfd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBpbnQgbm9fd2FpdCkKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoYiwgdG1wLCAmYy0+bHJ1W0xJU1RfRElSVFldLCBscnVfbGlzdCkgeworCQlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCQlpZiAoIXRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpIHsKKwkJCV9fcmVsaW5rX2xydShiLCBMSVNUX0NMRUFOKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG5vX3dhaXQgJiYgdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKQorCQkJcmV0dXJuOworCisJCV9fd3JpdGVfZGlydHlfYnVmZmVyKGIpOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKKy8qCisgKiBHZXQgd3JpdGViYWNrIHRocmVzaG9sZCBhbmQgYnVmZmVyIGxpbWl0IGZvciBhIGdpdmVuIGNsaWVudC4KKyAqLworc3RhdGljIHZvaWQgX19nZXRfbWVtb3J5X2xpbWl0KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqdGhyZXNob2xkX2J1ZmZlcnMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbGltaXRfYnVmZmVycykKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnM7CisKKwlpZiAoZG1fYnVmaW9fY2FjaGVfc2l6ZSAhPSBkbV9idWZpb19jYWNoZV9zaXplX2xhdGNoKSB7CisJCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisJCV9fY2FjaGVfc2l6ZV9yZWZyZXNoKCk7CisJCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwl9CisKKwlidWZmZXJzID0gZG1fYnVmaW9fY2FjaGVfc2l6ZV9wZXJfY2xpZW50ID4+CisJCSAgKGMtPnNlY3RvcnNfcGVyX2Jsb2NrX2JpdHMgKyBTRUNUT1JfU0hJRlQpOworCisJaWYgKGJ1ZmZlcnMgPCBETV9CVUZJT19NSU5fQlVGRkVSUykKKwkJYnVmZmVycyA9IERNX0JVRklPX01JTl9CVUZGRVJTOworCisJKmxpbWl0X2J1ZmZlcnMgPSBidWZmZXJzOworCSp0aHJlc2hvbGRfYnVmZmVycyA9IGJ1ZmZlcnMgKiBETV9CVUZJT19XUklURUJBQ0tfUEVSQ0VOVCAvIDEwMDsKK30KKworLyoKKyAqIENoZWNrIGlmIHdlJ3JlIG92ZXIgd2F0ZXJtYXJrLgorICogSWYgd2UgYXJlIG92ZXIgdGhyZXNob2xkX2J1ZmZlcnMsIHN0YXJ0IGZyZWVpbmcgYnVmZmVycy4KKyAqIElmIHdlJ3JlIG92ZXIgImxpbWl0X2J1ZmZlcnMiLCBibG9jayB1bnRpbCB3ZSBnZXQgdW5kZXIgdGhlIGxpbWl0LgorICovCitzdGF0aWMgdm9pZCBfX2NoZWNrX3dhdGVybWFyayhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXVuc2lnbmVkIGxvbmcgdGhyZXNob2xkX2J1ZmZlcnMsIGxpbWl0X2J1ZmZlcnM7CisKKwlfX2dldF9tZW1vcnlfbGltaXQoYywgJnRocmVzaG9sZF9idWZmZXJzLCAmbGltaXRfYnVmZmVycyk7CisKKwl3aGlsZSAoYy0+bl9idWZmZXJzW0xJU1RfQ0xFQU5dICsgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldID4KKwkgICAgICAgbGltaXRfYnVmZmVycykgeworCisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBfX2dldF91bmNsYWltZWRfYnVmZmVyKGMpOworCisJCWlmICghYikKKwkJCXJldHVybjsKKworCQlfX2ZyZWVfYnVmZmVyX3dha2UoYik7CisJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCX0KKworCWlmIChjLT5uX2J1ZmZlcnNbTElTVF9ESVJUWV0gPiB0aHJlc2hvbGRfYnVmZmVycykKKwkJX193cml0ZV9kaXJ0eV9idWZmZXJzX2FzeW5jKGMsIDEpOworfQorCisvKgorICogRmluZCBhIGJ1ZmZlciBpbiB0aGUgaGFzaC4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKl9fZmluZChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiOworCXN0cnVjdCBobGlzdF9ub2RlICpobjsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsIGhuLCAmYy0+Y2FjaGVfaGFzaFtETV9CVUZJT19IQVNIKGJsb2NrKV0sCisJCQkgICAgIGhhc2hfbGlzdCkgeworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwkJaWYgKGItPmJsb2NrID09IGJsb2NrKQorCQkJcmV0dXJuIGI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogR2V0dGluZyBhIGJ1ZmZlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2VudW0gbmV3X2ZsYWcgeworCU5GX0ZSRVNIID0gMCwKKwlORl9SRUFEID0gMSwKKwlORl9HRVQgPSAyCit9OworCitzdGF0aWMgc3RydWN0IGRtX2J1ZmZlciAqX19idWZpb19uZXcoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCQkJICAgICBlbnVtIG5ld19mbGFnIG5mLCBzdHJ1Y3QgZG1fYnVmZmVyICoqYnAsCisJCQkJICAgICBpbnQgKm5lZWRfc3VibWl0KQoreworCXN0cnVjdCBkbV9idWZmZXIgKmIsICpuZXdfYiA9IE5VTEw7CisKKwkqbmVlZF9zdWJtaXQgPSAwOworCisJYiA9IF9fZmluZChjLCBibG9jayk7CisJaWYgKGIpIHsKKwkJYi0+aG9sZF9jb3VudCsrOworCQlfX3JlbGlua19scnUoYiwgdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSB8fAorCQkJICAgICB0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpOworCQlyZXR1cm4gYjsKKwl9CisKKwlpZiAobmYgPT0gTkZfR0VUKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld19iID0gX19hbGxvY19idWZmZXJfd2FpdChjKTsKKworCS8qCisJICogV2UndmUgaGFkIGEgcGVyaW9kIHdoZXJlIHRoZSBtdXRleCB3YXMgdW5sb2NrZWQsIHNvIG5lZWQgdG8KKwkgKiByZWNoZWNrIHRoZSBoYXNoIHRhYmxlLgorCSAqLworCWIgPSBfX2ZpbmQoYywgYmxvY2spOworCWlmIChiKSB7CisJCV9fZnJlZV9idWZmZXJfd2FrZShuZXdfYik7CisJCWItPmhvbGRfY291bnQrKzsKKwkJX19yZWxpbmtfbHJ1KGIsIHRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgfHwKKwkJCSAgICAgdGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKTsKKwkJcmV0dXJuIGI7CisJfQorCisJX19jaGVja193YXRlcm1hcmsoYyk7CisKKwliID0gbmV3X2I7CisJYi0+aG9sZF9jb3VudCA9IDE7CisJYi0+cmVhZF9lcnJvciA9IDA7CisJYi0+d3JpdGVfZXJyb3IgPSAwOworCV9fbGlua19idWZmZXIoYiwgYmxvY2ssIExJU1RfQ0xFQU4pOworCisJaWYgKG5mID09IE5GX0ZSRVNIKSB7CisJCWItPnN0YXRlID0gMDsKKwkJcmV0dXJuIGI7CisJfQorCisJYi0+c3RhdGUgPSAxIDw8IEJfUkVBRElORzsKKwkqbmVlZF9zdWJtaXQgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKy8qCisgKiBUaGUgZW5kaW8gcm91dGluZSBmb3IgcmVhZGluZzogc2V0IHRoZSBlcnJvciwgY2xlYXIgdGhlIGJpdCBhbmQgd2FrZSB1cAorICogYW55b25lIHdhaXRpbmcgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgcmVhZF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiID0gY29udGFpbmVyX29mKGJpbywgc3RydWN0IGRtX2J1ZmZlciwgYmlvKTsKKworCWItPnJlYWRfZXJyb3IgPSBlcnJvcjsKKworCUJVR19PTighdGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKworCXdha2VfdXBfYml0KCZiLT5zdGF0ZSwgQl9SRUFESU5HKTsKK30KKworLyoKKyAqIEEgY29tbW9uIHJvdXRpbmUgZm9yIGRtX2J1ZmlvX25ldyBhbmQgZG1fYnVmaW9fcmVhZC4gIE9wZXJhdGlvbiBvZiB0aGVzZQorICogZnVuY3Rpb25zIGlzIHNpbWlsYXIgZXhjZXB0IHRoYXQgZG1fYnVmaW9fbmV3IGRvZXNuJ3QgcmVhZCB0aGUKKyAqIGJ1ZmZlciBmcm9tIHRoZSBkaXNrIChhc3N1bWluZyB0aGF0IHRoZSBjYWxsZXIgb3ZlcndyaXRlcyBhbGwgdGhlIGRhdGEKKyAqIGFuZCB1c2VzIGRtX2J1ZmlvX21hcmtfYnVmZmVyX2RpcnR5IHRvIHdyaXRlIG5ldyBkYXRhIGJhY2spLgorICovCitzdGF0aWMgdm9pZCAqbmV3X3JlYWQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgIGVudW0gbmV3X2ZsYWcgbmYsIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlpbnQgbmVlZF9zdWJtaXQ7CisJc3RydWN0IGRtX2J1ZmZlciAqYjsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisJYiA9IF9fYnVmaW9fbmV3KGMsIGJsb2NrLCBuZiwgYnAsICZuZWVkX3N1Ym1pdCk7CisJZG1fYnVmaW9fdW5sb2NrKGMpOworCisJaWYgKCFiIHx8IElTX0VSUihiKSkKKwkJcmV0dXJuIGI7CisKKwlpZiAobmVlZF9zdWJtaXQpCisJCXN1Ym1pdF9pbyhiLCBSRUFELCBiLT5ibG9jaywgcmVhZF9lbmRpbyk7CisKKwl3YWl0X29uX2JpdCgmYi0+c3RhdGUsIEJfUkVBRElORywgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworCWlmIChiLT5yZWFkX2Vycm9yKSB7CisJCWludCBlcnJvciA9IGItPnJlYWRfZXJyb3I7CisKKwkJZG1fYnVmaW9fcmVsZWFzZShiKTsKKworCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJfQorCisJKmJwID0gYjsKKworCXJldHVybiBiLT5kYXRhOworfQorCit2b2lkICpkbV9idWZpb19nZXQoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgc2VjdG9yX3QgYmxvY2ssCisJCSAgIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlyZXR1cm4gbmV3X3JlYWQoYywgYmxvY2ssIE5GX0dFVCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0KTsKKwordm9pZCAqZG1fYnVmaW9fcmVhZChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgIHN0cnVjdCBkbV9idWZmZXIgKipicCkKK3sKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCXJldHVybiBuZXdfcmVhZChjLCBibG9jaywgTkZfUkVBRCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fcmVhZCk7CisKK3ZvaWQgKmRtX2J1ZmlvX25ldyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKQoreworCUJVR19PTihkbV9idWZpb19pbl9yZXF1ZXN0KCkpOworCisJcmV0dXJuIG5ld19yZWFkKGMsIGJsb2NrLCBORl9GUkVTSCwgYnApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fbmV3KTsKKwordm9pZCBkbV9idWZpb19yZWxlYXNlKHN0cnVjdCBkbV9idWZmZXIgKmIpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9IGItPmM7CisKKwlkbV9idWZpb19sb2NrKGMpOworCisJQlVHX09OKHRlc3RfYml0KEJfUkVBRElORywgJmItPnN0YXRlKSk7CisJQlVHX09OKCFiLT5ob2xkX2NvdW50KTsKKworCWItPmhvbGRfY291bnQtLTsKKwlpZiAoIWItPmhvbGRfY291bnQpIHsKKwkJd2FrZV91cCgmYy0+ZnJlZV9idWZmZXJfd2FpdCk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgd2VyZSBlcnJvcnMgb24gdGhlIGJ1ZmZlciwgYW5kIHRoZSBidWZmZXIgaXMgbm90CisJCSAqIHRvIGJlIHdyaXR0ZW4sIGZyZWUgdGhlIGJ1ZmZlci4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gY2FjaGluZworCQkgKiBpbnZhbGlkIGJ1ZmZlci4KKwkJICovCisJCWlmICgoYi0+cmVhZF9lcnJvciB8fCBiLT53cml0ZV9lcnJvcikgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpKSB7CisJCQlfX3VubGlua19idWZmZXIoYik7CisJCQlfX2ZyZWVfYnVmZmVyX3dha2UoYik7CisJCX0KKwl9CisKKwlkbV9idWZpb191bmxvY2soYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19yZWxlYXNlKTsKKwordm9pZCBkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMgPSBiLT5jOworCisJZG1fYnVmaW9fbG9jayhjKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpKQorCQlfX3JlbGlua19scnUoYiwgTElTVF9ESVJUWSk7CisKKwlkbV9idWZpb191bmxvY2soYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSk7CisKK3ZvaWQgZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCUJVR19PTihkbV9idWZpb19pbl9yZXF1ZXN0KCkpOworCisJZG1fYnVmaW9fbG9jayhjKTsKKwlfX3dyaXRlX2RpcnR5X2J1ZmZlcnNfYXN5bmMoYywgMCk7CisJZG1fYnVmaW9fdW5sb2NrKGMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyk7CisKKy8qCisgKiBGb3IgcGVyZm9ybWFuY2UsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBidWZmZXJzIGFyZSB3cml0dGVuIGFzeW5jaHJvbm91c2x5CisgKiBhbmQgc2ltdWx0YW5lb3VzbHkgKHNvIHRoYXQgdGhlIGJsb2NrIGxheWVyIGNhbiBtZXJnZSB0aGUgd3JpdGVzKSBhbmQgdGhlbgorICogd2FpdGVkIHVwb24uCisgKgorICogRmluYWxseSwgd2UgZmx1c2ggaGFyZHdhcmUgZGlzayBjYWNoZS4KKyAqLworaW50IGRtX2J1ZmlvX3dyaXRlX2RpcnR5X2J1ZmZlcnMoc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlpbnQgYSwgZjsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnNfcHJvY2Vzc2VkID0gMDsKKwlzdHJ1Y3QgZG1fYnVmZmVyICpiLCAqdG1wOworCisJZG1fYnVmaW9fbG9jayhjKTsKKwlfX3dyaXRlX2RpcnR5X2J1ZmZlcnNfYXN5bmMoYywgMCk7CisKK2FnYWluOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGIsIHRtcCwgJmMtPmxydVtMSVNUX0RJUlRZXSwgbHJ1X2xpc3QpIHsKKwkJaW50IGRyb3BwZWRfbG9jayA9IDA7CisKKwkJaWYgKGJ1ZmZlcnNfcHJvY2Vzc2VkIDwgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldKQorCQkJYnVmZmVyc19wcm9jZXNzZWQrKzsKKworCQlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCQlpZiAodGVzdF9iaXQoQl9XUklUSU5HLCAmYi0+c3RhdGUpKSB7CisJCQlpZiAoYnVmZmVyc19wcm9jZXNzZWQgPCBjLT5uX2J1ZmZlcnNbTElTVF9ESVJUWV0pIHsKKwkJCQlkcm9wcGVkX2xvY2sgPSAxOworCQkJCWItPmhvbGRfY291bnQrKzsKKwkJCQlkbV9idWZpb191bmxvY2soYyk7CisJCQkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkJCSAgICBkb19pb19zY2hlZHVsZSwKKwkJCQkJICAgIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlkbV9idWZpb19sb2NrKGMpOworCQkJCWItPmhvbGRfY291bnQtLTsKKwkJCX0gZWxzZQorCQkJCXdhaXRfb25fYml0KCZiLT5zdGF0ZSwgQl9XUklUSU5HLAorCQkJCQkgICAgZG9faW9fc2NoZWR1bGUsCisJCQkJCSAgICBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKworCQlpZiAoIXRlc3RfYml0KEJfRElSVFksICZiLT5zdGF0ZSkgJiYKKwkJICAgICF0ZXN0X2JpdChCX1dSSVRJTkcsICZiLT5zdGF0ZSkpCisJCQlfX3JlbGlua19scnUoYiwgTElTVF9DTEVBTik7CisKKwkJZG1fYnVmaW9fY29uZF9yZXNjaGVkKCk7CisKKwkJLyoKKwkJICogSWYgd2UgZHJvcHBlZCB0aGUgbG9jaywgdGhlIGxpc3QgaXMgbm8gbG9uZ2VyIGNvbnNpc3RlbnQsCisJCSAqIHNvIHdlIG11c3QgcmVzdGFydCB0aGUgc2VhcmNoLgorCQkgKgorCQkgKiBJbiB0aGUgbW9zdCBjb21tb24gY2FzZSwgdGhlIGJ1ZmZlciBqdXN0IHByb2Nlc3NlZCBpcworCQkgKiByZWxpbmtlZCB0byB0aGUgY2xlYW4gbGlzdCwgc28gd2Ugd29uJ3QgbG9vcCBzY2FubmluZyB0aGUKKwkJICogc2FtZSBidWZmZXIgYWdhaW4gYW5kIGFnYWluLgorCQkgKgorCQkgKiBUaGlzIG1heSBsaXZlbG9jayBpZiB0aGVyZSBpcyBhbm90aGVyIHRocmVhZCBzaW11bHRhbmVvdXNseQorCQkgKiBkaXJ0eWluZyBidWZmZXJzLCBzbyB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgd2Fsa2VkCisJCSAqIGFuZCBpZiBpdCBleGNlZWRzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycywgaXQgbWVhbnMgdGhhdAorCQkgKiBzb21lb25lIGlzIGRvaW5nIHNvbWUgd3JpdGVzIHNpbXVsdGFuZW91c2x5IHdpdGggdXMuICBJbgorCQkgKiB0aGlzIGNhc2UsIHN0b3AsIGRyb3BwaW5nIHRoZSBsb2NrLgorCQkgKi8KKwkJaWYgKGRyb3BwZWRfbG9jaykKKwkJCWdvdG8gYWdhaW47CisJfQorCXdha2VfdXAoJmMtPmZyZWVfYnVmZmVyX3dhaXQpOworCWRtX2J1ZmlvX3VubG9jayhjKTsKKworCWEgPSB4Y2hnKCZjLT5hc3luY193cml0ZV9lcnJvciwgMCk7CisJZiA9IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKGMpOworCWlmIChhKQorCQlyZXR1cm4gYTsKKworCXJldHVybiBmOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyk7CisKKy8qCisgKiBVc2UgZG0taW8gdG8gc2VuZCBhbmQgZW1wdHkgYmFycmllciBmbHVzaCB0aGUgZGV2aWNlLgorICovCitpbnQgZG1fYnVmaW9faXNzdWVfZmx1c2goc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgZG1faW9fcmVxdWVzdCBpb19yZXEgPSB7CisJCS5iaV9ydyA9IFJFUV9GTFVTSCwKKwkJLm1lbS50eXBlID0gRE1fSU9fS01FTSwKKwkJLm1lbS5wdHIuYWRkciA9IE5VTEwsCisJCS5jbGllbnQgPSBjLT5kbV9pbywKKwl9OworCXN0cnVjdCBkbV9pb19yZWdpb24gaW9fcmVnID0geworCQkuYmRldiA9IGMtPmJkZXYsCisJCS5zZWN0b3IgPSAwLAorCQkuY291bnQgPSAwLAorCX07CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCXJldHVybiBkbV9pbygmaW9fcmVxLCAxLCAmaW9fcmVnLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKTsKKworLyoKKyAqIFdlIGZpcnN0IGRlbGV0ZSBhbnkgb3RoZXIgYnVmZmVyIHRoYXQgbWF5IGJlIGF0IHRoYXQgbmV3IGxvY2F0aW9uLgorICoKKyAqIFRoZW4sIHdlIHdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG9yaWdpbmFsIGxvY2F0aW9uIGlmIGl0IHdhcyBkaXJ0eS4KKyAqCisgKiBUaGVuLCBpZiB3ZSBhcmUgdGhlIG9ubHkgb25lIHdobyBpcyBob2xkaW5nIHRoZSBidWZmZXIsIHJlbGluayB0aGUgYnVmZmVyCisgKiBpbiB0aGUgaGFzaCBxdWV1ZSBmb3IgdGhlIG5ldyBsb2NhdGlvbi4KKyAqCisgKiBJZiB0aGVyZSB3YXMgc29tZW9uZSBlbHNlIGhvbGRpbmcgdGhlIGJ1ZmZlciwgd2Ugd3JpdGUgaXQgdG8gdGhlIG5ldworICogbG9jYXRpb24gYnV0IG5vdCByZWxpbmsgaXQsIGJlY2F1c2UgdGhhdCBvdGhlciB1c2VyIG5lZWRzIHRvIGhhdmUgdGhlIGJ1ZmZlcgorICogYXQgdGhlIHNhbWUgcGxhY2UuCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZV9tb3ZlKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IG5ld19ibG9jaykKK3sKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjID0gYi0+YzsKKwlzdHJ1Y3QgZG1fYnVmZmVyICpuZXc7CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisKK3JldHJ5OgorCW5ldyA9IF9fZmluZChjLCBuZXdfYmxvY2spOworCWlmIChuZXcpIHsKKwkJaWYgKG5ldy0+aG9sZF9jb3VudCkgeworCQkJX193YWl0X2Zvcl9mcmVlX2J1ZmZlcihjKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQkvKgorCQkgKiBGSVhNRTogSXMgdGhlcmUgYW55IHBvaW50IHdhaXRpbmcgZm9yIGEgd3JpdGUgdGhhdCdzIGdvaW5nCisJCSAqIHRvIGJlIG92ZXJ3cml0dGVuIGluIGEgYml0PworCQkgKi8KKwkJX19tYWtlX2J1ZmZlcl9jbGVhbihuZXcpOworCQlfX3VubGlua19idWZmZXIobmV3KTsKKwkJX19mcmVlX2J1ZmZlcl93YWtlKG5ldyk7CisJfQorCisJQlVHX09OKCFiLT5ob2xkX2NvdW50KTsKKwlCVUdfT04odGVzdF9iaXQoQl9SRUFESU5HLCAmYi0+c3RhdGUpKTsKKworCV9fd3JpdGVfZGlydHlfYnVmZmVyKGIpOworCWlmIChiLT5ob2xkX2NvdW50ID09IDEpIHsKKwkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkgICAgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2V0X2JpdChCX0RJUlRZLCAmYi0+c3RhdGUpOworCQlfX3VubGlua19idWZmZXIoYik7CisJCV9fbGlua19idWZmZXIoYiwgbmV3X2Jsb2NrLCBMSVNUX0RJUlRZKTsKKwl9IGVsc2UgeworCQlzZWN0b3JfdCBvbGRfYmxvY2s7CisJCXdhaXRfb25fYml0X2xvY2soJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkJIGRvX2lvX3NjaGVkdWxlLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCS8qCisJCSAqIFJlbGluayBidWZmZXIgdG8gIm5ld19ibG9jayIgc28gdGhhdCB3cml0ZV9jYWxsYmFjaworCQkgKiBzZWVzICJuZXdfYmxvY2siIGFzIGEgYmxvY2sgbnVtYmVyLgorCQkgKiBBZnRlciB0aGUgd3JpdGUsIGxpbmsgdGhlIGJ1ZmZlciBiYWNrIHRvIG9sZF9ibG9jay4KKwkJICogQWxsIHRoaXMgbXVzdCBiZSBkb25lIGluIGJ1ZmlvIGxvY2ssIHNvIHRoYXQgYmxvY2sgbnVtYmVyCisJCSAqIGNoYW5nZSBpc24ndCB2aXNpYmxlIHRvIG90aGVyIHRocmVhZHMuCisJCSAqLworCQlvbGRfYmxvY2sgPSBiLT5ibG9jazsKKwkJX191bmxpbmtfYnVmZmVyKGIpOworCQlfX2xpbmtfYnVmZmVyKGIsIG5ld19ibG9jaywgYi0+bGlzdF9tb2RlKTsKKwkJc3VibWl0X2lvKGIsIFdSSVRFLCBuZXdfYmxvY2ssIHdyaXRlX2VuZGlvKTsKKwkJd2FpdF9vbl9iaXQoJmItPnN0YXRlLCBCX1dSSVRJTkcsCisJCQkgICAgZG9faW9fc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJX191bmxpbmtfYnVmZmVyKGIpOworCQlfX2xpbmtfYnVmZmVyKGIsIG9sZF9ibG9jaywgYi0+bGlzdF9tb2RlKTsKKwl9CisKKwlkbV9idWZpb191bmxvY2soYyk7CisJZG1fYnVmaW9fcmVsZWFzZShiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX3JlbGVhc2VfbW92ZSk7CisKK3Vuc2lnbmVkIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJcmV0dXJuIGMtPmJsb2NrX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19nZXRfYmxvY2tfc2l6ZSk7CisKK3NlY3Rvcl90IGRtX2J1ZmlvX2dldF9kZXZpY2Vfc2l6ZShzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXJldHVybiBpX3NpemVfcmVhZChjLT5iZGV2LT5iZF9pbm9kZSkgPj4KKwkJCSAgIChTRUNUT1JfU0hJRlQgKyBjLT5zZWN0b3JzX3Blcl9ibG9ja19iaXRzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2dldF9kZXZpY2Vfc2l6ZSk7CisKK3NlY3Rvcl90IGRtX2J1ZmlvX2dldF9ibG9ja19udW1iZXIoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlyZXR1cm4gYi0+YmxvY2s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19nZXRfYmxvY2tfbnVtYmVyKTsKKwordm9pZCAqZG1fYnVmaW9fZ2V0X2Jsb2NrX2RhdGEoc3RydWN0IGRtX2J1ZmZlciAqYikKK3sKKwlyZXR1cm4gYi0+ZGF0YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2dldF9ibG9ja19kYXRhKTsKKwordm9pZCAqZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpCit7CisJcmV0dXJuIGIgKyAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKTsKKworc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqZG1fYnVmaW9fZ2V0X2NsaWVudChzdHJ1Y3QgZG1fYnVmZmVyICpiKQoreworCXJldHVybiBiLT5jOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYnVmaW9fZ2V0X2NsaWVudCk7CisKK3N0YXRpYyB2b2lkIGRyb3BfYnVmZmVycyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjKQoreworCXN0cnVjdCBkbV9idWZmZXIgKmI7CisJaW50IGk7CisKKwlCVUdfT04oZG1fYnVmaW9faW5fcmVxdWVzdCgpKTsKKworCS8qCisJICogQW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgdGhlIGJ1ZmZlcnMgYXJlIG5vdCB3cml0dGVuIG9uZS1ieS1vbmUuCisJICovCisJZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVyc19hc3luYyhjKTsKKworCWRtX2J1ZmlvX2xvY2soYyk7CisKKwl3aGlsZSAoKGIgPSBfX2dldF91bmNsYWltZWRfYnVmZmVyKGMpKSkKKwkJX19mcmVlX2J1ZmZlcl93YWtlKGIpOworCisJZm9yIChpID0gMDsgaSA8IExJU1RfU0laRTsgaSsrKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZjLT5scnVbaV0sIGxydV9saXN0KQorCQkJRE1FUlIoImxlYWtlZCBidWZmZXIgJWxseCwgaG9sZCBjb3VudCAldSwgbGlzdCAlZCIsCisJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWItPmJsb2NrLCBiLT5ob2xkX2NvdW50LCBpKTsKKworCWZvciAoaSA9IDA7IGkgPCBMSVNUX1NJWkU7IGkrKykKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZjLT5scnVbaV0pKTsKKworCWRtX2J1ZmlvX3VubG9jayhjKTsKK30KKworLyoKKyAqIFRlc3QgaWYgdGhlIGJ1ZmZlciBpcyB1bnVzZWQgYW5kIHRvbyBvbGQsIGFuZCBjb21taXQgaXQuCisgKiBBdCBpZiBub2lvIGlzIHNldCwgd2UgbXVzdCBub3QgZG8gYW55IEkvTyBiZWNhdXNlIHdlIGhvbGQKKyAqIGRtX2J1ZmlvX2NsaWVudHNfbG9jayBhbmQgd2Ugd291bGQgcmlzayBkZWFkbG9jayBpZiB0aGUgSS9PIGdldHMgcmVyb3V0ZWQgdG8KKyAqIGRpZmZlcmVudCBidWZpbyBjbGllbnQuCisgKi8KK3N0YXRpYyBpbnQgX19jbGVhbnVwX29sZF9idWZmZXIoc3RydWN0IGRtX2J1ZmZlciAqYiwgZ2ZwX3QgZ2ZwLAorCQkJCXVuc2lnbmVkIGxvbmcgbWF4X2ppZmZpZXMpCit7CisJaWYgKGppZmZpZXMgLSBiLT5sYXN0X2FjY2Vzc2VkIDwgbWF4X2ppZmZpZXMpCisJCXJldHVybiAxOworCisJaWYgKCEoZ2ZwICYgX19HRlBfSU8pKSB7CisJCWlmICh0ZXN0X2JpdChCX1JFQURJTkcsICZiLT5zdGF0ZSkgfHwKKwkJICAgIHRlc3RfYml0KEJfV1JJVElORywgJmItPnN0YXRlKSB8fAorCQkgICAgdGVzdF9iaXQoQl9ESVJUWSwgJmItPnN0YXRlKSkKKwkJCXJldHVybiAxOworCX0KKworCWlmIChiLT5ob2xkX2NvdW50KQorCQlyZXR1cm4gMTsKKworCV9fbWFrZV9idWZmZXJfY2xlYW4oYik7CisJX191bmxpbmtfYnVmZmVyKGIpOworCV9fZnJlZV9idWZmZXJfd2FrZShiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3NjYW4oc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYywgdW5zaWduZWQgbG9uZyBucl90b19zY2FuLAorCQkgICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQoreworCWludCBsOworCXN0cnVjdCBkbV9idWZmZXIgKmIsICp0bXA7CisKKwlmb3IgKGwgPSAwOyBsIDwgTElTVF9TSVpFOyBsKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoYiwgdG1wLCAmYy0+bHJ1W2xdLCBscnVfbGlzdCkKKwkJCWlmICghX19jbGVhbnVwX29sZF9idWZmZXIoYiwgc2MtPmdmcF9tYXNrLCAwKSAmJgorCQkJICAgICEtLW5yX3RvX3NjYW4pCisJCQkJcmV0dXJuOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hyaW5rKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCit7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYyA9CisJICAgIGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGRtX2J1ZmlvX2NsaWVudCwgc2hyaW5rZXIpOworCXVuc2lnbmVkIGxvbmcgcjsKKwl1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4gPSBzYy0+bnJfdG9fc2NhbjsKKworCWlmIChzYy0+Z2ZwX21hc2sgJiBfX0dGUF9JTykKKwkJZG1fYnVmaW9fbG9jayhjKTsKKwllbHNlIGlmICghZG1fYnVmaW9fdHJ5bG9jayhjKSkKKwkJcmV0dXJuICFucl90b19zY2FuID8gMCA6IC0xOworCisJaWYgKG5yX3RvX3NjYW4pCisJCV9fc2NhbihjLCBucl90b19zY2FuLCBzYyk7CisKKwlyID0gYy0+bl9idWZmZXJzW0xJU1RfQ0xFQU5dICsgYy0+bl9idWZmZXJzW0xJU1RfRElSVFldOworCWlmIChyID4gSU5UX01BWCkKKwkJciA9IElOVF9NQVg7CisKKwlkbV9idWZpb191bmxvY2soYyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgYnVmZmVyaW5nIGludGVyZmFjZQorICovCitzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpkbV9idWZpb19jbGllbnRfY3JlYXRlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGJsb2NrX3NpemUsCisJCQkJCSAgICAgICB1bnNpZ25lZCByZXNlcnZlZF9idWZmZXJzLCB1bnNpZ25lZCBhdXhfc2l6ZSwKKwkJCQkJICAgICAgIHZvaWQgKCphbGxvY19jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKSwKKwkJCQkJICAgICAgIHZvaWQgKCp3cml0ZV9jYWxsYmFjaykoc3RydWN0IGRtX2J1ZmZlciAqKSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjOworCXVuc2lnbmVkIGk7CisKKwlCVUdfT04oYmxvY2tfc2l6ZSA8IDEgPDwgU0VDVE9SX1NISUZUIHx8CisJICAgICAgIChibG9ja19zaXplICYgKGJsb2NrX3NpemUgLSAxKSkpOworCisJYyA9IGttYWxsb2Moc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9jbGllbnQ7CisJfQorCWMtPmNhY2hlX2hhc2ggPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgPDwgRE1fQlVGSU9fSEFTSF9CSVRTKTsKKwlpZiAoIWMtPmNhY2hlX2hhc2gpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gYmFkX2hhc2g7CisJfQorCisJYy0+YmRldiA9IGJkZXY7CisJYy0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CisJYy0+c2VjdG9yc19wZXJfYmxvY2tfYml0cyA9IGZmcyhibG9ja19zaXplKSAtIDEgLSBTRUNUT1JfU0hJRlQ7CisJYy0+cGFnZXNfcGVyX2Jsb2NrX2JpdHMgPSAoZmZzKGJsb2NrX3NpemUpIC0gMSA+PSBQQUdFX1NISUZUKSA/CisJCQkJICBmZnMoYmxvY2tfc2l6ZSkgLSAxIC0gUEFHRV9TSElGVCA6IDA7CisJYy0+YmxvY2tzX3Blcl9wYWdlX2JpdHMgPSAoZmZzKGJsb2NrX3NpemUpIC0gMSA8IFBBR0VfU0hJRlQgPworCQkJCSAgUEFHRV9TSElGVCAtIChmZnMoYmxvY2tfc2l6ZSkgLSAxKSA6IDApOworCisJYy0+YXV4X3NpemUgPSBhdXhfc2l6ZTsKKwljLT5hbGxvY19jYWxsYmFjayA9IGFsbG9jX2NhbGxiYWNrOworCWMtPndyaXRlX2NhbGxiYWNrID0gd3JpdGVfY2FsbGJhY2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgTElTVF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmMtPmxydVtpXSk7CisJCWMtPm5fYnVmZmVyc1tpXSA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDEgPDwgRE1fQlVGSU9fSEFTSF9CSVRTOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRCgmYy0+Y2FjaGVfaGFzaFtpXSk7CisKKwltdXRleF9pbml0KCZjLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+cmVzZXJ2ZWRfYnVmZmVycyk7CisJYy0+bmVlZF9yZXNlcnZlZF9idWZmZXJzID0gcmVzZXJ2ZWRfYnVmZmVyczsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPmZyZWVfYnVmZmVyX3dhaXQpOworCWMtPmFzeW5jX3dyaXRlX2Vycm9yID0gMDsKKworCWMtPmRtX2lvID0gZG1faW9fY2xpZW50X2NyZWF0ZSgpOworCWlmIChJU19FUlIoYy0+ZG1faW8pKSB7CisJCXIgPSBQVFJfRVJSKGMtPmRtX2lvKTsKKwkJZ290byBiYWRfZG1faW87CisJfQorCisJbXV0ZXhfbG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwlpZiAoYy0+YmxvY2tzX3Blcl9wYWdlX2JpdHMpIHsKKwkJaWYgKCFETV9CVUZJT19DQUNIRV9OQU1FKGMpKSB7CisJCQlETV9CVUZJT19DQUNIRV9OQU1FKGMpID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJkbV9idWZpb19jYWNoZS0ldSIsIGMtPmJsb2NrX3NpemUpOworCQkJaWYgKCFETV9CVUZJT19DQUNIRV9OQU1FKGMpKSB7CisJCQkJciA9IC1FTk9NRU07CisJCQkJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCQkJCWdvdG8gYmFkX2NhY2hlOworCQkJfQorCQl9CisKKwkJaWYgKCFETV9CVUZJT19DQUNIRShjKSkgeworCQkJRE1fQlVGSU9fQ0FDSEUoYykgPSBrbWVtX2NhY2hlX2NyZWF0ZShETV9CVUZJT19DQUNIRV9OQU1FKGMpLAorCQkJCQkJCSAgICAgIGMtPmJsb2NrX3NpemUsCisJCQkJCQkJICAgICAgYy0+YmxvY2tfc2l6ZSwgMCwgTlVMTCk7CisJCQlpZiAoIURNX0JVRklPX0NBQ0hFKGMpKSB7CisJCQkJciA9IC1FTk9NRU07CisJCQkJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCQkJCWdvdG8gYmFkX2NhY2hlOworCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCXdoaWxlIChjLT5uZWVkX3Jlc2VydmVkX2J1ZmZlcnMpIHsKKwkJc3RydWN0IGRtX2J1ZmZlciAqYiA9IGFsbG9jX2J1ZmZlcihjLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWIpIHsKKwkJCXIgPSAtRU5PTUVNOworCQkJZ290byBiYWRfYnVmZmVyOworCQl9CisJCV9fZnJlZV9idWZmZXJfd2FrZShiKTsKKwl9CisKKwltdXRleF9sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworCWRtX2J1ZmlvX2NsaWVudF9jb3VudCsrOworCWxpc3RfYWRkKCZjLT5jbGllbnRfbGlzdCwgJmRtX2J1ZmlvX2FsbF9jbGllbnRzKTsKKwlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOworCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCWMtPnNocmlua2VyLnNocmluayA9IHNocmluazsKKwljLT5zaHJpbmtlci5zZWVrcyA9IDE7CisJYy0+c2hyaW5rZXIuYmF0Y2ggPSAwOworCXJlZ2lzdGVyX3Nocmlua2VyKCZjLT5zaHJpbmtlcik7CisKKwlyZXR1cm4gYzsKKworYmFkX2J1ZmZlcjoKK2JhZF9jYWNoZToKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBsaXN0X2VudHJ5KGMtPnJlc2VydmVkX2J1ZmZlcnMubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCWZyZWVfYnVmZmVyKGIpOworCX0KKwlkbV9pb19jbGllbnRfZGVzdHJveShjLT5kbV9pbyk7CitiYWRfZG1faW86CisJdmZyZWUoYy0+Y2FjaGVfaGFzaCk7CitiYWRfaGFzaDoKKwlrZnJlZShjKTsKK2JhZF9jbGllbnQ6CisJcmV0dXJuIEVSUl9QVFIocik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idWZpb19jbGllbnRfY3JlYXRlKTsKKworLyoKKyAqIEZyZWUgdGhlIGJ1ZmZlcmluZyBpbnRlcmZhY2UuCisgKiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIG9uIGFueSBidWZmZXJzLgorICovCit2b2lkIGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgaTsKKworCWRyb3BfYnVmZmVycyhjKTsKKworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmMtPnNocmlua2VyKTsKKworCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKwlsaXN0X2RlbCgmYy0+Y2xpZW50X2xpc3QpOworCWRtX2J1ZmlvX2NsaWVudF9jb3VudC0tOworCV9fY2FjaGVfc2l6ZV9yZWZyZXNoKCk7CisKKwltdXRleF91bmxvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMSA8PCBETV9CVUZJT19IQVNIX0JJVFM7IGkrKykKKwkJQlVHX09OKCFobGlzdF9lbXB0eSgmYy0+Y2FjaGVfaGFzaFtpXSkpOworCisJQlVHX09OKGMtPm5lZWRfcmVzZXJ2ZWRfYnVmZmVycyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnJlc2VydmVkX2J1ZmZlcnMpKSB7CisJCXN0cnVjdCBkbV9idWZmZXIgKmIgPSBsaXN0X2VudHJ5KGMtPnJlc2VydmVkX2J1ZmZlcnMubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCWxpc3RfZGVsKCZiLT5scnVfbGlzdCk7CisJCWZyZWVfYnVmZmVyKGIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBMSVNUX1NJWkU7IGkrKykKKwkJaWYgKGMtPm5fYnVmZmVyc1tpXSkKKwkJCURNRVJSKCJsZWFrZWQgYnVmZmVyIGNvdW50ICVkOiAlbGQiLCBpLCBjLT5uX2J1ZmZlcnNbaV0pOworCisJZm9yIChpID0gMDsgaSA8IExJU1RfU0laRTsgaSsrKQorCQlCVUdfT04oYy0+bl9idWZmZXJzW2ldKTsKKworCWRtX2lvX2NsaWVudF9kZXN0cm95KGMtPmRtX2lvKTsKKwl2ZnJlZShjLT5jYWNoZV9oYXNoKTsKKwlrZnJlZShjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KTsKKworc3RhdGljIHZvaWQgY2xlYW51cF9vbGRfYnVmZmVycyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWF4X2FnZSA9IGRtX2J1ZmlvX21heF9hZ2U7CisJc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqYzsKKworCWJhcnJpZXIoKTsKKworCWlmIChtYXhfYWdlID4gVUxPTkdfTUFYIC8gSFopCisJCW1heF9hZ2UgPSBVTE9OR19NQVggLyBIWjsKKworCW11dGV4X2xvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmZG1fYnVmaW9fYWxsX2NsaWVudHMsIGNsaWVudF9saXN0KSB7CisJCWlmICghZG1fYnVmaW9fdHJ5bG9jayhjKSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+bHJ1W0xJU1RfQ0xFQU5dKSkgeworCQkJc3RydWN0IGRtX2J1ZmZlciAqYjsKKwkJCWIgPSBsaXN0X2VudHJ5KGMtPmxydVtMSVNUX0NMRUFOXS5wcmV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fYnVmZmVyLCBscnVfbGlzdCk7CisJCQlpZiAoX19jbGVhbnVwX29sZF9idWZmZXIoYiwgMCwgbWF4X2FnZSAqIEhaKSkKKwkJCQlicmVhazsKKwkJCWRtX2J1ZmlvX2NvbmRfcmVzY2hlZCgpOworCQl9CisKKwkJZG1fYnVmaW9fdW5sb2NrKGMpOworCQlkbV9idWZpb19jb25kX3Jlc2NoZWQoKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkbV9idWZpb19jbGllbnRzX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRtX2J1ZmlvX3dxOworc3RhdGljIHN0cnVjdCBkZWxheWVkX3dvcmsgZG1fYnVmaW9fd29yazsKKworc3RhdGljIHZvaWQgd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJY2xlYW51cF9vbGRfYnVmZmVycygpOworCisJcXVldWVfZGVsYXllZF93b3JrKGRtX2J1ZmlvX3dxLCAmZG1fYnVmaW9fd29yaywKKwkJCSAgIERNX0JVRklPX1dPUktfVElNRVJfU0VDUyAqIEhaKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNb2R1bGUgc2V0dXAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlIGZvciB0aGUgd2hvbGUgZG1fYnVmaW8gbW9kdWxlLgorICogSXQgaW5pdGlhbGl6ZXMgbWVtb3J5IGxpbWl0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBkbV9idWZpb19pbml0KHZvaWQpCit7CisJX191NjQgbWVtOworCisJbWVtc2V0KCZkbV9idWZpb19jYWNoZXMsIDAsIHNpemVvZiBkbV9idWZpb19jYWNoZXMpOworCW1lbXNldCgmZG1fYnVmaW9fY2FjaGVfbmFtZXMsIDAsIHNpemVvZiBkbV9idWZpb19jYWNoZV9uYW1lcyk7CisKKwltZW0gPSAoX191NjQpKCh0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlcykgKgorCQkgICAgICBETV9CVUZJT19NRU1PUllfUEVSQ0VOVCAvIDEwMCkgPDwgUEFHRV9TSElGVDsKKworCWlmIChtZW0gPiBVTE9OR19NQVgpCisJCW1lbSA9IFVMT05HX01BWDsKKworI2lmZGVmIENPTkZJR19NTVUKKwkvKgorCSAqIEdldCB0aGUgc2l6ZSBvZiB2bWFsbG9jIHNwYWNlIHRoZSBzYW1lIHdheSBhcyBWTUFMTE9DX1RPVEFMCisJICogaW4gZnMvcHJvYy9pbnRlcm5hbC5oCisJICovCisJaWYgKG1lbSA+IChWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpICogRE1fQlVGSU9fVk1BTExPQ19QRVJDRU5UIC8gMTAwKQorCQltZW0gPSAoVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NUQVJUKSAqIERNX0JVRklPX1ZNQUxMT0NfUEVSQ0VOVCAvIDEwMDsKKyNlbmRpZgorCisJZG1fYnVmaW9fZGVmYXVsdF9jYWNoZV9zaXplID0gbWVtOworCisJbXV0ZXhfbG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKwlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOworCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKKworCWRtX2J1ZmlvX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIik7CisJaWYgKCFkbV9idWZpb193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0RFTEFZRURfV09SSygmZG1fYnVmaW9fd29yaywgd29ya19mbik7CisJcXVldWVfZGVsYXllZF93b3JrKGRtX2J1ZmlvX3dxLCAmZG1fYnVmaW9fd29yaywKKwkJCSAgIERNX0JVRklPX1dPUktfVElNRVJfU0VDUyAqIEhaKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgb25jZSB3aGVuIHVubG9hZGluZyB0aGUgZG1fYnVmaW8gbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1fYnVmaW9fZXhpdCh2b2lkKQoreworCWludCBidWcgPSAwOworCWludCBpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkbV9idWZpb193b3JrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShkbV9idWZpb193cSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkbV9idWZpb19jYWNoZXMpOyBpKyspIHsKKwkJc3RydWN0IGttZW1fY2FjaGUgKmtjID0gZG1fYnVmaW9fY2FjaGVzW2ldOworCisJCWlmIChrYykKKwkJCWttZW1fY2FjaGVfZGVzdHJveShrYyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZG1fYnVmaW9fY2FjaGVfbmFtZXMpOyBpKyspCisJCWtmcmVlKGRtX2J1ZmlvX2NhY2hlX25hbWVzW2ldKTsKKworCWlmIChkbV9idWZpb19jbGllbnRfY291bnQpIHsKKwkJRE1DUklUKCIlczogZG1fYnVmaW9fY2xpZW50X2NvdW50IGxlYWtlZDogJWQiLAorCQkJX19mdW5jX18sIGRtX2J1ZmlvX2NsaWVudF9jb3VudCk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkKSB7CisJCURNQ1JJVCgiJXM6IGRtX2J1ZmlvX2N1cnJlbnRfYWxsb2NhdGVkIGxlYWtlZDogJWx1IiwKKwkJCV9fZnVuY19fLCBkbV9idWZpb19jdXJyZW50X2FsbG9jYXRlZCk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcykgeworCQlETUNSSVQoIiVzOiBkbV9idWZpb19hbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXMgbGVha2VkOiAlbHUiLAorCQkgICAgICAgX19mdW5jX18sIGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcyk7CisJCWJ1ZyA9IDE7CisJfQorCisJaWYgKGRtX2J1ZmlvX2FsbG9jYXRlZF92bWFsbG9jKSB7CisJCURNQ1JJVCgiJXM6IGRtX2J1ZmlvX3ZtYWxsb2MgbGVha2VkOiAlbHUiLAorCQkgICAgICAgX19mdW5jX18sIGRtX2J1ZmlvX2FsbG9jYXRlZF92bWFsbG9jKTsKKwkJYnVnID0gMTsKKwl9CisKKwlpZiAoYnVnKQorCQlCVUcoKTsKK30KKworbW9kdWxlX2luaXQoZG1fYnVmaW9faW5pdCkKK21vZHVsZV9leGl0KGRtX2J1ZmlvX2V4aXQpCisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfY2FjaGVfc2l6ZV9ieXRlcywgZG1fYnVmaW9fY2FjaGVfc2l6ZSwgdWxvbmcsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2NhY2hlX3NpemVfYnl0ZXMsICJTaXplIG9mIG1ldGFkYXRhIGNhY2hlIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfYWdlX3NlY29uZHMsIGRtX2J1ZmlvX21heF9hZ2UsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2FnZV9zZWNvbmRzLCAiTWF4IGFnZSBvZiBhIGJ1ZmZlciBpbiBzZWNvbmRzIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChwZWFrX2FsbG9jYXRlZF9ieXRlcywgZG1fYnVmaW9fcGVha19hbGxvY2F0ZWQsIHVsb25nLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHBlYWtfYWxsb2NhdGVkX2J5dGVzLCAiVHJhY2tzIHRoZSBtYXhpbXVtIGFsbG9jYXRlZCBtZW1vcnkiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFsbG9jYXRlZF9rbWVtX2NhY2hlX2J5dGVzLCBkbV9idWZpb19hbGxvY2F0ZWRfa21lbV9jYWNoZSwgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfa21lbV9jYWNoZV9ieXRlcywgIk1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBrbWVtX2NhY2hlX2FsbG9jIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChhbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXNfYnl0ZXMsIGRtX2J1ZmlvX2FsbG9jYXRlZF9nZXRfZnJlZV9wYWdlcywgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfZ2V0X2ZyZWVfcGFnZXNfYnl0ZXMsICJNZW1vcnkgYWxsb2NhdGVkIHdpdGggZ2V0X2ZyZWVfcGFnZXMiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFsbG9jYXRlZF92bWFsbG9jX2J5dGVzLCBkbV9idWZpb19hbGxvY2F0ZWRfdm1hbGxvYywgdWxvbmcsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY2F0ZWRfdm1hbGxvY19ieXRlcywgIk1lbW9yeSBhbGxvY2F0ZWQgd2l0aCB2bWFsbG9jIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChjdXJyZW50X2FsbG9jYXRlZF9ieXRlcywgZG1fYnVmaW9fY3VycmVudF9hbGxvY2F0ZWQsIHVsb25nLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY3VycmVudF9hbGxvY2F0ZWRfYnl0ZXMsICJNZW1vcnkgY3VycmVudGx5IHVzZWQgYnkgdGhlIGNhY2hlIik7CisKK01PRFVMRV9BVVRIT1IoIk1pa3VsYXMgUGF0b2NrYSA8ZG0tZGV2ZWxAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICIgYnVmZmVyZWQgSS9PIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tYnVmaW8uaCBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjM2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1idWZpby5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIEF1dGhvcjogTWlrdWxhcyBQYXRvY2thIDxtcGF0b2NrYUByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgRE1fQlVGSU9fSAorI2RlZmluZSBETV9CVUZJT19ICisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50Oworc3RydWN0IGRtX2J1ZmZlcjsKKworLyoKKyAqIENyZWF0ZSBhIGJ1ZmZlcmVkIElPIGNhY2hlIG9uIGEgZ2l2ZW4gZGV2aWNlCisgKi8KK3N0cnVjdCBkbV9idWZpb19jbGllbnQgKgorZG1fYnVmaW9fY2xpZW50X2NyZWF0ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBibG9ja19zaXplLAorCQkgICAgICAgdW5zaWduZWQgcmVzZXJ2ZWRfYnVmZmVycywgdW5zaWduZWQgYXV4X3NpemUsCisJCSAgICAgICB2b2lkICgqYWxsb2NfY2FsbGJhY2spKHN0cnVjdCBkbV9idWZmZXIgKiksCisJCSAgICAgICB2b2lkICgqd3JpdGVfY2FsbGJhY2spKHN0cnVjdCBkbV9idWZmZXIgKikpOworCisvKgorICogUmVsZWFzZSBhIGJ1ZmZlcmVkIElPIGNhY2hlLgorICovCit2b2lkIGRtX2J1ZmlvX2NsaWVudF9kZXN0cm95KHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogV0FSTklORzogdG8gYXZvaWQgZGVhZGxvY2tzLCB0aGVzZSBjb25kaXRpb25zIGFyZSBvYnNlcnZlZDoKKyAqCisgKiAtIEF0IG1vc3Qgb25lIHRocmVhZCBjYW4gaG9sZCBhdCBtb3N0ICJyZXNlcnZlZF9idWZmZXJzIiBzaW11bHRhbmVvdXNseS4KKyAqIC0gRWFjaCBvdGhlciB0aHJlYWRzIGNhbiBob2xkIGF0IG1vc3Qgb25lIGJ1ZmZlci4KKyAqIC0gVGhyZWFkcyB3aGljaCBjYWxsIG9ubHkgZG1fYnVmaW9fZ2V0IGNhbiBob2xkIHVubGltaXRlZCBudW1iZXIgb2YKKyAqICAgYnVmZmVycy4KKyAqLworCisvKgorICogUmVhZCBhIGdpdmVuIGJsb2NrIGZyb20gZGlzay4gUmV0dXJucyBwb2ludGVyIHRvIGRhdGEuICBSZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gZG1fYnVmZmVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIG9yIHRvIG1ha2UKKyAqIGl0IGRpcnR5LgorICovCit2b2lkICpkbV9idWZpb19yZWFkKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIExpa2UgZG1fYnVmaW9fcmVhZCwgYnV0IHJldHVybiBidWZmZXIgZnJvbSBjYWNoZSwgZG9uJ3QgcmVhZAorICogaXQuIElmIHRoZSBidWZmZXIgaXMgbm90IGluIHRoZSBjYWNoZSwgcmV0dXJuIE5VTEwuCisgKi8KK3ZvaWQgKmRtX2J1ZmlvX2dldChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIExpa2UgZG1fYnVmaW9fcmVhZCwgYnV0IGRvbid0IHJlYWQgYW55dGhpbmcgZnJvbSB0aGUgZGlzay4gIEl0IGlzCisgKiBleHBlY3RlZCB0aGF0IHRoZSBjYWxsZXIgaW5pdGlhbGl6ZXMgdGhlIGJ1ZmZlciBhbmQgbWFya3MgaXQgZGlydHkuCisgKi8KK3ZvaWQgKmRtX2J1ZmlvX25ldyhzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICpjLCBzZWN0b3JfdCBibG9jaywKKwkJICAgc3RydWN0IGRtX2J1ZmZlciAqKmJwKTsKKworLyoKKyAqIFJlbGVhc2UgYSByZWZlcmVuY2Ugb2J0YWluZWQgd2l0aCBkbV9idWZpb197cmVhZCxnZXQsbmV3fS4gVGhlIGRhdGEKKyAqIHBvaW50ZXIgYW5kIGRtX2J1ZmZlciBwb2ludGVyIGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGlzIGNhbGwuCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZShzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKKworLyoKKyAqIE1hcmsgYSBidWZmZXIgZGlydHkuIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBtb2RpZmllZC4KKyAqCisgKiBJbiBjYXNlIG9mIG1lbW9yeSBwcmVzc3VyZSwgdGhlIGJ1ZmZlciBtYXkgYmUgd3JpdHRlbiBhZnRlcgorICogZG1fYnVmaW9fbWFya19idWZmZXJfZGlydHksIGJ1dCBiZWZvcmUgZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycy4gIFNvCisgKiBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyIGlzIG9uLWRpc2sgYnV0CisgKiB0aGUgYWN0dWFsIHdyaXRpbmcgbWF5IG9jY3VyIGVhcmxpZXIuCisgKi8KK3ZvaWQgZG1fYnVmaW9fbWFya19idWZmZXJfZGlydHkoc3RydWN0IGRtX2J1ZmZlciAqYik7CisKKy8qCisgKiBJbml0aWF0ZSB3cml0aW5nIG9mIGRpcnR5IGJ1ZmZlcnMsIHdpdGhvdXQgd2FpdGluZyBmb3IgY29tcGxldGlvbi4KKyAqLwordm9pZCBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzX2FzeW5jKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogV3JpdGUgYWxsIGRpcnR5IGJ1ZmZlcnMuIEd1YXJhbnRlZXMgdGhhdCBhbGwgZGlydHkgYnVmZmVycyBjcmVhdGVkIHByaW9yCisgKiB0byB0aGlzIGNhbGwgYXJlIG9uIGRpc2sgd2hlbiB0aGlzIGNhbGwgZXhpdHMuCisgKi8KK2ludCBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogU2VuZCBhbiBlbXB0eSB3cml0ZSBiYXJyaWVyIHRvIHRoZSBkZXZpY2UgdG8gZmx1c2ggaGFyZHdhcmUgZGlzayBjYWNoZS4KKyAqLworaW50IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworCisvKgorICogTGlrZSBkbV9idWZpb19yZWxlYXNlIGJ1dCBhbHNvIG1vdmUgdGhlIGJ1ZmZlciB0byB0aGUgbmV3CisgKiBibG9jay4gZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyBpcyBuZWVkZWQgdG8gY29tbWl0IHRoZSBuZXcgYmxvY2suCisgKi8KK3ZvaWQgZG1fYnVmaW9fcmVsZWFzZV9tb3ZlKHN0cnVjdCBkbV9idWZmZXIgKmIsIHNlY3Rvcl90IG5ld19ibG9jayk7CisKK3Vuc2lnbmVkIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworc2VjdG9yX3QgZG1fYnVmaW9fZ2V0X2RldmljZV9zaXplKHN0cnVjdCBkbV9idWZpb19jbGllbnQgKmMpOworc2VjdG9yX3QgZG1fYnVmaW9fZ2V0X2Jsb2NrX251bWJlcihzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKK3ZvaWQgKmRtX2J1ZmlvX2dldF9ibG9ja19kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpOwordm9pZCAqZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHN0cnVjdCBkbV9idWZmZXIgKmIpOworc3RydWN0IGRtX2J1ZmlvX2NsaWVudCAqZG1fYnVmaW9fZ2V0X2NsaWVudChzdHJ1Y3QgZG1fYnVmZmVyICpiKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwppbmRleCAwYmRiMjAxLi4wNDJlNzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggInNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZXMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggMmU5YTNjYS4uMzFjMmRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtMTIxNSw2ICsxMjE1LDcgQEAKIAlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKIAlzdHJ1Y3QgZG1fdGFibGUgKnQ7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCB0YXJnZXRfdHlwZSAqaW1tdXRhYmxlX3RhcmdldF90eXBlOwogCiAJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CiAJaWYgKCFtZCkKQEAgLTEyMzAsNiArMTIzMSwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpbW11dGFibGVfdGFyZ2V0X3R5cGUgPSBkbV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKG1kKTsKKwlpZiAoaW1tdXRhYmxlX3RhcmdldF90eXBlICYmCisJICAgIChpbW11dGFibGVfdGFyZ2V0X3R5cGUgIT0gZG1fdGFibGVfZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZSh0KSkpIHsKKwkJRE1XQVJOKCJjYW4ndCByZXBsYWNlIGltbXV0YWJsZSB0YXJnZXQgdHlwZSAlcyIsCisJCSAgICAgICBpbW11dGFibGVfdGFyZ2V0X3R5cGUtPm5hbWUpOworCQlkbV90YWJsZV9kZXN0cm95KHQpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogUHJvdGVjdCBtZC0+dHlwZSBhbmQgbWQtPnF1ZXVlIGFnYWluc3QgY29uY3VycmVudCB0YWJsZSBsb2Fkcy4gKi8KIAlkbV9sb2NrX21kX3R5cGUobWQpOwogCWlmIChkbV9nZXRfbWRfdHlwZShtZCkgPT0gRE1fVFlQRV9OT05FKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1rY29weWQuYyBiL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKaW5kZXggMzJhYzcwOC4uYmVkNDQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1rY29weWQuYworKysgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCkBAIC02Niw2ICs2Niw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwYWdlc19qb2JzOwogfTsKIAorc3RhdGljIHN0cnVjdCBwYWdlX2xpc3QgemVyb19wYWdlX2xpc3Q7CisKIHN0YXRpYyB2b2lkIHdha2Uoc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjKQogewogCXF1ZXVlX3dvcmsoa2MtPmtjb3B5ZF93cSwgJmtjLT5rY29weWRfd29yayk7CkBAIC0yNTQsNiArMjU2LDkgQEAKIAlpZiAoIV9qb2JfY2FjaGUpCiAJCXJldHVybiAtRU5PTUVNOwogCisJemVyb19wYWdlX2xpc3QubmV4dCA9ICZ6ZXJvX3BhZ2VfbGlzdDsKKwl6ZXJvX3BhZ2VfbGlzdC5wYWdlID0gWkVST19QQUdFKDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMyMiw3ICszMjcsNyBAQAogCWRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4gPSBqb2ItPmZuOwogCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYyA9IGpvYi0+a2M7CiAKLQlpZiAoam9iLT5wYWdlcykKKwlpZiAoam9iLT5wYWdlcyAmJiBqb2ItPnBhZ2VzICE9ICZ6ZXJvX3BhZ2VfbGlzdCkKIAkJa2NvcHlkX3B1dF9wYWdlcyhrYywgam9iLT5wYWdlcyk7CiAJLyoKIAkgKiBJZiB0aGlzIGlzIHRoZSBtYXN0ZXIgam9iLCB0aGUgc3ViIGpvYnMgaGF2ZSBhbHJlYWR5CkBAIC00ODQsNiArNDg5LDggQEAKIAlhdG9taWNfaW5jKCZrYy0+bnJfam9icyk7CiAJaWYgKHVubGlrZWx5KCFqb2ItPnNvdXJjZS5jb3VudCkpCiAJCXB1c2goJmtjLT5jb21wbGV0ZV9qb2JzLCBqb2IpOworCWVsc2UgaWYgKGpvYi0+cGFnZXMgPT0gJnplcm9fcGFnZV9saXN0KQorCQlwdXNoKCZrYy0+aW9fam9icywgam9iKTsKIAllbHNlCiAJCXB1c2goJmtjLT5wYWdlc19qb2JzLCBqb2IpOwogCXdha2Uoa2MpOwpAQCAtNTkyLDE0ICs1OTksMjAgQEAKIAlqb2ItPmZsYWdzID0gZmxhZ3M7CiAJam9iLT5yZWFkX2VyciA9IDA7CiAJam9iLT53cml0ZV9lcnIgPSAwOwotCWpvYi0+cncgPSBSRUFEOwotCi0Jam9iLT5zb3VyY2UgPSAqZnJvbTsKIAogCWpvYi0+bnVtX2Rlc3RzID0gbnVtX2Rlc3RzOwogCW1lbWNweSgmam9iLT5kZXN0cywgZGVzdHMsIHNpemVvZigqZGVzdHMpICogbnVtX2Rlc3RzKTsKIAotCWpvYi0+cGFnZXMgPSBOVUxMOworCWlmIChmcm9tKSB7CisJCWpvYi0+c291cmNlID0gKmZyb207CisJCWpvYi0+cGFnZXMgPSBOVUxMOworCQlqb2ItPnJ3ID0gUkVBRDsKKwl9IGVsc2UgeworCQltZW1zZXQoJmpvYi0+c291cmNlLCAwLCBzaXplb2Ygam9iLT5zb3VyY2UpOworCQlqb2ItPnNvdXJjZS5jb3VudCA9IGpvYi0+ZGVzdHNbMF0uY291bnQ7CisJCWpvYi0+cGFnZXMgPSAmemVyb19wYWdlX2xpc3Q7CisJCWpvYi0+cncgPSBXUklURTsKKwl9CiAKIAlqb2ItPmZuID0gZm47CiAJam9iLT5jb250ZXh0ID0gY29udGV4dDsKQEAgLTYxNyw2ICs2MzAsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1fa2NvcHlkX2NvcHkpOwogCitpbnQgZG1fa2NvcHlkX3plcm8oc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAorCQkgICB1bnNpZ25lZCBudW1fZGVzdHMsIHN0cnVjdCBkbV9pb19yZWdpb24gKmRlc3RzLAorCQkgICB1bnNpZ25lZCBmbGFncywgZG1fa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCkKK3sKKwlyZXR1cm4gZG1fa2NvcHlkX2NvcHkoa2MsIE5VTEwsIG51bV9kZXN0cywgZGVzdHMsIGZsYWdzLCBmbiwgY29udGV4dCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF96ZXJvKTsKKwogdm9pZCAqZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2soc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAogCQkJCSBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKaW5kZXggMTAyMWM4OS4uOTQyOTE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtLWRpcnR5LWxvZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1sb2ctdXNlcnNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkbS1sb2ctdXNlcnNwYWNlLXRyYW5zZmVyLmgiCiAKQEAgLTMwLDYgKzMxLDcgQEAKIAogc3RydWN0IGxvZ19jIHsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKKwlzdHJ1Y3QgZG1fZGV2ICpsb2dfZGV2OwogCXVpbnQzMl90IHJlZ2lvbl9zaXplOwogCXJlZ2lvbl90IHJlZ2lvbl9jb3VudDsKIAl1aW50NjRfdCBsdWlkOwpAQCAtMTQ2LDcgKzE0OCw3IEBACiAgKgk8VVVJRD4gPG90aGVyIGFyZ3M+CiAgKiBXaGVyZSAnb3RoZXIgYXJncycgaXMgdGhlIHVzZXJzcGFjZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBsb2cKICAqIGFyZ3VtZW50cy4gIEFuIGV4YW1wbGUgbWlnaHQgYmU6Ci0gKgk8VVVJRD4gY2x1c3RlcmVkX2Rpc2sgPGFyZyBjb3VudD4gPGxvZyBkZXY+IDxyZWdpb25fc2l6ZT4gW1tub11zeW5jXQorICoJPFVVSUQ+IGNsdXN0ZXJlZC1kaXNrIDxhcmcgY291bnQ+IDxsb2cgZGV2PiA8cmVnaW9uX3NpemU+IFtbbm9dc3luY10KICAqCiAgKiBTbywgdGhpcyBtb2R1bGUgd2lsbCBzdHJpcCBvZmYgdGhlIDxVVUlEPiBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMKICAqIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHVzZXJzcGFjZSBhYm91dCBhIGxvZzsgYnV0IHdpbGwgcGFzcyBvbiBldmVyeXRoaW5nCkBAIC0xNjEsMTMgKzE2MywxNSBAQAogCXN0cnVjdCBsb2dfYyAqbGMgPSBOVUxMOwogCXVpbnQ2NF90IHJkYXRhOwogCXNpemVfdCByZGF0YV9zaXplID0gc2l6ZW9mKHJkYXRhKTsKKwljaGFyICpkZXZpY2VzX3JkYXRhID0gTlVMTDsKKwlzaXplX3QgZGV2aWNlc19yZGF0YV9zaXplID0gRE1fTkFNRV9MRU47CiAKIAlpZiAoYXJnYyA8IDMpIHsKIAkJRE1XQVJOKCJUb28gZmV3IGFyZ3VtZW50cyB0byB1c2Vyc3BhY2UgZGlydHkgbG9nIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxjID0ga21hbGxvYyhzaXplb2YoKmxjKSwgR0ZQX0tFUk5FTCk7CisJbGMgPSBremFsbG9jKHNpemVvZigqbGMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxjKSB7CiAJCURNV0FSTigiVW5hYmxlIHRvIGFsbG9jYXRlIHVzZXJzcGFjZSBsb2cgY29udGV4dC4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTUsOSArMTk5LDE5IEBACiAJCXJldHVybiBzdHJfc2l6ZTsKIAl9CiAKLQkvKiBTZW5kIHRhYmxlIHN0cmluZyAqLworCWRldmljZXNfcmRhdGEgPSBremFsbG9jKGRldmljZXNfcmRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2VzX3JkYXRhKSB7CisJCURNRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb3JtYXRpb24iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU2VuZCB0YWJsZSBzdHJpbmcgYW5kIGdldCBiYWNrIGFueSBvcGVuZWQgZGV2aWNlLgorCSAqLwogCXIgPSBkbV9jb25zdWx0X3VzZXJzcGFjZShsYy0+dXVpZCwgbGMtPmx1aWQsIERNX1VMT0dfQ1RSLAotCQkJCSBjdHJfc3RyLCBzdHJfc2l6ZSwgTlVMTCwgTlVMTCk7CisJCQkJIGN0cl9zdHIsIHN0cl9zaXplLAorCQkJCSBkZXZpY2VzX3JkYXRhLCAmZGV2aWNlc19yZGF0YV9zaXplKTsKIAogCWlmIChyIDwgMCkgewogCQlpZiAociA9PSAtRVNSQ0gpCkBAIC0yMjAsNyArMjM0LDIwIEBACiAJbGMtPnJlZ2lvbl9zaXplID0gKHVpbnQzMl90KXJkYXRhOwogCWxjLT5yZWdpb25fY291bnQgPSBkbV9zZWN0b3JfZGl2X3VwKHRpLT5sZW4sIGxjLT5yZWdpb25fc2l6ZSk7CiAKKwlpZiAoZGV2aWNlc19yZGF0YV9zaXplKSB7CisJCWlmIChkZXZpY2VzX3JkYXRhW2RldmljZXNfcmRhdGFfc2l6ZSAtIDFdICE9ICdcMCcpIHsKKwkJCURNRVJSKCJETV9VTE9HX0NUUiBkZXZpY2UgcmV0dXJuIHN0cmluZyBub3QgcHJvcGVybHkgdGVybWluYXRlZCIpOworCQkJciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyID0gZG1fZ2V0X2RldmljZSh0aSwgZGV2aWNlc19yZGF0YSwKKwkJCQkgIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZsYy0+bG9nX2Rldik7CisJCWlmIChyKQorCQkJRE1FUlIoIkZhaWxlZCB0byByZWdpc3RlciAlcyB3aXRoIGRldmljZS1tYXBwZXIiLAorCQkJICAgICAgZGV2aWNlc19yZGF0YSk7CisJfQogb3V0OgorCWtmcmVlKGRldmljZXNfcmRhdGEpOwogCWlmIChyKSB7CiAJCWtmcmVlKGxjKTsKIAkJa2ZyZWUoY3RyX3N0cik7CkBAIC0yNDEsNiArMjY4LDkgQEAKIAkJCQkgTlVMTCwgMCwKIAkJCQkgTlVMTCwgTlVMTCk7CiAKKwlpZiAobGMtPmxvZ19kZXYpCisJCWRtX3B1dF9kZXZpY2UobGMtPnRpLCBsYy0+bG9nX2Rldik7CisKIAlrZnJlZShsYy0+dXNyX2FyZ3Zfc3RyKTsKIAlrZnJlZShsYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcGF0aC1zZWxlY3Rvci5jIGIvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKaW5kZXggNDJjMDRmMC4uZmEwY2NjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKKysrIGIvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiZG0tcGF0aC1zZWxlY3Rvci5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCmluZGV4IDM3YTM3MjYuLmMyOTA3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJtZC5oIgogI2luY2x1ZGUgInJhaWQxLmgiCkBAIC0xMDE3LDMwICsxMDE4LDU2IEBACiAJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOwogCXVuc2lnbmVkIHJhaWRfcGFyYW1fY250ID0gMTsgLyogYXQgbGVhc3QgMSBmb3IgY2h1bmtzaXplICovCiAJdW5zaWduZWQgc3ogPSAwOwotCWludCBpOworCWludCBpLCBhcnJheV9pbl9zeW5jID0gMDsKIAlzZWN0b3JfdCBzeW5jOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTVEFUVVNUWVBFX0lORk86CiAJCURNRU1JVCgiJXMgJWQgIiwgcnMtPnJhaWRfdHlwZS0+bmFtZSwgcnMtPm1kLnJhaWRfZGlza3MpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7Ci0JCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKLQkJCQlETUVNSVQoIkQiKTsKLQkJCWVsc2UgaWYgKHRlc3RfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQotCQkJCURNRU1JVCgiQSIpOwotCQkJZWxzZQotCQkJCURNRU1JVCgiYSIpOwotCQl9Ci0KIAkJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZycy0+bWQucmVjb3ZlcnkpKQogCQkJc3luYyA9IHJzLT5tZC5jdXJyX3Jlc3luY19jb21wbGV0ZWQ7CiAJCWVsc2UKIAkJCXN5bmMgPSBycy0+bWQucmVjb3ZlcnlfY3A7CiAKLQkJaWYgKHN5bmMgPiBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzKQorCQlpZiAoc3luYyA+PSBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzKSB7CisJCQlhcnJheV9pbl9zeW5jID0gMTsKIAkJCXN5bmMgPSBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBhcnJheSBtYXkgYmUgZG9pbmcgYW4gaW5pdGlhbCBzeW5jLCBvciBpdCBtYXkKKwkJCSAqIGJlIHJlYnVpbGRpbmcgaW5kaXZpZHVhbCBjb21wb25lbnRzLiAgSWYgYWxsIHRoZQorCQkJICogZGV2aWNlcyBhcmUgSW5fc3luYywgdGhlbiBpdCBpcyB0aGUgYXJyYXkgdGhhdCBpcworCQkJICogYmVpbmcgaW5pdGlhbGl6ZWQuCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCQkJCWlmICghdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJCWFycmF5X2luX3N5bmMgPSAxOworCQl9CisJCS8qCisJCSAqIFN0YXR1cyBjaGFyYWN0ZXJzOgorCQkgKiAgJ0QnID0gRGVhZC9GYWlsZWQgZGV2aWNlCisJCSAqICAnYScgPSBBbGl2ZSBidXQgbm90IGluLXN5bmMKKwkJICogICdBJyA9IEFsaXZlIGFuZCBpbi1zeW5jCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCJEIik7CisJCQllbHNlIGlmICghYXJyYXlfaW5fc3luYyB8fAorCQkJCSAhdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCJhIik7CisJCQllbHNlCisJCQkJRE1FTUlUKCJBIik7CisJCX0KIAorCQkvKgorCQkgKiBJbi1zeW5jIHJhdGlvOgorCQkgKiAgVGhlIGluLXN5bmMgcmF0aW8gc2hvd3MgdGhlIHByb2dyZXNzIG9mOgorCQkgKiAgIC0gSW5pdGlhbGl6aW5nIHRoZSBhcnJheQorCQkgKiAgIC0gUmVidWlsZGluZyBhIHN1YnNldCBvZiBkZXZpY2VzIG9mIHRoZSBhcnJheQorCQkgKiAgVGhlIHVzZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byBieSByZWZlcnJpbmcKKwkJICogIHRvIHRoZSBzdGF0dXMgY2hhcmFjdGVycy4KKwkJICovCiAJCURNRU1JVCgiICVsbHUvJWxsdSIsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzeW5jLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnMtPm1kLnJlc3luY19tYXhfc2VjdG9ycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggMjQ3NTJmNC4uMjdmMWQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImRtLXBhdGgtc2VsZWN0b3IuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJtdWx0aXBhdGggcm91bmQtcm9iaW4iCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc2VydmljZS10aW1lLmMgYi9kcml2ZXJzL21kL2RtLXNlcnZpY2UtdGltZS5jCmluZGV4IDljNmMyZTQuLjU5ODgzYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc2VydmljZS10aW1lLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zZXJ2aWNlLXRpbWUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImRtLXBhdGgtc2VsZWN0b3IuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYCSJtdWx0aXBhdGggc2VydmljZS10aW1lIgogI2RlZmluZSBTVF9NSU5fSU8JMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKaW5kZXggZDFmMWQ3MC4uM2FjNDE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAtdHJhbnNpZW50LmMgYi9kcml2ZXJzL21kL2RtLXNuYXAtdHJhbnNpZW50LmMKaW5kZXggYTA4OThhNi4uMWNlOWEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXRyYW5zaWVudC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC10cmFuc2llbnQuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IGJjMDQ1MTguLjhlOTEzMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTU0LDcgKzU0LDkgQEAKIAlzZWN0b3JfdCAqaGlnaHM7CiAJc3RydWN0IGRtX3RhcmdldCAqdGFyZ2V0czsKIAorCXN0cnVjdCB0YXJnZXRfdHlwZSAqaW1tdXRhYmxlX3RhcmdldF90eXBlOwogCXVuc2lnbmVkIGludGVncml0eV9zdXBwb3J0ZWQ6MTsKKwl1bnNpZ25lZCBzaW5nbGV0b246MTsKIAogCS8qCiAJICogSW5kaWNhdGVzIHRoZSBydyBwZXJtaXNzaW9ucyBmb3IgdGhlIG5ldyBsb2dpY2FsCkBAIC03NDAsNiArNzQyLDEyIEBACiAJY2hhciAqKmFyZ3Y7CiAJc3RydWN0IGRtX3RhcmdldCAqdGd0OwogCisJaWYgKHQtPnNpbmdsZXRvbikgeworCQlETUVSUigiJXM6IHRhcmdldCB0eXBlICVzIG11c3QgYXBwZWFyIGFsb25lIGluIHRhYmxlIiwKKwkJICAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLCB0LT50YXJnZXRzLT50eXBlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKChyID0gY2hlY2tfc3BhY2UodCkpKQogCQlyZXR1cm4gcjsKIApAQCAtNzU4LDYgKzc2NiwzNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZG1fdGFyZ2V0X25lZWRzX3NpbmdsZXRvbih0Z3QtPnR5cGUpKSB7CisJCWlmICh0LT5udW1fdGFyZ2V0cykgeworCQkJRE1FUlIoIiVzOiB0YXJnZXQgdHlwZSAlcyBtdXN0IGFwcGVhciBhbG9uZSBpbiB0YWJsZSIsCisJCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHR5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdC0+c2luZ2xldG9uID0gMTsKKwl9CisKKwlpZiAoZG1fdGFyZ2V0X2Fsd2F5c193cml0ZWFibGUodGd0LT50eXBlKSAmJiAhKHQtPm1vZGUgJiBGTU9ERV9XUklURSkpIHsKKwkJRE1FUlIoIiVzOiB0YXJnZXQgdHlwZSAlcyBtYXkgbm90IGJlIGluY2x1ZGVkIGluIHJlYWQtb25seSB0YWJsZXMiLAorCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodC0+aW1tdXRhYmxlX3RhcmdldF90eXBlKSB7CisJCWlmICh0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUgIT0gdGd0LT50eXBlKSB7CisJCQlETUVSUigiJXM6IGltbXV0YWJsZSB0YXJnZXQgdHlwZSAlcyBjYW5ub3QgYmUgbWl4ZWQgd2l0aCBvdGhlciB0YXJnZXQgdHlwZXMiLAorCQkJICAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLCB0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKGRtX3RhcmdldF9pc19pbW11dGFibGUodGd0LT50eXBlKSkgeworCQlpZiAodC0+bnVtX3RhcmdldHMpIHsKKwkJCURNRVJSKCIlczogaW1tdXRhYmxlIHRhcmdldCB0eXBlICVzIGNhbm5vdCBiZSBtaXhlZCB3aXRoIG90aGVyIHRhcmdldCB0eXBlcyIsCisJCQkgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHRndC0+dHlwZS0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGUgPSB0Z3QtPnR5cGU7CisJfQorCiAJdGd0LT50YWJsZSA9IHQ7CiAJdGd0LT5iZWdpbiA9IHN0YXJ0OwogCXRndC0+bGVuID0gbGVuOwpAQCAtOTE1LDYgKzk1MywxMSBAQAogCXJldHVybiB0LT50eXBlOwogfQogCitzdHJ1Y3QgdGFyZ2V0X3R5cGUgKmRtX3RhYmxlX2dldF9pbW11dGFibGVfdGFyZ2V0X3R5cGUoc3RydWN0IGRtX3RhYmxlICp0KQoreworCXJldHVybiB0LT5pbW11dGFibGVfdGFyZ2V0X3R5cGU7Cit9CisKIGJvb2wgZG1fdGFibGVfcmVxdWVzdF9iYXNlZChzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CiAJcmV0dXJuIGRtX3RhYmxlX2dldF90eXBlKHQpID09IERNX1RZUEVfUkVRVUVTVF9CQVNFRDsKQEAgLTEyOTksNiArMTM0MiwzMSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IGRldmljZV9pc19ub25yb3Qoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKKwkJCSAgICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KTsKKworCXJldHVybiBxICYmIGJsa19xdWV1ZV9ub25yb3QocSk7Cit9CisKK3N0YXRpYyBib29sIGRtX3RhYmxlX2lzX25vbnJvdChzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJdW5zaWduZWQgaSA9IDA7CisKKwkvKiBFbnN1cmUgdGhhdCBhbGwgdW5kZXJseWluZyBkZXZpY2UgYXJlIG5vbi1yb3RhdGlvbmFsLiAqLworCXdoaWxlIChpIDwgZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHQpKSB7CisJCXRpID0gZG1fdGFibGVfZ2V0X3RhcmdldCh0LCBpKyspOworCisJCWlmICghdGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyB8fAorCQkgICAgIXRpLT50eXBlLT5pdGVyYXRlX2RldmljZXModGksIGRldmljZV9pc19ub25yb3QsIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKIHZvaWQgZG1fdGFibGVfc2V0X3Jlc3RyaWN0aW9ucyhzdHJ1Y3QgZG1fdGFibGUgKnQsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJICAgICAgIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cykKIHsKQEAgLTEzMjQsNiArMTM5MiwxMSBAQAogCWlmICghZG1fdGFibGVfZGlzY2FyZF96ZXJvZXNfZGF0YSh0KSkKIAkJcS0+bGltaXRzLmRpc2NhcmRfemVyb2VzX2RhdGEgPSAwOwogCisJaWYgKGRtX3RhYmxlX2lzX25vbnJvdCh0KSkKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHEpOworCWVsc2UKKwkJcXVldWVfZmxhZ19jbGVhcl91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgcSk7CisKIAlkbV90YWJsZV9zZXRfaW50ZWdyaXR5KHQpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5jIGIvZHJpdmVycy9tZC9kbS10aGluLW1ldGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5jCkBAIC0wLDAgKzEsMTM5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLXRoaW4tbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJwZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuaCIKKyNpbmNsdWRlICJwZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAicGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmgiCisjaW5jbHVkZSAicGVyc2lzdGVudC1kYXRhL2RtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFzIGZhciBhcyB0aGUgbWV0YWRhdGEgZ29lcywgdGhlcmUgaXM6CisgKgorICogLSBBIHN1cGVyYmxvY2sgaW4gYmxvY2sgemVybywgdGFraW5nIHVwIGZld2VyIHRoYW4gNTEyIGJ5dGVzIGZvcgorICogICBhdG9taWMgd3JpdGVzLgorICoKKyAqIC0gQSBzcGFjZSBtYXAgbWFuYWdpbmcgdGhlIG1ldGFkYXRhIGJsb2Nrcy4KKyAqCisgKiAtIEEgc3BhY2UgbWFwIG1hbmFnaW5nIHRoZSBkYXRhIGJsb2Nrcy4KKyAqCisgKiAtIEEgYnRyZWUgbWFwcGluZyBvdXIgaW50ZXJuYWwgdGhpbiBkZXYgaWRzIG9udG8gc3RydWN0IGRpc2tfZGV2aWNlX2RldGFpbHMuCisgKgorICogLSBBIGhpZXJhcmNoaWNhbCBidHJlZSwgd2l0aCAyIGxldmVscyB3aGljaCBlZmZlY3RpdmVseSBtYXBzICh0aGluCisgKiAgIGRldiBpZCwgdmlydHVhbCBibG9jaykgLT4gYmxvY2tfdGltZS4gIEJsb2NrIHRpbWUgaXMgYSA2NC1iaXQKKyAqICAgZmllbGQgaG9sZGluZyB0aGUgdGltZSBpbiB0aGUgbG93IDI0IGJpdHMsIGFuZCBibG9jayBpbiB0aGUgdG9wIDQ4CisgKiAgIGJpdHMuCisgKgorICogQlRyZWVzIGNvbnNpc3Qgc29sZWx5IG9mIGJ0cmVlX25vZGVzLCB0aGF0IGZpbGwgYSBibG9jay4gIFNvbWUgYXJlCisgKiBpbnRlcm5hbCBub2RlcywgYXMgc3VjaCB0aGVpciB2YWx1ZXMgYXJlIGEgX19sZTY0IHBvaW50aW5nIHRvIG90aGVyCisgKiBub2Rlcy4gIExlYWYgbm9kZXMgY2FuIHN0b3JlIGRhdGEgb2YgYW55IHJlYXNvbmFibGUgc2l6ZSAoaWUuIG11Y2gKKyAqIHNtYWxsZXIgdGhhbiB0aGUgYmxvY2sgc2l6ZSkuICBUaGUgbm9kZXMgY29uc2lzdCBvZiB0aGUgaGVhZGVyLAorICogZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2Yga2V5cywgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YgdmFsdWVzLiAgV2UgaGF2ZQorICogdG8gYmluYXJ5IHNlYXJjaCBvbiB0aGUga2V5cyBzbyB0aGV5J3JlIGFsbCBoZWxkIHRvZ2V0aGVyIHRvIGhlbHAgdGhlCisgKiBjcHUgY2FjaGUuCisgKgorICogU3BhY2UgbWFwcyBoYXZlIDIgYnRyZWVzOgorICoKKyAqIC0gT25lIG1hcHMgYSB1aW50NjRfdCBvbnRvIGEgc3RydWN0IGluZGV4X2VudHJ5LiAgV2hpY2ggcG9pbnRzIHRvIGEKKyAqICAgYml0bWFwIGJsb2NrLCBhbmQgaGFzIHNvbWUgZGV0YWlscyBhYm91dCBob3cgbWFueSBmcmVlIGVudHJpZXMgdGhlcmUKKyAqICAgYXJlIGV0Yy4KKyAqCisgKiAtIFRoZSBiaXRtYXAgYmxvY2tzIGhhdmUgYSBoZWFkZXIgKGZvciB0aGUgY2hlY2tzdW0pLiAgVGhlbiB0aGUgcmVzdAorICogICBvZiB0aGUgYmxvY2sgaXMgcGFpcnMgb2YgYml0cy4gIFdpdGggdGhlIG1lYW5pbmcgYmVpbmc6CisgKgorICogICAwIC0gcmVmIGNvdW50IGlzIDAKKyAqICAgMSAtIHJlZiBjb3VudCBpcyAxCisgKiAgIDIgLSByZWYgY291bnQgaXMgMgorICogICAzIC0gcmVmIGNvdW50IGlzIGhpZ2hlciB0aGFuIDIKKyAqCisgKiAtIElmIHRoZSBjb3VudCBpcyBoaWdoZXIgdGhhbiAyIHRoZW4gdGhlIHJlZiBjb3VudCBpcyBlbnRlcmVkIGluIGEKKyAqICAgc2Vjb25kIGJ0cmVlIHRoYXQgZGlyZWN0bHkgbWFwcyB0aGUgYmxvY2tfYWRkcmVzcyB0byBhIHVpbnQzMl90IHJlZgorICogICBjb3VudC4KKyAqCisgKiBUaGUgc3BhY2UgbWFwIG1ldGFkYXRhIHZhcmlhbnQgZG9lc24ndCBoYXZlIGEgYml0bWFwcyBidHJlZS4gIEluc3RlYWQKKyAqIGl0IGhhcyBvbmUgc2luZ2xlIGJsb2NrcyB3b3J0aCBvZiBpbmRleF9lbnRyaWVzLiAgVGhpcyBhdm9pZHMKKyAqIHJlY3Vyc2l2ZSBpc3N1ZXMgd2l0aCB0aGUgYml0bWFwIGJ0cmVlIG5lZWRpbmcgdG8gYWxsb2NhdGUgc3BhY2UgaW4KKyAqIG9yZGVyIHRvIGluc2VydC4gIFdpdGggYSBzbWFsbCBkYXRhIGJsb2NrIHNpemUgc3VjaCBhcyA2NGsgdGhlCisgKiBtZXRhZGF0YSBzdXBwb3J0IGRhdGEgZGV2aWNlcyB0aGF0IGFyZSBodW5kcmVkcyBvZiB0ZXJyYWJ5dGVzLgorICoKKyAqIFRoZSBzcGFjZSBtYXBzIGFsbG9jYXRlIHNwYWNlIGxpbmVhcmx5IGZyb20gZnJvbnQgdG8gYmFjay4gIFNwYWNlIHRoYXQKKyAqIGlzIGZyZWVkIGluIGEgdHJhbnNhY3Rpb24gaXMgbmV2ZXIgcmVjeWNsZWQgd2l0aGluIHRoYXQgdHJhbnNhY3Rpb24uCisgKiBUbyB0cnkgYW5kIGF2b2lkIGZyYWdtZW50aW5nIF9mcmVlXyBzcGFjZSB0aGUgYWxsb2NhdG9yIGFsd2F5cyBnb2VzCisgKiBiYWNrIGFuZCBmaWxscyBpbiBnYXBzLgorICoKKyAqIEFsbCBtZXRhZGF0YSBpbyBpcyBpbiBUSElOX01FVEFEQVRBX0JMT0NLX1NJWkUgc2l6ZWQvYWxpZ25lZCBjaHVua3MKKyAqIGZyb20gdGhlIGJsb2NrIG1hbmFnZXIuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBETV9NU0dfUFJFRklYICAgInRoaW4gbWV0YWRhdGEiCisKKyNkZWZpbmUgVEhJTl9TVVBFUkJMT0NLX01BR0lDIDI3MDIyMDEwCisjZGVmaW5lIFRISU5fU1VQRVJCTE9DS19MT0NBVElPTiAwCisjZGVmaW5lIFRISU5fVkVSU0lPTiAxCisjZGVmaW5lIFRISU5fTUVUQURBVEFfQ0FDSEVfU0laRSA2NAorI2RlZmluZSBTRUNUT1JfVE9fQkxPQ0tfU0hJRlQgMworCisvKiBUaGlzIHNob3VsZCBiZSBwbGVudHkgKi8KKyNkZWZpbmUgU1BBQ0VfTUFQX1JPT1RfU0laRSAxMjgKKworLyoKKyAqIExpdHRsZSBlbmRpYW4gb24tZGlzayBzdXBlcmJsb2NrIGFuZCBkZXZpY2UgZGV0YWlscy4KKyAqLworc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrIHsKKwlfX2xlMzIgY3N1bTsJLyogQ2hlY2tzdW0gb2Ygc3VwZXJibG9jayBleGNlcHQgZm9yIHRoaXMgZmllbGQuICovCisJX19sZTMyIGZsYWdzOworCV9fbGU2NCBibG9ja25yOwkvKiBUaGlzIGJsb2NrIG51bWJlciwgZG1fYmxvY2tfdC4gKi8KKworCV9fdTggdXVpZFsxNl07CisJX19sZTY0IG1hZ2ljOworCV9fbGUzMiB2ZXJzaW9uOworCV9fbGUzMiB0aW1lOworCisJX19sZTY0IHRyYW5zX2lkOworCisJLyoKKwkgKiBSb290IGhlbGQgYnkgdXNlcnNwYWNlIHRyYW5zYWN0aW9ucy4KKwkgKi8KKwlfX2xlNjQgaGVsZF9yb290OworCisJX191OCBkYXRhX3NwYWNlX21hcF9yb290W1NQQUNFX01BUF9ST09UX1NJWkVdOworCV9fdTggbWV0YWRhdGFfc3BhY2VfbWFwX3Jvb3RbU1BBQ0VfTUFQX1JPT1RfU0laRV07CisKKwkvKgorCSAqIDItbGV2ZWwgYnRyZWUgbWFwcGluZyAoZGV2X2lkLCAoZGV2IGJsb2NrLCB0aW1lKSkgLT4gZGF0YSBibG9jaworCSAqLworCV9fbGU2NCBkYXRhX21hcHBpbmdfcm9vdDsKKworCS8qCisJICogRGV2aWNlIGRldGFpbCByb290IG1hcHBpbmcgZGV2X2lkIC0+IGRldmljZV9kZXRhaWxzCisJICovCisJX19sZTY0IGRldmljZV9kZXRhaWxzX3Jvb3Q7CisKKwlfX2xlMzIgZGF0YV9ibG9ja19zaXplOwkJLyogSW4gNTEyLWJ5dGUgc2VjdG9ycy4gKi8KKworCV9fbGUzMiBtZXRhZGF0YV9ibG9ja19zaXplOwkvKiBJbiA1MTItYnl0ZSBzZWN0b3JzLiAqLworCV9fbGU2NCBtZXRhZGF0YV9ucl9ibG9ja3M7CisKKwlfX2xlMzIgY29tcGF0X2ZsYWdzOworCV9fbGUzMiBjb21wYXRfcm9fZmxhZ3M7CisJX19sZTMyIGluY29tcGF0X2ZsYWdzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGRpc2tfZGV2aWNlX2RldGFpbHMgeworCV9fbGU2NCBtYXBwZWRfYmxvY2tzOworCV9fbGU2NCB0cmFuc2FjdGlvbl9pZDsJCS8qIFdoZW4gY3JlYXRlZC4gKi8KKwlfX2xlMzIgY3JlYXRpb25fdGltZTsKKwlfX2xlMzIgc25hcHNob3R0ZWRfdGltZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkbV9wb29sX21ldGFkYXRhIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoOworCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm07CisJc3RydWN0IGRtX3NwYWNlX21hcCAqbWV0YWRhdGFfc207CisJc3RydWN0IGRtX3NwYWNlX21hcCAqZGF0YV9zbTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKm5iX3RtOworCisJLyoKKwkgKiBUd28tbGV2ZWwgYnRyZWUuCisJICogRmlyc3QgbGV2ZWwgaG9sZHMgdGhpbl9kZXZfdC4KKwkgKiBTZWNvbmQgbGV2ZWwgaG9sZHMgbWFwcGluZ3MuCisJICovCisJc3RydWN0IGRtX2J0cmVlX2luZm8gaW5mbzsKKworCS8qCisJICogTm9uLWJsb2NraW5nIHZlcnNpb24gb2YgdGhlIGFib3ZlLgorCSAqLworCXN0cnVjdCBkbV9idHJlZV9pbmZvIG5iX2luZm87CisKKwkvKgorCSAqIEp1c3QgdGhlIHRvcCBsZXZlbCBmb3IgZGVsZXRpbmcgd2hvbGUgZGV2aWNlcy4KKwkgKi8KKwlzdHJ1Y3QgZG1fYnRyZWVfaW5mbyB0bF9pbmZvOworCisJLyoKKwkgKiBKdXN0IHRoZSBib3R0b20gbGV2ZWwgZm9yIGNyZWF0aW5nIG5ldyBkZXZpY2VzLgorCSAqLworCXN0cnVjdCBkbV9idHJlZV9pbmZvIGJsX2luZm87CisKKwkvKgorCSAqIERlc2NyaWJlcyB0aGUgZGV2aWNlIGRldGFpbHMgYnRyZWUuCisJICovCisJc3RydWN0IGRtX2J0cmVlX2luZm8gZGV0YWlsc19pbmZvOworCisJc3RydWN0IHJ3X3NlbWFwaG9yZSByb290X2xvY2s7CisJdWludDMyX3QgdGltZTsKKwlpbnQgbmVlZF9jb21taXQ7CisJZG1fYmxvY2tfdCByb290OworCWRtX2Jsb2NrX3QgZGV0YWlsc19yb290OworCXN0cnVjdCBsaXN0X2hlYWQgdGhpbl9kZXZpY2VzOworCXVpbnQ2NF90IHRyYW5zX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplOworfTsKKworc3RydWN0IGRtX3RoaW5fZGV2aWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKwlkbV90aGluX2lkIGlkOworCisJaW50IG9wZW5fY291bnQ7CisJaW50IGNoYW5nZWQ7CisJdWludDY0X3QgbWFwcGVkX2Jsb2NrczsKKwl1aW50NjRfdCB0cmFuc2FjdGlvbl9pZDsKKwl1aW50MzJfdCBjcmVhdGlvbl90aW1lOworCXVpbnQzMl90IHNuYXBzaG90dGVkX3RpbWU7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN1cGVyYmxvY2sgdmFsaWRhdG9yCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTVVBFUkJMT0NLX0NTVU1fWE9SIDE2MDc3NAorCitzdGF0aWMgdm9pZCBzYl9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSBzdHJ1Y3QgZG1fYmxvY2sgKmIsCisJCQkJIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlciA9IGRtX2Jsb2NrX2RhdGEoYik7CisKKwlkaXNrX3N1cGVyLT5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oYikpOworCWRpc2tfc3VwZXItPmNzdW0gPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19zdXBlci0+ZmxhZ3MsCisJCQkJCQkgICAgICBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCQkgICAgICBTVVBFUkJMT0NLX0NTVU1fWE9SKSk7Cit9CisKK3N0YXRpYyBpbnQgc2JfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgIHN0cnVjdCBkbV9ibG9jayAqYiwKKwkJICAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlciA9IGRtX2Jsb2NrX2RhdGEoYik7CisJX19sZTMyIGNzdW1fbGU7CisKKwlpZiAoZG1fYmxvY2tfbG9jYXRpb24oYikgIT0gbGU2NF90b19jcHUoZGlza19zdXBlci0+YmxvY2tucikpIHsKKwkJRE1FUlIoInNiX2NoZWNrIGZhaWxlZDogYmxvY2tuciAlbGx1OiAiCisJCSAgICAgICJ3YW50ZWQgJWxsdSIsIGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPmJsb2NrbnIpLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwkJcmV0dXJuIC1FTk9UQkxLOworCX0KKworCWlmIChsZTY0X3RvX2NwdShkaXNrX3N1cGVyLT5tYWdpYykgIT0gVEhJTl9TVVBFUkJMT0NLX01BR0lDKSB7CisJCURNRVJSKCJzYl9jaGVjayBmYWlsZWQ6IG1hZ2ljICVsbHU6ICIKKwkJICAgICAgIndhbnRlZCAlbGx1IiwgbGU2NF90b19jcHUoZGlza19zdXBlci0+bWFnaWMpLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKVRISU5fU1VQRVJCTE9DS19NQUdJQyk7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCWNzdW1fbGUgPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19zdXBlci0+ZmxhZ3MsCisJCQkJCSAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgIFNVUEVSQkxPQ0tfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9sZSAhPSBkaXNrX3N1cGVyLT5jc3VtKSB7CisJCURNRVJSKCJzYl9jaGVjayBmYWlsZWQ6IGNzdW0gJXU6IHdhbnRlZCAldSIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNzdW1fbGUpLCBsZTMyX3RvX2NwdShkaXNrX3N1cGVyLT5jc3VtKSk7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciBzYl92YWxpZGF0b3IgPSB7CisJLm5hbWUgPSAic3VwZXJibG9jayIsCisJLnByZXBhcmVfZm9yX3dyaXRlID0gc2JfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gc2JfY2hlY2sKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTWV0aG9kcyBmb3IgdGhlIGJ0cmVlIHZhbHVlIHR5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQ2NF90IHBhY2tfYmxvY2tfdGltZShkbV9ibG9ja190IGIsIHVpbnQzMl90IHQpCit7CisJcmV0dXJuIChiIDw8IDI0KSB8IHQ7Cit9CisKK3N0YXRpYyB2b2lkIHVucGFja19ibG9ja190aW1lKHVpbnQ2NF90IHYsIGRtX2Jsb2NrX3QgKmIsIHVpbnQzMl90ICp0KQoreworCSpiID0gdiA+PiAyNDsKKwkqdCA9IHYgJiAoKDEgPDwgMjQpIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFfYmxvY2tfaW5jKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlX2xlKQoreworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtID0gY29udGV4dDsKKwlfX2xlNjQgdl9sZTsKKwl1aW50NjRfdCBiOworCXVpbnQzMl90IHQ7CisKKwltZW1jcHkoJnZfbGUsIHZhbHVlX2xlLCBzaXplb2Yodl9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHZfbGUpLCAmYiwgJnQpOworCWRtX3NtX2luY19ibG9jayhzbSwgYik7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFfYmxvY2tfZGVjKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlX2xlKQoreworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtID0gY29udGV4dDsKKwlfX2xlNjQgdl9sZTsKKwl1aW50NjRfdCBiOworCXVpbnQzMl90IHQ7CisKKwltZW1jcHkoJnZfbGUsIHZhbHVlX2xlLCBzaXplb2Yodl9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHZfbGUpLCAmYiwgJnQpOworCWRtX3NtX2RlY19ibG9jayhzbSwgYik7Cit9CisKK3N0YXRpYyBpbnQgZGF0YV9ibG9ja19lcXVhbCh2b2lkICpjb250ZXh0LCB2b2lkICp2YWx1ZTFfbGUsIHZvaWQgKnZhbHVlMl9sZSkKK3sKKwlfX2xlNjQgdjFfbGUsIHYyX2xlOworCXVpbnQ2NF90IGIxLCBiMjsKKwl1aW50MzJfdCB0OworCisJbWVtY3B5KCZ2MV9sZSwgdmFsdWUxX2xlLCBzaXplb2YodjFfbGUpKTsKKwltZW1jcHkoJnYyX2xlLCB2YWx1ZTJfbGUsIHNpemVvZih2Ml9sZSkpOworCXVucGFja19ibG9ja190aW1lKGxlNjRfdG9fY3B1KHYxX2xlKSwgJmIxLCAmdCk7CisJdW5wYWNrX2Jsb2NrX3RpbWUobGU2NF90b19jcHUodjJfbGUpLCAmYjIsICZ0KTsKKworCXJldHVybiBiMSA9PSBiMjsKK30KKworc3RhdGljIHZvaWQgc3VidHJlZV9pbmModm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpCit7CisJc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8gPSBjb250ZXh0OworCV9fbGU2NCByb290X2xlOworCXVpbnQ2NF90IHJvb3Q7CisKKwltZW1jcHkoJnJvb3RfbGUsIHZhbHVlLCBzaXplb2Yocm9vdF9sZSkpOworCXJvb3QgPSBsZTY0X3RvX2NwdShyb290X2xlKTsKKwlkbV90bV9pbmMoaW5mby0+dG0sIHJvb3QpOworfQorCitzdGF0aWMgdm9pZCBzdWJ0cmVlX2RlYyh2b2lkICpjb250ZXh0LCB2b2lkICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbyA9IGNvbnRleHQ7CisJX19sZTY0IHJvb3RfbGU7CisJdWludDY0X3Qgcm9vdDsKKworCW1lbWNweSgmcm9vdF9sZSwgdmFsdWUsIHNpemVvZihyb290X2xlKSk7CisJcm9vdCA9IGxlNjRfdG9fY3B1KHJvb3RfbGUpOworCWlmIChkbV9idHJlZV9kZWwoaW5mbywgcm9vdCkpCisJCURNRVJSKCJidHJlZSBkZWxldGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIGludCBzdWJ0cmVlX2VxdWFsKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlMV9sZSwgdm9pZCAqdmFsdWUyX2xlKQoreworCV9fbGU2NCB2MV9sZSwgdjJfbGU7CisJbWVtY3B5KCZ2MV9sZSwgdmFsdWUxX2xlLCBzaXplb2YodjFfbGUpKTsKKwltZW1jcHkoJnYyX2xlLCB2YWx1ZTJfbGUsIHNpemVvZih2Ml9sZSkpOworCisJcmV0dXJuIHYxX2xlID09IHYyX2xlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHN1cGVyYmxvY2tfYWxsX3plcm9lcyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGludCAqcmVzdWx0KQoreworCWludCByOworCXVuc2lnbmVkIGk7CisJc3RydWN0IGRtX2Jsb2NrICpiOworCV9fbGU2NCAqZGF0YV9sZSwgemVybyA9IGNwdV90b19sZTY0KDApOworCXVuc2lnbmVkIGJsb2NrX3NpemUgPSBkbV9ibV9ibG9ja19zaXplKGJtKSAvIHNpemVvZihfX2xlNjQpOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgYSB2YWxpZGF0b3IgaGVyZSAtIGl0IG1heSBiZSBhbGwgemVyb2VzLgorCSAqLworCXIgPSBkbV9ibV9yZWFkX2xvY2soYm0sIFRISU5fU1VQRVJCTE9DS19MT0NBVElPTiwgTlVMTCwgJmIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRhdGFfbGUgPSBkbV9ibG9ja19kYXRhKGIpOworCSpyZXN1bHQgPSAxOworCWZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKKwkJaWYgKGRhdGFfbGVbaV0gIT0gemVybykgeworCQkJKnJlc3VsdCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBkbV9ibV91bmxvY2soYik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9wbWQoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJICAgIGRtX2Jsb2NrX3QgbnJfYmxvY2tzLCBpbnQgY3JlYXRlKQoreworCWludCByOworCXN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCAqZGF0YV9zbTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX2Jsb2NrICpzYmxvY2s7CisKKwlpZiAoY3JlYXRlKSB7CisJCXIgPSBkbV90bV9jcmVhdGVfd2l0aF9zbShibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJCQkgJnNiX3ZhbGlkYXRvciwgJnRtLCAmc20sICZzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJ0bV9jcmVhdGVfd2l0aF9zbSBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZGF0YV9zbSA9IGRtX3NtX2Rpc2tfY3JlYXRlKHRtLCBucl9ibG9ja3MpOworCQlpZiAoSVNfRVJSKGRhdGFfc20pKSB7CisJCQlETUVSUigic21fZGlza19jcmVhdGUgZmFpbGVkIik7CisJCQlyID0gUFRSX0VSUihkYXRhX3NtKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrICpkaXNrX3N1cGVyID0gTlVMTDsKKwkJc2l6ZV90IHNwYWNlX21hcF9yb290X29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3QgdGhpbl9kaXNrX3N1cGVyYmxvY2ssIG1ldGFkYXRhX3NwYWNlX21hcF9yb290KTsKKworCQlyID0gZG1fdG1fb3Blbl93aXRoX3NtKGJtLCBUSElOX1NVUEVSQkxPQ0tfTE9DQVRJT04sCisJCQkJICAgICAgICZzYl92YWxpZGF0b3IsIHNwYWNlX21hcF9yb290X29mZnNldCwKKwkJCQkgICAgICAgU1BBQ0VfTUFQX1JPT1RfU0laRSwgJnRtLCAmc20sICZzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJ0bV9vcGVuX3dpdGhfc20gZmFpbGVkIik7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCWRpc2tfc3VwZXIgPSBkbV9ibG9ja19kYXRhKHNibG9jayk7CisJCWRhdGFfc20gPSBkbV9zbV9kaXNrX29wZW4odG0sIGRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QsCisJCQkJCSAgc2l6ZW9mKGRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QpKTsKKwkJaWYgKElTX0VSUihkYXRhX3NtKSkgeworCQkJRE1FUlIoInNtX2Rpc2tfb3BlbiBmYWlsZWQiKTsKKwkJCXIgPSBQVFJfRVJSKGRhdGFfc20pOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKworCXIgPSBkbV90bV91bmxvY2sodG0sIHNibG9jayk7CisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCJjb3VsZG4ndCB1bmxvY2sgc3VwZXJibG9jayIpOworCQlnb3RvIGJhZF9kYXRhX3NtOworCX0KKworCXBtZC0+Ym0gPSBibTsKKwlwbWQtPm1ldGFkYXRhX3NtID0gc207CisJcG1kLT5kYXRhX3NtID0gZGF0YV9zbTsKKwlwbWQtPnRtID0gdG07CisJcG1kLT5uYl90bSA9IGRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUodG0pOworCWlmICghcG1kLT5uYl90bSkgeworCQlETUVSUigiY291bGQgbm90IGNyZWF0ZSBjbG9uZSB0bSIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBiYWRfZGF0YV9zbTsKKwl9CisKKwlwbWQtPmluZm8udG0gPSB0bTsKKwlwbWQtPmluZm8ubGV2ZWxzID0gMjsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5jb250ZXh0ID0gcG1kLT5kYXRhX3NtOworCXBtZC0+aW5mby52YWx1ZV90eXBlLnNpemUgPSBzaXplb2YoX19sZTY0KTsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5pbmMgPSBkYXRhX2Jsb2NrX2luYzsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5kZWMgPSBkYXRhX2Jsb2NrX2RlYzsKKwlwbWQtPmluZm8udmFsdWVfdHlwZS5lcXVhbCA9IGRhdGFfYmxvY2tfZXF1YWw7CisKKwltZW1jcHkoJnBtZC0+bmJfaW5mbywgJnBtZC0+aW5mbywgc2l6ZW9mKHBtZC0+bmJfaW5mbykpOworCXBtZC0+bmJfaW5mby50bSA9IHBtZC0+bmJfdG07CisKKwlwbWQtPnRsX2luZm8udG0gPSB0bTsKKwlwbWQtPnRsX2luZm8ubGV2ZWxzID0gMTsKKwlwbWQtPnRsX2luZm8udmFsdWVfdHlwZS5jb250ZXh0ID0gJnBtZC0+aW5mbzsKKwlwbWQtPnRsX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKF9fbGU2NCk7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gc3VidHJlZV9pbmM7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gc3VidHJlZV9kZWM7CisJcG1kLT50bF9pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBzdWJ0cmVlX2VxdWFsOworCisJcG1kLT5ibF9pbmZvLnRtID0gdG07CisJcG1kLT5ibF9pbmZvLmxldmVscyA9IDE7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuY29udGV4dCA9IHBtZC0+ZGF0YV9zbTsKKwlwbWQtPmJsX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKF9fbGU2NCk7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gZGF0YV9ibG9ja19pbmM7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gZGF0YV9ibG9ja19kZWM7CisJcG1kLT5ibF9pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBkYXRhX2Jsb2NrX2VxdWFsOworCisJcG1kLT5kZXRhaWxzX2luZm8udG0gPSB0bTsKKwlwbWQtPmRldGFpbHNfaW5mby5sZXZlbHMgPSAxOworCXBtZC0+ZGV0YWlsc19pbmZvLnZhbHVlX3R5cGUuY29udGV4dCA9IE5VTEw7CisJcG1kLT5kZXRhaWxzX2luZm8udmFsdWVfdHlwZS5zaXplID0gc2l6ZW9mKHN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzKTsKKwlwbWQtPmRldGFpbHNfaW5mby52YWx1ZV90eXBlLmluYyA9IE5VTEw7CisJcG1kLT5kZXRhaWxzX2luZm8udmFsdWVfdHlwZS5kZWMgPSBOVUxMOworCXBtZC0+ZGV0YWlsc19pbmZvLnZhbHVlX3R5cGUuZXF1YWwgPSBOVUxMOworCisJcG1kLT5yb290ID0gMDsKKworCWluaXRfcndzZW0oJnBtZC0+cm9vdF9sb2NrKTsKKwlwbWQtPnRpbWUgPSAwOworCXBtZC0+bmVlZF9jb21taXQgPSAwOworCXBtZC0+ZGV0YWlsc19yb290ID0gMDsKKwlwbWQtPnRyYW5zX2lkID0gMDsKKwlwbWQtPmZsYWdzID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmcG1kLT50aGluX2RldmljZXMpOworCisJcmV0dXJuIDA7CisKK2JhZF9kYXRhX3NtOgorCWRtX3NtX2Rlc3Ryb3koZGF0YV9zbSk7CitiYWQ6CisJZG1fdG1fZGVzdHJveSh0bSk7CisJZG1fc21fZGVzdHJveShzbSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfX2JlZ2luX3RyYW5zYWN0aW9uKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisJdTMyIGZlYXR1cmVzOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKnNibG9jazsKKworCS8qCisJICogX19tYXliZV9jb21taXRfdHJhbnNhY3Rpb24oKSByZXNldHMgdGhlc2UKKwkgKi8KKwlXQVJOX09OKHBtZC0+bmVlZF9jb21taXQpOworCisJLyoKKwkgKiBXZSByZS1yZWFkIHRoZSBzdXBlcmJsb2NrIGV2ZXJ5IHRpbWUuICBTaG91bGRuJ3QgbmVlZCB0byBkbyB0aGlzCisJICogcmVhbGx5LgorCSAqLworCXIgPSBkbV9ibV9yZWFkX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICZzYl92YWxpZGF0b3IsICZzYmxvY2spOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRpc2tfc3VwZXIgPSBkbV9ibG9ja19kYXRhKHNibG9jayk7CisJcG1kLT50aW1lID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+dGltZSk7CisJcG1kLT5yb290ID0gbGU2NF90b19jcHUoZGlza19zdXBlci0+ZGF0YV9tYXBwaW5nX3Jvb3QpOworCXBtZC0+ZGV0YWlsc19yb290ID0gbGU2NF90b19jcHUoZGlza19zdXBlci0+ZGV2aWNlX2RldGFpbHNfcm9vdCk7CisJcG1kLT50cmFuc19pZCA9IGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPnRyYW5zX2lkKTsKKwlwbWQtPmZsYWdzID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+ZmxhZ3MpOworCXBtZC0+ZGF0YV9ibG9ja19zaXplID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+ZGF0YV9ibG9ja19zaXplKTsKKworCWZlYXR1cmVzID0gbGUzMl90b19jcHUoZGlza19zdXBlci0+aW5jb21wYXRfZmxhZ3MpICYgflRISU5fRkVBVFVSRV9JTkNPTVBBVF9TVVBQOworCWlmIChmZWF0dXJlcykgeworCQlETUVSUigiY291bGQgbm90IGFjY2VzcyBtZXRhZGF0YSBkdWUgdG8gIgorCQkgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCVseCkuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpZmVhdHVyZXMpOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgcmVhZC1vbmx5IG1ldGFkYXRhIHRvIHNraXAgdGhlIGZvbGxvd2luZyBSRFdSIGNoZWNrcy4KKwkgKi8KKwlpZiAoZ2V0X2Rpc2tfcm8ocG1kLT5iZGV2LT5iZF9kaXNrKSkKKwkJZ290byBvdXQ7CisKKwlmZWF0dXJlcyA9IGxlMzJfdG9fY3B1KGRpc2tfc3VwZXItPmNvbXBhdF9yb19mbGFncykgJiB+VEhJTl9GRUFUVVJFX0NPTVBBVF9ST19TVVBQOworCWlmIChmZWF0dXJlcykgeworCQlETUVSUigiY291bGQgbm90IGFjY2VzcyBtZXRhZGF0YSBSRFdSIGR1ZSB0byAiCisJCSAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJWx4KS4iLAorCQkgICAgICAodW5zaWduZWQgbG9uZylmZWF0dXJlcyk7CisJCXIgPSAtRUlOVkFMOworCX0KKworb3V0OgorCWRtX2JtX3VubG9jayhzYmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fd3JpdGVfY2hhbmdlZF9kZXRhaWxzKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgKnRtcDsKKwlzdHJ1Y3QgZGlza19kZXZpY2VfZGV0YWlscyBkZXRhaWxzOworCXVpbnQ2NF90IGtleTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0ZCwgdG1wLCAmcG1kLT50aGluX2RldmljZXMsIGxpc3QpIHsKKwkJaWYgKCF0ZC0+Y2hhbmdlZCkKKwkJCWNvbnRpbnVlOworCisJCWtleSA9IHRkLT5pZDsKKworCQlkZXRhaWxzLm1hcHBlZF9ibG9ja3MgPSBjcHVfdG9fbGU2NCh0ZC0+bWFwcGVkX2Jsb2Nrcyk7CisJCWRldGFpbHMudHJhbnNhY3Rpb25faWQgPSBjcHVfdG9fbGU2NCh0ZC0+dHJhbnNhY3Rpb25faWQpOworCQlkZXRhaWxzLmNyZWF0aW9uX3RpbWUgPSBjcHVfdG9fbGUzMih0ZC0+Y3JlYXRpb25fdGltZSk7CisJCWRldGFpbHMuc25hcHNob3R0ZWRfdGltZSA9IGNwdV90b19sZTMyKHRkLT5zbmFwc2hvdHRlZF90aW1lKTsKKwkJX19kbV9ibGVzc19mb3JfZGlzaygmZGV0YWlscyk7CisKKwkJciA9IGRtX2J0cmVlX2luc2VydCgmcG1kLT5kZXRhaWxzX2luZm8sIHBtZC0+ZGV0YWlsc19yb290LAorCQkJCSAgICAma2V5LCAmZGV0YWlscywgJnBtZC0+ZGV0YWlsc19yb290KTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlpZiAodGQtPm9wZW5fY291bnQpCisJCQl0ZC0+Y2hhbmdlZCA9IDA7CisJCWVsc2UgeworCQkJbGlzdF9kZWwoJnRkLT5saXN0KTsKKwkJCWtmcmVlKHRkKTsKKwkJfQorCisJCXBtZC0+bmVlZF9jb21taXQgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fY29tbWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJLyoKKwkgKiBGSVhNRTogQXNzb2NpYXRlZCBwb29sIHNob3VsZCBiZSBtYWRlIHJlYWQtb25seSBvbiBmYWlsdXJlLgorCSAqLworCWludCByOworCXNpemVfdCBtZXRhZGF0YV9sZW4sIGRhdGFfbGVuOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKnNibG9jazsKKworCS8qCisJICogV2UgbmVlZCB0byBrbm93IGlmIHRoZSB0aGluX2Rpc2tfc3VwZXJibG9jayBleGNlZWRzIGEgNTEyLWJ5dGUgc2VjdG9yLgorCSAqLworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrKSA+IDUxMik7CisKKwlyID0gX193cml0ZV9jaGFuZ2VkX2RldGFpbHMocG1kKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKCFwbWQtPm5lZWRfY29tbWl0KQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9jb21taXQocG1kLT5kYXRhX3NtKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJciA9IGRtX3RtX3ByZV9jb21taXQocG1kLT50bSk7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9yb290X3NpemUocG1kLT5tZXRhZGF0YV9zbSwgJm1ldGFkYXRhX2xlbik7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dDsKKworCXIgPSBkbV9zbV9yb290X3NpemUocG1kLT5tZXRhZGF0YV9zbSwgJmRhdGFfbGVuKTsKKwlpZiAociA8IDApCisJCWdvdG8gb3V0OworCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCWRpc2tfc3VwZXItPnRpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCWRpc2tfc3VwZXItPmRhdGFfbWFwcGluZ19yb290ID0gY3B1X3RvX2xlNjQocG1kLT5yb290KTsKKwlkaXNrX3N1cGVyLT5kZXZpY2VfZGV0YWlsc19yb290ID0gY3B1X3RvX2xlNjQocG1kLT5kZXRhaWxzX3Jvb3QpOworCWRpc2tfc3VwZXItPnRyYW5zX2lkID0gY3B1X3RvX2xlNjQocG1kLT50cmFuc19pZCk7CisJZGlza19zdXBlci0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihwbWQtPmZsYWdzKTsKKworCXIgPSBkbV9zbV9jb3B5X3Jvb3QocG1kLT5tZXRhZGF0YV9zbSwgJmRpc2tfc3VwZXItPm1ldGFkYXRhX3NwYWNlX21hcF9yb290LAorCQkJICAgIG1ldGFkYXRhX2xlbik7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dF9sb2NrZWQ7CisKKwlyID0gZG1fc21fY29weV9yb290KHBtZC0+ZGF0YV9zbSwgJmRpc2tfc3VwZXItPmRhdGFfc3BhY2VfbWFwX3Jvb3QsCisJCQkgICAgZGF0YV9sZW4pOworCWlmIChyIDwgMCkKKwkJZ290byBvdXRfbG9ja2VkOworCisJciA9IGRtX3RtX2NvbW1pdChwbWQtPnRtLCBzYmxvY2spOworCWlmICghcikKKwkJcG1kLT5uZWVkX2NvbW1pdCA9IDA7CisKK291dDoKKwlyZXR1cm4gcjsKKworb3V0X2xvY2tlZDoKKwlkbV9ibV91bmxvY2soc2Jsb2NrKTsKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKmRtX3Bvb2xfbWV0YWRhdGFfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkgICAgICAgc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplKQoreworCWludCByOworCXN0cnVjdCB0aGluX2Rpc2tfc3VwZXJibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kOworCXNlY3Rvcl90IGJkZXZfc2l6ZSA9IGlfc2l6ZV9yZWFkKGJkZXYtPmJkX2lub2RlKSA+PiBTRUNUT1JfU0hJRlQ7CisJc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtOworCWludCBjcmVhdGU7CisJc3RydWN0IGRtX2Jsb2NrICpzYmxvY2s7CisKKwlwbWQgPSBrbWFsbG9jKHNpemVvZigqcG1kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWQpIHsKKwkJRE1FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSBtZXRhZGF0YSBzdHJ1Y3QiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJLyoKKwkgKiBNYXggaGV4IGxvY2tzOgorCSAqICAzIGZvciBidHJlZSBpbnNlcnQgKworCSAqICAyIGZvciBidHJlZSBsb29rdXAgdXNlZCB3aXRoaW4gc3BhY2UgbWFwCisJICovCisJYm0gPSBkbV9ibG9ja19tYW5hZ2VyX2NyZWF0ZShiZGV2LCBUSElOX01FVEFEQVRBX0JMT0NLX1NJWkUsCisJCQkJICAgICBUSElOX01FVEFEQVRBX0NBQ0hFX1NJWkUsIDUpOworCWlmICghYm0pIHsKKwkJRE1FUlIoImNvdWxkIG5vdCBjcmVhdGUgYmxvY2sgbWFuYWdlciIpOworCQlrZnJlZShwbWQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyID0gc3VwZXJibG9ja19hbGxfemVyb2VzKGJtLCAmY3JlYXRlKTsKKwlpZiAocikgeworCQlkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3koYm0pOworCQlrZnJlZShwbWQpOworCQlyZXR1cm4gRVJSX1BUUihyKTsKKwl9CisKKworCXIgPSBpbml0X3BtZChwbWQsIGJtLCAwLCBjcmVhdGUpOworCWlmIChyKSB7CisJCWRtX2Jsb2NrX21hbmFnZXJfZGVzdHJveShibSk7CisJCWtmcmVlKHBtZCk7CisJCXJldHVybiBFUlJfUFRSKHIpOworCX0KKwlwbWQtPmJkZXYgPSBiZGV2OworCisJaWYgKCFjcmVhdGUpIHsKKwkJciA9IF9fYmVnaW5fdHJhbnNhY3Rpb24ocG1kKTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBiYWQ7CisJCXJldHVybiBwbWQ7CisJfQorCisJLyoKKwkgKiBDcmVhdGUuCisJICovCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCWRpc2tfc3VwZXItPm1hZ2ljID0gY3B1X3RvX2xlNjQoVEhJTl9TVVBFUkJMT0NLX01BR0lDKTsKKwlkaXNrX3N1cGVyLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoVEhJTl9WRVJTSU9OKTsKKwlkaXNrX3N1cGVyLT50aW1lID0gMDsKKwlkaXNrX3N1cGVyLT5tZXRhZGF0YV9ibG9ja19zaXplID0gY3B1X3RvX2xlMzIoVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFID4+IFNFQ1RPUl9TSElGVCk7CisJZGlza19zdXBlci0+bWV0YWRhdGFfbnJfYmxvY2tzID0gY3B1X3RvX2xlNjQoYmRldl9zaXplID4+IFNFQ1RPUl9UT19CTE9DS19TSElGVCk7CisJZGlza19zdXBlci0+ZGF0YV9ibG9ja19zaXplID0gY3B1X3RvX2xlMzIoZGF0YV9ibG9ja19zaXplKTsKKworCXIgPSBkbV9ibV91bmxvY2soc2Jsb2NrKTsKKwlpZiAociA8IDApCisJCWdvdG8gYmFkOworCisJciA9IGRtX2J0cmVlX2VtcHR5KCZwbWQtPmluZm8sICZwbWQtPnJvb3QpOworCWlmIChyIDwgMCkKKwkJZ290byBiYWQ7CisKKwlyID0gZG1fYnRyZWVfZW1wdHkoJnBtZC0+ZGV0YWlsc19pbmZvLCAmcG1kLT5kZXRhaWxzX3Jvb3QpOworCWlmIChyIDwgMCkgeworCQlETUVSUigiY291bGRuJ3QgY3JlYXRlIGRldmljZXMgcm9vdCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlwbWQtPmZsYWdzID0gMDsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKwlyID0gZG1fcG9vbF9jb21taXRfbWV0YWRhdGEocG1kKTsKKwlpZiAociA8IDApIHsKKwkJRE1FUlIoIiVzOiBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YSgpIGZhaWxlZCwgZXJyb3IgPSAlZCIsCisJCSAgICAgIF9fZnVuY19fLCByKTsKKwkJZ290byBiYWQ7CisJfQorCisJcmV0dXJuIHBtZDsKKworYmFkOgorCWlmIChkbV9wb29sX21ldGFkYXRhX2Nsb3NlKHBtZCkgPCAwKQorCQlETVdBUk4oIiVzOiBkbV9wb29sX21ldGFkYXRhX2Nsb3NlKCkgZmFpbGVkLiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gRVJSX1BUUihyKTsKK30KKworaW50IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBvcGVuX2RldmljZXMgPSAwOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsICp0bXA7CisKKwlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGQsIHRtcCwgJnBtZC0+dGhpbl9kZXZpY2VzLCBsaXN0KSB7CisJCWlmICh0ZC0+b3Blbl9jb3VudCkKKwkJCW9wZW5fZGV2aWNlcysrOworCQllbHNlIHsKKwkJCWxpc3RfZGVsKCZ0ZC0+bGlzdCk7CisJCQlrZnJlZSh0ZCk7CisJCX0KKwl9CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJaWYgKG9wZW5fZGV2aWNlcykgeworCQlETUVSUigiYXR0ZW1wdCB0byBjbG9zZSBwbWQgd2hlbiAldSBkZXZpY2UocykgYXJlIHN0aWxsIG9wZW4iLAorCQkgICAgICAgb3Blbl9kZXZpY2VzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyID0gX19jb21taXRfdHJhbnNhY3Rpb24ocG1kKTsKKwlpZiAociA8IDApCisJCURNV0FSTigiJXM6IF9fY29tbWl0X3RyYW5zYWN0aW9uKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJICAgICAgIF9fZnVuY19fLCByKTsKKworCWRtX3RtX2Rlc3Ryb3kocG1kLT50bSk7CisJZG1fdG1fZGVzdHJveShwbWQtPm5iX3RtKTsKKwlkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3kocG1kLT5ibSk7CisJZG1fc21fZGVzdHJveShwbWQtPm1ldGFkYXRhX3NtKTsKKwlkbV9zbV9kZXN0cm95KHBtZC0+ZGF0YV9zbSk7CisJa2ZyZWUocG1kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fb3Blbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSBkbV90aGluX2lkIGRldiwgaW50IGNyZWF0ZSwKKwkJCSBzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKip0ZCkKK3sKKwlpbnQgciwgY2hhbmdlZCA9IDA7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDI7CisJdWludDY0X3Qga2V5ID0gZGV2OworCXN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzIGRldGFpbHNfbGU7CisKKwkvKgorCSAqIENoZWNrIHRoZSBkZXZpY2UgaXNuJ3QgYWxyZWFkeSBvcGVuLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodGQyLCAmcG1kLT50aGluX2RldmljZXMsIGxpc3QpCisJCWlmICh0ZDItPmlkID09IGRldikgeworCQkJdGQyLT5vcGVuX2NvdW50Kys7CisJCQkqdGQgPSB0ZDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgZGV2aWNlIGV4aXN0cy4KKwkgKi8KKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPmRldGFpbHNfaW5mbywgcG1kLT5kZXRhaWxzX3Jvb3QsCisJCQkgICAgJmtleSwgJmRldGFpbHNfbGUpOworCWlmIChyKSB7CisJCWlmIChyICE9IC1FTk9EQVRBIHx8ICFjcmVhdGUpCisJCQlyZXR1cm4gcjsKKworCQljaGFuZ2VkID0gMTsKKwkJZGV0YWlsc19sZS5tYXBwZWRfYmxvY2tzID0gMDsKKwkJZGV0YWlsc19sZS50cmFuc2FjdGlvbl9pZCA9IGNwdV90b19sZTY0KHBtZC0+dHJhbnNfaWQpOworCQlkZXRhaWxzX2xlLmNyZWF0aW9uX3RpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCQlkZXRhaWxzX2xlLnNuYXBzaG90dGVkX3RpbWUgPSBjcHVfdG9fbGUzMihwbWQtPnRpbWUpOworCX0KKworCSp0ZCA9IGttYWxsb2Moc2l6ZW9mKCoqdGQpLCBHRlBfTk9JTyk7CisJaWYgKCEqdGQpCisJCXJldHVybiAtRU5PTUVNOworCisJKCp0ZCktPnBtZCA9IHBtZDsKKwkoKnRkKS0+aWQgPSBkZXY7CisJKCp0ZCktPm9wZW5fY291bnQgPSAxOworCSgqdGQpLT5jaGFuZ2VkID0gY2hhbmdlZDsKKwkoKnRkKS0+bWFwcGVkX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGRldGFpbHNfbGUubWFwcGVkX2Jsb2Nrcyk7CisJKCp0ZCktPnRyYW5zYWN0aW9uX2lkID0gbGU2NF90b19jcHUoZGV0YWlsc19sZS50cmFuc2FjdGlvbl9pZCk7CisJKCp0ZCktPmNyZWF0aW9uX3RpbWUgPSBsZTMyX3RvX2NwdShkZXRhaWxzX2xlLmNyZWF0aW9uX3RpbWUpOworCSgqdGQpLT5zbmFwc2hvdHRlZF90aW1lID0gbGUzMl90b19jcHUoZGV0YWlsc19sZS5zbmFwc2hvdHRlZF90aW1lKTsKKworCWxpc3RfYWRkKCYoKnRkKS0+bGlzdCwgJnBtZC0+dGhpbl9kZXZpY2VzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2Nsb3NlX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKQoreworCS0tdGQtPm9wZW5fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgX19jcmVhdGVfdGhpbihzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJIGRtX3RoaW5faWQgZGV2KQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGV2X3Jvb3Q7CisJdWludDY0X3Qga2V5ID0gZGV2OworCXN0cnVjdCBkaXNrX2RldmljZV9kZXRhaWxzIGRldGFpbHNfbGU7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDsKKwlfX2xlNjQgdmFsdWU7CisKKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPmRldGFpbHNfaW5mbywgcG1kLT5kZXRhaWxzX3Jvb3QsCisJCQkgICAgJmtleSwgJmRldGFpbHNfbGUpOworCWlmICghcikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKgorCSAqIENyZWF0ZSBhbiBlbXB0eSBidHJlZSBmb3IgdGhlIG1hcHBpbmdzLgorCSAqLworCXIgPSBkbV9idHJlZV9lbXB0eSgmcG1kLT5ibF9pbmZvLCAmZGV2X3Jvb3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qCisJICogSW5zZXJ0IGl0IGludG8gdGhlIG1haW4gbWFwcGluZyB0cmVlLgorCSAqLworCXZhbHVlID0gY3B1X3RvX2xlNjQoZGV2X3Jvb3QpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJnZhbHVlKTsKKwlyID0gZG1fYnRyZWVfaW5zZXJ0KCZwbWQtPnRsX2luZm8sIHBtZC0+cm9vdCwgJmtleSwgJnZhbHVlLCAmcG1kLT5yb290KTsKKwlpZiAocikgeworCQlkbV9idHJlZV9kZWwoJnBtZC0+YmxfaW5mbywgZGV2X3Jvb3QpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gX19vcGVuX2RldmljZShwbWQsIGRldiwgMSwgJnRkKTsKKwlpZiAocikgeworCQlfX2Nsb3NlX2RldmljZSh0ZCk7CisJCWRtX2J0cmVlX3JlbW92ZSgmcG1kLT50bF9pbmZvLCBwbWQtPnJvb3QsICZrZXksICZwbWQtPnJvb3QpOworCQlkbV9idHJlZV9kZWwoJnBtZC0+YmxfaW5mbywgZGV2X3Jvb3QpOworCQlyZXR1cm4gcjsKKwl9CisJdGQtPmNoYW5nZWQgPSAxOworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9jcmVhdGVfdGhpbihzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV90aGluX2lkIGRldikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19jcmVhdGVfdGhpbihwbWQsIGRldik7CisJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fc2V0X3NuYXBzaG90X2RldGFpbHMoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCQkgIHN0cnVjdCBkbV90aGluX2RldmljZSAqc25hcCwKKwkJCQkgIGRtX3RoaW5faWQgb3JpZ2luLCB1aW50MzJfdCB0aW1lKQoreworCWludCByOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQ7CisKKwlyID0gX19vcGVuX2RldmljZShwbWQsIG9yaWdpbiwgMCwgJnRkKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl0ZC0+Y2hhbmdlZCA9IDE7CisJdGQtPnNuYXBzaG90dGVkX3RpbWUgPSB0aW1lOworCisJc25hcC0+bWFwcGVkX2Jsb2NrcyA9IHRkLT5tYXBwZWRfYmxvY2tzOworCXNuYXAtPnNuYXBzaG90dGVkX3RpbWUgPSB0aW1lOworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fY3JlYXRlX3NuYXAoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSBkbV90aGluX2lkIGRldiwgZG1fdGhpbl9pZCBvcmlnaW4pCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBvcmlnaW5fcm9vdDsKKwl1aW50NjRfdCBrZXkgPSBvcmlnaW4sIGRldl9rZXkgPSBkZXY7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZDsKKwlzdHJ1Y3QgZGlza19kZXZpY2VfZGV0YWlscyBkZXRhaWxzX2xlOworCV9fbGU2NCB2YWx1ZTsKKworCS8qIGNoZWNrIHRoaXMgZGV2aWNlIGlzIHVudXNlZCAqLworCXIgPSBkbV9idHJlZV9sb29rdXAoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSAgICAmZGV2X2tleSwgJmRldGFpbHNfbGUpOworCWlmICghcikKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKiBmaW5kIHRoZSBtYXBwaW5nIHRyZWUgZm9yIHRoZSBvcmlnaW4gKi8KKwlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPnRsX2luZm8sIHBtZC0+cm9vdCwgJmtleSwgJnZhbHVlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJb3JpZ2luX3Jvb3QgPSBsZTY0X3RvX2NwdSh2YWx1ZSk7CisKKwkvKiBjbG9uZSB0aGUgb3JpZ2luLCBhbiBpbmMgd2lsbCBkbyAqLworCWRtX3RtX2luYyhwbWQtPnRtLCBvcmlnaW5fcm9vdCk7CisKKwkvKiBpbnNlcnQgaW50byB0aGUgbWFpbiBtYXBwaW5nIHRyZWUgKi8KKwl2YWx1ZSA9IGNwdV90b19sZTY0KG9yaWdpbl9yb290KTsKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZ2YWx1ZSk7CisJa2V5ID0gZGV2OworCXIgPSBkbV9idHJlZV9pbnNlcnQoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmdmFsdWUsICZwbWQtPnJvb3QpOworCWlmIChyKSB7CisJCWRtX3RtX2RlYyhwbWQtPnRtLCBvcmlnaW5fcm9vdCk7CisJCXJldHVybiByOworCX0KKworCXBtZC0+dGltZSsrOworCisJciA9IF9fb3Blbl9kZXZpY2UocG1kLCBkZXYsIDEsICZ0ZCk7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJciA9IF9fc2V0X3NuYXBzaG90X2RldGFpbHMocG1kLCB0ZCwgb3JpZ2luLCBwbWQtPnRpbWUpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCV9fY2xvc2VfZGV2aWNlKHRkKTsKKwlyZXR1cm4gMDsKKworYmFkOgorCV9fY2xvc2VfZGV2aWNlKHRkKTsKKwlkbV9idHJlZV9yZW1vdmUoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmcG1kLT5yb290KTsKKwlkbV9idHJlZV9yZW1vdmUoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSZrZXksICZwbWQtPmRldGFpbHNfcm9vdCk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2NyZWF0ZV9zbmFwKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJIGRtX3RoaW5faWQgZGV2LAorCQkJCSBkbV90aGluX2lkIG9yaWdpbikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19jcmVhdGVfc25hcChwbWQsIGRldiwgb3JpZ2luKTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19kZWxldGVfZGV2aWNlKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX3RoaW5faWQgZGV2KQoreworCWludCByOworCXVpbnQ2NF90IGtleSA9IGRldjsKKwlzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkOworCisJLyogVE9ETzogZmFpbHVyZSBzaG91bGQgbWFyayB0aGUgdHJhbnNhY3Rpb24gaW52YWxpZCAqLworCXIgPSBfX29wZW5fZGV2aWNlKHBtZCwgZGV2LCAwLCAmdGQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmICh0ZC0+b3Blbl9jb3VudCA+IDEpIHsKKwkJX19jbG9zZV9kZXZpY2UodGQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxpc3RfZGVsKCZ0ZC0+bGlzdCk7CisJa2ZyZWUodGQpOworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+ZGV0YWlsc19pbmZvLCBwbWQtPmRldGFpbHNfcm9vdCwKKwkJCSAgICAma2V5LCAmcG1kLT5kZXRhaWxzX3Jvb3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAma2V5LCAmcG1kLT5yb290KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fcG9vbF9kZWxldGVfdGhpbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwKKwkJCSAgICAgICBkbV90aGluX2lkIGRldikKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19kZWxldGVfZGV2aWNlKHBtZCwgZGV2KTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX3NldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCBjdXJyZW50X2lkLAorCQkJCQl1aW50NjRfdCBuZXdfaWQpCit7CisJZG93bl93cml0ZSgmcG1kLT5yb290X2xvY2spOworCWlmIChwbWQtPnRyYW5zX2lkICE9IGN1cnJlbnRfaWQpIHsKKwkJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKwkJRE1FUlIoIm1pc21hdGNoZWQgdHJhbnNhY3Rpb24gaWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcG1kLT50cmFuc19pZCA9IG5ld19pZDsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCAqcmVzdWx0KQoreworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSBwbWQtPnRyYW5zX2lkOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZ2V0X2hlbGRfbWV0YWRhdGFfcm9vdChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCSAgICBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IHRoaW5fZGlza19zdXBlcmJsb2NrICpkaXNrX3N1cGVyOworCXN0cnVjdCBkbV9ibG9jayAqc2Jsb2NrOworCisJciA9IGRtX2JtX3dyaXRlX2xvY2socG1kLT5ibSwgVEhJTl9TVVBFUkJMT0NLX0xPQ0FUSU9OLAorCQkJICAgICAmc2JfdmFsaWRhdG9yLCAmc2Jsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlkaXNrX3N1cGVyID0gZG1fYmxvY2tfZGF0YShzYmxvY2spOworCSpyZXN1bHQgPSBsZTY0X3RvX2NwdShkaXNrX3N1cGVyLT5oZWxkX3Jvb3QpOworCisJcmV0dXJuIGRtX2JtX3VubG9jayhzYmxvY2spOworfQorCitpbnQgZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IF9fZ2V0X2hlbGRfbWV0YWRhdGFfcm9vdChwbWQsIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX29wZW5fdGhpbl9kZXZpY2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fdGhpbl9pZCBkZXYsCisJCQkgICAgIHN0cnVjdCBkbV90aGluX2RldmljZSAqKnRkKQoreworCWludCByOworCisJZG93bl93cml0ZSgmcG1kLT5yb290X2xvY2spOworCXIgPSBfX29wZW5fZGV2aWNlKHBtZCwgZGV2LCAwLCB0ZCk7CisJdXBfd3JpdGUoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9jbG9zZV90aGluX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKQoreworCWRvd25fd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisJX19jbG9zZV9kZXZpY2UodGQpOworCXVwX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2RtX3RoaW5faWQgZG1fdGhpbl9kZXZfaWQoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCkKK3sKKwlyZXR1cm4gdGQtPmlkOworfQorCitzdGF0aWMgaW50IF9fc25hcHNob3R0ZWRfc2luY2Uoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgdWludDMyX3QgdGltZSkKK3sKKwlyZXR1cm4gdGQtPnNuYXBzaG90dGVkX3RpbWUgPiB0aW1lOworfQorCitpbnQgZG1fdGhpbl9maW5kX2Jsb2NrKHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgYmxvY2ssCisJCSAgICAgICBpbnQgY2FuX2Jsb2NrLCBzdHJ1Y3QgZG1fdGhpbl9sb29rdXBfcmVzdWx0ICpyZXN1bHQpCit7CisJaW50IHI7CisJdWludDY0X3QgYmxvY2tfdGltZSA9IDA7CisJX19sZTY0IHZhbHVlOworCXN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQgPSB0ZC0+cG1kOworCWRtX2Jsb2NrX3Qga2V5c1syXSA9IHsgdGQtPmlkLCBibG9jayB9OworCisJaWYgKGNhbl9ibG9jaykgeworCQlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwkJciA9IGRtX2J0cmVlX2xvb2t1cCgmcG1kLT5pbmZvLCBwbWQtPnJvb3QsIGtleXMsICZ2YWx1ZSk7CisJCWlmICghcikKKwkJCWJsb2NrX3RpbWUgPSBsZTY0X3RvX2NwdSh2YWx1ZSk7CisJCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCX0gZWxzZSBpZiAoZG93bl9yZWFkX3RyeWxvY2soJnBtZC0+cm9vdF9sb2NrKSkgeworCQlyID0gZG1fYnRyZWVfbG9va3VwKCZwbWQtPm5iX2luZm8sIHBtZC0+cm9vdCwga2V5cywgJnZhbHVlKTsKKwkJaWYgKCFyKQorCQkJYmxvY2tfdGltZSA9IGxlNjRfdG9fY3B1KHZhbHVlKTsKKwkJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJfSBlbHNlCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlpZiAoIXIpIHsKKwkJZG1fYmxvY2tfdCBleGNlcHRpb25fYmxvY2s7CisJCXVpbnQzMl90IGV4Y2VwdGlvbl90aW1lOworCQl1bnBhY2tfYmxvY2tfdGltZShibG9ja190aW1lLCAmZXhjZXB0aW9uX2Jsb2NrLAorCQkJCSAgJmV4Y2VwdGlvbl90aW1lKTsKKwkJcmVzdWx0LT5ibG9jayA9IGV4Y2VwdGlvbl9ibG9jazsKKwkJcmVzdWx0LT5zaGFyZWQgPSBfX3NuYXBzaG90dGVkX3NpbmNlKHRkLCBleGNlcHRpb25fdGltZSk7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19pbnNlcnQoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaywKKwkJICAgIGRtX2Jsb2NrX3QgZGF0YV9ibG9jaykKK3sKKwlpbnQgciwgaW5zZXJ0ZWQ7CisJX19sZTY0IHZhbHVlOworCXN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQgPSB0ZC0+cG1kOworCWRtX2Jsb2NrX3Qga2V5c1syXSA9IHsgdGQtPmlkLCBibG9jayB9OworCisJcG1kLT5uZWVkX2NvbW1pdCA9IDE7CisJdmFsdWUgPSBjcHVfdG9fbGU2NChwYWNrX2Jsb2NrX3RpbWUoZGF0YV9ibG9jaywgcG1kLT50aW1lKSk7CisJX19kbV9ibGVzc19mb3JfZGlzaygmdmFsdWUpOworCisJciA9IGRtX2J0cmVlX2luc2VydF9ub3RpZnkoJnBtZC0+aW5mbywgcG1kLT5yb290LCBrZXlzLCAmdmFsdWUsCisJCQkJICAgJnBtZC0+cm9vdCwgJmluc2VydGVkKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoaW5zZXJ0ZWQpIHsKKwkJdGQtPm1hcHBlZF9ibG9ja3MrKzsKKwkJdGQtPmNoYW5nZWQgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG1fdGhpbl9pbnNlcnRfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaywKKwkJCSBkbV9ibG9ja190IGRhdGFfYmxvY2spCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCXIgPSBfX2luc2VydCh0ZCwgYmxvY2ssIGRhdGFfYmxvY2spOworCXVwX3dyaXRlKCZ0ZC0+cG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgX19yZW1vdmUoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaykKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKwlkbV9ibG9ja190IGtleXNbMl0gPSB7IHRkLT5pZCwgYmxvY2sgfTsKKworCXIgPSBkbV9idHJlZV9yZW1vdmUoJnBtZC0+aW5mbywgcG1kLT5yb290LCBrZXlzLCAmcG1kLT5yb290KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fdGhpbl9yZW1vdmVfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBibG9jaykKK3sKKwlpbnQgcjsKKworCWRvd25fd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisJciA9IF9fcmVtb3ZlKHRkLCBibG9jayk7CisJdXBfd3JpdGUoJnRkLT5wbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfYWxsb2NfZGF0YV9ibG9jayhzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyID0gZG1fc21fbmV3X2Jsb2NrKHBtZC0+ZGF0YV9zbSwgcmVzdWx0KTsKKwlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXVwX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyID0gX19jb21taXRfdHJhbnNhY3Rpb24ocG1kKTsKKwlpZiAociA8PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogT3BlbiB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKwkgKi8KKwlyID0gX19iZWdpbl90cmFuc2FjdGlvbihwbWQpOworb3V0OgorCXVwX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgKnJlc3VsdCkKK3sKKwlpbnQgcjsKKworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCXIgPSBkbV9zbV9nZXRfbnJfZnJlZShwbWQtPmRhdGFfc20sIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9mcmVlX21ldGFkYXRhX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9mcmVlKHBtZC0+bWV0YWRhdGFfc20sIHJlc3VsdCk7CisJdXBfcmVhZCgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV9kZXZfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5tZXRhZGF0YV9zbSwgcmVzdWx0KTsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3Bvb2xfZ2V0X2RhdGFfYmxvY2tfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBzZWN0b3JfdCAqcmVzdWx0KQoreworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSBwbWQtPmRhdGFfYmxvY2tfc2l6ZTsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3Bvb2xfZ2V0X2RhdGFfZGV2X3NpemUoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCisJZG93bl9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5kYXRhX3NtLCByZXN1bHQpOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fdGhpbl9nZXRfbWFwcGVkX2NvdW50KHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKworCWRvd25fcmVhZCgmcG1kLT5yb290X2xvY2spOworCSpyZXN1bHQgPSB0ZC0+bWFwcGVkX2Jsb2NrczsKKwl1cF9yZWFkKCZwbWQtPnJvb3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2hpZ2hlc3RfYmxvY2soc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCV9fbGU2NCB2YWx1ZV9sZTsKKwlkbV9ibG9ja190IHRoaW5fcm9vdDsKKwlzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kID0gdGQtPnBtZDsKKworCXIgPSBkbV9idHJlZV9sb29rdXAoJnBtZC0+dGxfaW5mbywgcG1kLT5yb290LCAmdGQtPmlkLCAmdmFsdWVfbGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXRoaW5fcm9vdCA9IGxlNjRfdG9fY3B1KHZhbHVlX2xlKTsKKworCXJldHVybiBkbV9idHJlZV9maW5kX2hpZ2hlc3Rfa2V5KCZwbWQtPmJsX2luZm8sIHRoaW5fcm9vdCwgcmVzdWx0KTsKK30KKworaW50IGRtX3RoaW5fZ2V0X2hpZ2hlc3RfbWFwcGVkX2Jsb2NrKHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsCisJCQkJICAgICBkbV9ibG9ja190ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCA9IHRkLT5wbWQ7CisKKwlkb3duX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKwlyID0gX19oaWdoZXN0X2Jsb2NrKHRkLCByZXN1bHQpOworCXVwX3JlYWQoJnBtZC0+cm9vdF9sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fcmVzaXplX2RhdGFfZGV2KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgbmV3X2NvdW50KQoreworCWludCByOworCWRtX2Jsb2NrX3Qgb2xkX2NvdW50OworCisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3MocG1kLT5kYXRhX3NtLCAmb2xkX2NvdW50KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAobmV3X2NvdW50ID09IG9sZF9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV3X2NvdW50IDwgb2xkX2NvdW50KSB7CisJCURNRVJSKCJjYW5ub3QgcmVkdWNlIHNpemUgb2YgZGF0YSBkZXZpY2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJciA9IGRtX3NtX2V4dGVuZChwbWQtPmRhdGFfc20sIG5ld19jb3VudCAtIG9sZF9jb3VudCk7CisJaWYgKCFyKQorCQlwbWQtPm5lZWRfY29tbWl0ID0gMTsKKworCXJldHVybiByOworfQorCitpbnQgZG1fcG9vbF9yZXNpemVfZGF0YV9kZXYoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCBuZXdfY291bnQpCit7CisJaW50IHI7CisKKwlkb3duX3dyaXRlKCZwbWQtPnJvb3RfbG9jayk7CisJciA9IF9fcmVzaXplX2RhdGFfZGV2KHBtZCwgbmV3X2NvdW50KTsKKwl1cF93cml0ZSgmcG1kLT5yb290X2xvY2spOworCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4tbWV0YWRhdGEuaCBiL2RyaXZlcnMvbWQvZG0tdGhpbi1tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWMxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL2RtLXRoaW4tbWV0YWRhdGEuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1RISU5fTUVUQURBVEFfSAorI2RlZmluZSBETV9USElOX01FVEFEQVRBX0gKKworI2luY2x1ZGUgInBlcnNpc3RlbnQtZGF0YS9kbS1ibG9jay1tYW5hZ2VyLmgiCisKKyNkZWZpbmUgVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFIDQwOTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGE7CitzdHJ1Y3QgZG1fdGhpbl9kZXZpY2U7CisKKy8qCisgKiBEZXZpY2UgaWRlbnRpZmllcgorICovCit0eXBlZGVmIHVpbnQ2NF90IGRtX3RoaW5faWQ7CisKKy8qCisgKiBSZW9wZW5zIG9yIGNyZWF0ZXMgYSBuZXcsIGVtcHR5IG1ldGFkYXRhIHZvbHVtZS4KKyAqLworc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKmRtX3Bvb2xfbWV0YWRhdGFfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkgICAgICAgc2VjdG9yX3QgZGF0YV9ibG9ja19zaXplKTsKKworaW50IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2Uoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCk7CisKKy8qCisgKiBDb21wYXQgZmVhdHVyZSBmbGFncy4gIEFueSBpbmNvbXBhdCBmbGFncyBiZXlvbmQgdGhlIG9uZXMKKyAqIHNwZWNpZmllZCBiZWxvdyB3aWxsIHByZXZlbnQgdXNlIG9mIHRoZSB0aGluIG1ldGFkYXRhLgorICovCisjZGVmaW5lIFRISU5fRkVBVFVSRV9DT01QQVRfU1VQUAkgIDBVTAorI2RlZmluZSBUSElOX0ZFQVRVUkVfQ09NUEFUX1JPX1NVUFAJICAwVUwKKyNkZWZpbmUgVEhJTl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJICAwVUwKKworLyoKKyAqIERldmljZSBjcmVhdGlvbi9kZWxldGlvbi4KKyAqLworaW50IGRtX3Bvb2xfY3JlYXRlX3RoaW4oc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fdGhpbl9pZCBkZXYpOworCisvKgorICogQW4gaW50ZXJuYWwgc25hcHNob3QuCisgKgorICogWW91IGNhbiBvbmx5IHNuYXBzaG90IGEgcXVpZXNjZWQgb3JpZ2luIGkuZS4gb25lIHRoYXQgaXMgZWl0aGVyCisgKiBzdXNwZW5kZWQgb3Igbm90IGluc3RhbmNlZCBhdCBhbGwuCisgKi8KK2ludCBkbV9wb29sX2NyZWF0ZV9zbmFwKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX3RoaW5faWQgZGV2LAorCQkJZG1fdGhpbl9pZCBvcmlnaW4pOworCisvKgorICogRGVsZXRlcyBhIHZpcnR1YWwgZGV2aWNlIGZyb20gdGhlIG1ldGFkYXRhLiAgSXQgX2lzXyBzYWZlIHRvIGNhbGwgdGhpcworICogd2hlbiB0aGF0IGRldmljZSBpcyBvcGVuLiAgT3BlcmF0aW9ucyBvbiB0aGF0IGRldmljZSB3aWxsIGp1c3Qgc3RhcnQKKyAqIGZhaWxpbmcuICBZb3Ugc3RpbGwgbmVlZCB0byBjYWxsIGNsb3NlKCkgb24gdGhlIGRldmljZS4KKyAqLworaW50IGRtX3Bvb2xfZGVsZXRlX3RoaW5fZGV2aWNlKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkgICAgICAgZG1fdGhpbl9pZCBkZXYpOworCisvKgorICogQ29tbWl0cyBfYWxsXyBtZXRhZGF0YSBjaGFuZ2VzOiBkZXZpY2UgY3JlYXRpb24sIGRlbGV0aW9uLCBtYXBwaW5nCisgKiB1cGRhdGVzLgorICovCitpbnQgZG1fcG9vbF9jb21taXRfbWV0YWRhdGEoc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCk7CisKKy8qCisgKiBTZXQvZ2V0IHVzZXJzcGFjZSB0cmFuc2FjdGlvbiBpZC4KKyAqLworaW50IGRtX3Bvb2xfc2V0X21ldGFkYXRhX3RyYW5zYWN0aW9uX2lkKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCXVpbnQ2NF90IGN1cnJlbnRfaWQsCisJCQkJCXVpbnQ2NF90IG5ld19pZCk7CisKK2ludCBkbV9wb29sX2dldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLAorCQkJCQl1aW50NjRfdCAqcmVzdWx0KTsKKworLyoKKyAqIEhvbGQvZ2V0IHJvb3QgZm9yIHVzZXJzcGFjZSB0cmFuc2FjdGlvbi4KKyAqLworaW50IGRtX3Bvb2xfaG9sZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQpOworCitpbnQgZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICAgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworLyoKKyAqIEFjdGlvbnMgb24gYSBzaW5nbGUgdmlydHVhbCBkZXZpY2UuCisgKi8KKworLyoKKyAqIE9wZW5pbmcgdGhlIHNhbWUgZGV2aWNlIG1vcmUgdGhhbiBvbmNlIHdpbGwgZmFpbCB3aXRoIC1FQlVTWS4KKyAqLworaW50IGRtX3Bvb2xfb3Blbl90aGluX2RldmljZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV90aGluX2lkIGRldiwKKwkJCSAgICAgc3RydWN0IGRtX3RoaW5fZGV2aWNlICoqdGQpOworCitpbnQgZG1fcG9vbF9jbG9zZV90aGluX2RldmljZShzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKTsKKworZG1fdGhpbl9pZCBkbV90aGluX2Rldl9pZChzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkKTsKKworc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCB7CisJZG1fYmxvY2tfdCBibG9jazsKKwlpbnQgc2hhcmVkOworfTsKKworLyoKKyAqIFJldHVybnM6CisgKiAgIC1FV09VTERCTE9DSyBpZmYgQGNhbl9ibG9jayBpcyBzZXQgYW5kIHdvdWxkIGJsb2NrLgorICogICAtRU5PREFUQSBpZmYgdGhhdCBtYXBwaW5nIGlzIG5vdCBwcmVzZW50LgorICogICAwIHN1Y2Nlc3MKKyAqLworaW50IGRtX3RoaW5fZmluZF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrLAorCQkgICAgICAgaW50IGNhbl9ibG9jaywgc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCAqcmVzdWx0KTsKKworLyoKKyAqIE9idGFpbiBhbiB1bnVzZWQgYmxvY2suCisgKi8KK2ludCBkbV9wb29sX2FsbG9jX2RhdGFfYmxvY2soc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZCwgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworLyoKKyAqIEluc2VydCBvciByZW1vdmUgYmxvY2suCisgKi8KK2ludCBkbV90aGluX2luc2VydF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrLAorCQkJIGRtX2Jsb2NrX3QgZGF0YV9ibG9jayk7CisKK2ludCBkbV90aGluX3JlbW92ZV9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLCBkbV9ibG9ja190IGJsb2NrKTsKKworLyoKKyAqIFF1ZXJpZXMuCisgKi8KK2ludCBkbV90aGluX2dldF9oaWdoZXN0X21hcHBlZF9ibG9jayhzdHJ1Y3QgZG1fdGhpbl9kZXZpY2UgKnRkLAorCQkJCSAgICAgZG1fYmxvY2tfdCAqaGlnaGVzdF9tYXBwZWQpOworCitpbnQgZG1fdGhpbl9nZXRfbWFwcGVkX2NvdW50KHN0cnVjdCBkbV90aGluX2RldmljZSAqdGQsIGRtX2Jsb2NrX3QgKnJlc3VsdCk7CisKK2ludCBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJIGRtX2Jsb2NrX3QgKnJlc3VsdCk7CisKK2ludCBkbV9wb29sX2dldF9mcmVlX21ldGFkYXRhX2Jsb2NrX2NvdW50KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJCSAgZG1fYmxvY2tfdCAqcmVzdWx0KTsKKworaW50IGRtX3Bvb2xfZ2V0X21ldGFkYXRhX2Rldl9zaXplKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsCisJCQkJICBkbV9ibG9ja190ICpyZXN1bHQpOworCitpbnQgZG1fcG9vbF9nZXRfZGF0YV9ibG9ja19zaXplKHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIHNlY3Rvcl90ICpyZXN1bHQpOworCitpbnQgZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZShzdHJ1Y3QgZG1fcG9vbF9tZXRhZGF0YSAqcG1kLCBkbV9ibG9ja190ICpyZXN1bHQpOworCisvKgorICogUmV0dXJucyAtRU5PU1BDIGlmIHRoZSBuZXcgc2l6ZSBpcyB0b28gc21hbGwgYW5kIGFscmVhZHkgYWxsb2NhdGVkCisgKiBibG9ja3Mgd291bGQgYmUgbG9zdC4KKyAqLworaW50IGRtX3Bvb2xfcmVzaXplX2RhdGFfZGV2KHN0cnVjdCBkbV9wb29sX21ldGFkYXRhICpwbWQsIGRtX2Jsb2NrX3QgbmV3X3NpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jIGIvZHJpdmVycy9tZC9kbS10aGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwODc1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBAIC0wLDAgKzEsMjQyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0IFVLLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS10aGluLW1ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbS1rY29weWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZQlETV9NU0dfUFJFRklYCSJ0aGluIgorCisvKgorICogVHVuYWJsZSBjb25zdGFudHMKKyAqLworI2RlZmluZSBFTkRJT19IT09LX1BPT0xfU0laRSAxMDI0MAorI2RlZmluZSBERUZFUlJFRF9TRVRfU0laRSA2NAorI2RlZmluZSBNQVBQSU5HX1BPT0xfU0laRSAxMDI0CisjZGVmaW5lIFBSSVNPTl9DRUxMUyAxMDI0CisKKy8qCisgKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgZGV2aWNlIGhvbGRpbmcgcG9vbCBkYXRhIG11c3QgYmUKKyAqIGJldHdlZW4gNjRLQiBhbmQgMUdCLgorICovCisjZGVmaW5lIERBVEFfREVWX0JMT0NLX1NJWkVfTUlOX1NFQ1RPUlMgKDY0ICogMTAyNCA+PiBTRUNUT1JfU0hJRlQpCisjZGVmaW5lIERBVEFfREVWX0JMT0NLX1NJWkVfTUFYX1NFQ1RPUlMgKDEwMjQgKiAxMDI0ICogMTAyNCA+PiBTRUNUT1JfU0hJRlQpCisKKy8qCisgKiBUaGUgbWV0YWRhdGEgZGV2aWNlIGlzIGN1cnJlbnRseSBsaW1pdGVkIGluIHNpemUuICBUaGUgbGltaXRhdGlvbiBpcworICogY2hlY2tlZCBsb3dlciBkb3duIGluIGRtLXNwYWNlLW1hcC1tZXRhZGF0YSwgYnV0IHdlIGFsc28gY2hlY2sgaXQgaGVyZQorICogc28gd2UgY2FuIGZhaWwgZWFybHkuCisgKgorICogV2UgaGF2ZSBvbmUgYmxvY2sgb2YgaW5kZXgsIHdoaWNoIGNhbiBob2xkIDI1NSBpbmRleCBlbnRyaWVzLiAgRWFjaAorICogaW5kZXggZW50cnkgY29udGFpbnMgYWxsb2NhdGlvbiBpbmZvIGFib3V0IDE2ayBtZXRhZGF0YSBibG9ja3MuCisgKi8KKyNkZWZpbmUgTUVUQURBVEFfREVWX01BWF9TRUNUT1JTICgyNTUgKiAoMSA8PCAxNCkgKiAoVEhJTl9NRVRBREFUQV9CTE9DS19TSVpFIC8gKDEgPDwgU0VDVE9SX1NISUZUKSkpCisKKy8qCisgKiBEZXZpY2UgaWQgaXMgcmVzdHJpY3RlZCB0byAyNCBiaXRzLgorICovCisjZGVmaW5lIE1BWF9ERVZfSUQgKCgxIDw8IDI0KSAtIDEpCisKKy8qCisgKiBIb3cgZG8gd2UgaGFuZGxlIGJyZWFraW5nIHNoYXJpbmcgb2YgZGF0YSBibG9ja3M/CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogV2UgdXNlIGEgc3RhbmRhcmQgY29weS1vbi13cml0ZSBidHJlZSB0byBzdG9yZSB0aGUgbWFwcGluZ3MgZm9yIHRoZQorICogZGV2aWNlcyAobm90ZSBJJ20gdGFsa2luZyBhYm91dCBjb3B5LW9uLXdyaXRlIG9mIHRoZSBtZXRhZGF0YSBoZXJlLCBub3QKKyAqIHRoZSBkYXRhKS4gIFdoZW4geW91IHRha2UgYW4gaW50ZXJuYWwgc25hcHNob3QgeW91IGNsb25lIHRoZSByb290IG5vZGUKKyAqIG9mIHRoZSBvcmlnaW4gYnRyZWUuICBBZnRlciB0aGlzIHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYW4gb3JpZ2luIG9yIGEKKyAqIHNuYXBzaG90LiAgVGhleSBhcmUganVzdCB0d28gZGV2aWNlIHRyZWVzIHRoYXQgaGFwcGVuIHRvIHBvaW50IHRvIHRoZQorICogc2FtZSBkYXRhIGJsb2Nrcy4KKyAqCisgKiBXaGVuIHdlIGdldCBhIHdyaXRlIGluIHdlIGRlY2lkZSBpZiBpdCdzIHRvIGEgc2hhcmVkIGRhdGEgYmxvY2sgdXNpbmcKKyAqIHNvbWUgdGltZXN0YW1wIG1hZ2ljLiAgSWYgaXQgaXMsIHdlIGhhdmUgdG8gYnJlYWsgc2hhcmluZy4KKyAqCisgKiBMZXQncyBzYXkgd2Ugd3JpdGUgdG8gYSBzaGFyZWQgYmxvY2sgaW4gd2hhdCB3YXMgdGhlIG9yaWdpbi4gIFRoZQorICogc3RlcHMgYXJlOgorICoKKyAqIGkpIHBsdWcgaW8gZnVydGhlciB0byB0aGlzIHBoeXNpY2FsIGJsb2NrLiAoc2VlIGJpb19wcmlzb24gY29kZSkuCisgKgorICogaWkpIHF1aWVzY2UgYW55IHJlYWQgaW8gdG8gdGhhdCBzaGFyZWQgZGF0YSBibG9jay4gIE9idmlvdXNseQorICogaW5jbHVkaW5nIGFsbCBkZXZpY2VzIHRoYXQgc2hhcmUgdGhpcyBibG9jay4gIChzZWUgZGVmZXJyZWRfc2V0IGNvZGUpCisgKgorICogaWlpKSBjb3B5IHRoZSBkYXRhIGJsb2NrIHRvIGEgbmV3bHkgYWxsb2NhdGUgYmxvY2suICBUaGlzIHN0ZXAgY2FuIGJlCisgKiBtaXNzZWQgb3V0IGlmIHRoZSBpbyBjb3ZlcnMgdGhlIGJsb2NrLiAoc2NoZWR1bGVfY29weSkuCisgKgorICogaXYpIGluc2VydCB0aGUgbmV3IG1hcHBpbmcgaW50byB0aGUgb3JpZ2luJ3MgYnRyZWUKKyAqIChwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmdzKS4gIFRoaXMgYWN0IG9mIGluc2VydGluZyBicmVha3Mgc29tZQorICogc2hhcmluZyBvZiBidHJlZSBub2RlcyBiZXR3ZWVuIHRoZSB0d28gZGV2aWNlcy4gIEJyZWFraW5nIHNoYXJpbmcgb25seQorICogZWZmZWN0cyB0aGUgYnRyZWUgb2YgdGhhdCBzcGVjaWZpYyBkZXZpY2UuICBCdHJlZXMgZm9yIHRoZSBvdGhlcgorICogZGV2aWNlcyB0aGF0IHNoYXJlIHRoZSBibG9jayBuZXZlciBjaGFuZ2UuICBUaGUgYnRyZWUgZm9yIHRoZSBvcmlnaW4KKyAqIGRldmljZSBhcyBpdCB3YXMgYWZ0ZXIgdGhlIGxhc3QgY29tbWl0IGlzIHVudG91Y2hlZCwgaWUuIHdlJ3JlIHVzaW5nCisgKiBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBzZW5zZS4KKyAqCisgKiB2KSB1bnBsdWcgaW8gdG8gdGhpcyBwaHlzaWNhbCBibG9jaywgaW5jbHVkaW5nIHRoZSBpbyB0aGF0IHRyaWdnZXJlZAorICogdGhlIGJyZWFraW5nIG9mIHNoYXJpbmcuCisgKgorICogU3RlcHMgKGlpKSBhbmQgKGlpaSkgb2NjdXIgaW4gcGFyYWxsZWwuCisgKgorICogVGhlIG1ldGFkYXRhIF9kb2Vzbid0XyBuZWVkIHRvIGJlIGNvbW1pdHRlZCBiZWZvcmUgdGhlIGlvIGNvbnRpbnVlcy4gIFdlCisgKiBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSB0aGUgaW8gaXMgYWx3YXlzIHdyaXR0ZW4gdG8gYSBfbmV3XyBibG9jay4KKyAqIElmIHRoZXJlJ3MgYSBjcmFzaCwgdGhlbjoKKyAqCisgKiAtIFRoZSBvcmlnaW4gbWFwcGluZyB3aWxsIHBvaW50IHRvIHRoZSBvbGQgb3JpZ2luIGJsb2NrICh0aGUgc2hhcmVkCisgKiBvbmUpLiAgVGhpcyB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgYXMgaXQgd2FzIGJlZm9yZSB0aGUgaW8gdGhhdCB0cmlnZ2VyZWQKKyAqIHRoZSBicmVha2luZyBvZiBzaGFyaW5nIGNhbWUgaW4uCisgKgorICogLSBUaGUgc25hcCBtYXBwaW5nIHN0aWxsIHBvaW50cyB0byB0aGUgb2xkIGJsb2NrLiAgQXMgaXQgd291bGQgYWZ0ZXIKKyAqIHRoZSBjb21taXQuCisgKgorICogVGhlIGRvd25zaWRlIG9mIHRoaXMgc2NoZW1lIGlzIHRoZSB0aW1lc3RhbXAgbWFnaWMgaXNuJ3QgcGVyZmVjdCwgYW5kCisgKiB3aWxsIGNvbnRpbnVlIHRvIHRoaW5rIHRoYXQgZGF0YSBibG9jayBpbiB0aGUgc25hcHNob3QgZGV2aWNlIGlzIHNoYXJlZAorICogZXZlbiBhZnRlciB0aGUgd3JpdGUgdG8gdGhlIG9yaWdpbiBoYXMgYnJva2VuIHNoYXJpbmcuICBJIHN1c3BlY3QgZGF0YQorICogYmxvY2tzIHdpbGwgdHlwaWNhbGx5IGJlIHNoYXJlZCBieSBtYW55IGRpZmZlcmVudCBkZXZpY2VzLCBzbyB3ZSdyZQorICogYnJlYWtpbmcgc2hhcmluZyBuICsgMSB0aW1lcywgcmF0aGVyIHRoYW4gbiwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mCisgKiBkZXZpY2VzIHRoYXQgcmVmZXJlbmNlIHRoaXMgZGF0YSBibG9jay4gIEF0IHRoZSBtb21lbnQgSSB0aGluayB0aGUKKyAqIGJlbmVmaXRzIGZhciwgZmFyIG91dHdlaWdoIHRoZSBkaXNhZHZhbnRhZ2VzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTb21ldGltZXMgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgYmlvIHN0cmFpZ2h0IGF3YXkuICBXZSBwdXQgdGhlbSBpbiBwcmlzb24KKyAqIHdoZXJlIHRoZXkgY2FuJ3QgY2F1c2UgYW55IG1pc2NoaWVmLiAgQmlvcyBhcmUgcHV0IGluIGEgY2VsbCBpZGVudGlmaWVkCisgKiBieSBhIGtleSwgbXVsdGlwbGUgYmlvcyBjYW4gYmUgaW4gdGhlIHNhbWUgY2VsbC4gIFdoZW4gdGhlIGNlbGwgaXMKKyAqIHN1YnNlcXVlbnRseSB1bmxvY2tlZCB0aGUgYmlvcyBiZWNvbWUgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgYmlvX3ByaXNvbjsKKworc3RydWN0IGNlbGxfa2V5IHsKKwlpbnQgdmlydHVhbDsKKwlkbV90aGluX2lkIGRldjsKKwlkbV9ibG9ja190IGJsb2NrOworfTsKKworc3RydWN0IGNlbGwgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbjsKKwlzdHJ1Y3QgY2VsbF9rZXkga2V5OworCXVuc2lnbmVkIGNvdW50OworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworfTsKKworc3RydWN0IGJpb19wcmlzb24geworCXNwaW5sb2NrX3QgbG9jazsKKwltZW1wb29sX3QgKmNlbGxfcG9vbDsKKworCXVuc2lnbmVkIG5yX2J1Y2tldHM7CisJdW5zaWduZWQgaGFzaF9tYXNrOworCXN0cnVjdCBobGlzdF9oZWFkICpjZWxsczsKK307CisKK3N0YXRpYyB1aW50MzJfdCBjYWxjX25yX2J1Y2tldHModW5zaWduZWQgbnJfY2VsbHMpCit7CisJdWludDMyX3QgbiA9IDEyODsKKworCW5yX2NlbGxzIC89IDQ7CisJbnJfY2VsbHMgPSBtaW4obnJfY2VsbHMsIDgxOTJ1KTsKKworCXdoaWxlIChuIDwgbnJfY2VsbHMpCisJCW4gPDw9IDE7CisKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIEBucl9jZWxscyBzaG91bGQgYmUgdGhlIG51bWJlciBvZiBjZWxscyB5b3Ugd2FudCBpbiB1c2UgX2NvbmN1cnJlbnRseV8uCisgKiBEb24ndCBjb25mdXNlIGl0IHdpdGggdGhlIG51bWJlciBvZiBkaXN0aW5jdCBrZXlzLgorICovCitzdGF0aWMgc3RydWN0IGJpb19wcmlzb24gKnByaXNvbl9jcmVhdGUodW5zaWduZWQgbnJfY2VsbHMpCit7CisJdW5zaWduZWQgaTsKKwl1aW50MzJfdCBucl9idWNrZXRzID0gY2FsY19ucl9idWNrZXRzKG5yX2NlbGxzKTsKKwlzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBiaW9fcHJpc29uKSArCisJCShzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpICogbnJfYnVja2V0cyk7CisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHJpc29uKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pbml0KCZwcmlzb24tPmxvY2spOworCXByaXNvbi0+Y2VsbF9wb29sID0gbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKG5yX2NlbGxzLAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgY2VsbCkpOworCWlmICghcHJpc29uLT5jZWxsX3Bvb2wpIHsKKwkJa2ZyZWUocHJpc29uKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJpc29uLT5ucl9idWNrZXRzID0gbnJfYnVja2V0czsKKwlwcmlzb24tPmhhc2hfbWFzayA9IG5yX2J1Y2tldHMgLSAxOworCXByaXNvbi0+Y2VsbHMgPSAoc3RydWN0IGhsaXN0X2hlYWQgKikgKHByaXNvbiArIDEpOworCWZvciAoaSA9IDA7IGkgPCBucl9idWNrZXRzOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRChwcmlzb24tPmNlbGxzICsgaSk7CisKKwlyZXR1cm4gcHJpc29uOworfQorCitzdGF0aWMgdm9pZCBwcmlzb25fZGVzdHJveShzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uKQoreworCW1lbXBvb2xfZGVzdHJveShwcmlzb24tPmNlbGxfcG9vbCk7CisJa2ZyZWUocHJpc29uKTsKK30KKworc3RhdGljIHVpbnQzMl90IGhhc2hfa2V5KHN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24sIHN0cnVjdCBjZWxsX2tleSAqa2V5KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgQklHX1BSSU1FID0gNDI5NDk2NzI5MVVMOworCXVpbnQ2NF90IGhhc2ggPSBrZXktPmJsb2NrICogQklHX1BSSU1FOworCisJcmV0dXJuICh1aW50MzJfdCkgKGhhc2ggJiBwcmlzb24tPmhhc2hfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQga2V5c19lcXVhbChzdHJ1Y3QgY2VsbF9rZXkgKmxocywgc3RydWN0IGNlbGxfa2V5ICpyaHMpCit7CisJICAgICAgIHJldHVybiAobGhzLT52aXJ0dWFsID09IHJocy0+dmlydHVhbCkgJiYKKwkJICAgICAgIChsaHMtPmRldiA9PSByaHMtPmRldikgJiYKKwkJICAgICAgIChsaHMtPmJsb2NrID09IHJocy0+YmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGNlbGwgKl9fc2VhcmNoX2J1Y2tldChzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0LAorCQkJCSAgICBzdHJ1Y3QgY2VsbF9rZXkgKmtleSkKK3sKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2VsbCwgdG1wLCBidWNrZXQsIGxpc3QpCisJCWlmIChrZXlzX2VxdWFsKCZjZWxsLT5rZXksIGtleSkpCisJCQlyZXR1cm4gY2VsbDsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogVGhpcyBtYXkgYmxvY2sgaWYgYSBuZXcgY2VsbCBuZWVkcyBhbGxvY2F0aW5nLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKKyAqIGNlbGxzIHdpbGwgYmUgdW5sb2NrZWQgZXZlbiBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgYmxvY2tlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VsbCBwcmlvciB0byB0aGUgbmV3IGFkZGl0aW9uCisgKiBvciA8IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBiaW9fZGV0YWluKHN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24sIHN0cnVjdCBjZWxsX2tleSAqa2V5LAorCQkgICAgICBzdHJ1Y3QgYmlvICppbm1hdGUsIHN0cnVjdCBjZWxsICoqcmVmKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgaGFzaCA9IGhhc2hfa2V5KHByaXNvbiwga2V5KTsKKwlzdHJ1Y3QgY2VsbCAqdW5pbml0aWFsaXplZF92YXIoY2VsbCksICpjZWxsMiA9IE5VTEw7CisKKwlCVUdfT04oaGFzaCA+IHByaXNvbi0+bnJfYnVja2V0cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisJY2VsbCA9IF9fc2VhcmNoX2J1Y2tldChwcmlzb24tPmNlbGxzICsgaGFzaCwga2V5KTsKKworCWlmICghY2VsbCkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIG5ldyBjZWxsCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKwkJY2VsbDIgPSBtZW1wb29sX2FsbG9jKHByaXNvbi0+Y2VsbF9wb29sLCBHRlBfTk9JTyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBXZSd2ZSBiZWVuIHVubG9ja2VkLCBzbyB3ZSBoYXZlIHRvIGRvdWJsZSBjaGVjayB0aGF0CisJCSAqIG5vYm9keSBlbHNlIGhhcyBpbnNlcnRlZCB0aGlzIGNlbGwgaW4gdGhlIG1lYW50aW1lLgorCQkgKi8KKwkJY2VsbCA9IF9fc2VhcmNoX2J1Y2tldChwcmlzb24tPmNlbGxzICsgaGFzaCwga2V5KTsKKworCQlpZiAoIWNlbGwpIHsKKwkJCWNlbGwgPSBjZWxsMjsKKwkJCWNlbGwyID0gTlVMTDsKKworCQkJY2VsbC0+cHJpc29uID0gcHJpc29uOworCQkJbWVtY3B5KCZjZWxsLT5rZXksIGtleSwgc2l6ZW9mKGNlbGwtPmtleSkpOworCQkJY2VsbC0+Y291bnQgPSAwOworCQkJYmlvX2xpc3RfaW5pdCgmY2VsbC0+Ymlvcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmY2VsbC0+bGlzdCwgcHJpc29uLT5jZWxscyArIGhhc2gpOworCQl9CisJfQorCisJciA9IGNlbGwtPmNvdW50Kys7CisJYmlvX2xpc3RfYWRkKCZjZWxsLT5iaW9zLCBpbm1hdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNlbGwyKQorCQltZW1wb29sX2ZyZWUoY2VsbDIsIHByaXNvbi0+Y2VsbF9wb29sKTsKKworCSpyZWYgPSBjZWxsOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBAaW5tYXRlcyBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZCBwcmlvciB0byB0aGlzIGNhbGwKKyAqLworc3RhdGljIHZvaWQgX19jZWxsX3JlbGVhc2Uoc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW9fbGlzdCAqaW5tYXRlcykKK3sKKwlzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uID0gY2VsbC0+cHJpc29uOworCisJaGxpc3RfZGVsKCZjZWxsLT5saXN0KTsKKworCWlmIChpbm1hdGVzKQorCQliaW9fbGlzdF9tZXJnZShpbm1hdGVzLCAmY2VsbC0+Ymlvcyk7CisKKwltZW1wb29sX2ZyZWUoY2VsbCwgcHJpc29uLT5jZWxsX3Bvb2wpOworfQorCitzdGF0aWMgdm9pZCBjZWxsX3JlbGVhc2Uoc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW9fbGlzdCAqYmlvcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24gPSBjZWxsLT5wcmlzb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisJX19jZWxsX3JlbGVhc2UoY2VsbCwgYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgcGxhY2VzIHdoZXJlIHdlIHB1dCBhIGJpbyBpbnRvIGEgY2VsbCBicmllZmx5CisgKiBiZWZvcmUgdGFraW5nIGl0IG91dCBhZ2Fpbi4gIEluIHRoZXNlIHNpdHVhdGlvbnMgd2Uga25vdyB0aGF0IG5vIG90aGVyCisgKiBiaW8gbWF5IGJlIGluIHRoZSBjZWxsLiAgVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgY2VsbCwgYW5kIGFsc28gZG9lcworICogYSBzYW5pdHkgY2hlY2suCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfcmVsZWFzZV9zaW5nbGV0b24oc3RydWN0IGNlbGwgKmNlbGwsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmlvX3ByaXNvbiAqcHJpc29uID0gY2VsbC0+cHJpc29uOworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworCXN0cnVjdCBiaW8gKmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJpb19saXN0X2luaXQoJmJpb3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXNvbi0+bG9jaywgZmxhZ3MpOworCV9fY2VsbF9yZWxlYXNlKGNlbGwsICZiaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKworCWIgPSBiaW9fbGlzdF9wb3AoJmJpb3MpOworCUJVR19PTihiICE9IGJpbyk7CisJQlVHX09OKCFiaW9fbGlzdF9lbXB0eSgmYmlvcykpOworfQorCitzdGF0aWMgdm9pZCBjZWxsX2Vycm9yKHN0cnVjdCBjZWxsICpjZWxsKQoreworCXN0cnVjdCBiaW9fcHJpc29uICpwcmlzb24gPSBjZWxsLT5wcmlzb247CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisJc3RydWN0IGJpbyAqYmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcmlzb24tPmxvY2ssIGZsYWdzKTsKKwlfX2NlbGxfcmVsZWFzZShjZWxsLCAmYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpc29uLT5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQliaW9faW9fZXJyb3IoYmlvKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFdlIHVzZSB0aGUgZGVmZXJyZWQgc2V0IHRvIGtlZXAgdHJhY2sgb2YgcGVuZGluZyByZWFkcyB0byBzaGFyZWQgYmxvY2tzLgorICogV2UgZG8gdGhpcyB0byBlbnN1cmUgdGhlIG5ldyBtYXBwaW5nIGNhdXNlZCBieSBhIHdyaXRlIGlzbid0IHBlcmZvcm1lZAorICogdW50aWwgdGhlc2UgcHJpb3IgcmVhZHMgaGF2ZSBjb21wbGV0ZWQuICBPdGhlcndpc2UgdGhlIGluc2VydGlvbiBvZiB0aGUKKyAqIG5ldyBtYXBwaW5nIGNvdWxkIGZyZWUgdGhlIG9sZCBibG9jayB0aGF0IHRoZSByZWFkIGJpb3MgYXJlIG1hcHBlZCB0by4KKyAqLworCitzdHJ1Y3QgZGVmZXJyZWRfc2V0Oworc3RydWN0IGRlZmVycmVkX2VudHJ5IHsKKwlzdHJ1Y3QgZGVmZXJyZWRfc2V0ICpkczsKKwl1bnNpZ25lZCBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdvcmtfaXRlbXM7Cit9OworCitzdHJ1Y3QgZGVmZXJyZWRfc2V0IHsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgY3VycmVudF9lbnRyeTsKKwl1bnNpZ25lZCBzd2VlcGVyOworCXN0cnVjdCBkZWZlcnJlZF9lbnRyeSBlbnRyaWVzW0RFRkVSUkVEX1NFVF9TSVpFXTsKK307CisKK3N0YXRpYyB2b2lkIGRzX2luaXQoc3RydWN0IGRlZmVycmVkX3NldCAqZHMpCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmZHMtPmxvY2spOworCWRzLT5jdXJyZW50X2VudHJ5ID0gMDsKKwlkcy0+c3dlZXBlciA9IDA7CisJZm9yIChpID0gMDsgaSA8IERFRkVSUkVEX1NFVF9TSVpFOyBpKyspIHsKKwkJZHMtPmVudHJpZXNbaV0uZHMgPSBkczsKKwkJZHMtPmVudHJpZXNbaV0uY291bnQgPSAwOworCQlJTklUX0xJU1RfSEVBRCgmZHMtPmVudHJpZXNbaV0ud29ya19pdGVtcyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGRlZmVycmVkX2VudHJ5ICpkc19pbmMoc3RydWN0IGRlZmVycmVkX3NldCAqZHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGVmZXJyZWRfZW50cnkgKmVudHJ5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzLT5sb2NrLCBmbGFncyk7CisJZW50cnkgPSBkcy0+ZW50cmllcyArIGRzLT5jdXJyZW50X2VudHJ5OworCWVudHJ5LT5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkc19uZXh0KHVuc2lnbmVkIGluZGV4KQoreworCXJldHVybiAoaW5kZXggKyAxKSAlIERFRkVSUkVEX1NFVF9TSVpFOworfQorCitzdGF0aWMgdm9pZCBfX3N3ZWVwKHN0cnVjdCBkZWZlcnJlZF9zZXQgKmRzLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXdoaWxlICgoZHMtPnN3ZWVwZXIgIT0gZHMtPmN1cnJlbnRfZW50cnkpICYmCisJICAgICAgICFkcy0+ZW50cmllc1tkcy0+c3dlZXBlcl0uY291bnQpIHsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmZHMtPmVudHJpZXNbZHMtPnN3ZWVwZXJdLndvcmtfaXRlbXMsIGhlYWQpOworCQlkcy0+c3dlZXBlciA9IGRzX25leHQoZHMtPnN3ZWVwZXIpOworCX0KKworCWlmICgoZHMtPnN3ZWVwZXIgPT0gZHMtPmN1cnJlbnRfZW50cnkpICYmICFkcy0+ZW50cmllc1tkcy0+c3dlZXBlcl0uY291bnQpCisJCWxpc3Rfc3BsaWNlX2luaXQoJmRzLT5lbnRyaWVzW2RzLT5zd2VlcGVyXS53b3JrX2l0ZW1zLCBoZWFkKTsKK30KKworc3RhdGljIHZvaWQgZHNfZGVjKHN0cnVjdCBkZWZlcnJlZF9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbnRyeS0+ZHMtPmxvY2ssIGZsYWdzKTsKKwlCVUdfT04oIWVudHJ5LT5jb3VudCk7CisJLS1lbnRyeS0+Y291bnQ7CisJX19zd2VlcChlbnRyeS0+ZHMsIGhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVudHJ5LT5kcy0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogUmV0dXJucyAxIGlmIGRlZmVycmVkIG9yIDAgaWYgbm8gcGVuZGluZyBpdGVtcyB0byBkZWxheSBqb2IuCisgKi8KK3N0YXRpYyBpbnQgZHNfYWRkX3dvcmsoc3RydWN0IGRlZmVycmVkX3NldCAqZHMsIHN0cnVjdCBsaXN0X2hlYWQgKndvcmspCit7CisJaW50IHIgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbmV4dF9lbnRyeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcy0+bG9jaywgZmxhZ3MpOworCWlmICgoZHMtPnN3ZWVwZXIgPT0gZHMtPmN1cnJlbnRfZW50cnkpICYmCisJICAgICFkcy0+ZW50cmllc1tkcy0+Y3VycmVudF9lbnRyeV0uY291bnQpCisJCXIgPSAwOworCWVsc2UgeworCQlsaXN0X2FkZCh3b3JrLCAmZHMtPmVudHJpZXNbZHMtPmN1cnJlbnRfZW50cnldLndvcmtfaXRlbXMpOworCQluZXh0X2VudHJ5ID0gZHNfbmV4dChkcy0+Y3VycmVudF9lbnRyeSk7CisJCWlmICghZHMtPmVudHJpZXNbbmV4dF9lbnRyeV0uY291bnQpCisJCQlkcy0+Y3VycmVudF9lbnRyeSA9IG5leHRfZW50cnk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEtleSBidWlsZGluZy4KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfZGF0YV9rZXkoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwKKwkJCSAgIGRtX2Jsb2NrX3QgYiwgc3RydWN0IGNlbGxfa2V5ICprZXkpCit7CisJa2V5LT52aXJ0dWFsID0gMDsKKwlrZXktPmRldiA9IGRtX3RoaW5fZGV2X2lkKHRkKTsKKwlrZXktPmJsb2NrID0gYjsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfdmlydHVhbF9rZXkoc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCwgZG1fYmxvY2tfdCBiLAorCQkJICAgICAgc3RydWN0IGNlbGxfa2V5ICprZXkpCit7CisJa2V5LT52aXJ0dWFsID0gMTsKKwlrZXktPmRldiA9IGRtX3RoaW5fZGV2X2lkKHRkKTsKKwlrZXktPmJsb2NrID0gYjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEEgcG9vbCBkZXZpY2UgdGllcyB0b2dldGhlciBhIG1ldGFkYXRhIGRldmljZSBhbmQgYSBkYXRhIGRldmljZS4gIEl0CisgKiBhbHNvIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGludGVybmFsCisgKiBkZXZpY2VzLgorICovCitzdHJ1Y3QgbmV3X21hcHBpbmc7CitzdHJ1Y3QgcG9vbCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBkbV90YXJnZXQgKnRpOwkvKiBPbmx5IHNldCBpZiBhIHBvb2wgdGFyZ2V0IGlzIGJvdW5kICovCisKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZF9kZXY7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKworCXVpbnQzMl90IHNlY3RvcnNfcGVyX2Jsb2NrOworCXVuc2lnbmVkIGJsb2NrX3NoaWZ0OworCWRtX2Jsb2NrX3Qgb2Zmc2V0X21hc2s7CisJZG1fYmxvY2tfdCBsb3dfd2F0ZXJfYmxvY2tzOworCisJdW5zaWduZWQgemVyb19uZXdfYmxvY2tzOjE7CisJdW5zaWduZWQgbG93X3dhdGVyX3RyaWdnZXJlZDoxOwkvKiBBIGRtIGV2ZW50IGhhcyBiZWVuIHNlbnQgKi8KKwl1bnNpZ25lZCBub19mcmVlX3NwYWNlOjE7CS8qIEEgLUVOT1NQQyB3YXJuaW5nIGhhcyBiZWVuIGlzc3VlZCAqLworCisJc3RydWN0IGJpb19wcmlzb24gKnByaXNvbjsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqY29waWVyOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrZXI7CisKKwl1bnNpZ25lZCByZWZfY291bnQ7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGJpb19saXN0IGRlZmVycmVkX2Jpb3M7CisJc3RydWN0IGJpb19saXN0IGRlZmVycmVkX2ZsdXNoX2Jpb3M7CisJc3RydWN0IGxpc3RfaGVhZCBwcmVwYXJlZF9tYXBwaW5nczsKKworCXN0cnVjdCBiaW9fbGlzdCByZXRyeV9vbl9yZXN1bWVfbGlzdDsKKworCXN0cnVjdCBkZWZlcnJlZF9zZXQgZHM7CS8qIEZJWE1FOiBtb3ZlIHRvIHRoaW5fYyAqLworCisJc3RydWN0IG5ld19tYXBwaW5nICpuZXh0X21hcHBpbmc7CisJbWVtcG9vbF90ICptYXBwaW5nX3Bvb2w7CisJbWVtcG9vbF90ICplbmRpb19ob29rX3Bvb2w7Cit9OworCisvKgorICogVGFyZ2V0IGNvbnRleHQgZm9yIGEgcG9vbC4KKyAqLworc3RydWN0IHBvb2xfYyB7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IGRtX2RldiAqZGF0YV9kZXY7CisJc3RydWN0IGRtX2RldiAqbWV0YWRhdGFfZGV2OworCXN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzIGNhbGxiYWNrczsKKworCWRtX2Jsb2NrX3QgbG93X3dhdGVyX2Jsb2NrczsKKwl1bnNpZ25lZCB6ZXJvX25ld19ibG9ja3M6MTsKK307CisKKy8qCisgKiBUYXJnZXQgY29udGV4dCBmb3IgYSB0aGluLgorICovCitzdHJ1Y3QgdGhpbl9jIHsKKwlzdHJ1Y3QgZG1fZGV2ICpwb29sX2RldjsKKwlkbV90aGluX2lkIGRldl9pZDsKKworCXN0cnVjdCBwb29sICpwb29sOworCXN0cnVjdCBkbV90aGluX2RldmljZSAqdGQ7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQSBnbG9iYWwgbGlzdCBvZiBwb29scyB0aGF0IHVzZXMgYSBzdHJ1Y3QgbWFwcGVkX2RldmljZSBhcyBhIGtleS4KKyAqLworc3RhdGljIHN0cnVjdCBkbV90aGluX3Bvb2xfdGFibGUgeworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvb2xzOworfSBkbV90aGluX3Bvb2xfdGFibGU7CisKK3N0YXRpYyB2b2lkIHBvb2xfdGFibGVfaW5pdCh2b2lkKQoreworCW11dGV4X2luaXQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmRtX3RoaW5fcG9vbF90YWJsZS5wb29scyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcG9vbF90YWJsZV9pbnNlcnQoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCkpOworCWxpc3RfYWRkKCZwb29sLT5saXN0LCAmZG1fdGhpbl9wb29sX3RhYmxlLnBvb2xzKTsKK30KKworc3RhdGljIHZvaWQgX19wb29sX3RhYmxlX3JlbW92ZShzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisJbGlzdF9kZWwoJnBvb2wtPmxpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHBvb2wgKl9fcG9vbF90YWJsZV9sb29rdXAoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXN0cnVjdCBwb29sICpwb29sID0gTlVMTCwgKnRtcDsKKworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmZG1fdGhpbl9wb29sX3RhYmxlLnBvb2xzLCBsaXN0KSB7CisJCWlmICh0bXAtPnBvb2xfbWQgPT0gbWQpIHsKKwkJCXBvb2wgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBwb29sOworfQorCitzdGF0aWMgc3RydWN0IHBvb2wgKl9fcG9vbF90YWJsZV9sb29rdXBfbWV0YWRhdGFfZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKm1kX2RldikKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IE5VTEwsICp0bXA7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmRtX3RoaW5fcG9vbF90YWJsZS5wb29scywgbGlzdCkgeworCQlpZiAodG1wLT5tZF9kZXYgPT0gbWRfZGV2KSB7CisJCQlwb29sID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcG9vbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgX19yZXF1ZXVlX2Jpb19saXN0KHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgYmlvX2xpc3QgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKwliaW9fbGlzdF9tZXJnZSgmYmlvcywgbWFzdGVyKTsKKwliaW9fbGlzdF9pbml0KG1hc3Rlcik7CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKSB7CisJCWlmIChkbV9nZXRfbWFwaW5mbyhiaW8pLT5wdHIgPT0gdGMpCisJCQliaW9fZW5kaW8oYmlvLCBETV9FTkRJT19SRVFVRVVFKTsKKwkJZWxzZQorCQkJYmlvX2xpc3RfYWRkKG1hc3RlciwgYmlvKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVldWVfaW8oc3RydWN0IHRoaW5fYyAqdGMpCit7CisJc3RydWN0IHBvb2wgKnBvb2wgPSB0Yy0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlfX3JlcXVldWVfYmlvX2xpc3QodGMsICZwb29sLT5kZWZlcnJlZF9iaW9zKTsKKwlfX3JlcXVldWVfYmlvX2xpc3QodGMsICZwb29sLT5yZXRyeV9vbl9yZXN1bWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyBzZWN0aW9uIG9mIGNvZGUgY29udGFpbnMgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIGEgdGhpbiBkZXZpY2UncyBJTy4KKyAqIE11Y2ggb2YgdGhlIGNvZGUgZGVwZW5kcyBvbiBwb29sIG9iamVjdCByZXNvdXJjZXMgKGxpc3RzLCB3b3JrcXVldWVzLCBldGMpCisgKiBidXQgbW9zdCBpcyBleGNsdXNpdmVseSBjYWxsZWQgZnJvbSB0aGUgdGhpbiB0YXJnZXQgcmF0aGVyIHRoYW4gdGhlIHRoaW4tcG9vbAorICogdGFyZ2V0LgorICovCisKK3N0YXRpYyBkbV9ibG9ja190IGdldF9iaW9fYmxvY2soc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlyZXR1cm4gYmlvLT5iaV9zZWN0b3IgPj4gdGMtPnBvb2wtPmJsb2NrX3NoaWZ0OworfQorCitzdGF0aWMgdm9pZCByZW1hcChzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLCBkbV9ibG9ja190IGJsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisKKwliaW8tPmJpX2JkZXYgPSB0Yy0+cG9vbF9kZXYtPmJkZXY7CisJYmlvLT5iaV9zZWN0b3IgPSAoYmxvY2sgPDwgcG9vbC0+YmxvY2tfc2hpZnQpICsKKwkJKGJpby0+Ymlfc2VjdG9yICYgcG9vbC0+b2Zmc2V0X21hc2spOworfQorCitzdGF0aWMgdm9pZCByZW1hcF9hbmRfaXNzdWUoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbywKKwkJCSAgICBkbV9ibG9ja190IGJsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJlbWFwKHRjLCBiaW8sIGJsb2NrKTsKKworCS8qCisJICogQmF0Y2ggdG9nZXRoZXIgYW55IEZVQS9GTFVTSCBiaW9zIHdlIGZpbmQgYW5kIHRoZW4gaXNzdWUKKwkgKiBhIHNpbmdsZSBjb21taXQgZm9yIHRoZW0gaW4gcHJvY2Vzc19kZWZlcnJlZF9iaW9zKCkuCisJICovCisJaWYgKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJYmlvX2xpc3RfYWRkKCZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zLCBiaW8pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7Cit9CisKKy8qCisgKiB3YWtlX3dvcmtlcigpIGlzIHVzZWQgd2hlbiBuZXcgd29yayBpcyBxdWV1ZWQgYW5kIHdoZW4gcG9vbF9yZXN1bWUgaXMKKyAqIHJlYWR5IHRvIGNvbnRpbnVlIGRlZmVycmVkIElPIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHdha2Vfd29ya2VyKHN0cnVjdCBwb29sICpwb29sKQoreworCXF1ZXVlX3dvcmsocG9vbC0+d3EsICZwb29sLT53b3JrZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmlvIGVuZGlvIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0IGVuZGlvX2hvb2sgeworCXN0cnVjdCB0aGluX2MgKnRjOworCWJpb19lbmRfaW9fdCAqc2F2ZWRfYmlfZW5kX2lvOworCXN0cnVjdCBkZWZlcnJlZF9lbnRyeSAqZW50cnk7Cit9OworCitzdHJ1Y3QgbmV3X21hcHBpbmcgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCWludCBwcmVwYXJlZDsKKworCXN0cnVjdCB0aGluX2MgKnRjOworCWRtX2Jsb2NrX3QgdmlydF9ibG9jazsKKwlkbV9ibG9ja190IGRhdGFfYmxvY2s7CisJc3RydWN0IGNlbGwgKmNlbGw7CisJaW50IGVycjsKKworCS8qCisJICogSWYgdGhlIGJpbyBjb3ZlcnMgdGhlIHdob2xlIGFyZWEgb2YgYSBibG9jayB0aGVuIHdlIGNhbiBhdm9pZAorCSAqIHplcm9pbmcgb3IgY29weWluZy4gIEluc3RlYWQgdGhpcyBiaW8gaXMgaG9va2VkLiAgVGhlIGJpbyB3aWxsCisJICogc3RpbGwgYmUgaW4gdGhlIGNlbGwsIHNvIGNhcmUgaGFzIHRvIGJlIHRha2VuIHRvIGF2b2lkIGlzc3VpbmcKKwkgKiB0aGUgYmlvIHR3aWNlLgorCSAqLworCXN0cnVjdCBiaW8gKmJpbzsKKwliaW9fZW5kX2lvX3QgKnNhdmVkX2JpX2VuZF9pbzsKK307CisKK3N0YXRpYyB2b2lkIF9fbWF5YmVfYWRkX21hcHBpbmcoc3RydWN0IG5ld19tYXBwaW5nICptKQoreworCXN0cnVjdCBwb29sICpwb29sID0gbS0+dGMtPnBvb2w7CisKKwlpZiAobGlzdF9lbXB0eSgmbS0+bGlzdCkgJiYgbS0+cHJlcGFyZWQpIHsKKwkJbGlzdF9hZGQoJm0tPmxpc3QsICZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncyk7CisJCXdha2Vfd29ya2VyKHBvb2wpOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV9jb21wbGV0ZShpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ld19tYXBwaW5nICptID0gY29udGV4dDsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IG0tPnRjLT5wb29sOworCisJbS0+ZXJyID0gcmVhZF9lcnIgfHwgd3JpdGVfZXJyID8gLUVJTyA6IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCW0tPnByZXBhcmVkID0gMTsKKwlfX21heWJlX2FkZF9tYXBwaW5nKG0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb3ZlcndyaXRlX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IG0tPnRjLT5wb29sOworCisJbS0+ZXJyID0gZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwltLT5wcmVwYXJlZCA9IDE7CisJX19tYXliZV9hZGRfbWFwcGluZyhtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXJlZF9yZWFkX2VuZGlvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hcHBpbmdzOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSwgKnRtcDsKKwlzdHJ1Y3QgZW5kaW9faG9vayAqaCA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwb29sICpwb29sID0gaC0+dGMtPnBvb2w7CisKKwliaW8tPmJpX2VuZF9pbyA9IGgtPnNhdmVkX2JpX2VuZF9pbzsKKwliaW9fZW5kaW8oYmlvLCBlcnIpOworCisJSU5JVF9MSVNUX0hFQUQoJm1hcHBpbmdzKTsKKwlkc19kZWMoaC0+ZW50cnksICZtYXBwaW5ncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCB0bXAsICZtYXBwaW5ncywgbGlzdCkgeworCQlsaXN0X2RlbCgmbS0+bGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZtLT5saXN0KTsKKwkJX19tYXliZV9hZGRfbWFwcGluZyhtKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJbWVtcG9vbF9mcmVlKGgsIHBvb2wtPmVuZGlvX2hvb2tfcG9vbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBXb3JrcXVldWUuCisgKi8KKworLyoKKyAqIFByZXBhcmVkIG1hcHBpbmcgam9icy4KKyAqLworCisvKgorICogVGhpcyBzZW5kcyB0aGUgYmlvcyBpbiB0aGUgY2VsbCBiYWNrIHRvIHRoZSBkZWZlcnJlZF9iaW9zIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfZGVmZXIoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBjZWxsICpjZWxsLAorCQkgICAgICAgZG1fYmxvY2tfdCBkYXRhX2Jsb2NrKQoreworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJY2VsbF9yZWxlYXNlKGNlbGwsICZwb29sLT5kZWZlcnJlZF9iaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Yy0+cG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGNlbGxfZGVmZXIgYWJvdmUsIGV4Y2VwdCBpdCBvbWl0cyBvbmUgcGFydGljdWxhciBkZXRhaW5lZSwKKyAqIGEgd3JpdGUgYmlvIHRoYXQgY292ZXJzIHRoZSBibG9jayBhbmQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNlbGxfZGVmZXJfZXhjZXB0KHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgY2VsbCAqY2VsbCwKKwkJCSAgICAgIHN0cnVjdCBiaW8gKmV4Y2VwdGlvbikKK3sKKwlzdHJ1Y3QgYmlvX2xpc3QgYmlvczsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IHBvb2wgKnBvb2wgPSB0Yy0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYmlvX2xpc3RfaW5pdCgmYmlvcyk7CisJY2VsbF9yZWxlYXNlKGNlbGwsICZiaW9zKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkKKwkJaWYgKGJpbyAhPSBleGNlcHRpb24pCisJCQliaW9fbGlzdF9hZGQoJnBvb2wtPmRlZmVycmVkX2Jpb3MsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcHJlcGFyZWRfbWFwcGluZyhzdHJ1Y3QgbmV3X21hcHBpbmcgKm0pCit7CisJc3RydWN0IHRoaW5fYyAqdGMgPSBtLT50YzsKKwlzdHJ1Y3QgYmlvICpiaW87CisJaW50IHI7CisKKwliaW8gPSBtLT5iaW87CisJaWYgKGJpbykKKwkJYmlvLT5iaV9lbmRfaW8gPSBtLT5zYXZlZF9iaV9lbmRfaW87CisKKwlpZiAobS0+ZXJyKSB7CisJCWNlbGxfZXJyb3IobS0+Y2VsbCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIENvbW1pdCB0aGUgcHJlcGFyZWQgYmxvY2sgaW50byB0aGUgbWFwcGluZyBidHJlZS4KKwkgKiBBbnkgSS9PIGZvciB0aGlzIGJsb2NrIGFycml2aW5nIGFmdGVyIHRoaXMgcG9pbnQgd2lsbCBnZXQKKwkgKiByZW1hcHBlZCB0byBpdCBkaXJlY3RseS4KKwkgKi8KKwlyID0gZG1fdGhpbl9pbnNlcnRfYmxvY2sodGMtPnRkLCBtLT52aXJ0X2Jsb2NrLCBtLT5kYXRhX2Jsb2NrKTsKKwlpZiAocikgeworCQlETUVSUigiZG1fdGhpbl9pbnNlcnRfYmxvY2soKSBmYWlsZWQiKTsKKwkJY2VsbF9lcnJvcihtLT5jZWxsKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmVsZWFzZSBhbnkgYmlvcyBoZWxkIHdoaWxlIHRoZSBibG9jayB3YXMgYmVpbmcgcHJvdmlzaW9uZWQuCisJICogSWYgd2UgYXJlIHByb2Nlc3NpbmcgYSB3cml0ZSBiaW8gdGhhdCBjb21wbGV0ZWx5IGNvdmVycyB0aGUgYmxvY2ssCisJICogd2UgYWxyZWFkeSBwcm9jZXNzZWQgaXQgc28gY2FuIGlnbm9yZSBpdCBub3cgd2hlbiBwcm9jZXNzaW5nCisJICogdGhlIGJpb3MgaW4gdGhlIGNlbGwuCisJICovCisJaWYgKGJpbykgeworCQljZWxsX2RlZmVyX2V4Y2VwdCh0YywgbS0+Y2VsbCwgYmlvKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJfSBlbHNlCisJCWNlbGxfZGVmZXIodGMsIG0tPmNlbGwsIG0tPmRhdGFfYmxvY2spOworCisJbGlzdF9kZWwoJm0tPmxpc3QpOworCW1lbXBvb2xfZnJlZShtLCB0Yy0+cG9vbC0+bWFwcGluZ19wb29sKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wcmVwYXJlZF9tYXBwaW5ncyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgbWFwczsKKwlzdHJ1Y3QgbmV3X21hcHBpbmcgKm0sICp0bXA7CisKKwlJTklUX0xJU1RfSEVBRCgmbWFwcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZV9pbml0KCZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncywgJm1hcHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCB0bXAsICZtYXBzLCBsaXN0KQorCQlwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmcobSk7Cit9CisKKy8qCisgKiBEZWZlcnJlZCBiaW8gam9icy4KKyAqLworc3RhdGljIGludCBpb19vdmVyd3JpdGVzX2Jsb2NrKHN0cnVjdCBwb29sICpwb29sLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuICgoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpICYmCisJCSEoYmlvLT5iaV9zZWN0b3IgJiBwb29sLT5vZmZzZXRfbWFzaykpICYmCisJCShiaW8tPmJpX3NpemUgPT0gKHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrIDw8IFNFQ1RPUl9TSElGVCkpOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2FuZF9zZXRfZW5kaW8oc3RydWN0IGJpbyAqYmlvLCBiaW9fZW5kX2lvX3QgKipzYXZlLAorCQkJICAgICAgIGJpb19lbmRfaW9fdCAqZm4pCit7CisJKnNhdmUgPSBiaW8tPmJpX2VuZF9pbzsKKwliaW8tPmJpX2VuZF9pbyA9IGZuOworfQorCitzdGF0aWMgaW50IGVuc3VyZV9uZXh0X21hcHBpbmcoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJaWYgKHBvb2wtPm5leHRfbWFwcGluZykKKwkJcmV0dXJuIDA7CisKKwlwb29sLT5uZXh0X21hcHBpbmcgPSBtZW1wb29sX2FsbG9jKHBvb2wtPm1hcHBpbmdfcG9vbCwgR0ZQX0FUT01JQyk7CisKKwlyZXR1cm4gcG9vbC0+bmV4dF9tYXBwaW5nID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV3X21hcHBpbmcgKmdldF9uZXh0X21hcHBpbmcoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJc3RydWN0IG5ld19tYXBwaW5nICpyID0gcG9vbC0+bmV4dF9tYXBwaW5nOworCisJQlVHX09OKCFwb29sLT5uZXh0X21hcHBpbmcpOworCisJcG9vbC0+bmV4dF9tYXBwaW5nID0gTlVMTDsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9jb3B5KHN0cnVjdCB0aGluX2MgKnRjLCBkbV9ibG9ja190IHZpcnRfYmxvY2ssCisJCQkgIGRtX2Jsb2NrX3QgZGF0YV9vcmlnaW4sIGRtX2Jsb2NrX3QgZGF0YV9kZXN0LAorCQkJICBzdHJ1Y3QgY2VsbCAqY2VsbCwgc3RydWN0IGJpbyAqYmlvKQoreworCWludCByOworCXN0cnVjdCBwb29sICpwb29sID0gdGMtPnBvb2w7CisJc3RydWN0IG5ld19tYXBwaW5nICptID0gZ2V0X25leHRfbWFwcGluZyhwb29sKTsKKworCUlOSVRfTElTVF9IRUFEKCZtLT5saXN0KTsKKwltLT5wcmVwYXJlZCA9IDA7CisJbS0+dGMgPSB0YzsKKwltLT52aXJ0X2Jsb2NrID0gdmlydF9ibG9jazsKKwltLT5kYXRhX2Jsb2NrID0gZGF0YV9kZXN0OworCW0tPmNlbGwgPSBjZWxsOworCW0tPmVyciA9IDA7CisJbS0+YmlvID0gTlVMTDsKKworCWRzX2FkZF93b3JrKCZwb29sLT5kcywgJm0tPmxpc3QpOworCisJLyoKKwkgKiBJTyB0byBwb29sX2RldiByZW1hcHMgdG8gdGhlIHBvb2wgdGFyZ2V0J3MgZGF0YV9kZXYuCisJICoKKwkgKiBJZiB0aGUgd2hvbGUgYmxvY2sgb2YgZGF0YSBpcyBiZWluZyBvdmVyd3JpdHRlbiwgd2UgY2FuIGlzc3VlIHRoZQorCSAqIGJpbyBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlIHdlIHVzZSBrY29weWQgdG8gY2xvbmUgdGhlIGRhdGEgZmlyc3QuCisJICovCisJaWYgKGlvX292ZXJ3cml0ZXNfYmxvY2socG9vbCwgYmlvKSkgeworCQltLT5iaW8gPSBiaW87CisJCXNhdmVfYW5kX3NldF9lbmRpbyhiaW8sICZtLT5zYXZlZF9iaV9lbmRfaW8sIG92ZXJ3cml0ZV9lbmRpbyk7CisJCWRtX2dldF9tYXBpbmZvKGJpbyktPnB0ciA9IG07CisJCXJlbWFwX2FuZF9pc3N1ZSh0YywgYmlvLCBkYXRhX2Rlc3QpOworCX0gZWxzZSB7CisJCXN0cnVjdCBkbV9pb19yZWdpb24gZnJvbSwgdG87CisKKwkJZnJvbS5iZGV2ID0gdGMtPnBvb2xfZGV2LT5iZGV2OworCQlmcm9tLnNlY3RvciA9IGRhdGFfb3JpZ2luICogcG9vbC0+c2VjdG9yc19wZXJfYmxvY2s7CisJCWZyb20uY291bnQgPSBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKworCQl0by5iZGV2ID0gdGMtPnBvb2xfZGV2LT5iZGV2OworCQl0by5zZWN0b3IgPSBkYXRhX2Rlc3QgKiBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKwkJdG8uY291bnQgPSBwb29sLT5zZWN0b3JzX3Blcl9ibG9jazsKKworCQlyID0gZG1fa2NvcHlkX2NvcHkocG9vbC0+Y29waWVyLCAmZnJvbSwgMSwgJnRvLAorCQkJCSAgIDAsIGNvcHlfY29tcGxldGUsIG0pOworCQlpZiAociA8IDApIHsKKwkJCW1lbXBvb2xfZnJlZShtLCBwb29sLT5tYXBwaW5nX3Bvb2wpOworCQkJRE1FUlIoImRtX2tjb3B5ZF9jb3B5KCkgZmFpbGVkIik7CisJCQljZWxsX2Vycm9yKGNlbGwpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV96ZXJvKHN0cnVjdCB0aGluX2MgKnRjLCBkbV9ibG9ja190IHZpcnRfYmxvY2ssCisJCQkgIGRtX2Jsb2NrX3QgZGF0YV9ibG9jaywgc3RydWN0IGNlbGwgKmNlbGwsCisJCQkgIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXN0cnVjdCBuZXdfbWFwcGluZyAqbSA9IGdldF9uZXh0X21hcHBpbmcocG9vbCk7CisKKwlJTklUX0xJU1RfSEVBRCgmbS0+bGlzdCk7CisJbS0+cHJlcGFyZWQgPSAwOworCW0tPnRjID0gdGM7CisJbS0+dmlydF9ibG9jayA9IHZpcnRfYmxvY2s7CisJbS0+ZGF0YV9ibG9jayA9IGRhdGFfYmxvY2s7CisJbS0+Y2VsbCA9IGNlbGw7CisJbS0+ZXJyID0gMDsKKwltLT5iaW8gPSBOVUxMOworCisJLyoKKwkgKiBJZiB0aGUgd2hvbGUgYmxvY2sgb2YgZGF0YSBpcyBiZWluZyBvdmVyd3JpdHRlbiBvciB3ZSBhcmUgbm90CisJICogemVyb2luZyBwcmUtZXhpc3RpbmcgZGF0YSwgd2UgY2FuIGlzc3VlIHRoZSBiaW8gaW1tZWRpYXRlbHkuCisJICogT3RoZXJ3aXNlIHdlIHVzZSBrY29weWQgdG8gemVybyB0aGUgZGF0YSBmaXJzdC4KKwkgKi8KKwlpZiAoIXBvb2wtPnplcm9fbmV3X2Jsb2NrcykKKwkJcHJvY2Vzc19wcmVwYXJlZF9tYXBwaW5nKG0pOworCisJZWxzZSBpZiAoaW9fb3ZlcndyaXRlc19ibG9jayhwb29sLCBiaW8pKSB7CisJCW0tPmJpbyA9IGJpbzsKKwkJc2F2ZV9hbmRfc2V0X2VuZGlvKGJpbywgJm0tPnNhdmVkX2JpX2VuZF9pbywgb3ZlcndyaXRlX2VuZGlvKTsKKwkJZG1fZ2V0X21hcGluZm8oYmlvKS0+cHRyID0gbTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIGRhdGFfYmxvY2spOworCisJfSBlbHNlIHsKKwkJaW50IHI7CisJCXN0cnVjdCBkbV9pb19yZWdpb24gdG87CisKKwkJdG8uYmRldiA9IHRjLT5wb29sX2Rldi0+YmRldjsKKwkJdG8uc2VjdG9yID0gZGF0YV9ibG9jayAqIHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrOworCQl0by5jb3VudCA9IHBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrOworCisJCXIgPSBkbV9rY29weWRfemVybyhwb29sLT5jb3BpZXIsIDEsICZ0bywgMCwgY29weV9jb21wbGV0ZSwgbSk7CisJCWlmIChyIDwgMCkgeworCQkJbWVtcG9vbF9mcmVlKG0sIHBvb2wtPm1hcHBpbmdfcG9vbCk7CisJCQlETUVSUigiZG1fa2NvcHlkX3plcm8oKSBmYWlsZWQiKTsKKwkJCWNlbGxfZXJyb3IoY2VsbCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfZGF0YV9ibG9jayhzdHJ1Y3QgdGhpbl9jICp0YywgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCWRtX2Jsb2NrX3QgZnJlZV9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCisJciA9IGRtX3Bvb2xfZ2V0X2ZyZWVfYmxvY2tfY291bnQocG9vbC0+cG1kLCAmZnJlZV9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChmcmVlX2Jsb2NrcyA8PSBwb29sLT5sb3dfd2F0ZXJfYmxvY2tzICYmICFwb29sLT5sb3dfd2F0ZXJfdHJpZ2dlcmVkKSB7CisJCURNV0FSTigiJXM6IHJlYWNoZWQgbG93IHdhdGVyIG1hcmssIHNlbmRpbmcgZXZlbnQuIiwKKwkJICAgICAgIGRtX2RldmljZV9uYW1lKHBvb2wtPnBvb2xfbWQpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJcG9vbC0+bG93X3dhdGVyX3RyaWdnZXJlZCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJZG1fdGFibGVfZXZlbnQocG9vbC0+dGktPnRhYmxlKTsKKwl9CisKKwlpZiAoIWZyZWVfYmxvY2tzKSB7CisJCWlmIChwb29sLT5ub19mcmVlX3NwYWNlKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFRyeSB0byBjb21taXQgdG8gc2VlIGlmIHRoYXQgd2lsbCBmcmVlIHVwIHNvbWUKKwkJCSAqIG1vcmUgc3BhY2UuCisJCQkgKi8KKwkJCXIgPSBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YShwb29sLT5wbWQpOworCQkJaWYgKHIpIHsKKwkJCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgcik7CisJCQkJcmV0dXJuIHI7CisJCQl9CisKKwkJCXIgPSBkbV9wb29sX2dldF9mcmVlX2Jsb2NrX2NvdW50KHBvb2wtPnBtZCwgJmZyZWVfYmxvY2tzKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCisJCQkvKgorCQkJICogSWYgd2Ugc3RpbGwgaGF2ZSBubyBzcGFjZSB3ZSBzZXQgYSBmbGFnIHRvIGF2b2lkCisJCQkgKiBkb2luZyBhbGwgdGhpcyBjaGVja2luZyBhbmQgcmV0dXJuIC1FTk9TUEMuCisJCQkgKi8KKwkJCWlmICghZnJlZV9ibG9ja3MpIHsKKwkJCQlETVdBUk4oIiVzOiBubyBmcmVlIHNwYWNlIGF2YWlsYWJsZS4iLAorCQkJCSAgICAgICBkbV9kZXZpY2VfbmFtZShwb29sLT5wb29sX21kKSk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCQlwb29sLT5ub19mcmVlX3NwYWNlID0gMTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCX0KKwl9CisKKwlyID0gZG1fcG9vbF9hbGxvY19kYXRhX2Jsb2NrKHBvb2wtPnBtZCwgcmVzdWx0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElmIHdlIGhhdmUgcnVuIG91dCBvZiBzcGFjZSwgcXVldWUgYmlvcyB1bnRpbCB0aGUgZGV2aWNlIGlzCisgKiByZXN1bWVkLCBwcmVzdW1hYmx5IGFmdGVyIGhhdmluZyBiZWVuIHJlbG9hZGVkIHdpdGggbW9yZSBzcGFjZS4KKyAqLworc3RhdGljIHZvaWQgcmV0cnlfb25fcmVzdW1lKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWJpb19saXN0X2FkZCgmcG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBub19zcGFjZShzdHJ1Y3QgY2VsbCAqY2VsbCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpb19saXN0IGJpb3M7CisKKwliaW9fbGlzdF9pbml0KCZiaW9zKTsKKwljZWxsX3JlbGVhc2UoY2VsbCwgJmJpb3MpOworCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkKKwkJcmV0cnlfb25fcmVzdW1lKGJpbyk7Cit9CisKK3N0YXRpYyB2b2lkIGJyZWFrX3NoYXJpbmcoc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbywgZG1fYmxvY2tfdCBibG9jaywKKwkJCSAgc3RydWN0IGNlbGxfa2V5ICprZXksCisJCQkgIHN0cnVjdCBkbV90aGluX2xvb2t1cF9yZXN1bHQgKmxvb2t1cF9yZXN1bHQsCisJCQkgIHN0cnVjdCBjZWxsICpjZWxsKQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGF0YV9ibG9jazsKKworCXIgPSBhbGxvY19kYXRhX2Jsb2NrKHRjLCAmZGF0YV9ibG9jayk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQlzY2hlZHVsZV9jb3B5KHRjLCBibG9jaywgbG9va3VwX3Jlc3VsdC0+YmxvY2ssCisJCQkgICAgICBkYXRhX2Jsb2NrLCBjZWxsLCBiaW8pOworCQlicmVhazsKKworCWNhc2UgLUVOT1NQQzoKKwkJbm9fc3BhY2UoY2VsbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRE1FUlIoIiVzOiBhbGxvY19kYXRhX2Jsb2NrKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwgX19mdW5jX18sIHIpOworCQljZWxsX2Vycm9yKGNlbGwpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2hhcmVkX2JpbyhzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLAorCQkJICAgICAgIGRtX2Jsb2NrX3QgYmxvY2ssCisJCQkgICAgICAgc3RydWN0IGRtX3RoaW5fbG9va3VwX3Jlc3VsdCAqbG9va3VwX3Jlc3VsdCkKK3sKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCXN0cnVjdCBjZWxsX2tleSBrZXk7CisKKwkvKgorCSAqIElmIGNlbGwgaXMgYWxyZWFkeSBvY2N1cGllZCwgdGhlbiBzaGFyaW5nIGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3MKKwkgKiBvZiBiZWluZyBicm9rZW4gc28gd2UgaGF2ZSBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZS4KKwkgKi8KKwlidWlsZF9kYXRhX2tleSh0Yy0+dGQsIGxvb2t1cF9yZXN1bHQtPmJsb2NrLCAma2V5KTsKKwlpZiAoYmlvX2RldGFpbihwb29sLT5wcmlzb24sICZrZXksIGJpbywgJmNlbGwpKQorCQlyZXR1cm47CisKKwlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpCisJCWJyZWFrX3NoYXJpbmcodGMsIGJpbywgYmxvY2ssICZrZXksIGxvb2t1cF9yZXN1bHQsIGNlbGwpOworCWVsc2UgeworCQlzdHJ1Y3QgZW5kaW9faG9vayAqaDsKKwkJaCA9IG1lbXBvb2xfYWxsb2MocG9vbC0+ZW5kaW9faG9va19wb29sLCBHRlBfTk9JTyk7CisKKwkJaC0+dGMgPSB0YzsKKwkJaC0+ZW50cnkgPSBkc19pbmMoJnBvb2wtPmRzKTsKKwkJc2F2ZV9hbmRfc2V0X2VuZGlvKGJpbywgJmgtPnNhdmVkX2JpX2VuZF9pbywgc2hhcmVkX3JlYWRfZW5kaW8pOworCQlkbV9nZXRfbWFwaW5mbyhiaW8pLT5wdHIgPSBoOworCisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIGxvb2t1cF9yZXN1bHQtPmJsb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb3Zpc2lvbl9ibG9jayhzdHJ1Y3QgdGhpbl9jICp0Yywgc3RydWN0IGJpbyAqYmlvLCBkbV9ibG9ja190IGJsb2NrLAorCQkJICAgIHN0cnVjdCBjZWxsICpjZWxsKQoreworCWludCByOworCWRtX2Jsb2NrX3QgZGF0YV9ibG9jazsKKworCS8qCisJICogUmVtYXAgZW1wdHkgYmlvcyAoZmx1c2hlcykgaW1tZWRpYXRlbHksIHdpdGhvdXQgcHJvdmlzaW9uaW5nLgorCSAqLworCWlmICghYmlvLT5iaV9zaXplKSB7CisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJcmVtYXBfYW5kX2lzc3VlKHRjLCBiaW8sIDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaWxsIHJlYWQgYmlvcyB3aXRoIHplcm9lcyBhbmQgY29tcGxldGUgdGhlbSBpbW1lZGlhdGVseS4KKwkgKi8KKwlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgeworCQl6ZXJvX2ZpbGxfYmlvKGJpbyk7CisJCWNlbGxfcmVsZWFzZV9zaW5nbGV0b24oY2VsbCwgYmlvKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJCXJldHVybjsKKwl9CisKKwlyID0gYWxsb2NfZGF0YV9ibG9jayh0YywgJmRhdGFfYmxvY2spOworCXN3aXRjaCAocikgeworCWNhc2UgMDoKKwkJc2NoZWR1bGVfemVybyh0YywgYmxvY2ssIGRhdGFfYmxvY2ssIGNlbGwsIGJpbyk7CisJCWJyZWFrOworCisJY2FzZSAtRU5PU1BDOgorCQlub19zcGFjZShjZWxsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlETUVSUigiJXM6IGFsbG9jX2RhdGFfYmxvY2soKSBmYWlsZWQsIGVycm9yID0gJWQiLCBfX2Z1bmNfXywgcik7CisJCWNlbGxfZXJyb3IoY2VsbCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19iaW8oc3RydWN0IHRoaW5fYyAqdGMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGJsb2NrID0gZ2V0X2Jpb19ibG9jayh0YywgYmlvKTsKKwlzdHJ1Y3QgY2VsbCAqY2VsbDsKKwlzdHJ1Y3QgY2VsbF9rZXkga2V5OworCXN0cnVjdCBkbV90aGluX2xvb2t1cF9yZXN1bHQgbG9va3VwX3Jlc3VsdDsKKworCS8qCisJICogSWYgY2VsbCBpcyBhbHJlYWR5IG9jY3VwaWVkLCB0aGVuIHRoZSBibG9jayBpcyBhbHJlYWR5CisJICogYmVpbmcgcHJvdmlzaW9uZWQgc28gd2UgaGF2ZSBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZS4KKwkgKi8KKwlidWlsZF92aXJ0dWFsX2tleSh0Yy0+dGQsIGJsb2NrLCAma2V5KTsKKwlpZiAoYmlvX2RldGFpbih0Yy0+cG9vbC0+cHJpc29uLCAma2V5LCBiaW8sICZjZWxsKSkKKwkJcmV0dXJuOworCisJciA9IGRtX3RoaW5fZmluZF9ibG9jayh0Yy0+dGQsIGJsb2NrLCAxLCAmbG9va3VwX3Jlc3VsdCk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAwOgorCQkvKgorCQkgKiBXZSBjYW4gcmVsZWFzZSB0aGlzIGNlbGwgbm93LiAgVGhpcyB0aHJlYWQgaXMgdGhlIG9ubHkKKwkJICogb25lIHRoYXQgcHV0cyBiaW9zIGludG8gYSBjZWxsLCBhbmQgd2Uga25vdyB0aGVyZSB3ZXJlCisJCSAqIG5vIHByZWNlZGluZyBiaW9zLgorCQkgKi8KKwkJLyoKKwkJICogVE9ETzogdGhpcyB3aWxsIHByb2JhYmx5IGhhdmUgdG8gY2hhbmdlIHdoZW4gZGlzY2FyZCBnb2VzCisJCSAqIGJhY2sgaW4uCisJCSAqLworCQljZWxsX3JlbGVhc2Vfc2luZ2xldG9uKGNlbGwsIGJpbyk7CisKKwkJaWYgKGxvb2t1cF9yZXN1bHQuc2hhcmVkKQorCQkJcHJvY2Vzc19zaGFyZWRfYmlvKHRjLCBiaW8sIGJsb2NrLCAmbG9va3VwX3Jlc3VsdCk7CisJCWVsc2UKKwkJCXJlbWFwX2FuZF9pc3N1ZSh0YywgYmlvLCBsb29rdXBfcmVzdWx0LmJsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIC1FTk9EQVRBOgorCQlwcm92aXNpb25fYmxvY2sodGMsIGJpbywgYmxvY2ssIGNlbGwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURNRVJSKCJkbV90aGluX2ZpbmRfYmxvY2soKSBmYWlsZWQsIGVycm9yID0gJWQiLCByKTsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19kZWZlcnJlZF9iaW9zKHN0cnVjdCBwb29sICpwb29sKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBiaW9fbGlzdCBiaW9zOworCWludCByOworCisJYmlvX2xpc3RfaW5pdCgmYmlvcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCWJpb19saXN0X21lcmdlKCZiaW9zLCAmcG9vbC0+ZGVmZXJyZWRfYmlvcyk7CisJYmlvX2xpc3RfaW5pdCgmcG9vbC0+ZGVmZXJyZWRfYmlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJpb3MpKSkgeworCQlzdHJ1Y3QgdGhpbl9jICp0YyA9IGRtX2dldF9tYXBpbmZvKGJpbyktPnB0cjsKKwkJLyoKKwkJICogSWYgd2UndmUgZ290IG5vIGZyZWUgbmV3X21hcHBpbmcgc3RydWN0cywgYW5kIHByb2Nlc3NpbmcKKwkJICogdGhpcyBiaW8gbWlnaHQgcmVxdWlyZSBvbmUsIHdlIHBhdXNlIHVudGlsIHRoZXJlIGFyZSBzb21lCisJCSAqIHByZXBhcmVkIG1hcHBpbmdzIHRvIHByb2Nlc3MuCisJCSAqLworCQlpZiAoZW5zdXJlX25leHRfbWFwcGluZyhwb29sKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwkJCWJpb19saXN0X21lcmdlKCZwb29sLT5kZWZlcnJlZF9iaW9zLCAmYmlvcyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwkJCWJyZWFrOworCQl9CisJCXByb2Nlc3NfYmlvKHRjLCBiaW8pOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBkZWZlcnJlZCBmbHVzaCBiaW9zLCB3ZSBtdXN0IGNvbW1pdAorCSAqIHRoZSBtZXRhZGF0YSBiZWZvcmUgaXNzdWluZyB0aGVtLgorCSAqLworCWJpb19saXN0X2luaXQoJmJpb3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJYmlvX2xpc3RfbWVyZ2UoJmJpb3MsICZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zKTsKKwliaW9fbGlzdF9pbml0KCZwb29sLT5kZWZlcnJlZF9mbHVzaF9iaW9zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoYmlvX2xpc3RfZW1wdHkoJmJpb3MpKQorCQlyZXR1cm47CisKKwlyID0gZG1fcG9vbF9jb21taXRfbWV0YWRhdGEocG9vbC0+cG1kKTsKKwlpZiAocikgeworCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJICAgICAgX19mdW5jX18sIHIpOworCQl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmYmlvcykpKQorCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworfQorCitzdGF0aWMgdm9pZCBkb193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IHBvb2wsIHdvcmtlcik7CisKKwlwcm9jZXNzX3ByZXBhcmVkX21hcHBpbmdzKHBvb2wpOworCXByb2Nlc3NfZGVmZXJyZWRfYmlvcyhwb29sKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE1hcHBpbmcgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBDYWxsZWQgb25seSB3aGlsZSBtYXBwaW5nIGEgdGhpbiBiaW8gdG8gaGFuZCBpdCBvdmVyIHRvIHRoZSB3b3JrcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHRoaW5fZGVmZXJfYmlvKHN0cnVjdCB0aGluX2MgKnRjLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHRjLT5wb29sOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwliaW9fbGlzdF9hZGQoJnBvb2wtPmRlZmVycmVkX2Jpb3MsIGJpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV93b3JrZXIocG9vbCk7Cit9CisKKy8qCisgKiBOb24tYmxvY2tpbmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gdGhlIHRoaW4gdGFyZ2V0J3MgbWFwIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHRoaW5fYmlvX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAorCQkJdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCWludCByOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisJZG1fYmxvY2tfdCBibG9jayA9IGdldF9iaW9fYmxvY2sodGMsIGJpbyk7CisJc3RydWN0IGRtX3RoaW5fZGV2aWNlICp0ZCA9IHRjLT50ZDsKKwlzdHJ1Y3QgZG1fdGhpbl9sb29rdXBfcmVzdWx0IHJlc3VsdDsKKworCS8qCisJICogU2F2ZSB0aGUgdGhpbiBjb250ZXh0IGZvciBlYXN5IGFjY2VzcyBmcm9tIHRoZSBkZWZlcnJlZCBiaW8gbGF0ZXIuCisJICovCisJbWFwX2NvbnRleHQtPnB0ciA9IHRjOworCisJaWYgKGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0ZVQSkpIHsKKwkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CisJfQorCisJciA9IGRtX3RoaW5fZmluZF9ibG9jayh0ZCwgYmxvY2ssIDAsICZyZXN1bHQpOworCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZGVmZXIgcmVhZGFoZWFkIHRvby4KKwkgKi8KKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDA6CisJCWlmICh1bmxpa2VseShyZXN1bHQuc2hhcmVkKSkgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGJldHdlZW4gdGhlCisJCQkgKiByZXN1bHQuc2hhcmVkIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsb29rdXAgYW5kCisJCQkgKiBzbmFwc2hvdCBjcmVhdGlvbiwgd2hpY2ggbWF5IGNhdXNlIG5ldworCQkJICogc2hhcmluZy4KKwkJCSAqCisJCQkgKiBUbyBhdm9pZCB0aGlzIGFsd2F5cyBxdWllc2NlIHRoZSBvcmlnaW4gYmVmb3JlCisJCQkgKiB0YWtpbmcgdGhlIHNuYXAuICBZb3Ugd2FudCB0byBkbyB0aGlzIGFueXdheSB0bworCQkJICogZW5zdXJlIGEgY29uc2lzdGVudCBhcHBsaWNhdGlvbiB2aWV3CisJCQkgKiAoaS5lLiBsb2NrZnMpLgorCQkJICoKKwkJCSAqIE1vcmUgZGlzdGFudCBhbmNlc3RvcnMgYXJlIGlycmVsZXZhbnQuIFRoZQorCQkJICogc2hhcmVkIGZsYWcgd2lsbCBiZSBzZXQgaW4gdGhlaXIgY2FzZS4KKwkJCSAqLworCQkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCQlyID0gRE1fTUFQSU9fU1VCTUlUVEVEOworCQl9IGVsc2UgeworCQkJcmVtYXAodGMsIGJpbywgcmVzdWx0LmJsb2NrKTsKKwkJCXIgPSBETV9NQVBJT19SRU1BUFBFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgLUVOT0RBVEE6CisJCS8qCisJCSAqIEluIGZ1dHVyZSwgdGhlIGZhaWxlZCBkbV90aGluX2ZpbmRfYmxvY2sgYWJvdmUgY291bGQKKwkJICogcHJvdmlkZSB0aGUgaGludCB0byBsb2FkIHRoZSBtZXRhZGF0YSBpbnRvIGNhY2hlLgorCQkgKi8KKwljYXNlIC1FV09VTERCTE9DSzoKKwkJdGhpbl9kZWZlcl9iaW8odGMsIGJpbyk7CisJCXIgPSBETV9NQVBJT19TVUJNSVRURUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHBvb2xfaXNfY29uZ2VzdGVkKHN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzICpjYiwgaW50IGJkaV9iaXRzKQoreworCWludCByOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBvb2xfYyAqcHQgPSBjb250YWluZXJfb2YoY2IsIHN0cnVjdCBwb29sX2MsIGNhbGxiYWNrcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHQtPnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlyID0gIWJpb19saXN0X2VtcHR5KCZwdC0+cG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB0LT5wb29sLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXIpIHsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShwdC0+ZGF0YV9kZXYtPmJkZXYpOworCQlyID0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYmRpX2JpdHMpOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfX3JlcXVldWVfYmlvcyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwliaW9fbGlzdF9tZXJnZSgmcG9vbC0+ZGVmZXJyZWRfYmlvcywgJnBvb2wtPnJldHJ5X29uX3Jlc3VtZV9saXN0KTsKKwliaW9fbGlzdF9pbml0KCZwb29sLT5yZXRyeV9vbl9yZXN1bWVfbGlzdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmluZGluZyBvZiBjb250cm9sIHRhcmdldHMgdG8gYSBwb29sIG9iamVjdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGJpbmRfY29udHJvbF90YXJnZXQoc3RydWN0IHBvb2wgKnBvb2wsIHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwlwb29sLT50aSA9IHRpOworCXBvb2wtPmxvd193YXRlcl9ibG9ja3MgPSBwdC0+bG93X3dhdGVyX2Jsb2NrczsKKwlwb29sLT56ZXJvX25ld19ibG9ja3MgPSBwdC0+emVyb19uZXdfYmxvY2tzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVuYmluZF9jb250cm9sX3RhcmdldChzdHJ1Y3QgcG9vbCAqcG9vbCwgc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJaWYgKHBvb2wtPnRpID09IHRpKQorCQlwb29sLT50aSA9IE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9vbCBjcmVhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfX3Bvb2xfZGVzdHJveShzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlfX3Bvb2xfdGFibGVfcmVtb3ZlKHBvb2wpOworCisJaWYgKGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2UocG9vbC0+cG1kKSA8IDApCisJCURNV0FSTigiJXM6IGRtX3Bvb2xfbWV0YWRhdGFfY2xvc2UoKSBmYWlsZWQuIiwgX19mdW5jX18pOworCisJcHJpc29uX2Rlc3Ryb3kocG9vbC0+cHJpc29uKTsKKwlkbV9rY29weWRfY2xpZW50X2Rlc3Ryb3kocG9vbC0+Y29waWVyKTsKKworCWlmIChwb29sLT53cSkKKwkJZGVzdHJveV93b3JrcXVldWUocG9vbC0+d3EpOworCisJaWYgKHBvb2wtPm5leHRfbWFwcGluZykKKwkJbWVtcG9vbF9mcmVlKHBvb2wtPm5leHRfbWFwcGluZywgcG9vbC0+bWFwcGluZ19wb29sKTsKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+bWFwcGluZ19wb29sKTsKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+ZW5kaW9faG9va19wb29sKTsKKwlrZnJlZShwb29sKTsKK30KKworc3RhdGljIHN0cnVjdCBwb29sICpwb29sX2NyZWF0ZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZCwKKwkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZXRhZGF0YV9kZXYsCisJCQkJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCBjaGFyICoqZXJyb3IpCit7CisJaW50IHI7CisJdm9pZCAqZXJyX3A7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IGRtX3Bvb2xfbWV0YWRhdGEgKnBtZDsKKworCXBtZCA9IGRtX3Bvb2xfbWV0YWRhdGFfb3BlbihtZXRhZGF0YV9kZXYsIGJsb2NrX3NpemUpOworCWlmIChJU19FUlIocG1kKSkgeworCQkqZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgbWV0YWRhdGEgb2JqZWN0IjsKKwkJcmV0dXJuIChzdHJ1Y3QgcG9vbCAqKXBtZDsKKwl9CisKKwlwb29sID0ga21hbGxvYyhzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wpIHsKKwkJKmVycm9yID0gIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBwb29sIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9wb29sOworCX0KKworCXBvb2wtPnBtZCA9IHBtZDsKKwlwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA9IGJsb2NrX3NpemU7CisJcG9vbC0+YmxvY2tfc2hpZnQgPSBmZnMoYmxvY2tfc2l6ZSkgLSAxOworCXBvb2wtPm9mZnNldF9tYXNrID0gYmxvY2tfc2l6ZSAtIDE7CisJcG9vbC0+bG93X3dhdGVyX2Jsb2NrcyA9IDA7CisJcG9vbC0+emVyb19uZXdfYmxvY2tzID0gMTsKKwlwb29sLT5wcmlzb24gPSBwcmlzb25fY3JlYXRlKFBSSVNPTl9DRUxMUyk7CisJaWYgKCFwb29sLT5wcmlzb24pIHsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBiaW8gcHJpc29uIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9wcmlzb247CisJfQorCisJcG9vbC0+Y29waWVyID0gZG1fa2NvcHlkX2NsaWVudF9jcmVhdGUoKTsKKwlpZiAoSVNfRVJSKHBvb2wtPmNvcGllcikpIHsKKwkJciA9IFBUUl9FUlIocG9vbC0+Y29waWVyKTsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBrY29weWQgY2xpZW50IjsKKwkJZXJyX3AgPSBFUlJfUFRSKHIpOworCQlnb3RvIGJhZF9rY29weWRfY2xpZW50OworCX0KKworCS8qCisJICogQ3JlYXRlIHNpbmdsZXRocmVhZGVkIHdvcmtxdWV1ZSB0aGF0IHdpbGwgc2VydmljZSBhbGwgZGV2aWNlcworCSAqIHRoYXQgdXNlIHRoaXMgbWV0YWRhdGEuCisJICovCisJcG9vbC0+d3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZG0tIiBETV9NU0dfUFJFRklYLCBXUV9NRU1fUkVDTEFJTSk7CisJaWYgKCFwb29sLT53cSkgeworCQkqZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgcG9vbCdzIHdvcmtxdWV1ZSI7CisJCWVycl9wID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBiYWRfd3E7CisJfQorCisJSU5JVF9XT1JLKCZwb29sLT53b3JrZXIsIGRvX3dvcmtlcik7CisJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCWJpb19saXN0X2luaXQoJnBvb2wtPmRlZmVycmVkX2Jpb3MpOworCWJpb19saXN0X2luaXQoJnBvb2wtPmRlZmVycmVkX2ZsdXNoX2Jpb3MpOworCUlOSVRfTElTVF9IRUFEKCZwb29sLT5wcmVwYXJlZF9tYXBwaW5ncyk7CisJcG9vbC0+bG93X3dhdGVyX3RyaWdnZXJlZCA9IDA7CisJcG9vbC0+bm9fZnJlZV9zcGFjZSA9IDA7CisJYmlvX2xpc3RfaW5pdCgmcG9vbC0+cmV0cnlfb25fcmVzdW1lX2xpc3QpOworCWRzX2luaXQoJnBvb2wtPmRzKTsKKworCXBvb2wtPm5leHRfbWFwcGluZyA9IE5VTEw7CisJcG9vbC0+bWFwcGluZ19wb29sID0KKwkJbWVtcG9vbF9jcmVhdGVfa21hbGxvY19wb29sKE1BUFBJTkdfUE9PTF9TSVpFLCBzaXplb2Yoc3RydWN0IG5ld19tYXBwaW5nKSk7CisJaWYgKCFwb29sLT5tYXBwaW5nX3Bvb2wpIHsKKwkJKmVycm9yID0gIkVycm9yIGNyZWF0aW5nIHBvb2wncyBtYXBwaW5nIG1lbXBvb2wiOworCQllcnJfcCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gYmFkX21hcHBpbmdfcG9vbDsKKwl9CisKKwlwb29sLT5lbmRpb19ob29rX3Bvb2wgPQorCQltZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woRU5ESU9fSE9PS19QT09MX1NJWkUsIHNpemVvZihzdHJ1Y3QgZW5kaW9faG9vaykpOworCWlmICghcG9vbC0+ZW5kaW9faG9va19wb29sKSB7CisJCSplcnJvciA9ICJFcnJvciBjcmVhdGluZyBwb29sJ3MgZW5kaW9faG9vayBtZW1wb29sIjsKKwkJZXJyX3AgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGJhZF9lbmRpb19ob29rX3Bvb2w7CisJfQorCXBvb2wtPnJlZl9jb3VudCA9IDE7CisJcG9vbC0+cG9vbF9tZCA9IHBvb2xfbWQ7CisJcG9vbC0+bWRfZGV2ID0gbWV0YWRhdGFfZGV2OworCV9fcG9vbF90YWJsZV9pbnNlcnQocG9vbCk7CisKKwlyZXR1cm4gcG9vbDsKKworYmFkX2VuZGlvX2hvb2tfcG9vbDoKKwltZW1wb29sX2Rlc3Ryb3kocG9vbC0+bWFwcGluZ19wb29sKTsKK2JhZF9tYXBwaW5nX3Bvb2w6CisJZGVzdHJveV93b3JrcXVldWUocG9vbC0+d3EpOworYmFkX3dxOgorCWRtX2tjb3B5ZF9jbGllbnRfZGVzdHJveShwb29sLT5jb3BpZXIpOworYmFkX2tjb3B5ZF9jbGllbnQ6CisJcHJpc29uX2Rlc3Ryb3kocG9vbC0+cHJpc29uKTsKK2JhZF9wcmlzb246CisJa2ZyZWUocG9vbCk7CitiYWRfcG9vbDoKKwlpZiAoZG1fcG9vbF9tZXRhZGF0YV9jbG9zZShwbWQpKQorCQlETVdBUk4oIiVzOiBkbV9wb29sX21ldGFkYXRhX2Nsb3NlKCkgZmFpbGVkLiIsIF9fZnVuY19fKTsKKworCXJldHVybiBlcnJfcDsKK30KKworc3RhdGljIHZvaWQgX19wb29sX2luYyhzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KSk7CisJcG9vbC0+cmVmX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIF9fcG9vbF9kZWMoc3RydWN0IHBvb2wgKnBvb2wpCit7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCkpOworCUJVR19PTighcG9vbC0+cmVmX2NvdW50KTsKKwlpZiAoIS0tcG9vbC0+cmVmX2NvdW50KQorCQlfX3Bvb2xfZGVzdHJveShwb29sKTsKK30KKworc3RhdGljIHN0cnVjdCBwb29sICpfX3Bvb2xfZmluZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZCwKKwkJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICptZXRhZGF0YV9kZXYsCisJCQkJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCBjaGFyICoqZXJyb3IpCit7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBfX3Bvb2xfdGFibGVfbG9va3VwX21ldGFkYXRhX2RldihtZXRhZGF0YV9kZXYpOworCisJaWYgKHBvb2wpIHsKKwkJaWYgKHBvb2wtPnBvb2xfbWQgIT0gcG9vbF9tZCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisJCV9fcG9vbF9pbmMocG9vbCk7CisKKwl9IGVsc2UgeworCQlwb29sID0gX19wb29sX3RhYmxlX2xvb2t1cChwb29sX21kKTsKKwkJaWYgKHBvb2wpIHsKKwkJCWlmIChwb29sLT5tZF9kZXYgIT0gbWV0YWRhdGFfZGV2KQorCQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQkJX19wb29sX2luYyhwb29sKTsKKworCQl9IGVsc2UKKwkJCXBvb2wgPSBwb29sX2NyZWF0ZShwb29sX21kLCBtZXRhZGF0YV9kZXYsIGJsb2NrX3NpemUsIGVycm9yKTsKKwl9CisKKwlyZXR1cm4gcG9vbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb29sIHRhcmdldCBtZXRob2RzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHBvb2xfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwltdXRleF9sb2NrKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpOworCisJdW5iaW5kX2NvbnRyb2xfdGFyZ2V0KHB0LT5wb29sLCB0aSk7CisJX19wb29sX2RlYyhwdC0+cG9vbCk7CisJZG1fcHV0X2RldmljZSh0aSwgcHQtPm1ldGFkYXRhX2Rldik7CisJZG1fcHV0X2RldmljZSh0aSwgcHQtPmRhdGFfZGV2KTsKKwlrZnJlZShwdCk7CisKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7Cit9CisKK3N0cnVjdCBwb29sX2ZlYXR1cmVzIHsKKwl1bnNpZ25lZCB6ZXJvX25ld19ibG9ja3M6MTsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfcG9vbF9mZWF0dXJlcyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBwb29sX2ZlYXR1cmVzICpwZiwKKwkJCSAgICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ19uYW1lOworCisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKKwkJezAsIDEsICJJbnZhbGlkIG51bWJlciBvZiBwb29sIGZlYXR1cmUgYXJndW1lbnRzIn0sCisJfTsKKworCS8qCisJICogTm8gZmVhdHVyZSBhcmd1bWVudHMgc3VwcGxpZWQuCisJICovCisJaWYgKCFhcy0+YXJnYykKKwkJcmV0dXJuIDA7CisKKwlyID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmYXJnYywgJnRpLT5lcnJvcik7CisJaWYgKHIpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKGFyZ2MgJiYgIXIpIHsKKwkJYXJnX25hbWUgPSBkbV9zaGlmdF9hcmcoYXMpOworCQlhcmdjLS07CisKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAic2tpcF9ibG9ja196ZXJvaW5nIikpIHsKKwkJCXBmLT56ZXJvX25ld19ibG9ja3MgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQl0aS0+ZXJyb3IgPSAiVW5yZWNvZ25pc2VkIHBvb2wgZmVhdHVyZSByZXF1ZXN0ZWQiOworCQlyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIHRoaW4tcG9vbCA8bWV0YWRhdGEgZGV2PiA8ZGF0YSBkZXY+CisgKgkgICAgIDxkYXRhIGJsb2NrIHNpemUgKHNlY3RvcnMpPgorICoJICAgICA8bG93IHdhdGVyIG1hcmsgKGJsb2Nrcyk+CisgKgkgICAgIFs8I2ZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisgKgorICogT3B0aW9uYWwgZmVhdHVyZSBhcmd1bWVudHMgYXJlOgorICoJICAgICBza2lwX2Jsb2NrX3plcm9pbmc6IHNraXBzIHRoZSB6ZXJvaW5nIG9mIG5ld2x5LXByb3Zpc2lvbmVkIGJsb2Nrcy4KKyAqLworc3RhdGljIGludCBwb29sX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHI7CisJc3RydWN0IHBvb2xfYyAqcHQ7CisJc3RydWN0IHBvb2wgKnBvb2w7CisJc3RydWN0IHBvb2xfZmVhdHVyZXMgcGY7CisJc3RydWN0IGRtX2FyZ19zZXQgYXM7CisJc3RydWN0IGRtX2RldiAqZGF0YV9kZXY7CisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplOworCWRtX2Jsb2NrX3QgbG93X3dhdGVyX2Jsb2NrczsKKwlzdHJ1Y3QgZG1fZGV2ICptZXRhZGF0YV9kZXY7CisJc2VjdG9yX3QgbWV0YWRhdGFfZGV2X3NpemU7CisKKwkvKgorCSAqIEZJWE1FIFJlbW92ZSB2YWxpZGF0aW9uIGZyb20gc2NvcGUgb2YgbG9jay4KKwkgKi8KKwltdXRleF9sb2NrKCZkbV90aGluX3Bvb2xfdGFibGUubXV0ZXgpOworCisJaWYgKGFyZ2MgPCA0KSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJYXMuYXJnYyA9IGFyZ2M7CisJYXMuYXJndiA9IGFyZ3Y7CisKKwlyID0gZG1fZ2V0X2RldmljZSh0aSwgYXJndlswXSwgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFLCAmbWV0YWRhdGFfZGV2KTsKKwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3Igb3BlbmluZyBtZXRhZGF0YSBibG9jayBkZXZpY2UiOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbWV0YWRhdGFfZGV2X3NpemUgPSBpX3NpemVfcmVhZChtZXRhZGF0YV9kZXYtPmJkZXYtPmJkX2lub2RlKSA+PiBTRUNUT1JfU0hJRlQ7CisJaWYgKG1ldGFkYXRhX2Rldl9zaXplID4gTUVUQURBVEFfREVWX01BWF9TRUNUT1JTKSB7CisJCXRpLT5lcnJvciA9ICJNZXRhZGF0YSBkZXZpY2UgaXMgdG9vIGxhcmdlIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFkYXRhOworCX0KKworCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzFdLCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUsICZkYXRhX2Rldik7CisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkVycm9yIGdldHRpbmcgZGF0YSBkZXZpY2UiOworCQlnb3RvIG91dF9tZXRhZGF0YTsKKwl9CisKKwlpZiAoa3N0cnRvdWwoYXJndlsyXSwgMTAsICZibG9ja19zaXplKSB8fCAhYmxvY2tfc2l6ZSB8fAorCSAgICBibG9ja19zaXplIDwgREFUQV9ERVZfQkxPQ0tfU0laRV9NSU5fU0VDVE9SUyB8fAorCSAgICBibG9ja19zaXplID4gREFUQV9ERVZfQkxPQ0tfU0laRV9NQVhfU0VDVE9SUyB8fAorCSAgICAhaXNfcG93ZXJfb2ZfMihibG9ja19zaXplKSkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBibG9jayBzaXplIjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChrc3RydG91bGwoYXJndlszXSwgMTAsICh1bnNpZ25lZCBsb25nIGxvbmcgKikmbG93X3dhdGVyX2Jsb2NrcykpIHsKKwkJdGktPmVycm9yID0gIkludmFsaWQgbG93IHdhdGVyIG1hcmsiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTZXQgZGVmYXVsdCBwb29sIGZlYXR1cmVzLgorCSAqLworCW1lbXNldCgmcGYsIDAsIHNpemVvZihwZikpOworCXBmLnplcm9fbmV3X2Jsb2NrcyA9IDE7CisKKwlkbV9jb25zdW1lX2FyZ3MoJmFzLCA0KTsKKwlyID0gcGFyc2VfcG9vbF9mZWF0dXJlcygmYXMsICZwZiwgdGkpOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCXB0ID0ga3phbGxvYyhzaXplb2YoKnB0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdCkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcG9vbCA9IF9fcG9vbF9maW5kKGRtX3RhYmxlX2dldF9tZCh0aS0+dGFibGUpLCBtZXRhZGF0YV9kZXYtPmJkZXYsCisJCQkgICBibG9ja19zaXplLCAmdGktPmVycm9yKTsKKwlpZiAoSVNfRVJSKHBvb2wpKSB7CisJCXIgPSBQVFJfRVJSKHBvb2wpOworCQlnb3RvIG91dF9mcmVlX3B0OworCX0KKworCXB0LT5wb29sID0gcG9vbDsKKwlwdC0+dGkgPSB0aTsKKwlwdC0+bWV0YWRhdGFfZGV2ID0gbWV0YWRhdGFfZGV2OworCXB0LT5kYXRhX2RldiA9IGRhdGFfZGV2OworCXB0LT5sb3dfd2F0ZXJfYmxvY2tzID0gbG93X3dhdGVyX2Jsb2NrczsKKwlwdC0+emVyb19uZXdfYmxvY2tzID0gcGYuemVyb19uZXdfYmxvY2tzOworCXRpLT5udW1fZmx1c2hfcmVxdWVzdHMgPSAxOworCXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cyA9IDA7CisJdGktPnByaXZhdGUgPSBwdDsKKworCXB0LT5jYWxsYmFja3MuY29uZ2VzdGVkX2ZuID0gcG9vbF9pc19jb25nZXN0ZWQ7CisJZG1fdGFibGVfYWRkX3RhcmdldF9jYWxsYmFja3ModGktPnRhYmxlLCAmcHQtPmNhbGxiYWNrcyk7CisKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfcHQ6CisJa2ZyZWUocHQpOworb3V0OgorCWRtX3B1dF9kZXZpY2UodGksIGRhdGFfZGV2KTsKK291dF9tZXRhZGF0YToKKwlkbV9wdXRfZGV2aWNlKHRpLCBtZXRhZGF0YV9kZXYpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwb29sX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAorCQkgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCWludCByOworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBBcyB0aGlzIGlzIGEgc2luZ2xldG9uIHRhcmdldCwgdGktPmJlZ2luIGlzIGFsd2F5cyB6ZXJvLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJYmlvLT5iaV9iZGV2ID0gcHQtPmRhdGFfZGV2LT5iZGV2OworCXIgPSBETV9NQVBJT19SRU1BUFBFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBvZiB0aGUgZGF0YSBkZXZpY2UgZnJvbQorICogdGhlIHN1cGVyYmxvY2sgYW5kIGNvbXBhcmVzIGl0IHRvIHRoZSBhY3R1YWwgZGV2aWNlIHNpemUsCisgKiB0aHVzIHJlc2l6aW5nIHRoZSBkYXRhIGRldmljZSBpbiBjYXNlIGl0IGhhcyBncm93bi4KKyAqCisgKiBUaGlzIGJvdGggY29wZXMgd2l0aCBvcGVuaW5nIHByZWFsbG9jYXRlZCBkYXRhIGRldmljZXMgaW4gdGhlIGN0cgorICogYmVpbmcgZm9sbG93ZWQgYnkgYSByZXN1bWUKKyAqIC1hbmQtCisgKiBjYWxsaW5nIHRoZSByZXN1bWUgbWV0aG9kIGluZGl2aWR1YWxseSBhZnRlciB1c2Vyc3BhY2UgaGFzCisgKiBncm93biB0aGUgZGF0YSBkZXZpY2UgaW4gcmVhY3Rpb24gdG8gYSB0YWJsZSBldmVudC4KKyAqLworc3RhdGljIGludCBwb29sX3ByZXJlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcG9vbF9jICpwdCA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBwb29sICpwb29sID0gcHQtPnBvb2w7CisJZG1fYmxvY2tfdCBkYXRhX3NpemUsIHNiX2RhdGFfc2l6ZTsKKworCS8qCisJICogVGFrZSBjb250cm9sIG9mIHRoZSBwb29sIG9iamVjdC4KKwkgKi8KKwlyID0gYmluZF9jb250cm9sX3RhcmdldChwb29sLCB0aSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZGF0YV9zaXplID0gdGktPmxlbiA+PiBwb29sLT5ibG9ja19zaGlmdDsKKwlyID0gZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZShwb29sLT5wbWQsICZzYl9kYXRhX3NpemUpOworCWlmIChyKSB7CisJCURNRVJSKCJmYWlsZWQgdG8gcmV0cmlldmUgZGF0YSBkZXZpY2Ugc2l6ZSIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoZGF0YV9zaXplIDwgc2JfZGF0YV9zaXplKSB7CisJCURNRVJSKCJwb29sIHRhcmdldCB0b28gc21hbGwsIGlzICVsbHUgYmxvY2tzIChleHBlY3RlZCAlbGx1KSIsCisJCSAgICAgIGRhdGFfc2l6ZSwgc2JfZGF0YV9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9IGVsc2UgaWYgKGRhdGFfc2l6ZSA+IHNiX2RhdGFfc2l6ZSkgeworCQlyID0gZG1fcG9vbF9yZXNpemVfZGF0YV9kZXYocG9vbC0+cG1kLCBkYXRhX3NpemUpOworCQlpZiAocikgeworCQkJRE1FUlIoImZhaWxlZCB0byByZXNpemUgZGF0YSBkZXZpY2UiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJciA9IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHBvb2wtPnBtZCk7CisJCWlmIChyKSB7CisJCQlETUVSUigiJXM6IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKCkgZmFpbGVkLCBlcnJvciA9ICVkIiwKKwkJCSAgICAgIF9fZnVuY19fLCByKTsKKwkJCXJldHVybiByOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvb2xfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKKwlwb29sLT5sb3dfd2F0ZXJfdHJpZ2dlcmVkID0gMDsKKwlwb29sLT5ub19mcmVlX3NwYWNlID0gMDsKKwlfX3JlcXVldWVfYmlvcyhwb29sKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3dvcmtlcihwb29sKTsKK30KKworc3RhdGljIHZvaWQgcG9vbF9wb3N0c3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcG9vbF9jICpwdCA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBwb29sICpwb29sID0gcHQtPnBvb2w7CisKKwlmbHVzaF93b3JrcXVldWUocG9vbC0+d3EpOworCisJciA9IGRtX3Bvb2xfY29tbWl0X21ldGFkYXRhKHBvb2wtPnBtZCk7CisJaWYgKHIgPCAwKSB7CisJCURNRVJSKCIlczogZG1fcG9vbF9jb21taXRfbWV0YWRhdGEoKSBmYWlsZWQsIGVycm9yID0gJWQiLAorCQkgICAgICBfX2Z1bmNfXywgcik7CisJCS8qIEZJWE1FOiBpbnZhbGlkYXRlIGRldmljZT8gZXJyb3IgdGhlIG5leHQgRlVBIG9yIEZMVVNIIGJpbyA/Ki8KKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJnX2NvdW50KHVuc2lnbmVkIGFyZ2MsIHVuc2lnbmVkIGFyZ3NfcmVxdWlyZWQpCit7CisJaWYgKGFyZ2MgIT0gYXJnc19yZXF1aXJlZCkgeworCQlETVdBUk4oIk1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCAldSBhcmd1bWVudHMgaW5zdGVhZCBvZiAldS4iLAorCQkgICAgICAgYXJnYywgYXJnc19yZXF1aXJlZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfZGV2X2lkKGNoYXIgKmFyZywgZG1fdGhpbl9pZCAqZGV2X2lkLCBpbnQgd2FybmluZykKK3sKKwlpZiAoIWtzdHJ0b3VsbChhcmcsIDEwLCAodW5zaWduZWQgbG9uZyBsb25nICopZGV2X2lkKSAmJgorCSAgICAqZGV2X2lkIDw9IE1BWF9ERVZfSUQpCisJCXJldHVybiAwOworCisJaWYgKHdhcm5pbmcpCisJCURNV0FSTigiTWVzc2FnZSByZWNlaXZlZCB3aXRoIGludmFsaWQgZGV2aWNlIGlkOiAlcyIsIGFyZyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NyZWF0ZV90aGluX21lc2codW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBwb29sICpwb29sKQoreworCWRtX3RoaW5faWQgZGV2X2lkOworCWludCByOworCisJciA9IGNoZWNrX2FyZ19jb3VudChhcmdjLCAyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcmVhZF9kZXZfaWQoYXJndlsxXSwgJmRldl9pZCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3Bvb2xfY3JlYXRlX3RoaW4ocG9vbC0+cG1kLCBkZXZfaWQpOworCWlmIChyKSB7CisJCURNV0FSTigiQ3JlYXRpb24gb2YgbmV3IHRoaW5seS1wcm92aXNpb25lZCBkZXZpY2Ugd2l0aCBpZCAlcyBmYWlsZWQuIiwKKwkJICAgICAgIGFyZ3ZbMV0pOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NyZWF0ZV9zbmFwX21lc2codW5zaWduZWQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBwb29sICpwb29sKQoreworCWRtX3RoaW5faWQgZGV2X2lkOworCWRtX3RoaW5faWQgb3JpZ2luX2Rldl9pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHJlYWRfZGV2X2lkKGFyZ3ZbMV0sICZkZXZfaWQsIDEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSByZWFkX2Rldl9pZChhcmd2WzJdLCAmb3JpZ2luX2Rldl9pZCwgMSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3Bvb2xfY3JlYXRlX3NuYXAocG9vbC0+cG1kLCBkZXZfaWQsIG9yaWdpbl9kZXZfaWQpOworCWlmIChyKSB7CisJCURNV0FSTigiQ3JlYXRpb24gb2YgbmV3IHNuYXBzaG90ICVzIG9mIGRldmljZSAlcyBmYWlsZWQuIiwKKwkJICAgICAgIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RlbGV0ZV9tZXNnKHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgcG9vbCAqcG9vbCkKK3sKKwlkbV90aGluX2lkIGRldl9pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHJlYWRfZGV2X2lkKGFyZ3ZbMV0sICZkZXZfaWQsIDEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9wb29sX2RlbGV0ZV90aGluX2RldmljZShwb29sLT5wbWQsIGRldl9pZCk7CisJaWYgKHIpCisJCURNV0FSTigiRGVsZXRpb24gb2YgdGhpbiBkZXZpY2UgJXMgZmFpbGVkLiIsIGFyZ3ZbMV0pOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19zZXRfdHJhbnNhY3Rpb25faWRfbWVzZyh1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IHBvb2wgKnBvb2wpCit7CisJZG1fdGhpbl9pZCBvbGRfaWQsIG5ld19pZDsKKwlpbnQgcjsKKworCXIgPSBjaGVja19hcmdfY291bnQoYXJnYywgMyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKGtzdHJ0b3VsbChhcmd2WzFdLCAxMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZvbGRfaWQpKSB7CisJCURNV0FSTigic2V0X3RyYW5zYWN0aW9uX2lkIG1lc3NhZ2U6IFVucmVjb2duaXNlZCBpZCAlcy4iLCBhcmd2WzFdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGtzdHJ0b3VsbChhcmd2WzJdLCAxMCwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZuZXdfaWQpKSB7CisJCURNV0FSTigic2V0X3RyYW5zYWN0aW9uX2lkIG1lc3NhZ2U6IFVucmVjb2duaXNlZCBuZXcgaWQgJXMuIiwgYXJndlsyXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXIgPSBkbV9wb29sX3NldF9tZXRhZGF0YV90cmFuc2FjdGlvbl9pZChwb29sLT5wbWQsIG9sZF9pZCwgbmV3X2lkKTsKKwlpZiAocikgeworCQlETVdBUk4oIkZhaWxlZCB0byBjaGFuZ2UgdHJhbnNhY3Rpb24gaWQgZnJvbSAlcyB0byAlcy4iLAorCQkgICAgICAgYXJndlsxXSwgYXJndlsyXSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTWVzc2FnZXMgc3VwcG9ydGVkOgorICogICBjcmVhdGVfdGhpbgk8ZGV2X2lkPgorICogICBjcmVhdGVfc25hcAk8ZGV2X2lkPiA8b3JpZ2luX2lkPgorICogICBkZWxldGUJCTxkZXZfaWQ+CisgKiAgIHRyaW0JCTxkZXZfaWQ+IDxuZXdfc2l6ZV9pbl9zZWN0b3JzPgorICogICBzZXRfdHJhbnNhY3Rpb25faWQgPGN1cnJlbnRfdHJhbnNfaWQ+IDxuZXdfdHJhbnNfaWQ+CisgKi8KK3N0YXRpYyBpbnQgcG9vbF9tZXNzYWdlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgciA9IC1FSU5WQUw7CisJc3RydWN0IHBvb2xfYyAqcHQgPSB0aS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcG9vbCAqcG9vbCA9IHB0LT5wb29sOworCisJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJjcmVhdGVfdGhpbiIpKQorCQlyID0gcHJvY2Vzc19jcmVhdGVfdGhpbl9tZXNnKGFyZ2MsIGFyZ3YsIHBvb2wpOworCisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImNyZWF0ZV9zbmFwIikpCisJCXIgPSBwcm9jZXNzX2NyZWF0ZV9zbmFwX21lc2coYXJnYywgYXJndiwgcG9vbCk7CisKKwllbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZGVsZXRlIikpCisJCXIgPSBwcm9jZXNzX2RlbGV0ZV9tZXNnKGFyZ2MsIGFyZ3YsIHBvb2wpOworCisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgInNldF90cmFuc2FjdGlvbl9pZCIpKQorCQlyID0gcHJvY2Vzc19zZXRfdHJhbnNhY3Rpb25faWRfbWVzZyhhcmdjLCBhcmd2LCBwb29sKTsKKworCWVsc2UKKwkJRE1XQVJOKCJVbnJlY29nbmlzZWQgdGhpbiBwb29sIHRhcmdldCBtZXNzYWdlIHJlY2VpdmVkOiAlcyIsIGFyZ3ZbMF0pOworCisJaWYgKCFyKSB7CisJCXIgPSBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YShwb29sLT5wbWQpOworCQlpZiAocikKKwkJCURNRVJSKCIlcyBtZXNzYWdlOiBkbV9wb29sX2NvbW1pdF9tZXRhZGF0YSgpIGZhaWxlZCwgZXJyb3IgPSAlZCIsCisJCQkgICAgICBhcmd2WzBdLCByKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFN0YXR1cyBsaW5lIGlzOgorICogICAgPHRyYW5zYWN0aW9uIGlkPiA8dXNlZCBtZXRhZGF0YSBzZWN0b3JzPi88dG90YWwgbWV0YWRhdGEgc2VjdG9ycz4KKyAqICAgIDx1c2VkIGRhdGEgc2VjdG9ycz4vPHRvdGFsIGRhdGEgc2VjdG9ycz4gPGhlbGQgbWV0YWRhdGEgcm9vdD4KKyAqLworc3RhdGljIGludCBwb29sX3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RhdHVzX3R5cGVfdCB0eXBlLAorCQkgICAgICAgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBtYXhsZW4pCit7CisJaW50IHI7CisJdW5zaWduZWQgc3ogPSAwOworCXVpbnQ2NF90IHRyYW5zYWN0aW9uX2lkOworCWRtX2Jsb2NrX3QgbnJfZnJlZV9ibG9ja3NfZGF0YTsKKwlkbV9ibG9ja190IG5yX2ZyZWVfYmxvY2tzX21ldGFkYXRhOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzX2RhdGE7CisJZG1fYmxvY2tfdCBucl9ibG9ja3NfbWV0YWRhdGE7CisJZG1fYmxvY2tfdCBoZWxkX3Jvb3Q7CisJY2hhciBidWZbQkRFVk5BTUVfU0laRV07CisJY2hhciBidWYyW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgorCQlyID0gZG1fcG9vbF9nZXRfbWV0YWRhdGFfdHJhbnNhY3Rpb25faWQocG9vbC0+cG1kLAorCQkJCQkJCSZ0cmFuc2FjdGlvbl9pZCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJciA9IGRtX3Bvb2xfZ2V0X2ZyZWVfbWV0YWRhdGFfYmxvY2tfY291bnQocG9vbC0+cG1kLAorCQkJCQkJCSAgJm5yX2ZyZWVfYmxvY2tzX21ldGFkYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfbWV0YWRhdGFfZGV2X3NpemUocG9vbC0+cG1kLCAmbnJfYmxvY2tzX21ldGFkYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfZnJlZV9ibG9ja19jb3VudChwb29sLT5wbWQsCisJCQkJCQkgJm5yX2ZyZWVfYmxvY2tzX2RhdGEpOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCXIgPSBkbV9wb29sX2dldF9kYXRhX2Rldl9zaXplKHBvb2wtPnBtZCwgJm5yX2Jsb2Nrc19kYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlyID0gZG1fcG9vbF9nZXRfaGVsZF9tZXRhZGF0YV9yb290KHBvb2wtPnBtZCwgJmhlbGRfcm9vdCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJRE1FTUlUKCIlbGx1ICVsbHUvJWxsdSAlbGx1LyVsbHUgIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNhY3Rpb25faWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShucl9ibG9ja3NfbWV0YWRhdGEgLSBucl9mcmVlX2Jsb2Nrc19tZXRhZGF0YSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5yX2Jsb2Nrc19tZXRhZGF0YSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKG5yX2Jsb2Nrc19kYXRhIC0gbnJfZnJlZV9ibG9ja3NfZGF0YSksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5yX2Jsb2Nrc19kYXRhKTsKKworCQlpZiAoaGVsZF9yb290KQorCQkJRE1FTUlUKCIlbGx1IiwgaGVsZF9yb290KTsKKwkJZWxzZQorCQkJRE1FTUlUKCItIik7CisKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRVU1RZUEVfVEFCTEU6CisJCURNRU1JVCgiJXMgJXMgJWx1ICVsbHUgIiwKKwkJICAgICAgIGZvcm1hdF9kZXZfdChidWYsIHB0LT5tZXRhZGF0YV9kZXYtPmJkZXYtPmJkX2RldiksCisJCSAgICAgICBmb3JtYXRfZGV2X3QoYnVmMiwgcHQtPmRhdGFfZGV2LT5iZGV2LT5iZF9kZXYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcG9vbC0+c2VjdG9yc19wZXJfYmxvY2ssCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXB0LT5sb3dfd2F0ZXJfYmxvY2tzKTsKKworCQlETUVNSVQoIiV1ICIsICFwb29sLT56ZXJvX25ld19ibG9ja3MpOworCisJCWlmICghcG9vbC0+emVyb19uZXdfYmxvY2tzKQorCQkJRE1FTUlUKCJza2lwX2Jsb2NrX3plcm9pbmcgIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvb2xfaXRlcmF0ZV9kZXZpY2VzKHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCWl0ZXJhdGVfZGV2aWNlc19jYWxsb3V0X2ZuIGZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisKKwlyZXR1cm4gZm4odGksIHB0LT5kYXRhX2RldiwgMCwgdGktPmxlbiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcG9vbF9tZXJnZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ2ZWNfbWVyZ2VfZGF0YSAqYnZtLAorCQkgICAgICBzdHJ1Y3QgYmlvX3ZlYyAqYmlvdmVjLCBpbnQgbWF4X3NpemUpCit7CisJc3RydWN0IHBvb2xfYyAqcHQgPSB0aS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHB0LT5kYXRhX2Rldi0+YmRldik7CisKKwlpZiAoIXEtPm1lcmdlX2J2ZWNfZm4pCisJCXJldHVybiBtYXhfc2l6ZTsKKworCWJ2bS0+YmlfYmRldiA9IHB0LT5kYXRhX2Rldi0+YmRldjsKKworCXJldHVybiBtaW4obWF4X3NpemUsIHEtPm1lcmdlX2J2ZWNfZm4ocSwgYnZtLCBiaW92ZWMpKTsKK30KKworc3RhdGljIHZvaWQgcG9vbF9pb19oaW50cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqbGltaXRzKQoreworCXN0cnVjdCBwb29sX2MgKnB0ID0gdGktPnByaXZhdGU7CisJc3RydWN0IHBvb2wgKnBvb2wgPSBwdC0+cG9vbDsKKworCWJsa19saW1pdHNfaW9fbWluKGxpbWl0cywgMCk7CisJYmxrX2xpbWl0c19pb19vcHQobGltaXRzLCBwb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHBvb2xfdGFyZ2V0ID0geworCS5uYW1lID0gInRoaW4tcG9vbCIsCisJLmZlYXR1cmVzID0gRE1fVEFSR0VUX1NJTkdMRVRPTiB8IERNX1RBUkdFVF9BTFdBWVNfV1JJVEVBQkxFIHwKKwkJICAgIERNX1RBUkdFVF9JTU1VVEFCTEUsCisJLnZlcnNpb24gPSB7MSwgMCwgMH0sCisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5jdHIgPSBwb29sX2N0ciwKKwkuZHRyID0gcG9vbF9kdHIsCisJLm1hcCA9IHBvb2xfbWFwLAorCS5wb3N0c3VzcGVuZCA9IHBvb2xfcG9zdHN1c3BlbmQsCisJLnByZXJlc3VtZSA9IHBvb2xfcHJlcmVzdW1lLAorCS5yZXN1bWUgPSBwb29sX3Jlc3VtZSwKKwkubWVzc2FnZSA9IHBvb2xfbWVzc2FnZSwKKwkuc3RhdHVzID0gcG9vbF9zdGF0dXMsCisJLm1lcmdlID0gcG9vbF9tZXJnZSwKKwkuaXRlcmF0ZV9kZXZpY2VzID0gcG9vbF9pdGVyYXRlX2RldmljZXMsCisJLmlvX2hpbnRzID0gcG9vbF9pb19oaW50cywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpbiB0YXJnZXQgbWV0aG9kcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCB0aGluX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IHRpLT5wcml2YXRlOworCisJbXV0ZXhfbG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCV9fcG9vbF9kZWModGMtPnBvb2wpOworCWRtX3Bvb2xfY2xvc2VfdGhpbl9kZXZpY2UodGMtPnRkKTsKKwlkbV9wdXRfZGV2aWNlKHRpLCB0Yy0+cG9vbF9kZXYpOworCWtmcmVlKHRjKTsKKworCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKK30KKworLyoKKyAqIFRoaW4gdGFyZ2V0IHBhcmFtZXRlcnM6CisgKgorICogPHBvb2xfZGV2PiA8ZGV2X2lkPgorICoKKyAqIHBvb2xfZGV2OiB0aGUgcGF0aCB0byB0aGUgcG9vbCAoZWcsIC9kZXYvbWFwcGVyL215X3Bvb2wpCisgKiBkZXZfaWQ6IHRoZSBpbnRlcm5hbCBkZXZpY2UgaWRlbnRpZmllcgorICovCitzdGF0aWMgaW50IHRoaW5fY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgdGhpbl9jICp0YzsKKwlzdHJ1Y3QgZG1fZGV2ICpwb29sX2RldjsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqcG9vbF9tZDsKKworCW11dGV4X2xvY2soJmRtX3RoaW5fcG9vbF90YWJsZS5tdXRleCk7CisKKwlpZiAoYXJnYyAhPSAyKSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl0YyA9IHRpLT5wcml2YXRlID0ga3phbGxvYyhzaXplb2YoKnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YykgeworCQl0aS0+ZXJyb3IgPSAiT3V0IG9mIG1lbW9yeSI7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJciA9IGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZwb29sX2Rldik7CisJaWYgKHIpIHsKKwkJdGktPmVycm9yID0gIkVycm9yIG9wZW5pbmcgcG9vbCBkZXZpY2UiOworCQlnb3RvIGJhZF9wb29sX2RldjsKKwl9CisJdGMtPnBvb2xfZGV2ID0gcG9vbF9kZXY7CisKKwlpZiAocmVhZF9kZXZfaWQoYXJndlsxXSwgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZ0Yy0+ZGV2X2lkLCAwKSkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBkZXZpY2UgaWQiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWRfY29tbW9uOworCX0KKworCXBvb2xfbWQgPSBkbV9nZXRfbWQodGMtPnBvb2xfZGV2LT5iZGV2LT5iZF9kZXYpOworCWlmICghcG9vbF9tZCkgeworCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3QgZ2V0IHBvb2wgbWFwcGVkIGRldmljZSI7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGJhZF9jb21tb247CisJfQorCisJdGMtPnBvb2wgPSBfX3Bvb2xfdGFibGVfbG9va3VwKHBvb2xfbWQpOworCWlmICghdGMtPnBvb2wpIHsKKwkJdGktPmVycm9yID0gIkNvdWxkbid0IGZpbmQgcG9vbCBvYmplY3QiOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBiYWRfcG9vbF9sb29rdXA7CisJfQorCV9fcG9vbF9pbmModGMtPnBvb2wpOworCisJciA9IGRtX3Bvb2xfb3Blbl90aGluX2RldmljZSh0Yy0+cG9vbC0+cG1kLCB0Yy0+ZGV2X2lkLCAmdGMtPnRkKTsKKwlpZiAocikgeworCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3Qgb3BlbiB0aGluIGludGVybmFsIGRldmljZSI7CisJCWdvdG8gYmFkX3RoaW5fb3BlbjsKKwl9CisKKwl0aS0+c3BsaXRfaW8gPSB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2s7CisJdGktPm51bV9mbHVzaF9yZXF1ZXN0cyA9IDE7CisJdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzID0gMDsKKwl0aS0+ZGlzY2FyZHNfc3VwcG9ydGVkID0gMDsKKworCWRtX3B1dChwb29sX21kKTsKKworCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCXJldHVybiAwOworCitiYWRfdGhpbl9vcGVuOgorCV9fcG9vbF9kZWModGMtPnBvb2wpOworYmFkX3Bvb2xfbG9va3VwOgorCWRtX3B1dChwb29sX21kKTsKK2JhZF9jb21tb246CisJZG1fcHV0X2RldmljZSh0aSwgdGMtPnBvb2xfZGV2KTsKK2JhZF9wb29sX2RldjoKKwlrZnJlZSh0Yyk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZG1fdGhpbl9wb29sX3RhYmxlLm11dGV4KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHRoaW5fbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCisJCSAgICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJYmlvLT5iaV9zZWN0b3IgLT0gdGktPmJlZ2luOworCisJcmV0dXJuIHRoaW5fYmlvX21hcCh0aSwgYmlvLCBtYXBfY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIHRoaW5fcG9zdHN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJaWYgKGRtX25vZmx1c2hfc3VzcGVuZGluZyh0aSkpCisJCXJlcXVldWVfaW8oKHN0cnVjdCB0aGluX2MgKil0aS0+cHJpdmF0ZSk7Cit9CisKKy8qCisgKiA8bnIgbWFwcGVkIHNlY3RvcnM+IDxoaWdoZXN0IG1hcHBlZCBzZWN0b3I+CisgKi8KK3N0YXRpYyBpbnQgdGhpbl9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlwZSwKKwkJICAgICAgIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgbWF4bGVuKQoreworCWludCByOworCXNzaXplX3Qgc3ogPSAwOworCWRtX2Jsb2NrX3QgbWFwcGVkLCBoaWdoZXN0OworCWNoYXIgYnVmW0JERVZOQU1FX1NJWkVdOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisKKwlpZiAoIXRjLT50ZCkKKwkJRE1FTUlUKCItIik7CisJZWxzZSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNUQVRVU1RZUEVfSU5GTzoKKwkJCXIgPSBkbV90aGluX2dldF9tYXBwZWRfY291bnQodGMtPnRkLCAmbWFwcGVkKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCisJCQlyID0gZG1fdGhpbl9nZXRfaGlnaGVzdF9tYXBwZWRfYmxvY2sodGMtPnRkLCAmaGlnaGVzdCk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIHI7CisKKwkJCURNRU1JVCgiJWxsdSAiLCBtYXBwZWQgKiB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2spOworCQkJaWYgKHIpCisJCQkJRE1FTUlUKCIlbGx1IiwgKChoaWdoZXN0ICsgMSkgKgorCQkJCQkJdGMtPnBvb2wtPnNlY3RvcnNfcGVyX2Jsb2NrKSAtIDEpOworCQkJZWxzZQorCQkJCURNRU1JVCgiLSIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgorCQkJRE1FTUlUKCIlcyAlbHUiLAorCQkJICAgICAgIGZvcm1hdF9kZXZfdChidWYsIHRjLT5wb29sX2Rldi0+YmRldi0+YmRfZGV2KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgdGMtPmRldl9pZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRoaW5faXRlcmF0ZV9kZXZpY2VzKHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCWl0ZXJhdGVfZGV2aWNlc19jYWxsb3V0X2ZuIGZuLCB2b2lkICpkYXRhKQoreworCWRtX2Jsb2NrX3QgYmxvY2tzOworCXN0cnVjdCB0aGluX2MgKnRjID0gdGktPnByaXZhdGU7CisKKwkvKgorCSAqIFdlIGNhbid0IGNhbGwgZG1fcG9vbF9nZXRfZGF0YV9kZXZfc2l6ZSgpIHNpbmNlIHRoYXQgYmxvY2tzLiAgU28KKwkgKiB3ZSBmb2xsb3cgYSBtb3JlIGNvbnZvbHV0ZWQgcGF0aCB0aHJvdWdoIHRvIHRoZSBwb29sJ3MgdGFyZ2V0LgorCSAqLworCWlmICghdGMtPnBvb2wtPnRpKQorCQlyZXR1cm4gMDsJLyogbm90aGluZyBpcyBib3VuZCAqLworCisJYmxvY2tzID0gdGMtPnBvb2wtPnRpLT5sZW4gPj4gdGMtPnBvb2wtPmJsb2NrX3NoaWZ0OworCWlmIChibG9ja3MpCisJCXJldHVybiBmbih0aSwgdGMtPnBvb2xfZGV2LCAwLCB0Yy0+cG9vbC0+c2VjdG9yc19wZXJfYmxvY2sgKiBibG9ja3MsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRoaW5faW9faGludHMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cykKK3sKKwlzdHJ1Y3QgdGhpbl9jICp0YyA9IHRpLT5wcml2YXRlOworCisJYmxrX2xpbWl0c19pb19taW4obGltaXRzLCAwKTsKKwlibGtfbGltaXRzX2lvX29wdChsaW1pdHMsIHRjLT5wb29sLT5zZWN0b3JzX3Blcl9ibG9jayA8PCBTRUNUT1JfU0hJRlQpOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHRoaW5fdGFyZ2V0ID0geworCS5uYW1lID0gInRoaW4iLAorCS52ZXJzaW9uID0gezEsIDAsIDB9LAorCS5tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkuY3RyID0gdGhpbl9jdHIsCisJLmR0ciA9IHRoaW5fZHRyLAorCS5tYXAgPSB0aGluX21hcCwKKwkucG9zdHN1c3BlbmQgPSB0aGluX3Bvc3RzdXNwZW5kLAorCS5zdGF0dXMgPSB0aGluX3N0YXR1cywKKwkuaXRlcmF0ZV9kZXZpY2VzID0gdGhpbl9pdGVyYXRlX2RldmljZXMsCisJLmlvX2hpbnRzID0gdGhpbl9pb19oaW50cywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0IGRtX3RoaW5faW5pdCh2b2lkKQoreworCWludCByOworCisJcG9vbF90YWJsZV9pbml0KCk7CisKKwlyID0gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZ0aGluX3RhcmdldCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmcG9vbF90YXJnZXQpOworCWlmIChyKQorCQlkbV91bnJlZ2lzdGVyX3RhcmdldCgmdGhpbl90YXJnZXQpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGRtX3RoaW5fZXhpdCh2b2lkKQoreworCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZ0aGluX3RhcmdldCk7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnBvb2xfdGFyZ2V0KTsKK30KKworbW9kdWxlX2luaXQoZG1fdGhpbl9pbml0KTsKK21vZHVsZV9leGl0KGRtX3RoaW5fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihETV9OQU1FICJkZXZpY2UtbWFwcGVyIHRoaW4gcHJvdmlzaW9uaW5nIHRhcmdldCIpOworTU9EVUxFX0FVVEhPUigiSm9lIFRob3JuYmVyIDxkbS1kZXZlbEByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS11ZXZlbnQuYyBiL2RyaXZlcnMvbWQvZG0tdWV2ZW50LmMKaW5kZXggNmIxZTNiNi4uOGVmZTAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS11ZXZlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXVldmVudC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZG0uaCIKICNpbmNsdWRlICJkbS11ZXZlbnQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCA1MmIzOWYzLi40NzIwZjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0yNSw2ICsyNSwxNiBAQAogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImNvcmUiCiAKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisvKgorICogcmF0ZWxpbWl0IHN0YXRlIHRvIGJlIHVzZWQgaW4gRE1YWFhfTElNSVQoKS4KKyAqLworREVGSU5FX1JBVEVMSU1JVF9TVEFURShkbV9yYXRlbGltaXRfc3RhdGUsCisJCSAgICAgICBERUZBVUxUX1JBVEVMSU1JVF9JTlRFUlZBTCwKKwkJICAgICAgIERFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTsKK0VYUE9SVF9TWU1CT0woZG1fcmF0ZWxpbWl0X3N0YXRlKTsKKyNlbmRpZgorCiAvKgogICogQ29va2llcyBhcmUgbnVtZXJpYyB2YWx1ZXMgc2VudCB3aXRoIENIQU5HRSBhbmQgUkVNT1ZFCiAgKiB1ZXZlbnRzIHdoaWxlIHJlc3VtaW5nLCByZW1vdmluZyBvciByZW5hbWluZyB0aGUgZGV2aWNlLgpAQCAtMTMwLDYgKzE0MCw4IEBACiAJLyogUHJvdGVjdCBxdWV1ZSBhbmQgdHlwZSBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzLiAqLwogCXN0cnVjdCBtdXRleCB0eXBlX2xvY2s7CiAKKwlzdHJ1Y3QgdGFyZ2V0X3R5cGUgKmltbXV0YWJsZV90YXJnZXRfdHlwZTsKKwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCWNoYXIgbmFtZVsxNl07CiAKQEAgLTE4MCw5ICsxOTIsNiBAQAogCS8qIGZvcmNlZCBnZW9tZXRyeSBzZXR0aW5ncyAqLwogCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKIAotCS8qIEZvciBzYXZpbmcgdGhlIGFkZHJlc3Mgb2YgX19tYWtlX3JlcXVlc3QgZm9yIHJlcXVlc3QgYmFzZWQgZG0gKi8KLQltYWtlX3JlcXVlc3RfZm4gKnNhdmVkX21ha2VfcmVxdWVzdF9mbjsKLQogCS8qIHN5c2ZzIGhhbmRsZSAqLwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAKQEAgLTEzOTEsNyArMTQwMCw3IEBACiAgKiBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0aGF0IGp1c3QgcmVtYXBzIHRoZSBiaW8gYnVpbHQgdXAgYnkKICAqIGRtX21lcmdlX2J2ZWMuCiAgKi8KLXN0YXRpYyBpbnQgX2RtX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIF9kbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcS0+cXVldWVkYXRhOwpAQCAtMTQxMiwxOSArMTQyMSwxMiBAQAogCQkJcXVldWVfaW8obWQsIGJpbyk7CiAJCWVsc2UKIAkJCWJpb19pb19lcnJvcihiaW8pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAogCV9fc3BsaXRfYW5kX3Byb2Nlc3NfYmlvKG1kLCBiaW8pOwogCXVwX3JlYWQoJm1kLT5pb19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKLXsKLQlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBxLT5xdWV1ZWRhdGE7Ci0KLQlyZXR1cm4gbWQtPnNhdmVkX21ha2VfcmVxdWVzdF9mbihxLCBiaW8pOyAvKiBjYWxsIF9fbWFrZV9yZXF1ZXN0KCkgKi8KKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgZG1fcmVxdWVzdF9iYXNlZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCkBAIC0xNDMyLDE0ICsxNDM0LDE0IEBACiAJcmV0dXJuIGJsa19xdWV1ZV9zdGFja2FibGUobWQtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGludCBkbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBkbV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcS0+cXVldWVkYXRhOwogCiAJaWYgKGRtX3JlcXVlc3RfYmFzZWQobWQpKQotCQlyZXR1cm4gZG1fbWFrZV9yZXF1ZXN0KHEsIGJpbyk7Ci0KLQlyZXR1cm4gX2RtX3JlcXVlc3QocSwgYmlvKTsKKwkJYmxrX3F1ZXVlX2JpbyhxLCBiaW8pOworCWVsc2UKKwkJX2RtX3JlcXVlc3QocSwgYmlvKTsKIH0KIAogdm9pZCBkbV9kaXNwYXRjaF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTIwODYsNiArMjA4OCw4IEBACiAJd3JpdGVfbG9ja19pcnFzYXZlKCZtZC0+bWFwX2xvY2ssIGZsYWdzKTsKIAlvbGRfbWFwID0gbWQtPm1hcDsKIAltZC0+bWFwID0gdDsKKwltZC0+aW1tdXRhYmxlX3RhcmdldF90eXBlID0gZG1fdGFibGVfZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZSh0KTsKKwogCWRtX3RhYmxlX3NldF9yZXN0cmljdGlvbnModCwgcSwgbGltaXRzKTsKIAlpZiAobWVyZ2VfaXNfb3B0aW9uYWwpCiAJCXNldF9iaXQoRE1GX01FUkdFX0lTX09QVElPTkFMLCAmbWQtPmZsYWdzKTsKQEAgLTIxNTYsNiArMjE2MCwxMSBAQAogCXJldHVybiBtZC0+dHlwZTsKIH0KIAorc3RydWN0IHRhcmdldF90eXBlICpkbV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlyZXR1cm4gbWQtPmltbXV0YWJsZV90YXJnZXRfdHlwZTsKK30KKwogLyoKICAqIEZ1bGx5IGluaXRpYWxpemUgYSByZXF1ZXN0LWJhc2VkIHF1ZXVlICgtPmVsZXZhdG9yLCAtPnJlcXVlc3RfZm4sIGV0YykuCiAgKi8KQEAgLTIxNzIsNyArMjE4MSw2IEBACiAJCXJldHVybiAwOwogCiAJbWQtPnF1ZXVlID0gcTsKLQltZC0+c2F2ZWRfbWFrZV9yZXF1ZXN0X2ZuID0gbWQtPnF1ZXVlLT5tYWtlX3JlcXVlc3RfZm47CiAJZG1faW5pdF9tZF9xdWV1ZShtZCk7CiAJYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShtZC0+cXVldWUsIGRtX3NvZnRpcnFfZG9uZSk7CiAJYmxrX3F1ZXVlX3ByZXBfcnEobWQtPnF1ZXVlLCBkbV9wcmVwX2ZuKTsKQEAgLTIyMzEsNiArMjIzOSw3IEBACiAKIAlyZXR1cm4gbWQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9nZXRfbWQpOwogCiB2b2lkICpkbV9nZXRfbWRwdHIoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQogewpAQCAtMjMxNiw3ICsyMzI1LDYgQEAKIAl3aGlsZSAoMSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShpbnRlcnJ1cHRpYmxlKTsKIAotCQlzbXBfbWIoKTsKIAkJaWYgKCFtZF9pbl9mbGlnaHQobWQpKQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uaCBiL2RyaXZlcnMvbWQvZG0uaAppbmRleCA2NzQ1ZGJkLi5iN2RhY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmgKKysrIGIvZHJpdmVycy9tZC9kbS5oCkBAIC02MCw2ICs2MCw3IEBACiBpbnQgZG1fdGFibGVfYW55X2Nvbmdlc3RlZChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBiZGlfYml0cyk7CiBpbnQgZG1fdGFibGVfYW55X2J1c3lfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCk7CiB1bnNpZ25lZCBkbV90YWJsZV9nZXRfdHlwZShzdHJ1Y3QgZG1fdGFibGUgKnQpOworc3RydWN0IHRhcmdldF90eXBlICpkbV90YWJsZV9nZXRfaW1tdXRhYmxlX3RhcmdldF90eXBlKHN0cnVjdCBkbV90YWJsZSAqdCk7CiBib29sIGRtX3RhYmxlX3JlcXVlc3RfYmFzZWQoc3RydWN0IGRtX3RhYmxlICp0KTsKIGJvb2wgZG1fdGFibGVfc3VwcG9ydHNfZGlzY2FyZHMoc3RydWN0IGRtX3RhYmxlICp0KTsKIGludCBkbV90YWJsZV9hbGxvY19tZF9tZW1wb29scyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwpAQCAtNzIsNiArNzMsNyBAQAogdm9pZCBkbV91bmxvY2tfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogdm9pZCBkbV9zZXRfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHVuc2lnbmVkIHR5cGUpOwogdW5zaWduZWQgZG1fZ2V0X21kX3R5cGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK3N0cnVjdCB0YXJnZXRfdHlwZSAqZG1fZ2V0X2ltbXV0YWJsZV90YXJnZXRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogCiBpbnQgZG1fc2V0dXBfbWRfcXVldWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9mYXVsdHkuYyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKaW5kZXggNjA4MTZiMS4uZmViMmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9mYXVsdHkuYworKysgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCkBAIC02Myw2ICs2Myw3IEBACiAKICNkZWZpbmUgTWF4RmF1bHQJNTAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kX3UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibWQuaCIKQEAgLTE2OSw3ICsxNzAsNyBAQAogCQljb25mLT5uZmF1bHRzID0gbisxOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBmYXVsdHlfY29uZiAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCWludCBmYWlsaXQgPSAwOwpAQCAtMTgxLDcgKzE4Miw3IEBACiAJCQkgKiBqdXN0IGZhaWwgaW1tZWRpYXRlbHkKIAkJCSAqLwogCQkJYmlvX2VuZGlvKGJpbywgLUVJTyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCiAJCWlmIChjaGVja19zZWN0b3IoY29uZiwgYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2VjdG9yKyhiaW8tPmJpX3NpemU+PjkpLApAQCAtMjExLDE1ICsyMTIsMTUgQEAKIAl9CiAJaWYgKGZhaWxpdCkgewogCQlzdHJ1Y3QgYmlvICpiID0gYmlvX2Nsb25lX21kZGV2KGJpbywgR0ZQX05PSU8sIG1kZGV2KTsKKwogCQliLT5iaV9iZGV2ID0gY29uZi0+cmRldi0+YmRldjsKIAkJYi0+YmlfcHJpdmF0ZSA9IGJpbzsKIAkJYi0+YmlfZW5kX2lvID0gZmF1bHR5X2ZhaWw7Ci0JCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGIpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgeworCQliaW8gPSBiOworCX0gZWxzZQogCQliaW8tPmJpX2JkZXYgPSBjb25mLT5yZGV2LT5iZGV2OwotCQlyZXR1cm4gMTsKLQl9CisKKwlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwogfQogCiBzdGF0aWMgdm9pZCBzdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZGRldiAqbWRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2xpbmVhci5jIGIvZHJpdmVycy9tZC9saW5lYXIuYwppbmRleCAxMGM1ODQ0Li5jMzI3M2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2xpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL21kX3UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJtZC5oIgogI2luY2x1ZGUgImxpbmVhci5oIgpAQCAtMjY0LDE0ICsyNjUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsaW5lYXJfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBsaW5lYXJfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgZGV2X2luZm8gKnRtcF9kZXY7CiAJc2VjdG9yX3Qgc3RhcnRfc2VjdG9yOwogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjkzLDcgKzI5NCw3IEBACiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X3NlY3Rvcik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQliaW9faW9fZXJyb3IoYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJaWYgKHVubGlrZWx5KGJpby0+Ymlfc2VjdG9yICsgKGJpby0+Ymlfc2l6ZSA+PiA5KSA+CiAJCSAgICAgdG1wX2Rldi0+ZW5kX3NlY3RvcikpIHsKQEAgLTMwNywyMCArMzA4LDE3IEBACiAKIAkJYnAgPSBiaW9fc3BsaXQoYmlvLCBlbmRfc2VjdG9yIC0gYmlvLT5iaV9zZWN0b3IpOwogCi0JCWlmIChsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8xKTsKLQkJaWYgKGxpbmVhcl9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMikpCi0JCQlnZW5lcmljX21ha2VfcmVxdWVzdCgmYnAtPmJpbzIpOworCQlsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQlsaW5lYXJfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzIpOwogCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAJCSAgICAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5yZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgLSBzdGFydF9zZWN0b3IKIAkJKyB0bXBfZGV2LT5yZGV2LT5kYXRhX29mZnNldDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiAxOworCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxpbmVhcl9zdGF0dXMgKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDI2NmU4MmUuLjg0YWNmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CkBAIC0zMzIsMTggKzMzMywxNyBAQAogICogY2FsbCBoYXMgZmluaXNoZWQsIHRoZSBiaW8gaGFzIGJlZW4gbGlua2VkIGludG8gc29tZSBpbnRlcm5hbCBzdHJ1Y3R1cmUKICAqIGFuZCBzbyBpcyB2aXNpYmxlIHRvIC0+cXVpZXNjZSgpLCBzbyB3ZSBkb24ndCBuZWVkIHRoZSByZWZjb3VudCBhbnkgbW9yZS4KICAqLwotc3RhdGljIGludCBtZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyB2b2lkIG1kX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCXN0cnVjdCBtZGRldiAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0JaW50IHJ2OwogCWludCBjcHU7CiAJdW5zaWduZWQgaW50IHNlY3RvcnM7CiAKIAlpZiAobWRkZXYgPT0gTlVMTCB8fCBtZGRldi0+cGVycyA9PSBOVUxMCiAJICAgIHx8ICFtZGRldi0+cmVhZHkpIHsKIAkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCXNtcF9ybWIoKTsgLyogRW5zdXJlIGltcGxpY2F0aW9ucyBvZiAgJ2FjdGl2ZScgYXJlIHZpc2libGUgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0zNjgsNyArMzY4LDcgQEAKIAkgKiBnbyBhd2F5IGluc2lkZSBtYWtlX3JlcXVlc3QKIAkgKi8KIAlzZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQlydiA9IG1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3QobWRkZXYsIGJpbyk7CisJbWRkZXYtPnBlcnMtPm1ha2VfcmVxdWVzdChtZGRldiwgYmlvKTsKIAogCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7CiAJcGFydF9zdGF0X2luYyhjcHUsICZtZGRldi0+Z2VuZGlzay0+cGFydDAsIGlvc1tyd10pOwpAQCAtMzc3LDggKzM3Nyw2IEBACiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRkZXYtPmFjdGl2ZV9pbykgJiYgbWRkZXYtPnN1c3BlbmRlZCkKIAkJd2FrZV91cCgmbWRkZXYtPnNiX3dhaXQpOwotCi0JcmV0dXJuIHJ2OwogfQogCiAvKiBtZGRldl9zdXNwZW5kIG1ha2VzIHN1cmUgbm8gbmV3IHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQKQEAgLTQ3Nyw4ICs0NzUsNyBAQAogCQliaW9fZW5kaW8oYmlvLCAwKTsKIAllbHNlIHsKIAkJYmlvLT5iaV9ydyAmPSB+UkVRX0ZMVVNIOwotCQlpZiAobWRkZXYtPnBlcnMtPm1ha2VfcmVxdWVzdChtZGRldiwgYmlvKSkKLQkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CisJCW1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3QobWRkZXYsIGJpbyk7CiAJfQogCiAJbWRkZXYtPmZsdXNoX2JpbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmggYi9kcml2ZXJzL21kL21kLmgKaW5kZXggNTFjMWQ5MS4uY2Y3NDJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5oCisrKyBiL2RyaXZlcnMvbWQvbWQuaApAQCAtNDE5LDcgKzQxOSw3IEBACiAJaW50IGxldmVsOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQlpbnQgKCptYWtlX3JlcXVlc3QpKHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbyk7CisJdm9pZCAoKm1ha2VfcmVxdWVzdCkoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKTsKIAlpbnQgKCpydW4pKHN0cnVjdCBtZGRldiAqbWRkZXYpOwogCWludCAoKnN0b3ApKHN0cnVjdCBtZGRldiAqbWRkZXYpOwogCXZvaWQgKCpzdGF0dXMpKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGQzMmM3ODUuLjU4OTkyNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMDYsNyArMTA3LDcgQEAKIAlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIGNvbmYtPm1kZGV2KTsKIH0KIAotc3RhdGljIGludCBtdWx0aXBhdGhfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCitzdGF0aWMgdm9pZCBtdWx0aXBhdGhfbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCiB7CiAJc3RydWN0IG1wY29uZiAqY29uZiA9IG1kZGV2LT5wcml2YXRlOwogCXN0cnVjdCBtdWx0aXBhdGhfYmggKiBtcF9iaDsKQEAgLTExNCw3ICsxMTUsNyBAQAogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJbXBfYmggPSBtZW1wb29sX2FsbG9jKGNvbmYtPnBvb2wsIEdGUF9OT0lPKTsKQEAgLTEyNiw3ICsxMjcsNyBAQAogCWlmIChtcF9iaC0+cGF0aCA8IDApIHsKIAkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJCW1lbXBvb2xfZnJlZShtcF9iaCwgY29uZi0+cG9vbCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCW11bHRpcGF0aCA9IGNvbmYtPm11bHRpcGF0aHMgKyBtcF9iaC0+cGF0aDsKIApAQCAtMTM3LDcgKzEzOCw3IEBACiAJbXBfYmgtPmJpby5iaV9lbmRfaW8gPSBtdWx0aXBhdGhfZW5kX3JlcXVlc3Q7CiAJbXBfYmgtPmJpby5iaV9wcml2YXRlID0gbXBfYmg7CiAJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJm1wX2JoLT5iaW8pOwotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgbXVsdGlwYXRoX3N0YXR1cyAoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZGRldiAqbWRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9LY29uZmlnIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWIzNTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvS2NvbmZpZwpAQCAtMCwwICsxLDggQEAKK2NvbmZpZyBETV9QRVJTSVNURU5UX0RBVEEKKyAgICAgICB0cmlzdGF0ZQorICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKyAgICAgICBzZWxlY3QgTElCQ1JDMzJDCisgICAgICAgc2VsZWN0IERNX0JVRklPCisgICAgICAgLS0taGVscC0tLQorCSBMaWJyYXJ5IHByb3ZpZGluZyBpbW11dGFibGUgb24tZGlzayBkYXRhIHN0cnVjdHVyZSBzdXBwb3J0IGZvcgorCSBkZXZpY2UtbWFwcGVyIHRhcmdldHMgc3VjaCBhcyB0aGUgdGhpbiBwcm92aXNpb25pbmcgdGFyZ2V0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvTWFrZWZpbGUgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorb2JqLSQoQ09ORklHX0RNX1BFUlNJU1RFTlRfREFUQSkgKz0gZG0tcGVyc2lzdGVudC1kYXRhLm8KK2RtLXBlcnNpc3RlbnQtZGF0YS1vYmpzIDo9IFwKKwlkbS1ibG9jay1tYW5hZ2VyLm8gXAorCWRtLXNwYWNlLW1hcC1jaGVja2VyLm8gXAorCWRtLXNwYWNlLW1hcC1jb21tb24ubyBcCisJZG0tc3BhY2UtbWFwLWRpc2subyBcCisJZG0tc3BhY2UtbWFwLW1ldGFkYXRhLm8gXAorCWRtLXRyYW5zYWN0aW9uLW1hbmFnZXIubyBcCisJZG0tYnRyZWUubyBcCisJZG0tYnRyZWUtcmVtb3ZlLm8gXAorCWRtLWJ0cmVlLXNwaW5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJsb2NrLW1hbmFnZXIuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJsb2NrLW1hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE3ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5jCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKyNpbmNsdWRlICJkbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9kbS1idWZpby5oIgorCisjaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJibG9jayBtYW5hZ2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBpcyBhIHJlYWQvd3JpdGUgc2VtYXBob3JlIHdpdGggYSBjb3VwbGUgb2YgZGlmZmVyZW5jZXMuCisgKgorICogaSkgVGhlcmUgaXMgYSByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVhZCBsb2NrcyB0aGF0CisgKiBtYXkgYmUgaGVsZCBhdCBvbmNlLiAgVGhpcyBpcyBqdXN0IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAqCisgKiBpaSkgUmVjdXJzaXZlIGxvY2tpbmcgYXR0ZW1wdHMgYXJlIGRldGVjdGVkIGFuZCByZXR1cm4gRUlOVkFMLiAgQSBzdGFjaworICogdHJhY2UgaXMgYWxzbyBlbWl0dGVkIGZvciB0aGUgcHJldmlvdXMgbG9jayBhcXVpc2l0aW9uLgorICoKKyAqIGlpaSkgUHJpb3JpdHkgaXMgZ2l2ZW4gdG8gd3JpdGUgbG9ja3MuCisgKi8KKyNkZWZpbmUgTUFYX0hPTERFUlMgNAorI2RlZmluZSBNQVhfU1RBQ0sgMTAKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHN0YWNrX2VudHJpZXNbTUFYX1NUQUNLXTsKKworc3RydWN0IGJsb2NrX2xvY2sgeworCXNwaW5sb2NrX3QgbG9jazsKKwlfX3MzMiBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRlcnM7CisJc3RydWN0IHRhc2tfc3RydWN0ICpob2xkZXJzW01BWF9IT0xERVJTXTsKKworI2lmZGVmIENPTkZJR19ETV9ERUJVR19CTE9DS19TVEFDS19UUkFDSU5HCisJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlc1tNQVhfSE9MREVSU107CisJc3RhY2tfZW50cmllcyBlbnRyaWVzW01BWF9IT0xERVJTXTsKKyNlbmRpZgorfTsKKworc3RydWN0IHdhaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgd2FudHNfd3JpdGU7Cit9OworCitzdGF0aWMgdW5zaWduZWQgX19maW5kX2hvbGRlcihzdHJ1Y3QgYmxvY2tfbG9jayAqbG9jaywKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9IT0xERVJTOyBpKyspCisJCWlmIChsb2NrLT5ob2xkZXJzW2ldID09IHRhc2spCisJCQlicmVhazsKKworCUJVR19PTihpID09IE1BWF9IT0xERVJTKTsKKwlyZXR1cm4gaTsKK30KKworLyogY2FsbCB0aGlzICphZnRlciogeW91IGluY3JlbWVudCBsb2NrLT5jb3VudCAqLworc3RhdGljIHZvaWQgX19hZGRfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdW5zaWduZWQgaCA9IF9fZmluZF9ob2xkZXIobG9jaywgTlVMTCk7CisjaWZkZWYgQ09ORklHX0RNX0RFQlVHX0JMT0NLX1NUQUNLX1RSQUNJTkcKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnQ7CisjZW5kaWYKKworCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwlsb2NrLT5ob2xkZXJzW2hdID0gdGFzazsKKworI2lmZGVmIENPTkZJR19ETV9ERUJVR19CTE9DS19TVEFDS19UUkFDSU5HCisJdCA9IGxvY2stPnRyYWNlcyArIGg7CisJdC0+bnJfZW50cmllcyA9IDA7CisJdC0+bWF4X2VudHJpZXMgPSBNQVhfU1RBQ0s7CisJdC0+ZW50cmllcyA9IGxvY2stPmVudHJpZXNbaF07CisJdC0+c2tpcCA9IDI7CisJc2F2ZV9zdGFja190cmFjZSh0KTsKKyNlbmRpZgorfQorCisvKiBjYWxsIHRoaXMgKmJlZm9yZSogeW91IGRlY3JlbWVudCBsb2NrLT5jb3VudCAqLworc3RhdGljIHZvaWQgX19kZWxfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdW5zaWduZWQgaCA9IF9fZmluZF9ob2xkZXIobG9jaywgdGFzayk7CisJbG9jay0+aG9sZGVyc1toXSA9IE5VTEw7CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworfQorCitzdGF0aWMgaW50IF9fY2hlY2tfaG9sZGVyKHN0cnVjdCBibG9ja19sb2NrICpsb2NrKQoreworCXVuc2lnbmVkIGk7CisjaWZkZWYgQ09ORklHX0RNX0RFQlVHX0JMT0NLX1NUQUNLX1RSQUNJTkcKKwlzdGF0aWMgc3RydWN0IHN0YWNrX3RyYWNlIHQ7CisJc3RhdGljIHN0YWNrX2VudHJpZXMgZW50cmllczsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IE1BWF9IT0xERVJTOyBpKyspIHsKKwkJaWYgKGxvY2stPmhvbGRlcnNbaV0gPT0gY3VycmVudCkgeworCQkJRE1FUlIoInJlY3Vyc2l2ZSBsb2NrIGRldGVjdGVkIGluIHBvb2wgbWV0YWRhdGEiKTsKKyNpZmRlZiBDT05GSUdfRE1fREVCVUdfQkxPQ0tfU1RBQ0tfVFJBQ0lORworCQkJRE1FUlIoInByZXZpb3VzbHkgaGVsZCBoZXJlOiIpOworCQkJcHJpbnRfc3RhY2tfdHJhY2UobG9jay0+dHJhY2VzICsgaSwgNCk7CisKKwkJCURNRVJSKCJzdWJzZXF1ZW50IGFxdWlzaXRpb24gYXR0ZW1wdGVkIGhlcmU6Iik7CisJCQl0Lm5yX2VudHJpZXMgPSAwOworCQkJdC5tYXhfZW50cmllcyA9IE1BWF9TVEFDSzsKKwkJCXQuZW50cmllcyA9IGVudHJpZXM7CisJCQl0LnNraXAgPSAzOworCQkJc2F2ZV9zdGFja190cmFjZSgmdCk7CisJCQlwcmludF9zdGFja190cmFjZSgmdCwgNCk7CisjZW5kaWYKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fd2FpdChzdHJ1Y3Qgd2FpdGVyICp3KQoreworCWZvciAoOzspIHsKKwkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCWlmICghdy0+dGFzaykKKwkJCWJyZWFrOworCisJCXNjaGVkdWxlKCk7CisJfQorCisJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKK30KKworc3RhdGljIHZvaWQgX193YWtlX3dhaXRlcihzdHJ1Y3Qgd2FpdGVyICp3KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCWxpc3RfZGVsKCZ3LT5saXN0KTsKKwl0YXNrID0gdy0+dGFzazsKKwlzbXBfbWIoKTsKKwl3LT50YXNrID0gTlVMTDsKKwl3YWtlX3VwX3Byb2Nlc3ModGFzayk7Cit9CisKKy8qCisgKiBXZSBlaXRoZXIgd2FrZSBhIGZldyByZWFkZXJzIG9yIGEgc2luZ2xlIHdyaXRlci4KKyAqLworc3RhdGljIHZvaWQgX193YWtlX21hbnkoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJc3RydWN0IHdhaXRlciAqdywgKnRtcDsKKworCUJVR19PTihsb2NrLT5jb3VudCA8IDApOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3LCB0bXAsICZsb2NrLT53YWl0ZXJzLCBsaXN0KSB7CisJCWlmIChsb2NrLT5jb3VudCA+PSBNQVhfSE9MREVSUykKKwkJCXJldHVybjsKKworCQlpZiAody0+d2FudHNfd3JpdGUpIHsKKwkJCWlmIChsb2NrLT5jb3VudCA+IDApCisJCQkJcmV0dXJuOyAvKiBzdGlsbCByZWFkIGxvY2tlZCAqLworCisJCQlsb2NrLT5jb3VudCA9IC0xOworCQkJX19hZGRfaG9sZGVyKGxvY2ssIHctPnRhc2spOworCQkJX193YWtlX3dhaXRlcih3KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxvY2stPmNvdW50Kys7CisJCV9fYWRkX2hvbGRlcihsb2NrLCB3LT50YXNrKTsKKwkJX193YWtlX3dhaXRlcih3KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsX2luaXQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmbG9jay0+bG9jayk7CisJbG9jay0+Y291bnQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZsb2NrLT53YWl0ZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPTERFUlM7IGkrKykKKwkJbG9jay0+aG9sZGVyc1tpXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19hdmFpbGFibGVfZm9yX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJcmV0dXJuIGxvY2stPmNvdW50ID49IDAgJiYKKwkJbG9jay0+Y291bnQgPCBNQVhfSE9MREVSUyAmJgorCQlsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKTsKK30KKworc3RhdGljIGludCBibF9kb3duX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IHI7CisJc3RydWN0IHdhaXRlciB3OworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoX19hdmFpbGFibGVfZm9yX3JlYWQobG9jaykpIHsKKwkJbG9jay0+Y291bnQrKzsKKwkJX19hZGRfaG9sZGVyKGxvY2ssIGN1cnJlbnQpOworCQlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWdldF90YXNrX3N0cnVjdChjdXJyZW50KTsKKworCXcudGFzayA9IGN1cnJlbnQ7CisJdy53YW50c193cml0ZSA9IDA7CisJbGlzdF9hZGRfdGFpbCgmdy5saXN0LCAmbG9jay0+d2FpdGVycyk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCisJX193YWl0KCZ3KTsKKwlwdXRfdGFza19zdHJ1Y3QoY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxfZG93bl9yZWFkX25vbmJsb2NrKHN0cnVjdCBibG9ja19sb2NrICpsb2NrKQoreworCWludCByOworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJaWYgKF9fYXZhaWxhYmxlX2Zvcl9yZWFkKGxvY2spKSB7CisJCWxvY2stPmNvdW50Kys7CisJCV9fYWRkX2hvbGRlcihsb2NrLCBjdXJyZW50KTsKKwkJciA9IDA7CisJfSBlbHNlCisJCXIgPSAtRVdPVUxEQkxPQ0s7CisKK291dDoKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGJsX3VwX3JlYWQoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlCVUdfT04obG9jay0+Y291bnQgPD0gMCk7CisJX19kZWxfaG9sZGVyKGxvY2ssIGN1cnJlbnQpOworCS0tbG9jay0+Y291bnQ7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkKKwkJX193YWtlX21hbnkobG9jayk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW50IGJsX2Rvd25fd3JpdGUoc3RydWN0IGJsb2NrX2xvY2sgKmxvY2spCit7CisJaW50IHI7CisJc3RydWN0IHdhaXRlciB3OworCisJc3Bpbl9sb2NrKCZsb2NrLT5sb2NrKTsKKwlyID0gX19jaGVja19ob2xkZXIobG9jayk7CisJaWYgKHIpIHsKKwkJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAobG9jay0+Y291bnQgPT0gMCAmJiBsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkgeworCQlsb2NrLT5jb3VudCA9IC0xOworCQlfX2FkZF9ob2xkZXIobG9jaywgY3VycmVudCk7CisJCXNwaW5fdW5sb2NrKCZsb2NrLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOworCXcudGFzayA9IGN1cnJlbnQ7CisJdy53YW50c193cml0ZSA9IDE7CisKKwkvKgorCSAqIFdyaXRlcnMgZ2l2ZW4gcHJpb3JpdHkuIFdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBtdXRhdG9yIGluIHRoZQorCSAqIHN5c3RlbSwgc28gaWdub3JpbmcgdGhlIG9yZGVyaW5nIHJldmVyc2FsLgorCSAqLworCWxpc3RfYWRkKCZ3Lmxpc3QsICZsb2NrLT53YWl0ZXJzKTsKKwlzcGluX3VubG9jaygmbG9jay0+bG9jayk7CisKKwlfX3dhaXQoJncpOworCXB1dF90YXNrX3N0cnVjdChjdXJyZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibF91cF93cml0ZShzdHJ1Y3QgYmxvY2tfbG9jayAqbG9jaykKK3sKKwlzcGluX2xvY2soJmxvY2stPmxvY2spOworCV9fZGVsX2hvbGRlcihsb2NrLCBjdXJyZW50KTsKKwlsb2NrLT5jb3VudCA9IDA7CisJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT53YWl0ZXJzKSkKKwkJX193YWtlX21hbnkobG9jayk7CisJc3Bpbl91bmxvY2soJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfcmVjdXJzaXZlX2J1ZyhkbV9ibG9ja190IGIsIGludCByKQoreworCWlmIChyID09IC1FSU5WQUwpCisJCURNRVJSKCJyZWN1cnNpdmUgYWNxdWlzaXRpb24gb2YgYmxvY2sgJWxsdSByZXF1ZXN0ZWQuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBCbG9jayBtYW5hZ2VyIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB1c2luZyBkbS1idWZpby4gIHN0cnVjdAorICogZG1fYmxvY2tfbWFuYWdlciBhbmQgc3RydWN0IGRtX2Jsb2NrIG1hcCBkaXJlY3RseSBvbnRvIGEgY291cGxlIG9mCisgKiBzdHJ1Y3RzIGluIHRoZSBidWZpbyBpbnRlcmZhY2UuICBJIHdhbnQgdG8gcmV0YWluIHRoZSBmcmVlZG9tIHRvIG1vdmUKKyAqIGF3YXkgZnJvbSBidWZpbyBpbiB0aGUgZnV0dXJlLiAgU28gdGhlc2Ugc3RydWN0cyBhcmUganVzdCBjYXN0IHdpdGhpbgorICogdGhpcyAuYyBmaWxlLCByYXRoZXIgdGhhbiBtYWtpbmcgaXQgdGhyb3VnaCB0byB0aGUgcHVibGljIGludGVyZmFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbV9idWZmZXIgKnRvX2J1ZmZlcihzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIChzdHJ1Y3QgZG1fYnVmZmVyICopIGI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICp0b19idWZpbyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0pCit7CisJcmV0dXJuIChzdHJ1Y3QgZG1fYnVmaW9fY2xpZW50ICopIGJtOworfQorCitkbV9ibG9ja190IGRtX2Jsb2NrX2xvY2F0aW9uKHN0cnVjdCBkbV9ibG9jayAqYikKK3sKKwlyZXR1cm4gZG1fYnVmaW9fZ2V0X2Jsb2NrX251bWJlcih0b19idWZmZXIoYikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYmxvY2tfbG9jYXRpb24pOworCit2b2lkICpkbV9ibG9ja19kYXRhKHN0cnVjdCBkbV9ibG9jayAqYikKK3sKKwlyZXR1cm4gZG1fYnVmaW9fZ2V0X2Jsb2NrX2RhdGEodG9fYnVmZmVyKGIpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2Jsb2NrX2RhdGEpOworCitzdHJ1Y3QgYnVmZmVyX2F1eCB7CisJc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdmFsaWRhdG9yOworCXN0cnVjdCBibG9ja19sb2NrIGxvY2s7CisJaW50IHdyaXRlX2xvY2tlZDsKK307CisKK3N0YXRpYyB2b2lkIGRtX2Jsb2NrX21hbmFnZXJfYWxsb2NfY2FsbGJhY2soc3RydWN0IGRtX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEoYnVmKTsKKwlhdXgtPnZhbGlkYXRvciA9IE5VTEw7CisJYmxfaW5pdCgmYXV4LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZG1fYmxvY2tfbWFuYWdlcl93cml0ZV9jYWxsYmFjayhzdHJ1Y3QgZG1fYnVmZmVyICpidWYpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eCA9IGRtX2J1ZmlvX2dldF9hdXhfZGF0YShidWYpOworCWlmIChhdXgtPnZhbGlkYXRvcikgeworCQlhdXgtPnZhbGlkYXRvci0+cHJlcGFyZV9mb3Jfd3JpdGUoYXV4LT52YWxpZGF0b3IsIChzdHJ1Y3QgZG1fYmxvY2sgKikgYnVmLAorCQkJIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKGRtX2J1ZmlvX2dldF9jbGllbnQoYnVmKSkpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdWJsaWMgaW50ZXJmYWNlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpkbV9ibG9ja19tYW5hZ2VyX2NyZWF0ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQkJIHVuc2lnbmVkIGJsb2NrX3NpemUsCisJCQkJCQkgdW5zaWduZWQgY2FjaGVfc2l6ZSwKKwkJCQkJCSB1bnNpZ25lZCBtYXhfaGVsZF9wZXJfdGhyZWFkKQoreworCXJldHVybiAoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKikKKwkJZG1fYnVmaW9fY2xpZW50X2NyZWF0ZShiZGV2LCBibG9ja19zaXplLCBtYXhfaGVsZF9wZXJfdGhyZWFkLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9hdXgpLAorCQkJCSAgICAgICBkbV9ibG9ja19tYW5hZ2VyX2FsbG9jX2NhbGxiYWNrLAorCQkJCSAgICAgICBkbV9ibG9ja19tYW5hZ2VyX3dyaXRlX2NhbGxiYWNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2Jsb2NrX21hbmFnZXJfY3JlYXRlKTsKKwordm9pZCBkbV9ibG9ja19tYW5hZ2VyX2Rlc3Ryb3koc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKQoreworCXJldHVybiBkbV9idWZpb19jbGllbnRfZGVzdHJveSh0b19idWZpbyhibSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYmxvY2tfbWFuYWdlcl9kZXN0cm95KTsKKwordW5zaWduZWQgZG1fYm1fYmxvY2tfc2l6ZShzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0pCit7CisJcmV0dXJuIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHRvX2J1ZmlvKGJtKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9ibV9ibG9ja19zaXplKTsKKworZG1fYmxvY2tfdCBkbV9ibV9ucl9ibG9ja3Moc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKQoreworCXJldHVybiBkbV9idWZpb19nZXRfZGV2aWNlX3NpemUodG9fYnVmaW8oYm0pKTsKK30KKworc3RhdGljIGludCBkbV9ibV92YWxpZGF0ZV9idWZmZXIoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLAorCQkJCSBzdHJ1Y3QgZG1fYnVmZmVyICpidWYsCisJCQkJIHN0cnVjdCBidWZmZXJfYXV4ICphdXgsCisJCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYpCit7CisJaWYgKHVubGlrZWx5KCFhdXgtPnZhbGlkYXRvcikpIHsKKwkJaW50IHI7CisJCWlmICghdikKKwkJCXJldHVybiAwOworCQlyID0gdi0+Y2hlY2sodiwgKHN0cnVjdCBkbV9ibG9jayAqKSBidWYsIGRtX2J1ZmlvX2dldF9ibG9ja19zaXplKHRvX2J1ZmlvKGJtKSkpOworCQlpZiAodW5saWtlbHkocikpCisJCQlyZXR1cm4gcjsKKwkJYXV4LT52YWxpZGF0b3IgPSB2OworCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseShhdXgtPnZhbGlkYXRvciAhPSB2KSkgeworCQkJRE1FUlIoInZhbGlkYXRvciBtaXNtYXRjaCAob2xkPSVzIHZzIG5ldz0lcykgZm9yIGJsb2NrICVsbHUiLAorCQkJCWF1eC0+dmFsaWRhdG9yLT5uYW1lLCB2ID8gdi0+bmFtZSA6ICJOVUxMIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQlkbV9idWZpb19nZXRfYmxvY2tfbnVtYmVyKGJ1ZikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK2ludCBkbV9ibV9yZWFkX2xvY2soc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IGIsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXg7CisJdm9pZCAqcDsKKwlpbnQgcjsKKworCXAgPSBkbV9idWZpb19yZWFkKHRvX2J1ZmlvKGJtKSwgYiwgKHN0cnVjdCBkbV9idWZmZXIgKiopIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KElTX0VSUihwKSkpCisJCXJldHVybiBQVFJfRVJSKHApOworCisJYXV4ID0gZG1fYnVmaW9fZ2V0X2F1eF9kYXRhKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJciA9IGJsX2Rvd25fcmVhZCgmYXV4LT5sb2NrKTsKKwlpZiAodW5saWtlbHkocikpIHsKKwkJZG1fYnVmaW9fcmVsZWFzZSh0b19idWZmZXIoKnJlc3VsdCkpOworCQlyZXBvcnRfcmVjdXJzaXZlX2J1ZyhiLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJYXV4LT53cml0ZV9sb2NrZWQgPSAwOworCisJciA9IGRtX2JtX3ZhbGlkYXRlX2J1ZmZlcihibSwgdG9fYnVmZmVyKCpyZXN1bHQpLCBhdXgsIHYpOworCWlmICh1bmxpa2VseShyKSkgeworCQlibF91cF9yZWFkKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fcmVhZF9sb2NrKTsKKworaW50IGRtX2JtX3dyaXRlX2xvY2soc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLAorCQkgICAgIGRtX2Jsb2NrX3QgYiwgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwl2b2lkICpwOworCWludCByOworCisJcCA9IGRtX2J1ZmlvX3JlYWQodG9fYnVmaW8oYm0pLCBiLCAoc3RydWN0IGRtX2J1ZmZlciAqKikgcmVzdWx0KTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHApKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl93cml0ZSgmYXV4LT5sb2NrKTsKKwlpZiAocikgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJlcG9ydF9yZWN1cnNpdmVfYnVnKGIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlhdXgtPndyaXRlX2xvY2tlZCA9IDE7CisKKwlyID0gZG1fYm1fdmFsaWRhdGVfYnVmZmVyKGJtLCB0b19idWZmZXIoKnJlc3VsdCksIGF1eCwgdik7CisJaWYgKHVubGlrZWx5KHIpKSB7CisJCWJsX3VwX3dyaXRlKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fd3JpdGVfbG9jayk7CisKK2ludCBkbV9ibV9yZWFkX3RyeV9sb2NrKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCWRtX2Jsb2NrX3QgYiwgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCXN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2F1eCAqYXV4OworCXZvaWQgKnA7CisJaW50IHI7CisKKwlwID0gZG1fYnVmaW9fZ2V0KHRvX2J1ZmlvKGJtKSwgYiwgKHN0cnVjdCBkbV9idWZmZXIgKiopIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KElTX0VSUihwKSkpCisJCXJldHVybiBQVFJfRVJSKHApOworCWlmICh1bmxpa2VseSghcCkpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl9yZWFkX25vbmJsb2NrKCZhdXgtPmxvY2spOworCWlmIChyIDwgMCkgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJlcG9ydF9yZWN1cnNpdmVfYnVnKGIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJYXV4LT53cml0ZV9sb2NrZWQgPSAwOworCisJciA9IGRtX2JtX3ZhbGlkYXRlX2J1ZmZlcihibSwgdG9fYnVmZmVyKCpyZXN1bHQpLCBhdXgsIHYpOworCWlmICh1bmxpa2VseShyKSkgeworCQlibF91cF9yZWFkKCZhdXgtPmxvY2spOworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG1fYm1fd3JpdGVfbG9ja196ZXJvKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCSAgZG1fYmxvY2tfdCBiLCBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwl2b2lkICpwOworCisJcCA9IGRtX2J1ZmlvX25ldyh0b19idWZpbyhibSksIGIsIChzdHJ1Y3QgZG1fYnVmZmVyICoqKSByZXN1bHQpOworCWlmICh1bmxpa2VseShJU19FUlIocCkpKQorCQlyZXR1cm4gUFRSX0VSUihwKTsKKworCW1lbXNldChwLCAwLCBkbV9ibV9ibG9ja19zaXplKGJtKSk7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKCpyZXN1bHQpKTsKKwlyID0gYmxfZG93bl93cml0ZSgmYXV4LT5sb2NrKTsKKwlpZiAocikgeworCQlkbV9idWZpb19yZWxlYXNlKHRvX2J1ZmZlcigqcmVzdWx0KSk7CisJCXJldHVybiByOworCX0KKworCWF1eC0+d3JpdGVfbG9ja2VkID0gMTsKKwlhdXgtPnZhbGlkYXRvciA9IHY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2JtX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJc3RydWN0IGJ1ZmZlcl9hdXggKmF1eDsKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKGIpKTsKKworCWlmIChhdXgtPndyaXRlX2xvY2tlZCkgeworCQlkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSh0b19idWZmZXIoYikpOworCQlibF91cF93cml0ZSgmYXV4LT5sb2NrKTsKKwl9IGVsc2UKKwkJYmxfdXBfcmVhZCgmYXV4LT5sb2NrKTsKKworCWRtX2J1ZmlvX3JlbGVhc2UodG9fYnVmZmVyKGIpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fdW5sb2NrKTsKKworaW50IGRtX2JtX3VubG9ja19tb3ZlKHN0cnVjdCBkbV9ibG9jayAqYiwgZG1fYmxvY2tfdCBuKQoreworCXN0cnVjdCBidWZmZXJfYXV4ICphdXg7CisKKwlhdXggPSBkbV9idWZpb19nZXRfYXV4X2RhdGEodG9fYnVmZmVyKGIpKTsKKworCWlmIChhdXgtPndyaXRlX2xvY2tlZCkgeworCQlkbV9idWZpb19tYXJrX2J1ZmZlcl9kaXJ0eSh0b19idWZmZXIoYikpOworCQlibF91cF93cml0ZSgmYXV4LT5sb2NrKTsKKwl9IGVsc2UKKwkJYmxfdXBfcmVhZCgmYXV4LT5sb2NrKTsKKworCWRtX2J1ZmlvX3JlbGVhc2VfbW92ZSh0b19idWZmZXIoYiksIG4pOworCXJldHVybiAwOworfQorCitpbnQgZG1fYm1fZmx1c2hfYW5kX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sCisJCQkgICBzdHJ1Y3QgZG1fYmxvY2sgKnN1cGVyYmxvY2spCit7CisJaW50IHI7CisKKwlyID0gZG1fYnVmaW9fd3JpdGVfZGlydHlfYnVmZmVycyh0b19idWZpbyhibSkpOworCWlmICh1bmxpa2VseShyKSkKKwkJcmV0dXJuIHI7CisJciA9IGRtX2J1ZmlvX2lzc3VlX2ZsdXNoKHRvX2J1ZmlvKGJtKSk7CisJaWYgKHVubGlrZWx5KHIpKQorCQlyZXR1cm4gcjsKKworCWRtX2JtX3VubG9jayhzdXBlcmJsb2NrKTsKKworCXIgPSBkbV9idWZpb193cml0ZV9kaXJ0eV9idWZmZXJzKHRvX2J1ZmlvKGJtKSk7CisJaWYgKHVubGlrZWx5KHIpKQorCQlyZXR1cm4gcjsKKwlyID0gZG1fYnVmaW9faXNzdWVfZmx1c2godG9fYnVmaW8oYm0pKTsKKwlpZiAodW5saWtlbHkocikpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3UzMiBkbV9ibV9jaGVja3N1bShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1MzIgaW5pdF94b3IpCit7CisJcmV0dXJuIGNyYzMyYyh+KHUzMikgMCwgZGF0YSwgbGVuKSBeIGluaXRfeG9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fYm1fY2hlY2tzdW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKb2UgVGhvcm5iZXIgPGRtLWRldmVsQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkltbXV0YWJsZSBtZXRhZGF0YSBsaWJyYXJ5IGZvciBkbSIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYmxvY2stbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDgzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1ibG9jay1tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX0JMT0NLX01BTkFHRVJfSAorI2RlZmluZSBfTElOVVhfRE1fQkxPQ0tfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmxvY2sgbnVtYmVyLgorICovCit0eXBlZGVmIHVpbnQ2NF90IGRtX2Jsb2NrX3Q7CitzdHJ1Y3QgZG1fYmxvY2s7CisKK2RtX2Jsb2NrX3QgZG1fYmxvY2tfbG9jYXRpb24oc3RydWN0IGRtX2Jsb2NrICpiKTsKK3ZvaWQgKmRtX2Jsb2NrX2RhdGEoc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEBuYW1lIHNob3VsZCBiZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYmxvY2sgbWFuYWdlciwgbm8gbG9uZ2VyCisgKiB0aGFuIDMyIGNoYXJzLgorICoKKyAqIEBtYXhfaGVsZF9wZXJfdGhyZWFkIHNob3VsZCBiZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9ja3MsIHJlYWQgb3IKKyAqIHdyaXRlLCB0aGF0IGFuIGluZGl2aWR1YWwgdGhyZWFkIGhvbGRzIGF0IGFueSBvbmUgdGltZS4KKyAqLworc3RydWN0IGRtX2Jsb2NrX21hbmFnZXI7CitzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqZG1fYmxvY2tfbWFuYWdlcl9jcmVhdGUoCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgYmxvY2tfc2l6ZSwKKwl1bnNpZ25lZCBjYWNoZV9zaXplLCB1bnNpZ25lZCBtYXhfaGVsZF9wZXJfdGhyZWFkKTsKK3ZvaWQgZG1fYmxvY2tfbWFuYWdlcl9kZXN0cm95KHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSk7CisKK3Vuc2lnbmVkIGRtX2JtX2Jsb2NrX3NpemUoc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtKTsKK2RtX2Jsb2NrX3QgZG1fYm1fbnJfYmxvY2tzKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgdmFsaWRhdG9yIGFsbG93cyB0aGUgY2FsbGVyIHRvIHZlcmlmeSBuZXdseS1yZWFkIGRhdGEgYW5kIG1vZGlmeQorICogdGhlIGRhdGEganVzdCBiZWZvcmUgd3JpdGluZywgZS5nLiB0byBjYWxjdWxhdGUgY2hlY2tzdW1zLiAgSXQncworICogaW1wb3J0YW50IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB5b3VyIHVzZSBvZiB2YWxpZGF0b3JzLiAgVGhlIG9ubHkgdGltZQorICogeW91IGNhbiBjaGFuZ2UgdmFsaWRhdG9ycyBpcyBpZiB5b3UgY2FsbCBkbV9ibV93cml0ZV9sb2NrX3plcm8uCisgKi8KK3N0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKnByZXBhcmVfZm9yX3dyaXRlKShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LCBzdHJ1Y3QgZG1fYmxvY2sgKmIsIHNpemVfdCBibG9ja19zaXplKTsKKworCS8qCisJICogUmV0dXJuIDAgaWYgdGhlIGNoZWNrc3VtIGlzIHZhbGlkIG9yIDwgMCBvbiBlcnJvci4KKwkgKi8KKwlpbnQgKCpjaGVjaykoc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwgc3RydWN0IGRtX2Jsb2NrICpiLCBzaXplX3QgYmxvY2tfc2l6ZSk7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogWW91IGNhbiBoYXZlIG11bHRpcGxlIGNvbmN1cnJlbnQgcmVhZGVycyBvciBhIHNpbmdsZSB3cml0ZXIgaG9sZGluZyBhCisgKiBibG9jayBsb2NrLgorICovCisKKy8qCisgKiBkbV9ibV9sb2NrKCkgbG9ja3MgYSBibG9jayBhbmQgcmV0dXJucyB0aHJvdWdoIEByZXN1bHQgYSBwb2ludGVyIHRvCisgKiBtZW1vcnkgdGhhdCBob2xkcyBhIGNvcHkgb2YgdGhhdCBibG9jay4gIElmIHlvdSBoYXZlIHdyaXRlLWxvY2tlZCB0aGUKKyAqIGJsb2NrIHRoZW4gYW55IGNoYW5nZXMgeW91IG1ha2UgdG8gbWVtb3J5IHBvaW50ZWQgdG8gYnkgQHJlc3VsdCB3aWxsIGJlCisgKiB3cml0dGVuIGJhY2sgdG8gdGhlIGRpc2sgc29tZXRpbWUgYWZ0ZXIgZG1fYm1fdW5sb2NrIGlzIGNhbGxlZC4KKyAqLworaW50IGRtX2JtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCitpbnQgZG1fYm1fd3JpdGVfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCk7CisKKy8qCisgKiBUaGUgKl90cnlfbG9jayB2YXJpYW50cyByZXR1cm4gLUVXT1VMREJMT0NLIGlmIHRoZSBibG9jayBpc24ndAorICogYXZhaWxhYmxlIGltbWVkaWF0ZWx5LgorICovCitpbnQgZG1fYm1fcmVhZF90cnlfbG9jayhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJCXN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQlzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCisvKgorICogVXNlIGRtX2JtX3dyaXRlX2xvY2tfemVybygpIHdoZW4geW91IGtub3cgeW91J3JlIGdvaW5nIHRvCisgKiBvdmVyd3JpdGUgdGhlIGJsb2NrIGNvbXBsZXRlbHkuICBJdCBzYXZlcyBhIGRpc2sgcmVhZC4KKyAqLworaW50IGRtX2JtX3dyaXRlX2xvY2tfemVybyhzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3QgYiwKKwkJCSAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCSAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KTsKKworaW50IGRtX2JtX3VubG9jayhzdHJ1Y3QgZG1fYmxvY2sgKmIpOworCisvKgorICogQW4gb3B0aW1pc2F0aW9uOyB3ZSBvZnRlbiB3YW50IHRvIGNvcHkgYSBibG9jaydzIGNvbnRlbnRzIHRvIGEgbmV3CisgKiBibG9jay4gIGVnLCBhcyBwYXJ0IG9mIHRoZSBzaGFkb3dpbmcgb3BlcmF0aW9uLiAgSXQncyBmYXIgYmV0dGVyIGZvcgorICogYnVmaW8gdG8gZG8gdGhpcyBtb3ZlIGJlaGluZCB0aGUgc2NlbmVzIHRoYW4gaG9sZCAyIGxvY2tzIGFuZCBtZW1jcHkgdGhlCisgKiBkYXRhLgorICovCitpbnQgZG1fYm1fdW5sb2NrX21vdmUoc3RydWN0IGRtX2Jsb2NrICpiLCBkbV9ibG9ja190IG4pOworCisvKgorICogSXQncyBhIGNvbW1vbiBpZGlvbSB0byBoYXZlIGEgc3VwZXJibG9jayB0aGF0IHNob3VsZCBiZSBjb21taXR0ZWQgbGFzdC4KKyAqCisgKiBAc3VwZXJibG9jayBzaG91bGQgYmUgd3JpdGUtbG9ja2VkIG9uIGVudHJ5LiBJdCB3aWxsIGJlIHVubG9ja2VkIGR1cmluZworICogdGhpcyBmdW5jdGlvbi4gIEFsbCBkaXJ0eSBibG9ja3MgYXJlIGd1YXJhbnRlZWQgdG8gYmUgd3JpdHRlbiBhbmQgZmx1c2hlZAorICogYmVmb3JlIHRoZSBzdXBlcmJsb2NrLgorICoKKyAqIFRoaXMgbWV0aG9kIGFsd2F5cyBibG9ja3MuCisgKi8KK2ludCBkbV9ibV9mbHVzaF9hbmRfdW5sb2NrKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCSAgIHN0cnVjdCBkbV9ibG9jayAqc3VwZXJibG9jayk7CisKK3UzMiBkbV9ibV9jaGVja3N1bShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1MzIgaW5pdF94b3IpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYJLyogX0xJTlVYX0RNX0JMT0NLX01BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUtaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLWludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3OWM3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLWludGVybmFsLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgRE1fQlRSRUVfSU5URVJOQUxfSAorI2RlZmluZSBETV9CVFJFRV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJkbS1idHJlZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2UnbGwgbmVlZCAyIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3Igbi0+Y3N1bSBhbmQgbi0+YmxvY2tucgorICogdG8gc3VwcG9ydCBkbS1idHJlZS1zcGluZS5jIGluIHRoYXQgY2FzZS4KKyAqLworCitlbnVtIG5vZGVfZmxhZ3MgeworCUlOVEVSTkFMX05PREUgPSAxLAorCUxFQUZfTk9ERSA9IDEgPDwgMQorfTsKKworLyoKKyAqIEV2ZXJ5IGJ0cmVlIG5vZGUgYmVnaW5zIHdpdGggdGhpcyBzdHJ1Y3R1cmUuICBNYWtlIHN1cmUgaXQncyBhIG11bHRpcGxlCisgKiBvZiA4LWJ5dGVzIGluIHNpemUsIG90aGVyd2lzZSB0aGUgNjRiaXQga2V5cyB3aWxsIGJlIG1pcy1hbGlnbmVkLgorICovCitzdHJ1Y3Qgbm9kZV9oZWFkZXIgeworCV9fbGUzMiBjc3VtOworCV9fbGUzMiBmbGFnczsKKwlfX2xlNjQgYmxvY2tucjsgLyogQmxvY2sgdGhpcyBub2RlIGlzIHN1cHBvc2VkIHRvIGxpdmUgaW4uICovCisKKwlfX2xlMzIgbnJfZW50cmllczsKKwlfX2xlMzIgbWF4X2VudHJpZXM7CisJX19sZTMyIHZhbHVlX3NpemU7CisJX19sZTMyIHBhZGRpbmc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgbm9kZSB7CisJc3RydWN0IG5vZGVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlNjQga2V5c1swXTsKK30gX19wYWNrZWQ7CisKKwordm9pZCBpbmNfY2hpbGRyZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBzdHJ1Y3Qgbm9kZSAqbiwKKwkJICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQpOworCitpbnQgbmV3X2Jsb2NrKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworaW50IHVubG9ja19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyoKKyAqIFNwaW5lcyBrZWVwIHRyYWNrIG9mIHRoZSByb2xsaW5nIGxvY2tzLiAgVGhlcmUgYXJlIDIgdmFyaWFudHMsIHJlYWQtb25seQorICogYW5kIG9uZSB0aGF0IHVzZXMgc2hhZG93aW5nLiAgVGhlc2UgYXJlIHNlcGFyYXRlIHN0cnVjdHMgdG8gYWxsb3cgdGhlCisgKiB0eXBlIGNoZWNrZXIgdG8gc3BvdCBtaXN1c2UsIGZvciBleGFtcGxlIGFjY2lkZW50YWxseSBjYWxsaW5nIHJlYWRfbG9jaworICogb24gYSBzaGFkb3cgc3BpbmUuCisgKi8KK3N0cnVjdCByb19zcGluZSB7CisJc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm87CisKKwlpbnQgY291bnQ7CisJc3RydWN0IGRtX2Jsb2NrICpub2Rlc1syXTsKK307CisKK3ZvaWQgaW5pdF9yb19zcGluZShzdHJ1Y3Qgcm9fc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvKTsKK2ludCBleGl0X3JvX3NwaW5lKHN0cnVjdCByb19zcGluZSAqcyk7CitpbnQgcm9fc3RlcChzdHJ1Y3Qgcm9fc3BpbmUgKnMsIGRtX2Jsb2NrX3QgbmV3X2NoaWxkKTsKK3N0cnVjdCBub2RlICpyb19ub2RlKHN0cnVjdCByb19zcGluZSAqcyk7CisKK3N0cnVjdCBzaGFkb3dfc3BpbmUgeworCXN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvOworCisJaW50IGNvdW50OworCXN0cnVjdCBkbV9ibG9jayAqbm9kZXNbMl07CisKKwlkbV9ibG9ja190IHJvb3Q7Cit9OworCit2b2lkIGluaXRfc2hhZG93X3NwaW5lKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvKTsKK2ludCBleGl0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKTsKKworaW50IHNoYWRvd19zdGVwKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3QgYiwKKwkJc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgKnZ0KTsKKworLyoKKyAqIFRoZSBzcGluZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X2N1cnJlbnQoc3RydWN0IHNoYWRvd19zcGluZSAqcyk7CisKKy8qCisgKiBUaGUgc3BpbmUgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbnRyaWVzIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKi8KK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X3BhcmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKTsKKworaW50IHNoYWRvd19oYXNfcGFyZW50KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMpOworCitpbnQgc2hhZG93X3Jvb3Qoc3RydWN0IHNoYWRvd19zcGluZSAqcyk7CisKKy8qCisgKiBTb21lIGlubGluZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgX19sZTY0ICprZXlfcHRyKHN0cnVjdCBub2RlICpuLCB1aW50MzJfdCBpbmRleCkKK3sKKwlyZXR1cm4gbi0+a2V5cyArIGluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnZhbHVlX2Jhc2Uoc3RydWN0IG5vZGUgKm4pCit7CisJcmV0dXJuICZuLT5rZXlzW2xlMzJfdG9fY3B1KG4tPmhlYWRlci5tYXhfZW50cmllcyldOworfQorCisvKgorICogRklYTUU6IE5vdyB0aGF0IHZhbHVlIHNpemUgaXMgc3RvcmVkIGluIG5vZGUgd2UgZG9uJ3QgbmVlZCB0aGUgdGhpcmQgcGFybS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICp2YWx1ZV9wdHIoc3RydWN0IG5vZGUgKm4sIHVpbnQzMl90IGluZGV4LCBzaXplX3QgdmFsdWVfc2l6ZSkKK3sKKwlCVUdfT04odmFsdWVfc2l6ZSAhPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIudmFsdWVfc2l6ZSkpOworCXJldHVybiB2YWx1ZV9iYXNlKG4pICsgKHZhbHVlX3NpemUgKiBpbmRleCk7Cit9CisKKy8qCisgKiBBc3N1bWVzIHRoZSB2YWx1ZXMgYXJlIHN1aXRhYmx5LWFsaWduZWQgYW5kIGNvbnZlcnRzIHRvIGNvcmUgZm9ybWF0LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHZhbHVlNjQoc3RydWN0IG5vZGUgKm4sIHVpbnQzMl90IGluZGV4KQoreworCV9fbGU2NCAqdmFsdWVzX2xlID0gdmFsdWVfYmFzZShuKTsKKworCXJldHVybiBsZTY0X3RvX2NwdSh2YWx1ZXNfbGVbaW5kZXhdKTsKK30KKworLyoKKyAqIFNlYXJjaGluZyBmb3IgYSBrZXkgd2l0aGluIGEgc2luZ2xlIG5vZGUuCisgKi8KK2ludCBsb3dlcl9ib3VuZChzdHJ1Y3Qgbm9kZSAqbiwgdWludDY0X3Qga2V5KTsKKworZXh0ZXJuIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgYnRyZWVfbm9kZV92YWxpZGF0b3I7CisKKyNlbmRpZgkvKiBETV9CVFJFRV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS1yZW1vdmUuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXJlbW92ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2ZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS1yZW1vdmUuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ0cmVlLmgiCisjaW5jbHVkZSAiZG0tYnRyZWUtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworLyoKKyAqIFJlbW92aW5nIGFuIGVudHJ5IGZyb20gYSBidHJlZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogQSB2ZXJ5IGltcG9ydGFudCBjb25zdHJhaW50IGZvciBvdXIgYnRyZWUgaXMgdGhhdCBubyBub2RlLCBleGNlcHQgdGhlCisgKiByb290LCBtYXkgaGF2ZSBmZXdlciB0aGFuIGEgY2VydGFpbiBudW1iZXIgb2YgZW50cmllcy4KKyAqIChNSU5fRU5UUklFUyA8PSBucl9lbnRyaWVzIDw9IE1BWF9FTlRSSUVTKS4KKyAqCisgKiBFbnN1cmluZyB0aGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSB3YXkgd2Ugd2FudCB0byBvbmx5IGV2ZXIgaG9sZCB0aGUKKyAqIGxvY2tzIG9uIDIgbm9kZXMgY29uY3VycmVudGx5LCBhbmQgb25seSBjaGFuZ2Ugbm9kZXMgaW4gYSB0b3AgdG8gYm90dG9tCisgKiBmYXNoaW9uLgorICoKKyAqIEVhY2ggbm9kZSBtYXkgaGF2ZSBhIGxlZnQgb3IgcmlnaHQgc2libGluZy4gIFdoZW4gZGVjZW5kaW5nIHRoZSBzcGluZSwKKyAqIGlmIGEgbm9kZSBjb250YWlucyBvbmx5IE1JTl9FTlRSSUVTIHRoZW4gd2UgdHJ5IGFuZCBpbmNyZWFzZSB0aGlzIHRvIGF0CisgKiBsZWFzdCBNSU5fRU5UUklFUyArIDEuICBXZSBkbyB0aGlzIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKyAqCisgKiBbQV0gTm8gc2libGluZ3MgPT4gdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIG5vZGUgaXMgdGhlIHJvb3QsIGluIHdoaWNoCisgKiAgICAgY2FzZSB3ZSBjb3B5IHRoZSBjaGlsZHMgY29udGVudHMgb3ZlciB0aGUgcm9vdC4KKyAqCisgKiBbQl0gTm8gbGVmdCBzaWJsaW5nCisgKiAgICAgPT0+IHJlYmFsYW5jZShub2RlLCByaWdodCBzaWJsaW5nKQorICoKKyAqIFtDXSBObyByaWdodCBzaWJsaW5nCisgKiAgICAgPT0+IHJlYmFsYW5jZShsZWZ0IHNpYmxpbmcsIG5vZGUpCisgKgorICogW0RdIEJvdGggc2libGluZ3MsIHRvdGFsX2VudHJpZXMobGVmdCwgbm9kZSwgcmlnaHQpIDw9IERFTF9USFJFU0hPTEQKKyAqICAgICA9PT4gZGVsZXRlIG5vZGUgYWRkaW5nIGl0J3MgY29udGVudHMgdG8gbGVmdCBhbmQgcmlnaHQKKyAqCisgKiBbRV0gQm90aCBzaWJsaW5ncywgdG90YWxfZW50cmllcyhsZWZ0LCBub2RlLCByaWdodCkgPiBERUxfVEhSRVNIT0xECisgKiAgICAgPT0+IHJlYmFsYW5jZShsZWZ0LCBub2RlLCByaWdodCkKKyAqCisgKiBBZnRlciB0aGVzZSBvcGVyYXRpb25zIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgb3VyIG9yaWdpbmFsIG5vZGUgbm8KKyAqIGxvbmdlciBjb250YWlucyB0aGUgZGVzaXJlZCBzdWIgdHJlZS4gIEZvciB0aGlzIHJlYXNvbiB0aGlzIHJlYmFsYW5jaW5nCisgKiBpcyBwZXJmb3JtZWQgb24gdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUuICBUaGlzIGFsc28gYXZvaWRzCisgKiBoYXZpbmcgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSByb290LgorICoKKyAqIE9uY2UgdGhpcyByZWJhbGFuY2luZyBoYXMgb2NjdXJyZWQgd2UgY2FuIHRoZW4gc3RlcCBpbnRvIHRoZSBjaGlsZCBub2RlCisgKiBmb3IgaW50ZXJuYWwgbm9kZXMuICBPciBkZWxldGUgdGhlIGVudHJ5IGZvciBsZWFmIG5vZGVzLgorICovCisKKy8qCisgKiBTb21lIGxpdHRsZSB1dGlsaXRpZXMgZm9yIG1vdmluZyBub2RlIGRhdGEgYXJvdW5kLgorICovCitzdGF0aWMgdm9pZCBub2RlX3NoaWZ0KHN0cnVjdCBub2RlICpuLCBpbnQgc2hpZnQpCit7CisJdWludDMyX3QgbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKwl1aW50MzJfdCB2YWx1ZV9zaXplID0gbGUzMl90b19jcHUobi0+aGVhZGVyLnZhbHVlX3NpemUpOworCisJaWYgKHNoaWZ0IDwgMCkgeworCQlzaGlmdCA9IC1zaGlmdDsKKwkJQlVHX09OKHNoaWZ0ID4gbnJfZW50cmllcyk7CisJCUJVR19PTigodm9pZCAqKSBrZXlfcHRyKG4sIHNoaWZ0KSA+PSB2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpKTsKKwkJbWVtbW92ZShrZXlfcHRyKG4sIDApLAorCQkJa2V5X3B0cihuLCBzaGlmdCksCisJCQkobnJfZW50cmllcyAtIHNoaWZ0KSAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgMCwgdmFsdWVfc2l6ZSksCisJCQl2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpLAorCQkJKG5yX2VudHJpZXMgLSBzaGlmdCkgKiB2YWx1ZV9zaXplKTsKKwl9IGVsc2UgeworCQlCVUdfT04obnJfZW50cmllcyArIHNoaWZ0ID4gbGUzMl90b19jcHUobi0+aGVhZGVyLm1heF9lbnRyaWVzKSk7CisJCW1lbW1vdmUoa2V5X3B0cihuLCBzaGlmdCksCisJCQlrZXlfcHRyKG4sIDApLAorCQkJbnJfZW50cmllcyAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgc2hpZnQsIHZhbHVlX3NpemUpLAorCQkJdmFsdWVfcHRyKG4sIDAsIHZhbHVlX3NpemUpLAorCQkJbnJfZW50cmllcyAqIHZhbHVlX3NpemUpOworCX0KK30KKworc3RhdGljIHZvaWQgbm9kZV9jb3B5KHN0cnVjdCBub2RlICpsZWZ0LCBzdHJ1Y3Qgbm9kZSAqcmlnaHQsIGludCBzaGlmdCkKK3sKKwl1aW50MzJfdCBucl9sZWZ0ID0gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm5yX2VudHJpZXMpOworCXVpbnQzMl90IHZhbHVlX3NpemUgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIudmFsdWVfc2l6ZSk7CisJQlVHX09OKHZhbHVlX3NpemUgIT0gbGUzMl90b19jcHUocmlnaHQtPmhlYWRlci52YWx1ZV9zaXplKSk7CisKKwlpZiAoc2hpZnQgPCAwKSB7CisJCXNoaWZ0ID0gLXNoaWZ0OworCQlCVUdfT04obnJfbGVmdCArIHNoaWZ0ID4gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm1heF9lbnRyaWVzKSk7CisJCW1lbWNweShrZXlfcHRyKGxlZnQsIG5yX2xlZnQpLAorCQkgICAgICAga2V5X3B0cihyaWdodCwgMCksCisJCSAgICAgICBzaGlmdCAqIHNpemVvZihfX2xlNjQpKTsKKwkJbWVtY3B5KHZhbHVlX3B0cihsZWZ0LCBucl9sZWZ0LCB2YWx1ZV9zaXplKSwKKwkJICAgICAgIHZhbHVlX3B0cihyaWdodCwgMCwgdmFsdWVfc2l6ZSksCisJCSAgICAgICBzaGlmdCAqIHZhbHVlX3NpemUpOworCX0gZWxzZSB7CisJCUJVR19PTihzaGlmdCA+IGxlMzJfdG9fY3B1KHJpZ2h0LT5oZWFkZXIubWF4X2VudHJpZXMpKTsKKwkJbWVtY3B5KGtleV9wdHIocmlnaHQsIDApLAorCQkgICAgICAga2V5X3B0cihsZWZ0LCBucl9sZWZ0IC0gc2hpZnQpLAorCQkgICAgICAgc2hpZnQgKiBzaXplb2YoX19sZTY0KSk7CisJCW1lbWNweSh2YWx1ZV9wdHIocmlnaHQsIDAsIHZhbHVlX3NpemUpLAorCQkgICAgICAgdmFsdWVfcHRyKGxlZnQsIG5yX2xlZnQgLSBzaGlmdCwgdmFsdWVfc2l6ZSksCisJCSAgICAgICBzaGlmdCAqIHZhbHVlX3NpemUpOworCX0KK30KKworLyoKKyAqIERlbGV0ZSBhIHNwZWNpZmljIGVudHJ5IGZyb20gYSBsZWFmIG5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9hdChzdHJ1Y3Qgbm9kZSAqbiwgdW5zaWduZWQgaW5kZXgpCit7CisJdW5zaWduZWQgbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKwl1bnNpZ25lZCBucl90b19jb3B5ID0gbnJfZW50cmllcyAtIChpbmRleCArIDEpOworCXVpbnQzMl90IHZhbHVlX3NpemUgPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIudmFsdWVfc2l6ZSk7CisJQlVHX09OKGluZGV4ID49IG5yX2VudHJpZXMpOworCisJaWYgKG5yX3RvX2NvcHkpIHsKKwkJbWVtbW92ZShrZXlfcHRyKG4sIGluZGV4KSwKKwkJCWtleV9wdHIobiwgaW5kZXggKyAxKSwKKwkJCW5yX3RvX2NvcHkgKiBzaXplb2YoX19sZTY0KSk7CisKKwkJbWVtbW92ZSh2YWx1ZV9wdHIobiwgaW5kZXgsIHZhbHVlX3NpemUpLAorCQkJdmFsdWVfcHRyKG4sIGluZGV4ICsgMSwgdmFsdWVfc2l6ZSksCisJCQlucl90b19jb3B5ICogdmFsdWVfc2l6ZSk7CisJfQorCisJbi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9lbnRyaWVzIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWxfdGhyZXNob2xkKHN0cnVjdCBub2RlICpuKQoreworCXJldHVybiBsZTMyX3RvX2NwdShuLT5oZWFkZXIubWF4X2VudHJpZXMpIC8gMzsKK30KKworc3RhdGljIHVuc2lnbmVkIG1lcmdlX3RocmVzaG9sZChzdHJ1Y3Qgbm9kZSAqbikKK3sKKwkvKgorCSAqIFRoZSBleHRyYSBvbmUgaXMgYmVjYXVzZSB3ZSBrbm93IHdlJ3JlIHBvdGVudGlhbGx5IGdvaW5nIHRvCisJICogZGVsZXRlIGFuIGVudHJ5LgorCSAqLworCXJldHVybiAyICogKGxlMzJfdG9fY3B1KG4tPmhlYWRlci5tYXhfZW50cmllcykgLyAzKSArIDE7Cit9CisKK3N0cnVjdCBjaGlsZCB7CisJdW5zaWduZWQgaW5kZXg7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3Qgbm9kZSAqbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSBsZTY0X3R5cGUgPSB7CisJLmNvbnRleHQgPSBOVUxMLAorCS5zaXplID0gc2l6ZW9mKF9fbGU2NCksCisJLmluYyA9IE5VTEwsCisJLmRlYyA9IE5VTEwsCisJLmVxdWFsID0gTlVMTAorfTsKKworc3RhdGljIGludCBpbml0X2NoaWxkKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3Qgbm9kZSAqcGFyZW50LAorCQkgICAgICB1bnNpZ25lZCBpbmRleCwgc3RydWN0IGNoaWxkICpyZXN1bHQpCit7CisJaW50IHIsIGluYzsKKwlkbV9ibG9ja190IHJvb3Q7CisKKwlyZXN1bHQtPmluZGV4ID0gaW5kZXg7CisJcm9vdCA9IHZhbHVlNjQocGFyZW50LCBpbmRleCk7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGluZm8tPnRtLCByb290LCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsCisJCQkgICAgICAgJnJlc3VsdC0+YmxvY2ssICZpbmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJlc3VsdC0+biA9IGRtX2Jsb2NrX2RhdGEocmVzdWx0LT5ibG9jayk7CisKKwlpZiAoaW5jKQorCQlpbmNfY2hpbGRyZW4oaW5mby0+dG0sIHJlc3VsdC0+biwgJmxlNjRfdHlwZSk7CisKKwkqKChfX2xlNjQgKikgdmFsdWVfcHRyKHBhcmVudCwgaW5kZXgsIHNpemVvZihfX2xlNjQpKSkgPQorCQljcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihyZXN1bHQtPmJsb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleGl0X2NoaWxkKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3QgY2hpbGQgKmMpCit7CisJcmV0dXJuIGRtX3RtX3VubG9jayhpbmZvLT50bSwgYy0+YmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzaGlmdChzdHJ1Y3Qgbm9kZSAqbGVmdCwgc3RydWN0IG5vZGUgKnJpZ2h0LCBpbnQgY291bnQpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuOworCisJaWYgKGNvdW50ID4gMCkgeworCQlub2RlX3NoaWZ0KHJpZ2h0LCBjb3VudCk7CisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgY291bnQpOworCX0gZWxzZSB7CisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgY291bnQpOworCQlub2RlX3NoaWZ0KHJpZ2h0LCBjb3VudCk7CisJfQorCisJbGVmdC0+aGVhZGVyLm5yX2VudHJpZXMgPQorCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcykgLSBjb3VudCk7CisJQlVHX09OKGxlMzJfdG9fY3B1KGxlZnQtPmhlYWRlci5ucl9lbnRyaWVzKSA+IGxlMzJfdG9fY3B1KGxlZnQtPmhlYWRlci5tYXhfZW50cmllcykpOworCisJcmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzID0KKwkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzKSArIGNvdW50KTsKKwlCVUdfT04obGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5ucl9lbnRyaWVzKSA+IGxlMzJfdG9fY3B1KHJpZ2h0LT5oZWFkZXIubWF4X2VudHJpZXMpKTsKK30KKworc3RhdGljIHZvaWQgX19yZWJhbGFuY2UyKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBzdHJ1Y3Qgbm9kZSAqcGFyZW50LAorCQkJIHN0cnVjdCBjaGlsZCAqbCwgc3RydWN0IGNoaWxkICpyKQoreworCXN0cnVjdCBub2RlICpsZWZ0ID0gbC0+bjsKKwlzdHJ1Y3Qgbm9kZSAqcmlnaHQgPSByLT5uOworCXVpbnQzMl90IG5yX2xlZnQgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShyaWdodC0+aGVhZGVyLm5yX2VudHJpZXMpOworCisJaWYgKG5yX2xlZnQgKyBucl9yaWdodCA8PSBtZXJnZV90aHJlc2hvbGQobGVmdCkpIHsKKwkJLyoKKwkJICogTWVyZ2UKKwkJICovCisJCW5vZGVfY29weShsZWZ0LCByaWdodCwgLW5yX3JpZ2h0KTsKKwkJbGVmdC0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9sZWZ0ICsgbnJfcmlnaHQpOworCQlkZWxldGVfYXQocGFyZW50LCByLT5pbmRleCk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIHJpZ2h0IGJsb2NrLCBidXQgbm90IGl0J3MKKwkJICogY2hpbGRyZW4sIHNpbmNlIHRoZXkncmUgc3RpbGwgcmVmZXJlbmNlZCBieSBsZWZ0LgorCQkgKi8KKwkJZG1fdG1fZGVjKGluZm8tPnRtLCBkbV9ibG9ja19sb2NhdGlvbihyLT5ibG9jaykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlYmFsYW5jZS4KKwkJICovCisJCXVuc2lnbmVkIHRhcmdldF9sZWZ0ID0gKG5yX2xlZnQgKyBucl9yaWdodCkgLyAyOworCQl1bnNpZ25lZCBzaGlmdF8gPSBucl9sZWZ0IC0gdGFyZ2V0X2xlZnQ7CisJCUJVR19PTihsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubWF4X2VudHJpZXMpIDw9IG5yX2xlZnQgLSBzaGlmdF8pOworCQlCVUdfT04obGUzMl90b19jcHUocmlnaHQtPmhlYWRlci5tYXhfZW50cmllcykgPD0gbnJfcmlnaHQgKyBzaGlmdF8pOworCQlzaGlmdChsZWZ0LCByaWdodCwgbnJfbGVmdCAtIHRhcmdldF9sZWZ0KTsKKwkJKmtleV9wdHIocGFyZW50LCByLT5pbmRleCkgPSByaWdodC0+a2V5c1swXTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmViYWxhbmNlMihzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywKKwkJICAgICAgdW5zaWduZWQgbGVmdF9pbmRleCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50OworCXN0cnVjdCBjaGlsZCBsZWZ0LCByaWdodDsKKworCXBhcmVudCA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4LCAmbGVmdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4ICsgMSwgJnJpZ2h0KTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJcmV0dXJuIHI7CisJfQorCisJX19yZWJhbGFuY2UyKGluZm8sIHBhcmVudCwgJmxlZnQsICZyaWdodCk7CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmbGVmdCk7CisJaWYgKHIpIHsKKwkJZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworfQorCitzdGF0aWMgdm9pZCBfX3JlYmFsYW5jZTMoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIHN0cnVjdCBub2RlICpwYXJlbnQsCisJCQkgc3RydWN0IGNoaWxkICpsLCBzdHJ1Y3QgY2hpbGQgKmMsIHN0cnVjdCBjaGlsZCAqcikKK3sKKwlzdHJ1Y3Qgbm9kZSAqbGVmdCA9IGwtPm47CisJc3RydWN0IG5vZGUgKmNlbnRlciA9IGMtPm47CisJc3RydWN0IG5vZGUgKnJpZ2h0ID0gci0+bjsKKworCXVpbnQzMl90IG5yX2xlZnQgPSBsZTMyX3RvX2NwdShsZWZ0LT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfY2VudGVyID0gbGUzMl90b19jcHUoY2VudGVyLT5oZWFkZXIubnJfZW50cmllcyk7CisJdWludDMyX3QgbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShyaWdodC0+aGVhZGVyLm5yX2VudHJpZXMpOworCXVpbnQzMl90IG1heF9lbnRyaWVzID0gbGUzMl90b19jcHUobGVmdC0+aGVhZGVyLm1heF9lbnRyaWVzKTsKKworCXVuc2lnbmVkIHRhcmdldDsKKworCUJVR19PTihsZWZ0LT5oZWFkZXIubWF4X2VudHJpZXMgIT0gY2VudGVyLT5oZWFkZXIubWF4X2VudHJpZXMpOworCUJVR19PTihjZW50ZXItPmhlYWRlci5tYXhfZW50cmllcyAhPSByaWdodC0+aGVhZGVyLm1heF9lbnRyaWVzKTsKKworCWlmICgoKG5yX2xlZnQgKyBucl9jZW50ZXIgKyBucl9yaWdodCkgLyAyKSA8IG1lcmdlX3RocmVzaG9sZChjZW50ZXIpKSB7CisJCS8qCisJCSAqIERlbGV0ZSBjZW50ZXIgbm9kZToKKwkJICoKKwkJICogV2UgZHVtcCBhcyBtYW55IGVudHJpZXMgZnJvbSBjZW50ZXIgYXMgcG9zc2libGUgaW50bworCQkgKiBsZWZ0LCB0aGVuIHRoZSByZXN0IGluIHJpZ2h0LCB0aGVuIHJlYmFsYW5jZTIuICBUaGlzCisJCSAqIHdhc3RlcyBzb21lIGNwdSwgYnV0IEkgd2FudCBzb21ldGhpbmcgc2ltcGxlIGF0bS4KKwkJICovCisJCXVuc2lnbmVkIHNoaWZ0ID0gbWluKG1heF9lbnRyaWVzIC0gbnJfbGVmdCwgbnJfY2VudGVyKTsKKworCQlCVUdfT04obnJfbGVmdCArIHNoaWZ0ID4gbWF4X2VudHJpZXMpOworCQlub2RlX2NvcHkobGVmdCwgY2VudGVyLCAtc2hpZnQpOworCQlsZWZ0LT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2xlZnQgKyBzaGlmdCk7CisKKwkJaWYgKHNoaWZ0ICE9IG5yX2NlbnRlcikgeworCQkJc2hpZnQgPSBucl9jZW50ZXIgLSBzaGlmdDsKKwkJCUJVR19PTigobnJfcmlnaHQgKyBzaGlmdCkgPj0gbWF4X2VudHJpZXMpOworCQkJbm9kZV9zaGlmdChyaWdodCwgc2hpZnQpOworCQkJbm9kZV9jb3B5KGNlbnRlciwgcmlnaHQsIHNoaWZ0KTsKKwkJCXJpZ2h0LT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX3JpZ2h0ICsgc2hpZnQpOworCQl9CisJCSprZXlfcHRyKHBhcmVudCwgci0+aW5kZXgpID0gcmlnaHQtPmtleXNbMF07CisKKwkJZGVsZXRlX2F0KHBhcmVudCwgYy0+aW5kZXgpOworCQlyLT5pbmRleC0tOworCisJCWRtX3RtX2RlYyhpbmZvLT50bSwgZG1fYmxvY2tfbG9jYXRpb24oYy0+YmxvY2spKTsKKwkJX19yZWJhbGFuY2UyKGluZm8sIHBhcmVudCwgbCwgcik7CisKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUmViYWxhbmNlCisJICovCisJdGFyZ2V0ID0gKG5yX2xlZnQgKyBucl9jZW50ZXIgKyBucl9yaWdodCkgLyAzOworCUJVR19PTih0YXJnZXQgPiBtYXhfZW50cmllcyk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgbGVmdCBub2RlCisJICovCisJc2hpZnQobGVmdCwgY2VudGVyLCBucl9sZWZ0IC0gdGFyZ2V0KTsKKworCS8qCisJICogQWRqdXN0IHRoZSByaWdodCBub2RlCisJICovCisJc2hpZnQoY2VudGVyLCByaWdodCwgdGFyZ2V0IC0gbnJfcmlnaHQpOworCSprZXlfcHRyKHBhcmVudCwgYy0+aW5kZXgpID0gY2VudGVyLT5rZXlzWzBdOworCSprZXlfcHRyKHBhcmVudCwgci0+aW5kZXgpID0gcmlnaHQtPmtleXNbMF07Cit9CisKK3N0YXRpYyBpbnQgcmViYWxhbmNlMyhzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywKKwkJICAgICAgdW5zaWduZWQgbGVmdF9pbmRleCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50ID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisJc3RydWN0IGNoaWxkIGxlZnQsIGNlbnRlciwgcmlnaHQ7CisKKwkvKgorCSAqIEZJWE1FOiBmaWxsIG91dCBhbiBhcnJheT8KKwkgKi8KKwlyID0gaW5pdF9jaGlsZChpbmZvLCBwYXJlbnQsIGxlZnRfaW5kZXgsICZsZWZ0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaW5pdF9jaGlsZChpbmZvLCBwYXJlbnQsIGxlZnRfaW5kZXggKyAxLCAmY2VudGVyKTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IGluaXRfY2hpbGQoaW5mbywgcGFyZW50LCBsZWZ0X2luZGV4ICsgMiwgJnJpZ2h0KTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZsZWZ0KTsKKwkJZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwkJcmV0dXJuIHI7CisJfQorCisJX19yZWJhbGFuY2UzKGluZm8sIHBhcmVudCwgJmxlZnQsICZjZW50ZXIsICZyaWdodCk7CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmbGVmdCk7CisJaWYgKHIpIHsKKwkJZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwkJZXhpdF9jaGlsZChpbmZvLCAmcmlnaHQpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gZXhpdF9jaGlsZChpbmZvLCAmY2VudGVyKTsKKwlpZiAocikgeworCQlleGl0X2NoaWxkKGluZm8sICZyaWdodCk7CisJCXJldHVybiByOworCX0KKworCXIgPSBleGl0X2NoaWxkKGluZm8sICZyaWdodCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X25yX2VudHJpZXMoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJICBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaW50IHI7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKwlzdHJ1Y3Qgbm9kZSAqbjsKKworCXIgPSBkbV90bV9yZWFkX2xvY2sodG0sIGIsICZidHJlZV9ub2RlX3ZhbGlkYXRvciwgJmJsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwluID0gZG1fYmxvY2tfZGF0YShibG9jayk7CisJKnJlc3VsdCA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKworCXJldHVybiBkbV90bV91bmxvY2sodG0sIGJsb2NrKTsKK30KKworc3RhdGljIGludCByZWJhbGFuY2VfY2hpbGRyZW4oc3RydWN0IHNoYWRvd19zcGluZSAqcywKKwkJCSAgICAgIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCB1aW50NjRfdCBrZXkpCit7CisJaW50IGksIHIsIGhhc19sZWZ0X3NpYmxpbmcsIGhhc19yaWdodF9zaWJsaW5nOworCXVpbnQzMl90IGNoaWxkX2VudHJpZXM7CisJc3RydWN0IG5vZGUgKm47CisKKwluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisKKwlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpID09IDEpIHsKKwkJc3RydWN0IGRtX2Jsb2NrICpjaGlsZDsKKwkJZG1fYmxvY2tfdCBiID0gdmFsdWU2NChuLCAwKTsKKworCQlyID0gZG1fdG1fcmVhZF9sb2NrKGluZm8tPnRtLCBiLCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsICZjaGlsZCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJbWVtY3B5KG4sIGRtX2Jsb2NrX2RhdGEoY2hpbGQpLAorCQkgICAgICAgZG1fYm1fYmxvY2tfc2l6ZShkbV90bV9nZXRfYm0oaW5mby0+dG0pKSk7CisJCXIgPSBkbV90bV91bmxvY2soaW5mby0+dG0sIGNoaWxkKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKworCQlkbV90bV9kZWMoaW5mby0+dG0sIGRtX2Jsb2NrX2xvY2F0aW9uKGNoaWxkKSk7CisJCXJldHVybiAwOworCX0KKworCWkgPSBsb3dlcl9ib3VuZChuLCBrZXkpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJciA9IGdldF9ucl9lbnRyaWVzKGluZm8tPnRtLCB2YWx1ZTY0KG4sIGkpLCAmY2hpbGRfZW50cmllcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKGNoaWxkX2VudHJpZXMgPiBkZWxfdGhyZXNob2xkKG4pKQorCQlyZXR1cm4gMDsKKworCWhhc19sZWZ0X3NpYmxpbmcgPSBpID4gMDsKKwloYXNfcmlnaHRfc2libGluZyA9IGkgPCAobGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpIC0gMSk7CisKKwlpZiAoIWhhc19sZWZ0X3NpYmxpbmcpCisJCXIgPSByZWJhbGFuY2UyKHMsIGluZm8sIGkpOworCisJZWxzZSBpZiAoIWhhc19yaWdodF9zaWJsaW5nKQorCQlyID0gcmViYWxhbmNlMihzLCBpbmZvLCBpIC0gMSk7CisKKwllbHNlCisJCXIgPSByZWJhbGFuY2UzKHMsIGluZm8sIGkgLSAxKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGRvX2xlYWYoc3RydWN0IG5vZGUgKm4sIHVpbnQ2NF90IGtleSwgdW5zaWduZWQgKmluZGV4KQoreworCWludCBpID0gbG93ZXJfYm91bmQobiwga2V5KTsKKworCWlmICgoaSA8IDApIHx8CisJICAgIChpID49IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKSkgfHwKKwkgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaV0pICE9IGtleSkpCisJCXJldHVybiAtRU5PREFUQTsKKworCSppbmRleCA9IGk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByZXBhcmVzIGZvciByZW1vdmFsIGZyb20gb25lIGxldmVsIG9mIHRoZSBoaWVyYXJjaHkuICBUaGUgY2FsbGVyIG11c3QKKyAqIGNhbGwgZGVsZXRlX2F0KCkgdG8gcmVtb3ZlIHRoZSBlbnRyeSBhdCBpbmRleC4KKyAqLworc3RhdGljIGludCByZW1vdmVfcmF3KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgICAgdWludDY0X3Qga2V5LCB1bnNpZ25lZCAqaW5kZXgpCit7CisJaW50IGkgPSAqaW5kZXgsIHI7CisJc3RydWN0IG5vZGUgKm47CisKKwlmb3IgKDs7KSB7CisJCXIgPSBzaGFkb3dfc3RlcChzLCByb290LCB2dCk7CisJCWlmIChyIDwgMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIGhhdmUgdG8gcGF0Y2ggdXAgdGhlIHBhcmVudCBub2RlLCB1Z2x5LCBidXQgSSBkb24ndAorCQkgKiBzZWUgYSB3YXkgdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgdGhlIHNwaW5lCisJCSAqIG9wLgorCQkgKi8KKwkJaWYgKHNoYWRvd19oYXNfcGFyZW50KHMpKSB7CisJCQlfX2xlNjQgbG9jYXRpb24gPSBjcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihzaGFkb3dfY3VycmVudChzKSkpOworCQkJbWVtY3B5KHZhbHVlX3B0cihkbV9ibG9ja19kYXRhKHNoYWRvd19wYXJlbnQocykpLCBpLCBzaXplb2YoX19sZTY0KSksCisJCQkgICAgICAgJmxvY2F0aW9uLCBzaXplb2YoX19sZTY0KSk7CisJCX0KKworCQluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudChzKSk7CisKKwkJaWYgKGxlMzJfdG9fY3B1KG4tPmhlYWRlci5mbGFncykgJiBMRUFGX05PREUpCisJCQlyZXR1cm4gZG9fbGVhZihuLCBrZXksIGluZGV4KTsKKworCQlyID0gcmViYWxhbmNlX2NoaWxkcmVuKHMsIGluZm8sIGtleSk7CisJCWlmIChyKQorCQkJYnJlYWs7CisKKwkJbiA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCQlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLmZsYWdzKSAmIExFQUZfTk9ERSkKKwkJCXJldHVybiBkb19sZWFmKG4sIGtleSwgaW5kZXgpOworCisJCWkgPSBsb3dlcl9ib3VuZChuLCBrZXkpOworCisJCS8qCisJCSAqIFdlIGtub3cgdGhlIGtleSBpcyBwcmVzZW50LCBvciBlbHNlCisJCSAqIHJlYmFsYW5jZV9jaGlsZHJlbiB3b3VsZCBoYXZlIHJldHVybmVkCisJCSAqIC1FTk9EQVRBCisJCSAqLworCQlyb290ID0gdmFsdWU2NChuLCBpKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX2J0cmVlX3JlbW92ZShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkgICAgdWludDY0X3QgKmtleXMsIGRtX2Jsb2NrX3QgKm5ld19yb290KQoreworCXVuc2lnbmVkIGxldmVsLCBsYXN0X2xldmVsID0gaW5mby0+bGV2ZWxzIC0gMTsKKwlpbnQgaW5kZXggPSAwLCByID0gMDsKKwlzdHJ1Y3Qgc2hhZG93X3NwaW5lIHNwaW5lOworCXN0cnVjdCBub2RlICpuOworCisJaW5pdF9zaGFkb3dfc3BpbmUoJnNwaW5lLCBpbmZvKTsKKwlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBpbmZvLT5sZXZlbHM7IGxldmVsKyspIHsKKwkJciA9IHJlbW92ZV9yYXcoJnNwaW5lLCBpbmZvLAorCQkJICAgICAgIChsZXZlbCA9PSBsYXN0X2xldmVsID8KKwkJCQkmaW5mby0+dmFsdWVfdHlwZSA6ICZsZTY0X3R5cGUpLAorCQkJICAgICAgIHJvb3QsIGtleXNbbGV2ZWxdLCAodW5zaWduZWQgKikmaW5kZXgpOworCQlpZiAociA8IDApCisJCQlicmVhazsKKworCQluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudCgmc3BpbmUpKTsKKwkJaWYgKGxldmVsICE9IGxhc3RfbGV2ZWwpIHsKKwkJCXJvb3QgPSB2YWx1ZTY0KG4sIGluZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJQlVHX09OKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcykpOworCisJCWlmIChpbmZvLT52YWx1ZV90eXBlLmRlYykKKwkJCWluZm8tPnZhbHVlX3R5cGUuZGVjKGluZm8tPnZhbHVlX3R5cGUuY29udGV4dCwKKwkJCQkJICAgICB2YWx1ZV9wdHIobiwgaW5kZXgsIGluZm8tPnZhbHVlX3R5cGUuc2l6ZSkpOworCisJCWRlbGV0ZV9hdChuLCBpbmRleCk7CisJfQorCisJKm5ld19yb290ID0gc2hhZG93X3Jvb3QoJnNwaW5lKTsKKwlleGl0X3NoYWRvd19zcGluZSgmc3BpbmUpOworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9yZW1vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUtc3BpbmUuYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXNwaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNzkxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLXNwaW5lLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1idHJlZS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJidHJlZSBzcGluZSIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCVFJFRV9DU1VNX1hPUiAxMjExMDcKKworc3RhdGljIGludCBub2RlX2NoZWNrKHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICAgIHN0cnVjdCBkbV9ibG9jayAqYiwKKwkJICAgICAgc2l6ZV90IGJsb2NrX3NpemUpOworCitzdGF0aWMgdm9pZCBub2RlX3ByZXBhcmVfZm9yX3dyaXRlKHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQkJICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkJCSAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBub2RlICpuID0gZG1fYmxvY2tfZGF0YShiKTsKKwlzdHJ1Y3Qgbm9kZV9oZWFkZXIgKmggPSAmbi0+aGVhZGVyOworCisJaC0+YmxvY2tuciA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwloLT5jc3VtID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJmgtPmZsYWdzLAorCQkJCQkgICAgIGJsb2NrX3NpemUgLSBzaXplb2YoX19sZTMyKSwKKwkJCQkJICAgICBCVFJFRV9DU1VNX1hPUikpOworCisJQlVHX09OKG5vZGVfY2hlY2sodiwgYiwgNDA5NikpOworfQorCitzdGF0aWMgaW50IG5vZGVfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkgICAgICBzaXplX3QgYmxvY2tfc2l6ZSkKK3sKKwlzdHJ1Y3Qgbm9kZSAqbiA9IGRtX2Jsb2NrX2RhdGEoYik7CisJc3RydWN0IG5vZGVfaGVhZGVyICpoID0gJm4tPmhlYWRlcjsKKwlzaXplX3QgdmFsdWVfc2l6ZTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCXVpbnQzMl90IGZsYWdzOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KGgtPmJsb2NrbnIpKSB7CisJCURNRVJSKCJub2RlX2NoZWNrIGZhaWxlZCBibG9ja25yICVsbHUgd2FudGVkICVsbHUiLAorCQkgICAgICBsZTY0X3RvX2NwdShoLT5ibG9ja25yKSwgZG1fYmxvY2tfbG9jYXRpb24oYikpOworCQlyZXR1cm4gLUVOT1RCTEs7CisJfQorCisJY3N1bV9kaXNrID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJmgtPmZsYWdzLAorCQkJCQkgICAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgICAgQlRSRUVfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IGgtPmNzdW0pIHsKKwkJRE1FUlIoIm5vZGVfY2hlY2sgZmFpbGVkIGNzdW0gJXUgd2FudGVkICV1IiwKKwkJICAgICAgbGUzMl90b19jcHUoY3N1bV9kaXNrKSwgbGUzMl90b19jcHUoaC0+Y3N1bSkpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwl2YWx1ZV9zaXplID0gbGUzMl90b19jcHUoaC0+dmFsdWVfc2l6ZSk7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCBub2RlX2hlYWRlcikgKworCSAgICAoc2l6ZW9mKF9fbGU2NCkgKyB2YWx1ZV9zaXplKSAqIGxlMzJfdG9fY3B1KGgtPm1heF9lbnRyaWVzKSA+IGJsb2NrX3NpemUpIHsKKwkJRE1FUlIoIm5vZGVfY2hlY2sgZmFpbGVkOiBtYXhfZW50cmllcyB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KGgtPm5yX2VudHJpZXMpID4gbGUzMl90b19jcHUoaC0+bWF4X2VudHJpZXMpKSB7CisJCURNRVJSKCJub2RlX2NoZWNrIGZhaWxlZCwgdG9vIG1hbnkgZW50cmllcyIpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwkvKgorCSAqIFRoZSBub2RlIG11c3QgYmUgZWl0aGVyIElOVEVSTkFMIG9yIExFQUYuCisJICovCisJZmxhZ3MgPSBsZTMyX3RvX2NwdShoLT5mbGFncyk7CisJaWYgKCEoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKSAmJiAhKGZsYWdzICYgTEVBRl9OT0RFKSkgeworCQlETUVSUigibm9kZV9jaGVjayBmYWlsZWQsIG5vZGUgaXMgbmVpdGhlciBJTlRFUk5BTCBvciBMRUFGIik7CisJCXJldHVybiAtRUlMU0VROworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yIGJ0cmVlX25vZGVfdmFsaWRhdG9yID0geworCS5uYW1lID0gImJ0cmVlX25vZGUiLAorCS5wcmVwYXJlX2Zvcl93cml0ZSA9IG5vZGVfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gbm9kZV9jaGVjaworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBibl9yZWFkX2xvY2soc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3QgYiwKKwkJIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlyZXR1cm4gZG1fdG1fcmVhZF9sb2NrKGluZm8tPnRtLCBiLCAmYnRyZWVfbm9kZV92YWxpZGF0b3IsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgYm5fc2hhZG93KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IG9yaWcsCisJICAgICAgc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgKnZ0LAorCSAgICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlpbnQgciwgaW5jOworCisJciA9IGRtX3RtX3NoYWRvd19ibG9jayhpbmZvLT50bSwgb3JpZywgJmJ0cmVlX25vZGVfdmFsaWRhdG9yLAorCQkJICAgICAgIHJlc3VsdCwgJmluYyk7CisJaWYgKCFyICYmIGluYykKKwkJaW5jX2NoaWxkcmVuKGluZm8tPnRtLCBkbV9ibG9ja19kYXRhKCpyZXN1bHQpLCB2dCk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IG5ld19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCXJldHVybiBkbV90bV9uZXdfYmxvY2soaW5mby0+dG0sICZidHJlZV9ub2RlX3ZhbGlkYXRvciwgcmVzdWx0KTsKK30KKworaW50IHVubG9ja19ibG9jayhzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgc3RydWN0IGRtX2Jsb2NrICpiKQoreworCXJldHVybiBkbV90bV91bmxvY2soaW5mby0+dG0sIGIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGluaXRfcm9fc3BpbmUoc3RydWN0IHJvX3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbykKK3sKKwlzLT5pbmZvID0gaW5mbzsKKwlzLT5jb3VudCA9IDA7CisJcy0+bm9kZXNbMF0gPSBOVUxMOworCXMtPm5vZGVzWzFdID0gTlVMTDsKK30KKworaW50IGV4aXRfcm9fc3BpbmUoc3RydWN0IHJvX3NwaW5lICpzKQoreworCWludCByID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5jb3VudDsgaSsrKSB7CisJCWludCByMiA9IHVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1tpXSk7CisJCWlmIChyMiA8IDApCisJCQlyID0gcjI7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCByb19zdGVwKHN0cnVjdCByb19zcGluZSAqcywgZG1fYmxvY2tfdCBuZXdfY2hpbGQpCit7CisJaW50IHI7CisKKwlpZiAocy0+Y291bnQgPT0gMikgeworCQlyID0gdW5sb2NrX2Jsb2NrKHMtPmluZm8sIHMtPm5vZGVzWzBdKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCXMtPm5vZGVzWzBdID0gcy0+bm9kZXNbMV07CisJCXMtPmNvdW50LS07CisJfQorCisJciA9IGJuX3JlYWRfbG9jayhzLT5pbmZvLCBuZXdfY2hpbGQsIHMtPm5vZGVzICsgcy0+Y291bnQpOworCWlmICghcikKKwkJcy0+Y291bnQrKzsKKworCXJldHVybiByOworfQorCitzdHJ1Y3Qgbm9kZSAqcm9fbm9kZShzdHJ1Y3Qgcm9fc3BpbmUgKnMpCit7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKworCUJVR19PTighcy0+Y291bnQpOworCWJsb2NrID0gcy0+bm9kZXNbcy0+Y291bnQgLSAxXTsKKworCXJldHVybiBkbV9ibG9ja19kYXRhKGJsb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBpbml0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbykKK3sKKwlzLT5pbmZvID0gaW5mbzsKKwlzLT5jb3VudCA9IDA7Cit9CisKK2ludCBleGl0X3NoYWRvd19zcGluZShzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCWludCByID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5jb3VudDsgaSsrKSB7CisJCWludCByMiA9IHVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1tpXSk7CisJCWlmIChyMiA8IDApCisJCQlyID0gcjI7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK2ludCBzaGFkb3dfc3RlcChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzLCBkbV9ibG9ja190IGIsCisJCXN0cnVjdCBkbV9idHJlZV92YWx1ZV90eXBlICp2dCkKK3sKKwlpbnQgcjsKKworCWlmIChzLT5jb3VudCA9PSAyKSB7CisJCXIgPSB1bmxvY2tfYmxvY2socy0+aW5mbywgcy0+bm9kZXNbMF0pOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwkJcy0+bm9kZXNbMF0gPSBzLT5ub2Rlc1sxXTsKKwkJcy0+Y291bnQtLTsKKwl9CisKKwlyID0gYm5fc2hhZG93KHMtPmluZm8sIGIsIHZ0LCBzLT5ub2RlcyArIHMtPmNvdW50KTsKKwlpZiAoIXIpIHsKKwkJaWYgKCFzLT5jb3VudCkKKwkJCXMtPnJvb3QgPSBkbV9ibG9ja19sb2NhdGlvbihzLT5ub2Rlc1swXSk7CisKKwkJcy0+Y291bnQrKzsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RydWN0IGRtX2Jsb2NrICpzaGFkb3dfY3VycmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCUJVR19PTighcy0+Y291bnQpOworCisJcmV0dXJuIHMtPm5vZGVzW3MtPmNvdW50IC0gMV07Cit9CisKK3N0cnVjdCBkbV9ibG9jayAqc2hhZG93X3BhcmVudChzdHJ1Y3Qgc2hhZG93X3NwaW5lICpzKQoreworCUJVR19PTihzLT5jb3VudCAhPSAyKTsKKworCXJldHVybiBzLT5jb3VudCA9PSAyID8gcy0+bm9kZXNbMF0gOiBOVUxMOworfQorCitpbnQgc2hhZG93X2hhc19wYXJlbnQoc3RydWN0IHNoYWRvd19zcGluZSAqcykKK3sKKwlyZXR1cm4gcy0+Y291bnQgPj0gMjsKK30KKworaW50IHNoYWRvd19yb290KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMpCit7CisJcmV0dXJuIHMtPnJvb3Q7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5jIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDFlN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tYnRyZWUuYwpAQCAtMCwwICsxLDgwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWJ0cmVlLWludGVybmFsLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAiZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oIgorCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggImJ0cmVlIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFycmF5IG1hbmlwdWxhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBtZW1jcHlfZGlzayh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCisJX19kbV93cml0dGVuX3RvX2Rpc2soc3JjKQoreworCW1lbWNweShkZXN0LCBzcmMsIGxlbik7CisJX19kbV91bmJsZXNzX2Zvcl9kaXNrKHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGFycmF5X2luc2VydCh2b2lkICpiYXNlLCBzaXplX3QgZWx0X3NpemUsIHVuc2lnbmVkIG5yX2VsdHMsCisJCQkgdW5zaWduZWQgaW5kZXgsIHZvaWQgKmVsdCkKKwlfX2RtX3dyaXR0ZW5fdG9fZGlzayhlbHQpCit7CisJaWYgKGluZGV4IDwgbnJfZWx0cykKKwkJbWVtbW92ZShiYXNlICsgKGVsdF9zaXplICogKGluZGV4ICsgMSkpLAorCQkJYmFzZSArIChlbHRfc2l6ZSAqIGluZGV4KSwKKwkJCShucl9lbHRzIC0gaW5kZXgpICogZWx0X3NpemUpOworCisJbWVtY3B5X2Rpc2soYmFzZSArIChlbHRfc2l6ZSAqIGluZGV4KSwgZWx0LCBlbHRfc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgbm8gdHdvIGtleXMgYXJlIHRoZSBzYW1lLiAqLworc3RhdGljIGludCBic2VhcmNoKHN0cnVjdCBub2RlICpuLCB1aW50NjRfdCBrZXksIGludCB3YW50X2hpKQoreworCWludCBsbyA9IC0xLCBoaSA9IGxlMzJfdG9fY3B1KG4tPmhlYWRlci5ucl9lbnRyaWVzKTsKKworCXdoaWxlIChoaSAtIGxvID4gMSkgeworCQlpbnQgbWlkID0gbG8gKyAoKGhpIC0gbG8pIC8gMik7CisJCXVpbnQ2NF90IG1pZF9rZXkgPSBsZTY0X3RvX2NwdShuLT5rZXlzW21pZF0pOworCisJCWlmIChtaWRfa2V5ID09IGtleSkKKwkJCXJldHVybiBtaWQ7CisKKwkJaWYgKG1pZF9rZXkgPCBrZXkpCisJCQlsbyA9IG1pZDsKKwkJZWxzZQorCQkJaGkgPSBtaWQ7CisJfQorCisJcmV0dXJuIHdhbnRfaGkgPyBoaSA6IGxvOworfQorCitpbnQgbG93ZXJfYm91bmQoc3RydWN0IG5vZGUgKm4sIHVpbnQ2NF90IGtleSkKK3sKKwlyZXR1cm4gYnNlYXJjaChuLCBrZXksIDApOworfQorCit2b2lkIGluY19jaGlsZHJlbihzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIHN0cnVjdCBub2RlICpuLAorCQkgIHN0cnVjdCBkbV9idHJlZV92YWx1ZV90eXBlICp2dCkKK3sKKwl1bnNpZ25lZCBpOworCXVpbnQzMl90IG5yX2VudHJpZXMgPSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcyk7CisKKwlpZiAobGUzMl90b19jcHUobi0+aGVhZGVyLmZsYWdzKSAmIElOVEVSTkFMX05PREUpCisJCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspCisJCQlkbV90bV9pbmModG0sIHZhbHVlNjQobiwgaSkpOworCWVsc2UgaWYgKHZ0LT5pbmMpCisJCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspCisJCQl2dC0+aW5jKHZ0LT5jb250ZXh0LAorCQkJCXZhbHVlX3B0cihuLCBpLCB2dC0+c2l6ZSkpOworfQorCitzdGF0aWMgaW50IGluc2VydF9hdChzaXplX3QgdmFsdWVfc2l6ZSwgc3RydWN0IG5vZGUgKm5vZGUsIHVuc2lnbmVkIGluZGV4LAorCQkgICAgICB1aW50NjRfdCBrZXksIHZvaWQgKnZhbHVlKQorCQkgICAgICBfX2RtX3dyaXR0ZW5fdG9fZGlzayh2YWx1ZSkKK3sKKwl1aW50MzJfdCBucl9lbnRyaWVzID0gbGUzMl90b19jcHUobm9kZS0+aGVhZGVyLm5yX2VudHJpZXMpOworCV9fbGU2NCBrZXlfbGUgPSBjcHVfdG9fbGU2NChrZXkpOworCisJaWYgKGluZGV4ID4gbnJfZW50cmllcyB8fAorCSAgICBpbmRleCA+PSBsZTMyX3RvX2NwdShub2RlLT5oZWFkZXIubWF4X2VudHJpZXMpKSB7CisJCURNRVJSKCJ0b28gbWFueSBlbnRyaWVzIGluIGJ0cmVlIG5vZGUgZm9yIGluc2VydCIpOworCQlfX2RtX3VuYmxlc3NfZm9yX2Rpc2sodmFsdWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZrZXlfbGUpOworCisJYXJyYXlfaW5zZXJ0KG5vZGUtPmtleXMsIHNpemVvZigqbm9kZS0+a2V5cyksIG5yX2VudHJpZXMsIGluZGV4LCAma2V5X2xlKTsKKwlhcnJheV9pbnNlcnQodmFsdWVfYmFzZShub2RlKSwgdmFsdWVfc2l6ZSwgbnJfZW50cmllcywgaW5kZXgsIHZhbHVlKTsKKwlub2RlLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2VudHJpZXMgKyAxKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2Ugd2FudCAzbiBlbnRyaWVzIChmb3Igc29tZSBuKS4gIFRoaXMgd29ya3MgbW9yZSBuaWNlbHkgZm9yIHJlcGVhdGVkCisgKiBpbnNlcnQgcmVtb3ZlIGxvb3BzIHRoYW4gKDJuICsgMSkuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBjYWxjX21heF9lbnRyaWVzKHNpemVfdCB2YWx1ZV9zaXplLCBzaXplX3QgYmxvY2tfc2l6ZSkKK3sKKwl1aW50MzJfdCB0b3RhbCwgbjsKKwlzaXplX3QgZWx0X3NpemUgPSBzaXplb2YodWludDY0X3QpICsgdmFsdWVfc2l6ZTsgLyoga2V5ICsgdmFsdWUgKi8KKworCWJsb2NrX3NpemUgLT0gc2l6ZW9mKHN0cnVjdCBub2RlX2hlYWRlcik7CisJdG90YWwgPSBibG9ja19zaXplIC8gZWx0X3NpemU7CisJbiA9IHRvdGFsIC8gMzsJCS8qIHJvdW5kcyBkb3duICovCisKKwlyZXR1cm4gMyAqIG47Cit9CisKK2ludCBkbV9idHJlZV9lbXB0eShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCAqcm9vdCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJc3RydWN0IG5vZGUgKm47CisJc2l6ZV90IGJsb2NrX3NpemU7CisJdWludDMyX3QgbWF4X2VudHJpZXM7CisKKwlyID0gbmV3X2Jsb2NrKGluZm8sICZiKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJYmxvY2tfc2l6ZSA9IGRtX2JtX2Jsb2NrX3NpemUoZG1fdG1fZ2V0X2JtKGluZm8tPnRtKSk7CisJbWF4X2VudHJpZXMgPSBjYWxjX21heF9lbnRyaWVzKGluZm8tPnZhbHVlX3R5cGUuc2l6ZSwgYmxvY2tfc2l6ZSk7CisKKwluID0gZG1fYmxvY2tfZGF0YShiKTsKKwltZW1zZXQobiwgMCwgYmxvY2tfc2l6ZSk7CisJbi0+aGVhZGVyLmZsYWdzID0gY3B1X3RvX2xlMzIoTEVBRl9OT0RFKTsKKwluLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKDApOworCW4tPmhlYWRlci5tYXhfZW50cmllcyA9IGNwdV90b19sZTMyKG1heF9lbnRyaWVzKTsKKwluLT5oZWFkZXIudmFsdWVfc2l6ZSA9IGNwdV90b19sZTMyKGluZm8tPnZhbHVlX3R5cGUuc2l6ZSk7CisKKwkqcm9vdCA9IGRtX2Jsb2NrX2xvY2F0aW9uKGIpOworCXJldHVybiB1bmxvY2tfYmxvY2soaW5mbywgYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9lbXB0eSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBEZWxldGlvbiB1c2VzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSwgc2luY2Ugd2UgaGF2ZSBsaW1pdGVkIHN0YWNrIHNwYWNlCisgKiB3ZSBleHBsaWNpdGx5IG1hbmFnZSBvdXIgb3duIHN0YWNrIG9uIHRoZSBoZWFwLgorICovCisjZGVmaW5lIE1BWF9TUElORV9ERVBUSCA2NAorc3RydWN0IGZyYW1lIHsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJc3RydWN0IG5vZGUgKm47CisJdW5zaWduZWQgbGV2ZWw7CisJdW5zaWduZWQgbnJfY2hpbGRyZW47CisJdW5zaWduZWQgY3VycmVudF9jaGlsZDsKK307CisKK3N0cnVjdCBkZWxfc3RhY2sgeworCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bTsKKwlpbnQgdG9wOworCXN0cnVjdCBmcmFtZSBzcGluZVtNQVhfU1BJTkVfREVQVEhdOworfTsKKworc3RhdGljIGludCB0b3BfZnJhbWUoc3RydWN0IGRlbF9zdGFjayAqcywgc3RydWN0IGZyYW1lICoqZikKK3sKKwlpZiAocy0+dG9wIDwgMCkgeworCQlETUVSUigiYnRyZWUgZGVsZXRpb24gc3RhY2sgZW1wdHkiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKmYgPSBzLT5zcGluZSArIHMtPnRvcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucHJvY2Vzc2VkX2ZyYW1lcyhzdHJ1Y3QgZGVsX3N0YWNrICpzKQoreworCXJldHVybiBzLT50b3AgPj0gMDsKK30KKworc3RhdGljIGludCBwdXNoX2ZyYW1lKHN0cnVjdCBkZWxfc3RhY2sgKnMsIGRtX2Jsb2NrX3QgYiwgdW5zaWduZWQgbGV2ZWwpCit7CisJaW50IHI7CisJdWludDMyX3QgcmVmX2NvdW50OworCisJaWYgKHMtPnRvcCA+PSBNQVhfU1BJTkVfREVQVEggLSAxKSB7CisJCURNRVJSKCJidHJlZSBkZWxldGlvbiBzdGFjayBvdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBkbV90bV9yZWYocy0+dG0sIGIsICZyZWZfY291bnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChyZWZfY291bnQgPiAxKQorCQkvKgorCQkgKiBUaGlzIGlzIGEgc2hhcmVkIG5vZGUsIHNvIHdlIGNhbiBqdXN0IGRlY3JlbWVudCBpdCdzCisJCSAqIHJlZmVyZW5jZSBjb3VudGVyIGFuZCBsZWF2ZSB0aGUgY2hpbGRyZW4uCisJCSAqLworCQlkbV90bV9kZWMocy0+dG0sIGIpOworCisJZWxzZSB7CisJCXN0cnVjdCBmcmFtZSAqZiA9IHMtPnNwaW5lICsgKytzLT50b3A7CisKKwkJciA9IGRtX3RtX3JlYWRfbG9jayhzLT50bSwgYiwgJmJ0cmVlX25vZGVfdmFsaWRhdG9yLCAmZi0+Yik7CisJCWlmIChyKSB7CisJCQlzLT50b3AtLTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZi0+biA9IGRtX2Jsb2NrX2RhdGEoZi0+Yik7CisJCWYtPmxldmVsID0gbGV2ZWw7CisJCWYtPm5yX2NoaWxkcmVuID0gbGUzMl90b19jcHUoZi0+bi0+aGVhZGVyLm5yX2VudHJpZXMpOworCQlmLT5jdXJyZW50X2NoaWxkID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG9wX2ZyYW1lKHN0cnVjdCBkZWxfc3RhY2sgKnMpCit7CisJc3RydWN0IGZyYW1lICpmID0gcy0+c3BpbmUgKyBzLT50b3AtLTsKKworCWRtX3RtX2RlYyhzLT50bSwgZG1fYmxvY2tfbG9jYXRpb24oZi0+YikpOworCWRtX3RtX3VubG9jayhzLT50bSwgZi0+Yik7Cit9CisKK2ludCBkbV9idHJlZV9kZWwoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGVsX3N0YWNrICpzOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzLT50bSA9IGluZm8tPnRtOworCXMtPnRvcCA9IC0xOworCisJciA9IHB1c2hfZnJhbWUocywgcm9vdCwgMSk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKHVucHJvY2Vzc2VkX2ZyYW1lcyhzKSkgeworCQl1aW50MzJfdCBmbGFnczsKKwkJc3RydWN0IGZyYW1lICpmOworCQlkbV9ibG9ja190IGI7CisKKwkJciA9IHRvcF9mcmFtZShzLCAmZik7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGYtPmN1cnJlbnRfY2hpbGQgPj0gZi0+bnJfY2hpbGRyZW4pIHsKKwkJCXBvcF9mcmFtZShzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmxhZ3MgPSBsZTMyX3RvX2NwdShmLT5uLT5oZWFkZXIuZmxhZ3MpOworCQlpZiAoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKSB7CisJCQliID0gdmFsdWU2NChmLT5uLCBmLT5jdXJyZW50X2NoaWxkKTsKKwkJCWYtPmN1cnJlbnRfY2hpbGQrKzsKKwkJCXIgPSBwdXNoX2ZyYW1lKHMsIGIsIGYtPmxldmVsKTsKKwkJCWlmIChyKQorCQkJCWdvdG8gb3V0OworCisJCX0gZWxzZSBpZiAoZi0+bGV2ZWwgIT0gKGluZm8tPmxldmVscyAtIDEpKSB7CisJCQliID0gdmFsdWU2NChmLT5uLCBmLT5jdXJyZW50X2NoaWxkKTsKKwkJCWYtPmN1cnJlbnRfY2hpbGQrKzsKKwkJCXIgPSBwdXNoX2ZyYW1lKHMsIGIsIGYtPmxldmVsICsgMSk7CisJCQlpZiAocikKKwkJCQlnb3RvIG91dDsKKworCQl9IGVsc2UgeworCQkJaWYgKGluZm8tPnZhbHVlX3R5cGUuZGVjKSB7CisJCQkJdW5zaWduZWQgaTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBmLT5ucl9jaGlsZHJlbjsgaSsrKQorCQkJCQlpbmZvLT52YWx1ZV90eXBlLmRlYyhpbmZvLT52YWx1ZV90eXBlLmNvbnRleHQsCisJCQkJCQkJICAgICB2YWx1ZV9wdHIoZi0+biwgaSwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSk7CisJCQl9CisJCQlmLT5jdXJyZW50X2NoaWxkID0gZi0+bnJfY2hpbGRyZW47CisJCX0KKwl9CisKK291dDoKKwlrZnJlZShzKTsKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2RlbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgYnRyZWVfbG9va3VwX3JhdyhzdHJ1Y3Qgcm9fc3BpbmUgKnMsIGRtX2Jsb2NrX3QgYmxvY2ssIHVpbnQ2NF90IGtleSwKKwkJCSAgICBpbnQgKCpzZWFyY2hfZm4pKHN0cnVjdCBub2RlICosIHVpbnQ2NF90KSwKKwkJCSAgICB1aW50NjRfdCAqcmVzdWx0X2tleSwgdm9pZCAqdiwgc2l6ZV90IHZhbHVlX3NpemUpCit7CisJaW50IGksIHI7CisJdWludDMyX3QgZmxhZ3MsIG5yX2VudHJpZXM7CisKKwlkbyB7CisJCXIgPSByb19zdGVwKHMsIGJsb2NrKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisKKwkJaSA9IHNlYXJjaF9mbihyb19ub2RlKHMpLCBrZXkpOworCisJCWZsYWdzID0gbGUzMl90b19jcHUocm9fbm9kZShzKS0+aGVhZGVyLmZsYWdzKTsKKwkJbnJfZW50cmllcyA9IGxlMzJfdG9fY3B1KHJvX25vZGUocyktPmhlYWRlci5ucl9lbnRyaWVzKTsKKwkJaWYgKGkgPCAwIHx8IGkgPj0gbnJfZW50cmllcykKKwkJCXJldHVybiAtRU5PREFUQTsKKworCQlpZiAoZmxhZ3MgJiBJTlRFUk5BTF9OT0RFKQorCQkJYmxvY2sgPSB2YWx1ZTY0KHJvX25vZGUocyksIGkpOworCisJfSB3aGlsZSAoIShmbGFncyAmIExFQUZfTk9ERSkpOworCisJKnJlc3VsdF9rZXkgPSBsZTY0X3RvX2NwdShyb19ub2RlKHMpLT5rZXlzW2ldKTsKKwltZW1jcHkodiwgdmFsdWVfcHRyKHJvX25vZGUocyksIGksIHZhbHVlX3NpemUpLCB2YWx1ZV9zaXplKTsKKworCXJldHVybiAwOworfQorCitpbnQgZG1fYnRyZWVfbG9va3VwKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWVfbGUpCit7CisJdW5zaWduZWQgbGV2ZWwsIGxhc3RfbGV2ZWwgPSBpbmZvLT5sZXZlbHMgLSAxOworCWludCByID0gLUVOT0RBVEE7CisJdWludDY0X3QgcmtleTsKKwlfX2xlNjQgaW50ZXJuYWxfdmFsdWVfbGU7CisJc3RydWN0IHJvX3NwaW5lIHNwaW5lOworCisJaW5pdF9yb19zcGluZSgmc3BpbmUsIGluZm8pOworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGluZm8tPmxldmVsczsgbGV2ZWwrKykgeworCQlzaXplX3Qgc2l6ZTsKKwkJdm9pZCAqdmFsdWVfcDsKKworCQlpZiAobGV2ZWwgPT0gbGFzdF9sZXZlbCkgeworCQkJdmFsdWVfcCA9IHZhbHVlX2xlOworCQkJc2l6ZSA9IGluZm8tPnZhbHVlX3R5cGUuc2l6ZTsKKworCQl9IGVsc2UgeworCQkJdmFsdWVfcCA9ICZpbnRlcm5hbF92YWx1ZV9sZTsKKwkJCXNpemUgPSBzaXplb2YodWludDY0X3QpOworCQl9CisKKwkJciA9IGJ0cmVlX2xvb2t1cF9yYXcoJnNwaW5lLCByb290LCBrZXlzW2xldmVsXSwKKwkJCQkgICAgIGxvd2VyX2JvdW5kLCAmcmtleSwKKwkJCQkgICAgIHZhbHVlX3AsIHNpemUpOworCisJCWlmICghcikgeworCQkJaWYgKHJrZXkgIT0ga2V5c1tsZXZlbF0pIHsKKwkJCQlleGl0X3JvX3NwaW5lKCZzcGluZSk7CisJCQkJcmV0dXJuIC1FTk9EQVRBOworCQkJfQorCQl9IGVsc2UgeworCQkJZXhpdF9yb19zcGluZSgmc3BpbmUpOworCQkJcmV0dXJuIHI7CisJCX0KKworCQlyb290ID0gbGU2NF90b19jcHUoaW50ZXJuYWxfdmFsdWVfbGUpOworCX0KKwlleGl0X3JvX3NwaW5lKCZzcGluZSk7CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2xvb2t1cCk7CisKKy8qCisgKiBTcGxpdHMgYSBub2RlIGJ5IGNyZWF0aW5nIGEgc2libGluZyBub2RlIGFuZCBzaGlmdGluZyBoYWxmIHRoZSBub2RlcworICogY29udGVudHMgYWNyb3NzLiAgQXNzdW1lcyB0aGVyZSBpcyBhIHBhcmVudCBub2RlLCBhbmQgaXQgaGFzIHJvb20gZm9yCisgKiBhbm90aGVyIGNoaWxkLgorICoKKyAqIEJlZm9yZToKKyAqCSAgKy0tLS0tLS0tKworICoJICB8IFBhcmVudCB8CisgKgkgICstLS0tLS0tLSsKKyAqCSAgICAgfAorICoJICAgICB2CisgKgkrLS0tLS0tLS0tLSsKKyAqCXwgQSArKysrKysgfAorICoJKy0tLS0tLS0tLS0rCisgKgorICoKKyAqIEFmdGVyOgorICoJCSstLS0tLS0tLSsKKyAqCQl8IFBhcmVudCB8CisgKgkJKy0tLS0tLS0tKworICoJCSAgfAl8CisgKgkJICB2CSstLS0tLS0rCisgKgkgICAgKy0tLS0tLS0tLSsJICAgICAgIHwKKyAqCSAgICB8IEEqICsrKyAgfAkgICAgICAgdgorICoJICAgICstLS0tLS0tLS0rCSAgKy0tLS0tLS0rCisgKgkJCSAgfCBCICsrKyB8CisgKgkJCSAgKy0tLS0tLS0rCisgKgorICogV2hlcmUgQSogaXMgYSBzaGFkb3cgb2YgQS4KKyAqLworc3RhdGljIGludCBidHJlZV9zcGxpdF9zaWJsaW5nKHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICAgICB1bnNpZ25lZCBwYXJlbnRfaW5kZXgsIHVpbnQ2NF90IGtleSkKK3sKKwlpbnQgcjsKKwlzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBucl9sZWZ0LCBucl9yaWdodDsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmxlZnQsICpyaWdodCwgKnBhcmVudDsKKwlzdHJ1Y3Qgbm9kZSAqbG4sICpybiwgKnBuOworCV9fbGU2NCBsb2NhdGlvbjsKKworCWxlZnQgPSBzaGFkb3dfY3VycmVudChzKTsKKworCXIgPSBuZXdfYmxvY2socy0+aW5mbywgJnJpZ2h0KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJbG4gPSBkbV9ibG9ja19kYXRhKGxlZnQpOworCXJuID0gZG1fYmxvY2tfZGF0YShyaWdodCk7CisKKwlucl9sZWZ0ID0gbGUzMl90b19jcHUobG4tPmhlYWRlci5ucl9lbnRyaWVzKSAvIDI7CisJbnJfcmlnaHQgPSBsZTMyX3RvX2NwdShsbi0+aGVhZGVyLm5yX2VudHJpZXMpIC0gbnJfbGVmdDsKKworCWxuLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKG5yX2xlZnQpOworCisJcm4tPmhlYWRlci5mbGFncyA9IGxuLT5oZWFkZXIuZmxhZ3M7CisJcm4tPmhlYWRlci5ucl9lbnRyaWVzID0gY3B1X3RvX2xlMzIobnJfcmlnaHQpOworCXJuLT5oZWFkZXIubWF4X2VudHJpZXMgPSBsbi0+aGVhZGVyLm1heF9lbnRyaWVzOworCXJuLT5oZWFkZXIudmFsdWVfc2l6ZSA9IGxuLT5oZWFkZXIudmFsdWVfc2l6ZTsKKwltZW1jcHkocm4tPmtleXMsIGxuLT5rZXlzICsgbnJfbGVmdCwgbnJfcmlnaHQgKiBzaXplb2Yocm4tPmtleXNbMF0pKTsKKworCXNpemUgPSBsZTMyX3RvX2NwdShsbi0+aGVhZGVyLmZsYWdzKSAmIElOVEVSTkFMX05PREUgPworCQlzaXplb2YodWludDY0X3QpIDogcy0+aW5mby0+dmFsdWVfdHlwZS5zaXplOworCW1lbWNweSh2YWx1ZV9wdHIocm4sIDAsIHNpemUpLCB2YWx1ZV9wdHIobG4sIG5yX2xlZnQsIHNpemUpLAorCSAgICAgICBzaXplICogbnJfcmlnaHQpOworCisJLyoKKwkgKiBQYXRjaCB1cCB0aGUgcGFyZW50CisJICovCisJcGFyZW50ID0gc2hhZG93X3BhcmVudChzKTsKKworCXBuID0gZG1fYmxvY2tfZGF0YShwYXJlbnQpOworCWxvY2F0aW9uID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obGVmdCkpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJmxvY2F0aW9uKTsKKwltZW1jcHlfZGlzayh2YWx1ZV9wdHIocG4sIHBhcmVudF9pbmRleCwgc2l6ZW9mKF9fbGU2NCkpLAorCQkgICAgJmxvY2F0aW9uLCBzaXplb2YoX19sZTY0KSk7CisKKwlsb2NhdGlvbiA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKHJpZ2h0KSk7CisJX19kbV9ibGVzc19mb3JfZGlzaygmbG9jYXRpb24pOworCisJciA9IGluc2VydF9hdChzaXplb2YoX19sZTY0KSwgcG4sIHBhcmVudF9pbmRleCArIDEsCisJCSAgICAgIGxlNjRfdG9fY3B1KHJuLT5rZXlzWzBdKSwgJmxvY2F0aW9uKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoa2V5IDwgbGU2NF90b19jcHUocm4tPmtleXNbMF0pKSB7CisJCXVubG9ja19ibG9jayhzLT5pbmZvLCByaWdodCk7CisJCXMtPm5vZGVzWzFdID0gbGVmdDsKKwl9IGVsc2UgeworCQl1bmxvY2tfYmxvY2socy0+aW5mbywgbGVmdCk7CisJCXMtPm5vZGVzWzFdID0gcmlnaHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGxpdHMgYSBub2RlIGJ5IGNyZWF0aW5nIHR3byBuZXcgY2hpbGRyZW4gYmVuZWF0aCB0aGUgZ2l2ZW4gbm9kZS4KKyAqCisgKiBCZWZvcmU6CisgKgkgICstLS0tLS0tLS0tKworICoJICB8IEEgKysrKysrIHwKKyAqCSAgKy0tLS0tLS0tLS0rCisgKgorICoKKyAqIEFmdGVyOgorICoJKy0tLS0tLS0tLS0tLSsKKyAqCXwgQSAoc2hhZG93KSB8CisgKgkrLS0tLS0tLS0tLS0tKworICoJICAgIHwJfAorICogICArLS0tLS0tKwkrLS0tLSsKKyAqICAgfAkJICAgICB8CisgKiAgIHYJCSAgICAgdgorICogKy0tLS0tLS0rCSArLS0tLS0tLSsKKyAqIHwgQiArKysgfAkgfCBDICsrKyB8CisgKiArLS0tLS0tLSsJICstLS0tLS0tKworICovCitzdGF0aWMgaW50IGJ0cmVlX3NwbGl0X2JlbmVhdGgoc3RydWN0IHNoYWRvd19zcGluZSAqcywgdWludDY0X3Qga2V5KQoreworCWludCByOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIG5yX2xlZnQsIG5yX3JpZ2h0OworCXN0cnVjdCBkbV9ibG9jayAqbGVmdCwgKnJpZ2h0LCAqbmV3X3BhcmVudDsKKwlzdHJ1Y3Qgbm9kZSAqcG4sICpsbiwgKnJuOworCV9fbGU2NCB2YWw7CisKKwluZXdfcGFyZW50ID0gc2hhZG93X2N1cnJlbnQocyk7CisKKwlyID0gbmV3X2Jsb2NrKHMtPmluZm8sICZsZWZ0KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IG5ld19ibG9jayhzLT5pbmZvLCAmcmlnaHQpOworCWlmIChyIDwgMCkgeworCQkvKiBGSVhNRTogcHV0IGxlZnQgKi8KKwkJcmV0dXJuIHI7CisJfQorCisJcG4gPSBkbV9ibG9ja19kYXRhKG5ld19wYXJlbnQpOworCWxuID0gZG1fYmxvY2tfZGF0YShsZWZ0KTsKKwlybiA9IGRtX2Jsb2NrX2RhdGEocmlnaHQpOworCisJbnJfbGVmdCA9IGxlMzJfdG9fY3B1KHBuLT5oZWFkZXIubnJfZW50cmllcykgLyAyOworCW5yX3JpZ2h0ID0gbGUzMl90b19jcHUocG4tPmhlYWRlci5ucl9lbnRyaWVzKSAtIG5yX2xlZnQ7CisKKwlsbi0+aGVhZGVyLmZsYWdzID0gcG4tPmhlYWRlci5mbGFnczsKKwlsbi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9sZWZ0KTsKKwlsbi0+aGVhZGVyLm1heF9lbnRyaWVzID0gcG4tPmhlYWRlci5tYXhfZW50cmllczsKKwlsbi0+aGVhZGVyLnZhbHVlX3NpemUgPSBwbi0+aGVhZGVyLnZhbHVlX3NpemU7CisKKwlybi0+aGVhZGVyLmZsYWdzID0gcG4tPmhlYWRlci5mbGFnczsKKwlybi0+aGVhZGVyLm5yX2VudHJpZXMgPSBjcHVfdG9fbGUzMihucl9yaWdodCk7CisJcm4tPmhlYWRlci5tYXhfZW50cmllcyA9IHBuLT5oZWFkZXIubWF4X2VudHJpZXM7CisJcm4tPmhlYWRlci52YWx1ZV9zaXplID0gcG4tPmhlYWRlci52YWx1ZV9zaXplOworCisJbWVtY3B5KGxuLT5rZXlzLCBwbi0+a2V5cywgbnJfbGVmdCAqIHNpemVvZihwbi0+a2V5c1swXSkpOworCW1lbWNweShybi0+a2V5cywgcG4tPmtleXMgKyBucl9sZWZ0LCBucl9yaWdodCAqIHNpemVvZihwbi0+a2V5c1swXSkpOworCisJc2l6ZSA9IGxlMzJfdG9fY3B1KHBuLT5oZWFkZXIuZmxhZ3MpICYgSU5URVJOQUxfTk9ERSA/CisJCXNpemVvZihfX2xlNjQpIDogcy0+aW5mby0+dmFsdWVfdHlwZS5zaXplOworCW1lbWNweSh2YWx1ZV9wdHIobG4sIDAsIHNpemUpLCB2YWx1ZV9wdHIocG4sIDAsIHNpemUpLCBucl9sZWZ0ICogc2l6ZSk7CisJbWVtY3B5KHZhbHVlX3B0cihybiwgMCwgc2l6ZSksIHZhbHVlX3B0cihwbiwgbnJfbGVmdCwgc2l6ZSksCisJICAgICAgIG5yX3JpZ2h0ICogc2l6ZSk7CisKKwkvKiBuZXdfcGFyZW50IHNob3VsZCBqdXN0IHBvaW50IHRvIGwgYW5kIHIgbm93ICovCisJcG4tPmhlYWRlci5mbGFncyA9IGNwdV90b19sZTMyKElOVEVSTkFMX05PREUpOworCXBuLT5oZWFkZXIubnJfZW50cmllcyA9IGNwdV90b19sZTMyKDIpOworCXBuLT5oZWFkZXIubWF4X2VudHJpZXMgPSBjcHVfdG9fbGUzMigKKwkJY2FsY19tYXhfZW50cmllcyhzaXplb2YoX19sZTY0KSwKKwkJCQkgZG1fYm1fYmxvY2tfc2l6ZSgKKwkJCQkJIGRtX3RtX2dldF9ibShzLT5pbmZvLT50bSkpKSk7CisJcG4tPmhlYWRlci52YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIoc2l6ZW9mKF9fbGU2NCkpOworCisJdmFsID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obGVmdCkpOworCV9fZG1fYmxlc3NfZm9yX2Rpc2soJnZhbCk7CisJcG4tPmtleXNbMF0gPSBsbi0+a2V5c1swXTsKKwltZW1jcHlfZGlzayh2YWx1ZV9wdHIocG4sIDAsIHNpemVvZihfX2xlNjQpKSwgJnZhbCwgc2l6ZW9mKF9fbGU2NCkpOworCisJdmFsID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24ocmlnaHQpKTsKKwlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZ2YWwpOworCXBuLT5rZXlzWzFdID0gcm4tPmtleXNbMF07CisJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKHBuLCAxLCBzaXplb2YoX19sZTY0KSksICZ2YWwsIHNpemVvZihfX2xlNjQpKTsKKworCS8qCisJICogcmVqaWcgdGhlIHNwaW5lLiAgVGhpcyBpcyB1Z2x5LCBzaW5jZSBpdCBrbm93cyB0b28KKwkgKiBtdWNoIGFib3V0IHRoZSBzcGluZQorCSAqLworCWlmIChzLT5ub2Rlc1swXSAhPSBuZXdfcGFyZW50KSB7CisJCXVubG9ja19ibG9jayhzLT5pbmZvLCBzLT5ub2Rlc1swXSk7CisJCXMtPm5vZGVzWzBdID0gbmV3X3BhcmVudDsKKwl9CisJaWYgKGtleSA8IGxlNjRfdG9fY3B1KHJuLT5rZXlzWzBdKSkgeworCQl1bmxvY2tfYmxvY2socy0+aW5mbywgcmlnaHQpOworCQlzLT5ub2Rlc1sxXSA9IGxlZnQ7CisJfSBlbHNlIHsKKwkJdW5sb2NrX2Jsb2NrKHMtPmluZm8sIGxlZnQpOworCQlzLT5ub2Rlc1sxXSA9IHJpZ2h0OworCX0KKwlzLT5jb3VudCA9IDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJlZV9pbnNlcnRfcmF3KHN0cnVjdCBzaGFkb3dfc3BpbmUgKnMsIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICBzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSAqdnQsCisJCQkgICAgdWludDY0X3Qga2V5LCB1bnNpZ25lZCAqaW5kZXgpCit7CisJaW50IHIsIGkgPSAqaW5kZXgsIHRvcCA9IDE7CisJc3RydWN0IG5vZGUgKm5vZGU7CisKKwlmb3IgKDs7KSB7CisJCXIgPSBzaGFkb3dfc3RlcChzLCByb290LCB2dCk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCW5vZGUgPSBkbV9ibG9ja19kYXRhKHNoYWRvd19jdXJyZW50KHMpKTsKKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHBhdGNoIHVwIHRoZSBwYXJlbnQgbm9kZSwgdWdseSwgYnV0IEkgZG9uJ3QKKwkJICogc2VlIGEgd2F5IHRvIGRvIHRoaXMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIHRoZSBzcGluZQorCQkgKiBvcC4KKwkJICovCisJCWlmIChzaGFkb3dfaGFzX3BhcmVudChzKSAmJiBpID49IDApIHsgLyogRklYTUU6IHNlY29uZCBjbGF1c2UgdW5uZXNzLiAqLworCQkJX19sZTY0IGxvY2F0aW9uID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oc2hhZG93X2N1cnJlbnQocykpKTsKKworCQkJX19kbV9ibGVzc19mb3JfZGlzaygmbG9jYXRpb24pOworCQkJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKGRtX2Jsb2NrX2RhdGEoc2hhZG93X3BhcmVudChzKSksIGksIHNpemVvZih1aW50NjRfdCkpLAorCQkJCSAgICAmbG9jYXRpb24sIHNpemVvZihfX2xlNjQpKTsKKwkJfQorCisJCW5vZGUgPSBkbV9ibG9ja19kYXRhKHNoYWRvd19jdXJyZW50KHMpKTsKKworCQlpZiAobm9kZS0+aGVhZGVyLm5yX2VudHJpZXMgPT0gbm9kZS0+aGVhZGVyLm1heF9lbnRyaWVzKSB7CisJCQlpZiAodG9wKQorCQkJCXIgPSBidHJlZV9zcGxpdF9iZW5lYXRoKHMsIGtleSk7CisJCQllbHNlCisJCQkJciA9IGJ0cmVlX3NwbGl0X3NpYmxpbmcocywgcm9vdCwgaSwga2V5KTsKKworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQl9CisKKwkJbm9kZSA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQocykpOworCisJCWkgPSBsb3dlcl9ib3VuZChub2RlLCBrZXkpOworCisJCWlmIChsZTMyX3RvX2NwdShub2RlLT5oZWFkZXIuZmxhZ3MpICYgTEVBRl9OT0RFKQorCQkJYnJlYWs7CisKKwkJaWYgKGkgPCAwKSB7CisJCQkvKiBjaGFuZ2UgdGhlIGJvdW5kcyBvbiB0aGUgbG93ZXN0IGtleSAqLworCQkJbm9kZS0+a2V5c1swXSA9IGNwdV90b19sZTY0KGtleSk7CisJCQlpID0gMDsKKwkJfQorCisJCXJvb3QgPSB2YWx1ZTY0KG5vZGUsIGkpOworCQl0b3AgPSAwOworCX0KKworCWlmIChpIDwgMCB8fCBsZTY0X3RvX2NwdShub2RlLT5rZXlzW2ldKSAhPSBrZXkpCisJCWkrKzsKKworCSppbmRleCA9IGk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgdWludDY0X3QgKmtleXMsIHZvaWQgKnZhbHVlLCBkbV9ibG9ja190ICpuZXdfcm9vdCwKKwkJICBpbnQgKmluc2VydGVkKQorCQkgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCWludCByLCBuZWVkX2luc2VydDsKKwl1bnNpZ25lZCBsZXZlbCwgaW5kZXggPSAtMSwgbGFzdF9sZXZlbCA9IGluZm8tPmxldmVscyAtIDE7CisJZG1fYmxvY2tfdCBibG9jayA9IHJvb3Q7CisJc3RydWN0IHNoYWRvd19zcGluZSBzcGluZTsKKwlzdHJ1Y3Qgbm9kZSAqbjsKKwlzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSBsZTY0X3R5cGU7CisKKwlsZTY0X3R5cGUuY29udGV4dCA9IE5VTEw7CisJbGU2NF90eXBlLnNpemUgPSBzaXplb2YoX19sZTY0KTsKKwlsZTY0X3R5cGUuaW5jID0gTlVMTDsKKwlsZTY0X3R5cGUuZGVjID0gTlVMTDsKKwlsZTY0X3R5cGUuZXF1YWwgPSBOVUxMOworCisJaW5pdF9zaGFkb3dfc3BpbmUoJnNwaW5lLCBpbmZvKTsKKworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IChpbmZvLT5sZXZlbHMgLSAxKTsgbGV2ZWwrKykgeworCQlyID0gYnRyZWVfaW5zZXJ0X3Jhdygmc3BpbmUsIGJsb2NrLCAmbGU2NF90eXBlLCBrZXlzW2xldmVsXSwgJmluZGV4KTsKKwkJaWYgKHIgPCAwKQorCQkJZ290byBiYWQ7CisKKwkJbiA9IGRtX2Jsb2NrX2RhdGEoc2hhZG93X2N1cnJlbnQoJnNwaW5lKSk7CisJCW5lZWRfaW5zZXJ0ID0gKChpbmRleCA+PSBsZTMyX3RvX2NwdShuLT5oZWFkZXIubnJfZW50cmllcykpIHx8CisJCQkgICAgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaW5kZXhdKSAhPSBrZXlzW2xldmVsXSkpOworCisJCWlmIChuZWVkX2luc2VydCkgeworCQkJZG1fYmxvY2tfdCBuZXdfdHJlZTsKKwkJCV9fbGU2NCBuZXdfbGU7CisKKwkJCXIgPSBkbV9idHJlZV9lbXB0eShpbmZvLCAmbmV3X3RyZWUpOworCQkJaWYgKHIgPCAwKQorCQkJCWdvdG8gYmFkOworCisJCQluZXdfbGUgPSBjcHVfdG9fbGU2NChuZXdfdHJlZSk7CisJCQlfX2RtX2JsZXNzX2Zvcl9kaXNrKCZuZXdfbGUpOworCisJCQlyID0gaW5zZXJ0X2F0KHNpemVvZih1aW50NjRfdCksIG4sIGluZGV4LAorCQkJCSAgICAgIGtleXNbbGV2ZWxdLCAmbmV3X2xlKTsKKwkJCWlmIChyKQorCQkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKGxldmVsIDwgbGFzdF9sZXZlbCkKKwkJCWJsb2NrID0gdmFsdWU2NChuLCBpbmRleCk7CisJfQorCisJciA9IGJ0cmVlX2luc2VydF9yYXcoJnNwaW5lLCBibG9jaywgJmluZm8tPnZhbHVlX3R5cGUsCisJCQkgICAgIGtleXNbbGV2ZWxdLCAmaW5kZXgpOworCWlmIChyIDwgMCkKKwkJZ290byBiYWQ7CisKKwluID0gZG1fYmxvY2tfZGF0YShzaGFkb3dfY3VycmVudCgmc3BpbmUpKTsKKwluZWVkX2luc2VydCA9ICgoaW5kZXggPj0gbGUzMl90b19jcHUobi0+aGVhZGVyLm5yX2VudHJpZXMpKSB8fAorCQkgICAgICAgKGxlNjRfdG9fY3B1KG4tPmtleXNbaW5kZXhdKSAhPSBrZXlzW2xldmVsXSkpOworCisJaWYgKG5lZWRfaW5zZXJ0KSB7CisJCWlmIChpbnNlcnRlZCkKKwkJCSppbnNlcnRlZCA9IDE7CisKKwkJciA9IGluc2VydF9hdChpbmZvLT52YWx1ZV90eXBlLnNpemUsIG4sIGluZGV4LAorCQkJICAgICAga2V5c1tsZXZlbF0sIHZhbHVlKTsKKwkJaWYgKHIpCisJCQlnb3RvIGJhZF91bmJsZXNzZWQ7CisJfSBlbHNlIHsKKwkJaWYgKGluc2VydGVkKQorCQkJKmluc2VydGVkID0gMDsKKworCQlpZiAoaW5mby0+dmFsdWVfdHlwZS5kZWMgJiYKKwkJICAgICghaW5mby0+dmFsdWVfdHlwZS5lcXVhbCB8fAorCQkgICAgICFpbmZvLT52YWx1ZV90eXBlLmVxdWFsKAorCQkJICAgICBpbmZvLT52YWx1ZV90eXBlLmNvbnRleHQsCisJCQkgICAgIHZhbHVlX3B0cihuLCBpbmRleCwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSwKKwkJCSAgICAgdmFsdWUpKSkgeworCQkJaW5mby0+dmFsdWVfdHlwZS5kZWMoaW5mby0+dmFsdWVfdHlwZS5jb250ZXh0LAorCQkJCQkgICAgIHZhbHVlX3B0cihuLCBpbmRleCwgaW5mby0+dmFsdWVfdHlwZS5zaXplKSk7CisJCX0KKwkJbWVtY3B5X2Rpc2sodmFsdWVfcHRyKG4sIGluZGV4LCBpbmZvLT52YWx1ZV90eXBlLnNpemUpLAorCQkJICAgIHZhbHVlLCBpbmZvLT52YWx1ZV90eXBlLnNpemUpOworCX0KKworCSpuZXdfcm9vdCA9IHNoYWRvd19yb290KCZzcGluZSk7CisJZXhpdF9zaGFkb3dfc3BpbmUoJnNwaW5lKTsKKworCXJldHVybiAwOworCitiYWQ6CisJX19kbV91bmJsZXNzX2Zvcl9kaXNrKHZhbHVlKTsKK2JhZF91bmJsZXNzZWQ6CisJZXhpdF9zaGFkb3dfc3BpbmUoJnNwaW5lKTsKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX2J0cmVlX2luc2VydChzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkgICAgdWludDY0X3QgKmtleXMsIHZvaWQgKnZhbHVlLCBkbV9ibG9ja190ICpuZXdfcm9vdCkKKwkJICAgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCXJldHVybiBpbnNlcnQoaW5mbywgcm9vdCwga2V5cywgdmFsdWUsIG5ld19yb290LCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX2J0cmVlX2luc2VydCk7CisKK2ludCBkbV9idHJlZV9pbnNlcnRfbm90aWZ5KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCQkgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWUsIGRtX2Jsb2NrX3QgKm5ld19yb290LAorCQkJICAgaW50ICppbnNlcnRlZCkKKwkJCSAgIF9fZG1fd3JpdHRlbl90b19kaXNrKHZhbHVlKQoreworCXJldHVybiBpbnNlcnQoaW5mbywgcm9vdCwga2V5cywgdmFsdWUsIG5ld19yb290LCBpbnNlcnRlZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9pbnNlcnRfbm90aWZ5KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBmaW5kX2hpZ2hlc3Rfa2V5KHN0cnVjdCByb19zcGluZSAqcywgZG1fYmxvY2tfdCBibG9jaywKKwkJCSAgICB1aW50NjRfdCAqcmVzdWx0X2tleSwgZG1fYmxvY2tfdCAqbmV4dF9ibG9jaykKK3sKKwlpbnQgaSwgcjsKKwl1aW50MzJfdCBmbGFnczsKKworCWRvIHsKKwkJciA9IHJvX3N0ZXAocywgYmxvY2spOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQlmbGFncyA9IGxlMzJfdG9fY3B1KHJvX25vZGUocyktPmhlYWRlci5mbGFncyk7CisJCWkgPSBsZTMyX3RvX2NwdShyb19ub2RlKHMpLT5oZWFkZXIubnJfZW50cmllcyk7CisJCWlmICghaSkKKwkJCXJldHVybiAtRU5PREFUQTsKKwkJZWxzZQorCQkJaS0tOworCisJCSpyZXN1bHRfa2V5ID0gbGU2NF90b19jcHUocm9fbm9kZShzKS0+a2V5c1tpXSk7CisJCWlmIChuZXh0X2Jsb2NrIHx8IGZsYWdzICYgSU5URVJOQUxfTk9ERSkKKwkJCWJsb2NrID0gdmFsdWU2NChyb19ub2RlKHMpLCBpKTsKKworCX0gd2hpbGUgKGZsYWdzICYgSU5URVJOQUxfTk9ERSk7CisKKwlpZiAobmV4dF9ibG9jaykKKwkJKm5leHRfYmxvY2sgPSBibG9jazsKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX2J0cmVlX2ZpbmRfaGlnaGVzdF9rZXkoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgICAgIHVpbnQ2NF90ICpyZXN1bHRfa2V5cykKK3sKKwlpbnQgciA9IDAsIGNvdW50ID0gMCwgbGV2ZWw7CisJc3RydWN0IHJvX3NwaW5lIHNwaW5lOworCisJaW5pdF9yb19zcGluZSgmc3BpbmUsIGluZm8pOworCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGluZm8tPmxldmVsczsgbGV2ZWwrKykgeworCQlyID0gZmluZF9oaWdoZXN0X2tleSgmc3BpbmUsIHJvb3QsIHJlc3VsdF9rZXlzICsgbGV2ZWwsCisJCQkJICAgICBsZXZlbCA9PSBpbmZvLT5sZXZlbHMgLSAxID8gTlVMTCA6ICZyb290KTsKKwkJaWYgKHIgPT0gLUVOT0RBVEEpIHsKKwkJCXIgPSAwOworCQkJYnJlYWs7CisKKwkJfSBlbHNlIGlmIChyKQorCQkJYnJlYWs7CisKKwkJY291bnQrKzsKKwl9CisJZXhpdF9yb19zcGluZSgmc3BpbmUpOworCisJcmV0dXJuIHIgPyByIDogY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9idHJlZV9maW5kX2hpZ2hlc3Rfa2V5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLWJ0cmVlLmggYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1idHJlZS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworI2lmbmRlZiBfTElOVVhfRE1fQlRSRUVfSAorI2RlZmluZSBfTElOVVhfRE1fQlRSRUVfSAorCisjaW5jbHVkZSAiZG0tYmxvY2stbWFuYWdlci5oIgorCitzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlcjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEFubm90YXRpb25zIHVzZWQgdG8gY2hlY2sgb24tZGlzayBtZXRhZGF0YSBpcyBoYW5kbGVkIGFzIGxpdHRsZS1lbmRpYW4uCisgKi8KKyNpZmRlZiBfX0NIRUNLRVJfXworIyAgZGVmaW5lIF9fZG1fd3JpdHRlbl90b19kaXNrKHgpIF9fcmVsZWFzZXMoeCkKKyMgIGRlZmluZSBfX2RtX3JlYWRzX2Zyb21fZGlzayh4KSBfX2FjcXVpcmVzKHgpCisjICBkZWZpbmUgX19kbV9ibGVzc19mb3JfZGlzayh4KSBfX2FjcXVpcmUoeCkKKyMgIGRlZmluZSBfX2RtX3VuYmxlc3NfZm9yX2Rpc2soeCkgX19yZWxlYXNlKHgpCisjZWxzZQorIyAgZGVmaW5lIF9fZG1fd3JpdHRlbl90b19kaXNrKHgpCisjICBkZWZpbmUgX19kbV9yZWFkc19mcm9tX2Rpc2soeCkKKyMgIGRlZmluZSBfX2RtX2JsZXNzX2Zvcl9kaXNrKHgpCisjICBkZWZpbmUgX19kbV91bmJsZXNzX2Zvcl9kaXNrKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE1hbmlwdWxhdGVzIGhpZXJhcmNoaWNhbCBCKyB0cmVlcyB3aXRoIDY0LWJpdCBrZXlzIGFuZCBhcmJpdHJhcnktc2l6ZWQKKyAqIHZhbHVlcy4KKyAqLworCisvKgorICogSW5mb21hdGlvbiBhYm91dCB0aGUgdmFsdWVzIHN0b3JlZCB3aXRoaW4gdGhlIGJ0cmVlLgorICovCitzdHJ1Y3QgZG1fYnRyZWVfdmFsdWVfdHlwZSB7CisJdm9pZCAqY29udGV4dDsKKworCS8qCisJICogVGhlIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCB2YWx1ZS4KKwkgKi8KKwl1aW50MzJfdCBzaXplOworCisJLyoKKwkgKiBBbnkgb2YgdGhlc2UgbWV0aG9kcyBjYW4gYmUgc2FmZWx5IHNldCB0byBOVUxMIGlmIHlvdSBkbyBub3QKKwkgKiBuZWVkIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUuCisJICovCisKKwkvKgorCSAqIFRoZSBidHJlZSBpcyBtYWtpbmcgYSBkdXBsaWNhdGUgb2YgdGhlIHZhbHVlLCBmb3IgaW5zdGFuY2UKKwkgKiBiZWNhdXNlIHByZXZpb3VzbHktc2hhcmVkIGJ0cmVlIG5vZGVzIGhhdmUgbm93IGRpdmVyZ2VkLgorCSAqIEB2YWx1ZSBhcmd1bWVudCBpcyB0aGUgbmV3IGNvcHkgdGhhdCB0aGUgY29weSBmdW5jdGlvbiBtYXkgbW9kaWZ5LgorCSAqIChQcm9iYWJseSBpdCBqdXN0IHdhbnRzIHRvIGluY3JlbWVudCBhIHJlZmVyZW5jZSBjb3VudAorCSAqIHNvbWV3aGVyZS4pIFRoaXMgbWV0aG9kIGlzIF9ub3RfIGNhbGxlZCBmb3IgaW5zZXJ0aW9uIG9mIGEgbmV3CisJICogdmFsdWU6IEl0IGlzIGFzc3VtZWQgdGhlIHJlZiBjb3VudCBpcyBhbHJlYWR5IDEuCisJICovCisJdm9pZCAoKmluYykodm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpOworCisJLyoKKwkgKiBUaGlzIHZhbHVlIGlzIGJlaW5nIGRlbGV0ZWQuICBUaGUgYnRyZWUgdGFrZXMgY2FyZSBvZiBmcmVlaW5nCisJICogdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IEB2YWx1ZS4gIE9mdGVuIHRoZSBkZWwgZnVuY3Rpb24ganVzdAorCSAqIG5lZWRzIHRvIGRlY3JlbWVudCBhIHJlZmVyZW5jZSBjb3VudCBzb21ld2hlcmUuCisJICovCisJdm9pZCAoKmRlYykodm9pZCAqY29udGV4dCwgdm9pZCAqdmFsdWUpOworCisJLyoKKwkgKiBBIHRlc3QgZm9yIGVxdWFsaXR5IGJldHdlZW4gdHdvIHZhbHVlcy4gIFdoZW4gYSB2YWx1ZSBpcworCSAqIG92ZXJ3cml0dGVuIHdpdGggYSBuZXcgb25lLCB0aGUgb2xkIG9uZSBoYXMgdGhlIGRlYyBtZXRob2QKKwkgKiBjYWxsZWQgX3VubGVzc18gdGhlIG5ldyBhbmQgb2xkIHZhbHVlIGFyZSBkZWVtZWQgZXF1YWwuCisJICovCisJaW50ICgqZXF1YWwpKHZvaWQgKmNvbnRleHQsIHZvaWQgKnZhbHVlMSwgdm9pZCAqdmFsdWUyKTsKK307CisKKy8qCisgKiBUaGUgc2hhcGUgYW5kIGNvbnRlbnRzIG9mIGEgYnRyZWUuCisgKi8KK3N0cnVjdCBkbV9idHJlZV9pbmZvIHsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisKKwkvKgorCSAqIE51bWJlciBvZiBuZXN0ZWQgYnRyZWVzLiAoTm90IHRoZSBkZXB0aCBvZiBhIHNpbmdsZSB0cmVlLikKKwkgKi8KKwl1bnNpZ25lZCBsZXZlbHM7CisJc3RydWN0IGRtX2J0cmVlX3ZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKK307CisKKy8qCisgKiBTZXQgdXAgYW4gZW1wdHkgdHJlZS4gIE8oMSkuCisgKi8KK2ludCBkbV9idHJlZV9lbXB0eShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCAqcm9vdCk7CisKKy8qCisgKiBEZWxldGUgYSB0cmVlLiAgTyhuKSAtIHRoaXMgaXMgdGhlIHNsb3cgb25lISAgSXQgY2FuIGFsc28gYmxvY2ssIHNvCisgKiBwbGVhc2UgZG9uJ3QgY2FsbCBpdCBvbiBhbiBJTyBwYXRoLgorICovCitpbnQgZG1fYnRyZWVfZGVsKHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QpOworCisvKgorICogQWxsIHRoZSBsb29rdXAgZnVuY3Rpb25zIHJldHVybiAtRU5PREFUQSBpZiB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZC4KKyAqLworCisvKgorICogVHJpZXMgdG8gZmluZCBhIGtleSB0aGF0IG1hdGNoZXMgZXhhY3RseS4gIE8obG4obikpCisgKi8KK2ludCBkbV9idHJlZV9sb29rdXAoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgIHVpbnQ2NF90ICprZXlzLCB2b2lkICp2YWx1ZV9sZSk7CisKKy8qCisgKiBJbnNlcnRpb24gKG9yIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB2YWx1ZSkuICBPKGxuKG4pKQorICovCitpbnQgZG1fYnRyZWVfaW5zZXJ0KHN0cnVjdCBkbV9idHJlZV9pbmZvICppbmZvLCBkbV9ibG9ja190IHJvb3QsCisJCSAgICB1aW50NjRfdCAqa2V5cywgdm9pZCAqdmFsdWUsIGRtX2Jsb2NrX3QgKm5ld19yb290KQorCQkgICAgX19kbV93cml0dGVuX3RvX2Rpc2sodmFsdWUpOworCisvKgorICogQSB2YXJpYW50IG9mIGluc2VydCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGl0IGFjdHVhbGx5IGluc2VydGVkIG9yIGp1c3QKKyAqIG92ZXJ3cm90ZS4gIFVzZWZ1bCBpZiB5b3UncmUga2VlcGluZyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYQorICogdHJlZS4KKyAqLworaW50IGRtX2J0cmVlX2luc2VydF9ub3RpZnkoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJCSAgIHVpbnQ2NF90ICprZXlzLCB2b2lkICp2YWx1ZSwgZG1fYmxvY2tfdCAqbmV3X3Jvb3QsCisJCQkgICBpbnQgKmluc2VydGVkKQorCQkJICAgX19kbV93cml0dGVuX3RvX2Rpc2sodmFsdWUpOworCisvKgorICogUmVtb3ZlIGEga2V5IGlmIHByZXNlbnQuICBUaGlzIGRvZXNuJ3QgcmVtb3ZlIGVtcHR5IHN1YiB0cmVlcy4gIE5vcm1hbGx5CisgKiBzdWJ0cmVlcyByZXByZXNlbnQgYSBzZXBhcmF0ZSBlbnRpdHksIGxpa2UgYSBzbmFwc2hvdCBtYXAsIHNvIHRoaXMgaXMKKyAqIGNvcnJlY3QgYmVoYXZpb3VyLiAgTyhsbihuKSkuCisgKi8KK2ludCBkbV9idHJlZV9yZW1vdmUoc3RydWN0IGRtX2J0cmVlX2luZm8gKmluZm8sIGRtX2Jsb2NrX3Qgcm9vdCwKKwkJICAgIHVpbnQ2NF90ICprZXlzLCBkbV9ibG9ja190ICpuZXdfcm9vdCk7CisKKy8qCisgKiBSZXR1cm5zIDwgMCBvbiBmYWlsdXJlLiAgT3RoZXJ3aXNlIHRoZSBudW1iZXIgb2Yga2V5IGVudHJpZXMgdGhhdCBoYXZlCisgKiBiZWVuIGZpbGxlZCBvdXQuICBSZW1lbWJlciB0cmVlcyBjYW4gaGF2ZSB6ZXJvIGVudHJpZXMsIGFuZCBhcyBzdWNoIGhhdmUKKyAqIG5vIGhpZ2hlc3Qga2V5LgorICovCitpbnQgZG1fYnRyZWVfZmluZF9oaWdoZXN0X2tleShzdHJ1Y3QgZG1fYnRyZWVfaW5mbyAqaW5mbywgZG1fYmxvY2tfdCByb290LAorCQkJICAgICAgdWludDY0X3QgKnJlc3VsdF9rZXlzKTsKKworI2VuZGlmCS8qIF9MSU5VWF9ETV9CVFJFRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXBlcnNpc3RlbnQtZGF0YS1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWUyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1wZXJzaXN0ZW50LWRhdGEtaW50ZXJuYWwuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9ETV9QRVJTSVNURU5UX0RBVEFfSU5URVJOQUxfSAorI2RlZmluZSBfRE1fUEVSU0lTVEVOVF9EQVRBX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkbV9oYXNoX2Jsb2NrKGRtX2Jsb2NrX3QgYiwgdW5zaWduZWQgaGFzaF9tYXNrKQoreworCWNvbnN0IHVuc2lnbmVkIEJJR19QUklNRSA9IDQyOTQ5NjcyOTFVTDsKKworCXJldHVybiAoKCh1bnNpZ25lZCkgYikgKiBCSUdfUFJJTUUpICYgaGFzaF9tYXNrOworfQorCisjZW5kaWYJLyogX1BFUlNJU1RFTlRfREFUQV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5jIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNoZWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVkNTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNoZWNrZXIuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1jaGVja2VyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKyNpZmRlZiBDT05GSUdfRE1fREVCVUdfU1BBQ0VfTUFQUworCisjZGVmaW5lIERNX01TR19QUkVGSVggInNwYWNlIG1hcCBjaGVja2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3QgY291bnRfYXJyYXkgeworCWRtX2Jsb2NrX3QgbnI7CisJZG1fYmxvY2tfdCBucl9mcmVlOworCisJdWludDMyX3QgKmNvdW50czsKK307CisKK3N0YXRpYyBpbnQgY2FfZ2V0X2NvdW50KHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgKmNvdW50KQoreworCWlmIChiID49IGNhLT5ucikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY291bnQgPSBjYS0+Y291bnRzW2JdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhX2NvdW50X21vcmVfdGhhbl9vbmUoc3RydWN0IGNvdW50X2FycmF5ICpjYSwgZG1fYmxvY2tfdCBiLCBpbnQgKnIpCit7CisJaWYgKGIgPj0gY2EtPm5yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpyID0gY2EtPmNvdW50c1tiXSA+IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ffc2V0X2NvdW50KHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgY291bnQpCit7CisJdWludDMyX3Qgb2xkX2NvdW50OworCisJaWYgKGIgPj0gY2EtPm5yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9jb3VudCA9IGNhLT5jb3VudHNbYl07CisKKwlpZiAoIWNvdW50ICYmIG9sZF9jb3VudCkKKwkJY2EtPm5yX2ZyZWUrKzsKKworCWVsc2UgaWYgKGNvdW50ICYmICFvbGRfY291bnQpCisJCWNhLT5ucl9mcmVlLS07CisKKwljYS0+Y291bnRzW2JdID0gY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfaW5jX2Jsb2NrKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYikKK3sKKwlpZiAoYiA+PSBjYS0+bnIpCisJCXJldHVybiAtRUlOVkFMOworCisJY2Ffc2V0X2NvdW50KGNhLCBiLCBjYS0+Y291bnRzW2JdICsgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZGVjX2Jsb2NrKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgYikKK3sKKwlpZiAoYiA+PSBjYS0+bnIpCisJCXJldHVybiAtRUlOVkFMOworCisJQlVHX09OKGNhLT5jb3VudHNbYl0gPT0gMCk7CisJY2Ffc2V0X2NvdW50KGNhLCBiLCBjYS0+Y291bnRzW2JdIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfY3JlYXRlKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzOworCisJciA9IGRtX3NtX2dldF9ucl9ibG9ja3Moc20sICZucl9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWNhLT5uciA9IG5yX2Jsb2NrczsKKwljYS0+bnJfZnJlZSA9IG5yX2Jsb2NrczsKKwljYS0+Y291bnRzID0ga3phbGxvYyhzaXplb2YoKmNhLT5jb3VudHMpICogbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhLT5jb3VudHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfbG9hZChzdHJ1Y3QgY291bnRfYXJyYXkgKmNhLCBzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlpbnQgcjsKKwl1aW50MzJfdCBjb3VudDsKKwlkbV9ibG9ja190IG5yX2Jsb2NrcywgaTsKKworCXIgPSBkbV9zbV9nZXRfbnJfYmxvY2tzKHNtLCAmbnJfYmxvY2tzKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlCVUdfT04oY2EtPm5yICE9IG5yX2Jsb2Nrcyk7CisKKwlETVdBUk4oIkxvYWRpbmcgZGVidWcgc3BhY2UgbWFwIGZyb20gZGlzay4gIFRoaXMgbWF5IHRha2Ugc29tZSB0aW1lIik7CisJZm9yIChpID0gMDsgaSA8IG5yX2Jsb2NrczsgaSsrKSB7CisJCXIgPSBkbV9zbV9nZXRfY291bnQoc20sIGksICZjb3VudCk7CisJCWlmIChyKSB7CisJCQlETUVSUigibG9hZCBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJY2Ffc2V0X2NvdW50KGNhLCBpLCBjb3VudCk7CisJfQorCURNV0FSTigiTG9hZCBjb21wbGV0ZSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZXh0ZW5kKHN0cnVjdCBjb3VudF9hcnJheSAqY2EsIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzID0gY2EtPm5yICsgZXh0cmFfYmxvY2tzOworCXVpbnQzMl90ICpjb3VudHMgPSBremFsbG9jKHNpemVvZigqY291bnRzKSAqIG5yX2Jsb2NrcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb3VudHMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGNvdW50cywgY2EtPmNvdW50cywgc2l6ZW9mKCpjb3VudHMpICogY2EtPm5yKTsKKwlrZnJlZShjYS0+Y291bnRzKTsKKwljYS0+bnIgPSBucl9ibG9ja3M7CisJY2EtPm5yX2ZyZWUgKz0gZXh0cmFfYmxvY2tzOworCWNhLT5jb3VudHMgPSBjb3VudHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfY29tbWl0KHN0cnVjdCBjb3VudF9hcnJheSAqb2xkLCBzdHJ1Y3QgY291bnRfYXJyYXkgKm5ldykKK3sKKwlpZiAob2xkLT5uciAhPSBuZXctPm5yKSB7CisJCUJVR19PTihvbGQtPm5yID4gbmV3LT5ucik7CisJCWNhX2V4dGVuZChvbGQsIG5ldy0+bnIgLSBvbGQtPm5yKTsKKwl9CisKKwlCVUdfT04ob2xkLT5uciAhPSBuZXctPm5yKTsKKwlvbGQtPm5yX2ZyZWUgPSBuZXctPm5yX2ZyZWU7CisJbWVtY3B5KG9sZC0+Y291bnRzLCBuZXctPmNvdW50cywgc2l6ZW9mKCpvbGQtPmNvdW50cykgKiBvbGQtPm5yKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FfZGVzdHJveShzdHJ1Y3QgY291bnRfYXJyYXkgKmNhKQoreworCWtmcmVlKGNhLT5jb3VudHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc21fY2hlY2tlciB7CisJc3RydWN0IGRtX3NwYWNlX21hcCBzbTsKKworCXN0cnVjdCBjb3VudF9hcnJheSBvbGRfY291bnRzOworCXN0cnVjdCBjb3VudF9hcnJheSBjb3VudHM7CisKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpyZWFsX3NtOworfTsKKworc3RhdGljIHZvaWQgc21fY2hlY2tlcl9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisKKwlkbV9zbV9kZXN0cm95KHNtYy0+cmVhbF9zbSk7CisJY2FfZGVzdHJveSgmc21jLT5vbGRfY291bnRzKTsKKwljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJa2ZyZWUoc21jKTsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX2dldF9ucl9ibG9ja3Moc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9nZXRfbnJfYmxvY2tzKHNtYy0+cmVhbF9zbSwgY291bnQpOworCWlmICghcikKKwkJQlVHX09OKHNtYy0+b2xkX2NvdW50cy5uciAhPSAqY291bnQpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfZ2V0X25yX2ZyZWUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9nZXRfbnJfZnJlZShzbWMtPnJlYWxfc20sIGNvdW50KTsKKwlpZiAoIXIpIHsKKwkJLyoKKwkJICogU2xvdywgYnV0IHdlIGtub3cgaXQncyBjb3JyZWN0LgorCQkgKi8KKwkJZG1fYmxvY2tfdCBiLCBuID0gMDsKKwkJZm9yIChiID0gMDsgYiA8IHNtYy0+b2xkX2NvdW50cy5ucjsgYisrKQorCQkJaWYgKHNtYy0+b2xkX2NvdW50cy5jb3VudHNbYl0gPT0gMCAmJgorCQkJICAgIHNtYy0+Y291bnRzLmNvdW50c1tiXSA9PSAwKQorCQkJCW4rKzsKKworCQlpZiAobiAhPSAqY291bnQpCisJCQlETUVSUigiZnJlZSBibG9jayBjb3VudHMgZGlmZmVyLCBjaGVja2VyICV1LCBzbS1kaXNrOiV1IiwKKwkJCSAgICAgICh1bnNpZ25lZCkgbiwgKHVuc2lnbmVkKSAqY291bnQpOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCWludCByID0gZG1fc21fbmV3X2Jsb2NrKHNtYy0+cmVhbF9zbSwgYik7CisKKwlpZiAoIXIpIHsKKwkJQlVHX09OKCpiID49IHNtYy0+b2xkX2NvdW50cy5ucik7CisJCUJVR19PTihzbWMtPm9sZF9jb3VudHMuY291bnRzWypiXSAhPSAwKTsKKwkJQlVHX09OKCpiID49IHNtYy0+Y291bnRzLm5yKTsKKwkJQlVHX09OKHNtYy0+Y291bnRzLmNvdW50c1sqYl0gIT0gMCk7CisJCWNhX3NldF9jb3VudCgmc21jLT5jb3VudHMsICpiLCAxKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9jaGVja2VyX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9pbmNfYmxvY2soc21jLT5yZWFsX3NtLCBiKTsKKwlpbnQgcjIgPSBjYV9pbmNfYmxvY2soJnNtYy0+Y291bnRzLCBiKTsKKwlCVUdfT04ociAhPSByMik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9kZWNfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYikKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCWludCByID0gZG1fc21fZGVjX2Jsb2NrKHNtYy0+cmVhbF9zbSwgYik7CisJaW50IHIyID0gY2FfZGVjX2Jsb2NrKCZzbWMtPmNvdW50cywgYik7CisJQlVHX09OKHIgIT0gcjIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfZ2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwl1aW50MzJfdCByZXN1bHQyID0gMDsKKwlpbnQgciA9IGRtX3NtX2dldF9jb3VudChzbWMtPnJlYWxfc20sIGIsIHJlc3VsdCk7CisJaW50IHIyID0gY2FfZ2V0X2NvdW50KCZzbWMtPmNvdW50cywgYiwgJnJlc3VsdDIpOworCisJQlVHX09OKHIgIT0gcjIpOworCWlmICghcikKKwkJQlVHX09OKCpyZXN1bHQgIT0gcmVzdWx0Mik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9jb3VudF9tb3JlX3RoYW5fb25lKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHJlc3VsdDIgPSAwOworCWludCByID0gZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZShzbWMtPnJlYWxfc20sIGIsIHJlc3VsdCk7CisJaW50IHIyID0gY2FfY291bnRfbW9yZV90aGFuX29uZSgmc21jLT5jb3VudHMsIGIsICZyZXN1bHQyKTsKKworCUJVR19PTihyICE9IHIyKTsKKwlpZiAoIXIpCisJCUJVR19PTighKCpyZXN1bHQpICYmIHJlc3VsdDIpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfc2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJdWludDMyX3Qgb2xkX3JjOworCWludCByID0gZG1fc21fc2V0X2NvdW50KHNtYy0+cmVhbF9zbSwgYiwgY291bnQpOworCWludCByMjsKKworCUJVR19PTihiID49IHNtYy0+Y291bnRzLm5yKTsKKwlvbGRfcmMgPSBzbWMtPmNvdW50cy5jb3VudHNbYl07CisJcjIgPSBjYV9zZXRfY291bnQoJnNtYy0+Y291bnRzLCBiLCBjb3VudCk7CisJQlVHX09OKHIgIT0gcjIpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9jb21taXQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwlpbnQgcjsKKworCXIgPSBkbV9zbV9jb21taXQoc21jLT5yZWFsX3NtKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gY2FfY29tbWl0KCZzbWMtPm9sZF9jb3VudHMsICZzbWMtPmNvdW50cyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fY2hlY2tlcl9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCXN0cnVjdCBzbV9jaGVja2VyICpzbWMgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9jaGVja2VyLCBzbSk7CisJaW50IHIgPSBkbV9zbV9leHRlbmQoc21jLT5yZWFsX3NtLCBleHRyYV9ibG9ja3MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBjYV9leHRlbmQoJnNtYy0+Y291bnRzLCBleHRyYV9ibG9ja3MpOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfcm9vdF9zaXplKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc21fY2hlY2tlciAqc21jID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fY2hlY2tlciwgc20pOworCXJldHVybiBkbV9zbV9yb290X3NpemUoc21jLT5yZWFsX3NtLCByZXN1bHQpOworfQorCitzdGF0aWMgaW50IHNtX2NoZWNrZXJfY29weV9yb290KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCB2b2lkICpjb3B5X3RvX2hlcmVfbGUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYyA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2NoZWNrZXIsIHNtKTsKKwlyZXR1cm4gZG1fc21fY29weV9yb290KHNtYy0+cmVhbF9zbSwgY29weV90b19oZXJlX2xlLCBsZW4pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGRtX3NwYWNlX21hcCBvcHNfID0geworCS5kZXN0cm95ID0gc21fY2hlY2tlcl9kZXN0cm95LAorCS5nZXRfbnJfYmxvY2tzID0gc21fY2hlY2tlcl9nZXRfbnJfYmxvY2tzLAorCS5nZXRfbnJfZnJlZSA9IHNtX2NoZWNrZXJfZ2V0X25yX2ZyZWUsCisJLmluY19ibG9jayA9IHNtX2NoZWNrZXJfaW5jX2Jsb2NrLAorCS5kZWNfYmxvY2sgPSBzbV9jaGVja2VyX2RlY19ibG9jaywKKwkubmV3X2Jsb2NrID0gc21fY2hlY2tlcl9uZXdfYmxvY2ssCisJLmdldF9jb3VudCA9IHNtX2NoZWNrZXJfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fY2hlY2tlcl9jb3VudF9tb3JlX3RoYW5fb25lLAorCS5zZXRfY291bnQgPSBzbV9jaGVja2VyX3NldF9jb3VudCwKKwkuY29tbWl0ID0gc21fY2hlY2tlcl9jb21taXQsCisJLmV4dGVuZCA9IHNtX2NoZWNrZXJfZXh0ZW5kLAorCS5yb290X3NpemUgPSBzbV9jaGVja2VyX3Jvb3Rfc2l6ZSwKKwkuY29weV9yb290ID0gc21fY2hlY2tlcl9jb3B5X3Jvb3QKK307CisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2NoZWNrZXJfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCXN0cnVjdCBzbV9jaGVja2VyICpzbWM7CisKKwlpZiAoIXNtKQorCQlyZXR1cm4gTlVMTDsKKworCXNtYyA9IGttYWxsb2Moc2l6ZW9mKCpzbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtYykKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoJnNtYy0+c20sICZvcHNfLCBzaXplb2Yoc21jLT5zbSkpOworCXIgPSBjYV9jcmVhdGUoJnNtYy0+b2xkX2NvdW50cywgc20pOworCWlmIChyKSB7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXIgPSBjYV9jcmVhdGUoJnNtYy0+Y291bnRzLCBzbSk7CisJaWYgKHIpIHsKKwkJY2FfZGVzdHJveSgmc21jLT5vbGRfY291bnRzKTsKKwkJa2ZyZWUoc21jKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21jLT5yZWFsX3NtID0gc207CisKKwlyID0gY2FfbG9hZCgmc21jLT5jb3VudHMsIHNtKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJCWNhX2Rlc3Ryb3koJnNtYy0+b2xkX2NvdW50cyk7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXIgPSBjYV9jb21taXQoJnNtYy0+b2xkX2NvdW50cywgJnNtYy0+Y291bnRzKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPmNvdW50cyk7CisJCWNhX2Rlc3Ryb3koJnNtYy0+b2xkX2NvdW50cyk7CisJCWtmcmVlKHNtYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmc21jLT5zbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2NoZWNrZXJfY3JlYXRlKTsKKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJaW50IHI7CisJc3RydWN0IHNtX2NoZWNrZXIgKnNtYzsKKworCWlmICghc20pCisJCXJldHVybiBOVUxMOworCisJc21jID0ga21hbGxvYyhzaXplb2YoKnNtYyksIEdGUF9LRVJORUwpOworCWlmICghc21jKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmc21jLT5zbSwgJm9wc18sIHNpemVvZihzbWMtPnNtKSk7CisJciA9IGNhX2NyZWF0ZSgmc21jLT5vbGRfY291bnRzLCBzbSk7CisJaWYgKHIpIHsKKwkJa2ZyZWUoc21jKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJciA9IGNhX2NyZWF0ZSgmc21jLT5jb3VudHMsIHNtKTsKKwlpZiAocikgeworCQljYV9kZXN0cm95KCZzbWMtPm9sZF9jb3VudHMpOworCQlrZnJlZShzbWMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbWMtPnJlYWxfc20gPSBzbTsKKwlyZXR1cm4gJnNtYy0+c207Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9zbV9jaGVja2VyX2NyZWF0ZV9mcmVzaCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbHNlCisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2NoZWNrZXJfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXJldHVybiBzbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2NoZWNrZXJfY3JlYXRlKTsKKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJcmV0dXJuIHNtOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2gpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jaGVja2VyLmggYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGRjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtY2hlY2tlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgU05BUFNIT1RTX1NQQUNFX01BUF9DSEVDS0VSX0gKKyNkZWZpbmUgU05BUFNIT1RTX1NQQUNFX01BUF9DSEVDS0VSX0gKKworI2luY2x1ZGUgImRtLXNwYWNlLW1hcC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBzcGFjZSBtYXAgd3JhcHMgYSByZWFsIG9uLWRpc2sgc3BhY2UgbWFwLCBhbmQgdmVyaWZpZXMgYWxsIG9mIGl0cworICogb3BlcmF0aW9ucy4gIEl0IHVzZXMgYSBsb3Qgb2YgbWVtb3J5LCBzbyBvbmx5IHVzZSBpZiB5b3UgaGF2ZSBhIHNwZWNpZmljCisgKiBwcm9ibGVtIHRoYXQgeW91J3JlIGRlYnVnZ2luZy4KKyAqCisgKiBPd25lcnNoaXAgb2YgQHNtIHBhc3Nlcy4KKyAqLworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fY2hlY2tlcl9jcmVhdGVfZnJlc2goc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjI0OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNvbW1vbi5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLWNvbW1vbi5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJzcGFjZSBtYXAgY29tbW9uIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSW5kZXggdmFsaWRhdG9yLgorICovCisjZGVmaW5lIElOREVYX0NTVU1fWE9SIDE2MDQ3OAorCitzdGF0aWMgdm9pZCBpbmRleF9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKmIsCisJCQkJICAgIHNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBkaXNrX21ldGFkYXRhX2luZGV4ICptaV9sZSA9IGRtX2Jsb2NrX2RhdGEoYik7CisKKwltaV9sZS0+YmxvY2tuciA9IGNwdV90b19sZTY0KGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwltaV9sZS0+Y3N1bSA9IGNwdV90b19sZTMyKGRtX2JtX2NoZWNrc3VtKCZtaV9sZS0+cGFkZGluZywKKwkJCQkJCSBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCQkgSU5ERVhfQ1NVTV9YT1IpKTsKK30KKworc3RhdGljIGludCBpbmRleF9jaGVjayhzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkgICAgICAgc2l6ZV90IGJsb2NrX3NpemUpCit7CisJc3RydWN0IGRpc2tfbWV0YWRhdGFfaW5kZXggKm1pX2xlID0gZG1fYmxvY2tfZGF0YShiKTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KG1pX2xlLT5ibG9ja25yKSkgeworCQlETUVSUigiaW5kZXhfY2hlY2sgZmFpbGVkIGJsb2NrbnIgJWxsdSB3YW50ZWQgJWxsdSIsCisJCSAgICAgIGxlNjRfdG9fY3B1KG1pX2xlLT5ibG9ja25yKSwgZG1fYmxvY2tfbG9jYXRpb24oYikpOworCQlyZXR1cm4gLUVOT1RCTEs7CisJfQorCisJY3N1bV9kaXNrID0gY3B1X3RvX2xlMzIoZG1fYm1fY2hlY2tzdW0oJm1pX2xlLT5wYWRkaW5nLAorCQkJCQkgICAgICAgYmxvY2tfc2l6ZSAtIHNpemVvZihfX2xlMzIpLAorCQkJCQkgICAgICAgSU5ERVhfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IG1pX2xlLT5jc3VtKSB7CisJCURNRVJSKCJpbmRleF9jaGVjayBmYWlsZWQgY3N1bSAldSB3YW50ZWQgJXUiLAorCQkgICAgICBsZTMyX3RvX2NwdShjc3VtX2Rpc2spLCBsZTMyX3RvX2NwdShtaV9sZS0+Y3N1bSkpOworCQlyZXR1cm4gLUVJTFNFUTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgaW5kZXhfdmFsaWRhdG9yID0geworCS5uYW1lID0gImluZGV4IiwKKwkucHJlcGFyZV9mb3Jfd3JpdGUgPSBpbmRleF9wcmVwYXJlX2Zvcl93cml0ZSwKKwkuY2hlY2sgPSBpbmRleF9jaGVjaworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEJpdG1hcCB2YWxpZGF0b3IKKyAqLworI2RlZmluZSBCSVRNQVBfQ1NVTV9YT1IgMjQwNzc5CisKK3N0YXRpYyB2b2lkIGJpdG1hcF9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkJCSAgICAgc3RydWN0IGRtX2Jsb2NrICpiLAorCQkJCSAgICAgc2l6ZV90IGJsb2NrX3NpemUpCit7CisJc3RydWN0IGRpc2tfYml0bWFwX2hlYWRlciAqZGlza19oZWFkZXIgPSBkbV9ibG9ja19kYXRhKGIpOworCisJZGlza19oZWFkZXItPmJsb2NrbnIgPSBjcHVfdG9fbGU2NChkbV9ibG9ja19sb2NhdGlvbihiKSk7CisJZGlza19oZWFkZXItPmNzdW0gPSBjcHVfdG9fbGUzMihkbV9ibV9jaGVja3N1bSgmZGlza19oZWFkZXItPm5vdF91c2VkLAorCQkJCQkJICAgICAgIGJsb2NrX3NpemUgLSBzaXplb2YoX19sZTMyKSwKKwkJCQkJCSAgICAgICBCSVRNQVBfQ1NVTV9YT1IpKTsKK30KKworc3RhdGljIGludCBiaXRtYXBfY2hlY2soc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJCXN0cnVjdCBkbV9ibG9jayAqYiwKKwkJCXNpemVfdCBibG9ja19zaXplKQoreworCXN0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIgKmRpc2tfaGVhZGVyID0gZG1fYmxvY2tfZGF0YShiKTsKKwlfX2xlMzIgY3N1bV9kaXNrOworCisJaWYgKGRtX2Jsb2NrX2xvY2F0aW9uKGIpICE9IGxlNjRfdG9fY3B1KGRpc2tfaGVhZGVyLT5ibG9ja25yKSkgeworCQlETUVSUigiYml0bWFwIGNoZWNrIGZhaWxlZCBibG9ja25yICVsbHUgd2FudGVkICVsbHUiLAorCQkgICAgICBsZTY0X3RvX2NwdShkaXNrX2hlYWRlci0+YmxvY2tuciksIGRtX2Jsb2NrX2xvY2F0aW9uKGIpKTsKKwkJcmV0dXJuIC1FTk9UQkxLOworCX0KKworCWNzdW1fZGlzayA9IGNwdV90b19sZTMyKGRtX2JtX2NoZWNrc3VtKCZkaXNrX2hlYWRlci0+bm90X3VzZWQsCisJCQkJCSAgICAgICBibG9ja19zaXplIC0gc2l6ZW9mKF9fbGUzMiksCisJCQkJCSAgICAgICBCSVRNQVBfQ1NVTV9YT1IpKTsKKwlpZiAoY3N1bV9kaXNrICE9IGRpc2tfaGVhZGVyLT5jc3VtKSB7CisJCURNRVJSKCJiaXRtYXAgY2hlY2sgZmFpbGVkIGNzdW0gJXUgd2FudGVkICV1IiwKKwkJICAgICAgbGUzMl90b19jcHUoY3N1bV9kaXNrKSwgbGUzMl90b19jcHUoZGlza19oZWFkZXItPmNzdW0pKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yIGRtX3NtX2JpdG1hcF92YWxpZGF0b3IgPSB7CisJLm5hbWUgPSAic21fYml0bWFwIiwKKwkucHJlcGFyZV9mb3Jfd3JpdGUgPSBiaXRtYXBfcHJlcGFyZV9mb3Jfd3JpdGUsCisJLmNoZWNrID0gYml0bWFwX2NoZWNrCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEVOVFJJRVNfUEVSX1dPUkQgMzIKKyNkZWZpbmUgRU5UUklFU19TSElGVAk1CisKK3N0YXRpYyB2b2lkICpkbV9iaXRtYXBfZGF0YShzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIGRtX2Jsb2NrX2RhdGEoYikgKyBzaXplb2Yoc3RydWN0IGRpc2tfYml0bWFwX2hlYWRlcik7Cit9CisKKyNkZWZpbmUgV09SRF9NQVNLX0hJR0ggMHhBQUFBQUFBQUFBQUFBQUFBVUxMCisKK3N0YXRpYyB1bnNpZ25lZCBiaXRtYXBfd29yZF91c2VkKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGIpCit7CisJX19sZTY0ICp3b3Jkc19sZSA9IGFkZHI7CisJX19sZTY0ICp3X2xlID0gd29yZHNfbGUgKyAoYiA+PiBFTlRSSUVTX1NISUZUKTsKKworCXVpbnQ2NF90IGJpdHMgPSBsZTY0X3RvX2NwdSgqd19sZSk7CisJdWludDY0X3QgbWFzayA9IChiaXRzICsgV09SRF9NQVNLX0hJR0ggKyAxKSAmIFdPUkRfTUFTS19ISUdIOworCisJcmV0dXJuICEofmJpdHMgJiBtYXNrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNtX2xvb2t1cF9iaXRtYXAodm9pZCAqYWRkciwgdW5zaWduZWQgYikKK3sKKwlfX2xlNjQgKndvcmRzX2xlID0gYWRkcjsKKwlfX2xlNjQgKndfbGUgPSB3b3Jkc19sZSArIChiID4+IEVOVFJJRVNfU0hJRlQpOworCXVuc2lnbmVkIGhpLCBsbzsKKworCWIgPSAoYiAmIChFTlRSSUVTX1BFUl9XT1JEIC0gMSkpIDw8IDE7CisJaGkgPSAhIXRlc3RfYml0X2xlKGIsICh2b2lkICopIHdfbGUpOworCWxvID0gISF0ZXN0X2JpdF9sZShiICsgMSwgKHZvaWQgKikgd19sZSk7CisJcmV0dXJuIChoaSA8PCAxKSB8IGxvOworfQorCitzdGF0aWMgdm9pZCBzbV9zZXRfYml0bWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGIsIHVuc2lnbmVkIHZhbCkKK3sKKwlfX2xlNjQgKndvcmRzX2xlID0gYWRkcjsKKwlfX2xlNjQgKndfbGUgPSB3b3Jkc19sZSArIChiID4+IEVOVFJJRVNfU0hJRlQpOworCisJYiA9IChiICYgKEVOVFJJRVNfUEVSX1dPUkQgLSAxKSkgPDwgMTsKKworCWlmICh2YWwgJiAyKQorCQlfX3NldF9iaXRfbGUoYiwgKHZvaWQgKikgd19sZSk7CisJZWxzZQorCQlfX2NsZWFyX2JpdF9sZShiLCAodm9pZCAqKSB3X2xlKTsKKworCWlmICh2YWwgJiAxKQorCQlfX3NldF9iaXRfbGUoYiArIDEsICh2b2lkICopIHdfbGUpOworCWVsc2UKKwkJX19jbGVhcl9iaXRfbGUoYiArIDEsICh2b2lkICopIHdfbGUpOworfQorCitzdGF0aWMgaW50IHNtX2ZpbmRfZnJlZSh2b2lkICphZGRyLCB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgZW5kLAorCQkJdW5zaWduZWQgKnJlc3VsdCkKK3sKKwl3aGlsZSAoYmVnaW4gPCBlbmQpIHsKKwkJaWYgKCEoYmVnaW4gJiAoRU5UUklFU19QRVJfV09SRCAtIDEpKSAmJgorCQkgICAgYml0bWFwX3dvcmRfdXNlZChhZGRyLCBiZWdpbikpIHsKKwkJCWJlZ2luICs9IEVOVFJJRVNfUEVSX1dPUkQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc21fbG9va3VwX2JpdG1hcChhZGRyLCBiZWdpbikpIHsKKwkJCSpyZXN1bHQgPSBiZWdpbjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYmVnaW4rKzsKKwl9CisKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzbV9sbF9pbml0KHN0cnVjdCBsbF9kaXNrICpsbCwgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKQoreworCWxsLT50bSA9IHRtOworCisJbGwtPmJpdG1hcF9pbmZvLnRtID0gdG07CisJbGwtPmJpdG1hcF9pbmZvLmxldmVscyA9IDE7CisKKwkvKgorCSAqIEJlY2F1c2UgdGhlIG5ldyBiaXRtYXAgYmxvY2tzIGFyZSBjcmVhdGVkIHZpYSBhIHNoYWRvdworCSAqIG9wZXJhdGlvbiwgdGhlIG9sZCBlbnRyeSBoYXMgYWxyZWFkeSBoYWQgaXRzIHJlZmVyZW5jZSBjb3VudAorCSAqIGRlY3JlbWVudGVkIGFuZCB3ZSBkb24ndCBuZWVkIHRoZSBidHJlZSB0byBkbyBhbnkgYm9va2tlZXBpbmcuCisJICovCisJbGwtPmJpdG1hcF9pbmZvLnZhbHVlX3R5cGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSk7CisJbGwtPmJpdG1hcF9pbmZvLnZhbHVlX3R5cGUuaW5jID0gTlVMTDsKKwlsbC0+Yml0bWFwX2luZm8udmFsdWVfdHlwZS5kZWMgPSBOVUxMOworCWxsLT5iaXRtYXBfaW5mby52YWx1ZV90eXBlLmVxdWFsID0gTlVMTDsKKworCWxsLT5yZWZfY291bnRfaW5mby50bSA9IHRtOworCWxsLT5yZWZfY291bnRfaW5mby5sZXZlbHMgPSAxOworCWxsLT5yZWZfY291bnRfaW5mby52YWx1ZV90eXBlLnNpemUgPSBzaXplb2YodWludDMyX3QpOworCWxsLT5yZWZfY291bnRfaW5mby52YWx1ZV90eXBlLmluYyA9IE5VTEw7CisJbGwtPnJlZl9jb3VudF9pbmZvLnZhbHVlX3R5cGUuZGVjID0gTlVMTDsKKwlsbC0+cmVmX2NvdW50X2luZm8udmFsdWVfdHlwZS5lcXVhbCA9IE5VTEw7CisKKwlsbC0+YmxvY2tfc2l6ZSA9IGRtX2JtX2Jsb2NrX3NpemUoZG1fdG1fZ2V0X2JtKHRtKSk7CisKKwlpZiAobGwtPmJsb2NrX3NpemUgPiAoMSA8PCAzMCkpIHsKKwkJRE1FUlIoImJsb2NrIHNpemUgdG9vIGJpZyB0byBob2xkIGJpdG1hcHMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGwtPmVudHJpZXNfcGVyX2Jsb2NrID0gKGxsLT5ibG9ja19zaXplIC0gc2l6ZW9mKHN0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIpKSAqCisJCUVOVFJJRVNfUEVSX0JZVEU7CisJbGwtPm5yX2Jsb2NrcyA9IDA7CisJbGwtPmJpdG1hcF9yb290ID0gMDsKKwlsbC0+cmVmX2NvdW50X3Jvb3QgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbV9sbF9leHRlbmQoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGV4dHJhX2Jsb2NrcykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGksIG5yX2Jsb2NrcywgbnJfaW5kZXhlczsKKwl1bnNpZ25lZCBvbGRfYmxvY2tzLCBibG9ja3M7CisKKwlucl9ibG9ja3MgPSBsbC0+bnJfYmxvY2tzICsgZXh0cmFfYmxvY2tzOworCW9sZF9ibG9ja3MgPSBkbV9zZWN0b3JfZGl2X3VwKGxsLT5ucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJYmxvY2tzID0gZG1fc2VjdG9yX2Rpdl91cChucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisKKwlucl9pbmRleGVzID0gZG1fc2VjdG9yX2Rpdl91cChucl9ibG9ja3MsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJaWYgKG5yX2luZGV4ZXMgPiBsbC0+bWF4X2VudHJpZXMobGwpKSB7CisJCURNRVJSKCJzcGFjZSBtYXAgdG9vIGxhcmdlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IG9sZF9ibG9ja3M7IGkgPCBibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisJCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGlkeDsKKworCQlyID0gZG1fdG1fbmV3X2Jsb2NrKGxsLT50bSwgJmRtX3NtX2JpdG1hcF92YWxpZGF0b3IsICZiKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJCWlkeC5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24oYikpOworCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBiKTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisKKwkJaWR4Lm5yX2ZyZWUgPSBjcHVfdG9fbGUzMihsbC0+ZW50cmllc19wZXJfYmxvY2spOworCQlpZHgubm9uZV9mcmVlX2JlZm9yZSA9IDA7CisKKwkJciA9IGxsLT5zYXZlX2llKGxsLCBpLCAmaWR4KTsKKwkJaWYgKHIgPCAwKQorCQkJcmV0dXJuIHI7CisJfQorCisJbGwtPm5yX2Jsb2NrcyA9IG5yX2Jsb2NrczsKKwlyZXR1cm4gMDsKK30KKworaW50IHNtX2xsX2xvb2t1cF9iaXRtYXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBpbmRleCA9IGI7CisJc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgaWVfZGlzazsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmJsazsKKworCWIgPSBkb19kaXYoaW5kZXgsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJciA9IGxsLT5sb2FkX2llKGxsLCBpbmRleCwgJmllX2Rpc2spOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fdG1fcmVhZF9sb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCSAgICAmZG1fc21fYml0bWFwX3ZhbGlkYXRvciwgJmJsayk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCSpyZXN1bHQgPSBzbV9sb29rdXBfYml0bWFwKGRtX2JpdG1hcF9kYXRhKGJsayksIGIpOworCisJcmV0dXJuIGRtX3RtX3VubG9jayhsbC0+dG0sIGJsayk7Cit9CisKK2ludCBzbV9sbF9sb29rdXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpCit7CisJX19sZTMyIGxlX3JjOworCWludCByID0gc21fbGxfbG9va3VwX2JpdG1hcChsbCwgYiwgcmVzdWx0KTsKKworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmICgqcmVzdWx0ICE9IDMpCisJCXJldHVybiByOworCisJciA9IGRtX2J0cmVlX2xvb2t1cCgmbGwtPnJlZl9jb3VudF9pbmZvLCBsbC0+cmVmX2NvdW50X3Jvb3QsICZiLCAmbGVfcmMpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwkqcmVzdWx0ID0gbGUzMl90b19jcHUobGVfcmMpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBzbV9sbF9maW5kX2ZyZWVfYmxvY2soc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGJlZ2luLAorCQkJICBkbV9ibG9ja190IGVuZCwgZG1fYmxvY2tfdCAqcmVzdWx0KQoreworCWludCByOworCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGllX2Rpc2s7CisJZG1fYmxvY2tfdCBpLCBpbmRleF9iZWdpbiA9IGJlZ2luOworCWRtX2Jsb2NrX3QgaW5kZXhfZW5kID0gZG1fc2VjdG9yX2Rpdl91cChlbmQsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisKKwkvKgorCSAqIEZJWE1FOiBVc2Ugc2hpZnRzCisJICovCisJYmVnaW4gPSBkb19kaXYoaW5kZXhfYmVnaW4sIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJZW5kID0gZG9fZGl2KGVuZCwgbGwtPmVudHJpZXNfcGVyX2Jsb2NrKTsKKworCWZvciAoaSA9IGluZGV4X2JlZ2luOyBpIDwgaW5kZXhfZW5kOyBpKyssIGJlZ2luID0gMCkgeworCQlzdHJ1Y3QgZG1fYmxvY2sgKmJsazsKKwkJdW5zaWduZWQgcG9zaXRpb247CisJCXVpbnQzMl90IGJpdF9lbmQ7CisKKwkJciA9IGxsLT5sb2FkX2llKGxsLCBpLCAmaWVfZGlzayk7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCWlmIChsZTMyX3RvX2NwdShpZV9kaXNrLm5yX2ZyZWUpID09IDApCisJCQljb250aW51ZTsKKworCQlyID0gZG1fdG1fcmVhZF9sb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCQkgICAgJmRtX3NtX2JpdG1hcF92YWxpZGF0b3IsICZibGspOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQliaXRfZW5kID0gKGkgPT0gaW5kZXhfZW5kIC0gMSkgPyAgZW5kIDogbGwtPmVudHJpZXNfcGVyX2Jsb2NrOworCisJCXIgPSBzbV9maW5kX2ZyZWUoZG1fYml0bWFwX2RhdGEoYmxrKSwKKwkJCQkgbWF4X3QodW5zaWduZWQsIGJlZ2luLCBsZTMyX3RvX2NwdShpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUpKSwKKwkJCQkgYml0X2VuZCwgJnBvc2l0aW9uKTsKKwkJaWYgKHIgPT0gLUVOT1NQQykgeworCQkJLyoKKwkJCSAqIFRoaXMgbWlnaHQgaGFwcGVuIGJlY2F1c2Ugd2Ugc3RhcnRlZCBzZWFyY2hpbmcKKwkJCSAqIHBhcnQgd2F5IHRocm91Z2ggdGhlIGJpdG1hcC4KKwkJCSAqLworCQkJZG1fdG1fdW5sb2NrKGxsLT50bSwgYmxrKTsKKwkJCWNvbnRpbnVlOworCisJCX0gZWxzZSBpZiAociA8IDApIHsKKwkJCWRtX3RtX3VubG9jayhsbC0+dG0sIGJsayk7CisJCQlyZXR1cm4gcjsKKwkJfQorCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBibGspOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKworCQkqcmVzdWx0ID0gaSAqIGxsLT5lbnRyaWVzX3Blcl9ibG9jayArIChkbV9ibG9ja190KSBwb3NpdGlvbjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK2ludCBzbV9sbF9pbnNlcnQoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsCisJCSB1aW50MzJfdCByZWZfY291bnQsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpCit7CisJaW50IHI7CisJdWludDMyX3QgYml0LCBvbGQ7CisJc3RydWN0IGRtX2Jsb2NrICpuYjsKKwlkbV9ibG9ja190IGluZGV4ID0gYjsKKwlzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSBpZV9kaXNrOworCXZvaWQgKmJtX2xlOworCWludCBpbmM7CisKKwliaXQgPSBkb19kaXYoaW5kZXgsIGxsLT5lbnRyaWVzX3Blcl9ibG9jayk7CisJciA9IGxsLT5sb2FkX2llKGxsLCBpbmRleCwgJmllX2Rpc2spOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGxsLT50bSwgbGU2NF90b19jcHUoaWVfZGlzay5ibG9ja25yKSwKKwkJCSAgICAgICAmZG1fc21fYml0bWFwX3ZhbGlkYXRvciwgJm5iLCAmaW5jKTsKKwlpZiAociA8IDApIHsKKwkJRE1FUlIoImRtX3RtX3NoYWRvd19ibG9jaygpIGZhaWxlZCIpOworCQlyZXR1cm4gcjsKKwl9CisJaWVfZGlzay5ibG9ja25yID0gY3B1X3RvX2xlNjQoZG1fYmxvY2tfbG9jYXRpb24obmIpKTsKKworCWJtX2xlID0gZG1fYml0bWFwX2RhdGEobmIpOworCW9sZCA9IHNtX2xvb2t1cF9iaXRtYXAoYm1fbGUsIGJpdCk7CisKKwlpZiAocmVmX2NvdW50IDw9IDIpIHsKKwkJc21fc2V0X2JpdG1hcChibV9sZSwgYml0LCByZWZfY291bnQpOworCisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBuYik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisjaWYgMAorCQkvKiBGSVhNRTogZG1fYnRyZWVfcmVtb3ZlIGRvZXNuJ3QgaGFuZGxlIHRoaXMgeWV0ICovCisJCWlmIChvbGQgPiAyKSB7CisJCQlyID0gZG1fYnRyZWVfcmVtb3ZlKCZsbC0+cmVmX2NvdW50X2luZm8sCisJCQkJCSAgICBsbC0+cmVmX2NvdW50X3Jvb3QsCisJCQkJCSAgICAmYiwgJmxsLT5yZWZfY291bnRfcm9vdCk7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJfQorI2VuZGlmCisKKwl9IGVsc2UgeworCQlfX2xlMzIgbGVfcmMgPSBjcHVfdG9fbGUzMihyZWZfY291bnQpOworCisJCXNtX3NldF9iaXRtYXAoYm1fbGUsIGJpdCwgMyk7CisJCXIgPSBkbV90bV91bmxvY2sobGwtPnRtLCBuYik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCisJCV9fZG1fYmxlc3NfZm9yX2Rpc2soJmxlX3JjKTsKKwkJciA9IGRtX2J0cmVlX2luc2VydCgmbGwtPnJlZl9jb3VudF9pbmZvLCBsbC0+cmVmX2NvdW50X3Jvb3QsCisJCQkJICAgICZiLCAmbGVfcmMsICZsbC0+cmVmX2NvdW50X3Jvb3QpOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJyZWYgY291bnQgaW5zZXJ0IGZhaWxlZCIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisKKwlpZiAocmVmX2NvdW50ICYmICFvbGQpIHsKKwkJKmV2ID0gU01fQUxMT0M7CisJCWxsLT5ucl9hbGxvY2F0ZWQrKzsKKwkJaWVfZGlzay5ucl9mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWVfZGlzay5ucl9mcmVlKSAtIDEpOworCQlpZiAobGUzMl90b19jcHUoaWVfZGlzay5ub25lX2ZyZWVfYmVmb3JlKSA9PSBiaXQpCisJCQlpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUgPSBjcHVfdG9fbGUzMihiaXQgKyAxKTsKKworCX0gZWxzZSBpZiAob2xkICYmICFyZWZfY291bnQpIHsKKwkJKmV2ID0gU01fRlJFRTsKKwkJbGwtPm5yX2FsbG9jYXRlZC0tOworCQlpZV9kaXNrLm5yX2ZyZWUgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpZV9kaXNrLm5yX2ZyZWUpICsgMSk7CisJCWllX2Rpc2subm9uZV9mcmVlX2JlZm9yZSA9IGNwdV90b19sZTMyKG1pbihsZTMyX3RvX2NwdShpZV9kaXNrLm5vbmVfZnJlZV9iZWZvcmUpLCBiaXQpKTsKKwl9CisKKwlyZXR1cm4gbGwtPnNhdmVfaWUobGwsIGluZGV4LCAmaWVfZGlzayk7Cit9CisKK2ludCBzbV9sbF9pbmMoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpCit7CisJaW50IHI7CisJdWludDMyX3QgcmM7CisKKwlyID0gc21fbGxfbG9va3VwKGxsLCBiLCAmcmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzbV9sbF9pbnNlcnQobGwsIGIsIHJjICsgMSwgZXYpOworfQorCitpbnQgc21fbGxfZGVjKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBiLCBlbnVtIGFsbG9jYXRpb25fZXZlbnQgKmV2KQoreworCWludCByOworCXVpbnQzMl90IHJjOworCisJciA9IHNtX2xsX2xvb2t1cChsbCwgYiwgJnJjKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoIXJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzbV9sbF9pbnNlcnQobGwsIGIsIHJjIC0gMSwgZXYpOworfQorCitpbnQgc21fbGxfY29tbWl0KHN0cnVjdCBsbF9kaXNrICpsbCkKK3sKKwlyZXR1cm4gbGwtPmNvbW1pdChsbCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgbWV0YWRhdGFfbGxfbG9hZF9pZShzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCW1lbWNweShpZSwgbGwtPm1pX2xlLmluZGV4ICsgaW5kZXgsIHNpemVvZigqaWUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXRhZGF0YV9sbF9zYXZlX2llKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgZGlza19pbmRleF9lbnRyeSAqaWUpCit7CisJbWVtY3B5KGxsLT5taV9sZS5pbmRleCArIGluZGV4LCBpZSwgc2l6ZW9mKCppZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ldGFkYXRhX2xsX2luaXRfaW5kZXgoc3RydWN0IGxsX2Rpc2sgKmxsKQoreworCWludCByOworCXN0cnVjdCBkbV9ibG9jayAqYjsKKworCXIgPSBkbV90bV9uZXdfYmxvY2sobGwtPnRtLCAmaW5kZXhfdmFsaWRhdG9yLCAmYik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCW1lbWNweShkbV9ibG9ja19kYXRhKGIpLCAmbGwtPm1pX2xlLCBzaXplb2YobGwtPm1pX2xlKSk7CisJbGwtPmJpdG1hcF9yb290ID0gZG1fYmxvY2tfbG9jYXRpb24oYik7CisKKwlyZXR1cm4gZG1fdG1fdW5sb2NrKGxsLT50bSwgYik7Cit9CisKK3N0YXRpYyBpbnQgbWV0YWRhdGFfbGxfb3BlbihzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJaW50IHI7CisJc3RydWN0IGRtX2Jsb2NrICpibG9jazsKKworCXIgPSBkbV90bV9yZWFkX2xvY2sobGwtPnRtLCBsbC0+Yml0bWFwX3Jvb3QsCisJCQkgICAgJmluZGV4X3ZhbGlkYXRvciwgJmJsb2NrKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwltZW1jcHkoJmxsLT5taV9sZSwgZG1fYmxvY2tfZGF0YShibG9jayksIHNpemVvZihsbC0+bWlfbGUpKTsKKwlyZXR1cm4gZG1fdG1fdW5sb2NrKGxsLT50bSwgYmxvY2spOworfQorCitzdGF0aWMgZG1fYmxvY2tfdCBtZXRhZGF0YV9sbF9tYXhfZW50cmllcyhzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJcmV0dXJuIE1BWF9NRVRBREFUQV9CSVRNQVBTOworfQorCitzdGF0aWMgaW50IG1ldGFkYXRhX2xsX2NvbW1pdChzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJaW50IHIsIGluYzsKKwlzdHJ1Y3QgZG1fYmxvY2sgKmI7CisKKwlyID0gZG1fdG1fc2hhZG93X2Jsb2NrKGxsLT50bSwgbGwtPmJpdG1hcF9yb290LCAmaW5kZXhfdmFsaWRhdG9yLCAmYiwgJmluYyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KGRtX2Jsb2NrX2RhdGEoYiksICZsbC0+bWlfbGUsIHNpemVvZihsbC0+bWlfbGUpKTsKKwlsbC0+Yml0bWFwX3Jvb3QgPSBkbV9ibG9ja19sb2NhdGlvbihiKTsKKworCXJldHVybiBkbV90bV91bmxvY2sobGwtPnRtLCBiKTsKK30KKworaW50IHNtX2xsX25ld19tZXRhZGF0YShzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSkKK3sKKwlpbnQgcjsKKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gbWV0YWRhdGFfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IG1ldGFkYXRhX2xsX3NhdmVfaWU7CisJbGwtPmluaXRfaW5kZXggPSBtZXRhZGF0YV9sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gbWV0YWRhdGFfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBtZXRhZGF0YV9sbF9tYXhfZW50cmllczsKKwlsbC0+Y29tbWl0ID0gbWV0YWRhdGFfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IDA7CisJbGwtPm5yX2FsbG9jYXRlZCA9IDA7CisKKwlyID0gbGwtPmluaXRfaW5kZXgobGwpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gZG1fYnRyZWVfZW1wdHkoJmxsLT5yZWZfY291bnRfaW5mbywgJmxsLT5yZWZfY291bnRfcm9vdCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitpbnQgc21fbGxfb3Blbl9tZXRhZGF0YShzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCXZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IGRpc2tfc21fcm9vdCAqc21yID0gcm9vdF9sZTsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCkpIHsKKwkJRE1FUlIoInNtX21ldGFkYXRhIHJvb3QgdG9vIHNtYWxsIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gbWV0YWRhdGFfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IG1ldGFkYXRhX2xsX3NhdmVfaWU7CisJbGwtPmluaXRfaW5kZXggPSBtZXRhZGF0YV9sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gbWV0YWRhdGFfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBtZXRhZGF0YV9sbF9tYXhfZW50cmllczsKKwlsbC0+Y29tbWl0ID0gbWV0YWRhdGFfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KHNtci0+bnJfYmxvY2tzKTsKKwlsbC0+bnJfYWxsb2NhdGVkID0gbGU2NF90b19jcHUoc21yLT5ucl9hbGxvY2F0ZWQpOworCWxsLT5iaXRtYXBfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+Yml0bWFwX3Jvb3QpOworCWxsLT5yZWZfY291bnRfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+cmVmX2NvdW50X3Jvb3QpOworCisJcmV0dXJuIGxsLT5vcGVuX2luZGV4KGxsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBkaXNrX2xsX2xvYWRfaWUoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGluZGV4LAorCQkJICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCXJldHVybiBkbV9idHJlZV9sb29rdXAoJmxsLT5iaXRtYXBfaW5mbywgbGwtPmJpdG1hcF9yb290LCAmaW5kZXgsIGllKTsKK30KKworc3RhdGljIGludCBkaXNrX2xsX3NhdmVfaWUoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGluZGV4LAorCQkJICAgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKQoreworCV9fZG1fYmxlc3NfZm9yX2Rpc2soaWUpOworCXJldHVybiBkbV9idHJlZV9pbnNlcnQoJmxsLT5iaXRtYXBfaW5mbywgbGwtPmJpdG1hcF9yb290LAorCQkJICAgICAgICZpbmRleCwgaWUsICZsbC0+Yml0bWFwX3Jvb3QpOworfQorCitzdGF0aWMgaW50IGRpc2tfbGxfaW5pdF9pbmRleChzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJcmV0dXJuIGRtX2J0cmVlX2VtcHR5KCZsbC0+Yml0bWFwX2luZm8sICZsbC0+Yml0bWFwX3Jvb3QpOworfQorCitzdGF0aWMgaW50IGRpc2tfbGxfb3BlbihzdHJ1Y3QgbGxfZGlzayAqbGwpCit7CisJLyogbm90aGluZyB0byBkbyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgZG1fYmxvY2tfdCBkaXNrX2xsX21heF9lbnRyaWVzKHN0cnVjdCBsbF9kaXNrICpsbCkKK3sKKwlyZXR1cm4gLTFVTEw7Cit9CisKK3N0YXRpYyBpbnQgZGlza19sbF9jb21taXQoc3RydWN0IGxsX2Rpc2sgKmxsKQoreworCXJldHVybiAwOworfQorCitpbnQgc21fbGxfbmV3X2Rpc2soc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJaW50IHI7CisKKwlyID0gc21fbGxfaW5pdChsbCwgdG0pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlsbC0+bG9hZF9pZSA9IGRpc2tfbGxfbG9hZF9pZTsKKwlsbC0+c2F2ZV9pZSA9IGRpc2tfbGxfc2F2ZV9pZTsKKwlsbC0+aW5pdF9pbmRleCA9IGRpc2tfbGxfaW5pdF9pbmRleDsKKwlsbC0+b3Blbl9pbmRleCA9IGRpc2tfbGxfb3BlbjsKKwlsbC0+bWF4X2VudHJpZXMgPSBkaXNrX2xsX21heF9lbnRyaWVzOworCWxsLT5jb21taXQgPSBkaXNrX2xsX2NvbW1pdDsKKworCWxsLT5ucl9ibG9ja3MgPSAwOworCWxsLT5ucl9hbGxvY2F0ZWQgPSAwOworCisJciA9IGxsLT5pbml0X2luZGV4KGxsKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2J0cmVlX2VtcHR5KCZsbC0+cmVmX2NvdW50X2luZm8sICZsbC0+cmVmX2NvdW50X3Jvb3QpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNtX2xsX29wZW5fZGlzayhzdHJ1Y3QgbGxfZGlzayAqbGwsIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJICAgIHZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IGRpc2tfc21fcm9vdCAqc21yID0gcm9vdF9sZTsKKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCkpIHsKKwkJRE1FUlIoInNtX21ldGFkYXRhIHJvb3QgdG9vIHNtYWxsIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXIgPSBzbV9sbF9pbml0KGxsLCB0bSk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWxsLT5sb2FkX2llID0gZGlza19sbF9sb2FkX2llOworCWxsLT5zYXZlX2llID0gZGlza19sbF9zYXZlX2llOworCWxsLT5pbml0X2luZGV4ID0gZGlza19sbF9pbml0X2luZGV4OworCWxsLT5vcGVuX2luZGV4ID0gZGlza19sbF9vcGVuOworCWxsLT5tYXhfZW50cmllcyA9IGRpc2tfbGxfbWF4X2VudHJpZXM7CisJbGwtPmNvbW1pdCA9IGRpc2tfbGxfY29tbWl0OworCisJbGwtPm5yX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KHNtci0+bnJfYmxvY2tzKTsKKwlsbC0+bnJfYWxsb2NhdGVkID0gbGU2NF90b19jcHUoc21yLT5ucl9hbGxvY2F0ZWQpOworCWxsLT5iaXRtYXBfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+Yml0bWFwX3Jvb3QpOworCWxsLT5yZWZfY291bnRfcm9vdCA9IGxlNjRfdG9fY3B1KHNtci0+cmVmX2NvdW50X3Jvb3QpOworCisJcmV0dXJuIGxsLT5vcGVuX2luZGV4KGxsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyMDgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1NQQUNFX01BUF9DT01NT05fSAorI2RlZmluZSBETV9TUEFDRV9NQVBfQ09NTU9OX0gKKworI2luY2x1ZGUgImRtLWJ0cmVlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBMb3cgbGV2ZWwgZGlzayBmb3JtYXQKKyAqCisgKiBCaXRtYXAgYnRyZWUKKyAqIC0tLS0tLS0tLS0tLQorICoKKyAqIEVhY2ggdmFsdWUgc3RvcmVkIGluIHRoZSBidHJlZSBpcyBhbiBpbmRleF9lbnRyeS4gIFRoaXMgcG9pbnRzIHRvIGEKKyAqIGJsb2NrIHRoYXQgaXMgdXNlZCBhcyBhIGJpdG1hcC4gIFdpdGhpbiB0aGUgYml0bWFwIGhvbGQgMiBiaXRzIHBlcgorICogZW50cnksIHdoaWNoIHJlcHJlc2VudCBVTlVTRUQgPSAwLCBSRUZfQ09VTlQgPSAxLCBSRUZfQ09VTlQgPSAyIGFuZAorICogUkVGX0NPVU5UID0gbWFueS4KKyAqCisgKiBSZWZjb3VudCBidHJlZQorICogLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBbnkgZW50cnkgdGhhdCBoYXMgYSByZWYgY291bnQgaGlnaGVyIHRoYW4gMiBnZXRzIGVudGVyZWQgaW4gdGhlIHJlZgorICogY291bnQgdHJlZS4gIFRoZSBsZWFmIHZhbHVlcyBmb3IgdGhpcyB0cmVlIGlzIHRoZSAzMi1iaXQgcmVmIGNvdW50LgorICovCisKK3N0cnVjdCBkaXNrX2luZGV4X2VudHJ5IHsKKwlfX2xlNjQgYmxvY2tucjsKKwlfX2xlMzIgbnJfZnJlZTsKKwlfX2xlMzIgbm9uZV9mcmVlX2JlZm9yZTsKK30gX19wYWNrZWQ7CisKKworI2RlZmluZSBNQVhfTUVUQURBVEFfQklUTUFQUyAyNTUKK3N0cnVjdCBkaXNrX21ldGFkYXRhX2luZGV4IHsKKwlfX2xlMzIgY3N1bTsKKwlfX2xlMzIgcGFkZGluZzsKKwlfX2xlNjQgYmxvY2tucjsKKworCXN0cnVjdCBkaXNrX2luZGV4X2VudHJ5IGluZGV4W01BWF9NRVRBREFUQV9CSVRNQVBTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsbF9kaXNrOworCit0eXBlZGVmIGludCAoKmxvYWRfaWVfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKnJlc3VsdCk7Cit0eXBlZGVmIGludCAoKnNhdmVfaWVfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBpbmRleCwgc3RydWN0IGRpc2tfaW5kZXhfZW50cnkgKmllKTsKK3R5cGVkZWYgaW50ICgqaW5pdF9pbmRleF9mbikoc3RydWN0IGxsX2Rpc2sgKmxsKTsKK3R5cGVkZWYgaW50ICgqb3Blbl9pbmRleF9mbikoc3RydWN0IGxsX2Rpc2sgKmxsKTsKK3R5cGVkZWYgZG1fYmxvY2tfdCAoKm1heF9pbmRleF9lbnRyaWVzX2ZuKShzdHJ1Y3QgbGxfZGlzayAqbGwpOwordHlwZWRlZiBpbnQgKCpjb21taXRfZm4pKHN0cnVjdCBsbF9kaXNrICpsbCk7CisKK3N0cnVjdCBsbF9kaXNrIHsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG07CisJc3RydWN0IGRtX2J0cmVlX2luZm8gYml0bWFwX2luZm87CisJc3RydWN0IGRtX2J0cmVlX2luZm8gcmVmX2NvdW50X2luZm87CisKKwl1aW50MzJfdCBibG9ja19zaXplOworCXVpbnQzMl90IGVudHJpZXNfcGVyX2Jsb2NrOworCWRtX2Jsb2NrX3QgbnJfYmxvY2tzOworCWRtX2Jsb2NrX3QgbnJfYWxsb2NhdGVkOworCisJLyoKKwkgKiBiaXRtYXBfcm9vdCBtYXkgYmUgYSBidHJlZSByb290IG9yIGEgc2ltcGxlIGluZGV4LgorCSAqLworCWRtX2Jsb2NrX3QgYml0bWFwX3Jvb3Q7CisKKwlkbV9ibG9ja190IHJlZl9jb3VudF9yb290OworCisJc3RydWN0IGRpc2tfbWV0YWRhdGFfaW5kZXggbWlfbGU7CisJbG9hZF9pZV9mbiBsb2FkX2llOworCXNhdmVfaWVfZm4gc2F2ZV9pZTsKKwlpbml0X2luZGV4X2ZuIGluaXRfaW5kZXg7CisJb3Blbl9pbmRleF9mbiBvcGVuX2luZGV4OworCW1heF9pbmRleF9lbnRyaWVzX2ZuIG1heF9lbnRyaWVzOworCWNvbW1pdF9mbiBjb21taXQ7Cit9OworCitzdHJ1Y3QgZGlza19zbV9yb290IHsKKwlfX2xlNjQgbnJfYmxvY2tzOworCV9fbGU2NCBucl9hbGxvY2F0ZWQ7CisJX19sZTY0IGJpdG1hcF9yb290OworCV9fbGU2NCByZWZfY291bnRfcm9vdDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRU5UUklFU19QRVJfQllURSA0CisKK3N0cnVjdCBkaXNrX2JpdG1hcF9oZWFkZXIgeworCV9fbGUzMiBjc3VtOworCV9fbGUzMiBub3RfdXNlZDsKKwlfX2xlNjQgYmxvY2tucjsKK30gX19wYWNrZWQ7CisKK2VudW0gYWxsb2NhdGlvbl9ldmVudCB7CisJU01fTk9ORSwKKwlTTV9BTExPQywKKwlTTV9GUkVFLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IHNtX2xsX2V4dGVuZChzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKTsKK2ludCBzbV9sbF9sb29rdXBfYml0bWFwKHN0cnVjdCBsbF9kaXNrICpsbCwgZG1fYmxvY2tfdCBiLCB1aW50MzJfdCAqcmVzdWx0KTsKK2ludCBzbV9sbF9sb29rdXAoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIHVpbnQzMl90ICpyZXN1bHQpOworaW50IHNtX2xsX2ZpbmRfZnJlZV9ibG9jayhzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYmVnaW4sCisJCQkgIGRtX2Jsb2NrX3QgZW5kLCBkbV9ibG9ja190ICpyZXN1bHQpOworaW50IHNtX2xsX2luc2VydChzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYiwgdWludDMyX3QgcmVmX2NvdW50LCBlbnVtIGFsbG9jYXRpb25fZXZlbnQgKmV2KTsKK2ludCBzbV9sbF9pbmMoc3RydWN0IGxsX2Rpc2sgKmxsLCBkbV9ibG9ja190IGIsIGVudW0gYWxsb2NhdGlvbl9ldmVudCAqZXYpOworaW50IHNtX2xsX2RlYyhzdHJ1Y3QgbGxfZGlzayAqbGwsIGRtX2Jsb2NrX3QgYiwgZW51bSBhbGxvY2F0aW9uX2V2ZW50ICpldik7CitpbnQgc21fbGxfY29tbWl0KHN0cnVjdCBsbF9kaXNrICpsbCk7CisKK2ludCBzbV9sbF9uZXdfbWV0YWRhdGEoc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworaW50IHNtX2xsX29wZW5fbWV0YWRhdGEoc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKTsKKworaW50IHNtX2xsX25ld19kaXNrKHN0cnVjdCBsbF9kaXNrICpsbCwgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKTsKK2ludCBzbV9sbF9vcGVuX2Rpc2soc3RydWN0IGxsX2Rpc2sgKmxsLCBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCSAgICB2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmCS8qIERNX1NQQUNFX01BUF9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suYyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NjliYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1kaXNrLmMKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtY2hlY2tlci5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1jb21tb24uaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtZGlzay5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC5oIgorI2luY2x1ZGUgImRtLXRyYW5zYWN0aW9uLW1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCisjZGVmaW5lIERNX01TR19QUkVGSVggInNwYWNlIG1hcCBkaXNrIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU3BhY2UgbWFwIGludGVyZmFjZS4KKyAqLworc3RydWN0IHNtX2Rpc2sgeworCXN0cnVjdCBkbV9zcGFjZV9tYXAgc207CisKKwlzdHJ1Y3QgbGxfZGlzayBsbDsKKwlzdHJ1Y3QgbGxfZGlzayBvbGRfbGw7CisKKwlkbV9ibG9ja190IGJlZ2luOworCWRtX2Jsb2NrX3QgbnJfYWxsb2NhdGVkX3RoaXNfdHJhbnNhY3Rpb247Cit9OworCitzdGF0aWMgdm9pZCBzbV9kaXNrX2Rlc3Ryb3koc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKworCWtmcmVlKHNtZCk7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyZXR1cm4gc21fbGxfZXh0ZW5kKCZzbWQtPmxsLCBleHRyYV9ibG9ja3MpOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwkqY291bnQgPSBzbWQtPm9sZF9sbC5ucl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2dldF9ucl9mcmVlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190ICpjb3VudCkKK3sKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCSpjb3VudCA9IChzbWQtPm9sZF9sbC5ucl9ibG9ja3MgLSBzbWQtPm9sZF9sbC5ucl9hbGxvY2F0ZWQpIC0gc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfZ2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsCisJCQkgICAgIHVpbnQzMl90ICpyZXN1bHQpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwlyZXR1cm4gc21fbGxfbG9va3VwKCZzbWQtPmxsLCBiLCByZXN1bHQpOworfQorCitzdGF0aWMgaW50IHNtX2Rpc2tfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCQkgIGludCAqcmVzdWx0KQoreworCWludCByOworCXVpbnQzMl90IGNvdW50OworCisJciA9IHNtX2Rpc2tfZ2V0X2NvdW50KHNtLCBiLCAmY291bnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBjb3VudCA+IDE7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCSAgICAgdWludDMyX3QgY291bnQpCit7CisJaW50IHI7CisJdWludDMyX3Qgb2xkX2NvdW50OworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCisJciA9IHNtX2xsX2luc2VydCgmc21kLT5sbCwgYiwgY291bnQsICZldik7CisJaWYgKCFyKSB7CisJCXN3aXRjaCAoZXYpIHsKKwkJY2FzZSBTTV9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBTTV9BTExPQzoKKwkJCS8qCisJCQkgKiBUaGlzIF9tdXN0XyBiZSBmcmVlIGluIHRoZSBwcmlvciB0cmFuc2FjdGlvbgorCQkJICogb3RoZXJ3aXNlIHdlJ3ZlIGxvc3QgYXRvbWljaXR5LgorCQkJICovCisJCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisJCQlicmVhazsKKworCQljYXNlIFNNX0ZSRUU6CisJCQkvKgorCQkJICogSXQncyBvbmx5IGZyZWUgaWYgaXQncyBhbHNvIGZyZWUgaW4gdGhlIGxhc3QKKwkJCSAqIHRyYW5zYWN0aW9uLgorCQkJICovCisJCQlyID0gc21fbGxfbG9va3VwKCZzbWQtPm9sZF9sbCwgYiwgJm9sZF9jb3VudCk7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKworCQkJaWYgKCFvbGRfY291bnQpCisJCQkJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbi0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCWludCByOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fZGlzayAqc21kID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fZGlzaywgc20pOworCisJciA9IHNtX2xsX2luYygmc21kLT5sbCwgYiwgJmV2KTsKKwlpZiAoIXIgJiYgKGV2ID09IFNNX0FMTE9DKSkKKwkJLyoKKwkJICogVGhpcyBfbXVzdF8gYmUgZnJlZSBpbiB0aGUgcHJpb3IgdHJhbnNhY3Rpb24KKwkJICogb3RoZXJ3aXNlIHdlJ3ZlIGxvc3QgYXRvbWljaXR5LgorCQkgKi8KKwkJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbisrOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19kZWNfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYikKK3sKKwlpbnQgcjsKKwl1aW50MzJfdCBvbGRfY291bnQ7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyID0gc21fbGxfZGVjKCZzbWQtPmxsLCBiLCAmZXYpOworCWlmICghciAmJiAoZXYgPT0gU01fRlJFRSkpIHsKKwkJLyoKKwkJICogSXQncyBvbmx5IGZyZWUgaWYgaXQncyBhbHNvIGZyZWUgaW4gdGhlIGxhc3QKKwkJICogdHJhbnNhY3Rpb24uCisJCSAqLworCQlyID0gc21fbGxfbG9va3VwKCZzbWQtPm9sZF9sbCwgYiwgJm9sZF9jb3VudCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKCFvbGRfY291bnQpCisJCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uLS07CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19uZXdfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpCit7CisJaW50IHI7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIGxvb3Agcm91bmQgYSBjb3VwbGUgb2YgdGltZXMgKi8KKwlyID0gc21fbGxfZmluZF9mcmVlX2Jsb2NrKCZzbWQtPm9sZF9sbCwgc21kLT5iZWdpbiwgc21kLT5vbGRfbGwubnJfYmxvY2tzLCBiKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbWQtPmJlZ2luID0gKmIgKyAxOworCXIgPSBzbV9sbF9pbmMoJnNtZC0+bGwsICpiLCAmZXYpOworCWlmICghcikgeworCQlCVUdfT04oZXYgIT0gU01fQUxMT0MpOworCQlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19jb21taXQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJaW50IHI7CisJZG1fYmxvY2tfdCBucl9mcmVlOworCXN0cnVjdCBzbV9kaXNrICpzbWQgPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9kaXNrLCBzbSk7CisKKwlyID0gc21fZGlza19nZXRfbnJfZnJlZShzbSwgJm5yX2ZyZWUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBzbV9sbF9jb21taXQoJnNtZC0+bGwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweSgmc21kLT5vbGRfbGwsICZzbWQtPmxsLCBzaXplb2Yoc21kLT5vbGRfbGwpKTsKKwlzbWQtPmJlZ2luID0gMDsKKwlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKworCXIgPSBzbV9kaXNrX2dldF9ucl9mcmVlKHNtLCAmbnJfZnJlZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fZGlza19yb290X3NpemUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHNpemVfdCAqcmVzdWx0KQoreworCSpyZXN1bHQgPSBzaXplb2Yoc3RydWN0IGRpc2tfc21fcm9vdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9kaXNrX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmVfbGUsIHNpemVfdCBtYXgpCit7CisJc3RydWN0IHNtX2Rpc2sgKnNtZCA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX2Rpc2ssIHNtKTsKKwlzdHJ1Y3QgZGlza19zbV9yb290IHJvb3RfbGU7CisKKwlyb290X2xlLm5yX2Jsb2NrcyA9IGNwdV90b19sZTY0KHNtZC0+bGwubnJfYmxvY2tzKTsKKwlyb290X2xlLm5yX2FsbG9jYXRlZCA9IGNwdV90b19sZTY0KHNtZC0+bGwubnJfYWxsb2NhdGVkKTsKKwlyb290X2xlLmJpdG1hcF9yb290ID0gY3B1X3RvX2xlNjQoc21kLT5sbC5iaXRtYXBfcm9vdCk7CisJcm9vdF9sZS5yZWZfY291bnRfcm9vdCA9IGNwdV90b19sZTY0KHNtZC0+bGwucmVmX2NvdW50X3Jvb3QpOworCisJaWYgKG1heCA8IHNpemVvZihyb290X2xlKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwltZW1jcHkod2hlcmVfbGUsICZyb290X2xlLCBzaXplb2Yocm9vdF9sZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZG1fc3BhY2VfbWFwIG9wcyA9IHsKKwkuZGVzdHJveSA9IHNtX2Rpc2tfZGVzdHJveSwKKwkuZXh0ZW5kID0gc21fZGlza19leHRlbmQsCisJLmdldF9ucl9ibG9ja3MgPSBzbV9kaXNrX2dldF9ucl9ibG9ja3MsCisJLmdldF9ucl9mcmVlID0gc21fZGlza19nZXRfbnJfZnJlZSwKKwkuZ2V0X2NvdW50ID0gc21fZGlza19nZXRfY291bnQsCisJLmNvdW50X2lzX21vcmVfdGhhbl9vbmUgPSBzbV9kaXNrX2NvdW50X2lzX21vcmVfdGhhbl9vbmUsCisJLnNldF9jb3VudCA9IHNtX2Rpc2tfc2V0X2NvdW50LAorCS5pbmNfYmxvY2sgPSBzbV9kaXNrX2luY19ibG9jaywKKwkuZGVjX2Jsb2NrID0gc21fZGlza19kZWNfYmxvY2ssCisJLm5ld19ibG9jayA9IHNtX2Rpc2tfbmV3X2Jsb2NrLAorCS5jb21taXQgPSBzbV9kaXNrX2NvbW1pdCwKKwkucm9vdF9zaXplID0gc21fZGlza19yb290X3NpemUsCisJLmNvcHlfcm9vdCA9IHNtX2Rpc2tfY29weV9yb290Cit9OworCitzdGF0aWMgc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fZGlza19jcmVhdGVfcmVhbCgKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJZG1fYmxvY2tfdCBucl9ibG9ja3MpCit7CisJaW50IHI7CisJc3RydWN0IHNtX2Rpc2sgKnNtZDsKKworCXNtZCA9IGttYWxsb2Moc2l6ZW9mKCpzbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzbWQtPmJlZ2luID0gMDsKKwlzbWQtPm5yX2FsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKwltZW1jcHkoJnNtZC0+c20sICZvcHMsIHNpemVvZihzbWQtPnNtKSk7CisKKwlyID0gc21fbGxfbmV3X2Rpc2soJnNtZC0+bGwsIHRtKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlyID0gc21fbGxfZXh0ZW5kKCZzbWQtPmxsLCBucl9ibG9ja3MpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCXIgPSBzbV9kaXNrX2NvbW1pdCgmc21kLT5zbSk7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJcmV0dXJuICZzbWQtPnNtOworCitiYWQ6CisJa2ZyZWUoc21kKTsKKwlyZXR1cm4gRVJSX1BUUihyKTsKK30KKworc3RydWN0IGRtX3NwYWNlX21hcCAqZG1fc21fZGlza19jcmVhdGUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgICBkbV9ibG9ja190IG5yX2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSA9IGRtX3NtX2Rpc2tfY3JlYXRlX3JlYWwodG0sIG5yX2Jsb2Nrcyk7CisJcmV0dXJuIGRtX3NtX2NoZWNrZXJfY3JlYXRlX2ZyZXNoKHNtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2Rpc2tfY3JlYXRlKTsKKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2Rpc2tfb3Blbl9yZWFsKAorCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKQoreworCWludCByOworCXN0cnVjdCBzbV9kaXNrICpzbWQ7CisKKwlzbWQgPSBrbWFsbG9jKHNpemVvZigqc21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc21kLT5iZWdpbiA9IDA7CisJc21kLT5ucl9hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJbWVtY3B5KCZzbWQtPnNtLCAmb3BzLCBzaXplb2Yoc21kLT5zbSkpOworCisJciA9IHNtX2xsX29wZW5fZGlzaygmc21kLT5sbCwgdG0sIHJvb3RfbGUsIGxlbik7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJciA9IHNtX2Rpc2tfY29tbWl0KCZzbWQtPnNtKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlyZXR1cm4gJnNtZC0+c207CisKK2JhZDoKKwlrZnJlZShzbWQpOworCXJldHVybiBFUlJfUFRSKHIpOworfQorCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9kaXNrX29wZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgdm9pZCAqcm9vdF9sZSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gZG1fc21fY2hlY2tlcl9jcmVhdGUoCisJCWRtX3NtX2Rpc2tfb3Blbl9yZWFsKHRtLCByb290X2xlLCBsZW4pKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3NtX2Rpc2tfb3Blbik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtZGlzay5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdhMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLWRpc2suaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9TUEFDRV9NQVBfRElTS19ICisjZGVmaW5lIF9MSU5VWF9ETV9TUEFDRV9NQVBfRElTS19ICisKKyNpbmNsdWRlICJkbS1ibG9jay1tYW5hZ2VyLmgiCisKK3N0cnVjdCBkbV9zcGFjZV9tYXA7CitzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlcjsKKworLyoKKyAqIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byB1c2UgdHdvLXBoYXNlIGNvbnN0cnVjdGlvbiBkdWUgdG8gdGhlIGN5Y2xlCisgKiBiZXR3ZWVuIHRoZSB0bSBhbmQgc20uCisgKi8KK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX2Rpc2tfY3JlYXRlKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCQkgICAgICAgZG1fYmxvY2tfdCBucl9ibG9ja3MpOworCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9kaXNrX29wZW4oc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkJCSAgICAgdm9pZCAqcm9vdCwgc2l6ZV90IGxlbik7CisKKyNlbmRpZiAvKiBfTElOVVhfRE1fU1BBQ0VfTUFQX0RJU0tfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmMgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODlhZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAuaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtY29tbW9uLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLW1ldGFkYXRhLmgiCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJzcGFjZSBtYXAgbWV0YWRhdGEiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTcGFjZSBtYXAgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBsb3cgbGV2ZWwgZGlzayBmb3JtYXQgaXMgd3JpdHRlbiB1c2luZyB0aGUgc3RhbmRhcmQgYnRyZWUgYW5kCisgKiB0cmFuc2FjdGlvbiBtYW5hZ2VyLiAgVGhpcyBtZWFucyB0aGF0IHBlcmZvcm1pbmcgZGlzayBvcGVyYXRpb25zIG1heQorICogY2F1c2UgdXMgdG8gcmVjdXJzZSBpbnRvIHRoZSBzcGFjZSBtYXAgaW4gb3JkZXIgdG8gYWxsb2NhdGUgbmV3IGJsb2Nrcy4KKyAqIEZvciB0aGlzIHJlYXNvbiB3ZSBoYXZlIGEgcG9vbCBvZiBwcmUtYWxsb2NhdGVkIGJsb2NrcyBsYXJnZSBlbm91Z2ggdG8KKyAqIHNlcnZpY2UgYW55IG1ldGFkYXRhX2xsX2Rpc2sgb3BlcmF0aW9uLgorICovCisKKy8qCisgKiBGSVhNRTogd2Ugc2hvdWxkIGNhbGN1bGF0ZSB0aGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBkZXZpY2UuCisgKiBPbmx5IHRoZSBtZXRhZGF0YSBzcGFjZSBtYXAgbmVlZHMgdGhpcyBmdW5jdGlvbmFsaXR5LgorICovCisjZGVmaW5lIE1BWF9SRUNVUlNJVkVfQUxMT0NBVElPTlMgMTAyNAorCitlbnVtIGJsb2NrX29wX3R5cGUgeworCUJPUF9JTkMsCisJQk9QX0RFQworfTsKKworc3RydWN0IGJsb2NrX29wIHsKKwllbnVtIGJsb2NrX29wX3R5cGUgdHlwZTsKKwlkbV9ibG9ja190IGJsb2NrOworfTsKKworc3RydWN0IHNtX21ldGFkYXRhIHsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwIHNtOworCisJc3RydWN0IGxsX2Rpc2sgbGw7CisJc3RydWN0IGxsX2Rpc2sgb2xkX2xsOworCisJZG1fYmxvY2tfdCBiZWdpbjsKKworCXVuc2lnbmVkIHJlY3Vyc2lvbl9jb3VudDsKKwl1bnNpZ25lZCBhbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbjsKKwl1bnNpZ25lZCBucl91bmNvbW1pdHRlZDsKKwlzdHJ1Y3QgYmxvY2tfb3AgdW5jb21taXR0ZWRbTUFYX1JFQ1VSU0lWRV9BTExPQ0FUSU9OU107Cit9OworCitzdGF0aWMgaW50IGFkZF9ib3Aoc3RydWN0IHNtX21ldGFkYXRhICpzbW0sIGVudW0gYmxvY2tfb3BfdHlwZSB0eXBlLCBkbV9ibG9ja190IGIpCit7CisJc3RydWN0IGJsb2NrX29wICpvcDsKKworCWlmIChzbW0tPm5yX3VuY29tbWl0dGVkID09IE1BWF9SRUNVUlNJVkVfQUxMT0NBVElPTlMpIHsKKwkJRE1FUlIoInRvbyBtYW55IHJlY3Vyc2l2ZSBhbGxvY2F0aW9ucyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvcCA9IHNtbS0+dW5jb21taXR0ZWQgKyBzbW0tPm5yX3VuY29tbWl0dGVkKys7CisJb3AtPnR5cGUgPSB0eXBlOworCW9wLT5ibG9jayA9IGI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21taXRfYm9wKHN0cnVjdCBzbV9tZXRhZGF0YSAqc21tLCBzdHJ1Y3QgYmxvY2tfb3AgKm9wKQoreworCWludCByID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisKKwlzd2l0Y2ggKG9wLT50eXBlKSB7CisJY2FzZSBCT1BfSU5DOgorCQlyID0gc21fbGxfaW5jKCZzbW0tPmxsLCBvcC0+YmxvY2ssICZldik7CisJCWJyZWFrOworCisJY2FzZSBCT1BfREVDOgorCQlyID0gc21fbGxfZGVjKCZzbW0tPmxsLCBvcC0+YmxvY2ssICZldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBpbihzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCsrOworfQorCitzdGF0aWMgaW50IG91dChzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlpbnQgciA9IDA7CisKKwkvKgorCSAqIElmIHdlJ3JlIG5vdCByZWN1cnNpbmcgdGhlbiB2ZXJ5IGJhZCB0aGluZ3MgYXJlIGhhcHBlbmluZy4KKwkgKi8KKwlpZiAoIXNtbS0+cmVjdXJzaW9uX2NvdW50KSB7CisJCURNRVJSKCJsb3N0IHRyYWNrIG9mIHJlY3Vyc2lvbiBkZXB0aCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoc21tLT5yZWN1cnNpb25fY291bnQgPT0gMSAmJiBzbW0tPm5yX3VuY29tbWl0dGVkKSB7CisJCXdoaWxlIChzbW0tPm5yX3VuY29tbWl0dGVkICYmICFyKSB7CisJCQlzbW0tPm5yX3VuY29tbWl0dGVkLS07CisJCQlyID0gY29tbWl0X2JvcChzbW0sIHNtbS0+dW5jb21taXR0ZWQgKworCQkJCSAgICAgICBzbW0tPm5yX3VuY29tbWl0dGVkKTsKKwkJCWlmIChyKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJc21tLT5yZWN1cnNpb25fY291bnQtLTsKKworCXJldHVybiByOworfQorCisvKgorICogV2hlbiB1c2luZyB0aGUgb3V0KCkgZnVuY3Rpb24gYWJvdmUsIHdlIG9mdGVuIHdhbnQgdG8gY29tYmluZSBhbiBlcnJvcgorICogY29kZSBmb3IgdGhlIG9wZXJhdGlvbiBydW4gaW4gdGhlIHJlY3Vyc2l2ZSBjb250ZXh0IHdpdGggdGhhdCBmcm9tCisgKiBvdXQoKS4KKyAqLworc3RhdGljIGludCBjb21iaW5lX2Vycm9ycyhpbnQgcjEsIGludCByMikKK3sKKwlyZXR1cm4gcjEgPyByMSA6IHIyOworfQorCitzdGF0aWMgaW50IHJlY3Vyc2luZyhzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSkKK3sKKwlyZXR1cm4gc21tLT5yZWN1cnNpb25fY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHNtX21ldGFkYXRhX2Rlc3Ryb3koc3RydWN0IGRtX3NwYWNlX21hcCAqc20pCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJa2ZyZWUoc21tKTsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCURNRVJSKCJkb2Vzbid0IHN1cHBvcnQgZXh0ZW5kIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5sbC5ucl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9nZXRfbnJfZnJlZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5vbGRfbGwubnJfYmxvY2tzIC0gc21tLT5vbGRfbGwubnJfYWxsb2NhdGVkIC0KKwkJIHNtbS0+YWxsb2NhdGVkX3RoaXNfdHJhbnNhY3Rpb247CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9nZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlpbnQgciwgaTsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisJdW5zaWduZWQgYWRqdXN0bWVudCA9IDA7CisKKwkvKgorCSAqIFdlIG1heSBoYXZlIHNvbWUgdW5jb21taXR0ZWQgYWRqdXN0bWVudHMgdG8gYWRkLiAgVGhpcyBsaXN0CisJICogc2hvdWxkIGFsd2F5cyBiZSByZWFsbHkgc2hvcnQuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNtbS0+bnJfdW5jb21taXR0ZWQ7IGkrKykgeworCQlzdHJ1Y3QgYmxvY2tfb3AgKm9wID0gc21tLT51bmNvbW1pdHRlZCArIGk7CisKKwkJaWYgKG9wLT5ibG9jayAhPSBiKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChvcC0+dHlwZSkgeworCQljYXNlIEJPUF9JTkM6CisJCQlhZGp1c3RtZW50Kys7CisJCQlicmVhazsKKworCQljYXNlIEJPUF9ERUM6CisJCQlhZGp1c3RtZW50LS07CisJCQlicmVhazsKKwkJfQorCX0KKworCXIgPSBzbV9sbF9sb29rdXAoJnNtbS0+bGwsIGIsIHJlc3VsdCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJKnJlc3VsdCArPSBhZGp1c3RtZW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgZG1fYmxvY2tfdCBiLCBpbnQgKnJlc3VsdCkKK3sKKwlpbnQgciwgaSwgYWRqdXN0bWVudCA9IDA7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCXVpbnQzMl90IHJjOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBzb21lIHVuY29tbWl0dGVkIGFkanVzdG1lbnRzIHRvIGFkZC4gIFRoaXMgbGlzdAorCSAqIHNob3VsZCBhbHdheXMgYmUgcmVhbGx5IHNob3J0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzbW0tPm5yX3VuY29tbWl0dGVkOyBpKyspIHsKKwkJc3RydWN0IGJsb2NrX29wICpvcCA9IHNtbS0+dW5jb21taXR0ZWQgKyBpOworCisJCWlmIChvcC0+YmxvY2sgIT0gYikKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAob3AtPnR5cGUpIHsKKwkJY2FzZSBCT1BfSU5DOgorCQkJYWRqdXN0bWVudCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCT1BfREVDOgorCQkJYWRqdXN0bWVudC0tOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYWRqdXN0bWVudCA+IDEpIHsKKwkJKnJlc3VsdCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXIgPSBzbV9sbF9sb29rdXBfYml0bWFwKCZzbW0tPmxsLCBiLCAmcmMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChyYyA9PSAzKQorCQkvKgorCQkgKiBXZSBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbiwgYW5kIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKwkJICovCisJCSpyZXN1bHQgPSAxOworCWVsc2UKKwkJKnJlc3VsdCA9IHJjICsgYWRqdXN0bWVudCA+IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9tZXRhZGF0YV9zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgdWludDMyX3QgY291bnQpCit7CisJaW50IHIsIHIyOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlpZiAoc21tLT5yZWN1cnNpb25fY291bnQpIHsKKwkJRE1FUlIoImNhbm5vdCByZWN1cnNlIHNldF9jb3VudCgpIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluKHNtbSk7CisJciA9IHNtX2xsX2luc2VydCgmc21tLT5sbCwgYiwgY291bnQsICZldik7CisJcjIgPSBvdXQoc21tKTsKKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfaW5jX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJaW50IHIsIHIyID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9JTkMsIGIpOworCWVsc2UgeworCQlpbihzbW0pOworCQlyID0gc21fbGxfaW5jKCZzbW0tPmxsLCBiLCAmZXYpOworCQlyMiA9IG91dChzbW0pOworCX0KKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfZGVjX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJaW50IHIsIHIyID0gMDsKKwllbnVtIGFsbG9jYXRpb25fZXZlbnQgZXY7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9ERUMsIGIpOworCWVsc2UgeworCQlpbihzbW0pOworCQlyID0gc21fbGxfZGVjKCZzbW0tPmxsLCBiLCAmZXYpOworCQlyMiA9IG91dChzbW0pOworCX0KKworCXJldHVybiBjb21iaW5lX2Vycm9ycyhyLCByMik7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfbmV3X2Jsb2NrXyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlpbnQgciwgcjIgPSAwOworCWVudW0gYWxsb2NhdGlvbl9ldmVudCBldjsKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlyID0gc21fbGxfZmluZF9mcmVlX2Jsb2NrKCZzbW0tPm9sZF9sbCwgc21tLT5iZWdpbiwgc21tLT5vbGRfbGwubnJfYmxvY2tzLCBiKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbW0tPmJlZ2luID0gKmIgKyAxOworCisJaWYgKHJlY3Vyc2luZyhzbW0pKQorCQlyID0gYWRkX2JvcChzbW0sIEJPUF9JTkMsICpiKTsKKwllbHNlIHsKKwkJaW4oc21tKTsKKwkJciA9IHNtX2xsX2luYygmc21tLT5sbCwgKmIsICZldik7CisJCXIyID0gb3V0KHNtbSk7CisJfQorCisJaWYgKCFyKQorCQlzbW0tPmFsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uKys7CisKKwlyZXR1cm4gY29tYmluZV9lcnJvcnMociwgcjIpOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlpbnQgciA9IHNtX21ldGFkYXRhX25ld19ibG9ja18oc20sIGIpOworCWlmIChyKQorCQlETUVSUigib3V0IG9mIG1ldGFkYXRhIHNwYWNlIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc21fbWV0YWRhdGFfY29tbWl0KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCByOworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXIgPSBzbV9sbF9jb21taXQoJnNtbS0+bGwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweSgmc21tLT5vbGRfbGwsICZzbW0tPmxsLCBzaXplb2Yoc21tLT5vbGRfbGwpKTsKKwlzbW0tPmJlZ2luID0gMDsKKwlzbW0tPmFsbG9jYXRlZF90aGlzX3RyYW5zYWN0aW9uID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX3Jvb3Rfc2l6ZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgc2l6ZV90ICpyZXN1bHQpCit7CisJKnJlc3VsdCA9IHNpemVvZihzdHJ1Y3QgZGlza19zbV9yb290KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtX21ldGFkYXRhX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmVfbGUsIHNpemVfdCBtYXgpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCXN0cnVjdCBkaXNrX3NtX3Jvb3Qgcm9vdF9sZTsKKworCXJvb3RfbGUubnJfYmxvY2tzID0gY3B1X3RvX2xlNjQoc21tLT5sbC5ucl9ibG9ja3MpOworCXJvb3RfbGUubnJfYWxsb2NhdGVkID0gY3B1X3RvX2xlNjQoc21tLT5sbC5ucl9hbGxvY2F0ZWQpOworCXJvb3RfbGUuYml0bWFwX3Jvb3QgPSBjcHVfdG9fbGU2NChzbW0tPmxsLmJpdG1hcF9yb290KTsKKwlyb290X2xlLnJlZl9jb3VudF9yb290ID0gY3B1X3RvX2xlNjQoc21tLT5sbC5yZWZfY291bnRfcm9vdCk7CisKKwlpZiAobWF4IDwgc2l6ZW9mKHJvb3RfbGUpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCW1lbWNweSh3aGVyZV9sZSwgJnJvb3RfbGUsIHNpemVvZihyb290X2xlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgb3BzID0geworCS5kZXN0cm95ID0gc21fbWV0YWRhdGFfZGVzdHJveSwKKwkuZXh0ZW5kID0gc21fbWV0YWRhdGFfZXh0ZW5kLAorCS5nZXRfbnJfYmxvY2tzID0gc21fbWV0YWRhdGFfZ2V0X25yX2Jsb2NrcywKKwkuZ2V0X25yX2ZyZWUgPSBzbV9tZXRhZGF0YV9nZXRfbnJfZnJlZSwKKwkuZ2V0X2NvdW50ID0gc21fbWV0YWRhdGFfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fbWV0YWRhdGFfY291bnRfaXNfbW9yZV90aGFuX29uZSwKKwkuc2V0X2NvdW50ID0gc21fbWV0YWRhdGFfc2V0X2NvdW50LAorCS5pbmNfYmxvY2sgPSBzbV9tZXRhZGF0YV9pbmNfYmxvY2ssCisJLmRlY19ibG9jayA9IHNtX21ldGFkYXRhX2RlY19ibG9jaywKKwkubmV3X2Jsb2NrID0gc21fbWV0YWRhdGFfbmV3X2Jsb2NrLAorCS5jb21taXQgPSBzbV9tZXRhZGF0YV9jb21taXQsCisJLnJvb3Rfc2l6ZSA9IHNtX21ldGFkYXRhX3Jvb3Rfc2l6ZSwKKwkuY29weV9yb290ID0gc21fbWV0YWRhdGFfY29weV9yb290Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogV2hlbiBhIG5ldyBzcGFjZSBtYXAgaXMgY3JlYXRlZCB0aGF0IG1hbmFnZXMgaXRzIG93biBzcGFjZS4gIFdlIHVzZQorICogdGhpcyB0aW55IGJvb3RzdHJhcCBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHNtX2Jvb3RzdHJhcF9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworfQorCitzdGF0aWMgaW50IHNtX2Jvb3RzdHJhcF9leHRlbmQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgZXh0cmFfYmxvY2tzKQoreworCURNRVJSKCJib29zdHJhcCBkb2Vzbid0IHN1cHBvcnQgZXh0ZW5kIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJcmV0dXJuIHNtbS0+bGwubnJfYmxvY2tzOworfQorCitzdGF0aWMgaW50IHNtX2Jvb3RzdHJhcF9nZXRfbnJfZnJlZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJc3RydWN0IHNtX21ldGFkYXRhICpzbW0gPSBjb250YWluZXJfb2Yoc20sIHN0cnVjdCBzbV9tZXRhZGF0YSwgc20pOworCisJKmNvdW50ID0gc21tLT5sbC5ucl9ibG9ja3MgLSBzbW0tPmJlZ2luOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2dldF9jb3VudChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwlyZXR1cm4gYiA8IHNtbS0+YmVnaW4gPyAxIDogMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgIGRtX2Jsb2NrX3QgYiwgaW50ICpyZXN1bHQpCit7CisJKnJlc3VsdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfc2V0X2NvdW50KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsCisJCQkJICB1aW50MzJfdCBjb3VudCkKK3sKKwlETUVSUigiYm9vc3RyYXAgZG9lc24ndCBzdXBwb3J0IHNldF9jb3VudCIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX25ld19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqYikKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbSA9IGNvbnRhaW5lcl9vZihzbSwgc3RydWN0IHNtX21ldGFkYXRhLCBzbSk7CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGVudGlyZSBkZXZpY2UgaXMgdW51c2VkLgorCSAqLworCWlmIChzbW0tPmJlZ2luID09IHNtbS0+bGwubnJfYmxvY2tzKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCSpiID0gc21tLT5iZWdpbisrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXJldHVybiBhZGRfYm9wKHNtbSwgQk9QX0lOQywgYik7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2RlY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXJldHVybiBhZGRfYm9wKHNtbSwgQk9QX0RFQywgYik7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2NvbW1pdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbV9ib290c3RyYXBfcm9vdF9zaXplKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCkKK3sKKwlETUVSUigiYm9vc3RyYXAgZG9lc24ndCBzdXBwb3J0IHJvb3Rfc2l6ZSIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc21fYm9vdHN0cmFwX2NvcHlfcm9vdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqd2hlcmUsCisJCQkJICBzaXplX3QgbWF4KQoreworCURNRVJSKCJib29zdHJhcCBkb2Vzbid0IHN1cHBvcnQgY29weV9yb290Iik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBkbV9zcGFjZV9tYXAgYm9vdHN0cmFwX29wcyA9IHsKKwkuZGVzdHJveSA9IHNtX2Jvb3RzdHJhcF9kZXN0cm95LAorCS5leHRlbmQgPSBzbV9ib290c3RyYXBfZXh0ZW5kLAorCS5nZXRfbnJfYmxvY2tzID0gc21fYm9vdHN0cmFwX2dldF9ucl9ibG9ja3MsCisJLmdldF9ucl9mcmVlID0gc21fYm9vdHN0cmFwX2dldF9ucl9mcmVlLAorCS5nZXRfY291bnQgPSBzbV9ib290c3RyYXBfZ2V0X2NvdW50LAorCS5jb3VudF9pc19tb3JlX3RoYW5fb25lID0gc21fYm9vdHN0cmFwX2NvdW50X2lzX21vcmVfdGhhbl9vbmUsCisJLnNldF9jb3VudCA9IHNtX2Jvb3RzdHJhcF9zZXRfY291bnQsCisJLmluY19ibG9jayA9IHNtX2Jvb3RzdHJhcF9pbmNfYmxvY2ssCisJLmRlY19ibG9jayA9IHNtX2Jvb3RzdHJhcF9kZWNfYmxvY2ssCisJLm5ld19ibG9jayA9IHNtX2Jvb3RzdHJhcF9uZXdfYmxvY2ssCisJLmNvbW1pdCA9IHNtX2Jvb3RzdHJhcF9jb21taXQsCisJLnJvb3Rfc2l6ZSA9IHNtX2Jvb3RzdHJhcF9yb290X3NpemUsCisJLmNvcHlfcm9vdCA9IHNtX2Jvb3RzdHJhcF9jb3B5X3Jvb3QKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBkbV9zcGFjZV9tYXAgKmRtX3NtX21ldGFkYXRhX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc21fbWV0YWRhdGEgKnNtbTsKKworCXNtbSA9IGttYWxsb2Moc2l6ZW9mKCpzbW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1jcHkoJnNtbS0+c20sICZvcHMsIHNpemVvZihzbW0tPnNtKSk7CisKKwlyZXR1cm4gJnNtbS0+c207Cit9CisKK2ludCBkbV9zbV9tZXRhZGF0YV9jcmVhdGUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sCisJCQkgIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCSAgZG1fYmxvY2tfdCBucl9ibG9ja3MsCisJCQkgIGRtX2Jsb2NrX3Qgc3VwZXJibG9jaykKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IGk7CisJZW51bSBhbGxvY2F0aW9uX2V2ZW50IGV2OworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXNtbS0+YmVnaW4gPSBzdXBlcmJsb2NrICsgMTsKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCA9IDA7CisJc21tLT5hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJc21tLT5ucl91bmNvbW1pdHRlZCA9IDA7CisKKwltZW1jcHkoJnNtbS0+c20sICZib290c3RyYXBfb3BzLCBzaXplb2Yoc21tLT5zbSkpOworCisJciA9IHNtX2xsX25ld19tZXRhZGF0YSgmc21tLT5sbCwgdG0pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBzbV9sbF9leHRlbmQoJnNtbS0+bGwsIG5yX2Jsb2Nrcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KCZzbW0tPnNtLCAmb3BzLCBzaXplb2Yoc21tLT5zbSkpOworCisJLyoKKwkgKiBOb3cgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5ld2x5IGNyZWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdGhlCisJICogYWxsb2NhdGVkIGJsb2NrcyB0aGF0IHRoZXkgd2VyZSBidWlsdCBmcm9tLgorCSAqLworCWZvciAoaSA9IHN1cGVyYmxvY2s7ICFyICYmIGkgPCBzbW0tPmJlZ2luOyBpKyspCisJCXIgPSBzbV9sbF9pbmMoJnNtbS0+bGwsIGksICZldik7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc21fbWV0YWRhdGFfY29tbWl0KHNtKTsKK30KKworaW50IGRtX3NtX21ldGFkYXRhX29wZW4oc3RydWN0IGRtX3NwYWNlX21hcCAqc20sCisJCQlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQl2b2lkICpyb290X2xlLCBzaXplX3QgbGVuKQoreworCWludCByOworCXN0cnVjdCBzbV9tZXRhZGF0YSAqc21tID0gY29udGFpbmVyX29mKHNtLCBzdHJ1Y3Qgc21fbWV0YWRhdGEsIHNtKTsKKworCXIgPSBzbV9sbF9vcGVuX21ldGFkYXRhKCZzbW0tPmxsLCB0bSwgcm9vdF9sZSwgbGVuKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlzbW0tPmJlZ2luID0gMDsKKwlzbW0tPnJlY3Vyc2lvbl9jb3VudCA9IDA7CisJc21tLT5hbGxvY2F0ZWRfdGhpc190cmFuc2FjdGlvbiA9IDA7CisJc21tLT5ucl91bmNvbW1pdHRlZCA9IDA7CisKKwltZW1jcHkoJnNtbS0+b2xkX2xsLCAmc21tLT5sbCwgc2l6ZW9mKHNtbS0+b2xkX2xsKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuaCBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC1tZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmJhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS1zcGFjZS1tYXAtbWV0YWRhdGEuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIERNX1NQQUNFX01BUF9NRVRBREFUQV9ICisjZGVmaW5lIERNX1NQQUNFX01BUF9NRVRBREFUQV9ICisKKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlIHR3by1waGFzZSBjb25zdHJ1Y3Rpb24gZHVlIHRvIHRoZSBjeWNsZQorICogYmV0d2VlbiB0aGUgdG0gYW5kIHNtLgorICovCitzdHJ1Y3QgZG1fc3BhY2VfbWFwICpkbV9zbV9tZXRhZGF0YV9pbml0KHZvaWQpOworCisvKgorICogQ3JlYXRlIGEgZnJlc2ggc3BhY2UgbWFwLgorICovCitpbnQgZG1fc21fbWV0YWRhdGFfY3JlYXRlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLAorCQkJICBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCQkgIGRtX2Jsb2NrX3QgbnJfYmxvY2tzLAorCQkJICBkbV9ibG9ja190IHN1cGVyYmxvY2spOworCisvKgorICogT3BlbiBmcm9tIGEgcHJldmlvdXNseS1yZWNvcmRlZCByb290LgorICovCitpbnQgZG1fc21fbWV0YWRhdGFfb3BlbihzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwKKwkJCXZvaWQgKnJvb3RfbGUsIHNpemVfdCBsZW4pOworCisjZW5kaWYJLyogRE1fU1BBQ0VfTUFQX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tc3BhY2UtbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZmM2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXNwYWNlLW1hcC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlZCBIYXQsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9TUEFDRV9NQVBfSAorI2RlZmluZSBfTElOVVhfRE1fU1BBQ0VfTUFQX0gKKworI2luY2x1ZGUgImRtLWJsb2NrLW1hbmFnZXIuaCIKKworLyoKKyAqIHN0cnVjdCBkbV9zcGFjZV9tYXAga2VlcHMgYSByZWNvcmQgb2YgaG93IG1hbnkgdGltZXMgZWFjaCBibG9jayBpbiBhIGRldmljZQorICogaXMgcmVmZXJlbmNlZC4gIEl0IG5lZWRzIHRvIGJlIGZpeGVkIG9uIGRpc2sgYXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgKi8KK3N0cnVjdCBkbV9zcGFjZV9tYXAgeworCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSk7CisKKwkvKgorCSAqIFlvdSBtdXN0IGNvbW1pdCBiZWZvcmUgYWxsb2NhdGluZyB0aGUgbmV3bHkgYWRkZWQgc3BhY2UuCisJICovCisJaW50ICgqZXh0ZW5kKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBleHRyYV9ibG9ja3MpOworCisJLyoKKwkgKiBFeHRlbnNpb25zIGRvIG5vdCBhcHBlYXIgaW4gdGhpcyBjb3VudCB1bnRpbCBhZnRlciBjb21taXQgaGFzCisJICogYmVlbiBjYWxsZWQuCisJICovCisJaW50ICgqZ2V0X25yX2Jsb2Nrcykoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmNvdW50KTsKKworCS8qCisJICogU3BhY2UgbWFwcyBtdXN0IG5ldmVyIGFsbG9jYXRlIGEgYmxvY2sgZnJvbSB0aGUgcHJldmlvdXMKKwkgKiB0cmFuc2FjdGlvbiwgaW4gY2FzZSB3ZSBuZWVkIHRvIHJvbGxiYWNrLiAgVGhpcyBjb21wbGljYXRlcyB0aGUKKwkgKiBzZW1hbnRpY3Mgb2YgZ2V0X25yX2ZyZWUoKSwgaXQgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcworCSAqIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBfbm93Xy4gIEZvciBpbnN0YW5jZSB5b3UgbWF5CisJICogaGF2ZSBibG9ja3Mgd2l0aCBhIHplcm8gcmVmZXJlbmNlIGNvdW50IHRoYXQgd2lsbCBub3QgYmUKKwkgKiBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gdW50aWwgYWZ0ZXIgdGhlIG5leHQgY29tbWl0LgorCSAqLworCWludCAoKmdldF9ucl9mcmVlKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpOworCisJaW50ICgqZ2V0X2NvdW50KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLCB1aW50MzJfdCAqcmVzdWx0KTsKKwlpbnQgKCpjb3VudF9pc19tb3JlX3RoYW5fb25lKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgICAgIGludCAqcmVzdWx0KTsKKwlpbnQgKCpzZXRfY291bnQpKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIsIHVpbnQzMl90IGNvdW50KTsKKworCWludCAoKmNvbW1pdCkoc3RydWN0IGRtX3NwYWNlX21hcCAqc20pOworCisJaW50ICgqaW5jX2Jsb2NrKShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKTsKKwlpbnQgKCpkZWNfYmxvY2spKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpOworCisJLyoKKwkgKiBuZXdfYmxvY2sgd2lsbCBpbmNyZW1lbnQgdGhlIHJldHVybmVkIGJsb2NrLgorCSAqLworCWludCAoKm5ld19ibG9jaykoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpOworCisJLyoKKwkgKiBUaGUgcm9vdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBmaXggdGhlIHNwYWNlIG1hcC4KKwkgKiBHZW5lcmFsbHkgdGhpcyBpbmZvIGlzIHNtYWxsLCBzbyBzcXVpcnJlbCBpdCBhd2F5IGluIGEgZGlzayBibG9jaworCSAqIGFsb25nIHdpdGggb3RoZXIgaW5mby4KKwkgKi8KKwlpbnQgKCpyb290X3NpemUpKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBzaXplX3QgKnJlc3VsdCk7CisJaW50ICgqY29weV9yb290KShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgdm9pZCAqY29weV90b19oZXJlX2xlLCBzaXplX3QgbGVuKTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbV9zbV9kZXN0cm95KHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCXNtLT5kZXN0cm95KHNtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZXh0ZW5kKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGV4dHJhX2Jsb2NrcykKK3sKKwlyZXR1cm4gc20tPmV4dGVuZChzbSwgZXh0cmFfYmxvY2tzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZ2V0X25yX2Jsb2NrcyhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCAqY291bnQpCit7CisJcmV0dXJuIHNtLT5nZXRfbnJfYmxvY2tzKHNtLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2dldF9ucl9mcmVlKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190ICpjb3VudCkKK3sKKwlyZXR1cm4gc20tPmdldF9ucl9mcmVlKHNtLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2dldF9jb3VudChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiLAorCQkJCSAgdWludDMyX3QgKnJlc3VsdCkKK3sKKwlyZXR1cm4gc20tPmdldF9jb3VudChzbSwgYiwgcmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZShzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwKKwkJCQkJICAgICAgIGRtX2Jsb2NrX3QgYiwgaW50ICpyZXN1bHQpCit7CisJcmV0dXJuIHNtLT5jb3VudF9pc19tb3JlX3RoYW5fb25lKHNtLCBiLCByZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9zZXRfY291bnQoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgYiwKKwkJCQkgIHVpbnQzMl90IGNvdW50KQoreworCXJldHVybiBzbS0+c2V0X2NvdW50KHNtLCBiLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2NvbW1pdChzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSkKK3sKKwlyZXR1cm4gc20tPmNvbW1pdChzbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtX3NtX2luY19ibG9jayhzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbSwgZG1fYmxvY2tfdCBiKQoreworCXJldHVybiBzbS0+aW5jX2Jsb2NrKHNtLCBiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1fc21fZGVjX2Jsb2NrKHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtLCBkbV9ibG9ja190IGIpCit7CisJcmV0dXJuIHNtLT5kZWNfYmxvY2soc20sIGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9uZXdfYmxvY2soc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIGRtX2Jsb2NrX3QgKmIpCit7CisJcmV0dXJuIHNtLT5uZXdfYmxvY2soc20sIGIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9yb290X3NpemUoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHNpemVfdCAqcmVzdWx0KQoreworCXJldHVybiBzbS0+cm9vdF9zaXplKHNtLCByZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9zbV9jb3B5X3Jvb3Qoc3RydWN0IGRtX3NwYWNlX21hcCAqc20sIHZvaWQgKmNvcHlfdG9faGVyZV9sZSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gc20tPmNvcHlfcm9vdChzbSwgY29weV90b19oZXJlX2xlLCBsZW4pOworfQorCisjZW5kaWYJLyogX0xJTlVYX0RNX1NQQUNFX01BUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmMgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZDM4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvcGVyc2lzdGVudC1kYXRhL2RtLXRyYW5zYWN0aW9uLW1hbmFnZXIuYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKyNpbmNsdWRlICJkbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLmgiCisjaW5jbHVkZSAiZG0tc3BhY2UtbWFwLWNoZWNrZXIuaCIKKyNpbmNsdWRlICJkbS1zcGFjZS1tYXAtZGlzay5oIgorI2luY2x1ZGUgImRtLXNwYWNlLW1hcC1tZXRhZGF0YS5oIgorI2luY2x1ZGUgImRtLXBlcnNpc3RlbnQtZGF0YS1pbnRlcm5hbC5oIgorCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJ0cmFuc2FjdGlvbiBtYW5hZ2VyIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc2hhZG93X2luZm8geworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OworCWRtX2Jsb2NrX3Qgd2hlcmU7Cit9OworCisvKgorICogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBzY2FsZWQgd2l0aCB0aGUgc2l6ZSBvZiB0cmFuc2FjdGlvbi4KKyAqLworI2RlZmluZSBIQVNIX1NJWkUgMjU2CisjZGVmaW5lIEhBU0hfTUFTSyAoSEFTSF9TSVpFIC0gMSkKKworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgeworCWludCBpc19jbG9uZTsKKwlzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqcmVhbDsKKworCXN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibTsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICpzbTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBidWNrZXRzW0hBU0hfU0laRV07Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGlzX3NoYWRvdyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYikKK3sKKwlpbnQgciA9IDA7CisJdW5zaWduZWQgYnVja2V0ID0gZG1faGFzaF9ibG9jayhiLCBIQVNIX01BU0spOworCXN0cnVjdCBzaGFkb3dfaW5mbyAqc2k7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlzcGluX2xvY2soJnRtLT5sb2NrKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShzaSwgbiwgdG0tPmJ1Y2tldHMgKyBidWNrZXQsIGhsaXN0KQorCQlpZiAoc2ktPndoZXJlID09IGIpIHsKKwkJCXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9jaygmdG0tPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBUaGlzIGNhbiBzaWxlbnRseSBmYWlsIGlmIHRoZXJlJ3Mgbm8gbWVtb3J5LiAgV2UncmUgb2sgd2l0aCB0aGlzIHNpbmNlCisgKiBjcmVhdGluZyByZWR1bmRhbnQgc2hhZG93cyBjYXVzZXMgbm8gaGFybS4KKyAqLworc3RhdGljIHZvaWQgaW5zZXJ0X3NoYWRvdyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYikKK3sKKwl1bnNpZ25lZCBidWNrZXQ7CisJc3RydWN0IHNoYWRvd19pbmZvICpzaTsKKworCXNpID0ga21hbGxvYyhzaXplb2YoKnNpKSwgR0ZQX05PSU8pOworCWlmIChzaSkgeworCQlzaS0+d2hlcmUgPSBiOworCQlidWNrZXQgPSBkbV9oYXNoX2Jsb2NrKGIsIEhBU0hfTUFTSyk7CisJCXNwaW5fbG9jaygmdG0tPmxvY2spOworCQlobGlzdF9hZGRfaGVhZCgmc2ktPmhsaXN0LCB0bS0+YnVja2V0cyArIGJ1Y2tldCk7CisJCXNwaW5fdW5sb2NrKCZ0bS0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCB3aXBlX3NoYWRvd190YWJsZShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJc3RydWN0IHNoYWRvd19pbmZvICpzaTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgKnRtcDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0bS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKSB7CisJCWJ1Y2tldCA9IHRtLT5idWNrZXRzICsgaTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzaSwgbiwgdG1wLCBidWNrZXQsIGhsaXN0KQorCQkJa2ZyZWUoc2kpOworCisJCUlOSVRfSExJU1RfSEVBRChidWNrZXQpOworCX0KKworCXNwaW5fdW5sb2NrKCZ0bS0+bG9jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqZG1fdG1fY3JlYXRlKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwKKwkJCQkJCSAgIHN0cnVjdCBkbV9zcGFjZV9tYXAgKnNtKQoreworCWludCBpOworCXN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bTsKKworCXRtID0ga21hbGxvYyhzaXplb2YoKnRtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwl0bS0+aXNfY2xvbmUgPSAwOworCXRtLT5yZWFsID0gTlVMTDsKKwl0bS0+Ym0gPSBibTsKKwl0bS0+c20gPSBzbTsKKworCXNwaW5fbG9ja19pbml0KCZ0bS0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQodG0tPmJ1Y2tldHMgKyBpKTsKKworCXJldHVybiB0bTsKK30KKworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKmRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnJlYWwpCit7CisJc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtOworCisJdG0gPSBrbWFsbG9jKHNpemVvZigqdG0pLCBHRlBfS0VSTkVMKTsKKwlpZiAodG0pIHsKKwkJdG0tPmlzX2Nsb25lID0gMTsKKwkJdG0tPnJlYWwgPSByZWFsOworCX0KKworCXJldHVybiB0bTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUpOworCit2b2lkIGRtX3RtX2Rlc3Ryb3koc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtKQoreworCWtmcmVlKHRtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX2Rlc3Ryb3kpOworCitpbnQgZG1fdG1fcHJlX2NvbW1pdChzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pCit7CisJaW50IHI7CisKKwlpZiAodG0tPmlzX2Nsb25lKQorCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCisJciA9IGRtX3NtX2NvbW1pdCh0bS0+c20pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX3ByZV9jb21taXQpOworCitpbnQgZG1fdG1fY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpyb290KQoreworCWlmICh0bS0+aXNfY2xvbmUpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwl3aXBlX3NoYWRvd190YWJsZSh0bSk7CisKKwlyZXR1cm4gZG1fYm1fZmx1c2hfYW5kX3VubG9jayh0bS0+Ym0sIHJvb3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fdG1fY29tbWl0KTsKKworaW50IGRtX3RtX25ld19ibG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0KQoreworCWludCByOworCWRtX2Jsb2NrX3QgbmV3X2Jsb2NrOworCisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCXIgPSBkbV9zbV9uZXdfYmxvY2sodG0tPnNtLCAmbmV3X2Jsb2NrKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3dyaXRlX2xvY2tfemVybyh0bS0+Ym0sIG5ld19ibG9jaywgdiwgcmVzdWx0KTsKKwlpZiAociA8IDApIHsKKwkJZG1fc21fZGVjX2Jsb2NrKHRtLT5zbSwgbmV3X2Jsb2NrKTsKKwkJcmV0dXJuIHI7CisJfQorCisJLyoKKwkgKiBOZXcgYmxvY2tzIGNvdW50IGFzIHNoYWRvd3MgaW4gdGhhdCB0aGV5IGRvbid0IG5lZWQgdG8gYmUKKwkgKiBzaGFkb3dlZCBhZ2Fpbi4KKwkgKi8KKwlpbnNlcnRfc2hhZG93KHRtLCBuZXdfYmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCQkgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCQkgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCkKK3sKKwlpbnQgcjsKKwlkbV9ibG9ja190IG5ldzsKKwlzdHJ1Y3QgZG1fYmxvY2sgKm9yaWdfYmxvY2s7CisKKwlyID0gZG1fc21fbmV3X2Jsb2NrKHRtLT5zbSwgJm5ldyk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCXIgPSBkbV9zbV9kZWNfYmxvY2sodG0tPnNtLCBvcmlnKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3JlYWRfbG9jayh0bS0+Ym0sIG9yaWcsIHYsICZvcmlnX2Jsb2NrKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGRtX2JtX3VubG9ja19tb3ZlKG9yaWdfYmxvY2ssIG5ldyk7CisJaWYgKHIgPCAwKSB7CisJCWRtX2JtX3VubG9jayhvcmlnX2Jsb2NrKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIGRtX2JtX3dyaXRlX2xvY2sodG0tPmJtLCBuZXcsIHYsIHJlc3VsdCk7Cit9CisKK2ludCBkbV90bV9zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCSAgICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LCBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQsCisJCSAgICAgICBpbnQgKmluY19jaGlsZHJlbikKK3sKKwlpbnQgcjsKKworCWlmICh0bS0+aXNfY2xvbmUpCisJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisKKwlyID0gZG1fc21fY291bnRfaXNfbW9yZV90aGFuX29uZSh0bS0+c20sIG9yaWcsIGluY19jaGlsZHJlbik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmIChpc19zaGFkb3codG0sIG9yaWcpICYmICEqaW5jX2NoaWxkcmVuKQorCQlyZXR1cm4gZG1fYm1fd3JpdGVfbG9jayh0bS0+Ym0sIG9yaWcsIHYsIHJlc3VsdCk7CisKKwlyID0gX19zaGFkb3dfYmxvY2sodG0sIG9yaWcsIHYsIHJlc3VsdCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKwlpbnNlcnRfc2hhZG93KHRtLCBkbV9ibG9ja19sb2NhdGlvbigqcmVzdWx0KSk7CisKKwlyZXR1cm4gcjsKK30KKworaW50IGRtX3RtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipibGspCit7CisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIGRtX2JtX3JlYWRfdHJ5X2xvY2sodG0tPnJlYWwtPmJtLCBiLCB2LCBibGspOworCisJcmV0dXJuIGRtX2JtX3JlYWRfbG9jayh0bS0+Ym0sIGIsIHYsIGJsayk7Cit9CisKK2ludCBkbV90bV91bmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBzdHJ1Y3QgZG1fYmxvY2sgKmIpCit7CisJcmV0dXJuIGRtX2JtX3VubG9jayhiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtX3RtX3VubG9jayk7CisKK3ZvaWQgZG1fdG1faW5jKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiKQoreworCS8qCisJICogVGhlIG5vbi1ibG9ja2luZyBjbG9uZSBkb2Vzbid0IHN1cHBvcnQgdGhpcy4KKwkgKi8KKwlCVUdfT04odG0tPmlzX2Nsb25lKTsKKworCWRtX3NtX2luY19ibG9jayh0bS0+c20sIGIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fdG1faW5jKTsKKwordm9pZCBkbV90bV9kZWMoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IGIpCit7CisJLyoKKwkgKiBUaGUgbm9uLWJsb2NraW5nIGNsb25lIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLgorCSAqLworCUJVR19PTih0bS0+aXNfY2xvbmUpOworCisJZG1fc21fZGVjX2Jsb2NrKHRtLT5zbSwgYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9kZWMpOworCitpbnQgZG1fdG1fcmVmKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiLAorCSAgICAgIHVpbnQzMl90ICpyZXN1bHQpCit7CisJaWYgKHRtLT5pc19jbG9uZSkKKwkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCXJldHVybiBkbV9zbV9nZXRfY291bnQodG0tPnNtLCBiLCByZXN1bHQpOworfQorCitzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqZG1fdG1fZ2V0X2JtKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSkKK3sKKwlyZXR1cm4gdG0tPmJtOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGRtX3RtX2NyZWF0ZV9pbnRlcm5hbChzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sCisJCQkJIGRtX2Jsb2NrX3Qgc2JfbG9jYXRpb24sCisJCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJCQkgc2l6ZV90IHJvb3Rfb2Zmc2V0LCBzaXplX3Qgcm9vdF9tYXhfbGVuLAorCQkJCSBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqKnRtLAorCQkJCSBzdHJ1Y3QgZG1fc3BhY2VfbWFwICoqc20sCisJCQkJIHN0cnVjdCBkbV9ibG9jayAqKnNibG9jaywKKwkJCQkgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZG1fc3BhY2VfbWFwICppbm5lcjsKKworCWlubmVyID0gZG1fc21fbWV0YWRhdGFfaW5pdCgpOworCWlmIChJU19FUlIoaW5uZXIpKQorCQlyZXR1cm4gUFRSX0VSUihpbm5lcik7CisKKwkqdG0gPSBkbV90bV9jcmVhdGUoYm0sIGlubmVyKTsKKwlpZiAoSVNfRVJSKCp0bSkpIHsKKwkJZG1fc21fZGVzdHJveShpbm5lcik7CisJCXJldHVybiBQVFJfRVJSKCp0bSk7CisJfQorCisJaWYgKGNyZWF0ZSkgeworCQlyID0gZG1fYm1fd3JpdGVfbG9ja196ZXJvKGRtX3RtX2dldF9ibSgqdG0pLCBzYl9sb2NhdGlvbiwKKwkJCQkJICBzYl92YWxpZGF0b3IsIHNibG9jayk7CisJCWlmIChyIDwgMCkgeworCQkJRE1FUlIoImNvdWxkbid0IGxvY2sgc3VwZXJibG9jayIpOworCQkJZ290byBiYWQxOworCQl9CisKKwkJciA9IGRtX3NtX21ldGFkYXRhX2NyZWF0ZShpbm5lciwgKnRtLCBkbV9ibV9ucl9ibG9ja3MoYm0pLAorCQkJCQkgIHNiX2xvY2F0aW9uKTsKKwkJaWYgKHIpIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBjcmVhdGUgbWV0YWRhdGEgc3BhY2UgbWFwIik7CisJCQlnb3RvIGJhZDI7CisJCX0KKworCQkqc20gPSBkbV9zbV9jaGVja2VyX2NyZWF0ZShpbm5lcik7CisJCWlmICghKnNtKQorCQkJZ290byBiYWQyOworCisJfSBlbHNlIHsKKwkJciA9IGRtX2JtX3dyaXRlX2xvY2soZG1fdG1fZ2V0X2JtKCp0bSksIHNiX2xvY2F0aW9uLAorCQkJCSAgICAgc2JfdmFsaWRhdG9yLCBzYmxvY2spOworCQlpZiAociA8IDApIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBsb2NrIHN1cGVyYmxvY2siKTsKKwkJCWdvdG8gYmFkMTsKKwkJfQorCisJCXIgPSBkbV9zbV9tZXRhZGF0YV9vcGVuKGlubmVyLCAqdG0sCisJCQkJCWRtX2Jsb2NrX2RhdGEoKnNibG9jaykgKyByb290X29mZnNldCwKKwkJCQkJcm9vdF9tYXhfbGVuKTsKKwkJaWYgKHIpIHsKKwkJCURNRVJSKCJjb3VsZG4ndCBvcGVuIG1ldGFkYXRhIHNwYWNlIG1hcCIpOworCQkJZ290byBiYWQyOworCQl9CisKKwkJKnNtID0gZG1fc21fY2hlY2tlcl9jcmVhdGUoaW5uZXIpOworCQlpZiAoISpzbSkKKwkJCWdvdG8gYmFkMjsKKwl9CisKKwlyZXR1cm4gMDsKKworYmFkMjoKKwlkbV90bV91bmxvY2soKnRtLCAqc2Jsb2NrKTsKK2JhZDE6CisJZG1fdG1fZGVzdHJveSgqdG0pOworCWRtX3NtX2Rlc3Ryb3koaW5uZXIpOworCXJldHVybiByOworfQorCitpbnQgZG1fdG1fY3JlYXRlX3dpdGhfc20oc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IHNiX2xvY2F0aW9uLAorCQkJIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJCSBzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqKnRtLAorCQkJIHN0cnVjdCBkbV9zcGFjZV9tYXAgKipzbSwgc3RydWN0IGRtX2Jsb2NrICoqc2Jsb2NrKQoreworCXJldHVybiBkbV90bV9jcmVhdGVfaW50ZXJuYWwoYm0sIHNiX2xvY2F0aW9uLCBzYl92YWxpZGF0b3IsCisJCQkJICAgICAwLCAwLCB0bSwgc20sIHNibG9jaywgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9jcmVhdGVfd2l0aF9zbSk7CisKK2ludCBkbV90bV9vcGVuX3dpdGhfc20oc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmJtLCBkbV9ibG9ja190IHNiX2xvY2F0aW9uLAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqc2JfdmFsaWRhdG9yLAorCQkgICAgICAgc2l6ZV90IHJvb3Rfb2Zmc2V0LCBzaXplX3Qgcm9vdF9tYXhfbGVuLAorCQkgICAgICAgc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKip0bSwKKwkJICAgICAgIHN0cnVjdCBkbV9zcGFjZV9tYXAgKipzbSwgc3RydWN0IGRtX2Jsb2NrICoqc2Jsb2NrKQoreworCXJldHVybiBkbV90bV9jcmVhdGVfaW50ZXJuYWwoYm0sIHNiX2xvY2F0aW9uLCBzYl92YWxpZGF0b3IsIHJvb3Rfb2Zmc2V0LAorCQkJCSAgICAgcm9vdF9tYXhfbGVuLCB0bSwgc20sIHNibG9jaywgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbV90bV9vcGVuX3dpdGhfc20pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oIGIvZHJpdmVycy9tZC9wZXJzaXN0ZW50LWRhdGEvZG0tdHJhbnNhY3Rpb24tbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTc4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21kL3BlcnNpc3RlbnQtZGF0YS9kbS10cmFuc2FjdGlvbi1tYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0RNX1RSQU5TQUNUSU9OX01BTkFHRVJfSAorI2RlZmluZSBfTElOVVhfRE1fVFJBTlNBQ1RJT05fTUFOQUdFUl9ICisKKyNpbmNsdWRlICJkbS1ibG9jay1tYW5hZ2VyLmgiCisKK3N0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyOworc3RydWN0IGRtX3NwYWNlX21hcDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoaXMgbWFuYWdlcyB0aGUgc2NvcGUgb2YgYSB0cmFuc2FjdGlvbi4gIEl0IGFsc28gZW5mb3JjZXMgaW1tdXRhYmlsaXR5CisgKiBvZiB0aGUgb24tZGlzayBkYXRhIHN0cnVjdHVyZXMgYnkgbGltaXRpbmcgYWNjZXNzIHRvIHdyaXRlYWJsZSBibG9ja3MuCisgKgorICogQ2xpZW50cyBzaG91bGQgbm90IGZpZGRsZSB3aXRoIHRoZSBibG9jayBtYW5hZ2VyIGRpcmVjdGx5LgorICovCisKK3ZvaWQgZG1fdG1fZGVzdHJveShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworCisvKgorICogVGhlIG5vbi1ibG9ja2luZyB2ZXJzaW9uIG9mIGEgdHJhbnNhY3Rpb24gbWFuYWdlciBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCisgKiBmYXN0IHBhdGggY29kZSB0aGF0IG5lZWRzIHRvIGRvIGxvb2t1cHMgZS5nLiBhIGRtIG1hcHBpbmcgZnVuY3Rpb24uCisgKiBZb3UgY3JlYXRlIHRoZSBub24tYmxvY2tpbmcgdmFyaWFudCBmcm9tIGEgbm9ybWFsIHRtLiAgVGhlIGludGVyZmFjZSBpcworICogdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IG1vc3QgZnVuY3Rpb25zIHdpbGwganVzdCByZXR1cm4gLUVXT1VMREJMT0NLLgorICogTWV0aG9kcyB0aGF0IHJldHVybiB2b2lkIHlldCBtYXkgYmxvY2sgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gYSBjbG9uZQorICogdml6LiBkbV90bV9pbmMsIGRtX3RtX2RlYy4gIENhbGwgZG1fdG1fZGVzdHJveSgpIGFzIHlvdSB3b3VsZCB3aXRoIGEgbm9ybWFsCisgKiB0bSB3aGVuIHlvdSd2ZSBmaW5pc2hlZCB3aXRoIGl0LiAgWW91IG1heSBub3QgZGVzdHJveSB0aGUgb3JpZ2luYWwgcHJpb3IKKyAqIHRvIGNsb25lcy4KKyAqLworc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKmRtX3RtX2NyZWF0ZV9ub25fYmxvY2tpbmdfY2xvbmUoc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnJlYWwpOworCisvKgorICogV2UgdXNlIGEgMi1waGFzZSBjb21taXQgaGVyZS4KKyAqCisgKiBpKSBJbiB0aGUgZmlyc3QgcGhhc2UgdGhlIGJsb2NrIG1hbmFnZXIgaXMgdG9sZCB0byBzdGFydCBmbHVzaGluZywgYW5kCisgKiB0aGUgY2hhbmdlcyB0byB0aGUgc3BhY2UgbWFwIGFyZSB3cml0dGVuIHRvIGRpc2suICBZb3Ugc2hvdWxkIGludGVycm9nYXRlCisgKiB5b3VyIHBhcnRpY3VsYXIgc3BhY2UgbWFwIHRvIGdldCBkZXRhaWwgb2YgaXRzIHJvb3Qgbm9kZSBldGMuIHRvIGJlCisgKiBpbmNsdWRlZCBpbiB5b3VyIHN1cGVyYmxvY2suCisgKgorICogaWkpIEByb290IHdpbGwgYmUgY29tbWl0dGVkIGxhc3QuICBZb3Ugc2hvdWxkbid0IHVzZSBtb3JlIHRoYW4gdGhlCisgKiBmaXJzdCA1MTIgYnl0ZXMgb2YgQHJvb3QgaWYgeW91IHdpc2ggdGhlIHRyYW5zYWN0aW9uIHRvIHN1cnZpdmUgYSBwb3dlcgorICogZmFpbHVyZS4gIFlvdSAqbXVzdCogaGF2ZSBhIHdyaXRlIGxvY2sgaGVsZCBvbiBAcm9vdCBmb3IgYm90aCBzdGFnZSAoaSkKKyAqIGFuZCAoaWkpLiAgVGhlIGNvbW1pdCB3aWxsIGRyb3AgdGhlIHdyaXRlIGxvY2suCisgKi8KK2ludCBkbV90bV9wcmVfY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSk7CitpbnQgZG1fdG1fY29tbWl0KHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpyb290KTsKKworLyoKKyAqIFRoZXNlIG1ldGhvZHMgYXJlIHRoZSBvbmx5IHdheSB0byBnZXQgaG9sZCBvZiBhIHdyaXRlYWJsZSBibG9jay4KKyAqLworCisvKgorICogZG1fdG1fbmV3X2Jsb2NrKCkgaXMgcHJldHR5IHNlbGYtZXhwbGFuYXRvcnkuICBNYWtlIHN1cmUgeW91IGRvIGFjdHVhbGx5CisgKiB3cml0ZSB0byB0aGUgd2hvbGUgb2YgQGRhdGEgYmVmb3JlIHlvdSB1bmxvY2ssIG90aGVyd2lzZSB5b3UgY291bGQgZ2V0CisgKiBhIGRhdGEgbGVhay4gIChUaGUgb3RoZXIgb3B0aW9uIGlzIGZvciB0bV9uZXdfYmxvY2soKSB0byB6ZXJvIG5ldyBibG9ja3MKKyAqIGJlZm9yZSBoYW5kaW5nIHRoZW0gb3V0LCB3aGljaCB3aWxsIGJlIHJlZHVuZGFudCBpbiBtb3N0LCBpZiBub3QgYWxsLAorICogY2FzZXMpLgorICogWmVyb2VzIHRoZSBuZXcgYmxvY2sgYW5kIHJldHVybnMgd2l0aCB3cml0ZSBsb2NrIGhlbGQuCisgKi8KK2ludCBkbV90bV9uZXdfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLAorCQkgICAgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqdiwKKwkJICAgIHN0cnVjdCBkbV9ibG9jayAqKnJlc3VsdCk7CisKKy8qCisgKiBkbV90bV9zaGFkb3dfYmxvY2soKSBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgYW5kIGNvcGllcyB0aGUgZGF0YSBmcm9tIEBvcmlnCisgKiB0byBpdC4gIEl0IHRoZW4gZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIG9yaWdpbmFsIGJsb2NrLiAgVXNlCisgKiB0aGlzIHRvIHVwZGF0ZSB0aGUgY29udGVudHMgb2YgYSBibG9jayBpbiBhIGRhdGEgc3RydWN0dXJlLCBkb24ndAorICogY29uZnVzZSB0aGlzIHdpdGggYSBjbG9uZSAtIHlvdSBzaG91bGRuJ3QgYWNjZXNzIHRoZSBvcmlnIGJsb2NrIGFmdGVyCisgKiB0aGlzIG9wZXJhdGlvbi4gIEJlY2F1c2UgdGhlIHRtIGtub3dzIHRoZSBzY29wZSBvZiB0aGUgdHJhbnNhY3Rpb24gaXQKKyAqIGNhbiBvcHRpbWlzZSByZXF1ZXN0cyBmb3IgYSBzaGFkb3cgb2YgYSBzaGFkb3cgdG8gYSBuby1vcC4gIERvbid0IGZvcmdldAorICogdG8gdW5sb2NrIHdoZW4geW91J3ZlIGZpbmlzaGVkIHdpdGggdGhlIHNoYWRvdy4KKyAqCisgKiBUaGUgQGluY19jaGlsZHJlbiBmbGFnIGlzIHVzZWQgdG8gdGVsbCB0aGUgY2FsbGVyIHdoZXRoZXIgaXQgbmVlZHMgdG8KKyAqIGFkanVzdCByZWZlcmVuY2UgY291bnRzIGZvciBjaGlsZHJlbi4gIChEYXRhIGluIHRoZSBibG9jayBtYXkgcmVmZXIgdG8KKyAqIG90aGVyIGJsb2Nrcy4pCisgKgorICogU2hhZG93aW5nIGltcGxpY2l0bHkgZHJvcHMgYSByZWZlcmVuY2Ugb24gQG9yaWcgc28geW91IG11c3Qgbm90IGhhdmUKKyAqIGl0IGxvY2tlZCB3aGVuIHlvdSBjYWxsIHRoaXMuCisgKi8KK2ludCBkbV90bV9zaGFkb3dfYmxvY2soc3RydWN0IGRtX3RyYW5zYWN0aW9uX21hbmFnZXIgKnRtLCBkbV9ibG9ja190IG9yaWcsCisJCSAgICAgICBzdHJ1Y3QgZG1fYmxvY2tfdmFsaWRhdG9yICp2LAorCQkgICAgICAgc3RydWN0IGRtX2Jsb2NrICoqcmVzdWx0LCBpbnQgKmluY19jaGlsZHJlbik7CisKKy8qCisgKiBSZWFkIGFjY2Vzcy4gIFlvdSBjYW4gbG9jayBhbnkgYmxvY2sgeW91IHdhbnQuICBJZiB0aGVyZSdzIGEgd3JpdGUgbG9jaworICogb24gaXQgb3V0c3RhbmRpbmcgdGhlbiBpdCdsbCBibG9jay4KKyAqLworaW50IGRtX3RtX3JlYWRfbG9jayhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkJICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnYsCisJCSAgICBzdHJ1Y3QgZG1fYmxvY2sgKipyZXN1bHQpOworCitpbnQgZG1fdG1fdW5sb2NrKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgc3RydWN0IGRtX2Jsb2NrICpiKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWx0ZXJpbmcgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIGJsb2NrIGRpcmVjdGx5LgorICovCit2b2lkIGRtX3RtX2luYyhzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYik7CisKK3ZvaWQgZG1fdG1fZGVjKHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICp0bSwgZG1fYmxvY2tfdCBiKTsKKworaW50IGRtX3RtX3JlZihzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0sIGRtX2Jsb2NrX3QgYiwKKwkgICAgICB1aW50MzJfdCAqcmVzdWx0KTsKKworc3RydWN0IGRtX2Jsb2NrX21hbmFnZXIgKmRtX3RtX2dldF9ibShzdHJ1Y3QgZG1fdHJhbnNhY3Rpb25fbWFuYWdlciAqdG0pOworCisvKgorICogQSBsaXR0bGUgdXRpbGl0eSB0aGF0IHRpZXMgdGhlIGtub3QgYnkgcHJvZHVjaW5nIGEgdHJhbnNhY3Rpb24gbWFuYWdlcgorICogdGhhdCBoYXMgYSBzcGFjZSBtYXAgbWFuYWdlZCBieSB0aGUgdHJhbnNhY3Rpb24gbWFuYWdlci4uLgorICoKKyAqIFJldHVybnMgYSB0bSB0aGF0IGhhcyBhbiBvcGVuIHRyYW5zYWN0aW9uIHRvIHdyaXRlIHRoZSBuZXcgZGlzayBzbS4KKyAqIENhbGxlciBzaG91bGQgc3RvcmUgdGhlIG5ldyBzbSByb290IGFuZCBjb21taXQuCisgKi8KK2ludCBkbV90bV9jcmVhdGVfd2l0aF9zbShzdHJ1Y3QgZG1fYmxvY2tfbWFuYWdlciAqYm0sIGRtX2Jsb2NrX3Qgc2JfbG9jYXRpb24sCisJCQkgc3RydWN0IGRtX2Jsb2NrX3ZhbGlkYXRvciAqc2JfdmFsaWRhdG9yLAorCQkJIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICoqdG0sCisJCQkgc3RydWN0IGRtX3NwYWNlX21hcCAqKnNtLCBzdHJ1Y3QgZG1fYmxvY2sgKipzYmxvY2spOworCitpbnQgZG1fdG1fb3Blbl93aXRoX3NtKHN0cnVjdCBkbV9ibG9ja19tYW5hZ2VyICpibSwgZG1fYmxvY2tfdCBzYl9sb2NhdGlvbiwKKwkJICAgICAgIHN0cnVjdCBkbV9ibG9ja192YWxpZGF0b3IgKnNiX3ZhbGlkYXRvciwKKwkJICAgICAgIHNpemVfdCByb290X29mZnNldCwgc2l6ZV90IHJvb3RfbWF4X2xlbiwKKwkJICAgICAgIHN0cnVjdCBkbV90cmFuc2FjdGlvbl9tYW5hZ2VyICoqdG0sCisJCSAgICAgICBzdHJ1Y3QgZG1fc3BhY2VfbWFwICoqc20sIHN0cnVjdCBkbV9ibG9jayAqKnNibG9jayk7CisKKyNlbmRpZgkvKiBfTElOVVhfRE1fVFJBTlNBQ1RJT05fTUFOQUdFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggMGViMDhhNC4uNzI5NGJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAibWQuaCIKICNpbmNsdWRlICJyYWlkMC5oIgpAQCAtNDY4LDcgKzQ2OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHJhaWQwX21ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCByYWlkMF9tYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGludCBjaHVua19zZWN0czsKIAlzZWN0b3JfdCBzZWN0b3Jfb2Zmc2V0OwpAQCAtNDc3LDcgKzQ3OCw3IEBACiAKIAlpZiAodW5saWtlbHkoYmlvLT5iaV9ydyAmIFJFUV9GTFVTSCkpIHsKIAkJbWRfZmx1c2hfcmVxdWVzdChtZGRldiwgYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAljaHVua19zZWN0cyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwpAQCAtNDk3LDEzICs0OTgsMTAgQEAKIAkJZWxzZQogCQkJYnAgPSBiaW9fc3BsaXQoYmlvLCBjaHVua19zZWN0cyAtCiAJCQkJICAgICAgIHNlY3Rvcl9kaXYoc2VjdG9yLCBjaHVua19zZWN0cykpOwotCQlpZiAocmFpZDBfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8xKTsKLQkJaWYgKHJhaWQwX21ha2VfcmVxdWVzdChtZGRldiwgJmJwLT5iaW8yKSkKLQkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KCZicC0+YmlvMik7Ci0KKwkJcmFpZDBfbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQlyYWlkMF9tYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7CiAJCWJpb19wYWlyX3JlbGVhc2UoYnApOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAogCXNlY3Rvcl9vZmZzZXQgPSBiaW8tPmJpX3NlY3RvcjsKQEAgLTUxMywxMCArNTExLDkgQEAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yX29mZnNldCArIHpvbmUtPmRldl9zdGFydCArCiAJCXRtcF9kZXYtPmRhdGFfb2Zmc2V0OwotCS8qCi0JICogTGV0IHRoZSBtYWluIGJsb2NrIGxheWVyIHN1Ym1pdCB0aGUgSU8gYW5kIHJlc29sdmUgcmVjdXJzaW9uOgotCSAqLwotCXJldHVybiAxOworCisJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKwlyZXR1cm47CiAKIGJhZF9tYXA6CiAJcHJpbnRrKCJtZC9yYWlkMDolczogbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgpAQCAtNTI1LDcgKzUyMiw3IEBACiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSA+PiAxMCk7CiAKIAliaW9faW9fZXJyb3IoYmlvKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHJhaWQwX3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG1kZGV2ICptZGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCA0NjAyZmM1Li5lZGUyNDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJtZC5oIgpAQCAtODA3LDcgKzgwOCw3IEBACiAJcHJfZGVidWcoIiVkQiBiZWhpbmQgYWxsb2MgZmFpbGVkLCBkb2luZyBzeW5jIEkvT1xuIiwgYmlvLT5iaV9zaXplKTsKIH0KIAotc3RhdGljIGludCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpbykKK3N0YXRpYyB2b2lkIG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmlvKQogewogCXN0cnVjdCByMWNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbWlycm9yX2luZm8gKm1pcnJvcjsKQEAgLTg5Miw3ICs4OTMsNyBAQAogCQlpZiAocmRpc2sgPCAwKSB7CiAJCQkvKiBjb3VsZG4ndCBmaW5kIGFueXdoZXJlIHRvIHJlYWQgZnJvbSAqLwogCQkJcmFpZF9lbmRfYmlvX2lvKHIxX2Jpbyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCQltaXJyb3IgPSBjb25mLT5taXJyb3JzICsgcmRpc2s7CiAKQEAgLTk1MCw3ICs5NTEsNyBAQAogCQkJZ290byByZWFkX2FnYWluOwogCQl9IGVsc2UKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KHJlYWRfYmlvKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAkvKgpAQCAtMTE1MSw4ICsxMTUyLDYgQEAKIAogCWlmIChkb19zeW5jIHx8ICFiaXRtYXAgfHwgIXBsdWdnZWQpCiAJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpAQCAtMjE5Myw3ICsyMTkyLDYgQEAKIAkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAkJYmlvLT5iaV9mbGFncyAmPSB+KEJJT19QT09MX01BU0stMSk7CiAJCWJpby0+YmlfZmxhZ3MgfD0gMSA8PCBCSU9fVVBUT0RBVEU7Ci0JCWJpby0+YmlfY29tcF9jcHUgPSAtMTsKIAkJYmlvLT5iaV9ydyA9IFJFQUQ7CiAJCWJpby0+YmlfdmNudCA9IDA7CiAJCWJpby0+YmlfaWR4ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDEzMmMxOGUuLjY4NWRkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSAibWQuaCIKQEAgLTg0Miw3ICs4NDMsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmlvKQorc3RhdGljIHZvaWQgbWFrZV9yZXF1ZXN0KHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBiaW8gKiBiaW8pCiB7CiAJc3RydWN0IHIxMGNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbWlycm9yX2luZm8gKm1pcnJvcjsKQEAgLTg2MSw3ICs4NjIsNyBAQAogCiAJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJLyogSWYgdGhpcyByZXF1ZXN0IGNyb3NzZXMgYSBjaHVuayBib3VuZGFyeSwgd2UgbmVlZCB0bwpAQCAtODkzLDEwICs4OTQsOCBAQAogCQljb25mLT5ucl93YWl0aW5nKys7CiAJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogCi0JCWlmIChtYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMSkpCi0JCQlnZW5lcmljX21ha2VfcmVxdWVzdCgmYnAtPmJpbzEpOwotCQlpZiAobWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzIpKQotCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoJmJwLT5iaW8yKTsKKwkJbWFrZV9yZXF1ZXN0KG1kZGV2LCAmYnAtPmJpbzEpOworCQltYWtlX3JlcXVlc3QobWRkZXYsICZicC0+YmlvMik7CiAKIAkJc3Bpbl9sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogCQljb25mLT5ucl93YWl0aW5nLS07CkBAIC05MDQsMTQgKzkwMywxNCBAQAogCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKIAogCQliaW9fcGFpcl9yZWxlYXNlKGJwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAliYWRfbWFwOgogCQlwcmludGsoIm1kL3JhaWQxMDolczogbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgogCQkgICAgICAgIiBvciBiaWdnZXIgdGhhbiAlZGsgJWxsdSAlZFxuIiwgbWRuYW1lKG1kZGV2KSwgY2h1bmtfc2VjdHMvMiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSA+PiAxMCk7CiAKIAkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7CkBAIC05NTQsNyArOTUzLDcgQEAKIAkJc2xvdCA9IHIxMF9iaW8tPnJlYWRfc2xvdDsKIAkJaWYgKGRpc2sgPCAwKSB7CiAJCQlyYWlkX2VuZF9iaW9faW8ocjEwX2Jpbyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCQltaXJyb3IgPSBjb25mLT5taXJyb3JzICsgZGlzazsKIApAQCAtMTAwMiw3ICsxMDAxLDcgQEAKIAkJCWdvdG8gcmVhZF9hZ2FpbjsKIAkJfSBlbHNlCiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChyZWFkX2Jpbyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJLyoKQEAgLTExNzYsNyArMTE3NSw2IEBACiAKIAlpZiAoZG9fc3luYyB8fCAhbWRkZXYtPmJpdG1hcCB8fCAhcGx1Z2dlZCkKIAkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWRkZXYgKm1kZGV2KQpAQCAtMTM1NSw3ICsxMzUzLDcgQEAKIAkJc3RydWN0IG1pcnJvcl9pbmZvICpwID0gJmNvbmYtPm1pcnJvcnNbbWlycm9yXTsKIAkJaWYgKHAtPnJlY292ZXJ5X2Rpc2FibGVkID09IG1kZGV2LT5yZWNvdmVyeV9kaXNhYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXAtPnJkZXYpCisJCWlmIChwLT5yZGV2KQogCQkJY29udGludWU7CiAKIAkJZGlza19zdGFja19saW1pdHMobWRkZXYtPmdlbmRpc2ssIHJkZXYtPmJkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggZjZmZTA1My4uMjk3ZTI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC0zMTA5LDcgKzMxMTAsNyBAQAogCXN0cnVjdCByNWRldiAqcGRldiwgKnFkZXY7CiAKIAljbGVhcl9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoU1RSSVBFX0FDVElWRSwgJnNoLT5zdGF0ZSkpIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKFNUUklQRV9BQ1RJVkUsICZzaC0+c3RhdGUpKSB7CiAJCS8qIGFscmVhZHkgYmVpbmcgaGFuZGxlZCwgZW5zdXJlIGl0IGdldHMgaGFuZGxlZAogCQkgKiBhZ2FpbiB3aGVuIGN1cnJlbnQgYWN0aW9uIGZpbmlzaGVzICovCiAJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CkBAIC0zMTU4LDEwICszMTU5LDE0IEBACiAJLyogY2hlY2sgaWYgdGhlIGFycmF5IGhhcyBsb3N0IG1vcmUgdGhhbiBtYXhfZGVncmFkZWQgZGV2aWNlcyBhbmQsCiAJICogaWYgc28sIHNvbWUgcmVxdWVzdHMgbWlnaHQgbmVlZCB0byBiZSBmYWlsZWQuCiAJICovCi0JaWYgKHMuZmFpbGVkID4gY29uZi0+bWF4X2RlZ3JhZGVkICYmIHMudG9fcmVhZCtzLnRvX3dyaXRlK3Mud3JpdHRlbikKLQkJaGFuZGxlX2ZhaWxlZF9zdHJpcGUoY29uZiwgc2gsICZzLCBkaXNrcywgJnMucmV0dXJuX2JpKTsKLQlpZiAocy5mYWlsZWQgPiBjb25mLT5tYXhfZGVncmFkZWQgJiYgcy5zeW5jaW5nKQotCQloYW5kbGVfZmFpbGVkX3N5bmMoY29uZiwgc2gsICZzKTsKKwlpZiAocy5mYWlsZWQgPiBjb25mLT5tYXhfZGVncmFkZWQpIHsKKwkJc2gtPmNoZWNrX3N0YXRlID0gMDsKKwkJc2gtPnJlY29uc3RydWN0X3N0YXRlID0gMDsKKwkJaWYgKHMudG9fcmVhZCtzLnRvX3dyaXRlK3Mud3JpdHRlbikKKwkJCWhhbmRsZV9mYWlsZWRfc3RyaXBlKGNvbmYsIHNoLCAmcywgZGlza3MsICZzLnJldHVybl9iaSk7CisJCWlmIChzLnN5bmNpbmcpCisJCQloYW5kbGVfZmFpbGVkX3N5bmMoY29uZiwgc2gsICZzKTsKKwl9CiAKIAkvKgogCSAqIG1pZ2h0IGJlIGFibGUgdG8gcmV0dXJuIHNvbWUgd3JpdGUgcmVxdWVzdHMgaWYgdGhlIHBhcml0eSBibG9ja3MKQEAgLTMzNzAsNyArMzM3NSw3IEBACiAKIAlyZXR1cm5faW8ocy5yZXR1cm5fYmkpOwogCi0JY2xlYXJfYml0KFNUUklQRV9BQ1RJVkUsICZzaC0+c3RhdGUpOworCWNsZWFyX2JpdF91bmxvY2soU1RSSVBFX0FDVElWRSwgJnNoLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJhaWQ1X2FjdGl2YXRlX2RlbGF5ZWQoc3RydWN0IHI1Y29uZiAqY29uZikKQEAgLTM2ODgsNyArMzY5Myw3IEBACiAJcmV0dXJuIHNoOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgYmlvICogYmkpCitzdGF0aWMgdm9pZCBtYWtlX3JlcXVlc3Qoc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGJpbyAqIGJpKQogewogCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBtZGRldi0+cHJpdmF0ZTsKIAlpbnQgZGRfaWR4OwpAQCAtMzcwMSw3ICszNzA2LDcgQEAKIAogCWlmICh1bmxpa2VseShiaS0+YmlfcncgJiBSRVFfRkxVU0gpKSB7CiAJCW1kX2ZsdXNoX3JlcXVlc3QobWRkZXYsIGJpKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAltZF93cml0ZV9zdGFydChtZGRldiwgYmkpOwpAQCAtMzcwOSw3ICszNzE0LDcgQEAKIAlpZiAocncgPT0gUkVBRCAmJgogCSAgICAgbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPT0gTWF4U2VjdG9yICYmCiAJICAgICBjaHVua19hbGlnbmVkX3JlYWQobWRkZXYsYmkpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJbG9naWNhbF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7CiAJbGFzdF9zZWN0b3IgPSBiaS0+Ymlfc2VjdG9yICsgKGJpLT5iaV9zaXplPj45KTsKQEAgLTM4NDQsOCArMzg0OSw2IEBACiAKIAkJYmlvX2VuZGlvKGJpLCAwKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNlY3Rvcl90IHJhaWQ1X3NpemUoc3RydWN0IG1kZGV2ICptZGRldiwgc2VjdG9yX3Qgc2VjdG9ycywgaW50IHJhaWRfZGlza3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwppbmRleCA5YWYyMTQwLi5kNmIxY2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYwpAQCAtMTgsNyArMTgsMTAgQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogTElTVF9IRUFEKHNhYTcxNDZfZGV2aWNlcyk7CiBERUZJTkVfTVVURVgoc2FhNzE0Nl9kZXZpY2VzX2xvY2spOwpAQCAtMzUsMTAgKzM4LDkgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlJTkZPKCgiIEAgJWxpIGppZmZpZXM6XG4iLGppZmZpZXMpKTsKLQlmb3IoaSA9IDA7IGkgPD0gMHgxNDg7IGkrPTQpIHsKLQkJcHJpbnRrKCIweCUwM3g6IDB4JTA4eFxuIixpLHNhYTcxNDZfcmVhZChkZXYsaSkpOwotCX0KKwlwcl9pbmZvKCIgQCAlbGkgamlmZmllczpcbiIsIGppZmZpZXMpOworCWZvciAoaSA9IDA7IGkgPD0gMHgxNDg7IGkgKz0gNCkKKwkJcHJfaW5mbygiMHglMDN4OiAweCUwOHhcbiIsIGksIHNhYTcxNDZfcmVhZChkZXYsIGkpKTsKIH0KICNlbmRpZgogCkBAIC03Miw5ICs3NCw4IEBACiAJCWlmIChzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpICYgMikKIAkJCWJyZWFrOwogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgIgotCQkJCQkicmVnaXN0ZXJzIGdldHRpbmcgcHJvZ3JhbW1lZFxuIiwKLQkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgcmVnaXN0ZXJzIGdldHRpbmcgcHJvZ3JhbW1lZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCW1zbGVlcCgxKTsKQEAgLTg4LDggKzg5LDggQEAKIAkJCWJyZWFrOwogCQlzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpOwogCQlpZiAoZXJyKSB7Ci0JCQlERUJfUygoIiVzOiAlcyB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyBmb3IgdHJhbnNmZXIgIgotCQkJCSJjb21wbGV0aW9uXG4iLAlkZXYtPm5hbWUsIF9fZnVuY19fKSk7CisJCQlERUJfUygiJXM6ICVzIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciBjb21wbGV0aW9uXG4iLAorCQkJICAgICAgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQltc2xlZXAoMSk7CkBAIC0xMDksOSArMTEwLDggQEAKIAkJaWYgKHNhYTcxNDZfcmVhZChkZXYsIE1DMikgJiAyKQogCQkJYnJlYWs7CiAJCWlmICghbG9vcHMtLSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yICIKLQkJCQkJInJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIsCi0JCQkJCWRldi0+bmFtZSwgX19mdW5jX18pOworCQkJcHJfZXJyKCIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQl1ZGVsYXkoMSk7CkBAIC0xMjQsOCArMTI0LDggQEAKIAkJCWJyZWFrOwogCQlzYWE3MTQ2X3JlYWQoZGV2LCBNQzIpOwogCQlpZiAoIWxvb3BzLS0pIHsKLQkJCURFQl9TKCgiJXM6ICVzIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciAiCi0JCQkJImNvbXBsZXRpb25cbiIsIGRldi0+bmFtZSwgX19mdW5jX18pKTsKKwkJCURFQl9TKCIlczogJXMgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHRyYW5zZmVyIGNvbXBsZXRpb25cbiIsCisJCQkgICAgICBkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAJCXVkZWxheSg1KTsKQEAgLTI2NCw3ICsyNjQsOSBAQAogCXB0ciA9IHB0LT5jcHU7CiAJZm9yIChpID0gMDsgaSA8IHNnbGVuOyBpKyssIGxpc3QrKykgewogLyoKLQkJcHJpbnRrKCJpOiVkLCBhZHI6MHglMDh4LCBsZW46JWQsIG9mZnNldDolZFxuIiwgaSxzZ19kbWFfYWRkcmVzcyhsaXN0KSwgc2dfZG1hX2xlbihsaXN0KSwgbGlzdC0+b2Zmc2V0KTsKKwkJcHJfZGVidWcoImk6JWQsIGFkcjoweCUwOHgsIGxlbjolZCwgb2Zmc2V0OiVkXG4iLAorCQkJIGksIHNnX2RtYV9hZGRyZXNzKGxpc3QpLCBzZ19kbWFfbGVuKGxpc3QpLAorCQkJIGxpc3QtPm9mZnNldCk7CiAqLwogCQlmb3IgKHAgPSAwOyBwICogNDA5NiA8IGxpc3QtPmxlbmd0aDsgcCsrLCBwdHIrKykgewogCQkJKnB0ciA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKGxpc3QpICsgcCAqIDQwOTYpOwpAQCAtMjgxLDkgKzI4Myw5IEBACiAKIC8qCiAJcHRyID0gcHQtPmNwdTsKLQlwcmludGsoIm9mZnNldDogJWRcbiIscHQtPm9mZnNldCk7CisJcHJfZGVidWcoIm9mZnNldDogJWRcbiIsIHB0LT5vZmZzZXQpOwogCWZvcihpPTA7aTw1O2krKykgewotCQlwcmludGsoInB0cjEgJWQ6IDB4JTA4eFxuIixpLHB0cltpXSk7CisJCXByX2RlYnVnKCJwdHIxICVkOiAweCUwOHhcbiIsIGksIHB0cltpXSk7CiAJfQogKi8KIAlyZXR1cm4gMDsKQEAgLTMxNCw3ICszMTYsNyBAQAogCQl9CiAJfQogCWlmICgwICE9IChpc3IgJiAoTUFTS18yNykpKSB7Ci0JCURFQl9JTlQoKCJpcnE6IFJQUzAgKDB4JTA4eCkuXG4iLGlzcikpOworCQlERUJfSU5UKCJpcnE6IFJQUzAgKDB4JTA4eClcbiIsIGlzcik7CiAJCWlmIChkZXYtPnZ2X2RhdGEgJiYgZGV2LT52dl9jYWxsYmFjaykKIAkJCWRldi0+dnZfY2FsbGJhY2soZGV2LGlzcik7CiAJCWlzciAmPSB+TUFTS18yNzsKQEAgLTMzMywxNCArMzM1LDE1IEBACiAJCX0gZWxzZSB7CiAJCQl1MzIgcHNyID0gc2FhNzE0Nl9yZWFkKGRldiwgUFNSKTsKIAkJCXUzMiBzc3IgPSBzYWE3MTQ2X3JlYWQoZGV2LCBTU1IpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgaTJjIGlycTogaXNyICUwOHggcHNyICUwOHggc3NyICUwOHhcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBpc3IsIHBzciwgc3NyKTsKKwkJCXByX3dhcm4oIiVzOiB1bmV4cGVjdGVkIGkyYyBpcnE6IGlzciAlMDh4IHBzciAlMDh4IHNzciAlMDh4XG4iLAorCQkJCWRldi0+bmFtZSwgaXNyLCBwc3IsIHNzcik7CiAJCX0KIAkJaXNyICY9IH4oTUFTS18xNnxNQVNLXzE3KTsKIAl9CiAJaWYoIDAgIT0gaXNyICkgewotCQlFUlIoKCJ3YXJuaW5nOiBpbnRlcnJ1cHQgZW5hYmxlZCwgYnV0IG5vdCBoYW5kbGVkIHByb3Blcmx5LigweCUwOHgpXG4iLGlzcikpOwotCQlFUlIoKCJkaXNhYmxpbmcgaW50ZXJydXB0IHNvdXJjZShzKSFcbiIpKTsKKwkJRVJSKCJ3YXJuaW5nOiBpbnRlcnJ1cHQgZW5hYmxlZCwgYnV0IG5vdCBoYW5kbGVkIHByb3Blcmx5LigweCUwOHgpXG4iLAorCQkgICAgaXNyKTsKKwkJRVJSKCJkaXNhYmxpbmcgaW50ZXJydXB0IHNvdXJjZShzKSFcbiIpOwogCQlTQUE3MTQ2X0lFUl9ESVNBQkxFKGRldixpc3IpOwogCX0KIAlzYWE3MTQ2X3dyaXRlKGRldiwgSVNSLCBhY2tfaXNyKTsKQEAgLTM2MCwxNSArMzYzLDE1IEBACiAJLyogY2xlYXIgb3V0IG1lbSBmb3Igc3VyZSAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYWE3MTQ2X2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7Ci0JCUVSUigoIm91dCBvZiBtZW1vcnkuXG4iKSk7CisJCUVSUigib3V0IG9mIG1lbW9yeVxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCURFQl9FRSgoInBjaTolcFxuIixwY2kpKTsKKwlERUJfRUUoInBjaTolcFxuIiwgcGNpKTsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJaWYgKGVyciA8IDApIHsKLQkJRVJSKCgicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtMzg5LDcgKzM5Miw3IEBACiAJZGV2LT5tZW0gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApLAogCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2ksIDApKTsKIAlpZiAoIWRldi0+bWVtKSB7Ci0JCUVSUigoImlvcmVtYXAoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigiaW9yZW1hcCgpIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3JlbGVhc2U7CiAJfQpAQCAtNDE0LDcgKzQxNyw3IEBACiAJZXJyID0gcmVxdWVzdF9pcnEocGNpLT5pcnEsIGludGVycnVwdF9odywgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAogCQkJICBkZXYtPm5hbWUsIGRldik7CiAJaWYgKGVyciA8IDApIHsKLQkJRVJSKCgicmVxdWVzdF9pcnEoKSBmYWlsZWQuXG4iKSk7CisJCUVSUigicmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl91bm1hcDsKIAl9CiAKQEAgLTQ0NCw3ICs0NDcsOSBAQAogCS8qIGNyZWF0ZSBhIG5pY2UgZGV2aWNlIG5hbWUgKi8KIAlzcHJpbnRmKGRldi0+bmFtZSwgInNhYTcxNDYgKCVkKSIsIHNhYTcxNDZfbnVtKTsKIAotCUlORk8oKCJmb3VuZCBzYWE3MTQ2IEAgbWVtICVwIChyZXZpc2lvbiAlZCwgaXJxICVkKSAoMHglMDR4LDB4JTA0eCkuXG4iLCBkZXYtPm1lbSwgZGV2LT5yZXZpc2lvbiwgcGNpLT5pcnEsIHBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSk7CisJcHJfaW5mbygiZm91bmQgc2FhNzE0NiBAIG1lbSAlcCAocmV2aXNpb24gJWQsIGlycSAlZCkgKDB4JTA0eCwweCUwNHgpXG4iLAorCQlkZXYtPm1lbSwgZGV2LT5yZXZpc2lvbiwgcGNpLT5pcnEsCisJCXBjaS0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpLT5zdWJzeXN0ZW1fZGV2aWNlKTsKIAlkZXYtPmV4dCA9IGV4dDsKIAogCW11dGV4X2luaXQoJmRldi0+djRsMl9sb2NrKTsKQEAgLTQ2NCwxMiArNDY5LDEyIEBACiAJZXJyID0gLUVOT0RFVjsKIAogCWlmIChleHQtPnByb2JlICYmIGV4dC0+cHJvYmUoZGV2KSkgewotCQlERUJfRCgoImV4dC0+cHJvYmUoKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLGRldikpOworCQlERUJfRCgiZXh0LT5wcm9iZSgpIGZhaWxlZCBmb3IgJXAuIHNraXBwaW5nIGRldmljZS5cbiIsIGRldik7CiAJCWdvdG8gZXJyX2ZyZWVfaTJjOwogCX0KIAogCWlmIChleHQtPmF0dGFjaChkZXYsIHBjaV9leHQpKSB7Ci0JCURFQl9EKCgiZXh0LT5hdHRhY2goKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLGRldikpOworCQlERUJfRCgiZXh0LT5hdHRhY2goKSBmYWlsZWQgZm9yICVwLiBza2lwcGluZyBkZXZpY2UuXG4iLCBkZXYpOwogCQlnb3RvIGVycl9mcmVlX2kyYzsKIAl9CiAJLyogVjRMIGV4dGVuc2lvbnMgd2lsbCBzZXQgdGhlIHBjaSBkcnZkYXRhIHRvIHRoZSB2NGwyX2RldmljZSBpbiB0aGUKQEAgLTUyMSw3ICs1MjYsNyBAQAogCQl7IE5VTEwsIDAgfQogCX0sICpwOwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJZGV2LT5leHQtPmRldGFjaChkZXYpOwogCS8qIFplcm8gdGhlIFBDSSBkcnZkYXRhIGFmdGVyIHVzZS4gKi8KQEAgLTU1MiwyMSArNTU3LDIxIEBACiAKIGludCBzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb24qIGV4dCkKIHsKLQlERUJfRUUoKCJleHQ6JXBcbiIsZXh0KSk7CisJREVCX0VFKCJleHQ6JXBcbiIsIGV4dCk7CiAKIAlleHQtPmRyaXZlci5uYW1lID0gZXh0LT5uYW1lOwogCWV4dC0+ZHJpdmVyLmlkX3RhYmxlID0gZXh0LT5wY2lfdGJsOwogCWV4dC0+ZHJpdmVyLnByb2JlID0gc2FhNzE0Nl9pbml0X29uZTsKIAlleHQtPmRyaXZlci5yZW1vdmUgPSBzYWE3MTQ2X3JlbW92ZV9vbmU7CiAKLQlwcmludGsoInNhYTcxNDY6IHJlZ2lzdGVyIGV4dGVuc2lvbiAnJXMnLlxuIixleHQtPm5hbWUpOworCXByX2luZm8oInJlZ2lzdGVyIGV4dGVuc2lvbiAnJXMnXG4iLCBleHQtPm5hbWUpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZleHQtPmRyaXZlcik7CiB9CiAKIGludCBzYWE3MTQ2X3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiogZXh0KQogewotCURFQl9FRSgoImV4dDolcFxuIixleHQpKTsKLQlwcmludGsoInNhYTcxNDY6IHVucmVnaXN0ZXIgZXh0ZW5zaW9uICclcycuXG4iLGV4dC0+bmFtZSk7CisJREVCX0VFKCJleHQ6JXBcbiIsIGV4dCk7CisJcHJfaW5mbygidW5yZWdpc3RlciBleHRlbnNpb24gJyVzJ1xuIiwgZXh0LT5uYW1lKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmV4dC0+ZHJpdmVyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKaW5kZXggMWJkM2RkNy4uNzFmOGUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMKQEAgLTEsNCArMSw3IEBACisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogcmVzb3VyY2UgbWFuYWdlbWVudCBmdW5jdGlvbnMsIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNhYTcxMzQgZHJpdmVyICovCkBAIC05LDIxICsxMiwyMyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAogCWlmIChmaC0+cmVzb3VyY2VzICYgYml0KSB7Ci0JCURFQl9EKCgiYWxyZWFkeSBhbGxvY2F0ZWQhIHdhbnQ6IDB4JTAyeCwgY3VyOjB4JTAyeFxuIixiaXQsdnYtPnJlc291cmNlcykpOworCQlERUJfRCgiYWxyZWFkeSBhbGxvY2F0ZWQhIHdhbnQ6IDB4JTAyeCwgY3VyOjB4JTAyeFxuIiwKKwkJICAgICAgYml0LCB2di0+cmVzb3VyY2VzKTsKIAkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBpcyBpdCBmcmVlPyAqLwogCWlmICh2di0+cmVzb3VyY2VzICYgYml0KSB7Ci0JCURFQl9EKCgibG9ja2VkISB2di0+cmVzb3VyY2VzOjB4JTAyeCwgd2Ugd2FudDoweCUwMnhcbiIsdnYtPnJlc291cmNlcyxiaXQpKTsKKwkJREVCX0QoImxvY2tlZCEgdnYtPnJlc291cmNlczoweCUwMngsIHdlIHdhbnQ6MHglMDJ4XG4iLAorCQkgICAgICB2di0+cmVzb3VyY2VzLCBiaXQpOwogCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KIAkJcmV0dXJuIDA7CiAJfQogCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLwotCWZoLT5yZXNvdXJjZXMgIHw9IGJpdDsKKwlmaC0+cmVzb3VyY2VzIHw9IGJpdDsKIAl2di0+cmVzb3VyY2VzIHw9IGJpdDsKLQlERUJfRCgoInJlczogZ2V0IDB4JTAyeCwgY3VyOjB4JTAyeFxuIixiaXQsdnYtPnJlc291cmNlcykpOworCURFQl9EKCJyZXM6IGdldCAweCUwMngsIGN1cjoweCUwMnhcbiIsIGJpdCwgdnYtPnJlc291cmNlcyk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTM0LDkgKzM5LDkgQEAKIAogCUJVR19PTigoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpOwogCi0JZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CisJZmgtPnJlc291cmNlcyAmPSB+Yml0czsKIAl2di0+cmVzb3VyY2VzICY9IH5iaXRzOwotCURFQl9EKCgicmVzOiBwdXQgMHglMDJ4LCBjdXI6MHglMDJ4XG4iLGJpdHMsdnYtPnJlc291cmNlcykpOworCURFQl9EKCJyZXM6IHB1dCAweCUwMngsIGN1cjoweCUwMnhcbiIsIGJpdHMsIHZ2LT5yZXNvdXJjZXMpOwogfQogCiAKQEAgLTQ3LDcgKzUyLDcgQEAKIAkJCQkJCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmKQogewogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYT12aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOwotCURFQl9FRSgoImRldjolcCwgYnVmOiVwXG4iLGRldixidWYpKTsKKwlERUJfRUUoImRldjolcCwgYnVmOiVwXG4iLCBkZXYsIGJ1Zik7CiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCkBAIC02NiwxOCArNzEsMTkgQEAKIAkJCSBzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZikKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+c2xvY2spOwotCURFQl9FRSgoImRldjolcCwgZG1hcTolcCwgYnVmOiVwXG4iLCBkZXYsIHEsIGJ1ZikpOworCURFQl9FRSgiZGV2OiVwLCBkbWFxOiVwLCBidWY6JXBcbiIsIGRldiwgcSwgYnVmKTsKIAogCUJVR19PTighcSk7CiAKIAlpZiAoTlVMTCA9PSBxLT5jdXJyKSB7CiAJCXEtPmN1cnIgPSBidWY7Ci0JCURFQl9EKCgiaW1tZWRpYXRlbHkgYWN0aXZhdGluZyBidWZmZXIgJXBcbiIsIGJ1ZikpOworCQlERUJfRCgiaW1tZWRpYXRlbHkgYWN0aXZhdGluZyBidWZmZXIgJXBcbiIsIGJ1Zik7CiAJCWJ1Zi0+YWN0aXZhdGUoZGV2LGJ1ZixOVUxMKTsKIAl9IGVsc2UgewogCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5xdWV1ZSk7CiAJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCURFQl9EKCgiYWRkaW5nIGJ1ZmZlciAlcCB0byBxdWV1ZS4gKGFjdGl2ZSBidWZmZXIgcHJlc2VudClcbiIsIGJ1ZikpOworCQlERUJfRCgiYWRkaW5nIGJ1ZmZlciAlcCB0byBxdWV1ZS4gKGFjdGl2ZSBidWZmZXIgcHJlc2VudClcbiIsCisJCSAgICAgIGJ1Zik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODcsMTQgKzkzLDE0IEBACiAJCQkgICBpbnQgc3RhdGUpCiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPnNsb2NrKTsKLQlERUJfRUUoKCJkZXY6JXAsIGRtYXE6JXAsIHN0YXRlOiVkXG4iLCBkZXYsIHEsIHN0YXRlKSk7Ci0JREVCX0VFKCgicS0+Y3VycjolcFxuIixxLT5jdXJyKSk7CisJREVCX0VFKCJkZXY6JXAsIGRtYXE6JXAsIHN0YXRlOiVkXG4iLCBkZXYsIHEsIHN0YXRlKTsKKwlERUJfRUUoInEtPmN1cnI6JXBcbiIsIHEtPmN1cnIpOwogCiAJQlVHX09OKCFxLT5jdXJyKTsKIAogCS8qIGZpbmlzaCBjdXJyZW50IGJ1ZmZlciAqLwogCWlmIChOVUxMID09IHEtPmN1cnIpIHsKLQkJREVCX0QoKCJhaWlpLiBubyBjdXJyZW50IGJ1ZmZlclxuIikpOworCQlERUJfRCgiYWlpaS4gbm8gY3VycmVudCBidWZmZXJcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTIsNyArMTE4LDcgQEAKIAogCUJVR19PTighcSk7CiAKLQlERUJfSU5UKCgiZGV2OiVwLCBkbWFxOiVwLCB2Ymk6JWRcbiIsIGRldiwgcSwgdmJpKSk7CisJREVCX0lOVCgiZGV2OiVwLCBkbWFxOiVwLCB2Ymk6JWRcbiIsIGRldiwgcSwgdmJpKTsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT5zbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZSkpIHsKQEAgLTEyMiwxMCArMTI4LDExIEBACiAJCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWUpKQogCQkJbmV4dCA9IGxpc3RfZW50cnkocS0+cXVldWUubmV4dCxzdHJ1Y3Qgc2FhNzE0Nl9idWYsIHZiLnF1ZXVlKTsKIAkJcS0+Y3VyciA9IGJ1ZjsKLQkJREVCX0lOVCgoIm5leHQgYnVmZmVyOiBidWY6JXAsIHByZXY6JXAsIG5leHQ6JXBcbiIsIGJ1ZiwgcS0+cXVldWUucHJldixxLT5xdWV1ZS5uZXh0KSk7CisJCURFQl9JTlQoIm5leHQgYnVmZmVyOiBidWY6JXAsIHByZXY6JXAsIG5leHQ6JXBcbiIsCisJCQlidWYsIHEtPnF1ZXVlLnByZXYsIHEtPnF1ZXVlLm5leHQpOwogCQlidWYtPmFjdGl2YXRlKGRldixidWYsbmV4dCk7CiAJfSBlbHNlIHsKLQkJREVCX0lOVCgoIm5vIG5leHQgYnVmZmVyLiBzdG9wcGluZy5cbiIpKTsKKwkJREVCX0lOVCgibm8gbmV4dCBidWZmZXIuIHN0b3BwaW5nLlxuIik7CiAJCWlmKCAwICE9IHZiaSApIHsKIAkJCS8qIHR1cm4gb2ZmIHZpZGVvLWRtYTMgKi8KIAkJCXNhYTcxNDZfd3JpdGUoZGV2LE1DMSwgTUFTS18yMCk7CkBAIC0xNjIsMTEgKzE2OSwxMSBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gcS0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlERUJfRUUoKCJkZXY6JXAsIGRtYXE6JXBcbiIsIGRldiwgcSkpOworCURFQl9FRSgiZGV2OiVwLCBkbWFxOiVwXG4iLCBkZXYsIHEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOwogCWlmIChxLT5jdXJyKSB7Ci0JCURFQl9EKCgidGltZW91dCBvbiAlcFxuIiwgcS0+Y3VycikpOworCQlERUJfRCgidGltZW91dCBvbiAlcFxuIiwgcS0+Y3Vycik7CiAJCXNhYTcxNDZfYnVmZmVyX2ZpbmlzaChkZXYscSxWSURFT0JVRl9FUlJPUik7CiAJfQogCkBAIC0xOTQsMTIgKzIwMSwxMiBAQAogCiAJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CiAKLQlERUJfRUUoKCJmaWxlOiVwLCBkZXY6JXNcbiIsIGZpbGUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpKTsKKwlERUJfRUUoImZpbGU6JXAsIGRldjolc1xuIiwgZmlsZSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzYWE3MTQ2X2RldmljZXNfbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlERUJfRCgoInVzaW5nOiAlcFxuIixkZXYpKTsKKwlERUJfRCgidXNpbmc6ICVwXG4iLCBkZXYpOwogCiAJdHlwZSA9IHZkZXYtPnZmbF90eXBlID09IFZGTF9UWVBFX0dSQUJCRVIKIAkgICAgID8gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFCkBAIC0yMDcsNyArMjE0LDcgQEAKIAogCS8qIGNoZWNrIGlmIGFuIGV4dGVuc2lvbiBpcyByZWdpc3RlcmVkICovCiAJaWYoIE5VTEwgPT0gZGV2LT5leHQgKSB7Ci0JCURFQl9TKCgibm8gZXh0ZW5zaW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZGV2aWNlLlxuIikpOworCQlERUJfUygibm8gZXh0ZW5zaW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZGV2aWNlXG4iKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjE1LDcgKzIyMiw3IEBACiAJLyogYWxsb2NhdGUgcGVyIG9wZW4gZGF0YSAqLwogCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBmaCkgewotCQlERUJfUygoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBlciBvcGVuIGRhdGEuXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwZXIgb3BlbiBkYXRhXG4iKTsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjI1LDEzICsyMzIsMTMgQEAKIAlmaC0+dHlwZSA9IHR5cGU7CiAKIAlpZiggZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgewotCQlERUJfUygoImluaXRpYWxpemluZyB2YmkuLi5cbiIpKTsKKwkJREVCX1MoImluaXRpYWxpemluZyB2YmkuLi5cbiIpOwogCQlpZiAoZGV2LT5leHRfdnZfZGF0YS0+Y2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVkJJX0NBUFRVUkUpCiAJCQlyZXN1bHQgPSBzYWE3MTQ2X3ZiaV91b3BzLm9wZW4oZGV2LGZpbGUpOwogCQlpZiAoZGV2LT5leHRfdnZfZGF0YS0+dmJpX2ZvcHMub3BlbikKIAkJCWRldi0+ZXh0X3Z2X2RhdGEtPnZiaV9mb3BzLm9wZW4oZmlsZSk7CiAJfSBlbHNlIHsKLQkJREVCX1MoKCJpbml0aWFsaXppbmcgdmlkZW8uLi5cbiIpKTsKKwkJREVCX1MoImluaXRpYWxpemluZyB2aWRlby4uLlxuIik7CiAJCXJlc3VsdCA9IHNhYTcxNDZfdmlkZW9fdW9wcy5vcGVuKGRldixmaWxlKTsKIAl9CiAKQEAgLTI1OSw3ICsyNjYsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAotCURFQl9FRSgoImZpbGU6JXBcbiIsIGZpbGUpKTsKKwlERUJfRUUoImZpbGU6JXBcbiIsIGZpbGUpOwogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2FhNzE0Nl9kZXZpY2VzX2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwpAQCAtMjg5LDEyICsyOTYsMTQgQEAKIAogCXN3aXRjaCAoZmgtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogewotCQlERUJfRUUoKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIixmaWxlLCB2bWEpKTsKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIiwKKwkJICAgICAgIGZpbGUsIHZtYSk7CiAJCXEgPSAmZmgtPnZpZGVvX3E7CiAJCWJyZWFrOwogCQl9CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOiB7Ci0JCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIHZtYTolcFxuIixmaWxlLCB2bWEpKTsKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOiBmaWxlOiVwLCB2bWE6JXBcbiIsCisJCSAgICAgICBmaWxlLCB2bWEpOwogCQlxID0gJmZoLT52YmlfcTsKIAkJYnJlYWs7CiAJCX0KQEAgLTMxMiwxNCArMzIxLDE0IEBACiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqYnVmID0gTlVMTDsKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnE7CiAKLQlERUJfRUUoKCJmaWxlOiVwLCBwb2xsOiVwXG4iLGZpbGUsIHdhaXQpKTsKKwlERUJfRUUoImZpbGU6JXAsIHBvbGw6JXBcbiIsIGZpbGUsIHdhaXQpOwogCiAJaWYgKFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgPT0gZmgtPnR5cGUpIHsKIAkJaWYoIDAgPT0gZmgtPnZiaV9xLnN0cmVhbWluZyApCiAJCQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52YmlfcSwgd2FpdCk7CiAJCXEgPSAmZmgtPnZiaV9xOwogCX0gZWxzZSB7Ci0JCURFQl9EKCgidXNpbmcgdmlkZW8gcXVldWUuXG4iKSk7CisJCURFQl9EKCJ1c2luZyB2aWRlbyBxdWV1ZVxuIik7CiAJCXEgPSAmZmgtPnZpZGVvX3E7CiAJfQogCkBAIC0zMjcsMTcgKzMzNiwxNyBAQAogCQlidWYgPSBsaXN0X2VudHJ5KHEtPnN0cmVhbS5uZXh0LCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBzdHJlYW0pOwogCiAJaWYgKCFidWYpIHsKLQkJREVCX0QoKCJidWYgPT0gTlVMTCFcbiIpKTsKKwkJREVCX0QoImJ1ZiA9PSBOVUxMIVxuIik7CiAJCXJldHVybiBQT0xMRVJSOwogCX0KIAogCXBvbGxfd2FpdChmaWxlLCAmYnVmLT5kb25lLCB3YWl0KTsKIAlpZiAoYnVmLT5zdGF0ZSA9PSBWSURFT0JVRl9ET05FIHx8IGJ1Zi0+c3RhdGUgPT0gVklERU9CVUZfRVJST1IpIHsKLQkJREVCX0QoKCJwb2xsIHN1Y2NlZWRlZCFcbiIpKTsKKwkJREVCX0QoInBvbGwgc3VjY2VlZGVkIVxuIik7CiAJCXJldHVybiBQT0xMSU58UE9MTFJETk9STTsKIAl9CiAKLQlERUJfRCgoIm5vdGhpbmcgdG8gcG9sbCBmb3IsIGJ1Zi0+c3RhdGU6JWRcbiIsYnVmLT5zdGF0ZSkpOworCURFQl9EKCJub3RoaW5nIHRvIHBvbGwgZm9yLCBidWYtPnN0YXRlOiVkXG4iLCBidWYtPnN0YXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ2LDE4ICszNTUsMjAgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IHsKLS8vCQlERUJfRUUoKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdW4iLCBmaWxlLCBkYXRhLCAodW5zaWduZWQgbG9uZyljb3VudCkpOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorLyoKKwkJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdW4iLAorCQkgICAgICAgZmlsZSwgZGF0YSwgKHVuc2lnbmVkIGxvbmcpY291bnQpOworKi8KIAkJcmV0dXJuIHNhYTcxNDZfdmlkZW9fdW9wcy5yZWFkKGZpbGUsZGF0YSxjb3VudCxwcG9zKTsKLQkJfQotCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRTogewotLy8JCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdVxuIiwgZmlsZSwgZGF0YSwgKHVuc2lnbmVkIGxvbmcpY291bnQpKTsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisvKgorCQlERUJfRUUoIlY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6IGZpbGU6JXAsIGRhdGE6JXAsIGNvdW50OiVsdVxuIiwKKwkJICAgICAgIGZpbGUsIGRhdGEsICh1bnNpZ25lZCBsb25nKWNvdW50KTsKKyovCiAJCWlmIChmaC0+ZGV2LT5leHRfdnZfZGF0YS0+Y2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVkJJX0NBUFRVUkUpCiAJCQlyZXR1cm4gc2FhNzE0Nl92YmlfdW9wcy5yZWFkKGZpbGUsZGF0YSxjb3VudCxwcG9zKTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7CisJCXJldHVybiAtRUlOVkFMOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm4gMDsKQEAgLTM5OCwyMiArNDA5LDIyIEBACiB7CiAJdTMyIGlzciA9IHN0YXR1czsKIAotCURFQl9JTlQoKCJkZXY6JXAsIGlzcjoweCUwOHhcbiIsZGV2LCh1MzIpc3RhdHVzKSk7CisJREVCX0lOVCgiZGV2OiVwLCBpc3I6MHglMDh4XG4iLCBkZXYsICh1MzIpc3RhdHVzKTsKIAogCWlmICgwICE9IChpc3IgJiAoTUFTS18yNykpKSB7Ci0JCURFQl9JTlQoKCJpcnE6IFJQUzAgKDB4JTA4eCkuXG4iLGlzcikpOworCQlERUJfSU5UKCJpcnE6IFJQUzAgKDB4JTA4eClcbiIsIGlzcik7CiAJCXNhYTcxNDZfdmlkZW9fdW9wcy5pcnFfZG9uZShkZXYsaXNyKTsKIAl9CiAKIAlpZiAoMCAhPSAoaXNyICYgKE1BU0tfMjgpKSkgewogCQl1MzIgbWMyID0gc2FhNzE0Nl9yZWFkKGRldiwgTUMyKTsKIAkJaWYoIDAgIT0gKG1jMiAmIE1BU0tfMTUpKSB7Ci0JCQlERUJfSU5UKCgiaXJxOiBSUFMxIHZiaSB3b3JrYXJvdW5kICgweCUwOHgpLlxuIixpc3IpKTsKKwkJCURFQl9JTlQoImlycTogUlBTMSB2Ymkgd29ya2Fyb3VuZCAoMHglMDh4KVxuIiwgaXNyKTsKIAkJCXdha2VfdXAoJmRldi0+dnZfZGF0YS0+dmJpX3dxKTsKIAkJCXNhYTcxNDZfd3JpdGUoZGV2LE1DMiwgTUFTS18zMSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJREVCX0lOVCgoImlycTogUlBTMSAoMHglMDh4KS5cbiIsaXNyKSk7CisJCURFQl9JTlQoImlycTogUlBTMSAoMHglMDh4KVxuIiwgaXNyKTsKIAkJc2FhNzE0Nl92YmlfdW9wcy5pcnFfZG9uZShkZXYsaXNyKTsKIAl9CiB9CkBAIC00MjksMTMgKzQ0MCwxMyBAQAogCiAJdnYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FhNzE0Nl92diksIEdGUF9LRVJORUwpOwogCWlmICh2diA9PSBOVUxMKSB7Ci0JCUVSUigoIm91dCBvZiBtZW1vcnkuIGFib3J0aW5nLlxuIikpOworCQlFUlIoIm91dCBvZiBtZW1vcnkuIGFib3J0aW5nLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlleHRfdnYtPm9wcyA9IHNhYTcxNDZfdmlkZW9faW9jdGxfb3BzOwogCWV4dF92di0+Y29yZV9vcHMgPSAmc2FhNzE0Nl92aWRlb19pb2N0bF9vcHM7CiAKLQlERUJfRUUoKCJkZXY6JXBcbiIsZGV2KSk7CisJREVCX0VFKCJkZXY6JXBcbiIsIGRldik7CiAKIAkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIHZpZGVvIHBhcnRzIG9mIHRoZSBzYWE3MTQ2ICovCiAJc2FhNzE0Nl93cml0ZShkZXYsIEJDU19DVFJMLCAweDgwNDAwMDQwKTsKQEAgLTQ1MCw3ICs0NjEsNyBAQAogCiAJdnYtPmRfY2xpcHBpbmcuY3B1X2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBjaSwgU0FBNzE0Nl9DTElQUElOR19NRU0sICZ2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlKTsKIAlpZiggTlVMTCA9PSB2di0+ZF9jbGlwcGluZy5jcHVfYWRkciApIHsKLQkJRVJSKCgib3V0IG9mIG1lbW9yeS4gYWJvcnRpbmcuXG4iKSk7CisJCUVSUigib3V0IG9mIG1lbW9yeS4gYWJvcnRpbmcuXG4iKTsKIAkJa2ZyZWUodnYpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNDcxLDcgKzQ4Miw3IEBACiB7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBjaSwgU0FBNzE0Nl9DTElQUElOR19NRU0sIHZ2LT5kX2NsaXBwaW5nLmNwdV9hZGRyLCB2di0+ZF9jbGlwcGluZy5kbWFfaGFuZGxlKTsKQEAgLTQ5MCw3ICs1MDEsNyBAQAogCWludCBlcnI7CiAJaW50IGk7CiAKLQlERUJfRUUoKCJkZXY6JXAsIG5hbWU6JyVzJywgdHlwZTolZFxuIixkZXYsbmFtZSx0eXBlKSk7CisJREVCX0VFKCJkZXY6JXAsIG5hbWU6JyVzJywgdHlwZTolZFxuIiwgZGV2LCBuYW1lLCB0eXBlKTsKIAogCS8vIHJlbGVhc2VkIGJ5IHZmZC0+cmVsZWFzZQogCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwpAQCAtNTA5LDEzICs1MjAsMTMgQEAKIAogCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIHR5cGUsIC0xKTsKIAlpZiAoZXJyIDwgMCkgewotCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlFUlIoImNhbm5vdCByZWdpc3RlciB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmZkKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlJTkZPKCgiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzIFt2NGwyXVxuIiwKLQkJZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZmZCkpKTsKKwlwcl9pbmZvKCIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXMgW3Y0bDJdXG4iLAorCQlkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmZkKSk7CiAKIAkqdmlkID0gdmZkOwogCXJldHVybiAwOwpAQCAtNTI0LDcgKzUzNSw3IEBACiAKIGludCBzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKip2aWQsIHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2KQogewotCURFQl9FRSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCp2aWQpOwogCSp2aWQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMKaW5kZXggMWQxZDhkMi4uYmMxZjU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2hscC5jCkBAIC0xLDQgKzEsNyBAQAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgogCiBzdGF0aWMgdm9pZCBjYWxjdWxhdGVfb3V0cHV0X2Zvcm1hdF9yZWdpc3RlcihzdHJ1Y3Qgc2FhNzE0Nl9kZXYqIHNhYSwgdTMyIHBhbGV0dGUsIHUzMiogY2xpcF9mb3JtYXQpCkBAIC03MTEsOCArNzE0LDggQEAKIAogCWludCBkZXB0aCA9IHNmbXQtPmRlcHRoOwogCi0JREVCX0NBUCgoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCi0JCXdpZHRoLGhlaWdodCx2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSkpOworCURFQl9DQVAoIltzaXplPSVkeCVkLGZpZWxkcz0lc11cbiIsCisJCXdpZHRoLCBoZWlnaHQsIHY0bDJfZmllbGRfbmFtZXNbZmllbGRdKTsKIAogCWlmKCBieXRlc3BlcmxpbmUgIT0gMCkgewogCQl2ZG1hMS5waXRjaCA9IGJ5dGVzcGVybGluZSoyOwpAQCAtODM3LDggKzg0MCw4IEBACiAJQlVHX09OKDAgPT0gYnVmLT5wdFsxXS5kbWEpOwogCUJVR19PTigwID09IGJ1Zi0+cHRbMl0uZG1hKTsKIAotCURFQl9DQVAoKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAotCQl3aWR0aCxoZWlnaHQsdjRsMl9maWVsZF9uYW1lc1tmaWVsZF0pKTsKKwlERUJfQ0FQKCJbc2l6ZT0lZHglZCxmaWVsZHM9JXNdXG4iLAorCQl3aWR0aCwgaGVpZ2h0LCB2NGwyX2ZpZWxkX25hbWVzW2ZpZWxkXSk7CiAKIAkvKiBmaXhtZTogbG9vayBhdCBieXRlc3BlcmxpbmUhICovCiAKQEAgLTk5OCwxMiArMTAwMSwxMiBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAl1MzIgdmRtYTFfcHJvdF9hZGRyOwogCi0JREVCX0NBUCgoImJ1ZjolcCwgbmV4dDolcFxuIixidWYsbmV4dCkpOworCURFQl9DQVAoImJ1ZjolcCwgbmV4dDolcFxuIiwgYnVmLCBuZXh0KTsKIAogCXZkbWExX3Byb3RfYWRkciA9IHNhYTcxNDZfcmVhZChkZXYsIFBST1RfQUREUjEpOwogCWlmKCAwID09IHZkbWExX3Byb3RfYWRkciApIHsKIAkJLyogY2xlYXIgb3V0IGJlZ2lubmluZyBvZiBzdHJlYW1pbmcgYml0IChycHMgcmVnaXN0ZXIgMCkqLwotCQlERUJfQ0FQKCgiZm9yY2luZyBzeW5jIHRvIG5ldyBmcmFtZVxuIikpOworCQlERUJfQ0FQKCJmb3JjaW5nIHN5bmMgdG8gbmV3IGZyYW1lXG4iKTsKIAkJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgTUFTS18yNyApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKaW5kZXggYjJiYTlkYy4uMjIwMjcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCkBAIC0xLDggKzEsMTAgQEAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KIAogc3RhdGljIHUzMiBzYWE3MTQ2X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKLS8vZm0JREVCX0kyQygoIiclcycuXG4iLCBhZGFwdGVyLT5uYW1lKSk7CisJLyogREVCX0kyQygiJyVzJ1xuIiwgYWRhcHRlci0+bmFtZSk7ICovCiAKIAlyZXR1cm4JICBJMkNfRlVOQ19JMkMKIAkJfCBJMkNfRlVOQ19TTUJVU19RVUlDSwpAQCAtMTQsOSArMTYsNyBAQAogc3RhdGljIGlubGluZSB1MzIgc2FhNzE0Nl9pMmNfc3RhdHVzKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQogewogCXUzMiBpaWNzdGEgPSBzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKTsKLS8qCi0JREVCX0kyQygoInN0YXR1czogMHglMDh4XG4iLGlpY3N0YSkpOwotKi8KKwkvKiBERUJfSTJDKCJzdGF0dXM6IDB4JTA4eFxuIiwgaWljc3RhKTsgKi8KIAlyZXR1cm4gaWljc3RhOwogfQogCkBAIC0zOSwxMCArMzksMTEgQEAKIAkgICBwbHVzIG9uZSBleHRyYSBieXRlIHRvIGFkZHJlc3MgdGhlIGRldmljZSAqLwogCW1lbSA9IDEgKyAoKG1lbS0xKSAvIDMpOwogCi0JLyogd2UgYXNzdW1lIHRoYXQgb3AgcG9pbnRzIHRvIGEgbWVtb3J5IG9mIGF0IGxlYXN0IFNBQTcxNDZfSTJDX01FTSBieXRlcwotCSAgIHNpemUuIGlmIHdlIGV4Y2VlZCB0aGlzIGxpbWl0Li4uICovCi0JaWYgKCAoNCptZW0pID4gU0FBNzE0Nl9JMkNfTUVNICkgewotLy9mbQkJREVCX0kyQygoImNhbm5vdCBwcmVwYXJlIGkyYy1tZXNzYWdlLlxuIikpOworCS8qIHdlIGFzc3VtZSB0aGF0IG9wIHBvaW50cyB0byBhIG1lbW9yeSBvZiBhdCBsZWFzdAorCSAqIFNBQTcxNDZfSTJDX01FTSBieXRlcyBzaXplLiBpZiB3ZSBleGNlZWQgdGhpcyBsaW1pdC4uLgorCSAqLworCWlmICgoNCAqIG1lbSkgPiBTQUE3MTQ2X0kyQ19NRU0pIHsKKwkJLyogREVCX0kyQygiY2Fubm90IHByZXBhcmUgaTJjLW1lc3NhZ2VcbiIpOyAqLwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEyMyw3ICsxMjQsNyBAQAogCWlmICggMCAhPSAoIHN0YXR1cyAmIFNBQTcxNDZfSTJDX0JVU1kpICkgewogCiAJCS8qIHllcywga2lsbCBvbmdvaW5nIG9wZXJhdGlvbiAqLwotCQlERUJfSTJDKCgiYnVzeV9zdGF0ZSBkZXRlY3RlZC5cbiIpKTsKKwkJREVCX0kyQygiYnVzeV9zdGF0ZSBkZXRlY3RlZFxuIik7CiAKIAkJLyogc2V0ICJBQk9SVC1PUEVSQVRJT04iLWJpdCAoYml0IDcpKi8KIAkJc2FhNzE0Nl93cml0ZShkZXYsIEkyQ19TVEFUVVMsIChkZXYtPmkyY19iaXRyYXRlIHwgTUFTS18wNykpOwpAQCAtMTQxLDcgKzE0Miw3IEBACiAKIAlpZiAoIGRldi0+aTJjX2JpdHJhdGUgIT0gc3RhdHVzICkgewogCi0JCURFQl9JMkMoKCJlcnJvcl9zdGF0ZSBkZXRlY3RlZC4gc3RhdHVzOjB4JTA4eFxuIixzdGF0dXMpKTsKKwkJREVCX0kyQygiZXJyb3Jfc3RhdGUgZGV0ZWN0ZWQuIHN0YXR1czoweCUwOHhcbiIsIHN0YXR1cyk7CiAKIAkJLyogUmVwZWF0IHRoZSBhYm9ydCBvcGVyYXRpb24uIFRoaXMgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5CiAJCSAgIGFmdGVyIHNlcmlvdXMgcHJvdG9jb2wgZXJyb3JzIGNhdXNlZCBieSBlLmcuIHRoZSBTQUE3NzQwICovCkBAIC0xNjQsNyArMTY1LDcgQEAKIAkvKiBpZiBhbnkgZXJyb3IgaXMgc3RpbGwgcHJlc2VudCwgYSBmYXRhbCBlcnJvciBoYXMgb2NjdXJyZWQgLi4uICovCiAJc3RhdHVzID0gc2FhNzE0Nl9pMmNfc3RhdHVzKGRldik7CiAJaWYgKCBkZXYtPmkyY19iaXRyYXRlICE9IHN0YXR1cyApIHsKLQkJREVCX0kyQygoImZhdGFsIGVycm9yLiBzdGF0dXM6MHglMDh4XG4iLHN0YXR1cykpOworCQlERUJfSTJDKCJmYXRhbCBlcnJvci4gc3RhdHVzOjB4JTA4eFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTgxLDcgKzE4Miw4IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJLyogd3JpdGUgb3V0IGkyYy1jb21tYW5kICovCi0JREVCX0kyQygoImJlZm9yZTogMHglMDh4IChzdGF0dXM6IDB4JTA4eCksICVkXG4iLCpkd29yZCxzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKSwgZGV2LT5pMmNfb3ApKTsKKwlERUJfSTJDKCJiZWZvcmU6IDB4JTA4eCAoc3RhdHVzOiAweCUwOHgpLCAlZFxuIiwKKwkJKmR3b3JkLCBzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKSwgZGV2LT5pMmNfb3ApOwogCiAJaWYoIDAgIT0gKFNBQTcxNDZfVVNFX0kyQ19JUlEgJiBkZXYtPmV4dC0+ZmxhZ3MpKSB7CiAKQEAgLTIwMiw3ICsyMDQsNyBAQAogCQkJCS8qIGEgc2lnbmFsIGFycml2ZWQgKi8KIAkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlcyBbaXJxXTogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGVuZCBvZiB4ZmVyXG4iLAorCQkJcHJfd2FybigiJXMgJXMgW2lycV06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKIAkJCQlkZXYtPm5hbWUsIF9fZnVuY19fKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC0yMjAsNyArMjIyLDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsdGltZW91dCkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIE1DMlxuIiwKKwkJCQlwcl93YXJuKCIlcyAlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIE1DMlxuIiwKIAkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0yMzcsNyArMjM5LDcgQEAKIAkJCQkvKiB0aGlzIGlzIG5vcm1hbCB3aGVuIHByb2JpbmcgdGhlIGJ1cwogCQkJCSAqIChubyBhbnN3ZXIgZnJvbSBub25leGlzaXN0YW50IGRldmljZS4uLikKIAkJCQkgKi8KLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlcyBbcG9sbF06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKKwkJCQlwcl93YXJuKCIlcyAlcyBbcG9sbF06IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIiwKIAkJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0yNTcsMjQgKzI1OSwyNCBAQAogCQlpZiAoIDAgPT0gKHN0YXR1cyAmIFNBQTcxNDZfSTJDX0VSUikgfHwKIAkJICAgICAwID09IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19CVVNZKSApIHsKIAkJCS8qIGl0IG1heSB0YWtlIHNvbWUgdGltZSB1bnRpbCBFUlIgZ29lcyBoaWdoIC0gaWdub3JlICovCi0JCQlERUJfSTJDKCgidW5leHBlY3RlZCBpMmMgc3RhdHVzICUwNHhcbiIsIHN0YXR1cykpOworCQkJREVCX0kyQygidW5leHBlY3RlZCBpMmMgc3RhdHVzICUwNHhcbiIsIHN0YXR1cyk7CiAJCX0KIAkJaWYoIDAgIT0gKHN0YXR1cyAmIFNBQTcxNDZfSTJDX1NQRVJSKSApIHsKLQkJCURFQl9JMkMoKCJlcnJvciBkdWUgdG8gaW52YWxpZCBzdGFydC9zdG9wIGNvbmRpdGlvbi5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIGR1ZSB0byBpbnZhbGlkIHN0YXJ0L3N0b3AgY29uZGl0aW9uXG4iKTsKIAkJfQogCQlpZiggMCAhPSAoc3RhdHVzICYgU0FBNzE0Nl9JMkNfRFRFUlIpICkgewotCQkJREVCX0kyQygoImVycm9yIGluIGRhdGEgdHJhbnNtaXNzaW9uLlxuIikpOworCQkJREVCX0kyQygiZXJyb3IgaW4gZGF0YSB0cmFuc21pc3Npb25cbiIpOwogCQl9CiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19EUkVSUikgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3Igd2hlbiByZWNlaXZpbmcgZGF0YS5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIHdoZW4gcmVjZWl2aW5nIGRhdGFcbiIpOwogCQl9CiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19BTCkgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3IgYmVjYXVzZSBhcmJpdHJhdGlvbiBsb3N0LlxuIikpOworCQkJREVCX0kyQygiZXJyb3IgYmVjYXVzZSBhcmJpdHJhdGlvbiBsb3N0XG4iKTsKIAkJfQogCiAJCS8qIHdlIGhhbmRsZSBhZGRyZXNzLWVycm9ycyBoZXJlICovCiAJCWlmKCAwICE9IChzdGF0dXMgJiBTQUE3MTQ2X0kyQ19BUEVSUikgKSB7Ci0JCQlERUJfSTJDKCgiZXJyb3IgaW4gYWRkcmVzcyBwaGFzZS5cbiIpKTsKKwkJCURFQl9JMkMoImVycm9yIGluIGFkZHJlc3MgcGhhc2VcbiIpOwogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJCX0KIApAQCAtMjg0LDcgKzI4Niw3IEBACiAJLyogcmVhZCBiYWNrIGRhdGEsIGp1c3QgaW4gY2FzZSB3ZSB3ZXJlIHJlYWRpbmcgLi4uICovCiAJKmR3b3JkID0gY3B1X3RvX2xlMzIoc2FhNzE0Nl9yZWFkKGRldiwgSTJDX1RSQU5TRkVSKSk7CiAKLQlERUJfSTJDKCgiYWZ0ZXI6IDB4JTA4eFxuIiwqZHdvcmQpKTsKKwlERUJfSTJDKCJhZnRlcjogMHglMDh4XG4iLCAqZHdvcmQpOwogCXJldHVybiAwOwogfQogCkBAIC0yOTksNyArMzAxLDcgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWZvcihpPTA7aTxudW07aSsrKSB7Ci0JCURFQl9JMkMoKCJtc2c6JWQvJWRcbiIsaSsxLG51bSkpOworCQlERUJfSTJDKCJtc2c6JWQvJWRcbiIsIGkrMSwgbnVtKTsKIAl9CiAKIAkvKiBwcmVwYXJlIHRoZSBtZXNzYWdlKHMpLCBnZXQgbnVtYmVyIG9mIHUzMnMgdG8gdHJhbnNmZXIgKi8KQEAgLTMxNiw3ICszMTgsNyBAQAogCQkvKiByZXNldCB0aGUgaTJjLWRldmljZSBpZiBuZWNlc3NhcnkgKi8KIAkJZXJyID0gc2FhNzE0Nl9pMmNfcmVzZXQoZGV2KTsKIAkJaWYgKCAwID4gZXJyICkgewotCQkJREVCX0kyQygoImNvdWxkIG5vdCByZXNldCBpMmMtZGV2aWNlLlxuIikpOworCQkJREVCX0kyQygiY291bGQgbm90IHJlc2V0IGkyYy1kZXZpY2VcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMzM2LDcgKzMzOCw3IEBACiAJCQkJICAgYWRkcmVzcyBlcnJvciBhbmQgdHJ1c3QgdGhlIHNhYTcxNDYgYWRkcmVzcyBlcnJvciBkZXRlY3Rpb24uICovCiAJCQkJaWYgKC1FUkVNT1RFSU8gPT0gZXJyICYmIDAgIT0gKFNBQTcxNDZfVVNFX0kyQ19JUlEgJiBkZXYtPmV4dC0+ZmxhZ3MpKQogCQkJCQlnb3RvIG91dDsKLQkJCQlERUJfSTJDKCgiZXJyb3Igd2hpbGUgc2VuZGluZyBtZXNzYWdlKHMpLiBzdGFydGluZyBhZ2Fpbi5cbiIpKTsKKwkJCQlERUJfSTJDKCJlcnJvciB3aGlsZSBzZW5kaW5nIG1lc3NhZ2UocykuIHN0YXJ0aW5nIGFnYWluXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzU2LDEzICszNTgsMTMgQEAKIAogCS8qIGlmIGFueSB0aGluZ3MgaGFkIHRvIGJlIHJlYWQsIGdldCB0aGUgcmVzdWx0cyAqLwogCWlmICggMCAhPSBzYWE3MTQ2X2kyY19tc2dfY2xlYW51cChtc2dzLCBudW0sIGJ1ZmZlcikpIHsKLQkJREVCX0kyQygoImNvdWxkIG5vdCBjbGVhbnVwIGkyYy1tZXNzYWdlLlxuIikpOworCQlERUJfSTJDKCJjb3VsZCBub3QgY2xlYW51cCBpMmMtbWVzc2FnZVxuIik7CiAJCWVyciA9IC0xOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiByZXR1cm4gdGhlIG51bWJlciBvZiBkZWxpdmVyZWQgbWVzc2FnZXMgKi8KLQlERUJfSTJDKCgidHJhbnNtaXNzaW9uIHN1Y2Nlc3NmdWwuIChtc2c6JWQpLlxuIixlcnIpKTsKKwlERUJfSTJDKCJ0cmFuc21pc3Npb24gc3VjY2Vzc2Z1bC4gKG1zZzolZClcbiIsIGVycik7CiBvdXQ6CiAJLyogYW5vdGhlciBidWcgaW4gcmV2aXNpb24gMDogdGhlIGkyYy1yZWdpc3RlcnMgZ2V0IHVwbG9hZGVkIHJhbmRvbWx5IGJ5IG90aGVyCiAJICAgdXBsb2Fkcywgc28gd2UgYmV0dGVyIGNsZWFyIHRoZW0gb3V0IGJlZm9yZSBjb250aW51aW5nICovCkBAIC0zNzAsNyArMzcyLDcgQEAKIAkJX19sZTMyIHplcm8gPSAwOwogCQlzYWE3MTQ2X2kyY19yZXNldChkZXYpOwogCQlpZiggMCAhPSBzYWE3MTQ2X2kyY193cml0ZW91dChkZXYsICZ6ZXJvLCBzaG9ydF9kZWxheSkpIHsKLQkJCUlORk8oKCJyZXZpc2lvbiAwIGVycm9yLiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iKSk7CisJCQlwcl9pbmZvKCJyZXZpc2lvbiAwIGVycm9yLiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpOwogCQl9CiAJfQogCkBAIC00MDAsNyArNDAyLDcgQEAKIAogaW50IHNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcHRlciwgdTMyIGJpdHJhdGUpCiB7Ci0JREVCX0VFKCgiYml0cmF0ZTogMHglMDh4XG4iLGJpdHJhdGUpKTsKKwlERUJfRUUoImJpdHJhdGU6IDB4JTA4eFxuIiwgYml0cmF0ZSk7CiAKIAkvKiBlbmFibGUgaTJjLXBvcnQgcGlucyAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzEsIChNQVNLXzA4IHwgTUFTS18yNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmJpLmMKaW5kZXggYWZlODU4MC4uYjJlNzE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92YmkuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZiaS5jCkBAIC0xNCw3ICsxNCw3IEBACiAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAotCURFQl9WQkkoKCJkZXY6JXBcbiIsZGV2KSk7CisJREVCX1ZCSSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJLyogb25jZSBhZ2FpbiwgYSBidWcgaW4gdGhlIHNhYTcxNDY6IHRoZSBicnMgYWNxdWlzaXRpb24KIAkgICBpcyBidWdneSBhbmQgZXNwZWNpYWxseSB0aGUgQlhPLWNvdW50ZXIgZG9lcyBub3Qgd29yawpAQCAtNDAsMTQgKzQwLDE0IEBACiAJV1JJVEVfUlBTMSgweGMwMDAwMDhjKTsKIAkvKiB3YWl0IGZvciB2YmlfYSBvciB2YmlfYiovCiAJaWYgKCAwICE9IChTQUE3MTQ2X1VTRV9QT1JUX0JfRk9SX1ZCSSAmIGRldi0+ZXh0X3Z2X2RhdGEtPmZsYWdzKSkgewotCQlERUJfRCgoIi4uLnVzaW5nIHBvcnQgYlxuIikpOworCQlERUJfRCgiLi4udXNpbmcgcG9ydCBiXG4iKTsKIAkJV1JJVEVfUlBTMShDTURfUEFVU0UgfCBDTURfT0FOIHwgQ01EX1NJRzEgfCBDTURfRV9GSURfQik7CiAJCVdSSVRFX1JQUzEoQ01EX1BBVVNFIHwgQ01EX09BTiB8IENNRF9TSUcxIHwgQ01EX09fRklEX0IpOwogLyoKIAkJV1JJVEVfUlBTMShDTURfUEFVU0UgfCBNQVNLXzA5KTsKICovCiAJfSBlbHNlIHsKLQkJREVCX0QoKCIuLi51c2luZyBwb3J0IGFcbiIpKTsKKwkJREVCX0QoIi4uLnVzaW5nIHBvcnQgYVxuIik7CiAJCVdSSVRFX1JQUzEoQ01EX1BBVVNFIHwgTUFTS18xMCk7CiAJfQogCS8qIHVwbG9hZCBicnMgKi8KQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAJCXNjaGVkdWxlKCk7CiAKLQkJREVCX1ZCSSgoImJycyBidWcgd29ya2Fyb3VuZCAlZC8xLlxuIixpKSk7CisJCURFQl9WQkkoImJycyBidWcgd29ya2Fyb3VuZCAlZC8xXG4iLCBpKTsKIAogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdnYtPnZiaV93cSwgJndhaXQpOwogCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKQEAgLTExNiw3ICsxMTYsOCBAQAogCiAJCWlmKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAKLQkJCURFQl9WQkkoKCJhYm9ydGVkIChycHM6MHglMDh4KS5cbiIsc2FhNzE0Nl9yZWFkKGRldixSUFNfQUREUjEpKSk7CisJCQlERUJfVkJJKCJhYm9ydGVkIChycHM6MHglMDh4KVxuIiwKKwkJCQlzYWE3MTQ2X3JlYWQoZGV2LCBSUFNfQUREUjEpKTsKIAogCQkJLyogc3RvcCBycHMxIGZvciBzdXJlICovCiAJCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMxLCBNQVNLXzI5KTsKQEAgLTIwNyw3ICsyMDgsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwogCi0JREVCX1ZCSSgoImRldjolcCwgYnVmOiVwLCBuZXh0OiVwXG4iLGRldixidWYsbmV4dCkpOworCURFQl9WQkkoImRldjolcCwgYnVmOiVwLCBuZXh0OiVwXG4iLCBkZXYsIGJ1ZiwgbmV4dCk7CiAJc2FhNzE0Nl9zZXRfdmJpX2NhcHR1cmUoZGV2LGJ1ZixuZXh0KTsKIAogCW1vZF90aW1lcigmdnYtPnZiaV9xLnRpbWVvdXQsIGppZmZpZXMrQlVGRkVSX1RJTUVPVVQpOwpAQCAtMjI4LDEwICsyMjksMTAgQEAKIAlsbGVuZ3RoID0gdmJpX3BpeGVsX3RvX2NhcHR1cmU7CiAJc2l6ZSA9IGxpbmVzICogbGxlbmd0aDsKIAotCURFQl9WQkkoKCJ2YjolcFxuIix2YikpOworCURFQl9WQkkoInZiOiVwXG4iLCB2Yik7CiAKIAlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICAmJiAgYnVmLT52Yi5ic2l6ZSA8IHNpemUpIHsKLQkJREVCX1ZCSSgoInNpemUgbWlzbWF0Y2guXG4iKSk7CisJCURFQl9WQkkoInNpemUgbWlzbWF0Y2hcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI2Myw3ICsyNjQsNyBAQAogCXJldHVybiAwOwogCiAgb29wczoKLQlERUJfVkJJKCgiZXJyb3Igb3V0LlxuIikpOworCURFQl9WQkkoImVycm9yIG91dFxuIik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTI3OSw3ICsyODAsNyBAQAogCSpzaXplID0gbGluZXMgKiBsbGVuZ3RoOwogCSpjb3VudCA9IDI7CiAKLQlERUJfVkJJKCgiY291bnQ6JWQsIHNpemU6JWRcbiIsKmNvdW50LCpzaXplKSk7CisJREVCX1ZCSSgiY291bnQ6JWQsIHNpemU6JWRcbiIsICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTIsNyArMjkzLDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJc3RydWN0IHNhYTcxNDZfYnVmICpidWYgPSAoc3RydWN0IHNhYTcxNDZfYnVmICopdmI7CiAKLQlERUJfVkJJKCgidmI6JXBcbiIsdmIpKTsKKwlERUJfVkJJKCJ2YjolcFxuIiwgdmIpOwogCXNhYTcxNDZfYnVmZmVyX3F1ZXVlKGRldiwmdnYtPnZiaV9xLGJ1Zik7CiB9CiAKQEAgLTMwMyw3ICszMDQsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAlzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZiA9IChzdHJ1Y3Qgc2FhNzE0Nl9idWYgKil2YjsKIAotCURFQl9WQkkoKCJ2YjolcFxuIix2YikpOworCURFQl9WQkkoInZiOiVwXG4iLCB2Yik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogfQogCkBAIC0zMjEsNyArMzIyLDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LCBmaCkpOworCURFQl9WQkkoImRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssZmxhZ3MpOwogCkBAIC0zNTQsMTQgKzM1NSwxNCBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9IGZoLT5kZXY7CiAKLQlERUJfVkJJKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsIGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAl2Ymlfc3RvcChmaCwgZmlsZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZiaV9pbml0KHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYpCiB7Ci0JREVCX1ZCSSgoImRldjolcFxuIixkZXYpKTsKKwlERUJfVkJJKCJkZXY6JXBcbiIsIGRldik7CiAKIAlJTklUX0xJU1RfSEVBRCgmdnYtPnZiaV9xLnF1ZXVlKTsKIApAQCAtMzgwLDExICszODEsMTEgQEAKIAl1MzIgYXJidHJfY3RybAk9IHNhYTcxNDZfcmVhZChkZXYsIFBDSV9CVF9WMSk7CiAJaW50IHJldCA9IDA7CiAKLQlERUJfVkJJKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsZmgpKTsKKwlERUJfVkJJKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCXJldCA9IHNhYTcxNDZfcmVzX2dldChmaCwgUkVTT1VSQ0VfRE1BM19CUlMpOwogCWlmICgwID09IHJldCkgewotCQlERUJfUygoImNhbm5vdCBnZXQgdmJpIFJFU09VUkNFX0RNQTNfQlJTIHJlc291cmNlXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgZ2V0IHZiaSBSRVNPVVJDRV9ETUEzX0JSUyByZXNvdXJjZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC00MjUsNyArNDI2LDcgQEAKIAkJc2FhNzE0Nl93cml0ZShkZXYsIEJSU19DVFJMLCAweDAwMDAwMDAxKTsKIAogCQlpZiAoMCAhPSAocmV0ID0gdmJpX3dvcmthcm91bmQoZGV2KSkpIHsKLQkJCURFQl9WQkkoKCJ2Ymkgd29ya2Fyb3VuZCBmYWlsZWQhXG4iKSk7CisJCQlERUJfVkJJKCJ2Ymkgd29ya2Fyb3VuZCBmYWlsZWQhXG4iKTsKIAkJCS8qIHJldHVybiByZXQ7Ki8KIAkJfQogCX0KQEAgLTQzOSw3ICs0NDAsNyBAQAogewogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7Ci0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAlpZiggZmggPT0gdnYtPnZiaV9zdHJlYW1pbmcgKSB7CiAJCXZiaV9zdG9wKGZoLCBmaWxlKTsKQEAgLTQ1MywxMyArNDU0LDEzIEBACiAJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKIAogCWlmICh2di0+dmJpX3EuY3VycikgewotCQlERUJfVkJJKCgiZGV2OiVwLCBjdXJyOiVwXG4iLGRldix2di0+dmJpX3EuY3VycikpOworCQlERUJfVkJJKCJkZXY6JXAsIGN1cnI6JXBcbiIsIGRldiwgdnYtPnZiaV9xLmN1cnIpOwogCQkvKiB0aGlzIG11c3QgYmUgKz0gMiwgb25lIGNvdW50IGZvciBlYWNoIGZpZWxkICovCiAJCXZ2LT52YmlfZmllbGRjb3VudCs9MjsKIAkJdnYtPnZiaV9xLmN1cnItPnZiLmZpZWxkX2NvdW50ID0gdnYtPnZiaV9maWVsZGNvdW50OwogCQlzYWE3MTQ2X2J1ZmZlcl9maW5pc2goZGV2LCZ2di0+dmJpX3EsVklERU9CVUZfRE9ORSk7CiAJfSBlbHNlIHsKLQkJREVCX1ZCSSgoImRldjolcFxuIixkZXYpKTsKKwkJREVCX1ZCSSgiZGV2OiVwXG4iLCBkZXYpOwogCX0KIAlzYWE3MTQ2X2J1ZmZlcl9uZXh0KGRldiwmdnYtPnZiaV9xLDEpOwogCkBAIC00NzMsNyArNDc0LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJc3NpemVfdCByZXQgPSAwOwogCi0JREVCX1ZCSSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX1ZCSSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAlpZiggTlVMTCA9PSB2di0+dmJpX3N0cmVhbWluZyApIHsKIAkJLy8gZml4bWU6IGNoZWNrIGlmIGRtYTMgaXMgYXZhaWxhYmxlCkBAIC00ODIsNyArNDgzLDggQEAKIAl9CiAKIAlpZiggZmggIT0gdnYtPnZiaV9zdHJlYW1pbmcgKSB7Ci0JCURFQl9WQkkoKCJvcGVuICVwIGlzIGFscmVhZHkgdXNpbmcgdmJpIGNhcHR1cmUuIix2di0+dmJpX3N0cmVhbWluZykpOworCQlERUJfVkJJKCJvcGVuICVwIGlzIGFscmVhZHkgdXNpbmcgdmJpIGNhcHR1cmVcbiIsCisJCQl2di0+dmJpX3N0cmVhbWluZyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKaW5kZXggOWFhZmE0ZS4uY2UzMDUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYwpAQCAtMSw1ICsxLDggQEAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBtYXhfbWVtb3J5ID0gMzI7CiAKQEAgLTk0LDcgKzk3LDcgQEAKIAkJfQogCX0KIAotCURFQl9EKCgidW5rbm93biBwaXhlbGZvcm1hdDonJTQuNHMnXG4iLChjaGFyICopJmZvdXJjYykpOworCURFQl9EKCJ1bmtub3duIHBpeGVsZm9ybWF0OiclNC40cydcbiIsIChjaGFyICopJmZvdXJjYyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEwNywzMiArMTEwLDMyIEBACiAJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKIAlpbnQgcmV0ID0gMCwgZXJyID0gMDsKIAotCURFQl9FRSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX0VFKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCS8qIGNoZWNrIGlmIHdlIGhhdmUgb3ZlcmxheSBpbmZvcm1hdGlvbnMgKi8KIAlpZiggTlVMTCA9PSBmaC0+b3YuZmggKSB7Ci0JCURFQl9EKCgibm8gb3ZlcmxheSBkYXRhIGF2YWlsYWJsZS4gdHJ5IFNfRk1UIGZpcnN0LlxuIikpOworCQlERUJfRCgibm8gb3ZlcmxheSBkYXRhIGF2YWlsYWJsZS4gdHJ5IFNfRk1UIGZpcnN0LlxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCS8qIGNoZWNrIGlmIHN0cmVhbWluZyBjYXB0dXJlIGlzIHJ1bm5pbmcgKi8KIAlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJREVCX0QoKCJzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmUuXG4iKSk7CisJCURFQl9EKCJzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIGNoZWNrIGlmIG92ZXJsYXkgaXMgcnVubmluZyAqLwogCWlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkgewogCQlpZiAodnYtPnZpZGVvX2ZoID09IGZoKSB7Ci0JCQlERUJfRCgoIm92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUuXG4iKSk7CisJCQlERUJfRCgib3ZlcmxheSBpcyBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlERUJfRCgoIm92ZXJsYXkgaXMgYWxyZWFkeSBhY3RpdmUgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfRCgib3ZlcmxheSBpcyBhbHJlYWR5IGFjdGl2ZSBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICgwID09IHNhYTcxNDZfcmVzX2dldChmaCwgUkVTT1VSQ0VfRE1BMV9IUFN8UkVTT1VSQ0VfRE1BMl9DTFApKSB7Ci0JCURFQl9EKCgiY2Fubm90IGdldCBuZWNlc3Nhcnkgb3ZlcmxheSByZXNvdXJjZXNcbiIpKTsKKwkJREVCX0QoImNhbm5vdCBnZXQgbmVjZXNzYXJ5IG92ZXJsYXkgcmVzb3VyY2VzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTE0NSwxMyArMTQ4LDEzIEBACiAJZmgtPm92LndpbiA9IGZtdC5mbXQud2luOwogCXZ2LT5vdl9kYXRhID0gJmZoLT5vdjsKIAotCURFQl9EKCgiJWR4JWQrJWQrJWQgJXMgZmllbGQ9JXNcbiIsCi0JCWZoLT5vdi53aW4udy53aWR0aCxmaC0+b3Yud2luLncuaGVpZ2h0LAotCQlmaC0+b3Yud2luLncubGVmdCxmaC0+b3Yud2luLncudG9wLAotCQl2di0+b3ZfZm10LT5uYW1lLHY0bDJfZmllbGRfbmFtZXNbZmgtPm92Lndpbi5maWVsZF0pKTsKKwlERUJfRCgiJWR4JWQrJWQrJWQgJXMgZmllbGQ9JXNcbiIsCisJICAgICAgZmgtPm92Lndpbi53LndpZHRoLCBmaC0+b3Yud2luLncuaGVpZ2h0LAorCSAgICAgIGZoLT5vdi53aW4udy5sZWZ0LCBmaC0+b3Yud2luLncudG9wLAorCSAgICAgIHZ2LT5vdl9mbXQtPm5hbWUsIHY0bDJfZmllbGRfbmFtZXNbZmgtPm92Lndpbi5maWVsZF0pOwogCiAJaWYgKDAgIT0gKHJldCA9IHNhYTcxNDZfZW5hYmxlX292ZXJsYXkoZmgpKSkgewotCQlERUJfRCgoImVuYWJsaW5nIG92ZXJsYXkgZmFpbGVkOiAlZFxuIixyZXQpKTsKKwkJREVCX0QoImVuYWJsaW5nIG92ZXJsYXkgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJc2FhNzE0Nl9yZXNfZnJlZSh2di0+dmlkZW9fZmgsIFJFU09VUkNFX0RNQTFfSFBTfFJFU09VUkNFX0RNQTJfQ0xQKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNjgsMjIgKzE3MSwyMiBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gZmgtPmRldjsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAKLQlERUJfRUUoKCJkZXY6JXAsIGZoOiVwXG4iLGRldixmaCkpOworCURFQl9FRSgiZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCk7CiAKIAkvKiBjaGVjayBpZiBzdHJlYW1pbmcgY2FwdHVyZSBpcyBydW5uaW5nICovCiAJaWYgKElTX0NBUFRVUkVfQUNUSVZFKGZoKSAhPSAwKSB7Ci0JCURFQl9EKCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlLlxuIikpOworCQlERUJfRCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAkvKiBjaGVjayBpZiBvdmVybGF5IGlzIHJ1bm5pbmcgYXQgYWxsICovCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX09WRVJMQVkpID09IDApIHsKLQkJREVCX0QoKCJubyBhY3RpdmUgb3ZlcmxheS5cbiIpKTsKKwkJREVCX0QoIm5vIGFjdGl2ZSBvdmVybGF5XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHZ2LT52aWRlb19maCAhPSBmaCkgewotCQlERUJfRCgoIm92ZXJsYXkgaXMgYWN0aXZlLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfRCgib3ZlcmxheSBpcyBhY3RpdmUsIGJ1dCBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjY4LDcgKzI3MSw3IEBACiAJaW50IGxlbmd0aCA9IGRtYS0+c2dsZW47CiAJc3RydWN0IHNhYTcxNDZfZm9ybWF0ICpzZm10ID0gc2FhNzE0Nl9mb3JtYXRfYnlfZm91cmNjKGRldixidWYtPmZtdC0+cGl4ZWxmb3JtYXQpOwogCi0JREVCX0VFKCgiZGV2OiVwLCBidWY6JXAsIHNnX2xlbjolZFxuIixkZXYsYnVmLGxlbmd0aCkpOworCURFQl9FRSgiZGV2OiVwLCBidWY6JXAsIHNnX2xlbjolZFxuIiwgZGV2LCBidWYsIGxlbmd0aCk7CiAKIAlpZiggMCAhPSBJU19QTEFOQVIoc2ZtdC0+dHJhbnMpKSB7CiAJCXN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0MSA9ICZidWYtPnB0WzBdOwpAQCAtMjg4LDcgKzI5MSw4IEBACiAJCQkJbTMgPSAoKHNpemUrKHNpemUvMikrUEFHRV9TSVpFKS9QQUdFX1NJWkUpLTE7CiAJCQkJbzEgPSBzaXplJVBBR0VfU0laRTsKIAkJCQlvMiA9IChzaXplKyhzaXplLzQpKSVQQUdFX1NJWkU7Ci0JCQkJREVCX0NBUCgoInNpemU6JWQsIG0xOiVkLCBtMjolZCwgbTM6JWQsIG8xOiVkLCBvMjolZFxuIixzaXplLG0xLG0yLG0zLG8xLG8yKSk7CisJCQkJREVCX0NBUCgic2l6ZTolZCwgbTE6JWQsIG0yOiVkLCBtMzolZCwgbzE6JWQsIG8yOiVkXG4iLAorCQkJCQlzaXplLCBtMSwgbTIsIG0zLCBvMSwgbzIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAxNjogewpAQCAtMjk4LDcgKzMwMiw4IEBACiAJCQkJbTMgPSAoKDIqc2l6ZStQQUdFX1NJWkUpL1BBR0VfU0laRSktMTsKIAkJCQlvMSA9IHNpemUlUEFHRV9TSVpFOwogCQkJCW8yID0gKHNpemUrKHNpemUvMikpJVBBR0VfU0laRTsKLQkJCQlERUJfQ0FQKCgic2l6ZTolZCwgbTE6JWQsIG0yOiVkLCBtMzolZCwgbzE6JWQsIG8yOiVkXG4iLHNpemUsbTEsbTIsbTMsbzEsbzIpKTsKKwkJCQlERUJfQ0FQKCJzaXplOiVkLCBtMTolZCwgbTI6JWQsIG0zOiVkLCBvMTolZCwgbzI6JWRcbiIsCisJCQkJCXNpemUsIG0xLCBtMiwgbTMsIG8xLCBvMik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7CkBAIC0zODcsMjMgKzM5MiwyMyBAQAogCXVuc2lnbmVkIGludCByZXNvdXJjZTsKIAlpbnQgcmV0ID0gMCwgZXJyID0gMDsKIAotCURFQl9FRSgoImRldjolcCwgZmg6JXBcbiIsZGV2LGZoKSk7CisJREVCX0VFKCJkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCWlmICgodnYtPnZpZGVvX3N0YXR1cyAmIFNUQVRVU19DQVBUVVJFKSAhPSAwKSB7CiAJCWlmICh2di0+dmlkZW9fZmggPT0gZmgpIHsKLQkJCURFQl9TKCgiYWxyZWFkeSBjYXB0dXJpbmcuXG4iKSk7CisJCQlERUJfUygiYWxyZWFkeSBjYXB0dXJpbmdcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJREVCX1MoKCJhbHJlYWR5IGNhcHR1cmluZyBpbiBhbm90aGVyIG9wZW4uXG4iKSk7CisJCURFQl9TKCJhbHJlYWR5IGNhcHR1cmluZyBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICgodnYtPnZpZGVvX3N0YXR1cyAmIFNUQVRVU19PVkVSTEFZKSAhPSAwKSB7Ci0JCURFQl9TKCgid2FybmluZzogc3VzcGVuZGluZyBvdmVybGF5IHZpZGVvIGZvciBzdHJlYW1pbmcgY2FwdHVyZS5cbiIpKTsKKwkJREVCX1MoIndhcm5pbmc6IHN1c3BlbmRpbmcgb3ZlcmxheSB2aWRlbyBmb3Igc3RyZWFtaW5nIGNhcHR1cmVcbiIpOwogCQl2di0+b3Zfc3VzcGVuZCA9IHZ2LT52aWRlb19maDsKIAkJZXJyID0gc2FhNzE0Nl9zdG9wX3ByZXZpZXcodnYtPnZpZGVvX2ZoKTsgLyogc2lkZSBlZmZlY3Q6IHZpZGVvX3N0YXR1cyBpcyBub3cgMCwgdmlkZW9fZmggaXMgTlVMTCAqLwogCQlpZiAoMCAhPSBlcnIpIHsKLQkJCURFQl9EKCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKSk7CisJCQlERUJfRCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC00MjAsNyArNDI1LDcgQEAKIAogCXJldCA9IHNhYTcxNDZfcmVzX2dldChmaCwgcmVzb3VyY2UpOwogCWlmICgwID09IHJldCkgewotCQlERUJfUygoImNhbm5vdCBnZXQgY2FwdHVyZSByZXNvdXJjZSAlZFxuIixyZXNvdXJjZSkpOworCQlERUJfUygiY2Fubm90IGdldCBjYXB0dXJlIHJlc291cmNlICVkXG4iLCByZXNvdXJjZSk7CiAJCWlmICh2di0+b3Zfc3VzcGVuZCAhPSBOVUxMKSB7CiAJCQlzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcodnYtPm92X3N1c3BlbmQpOwogCQkJdnYtPm92X3N1c3BlbmQgPSBOVUxMOwpAQCAtNDQ4LDE1ICs0NTMsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCByZXNvdXJjZTsKIAl1MzIgZG1hcyA9IDA7Ci0JREVCX0VFKCgiZGV2OiVwLCBmaDolcFxuIixkZXYsZmgpKTsKKwlERUJfRUUoImRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpICE9IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9TKCgibm90IGNhcHR1cmluZy5cbiIpKTsKKwkJREVCX1MoIm5vdCBjYXB0dXJpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodnYtPnZpZGVvX2ZoICE9IGZoKSB7Ci0JCURFQl9TKCgiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTUzMCw3ICs1MzUsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9mb3JtYXQgKmZtdDsKIAotCURFQl9FRSgoIlZJRElPQ19TX0ZCVUZcbiIpKTsKKwlERUJfRUUoIlZJRElPQ19TX0ZCVUZcbiIpOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtNTQyLDEzICs1NDcsMTMgQEAKIAogCS8qIHBsYW5hciBmb3JtYXRzIGFyZSBub3QgYWxsb3dlZCBmb3Igb3ZlcmxheSB2aWRlbywgY2xpcHBpbmcgYW5kIHZpZGVvIGRtYSB3b3VsZCBjbGFzaCAqLwogCWlmIChmbXQtPmZsYWdzICYgRk9STUFUX0lTX1BMQU5BUikKLQkJREVCX1MoKCJwbGFuYXIgcGl4ZWxmb3JtYXQgJyU0LjRzJyBub3QgYWxsb3dlZCBmb3Igb3ZlcmxheVxuIiwKLQkJCQkJKGNoYXIgKikmZm10LT5waXhlbGZvcm1hdCkpOworCQlERUJfUygicGxhbmFyIHBpeGVsZm9ybWF0ICclNC40cycgbm90IGFsbG93ZWQgZm9yIG92ZXJsYXlcbiIsCisJCSAgICAgIChjaGFyICopJmZtdC0+cGl4ZWxmb3JtYXQpOwogCiAJLyogY2hlY2sgaWYgb3ZlcmxheSBpcyBydW5uaW5nICovCiAJaWYgKElTX09WRVJMQVlfQUNUSVZFKGZoKSAhPSAwKSB7CiAJCWlmICh2di0+dmlkZW9fZmggIT0gZmgpIHsKLQkJCURFQl9EKCgicmVmdXNpbmcgdG8gY2hhbmdlIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9ucyB3aGlsZSBvdmVybGF5IGlzIGFjdGl2ZSBpbiBhbm90aGVyIG9wZW4uXG4iKSk7CisJCQlERUJfRCgicmVmdXNpbmcgdG8gY2hhbmdlIGZyYW1lYnVmZmVyIGluZm9ybWF0aW9ucyB3aGlsZSBvdmVybGF5IGlzIGFjdGl2ZSBpbiBhbm90aGVyIG9wZW5cbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KQEAgLTU1OSw3ICs1NjQsNyBAQAogCiAJaWYgKHZ2LT5vdl9mYi5mbXQuYnl0ZXNwZXJsaW5lIDwgdnYtPm92X2ZiLmZtdC53aWR0aCkgewogCQl2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZSA9IHZ2LT5vdl9mYi5mbXQud2lkdGggKiBmbXQtPmRlcHRoIC8gODsKLQkJREVCX0QoKCJzZXR0aW5nIGJ5dGVzcGVybGluZSB0byAlZFxuIiwgdnYtPm92X2ZiLmZtdC5ieXRlc3BlcmxpbmUpKTsKKwkJREVCX0QoInNldHRpbmcgYnl0ZXNwZXJsaW5lIHRvICVkXG4iLCB2di0+b3ZfZmIuZm10LmJ5dGVzcGVybGluZSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNTg4LDcgKzU5Myw3IEBACiAJaWYgKGN0cmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlERUJfRUUoKCJWSURJT0NfUVVFUllDVFJMOiBpZDolZFxuIiwgYy0+aWQpKTsKKwlERUJfRUUoIlZJRElPQ19RVUVSWUNUUkw6IGlkOiVkXG4iLCBjLT5pZCk7CiAJKmMgPSAqY3RybDsKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNywyNSArNjEyLDI1IEBACiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgogCQl2YWx1ZSA9IHNhYTcxNDZfcmVhZChkZXYsIEJDU19DVFJMKTsKIAkJYy0+dmFsdWUgPSAweGZmICYgKHZhbHVlID4+IDI0KTsKLQkJREVCX0QoKCJWNEwyX0NJRF9CUklHSFRORVNTOiAlZFxuIiwgYy0+dmFsdWUpKTsKKwkJREVCX0QoIlY0TDJfQ0lEX0JSSUdIVE5FU1M6ICVkXG4iLCBjLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CiAJCXZhbHVlID0gc2FhNzE0Nl9yZWFkKGRldiwgQkNTX0NUUkwpOwogCQljLT52YWx1ZSA9IDB4N2YgJiAodmFsdWUgPj4gMTYpOwotCQlERUJfRCgoIlY0TDJfQ0lEX0NPTlRSQVNUOiAlZFxuIiwgYy0+dmFsdWUpKTsKKwkJREVCX0QoIlY0TDJfQ0lEX0NPTlRSQVNUOiAlZFxuIiwgYy0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CiAJCXZhbHVlID0gc2FhNzE0Nl9yZWFkKGRldiwgQkNTX0NUUkwpOwogCQljLT52YWx1ZSA9IDB4N2YgJiAodmFsdWUgPj4gMCk7Ci0JCURFQl9EKCgiVjRMMl9DSURfU0FUVVJBVElPTjogJWRcbiIsIGMtPnZhbHVlKSk7CisJCURFQl9EKCJWNEwyX0NJRF9TQVRVUkFUSU9OOiAlZFxuIiwgYy0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgogCQljLT52YWx1ZSA9IHZ2LT52ZmxpcDsKLQkJREVCX0QoKCJWNEwyX0NJRF9WRkxJUDogJWRcbiIsIGMtPnZhbHVlKSk7CisJCURFQl9EKCJWNEwyX0NJRF9WRkxJUDogJWRcbiIsIGMtPnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKIAkJYy0+dmFsdWUgPSB2di0+aGZsaXA7Ci0JCURFQl9EKCgiVjRMMl9DSURfSEZMSVA6ICVkXG4iLCBjLT52YWx1ZSkpOworCQlERUJfRCgiVjRMMl9DSURfSEZMSVA6ICVkXG4iLCBjLT52YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjQxLDcgKzY0Niw3IEBACiAKIAljdHJsID0gY3RybF9ieV9pZChjLT5pZCk7CiAJaWYgKE5VTEwgPT0gY3RybCkgewotCQlERUJfRCgoInVua25vd24gY29udHJvbCAlZFxuIiwgYy0+aWQpKTsKKwkJREVCX0QoInVua25vd24gY29udHJvbCAlZFxuIiwgYy0+aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTY4NiwxNCArNjkxLDE0IEBACiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKIAkJLyogZml4bWU6IHdlIGNhbiBzdXBwb3J0IGNoYW5naW5nIFZGTElQIGFuZCBIRkxJUCBoZXJlLi4uICovCiAJCWlmIChJU19DQVBUVVJFX0FDVElWRShmaCkgIT0gMCkgewotCQkJREVCX0QoKCJWNEwyX0NJRF9IRkxJUCB3aGlsZSBhY3RpdmUgY2FwdHVyZS5cbiIpKTsKKwkJCURFQl9EKCJWNEwyX0NJRF9IRkxJUCB3aGlsZSBhY3RpdmUgY2FwdHVyZVxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCXZ2LT5oZmxpcCA9IGMtPnZhbHVlOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgogCQlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJCURFQl9EKCgiVjRMMl9DSURfVkZMSVAgd2hpbGUgYWN0aXZlIGNhcHR1cmUuXG4iKSk7CisJCQlERUJfRCgiVjRMMl9DSURfVkZMSVAgd2hpbGUgYWN0aXZlIGNhcHR1cmVcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCQl2di0+dmZsaXAgPSBjLT52YWx1ZTsKQEAgLTc0OCw3ICs3NTMsNyBAQAogCWludCBtYXh3LCBtYXhoOwogCWludCBjYWxjX2JwbDsKIAotCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCkpOworCURFQl9FRSgiVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAogCWZtdCA9IHNhYTcxNDZfZm9ybWF0X2J5X2ZvdXJjYyhkZXYsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwogCWlmIChOVUxMID09IGZtdCkKQEAgLTc3Nyw3ICs3ODIsNyBAQAogCQl2di0+bGFzdF9maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJREVCX0QoKCJubyBrbm93biBmaWVsZCBtb2RlICclZCcuXG4iLCBmaWVsZCkpOworCQlERUJfRCgibm8ga25vd24gZmllbGQgbW9kZSAnJWQnXG4iLCBmaWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzk2LDggKzgwMSw5IEBACiAJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gY2FsY19icGw7CiAKIAlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lICogZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JREVCX0QoKCJ3OiVkLCBoOiVkLCBieXRlc3BlcmxpbmU6JWQsIHNpemVpbWFnZTolZFxuIiwgZi0+Zm10LnBpeC53aWR0aCwKLQkJCWYtPmZtdC5waXguaGVpZ2h0LCBmLT5mbXQucGl4LmJ5dGVzcGVybGluZSwgZi0+Zm10LnBpeC5zaXplaW1hZ2UpKTsKKwlERUJfRCgidzolZCwgaDolZCwgYnl0ZXNwZXJsaW5lOiVkLCBzaXplaW1hZ2U6JWRcbiIsCisJICAgICAgZi0+Zm10LnBpeC53aWR0aCwgZi0+Zm10LnBpeC5oZWlnaHQsCisJICAgICAgZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUsIGYtPmZtdC5waXguc2l6ZWltYWdlKTsKIAogCXJldHVybiAwOwogfQpAQCAtODExLDIyICs4MTcsMjMgQEAKIAllbnVtIHY0bDJfZmllbGQgZmllbGQ7CiAJaW50IG1heHcsIG1heGg7CiAKLQlERUJfRUUoKCJkZXY6JXBcbiIsIGRldikpOworCURFQl9FRSgiZGV2OiVwXG4iLCBkZXYpOwogCiAJaWYgKE5VTEwgPT0gdnYtPm92X2ZiLmJhc2UpIHsKLQkJREVCX0QoKCJubyBmYiBiYXNlIHNldC5cbiIpKTsKKwkJREVCX0QoIm5vIGZiIGJhc2Ugc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChOVUxMID09IHZ2LT5vdl9mbXQpIHsKLQkJREVCX0QoKCJubyBmYiBmbXQgc2V0LlxuIikpOworCQlERUJfRCgibm8gZmIgZm10IHNldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAod2luLT53LndpZHRoIDwgNDggfHwgd2luLT53LmhlaWdodCA8IDMyKSB7Ci0JCURFQl9EKCgibWluIHdpZHRoL2hlaWdodC4gKCVkLCVkKVxuIiwgd2luLT53LndpZHRoLCB3aW4tPncuaGVpZ2h0KSk7CisJCURFQl9EKCJtaW4gd2lkdGgvaGVpZ2h0LiAoJWQsJWQpXG4iLAorCQkgICAgICB3aW4tPncud2lkdGgsIHdpbi0+dy5oZWlnaHQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHdpbi0+Y2xpcGNvdW50ID4gMTYpIHsKLQkJREVCX0QoKCJjbGlwY291bnQgdG9vIGJpZy5cbiIpKTsKKwkJREVCX0QoImNsaXBjb3VudCB0b28gYmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NDgsNyArODU1LDcgQEAKIAljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJREVCX0QoKCJubyBrbm93biBmaWVsZCBtb2RlICclZCcuXG4iLCBmaWVsZCkpOworCQlERUJfRCgibm8ga25vd24gZmllbGQgbW9kZSAnJWQnXG4iLCBmaWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODY4LDE2ICs4NzUsMTcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJaW50IGVycjsKIAotCURFQl9FRSgoIlY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTogZGV2OiVwLCBmaDolcFxuIiwgZGV2LCBmaCkpOworCURFQl9FRSgiVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKTsKIAlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKLQkJREVCX0VFKCgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKSk7CisJCURFQl9FRSgic3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZXJyID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7CiAJaWYgKDAgIT0gZXJyKQogCQlyZXR1cm4gZXJyOwogCWZoLT52aWRlb19mbXQgPSBmLT5mbXQucGl4OwotCURFQl9FRSgoInNldCB0byBwaXhlbGZvcm1hdCAnJTQuNHMnXG4iLCAoY2hhciAqKSZmaC0+dmlkZW9fZm10LnBpeGVsZm9ybWF0KSk7CisJREVCX0VFKCJzZXQgdG8gcGl4ZWxmb3JtYXQgJyU0LjRzJ1xuIiwKKwkgICAgICAgKGNoYXIgKikmZmgtPnZpZGVvX2ZtdC5waXhlbGZvcm1hdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg4OCw3ICs4OTYsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlpbnQgZXJyOwogCi0JREVCX0VFKCgiVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOiBkZXY6JXAsIGZoOiVwXG4iLCBkZXYsIGZoKSk7CisJREVCX0VFKCJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IGRldjolcCwgZmg6JXBcbiIsIGRldiwgZmgpOwogCWVyciA9IHZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKIAlpZiAoMCAhPSBlcnIpCiAJCXJldHVybiBlcnI7CkBAIC05MzEsNyArOTM5LDcgQEAKIAkJaWYgKGUtPmluZGV4IDwgMCApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYoIGUtPmluZGV4IDwgZGV2LT5leHRfdnZfZGF0YS0+bnVtX3N0ZHMgKSB7Ci0JCQlERUJfRUUoKCJWSURJT0NfRU5VTVNURDogaW5kZXg6JWRcbiIsZS0+aW5kZXgpKTsKKwkJCURFQl9FRSgiVklESU9DX0VOVU1TVEQ6IGluZGV4OiVkXG4iLCBlLT5pbmRleCk7CiAJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoZSwgZGV2LT5leHRfdnZfZGF0YS0+c3Rkc1tlLT5pbmRleF0uaWQsIGRldi0+ZXh0X3Z2X2RhdGEtPnN0ZHNbZS0+aW5kZXhdLm5hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTk0NiwxMCArOTU0LDEwIEBACiAJaW50IGZvdW5kID0gMDsKIAlpbnQgZXJyLCBpOwogCi0JREVCX0VFKCgiVklESU9DX1NfU1REXG4iKSk7CisJREVCX0VFKCJWSURJT0NfU19TVERcbiIpOwogCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpID09IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9EKCgiY2Fubm90IGNoYW5nZSB2aWRlbyBzdGFuZGFyZCB3aGlsZSBzdHJlYW1pbmcgY2FwdHVyZSBpcyBhY3RpdmVcbiIpKTsKKwkJREVCX0QoImNhbm5vdCBjaGFuZ2UgdmlkZW8gc3RhbmRhcmQgd2hpbGUgc3RyZWFtaW5nIGNhcHR1cmUgaXMgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTk1Nyw3ICs5NjUsNyBAQAogCQl2di0+b3Zfc3VzcGVuZCA9IHZ2LT52aWRlb19maDsKIAkJZXJyID0gc2FhNzE0Nl9zdG9wX3ByZXZpZXcodnYtPnZpZGVvX2ZoKTsgLyogc2lkZSBlZmZlY3Q6IHZpZGVvX3N0YXR1cyBpcyBub3cgMCwgdmlkZW9fZmggaXMgTlVMTCAqLwogCQlpZiAoMCAhPSBlcnIpIHsKLQkJCURFQl9EKCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKSk7CisJCQlERUJfRCgic3VzcGVuZGluZyB2aWRlbyBmYWlsZWQuIGFib3J0aW5nXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC05NzgsMTEgKzk4NiwxMSBAQAogCX0KIAogCWlmICghZm91bmQpIHsKLQkJREVCX0VFKCgiVklESU9DX1NfU1REOiBzdGFuZGFyZCBub3QgZm91bmQuXG4iKSk7CisJCURFQl9FRSgiVklESU9DX1NfU1REOiBzdGFuZGFyZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlERUJfRUUoKCJWSURJT0NfU19TVEQ6IHNldCB0byBzdGFuZGFyZCB0byAnJXMnXG4iLCB2di0+c3RhbmRhcmQtPm5hbWUpKTsKKwlERUJfRUUoIlZJRElPQ19TX1NURDogc2V0IHRvIHN0YW5kYXJkIHRvICclcydcbiIsIHZ2LT5zdGFuZGFyZC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5MCw3ICs5OTgsNyBAQAogewogCWludCBlcnI7CiAKLQlERUJfRCgoIlZJRElPQ19PVkVSTEFZIG9uOiVkXG4iLCBvbikpOworCURFQl9EKCJWSURJT0NfT1ZFUkxBWSBvbjolZFxuIiwgb24pOwogCWlmIChvbikKIAkJZXJyID0gc2FhNzE0Nl9zdGFydF9wcmV2aWV3KGZoKTsKIAllbHNlCkBAIC0xMDQ3LDcgKzEwNTUsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IF9fZmg7CiAJaW50IGVycjsKIAotCURFQl9EKCgiVklESU9DX1NUUkVBTU9OLCB0eXBlOiVkXG4iLCB0eXBlKSk7CisJREVCX0QoIlZJRElPQ19TVFJFQU1PTiwgdHlwZTolZFxuIiwgdHlwZSk7CiAKIAllcnIgPSB2aWRlb19iZWdpbihmaCk7CiAJaWYgKGVycikKQEAgLTEwNjYsMTggKzEwNzQsMTggQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CiAJaW50IGVycjsKIAotCURFQl9EKCgiVklESU9DX1NUUkVBTU9GRiwgdHlwZTolZFxuIiwgdHlwZSkpOworCURFQl9EKCJWSURJT0NfU1RSRUFNT0ZGLCB0eXBlOiVkXG4iLCB0eXBlKTsKIAogCS8qIHVnbHk6IHdlIG5lZWQgdG8gY29weSBzb21lIGNoZWNrcyBmcm9tIHZpZGVvX2VuZCgpLAogCSAgIGJlY2F1c2UgdmlkZW9idWZfc3RyZWFtb2ZmKCkgcmVsaWVzIG9uIHRoZSBjYXB0dXJlIHJ1bm5pbmcuCiAJICAgY2hlY2sgYW5kIGZpeCB0aGlzICovCiAJaWYgKCh2di0+dmlkZW9fc3RhdHVzICYgU1RBVFVTX0NBUFRVUkUpICE9IFNUQVRVU19DQVBUVVJFKSB7Ci0JCURFQl9TKCgibm90IGNhcHR1cmluZy5cbiIpKTsKKwkJREVCX1MoIm5vdCBjYXB0dXJpbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodnYtPnZpZGVvX2ZoICE9IGZoKSB7Ci0JCURFQl9TKCgiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiY2FwdHVyaW5nLCBidXQgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTEwODcsNyArMTA5NSw3IEBACiAJZWxzZSBpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKQogCQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoJmZoLT52YmlfcSk7CiAJaWYgKDAgIT0gZXJyKSB7Ci0JCURFQl9EKCgid2FybmluZzogdmlkZW9idWZfc3RyZWFtb2ZmKCkgZmFpbGVkLlxuIikpOworCQlERUJfRCgid2FybmluZzogdmlkZW9idWZfc3RyZWFtb2ZmKCkgZmFpbGVkXG4iKTsKIAkJdmlkZW9fZW5kKGZoLCBmaWxlKTsKIAl9IGVsc2UgewogCQllcnIgPSB2aWRlb19lbmQoZmgsIGZpbGUpOwpAQCAtMTE3NCwyNSArMTE4MiwyNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmID0gKHN0cnVjdCBzYWE3MTQ2X2J1ZiAqKXZiOwogCWludCBzaXplLGVyciA9IDA7CiAKLQlERUJfQ0FQKCgidmJ1ZjolcFxuIix2YikpOworCURFQl9DQVAoInZidWY6JXBcbiIsIHZiKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoZmgtPnZpZGVvX2ZtdC53aWR0aCAgPCA0OCB8fAogCSAgICBmaC0+dmlkZW9fZm10LmhlaWdodCA8IDMyIHx8CiAJICAgIGZoLT52aWRlb19mbXQud2lkdGggID4gdnYtPnN0YW5kYXJkLT5oX21heF9vdXQgfHwKIAkgICAgZmgtPnZpZGVvX2ZtdC5oZWlnaHQgPiB2di0+c3RhbmRhcmQtPnZfbWF4X291dCkgewotCQlERUJfRCgoIncgKCVkKSAvIGggKCVkKSBvdXQgb2YgYm91bmRzLlxuIixmaC0+dmlkZW9fZm10LndpZHRoLGZoLT52aWRlb19mbXQuaGVpZ2h0KSk7CisJCURFQl9EKCJ3ICglZCkgLyBoICglZCkgb3V0IG9mIGJvdW5kc1xuIiwKKwkJICAgICAgZmgtPnZpZGVvX2ZtdC53aWR0aCwgZmgtPnZpZGVvX2ZtdC5oZWlnaHQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzaXplID0gZmgtPnZpZGVvX2ZtdC5zaXplaW1hZ2U7CiAJaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAmJiBidWYtPnZiLmJzaXplIDwgc2l6ZSkgewotCQlERUJfRCgoInNpemUgbWlzbWF0Y2guXG4iKSk7CisJCURFQl9EKCJzaXplIG1pc21hdGNoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JREVCX0NBUCgoImJ1ZmZlcl9wcmVwYXJlIFtzaXplPSVkeCVkLGJ5dGVzPSVkLGZpZWxkcz0lc11cbiIsCi0JCWZoLT52aWRlb19mbXQud2lkdGgsZmgtPnZpZGVvX2ZtdC5oZWlnaHQsc2l6ZSx2NGwyX2ZpZWxkX25hbWVzW2ZoLT52aWRlb19mbXQuZmllbGRdKSk7CisJREVCX0NBUCgiYnVmZmVyX3ByZXBhcmUgW3NpemU9JWR4JWQsYnl0ZXM9JWQsZmllbGRzPSVzXVxuIiwKKwkJZmgtPnZpZGVvX2ZtdC53aWR0aCwgZmgtPnZpZGVvX2ZtdC5oZWlnaHQsCisJCXNpemUsIHY0bDJfZmllbGRfbmFtZXNbZmgtPnZpZGVvX2ZtdC5maWVsZF0pOwogCWlmIChidWYtPnZiLndpZHRoICAhPSBmaC0+dmlkZW9fZm10LndpZHRoICB8fAogCSAgICBidWYtPnZiLmJ5dGVzcGVybGluZSAhPSBmaC0+dmlkZW9fZm10LmJ5dGVzcGVybGluZSB8fAogCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+dmlkZW9fZm10LmhlaWdodCB8fApAQCAtMTIzOCw3ICsxMjQ4LDcgQEAKIAlyZXR1cm4gMDsKIAogIG9vcHM6Ci0JREVCX0QoKCJlcnJvciBvdXQuXG4iKSk7CisJREVCX0QoImVycm9yIG91dFxuIik7CiAJc2FhNzE0Nl9kbWFfZnJlZShkZXYscSxidWYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTEyNTksNyArMTI2OSw3IEBACiAJCSpjb3VudCA9IChtYXhfbWVtb3J5KjEwNDg1NzYpIC8gKnNpemU7CiAJfQogCi0JREVCX0NBUCgoIiVkIGJ1ZmZlcnMsICVkIGJ5dGVzIGVhY2guXG4iLCpjb3VudCwqc2l6ZSkpOworCURFQl9DQVAoIiVkIGJ1ZmZlcnMsICVkIGJ5dGVzIGVhY2hcbiIsICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjcyLDcgKzEyODIsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X3Z2ICp2diA9IGRldi0+dnZfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl9idWYgKmJ1ZiA9IChzdHJ1Y3Qgc2FhNzE0Nl9idWYgKil2YjsKIAotCURFQl9DQVAoKCJ2YnVmOiVwXG4iLHZiKSk7CisJREVCX0NBUCgidmJ1ZjolcFxuIiwgdmIpOwogCXNhYTcxNDZfYnVmZmVyX3F1ZXVlKGZoLT5kZXYsJnZ2LT52aWRlb19xLGJ1Zik7CiB9CiAKQEAgLTEyODMsNyArMTI5Myw3IEBACiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCXN0cnVjdCBzYWE3MTQ2X2J1ZiAqYnVmID0gKHN0cnVjdCBzYWE3MTQ2X2J1ZiAqKXZiOwogCi0JREVCX0NBUCgoInZidWY6JXBcbiIsdmIpKTsKKwlERUJfQ0FQKCJ2YnVmOiVwXG4iLCB2Yik7CiAKIAlzYWE3MTQ2X2RtYV9mcmVlKGRldixxLGJ1Zik7CiAKQEAgLTEzNDcsMTggKzEzNTcsMTQgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSA9ICZmaC0+dmlkZW9fcTsKLQlpbnQgZXJyOwogCi0JaWYgKElTX0NBUFRVUkVfQUNUSVZFKGZoKSAhPSAwKSB7Ci0JCWVyciA9IHZpZGVvX2VuZChmaCwgZmlsZSk7Ci0JfSBlbHNlIGlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkgewotCQllcnIgPSBzYWE3MTQ2X3N0b3BfcHJldmlldyhmaCk7Ci0JfQorCWlmIChJU19DQVBUVVJFX0FDVElWRShmaCkgIT0gMCkKKwkJdmlkZW9fZW5kKGZoLCBmaWxlKTsKKwllbHNlIGlmIChJU19PVkVSTEFZX0FDVElWRShmaCkgIT0gMCkKKwkJc2FhNzE0Nl9zdG9wX3ByZXZpZXcoZmgpOwogCiAJdmlkZW9idWZfc3RvcChxKTsKLQogCS8qIGhtbSwgd2h5IGlzIHRoaXMgZnVuY3Rpb24gZGVjbGFyZWQgdm9pZD8gKi8KLQkvKiByZXR1cm4gZXJyICovCiB9CiAKIApAQCAtMTM2OCw3ICsxMzc0LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kbWFxdWV1ZSAqcSA9ICZ2di0+dmlkZW9fcTsKIAogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JREVCX0NBUCgoImNhbGxlZC5cbiIpKTsKKwlERUJfQ0FQKCJjYWxsZWRcbiIpOwogCiAJLyogb25seSBmaW5pc2ggdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlIG9uZS4uLiAqLwogCWlmKCBOVUxMICE9IHEtPmN1cnIgKSB7CkBAIC0xMzg2LDE1ICsxMzkyLDE1IEBACiAJc3RydWN0IHNhYTcxNDZfdnYgKnZ2ID0gZGV2LT52dl9kYXRhOwogCXNzaXplX3QgcmV0ID0gMDsKIAotCURFQl9FRSgoImNhbGxlZC5cbiIpKTsKKwlERUJfRUUoImNhbGxlZFxuIik7CiAKIAlpZiAoKHZ2LT52aWRlb19zdGF0dXMgJiBTVEFUVVNfQ0FQVFVSRSkgIT0gMCkgewogCQkvKiBmaXhtZTogc2hvdWxkIHdlIGFsbG93IHJlYWQoKSBjYXB0dXJlcyB3aGlsZSBzdHJlYW1pbmcgY2FwdHVyZT8gKi8KIAkJaWYgKHZ2LT52aWRlb19maCA9PSBmaCkgewotCQkJREVCX1MoKCJhbHJlYWR5IGNhcHR1cmluZy5cbiIpKTsKKwkJCURFQl9TKCJhbHJlYWR5IGNhcHR1cmluZ1xuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9Ci0JCURFQl9TKCgiYWxyZWFkeSBjYXB0dXJpbmcgaW4gYW5vdGhlciBvcGVuLlxuIikpOworCQlERUJfUygiYWxyZWFkeSBjYXB0dXJpbmcgaW4gYW5vdGhlciBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQppbmRleCAyMGQyNGZjLi4xOTZjMTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCkBAIC0yOCw1ICsyOCw1IEBACiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfVERBMTgyMTgpICs9IHRkYTE4MjE4Lm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9UREExODIxMikgKz0gdGRhMTgyMTIubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbXQyMHh4LmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvbXQyMHh4LmMKaW5kZXggZDBlNzBlMS4uMGU3NGU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL210MjB4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9tdDIweHguYwpAQCAtNDMwLDExICs0MzAsMTAgQEAKIHsKIAlzdHJ1Y3QgbWljcm90dW5lX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpbnQgcmV0OwogCiAJYnVmWzBdID0gNjsKIAlidWZbMV0gPSBhbnRlbm5hID8gMHgxMSA6IDB4MTA7Ci0JcmV0PXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcyxidWYsMik7CisJdHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLCBidWYsIDIpOwogCXR1bmVyX2RiZygibXQyMDUwOiBlbmFibGVkIGFudGVubmEgY29ubmVjdG9yICVkXG4iLCBhbnRlbm5hKTsKIH0KIApAQCAtNTc0LDIxICs1NzMsMjAgQEAKIHsKIAlzdHJ1Y3QgbWljcm90dW5lX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpbnQgcmV0OwogCi0JYnVmWzBdPTY7Ci0JYnVmWzFdPTB4MTA7Ci0JcmV0PXR1bmVyX2kyY194ZmVyX3NlbmQoJnByaXYtPmkyY19wcm9wcyxidWYsMik7IC8vICBwb3dlcgorCWJ1ZlswXSA9IDY7CisJYnVmWzFdID0gMHgxMDsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMik7IC8qIHBvd2VyICovCiAKLQlidWZbMF09MHgwZjsKLQlidWZbMV09MHgwZjsKLQlyZXQ9dHVuZXJfaTJjX3hmZXJfc2VuZCgmcHJpdi0+aTJjX3Byb3BzLGJ1ZiwyKTsgLy8gbTFsbworCWJ1ZlswXSA9IDB4MGY7CisJYnVmWzFdID0gMHgwZjsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMik7IC8qIG0xbG8gKi8KIAotCWJ1ZlswXT0weDBkOwotCXJldD10dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsYnVmLDEpOwotCXR1bmVyX2kyY194ZmVyX3JlY3YoJnByaXYtPmkyY19wcm9wcyxidWYsMSk7CisJYnVmWzBdID0gMHgwZDsKKwl0dW5lcl9pMmNfeGZlcl9zZW5kKCZwcml2LT5pMmNfcHJvcHMsIGJ1ZiwgMSk7CisJdHVuZXJfaTJjX3hmZXJfcmVjdigmcHJpdi0+aTJjX3Byb3BzLCBidWYsIDEpOwogCi0JdHVuZXJfZGJnKCJtdDIwNTA6IHNybyBpcyAleFxuIixidWZbMF0pOworCXR1bmVyX2RiZygibXQyMDUwOiBzcm8gaXMgJXhcbiIsIGJ1ZlswXSk7CiAKIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmbXQyMDUwX3R1bmVyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA1cy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKaW5kZXggNTZmZTc1Yy4uNTRiZTllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDVzLmMKQEAgLTMwOSw3ICszMDksNiBAQAogc3RhdGljIHUxNiBNWExfU2V0R1BJTyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggR1BJT19OdW0sIHU4IEdQSU9fVmFsKTsKIHN0YXRpYyB1MTYgTVhMX0dldEluaXRSZWdpc3RlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggKlJlZ051bSwKIAl1OCAqUmVnVmFsLCBpbnQgKmNvdW50KTsKLXN0YXRpYyB1MzIgTVhMX0dldFh0YWxJbnQodTMyIFh0YWxfRnJlcSk7CiBzdGF0aWMgdTE2IE1YTF9UdW5lUkYoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBSRl9GcmVxKTsKIHN0YXRpYyB2b2lkIE1YTF9TeW50aElGTE9fQ2FsYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CiBzdGF0aWMgdm9pZCBNWExfU3ludGhSRlRHTE9fQ2FsYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CkBAIC0yMzA3LDE0ICsyMzA2LDYgQEAKIAlyZXR1cm4gc3RhdHVzIDsKIH0KIAotc3RhdGljIHUzMiBNWExfR2V0WHRhbEludCh1MzIgWHRhbF9GcmVxKQotewotCWlmICgoWHRhbF9GcmVxICUgMTAwMDAwMCkgPT0gMCkKLQkJcmV0dXJuIChYdGFsX0ZyZXEgLyAxMDAwMCk7Ci0JZWxzZQotCQlyZXR1cm4gKCgoWHRhbF9GcmVxIC8gMTAwMDAwMCkgKyAxKSoxMDApOwotfQotCiBzdGF0aWMgdTE2IE1YTF9UdW5lUkYoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBSRl9GcmVxKQogewogCXN0cnVjdCBteGw1MDA1c19zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKQEAgLTIzMjQsMTMgKzIzMTUsMTAgQEAKIAl1MzIgS2RibF9SRiA9IDI7CiAJdTMyIHRnX2RpdnZhbDsKIAl1MzIgdGdfbG87Ci0JdTMyIFh0YWxfSW50OwogCiAJdTMyIEZyZWZfVEc7CiAJdTMyIEZ2Y287CiAKLQlYdGFsX0ludCA9IE1YTF9HZXRYdGFsSW50KHN0YXRlLT5GeHRhbCk7Ci0KIAlzdGF0ZS0+UkZfSU4gPSBSRl9GcmVxOwogCiAJTVhMX1N5bnRoUkZUR0xPX0NhbGMoZmUpOwpAQCAtMjc3OSw2ICsyNzY3LDE2IEBACiAJdGdfbG8gPSAoKChGbWF4LzEwIC0gRnZjbykvMTAwKSozMikgLyAoKEZtYXgtRm1pbikvMTAwMCkrODsKIAogCS8qIGJlbG93IGVxdWF0aW9uIGlzIHNhbWUgYXMgYWJvdmUgYnV0IG11Y2ggaGFyZGVyIHRvIGRlYnVnLgorCSAqCisJICogc3RhdGljIHUzMiBNWExfR2V0WHRhbEludCh1MzIgWHRhbF9GcmVxKQorCSAqIHsKKwkgKglpZiAoKFh0YWxfRnJlcSAlIDEwMDAwMDApID09IDApCisJICoJCXJldHVybiAoWHRhbF9GcmVxIC8gMTAwMDApOworCSAqCWVsc2UKKwkgKgkJcmV0dXJuICgoKFh0YWxfRnJlcSAvIDEwMDAwMDApICsgMSkqMTAwKTsKKwkgKiB9CisJICoKKwkgKiB1MzIgWHRhbF9JbnQgPSBNWExfR2V0WHRhbEludChzdGF0ZS0+Rnh0YWwpOwogCSAqIHRnX2xvID0gKCAoKEZtYXgvMTAwMDAgKiBYdGFsX0ludCkvMTAwKSAtCiAJICogKChzdGF0ZS0+VEdfTE8vMTAwMDApKmRpdmlkZXJfdmFsICoKIAkgKiAoc3RhdGUtPkZ4dGFsLzEwMDAwKS8xMDApICkqMzIvKChGbWF4LUZtaW4pLzEwMDAwICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODIxMi5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjEyLmMKaW5kZXggMWYxZGIyMC4uZTI5Y2MyYmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTIuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTIuYwpAQCAtMTgsNyArMTgsMjAgQEAKICAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAotI2luY2x1ZGUgInRkYTE4MjEyX3ByaXYuaCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgInRkYTE4MjEyLmgiCisKK3N0cnVjdCB0ZGExODIxMl9wcml2IHsKKwlzdHJ1Y3QgdGRhMTgyMTJfY29uZmlnICpjZmc7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Cit9OworCisjZGVmaW5lIGRiZyhmbXQsIGFyZy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoZGVidWcpCQkJCQkJXAorCQlwcl9pbmZvKCIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZyk7CQlcCit9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNDYsNyArNTksOCBAQAogCWlmIChyZXQgPT0gMSkgewogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCXdhcm4oImkyYyB3ciBmYWlsZWQgcmV0OiVkIHJlZzolMDJ4IGxlbjolZCIsIHJldCwgcmVnLCBsZW4pOworCQlwcl93YXJuKCJpMmMgd3IgZmFpbGVkIHJldDolZCByZWc6JTAyeCBsZW46JWRcbiIsCisJCQlyZXQsIHJlZywgbGVuKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTc3LDcgKzkxLDggQEAKIAkJbWVtY3B5KHZhbCwgYnVmLCBsZW4pOwogCQlyZXQgPSAwOwogCX0gZWxzZSB7Ci0JCXdhcm4oImkyYyByZCBmYWlsZWQgcmV0OiVkIHJlZzolMDJ4IGxlbjolZCIsIHJldCwgcmVnLCBsZW4pOworCQlwcl93YXJuKCJpMmMgcmQgZmFpbGVkIHJldDolZCByZWc6JTAyeCBsZW46JWRcbiIsCisJCQlyZXQsIHJlZywgbGVuKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAKQEAgLTEyOSw4ICsxNDQsOCBAQAogCQl7IDB4OTIsIDB4NTMsIDB4MDMgfSwgLyogRFZCLUMgKi8KIAl9OwogCi0JZGJnKCIlczogZGVsc3lzPSVkIFJGPSVkIEJXPSVkIiwgX19mdW5jX18sCi0JCWMtPmRlbGl2ZXJ5X3N5c3RlbSwgYy0+ZnJlcXVlbmN5LCBjLT5iYW5kd2lkdGhfaHopOworCWRiZygiZGVsc3lzPSVkIFJGPSVkIEJXPSVkXG4iLAorCSAgICBjLT5kZWxpdmVyeV9zeXN0ZW0sIGMtPmZyZXF1ZW5jeSwgYy0+YmFuZHdpZHRoX2h6KTsKIAogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7IC8qIG9wZW4gSTJDLWdhdGUgKi8KQEAgLTE5Niw3ICsyMTEsNyBAQAogCXJldHVybiByZXQ7CiAKIGVycm9yOgotCWRiZygiJXM6IGZhaWxlZDolZCIsIF9fZnVuY19fLCByZXQpOworCWRiZygiZmFpbGVkOiVkXG4iLCByZXQpOwogCWdvdG8gZXhpdDsKIH0KIApAQCAtMjQ1LDEzICsyNjAsMTMgQEAKIAlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOyAvKiBjbG9zZSBJMkMtZ2F0ZSAqLwogCi0JZGJnKCIlczogcmV0OiVkIGNoaXAgSUQ6JTAyeCIsIF9fZnVuY19fLCByZXQsIHZhbCk7CisJZGJnKCJyZXQ6JWQgY2hpcCBJRDolMDJ4XG4iLCByZXQsIHZhbCk7CiAJaWYgKHJldCB8fCB2YWwgIT0gMHhjNykgewogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaW5mbygiTlhQIFREQTE4MjEySE4gc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQuIik7CisJcHJfaW5mbygiTlhQIFREQTE4MjEySE4gc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWRcbiIpOwogCiAJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJnRkYTE4MjEyX3R1bmVyX29wcywKIAkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjEyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkZmY5My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIE5YUCBUREExODIxMkhOIHNpbGljb24gdHVuZXIgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgotICoKLSAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKi8KLQotI2lmbmRlZiBUREExODIxMl9QUklWX0gKLSNkZWZpbmUgVERBMTgyMTJfUFJJVl9ICi0KLSNpbmNsdWRlICJ0ZGExODIxMi5oIgotCi0jZGVmaW5lIExPR19QUkVGSVggInRkYTE4MjEyIgotCi0jdW5kZWYgZGJnCi0jZGVmaW5lIGRiZyhmLCBhcmcuLi4pIFwKLQlpZiAoZGVidWcpIFwKLQkJcHJpbnRrKEtFUk5fSU5GTyAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotI3VuZGVmIGluZm8KLSNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotI3VuZGVmIHdhcm4KLSNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQotCi1zdHJ1Y3QgdGRhMTgyMTJfcHJpdiB7Ci0Jc3RydWN0IHRkYTE4MjEyX2NvbmZpZyAqY2ZnOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtY29tbW9uLmMKaW5kZXggYWFlNDBlNS4uMzljNjQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1jb21tb24uYwpAQCAtNjc2LDEwICs2NzYsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KK2ludCBfdGRhX3ByaW50ayhzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUsIGNvbnN0IGNoYXIgKmxldmVsLAorCQljb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJ0bjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJaWYgKHN0YXRlKQorCQlydG4gPSBwcmludGsoIiVzJXM6IFslZC0lMDR4fCVjXSAlcFYiLAorCQkJICAgICBsZXZlbCwgZnVuYywgaTJjX2FkYXB0ZXJfaWQoc3RhdGUtPmkyY19wcm9wcy5hZGFwKSwKKwkJCSAgICAgc3RhdGUtPmkyY19wcm9wcy5hZGRyLAorCQkJICAgICAoc3RhdGUtPnJvbGUgPT0gVERBMTgyNzFfTUFTVEVSKSA/ICdNJyA6ICdTJywKKwkJCSAgICAgJnZhZik7CisJZWxzZQorCQlydG4gPSBwcmludGsoIiVzJXM6ICVwViIsIGxldmVsLCBmdW5jLCAmdmFmKTsKKworCXZhX2VuZChhcmdzKTsKKworCXJldHVybiBydG47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtZmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCmluZGV4IDU3MDIyZTguLjYzY2M0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1mZS5jCkBAIC0xMjMwLDcgKzEyMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgdGRhMTgyNzFfdHVuZXJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIHRkYTE4MjcxX3R1bmVyX29wcyA9IHsKIAkuaW5mbyA9IHsKIAkJLm5hbWUgPSAiTlhQIFREQTE4MjcxSEQiLAogCQkuZnJlcXVlbmN5X21pbiAgPSAgNDUwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTE4MjcxLXByaXYuaAppbmRleCA5NTg5YWIwLi45NDM0MGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyNzEtcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODI3MS1wcml2LmgKQEAgLTEzNiwyOSArMTM2LDI2IEBACiAjZGVmaW5lIERCR19BRFYgIDgKICNkZWZpbmUgREJHX0NBTCAgMTYKIAotI2RlZmluZSB0ZGFfcHJpbnRrKHN0LCBrZXJuLCBmbXQsIGFyZy4uLikgZG8ge1wKLQlpZiAoc3QpIHsgXAotCQlzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUgPSBzdDsgXAotCQlwcmludGsoa2VybiAiJXM6IFslZC0lMDR4fCVzXSAiIGZtdCwgX19mdW5jX18sIFwKLQkJCWkyY19hZGFwdGVyX2lkKHN0YXRlLT5pMmNfcHJvcHMuYWRhcCksIFwKLQkJCXN0YXRlLT5pMmNfcHJvcHMuYWRkciwgXAotCQkJKHN0YXRlLT5yb2xlID09IFREQTE4MjcxX01BU1RFUikgXAotCQkJPyAiTSIgOiAiUyIsICMjYXJnKTsgXAotCX0gZWxzZSBcCi0JCXByaW50ayhrZXJuICIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZyk7IFwKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDQsIDUpKSkKK2ludCBfdGRhX3ByaW50ayhzdHJ1Y3QgdGRhMTgyNzFfcHJpdiAqc3RhdGUsIGNvbnN0IGNoYXIgKmxldmVsLAorCQljb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNkZWZpbmUgdGRhX3ByaW50ayhzdCwgbHZsLCBmbXQsIGFyZy4uLikJCQlcCisJX3RkYV9wcmludGsoc3QsIGx2bCwgX19mdW5jX18sIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgdGRhX2RwcmludGsoc3QsIGx2bCwgZm10LCBhcmcuLi4pCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh0ZGExODI3MV9kZWJ1ZyAmIGx2bCkJCQkJXAorCQl0ZGFfcHJpbnRrKHN0LCBLRVJOX0RFQlVHLCBmbXQsICMjYXJnKTsJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgdGRhX2RwcmludGsoc3QsIGx2bCwgZm10LCBhcmcuLi4pIGRvIHtcCi0JaWYgKHRkYTE4MjcxX2RlYnVnICYgbHZsKSBcCi0JCXRkYV9wcmludGsoc3QsIEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIHRkYV9pbmZvKGZtdCwgYXJnLi4uKSAgICAgcHJpbnRrKEtFUk5fSU5GTyAgICAgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX3dhcm4oZm10LCBhcmcuLi4pIHRkYV9wcmludGsocHJpdiwgS0VSTl9XQVJOSU5HLCBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfZXJyKGZtdCwgYXJnLi4uKSAgdGRhX3ByaW50ayhwcml2LCBLRVJOX0VSUiwgICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV9kYmcoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhwcml2LCBEQkdfSU5GTywgICAgZm10LCAjI2FyZykKLSNkZWZpbmUgdGRhX21hcChmbXQsIGFyZy4uLikgIHRkYV9kcHJpbnRrKHByaXYsIERCR19NQVAsICAgICBmbXQsICMjYXJnKQotI2RlZmluZSB0ZGFfcmVnKGZtdCwgYXJnLi4uKSAgdGRhX2RwcmludGsocHJpdiwgREJHX1JFRywgICAgIGZtdCwgIyNhcmcpCi0jZGVmaW5lIHRkYV9jYWwoZm10LCBhcmcuLi4pICB0ZGFfZHByaW50ayhwcml2LCBEQkdfQ0FMLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2luZm8oZm10LCBhcmcuLi4pCXByX2luZm8oZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX3dhcm4oZm10LCBhcmcuLi4pCXRkYV9wcmludGsocHJpdiwgS0VSTl9XQVJOSU5HLCBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfZXJyKGZtdCwgYXJnLi4uKQl0ZGFfcHJpbnRrKHByaXYsIEtFUk5fRVJSLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2RiZyhmbXQsIGFyZy4uLikJdGRhX2RwcmludGsocHJpdiwgREJHX0lORk8sICAgIGZtdCwgIyNhcmcpCisjZGVmaW5lIHRkYV9tYXAoZm10LCBhcmcuLi4pCXRkYV9kcHJpbnRrKHByaXYsIERCR19NQVAsICAgICBmbXQsICMjYXJnKQorI2RlZmluZSB0ZGFfcmVnKGZtdCwgYXJnLi4uKQl0ZGFfZHByaW50ayhwcml2LCBEQkdfUkVHLCAgICAgZm10LCAjI2FyZykKKyNkZWZpbmUgdGRhX2NhbChmbXQsIGFyZy4uLikJdGRhX2RwcmludGsocHJpdiwgREJHX0NBTCwgICAgIGZtdCwgIyNhcmcpCiAKICNkZWZpbmUgdGRhX2ZhaWwocmV0KQkJCQkJCQkgICAgIFwKICh7CQkJCQkJCQkJICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyN3guYwppbmRleCBiMjFiNmVhLi5lMGQ1YjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI3eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4Mjd4LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlpZl9mcmVxID0gNTAwMDAwMDsKIAkJYnJlYWs7CiAJfQotCXR1bmVyX2ZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIGlmX2ZyZXE7CisJdHVuZXJfZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCiAJaSA9IDA7CiAJd2hpbGUgKHRkYTgyN3hfdGFibGVbaV0ubG9tYXggPCB0dW5lcl9mcmVxKSB7CkBAIC0xODUsNiArMTg1LDggQEAKIAkJaSsrOwogCX0KIAorCXR1bmVyX2ZyZXEgKz0gaWZfZnJlcTsKKwogCU4gPSAoKHR1bmVyX2ZyZXEgKyAxMjUwMDApIC8gMjUwMDAwKSA8PCAodGRhODI3eF90YWJsZVtpXS5zcGQgKyAyKTsKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IChOPj44KSB8IDB4NDA7CkBAIC01NDAsNyArNTQyLDcgQEAKIAkJaWZfZnJlcSA9IDUwMDAwMDA7CiAJCWJyZWFrOwogCX0KLQl0dW5lcl9mcmVxID0gcGFyYW1zLT5mcmVxdWVuY3kgKyBpZl9mcmVxOworCXR1bmVyX2ZyZXEgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKIAogCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9RQU0pIHsKIAkJZHByaW50aygiJXMgc2VsZWN0IHRkYTgyN3hhX2R2YmNcbiIsIF9fZnVuY19fKTsKQEAgLTU1NCw2ICs1NTYsOCBAQAogCQlpKys7CiAJfQogCisJdHVuZXJfZnJlcSArPSBpZl9mcmVxOworCiAJTiA9ICgodHVuZXJfZnJlcSArIDMxMjUwKSAvIDYyNTAwKSA8PCBmcmVxdWVuY3lfbWFwW2ldLnNwZDsKIAlidWZbMF0gPSAwOyAgICAgICAgICAgIC8vIHN1YmFkZHJlc3MKIAlidWZbMV0gPSBOID4+IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCmluZGV4IDk0YTYwM2EuLmUxMzY4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguYwppbmRleCAxNmZiYTZiLi4zYWNiYWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5jCkBAIC02MTQsNiArNjE0LDEzIEBACiAJCQlwICs9IGxlbjsKIAkJCXNpemUgLT0gbGVuOwogCQl9CisKKwkJLyogc2lsZW50bHkgZmFpbCBpZiB0aGUgZnJvbnRlbmQgZG9lc24ndCBzdXBwb3J0IEkyQyBmbHVzaCAqLworCQlyYyA9IGRvX3R1bmVyX2NhbGxiYWNrKGZlLCBYQzIwMjhfSTJDX0ZMVVNILCAwKTsKKwkJaWYgKChyYyA8IDApICYmIChyYyAhPSAtRUlOVkFMKSkgeworCQkJdHVuZXJfZXJyKCJlcnJvciBleGVjdXRpbmcgZmx1c2g6ICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC05MzMsMTEgKzk0MCwxNiBAQAogCSAqIHRoYXQgeGMyMDI4IHdpbGwgYmUgaW4gYSBzYWZlIHN0YXRlLgogCSAqIE1heWJlIHRoaXMgbWlnaHQgYWxzbyBiZSBuZWVkZWQgZm9yIERUVi4KIAkgKi8KLQlpZiAobmV3X3R5cGUgPT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpIHsKKwlzd2l0Y2ggKG5ld190eXBlKSB7CisJY2FzZSBWNEwyX1RVTkVSX0FOQUxPR19UVjoKIAkJcmMgPSBzZW5kX3NlcShwcml2LCB7MHgwMCwgMHgwMH0pOwogCi0JCS8qIEFuYWxvZyBtb2RlcyByZXF1aXJlIG9mZnNldCA9IDAgKi8KLQl9IGVsc2UgeworCQkvKiBBbmFsb2cgbW9kZSByZXF1aXJlcyBvZmZzZXQgPSAwICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKKwkJLyogUmFkaW8gbW9kZSByZXF1aXJlcyBvZmZzZXQgPSAwICovCisJCWJyZWFrOworCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgogCQkvKgogCQkgKiBEaWdpdGFsIG1vZGVzIHJlcXVpcmUgYW4gb2Zmc2V0IHRvIGFkanVzdCB0byB0aGUKIAkJICogcHJvcGVyIGZyZXF1ZW5jeS4gVGhlIG9mZnNldCBkZXBlbmRzIG9uIHdoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguaCBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci14YzIwMjguaAppbmRleCA5Nzc4Yzk2Li45ZWJmYjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXIteGMyMDI4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXhjMjAyOC5oCkBAIC01NCw2ICs1NCw3IEBACiAvKiB4YzIwMjggY29tbWFuZHMgZm9yIGNhbGxiYWNrICovCiAjZGVmaW5lIFhDMjAyOF9UVU5FUl9SRVNFVAkwCiAjZGVmaW5lIFhDMjAyOF9SRVNFVF9DTEsJMQorI2RlZmluZSBYQzIwMjhfSTJDX0ZMVVNICTIKIAogI2lmIGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOCkgfHwgKGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDMjAyOF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzIwMjhfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKaW5kZXggYjk3Y2Y3Mi4uM2QwNGE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCkBAIC0xMiw1ICsxMiw1IEBACiBiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCiBvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCmluZGV4IGQ5OGYxZDQuLjA3MTNiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogb2JqLSQoQ09ORklHX0RWQl9CVDhYWCkgKz0gYnQ4NzgubyBkdmItYnQ4eHgubyBkc3QubyBkc3RfY2EubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4Ci1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQppbmRleCBkZTRmZTE5Li4zODAxOWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQpAQCAtNiw5ICs2LDkgQEAKIAogb2JqLSQoQ09ORklHX0RWQl9EREJSSURHRSkgKz0gZGRicmlkZ2UubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiAjIEZvciB0aGUgc3RhZ2luZyBDSSBkcml2ZXIgY3hkMjA5OQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYwppbmRleCA1NzNkNTQwLi5iYTlhNjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtY29yZS5jCkBAIC01MDcsMTUgKzUwNywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc2l6ZV90IGRkYl9pbnB1dF9yZWFkKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0LCB1OCAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBkZGJfaW5wdXRfcmVhZChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCwgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CiAJdTMyIGxlZnQgPSBjb3VudDsKLQl1MzIgaWR4LCBvZmYsIGZyZWUsIHN0YXQgPSBpbnB1dC0+c3RhdDsKKwl1MzIgaWR4LCBmcmVlLCBzdGF0ID0gaW5wdXQtPnN0YXQ7CiAJaW50IHJldDsKIAogCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7Ci0Jb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKIAogCXdoaWxlIChsZWZ0KSB7CiAJCWlmIChpbnB1dC0+Y2J1ZiA9PSBpZHgpCkBAIC01MjUsNiArNTI0LDggQEAKIAkJCWZyZWUgPSBsZWZ0OwogCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCBpbnB1dC0+dmJ1ZltpbnB1dC0+Y2J1Zl0gKwogCQkJCSAgIGlucHV0LT5jb2ZmLCBmcmVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlpbnB1dC0+Y29mZiArPSBmcmVlOwogCQlpZiAoaW5wdXQtPmNvZmYgPT0gaW5wdXQtPmRtYV9idWZfc2l6ZSkgewogCQkJaW5wdXQtPmNvZmYgPSAwOwpAQCAtOTM5LDYgKzk0MCw4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJcmVhZCA9IGRkYl9pbnB1dF9yZWFkKGlucHV0LCBidWYsIGxlZnQpOworCQlpZiAocmVhZCA8IDApCisJCQlyZXR1cm4gcmVhZDsKIAkJbGVmdCAtPSByZWFkOwogCQlidWYgKz0gcmVhZDsKIAl9CkBAIC0xNDM4LDcgKzE0NDEsNyBAQAogewogCXN0cnVjdCBkZGIgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAl2b2lkICpwYXJnID0gKHZvaWQgKilhcmc7Ci0JaW50IHJlcyA9IC1FRkFVTFQ7CisJaW50IHJlczsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJT0NUTF9EREJfRkxBU0hJTzoKQEAgLTE0NDcsMjkgKzE0NTAsMjkgQEAKIAkJdTggKnJidWYsICp3YnVmOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZmlvLCBwYXJnLCBzaXplb2YoZmlvKSkpCi0JCQlicmVhazsKLQkJaWYgKGZpby53cml0ZV9sZW4gKyBmaW8ucmVhZF9sZW4gPiAxMDI4KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIklPQlVGIHRvbyBzbWFsbFxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZpby53cml0ZV9sZW4gPiAxMDI4IHx8IGZpby5yZWFkX2xlbiA+IDEwMjgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpby53cml0ZV9sZW4gKyBmaW8ucmVhZF9sZW4gPiAxMDI4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJd2J1ZiA9ICZkZXYtPmlvYnVmWzBdOwotCQlpZiAoIXdidWYpCi0JCQlyZXR1cm4gLUVOT01FTTsKIAkJcmJ1ZiA9IHdidWYgKyBmaW8ud3JpdGVfbGVuOwotCQlpZiAoY29weV9mcm9tX3VzZXIod2J1ZiwgZmlvLndyaXRlX2J1ZiwgZmlvLndyaXRlX2xlbikpIHsKLQkJCXZmcmVlKHdidWYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmVzID0gZmxhc2hpbyhkZXYsIHdidWYsIGZpby53cml0ZV9sZW4sCi0JCQkgICAgICByYnVmLCBmaW8ucmVhZF9sZW4pOworCisJCWlmIChjb3B5X2Zyb21fdXNlcih3YnVmLCBmaW8ud3JpdGVfYnVmLCBmaW8ud3JpdGVfbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXMgPSBmbGFzaGlvKGRldiwgd2J1ZiwgZmlvLndyaXRlX2xlbiwgcmJ1ZiwgZmlvLnJlYWRfbGVuKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CiAJCWlmIChjb3B5X3RvX3VzZXIoZmlvLnJlYWRfYnVmLCByYnVmLCBmaW8ucmVhZF9sZW4pKQotCQkJcmVzID0gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCXJldHVybiAtRU5PVFRZOwogCX0KLQlyZXR1cm4gcmVzOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZGJfZm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9NYWtlZmlsZQppbmRleCA4YWMyOGIwLi45NWEwMDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9ETTExMDUpICs9IGRtMTEwNS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGVmZTljMzAuLjJjMGFjZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC0xNDksMzAgKzE0OSwyNSBAQAogCiAJZHByaW50ayAoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlICgmZXZlbnRzLT5tdHgpKQotCQlyZXR1cm47CisJaWYgKChzdGF0dXMgJiBGRV9IQVNfTE9DSykgJiYgZmUtPm9wcy5nZXRfZnJvbnRlbmQpCisJCWZlLT5vcHMuZ2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzX291dCk7CisKKwltdXRleF9sb2NrKCZldmVudHMtPm10eCk7CiAKIAl3cCA9IChldmVudHMtPmV2ZW50dyArIDEpICUgTUFYX0VWRU5UOwotCiAJaWYgKHdwID09IGV2ZW50cy0+ZXZlbnRyKSB7CiAJCWV2ZW50cy0+b3ZlcmZsb3cgPSAxOwogCQlldmVudHMtPmV2ZW50ciA9IChldmVudHMtPmV2ZW50ciArIDEpICUgTUFYX0VWRU5UOwogCX0KIAogCWUgPSAmZXZlbnRzLT5ldmVudHNbZXZlbnRzLT5ldmVudHddOwotCi0JaWYgKHN0YXR1cyAmIEZFX0hBU19MT0NLKQotCQlpZiAoZmUtPm9wcy5nZXRfZnJvbnRlbmQpCi0JCQlmZS0+b3BzLmdldF9mcm9udGVuZChmZSwgJmZlcHJpdi0+cGFyYW1ldGVyc19vdXQpOwotCisJZS0+c3RhdHVzID0gc3RhdHVzOwogCWUtPnBhcmFtZXRlcnMgPSBmZXByaXYtPnBhcmFtZXRlcnNfb3V0OwogCiAJZXZlbnRzLT5ldmVudHcgPSB3cDsKIAogCW11dGV4X3VubG9jaygmZXZlbnRzLT5tdHgpOwogCi0JZS0+c3RhdHVzID0gc3RhdHVzOwotCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmZXZlbnRzLT53YWl0X3F1ZXVlKTsKIH0KIApAQCAtMjA3LDE5ICsyMDIsMjQgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSAoJmV2ZW50cy0+bXR4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCW1lbWNweSAoZXZlbnQsICZldmVudHMtPmV2ZW50c1tldmVudHMtPmV2ZW50cl0sCi0JCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50KSk7Ci0KKwltdXRleF9sb2NrKCZldmVudHMtPm10eCk7CisJKmV2ZW50ID0gZXZlbnRzLT5ldmVudHNbZXZlbnRzLT5ldmVudHJdOwogCWV2ZW50cy0+ZXZlbnRyID0gKGV2ZW50cy0+ZXZlbnRyICsgMSkgJSBNQVhfRVZFTlQ7Ci0KIAltdXRleF91bmxvY2soJmV2ZW50cy0+bXR4KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfY2xlYXJfZXZlbnRzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CisJc3RydWN0IGR2Yl9mZV9ldmVudHMgKmV2ZW50cyA9ICZmZXByaXYtPmV2ZW50czsKKworCW11dGV4X2xvY2soJmV2ZW50cy0+bXR4KTsKKwlldmVudHMtPmV2ZW50ciA9IGV2ZW50cy0+ZXZlbnR3OworCW11dGV4X3VubG9jaygmZXZlbnRzLT5tdHgpOworfQorCiBzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlkcHJpbnRrICgiRFZCOiBpbml0aWFsaXNpbmcgYWRhcHRlciAlaSBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLApAQCAtNTM3LDcgKzUzNyw2IEBACiB7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBkYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWZlX3N0YXR1c190IHM7CiAJZW51bSBkdmJmZV9hbGdvIGFsZ287CiAKQEAgLTU1OCw3ICs1NTcsNyBAQAogCXdoaWxlICgxKSB7CiAJCXVwKCZmZXByaXYtPnNlbSk7CSAgICAvKiBpcyBsb2NrZWQgd2hlbiB3ZSBlbnRlciB0aGUgdGhyZWFkLi4uICovCiByZXN0YXJ0OgotCQl0aW1lb3V0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZmVwcml2LT53YWl0X3F1ZXVlLAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChmZXByaXYtPndhaXRfcXVldWUsCiAJCQlkdmJfZnJvbnRlbmRfc2hvdWxkX3dha2V1cChmZSkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpCiAJCQkJfHwgZnJlZXppbmcoY3VycmVudCksCiAJCQlmZXByaXYtPmRlbGF5KTsKQEAgLTU3NywxMiArNTc2LDEwIEBACiAKIAkJaWYgKGZlcHJpdi0+cmVpbml0aWFsaXNlKSB7CiAJCQlkdmJfZnJvbnRlbmRfaW5pdChmZSk7Ci0JCQlpZiAoZmVwcml2LT50b25lICE9IC0xKSB7CisJCQlpZiAoZmUtPm9wcy5zZXRfdG9uZSAmJiBmZXByaXYtPnRvbmUgIT0gLTEpCiAJCQkJZmUtPm9wcy5zZXRfdG9uZShmZSwgZmVwcml2LT50b25lKTsKLQkJCX0KLQkJCWlmIChmZXByaXYtPnZvbHRhZ2UgIT0gLTEpIHsKKwkJCWlmIChmZS0+b3BzLnNldF92b2x0YWdlICYmIGZlcHJpdi0+dm9sdGFnZSAhPSAtMSkKIAkJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCBmZXByaXYtPnZvbHRhZ2UpOwotCQkJfQogCQkJZmVwcml2LT5yZWluaXRpYWxpc2UgPSAwOwogCQl9CiAKQEAgLTEwMTksNiArMTAxNiwyOSBAQAogCXJldHVybiAwOwogfQogCisvKiBJbml0aWFsaXplIHRoZSBjYWNoZSB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZGVyaXZlZCBmcm9tIHRoZQorICogbGVnYWN5IGZyb250ZW5kX2luZm8gc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjKQoreworCXN3aXRjaCAoZmUtPm9wcy5pbmZvLnR5cGUpIHsKKwljYXNlIEZFX1FQU0s6CisJCWMtPm1vZHVsYXRpb24gPSBRUFNLOyAgIC8qIGltcGxpZWQgZm9yIERWQi1TIGluIGxlZ2FjeSBBUEkgKi8KKwkJYy0+cm9sbG9mZiA9IFJPTExPRkZfMzU7LyogaW1wbGllZCBmb3IgRFZCLVMgKi8KKwkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlM7CisJCWJyZWFrOworCWNhc2UgRkVfUUFNOgorCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCQ19BTk5FWF9BQzsKKwkJYnJlYWs7CisJY2FzZSBGRV9PRkRNOgorCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCVDsKKwkJYnJlYWs7CisJY2FzZSBGRV9BVFNDOgorCQlicmVhazsKKwl9Cit9CisKIC8qIFN5bmNocm9uaXNlIHRoZSBsZWdhY3kgdHVuaW5nIHBhcmFtZXRlcnMgaW50byB0aGUgY2FjaGUsIHNvIHRoYXQgZGVtb2R1bGF0b3IKICAqIGRyaXZlcnMgY2FuIHVzZSBhIHNpbmdsZSBzZXRfZnJvbnRlbmQgdHVuaW5nIGZ1bmN0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKICAqIGl0J3MgYmVpbmcgdXNlZCBmb3IgdGhlIGxlZ2FjeSBvciBuZXcgQVBJLCByZWR1Y2luZyBjb2RlIGFuZCBjb21wbGV4aXR5LgpAQCAtMTAzMiwxNyArMTA1MiwxMyBAQAogCiAJc3dpdGNoIChmZS0+b3BzLmluZm8udHlwZSkgewogCWNhc2UgRkVfUVBTSzoKLQkJYy0+bW9kdWxhdGlvbiA9IFFQU0s7ICAgLyogaW1wbGllZCBmb3IgRFZCLVMgaW4gbGVnYWN5IEFQSSAqLwotCQljLT5yb2xsb2ZmID0gUk9MTE9GRl8zNTsvKiBpbXBsaWVkIGZvciBEVkItUyAqLwogCQljLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKIAkJYy0+ZmVjX2lubmVyID0gcC0+dS5xcHNrLmZlY19pbm5lcjsKLQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlM7CiAJCWJyZWFrOwogCWNhc2UgRkVfUUFNOgogCQljLT5zeW1ib2xfcmF0ZSA9IHAtPnUucWFtLnN5bWJvbF9yYXRlOwogCQljLT5mZWNfaW5uZXIgPSBwLT51LnFhbS5mZWNfaW5uZXI7CiAJCWMtPm1vZHVsYXRpb24gPSBwLT51LnFhbS5tb2R1bGF0aW9uOwotCQljLT5kZWxpdmVyeV9zeXN0ZW0gPSBTWVNfRFZCQ19BTk5FWF9BQzsKIAkJYnJlYWs7CiAJY2FzZSBGRV9PRkRNOgogCQlpZiAocC0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNl9NSFopCkBAIC0xMDYwLDcgKzEwNzYsNiBAQAogCQljLT50cmFuc21pc3Npb25fbW9kZSA9IHAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZTsKIAkJYy0+Z3VhcmRfaW50ZXJ2YWwgPSBwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWw7CiAJCWMtPmhpZXJhcmNoeSA9IHAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb247Ci0JCWMtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19EVkJUOwogCQlicmVhazsKIAljYXNlIEZFX0FUU0M6CiAJCWMtPm1vZHVsYXRpb24gPSBwLT51LnZzYi5tb2R1bGF0aW9uOwpAQCAtMTEzMiwxNiArMTE0NywxMyBAQAogCXAtPmZyZXF1ZW5jeSA9IGMtPmZyZXF1ZW5jeTsKIAlwLT5pbnZlcnNpb24gPSBjLT5pbnZlcnNpb247CiAKLQlzd2l0Y2goYy0+bW9kdWxhdGlvbikgewotCWNhc2UgUFNLXzg6Ci0JY2FzZSBBUFNLXzE2OgotCWNhc2UgQVBTS18zMjoKLQljYXNlIFFQU0s6CisJaWYgKGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFNTIHx8CisJICAgIGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCUyB8fAorCSAgICBjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlMyIHx8CisJICAgIGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfSVNEQlMgfHwKKwkgICAgYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19UVVJCTykgewogCQlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBjLT5zeW1ib2xfcmF0ZTsKIAkJcC0+dS5xcHNrLmZlY19pbm5lciA9IGMtPmZlY19pbm5lcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CiAJfQogCiAJLyogRmFrZSBvdXQgYSBnZW5lcmljIERWQi1UIHJlcXVlc3Qgc28gd2UgcGFzcyB2YWxpZGF0aW9uIGluIHRoZSBpb2N0bCAqLwpAQCAtMTgyNCw5ICsxODM2LDE3IEBACiAKIAkJCW1lbWNweSAoJmZlcHJpdi0+cGFyYW1ldGVyc19pbiwgcGFyZywKIAkJCQlzaXplb2YgKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOworCQkJZHR2X3Byb3BlcnR5X2NhY2hlX2luaXQoZmUsIGMpOwogCQkJZHR2X3Byb3BlcnR5X2NhY2hlX3N5bmMoZmUsIGMsICZmZXByaXYtPnBhcmFtZXRlcnNfaW4pOwogCQl9CiAKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBvdXRwdXQgcGFyYW1ldGVycyB0byBtYXRjaCB0aGUgdmFsdWVzIGdpdmVuIGJ5CisJCSAqIHRoZSB1c2VyLiBGRV9TRVRfRlJPTlRFTkQgdHJpZ2dlcnMgYW4gaW5pdGlhbCBmcm9udGVuZCBldmVudAorCQkgKiB3aXRoIHN0YXR1cyA9IDAsIHdoaWNoIGNvcGllcyBvdXRwdXQgcGFyYW1ldGVycyB0byB1c2Vyc3BhY2UuCisJCSAqLworCQlmZXByaXYtPnBhcmFtZXRlcnNfb3V0ID0gZmVwcml2LT5wYXJhbWV0ZXJzX2luOworCiAJCW1lbXNldCgmZmV0dW5lc2V0dGluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MpKTsKIAkJbWVtY3B5KCZmZXR1bmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwYXJnLAogCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpKTsKQEAgLTE4ODQsOCArMTkwNCw5IEBACiAJCS8qIFJlcXVlc3QgdGhlIHNlYXJjaCBhbGdvcml0aG0gdG8gc2VhcmNoICovCiAJCWZlcHJpdi0+YWxnb19zdGF0dXMgfD0gRFZCRkVfQUxHT19TRUFSQ0hfQUdBSU47CiAKLQkJZHZiX2Zyb250ZW5kX3dha2V1cChmZSk7CisJCWR2Yl9mcm9udGVuZF9jbGVhcl9ldmVudHMoZmUpOwogCQlkdmJfZnJvbnRlbmRfYWRkX2V2ZW50KGZlLCAwKTsKKwkJZHZiX2Zyb250ZW5kX3dha2V1cChmZSk7CiAJCWZlcHJpdi0+c3RhdHVzID0gMDsKIAkJZXJyID0gMDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IDU1OTBlYjYuLjY3YmJmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC0yMDksNiArMjA5LDcgQEAKIAogCWludCAoKmdldF9mcmVxdWVuY3kpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSk7CiAJaW50ICgqZ2V0X2JhbmR3aWR0aCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKTsKKwlpbnQgKCpnZXRfaWZfZnJlcXVlbmN5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpOwogCiAjZGVmaW5lIFRVTkVSX1NUQVRVU19MT0NLRUQgMQogI2RlZmluZSBUVU5FUl9TVEFUVVNfU1RFUkVPIDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCA1ZDczZGVjLi41ODI1NzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC0yNTgsNiArMjU4LDE5IEBACiAJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIGRlZmF1bHQgcmVtb3RlIGNvbnRyb2wgZGVjb2RpbmcgZm9yIHRoZQogCSAgQWZhdGVjaCBBRjkwMDUgYmFzZWQgcmVjZWl2ZXIuCiAKK2NvbmZpZyBEVkJfVVNCX1BDVFY0NTJFCisJdHJpc3RhdGUgIlBpbm5hY2xlIFBDVFYgSERUViBQcm8gVVNCIGRldmljZS9UVCBDb25uZWN0IFMyLTM2MDAiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IFRUUENJX0VFUFJPTQorCXNlbGVjdCBEVkJfTE5CUDIyIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEIwODk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVEI2MTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXh0ZXJuYWwgVVNCIGFkYXB0ZXIgZGVzaWduZWQgYnkgUGlubmFjbGUsCisJICBzaGlwcGVkIHVuZGVyIHRoZSBicmFuZCBuYW1lICdQQ1RWIEhEVFYgUHJvIFVTQicuCisJICBBbHNvIHN1cHBvcnRzIFRUIENvbm5lY3QgUzItMzYwMC8zNjUwIGNhcmRzLgorCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgZGV2aWNlIGFuZCB3YW50IHRvIHVzZSBpdC4KKwogY29uZmlnIERWQl9VU0JfRFcyMTAyCiAJdHJpc3RhdGUgIkR2YldvcmxkICYgVGVWaWkgRFZCLVMvUzIgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCkBAIC0zNzQsMyArMzg3LDE4IEBACiAJc2VsZWN0IERWQl9TVFY2MTEweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgVGVjaG5pc2F0IFVTQjIgRFZCLVMvUzIgZGV2aWNlCisKK2NvbmZpZyBEVkJfVVNCX0lUOTEzWAorCXRyaXN0YXRlICJpdDkxM3ggZHJpdmVyIgorCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfSVQ5MTNYX0ZFCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBpdDkxM3ggZGV2aWNlCisKK2NvbmZpZyBEVkJfVVNCX01YTDExMVNGCisJdHJpc3RhdGUgIk14TDExMVNGIERUViBVU0IyLjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0xHRFQzMzA1IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNeEwxMTFTRiBVU0IyLjAgRFRWIHJlY2VpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKaW5kZXggNGJhYzEzZC4uMjZjOGI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCkBAIC02NCw2ICs2NCw5IEBACiBkdmItdXNiLWFueXNlZS1vYmpzID0gYW55c2VlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX0FOWVNFRSkgKz0gZHZiLXVzYi1hbnlzZWUubwogCitkdmItdXNiLXBjdHY0NTJlLW9ianMgPSBwY3R2NDUyZS5vCitvYmotJChDT05GSUdfRFZCX1VTQl9QQ1RWNDUyRSkgKz0gZHZiLXVzYi1wY3R2NDUyZS5vCisKIGR2Yi11c2ItZHcyMTAyLW9ianMgPSBkdzIxMDIubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRFcyMTAyKSArPSBkdmItdXNiLWR3MjEwMi5vCiAKQEAgLTk0LDcgKzk3LDE2IEBACiBkdmItdXNiLXRlY2huaXNhdC11c2IyLW9ianMgPSB0ZWNobmlzYXQtdXNiMi5vCiBvYmotJChDT05GSUdfRFZCX1VTQl9URUNITklTQVRfVVNCMikgKz0gZHZiLXVzYi10ZWNobmlzYXQtdXNiMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK2R2Yi11c2ItaXQ5MTN4LW9ianMgOj0gaXQ5MTN4Lm8KK29iai0kKENPTkZJR19EVkJfVVNCX0lUOTEzWCkgKz0gZHZiLXVzYi1pdDkxM3gubworCitkdmItdXNiLW14bDExMXNmLW9ianMgPSBteGwxMTFzZi5vIG14bDExMXNmLXBoeS5vIG14bDExMXNmLWkyYy5vIG14bDExMXNmLWdwaW8ubworb2JqLSQoQ09ORklHX0RWQl9VU0JfTVhMMTExU0YpICs9IGR2Yi11c2ItbXhsMTExc2Yubworb2JqLSQoQ09ORklHX0RWQl9VU0JfTVhMMTExU0YpICs9IG14bDExMXNmLWRlbW9kLm8KK29iai0kKENPTkZJR19EVkJfVVNCX01YTDExMVNGKSArPSBteGwxMTFzZi10dW5lci5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KICMgZHVlIHRvIHR1bmVyLXhjMzAyOAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL3R0cGNpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKaW5kZXggYjk1YTk1ZS4uMmFlZjNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKQEAgLTEyNyw2ICsxMjcsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCkBAIC0xNDcsNyArMTQ5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCi0KKwkJfX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMKaW5kZXggNmFkOTQ3NDUuLjMyNjNlOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUtZmUuYwpAQCAtNjMsMTEgKzYzLDkgQEAKIAkJCQkgdTE2IHJlZ2xvLCB1OCBwb3MsIHU4IGxlbiwgdTE2IHZhbHVlKQogewogCWludCByZXQ7Ci0JdTggdGVtcDsKIAogCWlmICgocmV0ID0gYWY5MDA1X3dyaXRlX29mZG1fcmVnaXN0ZXIoZCwgcmVnbG8sICh1OCkgKHZhbHVlICYgMHhmZikpKSkKIAkJcmV0dXJuIHJldDsKLQl0ZW1wID0gKHU4KSAoKHZhbHVlICYgMHgwMzAwKSA+PiA4KTsKIAlyZXR1cm4gYWY5MDA1X3dyaXRlX3JlZ2lzdGVyX2JpdHMoZCwgcmVnaGksIHBvcywgbGVuLAogCQkJCQkgICh1OCkgKCh2YWx1ZSAmIDB4MzAwKSA+PiA4KSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUuYwppbmRleCAwMzUxYzBlLi5iZDUxYTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LmMKQEAgLTgxNSw3ICs4MTUsNyBAQAogCQkJZGVidWdfZHVtcChidWYsIDgsIHByaW50ayk7CiAJCX0KIAl9Ci0JYWRhcC0+ZmUgPSBhZjkwMDVfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGFmOTAwNV9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTk5LDYgKzk5OSw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCSAgICB7CisJCSAgICAubnVtX2Zyb250ZW5kcyA9IDEsCisJCSAgICAuZmUgPSB7ewogCQkgICAgIC5jYXBzID0KIAkJICAgICBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkgICAgIERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTAxOCw2ICsxMDIwLDcgQEAKIAkJCQkJICAgICAgIH0KIAkJCQkgICAgICB9CiAJCQkJfSwKKwkJICAgICB9fSwKIAkJICAgICB9CiAJCSAgICB9LAogCS5wb3dlcl9jdHJsID0gYWY5MDA1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYwppbmRleCBkN2FkMDVmLi5jNmMyNzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKQEAgLTc0NCwyOSArNzQ0LDMxIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFmOTAxNV9yY19zZXR1cCBhZjkwMTVfcmNfc2V0dXBfdXNiaWRzW10gPSB7Ci0JeyAoVVNCX1ZJRF9URVJSQVRFQyA8PCAxNikgKyBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9TVElDS19SQywKKwl7IChVU0JfVklEX1RFUlJBVEVDIDw8IDE2KSB8IFVTQl9QSURfVEVSUkFURUNfQ0lORVJHWV9UX1NUSUNLX1JDLAogCQlSQ19NQVBfVEVSUkFURUNfU0xJTV8yIH0sCi0JeyAoVVNCX1ZJRF9URVJSQVRFQyA8PCAxNikgKyBVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9TVElDS19EVUFMX1JDLAorCXsgKFVTQl9WSURfVEVSUkFURUMgPDwgMTYpIHwgVVNCX1BJRF9URVJSQVRFQ19DSU5FUkdZX1RfU1RJQ0tfRFVBTF9SQywKIAkJUkNfTUFQX1RFUlJBVEVDX1NMSU0gfSwKLQl7IChVU0JfVklEX1ZJU0lPTlBMVVMgPDwgMTYpICsgVVNCX1BJRF9BWlVSRVdBVkVfQURfVFU3MDAsCisJeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSB8IFVTQl9QSURfQVpVUkVXQVZFX0FEX1RVNzAwLAogCQlSQ19NQVBfQVpVUkVXQVZFX0FEX1RVNzAwIH0sCi0JeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSArIFVTQl9QSURfVElOWVRXSU4sCisJeyAoVVNCX1ZJRF9WSVNJT05QTFVTIDw8IDE2KSB8IFVTQl9QSURfVElOWVRXSU4sCiAJCVJDX01BUF9BWlVSRVdBVkVfQURfVFU3MDAgfSwKLQl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lfVk9YX01JTklfSUlJLAorCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpIHwgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUksCiAJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKLQl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lWT1hfRFVPLAorCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpIHwgVVNCX1BJRF9NU0lfRElHSVZPWF9EVU8sCiAJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKLQl7IChVU0JfVklEX0xFQURURUsgPDwgMTYpICsgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfR09MRCwKKwl7IChVU0JfVklEX0xFQURURUsgPDwgMTYpIHwgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfR09MRCwKIAkJUkNfTUFQX0xFQURURUtfWTA0RzAwNTEgfSwKLQl7IChVU0JfVklEX0FWRVJNRURJQSA8PCAxNikgKyBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9YLAorCXsgKFVTQl9WSURfTEVBRFRFSyA8PCAxNikgfCBVU0JfUElEX1dJTkZBU1RfRFRWMjAwMERTLAorCQlSQ19NQVBfTEVBRFRFS19ZMDRHMDA1MSB9LAorCXsgKFVTQl9WSURfQVZFUk1FRElBIDw8IDE2KSB8IFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSX1gsCiAJCVJDX01BUF9BVkVSTUVESUFfTTEzNUEgfSwKLQl7IChVU0JfVklEX0FGQVRFQ0ggPDwgMTYpICsgVVNCX1BJRF9UUkVLU1RPUl9EVkJULAorCXsgKFVTQl9WSURfQUZBVEVDSCA8PCAxNikgfCBVU0JfUElEX1RSRUtTVE9SX0RWQlQsCiAJCVJDX01BUF9UUkVLU1RPUiB9LAotCXsgKFVTQl9WSURfS1dPUkxEXzIgPDwgMTYpICsgVVNCX1BJRF9USU5ZVFdJTl8yLAorCXsgKFVTQl9WSURfS1dPUkxEXzIgPDwgMTYpIHwgVVNCX1BJRF9USU5ZVFdJTl8yLAogCQlSQ19NQVBfRElHSVRBTE5PV19USU5ZVFdJTiB9LAotCXsgKFVTQl9WSURfR1RFSyA8PCAxNikgKyBVU0JfUElEX1RJTllUV0lOXzMsCisJeyAoVVNCX1ZJRF9HVEVLIDw8IDE2KSB8IFVTQl9QSURfVElOWVRXSU5fMywKIAkJUkNfTUFQX0RJR0lUQUxOT1dfVElOWVRXSU4gfSwKLQl7IChVU0JfVklEX0tXT1JMRF8yIDw8IDE2KSArIFVTQl9QSURfU1ZFT05fU1RWMjIsCisJeyAoVVNCX1ZJRF9LV09STERfMiA8PCAxNikgfCBVU0JfUElEX1NWRU9OX1NUVjIyLAogCQlSQ19NQVBfTVNJX0RJR0lWT1hfSUlJIH0sCiAJeyB9CiB9OwpAQCAtODU5LDEzICs4NjEsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWY5MDE1X3Byb3BlcnRpZXNfY291bnQ7IGkrKykgewogCQkvKiBVU0IxLjEgc2V0IHNtYWxsZXIgYnVmZmVyc2l6ZSBhbmQgZGlzYWJsZSAybmQgYWRhcHRlciAqLwogCQlpZiAodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwpIHsKLQkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLmFkYXB0ZXJbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplCisJCQlhZjkwMTVfcHJvcGVydGllc1tpXS5hZGFwdGVyWzBdLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZQogCQkJCT0gVFNfVVNCMTFfRlJBTUVfU0laRTsKIAkJCS8qIGRpc2FibGUgMm5kIGFkYXB0ZXIgYmVjYXVzZSB3ZSBkb24ndCBoYXZlCiAJCQkgICBQSUQtZmlsdGVycyAqLwogCQkJYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUgPSAwOwogCQl9IGVsc2UgewotCQkJYWY5MDE1X3Byb3BlcnRpZXNbaV0uYWRhcHRlclswXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUKKwkJCWFmOTAxNV9wcm9wZXJ0aWVzW2ldLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplCiAJCQkJPSBUU19VU0IyMF9GUkFNRV9TSVpFOwogCQl9CiAJfQpAQCAtMTExMSwxMCArMTExMywxMCBAQAogCX0KIAogCS8qIGF0dGFjaCBkZW1vZHVsYXRvciAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhZjkwMTNfYXR0YWNoLCAmYWY5MDE1X2FmOTAxM19jb25maWdbYWRhcC0+aWRdLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGFmOTAxM19hdHRhY2gsICZhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0sCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgc3RydWN0IG10MjA2MF9jb25maWcgYWY5MDE1X210MjA2MF9jb25maWcgPSB7CkBAIC0xMTg4LDQ5ICsxMTkwLDQ5IEBACiAJc3dpdGNoIChhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0udHVuZXIpIHsKIAljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjA6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwXzI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tdDIwNjBfY29uZmlnLAogCQkJYWY5MDE1X2NvbmZpZy5tdDIwNjBfaWYxW2FkYXAtPmlkXSkKIAkJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfUVQxMDEwOgogCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMEE6Ci0JCXJldCA9IGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjcxOgotCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjcxX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X3RkYTE4MjcxX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9UREExODIxODoKLQkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODIxOF9hdHRhY2gsIGFkYXAtPmZlLAorCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjE4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV90ZGExODIxOF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwM0Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNUQ6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNVI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwNV9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfRU5WNzdIMTFENToKLQkJcmV0ID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCXJldCA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4YzAsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCURWQl9QTExfVERBNjY1WCkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NQzQ0UzgwMzoKLQkJcmV0ID0gZHZiX2F0dGFjaChtYzQ0czgwM19hdHRhY2gsIGFkYXAtPmZlLAorCQlyZXQgPSBkdmJfYXR0YWNoKG1jNDRzODAzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tYzQ0czgwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwN1Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwN3RfYXR0YWNoLCBhZGFwLT5mZSwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCTB4YzAsICZhZjkwMTVfbXhsNTAwN3RfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwpAQCAtMTMwNCw2ICsxMzA2LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAKQEAgLTEzMTksOCArMTMyMywxMSBAQAogCQkJCQkuY291bnQgPSA2LAogCQkJCQkuZW5kcG9pbnQgPSAweDg0LAogCQkJCX0sCisJCQl9fSwKIAkJCX0sCiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5mcm9udGVuZF9hdHRhY2ggPQogCQkJCQlhZjkwMTVfYWY5MDEzX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgID0gYWY5MDE1X3R1bmVyX2F0dGFjaCwKQEAgLTEzMzUsNiArMTM0Miw3IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9LAorCQkJfX0sCiAJCQl9CiAJCX0sCiAKQEAgLTE0MzIsNiArMTQ0MCw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAyLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCkBAIC0xNDQ3LDggKzE0NTcsMTEgQEAKIAkJCQkJLmNvdW50ID0gNiwKIAkJCQkJLmVuZHBvaW50ID0gMHg4NCwKIAkJCQl9LAorCQkJfX0sCiAJCQl9LAogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoID0KIAkJCQkJYWY5MDE1X2FmOTAxM19mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICA9IGFmOTAxNV90dW5lcl9hdHRhY2gsCkBAIC0xNDYzLDYgKzE0NzYsNyBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfSwKKwkJCX19LAogCQkJfQogCQl9LAogCkBAIC0xNTQ5LDYgKzE1NjMsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtMTU2NCw4ICsxNTgwLDExIEBACiAJCQkJCS5jb3VudCA9IDYsCiAJCQkJCS5lbmRwb2ludCA9IDB4ODQsCiAJCQkJfSwKKwkJCX19LAogCQkJfSwKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmZyb250ZW5kX2F0dGFjaCA9CiAJCQkJCWFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgPSBhZjkwMTVfdHVuZXJfYXR0YWNoLApAQCAtMTU4MCw2ICsxNTk5LDcgQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0sCisJCQl9fSwKIAkJCX0KIAkJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKaW5kZXggMmNiZjE5YS4uNWYyMjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCkBAIC00NDYsNiArNDQ2LDExNCBAQAogICogSU9FWzVdIFNUVjA5MDMgMT1lbmFibGVkCiAgKi8KIAorc3RhdGljIGludCBhbnlzZWVfZnJvbnRlbmRfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmKQoreworCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBhbnlzZWVfc3RhdGUgKnN0YXRlID0gYWRhcC0+ZGV2LT5wcml2OworCWludCByZXQ7CisKKwlkZWJfaW5mbygiJXM6IGZlPSVkIG9ub2ZmPSVkXG4iLCBfX2Z1bmNfXywgZmUtPmlkLCBvbm9mZik7CisKKwkvKiBubyBmcm9udGVuZCBzbGVlcCBjb250cm9sICovCisJaWYgKG9ub2ZmID09IDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChzdGF0ZS0+aHcpIHsKKwljYXNlIEFOWVNFRV9IV181MDdGQTogLyogMTUgKi8KKwkJLyogRTMwIENvbWJvIFBsdXMgKi8KKwkJLyogRTMwIEMgUGx1cyAqLworCisJCWlmICgoZmUtPmlkIF4gZHZiX3VzYl9hbnlzZWVfZGVsc3lzKSA9PSAwKSAgeworCQkJLyogZGlzYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLUMgZGVtb2Qgb24gSU9EWzVdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCA1KSwKKwkJCQkweDIwKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogZW5hYmxlIERWQi1DIHR1bmVyIG9uIElPRVswXSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDEgPDwgMCksCisJCQkJMHgwMSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIERWQi1DIGRlbW9kIG9uIElPRFs1XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNSksCisJCQkJMHgyMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLVQgdHVuZXIgb24gSU9FWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9FLCAoMCA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgQU5ZU0VFX0hXXzUwOFRDOiAvKiAxOCAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBUQzogLyogMjEgKi8KKwkJLyogRTcgVEMgKi8KKwkJLyogRTcgUFRDICovCisKKwkJaWYgKChmZS0+aWQgXiBkdmJfdXNiX2FueXNlZV9kZWxzeXMpID09IDApICB7CisJCQkvKiBkaXNhYmxlIERWQi1UIGRlbW9kIG9uIElPRFs2XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNiksCisJCQkJMHg0MCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDUpLAorCQkJCTB4MjApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgSUYgcm91dGUgb24gSU9FWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9FLCAoMSA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCS8qIGRpc2FibGUgRFZCLUMgZGVtb2Qgb24gSU9EWzVdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMCA8PCA1KSwKKwkJCQkweDIwKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogZW5hYmxlIERWQi1UIGRlbW9kIG9uIElPRFs2XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgNiksCisJCQkJMHg0MCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBJRiByb3V0ZSBvbiBJT0VbMF0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgwIDw8IDApLAorCQkJCTB4MDEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgYW55c2VlX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWludCByZXQ7CkBAIC00NjYsNDEgKzU3NCw1NCBAQAogCQl9CiAJfTsKIAotCS8qIENoZWNrIHdoaWNoIGhhcmR3YXJlIHdlIGhhdmUuCi0JICogV2UgbXVzdCBkbyB0aGlzIGNhbGwgdHdvIHRpbWVzIHRvIGdldCByZWxpYWJsZSB2YWx1ZXMgKGh3IGJ1ZykuCi0JICovCi0JcmV0ID0gYW55c2VlX2dldF9od19pbmZvKGFkYXAtPmRldiwgaHdfaW5mbyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKKwkvKiBkZXRlY3QgaGFyZHdhcmUgb25seSBvbmNlICovCisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkgeworCQkvKiBDaGVjayB3aGljaCBoYXJkd2FyZSB3ZSBoYXZlLgorCQkgKiBXZSBtdXN0IGRvIHRoaXMgY2FsbCB0d28gdGltZXMgdG8gZ2V0IHJlbGlhYmxlIHZhbHVlcyAoaHcgYnVnKS4KKwkJICovCisJCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKIAotCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7CisJCXJldCA9IGFueXNlZV9nZXRfaHdfaW5mbyhhZGFwLT5kZXYsIGh3X2luZm8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKIAotCS8qIE1lYW5pbmcgb2YgdGhlc2UgaW5mbyBieXRlcyBhcmUgZ3Vlc3NlZC4gKi8KLQlpbmZvKCJmaXJtd2FyZSB2ZXJzaW9uOiVkLiVkIGhhcmR3YXJlIGlkOiVkIiwKLQkJaHdfaW5mb1sxXSwgaHdfaW5mb1syXSwgaHdfaW5mb1swXSk7CisJCS8qIE1lYW5pbmcgb2YgdGhlc2UgaW5mbyBieXRlcyBhcmUgZ3Vlc3NlZC4gKi8KKwkJaW5mbygiZmlybXdhcmUgdmVyc2lvbjolZC4lZCBoYXJkd2FyZSBpZDolZCIsCisJCQlod19pbmZvWzFdLCBod19pbmZvWzJdLCBod19pbmZvWzBdKTsKIAotCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CisJCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CisJfQorCisJLyogc2V0IGN1cnJlbnQgZnJvbmRlbmQgSUQgZm9yIGRldmljZXMgaGF2aW5nIHR3byBmcm9uZGVuZHMgKi8KKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkKKwkJc3RhdGUtPmZlX2lkKys7CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewogCWNhc2UgQU5ZU0VFX0hXXzUwN1Q6IC8qIDIgKi8KIAkJLyogRTMwICovCiAKLQkJLyogYXR0YWNoIGRlbW9kICovCi0JCWFkYXAtPmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZhbnlzZWVfbXQzNTJfY29uZmlnLAotCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoYWRhcC0+ZmUpCisJCWlmIChzdGF0ZS0+ZmVfaWQpCiAJCQlicmVhazsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmYW55c2VlX3psMTAzNTNfY29uZmlnLAorCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZhbnlzZWVfbXQzNTJfY29uZmlnLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOworCQlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkKKwkJCWJyZWFrOworCisJCS8qIGF0dGFjaCBkZW1vZCAqLworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmFueXNlZV96bDEwMzUzX2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDdDRDogLyogNiAqLwogCQkvKiBFMzAgUGx1cyAqLwogCisJCWlmIChzdGF0ZS0+ZmVfaWQpCisJCQlicmVhazsKKwogCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDApLCAweDAxKTsKIAkJaWYgKHJldCkKQEAgLTUxMiwzMyArNjMzLDM5IEBACiAJCQlnb3RvIGVycm9yOwogCiAJCS8qIGF0dGFjaCBkZW1vZCAqLwotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZhbnlzZWVfemwxMDM1M19jb25maWcsCi0JCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJJmFueXNlZV96bDEwMzUzX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOwogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwN0RDOiAvKiAxMCAqLwogCQkvKiBFMzAgQyBQbHVzICovCiAKKwkJaWYgKHN0YXRlLT5mZV9pZCkKKwkJCWJyZWFrOworCiAJCS8qIGVuYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbMF0gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgMCksIDB4MDEpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwgJmFueXNlZV90ZGExMDAyM19jb25maWcsCi0JCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwKKwkJCSZhbnlzZWVfdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA3U0k6IC8qIDExICovCiAJCS8qIEUzMCBTMiBQbHVzICovCiAKKwkJaWYgKHN0YXRlLT5mZV9pZCkKKwkJCWJyZWFrOworCiAJCS8qIGVuYWJsZSBEVkItUy9TMiBkZW1vZCBvbiBJT0RbMF0gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDEgPDwgMCksIDB4MDEpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGN4MjQxMTZfYXR0YWNoLCAmYW55c2VlX2N4MjQxMTZfY29uZmlnLAorCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwgJmFueXNlZV9jeDI0MTE2X2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAogCQlicmVhazsKQEAgLTU2NCwzMiArNjkxLDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJaWYgKGR2Yl91c2JfYW55c2VlX2RlbHN5cykgewotCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAotCQkJCTB4MjApOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCi0JCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCAwKSwKLQkJCQkweDAxKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQotCQkJLyogYXR0YWNoIGRlbW9kICovCi0JCQlpZiAodG1wID09IDB4YzcpIHsKLQkJCQkvKiBUREExODIxMiBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCi0JCQkJCSZhbnlzZWVfemwxMDM1M190ZGExODIxMl9jb25maWcyLAotCQkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFBMTCBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCi0JCQkJCSZhbnlzZWVfemwxMDM1M19jb25maWcsCi0JCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQkJCX0KLQkJfSBlbHNlIHsKKwkJaWYgKChzdGF0ZS0+ZmVfaWQgXiBkdmJfdXNiX2FueXNlZV9kZWxzeXMpID09IDApICB7CiAJCQkvKiBkaXNhYmxlIERWQi1UIGRlbW9kIG9uIElPRFswXSAqLwogCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgMCksCiAJCQkJMHgwMSk7CkBAIC02MDUsMTUgKzcwNyw0NCBAQAogCQkJLyogYXR0YWNoIGRlbW9kICovCiAJCQlpZiAodG1wID09IDB4YzcpIHsKIAkJCQkvKiBUREExODIxMiBjb25maWcgKi8KLQkJCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwMjNfYXR0YWNoLAorCQkJCWFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSA9IGR2Yl9hdHRhY2goCisJCQkJCXRkYTEwMDIzX2F0dGFjaCwKIAkJCQkJJmFueXNlZV90ZGExMDAyM190ZGExODIxMl9jb25maWcsCiAJCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDQ4KTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogUExMIGNvbmZpZyAqLwotCQkJCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCisJCQkJYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlID0gZHZiX2F0dGFjaCgKKwkJCQkJdGRhMTAwMjNfYXR0YWNoLAogCQkJCQkmYW55c2VlX3RkYTEwMDIzX2NvbmZpZywKIAkJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NDgpOwogCQkJfQorCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAorCQkJCTB4MjApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzBdICovCisJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCAwKSwKKwkJCQkweDAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogYXR0YWNoIGRlbW9kICovCisJCQlpZiAodG1wID09IDB4YzcpIHsKKwkJCQkvKiBUREExODIxMiBjb25maWcgKi8KKwkJCQlhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUgPSBkdmJfYXR0YWNoKAorCQkJCQl6bDEwMzUzX2F0dGFjaCwKKwkJCQkJJmFueXNlZV96bDEwMzUzX3RkYTE4MjEyX2NvbmZpZzIsCisJCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUExMIGNvbmZpZyAqLworCQkJCWFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSA9IGR2Yl9hdHRhY2goCisJCQkJCXpsMTAzNTNfYXR0YWNoLAorCQkJCQkmYW55c2VlX3psMTAzNTNfY29uZmlnLAorCQkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJCQl9CiAJCX0KIAogCQlicmVhazsKQEAgLTYyNywzMCArNzU4LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CiAKLQkJaWYgKGR2Yl91c2JfYW55c2VlX2RlbHN5cykgewotCQkJLyogZGlzYWJsZSBEVkItQyBkZW1vZCBvbiBJT0RbNV0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgwIDw8IDUpLAotCQkJCTB4MjApOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCi0JCQkvKiBlbmFibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzZdICovCi0JCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMSA8PCA2KSwKLQkJCQkweDQwKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQotCQkJLyogZW5hYmxlIElGIHJvdXRlIG9uIElPRVswXSAqLwotCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDAgPDwgMCksCi0JCQkJMHgwMSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0KLQkJCS8qIGF0dGFjaCBkZW1vZCAqLwotCQkJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCSZhbnlzZWVfemwxMDM1M190ZGExODIxMl9jb25maWcsCi0JCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCQl9IGVsc2UgeworCQlpZiAoKHN0YXRlLT5mZV9pZCBeIGR2Yl91c2JfYW55c2VlX2RlbHN5cykgPT0gMCkgIHsKIAkJCS8qIGRpc2FibGUgRFZCLVQgZGVtb2Qgb24gSU9EWzZdICovCiAJCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9ELCAoMCA8PCA2KSwKIAkJCQkweDQwKTsKQEAgLTY2MywxNiArNzcxLDI3IEBACiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZXJyb3I7CiAKLQkJCS8qIGVuYWJsZSBJRiByb3V0ZSBvbiBJT0VbMF0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgxIDw8IDApLAotCQkJCTB4MDEpOworCQkJLyogYXR0YWNoIGRlbW9kICovCisJCQlhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwKKwkJCQkmYW55c2VlX3RkYTEwMDIzX3RkYTE4MjEyX2NvbmZpZywKKwkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIERWQi1DIGRlbW9kIG9uIElPRFs1XSAqLworCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRCwgKDAgPDwgNSksCisJCQkJMHgyMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIGVuYWJsZSBEVkItVCBkZW1vZCBvbiBJT0RbNl0gKi8KKwkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0QsICgxIDw8IDYpLAorCQkJCTB4NDApOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGVycm9yOwogCiAJCQkvKiBhdHRhY2ggZGVtb2QgKi8KLQkJCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCi0JCQkJJmFueXNlZV90ZGExMDAyM190ZGExODIxMl9jb25maWcsCi0JCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NDgpOworCQkJYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkmYW55c2VlX3psMTAzNTNfdGRhMTgyMTJfY29uZmlnLAorCQkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAkJfQogCiAJCWJyZWFrOwpAQCAtNjgxLDYgKzgwMCw5IEBACiAJCS8qIEU3IFMyICovCiAJCS8qIEU3IFBTMiAqLwogCisJCWlmIChzdGF0ZS0+ZmVfaWQpCisJCQlicmVhazsKKwogCQkvKiBlbmFibGUgdHJhbnNwb3J0IHN0cmVhbSBvbiBJT0FbN10gKi8KIAkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPQSwgKDEgPDwgNyksIDB4ODApOwogCQlpZiAocmV0KQpAQCAtNjkyLDEzICs4MTQsMTMgQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIGRlbW9kICovCi0JCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzdHYwOTAwX2F0dGFjaCwgJmFueXNlZV9zdHYwOTAwX2NvbmZpZywKKwkJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkwMF9hdHRhY2gsICZhbnlzZWVfc3R2MDkwMF9jb25maWcsCiAJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMCk7CiAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFhZGFwLT5mZSkgeworCWlmICghYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQkvKiB3ZSBoYXZlIG5vIGZyb250ZW5kIDotKCAqLwogCQlyZXQgPSAtRU5PREVWOwogCQllcnIoIlVuc3VwcG9ydGVkIEFueXNlZSB2ZXJzaW9uLiAiIFwKQEAgLTcxMywxNCArODM1LDE0IEBACiAJc3RydWN0IGFueXNlZV9zdGF0ZSAqc3RhdGUgPSBhZGFwLT5kZXYtPnByaXY7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CiAJaW50IHJldDsKLQlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CisJZGViX2luZm8oIiVzOiBmZT0lZFxuIiwgX19mdW5jX18sIHN0YXRlLT5mZV9pZCk7CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewogCWNhc2UgQU5ZU0VFX0hXXzUwN1Q6IC8qIDIgKi8KIAkJLyogRTMwICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMyID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMyID4+IDEpLAogCQkJTlVMTCwgRFZCX1BMTF9USE9NU09OX0RUVDc1NzkpOwogCiAJCWJyZWFrOwpAQCAtNzI4LDcgKzg1MCw3IEBACiAJCS8qIEUzMCBQbHVzICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMyID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMyID4+IDEpLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfVEhPTVNPTl9EVFQ3NTc5KTsKIAogCQlicmVhazsKQEAgLTczNiw3ICs4NTgsNyBAQAogCQkvKiBFMzAgQyBQbHVzICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMwID4+IDEpLAorCQlmZSA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICgweGMwID4+IDEpLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfU0FNU1VOR19EVE9TNDAzSUgxMDJBKTsKIAogCQlicmVhazsKQEAgLTc0NCwyOCArODY2LDE0IEBACiAJCS8qIEUzMCBTMiBQbHVzICovCiAKIAkJLyogYXR0YWNoIExOQiBjb250cm9sbGVyICovCi0JCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAotCQkJJmFueXNlZV9pc2w2NDIzX2NvbmZpZyk7CisJCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAmYW55c2VlX2lzbDY0MjNfY29uZmlnKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDdGQTogLyogMTUgKi8KIAkJLyogRTMwIENvbWJvIFBsdXMgKi8KIAkJLyogRTMwIEMgUGx1cyAqLwogCi0JCWlmIChkdmJfdXNiX2FueXNlZV9kZWxzeXMpIHsKLQkJCS8qIGVuYWJsZSBEVkItVCB0dW5lciBvbiBJT0VbMF0gKi8KLQkJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgwIDw8IDApLAotCQkJCTB4MDEpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCQl9IGVsc2UgewotCQkJLyogZW5hYmxlIERWQi1DIHR1bmVyIG9uIElPRVswXSAqLwotCQkJcmV0ID0gYW55c2VlX3dyX3JlZ19tYXNrKGFkYXAtPmRldiwgUkVHX0lPRSwgKDEgPDwgMCksCi0JCQkJMHgwMSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQogCQkvKiBUcnkgZmlyc3QgYXR0YWNoIFREQTE4MjEyIHNpbGljb24gdHVuZXIgb24gSU9FWzRdLCBpZiB0aGF0CiAJCSAqIGZhaWxzIGF0dGFjaCBvbGQgc2ltcGxlIFBMTC4gKi8KIApAQCAtNzc1LDggKzg4Myw4IEBACiAJCQlnb3RvIGVycm9yOwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwotCQlmZSA9IGR2Yl9hdHRhY2godGRhMTgyMTJfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCi0JCQkmYW55c2VlX3RkYTE4MjEyX2NvbmZpZyk7CisJCWZlID0gZHZiX2F0dGFjaCh0ZGExODIxMl9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbc3RhdGUtPmZlX2lkXS5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCAmYW55c2VlX3RkYTE4MjEyX2NvbmZpZyk7CiAJCWlmIChmZSkKIAkJCWJyZWFrOwogCkBAIC03ODYsOCArODk0LDkgQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsICgweGMwID4+IDEpLAotCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfU0FNU1VOR19EVE9TNDAzSUgxMDJBKTsKKwkJZmUgPSBkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwW3N0YXRlLT5mZV9pZF0uZmUsCisJCQkoMHhjMCA+PiAxKSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQlEVkJfUExMX1NBTVNVTkdfRFRPUzQwM0lIMTAyQSk7CiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA4VEM6IC8qIDE4ICovCkBAIC04MDEsOCArOTEwLDggQEAKIAkJCWdvdG8gZXJyb3I7CiAKIAkJLyogYXR0YWNoIHR1bmVyICovCi0JCWZlID0gZHZiX2F0dGFjaCh0ZGExODIxMl9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKLQkJCSZhbnlzZWVfdGRhMTgyMTJfY29uZmlnKTsKKwkJZmUgPSBkdmJfYXR0YWNoKHRkYTE4MjEyX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFtzdGF0ZS0+ZmVfaWRdLmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhbnlzZWVfdGRhMTgyMTJfY29uZmlnKTsKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDhTMjogLyogMTkgKi8KQEAgLTgxMSwxMiArOTIwLDEyIEBACiAJCS8qIEU3IFBTMiAqLwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwotCQlmZSA9IGR2Yl9hdHRhY2goc3R2NjExMF9hdHRhY2gsIGFkYXAtPmZlLAorCQlmZSA9IGR2Yl9hdHRhY2goc3R2NjExMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkmYW55c2VlX3N0djYxMTBfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKIAkJaWYgKGZlKSB7CiAJCQkvKiBhdHRhY2ggTE5CIGNvbnRyb2xsZXIgKi8KLQkJCWZlID0gZHZiX2F0dGFjaChpc2w2NDIzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQlmZSA9IGR2Yl9hdHRhY2goaXNsNjQyM19hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhbnlzZWVfaXNsNjQyM19jb25maWcpOwogCQl9CiAKQEAgLTkxOCw2ICsxMDI3LDkgQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyAgICA9IDIsCisJCS5mcm9udGVuZF9jdHJsICAgID0gYW55c2VlX2Zyb250ZW5kX2N0cmwsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGFueXNlZV9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gYW55c2VlX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gYW55c2VlX3R1bmVyX2F0dGFjaCwKQEAgLTkzMSw2ICsxMDQzLDIxIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9LCB7CisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGFueXNlZV9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gYW55c2VlX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gYW55c2VlX3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW0gPSB7CisJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA4LAorCQkJCS5lbmRwb2ludCA9IDB4ODIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSAoMTYqNTEyKSwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmgKaW5kZXggYWQ2Y2NkMS4uNTdlZTUwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oCkBAIC01OSw2ICs1OSw3IEBACiBzdHJ1Y3QgYW55c2VlX3N0YXRlIHsKIAl1OCBodzsgLyogUENCIElEICovCiAJdTggc2VxOworCXU4IGZlX2lkOjE7IC8qIGZyb25kZW5kIElEICovCiB9OwogCiAjZGVmaW5lIEFOWVNFRV9IV181MDdUICAgIDIgLyogRTMwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hdTY2MTAuYwppbmRleCAyMzUxMDc3Li5iNzc5OTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXU2NjEwLmMKQEAgLTE0MCw5ICsxNDAsOSBAQAogCiBzdGF0aWMgaW50IGF1NjYxMF96bDEwMzUzX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmF1NjYxMF96bDEwMzUzX2NvbmZpZywKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmF1NjYxMF96bDEwMzUzX2NvbmZpZywKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC0xNTUsNyArMTU1LDcgQEAKIHN0YXRpYyBpbnQgYXU2NjEwX3F0MTAxMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlyZXR1cm4gZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLAotCQkJICBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQkgIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJICAmYXU2NjEwX3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMjA0LDYgKzIwNCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBhdTY2MTBfemwxMDM1M19mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGF1NjYxMF9xdDEwMTBfdHVuZXJfYXR0YWNoLAogCkBAIC0yMTksNiArMjIxLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hejYwMjcuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXo2MDI3LmMKaW5kZXggNTdlMjQ0NC4uYmY2N2I0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hejYwMjcuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F6NjAyNy5jCkBAIC00MCw3ICs0MCw2IEBACiAJeyBTVEIwODk5X0RJU1JYX1NUMCAgICAgCSwgMHgwNCB9LAogCXsgU1RCMDg5OV9ESVNSWF9TVDEgICAgIAksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTUEFSSVRZICAgICAJLCAweDAwIH0sCi0JeyBTVEIwODk5X0RJU0ZJRk8gICAgICAgCSwgMHgwMCB9LAogCXsgU1RCMDg5OV9ESVNTVEFUVVMJCSwgMHgyMCB9LAogCXsgU1RCMDg5OV9ESVNGMjIgICAgICAgIAksIDB4OTkgfSwKIAl7IFNUQjA4OTlfRElTRjIyUlggICAgICAJLCAweGE4IH0sCkBAIC03ODIsNyArNzgxLDYgQEAKIHsKIAogCXU4IGJ1ZjsKLQlpbnQgcmV0OwogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OwogCiAJc3RydWN0IGkyY19tc2cgaTJjX21zZyA9IHsKQEAgLTgwMCwxNyArNzk4LDE3IEBACiAJc3dpdGNoICh2b2x0YWdlKSB7CiAJY2FzZSBTRUNfVk9MVEFHRV8xMzoKIAkJYnVmID0gMTsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAmaTJjX21zZywgMSk7CisJCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOwogCQlicmVhazsKIAogCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CiAJCWJ1ZiA9IDI7Ci0JCXJldCA9IGkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOworCQlpMmNfdHJhbnNmZXIoJmFkYXAtPmRldi0+aTJjX2FkYXAsICZpMmNfbXNnLCAxKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNFQ19WT0xUQUdFX09GRjoKIAkJYnVmID0gMDsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAmaTJjX21zZywgMSk7CisJCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJmkyY19tc2csIDEpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05MTAsMTYgKzkwOCwxNiBAQAogCWF6NjAyN19mcm9udGVuZF9yZXNldChhZGFwKTsKIAogCWRlYl9pbmZvKCJhZGFwID0gJXAsIGRldiA9ICVwXG4iLCBhZGFwLCBhZGFwLT5kZXYpOwotCWFkYXAtPmZlID0gc3RiMDg5OV9hdHRhY2goJmF6NjAyN19zdGIwODk5X2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBzdGIwODk5X2F0dGFjaCgmYXo2MDI3X3N0YjA4OTlfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlkZWJfaW5mbygiZm91bmQgU1RCMDg5OSBEVkItUy9EVkItUzIgZnJvbnRlbmQgQDB4JTAyeCIsIGF6NjAyN19zdGIwODk5X2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKLQkJaWYgKHN0YjYxMDBfYXR0YWNoKGFkYXAtPmZlLCAmYXo2MDI3X3N0YjYxMDBfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpIHsKKwkJaWYgKHN0YjYxMDBfYXR0YWNoKGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhejYwMjdfc3RiNjEwMF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgewogCQkJZGViX2luZm8oImZvdW5kIFNUQjYxMDAgRFZCLVMvRFZCLVMyIGZyb250ZW5kIEAweCUwMngiLCBhejYwMjdfc3RiNjEwMF9jb25maWcudHVuZXJfYWRkcmVzcyk7Ci0JCQlhZGFwLT5mZS0+b3BzLnNldF92b2x0YWdlID0gYXo2MDI3X3NldF92b2x0YWdlOworCQkJYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gYXo2MDI3X3NldF92b2x0YWdlOwogCQkJYXo2MDI3X2NpX2luaXQoYWRhcCk7CiAJCX0gZWxzZSB7Ci0JCQlhZGFwLT5mZSA9IE5VTEw7CisJCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gTlVMTDsKIAkJfQogCX0gZWxzZQogCQl3YXJuKCJubyBmcm9udC1lbmQgYXR0YWNoZWRcbiIpOwpAQCAtOTU0LDcgKzk1Miw2IEBACiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKIAlpbnQgaSA9IDAsIGogPSAwLCBsZW4gPSAwOwotCWludCByZXQ7CiAJdTE2IGluZGV4OwogCXUxNiB2YWx1ZTsKIAlpbnQgbGVuZ3RoOwpAQCAtOTkwLDcgKzk4Nyw3IEBACiAJCQkJaW5kZXggPSAoKChtc2dbaV0uYnVmWzBdIDw8IDgpICYgMHhmZjAwKSB8IChtc2dbaV0uYnVmWzFdICYgMHgwMGZmKSk7CiAJCQkJdmFsdWUgPSBtc2dbaV0uYWRkciArIChtc2dbaV0ubGVuIDw8IDgpOwogCQkJCWxlbmd0aCA9IG1zZ1tpICsgMV0ubGVuICsgNjsKLQkJCQlyZXQgPSBhejYwMjdfdXNiX2luX29wKGQsIHJlcSwgdmFsdWUsIGluZGV4LCBkYXRhLCBsZW5ndGgpOworCQkJCWF6NjAyN191c2JfaW5fb3AoZCwgcmVxLCB2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbmd0aCk7CiAJCQkJbGVuID0gbXNnW2kgKyAxXS5sZW47CiAJCQkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQogCQkJCQltc2dbaSArIDFdLmJ1ZltqXSA9IGRhdGFbaiArIDVdOwpAQCAtMTAxNyw3ICsxMDE0LDcgQEAKIAkJCQlpbmRleCA9IDB4MDsKIAkJCQl2YWx1ZSA9IG1zZ1tpXS5hZGRyOwogCQkJCWxlbmd0aCA9IG1zZ1tpXS5sZW4gKyA2OwotCQkJCXJldCA9IGF6NjAyN191c2JfaW5fb3AoZCwgcmVxLCB2YWx1ZSwgaW5kZXgsIGRhdGEsIGxlbmd0aCk7CisJCQkJYXo2MDI3X3VzYl9pbl9vcChkLCByZXEsIHZhbHVlLCBpbmRleCwgZGF0YSwgbGVuZ3RoKTsKIAkJCQlsZW4gPSBtc2dbaV0ubGVuOwogCQkJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykKIAkJCQkJbXNnW2ldLmJ1ZltqXSA9IGRhdGFbaiArIDVdOwpAQCAtMTEwNiw2ICsxMTAzLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGF6NjAyN19zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gYXo2MDI3X2Zyb250ZW5kX2F0dGFjaCwKIApAQCAtMTEyMCw2ICsxMTE5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NlNjIzMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jZTYyMzAuYwppbmRleCA2ZDFhMzA0Li41N2FmYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NlNjIzMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2U2MjMwLmMKQEAgLTE4Niw5ICsxODYsOSBAQAogc3RhdGljIGludCBjZTYyMzBfemwxMDM1M19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY2U2MjMwX3psMTAzNTNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY2U2MjMwX3psMTAzNTNfY29uZmlnLAogCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGFkYXAtPmZlID09IE5VTEwpCisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTQsNyArMjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZjZTYyMzBfbXhsNTAwM3NfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI3Myw2ICsyNzMsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY2U2MjMwX3psMTAzNTNfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjZTYyMzBfbXhsNTAwM3NfdHVuZXJfYXR0YWNoLAogCQkJLnN0cmVhbSA9IHsKQEAgLTI4NSw2ICsyODcsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2NpbmVyZ3lUMi1jb3JlLmMKaW5kZXggMTZmMmNlMi4uZjlkOTA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jaW5lcmd5VDItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY2luZXJneVQyLWNvcmUuYwpAQCAtNjksNyArNjksNyBAQAogCWNoYXIgc3RhdGVbM107CiAJaW50IHJldDsKIAotCWFkYXAtPmZlID0gY2luZXJneXQyX2ZlX2F0dGFjaChhZGFwLT5kZXYpOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBjaW5lcmd5dDJfZmVfYXR0YWNoKGFkYXAtPmRldik7CiAKIAlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoYWRhcC0+ZGV2LCBxdWVyeSwgc2l6ZW9mKHF1ZXJ5KSwgc3RhdGUsCiAJCQkJc2l6ZW9mKHN0YXRlKSwgMCk7CkBAIC0xOTgsNiArMTk4LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGNpbmVyZ3l0Ml9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY2luZXJneXQyX2Zyb250ZW5kX2F0dGFjaCwKIApAQCAtMjEyLDYgKzIxNCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCBhY2I1ZmIyLi45ZjJhMDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAogc3RhdGljIHZvaWQgY3h1c2JfZDY4MF9kbWJfZHJhaW5fdmlkZW8oc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQogewotCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW1fcHJvcGVydGllcyAqcCA9ICZkLT5wcm9wcy5hZGFwdGVyWzBdLnN0cmVhbTsKKwlzdHJ1Y3QgdXNiX2RhdGFfc3RyZWFtX3Byb3BlcnRpZXMgKnAgPSAmZC0+cHJvcHMuYWRhcHRlclswXS5mZVswXS5zdHJlYW07CiAJY29uc3QgaW50IHRpbWVvdXQgPSAxMDA7CiAJY29uc3QgaW50IGp1bmtfbGVuID0gcC0+dS5idWxrLmJ1ZmZlcnNpemU7CiAJdTggICAgICAgICpqdW5rOwpAQCAtNzI1LDcgKzcyNSw3IEBACiAvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KIHN0YXRpYyBpbnQgY3h1c2JfZm1kMTIxNm1lX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goc2ltcGxlX3R1bmVyX2F0dGFjaCwgYWRhcC0+ZmUsCisJZHZiX2F0dGFjaChzaW1wbGVfdHVuZXJfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg2MSwKIAkJICAgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszKTsKIAlyZXR1cm4gMDsKQEAgLTczMywyNyArNzMzLDI3IEBACiAKIHN0YXRpYyBpbnQgY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MSwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYxLAogCQkgICBOVUxMLCBEVkJfUExMX1RIT01TT05fRFRUNzU3OSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfbGd6MjAxX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCBOVUxMLCBEVkJfUExMX0xHX1oyMDEpOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4NjEsIE5VTEwsIERWQl9QTExfTEdfWjIwMSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfZHR0NzU3OV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLAogCQkgICBOVUxMLCBEVkJfUExMX1RIT01TT05fRFRUNzU3OSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsIGFkYXAtPmZlLAorCWR2Yl9hdHRhY2goc2ltcGxlX3R1bmVyX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NjEsIFRVTkVSX0xHX1REVlNfSDA2WEYpOwogCXJldHVybiAwOwogfQpAQCAtNzk1LDkgKzc5NSw5IEBACiAJfTsKIAogCS8qIEZJWE1FOiBnZW5lcmFsaXplICYgbW92ZSB0byBjb21tb24gYXJlYSAqLwotCWFkYXAtPmZlLT5jYWxsYmFjayA9IGR2aWNvX2JsdWViaXJkX3hjMjAyOF9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IGR2aWNvX2JsdWViaXJkX3hjMjAyOF9jYWxsYmFjazsKIAotCWZlID0gZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLCBhZGFwLT5mZSwgJmNmZyk7CisJZmUgPSBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZjZmcpOwogCWlmIChmZSA9PSBOVUxMIHx8IGZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTgwOCw3ICs4MDgsNyBAQAogCiBzdGF0aWMgaW50IGN4dXNiX214bDUwMDNzX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwlkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZhdmVyX2E4NjhyX3R1bmVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgxNiw3ICs4MTYsNyBAQAogc3RhdGljIGludCBjeHVzYl9kNjgwX2RtYl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKLQlmZSA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwlmZSA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZkNjgwX2RtYl90dW5lcik7CiAJcmV0dXJuIChmZSA9PSBOVUxMKSA/IC1FSU8gOiAwOwogfQpAQCAtODI0LDcgKzgyNCw3IEBACiBzdGF0aWMgaW50IGN4dXNiX215Z2ljYV9kNjg5X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOwotCWZlID0gZHZiX2F0dGFjaChtYXgyMTY1X2F0dGFjaCwgYWRhcC0+ZmUsCisJZmUgPSBkdmJfYXR0YWNoKG1heDIxNjVfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZteWdpY2FfZDY4OV9tYXgyMTY1X2NmZyk7CiAJcmV0dXJuIChmZSA9PSBOVUxMKSA/IC1FSU8gOiAwOwogfQpAQCAtODM3LDggKzgzNyw5IEBACiAKIAljeHVzYl9jdHJsX21zZyhhZGFwLT5kZXYsIENNRF9ESUdJVEFMLCBOVUxMLCAwLCAmYiwgMSk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwgJmN4dXNiX2N4MjI3MDJfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwgJmN4dXNiX2N4MjI3MDJfY29uZmlnLAorCQkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKQEAgLTg1MSw4ICs4NTIsMTAgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLCAmY3h1c2JfbGdkdDMzMDNfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChsZ2R0MzMweF9hdHRhY2gsCisJCQkJCSAmY3h1c2JfbGdkdDMzMDNfY29uZmlnLAorCQkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKQEAgLTg2MCw5ICs4NjMsOSBAQAogCiBzdGF0aWMgaW50IGN4dXNiX2F2ZXJfbGdkdDMzMDNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2F2ZXJfbGdkdDMzMDNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2F2ZXJfbGdkdDMzMDNfY29uZmlnLAogCQkJICAgICAgJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSAhPSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC04NzYsOCArODc5LDkgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmY3h1c2JfbXQzNTJfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZjeHVzYl9tdDM1Ml9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtODkwLDExICs4OTQsMTUgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKCgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJmN4dXNiX2RlZTE2MDFfY29uZmlnLAotCQkJCSAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHx8Ci0JCSgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCQkmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywKLQkJCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKSkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZjeHVzYl9kZWUxNjAxX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpCisJCXJldHVybiAwOworCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCSAmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC05MTcsOSArOTI1LDExIEBACiAJY3h1c2JfYmx1ZWJpcmRfZ3Bpb19wdWxzZShhZGFwLT5kZXYsIDB4MDEsIDEpOwogCWN4dXNiX2JsdWViaXJkX2dwaW9fcHVsc2UoYWRhcC0+ZGV2LCAweDAyLCAxKTsKIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAotCQkJCSAgICZjeHVzYl96bDEwMzUzX3hjMzAyOF9jb25maWdfbm9faTJjX2dhdGUsCi0JCQkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXApKSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPQorCQlkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJICAgJmN4dXNiX3psMTAzNTNfeGMzMDI4X2NvbmZpZ19ub19pMmNfZ2F0ZSwKKwkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJLyogdHJ5IHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBubyBJUiBkZWNvZGVyIG9uIHRoZSBJMkMgYnVzICovCkBAIC0xMDMxLDkgKzEwNDEsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmN4dXNiX2R1YWxkaWc0X3JldjJfY29uZmlnKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTA4NCwxNSArMTA5NCwxNSBAQAogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPQotCQlkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwKKwkJZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCQkJRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywKIAkgICAgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwNzBfc2V0X3BhcmFtX292ZXJyaWRlOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDcwX3NldF9wYXJhbV9vdmVycmlkZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEwOCwxNCArMTExOCwxNiBAQAogCWN4dXNiX2JsdWViaXJkX2dwaW9fcHVsc2UoYWRhcC0+ZGV2LCAweDAxLCAxKTsKIAljeHVzYl9ibHVlYmlyZF9ncGlvX3B1bHNlKGFkYXAtPmRldiwgMHgwMiwgMSk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKLQkJCQkgICAmY3h1c2JfemwxMDM1M194YzMwMjhfY29uZmlnLAotCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICZjeHVzYl96bDEwMzUzX3hjMzAyOF9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwKLQkJCQkgICAmY3h1c2JfbXQzNTJfeGMzMDI4X2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLAorCQkJCQkgJmN4dXNiX210MzUyX3hjMzAyOF9jb25maWcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChhZGFwLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtMTE1MCw3ICsxMTYyLDcgQEAKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAogCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuYWRhcHRlclswXS5zdHJlYW0uZW5kcG9pbnQpKTsKKwkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGQtPnByb3BzLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLmVuZHBvaW50KSk7CiAKIAkvKiBEcmFpbiBVU0IgcGlwZXMgdG8gYXZvaWQgaGFuZyBhZnRlciByZWJvb3QgKi8KIAlmb3IgKG4gPSAwOyAgbiA8IDU7ICBuKyspIHsKQEAgLTExNzIsOCArMTE4NCw4IEBACiAJbXNsZWVwKDEwMCk7CiAKIAkvKiBBdHRhY2ggZnJvbnRlbmQgKi8KLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobGdzOGd4eF9hdHRhY2gsICZkNjgwX2xnczhnbDVfY2ZnLCAmZC0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGxnczhneHhfYXR0YWNoLCAmZDY4MF9sZ3M4Z2w1X2NmZywgJmQtPmkyY19hZGFwKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTIwNyw3ICsxMjE5LDcgQEAKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAogCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKIAl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LAotCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgZC0+cHJvcHMuYWRhcHRlclswXS5zdHJlYW0uZW5kcG9pbnQpKTsKKwkJdXNiX3JjdmJ1bGtwaXBlKGQtPnVkZXYsIGQtPnByb3BzLmFkYXB0ZXJbMF0uZmVbMF0uc3RyZWFtLmVuZHBvaW50KSk7CiAKIAogCS8qIFJlc2V0IHRoZSB0dW5lciAqLwpAQCAtMTIyMyw5ICsxMjM1LDkgQEAKIAltc2xlZXAoMTAwKTsKIAogCS8qIEF0dGFjaCBmcm9udGVuZCAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhdGJtODgzMF9hdHRhY2gsICZteWdpY2FfZDY4OV9hdGJtODgzMF9jZmcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goYXRibTg4MzBfYXR0YWNoLCAmbXlnaWNhX2Q2ODlfYXRibTg4MzBfY2ZnLAogCQkmZC0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC0xMzgzLDYgKzEzOTUsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2N4MjI3MDJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoLApAQCAtMTM5Nyw3ICsxNDExLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCi0KKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX3Bvd2VyX2N0cmwsCkBAIC0xNDI5LDYgKzE0NDMsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2xnZHQzMzAzX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2gsCkBAIC0xNDQ0LDYgKzE0NjAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApAQCAtMTQ4Myw2ICsxNTAwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9kZWUxNjAxX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2gsCkBAIC0xNDk3LDYgKzE1MTYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApAQCAtMTU0NCw2ICsxNTY0LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMiwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2xnejIwMV90dW5lcl9hdHRhY2gsCkBAIC0xNTU5LDYgKzE1ODEsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCkBAIC0xNTk2LDYgKzE2MTksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX210MzUyX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHR0NzU3OV90dW5lcl9hdHRhY2gsCkBAIC0xNjExLDYgKzE2MzYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCkBAIC0xNjQ1LDYgKzE2NzEsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2R1YWxkaWc0X2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE2NTksNiArMTY4Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNjk1LDYgKzE3MjQsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX25hbm8yX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE3MDksNiArMTc0MCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNzQ3LDYgKzE3NzksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX25hbm8yX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZHZpY29feGMzMDI4X3R1bmVyX2F0dGFjaCwKQEAgLTE3NjEsNiArMTc5NSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xNzk2LDYgKzE4MzEsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2JfYXZlcl9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfYXZlcl9sZ2R0MzMwM19mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX214bDUwMDNzX3R1bmVyX2F0dGFjaCwKQEAgLTE4MTAsNyArMTg0Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQl9LAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9hdmVyX3Bvd2VyX2N0cmwsCkBAIC0xODM5LDEwICsxODc2LDEyIEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLnNpemVfb2ZfcHJpdiAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCA9IGN4dXNiX2R1YWxkaWc0X3JldjJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICA9IGN4dXNiX2R1YWxkaWc0X3JldjJfdHVuZXJfYXR0YWNoLAotCQkJLnNpemVfb2ZfcHJpdiAgICA9IHNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKQEAgLTE4NTQsNiArMTg5Myw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC0xODg5LDYgKzE5MjksOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2JfZDY4MF9kbWJfc3RyZWFtaW5nX2N0cmwsCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2Q2ODBfZG1iX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZDY4MF9kbWJfdHVuZXJfYXR0YWNoLApAQCAtMTkwNCw2ICsxOTQ2LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9LAogCX0sCiAKQEAgLTE5NDAsNiArMTk4Myw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9kNjgwX2RtYl9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbXlnaWNhX2Q2ODlfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9teWdpY2FfZDY4OV90dW5lcl9hdHRhY2gsCkBAIC0xOTU1LDYgKzIwMDAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0sCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKaW5kZXggNWViOTFiNC4uMTU2Y2JmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCkBAIC0zMCw2ICszMCwxMSBAQAogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CiAJaW50IHJldDsKIAorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCWVycigiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsIDApLAogCQkJCSAgUkVRVUVTVF9HRVRfVkVSU0lPTiwKIAkJCQkgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sIDAsIDAsCkBAIC00Niw2ICs1MSw3IEBACiAJaWYgKGZ3dHlwZSAhPSBOVUxMKQogCQkqZnd0eXBlICAgICA9IChzdC0+YnVmWzEyXSA8PCAyNCkgfCAoc3QtPmJ1ZlsxM10gPDwgMTYpIHwKIAkJCShzdC0+YnVmWzE0XSA8PCA4KSB8IHN0LT5idWZbMTVdOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDgsNyArMTE0LDEyIEBACiBpbnQgZGliMDcwMF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGVudW0gZGliMDd4MF9ncGlvcyBncGlvLCB1OCBncGlvX2RpciwgdTggZ3Bpb192YWwpCiB7CiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKLQlzMTYgcmV0OworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX0dQSU87CiAJc3QtPmJ1ZlsxXSA9IGdwaW87CkBAIC0xMTYsNiArMTI3LDcgQEAKIAogCXJldCA9IGRpYjA3MDBfY3RybF93cihkLCBzdC0+YnVmLCAzKTsKIAorCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjUsNiArMTM3LDExIEBACiAJaW50IHJldDsKIAogCWlmIChzdC0+ZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJCXJldHVybiAwOworCQl9CisKIAkJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX1VTQl9YRkVSX0xFTjsKIAkJc3QtPmJ1ZlsxXSA9IChuYl90c19wYWNrZXRzID4+IDgpICYgMHhmZjsKIAkJc3QtPmJ1ZlsyXSA9IG5iX3RzX3BhY2tldHMgJiAweGZmOwpAQCAtMTMyLDYgKzE0OSw3IEBACiAJCWRlYl9pbmZvKCJzZXQgdGhlIFVTQiB4ZmVyIGxlbiB0byAlaSBUcyBwYWNrZXRcbiIsIG5iX3RzX3BhY2tldHMpOwogCiAJCXJldCA9IGRpYjA3MDBfY3RybF93cihkLCBzdC0+YnVmLCAzKTsKKwkJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOwogCX0gZWxzZSB7CiAJCWRlYl9pbmZvKCJ0aGlzIGZpcm13YXJlIGRvZXMgbm90IGFsbG93IHRvIGNoYW5nZSB0aGUgVVNCIHhmZXIgbGVuXG4iKTsKIAkJcmV0ID0gLUVJTzsKQEAgLTIwOCw2ICsyMjYsMTAgQEAKIAogCQl9IGVsc2UgewogCQkJLyogV3JpdGUgcmVxdWVzdCAqLworCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSA8IDApIHsKKwkJCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJCXN0LT5idWZbMF0gPSBSRVFVRVNUX05FV19JMkNfV1JJVEU7CiAJCQlzdC0+YnVmWzFdID0gbXNnW2ldLmFkZHIgPDwgMTsKIAkJCXN0LT5idWZbMl0gPSAoZW5fc3RhcnQgPDwgNykgfCAoZW5fc3RvcCA8PCA2KSB8CkBAIC0yMjcsNiArMjQ5LDcgQEAKIAkJCQkJCSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwKIAkJCQkJCSAwLCAwLCBzdC0+YnVmLCBtc2dbaV0ubGVuICsgNCwKIAkJCQkJCSBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJCQltdXRleF91bmxvY2soJmQtPnVzYl9tdXRleCk7CiAJCQlpZiAocmVzdWx0IDwgMCkgewogCQkJCWRlYl9pbmZvKCJpMmMgd3JpdGUgZXJyb3IgKHN0YXR1cyA9ICVkKVxuIiwgcmVzdWx0KTsKIAkJCQlicmVhazsKQEAgLTI0OSw2ICsyNzIsMTAgQEAKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCS8qIGZpbGwgaW4gdGhlIGFkZHJlc3MgKi8KQEAgLTI3OSw2ICszMDYsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CiAKIAlyZXR1cm4gaTsKQEAgLTMzNyw3ICszNjUsMTIgQEAKIAl1MTYgcGxsX2xvb3BkaXYsIHUxNiBmcmVlX2RpdiwgdTE2IGRzdVNjYWxlcikKIHsKIAlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBkLT5wcml2OwotCXMxNiByZXQ7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPnVzYl9tdXRleCkgPCAwKSB7CisJCWVycigiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlzdC0+YnVmWzBdID0gUkVRVUVTVF9TRVRfQ0xPQ0s7CiAJc3QtPmJ1ZlsxXSA9IChlbl9wbGwgPDwgNykgfCAocGxsX3NyYyA8PCA2KSB8CkBAIC0zNTIsNiArMzg1LDcgQEAKIAlzdC0+YnVmWzldID0gIGRzdVNjYWxlciAgICAgICAgICYgMHhmZjsgLyogTFNCICovCiAKIAlyZXQgPSBkaWIwNzAwX2N0cmxfd3IoZCwgc3QtPmJ1ZiwgMTApOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zNjAsMTAgKzM5NCwxNiBAQAogewogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGQtPnByaXY7CiAJdTE2IGRpdmlkZXI7CisJaW50IHJldDsKIAogCWlmIChzY2xfa0h6ID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSA8IDApIHsKKwkJZXJyKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAwOworCX0KKwogCXN0LT5idWZbMF0gPSBSRVFVRVNUX1NFVF9JMkNfUEFSQU07CiAJZGl2aWRlciA9ICh1MTYpICgzMDAwMCAvIHNjbF9rSHopOwogCXN0LT5idWZbMV0gPSAwOwpAQCAtMzc5LDcgKzQxOSwxMSBAQAogCWRlYl9pbmZvKCJzZXR0aW5nIEkyQyBzcGVlZDogJTA0eCAlMDR4ICUwNHggKCVkIGtIeikuIiwKIAkJKHN0LT5idWZbMl0gPDwgOCkgfCAoc3QtPmJ1ZlszXSksIChzdC0+YnVmWzRdIDw8IDgpIHwKIAkJc3QtPmJ1Zls1XSwgKHN0LT5idWZbNl0gPDwgOCkgfCBzdC0+YnVmWzddLCBzY2xfa0h6KTsKLQlyZXR1cm4gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDgpOworCisJcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDgpOworCW11dGV4X3VubG9jaygmZC0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtNDg0LDEzICs1MjgsMTMgQEAKIAkJZm9yIChhZGFwX251bSA9IDA7IGFkYXBfbnVtIDwgZGliMDcwMF9kZXZpY2VzW2ldLm51bV9hZGFwdGVyczsKIAkJCQlhZGFwX251bSsrKSB7CiAJCQlpZiAoZndfdmVyc2lvbiA+PSAweDEwMjAxKSB7Ci0JCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9IDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemU7CisJCQkJZGliMDcwMF9kZXZpY2VzW2ldLmFkYXB0ZXJbYWRhcF9udW1dLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZSA9IDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemU7CiAJCQl9IGVsc2UgewogCQkJCS8qIGZvciBmdyB2ZXJzaW9uIG9sZGVyIHRoYW4gMS4yMC4xLAogCQkJCSAqIHRoZSBidWZmZXJzaXplIGhhcyB0byBiZSBuIHRpbWVzIDUxMiAqLwotCQkJCWRpYjA3MDBfZGV2aWNlc1tpXS5hZGFwdGVyW2FkYXBfbnVtXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUgPSAoKDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemUrMTg4LzIpLzUxMikqNTEyOwotCQkJCWlmIChkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplIDwgNTEyKQotCQkJCQlkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplID0gNTEyOworCQkJCWRpYjA3MDBfZGV2aWNlc1tpXS5hZGFwdGVyW2FkYXBfbnVtXS5mZVswXS5zdHJlYW0udS5idWxrLmJ1ZmZlcnNpemUgPSAoKDE4OCpuYl9wYWNrZXRfYnVmZmVyX3NpemUrMTg4LzIpLzUxMikqNTEyOworCQkJCWlmIChkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplIDwgNTEyKQorCQkJCQlkaWIwNzAwX2RldmljZXNbaV0uYWRhcHRlclthZGFwX251bV0uZmVbMF0uc3RyZWFtLnUuYnVsay5idWZmZXJzaXplID0gNTEyOwogCQkJfQogCQl9CiAJfQpAQCAtNTE1LDYgKzU1OSwxMSBAQAogCQl9CiAJfQogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcC0+ZGV2LT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfRU5BQkxFX1ZJREVPOwogCS8qIHRoaXMgYml0IGdpdmVzIGEga2luZCBvZiBjb21tYW5kLAogCSAqIHJhdGhlciB0aGFuIGVuYWJsaW5nIHNvbWV0aGluZyBvciBub3QgKi8KQEAgLTUzMCwyNSArNTc5LDI4IEBACiAJZGViX2luZm8oIm1vZGlmeWluZyAoJWQpIHN0cmVhbWluZyBzdGF0ZSBmb3IgJWRcbiIsIG9ub2ZmLCBhZGFwLT5pZCk7CiAKIAlzdC0+Y2hhbm5lbF9zdGF0ZSAmPSB+MHgzOwotCWlmICgoYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDIpCi0JCQkmJiAoYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDMpKSB7Ci0JCWRlYl9pbmZvKCJ0aGUgZW5kcG9pbnQgbnVtYmVyICglaSkgaXMgbm90IGNvcnJlY3QsIHVzZSB0aGUgYWRhcHRlciBpZCBpbnN0ZWFkIiwgYWRhcC0+c3RyZWFtLnByb3BzLmVuZHBvaW50KTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uc3RyZWFtLnByb3BzLmVuZHBvaW50ICE9IDIpCisJCQkmJiAoYWRhcC0+ZmVfYWRhcFswXS5zdHJlYW0ucHJvcHMuZW5kcG9pbnQgIT0gMykpIHsKKwkJZGViX2luZm8oInRoZSBlbmRwb2ludCBudW1iZXIgKCVpKSBpcyBub3QgY29ycmVjdCwgdXNlIHRoZSBhZGFwdGVyIGlkIGluc3RlYWQiLCBhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludCk7CiAJCWlmIChvbm9mZikKIAkJCXN0LT5jaGFubmVsX3N0YXRlIHw9CTEgPDwgKGFkYXAtPmlkKTsKIAkJZWxzZQogCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCB+KGFkYXAtPmlkKTsKIAl9IGVsc2UgewogCQlpZiAob25vZmYpCi0JCQlzdC0+Y2hhbm5lbF9zdGF0ZSB8PQkxIDw8IChhZGFwLT5zdHJlYW0ucHJvcHMuZW5kcG9pbnQtMik7CisJCQlzdC0+Y2hhbm5lbF9zdGF0ZSB8PQkxIDw8IChhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludC0yKTsKIAkJZWxzZQotCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCAoMy1hZGFwLT5zdHJlYW0ucHJvcHMuZW5kcG9pbnQpOworCQkJc3QtPmNoYW5uZWxfc3RhdGUgfD0JMSA8PCAoMy1hZGFwLT5mZV9hZGFwWzBdLnN0cmVhbS5wcm9wcy5lbmRwb2ludCk7CiAJfQogCiAJc3QtPmJ1ZlsyXSB8PSBzdC0+Y2hhbm5lbF9zdGF0ZTsKIAogCWRlYl9pbmZvKCJkYXRhIGZvciBzdHJlYW1pbmc6ICV4ICV4XG4iLCBzdC0+YnVmWzFdLCBzdC0+YnVmWzJdKTsKIAotCXJldHVybiBkaWIwNzAwX2N0cmxfd3IoYWRhcC0+ZGV2LCBzdC0+YnVmLCA0KTsKKwlyZXQgPSBkaWIwNzAwX2N0cmxfd3IoYWRhcC0+ZGV2LCBzdC0+YnVmLCA0KTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldi0+dXNiX211dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIGludCBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbChzdHJ1Y3QgcmNfZGV2ICpyYywgdTY0IHJjX3R5cGUpCkBAIC01NTcsNiArNjA5LDExIEBACiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKIAlpbnQgbmV3X3Byb3RvLCByZXQ7CiAKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT51c2JfbXV0ZXgpIDwgMCkgeworCQllcnIoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3QtPmJ1ZlswXSA9IFJFUVVFU1RfU0VUX1JDOwogCXN0LT5idWZbMV0gPSAwOwogCXN0LT5idWZbMl0gPSAwOwpAQCAtNTY3LDIzICs2MjQsMjkgQEAKIAllbHNlIGlmIChyY190eXBlID09IFJDX1RZUEVfTkVDKQogCQluZXdfcHJvdG8gPSAwOwogCWVsc2UgaWYgKHJjX3R5cGUgPT0gUkNfVFlQRV9SQzYpIHsKLQkJaWYgKHN0LT5md192ZXJzaW9uIDwgMHgxMDIwMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3QtPmZ3X3ZlcnNpb24gPCAweDEwMjAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KIAogCQluZXdfcHJvdG8gPSAyOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAlzdC0+YnVmWzFdID0gbmV3X3Byb3RvOwogCiAJcmV0ID0gZGliMDcwMF9jdHJsX3dyKGQsIHN0LT5idWYsIDMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWVycigiaXIgcHJvdG9jb2wgc2V0dXAgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCWQtPnByb3BzLnJjLmNvcmUucHJvdG9jb2wgPSByY190eXBlOwogCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCmluZGV4IGQwZWE1YjYuLmYzMTMxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCX0KIAl9CiAJc3QtPm10MjA2MF9pZjFbYWRhcC0+aWRdID0gMTIyMDsKLQlyZXR1cm4gKGFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWIzMDAwbWNfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwlyZXR1cm4gKGFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtY19hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkoMTAgKyBhZGFwLT5pZCkgPDwgMSwgJmJyaXN0b2xfZGliMzAwMG1jX2NvbmZpZ1thZGFwLT5pZF0pKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKQEAgLTExOCwxNSArMTE4LDE2IEBACiBzdGF0aWMgaW50IGJyaXN0b2xfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICpwcmltX2kyYyA9ICZhZGFwLT5kZXYtPmkyY19hZGFwOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjMwMDBtY19nZXRfdHVuZXJfaTJjX21hc3RlcihhZGFwLT5mZSwgMSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliMzAwMG1jX2dldF90dW5lcl9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCXM4IGE7CiAJaW50IGlmMT0xMjIwOwogCWlmIChhZGFwLT5kZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgID09IGNwdV90b19sZTE2KFVTQl9WSURfSEFVUFBBVUdFKSAmJgogCQlhZGFwLT5kZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IGNwdV90b19sZTE2KFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF81MDBfMikpIHsKIAkJaWYgKCFlZXByb21fcmVhZChwcmltX2kyYywweDU5ICsgYWRhcC0+aWQsJmEpKSBpZjE9MTIyMCthOwogCX0KLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLGFkYXAtPmZlLCB0dW5faTJjLCZicmlzdG9sX210MjA2MF9jb25maWdbYWRhcC0+aWRdLAotCQlpZjEpID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAorCQkJICAmYnJpc3RvbF9tdDIwNjBfY29uZmlnW2FkYXAtPmlkXSwgaWYxKSA9PSBOVUxMID8KKwkJCSAgLUVOT0RFViA6IDA7CiB9CiAKIC8qIFNUSzc3MDBEOiBQaW5uYWNsZS9UZXJyYXRlYy9IYXVwcGF1Z2UgRHVhbCBEVkItVCBEaXZlcnNpdHkgKi8KQEAgLTI3OSwxMCArMjgwLDEyIEBACiAJCX0KIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwweDgwKyhhZGFwLT5pZCA8PCAxKSwKLQkJCQkmc3RrNzcwMGRfZGliNzAwMHBfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPQorCQlkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCQkgICAweDgwICsgKGFkYXAtPmlkIDw8IDEpLAorCQkJICAgJnN0azc3MDBkX2RpYjcwMDBwX210MjI2Nl9jb25maWdbYWRhcC0+aWRdKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgaW50IHN0azc3MDBkX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQpAQCAtMzA2LDE3ICszMDksMTkgQEAKIAkJfQogCX0KIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLDB4ODArKGFkYXAtPmlkIDw8IDEpLAotCQkJCSZzdGs3NzAwZF9kaWI3MDAwcF9tdDIyNjZfY29uZmlnW2FkYXAtPmlkXSk7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9CisJCWR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgIDB4ODAgKyAoYWRhcC0+aWQgPDwgMSksCisJCQkgICAmc3RrNzcwMGRfZGliNzAwMHBfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrNzcwMGRfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjOwotCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIyNjZfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwl0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKKwlyZXR1cm4gZHZiX2F0dGFjaChtdDIyNjZfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAogCQkmc3RrNzcwMGRfbXQyMjY2X2NvbmZpZ1thZGFwLT5pZF0pID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMzk2LDggKzQwMSw4IEBACiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBYQzIwMjhfVFVORVJfUkVTRVQ6CiAJCS8qIFNlbmQgdGhlIHR1bmVyIGluIHRoZW4gb3V0IG9mIHJlc2V0ICovCi0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAwKTsgbXNsZWVwKDEwKTsKLQkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmUsIDgsIDAsIDEpOworCQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAwKTsgbXNsZWVwKDEwKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgWEMyMDI4X1JFU0VUX0NMSzoKIAkJYnJlYWs7CkBAIC00NDcsMjUgKzQ1MiwyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkmc3RrNzcwMHBoX2RpYjc3MDBfeGMzMDI4X2NvbmZpZyk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBzdGs3NzAwcGhfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjOwogCi0JdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQlESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCiAJc3RrNzcwMHBoX3hjMzAyOF9jb25maWcuaTJjX2FkYXAgPSB0dW5faTJjOwogCiAJLyogRklYTUU6IGdlbmVyYWxpemUgJiBtb3ZlIHRvIGNvbW1vbiBhcmVhICovCi0JYWRhcC0+ZmUtPmNhbGxiYWNrID0gc3RrNzcwMHBoX3hjMzAyOF9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IHN0azc3MDBwaF94YzMwMjhfY2FsbGJhY2s7CiAKLQlyZXR1cm4gZHZiX2F0dGFjaCh4YzIwMjhfYXR0YWNoLCBhZGFwLT5mZSwgJnN0azc3MDBwaF94YzMwMjhfY29uZmlnKQorCXJldHVybiBkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZzdGs3NzAwcGhfeGMzMDI4X2NvbmZpZykKIAkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCkBAIC02ODUsMTIgKzY5MCwxMiBAQAogCXN0LT5tdDIwNjBfaWYxWzBdID0gMTIyMDsKIAogCWlmIChkaWI3MDAwcGNfZGV0ZWN0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwKSkgewotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMTgsICZzdGs3NzAwcF9kaWI3MDAwcF9jb25maWcpOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAxOCwgJnN0azc3MDBwX2RpYjcwMDBwX2NvbmZpZyk7CiAJCXN0LT5pc19kaWI3MDAwcGMgPSAxOwogCX0gZWxzZQotCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMG1fYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMTgsICZzdGs3NzAwcF9kaWI3MDAwbV9jb25maWcpOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwbV9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAxOCwgJnN0azc3MDBwX2RpYjcwMDBtX2NvbmZpZyk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDIwNjBfY29uZmlnIHN0azc3MDBwX210MjA2MF9jb25maWcgPSB7CkBAIC03MDksMTEgKzcxNCwxMSBAQAogCQlpZiAoIWVlcHJvbV9yZWFkKHByaW1faTJjLDB4NTgsJmEpKSBpZjE9MTIyMCthOwogCX0KIAlpZiAoc3QtPmlzX2RpYjcwMDBwYykKLQkJdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCQl0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAllbHNlCi0JCXR1bl9pMmMgPSBkaWI3MDAwbV9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKKwkJdHVuX2kyYyA9IGRpYjcwMDBtX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAKLQlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywgJnN0azc3MDBwX210MjA2MF9jb25maWcsCisJcmV0dXJuIGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJnN0azc3MDBwX210MjA2MF9jb25maWcsCiAJCWlmMSkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCkBAIC04NDMsMzMgKzg0OCwzMyBAQAogc3RhdGljIGludCBkaWI3NzcwcF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAkgc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwKKwkgc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCi0JIGlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKLQkJCQkgJmRpYjc3NzBwX2RpYjAwNzBfY29uZmlnKSA9PSBOVUxMKQorCSBpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywKKwkJCSZkaWI3NzcwcF9kaWIwMDcwX2NvbmZpZykgPT0gTlVMTCkKIAkJIHJldHVybiAtRU5PREVWOwogCi0JIHN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JIGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3NzcwX3NldF9wYXJhbV9vdmVycmlkZTsKKwkgc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCSBhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3NzcwX3NldF9wYXJhbV9vdmVycmlkZTsKIAkgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliNzA3MHBfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAKIAlpZiAoYWRhcC0+aWQgPT0gMCkgewotCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI3MDcwcF9kaWIwMDcwX2NvbmZpZ1swXSkgPT0gTlVMTCkKKwkJaWYgKGR2Yl9hdHRhY2goZGliMDA3MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZkaWI3MDcwcF9kaWIwMDcwX2NvbmZpZ1swXSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQorCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJmRpYjcwNzBwX2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliNzA3MF9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwNzBfc2V0X3BhcmFtX292ZXJyaWRlOwogCXJldHVybiAwOwogfQogCkBAIC04NzgsMjYgKzg4MywyNiBAQAogewogCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGFkYXB0ZXItPmRldi0+cHJpdjsKIAlpZiAoc3QtPmlzX2RpYjcwMDBwYykKLQkJcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKLQlyZXR1cm4gZGliNzAwMG1fcGlkX2ZpbHRlcihhZGFwdGVyLT5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOworCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcihhZGFwdGVyLT5mZV9hZGFwWzBdLmZlLCBpbmRleCwgcGlkLCBvbm9mZik7CisJcmV0dXJuIGRpYjcwMDBtX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IHN0azc3MDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgb25vZmYpCiB7CiAJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gYWRhcHRlci0+ZGV2LT5wcml2OwogCWlmIChzdC0+aXNfZGliNzAwMHBjKQotCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlLCBvbm9mZik7Ci0JcmV0dXJuIGRpYjcwMDBtX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworCQlyZXR1cm4gZGliNzAwMHBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKKwlyZXR1cm4gZGliNzAwMG1fcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGludCBzdGs3MHgwcF9waWRfZmlsdGVyKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpbmRleCwgdTE2IHBpZCwgaW50IG9ub2ZmKQogewotICAgIHJldHVybiBkaWI3MDAwcF9waWRfZmlsdGVyKGFkYXB0ZXItPmZlLCBpbmRleCwgcGlkLCBvbm9mZik7CisJcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IHN0azcweDBwX3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgb25vZmYpCiB7Ci0gICAgcmV0dXJuIGRpYjcwMDBwX3BpZF9maWx0ZXJfY3RybChhZGFwdGVyLT5mZSwgb25vZmYpOworCXJldHVybiBkaWI3MDAwcF9waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgb25vZmYpOwogfQogCiBzdGF0aWMgc3RydWN0IGRpYngwMDBfYmFuZHdpZHRoX2NvbmZpZyBkaWI3MDcwX2J3X2NvbmZpZ18xMl9taHogPSB7CkBAIC05NTUsOSArOTYwLDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKIAkJJmRpYjcwNzBwX2RpYjcwMDBwX2NvbmZpZyk7Ci0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIC8qIFNUSzc3NzBQICovCkBAIC0xMDA3LDkgKzEwMTIsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkmZGliNzc3MHBfZGliNzAwMHBfY29uZmlnKTsKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogRElCODA3eCBnZW5lcmljICovCkBAIC0xMjI1LDM0ICsxMjMwLDM0IEBACiBzdGF0aWMgaW50IGRpYjgwN3hfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliODAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJRElCWDAwMF9JMkNfSU5URVJGQUNFX1RVTkVSLCAxKTsKIAogCWlmIChhZGFwLT5pZCA9PSAwKSB7Ci0JCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwkJaWYgKGR2Yl9hdHRhY2goZGliMDA3MF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsCiAJCQkJJmRpYjgwN3hfZGliMDA3MF9jb25maWdbMF0pID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9IGVsc2UgewotCQlpZiAoZHZiX2F0dGFjaChkaWIwMDcwX2F0dGFjaCwgYWRhcC0+ZmUsIHR1bl9pMmMsCisJCWlmIChkdmJfYXR0YWNoKGRpYjAwNzBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLAogCQkJCSZkaWI4MDd4X2RpYjAwNzBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliODA3eF9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwN3hfc2V0X3BhcmFtX292ZXJyaWRlOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN0azgweHhfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgsCiAJdTE2IHBpZCwgaW50IG9ub2ZmKQogewotCXJldHVybiBkaWI4MDAwX3BpZF9maWx0ZXIoYWRhcHRlci0+ZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKKwlyZXR1cm4gZGliODAwMF9waWRfZmlsdGVyKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIGluZGV4LCBwaWQsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGludCBzdGs4MHh4X3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwdGVyLAogCQlpbnQgb25vZmYpCiB7Ci0JcmV0dXJuIGRpYjgwMDBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlLCBvbm9mZik7CisJcmV0dXJuIGRpYjgwMDBfcGlkX2ZpbHRlcl9jdHJsKGFkYXB0ZXItPmZlX2FkYXBbMF0uZmUsIG9ub2ZmKTsKIH0KIAogLyogU1RLODA3eCAqLwpAQCAtMTI3NiwxMCArMTI4MSwxMCBAQAogCWRpYjgwMDBfaTJjX2VudW1lcmF0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAxLCAxOCwKIAkJCQkweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliODAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmRpYjgwN3hfZGliODAwMF9jb25maWdbMF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KIAogLyogU1RLODA3eFBWUiAqLwpAQCAtMTMwNSwxMCArMTMxMCwxMCBAQAogCS8qIGluaXRpYWxpemUgSUMgMCAqLwogCWRpYjgwMDBfaTJjX2VudW1lcmF0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwLCAxLCAweDIyLCAweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliODAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLAogCQkJICAgICAgJmRpYjgwN3hfZGliODAwMF9jb25maWdbMF0pOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrODA3eHB2cl9mcm9udGVuZF9hdHRhY2gxKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCkBAIC0xMzE2LDEwICsxMzIxLDEwIEBACiAJLyogaW5pdGlhbGl6ZSBJQyAxICovCiAJZGliODAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDB4MTIsIDB4ODIpOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODIsCiAJCQkgICAgICAmZGliODA3eF9kaWI4MDAwX2NvbmZpZ1sxXSk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogU1RLODA5NkdQICovCkBAIC0xNTQ2LDEzICsxNTUxLDEzIEBACiBzdGF0aWMgaW50IGRpYjgwOXhfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliODAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwOTZfc2V0X3BhcmFtX292ZXJyaWRlOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI4MDk2X3NldF9wYXJhbV9vdmVycmlkZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU3NSwzMCArMTU4MCwzMCBAQAogCiAJZGliODAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDE4LCAweDgwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZkaWI4MDl4X2RpYjgwMDBfY29uZmlnWzBdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI4MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZkaWI4MDl4X2RpYjgwMDBfY29uZmlnWzBdKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gIC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgbmltODA5Nm1kX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCAqZmVfc2xhdmUgID0gZGliODAwMF9nZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmUsIDEpOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlX3NsYXZlICA9IGRpYjgwMDBfZ2V0X3NsYXZlX2Zyb250ZW5kKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCiAJaWYgKGZlX3NsYXZlKSB7CiAJCXR1bl9pMmMgPSBkaWI4MDAwX2dldF9pMmNfbWFzdGVyKGZlX3NsYXZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOwogCQlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX3JlZ2lzdGVyLCBmZV9zbGF2ZSwgdHVuX2kyYywgJmRpYjgwOXhfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJZmVfc2xhdmUtPmR2YiA9IGFkYXAtPmZlLT5kdmI7CisJCWZlX3NsYXZlLT5kdmIgPSBhZGFwLT5mZV9hZGFwWzBdLmZlLT5kdmI7CiAJCWZlX3NsYXZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI4MDk2X3NldF9wYXJhbV9vdmVycmlkZTsKIAl9Ci0JdHVuX2kyYyA9IGRpYjgwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7Ci0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZkaWI4MDl4X2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCXR1bl9pMmMgPSBkaWI4MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgdHVuX2kyYywgJmRpYjgwOXhfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZGliODA5Nl9zZXRfcGFyYW1fb3ZlcnJpZGU7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjgwOTZfc2V0X3BhcmFtX292ZXJyaWRlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjI2LDEyICsxNjMxLDEyIEBACiAKIAlkaWI4MDAwX2kyY19lbnVtZXJhdGlvbigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMiwgMTgsIDB4ODApOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMF0pOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMF0pOworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJZmVfc2xhdmUgPSBkdmJfYXR0YWNoKGRpYjgwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJmRpYjgwOXhfZGliODAwMF9jb25maWdbMV0pOwotCWRpYjgwMDBfc2V0X3NsYXZlX2Zyb250ZW5kKGFkYXAtPmZlLCBmZV9zbGF2ZSk7CisJZGliODAwMF9zZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmVfYWRhcFswXS5mZSwgZmVfc2xhdmUpOwogCiAJcmV0dXJuIGZlX3NsYXZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CkBAIC0xNjM5LDEyICsxNjQ0LDEyIEBACiAvKiBTVEs5MDkwTSAqLwogc3RhdGljIGludCBkaWI5MHgwX3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcHRlciwgaW50IGluZGV4LCB1MTYgcGlkLCBpbnQgb25vZmYpCiB7Ci0JcmV0dXJuIGRpYjkwMDBfZndfcGlkX2ZpbHRlcihhZGFwdGVyLT5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOworCXJldHVybiBkaWI5MDAwX2Z3X3BpZF9maWx0ZXIoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgaW5kZXgsIHBpZCwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IGRpYjkweDBfcGlkX2ZpbHRlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBvbm9mZikKIHsKLQlyZXR1cm4gZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmUsIG9ub2ZmKTsKKwlyZXR1cm4gZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoYWRhcHRlci0+ZmVfYWRhcFswXS5mZSwgb25vZmYpOwogfQogCiBzdGF0aWMgaW50IGRpYjkweDBfdHVuZXJfcmVzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZikKQEAgLTE4NTYsMTUgKzE4NjEsMTUgQEAKIAlzdGs5MDkwbV9jb25maWcubWljcm9jb2RlX0JfZmVfc2l6ZSA9IHN0YXRlLT5mcm9udGVuZF9maXJtd2FyZS0+c2l6ZTsKIAlzdGs5MDkwbV9jb25maWcubWljcm9jb2RlX0JfZmVfYnVmZmVyID0gc3RhdGUtPmZyb250ZW5kX2Zpcm13YXJlLT5kYXRhOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjkwMDBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJnN0azkwOTBtX2NvbmZpZyk7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliOTAwMF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLCAmc3RrOTA5MG1fY29uZmlnKTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gIC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliOTA5MF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlICpzdGF0ZSA9IGFkYXAtPnByaXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoYWRhcC0+ZmUpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gZGliOTAwMF9nZXRfdHVuZXJfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCXUxNiBkYXRhX2RpYjE5MFsxMF0gPSB7CiAJCTEsIDB4MTM3NCwKIAkJMiwgMHgwMWEyLApAQCAtMTg3MywxMyArMTg3OCwxMyBAQAogCQk4LCAweDA0ODYsCiAJfTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlLCBpMmMsICZkaWI5MDkwX2RpYjAwOTBfY29uZmlnKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIGkyYywgJmRpYjkwOTBfZGliMDA5MF9jb25maWcpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCWkyYyA9IGRpYjkwMDBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzFfMiwgMCk7CisJaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfR1BJT18xXzIsIDApOwogCWlmIChkaWIwMXgwX3BtdV91cGRhdGUoaTJjLCBkYXRhX2RpYjE5MCwgMTApICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCWRpYjA3MDBfc2V0X2kyY19zcGVlZChhZGFwLT5kZXYsIDIwMDApOwotCWlmIChkaWI5MDAwX2Zpcm13YXJlX3Bvc3RfcGxsX2luaXQoYWRhcC0+ZmUpIDwgMCkKKwlpZiAoZGliOTAwMF9maXJtd2FyZV9wb3N0X3BsbF9pbml0KGFkYXAtPmZlX2FkYXBbMF0uZmUpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmVsZWFzZV9maXJtd2FyZShzdGF0ZS0+ZnJvbnRlbmRfZmlybXdhcmUpOwogCXJldHVybiAwOwpAQCAtMTkyNSwxNiArMTkzMCwxNiBAQAogCW5pbTkwOTBtZF9jb25maWdbMV0ubWljcm9jb2RlX0JfZmVfYnVmZmVyID0gc3RhdGUtPmZyb250ZW5kX2Zpcm13YXJlLT5kYXRhOwogCiAJZGliOTAwMF9pMmNfZW51bWVyYXRpb24oJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEsIDB4MjAsIDB4ODApOwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZuaW05MDkwbWRfY29uZmlnWzBdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZuaW05MDkwbWRfY29uZmlnWzBdKTsKIAotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fM180LCAwKTsKKwlpMmMgPSBkaWI5MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzNfNCwgMCk7CiAJZGliOTAwMF9pMmNfZW51bWVyYXRpb24oaTJjLCAxLCAweDEyLCAweDgyKTsKIAogCWZlX3NsYXZlID0gZHZiX2F0dGFjaChkaWI5MDAwX2F0dGFjaCwgaTJjLCAweDgyLCAmbmltOTA5MG1kX2NvbmZpZ1sxXSk7Ci0JZGliOTAwMF9zZXRfc2xhdmVfZnJvbnRlbmQoYWRhcC0+ZmUsIGZlX3NsYXZlKTsKKwlkaWI5MDAwX3NldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZV9hZGFwWzBdLmZlLCBmZV9zbGF2ZSk7CiAKIAlyZXR1cm4gZmVfc2xhdmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KQEAgLTE5NTEsMjYgKzE5NTYsMjYgQEAKIAkJMCwgMHgwMGVmLAogCQk4LCAweDA0MDYsCiAJfTsKLQlpMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoYWRhcC0+ZmUpOwotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlLCBpMmMsICZuaW05MDkwbWRfZGliMDA5MF9jb25maWdbMF0pID09IE5VTEwpCisJaTJjID0gZGliOTAwMF9nZXRfdHVuZXJfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOworCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfZndfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIGkyYywgJm5pbTkwOTBtZF9kaWIwMDkwX2NvbmZpZ1swXSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaTJjID0gZGliOTAwMF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fMV8yLCAwKTsKKwlpMmMgPSBkaWI5MDAwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzFfMiwgMCk7CiAJaWYgKGRpYjAxeDBfcG11X3VwZGF0ZShpMmMsIGRhdGFfZGliMTkwLCAxMCkgPCAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlkaWIwNzAwX3NldF9pMmNfc3BlZWQoYWRhcC0+ZGV2LCAyMDAwKTsKLQlpZiAoZGliOTAwMF9maXJtd2FyZV9wb3N0X3BsbF9pbml0KGFkYXAtPmZlKSA8IDApCisJaWYgKGRpYjkwMDBfZmlybXdhcmVfcG9zdF9wbGxfaW5pdChhZGFwLT5mZV9hZGFwWzBdLmZlKSA8IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JZmVfc2xhdmUgPSBkaWI5MDAwX2dldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZSwgMSk7CisJZmVfc2xhdmUgPSBkaWI5MDAwX2dldF9zbGF2ZV9mcm9udGVuZChhZGFwLT5mZV9hZGFwWzBdLmZlLCAxKTsKIAlpZiAoZmVfc2xhdmUgIT0gTlVMTCkgewotCQlpMmMgPSBkaWI5MDAwX2dldF9jb21wb25lbnRfYnVzX2ludGVyZmFjZShhZGFwLT5mZSk7CisJCWkyYyA9IGRpYjkwMDBfZ2V0X2NvbXBvbmVudF9idXNfaW50ZXJmYWNlKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCQlkaWI5MDAwX3NldF9pMmNfYWRhcHRlcihmZV9zbGF2ZSwgaTJjKTsKIAogCQlpMmMgPSBkaWI5MDAwX2dldF90dW5lcl9pbnRlcmZhY2UoZmVfc2xhdmUpOwogCQlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX2Z3X3JlZ2lzdGVyLCBmZV9zbGF2ZSwgaTJjLCAmbmltOTA5MG1kX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWZlX3NsYXZlLT5kdmIgPSBhZGFwLT5mZS0+ZHZiOwotCQlkaWI5MDAwX2Z3X3NldF9jb21wb25lbnRfYnVzX3NwZWVkKGFkYXAtPmZlLCAyMDAwKTsKKwkJZmVfc2xhdmUtPmR2YiA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPmR2YjsKKwkJZGliOTAwMF9md19zZXRfY29tcG9uZW50X2J1c19zcGVlZChhZGFwLT5mZV9hZGFwWzBdLmZlLCAyMDAwKTsKIAkJaWYgKGRpYjkwMDBfZmlybXdhcmVfcG9zdF9wbGxfaW5pdChmZV9zbGF2ZSkgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMjM5MywyMyArMjM5OCwyMyBAQAogCQllcnIoIiVzOiBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24gZmFpbGVkLiAgQ2Fubm90IGNvbnRpbnVlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MCwgJm5pbTcwOTBfZGliNzAwMHBfY29uZmlnKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDgwLCAmbmltNzA5MF9kaWI3MDAwcF9jb25maWcpOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAgLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/ICAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBuaW03MDkwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmMgPSBkaWI3MDkwX2dldF9pMmNfdHVuZXIoYWRhcC0+ZmUpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZV9hZGFwWzBdLmZlKTsKIAotCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlLCB0dW5faTJjLCAmbmltNzA5MF9kaWIwMDkwX2NvbmZpZykgPT0gTlVMTCkKKwlpZiAoZHZiX2F0dGFjaChkaWIwMDkwX3JlZ2lzdGVyLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLCAmbmltNzA5MF9kaWIwMDkwX2NvbmZpZykgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZSwgOCwgMCwgMSk7CisJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAKLQlzdC0+c2V0X3BhcmFtX3NhdmUgPSBhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOwotCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDkwX2FnY19zdGFydHVwOworCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtczsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWI3MDkwX2FnY19zdGFydHVwOwogCXJldHVybiAwOwogfQogCkBAIC0yNDM5LDExICsyNDQ0LDExIEBACiAJfQogCiAJZGliMDcwMF9zZXRfaTJjX3NwZWVkKGFkYXAtPmRldiwgMzQwKTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg5MCwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzBdKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDkwLCAmdGZlNzA5MHB2cl9kaWI3MDAwcF9jb25maWdbMF0pOworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGliNzA5MF9zbGF2ZV9yZXNldChhZGFwLT5mZSk7CisJZGliNzA5MF9zbGF2ZV9yZXNldChhZGFwLT5mZV9hZGFwWzBdLmZlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ1Miw1MCArMjQ1Nyw1MCBAQAogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwogCi0JaWYgKGFkYXAtPmRldi0+YWRhcHRlclswXS5mZSA9PSBOVUxMKSB7CisJaWYgKGFkYXAtPmRldi0+YWRhcHRlclswXS5mZV9hZGFwWzBdLmZlID09IE5VTEwpIHsKIAkJZXJyKCJ0aGUgbWFzdGVyIGRpYjcwOTAgaGFzIHRvIGJlIGluaXRpYWxpemVkIGZpcnN0Iik7CiAJCXJldHVybiAtRU5PREVWOyAvKiB0aGUgbWFzdGVyIGRldmljZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KIAl9CiAKLQlpMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5kZXYtPmFkYXB0ZXJbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzZfNywgMSk7CisJaTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZGV2LT5hZGFwdGVyWzBdLmZlX2FkYXBbMF0uZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9HUElPXzZfNywgMSk7CiAJaWYgKGRpYjcwMDBwX2kyY19lbnVtZXJhdGlvbihpMmMsIDEsIDB4MTAsICZ0ZmU3MDkwcHZyX2RpYjcwMDBwX2NvbmZpZ1sxXSkgIT0gMCkgewogCQllcnIoIiVzOiBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24gZmFpbGVkLiAgQ2Fubm90IGNvbnRpbnVlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsIGkyYywgMHg5MiwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzFdKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsIGkyYywgMHg5MiwgJnRmZTcwOTBwdnJfZGliNzAwMHBfY29uZmlnWzFdKTsKIAlkaWIwNzAwX3NldF9pMmNfc3BlZWQoYWRhcC0+ZGV2LCAyMDApOwogCi0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgdGZlNzA5MHB2cl90dW5lcjBfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzA5MF9nZXRfaTJjX3R1bmVyKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzBdKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzBdKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAxKTsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdGZlNzA5MHB2cl90dW5lcjFfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYyA9IGRpYjcwOTBfZ2V0X2kyY190dW5lcihhZGFwLT5mZSk7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjID0gZGliNzA5MF9nZXRfaTJjX3R1bmVyKGFkYXAtPmZlX2FkYXBbMF0uZmUpOwogCi0JaWYgKGR2Yl9hdHRhY2goZGliMDA5MF9yZWdpc3RlciwgYWRhcC0+ZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKGRpYjAwOTBfcmVnaXN0ZXIsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsICZ0ZmU3MDkwcHZyX2RpYjAwOTBfY29uZmlnWzFdKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZV9hZGFwWzBdLmZlLCA4LCAwLCAxKTsKIAotCXN0LT5zZXRfcGFyYW1fc2F2ZSA9IGFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXM7Ci0JYWRhcC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CisJc3QtPnNldF9wYXJhbV9zYXZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zOworCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRpYjcwOTBfYWdjX3N0YXJ0dXA7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1NTUsMTQgKzI1NjAsMTQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZzdGs3MDcwcGRfZGliNzAwMHBfY29uZmlnWzBdKTsKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4ODAsICZzdGs3MDcwcGRfZGliNzAwMHBfY29uZmlnWzBdKTsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3RrNzA3MHBkX2Zyb250ZW5kX2F0dGFjaDEoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJnN0azcwNzBwZF9kaWI3MDAwcF9jb25maWdbMV0pOwotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg4MiwgJnN0azcwNzBwZF9kaWI3MDAwcF9jb25maWdbMV0pOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogUzVIMTQxMSAqLwpAQCAtMjYxNyw5ICsyNjIyLDkgQEAKIAlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzIsIEdQSU9fT1VULCAxKTsKIAogCS8qIEdQSU9zIGFyZSBpbml0aWFsaXplZCwgZG8gdGhlIGF0dGFjaCAqLwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzNWgxNDExX2F0dGFjaCwgJnBpbm5hY2xlXzgwMWVfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHM1aDE0MTFfYXR0YWNoLCAmcGlubmFjbGVfODAxZV9jb25maWcsCiAJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7Ci0JcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDcwMF94YzUwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwKQEAgLTI2NDksOSArMjY1NCw5IEBACiBzdGF0aWMgaW50IHhjNTAwMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAkvKiBGSVhNRTogZ2VuZXJhbGl6ZSAmIG1vdmUgdG8gY29tbW9uIGFyZWEgKi8KLQlhZGFwLT5mZS0+Y2FsbGJhY2sgPSBkaWIwNzAwX3hjNTAwMF90dW5lcl9jYWxsYmFjazsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5jYWxsYmFjayA9IGRpYjA3MDBfeGM1MDAwX3R1bmVyX2NhbGxiYWNrOwogCi0JcmV0dXJuIGR2Yl9hdHRhY2goeGM1MDAwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldHVybiBkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJICAmczVoMTQxMV94YzUwMDBfdHVuZXJjb25maWcpCiAJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KQEAgLTI2NjMsOSArMjY2OCw5IEBACiAKIAlpZiAoY29tbWFuZCA9PSBYQzQwMDBfVFVORVJfUkVTRVQpIHsKIAkJLyogUmVzZXQgdGhlIHR1bmVyICovCi0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAwKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMCk7CiAJCW1zbGVlcCgxMCk7Ci0JCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmVfYWRhcFswXS5mZSwgOCwgMCwgMSk7CiAJfSBlbHNlIHsKIAkJZXJyKCJ4YzQwMDA6IHVua25vd24gdHVuZXIgY2FsbGJhY2sgY29tbWFuZDogJWRcbiIsIGNvbW1hbmQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3NzEsMTEgKzI3NzYsMTEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjcwMDBwX2F0dGFjaCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4MTIsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHgxMiwKIAkJCSAgICAgICZwY3R2XzM0MGVfY29uZmlnKTsKIAlzdC0+aXNfZGliNzAwMHBjID0gMTsKIAotCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CisJcmV0dXJuIGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHhjNDAwMF9jb25maWcgZGliNzAwMHBfeGM0MDAwX3R1bmVyY29uZmlnID0gewpAQCAtMjc5MSw3ICsyNzk2LDcgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7CiAKIAkvKiBUaGUgeGM0MDAwIGlzIG5vdCBvbiB0aGUgbWFpbiBpMmMgYnVzICovCi0JdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLAogCQkJCQkgIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CiAJaWYgKHR1bl9pMmMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWFjaCB0dW5lciBpMmMgYnVzXG4iKTsKQEAgLTI3OTksOSArMjgwNCw5IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJlc2V0IGNhbGxiYWNrICovCi0JYWRhcC0+ZmUtPmNhbGxiYWNrID0gZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2s7CisJYWRhcC0+ZmVfYWRhcFswXS5mZS0+Y2FsbGJhY2sgPSBkaWIwNzAwX3hjNDAwMF90dW5lcl9jYWxsYmFjazsKIAotCXJldHVybiBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGFkYXAtPmZlLCB0dW5faTJjLAorCXJldHVybiBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIHR1bl9pMmMsCiAJCQkgICZkaWI3MDAwcF94YzQwMDBfdHVuZXJjb25maWcpCiAJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KQEAgLTI4NTcsMTYgKzI4NjIsMTYgQEAKIAlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMSk7CiAJbXNsZWVwKDMwKTsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChsZ2R0MzMwNV9hdHRhY2gsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMDVfYXR0YWNoLAogCQkJICAgICAgJmhjd19sZ2R0MzMwNV9jb25maWcsCiAJCQkgICAgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAogc3RhdGljIGludCBteGw1MDA3dF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlyZXR1cm4gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlLAorCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDd0X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwKIAkJCSAgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDB4NjAsCiAJCQkgICZoY3dfbXhsNTAwN3RfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CkBAIC0yOTg5LDYgKzI5OTQsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azc3MDBwX3BpZF9maWx0ZXIsCkBAIC0yOTk3LDYgKzMwMDQsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gc3RrNzcwMHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCisJCQl9fSwKIAkJCX0sCiAJCX0sCiAKQEAgLTMwNTAsMTUgKzMwNTgsMjEgQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGJyaXN0b2xfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gYnJpc3RvbF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKKwkJCX19LAogCQkJfSwgeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGJyaXN0b2xfZnJvbnRlbmRfYXR0YWNoLAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gYnJpc3RvbF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAzKSwKKwkJCX19LAogCQkJfQogCQl9LAogCkBAIC0zMDg0LDYgKzMwOTgsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMiwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMDkyLDcgKzMxMDgsMTAgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBkX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCQkJfX0sCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMTAxLDYgKzMxMjAsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gc3RrNzcwMGRfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCisJCQl9fSwKIAkJCX0KIAkJfSwKIApAQCAtMzE0Myw2ICszMTYzLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzE1MSw2ICszMTczLDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBkX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCQkJfX0sCiAJCQl9LAogCQl9LAogCkBAIC0zMTg1LDYgKzMyMDgsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMTkzLDcgKzMyMTgsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKIAkJfSwKQEAgLTMyNjEsNiArMzI4Niw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAxLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyICAgICAgID0gc3RrNzB4MHBfcGlkX2ZpbHRlciwKQEAgLTMyNjksNyArMzI5Niw3IEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LAogCQl9LApAQCAtMzMwNSw2ICszMzMyLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzMxMyw5ICszMzQyLDExIEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMzI0LDcgKzMzNTUsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfQogCQl9LApAQCAtMzM3Myw2ICszNDA0LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzM4MSw5ICszNDE0LDExIEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWI3MDcwcF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LCB7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zMzkyLDcgKzM0MjcsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzA3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfQogCQl9LApAQCAtMzQyMCw2ICszNDU1LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgICAgICAgPSBzdGs3MHgwcF9waWRfZmlsdGVyLApAQCAtMzQyOCw3ICszNDY1LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHN0azc3MDBwaF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKIAkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzQ4OCwxMSArMzUyNSwxMyBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gczVoMTQxMV9mcm9udGVuZF9hdHRhY2gsCiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB4YzUwMDBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0CiAJCQkJCQlkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM1MjQsMTEgKzM1NjMsMTMgQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGxnZHQzMzA1X2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDUwMDd0X3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdAogCQkJCQkJZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNTUwLDYgKzM1OTEsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAkJCQkucGlkX2ZpbHRlciAgICAgICA9IHN0azcweDBwX3BpZF9maWx0ZXIsCkBAIC0zNTU4LDcgKzM2MDEsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliNzc3MHBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzYwMCw2ICszNjQzLDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyID0gc3RrODB4eF9waWRfZmlsdGVyLApAQCAtMzYwOCw3ICszNjUzLDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYjgwN3hfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzY0NCw2ICszNjg5LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAogCQkJCS5waWRfZmlsdGVyID0gc3RrODB4eF9waWRfZmlsdGVyLApAQCAtMzY1MiwxMSArMzY5OSwxMyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA3eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkJLnBpZF9maWx0ZXIgPSBzdGs4MHh4X3BpZF9maWx0ZXIsCkBAIC0zNjY1LDcgKzM3MTQsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA3eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAzKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNjkzLDYgKzM3NDIsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzAyLDcgKzM3NTMsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliODA5eF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNzMwLDYgKzM3ODEsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzM5LDcgKzM3OTIsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gZGliOTA5MF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9CiAJCQkJCXNpemVvZihzdHJ1Y3QgZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKIAkJCX0sCkBAIC0zNzY3LDYgKzM4MjAsOCBAQAogCQkubnVtX2FkYXB0ZXJzID0gMSwKIAkJLmFkYXB0ZXIgPSB7CiAJCQl7CisJCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCQkuZmUgPSB7ewogCQkJCS5jYXBzICA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCkBAIC0zNzc2LDcgKzM4MzEsNyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gbmltODA5Nm1kX3R1bmVyX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0KIAkJCQkJc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM4MDQsNiArMzg1OSw4IEBACiAJCS5udW1fYWRhcHRlcnMgPSAxLAogCQkuYWRhcHRlciA9IHsKIAkJCXsKKwkJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJCS5mZSA9IHt7CiAJCQkJLmNhcHMgID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKQEAgLTM4MTMsNyArMzg3MCw3IEBACiAJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBuaW05MDkwbWRfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzg0MSw2ICszODk4LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzg1MCw3ICszOTA5LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IG5pbTcwOTBfdHVuZXJfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApAQCAtMzg3OCw2ICszOTM3LDggQEAKIAkJLm51bV9hZGFwdGVycyA9IDIsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzg4NywxMSArMzk0OCwxMyBAQAogCQkJCS50dW5lcl9hdHRhY2ggICAgID0gdGZlNzA5MHB2cl90dW5lcjBfYXR0YWNoLAogCiAJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMyksCi0KKwkJCX19LAogCQkJCS5zaXplX29mX3ByaXYgPQogCQkJCQlzaXplb2Yoc3RydWN0IGRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LAogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuY2FwcyAgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAogCQkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLApAQCAtMzkwMSw3ICszOTY0LDcgQEAKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHRmZTcwOTBwdnJfdHVuZXIxX2F0dGFjaCwKIAogCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAotCisJCQl9fSwKIAkJCQkuc2l6ZV9vZl9wcml2ID0KIAkJCQkJc2l6ZW9mKHN0cnVjdCBkaWIwNzAwX2FkYXB0ZXJfc3RhdGUpLAogCQkJfSwKQEAgLTM5MjksMTEgKzM5OTIsMTMgQEAKIAkJLm51bV9hZGFwdGVycyA9IDEsCiAJCS5hZGFwdGVyID0gewogCQkJeworCQkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkJLmZlID0ge3sKIAkJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHBjdHYzNDBlX2Zyb250ZW5kX2F0dGFjaCwKIAkJCQkudHVuZXJfYXR0YWNoICAgICA9IHhjNDAwMF90dW5lcl9hdHRhY2gsCiAKIAkJCQlESUIwNzAwX0RFRkFVTFRfU1RSRUFNSU5HX0NPTkZJRygweDAyKSwKLQorCQkJfX0sCiAJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKIAkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCiAJCQl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwppbmRleCA0YzJhNjg5Li5hNzZiYmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwpAQCAtMjMsNyArMjMsNyBAQAogCWlmIChhZGFwLT5wcml2ICE9IE5VTEwpIHsKIAkJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwogCQlpZiAoc3QtPm9wcy5maWZvX2N0cmwgIT0gTlVMTCkKLQkJCWlmIChzdC0+b3BzLmZpZm9fY3RybChhZGFwLT5mZSxvbm9mZikpIHsKKwkJCWlmIChzdC0+b3BzLmZpZm9fY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCBvbm9mZikpIHsKIAkJCQllcnIoImVycm9yIHdoaWxlIGNvbnRyb2xsaW5nIHRoZSBmaWZvIG9mIHRoZSBkZW1vZC4iKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KQEAgLTM3LDcgKzM3LDggQEAKIAlpZiAoYWRhcC0+cHJpdiAhPSBOVUxMKSB7CiAJCXN0cnVjdCBkaWJ1c2Jfc3RhdGUgKnN0ID0gYWRhcC0+cHJpdjsKIAkJaWYgKHN0LT5vcHMucGlkX2N0cmwgIT0gTlVMTCkKLQkJCXN0LT5vcHMucGlkX2N0cmwoYWRhcC0+ZmUsaW5kZXgscGlkLG9ub2ZmKTsKKwkJCXN0LT5vcHMucGlkX2N0cmwoYWRhcC0+ZmVfYWRhcFswXS5mZSwKKwkJCQkJIGluZGV4LCBwaWQsIG9ub2ZmKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00OCw3ICs0OSw3IEBACiAJaWYgKGFkYXAtPnByaXYgIT0gTlVMTCkgewogCQlzdHJ1Y3QgZGlidXNiX3N0YXRlICpzdCA9IGFkYXAtPnByaXY7CiAJCWlmIChzdC0+b3BzLnBpZF9wYXJzZSAhPSBOVUxMKQotCQkJaWYgKHN0LT5vcHMucGlkX3BhcnNlKGFkYXAtPmZlLG9ub2ZmKSA8IDApCisJCQlpZiAoc3QtPm9wcy5waWRfcGFyc2UoYWRhcC0+ZmVfYWRhcFswXS5mZSwgb25vZmYpIDwgMCkKIAkJCQllcnIoImNvdWxkIG5vdCBoYW5kbGUgcGlkX3BhcnNlciIpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI1NCw4ICsyNTUsMTYgQEAKIAkJbXNsZWVwKDEwMDApOwogCX0KIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtY19hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCBERUZBVUxUX0RJQjMwMDBQX0kyQ19BRERSRVNTLCAgJm1vZDMwMDBwX2RpYjMwMDBwX2NvbmZpZykpICE9IE5VTEwgfHwKLQkJKGFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWIzMDAwbWNfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgREVGQVVMVF9ESUIzMDAwTUNfSTJDX0FERFJFU1MsICZtb2QzMDAwcF9kaWIzMDAwcF9jb25maWcpKSAhPSBOVUxMKSB7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1jX2F0dGFjaCwKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCQkJCQkgREVGQVVMVF9ESUIzMDAwUF9JMkNfQUREUkVTUywKKwkJCQkJICZtb2QzMDAwcF9kaWIzMDAwcF9jb25maWcpOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgPT0gTlVMTCkKKwkJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1jX2F0dGFjaCwKKwkJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCQkJCSBERUZBVUxUX0RJQjMwMDBNQ19JMkNfQUREUkVTUywKKwkJCQkJCSAmbW9kMzAwMHBfZGliMzAwMHBfY29uZmlnKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJaWYgKGFkYXAtPnByaXYgIT0gTlVMTCkgewogCQkJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBhZGFwLT5wcml2OwogCQkJc3QtPm9wcy5waWRfcGFyc2UgPSBkaWIzMDAwbWNfcGlkX3BhcnNlOwpAQCAtMzA5LDE1ICszMTgsMTUgQEAKIAkJfQogCX0KIAotCXR1bl9pMmMgPSBkaWIzMDAwbWNfZ2V0X3R1bmVyX2kyY19tYXN0ZXIoYWRhcC0+ZmUsIDEpOwotCWlmIChkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlLCB0dW5faTJjLCAmc3RrMzAwMHBfbXQyMDYwX2NvbmZpZywgaWYxKSA9PSBOVUxMKSB7CisJdHVuX2kyYyA9IGRpYjMwMDBtY19nZXRfdHVuZXJfaTJjX21hc3RlcihhZGFwLT5mZV9hZGFwWzBdLmZlLCAxKTsKKwlpZiAoZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCB0dW5faTJjLCAmc3RrMzAwMHBfbXQyMDYwX2NvbmZpZywgaWYxKSA9PSBOVUxMKSB7CiAJCS8qIG5vdCBmb3VuZCAtIHVzZSBwYW5hc29uaWMgcGxsIHBhcmFtZXRlcnMgKi8KLQkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYwLCB0dW5faTJjLCBEVkJfUExMX0VOVjU3SDFYRDUpID09IE5VTEwpCisJCWlmIChkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCB0dW5faTJjLCBEVkJfUExMX0VOVjU3SDFYRDUpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgewogCQlzdC0+bXQyMDYwX3ByZXNlbnQgPSAxOwogCQkvKiBzZXQgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyBmb3IgdGhlIGRpYjMwMDBwICovCi0JCWRpYjMwMDBtY19zZXRfY29uZmlnKGFkYXAtPmZlLCAmc3RrMzAwMHBfZGliMzAwMHBfY29uZmlnKTsKKwkJZGliMzAwMG1jX3NldF9jb25maWcoYWRhcC0+ZmVfYWRhcFswXS5mZSwgJnN0azMwMDBwX2RpYjMwMDBwX2NvbmZpZyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggMDRkOTFiZC4uNzI3MDc5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0zMSwxMSArMzEsMTIgQEAKIAogCWRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzID0gMHg4OwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliMzAwMG1iX2F0dGFjaCwgJmRlbW9kX2NmZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJnN0LT5vcHMpKSA9PSBOVUxMKQorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRpYjMwMDBtYl9hdHRhY2gsICZkZW1vZF9jZmcsCisJCQkJCSAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJnN0LT5vcHMpOworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwgPSBkaWIzMDAwbWJfaTJjX2dhdGVfY3RybDsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRpYjMwMDBtYl9pMmNfZ2F0ZV9jdHJsOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00Niw3ICs0Nyw3IEBACiAKIAlzdC0+dHVuZXJfYWRkciA9IDB4NjE7CiAKLQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCSAgIERWQl9QTExfVFVBNjAxMFhTKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU3LDcgKzU4LDcgQEAKIAogCXN0LT50dW5lcl9hZGRyID0gMHg2MDsKIAotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJICAgRFZCX1BMTF9UREE2NjVYKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc4LDE2ICs3OSwxNiBAQAogCS8qIHRoZSBQYW5hc29uaWMgc2l0cyBvbiBJMkMgYWRkcmFzcyAweDYwLCB0aGUgVGhvbXNvbiBvbiAweDYxICovCiAJbXNnWzBdLmFkZHIgPSBtc2dbMV0uYWRkciA9IHN0LT50dW5lcl9hZGRyID0gMHg2MDsKIAotCWlmIChhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWFkYXAtPmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZSwxKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGFkYXAtPmZlX2FkYXBbMF0uZmUsIDEpOwogCiAJaWYgKGkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB7CiAJCWVycigidHVuZXIgaTJjIHdyaXRlIGZhaWxlZC4iKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKIAl9CiAKLQlpZiAoYWRhcC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlhZGFwLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoYWRhcC0+ZmUsMCk7CisJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCAwKTsKIAogCWlmIChiMlswXSA9PSAweGZlKSB7CiAJCWluZm8oIlRoaXMgZGV2aWNlIGhhcyB0aGUgVGhvbXNvbiBDYWJsZSBvbmJvYXJkLiBXaGljaCBpcyBkZWZhdWx0LiIpOwpAQCAtMTg1LDYgKzE4Niw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCiAKQEAgLTIwNSw2ICsyMDgsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCkBAIC0yNzIsNiArMjc2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGIHwgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNiwKIApAQCAtMjkyLDYgKzI5OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9LAogCX0sCkBAIC0zMzgsNiArMzQ1LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNiwKIApAQCAtMzU4LDYgKzM2Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9CiAJfSwKQEAgLTM5OCw2ICs0MDgsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE2LAogCkBAIC00MTcsNiArNDI5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKaW5kZXggYzFkOTA5NC4uOWMxNjVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCkBAIC01Nyw2ICs1Nyw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKQEAgLTc2LDYgKzc4LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKaW5kZXggZjYzNDRjZC4uZjcxODQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0xMzcsMTEgKzEzNywxNiBAQAogewogCXN0cnVjdCBkaWdpdHZfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmZGlnaXR2X210MzUyX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmZGlnaXR2X210MzUyX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJc3QtPmlzX254dDYwMDAgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobnh0NjAwMF9hdHRhY2gsICZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkgeworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKG54dDYwMDBfYXR0YWNoLAorCQkJCQkgJmRpZ2l0dl9ueHQ2MDAwX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpICE9IE5VTEwpIHsKIAkJc3QtPmlzX254dDYwMDAgPSAxOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNTIsMTEgKzE1NywxMSBAQAogewogCXN0cnVjdCBkaWdpdHZfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OwogCi0JaWYgKCFkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgTlVMTCwgRFZCX1BMTF9UREVENCkpCisJaWYgKCFkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCBOVUxMLCBEVkJfUExMX1RERUQ0KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoc3QtPmlzX254dDYwMDApCi0JCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zOworCQlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTIsNiArMjk3LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpZ2l0dl9mcm9udGVuZF9hdHRhY2gsCiAJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpZ2l0dl90dW5lcl9hdHRhY2gsCiAKQEAgLTMwNiw2ICszMTMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5pZGVudGlmeV9zdGF0ZSAgID0gZGlnaXR2X2lkZW50aWZ5X3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwppbmRleCBlY2Q4NmVjLi4xMDZkZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuYwpAQCAtOTAsNyArOTAsNyBAQAogCiBzdGF0aWMgaW50IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JYWRhcC0+ZmUgPSBkdHQyMDB1X2ZlX2F0dGFjaChhZGFwLT5kZXYpOworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdHQyMDB1X2ZlX2F0dGFjaChhZGFwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDAsNiArMTQwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCkBAIC0xNTcsNiArMTU5LDcgQEAKIAkJCX0KIAkJfQogCX0sCisJCX19LAogCQl9CiAJfSwKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLApAQCAtMTg3LDYgKzE5MCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAxNSwKIApAQCAtMjA0LDYgKzIwOSw3IEBACiAJCQl9CiAJCX0KIAl9LAorCQl9fSwKIAkJfQogCX0sCiAJLnBvd2VyX2N0cmwgICAgICA9IGR0dDIwMHVfcG93ZXJfY3RybCwKQEAgLTIzNCw2ICsyNDAsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklORywKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTUsCiAKQEAgLTI1MSw2ICsyNTksNyBAQAogCQkJfQogCQl9CiAJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCkBAIC0yODEsNiArMjkwLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCkBAIC0yOTgsNiArMzA5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIAkucG93ZXJfY3RybCAgICAgID0gZHR0MjAwdV9wb3dlcl9jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHY1MTAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYwppbmRleCAwNzhjZTkyLi43MzczMTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0djUxMDAuYwpAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAogc3RhdGljIGludCBkdHY1MTAwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmR0djUxMDBfemwxMDM1M19jb25maWcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZkdHY1MTAwX3psMTAzNTNfY29uZmlnLAogCQkJICAgICAgJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJLyogZGlzYWJsZSBpMmMgZ2F0ZSwgb3IgaXQgd29uJ3Qgd29yay4uLiBpcyB0aGlzIHNhZmU/ICovCi0JYWRhcC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMyw3ICsxMzMsNyBAQAogc3RhdGljIGludCBkdHY1MTAwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXJldHVybiBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsCi0JCQkgIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkgICZkdHY1MTAwX3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMTgwLDYgKzE4MCw4IEBACiAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJLmZyb250ZW5kX2F0dGFjaCA9IGR0djUxMDBfZnJvbnRlbmRfYXR0YWNoLAogCQkudHVuZXJfYXR0YWNoICAgID0gZHR2NTEwMF90dW5lcl9hdHRhY2gsCiAKQEAgLTE5Myw2ICsxOTUsNyBAQAogCQkJCX0KIAkJCX0KIAkJfSwKKwkJfX0sCiAJfSB9LAogCiAJLmkyY19hbGdvID0gJmR0djUxMDBfaTJjX2FsZ28sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKaW5kZXggYjNjYjYyNi4uYmE0YTc1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYwpAQCAtMTcsMTUgKzE3LDIwIEBACiAJaWYgKGFkYXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoKGFkYXAtPmFjdGl2ZV9mZSA8IDApIHx8CisJICAgIChhZGFwLT5hY3RpdmVfZmUgPj0gYWRhcC0+bnVtX2Zyb250ZW5kc19pbml0aWFsaXplZCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbmV3ZmVlZGNvdW50ID0gYWRhcC0+ZmVlZGNvdW50ICsgKG9ub2ZmID8gMSA6IC0xKTsKIAogCS8qIHN0b3AgZmVlZCBiZWZvcmUgc2V0dGluZyBhIG5ldyBwaWQgaWYgdGhlcmUgd2lsbCBiZSBubyBwaWQgYW55bW9yZSAqLwogCWlmIChuZXdmZWVkY291bnQgPT0gMCkgewogCQlkZWJfdHMoInN0b3AgZmVlZGluZ1xuIik7Ci0JCXVzYl91cmJfa2lsbCgmYWRhcC0+c3RyZWFtKTsKKwkJdXNiX3VyYl9raWxsKCZhZGFwLT5mZV9hZGFwW2FkYXAtPmFjdGl2ZV9mZV0uc3RyZWFtKTsKIAotCQlpZiAoYWRhcC0+cHJvcHMuc3RyZWFtaW5nX2N0cmwgIT0gTlVMTCkgewotCQkJcmV0ID0gYWRhcC0+cHJvcHMuc3RyZWFtaW5nX2N0cmwoYWRhcCwgMCk7CisJCWlmIChhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbWluZ19jdHJsICE9IE5VTEwpIHsKKwkJCXJldCA9IGFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0uc3RyZWFtaW5nX2N0cmwoYWRhcCwgMCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCWVycigiZXJyb3Igd2hpbGUgc3RvcHBpbmcgc3RyZWFtLiIpOwogCQkJCXJldHVybiByZXQ7CkBAIC0zNiwzNiArNDEsMzcgQEAKIAlhZGFwLT5mZWVkY291bnQgPSBuZXdmZWVkY291bnQ7CiAKIAkvKiBhY3RpdmF0ZSB0aGUgcGlkIG9uIHRoZSBkZXZpY2Ugc3BlY2lmaWMgcGlkX2ZpbHRlciAqLwotCWRlYl90cygic2V0dGluZyBwaWQgKCVzKTogJTVkICUwNHggYXQgaW5kZXggJWQgJyVzJ1xuIixhZGFwLT5waWRfZmlsdGVyaW5nID8KLQkJInllcyIgOiAibm8iLCBkdmJkbXhmZWVkLT5waWQsZHZiZG14ZmVlZC0+cGlkLGR2YmRteGZlZWQtPmluZGV4LG9ub2ZmID8KLQkJIm9uIiA6ICJvZmYiKTsKLQlpZiAoYWRhcC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiAmJgotCQlhZGFwLT5waWRfZmlsdGVyaW5nICYmCi0JCWFkYXAtPnByb3BzLnBpZF9maWx0ZXIgIT0gTlVMTCkKLQkJYWRhcC0+cHJvcHMucGlkX2ZpbHRlcihhZGFwLCBkdmJkbXhmZWVkLT5pbmRleCwgZHZiZG14ZmVlZC0+cGlkLG9ub2ZmKTsKKwlkZWJfdHMoInNldHRpbmcgcGlkICglcyk6ICU1ZCAlMDR4IGF0IGluZGV4ICVkICclcydcbiIsCisJCWFkYXAtPmZlX2FkYXBbYWRhcC0+YWN0aXZlX2ZlXS5waWRfZmlsdGVyaW5nID8KKwkJInllcyIgOiAibm8iLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnBpZCwKKwkJZHZiZG14ZmVlZC0+aW5kZXgsIG9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKKwlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSICYmCisJCWFkYXAtPmZlX2FkYXBbYWRhcC0+YWN0aXZlX2ZlXS5waWRfZmlsdGVyaW5nICYmCisJCWFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlciAhPSBOVUxMKQorCQlhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnBpZF9maWx0ZXIoYWRhcCwgZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgb25vZmYpOwogCiAJLyogc3RhcnQgdGhlIGZlZWQgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IGZlZWQgYW5kIHRoZXJlIGlzIHN0aWxsIGEgZmVlZAogCSAqIGZvciByZWNlcHRpb24uCiAJICovCiAJaWYgKGFkYXAtPmZlZWRjb3VudCA9PSBvbm9mZiAmJiBhZGFwLT5mZWVkY291bnQgPiAwKSB7CiAJCWRlYl90cygic3VibWl0dGluZyBhbGwgVVJCc1xuIik7Ci0JCXVzYl91cmJfc3VibWl0KCZhZGFwLT5zdHJlYW0pOworCQl1c2JfdXJiX3N1Ym1pdCgmYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbSk7CiAKIAkJZGViX3RzKCJjb250cm9sbGluZyBwaWQgcGFyc2VyXG4iKTsKLQkJaWYgKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgJiYKLQkJCWFkYXAtPnByb3BzLmNhcHMgJgorCQlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSICYmCisJCQlhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLmNhcHMgJgogCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgJiYKLQkJCWFkYXAtPnByb3BzLnBpZF9maWx0ZXJfY3RybCAhPSBOVUxMKSB7Ci0JCQlyZXQgPSBhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2N0cmwoYWRhcCwKLQkJCQlhZGFwLT5waWRfZmlsdGVyaW5nKTsKKwkJCWFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlcl9jdHJsICE9IE5VTEwpIHsKKwkJCXJldCA9IGFkYXAtPnByb3BzLmZlW2FkYXAtPmFjdGl2ZV9mZV0ucGlkX2ZpbHRlcl9jdHJsKGFkYXAsCisJCQkJYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnBpZF9maWx0ZXJpbmcpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQllcnIoImNvdWxkIG5vdCBoYW5kbGUgcGlkX3BhcnNlciIpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAkJZGViX3RzKCJzdGFydCBmZWVkaW5nXG4iKTsKLQkJaWYgKGFkYXAtPnByb3BzLnN0cmVhbWluZ19jdHJsICE9IE5VTEwpIHsKLQkJCXJldCA9IGFkYXAtPnByb3BzLnN0cmVhbWluZ19jdHJsKGFkYXAsIDEpOworCQlpZiAoYWRhcC0+cHJvcHMuZmVbYWRhcC0+YWN0aXZlX2ZlXS5zdHJlYW1pbmdfY3RybCAhPSBOVUxMKSB7CisJCQlyZXQgPSBhZGFwLT5wcm9wcy5mZVthZGFwLT5hY3RpdmVfZmVdLnN0cmVhbWluZ19jdHJsKGFkYXAsIDEpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQllcnIoImVycm9yIHdoaWxlIGVuYWJsaW5nIGZpZm8uIik7CiAJCQkJcmV0dXJuIHJldDsKQEAgLTkwLDYgKzk2LDcgQEAKIAogaW50IGR2Yl91c2JfYWRhcHRlcl9kdmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBzaG9ydCAqYWRhcHRlcl9udW1zKQogeworCWludCBpOwogCWludCByZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmYWRhcC0+ZHZiX2FkYXAsIGFkYXAtPmRldi0+ZGVzYy0+bmFtZSwKIAkJCQkgICAgICAgYWRhcC0+ZGV2LT5vd25lciwgJmFkYXAtPmRldi0+dWRldi0+ZGV2LAogCQkJCSAgICAgICBhZGFwdGVyX251bXMpOwpAQCAtMTEyLDcgKzExOSwxMiBAQAogCWFkYXAtPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HOwogCWFkYXAtPmRlbXV4LnByaXYgICAgICAgICAgICAgPSBhZGFwOwogCi0JYWRhcC0+ZGVtdXguZmVlZG51bSAgICAgICAgICA9IGFkYXAtPmRlbXV4LmZpbHRlcm51bSA9IGFkYXAtPm1heF9mZWVkX2NvdW50OworCWFkYXAtPmRlbXV4LmZpbHRlcm51bSAgICAgICAgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwLT5wcm9wcy5udW1fZnJvbnRlbmRzOyBpKyspIHsKKwkJaWYgKGFkYXAtPmRlbXV4LmZpbHRlcm51bSA8IGFkYXAtPmZlX2FkYXBbaV0ubWF4X2ZlZWRfY291bnQpCisJCQlhZGFwLT5kZW11eC5maWx0ZXJudW0gPSBhZGFwLT5mZV9hZGFwW2ldLm1heF9mZWVkX2NvdW50OworCX0KKwlhZGFwLT5kZW11eC5mZWVkbnVtICAgICAgICAgID0gYWRhcC0+ZGVtdXguZmlsdGVybnVtOwogCWFkYXAtPmRlbXV4LnN0YXJ0X2ZlZWQgICAgICAgPSBkdmJfdXNiX3N0YXJ0X2ZlZWQ7CiAJYWRhcC0+ZGVtdXguc3RvcF9mZWVkICAgICAgICA9IGR2Yl91c2Jfc3RvcF9mZWVkOwogCWFkYXAtPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwpAQCAtMTU2LDE0ICsxNjgsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkdmJfdXNiX3NldF9hY3RpdmVfZmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKworCWludCByZXQgPSAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfY3RybCkgPworCQlhZGFwLT5wcm9wcy5mcm9udGVuZF9jdHJsKGZlLCBvbm9mZikgOiAwOworCisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmcm9udGVuZF9jdHJsIHJlcXVlc3QgZmFpbGVkIik7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChvbm9mZikKKwkJYWRhcC0+YWN0aXZlX2ZlID0gZmUtPmlkOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHZiX3VzYl9mZV93YWtldXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCA9IGZlLT5kdmItPnByaXY7CiAKIAlkdmJfdXNiX2RldmljZV9wb3dlcl9jdHJsKGFkYXAtPmRldiwgMSk7CiAKLQlpZiAoYWRhcC0+ZmVfaW5pdCkKLQkJYWRhcC0+ZmVfaW5pdChmZSk7CisJZHZiX3VzYl9zZXRfYWN0aXZlX2ZlKGZlLCAxKTsKKworCWlmIChhZGFwLT5mZV9hZGFwW2ZlLT5pZF0uZmVfaW5pdCkKKwkJYWRhcC0+ZmVfYWRhcFtmZS0+aWRdLmZlX2luaXQoZmUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzIsNDUgKzIwMyw4MSBAQAogewogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBmZS0+ZHZiLT5wcml2OwogCi0JaWYgKGFkYXAtPmZlX3NsZWVwKQotCQlhZGFwLT5mZV9zbGVlcChmZSk7CisJaWYgKGFkYXAtPmZlX2FkYXBbZmUtPmlkXS5mZV9zbGVlcCkKKwkJYWRhcC0+ZmVfYWRhcFtmZS0+aWRdLmZlX3NsZWVwKGZlKTsKKworCWR2Yl91c2Jfc2V0X2FjdGl2ZV9mZShmZSwgMCk7CiAKIAlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfcG93ZXJfY3RybChhZGFwLT5kZXYsIDApOwogfQogCiBpbnQgZHZiX3VzYl9hZGFwdGVyX2Zyb250ZW5kX2luaXQoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlpZiAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfYXR0YWNoID09IE5VTEwpIHsKLQkJZXJyKCJzdHJhbmdlOiAnJXMnICMlZCBkb2Vzbid0IHdhbnQgdG8gYXR0YWNoIGEgZnJvbnRlbmQuIixhZGFwLT5kZXYtPmRlc2MtPm5hbWUsIGFkYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWludCByZXQsIGk7CiAKLQkvKiByZS1hc3NpZ24gc2xlZXAgYW5kIHdha2V1cCBmdW5jdGlvbnMgKi8KLQlpZiAoYWRhcC0+cHJvcHMuZnJvbnRlbmRfYXR0YWNoKGFkYXApID09IDAgJiYgYWRhcC0+ZmUgIT0gTlVMTCkgewotCQlhZGFwLT5mZV9pbml0ICA9IGFkYXAtPmZlLT5vcHMuaW5pdDsgIGFkYXAtPmZlLT5vcHMuaW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKLQkJYWRhcC0+ZmVfc2xlZXAgPSBhZGFwLT5mZS0+b3BzLnNsZWVwOyBhZGFwLT5mZS0+b3BzLnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKKwkvKiByZWdpc3RlciBhbGwgZ2l2ZW4gYWRhcHRlciBmcm9udGVuZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+cHJvcHMubnVtX2Zyb250ZW5kczsgaSsrKSB7CiAKLQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmYWRhcC0+ZHZiX2FkYXAsIGFkYXAtPmZlKSkgewotCQkJZXJyKCJGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkLiIpOwotCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZSk7Ci0JCQlhZGFwLT5mZSA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGFkYXAtPnByb3BzLmZlW2ldLmZyb250ZW5kX2F0dGFjaCA9PSBOVUxMKSB7CisJCQllcnIoInN0cmFuZ2U6ICclcycgIyVkLCVkICIKKwkJCSAgICAiZG9lc24ndCB3YW50IHRvIGF0dGFjaCBhIGZyb250ZW5kLiIsCisJCQkgICAgYWRhcC0+ZGV2LT5kZXNjLT5uYW1lLCBhZGFwLT5pZCwgaSk7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJcmV0ID0gYWRhcC0+cHJvcHMuZmVbaV0uZnJvbnRlbmRfYXR0YWNoKGFkYXApOworCQlpZiAocmV0IHx8IGFkYXAtPmZlX2FkYXBbaV0uZmUgPT0gTlVMTCkgeworCQkJLyogb25seSBwcmludCBlcnJvciB3aGVuIHRoZXJlIGlzIG5vIEZFIGF0IGFsbCAqLworCQkJaWYgKGkgPT0gMCkKKwkJCQllcnIoIm5vIGZyb250ZW5kIHdhcyBhdHRhY2hlZCBieSAnJXMnIiwKKwkJCQkJYWRhcC0+ZGV2LT5kZXNjLT5uYW1lKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKworCQlhZGFwLT5mZV9hZGFwW2ldLmZlLT5pZCA9IGk7CisKKwkJLyogcmUtYXNzaWduIHNsZWVwIGFuZCB3YWtldXAgZnVuY3Rpb25zICovCisJCWFkYXAtPmZlX2FkYXBbaV0uZmVfaW5pdCA9IGFkYXAtPmZlX2FkYXBbaV0uZmUtPm9wcy5pbml0OworCQlhZGFwLT5mZV9hZGFwW2ldLmZlLT5vcHMuaW5pdCAgPSBkdmJfdXNiX2ZlX3dha2V1cDsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5mZV9zbGVlcCA9IGFkYXAtPmZlX2FkYXBbaV0uZmUtPm9wcy5zbGVlcDsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5mZS0+b3BzLnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKKworCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZhZGFwLT5kdmJfYWRhcCwgYWRhcC0+ZmVfYWRhcFtpXS5mZSkpIHsKKwkJCWVycigiRnJvbnRlbmQgJWQgcmVnaXN0cmF0aW9uIGZhaWxlZC4iLCBpKTsKKwkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYWRhcC0+ZmVfYWRhcFtpXS5mZSk7CisJCQlhZGFwLT5mZV9hZGFwW2ldLmZlID0gTlVMTDsKKwkJCS8qIEluIGVycm9yIGNhc2UsIGRvIG5vdCB0cnkgcmVnaXN0ZXIgbW9yZSBGRXMsCisJCQkgKiBzdGlsbCBsZWF2aW5nIGFscmVhZHkgcmVnaXN0ZXJlZCBGRXMgYWxpdmUuICovCisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJZWxzZQorCQkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogb25seSBhdHRhY2ggdGhlIHR1bmVyIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCQlpZiAoYWRhcC0+cHJvcHMudHVuZXJfYXR0YWNoICE9IE5VTEwpCi0JCQlhZGFwLT5wcm9wcy50dW5lcl9hdHRhY2goYWRhcCk7Ci0JfSBlbHNlCi0JCWVycigibm8gZnJvbnRlbmQgd2FzIGF0dGFjaGVkIGJ5ICclcyciLGFkYXAtPmRldi0+ZGVzYy0+bmFtZSk7CisJCWlmIChhZGFwLT5wcm9wcy5mZVtpXS50dW5lcl9hdHRhY2ggIT0gTlVMTCkKKwkJCWFkYXAtPnByb3BzLmZlW2ldLnR1bmVyX2F0dGFjaChhZGFwKTsKKworCQlhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkKys7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBkdmJfdXNiX2FkYXB0ZXJfZnJvbnRlbmRfZXhpdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWlmIChhZGFwLT5mZSAhPSBOVUxMKSB7Ci0JCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXAtPmZlKTsKLQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZSk7CisJaW50IGkgPSBhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkIC0gMTsKKworCS8qIHVucmVnaXN0ZXIgYWxsIGdpdmVuIGFkYXB0ZXIgZnJvbnRlbmRzICovCisJZm9yICg7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChhZGFwLT5mZV9hZGFwW2ldLmZlICE9IE5VTEwpIHsKKwkJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXAtPmZlX2FkYXBbaV0uZmUpOworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZV9hZGFwW2ldLmZlKTsKKwkJfQogCX0KKwlhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkID0gMDsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IDJhNzliOGYuLjJkMDhjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgVVNCX1ZJRF9IQVVQUEFVR0UJCQkweDIwNDAKICNkZWZpbmUgVVNCX1ZJRF9IWVBFUl9QQUxURUsJCQkweDEwMjUKICNkZWZpbmUgVVNCX1ZJRF9JTlRFTAkJCQkweDgwODYKKyNkZWZpbmUgVVNCX1ZJRF9JVEVURUNICQkJCTB4MDQ4ZAogI2RlZmluZSBVU0JfVklEX0tXT1JMRAkJCQkweGViMmEKICNkZWZpbmUgVVNCX1ZJRF9LV09STERfMgkJCTB4MWI4MAogI2RlZmluZSBVU0JfVklEX0tZRQkJCQkweDA0NTgKQEAgLTEyNiw2ICsxMjcsNyBAQAogI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX0NPTEQJCQkweDBmYTAKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9XQVJNCQkJMHgwZmExCiAjZGVmaW5lIFVTQl9QSURfSU5URUxfQ0U5NTAwCQkJCTB4OTUwMAorI2RlZmluZSBVU0JfUElEX0lURVRFQ0hfSVQ5MTM1CQkJCTB4OTEzNQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVCQkJCTB4ZTM5OQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF8zOTlVXzIJCQkJMHhlNDAwCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEXzM5NVUJCQkJMHhlMzk2CkBAIC0xMzYsNiArMTM4LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9LV09STERfUEMxNjBfMlQJCQkJMHhjMTYwCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1BDMTYwX1QJCQkJMHhjMTYxCiAjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1VCMzgzX1QJCQkJMHhlMzgzCisjZGVmaW5lIFVTQl9QSURfS1dPUkxEX1VCNDk5XzJUX1QwOQkJCTB4ZTQwOQogI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX0NPTEQJCQkweDE3ZGUKICNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9XQVJNCQkJMHgxN2RmCiAjZGVmaW5lIFVTQl9QSURfVEVSUkFURUNfQ0lORVJHWV9UX1VTQl9YRQkJMHgwMDU1CkBAIC0yNDAsNiArMjQzLDkgQEAKICNkZWZpbmUgVVNCX1BJRF9QQ1RWXzIwMEUJCQkJMHgwMjBlCiAjZGVmaW5lIFVTQl9QSURfUENUVl80MDBFCQkJCTB4MDIwZgogI2RlZmluZSBVU0JfUElEX1BDVFZfNDUwRQkJCQkweDAyMjIKKyNkZWZpbmUgVVNCX1BJRF9QQ1RWXzQ1MkUJCQkJMHgwMjFmCisjZGVmaW5lIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMl8zNjAwCQkweDMwMDcKKyNkZWZpbmUgVVNCX1BJRF9URUNITk9UUkVORF9DT05ORUNUX1MyXzM2NTBfQ0kJCTB4MzAwYQogI2RlZmluZSBVU0JfUElEX05FQlVMQV9ESUdJVFYJCQkJMHgwMjAxCiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdEVAkJCTB4ZDgyMAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHMDY0Rl9DT0xECQkweGQ1MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaW5pdC5jCmluZGV4IDJlM2VhMGYuLjE2OTE5NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYwpAQCAtMjksNyArMjksNyBAQAogc3RhdGljIGludCBkdmJfdXNiX2FkYXB0ZXJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHNob3J0ICphZGFwdGVyX25ycykKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwOwotCWludCByZXQsIG47CisJaW50IHJldCwgbiwgbzsKIAogCWZvciAobiA9IDA7IG4gPCBkLT5wcm9wcy5udW1fYWRhcHRlcnM7IG4rKykgewogCQlhZGFwID0gJmQtPmFkYXB0ZXJbbl07CkBAIC0zOCwzMSArMzgsNDIgQEAKIAogCQltZW1jcHkoJmFkYXAtPnByb3BzLCAmZC0+cHJvcHMuYWRhcHRlcltuXSwgc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcykpOwogCisJZm9yIChvID0gMDsgbyA8IGFkYXAtPnByb3BzLm51bV9mcm9udGVuZHM7IG8rKykgeworCQlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgKnByb3BzID0gJmFkYXAtPnByb3BzLmZlW29dOwogCQkvKiBzcGVlZCAtIHdoZW4gcnVubmluZyBhdCBGVUxMIHNwZWVkIHdlIG5lZWQgYSBIVyBQSUQgZmlsdGVyICovCi0JCWlmIChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiAhKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpKSB7CisJCWlmIChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiAhKHByb3BzLT5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSkgewogCQkJZXJyKCJUaGlzIFVTQjIuMCBkZXZpY2UgY2Fubm90IGJlIHJ1biBvbiBhIFVTQjEuMSBwb3J0LiAoaXQgbGFja3MgYSBoYXJkd2FyZSBQSUQgZmlsdGVyKSIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQlpZiAoKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMICYmIGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpIHx8Ci0JCQkoYWRhcC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcpKSB7Ci0JCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgUElEIGZpbHRlciAodGFibGUgY291bnQ6ICVkKS4iLCBhZGFwLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50KTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMTsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gYWRhcC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudDsKKwkJaWYgKChkLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBwcm9wcy0+Y2FwcyAmIERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUikgfHwKKwkJCShwcm9wcy0+Y2FwcyAmIERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcpKSB7CisJCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgUElEIGZpbHRlciAodGFibGUgY291bnQ6ICVkKS4iLCBwcm9wcy0+cGlkX2ZpbHRlcl9jb3VudCk7CisJCQlhZGFwLT5mZV9hZGFwW29dLnBpZF9maWx0ZXJpbmcgID0gMTsKKwkJCWFkYXAtPmZlX2FkYXBbb10ubWF4X2ZlZWRfY291bnQgPSBwcm9wcy0+cGlkX2ZpbHRlcl9jb3VudDsKIAkJfSBlbHNlIHsKIAkJCWluZm8oIndpbGwgcGFzcyB0aGUgY29tcGxldGUgTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSB0byB0aGUgc29mdHdhcmUgZGVtdXhlci4iKTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMDsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gMjU1OworCQkJYWRhcC0+ZmVfYWRhcFtvXS5waWRfZmlsdGVyaW5nICA9IDA7CisJCQlhZGFwLT5mZV9hZGFwW29dLm1heF9mZWVkX2NvdW50ID0gMjU1OwogCQl9CiAKLQkJaWYgKCFhZGFwLT5waWRfZmlsdGVyaW5nICYmCisJCWlmICghYWRhcC0+ZmVfYWRhcFtvXS5waWRfZmlsdGVyaW5nICYmCiAJCQlkdmJfdXNiX2ZvcmNlX3BpZF9maWx0ZXJfdXNhZ2UgJiYKLQkJCWFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIpIHsKKwkJCXByb3BzLT5jYXBzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSB7CiAJCQlpbmZvKCJwaWQgZmlsdGVyIGVuYWJsZWQgYnkgbW9kdWxlIG9wdGlvbi4iKTsKLQkJCWFkYXAtPnBpZF9maWx0ZXJpbmcgID0gMTsKLQkJCWFkYXAtPm1heF9mZWVkX2NvdW50ID0gYWRhcC0+cHJvcHMucGlkX2ZpbHRlcl9jb3VudDsKKwkJCWFkYXAtPmZlX2FkYXBbb10ucGlkX2ZpbHRlcmluZyAgPSAxOworCQkJYWRhcC0+ZmVfYWRhcFtvXS5tYXhfZmVlZF9jb3VudCA9IHByb3BzLT5waWRfZmlsdGVyX2NvdW50OwogCQl9CiAKKwkJaWYgKHByb3BzLT5zaXplX29mX3ByaXYgPiAwKSB7CisJCQlhZGFwLT5mZV9hZGFwW29dLnByaXYgPSBremFsbG9jKHByb3BzLT5zaXplX29mX3ByaXYsIEdGUF9LRVJORUwpOworCQkJaWYgKGFkYXAtPmZlX2FkYXBbb10ucHJpdiA9PSBOVUxMKSB7CisJCQkJZXJyKCJubyBtZW1vcnkgZm9yIHByaXYgZm9yIGFkYXB0ZXIgJWQgZmUgJWQuIiwgbiwgbyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwl9CisKIAkJaWYgKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiA+IDApIHsKIAkJCWFkYXAtPnByaXYgPSBremFsbG9jKGFkYXAtPnByb3BzLnNpemVfb2ZfcHJpdiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoYWRhcC0+cHJpdiA9PSBOVUxMKSB7CkBAIC03Nyw2ICs4OCwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCisJCS8qIHVzZSBleGNsdXNpdmUgRkUgbG9jayBpZiB0aGVyZSBpcyBtdWx0aXBsZSBzaGFyZWQgRkVzICovCisJCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlKQorCQkJYWRhcC0+ZHZiX2FkYXAubWZlX3NoYXJlZCA9IDE7CisKIAkJZC0+bnVtX2FkYXB0ZXJzX2luaXRpYWxpemVkKys7CiAJCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfRFZCOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYwppbmRleCBiYjQ2YmE2Li41M2E1YzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCkBAIC04MiwxNiArODIsMjggQEAKIAogaW50IGR2Yl91c2JfYWRhcHRlcl9zdHJlYW1faW5pdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPnN0cmVhbS51ZGV2ICAgICAgPSBhZGFwLT5kZXYtPnVkZXY7Ci0JaWYgKGFkYXAtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0FEQVBfUkVDRUlWRVNfMjA0X0JZVEVfVFMpCi0JCWFkYXAtPnN0cmVhbS5jb21wbGV0ZSA9IGR2Yl91c2JfZGF0YV9jb21wbGV0ZV8yMDQ7Ci0JZWxzZQotCWFkYXAtPnN0cmVhbS5jb21wbGV0ZSAgPSBkdmJfdXNiX2RhdGFfY29tcGxldGU7Ci0JYWRhcC0+c3RyZWFtLnVzZXJfcHJpdiA9IGFkYXA7Ci0JcmV0dXJuIHVzYl91cmJfaW5pdCgmYWRhcC0+c3RyZWFtLCAmYWRhcC0+cHJvcHMuc3RyZWFtKTsKKwlpbnQgaSwgcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcC0+cHJvcHMubnVtX2Zyb250ZW5kczsgaSsrKSB7CisKKwkJYWRhcC0+ZmVfYWRhcFtpXS5zdHJlYW0udWRldiAgICAgID0gYWRhcC0+ZGV2LT51ZGV2OworCQlpZiAoYWRhcC0+cHJvcHMuZmVbaV0uY2FwcyAmIERWQl9VU0JfQURBUF9SRUNFSVZFU18yMDRfQllURV9UUykKKwkJCWFkYXAtPmZlX2FkYXBbaV0uc3RyZWFtLmNvbXBsZXRlID0KKwkJCQlkdmJfdXNiX2RhdGFfY29tcGxldGVfMjA0OworCQllbHNlCisJCWFkYXAtPmZlX2FkYXBbaV0uc3RyZWFtLmNvbXBsZXRlICA9IGR2Yl91c2JfZGF0YV9jb21wbGV0ZTsKKwkJYWRhcC0+ZmVfYWRhcFtpXS5zdHJlYW0udXNlcl9wcml2ID0gYWRhcDsKKwkJcmV0ID0gdXNiX3VyYl9pbml0KCZhZGFwLT5mZV9hZGFwW2ldLnN0cmVhbSwKKwkJCQkgICAmYWRhcC0+cHJvcHMuZmVbaV0uc3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGR2Yl91c2JfYWRhcHRlcl9zdHJlYW1fZXhpdChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCXJldHVybiB1c2JfdXJiX2V4aXQoJmFkYXAtPnN0cmVhbSk7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGFkYXAtPnByb3BzLm51bV9mcm9udGVuZHM7IGkrKykKKwkJdXNiX3VyYl9leGl0KCZhZGFwLT5mZV9hZGFwW2ldLnN0cmVhbSk7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDdkMzVkMDcuLjZkN2QxM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC0xMjQsNiArMTI0LDggQEAKICAqIEBjYXBzOiBjYXBhYmlsaXRpZXMgb2YgdGhlIERWQiBVU0IgZGV2aWNlLgogICogQHBpZF9maWx0ZXJfY291bnQ6IG51bWJlciBvZiBQSUQgZmlsdGVyIHBvc2l0aW9uIGluIHRoZSBvcHRpb25hbCBoYXJkd2FyZQogICogIFBJRC1maWx0ZXIuCisgKiBAbnVtX2Zyb250ZW5kczogbnVtYmVyIG9mIGZyb250ZW5kcyBvZiB0aGUgRFZCIFVTQiBhZGFwdGVyLgorICogQGZyb250ZW5kX2N0cmw6IGNhbGxlZCB0byBwb3dlciBvbi9vZmYgYWN0aXZlIGZyb250ZW5kLgogICogQHN0cmVhbWluZ19jdHJsOiBjYWxsZWQgdG8gc3RhcnQgYW5kIHN0b3AgdGhlIE1QRUcyLVRTIHN0cmVhbWluZyBvZiB0aGUKICAqICBkZXZpY2UgKG5vdCBVUkIgc3VibWl0dGluZy9raWxsaW5nKS4KICAqIEBwaWRfZmlsdGVyX2N0cmw6IGNhbGxlZCB0byBlbi9kaXNhYmxlIHRoZSBQSUQgZmlsdGVyLCBpZiBhbnkuCkBAIC0xMzQsNyArMTM2LDcgQEAKICAqICBwbGxfZGVzYyBhbmQgcGxsX2luaXRfYnVmIG9mIHN0cnVjdCBkdmJfdXNiX2RldmljZSkuCiAgKiBAc3RyZWFtOiBjb25maWd1cmF0aW9uIG9mIHRoZSBVU0Igc3RyZWFtaW5nCiAgKi8KLXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcyB7CitzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgewogI2RlZmluZSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGIDB4MDIKICNkZWZpbmUgRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklORyAgICAgICAgICAgMHgwNApAQCAtMTUyLDkgKzE1NCwxOCBAQAogCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW1fcHJvcGVydGllcyBzdHJlYW07CiAKIAlpbnQgc2l6ZV9vZl9wcml2OworfTsKIAorI2RlZmluZSBNQVhfTk9fT0ZfRkVfUEVSX0FEQVAgMgorc3RydWN0IGR2Yl91c2JfYWRhcHRlcl9wcm9wZXJ0aWVzIHsKKwlpbnQgc2l6ZV9vZl9wcml2OworCisJaW50ICgqZnJvbnRlbmRfY3RybCkgICAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBpbnQpOwogCWludCAoKmZlX2lvY3RsX292ZXJyaWRlKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLAogCQkJCSAgdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCk7CisKKwlpbnQgbnVtX2Zyb250ZW5kczsKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyX2ZlX3Byb3BlcnRpZXMgZmVbTUFYX05PX09GX0ZFX1BFUl9BREFQXTsKIH07CiAKIC8qKgpAQCAtMzQ1LDYgKzM1NiwyMCBAQAogICoKICAqIEBzdHJlYW06IHRoZSB1c2IgZGF0YSBzdHJlYW0uCiAgKi8KK3N0cnVjdCBkdmJfdXNiX2ZlX2FkYXB0ZXIgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJaW50ICgqZmVfaW5pdCkgIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKKworCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW0gc3RyZWFtOworCisJaW50IHBpZF9maWx0ZXJpbmc7CisJaW50IG1heF9mZWVkX2NvdW50OworCisJdm9pZCAqcHJpdjsKK307CisKIHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXJfcHJvcGVydGllcyBwcm9wczsKQEAgLTM1NiwyMCArMzgxLDE2IEBACiAJdTggIGlkOwogCiAJaW50IGZlZWRjb3VudDsKLQlpbnQgcGlkX2ZpbHRlcmluZzsKIAogCS8qIGR2YiAqLwogCXN0cnVjdCBkdmJfYWRhcHRlciAgIGR2Yl9hZGFwOwogCXN0cnVjdCBkbXhkZXYgICAgICAgIGRteGRldjsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICAgICBkZW11eDsKIAlzdHJ1Y3QgZHZiX25ldCAgICAgICBkdmJfbmV0OwotCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOwotCWludCAgICAgICAgICAgICAgICAgIG1heF9mZWVkX2NvdW50OwogCi0JaW50ICgqZmVfaW5pdCkgIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOwotCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKLQotCXN0cnVjdCB1c2JfZGF0YV9zdHJlYW0gc3RyZWFtOworCXN0cnVjdCBkdmJfdXNiX2ZlX2FkYXB0ZXIgZmVfYWRhcFtNQVhfTk9fT0ZfRkVfUEVSX0FEQVBdOworCWludCBhY3RpdmVfZmU7CisJaW50IG51bV9mcm9udGVuZHNfaW5pdGlhbGl6ZWQ7CiAKIAl2b2lkICpwcml2OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R3MjEwMi5jCmluZGV4IDA1OGIyMzEuLmYxMDNlYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHcyMTAyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdzIxMDIuYwpAQCAtOTkyLDE4ICs5OTIsMTggQEAKIAlzdHJ1Y3QgZHZiX3R1bmVyX29wcyAqdHVuZXJfb3BzID0gTlVMTDsKIAogCWlmIChkZW1vZF9wcm9iZSAmIDQpIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmZHcyMTA0YV9zdHYwOTAwX2NvbmZpZywKKwkJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkwMF9hdHRhY2gsICZkdzIxMDRhX3N0djA5MDBfY29uZmlnLAogCQkJCSZkLT5kZXYtPmkyY19hZGFwLCAwKTsKLQkJaWYgKGQtPmZlICE9IE5VTEwpIHsKLQkJCWlmIChkdmJfYXR0YWNoKHN0YjYxMDBfYXR0YWNoLCBkLT5mZSwKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJaWYgKGR2Yl9hdHRhY2goc3RiNjEwMF9hdHRhY2gsIGQtPmZlX2FkYXBbMF0uZmUsCiAJCQkJCSZkdzIxMDRhX3N0YjYxMDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpIHsKLQkJCQl0dW5lcl9vcHMgPSAmZC0+ZmUtPm9wcy50dW5lcl9vcHM7CisJCQkJdHVuZXJfb3BzID0gJmQtPmZlX2FkYXBbMF0uZmUtPm9wcy50dW5lcl9vcHM7CiAJCQkJdHVuZXJfb3BzLT5zZXRfZnJlcXVlbmN5ID0gc3RiNjEwMF9zZXRfZnJlcTsKIAkJCQl0dW5lcl9vcHMtPmdldF9mcmVxdWVuY3kgPSBzdGI2MTAwX2dldF9mcmVxOwogCQkJCXR1bmVyX29wcy0+c2V0X2JhbmR3aWR0aCA9IHN0YjYxMDBfc2V0X2JhbmR3OwogCQkJCXR1bmVyX29wcy0+Z2V0X2JhbmR3aWR0aCA9IHN0YjYxMDBfZ2V0X2JhbmR3OwotCQkJCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CisJCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJCWluZm8oIkF0dGFjaGVkIFNUVjA5MDArU1RCNjEwMCFcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMTAxMSwxMyArMTAxMSwxMyBAQAogCX0KIAogCWlmIChkZW1vZF9wcm9iZSAmIDIpIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmZHcyMTA0X3N0djA5MDBfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwOTAwX2F0dGFjaCwgJmR3MjEwNF9zdHYwOTAwX2NvbmZpZywKIAkJCQkmZC0+ZGV2LT5pMmNfYWRhcCwgMCk7Ci0JCWlmIChkLT5mZSAhPSBOVUxMKSB7Ci0JCQlpZiAoZHZiX2F0dGFjaChzdHY2MTEwX2F0dGFjaCwgZC0+ZmUsCisJCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJCWlmIChkdmJfYXR0YWNoKHN0djYxMTBfYXR0YWNoLCBkLT5mZV9hZGFwWzBdLmZlLAogCQkJCQkmZHcyMTA0X3N0djYxMTBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpIHsKLQkJCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQkJCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKIAkJCQlpbmZvKCJBdHRhY2hlZCBTVFYwOTAwK1NUVjYxMTBBIVxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xMDI1LDE5ICsxMDI1LDE5IEBACiAJfQogCiAJaWYgKGRlbW9kX3Byb2JlICYgMSkgewotCQlkLT5mZSA9IGR2Yl9hdHRhY2goY3gyNDExNl9hdHRhY2gsICZkdzIxMDRfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChjeDI0MTE2X2F0dGFjaCwgJmR3MjEwNF9jb25maWcsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgY3gyNDExNiFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQlkLT5mZSA9IGR2Yl9hdHRhY2goZHMzMDAwX2F0dGFjaCwgJmR3MjEwNF9kczMwMDBfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGRzMzAwMF9hdHRhY2gsICZkdzIxMDRfZHMzMDAwX2NvbmZpZywKIAkJCSZkLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQlpbmZvKCJBdHRhY2hlZCBEUzMwMDAhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTA1MywyMiArMTA1MywyMiBAQAogewogCWlmIChkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9PSAmZHcyMTAyX3Nlcml0X2kyY19hbGdvKSB7CiAJCS8qZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+dHVuZXJfYXR0YWNoID0gTlVMTDsqLwotCQlkLT5mZSA9IGR2Yl9hdHRhY2goc2kyMXh4X2F0dGFjaCwgJnNlcml0X3NwMTUxMWxoYl9jb25maWcsCisJCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHNpMjF4eF9hdHRhY2gsICZzZXJpdF9zcDE1MTFsaGJfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkLT5mZSAhPSBOVUxMKSB7Ci0JCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQlpZiAoZC0+ZmVfYWRhcFswXS5mZSAhPSBOVUxMKSB7CisJCQlkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CiAJCQlpbmZvKCJBdHRhY2hlZCBzaTIxeHghXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfZWFyZGFfaTJjX2FsZ28pIHsKLQkJZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djAyODhfYXR0YWNoLCAmZWFyZGFfY29uZmlnLAorCQlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjg4X2F0dGFjaCwgJmVhcmRhX2NvbmZpZywKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJaWYgKGR2Yl9hdHRhY2goc3RiNjAwMF9hdHRhY2gsIGQtPmZlLCAweDYxLAorCQlpZiAoZC0+ZmVfYWRhcFswXS5mZSAhPSBOVUxMKSB7CisJCQlpZiAoZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgZC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApKSB7Ci0JCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJCQlkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CiAJCQkJaW5mbygiQXR0YWNoZWQgc3R2MDI4OCFcbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMTA3NywxMCArMTA3NywxMCBAQAogCiAJaWYgKGR3MjEwMl9wcm9wZXJ0aWVzLmkyY19hbGdvID09ICZkdzIxMDJfaTJjX2FsZ28pIHsKIAkJLypkdzIxMDJfcHJvcGVydGllcy5hZGFwdGVyLT50dW5lcl9hdHRhY2ggPSBkdzIxMDJfdHVuZXJfYXR0YWNoOyovCi0JCWQtPmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0YV9jb25maWcsCisJCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djAyOTlfYXR0YWNoLCAmc2hhcnBfejAxOTRhX2NvbmZpZywKIAkJCQkJJmQtPmRldi0+aTJjX2FkYXApOwotCQlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKKwkJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgeworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgc3R2MDI5OSFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEwOTAsOSArMTA5MCw5IEBACiAKIHN0YXRpYyBpbnQgZHczMTAxX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICpkKQogewotCWQtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsICZkdzMxMDFfdGRhMTAwMjNfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwgJmR3MzEwMV90ZGExMDAyM19jb25maWcsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXAsIDB4NDgpOwotCWlmIChkLT5mZSAhPSBOVUxMKSB7CisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgIT0gTlVMTCkgewogCQlpbmZvKCJBdHRhY2hlZCB0ZGExMDAyMyFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTAxLDEyICsxMTAxLDEyIEBACiAKIHN0YXRpYyBpbnQgemwxMDAzMTNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmQpCiB7Ci0JZC0+ZmUgPSBkdmJfYXR0YWNoKG10MzEyX2F0dGFjaCwgJnpsMzEzX2NvbmZpZywKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDMxMl9hdHRhY2gsICZ6bDMxM19jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGQtPmZlICE9IE5VTEwpIHsKLQkJaWYgKGR2Yl9hdHRhY2goemwxMDAzOV9hdHRhY2gsIGQtPmZlLCAweDYwLAorCWlmIChkLT5mZV9hZGFwWzBdLmZlICE9IE5VTEwpIHsKKwkJaWYgKGR2Yl9hdHRhY2goemwxMDAzOV9hdHRhY2gsIGQtPmZlX2FkYXBbMF0uZmUsIDB4NjAsCiAJCQkJJmQtPmRldi0+aTJjX2FkYXApKSB7Ci0JCQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCQkJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCQkJaW5mbygiQXR0YWNoZWQgemwxMDAzMTMremwxMDAzOSFcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTExMTksMTYgKzExMTksMTYgQEAKIHsKIAl1OCBvYnVmW10gPSB7NywgMX07CiAKLQlkLT5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZlYXJkYV9jb25maWcsCisJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZlYXJkYV9jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoZC0+ZmUgPT0gTlVMTCkKKwlpZiAoZC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChOVUxMID09IGR2Yl9hdHRhY2goc3RiNjAwMF9hdHRhY2gsIGQtPmZlLCAweDYxLCAmZC0+ZGV2LT5pMmNfYWRhcCkpCisJaWYgKE5VTEwgPT0gZHZiX2F0dGFjaChzdGI2MDAwX2F0dGFjaCwgZC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmQtPmRldi0+aTJjX2FkYXApKQogCQlyZXR1cm4gLUVJTzsKIAotCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkdzIxMHhfc2V0X3ZvbHRhZ2U7CisJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOwogCiAJZHcyMTB4X29wX3J3KGQtPmRldi0+dWRldiwgMHg4YSwgMCwgMCwgb2J1ZiwgMiwgRFcyMTBYX1dSSVRFX01TRyk7CiAKQEAgLTExNDMsMTQgKzExNDMsMTQgQEAKIAlzdHJ1Y3QgczZ4MF9zdGF0ZSAqc3QgPSAoc3RydWN0IHM2eDBfc3RhdGUgKilkLT5kZXYtPnByaXY7CiAJdTggb2J1ZltdID0gezcsIDF9OwogCi0JZC0+ZmUgPSBkdmJfYXR0YWNoKGRzMzAwMF9hdHRhY2gsICZkdzIxMDRfZHMzMDAwX2NvbmZpZywKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChkczMwMDBfYXR0YWNoLCAmZHcyMTA0X2RzMzAwMF9jb25maWcsCiAJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoZC0+ZmUgPT0gTlVMTCkKKwlpZiAoZC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAotCXN0LT5vbGRfc2V0X3ZvbHRhZ2UgPSBkLT5mZS0+b3BzLnNldF92b2x0YWdlOwotCWQtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBzNjYwX3NldF92b2x0YWdlOworCXN0LT5vbGRfc2V0X3ZvbHRhZ2UgPSBkLT5mZV9hZGFwWzBdLmZlLT5vcHMuc2V0X3ZvbHRhZ2U7CisJZC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gczY2MF9zZXRfdm9sdGFnZTsKIAogCWR3MjEweF9vcF9ydyhkLT5kZXYtPnVkZXYsIDB4OGEsIDAsIDAsIG9idWYsIDIsIERXMjEwWF9XUklURV9NU0cpOwogCkBAIC0xMTYzLDEyICsxMTYzLDEyIEBACiB7CiAJdTggb2J1ZltdID0gezcsIDF9OwogCi0JZC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmcHJvZl83NTAwX3N0djA5MDBfY29uZmlnLAorCWQtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djA5MDBfYXR0YWNoLCAmcHJvZl83NTAwX3N0djA5MDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCwgMCk7Ci0JaWYgKGQtPmZlID09IE5VTEwpCisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKLQlkLT5mZS0+b3BzLnNldF92b2x0YWdlID0gZHcyMTB4X3NldF92b2x0YWdlOworCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IGR3MjEweF9zZXRfdm9sdGFnZTsKIAogCWR3MjEweF9vcF9ydyhkLT5kZXYtPnVkZXYsIDB4OGEsIDAsIDAsIG9idWYsIDIsIERXMjEwWF9XUklURV9NU0cpOwogCkBAIC0xMjA0LDkgKzEyMDQsOSBAQAogCWlmIChkdmJfdXNiX2dlbmVyaWNfcncoZC0+ZGV2LCBvYnVmLCAxLCBpYnVmLCAxLCAwKSA8IDApCiAJCWVycigiY29tbWFuZCAweDUxIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAotCWQtPmZlID0gZHZiX2F0dGFjaChkczMwMDBfYXR0YWNoLCAmc3UzMDAwX2RzMzAwMF9jb25maWcsCisJZC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goZHMzMDAwX2F0dGFjaCwgJnN1MzAwMF9kczMwMDBfY29uZmlnLAogCQkJCQkmZC0+ZGV2LT5pMmNfYWRhcCk7Ci0JaWYgKGQtPmZlID09IE5VTEwpCisJaWYgKGQtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpbmZvKCJBdHRhY2hlZCBEUzMwMDAhXG4iKTsKQEAgLTEyMTYsMTQgKzEyMTYsMTQgQEAKIAogc3RhdGljIGludCBkdzIxMDJfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfT1BFUkExKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkdzMxMDFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsCisJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfVFVBNjAzNCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MzUsNyArMTUzNSw3IEBACiAJCQkJCURXMjEwWF9SRUFEX01TRyk7CiAJCQlpZiAoKHJlc2V0MTZbMF0gPT0gMHhhMSkgfHwgKHJlc2V0MTZbMF0gPT0gMHg4MCkpIHsKIAkJCQlkdzIxMDJfcHJvcGVydGllcy5pMmNfYWxnbyA9ICZkdzIxMDJfaTJjX2FsZ287Ci0JCQkJZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+dHVuZXJfYXR0YWNoID0gJmR3MjEwMl90dW5lcl9hdHRhY2g7CisJCQkJZHcyMTAyX3Byb3BlcnRpZXMuYWRhcHRlci0+ZmVbMF0udHVuZXJfYXR0YWNoID0gJmR3MjEwMl90dW5lcl9hdHRhY2g7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgewogCQkJCS8qIGNoZWNrIFNUVjAyODggZnJvbnRlbmQgICovCkBAIC0xNTkxLDYgKzE1OTEsOCBAQAogCS5yZWFkX21hY19hZGRyZXNzID0gZHcyMTB4X3JlYWRfbWFjX2FkZHJlc3MsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCA9IGR3MjEwMl9mcm9udGVuZF9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCkBAIC0xNjAyLDYgKzE2MDQsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMywKQEAgLTE2NDIsNiArMTY0NSw4IEBACiAJLnJlYWRfbWFjX2FkZHJlc3MgPSBkdzIxMHhfcmVhZF9tYWNfYWRkcmVzcywKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoID0gZHcyMTA0X2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKQEAgLTE2NTMsNiArMTY1OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAyLApAQCAtMTY4OSw2ICsxNjk1LDggQEAKIAkucmVhZF9tYWNfYWRkcmVzcyA9IGR3MjEweF9yZWFkX21hY19hZGRyZXNzLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggPSBkdzMxMDFfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCA9IGR3MzEwMV90dW5lcl9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewpAQCAtMTcwMSw2ICsxNzA5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIAkubnVtX2RldmljZV9kZXNjcyA9IDEsCkBAIC0xNzMzLDYgKzE3NDIsOCBAQAogCS5yZWFkX21hY19hZGRyZXNzID0gczZ4MF9yZWFkX21hY19hZGRyZXNzLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5mcm9udGVuZF9hdHRhY2ggPSB6bDEwMDMxM19mcm9udGVuZF9hdHRhY2gsCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCkBAIC0xNzQ0LDYgKzE3NTUsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKQEAgLTE4MTAsNiArMTgyMiw4IEBACiAKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IHN1MzAwMF9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gc3UzMDAwX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW0gPSB7CkBAIC0xODIyLDYgKzE4MzYsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAzLApAQCAtMTg1NSw3ICsxODcwLDcgQEAKIAlwMTEwMC0+ZGV2aWNlc1swXSA9IGQxMTAwOwogCXAxMTAwLT5yYy5sZWdhY3kucmNfbWFwX3RhYmxlID0gcmNfbWFwX3Ric190YWJsZTsKIAlwMTEwMC0+cmMubGVnYWN5LnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKTsKLQlwMTEwMC0+YWRhcHRlci0+ZnJvbnRlbmRfYXR0YWNoID0gc3R2MDI4OF9mcm9udGVuZF9hdHRhY2g7CisJcDExMDAtPmFkYXB0ZXItPmZlWzBdLmZyb250ZW5kX2F0dGFjaCA9IHN0djAyODhfZnJvbnRlbmRfYXR0YWNoOwogCiAJczY2MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzNjYwKSB7CkBAIC0xODY5LDcgKzE4ODQsNyBAQAogCXM2NjAtPmRldmljZXNbMF0gPSBkNjYwOwogCXM2NjAtPmRldmljZXNbMV0gPSBkNDgwXzE7CiAJczY2MC0+ZGV2aWNlc1syXSA9IGQ0ODBfMjsKLQlzNjYwLT5hZGFwdGVyLT5mcm9udGVuZF9hdHRhY2ggPSBkczMwMDBfZnJvbnRlbmRfYXR0YWNoOworCXM2NjAtPmFkYXB0ZXItPmZlWzBdLmZyb250ZW5kX2F0dGFjaCA9IGRzMzAwMF9mcm9udGVuZF9hdHRhY2g7CiAKIAlwNzUwMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwNzUwMCkgewpAQCAtMTg4Myw3ICsxODk4LDcgQEAKIAlwNzUwMC0+ZGV2aWNlc1swXSA9IGQ3NTAwOwogCXA3NTAwLT5yYy5sZWdhY3kucmNfbWFwX3RhYmxlID0gcmNfbWFwX3Ric190YWJsZTsKIAlwNzUwMC0+cmMubGVnYWN5LnJjX21hcF9zaXplID0gQVJSQVlfU0laRShyY19tYXBfdGJzX3RhYmxlKTsKLQlwNzUwMC0+YWRhcHRlci0+ZnJvbnRlbmRfYXR0YWNoID0gcHJvZl83NTAwX2Zyb250ZW5kX2F0dGFjaDsKKwlwNzUwMC0+YWRhcHRlci0+ZmVbMF0uZnJvbnRlbmRfYXR0YWNoID0gcHJvZl83NTAwX2Zyb250ZW5kX2F0dGFjaDsKIAogCWlmICgwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmR3MjEwMl9wcm9wZXJ0aWVzLAogCQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2VjMTY4LmMKaW5kZXggMWJhM2U1ZC4uNzg0NDJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9lYzE2OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZWMxNjguYwpAQCAtMjAwLDkgKzIwMCw5IEBACiBzdGF0aWMgaW50IGVjMTY4X2VjMTAwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZWMxMDBfYXR0YWNoLCAmZWMxNjhfZWMxMDBfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGVjMTAwX2F0dGFjaCwgJmVjMTY4X2VjMTAwX2NvbmZpZywKIAkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwotCWlmIChhZGFwLT5mZSA9PSBOVUxMKQorCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC0yMjgsNyArMjI4LDcgQEAKIHN0YXRpYyBpbnQgZWMxNjhfbXhsNTAwM3NfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAorCXJldHVybiBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCSZlYzE2OF9teGw1MDAzc19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIApAQCAtMzgyLDYgKzM4Miw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBlYzE2OF9zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZWMxNjhfZWMxMDBfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBlYzE2OF9teGw1MDAzc190dW5lcl9hdHRhY2gsCkBAIC0zOTUsNiArMzk3LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQl9CiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9mcmlpby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9mcmlpby5jCmluZGV4IDc2MTU5YWUuLmIwOTJkYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZnJpaW8uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2ZyaWlvLmMKQEAgLTQwMyw4ICs0MDMsOCBAQAogCWlmIChmcmlpb19pbml0aWFsaXplKGFkYXAtPmRldikgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWFkYXAtPmZlID0gamR2YnQ5MDUwMl9hdHRhY2goYWRhcC0+ZGV2KTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gamR2YnQ5MDUwMl9hdHRhY2goYWRhcC0+ZGV2KTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtNDczLDYgKzQ3Myw4IEBACiAJCS8qIGNhcHM6MCA9PiAgbm8gcGlkIGZpbHRlciwgMTg4QiBUUyBwYWNrZXQgKi8KIAkJLyogR0w4NjEgaGFzIGEgSFcgcGlkIGZpbHRlciwgYnV0IG5vIGluZm8gYXZhaWxhYmxlLiAqLwogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5jYXBzICA9IDAsCiAKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZnJpaW9fZnJvbnRlbmRfYXR0YWNoLApAQCAtNDkwLDYgKzQ5Miw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLmkyY19hbGdvID0gJmdsODYxX2kyY19hbGdvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jCmluZGV4IDZmNTk2ZWQuLjYzNjgxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ2w4NjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dsODYxLmMKQEAgLTEwMyw5ICsxMDMsOSBAQAogc3RhdGljIGludCBnbDg2MV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmdsODYxX3psMTAzNTNfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmZ2w4NjFfemwxMDM1M19jb25maWcsCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUgPT0gTlVMTCkKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtMTE4LDcgKzExOCw3IEBACiBzdGF0aWMgaW50IGdsODYxX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCXJldHVybiBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsCi0JCQkgIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCSAgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkgICZnbDg2MV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKQEAgLTE2Nyw2ICsxNjcsOCBAQAogCiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7eworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAKIAkJLmZyb250ZW5kX2F0dGFjaCAgPSBnbDg2MV9mcm9udGVuZF9hdHRhY2gsCiAJCS50dW5lcl9hdHRhY2ggICAgID0gZ2w4NjFfdHVuZXJfYXR0YWNoLApAQCAtMTgxLDYgKzE4Myw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9IH0sCiAJLmkyY19hbGdvICAgICAgICAgPSAmZ2w4NjFfaTJjX2FsZ28sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCmluZGV4IDYwZDExZTUuLjU0MjYyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2stZmUuYwpAQCAtMTQ0LDE5ICsxNDQsMjUgQEAKIAljbWRbNl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOwogCWNtZFs3XSA9IChmcmVxID4+IDI0KSAmIDB4ZmY7CiAKKwkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogRFZCLVMgKyA4LVBTSyB3ZXJlIHVzZWQgZm9yIFR1cmJvLUZFQyAqLworCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlMgJiYgYy0+bW9kdWxhdGlvbiA9PSBQU0tfOCkKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gU1lTX1RVUkJPOworCiAJc3dpdGNoIChjLT5kZWxpdmVyeV9zeXN0ZW0pIHsKIAljYXNlIFNZU19EVkJTOgotCQkvKiBBbGxvdyBRUFNLIGFuZCA4UFNLIChldmVuIGZvciBEVkItUykgKi8KLQkJaWYgKGMtPm1vZHVsYXRpb24gIT0gUVBTSyAmJiBjLT5tb2R1bGF0aW9uICE9IFBTS184KSB7CisJCWlmIChjLT5tb2R1bGF0aW9uICE9IFFQU0spIHsKIAkJCWRlYl9mZSgiJXM6IHVuc3VwcG9ydGVkIG1vZHVsYXRpb24gc2VsZWN0ZWQgKCVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgYy0+bW9kdWxhdGlvbik7CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KIAkJYy0+ZmVjX2lubmVyID0gRkVDX0FVVE87CiAJCWJyZWFrOwotCWNhc2UgU1lTX0RWQlMyOgorCWNhc2UgU1lTX0RWQlMyOiAvKiBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogCQlkZWJfZmUoIiVzOiBEVkItUzIgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOworCWNhc2UgU1lTX1RVUkJPOgorCQlkZWJfZmUoIiVzOiBUdXJiby1GRUMgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJZGViX2ZlKCIlczogdW5zdXBwb3J0ZWQgZGVsaXZlcnkgc3lzdGVtIHNlbGVjdGVkICglZClcbiIsCkBAIC0xODksNyArMTk1LDEwIEBACiAJCWRlZmF1bHQ6CiAJCQljbWRbOV0gPSA1OyBicmVhazsKIAkJfQotCQljbWRbOF0gPSBBRFZfTU9EX0RWQl9RUFNLOworCQlpZiAoYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19UVVJCTykKKwkJCWNtZFs4XSA9IEFEVl9NT0RfVFVSQk9fUVBTSzsKKwkJZWxzZQorCQkJY21kWzhdID0gQURWX01PRF9EVkJfUVBTSzsKIAkJYnJlYWs7CiAJY2FzZSBQU0tfODogLyogUFNLXzggaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBETiAqLwogCQljbWRbOF0gPSBBRFZfTU9EX1RVUkJPXzhQU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwppbmRleCAxY2IzZDlhLi41ZjcxMjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiBzdGF0aWMgaW50IGdwOHBza19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5mZSA9IGdwOHBza19mZV9hdHRhY2goYWRhcC0+ZGV2KTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZ3A4cHNrX2ZlX2F0dGFjaChhZGFwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjgsNiArMjY4LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGdwOHBza19zdHJlYW1pbmdfY3RybCwKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KQEAgLTI4MSw2ICsyODMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gZ3A4cHNrX3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2l0OTEzeC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9pdDkxM3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyMjYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9pdDkxM3guYwpAQCAtMCwwICsxLDcwMiBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgbGludXggZHJpdmVyIGZvciBJVDkxMzcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWFsY29sbSBQcmllc3RsZXkgKHR2Ym94c3B5QGdtYWlsLmNvbSkKKyAqIElUOTEzNyAoQykgSVRFIFRlY2ggSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvaXQ5MTM3LnR4dCBmb3IgZmlybXdhcmUgaW5mb3JtYXRpb24KKyAqCisgKi8KKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJpdDkxM3giCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisKKyNpbmNsdWRlICJkdmItdXNiLmgiCisjaW5jbHVkZSAiaXQ5MTN4LWZlLmgiCisKKy8qIGRlYnVnICovCitzdGF0aWMgaW50IGR2Yl91c2JfaXQ5MTN4X2RlYnVnOworI2RlZmluZSBsX2RwcmludGsodmFyLCBsZXZlbCwgYXJncy4uLikgZG8geyBcCisJaWYgKCh2YXIgPj0gbGV2ZWwpKSBcCisJCXByaW50ayhLRVJOX0RFQlVHIERWQl9VU0JfTE9HX1BSRUZJWCAiOiAiIGFyZ3MpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGRlYl9pbmZvKGxldmVsLCBhcmdzLi4uKSBsX2RwcmludGsoZHZiX3VzYl9pdDkxM3hfZGVidWcsIGxldmVsLCBhcmdzKQorI2RlZmluZSBkZWJ1Z19kYXRhX3NuaXBldChsZXZlbCwgbmFtZSwgcCkgXAorCSBkZWJfaW5mbyhsZXZlbCwgbmFtZSIgKCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4KSIsIFwKKwkJKnAsICoocCsxKSwgKihwKzIpLCAqKHArMyksICoocCs0KSwgXAorCQkJKihwKzUpLCAqKHArNiksICoocCs3KSk7CisKKworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX2l0OTEzeF9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gKG9yLWFibGUpKS4iCisJCQlEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK3N0YXRpYyBpbnQgcGlkX2ZpbHRlcjsKK21vZHVsZV9wYXJhbV9uYW1lZChwaWQsIHBpZF9maWx0ZXIsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpZCwgInNldCBkZWZhdWx0IDA9b24gMT1vZmYiKTsKKworaW50IGNtZF9jb3VudGVyOworCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKworc3RydWN0IGl0OTEzeF9zdGF0ZSB7CisJdTggaWQ7Cit9OworCitzdHJ1Y3QgaXRlX2NvbmZpZyB7CisJdTggY2hpcF92ZXI7CisJdTE2IGNoaXBfdHlwZTsKKwl1MzIgZmlybXdhcmU7CisJdTggdHVuZXJfaWRfMDsKKwl1OCB0dW5lcl9pZF8xOworCXU4IGR1YWxfbW9kZTsKK307CisKK3N0cnVjdCBpdGVfY29uZmlnIGl0OTEzeF9jb25maWc7CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2J1bGtfd3JpdGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJCQl1OCAqc25kLCBpbnQgbGVuLCB1OCBwaXBlKQoreworCWludCByZXQsIGFjdHVhbF9sOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGRldiwgdXNiX3NuZGJ1bGtwaXBlKGRldiwgcGlwZSksCisJCQkJc25kLCBsZW4gLCAmYWN0dWFsX2wsIDEwMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfYnVsa19yZWFkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCQkJdTggKnJldiwgaW50IGxlbiwgdTggcGlwZSkKK3sKKwlpbnQgcmV0LCBhY3R1YWxfbDsKKworCXJldCA9IHVzYl9idWxrX21zZyhkZXYsIHVzYl9yY3ZidWxrcGlwZShkZXYsIHBpcGUpLAorCQkJCSByZXYsIGxlbiAsICZhY3R1YWxfbCwgMjAwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGNoZWNrX3N1bSh1OCAqcCwgdTggbGVuKQoreworCXUxNiBzdW0gPSAwOworCXU4IGkgPSAxOworCXdoaWxlIChpIDwgbGVuKQorCQlzdW0gKz0gKGkrKyAmIDEpID8gKCpwKyspIDw8IDggOiAqcCsrOworCXJldHVybiB+c3VtOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9pbyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggbW9kZSwgdTggcHJvLAorCQkJdTggY21kLCB1MzIgcmVnLCB1OCBhZGRyLCB1OCAqZGF0YSwgdTggbGVuKQoreworCWludCByZXQgPSAwLCBpLCBidWZfc2l6ZSA9IDE7CisJdTggKmJ1ZmY7CisJdTggcmxlbjsKKwl1MTYgY2hrX3N1bTsKKworCWJ1ZmYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKSB7CisJCWluZm8oIlVTQiBCdWZmZXIgRmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJ1ZmZbYnVmX3NpemUrK10gPSBwcm87CisJYnVmZltidWZfc2l6ZSsrXSA9IGNtZDsKKwlidWZmW2J1Zl9zaXplKytdID0gY21kX2NvdW50ZXI7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFQURfTE9ORzoKKwljYXNlIFdSSVRFX0xPTkc6CisJCWJ1ZmZbYnVmX3NpemUrK10gPSBsZW47CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAyOworCQlidWZmW2J1Zl9zaXplKytdID0gKHJlZyA+PiAyNCk7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDE2KSAmIDB4ZmY7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDgpICYgMHhmZjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IHJlZyAmIDB4ZmY7CisJYnJlYWs7CisJY2FzZSBSRUFEX1NIT1JUOgorCQlidWZmW2J1Zl9zaXplKytdID0gYWRkcjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9TSE9SVDoKKwkJYnVmZltidWZfc2l6ZSsrXSA9IGxlbjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IGFkZHI7CisJCWJ1ZmZbYnVmX3NpemUrK10gPSAocmVnID4+IDgpICYgMHhmZjsKKwkJYnVmZltidWZfc2l6ZSsrXSA9IHJlZyAmIDB4ZmY7CisJYnJlYWs7CisJY2FzZSBSRUFEX0RBVEE6CisJY2FzZSBXUklURV9EQVRBOgorCQlicmVhazsKKwljYXNlIFdSSVRFX0NNRDoKKwkJbW9kZSA9IDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWtmcmVlKGJ1ZmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobW9kZSAmIDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxlbiA7IGkrKykKKwkJCWJ1ZmZbYnVmX3NpemUrK10gPSBkYXRhW2ldOworCX0KKwljaGtfc3VtID0gY2hlY2tfc3VtKCZidWZmWzFdLCBidWZfc2l6ZSk7CisKKwlidWZmW2J1Zl9zaXplKytdID0gY2hrX3N1bSA+PiA4OworCWJ1ZmZbMF0gPSBidWZfc2l6ZTsKKwlidWZmW2J1Zl9zaXplKytdID0gKGNoa19zdW0gJiAweGZmKTsKKworCXJldCA9IGl0OTEzeF9idWxrX3dyaXRlKHVkZXYsIGJ1ZmYsIGJ1Zl9zaXplICwgMHgwMik7CisKKwlyZXQgfD0gaXQ5MTN4X2J1bGtfcmVhZCh1ZGV2LCBidWZmLCAobW9kZSAmIDEpID8KKwkJCTUgOiBsZW4gKyA1ICwgMHgwMSk7CisKKwlybGVuID0gKG1vZGUgJiAweDEpID8gMHgxIDogbGVuOworCisJaWYgKG1vZGUgJiAxKQorCQlyZXQgfD0gYnVmZlsyXTsKKwllbHNlCisJCW1lbWNweShkYXRhLCAmYnVmZlszXSwgcmxlbik7CisKKwljbWRfY291bnRlcisrOworCisJa2ZyZWUoYnVmZik7CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3dyX3JlZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggcHJvLCB1MzIgcmVnICwgdTggZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJbMV07CisJYlswXSA9IGRhdGE7CisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFdSSVRFX0xPTkcsIHBybywKKwkJCUNNRF9ERU1PRF9XUklURSwgcmVnLCAwLCBiLCBzaXplb2YoYikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfcmVhZF9yZWcoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHUzMiByZWcpCit7CisJaW50IHJldDsKKwl1OCBkYXRhWzFdOworCisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfTE9ORywgREVWXzAsCisJCQlDTURfREVNT0RfUkVBRCwgcmVnLCAwLCAmZGF0YVswXSwgMSk7CisKKwlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogZGF0YVswXTsKK30KKworc3RhdGljIHUzMiBpdDkxM3hfcXVlcnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IHBybykKK3sKKwlpbnQgcmV0OworCXU4IGRhdGFbNF07CisJcmV0ID0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfTE9ORywgcHJvLCBDTURfREVNT0RfUkVBRCwKKwkJMHgxMjIyLCAwLCAmZGF0YVswXSwgMyk7CisKKwlpdDkxM3hfY29uZmlnLmNoaXBfdmVyID0gZGF0YVswXTsKKwlpdDkxM3hfY29uZmlnLmNoaXBfdHlwZSA9ICh1MTYpKGRhdGFbMl0gPDwgOCkgKyBkYXRhWzFdOworCisJaW5mbygiQ2hpcCBWZXJzaW9uPSUwMnggQ2hpcCBUeXBlPSUwNHgiLCBpdDkxM3hfY29uZmlnLmNoaXBfdmVyLAorCQlpdDkxM3hfY29uZmlnLmNoaXBfdHlwZSk7CisKKwlyZXQgfD0gaXQ5MTN4X2lvKHVkZXYsIFJFQURfU0hPUlQsIHBybywKKwkJCUNNRF9RVUVSWUlORk8sIDAsIDB4MSwgJmRhdGFbMF0sIDQpOworCisJaXQ5MTN4X2NvbmZpZy5maXJtd2FyZSA9IChkYXRhWzBdIDw8IDI0KSArIChkYXRhWzFdIDw8IDE2KSArCisJCQkoZGF0YVsyXSA8PCA4KSArIGRhdGFbM107CisKKwlyZXR1cm4gKHJldCA8IDApID8gMCA6IGl0OTEzeF9jb25maWcuZmlybXdhcmU7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3BpZF9maWx0ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJaW50IHJldCA9IDA7CisJdTggcHJvID0gKGFkYXAtPmlkID09IDApID8gREVWXzBfRE1PRCA6IERFVl8xX0RNT0Q7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlBJRF9DICAoJTAyeCkiLCBvbm9mZik7CisKKwlpZiAoIW9ub2ZmKQorCQlyZXQgPSBpdDkxM3hfd3JfcmVnKGFkYXAtPmRldi0+dWRldiwgcHJvLCBQSURfUlNULCAweDEpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdDkxM3hfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLAorCQlpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGFkYXAtPmRldi0+dWRldjsKKwlpbnQgcmV0ID0gMDsKKwl1OCBwcm8gPSAoYWRhcC0+aWQgPT0gMCkgPyBERVZfMF9ETU9EIDogREVWXzFfRE1PRDsKKworCWlmIChwaWRfZmlsdGVyID4gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlBJRF9GICAoJTAyeCkiLCBvbm9mZik7CisJaWYgKG9ub2ZmKSB7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfRU4sIDB4MSk7CisKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfTFNCLCAodTgpKHBpZCAmIDB4ZmYpKTsKKworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBwcm8sIFBJRF9NU0IsICh1OCkocGlkID4+IDgpKTsKKworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBwcm8sIFBJRF9JTlhfRU4sICh1OClvbm9mZik7CisKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgcHJvLCBQSURfSU5YLCAodTgpKGluZGV4ICYgMHgxZikpOworCisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpdDkxM3hfcmV0dXJuX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwl1MzIgZmlybSA9IDA7CisKKwlmaXJtID0gaXQ5MTN4X3F1ZXJ5KHVkZXYsIERFVl8wKTsKKwlpZiAoZmlybSA+IDApCisJCWluZm8oIkZpcm13YXJlIFZlcnNpb24gJWQiLCBmaXJtKTsKKworCXJldHVybiAoZmlybSA+IDApID8gZmlybSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJCQkJIGludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlzdGF0aWMgdTggZGF0YVsyNTZdOworCWludCByZXQ7CisJdTMyIHJlZzsKKwl1OCBwcm87CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCWRlYnVnX2RhdGFfc25pcGV0KDEsICJNZXNzYWdlIG91dCIsIG1zZ1swXS5idWYpOworCWRlYl9pbmZvKDIsICJudW0gb2YgbWVzc2FnZXMgJWQgYWRkcmVzcyAlMDJ4IiwgbnVtLCBtc2dbMF0uYWRkcik7CisKKwlwcm8gPSAobXNnWzBdLmFkZHIgJiAweDIpID8gIERFVl8wX0RNT0QgOiAweDA7CisJcHJvIHw9IChtc2dbMF0uYWRkciAmIDB4MjApID8gREVWXzEgOiBERVZfMDsKKwltZW1jcHkoZGF0YSwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJcmVnID0gKGRhdGFbMF0gPDwgMjQpICsgKGRhdGFbMV0gPDwgMTYpICsKKwkJCShkYXRhWzJdIDw8IDgpICsgZGF0YVszXTsKKwlpZiAobnVtID09IDIpIHsKKwkJcmV0ID0gaXQ5MTN4X2lvKGQtPnVkZXYsIFJFQURfTE9ORywgcHJvLAorCQkJQ01EX0RFTU9EX1JFQUQsIHJlZywgMCwgZGF0YSwgbXNnWzFdLmxlbik7CisJCW1lbWNweShtc2dbMV0uYnVmLCBkYXRhLCBtc2dbMV0ubGVuKTsKKwl9IGVsc2UKKwkJcmV0ID0gaXQ5MTN4X2lvKGQtPnVkZXYsIFdSSVRFX0xPTkcsIHBybywgQ01EX0RFTU9EX1dSSVRFLAorCQkJcmVnLCAwLCAmZGF0YVs0XSwgbXNnWzBdLmxlbiAtIDQpOworCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBpdDkxM3hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpdDkxM3hfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBpdDkxM3hfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBpdDkxM3hfaTJjX2Z1bmMsCit9OworCisvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KKyNkZWZpbmUgSVQ5MTNYX1BPTEwgMjUwCitzdGF0aWMgaW50IGl0OTEzeF9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJdTggaWJ1Zls0XTsKKwlpbnQgcmV0OworCXUzMiBrZXk7CisJLyogQXZvaWQgY29uZmxpY3Qgd2l0aCBmcm9udGVuZHMqLworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXQgPSBpdDkxM3hfaW8oZC0+dWRldiwgUkVBRF9MT05HLCBQUk9fTElOSywgQ01EX0lSX0dFVCwKKwkJMCwgMCwgJmlidWZbMF0sIHNpemVvZihpYnVmKSk7CisKKwlpZiAoKGlidWZbMl0gKyBpYnVmWzNdKSA9PSAweGZmKSB7CisJCWtleSA9IGlidWZbMl07CisJCWtleSArPSBpYnVmWzBdIDw8IDg7CisJCWRlYl9pbmZvKDEsICJJTlQgS2V5ID0lMDh4Iiwga2V5KTsKKwkJaWYgKGQtPnJjX2RldiAhPSBOVUxMKQorCQkJcmNfa2V5ZG93bihkLT5yY19kZXYsIGtleSwgMCk7CisJfQorCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IGl0OTEzeF9pZGVudGlmeV9zdGF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgKnByb3BzLAorCQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKipkZXNjLAorCQlpbnQgKmNvbGQpCit7CisJaW50IHJldCA9IDAsIGZpcm1fbm87CisJdTggcmVnLCByZW1vdGU7CisKKwlmaXJtX25vID0gaXQ5MTN4X3JldHVybl9zdGF0dXModWRldik7CisKKwkvKiBjaGVjbmsgZm9yIGR1YWwgbW9kZSAqLworCWl0OTEzeF9jb25maWcuZHVhbF9tb2RlID0gIGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5YzUpOworCisJLyogVE9ETyBkaWZmZXJlbnQgcmVtb3RlcyAqLworCXJlbW90ZSA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5YWMpOyAvKiBSZW1vdGUgKi8KKwlpZiAocmVtb3RlID09IDApCisJCXByb3BzLT5yYy5jb3JlLnJjX2NvZGVzID0gTlVMTDsKKworCS8qIFRPRE8gYXQgdGhlIG1vbWVudCB0dW5lcl9pZCBpcyBhbHdheXMgYXNzaWduZWQgdG8gMHgzOCAqLworCWl0OTEzeF9jb25maWcudHVuZXJfaWRfMCA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCAweDQ5ZDApOworCisJaW5mbygiRHVhbCBtb2RlPSV4IFJlbW90ZT0leCBUdW5lciBUeXBlPSV4IiwgaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUKKwkJLCByZW1vdGUsIGl0OTEzeF9jb25maWcudHVuZXJfaWRfMCk7CisKKwlpZiAoZmlybV9ubyA+IDApIHsKKwkJKmNvbGQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJaXQ5MTN4X2NvbmZpZy50dW5lcl9pZF8xID0gaXQ5MTN4X3JlYWRfcmVnKHVkZXYsIDB4NDllMCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9FTiwgMHgxKTsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9PTiwgMHgxKTsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEdQSU9IMV9PLCAweDEpOworCQltc2xlZXAoNTApOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgR1BJT0gxX08sIDB4MCk7CisJCW1zbGVlcCg1MCk7CisJCXJlZyA9IGl0OTEzeF9yZWFkX3JlZyh1ZGV2LCBHUElPSDFfTyk7CisJCWlmIChyZWcgPT0gMCkgeworCQkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsICBHUElPSDFfTywgMHgxKTsKKwkJCXJldCB8PSBpdDkxM3hfcmV0dXJuX3N0YXR1cyh1ZGV2KTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLAorCQkJCQlHUElPSDFfTywgMHgwKTsKKwkJfQorCQlwcm9wcy0+bnVtX2FkYXB0ZXJzID0gMjsKKwl9IGVsc2UKKwkJcHJvcHMtPm51bV9hZGFwdGVycyA9IDE7CisKKwlyZWcgPSBpdDkxM3hfcmVhZF9yZWcodWRldiwgSU9fTVVYX1BPV0VSX0NMSyk7CisKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIDB4NGJmYiwgQ0hJUDJfSTJDX0FERFIpOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgIENMS19PX0VOLCAweDEpOworCX0gZWxzZSB7CisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAweDRiZmIsIDB4MCk7CisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgQ0xLX09fRU4sIDB4MCk7CisJfQorCisJKmNvbGQgPSAxOworCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJaW50IHJldCA9IDA7CisJdTggcHJvID0gKGFkYXAtPmlkID09IDApID8gREVWXzBfRE1PRCA6IERFVl8xX0RNT0Q7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwLT5kZXYtPmkyY19tdXRleCkgPCAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJZGViX2luZm8oMSwgIlNUTSAgKCUwMngpIiwgb25vZmYpOworCisJaWYgKCFvbm9mZikKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyhhZGFwLT5kZXYtPnVkZXYsIHBybywgUElEX1JTVCwgMHgxKTsKKworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXYtPmkyY19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaXQ5MTN4X2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCWludCByZXQgPSAwLCBpOworCXU4IHBhY2tldF9zaXplLCBkbGVuOworCXU4ICpmd19kYXRhOworCisJcGFja2V0X3NpemUgPSAweDI5OworCisJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgIEkyQ19DTEssIEkyQ19DTEtfMTAwKTsKKworCWluZm8oIkZSTSBTdGFydGluZyBGaXJtd2FyZSBEb3dubG9hZCIpOworCS8qIFRoaXMgdXNlcyBzY2F0dGVyIHdyaXRlIGZpcm13YXJlIGhlYWRlcnMgZm9sbG93ICovCisJLyogMDMgWFggMDAgICAgIFhYID0gY2hpcCBudW1iZXI/ICovIAorCisJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplOyBpICs9IHBhY2tldF9zaXplKSB7CisJCQlpZiAoaSA+IDApCisJCQkJcGFja2V0X3NpemUgPSAweDM5OworCQkJZndfZGF0YSA9ICh1OCAqKShmdy0+ZGF0YSArIGkpOworCQkJZGxlbiA9ICgoaSArIHBhY2tldF9zaXplKSA+IGZ3LT5zaXplKQorCQkJCT8gKGZ3LT5zaXplIC0gaSkgOiBwYWNrZXRfc2l6ZTsKKwkJCXJldCB8PSBpdDkxM3hfaW8odWRldiwgV1JJVEVfREFUQSwgREVWXzAsCisJCQkJQ01EX1NDQVRURVJfV1JJVEUsIDAsIDAsIGZ3X2RhdGEsIGRsZW4pOworCQkJdWRlbGF5KDEwMDApOworCX0KKworCXJldCB8PSBpdDkxM3hfaW8odWRldiwgV1JJVEVfQ01ELCBERVZfMCwKKwkJCUNNRF9CT09ULCAwLCAwLCBOVUxMLCAwKTsKKworCW1zbGVlcCgxMDApOworCisJaWYgKHJldCA8IDApCisJCWluZm8oIkZSTSBGaXJtd2FyZSBEb3dubG9hZCBGYWlsZWQgKCUwNHgpIiAsIHJldCk7CisJZWxzZQorCQlpbmZvKCJGUk0gRmlybXdhcmUgRG93bmxvYWQgQ29tcGxldGVkIC0gUmVzZXR0aW5nIERldmljZSIpOworCisJcmV0IHw9IGl0OTEzeF9yZXR1cm5fc3RhdHVzKHVkZXYpOworCisJbXNsZWVwKDMwKTsKKworCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgSTJDX0NMSywgSTJDX0NMS180MDApOworCisJLyogVHVuZXIgZnVuY3Rpb24gKi8KKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpCisJCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QgLCAweGVjNGMsIDB4YTApOworCisJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsICBQQURPRFBVLCAweDApOworCXJldCB8PSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCAgQUdDX09fRCwgMHgwKTsKKwlpZiAoaXQ5MTN4X2NvbmZpZy5kdWFsX21vZGUpIHsKKwkJcmV0IHw9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzEsICBQQURPRFBVLCAweDApOworCQlyZXQgfD0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMSwgIEFHQ19PX0QsIDB4MCk7CisJfQorCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9uYW1lKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJY29uc3QgY2hhciAqZGVzYyA9IGFkYXAtPmRldi0+ZGVzYy0+bmFtZTsKKwljaGFyICpmZV9uYW1lW10gPSB7Il8xIiwgIl8yIiwgIl8zIiwgIl80In07CisJY2hhciAqbmFtZSA9IGFkYXAtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWU7CisKKwlzdHJsY3B5KG5hbWUsIGRlc2MsIDEyOCk7CisJc3RybGNhdChuYW1lLCBmZV9uYW1lW2FkYXAtPmlkXSwgMTI4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGFkYXAtPmRldi0+dWRldjsKKwlpbnQgcmV0ID0gMDsKKwl1OCBhZGYgPSBpdDkxM3hfcmVhZF9yZWcodWRldiwgSU9fTVVYX1BPV0VSX0NMSyk7CisJdTggYWRhcF9hZGRyID0gSTJDX0JBU0VfQUREUiArIChhZGFwLT5pZCA8PCA1KTsKKwl1MTYgZXBfc2l6ZSA9IGFkYXAtPnByb3BzLmZlWzBdLnN0cmVhbS51LmJ1bGsuYnVmZmVyc2l6ZTsKKwl1OCB0dW5lcl9pZCwgdHVuZXJfdHlwZTsKKworCWlmIChhZGFwLT5pZCA9PSAwKQorCQl0dW5lcl9pZCA9IGl0OTEzeF9jb25maWcudHVuZXJfaWRfMDsKKwllbHNlCisJCXR1bmVyX2lkID0gaXQ5MTN4X2NvbmZpZy50dW5lcl9pZF8xOworCisJLyogVE9ETyB3ZSBhbHdheXMgdXNlIElUOTEzNyBwb3NzaWJsZSByZWZlcmVuY2VzIGhlcmUqLworCS8qIERvY3VtZW50YXRpb24gc3VnZ2VzdHMgZG9uJ3QgY2FyZSAqLworCXN3aXRjaCAodHVuZXJfaWQpIHsKKwljYXNlIDB4NTE6CisJY2FzZSAweDUyOgorCWNhc2UgMHg2MDoKKwljYXNlIDB4NjE6CisJY2FzZSAweDYyOgorCWRlZmF1bHQ6CisJY2FzZSAweDM4OgorCQl0dW5lcl90eXBlID0gSVQ5MTM3OworCX0KKworCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKGl0OTEzeF9mZV9hdHRhY2gsCisJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCBhZGFwX2FkZHIsIGFkZiwgdHVuZXJfdHlwZSk7CisKKwlpZiAoYWRhcC0+aWQgPT0gMCAmJiBhZGFwLT5mZV9hZGFwWzBdLmZlKSB7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzBfRE1PRCwgTVAyX1NXX1JTVCwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBNUDJJRjJfU1dfUlNULCAweDEpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfRU4sIDB4MGYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfTkFLLCAweDFiKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVAwX1RYX0VOLCAweDJmKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA0X1RYX0xFTl9MU0IsCisJCQkJCWVwX3NpemUgJiAweGZmKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA0X1RYX0xFTl9NU0IsIGVwX3NpemUgPj4gOCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzAsIEVQNF9NQVhfUEtULCAweDgwKTsKKwl9IGVsc2UgaWYgKGFkYXAtPmlkID09IDEgJiYgYWRhcC0+ZmVfYWRhcFswXS5mZSkgeworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDBfVFhfRU4sIDB4NmYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDVfVFhfTEVOX0xTQiwKKwkJCQkJZXBfc2l6ZSAmIDB4ZmYpOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wLCBFUDVfVFhfTEVOX01TQiwgZXBfc2l6ZSA+PiA4KTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMCwgRVA1X01BWF9QS1QsIDB4ODApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGMl9FTiwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMV9ETU9ELCBNUDJJRl9TRVJJQUwsIDB4MSk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzEsIFRPUF9IT1NUQl9TRVJfTU9ERSwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBUU0lTX0VOQUJMRSwgMHgxKTsKKwkJcmV0ID0gaXQ5MTN4X3dyX3JlZyh1ZGV2LCBERVZfMF9ETU9ELCBNUDJfU1dfUlNULCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGMl9TV19SU1QsIDB4MCk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzBfRE1PRCwgTVAySUYyX0hBTEZfUFNCLCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8wX0RNT0QsIE1QMklGX1NUT1BfRU4sIDB4MSk7CisJCXJldCA9IGl0OTEzeF93cl9yZWcodWRldiwgREVWXzFfRE1PRCwgTVBFR19GVUxMX1NQRUVELCAweDApOworCQlyZXQgPSBpdDkxM3hfd3JfcmVnKHVkZXYsIERFVl8xX0RNT0QsIE1QMklGX1NUT1BfRU4sIDB4MCk7CisJfSBlbHNlCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gaXQ5MTN4X25hbWUoYWRhcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBEVkIgVVNCIERyaXZlciAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGl0OTEzeF9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGl0OTEzeF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWNtZF9jb3VudGVyID0gMDsKKwlpZiAoMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZpdDkxM3hfcHJvcGVydGllcywKKwkJCQkgICAgIFRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSkgeworCQlpbmZvKCJERVYgcmVnaXN0ZXJpbmcgZGV2aWNlIGRyaXZlciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbmZvKCJERVYgaXQ5MTN4IEVycm9yIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGl0OTEzeF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShVU0JfVklEX0tXT1JMRF8yLCBVU0JfUElEX0tXT1JMRF9VQjQ5OV8yVF9UMDkpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSVRFVEVDSCwgVVNCX1BJRF9JVEVURUNIX0lUOTEzNSkgfSwKKwl7fQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpdDkxM3hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgaXQ5MTN4X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBpdDkxM3hfZG93bmxvYWRfZmlybXdhcmUsCisJLmZpcm13YXJlID0gImR2Yi11c2ItaXQ5MTM3LTAxLmZ3IiwKKwkubm9fcmVjb25uZWN0ID0gMSwKKwkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdCBpdDkxM3hfc3RhdGUpLAorCS5udW1fYWRhcHRlcnMgPSAyLAorCS5hZGFwdGVyID0geworCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSfAorCQkJCURWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkd8CisJCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGl0OTEzeF9zdHJlYW1pbmdfY3RybCwKKwkJCS5waWRfZmlsdGVyX2NvdW50ID0gMzEsCisJCQkucGlkX2ZpbHRlciA9IGl0OTEzeF9waWRfZmlsdGVyLAorCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBpdDkxM3hfcGlkX2ZpbHRlcl9jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBpdDkxM3hfZnJvbnRlbmRfYXR0YWNoLAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDEwLAorCQkJCS5lbmRwb2ludCA9IDB4MDQsCisJCQkJLnUgPSB7LyogS2VlcCBMb3cgaWYgUElEIGZpbHRlciBvbiAqLworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gMzU4NCwKKworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKKwkJfSwKKwkJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVJ8CisJCQkJRFZCX1VTQl9BREFQX05FRURfUElEX0ZJTFRFUklOR3wKKwkJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gaXQ5MTN4X3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMSwKKwkJCS5waWRfZmlsdGVyID0gaXQ5MTN4X3BpZF9maWx0ZXIsCisJCQkucGlkX2ZpbHRlcl9jdHJsICA9IGl0OTEzeF9waWRfZmlsdGVyX2N0cmwsCisJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGl0OTEzeF9mcm9udGVuZF9hdHRhY2gsCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gNSwKKwkJCQkuZW5kcG9pbnQgPSAweDA1LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gMzU4NCwKKworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKKwkJfQorCX0sCisJLmlkZW50aWZ5X3N0YXRlICAgPSBpdDkxM3hfaWRlbnRpZnlfc3RhdGUsCisJLnJjLmNvcmUgPSB7CisJCS5wcm90b2NvbAk9IFJDX1RZUEVfTkVDLAorCQkubW9kdWxlX25hbWUJPSAiaXQ5MTN4IiwKKwkJLnJjX3F1ZXJ5CT0gaXQ5MTN4X3JjX3F1ZXJ5LAorCQkucmNfaW50ZXJ2YWwJPSBJVDkxM1hfUE9MTCwKKwkJLmFsbG93ZWRfcHJvdG9zCT0gUkNfVFlQRV9ORUMsCisJCS5yY19jb2Rlcwk9IFJDX01BUF9LV09STERfMzE1VSwKKwl9LAorCS5pMmNfYWxnbyAgICAgICAgID0gJml0OTEzeF9pMmNfYWxnbywKKwkubnVtX2RldmljZV9kZXNjcyA9IDIsCisJLmRldmljZXMgPSB7CisJCXsgICAiS3dvcmxkIFVCNDk5LTJUIFQwOShJVDkxMzcpIiwKKwkJCXsgJml0OTEzeF90YWJsZVswXSwgTlVMTCB9LAorCQkJfSwKKwkJeyAgICJJVEUgOTEzNSBHZW5lcmljIiwKKwkJCXsgJml0OTEzeF90YWJsZVsxXSwgTlVMTCB9LAorCQkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXQ5MTN4X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaXQ5MTN4IiwKKwkucHJvYmUJCT0gaXQ5MTN4X3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBpdDkxM3hfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGl0OTEzeF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJml0OTEzeF9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXQ5MTN4X21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJml0OTEzeF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpdDkxM3hfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaXQ5MTN4X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFsY29sbSBQcmllc3RsZXkgPHR2Ym94c3B5QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXQ5MTN4IFVTQiAyIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjEuMDciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbG1lZG0wNC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKaW5kZXggMzdiMTQ2OS4uYjkyMjgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9sbWVkbTA0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHN0LT51c2JfYnVmZmVyID09IE5VTEwpIHsKLQkJc3QtPnVzYl9idWZmZXIgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CisJCXN0LT51c2JfYnVmZmVyID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdC0+dXNiX2J1ZmZlciA9PSBOVUxMKSB7CiAJCQlpbmZvKCJNRU0gRXJyb3Igbm8gbWVtb3J5Iik7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3NSw4ICsxNzUsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCS8qIHRoZSByZWFkL3dyaXRlIGNhcHBlZCBhdCA1MTIgKi8KLQltZW1jcHkoYnVmZiwgd2J1ZiwgKHdsZW4gPiA1MTIpID8gNTEyIDogd2xlbik7CisJLyogdGhlIHJlYWQvd3JpdGUgY2FwcGVkIGF0IDY0ICovCisJbWVtY3B5KGJ1ZmYsIHdidWYsICh3bGVuIDwgNjQpID8gd2xlbiA6IDY0KTsKIAogCXJldCB8PSB1c2JfY2xlYXJfaGFsdChkLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZC0+dWRldiwgMHgwMSkpOwogCkBAIC0xODYsOCArMTg2LDggQEAKIAogCXJldCB8PSB1c2JfY2xlYXJfaGFsdChkLT51ZGV2LCB1c2JfcmN2YnVsa3BpcGUoZC0+dWRldiwgMHgwMSkpOwogCi0JcmV0IHw9IGxtZTI1MTBfYnVsa19yZWFkKGQtPnVkZXYsIGJ1ZmYsIChybGVuID4gNTEyKSA/Ci0JCQk1MTIgOiBybGVuICwgMHgwMSk7CisJcmV0IHw9IGxtZTI1MTBfYnVsa19yZWFkKGQtPnVkZXYsIGJ1ZmYsIChybGVuIDwgNjQpID8KKwkJCXJsZW4gOiA2NCAsIDB4MDEpOwogCiAJaWYgKHJsZW4gPiAwKQogCQltZW1jcHkocmJ1ZiwgYnVmZiwgcmxlbik7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlpZiAobG1lX2ludC0+bG1lX3VyYiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQlsbWVfaW50LT5idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoYWRhcC0+ZGV2LT51ZGV2LCA1MDAwLCBHRlBfQVRPTUlDLAorCWxtZV9pbnQtPmJ1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudChhZGFwLT5kZXYtPnVkZXYsIDEyOCwgR0ZQX0FUT01JQywKIAkJCQkJJmxtZV9pbnQtPmxtZV91cmItPnRyYW5zZmVyX2RtYSk7CiAKIAlpZiAobG1lX2ludC0+YnVmZmVyID09IE5VTEwpCkBAIC0zNDMsMTAgKzM0MywxMCBAQAogCQkJCWFkYXAtPmRldi0+dWRldiwKIAkJCQl1c2JfcmN2aW50cGlwZShhZGFwLT5kZXYtPnVkZXYsIDB4YSksCiAJCQkJbG1lX2ludC0+YnVmZmVyLAotCQkJCTQwOTYsCisJCQkJMTI4LAogCQkJCWxtZTI1MTBfaW50X3Jlc3BvbnNlLAogCQkJCWFkYXAsCi0JCQkJMTEpOworCQkJCTgpOwogCiAJbG1lX2ludC0+bG1lX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKQEAgLTU4MCw3ICs1ODAsNyBAQAogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJc3RydWN0IGxtZTI1MTBfc3RhdGUgKnN0ID0gZC0+cHJpdjsKLQlzdGF0aWMgdTggb2J1Zls2NF0sIGlidWZbNTEyXTsKKwlzdGF0aWMgdTggb2J1Zls2NF0sIGlidWZbNjRdOwogCWludCBpLCByZWFkLCByZWFkX287CiAJdTE2IGxlbjsKIAl1OCBnYXRlID0gc3QtPmkyY19nYXRlOwpAQCAtNjIxLDcgKzYyMSw3IEBACiAJCQlsZW4gPSBtc2dbaV0ubGVuKzM7CiAJCX0KIAotCQlpZiAobG1lMjUxMF9tc2coZCwgb2J1ZiwgbGVuLCBpYnVmLCA1MTIpIDwgMCkgeworCQlpZiAobG1lMjUxMF9tc2coZCwgb2J1ZiwgbGVuLCBpYnVmLCA2NCkgPCAwKSB7CiAJCQlkZWJfaW5mbygxLCAiaTJjIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CkBAIC05NDEsNyArOTQxLDcgQEAKIAljb25zdCBjaGFyICpkZXNjID0gYWRhcC0+ZGV2LT5kZXNjLT5uYW1lOwogCWNoYXIgKmZlX25hbWVbXSA9IHsiIiwgIiBMRyBURFFZLVAwMDFGIiwgIiBTSEFSUDpCUzJGN0haNzM5NSIsCiAJCQkJIiBTSEFSUDpCUzJGN0haMDE5NCJ9OwotCWNoYXIgKm5hbWUgPSBhZGFwLT5mZS0+b3BzLmluZm8ubmFtZTsKKwljaGFyICpuYW1lID0gYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLmluZm8ubmFtZTsKIAogCXN0cmxjcHkobmFtZSwgZGVzYywgMTI4KTsKIAlzdHJsY2F0KG5hbWUsIGZlX25hbWVbc3QtPnR1bmVyX2NvbmZpZ10sIDEyOCk7CkBAIC05NTgsMTAgKzk1OCwxMCBAQAogCXN0LT5pMmNfdGFsa19vbm9mZiA9IDE7CiAKIAlzdC0+aTJjX2dhdGUgPSA0OwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA4Nl9hdHRhY2gsICZ0ZGExMDA4Nl9jb25maWcsCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwODZfYXR0YWNoLCAmdGRhMTAwODZfY29uZmlnLAogCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJUVU4gRm91bmQgRnJvbnRlbmQgVERBMTAwODYiKTsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3cgPSA0OwogCQlzdC0+aTJjX3R1bmVyX2dhdGVfciA9IDQ7CkBAIC05NzUsOSArOTc1LDkgQEAKIAl9CiAKIAlzdC0+aTJjX2dhdGUgPSA0OwotCWFkYXAtPmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0X2NvbmZpZywKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJnNoYXJwX3owMTk0X2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJGRSBGb3VuZCBTdHYwMjk5Iik7CiAJCXN0LT5pMmNfdHVuZXJfZ2F0ZV93ID0gNDsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3IgPSA1OwpAQCAtOTkxLDkgKzk5MSw5IEBACiAJfQogCiAJc3QtPmkyY19nYXRlID0gNTsKLQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goc3R2MDI4OF9hdHRhY2gsICZsbWVfY29uZmlnLAorCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBkdmJfYXR0YWNoKHN0djAyODhfYXR0YWNoLCAmbG1lX2NvbmZpZywKIAkJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKLQlpZiAoYWRhcC0+ZmUpIHsKKwlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgewogCQlpbmZvKCJGRSBGb3VuZCBTdHYwMjg4Iik7CiAJCXN0LT5pMmNfdHVuZXJfZ2F0ZV93ID0gNDsKIAkJc3QtPmkyY190dW5lcl9nYXRlX3IgPSA1OwpAQCAtMTAxMCwxNSArMTAxMCwxNSBAQAogCiAKIGVuZDoJaWYgKHJldCkgewotCQlpZiAoYWRhcC0+ZmUpIHsKLQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYWRhcC0+ZmUpOwotCQkJYWRhcC0+ZmUgPSBOVUxMOworCQlpZiAoYWRhcC0+ZmVfYWRhcFswXS5mZSkgeworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhZGFwLT5mZV9hZGFwWzBdLmZlKTsKKwkJCWFkYXAtPmZlX2FkYXBbMF0uZmUgPSBOVUxMOwogCQl9CiAJCWFkYXAtPmRldi0+cHJvcHMucmMuY29yZS5yY19jb2RlcyA9IE5VTEw7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWFkYXAtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBkbTA0X2xtZTI1MTBfc2V0X3ZvbHRhZ2U7CisJYWRhcC0+ZmVfYWRhcFswXS5mZS0+b3BzLnNldF92b2x0YWdlID0gZG0wNF9sbWUyNTEwX3NldF92b2x0YWdlOwogCXJldCA9IGxtZV9uYW1lKGFkYXApOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMDMxLDE3ICsxMDMxLDE3IEBACiAKIAlzd2l0Y2ggKHN0LT50dW5lcl9jb25maWcpIHsKIAljYXNlIFRVTkVSX0xHOgotCQlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIDEpKQogCQkJcmV0ID0gc3QtPnR1bmVyX2NvbmZpZzsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9TNzM5NToKLQkJaWYgKGR2Yl9hdHRhY2goaXgyNTA1dl9hdHRhY2ggLCBhZGFwLT5mZSwgJmxtZV90dW5lciwKKwkJaWYgKGR2Yl9hdHRhY2goaXgyNTA1dl9hdHRhY2ggLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAmbG1lX3R1bmVyLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXApKQogCQkJcmV0ID0gc3QtPnR1bmVyX2NvbmZpZzsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9TMDE5NDoKLQkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2ggLCBhZGFwLT5mZSwgMHhjMCwKKwkJaWYgKGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2ggLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweGMwLAogCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsIERWQl9QTExfT1BFUkExKSkKIAkJCXJldCA9IHN0LT50dW5lcl9jb25maWc7CiAJCWJyZWFrOwpAQCAtMTE0NSw2ICsxMTQ1LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUnwKIAkJCQlEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTE2Niw2ICsxMTY4LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfX0sCiAJCX0KIAl9LAogCS5yYy5jb3JlID0gewpAQCAtMTE5Myw2ICsxMTk2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUnwKIAkJCQlEVkJfVVNCX0FEQVBfTkVFRF9QSURfRklMVEVSSU5HfAogCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLApAQCAtMTIxNCw2ICsxMjE5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KKwkJfX0sCiAJCX0KIAl9LAogCS5yYy5jb3JlID0gewpAQCAtMTI0MSw3ICsxMjQ3LDcgQEAKIAl2b2lkICpidWZmZXIgPSBOVUxMOwogCiAJaWYgKGFkYXAgIT0gTlVMTCkgewotCQlsbWUyNTEwX2tpbGxfdXJiKCZhZGFwLT5zdHJlYW0pOworCQlsbWUyNTEwX2tpbGxfdXJiKCZhZGFwLT5mZV9hZGFwWzBdLnN0cmVhbSk7CiAJCWFkYXAtPmZlZWRjb3VudCA9IDA7CiAJfQogCkBAIC0xMjU1LDcgKzEyNjEsNyBAQAogCiAJaWYgKHN0LT5sbWVfdXJiICE9IE5VTEwpIHsKIAkJdXNiX2tpbGxfdXJiKHN0LT5sbWVfdXJiKTsKLQkJdXNiX2ZyZWVfY29oZXJlbnQoZC0+dWRldiwgNTAwMCwgc3QtPmJ1ZmZlciwKKwkJdXNiX2ZyZWVfY29oZXJlbnQoZC0+dWRldiwgMTI4LCBzdC0+YnVmZmVyLAogCQkJCSAgc3QtPmxtZV91cmItPnRyYW5zZmVyX2RtYSk7CiAJCWluZm8oIkludGVycnVwdCBTZXJ2aWNlIFN0b3BwZWQiKTsKIAl9CkBAIC0xMzA2LDUgKzEzMTIsNSBAQAogCiBNT0RVTEVfQVVUSE9SKCJNYWxjb2xtIFByaWVzdGxleSA8dHZib3hzcHlAZ21haWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMTUUyNTEwKEMpIERWQi1TIFVTQjIuMCIpOwotTU9EVUxFX1ZFUlNJT04oIjEuODgiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjkwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMKaW5kZXggOTQ1Njc5Mi4uYTFlMTI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYwpAQCAtODYsMTIgKzg2LDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLm51bV9hZGFwdGVyczsgaSsrKQotCQlmbGFncyB8PSBkLT5hZGFwdGVyW2ldLnByb3BzLmNhcHM7CisJCWZsYWdzIHw9IGQtPmFkYXB0ZXJbaV0ucHJvcHMuZmVbMF0uY2FwczsKIAogCS8qIFNvbWUgZGV2aWNlcyhEcG9zaCkgbWlnaHQgY3Jhc2ggaWYgd2UgYXR0ZW1wdCB0b3VjaCBhdCBhbGwuICovCiAJaWYgKGZsYWdzICYgRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5udW1fYWRhcHRlcnM7IGkrKykgewotCQkJZXBpID0gZC0+YWRhcHRlcltpXS5wcm9wcy5zdHJlYW0uZW5kcG9pbnQgLSAweDgxOworCQkJZXBpID0gZC0+YWRhcHRlcltpXS5wcm9wcy5mZVswXS5zdHJlYW0uZW5kcG9pbnQgLSAweDgxOwogCiAJCQlpZiAoZXBpIDwgMCB8fCBlcGkgPj0gTTkyMDZfTUFYX0FEQVBURVJTKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAibTkyMHg6IFVuZXhwZWN0ZWQgYWRhcHRlciBlbmRwb2ludCFcbiIpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAJc3RydWN0IG05MjB4X3N0YXRlICptID0gYWRhcC0+ZGV2LT5wcml2OwogCWludCBlbmFibGVkID0gbS0+ZmlsdGVyaW5nX2VuYWJsZWRbYWRhcC0+aWRdOwogCWludCBpLCByZXQgPSAwLCBmaWx0ZXIgPSAwOwotCWludCBlcCA9IGFkYXAtPnByb3BzLnN0cmVhbS5lbmRwb2ludDsKKwlpbnQgZXAgPSBhZGFwLT5wcm9wcy5mZVswXS5zdHJlYW0uZW5kcG9pbnQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTTkyMDZfTUFYX0ZJTFRFUlM7IGkrKykKIAkJaWYgKG0tPmZpbHRlcnNbYWRhcC0+aWRdW2ldID09IDgxOTIpCkBAIC01MDEsOSArNTAxLDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsCi0JCQkJICAgJm05MjB4X210MzUyX2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLAorCQkJCQkgJm05MjB4X210MzUyX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MTMsOSArNTE0LDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJICAgJm05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkgJm05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MjUsOSArNTI3LDEwIEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJICAgJm05MjB4X3RkYTEwMDQ2XzBiX2NvbmZpZywKLQkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkgJm05MjB4X3RkYTEwMDQ2XzBiX2NvbmZpZywKKwkJCQkJICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoKGFkYXAtPmZlX2FkYXBbMF0uZmUpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CkBAIC01MzcsNyArNTQwLDcgQEAKIHsKIAlkZWIoIiVzXG4iLF9fZnVuY19fKTsKIAotCWlmIChkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJm05MjB4X3F0MTAxMF9jb25maWcpID09IE5VTEwpCisJaWYgKGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZtOTIweF9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJldHVybiAwOwpAQCAtNTQ3LDcgKzU1MCw3IEBACiB7CiAJZGViKCIlc1xuIixfX2Z1bmNfXyk7CiAKLQlpZiAoZHZiX2F0dGFjaCh0ZGE4Mjd4X2F0dGFjaCwgYWRhcC0+ZmUsIDB4NjAsICZhZGFwLT5kZXYtPmkyY19hZGFwLCBOVUxMKSA9PSBOVUxMKQorCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBhZGFwLT5mZV9hZGFwWzBdLmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gMDsKQEAgLTU1Nyw3ICs1NjAsNyBAQAogewogCWRlYigiJXNcbiIsX19mdW5jX18pOwogCi0JaWYgKGR2Yl9hdHRhY2godGRhODI3eF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkKKwlpZiAoZHZiX2F0dGFjaCh0ZGE4Mjd4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIE5VTEwpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIDA7CkBAIC01NjUsNyArNTY4LDcgQEAKIAogc3RhdGljIGludCBtOTIweF9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JZHZiX2F0dGFjaChzaW1wbGVfdHVuZXJfYXR0YWNoLCBhZGFwLT5mZSwKKwlkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsCiAJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDYxLAogCQkgICBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMpOwogCXJldHVybiAwOwpAQCAtODA3LDYgKzgxMCw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtODI3LDYgKzgzMyw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9fSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApAQCAtODUxLDYgKzg1OCw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtODcxLDYgKzg4MSw3IEBACiAJCQkJfQogCQkJfQogCQl9LAorCQl9fSwKIAl9fSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApAQCAtOTEwLDYgKzkyMSw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMiwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtOTI5LDcgKzk0MywxMSBAQAogCQkJCQkgLmJ1ZmZlcnNpemUgPSA1MTIsCiAJCQkJIH0KIAkJCX0KKwkJfX0sCiAJCX19LHsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCiAJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKIAkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCkBAIC05NDksNiArOTY3LDcgQEAKIAkJCQkJIC5idWZmZXJzaXplID0gNTEyLAogCQkJCSB9CiAJCQl9CisJCX19LAogCQl9LAogCX19LAogCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjB4X2kyY19hbGdvLApAQCAtOTc0LDYgKzk5Myw4IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJLyogSGFyZHdhcmUgcGlkIGZpbHRlcnMgZG9uJ3Qgd29yayB3aXRoIHRoaXMgZGV2aWNlL2Zpcm13YXJlICovCiAKIAkJLmZyb250ZW5kX2F0dGFjaCAgPSBtOTIweF9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCkBAIC05ODksNiArMTAxMCw3IEBACiAJCQkJIH0KIAkJCX0KIAkJfSwKKwkJfX0sCiAJfX0sCiAJLmkyY19hbGdvICAgICAgICAgPSAmbTkyMHhfaTJjX2FsZ28sCiAKQEAgLTEwMTksNiArMTA0MSw5IEBACiAJLmlkZW50aWZ5X3N0YXRlICAgPSBtOTIweF9pZGVudGlmeV9zdGF0ZSwKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHt7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKKwogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CiAJCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIApAQCAtMTA0MSw2ICsxMDY2LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0sCisJCX19LAogCX0gfSwKIAkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1kZW1vZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1kZW1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjU4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmMKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiAgbXhsMTExc2YtZGVtb2QuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBEVkItVCBkZW1vZHVsYXRvcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibXhsMTExc2YtZGVtb2QuaCIKKyNpbmNsdWRlICJteGwxMTFzZi1yZWcuaCIKKworLyogZGVidWcgKi8KK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIG14bDExMXNmX2RlbW9kX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyAob3ItYWJsZSkpLiIpOworCisjZGVmaW5lIG14bF9kYmcoZm10LCBhcmcuLi4pIFwKKwlpZiAobXhsMTExc2ZfZGVtb2RfZGVidWcpIFwKKwkJbXhsX3ByaW50ayhLRVJOX0RFQlVHLCBmbXQsICMjYXJnKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlIHsKKwlzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKm14bF9zdGF0ZTsKKworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9jb25maWcgKmNmZzsKKworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZmU7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHU4IGFkZHIsIHU4ICpkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cmVhZF9yZWcpID8KKwkJc3RhdGUtPmNmZy0+cmVhZF9yZWcoc3RhdGUtPm14bF9zdGF0ZSwgYWRkciwgZGF0YSkgOgorCQktRUlOVkFMOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3dyaXRlX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgICB1OCBhZGRyLCB1OCBkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+d3JpdGVfcmVnKSA/CisJCXN0YXRlLT5jZmctPndyaXRlX3JlZyhzdGF0ZS0+bXhsX3N0YXRlLCBhZGRyLCBkYXRhKSA6CisJCS1FSU5WQUw7Cit9CisKK3N0YXRpYworaW50IG14bDExMXNmX2RlbW9kX3Byb2dyYW1fcmVncyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpjdHJsX3JlZ19pbmZvKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cHJvZ3JhbV9yZWdzKSA/CisJCXN0YXRlLT5jZmctPnByb2dyYW1fcmVncyhzdGF0ZS0+bXhsX3N0YXRlLCBjdHJsX3JlZ19pbmZvKSA6CisJCS1FSU5WQUw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVFBTICovCisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF90cHNfY29kZV9yYXRlKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICBmZV9jb2RlX3JhdGVfdCAqY29kZV9yYXRlKQoreworCXU4IHZhbDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X0NPREVfUkFURV9UUFNfUkVHLCAmdmFsKTsKKwkvKiBiaXQ8MjowPiAtIDAwMDoxLzIsIDAwMToyLzMsIDAxMDozLzQsIDAxMTo1LzYsIDEwMDo3LzggKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICh2YWwgJiBWNl9DT0RFX1JBVEVfVFBTX01BU0spIHsKKwljYXNlIDA6CisJCSpjb2RlX3JhdGUgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIDE6CisJCSpjb2RlX3JhdGUgPSBGRUNfMl8zOworCQlicmVhazsKKwljYXNlIDI6CisJCSpjb2RlX3JhdGUgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIDM6CisJCSpjb2RlX3JhdGUgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIDQ6CisJCSpjb2RlX3JhdGUgPSBGRUNfN184OworCQlicmVhazsKKwl9CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF90cHNfY29uc3RlbGxhdGlvbihzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCQkgZmVfbW9kdWxhdGlvbl90ICpjb25zdGVsbGF0aW9uKQoreworCXU4IHZhbDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X01PRE9SREVSX1RQU19SRUcsICZ2YWwpOworCS8qIENvbnN0ZWxsYXRpb24sIDAwIDogUVBTSywgMDEgOiAxNlFBTSwgMTA6NjRRQU0gKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICgodmFsICYgVjZfUEFSQU1fQ09OU1RFTExBVElPTl9NQVNLKSA+PiA0KSB7CisJY2FzZSAwOgorCQkqY29uc3RlbGxhdGlvbiA9IFFQU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJKmNvbnN0ZWxsYXRpb24gPSBRQU1fMTY7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKmNvbnN0ZWxsYXRpb24gPSBRQU1fNjQ7CisJCWJyZWFrOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9mZnRfbW9kZShzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCQkgIGZlX3RyYW5zbWl0X21vZGVfdCAqZmZ0X21vZGUpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfTU9ERV9UUFNfUkVHLCAmdmFsKTsKKwkvKiBGRlQgTW9kZSwgMDA6MkssIDAxOjhLLCAxMDo0SyAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzd2l0Y2ggKCh2YWwgJiBWNl9QQVJBTV9GRlRfTU9ERV9NQVNLKSA+PiAyKSB7CisJY2FzZSAwOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV84SzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqZmZ0X21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV80SzsKKwkJYnJlYWs7CisJfQorZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMKK2ludCBteGwxeDFzZl9kZW1vZF9nZXRfdHBzX2d1YXJkX2ludGVydmFsKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJCSAgZmVfZ3VhcmRfaW50ZXJ2YWxfdCAqZ3VhcmQpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfQ1BfVFBTX1JFRywgJnZhbCk7CisJLyogMDA6MS8zMiwgMDE6MS8xNiwgMTA6MS84LCAxMToxLzQgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICgodmFsICYgVjZfUEFSQU1fR0lfTUFTSykgPj4gNCkgeworCWNhc2UgMDoKKwkJKmd1YXJkID0gR1VBUkRfSU5URVJWQUxfMV8zMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkqZ3VhcmQgPSBHVUFSRF9JTlRFUlZBTF8xXzE2OworCQlicmVhazsKKwljYXNlIDI6CisJCSpndWFyZCA9IEdVQVJEX0lOVEVSVkFMXzFfODsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkqZ3VhcmQgPSBHVUFSRF9JTlRFUlZBTF8xXzQ7CisJCWJyZWFrOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19oaWVyYXJjaHkoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgIGZlX2hpZXJhcmNoeV90ICpoaWVyYXJjaHkpCit7CisJdTggdmFsOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfVFBTX0hJRVJBQ0hZX1JFRywgJnZhbCk7CisJLyogYml0PDY6ND4gLSAwMDA6Tm9uIGhpZXJhcmNoeSwgMDAxOjEsIDAxMDoyLCAwMTE6NCAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzd2l0Y2ggKCh2YWwgJiBWNl9UUFNfSElFUkFSQ0hZX0lORk9fTUFTSykgPj4gNikgeworCWNhc2UgMDoKKwkJKmhpZXJhcmNoeSA9IEhJRVJBUkNIWV9OT05FOworCQlicmVhazsKKwljYXNlIDE6CisJCSpoaWVyYXJjaHkgPSBISUVSQVJDSFlfMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqaGllcmFyY2h5ID0gSElFUkFSQ0hZXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJKmhpZXJhcmNoeSA9IEhJRVJBUkNIWV80OworCQlicmVhazsKKwl9CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTE9DS1MgKi8KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3N5bmNfbG9ja19zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkJaW50ICpzeW5jX2xvY2spCit7CisJdTggdmFsID0gMDsKKwlpbnQgcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X1NZTkNfTE9DS19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnN5bmNfbG9jayA9ICh2YWwgJiBTWU5DX0xPQ0tfTUFTSykgPj4gNDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3JzX2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgaW50ICpyc19sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9SU19MT0NLX0RFVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnJzX2xvY2sgPSAodmFsICYgUlNfTE9DS19ERVRfTUFTSykgPj4gMzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19sb2NrX3N0YXR1cyhzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgICBpbnQgKnRwc19sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9UUFNfTE9DS19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKnRwc19sb2NrID0gKHZhbCAmIFY2X1BBUkFNX1RQU19MT0NLX01BU0spID4+IDY7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYworaW50IG14bDF4MXNmX2RlbW9kX2dldF9mZWNfbG9ja19zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgICAgaW50ICpmZWNfbG9jaykKK3sKKwl1OCB2YWwgPSAwOworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfSVJRX1NUQVRVU19SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKmZlY19sb2NrID0gKHZhbCAmIElSUV9NQVNLX0ZFQ19MT0NLKSA+PiA0OworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMAorc3RhdGljCitpbnQgbXhsMXgxc2ZfZGVtb2RfZ2V0X2NwX2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgaW50ICpjcF9sb2NrKQoreworCXU4IHZhbCA9IDA7CisJaW50IHJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9DUF9MT0NLX0RFVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJKmNwX2xvY2sgPSAodmFsICYgVjZfQ1BfTE9DS19ERVRfTUFTSykgPj4gMjsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG14bDF4MXNmX2RlbW9kX3Jlc2V0X2lycV9zdGF0dXMoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gbXhsMTExc2ZfZGVtb2Rfd3JpdGVfcmVnKHN0YXRlLCAweDBlLCAweGZmKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2Rfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIHBoeV9wbGxfcGF0Y2hbXSA9IHsKKwkJezB4MDAsIDB4ZmYsIDB4MDF9LCAvKiBjaGFuZ2UgcGFnZSB0byAxICovCisJCXsweDQwLCAweGZmLCAweDA1fSwKKwkJezB4NDAsIDB4ZmYsIDB4MDF9LAorCQl7MHg0MSwgMHhmZiwgMHhjYX0sCisJCXsweDQxLCAweGZmLCAweGMwfSwKKwkJezB4MDAsIDB4ZmYsIDB4MDB9LCAvKiBjaGFuZ2UgcGFnZSB0byAwICovCisJCXswLCAgICAwLCAgICAwfQorCX07CisKKwlteGxfZGJnKCIoKSIpOworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJcmV0ID0gZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJbXNsZWVwKDUwKTsKKwl9CisJcmV0ID0gbXhsMTExc2ZfZGVtb2RfcHJvZ3JhbV9yZWdzKHN0YXRlLCBwaHlfcGxsX3BhdGNoKTsKKwlteGxfZmFpbChyZXQpOworCW1zbGVlcCg1MCk7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfcmVzZXRfaXJxX3N0YXR1cyhzdGF0ZSk7CisJbXhsX2ZhaWwocmV0KTsKKwltc2xlZXAoMTAwKTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAwCisvKiByZXNldHMgVFMgUGFja2V0IGVycm9yIGNvdW50ICovCisvKiBBZnRlciBzZXR0aW5nIDd0aCBiaXQgb2YgVjVfUEVSX0NPVU5UX1JFU0VUX1JFRywgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIDAuICovCitzdGF0aWMKK2ludCBteGwxeDFzZl9kZW1vZF9yZXNldF9wYWNrZXRfZXJyb3JfY291bnQoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyByZXNldF9wZXJfY291bnRbXSA9IHsKKwkJezB4MjAsIDB4MDEsIDB4MDF9LAorCQl7MHgyMCwgMHgwMSwgMHgwMH0sCisJCXswLCAgICAwLCAgICAwfQorCX07CisJcmV0dXJuIG14bDExMXNmX2RlbW9kX3Byb2dyYW1fcmVncyhzdGF0ZSwgcmVzZXRfcGVyX2NvdW50KTsKK30KKyNlbmRpZgorCisvKiByZXR1cm5zIFRTIFBhY2tldCBlcnJvciBjb3VudCAqLworLyogUEVSIENvdW50ID0gRkVDX1BFUl9DT1VOVCAqICgyICoqIChGRUNfUEVSX1NDQUxFICogNCkpICovCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBmZWNfcGVyX2NvdW50LCBmZWNfcGVyX3NjYWxlOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJKnVjYmxvY2tzID0gMDsKKworCS8qIEZFQ19QRVJfQ09VTlQgUmVnaXN0ZXIgKi8KKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfRkVDX1BFUl9DT1VOVF9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlmZWNfcGVyX2NvdW50ID0gdmFsOworCisJLyogRkVDX1BFUl9TQ0FMRSBSZWdpc3RlciAqLworCXJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9GRUNfUEVSX1NDQUxFX1JFRywgJnZhbCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXZhbCAmPSBWNl9GRUNfUEVSX1NDQUxFX01BU0s7CisJdmFsICo9IDQ7CisKKwlmZWNfcGVyX3NjYWxlID0gMSA8PCB2YWw7CisKKwlmZWNfcGVyX2NvdW50ICo9IGZlY19wZXJfc2NhbGU7CisKKwkqdWNibG9ja3MgPSBmZWNfcGVyX2NvdW50OworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgTVhMMTExU0ZfREVNT0RfRU5BQkxFX0NBTENVTEFUSU9OUworLyogRklYTUU6IGxlYXZpbmcgdGhpcyBlbmFibGVkIGJyZWFrcyB0aGUgYnVpbGQgb24gc29tZSBhcmNoaXRlY3R1cmVzLAorICogYW5kIHdlIHNob3VsZG4ndCBoYXZlIGFueSBmbG9hdGluZyBwb2ludCBtYXRoIGluIHRoZSBrZXJuZWwsIGFueXdheS4KKyAqCisgKiBUaGVzZSBtYWNyb3MgbmVlZCB0byBiZSByZS13cml0dGVuLCBidXQgaXQncyBoYXJtbGVzcyB0byBzaW1wbHkKKyAqIHJldHVybiB6ZXJvIGZvciBub3cuICovCisjZGVmaW5lIENBTENVTEFURV9CRVIoYXZnX2Vycm9ycywgY291bnQpIFwKKwkoKHUzMikoYXZnX2Vycm9ycyAqIDQpLyhjb3VudCo2NCoxODgqOCkpCisjZGVmaW5lIENBTENVTEFURV9TTlIoZGF0YSkgXAorCSgodTMyKSgoMTAgKiAodTMyKWRhdGEgLyA2NCkgLSAyLjUpKQorI2Vsc2UKKyNkZWZpbmUgQ0FMQ1VMQVRFX0JFUihhdmdfZXJyb3JzLCBjb3VudCkgMAorI2RlZmluZSBDQUxDVUxBVEVfU05SKGRhdGEpIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsMSwgdmFsMiwgdmFsMzsKKwlpbnQgcmV0OworCisJKmJlciA9IDA7CisKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfUlNfQVZHX0VSUk9SU19MU0JfUkVHLCAmdmFsMSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfUlNfQVZHX0VSUk9SU19NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3JlZyhzdGF0ZSwgVjZfTl9BQ0NVTVVMQVRFX1JFRywgJnZhbDMpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwkqYmVyID0gQ0FMQ1VMQVRFX0JFUigodmFsMSB8ICh2YWwyIDw8IDgpKSwgdmFsMyk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfY2FsY19zbnIoc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSwKKwkJCQkgICB1MTYgKnNucikKK3sKKwl1OCB2YWwxLCB2YWwyOworCWludCByZXQ7CisKKwkqc25yID0gMDsKKworCXJldCA9IG14bDExMXNmX2RlbW9kX3JlYWRfcmVnKHN0YXRlLCBWNl9TTlJfUkJfTFNCX1JFRywgJnZhbDEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMTExc2ZfZGVtb2RfcmVhZF9yZWcoc3RhdGUsIFY2X1NOUl9SQl9NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpzbnIgPSBDQUxDVUxBVEVfU05SKHZhbDEgfCAoKHZhbDIgJiAweDAzKSA8PCA4KSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc25yKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWludCByZXQgPSBteGwxMTFzZl9kZW1vZF9jYWxjX3NucihzdGF0ZSwgc25yKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJKnNuciAvPSAxMDsgLyogMC4xIGRCICovCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfZGVtb2RfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICAgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCwgbG9ja2VkLCBjcl9sb2NrLCBzeW5jX2xvY2ssIGZlY19sb2NrOworCisJKnN0YXR1cyA9IDA7CisKKwlyZXQgPSBteGwxeDFzZl9kZW1vZF9nZXRfcnNfbG9ja19zdGF0dXMoc3RhdGUsICZsb2NrZWQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19sb2NrX3N0YXR1cyhzdGF0ZSwgJmNyX2xvY2spOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X3N5bmNfbG9ja19zdGF0dXMoc3RhdGUsICZzeW5jX2xvY2spOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfZGVtb2RfZ2V0X2ZlY19sb2NrX3N0YXR1cyhzdGF0ZSwgJmZlY19sb2NrKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKGxvY2tlZCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCWlmIChjcl9sb2NrKQorCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChzeW5jX2xvY2spCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkM7CisJaWYgKGZlY19sb2NrKSAvKiBmYWxzZSBwb3NpdGl2ZXM/ICovCisJCSpzdGF0dXMgfD0gRkVfSEFTX1ZJVEVSQkk7CisKKwlpZiAoKGxvY2tlZCkgJiYgKGNyX2xvY2spICYmIChzeW5jX2xvY2spKQorCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgICAgICAgdTE2ICpzaWduYWxfc3RyZW5ndGgpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWZlX21vZHVsYXRpb25fdCBjb25zdGVsbGF0aW9uOworCXUxNiBzbnI7CisKKwlteGwxMTFzZl9kZW1vZF9jYWxjX3NucihzdGF0ZSwgJnNucik7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19jb25zdGVsbGF0aW9uKHN0YXRlLCAmY29uc3RlbGxhdGlvbik7CisKKwlzd2l0Y2ggKGNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIFFQU0s6CisJCSpzaWduYWxfc3RyZW5ndGggPSAoc25yID49IDEzMDApID8KKwkJCW1pbig2NTUzNSwgc25yICogNDQpIDogc25yICogMzg7CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQkqc2lnbmFsX3N0cmVuZ3RoID0gKHNuciA+PSAxNTAwKSA/CisJCQltaW4oNjU1MzUsIHNuciAqIDM4KSA6IHNuciAqIDMzOworCQlicmVhazsKKwljYXNlIFFBTV82NDoKKwkJKnNpZ25hbF9zdHJlbmd0aCA9IChzbnIgPj0gMjAwMCkgPworCQkJbWluKDY1NTM1LCBzbnIgKiAyOSkgOiBzbnIgKiAyNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnNpZ25hbF9zdHJlbmd0aCA9IDA7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2RlbW9kX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBteGwxMTFzZl9kZW1vZF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCW14bF9kYmcoIigpIik7CisjaWYgMAorCXAtPmludmVyc2lvbiA9IC8qIEZJWE1FICovID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKKyNlbmRpZgorCWlmIChmZS0+b3BzLnR1bmVyX29wcy5nZXRfYmFuZHdpZHRoKQorCQlmZS0+b3BzLnR1bmVyX29wcy5nZXRfYmFuZHdpZHRoKGZlLCAmcC0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3kpCisJCWZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3koZmUsICZwLT5mcmVxdWVuY3kpOworCW14bDF4MXNmX2RlbW9kX2dldF90cHNfY29kZV9yYXRlKHN0YXRlLCAmcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19jb2RlX3JhdGUoc3RhdGUsICZwLT51Lm9mZG0uY29kZV9yYXRlX0xQKTsKKwlteGwxeDFzZl9kZW1vZF9nZXRfdHBzX2NvbnN0ZWxsYXRpb24oc3RhdGUsICZwLT51Lm9mZG0uY29uc3RlbGxhdGlvbik7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9mZnRfbW9kZShzdGF0ZSwKKwkJCQkJICAgICAgJnAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19ndWFyZF9pbnRlcnZhbChzdGF0ZSwKKwkJCQkJICAgICAgJnAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCk7CisJbXhsMXgxc2ZfZGVtb2RfZ2V0X3Rwc19oaWVyYXJjaHkoc3RhdGUsCisJCQkJCSAmcC0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCitpbnQgbXhsMTExc2ZfZGVtb2RfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMTAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXhsMTExc2ZfZGVtb2RfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJbXhsX2RiZygiKCkiKTsKKwlrZnJlZShzdGF0ZSk7CisJZmUtPmRlbW9kdWxhdG9yX3ByaXYgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbXhsMTExc2ZfZGVtb2Rfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lICAgICAgICAgICAgICAgPSAiTWF4TGluZWFyIE14TDExMVNGIERWQi1UIGRlbW9kdWxhdG9yIiwKKwkJLnR5cGUgICAgICAgICAgICAgICA9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluICAgICAgPSAxNzcwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICAgICAgPSA4NTgwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSAxNjY2NjYsCisJCS5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8CisJCQlGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwgRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUgorCX0sCisJLnJlbGVhc2UgICAgICAgICAgICAgID0gbXhsMTExc2ZfZGVtb2RfcmVsZWFzZSwKKyNpZiAwCisJLmluaXQgICAgICAgICAgICAgICAgID0gbXhsMTExc2ZfaW5pdCwKKwkuaTJjX2dhdGVfY3RybCAgICAgICAgPSBteGwxMTFzZl9pMmNfZ2F0ZV9jdHJsLAorI2VuZGlmCisJLnNldF9mcm9udGVuZCAgICAgICAgID0gbXhsMTExc2ZfZGVtb2Rfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IG14bDExMXNmX2RlbW9kX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBteGwxMTFzZl9kZW1vZF9nZXRfdHVuZV9zZXR0aW5ncywKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3N0YXR1cywKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBteGwxMTFzZl9kZW1vZF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX2JlciwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBteGwxMTFzZl9kZW1vZF9yZWFkX3VjYmxvY2tzLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqbXhsMTExc2ZfZGVtb2RfYXR0YWNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfZGVtb2RfY29uZmlnICpjZmcpCit7CisJc3RydWN0IG14bDExMXNmX2RlbW9kX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisKKwlteGxfZGJnKCIoKSIpOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfZGVtb2Rfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZS0+bXhsX3N0YXRlID0gbXhsX3N0YXRlOworCXN0YXRlLT5jZmcgPSBjZmc7CisKKwltZW1jcHkoJnN0YXRlLT5mZS5vcHMsICZteGwxMTFzZl9kZW1vZF9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCisJc3RhdGUtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gJnN0YXRlLT5mZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG14bDExMXNmX2RlbW9kX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWF4TGluZWFyIE14TDExMVNGIERWQi1UIGRlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWRlbW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyNzA2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZGVtb2QuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogIG14bDExMXNmLWRlbW9kLmggLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YgRFZCLVQgZGVtb2R1bGF0b3IKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01YTDExMVNGX0RFTU9EX0hfXworI2RlZmluZSBfX01YTDExMVNGX0RFTU9EX0hfXworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAibXhsMTExc2YuaCIKKworc3RydWN0IG14bDExMXNmX2RlbW9kX2NvbmZpZyB7CisJaW50ICgqcmVhZF9yZWcpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4ICpkYXRhKTsKKwlpbnQgKCp3cml0ZV9yZWcpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4IGRhdGEpOworCWludCAoKnByb2dyYW1fcmVncykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSAgICBzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyAqY3RybF9yZWdfaW5mbyk7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1VTQl9NWEwxMTFTRikgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVVNCX01YTDExMVNGX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpteGwxMTFzZl9kZW1vZF9hdHRhY2goc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl9kZW1vZF9jb25maWcgKmNmZyk7CisjZWxzZQorc3RhdGljIGlubGluZQorc3RydWN0IGR2Yl9mcm9udGVuZCAqbXhsMTExc2ZfZGVtb2RfYXR0YWNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfZGVtb2RfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX0RWQl9VU0JfTVhMMTExU0YgKi8KKworI2VuZGlmIC8qIF9fTVhMMTExU0ZfREVNT0RfSF9fICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTIxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWdwaW8uYwpAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqICBteGwxMTFzZi1ncGlvLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLWdwaW8uaCIKKyNpbmNsdWRlICJteGwxMTFzZi1pMmMuaCIKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18wIDB4ODQKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18xIDB4ODkKKyNkZWZpbmUgTVhMX0dQSU9fTVVYX1JFR18yIDB4ODIKKworI2RlZmluZSBNWExfR1BJT19ESVJfSU5QVVQgIDAKKyNkZWZpbmUgTVhMX0dQSU9fRElSX09VVFBVVCAxCisKKworc3RhdGljIGludCBteGwxMTFzZl9zZXRfZ3BvX3N0YXRlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IHBpbiwgdTggdmFsKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnX2FkdigiKCVkLCAlZCkiLCBwaW4sIHZhbCk7CisKKwlpZiAoKHBpbiA+IDApICYmIChwaW4gPCA4KSkgeworCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgMHgxOSwgJnRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQl0bXAgJj0gfigxIDw8IChwaW4gLSAxKSk7CisJCXRtcCB8PSAodmFsIDw8IChwaW4gLSAxKSk7CisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxOSwgdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJfSBlbHNlIGlmIChwaW4gPD0gMTApIHsKKwkJaWYgKHBpbiA9PSAwKQorCQkJcGluICs9IDc7CisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDMwLCAmdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCXRtcCAmPSB+KDEgPDwgKHBpbiAtIDMpKTsKKwkJdG1wIHw9ICh2YWwgPDwgKHBpbiAtIDMpKTsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCAweDMwLCB0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9nZXRfZ3BpX3N0YXRlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IHBpbiwgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCXU4IHRtcDsKKworCW14bF9kZWJ1ZygiKDB4JTAyeCkiLCBwaW4pOworCisJKnZhbCA9IDA7CisKKwlzd2l0Y2ggKHBpbikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MjMsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gKHBpbiArIDQpKSAmIDB4MDE7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJY2FzZSA2OgorCWNhc2UgNzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MmYsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gcGluKSAmIDB4MDE7CisJCWJyZWFrOworCWNhc2UgODoKKwljYXNlIDk6CisJY2FzZSAxMDoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MjIsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJKnZhbCA9ICh0bXAgPj4gKHBpbiAtIDMpKSAmIDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOyAvKiBpbnZhbGlkIHBpbiAqLworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG14bF9ncGlvX2NmZyB7CisJdTggcGluOworCXU4IGRpcjsKKwl1OCB2YWw7Cit9OworCitzdGF0aWMgaW50IG14bDExMXNmX2NvbmZpZ19ncGlvX3BpbnMoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgIHN0cnVjdCBteGxfZ3Bpb19jZmcgKmdwaW9fY2ZnKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnX2FkdigiKCVkLCAlZCkiLCBncGlvX2NmZy0+cGluLCBncGlvX2NmZy0+ZGlyKTsKKworCXN3aXRjaCAoZ3Bpb19jZmctPnBpbikgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIE1YTF9HUElPX01VWF9SRUdfMCwgJnRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQl0bXAgJj0gfigxIDw8IChncGlvX2NmZy0+cGluICsgNCkpOworCQl0bXAgfD0gKGdwaW9fY2ZnLT5kaXIgPDwgKGdwaW9fY2ZnLT5waW4gKyA0KSk7CisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgTVhMX0dQSU9fTVVYX1JFR18wLCB0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgTVhMX0dQSU9fTVVYX1JFR18xLCAmdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCXRtcCAmPSB+KDEgPDwgZ3Bpb19jZmctPnBpbik7CisJCXRtcCB8PSAoZ3Bpb19jZmctPmRpciA8PCBncGlvX2NmZy0+cGluKTsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBNWExfR1BJT19NVVhfUkVHXzEsIHRtcCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCQlicmVhazsKKwljYXNlIDg6CisJY2FzZSA5OgorCWNhc2UgMTA6CisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBNWExfR1BJT19NVVhfUkVHXzIsICZ0bXApOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwkJdG1wICY9IH4oMSA8PCAoZ3Bpb19jZmctPnBpbiAtIDMpKTsKKwkJdG1wIHw9IChncGlvX2NmZy0+ZGlyIDw8IChncGlvX2NmZy0+cGluIC0gMykpOworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIE1YTF9HUElPX01VWF9SRUdfMiwgdG1wKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOyAvKiBpbnZhbGlkIHBpbiAqLworCX0KKworCXJldCA9IChNWExfR1BJT19ESVJfT1VUUFVUID09IGdwaW9fY2ZnLT5kaXIpID8KKwkJbXhsMTExc2Zfc2V0X2dwb19zdGF0ZShzdGF0ZSwKKwkJCQkgICAgICAgZ3Bpb19jZmctPnBpbiwgZ3Bpb19jZmctPnZhbCkgOgorCQlteGwxMTFzZl9nZXRfZ3BpX3N0YXRlKHN0YXRlLAorCQkJCSAgICAgICBncGlvX2NmZy0+cGluLCAmZ3Bpb19jZmctPnZhbCk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9od19kb19zZXRfZ3BpbyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgIGludCBncGlvLCBpbnQgZGlyZWN0aW9uLCBpbnQgdmFsKQoreworCXN0cnVjdCBteGxfZ3Bpb19jZmcgZ3Bpb19jb25maWcgPSB7CisJCS5waW4gPSBncGlvLAorCQkuZGlyID0gZGlyZWN0aW9uLAorCQkudmFsID0gdmFsLAorCX07CisKKwlteGxfZGVidWcoIiglZCwgJWQsICVkKSIsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKworCXJldHVybiBteGwxMTFzZl9jb25maWdfZ3Bpb19waW5zKHN0YXRlLCAmZ3Bpb19jb25maWcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUElOX01VWF9NUEVHX01PREVfTUFTSyAgICAgICAgICAweDQwICAgLyogMHgxNyA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLICAgICAgICAweDAxICAgLyogMHgxOCA8MD4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVHX1NFUl9FTl9NQVNLICAgICAgICAweDAyICAgLyogMHgxOCA8MT4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEdfSU5fTVVYX01BU0sgICAgICAgICAweDgwICAgLyogMHgzRCA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSyAgICAgICAweDA0ICAgLyogMHgxMiA8Mj4gKi8KKyNkZWZpbmUgUElOX01VWF9JMlNfRU5BQkxFX01BU0sgICAgICAgICAweDQwICAgLyogMHgxNSA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9TUElfTU9ERV9NQVNLICAgICAgICAgICAweDEwICAgLyogMHgzRCA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSyAgICAgICAweDEwICAgLyogMHg4MiA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0sgICAgICAweDIwICAgLyogMHg4MiA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NRFZBTF9FTl9DVFJMX01BU0sgICAgICAweDQwICAgLyogMHg4MiA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NUEVSUl9FTl9DVFJMX01BU0sgICAgICAweDgwICAgLyogMHg4MiA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzBfTUFTSyAgICAgICAgICAweDEwICAgLyogMHg4NCA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzFfTUFTSyAgICAgICAgICAweDIwICAgLyogMHg4NCA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzJfTUFTSyAgICAgICAgICAweDQwICAgLyogMHg4NCA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzNfTUFTSyAgICAgICAgICAweDgwICAgLyogMHg4NCA8Nz4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzRfTUFTSyAgICAgICAgICAweDEwICAgLyogMHg4OSA8ND4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzVfTUFTSyAgICAgICAgICAweDIwICAgLyogMHg4OSA8NT4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzZfTUFTSyAgICAgICAgICAweDQwICAgLyogMHg4OSA8Nj4gKi8KKyNkZWZpbmUgUElOX01VWF9NREFUX0VOXzdfTUFTSyAgICAgICAgICAweDgwICAgLyogMHg4OSA8Nz4gKi8KKworaW50IG14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICBlbnVtIG14bDExMXNmX211eF9jb25maWcgcGluX211eF9jb25maWcpCit7CisJdTggcjEyLCByMTUsIHIxNywgcjE4LCByM0QsIHI4Miwgcjg0LCByODk7CisJaW50IHJldDsKKworCW14bF9kZWJ1ZygiKCVkKSIsIHBpbl9tdXhfY29uZmlnKTsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE3LCAmcjE3KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE4LCAmcjE4KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDEyLCAmcjEyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDE1LCAmcjE1KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDgyLCAmcjgyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDg0LCAmcjg0KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDg5LCAmcjg5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCAweDNELCAmcjNEKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoIChwaW5fbXV4X2NvbmZpZykgeworCWNhc2UgUElOX01VWF9UU19PVVRfUEFSQUxMRUw6CisJCS8qIG1wZWdfbW9kZSA9IDEgKi8KKwkJcjE3IHw9IFBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMSAqLworCQlyMTggfD0gUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAxICovCisJCXI4MiB8PSBQSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMSAqLworCQlyODIgfD0gUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHhGICovCisJCXI4NCB8PSAweEYwOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4RiAqLworCQlyODkgfD0gMHhGMDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX1RTX09VVF9TRVJJQUw6CisJCS8qIG1wZWdfbW9kZSA9IDEgKi8KKwkJcjE3IHw9IFBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAxICovCisJCXI4MiB8PSBQSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDEgKi8KKwkJcjgyIHw9IFBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMSAqLworCQlyODIgfD0gUElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHhGICovCisJCXI4NCB8PSAweEYwOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4RiAqLworCQlyODkgfD0gMHhGMDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX0dQSU9fTU9ERToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1NFUl9FTl9NQVNLOworCQkvKiBtcGdfaW5fbXV4ID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAwICovCisJCXIxMiAmPSB+UElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSzsKKwkJLyogaTJzX2VuYWJsZSA9IDAgKi8KKwkJcjE1ICY9IH5QSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9TUElfTU9ERV9NQVNLOworCQkvKiBtY2xrX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBlcnJfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01EVkFMX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBzeW5fZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QU1lOX0VOX0NUUkxfTUFTSzsKKwkJLyogbWRhdF9lbl9jdHJsWzM6MF0gPSAweDAgKi8KKwkJcjg0ICY9IDB4MEY7CisJCS8qIG1kYXRfZW5fY3RybFs3OjRdID0gMHgwICovCisJCXI4OSAmPSAweDBGOworCQlicmVhazsKKwljYXNlIFBJTl9NVVhfVFNfU0VSSUFMX0lOX01PREVfMDoKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19TRVJJQUxfSU5fTU9ERV8xOgorCQkvKiBtcGVnX21vZGUgPSAwICovCisJCXIxNyAmPSB+UElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDEgKi8KKwkJcjE4IHw9IFBJTl9NVVhfTVBFR19TRVJfRU5fTUFTSzsKKwkJLyogbXBnX2luX211eCA9IDEgKi8KKwkJcjNEIHw9IFBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAwICovCisJCXIxMiAmPSB+UElOX01VWF9CVDY1Nl9FTkFCTEVfTUFTSzsKKwkJLyogaTJzX2VuYWJsZSA9IDAgKi8KKwkJcjE1ICY9IH5QSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9TUElfTU9ERV9NQVNLOworCQkvKiBtY2xrX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NQ0xLX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBlcnJfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QRVJSX0VOX0NUUkxfTUFTSzsKKwkJLyogbWR2YWxfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01EVkFMX0VOX0NUUkxfTUFTSzsKKwkJLyogbXBzeW5fZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01QU1lOX0VOX0NUUkxfTUFTSzsKKwkJLyogbWRhdF9lbl9jdHJsWzM6MF0gPSAweDAgKi8KKwkJcjg0ICY9IDB4MEY7CisJCS8qIG1kYXRfZW5fY3RybFs3OjRdID0gMHgwICovCisJCXI4OSAmPSAweDBGOworCQlicmVhazsKKwljYXNlIFBJTl9NVVhfVFNfU1BJX0lOX01PREVfMToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAxICovCisJCXIxOCB8PSBQSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX01QR19JTl9NVVhfTUFTSzsKKwkJLyogYnQ2NTZfZW5hYmxlID0gMCAqLworCQlyMTIgJj0gflBJTl9NVVhfQlQ2NTZfRU5BQkxFX01BU0s7CisJCS8qIGkyc19lbmFibGUgPSAxICovCisJCXIxNSB8PSBQSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19TUElfSU5fTU9ERV8wOgorCQkvKiBtcGVnX21vZGUgPSAwICovCisJCXIxNyAmPSB+UElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDEgKi8KKwkJcjE4IHw9IFBJTl9NVVhfTVBFR19TRVJfRU5fTUFTSzsKKwkJLyogbXBnX2luX211eCA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX01QR19JTl9NVVhfTUFTSzsKKwkJLyogYnQ2NTZfZW5hYmxlID0gMCAqLworCQlyMTIgJj0gflBJTl9NVVhfQlQ2NTZfRU5BQkxFX01BU0s7CisJCS8qIGkyc19lbmFibGUgPSAxICovCisJCXIxNSB8PSBQSU5fTVVYX0kyU19FTkFCTEVfTUFTSzsKKwkJLyogc3BpX21vZGUgPSAxICovCisJCXIzRCB8PSBQSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9UU19QQVJBTExFTF9JTjoKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMSAqLworCQlyMTggfD0gUElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCWNhc2UgUElOX01VWF9CVDY1Nl9JMlNfTU9ERToKKwkJLyogbXBlZ19tb2RlID0gMCAqLworCQlyMTcgJj0gflBJTl9NVVhfTVBFR19NT0RFX01BU0s7CisJCS8qIG1wZWdfcGFyX2VuID0gMCAqLworCQlyMTggJj0gflBJTl9NVVhfTVBFR19QQVJfRU5fTUFTSzsKKwkJLyogbXBlZ19zZXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1NFUl9FTl9NQVNLOworCQkvKiBtcGdfaW5fbXV4ID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfTVBHX0lOX01VWF9NQVNLOworCQkvKiBidDY1Nl9lbmFibGUgPSAxICovCisJCXIxMiB8PSBQSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMSAqLworCQlyMTUgfD0gUElOX01VWF9JMlNfRU5BQkxFX01BU0s7CisJCS8qIHNwaV9tb2RlID0gMCAqLworCQlyM0QgJj0gflBJTl9NVVhfU1BJX01PREVfTUFTSzsKKwkJLyogbWNsa19lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTUNMS19FTl9DVFJMX01BU0s7CisJCS8qIG1wZXJyX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NUEVSUl9FTl9DVFJMX01BU0s7CisJCS8qIG1kdmFsX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NRFZBTF9FTl9DVFJMX01BU0s7CisJCS8qIG1wc3luX2VuX2N0cmwgPSAwICovCisJCXI4MiAmPSB+UElOX01VWF9NUFNZTl9FTl9DVFJMX01BU0s7CisJCS8qIG1kYXRfZW5fY3RybFszOjBdID0gMHgwICovCisJCXI4NCAmPSAweDBGOworCQkvKiBtZGF0X2VuX2N0cmxbNzo0XSA9IDB4MCAqLworCQlyODkgJj0gMHgwRjsKKwkJYnJlYWs7CisJY2FzZSBQSU5fTVVYX0RFRkFVTFQ6CisJZGVmYXVsdDoKKwkJLyogbXBlZ19tb2RlID0gMSAqLworCQlyMTcgfD0gUElOX01VWF9NUEVHX01PREVfTUFTSzsKKwkJLyogbXBlZ19wYXJfZW4gPSAwICovCisJCXIxOCAmPSB+UElOX01VWF9NUEVHX1BBUl9FTl9NQVNLOworCQkvKiBtcGVnX3Nlcl9lbiA9IDAgKi8KKwkJcjE4ICY9IH5QSU5fTVVYX01QRUdfU0VSX0VOX01BU0s7CisJCS8qIG1wZ19pbl9tdXggPSAwICovCisJCXIzRCAmPSB+UElOX01VWF9NUEdfSU5fTVVYX01BU0s7CisJCS8qIGJ0NjU2X2VuYWJsZSA9IDAgKi8KKwkJcjEyICY9IH5QSU5fTVVYX0JUNjU2X0VOQUJMRV9NQVNLOworCQkvKiBpMnNfZW5hYmxlID0gMCAqLworCQlyMTUgJj0gflBJTl9NVVhfSTJTX0VOQUJMRV9NQVNLOworCQkvKiBzcGlfbW9kZSA9IDAgKi8KKwkJcjNEICY9IH5QSU5fTVVYX1NQSV9NT0RFX01BU0s7CisJCS8qIG1jbGtfZW5fY3RybCA9IDAgKi8KKwkJcjgyICY9IH5QSU5fTVVYX01DTEtfRU5fQ1RSTF9NQVNLOworCQkvKiBtcGVycl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBFUlJfRU5fQ1RSTF9NQVNLOworCQkvKiBtZHZhbF9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTURWQUxfRU5fQ1RSTF9NQVNLOworCQkvKiBtcHN5bl9lbl9jdHJsID0gMCAqLworCQlyODIgJj0gflBJTl9NVVhfTVBTWU5fRU5fQ1RSTF9NQVNLOworCQkvKiBtZGF0X2VuX2N0cmxbMzowXSA9IDB4MCAqLworCQlyODQgJj0gMHgwRjsKKwkJLyogbWRhdF9lbl9jdHJsWzc6NF0gPSAweDAgKi8KKwkJcjg5ICY9IDB4MEY7CisJCWJyZWFrOworCX0KKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxNywgcjE3KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxOCwgcjE4KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxMiwgcjEyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgxNSwgcjE1KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4MiwgcjgyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4NCwgcjg0KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHg4OSwgcjg5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgzRCwgcjNEKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaHdfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpCit7CisJcmV0dXJuIG14bDExMXNmX2h3X2RvX3NldF9ncGlvKHN0YXRlLCBncGlvLCBNWExfR1BJT19ESVJfT1VUUFVULCB2YWwpOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2h3X2dwaW9faW5pdGlhbGl6ZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IGdwaW92YWwgPSAweDA3OyAvKiB3cml0ZSBwcm90ZWN0IGVuYWJsZWQsIHNpZ25hbCBMRURzIG9mZiAqLworCWludCBpLCByZXQ7CisKKwlteGxfZGVidWcoIigpIik7CisKKwlmb3IgKGkgPSAzOyBpIDwgODsgaSsrKSB7CisJCXJldCA9IG14bDExMXNmX2h3X3NldF9ncGlvKHN0YXRlLCBpLCAoZ3Bpb3ZhbCA+PiBpKSAmIDB4MDEpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUENBOTUzNF9JMkNfQUREUiAoMHg0MCA+PiAxKQorc3RhdGljIGludCBwY2E5NTM0X3NldF9ncGlvKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBncGlvLCBpbnQgdmFsKQoreworCXU4IHdbMl0gPSB7IDEsIDAgfTsKKwl1OCByID0gMDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJeyAuYWRkciA9IFBDQTk1MzRfSTJDX0FERFIsCisJCSAgLmZsYWdzID0gMCwgLmJ1ZiA9IHcsIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSBQQ0E5NTM0X0kyQ19BRERSLAorCQkgIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJnIsIC5sZW4gPSAxIH0sCisJfTsKKworCW14bF9kZWJ1ZygiKCVkLCAlZCkiLCBncGlvLCB2YWwpOworCisJLyogcmVhZCBjdXJyZW50IEdQSU8gbGV2ZWxzIGZyb20gZmxpcC1mbG9wICovCisJaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsIG1zZywgMik7CisKKwkvKiBwcmVwYXJlIHdyaXRlIGJ1ZmZlciB3aXRoIGN1cnJlbnQgR1BJTyBsZXZlbHMgKi8KKwltc2dbMF0ubGVuID0gMjsKKyNpZiAwCisJd1swXSA9IDE7CisjZW5kaWYKKwl3WzFdID0gcjsKKworCS8qIGNsZWFyIHRoZSBkZXNpcmVkIEdQSU8gKi8KKwl3WzFdICY9IH4oMSA8PCBncGlvKTsKKworCS8qIHNldCB0aGUgZGVzaXJlZCBHUElPIHZhbHVlICovCisJd1sxXSB8PSAoKHZhbCA/IDEgOiAwKSA8PCBncGlvKTsKKworCS8qIHdyaXRlIG5ldyBHUElPIGxldmVscyB0byBmbGlwLWZsb3AgKi8KKwlpMmNfdHJhbnNmZXIoJnN0YXRlLT5kLT5pMmNfYWRhcCwgJm1zZ1swXSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2E5NTM0X2luaXRfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IHdbMl0gPSB7IDEsIDB4MDcgfTsgLyogd3JpdGUgcHJvdGVjdCBlbmFibGVkLCBzaWduYWwgTEVEcyBvZmYgKi8KKworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBQQ0E5NTM0X0kyQ19BRERSLAorCQkuZmxhZ3MgPSAwLCAuYnVmID0gdywgLmxlbiA9IDIKKwl9OworCisJbXhsX2RlYnVnKCIoKSIpOworCisJaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsICZtc2csIDEpOworCisJLyogY29uZmlndXJlIGFsbCBwaW5zIGFzIG91dHB1dHMgKi8KKwl3WzBdID0gMzsKKwl3WzFdID0gMDsKKworCWkyY190cmFuc2Zlcigmc3RhdGUtPmQtPmkyY19hZGFwLCAmbXNnLCAxKTsKKworCXJldHVybiAwOworfQorCitpbnQgbXhsMTExc2Zfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpCit7CisJbXhsX2RlYnVnKCIoJWQsICVkKSIsIGdwaW8sIHZhbCk7CisKKwlzd2l0Y2ggKHN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIpIHsKKwlkZWZhdWx0OgorCQlteGxfcHJpbnRrKEtFUk5fRVJSLAorCQkJICAgImdwaW9fcG9ydF9leHBhbmRlciB1bmRlZmluZWQsIGFzc3VtaW5nIFBDQTk1MzQiKTsKKwkJLyogZmFsbC10aHJ1ICovCisJY2FzZSBteGwxMTFzZl9QQ0E5NTM0OgorCQlyZXR1cm4gcGNhOTUzNF9zZXRfZ3BpbyhzdGF0ZSwgZ3BpbywgdmFsKTsKKwljYXNlIG14bDExMXNmX2dwaW9faHc6CisJCXJldHVybiBteGwxMTFzZl9od19zZXRfZ3BpbyhzdGF0ZSwgZ3BpbywgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfcHJvYmVfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisJdTggdyA9IDE7CisJdTggciA9IDA7CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsgLmZsYWdzID0gMCwgICAgICAgIC5idWYgPSAmdywgLmxlbiA9IDEgfSwKKwkJeyAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9ICZyLCAubGVuID0gMSB9LAorCX07CisKKwlteGxfZGVidWcoIigpIik7CisKKwltc2dbMF0uYWRkciA9IDB4NzAgPj4gMTsKKwltc2dbMV0uYWRkciA9IDB4NzAgPj4gMTsKKworCS8qIHJlYWQgY3VycmVudCBHUElPIGxldmVscyBmcm9tIGZsaXAtZmxvcCAqLworCXJldCA9IGkyY190cmFuc2Zlcigmc3RhdGUtPmQtPmkyY19hZGFwLCBtc2csIDIpOworCWlmIChyZXQgPT0gMikgeworCQlzdGF0ZS0+cG9ydF9leHBhbmRlcl9hZGRyID0gbXNnWzBdLmFkZHI7CisJCXN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIgPSBteGwxMTFzZl9QQ0E5NTM0OworCQlteGxfZGVidWcoImZvdW5kIHBvcnQgZXhwYW5kZXIgYXQgMHglMDJ4IiwKKwkJCSAgc3RhdGUtPnBvcnRfZXhwYW5kZXJfYWRkcik7CisJCXJldHVybiAwOworCX0KKworCW1zZ1swXS5hZGRyID0gMHg0MCA+PiAxOworCW1zZ1sxXS5hZGRyID0gMHg0MCA+PiAxOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZzdGF0ZS0+ZC0+aTJjX2FkYXAsIG1zZywgMik7CisJaWYgKHJldCA9PSAyKSB7CisJCXN0YXRlLT5wb3J0X2V4cGFuZGVyX2FkZHIgPSBtc2dbMF0uYWRkcjsKKwkJc3RhdGUtPmdwaW9fcG9ydF9leHBhbmRlciA9IG14bDExMXNmX1BDQTk1MzQ7CisJCW14bF9kZWJ1ZygiZm91bmQgcG9ydCBleHBhbmRlciBhdCAweCUwMngiLAorCQkJICBzdGF0ZS0+cG9ydF9leHBhbmRlcl9hZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCXN0YXRlLT5wb3J0X2V4cGFuZGVyX2FkZHIgPSAweGZmOworCXN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIgPSBteGwxMTFzZl9ncGlvX2h3OworCW14bF9kZWJ1ZygidXNpbmcgaGFyZHdhcmUgZ3BpbyIpOworCXJldHVybiAwOworfQorCitpbnQgbXhsMTExc2ZfaW5pdF9wb3J0X2V4cGFuZGVyKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJaWYgKDB4MDAgPT0gc3RhdGUtPnBvcnRfZXhwYW5kZXJfYWRkcikKKwkJbXhsMTExc2ZfcHJvYmVfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisKKwlzd2l0Y2ggKHN0YXRlLT5ncGlvX3BvcnRfZXhwYW5kZXIpIHsKKwlkZWZhdWx0OgorCQlteGxfcHJpbnRrKEtFUk5fRVJSLAorCQkJICAgImdwaW9fcG9ydF9leHBhbmRlciB1bmRlZmluZWQsIGFzc3VtaW5nIFBDQTk1MzQiKTsKKwkJLyogZmFsbC10aHJ1ICovCisJY2FzZSBteGwxMTFzZl9QQ0E5NTM0OgorCQlyZXR1cm4gcGNhOTUzNF9pbml0X3BvcnRfZXhwYW5kZXIoc3RhdGUpOworCWNhc2UgbXhsMTExc2ZfZ3Bpb19odzoKKwkJcmV0dXJuIG14bDExMXNmX2h3X2dwaW9faW5pdGlhbGl6ZShzdGF0ZSk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IG14bDExMXNmX2dwaW9fbW9kZV9zd2l0Y2goc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IG1vZGUpCit7CisvKglHUE86CisgKgkzIC0gQVRTQy9NSCMgICB8IDEgPSBBVFNDIHRyYW5zcG9ydCwgMCA9IE1IIHRyYW5zcG9ydCAgICAgIHwgZGVmYXVsdCAwCisgKgk0IC0gQVRTQ19SU1QjIyB8IDEgPSBBVFNDIGVuYWJsZSwgMCA9IEFUU0MgUmVzZXQgICAgICAgICAgIHwgZGVmYXVsdCAwCisgKgk1IC0gQVRTQ19FTiAgICB8IDEgPSBBVFNDIHBvd2VyIGVuYWJsZSwgMCA9IEFUU0MgcG93ZXIgb2ZmIHwgZGVmYXVsdCAwCisgKgk2IC0gTUhfUkVTRVQjICB8IDEgPSBNSCBlbmFibGUsIDAgPSBNSCBSZXNldCAgICAgICAgICAgICAgIHwgZGVmYXVsdCAwCisgKgk3IC0gTUhfRU4gICAgICB8IDEgPSBNSCBwb3dlciBlbmFibGUsIDAgPSBNSCBwb3dlciBvZmYgICAgIHwgZGVmYXVsdCAwCisgKi8KKwlteGxfZGVidWcoIiglZCkiLCBtb2RlKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTVhMMTExU0ZfR1BJT19NT0RfTUg6CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA0LCAwKTsKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDUsIDApOworCQltc2xlZXAoNTApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgNywgMSk7CisJCW1zbGVlcCg1MCk7CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA2LCAxKTsKKwkJbXNsZWVwKDUwKTsKKworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgMywgMCk7CisJCWJyZWFrOworCWNhc2UgTVhMMTExU0ZfR1BJT19NT0RfQVRTQzoKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDYsIDApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgNywgMCk7CisJCW1zbGVlcCg1MCk7CisJCW14bDExMXNmX3NldF9ncGlvKHN0YXRlLCA1LCAxKTsKKwkJbXNsZWVwKDUwKTsKKwkJbXhsMTExc2Zfc2V0X2dwaW8oc3RhdGUsIDQsIDEpOworCQltc2xlZXAoNTApOworCQlteGwxMTFzZl9zZXRfZ3BpbyhzdGF0ZSwgMywgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIERWQlQgLyBTVEFOREJZICovCisJCW14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMGY1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtZ3Bpby5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgbXhsMTExc2YtZ3Bpby5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfR1BJT19IXworI2RlZmluZSBfRFZCX1VTQl9NWEwxMTFTRl9HUElPX0hfCisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCitpbnQgbXhsMTExc2Zfc2V0X2dwaW8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgaW50IGdwaW8sIGludCB2YWwpOworaW50IG14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKKworI2RlZmluZSBNWEwxMTFTRl9HUElPX01PRF9EVkJUCTAKKyNkZWZpbmUgTVhMMTExU0ZfR1BJT19NT0RfTUgJMQorI2RlZmluZSBNWEwxMTFTRl9HUElPX01PRF9BVFNDCTIKK2ludCBteGwxMTFzZl9ncGlvX21vZGVfc3dpdGNoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCBtb2RlKTsKKworZW51bSBteGwxMTFzZl9tdXhfY29uZmlnIHsKKwlQSU5fTVVYX0RFRkFVTFQgPSAwLAorCVBJTl9NVVhfVFNfT1VUX1BBUkFMTEVMLAorCVBJTl9NVVhfVFNfT1VUX1NFUklBTCwKKwlQSU5fTVVYX0dQSU9fTU9ERSwKKwlQSU5fTVVYX1RTX1NFUklBTF9JTl9NT0RFXzAsCisJUElOX01VWF9UU19TRVJJQUxfSU5fTU9ERV8xLAorCVBJTl9NVVhfVFNfU1BJX0lOX01PREVfMCwKKwlQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEsCisJUElOX01VWF9UU19QQVJBTExFTF9JTiwKKwlQSU5fTVVYX0JUNjU2X0kyU19NT0RFLAorfTsKKworaW50IG14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICBlbnVtIG14bDExMXNmX211eF9jb25maWcgcGluX211eF9jb25maWcpOworCisjZW5kaWYgLyogX0RWQl9VU0JfTVhMMTExU0ZfR1BJT19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MzQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtaTJjLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiAgbXhsMTExc2YtaTJjLmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLWkyYy5oIgorI2luY2x1ZGUgIm14bDExMXNmLmgiCisKKy8qIFNXLUkyQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNXX0kyQ19BRERSCQkweDFhCisjZGVmaW5lIFNXX0kyQ19FTgkJMHgwMgorI2RlZmluZSBTV19TQ0xfT1VUCQkweDA0CisjZGVmaW5lIFNXX1NEQV9PVVQJCTB4MDgKKyNkZWZpbmUgU1dfU0RBX0lOCQkweDA0CisKKyNkZWZpbmUgU1dfSTJDX0JVU1lfQUREUgkweDJmCisjZGVmaW5lIFNXX0kyQ19CVVNZCQkweDAyCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2JpdGJhbmdfc2VuZGJ5dGUoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkJIHU4IGJ5dGUpCit7CisJaW50IGksIHJldDsKKwl1OCBkYXRhID0gMDsKKworCW14bF9pMmMoIigweCUwMngpIiwgYnl0ZSk7CisKKwlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgU1dfSTJDX0JVU1lfQUREUiwgJmRhdGEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisKKwkJZGF0YSA9IChieXRlICYgKDB4ODAgPj4gaSkpID8gU1dfU0RBX09VVCA6IDA7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBkYXRhKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBkYXRhIHwgU1dfU0NMX09VVCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJCSAweDEwIHwgU1dfSTJDX0VOIHwgZGF0YSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCX0KKworCS8qIGxhc3QgYml0IHdhcyAwIHNvIHdlIG5lZWQgdG8gcmVsZWFzZSBTREEgKi8KKwlpZiAoIShieXRlICYgMSkpIHsKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TREFfT1VUKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisJfQorCisJLyogQ0xLIGhpZ2ggZm9yIEFDSyByZWFkYmFjayAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBTV19JMkNfQlVTWV9BRERSLCAmZGF0YSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIGRyb3AgdGhlIENMSyBhZnRlciBnZXR0aW5nIEFDSywgU0RBIHdpbGwgZ28gaGlnaCByaWdodCBhd2F5ICovCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoZGF0YSAmIFNXX1NEQV9JTikKKwkJcmV0ID0gLUVJTzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfYml0YmFuZ19yZWN2Ynl0ZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCQkgdTggKnBieXRlKQoreworCWludCBpLCByZXQ7CisJdTggYnl0ZSA9IDA7CisJdTggZGF0YSA9IDA7CisKKwlteGxfaTJjKCIoKSIpOworCisJKnBieXRlID0gMDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TREFfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8CisJCQkJCSBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBTV19JMkNfQlVTWV9BRERSLCAmZGF0YSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCWlmIChkYXRhICYgU1dfU0RBX0lOKQorCQkJYnl0ZSB8PSAoMHg4MCA+PiBpKTsKKworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJKnBieXRlID0gYnl0ZTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfc3RhcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJbXhsX2kyYygiKCkiKTsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUIHwgU1dfU0RBX09VVCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7IC8qIHN0YXJ0ICovCisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfc3RvcChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisKKwlteGxfaTJjKCIoKSIpOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7IC8qIHN0b3AgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NDTF9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCSAweDEwIHwgU1dfSTJDX0VOIHwgU1dfU0NMX09VVCB8IFNXX1NEQV9PVVQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFNXX0kyQ19BRERSLAorCQkJCSAweDEwIHwgU1dfU0NMX09VVCB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2FjayhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQ7CisJdTggYiA9IDA7CisKKwlteGxfaTJjKCIoKSIpOworCisJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIFNXX0kyQ19CVVNZX0FERFIsICZiKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIHB1bGwgU0RBIGxvdyAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgU1dfSTJDX0FERFIsCisJCQkJIDB4MTAgfCBTV19JMkNfRU4gfCBTV19TQ0xfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX25hY2soc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJbXhsX2kyYygiKCkiKTsKKworCS8qIFNEQSBoaWdoIHRvIHNpZ25hbCBsYXN0IGJ5dGUgcmVhZCBmcm9tIHNsYXZlICovCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NDTF9PVVQgfCBTV19TREFfT1VUKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBTV19JMkNfQUREUiwKKwkJCQkgMHgxMCB8IFNXX0kyQ19FTiB8IFNXX1NEQV9PVVQpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDExMXNmX2kyY19zd194ZmVyX21zZyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCBpLCByZXQ7CisKKwlteGxfaTJjKCIoKSIpOworCisJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCisJCXJldCA9IG14bDExMXNmX2kyY19zdGFydChzdGF0ZSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZ290byBmYWlsOworCisJCXJldCA9IG14bDExMXNmX2kyY19iaXRiYW5nX3NlbmRieXRlKHN0YXRlLAorCQkJCQkJICAgIChtc2ctPmFkZHIgPDwgMSkgfCAweDAxKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpIHsKKwkJCW14bDExMXNmX2kyY19zdG9wKHN0YXRlKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBtc2ctPmxlbjsgaSsrKSB7CisJCQlyZXQgPSBteGwxMTFzZl9pMmNfYml0YmFuZ19yZWN2Ynl0ZShzdGF0ZSwKKwkJCQkJCQkgICAgJm1zZy0+YnVmW2ldKTsKKwkJCWlmIChteGxfZmFpbChyZXQpKSB7CisJCQkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJaWYgKGkgPCBtc2ctPmxlbiAtIDEpCisJCQkJbXhsMTExc2ZfaTJjX2FjayhzdGF0ZSk7CisJCX0KKworCQlteGwxMTFzZl9pMmNfbmFjayhzdGF0ZSk7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKworCX0gZWxzZSB7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3N0YXJ0KHN0YXRlKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQlnb3RvIGZhaWw7CisKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX2JpdGJhbmdfc2VuZGJ5dGUoc3RhdGUsCisJCQkJCQkgICAgKG1zZy0+YWRkciA8PCAxKSAmIDB4ZmUpOworCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG1zZy0+bGVuOyBpKyspIHsKKwkJCXJldCA9IG14bDExMXNmX2kyY19iaXRiYW5nX3NlbmRieXRlKHN0YXRlLAorCQkJCQkJCSAgICBtc2ctPmJ1ZltpXSk7CisJCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJCW14bDExMXNmX2kyY19zdG9wKHN0YXRlKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gdGhlIGxhc3QgdHJhbnNhY3Rpb24gKi8KKwkJbXhsMTExc2ZfaTJjX3N0b3Aoc3RhdGUpOworCX0KK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworLyogSFctSTJDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVVNCX1dSSVRFX0kyQ19DTUQgICAgIDB4OTkKKyNkZWZpbmUgVVNCX1JFQURfSTJDX0NNRCAgICAgIDB4ZGQKKyNkZWZpbmUgVVNCX0VORF9JMkNfQ01EICAgICAgIDB4ZmUKKworI2RlZmluZSBVU0JfV1JJVEVfSTJDX0NNRF9MRU4gICAyNgorI2RlZmluZSBVU0JfUkVBRF9JMkNfQ01EX0xFTiAgICAyNAorCisjZGVmaW5lIEkyQ19NVVhfUkVHICAgICAgICAgICAweDMwCisjZGVmaW5lIEkyQ19DT05UUk9MX1JFRyAgICAgICAweDAwCisjZGVmaW5lIEkyQ19TTEFWRV9BRERSX1JFRyAgICAweDA4CisjZGVmaW5lIEkyQ19EQVRBX1JFRyAgICAgICAgICAweDBjCisjZGVmaW5lIEkyQ19JTlRfU1RBVFVTX1JFRyAgICAweDEwCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJCSAgdTggaW5kZXgsIHU4ICp3ZGF0YSkKK3sKKwlpbnQgcmV0ID0gbXhsMTExc2ZfY3RybF9tc2coc3RhdGUtPmQsIHdkYXRhWzBdLAorCQkJCSAgICAmd2RhdGFbMV0sIDI1LCBOVUxMLCAwKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgdTggaW5kZXgsIHU4ICp3ZGF0YSwgdTggKnJkYXRhKQoreworCWludCByZXQgPSBteGwxMTFzZl9jdHJsX21zZyhzdGF0ZS0+ZCwgd2RhdGFbMF0sCisJCQkJICAgICZ3ZGF0YVsxXSwgMjUsIHJkYXRhLCAyNCk7CisJbXhsX2ZhaWwocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1OCBteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJdTggc3RhdHVzID0gMDsKKwl1OCBidWZbMjZdOworCisJbXhsX2kyY19hZHYoIigpIik7CisKKwlidWZbMF0gPSBVU0JfUkVBRF9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwlidWZbMl0gPSBJMkNfSU5UX1NUQVRVU19SRUc7CisJYnVmWzNdID0gMHgwMDsKKwlidWZbNF0gPSAweDAwOworCisJYnVmWzVdID0gVVNCX0VORF9JMkNfQ01EOworCisJbXhsMTExc2ZfaTJjX2dldF9kYXRhKHN0YXRlLCAwLCBidWYsIGJ1Zik7CisKKwlpZiAoYnVmWzFdICYgMHgwNCkKKwkJc3RhdHVzID0gMTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1OCBteGwxMTFzZl9pMmNfY2hlY2tfZmlmbyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXU4IHN0YXR1cyA9IDA7CisJdTggYnVmWzI2XTsKKworCW14bF9pMmMoIigpIik7CisKKwlidWZbMF0gPSBVU0JfUkVBRF9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwlidWZbMl0gPSBJMkNfTVVYX1JFRzsKKwlidWZbM10gPSAweDAwOworCWJ1Zls0XSA9IDB4MDA7CisKKwlidWZbNV0gPSBJMkNfSU5UX1NUQVRVU19SRUc7CisJYnVmWzZdID0gMHgwMDsKKwlidWZbN10gPSAweDAwOworCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKworCW14bDExMXNmX2kyY19nZXRfZGF0YShzdGF0ZSwgMCwgYnVmLCBidWYpOworCisJaWYgKDB4MDggPT0gKGJ1ZlsxXSAmIDB4MDgpKQorCQlzdGF0dXMgPSAxOworCisJaWYgKChidWZbNV0gJiAweDAyKSA9PSAweDAyKQorCQlteGxfaTJjKCIoYnVmWzVdICYgMHgwMikgPT0gMHgwMiIpOyAvKiBGSVhNRSAqLworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9pMmNfcmVhZGFnYWluKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICB1OCBjb3VudCwgdTggKnJidWYpCit7CisJdTggaTJjX3dfZGF0YVsyNl07CisJdTggaTJjX3JfZGF0YVsyNF07CisJdTggaSA9IDA7CisJdTggZmlmb19zdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJbXhsX2kyYygicmVhZCAlZCBieXRlcyIsIGNvdW50KTsKKworCXdoaWxlICgoZmlmb19zdGF0dXMgPT0gMCkgJiYgKGkrKyA8IDUpKQorCQlmaWZvX3N0YXR1cyA9IG14bDExMXNmX2kyY19jaGVja19maWZvKHN0YXRlKTsKKworCWkyY193X2RhdGFbMF0gPSAweEREOworCWkyY193X2RhdGFbMV0gPSAweDAwOworCisJZm9yIChpID0gMjsgaSA8IDI2OyBpKyspCisJCWkyY193X2RhdGFbaV0gPSAweEZFOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaTJjX3dfZGF0YVsyKyhpKjMpXSA9IDB4MEM7CisJCWkyY193X2RhdGFbMysoaSozKV0gPSAweDAwOworCQlpMmNfd19kYXRhWzQrKGkqMyldID0gMHgwMDsKKwl9CisKKwlteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RhdGUsIDAsIGkyY193X2RhdGEsIGkyY19yX2RhdGEpOworCisJLyogQ2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCWlmIChteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0YXRlKSA9PSAxKSB7CisJCW14bF9pMmMoImVycm9yISIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlyYnVmW2ldID0gaTJjX3JfZGF0YVsoaSozKSsxXTsKKwkJCW14bF9pMmMoIiUwMnhcdCAlMDJ4IiwKKwkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdLAorCQkJCWkyY19yX2RhdGFbKGkqMykrMl0pOworCQl9CisKKwkJc3RhdHVzID0gMTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIEhXSTJDNDAwIDEKK3N0YXRpYyBpbnQgbXhsMTExc2ZfaTJjX2h3X3hmZXJfbXNnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJICAgIHN0cnVjdCBpMmNfbXNnICptc2cpCit7CisJaW50IGksIGssIHJldCA9IDA7CisJdTE2IGluZGV4ID0gMDsKKwl1OCBidWZbMjZdOworCXU4IGkyY19yX2RhdGFbMjRdOworCXUxNiBibG9ja19sZW47CisJdTE2IGxlZnRfb3Zlcl9sZW47CisJdTggcmRfc3RhdHVzWzhdOworCXU4IHJldF9zdGF0dXM7CisJdTggcmVhZGJ1ZmZbMjZdOworCisJbXhsX2kyYygiYWRkcjogMHglMDJ4LCByZWFkIGJ1ZmYgbGVuOiAlZCwgd3JpdGUgYnVmZiBsZW46ICVkIiwKKwkJbXNnLT5hZGRyLCAobXNnLT5mbGFncyAmIEkyQ19NX1JEKSA/IG1zZy0+bGVuIDogMCwKKwkJKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgPyBtc2ctPmxlbiA6IDApOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMjY7IGluZGV4KyspCisJCWJ1ZltpbmRleF0gPSBVU0JfRU5EX0kyQ19DTUQ7CisKKwkvKiBjb21tYW5kIHRvIGluZGljYXRlIGRhdGEgcGF5bG9hZCBpcyBkZXN0aW5lZCBmb3IgSTJDIGludGVyZmFjZSAqLworCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwkvKiBlbmFibGUgSTJDIGludGVyZmFjZSAqLworCWJ1ZlsyXSA9IEkyQ19NVVhfUkVHOworCWJ1ZlszXSA9IDB4ODA7CisJYnVmWzRdID0gMHgwMDsKKworCS8qIGVuYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzVdID0gSTJDX01VWF9SRUc7CisJYnVmWzZdID0gMHg4MTsKKwlidWZbN10gPSAweDAwOworCisJLyogc2V0IFRpbWVvdXQgcmVnaXN0ZXIgb24gSTJDIGludGVyZmFjZSAqLworCWJ1Zls4XSA9IDB4MTQ7CisJYnVmWzldID0gMHhmZjsKKwlidWZbMTBdID0gMHgwMDsKKyNpZiAwCisJLyogZW5hYmxlIEludGVycnVwdHMgb24gSTJDIGludGVyZmFjZSAqLworCWJ1Zls4XSA9IDB4MjQ7CisJYnVmWzldID0gMHhGNzsKKwlidWZbMTBdID0gMHgwMDsKKyNlbmRpZgorCWJ1ZlsxMV0gPSAweDI0OworCWJ1ZlsxMl0gPSAweEY3OworCWJ1ZlsxM10gPSAweDAwOworCisJcmV0ID0gbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCS8qIHdyaXRlIGRhdGEgb24gSTJDIGJ1cyAqLworCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgJiYgKG1zZy0+bGVuID4gMCkpIHsKKwkJbXhsX2kyYygiJWRcdCUwMngiLCBtc2ctPmxlbiwgbXNnLT5idWZbMF0pOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgb24gSTJDIGludGVyZmFjZSB0byBpbml0aWFsaXplIEkyQyBidXMgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweDVFOworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJLyogSTJDIFNsYXZlIGRldmljZSBBZGRyZXNzICovCisJCWJ1Zls1XSA9IEkyQ19TTEFWRV9BRERSX1JFRzsKKwkJYnVmWzZdID0gKG1zZy0+YWRkcik7CisJCWJ1Zls3XSA9IDB4MDA7CisJCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwkJcmV0ID0gbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCQkvKiBjaGVjayBmb3Igc2xhdmUgZGV2aWNlIHN0YXR1cyAqLworCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJbXhsX2kyYygiTkFDSyB3cml0aW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJbXNnLT5hZGRyKTsKKwkJCS8qIGlmIE5BQ0ssIHN0b3AgSTJDIGJ1cyBhbmQgZXhpdCAqLworCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJYnVmWzNdID0gMHg0RTsKKwkJCWJ1Zls0XSA9IChIV0kyQzQwMCkgPyAweDAzIDogMHgwRDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBJMkMgaW50ZXJmYWNlIGNhbiBkbyBJMkMgb3BlcmF0aW9ucyBpbiBibG9jayBvZiA4IGJ5dGVzIG9mCisJCSAgIEkyQyBkYXRhLiBjYWxjdWxhdGlvbiB0byBmaWd1cmUgb3V0IG51bWJlciBvZiBibG9ja3Mgb2YgaTJjCisJCSAgIGRhdGEgcmVxdWlyZWQgdG8gcHJvZ3JhbSAqLworCQlibG9ja19sZW4gPSAobXNnLT5sZW4gLyA4KTsKKwkJbGVmdF9vdmVyX2xlbiA9IChtc2ctPmxlbiAlIDgpOworCQlpbmRleCA9IDA7CisKKwkJbXhsX2kyYygiYmxvY2tfbGVuICVkLCBsZWZ0X292ZXJfbGVuICVkIiwKKwkJCWJsb2NrX2xlbiwgbGVmdF9vdmVyX2xlbik7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYmxvY2tfbGVuOyBpbmRleCsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJLyogd3JpdGUgZGF0YSBvbiBJMkMgaW50ZXJmYWNlICovCisJCQkJYnVmWzIrKGkqMyldID0gSTJDX0RBVEFfUkVHOworCQkJCWJ1ZlszKyhpKjMpXSA9IG1zZy0+YnVmWyhpbmRleCo4KStpXTsKKwkJCQlidWZbNCsoaSozKV0gPSAweDAwOworCQkJfQorCisJCQlyZXQgPSBteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJCQkvKiBjaGVjayBmb3IgSTJDIE5BQ0sgc3RhdHVzICovCisJCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJCW14bF9pMmMoIk5BQ0sgd3JpdGluZyBzbGF2ZSBhZGRyZXNzICUwMngiLAorCQkJCQltc2ctPmFkZHIpOworCisJCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJCWJ1ZlszXSA9IDB4NEU7CisJCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBleGl0OworCQkJfQorCisJCX0KKworCQlpZiAobGVmdF9vdmVyX2xlbikgeworCQkJZm9yIChrID0gMDsgayA8IDI2OyBrKyspCisJCQkJYnVmW2tdID0gVVNCX0VORF9JMkNfQ01EOworCisJCQlidWZbMF0gPSAweDk5OworCQkJYnVmWzFdID0gMHgwMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCWJ1ZlsyKyhpKjMpXSA9IEkyQ19EQVRBX1JFRzsKKwkJCQlidWZbMysoaSozKV0gPSBtc2ctPmJ1ZlsoaW5kZXgqOCkraV07CisJCQkJbXhsX2kyYygiaW5kZXggPSAlZCAlZCBkYXRhICVkIiwKKwkJCQkJaW5kZXgsIGksIG1zZy0+YnVmWyhpbmRleCo4KStpXSk7CisJCQkJYnVmWzQrKGkqMyldID0gMHgwMDsKKwkJCX0KKwkJCXJldCA9IG14bDExMXNmX2kyY19zZW5kX2RhdGEoc3RhdGUsIDAsIGJ1Zik7CisKKwkJCS8qIGNoZWNrIGZvciBJMkMgTkFDSyBzdGF0dXMgKi8KKwkJCWlmIChteGwxMTFzZl9pMmNfY2hlY2tfc3RhdHVzKHN0YXRlKSA9PSAxKSB7CisJCQkJbXhsX2kyYygiTkFDSyB3cml0aW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJCW1zZy0+YWRkcik7CisKKwkJCQkvKiBpZiBOQUNLLCBzdG9wIEkyQyBidXMgYW5kIGV4aXQgKi8KKwkJCQlidWZbMl0gPSBJMkNfQ09OVFJPTF9SRUc7CisJCQkJYnVmWzNdID0gMHg0RTsKKwkJCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKKwkJfQorCisJCS8qIGlzc3VlIEkyQyBTVE9QIGFmdGVyIHdyaXRlICovCisJCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwkJYnVmWzNdID0gMHg0RTsKKwkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCisJfQorCisJLyogcmVhZCBkYXRhIGZyb20gSTJDIGJ1cyAqLworCWlmICgobXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJiAobXNnLT5sZW4gPiAwKSkgeworCQlteGxfaTJjKCJyZWFkIGJ1ZiBsZW4gJWQiLCBtc2ctPmxlbik7CisKKwkJLyogY29tbWFuZCB0byBpbmRpY2F0ZSBkYXRhIHBheWxvYWQgaXMKKwkJICAgZGVzdGluZWQgZm9yIEkyQyBpbnRlcmZhY2UgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweERGOworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJLyogSTJDIHhmZXIgbGVuZ3RoICovCisJCWJ1Zls1XSA9IDB4MTQ7CisJCWJ1Zls2XSA9IChtc2ctPmxlbiAmIDB4RkYpOworCQlidWZbN10gPSAwOworCisJCS8qIEkyQyBzbGF2ZSBkZXZpY2UgQWRkcmVzcyAqLworCQlidWZbOF0gPSBJMkNfU0xBVkVfQUREUl9SRUc7CisJCWJ1Zls5XSA9IG1zZy0+YWRkcjsKKwkJYnVmWzEwXSA9IDB4MDA7CisJCWJ1ZlsxMV0gPSBVU0JfRU5EX0kyQ19DTUQ7CisJCXJldCA9IG14bDExMXNmX2kyY19zZW5kX2RhdGEoc3RhdGUsIDAsIGJ1Zik7CisKKwkJLyogY2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJbXhsX2kyYygiTkFDSyByZWFkaW5nIHNsYXZlIGFkZHJlc3MgJTAyeCIsCisJCQkJbXNnLT5hZGRyKTsKKworCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQlidWZbMl0gPSBJMkNfQ09OVFJPTF9SRUc7CisJCQlidWZbM10gPSAweEM3OworCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIEkyQyBpbnRlcmZhY2UgY2FuIGRvIEkyQyBvcGVyYXRpb25zIGluIGJsb2NrIG9mIDggYnl0ZXMgb2YKKwkJICAgSTJDIGRhdGEuIGNhbGN1bGF0aW9uIHRvIGZpZ3VyZSBvdXQgbnVtYmVyIG9mIGJsb2NrcyBvZgorCQkgICBpMmMgZGF0YSByZXF1aXJlZCB0byBwcm9ncmFtICovCisJCWJsb2NrX2xlbiA9ICgobXNnLT5sZW4pIC8gOCk7CisJCWxlZnRfb3Zlcl9sZW4gPSAoKG1zZy0+bGVuKSAlIDgpOworCQlpbmRleCA9IDA7CisKKwkJbXhsX2kyYygiYmxvY2tfbGVuICVkLCBsZWZ0X292ZXJfbGVuICVkIiwKKwkJCWJsb2NrX2xlbiwgbGVmdF9vdmVyX2xlbik7CisKKwkJLyogY29tbWFuZCB0byByZWFkIGRhdGEgZnJvbSBJMkMgaW50ZXJmYWNlICovCisJCWJ1ZlswXSA9IFVTQl9SRUFEX0kyQ19DTUQ7CisJCWJ1ZlsxXSA9IDB4MDA7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYmxvY2tfbGVuOyBpbmRleCsrKSB7CisJCQkvKiBzZXR1cCBJMkMgcmVhZCByZXF1ZXN0IHBhY2tldCBvbiBJMkMgaW50ZXJmYWNlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJYnVmWzIrKGkqMyldID0gSTJDX0RBVEFfUkVHOworCQkJCWJ1ZlszKyhpKjMpXSA9IDB4MDA7CisJCQkJYnVmWzQrKGkqMyldID0gMHgwMDsKKwkJCX0KKworCQkJcmV0ID0gbXhsMTExc2ZfaTJjX2dldF9kYXRhKHN0YXRlLCAwLCBidWYsIGkyY19yX2RhdGEpOworCisJCQkvKiBjaGVjayBmb3IgSTJDIE5BQ0sgc3RhdHVzICovCisJCQlpZiAobXhsMTExc2ZfaTJjX2NoZWNrX3N0YXR1cyhzdGF0ZSkgPT0gMSkgeworCQkJCW14bF9pMmMoIk5BQ0sgcmVhZGluZyBzbGF2ZSBhZGRyZXNzICUwMngiLAorCQkJCQltc2ctPmFkZHIpOworCisJCQkJLyogaWYgTkFDSywgc3RvcCBJMkMgYnVzIGFuZCBleGl0ICovCisJCQkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQkJCWJ1ZlszXSA9IDB4Qzc7CisJCQkJYnVmWzRdID0gKEhXSTJDNDAwKSA/IDB4MDMgOiAweDBEOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBleGl0OworCQkJfQorCisJCQkvKiBjb3B5IGRhdGEgZnJvbSBpMmMgZGF0YSBwYXlsb2FkIHRvIHJlYWQgYnVmZmVyICovCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJcmRfc3RhdHVzW2ldID0gaTJjX3JfZGF0YVsoaSozKSsyXTsKKworCQkJCWlmIChyZF9zdGF0dXNbaV0gPT0gMHgwNCkgeworCQkJCQlpZiAoaSA8IDcpIHsKKwkJCQkJCW14bF9pMmMoImkyYyBmaWZvIGVtcHR5ISIKKwkJCQkJCQkiIEAgJWQiLCBpKTsKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KStpXSA9CisJCQkJCQkJaTJjX3JfZGF0YVsoaSozKSsxXTsKKwkJCQkJCS8qIHJlYWQgYWdhaW4gKi8KKwkJCQkJCXJldF9zdGF0dXMgPQorCQkJCQkJCW14bDExMXNmX2kyY19yZWFkYWdhaW4oCisJCQkJCQkJCXN0YXRlLCA4LShpKzEpLAorCQkJCQkJCQlyZWFkYnVmZik7CisJCQkJCQlpZiAocmV0X3N0YXR1cyA9PSAxKSB7CisJCQkJCQkJZm9yIChrID0gMDsKKwkJCQkJCQkgICAgIGsgPCA4LShpKzEpOworCQkJCQkJCSAgICAgaysrKSB7CisKKwkJCQkJbXNnLT5idWZbKGluZGV4KjgpKyhrK2krMSldID0KKwkJCQkJCXJlYWRidWZmW2tdOworCQkJCQlteGxfaTJjKCJyZWFkIGRhdGE6ICUwMnhcdCAlMDJ4IiwKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KSsoaytpKV0sCisJCQkJCQkoaW5kZXgqOCkrKGsraSkpOworCQkJCQlteGxfaTJjKCJyZWFkIGRhdGE6ICUwMnhcdCAlMDJ4IiwKKwkJCQkJCW1zZy0+YnVmWyhpbmRleCo4KSsoaytpKzEpXSwKKwkJCQkJCXJlYWRidWZmW2tdKTsKKworCQkJCQkJCX0KKwkJCQkJCQlnb3RvIHN0b3BfY29weTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbXhsX2kyYygicmVhZGFnYWluICIKKwkJCQkJCQkJIkVSUk9SISIpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJbXNnLT5idWZbKGluZGV4KjgpK2ldID0KKwkJCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbXNnLT5idWZbKGluZGV4KjgpK2ldID0KKwkJCQkJCWkyY19yX2RhdGFbKGkqMykrMV07CisJCQkJfQorCQkJfQorc3RvcF9jb3B5OgorCQkJOworCisJCX0KKworCQlpZiAobGVmdF9vdmVyX2xlbikgeworCQkJZm9yIChrID0gMDsgayA8IDI2OyBrKyspCisJCQkJYnVmW2tdID0gVVNCX0VORF9JMkNfQ01EOworCisJCQlidWZbMF0gPSAweEREOworCQkJYnVmWzFdID0gMHgwMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCWJ1ZlsyKyhpKjMpXSA9IEkyQ19EQVRBX1JFRzsKKwkJCQlidWZbMysoaSozKV0gPSAweDAwOworCQkJCWJ1Zls0KyhpKjMpXSA9IDB4MDA7CisJCQl9CisJCQlyZXQgPSBteGwxMTFzZl9pMmNfZ2V0X2RhdGEoc3RhdGUsIDAsIGJ1ZiwKKwkJCQkJCSAgICBpMmNfcl9kYXRhKTsKKworCQkJLyogY2hlY2sgZm9yIEkyQyBOQUNLIHN0YXR1cyAqLworCQkJaWYgKG14bDExMXNmX2kyY19jaGVja19zdGF0dXMoc3RhdGUpID09IDEpIHsKKwkJCQlteGxfaTJjKCJOQUNLIHJlYWRpbmcgc2xhdmUgYWRkcmVzcyAlMDJ4IiwKKwkJCQkJbXNnLT5hZGRyKTsKKworCQkJCS8qIGlmIE5BQ0ssIHN0b3AgSTJDIGJ1cyBhbmQgZXhpdCAqLworCQkJCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwkJCQlidWZbM10gPSAweEM3OworCQkJCWJ1Zls0XSA9IChIV0kyQzQwMCkgPyAweDAzIDogMHgwRDsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IGxlZnRfb3Zlcl9sZW47IGkrKykgeworCQkJCW1zZy0+YnVmWyhibG9ja19sZW4qOCkraV0gPQorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdOworCQkJCW14bF9pMmMoInJlYWQgZGF0YTogJTAyeFx0ICUwMngiLAorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzFdLAorCQkJCQlpMmNfcl9kYXRhWyhpKjMpKzJdKTsKKwkJCX0KKwkJfQorCisJCS8qIGluZGljYXRlIEkyQyBpbnRlcmZhY2UgdG8gaXNzdWUgTkFDSworCQkgICBhZnRlciBuZXh0IEkyQyByZWFkIG9wICovCisJCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCQlidWZbMV0gPSAweDAwOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweDE3OworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwkJYnVmWzVdID0gVVNCX0VORF9JMkNfQ01EOworCQlyZXQgPSBteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJYnVmWzJdID0gSTJDX0NPTlRST0xfUkVHOworCQlidWZbM10gPSAweEM3OworCQlidWZbNF0gPSAoSFdJMkM0MDApID8gMHgwMyA6IDB4MEQ7CisKKwl9CitleGl0OgorCS8qIFNUT1AgYW5kIGRpc2FibGUgSTJDIE1VWCAqLworCWJ1ZlswXSA9IFVTQl9XUklURV9JMkNfQ01EOworCWJ1ZlsxXSA9IDB4MDA7CisKKwkvKiBkZS1pbml0aWxpemUgSTJDIEJVUyAqLworCWJ1Zls1XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwlteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJLyogQ29udHJvbCBSZWdpc3RlciAqLworCWJ1ZlsyXSA9IEkyQ19DT05UUk9MX1JFRzsKKwlidWZbM10gPSAweERGOworCWJ1Zls0XSA9IDB4MDM7CisKKwkvKiBkaXNhYmxlIEkyQyBpbnRlcmZhY2UgKi8KKwlidWZbNV0gPSBJMkNfTVVYX1JFRzsKKwlidWZbNl0gPSAweDAwOworCWJ1Zls3XSA9IDB4MDA7CisKKwkvKiBkZS1pbml0aWxpemUgSTJDIEJVUyAqLworCWJ1Zls4XSA9IFVTQl9FTkRfSTJDX0NNRDsKKwlteGwxMTFzZl9pMmNfc2VuZF9kYXRhKHN0YXRlLCAwLCBidWYpOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzJdID0gSTJDX01VWF9SRUc7CisJYnVmWzNdID0gMHg4MTsKKwlidWZbNF0gPSAweDAwOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzVdID0gSTJDX01VWF9SRUc7CisJYnVmWzZdID0gMHgwMDsKKwlidWZbN10gPSAweDAwOworCisJLyogZGlzYWJsZSBJMkMgaW50ZXJmYWNlICovCisJYnVmWzhdID0gSTJDX01VWF9SRUc7CisJYnVmWzldID0gMHgwMDsKKwlidWZbMTBdID0gMHgwMDsKKworCWJ1ZlsxMV0gPSBVU0JfRU5EX0kyQ19DTUQ7CisJbXhsMTExc2ZfaTJjX3NlbmRfZGF0YShzdGF0ZSwgMCwgYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2ZfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCBod2kyYyA9IChzdGF0ZS0+Y2hpcF9yZXYgPiBNWEwxMTFTRl9WNik7CisJaW50IGksIHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyZXQgPSAoaHdpMmMpID8KKwkJCW14bDExMXNmX2kyY19od194ZmVyX21zZyhzdGF0ZSwgJm1zZ1tpXSkgOgorCQkJbXhsMTExc2ZfaTJjX3N3X3hmZXJfbXNnKHN0YXRlLCAmbXNnW2ldKTsKKwkJaWYgKG14bF9mYWlsKHJldCkpIHsKKwkJCW14bF9kZWJ1Z19hZHYoImZhaWxlZCB3aXRoIGVycm9yICVkIG9uIGkyYyAiCisJCQkJICAgICAgInRyYW5zYWN0aW9uICVkIG9mICVkLCAlc2luZyAlZCBieXRlcyAiCisJCQkJICAgICAgInRvL2Zyb20gMHglMDJ4IiwgcmV0LCBpKzEsIG51bSwKKwkJCQkgICAgICAobXNnW2ldLmZsYWdzICYgSTJDX01fUkQpID8KKwkJCQkgICAgICAicmVhZCIgOiAid3JpdCIsCisJCQkJICAgICAgbXNnW2ldLmxlbiwgbXNnW2ldLmFkZHIpOworCisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKworCXJldHVybiBpID09IG51bSA/IG51bSA6IC1FUkVNT1RFSU87Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLWkyYy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdhNDVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1pMmMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogIG14bDExMXNmLWkyYy5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfSTJDX0hfCisjZGVmaW5lIF9EVkJfVVNCX01YTDExMVNGX0kyQ19IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKK2ludCBteGwxMTFzZl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCSAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKTsKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX0kyQ19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1waHkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0MWIzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiAgbXhsMTExc2YtcGh5LmMgLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorCitpbnQgbXhsMTExc2ZfaW5pdF90dW5lcl9kZW1vZChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIG14bF8xMTFfb3ZlcndyaXRlX2RlZmF1bHRbXSA9IHsKKwkJezB4MDcsIDB4ZmYsIDB4MGN9LAorCQl7MHg1OCwgMHhmZiwgMHg5ZH0sCisJCXsweDA5LCAweGZmLCAweDAwfSwKKwkJezB4MDYsIDB4ZmYsIDB4MDZ9LAorCQl7MHhjOCwgMHhmZiwgMHg0MH0sIC8qIEVEX0xFX1dJTl9PTEQgPSAwICovCisJCXsweDhkLCAweDAxLCAweDAxfSwgLyogTkVHQVRFX1EgKi8KKwkJezB4MzIsIDB4ZmYsIDB4YWN9LCAvKiBESUdfUkZSRUZTRUxFQ1QgPSAxMiAqLworCQl7MHg0MiwgMHhmZiwgMHg0M30sIC8qIERJR19SRUdfQU1QID0gNCAqLworCQl7MHg3NCwgMHhmZiwgMHhjNH0sIC8qIFNTUFVSX0ZTX1BSSU8gPSA0ICovCisJCXsweDcxLCAweGZmLCAweGU2fSwgLyogU1BVUl9ST1RfUFJJT19WQUwgPSAxICovCisJCXsweDgzLCAweGZmLCAweDY0fSwgLyogSU5GX0ZJTFQxX1RIRF9TQyA9IDEwMCAqLworCQl7MHg4NSwgMHhmZiwgMHg2NH0sIC8qIElORl9GSUxUMl9USERfU0MgPSAxMDAgKi8KKwkJezB4ODgsIDB4ZmYsIDB4ZjB9LCAvKiBJTkZfVEhEID0gMjQwICovCisJCXsweDZmLCAweGYwLCAweGIwfSwgLyogREZFX0RMWSA9IDExICovCisJCXsweDAwLCAweGZmLCAweDAxfSwgLyogQ2hhbmdlIHRvIHBhZ2UgMSAqLworCQl7MHg4MSwgMHhmZiwgMHgxMX0sIC8qIERTTV9GRVJSX0JZUEFTUyA9IDEgKi8KKwkJezB4ZjQsIDB4ZmYsIDB4MDd9LCAvKiBESUdfRlJFUV9DT1JSID0gMSAqLworCQl7MHhkNCwgMHgxZiwgMHgwZn0sIC8qIFNQVVJfVEVTVF9OT0lTRV9USCA9IDE1ICovCisJCXsweGQ2LCAweGZmLCAweDBjfSwgLyogU1BVUl9URVNUX05PSVNFX1BBUFIgPSAxMiAqLworCQl7MHgwMCwgMHhmZiwgMHgwMH0sIC8qIENoYW5nZSB0byBwYWdlIDAgKi8KKwkJezAsICAgIDAsICAgIDB9CisJfTsKKworCW14bF9kZWJ1ZygiKCkiKTsKKworCXJldHVybiBteGwxMTFzZl9jdHJsX3Byb2dyYW1fcmVncyhzdGF0ZSwgbXhsXzExMV9vdmVyd3JpdGVfZGVmYXVsdCk7Cit9CisKK2ludCBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldDsKKwlteGxfZGVidWcoIigpIik7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4ZmYsIDB4MDApOyAvKiBBSUMgKi8KKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMiwgMHgwMSk7IC8qIGdldCBvdXQgb2YgcmVzZXQgKi8KKwlteGxfZmFpbChyZXQpOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXhsMXgxc2Zfc2V0X2RldmljZV9tb2RlKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBtb2RlKQoreworCWludCByZXQ7CisKKwlteGxfZGVidWcoIiglcykiLCBNWExfU09DX01PREUgPT0gbW9kZSA/CisJCSJNWExfU09DX01PREUiIDogIk1YTF9UVU5FUl9NT0RFIik7CisKKwkvKiBzZXQgZGV2aWNlIG1vZGUgKi8KKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4MDMsCisJCQkJIE1YTF9TT0NfTU9ERSA9PSBtb2RlID8gMHgwMSA6IDB4MDApOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWdfbWFzayhzdGF0ZSwKKwkJCQkgICAgICAweDdkLCAweDQwLCBNWExfU09DX01PREUgPT0gbW9kZSA/CisJCQkJICAgICAgMHgwMCA6IC8qIGVuYWJsZSBpbXB1bHNlIG5vaXNlIGZpbHRlciwKKwkJCQkJCUlORl9CWVAgPSAwICovCisJCQkJICAgICAgMHg0MCk7IC8qIGRpc2FibGUgaW1wdWxzZSBub2lzZSBmaWx0ZXIsCisJCQkJCQlJTkZfQllQID0gMSAqLworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0ZS0+ZGV2aWNlX21vZGUgPSBtb2RlOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciB1cCB0dW5lciAqLworaW50IG14bDF4MXNmX3RvcF9tYXN0ZXJfY3RybChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCBpbnQgb25vZmYpCit7CisJbXhsX2RlYnVnKCIoJWQpIiwgb25vZmYpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMSwgb25vZmYgPyAweDAxIDogMHgwMCk7Cit9CisKK2ludCBteGwxMTFzZl9kaXNhYmxlXzY1Nl9wb3J0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZ19tYXNrKHN0YXRlLCAweDEyLCAweDA0LCAweDAwKTsKK30KKworaW50IG14bDExMXNmX2VuYWJsZV91c2Jfb3V0cHV0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpCit7CisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX3dyaXRlX3JlZ19tYXNrKHN0YXRlLCAweDE3LCAweDQwLCAweDAwKTsKK30KKworLyogaW5pdGlhbGl6ZSBUU0lGIGFzIGlucHV0IHBvcnQgb2YgTXhMMVgxU0YgZm9yIE1QRUcyIGRhdGEgdHJhbnNmZXIgKi8KK2ludCBteGwxMTFzZl9jb25maWdfbXBlZ19pbihzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHVuc2lnbmVkIGludCBwYXJhbGxlbF9zZXJpYWwsCisJCQkgICAgdW5zaWduZWQgaW50IG1zYl9sc2JfMXN0LAorCQkJICAgIHVuc2lnbmVkIGludCBjbG9ja19waGFzZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXBlZ192YWxpZF9wb2wsCisJCQkgICAgdW5zaWduZWQgaW50IG1wZWdfc3luY19wb2wpCit7CisJaW50IHJldDsKKwl1OCBtb2RlLCB0bXA7CisKKwlteGxfZGVidWcoIigldSwldSwldSwldSwldSkiLCBwYXJhbGxlbF9zZXJpYWwsIG1zYl9sc2JfMXN0LAorCQkgIGNsb2NrX3BoYXNlLCBtcGVnX3ZhbGlkX3BvbCwgbXBlZ19zeW5jX3BvbCk7CisKKwkvKiBFbmFibGUgUElOIE1VWCAqLworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgVjZfUElOX01VWF9NT0RFX1JFRywgVjZfRU5BQkxFX1BJTl9NVVgpOworCW14bF9mYWlsKHJldCk7CisKKwkvKiBDb25maWd1cmUgTVBFRyBDbG9jayBwaGFzZSAqLworCW14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NMS19JTlZfUkVHLCAmbW9kZSk7CisKKwlpZiAoY2xvY2tfcGhhc2UgPT0gVFNJRl9OT1JNQUwpCisJCW1vZGUgJj0gflY2X0lOVkVSVEVEX0NMS19QSEFTRTsKKwllbHNlCisJCW1vZGUgfD0gVjZfSU5WRVJURURfQ0xLX1BIQVNFOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NMS19JTlZfUkVHLCBtb2RlKTsKKwlteGxfZmFpbChyZXQpOworCisJLyogQ29uZmlndXJlIGRhdGEgaW5wdXQgbW9kZSwgTVBFRyBWYWxpZCBwb2xhcml0eSwgTVBFRyBTeW5jIHBvbGFyaXR5CisJICogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NUUkxfUkVHLCAmbW9kZSk7CisJbXhsX2ZhaWwocmV0KTsKKworCS8qIERhdGEgSW5wdXQgbW9kZSAqLworCWlmIChwYXJhbGxlbF9zZXJpYWwgPT0gVFNJRl9JTlBVVF9QQVJBTExFTCkgeworCQkvKiBEaXNhYmxlIHNlcmlhbCBtb2RlICovCisJCW1vZGUgJj0gflY2X01QRUdfSU5fREFUQV9TRVJJQUw7CisKKwkJLyogRW5hYmxlIFBhcmFsbGVsIG1vZGUgKi8KKwkJbW9kZSB8PSBWNl9NUEVHX0lOX0RBVEFfUEFSQUxMRUw7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBQYXJhbGxlbCBtb2RlICovCisJCW1vZGUgJj0gflY2X01QRUdfSU5fREFUQV9QQVJBTExFTDsKKworCQkvKiBFbmFibGUgU2VyaWFsIE1vZGUgKi8KKwkJbW9kZSB8PSBWNl9NUEVHX0lOX0RBVEFfU0VSSUFMOworCisJCS8qIElmIHNlcmlhbCBpbnRlcmZhY2UgaXMgY2hvc2VuLCBjb25maWd1cmUKKwkJICAgTVNCIG9yIExTQiBvcmRlciBpbiB0cmFuc21pc3Npb24gKi8KKwkJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsCisJCQkJCVY2X01QRUdfSU5PVVRfQklUX09SREVSX0NUUkxfUkVHLAorCQkJCQkmdG1wKTsKKwkJbXhsX2ZhaWwocmV0KTsKKworCQlpZiAobXNiX2xzYl8xc3QgPT0gTVBFR19TRVJfTVNCX0ZJUlNUX0VOQUJMRUQpCisJCQl0bXAgfD0gVjZfTVBFR19TRVJfTVNCX0ZJUlNUOworCQllbHNlCisJCQl0bXAgJj0gflY2X01QRUdfU0VSX01TQl9GSVJTVDsKKworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsCisJCQkJCSBWNl9NUEVHX0lOT1VUX0JJVF9PUkRFUl9DVFJMX1JFRywKKwkJCQkJIHRtcCk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJLyogTVBFRyBTeW5jIHBvbGFyaXR5ICovCisJaWYgKG1wZWdfc3luY19wb2wgPT0gVFNJRl9OT1JNQUwpCisJCW1vZGUgJj0gflY2X0lOVkVSVEVEX01QRUdfU1lOQzsKKwllbHNlCisJCW1vZGUgfD0gVjZfSU5WRVJURURfTVBFR19TWU5DOworCisJLyogTVBFRyBWYWxpZCBwb2xhcml0eSAqLworCWlmIChtcGVnX3ZhbGlkX3BvbCA9PSAwKQorCQltb2RlICY9IH5WNl9JTlZFUlRFRF9NUEVHX1ZBTElEOworCWVsc2UKKwkJbW9kZSB8PSBWNl9JTlZFUlRFRF9NUEVHX1ZBTElEOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9NUEVHX0lOX0NUUkxfUkVHLCBtb2RlKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2luaXRfaTJzX3BvcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggc2FtcGxlX3NpemUpCit7CisJc3RhdGljIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIGluaXRfaTJzW10gPSB7CisJCXsweDFiLCAweGZmLCAweDFlfSwgLyogcGluIG11eCBtb2RlLCBDaG9vc2UgNjU2L0kyUyBpbnB1dCAqLworCQl7MHgxNSwgMHg2MCwgMHg2MH0sIC8qIEVuYWJsZSBJMlMgKi8KKwkJezB4MTcsIDB4ZTAsIDB4MjB9LCAvKiBJbnB1dCwgTVBFRyBNT0RFIFVTQiwKKwkJCQkgICAgICAgSW52ZXJ0ZWQgNjU2IENsb2NrLCBJMlNfU09GVF9SRVNFVCwKKwkJCQkgICAgICAgMCA6IE5vcm1hbCBvcGVyYXRpb24sIDEgOiBSZXNldCBTdGF0ZSAqLworI2lmIDAKKwkJezB4MTIsIDB4MDEsIDB4MDB9LCAvKiBBVURJT19JUlFfQ0xSIChPdmVyZmxvdyBJbmRpY2F0b3IpICovCisjZW5kaWYKKwkJezB4MDAsIDB4ZmYsIDB4MDJ9LCAvKiBDaGFuZ2UgdG8gQ29udHJvbCBQYWdlICovCisJCXsweDI2LCAweDBkLCAweDBkfSwgLyogSTJTX01PREUgJiBCVDY1Nl9TUkNfU0VMIGZvciBGUEdBIG9ubHkgKi8KKwkJezB4MDAsIDB4ZmYsIDB4MDB9LAorCQl7MCwgICAgMCwgICAgMH0KKwl9OworCWludCByZXQ7CisKKwlteGxfZGVidWcoIigweCUwMngpIiwgc2FtcGxlX3NpemUpOworCisJcmV0ID0gbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3Moc3RhdGUsIGluaXRfaTJzKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfTlVNX1NBTVBMRVNfUkVHLCBzYW1wbGVfc2l6ZSk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2Rpc2FibGVfaTJzX3BvcnQoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gZGlzYWJsZV9pMnNbXSA9IHsKKwkJezB4MTUsIDB4NDAsIDB4MDB9LAorCQl7MCwgICAgMCwgICAgMH0KKwl9OworCisJbXhsX2RlYnVnKCIoKSIpOworCisJcmV0dXJuIG14bDExMXNmX2N0cmxfcHJvZ3JhbV9yZWdzKHN0YXRlLCBkaXNhYmxlX2kycyk7Cit9CisKK2ludCBteGwxMTFzZl9jb25maWdfaTJzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQl1OCBtc2Jfc3RhcnRfcG9zLCB1OCBkYXRhX3dpZHRoKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXhsX2RlYnVnKCIoMHglMDJ4LCAweCUwMngpIiwgbXNiX3N0YXJ0X3BvcywgZGF0YV93aWR0aCk7CisKKwlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgVjZfSTJTX1NUUkVBTV9TVEFSVF9CSVRfUkVHLCAmdG1wKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJdG1wICY9IDB4ZTA7CisJdG1wIHw9IG1zYl9zdGFydF9wb3M7CisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX1NUQVJUX0JJVF9SRUcsIHRtcCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX0VORF9CSVRfUkVHLCAmdG1wKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJdG1wICY9IDB4ZTA7CisJdG1wIHw9IGRhdGFfd2lkdGg7CisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWNl9JMlNfU1RSRUFNX0VORF9CSVRfUkVHLCB0bXApOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBteGwxMTFzZl9jb25maWdfc3BpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZikKK3sKKwl1OCB2YWw7CisJaW50IHJldDsKKworCW14bF9kZWJ1ZygiKCVkKSIsIG9ub2ZmKTsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBWOF9TUElfTU9ERV9SRUcsICZ2YWwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAob25vZmYpCisJCXZhbCB8PSAweDA0OworCWVsc2UKKwkJdmFsICY9IH4weDA0OworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBWOF9TUElfTU9ERV9SRUcsIHZhbCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDExMXNmX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMCk7CisJbXhsX2ZhaWwocmV0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworaW50IG14bDExMXNmX2lkYWNfY29uZmlnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgdTggY29udHJvbF9tb2RlLCB1OCBjdXJyZW50X3NldHRpbmcsCisJCQkgdTggY3VycmVudF92YWx1ZSwgdTggaHlzdGVyZXNpc192YWx1ZSkKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKwkvKiBjdXJyZW50IHZhbHVlIHdpbGwgYmUgc2V0IGZvciBib3RoIGF1dG9tYXRpYyAmIG1hbnVhbCBJREFDIGNvbnRyb2wgKi8KKwl2YWwgPSBjdXJyZW50X3ZhbHVlOworCisJaWYgKGNvbnRyb2xfbW9kZSA9PSBJREFDX01BTlVBTF9DT05UUk9MKSB7CisJCS8qIGVuYWJsZSBtYW51YWwgY29udHJvbCBvZiBJREFDICovCisJCXZhbCB8PSBJREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLOworCisJCWlmIChjdXJyZW50X3NldHRpbmcgPT0gSURBQ19DVVJSRU5UX1NJTktJTkdfRU5BQkxFKQorCQkJLyogZW5hYmxlIGN1cnJlbnQgc2lua2luZyBpbiBtYW51YWwgbW9kZSAqLworCQkJdmFsIHw9IElEQUNfQ1VSUkVOVF9TSU5LSU5HX0JJVF9NQVNLOworCQllbHNlCisJCQkvKiBkaXNhYmxlIGN1cnJlbnQgc2lua2luZyBpbiBtYW51YWwgbW9kZSAqLworCQkJdmFsICY9IH5JREFDX0NVUlJFTlRfU0lOS0lOR19CSVRfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIG1hbnVhbCBjb250cm9sIG9mIElEQUMgKi8KKwkJdmFsICY9IH5JREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLOworCisJCS8qIHNldCBoeXN0ZXJlc2lzIHZhbHVlICByZWc6IDB4MEI8NTowPiAqLworCQlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFY2X0lEQUNfSFlTVEVSRVNJU19SRUcsCisJCQkJCSAoaHlzdGVyZXNpc192YWx1ZSAmIDB4M0YpKTsKKwkJbXhsX2ZhaWwocmV0KTsKKwl9CisKKwlyZXQgPSBteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIFY2X0lEQUNfU0VUVElOR1NfUkVHLCB2YWwpOworCW14bF9mYWlsKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1waHkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3NTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcGh5LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBteGwxMTFzZi1waHkuaCAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9EVkJfVVNCX01YTDExMVNGX1BIWV9IXworI2RlZmluZSBfRFZCX1VTQl9NWEwxMTFTRl9QSFlfSF8KKworI2luY2x1ZGUgIm14bDExMXNmLmgiCisKK2ludCBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCBpbnQgbW9kZSk7CitpbnQgbXhsMXgxc2ZfdG9wX21hc3Rlcl9jdHJsKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CitpbnQgbXhsMTExc2ZfZGlzYWJsZV82NTZfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKK2ludCBteGwxMTFzZl9pbml0X3R1bmVyX2RlbW9kKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDExMXNmX2VuYWJsZV91c2Jfb3V0cHV0KHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUpOworaW50IG14bDExMXNmX2NvbmZpZ19tcGVnX2luKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgdW5zaWduZWQgaW50IHBhcmFsbGVsX3NlcmlhbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXNiX2xzYl8xc3QsCisJCQkgICAgdW5zaWduZWQgaW50IGNsb2NrX3BoYXNlLAorCQkJICAgIHVuc2lnbmVkIGludCBtcGVnX3ZhbGlkX3BvbCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbXBlZ19zeW5jX3BvbCk7CitpbnQgbXhsMTExc2ZfY29uZmlnX2kycyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJdTggbXNiX3N0YXJ0X3BvcywgdTggZGF0YV93aWR0aCk7CitpbnQgbXhsMTExc2ZfaW5pdF9pMnNfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCB1OCBzYW1wbGVfc2l6ZSk7CitpbnQgbXhsMTExc2ZfZGlzYWJsZV9pMnNfcG9ydChzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlKTsKK2ludCBteGwxMTFzZl9jb25maWdfc3BpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CitpbnQgbXhsMTExc2ZfaWRhY19jb25maWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSB1OCBjb250cm9sX21vZGUsIHU4IGN1cnJlbnRfc2V0dGluZywKKwkJCSB1OCBjdXJyZW50X3ZhbHVlLCB1OCBoeXN0ZXJlc2lzX3ZhbHVlKTsKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX1BIWV9IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YtcmVnLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiAgbXhsMTExc2YtcmVnLmggLSBkcml2ZXIgZm9yIHRoZSBNYXhMaW5lYXIgTVhMMTExU0YKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfRFZCX1VTQl9NWEwxMTFTRl9SRUdfSF8KKyNkZWZpbmUgX0RWQl9VU0JfTVhMMTExU0ZfUkVHX0hfCisKKyNkZWZpbmUgQ0hJUF9JRF9SRUcgICAgICAgICAgICAgICAgICAweEZDCisjZGVmaW5lIFRPUF9DSElQX1JFVl9JRF9SRUcgICAgICAgICAgMHhGQQorCisjZGVmaW5lIFY2X1NOUl9SQl9MU0JfUkVHICAgICAgICAgICAgMHgyNworI2RlZmluZSBWNl9TTlJfUkJfTVNCX1JFRyAgICAgICAgICAgIDB4MjgKKworI2RlZmluZSBWNl9OX0FDQ1VNVUxBVEVfUkVHICAgICAgICAgIDB4MTEKKyNkZWZpbmUgVjZfUlNfQVZHX0VSUk9SU19MU0JfUkVHICAgICAweDJDCisjZGVmaW5lIFY2X1JTX0FWR19FUlJPUlNfTVNCX1JFRyAgICAgMHgyRAorCisjZGVmaW5lIFY2X0lSUV9TVEFUVVNfUkVHICAgICAgICAgICAgMHgyNAorI2RlZmluZSAgSVJRX01BU0tfRkVDX0xPQ0sgICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1NZTkNfTE9DS19SRUcgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBTWU5DX0xPQ0tfTUFTSyAgICAgICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1JTX0xPQ0tfREVUX1JFRyAgICAgICAgICAgMHgyOAorI2RlZmluZSAgUlNfTE9DS19ERVRfTUFTSyAgICAgICAgMHgwOAorCisjZGVmaW5lIFY2X0lOSVRBQ1FfTk9ERVRFQ1RfUkVHICAgIDB4MjAKKyNkZWZpbmUgVjZfRk9SQ0VfTkZGVF9DUFNJWkVfUkVHICAgMHgyMAorCisjZGVmaW5lIFY2X0NPREVfUkFURV9UUFNfUkVHICAgICAgIDB4MjkKKyNkZWZpbmUgVjZfQ09ERV9SQVRFX1RQU19NQVNLICAgICAgMHgwNworCisKKyNkZWZpbmUgVjZfQ1BfTE9DS19ERVRfUkVHICAgICAgICAweDI4CisjZGVmaW5lIFY2X0NQX0xPQ0tfREVUX01BU0sgICAgICAgMHgwNAorCisjZGVmaW5lIFY2X1RQU19ISUVSQUNIWV9SRUcgICAgICAgIDB4MjkKKyNkZWZpbmUgVjZfVFBTX0hJRVJBUkNIWV9JTkZPX01BU0sgIDB4NDAKKworI2RlZmluZSBWNl9NT0RPUkRFUl9UUFNfUkVHICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX0NPTlNURUxMQVRJT05fTUFTSyAgIDB4MzAKKworI2RlZmluZSBWNl9NT0RFX1RQU19SRUcgICAgICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX0ZGVF9NT0RFX01BU0sgICAgICAgIDB4MEMKKworCisjZGVmaW5lIFY2X0NQX1RQU19SRUcgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBWNl9QQVJBTV9HSV9NQVNLICAgICAgICAgICAgICAweDMwCisKKyNkZWZpbmUgVjZfVFBTX0xPQ0tfUkVHICAgICAgICAgICAweDJBCisjZGVmaW5lIFY2X1BBUkFNX1RQU19MT0NLX01BU0sgICAgICAgIDB4NDAKKworI2RlZmluZSBWNl9GRUNfUEVSX0NPVU5UX1JFRyAgICAgIDB4MkUKKyNkZWZpbmUgVjZfRkVDX1BFUl9TQ0FMRV9SRUcgICAgICAweDJCCisjZGVmaW5lIFY2X0ZFQ19QRVJfU0NBTEVfTUFTSyAgICAgICAgMHgwMworI2RlZmluZSBWNl9GRUNfUEVSX0NMUl9SRUcgICAgICAgIDB4MjAKKyNkZWZpbmUgVjZfRkVDX1BFUl9DTFJfTUFTSyAgICAgICAgICAweDAxCisKKyNkZWZpbmUgVjZfUElOX01VWF9NT0RFX1JFRyAgICAgICAweDFCCisjZGVmaW5lIFY2X0VOQUJMRV9QSU5fTVVYICAgICAgICAgICAgMHgxRQorCisjZGVmaW5lIFY2X0kyU19OVU1fU0FNUExFU19SRUcgICAgMHgxNgorCisjZGVmaW5lIFY2X01QRUdfSU5fQ0xLX0lOVl9SRUcgICAgMHgxNworI2RlZmluZSBWNl9NUEVHX0lOX0NUUkxfUkVHICAgICAgIDB4MTgKKworI2RlZmluZSBWNl9JTlZFUlRFRF9DTEtfUEhBU0UgICAgICAgMHgyMAorI2RlZmluZSBWNl9NUEVHX0lOX0RBVEFfUEFSQUxMRUwgICAgMHgwMQorI2RlZmluZSBWNl9NUEVHX0lOX0RBVEFfU0VSSUFMICAgICAgMHgwMgorCisjZGVmaW5lIFY2X0lOVkVSVEVEX01QRUdfU1lOQyAgICAgICAweDA0CisjZGVmaW5lIFY2X0lOVkVSVEVEX01QRUdfVkFMSUQgICAgICAweDA4CisKKyNkZWZpbmUgVFNJRl9JTlBVVF9QQVJBTExFTCAgICAgICAgIDAKKyNkZWZpbmUgVFNJRl9JTlBVVF9TRVJJQUwgICAgICAgICAgIDEKKyNkZWZpbmUgVFNJRl9OT1JNQUwgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBWNl9NUEVHX0lOT1VUX0JJVF9PUkRFUl9DVFJMX1JFRyAgMHgxOQorI2RlZmluZSBWNl9NUEVHX1NFUl9NU0JfRklSU1QgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNUEVHX1NFUl9NU0JfRklSU1RfRU5BQkxFRCAgICAgICAgMHgwMQorCisjZGVmaW5lIFY2XzY1Nl9JMlNfQlVGRl9TVEFUVVNfUkVHICAgMHgyRgorI2RlZmluZSBWNl82NTZfT1ZFUkZMT1dfTUFTS19CSVQgICAgICAgICAweDA4CisjZGVmaW5lIFY2X0kyU19PVkVSRkxPV19NQVNLX0JJVCAgICAgICAgIDB4MDEKKworI2RlZmluZSBWNl9JMlNfU1RSRUFNX1NUQVJUX0JJVF9SRUcgIDB4MTQKKyNkZWZpbmUgVjZfSTJTX1NUUkVBTV9FTkRfQklUX1JFRyAgICAweDE1CisjZGVmaW5lIEkyU19SSUdIVF9KVVNUSUZJRUQgICAgIDAKKyNkZWZpbmUgSTJTX0xFRlRfSlVTVElGSUVEICAgICAgMQorI2RlZmluZSBJMlNfREFUQV9GT1JNQVQgICAgICAgICAyCisKKyNkZWZpbmUgVjZfVFVORVJfTE9PUF9USFJVX0NPTlRST0xfUkVHICAweDA5CisjZGVmaW5lIFY2X0VOQUJMRV9MT09QX1RIUlUgICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgVE9UQUxfTlVNX0lGX09VVFBVVF9GUkVRICAgICAgIDE2CisKKyNkZWZpbmUgVFVORVJfTk9STUFMX0lGX1NQRUNUUlVNICAgICAgIDB4MAorI2RlZmluZSBUVU5FUl9JTlZFUlRfSUZfU1BFQ1RSVU0gICAgICAgMHgxMAorCisjZGVmaW5lIFY2X1RVTkVSX0lGX1NFTF9SRUcgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgVjZfVFVORVJfSUZfRkNXX1JFRyAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRyAgICAgICAgICAweDNECisjZGVmaW5lIFY2X1JGX0xPQ0tfU1RBVFVTX1JFRyAgICAgICAgICAgIDB4MjMKKworI2RlZmluZSBOVU1fRElHX1RWX0NIQU5ORUwgICAgIDEwMDAKKworI2RlZmluZSBWNl9ESUdfQ0xLX0ZSRVFfU0VMX1JFRyAgMHgwNworI2RlZmluZSBWNl9SRUZfU1lOVEhfSU5UX1JFRyAgICAgMHg1QworI2RlZmluZSBWNl9SRUZfU1lOVEhfUkVNQUlOX1JFRyAgMHg1OAorI2RlZmluZSBWNl9ESUdfUkZSRUZTRUxFQ1RfUkVHICAgMHgzMgorI2RlZmluZSBWNl9YVEFMX0NMS19PVVRfR0FJTl9SRUcgICAweDMxCisjZGVmaW5lIFY2X1RVTkVSX0xPT1BfVEhSVV9DVFJMX1JFRyAgICAgIDB4MDkKKyNkZWZpbmUgVjZfRElHX1hUQUxfRU5BQkxFX1JFRyAgMHgwNgorI2RlZmluZSBWNl9ESUdfWFRBTF9CSUFTX1JFRyAgMHg2NgorI2RlZmluZSBWNl9YVEFMX0NBUF9SRUcgICAgMHgwOAorCisjZGVmaW5lIFY2X0dQT19DVFJMX1JFRyAgICAgMHgxOAorI2RlZmluZSBNWExfR1BPXzAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVhMX0dQT18xICAgICAgICAgICAweDAxCisjZGVmaW5lIFY2X0dQT18wX01BU0sgICAgICAgMHgxMAorI2RlZmluZSBWNl9HUE9fMV9NQVNLICAgICAgIDB4MjAKKworI2RlZmluZSBWNl8xMTFTRl9HUE9fQ1RSTF9SRUcgICAgIDB4MTkKKyNkZWZpbmUgTVhMXzExMVNGX0dQT18xICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNWExfMTExU0ZfR1BPXzIgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fMyAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTVhMXzExMVNGX0dQT180ICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBNWExfMTExU0ZfR1BPXzUgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fNiAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTVhMXzExMVNGX0dQT183ICAgICAgICAgICAgICAgMHgwNgorCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fMF9NQVNLICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVhMXzExMVNGX0dQT18xX01BU0sgICAgICAgICAgMHgwMgorI2RlZmluZSBNWExfMTExU0ZfR1BPXzJfTUFTSyAgICAgICAgICAweDA0CisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fM19NQVNLICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVhMXzExMVNGX0dQT180X01BU0sgICAgICAgICAgMHgxMAorI2RlZmluZSBNWExfMTExU0ZfR1BPXzVfTUFTSyAgICAgICAgICAweDIwCisjZGVmaW5lIE1YTF8xMTFTRl9HUE9fNl9NQVNLICAgICAgICAgIDB4NDAKKworI2RlZmluZSBWNl9BVFNDX0NPTkZJR19SRUcgIDB4MEEKKworI2RlZmluZSBNWExfTU9ERV9SRUcgICAgMHgwMworI2RlZmluZSBTVEFSVF9UVU5FX1JFRyAgMHgxQworCisjZGVmaW5lIFY2X0lEQUNfSFlTVEVSRVNJU19SRUcgICAgMHgwQgorI2RlZmluZSBWNl9JREFDX1NFVFRJTkdTX1JFRyAgICAgIDB4MEMKKyNkZWZpbmUgSURBQ19NQU5VQUxfQ09OVFJPTCAgICAgICAgICAgICAxCisjZGVmaW5lIElEQUNfQ1VSUkVOVF9TSU5LSU5HX0VOQUJMRSAgICAgMQorI2RlZmluZSBJREFDX01BTlVBTF9DT05UUk9MX0JJVF9NQVNLICAgICAgMHg4MAorI2RlZmluZSBJREFDX0NVUlJFTlRfU0lOS0lOR19CSVRfTUFTSyAgICAgMHg0MAorCisjZGVmaW5lIFY4X1NQSV9NT0RFX1JFRyAgMHhFOQorCisjZGVmaW5lIFY2X0RJR19SRl9QV1JfTFNCX1JFRyAgMHg0NgorI2RlZmluZSBWNl9ESUdfUkZfUFdSX01TQl9SRUcgIDB4NDcKKworI2VuZGlmIC8qIF9EVkJfVVNCX01YTDExMVNGX1JFR19IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MzQxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLXR1bmVyLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiAgbXhsMTExc2YtdHVuZXIuYyAtIGRyaXZlciBmb3IgdGhlIE1heExpbmVhciBNWEwxMTFTRiBDTU9TIHR1bmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJteGwxMTFzZi10dW5lci5oIgorI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorCisvKiBkZWJ1ZyAqLworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgbXhsMTExc2ZfdHVuZXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvIChvci1hYmxlKSkuIik7CisKKyNkZWZpbmUgbXhsX2RiZyhmbXQsIGFyZy4uLikgXAorCWlmIChteGwxMTFzZl90dW5lcl9kZWJ1ZykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgeworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlOworCisJc3RydWN0IG14bDExMXNmX3R1bmVyX2NvbmZpZyAqY2ZnOworCisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgYmFuZHdpZHRoOworfTsKKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlLAorCQkJCSAgIHU4IGFkZHIsIHU4ICpkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+cmVhZF9yZWcpID8KKwkJc3RhdGUtPmNmZy0+cmVhZF9yZWcoc3RhdGUtPm14bF9zdGF0ZSwgYWRkciwgZGF0YSkgOgorCQktRUlOVkFMOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlLAorCQkJCSAgICB1OCBhZGRyLCB1OCBkYXRhKQoreworCXJldHVybiAoc3RhdGUtPmNmZy0+d3JpdGVfcmVnKSA/CisJCXN0YXRlLT5jZmctPndyaXRlX3JlZyhzdGF0ZS0+bXhsX3N0YXRlLCBhZGRyLCBkYXRhKSA6CisJCS1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfdHVuZXJfcHJvZ3JhbV9yZWdzKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKmN0cmxfcmVnX2luZm8pCit7CisJcmV0dXJuIChzdGF0ZS0+Y2ZnLT5wcm9ncmFtX3JlZ3MpID8KKwkJc3RhdGUtPmNmZy0+cHJvZ3JhbV9yZWdzKHN0YXRlLT5teGxfc3RhdGUsIGN0cmxfcmVnX2luZm8pIDoKKwkJLUVJTlZBTDsKK30KKworc3RhdGljIGludCBteGwxeDFzZl90dW5lcl90b3BfbWFzdGVyX2N0cmwoc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSwKKwkJCQkJICBpbnQgb25vZmYpCit7CisJcmV0dXJuIChzdGF0ZS0+Y2ZnLT50b3BfbWFzdGVyX2N0cmwpID8KKwkJc3RhdGUtPmNmZy0+dG9wX21hc3Rlcl9jdHJsKHN0YXRlLT5teGxfc3RhdGUsIG9ub2ZmKSA6CisJCS1FSU5WQUw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gbXhsX3BoeV90dW5lX3JmW10gPSB7CisJezB4MWQsIDB4N2YsIDB4MDB9LCAvKiBjaGFubmVsIGJhbmR3aWR0aCBzZWN0aW9uIDEvMi8zLAorCQkJICAgICAgIERJR19NT0RFSU5ERVgsIF9BLCBfQ1NGLCAqLworCXsweDFlLCAweGZmLCAweDAwfSwgLyogY2hhbm5lbCBmcmVxdWVuY3kgKGxvIGFuZCBmcmFjdGlvbmFsKSAqLworCXsweDFmLCAweGZmLCAweDAwfSwgLyogY2hhbm5lbCBmcmVxdWVuY3kgKGhpIGZvciBpbnRlZ2VyIHBvcnRpb24pICovCisJezAsICAgIDAsICAgIDB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpteGwxMTFzZl9jYWxjX3BoeV90dW5lX3JlZ3ModTMyIGZyZXEsCisJCQkJCQkJCSAgdTggYncpCit7CisJdTggZmlsdF9idzsKKworCS8qIHNldCBjaGFubmVsIGJhbmR3aWR0aCAqLworCXN3aXRjaCAoYncpIHsKKwljYXNlIDA6IC8qIEFUU0MgKi8KKwkJZmlsdF9idyA9IDI1OworCQlicmVhazsKKwljYXNlIDE6IC8qIFFBTSAqLworCQlmaWx0X2J3ID0gNjk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJZmlsdF9idyA9IDIxOworCQlicmVhazsKKwljYXNlIDc6CisJCWZpbHRfYncgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlmaWx0X2J3ID0gNjM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycigiJXM6IGludmFsaWQgYmFuZHdpZHRoIHNldHRpbmchIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBjYWxjdWxhdGUgUkYgY2hhbm5lbCAqLworCWZyZXEgLz0gMTAwMDAwMDsKKworCWZyZXEgKj0gNjQ7CisjaWYgMAorCS8qIGRvIHJvdW5kICovCisJZnJlcSArPSAwLjU7CisjZW5kaWYKKwkvKiBzZXQgYmFuZHdpZHRoICovCisJbXhsX3BoeV90dW5lX3JmWzBdLmRhdGEgPSBmaWx0X2J3OworCisJLyogc2V0IFJGICovCisJbXhsX3BoeV90dW5lX3JmWzFdLmRhdGEgPSAoZnJlcSAmIDB4ZmYpOworCW14bF9waHlfdHVuZV9yZlsyXS5kYXRhID0gKGZyZXEgPj4gOCkgJiAweGZmOworCisJLyogc3RhcnQgdHVuZSAqLworCXJldHVybiBteGxfcGh5X3R1bmVfcmY7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfc2V0X2lmX291dHB1dF9mcmVxKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldDsKKwl1OCBjdHJsOworI2lmIDAKKwl1MTYgaWZmY3c7CisJdTMyIGlmX2ZyZXE7CisjZW5kaWYKKwlteGxfZGJnKCIoSUYgcG9sYXJpdHkgPSAlZCwgSUYgZnJlcSA9IDB4JTAyeCkiLAorCQlzdGF0ZS0+Y2ZnLT5pbnZlcnRfc3BlY3RydW0sIHN0YXRlLT5jZmctPmlmX2ZyZXEpOworCisJLyogc2V0IElGIHBvbGFyaXR5ICovCisJY3RybCA9IHN0YXRlLT5jZmctPmludmVydF9zcGVjdHJ1bTsKKworCWN0cmwgfD0gc3RhdGUtPmNmZy0+aWZfZnJlcTsKKworCXJldCA9IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdGF0ZSwgVjZfVFVORVJfSUZfU0VMX1JFRywgY3RybCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworI2lmIDAKKwlpZl9mcmVxIC89IDEwMDAwMDA7CisKKwkvKiBkbyByb3VuZCAqLworCWlmX2ZyZXEgKz0gMC41OworCisJaWYgKE1YTF9JRl9MTyA9PSBzdGF0ZS0+Y2ZnLT5pZl9mcmVxKSB7CisJCWN0cmwgPSAweDA4OworCQlpZmZjdyA9ICh1MTYpKGlmX2ZyZXEgLyAoMTA4ICogNDA5NikpOworCX0gZWxzZSBpZiAoTVhMX0lGX0hJID09IHN0YXRlLT5jZmctPmlmX2ZyZXEpIHsKKwkJY3RybCA9IDB4MDg7CisJCWlmZmN3ID0gKHUxNikoaWZfZnJlcSAvICgyMTYgKiA0MDk2KSk7CisJfSBlbHNlIHsKKwkJY3RybCA9IDA7CisJCWlmZmN3ID0gMDsKKwl9CisKKwljdHJsIHw9IChpZmZjdyA+PiA4KTsKKyNlbmRpZgorCXJldCA9IG14bDExMXNmX3R1bmVyX3JlYWRfcmVnKHN0YXRlLCBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRywgJmN0cmwpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwljdHJsICY9IDB4ZjA7CisJY3RybCB8PSAweDkwOworCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBWNl9UVU5FUl9JRl9GQ1dfQllQX1JFRywgY3RybCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworI2lmIDAKKwljdHJsID0gaWZmY3cgJiAweDAwZmY7CisjZW5kaWYKKwlyZXQgPSBteGwxMTFzZl90dW5lcl93cml0ZV9yZWcoc3RhdGUsIFY2X1RVTkVSX0lGX0ZDV19SRUcsIGN0cmwpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZV9yZihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXEsIHU4IGJ3KQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlzdGF0aWMgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKnJlZ19jdHJsX2FycmF5OworCWludCByZXQ7CisJdTggbXhsX21vZGU7CisKKwlteGxfZGJnKCIoZnJlcSA9ICVkLCBidyA9IDB4JXgpIiwgZnJlcSwgYncpOworCisJLyogc3RvcCB0dW5lICovCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBTVEFSVF9UVU5FX1JFRywgMCk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCS8qIGNoZWNrIGRldmljZSBtb2RlICovCisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfcmVhZF9yZWcoc3RhdGUsIE1YTF9NT0RFX1JFRywgJm14bF9tb2RlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJLyogRmlsbCBvdXQgcmVnaXN0ZXJzIGZvciBjaGFubmVsIHR1bmUgKi8KKwlyZWdfY3RybF9hcnJheSA9IG14bDExMXNmX2NhbGNfcGh5X3R1bmVfcmVncyhmcmVxLCBidyk7CisJaWYgKCFyZWdfY3RybF9hcnJheSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9wcm9ncmFtX3JlZ3Moc3RhdGUsIHJlZ19jdHJsX2FycmF5KTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKChteGxfbW9kZSAmIE1YTF9ERVZfTU9ERV9NQVNLKSA9PSBNWExfVFVORVJfTU9ERSkgeworCQkvKiBJRiB0dW5lciBtb2RlIG9ubHkgKi8KKwkJbXhsMXgxc2ZfdHVuZXJfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAwKTsKKwkJbXhsMXgxc2ZfdHVuZXJfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAxKTsKKwkJbXhsMXgxc2ZfdHVuZXJfc2V0X2lmX291dHB1dF9mcmVxKHN0YXRlKTsKKwl9CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl93cml0ZV9yZWcoc3RhdGUsIFNUQVJUX1RVTkVfUkVHLCAxKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJaWYgKHN0YXRlLT5jZmctPmFudF9odW50KQorCQlzdGF0ZS0+Y2ZnLT5hbnRfaHVudChmZSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfZ2V0X2xvY2tfc3RhdHVzKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUsCisJCQkJCSAgaW50ICpyZl9zeW50aF9sb2NrLAorCQkJCQkgIGludCAqcmVmX3N5bnRoX2xvY2spCit7CisJaW50IHJldDsKKwl1OCBkYXRhOworCisJKnJmX3N5bnRoX2xvY2sgPSAwOworCSpyZWZfc3ludGhfbG9jayA9IDA7CisKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfUkZfTE9DS19TVEFUVVNfUkVHLCAmZGF0YSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpyZWZfc3ludGhfbG9jayA9ICgoZGF0YSAmIDB4MDMpID09IDB4MDMpID8gMSA6IDA7CisJKnJmX3N5bnRoX2xvY2sgID0gKChkYXRhICYgMHgwYykgPT0gMHgwYykgPyAxIDogMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgbXhsMXgxc2ZfdHVuZXJfbG9vcF90aHJ1X2N0cmwoc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSwKKwkJCQkJIGludCBvbm9mZikKK3sKKwlyZXR1cm4gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCBWNl9UVU5FUl9MT09QX1RIUlVfQ1RSTF9SRUcsCisJCQkJCW9ub2ZmID8gMSA6IDApOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKwl1OCBidzsKKworCW14bF9kYmcoIigpIik7CisKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfQVRTQykgeworCQlzd2l0Y2ggKHBhcmFtcy0+dS52c2IubW9kdWxhdGlvbikgeworCQljYXNlIFZTQl84OgorCQljYXNlIFZTQl8xNjoKKwkJCWJ3ID0gMDsgLyogQVRTQyAqLworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzY0OgorCQljYXNlIFFBTV8yNTY6CisJCQlidyA9IDE7IC8qIFVTIENBQkxFICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigiJXM6IG1vZHVsYXRpb24gbm90IHNldCEiLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCWJ3ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCWJ3ID0gNzsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCWJ3ID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyKCIlczogYmFuZHdpZHRoIG5vdCBzZXQhIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQllcnIoIiVzOiBtb2R1bGF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCEiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBteGwxeDFzZl90dW5lX3JmKGZlLCBwYXJhbXMtPmZyZXF1ZW5jeSwgYncpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0ZS0+ZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJc3RhdGUtPmJhbmR3aWR0aCA9IChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSA/CisJCXBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA6IDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgMAorc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJLyogd2FrZSBmcm9tIHN0YW5kYnkgaGFuZGxlZCBieSB1c2IgZHJpdmVyICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJLyogZW50ZXIgc3RhbmRieSBtb2RlIGhhbmRsZWQgYnkgdXNiIGRyaXZlciAqLworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9nZXRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJmX2xvY2tlZCwgcmVmX2xvY2tlZCwgcmV0OworCisJKnN0YXR1cyA9IDA7CisKKwlyZXQgPSBteGwxeDFzZl90dW5lcl9nZXRfbG9ja19zdGF0dXMoc3RhdGUsICZyZl9sb2NrZWQsICZyZWZfbG9ja2VkKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCW14bF9pbmZvKCIlcyVzIiwgcmZfbG9ja2VkID8gInJmIGxvY2tlZCAiIDogIiIsCisJCSByZWZfbG9ja2VkID8gInJlZiBsb2NrZWQiIDogIiIpOworCisJaWYgKChyZl9sb2NrZWQpIHx8IChyZWZfbG9ja2VkKSkKKwkJKnN0YXR1cyB8PSBUVU5FUl9TVEFUVVNfTE9DS0VEOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2dldF9yZl9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisJdTggdmFsMSwgdmFsMjsKKwlpbnQgcmV0OworCisJKnN0cmVuZ3RoID0gMDsKKworCXJldCA9IG14bDExMXNmX3R1bmVyX3dyaXRlX3JlZyhzdGF0ZSwgMHgwMCwgMHgwMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfRElHX1JGX1BXUl9MU0JfUkVHLCAmdmFsMSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxMTFzZl90dW5lcl9yZWFkX3JlZyhzdGF0ZSwgVjZfRElHX1JGX1BXUl9NU0JfUkVHLCAmdmFsMik7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCSpzdHJlbmd0aCA9IHZhbDEgfCAoKHZhbDIgJiAweDA3KSA8PCA4KTsKK2ZhaWw6CisJcmV0ID0gbXhsMTExc2ZfdHVuZXJfd3JpdGVfcmVnKHN0YXRlLCAweDAwLCAweDAwKTsKKwlteGxfZmFpbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfdHVuZXJfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IG14bDExMXNmX3R1bmVyX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCSpmcmVxdWVuY3kgPSBzdGF0ZS0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX3R1bmVyX2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwkqYmFuZHdpZHRoID0gc3RhdGUtPmJhbmR3aWR0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGwxMTFzZl90dW5lcl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlteGxfZGJnKCIoKSIpOworCWtmcmVlKHN0YXRlKTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBkdmJfdHVuZXJfb3BzIG14bDExMXNmX3R1bmVyX3R1bmVyX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiTWF4TGluZWFyIE14TDExMVNGIiwKKyNpZiAwCisJCS5mcmVxdWVuY3lfbWluICA9ICwKKwkJLmZyZXF1ZW5jeV9tYXggID0gLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAsCisjZW5kaWYKKwl9LAorI2lmIDAKKwkuaW5pdCAgICAgICAgICAgICAgPSBteGwxMTFzZl90dW5lcl9pbml0LAorCS5zbGVlcCAgICAgICAgICAgICA9IG14bDExMXNmX3R1bmVyX3NsZWVwLAorI2VuZGlmCisJLnNldF9wYXJhbXMgICAgICAgID0gbXhsMTExc2ZfdHVuZXJfc2V0X3BhcmFtcywKKwkuZ2V0X3N0YXR1cyAgICAgICAgPSBteGwxMTFzZl90dW5lcl9nZXRfc3RhdHVzLAorCS5nZXRfcmZfc3RyZW5ndGggICA9IG14bDExMXNmX2dldF9yZl9zdHJlbmd0aCwKKwkuZ2V0X2ZyZXF1ZW5jeSAgICAgPSBteGwxMTFzZl90dW5lcl9nZXRfZnJlcXVlbmN5LAorCS5nZXRfYmFuZHdpZHRoICAgICA9IG14bDExMXNmX3R1bmVyX2dldF9iYW5kd2lkdGgsCisJLnJlbGVhc2UgICAgICAgICAgID0gbXhsMTExc2ZfdHVuZXJfcmVsZWFzZSwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKm14bDExMXNmX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfc3RhdGUgKnN0YXRlID0gTlVMTDsKKworCW14bF9kYmcoIigpIik7CisKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl90dW5lcl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlLT5teGxfc3RhdGUgPSBteGxfc3RhdGU7CisJc3RhdGUtPmNmZyA9IGNmZzsKKworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZteGwxMTFzZl90dW5lcl90dW5lcl9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCisJZmUtPnR1bmVyX3ByaXYgPSBzdGF0ZTsKKwlyZXR1cm4gZmU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChteGwxMTFzZl90dW5lcl9hdHRhY2gpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1heExpbmVhciBNeEwxMTFTRiBDTU9TIHR1bmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAa2VybmVsbGFicy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4xIik7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi10dW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLXR1bmVyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICBteGwxMTFzZi10dW5lci5oIC0gZHJpdmVyIGZvciB0aGUgTWF4TGluZWFyIE1YTDExMVNGIENNT1MgdHVuZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGtlcm5lbGxhYnMuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01YTDExMVNGX1RVTkVSX0hfXworI2RlZmluZSBfX01YTDExMVNGX1RVTkVSX0hfXworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorCitlbnVtIG14bF9pZl9mcmVxIHsKKyNpZiAwCisJTVhMX0lGX0xPICAgID0gMHgwMCwgLyogb3RoZXIgSUYgPCA5TUh6ICovCisjZW5kaWYKKwlNWExfSUZfNF8wICAgPSAweDAxLCAvKiA0LjAgICBNSHogKi8KKwlNWExfSUZfNF81ICAgPSAweDAyLCAvKiA0LjUgICBNSHogKi8KKwlNWExfSUZfNF81NyAgPSAweDAzLCAvKiA0LjU3ICBNSHogKi8KKwlNWExfSUZfNV8wICAgPSAweDA0LCAvKiA1LjAgICBNSHogKi8KKwlNWExfSUZfNV8zOCAgPSAweDA1LCAvKiA1LjM4ICBNSHogKi8KKwlNWExfSUZfNl8wICAgPSAweDA2LCAvKiA2LjAgICBNSHogKi8KKwlNWExfSUZfNl8yOCAgPSAweDA3LCAvKiA2LjI4ICBNSHogKi8KKwlNWExfSUZfN18yICAgPSAweDA4LCAvKiA3LjIgICBNSHogKi8KKwlNWExfSUZfMzVfMjUgPSAweDA5LCAvKiAzNS4yNSBNSHogKi8KKwlNWExfSUZfMzYgICAgPSAweDBhLCAvKiAzNiAgICBNSHogKi8KKwlNWExfSUZfMzZfMTUgPSAweDBiLCAvKiAzNi4xNSBNSHogKi8KKwlNWExfSUZfNDQgICAgPSAweDBjLCAvKiA0NCAgICBNSHogKi8KKyNpZiAwCisJTVhMX0lGX0hJICAgID0gMHgwZiwgLyogb3RoZXIgSUYgPiAzNSBNSHogYW5kIDwgNDUgTUh6ICovCisjZW5kaWYKK307CisKK3N0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgeworCWVudW0gbXhsX2lmX2ZyZXEgaWZfZnJlcTsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0X3NwZWN0cnVtOjE7CisKKwlpbnQgKCpyZWFkX3JlZykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggKmRhdGEpOworCWludCAoKndyaXRlX3JlZykoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSk7CisJaW50ICgqcHJvZ3JhbV9yZWdzKShzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHN0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvICpjdHJsX3JlZ19pbmZvKTsKKwlpbnQgKCp0b3BfbWFzdGVyX2N0cmwpKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIGludCBvbm9mZik7CisJaW50ICgqYW50X2h1bnQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1VTQl9NWEwxMTFTRikgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVVNCX01YTDExMVNGX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpteGwxMTFzZl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqbXhsX3N0YXRlLAorCQkJCQkgICBzdHJ1Y3QgbXhsMTExc2ZfdHVuZXJfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKm14bDExMXNmX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3N0YXRlICpteGxfc3RhdGUKKwkJCQkJICAgc3RydWN0IG14bDExMXNmX3R1bmVyX2NvbmZpZyAqY2ZnKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX01YTDExMVNGX1RVTkVSX0hfXyAqLworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yzk4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL214bDExMXNmLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJteGwxMTFzZi5oIgorI2luY2x1ZGUgIm14bDExMXNmLXJlZy5oIgorI2luY2x1ZGUgIm14bDExMXNmLXBoeS5oIgorI2luY2x1ZGUgIm14bDExMXNmLWkyYy5oIgorI2luY2x1ZGUgIm14bDExMXNmLWdwaW8uaCIKKworI2luY2x1ZGUgIm14bDExMXNmLWRlbW9kLmgiCisjaW5jbHVkZSAibXhsMTExc2YtdHVuZXIuaCIKKworI2luY2x1ZGUgImxnZHQzMzA1LmgiCisKK2ludCBkdmJfdXNiX214bDExMXNmX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX214bDExMXNmX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgIgorCQkgIigxPWluZm8sIDI9eGZlciwgND1pMmMsIDg9cmVnLCAxNj1hZHYgKG9yLWFibGUpKS4iKTsKKworaW50IGR2Yl91c2JfbXhsMTExc2ZfaXNvYzsKK21vZHVsZV9wYXJhbV9uYW1lZChpc29jLCBkdmJfdXNiX214bDExMXNmX2lzb2MsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlzb2MsICJlbmFibGUgdXNiIGlzb2MgeGZlciAoMD1idWxrLCAxPWlzb2MpLiIpOworCisjZGVmaW5lIEFOVF9QQVRIX0FVVE8gMAorI2RlZmluZSBBTlRfUEFUSF9FWFRFUk5BTCAxCisjZGVmaW5lIEFOVF9QQVRIX0lOVEVSTkFMIDIKKworaW50IGR2Yl91c2JfbXhsMTExc2ZfcmZzd2l0Y2ggPQorI2lmIDAKKwkJQU5UX1BBVEhfQVVUTzsKKyNlbHNlCisJCUFOVF9QQVRIX0VYVEVSTkFMOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9uYW1lZChyZnN3aXRjaCwgZHZiX3VzYl9teGwxMTFzZl9yZnN3aXRjaCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmZzd2l0Y2gsICJmb3JjZSByZiBzd2l0Y2ggcG9zaXRpb24gKDA9YXV0bywgMT1leHQsIDI9aW50KS4iKTsKKworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcsIDB4MTMsIGFyZ3MpCisjZGVmaW5lIGRlYl9yZWcoYXJncy4uLikgICAgZHByaW50ayhkdmJfdXNiX214bDExMXNmX2RlYnVnLCAweDA4LCBhcmdzKQorI2RlZmluZSBkZWJfYWR2KGFyZ3MuLi4pICAgIGRwcmludGsoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZywgTVhMX0FEVl9EQkcsIGFyZ3MpCisKK2ludCBteGwxMTFzZl9jdHJsX21zZyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsCisJCSAgICAgIHU4IGNtZCwgdTggKndidWYsIGludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCisJaW50IHJldDsKKwl1OCBzbmRidWZbMSt3bGVuXTsKKworCWRlYl9hZHYoIiVzKHdsZW4gPSAlZCwgcmxlbiA9ICVkKVxuIiwgX19mdW5jX18sIHdsZW4sIHJsZW4pOworCisJbWVtc2V0KHNuZGJ1ZiwgMCwgMSt3bGVuKTsKKworCXNuZGJ1ZlswXSA9IGNtZDsKKwltZW1jcHkoJnNuZGJ1ZlsxXSwgd2J1Ziwgd2xlbik7CisKKwlyZXQgPSAod28pID8gZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsIHNuZGJ1ZiwgMSt3bGVuKSA6CisJCWR2Yl91c2JfZ2VuZXJpY19ydyhkLCBzbmRidWYsIDErd2xlbiwgcmJ1ZiwgcmxlbiwgMCk7CisJbXhsX2ZhaWwocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1YTF9DTURfUkVHX1JFQUQJMHhhYQorI2RlZmluZSBNWExfQ01EX1JFR19XUklURQkweDU1CisKK2ludCBteGwxMTFzZl9yZWFkX3JlZyhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLCB1OCBhZGRyLCB1OCAqZGF0YSkKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCXJldCA9IG14bDExMXNmX2N0cmxfbXNnKHN0YXRlLT5kLCBNWExfQ01EX1JFR19SRUFELCAmYWRkciwgMSwgYnVmLCAyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkgeworCQlteGxfZGVidWcoImVycm9yIHJlYWRpbmcgcmVnOiAweCUwMngiLCBhZGRyKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChidWZbMF0gPT0gYWRkcikKKwkJKmRhdGEgPSBidWZbMV07CisJZWxzZSB7CisJCWVycigiaW52YWxpZCByZXNwb25zZSByZWFkaW5nIHJlZzogMHglMDJ4ICE9IDB4JTAyeCwgMHglMDJ4IiwKKwkJICAgIGFkZHIsIGJ1ZlswXSwgYnVmWzFdKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlkZWJfcmVnKCJSOiAoMHglMDJ4LCAweCUwMngpXG4iLCBhZGRyLCAqZGF0YSk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBteGwxMTFzZl93cml0ZV9yZWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSkKK3sKKwl1OCBidWZbXSA9IHsgYWRkciwgZGF0YSB9OworCWludCByZXQ7CisKKwlkZWJfcmVnKCJXOiAoMHglMDJ4LCAweCUwMngpXG4iLCBhZGRyLCBkYXRhKTsKKworCXJldCA9IG14bDExMXNmX2N0cmxfbXNnKHN0YXRlLT5kLCBNWExfQ01EX1JFR19XUklURSwgYnVmLCAyLCBOVUxMLCAwKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZXJyKCJlcnJvciB3cml0aW5nIHJlZzogMHglMDJ4LCB2YWw6IDB4JTAyeCIsIGFkZHIsIGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2Zfd3JpdGVfcmVnX21hc2soc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCQkgICB1OCBhZGRyLCB1OCBtYXNrLCB1OCBkYXRhKQoreworCWludCByZXQ7CisJdTggdmFsOworCisJaWYgKG1hc2sgIT0gMHhmZikgeworCQlyZXQgPSBteGwxMTFzZl9yZWFkX3JlZyhzdGF0ZSwgYWRkciwgJnZhbCk7CisjaWYgMQorCQkvKiBkb250IGtub3cgd2h5IHRoaXMgdXN1YWxseSBlcnJvcnMgb3V0IG9uIHRoZSBmaXJzdCB0cnkgKi8KKwkJaWYgKG14bF9mYWlsKHJldCkpCisJCQllcnIoImVycm9yIHdyaXRpbmcgYWRkcjogMHglMDJ4LCBtYXNrOiAweCUwMngsICIKKwkJCSAgICAiZGF0YTogMHglMDJ4LCByZXRyeWluZy4uLiIsIGFkZHIsIG1hc2ssIGRhdGEpOworCisJCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBhZGRyLCAmdmFsKTsKKyNlbmRpZgorCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJdmFsICY9IH5tYXNrOworCXZhbCB8PSBkYXRhOworCisJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnKHN0YXRlLCBhZGRyLCB2YWwpOworCW14bF9mYWlsKHJldCk7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3Moc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBzdHJ1Y3QgbXhsMTExc2ZfcmVnX2N0cmxfaW5mbyAqY3RybF9yZWdfaW5mbykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7ICBjdHJsX3JlZ19pbmZvW2ldLmFkZHIgfAorCQkgICAgIGN0cmxfcmVnX2luZm9baV0ubWFzayB8CisJCSAgICAgY3RybF9yZWdfaW5mb1tpXS5kYXRhOyAgaSsrKSB7CisKKwkJcmV0ID0gbXhsMTExc2Zfd3JpdGVfcmVnX21hc2soc3RhdGUsCisJCQkJCSAgICAgIGN0cmxfcmVnX2luZm9baV0uYWRkciwKKwkJCQkJICAgICAgY3RybF9yZWdfaW5mb1tpXS5tYXNrLAorCQkJCQkgICAgICBjdHJsX3JlZ19pbmZvW2ldLmRhdGEpOworCQlpZiAobXhsX2ZhaWwocmV0KSkgeworCQkJZXJyKCJmYWlsZWQgb24gcmVnICMlZCAoMHglMDJ4KSIsIGksCisJCQkgICAgY3RybF9yZWdfaW5mb1tpXS5hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14bDF4MXNmX2dldF9jaGlwX2luZm8oc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCXU4IGlkLCB2ZXI7CisJY2hhciAqbXhsX2NoaXAsICpteGxfcmV2OworCisJaWYgKChzdGF0ZS0+Y2hpcF9pZCkgJiYgKHN0YXRlLT5jaGlwX3ZlcikpCisJCXJldHVybiAwOworCisJcmV0ID0gbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIENISVBfSURfUkVHLCAmaWQpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJc3RhdGUtPmNoaXBfaWQgPSBpZDsKKworCXJldCA9IG14bDExMXNmX3JlYWRfcmVnKHN0YXRlLCBUT1BfQ0hJUF9SRVZfSURfUkVHLCAmdmVyKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXN0YXRlLT5jaGlwX3ZlciA9IHZlcjsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIDB4NjE6CisJCW14bF9jaGlwID0gIk14TDEwMVNGIjsKKwkJYnJlYWs7CisJY2FzZSAweDYzOgorCQlteGxfY2hpcCA9ICJNeEwxMTFTRiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW14bF9jaGlwID0gIlVOS05PV04gTXhMMVgxIjsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAodmVyKSB7CisJY2FzZSAweDM2OgorCQlzdGF0ZS0+Y2hpcF9yZXYgPSBNWEwxMTFTRl9WNjsKKwkJbXhsX3JldiA9ICJ2NiI7CisJCWJyZWFrOworCWNhc2UgMHgwODoKKwkJc3RhdGUtPmNoaXBfcmV2ID0gTVhMMTExU0ZfVjhfMTAwOworCQlteGxfcmV2ID0gInY4XzEwMCI7CisJCWJyZWFrOworCWNhc2UgMHgxODoKKwkJc3RhdGUtPmNoaXBfcmV2ID0gTVhMMTExU0ZfVjhfMjAwOworCQlteGxfcmV2ID0gInY4XzIwMCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXRlLT5jaGlwX3JldiA9IDA7CisJCW14bF9yZXYgPSAiVU5LTk9XTiBSRVZJU0lPTiI7CisJCWJyZWFrOworCX0KKwlpbmZvKCIlcyBkZXRlY3RlZCwgJXMgKDB4JXgpIiwgbXhsX2NoaXAsIG14bF9yZXYsIHZlcik7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgZ2V0X2NoaXBfaW5mbyhzdGF0ZSkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19fcmV0OwkJCQkJCQlcCisJX19fcmV0ID0gbXhsMXgxc2ZfZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CQkJCVwKKwlpZiAobXhsX2ZhaWwoX19fcmV0KSkgewkJCQkJCVwKKwkJbXhsX2RlYnVnKCJmYWlsZWQgdG8gZ2V0IGNoaXAgaW5mbyIJCQlcCisJCQkgICIgb24gZmlyc3QgcHJvYmUgYXR0ZW1wdCIpOwkJCVwKKwkJX19fcmV0ID0gbXhsMXgxc2ZfZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CQkJXAorCQlpZiAobXhsX2ZhaWwoX19fcmV0KSkJCQkJCVwKKwkJCWVycigiZmFpbGVkIHRvIGdldCBjaGlwIGluZm8gZHVyaW5nIHByb2JlIik7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlteGxfZGVidWcoInByb2JlIG5lZWRlZCBhIHJldHJ5ICIJCVwKKwkJCQkgICJpbiBvcmRlciB0byBzdWNjZWVkLiIpOwkJXAorCX0JCQkJCQkJCVwKKwlfX19yZXQ7CQkJCQkJCQlcCit9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBteGwxMTFzZl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCS8qIHBvd2VyIGNvbnRyb2wgZGVwZW5kcyBvbiB3aGljaCBhZGFwdGVyIGlzIGJlaW5nIHdva2VuOgorCSAqIHNhdmUgdGhpcyBmb3IgaW5pdCwgaW5zdGVhZCwgdmlhIG14bDExMXNmX2FkYXBfZmVfaW5pdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2FkYXBfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlLT5pZF0ucHJpdjsKKworCWludCBlcnI7CisKKwkvKiBleGl0IGlmIHdlIGRpZG50IGluaXRpYWxpemUgdGhlIGRyaXZlciB5ZXQgKi8KKwlpZiAoIXN0YXRlLT5jaGlwX2lkKSB7CisJCW14bF9kZWJ1ZygiZHJpdmVyIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIGV4aXQuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZWJfaW5mbygiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPmZlX2xvY2spOworCisJc3RhdGUtPmFsdF9tb2RlID0gYWRhcF9zdGF0ZS0+YWx0X21vZGU7CisKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UoYWRhcC0+ZGV2LT51ZGV2LCAwLCBzdGF0ZS0+YWx0X21vZGUpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIGZhaWxlZCIpOworCisJZXJyID0gbXhsMXgxc2Zfc29mdF9yZXNldChzdGF0ZSk7CisJbXhsX2ZhaWwoZXJyKTsKKwllcnIgPSBteGwxMTFzZl9pbml0X3R1bmVyX2RlbW9kKHN0YXRlKTsKKwlteGxfZmFpbChlcnIpOworCWVyciA9IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdGF0ZSwgYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUpOworCisJbXhsX2ZhaWwoZXJyKTsKKwlteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJbXhsX2ZhaWwoZXJyKTsKKwlteGwxeDFzZl90b3BfbWFzdGVyX2N0cmwoc3RhdGUsIDEpOworCW14bF9mYWlsKGVycik7CisKKwlpZiAoKE1YTDExMVNGX0dQSU9fTU9EX0RWQlQgIT0gYWRhcF9zdGF0ZS0+Z3Bpb19tb2RlKSAmJgorCSAgICAoc3RhdGUtPmNoaXBfcmV2ID4gTVhMMTExU0ZfVjYpKSB7CisJCW14bDExMXNmX2NvbmZpZ19waW5fbXV4X21vZGVzKHN0YXRlLAorCQkJCQkgICAgICBQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEpOworCQlteGxfZmFpbChlcnIpOworCX0KKwllcnIgPSBteGwxMTFzZl9pbml0X3BvcnRfZXhwYW5kZXIoc3RhdGUpOworCWlmICghbXhsX2ZhaWwoZXJyKSkgeworCQlzdGF0ZS0+Z3Bpb19tb2RlID0gYWRhcF9zdGF0ZS0+Z3Bpb19tb2RlOworCQllcnIgPSBteGwxMTFzZl9ncGlvX21vZGVfc3dpdGNoKHN0YXRlLCBzdGF0ZS0+Z3Bpb19tb2RlKTsKKwkJbXhsX2ZhaWwoZXJyKTsKKyNpZiAwCisJCWVyciA9IGZlLT5vcHMuaW5pdChmZSk7CisjZW5kaWYKKwkJbXNsZWVwKDEwMCk7IC8qIGFkZCBzaG9ydCBkZWxheSBhZnRlciBlbmFibGluZworCQkJICAgICAgKiB0aGUgZGVtb2QgYmVmb3JlIHRvdWNoaW5nIGl0ICovCisJfQorCisJcmV0dXJuIChhZGFwX3N0YXRlLT5mZV9pbml0KSA/IGFkYXBfc3RhdGUtPmZlX2luaXQoZmUpIDogMDsKK2ZhaWw6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfYWRhcF9mZV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlLT5pZF0ucHJpdjsKKwlpbnQgZXJyOworCisJLyogZXhpdCBpZiB3ZSBkaWRudCBpbml0aWFsaXplIHRoZSBkcml2ZXIgeWV0ICovCisJaWYgKCFzdGF0ZS0+Y2hpcF9pZCkgeworCQlteGxfZGVidWcoImRyaXZlciBub3QgeWV0IGluaXRpYWxpemVkLCBleGl0LiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZGViX2luZm8oIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWVyciA9IChhZGFwX3N0YXRlLT5mZV9zbGVlcCkgPyBhZGFwX3N0YXRlLT5mZV9zbGVlcChmZSkgOiAwOworCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+ZmVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworZmFpbDoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgaW50IG14bDExMXNmX2VwNl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCXN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlICphZGFwX3N0YXRlID0gYWRhcC0+ZmVfYWRhcFthZGFwLT5hY3RpdmVfZmVdLnByaXY7CisJaW50IHJldCA9IDA7CisJdTggdG1wOworCisJZGViX2luZm8oIiVzKCVkKVxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCWlmIChvbm9mZikgeworCQlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJCXJldCA9IG14bDExMXNmX2NvbmZpZ19tcGVnX2luKHN0YXRlLCAxLCAxLAorCQkJCQkgICAgICBhZGFwX3N0YXRlLT5lcDZfY2xvY2twaGFzZSwKKwkJCQkJICAgICAgMCwgMCk7CisJCW14bF9mYWlsKHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gbXhsMTExc2ZfZGlzYWJsZV82NTZfcG9ydChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJbXhsMTExc2ZfcmVhZF9yZWcoc3RhdGUsIDB4MTIsICZ0bXApOworCXRtcCAmPSB+MHgwNDsKKwlteGwxMTFzZl93cml0ZV9yZWcoc3RhdGUsIDB4MTIsIHRtcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14bDExMXNmX2VwNF9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgb25vZmYpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCByZXQgPSAwOworCisJZGViX2luZm8oIiVzKCVkKVxuIiwgX19mdW5jX18sIG9ub2ZmKTsKKworCWlmIChvbm9mZikgeworCQlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJCW14bF9mYWlsKHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbGdkdDMzMDVfY29uZmlnIGhhdXBwYXVnZV9sZ2R0MzMwNV9jb25maWcgPSB7CisJLmkyY19hZGRyICAgICAgICAgICA9IDB4YjIgPj4gMSwKKwkubXBlZ19tb2RlICAgICAgICAgID0gTEdEVDMzMDVfTVBFR19TRVJJQUwsCisJLnRwY2xrX2VkZ2UgICAgICAgICA9IExHRFQzMzA1X1RQQ0xLX1JJU0lOR19FREdFLAorCS50cHZhbGlkX3BvbGFyaXR5ICAgPSBMR0RUMzMwNV9UUF9WQUxJRF9ISUdILAorCS5kZW55X2kyY19ycHRyICAgICAgPSAxLAorCS5zcGVjdHJhbF9pbnZlcnNpb24gPSAwLAorCS5xYW1faWZfa2h6ICAgICAgICAgPSA2MDAwLAorCS52c2JfaWZfa2h6ICAgICAgICAgPSA2MDAwLAorfTsKKworc3RhdGljIGludCBteGwxMTFzZl9sZ2R0MzMwNV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJaW50IGZlX2lkID0gYWRhcC0+bnVtX2Zyb250ZW5kc19pbml0aWFsaXplZDsKKwlzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSAqYWRhcF9zdGF0ZSA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLnByaXY7CisJaW50IHJldDsKKworCWRlYl9hZHYoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHNhdmUgYSBwb2ludGVyIHRvIHRoZSBkdmJfdXNiX2RldmljZSBpbiBkZXZpY2Ugc3RhdGUgKi8KKwlzdGF0ZS0+ZCA9IGQ7CisJYWRhcF9zdGF0ZS0+YWx0X21vZGUgPSAoZHZiX3VzYl9teGwxMTFzZl9pc29jKSA/IDIgOiAxOworCXN0YXRlLT5hbHRfbW9kZSA9IGFkYXBfc3RhdGUtPmFsdF9tb2RlOworCisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGFkYXAtPmRldi0+dWRldiwgMCwgc3RhdGUtPmFsdF9tb2RlKSA8IDApCisJCWVycigic2V0IGludGVyZmFjZSBmYWlsZWQiKTsKKworCXN0YXRlLT5ncGlvX21vZGUgPSBNWEwxMTFTRl9HUElPX01PRF9BVFNDOworCWFkYXBfc3RhdGUtPmdwaW9fbW9kZSA9IHN0YXRlLT5ncGlvX21vZGU7CisJYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUgPSBNWExfVFVORVJfTU9ERTsKKwlhZGFwX3N0YXRlLT5lcDZfY2xvY2twaGFzZSA9IDE7CisKKwlyZXQgPSBteGwxeDFzZl9zb2Z0X3Jlc2V0KHN0YXRlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX2luaXRfdHVuZXJfZGVtb2Qoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxeDFzZl9zZXRfZGV2aWNlX21vZGUoc3RhdGUsIGFkYXBfc3RhdGUtPmRldmljZV9tb2RlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2ZfZW5hYmxlX3VzYl9vdXRwdXQoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMXgxc2ZfdG9wX21hc3Rlcl9jdHJsKHN0YXRlLCAxKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhsMTExc2ZfaW5pdF9wb3J0X2V4cGFuZGVyKHN0YXRlKTsKKwlpZiAobXhsX2ZhaWwocmV0KSkKKwkJZ290byBmYWlsOworCXJldCA9IG14bDExMXNmX2dwaW9fbW9kZV9zd2l0Y2goc3RhdGUsIHN0YXRlLT5ncGlvX21vZGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMDVfYXR0YWNoLAorCQkJCSAmaGF1cHBhdWdlX2xnZHQzMzA1X2NvbmZpZywKKwkJCQkgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWlmIChhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSkgeworCQlhZGFwX3N0YXRlLT5mZV9pbml0ID0gYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5pbml0OworCQlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZS0+b3BzLmluaXQgPSBteGwxMTFzZl9hZGFwX2ZlX2luaXQ7CisJCWFkYXBfc3RhdGUtPmZlX3NsZWVwID0gYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5zbGVlcDsKKwkJYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5zbGVlcCA9IG14bDExMXNmX2FkYXBfZmVfc2xlZXA7CisJCXJldHVybiAwOworCX0KKwlyZXQgPSAtRUlPOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG14bDExMXNmX2RlbW9kX2NvbmZpZyBteGxfZGVtb2RfY29uZmlnID0geworCS5yZWFkX3JlZyAgICAgICAgPSBteGwxMTFzZl9yZWFkX3JlZywKKwkud3JpdGVfcmVnICAgICAgID0gbXhsMTExc2Zfd3JpdGVfcmVnLAorCS5wcm9ncmFtX3JlZ3MgICAgPSBteGwxMTFzZl9jdHJsX3Byb2dyYW1fcmVncywKK307CisKK3N0YXRpYyBpbnQgbXhsMTExc2ZfYXR0YWNoX2RlbW9kKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYWRhcC0+ZGV2OworCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCBmZV9pZCA9IGFkYXAtPm51bV9mcm9udGVuZHNfaW5pdGlhbGl6ZWQ7CisJc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUgKmFkYXBfc3RhdGUgPSBhZGFwLT5mZV9hZGFwW2ZlX2lkXS5wcml2OworCWludCByZXQ7CisKKwlkZWJfYWR2KCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBzYXZlIGEgcG9pbnRlciB0byB0aGUgZHZiX3VzYl9kZXZpY2UgaW4gZGV2aWNlIHN0YXRlICovCisJc3RhdGUtPmQgPSBkOworCWFkYXBfc3RhdGUtPmFsdF9tb2RlID0gKGR2Yl91c2JfbXhsMTExc2ZfaXNvYykgPyAxIDogMjsKKwlzdGF0ZS0+YWx0X21vZGUgPSBhZGFwX3N0YXRlLT5hbHRfbW9kZTsKKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShhZGFwLT5kZXYtPnVkZXYsIDAsIHN0YXRlLT5hbHRfbW9kZSkgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgZmFpbGVkIik7CisKKwlzdGF0ZS0+Z3Bpb19tb2RlID0gTVhMMTExU0ZfR1BJT19NT0RfRFZCVDsKKwlhZGFwX3N0YXRlLT5ncGlvX21vZGUgPSBzdGF0ZS0+Z3Bpb19tb2RlOworCWFkYXBfc3RhdGUtPmRldmljZV9tb2RlID0gTVhMX1NPQ19NT0RFOworCWFkYXBfc3RhdGUtPmVwNl9jbG9ja3BoYXNlID0gMTsKKworCXJldCA9IG14bDF4MXNmX3NvZnRfcmVzZXQoc3RhdGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisJcmV0ID0gbXhsMTExc2ZfaW5pdF90dW5lcl9kZW1vZChzdGF0ZSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14bDF4MXNmX3NldF9kZXZpY2VfbW9kZShzdGF0ZSwgYWRhcF9zdGF0ZS0+ZGV2aWNlX21vZGUpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSBteGwxMTFzZl9lbmFibGVfdXNiX291dHB1dChzdGF0ZSk7CisJaWYgKG14bF9mYWlsKHJldCkpCisJCWdvdG8gZmFpbDsKKwlyZXQgPSBteGwxeDFzZl90b3BfbWFzdGVyX2N0cmwoc3RhdGUsIDEpOworCWlmIChteGxfZmFpbChyZXQpKQorCQlnb3RvIGZhaWw7CisKKwkvKiBkb250IGNhcmUgaWYgdGhpcyBmYWlscyAqLworCW14bDExMXNmX2luaXRfcG9ydF9leHBhbmRlcihzdGF0ZSk7CisKKwlhZGFwLT5mZV9hZGFwW2ZlX2lkXS5mZSA9IGR2Yl9hdHRhY2gobXhsMTExc2ZfZGVtb2RfYXR0YWNoLCBzdGF0ZSwKKwkJCSAgICAgICZteGxfZGVtb2RfY29uZmlnKTsKKwlpZiAoYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUpIHsKKwkJYWRhcF9zdGF0ZS0+ZmVfaW5pdCA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuaW5pdDsKKwkJYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUtPm9wcy5pbml0ID0gbXhsMTExc2ZfYWRhcF9mZV9pbml0OworCQlhZGFwX3N0YXRlLT5mZV9zbGVlcCA9IGFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuc2xlZXA7CisJCWFkYXAtPmZlX2FkYXBbZmVfaWRdLmZlLT5vcHMuc2xlZXAgPSBteGwxMTFzZl9hZGFwX2ZlX3NsZWVwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gLUVJTzsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXhsMTExc2Zfc2V0X2FudF9wYXRoKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkJCWludCBhbnRwYXRoKQoreworCXJldHVybiBteGwxMTFzZl9pZGFjX2NvbmZpZyhzdGF0ZSwgMSwgMSwKKwkJCQkgICAgKGFudHBhdGggPT0gQU5UX1BBVEhfSU5URVJOQUwpID8KKwkJCQkgICAgMHgzZiA6IDB4MDAsIDApOworfQorCisjZGVmaW5lIERiZ0FudEh1bnQoeCwgcHdyMCwgcHdyMSwgcHdyMiwgcHdyMykgXAorCWVycigiJXMoJWQpIEZJTkFMIGlucHV0IHNldCB0byAlcyByeFB3cjolZHwlZHwlZHwlZFxuIiwgXAorCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIFwKKwkgICAgKEFOVF9QQVRIX0VYVEVSTkFMID09IHgpID8gIkVYVEVSTkFMIiA6ICJJTlRFUk5BTCIsIFwKKwkgICAgcHdyMCwgcHdyMSwgcHdyMiwgcHdyMykKKworI2RlZmluZSBBTlRfSFVOVF9TTEVFUCA5MAorI2RlZmluZSBBTlRfRVhUX1RXRUFLIDAKKworc3RhdGljIGludCBteGwxMTFzZl9hbnRfaHVudChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhZGFwLT5kZXY7CisJc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisKKwlpbnQgYW50Y3RybCA9IGR2Yl91c2JfbXhsMTExc2ZfcmZzd2l0Y2g7CisKKwl1MTYgcnhQd3JBLCByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyOworCisJLyogRklYTUU6IG11c3QgZm9yY2UgRVhURVJOQUwgZm9yIFFBTSAtIGRvbmUgZWxzZXdoZXJlICovCisJbXhsMTExc2Zfc2V0X2FudF9wYXRoKHN0YXRlLCBhbnRjdHJsID09IEFOVF9QQVRIX0FVVE8gPworCQkJICAgICAgQU5UX1BBVEhfRVhURVJOQUwgOiBhbnRjdHJsKTsKKworCWlmIChhbnRjdHJsID09IEFOVF9QQVRIX0FVVE8pIHsKKyNpZiAwCisJCW1zbGVlcChBTlRfSFVOVF9TTEVFUCk7CisjZW5kaWYKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3JBKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IwKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IxKTsKKworCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0lOVEVSTkFMKTsKKwkJbXNsZWVwKEFOVF9IVU5UX1NMRUVQKTsKKwkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X3JmX3N0cmVuZ3RoKGZlLCAmcnhQd3IyKTsKKworCQlpZiAocnhQd3IxK0FOVF9FWFRfVFdFQUsgPj0gcnhQd3IyKSB7CisJCQkvKiByZXR1cm4gd2l0aCBFWFRFUk5BTCBlbmFibGVkICovCisJCQlteGwxMTFzZl9zZXRfYW50X3BhdGgoc3RhdGUsIEFOVF9QQVRIX0VYVEVSTkFMKTsKKwkJCURiZ0FudEh1bnQoQU5UX1BBVEhfRVhURVJOQUwsIHJ4UHdyQSwKKwkJCQkgICByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJldHVybiB3aXRoIElOVEVSTkFMIGVuYWJsZWQgKi8KKwkJCURiZ0FudEh1bnQoQU5UX1BBVEhfSU5URVJOQUwsIHJ4UHdyQSwKKwkJCQkgICByeFB3cjAsIHJ4UHdyMSwgcnhQd3IyKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBteGwxMTFzZl90dW5lcl9jb25maWcgbXhsX3R1bmVyX2NvbmZpZyA9IHsKKwkuaWZfZnJlcSAgICAgICAgID0gTVhMX0lGXzZfMCwgLyogYXBwbGllcyB0byBleHRlcm5hbCBJRiBvdXRwdXQsIG9ubHkgKi8KKwkuaW52ZXJ0X3NwZWN0cnVtID0gMCwKKwkucmVhZF9yZWcgICAgICAgID0gbXhsMTExc2ZfcmVhZF9yZWcsCisJLndyaXRlX3JlZyAgICAgICA9IG14bDExMXNmX3dyaXRlX3JlZywKKwkucHJvZ3JhbV9yZWdzICAgID0gbXhsMTExc2ZfY3RybF9wcm9ncmFtX3JlZ3MsCisJLnRvcF9tYXN0ZXJfY3RybCA9IG14bDF4MXNmX3RvcF9tYXN0ZXJfY3RybCwKKwkuYW50X2h1bnQgICAgICAgID0gbXhsMTExc2ZfYW50X2h1bnQsCit9OworCitzdGF0aWMgaW50IG14bDExMXNmX2F0dGFjaF90dW5lcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGFkYXAtPmRldjsKKwlzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlID0gZC0+cHJpdjsKKwlpbnQgZmVfaWQgPSBhZGFwLT5udW1fZnJvbnRlbmRzX2luaXRpYWxpemVkOworCisJZGViX2FkdigiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKE5VTEwgIT0gZHZiX2F0dGFjaChteGwxMTFzZl90dW5lcl9hdHRhY2gsCisJCQkgICAgICAgYWRhcC0+ZmVfYWRhcFtmZV9pZF0uZmUsIHN0YXRlLAorCQkJICAgICAgICZteGxfdHVuZXJfY29uZmlnKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBteGwxMTFzZl9mZV9pb2N0bF9vdmVycmlkZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdGFnZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAoc3RhZ2UpIHsKKwljYXNlIERWQl9GRV9JT0NUTF9QUkU6CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBGRV9SRUFEX1NJR05BTF9TVFJFTkdUSDoKKwkJCWVyciA9IGZlLT5vcHMudHVuZXJfb3BzLmdldF9yZl9zdHJlbmd0aChmZSwgcGFyZyk7CisJCQkvKiBJZiBubyBlcnJvciBvY2N1cnMsIHByZXZlbnQgZHZiLWNvcmUgZnJvbSBoYW5kbGluZworCQkJICogdGhpcyBJT0NUTCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgKi8KKwkJCWlmICgwID09IGVycikKKwkJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIERWQl9GRV9JT0NUTF9QT1NUOgorCQkvKiBubyBwb3N0LWlvY3RsIGhhbmRsaW5nIHJlcXVpcmVkICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfTsKKworc3RhdGljIHUzMiBteGwxMTFzZl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RydWN0IGkyY19hbGdvcml0aG0gbXhsMTExc2ZfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBteGwxMTFzZl9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IG14bDExMXNmX2kyY19mdW5jLAorI2lmZGVmIE5FRURfQUxHT19DT05UUk9MCisJLmFsZ29fY29udHJvbCA9IGR1bW15X2FsZ29fY29udHJvbCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2R2YnRfYnVsa19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2R2YnRfaXNvY19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2F0c2NfYnVsa19wcm9wZXJ0aWVzOworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG14bDExMXNmX2F0c2NfaXNvY19wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IG14bDExMXNmX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gTlVMTDsKKworCWRlYl9hZHYoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICgoKGR2Yl91c2JfbXhsMTExc2ZfaXNvYykgJiYKKwkgICAgICgwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwKKwkJCQkgICAgICAgJm14bDExMXNmX2R2YnRfaXNvY19wcm9wZXJ0aWVzLAorCQkJCSAgICAgICBUSElTX01PRFVMRSwgJmQsIGFkYXB0ZXJfbnIpIHx8CisJICAgICAgMCA9PSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsCisJCQkJICAgICAgICZteGwxMTFzZl9hdHNjX2lzb2NfcHJvcGVydGllcywKKwkJCQkgICAgICAgVEhJU19NT0RVTEUsICZkLCBhZGFwdGVyX25yKSkpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLAorCQkJCSAgICAgJm14bDExMXNmX2R2YnRfYnVsa19wcm9wZXJ0aWVzLAorCQkJCSAgICAgVEhJU19NT0RVTEUsICZkLCBhZGFwdGVyX25yKSB8fAorCSAgICAwID09IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwKKwkJCQkgICAgICZteGwxMTFzZl9hdHNjX2J1bGtfcHJvcGVydGllcywKKwkJCQkgICAgIFRISVNfTU9EVUxFLCAmZCwgYWRhcHRlcl9ucikgfHwgMCkgeworCisJCXN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCQlzdGF0aWMgdTggZWVwcm9tWzI1Nl07CisJCXN0cnVjdCBpMmNfY2xpZW50IGM7CisJCWludCByZXQ7CisKKwkJcmV0ID0gZ2V0X2NoaXBfaW5mbyhzdGF0ZSk7CisJCWlmIChteGxfZmFpbChyZXQpKQorCQkJZXJyKCJmYWlsZWQgdG8gZ2V0IGNoaXAgaW5mbyBkdXJpbmcgcHJvYmUiKTsKKworCQltdXRleF9pbml0KCZzdGF0ZS0+ZmVfbG9jayk7CisKKwkJaWYgKHN0YXRlLT5jaGlwX3JldiA+IE1YTDExMVNGX1Y2KQorCQkJbXhsMTExc2ZfY29uZmlnX3Bpbl9tdXhfbW9kZXMoc3RhdGUsCisJCQkJCQkgICAgICBQSU5fTVVYX1RTX1NQSV9JTl9NT0RFXzEpOworCisJCWMuYWRhcHRlciA9ICZkLT5pMmNfYWRhcDsKKwkJYy5hZGRyID0gMHhhMCA+PiAxOworCisJCXJldCA9IHR2ZWVwcm9tX3JlYWQoJmMsIGVlcHJvbSwgc2l6ZW9mKGVlcHJvbSkpOworCQlpZiAobXhsX2ZhaWwocmV0KSkKKwkJCXJldHVybiAwOworCQl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZjLCAmc3RhdGUtPnR2LAorCQkJCQkgICgweDg0ID09IGVlcHJvbVsweGEwXSkgPworCQkJCQkgIGVlcHJvbSArIDB4YTAgOiBlZXByb20gKyAweDgwKTsKKyNpZiAwCisJCXN3aXRjaCAoc3RhdGUtPnR2Lm1vZGVsKSB7CisJCWNhc2UgMTE3MDAxOgorCQljYXNlIDEyNjAwMToKKwkJY2FzZSAxMzgwMDE6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXJuaW5nOiAiCisJCQkgICAgICAgInVua25vd24gaGF1cHBhdWdlIG1vZGVsICMlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgc3RhdGUtPnR2Lm1vZGVsKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiAwOworCX0KKwllcnIoIllvdXIgZGV2aWNlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAiCisJICAgICJTZWUga2VybmVsbGFicy5jb20gZm9yIG1vcmUgaW5mbyIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbXhsMTExc2ZfdGFibGVbXSA9IHsKKy8qIDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDApIH0sIC8qIEFUU0MrIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjAxKSB9LCAvKiBBVFNDICAgICAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YzYwMikgfSwgLyogICAgICsgICAgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDMpIH0sIC8qIEFUU0MrICAgICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjA0KSB9LCAvKiBEVkJUICAgICAgICAgKi8KKy8qIDUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MDkpIH0sIC8qIEFUU0MgIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjBhKSB9LCAvKiAgICAgKyBJUiAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YzYwYikgfSwgLyogQVRTQysgSVIgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MGMpIH0sIC8qIERWQlQgIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjUzKSB9LCAvKiBBVFNDKyAgICAgICAgKi8KKy8qMTAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2NWIpIH0sIC8qIEFUU0MrIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzAwKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4YjcwMSkgfSwgLyogQVRTQyAgc3cgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3MDIpIH0sIC8qICAgICArIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzAzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKy8qMTUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3MDQpIH0sIC8qIERWQlQgIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhiNzUzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4Yjc2MykgfSwgLyogQVRTQysgbm8gICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3NjQpIH0sIC8qIERWQlQgIG5vICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkODUzKSB9LCAvKiBBVFNDKyBzdyAgICAgKi8KKy8qMjAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4NTQpIH0sIC8qIERWQlQgIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkODYzKSB9LCAvKiBBVFNDKyBubyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4ZDg2NCkgfSwgLyogRFZCVCAgbm8gICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4ZDMpIH0sIC8qIEFUU0MrIHN3ICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkOGQ0KSB9LCAvKiBEVkJUICBzdyAgICAgKi8KKy8qMjUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGQ4ZTMpIH0sIC8qIEFUU0MrIG5vICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhkOGU0KSB9LCAvKiBEVkJUICBubyAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4ZDhmZikgfSwgLyogQVRTQysgICAgICAgICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MTIpIH0sIC8qICAgICArICAgICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjEzKSB9LCAvKiBBVFNDKyAgICAgICAgKi8KKy8qMzAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGM2MWEpIH0sIC8qICAgICArIElSICAgICAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX0hBVVBQQVVHRSwgMHhjNjFiKSB9LCAvKiBBVFNDKyBJUiAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIDB4Yjc1NykgfSwgLyogQVRTQytEVkJUIHN3ICovCisJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCAweGI3NjcpIH0sIC8qIEFUU0MrRFZCVCBubyAqLworCXt9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBteGwxMTFzZl90YWJsZSk7CisKKworI2RlZmluZSBNWEwxMTFTRl9FUDRfQlVMS19TVFJFQU1JTkdfQ09ORklHCQlcCisJLnN0cmVhbWluZ19jdHJsID0gbXhsMTExc2ZfZXA0X3N0cmVhbWluZ19jdHJsLAlcCisJLnN0cmVhbSA9IHsJCQkJCVwKKwkJLnR5cGUgPSBVU0JfQlVMSywJCQlcCisJCS5jb3VudCA9IDUsCQkJCVwKKwkJLmVuZHBvaW50ID0gMHgwNCwJCQlcCisJCS51ID0gewkJCQkJXAorCQkJLmJ1bGsgPSB7CQkJXAorCQkJCS5idWZmZXJzaXplID0gODE5MiwJXAorCQkJfQkJCQlcCisJCX0JCQkJCVwKKwl9CisKKy8qIEZJWE1FOiB3b3JrcyBmb3IgdjYgYnV0IG5vdCB2OCBzaWxpY29uICovCisjZGVmaW5lIE1YTDExMVNGX0VQNF9JU09DX1NUUkVBTUlOR19DT05GSUcJCVwKKwkuc3RyZWFtaW5nX2N0cmwgPSBteGwxMTFzZl9lcDRfc3RyZWFtaW5nX2N0cmwsCVwKKwkuc3RyZWFtID0gewkJCQkJXAorCQkudHlwZSA9IFVTQl9JU09DLAkJCVwKKwkJLmNvdW50ID0gNSwJCQkJXAorCQkuZW5kcG9pbnQgPSAweDA0LAkJCVwKKwkJLnUgPSB7CQkJCQlcCisJCQkuaXNvYyA9IHsJCQlcCisJCQkJLmZyYW1lc3BlcnVyYiA9IDk2LAlcCisJCQkJLyogRklYTUU6IHY2IFNJTElDT046ICovCVwKKwkJCQkuZnJhbWVzaXplID0gNTY0LAlcCisJCQkJLmludGVydmFsID0gMSwJCVwKKwkJCX0JCQkJXAorCQl9CQkJCQlcCisJfQorCisjZGVmaW5lIE1YTDExMVNGX0VQNl9CVUxLX1NUUkVBTUlOR19DT05GSUcJCVwKKwkuc3RyZWFtaW5nX2N0cmwgPSBteGwxMTFzZl9lcDZfc3RyZWFtaW5nX2N0cmwsCVwKKwkuc3RyZWFtID0gewkJCQkJXAorCQkudHlwZSA9IFVTQl9CVUxLLAkJCVwKKwkJLmNvdW50ID0gNSwJCQkJXAorCQkuZW5kcG9pbnQgPSAweDA2LAkJCVwKKwkJLnUgPSB7CQkJCQlcCisJCQkuYnVsayA9IHsJCQlcCisJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAlcCisJCQl9CQkJCVwKKwkJfQkJCQkJXAorCX0KKworLyogRklYTUUgKi8KKyNkZWZpbmUgTVhMMTExU0ZfRVA2X0lTT0NfU1RSRUFNSU5HX0NPTkZJRwkJXAorCS5zdHJlYW1pbmdfY3RybCA9IG14bDExMXNmX2VwNl9zdHJlYW1pbmdfY3RybCwJXAorCS5zdHJlYW0gPSB7CQkJCQlcCisJCS50eXBlID0gVVNCX0lTT0MsCQkJXAorCQkuY291bnQgPSA1LAkJCQlcCisJCS5lbmRwb2ludCA9IDB4MDYsCQkJXAorCQkudSA9IHsJCQkJCVwKKwkJCS5pc29jID0gewkJCVwKKwkJCQkuZnJhbWVzcGVydXJiID0gMjQsCVwKKwkJCQkuZnJhbWVzaXplID0gMzA3MiwJXAorCQkJCS5pbnRlcnZhbCA9IDEsCQlcCisJCQl9CQkJCVwKKwkJfQkJCQkJXAorCX0KKworI2RlZmluZSBNWEwxMTFTRl9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTCQkJXAorCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwJCQlcCisJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAkJCQlcCisJLyogdXNlIHVzYiBhbHQgc2V0dGluZyAxIGZvciBFUDQgSVNPQyB0cmFuc2ZlciAoZHZiLXQpLAlcCisJCQkJICAgICBFUDYgQlVMSyB0cmFuc2ZlciAoYXRzYy9xYW0pLCBcCisJICAgdXNlIHVzYiBhbHQgc2V0dGluZyAyIGZvciBFUDQgQlVMSyB0cmFuc2ZlciAoZHZiLXQpLAlcCisJCQkJICAgICBFUDYgSVNPQyB0cmFuc2ZlciAoYXRzYy9xYW0pLCBcCisJKi8JCQkJCQkJXAorCS5wb3dlcl9jdHJsICAgICAgID0gbXhsMTExc2ZfcG93ZXJfY3RybCwJCVwKKwkuaTJjX2FsZ28gICAgICAgICA9ICZteGwxMTFzZl9pMmNfYWxnbywJCQlcCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ICAgICAgICAgID0gTVhMX0VQMl9SRUdfV1JJVEUsIFwKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnRfcmVzcG9uc2UgPSBNWExfRVAxX1JFR19SRUFELCBcCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG14bDExMXNmX3N0YXRlKQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfZHZidF9idWxrX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfYXR0YWNoX2RlbW9kLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNF9CVUxLX1NUUkVBTUlOR19DT05GSUcsCisJCX0gfSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNCwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IERWQlQgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbNF0sICZteGwxMTFzZl90YWJsZVs4XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggRFZCVCAoYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxNV0sICZteGwxMTFzZl90YWJsZVsxOF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTM4eHh4IERWQlQgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMjBdLCAmbXhsMTExc2ZfdGFibGVbMjJdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjRdLCAmbXhsMTExc2ZfdGFibGVbMjZdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCAodHAtYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsyOF0sICZteGwxMTFzZl90YWJsZVszMF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfZHZidF9pc29jX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfYXR0YWNoX2RlbW9kLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNF9JU09DX1NUUkVBTUlOR19DT05GSUcsCisJCX0gfSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNCwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IERWQlQgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbNF0sICZteGwxMTFzZl90YWJsZVs4XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggRFZCVCAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxNV0sICZteGwxMTFzZl90YWJsZVsxOF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTM4eHh4IERWQlQgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMjBdLCAmbXhsMTExc2ZfdGFibGVbMjJdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjRdLCAmbXhsMTExc2ZfdGFibGVbMjZdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCAodHAtaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsyOF0sICZteGwxMTFzZl90YWJsZVszMF0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgbXhsMTExc2ZfYXRzY19idWxrX3Byb3BlcnRpZXMgPSB7CisJTVhMMTExU0ZfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKworCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0geworCQl7CisJCS5mZV9pb2N0bF9vdmVycmlkZSA9IG14bDExMXNmX2ZlX2lvY3RsX292ZXJyaWRlLAorCQkubnVtX2Zyb250ZW5kcyA9IDIsCisJCS5mZSA9IHt7CisJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSksCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gbXhsMTExc2ZfbGdkdDMzMDVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBteGwxMTFzZl9hdHRhY2hfdHVuZXIsCisKKwkJCU1YTDExMVNGX0VQNl9CVUxLX1NUUkVBTUlOR19DT05GSUcsCisJCX0sCisJCXsKKwkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlKSwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBteGwxMTFzZl9hdHRhY2hfZGVtb2QsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDExMXNmX2F0dGFjaF90dW5lciwKKworCQkJTVhMMTExU0ZfRVA0X0JVTEtfU1RSRUFNSU5HX0NPTkZJRywKKwkJfX0sCisJCX0sCisJfSwKKwkubnVtX2RldmljZV9kZXNjcyA9IDYsCisJLmRldmljZXMgPSB7CisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCBBVFNDIChidWxrKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzFdLCAmbXhsMTExc2ZfdGFibGVbNV0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTE3eHh4IEFUU0MgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTJdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDEyNnh4eCBBVFNDKyAoYnVsaykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVswXSwgJm14bDExMXNmX3RhYmxlWzNdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbN10sICZteGwxMTFzZl90YWJsZVs5XSwKKwkJCSAgJm14bDExMXNmX3RhYmxlWzEwXSwgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggQVRTQysgKGJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTFdLCAmbXhsMTExc2ZfdGFibGVbMTRdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMTZdLCAmbXhsMTExc2ZfdGFibGVbMTddLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMzJdLCAmbXhsMTExc2ZfdGFibGVbMzNdLAorCQkJICBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIE1lcmN1cnkgKHRwLWJ1bGspIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMTldLCAmbXhsMTExc2ZfdGFibGVbMjFdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjNdLCAmbXhsMTExc2ZfdGFibGVbMjVdLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMjddLCBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIFdpblRWLUFlcm8tTSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzI5XSwgJm14bDExMXNmX3RhYmxlWzMxXSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBteGwxMTFzZl9hdHNjX2lzb2NfcHJvcGVydGllcyA9IHsKKwlNWEwxMTFTRl9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAorCisJLm51bV9hZGFwdGVycyA9IDEsCisJLmFkYXB0ZXIgPSB7CisJCXsKKwkJLmZlX2lvY3RsX292ZXJyaWRlID0gbXhsMTExc2ZfZmVfaW9jdGxfb3ZlcnJpZGUsCisJCS5udW1fZnJvbnRlbmRzID0gMiwKKwkJLmZlID0ge3sKKwkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBteGwxMTFzZl9hZGFwX3N0YXRlKSwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBteGwxMTFzZl9sZ2R0MzMwNV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IG14bDExMXNmX2F0dGFjaF90dW5lciwKKworCQkJTVhMMTExU0ZfRVA2X0lTT0NfU1RSRUFNSU5HX0NPTkZJRywKKwkJfSwKKwkJeworCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG14bDExMXNmX2FkYXBfc3RhdGUpLAorCisJCQkuZnJvbnRlbmRfYXR0YWNoICA9IG14bDExMXNmX2F0dGFjaF9kZW1vZCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gbXhsMTExc2ZfYXR0YWNoX3R1bmVyLAorCisJCQlNWEwxMTFTRl9FUDRfSVNPQ19TVFJFQU1JTkdfQ09ORklHLAorCQl9fSwKKwkJfSwKKwl9LAorCS5udW1fZGV2aWNlX2Rlc2NzID0gNiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IEFUU0MgKGlzb2MpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmbXhsMTExc2ZfdGFibGVbMV0sICZteGwxMTFzZl90YWJsZVs1XSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCQl7ICAgIkhhdXBwYXVnZSAxMTd4eHggQVRTQyAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxMl0sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgMTI2eHh4IEFUU0MrIChpc29jKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzBdLCAmbXhsMTExc2ZfdGFibGVbM10sCisJCQkgICZteGwxMTFzZl90YWJsZVs3XSwgJm14bDExMXNmX3RhYmxlWzldLAorCQkJICAmbXhsMTExc2ZfdGFibGVbMTBdLCBOVUxMIH0sCisJCX0sCisJCXsgICAiSGF1cHBhdWdlIDExN3h4eCBBVFNDKyAoaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxMV0sICZteGwxMTFzZl90YWJsZVsxNF0sCisJCQkgICZteGwxMTFzZl90YWJsZVsxNl0sICZteGwxMTFzZl90YWJsZVsxN10sCisJCQkgICZteGwxMTFzZl90YWJsZVszMl0sICZteGwxMTFzZl90YWJsZVszM10sCisJCQkgIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgTWVyY3VyeSAodHAtaXNvYykiLAorCQkJeyBOVUxMIH0sCisJCQl7ICZteGwxMTFzZl90YWJsZVsxOV0sICZteGwxMTFzZl90YWJsZVsyMV0sCisJCQkgICZteGwxMTFzZl90YWJsZVsyM10sICZteGwxMTFzZl90YWJsZVsyNV0sCisJCQkgICZteGwxMTFzZl90YWJsZVsyN10sIE5VTEwgfSwKKwkJfSwKKwkJeyAgICJIYXVwcGF1Z2UgV2luVFYtQWVyby1NICh0cC1pc29jKSIsCisJCQl7IE5VTEwgfSwKKwkJCXsgJm14bDExMXNmX3RhYmxlWzI5XSwgJm14bDExMXNmX3RhYmxlWzMxXSwKKwkJCSAgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBteGwxMTFzZl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImR2Yl91c2JfbXhsMTExc2YiLAorCS5wcm9iZQkJPSBteGwxMTFzZl9wcm9iZSwKKwkuZGlzY29ubmVjdCAgICAgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IG14bDExMXNmX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhsMTExc2ZfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZteGwxMTFzZl9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhsMTExc2ZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmbXhsMTExc2ZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXhsMTExc2ZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobXhsMTExc2ZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBrZXJuZWxsYWJzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBNYXhMaW5lYXIgTXhMMTExU0YiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbXhsMTExc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRkODlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9teGwxMTFzZi5oCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QGtlcm5lbGxhYnMuY29tKQorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisKKyNpZm5kZWYgX0RWQl9VU0JfTVhMMTExU0ZfSF8KKyNkZWZpbmUgX0RWQl9VU0JfTVhMMTExU0ZfSF8KKworI2lmZGVmIERWQl9VU0JfTE9HX1BSRUZJWAorI3VuZGVmIERWQl9VU0JfTE9HX1BSRUZJWAorI2VuZGlmCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAibXhsMTExc2YiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+CisKKyNkZWZpbmUgTVhMX0VQMV9SRUdfUkVBRCAgICAgMQorI2RlZmluZSBNWExfRVAyX1JFR19XUklURSAgICAyCisjZGVmaW5lIE1YTF9FUDNfSU5URVJSVVBUICAgIDMKKyNkZWZpbmUgTVhMX0VQNF9NUEVHMiAgICAgICAgNAorI2RlZmluZSBNWExfRVA1X0kyUyAgICAgICAgICA1CisjZGVmaW5lIE1YTF9FUDZfNjU2ICAgICAgICAgIDYKKyNkZWZpbmUgTVhMX0VQNl9NUEVHMiAgICAgICAgNgorCisjaWZkZWYgVVNJTkdfRU5VTV9teGwxMTFzZl9jdXJyZW50X21vZGUKK2VudW0gbXhsMTExc2ZfY3VycmVudF9tb2RlIHsKKwlteGxfbW9kZV9kdmJ0ID0gTVhMX0VQNF9NUEVHMiwKKwlteGxfbW9kZV9taCAgID0gTVhMX0VQNV9JMlMsCisJbXhsX21vZGVfYXRzYyA9IE1YTF9FUDZfTVBFRzIsCit9OworI2VuZGlmCisKK2VudW0gbXhsMTExc2ZfZ3Bpb19wb3J0X2V4cGFuZGVyIHsKKwlteGwxMTFzZl9ncGlvX2h3LAorCW14bDExMXNmX1BDQTk1MzQsCit9OworCitzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgeworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKKworCWVudW0gbXhsMTExc2ZfZ3Bpb19wb3J0X2V4cGFuZGVyIGdwaW9fcG9ydF9leHBhbmRlcjsKKwl1OCBwb3J0X2V4cGFuZGVyX2FkZHI7CisKKwl1OCBjaGlwX2lkOworCXU4IGNoaXBfdmVyOworI2RlZmluZSBNWEwxMTFTRl9WNiAgICAgMQorI2RlZmluZSBNWEwxMTFTRl9WOF8xMDAgMgorI2RlZmluZSBNWEwxMTFTRl9WOF8yMDAgMworCXU4IGNoaXBfcmV2OworCisjaWZkZWYgVVNJTkdfRU5VTV9teGwxMTFzZl9jdXJyZW50X21vZGUKKwllbnVtIG14bDExMXNmX2N1cnJlbnRfbW9kZSBjdXJyZW50X21vZGU7CisjZW5kaWYKKworI2RlZmluZSBNWExfVFVORVJfTU9ERSAgICAgICAgIDAKKyNkZWZpbmUgTVhMX1NPQ19NT0RFICAgICAgICAgICAxCisjZGVmaW5lIE1YTF9ERVZfTU9ERV9NQVNLICAgICAgMHgwMQorI2lmIDEKKwlpbnQgZGV2aWNlX21vZGU7CisjZW5kaWYKKwkvKiB1c2UgdXNiIGFsdCBzZXR0aW5nIDEgZm9yIEVQNCBJU09DIHRyYW5zZmVyIChkdmItdCksCisJCQkJICAgICBFUDUgQlVMSyB0cmFuc2ZlciAoYXRzYy1taCksCisJCQkJICAgICBFUDYgQlVMSyB0cmFuc2ZlciAoYXRzYy9xYW0pLAorCSAgIHVzZSB1c2IgYWx0IHNldHRpbmcgMiBmb3IgRVA0IEJVTEsgdHJhbnNmZXIgKGR2Yi10KSwKKwkJCQkgICAgIEVQNSBJU09DIHRyYW5zZmVyIChhdHNjLW1oKSwKKwkJCQkgICAgIEVQNiBJU09DIHRyYW5zZmVyIChhdHNjL3FhbSksCisJICovCisJaW50IGFsdF9tb2RlOworCWludCBncGlvX21vZGU7CisJc3RydWN0IHR2ZWVwcm9tIHR2OworCisJc3RydWN0IG11dGV4IGZlX2xvY2s7Cit9OworCitzdHJ1Y3QgbXhsMTExc2ZfYWRhcF9zdGF0ZSB7CisJaW50IGFsdF9tb2RlOworCWludCBncGlvX21vZGU7CisJaW50IGRldmljZV9tb2RlOworCWludCBlcDZfY2xvY2twaGFzZTsKKwlpbnQgKCpmZV9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworCWludCAoKmZlX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworfTsKKworaW50IG14bDExMXNmX3JlYWRfcmVnKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsIHU4IGFkZHIsIHU4ICpkYXRhKTsKK2ludCBteGwxMTFzZl93cml0ZV9yZWcoc3RydWN0IG14bDExMXNmX3N0YXRlICpzdGF0ZSwgdTggYWRkciwgdTggZGF0YSk7CisKK3N0cnVjdCBteGwxMTFzZl9yZWdfY3RybF9pbmZvIHsKKwl1OCBhZGRyOworCXU4IG1hc2s7CisJdTggZGF0YTsKK307CisKK2ludCBteGwxMTFzZl93cml0ZV9yZWdfbWFzayhzdHJ1Y3QgbXhsMTExc2Zfc3RhdGUgKnN0YXRlLAorCQkJICAgIHU4IGFkZHIsIHU4IG1hc2ssIHU4IGRhdGEpOworaW50IG14bDExMXNmX2N0cmxfcHJvZ3JhbV9yZWdzKHN0cnVjdCBteGwxMTFzZl9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgc3RydWN0IG14bDExMXNmX3JlZ19jdHJsX2luZm8gKmN0cmxfcmVnX2luZm8pOworCisvKiBuZWVkZWQgZm9yIGhhcmR3YXJlIGkyYyBmdW5jdGlvbnMgaW4gbXhsMTExc2YtaTJjLmM6CisgKiBteGwxMTFzZl9pMmNfc2VuZF9kYXRhIC8gbXhsMTExc2ZfaTJjX2dldF9kYXRhICovCitpbnQgbXhsMTExc2ZfY3RybF9tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLAorCQkgICAgICB1OCBjbWQsIHU4ICp3YnVmLCBpbnQgd2xlbiwgdTggKnJidWYsIGludCBybGVuKTsKKworI2RlZmluZSBteGxfcHJpbnRrKGtlcm4sIGZtdCwgYXJnLi4uKSBcCisJcHJpbnRrKGtlcm4gIiVzOiAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIyNhcmcpCisKKyNkZWZpbmUgbXhsX2luZm8oZm10LCBhcmcuLi4pIFwKKwlteGxfcHJpbnRrKEtFUk5fSU5GTywgZm10LCAjI2FyZykKKworZXh0ZXJuIGludCBkdmJfdXNiX214bDExMXNmX2RlYnVnOworI2RlZmluZSBteGxfZGVidWcoZm10LCBhcmcuLi4pIFwKKwlpZiAoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgTVhMX0kyQ19EQkcgMHgwNAorI2RlZmluZSBNWExfQURWX0RCRyAweDEwCisjZGVmaW5lIG14bF9kZWJ1Z19hZHYoZm10LCBhcmcuLi4pIFwKKwlpZiAoZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZyAmIE1YTF9BRFZfREJHKSBcCisJCW14bF9wcmludGsoS0VSTl9ERUJVRywgZm10LCAjI2FyZykKKworI2RlZmluZSBteGxfaTJjKGZtdCwgYXJnLi4uKSBcCisJaWYgKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgJiBNWExfSTJDX0RCRykgXAorCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKyNkZWZpbmUgbXhsX2kyY19hZHYoZm10LCBhcmcuLi4pIFwKKwlpZiAoKGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgJiAoTVhMX0kyQ19EQkcgfCBNWExfQURWX0RCRykpID09IFwKKwkJKE1YTF9JMkNfREJHIHwgTVhMX0FEVl9EQkcpKSBcCisJCQlteGxfcHJpbnRrKEtFUk5fREVCVUcsIGZtdCwgIyNhcmcpCisKKy8qIFRoZSBmb2xsb3dpbmcgYWxsb3dzIHRoZSBteGxfZmFpbCgpIG1hY3JvIGRlZmluZWQgYmVsb3cgdG8gd29yaworICogaW4gZXh0ZXJuZWwgbW9kdWxlcywgc3VjaCBhcyBteGwxMTFzZi10dW5lci5rbywgZXZlbiB0aG91Z2gKKyAqIGR2Yl91c2JfbXhsMTExc2ZfZGVidWcgaXMgbm90IGRlZmluZWQgd2l0aGluIHRob3NlIG1vZHVsZXMgKi8KKyNpZiAoZGVmaW5lZChfX01YTDExMVNGX1RVTkVSX0hfXykpIHx8IChkZWZpbmVkKF9fTVhMMTExU0ZfREVNT0RfSF9fKSkKKyNkZWZpbmUgTVhMX0FEVl9ERUJVR19FTkFCTEVEIE1YTF9BRFZfREJHCisjZWxzZQorI2RlZmluZSBNWExfQURWX0RFQlVHX0VOQUJMRUQgZHZiX3VzYl9teGwxMTFzZl9kZWJ1ZworI2VuZGlmCisKKyNkZWZpbmUgbXhsX2ZhaWwocmV0KQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19yZXQ7CQkJCQkJCVwKKwlfX3JldCA9IChyZXQgPCAwKTsJCQkJCQlcCisJaWYgKChfX3JldCkgJiYgKE1YTF9BRFZfREVCVUdfRU5BQkxFRCAmIE1YTF9BRFZfREJHKSkJCVwKKwkJbXhsX3ByaW50ayhLRVJOX0VSUiwgImVycm9yICVkIG9uIGxpbmUgJWQiLAkJXAorCQkJICAgcmV0LCBfX0xJTkVfXyk7CQkJCVwKKwlfX3JldDsJCQkJCQkJCVwKK30pCisKKyNlbmRpZiAvKiBfRFZCX1VTQl9NWEwxMTFTRl9IXyAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCmluZGV4IGJjMzUwZTkuLjIxMzg0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKQEAgLTE2Niw2ICsxNjYsOCBAQAogCS5udW1fYWRhcHRlcnMgICAgID0gMSwKIAkuYWRhcHRlciAgICAgICAgICA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIApAQCAtMTg2LDcgKzE4OCw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmMKaW5kZXggMmU0ZmFiNy4uOThmZDlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL29wZXJhMS5jCkBAIC0yNjMsMTAgKzI2MywxMCBAQAogCiBzdGF0aWMgaW50IG9wZXJhMV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqZCkKIHsKLQlpZiAoKGQtPmZlID0KLQkgICAgIGR2Yl9hdHRhY2goc3R2MDI5OV9hdHRhY2gsICZvcGVyYTFfc3R2MDI5OV9jb25maWcsCi0JCQkmZC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKLQkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IG9wZXJhMV9zZXRfdm9sdGFnZTsKKwlkLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChzdHYwMjk5X2F0dGFjaCwgJm9wZXJhMV9zdHYwMjk5X2NvbmZpZywKKwkJCQkgICAgICAmZC0+ZGV2LT5pMmNfYWRhcCk7CisJaWYgKChkLT5mZV9hZGFwWzBdLmZlKSAhPSBOVUxMKSB7CisJCWQtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IG9wZXJhMV9zZXRfdm9sdGFnZTsKIAkJcmV0dXJuIDA7CiAJfQogCWluZm8oIm5vdCBhdHRhY2hlZCBzdHYwMjk5Iik7CkBAIC0yNzYsNyArMjc2LDcgQEAKIHN0YXRpYyBpbnQgb3BlcmExX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWR2Yl9hdHRhY2goCi0JCWR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMD4+MSwKKwkJZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4YzA+PjEsCiAJCSZhZGFwLT5kZXYtPmkyY19hZGFwLCBEVkJfUExMX09QRVJBMQogCSk7CiAJcmV0dXJuIDA7CkBAIC01MTYsNiArNTE2LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoID0gb3BlcmExX2Zyb250ZW5kX2F0dGFjaCwKIAkJCS5zdHJlYW1pbmdfY3RybCA9IG9wZXJhMV9zdHJlYW1pbmdfY3RybCwKIAkJCS50dW5lcl9hdHRhY2ggPSBvcGVyYTFfdHVuZXJfYXR0YWNoLApAQCAtNTM1LDYgKzUzNyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAorCQl9fSwKIAkJfQogCX0sCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9wY3R2NDUyZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9wY3R2NDUyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWVjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3BjdHY0NTJlLmMKQEAgLTAsMCArMSwxMDc5IEBACisvKgorICogUENUViA0NTJlIERWQiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBEb21pbmlrIEt1aGxlbiA8ZGt1aGxlbkBnbXgubmV0PgorICoKKyAqIFRUIGNvbm5lY3QgUzItMzY1MC1DSSBDb21tb24gSW50ZXJmYWNlIHN1cHBvcnQsIE1BQyByZWFkb3V0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFlbCBILiBTY2hpbWVrIDxtc2NoaW1la0BnbXguYXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKiBkdmIgdXNiIGZyYW1ld29yayAqLworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggInBjdHY0NTJlIgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworLyogRGVtb2R1bGF0b3IgKi8KKyNpbmNsdWRlICJzdGIwODk5X2Rydi5oIgorI2luY2x1ZGUgInN0YjA4OTlfcmVnLmgiCisjaW5jbHVkZSAic3RiMDg5OV9jZmcuaCIKKy8qIFR1bmVyICovCisjaW5jbHVkZSAic3RiNjEwMC5oIgorI2luY2x1ZGUgInN0YjYxMDBfY2ZnLmgiCisvKiBGRSBQb3dlciAqLworI2luY2x1ZGUgImxuYnAyMi5oIgorCisjaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKKyNpbmNsdWRlICJ0dHBjaS1lZXByb20uaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKKyNkZWZpbmUgSVNPQ19JTlRFUkZBQ0VfQUxURVJOQVRJVkUgMworCisjZGVmaW5lIFNZTkNfQllURV9PVVQgMHhhYQorI2RlZmluZSBTWU5DX0JZVEVfSU4gIDB4NTUKKworLyogZ3Vlc3NlZDogKGNvcGllZCBmcm9tIHR0dXNiLWJ1ZGdldCkgKi8KKyNkZWZpbmUgUENUVl9DTURfUkVTRVQgMHgxNQorLyogY29tbWFuZCB0byBwb2xsIElSIHJlY2VpdmVyICovCisjZGVmaW5lIFBDVFZfQ01EX0lSICAgIDB4MWIKKy8qIGNvbW1hbmQgdG8gc2VuZCBJMkMgICovCisjZGVmaW5lIFBDVFZfQ01EX0kyQyAgIDB4MzEKKworI2RlZmluZSBJMkNfQUREUl9TVEIwODk5ICgweGQwID4+IDEpCisjZGVmaW5lIEkyQ19BRERSX1NUQjYxMDAgKDB4YzAgPj4gMSkKKyNkZWZpbmUgSTJDX0FERFJfTE5CUDIyICAoMHgxMCA+PiAxKQorI2RlZmluZSBJMkNfQUREUl8yNEMxNiAgICgweGEwID4+IDEpCisjZGVmaW5lIEkyQ19BRERSXzI0QzY0ICAgKDB4YTIgPj4gMSkKKworCisvKiBwY3R2NDUyZSBzZW5kcyB1cyB0aGlzIGFtb3VudCBvZiBkYXRhIGZvciBlYWNoIGlzc3VlZCB1c2ItY29tbWFuZCAqLworI2RlZmluZSBQQ1RWX0FOU1dFUl9MRU4gNjQKKy8qIFdhaXQgdXAgdG8gMTAwMG1zIGZvciBkZXZpY2UgICovCisjZGVmaW5lIFBDVFZfVElNRU9VVCAxMDAwCisKKworI2RlZmluZSBQQ1RWX0xFRF9HUElPICAgU1RCMDg5OV9HUElPMDEKKyNkZWZpbmUgUENUVl9MRURfR1JFRU4gIDB4ODIKKyNkZWZpbmUgUENUVl9MRURfT1JBTkdFIDB4MDIKKworI2RlZmluZSBjaV9kYmcoZm9ybWF0LCBhcmcuLi4pCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICgwKQkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFZCX1VTQl9MT0dfUFJFRklYCVwKKwkJCSI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCitlbnVtIHsKKwlUVDM2NTBfQ01EX0NJX1RFU1QgPSAweDQwLAorCVRUMzY1MF9DTURfQ0lfUkRfQ1RSTCwKKwlUVDM2NTBfQ01EX0NJX1dSX0NUUkwsCisJVFQzNjUwX0NNRF9DSV9SRF9BVFRSLAorCVRUMzY1MF9DTURfQ0lfV1JfQVRUUiwKKwlUVDM2NTBfQ01EX0NJX1JFU0VULAorCVRUMzY1MF9DTURfQ0lfU0VUX1ZJREVPX1BPUlQKK307CisKKworc3RhdGljIHN0cnVjdCBzdGIwODk5X3Bvc3Rwcm9jIHBjdHY0NWVfcG9zdHByb2NbXSA9IHsKKwl7IFBDVFZfTEVEX0dQSU8sIFNUQjA4OTlfR1BJT1BVTExVUCB9LAorCXsgMCwgMCB9Cit9OworCisvKgorICogc3RvcmVzIGFsbCBwcml2YXRlIHZhcmlhYmxlcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBQQ1RWNDUyZSBEVkItUzIKKyAqLworc3RydWN0IHBjdHY0NTJlX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7CisJc3RydWN0IG11dGV4IGNhX211dGV4OworCisJdTggYzsJICAgLyogdHJhbnNhY3Rpb24gY291bnRlciwgd3JhcHMgYXJvdW5kLi4uICAqLworCXU4IGluaXRpYWxpemVkOyAvKiBzZXQgdG8gMSBpZiAweDE1IGhhcyBiZWVuIHNlbnQgKi8KKwl1MTYgbGFzdF9yY19rZXk7Cit9OworCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBjbWQsIHU4ICpkYXRhLAorCQkJIHVuc2lnbmVkIGludCB3cml0ZV9sZW4sIHVuc2lnbmVkIGludCByZWFkX2xlbikKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJdTggYnVmWzY0XTsKKwl1OCBpZDsKKwl1bnNpZ25lZCBpbnQgcmxlbjsKKwlpbnQgcmV0OworCisJQlVHX09OKE5VTEwgPT0gZGF0YSAmJiAwICE9ICh3cml0ZV9sZW4gfCByZWFkX2xlbikpOworCUJVR19PTih3cml0ZV9sZW4gPiA2NCAtIDQpOworCUJVR19PTihyZWFkX2xlbiA+IDY0IC0gNCk7CisKKwlpZCA9IHN0YXRlLT5jKys7CisKKwlidWZbMF0gPSBTWU5DX0JZVEVfT1VUOworCWJ1ZlsxXSA9IGlkOworCWJ1ZlsyXSA9IGNtZDsKKwlidWZbM10gPSB3cml0ZV9sZW47CisKKwltZW1jcHkoYnVmICsgNCwgZGF0YSwgd3JpdGVfbGVuKTsKKworCXJsZW4gPSAocmVhZF9sZW4gPiAwKSA/IDY0IDogMDsKKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYnVmLCA0ICsgd3JpdGVfbGVuLAorCQkJCSAgYnVmLCBybGVuLCAvKiBkZWxheV9tcyAqLyAwKTsKKwlpZiAoMCAhPSByZXQpCisJCWdvdG8gZmFpbGVkOworCisJcmV0ID0gLUVJTzsKKwlpZiAoU1lOQ19CWVRFX0lOICE9IGJ1ZlswXSB8fCBpZCAhPSBidWZbMV0pCisJCWdvdG8gZmFpbGVkOworCisJbWVtY3B5KGRhdGEsIGJ1ZiArIDQsIHJlYWRfbGVuKTsKKworCXJldHVybiAwOworCitmYWlsZWQ6CisJZXJyKCJDSSBlcnJvciAlZDsgJTAyWCAlMDJYICUwMlggLT4gJTAyWCAlMDJYICUwMlguIiwKKwkgICAgIHJldCwgU1lOQ19CWVRFX09VVCwgaWQsIGNtZCwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2dfbG9ja2VkKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJdTggY21kLCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IHdyaXRlX2xlbiwKKwkJCQl1bnNpZ25lZCBpbnQgcmVhZF9sZW4pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKWNhLT5kYXRhOworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3RhdGUtPmNhX211dGV4KTsKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIGNtZCwgZGF0YSwgd3JpdGVfbGVuLCByZWFkX2xlbik7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcmVhZF9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJIGludCBzbG90LCBpbnQgYWRkcmVzcykKK3sKKwl1OCBidWZbM107CisJaW50IHJldDsKKworCWlmICgwICE9IHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9SRF9BVFRSLCBidWYsIDIsIDMpOworCisJY2lfZGJnKCIlcyAlMDR4IC0+ICVkIDB4JTAyeCIsCisJCV9fZnVuY19fLCBhZGRyZXNzLCByZXQsIGJ1ZlsyXSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBidWZbMl07Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3dyaXRlX2F0dHJpYnV0ZV9tZW0oc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50IHNsb3QsIGludCBhZGRyZXNzLCB1OCB2YWx1ZSkKK3sKKwl1OCBidWZbM107CisKKwljaV9kYmcoIiVzICVkIDB4JTA0eCAweCUwMngiLAorCQlfX2Z1bmNfXywgc2xvdCwgYWRkcmVzcywgdmFsdWUpOworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWZbMF0gPSAoYWRkcmVzcyA+PiA4KSAmIDB4MEY7CisJYnVmWzFdID0gYWRkcmVzczsKKwlidWZbMl0gPSB2YWx1ZTsKKworCXJldHVybiB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9XUl9BVFRSLCBidWYsIDMsIDMpOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9yZWFkX2NhbV9jb250cm9sKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCisJCQkJIGludAkJCXNsb3QsCisJCQkJIHU4CQkJYWRkcmVzcykKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCWlmICgwICE9IHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gYWRkcmVzcyAmIDM7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9SRF9DVFJMLCBidWYsIDEsIDIpOworCisJY2lfZGJnKCIlcyAweCUwMnggLT4gJWQgMHglMDJ4IiwKKwkJX19mdW5jX18sIGFkZHJlc3MsIHJldCwgYnVmWzFdKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGJ1ZlsxXTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2woc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50CQkJc2xvdCwKKwkJCQkgdTgJCQlhZGRyZXNzLAorCQkJCSB1OAkJCXZhbHVlKQoreworCXU4IGJ1ZlsyXTsKKworCWNpX2RiZygiJXMgJWQgMHglMDJ4IDB4JTAyeCIsCisJCV9fZnVuY19fLCBzbG90LCBhZGRyZXNzLCB2YWx1ZSk7CisKKwlpZiAoMCAhPSBzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3M7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQ1RSTCwgYnVmLCAyLCAyKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2V0X3ZpZGVvX3BvcnQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKKwkJCQkgaW50CQkJc2xvdCwKKwkJCQkgaW50CQkJZW5hYmxlKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlcyAlZCAlZCIsIF9fZnVuY19fLCBzbG90LCBlbmFibGUpOworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGUgPSAhIWVuYWJsZTsKKwlidWZbMF0gPSBlbmFibGU7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9TRVRfVklERU9fUE9SVCwgYnVmLCAxLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChlbmFibGUgIT0gYnVmWzBdKSB7CisJCWVycigiQ0kgbm90ICVzYWJsZWQuIiwgZW5hYmxlID8gImVuIiA6ICJkaXMiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3Rfc2h1dGRvd24oc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJcmV0dXJuIHR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydChjYSwgc2xvdCwgLyogZW5hYmxlICovIDApOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9zbG90X3RzX2VuYWJsZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gdHQzNjUwX2NpX3NldF92aWRlb19wb3J0KGNhLCBzbG90LCAvKiBlbmFibGUgKi8gMSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3RfcmVzZXQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKWNhLT5kYXRhOworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBidWZbMV07CisJaW50IHJldDsKKworCWNpX2RiZygiJXMgJWQiLCBfX2Z1bmNfXywgc2xvdCk7CisKKwlpZiAoMCAhPSBzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IDA7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBUVDM2NTBfQ01EX0NJX1JFU0VULCBidWYsIDEsIDEpOworCWlmICgwICE9IHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDE7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKDAgIT0gcmV0KQorCQlnb3RvIGZhaWxlZDsKKworCW1zbGVlcCg1MDApOworCisJYnVmWzBdID0gMDsgLyogRlRBICovCisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfU0VUX1ZJREVPX1BPUlQsIGJ1ZiwgMSwgMSk7CisKKyBmYWlsZWQ6CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y2FfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcG9sbF9zbG90X3N0YXR1cyhzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLAorCQkJCSBpbnQJCQlzbG90LAorCQkJCSBpbnQJCQlvcGVuKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJaWYgKDAgIT0gc2xvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnX2xvY2tlZChjYSwgVFQzNjUwX0NNRF9DSV9URVNULCBidWYsIDAsIDEpOworCWlmICgwICE9IHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgxID09IGJ1ZlswXSkKKwkJcmV0dXJuIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQgfAorCQkJRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCB0dDM2NTBfY2lfdW5pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlOworCisJY2lfZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCWlmIChOVUxMID09IGQpCisJCXJldHVybjsKKworCXN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJaWYgKE5VTEwgPT0gc3RhdGUpCisJCXJldHVybjsKKworCWlmIChOVUxMID09IHN0YXRlLT5jYS5kYXRhKQorCQlyZXR1cm47CisKKwkvKiBFcnJvciBpZ25vcmVkLiAqLworCXR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydCgmc3RhdGUtPmNhLCAvKiBzbG90ICovIDAsIC8qIGVuYWJsZSAqLyAwKTsKKworCWR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UoJnN0YXRlLT5jYSk7CisKKwltZW1zZXQoJnN0YXRlLT5jYSwgMCwgc2l6ZW9mKHN0YXRlLT5jYSkpOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9pbml0KHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmEpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gYS0+ZGV2OworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCW11dGV4X2luaXQoJnN0YXRlLT5jYV9tdXRleCk7CisKKwlzdGF0ZS0+Y2Eub3duZXIgPSBUSElTX01PRFVMRTsKKwlzdGF0ZS0+Y2EucmVhZF9hdHRyaWJ1dGVfbWVtID0gdHQzNjUwX2NpX3JlYWRfYXR0cmlidXRlX21lbTsKKwlzdGF0ZS0+Y2Eud3JpdGVfYXR0cmlidXRlX21lbSA9IHR0MzY1MF9jaV93cml0ZV9hdHRyaWJ1dGVfbWVtOworCXN0YXRlLT5jYS5yZWFkX2NhbV9jb250cm9sID0gdHQzNjUwX2NpX3JlYWRfY2FtX2NvbnRyb2w7CisJc3RhdGUtPmNhLndyaXRlX2NhbV9jb250cm9sID0gdHQzNjUwX2NpX3dyaXRlX2NhbV9jb250cm9sOworCXN0YXRlLT5jYS5zbG90X3Jlc2V0ID0gdHQzNjUwX2NpX3Nsb3RfcmVzZXQ7CisJc3RhdGUtPmNhLnNsb3Rfc2h1dGRvd24gPSB0dDM2NTBfY2lfc2xvdF9zaHV0ZG93bjsKKwlzdGF0ZS0+Y2Euc2xvdF90c19lbmFibGUgPSB0dDM2NTBfY2lfc2xvdF90c19lbmFibGU7CisJc3RhdGUtPmNhLnBvbGxfc2xvdF9zdGF0dXMgPSB0dDM2NTBfY2lfcG9sbF9zbG90X3N0YXR1czsKKwlzdGF0ZS0+Y2EuZGF0YSA9IGQ7CisKKwlyZXQgPSBkdmJfY2FfZW41MDIyMV9pbml0KCZhLT5kdmJfYWRhcCwKKwkJCQkgICAmc3RhdGUtPmNhLAorCQkJCSAgIC8qIGZsYWdzICovIDAsCisJCQkJICAgLyogbl9zbG90cyAqLyAxKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJZXJyKCJDYW5ub3QgaW5pdGlhbGl6ZSBDSTogRXJyb3IgJWQuIiwgcmV0KTsKKwkJbWVtc2V0KCZzdGF0ZS0+Y2EsIDAsIHNpemVvZihzdGF0ZS0+Y2EpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvKCJDSSBpbml0aWFsaXplZC4iKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIENNRF9CVUZGRVJfU0laRSAweDI4CitzdGF0aWMgaW50IHBjdHY0NTJlX2kyY19tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBhZGRyLAorCQkJCWNvbnN0IHU4ICpzbmRfYnVmLCB1OCBzbmRfbGVuLAorCQkJCXU4ICpyY3ZfYnVmLCB1OCByY3ZfbGVuKQoreworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBidWZbNjRdOworCXU4IGlkOworCWludCByZXQ7CisKKwlpZCA9IHN0YXRlLT5jKys7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChzbmRfbGVuID4gNjQgLSA3IHx8IHJjdl9sZW4gPiA2NCAtIDcpCisJCWdvdG8gZmFpbGVkOworCisJYnVmWzBdID0gU1lOQ19CWVRFX09VVDsKKwlidWZbMV0gPSBpZDsKKwlidWZbMl0gPSBQQ1RWX0NNRF9JMkM7CisJYnVmWzNdID0gc25kX2xlbiArIDM7CisJYnVmWzRdID0gYWRkciA8PCAxOworCWJ1Zls1XSA9IHNuZF9sZW47CisJYnVmWzZdID0gcmN2X2xlbjsKKworCW1lbWNweShidWYgKyA3LCBzbmRfYnVmLCBzbmRfbGVuKTsKKworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhkLCBidWYsIDcgKyBzbmRfbGVuLAorCQkJCSAgYnVmLCAvKiByY3ZfbGVuICovIDY0LAorCQkJCSAgLyogZGVsYXlfbXMgKi8gMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbGVkOworCisJLyogVFQgVVNCIHByb3RvY29sIGVycm9yLiAqLworCXJldCA9IC1FSU87CisJaWYgKFNZTkNfQllURV9JTiAhPSBidWZbMF0gfHwgaWQgIT0gYnVmWzFdKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIEkyQyBkZXZpY2UgZGlkbid0IHJlc3BvbmQgYXMgZXhwZWN0ZWQuICovCisJcmV0ID0gLUVSRU1PVEVJTzsKKwlpZiAoYnVmWzVdIDwgc25kX2xlbiB8fCBidWZbNl0gPCByY3ZfbGVuKQorCQlnb3RvIGZhaWxlZDsKKworCW1lbWNweShyY3ZfYnVmLCBidWYgKyA3LCByY3ZfbGVuKTsKKworCXJldHVybiByY3ZfbGVuOworCitmYWlsZWQ6CisJZXJyKCJJMkMgZXJyb3IgJWQ7ICUwMlggJTAyWCAgJTAyWCAlMDJYICUwMlggLT4gIgorCSAgICAgIiUwMlggJTAyWCAgJTAyWCAlMDJYICUwMlguIiwKKwkgICAgIHJldCwgU1lOQ19CWVRFX09VVCwgaWQsIGFkZHIgPDwgMSwgc25kX2xlbiwgcmN2X2xlbiwKKwkgICAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaTJjX21zZyAqbXNnLAorCQkJCWludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlpbnQgaTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQl1OCBhZGRyLCBzbmRfbGVuLCByY3ZfbGVuLCAqc25kX2J1ZiwgKnJjdl9idWY7CisJCWludCByZXQ7CisKKwkJaWYgKG1zZ1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQlhZGRyID0gbXNnW2ldLmFkZHI7CisJCQlzbmRfYnVmID0gTlVMTDsKKwkJCXNuZF9sZW4gPSAwOworCQkJcmN2X2J1ZiA9IG1zZ1tpXS5idWY7CisJCQlyY3ZfbGVuID0gbXNnW2ldLmxlbjsKKwkJfSBlbHNlIHsKKwkJCWFkZHIgPSBtc2dbaV0uYWRkcjsKKwkJCXNuZF9idWYgPSBtc2dbaV0uYnVmOworCQkJc25kX2xlbiA9IG1zZ1tpXS5sZW47CisJCQlyY3ZfYnVmID0gTlVMTDsKKwkJCXJjdl9sZW4gPSAwOworCQl9CisKKwkJcmV0ID0gcGN0djQ1MmVfaTJjX21zZyhkLCBhZGRyLCBzbmRfYnVmLCBzbmRfbGVuLCByY3ZfYnVmLAorCQkJCQlyY3ZfbGVuKTsKKwkJaWYgKHJldCA8IHJjdl9sZW4pCisJCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1MzIgcGN0djQ1MmVfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkM7Cit9CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBpKQoreworCXN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdHY0NTJlX3N0YXRlICopZC0+cHJpdjsKKwl1OCBiMFtdID0geyAweGFhLCAwLCBQQ1RWX0NNRF9SRVNFVCwgMSwgMCB9OworCXU4IHJ4W1BDVFZfQU5TV0VSX0xFTl07CisJaW50IHJldDsKKworCWluZm8oIiVzOiAlZFxuIiwgX19mdW5jX18sIGkpOworCisJaWYgKCFpKQorCQlyZXR1cm4gMDsKKworCWlmIChzdGF0ZS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJLyogaG1tIHdoZXJlIHNob3VkIHRoaXMgc2hvdWxkIGdvPyAqLworCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGQtPnVkZXYsIDAsIElTT0NfSU5URVJGQUNFX0FMVEVSTkFUSVZFKTsKKwlpZiAocmV0ICE9IDApCisJCWluZm8oIiVzOiBXYXJuaW5nIHNldCBpbnRlcmZhY2UgcmV0dXJuZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwkvKiB0aGlzIGlzIGEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIGRvbnQga25vdyB3aGVyZSB0byBwdXQgKi8KKwliMFsxXSA9IHN0YXRlLT5jKys7CisJLyogcmVzZXQgYm9hcmQgKi8KKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYjAsIHNpemVvZihiMCksIHJ4LCBQQ1RWX0FOU1dFUl9MRU4sIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliMFsxXSA9IHN0YXRlLT5jKys7CisJYjBbNF0gPSAxOworCS8qIHJlc2V0IGJvYXJkIChhZ2Fpbj8pICovCisJcmV0ID0gZHZiX3VzYl9nZW5lcmljX3J3KGQsIGIwLCBzaXplb2YoYjApLCByeCwgUENUVl9BTlNXRVJfTEVOLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3RhdGUtPmluaXRpYWxpemVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgcGN0djQ1MmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSAqKWQtPnByaXY7CisJdTggYltDTURfQlVGRkVSX1NJWkVdOworCXU4IHJ4W1BDVFZfQU5TV0VSX0xFTl07CisJaW50IHJldCwgaTsKKwl1OCBpZCA9IHN0YXRlLT5jKys7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgaGVhZGVyICAqLworCWJbMF0gPSBTWU5DX0JZVEVfT1VUOworCWJbMV0gPSBpZDsKKwliWzJdID0gUENUVl9DTURfSVI7CisJYlszXSA9IDA7CisKKwkvKiBzZW5kIGlyIHJlcXVlc3QgKi8KKwlyZXQgPSBkdmJfdXNiX2dlbmVyaWNfcncoZCwgYiwgNCwgcngsIFBDVFZfQU5TV0VSX0xFTiwgMCk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGRlYnVnID4gMykgeworCQlpbmZvKCIlczogcmVhZDogJTJkOiAlMDJ4ICUwMnggJTAyeDogIiwgX19mdW5jX18sCisJCQkJcmV0LCByeFswXSwgcnhbMV0sIHJ4WzJdKTsKKwkJZm9yIChpID0gMDsgKGkgPCByeFszXSkgJiYgKChpKzMpIDwgUENUVl9BTlNXRVJfTEVOKTsgaSsrKQorCQkJaW5mbygiICUwMngiLCByeFtpKzNdKTsKKworCQlpbmZvKCJcbiIpOworCX0KKworCWlmICgocnhbM10gPT0gOSkgJiYgIChyeFsxMl0gJiAweDAxKSkgeworCQkvKiBnb3QgYSAicHJlc3MiIGV2ZW50ICovCisJCXN0YXRlLT5sYXN0X3JjX2tleSA9IChyeFs3XSA8PCA4KSB8IHJ4WzZdOworCQlpZiAoZGVidWcgPiAyKQorCQkJaW5mbygiJXM6IGNtZD0weCUwMnggc3lzPTB4JTAyeFxuIiwKKwkJCQlfX2Z1bmNfXywgcnhbNl0sIHJ4WzddKTsKKworCQlyY19rZXlkb3duKGQtPnJjX2Rldiwgc3RhdGUtPmxhc3RfcmNfa2V5LCAwKTsKKwl9IGVsc2UgaWYgKHN0YXRlLT5sYXN0X3JjX2tleSkgeworCQlyY19rZXl1cChkLT5yY19kZXYpOworCQlzdGF0ZS0+bGFzdF9yY19rZXkgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3JlYWRfbWFjX2FkZHJlc3Moc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBtYWNbNl0pCit7CisJY29uc3QgdTggbWVtX2FkZHJbXSA9IHsgMHgxZiwgMHhjYyB9OworCXU4IGVuY29kZWRfbWFjWzIwXTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVBR0FJTjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXQgPSBwY3R2NDUyZV9pMmNfbXNnKGQsIEkyQ19BRERSXzI0QzE2LAorCQkJCW1lbV9hZGRyICsgMSwgLyogc25kX2xlbiAqLyAxLAorCQkJCWVuY29kZWRfbWFjLCAvKiByY3ZfbGVuICovIDIwKTsKKwlpZiAoLUVSRU1PVEVJTyA9PSByZXQpCisJCS8qIENhdXRpb24hIEEgMjRDMTYgaW50ZXJwcmV0cyAweEEyIDB4MUYgMHhDQyBhcyBhCisJCSAgIGJ5dGUgd3JpdGUgaWYgL1dDIGlzIGxvdy4gKi8KKwkJcmV0ID0gcGN0djQ1MmVfaTJjX21zZyhkLCBJMkNfQUREUl8yNEM2NCwKKwkJCQkJbWVtX2FkZHIsIDIsCisJCQkJCWVuY29kZWRfbWFjLCAyMCk7CisKKwltdXRleF91bmxvY2soJmQtPmkyY19tdXRleCk7CisKKwlpZiAoMjAgIT0gcmV0KQorCQlnb3RvIGZhaWxlZDsKKworCXJldCA9IHR0cGNpX2VlcHJvbV9kZWNvZGVfbWFjKG1hYywgZW5jb2RlZF9tYWMpOworCWlmICgwICE9IHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCW1lbXNldChtYWMsIDAsIDYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGIwODk5X3MxX3JlZyBwY3R2NDUyZV9pbml0X2RldltdID0geworCXsgU1RCMDg5OV9ESVNDTlRSTDEsCTB4MjYgfSwKKwl7IFNUQjA4OTlfRElTQ05UUkwyLAkweDgwIH0sCisJeyBTVEIwODk5X0RJU1JYX1NUMCwJMHgwNCB9LAorCXsgU1RCMDg5OV9ESVNSWF9TVDEsCTB4MjAgfSwKKwl7IFNUQjA4OTlfRElTUEFSSVRZLAkweDAwIH0sCisJeyBTVEIwODk5X0RJU0ZJRk8sCTB4MDAgfSwKKwl7IFNUQjA4OTlfRElTRjIyLAkweDk5IH0sCisJeyBTVEIwODk5X0RJU0YyMlJYLAkweDg1IH0sIC8qIDB4YTggKi8KKwl7IFNUQjA4OTlfQUNSUFJFU0MsCTB4MTEgfSwKKwl7IFNUQjA4OTlfQUNSRElWMSwJMHgwYSB9LAorCXsgU1RCMDg5OV9BQ1JESVYyLAkweDA1IH0sCisJeyBTVEIwODk5X0RBQ1IxCSwJMHgwMCB9LAorCXsgU1RCMDg5OV9EQUNSMgksCTB4MDAgfSwKKwl7IFNUQjA4OTlfT1VUQ0ZHLAkweDAwIH0sCisJeyBTVEIwODk5X01PREVDRkcsCTB4MDAgfSwgLyogSW52ZXJzaW9uICovCisJeyBTVEIwODk5X0lSUU1TS18zLAkweGYzIH0sCisJeyBTVEIwODk5X0lSUU1TS18yLAkweGZjIH0sCisJeyBTVEIwODk5X0lSUU1TS18xLAkweGZmIH0sCisJeyBTVEIwODk5X0lSUU1TS18wLAkweGZmIH0sCisJeyBTVEIwODk5X0kyQ0NGRywJMHg4OCB9LAorCXsgU1RCMDg5OV9JMkNSUFQsCTB4NTggfSwKKwl7IFNUQjA4OTlfR1BJTzAwQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wMUNGRywJMHg4MiB9LCAvKiBMRUQ6IDB4MDIgZ3JlZW4sIDB4ODIgb3JhbmdlICovCisJeyBTVEIwODk5X0dQSU8wMkNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDNDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA0Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wNUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDZDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzA3Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8wOENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMDlDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEwQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xMUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTJDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzEzQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xNENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMTVDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE2Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8xN0NGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9HUElPMThDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzE5Q0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0dQSU8yMENGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9TREFUQ0ZHLAkweGI4IH0sCisJeyBTVEIwODk5X1NDTFRDRkcsCTB4YmEgfSwKKwl7IFNUQjA4OTlfQUdDUkZDRkcsCTB4MWMgfSwgLyogMHgxMSBEVkItUzsgMHgxYyBEVkItUzIgKDFjLCByamttKSAqLworCXsgU1RCMDg5OV9HUElPMjIsCTB4ODIgfSwKKwl7IFNUQjA4OTlfR1BJTzIxLAkweDkxIH0sCisJeyBTVEIwODk5X0RJUkNMS0NGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9DTEtPVVQyN0NGRywJMHg3ZSB9LAorCXsgU1RCMDg5OV9TVERCWUNGRywJMHg4MiB9LAorCXsgU1RCMDg5OV9DUzBDRkcsCTB4ODIgfSwKKwl7IFNUQjA4OTlfQ1MxQ0ZHLAkweDgyIH0sCisJeyBTVEIwODk5X0RJU0VRQ09DRkcsCTB4MjAgfSwKKwl7IFNUQjA4OTlfTkNPQVJTRSwJMHgxNSB9LCAvKiAweDE1IDI3TWh6LCBGLzMgMTk4TUh6LCBGLzYgMTA4TUh6ICovCisJeyBTVEIwODk5X1NZTlRDVFJMLAkweDAwIH0sIC8qIDB4MDAgQ0xLSSwgMHgwMiBYVEFMSSAqLworCXsgU1RCMDg5OV9GSUxUQ1RSTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWVNDVFJMLAkweDAwIH0sCisJeyBTVEIwODk5X1NUT1BDTEsxLAkweDIwIH0sIC8qIG9yaWc6IDB4MDAgYnVkZ2V0LWNpOiAweDIwICovCisJeyBTVEIwODk5X1NUT1BDTEsyLAkweDAwIH0sCisJeyBTVEIwODk5X0lOVEJVRkNUUkwsCTB4MGEgfSwKKwl7IFNUQjA4OTlfQUdDMkkxLAkweDAwIH0sCisJeyBTVEIwODk5X0FHQzJJMiwJMHgwMCB9LAorCXsgU1RCMDg5OV9BR0NJUUlOLAkweDAwIH0sCisJeyBTVEIwODk5X1RTVFJFUywJMHg0MCB9LCAvKiByamttICovCisJeyAweGZmZmYsCQkweGZmIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0YjA4OTlfczFfcmVnIHBjdHY0NTJlX2luaXRfczFfZGVtb2RbXSA9IHsKKwl7IFNUQjA4OTlfREVNT0QsCTB4MDAgfSwKKwl7IFNUQjA4OTlfUkNPTVBDLAkweGM5IH0sCisJeyBTVEIwODk5X0FHQzFDTiwJMHgwMSB9LAorCXsgU1RCMDg5OV9BR0MxUkVGLAkweDEwIH0sCisJeyBTVEIwODk5X1JUQywJCTB4MjMgfSwKKwl7IFNUQjA4OTlfVE1HQ0ZHLAkweDRlIH0sCisJeyBTVEIwODk5X0FHQzJSRUYsCTB4MzQgfSwKKwl7IFNUQjA4OTlfVExTUiwJCTB4ODQgfSwKKwl7IFNUQjA4OTlfQ0ZELAkJMHhmNyB9LAorCXsgU1RCMDg5OV9BQ0xDLAkJMHg4NyB9LAorCXsgU1RCMDg5OV9CQ0xDLAkJMHg5NCB9LAorCXsgU1RCMDg5OV9FUU9OLAkJMHg0MSB9LAorCXsgU1RCMDg5OV9MRFQsCQkweGYxIH0sCisJeyBTVEIwODk5X0xEVDIsCQkweGUzIH0sCisJeyBTVEIwODk5X0VRVUFMUkVGLAkweGI0IH0sCisJeyBTVEIwODk5X1RNR1JBTVAsCTB4MTAgfSwKKwl7IFNUQjA4OTlfVE1HVEhELAkweDMwIH0sCisJeyBTVEIwODk5X0lEQ0NPTVAsCTB4ZmQgfSwKKwl7IFNUQjA4OTlfUURDQ09NUCwJMHhmZiB9LAorCXsgU1RCMDg5OV9QT1dFUkksCTB4MGMgfSwKKwl7IFNUQjA4OTlfUE9XRVJRLAkweDBmIH0sCisJeyBTVEIwODk5X1JDT01QLAkweDZjIH0sCisJeyBTVEIwODk5X0FHQ0lRSU4sCTB4ODAgfSwKKwl7IFNUQjA4OTlfQUdDMkkxLAkweDA2IH0sCisJeyBTVEIwODk5X0FHQzJJMiwJMHgwMCB9LAorCXsgU1RCMDg5OV9UTElSLAkJMHgzMCB9LAorCXsgU1RCMDg5OV9SVEYsCQkweDdmIH0sCisJeyBTVEIwODk5X0RTVEFUVVMsCTB4MDAgfSwKKwl7IFNUQjA4OTlfTERJLAkJMHhiYyB9LAorCXsgU1RCMDg5OV9DRlJNLAkJMHhlYSB9LAorCXsgU1RCMDg5OV9DRlJMLAkJMHgzMSB9LAorCXsgU1RCMDg5OV9OSVJNLAkJMHgyYiB9LAorCXsgU1RCMDg5OV9OSVJMLAkJMHg4MCB9LAorCXsgU1RCMDg5OV9JU1lNQiwJMHgxZCB9LAorCXsgU1RCMDg5OV9RU1lNQiwJMHhhNiB9LAorCXsgU1RCMDg5OV9TRlJILAkJMHgyZiB9LAorCXsgU1RCMDg5OV9TRlJNLAkJMHg2OCB9LAorCXsgU1RCMDg5OV9TRlJMLAkJMHg0MCB9LAorCXsgU1RCMDg5OV9TRlJVUEgsCTB4MmYgfSwKKwl7IFNUQjA4OTlfU0ZSVVBNLAkweDY4IH0sCisJeyBTVEIwODk5X1NGUlVQTCwJMHg0MCB9LAorCXsgU1RCMDg5OV9FUVVBSTEsCTB4MDIgfSwKKwl7IFNUQjA4OTlfRVFVQVExLAkweGZmIH0sCisJeyBTVEIwODk5X0VRVUFJMiwJMHgwNCB9LAorCXsgU1RCMDg5OV9FUVVBUTIsCTB4MDUgfSwKKwl7IFNUQjA4OTlfRVFVQUkzLAkweDAyIH0sCisJeyBTVEIwODk5X0VRVUFRMywJMHhmZCB9LAorCXsgU1RCMDg5OV9FUVVBSTQsCTB4MDMgfSwKKwl7IFNUQjA4OTlfRVFVQVE0LAkweDA3IH0sCisJeyBTVEIwODk5X0VRVUFJNSwJMHgwOCB9LAorCXsgU1RCMDg5OV9FUVVBUTUsCTB4ZjUgfSwKKwl7IFNUQjA4OTlfRFNUQVRVUzIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfVlNUQVRVUywJMHgwMCB9LAorCXsgU1RCMDg5OV9WRVJST1IsCTB4ODYgfSwKKwl7IFNUQjA4OTlfSVFTV0FQLAkweDJhIH0sCisJeyBTVEIwODk5X0VDTlQxTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9FQ05UMUwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfRUNOVDJNLAkweDAwIH0sCisJeyBTVEIwODk5X0VDTlQyTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9FQ05UM00sCTB4MGEgfSwKKwl7IFNUQjA4OTlfRUNOVDNMLAkweGFkIH0sCisJeyBTVEIwODk5X0ZFQ0FVVE8xLAkweDA2IH0sCisJeyBTVEIwODk5X0ZFQ00sCQkweDAxIH0sCisJeyBTVEIwODk5X1ZUSDEyLAkweGIwIH0sCisJeyBTVEIwODk5X1ZUSDIzLAkweDdhIH0sCisJeyBTVEIwODk5X1ZUSDM0LAkweDU4IH0sCisJeyBTVEIwODk5X1ZUSDU2LAkweDM4IH0sCisJeyBTVEIwODk5X1ZUSDY3LAkweDM0IH0sCisJeyBTVEIwODk5X1ZUSDc4LAkweDI0IH0sCisJeyBTVEIwODk5X1BSVklULAkweGZmIH0sCisJeyBTVEIwODk5X1ZJVFNZTkMsCTB4MTkgfSwKKwl7IFNUQjA4OTlfUlNVTEMsCTB4YjEgfSwgLyogRFZCID0gMHhiMSwgRFNTID0gMHhhMSAqLworCXsgU1RCMDg5OV9UU1VMQywJMHg0MiB9LAorCXsgU1RCMDg5OV9SU0xMQywJMHg0MSB9LAorCXsgU1RCMDg5OV9UU0xQTCwJMHgxMiB9LAorCXsgU1RCMDg5OV9UU0NGR0gsCTB4MGMgfSwKKwl7IFNUQjA4OTlfVFNDRkdNLAkweDAwIH0sCisJeyBTVEIwODk5X1RTQ0ZHTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9UU09VVCwJMHg2OSB9LCAvKiAweDBkIGZvciBDQU0gKi8KKwl7IFNUQjA4OTlfUlNTWU5DREVMLAkweDAwIH0sCisJeyBTVEIwODk5X1RTSU5IREVMSCwJMHgwMiB9LAorCXsgU1RCMDg5OV9UU0lOSERFTE0sCTB4MDAgfSwKKwl7IFNUQjA4OTlfVFNJTkhERUxMLAkweDAwIH0sCisJeyBTVEIwODk5X1RTTExTVEtNLAkweDFiIH0sCisJeyBTVEIwODk5X1RTTExTVEtMLAkweGIzIH0sCisJeyBTVEIwODk5X1RTVUxTVEtNLAkweDAwIH0sCisJeyBTVEIwODk5X1RTVUxTVEtMLAkweDAwIH0sCisJeyBTVEIwODk5X1BDS0xFTlVMLAkweGJjIH0sCisJeyBTVEIwODk5X1BDS0xFTkxMLAkweGNjIH0sCisJeyBTVEIwODk5X1JTUENLTEVOLAkweGJkIH0sCisJeyBTVEIwODk5X1RTU1RBVFVTLAkweDkwIH0sCisJeyBTVEIwODk5X0VSUkNUUkwxLAkweGI2IH0sCisJeyBTVEIwODk5X0VSUkNUUkwyLAkweDk1IH0sCisJeyBTVEIwODk5X0VSUkNUUkwzLAkweDhkIH0sCisJeyBTVEIwODk5X0RNT05NU0sxLAkweDI3IH0sCisJeyBTVEIwODk5X0RNT05NU0swLAkweDAzIH0sCisJeyBTVEIwODk5X0RFTUFQVklULAkweDVjIH0sCisJeyBTVEIwODk5X1BMUEFSTSwJMHgxOSB9LAorCXsgU1RCMDg5OV9QREVMQ1RSTCwJMHg0OCB9LAorCXsgU1RCMDg5OV9QREVMQ1RSTDIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfQkJIQ1RSTDEsCTB4MDAgfSwKKwl7IFNUQjA4OTlfQkJIQ1RSTDIsCTB4MDAgfSwKKwl7IFNUQjA4OTlfSFlTVFRIUkVTSCwJMHg3NyB9LAorCXsgU1RCMDg5OV9NQVRDU1RNLAkweDAwIH0sCisJeyBTVEIwODk5X01BVENTVEwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfVVBMQ1NUTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9VUExDU1RMLAkweDAwIH0sCisJeyBTVEIwODk5X0RGTENTVE0sCTB4MDAgfSwKKwl7IFNUQjA4OTlfREZMQ1NUTCwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DQ1NULAkweDAwIH0sCisJeyBTVEIwODk5X1NZTkNEQ1NUTSwJMHgwMCB9LAorCXsgU1RCMDg5OV9TWU5DRENTVEwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfSVNJX0VOVFJZLAkweDAwIH0sCisJeyBTVEIwODk5X0lTSV9CSVRfRU4sCTB4MDAgfSwKKwl7IFNUQjA4OTlfTUFUU1RSTSwJMHhmMCB9LAorCXsgU1RCMDg5OV9NQVRTVFJMLAkweDAyIH0sCisJeyBTVEIwODk5X1VQTFNUUk0sCTB4NDUgfSwKKwl7IFNUQjA4OTlfVVBMU1RSTCwJMHg2MCB9LAorCXsgU1RCMDg5OV9ERkxTVFJNLAkweGUzIH0sCisJeyBTVEIwODk5X0RGTFNUUkwsCTB4MDAgfSwKKwl7IFNUQjA4OTlfU1lOQ1NUUiwJMHg0NyB9LAorCXsgU1RCMDg5OV9TWU5DRFNUUk0sCTB4MDUgfSwKKwl7IFNUQjA4OTlfU1lOQ0RTVFJMLAkweDE4IH0sCisJeyBTVEIwODk5X0NGR1BERUxTVEFUVVMxLCAweDE5IH0sCisJeyBTVEIwODk5X0NGR1BERUxTVEFUVVMyLCAweDJiIH0sCisJeyBTVEIwODk5X0JCRkVSUk9STSwJMHgwMCB9LAorCXsgU1RCMDg5OV9CQkZFUlJPUkwsCTB4MDEgfSwKKwl7IFNUQjA4OTlfVVBLVEVSUk9STSwJMHgwMCB9LAorCXsgU1RCMDg5OV9VUEtURVJST1JMLAkweDAwIH0sCisJeyAweGZmZmYsCQkweGZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IHN0YjA4OTlfY29uZmlnIHN0YjA4OTlfY29uZmlnID0geworCS5pbml0X2Rldgk9IHBjdHY0NTJlX2luaXRfZGV2LAorCS5pbml0X3MyX2RlbW9kCT0gc3RiMDg5OV9zMl9pbml0XzIsCisJLmluaXRfczFfZGVtb2QJPSBwY3R2NDUyZV9pbml0X3MxX2RlbW9kLAorCS5pbml0X3MyX2ZlYwk9IHN0YjA4OTlfczJfaW5pdF80LAorCS5pbml0X3RzdAk9IHN0YjA4OTlfczFfaW5pdF81LAorCisJLmRlbW9kX2FkZHJlc3MgICA9IEkyQ19BRERSX1NUQjA4OTksIC8qIEkyQyBBZGRyZXNzICovCisJLmJsb2NrX3N5bmNfbW9kZSA9IFNUQjA4OTlfU1lOQ19GT1JDRUQsIC8qID8gKi8KKworCS54dGFsX2ZyZXEgICAgICAgPSAyNzAwMDAwMCwJIC8qIEFzc3VtZSBIeiA/ICovCisJLmludmVyc2lvbiAgICAgICA9IElRX1NXQVBfT04sICAgICAgIC8qID8gKi8KKworCS5sb19jbGsJICA9IDc2NTAwMDAwLAorCS5oaV9jbGsJICA9IDk5MDAwMDAwLAorCisJLnRzX291dHB1dF9tb2RlICA9IDAsCS8qIFVzZSBwYXJhbGxlbCBtb2RlICovCisJLmNsb2NrX3BvbGFyaXR5ICA9IDAsCisJLmRhdGFfY2xrX3Bhcml0eSA9IDAsCisJLmZlY19tb2RlCT0gMCwKKworCS5lc25vX2F2ZQkgICAgPSBTVEIwODk5X0RWQlMyX0VTTk9fQVZFLAorCS5lc25vX3F1YW50CSAgPSBTVEIwODk5X0RWQlMyX0VTTk9fUVVBTlQsCisJLmF2ZnJhbWVzX2NvYXJzZSAgICAgPSBTVEIwODk5X0RWQlMyX0FWRlJBTUVTX0NPQVJTRSwKKwkuYXZmcmFtZXNfZmluZSAgICAgICA9IFNUQjA4OTlfRFZCUzJfQVZGUkFNRVNfRklORSwKKwkubWlzc190aHJlc2hvbGQgICAgICA9IFNUQjA4OTlfRFZCUzJfTUlTU19USFJFU0hPTEQsCisJLnV3cF90aHJlc2hvbGRfYWNxICAgPSBTVEIwODk5X0RWQlMyX1VXUF9USFJFU0hPTERfQUNRLAorCS51d3BfdGhyZXNob2xkX3RyYWNrID0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1RSQUNLLAorCS51d3BfdGhyZXNob2xkX3NvZiAgID0gU1RCMDg5OV9EVkJTMl9VV1BfVEhSRVNIT0xEX1NPRiwKKwkuc29mX3NlYXJjaF90aW1lb3V0ICA9IFNUQjA4OTlfRFZCUzJfU09GX1NFQVJDSF9USU1FT1VULAorCisJLmJ0cl9uY29fYml0cwkgID0gU1RCMDg5OV9EVkJTMl9CVFJfTkNPX0JJVFMsCisJLmJ0cl9nYWluX3NoaWZ0X29mZnNldCA9IFNUQjA4OTlfRFZCUzJfQlRSX0dBSU5fU0hJRlRfT0ZGU0VULAorCS5jcmxfbmNvX2JpdHMJICA9IFNUQjA4OTlfRFZCUzJfQ1JMX05DT19CSVRTLAorCS5sZHBjX21heF9pdGVyCSA9IFNUQjA4OTlfRFZCUzJfTERQQ19NQVhfSVRFUiwKKworCS50dW5lcl9nZXRfZnJlcXVlbmN5CT0gc3RiNjEwMF9nZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfZnJlcXVlbmN5CT0gc3RiNjEwMF9zZXRfZnJlcXVlbmN5LAorCS50dW5lcl9zZXRfYmFuZHdpZHRoCT0gc3RiNjEwMF9zZXRfYmFuZHdpZHRoLAorCS50dW5lcl9nZXRfYmFuZHdpZHRoCT0gc3RiNjEwMF9nZXRfYmFuZHdpZHRoLAorCS50dW5lcl9zZXRfcmZzaWdnYWluCT0gTlVMTCwKKworCS8qIGhlbHBlciBmb3Igc3dpdGNoaW5nIExFRCBncmVlbi9vcmFuZ2UgKi8KKwkucG9zdHByb2MgPSBwY3R2NDVlX3Bvc3Rwcm9jCit9OworCitzdGF0aWMgc3RydWN0IHN0YjYxMDBfY29uZmlnIHN0YjYxMDBfY29uZmlnID0geworCS50dW5lcl9hZGRyZXNzID0gSTJDX0FERFJfU1RCNjEwMCwKKwkucmVmY2xvY2sgICAgICA9IDI3MDAwMDAwCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY3R2NDUyZV9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IHBjdHY0NTJlX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gcGN0djQ1MmVfaTJjX2Z1bmMKK307CisKK3N0YXRpYyBpbnQgcGN0djQ1MmVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmEpCit7CisJc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkOworCisJYS0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3RiMDg5OV9hdHRhY2gsICZzdGIwODk5X2NvbmZpZywKKwkJCQkJCSZhLT5kZXYtPmkyY19hZGFwKTsKKwlpZiAoIWEtPmZlX2FkYXBbMF0uZmUpCisJCXJldHVybiAtRU5PREVWOworCWlmICgoZHZiX2F0dGFjaChsbmJwMjJfYXR0YWNoLCBhLT5mZV9hZGFwWzBdLmZlLAorCQkJCQkmYS0+ZGV2LT5pMmNfYWRhcCkpID09IDApCisJCWVycigiQ2Fubm90IGF0dGFjaCBsbmJwMjJcbiIpOworCisJaWQgPSBhLT5kZXYtPmRlc2MtPndhcm1faWRzWzBdOworCWlmIChVU0JfVklEX1RFQ0hOT1RSRU5EID09IGlkLT5pZFZlbmRvcgorCSAgICAmJiBVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfUzJfMzY1MF9DSSA9PSBpZC0+aWRQcm9kdWN0KQorCQkvKiBFcnJvciBpZ25vcmVkLiAqLworCQl0dDM2NTBfY2lfaW5pdChhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphKQoreworCWlmICghYS0+ZmVfYWRhcFswXS5mZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGR2Yl9hdHRhY2goc3RiNjEwMF9hdHRhY2gsIGEtPmZlX2FkYXBbMF0uZmUsICZzdGI2MTAwX2NvbmZpZywKKwkJCQkJJmEtPmRldi0+aTJjX2FkYXApID09IDApIHsKKwkJZXJyKCIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwY3R2NDUyZV91c2JfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCBVU0JfUElEX1BDVFZfNDUyRSl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfVEVDSE5PVFJFTkQsIFVTQl9QSURfVEVDSE5PVFJFTkRfQ09OTkVDVF9TMl8zNjAwKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9URUNITk9UUkVORCwKKwkJCQlVU0JfUElEX1RFQ0hOT1RSRU5EX0NPTk5FQ1RfUzJfMzY1MF9DSSl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHBjdHY0NTJlX3VzYl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBwY3R2NDUyZV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwgLyogbW9yZSA/ICovCisJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IHBjdHY0NTJlX3N0YXRlKSwKKworCS5wb3dlcl9jdHJsICAgICAgID0gcGN0djQ1MmVfcG93ZXJfY3RybCwKKworCS5yYy5jb3JlID0geworCQkucmNfY29kZXMJPSBSQ19NQVBfRElCMDcwMF9SQzVfVEFCTEUsCisJCS5hbGxvd2VkX3Byb3Rvcwk9IFJDX1RZUEVfVU5LTk9XTiwKKwkJLnJjX3F1ZXJ5CT0gcGN0djQ1MmVfcmNfcXVlcnksCisJCS5yY19pbnRlcnZhbAk9IDEwMCwKKwl9LAorCisJLm51bV9hZGFwdGVycyAgICAgPSAxLAorCS5hZGFwdGVyID0ge3sKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7eworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBwY3R2NDUyZV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IHBjdHY0NTJlX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSAgICAgPSBVU0JfSVNPQywKKwkJCQkuY291bnQgICAgPSA0LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5pc29jID0geworCQkJCQkJLmZyYW1lc3BlcnVyYiA9IDQsCisJCQkJCQkuZnJhbWVzaXplICAgID0gOTQwLAorCQkJCQkJLmludGVydmFsICAgICA9IDEKKwkJCQkJfQorCQkJCX0KKwkJCX0sCisJCX0gfSwKKwl9IH0sCisKKwkuaTJjX2FsZ28gPSAmcGN0djQ1MmVfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAxLCAvKiBhbGxvdyBnZW5lcmljZSBydyBmdW5jdGlvbiAqLworCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7IC5uYW1lID0gIlBDVFYgSERUViBVU0IiLAorCQkgIC5jb2xkX2lkcyA9IHsgTlVMTCwgTlVMTCB9LCAvKiB0aGlzIGlzIGEgd2FybSBvbmx5IGRldmljZSAqLworCQkgIC53YXJtX2lkcyA9IHsgJnBjdHY0NTJlX3VzYl90YWJsZVswXSwgTlVMTCB9CisJCX0sCisJCXsgMCB9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dF9jb25uZWN0X3MyXzM2MDBfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsIC8qIG1vcmUgPyAqLworCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKworCS5zaXplX29mX3ByaXYJCT0gc2l6ZW9mKHN0cnVjdCBwY3R2NDUyZV9zdGF0ZSksCisKKwkucG93ZXJfY3RybAkJPSBwY3R2NDUyZV9wb3dlcl9jdHJsLAorCS5yZWFkX21hY19hZGRyZXNzCT0gcGN0djQ1MmVfcmVhZF9tYWNfYWRkcmVzcywKKworCS5yYy5jb3JlID0geworCQkucmNfY29kZXMJPSBSQ19NQVBfVFRfMTUwMCwKKwkJLmFsbG93ZWRfcHJvdG9zCT0gUkNfVFlQRV9VTktOT1dOLAorCQkucmNfcXVlcnkJPSBwY3R2NDUyZV9yY19xdWVyeSwKKwkJLnJjX2ludGVydmFsCT0gMTAwLAorCX0sCisKKwkubnVtX2FkYXB0ZXJzCQk9IDEsCisJLmFkYXB0ZXIgPSB7eworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CisJCQkuZnJvbnRlbmRfYXR0YWNoID0gcGN0djQ1MmVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCA9IHBjdHY0NTJlX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9JU09DLAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmlzb2MgPSB7CisJCQkJCQkuZnJhbWVzcGVydXJiID0gNCwKKwkJCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJCQkuaW50ZXJ2YWwgPSAxCisJCQkJCX0KKwkJCQl9CisJCQl9LAorCisJCX0gfSwKKwl9IH0sCisKKwkuaTJjX2FsZ28gPSAmcGN0djQ1MmVfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAxLCAvKiBhbGxvdyBnZW5lcmljIHJ3IGZ1bmN0aW9uKi8KKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJUZWNobm90cmVuZCBUVCBDb25uZWN0IFMyLTM2MDAiLAorCQkgIC5jb2xkX2lkcyA9IHsgTlVMTCwgTlVMTCB9LCAvKiB0aGlzIGlzIGEgd2FybSBvbmx5IGRldmljZSAqLworCQkgIC53YXJtX2lkcyA9IHsgJnBjdHY0NTJlX3VzYl90YWJsZVsxXSwgTlVMTCB9CisJCX0sCisJCXsgLm5hbWUgPSAiVGVjaG5vdHJlbmQgVFQgQ29ubmVjdCBTMi0zNjUwLUNJIiwKKwkJICAuY29sZF9pZHMgPSB7IE5VTEwsIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZwY3R2NDUyZV91c2JfdGFibGVbMl0sIE5VTEwgfQorCQl9LAorCQl7IDAgfSwKKwl9Cit9OworCitzdGF0aWMgdm9pZCBwY3R2NDUyZV91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdHQzNjUwX2NpX3VuaW5pdChkKTsKKwlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOworfQorCitzdGF0aWMgaW50IHBjdHY0NTJlX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaWYgKDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmcGN0djQ1MmVfcHJvcGVydGllcywKKwkJCQkJVEhJU19NT0RVTEUsIE5VTEwsIGFkYXB0ZXJfbnIpIHx8CisJICAgIDAgPT0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmdHRfY29ubmVjdF9zMl8zNjAwX3Byb3BlcnRpZXMsCisJCQkJCVRISVNfTU9EVUxFLCBOVUxMLCBhZGFwdGVyX25yKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBjdHY0NTJlX3VzYl9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgPSAicGN0djQ1MmUiLAorCS5wcm9iZSAgICAgID0gcGN0djQ1MmVfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gcGN0djQ1MmVfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlICAgPSBwY3R2NDUyZV91c2JfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY3R2NDUyZV91c2JfaW5pdCh2b2lkKQoreworCWludCByZXQgPSB1c2JfcmVnaXN0ZXIoJnBjdHY0NTJlX3VzYl9kcml2ZXIpOworCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9yZWdpc3RlciBmYWlsZWQhIEVycm9yICVkIiwgX19GSUxFX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGN0djQ1MmVfdXNiX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmcGN0djQ1MmVfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjdHY0NTJlX3VzYl9pbml0KTsKK21vZHVsZV9leGl0KHBjdHY0NTJlX3VzYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRG9taW5payBLdWhsZW4gPGRrdWhsZW5AZ214Lm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJlIFdlaWRlbWFubiA8QW5kcmUuV2VpZGVtYW5uQHdlYi5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSC4gU2NoaW1layA8bXNjaGltZWtAZ214LmF0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaW5uYWNsZSBQQ1RWIEhEVFYgVVNCIERWQiAvIFRUIGNvbm5lY3QgUzItMzYwMCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYwppbmRleCA0NzNiOTVlLi4wOTk4ZmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90ZWNobmlzYXQtdXNiMi5jCkBAIC0yOTIsNyArMjkyLDcgQEAKIHsKIAlzdHJ1Y3QgdGVjaG5pc2F0X3VzYjJfc3RhdGUgKnN0YXRlID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0ZWNobmlzYXRfdXNiMl9zdGF0ZSwgZ3JlZW5fbGVkX3dvcmsud29yayk7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUgPSBzdGF0ZS0+ZGV2LT5hZGFwdGVyWzBdLmZlOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gc3RhdGUtPmRldi0+YWRhcHRlclswXS5mZV9hZGFwWzBdLmZlOwogCiAJaWYgKHN0YXRlLT5wb3dlcl9zdGF0ZSA9PSAwKQogCQlnb3RvIHNjaGVkdWxlOwpAQCAtNTA1LDE0ICs1MDUsMTQgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGEtPmRldi0+dWRldjsKIAlpbnQgcmV0OwogCi0JYS0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MHhfYXR0YWNoLCAmdGVjaG5pc2F0X3VzYjJfc3R2MDkweF9jb25maWcsCisJYS0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2goc3R2MDkweF9hdHRhY2gsICZ0ZWNobmlzYXRfdXNiMl9zdHYwOTB4X2NvbmZpZywKIAkJCSZhLT5kZXYtPmkyY19hZGFwLCBTVFYwOTB4X0RFTU9EVUxBVE9SXzApOwogCi0JaWYgKGEtPmZlKSB7CisJaWYgKGEtPmZlX2FkYXBbMF0uZmUpIHsKIAkJc3RydWN0IHN0djYxMTB4X2RldmN0bCAqY3RsOwogCiAJCWN0bCA9IGR2Yl9hdHRhY2goc3R2NjExMHhfYXR0YWNoLAotCQkJCWEtPmZlLAorCQkJCWEtPmZlX2FkYXBbMF0uZmUsCiAJCQkJJnRlY2huaXNhdF91c2IyX3N0djYxMTB4X2NvbmZpZywKIAkJCQkmYS0+ZGV2LT5pMmNfYWRhcCk7CiAKQEAgLTUzMiw4ICs1MzIsOCBAQAogCQkJLyogY2FsbCB0aGUgaW5pdCBmdW5jdGlvbiBvbmNlIHRvIGluaXRpYWxpemUKIAkJCSAgIHR1bmVyJ3MgY2xvY2sgb3V0cHV0IGRpdmlkZXIgYW5kIGRlbW9kJ3MKIAkJCSAgIG1hc3RlciBjbG9jayAqLwotCQkJaWYgKGEtPmZlLT5vcHMuaW5pdCkKLQkJCQlhLT5mZS0+b3BzLmluaXQoYS0+ZmUpOworCQkJaWYgKGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbml0KQorCQkJCWEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbml0KGEtPmZlX2FkYXBbMF0uZmUpOwogCiAJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhLT5kZXYtPmkyY19tdXRleCkgPCAwKQogCQkJCXJldHVybiAtRUFHQUlOOwpAQCAtNTQ4LDIwICs1NDgsMjAgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQllcnIoImNvdWxkIG5vdCBzZXQgSUZfQ0xLIHRvIGV4dGVybmFsIik7CiAKLQkJCWEtPmZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSB0ZWNobmlzYXRfdXNiMl9zZXRfdm9sdGFnZTsKKwkJCWEtPmZlX2FkYXBbMF0uZmUtPm9wcy5zZXRfdm9sdGFnZSA9IHRlY2huaXNhdF91c2IyX3NldF92b2x0YWdlOwogCiAJCQkvKiBpZiBldmVyeXRoaW5nIHdhcyBzdWNjZXNzZnVsIGFzc2lnbiBhIG5pY2UgbmFtZSB0byB0aGUgZnJvbnRlbmQgKi8KLQkJCXN0cmxjcHkoYS0+ZmUtPm9wcy5pbmZvLm5hbWUsIGEtPmRldi0+ZGVzYy0+bmFtZSwKLQkJCQkJc2l6ZW9mKGEtPmZlLT5vcHMuaW5mby5uYW1lKSk7CisJCQlzdHJsY3B5KGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWUsIGEtPmRldi0+ZGVzYy0+bmFtZSwKKwkJCQkJc2l6ZW9mKGEtPmZlX2FkYXBbMF0uZmUtPm9wcy5pbmZvLm5hbWUpKTsKIAkJfSBlbHNlIHsKLQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYS0+ZmUpOwotCQkJYS0+ZmUgPSBOVUxMOworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChhLT5mZV9hZGFwWzBdLmZlKTsKKwkJCWEtPmZlX2FkYXBbMF0uZmUgPSBOVUxMOwogCQl9CiAJfQogCiAJdGVjaG5pc2F0X3VzYjJfc2V0X2xlZF90aW1lcihhLT5kZXYsIDEsIDEpOwogCi0JcmV0dXJuIGEtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKKwlyZXR1cm4gYS0+ZmVfYWRhcFswXS5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIC8qIFJlbW90ZSBjb250cm9sICovCkBAIC02OTcsNiArNjk3LDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHRlY2huaXNhdF91c2IyX2Zyb250ZW5kX2F0dGFjaCwKIAogCQkJLnN0cmVhbSA9IHsKQEAgLTcxMSw3ICs3MTMsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKLQorCQl9fSwKIAkJCS5zaXplX29mX3ByaXYgPSAwLAogCQl9LAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3R0dXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuYwppbmRleCAwZDQ3MDlmLi5lYTRlYWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3R0dXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmMKQEAgLTMwLDE4ICszMCw0MyBAQAogI2luY2x1ZGUgInRkYTgyNnguaCIKICNpbmNsdWRlICJ0ZGExMDA4Ni5oIgogI2luY2x1ZGUgInRkYTEwMDJ4LmgiCisjaW5jbHVkZSAidGRhMTAwNDguaCIKICNpbmNsdWRlICJ0ZGE4Mjd4LmgiCiAjaW5jbHVkZSAibG5icDIxLmgiCisvKiBDQSAqLworI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxLmgiCiAKIC8qIGRlYnVnICovCiBzdGF0aWMgaW50IGR2Yl91c2JfdHR1c2IyX2RlYnVnOwogI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl90dHVzYjJfZGVidWcsMHgwMSxhcmdzKQogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfdHR1c2IyX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9aW5mbyAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworc3RhdGljIGludCBkdmJfdXNiX3R0dXNiMl9kZWJ1Z19jaTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19jaSxkdmJfdXNiX3R0dXNiMl9kZWJ1Z19jaSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfY2ksICJzZXQgZGVidWdnaW5nIGNpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKIAorI2RlZmluZSBjaV9kYmcoZm9ybWF0LCBhcmcuLi4pICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKGR2Yl91c2JfdHR1c2IyX2RlYnVnX2NpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFZCX1VTQl9MT0dfUFJFRklYIFwKKwkJCSI6ICVzICIgZm9ybWF0ICJcbiIgLCBfX2Z1bmNfXywgIyMgYXJnKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworZW51bSB7CisJVFQzNjUwX0NNRF9DSV9URVNUID0gMHg0MCwKKwlUVDM2NTBfQ01EX0NJX1JEX0NUUkwsCisJVFQzNjUwX0NNRF9DSV9XUl9DVFJMLAorCVRUMzY1MF9DTURfQ0lfUkRfQVRUUiwKKwlUVDM2NTBfQ01EX0NJX1dSX0FUVFIsCisJVFQzNjUwX0NNRF9DSV9SRVNFVCwKKwlUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JUCit9OworCiBzdHJ1Y3QgdHR1c2IyX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7CisJc3RydWN0IG11dGV4IGNhX211dGV4OwogCXU4IGlkOwogCXUxNiBsYXN0X3JjX2tleTsKIH07CkBAIC03OCwxMSArMTAzLDI2MCBAQAogCXJldHVybiAwOwogfQogCisvKiBjaSAqLworc3RhdGljIGludCB0dDM2NTBfY2lfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggY21kLCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IHdyaXRlX2xlbiwgdW5zaWduZWQgaW50IHJlYWRfbGVuKQoreworCWludCByZXQ7CisJdTggcnhbNjBdOy8qICg2NCAtNCkgKi8KKwlyZXQgPSB0dHVzYjJfbXNnKGQsIGNtZCwgZGF0YSwgd3JpdGVfbGVuLCByeCwgcmVhZF9sZW4pOworCWlmICghcmV0KQorCQltZW1jcHkoZGF0YSwgcngsIHJlYWRfbGVuKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV9tc2dfbG9ja2VkKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIHU4IGNtZCwgdTggKmRhdGEsIHVuc2lnbmVkIGludCB3cml0ZV9sZW4sIHVuc2lnbmVkIGludCByZWFkX2xlbikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBjYS0+ZGF0YTsKKwlzdHJ1Y3QgdHR1c2IyX3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0YXRlLT5jYV9tdXRleCk7CisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBjbWQsIGRhdGEsIHdyaXRlX2xlbiwgcmVhZF9sZW4pOworCW11dGV4X3VubG9jaygmc3RhdGUtPmNhX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3JlYWRfYXR0cmlidXRlX21lbShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCwgaW50IGFkZHJlc3MpCit7CisJdTggYnVmWzNdOworCWludCByZXQgPSAwOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisKKworCXJldCA9IHR0MzY1MF9jaV9tc2dfbG9ja2VkKGNhLCBUVDM2NTBfQ01EX0NJX1JEX0FUVFIsIGJ1ZiwgMiwgMyk7CisKKwljaV9kYmcoIiUwNHggLT4gJWQgMHglMDJ4IiwgYWRkcmVzcywgcmV0LCBidWZbMl0pOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYnVmWzJdOworfQorCitzdGF0aWMgaW50IHR0MzY1MF9jaV93cml0ZV9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIGludCBzbG90LCBpbnQgYWRkcmVzcywgdTggdmFsdWUpCit7CisJdTggYnVmWzNdOworCisJY2lfZGJnKCIlZCAweCUwNHggMHglMDJ4Iiwgc2xvdCwgYWRkcmVzcywgdmFsdWUpOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gKGFkZHJlc3MgPj4gOCkgJiAweDBGOworCWJ1ZlsxXSA9IGFkZHJlc3M7CisJYnVmWzJdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQVRUUiwgYnVmLCAzLCAzKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfcmVhZF9jYW1fY29udHJvbChzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCwgdTggYWRkcmVzcykKK3sKKwl1OCBidWZbMl07CisJaW50IHJldDsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3MgJiAzOworCisJcmV0ID0gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfUkRfQ1RSTCwgYnVmLCAxLCAyKTsKKworCWNpX2RiZygiMHglMDJ4IC0+ICVkIDB4JTAyeCIsIGFkZHJlc3MsIHJldCwgYnVmWzFdKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGJ1ZlsxXTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2woc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIHU4IGFkZHJlc3MsIHU4IHZhbHVlKQoreworCXU4IGJ1ZlsyXTsKKworCWNpX2RiZygiJWQgMHglMDJ4IDB4JTAyeCIsIHNsb3QsIGFkZHJlc3MsIHZhbHVlKTsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGFkZHJlc3M7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXR1cm4gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfV1JfQ1RSTCwgYnVmLCAyLCAyKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2V0X3ZpZGVvX3BvcnQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJdTggYnVmWzFdOworCWludCByZXQ7CisKKwljaV9kYmcoIiVkICVkIiwgc2xvdCwgZW5hYmxlKTsKKworCWlmIChzbG90KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IGVuYWJsZTsKKworCXJldCA9IHR0MzY1MF9jaV9tc2dfbG9ja2VkKGNhLCBUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JULCBidWYsIDEsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGVuYWJsZSAhPSBidWZbMF0pIHsKKwkJZXJyKCJDSSBub3QgJXNhYmxlZC4iLCBlbmFibGUgPyAiZW4iIDogImRpcyIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gdHQzNjUwX2NpX3NldF92aWRlb19wb3J0KGNhLCBzbG90LCAwKTsKK30KKworc3RhdGljIGludCB0dDM2NTBfY2lfc2xvdF90c19lbmFibGUoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJcmV0dXJuIHR0MzY1MF9jaV9zZXRfdmlkZW9fcG9ydChjYSwgc2xvdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3Nsb3RfcmVzZXQoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gY2EtPmRhdGE7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJY2lfZGJnKCIlZCIsIHNsb3QpOworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmWzBdID0gMDsKKworCW11dGV4X2xvY2soJnN0YXRlLT5jYV9tdXRleCk7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDE7CisKKwlyZXQgPSB0dDM2NTBfY2lfbXNnKGQsIFRUMzY1MF9DTURfQ0lfUkVTRVQsIGJ1ZiwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsZWQ7CisKKwltc2xlZXAoNTAwKTsKKworCWJ1ZlswXSA9IDA7IC8qIEZUQSAqLworCisJcmV0ID0gdHQzNjUwX2NpX21zZyhkLCBUVDM2NTBfQ01EX0NJX1NFVF9WSURFT19QT1JULCBidWYsIDEsIDEpOworCisJbXNsZWVwKDExMDApOworCisgZmFpbGVkOgorCW11dGV4X3VubG9jaygmc3RhdGUtPmNhX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX3BvbGxfc2xvdF9zdGF0dXMoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QsIGludCBvcGVuKQoreworCXU4IGJ1ZlsxXTsKKwlpbnQgcmV0OworCisJaWYgKHNsb3QpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdHQzNjUwX2NpX21zZ19sb2NrZWQoY2EsIFRUMzY1MF9DTURfQ0lfVEVTVCwgYnVmLCAwLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKDEgPT0gYnVmWzBdKSB7CisJCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwKKwkJCURWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHQzNjUwX2NpX3VuaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGU7CisKKwljaV9kYmcoIiIpOworCisJaWYgKE5VTEwgPT0gZCkKKwkJcmV0dXJuOworCisJc3RhdGUgPSBkLT5wcml2OworCWlmIChOVUxMID09IHN0YXRlKQorCQlyZXR1cm47CisKKwlpZiAoTlVMTCA9PSBzdGF0ZS0+Y2EuZGF0YSkKKwkJcmV0dXJuOworCisJZHZiX2NhX2VuNTAyMjFfcmVsZWFzZSgmc3RhdGUtPmNhKTsKKworCW1lbXNldCgmc3RhdGUtPmNhLCAwLCBzaXplb2Yoc3RhdGUtPmNhKSk7Cit9CisKK3N0YXRpYyBpbnQgdHQzNjUwX2NpX2luaXQoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBhLT5kZXY7CisJc3RydWN0IHR0dXNiMl9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OworCWludCByZXQ7CisKKwljaV9kYmcoIiIpOworCisJbXV0ZXhfaW5pdCgmc3RhdGUtPmNhX211dGV4KTsKKworCXN0YXRlLT5jYS5vd25lciA9IFRISVNfTU9EVUxFOworCXN0YXRlLT5jYS5yZWFkX2F0dHJpYnV0ZV9tZW0gPSB0dDM2NTBfY2lfcmVhZF9hdHRyaWJ1dGVfbWVtOworCXN0YXRlLT5jYS53cml0ZV9hdHRyaWJ1dGVfbWVtID0gdHQzNjUwX2NpX3dyaXRlX2F0dHJpYnV0ZV9tZW07CisJc3RhdGUtPmNhLnJlYWRfY2FtX2NvbnRyb2wgPSB0dDM2NTBfY2lfcmVhZF9jYW1fY29udHJvbDsKKwlzdGF0ZS0+Y2Eud3JpdGVfY2FtX2NvbnRyb2wgPSB0dDM2NTBfY2lfd3JpdGVfY2FtX2NvbnRyb2w7CisJc3RhdGUtPmNhLnNsb3RfcmVzZXQgPSB0dDM2NTBfY2lfc2xvdF9yZXNldDsKKwlzdGF0ZS0+Y2Euc2xvdF9zaHV0ZG93biA9IHR0MzY1MF9jaV9zbG90X3NodXRkb3duOworCXN0YXRlLT5jYS5zbG90X3RzX2VuYWJsZSA9IHR0MzY1MF9jaV9zbG90X3RzX2VuYWJsZTsKKwlzdGF0ZS0+Y2EucG9sbF9zbG90X3N0YXR1cyA9IHR0MzY1MF9jaV9wb2xsX3Nsb3Rfc3RhdHVzOworCXN0YXRlLT5jYS5kYXRhID0gZDsKKworCXJldCA9IGR2Yl9jYV9lbjUwMjIxX2luaXQoJmEtPmR2Yl9hZGFwLAorCQkJCSAgJnN0YXRlLT5jYSwKKwkJCQkgIC8qIGZsYWdzICovIDAsCisJCQkJICAvKiBuX3Nsb3RzICovIDEpOworCWlmIChyZXQpIHsKKwkJZXJyKCJDYW5ub3QgaW5pdGlhbGl6ZSBDSTogRXJyb3IgJWQuIiwgcmV0KTsKKwkJbWVtc2V0KCZzdGF0ZS0+Y2EsIDAsIHNpemVvZihzdGF0ZS0+Y2EpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvKCJDSSBpbml0aWFsaXplZC4iKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgbXNnW10saW50IG51bSkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCXN0YXRpYyB1OCBvYnVmWzYwXSwgaWJ1Zls2MF07Ci0JaW50IGkscmVhZDsKKwlpbnQgaSwgd3JpdGVfcmVhZCwgcmVhZDsKIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTkxLDI4ICszNjUsMzUgQEAKIAkJd2FybigibW9yZSB0aGFuIDIgaTJjIG1lc3NhZ2VzIGF0IGEgdGltZSBpcyBub3QgaGFuZGxlZCB5ZXQuIFRPRE8uIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmVhZCA9IGkrMSA8IG51bSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCk7CisJCXdyaXRlX3JlYWQgPSBpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpOworCQlyZWFkID0gbXNnW2ldLmZsYWdzICYgSTJDX01fUkQ7CiAKLQkJb2J1ZlswXSA9IChtc2dbaV0uYWRkciA8PCAxKSB8IHJlYWQ7Ci0JCW9idWZbMV0gPSBtc2dbaV0ubGVuOworCQlvYnVmWzBdID0gKG1zZ1tpXS5hZGRyIDw8IDEpIHwgKHdyaXRlX3JlYWQgfCByZWFkKTsKKwkJaWYgKHJlYWQpCisJCQlvYnVmWzFdID0gMDsKKwkJZWxzZQorCQkJb2J1ZlsxXSA9IG1zZ1tpXS5sZW47CiAKIAkJLyogcmVhZCByZXF1ZXN0ICovCi0JCWlmIChyZWFkKQorCQlpZiAod3JpdGVfcmVhZCkKIAkJCW9idWZbMl0gPSBtc2dbaSsxXS5sZW47CisJCWVsc2UgaWYgKHJlYWQpCisJCQlvYnVmWzJdID0gbXNnW2ldLmxlbjsKIAkJZWxzZQogCQkJb2J1ZlsyXSA9IDA7CiAKLQkJbWVtY3B5KCZvYnVmWzNdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisJCW1lbWNweSgmb2J1ZlszXSwgbXNnW2ldLmJ1ZiwgbXNnW2ldLmxlbik7CiAKIAkJaWYgKHR0dXNiMl9tc2coZCwgQ01EX0kyQ19YRkVSLCBvYnVmLCBtc2dbaV0ubGVuKzMsIGlidWYsIG9idWZbMl0gKyAzKSA8IDApIHsKIAkJCWVycigiaTJjIHRyYW5zZmVyIGZhaWxlZC4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHJlYWQpIHsKLQkJCW1lbWNweShtc2dbaSsxXS5idWYsJmlidWZbM10sbXNnW2krMV0ubGVuKTsKKwkJaWYgKHdyaXRlX3JlYWQpIHsKKwkJCW1lbWNweShtc2dbaSsxXS5idWYsICZpYnVmWzNdLCBtc2dbaSsxXS5sZW4pOwogCQkJaSsrOwotCQl9CisJCX0gZWxzZSBpZiAocmVhZCkKKwkJCW1lbWNweShtc2dbaV0uYnVmLCAmaWJ1ZlszXSwgbXNnW2ldLmxlbik7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwpAQCAtMTkwLDEyICs0NzEsMzEgQEAKIAkuZGVsdGFmID0gMHhhNTExLAogfTsKIAorc3RhdGljIHN0cnVjdCB0ZGExMDA0OF9jb25maWcgdGRhMTAwNDhfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzICAgID0gMHgxMCA+PiAxLAorCS5vdXRwdXRfbW9kZSAgICAgID0gVERBMTAwNDhfUEFSQUxMRUxfT1VUUFVULAorCS5pbnZlcnNpb24gICAgICAgID0gVERBMTAwNDhfSU5WRVJTSU9OX09OLAorCS5kdHY2X2lmX2ZyZXFfa2h6ID0gVERBMTAwNDhfSUZfNDAwMCwKKwkuZHR2N19pZl9mcmVxX2toeiA9IFREQTEwMDQ4X0lGXzQ1MDAsCisJLmR0djhfaWZfZnJlcV9raHogPSBUREExMDA0OF9JRl81MDAwLAorCS5jbGtfZnJlcV9raHogICAgID0gVERBMTAwNDhfQ0xLXzE2MDAwLAorCS5ub19maXJtd2FyZSAgICAgID0gMSwKKwkuc2V0X3BsbCAgICAgICAgICA9IHRydWUgLAorCS5wbGxfbSAgICAgICAgICAgID0gNSwKKwkucGxsX24gICAgICAgICAgICA9IDMsCisJLnBsbF9wICAgICAgICAgICAgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZGE4Mjd4X2NvbmZpZyB0ZGE4Mjd4X2NvbmZpZyA9IHsKKwkuY29uZmlnID0gMCwKK307CisKIHN0YXRpYyBpbnQgdHR1c2IyX2Zyb250ZW5kX3RkYTEwMDg2X2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWlmICh1c2Jfc2V0X2ludGVyZmFjZShhZGFwLT5kZXYtPnVkZXYsMCwzKSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSB0byBhbHRzPTMgZmFpbGVkIik7CiAKLQlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA4Nl9hdHRhY2gsICZ0ZGExMDA4Nl9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgPT0gTlVMTCkgeworCWlmICgoYWRhcC0+ZmVfYWRhcFswXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwODZfYXR0YWNoLCAmdGRhMTAwODZfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpIHsKIAkJZGViX2luZm8oIlREQTEwMDg2IGF0dGFjaCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMDMsMjAgKzUwMyw1NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHR0dXNiMl9jdDM2NTBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKKworCXJldHVybiBhZGFwLT5mZV9hZGFwWzBdLmZlLT5vcHMuaTJjX2dhdGVfY3RybChhZGFwLT5mZV9hZGFwWzBdLmZlLCBlbmFibGUpOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9mcm9udGVuZF90ZGExMDAyM19hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlpZiAodXNiX3NldF9pbnRlcmZhY2UoYWRhcC0+ZGV2LT51ZGV2LCAwLCAzKSA8IDApCiAJCWVycigic2V0IGludGVyZmFjZSB0byBhbHRzPTMgZmFpbGVkIik7Ci0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwMjNfYXR0YWNoLCAmdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCkpID09IE5VTEwpIHsKLQkJZGViX2luZm8oIlREQTEwMDIzIGF0dGFjaCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChhZGFwLT5mZV9hZGFwWzBdLmZlID09IE5VTEwpIHsKKwkJLyogRkUgMCBEVkItQyAqLworCQlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaCh0ZGExMDAyM19hdHRhY2gsCisJCQkmdGRhMTAwMjNfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHg0OCk7CisKKwkJaWYgKGFkYXAtPmZlX2FkYXBbMF0uZmUgPT0gTlVMTCkgeworCQkJZGViX2luZm8oIlREQTEwMDIzIGF0dGFjaCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJdHQzNjUwX2NpX2luaXQoYWRhcCk7CisJfSBlbHNlIHsKKwkJYWRhcC0+ZmVfYWRhcFsxXS5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDhfYXR0YWNoLAorCQkJJnRkYTEwMDQ4X2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCisJCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlID09IE5VTEwpIHsKKwkJCWRlYl9pbmZvKCJUREExMDA0OCBhdHRhY2ggZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJLyogdHVuZXIgaXMgYmVoaW5kIFREQTEwMDIzIEkyQy1nYXRlICovCisJCWFkYXAtPmZlX2FkYXBbMV0uZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdHR1c2IyX2N0MzY1MF9pMmNfZ2F0ZV9jdHJsOworCiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHR1c2IyX3R1bmVyX3RkYTgyN3hfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JaWYgKGR2Yl9hdHRhY2godGRhODI3eF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJLyogTUZFOiBzZWxlY3QgY29ycmVjdCBGRSB0byBhdHRhY2ggdHVuZXIgc2luY2UgdGhhdCdzIGNhbGxlZCB0d2ljZSAqLworCWlmIChhZGFwLT5mZV9hZGFwWzFdLmZlID09IE5VTEwpCisJCWZlID0gYWRhcC0+ZmVfYWRhcFswXS5mZTsKKwllbHNlCisJCWZlID0gYWRhcC0+ZmVfYWRhcFsxXS5mZTsKKworCS8qIGF0dGFjaCB0dW5lciAqLworCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBmZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZ0ZGE4Mjd4X2NvbmZpZykgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyB0ZGE4Mjd4IGZvdW5kIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMjUsMTIgKzU2MiwxMiBAQAogCiBzdGF0aWMgaW50IHR0dXNiMl90dW5lcl90ZGE4MjZ4X2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKKwlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgYWRhcC0+ZmVfYWRhcFswXS5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKIAkJZGViX2luZm8oIlREQTgyNjMgYXR0YWNoIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMCwgMCkgPT0gTlVMTCkgeworCWlmIChkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAwLCAwKSA9PSBOVUxMKSB7CiAJCWRlYl9pbmZvKCJMTkJQMjEgYXR0YWNoIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTI0Miw2ICs1NzksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dHVzYjJfcHJvcGVydGllc19zMjQwMDsKIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyB0dHVzYjJfcHJvcGVydGllc19jdDM2NTA7CiAKK3N0YXRpYyB2b2lkIHR0dXNiMl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJdHQzNjUwX2NpX3VuaW5pdChkKTsKKwlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOworfQorCiBzdGF0aWMgaW50IHR0dXNiMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewpAQCAtMjc3LDYgKzYyMiw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLCAvLyB0dHVzYjJfc3RyZWFtaW5nX2N0cmwsCiAKIAkJCS5mcm9udGVuZF9hdHRhY2ggID0gdHR1c2IyX2Zyb250ZW5kX3RkYTEwMDg2X2F0dGFjaCwKQEAgLTI5NSw2ICs2NDIsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfQorCQl9fSwKIAkJfQogCX0sCiAKQEAgLTMyOSw2ICs2NzcsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gTlVMTCwKIAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB0dHVzYjJfZnJvbnRlbmRfdGRhMTAwODZfYXR0YWNoLApAQCAtMzQ3LDYgKzY5Nyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCX19LAogCQl9CiAJfSwKIApAQCAtMzgzLDYgKzczNCw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAyLAorCQkuZmUgPSB7ewogCQkJLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLAogCiAJCQkuZnJvbnRlbmRfYXR0YWNoICA9IHR0dXNiMl9mcm9udGVuZF90ZGExMDAyM19hdHRhY2gsCkBAIC00MDEsNiArNzU0LDI2IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9CisJCX0sIHsKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gTlVMTCwKKworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB0dHVzYjJfZnJvbnRlbmRfdGRhMTAwMjNfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCA9IHR0dXNiMl90dW5lcl90ZGE4Mjd4X2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9JU09DLAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmlzb2MgPSB7CisJCQkJCQkuZnJhbWVzcGVydXJiID0gNCwKKwkJCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJCQkuaW50ZXJ2YWwgPSAxLAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9fSwKIAkJfSwKIAl9LAogCkBAIC00MjIsNyArNzk1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB0dHVzYjJfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkdmJfdXNiX3R0dXNiMiIsCiAJLnByb2JlCQk9IHR0dXNiMl9wcm9iZSwKLQkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmRpc2Nvbm5lY3QJPSB0dHVzYjJfdXNiX2Rpc2Nvbm5lY3QsCiAJLmlkX3RhYmxlCT0gdHR1c2IyX3RhYmxlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwppbmRleCAxMThhYWIxLi40NjM2NzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAJdW10X2NvbmZpZy5kZW1vZF9pbml0ID0gdW10X210MzUyX2RlbW9kX2luaXQ7CiAJdW10X2NvbmZpZy5kZW1vZF9hZGRyZXNzID0gMHhmOwogCi0JYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJnVtdF9jb25maWcsICZhZGFwLT5kZXYtPmkyY19hZGFwKTsKKwlhZGFwLT5mZV9hZGFwWzBdLmZlID0gZHZiX2F0dGFjaChtdDM1Ml9hdHRhY2gsICZ1bXRfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1bXRfdHVuZXJfYXR0YWNoIChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCBOVUxMLCBEVkJfUExMX1RVQTYwMzQpOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlX2FkYXBbMF0uZmUsIDB4NjEsIE5VTEwsIERWQl9QTExfVFVBNjAzNCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMCw2ICsxMDAsOCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7CisJCS5udW1fZnJvbnRlbmRzID0gMSwKKwkJLmZlID0ge3sKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB1bXRfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAogCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB1bXRfdHVuZXJfYXR0YWNoLApAQCAtMTE1LDcgKzExNyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9LAotCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91c2ItdXJiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYwppbmRleCA4NmQ2ODkzLi5kNjJlZTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCWlmICghc3RyZWFtLT51cmJfbGlzdFtpXSkgewogCQkJZGViX21lbSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYl9hbGxvY191cmIhLlxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCXVzYl9mcmVlX3VyYihzdHJlYW0tPnVyYl9saXN0W2ldKTsKKwkJCQl1c2JfZnJlZV91cmIoc3RyZWFtLT51cmJfbGlzdFtqXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQl1c2JfZmlsbF9idWxrX3VyYiggc3RyZWFtLT51cmJfbGlzdFtpXSwgc3RyZWFtLT51ZGV2LApAQCAtMTgxLDcgKzE4MSw3IEBACiAJCWlmICghc3RyZWFtLT51cmJfbGlzdFtpXSkgewogCQkJZGViX21lbSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHVyYl9hbGxvY191cmIhXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJdXNiX2ZyZWVfdXJiKHN0cmVhbS0+dXJiX2xpc3RbaV0pOworCQkJCXVzYl9mcmVlX3VyYihzdHJlYW0tPnVyYl9saXN0W2pdKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jCmluZGV4IDU0MzU1ZjguLjQ1ZTMxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAKIAl2cDcwMnhfaW5pdF9waWRfZmlsdGVyKGFkYXApOwogCi0JYWRhcC0+ZmUgPSB2cDcwMnhfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IHZwNzAyeF9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAl2cDcwMnhfdXNiX291dF9vcChhZGFwLT5kZXYsIFNFVF9UVU5FUl9QT1dFUl9SRVEsIDEsIDcsIE5VTEwsIDApOwogCiAJcmV0dXJuIDA7CkBAIC0zODMsNiArMzgzLDggQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJeworCQkubnVtX2Zyb250ZW5kcyA9IDEsCisJCS5mZSA9IHt7CiAJCQkuY2FwcyAgICAgICAgICAgICA9IERWQl9VU0JfQURBUF9SRUNFSVZFU18yMDRfQllURV9UUywKIAogCQkJLnN0cmVhbWluZ19jdHJsICAgPSB2cDcwMnhfc3RyZWFtaW5nX2N0cmwsCkBAIC0zOTksNiArNDAxLDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0sCisJCX19LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IHZwNzAyeF9hZGFwdGVyX3N0YXRlKSwKIAkJfQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwppbmRleCA1MzZjMTZjLi45MDg3M2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogLyoJRHVtcCB0aGUgRUVQUk9NICovCiAvKgl2cDcwNDVfcmVhZF9lZXByb20oZCxidWYsIDI1NSwgRlgyX0lEX0FERFIpOyAqLwogCi0JYWRhcC0+ZmUgPSB2cDcwNDVfZmVfYXR0YWNoKGFkYXAtPmRldik7CisJYWRhcC0+ZmVfYWRhcFswXS5mZSA9IHZwNzA0NV9mZV9hdHRhY2goYWRhcC0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ1LDYgKzI0NSw4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKKwkJLm51bV9mcm9udGVuZHMgPSAxLAorCQkuZmUgPSB7ewogCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB2cDcwNDVfZnJvbnRlbmRfYXR0YWNoLAogCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKQEAgLTI1Nyw2ICsyNTksNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSwKKwkJfX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gdnA3MDQ1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDMyZTA4ZTMuLjRhMmQyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC0yMzYsNiArMjM2LDEzIEBACiAJICBBIERWQi1TL0RTUyBEaXJlY3QgQ29udmVyc2lvbiByZXZlaXZlci4KIAkgIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX1REQTEwMDcxCisJdHJpc3RhdGUgIk5YUCBUREExMDA3MSIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbW1lbnQgIkRWQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApAQCAtNjAwLDYgKzYwNywxNiBAQAogCWhlbHAKIAkgIEFuIFNFQyBjb250cm9sIGNoaXBzLgogCitjb25maWcgRFZCX0xOQlAyMgorCXRyaXN0YXRlICJMTkJQMjIgU0VDIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBMTkIgcG93ZXIgc3VwcGx5IGFuZCBjb250cm9sIHZvbHRhZ2UKKwkgIHJlZ3VsYXRvciBjaGlwIHdpdGggc3RlcC11cCBjb252ZXJ0ZXIKKwkgIGFuZCBJMkMgaW50ZXJmYWNlLgorCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgY2hpcC4KKwogY29uZmlnIERWQl9JU0w2NDA1CiAJdHJpc3RhdGUgIklTTDY0MDUgU0VDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKQEAgLTYyMSw2ICs2MzgsMTEgQEAKIAloZWxwCiAJICBBIFNFQyBjb250cm9sbGVyIGNoaXAgZnJvbSBJbnRlcnNpbAogCitjb25maWcgRFZCX0E4MjkzCisJdHJpc3RhdGUgIkFsbGVncm8gQTgyOTMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCiBjb25maWcgRFZCX0xHUzhHTDUKIAl0cmlzdGF0ZSAiU2lsaWNvbiBMZWdlbmQgTEdTLThHTDUgZGVtb2R1bGF0b3IgKE9GRE0pIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCkBAIC02NjEsNiArNjgzLDE0IEBACiAJaGVscAogCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0lUOTEzWF9GRQorCXRyaXN0YXRlICJpdDkxM3ggZnJvbnRlbmQgYW5kIGl0OTEzNyB0dW5lciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItVCB0dW5lciBtb2R1bGUuCisJICBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogY29tbWVudCAiVG9vbHMgdG8gZGV2ZWxvcCBuZXcgZnJvbnRlbmRzIgogCiBjb25maWcgRFZCX0RVTU1ZX0ZFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggNmE2YmEwNS4uZjYzOWY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtMiw4ICsyLDggQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgRFZCIGZyb250ZW5kIGRldmljZSBkcml2ZXJzLgogIwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiBzdGIwODk5LW9ianMgPSBzdGIwODk5X2Rydi5vIHN0YjA4OTlfYWxnby5vCiBzdHYwOTAwLW9ianMgPSBzdHYwOTAwX2NvcmUubyBzdHYwOTAwX3N3Lm8KQEAgLTUyLDYgKzUyLDcgQEAKIG9iai0kKENPTkZJR19EVkJfTEdEVDMzMDUpICs9IGxnZHQzMzA1Lm8KIG9iai0kKENPTkZJR19EVkJfQ1gyNDEyMykgKz0gY3gyNDEyMy5vCiBvYmotJChDT05GSUdfRFZCX0xOQlAyMSkgKz0gbG5icDIxLm8KK29iai0kKENPTkZJR19EVkJfTE5CUDIyKSArPSBsbmJwMjIubwogb2JqLSQoQ09ORklHX0RWQl9JU0w2NDA1KSArPSBpc2w2NDA1Lm8KIG9iai0kKENPTkZJR19EVkJfSVNMNjQyMSkgKz0gaXNsNjQyMS5vCiBvYmotJChDT05GSUdfRFZCX1REQTEwMDg2KSArPSB0ZGExMDA4Ni5vCkBAIC05MSw0ICs5Miw3IEBACiBvYmotJChDT05GSUdfRFZCX0NYRDI4MjBSKSArPSBjeGQyODIwci5vCiBvYmotJChDT05GSUdfRFZCX0RSWEspICs9IGRyeGsubwogb2JqLSQoQ09ORklHX0RWQl9UREExODI3MUMyREQpICs9IHRkYTE4MjcxYzJkZC5vCitvYmotJChDT05GSUdfRFZCX0lUOTEzWF9GRSkgKz0gaXQ5MTN4LWZlLm8KK29iai0kKENPTkZJR19EVkJfQTgyOTMpICs9IGE4MjkzLm8KK29iai0kKENPTkZJR19EVkJfVERBMTAwNzEpICs9IHRkYTEwMDcxLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYTgyOTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU2NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBBbGxlZ3JvIEE4MjkzIFNFQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiYTgyOTMuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworI2RlZmluZSBMT0dfUFJFRklYICJhODI5MyIKKworI3VuZGVmIGRiZworI2RlZmluZSBkYmcoZiwgYXJnLi4uKSBcCisJaWYgKGRlYnVnKSBcCisJCXByaW50ayhLRVJOX0lORk8gICBMT0dfUFJFRklYIjogIiBmICJcbiIgLCAjIyBhcmcpCisjdW5kZWYgZXJyCisjZGVmaW5lIGVycihmLCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiBpbmZvCisjZGVmaW5lIGluZm8oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiB3YXJuCisjZGVmaW5lIHdhcm4oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKworCitzdHJ1Y3QgYTgyOTNfcHJpdiB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJY29uc3Qgc3RydWN0IGE4MjkzX2NvbmZpZyAqY2ZnOworCXU4IHJlZ1syXTsKK307CisKK3N0YXRpYyBpbnQgYTgyOTNfaTJjKHN0cnVjdCBhODI5M19wcml2ICpwcml2LCB1OCAqdmFsLCBpbnQgbGVuLCBib29sIHJkKQoreworCWludCByZXQ7CisJc3RydWN0IGkyY19tc2cgbXNnWzFdID0geworCQl7CisJCQkuYWRkciA9IHByaXYtPmNmZy0+aTJjX2FkZHIsCisJCQkubGVuID0gbGVuLAorCQkJLmJ1ZiA9IHZhbCwKKwkJfQorCX07CisKKwlpZiAocmQpCisJCW1zZ1swXS5mbGFncyA9IEkyQ19NX1JEOworCWVsc2UKKwkJbXNnWzBdLmZsYWdzID0gMDsKKworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZywgMSk7CisJaWYgKHJldCA9PSAxKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJd2FybigiaTJjIGZhaWxlZD0lZCByZD0lZCIsIHJldCwgcmQpOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfd3Ioc3RydWN0IGE4MjkzX3ByaXYgKnByaXYsIHU4ICp2YWwsIGludCBsZW4pCit7CisJcmV0dXJuIGE4MjkzX2kyYyhwcml2LCB2YWwsIGxlbiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfcmQoc3RydWN0IGE4MjkzX3ByaXYgKnByaXYsIHU4ICp2YWwsIGludCBsZW4pCit7CisJcmV0dXJuIGE4MjkzX2kyYyhwcml2LCB2YWwsIGxlbiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYTgyOTNfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJZmVfc2VjX3ZvbHRhZ2VfdCBmZV9zZWNfdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgYTgyOTNfcHJpdiAqcHJpdiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgcmV0OworCisJZGJnKCIlczogZmVfc2VjX3ZvbHRhZ2U9JWQiLCBfX2Z1bmNfXywgZmVfc2VjX3ZvbHRhZ2UpOworCisJc3dpdGNoIChmZV9zZWNfdm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQkvKiBFTkI9MCAqLworCQlwcml2LT5yZWdbMF0gPSAweDEwOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQkvKiBWU0VMMD0xLCBWU0VMMT0wLCBWU0VMMj0wLCBWU0VMMz0wLCBFTkI9MSovCisJCXByaXYtPnJlZ1swXSA9IDB4MzE7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCS8qIFZTRUwwPTAsIFZTRUwxPTAsIFZTRUwyPTAsIFZTRUwzPTEsIEVOQj0xKi8KKwkJcHJpdi0+cmVnWzBdID0gMHgzODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfTsKKworCXJldCA9IGE4MjkzX3dyKHByaXYsICZwcml2LT5yZWdbMF0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIHJldDsKK2VycjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhODI5M19yZWxlYXNlX3NlYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkYmcoIiVzOiIsIF9fZnVuY19fKTsKKworCWE4MjkzX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOworCisJa2ZyZWUoZmUtPnNlY19wcml2KTsKKwlmZS0+c2VjX3ByaXYgPSBOVUxMOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICphODI5M19hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGNvbnN0IHN0cnVjdCBhODI5M19jb25maWcgKmNmZykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhODI5M19wcml2ICpwcml2ID0gTlVMTDsKKwl1OCBidWZbMl07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBwcml2ICovCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhODI5M19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgcHJpdiAqLworCXByaXYtPmkyYyA9IGkyYzsKKwlwcml2LT5jZmcgPSBjZmc7CisJZmUtPnNlY19wcml2ID0gcHJpdjsKKworCS8qIGNoZWNrIGlmIHRoZSBTRUMgaXMgdGhlcmUgKi8KKwlyZXQgPSBhODI5M19yZChwcml2LCBidWYsIDIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogRU5CPTAgKi8KKwlwcml2LT5yZWdbMF0gPSAweDEwOworCXJldCA9IGE4MjkzX3dyKHByaXYsICZwcml2LT5yZWdbMV0sIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJLyogVE1PREU9MCwgVEdBVEU9MSAqLworCXByaXYtPnJlZ1sxXSA9IDB4ODI7CisJcmV0ID0gYTgyOTNfd3IocHJpdiwgJnByaXYtPnJlZ1sxXSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlpbmZvKCJBbGxlZ3JvIEE4MjkzIFNFQyBhdHRhY2hlZC4iKTsKKworCWZlLT5vcHMucmVsZWFzZV9zZWMgPSBhODI5M19yZWxlYXNlX3NlYzsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBhODI5M19zZXRfdm9sdGFnZTsKKworCXJldHVybiBmZTsKK2VycjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woYTgyOTNfYXR0YWNoKTsKKworTU9EVUxFX0FVVEhPUigiQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFsbGVncm8gQTgyOTMgU0VDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYTgyOTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI5ZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2E4MjkzLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIEFsbGVncm8gQTgyOTMgU0VDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbnR0aSBQYWxvc2FhcmkgPGNyb3BlQGlraS5maT4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgQTgyOTNfSAorI2RlZmluZSBBODI5M19ICisKK3N0cnVjdCBhODI5M19jb25maWcgeworCXU4IGkyY19hZGRyOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9BODI5MykgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfQTgyOTNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqYTgyOTNfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBjb25zdCBzdHJ1Y3QgYTgyOTNfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqYTgyOTNfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBjb25zdCBzdHJ1Y3QgYTgyOTNfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIEE4MjkzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKaW5kZXggMjkwNjU4Mi4uMDNjYWI3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKQEAgLTkzLDkgKzkzLDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZQogKTsKLWV4dGVybiBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcigKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZQotKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmN4ZDI4MjByX2F0dGFjaCgKIAljb25zdCBzdHJ1Y3QgY3hkMjgyMHJfY29uZmlnICpjb25maWcsCkBAIC0xMDYsMTIgKzEwMyw2IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CiB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBpMmNfYWRhcHRlciAqY3hkMjgyMHJfZ2V0X3R1bmVyX2kyY19hZGFwdGVyKAotCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlCi0pCi17Ci0JcmV0dXJuIE5VTEw7Ci19CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2MuYwppbmRleCAzYzA3ZDQwLi5iODVmNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jLmMKQEAgLTMzNSw0ICszMzUsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jCmluZGV4IGQ0MTZlODUuLjAzNjQ4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYwpAQCAtNzI3LDcyICs3MjcsMjIgQEAKIAlzdHJ1Y3QgY3hkMjgyMHJfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgewotCQlpMmNfZGVsX2FkYXB0ZXIoJnByaXYtPnR1bmVyX2kyY19hZGFwdGVyKTsKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkKIAkJa2ZyZWUocHJpdik7Ci0JfQogCiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdTMyIGN4ZDI4MjByX3R1bmVyX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOwotfQotCi1zdGF0aWMgaW50IGN4ZDI4MjByX3R1bmVyX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCi0Jc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCi17Ci0Jc3RydWN0IGN4ZDI4MjByX3ByaXYgKnByaXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQlpbnQgcmV0OwotCXU4ICpvYnVmID0ga21hbGxvYyhtc2dbMF0ubGVuICsgMiwgR0ZQX0tFUk5FTCk7Ci0Jc3RydWN0IGkyY19tc2cgbXNnMlsyXSA9IHsKLQkJewotCQkJLmFkZHIgPSBwcml2LT5jZmcuaTJjX2FkZHJlc3MsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IG1zZ1swXS5sZW4gKyAyLAotCQkJLmJ1ZiA9IG9idWYsCi0JCX0sIHsKLQkJCS5hZGRyID0gcHJpdi0+Y2ZnLmkyY19hZGRyZXNzLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuID0gbXNnWzFdLmxlbiwKLQkJCS5idWYgPSBtc2dbMV0uYnVmLAotCQl9Ci0JfTsKLQotCWlmICghb2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlvYnVmWzBdID0gMHgwOTsKLQlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpOwotCWlmIChudW0gPT0gMikgeyAvKiBJMkMgcmVhZCAqLwotCQlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpIHwgSTJDX01fUkQ7IC8qIEkyQyBSRCBmbGFnICovCi0JCW1zZzJbMF0ubGVuID0gbXNnWzBdLmxlbiArIDIgLSAxOyAvKiAnLTEnIG1heWJlIEhXIGJ1ZyA/ICovCi0JfQotCW1lbWNweSgmb2J1ZlsyXSwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7Ci0KLQlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2cyLCBudW0pOwotCWlmIChyZXQgPCAwKQotCQl3YXJuKCJ0dW5lciBpMmMgZmFpbGVkIHJldDolZCIsIHJldCk7Ci0KLQlrZnJlZShvYnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjeGQyODIwcl90dW5lcl9pMmNfYWxnbyA9IHsKLQkubWFzdGVyX3hmZXIgICA9IGN4ZDI4MjByX3R1bmVyX2kyY194ZmVyLAotCS5mdW5jdGlvbmFsaXR5ID0gY3hkMjgyMHJfdHVuZXJfaTJjX2Z1bmMsCi19OwotCi1zdHJ1Y3QgaTJjX2FkYXB0ZXIgKmN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgY3hkMjgyMHJfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3QgY3hkMjgyMHJfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXJldHVybiAmcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXI7Ci19Ci1FWFBPUlRfU1lNQk9MKGN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcik7CisJZGJnKCIlczogJWQiLCBfX2Z1bmNfXywgZW5hYmxlKTsKIAotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGN4ZDI4MjByX29wc1syXTsKKwkvKiBCaXQgMCBvZiByZWcgMHhkYiBpbiBiYW5rIDB4MDAgY29udHJvbHMgSTJDIHJlcGVhdGVyICovCisJcmV0dXJuIGN4ZDI4MjByX3dyX3JlZ19tYXNrKHByaXYsIDB4ZGIsIGVuYWJsZSA/IDEgOiAwLCAweDEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgY3hkMjgyMHJfb3BzWzJdOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpjeGQyODIwcl9hdHRhY2goY29uc3Qgc3RydWN0IGN4ZDI4MjByX2NvbmZpZyAqY2ZnLAogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKQEAgLTgzMSwxOCArNzgxLDYgQEAKIAkJcHJpdi0+ZmVbMF0uZGVtb2R1bGF0b3JfcHJpdiA9IHByaXY7CiAJCXByaXYtPmZlWzFdLmRlbW9kdWxhdG9yX3ByaXYgPSBwcml2OwogCi0JCS8qIGNyZWF0ZSB0dW5lciBpMmMgYWRhcHRlciAqLwotCQlzdHJsY3B5KHByaXYtPnR1bmVyX2kyY19hZGFwdGVyLm5hbWUsCi0JCQkiQ1hEMjgyMFIgdHVuZXIgSTJDIGFkYXB0ZXIiLAotCQkJc2l6ZW9mKHByaXYtPnR1bmVyX2kyY19hZGFwdGVyLm5hbWUpKTsKLQkJcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIuYWxnbyA9ICZjeGQyODIwcl90dW5lcl9pMmNfYWxnbzsKLQkJcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIuYWxnb19kYXRhID0gTlVMTDsKLQkJaTJjX3NldF9hZGFwZGF0YSgmcHJpdi0+dHVuZXJfaTJjX2FkYXB0ZXIsIHByaXYpOwotCQlpZiAoaTJjX2FkZF9hZGFwdGVyKCZwcml2LT50dW5lcl9pMmNfYWRhcHRlcikgPCAwKSB7Ci0JCQllcnIoInR1bmVyIEkyQyBidXMgY291bGQgbm90IGJlIGluaXRpYWxpemVkIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KIAkJcmV0dXJuICZwcml2LT5mZVswXTsKIAogCX0gZWxzZSB7CkBAIC04NTgsNyArNzk2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woY3hkMjgyMHJfYXR0YWNoKTsKIAotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGN4ZDI4MjByX29wc1syXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBjeGQyODIwcl9vcHNbMl0gPSB7CiAJewogCQkvKiBEVkItVC9UMiAqLwogCQkuaW5mbyA9IHsKQEAgLTg4Myw2ICs4MjEsNyBAQAogCQkuc2xlZXAgPSBjeGQyODIwcl9zbGVlcCwKIAogCQkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBjeGQyODIwcl9nZXRfdHVuZV9zZXR0aW5ncywKKwkJLmkyY19nYXRlX2N0cmwgPSBjeGQyODIwcl9pMmNfZ2F0ZV9jdHJsLAogCiAJCS5nZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9nZXRfZnJvbnRlbmQsCiAKQEAgLTkxMSw2ICs4NTAsNyBAQAogCQkuc2xlZXAgPSBjeGQyODIwcl9zbGVlcCwKIAogCQkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBjeGQyODIwcl9nZXRfdHVuZV9zZXR0aW5ncywKKwkJLmkyY19nYXRlX2N0cmwgPSBjeGQyODIwcl9pMmNfZ2F0ZV9jdHJsLAogCiAJCS5zZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9zZXRfZnJvbnRlbmQsCiAJCS5nZXRfZnJvbnRlbmQgPSBjeGQyODIwcl9nZXRfZnJvbnRlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaAppbmRleCAwYzBlYmM5Li45NTUzOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9wcml2LmgKQEAgLTUwLDcgKzUwLDYgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZlWzJdOwogCXN0cnVjdCBjeGQyODIwcl9jb25maWcgY2ZnOwotCXN0cnVjdCBpMmNfYWRhcHRlciB0dW5lcl9pMmNfYWRhcHRlcjsKIAogCXN0cnVjdCBtdXRleCBmZV9sb2NrOyAvKsKgRkUgbG9jayAqLwogCWludCBhY3RpdmVfZmU6MjsgLyogRkUgbG9jaywgLTE9Tk9ORSwgMD1EVkItVC9UMiwgMT1EVkItQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3QuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90LmMKaW5kZXggNjU4MjU2NC4uYTA0ZjljOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3QuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfdC5jCkBAIC00NDYsNCArNDQ2LDMgQEAKIAogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfdDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCmluZGV4IGM0N2IzNWMuLjY1NDg1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl90Mi5jCkBAIC00MjAsNCArNDIwLDMgQEAKIAogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwNzAuYwppbmRleCAxZDQ3ZDRkLi5kYzFjYjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA3MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIwMDcwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogCkBAIC03OCwxMCArNzksMTggQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CiAJdTggaTJjX3dyaXRlX2J1ZmZlclszXTsKIAl1OCBpMmNfcmVhZF9idWZmZXJbMl07CisJc3RydWN0IG11dGV4IGkyY19idWZmZXJfbG9jazsKIH07CiAKLXN0YXRpYyB1aW50MTZfdCBkaWIwMDcwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDcwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQorc3RhdGljIHUxNiBkaWIwMDcwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDcwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldChzdGF0ZS0+bXNnLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC05NiwxMyArMTA1LDIzIEBACiAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIHN0YXRlLT5tc2csIDIpICE9IDIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlCMDA3MCBJMkMgcmVhZCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJcmV0ID0gKHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMF0gPDwgOCkKKwkJCXwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWIwMDcwX3dyaXRlX3JlZyhzdHJ1Y3QgZGliMDA3MF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTE2IHZhbCkKIHsKKwlpbnQgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gcmVnOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gdmFsID4+IDg7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMl0gPSB2YWwgJiAweGZmOwpAQCAtMTE1LDkgKzEzNCwxMiBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwNzAgSTJDIHdyaXRlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQlyZXR1cm4gMDsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBIQVJEX1JFU0VUKHN0YXRlKSBkbyB7IFwKQEAgLTczNCw2ICs3NTYsNyBAQAogCXN0YXRlLT5jZmcgPSBjZmc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKIAlzdGF0ZS0+ZmUgID0gZmU7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CiAJZmUtPnR1bmVyX3ByaXYgPSBzdGF0ZTsKIAogCWlmIChkaWIwMDcwX3Jlc2V0KGZlKSAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwOTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIwMDkwLmMKaW5kZXggYzljOTM1YS4uYjE3NGQxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjAwOTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMDA5MC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKIApAQCAtMTk2LDYgKzE5Nyw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbM107CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBzdHJ1Y3QgZGliMDA5MF9md19zdGF0ZSB7CkBAIC0yMDgsMTAgKzIxMCwxOCBAQAogCXN0cnVjdCBpMmNfbXNnIG1zZzsKIAl1OCBpMmNfd3JpdGVfYnVmZmVyWzJdOwogCXU4IGkyY19yZWFkX2J1ZmZlclsyXTsKKwlzdHJ1Y3QgbXV0ZXggaTJjX2J1ZmZlcl9sb2NrOwogfTsKIAogc3RhdGljIHUxNiBkaWIwMDkwX3JlYWRfcmVnKHN0cnVjdCBkaWIwMDkwX3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldChzdGF0ZS0+bXNnLCAwLCAyICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC0yMjYsMTQgKzIzNiwyNCBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAyKSAhPSAyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCQlyZXQgPSAwOworCX0gZWxzZQorCQlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KQorCQkJfCBzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzFdOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDA5MF93cml0ZV9yZWcoc3RydWN0IGRpYjAwOTBfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgdmFsKQogeworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZyAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSB2YWwgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9IHZhbCAmIDB4ZmY7CkBAIC0yNDYsMTMgKzI2NiwyMyBAQAogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHdyaXRlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQlyZXR1cm4gMDsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUxNiBkaWIwMDkwX2Z3X3JlYWRfcmVnKHN0cnVjdCBkaWIwMDkwX2Z3X3N0YXRlICpzdGF0ZSwgdTggcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZzsKIAogCW1lbXNldCgmc3RhdGUtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CkBAIC0yNjIsMTMgKzI5MiwyNCBAQAogCXN0YXRlLT5tc2cubGVuID0gMjsKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZzdGF0ZS0+bXNnLCAxKSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpQjAwOTAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJCXJldCA9IDA7CisJfSBlbHNlCisJCXJldCA9IChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpCisJCQl8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliMDA5MF9md193cml0ZV9yZWcoc3RydWN0IGRpYjAwOTBfZndfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gdmFsID4+IDg7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSB2YWwgJiAweGZmOwogCkBAIC0yNzksOSArMzIwLDEyIEBACiAJc3RhdGUtPm1zZy5sZW4gPSAyOwogCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJnN0YXRlLT5tc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlCMDA5MCBJMkMgd3JpdGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JfQotCXJldHVybiAwOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0gZWxzZQorCQlyZXQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAjZGVmaW5lIEhBUkRfUkVTRVQoc3RhdGUpIGRvIHsgIGlmIChjZmctPnJlc2V0KSB7ICBpZiAoY2ZnLT5zbGVlcCkgY2ZnLT5zbGVlcChmZSwgMCk7IG1zbGVlcCgxMCk7ICBjZmctPnJlc2V0KGZlLCAxKTsgbXNsZWVwKDEwKTsgIGNmZy0+cmVzZXQoZmUsIDApOyBtc2xlZXAoMTApOyAgfSAgfSB3aGlsZSAoMCkKQEAgLTI0NDAsNiArMjQ4NCw3IEBACiAJc3QtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdC0+aTJjID0gaTJjOwogCXN0LT5mZSA9IGZlOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCWZlLT50dW5lcl9wcml2ID0gc3Q7CiAKIAlpZiAoY29uZmlnLT53YmQgPT0gTlVMTCkKQEAgLTI0NzEsNiArMjUxNiw3IEBACiAJc3QtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdC0+aTJjID0gaTJjOwogCXN0LT5mZSA9IGZlOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCWZlLT50dW5lcl9wcml2ID0gc3Q7CiAKIAlpZiAoZGliMDA5MF9md19yZXNldF9kaWdpdGFsKGZlLCBzdC0+Y29uZmlnKSAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBtLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYwppbmRleCA3OWNiMWMyLi5kYmI3NmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCiAKQEAgLTU1LDYgKzU2LDcgQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CiAJdTggaTJjX3dyaXRlX2J1ZmZlcls0XTsKIAl1OCBpMmNfcmVhZF9idWZmZXJbMl07CisJc3RydWN0IG11dGV4IGkyY19idWZmZXJfbG9jazsKIH07CiAKIGVudW0gZGliNzAwMG1fcG93ZXJfbW9kZSB7CkBAIC02OSw2ICs3MSwxMyBAQAogCiBzdGF0aWMgdTE2IGRpYjcwMDBtX3JlYWRfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQogeworCXUxNiByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IChyZWcgPj4gOCkgfCAweDgwOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gcmVnICYgMHhmZjsKIApAQCAtODUsMTEgKzk0LDIxIEBACiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDIpICE9IDIpCiAJCWRwcmludGsoImkyYyByZWFkIGVycm9yIG9uICVkIixyZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliNzAwMG1fd3JpdGVfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1MTYgdmFsKQogeworCWludCByZXQ7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IChyZWcgPj4gOCkgJiAweGZmOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzFdID0gcmVnICYgMHhmZjsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwpAQCAtMTAxLDcgKzEyMCwxMCBAQAogCXN0YXRlLT5tc2dbMF0uYnVmID0gc3RhdGUtPmkyY193cml0ZV9idWZmZXI7CiAJc3RhdGUtPm1zZ1swXS5sZW4gPSA0OwogCi0JcmV0dXJuIGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDEpICE9IDEgPyAtRVJFTU9URUlPIDogMDsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgc3RhdGUtPm1zZywgMSkgIT0gMSA/CisJCQktRVJFTU9URUlPIDogMCk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogc3RhdGljIHZvaWQgZGliNzAwMG1fd3JpdGVfdGFiKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUsIHUxNiAqYnVmKQogewpAQCAtMTM4NSw2ICsxNDA3LDcgQEAKIAlkZW1vZCAgICAgICAgICAgICAgICAgICA9ICZzdC0+ZGVtb2Q7CiAJZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXYgPSBzdDsKIAltZW1jcHkoJnN0LT5kZW1vZC5vcHMsICZkaWI3MDAwbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCW11dGV4X2luaXQoJnN0LT5pMmNfYnVmZmVyX2xvY2spOwogCiAJc3QtPnRpbWZfZGVmYXVsdCA9IGNmZy0+YnctPnRpbWY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKaW5kZXggYTY0YTUzOC4uY2U4NTM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgImR2Yl9tYXRoLmgiCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCkBAIC02OCw2ICs2OSw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbNF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBlbnVtIGRpYjcwMDBwX3Bvd2VyX21vZGUgewpAQCAtODEsNiArODMsMTMgQEAKIAogc3RhdGljIHUxNiBkaWI3MDAwcF9yZWFkX3dvcmQoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSByZWcgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTk3LDExICsxMDYsMjAgQEAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgc3RhdGUtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZywgdTE2IHZhbCkKIHsKKwlpbnQgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSAocmVnID4+IDgpICYgMHhmZjsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKQEAgLTExMyw3ICsxMzEsMTAgQEAKIAlzdGF0ZS0+bXNnWzBdLmJ1ZiA9IHN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyOwogCXN0YXRlLT5tc2dbMF0ubGVuID0gNDsKIAotCXJldHVybiBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyY19hZGFwLCBzdGF0ZS0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJcmV0ID0gKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIHN0YXRlLT5tc2csIDEpICE9IDEgPworCQkJLUVSRU1PVEVJTyA6IDApOworCW11dGV4X3VubG9jaygmc3RhdGUtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZGliNzAwMHBfd3JpdGVfdGFiKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIHUxNiAqIGJ1ZikKQEAgLTE1NzcsOCArMTU5OCw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXJ4ID0ga3phbGxvYygyKnNpemVvZih1OCksIEdGUF9LRVJORUwpOwogCWlmICghcngpIHsKLQkJZ290byByeF9tZW1vcnlfZXJyb3I7CiAJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcnhfbWVtb3J5X2Vycm9yOwogCX0KIAogCW1zZ1swXS5idWYgPSB0eDsKQEAgLTE2NDYsNiArMTY2Nyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZHBzdC0+aTJjX2FkYXAgPSBpMmM7CisJbXV0ZXhfaW5pdCgmZHBzdC0+aTJjX2J1ZmZlcl9sb2NrKTsKIAogCWZvciAoayA9IG5vX29mX2RlbW9kcyAtIDE7IGsgPj0gMDsgay0tKSB7CiAJCWRwc3QtPmNmZyA9IGNmZ1trXTsKQEAgLTIzMjQsNiArMjM0Niw3IEBACiAJZGVtb2QgPSAmc3QtPmRlbW9kOwogCWRlbW9kLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CiAJbWVtY3B5KCZzdC0+ZGVtb2Qub3BzLCAmZGliNzAwMHBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwltdXRleF9pbml0KCZzdC0+aTJjX2J1ZmZlcl9sb2NrKTsKIAogCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3QsIDEyODcsIDB4MDAwMyk7CS8qIHNyYW0gbGVhZCBpbiwgcmR5ICovCiAKQEAgLTIzMzMsOCArMjM1Niw5IEBACiAJc3QtPnZlcnNpb24gPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3QsIDg5Nyk7CiAKIAkvKiBGSVhNRTogbWFrZSBzdXJlIHRoZSBkZXYucGFyZW50IGZpZWxkIGlzIGluaXRpYWxpemVkLCBvciBlbHNlCi0JCXJlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGhpdCBhbiBPT1BTICh0aGlzIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUKLQkJbW9yZSBjb21tb24pICovCisJICAgcmVxdWVzdF9maXJtd2FyZSgpIHdpbGwgaGl0IGFuIE9PUFMgKHRoaXMgc2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZQorCSAgIG1vcmUgY29tbW9uKSAqLworCXN0LT5pMmNfbWFzdGVyLmdhdGVkX3R1bmVyX2kyY19hZGFwLmRldi5wYXJlbnQgPSBpMmNfYWRhcC0+ZGV2LnBhcmVudDsKIAogCS8qIEZJWE1FOiBtYWtlIHN1cmUgdGhlIGRldi5wYXJlbnQgZmllbGQgaXMgaW5pdGlhbGl6ZWQsIG9yIGVsc2UKIAkgICByZXF1ZXN0X2Zpcm13YXJlKCkgd2lsbCBoaXQgYW4gT09QUyAodGhpcyBzaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjgwMDAuYwppbmRleCA3ZDJlYTExLi5mZTI4NGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliODAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI4MDAwLmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKwogI2luY2x1ZGUgImR2Yl9tYXRoLmgiCiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKQEAgLTM3LDYgKzM5LDcgQEAKIAl1OCBhZGRyOwogCXU4ICppMmNfd3JpdGVfYnVmZmVyOwogCXU4ICppMmNfcmVhZF9idWZmZXI7CisJc3RydWN0IG11dGV4ICppMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBzdHJ1Y3QgZGliODAwMF9zdGF0ZSB7CkBAIC03Nyw2ICs4MCw3IEBACiAJc3RydWN0IGkyY19tc2cgbXNnWzJdOwogCXU4IGkyY193cml0ZV9idWZmZXJbNF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBlbnVtIGRpYjgwMDBfcG93ZXJfbW9kZSB7CkBAIC04NiwyNCArOTAsMzkgQEAKIAogc3RhdGljIHUxNiBkaWI4MDAwX2kyY19yZWFkMTYoc3RydWN0IGkyY19kZXZpY2UgKmkyYywgdTE2IHJlZykKIHsKKwl1MTYgcmV0OwogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKLQkJey5hZGRyID0gaTJjLT5hZGRyID4+IDEsIC5mbGFncyA9IDAsCi0JCQkuYnVmID0gaTJjLT5pMmNfd3JpdGVfYnVmZmVyLCAubGVuID0gMn0sCi0JCXsuYWRkciA9IGkyYy0+YWRkciA+PiAxLCAuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5idWYgPSBpMmMtPmkyY19yZWFkX2J1ZmZlciwgLmxlbiA9IDJ9LAorCQl7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gMCwgLmxlbiA9IDJ9LAorCQl7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gSTJDX01fUkQsIC5sZW4gPSAyfSwKIAl9OwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShpMmMtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXNnWzBdLmJ1ZiAgICA9IGkyYy0+aTJjX3dyaXRlX2J1ZmZlcjsKIAltc2dbMF0uYnVmWzBdID0gcmVnID4+IDg7CiAJbXNnWzBdLmJ1ZlsxXSA9IHJlZyAmIDB4ZmY7CisJbXNnWzFdLmJ1ZiAgICA9IGkyYy0+aTJjX3JlYWRfYnVmZmVyOwogCiAJaWYgKGkyY190cmFuc2ZlcihpMmMtPmFkYXAsIG1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChtc2dbMV0uYnVmWzBdIDw8IDgpIHwgbXNnWzFdLmJ1ZlsxXTsKKwlyZXQgPSAobXNnWzFdLmJ1ZlswXSA8PCA4KSB8IG1zZ1sxXS5idWZbMV07CisJbXV0ZXhfdW5sb2NrKGkyYy0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTE2IGRpYjgwMDBfcmVhZF93b3JkKHN0cnVjdCBkaWI4MDAwX3N0YXRlICpzdGF0ZSwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMF0gPSByZWcgPj4gODsKIAlzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTEyMCw3ICsxMzksMTAgQEAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMuYWRhcCwgc3RhdGUtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyWzBdIDw8IDgpIHwgc3RhdGUtPmkyY19yZWFkX2J1ZmZlclsxXTsKKwlyZXQgPSAoc3RhdGUtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IHN0YXRlLT5pMmNfcmVhZF9idWZmZXJbMV07CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+aTJjX2J1ZmZlcl9sb2NrKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1MzIgZGliODAwMF9yZWFkMzIoc3RydWN0IGRpYjgwMDBfc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQpAQCAtMTM1LDIyICsxNTcsMzUgQEAKIAogc3RhdGljIGludCBkaWI4MDAwX2kyY193cml0ZTE2KHN0cnVjdCBpMmNfZGV2aWNlICppMmMsIHUxNiByZWcsIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gaTJjLT5hZGRyID4+IDEsIC5mbGFncyA9IDAsCi0JCS5idWYgPSBpMmMtPmkyY193cml0ZV9idWZmZXIsIC5sZW4gPSA0fTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSBpMmMtPmFkZHIgPj4gMSwgLmZsYWdzID0gMCwgLmxlbiA9IDR9OwogCWludCByZXQgPSAwOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShpMmMtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnLmJ1ZiAgICA9IGkyYy0+aTJjX3dyaXRlX2J1ZmZlcjsKIAltc2cuYnVmWzBdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CiAJbXNnLmJ1ZlsxXSA9IHJlZyAmIDB4ZmY7CiAJbXNnLmJ1ZlsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwogCW1zZy5idWZbM10gPSB2YWwgJiAweGZmOwogCiAJcmV0ID0gaTJjX3RyYW5zZmVyKGkyYy0+YWRhcCwgJm1zZywgMSkgIT0gMSA/IC1FUkVNT1RFSU8gOiAwOworCW11dGV4X3VubG9jayhpMmMtPmkyY19idWZmZXJfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRpYjgwMDBfd3JpdGVfd29yZChzdHJ1Y3QgZGliODAwMF9zdGF0ZSAqc3RhdGUsIHUxNiByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzBdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CiAJc3RhdGUtPmkyY193cml0ZV9idWZmZXJbMV0gPSByZWcgJiAweGZmOwogCXN0YXRlLT5pMmNfd3JpdGVfYnVmZmVyWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CkBAIC0xNjIsNyArMTk3LDExIEBACiAJc3RhdGUtPm1zZ1swXS5idWYgPSBzdGF0ZS0+aTJjX3dyaXRlX2J1ZmZlcjsKIAlzdGF0ZS0+bXNnWzBdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMuYWRhcCwgc3RhdGUtPm1zZywgMSkgIT0gMSA/IC1FUkVNT1RFSU8gOiAwOworCXJldCA9IChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYy5hZGFwLCBzdGF0ZS0+bXNnLCAxKSAhPSAxID8KKwkJCS1FUkVNT1RFSU8gOiAwKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHMxNiBjb2VmZl8ya19zYl8xc2VnX2RxcHNrWzhdID0gewpAQCAtMjQzNCw4ICsyNDczLDE1IEBACiAJaWYgKCFjbGllbnQuaTJjX3JlYWRfYnVmZmVyKSB7CiAJCWRwcmludGsoIiVzOiBub3QgZW5vdWdoIG1lbW9yeSIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9tZW1vcnk7CisJCWdvdG8gZXJyb3JfbWVtb3J5X3JlYWQ7CiAJfQorCWNsaWVudC5pMmNfYnVmZmVyX2xvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXV0ZXgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudC5pMmNfYnVmZmVyX2xvY2spIHsKKwkJZHByaW50aygiJXM6IG5vdCBlbm91Z2ggbWVtb3J5IiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX21lbW9yeV9sb2NrOworCX0KKwltdXRleF9pbml0KGNsaWVudC5pMmNfYnVmZmVyX2xvY2spOwogCiAJZm9yIChrID0gbm9fb2ZfZGVtb2RzIC0gMTsgayA+PSAwOyBrLS0pIHsKIAkJLyogZGVzaWduYXRlZCBpMmMgYWRkcmVzcyAqLwpAQCAtMjQ3Niw4ICsyNTIyLDEwIEBACiAJfQogCiBlcnJvcjoKKwlrZnJlZShjbGllbnQuaTJjX2J1ZmZlcl9sb2NrKTsKK2Vycm9yX21lbW9yeV9sb2NrOgogCWtmcmVlKGNsaWVudC5pMmNfcmVhZF9idWZmZXIpOwotZXJyb3JfbWVtb3J5OgorZXJyb3JfbWVtb3J5X3JlYWQ6CiAJa2ZyZWUoY2xpZW50LmkyY193cml0ZV9idWZmZXIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI1ODEsNiArMjYyOSw4IEBACiAJc3RhdGUtPmkyYy5hZGRyID0gaTJjX2FkZHI7CiAJc3RhdGUtPmkyYy5pMmNfd3JpdGVfYnVmZmVyID0gc3RhdGUtPmkyY193cml0ZV9idWZmZXI7CiAJc3RhdGUtPmkyYy5pMmNfcmVhZF9idWZmZXIgPSBzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyOworCW11dGV4X2luaXQoJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2spOworCXN0YXRlLT5pMmMuaTJjX2J1ZmZlcl9sb2NrID0gJnN0YXRlLT5pMmNfYnVmZmVyX2xvY2s7CiAJc3RhdGUtPmdwaW9fdmFsID0gY2ZnLT5ncGlvX3ZhbDsKIAlzdGF0ZS0+Z3Bpb19kaXIgPSBjZmctPmdwaW9fZGlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliOTAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjkwMDAuYwppbmRleCBhMDg1NTg4Li42NjBmODA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliOTAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI5MDAwLmMKQEAgLTM4LDYgKzM4LDE1IEBACiAjZGVmaW5lIERpYkluaXRMb2NrKGxvY2spIG11dGV4X2luaXQobG9jaykKICNkZWZpbmUgRGliRnJlZUxvY2sobG9jaykKIAorc3RydWN0IGRpYjkwMDBfcGlkX2N0cmwgeworI2RlZmluZSBESUI5MDAwX1BJRF9GSUxURVJfQ1RSTCAwCisjZGVmaW5lIERJQjkwMDBfUElEX0ZJTFRFUiAgICAgIDEKKwl1OCBjbWQ7CisJdTggaWQ7CisJdTE2IHBpZDsKKwl1OCBvbm9mZjsKK307CisKIHN0cnVjdCBkaWI5MDAwX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2RldmljZSBpMmM7CiAKQEAgLTk5LDYgKzEwOCwxMCBAQAogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKIAl1OCBpMmNfd3JpdGVfYnVmZmVyWzI1NV07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzI1NV07CisJRElCX0xPQ0sgZGVtb2RfbG9jazsKKwl1OCBnZXRfZnJvbnRlbmRfaW50ZXJuYWw7CisJc3RydWN0IGRpYjkwMDBfcGlkX2N0cmwgcGlkX2N0cmxbMTBdOworCXM4IHBpZF9jdHJsX2luZGV4OyAvKiAtMTogZW1wdHkgbGlzdDsgLTI6IGRvIG5vdCB1c2UgdGhlIGxpc3QgKi8KIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgZmVfaW5mb1s0NF0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCkBAIC0xMTY3LDggKzExODAsOCBAQAogCiAJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9tYnhfbG9jayk7CiAJaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKSB7Ci0JCWdvdG8gZXJyb3I7CiAJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0NIQU5ORUxfVU5JT04sCkBAIC0xNzQzLDE5ICsxNzU2LDU2IEBACiBpbnQgZGliOTAwMF9md19waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IG9ub2ZmKQogewogCXN0cnVjdCBkaWI5MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXUxNiB2YWwgPSBkaWI5MDAwX3JlYWRfd29yZChzdGF0ZSwgMjk0ICsgMSkgJiAweGZmZWY7CisJdTE2IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggIT0gLTIpICYmIChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPCA5KSkgeworCQkvKiBwb3N0cG9uZSB0aGUgcGlkIGZpbHRlcmluZyBjbWQgKi8KKwkJZHByaW50aygicGlkIGZpbHRlciBjbWQgcG9zdHBvbmUiKTsKKwkJc3RhdGUtPnBpZF9jdHJsX2luZGV4Kys7CisJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmNtZCA9IERJQjkwMDBfUElEX0ZJTFRFUl9DVFJMOworCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5vbm9mZiA9IG9ub2ZmOworCQlyZXR1cm4gMDsKKwl9CisKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCisJdmFsID0gZGliOTAwMF9yZWFkX3dvcmQoc3RhdGUsIDI5NCArIDEpICYgMHhmZmVmOwogCXZhbCB8PSAob25vZmYgJiAweDEpIDw8IDQ7CiAKIAlkcHJpbnRrKCJQSUQgZmlsdGVyIGVuYWJsZWQgJWQiLCBvbm9mZik7Ci0JcmV0dXJuIGRpYjkwMDBfd3JpdGVfd29yZChzdGF0ZSwgMjk0ICsgMSwgdmFsKTsKKwlyZXQgPSBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDI5NCArIDEsIHZhbCk7CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworCiB9CiBFWFBPUlRfU1lNQk9MKGRpYjkwMDBfZndfcGlkX2ZpbHRlcl9jdHJsKTsKIAogaW50IGRpYjkwMDBfZndfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggaWQsIHUxNiBwaWQsIHU4IG9ub2ZmKQogewogCXN0cnVjdCBkaWI5MDAwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisKKwlpZiAoc3RhdGUtPnBpZF9jdHJsX2luZGV4ICE9IC0yKSB7CisJCS8qIHBvc3Rwb25lIHRoZSBwaWQgZmlsdGVyaW5nIGNtZCAqLworCQlkcHJpbnRrKCJwaWQgZmlsdGVyIHBvc3Rwb25lIik7CisJCWlmIChzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPCA5KSB7CisJCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXgrKzsKKwkJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmNtZCA9IERJQjkwMDBfUElEX0ZJTFRFUjsKKwkJCXN0YXRlLT5waWRfY3RybFtzdGF0ZS0+cGlkX2N0cmxfaW5kZXhdLmlkID0gaWQ7CisJCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5waWQgPSBwaWQ7CisJCQlzdGF0ZS0+cGlkX2N0cmxbc3RhdGUtPnBpZF9jdHJsX2luZGV4XS5vbm9mZiA9IG9ub2ZmOworCQl9IGVsc2UKKwkJCWRwcmludGsoImNhbiBub3QgYWRkIGFueSBtb3JlIHBpZCBjdHJsIGNtZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWRwcmludGsoIkluZGV4ICV4LCBQSUQgJWQsIE9uT2ZmICVkIiwgaWQsIHBpZCwgb25vZmYpOwotCXJldHVybiBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDMwMCArIDEgKyBpZCwgb25vZmYgPyAoMSA8PCAxMykgfCBwaWQgOiAwKTsKKwlyZXQgPSBkaWI5MDAwX3dyaXRlX3dvcmQoc3RhdGUsIDMwMCArIDEgKyBpZCwKKwkJCW9ub2ZmID8gKDEgPDwgMTMpIHwgcGlkIDogMCk7CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChkaWI5MDAwX2Z3X3BpZF9maWx0ZXIpOwogCkBAIC0xNzc4LDYgKzE4MjgsNyBAQAogCURpYkZyZWVMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tYnhfbG9jayk7CiAJRGliRnJlZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9sb2NrKTsKIAlEaWJGcmVlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKKwlEaWJGcmVlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWRpYngwMDBfZXhpdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3Rlcik7CiAKIAlpMmNfZGVsX2FkYXB0ZXIoJnN0LT50dW5lcl9hZGFwKTsKQEAgLTE3OTUsMTQgKzE4NDYsMTkgQEAKIHsKIAlzdHJ1Y3QgZGliOTAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1OCBpbmRleF9mcm9udGVuZDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CiAJCXJldCA9IHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0tPm9wcy5zbGVlcChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdKTsKIAkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBlcnJvcjsKIAl9Ci0JcmV0dXJuIGRpYjkwMDBfbWJ4X3NlbmQoc3RhdGUsIE9VVF9NU0dfRkVfU0xFRVAsIE5VTEwsIDApOworCXJldCA9IGRpYjkwMDBfbWJ4X3NlbmQoc3RhdGUsIE9VVF9NU0dfRkVfU0xFRVAsIE5VTEwsIDApOworCitlcnJvcjoKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGliOTAwMF9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQpAQCAtMTgxNiw3ICsxODcyLDEwIEBACiAJc3RydWN0IGRpYjkwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggaW5kZXhfZnJvbnRlbmQsIHN1Yl9pbmRleF9mcm9udGVuZDsKIAlmZV9zdGF0dXNfdCBzdGF0OwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3RhdGUtPmdldF9mcm9udGVuZF9pbnRlcm5hbCA9PSAwKQorCQlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCiAJZm9yIChpbmRleF9mcm9udGVuZCA9IDE7IChpbmRleF9mcm9udGVuZCA8IE1BWF9OVU1CRVJfT0ZfRlJPTlRFTkRTKSAmJiAoc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSAhPSBOVUxMKTsgaW5kZXhfZnJvbnRlbmQrKykgewogCQlzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLT5vcHMucmVhZF9zdGF0dXMoc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSwgJnN0YXQpOwpAQCAtMTg0NiwxNCArMTkwNSwxNSBAQAogCQkJCQkgICAgc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXS0+ZHR2X3Byb3BlcnR5X2NhY2hlLnJvbGxvZmY7CiAJCQkJfQogCQkJfQotCQkJcmV0dXJuIDA7CisJCQlyZXQgPSAwOworCQkJZ290byByZXR1cm5fdmFsdWU7CiAJCX0KIAl9CiAKIAkvKiBnZXQgdGhlIGNoYW5uZWwgZnJvbSBtYXN0ZXIgY2hpcCAqLwogCXJldCA9IGRpYjkwMDBfZndfZ2V0X2NoYW5uZWwoZmUsIGZlcCk7CiAJaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIHJldHVybl92YWx1ZTsKIAogCS8qIHN5bmNocm9uaXplIHRoZSBjYWNoZSB3aXRoIHRoZSBvdGhlciBmcm9udGVuZHMgKi8KIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CkBAIC0xODY2LDggKzE5MjYsMTIgQEAKIAkJc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXS0+ZHR2X3Byb3BlcnR5X2NhY2hlLmNvZGVfcmF0ZV9MUCA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUuY29kZV9yYXRlX0xQOwogCQlzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLT5kdHZfcHJvcGVydHlfY2FjaGUucm9sbG9mZiA9IGZlLT5kdHZfcHJvcGVydHlfY2FjaGUucm9sbG9mZjsKIAl9CisJcmV0ID0gMDsKIAotCXJldHVybiAwOworcmV0dXJuX3ZhbHVlOgorCWlmIChzdGF0ZS0+Z2V0X2Zyb250ZW5kX2ludGVybmFsID09IDApCisJCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWI5MDAwX3NldF90dW5lX3N0YXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBlbnVtIGZyb250ZW5kX3R1bmVfc3RhdGUgdHVuZV9zdGF0ZSkKQEAgLTE5MTIsNiArMTk3NiwxMCBAQAogCQlkcHJpbnRrKCJkaWI5MDAwOiBtdXN0IHNwZWNpZnkgYmFuZHdpZHRoICIpOwogCQlyZXR1cm4gMDsKIAl9CisKKwlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMTsgLyogcG9zdHBvbmUgdGhlIHBpZCBmaWx0ZXJpbmcgY21kICovCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwogCWZlLT5kdHZfcHJvcGVydHlfY2FjaGUuZGVsaXZlcnlfc3lzdGVtID0gU1lTX0RWQlQ7CiAKIAkvKiBzZXQgdGhlIG1hc3RlciBzdGF0dXMgKi8KQEAgLTE5NzQsMTMgKzIwNDIsMTggQEAKIAkvKiBjaGVjayB0aGUgdHVuZSByZXN1bHQgKi8KIAlpZiAoZXhpdF9jb25kaXRpb24gPT0gMSkgewkvKiB0dW5lIGZhaWxlZCAqLwogCQlkcHJpbnRrKCJ0dW5lIGZhaWxlZCIpOworCQlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCQkvKiB0dW5lIGZhaWxlZDsgcHV0IGFsbCB0aGUgcGlkIGZpbHRlcmluZyBjbWQgdG8ganVuayAqLworCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZHByaW50aygidHVuZSBzdWNjZXNzIG9uIGZyb250ZW5kJWkiLCBpbmRleF9mcm9udGVuZF9zdWNjZXNzKTsKIAogCS8qIHN5bmNocm9uaXplIGFsbCB0aGUgY2hhbm5lbCBjYWNoZSAqLworCXN0YXRlLT5nZXRfZnJvbnRlbmRfaW50ZXJuYWwgPSAxOwogCWRpYjkwMDBfZ2V0X2Zyb250ZW5kKHN0YXRlLT5mZVswXSwgZmVwKTsKKwlzdGF0ZS0+Z2V0X2Zyb250ZW5kX2ludGVybmFsID0gMDsKIAogCS8qIHJldHVuZSB0aGUgb3RoZXIgZnJvbnRlbmRzIHdpdGggdGhlIGZvdW5kIGNoYW5uZWwgKi8KIAljaGFubmVsX3N0YXR1cy5zdGF0dXMgPSBDSEFOTkVMX1NUQVRVU19QQVJBTUVURVJTX1NFVDsKQEAgLTIwMjUsNiArMjA5OCwyOCBAQAogCS8qIHR1cm4gb2ZmIHRoZSBkaXZlcnNpdHkgZm9yIHRoZSBsYXN0IGZyb250ZW5kICovCiAJZGliOTAwMF9md19zZXRfZGl2ZXJzaXR5X2luKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZCAtIDFdLCAwKTsKIAorCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJaWYgKHN0YXRlLT5waWRfY3RybF9pbmRleCA+PSAwKSB7CisJCXU4IGluZGV4X3BpZF9maWx0ZXJfY21kOworCQl1OCBwaWRfY3RybF9pbmRleCA9IHN0YXRlLT5waWRfY3RybF9pbmRleDsKKworCQlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMjsKKwkJZm9yIChpbmRleF9waWRfZmlsdGVyX2NtZCA9IDA7CisJCQkJaW5kZXhfcGlkX2ZpbHRlcl9jbWQgPD0gcGlkX2N0cmxfaW5kZXg7CisJCQkJaW5kZXhfcGlkX2ZpbHRlcl9jbWQrKykgeworCQkJaWYgKHN0YXRlLT5waWRfY3RybFtpbmRleF9waWRfZmlsdGVyX2NtZF0uY21kID09IERJQjkwMDBfUElEX0ZJTFRFUl9DVFJMKQorCQkJCWRpYjkwMDBfZndfcGlkX2ZpbHRlcl9jdHJsKHN0YXRlLT5mZVswXSwKKwkJCQkJCXN0YXRlLT5waWRfY3RybFtpbmRleF9waWRfZmlsdGVyX2NtZF0ub25vZmYpOworCQkJZWxzZSBpZiAoc3RhdGUtPnBpZF9jdHJsW2luZGV4X3BpZF9maWx0ZXJfY21kXS5jbWQgPT0gRElCOTAwMF9QSURfRklMVEVSKQorCQkJCWRpYjkwMDBfZndfcGlkX2ZpbHRlcihzdGF0ZS0+ZmVbMF0sCisJCQkJCQlzdGF0ZS0+cGlkX2N0cmxbaW5kZXhfcGlkX2ZpbHRlcl9jbWRdLmlkLAorCQkJCQkJc3RhdGUtPnBpZF9jdHJsW2luZGV4X3BpZF9maWx0ZXJfY21kXS5waWQsCisJCQkJCQlzdGF0ZS0+cGlkX2N0cmxbaW5kZXhfcGlkX2ZpbHRlcl9jbWRdLm9ub2ZmKTsKKwkJfQorCX0KKwkvKiBkbyBub3QgcG9zdHBvbmUgYW55IG1vcmUgdGhlIHBpZCBmaWx0ZXJpbmcgKi8KKwlzdGF0ZS0+cGlkX2N0cmxfaW5kZXggPSAtMjsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDQxLDYgKzIxMzYsNyBAQAogCXU4IGluZGV4X2Zyb250ZW5kOwogCXUxNiBsb2NrID0gMCwgbG9ja19zbGF2ZSA9IDA7CiAKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCWZvciAoaW5kZXhfZnJvbnRlbmQgPSAxOyAoaW5kZXhfZnJvbnRlbmQgPCBNQVhfTlVNQkVSX09GX0ZST05URU5EUykgJiYgKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0gIT0gTlVMTCk7IGluZGV4X2Zyb250ZW5kKyspCiAJCWxvY2tfc2xhdmUgfD0gZGliOTAwMF9yZWFkX2xvY2soc3RhdGUtPmZlW2luZGV4X2Zyb250ZW5kXSk7CiAKQEAgLTIwNTksNiArMjE1NSw4IEBACiAJaWYgKChsb2NrICYgMHgwMDA4KSB8fCAobG9ja19zbGF2ZSAmIDB4MDAwOCkpCiAJCSpzdGF0IHw9IEZFX0hBU19MT0NLOwogCisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMDY2LDEwICsyMTY0LDE1IEBACiB7CiAJc3RydWN0IGRpYjkwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTE2ICpjOworCWludCByZXQgPSAwOwogCisJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKIAlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKLQlpZiAoZGliOTAwMF9md19tZW1tYnhfc3luYyhzdGF0ZSwgRkVfU1lOQ19DSEFOTkVMKSA8IDApCi0JCXJldHVybiAtRUlPOworCWlmIChkaWI5MDAwX2Z3X21lbW1ieF9zeW5jKHN0YXRlLCBGRV9TWU5DX0NIQU5ORUwpIDwgMCkgeworCQlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0ZFX01PTklUT1IsCiAJCQlzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyLCAxNiAqIDIpOwogCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwpAQCAtMjA3Nyw3ICsyMTgwLDEwIEBACiAJYyA9ICh1MTYgKilzdGF0ZS0+aTJjX3JlYWRfYnVmZmVyOwogCiAJKmJlciA9IGNbMTBdIDw8IDE2IHwgY1sxMV07Ci0JcmV0dXJuIDA7CisKK2Vycm9yOgorCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWI5MDAwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKiBzdHJlbmd0aCkKQEAgLTIwODYsNyArMjE5Miw5IEBACiAJdTggaW5kZXhfZnJvbnRlbmQ7CiAJdTE2ICpjID0gKHUxNiAqKXN0YXRlLT5pMmNfcmVhZF9idWZmZXI7CiAJdTE2IHZhbDsKKwlpbnQgcmV0ID0gMDsKIAorCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CiAJKnN0cmVuZ3RoID0gMDsKIAlmb3IgKGluZGV4X2Zyb250ZW5kID0gMTsgKGluZGV4X2Zyb250ZW5kIDwgTUFYX05VTUJFUl9PRl9GUk9OVEVORFMpICYmIChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdICE9IE5VTEwpOyBpbmRleF9mcm9udGVuZCsrKSB7CiAJCXN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0tPm9wcy5yZWFkX3NpZ25hbF9zdHJlbmd0aChzdGF0ZS0+ZmVbaW5kZXhfZnJvbnRlbmRdLCAmdmFsKTsKQEAgLTIwOTcsOCArMjIwNSwxMCBAQAogCX0KIAogCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwotCWlmIChkaWI5MDAwX2Z3X21lbW1ieF9zeW5jKHN0YXRlLCBGRV9TWU5DX0NIQU5ORUwpIDwgMCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQogCWRpYjkwMDBfcmlzY19tZW1fcmVhZChzdGF0ZSwgRkVfTU1fUl9GRV9NT05JVE9SLCAodTggKikgYywgMTYgKiAyKTsKIAlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPnBsYXRmb3JtLnJpc2MubWVtX21ieF9sb2NrKTsKIApAQCAtMjEwNyw3ICsyMjE3LDEwIEBACiAJCSpzdHJlbmd0aCA9IDY1NTM1OwogCWVsc2UKIAkJKnN0cmVuZ3RoICs9IHZhbDsKLQlyZXR1cm4gMDsKKworZXJyb3I6CisJRGliUmVsZWFzZUxvY2soJnN0YXRlLT5kZW1vZF9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTMyIGRpYjkwMDBfZ2V0X3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKQEAgLTIxNTEsNiArMjI2NCw3IEBACiAJdTggaW5kZXhfZnJvbnRlbmQ7CiAJdTMyIHNucl9tYXN0ZXI7CiAKKwlEaWJBY3F1aXJlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOwogCXNucl9tYXN0ZXIgPSBkaWI5MDAwX2dldF9zbnIoZmUpOwogCWZvciAoaW5kZXhfZnJvbnRlbmQgPSAxOyAoaW5kZXhfZnJvbnRlbmQgPCBNQVhfTlVNQkVSX09GX0ZST05URU5EUykgJiYgKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0gIT0gTlVMTCk7IGluZGV4X2Zyb250ZW5kKyspCiAJCXNucl9tYXN0ZXIgKz0gZGliOTAwMF9nZXRfc25yKHN0YXRlLT5mZVtpbmRleF9mcm9udGVuZF0pOwpAQCAtMjE2MSw2ICsyMjc1LDggQEAKIAl9IGVsc2UKIAkJKnNuciA9IDA7CiAKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNjgsMTUgKzIyODQsMjIgQEAKIHsKIAlzdHJ1Y3QgZGliOTAwMF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAl1MTYgKmMgPSAodTE2ICopc3RhdGUtPmkyY19yZWFkX2J1ZmZlcjsKKwlpbnQgcmV0ID0gMDsKIAorCURpYkFjcXVpcmVMb2NrKCZzdGF0ZS0+ZGVtb2RfbG9jayk7CiAJRGliQWNxdWlyZUxvY2soJnN0YXRlLT5wbGF0Zm9ybS5yaXNjLm1lbV9tYnhfbG9jayk7Ci0JaWYgKGRpYjkwMDBfZndfbWVtbWJ4X3N5bmMoc3RhdGUsIEZFX1NZTkNfQ0hBTk5FTCkgPCAwKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoZGliOTAwMF9md19tZW1tYnhfc3luYyhzdGF0ZSwgRkVfU1lOQ19DSEFOTkVMKSA8IDApIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CiAJZGliOTAwMF9yaXNjX21lbV9yZWFkKHN0YXRlLCBGRV9NTV9SX0ZFX01PTklUT1IsICh1OCAqKSBjLCAxNiAqIDIpOwogCURpYlJlbGVhc2VMb2NrKCZzdGF0ZS0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOwogCiAJKnVuYyA9IGNbMTJdOwotCXJldHVybiAwOworCitlcnJvcjoKKwlEaWJSZWxlYXNlTG9jaygmc3RhdGUtPmRlbW9kX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIGludCBkaWI5MDAwX2kyY19lbnVtZXJhdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IG5vX29mX2RlbW9kcywgdTggZGVmYXVsdF9hZGRyLCB1OCBmaXJzdF9hZGRyKQpAQCAtMjMyMiw2ICsyNDQ1LDEwIEBACiAJRGliSW5pdExvY2soJnN0LT5wbGF0Zm9ybS5yaXNjLm1ieF9sb2NrKTsKIAlEaWJJbml0TG9jaygmc3QtPnBsYXRmb3JtLnJpc2MubWVtX2xvY2spOwogCURpYkluaXRMb2NrKCZzdC0+cGxhdGZvcm0ucmlzYy5tZW1fbWJ4X2xvY2spOworCURpYkluaXRMb2NrKCZzdC0+ZGVtb2RfbG9jayk7CisJc3QtPmdldF9mcm9udGVuZF9pbnRlcm5hbCA9IDA7CisKKwlzdC0+cGlkX2N0cmxfaW5kZXggPSAtMjsKIAogCXN0LT5mZVswXSA9IGZlOwogCWZlLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGlieDAwMF9jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCmluZGV4IGRjNWQxN2EuLjQzYmU3MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5jCkBAIC0xLDQgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJkaWJ4MDAwX2NvbW1vbi5oIgogCkBAIC0xMCw2ICsxMiwxMyBAQAogCiBzdGF0aWMgaW50IGRpYngwMDBfd3JpdGVfd29yZChzdHJ1Y3QgZGlieDAwMF9pMmNfbWFzdGVyICptc3QsIHUxNiByZWcsIHUxNiB2YWwpCiB7CisJaW50IHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltc3QtPmkyY193cml0ZV9idWZmZXJbMF0gPSAocmVnID4+IDgpICYgMHhmZjsKIAltc3QtPmkyY193cml0ZV9idWZmZXJbMV0gPSByZWcgJiAweGZmOwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOwpAQCAtMjEsMTEgKzMwLDIxIEBACiAJbXN0LT5tc2dbMF0uYnVmID0gbXN0LT5pMmNfd3JpdGVfYnVmZmVyOwogCW1zdC0+bXNnWzBdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJcmV0ID0gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7CisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTE2IGRpYngwMDBfcmVhZF93b3JkKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwgdTE2IHJlZykKIHsKKwl1MTYgcmV0OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbXN0LT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAwOworCX0KKwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclswXSA9IHJlZyA+PiA4OwogCW1zdC0+aTJjX3dyaXRlX2J1ZmZlclsxXSA9IHJlZyAmIDB4ZmY7CiAKQEAgLTQyLDcgKzYxLDEwIEBACiAJaWYgKGkyY190cmFuc2Zlcihtc3QtPmkyY19hZGFwLCBtc3QtPm1zZywgMikgIT0gMikKIAkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWQiLCByZWcpOwogCi0JcmV0dXJuIChtc3QtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IG1zdC0+aTJjX3JlYWRfYnVmZmVyWzFdOworCXJldCA9IChtc3QtPmkyY19yZWFkX2J1ZmZlclswXSA8PCA4KSB8IG1zdC0+aTJjX3JlYWRfYnVmZmVyWzFdOworCW11dGV4X3VubG9jaygmbXN0LT5pMmNfYnVmZmVyX2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaWJ4MDAwX2lzX2kyY19kb25lKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCkKQEAgLTI1Nyw2ICsyNzksNyBAQAogCQkJCQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKIHsKIAlzdHJ1Y3QgZGlieDAwMF9pMmNfbWFzdGVyICptc3QgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwlpbnQgcmV0OwogCiAJaWYgKG51bSA+IDMyKSB7CiAJCWRwcmludGsoIiVzOiB0b28gbXVjaCBJMkMgbWVzc2FnZSB0byBiZSB0cmFuc21pdHRlZCAoJWkpLlwKQEAgLTI2NCwxMCArMjg3LDE1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1lbXNldChtc3QtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSAqICgyICsgbnVtKSk7Ci0KIAlkaWJ4MDAwX2kyY19zZWxlY3RfaW50ZXJmYWNlKG1zdCwgRElCWDAwMF9JMkNfSU5URVJGQUNFX0dQSU9fNl83KTsKIAorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKSA8IDApIHsKKwkJZHByaW50aygiY291bGQgbm90IGFjcXVpcmUgbG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQobXN0LT5tc2csIDAsIHNpemVvZihzdHJ1Y3QgaTJjX21zZykgKiAoMiArIG51bSkpOworCiAJLyogb3BlbiB0aGUgZ2F0ZSAqLwogCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsICZtc3QtPmkyY193cml0ZV9idWZmZXJbMF0sIG1zZ1swXS5hZGRyLCAxKTsKIAltc3QtPm1zZ1swXS5hZGRyID0gbXN0LT5pMmNfYWRkcjsKQEAgLTI4Miw3ICszMTAsMTEgQEAKIAltc3QtPm1zZ1tudW0gKyAxXS5idWYgPSAmbXN0LT5pMmNfd3JpdGVfYnVmZmVyWzRdOwogCW1zdC0+bXNnW251bSArIDFdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8gbnVtIDogLUVJTzsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8KKwkJCW51bSA6IC1FSU8pOworCisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGRpYngwMDBfaTJjX2dhdGVkX2dwaW82N19hbGdvID0gewpAQCAtMjk0LDYgKzMyNiw3IEBACiAJCQkJCXN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOworCWludCByZXQ7CiAKIAlpZiAobnVtID4gMzIpIHsKIAkJZHByaW50aygiJXM6IHRvbyBtdWNoIEkyQyBtZXNzYWdlIHRvIGJlIHRyYW5zbWl0dGVkICglaSkuXApAQCAtMzAxLDEwICszMzQsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KG1zdC0+bXNnLCAwLCBzaXplb2Yoc3RydWN0IGkyY19tc2cpICogKDIgKyBudW0pKTsKLQogCWRpYngwMDBfaTJjX3NlbGVjdF9pbnRlcmZhY2UobXN0LCBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIpOwogCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbXN0LT5pMmNfYnVmZmVyX2xvY2spIDwgMCkgeworCQlkcHJpbnRrKCJjb3VsZCBub3QgYWNxdWlyZSBsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZW1zZXQobXN0LT5tc2csIDAsIHNpemVvZihzdHJ1Y3QgaTJjX21zZykgKiAoMiArIG51bSkpOworCiAJLyogb3BlbiB0aGUgZ2F0ZSAqLwogCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsICZtc3QtPmkyY193cml0ZV9idWZmZXJbMF0sIG1zZ1swXS5hZGRyLCAxKTsKIAltc3QtPm1zZ1swXS5hZGRyID0gbXN0LT5pMmNfYWRkcjsKQEAgLTMxOSw3ICszNTYsMTAgQEAKIAltc3QtPm1zZ1tudW0gKyAxXS5idWYgPSAmbXN0LT5pMmNfd3JpdGVfYnVmZmVyWzRdOwogCW1zdC0+bXNnW251bSArIDFdLmxlbiA9IDQ7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8gbnVtIDogLUVJTzsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKG1zdC0+aTJjX2FkYXAsIG1zdC0+bXNnLCAyICsgbnVtKSA9PSAyICsgbnVtID8KKwkJCW51bSA6IC1FSU8pOworCW11dGV4X3VubG9jaygmbXN0LT5pMmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWJ4MDAwX2kyY19nYXRlZF90dW5lcl9hbGdvID0gewpAQCAtMzkwLDggKzQzMCwxOCBAQAogaW50IGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwgdTE2IGRldmljZV9yZXYsCiAJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTggaTJjX2FkZHIpCiB7Ci0JdTggdHhbNF07Ci0Jc3RydWN0IGkyY19tc2cgbSA9IHsuYWRkciA9IGkyY19hZGRyID4+IDEsLmJ1ZiA9IHR4LC5sZW4gPSA0IH07CisJaW50IHJldDsKKworCW11dGV4X2luaXQoJm1zdC0+aTJjX2J1ZmZlcl9sb2NrKTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZtc3QtPmkyY19idWZmZXJfbG9jaykgPCAwKSB7CisJCWRwcmludGsoImNvdWxkIG5vdCBhY3F1aXJlIGxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbXNldChtc3QtPm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CisJbXN0LT5tc2dbMF0uYWRkciA9IGkyY19hZGRyID4+IDE7CisJbXN0LT5tc2dbMF0uZmxhZ3MgPSAwOworCW1zdC0+bXNnWzBdLmJ1ZiA9IG1zdC0+aTJjX3dyaXRlX2J1ZmZlcjsKKwltc3QtPm1zZ1swXS5sZW4gPSA0OwogCiAJbXN0LT5kZXZpY2VfcmV2ID0gZGV2aWNlX3JldjsKIAltc3QtPmkyY19hZGFwID0gaTJjX2FkYXA7CkBAIC00MzEsOSArNDgxLDEyIEBACiAJCQkJIkRpQlgwMDA6IGNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBtYXN0ZXIgaTJjX2FkYXB0ZXJcbiIpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgaTJjLW1hc3RlciBieSBjbG9zaW5nIHRoZSBnYXRlICovCi0JZGlieDAwMF9pMmNfZ2F0ZV9jdHJsKG1zdCwgdHgsIDAsIDApOworCWRpYngwMDBfaTJjX2dhdGVfY3RybChtc3QsIG1zdC0+aTJjX3dyaXRlX2J1ZmZlciwgMCwgMCk7CiAKLQlyZXR1cm4gaTJjX3RyYW5zZmVyKGkyY19hZGFwLCAmbSwgMSkgPT0gMTsKKwlyZXQgPSAoaTJjX3RyYW5zZmVyKGkyY19hZGFwLCBtc3QtPm1zZywgMSkgPT0gMSk7CisJbXV0ZXhfdW5sb2NrKCZtc3QtPmkyY19idWZmZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBFWFBPUlRfU1lNQk9MKGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKaW5kZXggZjAzMTE2NS4uNWUwMTE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMzRdOwogCXU4IGkyY193cml0ZV9idWZmZXJbOF07CiAJdTggaTJjX3JlYWRfYnVmZmVyWzJdOworCXN0cnVjdCBtdXRleCBpMmNfYnVmZmVyX2xvY2s7CiB9OwogCiBleHRlcm4gaW50IGRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKHN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgKm1zdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYwppbmRleCAyMjM4YmYwLi44OGU0NmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jCkBAIC04ODksMTAgKzg4OSwxNSBAQAogCQkJdTMyIFIyID0gc3RhdGUtPmlmX2FnY19jZmcuUjI7CiAJCQl1MzIgUjMgPSBzdGF0ZS0+aWZfYWdjX2NmZy5SMzsKIAotCQkJdTMyIFZtYXggPSAoMzMwMCAqIFIyKSAvIChSMSArIFIyKTsKLQkJCXUzMiBScGFyID0gKFIyICogUjMpIC8gKFIzICsgUjIpOwotCQkJdTMyIFZtaW4gPSAoMzMwMCAqIFJwYXIpIC8gKFIxICsgUnBhcik7Ci0JCQl1MzIgVm91dCA9IFZtaW4gKyAoKFZtYXggLSBWbWluKSAqIFZhbHVlKSAvIDEwMjQ7CisJCQl1MzIgVm1heCwgUnBhciwgVm1pbiwgVm91dDsKKworCQkJaWYgKFIyID09IDAgJiYgKFIxID09IDAgfHwgUjMgPT0gMCkpCisJCQkJcmV0dXJuIDA7CisKKwkJCVZtYXggPSAoMzMwMCAqIFIyKSAvIChSMSArIFIyKTsKKwkJCVJwYXIgPSAoUjIgKiBSMykgLyAoUjMgKyBSMik7CisJCQlWbWluID0gKDMzMDAgKiBScGFyKSAvIChSMSArIFJwYXIpOworCQkJVm91dCA9IFZtaW4gKyAoKFZtYXggLSBWbWluKSAqIFZhbHVlKSAvIDEwMjQ7CiAKIAkJCSpwVmFsdWUgPSBWb3V0OwogCQl9CkBAIC05MjYsMTYgKzkzMSwxNSBAQAogCQkJICAgICBjb25zdCB1OCAqcE1DSW1hZ2UsIHUzMiBMZW5ndGgpCiB7CiAJdTggKnBTcmM7Ci0JdTE2IEZsYWdzOwogCXUzMiBBZGRyZXNzOwogCXUxNiBuQmxvY2tzOwogCXUxNiBCbG9ja1NpemU7Ci0JdTE2IEJsb2NrQ1JDOwogCXUzMiBvZmZzZXQgPSAwOwogCWludCBpLCBzdGF0dXMgPSAwOwogCiAJcFNyYyA9ICh1OCAqKSBwTUNJbWFnZTsKLQlGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwkvKiBXZSdyZSBub3QgdXNpbmcgRmxhZ3MgKi8KKwkvKiBGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsgKi8KIAlwU3JjICs9IHNpemVvZih1MTYpOwogCW9mZnNldCArPSBzaXplb2YodTE2KTsKIAluQmxvY2tzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOwpAQCAtOTUyLDExICs5NTYsMTMgQEAKIAkJcFNyYyArPSBzaXplb2YodTE2KTsKIAkJb2Zmc2V0ICs9IHNpemVvZih1MTYpOwogCi0JCUZsYWdzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCQkvKiBXZSdyZSBub3QgdXNpbmcgRmxhZ3MgKi8KKwkJLyogdTE2IEZsYWdzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOyAqLwogCQlwU3JjICs9IHNpemVvZih1MTYpOwogCQlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CiAKLQkJQmxvY2tDUkMgPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07CisJCS8qIFdlJ3JlIG5vdCB1c2luZyBCbG9ja0NSQyAqLworCQkvKiB1MTYgQmxvY2tDUkMgPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07ICovCiAJCXBTcmMgKz0gc2l6ZW9mKHUxNik7CiAJCW9mZnNldCArPSBzaXplb2YodTE2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jCmluZGV4IDQxYjA4MzguLmY2NDMxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMKQEAgLTYyMTEsNiArNjIxMSwxNCBAQAogCXUzMiBJRjsKIAogCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoIWZlLT5vcHMudHVuZXJfb3BzLmdldF9pZl9mcmVxdWVuY3kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZHJ4azogRXJyb3I6IGdldF9pZl9mcmVxdWVuY3koKSBub3QgZGVmaW5lZCBhdCB0dW5lci4gQ2FuJ3Qgd29yayB3aXRob3V0IGl0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykKQEAgLTYyMTgsNyArNjIyNiw3IEBACiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAlzdGF0ZS0+cGFyYW0gPSAqcDsKLQlmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KGZlLCAmSUYpOworCWZlLT5vcHMudHVuZXJfb3BzLmdldF9pZl9mcmVxdWVuY3koZmUsICZJRik7CiAJU3RhcnQoc3RhdGUsIDAsIElGKTsKIAogCS8qIHByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyBJRj0lZCBkb25lXG4iLCBfX2Z1bmNfXywgSUYpOyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS1wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLXByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZmYjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS1wcml2LmgKQEAgLTAsMCArMSwzMzYgQEAKKworc3RydWN0IGl0OTEzeHNldCB7CXUzMiBwcm87CisJCQl1MzIgYWRkcmVzczsKKwkJCXU4IHJlZ1sxNV07CisJCQl1OCBjb3VudDsKK307CisKK3N0cnVjdCBhZGN0YWJsZSB7CXUzMiBhZGNGcmVxdWVuY3k7CisJCQl1MzIgYmFuZHdpZHRoOworCQkJdTMyIGNvZWZmXzFfMjA0ODsKKwkJCXUzMiBjb2VmZl8xXzQwOTY7CisJCQl1MzIgY29lZmZfMV84MTkxOworCQkJdTMyIGNvZWZmXzFfODE5MjsKKwkJCXUzMiBjb2VmZl8xXzgxOTM7CisJCQl1MzIgY29lZmZfMl8yazsKKwkJCXUzMiBjb2VmZl8yXzRrOworCQkJdTMyIGNvZWZmXzJfOGs7CisJCQl1MTYgYmZzZmN3X2ZmdGlueF9yYXRpbzsKKwkJCXUxNiBmZnRpbnhfYmZzZmN3X3JhdGlvOworfTsKKworLyogY2xvY2sgYW5kIGNvZWZmIHRhYmxlcyBvbmx5IHRhYmxlIDMgaXMgdXNlZCB3aXRoIElUOTEzNyovCisvKiBUT0RPIG90aGVyIHRhYmxlcyByZWxhdGUgQUY5MDM1IG1heSBiZSByZW1vdmVkICovCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjFbXSA9IHsKKwl7CTIwMTU2MjUwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJiOGJhNmUsIDB4MDE1YzVkMzcsIDB4MDBhZTM0MGQsIDB4MDBhZTJlOWIsIDB4MDBhZTI5MmEsCisJCTB4MDE1YzVkMzcsIDB4MDBhZTJlOWIsIDB4MDA1NzE3NGUsIDB4MDJmMSwgMHgwMTVjCX0sCisJewkyMDE1NjI1MCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMmNkOTgwLCAweDAxOTY2Y2MwLCAweDAwY2IzY2JhLCAweDAwY2IzNjYwLCAweDAwY2IzMDA3LAorCQkweDAxOTY2Y2MwLCAweDAwY2IzNjYwLCAweDAwNjU5YjMwLCAweDAyODUsIDB4MDE5Ngl9LAorCXsJMjAxNTYyNTAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwM2EwZjg5MywgMHgwMWQwN2M0OSwgMHgwMGU4NDU2NywgMHgwMGU4M2UyNSwgMHgwMGU4MzZlMywKKwkJMHgwMWQwN2M0OSwgMHgwMGU4M2UyNSwgMHgwMDc0MWYxMiwgMHgwMjM0LCAweDAxZDAJfSwKKwl7CTIwMTU2MjUwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDI0NDliNWMsIDB4MDEyMjRkYWUsIDB4MDA5MTJiNjAsIDB4MDA5MTI2ZDcsIDB4MDA5MTIyNGUsCisJCTB4MDEyMjRkYWUsIDB4MDA5MTI2ZDcsIDB4MDA0ODkzNmIsIDB4MDM4NywgMHgwMTIyCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiMltdID0geworCXsJMjAxODc1MDAsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmI3YTY1NCwgMHgwMTViZDMyYSwgMHgwMGFkZWYwNCwgMHgwMGFkZTk5NSwgMHgwMGFkZTQyNiwKKwkJMHgwMTViZDMyYSwgMHgwMGFkZTk5NSwgMHgwMDU2ZjRjYSwgMHgwMmYyLCAweDAxNWMJfSwKKwl7CTIwMTg3NTAwLCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMyYjk3NjEsIDB4MDE5NWNiYjEsIDB4MDBjYWVjMzAsIDB4MDBjYWU1ZDgsIDB4MDBjYWRmODEsCisJCTB4MDE5NWNiYjEsIDB4MDBjYWU1ZDgsIDB4MDA2NTcyZWMsIDB4MDI4NiwgMHgwMTk2CX0sCisJewkyMDE4NzUwMCwgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOWY4ODZmLCAweDAxY2ZjNDM4LCAweDAwZTdlOTViLCAweDAwZTdlMjFjLCAweDAwZTdkYWRkLAorCQkweDAxY2ZjNDM4LCAweDAwZTdlMjFjLCAweDAwNzNmMTBlLCAweDAyMzUsIDB4MDFkMAl9LAorCXsJMjAxODc1MDAsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjQzYjU0NiwgMHgwMTIxZGFhMywgMHgwMDkwZjFkOSwgMHgwMDkwZWQ1MSwgMHgwMDkwZThjYSwKKwkJMHgwMTIxZGFhMywgMHgwMDkwZWQ1MSwgMHgwMDQ4NzZhOSwgMHgwMzg4LCAweDAxMjIJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjNbXSA9IHsKKwl7CTIwMjUwMDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJiNTgwYWQsIDB4MDE1YWMwNTcsIDB4MDBhZDY1OTcsIDB4MDBhZDYwMmIsIDB4MDBhZDVhYzEsCisJCTB4MDE1YWMwNTcsIDB4MDBhZDYwMmIsIDB4MDA1NmIwMTYsIDB4MDJmNCwgMHgwMTViCX0sCisJewkyMDI1MDAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMjkxNjIwLCAweDAxOTQ4YjEwLCAweDAwY2E0YmRhLCAweDAwY2E0NTg4LCAweDAwY2EzZjM2LAorCQkweDAxOTQ4YjEwLCAweDAwY2E0NTg4LCAweDAwNjUyMmM0LCAweDAyODgsIDB4MDE5NQl9LAorCXsJMjAyNTAwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzljYWI5MiwgMHgwMWNlNTVjOSwgMHgwMGU3MzIxZSwgMHgwMGU3MmFlNCwgMHgwMGU3MjNhYiwKKwkJMHgwMWNlNTVjOSwgMHgwMGU3MmFlNCwgMHgwMDczOTU3MiwgMHgwMjM3LCAweDAxY2UJfSwKKwl7CTIwMjUwMDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDI0MWViM2IsIDB4MDEyMGY1OWUsIDB4MDA5MDdmNTMsIDB4MDA5MDdhY2YsIDB4MDA5MDc2NGIsCisJCTB4MDEyMGY1OWUsIDB4MDA5MDdhY2YsIDB4MDA0ODNkNjcsIDB4MDM4YiwgMHgwMTIxCX0KKworfTsKKworc3RhdGljIHN0cnVjdCBhZGN0YWJsZSB0YWI0W10gPSB7CisJewkyMDU4MzMzMywgQkFORFdJRFRIXzZfTUhaLAorCQkweDAyYWE0NTk4LCAweDAxNTUyMmNjLCAweDAwYWE5NmJiLCAweDAwYWE5MTY2LCAweDAwYWE4YzEyLAorCQkweDAxNTUyMmNjLCAweDAwYWE5MTY2LCAweDAwNTU0OGIzLCAweDAzMDAsIDB4MDE1NQl9LAorCXsJMjA1ODMzMzMsIEJBTkRXSURUSF83X01IWiwKKwkJMHgwMzFiZmJkYywgMHgwMThkZmRlZSwgMHgwMGM3MDUyZiwgMHgwMGM2ZmVmNywgMHgwMGM2ZjhiZiwKKwkJMHgwMThkZmRlZSwgMHgwMGM2ZmVmNywgMHgwMDYzN2Y3YiwgMHgwMjkzLCAweDAxOGUJfSwKKwl7CTIwNTgzMzMzLCBCQU5EV0lEVEhfOF9NSFosCisJCTB4MDM4ZGIyMWYsIDB4MDFjNmQ5MTAsIDB4MDBlMzczYTMsIDB4MDBlMzZjODgsIDB4MDBlMzY1NmQsCisJCTB4MDFjNmQ5MTAsIDB4MDBlMzZjODgsIDB4MDA3MWI2NDQsIDB4MDI0MCwgMHgwMWM3CX0sCisJewkyMDU4MzMzMywgQkFORFdJRFRIXzVfTUhaLAorCQkweDAyMzg4ZjU0LCAweDAxMWM0N2FhLCAweDAwOGUyODQ2LCAweDAwOGUyM2Q1LCAweDAwOGUxZjY0LAorCQkweDAxMWM0N2FhLCAweDAwOGUyM2Q1LCAweDAwNDcxMWVhLCAweDAzOWEsIDB4MDExYwl9CisKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiNVtdID0geworCXsJMjA0MTY2NjcsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmFmZDc2NSwgMHgwMTU3ZWJiMywgMHgwMGFiZmIzOSwgMHgwMGFiZjVkOSwgMHgwMGFiZjA3YSwKKwkJMHgwMTU3ZWJiMywgMHgwMGFiZjVkOSwgMHgwMDU1ZmFlZCwgMHgwMmZhLCAweDAxNTgJfSwKKwl7CTIwNDE2NjY3LCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMyMjdiNGIsIDB4MDE5MTNkYTYsIDB4MDBjOGE1MTgsIDB4MDBjODllZDMsIDB4MDBjODk4OGUsCisJCTB4MDE5MTNkYTYsIDB4MDBjODllZDMsIDB4MDA2NDRmNjksIDB4MDI4ZCwgMHgwMTkxCX0sCisJewkyMDQxNjY2NywgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOTUxZjMyLCAweDAxY2E4Zjk5LCAweDAwZTU0ZWY3LCAweDAwZTU0N2NjLCAweDAwZTU0MGEyLAorCQkweDAxY2E4Zjk5LCAweDAwZTU0N2NjLCAweDAwNzJhM2U2LCAweDAyM2MsIDB4MDFjYgl9LAorCXsJMjA0MTY2NjcsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjNkMzM3ZiwgMHgwMTFlOTljMCwgMHgwMDhmNTE1YSwgMHgwMDhmNGNlMCwgMHgwMDhmNDg2NSwKKwkJMHgwMTFlOTljMCwgMHgwMDhmNGNlMCwgMHgwMDQ3YTY3MCwgMHgwMzkzLCAweDAxMWYJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjZbXSA9IHsKKwl7CTIwNDgwMDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJhZGI2ZGIsIDB4MDE1NmRiNmUsIDB4MDBhYjczMTIsIDB4MDBhYjZkYjcsIDB4MDBhYjY4NWMsCisJCTB4MDE1NmRiNmUsIDB4MDBhYjZkYjcsIDB4MDA1NWI2ZGIsIDB4MDJmZCwgMHgwMTU3CX0sCisJewkyMDQ4MDAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMjAwMDAwLCAweDAxOTAwMDAwLCAweDAwYzgwNjQwLCAweDAwYzgwMDAwLCAweDAwYzdmOWMwLAorCQkweDAxOTAwMDAwLCAweDAwYzgwMDAwLCAweDAwNjQwMDAwLCAweDAyOGYsIDB4MDE5MAl9LAorCXsJMjA0ODAwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzkyNDkyNSwgMHgwMWM5MjQ5MiwgMHgwMGU0OTk2ZSwgMHgwMGU0OTI0OSwgMHgwMGU0OGIyNSwKKwkJMHgwMWM5MjQ5MiwgMHgwMGU0OTI0OSwgMHgwMDcyNDkyNSwgMHgwMjNkLCAweDAxYzkJfSwKKwl7CTIwNDgwMDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDIzYjZkYjcsIDB4MDExZGI2ZGIsIDB4MDA4ZWRmZTUsIDB4MDA4ZWRiNmUsIDB4MDA4ZWQ2ZjcsCisJCTB4MDExZGI2ZGIsIDB4MDA4ZWRiNmUsIDB4MDA0NzZkYjcsIDB4MDM5NiwgMHgwMTFlCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRjdGFibGUgdGFiN1tdID0geworCXsJMjA1MDAwMDAsIEJBTkRXSURUSF82X01IWiwKKwkJMHgwMmFkMGI5OSwgMHgwMTU2ODVjYywgMHgwMGFiNDg0MCwgMHgwMGFiNDJlNiwgMHgwMGFiM2Q4YywKKwkJMHgwMTU2ODVjYywgMHgwMGFiNDJlNiwgMHgwMDU1YTE3MywgMHgwMmZkLCAweDAxNTcJfSwKKwl7CTIwNTAwMDAwLCBCQU5EV0lEVEhfN19NSFosCisJCTB4MDMxZjM4MzIsIDB4MDE4ZjljMTksIDB4MDBjN2Q0NGIsIDB4MDBjN2NlMGMsIDB4MDBjN2M3Y2UsCisJCTB4MDE4ZjljMTksIDB4MDBjN2NlMGMsIDB4MDA2M2U3MDYsIDB4MDI5MCwgMHgwMTkwCX0sCisJewkyMDUwMDAwMCwgQkFORFdJRFRIXzhfTUhaLAorCQkweDAzOTE2NGNiLCAweDAxYzhiMjY2LCAweDAwZTQ2MDU2LCAweDAwZTQ1OTMzLCAweDAwZTQ1MjEwLAorCQkweDAxYzhiMjY2LCAweDAwZTQ1OTMzLCAweDAwNzIyYzk5LCAweDAyM2UsIDB4MDFjOQl9LAorCXsJMjA1MDAwMDAsIEJBTkRXSURUSF81X01IWiwKKwkJMHgwMjNhZGVmZiwgMHgwMTFkNmY4MCwgMHgwMDhlYmMzNiwgMHgwMDhlYjdjMCwgMHgwMDhlYjM0YSwKKwkJMHgwMTFkNmY4MCwgMHgwMDhlYjdjMCwgMHgwMDQ3NWJlMCwgMHgwMzk2LCAweDAxMWQJfQorCit9OworCitzdGF0aWMgc3RydWN0IGFkY3RhYmxlIHRhYjhbXSA9IHsKKwl7CTIwNjI1MDAwLCBCQU5EV0lEVEhfNl9NSFosCisJCTB4MDJhOGU0YmQsIDB4MDE1NDcyNWUsIDB4MDBhYTNlODEsIDB4MDBhYTM5MmYsIDB4MDBhYTMzZGUsCisJCTB4MDE1NDcyNWUsIDB4MDBhYTM5MmYsIDB4MDA1NTFjOTgsIDB4MDMwMiwgMHgwMTU0CX0sCisJewkyMDYyNTAwMCwgQkFORFdJRFRIXzdfTUhaLAorCQkweDAzMWE2MDMyLCAweDAxOGQzMDE5LCAweDAwYzY5ZTQxLCAweDAwYzY5ODBjLCAweDAwYzY5MWQ4LAorCQkweDAxOGQzMDE5LCAweDAwYzY5ODBjLCAweDAwNjM0YzA2LCAweDAyOTQsIDB4MDE4ZAl9LAorCXsJMjA2MjUwMDAsIEJBTkRXSURUSF84X01IWiwKKwkJMHgwMzhiZGJhNiwgMHgwMWM1ZWRkMywgMHgwMGUyZmUwMiwgMHgwMGUyZjZlYSwgMHgwMGUyZWZkMiwKKwkJMHgwMWM1ZWRkMywgMHgwMGUyZjZlYSwgMHgwMDcxN2I3NSwgMHgwMjQyLCAweDAxYzYJfSwKKwl7CTIwNjI1MDAwLCBCQU5EV0lEVEhfNV9NSFosCisJCTB4MDIzNzY5NDgsIDB4MDExYmI0YTQsIDB4MDA4ZGRlYzEsIDB4MDA4ZGRhNTIsIDB4MDA4ZGQ1ZTMsCisJCTB4MDExYmI0YTQsIDB4MDA4ZGRhNTIsIDB4MDA0NmVkMjksIDB4MDM5YywgMHgwMTFjCX0KKworfTsKKworc3RydWN0IHRhYmxlIHsKKwkJdTMyIHh0YWw7CisJCXN0cnVjdCBhZGN0YWJsZSAqdGFibGU7Cit9OworCitzdGF0aWMgc3RydWN0IHRhYmxlIGZlX2Nsb2NrVGFibGVbXSA9IHsKKwkJezEyMDAwMDAwLCB0YWIzfSwJLyogRlBHQSAgICAgKi8KKwkJezE2Mzg0MDAwLCB0YWI2fSwJLyogMTYuMzhNSHogKi8KKwkJezIwNDgwMDAwLCB0YWI2fSwJLyogMjAuNDhNSHogKi8KKwkJezM2MDAwMDAwLCB0YWIzfSwJLyogMzYuMDBNSHogKi8KKwkJezMwMDAwMDAwLCB0YWIxfSwJLyogMzAuMDBNSHogKi8KKwkJezI2MDAwMDAwLCB0YWI0fSwJLyogMjYuMDBNSHogKi8KKwkJezI4MDAwMDAwLCB0YWI1fSwJLyogMjguMDBNSHogKi8KKwkJezMyMDAwMDAwLCB0YWI3fSwJLyogMzIuMDBNSHogKi8KKwkJezM0MDAwMDAwLCB0YWIyfSwJLyogMzQuMDBNSHogKi8KKwkJezI0MDAwMDAwLCB0YWIxfSwJLyogMjQuMDBNSHogKi8KKwkJezIyMDAwMDAwLCB0YWI4fSwJLyogMjIuMDBNSHogKi8KKwkJezEyMDAwMDAwLCB0YWIzfQkvKiAxMi4wME1IeiAqLworfTsKKworLyogZmUgZ2V0ICovCitmZV9jb2RlX3JhdGVfdCBmZV9jb2RlW10gPSB7CisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzVfNiwKKwlGRUNfN184LAorCUZFQ19OT05FLAorfTsKKworZmVfZ3VhcmRfaW50ZXJ2YWxfdCBmZV9naVtdID0geworCUdVQVJEX0lOVEVSVkFMXzFfMzIsCisJR1VBUkRfSU5URVJWQUxfMV8xNiwKKwlHVUFSRF9JTlRFUlZBTF8xXzgsCisJR1VBUkRfSU5URVJWQUxfMV80LAorfTsKKworZmVfaGllcmFyY2h5X3QgZmVfaGlbXSA9IHsKKwlISUVSQVJDSFlfTk9ORSwKKwlISUVSQVJDSFlfMSwKKwlISUVSQVJDSFlfMiwKKwlISUVSQVJDSFlfNCwKK307CisKK2ZlX3RyYW5zbWl0X21vZGVfdCBmZV9tb2RlW10gPSB7CisJVFJBTlNNSVNTSU9OX01PREVfMkssCisJVFJBTlNNSVNTSU9OX01PREVfOEssCisJVFJBTlNNSVNTSU9OX01PREVfNEssCit9OworCitmZV9tb2R1bGF0aW9uX3QgZmVfY29uW10gPSB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzY0LAorfTsKKworLyogU3RhbmRhcmQgZGVtb2R1bGF0b3IgZnVuY3Rpb25zICovCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBzZXRfc29sb19mZVtdID0geworCXtQUk9fTElOSywgRFZCVF9JTlRFTiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0xJTkssIERWQlRfRU5BQkxFLCB7MHgwNX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgTVAySUZfTVBFR19QQVJfTU9ERSwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEhPU1RCX01QRUdfU0VSX01PREUsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBIT1NUQl9NUEVHX1BBUl9NT0RFLCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgRENBX1VQUEVSX0NISVAsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBIT1NUQl9EQ0FfVVBQRVIsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBEQ0FfTE9XRVJfQ0hJUCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEhPU1RCX0RDQV9MT1dFUiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9QTEFUQ0gsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBEQ0FfRlBHQV9MQVRDSCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9TVEFORF9BTE9ORSwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIERDQV9FTkFCTEUsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCBNUDJJRl9NUEVHX1BBUl9NT0RFLCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgQkZTX0ZDVywgezB4MDAsIDB4MDAsIDB4MDB9LCAweDAzfSwKKwl7MHhmZiwgMHgwMDAwLCB7MHgwMH0sIDB4MDB9LCAvKiBUZXJtaW5hdGluZyBFbnRyeSAqLworfTsKKworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpbml0XzFbXSA9IHsKKwl7UFJPX0xJTkssIExPQ0szX09VVCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0xJTkssIFBBRE1JU0NEUlNSLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fTElOSywgUEFETUlTQ0RSMiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIFBBRE1JU0NEUjQsIHsweDAwfSwgMHgwMX0sIC8qIFBvd2VyIHVwICovCisJe1BST19MSU5LLCBQQURNSVNDRFI4LCB7MHgwMH0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0gLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CisKKy8qIC0tLS0tLS0tLUlUOTEzNyAweDM4IHR1bmVyIGluaXQtLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpdDkxMzdfc2V0W10gPSB7CisJe1BST19ETU9ELCAweDAwNDMsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNDYsIHsweDM4fSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNTEsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNWYsIHsweDAwLCAweDAwfSwgMHgwMn0sCisJe1BST19ETU9ELCAweDAwNjgsIHsweDBhfSwgMHgwMX0sCisJe1BST19ETU9ELCAweDAwNzAsIHsweDBhLCAweDA1LCAweDAyfSwgMHgwM30sCisJe1BST19ETU9ELCAweDAwNzUsIHsweDhjLCAweDhjLCAweDhjLCAweGM4LCAweDAxfSwgMHgwNX0sCisJe1BST19ETU9ELCAweDAwN2UsIHsweDA0LCAweDAwfSwgMHgwMn0sCisJe1BST19ETU9ELCAweDAwODEsIHsJMHgwYSwgMHgxMiwgMHgwMiwgMHgwYSwgMHgwMywgMHhjOCwgMHhiOCwKKwkJCQkweGQwLCAweGMzLCAweDAxCX0sIDB4MGF9LAorCXtQUk9fRE1PRCwgMHgwMDhlLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMDkyLCB7MHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIDB4MDV9LAorCXtQUk9fRE1PRCwgMHgwMDk5LCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMDliLCB7MHgzYywgMHgyOH0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMDlmLCB7MHhlMSwgMHhjZn0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGEzLCB7MHgwMSwgMHg1YSwgMHgwMSwgMHgwMX0sIDB4MDR9LAorCXtQUk9fRE1PRCwgMHgwMGE5LCB7MHgwMCwgMHgwMX0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGIwLCB7MHgwMX0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGIzLCB7MHgwMiwgMHgzMn0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGI2LCB7MHgxNH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGMwLCB7MHgxMSwgMHgwMCwgMHgwNX0sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGM0LCB7MHgwMH0sIDB4MDF9LAorCXtQUk9fRE1PRCwgMHgwMGM2LCB7MHgxOSwgMHgwMH0sIDB4MDJ9LAorCXtQUk9fRE1PRCwgMHgwMGNjLCB7MHgyZSwgMHg1MSwgMHgzM30sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGYzLCB7MHgwNSwgMHg4YywgMHg4Y30sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGY4LCB7MHgwMywgMHgwNiwgMHgwNn0sIDB4MDN9LAorCXtQUk9fRE1PRCwgMHgwMGZjLCB7CTB4MDIsIDB4MDIsIDB4MDIsIDB4MDksIDB4NTAsIDB4N2IsIDB4NzcsCisJCQkJMHgwMCwgMHgwMiwgMHhjOCwgMHgwNSwgMHg3Ygl9LCAweDBjfSwKKwl7UFJPX0RNT0QsIDB4MDEwOSwgezB4MDJ9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4MDExNSwgezB4MGEsIDB4MDN9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4MDExYSwgezB4YzgsIDB4N2IsIDB4YmMsIDB4YTB9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4MDEyMiwgezB4MDIsIDB4MTgsIDB4YzN9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4MDEyNywgezB4MDAsIDB4MDd9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4MDEyYSwgezB4NTMsIDB4NTEsIDB4NGUsIDB4NDN9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4MDEzNywgezB4MDEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDZ9LCAweDA1fSwKKwl7UFJPX0RNT0QsIDB4MDEzZCwgezB4MDAsIDB4MDEsIDB4NWIsIDB4Yzh9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjEzMCwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjEzMiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0NCwgezB4MWF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0NiwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0YSwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE0YywgezB4MDAsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE0ZiwgezB4MDR9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE1OCwgezB4N2Z9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE1YSwgezB4MDAsIDB4MDh9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE1ZCwgezB4MDMsIDB4MDV9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE2MywgezB4MDV9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE2NiwgezB4MDEsIDB4NDAsIDB4MGZ9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjE3YSwgezB4MDAsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjE4MywgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjE5ZCwgezB4NDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjFiYywgezB4MzYsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjFjYiwgezB4YTAsIDB4MDF9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjIwNCwgezB4MTB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjIxNCwgezB4MDB9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjI0YywgezB4ODgsIDB4OTUsIDB4OWEsIDB4OTB9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjI1YSwgezB4MDcsIDB4ZTgsIDB4MDMsIDB4YjAsIDB4MDR9LCAweDA1fSwKKwl7UFJPX0RNT0QsIDB4ZjI3MCwgezB4MDEsIDB4MDIsIDB4MDEsIDB4MDJ9LCAweDA0fSwKKwl7UFJPX0RNT0QsIDB4ZjQwZSwgezB4MGEsIDB4NDAsIDB4MDh9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjU1ZiwgezB4MGF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjU2MSwgezB4MTUsIDB4MjB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjVkZiwgezB4ZmIsIDB4MDB9LCAweDAyfSwKKwl7UFJPX0RNT0QsIDB4ZjVlMywgezB4MDksIDB4MDEsIDB4MDF9LCAweDAzfSwKKwl7UFJPX0RNT0QsIDB4ZjVmOCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjVmZCwgezB4MDF9LCAweDAxfSwKKwl7UFJPX0RNT0QsIDB4ZjYwMCwgewkweDA1LCAweDA4LCAweDBiLCAweDBlLCAweDExLCAweDE0LCAweDE3LAorCQkJCTB4MWYJfSwgMHgwOH0sCisJe1BST19ETU9ELCAweGY2MGUsIHsweDAwLCAweDA0LCAweDMyLCAweDEwfSwgMHgwNH0sCisJe1BST19ETU9ELCAweGY3MDcsIHsweGZjLCAweDAwLCAweDM3LCAweDAwfSwgMHgwNH0sCisJe1BST19ETU9ELCAweGY3OGIsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGY4MGYsIHsweDQwLCAweDU0LCAweDVhfSwgMHgwM30sCisJe1BST19ETU9ELCAweGY5MDUsIHsweDAxfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGZiMDYsIHsweDAzfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGZkOGIsIHsweDAwfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfRU4sIHsweDAxfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfT04sIHsweDAxfSwgMHgwMX0sCisJe1BST19MSU5LLCBHUElPSDVfTywgezB4MDB9LCAweDAxfSwKKwl7UFJPX0xJTkssIEdQSU9INV9PLCB7MHgwMX0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0sIC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBpdDkxMzdfdHVuZXJfb2ZmW10gPSB7CisJe1BST19ETU9ELCAweGZiYTgsIHsweDAxfSwgMHgwMX0sIC8qIFR1bmVyIENsb2NrIE9mZiAgKi8KKwl7UFJPX0RNT0QsIDB4ZWM0MCwgezB4MDB9LCAweDAxfSwgLyogUG93ZXIgRG93biBUdW5lciAqLworCXtQUk9fRE1PRCwgMHhlYzAyLCB7MHgzZiwgMHgxZiwgMHgzZiwgMHgzZn0sIDB4MDR9LAorCXtQUk9fRE1PRCwgMHhlYzNmLCB7MHgwMX0sIDB4MDF9LAorCXsweGZmLCAweDAwMDAsIHsweDAwfSwgMHgwMH0sIC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IGl0OTEzeHNldCBzZXRfaXQ5MTM3X3RlbXBsYXRlW10gPSB7CisJe1BST19ETU9ELCAweGVlMDYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNTYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGMsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGQsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGUsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNGYsIHsweDAwfSwgMHgwMX0sCisJe1BST19ETU9ELCAweGVjNTAsIHsweDAwfSwgMHgwMX0sCisJezB4ZmYsIDB4MDAwMCwgezB4MDB9LCAweDAwfSwgLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiZDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pdDkxM3gtZmUuYwpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIGl0OTEzeC1mZSBGcm9udGVuZAorICoKKyAqICB3aXRoIHN1cHBvcnQgZm9yIG9uIGNoaXAgaXQ5MTM3IGludGVncmFsIHR1bmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNYWxjb2xtIFByaWVzdGxleSAodHZib3hzcHlAZ21haWwuY29tKQorICogIElUOTEzNyBDb3B5cmlnaHQgKEMpIElURSBUZWNoIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS49CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgIml0OTEzeC1mZS5oIgorI2luY2x1ZGUgIml0OTEzeC1mZS1wcml2LmgiCisKK3N0YXRpYyBpbnQgaXQ5MTN4X2RlYnVnOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGl0OTEzeF9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gKG9yLWFibGUpKS4iKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBhcmdzLi4uKSBkbyB7IFwKKwlpZiAobGV2ZWwgJiBpdDkxM3hfZGVidWcpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIml0OTEzeC1mZTogIiBhcmdzKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSAgZHByaW50aygweDAxLCBhcmdzKQorI2RlZmluZSBkZWJ1Z19kYXRhX3NuaXBldChsZXZlbCwgbmFtZSwgcCkgXAorCSAgZHByaW50ayhsZXZlbCwgbmFtZSIgKCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4KSIsIFwKKwkJKnAsICoocCsxKSwgKihwKzIpLCAqKHArMyksICoocCs0KSwgXAorCQkJKihwKzUpLCAqKHArNiksICoocCs3KSk7CisKK3N0cnVjdCBpdDkxM3hfZmVfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKKwl1OCBpMmNfYWRkcjsKKwl1MzIgZnJlcXVlbmN5OworCXU4IGFkZjsKKwl1MzIgY3J5c3RhbEZyZXF1ZW5jeTsKKwl1MzIgYWRjRnJlcXVlbmN5OworCXU4IHR1bmVyX3R5cGU7CisJc3RydWN0IGFkY3RhYmxlICp0YWJsZTsKKwlmZV9zdGF0dXNfdCBpdDkxM3hfc3RhdHVzOworCXUxNiB0dW5feHRhbDsKKwl1OCB0dW5fZmRpdjsKKwl1OCB0dW5fY2xrX21vZGU7CisJdTMyIHR1bl9mbl9taW47Cit9OworCitzdGF0aWMgaW50IGl0OTEzeF9yZWFkX3JlZyhzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJdTMyIHJlZywgdTggKmRhdGEsIHU4IGNvdW50KQoreworCWludCByZXQ7CisJdTggcHJvID0gUFJPX0RNT0Q7IC8qIEFsbCByZWFkcyBmcm9tIGRlbW9kdWxhdG9yICovCisJdTggYls0XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsgLmFkZHIgPSBzdGF0ZS0+aTJjX2FkZHIgKyAocHJvIDw8IDEpLCAuZmxhZ3MgPSAwLAorCQkJLmJ1ZiA9IGIsIC5sZW4gPSBzaXplb2YoYikgfSwKKwkJeyAuYWRkciA9IHN0YXRlLT5pMmNfYWRkciArIChwcm8gPDwgMSksIC5mbGFncyA9IEkyQ19NX1JELAorCQkJLmJ1ZiA9IGRhdGEsIC5sZW4gPSBjb3VudCB9CisJfTsKKwliWzBdID0gKHU4KSByZWcgPj4gMjQ7CisJYlsxXSA9ICh1OCkocmVnID4+IDE2KSAmIDB4ZmY7CisJYlsyXSA9ICh1OCkocmVnID4+IDgpICYgMHhmZjsKKwliWzNdID0gKHU4KSByZWcgJiAweGZmOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgbXNnLCAyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X3JlYWRfcmVnX3U4KHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlLCB1MzIgcmVnKQoreworCWludCByZXQ7CisJdTggYlsxXTsKKwlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIHJlZywgJmJbMF0sIHNpemVvZihiKSk7CisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiBiWzBdOworfQorCitzdGF0aWMgaW50IGl0OTEzeF93cml0ZShzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJdTggcHJvLCB1MzIgcmVnLCB1OCBidWZbXSwgdTggY291bnQpCit7CisJdTggYlsyNTZdOworCXN0cnVjdCBpMmNfbXNnIG1zZ1sxXSA9IHsKKwkJeyAuYWRkciA9IHN0YXRlLT5pMmNfYWRkciArIChwcm8gPDwgMSksIC5mbGFncyA9IDAsCisJCSAgLmJ1ZiA9IGIsIC5sZW4gPSBjb3VudCArIDQgfQorCX07CisJaW50IHJldDsKKworCWJbMF0gPSAodTgpIHJlZyA+PiAyNDsKKwliWzFdID0gKHU4KShyZWcgPj4gMTYpICYgMHhmZjsKKwliWzJdID0gKHU4KShyZWcgPj4gOCkgJiAweGZmOworCWJbM10gPSAodTgpIHJlZyAmIDB4ZmY7CisJbWVtY3B5KCZiWzRdLCBidWYsIGNvdW50KTsKKworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIG1zZywgMSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfd3JpdGVfcmVnKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlLAorCQl1OCBwcm8sIHUzMiByZWcsIHUzMiBkYXRhKQoreworCWludCByZXQ7CisJdTggYls0XTsKKwl1OCBzOworCisJYlswXSA9IGRhdGEgPj4gMjQ7CisJYlsxXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisJYlsyXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwliWzNdID0gZGF0YSAmIDB4ZmY7CisJLyogZXhwYW5kIHdyaXRlIGFzIG5lZWRlZCAqLworCWlmIChkYXRhIDwgMHgxMDApCisJCXMgPSAzOworCWVsc2UgaWYgKGRhdGEgPCAweDEwMDApCisJCXMgPSAyOworCWVsc2UgaWYgKGRhdGEgPCAweDEwMDAwMCkKKwkJcyA9IDE7CisJZWxzZQorCQlzID0gMDsKKworCXJldCA9IGl0OTEzeF93cml0ZShzdGF0ZSwgcHJvLCByZWcsICZiW3NdLCBzaXplb2YoYikgLSBzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUsCisJCXN0cnVjdCBpdDkxM3hzZXQgKmxvYWRzY3JpcHQpCit7CisJaW50IHJldCwgaTsKKwlpZiAobG9hZHNjcmlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKwkJaWYgKGxvYWRzY3JpcHRbaV0ucHJvID09IDB4ZmYpCisJCQlicmVhazsKKwkJcmV0ID0gaXQ5MTN4X3dyaXRlKHN0YXRlLCBsb2Fkc2NyaXB0W2ldLnBybywKKwkJCWxvYWRzY3JpcHRbaV0uYWRkcmVzcywKKwkJCWxvYWRzY3JpcHRbaV0ucmVnLCBsb2Fkc2NyaXB0W2ldLmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2luaXRfdHVuZXIoc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHJldCwgaSwgcmVnOworCXU4IHZhbCwgbnZfdmFsOworCXU4IG52W10gPSB7NDgsIDMyLCAyNCwgMTYsIDEyLCA4LCA2LCA0LCAyfTsKKwl1OCBiWzJdOworCisJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVjODYpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSAwOgorCQlzdGF0ZS0+dHVuX2Nsa19tb2RlID0gcmVnOworCQlzdGF0ZS0+dHVuX3h0YWwgPSAyMDAwOworCQlzdGF0ZS0+dHVuX2ZkaXYgPSAzOworCQl2YWwgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAtRU5PREVWOgorCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJc3RhdGUtPnR1bl9jbGtfbW9kZSA9IHJlZzsKKwkJc3RhdGUtPnR1bl94dGFsID0gNjQwOworCQlzdGF0ZS0+dHVuX2ZkaXYgPSAxOworCQl2YWwgPSA2OworCQlicmVhazsKKwl9CisKKwlyZWcgPSBpdDkxM3hfcmVhZF9yZWdfdTgoc3RhdGUsIDB4ZWQwMyk7CisKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAocmVnIDwgc2l6ZW9mKG52KSkKKwkJbnZfdmFsID0gbnZbcmVnXTsKKwllbHNlCisJCW52X3ZhbCA9IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIDB4ZWQyMywgJmJbMF0sIHNpemVvZihiKSk7CisJCXJlZyA9IChiWzFdIDw8IDgpICsgYlswXTsKKwkJaWYgKHJlZyA+IDApCisJCQlicmVhazsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJdWRlbGF5KDIwMDApOworCX0KKwlzdGF0ZS0+dHVuX2ZuX21pbiA9IHN0YXRlLT50dW5feHRhbCAqIHJlZzsKKwlzdGF0ZS0+dHVuX2ZuX21pbiAvPSAoc3RhdGUtPnR1bl9mZGl2ICogbnZfdmFsKTsKKwlkZWJfaW5mbygiVHVuZXIgZm5fbWluICVkIiwgc3RhdGUtPnR1bl9mbl9taW4pOworCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKKwkJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVjODIpOworCQlpZiAocmVnID4gMCkKKwkJCWJyZWFrOworCQlpZiAocmVnIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQl1ZGVsYXkoMjAwMCk7CisJfQorCisJcmV0dXJuIGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCAweGVkODEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTM3X3NldF90dW5lcihzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJZW51bSBmZV9iYW5kd2lkdGggYmFuZHdpZHRoLCB1MzIgZnJlcXVlbmN5X20pCit7CisJc3RydWN0IGl0OTEzeHNldCAqc2V0X3R1bmVyID0gc2V0X2l0OTEzN190ZW1wbGF0ZTsKKwlpbnQgcmV0LCByZWc7CisJdTMyIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeV9tIC8gMTAwMDsKKwl1MzIgZnJlcSwgdGVtcF9mLCB0bXA7CisJdTE2IGlxaWtfbV9jYWw7CisJdTE2IG5fZGl2OworCXU4IG47CisJdTggbF9iYW5kOworCXU4IGxuYV9iYW5kOworCXU4IGJ3OworCisJZGViX2luZm8oIlR1bmVyIEZyZXF1ZW5jeSAlZCBCYW5kd2lkdGggJWQiLCBmcmVxdWVuY3ksIGJhbmR3aWR0aCk7CisKKwlpZiAoZnJlcXVlbmN5ID49IDUxMDAwICYmIGZyZXF1ZW5jeSA8PSA0NDAwMDApIHsKKwkJbF9iYW5kID0gMDsKKwkJbG5hX2JhbmQgPSAwOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNDQwMDAwICYmIGZyZXF1ZW5jeSA8PSA0ODQwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAxOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNDg0MDAwICYmIGZyZXF1ZW5jeSA8PSA1MzMwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAyOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNTMzMDAwICYmIGZyZXF1ZW5jeSA8PSA1ODcwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSAzOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNTg3MDAwICYmIGZyZXF1ZW5jeSA8PSA2NDUwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA0OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNjQ1MDAwICYmIGZyZXF1ZW5jeSA8PSA3MTAwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA1OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzEwMDAwICYmIGZyZXF1ZW5jeSA8PSA3ODIwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA2OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzgyMDAwICYmIGZyZXF1ZW5jeSA8PSA4NjAwMDApIHsKKwkJbF9iYW5kID0gMTsKKwkJbG5hX2JhbmQgPSA3OworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gMTQ1MDAwMCAmJiBmcmVxdWVuY3kgPD0gMTQ5MjAwMCkgeworCQlsX2JhbmQgPSAxOworCQlsbmFfYmFuZCA9IDA7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAxNjYwMDAwICYmIGZyZXF1ZW5jeSA8PSAxNjg1MDAwKSB7CisJCWxfYmFuZCA9IDE7CisJCWxuYV9iYW5kID0gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2V0X3R1bmVyWzBdLnJlZ1swXSA9IGxuYV9iYW5kOworCisJaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNV9NSFopCisJCWJ3ID0gMDsKKwllbHNlIGlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzZfTUhaKQorCQlidyA9IDI7CisJZWxzZSBpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF83X01IWikKKwkJYncgPSA0OworCWVsc2UgaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopCisJCWJ3ID0gNjsKKwllbHNlCisJCWJ3ID0gNjsKKworCXNldF90dW5lclsxXS5yZWdbMF0gPSBidzsKKwlzZXRfdHVuZXJbMl0ucmVnWzBdID0gMHhhMCB8IChsX2JhbmQgPDwgMyk7CisKKwlpZiAoZnJlcXVlbmN5ID4gNTMwMDAgJiYgZnJlcXVlbmN5IDw9IDc0MDAwKSB7CisJCW5fZGl2ID0gNDg7CisJCW4gPSAwOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gNzQwMDAgJiYgZnJlcXVlbmN5IDw9IDExMTAwMCkgeworCQluX2RpdiA9IDMyOworCQluID0gMTsKKwl9IGVsc2UgaWYgKGZyZXF1ZW5jeSA+IDExMTAwMCAmJiBmcmVxdWVuY3kgPD0gMTQ4MDAwKSB7CisJCW5fZGl2ID0gMjQ7CisJCW4gPSAyOworCX0gZWxzZSBpZiAoZnJlcXVlbmN5ID4gMTQ4MDAwICYmIGZyZXF1ZW5jeSA8PSAyMjIwMDApIHsKKwkJbl9kaXYgPSAxNjsKKwkJbiA9IDM7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAyMjIwMDAgJiYgZnJlcXVlbmN5IDw9IDI5NjAwMCkgeworCQluX2RpdiA9IDEyOworCQluID0gNDsKKwl9IGVsc2UgaWYgKGZyZXF1ZW5jeSA+IDI5NjAwMCAmJiBmcmVxdWVuY3kgPD0gNDQ1MDAwKSB7CisJCW5fZGl2ID0gODsKKwkJbiA9IDU7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiA0NDUwMDAgJiYgZnJlcXVlbmN5IDw9IHN0YXRlLT50dW5fZm5fbWluKSB7CisJCW5fZGl2ID0gNjsKKwkJbiA9IDY7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiBzdGF0ZS0+dHVuX2ZuX21pbiAmJiBmcmVxdWVuY3kgPD0gOTUwMDAwKSB7CisJCW5fZGl2ID0gNDsKKwkJbiA9IDc7CisJfSBlbHNlIGlmIChmcmVxdWVuY3kgPiAxNDUwMDAwICYmIGZyZXF1ZW5jeSA8PSAxNjgwMDAwKSB7CisJCW5fZGl2ID0gMjsKKwkJbiA9IDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCAweGVkODEpOworCWlxaWtfbV9jYWwgPSAodTE2KXJlZyAqIG5fZGl2OworCisJaWYgKHJlZyA8IDB4MjApIHsKKwkJaWYgKHN0YXRlLT50dW5fY2xrX21vZGUgPT0gMCkKKwkJCWlxaWtfbV9jYWwgPSAoaXFpa19tX2NhbCAqIDkpID4+IDU7CisJCWVsc2UKKwkJCWlxaWtfbV9jYWwgPj49IDE7CisJfSBlbHNlIHsKKwkJaXFpa19tX2NhbCA9IDB4NDAgLSBpcWlrX21fY2FsOworCQlpZiAoc3RhdGUtPnR1bl9jbGtfbW9kZSA9PSAwKQorCQkJaXFpa19tX2NhbCA9IH4oKGlxaWtfbV9jYWwgKiA5KSA+PiA1KTsKKwkJZWxzZQorCQkJaXFpa19tX2NhbCA9IH4oaXFpa19tX2NhbCA+PiAxKTsKKwl9CisKKwl0ZW1wX2YgPSBmcmVxdWVuY3kgKiAodTMyKW5fZGl2ICogKHUzMilzdGF0ZS0+dHVuX2ZkaXY7CisJZnJlcSA9IHRlbXBfZiAvIHN0YXRlLT50dW5feHRhbDsKKwl0bXAgPSBmcmVxICogc3RhdGUtPnR1bl94dGFsOworCisJaWYgKCh0ZW1wX2YgLSB0bXApID49IChzdGF0ZS0+dHVuX3h0YWwgPj4gMSkpCisJCWZyZXErKzsKKworCWZyZXEgKz0gKHUzMikgbiA8PCAxMzsKKwkvKiBGcmVxdWVuY3kgT01FR0FfSVFJS19NX0NBTF9NSUQqLworCXRlbXBfZiA9IGZyZXEgKyAodTMyKWlxaWtfbV9jYWw7CisKKwlzZXRfdHVuZXJbM10ucmVnWzBdID0gIHRlbXBfZiAmIDB4ZmY7CisJc2V0X3R1bmVyWzRdLnJlZ1swXSA9ICAodGVtcF9mID4+IDgpICYgMHhmZjsKKworCWRlYl9pbmZvKCJIaWdoIEZyZXF1ZW5jeSA9ICUwNHgiLCB0ZW1wX2YpOworCisJLyogTG93ZXIgZnJlcXVlbmN5ICovCisJc2V0X3R1bmVyWzVdLnJlZ1swXSA9ICBmcmVxICYgMHhmZjsKKwlzZXRfdHVuZXJbNl0ucmVnWzBdID0gIChmcmVxID4+IDgpICYgMHhmZjsKKworCWRlYl9pbmZvKCJsb3cgRnJlcXVlbmN5ID0gJTA0eCIsIGZyZXEpOworCisJcmV0ID0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIHNldF90dW5lcik7CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX3NlbGVjdF9idyhzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSwKKwkJCWVudW0gZmVfYmFuZHdpZHRoIGJhbmR3aWR0aCwgdTMyIGFkY0ZyZXF1ZW5jeSkKK3sKKwlpbnQgcmV0LCBpOworCXU4IGJ1ZmZlclsyNTZdOworCXUzMiBjb2VmZls4XTsKKwl1MTYgYmZzZmN3X2ZmdGlueF9yYXRpbzsKKwl1MTYgZmZ0aW54X2Jmc2Zjd19yYXRpbzsKKwl1OCBjb3VudDsKKwl1OCBidzsKKwl1OCBhZGNtdWx0aXBsaWVyOworCisJZGViX2luZm8oIkJhbmR3aWR0aCAlZCBBZGMgJWQiLCBiYW5kd2lkdGgsIGFkY0ZyZXF1ZW5jeSk7CisKKwlpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF81X01IWikKKwkJYncgPSAzOworCWVsc2UgaWYgKGJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfNl9NSFopCisJCWJ3ID0gMDsKKwllbHNlIGlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzdfTUhaKQorCQlidyA9IDE7CisJZWxzZSBpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYncgPSAyOworCWVsc2UKKwkJYncgPSAyOworCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFJFR19CVywgYncpOworCisJaWYgKHN0YXRlLT50YWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEluIHdyaXRlIG9yZGVyICovCisJY29lZmZbMF0gPSBzdGF0ZS0+dGFibGVbYnddLmNvZWZmXzFfMjA0ODsKKwljb2VmZlsxXSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMl8yazsKKwljb2VmZlsyXSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMV84MTkxOworCWNvZWZmWzNdID0gc3RhdGUtPnRhYmxlW2J3XS5jb2VmZl8xXzgxOTI7CisJY29lZmZbNF0gPSBzdGF0ZS0+dGFibGVbYnddLmNvZWZmXzFfODE5MzsKKwljb2VmZls1XSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMl84azsKKwljb2VmZls2XSA9IHN0YXRlLT50YWJsZVtid10uY29lZmZfMV80MDk2OworCWNvZWZmWzddID0gc3RhdGUtPnRhYmxlW2J3XS5jb2VmZl8yXzRrOworCWJmc2Zjd19mZnRpbnhfcmF0aW8gPSBzdGF0ZS0+dGFibGVbYnddLmJmc2Zjd19mZnRpbnhfcmF0aW87CisJZmZ0aW54X2Jmc2Zjd19yYXRpbyA9IHN0YXRlLT50YWJsZVtid10uZmZ0aW54X2Jmc2Zjd19yYXRpbzsKKworCS8qIEFEQyBtdWx0aXBsaWVyICovCisJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBBRENfWF8yKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGNtdWx0aXBsaWVyID0gcmV0OworCisJY291bnQgPSAwOworCisJLyogIEJ1aWxkIEJ1ZmZlciBmb3IgQ09FRkYgUmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoYWRjbXVsdGlwbGllciA9PSAxKQorCQkJY29lZmZbaV0gLz0gMjsKKwkJYnVmZmVyW2NvdW50KytdID0gKGNvZWZmW2ldID4+IDI0KSAmIDB4MzsKKwkJYnVmZmVyW2NvdW50KytdID0gKGNvZWZmW2ldID4+IDE2KSAmIDB4ZmY7CisJCWJ1ZmZlcltjb3VudCsrXSA9IChjb2VmZltpXSA+PiA4KSAmIDB4ZmY7CisJCWJ1ZmZlcltjb3VudCsrXSA9IGNvZWZmW2ldICYgMHhmZjsKKwl9CisKKwkvKiBiZnNmY3dfZmZ0aW54X3JhdGlvIHJlZ2lzdGVyIDB4MjEtMHgyMiAqLworCWJ1ZmZlcltjb3VudCsrXSA9IGJmc2Zjd19mZnRpbnhfcmF0aW8gJiAweGZmOworCWJ1ZmZlcltjb3VudCsrXSA9IChiZnNmY3dfZmZ0aW54X3JhdGlvID4+IDgpICYgMHhmZjsKKwkvKiBmZnRpbnhfYmZzZmN3X3JhdGlvIHJlZ2lzdGVyIDB4MjMtMHgyNCAqLworCWJ1ZmZlcltjb3VudCsrXSA9IGZmdGlueF9iZnNmY3dfcmF0aW8gJiAweGZmOworCWJ1ZmZlcltjb3VudCsrXSA9IChmZnRpbnhfYmZzZmN3X3JhdGlvID4+IDgpICYgMHhmZjsKKwkvKiBzdGFydCBhdCBDT0VGRl8xXzIwNDggYW5kIHdyaXRlIHRocm91Z2ggdG8gZmZ0aW54X2Jmc2Zjd19yYXRpbyovCisJcmV0ID0gaXQ5MTN4X3dyaXRlKHN0YXRlLCBQUk9fRE1PRCwgQ09FRkZfMV8yMDQ4LCBidWZmZXIsIGNvdW50KTsKKworCWZvciAoaSA9IDA7IGkgPCA0MjsgaSArPSA4KQorCQlkZWJ1Z19kYXRhX3NuaXBldCgweDEsICJCdWZmZXIiLCAmYnVmZmVyW2ldKTsKKworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgaW50IGl0OTEzeF9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQsIGk7CisJZmVfc3RhdHVzX3Qgb2xkX3N0YXR1cyA9IHN0YXRlLT5pdDkxM3hfc3RhdHVzOworCSpzdGF0dXMgPSAwOworCisJaWYgKHN0YXRlLT5pdDkxM3hfc3RhdHVzID09IDApIHsKKwkJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBFTVBUWV9DSEFOTkVMX1NUQVRVUyk7CisJCWlmIChyZXQgPT0gMHgxKSB7CisJCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQkJCXJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgTVAySUZfU1lOQ19MSyk7CisJCQkJaWYgKHJldCA9PSAweDEpCisJCQkJCWJyZWFrOworCQkJCW1zbGVlcCgyNSk7CisJCQl9CisJCQlpZiAocmV0ID09IDB4MSkKKwkJCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSCisJCQkJCXwgRkVfSEFTX1ZJVEVSQkkKKwkJCQkJfCBGRV9IQVNfU1lOQzsKKwkJCXN0YXRlLT5pdDkxM3hfc3RhdHVzID0gKnN0YXR1czsKKwkJfQorCX0KKworCWlmIChzdGF0ZS0+aXQ5MTN4X3N0YXR1cyAmIEZFX0hBU19TWU5DKSB7CisJCXJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgVFBTRF9MT0NLKTsKKwkJaWYgKHJldCA9PSAweDEpCisJCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLCisJCQkJfCBzdGF0ZS0+aXQ5MTN4X3N0YXR1czsKKwkJZWxzZQorCQkJc3RhdGUtPml0OTEzeF9zdGF0dXMgPSAwOworCQlpZiAob2xkX3N0YXR1cyAhPSBzdGF0ZS0+aXQ5MTN4X3N0YXR1cykKKwkJCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19MSU5LLCBHUElPSDNfTywgcmV0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCXUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gaXQ5MTN4X3JlYWRfcmVnX3U4KHN0YXRlLCBTSUdOQUxfTEVWRUwpOworCS8qU0lHTkFMX0xFVkVMIGFsd2F5cyByZXR1cm5zIDEwMCUhIHNvIHVzaW5nIEZFX0hBU19TSUdOQUwgYXMgc3dpdGNoKi8KKwlpZiAoc3RhdGUtPml0OTEzeF9zdGF0dXMgJiBGRV9IQVNfU0lHTkFMKQorCQlyZXQgPSAocmV0ICogMHhmZikgLyAweDY0OworCWVsc2UKKwkJcmV0ID0gMHgwOworCXJldCB8PSByZXQgPDwgMHg4OworCSpzdHJlbmd0aCA9IHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiogc25yKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgU0lHTkFMX1FVQUxJVFkpOworCXJldCA9IChyZXQgKiAweGZmKSAvIDB4NjQ7CisJcmV0IHw9IChyZXQgPDwgMHg4KTsKKwkqc25yID0gfnJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdDkxM3hfZmVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVjYmxvY2tzKQoreworCSp1Y2Jsb2NrcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXQ5MTN4X2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggcmVnWzhdOworCisJcmV0ID0gaXQ5MTN4X3JlYWRfcmVnKHN0YXRlLCBSRUdfVFBTRF9UWF9NT0RFLCByZWcsIHNpemVvZihyZWcpKTsKKworCWlmIChyZWdbM10gPCAzKQorCQlwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IGZlX2NvbltyZWdbM11dOworCisJaWYgKHJlZ1swXSA8IDMpCisJCXAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9IGZlX21vZGVbcmVnWzBdXTsKKworCWlmIChyZWdbMV0gPCA0KQorCQlwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBmZV9naVtyZWdbMV1dOworCisJaWYgKHJlZ1syXSA8IDQpCisJCXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBmZV9oaVtyZWdbMl1dOworCisJcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9IChyZWdbNl0gPCA2KSA/IGZlX2NvZGVbcmVnWzZdXSA6IEZFQ19OT05FOworCXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSAocmVnWzddIDwgNikgPyBmZV9jb2RlW3JlZ1s3XV0gOiBGRUNfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0LCBpOworCXU4IGVtcHR5X2NoLCBsYXN0X2NoOworCisJc3RhdGUtPml0OTEzeF9zdGF0dXMgPSAwOworCisJLyogU2V0IGJ3Ki8KKwlyZXQgPSBpdDkxM3hfZmVfc2VsZWN0X2J3KHN0YXRlLCBwLT51Lm9mZG0uYmFuZHdpZHRoLAorCQlzdGF0ZS0+YWRjRnJlcXVlbmN5KTsKKworCS8qIFRyYWluaW5nIE1vZGUgT2ZmICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0xJTkssIFRSQUlOSU5HX01PREUsIDB4MCk7CisKKwkvKiBDbGVhciBFbXB0eSBDaGFubmVsICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIEVNUFRZX0NIQU5ORUxfU1RBVFVTLCAweDApOworCisJLyogQ2xlYXIgYml0cyAqLworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCBNUDJJRl9TWU5DX0xLLCAweDApOworCS8qIExFRCBvbiAqLworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19MSU5LLCBHUElPSDNfTywgMHgxKTsKKwkvKiBTZWxlY3QgQmFuZCovCisJaWYgKChwLT5mcmVxdWVuY3kgPj0gNTEwMDAwMDApICYmIChwLT5mcmVxdWVuY3kgPD0gMjMwMDAwMDAwKSkKKwkJaSA9IDA7CisJZWxzZSBpZiAoKHAtPmZyZXF1ZW5jeSA+PSAzNTAwMDAwMDApICYmIChwLT5mcmVxdWVuY3kgPD0gOTAwMDAwMDAwKSkKKwkJCWkgPSAxOworCWVsc2UgaWYgKChwLT5mcmVxdWVuY3kgPj0gMTQ1MDAwMDAwMCkgJiYgKHAtPmZyZXF1ZW5jeSA8PSAxNjgwMDAwMDAwKSkKKwkJCWkgPSAyOworCQllbHNlCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgRlJFRV9CQU5ELCBpKTsKKworCWRlYl9pbmZvKCJGcm9udGVuZCBTZXQgVHVuZXIgVHlwZSAlMDJ4Iiwgc3RhdGUtPnR1bmVyX3R5cGUpOworCXN3aXRjaCAoc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwljYXNlIElUOTEzNzogLyogVHVuZXIgdHlwZSAweDM4ICovCisJCXJldCA9IGl0OTEzN19zZXRfdHVuZXIoc3RhdGUsCisJCQlwLT51Lm9mZG0uYmFuZHdpZHRoLCBwLT5mcmVxdWVuY3kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCX0KKwkJYnJlYWs7CisJfQorCS8qIExFRCBvZmYgKi8KKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MCk7CisJLyogVHJpZ2dlciBvZnNtICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFRSSUdHRVJfT0ZTTSwgMHgwKTsKKwlsYXN0X2NoID0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgNDA7ICsraSkgeworCQllbXB0eV9jaCA9IGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgRU1QVFlfQ0hBTk5FTF9TVEFUVVMpOworCQlpZiAobGFzdF9jaCA9PSAxICYmIGVtcHR5X2NoID09IDEpCisJCQlicmVhazsKKwkJaWYgKGxhc3RfY2ggPT0gMiAmJiBlbXB0eV9jaCA9PSAyKQorCQkJcmV0dXJuIDA7CisJCWxhc3RfY2ggPSBlbXB0eV9jaDsKKwkJbXNsZWVwKDI1KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDQwOyArK2kpIHsKKwkJaWYgKGl0OTEzeF9yZWFkX3JlZ191OChzdGF0ZSwgRF9UUFNEX0xPQ0spID09IDEpCisJCQlicmVhazsKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlzdGF0ZS0+ZnJlcXVlbmN5ID0gcC0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zdXNwZW5kKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlKQoreworCWludCByZXQsIGk7CisJdTggYjsKKworCXJldCA9IGl0OTEzeF93cml0ZV9yZWcoc3RhdGUsIFBST19ETU9ELCBTVVNQRU5EX0ZMQUcsIDB4MSk7CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIFRSSUdHRVJfT0ZTTSwgMHgwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlyZXQgPSBpdDkxM3hfcmVhZF9yZWcoc3RhdGUsIFNVU1BFTkRfRkxBRywgJmIsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoYiA9PSAwKQorCQkJYnJlYWs7CisKKwl9CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIEFGRV9NRU0wLCAweDgpOworCS8qIFR1cm4gTEVEIG9mZiAqLworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MCk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIGl0OTEzN190dW5lcl9vZmYpOworCisJcmV0dXJuIChyZXQgPCAwKSA/IC1FTk9ERVYgOiAwOworfQorCisvKiBQb3dlciBzZXF1ZW5jZSAqLworLyogUG93ZXIgVXAJVHVuZXIgb24gLT4gRnJvbnRlbmQgc3VzcGVuZCBvZmYgLT4gVHVuZXIgY2xrIG9uICovCisvKiBQb3dlciBEb3duCUZyb250ZW5kIHN1c3BlbmQgb24gLT4gVHVuZXIgY2xrIG9mZiAtPiBUdW5lciBvZmYgKi8KKworc3RhdGljIGludCBpdDkxM3hfZmVfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlyZXR1cm4gaXQ5MTN4X2ZlX3N1c3BlbmQoc3RhdGUpOworfQorCitzdGF0aWMgdTMyIGNvbXB1dGVfZGl2KHUzMiBhLCB1MzIgYiwgdTMyIHgpCit7CisJdTMyIHJlcyA9IDA7CisJdTMyIGMgPSAwOworCXUzMiBpID0gMDsKKworCWlmIChhID4gYikgeworCQljID0gYSAvIGI7CisJCWEgPSBhIC0gYyAqIGI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHg7IGkrKykgeworCQlpZiAoYSA+PSBiKSB7CisJCQlyZXMgKz0gMTsKKwkJCWEgLT0gYjsKKwkJfQorCQlhIDw8PSAxOworCQlyZXMgPDw9IDE7CisJfQorCisJcmVzID0gKGMgPDwgeCkgKyByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9zdGFydChzdHJ1Y3QgaXQ5MTN4X2ZlX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaXQ5MTN4c2V0ICpzZXRfZmU7CisJc3RydWN0IGl0OTEzeHNldCAqc2V0X21vZGU7CisJaW50IHJldDsKKwl1OCBhZGYgPSAoc3RhdGUtPmFkZiAmIDB4Zik7CisJdTMyIGFkYywgeHRhbDsKKwl1OCBiWzRdOworCisJcmV0ID0gaXQ5MTN4X2luaXRfdHVuZXIoc3RhdGUpOworCisJaWYgKGFkZiA8IDEyKSB7CisJCXN0YXRlLT5jcnlzdGFsRnJlcXVlbmN5ID0gZmVfY2xvY2tUYWJsZVthZGZdLnh0YWwgOworCQlzdGF0ZS0+dGFibGUgPSBmZV9jbG9ja1RhYmxlW2FkZl0udGFibGU7CisJCXN0YXRlLT5hZGNGcmVxdWVuY3kgPSBzdGF0ZS0+dGFibGUtPmFkY0ZyZXF1ZW5jeTsKKworCQlhZGMgPSBjb21wdXRlX2RpdihzdGF0ZS0+YWRjRnJlcXVlbmN5LCAxMDAwMDAwdWwsIDE5dWwpOworCQl4dGFsID0gY29tcHV0ZV9kaXYoc3RhdGUtPmNyeXN0YWxGcmVxdWVuY3ksIDEwMDAwMDB1bCwgMTl1bCk7CisKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWJfaW5mbygiWHRhbCBGcmVxIDolZCBBZGMgRnJlcSA6JWQgQWRjICUwOHggWHRhbCAlMDh4IiwKKwkJc3RhdGUtPmNyeXN0YWxGcmVxdWVuY3ksIHN0YXRlLT5hZGNGcmVxdWVuY3ksIGFkYywgeHRhbCk7CisKKwkvKiBTZXQgTEVEIGluZGljYXRvciBvbiBHUElPSDMgKi8KKwlyZXQgPSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX0VOLCAweDEpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX09OLCAweDEpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fTElOSywgR1BJT0gzX08sIDB4MSk7CisKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0xJTkssIDB4ZjY0MSwgc3RhdGUtPnR1bmVyX3R5cGUpOworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgMHhmNWNhLCAweDAxKTsKKwlyZXQgfD0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIDB4ZjcxNSwgMHgwMSk7CisKKwliWzBdID0geHRhbCAmIDB4ZmY7CisJYlsxXSA9ICh4dGFsID4+IDgpICYgMHhmZjsKKwliWzJdID0gKHh0YWwgPj4gMTYpICYgMHhmZjsKKwliWzNdID0gKHh0YWwgPj4gMjQpOworCXJldCB8PSBpdDkxM3hfd3JpdGUoc3RhdGUsIFBST19ETU9ELCBYVEFMX0NMSywgYiAsIDQpOworCisJYlswXSA9IGFkYyAmIDB4ZmY7CisJYlsxXSA9IChhZGMgPj4gOCkgJiAweGZmOworCWJbMl0gPSAoYWRjID4+IDE2KSAmIDB4ZmY7CisJcmV0IHw9IGl0OTEzeF93cml0ZShzdGF0ZSwgUFJPX0RNT0QsIEFEQ19GUkVRLCBiLCAzKTsKKworCXN3aXRjaCAoc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwljYXNlIElUOTEzNzogLyogVHVuZXIgdHlwZSAweDM4ICovCisJCXNldF9mZSA9IGl0OTEzN19zZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCB0aGUgZGVtb2QgKi8KKwlyZXQgPSBpdDkxM3hfZmVfc2NyaXB0X2xvYWRlcihzdGF0ZSwgc2V0X2ZlKTsKKwkvKiBBbHdheXMgc29sbyBmcm9udGVuZCAqLworCXNldF9tb2RlID0gc2V0X3NvbG9fZmU7CisJcmV0IHw9IGl0OTEzeF9mZV9zY3JpcHRfbG9hZGVyKHN0YXRlLCBzZXRfbW9kZSk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3N1c3BlbmQoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl0OTEzeF9mZV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IDA7CisJLyogUG93ZXIgVXAgVHVuZXIgLSBjb21tb24gYWxsIHZlcnNpb25zICovCisJcmV0ID0gaXQ5MTN4X3dyaXRlX3JlZyhzdGF0ZSwgUFJPX0RNT0QsIDB4ZWM0MCwgMHgxKTsKKworCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgQUZFX01FTTAsIDB4MCk7CisKKwlyZXQgfD0gaXQ5MTN4X2ZlX3NjcmlwdF9sb2FkZXIoc3RhdGUsIGluaXRfMSk7CisKKwlzd2l0Y2ggKHN0YXRlLT50dW5lcl90eXBlKSB7CisJY2FzZSBJVDkxMzc6CisJCXJldCB8PSBpdDkxM3hfd3JpdGVfcmVnKHN0YXRlLCBQUk9fRE1PRCwgMHhmYmE4LCAweDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gKHJldCA8IDApID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGl0OTEzeF9mZV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBpdDkxM3hfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgaXQ5MTN4X2ZlX29mZG1fb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICppdDkxM3hfZmVfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCXU4IGkyY19hZGRyLCB1OCBhZGYsIHU4IHR5cGUpCit7CisJc3RydWN0IGl0OTEzeF9mZV9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCWludCByZXQ7CisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdDkxM3hfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5pMmNfYWRhcCA9IGkyY19hZGFwOworCXN0YXRlLT5pMmNfYWRkciA9IGkyY19hZGRyOworCXN0YXRlLT5hZGYgPSBhZGY7CisJc3RhdGUtPnR1bmVyX3R5cGUgPSB0eXBlOworCisJcmV0ID0gaXQ5MTN4X2ZlX3N0YXJ0KHN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJml0OTEzeF9mZV9vZmRtX29wcywKKwkJCXNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisKKwlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaXQ5MTN4X2ZlX2F0dGFjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBpdDkxM3hfZmVfb2ZkbV9vcHMgPSB7CisKKwkuaW5mbyA9IHsKKwkJLm5hbWUJCQk9ICJpdDkxM3gtZmUgRFZCLVQiLAorCQkudHlwZQkJCT0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gNTEwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4CQk9IDE2ODAwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSA2MjUwMCwKKwkJLmNhcHMgPSBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkJRkVfQ0FOX0ZFQ180XzUgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwKKwkJCUZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ184XzkgfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPLAorCX0sCisKKwkucmVsZWFzZSA9IGl0OTEzeF9mZV9yZWxlYXNlLAorCisJLmluaXQgPSBpdDkxM3hfZmVfaW5pdCwKKwkuc2xlZXAgPSBpdDkxM3hfZmVfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gaXQ5MTN4X2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kID0gaXQ5MTN4X2ZlX2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyA9IGl0OTEzeF9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBpdDkxM3hfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gaXQ5MTN4X2ZlX3JlYWRfc25yLAorCS5yZWFkX2JlciA9IGl0OTEzeF9mZV9yZWFkX2JlciwKKwkucmVhZF91Y2Jsb2NrcyA9IGl0OTEzeF9mZV9yZWFkX3VjYmxvY2tzLAorfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJpdDkxM3ggRnJvbnRlbmQgYW5kIGl0OTEzNyB0dW5lciIpOworTU9EVUxFX0FVVEhPUigiTWFsY29sbSBQcmllc3RsZXkgdHZib3hzcHlAZ21haWwuY29tIik7CitNT0RVTEVfVkVSU0lPTigiMS4wNyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0OTEzeC1mZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTdmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXQ5MTN4LWZlLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBpdDkxM3ggRnJvbnRlbmQKKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuPQorICovCisKKyNpZm5kZWYgSVQ5MTNYX0ZFX0gKKyNkZWZpbmUgSVQ5MTNYX0ZFX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9JVDkxM1hfRkUpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfSVQ5MTNYX0ZFX01PRFVMRSkgJiYgXAorZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKml0OTEzeF9mZV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJCXU4IGkyY19hZGRyLCB1OCBhZGYsIHU4IHR5cGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqaXQ5MTN4X2ZlX2F0dGFjaCgKKwkJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwJdTggaTJjX2FkZHIsIHU4IGFkZiwgdTggdHlwZSkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVQ5MTNYX0ZFICovCisjZGVmaW5lIEkyQ19CQVNFX0FERFIJCTB4MTAKKyNkZWZpbmUgREVWXzAJCQkweDAKKyNkZWZpbmUgREVWXzEJCQkweDEwCisjZGVmaW5lIFBST19MSU5LCQkweDAKKyNkZWZpbmUgUFJPX0RNT0QJCTB4MQorI2RlZmluZSBERVZfMF9ETU9ECQkoUFJPX0RNT0QgPDwgMHg3KQorI2RlZmluZSBERVZfMV9ETU9ECQkoREVWXzBfRE1PRCB8IERFVl8xKQorI2RlZmluZSBDSElQMl9JMkNfQUREUgkJMHgzYQorCisjZGVmaW5lIEFGRV9NRU0wCQkweGZiMjQKKworI2RlZmluZSBNUDJfU1dfUlNUCQkweGY5OWQKKyNkZWZpbmUgTVAySUYyX1NXX1JTVAkJMHhmOWE0CisKKyNkZWZpbmUJUEFET0RQVQkJCTB4ZDgyNworI2RlZmluZSBUSElSRE9EUFUJCTB4ZDgyOAorI2RlZmluZSBBR0NfT19ECQkJMHhkODI5CisKKyNkZWZpbmUgRVAwX1RYX0VOCQkweGRkMTEKKyNkZWZpbmUgRVAwX1RYX05BSwkJMHhkZDEzCisjZGVmaW5lIEVQNF9UWF9MRU5fTFNCCQkweGRkODgKKyNkZWZpbmUgRVA0X1RYX0xFTl9NU0IJCTB4ZGQ4OQorI2RlZmluZSBFUDRfTUFYX1BLVAkJMHhkZDBjCisjZGVmaW5lIEVQNV9UWF9MRU5fTFNCCQkweGRkOGEKKyNkZWZpbmUgRVA1X1RYX0xFTl9NU0IJCTB4ZGQ4YgorI2RlZmluZSBFUDVfTUFYX1BLVAkJMHhkZDBkCisKKyNkZWZpbmUgSU9fTVVYX1BPV0VSX0NMSwkweGQ4MDAKKyNkZWZpbmUgQ0xLX09fRU4JCTB4ZDgxYQorI2RlZmluZSBJMkNfQ0xLCQkJMHhmMTAzCisjZGVmaW5lIEkyQ19DTEtfMTAwCQkweDcKKyNkZWZpbmUgSTJDX0NMS180MDAJCTB4MWEKKworI2RlZmluZSBEX1RQU0RfTE9DSwkJMHhmNWE5CisjZGVmaW5lIE1QMklGMl9FTgkJMHhmOWEzCisjZGVmaW5lIE1QMklGX1NFUklBTAkJMHhmOTg1CisjZGVmaW5lIFRTSVNfRU5BQkxFCQkweGY5Y2QKKyNkZWZpbmUgTVAySUYyX0hBTEZfUFNCCQkweGY5YTUKKyNkZWZpbmUgTVAySUZfU1RPUF9FTgkJMHhmOWI1CisjZGVmaW5lIE1QRUdfRlVMTF9TUEVFRAkJMHhmOTkwCisjZGVmaW5lIFRPUF9IT1NUQl9TRVJfTU9ERQkweGQ5MWMKKworI2RlZmluZSBQSURfUlNUCQkJMHhmOTkyCisjZGVmaW5lIFBJRF9FTgkJCTB4Zjk5MworI2RlZmluZSBQSURfSU5YX0VOCQkweGY5OTQKKyNkZWZpbmUgUElEX0lOWAkJCTB4Zjk5NQorI2RlZmluZSBQSURfTFNCCQkJMHhmOTk2CisjZGVmaW5lIFBJRF9NU0IJCQkweGY5OTcKKworI2RlZmluZSBNUDJJRl9NUEVHX1BBUl9NT0RFCTB4Zjk4NgorI2RlZmluZSBEQ0FfVVBQRVJfQ0hJUAkJMHhmNzMxCisjZGVmaW5lIERDQV9MT1dFUl9DSElQCQkweGY3MzIKKyNkZWZpbmUgRENBX1BMQVRDSAkJMHhmNzMwCisjZGVmaW5lIERDQV9GUEdBX0xBVENICQkweGY3NzgKKyNkZWZpbmUgRENBX1NUQU5EX0FMT05FCQkweGY3M2MKKyNkZWZpbmUgRENBX0VOQUJMRQkJMHhmNzc2CisKKyNkZWZpbmUgRFZCVF9JTlRFTgkJMHhmNDFmCisjZGVmaW5lIERWQlRfRU5BQkxFCQkweGY0MWEKKyNkZWZpbmUgSE9TVEJfRENBX0xPV0VSCQkweGQ5MWYKKyNkZWZpbmUgSE9TVEJfTVBFR19QQVJfTU9ERQkweGQ5MWIKKyNkZWZpbmUgSE9TVEJfTVBFR19TRVJfTU9ERQkweGQ5MWMKKyNkZWZpbmUgSE9TVEJfTVBFR19TRVJfRE83CTB4ZDkxZAorI2RlZmluZSBIT1NUQl9EQ0FfVVBQRVIJCTB4ZDkxZQorI2RlZmluZSBQQURNSVNDRFIyCQkweGQ4MzAKKyNkZWZpbmUgUEFETUlTQ0RSNAkJMHhkODMxCisjZGVmaW5lIFBBRE1JU0NEUjgJCTB4ZDgzMgorI2RlZmluZSBQQURNSVNDRFJTUgkJMHhkODMzCisjZGVmaW5lIExPQ0szX09VVAkJMHhkOGZkCisKKyNkZWZpbmUgR1BJT0gxX08JCTB4ZDhhZgorI2RlZmluZSBHUElPSDFfRU4JCTB4ZDhiMAorI2RlZmluZSBHUElPSDFfT04JCTB4ZDhiMQorI2RlZmluZSBHUElPSDNfTwkJMHhkOGIzCisjZGVmaW5lIEdQSU9IM19FTgkJMHhkOGI0CisjZGVmaW5lIEdQSU9IM19PTgkJMHhkOGI1CisjZGVmaW5lIEdQSU9INV9PCQkweGQ4YmIKKyNkZWZpbmUgR1BJT0g1X0VOCQkweGQ4YmMKKyNkZWZpbmUgR1BJT0g1X09OCQkweGQ4YmQKKworI2RlZmluZSBBRkVfTUVNMAkJMHhmYjI0CisKKyNkZWZpbmUgUkVHX1RQU0RfVFhfTU9ERQkweGY5MDAKKyNkZWZpbmUgUkVHX1RQU0RfR0kJCTB4ZjkwMQorI2RlZmluZSBSRUdfVFBTRF9ISUVSCQkweGY5MDIKKyNkZWZpbmUgUkVHX1RQU0RfQ09OU1QJCTB4ZjkwMworI2RlZmluZSBSRUdfQlcJCQkweGY5MDQKKyNkZWZpbmUgUkVHX1BSSVYJCTB4ZjkwNQorI2RlZmluZSBSRUdfVFBTRF9IUF9DT0RFCTB4ZjkwNgorI2RlZmluZSBSRUdfVFBTRF9MUF9DT0RFCTB4ZjkwNworCisjZGVmaW5lIE1QMklGX1NZTkNfTEsJCTB4Zjk5OQorI2RlZmluZSBBRENfRlJFUQkJMHhmMWNkCisKKyNkZWZpbmUgVFJJR0dFUl9PRlNNCQkweDAwMDAKKy8qIENPRUZGIFJlZ2lzdGVycyBzdGFydCBhdCAweDAwMDEgdG8gMHgwMDIwICovCisjZGVmaW5lIENPRUZGXzFfMjA0OAkJMHgwMDAxCisjZGVmaW5lIFhUQUxfQ0xLCQkweDAwMjUKKyNkZWZpbmUgQkZTX0ZDVwkJCTB4MDAyOQorI2RlZmluZSBUUFNEX0xPQ0sJCTB4MDAzYworI2RlZmluZSBUUkFJTklOR19NT0RFCQkweDAwNDAKKyNkZWZpbmUgQURDX1hfMgkJCTB4MDA0NQorI2RlZmluZSBUVU5FUl9JRAkJMHgwMDQ2CisjZGVmaW5lIEVNUFRZX0NIQU5ORUxfU1RBVFVTCTB4MDA0NworI2RlZmluZSBTSUdOQUxfTEVWRUwJCTB4MDA0OAorI2RlZmluZSBTSUdOQUxfUVVBTElUWQkJMHgwMDQ5CisjZGVmaW5lIEVTVF9TSUdOQUxfTEVWRUwJMHgwMDRhCisjZGVmaW5lIEZSRUVfQkFORAkJMHgwMDRiCisjZGVmaW5lIFNVU1BFTkRfRkxBRwkJMHgwMDRjCisvKiBCdWlsZCBpbiB0dW5lcnMgKi8KKyNkZWZpbmUgSVQ5MTM3IDB4MzgKKworZW51bSB7CisJQ01EX0RFTU9EX1JFQUQgPSAwLAorCUNNRF9ERU1PRF9XUklURSwKKwlDTURfVFVORVJfUkVBRCwKKwlDTURfVFVORVJfV1JJVEUsCisJQ01EX1JFR19FRVBST01fUkVBRCwKKwlDTURfUkVHX0VFUFJPTV9XUklURSwKKwlDTURfREFUQV9SRUFELAorCUNNRF9WQVJfUkVBRCA9IDgsCisJQ01EX1ZBUl9XUklURSwKKwlDTURfUExBVEZPUk1fR0VULAorCUNNRF9QTEFURk9STV9TRVQsCisJQ01EX0lQX0NBQ0hFLAorCUNNRF9JUF9BREQsCisJQ01EX0lQX1JFTU9WRSwKKwlDTURfUElEX0FERCwKKwlDTURfUElEX1JFTU9WRSwKKwlDTURfU0lQU0lfR0VULAorCUNNRF9TSVBTSV9NUEVfUkVTRVQsCisJQ01EX0hfUElEX0FERCA9IDB4MTUsCisJQ01EX0hfUElEX1JFTU9WRSwKKwlDTURfQUJPUlQsCisJQ01EX0lSX0dFVCwKKwlDTURfSVJfU0VULAorCUNNRF9GV19ET1dOTE9BRCA9IDB4MjEsCisJQ01EX1FVRVJZSU5GTywKKwlDTURfQk9PVCwKKwlDTURfRldfRE9XTkxPQURfQkVHSU4sCisJQ01EX0ZXX0RPV05MT0FEX0VORCwKKwlDTURfUlVOX0NPREUsCisJQ01EX1NDQVRURVJfUkVBRCA9IDB4MjgsCisJQ01EX1NDQVRURVJfV1JJVEUsCisJQ01EX0dFTkVSSUNfUkVBRCwKKwlDTURfR0VORVJJQ19XUklURQorfTsKKworZW51bSB7CisJUkVBRF9MT05HLAorCVdSSVRFX0xPTkcsCisJUkVBRF9TSE9SVCwKKwlXUklURV9TSE9SVCwKKwlSRUFEX0RBVEEsCisJV1JJVEVfREFUQSwKKwlXUklURV9DTUQsCit9OworCisjZW5kaWYgLyogSVQ5MTNYX0ZFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFkMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogbG5icDIyLmggLSBkcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgbG5icDIyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IERvbWluaWsgS3VobGVuCisgKiBCYXNlZCBvbiBsbmJwMjEgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJsbmJwMjIuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworCisjZGVmaW5lIGRwcmludGsobHZsLCBhcmcuLi4pIGlmIChkZWJ1ZyA+PSAobHZsKSkgcHJpbnRrKGFyZykKKworc3RydWN0IGxuYnAyMiB7CisJdTgJCSAgICBjb25maWdbNF07CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7Cit9OworCitzdGF0aWMgaW50IGxuYnAyMl9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBsbmJwMjIgKmxuYnAyMiA9IChzdHJ1Y3QgbG5icDIyICopZmUtPnNlY19wcml2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSAweDA4LAorCQkuZmxhZ3MgPSAwLAorCQkuYnVmID0gKGNoYXIgKikmbG5icDIyLT5jb25maWcsCisJCS5sZW4gPSBzaXplb2YobG5icDIyLT5jb25maWcpLAorCX07CisKKwlkcHJpbnRrKDEsICIlczogJWQgKDE4Vj0lZCAxM1Y9JWQpXG4iLCBfX2Z1bmNfXywgdm9sdGFnZSwKKwkgICAgICAgU0VDX1ZPTFRBR0VfMTgsIFNFQ19WT0xUQUdFXzEzKTsKKworCWxuYnAyMi0+Y29uZmlnWzNdID0gMHg2MDsgLyogUG93ZXIgZG93biAqLworCXN3aXRjaCAodm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQlsbmJwMjItPmNvbmZpZ1szXSB8PSBMTkJQMjJfRU47CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCWxuYnAyMi0+Y29uZmlnWzNdIHw9IChMTkJQMjJfRU4gfCBMTkJQMjJfVlNFTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlkcHJpbnRrKDEsICIlczogMHglMDJ4KVxuIiwgX19mdW5jX18sIGxuYnAyMi0+Y29uZmlnWzNdKTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihsbmJwMjItPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBsbmJwMjJfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGxvbmcgYXJnKQoreworCXN0cnVjdCBsbmJwMjIgKmxuYnAyMiA9IChzdHJ1Y3QgbG5icDIyICopIGZlLT5zZWNfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCS5hZGRyID0gMHgwOCwKKwkJLmZsYWdzID0gMCwKKwkJLmJ1ZiA9IChjaGFyICopJmxuYnAyMi0+Y29uZmlnLAorCQkubGVuID0gc2l6ZW9mKGxuYnAyMi0+Y29uZmlnKSwKKwl9OworCisJZHByaW50aygxLCAiJXM6ICVkXG4iLCBfX2Z1bmNfXywgKGludClhcmcpOworCWlmIChhcmcpCisJCWxuYnAyMi0+Y29uZmlnWzNdIHw9IExOQlAyMl9MTEM7CisJZWxzZQorCQlsbmJwMjItPmNvbmZpZ1szXSAmPSB+TE5CUDIyX0xMQzsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGxuYnAyMi0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBsbmJwMjJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkcHJpbnRrKDEsICIlc1xuIiwgX19mdW5jX18pOworCS8qIExOQlAgcG93ZXIgb2ZmICovCisJbG5icDIyX3NldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV9PRkYpOworCisJLyogZnJlZSBkYXRhICovCisJa2ZyZWUoZmUtPnNlY19wcml2KTsKKwlmZS0+c2VjX3ByaXYgPSBOVUxMOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsbmJwMjJfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgbG5icDIyICpsbmJwMjIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG5icDIyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsbmJwMjIpCisJCXJldHVybiBOVUxMOworCisJLyogZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJbG5icDIyLT5jb25maWdbMF0gPSAweDAwOyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbMV0gPSAweDI4OyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbMl0gPSAweDQ4OyAvKiA/ICovCisJbG5icDIyLT5jb25maWdbM10gPSAweDYwOyAvKiBQb3dlciBkb3duICovCisJbG5icDIyLT5pMmMgPSBpMmM7CisJZmUtPnNlY19wcml2ID0gbG5icDIyOworCisJLyogZGV0ZWN0IGlmIGl0IGlzIHByZXNlbnQgb3Igbm90ICovCisJaWYgKGxuYnAyMl9zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKSkgeworCQlkcHJpbnRrKDAsICIlcyBMTkJQMjIgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCWtmcmVlKGxuYnAyMik7CisJCWZlLT5zZWNfcHJpdiA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGluc3RhbGwgcmVsZWFzZSBjYWxsYmFjayAqLworCWZlLT5vcHMucmVsZWFzZV9zZWMgPSBsbmJwMjJfcmVsZWFzZTsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBsbmJwMjJfc2V0X3ZvbHRhZ2U7CisJZmUtPm9wcy5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZSA9IGxuYnAyMl9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZTsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0wobG5icDIyX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIGxuYnAyMiIpOworTU9EVUxFX0FVVEhPUigiRG9taW5payBLdWhsZW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2UyZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBsbmJwMjIuaCAtIGRyaXZlciBmb3IgbG5iIHN1cHBseSBhbmQgY29udHJvbCBpYyBsbmJwMjIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRG9taW5payBLdWhsZW4KKyAqIEJhc2VkIG9uIGxuYnAyMS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworCisjaWZuZGVmIF9MTkJQMjJfSAorI2RlZmluZSBfTE5CUDIyX0gKKworLyogRW5hYmxlICovCisjZGVmaW5lIExOQlAyMl9FTgkgIDB4MTAKKy8qIFZvbHRhZ2Ugc2VsZWN0aW9uICovCisjZGVmaW5lIExOQlAyMl9WU0VMCTB4MDIKKy8qIFBsdXMgMSBWb2x0IEJpdCAqLworI2RlZmluZSBMTkJQMjJfTExDCTB4MDEKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMikgfHwgXAorCQkoZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMl9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKKy8qCisgKiBvdmVycmlkZV9zZXQgYW5kIG92ZXJyaWRlX2NsZWFyIGNvbnRyb2wgd2hpY2ggc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKGFib3ZlKQorICogdG8gYWx3YXlzIHNldCAmIGNsZWFyCisgKi8KK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpsbmJwMjJfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqbG5icDIyX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIENPTkZJR19EVkJfTE5CUDIyICovCisKKyNlbmRpZiAvKiBfTE5CUDIyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYwppbmRleCBkNzBlZWUwLi4xMTdhNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCkBAIC0zNTgsNiArMzU4LDkgQEAKIAllbHNlCiAJCWRhdGFUaW1lID0gNTAwOwogCisJLyogY2xlYXIgcHJldmlvdXMgZmFpbGVkIEVORF9MT09QVklUICovCisJc3RiMDg5OV9yZWFkX3JlZyhzdGF0ZSwgU1RCMDg5OV9WU1RBVFVTKTsKKwogCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RTVEFUVVMyLCAweDAwKTsgLyogZm9yY2Ugc2VhcmNoIGxvb3AJKi8KIAl3aGlsZSAoMSkgewogCQkvKiBXQVJOSU5HISBWSVQgTE9DS0VEIGhhcyB0byBiZSB0ZXN0ZWQgYmVmb3JlIFZJVF9FTkRfTE9PT1AJKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKaW5kZXggMzdhMjIyZC4uODQwOGVmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfZHJ2LmMKQEAgLTcwNiw3ICs3MDYsNyBAQAogCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0NOVFJMMSwgcmVnKTsKIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5tc2dfbGVuOyBpKyspIHsKIAkJLyogd2FpdCBmb3IgRklGTyBlbXB0eQkqLwotCQlpZiAoc3RiMDg5OV93YWl0X2Rpc2VxY19maWZvX2VtcHR5KHN0YXRlLCAxMCkgPCAwKQorCQlpZiAoc3RiMDg5OV93YWl0X2Rpc2VxY19maWZvX2VtcHR5KHN0YXRlLCAxMDApIDwgMCkKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCiAJCXN0YjA4OTlfd3JpdGVfcmVnKHN0YXRlLCBTVEIwODk5X0RJU0ZJRk8sIGNtZC0+bXNnW2ldKTsKQEAgLTE0MjYsOSArMTQyNiw5IEBACiAJaWYgKGl0ZXJfc2NhbGUgPiBjb25maWctPmxkcGNfbWF4X2l0ZXIpCiAJCWl0ZXJfc2NhbGUgPSBjb25maWctPmxkcGNfbWF4X2l0ZXI7CiAKLQlyZWcgPSBTVEIwODk5X1JFQURfUzJSRUcoU1RCMDg5OV9TMkRFTU9ELCBNQVhfSVRFUik7CisJcmVnID0gU1RCMDg5OV9SRUFEX1MyUkVHKFNUQjA4OTlfUzJGRUMsIE1BWF9JVEVSKTsKIAlTVEIwODk5X1NFVEZJRUxEX1ZBTChNQVhfSVRFUkFUSU9OUywgcmVnLCBpdGVyX3NjYWxlKTsKLQlzdGIwODk5X3dyaXRlX3MycmVnKHN0YXRlLCBTVEIwODk5X1MyREVNT0QsIFNUQjA4OTlfQkFTRV9NQVhfSVRFUiwgU1RCMDg5OV9PRkYwX01BWF9JVEVSLCByZWcpOworCXN0YjA4OTlfd3JpdGVfczJyZWcoc3RhdGUsIFNUQjA4OTlfUzJGRUMsIFNUQjA4OTlfQkFTRV9NQVhfSVRFUiwgU1RCMDg5OV9PRkYwX01BWF9JVEVSLCByZWcpOwogfQogCiBzdGF0aWMgZW51bSBkdmJmZV9zZWFyY2ggc3RiMDg5OV9zZWFyY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI4OC5jCmluZGV4IDhlMGNmYWQuLjBhYTM5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjg4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyODguYwpAQCAtMTI3LDYgKzEyNywxMSBAQAogCWlmICgoc3JhdGUgPCAxMDAwMDAwKSB8fCAoc3JhdGUgPiA0NTAwMDAwMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MjIsIDApOworCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDIzLCAwKTsKKwlzdHYwMjg4X3dyaXRlcmVnSShzdGF0ZSwgMHgyYiwgMHhmZik7CisJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmMsIDB4ZjcpOworCiAJdGVtcCA9ICh1bnNpZ25lZCBpbnQpc3JhdGUgLyAxMDAwOwogCiAJCXRlbXAgPSB0ZW1wICogMzI3Njg7CkBAIC00NjEsNiArNDY2LDcgQEAKIAogCWNoYXIgdG07CiAJdW5zaWduZWQgY2hhciB0ZGFbM107CisJdTggcmVnLCB0aW1lX291dCA9IDA7CiAKIAlkcHJpbnRrKCIlcyA6IEZFX1NFVF9GUk9OVEVORFxuIiwgX19mdW5jX18pOwogCkBAIC00ODgsMjIgKzQ5NCwyOSBAQAogCS8qIENhcnJpZXIgbG9jayBjb250cm9sIHJlZ2lzdGVyICovCiAJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MTUsIDB4YzUpOwogCi0JdGRhWzBdID0gMHgyYjsgLyogQ0ZSTSAqLwogCXRkYVsyXSA9IDB4MDsgLyogQ0ZSTCAqLwotCWZvciAodG0gPSAtNjsgdG0gPCA3OykgeworCWZvciAodG0gPSAtOTsgdG0gPCA3OykgewogCQkvKiBWaXRlcmJpIHN0YXR1cyAqLwotCQlpZiAoc3R2MDI4OF9yZWFkcmVnKHN0YXRlLCAweDI0KSAmIDB4OCkKLQkJCWJyZWFrOwotCi0JCXRkYVsyXSArPSA0MDsKLQkJaWYgKHRkYVsyXSA8IDQwKQorCQlyZWcgPSBzdHYwMjg4X3JlYWRyZWcoc3RhdGUsIDB4MjQpOworCQlpZiAocmVnICYgMHg4KQorCQkJCWJyZWFrOworCQlpZiAocmVnICYgMHg4MCkgeworCQkJdGltZV9vdXQrKzsKKwkJCWlmICh0aW1lX291dCA+IDEwKQorCQkJCWJyZWFrOworCQkJdGRhWzJdICs9IDQwOworCQkJaWYgKHRkYVsyXSA8IDQwKQorCQkJCXRtKys7CisJCX0gZWxzZSB7CiAJCQl0bSsrOworCQkJdGRhWzJdID0gMDsKKwkJCXRpbWVfb3V0ID0gMDsKKwkJfQogCQl0ZGFbMV0gPSAodW5zaWduZWQgY2hhcil0bTsKIAkJc3R2MDI4OF93cml0ZXJlZ0koc3RhdGUsIDB4MmIsIHRkYVsxXSk7CiAJCXN0djAyODhfd3JpdGVyZWdJKHN0YXRlLCAweDJjLCB0ZGFbMl0pOwogCQl1ZGVsYXkoMzApOwogCX0KLQogCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSBjLT5mcmVxdWVuY3k7CiAJc3RhdGUtPmZlY19pbm5lciA9IEZFQ19BVVRPOwogCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IGMtPnN5bWJvbF9yYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwOTB4LmMKaW5kZXggNTJkODcxMi4uZWJkYTQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djA5MHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDkweC5jCkBAIC0zNDYzLDkgKzM0NjMsMTUgQEAKIHN0YXRpYyBpbnQgc3R2MDkweF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZW51bSBmZV9zdGF0dXMgKnN0YXR1cykKIHsKIAlzdHJ1Y3Qgc3R2MDkweF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1MzIgcmVnOworCXUzMiByZWcsIGRzdGF0dXM7CiAJdTggc2VhcmNoX3N0YXRlOwogCisJKnN0YXR1cyA9IDA7CisKKwlkc3RhdHVzID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKKwlpZiAoU1RWMDkweF9HRVRGSUVMRF9QeChkc3RhdHVzLCBDQVJfTE9DS19GSUVMRCkpCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSOworCiAJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBETURTVEFURSk7CiAJc2VhcmNoX3N0YXRlID0gU1RWMDkweF9HRVRGSUVMRF9QeChyZWcsIEhFQURFUl9NT0RFX0ZJRUxEKTsKIApAQCAtMzQ3NCw0MSArMzQ4MCwzMCBAQAogCWNhc2UgMTogLyogZmlyc3QgUExIIGRldGVjdGVkICovCiAJZGVmYXVsdDoKIAkJZHByaW50ayhGRV9ERUJVRywgMSwgIlN0YXR1czogVW5sb2NrZWQgKFNlYXJjaGluZyAuLikiKTsKLQkJKnN0YXR1cyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSAyOiAvKiBEVkItUzIgbW9kZSAqLwogCQlkcHJpbnRrKEZFX0RFQlVHLCAxLCAiRGVsaXZlcnkgc3lzdGVtOiBEVkItUzIiKTsKLQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKLQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLX0RFRklOSVRJRl9GSUVMRCkpIHsKKwkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgoZHN0YXR1cywgTE9DS19ERUZJTklUSUZfRklFTEQpKSB7CiAJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFBERUxTVEFUVVMxKTsKIAkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgUEtUREVMSU5fTE9DS19GSUVMRCkpIHsKKwkJCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOwogCQkJCXJlZyA9IFNUVjA5MHhfUkVBRF9ERU1PRChzdGF0ZSwgVFNTVEFUVVMpOwotCQkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVFNGSUZPX0xJTkVPS19GSUVMRCkpIHsKLQkJCQkJKnN0YXR1cyA9IEZFX0hBU19TSUdOQUwgfAotCQkJCQkJICBGRV9IQVNfQ0FSUklFUiB8Ci0JCQkJCQkgIEZFX0hBU19WSVRFUkJJIHwKLQkJCQkJCSAgRkVfSEFTX1NZTkMgfAotCQkJCQkJICBGRV9IQVNfTE9DSzsKLQkJCQl9CisJCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBUU0ZJRk9fTElORU9LX0ZJRUxEKSkKKwkJCQkJKnN0YXR1cyB8PSBGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAzOiAvKiBEVkItUzEvbGVnYWN5IG1vZGUgKi8KIAkJZHByaW50ayhGRV9ERUJVRywgMSwgIkRlbGl2ZXJ5IHN5c3RlbTogRFZCLVMiKTsKLQkJcmVnID0gU1RWMDkweF9SRUFEX0RFTU9EKHN0YXRlLCBEU1RBVFVTKTsKLQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLX0RFRklOSVRJRl9GSUVMRCkpIHsKKwkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgoZHN0YXR1cywgTE9DS19ERUZJTklUSUZfRklFTEQpKSB7CiAJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFZTVEFUVVNWSVQpOwogCQkJaWYgKFNUVjA5MHhfR0VURklFTERfUHgocmVnLCBMT0NLRURWSVRfRklFTEQpKSB7CisJCQkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKIAkJCQlyZWcgPSBTVFYwOTB4X1JFQURfREVNT0Qoc3RhdGUsIFRTU1RBVFVTKTsKLQkJCQlpZiAoU1RWMDkweF9HRVRGSUVMRF9QeChyZWcsIFRTRklGT19MSU5FT0tfRklFTEQpKSB7Ci0JCQkJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwKLQkJCQkJCSAgRkVfSEFTX0NBUlJJRVIgfAotCQkJCQkJICBGRV9IQVNfVklURVJCSSB8Ci0JCQkJCQkgIEZFX0hBU19TWU5DIHwKLQkJCQkJCSAgRkVfSEFTX0xPQ0s7Ci0JCQkJfQorCQkJCWlmIChTVFYwOTB4X0dFVEZJRUxEX1B4KHJlZywgVFNGSUZPX0xJTkVPS19GSUVMRCkpCisJCQkJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKIAkJCX0KIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0OC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKaW5kZXggOTNmNmE3NS4uN2YxMDU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmMKQEAgLTIwNiwxNSArMjA2LDE2IEBACiBzdGF0aWMgc3RydWN0IHBsbF90YWIgewogCXUzMgljbGtfZnJlcV9raHo7CiAJdTMyCWlmX2ZyZXFfa2h6OwotCXU4CW0sIG4sIHA7CiB9IHBsbF90YWJbXSA9IHsKLQl7IFREQTEwMDQ4X0NMS180MDAwLCAgVERBMTAwNDhfSUZfMzYxMzAsIDEwLCAwLCAwIH0sCi0JeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzMzMDAsICAxMCwgMywgMCB9LAotCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl8zNTAwLCAgMTAsIDMsIDAgfSwKLQl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzgwMCwgIDEwLCAzLCAwIH0sCi0JeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzQwMDAsICAxMCwgMywgMCB9LAotCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl80MzAwLCAgMTAsIDMsIDAgfSwKLQl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzYxMzAsIDEwLCAzLCAwIH0sCisJeyBUREExMDA0OF9DTEtfNDAwMCwgIFREQTEwMDQ4X0lGXzM2MTMwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzMzMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzUwMCB9LAorCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl8zODAwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzQwMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfNDMwMCB9LAorCXsgVERBMTAwNDhfQ0xLXzE2MDAwLCBUREExMDA0OF9JRl80NTAwIH0sCisJeyBUREExMDA0OF9DTEtfMTYwMDAsIFREQTEwMDQ4X0lGXzUwMDAgfSwKKwl7IFREQTEwMDQ4X0NMS18xNjAwMCwgVERBMTAwNDhfSUZfMzYxMzAgfSwKIH07CiAKIHN0YXRpYyBpbnQgdGRhMTAwNDhfd3JpdGVyZWcoc3RydWN0IHRkYTEwMDQ4X3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCBkYXRhKQpAQCAtNDYwLDkgKzQ2MSw2IEBACiAKIAkJCXN0YXRlLT5mcmVxX2lmX2h6ID0gcGxsX3RhYltpXS5pZl9mcmVxX2toeiAqIDEwMDA7CiAJCQlzdGF0ZS0+eHRhbF9oeiA9IHBsbF90YWJbaV0uY2xrX2ZyZXFfa2h6ICogMTAwMDsKLQkJCXN0YXRlLT5wbGxfbWZhY3RvciA9IHBsbF90YWJbaV0ubTsKLQkJCXN0YXRlLT5wbGxfbmZhY3RvciA9IHBsbF90YWJbaV0ubjsKLQkJCXN0YXRlLT5wbGxfcGZhY3RvciA9IHBsbF90YWJbaV0ucDsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNzgxLDYgKzc3OSwxMCBAQAogCiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyogUExMICovCisJaW5pdF90YWJbNF0uZGF0YSA9ICh1OCkoc3RhdGUtPnBsbF9tZmFjdG9yKTsKKwlpbml0X3RhYls1XS5kYXRhID0gKHU4KShzdGF0ZS0+cGxsX25mYWN0b3IpIHwgMHg0MDsKKwogCS8qIEFwcGx5IHJlZ2lzdGVyIGRlZmF1bHRzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF90YWIpOyBpKyspCiAJCXRkYTEwMDQ4X3dyaXRlcmVnKHN0YXRlLCBpbml0X3RhYltpXS5yZWcsIGluaXRfdGFiW2ldLmRhdGEpOwpAQCAtMTEyMyw3ICsxMTI1LDcgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgYW5kIGNsb25lIHRoZSBjb25maWcgKi8KIAltZW1jcHkoJnN0YXRlLT5jb25maWcsIGNvbmZpZywgc2l6ZW9mKCpjb25maWcpKTsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCXN0YXRlLT5md2xvYWRlZCA9IDA7CisJc3RhdGUtPmZ3bG9hZGVkID0gY29uZmlnLT5ub19maXJtd2FyZTsKIAlzdGF0ZS0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHByZXNlbnQgKi8KQEAgLTExMzUsNiArMTEzNywxNyBAQAogCQlzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCisJLyogc2V0IHBsbCAqLworCWlmIChjb25maWctPnNldF9wbGwpIHsKKwkJc3RhdGUtPnBsbF9tZmFjdG9yID0gY29uZmlnLT5wbGxfbTsKKwkJc3RhdGUtPnBsbF9uZmFjdG9yID0gY29uZmlnLT5wbGxfbjsKKwkJc3RhdGUtPnBsbF9wZmFjdG9yID0gY29uZmlnLT5wbGxfcDsKKwl9IGVsc2UgeworCQlzdGF0ZS0+cGxsX21mYWN0b3IgPSAxMDsKKwkJc3RhdGUtPnBsbF9uZmFjdG9yID0gMzsKKwkJc3RhdGUtPnBsbF9wZmFjdG9yID0gMDsKKwl9CisKIAkvKiBFc3RhYmxpc2ggYW55IGRlZmF1bHRzIHRoZSB0aGUgdXNlciBkaWRuJ3QgcGFzcyAqLwogCXRkYTEwMDQ4X2VzdGFibGlzaF9kZWZhdWx0cygmc3RhdGUtPmZyb250ZW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDQ4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaAppbmRleCA4ODI4Y2VhLi5mYjJlZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNDguaApAQCAtNTEsNiArNTEsNyBAQAogI2RlZmluZSBUREExMDA0OF9JRl80MzAwICA0MzAwCiAjZGVmaW5lIFREQTEwMDQ4X0lGXzQ1MDAgIDQ1MDAKICNkZWZpbmUgVERBMTAwNDhfSUZfNDc1MCAgNDc1MAorI2RlZmluZSBUREExMDA0OF9JRl81MDAwICA1MDAwCiAjZGVmaW5lIFREQTEwMDQ4X0lGXzM2MTMwIDM2MTMwCiAJdTE2IGR0djZfaWZfZnJlcV9raHo7CiAJdTE2IGR0djdfaWZfZnJlcV9raHo7CkBAIC02Miw2ICs2MywxMyBAQAogCiAJLyogRGlzYWJsZSBJMkMgZ2F0ZSBhY2Nlc3MgKi8KIAl1OCBkaXNhYmxlX2dhdGVfYWNjZXNzOworCisJYm9vbCBub19maXJtd2FyZTsKKworCWJvb2wgc2V0X3BsbDsKKwl1OCBwbGxfbTsKKwl1OCBwbGxfcDsKKwl1OCBwbGxfbjsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNDgpIHx8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzNzQzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5jCkBAIC0wLDAgKzEsMTI2OSBAQAorLyoKKyAqIE5YUCBUREExMDA3MSArIENvbmV4YW50IENYMjQxMThBIERWQi1TL1MyIGRlbW9kdWxhdG9yICsgdHVuZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgInRkYTEwMDcxX3ByaXYuaCIKKworaW50IHRkYTEwMDcxX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB0ZGExMDA3MV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHRkYTEwMDcxX29wczsKKworLyogd3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3dyX3JlZ3Moc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggKnZhbCwKKwlpbnQgbGVuKQoreworCWludCByZXQ7CisJdTggYnVmW2xlbisxXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMV0gPSB7CisJCXsKKwkJCS5hZGRyID0gcHJpdi0+Y2ZnLmkyY19hZGRyZXNzLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSBzaXplb2YoYnVmKSwKKwkJCS5idWYgPSBidWYsCisJCX0KKwl9OworCisJYnVmWzBdID0gcmVnOworCW1lbWNweSgmYnVmWzFdLCB2YWwsIGxlbik7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDEpOworCWlmIChyZXQgPT0gMSkgeworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXdhcm4oImkyYyB3ciBmYWlsZWQ9JWQgcmVnPSUwMnggbGVuPSVkIiwgcmV0LCByZWcsIGxlbik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHJlYWQgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3JkX3JlZ3Moc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggKnZhbCwKKwlpbnQgbGVuKQoreworCWludCByZXQ7CisJdTggYnVmW2xlbl07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7CisJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMSwKKwkJCS5idWYgPSAmcmVnLAorCQl9LCB7CisJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IHNpemVvZihidWYpLAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2csIDIpOworCWlmIChyZXQgPT0gMikgeworCQltZW1jcHkodmFsLCBidWYsIGxlbik7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJd2FybigiaTJjIHJkIGZhaWxlZD0lZCByZWc9JTAyeCBsZW49JWQiLCByZXQsIHJlZywgbGVuKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGUgc2luZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHRkYTEwMDcxX3dyX3JlZyhzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiwgdTggcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgcmVnLCAmdmFsLCAxKTsKK30KKworLyogcmVhZCBzaW5nbGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmRfcmVnKHN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2LCB1OCByZWcsIHU4ICp2YWwpCit7CisJcmV0dXJuIHRkYTEwMDcxX3JkX3JlZ3MocHJpdiwgcmVnLCB2YWwsIDEpOworfQorCisvKiB3cml0ZSBzaW5nbGUgcmVnaXN0ZXIgd2l0aCBtYXNrICovCitpbnQgdGRhMTAwNzFfd3JfcmVnX21hc2soc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsIHU4IHJlZywgdTggdmFsLCB1OCBtYXNrKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJLyogbm8gbmVlZCBmb3IgcmVhZCBpZiB3aG9sZSByZWcgaXMgd3JpdHRlbiAqLworCWlmIChtYXNrICE9IDB4ZmYpIHsKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCByZWcsICZ0bXAsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwgJj0gbWFzazsKKwkJdG1wICY9IH5tYXNrOworCQl2YWwgfD0gdG1wOworCX0KKworCXJldHVybiB0ZGExMDA3MV93cl9yZWdzKHByaXYsIHJlZywgJnZhbCwgMSk7Cit9CisKKy8qIHJlYWQgc2luZ2xlIHJlZ2lzdGVyIHdpdGggbWFzayAqLworaW50IHRkYTEwMDcxX3JkX3JlZ19tYXNrKHN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2LCB1OCByZWcsIHU4ICp2YWwsIHU4IG1hc2spCit7CisJaW50IHJldCwgaTsKKwl1OCB0bXA7CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIHJlZywgJnRtcCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRtcCAmPSBtYXNrOworCisJLyogZmluZCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0ICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoKG1hc2sgPj4gaSkgJiAweDAxKQorCQkJYnJlYWs7CisJfQorCSp2YWwgPSB0bXAgPj4gaTsKKworCXJldHVybiAwOworfQorCisvKiBleGVjdXRlIGZpcm13YXJlIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgdGRhMTAwNzFfY21kX2V4ZWN1dGUoc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYsCisJc3RydWN0IHRkYTEwMDcxX2NtZCAqY21kKQoreworCWludCByZXQsIGk7CisJdTggdG1wOworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd3JpdGUgY21kIGFuZCBhcmdzIGZvciBmaXJtd2FyZSAqLworCXJldCA9IHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgMHgwMCwgY21kLT5hcmdzLCBjbWQtPmxlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHN0YXJ0IGNtZCBleGVjdXRpb24gKi8KKwlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHgxZiwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIHdhaXQgY21kIGV4ZWN1dGlvbiB0ZXJtaW5hdGUgKi8KKwlmb3IgKGkgPSAxMDAwLCB0bXAgPSAxOyBpICYmIHRtcDsgaS0tKSB7CisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweDFmLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJdXNsZWVwX3JhbmdlKDIwMCwgNTAwMCk7CisJfQorCisJZGJnKCIlczogbG9vcD0lZCIsIF9fZnVuY19fLCBpKTsKKworCWlmIChpID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9zZXRfdG9uZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlmZV9zZWNfdG9uZV9tb2RlX3QgZmVfc2VjX3RvbmVfbW9kZSkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQ7CisJdTggdG9uZTsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IHRvbmVfbW9kZT0lZCIsIF9fZnVuY19fLCBmZV9zZWNfdG9uZV9tb2RlKTsKKworCXN3aXRjaCAoZmVfc2VjX3RvbmVfbW9kZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXRvbmUgPSAxOworCQlicmVhazsKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJdG9uZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZygiJXM6IGludmFsaWQgZmVfc2VjX3RvbmVfbW9kZSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfUENCX0NPTkZJRzsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSAweDAwOworCWNtZC5hcmdzWzB4MDNdID0gMHgwMDsKKwljbWQuYXJnc1sweDA0XSA9IHRvbmU7CisJY21kLmxlbiA9IDB4MDU7CisJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3NlY192b2x0YWdlX3QgZmVfc2VjX3ZvbHRhZ2UpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0OworCXU4IHZvbHRhZ2U7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkYmcoIiVzOiB2b2x0YWdlPSVkIiwgX19mdW5jX18sIGZlX3NlY192b2x0YWdlKTsKKworCXN3aXRjaCAoZmVfc2VjX3ZvbHRhZ2UpIHsKKwljYXNlIFNFQ19WT0xUQUdFXzEzOgorCQl2b2x0YWdlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJdm9sdGFnZSA9IDE7CisJCWJyZWFrOworCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgorCQl2b2x0YWdlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnKCIlczogaW52YWxpZCBmZV9zZWNfdm9sdGFnZSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9OworCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CX1NFVF9EQ19MRVZFTDsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSB2b2x0YWdlOworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKmRpc2VxY19jbWQpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0LCBpOworCXU4IHRtcDsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IG1zZ19sZW49JWQiLCBfX2Z1bmNfXywgZGlzZXFjX2NtZC0+bXNnX2xlbik7CisKKwlpZiAoZGlzZXFjX2NtZC0+bXNnX2xlbiA8IDMgfHwgZGlzZXFjX2NtZC0+bXNnX2xlbiA+IDE2KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd2FpdCBMTkIgVFggKi8KKwlmb3IgKGkgPSA1MDAsIHRtcCA9IDA7IGkgJiYgIXRtcDsgaS0tKSB7CisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZ19tYXNrKHByaXYsIDB4NDcsICZ0bXAsIDB4MDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKKwl9CisKKwlkYmcoIiVzOiBsb29wPSVkIiwgX19mdW5jX18sIGkpOworCisJaWYgKGkgPT0gMCkgeworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIDB4NDcsIDB4MDAsIDB4MDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfU0VORF9ESVNFUUM7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5hcmdzWzB4MDJdID0gMDsKKwljbWQuYXJnc1sweDAzXSA9IDA7CisJY21kLmFyZ3NbMHgwNF0gPSAyOworCWNtZC5hcmdzWzB4MDVdID0gMDsKKwljbWQuYXJnc1sweDA2XSA9IGRpc2VxY19jbWQtPm1zZ19sZW47CisJbWVtY3B5KCZjbWQuYXJnc1sweDA3XSwgZGlzZXFjX2NtZC0+bXNnLCBkaXNlcWNfY21kLT5tc2dfbGVuKTsKKwljbWQubGVuID0gMHgwNyArIGRpc2VxY19jbWQtPm1zZ19sZW47CisJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2Rpc2VxY19yZWN2X3NsYXZlX3JlcGx5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5ICpyZXBseSkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQsIGk7CisJdTggdG1wOworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGJnKCIlczoiLCBfX2Z1bmNfXyk7CisKKwkvKiB3YWl0IExOQiBSWCAqLworCWZvciAoaSA9IDUwMCwgdG1wID0gMDsgaSAmJiAhdG1wOyBpLS0pIHsKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVnX21hc2socHJpdiwgMHg0NywgJnRtcCwgMHgwMik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCX0KKworCWRiZygiJXM6IGxvb3A9JWQiLCBfX2Z1bmNfXywgaSk7CisKKwlpZiAoaSA9PSAwKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogcmVwbHkgbGVuICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4NDYsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXBseS0+bXNnX2xlbiA9IHRtcCAmIDB4MWY7IC8qIFs0OjBdICovOworCWlmIChyZXBseS0+bXNnX2xlbiA+IHNpemVvZihyZXBseS0+bXNnKSkKKwkJcmVwbHktPm1zZ19sZW4gPSBzaXplb2YocmVwbHktPm1zZyk7IC8qIHRydW5jYXRlIEFQSSBtYXggKi8KKworCS8qIHJlYWQgcmVwbHkgKi8KKwljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfVVBEQVRFX1JFUExZOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQubGVuID0gMHgwMjsKKwlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCBjbWQubGVuLCByZXBseS0+bXNnLCByZXBseS0+bXNnX2xlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2Rpc2VxY19zZW5kX2J1cnN0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCWZlX3NlY19taW5pX2NtZF90IGZlX3NlY19taW5pX2NtZCkKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCWludCByZXQsIGk7CisJdTggdG1wLCBidXJzdDsKKworCWlmICghcHJpdi0+d2FybSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWRiZygiJXM6IGZlX3NlY19taW5pX2NtZD0lZCIsIF9fZnVuY19fLCBmZV9zZWNfbWluaV9jbWQpOworCisJc3dpdGNoIChmZV9zZWNfbWluaV9jbWQpIHsKKwljYXNlIFNFQ19NSU5JX0E6CisJCWJ1cnN0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTRUNfTUlOSV9COgorCQlidXJzdCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRiZygiJXM6IGludmFsaWQgZmVfc2VjX21pbmlfY21kIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIHdhaXQgTE5CIFRYICovCisJZm9yIChpID0gNTAwLCB0bXAgPSAwOyBpICYmICF0bXA7IGktLSkgeworCQlyZXQgPSB0ZGExMDA3MV9yZF9yZWdfbWFzayhwcml2LCAweDQ3LCAmdG1wLCAweDAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CisJfQorCisJZGJnKCIlczogbG9vcD0lZCIsIF9fZnVuY19fLCBpKTsKKworCWlmIChpID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV93cl9yZWdfbWFzayhwcml2LCAweDQ3LCAweDAwLCAweDAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfTE5CX1NFTkRfVE9ORUJVUlNUOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQuYXJnc1sweDAyXSA9IGJ1cnN0OworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQ7CisJdTggdG1wOworCisJKnN0YXR1cyA9IDA7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHgzOSwgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmICh0bXAgJiAweDAxKSAvKiB0dW5lciBQTEwgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCWlmICh0bXAgJiAweDAyKSAvKiBkZW1vZCBQTEwgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKKwlpZiAodG1wICYgMHgwNCkgLyogdml0ZXJiaSBvciBMRFBDKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwlpZiAodG1wICYgMHgwOCkgLyogUlMgb3IgQkNIICovCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkMgfCBGRV9IQVNfTE9DSzsKKworCXByaXYtPmZlX3N0YXR1cyA9ICpzdGF0dXM7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0OworCXU4IGJ1ZlsyXTsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQkqc25yID0gMDsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIDB4M2EsIGJ1ZiwgMik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIEVzL05vIGRCeDEwICovCisJKnNuciA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IHRkYTEwMDcxX3ByaXYgKnByaXYgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNzFfY21kIGNtZDsKKwlpbnQgcmV0OworCXU4IHRtcDsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQkqc3RyZW5ndGggPSAwOworCQlyZXQgPSAwOworCQlnb3RvIGVycm9yOworCX0KKworCWNtZC5hcmdzWzB4MDBdID0gQ01EX0dFVF9BR0NBQ0M7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5sZW4gPSAweDAyOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnB1dCBwb3dlciBlc3RpbWF0ZSBkQm0gKi8KKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHg1MCwgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmICh0bXAgPCAxODEpCisJCXRtcCA9IDE4MTsgLyogLTc1IGRCbSAqLworCWVsc2UgaWYgKHRtcCA+IDIzNikKKwkJdG1wID0gMjM2OyAvKiAtMjAgZEJtICovCisKKwkvKiBzY2FsZSB2YWx1ZSB0byAweDAwMDAtMHhmZmZmICovCisJKnN0cmVuZ3RoID0gKHRtcC0xODEpICogMHhmZmZmIC8gKDIzNi0xODEpOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaSwgbGVuOworCXU4IHRtcCwgcmVnLCBidWZbOF07CisKKwlpZiAoIXByaXYtPndhcm0gfHwgIShwcml2LT5mZV9zdGF0dXMgJiBGRV9IQVNfTE9DSykpIHsKKwkJKmJlciA9IHByaXYtPmJlciA9IDA7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3dpdGNoIChwcml2LT5kZWxpdmVyeV9zeXN0ZW0pIHsKKwljYXNlIFNZU19EVkJTOgorCQlyZWcgPSAweDRjOworCQlsZW4gPSA4OworCQlpID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfRFZCUzI6CisJCXJlZyA9IDB4NGQ7CisJCWxlbiA9IDQ7CisJCWkgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqYmVyID0gcHJpdi0+YmVyID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIHJlZywgJnRtcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwcml2LT5tZWFzX2NvdW50W2ldID09IHRtcCkgeworCQlkYmcoIiVzOiBtZWFzIG5vdCByZWFkeT0lMDJ4IiwgX19mdW5jX18sIHRtcCk7CisJCSpiZXIgPSBwcml2LT5iZXI7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaXYtPm1lYXNfY291bnRbaV0gPSB0bXA7CisJfQorCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfQkVSX1VQREFURV9DT1VOVEVSUzsKKwljbWQuYXJnc1sweDAxXSA9IDA7CisJY21kLmFyZ3NbMHgwMl0gPSBpOworCWNtZC5sZW4gPSAweDAzOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIGNtZC5sZW4sIGJ1ZiwgbGVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJaWYgKHByaXYtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCUykgeworCQkqYmVyID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107CisJCXByaXYtPnVjYiArPSAoYnVmWzRdIDw8IDgpIHwgYnVmWzVdOworCX0gZWxzZSB7CisJCSpiZXIgPSAoYnVmWzBdIDw8IDgpIHwgYnVmWzFdOworCX0KKwlwcml2LT5iZXIgPSAqYmVyOworCisJcmV0dXJuIHJldDsKK2Vycm9yOgorCWRiZygiJXM6IGZhaWxlZD0lZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwNzFfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCByZXQgPSAwOworCisJaWYgKCFwcml2LT53YXJtIHx8ICEocHJpdi0+ZmVfc3RhdHVzICYgRkVfSEFTX0xPQ0spKSB7CisJCSp1Y2Jsb2NrcyA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogVUNCIGlzIHVwZGF0ZWQgd2hlbiBCRVIgaXMgcmVhZC4gQXNzdW1lIEJFUiBpcyByZWFkIGFueXdheS4gKi8KKworCSp1Y2Jsb2NrcyA9IHByaXYtPnVjYjsKKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCB0ZGExMDA3MV9jbWQgY21kOworCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOworCWludCByZXQsIGk7CisJdTggbW9kZSwgcm9sbG9mZiwgcGlsb3QsIGludmVyc2lvbiwgZGl2OworCisJZGJnKCIlczogZGVsaXZlcnlfc3lzdGVtPSVkIG1vZHVsYXRpb249JWQgZnJlcXVlbmN5PSVkICIgXAorCQkic3ltYm9sX3JhdGU9JWQgaW52ZXJzaW9uPSVkIHBpbG90PSVkIHJvbGxvZmY9JWQiLCBfX2Z1bmNfXywKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtLCBjLT5tb2R1bGF0aW9uLCBjLT5mcmVxdWVuY3ksCisJCWMtPnN5bWJvbF9yYXRlLCBjLT5pbnZlcnNpb24sIGMtPnBpbG90LCBjLT5yb2xsb2ZmKTsKKworCXByaXYtPmRlbGl2ZXJ5X3N5c3RlbSA9IFNZU19VTkRFRklORUQ7CisKKwlpZiAoIXByaXYtPndhcm0pIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGMtPmludmVyc2lvbikgeworCWNhc2UgSU5WRVJTSU9OX09GRjoKKwkJaW52ZXJzaW9uID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJTlZFUlNJT05fT046CisJCWludmVyc2lvbiA9IDA7CisJCWJyZWFrOworCWNhc2UgSU5WRVJTSU9OX0FVVE86CisJCS8qIDIgPSBhdXRvOyB0cnkgZmlyc3Qgb24gdGhlbiBvZmYKKwkJICogMyA9IGF1dG87IHRyeSBmaXJzdCBvZmYgdGhlbiBvbiAqLworCQlpbnZlcnNpb24gPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoIiVzOiBpbnZhbGlkIGludmVyc2lvbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGMtPmRlbGl2ZXJ5X3N5c3RlbSkgeworCWNhc2UgU1lTX0RWQlM6CisJCXJvbGxvZmYgPSAwOworCQlwaWxvdCA9IDI7CisJCWJyZWFrOworCWNhc2UgU1lTX0RWQlMyOgorCQlzd2l0Y2ggKGMtPnJvbGxvZmYpIHsKKwkJY2FzZSBST0xMT0ZGXzIwOgorCQkJcm9sbG9mZiA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGXzI1OgorCQkJcm9sbG9mZiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGXzM1OgorCQkJcm9sbG9mZiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBST0xMT0ZGX0FVVE86CisJCWRlZmF1bHQ6CisJCQlkYmcoIiVzOiBpbnZhbGlkIHJvbGxvZmYiLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoYy0+cGlsb3QpIHsKKwkJY2FzZSBQSUxPVF9PRkY6CisJCQlwaWxvdCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBQSUxPVF9PTjoKKwkJCXBpbG90ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBJTE9UX0FVVE86CisJCQlwaWxvdCA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRiZygiJXM6IGludmFsaWQgcGlsb3QiLCBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoIiVzOiBpbnZhbGlkIGRlbGl2ZXJ5X3N5c3RlbSIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwLCBtb2RlID0gMHhmZjsgaSA8IEFSUkFZX1NJWkUoVERBMTAwNzFfTU9EQ09EKTsgaSsrKSB7CisJCWlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gVERBMTAwNzFfTU9EQ09EW2ldLmRlbGl2ZXJ5X3N5c3RlbSAmJgorCQkJYy0+bW9kdWxhdGlvbiA9PSBUREExMDA3MV9NT0RDT0RbaV0ubW9kdWxhdGlvbiAmJgorCQkJYy0+ZmVjX2lubmVyID09IFREQTEwMDcxX01PRENPRFtpXS5mZWMpIHsKKwkJCW1vZGUgPSBUREExMDA3MV9NT0RDT0RbaV0udmFsOworCQkJZGJnKCIlczogbW9kZSBmb3VuZD0lMDJ4IiwgX19mdW5jX18sIG1vZGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobW9kZSA9PSAweGZmKSB7CisJCWRiZygiJXM6IGludmFsaWQgcGFyYW1ldGVyIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjLT5zeW1ib2xfcmF0ZSA8PSA1MDAwMDAwKQorCQlkaXYgPSAxNDsKKwllbHNlCisJCWRpdiA9IDQ7CisKKwlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHg4MSwgZGl2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZTMsIGRpdik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWNtZC5hcmdzWzB4MDBdID0gQ01EX0NIQU5HRV9DSEFOTkVMOworCWNtZC5hcmdzWzB4MDFdID0gMDsKKwljbWQuYXJnc1sweDAyXSA9IG1vZGU7CisJY21kLmFyZ3NbMHgwM10gPSAoYy0+ZnJlcXVlbmN5ID4+IDE2KSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNF0gPSAoYy0+ZnJlcXVlbmN5ID4+ICA4KSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNV0gPSAoYy0+ZnJlcXVlbmN5ID4+ICAwKSAmIDB4ZmY7CisJY21kLmFyZ3NbMHgwNl0gPSAoKGMtPnN5bWJvbF9yYXRlIC8gMTAwMCkgPj4gOCkgJiAweGZmOworCWNtZC5hcmdzWzB4MDddID0gKChjLT5zeW1ib2xfcmF0ZSAvIDEwMDApID4+IDApICYgMHhmZjsKKwljbWQuYXJnc1sweDA4XSA9ICh0ZGExMDA3MV9vcHMuaW5mby5mcmVxdWVuY3lfdG9sZXJhbmNlID4+IDgpICYgMHhmZjsKKwljbWQuYXJnc1sweDA5XSA9ICh0ZGExMDA3MV9vcHMuaW5mby5mcmVxdWVuY3lfdG9sZXJhbmNlID4+IDApICYgMHhmZjsKKwljbWQuYXJnc1sweDBhXSA9IHJvbGxvZmY7CisJY21kLmFyZ3NbMHgwYl0gPSBpbnZlcnNpb247CisJY21kLmFyZ3NbMHgwY10gPSBwaWxvdDsKKwljbWQuYXJnc1sweDBkXSA9IDB4MDA7CisJY21kLmFyZ3NbMHgwZV0gPSAweDAwOworCWNtZC5sZW4gPSAweDBmOworCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlwcml2LT5kZWxpdmVyeV9zeXN0ZW0gPSBjLT5kZWxpdmVyeV9zeXN0ZW07CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CisJaW50IHJldCwgaTsKKwl1OCBidWZbNV0sIHRtcDsKKworCWlmICghcHJpdi0+d2FybSB8fCAhKHByaXYtPmZlX3N0YXR1cyAmIEZFX0hBU19MT0NLKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IHRkYTEwMDcxX3JkX3JlZ3MocHJpdiwgMHgzMCwgYnVmLCA1KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJdG1wID0gYnVmWzBdICYgMHgzZjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShUREExMDA3MV9NT0RDT0QpOyBpKyspIHsKKwkJaWYgKHRtcCA9PSBUREExMDA3MV9NT0RDT0RbaV0udmFsKSB7CisJCQljLT5tb2R1bGF0aW9uID0gVERBMTAwNzFfTU9EQ09EW2ldLm1vZHVsYXRpb247CisJCQljLT5mZWNfaW5uZXIgPSBUREExMDA3MV9NT0RDT0RbaV0uZmVjOworCQkJYy0+ZGVsaXZlcnlfc3lzdGVtID0gVERBMTAwNzFfTU9EQ09EW2ldLmRlbGl2ZXJ5X3N5c3RlbTsKKwkJfQorCX0KKworCXN3aXRjaCAoKGJ1ZlsxXSA+PiAwKSAmIDB4MDEpIHsKKwljYXNlIDA6CisJCWMtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYy0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKChidWZbMV0gPj4gNykgJiAweDAxKSB7CisJY2FzZSAwOgorCQljLT5waWxvdCA9IFBJTE9UX09GRjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljLT5waWxvdCA9IFBJTE9UX09OOworCQlicmVhazsKKwl9CisKKwljLT5mcmVxdWVuY3kgPSAoYnVmWzJdIDw8IDE2KSB8IChidWZbM10gPDwgOCkgfCAoYnVmWzRdIDw8IDApOworCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCAweDUyLCBidWYsIDMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwljLT5zeW1ib2xfcmF0ZSA9IChidWZbMF0gPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IChidWZbMl0gPDwgMCk7CisKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZGExMDA3MV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaSwgbGVuLCByZW1haW5pbmcsIGZ3X3NpemU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwl1OCAqZndfZmlsZSA9IFREQTEwMDcxX0RFRkFVTFRfRklSTVdBUkU7CisJdTggdG1wLCBidWZbNF07CisJc3RydWN0IHRkYTEwMDcxX3JlZ192YWxfbWFzayB0YWJbXSA9IHsKKwkJeyAweGNkLCAweDAwLCAweDA3IH0sCisJCXsgMHg4MCwgMHgwMCwgMHgwMiB9LAorCQl7IDB4Y2QsIDB4MDAsIDB4YzAgfSwKKwkJeyAweGNlLCAweDAwLCAweDFiIH0sCisJCXsgMHg5ZCwgMHgwMCwgMHgwMSB9LAorCQl7IDB4OWQsIDB4MDAsIDB4MDIgfSwKKwkJeyAweDllLCAweDAwLCAweDAxIH0sCisJCXsgMHg4NywgMHgwMCwgMHg4MCB9LAorCQl7IDB4Y2UsIDB4MDAsIDB4MDggfSwKKwkJeyAweGNlLCAweDAwLCAweDEwIH0sCisJfTsKKwlzdHJ1Y3QgdGRhMTAwNzFfcmVnX3ZhbF9tYXNrIHRhYjJbXSA9IHsKKwkJeyAweGYxLCAweDcwLCAweGZmIH0sCisJCXsgMHg4OCwgcHJpdi0+Y2ZnLnBsbF9tdWx0aXBsaWVyLCAweDNmIH0sCisJCXsgMHg4OSwgMHgwMCwgMHgxMCB9LAorCQl7IDB4ODksIDB4MTAsIDB4MTAgfSwKKwkJeyAweGMwLCAweDAxLCAweDAxIH0sCisJCXsgMHhjMCwgMHgwMCwgMHgwMSB9LAorCQl7IDB4ZTAsIDB4ZmYsIDB4ZmYgfSwKKwkJeyAweGUwLCAweDAwLCAweGZmIH0sCisJCXsgMHg5NiwgMHgxZSwgMHg3ZSB9LAorCQl7IDB4OGIsIDB4MDgsIDB4MDggfSwKKwkJeyAweDhiLCAweDAwLCAweDA4IH0sCisJCXsgMHg4ZiwgMHgxYSwgMHg3ZSB9LAorCQl7IDB4OGMsIDB4NjgsIDB4ZmYgfSwKKwkJeyAweDhkLCAweDA4LCAweGZmIH0sCisJCXsgMHg4ZSwgMHg0YywgMHhmZiB9LAorCQl7IDB4OGYsIDB4MDEsIDB4MDEgfSwKKwkJeyAweDhiLCAweDA0LCAweDA0IH0sCisJCXsgMHg4YiwgMHgwMCwgMHgwNCB9LAorCQl7IDB4ODcsIDB4MDUsIDB4MDcgfSwKKwkJeyAweDgwLCAweDAwLCAweDIwIH0sCisJCXsgMHhjOCwgMHgwMSwgMHhmZiB9LAorCQl7IDB4YjQsIDB4NDcsIDB4ZmYgfSwKKwkJeyAweGI1LCAweDljLCAweGZmIH0sCisJCXsgMHhiNiwgMHg3ZCwgMHhmZiB9LAorCQl7IDB4YmEsIDB4MDAsIDB4MDMgfSwKKwkJeyAweGI3LCAweDQ3LCAweGZmIH0sCisJCXsgMHhiOCwgMHg5YywgMHhmZiB9LAorCQl7IDB4YjksIDB4N2QsIDB4ZmYgfSwKKwkJeyAweGJhLCAweDAwLCAweDBjIH0sCisJCXsgMHhjOCwgMHgwMCwgMHhmZiB9LAorCQl7IDB4Y2QsIDB4MDAsIDB4MDQgfSwKKwkJeyAweGNkLCAweDAwLCAweDIwIH0sCisJCXsgMHhlOCwgMHgwMiwgMHhmZiB9LAorCQl7IDB4Y2YsIDB4MjAsIDB4ZmYgfSwKKwkJeyAweDliLCAweGQ3LCAweGZmIH0sCisJCXsgMHg5YSwgMHgwMSwgMHgwMyB9LAorCQl7IDB4YTgsIDB4MDUsIDB4MGYgfSwKKwkJeyAweGE4LCAweDY1LCAweGYwIH0sCisJCXsgMHhhNiwgMHhhMCwgMHhmMCB9LAorCQl7IDB4OWQsIDB4NTAsIDB4ZmMgfSwKKwkJeyAweDllLCAweDIwLCAweGUwIH0sCisJCXsgMHhhMywgMHgxYywgMHg3YyB9LAorCQl7IDB4ZDUsIDB4MDMsIDB4MDMgfSwKKwl9OworCisJLyogZmlybXdhcmUgc3RhdHVzICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4NTEsICZ0bXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXRtcCkgeworCQkvKiB3YXJtIHN0YXRlIC0gd2FrZSB1cCBkZXZpY2UgZnJvbSBzbGVlcCAqLworCQlwcml2LT53YXJtID0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YWIpOyBpKyspIHsKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYltpXS5yZWcsCisJCQkJdGFiW2ldLnZhbCwgdGFiW2ldLm1hc2spOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJY21kLmFyZ3NbMHgwMF0gPSBDTURfU0VUX1NMRUVQX01PREU7CisJCWNtZC5hcmdzWzB4MDFdID0gMDsKKwkJY21kLmFyZ3NbMHgwMl0gPSAwOworCQljbWQubGVuID0gMHgwMzsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCS8qIGNvbGQgc3RhdGUgLSB0cnkgdG8gZG93bmxvYWQgZmlybXdhcmUgKi8KKwkJcHJpdi0+d2FybSA9IDA7CisKKwkJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayBhbmQgdGltZW91dCAqLworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfZmlsZSwgcHJpdi0+aTJjLT5kZXYucGFyZW50KTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJkaWQgbm90IGZpbmQgdGhlIGZpcm13YXJlIGZpbGUuICglcykgIgorCQkJCSJQbGVhc2Ugc2VlIGxpbnV4L0RvY3VtZW50YXRpb24vZHZiLyBmb3IgbW9yZSIgXAorCQkJCSIgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4gKCVkKSIsCisJCQkJZndfZmlsZSwgcmV0KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBpbml0ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhYjIpOyBpKyspIHsKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYjJbaV0ucmVnLAorCQkJCXRhYjJbaV0udmFsLCB0YWIyW2ldLm1hc2spOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisJCX0KKworCQkvKiAgZG93bmxvYWQgZmlybXdhcmUgKi8KKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZTAsIDB4N2YpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZWxlYXNlX2Zpcm13YXJlOworCisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZyhwcml2LCAweGY3LCAweDgxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcmVsZWFzZV9maXJtd2FyZTsKKworCQlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHhmOCwgMHgwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisKKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZjksIDB4MDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZWxlYXNlX2Zpcm13YXJlOworCisJCWluZm8oImZvdW5kIGEgJyVzJyBpbiBjb2xkIHN0YXRlLCB3aWxsIHRyeSB0byBsb2FkIGEgZmlybXdhcmUiLAorCQkJdGRhMTAwNzFfb3BzLmluZm8ubmFtZSk7CisKKwkJaW5mbygiZG93bmxvYWRpbmcgZmlybXdhcmUgZnJvbSBmaWxlICclcyciLCBmd19maWxlKTsKKworCQkvKiBkbyBub3QgZG93bmxvYWQgbGFzdCBieXRlICovCisJCWZ3X3NpemUgPSBmdy0+c2l6ZSAtIDE7CisKKwkJZm9yIChyZW1haW5pbmcgPSBmd19zaXplOyByZW1haW5pbmcgPiAwOworCQkJcmVtYWluaW5nIC09IChwcml2LT5jZmcuaTJjX3dyX21heCAtIDEpKSB7CisJCQlsZW4gPSByZW1haW5pbmc7CisJCQlpZiAobGVuID4gKHByaXYtPmNmZy5pMmNfd3JfbWF4IC0gMSkpCisJCQkJbGVuID0gKHByaXYtPmNmZy5pMmNfd3JfbWF4IC0gMSk7CisKKwkJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ3MocHJpdiwgMHhmYSwKKwkJCQkodTggKikgJmZ3LT5kYXRhW2Z3X3NpemUgLSByZW1haW5pbmddLCBsZW4pOworCQkJaWYgKHJldCkgeworCQkJCWVycigiZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkPSVkIiwgcmV0KTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIGVycm9yX3JlbGVhc2VfZmlybXdhcmU7CisJCQl9CisJCX0KKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwkJcmV0ID0gdGRhMTAwNzFfd3JfcmVnKHByaXYsIDB4ZjcsIDB4MGMpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlyZXQgPSB0ZGExMDA3MV93cl9yZWcocHJpdiwgMHhlMCwgMHgwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCS8qIHdhaXQgZmlybXdhcmUgc3RhcnQgKi8KKwkJbXNsZWVwKDI1MCk7CisKKwkJLyogZmlybXdhcmUgc3RhdHVzICovCisJCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweDUxLCAmdG1wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKHRtcCkgeworCQkJaW5mbygiZmlybXdhcmUgZGlkIG5vdCBydW4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9IGVsc2UgeworCQkJcHJpdi0+d2FybSA9IDE7CisJCX0KKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9HRVRfRldfVkVSU0lPTjsKKwkJY21kLmxlbiA9IDB4MDE7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlyZXQgPSB0ZGExMDA3MV9yZF9yZWdzKHByaXYsIGNtZC5sZW4sIGJ1ZiwgNCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWluZm8oImZpcm13YXJlIHZlcnNpb24gJWQuJWQuJWQuJWQiLAorCQkJYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKwkJaW5mbygiZm91bmQgYSAnJXMnIGluIHdhcm0gc3RhdGUuIiwgdGRhMTAwNzFfb3BzLmluZm8ubmFtZSk7CisKKwkJcmV0ID0gdGRhMTAwNzFfcmRfcmVncyhwcml2LCAweDgxLCBidWYsIDIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9ERU1PRF9JTklUOworCQljbWQuYXJnc1sweDAxXSA9ICgocHJpdi0+Y2ZnLnh0YWwgLyAxMDAwKSA+PiA4KSAmIDB4ZmY7CisJCWNtZC5hcmdzWzB4MDJdID0gKChwcml2LT5jZmcueHRhbCAvIDEwMDApID4+IDApICYgMHhmZjsKKwkJY21kLmFyZ3NbMHgwM10gPSBidWZbMF07CisJCWNtZC5hcmdzWzB4MDRdID0gYnVmWzFdOworCQljbWQuYXJnc1sweDA1XSA9IHByaXYtPmNmZy5wbGxfbXVsdGlwbGllcjsKKwkJY21kLmFyZ3NbMHgwNl0gPSBwcml2LT5jZmcuc3BlY19pbnY7CisJCWNtZC5hcmdzWzB4MDddID0gMHgwMDsKKwkJY21kLmxlbiA9IDB4MDg7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9UVU5FUl9JTklUOworCQljbWQuYXJnc1sweDAxXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgwM10gPSAweDAwOworCQljbWQuYXJnc1sweDA0XSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDVdID0gMHgxNDsKKwkJY21kLmFyZ3NbMHgwNl0gPSAweDAwOworCQljbWQuYXJnc1sweDA3XSA9IDB4MDM7CisJCWNtZC5hcmdzWzB4MDhdID0gMHgwMjsKKwkJY21kLmFyZ3NbMHgwOV0gPSAweDAyOworCQljbWQuYXJnc1sweDBhXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MGJdID0gMHgwMDsKKwkJY21kLmFyZ3NbMHgwY10gPSAweDAwOworCQljbWQuYXJnc1sweDBkXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MGVdID0gMHgwMDsKKwkJY21kLmxlbiA9IDB4MGY7CisJCXJldCA9IHRkYTEwMDcxX2NtZF9leGVjdXRlKHByaXYsICZjbWQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9NUEVHX0NPTkZJRzsKKwkJY21kLmFyZ3NbMHgwMV0gPSAwOworCQljbWQuYXJnc1sweDAyXSA9IHByaXYtPmNmZy50c19tb2RlOworCQljbWQuYXJnc1sweDAzXSA9IDB4MDA7CisJCWNtZC5hcmdzWzB4MDRdID0gMHgwNDsKKwkJY21kLmFyZ3NbMHgwNV0gPSAweDAwOworCQljbWQubGVuID0gMHgwNjsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIDB4ZjAsIDB4MDEsIDB4MDEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQljbWQuYXJnc1sweDAwXSA9IENNRF9MTkJfQ09ORklHOworCQljbWQuYXJnc1sweDAxXSA9IDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMTUwOworCQljbWQuYXJnc1sweDAzXSA9IDM7CisJCWNtZC5hcmdzWzB4MDRdID0gMjI7CisJCWNtZC5hcmdzWzB4MDVdID0gMTsKKwkJY21kLmFyZ3NbMHgwNl0gPSAxOworCQljbWQuYXJnc1sweDA3XSA9IDMwOworCQljbWQuYXJnc1sweDA4XSA9IDMwOworCQljbWQuYXJnc1sweDA5XSA9IDMwOworCQljbWQuYXJnc1sweDBhXSA9IDMwOworCQljbWQubGVuID0gMHgwYjsKKwkJcmV0ID0gdGRhMTAwNzFfY21kX2V4ZWN1dGUocHJpdiwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCWNtZC5hcmdzWzB4MDBdID0gQ01EX0JFUl9DT05UUk9MOworCQljbWQuYXJnc1sweDAxXSA9IDA7CisJCWNtZC5hcmdzWzB4MDJdID0gMTQ7CisJCWNtZC5hcmdzWzB4MDNdID0gMTQ7CisJCWNtZC5sZW4gPSAweDA0OworCQlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldDsKK2Vycm9yX3JlbGVhc2VfZmlybXdhcmU6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IHRkYTEwMDcxX2NtZCBjbWQ7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgdGRhMTAwNzFfcmVnX3ZhbF9tYXNrIHRhYltdID0geworCQl7IDB4Y2QsIDB4MDcsIDB4MDcgfSwKKwkJeyAweDgwLCAweDAyLCAweDAyIH0sCisJCXsgMHhjZCwgMHhjMCwgMHhjMCB9LAorCQl7IDB4Y2UsIDB4MWIsIDB4MWIgfSwKKwkJeyAweDlkLCAweDAxLCAweDAxIH0sCisJCXsgMHg5ZCwgMHgwMiwgMHgwMiB9LAorCQl7IDB4OWUsIDB4MDEsIDB4MDEgfSwKKwkJeyAweDg3LCAweDgwLCAweDgwIH0sCisJCXsgMHhjZSwgMHgwOCwgMHgwOCB9LAorCQl7IDB4Y2UsIDB4MTAsIDB4MTAgfSwKKwl9OworCisJaWYgKCFwcml2LT53YXJtKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY21kLmFyZ3NbMHgwMF0gPSBDTURfU0VUX1NMRUVQX01PREU7CisJY21kLmFyZ3NbMHgwMV0gPSAwOworCWNtZC5hcmdzWzB4MDJdID0gMTsKKwljbWQubGVuID0gMHgwMzsKKwlyZXQgPSB0ZGExMDA3MV9jbWRfZXhlY3V0ZShwcml2LCAmY21kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFiKTsgaSsrKSB7CisJCXJldCA9IHRkYTEwMDcxX3dyX3JlZ19tYXNrKHByaXYsIHRhYltpXS5yZWcsIHRhYltpXS52YWwsCisJCQl0YWJbaV0ubWFzayk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiByZXQ7CitlcnJvcjoKKwlkYmcoIiVzOiBmYWlsZWQ9JWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRkYTEwMDcxX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqcykKK3sKKwlzLT5taW5fZGVsYXlfbXMgPSA4MDAwOworCXMtPnN0ZXBfc2l6ZSA9IDA7CisJcy0+bWF4X2RyaWZ0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZGExMDA3MV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGExMDA3MV9wcml2ICpwcml2ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUocHJpdik7Cit9CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnRkYTEwMDcxX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnICpjb25maWcsCisJc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdGRhMTAwNzFfcHJpdiAqcHJpdiA9IE5VTEw7CisJdTggdG1wOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgcHJpdiAqLworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhMTAwNzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgcHJpdiAqLworCXByaXYtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnByaXYtPmNmZywgY29uZmlnLCBzaXplb2Yoc3RydWN0IHRkYTEwMDcxX2NvbmZpZykpOworCisJLyogY2hpcCBJRCAqLworCXJldCA9IHRkYTEwMDcxX3JkX3JlZyhwcml2LCAweGZmLCAmdG1wKTsKKwlpZiAocmV0IHx8IHRtcCAhPSAweDBmKQorCQlnb3RvIGVycm9yOworCisJLyogY2hpcCB0eXBlICovCisJcmV0ID0gdGRhMTAwNzFfcmRfcmVnKHByaXYsIDB4ZGQsICZ0bXApOworCWlmIChyZXQgfHwgdG1wICE9IDB4MDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjaGlwIHZlcnNpb24gKi8KKwlyZXQgPSB0ZGExMDA3MV9yZF9yZWcocHJpdiwgMHhmZSwgJnRtcCk7CisJaWYgKHJldCB8fCB0bXAgIT0gMHgwMSkKKwkJZ290byBlcnJvcjsKKworCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KKwltZW1jcHkoJnByaXYtPmZlLm9wcywgJnRkYTEwMDcxX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJcHJpdi0+ZmUuZGVtb2R1bGF0b3JfcHJpdiA9IHByaXY7CisKKwlyZXR1cm4gJnByaXYtPmZlOworZXJyb3I6CisJZGJnKCIlczogZmFpbGVkPSVkIiwgX19mdW5jX18sIHJldCk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHRkYTEwMDcxX2F0dGFjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB0ZGExMDA3MV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIk5YUCBUREExMDA3MSIsCisJCS50eXBlID0gRkVfUVBTSywKKwkJLmZyZXF1ZW5jeV9taW4gPSA5NTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV90b2xlcmFuY2UgPSA1MDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQlGRV9DQU5fRkVDXzFfMiB8CisJCQlGRV9DQU5fRkVDXzJfMyB8CisJCQlGRV9DQU5fRkVDXzNfNCB8CisJCQlGRV9DQU5fRkVDXzRfNSB8CisJCQlGRV9DQU5fRkVDXzVfNiB8CisJCQlGRV9DQU5fRkVDXzZfNyB8CisJCQlGRV9DQU5fRkVDXzdfOCB8CisJCQlGRV9DQU5fRkVDXzhfOSB8CisJCQlGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfAorCQkJRkVfQ0FOX1JFQ09WRVIgfAorCQkJRkVfQ0FOXzJHX01PRFVMQVRJT04KKwl9LAorCisJLnJlbGVhc2UgPSB0ZGExMDA3MV9yZWxlYXNlLAorCisJLmdldF90dW5lX3NldHRpbmdzID0gdGRhMTAwNzFfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkuaW5pdCA9IHRkYTEwMDcxX2luaXQsCisJLnNsZWVwID0gdGRhMTAwNzFfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gdGRhMTAwNzFfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSB0ZGExMDA3MV9nZXRfZnJvbnRlbmQsCisKKwkucmVhZF9zdGF0dXMgPSB0ZGExMDA3MV9yZWFkX3N0YXR1cywKKwkucmVhZF9zbnIgPSB0ZGExMDA3MV9yZWFkX3NuciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSB0ZGExMDA3MV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9iZXIgPSB0ZGExMDA3MV9yZWFkX2JlciwKKwkucmVhZF91Y2Jsb2NrcyA9IHRkYTEwMDcxX3JlYWRfdWNibG9ja3MsCisKKwkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IHRkYTEwMDcxX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQsCisJLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5ID0gdGRhMTAwNzFfZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHksCisJLmRpc2VxY19zZW5kX2J1cnN0ID0gdGRhMTAwNzFfZGlzZXFjX3NlbmRfYnVyc3QsCisKKwkuc2V0X3RvbmUgPSB0ZGExMDA3MV9zZXRfdG9uZSwKKwkuc2V0X3ZvbHRhZ2UgPSB0ZGExMDA3MV9zZXRfdm9sdGFnZSwKK307CisKK01PRFVMRV9BVVRIT1IoIkFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOWFAgVERBMTAwNzEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTYzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzEuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogTlhQIFREQTEwMDcxICsgQ29uZXhhbnQgQ1gyNDExOEEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgKyB0dW5lciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIFREQTEwMDcxX0gKKyNkZWZpbmUgVERBMTAwNzFfSAorCisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisKK3N0cnVjdCB0ZGExMDA3MV9jb25maWcgeworCS8qIERlbW9kdWxhdG9yIEkyQyBhZGRyZXNzLgorCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogVmFsdWVzOiAweDU1LAorCSAqLworCXU4IGkyY19hZGRyZXNzOworCisJLyogTWF4IGJ5dGVzIEkyQyBwcm92aWRlciBjYW4gd3JpdGUgYXQgb25jZS4KKwkgKiBOb3RlOiBCdWZmZXIgaXMgdGFrZW4gZnJvbSB0aGUgc3RhY2sgY3VycmVudGx5IQorCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CisJICogVmFsdWVzOgorCSAqLworCXUxNiBpMmNfd3JfbWF4OworCisJLyogVFMgb3V0cHV0IG1vZGUuCisJICogRGVmYXVsdDogVERBMTAwNzFfVFNfU0VSSUFMCisJICogVmFsdWVzOgorCSAqLworI2RlZmluZSBUREExMDA3MV9UU19TRVJJQUwgICAgICAgIDAKKyNkZWZpbmUgVERBMTAwNzFfVFNfUEFSQUxMRUwgICAgICAxCisJdTggdHNfbW9kZTsKKworCS8qIElucHV0IHNwZWN0cnVtIGludmVyc2lvbi4KKwkgKiBEZWZhdWx0OiAwCisJICogVmFsdWVzOiAwLCAxCisJICovCisJYm9vbCBzcGVjX2ludjsKKworCS8qIFh0YWwgZnJlcXVlbmN5IEh6CisJICogRGVmYXVsdDogbm9uZSwgbXVzdCBzZXQKKwkgKiBWYWx1ZXM6CisJICovCisJdTMyIHh0YWw7CisKKwkvKiBQTEwgbXVsdGlwbGllci4KKwkgKiBEZWZhdWx0OiBub25lLCBtdXN0IHNldAorCSAqIFZhbHVlczoKKwkgKi8KKwl1OCBwbGxfbXVsdGlwbGllcjsKK307CisKKworI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREExMDA3MSkgfHwgXAorCShkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNzFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTAwNzFfYXR0YWNoKAorCWNvbnN0IHN0cnVjdCB0ZGExMDA3MV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTAwNzFfYXR0YWNoKAorCWNvbnN0IHN0cnVjdCB0ZGExMDA3MV9jb25maWcgKmNvbmZpZywgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIFREQTEwMDcxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA3MV9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzFfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzVlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNzFfcHJpdi5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTlhQIFREQTEwMDcxICsgQ29uZXhhbnQgQ1gyNDExOEEgRFZCLVMvUzIgZGVtb2R1bGF0b3IgKyB0dW5lciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW50dGkgUGFsb3NhYXJpIDxjcm9wZUBpa2kuZmk+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIFREQTEwMDcxX1BSSVYKKyNkZWZpbmUgVERBMTAwNzFfUFJJVgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAidGRhMTAwNzEuaCIKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjZGVmaW5lIExPR19QUkVGSVggInRkYTEwMDcxIgorCisjdW5kZWYgZGJnCisjZGVmaW5lIGRiZyhmLCBhcmcuLi4pIFwKKwlpZiAodGRhMTAwNzFfZGVidWcpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAgIExPR19QUkVGSVgiOiAiIGYgIlxuIiAsICMjIGFyZykKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGYsIGFyZy4uLikgIHByaW50ayhLRVJOX0VSUiAgICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmLCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gICAgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorI3VuZGVmIHdhcm4KKyNkZWZpbmUgd2FybihmLCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgTE9HX1BSRUZJWCI6ICIgZiAiXG4iICwgIyMgYXJnKQorCitzdHJ1Y3QgdGRhMTAwNzFfcHJpdiB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKKwlzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnIGNmZzsKKworCXU4IG1lYXNfY291bnRbMl07CisJdTMyIGJlcjsKKwl1MzIgdWNiOworCWZlX3N0YXR1c190IGZlX3N0YXR1czsKKwlmZV9kZWxpdmVyeV9zeXN0ZW1fdCBkZWxpdmVyeV9zeXN0ZW07CisJYm9vbCB3YXJtOyAvKiBGVyBydW5uaW5nICovCit9OworCitzdGF0aWMgc3RydWN0IHRkYTEwMDcxX21vZGNvZCB7CisJZmVfZGVsaXZlcnlfc3lzdGVtX3QgZGVsaXZlcnlfc3lzdGVtOworCWZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOworCWZlX2NvZGVfcmF0ZV90IGZlYzsKKwl1OCB2YWw7Cit9IFREQTEwMDcxX01PRENPRFtdID0geworCS8qIE5CQy1RUFNLICovCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfQVVUTywgMHgwMCB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzFfMiwgIDB4MDQgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ18zXzUsICAweDA1IH0sCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfMl8zLCAgMHgwNiB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzNfNCwgIDB4MDcgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ180XzUsICAweDA4IH0sCisJeyBTWVNfRFZCUzIsIFFQU0ssICBGRUNfNV82LCAgMHgwOSB9LAorCXsgU1lTX0RWQlMyLCBRUFNLLCAgRkVDXzhfOSwgIDB4MGEgfSwKKwl7IFNZU19EVkJTMiwgUVBTSywgIEZFQ185XzEwLCAweDBiIH0sCisJLyogOFBTSyAqLworCXsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzNfNSwgIDB4MGMgfSwKKwl7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ18yXzMsICAweDBkIH0sCisJeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfM180LCAgMHgwZSB9LAorCXsgU1lTX0RWQlMyLCBQU0tfOCwgRkVDXzVfNiwgIDB4MGYgfSwKKwl7IFNZU19EVkJTMiwgUFNLXzgsIEZFQ184XzksICAweDEwIH0sCisJeyBTWVNfRFZCUzIsIFBTS184LCBGRUNfOV8xMCwgMHgxMSB9LAorCS8qIFFQU0sgKi8KKwl7IFNZU19EVkJTLCAgUVBTSywgIEZFQ19BVVRPLCAweDJkIH0sCisJeyBTWVNfRFZCUywgIFFQU0ssICBGRUNfMV8yLCAgMHgyZSB9LAorCXsgU1lTX0RWQlMsICBRUFNLLCAgRkVDXzJfMywgIDB4MmYgfSwKKwl7IFNZU19EVkJTLCAgUVBTSywgIEZFQ18zXzQsICAweDMwIH0sCisJeyBTWVNfRFZCUywgIFFQU0ssICBGRUNfNV82LCAgMHgzMSB9LAorCXsgU1lTX0RWQlMsICBRUFNLLCAgRkVDXzdfOCwgIDB4MzIgfSwKK307CisKK3N0cnVjdCB0ZGExMDA3MV9yZWdfdmFsX21hc2sgeworCXU4IHJlZzsKKwl1OCB2YWw7CisJdTggbWFzazsKK307CisKKy8qIGZpcm13YXJlIGZpbGVuYW1lICovCisjZGVmaW5lIFREQTEwMDcxX0RFRkFVTFRfRklSTVdBUkUgICAgICAiZHZiLWZlLXRkYTEwMDcxLmZ3IgorCisvKiBmaXJtd2FyZSBjb21tYW5kcyAqLworI2RlZmluZSBDTURfREVNT0RfSU5JVCAgICAgICAgICAweDEwCisjZGVmaW5lIENNRF9DSEFOR0VfQ0hBTk5FTCAgICAgIDB4MTEKKyNkZWZpbmUgQ01EX01QRUdfQ09ORklHICAgICAgICAgMHgxMworI2RlZmluZSBDTURfVFVORVJfSU5JVCAgICAgICAgICAweDE1CisjZGVmaW5lIENNRF9HRVRfQUdDQUNDICAgICAgICAgIDB4MWEKKworI2RlZmluZSBDTURfTE5CX0NPTkZJRyAgICAgICAgICAweDIwCisjZGVmaW5lIENNRF9MTkJfU0VORF9ESVNFUUMgICAgIDB4MjEKKyNkZWZpbmUgQ01EX0xOQl9TRVRfRENfTEVWRUwgICAgMHgyMgorI2RlZmluZSBDTURfTE5CX1BDQl9DT05GSUcgICAgICAweDIzCisjZGVmaW5lIENNRF9MTkJfU0VORF9UT05FQlVSU1QgIDB4MjQKKyNkZWZpbmUgQ01EX0xOQl9VUERBVEVfUkVQTFkgICAgMHgyNQorCisjZGVmaW5lIENNRF9HRVRfRldfVkVSU0lPTiAgICAgIDB4MzUKKyNkZWZpbmUgQ01EX1NFVF9TTEVFUF9NT0RFICAgICAgMHgzNgorI2RlZmluZSBDTURfQkVSX0NPTlRST0wgICAgICAgICAweDNlCisjZGVmaW5lIENNRF9CRVJfVVBEQVRFX0NPVU5URVJTIDB4M2YKKworLyogZmlybWFyZSBjb21tYW5kIHN0cnVjdCAqLworI2RlZmluZSBUREExMDA3MV9BUkdMRU4gICAgICAweDFlCitzdHJ1Y3QgdGRhMTAwNzFfY21kIHsKKwl1OCBhcmdzW1REQTEwMDcxX0FSR0xFTl07CisJdTggbGVuOworfTsKKworCisjZW5kaWYgLyogVERBMTAwNzFfUFJJViAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jCmluZGV4IDAzODRlOGQuLjFiMWJmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmMKQEAgLTExOTUsNyArMTE5NSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3N0YXRpYyBpbnQgZ2V0X2lmX2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCiB7CiAJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKIApAQCAtMTIyMiw3ICsxMjIyLDcgQEAKIAkuc2xlZXAgICAgICAgICAgICAgPSBzbGVlcCwKIAkuc2V0X3BhcmFtcyAgICAgICAgPSBzZXRfcGFyYW1zLAogCS5yZWxlYXNlICAgICAgICAgICA9IHJlbGVhc2UsCi0JLmdldF9mcmVxdWVuY3kgICAgID0gZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2lmX2ZyZXF1ZW5jeSAgPSBnZXRfaWZfZnJlcXVlbmN5LAogCS5nZXRfYmFuZHdpZHRoICAgICA9IGdldF9iYW5kd2lkdGgsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvTWFrZWZpbGUKaW5kZXggOThkYzVjZC4uZWM4MTE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9NYWtlZmlsZQpAQCAtMjUsNCArMjUsNCBAQAogb2JqLSQoQ09ORklHX0RWQl9NQU5USVMpCSs9IG1hbnRpcy5vCiBvYmotJChDT05GSUdfRFZCX0hPUFBFUikJKz0gaG9wcGVyLm8KIAotRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvaG9wcGVyX2NhcmRzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvaG9wcGVyX2NhcmRzLmMKaW5kZXggMTQwMjA2Mi4uNzE2MjJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL2hvcHBlcl9jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9ob3BwZXJfY2FyZHMuYwpAQCAtNjUsNyArNjUsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaG9wcGVyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1MzIgc3RhdCA9IDAsIG1hc2sgPSAwLCBsc3RhdCA9IDAsIG1zdGF0ID0gMDsKKwl1MzIgc3RhdCA9IDAsIG1hc2sgPSAwLCBsc3RhdCA9IDA7CiAJdTMyIHJzdF9zdGF0ID0gMCwgcnN0X21hc2sgPSAwOwogCiAJc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpczsKQEAgLTgwLDcgKzgwLDcgQEAKIAogCXN0YXQgPSBtbXJlYWQoTUFOVElTX0lOVF9TVEFUKTsKIAltYXNrID0gbW1yZWFkKE1BTlRJU19JTlRfTUFTSyk7Ci0JbXN0YXQgPSBsc3RhdCA9IHN0YXQgJiB+TUFOVElTX0lOVF9SSVNDU1RBVDsKKwlsc3RhdCA9IHN0YXQgJiB+TUFOVElTX0lOVF9SSVNDU1RBVDsKIAlpZiAoIShzdGF0ICYgbWFzaykpCiAJCXJldHVybiBJUlFfTk9ORTsKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAJfQogCWlmIChzdGF0ICYgTUFOVElTX0lOVF9SSVNDSSkgewogCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMCwgIjwlcz4iLCBsYWJlbFs4XSk7Ci0JCW1hbnRpcy0+ZmluaXNoZWRfYmxvY2sgPSAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ1NUQVQpID4+IDI4OworCQltYW50aXMtPmJ1c3lfYmxvY2sgPSAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ1NUQVQpID4+IDI4OwogCQl0YXNrbGV0X3NjaGVkdWxlKCZtYW50aXMtPnRhc2tsZXQpOwogCX0KIAlpZiAoc3RhdCAmIE1BTlRJU19JTlRfSTJDRE9ORSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jYXJkcy5jCmluZGV4IDA1Y2JiOWQuLmMyYmI5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NhcmRzLmMKQEAgLTczLDcgKzczLDcgQEAKIAogc3RhdGljIGlycXJldHVybl90IG1hbnRpc19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdTMyIHN0YXQgPSAwLCBtYXNrID0gMCwgbHN0YXQgPSAwLCBtc3RhdCA9IDA7CisJdTMyIHN0YXQgPSAwLCBtYXNrID0gMCwgbHN0YXQgPSAwOwogCXUzMiByc3Rfc3RhdCA9IDAsIHJzdF9tYXNrID0gMDsKIAogCXN0cnVjdCBtYW50aXNfcGNpICptYW50aXM7CkBAIC04OCw3ICs4OCw3IEBACiAKIAlzdGF0ID0gbW1yZWFkKE1BTlRJU19JTlRfU1RBVCk7CiAJbWFzayA9IG1tcmVhZChNQU5USVNfSU5UX01BU0spOwotCW1zdGF0ID0gbHN0YXQgPSBzdGF0ICYgfk1BTlRJU19JTlRfUklTQ1NUQVQ7CisJbHN0YXQgPSBzdGF0ICYgfk1BTlRJU19JTlRfUklTQ1NUQVQ7CiAJaWYgKCEoc3RhdCAmIG1hc2spKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCX0KIAlpZiAoc3RhdCAmIE1BTlRJU19JTlRfUklTQ0kpIHsKIAkJZHByaW50ayhNQU5USVNfREVCVUcsIDAsICI8JXM+IiwgbGFiZWxbOF0pOwotCQltYW50aXMtPmZpbmlzaGVkX2Jsb2NrID0gKHN0YXQgJiBNQU5USVNfSU5UX1JJU0NTVEFUKSA+PiAyODsKKwkJbWFudGlzLT5idXN5X2Jsb2NrID0gKHN0YXQgJiBNQU5USVNfSU5UX1JJU0NTVEFUKSA+PiAyODsKIAkJdGFza2xldF9zY2hlZHVsZSgmbWFudGlzLT50YXNrbGV0KTsKIAl9CiAJaWYgKHN0YXQgJiBNQU5USVNfSU5UX0kyQ0RPTkUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2NvbW1vbi5oCmluZGV4IDQ5ZGJjYTEuLmYyNDEwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19jb21tb24uaApAQCAtMTIzLDExICsxMjMsOCBAQAogCXVuc2lnbmVkIGludAkJbnVtOwogCiAJLyoJUklTQyBDb3JlCQkqLwotCXUzMgkJCWZpbmlzaGVkX2Jsb2NrOworCXUzMgkJCWJ1c3lfYmxvY2s7CiAJdTMyCQkJbGFzdF9ibG9jazsKLQl1MzIJCQlsaW5lX2J5dGVzOwotCXUzMgkJCWxpbmVfY291bnQ7Ci0JdTMyCQkJcmlzY19wb3M7CiAJdTgJCQkqYnVmX2NwdTsKIAlkbWFfYWRkcl90CQlidWZfZG1hOwogCXUzMgkJCSpyaXNjX2NwdTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfZG1hLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX2RtYS5jCmluZGV4IDQ2MjAyYTQuLmM2MWNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfZG1hLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc19kbWEuYwpAQCAtNDMsMTMgKzQzLDE3IEBACiAjZGVmaW5lIFJJU0NfSVJRCQkoMHgwMSA8PCAyNCkKIAogI2RlZmluZSBSSVNDX1NUQVRVUyhzdGF0dXMpCSgoKCh+c3RhdHVzKSAmIDB4MGYpIDw8IDIwKSB8ICgoc3RhdHVzICYgMHgwZikgPDwgMTYpKQotI2RlZmluZSBSSVNDX0ZMVVNIKCkJCShtYW50aXMtPnJpc2NfcG9zID0gMCkKLSNkZWZpbmUgUklTQ19JTlNUUihvcGNvZGUpCShtYW50aXMtPnJpc2NfY3B1W21hbnRpcy0+cmlzY19wb3MrK10gPSBjcHVfdG9fbGUzMihvcGNvZGUpKQorI2RlZmluZSBSSVNDX0ZMVVNIKHJpc2NfcG9zKQkJKHJpc2NfcG9zID0gMCkKKyNkZWZpbmUgUklTQ19JTlNUUihyaXNjX3Bvcywgb3Bjb2RlKQkobWFudGlzLT5yaXNjX2NwdVtyaXNjX3BvcysrXSA9IGNwdV90b19sZTMyKG9wY29kZSkpCiAKICNkZWZpbmUgTUFOVElTX0JVRl9TSVpFCQkoNjQgKiAxMDI0KQotI2RlZmluZSBNQU5USVNfQkxPQ0tfQllURVMJKE1BTlRJU19CVUZfU0laRSA+PiA0KQotI2RlZmluZSBNQU5USVNfQkxPQ0tfQ09VTlQJKDEgPDwgNCkKLSNkZWZpbmUgTUFOVElTX1JJU0NfU0laRQlQQUdFX1NJWkUKKyNkZWZpbmUgTUFOVElTX0JMT0NLX0JZVEVTICAgICAgKE1BTlRJU19CVUZfU0laRSAvIDQpCisjZGVmaW5lIE1BTlRJU19ETUFfVFJfQllURVMgICAgICgyICogMTAyNCkgLyogdXBwZXIgbGltaXQ6IDQwOTUgYnl0ZXMuICovCisjZGVmaW5lIE1BTlRJU19CTE9DS19DT1VOVAkoTUFOVElTX0JVRl9TSVpFIC8gTUFOVElTX0JMT0NLX0JZVEVTKQorCisjZGVmaW5lIE1BTlRJU19ETUFfVFJfVU5JVFMgICAgIChNQU5USVNfQkxPQ0tfQllURVMgLyBNQU5USVNfRE1BX1RSX0JZVEVTKQorLyogTUFOVElTX0JVRl9TSVpFIC8gTUFOVElTX0RNQV9UUl9VTklUUyBtdXN0IG5vdCBleGNlZWQgTUFOVElTX1JJU0NfU0laRSAoNGsgUklTQyBjbWQgYnVmZmVyKSAqLworI2RlZmluZSBNQU5USVNfUklTQ19TSVpFCVBBR0VfU0laRSAvKiBSSVNDIHByb2dyYW0gbXVzdCBmaXQgaGVyZS4gKi8KIAogaW50IG1hbnRpc19kbWFfZXhpdChzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQogewpAQCAtMTI0LDI3ICsxMjgsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYW50aXNfY2FsY19saW5lcyhzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzKQotewotCW1hbnRpcy0+bGluZV9ieXRlcyA9IE1BTlRJU19CTE9DS19CWVRFUzsKLQltYW50aXMtPmxpbmVfY291bnQgPSBNQU5USVNfQkxPQ0tfQ09VTlQ7Ci0KLQl3aGlsZSAobWFudGlzLT5saW5lX2J5dGVzID4gNDA5NSkgewotCQltYW50aXMtPmxpbmVfYnl0ZXMgPj49IDE7Ci0JCW1hbnRpcy0+bGluZV9jb3VudCA8PD0gMTsKLQl9Ci0KLQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgIk1hbnRpcyBSSVNDIGJsb2NrIGJ5dGVzPVslZF0sIGxpbmUgYnl0ZXM9WyVkXSwgbGluZSBjb3VudD1bJWRdIiwKLQkJTUFOVElTX0JMT0NLX0JZVEVTLCBtYW50aXMtPmxpbmVfYnl0ZXMsIG1hbnRpcy0+bGluZV9jb3VudCk7Ci0KLQlpZiAobWFudGlzLT5saW5lX2NvdW50ID4gMjU1KSB7Ci0JCWRwcmludGsoTUFOVElTX0VSUk9SLCAxLCAiQnVmZmVyIHNpemUgZXJyb3IiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBtYW50aXNfZG1hX2luaXQoc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpcykKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTE1OCwxMiArMTQxLDYgQEAKIAogCQlnb3RvIGVycjsKIAl9Ci0JZXJyID0gbWFudGlzX2NhbGNfbGluZXMobWFudGlzKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkcHJpbnRrKE1BTlRJU19FUlJPUiwgMSwgIk1hbnRpcyBjYWxjIGxpbmVzIGZhaWxlZCIpOwotCi0JCWdvdG8gZXJyOwotCX0KIAogCXJldHVybiAwOwogZXJyOgpAQCAtMTc0LDMxICsxNTEsMzIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYW50aXNfcmlzY19wcm9ncmFtKHN0cnVjdCBtYW50aXNfcGNpICptYW50aXMpCiB7CiAJdTMyIGJ1Zl9wb3MgPSAwOwotCXUzMiBsaW5lOworCXUzMiBsaW5lLCBzdGVwOworCXUzMiByaXNjX3BvczsKIAogCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAiTWFudGlzIGNyZWF0ZSBSSVNDIHByb2dyYW0iKTsKLQlSSVNDX0ZMVVNIKCk7CisJUklTQ19GTFVTSChyaXNjX3Bvcyk7CiAKLQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgInJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldSIsCi0JCW1hbnRpcy0+bGluZV9jb3VudCwgbWFudGlzLT5saW5lX2J5dGVzKTsKKwlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgInJpc2MgbGVuIGxpbmVzICV1LCBieXRlcyBwZXIgbGluZSAldSwgYnl0ZXMgcGVyIERNQSB0ciAldSIsCisJCU1BTlRJU19CTE9DS19DT1VOVCwgTUFOVElTX0JMT0NLX0JZVEVTLCBNQU5USVNfRE1BX1RSX0JZVEVTKTsKIAotCWZvciAobGluZSA9IDA7IGxpbmUgPCBtYW50aXMtPmxpbmVfY291bnQ7IGxpbmUrKykgewotCQlkcHJpbnRrKE1BTlRJU19ERUJVRywgMSwgIlJJU0MgUFJPRyBsaW5lPVslZF0iLCBsaW5lKTsKLQkJaWYgKCEoYnVmX3BvcyAlIE1BTlRJU19CTE9DS19CWVRFUykpIHsKLQkJCVJJU0NfSU5TVFIoUklTQ19XUklURQl8Ci0JCQkJICAgUklTQ19JUlEJfAotCQkJCSAgIFJJU0NfU1RBVFVTKCgoYnVmX3BvcyAvIE1BTlRJU19CTE9DS19CWVRFUykgKwotCQkJCSAgIChNQU5USVNfQkxPQ0tfQ09VTlQgLSAxKSkgJQotCQkJCSAgICBNQU5USVNfQkxPQ0tfQ09VTlQpIHwKLQkJCQkgICAgbWFudGlzLT5saW5lX2J5dGVzKTsKLQkJfSBlbHNlIHsKLQkJCVJJU0NfSU5TVFIoUklTQ19XUklURQl8IG1hbnRpcy0+bGluZV9ieXRlcyk7Ci0JCX0KLQkJUklTQ19JTlNUUihtYW50aXMtPmJ1Zl9kbWEgKyBidWZfcG9zKTsKLQkJYnVmX3BvcyArPSBtYW50aXMtPmxpbmVfYnl0ZXM7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IE1BTlRJU19CTE9DS19DT1VOVDsgbGluZSsrKSB7CisJCWZvciAoc3RlcCA9IDA7IHN0ZXAgPCBNQU5USVNfRE1BX1RSX1VOSVRTOyBzdGVwKyspIHsKKwkJCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAiUklTQyBQUk9HIGxpbmU9WyVkXSwgc3RlcD1bJWRdIiwgbGluZSwgc3RlcCk7CisJCQlpZiAoc3RlcCA9PSAwKSB7CisJCQkJUklTQ19JTlNUUihyaXNjX3BvcywgUklTQ19XUklURQl8CisJCQkJCSAgIFJJU0NfSVJRCXwKKwkJCQkJICAgUklTQ19TVEFUVVMobGluZSkgfAorCQkJCQkgICBNQU5USVNfRE1BX1RSX0JZVEVTKTsKKwkJCX0gZWxzZSB7CisJCQkJUklTQ19JTlNUUihyaXNjX3BvcywgUklTQ19XUklURSB8IE1BTlRJU19ETUFfVFJfQllURVMpOworCQkJfQorCQkJUklTQ19JTlNUUihyaXNjX3BvcywgbWFudGlzLT5idWZfZG1hICsgYnVmX3Bvcyk7CisJCQlidWZfcG9zICs9IE1BTlRJU19ETUFfVFJfQllURVM7CisJCSAgfQogCX0KLQlSSVNDX0lOU1RSKFJJU0NfSlVNUCk7Ci0JUklTQ19JTlNUUihtYW50aXMtPnJpc2NfZG1hKTsKKwlSSVNDX0lOU1RSKHJpc2NfcG9zLCBSSVNDX0pVTVApOworCVJJU0NfSU5TVFIocmlzY19wb3MsIG1hbnRpcy0+cmlzY19kbWEpOwogfQogCiB2b2lkIG1hbnRpc19kbWFfc3RhcnQoc3RydWN0IG1hbnRpc19wY2kgKm1hbnRpcykKQEAgLTIxMCw3ICsxODgsNyBAQAogCW1td3JpdGUobW1yZWFkKE1BTlRJU19HUElGX0FERFIpIHwgTUFOVElTX0dQSUZfSElGUkRXUk4sIE1BTlRJU19HUElGX0FERFIpOwogCiAJbW13cml0ZSgwLCBNQU5USVNfRE1BX0NUTCk7Ci0JbWFudGlzLT5sYXN0X2Jsb2NrID0gbWFudGlzLT5maW5pc2hlZF9ibG9jayA9IDA7CisJbWFudGlzLT5sYXN0X2Jsb2NrID0gbWFudGlzLT5idXN5X2Jsb2NrID0gMDsKIAogCW1td3JpdGUobW1yZWFkKE1BTlRJU19JTlRfTUFTSykgfCBNQU5USVNfSU5UX1JJU0NJLCBNQU5USVNfSU5UX01BU0spOwogCkBAIC0yNDUsOSArMjIzLDkgQEAKIAlzdHJ1Y3QgbWFudGlzX3BjaSAqbWFudGlzID0gKHN0cnVjdCBtYW50aXNfcGNpICopIGRhdGE7CiAJc3RydWN0IG1hbnRpc19od2NvbmZpZyAqY29uZmlnID0gbWFudGlzLT5od2NvbmZpZzsKIAotCXdoaWxlIChtYW50aXMtPmxhc3RfYmxvY2sgIT0gbWFudGlzLT5maW5pc2hlZF9ibG9jaykgeworCXdoaWxlIChtYW50aXMtPmxhc3RfYmxvY2sgIT0gbWFudGlzLT5idXN5X2Jsb2NrKSB7CiAJCWRwcmludGsoTUFOVElTX0RFQlVHLCAxLCAibGFzdCBibG9jaz1bJWRdIGZpbmlzaGVkIGJsb2NrPVslZF0iLAotCQkJbWFudGlzLT5sYXN0X2Jsb2NrLCBtYW50aXMtPmZpbmlzaGVkX2Jsb2NrKTsKKwkJCW1hbnRpcy0+bGFzdF9ibG9jaywgbWFudGlzLT5idXN5X2Jsb2NrKTsKIAogCQkoY29uZmlnLT50c19zaXplID8gZHZiX2RteF9zd2ZpbHRlcl8yMDQgOiBkdmJfZG14X3N3ZmlsdGVyKQogCQkoJm1hbnRpcy0+ZGVtdXgsICZtYW50aXMtPmJ1Zl9jcHVbbWFudGlzLT5sYXN0X2Jsb2NrICogTUFOVElTX0JMT0NLX0JZVEVTXSwgTUFOVElTX0JMT0NLX0JZVEVTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdnAxMDQxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9tYW50aXMvbWFudGlzX3ZwMTA0MS5jCmluZGV4IDM4YTQzNmMuLjA3YWE4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL21hbnRpcy9tYW50aXNfdnAxMDQxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbWFudGlzL21hbnRpc192cDEwNDEuYwpAQCAtNTEsNyArNTEsNiBAQAogCXsgU1RCMDg5OV9ESVNSWF9TVDAgICAgIAksIDB4MDQgfSwKIAl7IFNUQjA4OTlfRElTUlhfU1QxICAgICAJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1BBUklUWSAgICAgCSwgMHgwMCB9LAotCXsgU1RCMDg5OV9ESVNGSUZPICAgICAgIAksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTU1RBVFVTCQksIDB4MjAgfSwKIAl7IFNUQjA4OTlfRElTRjIyICAgICAgICAJLCAweDk5IH0sCiAJeyBTVEIwODk5X0RJU0YyMlJYICAgICAgCSwgMHhhOCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQppbmRleCAyYmM5Njg3Li4xM2ViZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9NYWtlZmlsZQpAQCAtNiw5ICs2LDkgQEAKIAogb2JqLSQoQ09ORklHX0RWQl9OR0VORSkgKz0gbmdlbmUubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLwogCiAjIEZvciB0aGUgc3RhZ2luZyBDSSBkcml2ZXIgY3hkMjA5OQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZQppbmRleCA3YWMxMjg3Li43MDA4MjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9QTFVUTzIpICs9IHBsdXRvMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3B0MS9NYWtlZmlsZQppbmRleCBhNjZkYTE3Li5kODBkOGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wdDEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcHQxL01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogCiBvYmotJChDT05GSUdfRFZCX1BUMSkgKz0gZWFydGgtcHQxLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUgLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCmluZGV4IGM1NDE0MGIuLmYyMzNiNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX1NNU19VU0JfRFJWKSArPSBzbXN1c2Iubwogb2JqLSQoQ09ORklHX1NNU19TRElPX0RSVikgKz0gc21zc2Rpby5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQogCi1FWFRSQV9DRkxBR1MgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKK2NjZmxhZ3MteSArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXMtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCmluZGV4IGFmMTIxZGIuLjY4MGM3ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntcy1jYXJkcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKICNpbmNsdWRlICJzbXNpci5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgaW50IHNtc19kYmc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoY2FyZHNfZGJnLCBzbXNfZGJnLCBpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zZW5kaWFuLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYwppbmRleCA0NTdiNmQwLi5lMjY1N2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNlbmRpYW4uYwpAQCAtMTksNiArMTksNyBAQAogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgInNtc2VuZGlhbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zc2Rpby5jCmluZGV4IGU1N2QzOGIuLjkxZjhjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3NkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNzZGlvLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNtc2NvcmVhcGkuaCIKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc3VzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKaW5kZXggMGM4MTY0YS4uNTFjNzEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zdXNiLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNtc2NvcmVhcGkuaCIKICNpbmNsdWRlICJzbXMtY2FyZHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKaW5kZXggOGE0ZDViYi4uZjZlODY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUKQEAgLTE3LDUgKzE3LDUgQEAKIG9iai0kKENPTkZJR19EVkJfQlVER0VUX1BBVENIKSArPSBidWRnZXQtcGF0Y2gubwogb2JqLSQoQ09ORklHX0RWQl9BVjcxMTApICs9IGR2Yi10dHBjaS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfdjRsLmMKaW5kZXggY2RkMzFjYS4uZWU4ZWUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF92NGwuYwpAQCAtMjUsNiArMjUsOCBAQAogICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcvIAogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTI1Myw3ICsyNTUsNyBAQAogCiAJCXN3aXRjaCAoYXY3MTEwLT5jdXJyZW50X2lucHV0KSB7CiAJCWNhc2UgMToKLQkJCWRwcmludGsoMSwgInN3aXRjaGluZyBTQUE3MTEzIHRvIEFuYWxvZyBUdW5lciBJbnB1dC5cbiIpOworCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gQW5hbG9nIFR1bmVyIElucHV0XG4iKTsKIAkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwOCwgMHgwMDAwKTsgLy8gbG91ZHNwZWFrZXIgc291cmNlCiAJCQltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMDksIDB4MDAwMCk7IC8vIGhlYWRwaG9uZSBzb3VyY2UKIAkJCW1zcF93cml0ZXJlZyhhdjcxMTAsIE1TUF9XUl9EU1AsIDB4MDAwYSwgMHgwMDAwKTsgLy8gU0NBUlQgMSBzb3VyY2UKQEAgLTI2Myw3ICsyNjUsNyBAQAogCiAJCQlpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfVkVTMTgyMCkgewogCQkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGRldiwgMHgwOSwgMHgwZiwgMHg2MCkpCi0JCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKKwkJCQkJZHByaW50aygxLCAic2V0dGluZyBiYW5kIGluIGRlbW9kdWxhdG9yIGZhaWxlZFxuIik7CiAJCQl9IGVsc2UgaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1NUVjAyOTcpIHsKIAkJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8vIFREQTk4MTkgcGluMzAoVklGKQpAQCAtMjcyLDE3ICsyNzQsMTcgQEAKIAkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIHdyaXRlIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgotCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgQ1ZCUyBJbnB1dC5cbiIpOworCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgQ1ZCUyBJbnB1dFxuIik7CiAJCQlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg0OCwgMHgwMiwgMHhkMikgIT0gMSkKIAkJCQlkcHJpbnRrKDEsICJzYWE3MTEzIHdyaXRlIGZhaWxlZCBAIGNhcmQgJWQiLCBhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJZHByaW50aygxLCAic3dpdGNoaW5nIFNBQTcxMTMgdG8gVmlkZW8gQVYgWS9DIElucHV0LlxuIik7CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBWaWRlbyBBViBZL0MgSW5wdXRcbiIpOwogCQkJaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4NDgsIDB4MDIsIDB4ZDkpICE9IDEpCiAJCQkJZHByaW50aygxLCAic2FhNzExMyB3cml0ZSBmYWlsZWQgQCBjYXJkICVkIiwgYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBJbnB1dDogQVY3MTEwOiBTQUE3MTEzOiBpbnZhbGlkIGlucHV0LlxuIik7CisJCQlkcHJpbnRrKDEsICJzd2l0Y2hpbmcgU0FBNzExMyB0byBJbnB1dDogQVY3MTEwOiBTQUE3MTEzOiBpbnZhbGlkIGlucHV0XG4iKTsKIAkJfQogCX0gZWxzZSB7CiAJCWFkc3dpdGNoID0gMDsKQEAgLTI5OSw3ICszMDEsNyBAQAogCiAJCWlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9WRVMxODIwKSB7CiAJCQlpZiAodmVzMTgyMF93cml0ZXJlZyhkZXYsIDB4MDksIDB4MGYsIDB4MjApKQotCQkJCWRwcmludGsoMSwgInNldHRpbmcgYmFuZCBpbiBkZW1vZHVsYXRvciBmYWlsZWQuXG4iKTsKKwkJCQlkcHJpbnRrKDEsICJzZXR0aW5nIGJhbmQgaW4gZGVtb2R1bGF0b3IgZmFpbGVkXG4iKTsKIAkJfSBlbHNlIGlmIChhdjcxMTAtPmFuYWxvZ190dW5lcl9mbGFncyAmIEFOQUxPR19UVU5FUl9TVFYwMjk3KSB7CiAJCQlzYWE3MTQ2X3NldGdwaW8oZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsgLy8gVERBOTgxOSBwaW4zMChWSUYpCkBAIC00MTMsNyArNDE1LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9ICgoc3RydWN0IHNhYTcxNDZfZmggKilmaCktPmRldjsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKWRldi0+ZXh0X3ByaXY7CiAKLQlkcHJpbnRrKDIsICJWSURJT0NfR19GUkVROiBmcmVxOjB4JTA4eC5cbiIsIGYtPmZyZXF1ZW5jeSk7CisJZHByaW50aygyLCAiVklESU9DX0dfRlJFUTogZnJlcToweCUwOHhcbiIsIGYtPmZyZXF1ZW5jeSk7CiAKIAlpZiAoIWF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzIHx8IGF2NzExMC0+Y3VycmVudF9pbnB1dCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyOSw3ICs0MzEsNyBAQAogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gKChzdHJ1Y3Qgc2FhNzE0Nl9maCAqKWZoKS0+ZGV2OwogCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopZGV2LT5leHRfcHJpdjsKIAotCWRwcmludGsoMiwgIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHguXG4iLCBmLT5mcmVxdWVuY3kpOworCWRwcmludGsoMiwgIlZJRElPQ19TX0ZSRVFVRU5DWTogZnJlcToweCUwOHhcbiIsIGYtPmZyZXF1ZW5jeSk7CiAKIAlpZiAoIWF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzIHx8IGF2NzExMC0+Y3VycmVudF9pbnB1dCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY4OSwxMiArNjkxLDEyIEBACiAKIAlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg4MCwgMHgwLCAweDgwKSA9PSAxICYmCiAJICAgIGkyY193cml0ZXJlZyhhdjcxMTAsIDB4ODAsIDB4MCwgMCkgPT0gMSkgewotCQlwcmludGsoImR2Yi10dHBjaTogRFZCLUMgYW5hbG9nIG1vZHVsZSBAIGNhcmQgJWQgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBNU1AzNDAwXG4iLAorCQlwcl9pbmZvKCJEVkItQyBhbmFsb2cgbW9kdWxlIEAgY2FyZCAlZCBkZXRlY3RlZCwgaW5pdGlhbGl6aW5nIE1TUDM0MDBcbiIsCiAJCQlhdjcxMTAtPmR2Yl9hZGFwdGVyLm51bSk7CiAJCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfTVNQMzR4MDsKIAl9IGVsc2UgaWYgKGkyY193cml0ZXJlZyhhdjcxMTAsIDB4ODQsIDB4MCwgMHg4MCkgPT0gMSAmJgogCQkgICBpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDg0LCAweDAsIDApID09IDEpIHsKLQkJcHJpbnRrKCJkdmItdHRwY2k6IERWQi1DIGFuYWxvZyBtb2R1bGUgQCBjYXJkICVkIGRldGVjdGVkLCBpbml0aWFsaXppbmcgTVNQMzQxNVxuIiwKKwkJcHJfaW5mbygiRFZCLUMgYW5hbG9nIG1vZHVsZSBAIGNhcmQgJWQgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBNU1AzNDE1XG4iLAogCQkJYXY3MTEwLT5kdmJfYWRhcHRlci5udW0pOwogCQlhdjcxMTAtPmFkYWNfdHlwZSA9IERWQl9BREFDX01TUDM0eDU7CiAJfSBlbHNlCkBAIC03MTUsNyArNzE3LDcgQEAKIAltc3Bfd3JpdGVyZWcoYXY3MTEwLCBNU1BfV1JfRFNQLCAweDAwMGQsIDB4MTkwMCk7IC8vIHByZXNjYWxlIFNDQVJUCiAKIAlpZiAoaTJjX3dyaXRlcmVnKGF2NzExMCwgMHg0OCwgMHgwMSwgMHgwMCkhPTEpIHsKLQkJSU5GTygoInNhYTcxMTMgbm90IGFjY2Vzc2libGUuXG4iKSk7CisJCXByX2luZm8oInNhYTcxMTMgbm90IGFjY2Vzc2libGVcbiIpOwogCX0gZWxzZSB7CiAJCXU4ICppID0gc2FhNzExM19pbml0X3JlZ3M7CiAKQEAgLTczMyw3ICs3MzUsNyBAQAogCQkvKiBzZXR1cCBmb3IgRFZCIGJ5IGRlZmF1bHQgKi8KIAkJaWYgKGF2NzExMC0+YW5hbG9nX3R1bmVyX2ZsYWdzICYgQU5BTE9HX1RVTkVSX1ZFUzE4MjApIHsKIAkJCWlmICh2ZXMxODIwX3dyaXRlcmVnKGF2NzExMC0+ZGV2LCAweDA5LCAweDBmLCAweDIwKSkKLQkJCQlkcHJpbnRrKDEsICJzZXR0aW5nIGJhbmQgaW4gZGVtb2R1bGF0b3IgZmFpbGVkLlxuIik7CisJCQkJZHByaW50aygxLCAic2V0dGluZyBiYW5kIGluIGRlbW9kdWxhdG9yIGZhaWxlZFxuIik7CiAJCX0gZWxzZSBpZiAoYXY3MTEwLT5hbmFsb2dfdHVuZXJfZmxhZ3MgJiBBTkFMT0dfVFVORVJfU1RWMDI5NykgewogCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjkoU1REKQogCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAzLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5ODE5IHBpbjMwKFZJRikKQEAgLTc5Nyw3ICs3OTksNyBAQAogCXJldCA9IHNhYTcxNDZfdnZfaW5pdChkZXYsIHZ2X2RhdGEpOwogCiAJaWYgKHJldCkgewotCQlFUlIoKCJjYW5ub3QgaW5pdCBjYXB0dXJlIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCUVSUigiY2Fubm90IGluaXQgY2FwdHVyZSBkZXZpY2UuIHNraXBwaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXZ2X2RhdGEtPm9wcy52aWRpb2NfZW51bV9pbnB1dCA9IHZpZGlvY19lbnVtX2lucHV0OwpAQCAtODE0LDEyICs4MTYsMTIgQEAKIAl2dl9kYXRhLT5vcHMudmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0ID0gdmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0OwogCiAJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPnY0bF9kZXYsIGRldiwgImF2NzExMCIsIFZGTF9UWVBFX0dSQUJCRVIpKSB7Ci0JCUVSUigoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIGRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCUVSUigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgZGV2aWNlLiBza2lwcGluZ1xuIik7CiAJCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZhdjcxMTAtPnZiaV9kZXYsIGRldiwgImF2NzExMCIsIFZGTF9UWVBFX1ZCSSkpCi0JCUVSUigoImNhbm5vdCByZWdpc3RlciB2YmkgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlFUlIoImNhbm5vdCByZWdpc3RlciB2YmkgdjRsMiBkZXZpY2UuIHNraXBwaW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwppbmRleCBlOTU3ZDc2Li43OGQzMmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwpAQCAtMzMsNiArMzMsOCBAQAogICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcvIAogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgImJ1ZGdldC5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKICNpbmNsdWRlICJzdGIwODk5X2Rydi5oIgpAQCAtMTQ5LDcgKzE1MSw3IEBACiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMHhmZmYsIDEsIDAsIDEpOwogCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkgewogCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGVqZWN0ZWQgMVxuIik7CisJCXByX2luZm8oImNhbSBlamVjdGVkIDFcbiIpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTY4LDcgKzE3MCw3IEBACiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYml3cml0ZSgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgYWRkcmVzcyAmIDB4ZmZmLCAxLCB2YWx1ZSwgMCwgMSk7CiAJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKSB7CiAJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAyXG4iKTsKKwkJcHJfaW5mbygiY2FtIGVqZWN0ZWQgMlxuIik7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xODcsNyArMTg5LDcgQEAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXJlYWQoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAzLCAxLCAwLCAwKTsKIAlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKIAkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOwotCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDNcbiIpOworCQlwcl9pbmZvKCJjYW0gZWplY3RlZCAzXG4iKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXJldHVybiByZXN1bHQ7CkBAIC0yMDcsNyArMjA5LDcgQEAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXdyaXRlKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgdmFsdWUsIDAsIDApOwogCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkgewogCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2FtIGVqZWN0ZWQgNVxuIik7CisJCXByX2luZm8oImNhbSBlamVjdGVkIDVcbiIpOwogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjg5LDcgKzI5MSw3IEBACiAJCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikgewogCQkJaWYgKGJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPT0gU0xPVFNUQVRVU19OT05FKSB7CiAJCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IFNMT1RTVEFUVVNfUFJFU0VOVDsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBBXG4iKTsKKwkJCQlwcl9pbmZvKCJjYW0gaW5zZXJ0ZWQgQVxuIik7CiAJCQl9CiAJCX0KIAkJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsKQEAgLTMwNiwxMSArMzA4LDExIEBACiAJCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSk7CiAJCWlmICgocmVzdWx0ID49IDApICYmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkpIHsKIAkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1BSRVNFTlQ7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBCXG4iKTsKKwkJCXByX2luZm8oImNhbSBpbnNlcnRlZCBCXG4iKTsKIAkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKSB7CiAJCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAhPSBTTE9UU1RBVFVTX05PTkUpIHsKIAkJCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCA1XG4iKTsKKwkJCQlwcl9pbmZvKCJjYW0gZWplY3RlZCA1XG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMzY1LDExICszNjcsMTEgQEAKIAogCWlmICgocmVzdWx0ID0gZHZiX2NhX2VuNTAyMjFfaW5pdCgmYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIsCiAJCQkJCSAgJmJ1ZGdldF9hdi0+Y2EsIDAsIDEpKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBjaSBpbml0aWFsaXNhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJfZXJyKCJjaSBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkLlxuIik7CisJcHJfaW5mbygiY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkXG4iKTsKIAlyZXR1cm4gMDsKIAogZXJyb3I6CkBAIC04OTYsNyArODk4LDYgQEAKIAl7IFNUQjA4OTlfRElTUlhfU1QwCQksIDB4MDQgfSwKIAl7IFNUQjA4OTlfRElTUlhfU1QxCQksIDB4MDAgfSwKIAl7IFNUQjA4OTlfRElTUEFSSVRZCQksIDB4MDAgfSwKLQl7IFNUQjA4OTlfRElTRklGTwkJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1NUQVRVUwkJLCAweDIwIH0sCiAJeyBTVEIwODk5X0RJU0YyMgkJLCAweDhjIH0sCiAJeyBTVEIwODk5X0RJU0YyMlJYCQksIDB4OWEgfSwKQEAgLTExOTcsNiArMTE5OCw3IEBACiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMQkJCTB4MDAyMAogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkJMHgwMDIxCiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9NSzMJCTB4MDAyMgorI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfVERBMTAwMjQJMHgwMDI4CiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMwkweDAwMjMKICNkZWZpbmUgU1VCSURfRFZCQ19DSU5FUkdZMTIwMAkJMHgxMTU2CiAjZGVmaW5lIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszCTB4MTE3NgpAQCAtMTMxNiw2ICsxMzE4LDcgQEAKIAljYXNlIFNVQklEX0RWQkNfRUFTWVdBVENIX01LMzoKIAljYXNlIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszOgogCWNhc2UgU1VCSURfRFZCQ19LTkMxX01LMzoKKwljYXNlIFNVQklEX0RWQkNfS05DMV9UREExMDAyNDoKIAljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMzoKIAkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOwogCQlidWRnZXRfYXYtPmJ1ZGdldC5kZXYtPmkyY19iaXRyYXRlID0gU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzI0MDsKQEAgLTEzNDMsOCArMTM0Niw3IEBACiAJfQogCiAJaWYgKGZlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgIgotCQkJCSJmb3IgZGV2aWNlIFslMDR4OiUwNHhdIHN1YnN5c3RlbSBbJTA0eDolMDR4XVxuIiwKKwkJcHJfZXJyKCJBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgWyUwNHg6JTA0eF0gc3Vic3lzdGVtIFslMDR4OiUwNHhdXG4iLAogCQkgICAgICAgc2FhLT5wY2ktPnZlbmRvciwKIAkJICAgICAgIHNhYS0+cGNpLT5kZXZpY2UsCiAJCSAgICAgICBzYWEtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKQEAgLTEzNTYsNyArMTM1OCw3IEBACiAKIAlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKKwkJcHJfZXJyKCJGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7CiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKIAl9CkBAIC0xNDE0LDcgKzE0MTYsNyBAQAogCiBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JZHByaW50aygxLCAiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KTsKKwlkcHJpbnRrKDEsICJWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAJaWYgKGktPmluZGV4ID49IEtOQzFfSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHkoaSwgJmtuYzFfaW5wdXRzW2ktPmluZGV4XSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSk7CkBAIC0xNDI4LDcgKzE0MzAsNyBAQAogCiAJKmkgPSBidWRnZXRfYXYtPmN1cl9pbnB1dDsKIAotCWRwcmludGsoMSwgIlZJRElPQ19HX0lOUFVUICVkLlxuIiwgKmkpOworCWRwcmludGsoMSwgIlZJRElPQ19HX0lOUFVUICVkXG4iLCAqaSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzcsNyArMTQzOSw3IEBACiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYgPSAoKHN0cnVjdCBzYWE3MTQ2X2ZoICopZmgpLT5kZXY7CiAJc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2ID0gKHN0cnVjdCBidWRnZXRfYXYgKilkZXYtPmV4dF9wcml2OwogCi0JZHByaW50aygxLCAiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCk7CisJZHByaW50aygxLCAiVklESU9DX1NfSU5QVVQgJWRcbiIsIGlucHV0KTsKIAlyZXR1cm4gc2FhNzExM19zZXRpbnB1dChidWRnZXRfYXYsIGlucHV0KTsKIH0KIApAQCAtMTQ3Niw3ICsxNDc4LDcgQEAKIAogCQlpZiAoMCAhPSBzYWE3MTQ2X3Z2X2luaXQoZGV2LCAmdnZfZGF0YSkpIHsKIAkJCS8qIGZpeG1lOiBwcm9wZXIgY2xlYW51cCBoZXJlICovCi0JCQlFUlIoKCJjYW5ub3QgaW5pdCB2diBzdWJzeXN0ZW0uXG4iKSk7CisJCQlFUlIoImNhbm5vdCBpbml0IHZ2IHN1YnN5c3RlbVxuIik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXZ2X2RhdGEub3BzLnZpZGlvY19lbnVtX2lucHV0ID0gdmlkaW9jX2VudW1faW5wdXQ7CkBAIC0xNDg1LDcgKzE0ODcsNyBAQAogCiAJCWlmICgoZXJyID0gc2FhNzE0Nl9yZWdpc3Rlcl9kZXZpY2UoJmJ1ZGdldF9hdi0+dmQsIGRldiwgImtuYzEiLCBWRkxfVFlQRV9HUkFCQkVSKSkpIHsKIAkJCS8qIGZpeG1lOiBwcm9wZXIgY2xlYW51cCBoZXJlICovCi0JCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS5cbiIpKTsKKwkJCUVSUigiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2VcbiIpOwogCQkJc2FhNzE0Nl92dl9yZWxlYXNlKGRldik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CkBAIC0xNTAyLDEzICsxNTA0LDEyIEBACiAKIAltYWMgPSBidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5wcm9wb3NlZF9tYWM7CiAJaWYgKGkyY19yZWFkcmVncygmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsIDB4YTAsIDB4MzAsIG1hYywgNikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJLTkMxLSVkOiBDb3VsZCBub3QgcmVhZCBNQUMgZnJvbSBLTkMxIGNhcmRcbiIsCisJCXByX2VycigiS05DMS0lZDogQ291bGQgbm90IHJlYWQgTUFDIGZyb20gS05DMSBjYXJkXG4iLAogCQkgICAgICAgYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2FkYXB0ZXIubnVtKTsKIAkJbWVtc2V0KG1hYywgMCwgNik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiS05DMS0lZDogTUFDIGFkZHIgPSAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeFxuIiwKLQkJICAgICAgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9hZGFwdGVyLm51bSwKLQkJICAgICAgIG1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworCQlwcl9pbmZvKCJLTkMxLSVkOiBNQUMgYWRkciA9ICVwTVxuIiwKKwkJCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9hZGFwdGVyLm51bSwgbWFjKTsKIAl9CiAKIAlidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlci5wcml2ID0gYnVkZ2V0X2F2OwpAQCAtMTU1OCw2ICsxNTU5LDcgQEAKIE1BS0VfQlVER0VUX0lORk8oa25jMXNweDQsICJLTkMxIERWQi1TIFBsdXMgWDQiLCBCVURHRVRfS05DMVNQKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMWNwLCAiS05DMSBEVkItQyBQbHVzIiwgQlVER0VUX0tOQzFDUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjbWszLCAiS05DMSBEVkItQyBNSzMiLCBCVURHRVRfS05DMUNfTUszKTsKK01BS0VfQlVER0VUX0lORk8oa25jMWN0ZGExMDAyNCwgIktOQzEgRFZCLUMgVERBMTAwMjQiLCBCVURHRVRfS05DMUNfVERBMTAwMjQpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxY3BtazMsICJLTkMxIERWQi1DIFBsdXMgTUszIiwgQlVER0VUX0tOQzFDUF9NSzMpOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxdHAsICJLTkMxIERWQi1UIFBsdXMiLCBCVURHRVRfS05DMVRQKTsKIE1BS0VfQlVER0VUX0lORk8oY2luMTIwMHMsICJUZXJyYVRlYyBDaW5lcmd5IDEyMDAgRFZCLVMiLCBCVURHRVRfQ0lOMTIwMFMpOwpAQCAtMTU4Nyw2ICsxNTg5LDcgQEAKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWMsIDB4MTg5NCwgMHgwMDIwKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwLCAweDE4OTQsIDB4MDAyMSksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjbWszLCAweDE4OTQsIDB4MDAyMiksCisJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjdGRhMTAwMjQsIDB4MTg5NCwgMHgwMDI4KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwbWszLCAweDE4OTQsIDB4MDAyMyksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0LCAweDE4OTQsIDB4MDAzMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0cCwgMHgxODk0LCAweDAwMzEpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCA5MjZmMjk5Li5jYTAyZTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtMTA1Myw3ICsxMDUzLDYgQEAKIAl7IFNUQjA4OTlfRElTUlhfU1QwICAgICAJLCAweDA0IH0sCiAJeyBTVEIwODk5X0RJU1JYX1NUMSAgICAgCSwgMHgwMCB9LAogCXsgU1RCMDg5OV9ESVNQQVJJVFkgICAgIAksIDB4MDAgfSwKLQl7IFNUQjA4OTlfRElTRklGTyAgICAgICAJLCAweDAwIH0sCiAJeyBTVEIwODk5X0RJU1NUQVRVUwkJLCAweDIwIH0sCiAJeyBTVEIwODk5X0RJU0YyMiAgICAgICAgCSwgMHg4YyB9LAogCXsgU1RCMDg5OV9ESVNGMjJSWCAgICAgIAksIDB4OWEgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCmluZGV4IDM3NjY2ZDQuLjM3ZDAyZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgQlVER0VUX0NJTjEyMDBDX01LMzoKIAljYXNlIEJVREdFVF9LTkMxQ19NSzM6CisJY2FzZSBCVURHRVRfS05DMUNfVERBMTAwMjQ6CiAJY2FzZSBCVURHRVRfS05DMUNQX01LMzoKIAkJaWYgKGJ1ZGdldC0+dmlkZW9fcG9ydCA9PSBCVURHRVRfVklERU9fUE9SVEEpIHsKIAkJCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfSU5JVCwgMHgwNjAwMDIwMCk7CkBAIC00MzQsNiArNDM1LDcgQEAKIAljYXNlIEJVREdFVF9LTkMxQ1A6CiAJY2FzZSBCVURHRVRfQ0lOMTIwMEM6CiAJY2FzZSBCVURHRVRfS05DMUNfTUszOgorCWNhc2UgQlVER0VUX0tOQzFDX1REQTEwMDI0OgogCWNhc2UgQlVER0VUX0tOQzFDUF9NSzM6CiAJY2FzZSBCVURHRVRfQ0lOMTIwMENfTUszOgogCQlidWRnZXQtPmJ1ZmZlcl93aWR0aCA9IFRTX1dJRFRIX0RWQkM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCmluZGV4IDNhZDBjNjcuLjNkOGE4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oCkBAIC0xMDQsNiArMTA0LDcgQEAKICNkZWZpbmUgQlVER0VUX0tOQzFDX01LMwkgICAxNgogI2RlZmluZSBCVURHRVRfS05DMUNQX01LMwkgICAxNwogI2RlZmluZSBCVURHRVRfS05DMVMyICAgICAgICAgICAgICAxOAorI2RlZmluZSBCVURHRVRfS05DMUNfVERBMTAwMjQJICAgMTkKIAogI2RlZmluZSBCVURHRVRfVklERU9fUE9SVEEgICAgICAgICAwCiAjZGVmaW5lIEJVREdFVF9WSURFT19QT1JUQiAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKaW5kZXggN2RkNTRiMy4uMzJkNDMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvdHRwY2ktZWVwcm9tLmMKQEAgLTg1LDYgKzg1LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB0dHBjaV9lZXByb21fZGVjb2RlX21hYyh1OCAqZGVjb2RlZE1BQywgdTggKmVuY29kZWRNQUMpCit7CisJdTggeG9yWzIwXSA9IHsgMHg3MiwgMHgyMywgMHg2OCwgMHgxOSwgMHg1YywgMHhhOCwgMHg3MSwgMHgyYywKKwkJICAgICAgIDB4NTQsIDB4ZDMsIDB4N2IsIDB4ZjEsIDB4OUUsIDB4MjMsIDB4MTYsIDB4ZjYsCisJCSAgICAgICAweDFkLCAweDM2LCAweDY0LCAweDc4fTsKKwl1OCBkYXRhWzIwXTsKKwlpbnQgaTsKKworCW1lbWNweShkYXRhLCBlbmNvZGVkTUFDLCAyMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKKwkJZGF0YVtpXSBePSB4b3JbaV07CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCWRhdGFbaV0gPSAoKGRhdGFbMiAqIGkgKyAxXSA8PCA4KSB8IGRhdGFbMiAqIGldKQorCQkJPj4gKChkYXRhWzIgKiBpICsgMV0gPj4gNikgJiAzKTsKKworCWlmIChjaGVja19tYWNfdHQoZGF0YSkpCisJCXJldHVybiAtRU5PREVWOworCisJZGVjb2RlZE1BQ1swXSA9IGRhdGFbMl07CisJZGVjb2RlZE1BQ1sxXSA9IGRhdGFbMV07CisJZGVjb2RlZE1BQ1syXSA9IGRhdGFbMF07CisJZGVjb2RlZE1BQ1szXSA9IGRhdGFbNl07CisJZGVjb2RlZE1BQ1s0XSA9IGRhdGFbNV07CisJZGVjb2RlZE1BQ1s1XSA9IGRhdGFbNF07CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHR0cGNpX2VlcHJvbV9kZWNvZGVfbWFjKTsKKwogc3RhdGljIGludCB0dHBjaV9lZXByb21fcmVhZF9lbmNvZGVkTUFDKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggKiBlbmNvZGVkTUFDKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS90dHBjaS1lZXByb20uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCmluZGV4IGUyZGM2Y2YuLmRjYzMzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL3R0cGNpLWVlcHJvbS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAorZXh0ZXJuIGludCB0dHBjaV9lZXByb21fZGVjb2RlX21hYyh1OCAqZGVjb2RlZE1BQywgdTggKmVuY29kZWRNQUMpOwogZXh0ZXJuIGludCB0dHBjaV9lZXByb21fcGFyc2VfbWFjKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggKnByb3BzZWRfbWFjKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvTWFrZWZpbGUKaW5kZXggZmJlMmI5NS4uOGQ2YzRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKIG9iai0kKENPTkZJR19EVkJfVFRVU0JfQlVER0VUKSArPSBkdmItdHR1c2ItYnVkZ2V0Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvIC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy9NYWtlZmlsZQppbmRleCAyZDcwYTgyLi5lZDI4YjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0RWQl9UVFVTQl9ERUMpICs9IHR0dXNiX2RlYy5vIHR0dXNiZGVjZmUubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvbWVkaWEtZGV2aWNlLmMKaW5kZXggMTZiNzBiNC4uNmVkYzliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9tZWRpYS1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL21lZGlhLWRldmljZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L21lZGlhLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1kZXZub2RlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggNTI3OThhMS4uY2NkNWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtNDI2LDcgKzQyNiw2IEBACiBjb25maWcgUkFESU9fV0wxMjczCiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFdMMTI3MyBJMkMgRk0gUmFkaW8iCiAJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgotCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBNRkRfV0wxMjczX0NPUkUKIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKaW5kZXggZjQ4NGE2ZS4uMzkwZGFmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCkBAIC0yNyw0ICsyNyw0IEBACiBvYmotJChDT05GSUdfUkFESU9fV0wxMjczKSArPSByYWRpby13bDEyNzMubwogb2JqLSQoQ09ORklHX1JBRElPX1dMMTI4WCkgKz0gd2wxMjh4LwogCi1FWFRSQV9DRkxBR1MgKz0gLUlzb3VuZAorY2NmbGFncy15ICs9IC1Jc291bmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2k0NzEzLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNpNDcxMy5jCmluZGV4IDQ0NGI0Y2YuLmQxZmFiNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2k0NzEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zaTQ3MTMuYwpAQCAtOTIsMTAgKzkyLDYgQEAKIHN0YXRpYyBpbnQgcmFkaW9fc2k0NzEzX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXBhYmlsaXR5KQogewotCXN0cnVjdCByYWRpb19zaTQ3MTNfZGV2aWNlICpyc2RldjsKLQotCXJzZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7Ci0KIAlzdHJsY3B5KGNhcGFiaWxpdHktPmRyaXZlciwgInJhZGlvLXNpNDcxMyIsIHNpemVvZihjYXBhYmlsaXR5LT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsICJTaWxpY29uIExhYnMgU2k0NzEzIE1vZHVsYXRvciIsCiAJCQkJc2l6ZW9mKGNhcGFiaWxpdHktPmNhcmQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVhNTc2NC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKaW5kZXggOTVkZGNjNC4uZGIyMDkwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKQEAgLTEyOCw4ICsxMjgsMTAgQEAKIAl1MTYgcmRzYmJsOwkJCQkvKiBQQVVTRURFVCAmIFJEU0JCTCAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLSNpZm5kZWYgUkFESU9fVEVBNTc2NF9YVEFMCisjaWZkZWYgQ09ORklHX1JBRElPX1RFQTU3NjRfWFRBTAogI2RlZmluZSBSQURJT19URUE1NzY0X1hUQUwgMQorI2Vsc2UKKyNkZWZpbmUgUkFESU9fVEVBNTc2NF9YVEFMIDAKICNlbmRpZgogCiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCmluZGV4IGYxN2I1NDAuLjNlOTIwOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3RpbWJfcmFkaW8uaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGltYi1yYWRpbyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jCmluZGV4IDQ2Y2FjZjguLjhhYTQ5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bDEyNzMtY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMjEwOSw3ICsyMTEwLDcgQEAKIAkJCQkgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUiwKIAkJCQkgMCwgMjU1LCAxLCAyNTUpOwogCWlmIChjdHJsKQotCQljdHJsLT5pc192b2xhdGlsZSA9IDE7CisJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCiAJaWYgKHJhZGlvLT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKIAkJciA9IHJhZGlvLT5jdHJsX2hhbmRsZXIuZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKaW5kZXggNGNmNTM3MC4uYTZhZDcwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwpAQCAtMzk1LDcgKzM5NSw2IEBACiBzdGF0aWMgdm9pZCBzaTQ3MHhfaW50X2luX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3Qgc2k0NzB4X2RldmljZSAqcmFkaW8gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciBidWZbUkRTX1JFUE9SVF9TSVpFXTsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGNoYXIgcmVnbnI7CiAJdW5zaWduZWQgY2hhciBibG9ja251bTsKQEAgLTQyMyw3ICs0MjIsNiBAQAogCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKIAkJLyogVXBkYXRlIFJEUyByZWdpc3RlcnMgd2l0aCBVUkIgZGF0YSAqLwotCQlidWZbMF0gPSBSRFNfUkVQT1JUOwogCQlmb3IgKHJlZ25yID0gMDsgcmVnbnIgPCBSRFNfUkVHSVNURVJfTlVNOyByZWducisrKQogCQkJcmFkaW8tPnJlZ2lzdGVyc1tTVEFUVVNSU1NJICsgcmVnbnJdID0KIAkJCSAgICBnZXRfdW5hbGlnbmVkX2JlMTYoJnJhZGlvLT5pbnRfaW5fYnVmZmVyWwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcxMy1pMmMuYwppbmRleCBjOWY0YThlNi4uMjdhYmE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MTMtaTJjLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMKaW5kZXggZWMxZDUyZi4uNGY1YzQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYwpAQCAtMjgsNiArMjgsOCBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlICJmbWRydi5oIgogI2luY2x1ZGUgImZtZHJ2X3Y0bDIuaCIKICNpbmNsdWRlICJmbWRydl9jb21tb24uaCIKQEAgLTg0LDEyICs4NiwxNCBAQAogCXJldCA9IGNvcHlfZnJvbV91c2VyKCZyZHMsIGJ1Ziwgc2l6ZW9mKHJkcykpOwogCWZtZGJnKCIoJWQpdHlwZTogJWQsIHRleHQgJXMsIGFmICVkXG4iLAogCQkgICByZXQsIHJkcy50ZXh0X3R5cGUsIHJkcy50ZXh0LCByZHMuYWZfZnJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlmbWRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJZm1fdHhfc2V0X3JhZGlvX3RleHQoZm1kZXYsIHJkcy50ZXh0LCByZHMudGV4dF90eXBlKTsKIAlmbV90eF9zZXRfYWYoZm1kZXYsIHJkcy5hZl9mcmVxKTsKIAotCXJldHVybiAwOworCXJldHVybiBzaXplb2YocmRzKTsKIH0KIAogc3RhdGljIHUzMiBmbV92NGwyX2ZvcHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdHMpCkBAIC01NTcsNyArNTYxLDcgQEAKIAkJCTI1NSwgMSwgMjU1KTsKIAogCWlmIChjdHJsKQotCQljdHJsLT5pc192b2xhdGlsZSA9IDE7CisJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcKaW5kZXggODk5Zjc4My4uYWViN2Y0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZwpAQCAtNCw4ICs0LDggQEAKIAlkZWZhdWx0IElOUFVUCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFJlbW90ZSBDb250cm9sbGVycyBvbiBMaW51eC4gVGhpcyBpcwotCSAgbmVlZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgc2V2ZXJhbCB2aWRlbyBjYXB0dXJlIGFkYXB0ZXJzLgotCSAgQ3VycmVudGx5LCBhbGwgc3VwcG9ydGVkIGRldmljZXMgdXNlIEluZnJhUmVkLgorCSAgbmVlZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgc2V2ZXJhbCB2aWRlbyBjYXB0dXJlIGFkYXB0ZXJzLAorCSAgc3RhbmRhbG9uZSBJUiByZWNlaXZlcnMvdHJhbnNtaXR0ZXJzLCBhbmQgUkYgcmVjZWl2ZXJzLgogCiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSB2aWRlbyBjYXB0dXJlIGJvYXJkIGV2ZW4KIAkgIGlmIHlvdSBkb24ndCBuZWVkIElSLCBhcyBvdGhlcndpc2UsIHlvdSBtYXkgbm90IGJlIGFibGUgdG8KQEAgLTEwOCw2ICsxMDgsMjUgQEAKIAkgICBFbmFibGUgdGhpcyBvcHRpb24gdG8gcGFzcyByYXcgSVIgdG8gYW5kIGZyb20gdXNlcnNwYWNlIHZpYQogCSAgIHRoZSBMSVJDIGludGVyZmFjZS4KIAorY29uZmlnIFJDX0FUSV9SRU1PVEUKKwl0cmlzdGF0ZSAiQVRJIC8gWDEwIGJhc2VkIFVTQiBSRiByZW1vdGUgY29udHJvbHMiCisJZGVwZW5kcyBvbiBVU0JfQVJDSF9IQVNfSENECisJZGVwZW5kcyBvbiBSQ19DT1JFCisJc2VsZWN0IFVTQgorCWhlbHAKKwkgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhbiBYMTAgYmFzZWQgVVNCIHJlbW90ZSBjb250cm9sLgorCSAgIFRoZXNlIGFyZSBSRiByZW1vdGVzIHdpdGggVVNCIHJlY2VpdmVycy4KKworCSAgIFN1Y2ggZGV2aWNlcyBpbmNsdWRlIHRoZSBBVEkgcmVtb3RlIHRoYXQgY29tZXMgd2l0aCBtYW55IG9mIEFUSSdzCisJICAgQWxsLUluLVdvbmRlciB2aWRlbyBjYXJkcywgdGhlIFgxMCAiTG9sYSIgcmVtb3RlLCBOVklESUEgUkYgcmVtb3RlLAorCSAgIE1lZGlvbiBSRiByZW1vdGUsIGFuZCBTbmFwU3RyZWFtIEZpcmVGbHkgcmVtb3RlLgorCisJICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgbW91c2UgcG9pbnRlciwgbGVmdCBhbmQgcmlnaHQgbW91c2UgYnV0dG9ucywKKwkgICBhbmQgbWFwcyBhbGwgdGhlIG90aGVyIHJlbW90ZSBidXR0b25zIHRvIGtleXByZXNzIGV2ZW50cy4KKworCSAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgIGNhbGxlZCBhdGlfcmVtb3RlLgorCiBjb25maWcgSVJfRU5FCiAJdHJpc3RhdGUgIkVORSBlSG9tZSBSZWNlaXZlci9UcmFuc2NlaXZlciAocG5wIGlkOiBFTkUwMTAwL0VORTAyeHh4KSIKIAlkZXBlbmRzIG9uIFBOUApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUKaW5kZXggZjIyNGRiMC4uMjE1NmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JjL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfSVJfTElSQ19DT0RFQykgKz0gaXItbGlyYy1jb2RlYy5vCiAKICMgc3RhbmQtYWxvbmUgSVIgcmVjZWl2ZXJzL3RyYW5zbWl0dGVycworb2JqLSQoQ09ORklHX1JDX0FUSV9SRU1PVEUpICs9IGF0aV9yZW1vdGUubwogb2JqLSQoQ09ORklHX0lSX0lNT04pICs9IGltb24ubwogb2JqLSQoQ09ORklHX0lSX0lURV9DSVIpICs9IGl0ZS1jaXIubwogb2JqLSQoQ09ORklHX0lSX01DRVVTQikgKz0gbWNldXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9hdGlfcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICogIFVTQiBBVEkgUmVtb3RlIHN1cHBvcnQKKyAqCisgKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBpa2kuZmk+CisgKiAgVmVyc2lvbiAyLjIuMCBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KKyAqICBWZXJzaW9uIDIuMS4xIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKKyAqCisgKiAgVGhpcyAyLjIuMCB2ZXJzaW9uIGlzIGEgcmV3cml0ZSAvIGNsZWFudXAgb2YgdGhlIDIuMS4xIGRyaXZlciwgaW5jbHVkaW5nCisgKiAgcG9ydGluZyB0byB0aGUgMi42IGtlcm5lbCBpbnRlcmZhY2VzLCBhbG9uZyB3aXRoIG90aGVyIG1vZGlmaWNhdGlvbgorICogIHRvIGJldHRlciBtYXRjaCB0aGUgc3R5bGUgb2YgdGhlIGV4aXN0aW5nIHVzYi9pbnB1dCBkcml2ZXJzLiAgSG93ZXZlciwgdGhlCisgKiAgcHJvdG9jb2wgYW5kIGhhcmR3YXJlIGhhbmRsaW5nIGlzIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIDIuMS4xLgorICoKKyAqICBUaGUgMi4xLjEgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gdGhlIHVzYmF0aV9yZW1vdGUgYW5kIHVzYmtiZCBkcml2ZXJzIGJ5CisgKiAgVm9qdGVjaCBQYXZsaWsuCisgKgorICogIENoYW5nZXM6CisgKgorICogIEZlYiAyMDA0OiBUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PgorICogICAgICAgICAgICBWZXJzaW9uIDIuMi4wCisgKiAgSnVuIDIwMDQ6IFRvcnJleSBIb2ZmbWFuIDx0aG9mZm1hbkBhcm5vci5uZXQ+CisgKiAgICAgICAgICAgIFZlcnNpb24gMi4yLjEKKyAqICAgICAgICAgICAgQWRkZWQga2V5IHJlcGVhdCBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5OgorICogICAgICAgICAgICAgICAgVmluY2VudCBWYW5hY2tlcmUgPHZhbmFja2VyZUBsaWYudW5pdi1tcnMuZnI+CisgKiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSAiTG9sYSIgcmVtb3RlIGNvbnRyaWJ1dGVkIGJ5OgorICogICAgICAgICAgICAgICAgU2V0aCBDb2huIDxzZXRoY29obkB5YWhvby5jb20+CisgKgorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICoKKyAqIEhhcmR3YXJlICYgc29mdHdhcmUgbm90ZXMKKyAqCisgKiBUaGVzZSByZW1vdGUgY29udHJvbHMgYXJlIGRpc3RyaWJ1dGVkIGJ5IEFUSSBhcyBwYXJ0IG9mIHRoZWlyCisgKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYQorICogIlVTQiBSZWNlaXZlciIgd2l0aCBtYW51ZmFjdHVyZXIgIlgxMCBXaXJlbGVzcyBUZWNobm9sb2d5IEluYyIuCisgKgorICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOgorICogICAgaHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bQorICogVGhlIExvbGEgaXMgc2ltaWxhciB0byB0aGUgQVRJIHJlbW90ZSBidXQgaGFzIG5vIG1vdXNlIHN1cHBvcnQsIGFuZCBzbGlnaHRseQorICogZGlmZmVyZW50IGtleXMuCisgKgorICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMKKyAqIHNpbXVsdGFuZW91c2x5IGJ5IGNvbmZpZ3VyaW5nIHRoZW0gdG8gdXNlIHNwZWNpZmljIGNoYW5uZWxzLgorICoKKyAqIFRoZSBSRiBwcm90b2NvbCB1c2VkIGJ5IHRoZSByZW1vdGUgc3VwcG9ydHMgMTYgZGlzdGluY3QgY2hhbm5lbHMsIDEgdG8gMTYuCisgKiBBY3R1YWxseSwgaXQgbWF5IGV2ZW4gc3VwcG9ydCBtb3JlLCBhdCBsZWFzdCBpbiBzb21lIHJldmlzaW9ucyBvZiB0aGUKKyAqIGhhcmR3YXJlLgorICoKKyAqIEVhY2ggcmVtb3RlIGNhbiBiZSBjb25maWd1cmVkIHRvIHRyYW5zbWl0IG9uIG9uZSBjaGFubmVsIGFzIGZvbGxvd3M6CisgKiAgIC0gUHJlc3MgYW5kIGhvbGQgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KKyAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uCisgKiAgIC0gV2hlbiBpdCBzdG9wcyBibGlua2luZywgaW5wdXQgdGhlIGNoYW5uZWwgY29kZSBhcyB0d28gZGlnaXRzLCBmcm9tIDAxCisgKiAgICAgdG8gMTYsIGFuZCBwcmVzcyB0aGUgaGFuZCBpY29uIGFnYWluLgorICoKKyAqIFRoZSB0aW1pbmcgY2FuIGJlIGEgbGl0dGxlIHRyaWNreS4gIFRyeSBsb2FkaW5nIHRoZSBtb2R1bGUgd2l0aCBkZWJ1Zz0xCisgKiB0byBoYXZlIHRoZSBrZXJuZWwgcHJpbnQgb3V0IG1lc3NhZ2VzIGFib3V0IHRoZSByZW1vdGUgY29udHJvbCBudW1iZXIKKyAqIGFuZCBtYXNrLiAgTm90ZTogZGVidWdnaW5nIHByaW50cyByZW1vdGUgbnVtYmVycyBhcyB6ZXJvLWJhc2VkIGhleGFkZWNpbWFsLgorICoKKyAqIFRoZSBkcml2ZXIgaGFzIGEgImNoYW5uZWxfbWFzayIgcGFyYW1ldGVyLiBUaGlzIGJpdG1hc2sgc3BlY2lmaWVzIHdoaWNoCisgKiBjaGFubmVscyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1vZHVsZS4gIFRvIG1hc2sgb3V0IGNoYW5uZWxzLCBqdXN0IGFkZAorICogYWxsIHRoZSAyXmNoYW5uZWxfbnVtYmVyIHZhbHVlcyB0b2dldGhlci4KKyAqCisgKiBGb3IgaW5zdGFuY2UsIHNldCBjaGFubmVsX21hc2sgPSAyXjQgPSAxNiAoYmluYXJ5IDEwMDAwKSB0byBtYWtlIGF0aV9yZW1vdGUKKyAqIGlnbm9yZSBzaWduYWxzIGNvbWluZyBmcm9tIHJlbW90ZSBjb250cm9scyB0cmFuc21pdHRpbmcgb24gY2hhbm5lbCA0LCBidXQKKyAqIGFjY2VwdCBhbGwgb3RoZXIgY2hhbm5lbHMuCisgKgorICogT3IsIHNldCBjaGFubmVsX21hc2sgPSA2NTUzMywgKDB4RkZGRCksIGFuZCBhbGwgY2hhbm5lbHMgZXhjZXB0IDEgd2lsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBUaGUgZGVmYXVsdCBpcyAwIChyZXNwb25kIHRvIGFsbCBjaGFubmVscykuIEJpdCAwIGFuZCBiaXRzIDE3LTMyIG9mIHRoaXMKKyAqIHBhcmFtZXRlciBhcmUgdW51c2VkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisKKy8qCisgKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24sIE1vZHVsZSBQYXJhbWV0ZXJzCisgKi8KKworI2RlZmluZSBBVElfUkVNT1RFX1ZFTkRPUl9JRAkJMHgwYmM3CisjZGVmaW5lIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQJCTB4MDAwMgorI2RlZmluZSBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDAzCisjZGVmaW5lIEFUSV9SRU1PVEVfUFJPRFVDVF9JRAkJMHgwMDA0CisjZGVmaW5lIE5WSURJQV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwMDUKKyNkZWZpbmUgTUVESU9OX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwNgorI2RlZmluZSBGSVJFRkxZX1JFTU9URV9QUk9EVUNUX0lECTB4MDAwOAorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMi4yLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICAgICAgICAgICJUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICAgICAgICAgIkFUSS9YMTAgUkYgVVNCIFJlbW90ZSBDb250cm9sIgorCisjZGVmaW5lIE5BTUVfQlVGU0laRSAgICAgIDgwICAgIC8qIHNpemUgb2YgcHJvZHVjdCBuYW1lLCBwYXRoIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgREFUQV9CVUZTSVpFICAgICAgNjMgICAgLyogc2l6ZSBvZiBVUkIgZGF0YSBidWZmZXJzICovCisKKy8qCisgKiBEdXBsaWNhdGUgZXZlbnQgZmlsdGVyaW5nIHRpbWUuCisgKiBTZXF1ZW50aWFsLCBpZGVudGljYWwgS0lORF9GSUxURVJFRCBpbnB1dHMgd2l0aCBsZXNzIHRoYW4KKyAqIEZJTFRFUl9USU1FIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZW0gYXJlIGNvbnNpZGVyZWQgYXMgcmVwZWF0CisgKiBldmVudHMuIFRoZSBoYXJkd2FyZSBnZW5lcmF0ZXMgNSBldmVudHMgZm9yIHRoZSBmaXJzdCBrZXlwcmVzcworICogYW5kIHdlIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudCBmb3IgYW4gYWNjdXJhdGUgcmVwZWF0CisgKiBiZWhhdmlvdXIuCisgKi8KKyNkZWZpbmUgRklMVEVSX1RJTUUJNjAgLyogbXNlYyAqLworI2RlZmluZSBSRVBFQVRfREVMQVkJNTAwIC8qIG1zZWMgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9tYXNrOworbW9kdWxlX3BhcmFtKGNoYW5uZWxfbWFzaywgdWxvbmcsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVsX21hc2ssICJCaXRtYXNrIG9mIHJlbW90ZSBjb250cm9sIGNoYW5uZWxzIHRvIGlnbm9yZSIpOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBleHRyYSBkZWJ1ZyBtZXNzYWdlcyBhbmQgaW5mb3JtYXRpb24iKTsKKworc3RhdGljIGludCByZXBlYXRfZmlsdGVyID0gRklMVEVSX1RJTUU7Cittb2R1bGVfcGFyYW0ocmVwZWF0X2ZpbHRlciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVwZWF0X2ZpbHRlciwgIlJlcGVhdCBmaWx0ZXIgdGltZSwgZGVmYXVsdCA9IDYwIG1zZWMiKTsKKworc3RhdGljIGludCByZXBlYXRfZGVsYXkgPSBSRVBFQVRfREVMQVk7Cittb2R1bGVfcGFyYW0ocmVwZWF0X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZXBlYXRfZGVsYXksICJEZWxheSBiZWZvcmUgc2VuZGluZyByZXBlYXRzLCBkZWZhdWx0ID0gNTAwIG1zZWMiKTsKKworc3RhdGljIGJvb2wgbW91c2UgPSB0cnVlOworbW9kdWxlX3BhcmFtKG1vdXNlLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW91c2UsICJFbmFibGUgbW91c2UgZGV2aWNlLCBkZWZhdWx0ID0geWVzIik7CisKKyNkZWZpbmUgZGJnaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKyN1bmRlZiBlcnIKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0ICwgIyMgYXJnKQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRpX3JlbW90ZV90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9BVElfWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBMT0xBMl9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9BVElfWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBBVElfUkVNT1RFX1BST0RVQ1RfSUQpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZylSQ19NQVBfQVRJX1gxMCB9LAorCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTlZJRElBX1JFTU9URV9QUk9EVUNUX0lEKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpUkNfTUFQX0FUSV9YMTAgfSwKKwl7IFVTQl9ERVZJQ0UoQVRJX1JFTU9URV9WRU5ET1JfSUQsIE1FRElPTl9SRU1PVEVfUFJPRFVDVF9JRCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKVJDX01BUF9NRURJT05fWDEwIH0sCisJeyBVU0JfREVWSUNFKEFUSV9SRU1PVEVfVkVORE9SX0lELCBGSVJFRkxZX1JFTU9URV9QUk9EVUNUX0lEKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpUkNfTUFQX1NOQVBTVFJFQU1fRklSRUZMWSB9LAorCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYXRpX3JlbW90ZV90YWJsZSk7CisKKy8qIEdldCBoaSBhbmQgbG93IGJ5dGVzIG9mIGEgMTYtYml0cyBpbnQgKi8KKyNkZWZpbmUgSEkoYSkJKCh1bnNpZ25lZCBjaGFyKSgoYSkgPj4gOCkpCisjZGVmaW5lIExPKGEpCSgodW5zaWduZWQgY2hhcikoKGEpICYgMHhmZikpCisKKyNkZWZpbmUgU0VORF9GTEFHX0lOX1BST0dSRVNTCTEKKyNkZWZpbmUgU0VORF9GTEFHX0NPTVBMRVRFCTIKKworLyogRGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MgKi8KK3N0YXRpYyBjaGFyIGluaXQxW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQgfTsKK3N0YXRpYyBjaGFyIGluaXQyW10gPSB7IDB4MDEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4MjAsIDB4MjAsIDB4MjAgfTsKKworc3RydWN0IGF0aV9yZW1vdGUgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJc3RydWN0IHJjX2RldiAqcmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCisJc3RydWN0IHVyYiAqaXJxX3VyYjsKKwlzdHJ1Y3QgdXJiICpvdXRfdXJiOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfaW47CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9vdXQ7CisJdW5zaWduZWQgY2hhciAqaW5idWY7CisJdW5zaWduZWQgY2hhciAqb3V0YnVmOworCWRtYV9hZGRyX3QgaW5idWZfZG1hOworCWRtYV9hZGRyX3Qgb3V0YnVmX2RtYTsKKworCXVuc2lnbmVkIGNoYXIgb2xkX2RhdGFbMl07ICAvKiBEZXRlY3QgZHVwbGljYXRlIGV2ZW50cyAqLworCXVuc2lnbmVkIGxvbmcgb2xkX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBhY2NfamlmZmllczsgIC8qIGhhbmRsZSBhY2NlbGVyYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIGZpcnN0X2ppZmZpZXM7CisKKwl1bnNpZ25lZCBpbnQgcmVwZWF0X2NvdW50OworCisJY2hhciByY19uYW1lW05BTUVfQlVGU0laRV07CisJY2hhciByY19waHlzW05BTUVfQlVGU0laRV07CisJY2hhciBtb3VzZV9uYW1lW05BTUVfQlVGU0laRV07CisJY2hhciBtb3VzZV9waHlzW05BTUVfQlVGU0laRV07CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWludCBzZW5kX2ZsYWdzOworCisJaW50IHVzZXJzOyAvKiAwLTIsIHVzZXJzIGFyZSByYyBhbmQgaW5wdXQgKi8KKwlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKK307CisKKy8qICJLaW5kcyIgb2YgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBoYXJkd2FyZSB0byB0aGUgZHJpdmVyLiAqLworI2RlZmluZSBLSU5EX0VORCAgICAgICAgMAorI2RlZmluZSBLSU5EX0xJVEVSQUwgICAgMSAgIC8qIFNpbXBseSBwYXNzIHRvIGlucHV0IHN5c3RlbSAqLworI2RlZmluZSBLSU5EX0ZJTFRFUkVEICAgMiAgIC8qIEFkZCBhcnRpZmljaWFsIGtleS11cCBldmVudHMsIGRyb3Aga2V5cmVwZWF0cyAqLworI2RlZmluZSBLSU5EX0xVICAgICAgICAgMyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCBkaWFnb25hbHMgLSBsZWZ0IHVwLCAqLworI2RlZmluZSBLSU5EX1JVICAgICAgICAgNCAgIC8qICAgcmlnaHQgdXAsICAqLworI2RlZmluZSBLSU5EX0xEICAgICAgICAgNSAgIC8qICAgbGVmdCBkb3duLCAqLworI2RlZmluZSBLSU5EX1JEICAgICAgICAgNiAgIC8qICAgcmlnaHQgZG93biAqLworI2RlZmluZSBLSU5EX0FDQ0VMICAgICAgNyAgIC8qIERpcmVjdGlvbmFsIGtleXBhZCAtIGxlZnQsIHJpZ2h0LCB1cCwgZG93bi4qLworCisvKiBUcmFuc2xhdGlvbiB0YWJsZSBmcm9tIGhhcmR3YXJlIG1lc3NhZ2VzIHRvIGlucHV0IGV2ZW50cy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXNob3J0IGtpbmQ7CisJdW5zaWduZWQgY2hhciBkYXRhMSwgZGF0YTI7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGNvZGU7CisJaW50IHZhbHVlOworfSAgYXRpX3JlbW90ZV90YmxbXSA9IHsKKwkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBheGVzICovCisJe0tJTkRfQUNDRUwsICAgMHgzNSwgMHg3MCwgRVZfUkVMLCBSRUxfWCwgLTF9LAkgLyogbGVmdCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4MzYsIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4MzcsIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwJIC8qIHVwICovCisJe0tJTkRfQUNDRUwsICAgMHgzOCwgMHg3MywgRVZfUkVMLCBSRUxfWSwgMX0sICAgIC8qIGRvd24gKi8KKwkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBkaWFnb25hbHMgKi8KKwl7S0lORF9MVSwgICAgICAweDM5LCAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLworCXtLSU5EX1JVLCAgICAgIDB4M2EsIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLworCXtLSU5EX0xELCAgICAgIDB4M2MsIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KKwl7S0lORF9SRCwgICAgICAweDNiLCAweDc2LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgZG93biAqLworCisJLyogIk1vdXNlIGJ1dHRvbiIgYnV0dG9ucyAqLworCXtLSU5EX0xJVEVSQUwsIDB4M2QsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHgzZSwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCisJe0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLworCisJLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCisJe0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCisJe0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLworCisJLyogTm9uLW1vdXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSByYy1jb3JlICovCisJe0tJTkRfRU5ELCAweDAwLCAweDAwLCBFVl9NQVggKyAxLCAwLCAwfQorfTsKKworLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBhdGlfcmVtb3RlX3NlbmRwYWNrZXQJKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlLCB1MTYgY21kLCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaXJxX291dAkJKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbgkJKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X3JlcG9ydAkoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9pbml0aWFsaXplCShzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSk7CitzdGF0aWMgaW50IGF0aV9yZW1vdGVfcHJvYmUJCShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9kaXNjb25uZWN0CShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCB0byByZWdpc3RlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYXRpX3JlbW90ZV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9ICJhdGlfcmVtb3RlIiwKKwkucHJvYmUgICAgICAgID0gYXRpX3JlbW90ZV9wcm9iZSwKKwkuZGlzY29ubmVjdCAgID0gYXRpX3JlbW90ZV9kaXNjb25uZWN0LAorCS5pZF90YWJsZSAgICAgPSBhdGlfcmVtb3RlX3RhYmxlLAorfTsKKworLyoKKyAqCWF0aV9yZW1vdGVfZHVtcF9pbnB1dAorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2R1bXAoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKGxlbiA9PSAxKSB7CisJCWlmIChkYXRhWzBdICE9ICh1bnNpZ25lZCBjaGFyKTB4ZmYgJiYgZGF0YVswXSAhPSAweDAwKQorCQkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgYnl0ZSAweCUwMnhcbiIsIGRhdGFbMF0pOworCX0gZWxzZSBpZiAobGVuID09IDQpCisJCWRldl93YXJuKGRldiwgIldlaXJkIGtleSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCWVsc2UKKwkJZGV2X3dhcm4oZGV2LCAiV2VpcmQgZGF0YSwgbGVuPSVkICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uLlxuIiwKKwkJICAgICBsZW4sIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF0sIGRhdGFbNV0pOworfQorCisvKgorICoJYXRpX3JlbW90ZV9vcGVuCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9vcGVuKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmYXRpX3JlbW90ZS0+b3Blbl9tdXRleCk7CisKKwlpZiAoYXRpX3JlbW90ZS0+dXNlcnMrKyAhPSAwKQorCQlnb3RvIG91dDsgLyogb25lIHdhcyBhbHJlYWR5IGFjdGl2ZSAqLworCisJLyogT24gZmlyc3Qgb3Blbiwgc3VibWl0IHRoZSByZWFkIHVyYiB3aGljaCB3YXMgc2V0IHVwIHByZXZpb3VzbHkuICovCisJYXRpX3JlbW90ZS0+aXJxX3VyYi0+ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKKwlpZiAodXNiX3N1Ym1pdF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYiwgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVJTzsKKwl9CisKK291dDoJbXV0ZXhfdW5sb2NrKCZhdGlfcmVtb3RlLT5vcGVuX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJYXRpX3JlbW90ZV9jbG9zZQorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2Nsb3NlKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCW11dGV4X2xvY2soJmF0aV9yZW1vdGUtPm9wZW5fbXV0ZXgpOworCWlmICgtLWF0aV9yZW1vdGUtPnVzZXJzID09IDApCisJCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwltdXRleF91bmxvY2soJmF0aV9yZW1vdGUtPm9wZW5fbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0ZGV2KTsKKwlyZXR1cm4gYXRpX3JlbW90ZV9vcGVuKGF0aV9yZW1vdGUpOworfQorCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQoreworCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXRkZXYpOworCWF0aV9yZW1vdGVfY2xvc2UoYXRpX3JlbW90ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9yY19vcGVuKHN0cnVjdCByY19kZXYgKnJkZXYpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSByZGV2LT5wcml2OworCXJldHVybiBhdGlfcmVtb3RlX29wZW4oYXRpX3JlbW90ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aV9yZW1vdGVfcmNfY2xvc2Uoc3RydWN0IHJjX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IHJkZXYtPnByaXY7CisJYXRpX3JlbW90ZV9jbG9zZShhdGlfcmVtb3RlKTsKK30KKworLyoKKyAqCQlhdGlfcmVtb3RlX2lycV9vdXQKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsCisJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJYXRpX3JlbW90ZS0+c2VuZF9mbGFncyB8PSBTRU5EX0ZMQUdfQ09NUExFVEU7CisJd21iKCk7CisJd2FrZV91cCgmYXRpX3JlbW90ZS0+d2FpdCk7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX3NlbmRwYWNrZXQKKyAqCisgKglVc2VkIHRvIHNlbmQgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MKKyAqLworc3RhdGljIGludCBhdGlfcmVtb3RlX3NlbmRwYWNrZXQoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUsIHUxNiBjbWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwkvKiBTZXQgdXAgb3V0X3VyYiAqLworCW1lbWNweShhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIgKyAxLCBkYXRhLCBMTyhjbWQpKTsKKwkoKGNoYXIgKikgYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKVswXSA9IEhJKGNtZCk7CisKKwlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gTE8oY21kKSArIDE7CisJYXRpX3JlbW90ZS0+b3V0X3VyYi0+ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKKwlhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzID0gU0VORF9GTEFHX0lOX1BST0dSRVNTOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKKwkJCSAic2VuZHBhY2tldDogdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoYXRpX3JlbW90ZS0+d2FpdCwKKwkJKChhdGlfcmVtb3RlLT5vdXRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB8fAorCQkJKGF0aV9yZW1vdGUtPnNlbmRfZmxhZ3MgJiBTRU5EX0ZMQUdfQ09NUExFVEUpKSwKKwkJSFopOworCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5vdXRfdXJiKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2V2ZW50X2xvb2t1cAorICovCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfZXZlbnRfbG9va3VwKGludCByZW0sIHVuc2lnbmVkIGNoYXIgZDEsIHVuc2lnbmVkIGNoYXIgZDIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspIHsKKwkJLyoKKwkJICogRGVjaWRlIGlmIHRoZSB0YWJsZSBlbnRyeSBtYXRjaGVzIHRoZSByZW1vdGUgaW5wdXQuCisJCSAqLworCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0uZGF0YTEgPT0gZDEgJiYKKwkJICAgIGF0aV9yZW1vdGVfdGJsW2ldLmRhdGEyID09IGQyKQorCQkJcmV0dXJuIGk7CisKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICoJYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsCisgKgorICogSW1wbGVtZW50cyBhY2NlbGVyYXRpb24gY3VydmUgZm9yIGRpcmVjdGlvbmFsIGNvbnRyb2wgcGFkCisgKiBJZiBlbGFwc2VkIHRpbWUgc2luY2UgbGFzdCBldmVudCBpcyA+IDEvNCBzZWNvbmQsIHVzZXIgInN0b3BwZWQiLAorICogc28gcmVzZXQgYWNjZWxlcmF0aW9uLiBPdGhlcndpc2UsIHVzZXIgaXMgcHJvYmFibHkgaG9sZGluZyB0aGUgY29udHJvbAorICogcGFkIGRvd24sIHNvIHdlIGluY3JlYXNlIGFjY2VsZXJhdGlvbiwgcmFtcGluZyB1cCBvdmVyIHR3byBzZWNvbmRzIHRvCisgKiBhIG1heGltdW0gc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGFjY2VsW10gPSB7IDEsIDIsIDQsIDYsIDksIDEzLCAyMCB9OworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgYWNjOworCisJaWYgKHRpbWVfYWZ0ZXIobm93LCBhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSkpIHsKKwkJYWNjID0gMTsKKwkJYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgPSBub3c7CisJfQorCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyNSkpKQorCQlhY2MgPSBhY2NlbFswXTsKKwllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKSkKKwkJYWNjID0gYWNjZWxbMV07CisJZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpCisJCWFjYyA9IGFjY2VsWzJdOworCWVsc2UgaWYgKHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+YWNjX2ppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApKSkKKwkJYWNjID0gYWNjZWxbM107CisJZWxzZSBpZiAodGltZV9iZWZvcmUobm93LCBhdGlfcmVtb3RlLT5hY2NfamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTUwMCkpKQorCQlhY2MgPSBhY2NlbFs0XTsKKwllbHNlIGlmICh0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPmFjY19qaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSkpCisJCWFjYyA9IGFjY2VsWzVdOworCWVsc2UKKwkJYWNjID0gYWNjZWxbNl07CisKKwlyZXR1cm4gYWNjOworfQorCisvKgorICoJYXRpX3JlbW90ZV9yZXBvcnRfaW5wdXQKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9yZXBvcnQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE9IGF0aV9yZW1vdGUtPmluYnVmOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGF0aV9yZW1vdGUtPmlkZXY7CisJaW50IGluZGV4ID0gLTE7CisJaW50IGFjYzsKKwlpbnQgcmVtb3RlX251bTsKKwl1bnNpZ25lZCBjaGFyIHNjYW5jb2RlWzJdOworCisJLyogRGVhbCB3aXRoIHN0cmFuZ2UgbG9va2luZyBpbnB1dHMgKi8KKwlpZiAoICh1cmItPmFjdHVhbF9sZW5ndGggIT0gNCkgfHwgKGRhdGFbMF0gIT0gMHgxNCkgfHwKKwkJKChkYXRhWzNdICYgMHgwZikgIT0gMHgwMCkgKSB7CisJCWF0aV9yZW1vdGVfZHVtcCgmdXJiLT5kZXYtPmRldiwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1hc2sgdW53YW50ZWQgcmVtb3RlIGNoYW5uZWxzLiAgKi8KKwkvKiBub3RlOiByZW1vdGVfbnVtIGlzIDAtYmFzZWQsIGNoYW5uZWwgMSBvbiByZW1vdGUgPT0gMCBoZXJlICovCisJcmVtb3RlX251bSA9IChkYXRhWzNdID4+IDQpICYgMHgwZjsKKwlpZiAoY2hhbm5lbF9tYXNrICYgKDEgPDwgKHJlbW90ZV9udW0gKyAxKSkpIHsKKwkJZGJnaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkiTWFza2VkIGlucHV0IGZyb20gY2hhbm5lbCAweCUwMng6IGRhdGEgJTAyeCwlMDJ4LCBtYXNrPSAweCUwMmx4XG4iLAorCQkJcmVtb3RlX251bSwgZGF0YVsxXSwgZGF0YVsyXSwgY2hhbm5lbF9tYXNrKTsKKwkJcmV0dXJuOworCX0KKworCXNjYW5jb2RlWzBdID0gKCgoZGF0YVsxXSAtICgocmVtb3RlX251bSArIDEpIDw8IDQpKSAmIDB4ZjApIHwgKGRhdGFbMV0gJiAweDBmKSk7CisKKwkvKgorCSAqIFNvbWUgZGV2aWNlcyAoZS5nLiBTbmFwU3RyZWFtIEZpcmVmbHkpIHVzZSA4MDgwIGFzIHRvZ2dsZSBjb2RlLAorCSAqIHNvIHdlIGhhdmUgdG8gY2xlYXIgdGhlbS4gVGhlIGZpcnN0IGJpdCBpcyBhIGJpdCB0cmlja3kgYXMgdGhlCisJICogIm5vbi10b2dnbGVkIiBzdGF0ZSBkZXBlbmRzIG9uIHJlbW90ZV9udW0sIHNvIHdlIHhvciBpdCB3aXRoIHRoZQorCSAqIHNlY29uZCBiaXQgd2hpY2ggaXMgb25seSB1c2VkIGZvciB0b2dnbGUuCisJICovCisJc2NhbmNvZGVbMF0gXj0gKGRhdGFbMl0gJiAweDgwKTsKKworCXNjYW5jb2RlWzFdID0gZGF0YVsyXSAmIH4weDgwOworCisJLyogTG9vayB1cCBldmVudCBjb2RlIGluZGV4IGluIG1vdXNlIHRyYW5zbGF0aW9uIHRhYmxlLiAqLworCWluZGV4ID0gYXRpX3JlbW90ZV9ldmVudF9sb29rdXAocmVtb3RlX251bSwgc2NhbmNvZGVbMF0sIHNjYW5jb2RlWzFdKTsKKworCWlmIChpbmRleCA+PSAwKSB7CisJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAorCQkJImNoYW5uZWwgMHglMDJ4OyBtb3VzZSBkYXRhICUwMngsJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCisJCQlyZW1vdGVfbnVtLCBkYXRhWzFdLCBkYXRhWzJdLCBpbmRleCwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUpOworCQlpZiAoIWRldikKKwkJCXJldHVybjsgLyogbm8gbW91c2UgZGV2aWNlICovCisJfSBlbHNlCisJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAorCQkJImNoYW5uZWwgMHglMDJ4OyBrZXkgZGF0YSAlMDJ4LCUwMngsIHNjYW5jb2RlICUwMngsJTAyeFxuIiwKKwkJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIHNjYW5jb2RlWzBdLCBzY2FuY29kZVsxXSk7CisKKworCWlmIChpbmRleCA+PSAwICYmIGF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kID09IEtJTkRfTElURVJBTCkgeworCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAorCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsCisJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUpOworCQlpbnB1dF9zeW5jKGRldik7CisKKwkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZGV4IDwgMCB8fCBhdGlfcmVtb3RlX3RibFtpbmRleF0ua2luZCA9PSBLSU5EX0ZJTFRFUkVEKSB7CisJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCQkvKiBGaWx0ZXIgZHVwbGljYXRlIGV2ZW50cyB3aGljaCBoYXBwZW4gInRvbyBjbG9zZSIgdG9nZXRoZXIuICovCisJCWlmIChhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9PSBkYXRhWzFdICYmCisJCSAgICBhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9PSBkYXRhWzJdICYmCisJCSAgICB0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzICsKKwkJCQkgICAgIG1zZWNzX3RvX2ppZmZpZXMocmVwZWF0X2ZpbHRlcikpKSB7CisJCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWF0aV9yZW1vdGUtPnJlcGVhdF9jb3VudCA9IDA7CisJCQlhdGlfcmVtb3RlLT5maXJzdF9qaWZmaWVzID0gbm93OworCQl9CisKKwkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPSBkYXRhWzFdOworCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9IGRhdGFbMl07CisJCWF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzID0gbm93OworCisJCS8qIEVuc3VyZSB3ZSBza2lwIGF0IGxlYXN0IHRoZSA0IGZpcnN0IGR1cGxpY2F0ZSBldmVudHMgKGdlbmVyYXRlZAorCQkgKiBieSBhIHNpbmdsZSBrZXlwcmVzcyksIGFuZCBjb250aW51ZSBza2lwcGluZyB1bnRpbCByZXBlYXRfZGVsYXkKKwkJICogbXNlY3MgaGF2ZSBwYXNzZWQKKwkJICovCisJCWlmIChhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPiAwICYmCisJCSAgICAoYXRpX3JlbW90ZS0+cmVwZWF0X2NvdW50IDwgNSB8fAorCQkgICAgIHRpbWVfYmVmb3JlKG5vdywgYXRpX3JlbW90ZS0+Zmlyc3RfamlmZmllcyArCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhyZXBlYXRfZGVsYXkpKSkpCisJCQlyZXR1cm47CisKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJLyogTm90IGEgbW91c2UgZXZlbnQsIGhhbmQgaXQgdG8gcmMtY29yZS4gKi8KKwkJCXUzMiByY19jb2RlID0gKHNjYW5jb2RlWzBdIDw8IDgpIHwgc2NhbmNvZGVbMV07CisKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB1c2UgdGhlIHJjLWNvcmUgcmVwZWF0IGhhbmRsaW5nIHlldCBhcworCQkJICogaXQgd291bGQgY2F1c2UgZ2hvc3QgcmVwZWF0cyB3aGljaCB3b3VsZCBiZSBhCisJCQkgKiByZWdyZXNzaW9uIGZvciB0aGlzIGRyaXZlci4KKwkJCSAqLworCQkJcmNfa2V5ZG93bl9ub3RpbWVvdXQoYXRpX3JlbW90ZS0+cmRldiwgcmNfY29kZSwKKwkJCQkJICAgICBkYXRhWzJdKTsKKwkJCXJjX2tleXVwKGF0aV9yZW1vdGUtPnJkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKKwkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlLCAxKTsKKwkJaW5wdXRfc3luYyhkZXYpOworCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAorCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsIDApOworCQlpbnB1dF9zeW5jKGRldik7CisKKwl9IGVsc2UgeworCisJCS8qCisJCSAqIE90aGVyIGV2ZW50IGtpbmRzIGFyZSBmcm9tIHRoZSBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCwgYW5kIGhhdmUgYW4KKwkJICogYWNjZWxlcmF0aW9uIGZhY3RvciBhcHBsaWVkIHRvIHRoZW0uICBXaXRob3V0IHRoaXMgYWNjZWxlcmF0aW9uLCB0aGUKKwkJICogY29udHJvbCBwYWQgaXMgbW9zdGx5IHVudXNhYmxlLgorCQkgKi8KKwkJYWNjID0gYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsKGF0aV9yZW1vdGUpOworCisJCXN3aXRjaCAoYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQpIHsKKwkJY2FzZSBLSU5EX0FDQ0VMOgorCQkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKKwkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSwKKwkJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUgKiBhY2MpOworCQkJYnJlYWs7CisJCWNhc2UgS0lORF9MVToKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgLWFjYyk7CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIC1hY2MpOworCQkJYnJlYWs7CisJCWNhc2UgS0lORF9SVToKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgYWNjKTsKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgLWFjYyk7CisJCQlicmVhazsKKwkJY2FzZSBLSU5EX0xEOgorCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9YLCAtYWNjKTsKKwkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWSwgYWNjKTsKKwkJCWJyZWFrOworCQljYXNlIEtJTkRfUkQ6CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIGFjYyk7CisJCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksIGFjYyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiYXRpX3JlbW90ZSBraW5kPSVkXG4iLAorCQkJCWF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kKTsKKwkJfQorCQlpbnB1dF9zeW5jKGRldik7CisKKwkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOworCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07CisJCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKKwl9Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2lycV9pbgorICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQlhdGlfcmVtb3RlX2lucHV0X3JlcG9ydCh1cmIpOworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1cmIgZXJyb3Igc3RhdHVzLCB1bmxpbms/IFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBOb256ZXJvIHVyYiBzdGF0dXMgJWRcbiIsCisJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCX0KKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIoKT0lZFxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworfQorCisvKgorICoJYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzCisgKi8KK3N0YXRpYyBpbnQgYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJCSAgICBzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKK3sKKwlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCBEQVRBX0JVRlNJWkUsIEdGUF9BVE9NSUMsCisJCQkJCSAgICAgICAmYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKKwlpZiAoIWF0aV9yZW1vdGUtPmluYnVmKQorCQlyZXR1cm4gLTE7CisKKwlhdGlfcmVtb3RlLT5vdXRidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQodWRldiwgREFUQV9CVUZTSVpFLCBHRlBfQVRPTUlDLAorCQkJCQkJJmF0aV9yZW1vdGUtPm91dGJ1Zl9kbWEpOworCWlmICghYXRpX3JlbW90ZS0+b3V0YnVmKQorCQlyZXR1cm4gLTE7CisKKwlhdGlfcmVtb3RlLT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0aV9yZW1vdGUtPmlycV91cmIpCisJCXJldHVybiAtMTsKKworCWF0aV9yZW1vdGUtPm91dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghYXRpX3JlbW90ZS0+b3V0X3VyYikKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycworICovCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKK3sKKwl1c2JfZnJlZV91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7CisJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOworCisJdXNiX2ZyZWVfY29oZXJlbnQoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAorCQlhdGlfcmVtb3RlLT5pbmJ1ZiwgYXRpX3JlbW90ZS0+aW5idWZfZG1hKTsKKworCXVzYl9mcmVlX2NvaGVyZW50KGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKKwkJYXRpX3JlbW90ZS0+b3V0YnVmLCBhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKK30KKworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9pbml0KHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXYgPSBhdGlfcmVtb3RlLT5pZGV2OworCWludCBpOworCisJaWRldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVMKTsKKwlpZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTEVGVCkgfAorCQlCSVRfTUFTSyhCVE5fUklHSFQpIHwgQklUX01BU0soQlROX1NJREUpIHwgQklUX01BU0soQlROX0VYVFJBKTsKKwlpZGV2LT5yZWxiaXRbMF0gPSBCSVRfTUFTSyhSRUxfWCkgfCBCSVRfTUFTSyhSRUxfWSk7CisJZm9yIChpID0gMDsgYXRpX3JlbW90ZV90YmxbaV0ua2luZCAhPSBLSU5EX0VORDsgaSsrKQorCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0udHlwZSA9PSBFVl9LRVkpCisJCQlzZXRfYml0KGF0aV9yZW1vdGVfdGJsW2ldLmNvZGUsIGlkZXYtPmtleWJpdCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBhdGlfcmVtb3RlKTsKKworCWlkZXYtPm9wZW4gPSBhdGlfcmVtb3RlX2lucHV0X29wZW47CisJaWRldi0+Y2xvc2UgPSBhdGlfcmVtb3RlX2lucHV0X2Nsb3NlOworCisJaWRldi0+bmFtZSA9IGF0aV9yZW1vdGUtPm1vdXNlX25hbWU7CisJaWRldi0+cGh5cyA9IGF0aV9yZW1vdGUtPm1vdXNlX3BoeXM7CisKKwl1c2JfdG9faW5wdXRfaWQoYXRpX3JlbW90ZS0+dWRldiwgJmlkZXYtPmlkKTsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2OworfQorCitzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX3JjX2luaXQoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCit7CisJc3RydWN0IHJjX2RldiAqcmRldiA9IGF0aV9yZW1vdGUtPnJkZXY7CisKKwlyZGV2LT5wcml2ID0gYXRpX3JlbW90ZTsKKwlyZGV2LT5kcml2ZXJfdHlwZSA9IFJDX0RSSVZFUl9TQ0FOQ09ERTsKKwlyZGV2LT5hbGxvd2VkX3Byb3RvcyA9IFJDX1RZUEVfT1RIRVI7CisJcmRldi0+ZHJpdmVyX25hbWUgPSAiYXRpX3JlbW90ZSI7CisKKwlyZGV2LT5vcGVuID0gYXRpX3JlbW90ZV9yY19vcGVuOworCXJkZXYtPmNsb3NlID0gYXRpX3JlbW90ZV9yY19jbG9zZTsKKworCXJkZXYtPmlucHV0X25hbWUgPSBhdGlfcmVtb3RlLT5yY19uYW1lOworCXJkZXYtPmlucHV0X3BoeXMgPSBhdGlfcmVtb3RlLT5yY19waHlzOworCisJdXNiX3RvX2lucHV0X2lkKGF0aV9yZW1vdGUtPnVkZXYsICZyZGV2LT5pbnB1dF9pZCk7CisJcmRldi0+ZGV2LnBhcmVudCA9ICZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldjsKK30KKworc3RhdGljIGludCBhdGlfcmVtb3RlX2luaXRpYWxpemUoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBhdGlfcmVtb3RlLT51ZGV2OworCWludCBwaXBlLCBtYXhwOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXRpX3JlbW90ZS0+d2FpdCk7CisKKwkvKiBTZXQgdXAgaXJxX3VyYiAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCW1heHAgPSAobWF4cCA+IERBVEFfQlVGU0laRSkgPyBEQVRBX0JVRlNJWkUgOiBtYXhwOworCisJdXNiX2ZpbGxfaW50X3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiLCB1ZGV2LCBwaXBlLCBhdGlfcmVtb3RlLT5pbmJ1ZiwKKwkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9pbiwgYXRpX3JlbW90ZSwKKwkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkludGVydmFsKTsKKwlhdGlfcmVtb3RlLT5pcnFfdXJiLT50cmFuc2Zlcl9kbWEgPSBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWE7CisJYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKiBTZXQgdXAgb3V0X3VyYiAqLworCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwltYXhwID0gKG1heHAgPiBEQVRBX0JVRlNJWkUpID8gREFUQV9CVUZTSVpFIDogbWF4cDsKKworCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+b3V0YnVmLAorCQkJIG1heHAsIGF0aV9yZW1vdGVfaXJxX291dCwgYXRpX3JlbW90ZSwKKwkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJJbnRlcnZhbCk7CisJYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+b3V0YnVmX2RtYTsKKwlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qIHNlbmQgaW5pdGlhbGl6YXRpb24gc3RyaW5ncyAqLworCWlmICgoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNCwgaW5pdDEpKSB8fAorCSAgICAoYXRpX3JlbW90ZV9zZW5kcGFja2V0KGF0aV9yZW1vdGUsIDB4ODAwNywgaW5pdDIpKSkgeworCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKKwkJCSAiSW5pdGlhbGl6aW5nIGF0aV9yZW1vdGUgaGFyZHdhcmUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJYXRpX3JlbW90ZV9wcm9iZQorICovCitzdGF0aWMgaW50IGF0aV9yZW1vdGVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2hvc3QgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnRfaW4sICplbmRwb2ludF9vdXQ7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGU7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCByY19kZXYgKnJjX2RldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWlmIChpZmFjZV9ob3N0LT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgeworCQllcnIoIiVzOiBVbmV4cGVjdGVkIGRlc2MuYk51bUVuZHBvaW50c1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbmRwb2ludF9pbiA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFswXS5kZXNjOworCWVuZHBvaW50X291dCA9ICZpZmFjZV9ob3N0LT5lbmRwb2ludFsxXS5kZXNjOworCisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50X2luKSkgeworCQllcnIoIiVzOiBVbmV4cGVjdGVkIGVuZHBvaW50X2luXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAobGUxNl90b19jcHUoZW5kcG9pbnRfaW4tPndNYXhQYWNrZXRTaXplKSA9PSAwKSB7CisJCWVycigiJXM6IGVuZHBvaW50X2luIG1lc3NhZ2Ugc2l6ZT09MD8gXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWF0aV9yZW1vdGUgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGF0aV9yZW1vdGUpLCBHRlBfS0VSTkVMKTsKKwlyY19kZXYgPSByY19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWF0aV9yZW1vdGUgfHwgIXJjX2RldikKKwkJZ290byBmYWlsMTsKKworCS8qIEFsbG9jYXRlIFVSQiBidWZmZXJzLCBVUkJzICovCisJaWYgKGF0aV9yZW1vdGVfYWxsb2NfYnVmZmVycyh1ZGV2LCBhdGlfcmVtb3RlKSkKKwkJZ290byBmYWlsMjsKKworCWF0aV9yZW1vdGUtPmVuZHBvaW50X2luID0gZW5kcG9pbnRfaW47CisJYXRpX3JlbW90ZS0+ZW5kcG9pbnRfb3V0ID0gZW5kcG9pbnRfb3V0OworCWF0aV9yZW1vdGUtPnVkZXYgPSB1ZGV2OworCWF0aV9yZW1vdGUtPnJkZXYgPSByY19kZXY7CisJYXRpX3JlbW90ZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCisJdXNiX21ha2VfcGF0aCh1ZGV2LCBhdGlfcmVtb3RlLT5yY19waHlzLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfcGh5cykpOworCXN0cmxjcHkoYXRpX3JlbW90ZS0+bW91c2VfcGh5cywgYXRpX3JlbW90ZS0+cmNfcGh5cywKKwkJc2l6ZW9mKGF0aV9yZW1vdGUtPm1vdXNlX3BoeXMpKTsKKworCXN0cmxjYXQoYXRpX3JlbW90ZS0+cmNfcGh5cywgIi9pbnB1dDAiLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfcGh5cykpOworCXN0cmxjYXQoYXRpX3JlbW90ZS0+bW91c2VfcGh5cywgIi9pbnB1dDEiLCBzaXplb2YoYXRpX3JlbW90ZS0+bW91c2VfcGh5cykpOworCisJaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikKKwkJc3RybGNweShhdGlfcmVtb3RlLT5yY19uYW1lLCB1ZGV2LT5tYW51ZmFjdHVyZXIsCisJCQlzaXplb2YoYXRpX3JlbW90ZS0+cmNfbmFtZSkpOworCisJaWYgKHVkZXYtPnByb2R1Y3QpCisJCXNucHJpbnRmKGF0aV9yZW1vdGUtPnJjX25hbWUsIHNpemVvZihhdGlfcmVtb3RlLT5yY19uYW1lKSwKKwkJCSAiJXMgJXMiLCBhdGlfcmVtb3RlLT5yY19uYW1lLCB1ZGV2LT5wcm9kdWN0KTsKKworCWlmICghc3RybGVuKGF0aV9yZW1vdGUtPnJjX25hbWUpKQorCQlzbnByaW50ZihhdGlfcmVtb3RlLT5yY19uYW1lLCBzaXplb2YoYXRpX3JlbW90ZS0+cmNfbmFtZSksCisJCQlEUklWRVJfREVTQyAiKCUwNHgsJTA0eCkiLAorCQkJbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQlsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJc25wcmludGYoYXRpX3JlbW90ZS0+bW91c2VfbmFtZSwgc2l6ZW9mKGF0aV9yZW1vdGUtPm1vdXNlX25hbWUpLAorCQkgIiVzIG1vdXNlIiwgYXRpX3JlbW90ZS0+cmNfbmFtZSk7CisKKwlpZiAoaWQtPmRyaXZlcl9pbmZvKQorCQlyY19kZXYtPm1hcF9uYW1lID0gKGNvbnN0IGNoYXIgKilpZC0+ZHJpdmVyX2luZm87CisJZWxzZQorCQlyY19kZXYtPm1hcF9uYW1lID0gUkNfTUFQX0FUSV9YMTA7CisKKwlhdGlfcmVtb3RlX3JjX2luaXQoYXRpX3JlbW90ZSk7CisJbXV0ZXhfaW5pdCgmYXRpX3JlbW90ZS0+b3Blbl9tdXRleCk7CisKKwkvKiBEZXZpY2UgSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24gLSBmaWxscyBpbiBhdGlfcmVtb3RlLT5pZGV2IGZyb20gdWRldi4gKi8KKwllcnIgPSBhdGlfcmVtb3RlX2luaXRpYWxpemUoYXRpX3JlbW90ZSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKworCS8qIFNldCB1cCBhbmQgcmVnaXN0ZXIgcmMgZGV2aWNlICovCisJZXJyID0gcmNfcmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPnJkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKKwkvKiB1c2Ugb3VyIGRlbGF5IGZvciByY19kZXYgKi8KKwlhdGlfcmVtb3RlLT5yZGV2LT5pbnB1dF9kZXYtPnJlcFtSRVBfREVMQVldID0gcmVwZWF0X2RlbGF5OworCisJLyogU2V0IHVwIGFuZCByZWdpc3RlciBtb3VzZSBpbnB1dCBkZXZpY2UgKi8KKwlpZiAobW91c2UpIHsKKwkJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJCWlmICghaW5wdXRfZGV2KQorCQkJZ290byBmYWlsNDsKKworCQlhdGlfcmVtb3RlLT5pZGV2ID0gaW5wdXRfZGV2OworCQlhdGlfcmVtb3RlX2lucHV0X2luaXQoYXRpX3JlbW90ZSk7CisJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw1OworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBhdGlfcmVtb3RlKTsKKwlyZXR1cm4gMDsKKworIGZhaWw1OglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWw0OglyY191bnJlZ2lzdGVyX2RldmljZShyY19kZXYpOworCXJjX2RldiA9IE5VTEw7CisgZmFpbDM6CXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYik7CisgZmFpbDI6CWF0aV9yZW1vdGVfZnJlZV9idWZmZXJzKGF0aV9yZW1vdGUpOworIGZhaWwxOglyY19mcmVlX2RldmljZShyY19kZXYpOworCWtmcmVlKGF0aV9yZW1vdGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2Rpc2Nvbm5lY3QKKyAqLworc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGU7CisKKwlhdGlfcmVtb3RlID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwlpZiAoIWF0aV9yZW1vdGUpIHsKKwkJZGV2X3dhcm4oJmludGVyZmFjZS0+ZGV2LCAiJXMgLSBudWxsIGRldmljZT9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXVzYl9raWxsX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYik7CisJaWYgKGF0aV9yZW1vdGUtPmlkZXYpCisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPmlkZXYpOworCXJjX3VucmVnaXN0ZXJfZGV2aWNlKGF0aV9yZW1vdGUtPnJkZXYpOworCWF0aV9yZW1vdGVfZnJlZV9idWZmZXJzKGF0aV9yZW1vdGUpOworCWtmcmVlKGF0aV9yZW1vdGUpOworfQorCisvKgorICoJYXRpX3JlbW90ZV9pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0aV9yZW1vdGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmF0aV9yZW1vdGVfZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBlcnJvciAjJWRcbiIsIHJlc3VsdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX1ZFUlNJT04gIjoiCisJCSAgICAgICBEUklWRVJfREVTQyAiXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKglhdGlfcmVtb3RlX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGF0aV9yZW1vdGVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZhdGlfcmVtb3RlX2RyaXZlcik7Cit9CisKKy8qCisgKgltb2R1bGUgc3BlY2lmaWNhdGlvbgorICovCisKK21vZHVsZV9pbml0KGF0aV9yZW1vdGVfaW5pdCk7Cittb2R1bGVfZXhpdChhdGlfcmVtb3RlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCmluZGV4IDJiOWMyNTY5Li5jZjEwZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKQEAgLTMwLDYgKzMwLDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC0xMTgsMzEgKzEyMCwzMSBAQAogCQkJZGV2LT5wbGxfZnJlcSA9PSBFTkVfREVGQVVMVF9QTExfRlJFUSA/IDIgOiA0OwogCiAJaWYgKGh3X3JldmlzaW9uID09IDB4RkYpIHsKLQkJZW5lX3dhcm4oImRldmljZSBzZWVtcyB0byBiZSBkaXNhYmxlZCIpOwotCQllbmVfd2Fybigic2VuZCBhIG1haWwgdG8gbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIpOwotCQllbmVfd2FybigicGxlYXNlIGF0dGFjaCBvdXRwdXQgb2YgYWNwaWR1bXAgYW5kIGRtaWRlY29kZSIpOworCQlwcl93YXJuKCJkZXZpY2Ugc2VlbXMgdG8gYmUgZGlzYWJsZWRcbiIpOworCQlwcl93YXJuKCJzZW5kIGEgbWFpbCB0byBsaXJjLWxpc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0XG4iKTsKKwkJcHJfd2FybigicGxlYXNlIGF0dGFjaCBvdXRwdXQgb2YgYWNwaWR1bXAgYW5kIGRtaWRlY29kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVuZV9ub3RpY2UoImNoaXAgaXMgMHglMDJ4JTAyeCAtIGtidmVyID0gMHglMDJ4LCByZXYgPSAweCUwMngiLAotCQljaGlwX21ham9yLCBjaGlwX21pbm9yLCBvbGRfdmVyLCBod19yZXZpc2lvbik7CisJcHJfbm90aWNlKCJjaGlwIGlzIDB4JTAyeCUwMnggLSBrYnZlciA9IDB4JTAyeCwgcmV2ID0gMHglMDJ4XG4iLAorCQkgIGNoaXBfbWFqb3IsIGNoaXBfbWlub3IsIG9sZF92ZXIsIGh3X3JldmlzaW9uKTsKIAotCWVuZV9ub3RpY2UoIlBMTCBmcmVxID0gJWQiLCBkZXYtPnBsbF9mcmVxKTsKKwlwcl9ub3RpY2UoIlBMTCBmcmVxID0gJWRcbiIsIGRldi0+cGxsX2ZyZXEpOwogCiAJaWYgKGNoaXBfbWFqb3IgPT0gMHgzMykgewotCQllbmVfd2FybigiY2hpcHMgMHgzM3h4IGFyZW4ndCBzdXBwb3J0ZWQiKTsKKwkJcHJfd2FybigiY2hpcHMgMHgzM3h4IGFyZW4ndCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoY2hpcF9tYWpvciA9PSAweDM5ICYmIGNoaXBfbWlub3IgPT0gMHgyNiAmJiBod19yZXZpc2lvbiA9PSAweEMwKSB7CiAJCWRldi0+aHdfcmV2aXNpb24gPSBFTkVfSFdfQzsKLQkJZW5lX25vdGljZSgiS0IzOTI2QyBkZXRlY3RlZCIpOworCQlwcl9ub3RpY2UoIktCMzkyNkMgZGV0ZWN0ZWRcbiIpOwogCX0gZWxzZSBpZiAob2xkX3ZlciA9PSAweDI0ICYmIGh3X3JldmlzaW9uID09IDB4QzApIHsKIAkJZGV2LT5od19yZXZpc2lvbiA9IEVORV9IV19COwotCQllbmVfbm90aWNlKCJLQjM5MjZCIGRldGVjdGVkIik7CisJCXByX25vdGljZSgiS0IzOTI2QiBkZXRlY3RlZFxuIik7CiAJfSBlbHNlIHsKIAkJZGV2LT5od19yZXZpc2lvbiA9IEVORV9IV19EOwotCQllbmVfbm90aWNlKCJLQjM5MjZEIG9yIGhpZ2hlciBkZXRlY3RlZCIpOworCQlwcl9ub3RpY2UoIktCMzkyNkQgb3IgaGlnaGVyIGRldGVjdGVkXG4iKTsKIAl9CiAKIAkvKiBkZXRlY3QgZmVhdHVyZXMgaGFyZHdhcmUgc3VwcG9ydHMgKi8KQEAgLTE1Miw3ICsxNTQsNyBAQAogCWZ3X3JlZzEgPSBlbmVfcmVhZF9yZWcoZGV2LCBFTkVfRlcxKTsKIAlmd19yZWcyID0gZW5lX3JlYWRfcmVnKGRldiwgRU5FX0ZXMik7CiAKLQllbmVfbm90aWNlKCJGaXJtd2FyZSByZWdzOiAlMDJ4ICUwMngiLCBmd19yZWcxLCBmd19yZWcyKTsKKwlwcl9ub3RpY2UoIkZpcm13YXJlIHJlZ3M6ICUwMnggJTAyeFxuIiwgZndfcmVnMSwgZndfcmVnMik7CiAKIAlkZXYtPmh3X3VzZV9ncGlvXzBhID0gISEoZndfcmVnMiAmIEVORV9GVzJfR1AwQSk7CiAJZGV2LT5od19sZWFybmluZ19hbmRfdHhfY2FwYWJsZSA9ICEhKGZ3X3JlZzIgJiBFTkVfRlcyX0xFQVJOSU5HKTsKQEAgLTE2MSwzMCArMTYzLDI5IEBACiAJaWYgKGRldi0+aHdfbGVhcm5pbmdfYW5kX3R4X2NhcGFibGUpCiAJCWRldi0+aHdfZmFuX2lucHV0ID0gISEoZndfcmVnMiAmIEVORV9GVzJfRkFOX0lOUFVUKTsKIAotCWVuZV9ub3RpY2UoIkhhcmR3YXJlIGZlYXR1cmVzOiIpOworCXByX25vdGljZSgiSGFyZHdhcmUgZmVhdHVyZXM6XG4iKTsKIAogCWlmIChkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlKSB7Ci0JCWVuZV9ub3RpY2UoIiogU3VwcG9ydHMgdHJhbnNtaXR0aW5nICYgbGVhcm5pbmcgbW9kZSIpOwotCQllbmVfbm90aWNlKCIgICBUaGlzIGZlYXR1cmUgaXMgcmFyZSBhbmQgdGhlcmVmb3JlLCIpOwotCQllbmVfbm90aWNlKCIgICB5b3UgYXJlIHdlbGNvbWUgdG8gdGVzdCBpdCwiKTsKLQkJZW5lX25vdGljZSgiICAgYW5kL29yIGNvbnRhY3QgdGhlIGF1dGhvciB2aWE6Iik7Ci0JCWVuZV9ub3RpY2UoIiAgIGxpcmMtbGlzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiKTsKLQkJZW5lX25vdGljZSgiICAgb3IgbWF4aW1sZXZpdHNreUBnbWFpbC5jb20iKTsKKwkJcHJfbm90aWNlKCIqIFN1cHBvcnRzIHRyYW5zbWl0dGluZyAmIGxlYXJuaW5nIG1vZGVcbiIpOworCQlwcl9ub3RpY2UoIiAgIFRoaXMgZmVhdHVyZSBpcyByYXJlIGFuZCB0aGVyZWZvcmUsXG4iKTsKKwkJcHJfbm90aWNlKCIgICB5b3UgYXJlIHdlbGNvbWUgdG8gdGVzdCBpdCxcbiIpOworCQlwcl9ub3RpY2UoIiAgIGFuZC9vciBjb250YWN0IHRoZSBhdXRob3IgdmlhOlxuIik7CisJCXByX25vdGljZSgiICAgbGlyYy1saXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJCXByX25vdGljZSgiICAgb3IgbWF4aW1sZXZpdHNreUBnbWFpbC5jb21cbiIpOwogCi0JCWVuZV9ub3RpY2UoIiogVXNlcyBHUElPICVzIGZvciBJUiByYXcgaW5wdXQiLAotCQkJZGV2LT5od191c2VfZ3Bpb18wYSA/ICI0MCIgOiAiMEEiKTsKKwkJcHJfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgcmF3IGlucHV0XG4iLAorCQkJICBkZXYtPmh3X3VzZV9ncGlvXzBhID8gIjQwIiA6ICIwQSIpOwogCiAJCWlmIChkZXYtPmh3X2Zhbl9pbnB1dCkKLQkJCWVuZV9ub3RpY2UoIiogVXNlcyB1bnVzZWQgZmFuIGZlZWRiYWNrIGlucHV0IGFzIHNvdXJjZSIKLQkJCQkJIiBvZiBkZW1vZHVsYXRlZCBJUiBkYXRhIik7CisJCQlwcl9ub3RpY2UoIiogVXNlcyB1bnVzZWQgZmFuIGZlZWRiYWNrIGlucHV0IGFzIHNvdXJjZSBvZiBkZW1vZHVsYXRlZCBJUiBkYXRhXG4iKTsKIAl9CiAKIAlpZiAoIWRldi0+aHdfZmFuX2lucHV0KQotCQllbmVfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgZGVtb2R1bGF0ZWQgaW5wdXQiLAotCQkJZGV2LT5od191c2VfZ3Bpb18wYSA/ICIwQSIgOiAiNDAiKTsKKwkJcHJfbm90aWNlKCIqIFVzZXMgR1BJTyAlcyBmb3IgSVIgZGVtb2R1bGF0ZWQgaW5wdXRcbiIsCisJCQkgIGRldi0+aHdfdXNlX2dwaW9fMGEgPyAiMEEiIDogIjQwIik7CiAKIAlpZiAoZGV2LT5od19leHRyYV9idWZmZXIpCi0JCWVuZV9ub3RpY2UoIiogVXNlcyBuZXcgc3R5bGUgaW5wdXQgYnVmZmVyIik7CisJCXByX25vdGljZSgiKiBVc2VzIG5ldyBzdHlsZSBpbnB1dCBidWZmZXJcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTUsMTMgKzIxNiwxMyBAQAogCiAJZGV2LT5idWZmZXJfbGVuID0gZGV2LT5leHRyYV9idWYxX2xlbiArIGRldi0+ZXh0cmFfYnVmMl9sZW4gKyA4OwogCi0JZW5lX25vdGljZSgiSGFyZHdhcmUgdXNlcyAyIGV4dGVuZGVkIGJ1ZmZlcnM6Iik7Ci0JZW5lX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZCIsIGRldi0+ZXh0cmFfYnVmMV9hZGRyZXNzLAotCQkJCQkJZGV2LT5leHRyYV9idWYxX2xlbik7Ci0JZW5lX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZCIsIGRldi0+ZXh0cmFfYnVmMl9hZGRyZXNzLAotCQkJCQkJZGV2LT5leHRyYV9idWYyX2xlbik7CisJcHJfbm90aWNlKCJIYXJkd2FyZSB1c2VzIDIgZXh0ZW5kZWQgYnVmZmVyczpcbiIpOworCXByX25vdGljZSgiICAweCUwNHggLSBsZW4gOiAlZFxuIiwKKwkJICBkZXYtPmV4dHJhX2J1ZjFfYWRkcmVzcywgZGV2LT5leHRyYV9idWYxX2xlbik7CisJcHJfbm90aWNlKCIgIDB4JTA0eCAtIGxlbiA6ICVkXG4iLAorCQkgIGRldi0+ZXh0cmFfYnVmMl9hZGRyZXNzLCBkZXYtPmV4dHJhX2J1ZjJfbGVuKTsKIAotCWVuZV9ub3RpY2UoIlRvdGFsIGJ1ZmZlciBsZW4gPSAlZCIsIGRldi0+YnVmZmVyX2xlbik7CisJcHJfbm90aWNlKCJUb3RhbCBidWZmZXIgbGVuID0gJWRcbiIsIGRldi0+YnVmZmVyX2xlbik7CiAKIAlpZiAoZGV2LT5idWZmZXJfbGVuID4gNjQgfHwgZGV2LT5idWZmZXJfbGVuIDwgMTYpCiAJCWdvdG8gZXJyb3I7CkBAIC0yNDAsNyArMjQxLDcgQEAKIAllbmVfc2V0X3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgRU5FX0ZXMV9FWFRSQV9CVUZfSE5EKTsKIAlyZXR1cm47CiBlcnJvcjoKLQllbmVfd2FybigiRXJyb3IgdmFsaWRhdGluZyBleHRyYSBidWZmZXJzLCBkZXZpY2UgcHJvYmFibHkgd29uJ3Qgd29yayIpOworCXByX3dhcm4oIkVycm9yIHZhbGlkYXRpbmcgZXh0cmEgYnVmZmVycywgZGV2aWNlIHByb2JhYmx5IHdvbid0IHdvcmtcbiIpOwogCWRldi0+aHdfZXh0cmFfYnVmZmVyID0gZmFsc2U7CiAJZW5lX2NsZWFyX3JlZ19tYXNrKGRldiwgRU5FX0ZXMSwgRU5FX0ZXMV9FWFRSQV9CVUZfSE5EKTsKIH0KQEAgLTU4OCw3ICs1ODksNyBAQAogCQlkYmcoIlRYOiBUcmFuc21pdHRlciAjMiBpcyBjb25uZWN0ZWQiKTsKIAogCWlmICghKGZ3cmVnMiAmIChFTkVfRlcyX0VNTUlURVIxX0NPTk4gfCBFTkVfRlcyX0VNTUlURVIyX0NPTk4pKSkKLQkJZW5lX3dhcm4oIlRYOiB0cmFuc21pdHRlciBjYWJsZSBpc24ndCBjb25uZWN0ZWQhIik7CisJCXByX3dhcm4oIlRYOiB0cmFuc21pdHRlciBjYWJsZSBpc24ndCBjb25uZWN0ZWQhXG4iKTsKIAogCS8qIGRpc2FibGUgcmVjZWl2ZSBvbiByZXZjICovCiAJaWYgKGRldi0+aHdfcmV2aXNpb24gPT0gRU5FX0hXX0MpCkBAIC02MTUsNyArNjE2LDcgQEAKIAlib29sIHB1bHNlID0gZGV2LT50eF9zYW1wbGVfcHVsc2U7CiAKIAlpZiAoIWRldi0+dHhfYnVmZmVyKSB7Ci0JCWVuZV93YXJuKCJUWDogQlVHOiBhdHRlbXB0IHRvIHRyYW5zbWl0IE5VTEwgYnVmZmVyIik7CisJCXByX3dhcm4oIlRYOiBCVUc6IGF0dGVtcHQgdG8gdHJhbnNtaXQgTlVMTCBidWZmZXJcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDQ5LDcgKzEwNTAsNyBAQAogCQlkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlID0gdHJ1ZTsKIAkJc2V0dXBfdGltZXIoJmRldi0+dHhfc2ltX3RpbWVyLCBlbmVfdHhfaXJxc2ltLAogCQkJCQkJKGxvbmcgdW5zaWduZWQgaW50KWRldik7Ci0JCWVuZV93YXJuKCJTaW11bGF0aW9uIG9mIFRYIGFjdGl2YXRlZCIpOworCQlwcl93YXJuKCJTaW11bGF0aW9uIG9mIFRYIGFjdGl2YXRlZFxuIik7CiAJfQogCiAJaWYgKCFkZXYtPmh3X2xlYXJuaW5nX2FuZF90eF9jYXBhYmxlKQpAQCAtMTA4OSw3ICsxMDkwLDcgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JZW5lX25vdGljZSgiZHJpdmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQiKTsKKwlwcl9ub3RpY2UoImRyaXZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkXG4iKTsKIAlyZXR1cm4gMDsKIGVycm9yOgogCWlmIChkZXYgJiYgZGV2LT5pcnEgPj0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmggYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5oCmluZGV4IDAxN2MyMDkuLmZkMTA4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaApAQCAtMTgyLDIwICsxODIsMTEgQEAKICNkZWZpbmUgIEVORV9IV19DCQkyCS8qIDM5MjZDICovCiAjZGVmaW5lICBFTkVfSFdfRAkJMwkvKiAzOTI2RCBvciBsYXRlciAqLwogCi0jZGVmaW5lIGVuZV9wcmludGsobGV2ZWwsIHRleHQsIC4uLikgXAotCXByaW50ayhsZXZlbCBFTkVfRFJJVkVSX05BTUUgIjogIiB0ZXh0ICJcbiIsICMjIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIGVuZV9ub3RpY2UodGV4dCwgLi4uKSBlbmVfcHJpbnRrKEtFUk5fTk9USUNFLCB0ZXh0LCAjIyBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgZW5lX3dhcm4odGV4dCwgLi4uKSBlbmVfcHJpbnRrKEtFUk5fV0FSTklORywgdGV4dCwgIyMgX19WQV9BUkdTX18pCi0KLQotI2RlZmluZSBfX2RiZyhsZXZlbCwgZm9ybWF0LCAuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnID49IGxldmVsKSBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyBFTkVfRFJJVkVSX05BTUUgXAotCQkJCSI6ICIgZm9ybWF0ICJcbiIsICMjIF9fVkFfQVJHU19fKTsgXAotCX0gd2hpbGUgKDApCi0KKyNkZWZpbmUgX19kYmcobGV2ZWwsIGZvcm1hdCwgLi4uKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKGRlYnVnID49IGxldmVsKQkJCQkJXAorCQlwcl9kZWJ1Zyhmb3JtYXQgIlxuIiwgIyMgX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBkYmcoZm9ybWF0LCAuLi4pCQlfX2RiZygxLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBkYmdfdmVyYm9zZShmb3JtYXQsIC4uLikJX19kYmcoMiwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKaW5kZXggNmJjMzVlZS4uNmVkOTY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTUxNiwxOSArNTE3LDE5IEBACiAJaWYgKHJldHZhbCkgewogCQlpY3R4LT50eC5idXN5ID0gZmFsc2U7CiAJCXNtcF9ybWIoKTsgLyogZW5zdXJlIGxhdGVyIHJlYWRlcnMga25vdyB3ZSdyZSBub3QgYnVzeSAqLwotCQlwcl9lcnIoImVycm9yIHN1Ym1pdHRpbmcgdXJiKCVkKVxuIiwgcmV0dmFsKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJlcnJvciBzdWJtaXR0aW5nIHVyYiglZClcbiIsIHJldHZhbCk7CiAJfSBlbHNlIHsKIAkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlIChvciBhYm9ydCkgKi8KIAkJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAkJcmV0dmFsID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAogCQkJCSZpY3R4LT50eC5maW5pc2hlZCk7CiAJCWlmIChyZXR2YWwpCi0JCQlwcl9lcnIoInRhc2sgaW50ZXJydXB0ZWRcbiIpOworCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ0YXNrIGludGVycnVwdGVkXG4iKTsKIAkJbXV0ZXhfbG9jaygmaWN0eC0+bG9jayk7CiAKIAkJcmV0dmFsID0gaWN0eC0+dHguc3RhdHVzOwogCQlpZiAocmV0dmFsKQotCQkJcHJfZXJyKCJwYWNrZXQgdHggZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInBhY2tldCB0eCBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKIAl9CiAKIAlrZnJlZShjb250cm9sX3JlcSk7CkBAIC04MzAsMjAgKzgzMSwyMCBAQAogCiAJaWN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoIWljdHgpIHsKLQkJcHJfZXJyKCJubyBjb250ZXh0IGZvciBkZXZpY2VcbiIpOworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIm5vIGNvbnRleHQgZm9yIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCW11dGV4X2xvY2soJmljdHgtPmxvY2spOwogCiAJaWYgKCFpY3R4LT5kZXZfcHJlc2VudF9pbnRmMCkgewotCQlwcl9lcnIoIm5vIGlNT04gZGV2aWNlIHByZXNlbnRcbiIpOworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIm5vIGlNT04gZGV2aWNlIHByZXNlbnRcbiIpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKG5fYnl0ZXMgPD0gMCB8fCBuX2J5dGVzID4gMzIpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHBheWxvYWQgc2l6ZVxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaW52YWxpZCBwYXlsb2FkIHNpemVcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODY5LDcgKzg3MCw3IEBACiAKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoaWN0eCk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLCBzZXEgLyAyKTsKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgic2VuZCBwYWNrZXQgIyVkIGZhaWxlZFxuIiwgc2VxIC8gMik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlzZXEgKz0gMjsKQEAgLTg4Myw3ICs4ODQsNyBAQAogCWljdHgtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOwogCXJldHZhbCA9IHNlbmRfcGFja2V0KGljdHgpOwogCWlmIChyZXR2YWwpCi0JCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLCBzZXEgLyAyKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJzZW5kIHBhY2tldCAjJWQgZmFpbGVkXG4iLCBzZXEgLyAyKTsKIAogZXhpdDoKIAltdXRleF91bmxvY2soJmljdHgtPmxvY2spOwpAQCAtOTEyLDIwICs5MTMsMjEgQEAKIAogCWljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFpY3R4KSB7Ci0JCXByX2Vycigibm8gY29udGV4dCBmb3IgZGV2aWNlXG4iKTsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJubyBjb250ZXh0IGZvciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAltdXRleF9sb2NrKCZpY3R4LT5sb2NrKTsKIAogCWlmICghaWN0eC0+ZGlzcGxheV9zdXBwb3J0ZWQpIHsKLQkJcHJfZXJyKCJubyBpTU9OIGRpc3BsYXkgcHJlc2VudFxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgibm8gaU1PTiBkaXNwbGF5IHByZXNlbnRcbiIpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKG5fYnl0ZXMgIT0gOCkgewotCQlwcl9lcnIoImludmFsaWQgcGF5bG9hZCBzaXplOiAlZCAoZXhwZWN0ZWQgOClcbiIsIChpbnQpbl9ieXRlcyk7CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaW52YWxpZCBwYXlsb2FkIHNpemU6ICVkIChleHBlY3RlZCA4KVxuIiwKKwkJCQkgICAoaW50KW5fYnl0ZXMpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtOTM3LDcgKzkzOSw3IEBACiAKIAlyZXR2YWwgPSBzZW5kX3BhY2tldChpY3R4KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic2VuZCBwYWNrZXQgZmFpbGVkIVxuIik7CisJCXByX2Vycl9yYXRlbGltaXRlZCgic2VuZCBwYWNrZXQgZmFpbGVkIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UgewogCQlkZXZfZGJnKGljdHgtPmRldiwgIiVzOiB3cml0ZSAlZCBieXRlcyB0byBMQ0RcbiIsCkBAIC0xNjU2LDcgKzE2NTgsNyBAQAogCQlyZXR1cm47CiAKIAlpY3R4ID0gKHN0cnVjdCBpbW9uX2NvbnRleHQgKil1cmItPmNvbnRleHQ7Ci0JaWYgKCFpY3R4KQorCWlmICghaWN0eCB8fCAhaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjApCiAJCXJldHVybjsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKQEAgLTE2ODgsNyArMTY5MCw3IEBACiAJCXJldHVybjsKIAogCWljdHggPSAoc3RydWN0IGltb25fY29udGV4dCAqKXVyYi0+Y29udGV4dDsKLQlpZiAoIWljdHgpCisJaWYgKCFpY3R4IHx8ICFpY3R4LT5kZXZfcHJlc2VudF9pbnRmMSkKIAkJcmV0dXJuOwogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewpAQCAtMjExNiw3ICsyMTE4LDYgQEAKIAogCWljdHgtPmRldiA9IGRldjsKIAlpY3R4LT51c2JkZXZfaW50ZjAgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKLQlpY3R4LT5kZXZfcHJlc2VudF9pbnRmMCA9IHRydWU7CiAJaWN0eC0+cnhfdXJiX2ludGYwID0gcnhfdXJiOwogCWljdHgtPnR4X3VyYiA9IHR4X3VyYjsKIAlpY3R4LT5yZl9kZXZpY2UgPSBmYWxzZTsKQEAgLTIxNTUsNiArMjE1Niw4IEBACiAJCWdvdG8gcmRldl9zZXR1cF9mYWlsZWQ7CiAJfQogCisJaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjAgPSB0cnVlOworCiAJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAlyZXR1cm4gaWN0eDsKIApAQCAtMjE5OCw3ICsyMjAxLDYgQEAKIAl9CiAKIAlpY3R4LT51c2JkZXZfaW50ZjEgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKLQlpY3R4LT5kZXZfcHJlc2VudF9pbnRmMSA9IHRydWU7CiAJaWN0eC0+cnhfdXJiX2ludGYxID0gcnhfdXJiOwogCiAJcmV0ID0gLUVOT0RFVjsKQEAgLTIyMjcsNiArMjIyOSw4IEBACiAJCWdvdG8gdXJiX3N1Ym1pdF9mYWlsZWQ7CiAJfQogCisJaWN0eC0+ZGV2X3ByZXNlbnRfaW50ZjEgPSB0cnVlOworCiAJbXV0ZXhfdW5sb2NrKCZpY3R4LT5sb2NrKTsKIAlyZXR1cm4gaWN0eDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1qdmMtZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pci1qdmMtZGVjb2Rlci5jCmluZGV4IDYyNDQ0OWEuLjAzNTY2OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItanZjLWRlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWp2Yy1kZWNvZGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCiAKICNkZWZpbmUgSlZDX05CSVRTCQkxNgkJLyogZGV2KDgpICsgZnVuYyg4KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1saXJjLWNvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwppbmRleCBlNWVlZWM0Li41ZmFiYTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgpAQCAtOTgsNyArOTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBpcl9saXJjX3RyYW5zbWl0X2lyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCBpcl9saXJjX3RyYW5zbWl0X2lyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgIHNpemVfdCBuLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGxpcmNfY29kZWMgKmxpcmM7CkBAIC0xNDAsMTAgKzE0MSwxMSBAQAogfQogCiBzdGF0aWMgbG9uZyBpcl9saXJjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgX191c2VyIGFyZykKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBsaXJjX2NvZGVjICpsaXJjOwogCXN0cnVjdCByY19kZXYgKmRldjsKKwl1MzIgX191c2VyICphcmdwID0gKHUzMiBfX3VzZXIgKikoYXJnKTsKIAlpbnQgcmV0ID0gMDsKIAlfX3UzMiB2YWwgPSAwLCB0bXA7CiAKQEAgLTE1Niw3ICsxNTgsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkgewotCQlyZXQgPSBnZXRfdXNlcih2YWwsIChfX3UzMiAqKWFyZyk7CisJCXJldCA9IGdldF91c2VyKHZhbCwgYXJncCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTI2NSw3ICsyNjcsNyBAQAogCX0KIAogCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQotCQlyZXQgPSBwdXRfdXNlcih2YWwsIChfX3UzMiAqKWFyZyk7CisJCXJldCA9IHB1dF91c2VyKHZhbCwgYXJncCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1uZWMtZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pci1uZWMtZGVjb2Rlci5jCmluZGV4IDYzZWU3MjIuLjE3ZjhkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItbmVjLWRlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW5lYy1kZWNvZGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCiAKICNkZWZpbmUgTkVDX05CSVRTCQkzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKaW5kZXggMjc4MDhiYjUuLjJlNWNkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwpAQCAtMTIsOCArMTIsMTAgQEAKICAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1kZWNvZGVyLmMKaW5kZXggZWJkYmE1NS4uOWFiNjYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYzUtZGVjb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM1LWRlY29kZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSQzVfTkJJVFMJCTE0CiAjZGVmaW5lIFJDNVhfTkJJVFMJCTIwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1zei1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNS1zei1kZWNvZGVyLmMKaW5kZXggOTBhYTg4Ni4uZWM4ZDRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYzUtc3otZGVjb2Rlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM1LXN6LWRlY29kZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSQzVfU1pfTkJJVFMJCTE1CiAjZGVmaW5lIFJDNV9VTklUCQk4ODg4ODggLyogbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM2LWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmM2LWRlY29kZXIuYwppbmRleCA3NTVkYWZhLi4xNDBmYjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJjNi1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYzYtZGVjb2Rlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgInJjLWNvcmUtcHJpdi5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogVGhpcyBkZWNvZGVyIGN1cnJlbnRseSBzdXBwb3J0czoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItc29ueS1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXNvbnktZGVjb2Rlci5jCmluZGV4IGE5MmRlODAuLmQ1ZTJiNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItc29ueS1kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1zb255LWRlY29kZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKIAogI2RlZmluZSBTT05ZX1VOSVQJCTYwMDAwMCAvKiBucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL01ha2VmaWxlCmluZGV4IGI1N2ZjODMuLjM2ZTRkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAJCQlyYy1hcGFjLXZpZXdjb21wLm8gXAogCQkJcmMtYXN1cy1wYzM5Lm8gXAogCQkJcmMtYXRpLXR2LXdvbmRlci1oZC02MDAubyBcCisJCQlyYy1hdGkteDEwLm8gXAogCQkJcmMtYXZlcm1lZGlhLWExNmQubyBcCiAJCQlyYy1hdmVybWVkaWEubyBcCiAJCQlyYy1hdmVybWVkaWEtY2FyZGJ1cy5vIFwKQEAgLTQ3LDYgKzQ4LDcgQEAKIAkJCXJjLWxpcmMubyBcCiAJCQlyYy1sbWUyNTEwLm8gXAogCQkJcmMtbWFubGkubyBcCisJCQlyYy1tZWRpb24teDEwLm8gXAogCQkJcmMtbXNpLWRpZ2l2b3gtaWkubyBcCiAJCQlyYy1tc2ktZGlnaXZveC1paWkubyBcCiAJCQlyYy1tc2ktdHZhbnl3aGVyZS5vIFwKQEAgLTcwLDYgKzcyLDcgQEAKIAkJCXJjLWhhdXBwYXVnZS5vIFwKIAkJCXJjLXJjNi1tY2UubyBcCiAJCQlyYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLm8gXAorCQkJcmMtc25hcHN0cmVhbS1maXJlZmx5Lm8gXAogCQkJcmMtc3RyZWFtemFwLm8gXAogCQkJcmMtdGJzLW5lYy5vIFwKIAkJCXJjLXRlY2huaXNhdC11c2IyLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFkc3RlY2gtZHZiLXQtcGNpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYwppbmRleCA5YTg3NTJmLi5iMGU0MmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYWRzdGVjaC1kdmItdC1wY2kuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQURTIFRlY2ggSW5zdGFudCBUViBEVkItVCBQQ0kgUmVtb3RlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbGluay1kdHUtbS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKaW5kZXggZmU2NTJlOS4uNGU2YWRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFsaW5rLWR0dS1tLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEEtTGluayBEVFUobSkgc2xpbSByZW1vdGUsIDYgcm93cywgMyBjb2x1bW5zLiAqLwogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYWxpbmtfZHR1X21bXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbnlzZWUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hbnlzZWUuYwppbmRleCA4ODRmMWI1Li5jNzM1ZmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFueXNlZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBhbnlzZWVbXSA9IHsKIAl7IDB4MDgwMCwgS0VZXzAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hcGFjLXZpZXdjb21wLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXBhYy12aWV3Y29tcC5jCmluZGV4IDdhZjE4ODIuLjhjOTJmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hcGFjLXZpZXdjb21wLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFwYWMtdmlld2NvbXAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXN1cy1wYzM5LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXN1cy1wYzM5LmMKaW5kZXggYjI0ODExNS4uMmNhZjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWFzdXMtcGMzOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hc3VzLXBjMzkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIE1hcmMgRmFyZ2FzIDx0ZWxlbmlla29AdGVsZW5pZWtvLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdGktdHYtd29uZGVyLWhkLTYwMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKaW5kZXggZjc2NmIyNC4uMjAzMTIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS10di13b25kZXItaGQtNjAwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFUSSBUViBXb25kZXIgSEQgNjAwIFVTQgogICAgRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdGkteDEwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXRpLXgxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjhiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXRpLXgxMC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQVRJIFgxMCBSRiByZW1vdGUga2V5dGFibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUA/a2kuZmk+CisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBzdGF0aWMgZ2VuZXJpYyBrZXl0YWJsZSBwcmV2aW91c2x5IGZvdW5kIGluCisgKiBhdGlfcmVtb3RlLmMsIHdoaWNoIGlzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9ycmV5IEhvZmZtYW4gPHRob2ZmbWFuQGFybm9yLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBWbGFkaW1pciBEZXJnYWNoZXYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYXRpX3gxMFtdID0geworCXsgMHhkMjBkLCBLRVlfMSB9LAorCXsgMHhkMzBlLCBLRVlfMiB9LAorCXsgMHhkNDBmLCBLRVlfMyB9LAorCXsgMHhkNTEwLCBLRVlfNCB9LAorCXsgMHhkNjExLCBLRVlfNSB9LAorCXsgMHhkNzEyLCBLRVlfNiB9LAorCXsgMHhkODEzLCBLRVlfNyB9LAorCXsgMHhkOTE0LCBLRVlfOCB9LAorCXsgMHhkYTE1LCBLRVlfOSB9LAorCXsgMHhkYzE3LCBLRVlfMCB9LAorCXsgMHhjNTAwLCBLRVlfQSB9LAorCXsgMHhjNjAxLCBLRVlfQiB9LAorCXsgMHhkZTE5LCBLRVlfQyB9LAorCXsgMHhlMDFiLCBLRVlfRCB9LAorCXsgMHhlNjIxLCBLRVlfRSB9LAorCXsgMHhlODIzLCBLRVlfRiB9LAorCisJeyAweGRkMTgsIEtFWV9LUEVOVEVSIH0sICAgIC8qICJjaGVjayIgKi8KKwl7IDB4ZGIxNiwgS0VZX01FTlUgfSwgICAgICAgLyogIm1lbnUiICovCisJeyAweGM3MDIsIEtFWV9QT1dFUiB9LCAgICAgIC8qIFBvd2VyICovCisJeyAweGM4MDMsIEtFWV9UViB9LCAgICAgICAgIC8qIFRWICovCisJeyAweGM5MDQsIEtFWV9EVkQgfSwgICAgICAgIC8qIERWRCAqLworCXsgMHhjYTA1LCBLRVlfV1dXIH0sICAgICAgICAvKiBXRUIgKi8KKwl7IDB4Y2IwNiwgS0VZX0JPT0tNQVJLUyB9LCAgLyogImJvb2siICovCisJeyAweGNjMDcsIEtFWV9FRElUIH0sICAgICAgIC8qICJoYW5kIiAqLworCXsgMHhlMTFjLCBLRVlfQ09GRkVFIH0sICAgICAvKiAidGltZXIiICovCisJeyAweGU1MjAsIEtFWV9GUk9OVCB9LCAgICAgIC8qICJtYXgiICovCisJeyAweGUyMWQsIEtFWV9MRUZUIH0sICAgICAgIC8qIGxlZnQgKi8KKwl7IDB4ZTQxZiwgS0VZX1JJR0hUIH0sICAgICAgLyogcmlnaHQgKi8KKwl7IDB4ZTcyMiwgS0VZX0RPV04gfSwgICAgICAgLyogZG93biAqLworCXsgMHhkZjFhLCBLRVlfVVAgfSwgICAgICAgICAvKiB1cCAqLworCXsgMHhlMzFlLCBLRVlfT0sgfSwgICAgICAgICAvKiAiT0siICovCisJeyAweGNlMDksIEtFWV9WT0xVTUVET1dOIH0sIC8qIFZPTCArICovCisJeyAweGNkMDgsIEtFWV9WT0xVTUVVUCB9LCAgIC8qIFZPTCAtICovCisJeyAweGNmMGEsIEtFWV9NVVRFIH0sICAgICAgIC8qIE1VVEUgICovCisJeyAweGQwMGIsIEtFWV9DSEFOTkVMVVAgfSwgIC8qIENIICsgKi8KKwl7IDB4ZDEwYywgS0VZX0NIQU5ORUxET1dOIH0sLyogQ0ggLSAqLworCXsgMHhlYzI3LCBLRVlfUkVDT1JEIH0sICAgICAvKiAoIG8pIHJlZCAqLworCXsgMHhlYTI1LCBLRVlfUExBWSB9LCAgICAgICAvKiAoID4pICovCisJeyAweGU5MjQsIEtFWV9SRVdJTkQgfSwgICAgIC8qICg8PCkgKi8KKwl7IDB4ZWIyNiwgS0VZX0ZPUldBUkQgfSwgICAgLyogKD4+KSAqLworCXsgMHhlZDI4LCBLRVlfU1RPUCB9LCAgICAgICAvKiAoW10pICovCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LCAgICAgIC8qICgnJykgKi8KKwl7IDB4ZjAyYiwgS0VZX1BSRVZJT1VTIH0sICAgLyogKDwtKSAqLworCXsgMHhlZjJhLCBLRVlfTkVYVCB9LCAgICAgICAvKiAoPispICovCisJeyAweGYyMmQsIEtFWV9JTkZPIH0sICAgICAgIC8qIFBMQVlJTkcgKi8KKwl7IDB4ZjMyZSwgS0VZX0hPTUUgfSwgICAgICAgLyogVE9QICovCisJeyAweGY0MmYsIEtFWV9FTkQgfSwgICAgICAgIC8qIEVORCAqLworCXsgMHhmNTMwLCBLRVlfU0VMRUNUIH0sICAgICAvKiBTRUxFQ1QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3QgYXRpX3gxMF9tYXAgPSB7CisJLm1hcCA9IHsKKwkJLnNjYW4gICAgPSBhdGlfeDEwLAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUoYXRpX3gxMCksCisJCS5yY190eXBlID0gUkNfVFlQRV9PVEhFUiwKKwkJLm5hbWUgICAgPSBSQ19NQVBfQVRJX1gxMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JjX21hcF9hdGlfeDEwKHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3RlcigmYXRpX3gxMF9tYXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yY19tYXBfYXRpX3gxMCh2b2lkKQoreworCXJjX21hcF91bnJlZ2lzdGVyKCZhdGlfeDEwX21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX2F0aV94MTApCittb2R1bGVfZXhpdChleGl0X3JjX21hcF9hdGlfeDEwKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtYTE2ZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKaW5kZXggZWM5YmVlZS4uODk0OTM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1hMTZkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGF2ZXJtZWRpYV9hMTZkW10gPSB7CiAJeyAweDIwLCBLRVlfTElTVH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWNhcmRidXMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCmluZGV4IDIyZjU0ZDQuLmQyYWFmNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtY2FyZGJ1cy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBPbGRyaWNoIEplZGxpY2thIDxvbGRpdW0ucHJvQHNlem5hbS5jej4gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1kdmJ0LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYwppbmRleCBjMjU4MDlkLi5kYzJiYWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLWR2YnQuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51ayAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW0xMzVhLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW0xMzVhLmMKaW5kZXggM2QyY2JlNC4uMDQyNjlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1tMTM1YS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTEzNWEuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEF2ZXJtZWRpYSBNMTM1QSB3aXRoIFJNLUpYIGFuZCBSTS1LNiByZW1vdGUgY29udHJvbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTczM2Etcm0tazYuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtbTczM2Etcm0tazYuYwppbmRleCA4Y2Q3ZjI4Li5lODNiMWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLW03MzNhLXJtLWs2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1tNzMzYS1ybS1rNi5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEF2ZXJtZWRpYSBNNzMzQSB3aXRoIElSIG1vZGVsIFJNLUs2CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLXJtLWtzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLXJtLWtzLmMKaW5kZXggOWQ2OGFmMi4uODM0NGJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS1ybS1rcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEtcm0ta3MuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogSW5pdGlhbCBrZXl0YWJsZSBpcyBmcm9tIEpvc2UgQWxiZXJ0byBSZWd1ZXJvIDxqYXJlZ3Vlcm9AdGVsZWZvbmljYS5uZXQ+CiAgICBhbmQgRmVsaXBlIE1vcmFsZXMgTW9yZW5vIDxmZWxpcGUubW9yYWxlcy5tb3Jlbm9AZ21haWwuY29tPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJtZWRpYS5jCmluZGV4IGVkZmE3MTUuLmM2MDYzZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVybWVkaWEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcm1lZGlhLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFsZXggSGVybWFubiA8Z2FhZkBnbXgubmV0PiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcnR2LTMwMy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF2ZXJ0di0zMDMuYwppbmRleCAzMmU5NDk4Li4xNGY3ODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXZlcnR2LTMwMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdmVydHYtMzAzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEFWRVJUViBTVFVESU8gMzAzIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXp1cmV3YXZlLWFkLXR1NzAwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXp1cmV3YXZlLWFkLXR1NzAwLmMKaW5kZXggYzNmNmQ2Mi4uZWE3ZjJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF6dXJld2F2ZS1hZC10dTcwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1henVyZXdhdmUtYWQtdHU3MDAuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYXp1cmV3YXZlX2FkX3R1NzAwW10gPSB7CiAJeyAweDAwMDAsIEtFWV9UQUIgfSwgICAgICAgICAgICAgLyogVGFiICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLWNvbHVtYnVzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLWNvbHVtYnVzLmMKaW5kZXggOGJmMDU4Zi4uMDg2YjRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC1jb2x1bWJ1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1iZWhvbGQtY29sdW1idXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQmVob2xkZXIgSW50bC4gTHRkLiAyMDA4CiAgKiBEbWl0cnkgQmVsaW1vdiBkLmJlbGltb3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJlaG9sZC5jCmluZGV4IGM5MDlhMjMuLjA4NzdlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1iZWhvbGQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYmVob2xkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBJZ29yIEt1em5ldHNvdiA8aWdrNzJAeWEucnU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYnVkZ2V0LWNpLW9sZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWJ1ZGdldC1jaS1vbGQuYwppbmRleCAyZjY2ZTQzLi44MzExZTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYnVkZ2V0LWNpLW9sZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1idWRnZXQtY2ktb2xkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBGcm9tIHJlYWRpbmcgdGhlIGZvbGxvd2luZyByZW1vdGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3ktMTQwMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3ktMTQwMC5jCmluZGV4IDI4NDUzNGIuLjBjODdmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1jaW5lcmd5LTE0MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS0xNDAwLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIENpbmVyZ3kgMTQwMCBEVkItVCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWNpbmVyZ3kuYwppbmRleCBjZjNhNmJmLi4zMDllOWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtY2luZXJneS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1jaW5lcmd5LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGNpbmVyZ3lbXSA9IHsKIAl7IDB4MDAsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZGliMDcwMC1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCmluZGV4IDdhNWY1MzAuLjRkMTNhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLW5lYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBkaWIwNzAwX25lY190YWJsZVtdID0gewogCS8qIEtleSBjb2RlcyBmb3IgdGhlIFBpeGVsdmlldyBTQlRWRCByZW1vdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWIwNzAwLXJjNS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKaW5kZXggNGFmMTJlNC4uYmE4MWQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpYjA3MDAtcmM1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGRpYjA3MDBfcmM1X3RhYmxlW10gPSB7CiAJLyogS2V5IGNvZGVzIGZvciB0aGUgdGlueSBQaW5uYWNsZSByZW1vdGUqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0YWxub3ctdGlueXR3aW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdGFsbm93LXRpbnl0d2luLmMKaW5kZXggZjY4YjQ1MC4uYmVkNzhhY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdGFsbm93LXRpbnl0d2luLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0YWxub3ctdGlueXR3aW4uYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZGlnaXRhbG5vd190aW55dHdpbltdID0gewogCXsgMHgwMDAwLCBLRVlfTVVURSB9LCAgICAgICAgICAgIC8qIFtzeW1ib2wgc3BlYWtlcl0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdHRyYWRlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZGlnaXR0cmFkZS5jCmluZGV4IDIxZDQ5ODcuLmEzYjk3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kaWdpdHRyYWRlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRpZ2l0dHJhZGUuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRGlnaXR0cmFkZSBEVkItVCBVU0IgU3RpY2sgcmVtb3RlIGNvbnRyb2xsZXIuICovCiAvKiBJbXBvcnRlZCBmcm9tIGFmOTAxNS5oLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRtMTEwNS1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbTExMDUtbmVjLmMKaW5kZXggZDAyNGZiZi4uNjdmYzlmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRtMTEwNS1uZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG0xMTA1LW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBEVkJXb3JsZCByZW1vdGVzCiAgICBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG1lLmJ5PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmItdC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmItdC5jCmluZGV4IDgyYzAyMDAuLjkxZWE5MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbnR2LWxpdmUtZHZiLXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2Yi10LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIERpZ2l0YWxOb3cgRE5UViBMaXZlIERWQi1UIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2YnQtcHJvLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZG50di1saXZlLWR2YnQtcHJvLmMKaW5kZXggMDE1ZTk5ZC4uZmQ2ODBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWRudHYtbGl2ZS1kdmJ0LXByby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1kbnR2LWxpdmUtZHZidC1wcm8uYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRGlnaXRhbE5vdyBETlRWIExpdmUhIERWQi1UIFBybyBSZW1vdGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVtLXRlcnJhdGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYwppbmRleCAyNjlkNDI5Li5kMWZjZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW0tdGVycmF0ZWMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZW1fdGVycmF0ZWNbXSA9IHsKIAl7IDB4MDEsIEtFWV9DSEFOTkVMIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LWZtNTMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCmluZGV4IGUzODg2OTguLjJmZTQ1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYtZm01My5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBFbmNvcmUgRU5MVFYtRk0gdjUuMwogICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2LmMKaW5kZXggZTU2YWM2ZS4uMjIzZGU3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogRW5jb3JlIEVOTFRWLUZNICAtIGJsYWNrIHBsYXN0aWMsIHdoaXRlIGZyb250IGNvdmVyIHdpdGggd2hpdGUgZ2xvd2luZyBidXR0b25zCiAgICAgSnVhbiBQYWJsbyBTb3JtYW5pIDxzb3JtYW5AZ21haWwuY29tPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0djIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lbmNvcmUtZW5sdHYyLmMKaW5kZXggYjYyNjRmMS4uNjY5Y2JmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWVuY29yZS1lbmx0djIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZW5jb3JlLWVubHR2Mi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBFbmNvcmUgRU5MVFYyLUZNICAtIHNpbHZlciBwbGFzdGljIC0gIldhbmQgTWVkaWEiIHdyaXR0ZW4gYXQgdGhlIGJvdHRvbgogICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV2Z2EtaW5kdHViZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV2Z2EtaW5kdHViZS5jCmluZGV4IGEyYmYyNGYuLjJjNjQ3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ldmdhLWluZHR1YmUuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZXZnYS1pbmR0dWJlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEVWR0EgaW5EdHViZQogICAgRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lenR2LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZXp0di5jCmluZGV4IDFlOGU1YjIuLjc2OTIxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1lenR2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWV6dHYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogQWxmb25zIEdlc2VyIDxhLmdlc2VyQGNveC5uZXQ+CiAgKiB1cGRhdGVzIGZyb20gSm9iIEQuIFIuIEJvcmdlcyA8am9iZHJiQGlnLmNvbS5icj4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mbHlkdmIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mbHlkdmIuYwppbmRleCBhOGIwZjY2Li4zYTZiYmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5ZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWZseWR2Yi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBmbHlkdmJbXSA9IHsKIAl7IDB4MDEsIEtFWV9aT09NIH0sCQkvKiBGdWxsIFNjcmVlbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWZseXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYwppbmRleCA1YmJlNjgzLi5iZjlkYTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZmx5dmlkZW8uYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgZmx5dmlkZW9bXSA9IHsKIAl7IDB4MGYsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZnVzaW9uaGR0di1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCmluZGV4IGM4MGIyNWMuLjJmMDk3MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1mdXNpb25oZHR2LW1jZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBEVmlDTyBGVVNJT04gSERUViBNQ0UgcmVtb3RlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nYWRtZWktcm0wMDh6LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2FkbWVpLXJtMDA4ei5jCmluZGV4IDA2OGM5ZWEuLjBlOThlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nYWRtZWktcm0wMDh6LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWdhZG1laS1ybTAwOHouYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogR0FETUVJIFVUVjMzMCsgUk0wMDhaIHJlbW90ZQogICAgU2hpbmUgTGl1IDxzaGluZWxAZm94bWFpbC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2VuaXVzLXR2Z28tYTExbWNlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ2VuaXVzLXR2Z28tYTExbWNlLmMKaW5kZXggY2RiYmVkNC4uYTJlMmZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWdlbml1cy10dmdvLWExMW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nZW5pdXMtdHZnby1hMTFtY2UuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFJlbW90ZSBjb250cm9sIGZvciB0aGUgR2VuaXVzIFRWR08gQTExTUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtZ290dmlldzcxMzUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCmluZGV4IGEzOGJkZGUuLjg2NDYxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1nb3R2aWV3NzEzNS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBNaWtlIEJhaWtvdiA8bWlrZUBiYWlrb3YuY29tPiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaGF1cHBhdWdlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaGF1cHBhdWdlLmMKaW5kZXggY2QzZGI3Ny4uZTUxYzYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWhhdXBwYXVnZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1oYXVwcGF1Z2UuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEhhdXBwYXVnZTp0aGUgbmV3ZXIsIGdyYXkgcmVtb3RlcyAoc2VlbXMgdGhlcmUgYXJlIG11bHRpcGxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCmluZGV4IDBlYTJhYTEuLjEyNGM3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pbW9uLW1jZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBtY2UtbW9kZSBpbW9uIG1jZSByZW1vdGUga2V5IHRhYmxlICovCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBpbW9uX21jZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWltb24tcGFkLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYwppbmRleCA3NWQzODQzLi45OTljNjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW1vbi1wYWQuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIHN0YW5kYXJkIGltb24gcmVtb3RlIGtleSB0YWJsZSwgd2hpY2ggaXNuJ3QgcmVhbGx5IGVudGlyZWx5CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW9kYXRhLWJjdHY3ZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWlvZGF0YS1iY3R2N2UuYwppbmRleCAxZjU5ZTE2Li4zNDU0MGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtaW9kYXRhLWJjdHY3ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1pb2RhdGEtYmN0djdlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIElPLURBVEEgQkNUVjdFIFJlbW90ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta2Fpb215LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta2Fpb215LmMKaW5kZXggZjMxZGM1Yy4uNDI2NGE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWthaW9teS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rYWlvbXkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogS2Fpb215IFRWblBDIFUyCiAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtMzE1dS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKaW5kZXggN2YzM2VkYi4uZTQ4Y2QyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC0zMTV1LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIEt3b3JsZCAzMTVVCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtcGx1cy10di1hbmFsb2cuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1rd29ybGQtcGx1cy10di1hbmFsb2cuYwppbmRleCA3ZmExN2EzLi4zMjk5OGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMta3dvcmxkLXBsdXMtdHYtYW5hbG9nLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWt3b3JsZC1wbHVzLXR2LWFuYWxvZy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBLd29ybGQgUGx1cyBUViBBbmFsb2cgTGl0ZSBQQ0kgSVIKICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxlYWR0ZWsteTA0ZzAwNTEuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1sZWFkdGVrLXkwNGcwMDUxLmMKaW5kZXggOGZhYTU0Zi4uMDNkNzYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxlYWR0ZWsteTA0ZzAwNTEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbGVhZHRlay15MDRnMDA1MS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBsZWFkdGVrX3kwNGcwMDUxW10gPSB7CiAJeyAweDAzMDAsIEtFWV9QT1dFUjIgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1saXJjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbGlyYy5jCmluZGV4IGU4ZTIzZTIuLmZiZjA4ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1saXJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxpcmMuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIGxpcmNbXSA9IHsKIAl7IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbG1lMjUxMC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWxtZTI1MTAuYwppbmRleCAxMjlkM2Y5Li41MWYxOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbG1lMjUxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1sbWUyNTEwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbG1lMjUxMF9yY1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1hbmxpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYwppbmRleCAyM2IyZDA0Li5lNzAzOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWFubGkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljaGFlbCBUb2thcmV2IDxtanRAdGxzLm1zay5ydT4KICAgIGtleXRhYmxlIGlzIHVzZWQgYnkgTUFOTEkgTVRWMDBbMHgwY10gYW5kIEJlaG9sZFRWIDQwWzEzXSBhdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1lZGlvbi14MTAuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllMmNjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBNZWRpb24gWDEwIFJGIHJlbW90ZSBrZXl0YWJsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQD9raS5maT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBrZXl0YWJsZSBwcm92aWRlZCBieQorICogSmFuIExvc2luc2tpIDxsb3NpbnNraUB3aDIudHUtZHJlc2Rlbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKworc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbWVkaW9uX3gxMFtdID0geworCXsgMHhmMTJjLCBLRVlfVFYgfSwgICAgLyogVFYgKi8KKwl7IDB4ZjIyZCwgS0VZX1ZDUiB9LCAgIC8qIFZDUiAqLworCXsgMHhjOTA0LCBLRVlfRFZEIH0sICAgLyogRFZEICovCisJeyAweGNiMDYsIEtFWV9BVURJTyB9LCAvKiBNVVNJQyAqLworCisJeyAweGYzMmUsIEtFWV9SQURJTyB9LCAgICAgLyogUkFESU8gKi8KKwl7IDB4Y2EwNSwgS0VZX0RJUkVDVE9SWSB9LCAvKiBQSE9UTyAqLworCXsgMHhmNDJmLCBLRVlfSU5GTyB9LCAgICAgIC8qIFRWLVBSRVZJRVcgKi8KKwl7IDB4ZjUzMCwgS0VZX0xJU1QgfSwgICAgICAvKiBDSEFOTkVMLUxTVCAqLworCisJeyAweGUwMWIsIEtFWV9TRVRVUCB9LCAvKiBTRVRVUCAqLworCXsgMHhmNjMxLCBLRVlfVklERU8gfSwgLyogVklERU8gREVTS1RPUCAqLworCisJeyAweGNkMDgsIEtFWV9WT0xVTUVET1dOIH0sICAvKiBWT0wgLSAqLworCXsgMHhjZTA5LCBLRVlfVk9MVU1FVVAgfSwgICAgLyogVk9MICsgKi8KKwl7IDB4ZDAwYiwgS0VZX0NIQU5ORUxVUCB9LCAgIC8qIENIQU4gKyAqLworCXsgMHhkMTBjLCBLRVlfQ0hBTk5FTERPV04gfSwgLyogQ0hBTiAtICovCisJeyAweGM1MDAsIEtFWV9NVVRFIH0sICAgICAgICAvKiBNVVRFICovCisKKwl7IDB4ZjczMiwgS0VZX1JFRCB9LCAvKiByZWQgKi8KKwl7IDB4ZjgzMywgS0VZX0dSRUVOIH0sIC8qIGdyZWVuICovCisJeyAweGY5MzQsIEtFWV9ZRUxMT1cgfSwgLyogeWVsbG93ICovCisJeyAweGZhMzUsIEtFWV9CTFVFIH0sIC8qIGJsdWUgKi8KKwl7IDB4ZGIxNiwgS0VZX1RFWFQgfSwgLyogVFhUICovCisKKwl7IDB4ZDIwZCwgS0VZXzEgfSwKKwl7IDB4ZDMwZSwgS0VZXzIgfSwKKwl7IDB4ZDQwZiwgS0VZXzMgfSwKKwl7IDB4ZDUxMCwgS0VZXzQgfSwKKwl7IDB4ZDYxMSwgS0VZXzUgfSwKKwl7IDB4ZDcxMiwgS0VZXzYgfSwKKwl7IDB4ZDgxMywgS0VZXzcgfSwKKwl7IDB4ZDkxNCwgS0VZXzggfSwKKwl7IDB4ZGExNSwgS0VZXzkgfSwKKwl7IDB4ZGMxNywgS0VZXzAgfSwKKwl7IDB4ZTExYywgS0VZX1NFQVJDSCB9LCAvKiBUVi9SQUQsIENIIFNSQyAqLworCXsgMHhlNTIwLCBLRVlfREVMRVRFIH0sIC8qIERFTEVURSAqLworCisJeyAweGZiMzYsIEtFWV9LRVlCT0FSRCB9LCAvKiBSRU5BTUUgKi8KKwl7IDB4ZGQxOCwgS0VZX1NDUkVFTiB9LCAgIC8qIFNOQVBTSE9UICovCisKKwl7IDB4ZGYxYSwgS0VZX1VQIH0sICAgIC8qIHVwICovCisJeyAweGU3MjIsIEtFWV9ET1dOIH0sICAvKiBkb3duICovCisJeyAweGUyMWQsIEtFWV9MRUZUIH0sICAvKiBsZWZ0ICovCisJeyAweGU0MWYsIEtFWV9SSUdIVCB9LCAvKiByaWdodCAqLworCXsgMHhlMzFlLCBLRVlfT0sgfSwgICAgLyogT0sgKi8KKworCXsgMHhmYzM3LCBLRVlfU0VMRUNUIH0sIC8qIEFDUVVJUkUgSU1BR0UgKi8KKwl7IDB4ZmQzOCwgS0VZX0VESVQgfSwgICAvKiBFRElUIElNQUdFICovCisKKwl7IDB4ZTkyNCwgS0VZX1JFV0lORCB9LCAgIC8qIHJld2luZCAgKDw8KSAqLworCXsgMHhlYTI1LCBLRVlfUExBWSB9LCAgICAgLyogcGxheSAgICAoID4pICovCisJeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sICAvKiBmb3J3YXJkICg+PikgKi8KKwl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LCAgIC8qIHJlY29yZCAgKCBvKSAqLworCXsgMHhlZDI4LCBLRVlfU1RPUCB9LCAgICAgLyogc3RvcCAgICAoW10pICovCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LCAgICAvKiBwYXVzZSAgICgnJykgKi8KKworCXsgMHhlNjIxLCBLRVlfUFJFVklPVVMgfSwgICAgICAgIC8qIHByZXYgKi8KKwl7IDB4ZmUzOSwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LCAvKiBGIFNDUiAqLworCXsgMHhlODIzLCBLRVlfTkVYVCB9LCAgICAgICAgICAgIC8qIG5leHQgKi8KKwl7IDB4ZGUxOSwgS0VZX01FTlUgfSwgICAgICAgICAgICAvKiBNRU5VICovCisJeyAweGZmM2EsIEtFWV9MQU5HVUFHRSB9LCAgICAgICAgLyogQVVESU8gKi8KKworCXsgMHhjNzAyLCBLRVlfUE9XRVIgfSwgLyogUE9XRVIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3QgbWVkaW9uX3gxMF9tYXAgPSB7CisJLm1hcCA9IHsKKwkJLnNjYW4gICAgPSBtZWRpb25feDEwLAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUobWVkaW9uX3gxMCksCisJCS5yY190eXBlID0gUkNfVFlQRV9PVEhFUiwKKwkJLm5hbWUgICAgPSBSQ19NQVBfTUVESU9OX1gxMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JjX21hcF9tZWRpb25feDEwKHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3RlcigmbWVkaW9uX3gxMF9tYXApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yY19tYXBfbWVkaW9uX3gxMCh2b2lkKQoreworCXJjX21hcF91bnJlZ2lzdGVyKCZtZWRpb25feDEwX21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX21lZGlvbl94MTApCittb2R1bGVfZXhpdChleGl0X3JjX21hcF9tZWRpb25feDEwKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktZGlnaXZveC1paS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKaW5kZXggN2I5YTAxYi4uYzY0ZTllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIG1zaV9kaWdpdm94X2lpW10gPSB7CiAJeyAweDAwMDIsIEtFWV8yIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLWRpZ2l2b3gtaWlpLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLWRpZ2l2b3gtaWlpLmMKaW5kZXggYWU5ZDA2Yi4uMzAzYTBiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS1kaWdpdm94LWlpaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktZGlnaXZveC1paWkuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTVNJIERJR0lWT1ggbWluaSBJSUkgKi8KIC8qIFVzZXMgTkVDIGV4dGVuZGVkIDB4NjFkNi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS1wbHVzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbXNpLXR2YW55d2hlcmUtcGx1cy5jCmluZGV4IDhlOTk2OWQuLmMzOTNkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS1wbHVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLXBsdXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAgS2V5Y29kZXMgZm9yIHJlbW90ZSBvbiB0aGUgTVNJIFRWQG55d2hlcmUgUGx1cy4gVGhlIGNvbnRyb2xsZXIgSUMgb24gdGhlIGNhcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tc2ktdHZhbnl3aGVyZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKaW5kZXggZmRkMjEzZi4uYTcwMDNkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1zaS10dmFueXdoZXJlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIE1TSSBUVkBueXdoZXJlIE1BU1RFUiByZW1vdGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYnVsYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYnVsYS5jCmluZGV4IGRkYWUyMGUuLjNmMGRkZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1uZWJ1bGEuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbmVidWxhLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIG5lYnVsYVtdID0gewogCXsgMHgwMCwgS0VZXzAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1uZWMtdGVycmF0ZWMtY2luZXJneS14cy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKaW5kZXggMjZmMTE0Yy4uZjNiODZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5lYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFQgVVNCIFhTIEZNCiAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ub3J3b29kLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbm9yd29vZC5jCmluZGV4IGY5ZjJmYTIuLjllNjVmMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ub3J3b29kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5vcndvb2QuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTm9yd29vZCBNaWNybyAobm9uLVBybykgVFYgVHVuZXIKICAgIEJ5IFBldGVyIE5hdWxscyA8cGV0ZXJAY2hvY2t5Lm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ucGd0ZWNoLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbnBndGVjaC5jCmluZGV4IDRhYTU4OGIuLjY1ZDBjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1ucGd0ZWNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW5wZ3RlY2guYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgbnBndGVjaFtdID0gewogCXsgMHgxZCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAkvKiBzd2l0Y2ggaW5wdXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGN0di1zZWRuYS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBjdHYtc2VkbmEuYwppbmRleCA3Y2RlZjZlLi5iZjJjYmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGN0di1zZWRuYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wY3R2LXNlZG5hLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIE1hcHBpbmcgZm9yIHRoZSAyOCBrZXkgcmVtb3RlIGNvbnRyb2wgYXMgc2VlbiBhdAogICAgaHR0cDovL3d3dy5zZWRuYWNvbXB1dGVyLmNvbS9waG90by9jYXJkYnVzLXR2LmpwZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLWNvbG9yLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYwppbmRleCAyM2I4YzUwLi5iNDZjZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtY29sb3IuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgcGlubmFjbGVfY29sb3JbXSA9IHsKIAl7IDB4NTksIEtFWV9NVVRFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtZ3JleS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLWdyZXkuYwppbmRleCA2YmE4YzM2Li5kNTI1ZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtZ3JleS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1ncmV5LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHBpbm5hY2xlX2dyZXlbXSA9IHsKIAl7IDB4M2EsIEtFWV8wIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpbm5hY2xlLXBjdHYtaGQuYwppbmRleCA4ZDU1OGFlLi5hNDYwM2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGlubmFjbGUtcGN0di1oZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waW5uYWNsZS1wY3R2LWhkLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFBpbm5hY2xlIFBDVFYgSEQgODAwaSBtaW5pIHJlbW90ZSAqLwogCkBAIC0yMCw2ICsyMSw3IEBACiAJeyAweDA3MDEsIEtFWV9NRU5VIH0sIC8qIFBpbm5hY2xlIGxvZ28gKi8KIAl7IDB4MDczOSwgS0VZX1BPV0VSIH0sCiAJeyAweDA3MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwNzA1LCBLRVlfT0sgfSwKIAl7IDB4MDcwOSwgS0VZX1ZPTFVNRURPV04gfSwKIAl7IDB4MDcwNiwgS0VZX0NIQU5ORUxVUCB9LAogCXsgMHgwNzBjLCBLRVlfQ0hBTk5FTERPV04gfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctMDAydC5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKaW5kZXggZTVhYjA3MS4uMzNlYjY0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy0wMDJ0LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBLZXl0YWJsZSBmb3IgMDAyLVQgSVIgcmVtb3RlIHByb3ZpZGVkIHRvZ2V0aGVyIHdpdGggUGl4ZWx2aWV3CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LW1rMTIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCmluZGV4IDEyNWZjMzkuLjIxZjRkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbWsxMi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogS2V5dGFibGUgZm9yIE1LLUYxMiBJUiByZW1vdGUgcHJvdmlkZWQgdG9nZXRoZXIgd2l0aCBQaXhlbHZpZXcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbmV3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LW5ldy5jCmluZGV4IGJkNzhkNmEuLmY5NDRhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXctbmV3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy1uZXcuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBpeGVsdmlldy5jCmluZGV4IDA2MTg3ZTcuLmE2MDIwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1waXhlbHZpZXcuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcGl4ZWx2aWV3LmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHBpeGVsdmlld1tdID0gewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcG93ZXJjb2xvci1yZWFsLWFuZ2VsLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcG93ZXJjb2xvci1yZWFsLWFuZ2VsLmMKaW5kZXggNWY5ZDU0Ni4uZTc0YzU3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXBvd2VyY29sb3ItcmVhbC1hbmdlbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wb3dlcmNvbG9yLXJlYWwtYW5nZWwuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFJlbW90ZSBjb250cm9sIGZvciBQb3dlcmNvbG9yIFJlYWwgQW5nZWwgMzMwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHJvdGV1cy0yMzA5LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHJvdGV1cy0yMzA5LmMKaW5kZXggOGEzYTY0My4uYWRlZTgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXByb3RldXMtMjMwOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wcm90ZXVzLTIzMDkuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogTWljaGFsIE1hamNocm93aWN6IDxtbWFqY2hyb3dpY3pAZ21haWwuY29tPiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHVycGxldHYuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCmluZGV4IGVmOTAyOTYuLjcyMjU5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdXJwbGV0di5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSBwdXJwbGV0dltdID0gewogCXsgMHgwMywgS0VZX1BPV0VSIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcHY5NTEuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCmluZGV4IDVlOGJlZWUuLjAxMDVkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1wdjk1MS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBNYXJrIFBoYWxhbiA8cGhhbGFubUBvMi5pZT4gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMKaW5kZXggYzM5MDdlMi4uNzUzZTQzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSByYzZfbWNlW10gPSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmVhbC1hdWRpby0yMjAtMzIta2V5cy5jCmluZGV4IDY4MTNkMTEuLjA3MzY5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yZWFsLWF1ZGlvLTIyMC0zMi1rZXlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJlYWwtYXVkaW8tMjIwLTMyLWtleXMuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogWm9naXMgUmVhbCBBdWRpbyAyMjAgLSAzMiBrZXlzIElSICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zbmFwc3RyZWFtLWZpcmVmbHkuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zbmFwc3RyZWFtLWZpcmVmbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE0NjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXNuYXBzdHJlYW0tZmlyZWZseS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogU25hcFN0cmVhbSBGaXJlZmx5IFgxMCBSRiByZW1vdGUga2V5dGFibGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUA/a2kuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHNuYXBzdHJlYW1fZmlyZWZseVtdID0geworCXsgMHhmMTJjLCBLRVlfWk9PTSB9LCAgICAgICAvKiBNYXhpbWl6ZSAqLworCXsgMHhjNzAyLCBLRVlfQ0xPU0UgfSwKKworCXsgMHhkMjBkLCBLRVlfMSB9LAorCXsgMHhkMzBlLCBLRVlfMiB9LAorCXsgMHhkNDBmLCBLRVlfMyB9LAorCXsgMHhkNTEwLCBLRVlfNCB9LAorCXsgMHhkNjExLCBLRVlfNSB9LAorCXsgMHhkNzEyLCBLRVlfNiB9LAorCXsgMHhkODEzLCBLRVlfNyB9LAorCXsgMHhkOTE0LCBLRVlfOCB9LAorCXsgMHhkYTE1LCBLRVlfOSB9LAorCXsgMHhkYzE3LCBLRVlfMCB9LAorCXsgMHhkYjE2LCBLRVlfQkFDSyB9LAorCXsgMHhkZDE4LCBLRVlfS1BFTlRFUiB9LCAgICAvKiBlbnQgKi8KKworCXsgMHhjZTA5LCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4Y2QwOCwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4Y2YwYSwgS0VZX01VVEUgfSwKKwl7IDB4ZDAwYiwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHhkMTBjLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4YzUwMCwgS0VZX1ZFTkRPUiB9LCAgICAgLyogZmlyZWZseSAqLworCisJeyAweGYzMmUsIEtFWV9JTkZPIH0sCisJeyAweGY0MmYsIEtFWV9PUFRJT04gfSwKKworCXsgMHhlMjFkLCBLRVlfTEVGVCB9LAorCXsgMHhlNDFmLCBLRVlfUklHSFQgfSwKKwl7IDB4ZTcyMiwgS0VZX0RPV04gfSwKKwl7IDB4ZGYxYSwgS0VZX1VQIH0sCisJeyAweGUzMWUsIEtFWV9PSyB9LAorCisJeyAweGUxMWMsIEtFWV9NRU5VIH0sCisJeyAweGU1MjAsIEtFWV9FWElUIH0sCisKKwl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LAorCXsgMHhlYTI1LCBLRVlfUExBWSB9LAorCXsgMHhlZDI4LCBLRVlfU1RPUCB9LAorCXsgMHhlOTI0LCBLRVlfUkVXSU5EIH0sCisJeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sCisJeyAweGVlMjksIEtFWV9QQVVTRSB9LAorCXsgMHhmMDJiLCBLRVlfUFJFVklPVVMgfSwKKwl7IDB4ZWYyYSwgS0VZX05FWFQgfSwKKworCXsgMHhjYjA2LCBLRVlfQVVESU8gfSwgICAgICAvKiBNdXNpYyAqLworCXsgMHhjYTA1LCBLRVlfSU1BR0VTIH0sICAgICAvKiBQaG90b3MgKi8KKwl7IDB4YzkwNCwgS0VZX0RWRCB9LAorCXsgMHhjODAzLCBLRVlfVFYgfSwKKwl7IDB4Y2MwNywgS0VZX1ZJREVPIH0sCisKKwl7IDB4YzYwMSwgS0VZX0hFTFAgfSwKKwl7IDB4ZjIyZCwgS0VZX01PREUgfSwgICAgICAgLyogTW91c2UgKi8KKworCXsgMHhkZTE5LCBLRVlfQSB9LAorCXsgMHhlMDFiLCBLRVlfQiB9LAorCXsgMHhlNjIxLCBLRVlfQyB9LAorCXsgMHhlODIzLCBLRVlfRCB9LAorfTsKKworc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBzbmFwc3RyZWFtX2ZpcmVmbHlfbWFwID0geworCS5tYXAgPSB7CisJCS5zY2FuICAgID0gc25hcHN0cmVhbV9maXJlZmx5LAorCQkuc2l6ZSAgICA9IEFSUkFZX1NJWkUoc25hcHN0cmVhbV9maXJlZmx5KSwKKwkJLnJjX3R5cGUgPSBSQ19UWVBFX09USEVSLAorCQkubmFtZSAgICA9IFJDX01BUF9TTkFQU1RSRUFNX0ZJUkVGTFksCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yY19tYXBfc25hcHN0cmVhbV9maXJlZmx5KHZvaWQpCit7CisJcmV0dXJuIHJjX21hcF9yZWdpc3Rlcigmc25hcHN0cmVhbV9maXJlZmx5X21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JjX21hcF9zbmFwc3RyZWFtX2ZpcmVmbHkodm9pZCkKK3sKKwlyY19tYXBfdW5yZWdpc3Rlcigmc25hcHN0cmVhbV9maXJlZmx5X21hcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmNfbWFwX3NuYXBzdHJlYW1fZmlyZWZseSkKK21vZHVsZV9leGl0KGV4aXRfcmNfbWFwX3NuYXBzdHJlYW1fZmlyZWZseSkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBpa2kuZmk+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc3RyZWFtemFwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc3RyZWFtemFwLmMKaW5kZXggOTJjYzEwZC4uZjlhMDc1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXN0cmVhbXphcC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zdHJlYW16YXAuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgc3RyZWFtemFwW10gPSB7CiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRicy1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10YnMtbmVjLmMKaW5kZXggNzI0MmVlNi4uNTAzOWJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRicy1uZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGJzLW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0YnNfbmVjW10gPSB7CiAJeyAweDg0LCBLRVlfUE9XRVIyfSwJCS8qIHBvd2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCmluZGV4IDRhZmU1NzcuLmY5NzMzYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZWNobmlzYXQtdXNiMi5jCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0ZWNobmlzYXRfdXNiMltdID0gewogCXsweDBhMGMsIEtFWV9QT1dFUn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtY2luZXJneS14cy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLWNpbmVyZ3kteHMuYwppbmRleCBiYzM4ZTM0Li41MzYyOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtY2luZXJneS14cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1jaW5lcmd5LXhzLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFQgVVNCIFhTCiAgICBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGxpbnV4dHYub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0tMi5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0tMi5jCmluZGV4IDQ0MDkzOTEuLjRjMTQ5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1zbGltLTIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS0yLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBUZXJyYVRlYyBzbGltIHJlbW90ZSwgNiByb3dzLCAzIGNvbHVtbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRlcnJhdGVjLXNsaW0uYwppbmRleCAxYWJhZmE1Li4zZDhhMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGVycmF0ZWMtc2xpbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXJyYXRlYy1zbGltLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFRlcnJhVGVjIHNsaW0gcmVtb3RlLCA3IHJvd3MsIDQgY29sdW1ucy4gKi8KIC8qIFVzZXMgTkVDIGV4dGVuZGVkIDB4MDJiZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXZpaS1uZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10ZXZpaS1uZWMuYwppbmRleCBlZjViYTNmLi5mMmMzYjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGV2aWktbmVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRldmlpLW5lYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0ZXZpaV9uZWNbXSA9IHsKIAl7IDB4MGEsIEtFWV9QT1dFUjJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRpdm8uYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10aXZvLmMKaW5kZXggOThhZDA4NS4uNDU0ZTA2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRpdm8uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdGl2by5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIEluaXRpYWwgbWFwcGluZyBpcyBmb3IgdGhlIFRpVm8gcmVtb3RlIGluY2x1ZGVkIGluIHRoZSBOZXJvIExpcXVpZFRWIGJ1bmRsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10b3RhbC1tZWRpYS1pbi1oYW5kLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdG90YWwtbWVkaWEtaW4taGFuZC5jCmluZGV4IDIwYWM0ZTEuLjViOWY5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10b3RhbC1tZWRpYS1pbi1oYW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXRvdGFsLW1lZGlhLWluLWhhbmQuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogVXNlcyBORUMgZXh0ZW5kZWQgMHgwMmJkICovCiBzdGF0aWMgc3RydWN0IHJjX21hcF90YWJsZSB0b3RhbF9tZWRpYV9pbl9oYW5kW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdHJla3N0b3IuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCmluZGV4IGY4MTkwZWEuLmY5YTJlMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10cmVrc3Rvci5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBUcmVrU3RvciBEVkItVCBVU0IgU3RpY2sgcmVtb3RlIGNvbnRyb2xsZXIuICovCiAvKiBJbXBvcnRlZCBmcm9tIGFmOTAxNS5oLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR0LTE1MDAuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10dC0xNTAwLmMKaW5kZXggMjk1ZjM3My4uY2FlZmY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR0LTE1MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdHQtMTUwMC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBmb3IgdGhlIFRlY2hub3RyZW5kIDE1MDAgYnVuZGxlZCByZW1vdGVzIChncmV5IGFuZCBibGFjayk6ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy10d2luaGFuMTAyNy5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKaW5kZXggOGJmOGRmNi4uNTA5Mjk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXR3aW5oYW4xMDI3LmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHR3aW5oYW5fdnAxMDI3W10gPSB7CiAJeyAweDE2LCBLRVlfUE9XRVIyIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLW0xZi5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS1tMWYuYwppbmRleCA0OTk0ZDQwLi4zYmQxZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLW0xZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy12aWRlb21hdGUtbTFmLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHZpZGVvbWF0ZV9tMWZbXSA9IHsKIAl7IDB4MDEsIEtFWV9QT1dFUiB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS1zMzUwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYwppbmRleCA5ZTQ3NGE2Li44YmZjM2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXMzNTAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgdmlkZW9tYXRlX3MzNTBbXSA9IHsKIAl7IDB4MDAsIEtFWV9UVn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXR2LXB2ci5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXZpZGVvbWF0ZS10di1wdnIuYwppbmRleCA1ZjJhNDZlLi4zOTBjZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtdmlkZW9tYXRlLXR2LXB2ci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy12aWRlb21hdGUtdHYtcHZyLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHZpZGVvbWF0ZV90dl9wdnJbXSA9IHsKIAl7IDB4MTQsIEtFWV9NVVRFIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtd2luZmFzdC11c2JpaS1kZWx1eGUuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCmluZGV4IGJkOGQwMjEuLjI4NTJiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LXVzYmlpLWRlbHV4ZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBMZWFkdGVrIFdpbmZhc3QgVFYgVVNCIElJIERlbHV4ZSByZW1vdGUKICAgIE1hZ251cyBBbG0gPG1hZ251cy5hbG1AZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXdpbmZhc3QuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy13aW5mYXN0LmMKaW5kZXggZDhhMzRjMS4uMmRmMWNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXdpbmZhc3QuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtd2luZmFzdC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBUYWJsZSBmb3IgTGVhZHRlayBXaW5mYXN0IFJlbW90ZSBDb250cm9scyAtIHVzZWQgYnkgYm90aCBidHR2IGFuZCBjeDg4ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCmluZGV4IDg1ZmY5YTEuLjYwZDNjMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEcml2ZXIgZm9yIFVTQiBXaW5kb3dzIE1lZGlhIENlbnRlciBFZC4gZUhvbWUgSW5mcmFyZWQgVHJhbnNjZWl2ZXJzCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDEwIGJ5IEphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+CiAgKgogICogQmFzZWQgb24gdGhlIG9yaWdpbmFsIGxpcmNfbWNldXNiIGFuZCBsaXJjX21jZXVzYjIgZHJpdmVycywgYnkgRGFuCiAgKiBDb250aSwgTWFydGluIEJsYXR0ZXIgYW5kIERhbmllbCBNZWxhbmRlciwgdGhlIGxhdHRlciBvZiB3aGljaCB3YXMKQEAgLTE1LDYgKzE1LDExIEBACiAgKiBKb24gU21pcmwsIHdoaWNoIGluY2x1ZGVkIGVuaGFuY2VtZW50cyBhbmQgc2ltcGxpZmljYXRpb25zIHRvIHRoZQogICogaW5jb21pbmcgSVIgYnVmZmVyIHBhcnNpbmcgcm91dGluZXMuCiAgKgorICogVXBkYXRlZCBpbiBKdWx5IG9mIDIwMTEgd2l0aCB0aGUgYWlkIG9mIE1pY3Jvc29mdCdzIG9mZmljaWFsCisgKiByZW1vdGUvdHJhbnNjZWl2ZXIgcmVxdWlyZW1lbnRzIGFuZCBzcGVjaWZpY2F0aW9uIGRvY3VtZW50LCBmb3VuZCBhdAorICogZG93bmxvYWQubWljcm9zb2Z0LmNvbSwgdGl0bGUKKyAqIFdpbmRvd3MtTWVkaWEtQ2VudGVyLVJDLUlSLUNvbGxlY3Rpb24tR3JlZW4tQnV0dG9uLVNwZWNpZmljYXRpb24tMDMtMDgtMjAxMS1WMi5wZGYKKyAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zNywxMCArNDIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fd2FrZXVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkxIgotI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKYXJvZCBXaWxzb24gPGphcm9kQHdpbHNvbmV0LmNvbT4iCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkyIgorI2RlZmluZSBEUklWRVJfQVVUSE9SCSJKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQwkiV2luZG93cyBNZWRpYSBDZW50ZXIgRWQuIGVIb21lIEluZnJhcmVkIFRyYW5zY2VpdmVyICIgXAogCQkJImRldmljZSBkcml2ZXIiCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJtY2V1c2IiCkBAIC02Myw0MyArNjksOTAgQEAKICNkZWZpbmUgTUNFX1BVTFNFX01BU0sJCTB4N2YgLyogUHVsc2UgbWFzayAqLwogI2RlZmluZSBNQ0VfTUFYX1BVTFNFX0xFTkdUSAkweDdmIC8qIExvbmdlc3QgdHJhbnNtaXR0YWJsZSBwdWxzZSBzeW1ib2wgKi8KIAotI2RlZmluZSBNQ0VfSFdfQ01EX0hFQURFUgkweGZmCS8qIE1DRSBoYXJkd2FyZSBjb21tYW5kIGhlYWRlciAqLwotI2RlZmluZSBNQ0VfQ09NTUFORF9IRUFERVIJMHg5ZgkvKiBNQ0UgY29tbWFuZCBoZWFkZXIgKi8KLSNkZWZpbmUgTUNFX0NPTU1BTkRfTUFTSwkweGUwCS8qIE1hc2sgb3V0IGNvbW1hbmQgYml0cyAqLwotI2RlZmluZSBNQ0VfQ09NTUFORF9OVUxMCTB4MDAJLyogVGhlc2Ugc2hvdyB1cCB2YXJpb3VzIHBsYWNlcy4uLiAqLwotLyogaWYgYnVmW2ldICYgTUNFX0NPTU1BTkRfTUFTSyA9PSAweDgwIGFuZCBidWZbaV0gIT0gTUNFX0NPTU1BTkRfSEVBREVSLAotICogdGhlbiB3ZSdyZSBsb29raW5nIGF0IGEgcmF3IElSIGRhdGEgc2FtcGxlICovCi0jZGVmaW5lIE1DRV9DT01NQU5EX0lSREFUQQkweDgwCi0jZGVmaW5lIE1DRV9QQUNLRVRfTEVOR1RIX01BU0sJMHgxZiAvKiBQYWNrZXQgbGVuZ3RoIG1hc2sgKi8KKy8qCisgKiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSBJUiBoYXJkd2FyZSBpcyBjb21tYW5kLXJlc3BvbnNlCisgKiBiYXNlZC4gQWxsIGNvbW1hbmRzIGFuZCByZXNwb25zZXMgaGF2ZSBhIGNvbnNpc3RlbnQgZm9ybWF0LCB3aGVyZSBhIGxlYWQKKyAqIGJ5dGUgYWx3YXlzIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZGF0YSBmb2xsb3dpbmcgaXQuIFRoZSBsZWFkIGJ5dGUgaGFzCisgKiBhIHBvcnQgdmFsdWUgaW4gdGhlIDMgaGlnaGVzdCBiaXRzIGFuZCBhIGxlbmd0aCB2YWx1ZSBpbiB0aGUgNSBsb3dlc3QKKyAqIGJpdHMuCisgKgorICogVGhlIGxlbmd0aCBmaWVsZCBpcyBvdmVybG9hZGVkLCB3aXRoIGEgdmFsdWUgb2YgMTExMTEgaW5kaWNhdGluZyB0aGF0IHRoZQorICogZm9sbG93aW5nIGJ5dGUgaXMgYSBjb21tYW5kIG9yIHJlc3BvbnNlIGNvZGUsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIG1lc3NhZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29kZS4gSWYgdGhlIGxlbmd0aCBmaWVsZCBpcyBub3QgMTExMTEsIHRoZW4KKyAqIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHBvcnQgZGF0YSB0aGF0IGZvbGxvdy4KKyAqLworI2RlZmluZSBNQ0VfQ01ECQkJMHgxZgorI2RlZmluZSBNQ0VfUE9SVF9JUgkJMHg0CS8qICgweDQgPDwgNSkgfCBNQ0VfQ01EID0gMHg5ZiAqLworI2RlZmluZSBNQ0VfUE9SVF9TWVMJCTB4NwkvKiAoMHg3IDw8IDUpIHwgTUNFX0NNRCA9IDB4ZmYgKi8KKyNkZWZpbmUgTUNFX1BPUlRfU0VSCQkweDYJLyogMHhjMCB0aHJ1IDB4ZGYgZmx1c2ggJiAweDFmIGJ5dGVzICovCisjZGVmaW5lIE1DRV9QT1JUX01BU0sJMHhlMAkvKiBNYXNrIG91dCBjb21tYW5kIGJpdHMgKi8KIAotLyogU3ViLWNvbW1hbmRzLCB3aGljaCBmb2xsb3cgTUNFX0NPTU1BTkRfSEVBREVSIG9yIE1DRV9IV19DTURfSEVBREVSICovCisvKiBDb21tYW5kIHBvcnQgaGVhZGVycyAqLworI2RlZmluZSBNQ0VfQ01EX1BPUlRfSVIJCTB4OWYJLyogSVItcmVsYXRlZCBjbWQvcnNwICovCisjZGVmaW5lIE1DRV9DTURfUE9SVF9TWVMJMHhmZgkvKiBTeXN0ZW0gKG5vbi1JUikgZGV2aWNlIGNtZC9yc3AgKi8KKworLyogQ29tbWFuZHMgdGhhdCBzZXQgZGV2aWNlIHN0YXRlICAoMi00IGJ5dGVzIGluIGxlbmd0aCkgKi8KKyNkZWZpbmUgTUNFX0NNRF9SRVNFVAkJMHhmZQkvKiBSZXNldCBkZXZpY2UsIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9SRVNVTUUJCTB4YWEJLyogUmVzdW1lIGRldmljZSBhZnRlciBlcnJvciwgMiBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSQ0ZTCTB4MDYJLyogU2V0IHR4IGNhcnJpZXIsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9TRVRJUlRJTUVPVVQJMHgwYwkvKiBTZXQgdGltZW91dCwgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSVFhQT1JUUwkweDA4CS8qIFNldCB0eCBwb3J0cywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX1NFVElSUlhQT1JURU4JMHgxNAkvKiBTZXQgcnggcG9ydHMsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX0NNRF9GTEFTSExFRAkweDIzCS8qIEZsYXNoIHJlY2VpdmVyIExFRCwgMiBieXRlcyAqLworCisvKiBDb21tYW5kcyB0aGF0IHF1ZXJ5IGRldmljZSBzdGF0ZSAoYWxsIDIgYnl0ZXMsIHVubGVzcyBub3RlZCkgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUkNGUwkweDA3CS8qIEdldCBjYXJyaWVyICovCisjZGVmaW5lIE1DRV9DTURfR0VUSVJUSU1FT1VUCTB4MGQJLyogR2V0IHRpbWVvdXQgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUlRYUE9SVFMJMHgxMwkvKiBHZXQgdHggcG9ydHMgKi8KKyNkZWZpbmUgTUNFX0NNRF9HRVRJUlJYUE9SVEVOCTB4MTUJLyogR2V0IHJ4IHBvcnRzICovCisjZGVmaW5lIE1DRV9DTURfR0VUUE9SVFNUQVRVUwkweDExCS8qIEdldCB0eCBwb3J0IHN0YXR1cywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfQ01EX0dFVElSTlVNUE9SVFMJMHgxNgkvKiBHZXQgbnVtYmVyIG9mIHBvcnRzICovCisjZGVmaW5lIE1DRV9DTURfR0VUV0FLRVNPVVJDRQkweDE3CS8qIEdldCB3YWtlIHNvdXJjZSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVEVNVkVSCTB4MjIJLyogR2V0IGVtdWxhdG9yIGludGVyZmFjZSB2ZXJzaW9uICovCisjZGVmaW5lIE1DRV9DTURfR0VUREVWREVUQUlMUwkweDIxCS8qIEdldCBkZXZpY2UgZGV0YWlscyAoZW0gdmVyMiBvbmx5KSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVFdBS0VTVVBQT1JUCTB4MjAJLyogR2V0IHdha2UgZGV0YWlscyAoZW0gdmVyMiBvbmx5KSAqLworI2RlZmluZSBNQ0VfQ01EX0dFVFdBS0VWRVJTSU9OCTB4MTgJLyogR2V0IHdha2UgcGF0dGVybiAoZW0gdmVyMiBvbmx5KSAqLworCisvKiBNaXNjIGNvbW1hbmRzICovCisjZGVmaW5lIE1DRV9DTURfTk9QCQkweGZmCS8qIE5vIG9wZXJhdGlvbiAqLworCisvKiBSZXNwb25zZXMgdG8gY29tbWFuZHMgKG5vbi1lcnJvciBjYXNlcykgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSQ0ZTCQkweDA2CS8qIHR4IGNhcnJpZXIsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSVElNRU9VVAkweDBjCS8qIHJ4IHRpbWVvdXQsIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9HRVRXQUtFU09VUkNFCTB4MTcJLyogd2FrZSBzb3VyY2UsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUlSVFhQT1JUUwkweDA4CS8qIHR4IHBvcnQgbWFzaywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJSWFBPUlRFTgkweDE0CS8qIHJ4IHBvcnQgbWFzaywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0dFVFBPUlRTVEFUVVMJMHgxMQkvKiB0eCBwb3J0IHN0YXR1cywgNyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJSWENGQ05UCTB4MTUJLyogcnggY2FycmllciBjb3VudCwgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRSVJOVU1QT1JUUwkweDE2CS8qIG51bWJlciBvZiBwb3J0cywgNCBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRV0FLRVNVUFBPUlQJMHgyMAkvKiB3YWtlIGNhcGFiaWxpdGllcywgMyBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRV0FLRVZFUlNJT04JMHgxOAkvKiB3YWtlIHBhdHRlcm4gZGV0YWlscywgNiBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX0VRREVWREVUQUlMUwkweDIxCS8qIGRldmljZSBjYXBhYmlsaXRpZXMsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9FUUVNVkVSCQkweDIyCS8qIGVtdWxhdG9yIGludGVyZmFjZSB2ZXIsIDMgYnl0ZXMgKi8KKyNkZWZpbmUgTUNFX1JTUF9GTEFTSExFRAkweDIzCS8qIHN1Y2Nlc3MgZmxhc2hpbmcgTEVELCAyIGJ5dGVzICovCisKKy8qIFJlc3BvbnNlcyB0byBlcnJvciBjYXNlcywgbXVzdCBzZW5kIE1DRV9DTURfUkVTVU1FIHRvIGNsZWFyIHRoZW0gKi8KKyNkZWZpbmUgTUNFX1JTUF9DTURfSUxMRUdBTAkweGZlCS8qIGlsbGVnYWwgY29tbWFuZCBmb3IgcG9ydCwgMiBieXRlcyAqLworI2RlZmluZSBNQ0VfUlNQX1RYX1RJTUVPVVQJMHg4MQkvKiB0eCB0aW1lZCBvdXQsIDIgYnl0ZXMgKi8KKworLyogTWlzYyBjb21tYW5kcy9yZXNwb25zZXMgbm90IGRlZmluZWQgaW4gdGhlIE1DRSByZW1vdGUvdHJhbnNjZWl2ZXIgc3BlYyAqLwogI2RlZmluZSBNQ0VfQ01EX1NJR19FTkQJCTB4MDEJLyogRW5kIG9mIHNpZ25hbCAqLwogI2RlZmluZSBNQ0VfQ01EX1BJTkcJCTB4MDMJLyogUGluZyBkZXZpY2UgKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOCQkweDA0CS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOMgkweDA1CS8qIFVua25vd24gKi8KLSNkZWZpbmUgTUNFX0NNRF9TX0NBUlJJRVIJMHgwNgkvKiBTZXQgVFggY2FycmllciBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX0NBUlJJRVIJMHgwNwkvKiBHZXQgVFggY2FycmllciBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgTUNFX0NNRF9TX1RYTUFTSwkweDA4CS8qIFNldCBUWCBwb3J0IGJpdG1hc2sgKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dOMwkweDA5CS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9VTktOT1dONAkweDBhCS8qIFVua25vd24gKi8KICNkZWZpbmUgTUNFX0NNRF9HX1JFVklTSU9OCTB4MGIJLyogR2V0IGh3L3N3IHJldmlzaW9uICovCi0jZGVmaW5lIE1DRV9DTURfU19USU1FT1VUCTB4MGMJLyogU2V0IFJYIHRpbWVvdXQgdmFsdWUgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX1RJTUVPVVQJMHgwZAkvKiBHZXQgUlggdGltZW91dCB2YWx1ZSAqLwogI2RlZmluZSBNQ0VfQ01EX1VOS05PV041CTB4MGUJLyogVW5rbm93biAqLwogI2RlZmluZSBNQ0VfQ01EX1VOS05PV042CTB4MGYJLyogVW5rbm93biAqLwotI2RlZmluZSBNQ0VfQ01EX0dfUlhQT1JUU1RTCTB4MTEJLyogR2V0IFJYIHBvcnQgc3RhdHVzICovCi0jZGVmaW5lIE1DRV9DTURfR19UWE1BU0sJMHgxMwkvKiBTZXQgVFggcG9ydCBiaXRtYXNrICovCi0jZGVmaW5lIE1DRV9DTURfU19SWFNFTlNPUgkweDE0CS8qIFNldCBSWCBzZW5zb3IgKHN0ZC9sZWFybmluZykgKi8KLSNkZWZpbmUgTUNFX0NNRF9HX1JYU0VOU09SCTB4MTUJLyogR2V0IFJYIHNlbnNvciAoc3RkL2xlYXJuaW5nKSAqLwotI2RlZmluZSBNQ0VfUlNQX1BVTFNFX0NPVU5UCTB4MTUJLyogUlggcHVsc2UgY291bnQgKG9ubHkgaWYgbGVhcm5pbmcpICovCi0jZGVmaW5lIE1DRV9DTURfVFhfUE9SVFMJMHgxNgkvKiBHZXQgbnVtYmVyIG9mIFRYIHBvcnRzICovCi0jZGVmaW5lIE1DRV9DTURfR19XQUtFU1JDCTB4MTcJLyogR2V0IHdha2Ugc291cmNlICovCi0jZGVmaW5lIE1DRV9DTURfVU5LTk9XTjcJMHgxOAkvKiBVbmtub3duICovCiAjZGVmaW5lIE1DRV9DTURfVU5LTk9XTjgJMHgxOQkvKiBVbmtub3duICovCiAjZGVmaW5lIE1DRV9DTURfVU5LTk9XTjkJMHgxYgkvKiBVbmtub3duICovCi0jZGVmaW5lIE1DRV9DTURfREVWSUNFX1JFU0VUCTB4YWEJLyogUmVzZXQgdGhlIGhhcmR3YXJlICovCi0jZGVmaW5lIE1DRV9SU1BfQ01EX0lOVkFMSUQJMHhmZQkvKiBJbnZhbGlkIGNvbW1hbmQgaXNzdWVkICovCisjZGVmaW5lIE1DRV9DTURfTlVMTAkJMHgwMAkvKiBUaGVzZSBzaG93IHVwIHZhcmlvdXMgcGxhY2VzLi4uICovCiAKKy8qIGlmIGJ1ZltpXSAmIE1DRV9QT1JUX01BU0sgPT0gMHg4MCBhbmQgYnVmW2ldICE9IE1DRV9DTURfUE9SVF9JUiwKKyAqIHRoZW4gd2UncmUgbG9va2luZyBhdCBhIHJhdyBJUiBkYXRhIHNhbXBsZSAqLworI2RlZmluZSBNQ0VfQ09NTUFORF9JUkRBVEEJMHg4MAorI2RlZmluZSBNQ0VfUEFDS0VUX0xFTkdUSF9NQVNLCTB4MWYgLyogUGFja2V0IGxlbmd0aCBtYXNrICovCiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCiAjaWZkZWYgQ09ORklHX1VTQl9ERUJVRwpAQCAtMzg4LDQ4ICs0NDEsMzcgQEAKIAljaGFyIG5hbWVbMTI4XTsKIAljaGFyIHBoeXNbNjRdOwogCWVudW0gbWNldXNiX21vZGVsX3R5cGUgbW9kZWw7CisKKwlib29sIG5lZWRfcmVzZXQ7CS8qIGZsYWcgdG8gaXNzdWUgYSBkZXZpY2UgcmVzdW1lIGNtZCAqLworCXU4IGVtdmVyOwkJLyogZW11bGF0b3IgaW50ZXJmYWNlIHZlcnNpb24gKi8KKwl1OCBudW1fdHhwb3J0czsJCS8qIG51bWJlciBvZiB0cmFuc21pdCBwb3J0cyAqLworCXU4IG51bV9yeHBvcnRzOwkJLyogbnVtYmVyIG9mIHJlY2VpdmUgc2Vuc29ycyAqLworCXU4IHR4cG9ydHNfY2FibGVkOwkvKiBiaXRtYXNrIG9mIHRyYW5zbWl0dGVycyB3aXRoIGNhYmxlICovCisJdTggcnhwb3J0c19hY3RpdmU7CS8qIGJpdG1hc2sgb2YgYWN0aXZlIHJlY2VpdmUgc2Vuc29ycyAqLwogfTsKIAotLyoKLSAqIE1DRSBEZXZpY2UgQ29tbWFuZCBTdHJpbmdzCi0gKiBEZXZpY2UgY29tbWFuZCByZXNwb25zZXMgdmFyeSBmcm9tIGRldmljZSB0byBkZXZpY2UuLi4KLSAqIC0gREVWSUNFX1JFU0VUIHJlc2V0cyB0aGUgaGFyZHdhcmUgdG8gaXRzIGRlZmF1bHQgc3RhdGUKLSAqIC0gR0VUX1JFVklTSU9OIGZldGNoZXMgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIHJldmlzaW9uLCBjb21tb24KLSAqICAgcmVwbGllcyBhcmUgZmYgMGIgNDUgZmYgMWIgMDggYW5kIGZmIDBiIDUwIGZmIDFiIDQyCi0gKiAtIEdFVF9DQVJSSUVSX0ZSRVEgZ2V0cyB0aGUgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kgb2YgdGhlCi0gKiAgIGRldmljZSwgd2l0aCByZXBsaWVzIGluIHRoZSBmb3JtIG9mIDlmIDA2IE1NIEZGLCB3aGVyZSBNTSBpcyAwLTMsCi0gKiAgIG1lYW5pbmcgY2xrIG9mIDEwMDAwMDAwLCAyNTAwMDAwLCA2MjUwMDAgb3IgMTU2MjUwLCBhbmQgRkYgaXMKLSAqICAgKChjbGsgLyBmcmVxdWVuY3kpIC0gMSkKLSAqIC0gR0VUX1JYX1RJTUVPVVQgZmV0Y2hlcyB0aGUgcmVjZWl2ZXIgdGltZW91dCBpbiB1bml0cyBvZiA1MHVzLAotICogICByZXNwb25zZSBpbiB0aGUgZm9ybSBvZiA5ZiAwYyBtc2IgbHNiCi0gKiAtIEdFVF9UWF9CSVRNQVNLIGZldGNoZXMgdGhlIHRyYW5zbWl0dGVyIGJpdG1hc2ssIHJlcGxpZXMgaW4KLSAqICAgdGhlIGZvcm0gb2YgOWYgMDggYm0sIHdoZXJlIGJtIGlzIHRoZSBiaXRtYXNrCi0gKiAtIEdFVF9SWF9TRU5TT1IgZmV0Y2hlcyB0aGUgUlggc2Vuc29yIHNldHRpbmcgLS0gbG9uZy1yYW5nZQotICogICBnZW5lcmFsIHVzZSBvbmUgb3Igc2hvcnQtcmFuZ2UgbGVhcm5pbmcgb25lLCBpbiB0aGUgZm9ybSBvZgotICogICA5ZiAxNCBzcywgd2hlcmUgc3MgaXMgZWl0aGVyIDAxIGZvciBsb25nLXJhbmdlIG9yIDAyIGZvciBzaG9ydAotICogLSBTRVRfQ0FSUklFUl9GUkVRIHNldHMgYSBuZXcgY2FycmllciBtb2RlIGFuZCBmcmVxdWVuY3kKLSAqIC0gU0VUX1RYX0JJVE1BU0sgc2V0cyB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzawotICogLSBTRVRfUlhfVElNRU9VVCBzZXRzIHRoZSByZWNlaXZlciB0aW1lb3V0Ci0gKiAtIFNFVF9SWF9TRU5TT1Igc2V0cyB3aGljaCByZWNlaXZlciBzZW5zb3IgdG8gdXNlCi0gKi8KLXN0YXRpYyBjaGFyIERFVklDRV9SRVNFVFtdCT0ge01DRV9DT01NQU5EX05VTEwsIE1DRV9IV19DTURfSEVBREVSLAotCQkJCSAgIE1DRV9DTURfREVWSUNFX1JFU0VUfTsKLXN0YXRpYyBjaGFyIEdFVF9SRVZJU0lPTltdCT0ge01DRV9IV19DTURfSEVBREVSLCBNQ0VfQ01EX0dfUkVWSVNJT059Owotc3RhdGljIGNoYXIgR0VUX1VOS05PV05bXQk9IHtNQ0VfSFdfQ01EX0hFQURFUiwgTUNFX0NNRF9VTktOT1dON307Ci1zdGF0aWMgY2hhciBHRVRfVU5LTk9XTjJbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfVU5LTk9XTjJ9Owotc3RhdGljIGNoYXIgR0VUX0NBUlJJRVJfRlJFUVtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwgTUNFX0NNRF9HX0NBUlJJRVJ9Owotc3RhdGljIGNoYXIgR0VUX1JYX1RJTUVPVVRbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfR19USU1FT1VUfTsKLXN0YXRpYyBjaGFyIEdFVF9UWF9CSVRNQVNLW10JPSB7TUNFX0NPTU1BTkRfSEVBREVSLCBNQ0VfQ01EX0dfVFhNQVNLfTsKLXN0YXRpYyBjaGFyIEdFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ09NTUFORF9IRUFERVIsIE1DRV9DTURfR19SWFNFTlNPUn07CisvKiBNQ0UgRGV2aWNlIENvbW1hbmQgU3RyaW5ncywgZ2VuZXJhbGx5IGEgcG9ydCBhbmQgY29tbWFuZCBwYWlyICovCitzdGF0aWMgY2hhciBERVZJQ0VfUkVTVU1FW10JPSB7TUNFX0NNRF9OVUxMLCBNQ0VfQ01EX1BPUlRfU1lTLAorCQkJCSAgIE1DRV9DTURfUkVTVU1FfTsKK3N0YXRpYyBjaGFyIEdFVF9SRVZJU0lPTltdCT0ge01DRV9DTURfUE9SVF9TWVMsIE1DRV9DTURfR19SRVZJU0lPTn07CitzdGF0aWMgY2hhciBHRVRfRU1WRVJbXQkJPSB7TUNFX0NNRF9QT1JUX1NZUywgTUNFX0NNRF9HRVRFTVZFUn07CitzdGF0aWMgY2hhciBHRVRfV0FLRVZFUlNJT05bXQk9IHtNQ0VfQ01EX1BPUlRfU1lTLCBNQ0VfQ01EX0dFVFdBS0VWRVJTSU9OfTsKK3N0YXRpYyBjaGFyIEZMQVNIX0xFRFtdCQk9IHtNQ0VfQ01EX1BPUlRfU1lTLCBNQ0VfQ01EX0ZMQVNITEVEfTsKK3N0YXRpYyBjaGFyIEdFVF9VTktOT1dOMltdCT0ge01DRV9DTURfUE9SVF9JUiwgTUNFX0NNRF9VTktOT1dOMn07CitzdGF0aWMgY2hhciBHRVRfQ0FSUklFUl9GUkVRW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSQ0ZTfTsKK3N0YXRpYyBjaGFyIEdFVF9SWF9USU1FT1VUW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSVElNRU9VVH07CitzdGF0aWMgY2hhciBHRVRfTlVNX1BPUlRTW10JPSB7TUNFX0NNRF9QT1JUX0lSLCBNQ0VfQ01EX0dFVElSTlVNUE9SVFN9Oworc3RhdGljIGNoYXIgR0VUX1RYX0JJVE1BU0tbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfR0VUSVJUWFBPUlRTfTsKK3N0YXRpYyBjaGFyIEdFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfR0VUSVJSWFBPUlRFTn07CiAvKiBzdWIgaW4gZGVzaXJlZCB2YWx1ZXMgaW4gbG93ZXIgYnl0ZSBvciBieXRlcyBmb3IgZnVsbCBjb21tYW5kICovCiAvKiBGSVhNRTogbWFrZSB1c2Ugb2YgdGhlc2UgZm9yIHRyYW5zbWl0Lgotc3RhdGljIGNoYXIgU0VUX0NBUlJJRVJfRlJFUVtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwKLQkJCQkgICBNQ0VfQ01EX1NfQ0FSUklFUiwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfVFhfQklUTUFTS1tdCT0ge01DRV9DT01NQU5EX0hFQURFUiwgTUNFX0NNRF9TX1RYTUFTSywgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfUlhfVElNRU9VVFtdCT0ge01DRV9DT01NQU5EX0hFQURFUiwKLQkJCQkgICBNQ0VfQ01EX1NfVElNRU9VVCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgY2hhciBTRVRfUlhfU0VOU09SW10JPSB7TUNFX0NPTU1BTkRfSEVBREVSLAotCQkJCSAgIE1DRV9DTURfU19SWFNFTlNPUiwgMHgwMH07CitzdGF0aWMgY2hhciBTRVRfQ0FSUklFUl9GUkVRW10JPSB7TUNFX0NNRF9QT1JUX0lSLAorCQkJCSAgIE1DRV9DTURfU0VUSVJDRlMsIDB4MDAsIDB4MDB9Oworc3RhdGljIGNoYXIgU0VUX1RYX0JJVE1BU0tbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsIE1DRV9DTURfU0VUSVJUWFBPUlRTLCAweDAwfTsKK3N0YXRpYyBjaGFyIFNFVF9SWF9USU1FT1VUW10JPSB7TUNFX0NNRF9QT1JUX0lSLAorCQkJCSAgIE1DRV9DTURfU0VUSVJUSU1FT1VULCAweDAwLCAweDAwfTsKK3N0YXRpYyBjaGFyIFNFVF9SWF9TRU5TT1JbXQk9IHtNQ0VfQ01EX1BPUlRfSVIsCisJCQkJICAgTUNFX1JTUF9FUUlSUlhQT1JURU4sIDB4MDB9OwogKi8KIAogc3RhdGljIGludCBtY2V1c2JfY21kc2l6ZSh1OCBjbWQsIHU4IHN1YmNtZCkKQEAgLTQzNywyNyArNDc5LDMzIEBACiAJaW50IGRhdGFzaXplID0gMDsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNQ0VfQ09NTUFORF9OVUxMOgotCQlpZiAoc3ViY21kID09IE1DRV9IV19DTURfSEVBREVSKQorCWNhc2UgTUNFX0NNRF9OVUxMOgorCQlpZiAoc3ViY21kID09IE1DRV9DTURfUE9SVF9TWVMpCiAJCQlkYXRhc2l6ZSA9IDE7CiAJCWJyZWFrOwotCWNhc2UgTUNFX0hXX0NNRF9IRUFERVI6CisJY2FzZSBNQ0VfQ01EX1BPUlRfU1lTOgogCQlzd2l0Y2ggKHN1YmNtZCkgeworCQljYXNlIE1DRV9SU1BfRVFXQUtFVkVSU0lPTjoKKwkJCWRhdGFzaXplID0gNDsKKwkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfR19SRVZJU0lPTjoKIAkJCWRhdGFzaXplID0gMjsKIAkJCWJyZWFrOworCQljYXNlIE1DRV9SU1BfRVFXQUtFU1VQUE9SVDoKKwkJCWRhdGFzaXplID0gMTsKKwkJCWJyZWFrOwogCQl9Ci0JY2FzZSBNQ0VfQ09NTUFORF9IRUFERVI6CisJY2FzZSBNQ0VfQ01EX1BPUlRfSVI6CiAJCXN3aXRjaCAoc3ViY21kKSB7CiAJCWNhc2UgTUNFX0NNRF9VTktOT1dOOgotCQljYXNlIE1DRV9DTURfU19DQVJSSUVSOgotCQljYXNlIE1DRV9DTURfU19USU1FT1VUOgotCQljYXNlIE1DRV9SU1BfUFVMU0VfQ09VTlQ6CisJCWNhc2UgTUNFX1JTUF9FUUlSQ0ZTOgorCQljYXNlIE1DRV9SU1BfRVFJUlRJTUVPVVQ6CisJCWNhc2UgTUNFX1JTUF9FUUlSUlhDRkNOVDoKIAkJCWRhdGFzaXplID0gMjsKIAkJCWJyZWFrOwogCQljYXNlIE1DRV9DTURfU0lHX0VORDoKLQkJY2FzZSBNQ0VfQ01EX1NfVFhNQVNLOgotCQljYXNlIE1DRV9DTURfU19SWFNFTlNPUjoKKwkJY2FzZSBNQ0VfUlNQX0VRSVJUWFBPUlRTOgorCQljYXNlIE1DRV9SU1BfRVFJUlJYUE9SVEVOOgogCQkJZGF0YXNpemUgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ3MCw5ICs1MTgsMTAgQEAKIHsKIAljaGFyIGNvZGVzW1VTQl9CVUZMRU4gKiAzICsgMV07CiAJY2hhciBpbm91dFs5XTsKLQl1OCBjbWQsIHN1YmNtZCwgZGF0YTEsIGRhdGEyOworCXU4IGNtZCwgc3ViY21kLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBkYXRhNCwgZGF0YTU7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaXItPmRldjsKIAlpbnQgaSwgc3RhcnQsIHNraXAgPSAwOworCXUzMiBjYXJyaWVyLCBwZXJpb2Q7CiAKIAlpZiAoIWRlYnVnKQogCQlyZXR1cm47CkBAIC01MDAsMTggKzU0OSwyOCBAQAogCXN1YmNtZCA9IGJ1ZltzdGFydCArIDFdICYgMHhmZjsKIAlkYXRhMSAgPSBidWZbc3RhcnQgKyAyXSAmIDB4ZmY7CiAJZGF0YTIgID0gYnVmW3N0YXJ0ICsgM10gJiAweGZmOworCWRhdGEzICA9IGJ1ZltzdGFydCArIDRdICYgMHhmZjsKKwlkYXRhNCAgPSBidWZbc3RhcnQgKyA1XSAmIDB4ZmY7CisJZGF0YTUgID0gYnVmW3N0YXJ0ICsgNl0gJiAweGZmOwogCiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIE1DRV9DT01NQU5EX05VTEw6Ci0JCWlmICgoc3ViY21kID09IE1DRV9IV19DTURfSEVBREVSKSAmJgotCQkgICAgKGRhdGExID09IE1DRV9DTURfREVWSUNFX1JFU0VUKSkKLQkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXNldCByZXF1ZXN0ZWRcbiIpOworCWNhc2UgTUNFX0NNRF9OVUxMOgorCQlpZiAoc3ViY21kID09IE1DRV9DTURfTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKHN1YmNtZCA9PSBNQ0VfQ01EX1BPUlRfU1lTKSAmJgorCQkgICAgKGRhdGExID09IE1DRV9DTURfUkVTVU1FKSkKKwkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXN1bWUgcmVxdWVzdGVkXG4iKTsKIAkJZWxzZQogCQkJZGV2X2luZm8oZGV2LCAiVW5rbm93biBjb21tYW5kIDB4JTAyeCAweCUwMnhcbiIsCiAJCQkJIGNtZCwgc3ViY21kKTsKIAkJYnJlYWs7Ci0JY2FzZSBNQ0VfSFdfQ01EX0hFQURFUjoKKwljYXNlIE1DRV9DTURfUE9SVF9TWVM6CiAJCXN3aXRjaCAoc3ViY21kKSB7CisJCWNhc2UgTUNFX1JTUF9FUUVNVkVSOgorCQkJaWYgKCFvdXQpCisJCQkJZGV2X2luZm8oZGV2LCAiRW11bGF0b3IgaW50ZXJmYWNlIHZlcnNpb24gJXhcbiIsCisJCQkJCSBkYXRhMSk7CisJCQlicmVhazsKIAkJY2FzZSBNQ0VfQ01EX0dfUkVWSVNJT046CiAJCQlpZiAobGVuID09IDIpCiAJCQkJZGV2X2luZm8oZGV2LCAiR2V0IGh3L3N3IHJldj9cbiIpOwpAQCAtNTIwLDIxICs1NzksMzUgQEAKIAkJCQkJICIweCUwMnggMHglMDJ4XG4iLCBkYXRhMSwgZGF0YTIsCiAJCQkJCSBidWZbc3RhcnQgKyA0XSwgYnVmW3N0YXJ0ICsgNV0pOwogCQkJYnJlYWs7Ci0JCWNhc2UgTUNFX0NNRF9ERVZJQ0VfUkVTRVQ6Ci0JCQlkZXZfaW5mbyhkZXYsICJEZXZpY2UgcmVzZXQgcmVxdWVzdGVkXG4iKTsKKwkJY2FzZSBNQ0VfQ01EX1JFU1VNRToKKwkJCWRldl9pbmZvKGRldiwgIkRldmljZSByZXN1bWUgcmVxdWVzdGVkXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9SU1BfQ01EX0lOVkFMSUQ6Ci0JCQlkZXZfaW5mbyhkZXYsICJQcmV2aW91cyBjb21tYW5kIG5vdCBzdXBwb3J0ZWRcbiIpOworCQljYXNlIE1DRV9SU1BfQ01EX0lMTEVHQUw6CisJCQlkZXZfaW5mbyhkZXYsICJJbGxlZ2FsIFBPUlRfU1lTIGNvbW1hbmRcbiIpOwogCQkJYnJlYWs7Ci0JCWNhc2UgTUNFX0NNRF9VTktOT1dONzoKLQkJY2FzZSBNQ0VfQ01EX1VOS05PV045OgorCQljYXNlIE1DRV9SU1BfRVFXQUtFVkVSU0lPTjoKKwkJCWlmICghb3V0KQorCQkJCWRldl9pbmZvKGRldiwgIldha2UgdmVyc2lvbiwgcHJvdG86IDB4JTAyeCwgIgorCQkJCQkgInBheWxvYWQ6IDB4JTAyeCwgYWRkcmVzczogMHglMDJ4LCAiCisJCQkJCSAidmVyc2lvbjogMHglMDJ4XG4iLAorCQkJCQkgZGF0YTEsIGRhdGEyLCBkYXRhMywgZGF0YTQpOworCQkJYnJlYWs7CisJCWNhc2UgTUNFX1JTUF9HRVRQT1JUU1RBVFVTOgorCQkJaWYgKCFvdXQpCisJCQkJLyogV2UgdXNlIGRhdGExICsgMSBoZXJlLCB0byBtYXRjaCBodyBsYWJlbHMgKi8KKwkJCQlkZXZfaW5mbyhkZXYsICJUWCBwb3J0ICVkOiBibGFzdGVyIGlzJXMgY29ubmVjdGVkXG4iLAorCQkJCQkgZGF0YTEgKyAxLCBkYXRhNCA/ICIgbm90IiA6ICIiKTsKKwkJCWJyZWFrOworCQljYXNlIE1DRV9DTURfRkxBU0hMRUQ6CisJCQlkZXZfaW5mbyhkZXYsICJBdHRlbXB0aW5nIHRvIGZsYXNoIExFRFxuIik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9pbmZvKGRldiwgIlVua25vd24gY29tbWFuZCAweCUwMnggMHglMDJ4XG4iLAogCQkJCSBjbWQsIHN1YmNtZCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIE1DRV9DT01NQU5EX0hFQURFUjoKKwljYXNlIE1DRV9DTURfUE9SVF9JUjoKIAkJc3dpdGNoIChzdWJjbWQpIHsKIAkJY2FzZSBNQ0VfQ01EX1NJR19FTkQ6CiAJCQlkZXZfaW5mbyhkZXYsICJFbmQgb2Ygc2lnbmFsXG4iKTsKQEAgLTU0Niw0NyArNjE5LDU1IEBACiAJCQlkZXZfaW5mbyhkZXYsICJSZXNwIHRvIDlmIDA1IG9mIDB4JTAyeCAweCUwMnhcbiIsCiAJCQkJIGRhdGExLCBkYXRhMik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfQ0FSUklFUjoKLQkJCWRldl9pbmZvKGRldiwgIiVzIGNhcnJpZXIgbW9kZSBhbmQgZnJlcSBvZiAiCi0JCQkJICIweCUwMnggMHglMDJ4XG4iLCBpbm91dCwgZGF0YTEsIGRhdGEyKTsKKwkJY2FzZSBNQ0VfUlNQX0VRSVJDRlM6CisJCQlwZXJpb2QgPSBESVZfUk9VTkRfQ0xPU0VTVCgKKwkJCQkJKDEgPDwgZGF0YTEgKiAyKSAqIChkYXRhMiArIDEpLCAxMCk7CisJCQlpZiAoIXBlcmlvZCkKKwkJCQlicmVhazsKKwkJCWNhcnJpZXIgPSAoMTAwMCAqIDEwMDApIC8gcGVyaW9kOworCQkJZGV2X2luZm8oZGV2LCAiJXMgY2FycmllciBvZiAldSBIeiAocGVyaW9kICV1dXMpXG4iLAorCQkJCSBpbm91dCwgY2FycmllciwgcGVyaW9kKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfR19DQVJSSUVSOgorCQljYXNlIE1DRV9DTURfR0VUSVJDRlM6CiAJCQlkZXZfaW5mbyhkZXYsICJHZXQgY2FycmllciBtb2RlIGFuZCBmcmVxXG4iKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfU19UWE1BU0s6CisJCWNhc2UgTUNFX1JTUF9FUUlSVFhQT1JUUzoKIAkJCWRldl9pbmZvKGRldiwgIiVzIHRyYW5zbWl0IGJsYXN0ZXIgbWFzayBvZiAweCUwMnhcbiIsCiAJCQkJIGlub3V0LCBkYXRhMSk7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfVElNRU9VVDoKKwkJY2FzZSBNQ0VfUlNQX0VRSVJUSU1FT1VUOgogCQkJLyogdmFsdWUgaXMgaW4gdW5pdHMgb2YgNTB1cywgc28geCo1MC8xMDAwIG1zICovCisJCQlwZXJpb2QgPSAoKGRhdGExIDw8IDgpIHwgZGF0YTIpICogTUNFX1RJTUVfVU5JVCAvIDEwMDA7CiAJCQlkZXZfaW5mbyhkZXYsICIlcyByZWNlaXZlIHRpbWVvdXQgb2YgJWQgbXNcbiIsCi0JCQkJIGlub3V0LAotCQkJCSAoKGRhdGExIDw8IDgpIHwgZGF0YTIpICogTUNFX1RJTUVfVU5JVCAvIDEwMDApOworCQkJCSBpbm91dCwgcGVyaW9kKTsKIAkJCWJyZWFrOwotCQljYXNlIE1DRV9DTURfR19USU1FT1VUOgorCQljYXNlIE1DRV9DTURfR0VUSVJUSU1FT1VUOgogCQkJZGV2X2luZm8oZGV2LCAiR2V0IHJlY2VpdmUgdGltZW91dFxuIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX0dfVFhNQVNLOgorCQljYXNlIE1DRV9DTURfR0VUSVJUWFBPUlRTOgogCQkJZGV2X2luZm8oZGV2LCAiR2V0IHRyYW5zbWl0IGJsYXN0ZXIgbWFza1xuIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1NfUlhTRU5TT1I6CisJCWNhc2UgTUNFX1JTUF9FUUlSUlhQT1JURU46CiAJCQlkZXZfaW5mbyhkZXYsICIlcyAlcy1yYW5nZSByZWNlaXZlIHNlbnNvciBpbiB1c2VcbiIsCiAJCQkJIGlub3V0LCBkYXRhMSA9PSAweDAyID8gInNob3J0IiA6ICJsb25nIik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX0dfUlhTRU5TT1I6Ci0JCS8qIGFrYSBNQ0VfUlNQX1BVTFNFX0NPVU5UICovCisJCWNhc2UgTUNFX0NNRF9HRVRJUlJYUE9SVEVOOgorCQkvKiBha2EgTUNFX1JTUF9FUUlSUlhDRkNOVCAqLwogCQkJaWYgKG91dCkKIAkJCQlkZXZfaW5mbyhkZXYsICJHZXQgcmVjZWl2ZSBzZW5zb3JcbiIpOwogCQkJZWxzZSBpZiAoaXItPmxlYXJuaW5nX2VuYWJsZWQpCiAJCQkJZGV2X2luZm8oZGV2LCAiUlggcHVsc2UgY291bnQ6ICVkXG4iLAogCQkJCQkgKChkYXRhMSA8PCA4KSB8IGRhdGEyKSk7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfUlNQX0NNRF9JTlZBTElEOgotCQkJZGV2X2luZm8oZGV2LCAiRXJyb3IhIEhhcmR3YXJlIGlzIGxpa2VseSB3ZWRnZWQuLi5cbiIpOworCQljYXNlIE1DRV9SU1BfRVFJUk5VTVBPUlRTOgorCQkJaWYgKG91dCkKKwkJCQlicmVhazsKKwkJCWRldl9pbmZvKGRldiwgIk51bSBUWCBwb3J0czogJXgsIG51bSBSWCBwb3J0czogJXhcbiIsCisJCQkJIGRhdGExLCBkYXRhMik7CiAJCQlicmVhazsKLQkJY2FzZSBNQ0VfQ01EX1VOS05PV04yOgotCQljYXNlIE1DRV9DTURfVU5LTk9XTjM6Ci0JCWNhc2UgTUNFX0NNRF9VTktOT1dONToKKwkJY2FzZSBNQ0VfUlNQX0NNRF9JTExFR0FMOgorCQkJZGV2X2luZm8oZGV2LCAiSWxsZWdhbCBQT1JUX0lSIGNvbW1hbmRcbiIpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfaW5mbyhkZXYsICJVbmtub3duIGNvbW1hbmQgMHglMDJ4IDB4JTAyeFxuIiwKIAkJCQkgY21kLCBzdWJjbWQpOwpAQCAtNTk5LDggKzY4MCw4IEBACiAKIAlpZiAoY21kID09IE1DRV9JUkRBVEFfVFJBSUxFUikKIAkJZGV2X2luZm8oZGV2LCAiRW5kIG9mIHJhdyBJUiBkYXRhXG4iKTsKLQllbHNlIGlmICgoY21kICE9IE1DRV9DT01NQU5EX0hFQURFUikgJiYKLQkJICgoY21kICYgTUNFX0NPTU1BTkRfTUFTSykgPT0gTUNFX0NPTU1BTkRfSVJEQVRBKSkKKwllbHNlIGlmICgoY21kICE9IE1DRV9DTURfUE9SVF9JUikgJiYKKwkJICgoY21kICYgTUNFX1BPUlRfTUFTSykgPT0gTUNFX0NPTU1BTkRfSVJEQVRBKSkKIAkJZGV2X2luZm8oZGV2LCAiUmF3IElSIGRhdGEsICVkIHB1bHNlL3NwYWNlIHNhbXBsZXNcbiIsIGlyLT5yZW0pOwogfQogCkBAIC02MTYsOSArNjk3LDYgQEAKIAlpZiAoaXIpIHsKIAkJbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCi0JCW1jZV9kYmcoaXItPmRldiwgImNhbGxiYWNrIGNhbGxlZCAoc3RhdHVzPSVkIGxlbj0lZClcbiIsCi0JCQl1cmItPnN0YXR1cywgbGVuKTsKLQogCQltY2V1c2JfZGV2X3ByaW50ZGF0YShpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIGxlbiwgdHJ1ZSk7CiAJfQogCkBAIC02ODMsNyArNzYxLDE2IEBACiAKIHN0YXRpYyB2b2lkIG1jZV9hc3luY19vdXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSkKIHsKKwlpbnQgcnNpemUgPSBzaXplb2YoREVWSUNFX1JFU1VNRSk7CisKKwlpZiAoaXItPm5lZWRfcmVzZXQpIHsKKwkJaXItPm5lZWRfcmVzZXQgPSBmYWxzZTsKKwkJbWNlX3JlcXVlc3RfcGFja2V0KGlyLCBERVZJQ0VfUkVTVU1FLCByc2l6ZSwgTUNFVVNCX1RYKTsKKwkJbXNsZWVwKDEwKTsKKwl9CisKIAltY2VfcmVxdWVzdF9wYWNrZXQoaXIsIGRhdGEsIHNpemUsIE1DRVVTQl9UWCk7CisJbXNsZWVwKDEwKTsKIH0KIAogc3RhdGljIHZvaWQgbWNlX2ZsdXNoX3J4X2J1ZmZlcihzdHJ1Y3QgbWNldXNiX2RldiAqaXIsIGludCBzaXplKQpAQCAtNzA4LDggKzc5NSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogTUNFIHR4IGluaXQgaGVhZGVyICovCi0JY21kYnVmW2NtZGNvdW50KytdID0gTUNFX0NPTU1BTkRfSEVBREVSOwotCWNtZGJ1ZltjbWRjb3VudCsrXSA9IE1DRV9DTURfU19UWE1BU0s7CisJY21kYnVmW2NtZGNvdW50KytdID0gTUNFX0NNRF9QT1JUX0lSOworCWNtZGJ1ZltjbWRjb3VudCsrXSA9IE1DRV9DTURfU0VUSVJUWFBPUlRTOwogCWNtZGJ1ZltjbWRjb3VudCsrXSA9IGlyLT50eF9tYXNrOwogCiAJLyogR2VuZXJhdGUgbWNlIHBhY2tldCBkYXRhICovCkBAIC03OTUsOCArODgyLDggQEAKIAlzdHJ1Y3QgbWNldXNiX2RldiAqaXIgPSBkZXYtPnByaXY7CiAJaW50IGNsayA9IDEwMDAwMDAwOwogCWludCBwcmVzY2FsZXIgPSAwLCBkaXZpc29yID0gMDsKLQl1bnNpZ25lZCBjaGFyIGNtZGJ1Zls0XSA9IHsgTUNFX0NPTU1BTkRfSEVBREVSLAotCQkJCSAgICBNQ0VfQ01EX1NfQ0FSUklFUiwgMHgwMCwgMHgwMCB9OworCXVuc2lnbmVkIGNoYXIgY21kYnVmWzRdID0geyBNQ0VfQ01EX1BPUlRfSVIsCisJCQkJICAgIE1DRV9DTURfU0VUSVJDRlMsIDB4MDAsIDB4MDAgfTsKIAogCS8qIENhcnJpZXIgaGFzIGNoYW5nZWQgKi8KIAlpZiAoaXItPmNhcnJpZXIgIT0gY2FycmllcikgewpAQCAtODQ0LDE3ICs5MzEsMzQgQEAKIAl1OCBsbyA9IGlyLT5idWZfaW5baW5kZXggKyAyXSAmIDB4ZmY7CiAKIAlzd2l0Y2ggKGlyLT5idWZfaW5baW5kZXhdKSB7CisJLyogdGhlIG9uZSBhbmQgb25seSA1LWJ5dGUgcmV0dXJuIHZhbHVlIGNvbW1hbmQgKi8KKwljYXNlIE1DRV9SU1BfR0VUUE9SVFNUQVRVUzoKKwkJaWYgKChpci0+YnVmX2luW2luZGV4ICsgNF0gJiAweGZmKSA9PSAweDAwKQorCQkJaXItPnR4cG9ydHNfY2FibGVkIHw9IDEgPDwgaGk7CisJCWJyZWFrOworCiAJLyogMi1ieXRlIHJldHVybiB2YWx1ZSBjb21tYW5kcyAqLwotCWNhc2UgTUNFX0NNRF9TX1RJTUVPVVQ6CisJY2FzZSBNQ0VfUlNQX0VRSVJUSU1FT1VUOgogCQlpci0+cmMtPnRpbWVvdXQgPSBVU19UT19OUygoaGkgPDwgOCB8IGxvKSAqIE1DRV9USU1FX1VOSVQpOwogCQlicmVhazsKKwljYXNlIE1DRV9SU1BfRVFJUk5VTVBPUlRTOgorCQlpci0+bnVtX3R4cG9ydHMgPSBoaTsKKwkJaXItPm51bV9yeHBvcnRzID0gbG87CisJCWJyZWFrOwogCiAJLyogMS1ieXRlIHJldHVybiB2YWx1ZSBjb21tYW5kcyAqLwotCWNhc2UgTUNFX0NNRF9TX1RYTUFTSzoKKwljYXNlIE1DRV9SU1BfRVFFTVZFUjoKKwkJaXItPmVtdmVyID0gaGk7CisJCWJyZWFrOworCWNhc2UgTUNFX1JTUF9FUUlSVFhQT1JUUzoKIAkJaXItPnR4X21hc2sgPSBoaTsKIAkJYnJlYWs7Ci0JY2FzZSBNQ0VfQ01EX1NfUlhTRU5TT1I6Ci0JCWlyLT5sZWFybmluZ19lbmFibGVkID0gKGhpID09IDB4MDIpOworCWNhc2UgTUNFX1JTUF9FUUlSUlhQT1JURU46CisJCWlyLT5sZWFybmluZ19lbmFibGVkID0gKChoaSAmIDB4MDIpID09IDB4MDIpOworCQlpci0+cnhwb3J0c19hY3RpdmUgPSBoaTsKKwkJYnJlYWs7CisJY2FzZSBNQ0VfUlNQX0NNRF9JTExFR0FMOgorCQlpci0+bmVlZF9yZXNldCA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtOTAzLDggKzEwMDcsOCBAQAogCQkJLyogZGVjb2RlIG1jZSBwYWNrZXRzIG9mIHRoZSBmb3JtICg4NCksQUEsQkIsQ0MsREQgKi8KIAkJCS8qIElSIGRhdGEgcGFja2V0cyBjYW4gc3BhbiBVU0IgbWVzc2FnZXMgLSByZW0gKi8KIAkJCWlyLT5jbWQgPSBpci0+YnVmX2luW2ldOwotCQkJaWYgKChpci0+Y21kID09IE1DRV9DT01NQU5EX0hFQURFUikgfHwKLQkJCSAgICAoKGlyLT5jbWQgJiBNQ0VfQ09NTUFORF9NQVNLKSAhPQorCQkJaWYgKChpci0+Y21kID09IE1DRV9DTURfUE9SVF9JUikgfHwKKwkJCSAgICAoKGlyLT5jbWQgJiBNQ0VfUE9SVF9NQVNLKSAhPQogCQkJICAgICBNQ0VfQ09NTUFORF9JUkRBVEEpKSB7CiAJCQkJaXItPnBhcnNlcl9zdGF0ZSA9IFNVQkNNRDsKIAkJCQljb250aW51ZTsKQEAgLTk2OSw2ICsxMDczLDEzIEBACiAJdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIH0KIAorc3RhdGljIHZvaWQgbWNldXNiX2dldF9lbXVsYXRvcl92ZXJzaW9uKHN0cnVjdCBtY2V1c2JfZGV2ICppcikKK3sKKwkvKiBJZiB3ZSBnZXQgbm8gcmVwbHkgb3IgYW4gaWxsZWdhbCBjb21tYW5kIHJlcGx5LCBpdHMgdmVyIDEsIHNheXMgTVMgKi8KKwlpci0+ZW12ZXIgPSAxOworCW1jZV9hc3luY19vdXQoaXIsIEdFVF9FTVZFUiwgc2l6ZW9mKEdFVF9FTVZFUikpOworfQorCiBzdGF0aWMgdm9pZCBtY2V1c2JfZ2VuMV9pbml0KHN0cnVjdCBtY2V1c2JfZGV2ICppcikKIHsKIAlpbnQgcmV0OwpAQCAtMTAxMSw4ICsxMTIyLDggQEAKIAkJCSAgICAgIDB4MDAwMCwgMHgwMTAwLCBOVUxMLCAwLCBIWiAqIDMpOwogCW1jZV9kYmcoZGV2LCAiJXMgLSByZXRDID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCi0JLyogZGV2aWNlIHJlc2V0ICovCi0JbWNlX2FzeW5jX291dChpciwgREVWSUNFX1JFU0VULCBzaXplb2YoREVWSUNFX1JFU0VUKSk7CisJLyogZGV2aWNlIHJlc3VtZSAqLworCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNVTUUsIHNpemVvZihERVZJQ0VfUkVTVU1FKSk7CiAKIAkvKiBnZXQgaHcvc3cgcmV2aXNpb24/ICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1JFVklTSU9OLCBzaXplb2YoR0VUX1JFVklTSU9OKSk7CkBAIC0xMDIyLDIzICsxMTMzLDM2IEBACiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZW4yX2luaXQoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQogewotCS8qIGRldmljZSByZXNldCAqLwotCW1jZV9hc3luY19vdXQoaXIsIERFVklDRV9SRVNFVCwgc2l6ZW9mKERFVklDRV9SRVNFVCkpOworCS8qIGRldmljZSByZXN1bWUgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBERVZJQ0VfUkVTVU1FLCBzaXplb2YoREVWSUNFX1JFU1VNRSkpOwogCiAJLyogZ2V0IGh3L3N3IHJldmlzaW9uPyAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9SRVZJU0lPTiwgc2l6ZW9mKEdFVF9SRVZJU0lPTikpOwogCi0JLyogdW5rbm93biB3aGF0IHRoZSBuZXh0IHR3byBhY3R1YWxseSByZXR1cm4uLi4gKi8KLQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVU5LTk9XTiwgc2l6ZW9mKEdFVF9VTktOT1dOKSk7CisJLyogZ2V0IHdha2UgdmVyc2lvbiAocHJvdG9jb2wsIGtleSwgYWRkcmVzcykgKi8KKwltY2VfYXN5bmNfb3V0KGlyLCBHRVRfV0FLRVZFUlNJT04sIHNpemVvZihHRVRfV0FLRVZFUlNJT04pKTsKKworCS8qIHVua25vd24gd2hhdCB0aGlzIG9uZSBhY3R1YWxseSByZXR1cm5zLi4uICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1VOS05PV04yLCBzaXplb2YoR0VUX1VOS05PV04yKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1jZXVzYl9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCiB7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBjbWRidWZbM10gPSB7IE1DRV9DTURfUE9SVF9TWVMsCisJCQkJICAgIE1DRV9DTURfR0VUUE9SVFNUQVRVUywgMHgwMCB9OworCisJLyogZGVmYXVsdHMsIGlmIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgcXVlcnlpbmcgKi8KKwlpci0+bnVtX3R4cG9ydHMgPSAyOworCWlyLT5udW1fcnhwb3J0cyA9IDI7CisKKwkvKiBnZXQgbnVtYmVyIG9mIHR4IGFuZCByeCBwb3J0cyAqLworCW1jZV9hc3luY19vdXQoaXIsIEdFVF9OVU1fUE9SVFMsIHNpemVvZihHRVRfTlVNX1BPUlRTKSk7CisKIAkvKiBnZXQgdGhlIGNhcnJpZXIgYW5kIGZyZXF1ZW5jeSAqLwogCW1jZV9hc3luY19vdXQoaXIsIEdFVF9DQVJSSUVSX0ZSRVEsIHNpemVvZihHRVRfQ0FSUklFUl9GUkVRKSk7CiAKLQlpZiAoIWlyLT5mbGFncy5ub190eCkKKwlpZiAoaXItPm51bV90eHBvcnRzICYmICFpci0+ZmxhZ3Mubm9fdHgpCiAJCS8qIGdldCB0aGUgdHJhbnNtaXR0ZXIgYml0bWFzayAqLwogCQltY2VfYXN5bmNfb3V0KGlyLCBHRVRfVFhfQklUTUFTSywgc2l6ZW9mKEdFVF9UWF9CSVRNQVNLKSk7CiAKQEAgLTEwNDcsNiArMTE3MSwxOSBAQAogCiAJLyogZ2V0IHJlY2VpdmVyIHNlbnNvciBzZXR0aW5nICovCiAJbWNlX2FzeW5jX291dChpciwgR0VUX1JYX1NFTlNPUiwgc2l6ZW9mKEdFVF9SWF9TRU5TT1IpKTsKKworCWZvciAoaSA9IDA7IGkgPCBpci0+bnVtX3R4cG9ydHM7IGkrKykgeworCQljbWRidWZbMl0gPSBpOworCQltY2VfYXN5bmNfb3V0KGlyLCBjbWRidWYsIHNpemVvZihjbWRidWYpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1jZXVzYl9mbGFzaF9sZWQoc3RydWN0IG1jZXVzYl9kZXYgKmlyKQoreworCWlmIChpci0+ZW12ZXIgPCAyKQorCQlyZXR1cm47CisKKwltY2VfYXN5bmNfb3V0KGlyLCBGTEFTSF9MRUQsIHNpemVvZihGTEFTSF9MRUQpKTsKIH0KIAogc3RhdGljIHN0cnVjdCByY19kZXYgKm1jZXVzYl9pbml0X3JjX2RldihzdHJ1Y3QgbWNldXNiX2RldiAqaXIpCkBAIC0xMjIwLDYgKzEzNTcsOSBAQAogCW1jZV9kYmcoJmludGYtPmRldiwgIkZsdXNoaW5nIHJlY2VpdmUgYnVmZmVyc1xuIik7CiAJbWNlX2ZsdXNoX3J4X2J1ZmZlcihpciwgbWF4cCk7CiAKKwkvKiBmaWd1cmUgb3V0IHdoaWNoIGZpcm13YXJlL2VtdWxhdG9yIHZlcnNpb24gdGhpcyBoYXJkd2FyZSBoYXMgKi8KKwltY2V1c2JfZ2V0X2VtdWxhdG9yX3ZlcnNpb24oaXIpOworCiAJLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KIAlpZiAoaXItPmZsYWdzLm1pY3Jvc29mdF9nZW4xKQogCQltY2V1c2JfZ2VuMV9pbml0KGlyKTsKQEAgLTEyMjgsMTMgKzEzNjgsMjMgQEAKIAogCW1jZXVzYl9nZXRfcGFyYW1ldGVycyhpcik7CiAKKwltY2V1c2JfZmxhc2hfbGVkKGlyKTsKKwogCWlmICghaXItPmZsYWdzLm5vX3R4KQogCQltY2V1c2Jfc2V0X3R4X21hc2soaXItPnJjLCBNQ0VfREVGQVVMVF9UWF9NQVNLKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaXIpOwogCi0JZGV2X2luZm8oJmludGYtPmRldiwgIlJlZ2lzdGVyZWQgJXMgb24gdXNiJWQ6JWRcbiIsIG5hbWUsCi0JCSBkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPmRldm51bSk7CisJLyogZW5hYmxlIHdha2UgdmlhIHRoaXMgZGV2aWNlICovCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZShpci0+ZGV2LCB0cnVlKTsKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoaXItPmRldiwgdHJ1ZSk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiUmVnaXN0ZXJlZCAlcyB3aXRoIG1jZSBlbXVsYXRvciBpbnRlcmZhY2UgIgorCQkgInZlcnNpb24gJXhcbiIsIG5hbWUsIGlyLT5lbXZlcik7CisJZGV2X2luZm8oJmludGYtPmRldiwgIiV4IHR4IHBvcnRzICgweCV4IGNhYmxlZCkgYW5kICIKKwkJICIleCByeCBzZW5zb3JzICgweCV4IGFjdGl2ZSlcbiIsCisJCSBpci0+bnVtX3R4cG9ydHMsIGlyLT50eHBvcnRzX2NhYmxlZCwKKwkJIGlyLT5udW1fcnhwb3J0cywgaXItPnJ4cG9ydHNfYWN0aXZlKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaAppbmRleCAwNGMyYzcyLi5jNmNhODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmgKQEAgLTE2Miw0OSArMTYyLDQ5IEBACiAjaWZkZWYgQ09ORklHX0lSX05FQ19ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX25lY19kZWNvZGUoKQlyZXF1ZXN0X21vZHVsZSgiaXItbmVjLWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9uZWNfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbmVjX2RlY29kZSh2b2lkKSB7IH0KICNlbmRpZgogCiAvKiBmcm9tIGlyLXJjNS1kZWNvZGVyLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfUkM1X0RFQ09ERVJfTU9EVUxFCiAjZGVmaW5lIGxvYWRfcmM1X2RlY29kZSgpCXJlcXVlc3RfbW9kdWxlKCJpci1yYzUtZGVjb2RlciIpCiAjZWxzZQotI2RlZmluZSBsb2FkX3JjNV9kZWNvZGUoKQkwCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9yYzVfZGVjb2RlKHZvaWQpIHsgfQogI2VuZGlmCiAKIC8qIGZyb20gaXItcmM2LWRlY29kZXIuYyAqLwogI2lmZGVmIENPTkZJR19JUl9SQzZfREVDT0RFUl9NT0RVTEUKICNkZWZpbmUgbG9hZF9yYzZfZGVjb2RlKCkJcmVxdWVzdF9tb2R1bGUoImlyLXJjNi1kZWNvZGVyIikKICNlbHNlCi0jZGVmaW5lIGxvYWRfcmM2X2RlY29kZSgpCTAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3JjNl9kZWNvZGUodm9pZCkgeyB9CiAjZW5kaWYKIAogLyogZnJvbSBpci1qdmMtZGVjb2Rlci5jICovCiAjaWZkZWYgQ09ORklHX0lSX0pWQ19ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX2p2Y19kZWNvZGUoKQlyZXF1ZXN0X21vZHVsZSgiaXItanZjLWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9qdmNfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfanZjX2RlY29kZSh2b2lkKSB7IH0KICNlbmRpZgogCiAvKiBmcm9tIGlyLXNvbnktZGVjb2Rlci5jICovCiAjaWZkZWYgQ09ORklHX0lSX1NPTllfREVDT0RFUl9NT0RVTEUKICNkZWZpbmUgbG9hZF9zb255X2RlY29kZSgpCXJlcXVlc3RfbW9kdWxlKCJpci1zb255LWRlY29kZXIiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9zb255X2RlY29kZSgpCTAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3NvbnlfZGVjb2RlKHZvaWQpIHsgfQogI2VuZGlmCiAKIC8qIGZyb20gaXItbWNlX2tiZC1kZWNvZGVyLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfTUNFX0tCRF9ERUNPREVSX01PRFVMRQogI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJcmVxdWVzdF9tb2R1bGUoImlyLW1jZV9rYmQtZGVjb2RlciIpCiAjZWxzZQotI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbWNlX2tiZF9kZWNvZGUodm9pZCkgeyB9CiAjZW5kaWYKIAogLyogZnJvbSBpci1saXJjLWNvZGVjLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfTElSQ19DT0RFQ19NT0RVTEUKICNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJcmVxdWVzdF9tb2R1bGUoImlyLWxpcmMtY29kZWMiKQogI2Vsc2UKLSNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJMAorc3RhdGljIGlubGluZSB2b2lkIGxvYWRfbGlyY19jb2RlYyh2b2lkKSB7IH0KICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKaW5kZXggNTFhMjNmNC4uMjlmOTAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYy1jb3JlLXByaXYuaCIKIAogLyogU2l6ZXMgYXJlIGluIGJ5dGVzLCAyNTYgYnl0ZXMgYWxsb3dzIGZvciAzMiBlbnRyaWVzIG9uIHg2NCAqLwpAQCAtOTI4LDEwICs5MjksNiBAQAogCiBzdGF0aWMgdm9pZCByY19kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHJjX2RldiAqZGV2ID0gdG9fcmNfZGV2KGRldmljZSk7Ci0KLQlrZnJlZShkZXYpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCiAjZGVmaW5lIEFERF9IT1RQTFVHX1ZBUihmbXQsIHZhbC4uLikJCQkJCVwKQEAgLTk0NSw2ICs5NDIsOSBAQAogewogCXN0cnVjdCByY19kZXYgKmRldiA9IHRvX3JjX2RldihkZXZpY2UpOwogCisJaWYgKCFkZXYgfHwgIWRldi0+aW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChkZXYtPnJjX21hcC5uYW1lKQogCQlBRERfSE9UUExVR19WQVIoIk5BTUU9JXMiLCBkZXYtPnJjX21hcC5uYW1lKTsKIAlpZiAoZGV2LT5kcml2ZXJfbmFtZSkKQEAgLTEwMTMsMTAgKzEwMTMsMTYgQEAKIAogdm9pZCByY19mcmVlX2RldmljZShzdHJ1Y3QgcmNfZGV2ICpkZXYpCiB7Ci0JaWYgKGRldikgeworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlpZiAoZGV2LT5pbnB1dF9kZXYpCiAJCWlucHV0X2ZyZWVfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKLQkJcHV0X2RldmljZSgmZGV2LT5kZXYpOwotCX0KKworCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKKworCWtmcmVlKGRldik7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyY19mcmVlX2RldmljZSk7CiAKQEAgLTExNDMsMTQgKzExNDksMTggQEAKIAlpZiAoZGV2LT5kcml2ZXJfdHlwZSA9PSBSQ19EUklWRVJfSVJfUkFXKQogCQlpcl9yYXdfZXZlbnRfdW5yZWdpc3RlcihkZXYpOwogCi0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dF9kZXYpOwotCWRldi0+aW5wdXRfZGV2ID0gTlVMTDsKLQorCS8qIEZyZWVpbmcgdGhlIHRhYmxlIHNob3VsZCBhbHNvIGNhbGwgdGhlIHN0b3AgY2FsbGJhY2sgKi8KIAlpcl9mcmVlX3RhYmxlKCZkZXYtPnJjX21hcCk7CiAJSVJfZHByaW50aygxLCAiRnJlZWQga2V5Y29kZSB0YWJsZVxuIik7CiAKLQlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKKwlkZXYtPmlucHV0X2RldiA9IE5VTEw7CisKKwlkZXZpY2VfZGVsKCZkZXYtPmRldik7CisKKwlyY19mcmVlX2RldmljZShkZXYpOwogfQorCiBFWFBPUlRfU1lNQk9MX0dQTChyY191bnJlZ2lzdGVyX2RldmljZSk7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCmluZGV4IGExNjYwNDQuLjYxMjg3ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCkBAIC0xOTUsMTEgKzE5NSw2IEBACiAJZG1hX2FkZHJfdCBkbWFfaW47CiAJZG1hX2FkZHJfdCBkbWFfb3V0OwogCi0JLyogdHJ1ZSBpZiB3cml0ZSB1cmIgaXMgYnVzeSAqLwotCWJvb2wgd3JpdGVfYnVzeTsKLQkvKiB3YWl0IGZvciB0aGUgd3JpdGUgdG8gZmluaXNoICovCi0Jc3RydWN0IGNvbXBsZXRpb24gd3JpdGVfZmluaXNoZWQ7Ci0KIAkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwogCXN0cnVjdCBtdXRleCBsb2NrOwogCkBAIC0yMDcsOCArMjAyLDYgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCByeF90aW1lb3V0OwogCXUzMiBod190aW1lb3V0OwogCi0JLyogSXMgdGhlIGRldmljZSBjdXJyZW50bHkgcmVjZWl2aW5nPyAqLwotCWJvb2wgcmVjdl9pbl9wcm9ncmVzczsKIAkvKiBpcyB0aGUgZGV0ZWN0b3IgZW5hYmxlZCovCiAJYm9vbCBkZXRfZW5hYmxlZDsKIAkvKiBJcyB0aGUgZGV2aWNlIGN1cnJlbnRseSB0cmFuc21pdHRpbmc/Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYwppbmRleCBiZWM4YWJjLi4xM2Y1NGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jCkBAIC00MSw2ICs0MSw4IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMTU1LDEyICsxMTU3LDEyIEBACiAJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IEludmFsaWQgcG93ZXItb24gcHJvdG9jb2xcbiIpOworCQlwcl9lcnIoIkludmFsaWQgcG93ZXItb24gcHJvdG9jb2xcbiIpOwogCX0KIAogCXJldCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGY1NzRkYzAuLmIzMDNhM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTQ2Nyw2ICs0NjcsMjAgQEAKIAkgIE9WNzY3MCBWR0EgY2FtZXJhLiAgSXQgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCB0aGUgTTg4QUxQMDEKIAkgIGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBWSURFT19NVDlQMDMxCisJdHJpc3RhdGUgIkFwdGluYSBNVDlQMDMxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBWSURFT19WNEwyX1NVQkRFVl9BUEkKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgVmlkZW80TGludXgyIHNlbnNvci1sZXZlbCBkcml2ZXIgZm9yIHRoZSBBcHRpbmEKKwkgIChNaWNyb24pIG10OXAwMzEgNSBNcGl4ZWwgY2FtZXJhLgorCitjb25maWcgVklERU9fTVQ5VDAwMQorCXRyaXN0YXRlICJBcHRpbmEgTVQ5VDAwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIFZpZGVvNExpbnV4MiBzZW5zb3ItbGV2ZWwgZHJpdmVyIGZvciB0aGUgQXB0aW5hCisJICAoTWljcm9uKSBtdDB0MDAxIDMgTXBpeGVsIGNhbWVyYS4KKwogY29uZmlnIFZJREVPX01UOVYwMTEKIAl0cmlzdGF0ZSAiTWljcm9uIG10OXYwMTEgc2Vuc29yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgpAQCAtNDg5LDYgKzUwMywyNyBAQAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFRvc2hpYmEgVENNODI1eCBWR0EgY2FtZXJhIHNlbnNvci4KIAkgIEl0IGlzIHVzZWQgZm9yIGV4YW1wbGUgaW4gTm9raWEgTjgwMC4KIAorY29uZmlnIFZJREVPX1NSMDMwUEMzMAorCXRyaXN0YXRlICJTaWxpY29uZmlsZSBTUjAzMFBDMzAgc2Vuc29yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFNSMDMwUEMzMCBWR0EgY2FtZXJhIGZyb20gU2lsaWNvbmZpbGUKKworY29uZmlnIFZJREVPX05PT04wMTBQQzMwCisJdHJpc3RhdGUgIlNpbGljb25maWxlIE5PT04wMTBQQzMwIHNlbnNvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgRVhQRVJJTUVOVEFMICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5PT04wMTBQQzMwIENJRiBjYW1lcmEgZnJvbSBTaWxpY29uZmlsZQorCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL0tjb25maWciCisKK2NvbmZpZyBWSURFT19TNUs2QUEKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTNUs2QUFGWCBzZW5zb3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBWNEwyIHNlbnNvci1sZXZlbCBkcml2ZXIgZm9yIFNhbXN1bmcgUzVLNkFBKEZYKSAxLjNNCisJICBjYW1lcmEgc2Vuc29yIHdpdGggYW4gZW1iZWRkZWQgU29DIGltYWdlIHNpZ25hbCBwcm9jZXNzb3IuCisKIGNvbW1lbnQgIkZsYXNoIGRldmljZXMiCiAKIGNvbmZpZyBWSURFT19BRFAxNjUzCkBAIC03MDgsNiArNzQzLDggQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9LY29uZmlnIgpAQCAtNzM3LDEyICs3NzQsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXJ2LgogCi1jb25maWcgVklERU9fU1IwMzBQQzMwCi0JdHJpc3RhdGUgIlNSMDMwUEMzMCBWR0EgY2FtZXJhIHNlbnNvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBTUjAzMFBDMzAgVkdBIGNhbWVyYSBmcm9tIFNpbGljb25maWxlCi0KIGNvbmZpZyBWSURFT19WSUFfQ0FNRVJBCiAJdHJpc3RhdGUgIlZJQUZCIGNhbWVyYSBjb250cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQl9WSUEKQEAgLTc1MywxOCArNzg0LDkgQEAKIAkgICBDaHJvbWU5IGNoaXBzZXRzLiAgQ3VycmVudGx5IG9ubHkgdGVzdGVkIG9uIE9MUEMgeG8tMS41IHN5c3RlbXMKIAkgICB3aXRoIG92NzY3MCBzZW5zb3JzLgogCi1jb25maWcgVklERU9fTk9PTjAxMFBDMzAKLQl0cmlzdGF0ZSAiTk9PTjAxMFBDMzAgQ0lGIGNhbWVyYSBzZW5zb3Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTk9PTjAxMFBDMzAgQ0lGIGNhbWVyYSBmcm9tIFNpbGljb25maWxlCi0KLXNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvS2NvbmZpZyIKLQogY29uZmlnIFZJREVPX09NQVAzCiAJdHJpc3RhdGUgIk9NQVAgMyBDYW1lcmEgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlzZWxlY3QgT01BUF9JT01NVQotCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJICYmIEFSQ0hfT01BUDMgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBPTUFQX0lPVk1NICYmIFZJREVPX1Y0TDIgJiYgSTJDICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBBUkNIX09NQVAzICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgYW4gT01BUCAzIGNhbWVyYSBjb250cm9sbGVyLgogCkBAIC05NDksOCArOTcxLDkgQEAKIAkgIEludGVyZmFjZQogCiBjb25maWcgIFZJREVPX1NBTVNVTkdfUzVQX0ZJTUMKLQl0cmlzdGF0ZSAiU2Ftc3VuZyBTNVAgYW5kIEVYWU5PUzQgY2FtZXJhIGhvc3QgaW50ZXJmYWNlIGRyaXZlciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmIFBMQVRfUzVQCisJdHJpc3RhdGUgIlNhbXN1bmcgUzVQIGFuZCBFWFlOT1M0IGNhbWVyYSBpbnRlcmZhY2UgZHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMgJiYgUExBVF9TNVAgJiYgUE1fUlVOVElNRSAmJiBcCisJCVZJREVPX1Y0TDJfU1VCREVWX0FQSSAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKIAlzZWxlY3QgVjRMMl9NRU0yTUVNX0RFVgogCS0tLWhlbHAtLS0KQEAgLTEwMDQsNiArMTAyNyw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCmluZGV4IDI3MjM5MDAuLjExN2Y5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtNjUsMTEgKzY1LDE0IEBACiBvYmotJChDT05GSUdfVklERU9fT1Y3NjcwKSAJKz0gb3Y3NjcwLm8KIG9iai0kKENPTkZJR19WSURFT19UQ004MjVYKSArPSB0Y204MjV4Lm8KIG9iai0kKENPTkZJR19WSURFT19UVkVFUFJPTSkgKz0gdHZlZXByb20ubworb2JqLSQoQ09ORklHX1ZJREVPX01UOVAwMzEpICs9IG10OXAwMzEubworb2JqLSQoQ09ORklHX1ZJREVPX01UOVQwMDEpICs9IG10OXQwMDEubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVYwMTEpICs9IG10OXYwMTEubwogb2JqLSQoQ09ORklHX1ZJREVPX01UOVYwMzIpICs9IG10OXYwMzIubwogb2JqLSQoQ09ORklHX1ZJREVPX1NSMDMwUEMzMCkJKz0gc3IwMzBwYzMwLm8KIG9iai0kKENPTkZJR19WSURFT19OT09OMDEwUEMzMCkJKz0gbm9vbjAxMHBjMzAubwogb2JqLSQoQ09ORklHX1ZJREVPX001TU9MUykJKz0gbTVtb2xzLworb2JqLSQoQ09ORklHX1ZJREVPX1M1SzZBQSkJKz0gczVrNmFhLm8KIG9iai0kKENPTkZJR19WSURFT19BRFAxNjUzKQkrPSBhZHAxNjUzLm8KIAogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfSU1YMDc0KQkJKz0gaW14MDc0Lm8KQEAgLTEwMiw5ICsxMDUsMTEgQEAKIG9iai0kKENPTkZJR19WSURFT19FTTI4WFgpICs9IGVtMjh4eC8KIG9iai0kKENPTkZJR19WSURFT19UTEcyMzAwKSArPSB0bGcyMzAwLwogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjMxWFgpICs9IGN4MjMxeHgvCitvYmotJChDT05GSUdfVklERU9fQ1gyNTgyMSkgKz0gY3gyNTgyMS8KIG9iai0kKENPTkZJR19WSURFT19VU0JWSVNJT04pICs9IHVzYnZpc2lvbi8KIG9iai0kKENPTkZJR19WSURFT19QVlJVU0IyKSArPSBwdnJ1c2IyLwogb2JqLSQoQ09ORklHX1ZJREVPX0NQSUEyKSArPSBjcGlhMi8KK29iai0kKENPTkZJR19WSURFT19UTTYwMDApICs9IHRtNjAwMC8KIG9iai0kKENPTkZJR19WSURFT19NWEIpICs9IG14Yi5vCiBvYmotJChDT05GSUdfVklERU9fSEVYSVVNX09SSU9OKSArPSBoZXhpdW1fb3Jpb24ubwogb2JqLSQoQ09ORklHX1ZJREVPX0hFWElVTV9HRU1JTkkpICs9IGhleGl1bV9nZW1pbmkubwpAQCAtMTkwLDYgKzE5NSw2IEBACiAKIG9iai0kKENPTkZJR19BUkNIX09NQVApCSs9IG9tYXAvCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCmluZGV4IGJlN2JlZmQuLjEyZWVkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCkBAIC0zMSw3ICszMSw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9hZHAxNjUzLmg+CkBAIC0yNTgsNyArMjYwLDcgQEAKIAlpZiAoZmxhc2gtPmN0cmxzLmVycm9yKQogCQlyZXR1cm4gZmxhc2gtPmN0cmxzLmVycm9yOwogCi0JZmF1bHQtPmlzX3ZvbGF0aWxlID0gMTsKKwlmYXVsdC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEU7CiAKIAlmbGFzaC0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZmbGFzaC0+Y3RybHM7CiAJcmV0dXJuIDA7CkBAIC00MTMsNiArNDE1LDEwIEBACiAJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoOwogCWludCByZXQ7CiAKKwkvKiB3ZSBjb3VsZG4ndCB3b3JrIHdpdGhvdXQgcGxhdGZvcm0gZGF0YSAqLworCWlmIChjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCiAJZmxhc2ggPSBremFsbG9jKHNpemVvZigqZmxhc2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZmxhc2ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MjUsMTIgKzQzMSwyMSBAQAogCWZsYXNoLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJmFkcDE2NTNfaW50ZXJuYWxfb3BzOwogCWZsYXNoLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CiAKLQlhZHAxNjUzX2luaXRfY29udHJvbHMoZmxhc2gpOworCXJldCA9IGFkcDE2NTNfaW5pdF9jb250cm9scyhmbGFzaCk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2FuZF9xdWl0OwogCiAJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJmZsYXNoLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJa2ZyZWUoZmxhc2gpOworCQlnb3RvIGZyZWVfYW5kX3F1aXQ7CiAKKwlmbGFzaC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfRkxBU0g7CisKKwlyZXR1cm4gMDsKKworZnJlZV9hbmRfcXVpdDoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZmbGFzaC0+Y3RybHMpOworCWtmcmVlKGZsYXNoKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkdjcxNzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCmluZGV4IGQyMzI3ZGIuLjIwNjA3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWR2NzE3NS5jCkBAIC02MSw2ICs2MSwxMSBAQAogCiBzdGF0aWMgY2hhciAqaW5wdXRzW10gPSB7ICJwYXNzX3Rocm91Z2giLCAicGxheV9iYWNrIiwgImNvbG9yX2JhciIgfTsKIAorc3RhdGljIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBhZHY3MTc1X2NvZGVzW10gPSB7CisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgsCisJVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGlubGluZSBpbnQgYWR2NzE3NV93cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1OCByZWcsIHU4IHZhbHVlKQpAQCAtMjk2LDYgKzMwMSw2MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFkdjcxNzVfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkJCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSkKK3sKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShhZHY3MTc1X2NvZGVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY29kZSA9IGFkdjcxNzVfY29kZXNbaW5kZXhdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdjcxNzVfZ19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1OCB2YWwgPSBhZHY3MTc1X3JlYWQoc2QsIDB4Nyk7CisKKwlpZiAoKHZhbCAmIDB4NDApID09ICgxIDw8IDYpKQorCQltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfVVlWWThfMVgxNjsKKwllbHNlCisJCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg7CisKKwltZi0+Y29sb3JzcGFjZSAgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOworCW1mLT53aWR0aCAgICAgICA9IDA7CisJbWYtPmhlaWdodCAgICAgID0gMDsKKwltZi0+ZmllbGQgICAgICAgPSBWNEwyX0ZJRUxEX0FOWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdjcxNzVfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwl1OCB2YWwgPSBhZHY3MTc1X3JlYWQoc2QsIDB4Nyk7CisJaW50IHJldDsKKworCXN3aXRjaCAobWYtPmNvZGUpIHsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgorCQl2YWwgJj0gfjB4NDA7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTY6CisJCXZhbCB8PSAweDQwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwKKwkJCSJpbGxlZ2FsIHY0bDJfbWJ1c19mcmFtZWZtdCBjb2RlOiAlZFxuIiwgbWYtPmNvZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBhZHY3MTc1X3dyaXRlKHNkLCAweDcsIHZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkdjcxNzVfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTMyNCw2ICszODMsOSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgYWR2NzE3NV92aWRlb19vcHMgPSB7CiAJLnNfc3RkX291dHB1dCA9IGFkdjcxNzVfc19zdGRfb3V0cHV0LAogCS5zX3JvdXRpbmcgPSBhZHY3MTc1X3Nfcm91dGluZywKKwkuc19tYnVzX2ZtdCA9IGFkdjcxNzVfc19mbXQsCisJLmdfbWJ1c19mbXQgPSBhZHY3MTc1X2dfZm10LAorCS5lbnVtX21idXNfZm10ICA9IGFkdjcxNzVfZW51bV9mbXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBhZHY3MTc1X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWs4ODF4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FrODgxeC5jCmluZGV4IGIzODg2NTQuLjUzYzQ5NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWs4ODF4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hazg4MXguYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2FrODgxeC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXRtZWwtaXNpLmMKaW5kZXggN2I4OWYwMC4uOGM3NzVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F0bWVsLWlzaS5jCkBAIC05NCw2ICs5NCw3IEBACiAJdW5zaWduZWQgaW50CQkJaXJxOwogCiAJc3RydWN0IGlzaV9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwl1MTYJCQkJd2lkdGhfZmxhZ3M7CS8qIG1heCAxMiBiaXRzICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQl2aWRlb19idWZmZXJfbGlzdDsKIAlzdHJ1Y3QgZnJhbWVfYnVmZmVyCQkqYWN0aXZlOwpAQCAtMjQ4LDkgKzI0OSw5IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlWaWRlb2J1ZiBvcGVyYXRpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCQl2b2lkICphbGxvY19jdHhzW10pCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCisJCQkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwpAQCAtMzQxLDcgKzM0Miw3IEBACiAKIAkJCS8qIEluaXRpYWxpemUgdGhlIGRtYSBkZXNjcmlwdG9yICovCiAJCQlkZXNjLT5wX2ZiZC0+ZmJfYWRkcmVzcyA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwogCQkJZGVzYy0+cF9mYmQtPm5leHRfZmJkX2FkZHJlc3MgPSAwOwogCQkJc2V0X2RtYV9jdHJsKGRlc2MtPnBfZmJkLCBJU0lfRE1BX0NUUkxfV0IpOwogCkBAIC00MDQsMTIgKzQwNSwxMyBAQAogCiAJaWYgKGlzaS0+YWN0aXZlID09IE5VTEwpIHsKIAkJaXNpLT5hY3RpdmUgPSBidWY7Ci0JCXN0YXJ0X2RtYShpc2ksIGJ1Zik7CisJCWlmICh2YjJfaXNfc3RyZWFtaW5nKHZiLT52YjJfcXVldWUpKQorCQkJc3RhcnRfZG1hKGlzaSwgYnVmKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNpLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwpAQCAtNDMxLDE3ICs0MzMsMjYgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNpLT52c3luY193cSwKIAkJCQkgICAgICAgaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfSURMRSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnI7CiAKLQlpZiAoaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfUkVBRFkpCi0JCXJldHVybiAtRUlPOworCWlmIChpc2ktPnN0YXRlICE9IElTSV9TVEFURV9SRUFEWSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOwogCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfV0FJVF9TT0Y7CiAJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9TUl9WU1lOQyk7CisJaWYgKGNvdW50KQorCQlzdGFydF9kbWEoaXNpLCBpc2ktPmFjdGl2ZSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOwogCiAJcmV0dXJuIDA7CitlcnI6CisJaXNpLT5hY3RpdmUgPSBOVUxMOworCWlzaS0+c2VxdWVuY2UgPSAwOworCUlOSVRfTElTVF9IRUFEKCZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBhYm9ydCBzdHJlYW1pbmcgYW5kIHdhaXQgZm9yIGxhc3QgYnVmZmVyICovCkBAIC02MzcsNTAgKzY0OCw0MiBAQAogCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfRVhURU5EMTYpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYWtlX2J1c19wYXJhbShzdHJ1Y3QgYXRtZWxfaXNpICppc2kpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvKgotCSAqIFBsYXRmb3JtIHNwZWNpZmllZCBzeW5jaHJvbml6YXRpb24gYW5kIHBpeGVsIGNsb2NrIHBvbGFyaXRpZXMgYXJlCi0JICogb25seSBhIHJlY29tbWVuZGF0aW9uIGFuZCBhcmUgb25seSB1c2VkIGR1cmluZyBwcm9iaW5nLiBBdG1lbCBJU0kKLQkgKiBjYW1lcmEgaW50ZXJmYWNlIG9ubHkgd29ya3MgaW4gbWFzdGVyIG1vZGUsIGkuZS4sIHVzZXMgSFNZTkMgYW5kCi0JICogVlNZTkMgc2lnbmFscyBmcm9tIHRoZSBzZW5zb3IKLQkgKi8KLQlmbGFncyA9IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JaWYgKGlzaS0+cGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzEwKQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0KLQlpZiAoaXNpLT5wZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfOCkKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzg7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykKLQkJcmV0dXJuIGZsYWdzOwotCi0JcmV0dXJuIDA7Ci19CisjZGVmaW5lIElTSV9CVVNfUEFSQU0gKFY0TDJfTUJVU19NQVNURVIgfAlcCisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAlcCisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwJXAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCkKIAogc3RhdGljIGludCBpc2lfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBjb21tb25fZmxhZ3M7CiAJaW50IHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKLQkJCQkJbWFrZV9idXNfcGFyYW0oaXNpKSk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgSVNJX0JVU19QQVJBTSk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHgleFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBJU0lfQlVTX1BBUkFNKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCgxIDw8IChidXN3aWR0aCAtIDEpKSAmIGlzaS0+d2lkdGhfZmxhZ3MpCisJCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiAKQEAgLTgwMiw1OSArODA1LDcxIEBACiAKIHN0YXRpYyBpbnQgaXNpX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MzIgcGl4Zm10KQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0OwogCXUzMiBjZmcxID0gMDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWJ1c19mbGFncyA9IG1ha2VfYnVzX3BhcmFtKGlzaSk7Ci0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7Ci0JZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZsYWdzIGNhbTogMHglbHggaG9zdDogMHglbHggY29tbW9uOiAweCVseFxuIiwKLQkJY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgSVNJX0JVU19QQVJBTSk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHgleFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBJU0lfQlVTX1BBUkFNKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJY29tbW9uX2ZsYWdzID0gSVNJX0JVU19QQVJBTTsKKwl9CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZsYWdzIGNhbTogMHgleCBob3N0OiAweCV4IGNvbW1vbjogMHglbHhcbiIsCisJCWNmZy5mbGFncywgSVNJX0JVU19QQVJBTSwgY29tbW9uX2ZsYWdzKTsKIAogCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gcHJlZmVyZW5jZXMgKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAoaXNpLT5wZGF0YS0+aHN5bmNfYWN0X2xvdykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAoaXNpLT5wZGF0YS0+dnN5bmNfYWN0X2xvdykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CiAJCWlmIChpc2ktPnBkYXRhLT5wY2xrX2FjdF9mYWxsaW5nKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkc7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CiAJfQogCi0JcmV0ID0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBjb21tb25fZmxhZ3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoaWNkLT5wYXJlbnQsICJDYW1lcmEgc2V0X2J1c19wYXJhbSglbHgpIHJldHVybmVkICVkXG4iLAorCWNmZy5mbGFncyA9IGNvbW1vbl9mbGFnczsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlkZXZfZGJnKGljZC0+cGFyZW50LCAiY2FtZXJhIHNfbWJ1c19jb25maWcoMHglbHgpIHJldHVybmVkICVkXG4iLAogCQkJY29tbW9uX2ZsYWdzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIHNldCBidXMgcGFyYW0gZm9yIElTSSAqLwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJY2ZnMSB8PSBJU0lfQ0ZHMV9IU1lOQ19QT0xfQUNUSVZFX0xPVzsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCiAJCWNmZzEgfD0gSVNJX0NGRzFfVlNZTkNfUE9MX0FDVElWRV9MT1c7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQogCQljZmcxIHw9IElTSV9DRkcxX1BJWENMS19QT0xfQUNUSVZFX0ZBTExJTkc7CiAKIAlpZiAoaXNpLT5wZGF0YS0+aGFzX2VtYl9zeW5jKQpAQCAtOTczLDYgKzk4OCwxMSBAQAogCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAorCWlmIChwZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfOCkKKwkJaXNpLT53aWR0aF9mbGFncyA9IDEgPDwgNzsKKwlpZiAocGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzEwKQorCQlpc2ktPndpZHRoX2ZsYWdzIHw9IDEgPDwgOTsKKwogCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCmluZGV4IDVjN2YyZjcuLmJkMjIyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogCiBvYmotJChDT05GSUdfVklERU9fQVUwODI4KSArPSBhdTA4MjgubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogCi1FWFRSQV9DRkxBR1MgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKK2NjZmxhZ3MteSArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgxOS5jCmluZGV4IGY4NzIwNDQuLjg1OWVhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODE5LmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCWlmIChwc3RkKQogCQkqcHN0ZCA9IHN0ZDsKIAlpZiAocHN0YXR1cykKLQkJKnBzdGF0dXMgPSBzdGF0dXM7CisJCSpwc3RhdHVzID0gcmVzOwogCiAJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiZ2V0IHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L01ha2VmaWxlCmluZGV4IGU0MTVmNmYuLjNmOWEyYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0JUODQ4KSArPSBidHR2Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCA1YjE1ZjYzLi41OTM5MDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtMjUsNiArMjUsOCBAQAogCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KQEAgLTI5MDUsMTkgKzI5MDcsMTcgQEAKIAogCQlpZiAodHlwZSAhPSAtMSkgewogCQkJLyogZm91bmQgaXQgKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgIgotCQkJICAgICAgICJQQ0kgc3Vic3lzdGVtIElEIGlzICUwNHg6JTA0eFxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCi0JCQkgICAgICAgYnR2LT5jYXJkaWQgJiAweGZmZmYsCi0JCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CisJCQlwcl9pbmZvKCIlZDogZGV0ZWN0ZWQ6ICVzIFtjYXJkPSVkXSwgUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCisJCQkJYnR2LT5jLm5yLCBjYXJkc1t0eXBlXS5uYW1lLCBjYXJkc1t0eXBlXS5jYXJkbnIsCisJCQkJYnR2LT5jYXJkaWQgJiAweGZmZmYsCisJCQkJKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CiAJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKIAkJfSBlbHNlIHsKIAkJCS8qIDQwNCAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCi0JCQkgICAgICAgYnR2LT5jLm5yLCBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKLQkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgotCQkJICAgICAgICJ0aGUgY29ycmVjdCBjYXJkPSBpbnNtb2Qgb3B0aW9uIHRvIGxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZ1xuIik7CisJCQlwcl9pbmZvKCIlZDogc3Vic3lzdGVtOiAlMDR4OiUwNHggKFVOS05PV04pXG4iLAorCQkJCWJ0di0+Yy5uciwgYnR2LT5jYXJkaWQgJiAweGZmZmYsCisJCQkJKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CisJCQlwcl9kZWJ1ZygicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUgYW5kIHRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8gbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnXG4iKTsKIAkJfQogCX0KIApAQCAtMjkyNiwxMCArMjkyNiwxMCBAQAogCQlidHYtPmMudHlwZT1jYXJkW2J0di0+Yy5ucl07CiAKIAkvKiBwcmludCB3aGljaCBjYXJkIGNvbmZpZyB3ZSBhcmUgdXNpbmcgKi8KLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHVzaW5nOiAlcyBbY2FyZD0lZCwlc11cbiIsYnR2LT5jLm5yLAotCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAotCSAgICAgICBjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzCi0JICAgICAgID8gImluc21vZCBvcHRpb24iIDogImF1dG9kZXRlY3RlZCIpOworCXByX2luZm8oIiVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLAorCQlidHYtPmMubnIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwgYnR2LT5jLnR5cGUsCisJCWNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKKwkJPyAiaW5zbW9kIG9wdGlvbiIgOiAiYXV0b2RldGVjdGVkIik7CiAKIAkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwogCWlmIChVTlNFVCA9PSBhdWRpb2FsbCAmJiBVTlNFVCA9PSBhdWRpb211eFswXSkKQEAgLTI5NDgsMTIgKzI5NDgsMTMgQEAKIAkJfQogCX0KIAlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKLQkgICAgICAgYnR2LT5jLm5yLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2spOworCXByX2luZm8oIiVkOiBncGlvIGNvbmZpZyBvdmVycmlkZTogbWFzaz0weCV4LCBtdXg9IiwKKwkJYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHR2X3R2Y2FyZHMtPmdwaW9tdXgpOyBpKyspIHsKLQkJcHJpbnRrKCIlczB4JXgiLCBpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSk7CisJCXByX2NvbnQoIiVzMHgleCIsCisJCQlpID8gIiwiIDogIiIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSk7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcl9jb250KCJcbiIpOwogfQogCiAvKgpAQCAtMjk3NCw4ICsyOTc1LDggQEAKIAogCWlmICgtMSAhPSB0eXBlKSB7CiAJCWJ0di0+Yy50eXBlID0gdHlwZTsKLQkJcHJpbnRrKCJidHR2JWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKKwkJcHJfaW5mbygiJWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAorCQkJYnR2LT5jLm5yLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlKTsKIAl9CiB9CiAKQEAgLTMwMTksNyArMzAyMCw3IEBACiAJCXR1bmVyX3R5cGUgPSAzOyAgLyogUGhpbGlwcyBTRUNBTSgrUEFMKSBGUTEyMTZNRSBvciBGSTEyMTZNRiAqLwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEZseVZpZGVvX2dwaW86IHVua25vd24gdHVuZXIgdHlwZS5cbiIsIGJ0di0+Yy5ucik7CisJCXByX2luZm8oIiVkOiBGbHlWaWRlb19ncGlvOiB1bmtub3duIHR1bmVyIHR5cGVcbiIsIGJ0di0+Yy5ucik7CiAJCWJyZWFrOwogCX0KIApAQCAtMzAzNiwxMyArMzAzNywxMyBAQAogCWlmIChpc19jYXB0dXJlX29ubHkpCiAJCXR1bmVyX3R5cGUgPSBUVU5FUl9BQlNFTlQ7IC8qIE5vIHR1bmVyIHByZXNlbnQgKi8KIAotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gUmFkaW89JXMgUmVtb3RlQ29udHJvbD0lcyBUdW5lcj0lZCBncGlvPTB4JTA2eFxuIiwKLQkJYnR2LT5jLm5yLCBoYXNfcmFkaW8gPyAieWVzIiA6ICJubyAiLAotCQloYXNfcmVtb3RlID8gInllcyIgOiAibm8gIiwgdHVuZXJfdHlwZSwgZ3Bpbyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyAgTFI5MD0lcyB0ZGE5ODIxL3RkYTk4MjA9JXMgY2FwdHVyZV9vbmx5PSVzXG4iLAotCQlidHYtPmMubnIsIGlzX2xyOTAgPyAieWVzIiA6ICJubyAiLAotCQloYXNfdGRhOTgyMF90ZGE5ODIxID8gInllcyIgOiAibm8gIiwKLQkJaXNfY2FwdHVyZV9vbmx5ID8gInllcyIgOiAibm8gIik7CisJcHJfaW5mbygiJWQ6IEZseVZpZGVvIFJhZGlvPSVzIFJlbW90ZUNvbnRyb2w9JXMgVHVuZXI9JWQgZ3Bpbz0weCUwNnhcbiIsCisJCWJ0di0+Yy5uciwgaGFzX3JhZGlvID8gInllcyIgOiAibm8iLAorCQloYXNfcmVtb3RlID8gInllcyIgOiAibm8iLCB0dW5lcl90eXBlLCBncGlvKTsKKwlwcl9pbmZvKCIlZDogRmx5VmlkZW8gIExSOTA9JXMgdGRhOTgyMS90ZGE5ODIwPSVzIGNhcHR1cmVfb25seT0lc1xuIiwKKwkJYnR2LT5jLm5yLCBpc19scjkwID8gInllcyIgOiAibm8iLAorCQloYXNfdGRhOTgyMF90ZGE5ODIxID8gInllcyIgOiAibm8iLAorCQlpc19jYXB0dXJlX29ubHkgPyAieWVzIiA6ICJubyIpOwogCiAJaWYgKHR1bmVyX3R5cGUgIT0gVU5TRVQpIC8qIG9ubHkgc2V0IGlmIGtub3duIHR1bmVyIGF1dG9kZXRlY3RlZCwgZWxzZSBsZXQgaW5zbW9kIG9wdGlvbiB0aHJvdWdoICovCiAJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyX3R5cGU7CkBAIC0zMDkxLDEyICszMDkyLDExIEBACiAJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9QSU5OQUNMRSkKIAkJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImJ0dHYlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCi0JCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKLQkJICAgICAgIChidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAotCQkgICAgICAgKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOworCQlwcl9pbmZvKCIlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAorCQkJYnR2LT5jLm5yLCBpZCsxLCBidHYtPnR1bmVyX3R5cGUsCisJCQkhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKKwkJCShidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAorCQkJKC0xID09IG1zcCkgPyAibm8iIDogInllcyIpOwogCX0gZWxzZSB7CiAJCS8qIG5ldyBjYXJkcyB3aXRoIG1pY3JvdHVuZSB0dW5lciAqLwogCQlpZCA9IDYzIC0gaWQ7CkBAIC0zMTM4LDkgKzMxMzgsOCBAQAogCQl9CiAJCWlmICgtMSAhPSBtc3ApCiAJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJidHR2JWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKKwkJcHJfaW5mbygiJWQ6IHBpbm5hY2xlL210OiBpZD0lZCBpbmZvPVwiJXNcIiByYWRpbz0lc1xuIiwKKwkJCWJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKIAkJYnR2LT50dW5lcl90eXBlID0gVFVORVJfTVQyMDMyOwogCX0KIH0KQEAgLTMyMDIsNyArMzIwMSw3IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfbG1sYnQ0eChzdHJ1Y3QgYnR0diAqYnR2KQogewotCXByaW50ayhLRVJOX0RFQlVHICJMTUxCVDR4IGluaXRcbiIpOworCXByX2RlYnVnKCJMTUxCVDR4IGluaXRcbiIpOwogCWJ0d3JpdGUoMHgwMDAwMDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7CiAJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwMDA2QzApOwogCWdwaW9fd3JpdGUoMHgwMDAwMDApOwpAQCAtMzI0Niw3ICszMjQ1LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJ0dHZfZGVidWcpCi0JCXByaW50aygiYnR0diVkOiBCVDg3OEEgQVJFU0VUXG4iLGJ0di0+Yy5ucik7CisJCXByX2RlYnVnKCIlZDogQlQ4NzhBIEFSRVNFVFxuIiwgYnR2LT5jLm5yKTsKIAlidHdyaXRlKCgxPDw3KSwgMHgwNTgpOwogCXVkZWxheSgxMCk7CiAJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKQEAgLTMzNDksNyArMzM0OCw4IEBACiAJY2FzZSBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjE6CiAJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CiAJCQlidHYtPmhhc19yYWRpbz0xOwotCQkJcHJpbnRrKCJidHR2JWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIixidHYtPmMubnIpOworCQkJcHJfaW5mbygiJWQ6IHJhZGlvIGRldGVjdGVkIGJ5IHN1YnN5c3RlbSBpZCAoQ1BIMDV4KVxuIiwKKwkJCQlidHYtPmMubnIpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQlRUVl9CT0FSRF9TVEIyOgpAQCAtMzQzOCwxNyArMzQzOCwxNiBAQAogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwogCiAJaWYgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9BQlNFTlQpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdHVuZXIgYWJzZW50XG4iLCBidHYtPmMubnIpOwotCWVsc2UgaWYoYnR2LT50dW5lcl90eXBlID09IFVOU0VUKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHR1bmVyIHR5cGUgdW5zZXRcbiIsIGJ0di0+Yy5ucik7CisJCXByX2luZm8oIiVkOiB0dW5lciBhYnNlbnRcbiIsIGJ0di0+Yy5ucik7CisJZWxzZSBpZiAoYnR2LT50dW5lcl90eXBlID09IFVOU0VUKQorCQlwcl93YXJuKCIlZDogdHVuZXIgdHlwZSB1bnNldFxuIiwgYnR2LT5jLm5yKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdHVuZXIgdHlwZT0lZFxuIiwgYnR2LT5jLm5yLAotCQkgICAgICAgYnR2LT50dW5lcl90eXBlKTsKKwkJcHJfaW5mbygiJWQ6IHR1bmVyIHR5cGU9JWRcbiIsIGJ0di0+Yy5uciwgYnR2LT50dW5lcl90eXBlKTsKIAogCWlmIChhdXRvbG9hZCAhPSBVTlNFVCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRoZSBhdXRvbG9hZCBvcHRpb24gaXMgb2Jzb2xldGUuXG4iLCBidHYtPmMubnIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHVzZSBvcHRpb24gbXNwMzQwMCwgdGRhNzQzMiBvciB0dmF1ZGlvIHRvXG4iLCBidHYtPmMubnIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG92ZXJyaWRlIHdoaWNoIGF1ZGlvIG1vZHVsZSBzaG91bGQgYmUgdXNlZC5cbiIsIGJ0di0+Yy5ucik7CisJCXByX3dhcm4oIiVkOiB0aGUgYXV0b2xvYWQgb3B0aW9uIGlzIG9ic29sZXRlXG4iLCBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogdXNlIG9wdGlvbiBtc3AzNDAwLCB0ZGE3NDMyIG9yIHR2YXVkaW8gdG8gb3ZlcnJpZGUgd2hpY2ggYXVkaW8gbW9kdWxlIHNob3VsZCBiZSB1c2VkXG4iLAorCQkJYnR2LT5jLm5yKTsKIAl9CiAKIAlpZiAoVU5TRVQgPT0gYnR2LT50dW5lcl90eXBlKQpAQCAtMzU0MSw4ICszNTQwLDcgQEAKIAl9CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHVua25vd24gYXVkaW9kZXYgdmFsdWUhXG4iLAotCQkJYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IHVua25vd24gYXVkaW9kZXYgdmFsdWUhXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNTg1LDggKzM1ODMsNyBAQAogCQlyZXR1cm47CiAKIG5vX2F1ZGlvOgotCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogYXVkaW8gYWJzZW50LCBubyBhdWRpbyBkZXZpY2UgZm91bmQhXG4iLAotCQkJYnR2LT5jLm5yKTsKKwlwcl93YXJuKCIlZDogYXVkaW8gYWJzZW50LCBubyBhdWRpbyBkZXZpY2UgZm91bmQhXG4iLCBidHYtPmMubnIpOwogfQogCiAKQEAgLTM2MzksMTkgKzM2MzYsMTkgQEAKIHsKIAlpZiggc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiVGVtaWMgNDA2NiBGWTUiLDE0KSA9PTApIHsKIAkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0k7Ci0JCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7CisJCXByX2luZm8oIiVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAorCQkJYnR2LT5jLm5yLCAmZWVwcm9tX2RhdGFbMHgxZV0pOwogCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgewogCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfQUxQU19UU0JCNV9QQUxfSTsKLQkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCi0JCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKKwkJcHJfaW5mbygiJWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCisJCQlidHYtPmMubnIsICZlZXByb21fZGF0YVsweDFlXSk7CiAJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJQaGlsaXBzIEZNMTI0NiIsMTQpID09MCkgewogCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfUEhJTElQU19OVFNDOwotCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworCQlwcl9pbmZvKCIlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKKwkJCWJ0di0+Yy5uciwgJmVlcHJvbV9kYXRhWzB4MWVdKTsKIAl9IGVsc2UgewotCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKLQkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOworCQlwcl9pbmZvKCIlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKKwkJCWJ0di0+Yy5uciwgJmVlcHJvbV9kYXRhWzB4MWVdKTsKIAl9CiB9CiAKQEAgLTM2NjMsNyArMzY2MCw3IEBACiAJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKIAlidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87CiAKLQlwcmludGsoImJ0dHYlZDogSGF1cHBhdWdlIGVlcHJvbSBpbmRpY2F0ZXMgbW9kZWwjJWRcbiIsCisJcHJfaW5mbygiJWQ6IEhhdXBwYXVnZSBlZXByb20gaW5kaWNhdGVzIG1vZGVsIyVkXG4iLAogCQlidHYtPmMubnIsIHR2Lm1vZGVsKTsKIAogCS8qCkBAIC0zNjcxLDcgKzM2NjgsNyBAQAogCSAqIHR5cGUgYmFzZWQgb24gbW9kZWwgIy4KIAkgKi8KIAlpZih0di5tb2RlbCA9PSA2NDkwMCkgewotCQlwcmludGsoImJ0dHYlZDogU3dpdGNoaW5nIGJvYXJkIHR5cGUgZnJvbSAlcyB0byAlc1xuIiwKKwkJcHJfaW5mbygiJWQ6IFN3aXRjaGluZyBib2FyZCB0eXBlIGZyb20gJXMgdG8gJXNcbiIsCiAJCQlidHYtPmMubnIsCiAJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsCiAJCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9IQVVQUEFVR0VfSU1QQUNUVkNCXS5uYW1lKTsKQEAgLTM2OTgsOCArMzY5NSw3IEBACiAJZnJlcT04ODAwMC82Mi41OwogCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCiAJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewotCQlwcmludGsoImJ0dHYlZDogVGVycmF0ZWMgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgZm91bmQuXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfaW5mbygiJWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kXG4iLCBidHYtPmMubnIpOwogCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CiAJCWJ0di0+aGFzX3NhYTY1ODggID0gMTsKIAkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwpAQCAtMzc3MSwxMyArMzc2NywxMiBAQAogCiAJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGFsdGVyYSBmaXJtd2FyZSB1cGxvYWQgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgKHJjIDwgMCkgPyAiZmFpbGVkIiA6ICJvayIpOworCXByX2luZm8oIiVkOiBhbHRlcmEgZmlybXdhcmUgdXBsb2FkICVzXG4iLAorCQlidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0zODczLDI5ICszODY4LDI3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIHVua25vd24uLi5sZWF2ZSBnZW5lcmljLCBidXQgZ2V0IHNlcmlhbCAjICovCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6ICIKLQkJCSAgICAgICAib3NwcmV5IGVlcHJvbTogdW5rbm93biBjYXJkIHR5cGUgMHglMDR4XG4iLAotCQkJICAgICAgIGJ0di0+Yy5uciwgdHlwZSk7CisJCQlwcl9pbmZvKCIlZDogb3NwcmV5IGVlcHJvbTogdW5rbm93biBjYXJkIHR5cGUgMHglMDR4XG4iLAorCQkJCWJ0di0+Yy5uciwgdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCQlzZXJpYWwgPSBnZXRfdW5hbGlnbmVkX2JlMzIoKF9fYmUzMiAqKShlZSs2KSk7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkICclcycgc2VyaWFsPSV1XG4iLAotCSAgICAgICBidHYtPmMubnIsIGNhcmRpZCwKLQkgICAgICAgY2FyZGlkPjAgPyBidHR2X3R2Y2FyZHNbY2FyZGlkXS5uYW1lIDogIlVua25vd24iLCBzZXJpYWwpOworCXByX2luZm8oIiVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkICclcycgc2VyaWFsPSV1XG4iLAorCQlidHYtPmMubnIsIGNhcmRpZCwKKwkJY2FyZGlkID4gMCA/IGJ0dHZfdHZjYXJkc1tjYXJkaWRdLm5hbWUgOiAiVW5rbm93biIsIHNlcmlhbCk7CiAKIAlpZiAoY2FyZGlkPDAgfHwgYnR2LT5jLnR5cGUgPT0gY2FyZGlkKQogCQlyZXR1cm47CiAKIAkvKiBjYXJkIHR5cGUgaXNuJ3Qgc2V0IGNvcnJlY3RseSAqLwogCWlmIChjYXJkW2J0di0+Yy5ucl0gPCBidHR2X251bV90dmNhcmRzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogIgotCQkgICAgICAgIk5vdCBvdmVycmlkaW5nIHVzZXIgc3BlY2lmaWVkIGNhcmQgdHlwZVxuIiwgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IG9zcHJleSBlZXByb206IE5vdCBvdmVycmlkaW5nIHVzZXIgc3BlY2lmaWVkIGNhcmQgdHlwZVxuIiwKKwkJCWJ0di0+Yy5ucik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiAiCi0JCSAgICAgICAiQ2hhbmdpbmcgY2FyZCB0eXBlIGZyb20gJWQgdG8gJWRcbiIsIGJ0di0+Yy5uciwKLQkJICAgICAgIGJ0di0+Yy50eXBlLCBjYXJkaWQpOworCQlwcl9pbmZvKCIlZDogb3NwcmV5IGVlcHJvbTogQ2hhbmdpbmcgY2FyZCB0eXBlIGZyb20gJWQgdG8gJWRcbiIsCisJCQlidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBjYXJkaWQpOwogCQlidHYtPmMudHlwZSA9IGNhcmRpZDsKIAl9CiB9CkBAIC0zOTM4LDE0ICszOTMxLDE0IEBACiAJCWlmICh0dW5lcl9mb3JtYXQgPT0gMHgwOSkKIAkJCXR1bmVyX3R5cGUgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDOyAvKiBUQVBDLUc3MDJQICovCiAKLQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCisJcHJfaW5mbygiJWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCiAJCWJ0di0+Yy5uciwgZWVwcm9tX2RhdGFbMHg0MV0sIGVlcHJvbV9kYXRhWzB4NDJdKTsKIAlpZiAodHVuZXJfdHlwZSkgewogCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcl90eXBlOwotCQlwcmludGsoS0VSTl9DT05UICIlZCIsIHR1bmVyX3R5cGUpOworCQlwcl9jb250KCIlZCIsIHR1bmVyX3R5cGUpOwogCX0gZWxzZQotCQlwcmludGsoS0VSTl9DT05UICJVbmtub3duIHR5cGUiKTsKLQlwcmludGsoS0VSTl9DT05UICIgcmFkaW86JXMgcmVtb3RlIGNvbnRyb2w6JXNcbiIsCisJCXByX2NvbnQoIlVua25vd24gdHlwZSIpOworCXByX2NvbnQoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKIAkgICAgICAgdHVuZXJfdHZfZm0gICAgID8gInllcyIgOiAibm8iLAogCSAgICAgICBidHYtPmhhc19yZW1vdGUgPyAieWVzIiA6ICJubyIpOwogfQpAQCAtMzk5Myw4ICszOTg2LDggQEAKIAlpZiAoYnR0dl9ncGlvKQogCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJtc3AzNHh4Iik7CiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgotCQkgICAgICAgImluaXQgWyVkXVxuIiwgYnR2LT5jLm5yLCBwaW4pOworCQlwcl9pbmZvKCIlZDogSGF1cHBhdWdlL1Zvb2RvbyBtc3AzNHh4OiByZXNldCBsaW5lIGluaXQgWyVkXVxuIiwKKwkJCWJ0di0+Yy5uciwgcGluKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQwMzQsNyArNDAyNyw3IEBACiAJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKIAogCS8qCUluaXRpYWxpc2UgTUFYNTE3IERBQyAqLwotCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CisJcHJfaW5mbygiU2V0dGluZyBEQUMgcmVmZXJlbmNlIHZvbHRhZ2UgbGV2ZWwgLi4uXG4iKTsKIAlidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKIAogCS8qCUluaXRpYWxpc2UgMTJDNTA4IFBJQyAqLwpAQCAtNDA0Myw3ICs0MDM2LDcgQEAKIAkgKglhcmd1bWVudCBzbyB0aGUgbnVtYmVycyBhcmUgZGlmZmVyZW50ICovCiAKIAotCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpc2luZyAxMkM1MDggUElDIGNoaXAgLi4uXG4iKTsKKwlwcl9pbmZvKCJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CiAKIAkvKiBGaXJzdCBvZiBhbGwsIGVuYWJsZSB0aGUgY2xvY2sgbGluZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBQWEMyMDAtRiAqLwogCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwpAQCAtNDA2MiwxMyArNDA1NSwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhbHMpOyBpKyspIHsKIAkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwogCQlpZiAodG1wICE9IC0xKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAorCQkJcHJfaW5mbygiSTJDIFdyaXRlKCUyLjJ4KSA9ICVpXG5JMkMgUmVhZCAoKSA9ICUyLjJ4XG5cbiIsCiAJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKIAkJfQogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlBYQzIwMCBJbml0aWFsaXNlZC5cbiIpOworCXByX2luZm8oIlBYQzIwMCBJbml0aWFsaXNlZFxuIik7CiB9CiAKIApAQCAtNDEwNyw4ICs0MDk5LDcgQEAKIAl1aW50MzJfdCBkYXRhUmVhZCA9IDA7CiAJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CiAKLQlwcmludGsgKEtFUk5fSU5GTwotCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKKwlwcl9pbmZvKCIlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBpbiBwcm9ncmVzcyAuLi5cbiIsCiAJCWJ0di0+Yy5ucik7CiAKIAlidHdyaXRlICgweDAwYzNmZWZmLCBCVDg0OF9HUElPX09VVF9FTik7CkBAIC00MTIyLDggKzQxMTMsNyBAQAogCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwogCiAJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDEpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPCi0JCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDEpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKKwkJcHJfaW5mbygiJWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMSkgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAogCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CiAJfQogCkBAIC00MTM2LDE1ICs0MTI2LDEzIEBACiAJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CiAKIAlpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8KLQkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMikgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAorCQlwcl9pbmZvKCIlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigyKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCiAJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKIAogCQlyZXR1cm47CiAJfQogCi0JcHJpbnRrIChLRVJOX0lORk8KLQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBjb21wbGV0ZS5cbiIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGVcbiIsIGJ0di0+Yy5ucik7CiB9CiAKIApAQCAtNDI2MSwyMiArNDI0OSwyNSBAQAogCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKIAkJc2NoZWR1bGUoKTsKIAlpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIiwgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRwcmludGsoImJ0dHYlZDogdGVhNTc1NzoiLGJ0di0+Yy5ucik7CisJZHByaW50aygiJWQ6IHRlYTU3NTc6IiwgYnR2LT5jLm5yKTsKIAlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgewogCQl1ZGVsYXkoNSk7CiAJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKIAkJdWRlbGF5KDUpOwotCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOworCQlkcHJpbnRrX2NvbnQoIiVjIiwKKwkJCSAgICAgYnVzX2luKGJ0diwgYnR2LT5tYm94X21vc3QpID09IDAgPyAnVCcgOiAnLScpOwogCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKIAkJdmFsdWUgPDw9IDE7CiAJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KLQkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7CisJCWRwcmludGtfY29udCgiJWMiLAorCQkJICAgICBidXNfaW4oYnR2LCBidHYtPm1ib3hfbW9zdCkgPT0gMCA/ICdTJyA6ICdNJyk7CiAJfQotCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOworCWRwcmludGtfY29udCgiXG4iKTsKKwlkcHJpbnRrKCIlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKQEAgLTQyOTUsNyArNDI4Niw3IEBACiAJaWYgKGJ0dHZfZ3BpbykKIAkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwogCi0JZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKKwlkcHJpbnRrKCIlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CiAJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CiAJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7CiAJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKQEAgLTQ1NDcsNyArNDUzOCw3IEBACiBzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfbXV4c2VsIChzdHJ1Y3QgYnR0diogYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7CiAKLQlkcHJpbnRrIChLRVJOX0RFQlVHICJidHR2JWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLGJ0di0+Yy5ucixpbnB1dCk7CisJZHByaW50aygiJWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLCBidHYtPmMubnIsIGlucHV0KTsKIAkvKkp1c3Qgc2V0IHRoZSByaWdodCBwYXRoIGluIHRoZSBhbmFsb2cgbXVsdGlwbGV4ZXJzIDogY2hhbm5lbCAxIC0+IDQgPT0+IEFuYWxvZyBNdXggPT0+IE1VWDAqLwogCS8qR1BJT1syMF0mR1BJT1syMV0gdXNlZCB0byBjaG9vc2UgdGhlIHJpZ2h0IGlucHV0Ki8KIAlidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKQEAgLTQ1OTIsNyArNDU4Myw3IEBACiAJaW50IGtleSA9IGlucHV0ICUgNDsKIAlpbnQgbWF0cml4ID0gaW5wdXQgLyA0OwogCi0JZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAorCWRwcmludGsoIiVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAogCQlidHYtPmMubnIsIGlucHV0LCBtYXRyaXgsIGtleSk7CiAKIAkvKiBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncyAqLwpAQCAtNDY0OSwxNSArNDY0MCwxNyBAQAogCWJ1ZlsxXT0wOwogCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwogCWlmIChyYykgewotCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsIGJ0di0+Yy5ucixyYyk7CisJCXByX2RlYnVnKCIlZDogUFhDMjAwX211eHNlbDogcGljIGNmZyB3cml0ZSBmYWlsZWQ6JWRcbiIsCisJCQkgYnR2LT5jLm5yLCByYyk7CiAJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwotCSAgcmV0dXJuOworCQlyZXR1cm47CiAJfQogCiAJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CiAJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKLQkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IG5vdCBQWEMyMDBGIHJjOiVkIFxuIiwgYnR2LT5jLm5yLHJjKTsKLQkgIHJldHVybjsKKwkJcHJfZGVidWcoIiVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZFxuIiwKKwkJCSBidHYtPmMubnIsIHJjKTsKKwkJcmV0dXJuOwogCX0KIAogCkBAIC00Njk2LDcgKzQ2ODksNyBAQAogCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCiAJICBidGFuZCh+QlQ4NDhfSUZPUk1fTVVYU0VMLEJUODQ4X0lGT1JNKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLChpbnQpbXV4KTsKKwlwcl9kZWJ1ZygiJWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLCAoaW50KW11eCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBoeXRlY19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQpAQCAtNDg0NywyOSArNDg0MCwyNyBAQAogCiAJLyogcHJpbnQgd2FybmluZ3MgYWJvdXQgYW55IHF1aXJrcyBmb3VuZCAqLwogCWlmICh0cml0b24xKQotCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKKwkJcHJfaW5mbygiSG9zdCBicmlkZ2UgbmVlZHMgRVRCRiBlbmFibGVkXG4iKTsKIAlpZiAodnNmeCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgVlNGWCBlbmFibGVkLlxuIik7CisJCXByX2luZm8oIkhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZFxuIik7CiAJaWYgKHBjaXBjaV9mYWlsKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGJ0dHYgYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgIgotCQkJCQkJCSJ0b2dldGhlci5cbiIpOworCQlwcl9pbmZvKCJidHR2IGFuZCB5b3VyIGNoaXBzZXQgbWF5IG5vdCB3b3JrIHRvZ2V0aGVyXG4iKTsKIAkJaWYgKCFub19vdmVybGF5KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBvdmVybGF5IHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKwkJCXByX2luZm8oIm92ZXJsYXkgd2lsbCBiZSBkaXNhYmxlZFxuIik7CiAJCQlub19vdmVybGF5ID0gMTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IG92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyAiCi0JCQkJCQkib3B0aW9uIGF0IHlvdXIgb3duIHJpc2suXG4iKTsKKwkJCXByX2luZm8oIm92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzay5cbiIpOwogCQl9CiAJfQogCWlmIChVTlNFVCAhPSBsYXRlbmN5KQotCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLGxhdGVuY3kpOworCQlwcl9pbmZvKCJwY2kgbGF0ZW5jeSBmaXh1cCBbJWRdXG4iLCBsYXRlbmN5KTsKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSwgZGV2KSkpIHsKIAkJdW5zaWduZWQgY2hhciBiOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTMsICZiKTsKIAkJaWYgKGJ0dHZfZGVidWcpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZTogODI0NDFGWCBOYXRvbWEsICIKLQkJCSAgICAgICAiYnVmY29uPTB4JTAyeFxuIixiKTsKKwkJCXByX2luZm8oIkhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgYnVmY29uPTB4JTAyeFxuIiwKKwkJCQliKTsKIAl9CiB9CiAKQEAgLTQ4ODIsMTIgKzQ4NzMsMTMgQEAKIAogCWlmIChidHR2X3ZlcmJvc2UpIHsKIAkJaWYgKHRyaXRvbjEpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIEVUQkYgKDQzMEZYL1ZQMyBjb21wYXRpYmlsdHkpXG4iLGJ0di0+Yy5ucik7CisJCQlwcl9pbmZvKCIlZDogZW5hYmxpbmcgRVRCRiAoNDMwRlgvVlAzIGNvbXBhdGliaWxpdHkpXG4iLAorCQkJCWJ0di0+Yy5ucik7CiAJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBWU0ZYXG4iLGJ0di0+Yy5ucik7CisJCQlwcl9pbmZvKCIlZDogZW5hYmxpbmcgVlNGWFxuIiwgYnR2LT5jLm5yKTsKIAkJaWYgKFVOU0VUICE9IGxhdGVuY3kpCi0JCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHNldHRpbmcgcGNpIHRpbWVyIHRvICVkXG4iLAotCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKKwkJCXByX2luZm8oIiVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKKwkJCQlidHYtPmMubnIsIGxhdGVuY3kpOwogCX0KIAogCWlmIChidHYtPmlkIDwgODc4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKaW5kZXggMTQ0NDRkZS4uM2RkMDY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwpAQCAtMzQsNiArMzQsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC05NDIsOCArOTQ0LDggQEAKIHZvaWQgZnJlZV9idHJlc19sb2NrKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2ZoICpmaCwgaW50IGJpdHMpCiB7CiAJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykgewotCQkvKiB0cnlpbmcgdG8gZnJlZSByZXNzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCi0JCXByaW50aygiYnR0djogQlVHISAoYnRyZXMpXG4iKTsKKwkJLyogdHJ5aW5nIHRvIGZyZWUgcmVzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCisJCXByX2VycigiQlVHISAoYnRyZXMpXG4iKTsKIAl9CiAJZmgtPnJlc291cmNlcyAgJj0gfmJpdHM7CiAJYnR2LT5yZXNvdXJjZXMgJj0gfmJpdHM7CkBAIC0xMDAwLDcgKzEwMDIsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoYnR2LT5wbGwucGxsX29mcmVxID09IGJ0di0+cGxsLnBsbF9jdXJyZW50KSB7Ci0JCWRwcmludGsoImJ0dHYlZDogUExMOiBubyBjaGFuZ2UgcmVxdWlyZWRcbiIsYnR2LT5jLm5yKTsKKwkJZHByaW50aygiJWQ6IFBMTDogbm8gY2hhbmdlIHJlcXVpcmVkXG4iLCBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDA4LDIxICsxMDEwLDIzIEBACiAJCS8qIG5vIFBMTCBuZWVkZWQgKi8KIAkJaWYgKGJ0di0+cGxsLnBsbF9jdXJyZW50ID09IDApCiAJCQlyZXR1cm47Ci0JCWJ0dHZfcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBQTEwgY2FuIHNsZWVwLCB1c2luZyBYVEFMICglZCkuXG4iLAotCQkJYnR2LT5jLm5yLGJ0di0+cGxsLnBsbF9pZnJlcSk7CisJCWlmIChidHR2X3ZlcmJvc2UpCisJCQlwcl9pbmZvKCIlZDogUExMIGNhbiBzbGVlcCwgdXNpbmcgWFRBTCAoJWQpXG4iLAorCQkJCWJ0di0+Yy5uciwgYnR2LT5wbGwucGxsX2lmcmVxKTsKIAkJYnR3cml0ZSgweDAwLEJUODQ4X1RHQ1RSTCk7CiAJCWJ0d3JpdGUoMHgwMCxCVDg0OF9QTExfWENJKTsKIAkJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAwOwogCQlyZXR1cm47CiAJfQogCi0JYnR0dl9wcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IFBMTDogJWQgPT4gJWQgIixidHYtPmMubnIsCi0JCWJ0di0+cGxsLnBsbF9pZnJlcSwgYnR2LT5wbGwucGxsX29mcmVxKTsKKwlpZiAoYnR0dl92ZXJib3NlKQorCQlwcl9pbmZvKCIlZDogU2V0dGluZyBQTEw6ICVkID0+ICVkIChuZWVkcyB1cCB0byAxMDBtcylcbiIsCisJCQlidHYtPmMubnIsCisJCQlidHYtPnBsbC5wbGxfaWZyZXEsIGJ0di0+cGxsLnBsbF9vZnJlcSk7CiAJc2V0X3BsbF9mcmVxKGJ0diwgYnR2LT5wbGwucGxsX2lmcmVxLCBidHYtPnBsbC5wbGxfb2ZyZXEpOwogCiAJZm9yIChpPTA7IGk8MTA7IGkrKykgewogCQkvKiAgTGV0IG90aGVyIHBlb3BsZSBydW4gd2hpbGUgdGhlIFBMTCBzdGFiaWxpemVzICovCi0JCWJ0dHZfcHJpbnRrKCIuIik7CiAJCW1zbGVlcCgxMCk7CiAKIAkJaWYgKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSAmIEJUODQ4X0RTVEFUVVNfUExPQ0spIHsKQEAgLTEwMzAsMTIgKzEwMzQsMTQgQEAKIAkJfSBlbHNlIHsKIAkJCWJ0d3JpdGUoMHgwOCxCVDg0OF9UR0NUUkwpOwogCQkJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSBidHYtPnBsbC5wbGxfb2ZyZXE7Ci0JCQlidHR2X3ByaW50aygiIG9rXG4iKTsKKwkJCWlmIChidHR2X3ZlcmJvc2UpCisJCQkJcHJfaW5mbygiUExMIHNldCBva1xuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAJYnR2LT5wbGwucGxsX2N1cnJlbnQgPSAtMTsKLQlidHR2X3ByaW50aygiZmFpbGVkXG4iKTsKKwlpZiAoYnR0dl92ZXJib3NlKQorCQlwcl9pbmZvKCJTZXR0aW5nIFBMTCBmYWlsZWRcbiIpOwogCXJldHVybjsKIH0KIApAQCAtMTA0Nyw3ICsxMDUzLDcgQEAKIAlpbnQgZnNjICAgICAgID0gYnR0dl90dm5vcm1zW2J0di0+dHZub3JtXS5Gc2M7CiAKIAlpZiAoYnR2LT5pbnB1dCA9PSBidHYtPmRpZykgewotCQlkcHJpbnRrKCJidHR2JWQ6IGxvYWQgZGlnaXRhbCB0aW1pbmcgdGFibGUgKHRhYmxlX2lkeD0lZClcbiIsCisJCWRwcmludGsoIiVkOiBsb2FkIGRpZ2l0YWwgdGltaW5nIHRhYmxlICh0YWJsZV9pZHg9JWQpXG4iLAogCQkJYnR2LT5jLm5yLHRhYmxlX2lkeCk7CiAKIAkJLyogdGltaW5nIGNoYW5nZS4uLnJlc2V0IHRpbWluZyBnZW5lcmF0b3IgYWRkcmVzcyAqLwpAQCAtMTA3Niw3ICsxMDgyLDcgQEAKIHsKIAlpbnQgdmFsdWU7CiAKLQkvLyBwcmludGsoImJ0dHY6IHNldCBicmlnaHQ6ICVkXG4iLGJyaWdodCk7IC8vIERFQlVHCisJLy8gcHJpbnRrKCJzZXQgYnJpZ2h0OiAlZFxuIiwgYnJpZ2h0KTsgLy8gREVCVUcKIAlidHYtPmJyaWdodCA9IGJyaWdodDsKIAogCS8qIFdlIHdhbnQgLTEyOCB0byAxMjcgd2UgZ2V0IDAtNjU1MzUgKi8KQEAgLTExNTAsOCArMTE1Niw3IEBACiAJfQogCW11eCA9IGJ0dHZfbXV4c2VsKGJ0diwgaW5wdXQpOwogCWJ0YW9yKG11eDw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwotCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiB2aWRlbyBtdXg6IGlucHV0PSVkIG11eD0lZFxuIiwKLQkJYnR2LT5jLm5yLGlucHV0LG11eCk7CisJZHByaW50aygiJWQ6IHZpZGVvIG11eDogaW5wdXQ9JWQgbXV4PSVkXG4iLCBidHYtPmMubnIsIGlucHV0LCBtdXgpOwogCiAJLyogY2FyZCBzcGVjaWZpYyBob29rICovCiAJaWYoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxfaG9vaykKQEAgLTE0NDAsNyArMTQ0NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChidHR2X3ZlcmJvc2UpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVzZXQsIHJlaW5pdGlhbGl6ZVxuIixidHYtPmMubnIpOworCQlwcl9pbmZvKCIlZDogcmVzZXQsIHJlaW5pdGlhbGl6ZVxuIiwgYnR2LT5jLm5yKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwogCWJ0di0+ZXJyb3JzPTA7CiAJYnR0dl9zZXRfZG1hKGJ0diwwKTsKQEAgLTE2MjIsOCArMTYyNyw4IEBACiAJdW5zaWduZWQgaW50IG91dGJpdHMsIGRhdGE7CiAJb3V0Yml0cyA9IGJ0cmVhZChCVDg0OF9HUElPX09VVF9FTik7CiAJZGF0YSAgICA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwotCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IGdwaW86IGVuPSUwOHgsIG91dD0lMDh4IGluPSUwOHggWyVzXVxuIiwKLQkgICAgICAgYnR2LT5jLm5yLG91dGJpdHMsZGF0YSAmIG91dGJpdHMsIGRhdGEgJiB+b3V0Yml0cywgY29tbWVudCk7CisJcHJfZGVidWcoIiVkOiBncGlvOiBlbj0lMDh4LCBvdXQ9JTA4eCBpbj0lMDh4IFslc11cbiIsCisJCSBidHYtPmMubnIsIG91dGJpdHMsIGRhdGEgJiBvdXRiaXRzLCBkYXRhICYgfm91dGJpdHMsIGNvbW1lbnQpOwogfQogCiBzdGF0aWMgdm9pZCBidHR2X2ZpZWxkX2NvdW50KHN0cnVjdCBidHR2ICpidHYpCkBAIC0xNjY4LDcgKzE2NzMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogZW50ZXIgW25ldz0lcF1cbiIsbmV3KTsKKwlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogZW50ZXIgW25ldz0lcF1cbiIsIG5ldyk7CiAJaWYgKG5ldykKIAkJbmV3LT52Yi5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJ0di0+c19sb2NrLGZsYWdzKTsKQEAgLTE2NzgsNyArMTY4Myw4IEBACiAJYnR0dl9zZXRfZG1hKGJ0diwgMHgwMyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwogCWlmIChOVUxMICE9IG9sZCkgewotCQlkcHJpbnRrKCJzd2l0Y2hfb3ZlcmxheTogb2xkPSVwIHN0YXRlIGlzICVkXG4iLG9sZCxvbGQtPnZiLnN0YXRlKTsKKwkJZHByaW50aygic3dpdGNoX292ZXJsYXk6IG9sZD0lcCBzdGF0ZSBpcyAlZFxuIiwKKwkJCW9sZCwgb2xkLT52Yi5zdGF0ZSk7CiAJCWJ0dHZfZG1hX2ZyZWUoJmZoLT5jYXAsYnR2LCBvbGQpOwogCQlrZnJlZShvbGQpOwogCX0KQEAgLTIwMjksMTEgKzIwMzUsMTEgQEAKIAlzdHJ1Y3QgYnR0dl9maCAqZmggID0gZjsKIAlzdHJ1Y3QgYnR0diAqYnR2ID0gZmgtPmJ0djsKIAotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogPT09PT09PT0gIFNUQVJUIFNUQVRVUyBDQVJEICMlZCAgPT09PT09PT1cbiIsCi0JCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6ID09PT09PT09ICBTVEFSVCBTVEFUVVMgQ0FSRCAjJWQgID09PT09PT09XG4iLAorCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CiAJYnR0dl9jYWxsX2FsbChidHYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogPT09PT09PT0gIEVORCBTVEFUVVMgQ0FSRCAgICMlZCAgPT09PT09PT1cbiIsCi0JCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CisJcHJfaW5mbygiJWQ6ID09PT09PT09ICBFTkQgU1RBVFVTIENBUkQgICAjJWQgID09PT09PT09XG4iLAorCQlidHYtPmMubnIsIGJ0di0+Yy5ucik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1OTgsNyArMjYwNCw3IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IGZoLT5idHY7CiAKIAlpZiAobm9fb3ZlcmxheSA+IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IG5vX292ZXJsYXlcbiIpOworCQlwcl9lcnIoIlY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTogbm9fb3ZlcmxheVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjY3Myw3ICsyNjc5LDcgQEAKIAlpbnQgcmM7CiAKIAlpZiAobm9fb3ZlcmxheSA+IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6IG5vX292ZXJsYXlcbiIpOworCQlwcl9lcnIoIlY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTogbm9fb3ZlcmxheVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjcxNCw3ICsyNzIwLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICh1bmxpa2VseSghZmgtPm92LnNldHVwX29rKSkgewotCQkJZHByaW50aygiYnR0diVkOiBvdmVybGF5OiAhc2V0dXBfb2tcbiIsIGJ0di0+Yy5ucik7CisJCQlkcHJpbnRrKCIlZDogb3ZlcmxheTogIXNldHVwX29rXG4iLCBidHYtPmMubnIpOwogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJfQogCQlpZiAocmV0dmFsKQpAQCAtMzA5MSw4ICszMDk3LDggQEAKIAogCWlmIChmaC0+YnR2LT5lcnJvcnMpCiAJCWJ0dHZfcmVpbml0X2J0ODQ4KGZoLT5idHYpOwotCWRwcmludGsoImJ0dHYlZDogcmVhZCBjb3VudD0lZCB0eXBlPSVzXG4iLAotCQlmaC0+YnR2LT5jLm5yLChpbnQpY291bnQsdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSk7CisJZHByaW50aygiJWQ6IHJlYWQgY291bnQ9JWQgdHlwZT0lc1xuIiwKKwkJZmgtPmJ0di0+Yy5uciwgKGludCljb3VudCwgdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSk7CiAKIAlzd2l0Y2ggKGZoLT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CkBAIC0zMTc0LDcgKzMxODAsNyBAQAogCXN0cnVjdCBidHR2X2ZoICpmaDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IDA7CiAKLQlkcHJpbnRrKEtFUk5fREVCVUcgImJ0dHY6IG9wZW4gZGV2PSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKKwlkcHJpbnRrKCJvcGVuIGRldj0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CiAKIAlpZiAodmRldi0+dmZsX3R5cGUgPT0gVkZMX1RZUEVfR1JBQkJFUikgewogCQl0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwpAQCAtMzE4NSw4ICszMTkxLDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IG9wZW4gY2FsbGVkICh0eXBlPSVzKVxuIiwKLQkJYnR2LT5jLm5yLHY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7CisJZHByaW50aygiJWQ6IG9wZW4gY2FsbGVkICh0eXBlPSVzKVxuIiwKKwkJYnR2LT5jLm5yLCB2NGwyX3R5cGVfbmFtZXNbdHlwZV0pOwogCiAJLyogYWxsb2NhdGUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwogCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMjg4LDcgKzMyOTQsNyBAQAogewogCXN0cnVjdCBidHR2X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWRwcmludGsoImJ0dHYlZDogbW1hcCB0eXBlPSVzIDB4JWx4KyVsZFxuIiwKKwlkcHJpbnRrKCIlZDogbW1hcCB0eXBlPSVzIDB4JWx4KyVsZFxuIiwKIAkJZmgtPmJ0di0+Yy5uciwgdjRsMl90eXBlX25hbWVzW2ZoLT50eXBlXSwKIAkJdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKIAlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoYnR0dl9xdWV1ZShmaCksdm1hKTsKQEAgLTMzNzAsOSArMzM3Niw5IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IGJ0dHZfZmggKmZoOwogCi0JZHByaW50aygiYnR0djogb3BlbiBkZXY9JXNcbiIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOworCWRwcmludGsoIm9wZW4gZGV2PSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKIAotCWRwcmludGsoImJ0dHYlZDogb3BlbiBjYWxsZWQgKHJhZGlvKVxuIixidHYtPmMubnIpOworCWRwcmludGsoIiVkOiBvcGVuIGNhbGxlZCAocmFkaW8pXG4iLCBidHYtPmMubnIpOwogCiAJLyogYWxsb2NhdGUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwogCWZoID0ga21hbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CkBAIC0zNjE2LDEyICszNjIyLDEyIEBACiAJfTsKIAlpbnQgaTsKIAotCXByaW50aygiMHglMDh4IFsgJXMiLCByaXNjLAorCXByX2NvbnQoIjB4JTA4eCBbICVzIiwgcmlzYywKIAkgICAgICAgaW5zdHJbcmlzYyA+PiAyOF0gPyBpbnN0cltyaXNjID4+IDI4XSA6ICJJTlZBTElEIik7CiAJZm9yIChpID0gQVJSQVlfU0laRShiaXRzKS0xOyBpID49IDA7IGktLSkKIAkJaWYgKHJpc2MgJiAoMSA8PCAoaSArIDEyKSkpCi0JCQlwcmludGsoIiAlcyIsYml0c1tpXSk7Ci0JcHJpbnRrKCIgY291bnQ9JWQgXVxuIiwgcmlzYyAmIDB4ZmZmKTsKKwkJCXByX2NvbnQoIiAlcyIsIGJpdHNbaV0pOworCXByX2NvbnQoIiBjb3VudD0lZCBdXG4iLCByaXNjICYgMHhmZmYpOwogCXJldHVybiBpbmNyW3Jpc2MgPj4gMjhdID8gaW5jcltyaXNjID4+IDI4XSA6IDE7CiB9CiAKQEAgLTM2MzAsMTYgKzM2MzYsMTggQEAKIHsKIAl1bnNpZ25lZCBpbnQgaSxqLG47CiAKLQlwcmludGsoIiVzOiByaXNjIGRpc2FzbTogJXAgW2RtYT0weCUwOGx4XVxuIiwKLQkgICAgICAgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsIHJpc2MtPmNwdSwgKHVuc2lnbmVkIGxvbmcpcmlzYy0+ZG1hKTsKKwlwcl9pbmZvKCIlczogcmlzYyBkaXNhc206ICVwIFtkbWE9MHglMDhseF1cbiIsCisJCWJ0di0+Yy52NGwyX2Rldi5uYW1lLCByaXNjLT5jcHUsICh1bnNpZ25lZCBsb25nKXJpc2MtPmRtYSk7CiAJZm9yIChpID0gMDsgaSA8IChyaXNjLT5zaXplID4+IDIpOyBpICs9IG4pIHsKLQkJcHJpbnRrKCIlczogICAweCVseDogIiwgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKGk8PDIpKSk7CisJCXByX2luZm8oIiVzOiAgIDB4JWx4OiAiLAorCQkJYnR2LT5jLnY0bDJfZGV2Lm5hbWUsCisJCQkodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKGk8PDIpKSk7CiAJCW4gPSBidHR2X3Jpc2NfZGVjb2RlKGxlMzJfdG9fY3B1KHJpc2MtPmNwdVtpXSkpOwogCQlmb3IgKGogPSAxOyBqIDwgbjsgaisrKQotCQkJcHJpbnRrKCIlczogICAweCVseDogMHglMDh4IFsgYXJnICMlZCBdXG4iLAotCQkJICAgICAgIGJ0di0+Yy52NGwyX2Rldi5uYW1lLCAodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKChpK2opPDwyKSksCi0JCQkgICAgICAgcmlzYy0+Y3B1W2kral0sIGopOworCQkJcHJfaW5mbygiJXM6ICAgMHglbHg6IDB4JTA4eCBbIGFyZyAjJWQgXVxuIiwKKwkJCQlidHYtPmMudjRsMl9kZXYubmFtZSwKKwkJCQkodW5zaWduZWQgbG9uZykocmlzYy0+ZG1hICsgKChpK2opPDwyKSksCisJCQkJcmlzYy0+Y3B1W2kral0sIGopOwogCQlpZiAoMCA9PSByaXNjLT5jcHVbaV0pCiAJCQlicmVhazsKIAl9CkBAIC0zNjQ3LDE3ICszNjU1LDE4IEBACiAKIHN0YXRpYyB2b2lkIGJ0dHZfcHJpbnRfcmlzY2FkZHIoc3RydWN0IGJ0dHYgKmJ0dikKIHsKLQlwcmludGsoIiAgbWFpbjogJTA4THhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7Ci0JcHJpbnRrKCIgIHZiaSA6IG89JTA4THggZT0lMDhMeFxuIiwKLQkgICAgICAgYnR2LT5jdmJpID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN2YmktPnRvcC5kbWEgOiAwLAotCSAgICAgICBidHYtPmN2YmkgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+Ym90dG9tLmRtYSA6IDApOwotCXByaW50aygiICBjYXAgOiBvPSUwOEx4IGU9JTA4THhcbiIsCi0JICAgICAgIGJ0di0+Y3Vyci50b3AgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3Vyci50b3AtPnRvcC5kbWEgOiAwLAotCSAgICAgICBidHYtPmN1cnIuYm90dG9tID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIuYm90dG9tLT5ib3R0b20uZG1hIDogMCk7Ci0JcHJpbnRrKCIgIHNjciA6IG89JTA4THggZT0lMDhMeFxuIiwKLQkgICAgICAgYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT50b3AuZG1hIDogMCwKLQkgICAgICAgYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT5ib3R0b20uZG1hIDogMCk7CisJcHJfaW5mbygiICBtYWluOiAlMDhsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7CisJcHJfaW5mbygiICB2YmkgOiBvPSUwOGxseCBlPSUwOGxseFxuIiwKKwkJYnR2LT5jdmJpID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN2YmktPnRvcC5kbWEgOiAwLAorCQlidHYtPmN2YmkgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+Ym90dG9tLmRtYSA6IDApOworCXByX2luZm8oIiAgY2FwIDogbz0lMDhsbHggZT0lMDhsbHhcbiIsCisJCWJ0di0+Y3Vyci50b3AKKwkJPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3Vyci50b3AtPnRvcC5kbWEgOiAwLAorCQlidHYtPmN1cnIuYm90dG9tCisJCT8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIuYm90dG9tLT5ib3R0b20uZG1hIDogMCk7CisJcHJfaW5mbygiICBzY3IgOiBvPSUwOGxseCBlPSUwOGxseFxuIiwKKwkJYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT50b3AuZG1hIDogMCwKKwkJYnR2LT5zY3JlZW4gPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+c2NyZWVuLT5ib3R0b20uZG1hIDogMCk7CiAJYnR0dl9yaXNjX2Rpc2FzbShidHYsICZidHYtPm1haW4pOwogfQogCkBAIC0zNjkwLDM0ICszNjk5LDM0IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlwcmludGsoImJpdHM6Iik7CisJcHJfY29udCgiYml0czoiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfbmFtZSk7IGkrKykgewogCQlpZiAocHJpbnQgJiAoMSA8PCBpKSkKLQkJCXByaW50aygiICVzIixpcnFfbmFtZVtpXSk7CisJCQlwcl9jb250KCIgJXMiLCBpcnFfbmFtZVtpXSk7CiAJCWlmIChtYXJrICYgKDEgPDwgaSkpCi0JCQlwcmludGsoIioiKTsKKwkJCXByX2NvbnQoIioiKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGJ0dHZfaXJxX2RlYnVnX2xvd19sYXRlbmN5KHN0cnVjdCBidHR2ICpidHYsIHUzMiByYykKIHsKLQlwcmludGsoImJ0dHYlZDogaXJxOiBza2lwcGVkIGZyYW1lIFttYWluPSVseCxvX3ZiaT0lbHgsb19maWVsZD0lbHgscmM9JWx4XVxuIiwKLQkgICAgICAgYnR2LT5jLm5yLAotCSAgICAgICAodW5zaWduZWQgbG9uZylidHYtPm1haW4uZG1hLAotCSAgICAgICAodW5zaWduZWQgbG9uZylsZTMyX3RvX2NwdShidHYtPm1haW4uY3B1W1JJU0NfU0xPVF9PX1ZCSSsxXSksCi0JICAgICAgICh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGJ0di0+bWFpbi5jcHVbUklTQ19TTE9UX09fRklFTEQrMV0pLAotCSAgICAgICAodW5zaWduZWQgbG9uZylyYyk7CisJcHJfd2FybigiJWQ6IGlycTogc2tpcHBlZCBmcmFtZSBbbWFpbj0lbHgsb192Ymk9JWx4LG9fZmllbGQ9JWx4LHJjPSVseF1cbiIsCisJCWJ0di0+Yy5uciwKKwkJKHVuc2lnbmVkIGxvbmcpYnR2LT5tYWluLmRtYSwKKwkJKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoYnR2LT5tYWluLmNwdVtSSVNDX1NMT1RfT19WQkkrMV0pLAorCQkodW5zaWduZWQgbG9uZylsZTMyX3RvX2NwdShidHYtPm1haW4uY3B1W1JJU0NfU0xPVF9PX0ZJRUxEKzFdKSwKKwkJKHVuc2lnbmVkIGxvbmcpcmMpOwogCiAJaWYgKDAgPT0gKGJ0cmVhZChCVDg0OF9EU1RBVFVTKSAmIEJUODQ4X0RTVEFUVVNfSExPQykpIHsKLQkJcHJpbnRrKCJidHR2JWQ6IE9oLCB0aGVyZSAodGVtcG9yYXJlbHk/KSBpcyBubyBpbnB1dCBzaWduYWwuICIKLQkJICAgICAgICJPaywgdGhlbiB0aGlzIGlzIGhhcm1sZXNzLCBkb24ndCB3b3JyeSA7KVxuIiwKLQkJICAgICAgIGJ0di0+Yy5ucik7CisJCXByX25vdGljZSgiJWQ6IE9oLCB0aGVyZSAodGVtcG9yYXJpbHk/KSBpcyBubyBpbnB1dCBzaWduYWwuICIKKwkJCSAgIk9rLCB0aGVuIHRoaXMgaXMgaGFybWxlc3MsIGRvbid0IHdvcnJ5IDspXG4iLAorCQkJICBidHYtPmMubnIpOwogCQlyZXR1cm47CiAJfQotCXByaW50aygiYnR0diVkOiBVaG0uIExvb2tzIGxpa2Ugd2UgaGF2ZSB1bnVzdWFsIGhpZ2ggSVJRIGxhdGVuY2llcy5cbiIsCi0JICAgICAgIGJ0di0+Yy5ucik7Ci0JcHJpbnRrKCJidHR2JWQ6IExldHMgdHJ5IHRvIGNhdGNoIHRoZSBjdWxwaXQgcmVkLWhhbmRlZCAuLi5cbiIsCi0JICAgICAgIGJ0di0+Yy5ucik7CisJcHJfbm90aWNlKCIlZDogVWhtLiBMb29rcyBsaWtlIHdlIGhhdmUgdW51c3VhbCBoaWdoIElSUSBsYXRlbmNpZXNcbiIsCisJCSAgYnR2LT5jLm5yKTsKKwlwcl9ub3RpY2UoIiVkOiBMZXRzIHRyeSB0byBjYXRjaCB0aGUgY3VscGl0IHJlZC1oYW5kZWQgLi4uXG4iLAorCQkgIGJ0di0+Yy5ucik7CiAJZHVtcF9zdGFjaygpOwogfQogCkBAIC0zNzk4LDkgKzM4MDcsOSBAQAogCQl9CiAJfQogCi0JZHByaW50aygiYnR0diVkOiBuZXh0IHNldDogdG9wPSVwIGJvdHRvbT0lcCBbc2NyZWVuPSVwLGlycT0lZCwlZF1cbiIsCi0JCWJ0di0+Yy5ucixzZXQtPnRvcCwgc2V0LT5ib3R0b20sCi0JCWJ0di0+c2NyZWVuLHNldC0+ZnJhbWVfaXJxLHNldC0+dG9wX2lycSk7CisJZHByaW50aygiJWQ6IG5leHQgc2V0OiB0b3A9JXAgYm90dG9tPSVwIFtzY3JlZW49JXAsaXJxPSVkLCVkXVxuIiwKKwkJYnR2LT5jLm5yLCBzZXQtPnRvcCwgc2V0LT5ib3R0b20sCisJCWJ0di0+c2NyZWVuLCBzZXQtPmZyYW1lX2lycSwgc2V0LT50b3BfaXJxKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgxNSw3ICszODI0LDggQEAKIAlpZiAod2FrZXVwLT50b3AgPT0gd2FrZXVwLT5ib3R0b20pIHsKIAkJaWYgKE5VTEwgIT0gd2FrZXVwLT50b3AgJiYgY3Vyci0+dG9wICE9IHdha2V1cC0+dG9wKSB7CiAJCQlpZiAoaXJxX2RlYnVnID4gMSkKLQkJCQlwcmludGsoImJ0dHYlZDogd2FrZXVwOiBib3RoPSVwXG4iLGJ0di0+Yy5ucix3YWtldXAtPnRvcCk7CisJCQkJcHJfZGVidWcoIiVkOiB3YWtldXA6IGJvdGg9JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+dG9wKTsKIAkJCXdha2V1cC0+dG9wLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT50b3AtPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+dG9wLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzgyNCw3ICszODM0LDggQEAKIAl9IGVsc2UgewogCQlpZiAoTlVMTCAhPSB3YWtldXAtPnRvcCAmJiBjdXJyLT50b3AgIT0gd2FrZXVwLT50b3ApIHsKIAkJCWlmIChpcnFfZGVidWcgPiAxKQotCQkJCXByaW50aygiYnR0diVkOiB3YWtldXA6IHRvcD0lcFxuIixidHYtPmMubnIsd2FrZXVwLT50b3ApOworCQkJCXByX2RlYnVnKCIlZDogd2FrZXVwOiB0b3A9JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+dG9wKTsKIAkJCXdha2V1cC0+dG9wLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT50b3AtPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+dG9wLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzgzMiw3ICszODQzLDggQEAKIAkJfQogCQlpZiAoTlVMTCAhPSB3YWtldXAtPmJvdHRvbSAmJiBjdXJyLT5ib3R0b20gIT0gd2FrZXVwLT5ib3R0b20pIHsKIAkJCWlmIChpcnFfZGVidWcgPiAxKQotCQkJCXByaW50aygiYnR0diVkOiB3YWtldXA6IGJvdHRvbT0lcFxuIixidHYtPmMubnIsd2FrZXVwLT5ib3R0b20pOworCQkJCXByX2RlYnVnKCIlZDogd2FrZXVwOiBib3R0b209JXBcbiIsCisJCQkJCSBidHYtPmMubnIsIHdha2V1cC0+Ym90dG9tKTsKIAkJCXdha2V1cC0+Ym90dG9tLT52Yi50cyA9IHRzOwogCQkJd2FrZXVwLT5ib3R0b20tPnZiLmZpZWxkX2NvdW50ID0gYnR2LT5maWVsZF9jb3VudDsKIAkJCXdha2V1cC0+Ym90dG9tLT52Yi5zdGF0ZSA9IHN0YXRlOwpAQCAtMzg2NiwxMSArMzg3OCwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoYnR0dl92ZXJib3NlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogdGltZW91dDogZHJvcD0lZCBpcnE9JWQvJWQsIHJpc2M9JTA4eCwgIiwKLQkJICAgICAgIGJ0di0+Yy5uciwgYnR2LT5mcmFtZWRyb3AsIGJ0di0+aXJxX21lLCBidHYtPmlycV90b3RhbCwKLQkJICAgICAgIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CisJCXByX2luZm8oIiVkOiB0aW1lb3V0OiBkcm9wPSVkIGlycT0lZC8lZCwgcmlzYz0lMDh4LCAiLAorCQkJYnR2LT5jLm5yLCBidHYtPmZyYW1lZHJvcCwgYnR2LT5pcnFfbWUsIGJ0di0+aXJxX3RvdGFsLAorCQkJYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKIAkJYnR0dl9wcmludF9pcnFiaXRzKGJ0cmVhZChCVDg0OF9JTlRfU1RBVCksMCk7Ci0JCXByaW50aygiXG4iKTsKKwkJcHJfY29udCgiXG4iKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwpAQCAtNDAzMywyMSArNDA0NSwyMyBAQAogCQlkc3RhdD1idHJlYWQoQlQ4NDhfRFNUQVRVUyk7CiAKIAkJaWYgKGlycV9kZWJ1ZykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogaXJxIGxvb3A9JWQgZmM9JWQgIgotCQkJICAgICAgICJyaXNjcz0leCwgcmlzY2M9JTA4eCwgIiwKLQkJCSAgICAgICBidHYtPmMubnIsIGNvdW50LCBidHYtPmZpZWxkX2NvdW50LAotCQkJICAgICAgIHN0YXQ+PjI4LCBidHJlYWQoQlQ4NDhfUklTQ19DT1VOVCkpOworCQkJcHJfZGVidWcoIiVkOiBpcnEgbG9vcD0lZCBmYz0lZCByaXNjcz0leCwgcmlzY2M9JTA4eCwgIiwKKwkJCQkgYnR2LT5jLm5yLCBjb3VudCwgYnR2LT5maWVsZF9jb3VudCwKKwkJCQkgc3RhdD4+MjgsIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CiAJCQlidHR2X3ByaW50X2lycWJpdHMoc3RhdCxhc3RhdCk7CiAJCQlpZiAoc3RhdCAmIEJUODQ4X0lOVF9ITE9DSykKLQkJCQlwcmludGsoIiAgIEhMT0MgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX0hMT0MpCi0JCQkJICAgICAgID8gInllcyIgOiAibm8iKTsKKwkJCQlwcl9jb250KCIgICBITE9DID0+ICVzIiwKKwkJCQkJZHN0YXQgJiBCVDg0OF9EU1RBVFVTX0hMT0MKKwkJCQkJPyAieWVzIiA6ICJubyIpOwogCQkJaWYgKHN0YXQgJiBCVDg0OF9JTlRfVlBSRVMpCi0JCQkJcHJpbnRrKCIgICBQUkVTID0+ICVzIiwgKGRzdGF0ICYgQlQ4NDhfRFNUQVRVU19QUkVTKQotCQkJCSAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisJCQkJcHJfY29udCgiICAgUFJFUyA9PiAlcyIsCisJCQkJCWRzdGF0ICYgQlQ4NDhfRFNUQVRVU19QUkVTCisJCQkJCT8gInllcyIgOiAibm8iKTsKIAkJCWlmIChzdGF0ICYgQlQ4NDhfSU5UX0ZNVENIRykKLQkJCQlwcmludGsoIiAgIE5VTUwgPT4gJXMiLCAoZHN0YXQgJiBCVDg0OF9EU1RBVFVTX05VTUwpCi0JCQkJICAgICAgID8gIjYyNSIgOiAiNTI1Iik7Ci0JCQlwcmludGsoIlxuIik7CisJCQkJcHJfY29udCgiICAgTlVNTCA9PiAlcyIsCisJCQkJCWRzdGF0ICYgQlQ4NDhfRFNUQVRVU19OVU1MCisJCQkJCT8gIjYyNSIgOiAiNTI1Iik7CisJCQlwcl9jb250KCJcbiIpOwogCQl9CiAKIAkJaWYgKGFzdGF0JkJUODQ4X0lOVF9WU1lOQykKQEAgLTQwNzUsMTggKzQwODksMTkgQEAKIAkJCWF1ZGlvX211dGUoYnR2LCBidHYtPm11dGUpOyAgLyogdHJpZ2dlciBhdXRvbXV0ZSAqLwogCiAJCWlmIChhc3RhdCAmIChCVDg0OF9JTlRfU0NFUlJ8QlQ4NDhfSU5UX09DRVJSKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiAlcyVzIEAgJTA4eCwiLGJ0di0+Yy5uciwKLQkJCSAgICAgICAoYXN0YXQgJiBCVDg0OF9JTlRfU0NFUlIpID8gIlNDRVJSIiA6ICIiLAotCQkJICAgICAgIChhc3RhdCAmIEJUODQ4X0lOVF9PQ0VSUikgPyAiT0NFUlIiIDogIiIsCi0JCQkgICAgICAgYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKKwkJCXByX2luZm8oIiVkOiAlcyVzIEAgJTA4eCwiLAorCQkJCWJ0di0+Yy5uciwKKwkJCQkoYXN0YXQgJiBCVDg0OF9JTlRfU0NFUlIpID8gIlNDRVJSIiA6ICIiLAorCQkJCShhc3RhdCAmIEJUODQ4X0lOVF9PQ0VSUikgPyAiT0NFUlIiIDogIiIsCisJCQkJYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKIAkJCWJ0dHZfcHJpbnRfaXJxYml0cyhzdGF0LGFzdGF0KTsKLQkJCXByaW50aygiXG4iKTsKKwkJCXByX2NvbnQoIlxuIik7CiAJCQlpZiAoYnR0dl9kZWJ1ZykKIAkJCQlidHR2X3ByaW50X3Jpc2NhZGRyKGJ0dik7CiAJCX0KIAkJaWYgKGZkc3IgJiYgYXN0YXQgJiBCVDg0OF9JTlRfRkRTUikgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGRFNSIEAgJTA4eFxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsYnRyZWFkKEJUODQ4X1JJU0NfQ09VTlQpKTsKKwkJCXByX2luZm8oIiVkOiBGRFNSIEAgJTA4eFxuIiwKKwkJCQlidHYtPmMubnIsIGJ0cmVhZChCVDg0OF9SSVNDX0NPVU5UKSk7CiAJCQlpZiAoYnR0dl9kZWJ1ZykKIAkJCQlidHR2X3ByaW50X3Jpc2NhZGRyKGJ0dik7CiAJCX0KQEAgLTQwOTcsMTEgKzQxMTIsMTEgQEAKIAkJCWlmIChjb3VudCA+IDggfHwgIShhc3RhdCAmIEJUODQ4X0lOVF9HUElOVCkpIHsKIAkJCQlidHdyaXRlKDAsIEJUODQ4X0lOVF9NQVNLKTsKIAotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiYnR0diVkOiBJUlEgbG9ja3VwLCBjbGVhcmVkIGludCBtYXNrIFsiLCBidHYtPmMubnIpOworCQkJCXByX2VycigiJWQ6IElSUSBsb2NrdXAsIGNsZWFyZWQgaW50IG1hc2sgWyIsCisJCQkJICAgICAgIGJ0di0+Yy5ucik7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAiYnR0diVkOiBJUlEgbG9ja3VwLCBjbGVhcmluZyBHUElOVCBmcm9tIGludCBtYXNrIFsiLCBidHYtPmMubnIpOworCQkJCXByX2VycigiJWQ6IElSUSBsb2NrdXAsIGNsZWFyaW5nIEdQSU5UIGZyb20gaW50IG1hc2sgWyIsCisJCQkJICAgICAgIGJ0di0+Yy5ucik7CiAKIAkJCQlidHdyaXRlKGJ0cmVhZChCVDg0OF9JTlRfTUFTSykgJiAoLTEgXiBCVDg0OF9JTlRfR1BJTlQpLAogCQkJCQkJQlQ4NDhfSU5UX01BU0spOwpAQCAtNDEwOSw3ICs0MTI0LDcgQEAKIAogCQkJYnR0dl9wcmludF9pcnFiaXRzKHN0YXQsYXN0YXQpOwogCi0JCQlwcmludGsoIl1cbiIpOworCQkJcHJfY29udCgiXVxuIik7CiAJCX0KIAl9CiAJYnR2LT5pcnFfdG90YWwrKzsKQEAgLTQxNzEsNyArNDE4Niw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBidHR2X3JlZ2lzdGVyX3ZpZGVvKHN0cnVjdCBidHR2ICpidHYpCiB7CiAJaWYgKG5vX292ZXJsYXkgPiAwKQotCQlwcmludGsoImJ0dHY6IE92ZXJsYXkgc3VwcG9ydCBkaXNhYmxlZC5cbiIpOworCQlwcl9ub3RpY2UoIk92ZXJsYXkgc3VwcG9ydCBkaXNhYmxlZFxuIik7CiAKIAkvKiB2aWRlbyAqLwogCWJ0di0+dmlkZW9fZGV2ID0gdmRldl9pbml0KGJ0diwgJmJ0dHZfdmlkZW9fdGVtcGxhdGUsICJ2aWRlbyIpOwpAQCAtNDE4MSwxMiArNDE5NiwxMSBAQAogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoYnR2LT52aWRlb19kZXYsIFZGTF9UWVBFX0dSQUJCRVIsCiAJCQkJICB2aWRlb19ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZpZGVvX2RldikpOworCXByX2luZm8oIiVkOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKKwkJYnR2LT5jLm5yLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGJ0di0+dmlkZW9fZGV2KSk7CiAJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmYnR2LT52aWRlb19kZXYtPmRldiwKIAkJCQkgICAgICZkZXZfYXR0cl9jYXJkKTwwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnR0diVkOiBkZXZpY2VfY3JlYXRlX2ZpbGUgJ2NhcmQnICIKLQkJICAgICAgICJmYWlsZWRcbiIsIGJ0di0+Yy5ucik7CisJCXByX2VycigiJWQ6IGRldmljZV9jcmVhdGVfZmlsZSAnY2FyZCcgZmFpbGVkXG4iLCBidHYtPmMubnIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTQxOTgsOCArNDIxMiw4IEBACiAJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShidHYtPnZiaV9kZXYsIFZGTF9UWVBFX1ZCSSwKIAkJCQkgIHZiaV9ucltidHYtPmMubnJdKSA8IDApCiAJCWdvdG8gZXJyOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZiaV9kZXYpKTsKKwlwcl9pbmZvKCIlZDogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCisJCWJ0di0+Yy5uciwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShidHYtPnZiaV9kZXYpKTsKIAogCWlmICghYnR2LT5oYXNfcmFkaW8pCiAJCXJldHVybiAwOwpAQCAtNDIxMCw4ICs0MjI0LDggQEAKIAlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGJ0di0+cmFkaW9fZGV2LCBWRkxfVFlQRV9SQURJTywKIAkJCQkgIHJhZGlvX25yW2J0di0+Yy5ucl0pIDwgMCkKIAkJZ290byBlcnI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKLQkgICAgICAgYnR2LT5jLm5yLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGJ0di0+cmFkaW9fZGV2KSk7CisJcHJfaW5mbygiJWQ6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLAorCQlidHYtPmMubnIsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoYnR2LT5yYWRpb19kZXYpKTsKIAogCS8qIGFsbCBkb25lICovCiAJcmV0dXJuIDA7CkBAIC00MjQ0LDEwICs0MjU4LDEwIEBACiAKIAlpZiAoYnR0dl9udW0gPT0gQlRUVl9NQVgpCiAJCXJldHVybiAtRU5PTUVNOwotCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEJ0OHh4IGNhcmQgZm91bmQgKCVkKS5cbiIsIGJ0dHZfbnVtKTsKKwlwcl9pbmZvKCJCdDh4eCBjYXJkIGZvdW5kICglZClcbiIsIGJ0dHZfbnVtKTsKIAlidHR2c1tidHR2X251bV0gPSBidHYgPSBremFsbG9jKHNpemVvZigqYnR2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ0diA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnR0djogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlwcl9lcnIoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJYnR2LT5jLm5yICA9IGJ0dHZfbnVtOwpAQCAtNDI3NywyMSArNDI5MSwxOSBAQAogCWJ0di0+Yy5wY2kgPSBkZXY7CiAJYnR2LT5pZCAgPSBkZXYtPmRldmljZTsKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IENhbid0IGVuYWJsZSBkZXZpY2UuXG4iLAotCQkgICAgICAgYnR2LT5jLm5yKTsKKwkJcHJfd2FybigiJWQ6IENhbid0IGVuYWJsZSBkZXZpY2VcbiIsIGJ0di0+Yy5ucik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIsCi0JCSAgICAgICBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZVxuIiwgYnR2LT5jLm5yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCksCiAJCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsMCksCiAJCQkJYnR2LT5jLnY0bDJfZGV2Lm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogY2FuJ3QgcmVxdWVzdCBpb21lbSAoMHglbGx4KS5cbiIsCi0JCSAgICAgICBidHYtPmMubnIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCkpOworCQlwcl93YXJuKCIlZDogY2FuJ3QgcmVxdWVzdCBpb21lbSAoMHglbGx4KVxuIiwKKwkJCWJ0di0+Yy5uciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlwY2lfc2V0X21hc3RlcihkZXYpOwpAQCAtNDI5OSwyMiArNDMxMSwyMSBAQAogCiAJcmVzdWx0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2LCAmYnR2LT5jLnY0bDJfZGV2KTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkXG4iLCBidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogdjRsMl9kZXZpY2VfcmVnaXN0ZXIoKSBmYWlsZWRcbiIsIGJ0di0+Yy5ucik7CiAJCWdvdG8gZmFpbDA7CiAJfQogCiAJYnR2LT5yZXZpc2lvbiA9IGRldi0+cmV2aXNpb247CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBCdCVkIChyZXYgJWQpIGF0ICVzLCAiLAotCSAgICAgICBidHR2X251bSxidHYtPmlkLCBidHYtPnJldmlzaW9uLCBwY2lfbmFtZShkZXYpKTsKLQlwcmludGsoImlycTogJWQsIGxhdGVuY3k6ICVkLCBtbWlvOiAweCVsbHhcbiIsCi0JICAgICAgIGJ0di0+Yy5wY2ktPmlycSwgbGF0LAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsMCkpOworCXByX2luZm8oIiVkOiBCdCVkIChyZXYgJWQpIGF0ICVzLCBpcnE6ICVkLCBsYXRlbmN5OiAlZCwgbW1pbzogMHglbGx4XG4iLAorCQlidHR2X251bSwgYnR2LT5pZCwgYnR2LT5yZXZpc2lvbiwgcGNpX25hbWUoZGV2KSwKKwkJYnR2LT5jLnBjaS0+aXJxLCBsYXQsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkpOwogCXNjaGVkdWxlKCk7CiAKIAlidHYtPmJ0ODQ4X21taW8gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLCAweDEwMDApOwogCWlmIChOVUxMID09IGJ0di0+YnQ4NDhfbW1pbykgewotCQlwcmludGsoImJ0dHYlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgYnR2LT5jLm5yKTsKKwkJcHJfZXJyKCIlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgYnR2LT5jLm5yKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBmYWlsMTsKIAl9CkBAIC00MzI3LDggKzQzMzgsOCBAQAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGJ0di0+Yy5wY2ktPmlycSwgYnR0dl9pcnEsCiAJICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgYnR2LT5jLnY0bDJfZGV2Lm5hbWUsICh2b2lkICopYnR2KTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImJ0dHYlZDogY2FuJ3QgZ2V0IElSUSAlZFxuIiwKLQkJICAgICAgIGJ0dHZfbnVtLGJ0di0+Yy5wY2ktPmlycSk7CisJCXByX2VycigiJWQ6IGNhbid0IGdldCBJUlEgJWRcbiIsCisJCSAgICAgICBidHR2X251bSwgYnR2LT5jLnBjaS0+aXJxKTsKIAkJZ290byBmYWlsMTsKIAl9CiAKQEAgLTQ0MzMsNyArNDQ0NCw3IEBACiAJc3RydWN0IGJ0dHYgKmJ0diA9IHRvX2J0dHYodjRsMl9kZXYpOwogCiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKCJidHR2JWQ6IHVubG9hZGluZ1xuIixidHYtPmMubnIpOworCQlwcl9pbmZvKCIlZDogdW5sb2FkaW5nXG4iLCBidHYtPmMubnIpOwogCiAJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKIAkJZmx1c2hfcmVxdWVzdF9tb2R1bGVzKGJ0dik7CkBAIC00NDgxLDcgKzQ0OTIsNyBAQAogCXN0cnVjdCBidHR2X2J1ZmZlcl9zZXQgaWRsZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZHByaW50aygiYnR0diVkOiBzdXNwZW5kICVkXG4iLCBidHYtPmMubnIsIHN0YXRlLmV2ZW50KTsKKwlkcHJpbnRrKCIlZDogc3VzcGVuZCAlZFxuIiwgYnR2LT5jLm5yLCBzdGF0ZS5ldmVudCk7CiAKIAkvKiBzdG9wIGRtYSArIGlycXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnR2LT5zX2xvY2ssZmxhZ3MpOwpAQCAtNDUxNywxNCArNDUyOCwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAotCWRwcmludGsoImJ0dHYlZDogcmVzdW1lXG4iLCBidHYtPmMubnIpOworCWRwcmludGsoIiVkOiByZXN1bWVcbiIsIGJ0di0+Yy5ucik7CiAKIAkvKiByZXN0b3JlIHBjaSBzdGF0ZSAqLwogCWlmIChidHYtPnN0YXRlLmRpc2FibGVkKSB7CiAJCWVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKLQkJCQkJCQkJYnR2LT5jLm5yKTsKKwkJCXByX3dhcm4oIiVkOiBDYW4ndCBlbmFibGUgZGV2aWNlXG4iLCBidHYtPmMubnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlidHYtPnN0YXRlLmRpc2FibGVkID0gMDsKQEAgLTQ1MzIsOCArNDU0Miw3IEBACiAJZXJyPXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKIAlpZiAoZXJyKSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBDYW4ndCBlbmFibGUgZGV2aWNlLlxuIiwKLQkJCQkJCQlidHYtPmMubnIpOworCQlwcl93YXJuKCIlZDogQ2FuJ3QgZW5hYmxlIGRldmljZVxuIiwgYnR2LT5jLm5yKTsKIAkJYnR2LT5zdGF0ZS5kaXNhYmxlZCA9IDE7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNDU4NSwyMiArNDU5NCwyMSBAQAogCiAJYnR0dl9udW0gPSAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAotCSAgICAgICBCVFRWX1ZFUlNJT04pOworCXByX2luZm8oImRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwgQlRUVl9WRVJTSU9OKTsKIAlpZiAoZ2J1ZmZlcnMgPCAyIHx8IGdidWZmZXJzID4gVklERU9fTUFYX0ZSQU1FKQogCQlnYnVmZmVycyA9IDI7CiAJaWYgKGdidWZzaXplID4gQlRUVl9NQVhfRkJVRikKIAkJZ2J1ZnNpemUgPSBCVFRWX01BWF9GQlVGOwogCWdidWZzaXplID0gKGdidWZzaXplICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CiAJaWYgKGJ0dHZfdmVyYm9zZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogdXNpbmcgJWQgYnVmZmVycyB3aXRoICVkayAoJWQgcGFnZXMpIGVhY2ggZm9yIGNhcHR1cmVcbiIsCi0JCSAgICAgICBnYnVmZmVycywgZ2J1ZnNpemUgPj4gMTAsIGdidWZzaXplID4+IFBBR0VfU0hJRlQpOworCQlwcl9pbmZvKCJ1c2luZyAlZCBidWZmZXJzIHdpdGggJWRrICglZCBwYWdlcykgZWFjaCBmb3IgY2FwdHVyZVxuIiwKKwkJCWdidWZmZXJzLCBnYnVmc2l6ZSA+PiAxMCwgZ2J1ZnNpemUgPj4gUEFHRV9TSElGVCk7CiAKIAlidHR2X2NoZWNrX2NoaXBzZXQoKTsKIAogCXJldCA9IGJ1c19yZWdpc3RlcigmYnR0dl9zdWJfYnVzX3R5cGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IGJ1c19yZWdpc3RlciBlcnJvcjogJWRcbiIsIHJldCk7CisJCXByX3dhcm4oImJ1c19yZWdpc3RlciBlcnJvcjogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJ0dHZfcGNpX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYwppbmRleCAxM2NlNzJjLi45MjJlODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKQEAgLTI2LDYgKzI2LDggQEAKIAogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC05OSw3ICsxMDEsNyBAQAogCQlrZnJlZShzdWIpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlwcmludGsoImJ0dHYlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBkZXZfbmFtZSgmc3ViLT5kZXYpKTsKKwlwcl9pbmZvKCIlZDogYWRkIHN1YmRldmljZSBcIiVzXCJcbiIsIGNvcmUtPm5yLCBkZXZfbmFtZSgmc3ViLT5kZXYpKTsKIAlsaXN0X2FkZF90YWlsKCZzdWItPmxpc3QsJmNvcmUtPnN1YnMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jCmluZGV4IGQ0OWI2NzUuLmUzOTUyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMKQEAgLTI3LDYgKzI3LDggQEAKIAogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xNTQsOSArMTU2LDcgQEAKIAlpZiAocmV0dmFsID09IDApCiAJCWdvdG8gZWlvOwogCWlmIChpMmNfZGVidWcpIHsKLQkJcHJpbnRrKCIgPFcgJTAyeCAlMDJ4IiwgbXNnLT5hZGRyIDw8IDEsIG1zZy0+YnVmWzBdKTsKLQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQotCQkJcHJpbnRrKCIgPlxuIik7CisJCXByX2NvbnQoIiA8VyAlMDJ4ICUwMngiLCBtc2ctPmFkZHIgPDwgMSwgbXNnLT5idWZbMF0pOwogCX0KIAogCWZvciAoY250ID0gMTsgY250IDwgbXNnLT5sZW47IGNudCsrICkgewpAQCAtMTcwLDE5ICsxNzAsMTggQEAKIAkJCWdvdG8gZXJyOwogCQlpZiAocmV0dmFsID09IDApCiAJCQlnb3RvIGVpbzsKLQkJaWYgKGkyY19kZWJ1ZykgewotCQkJcHJpbnRrKCIgJTAyeCIsIG1zZy0+YnVmW2NudF0pOwotCQkJaWYgKCEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQotCQkJCXByaW50aygiID5cbiIpOwotCQl9CisJCWlmIChpMmNfZGVidWcpCisJCQlwcl9jb250KCIgJTAyeCIsIG1zZy0+YnVmW2NudF0pOwogCX0KKwlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RPUCkpCisJCXByX2NvbnQoIj5cbiIpOwogCXJldHVybiBtc2ctPmxlbjsKIAogIGVpbzoKIAlyZXR2YWwgPSAtRUlPOwogIGVycjoKIAlpZiAoaTJjX2RlYnVnKQotCQlwcmludGsoIiBFUlI6ICVkXG4iLHJldHZhbCk7CisJCXByX2NvbnQoIiBFUlI6ICVkXG4iLHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTkzLDcgKzE5Miw3IEBACiAJdTMyIGNudDsKIAlpbnQgcmV0dmFsOwogCi0JZm9yKGNudCA9IDA7IGNudCA8IG1zZy0+bGVuOyBjbnQrKykgeworCWZvciAoY250ID0gMDsgY250IDwgbXNnLT5sZW47IGNudCsrKSB7CiAJCXhtaXQgPSAobXNnLT5hZGRyIDw8IDI1KSB8ICgxIDw8IDI0KSB8IEkyQ19IVzsKIAkJaWYgKGNudCA8IG1zZy0+bGVuLTEpCiAJCQl4bWl0IHw9IEJUODQ4X0kyQ19XM0I7CkBAIC0yMDEsNiArMjAwLDEyIEBACiAJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUT1A7CiAJCWlmIChjbnQpCiAJCQl4bWl0IHw9IEJUODc4X0kyQ19OT1NUQVJUOworCisJCWlmIChpMmNfZGVidWcpIHsKKwkJCWlmICghKHhtaXQgJiBCVDg3OF9JMkNfTk9TVEFSVCkpCisJCQkJcHJfY29udCgiIDxSICUwMngiLCAobXNnLT5hZGRyIDw8IDEpICsxKTsKKwkJfQorCiAJCWJ0d3JpdGUoeG1pdCwgQlQ4NDhfSTJDKTsKIAkJcmV0dmFsID0gYnR0dl9pMmNfd2FpdF9kb25lKGJ0dik7CiAJCWlmIChyZXR2YWwgPCAwKQpAQCAtMjA5LDIwICsyMTQsMjAgQEAKIAkJCWdvdG8gZWlvOwogCQltc2ctPmJ1ZltjbnRdID0gKCh1MzIpYnRyZWFkKEJUODQ4X0kyQykgPj4gOCkgJiAweGZmOwogCQlpZiAoaTJjX2RlYnVnKSB7Ci0JCQlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RBUlQpKQotCQkJCXByaW50aygiIDxSICUwMngiLCAobXNnLT5hZGRyIDw8IDEpICsxKTsKLQkJCXByaW50aygiID0lMDJ4IiwgbXNnLT5idWZbY250XSk7Ci0JCQlpZiAoISh4bWl0ICYgQlQ4NzhfSTJDX05PU1RPUCkpCi0JCQkJcHJpbnRrKCIgPlxuIik7CisJCQlwcl9jb250KCIgPSUwMngiLCBtc2ctPmJ1ZltjbnRdKTsKIAkJfQorCQlpZiAoaTJjX2RlYnVnICYmICEoeG1pdCAmIEJUODc4X0kyQ19OT1NUT1ApKQorCQkJcHJfY29udCgiID5cbiIpOwogCX0KKworCiAJcmV0dXJuIG1zZy0+bGVuOwogCiAgZWlvOgogCXJldHZhbCA9IC1FSU87CiAgZXJyOgogCWlmIChpMmNfZGVidWcpCi0JCXByaW50aygiIEVSUjogJWRcbiIscmV0dmFsKTsKKwkJcHJfY29udCgiIEVSUjogJWRcbiIscmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMzQsNyArMjM5LDggQEAKIAlpbnQgaTsKIAogCWlmIChpMmNfZGVidWcpCi0JCXByaW50aygiYnQtaTJjOiIpOworCQlwcl9kZWJ1ZygiYnQtaTJjOiIpOworCiAJYnR3cml0ZShCVDg0OF9JTlRfSTJDRE9ORXxCVDg0OF9JTlRfUkFDSywgQlQ4NDhfSU5UX1NUQVQpOwogCWZvciAoaSA9IDAgOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgewpAQCAtMjcxLDIwICsyNzcsMjAgQEAKIAlpZiAoMCAhPSBidHYtPmkyY19yYykKIAkJcmV0dXJuIC0xOwogCWlmIChidHR2X3ZlcmJvc2UgJiYgTlVMTCAhPSBwcm9iZV9mb3IpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogaTJjOiBjaGVja2luZyBmb3IgJXMgQCAweCUwMnguLi4gIiwKLQkJICAgICAgIGJ0di0+Yy5ucixwcm9iZV9mb3IsYWRkcik7CisJCXByX2luZm8oIiVkOiBpMmM6IGNoZWNraW5nIGZvciAlcyBAIDB4JTAyeC4uLiAiLAorCQkJYnR2LT5jLm5yLCBwcm9iZV9mb3IsIGFkZHIpOwogCWJ0di0+aTJjX2NsaWVudC5hZGRyID0gYWRkciA+PiAxOwogCWlmICgxICE9IGkyY19tYXN0ZXJfcmVjdigmYnR2LT5pMmNfY2xpZW50LCAmYnVmZmVyLCAxKSkgewogCQlpZiAoTlVMTCAhPSBwcm9iZV9mb3IpIHsKIAkJCWlmIChidHR2X3ZlcmJvc2UpCi0JCQkJcHJpbnRrKCJub3QgZm91bmRcbiIpOworCQkJCXByX2NvbnQoIm5vdCBmb3VuZFxuIik7CiAJCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBpMmMgcmVhZCAweCV4OiBlcnJvclxuIiwKLQkJCSAgICAgICBidHYtPmMubnIsYWRkcik7CisJCQlwcl93YXJuKCIlZDogaTJjIHJlYWQgMHgleDogZXJyb3JcbiIsCisJCQkJYnR2LT5jLm5yLCBhZGRyKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoYnR0dl92ZXJib3NlICYmIE5VTEwgIT0gcHJvYmVfZm9yKQotCQlwcmludGsoImZvdW5kXG4iKTsKKwkJcHJfY29udCgiZm91bmRcbiIpOwogCXJldHVybiBidWZmZXI7CiB9CiAKQEAgLTMzNSw4ICszNDEsOCBAQAogCQlyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCZidWYsMCk7CiAJCWlmIChyYyA8IDApCiAJCQljb250aW51ZTsKLQkJcHJpbnRrKCIlczogaTJjIHNjYW46IGZvdW5kIGRldmljZSBAIDB4JXggIFslc11cbiIsCi0JCSAgICAgICBuYW1lLCBpIDw8IDEsIGkyY19kZXZzW2ldID8gaTJjX2RldnNbaV0gOiAiPz8/Iik7CisJCXByX2luZm8oIiVzOiBpMmMgc2NhbjogZm91bmQgZGV2aWNlIEAgMHgleCAgWyVzXVxuIiwKKwkJCW5hbWUsIGkgPDwgMSwgaTJjX2RldnNbaV0gPyBpMmNfZGV2c1tpXSA6ICI/Pz8iKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKaW5kZXggNjc3ZDcwYy4uZWY0YzdjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zNiw5ICszOCwxMCBAQAogbW9kdWxlX3BhcmFtKGlyX3JjNV9yZW1vdGVfZ2FwLCBpbnQsIDA2NDQpOwogCiAjdW5kZWYgZHByaW50awotI2RlZmluZSBkcHJpbnRrKGFyZy4uLikgZG8gewlcCi0JaWYgKGlyX2RlYnVnID49IDEpCVwKLQkJcHJpbnRrKGFyZyk7CVwKKyNkZWZpbmUgZHByaW50ayhmbXQsIC4uLikJCQlcCitkbyB7CQkJCQkJXAorCWlmIChpcl9kZWJ1ZyA+PSAxKQkJCVwKKwkJcHJfaW5mbyhmbXQsICMjX19WQV9BUkdTX18pOwlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIERFVk5BTUUgImJ0dHYtaW5wdXQiCkBAIC02Miw3ICs2NSw3IEBACiAKIAkvKiBleHRyYWN0IGRhdGEgKi8KIAlkYXRhID0gaXJfZXh0cmFjdF9iaXRzKGdwaW8sIGlyLT5tYXNrX2tleWNvZGUpOwotCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogaXJxIGdwaW89MHgleCBjb2RlPSVkIHwgJXMlcyVzXG4iLAorCWRwcmludGsoImlycSBncGlvPTB4JXggY29kZT0lZCB8ICVzJXMlc1xuIiwKIAkJZ3BpbywgZGF0YSwKIAkJaXItPnBvbGxpbmcgICAgICAgICAgICAgICA/ICJwb2xsIiAgOiAiaXJxIiwKIAkJKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSA/ICIgZG93biIgOiAiIiwKQEAgLTk2LDcgKzk5LDcgQEAKIAlrZXl1cCA9IChncGlvICYgaXItPm1hc2tfa2V5dXApID8gMSA8PCAzMSA6IDA7CiAKIAlpZiAoKGlyLT5sYXN0X2dwaW8gJiAweDdmKSAhPSBkYXRhKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogZ3Bpbz0weCV4IGNvZGU9JWQgfCAlc1xuIiwKKwkJZHByaW50aygiZ3Bpbz0weCV4IGNvZGU9JWQgfCAlc1xuIiwKIAkJCWdwaW8sIGRhdGEsCiAJCQkoZ3BpbyAmIGlyLT5tYXNrX2tleXVwKSA/ICIgdXAiIDogInVwL2Rvd24iKTsKIApAQCAtMTA3LDcgKzExMCw3IEBACiAJCWlmICgoaXItPmxhc3RfZ3BpbyAmIDEgPDwgMzEpID09IGtleXVwKQogCQkJcmV0dXJuOwogCi0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjooY250KSBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAorCQlkcHJpbnRrKCIoY250KSBncGlvPTB4JXggY29kZT0lZCB8ICVzXG4iLAogCQkJZ3BpbywgZGF0YSwKIAkJCShncGlvICYgaXItPm1hc2tfa2V5dXApID8gIiB1cCIgOiAiZG93biIpOwogCkBAIC0xNzcsMTMgKzE4MCwxMiBAQAogCQkJcmM1IHw9IDE7CiAJCWJyZWFrOwogCQljYXNlIDM6Ci0JCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6cmM1X2RlY29kZSgleCkgYmFkIGNvZGVcbiIsCisJCQlkcHJpbnRrKCJyYzVfZGVjb2RlKCV4KSBiYWQgY29kZVxuIiwKIAkJCQlvcmdfY29kZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgotCQkiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCisJZHByaW50aygiY29kZT0leCwgcmM1PSV4LCBzdGFydD0leCwgdG9nZ2xlPSV4LCBhZGRyZXNzPSV4LCAiCiAJCSJpbnN0cj0leFxuIiwgcmM1LCBvcmdfY29kZSwgUkM1X1NUQVJUKHJjNSksCiAJCVJDNV9UT0dHTEUocmM1KSwgUkM1X0FERFIocmM1KSwgUkM1X0lOU1RSKHJjNSkpOwogCXJldHVybiByYzU7CkBAIC0yMTIsMjAgKzIxNCwyMCBAQAogCiAJLyogQWxsb3cgc29tZSB0aW1lciBqaXR0ZXIgKFJDNSBpcyB+MjRtcyBhbnl3YXkgc28gdGhpcyBpcyBvaykgKi8KIAlpZiAoZ2FwIDwgMjgwMDApIHsKLQkJZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBzcHVyaW91cyB0aW1lcl9lbmRcbiIpOworCQlkcHJpbnRrKCJzcHVyaW91cyB0aW1lcl9lbmRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlyLT5sYXN0X2JpdCA8IDIwKSB7CiAJCS8qIGlnbm9yZSBzcHVyaW91cyBjb2RlcyAoY2F1c2VkIGJ5IGxpZ2h0L290aGVyIHJlbW90ZXMpICovCi0JCWRwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogc2hvcnQgY29kZTogJXhcbiIsIGlyLT5jb2RlKTsKKwkJZHByaW50aygic2hvcnQgY29kZTogJXhcbiIsIGlyLT5jb2RlKTsKIAl9IGVsc2UgewogCQlpci0+Y29kZSA9IChpci0+Y29kZSA8PCBpci0+c2hpZnRfYnkpIHwgMTsKIAkJcmM1ID0gYnR0dl9yYzVfZGVjb2RlKGlyLT5jb2RlKTsKIAogCQkvKiB0d28gc3RhcnQgYml0cz8gKi8KIAkJaWYgKFJDNV9TVEFSVChyYzUpICE9IGlyLT5zdGFydCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgorCQkJcHJfaW5mbyhERVZOQU1FICI6IgogCQkJICAgICAgICIgcmM1IHN0YXJ0IGJpdHMgaW52YWxpZDogJXVcbiIsIFJDNV9TVEFSVChyYzUpKTsKIAogCQkJLyogcmlnaHQgYWRkcmVzcz8gKi8KQEAgLTIzNSw4ICsyMzcsNyBAQAogCiAJCQkvKiBHb29kIGNvZGUgKi8KIAkJCXJjX2tleWRvd24oaXItPmRldiwgaW5zdHIsIHRvZ2dsZSk7Ci0JCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IgotCQkJCSIgaW5zdHJ1Y3Rpb24gJXgsIHRvZ2dsZSAleFxuIiwKKwkJCWRwcmludGsoImluc3RydWN0aW9uICV4LCB0b2dnbGUgJXhcbiIsCiAJCQkJaW5zdHIsIHRvZ2dsZSk7CiAJCX0KIAl9CkBAIC0yNjUsNyArMjY2LDcgQEAKIAkJICAgIHR2LnR2X3VzZWMgLSBpci0+YmFzZV90aW1lLnR2X3VzZWM7CiAJfQogCi0JZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBSQzUgSVJROiBnYXAgJWQgdXMgZm9yICVzXG4iLAorCWRwcmludGsoIlJDNSBJUlE6IGdhcCAlZCB1cyBmb3IgJXNcbiIsCiAJCWdhcCwgKGdwaW8gJiAweDIwKSA/ICJtYXJrIiA6ICJzcGFjZSIpOwogCiAJLyogcmVtb3RlIElSUT8gKi8KQEAgLTM0MCwxNCArMzQxLDE0IEBACiAKIAkvKiBwb2xsIElSIGNoaXAgKi8KIAlpZiAoMSAhPSBpMmNfbWFzdGVyX3JlY3YoaXItPmMsICZiLCAxKSkgewotCQlkcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6IHJlYWQgZXJyb3JcbiIpOworCQlkcHJpbnRrKCJyZWFkIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogaWdub3JlIDB4YWEgKi8KIAlpZiAoYj09MHhhYSkKIAkJcmV0dXJuIDA7Ci0JZHByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiBrZXkgJTAyeFxuIiwgYik7CisJZHByaW50aygia2V5ICUwMnhcbiIsIGIpOwogCiAJLyoKIAkgKiBOT1RFOgpAQCAtNTE3LDcgKzUxOCw3IEBACiAJCWJyZWFrOwogCX0KIAlpZiAoTlVMTCA9PSBpcl9jb2RlcykgewotCQlkcHJpbnRrKEtFUk5fSU5GTyAiT29vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsIGJ0di0+Yy50eXBlKTsKKwkJZHByaW50aygiT29vcHM6IElSIGNvbmZpZyBlcnJvciBbY2FyZD0lZF1cbiIsIGJ0di0+Yy50eXBlKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXJpc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1yaXNjLmMKaW5kZXggOWI1N2QwOS4uODJjYzQ3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXJpc2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtcmlzYy5jCkBAIC0yNCw2ICsyNCw4IEBACiAKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NzMsOCArNDc1LDcgQEAKIAljYXBjdGwgfD0gKGJ0di0+Y2FwX2N0bCAmIDB4MGMpID8gMHgwYyA6IDB4MDA7ICAvKiB2YmkgZGF0YSAqLwogCWNhcGN0bCB8PSBvdmVycmlkZTsKIAotCWQycHJpbnRrKEtFUk5fREVCVUcKLQkJICJidHR2JWQ6IGNhcGN0bD0leCBsaXJxPSVkIHRvcD0lMDhMeC8lMDhMeCBldmVuPSUwOEx4LyUwOEx4XG4iLAorCWQycHJpbnRrKCIlZDogY2FwY3RsPSV4IGxpcnE9JWQgdG9wPSUwOGxseC8lMDhsbHggZXZlbj0lMDhsbHgvJTA4bGx4XG4iLAogCQkgYnR2LT5jLm5yLGNhcGN0bCxidHYtPmxvb3BfaXJxLAogCQkgYnR2LT5jdmJpICAgICAgICAgPyAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+Y3ZiaS0+dG9wLmRtYSAgICAgICAgICAgIDogMCwKIAkJIGJ0di0+Y3Vyci50b3AgICAgID8gKHVuc2lnbmVkIGxvbmcgbG9uZylidHYtPmN1cnIudG9wLT50b3AuZG1hICAgICAgICA6IDAsCkBAIC01MTcsOCArNTE4LDggQEAKIAogCWlmICgocmMgPSBidGN4X3Jpc2NtZW1fYWxsb2MoYnR2LT5jLnBjaSwmYnR2LT5tYWluLFBBR0VfU0laRSkpIDwgMCkKIAkJcmV0dXJuIHJjOwotCWRwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiByaXNjIG1haW4gQCAlMDhMeFxuIiwKLQkJYnR2LT5jLm5yLCh1bnNpZ25lZCBsb25nIGxvbmcpYnR2LT5tYWluLmRtYSk7CisJZHByaW50aygiJWQ6IHJpc2MgbWFpbiBAICUwOGxseFxuIiwKKwkJYnR2LT5jLm5yLCAodW5zaWduZWQgbG9uZyBsb25nKWJ0di0+bWFpbi5kbWEpOwogCiAJYnR2LT5tYWluLmNwdVswXSA9IGNwdV90b19sZTMyKEJUODQ4X1JJU0NfU1lOQyB8IEJUODQ4X1JJU0NfUkVTWU5DIHwKIAkJCQkgICAgICAgQlQ4NDhfRklGT19TVEFUVVNfVlJFKTsKQEAgLTU1NywxMiArNTU4LDEyIEBACiAJdW5zaWduZWQgbG9uZyBuZXh0ID0gYnR2LT5tYWluLmRtYSArICgoc2xvdCsyKSA8PCAyKTsKIAogCWlmIChOVUxMID09IHJpc2MpIHsKLQkJZDJwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiByaXNjPSVwIHNsb3RbJWRdPU5VTExcbiIsCi0JCQkgYnR2LT5jLm5yLHJpc2Msc2xvdCk7CisJCWQycHJpbnRrKCIlZDogcmlzYz0lcCBzbG90WyVkXT1OVUxMXG4iLCBidHYtPmMubnIsIHJpc2MsIHNsb3QpOwogCQlidHYtPm1haW4uY3B1W3Nsb3QrMV0gPSBjcHVfdG9fbGUzMihuZXh0KTsKIAl9IGVsc2UgewotCQlkMnByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHJpc2M9JXAgc2xvdFslZF09JTA4THggaXJxPSVkXG4iLAotCQkJIGJ0di0+Yy5ucixyaXNjLHNsb3QsKHVuc2lnbmVkIGxvbmcgbG9uZylyaXNjLT5kbWEsaXJxZmxhZ3MpOworCQlkMnByaW50aygiJWQ6IHJpc2M9JXAgc2xvdFslZF09JTA4bGx4IGlycT0lZFxuIiwKKwkJCSBidHYtPmMubnIsIHJpc2MsIHNsb3QsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyaXNjLT5kbWEsIGlycWZsYWdzKTsKIAkJY21kID0gQlQ4NDhfUklTQ19KVU1QOwogCQlpZiAoaXJxZmxhZ3MpIHsKIAkJCWNtZCB8PSBCVDg0OF9SSVNDX0lSUTsKQEAgLTcwOCw4ICs3MDksNyBAQAogCWNvbnN0IHN0cnVjdCBidHR2X3R2bm9ybSAqdHZub3JtID0gYnR0dl90dm5vcm1zICsgYnVmLT50dm5vcm07CiAJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hPXZpZGVvYnVmX3RvX2RtYSgmYnVmLT52Yik7CiAKLQlkcHJpbnRrKEtFUk5fREVCVUcKLQkJImJ0dHYlZDogYnVmZmVyIGZpZWxkOiAlcyAgZm9ybWF0OiAlcyAgc2l6ZTogJWR4JWRcbiIsCisJZHByaW50aygiJWQ6IGJ1ZmZlciBmaWVsZDogJXMgIGZvcm1hdDogJXMgIHNpemU6ICVkeCVkXG4iLAogCQlidHYtPmMubnIsIHY0bDJfZmllbGRfbmFtZXNbYnVmLT52Yi5maWVsZF0sCiAJCWJ1Zi0+Zm10LT5uYW1lLCBidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CiAKQEAgLTg3MCwxMCArODcwLDkgQEAKIAkJICBzdHJ1Y3QgYnR0dl9idWZmZXIgKmJ1ZikKIHsKIAkvKiBjaGVjayBpbnRlcmxlYXZlLCBib3R0b20rdG9wIGZpZWxkcyAqLwotCWRwcmludGsoS0VSTl9ERUJVRwotCQkiYnR0diVkOiBvdmVybGF5IGZpZWxkczogJXMgZm9ybWF0OiAlcyAgc2l6ZTogJWR4JWRcbiIsCisJZHByaW50aygiJWQ6IG92ZXJsYXkgZmllbGRzOiAlcyBmb3JtYXQ6ICVzICBzaXplOiAlZHglZFxuIiwKIAkJYnR2LT5jLm5yLCB2NGwyX2ZpZWxkX25hbWVzW2J1Zi0+dmIuZmllbGRdLAotCQlmbXQtPm5hbWUsb3YtPncud2lkdGgsb3YtPncuaGVpZ2h0KTsKKwkJZm10LT5uYW1lLCBvdi0+dy53aWR0aCwgb3YtPncuaGVpZ2h0KTsKIAogCS8qIGNhbGN1bGF0ZSBnZW9tZXRyeSAqLwogCWJ0dHZfY2FsY19nZW8oYnR2LCZidWYtPmdlbyxvdi0+dy53aWR0aCxvdi0+dy5oZWlnaHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtdmJpLmMKaW5kZXggZTc5YTQwMi4uYjQzMzI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di12YmkuYwpAQCAtMjMsNiArMjMsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNjUsOCArNjcsMTEgQEAKICNpZmRlZiBkcHJpbnRrCiAjIHVuZGVmIGRwcmludGsKICNlbmRpZgotI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAodmJpX2RlYnVnKSBcCi0JcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZC92Ymk6ICIgZm10LCBidHYtPmMubnIgLCAjIyBhcmcpCisjZGVmaW5lIGRwcmludGsoZm10LCAuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodmJpX2RlYnVnKQkJCQkJCQlcCisJCXByX2RlYnVnKCIlZDogIiBmbXQsIGJ0di0+Yy5uciwgIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIElNQUdFX1NJWkUoZm10KSBcCiAJKCgoZm10KS0+Y291bnRbMF0gKyAoZm10KS0+Y291bnRbMV0pICogKGZtdCktPnNhbXBsZXNfcGVyX2xpbmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKaW5kZXggMzE4ZWRmMi4uZGI5NDNhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKQEAgLTMxMCw5ICszMTAsMjEgQEAKIGV4dGVybiB2b2lkIGJ0dHZfZ3Bpb190cmFja2luZyhzdHJ1Y3QgYnR0diAqYnR2LCBjaGFyICpjb21tZW50KTsKIGV4dGVybiBpbnQgaW5pdF9idHR2X2kyYyhzdHJ1Y3QgYnR0diAqYnR2KTsKIAotI2RlZmluZSBidHR2X3ByaW50ayBpZiAoYnR0dl92ZXJib3NlKSBwcmludGsKLSNkZWZpbmUgZHByaW50ayAgaWYgKGJ0dHZfZGVidWcgPj0gMSkgcHJpbnRrCi0jZGVmaW5lIGQycHJpbnRrIGlmIChidHR2X2RlYnVnID49IDIpIHByaW50aworI2RlZmluZSBkcHJpbnRrKGZtdCwgLi4uKQkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKGJ0dHZfZGVidWcgPj0gMSkJCQlcCisJCXByX2RlYnVnKGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGRwcmludGtfY29udChmbXQsIC4uLikJCQlcCitkbyB7CQkJCQkJXAorCWlmIChidHR2X2RlYnVnID49IDEpCQkJXAorCQlwcl9jb250KGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIGQycHJpbnRrKGZtdCwgLi4uKQkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKGJ0dHZfZGVidWcgPj0gMikJCQlcCisJCXByaW50ayhmbXQsICMjX19WQV9BUkdTX18pOwlcCit9IHdoaWxlICgwKQogCiAjZGVmaW5lIEJUVFZfTUFYX0ZCVUYgICAweDIwODAwMAogI2RlZmluZSBCVFRWX1RJTUVPVVQgICAgbXNlY3NfdG9famlmZmllcyg1MDApICAgIC8qIDAuNSBzZWNvbmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl91c2IuYwppbmRleCBkYzViMDdhLi41OWM3OTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdXNiLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJjcGlhMi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvTWFrZWZpbGUKaW5kZXggMmZhZGQ5ZC4uYTg2YmFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAKIG9iai0kKENPTkZJR19WSURFT19DWDE4KSArPSBjeDE4Lm8KIG9iai0kKENPTkZJR19WSURFT19DWDE4X0FMU0EpICs9IGN4MTgtYWxzYS5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCmluZGV4IDllMmY4NzAuLmM2ZmYzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5jCkBAIC0xMDg1LDYgKzEwODUsOCBAQAogCQlzZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKIAkJc2V0dXAudHlwZSA9IGN4LT5vcHRpb25zLnR1bmVyOwogCQlzZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsgIC8qIG1hdGNoZXMgVFYgdHVuZXJzICovCisJCWlmIChjeC0+b3B0aW9ucy5yYWRpbyA+IDApCisJCQlzZXR1cC5tb2RlX21hc2sgfD0gVF9SQURJTzsKIAkJc2V0dXAudHVuZXJfY2FsbGJhY2sgPSAoc2V0dXAudHlwZSA9PSBUVU5FUl9YQzIwMjgpID8KIAkJCWN4MThfcmVzZXRfdHVuZXJfZ3BpbyA6IE5VTEw7CiAJCWN4MThfY2FsbF9hbGwoY3gsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnNldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKaW5kZXggMTgzNDIwNy4uYjlhOTRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKQEAgLTQwOSw2ICs0MDksNyBAQAogCiAJLyogVmlkZW9idWYgZm9yIFlVViB2aWRlbyAqLwogCXUzMiBwaXhlbGZvcm1hdDsKKwl1MzIgdmJfYnl0ZXNfcGVyX2ZyYW1lOwogCXN0cnVjdCBsaXN0X2hlYWQgdmJfY2FwdHVyZTsgICAgLyogdmlkZW8gY2FwdHVyZSBxdWV1ZSAqLwogCXNwaW5sb2NrX3QgdmJfbG9jazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB2Yl90aW1lb3V0OwpAQCAtNDMwLDEwICs0MzEsNiBAQAogCXUzMiBvcGVuX2lkOwogCWludCB0eXBlOwogCXN0cnVjdCBjeDE4ICpjeDsKLQotCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2YnVmX3E7Ci0Jc3BpbmxvY2tfdCBzX2xvY2s7IC8qIFByb3RlY3QgdmJ1Zl9xICovCi0JZW51bSB2NGwyX2J1Zl90eXBlIHZiX3R5cGU7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjeDE4X29wZW5faWQgKmZoMmlkKHN0cnVjdCB2NGwyX2ZoICpmaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWZpbGVvcHMuYwppbmRleCAwNzQxMWYzLi4xNGNiOTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZmlsZW9wcy5jCkBAIC03ODQsOCArNzg0LDYgQEAKIAkJY3gxOF9yZWxlYXNlX3N0cmVhbShzKTsKIAl9IGVsc2UgewogCQljeDE4X3N0b3BfY2FwdHVyZShpZCwgMCk7Ci0JCWlmIChpZC0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVYpCi0JCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmlkLT52YnVmX3EpOwogCX0KIAlrZnJlZShpZCk7CiAJbXV0ZXhfdW5sb2NrKCZjeC0+c2VyaWFsaXplX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKaW5kZXggYWZlMGEyOS4uNjZiMWMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCkBAIC0xNjAsMTIgKzE2MCw3IEBACiAJcGl4Zm10LT5wcml2ID0gMDsKIAlpZiAoaWQtPnR5cGUgPT0gQ1gxOF9FTkNfU1RSRUFNX1RZUEVfWVVWKSB7CiAJCXBpeGZtdC0+cGl4ZWxmb3JtYXQgPSBzLT5waXhlbGZvcm1hdDsKLQkJLyogSE0xMiBZVVYgc2l6ZSBpcyAoWT0oaCo3MjApICsgVVY9KGgqKDcyMC8yKSkpCi0JCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KLQkJaWYgKHMtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ITTEyKQotCQkJcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmhlaWdodCAqIDcyMCAqIDMgLyAyOwotCQllbHNlCi0JCQlwaXhmbXQtPnNpemVpbWFnZSA9IHBpeGZtdC0+aGVpZ2h0ICogNzIwICogMjsKKwkJcGl4Zm10LT5zaXplaW1hZ2UgPSBzLT52Yl9ieXRlc19wZXJfZnJhbWU7CiAJCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gNzIwOwogCX0gZWxzZSB7CiAJCXBpeGZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKQEAgLTI5Niw2ICsyOTEsMTIgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXMtPnBpeGVsZm9ybWF0ID0gZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0OworCS8qIEhNMTIgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjAvMikpKQorCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KKwlpZiAocy0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0hNMTIpCisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGggKiA3MjAgKiAzIC8gMjsKKwllbHNlCisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGggKiA3MjAgKiAyOwogCiAJbWJ1c19mbXQud2lkdGggPSBjeC0+Y3hoZGwud2lkdGggPSB3OwogCW1idXNfZm10LmhlaWdodCA9IGN4LT5jeGhkbC5oZWlnaHQgPSBoOwpAQCAtNDYzLDEzICs0NjQsMTYgQEAKIHN0YXRpYyBpbnQgY3gxOF9xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdmNhcCkKIHsKLQlzdHJ1Y3QgY3gxOCAqY3ggPSBmaDJpZChmaCktPmN4OworCXN0cnVjdCBjeDE4X29wZW5faWQgKmlkID0gZmgyaWQoZmgpOworCXN0cnVjdCBjeDE4ICpjeCA9IGlkLT5jeDsKIAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBDWDE4X0RSSVZFUl9OQU1FLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCBjeC0+Y2FyZF9uYW1lLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKHZjYXAtPmJ1c19pbmZvLCBzaXplb2YodmNhcC0+YnVzX2luZm8pLAogCQkgIlBDSTolcyIsIHBjaV9uYW1lKGN4LT5wY2lfZGV2KSk7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gY3gtPnY0bDJfY2FwOyAJICAgIC8qIGNhcGFiaWxpdGllcyAqLworCWlmIChpZC0+dHlwZSA9PSBDWDE4X0VOQ19TVFJFQU1fVFlQRV9ZVVYpCisJCXZjYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LW1haWxib3guYwppbmRleCBjMDcxOTFlLi4wYzc3OTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1tYWlsYm94LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtbWFpbGJveC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAl9CiAKIAkvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGJ1ZmZlciBhcyBwZXIgdGhlIGNhbGxlcnMgcmVzIHRoZW4gZGlzcGF0Y2ggaXQgKi8KLQlpZiAodmJfYnVmLT5ieXRlc191c2VkID49ICh2Yl9idWYtPnZiLndpZHRoICogdmJfYnVmLT52Yi5oZWlnaHQgKiAyKSkgeworCWlmICh2Yl9idWYtPmJ5dGVzX3VzZWQgPj0gcy0+dmJfYnl0ZXNfcGVyX2ZyYW1lKSB7CiAJCWRpc3BhdGNoID0gMTsKIAkJdmJfYnVmLT5ieXRlc191c2VkID0gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1zdHJlYW1zLmMKaW5kZXggODUyZjQyMC4uNjM4Y2NhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtc3RyZWFtcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXN0cmVhbXMuYwpAQCAtMTM4LDYgKzEzOCwxMiBAQAogCQlidWYtPnR2bm9ybSAgICA9IGN4LT5zdGQ7CiAJCXMtPnBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXQ7CiAKKwkJLyogSE0xMiBZVVYgc2l6ZSBpcyAoWT0oaCo3MjApICsgVVY9KGgqKDcyMC8yKSkpCisJCSAgIFVZVVYgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjApKSkgKi8KKwkJaWYgKHMtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ITTEyKQorCQkJcy0+dmJfYnl0ZXNfcGVyX2ZyYW1lID0gaGVpZ2h0ICogNzIwICogMyAvIDI7CisJCWVsc2UKKwkJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGhlaWdodCAqIDcyMCAqIDI7CiAJCWN4MThfZG1hX2ZyZWUocSwgcywgYnVmKTsKIAl9CiAKQEAgLTE1NCw2ICsxNjAsMTIgQEAKIAkJYnVmLT50dm5vcm0gICAgPSBjeC0+c3RkOwogCQlzLT5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OwogCisJCS8qIEhNMTIgWVVWIHNpemUgaXMgKFk9KGgqNzIwKSArIFVWPShoKig3MjAvMikpKQorCQkgICBVWVVWIFlVViBzaXplIGlzIChZPShoKjcyMCkgKyBVVj0oaCooNzIwKSkpICovCisJCWlmIChzLT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfSE0xMikKKwkJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGhlaWdodCAqIDcyMCAqIDMgLyAyOworCQllbHNlCisJCQlzLT52Yl9ieXRlc19wZXJfZnJhbWUgPSBoZWlnaHQgKiA3MjAgKiAyOwogCQlyYyA9IHZpZGVvYnVmX2lvbG9jayhxLCAmYnVmLT52YiwgTlVMTCk7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBmYWlsOwpAQCAtMjg3LDYgKzI5OSw3IEBACiAKIAkJLyogQXNzdW1lIHRoZSBwcmV2aW91cyBwaXhlbCBkZWZhdWx0ICovCiAJCXMtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0hNMTI7CisJCXMtPnZiX2J5dGVzX3Blcl9mcmFtZSA9IGN4LT5jeGhkbC5oZWlnaHQgKiA3MjAgKiAzIC8gMjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9NYWtlZmlsZQppbmRleCAyYzI0ODQzLi5iMzM0ODk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L01ha2VmaWxlCkBAIC04LDkgKzgsOSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjMxWFhfQUxTQSkgKz0gY3gyMzF4eC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19DWDIzMVhYX0RWQikgKz0gY3gyMzF4eC1kdmIubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCmluZGV4IGNhYWIxYmYuLmIzOTFlOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9LY29uZmlnCkBAIC0zOCw3ICszOCw3IEBACiBjb25maWcgTUVESUFfQUxURVJBX0NJCiAJdHJpc3RhdGUgIkFsdGVyYSBGUEdBIGJhc2VkIENJIG1vZHVsZSIKIAlkZXBlbmRzIG9uIFZJREVPX0NYMjM4ODUgJiYgRFZCX0NPUkUKLQlzZWxlY3QgU1RBUExfQUxURVJBCisJc2VsZWN0IEFMVEVSQV9TVEFQTAogCS0tLWhlbHAtLS0KIAkgIEFuIEFsdGVyYSBGUEdBIENJIG1vZHVsZSBmb3IgTmV0VVAgRHVhbCBEVkItVC9DIFJGIENJIGNhcmQuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9NYWtlZmlsZQppbmRleCAyMzI5M2M3Li5mODFmMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L01ha2VmaWxlCkBAIC0yLDE0ICsyLDE0IEBACiAJCSAgICBjeDIzODg1LWNvcmUubyBjeDIzODg1LWkyYy5vIGN4MjM4ODUtZHZiLm8gY3gyMzg4NS00MTcubyBcCiAJCSAgICBjeDIzODg1LWlvY3RsLm8gY3gyMzg4NS1pci5vIGN4MjM4ODUtYXYubyBjeDIzODg1LWlucHV0Lm8gXAogCQkgICAgY3gyMzg4OC1pci5vIG5ldHVwLWluaXQubyBjaW1heDIubyBuZXR1cC1lZXByb20ubyBcCi0JCSAgICBjeDIzODg1LWYzMDAubworCQkgICAgY3gyMzg4NS1mMzAwLm8gY3gyMzg4NS1hbHNhLm8KIAogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjM4ODUpICs9IGN4MjM4ODUubwogb2JqLSQoQ09ORklHX01FRElBX0FMVEVSQV9DSSkgKz0gYWx0ZXJhLWNpLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIAotRVhUUkFfQ0ZMQUdTICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCitjY2ZsYWdzLXkgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWFsc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTUxNjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtYWxzYS5jCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICoKKyAqICBTdXBwb3J0IGZvciBDWDIzODg1IGFuYWxvZyBhdWRpbyBjYXB0dXJlCisgKgorICogICAgKGMpIDIwMDggTWlqaGFpbCBNb3JleXJhIDxtaWpoYWlsLm1vcmV5cmFAZ21haWwuY29tPgorICogICAgQWRhcHRlZCBmcm9tIGN4ODgtYWxzYS5jCisgKiAgICAoYykgMjAwOSBTdGV2ZW4gVG90aCA8c3RvdGhAa2VybmVsbGFicy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisKKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworCisjaW5jbHVkZSAiY3gyMzg4NS5oIgorI2luY2x1ZGUgImN4MjM4ODUtcmVnLmgiCisKKyNkZWZpbmUgQVVESU9fU1JBTV9DSEFOTkVMCVNSQU1fQ0gwNworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsIGNoaXAtPmRldi0+bmFtZSAsICMjIGFyZykKKworI2RlZmluZSBkcHJpbnRrX2NvcmUobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAoYXVkaW9fZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBjaGlwLT5kZXYtPm5hbWUgLCAjIyBhcmcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlNb2R1bGUgZ2xvYmFsIHN0YXRpYyB2YXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBkaXNhYmxlX2FuYWxvZ19hdWRpbzsKK21vZHVsZV9wYXJhbShkaXNhYmxlX2FuYWxvZ19hdWRpbywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9hbmFsb2dfYXVkaW8sICJkaXNhYmxlIGFuYWxvZyBhdWRpbyBBTFNBIGRyaXZlciIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvX2RlYnVnOworbW9kdWxlX3BhcmFtKGF1ZGlvX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhdWRpb19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbYW5hbG9nIGF1ZGlvXSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQm9hcmQgc3BlY2lmaWMgZnVudGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25zdGFudHMgdGFrZW4gZnJvbSBjeDg4LXJlZy5oICovCisjZGVmaW5lIEFVRF9JTlRfRE5fUklTQ0kxICAgICAgICgxIDw8ICAwKQorI2RlZmluZSBBVURfSU5UX1VQX1JJU0NJMSAgICAgICAoMSA8PCAgMSkKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fUklTQ0kxICAgKDEgPDwgIDIpCisjZGVmaW5lIEFVRF9JTlRfRE5fUklTQ0kyICAgICAgICgxIDw8ICA0KSAvKiB5ZXMsIDMgaXMgc2tpcHBlZCAqLworI2RlZmluZSBBVURfSU5UX1VQX1JJU0NJMiAgICAgICAoMSA8PCAgNSkKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fUklTQ0kyICAgKDEgPDwgIDYpCisjZGVmaW5lIEFVRF9JTlRfRE5fU1lOQyAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSBBVURfSU5UX1VQX1NZTkMgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgQVVEX0lOVF9SRFNfRE5fU1lOQyAgICAgKDEgPDwgMTQpCisjZGVmaW5lIEFVRF9JTlRfT1BDX0VSUiAgICAgICAgICgxIDw8IDE2KQorI2RlZmluZSBBVURfSU5UX0JFUl9JUlEgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQVVEX0lOVF9NQ0hHX0lSUSAgICAgICAgKDEgPDwgMjEpCisjZGVmaW5lIEdQX0NPVU5UX0NPTlRST0xfUkVTRVQJMHgzCisKKy8qCisgKiBCT0FSRCBTcGVjaWZpYzogU2V0cyBhdWRpbyBETUEKKyAqLworCitzdGF0aWMgaW50IGN4MjM4ODVfc3RhcnRfYXVkaW9fZG1hKHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgKmJ1ZiA9IGNoaXAtPmJ1ZjsKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiAgPSBjaGlwLT5kZXY7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqYXVkaW9fY2ggPQorCQkmZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF07CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBNYWtlIHN1cmUgUklTQy9GSUZPIGFyZSBvZmYgYmVmb3JlIGNoYW5naW5nIEZJRk8vUklTQyBzZXR0aW5ncyAqLworCWN4X2NsZWFyKEFVRF9JTlRfRE1BX0NUTCwgMHgxMSk7CisKKwkvKiBzZXR1cCBmaWZvICsgZm9ybWF0IC0gb3V0IGNoYW5uZWwgKi8KKwljeDIzODg1X3NyYW1fY2hhbm5lbF9zZXR1cChjaGlwLT5kZXYsIGF1ZGlvX2NoLCBidWYtPmJwbCwKKwkJYnVmLT5yaXNjLmRtYSk7CisKKwkvKiBzZXRzIGJwbCBzaXplICovCisJY3hfd3JpdGUoQVVEX0lOVF9BX0xOR1RILCBidWYtPmJwbCk7CisKKwkvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIGdldCBnb29kIGF1ZGlvICgxIHNlZW1zIHRvIGJlIG9rKSAqLworCWN4X3dyaXRlKEFVRF9JTlRfQV9NT0RFLCAxKTsKKworCS8qIHJlc2V0IGNvdW50ZXIgKi8KKwljeF93cml0ZShBVURfSU5UX0FfR1BDTlRfQ1RMLCBHUF9DT1VOVF9DT05UUk9MX1JFU0VUKTsKKwlhdG9taWNfc2V0KCZjaGlwLT5jb3VudCwgMCk7CisKKwlkcHJpbnRrKDEsICJTdGFydCBhdWRpbyBETUEsICVkIEIvbGluZSwgJWQgbGluZXMvRklGTywgJWQgcGVyaW9kcywgJWQgIgorCQkiYnl0ZSBidWZmZXJcbiIsIGJ1Zi0+YnBsLCBjeF9yZWFkKGF1ZGlvX2NoLT5jbWRzX3N0YXJ0KzEyKT4+MSwKKwkJY2hpcC0+bnVtX3BlcmlvZHMsIGJ1Zi0+YnBsICogY2hpcC0+bnVtX3BlcmlvZHMpOworCisJLyogRW5hYmxlcyBjb3JyZXNwb25kaW5nIGJpdHMgYXQgQVVEX0lOVF9TVEFUICovCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9NU0ssIEFVRF9JTlRfT1BDX0VSUiB8IEFVRF9JTlRfRE5fU1lOQyB8CisJCQkJICAgIEFVRF9JTlRfRE5fUklTQ0kxKTsKKworCS8qIENsZWFuIGFueSBwZW5kaW5nIGludGVycnVwdCBiaXRzIGFscmVhZHkgc2V0ICovCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9TVEFULCB+MCk7CisKKwkvKiBlbmFibGUgYXVkaW8gaXJxcyAqLworCWN4X3NldChQQ0lfSU5UX01TSywgY2hpcC0+ZGV2LT5wY2lfaXJxbWFzayB8IFBDSV9NU0tfQVVEX0lOVCk7CisKKwkvKiBzdGFydCBkbWEgKi8KKwljeF9zZXQoREVWX0NOVFJMMiwgKDE8PDUpKTsgLyogRW5hYmxlcyBSaXNjIFByb2Nlc3NvciAqLworCWN4X3NldChBVURfSU5UX0RNQV9DVEwsIDB4MTEpOyAvKiBhdWRpbyBkb3duc3RyZWFtIEZJRk8gYW5kCisJCQkJCSAgUklTQyBlbmFibGUgKi8KKwlpZiAoYXVkaW9fZGVidWcpCisJCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoY2hpcC0+ZGV2LCBhdWRpb19jaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJPQVJEIFNwZWNpZmljOiBSZXNldHMgYXVkaW8gRE1BCisgKi8KK3N0YXRpYyBpbnQgY3gyMzg4NV9zdG9wX2F1ZGlvX2RtYShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXApCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBjaGlwLT5kZXY7CisJZHByaW50aygxLCAiU3RvcHBpbmcgYXVkaW8gRE1BXG4iKTsKKworCS8qIHN0b3AgZG1hICovCisJY3hfY2xlYXIoQVVEX0lOVF9ETUFfQ1RMLCAweDExKTsKKworCS8qIGRpc2FibGUgaXJxcyAqLworCWN4X2NsZWFyKFBDSV9JTlRfTVNLLCBQQ0lfTVNLX0FVRF9JTlQpOworCWN4X2NsZWFyKEFVRElPX0lOVF9JTlRfTVNLLCBBVURfSU5UX09QQ19FUlIgfCBBVURfSU5UX0ROX1NZTkMgfAorCQkJCSAgICBBVURfSU5UX0ROX1JJU0NJMSk7CisKKwlpZiAoYXVkaW9fZGVidWcpCisJCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoY2hpcC0+ZGV2LAorCQkJJmRldi0+c3JhbV9jaGFubmVsc1tBVURJT19TUkFNX0NIQU5ORUxdKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQk9BUkQgU3BlY2lmaWM6IEhhbmRsZXMgYXVkaW8gSVJRCisgKi8KK2ludCBjeDIzODg1X2F1ZGlvX2lycShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIHN0YXR1cywgdTMyIG1hc2spCit7CisJc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjaGlwID0gZGV2LT5hdWRpb19kZXY7CisKKwlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCisJCXJldHVybiAwOworCisJY3hfd3JpdGUoQVVESU9fSU5UX0lOVF9TVEFULCBzdGF0dXMpOworCisJLyogcmlzYyBvcCBjb2RlIGVycm9yICovCisJaWYgKHN0YXR1cyAmIEFVRF9JTlRfT1BDX0VSUikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8xOiBBdWRpbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCisJCQlkZXYtPm5hbWUpOworCQljeF9jbGVhcihBVURfSU5UX0RNQV9DVEwsIDB4MTEpOworCQljeDIzODg1X3NyYW1fY2hhbm5lbF9kdW1wKGRldiwKKwkJCSZkZXYtPnNyYW1fY2hhbm5lbHNbQVVESU9fU1JBTV9DSEFOTkVMXSk7CisJfQorCWlmIChzdGF0dXMgJiBBVURfSU5UX0ROX1NZTkMpIHsKKwkJZHByaW50aygxLCAiRG93bnN0cmVhbSBzeW5jIGVycm9yXG4iKTsKKwkJY3hfd3JpdGUoQVVEX0lOVF9BX0dQQ05UX0NUTCwgR1BfQ09VTlRfQ09OVFJPTF9SRVNFVCk7CisJCXJldHVybiAxOworCX0KKwkvKiByaXNjMSBkb3duc3RyZWFtICovCisJaWYgKHN0YXR1cyAmIEFVRF9JTlRfRE5fUklTQ0kxKSB7CisJCWF0b21pY19zZXQoJmNoaXAtPmNvdW50LCBjeF9yZWFkKEFVRF9JTlRfQV9HUENOVCkpOworCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPnN1YnN0cmVhbSk7CisJfQorCS8qIEZJWE1FOiBBbnkgb3RoZXIgc3RhdHVzIHNob3VsZCBkZXNlcnZlIGEgc3BlY2lhbCBoYW5kbGluZz8gKi8KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRzcF9idWZmZXJfZnJlZShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXApCit7CisJQlVHX09OKCFjaGlwLT5kbWFfc2l6ZSk7CisKKwlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7CisJdmlkZW9idWZfZG1hX3VubWFwKCZjaGlwLT5wY2ktPmRldiwgY2hpcC0+ZG1hX3Jpc2MpOworCXZpZGVvYnVmX2RtYV9mcmVlKGNoaXAtPmRtYV9yaXNjKTsKKwlidGN4X3Jpc2NtZW1fZnJlZShjaGlwLT5wY2ksICZjaGlwLT5idWYtPnJpc2MpOworCWtmcmVlKGNoaXAtPmJ1Zik7CisKKwljaGlwLT5kbWFfcmlzYyA9IE5VTEw7CisJY2hpcC0+ZG1hX3NpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJQUxTQSBQQ00gSW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERpZ2l0YWwgaGFyZHdhcmUgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIERFRkFVTFRfRklGT19TSVpFCTQwOTYKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9jeDIzODg1X2RpZ2l0YWxfaHcgPSB7CisJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKworCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkucmF0ZV9taW4gPQkJNDgwMDAsCisJLnJhdGVfbWF4ID0JCTQ4MDAwLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS8qIEFuYWxvZyBhdWRpbyBvdXRwdXQgd2lsbCBiZSBmdWxsIG9mIGNsaWNrcyBhbmQgcG9wcyBpZiB0aGVyZQorCSAgIGFyZSBub3QgZXhhY3RseSBmb3VyIGxpbmVzIGluIHRoZSBTUkFNIEZJRk8gYnVmZmVyLiAgKi8KKwkucGVyaW9kX2J5dGVzX21pbiA9IERFRkFVTFRfRklGT19TSVpFLzQsCisJLnBlcmlvZF9ieXRlc19tYXggPSBERUZBVUxUX0ZJRk9fU0laRS80LAorCS5wZXJpb2RzX21pbiA9IDEsCisJLnBlcmlvZHNfbWF4ID0gMTAyNCwKKwkuYnVmZmVyX2J5dGVzX21heCA9ICgxMDI0KjEwMjQpLAorfTsKKworLyoKKyAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlpbnQgZXJyOworCisJaWYgKCFjaGlwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBjeDIzODg1IGNhbid0IGZpbmQgZGV2aWNlIHN0cnVjdC4iCisJCQkJIiBDYW4ndCBwcm9jZWVkIHdpdGggb3BlblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsCisJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisKKwlydW50aW1lLT5odyA9IHNuZF9jeDIzODg1X2RpZ2l0YWxfaHc7CisKKwlpZiAoY2hpcC0+ZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF0uZmlmb19zaXplICE9CisJCURFRkFVTFRfRklGT19TSVpFKSB7CisJCXVuc2lnbmVkIGludCBicGwgPSBjaGlwLT5kZXYtPgorCQkJc3JhbV9jaGFubmVsc1tBVURJT19TUkFNX0NIQU5ORUxdLmZpZm9fc2l6ZSAvIDQ7CisJCWJwbCAmPSB+NzsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19taW4gPSBicGw7CisJCXJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXggPSBicGw7CisJfQorCisJcmV0dXJuIDA7CitfZXJyb3I6CisJZHByaW50aygxLCAiRXJyb3Igb3BlbmluZyBQQ00hXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYXVkaW8gY2xvc2UgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGh3X3BhcmFtcyBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF9jeDIzODg1X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWE7CisKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgKmJ1ZjsKKwlpbnQgcmV0OworCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpIHsKKwkJZHNwX2J1ZmZlcl9mcmVlKGNoaXApOworCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKKwl9CisKKwljaGlwLT5wZXJpb2Rfc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKTsKKwljaGlwLT5udW1fcGVyaW9kcyA9IHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CisJY2hpcC0+ZG1hX3NpemUgPSBjaGlwLT5wZXJpb2Rfc2l6ZSAqIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7CisKKwlCVUdfT04oIWNoaXAtPmRtYV9zaXplKTsKKwlCVUdfT04oY2hpcC0+bnVtX3BlcmlvZHMgJiAoY2hpcC0+bnVtX3BlcmlvZHMtMSkpOworCisJYnVmID0ga3phbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYtPmJwbCA9IGNoaXAtPnBlcmlvZF9zaXplOworCisJZG1hID0gJmJ1Zi0+ZG1hOworCXZpZGVvYnVmX2RtYV9pbml0KGRtYSk7CisJcmV0ID0gdmlkZW9idWZfZG1hX2luaXRfa2VybmVsKGRtYSwgUENJX0RNQV9GUk9NREVWSUNFLAorCQkJKFBBR0VfQUxJR04oY2hpcC0+ZG1hX3NpemUpID4+IFBBR0VfU0hJRlQpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHZpZGVvYnVmX2RtYV9tYXAoJmNoaXAtPnBjaS0+ZGV2LCBkbWEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoY2hpcC0+cGNpLCAmYnVmLT5yaXNjLCBkbWEtPnNnbGlzdCwKKwkJCQkgICBjaGlwLT5wZXJpb2Rfc2l6ZSwgY2hpcC0+bnVtX3BlcmlvZHMsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTG9vcCBiYWNrIHRvIHN0YXJ0IG9mIHByb2dyYW0gKi8KKwlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QfFJJU0NfSVJRMXxSSVNDX0NOVF9JTkMpOworCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKwlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJpdHMgNjMtMzIgKi8KKworCWNoaXAtPmJ1ZiA9IGJ1ZjsKKwljaGlwLT5kbWFfcmlzYyA9IGRtYTsKKworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgPSBjaGlwLT5kbWFfcmlzYy0+dmFkZHI7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBjaGlwLT5kbWFfc2l6ZTsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyID0gMDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBodyBmcmVlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4MjM4ODVfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7CisJCWRzcF9idWZmZXJfZnJlZShjaGlwKTsKKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX2N4MjM4ODVfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRyaWdnZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfY3gyMzg4NV9jYXJkX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IGVycjsKKworCS8qIExvY2FsIGludGVycnVwdHMgYXJlIGFscmVhZHkgZGlzYWJsZWQgYnkgQUxTQSAqLworCXNwaW5fbG9jaygmY2hpcC0+bG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWVyciA9IGN4MjM4ODVfc3RhcnRfYXVkaW9fZG1hKGNoaXApOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWVyciA9IGN4MjM4ODVfc3RvcF9hdWRpb19kbWEoY2hpcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwb2ludGVyIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfY3gyMzg4NV9wb2ludGVyKAorCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXUxNiBjb3VudDsKKworCWNvdW50ID0gYXRvbWljX3JlYWQoJmNoaXAtPmNvdW50KTsKKworCXJldHVybiBydW50aW1lLT5wZXJpb2Rfc2l6ZSAqIChjb3VudCAmIChydW50aW1lLT5wZXJpb2RzLTEpKTsKK30KKworLyoKKyAqIHBhZ2UgY2FsbGJhY2sgKG5lZWRlZCBmb3IgbW1hcCkKKyAqLworc3RhdGljIHN0cnVjdCBwYWdlICpzbmRfY3gyMzg4NV9wYWdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXZvaWQgKnBhZ2VwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0OworCXJldHVybiB2bWFsbG9jX3RvX3BhZ2UocGFnZXB0cik7Cit9CisKKy8qCisgKiBvcGVyYXRvcnMKKyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3gyMzg4NV9wY21fb3BzID0geworCS5vcGVuID0gc25kX2N4MjM4ODVfcGNtX29wZW4sCisJLmNsb3NlID0gc25kX2N4MjM4ODVfY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IHNuZF9jeDIzODg1X2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9jeDIzODg1X2h3X2ZyZWUsCisJLnByZXBhcmUgPSBzbmRfY3gyMzg4NV9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX2N4MjM4ODVfY2FyZF90cmlnZ2VyLAorCS5wb2ludGVyID0gc25kX2N4MjM4ODVfcG9pbnRlciwKKwkucGFnZSA9IHNuZF9jeDIzODg1X3BhZ2UsCit9OworCisvKgorICogY3JlYXRlIGEgUENNIGRldmljZQorICovCitzdGF0aWMgaW50IHNuZF9jeDIzODg1X3BjbShzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXAsIGludCBkZXZpY2UsCisJY2hhciAqbmFtZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzbmRfcGNtICpwY207CisKKwllcnIgPSBzbmRfcGNtX25ldyhjaGlwLT5jYXJkLCBuYW1lLCBkZXZpY2UsIDAsIDEsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwlzdHJjcHkocGNtLT5uYW1lLCBuYW1lKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfY3gyMzg4NV9wY21fb3BzKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQmFzaWMgRmxvdyBmb3IgU291bmQgRGV2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBbHNhIENvbnN0cnVjdG9yIC0gQ29tcG9uZW50IHByb2JlCisgKi8KKworc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjeDIzODg1X2F1ZGlvX3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgKmNoaXA7CisJaW50IGVycjsKKworCWlmIChkaXNhYmxlX2FuYWxvZ19hdWRpbykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGV2LT5zcmFtX2NoYW5uZWxzW0FVRElPX1NSQU1fQ0hBTk5FTF0uY21kc19zdGFydCA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IE1pc3NpbmcgU1JBTSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gIgorCQkJImZvciBhbmFsb2cgVFYgQXVkaW9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAorCQkJVEhJU19NT0RVTEUsIHNpemVvZihzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYpLCAmY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwljaGlwID0gKHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqKSBjYXJkLT5wcml2YXRlX2RhdGE7CisJY2hpcC0+ZGV2ID0gZGV2OworCWNoaXAtPnBjaSA9IGRldi0+cGNpOworCWNoaXAtPmNhcmQgPSBjYXJkOworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+cGNpLT5kZXYpOworCisJZXJyID0gc25kX2N4MjM4ODVfcGNtKGNoaXAsIDAsICJDWDIzODg1IERpZ2l0YWwiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsICJDWDIzODg1Iik7CisJc3ByaW50ZihjYXJkLT5zaG9ydG5hbWUsICJDb25leGFudCBDWDIzODg1Iik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0ICVzIiwgY2FyZC0+c2hvcnRuYW1lLCBkZXYtPm5hbWUpOworCisJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlkcHJpbnRrKDAsICJyZWdpc3RlcmVkIEFMU0EgYXVkaW8gZGV2aWNlXG4iKTsKKworCXJldHVybiBjaGlwOworCitlcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXByaW50ayhLRVJOX0VSUiAiJXMoKTogRmFpbGVkIHRvIHJlZ2lzdGVyIGFuYWxvZyAiCisJCQkiYXVkaW8gYWRhcHRlclxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBTFNBIGRlc3RydWN0b3IKKyAqLwordm9pZCBjeDIzODg1X2F1ZGlvX3VucmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCit7CisJc3RydWN0IGN4MjM4ODVfYXVkaW9fZGV2ICpjaGlwID0gZGV2LT5hdWRpb19kZXY7CisKKwlzbmRfY2FyZF9mcmVlKGNoaXAtPmNhcmQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKaW5kZXggNzZiNzU2My4uYzNjZjA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCkBAIC0yNSw4ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS9jeDI1ODQwLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxtaXNjL2FsdGVyYS5oPgogCi0jaW5jbHVkZSAiLi4vLi4vLi4vc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmgiCiAjaW5jbHVkZSAiY3gyMzg4NS5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogI2luY2x1ZGUgIm5ldHVwLWVlcHJvbS5oIgpAQCAtMTA2LDEyICsxMDYsMTQgQEAKIAkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKIAkJCQkJQ1gyNTg0MF9WSU41X0NIMiB8CiAJCQkJCUNYMjU4NDBfVklOMl9DSDEsCisJCQkuYW11eCAgID0gQ1gyNTg0MF9BVURJTzgsCiAJCQkuZ3BpbzAgID0gMCwKIAkJfSwgewogCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9CUNYMjU4NDBfVklON19DSDMgfAogCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKIAkJCQkJQ1gyNTg0MF9WSU42X0NIMSwKKwkJCS5hbXV4ICAgPSBDWDI1ODQwX0FVRElPNywKIAkJCS5ncGlvMCAgPSAwLAogCQl9LCB7CiAJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1NWSURFTywKQEAgLTExOSw2ICsxMjEsNyBAQAogCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKIAkJCQkJQ1gyNTg0MF9WSU44X0NIMSB8CiAJCQkJCUNYMjU4NDBfU1ZJREVPX09OLAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU83LAogCQkJLmdwaW8wICA9IDAsCiAJCX0gfSwKIAl9LApAQCAtMTUzLDcgKzE1NiwzMCBAQAogCX0sCiAJW0NYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDBdID0gewogCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjE1MDAiLAorCQkucG9ydGEJCT0gQ1gyMzg4NV9BTkFMT0dfVklERU8sCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLCAvKiAweGMyID4+IDEgKi8KKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKKwkJCQkJQ1gyNTg0MF9WSU41X0NIMiB8CisJCQkJCUNYMjU4NDBfVklOMl9DSDEsCisJCQkuZ3BpbzAgID0gMCwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9CUNYMjU4NDBfVklON19DSDMgfAorCQkJCQlDWDI1ODQwX1ZJTjRfQ0gyIHwKKwkJCQkJQ1gyNTg0MF9WSU42X0NIMSwKKwkJCS5ncGlvMCAgPSAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPQlDWDI1ODQwX1ZJTjdfQ0gzIHwKKwkJCQkJQ1gyNTg0MF9WSU40X0NIMiB8CisJCQkJCUNYMjU4NDBfVklOOF9DSDEgfAorCQkJCQlDWDI1ODQwX1NWSURFT19PTiwKKwkJCS5ncGlvMCAgPSAwLAorCQl9IH0sCiAJfSwKIAlbQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIwMF0gPSB7CiAJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luVFYtSFZSMTIwMCIsCkBAIC0zODcsNiArNDEzLDMxIEBACiAJCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9TSVRFMSwKIAkJfSB9LAogCX0sCisJW0NYMjM4ODVfQk9BUkRfTVBYODg1XSA9IHsKKwkJLm5hbWUJCT0gIk1QWC04ODUiLAorCQkucG9ydGEJCT0gQ1gyMzg4NV9BTkFMT0dfVklERU8sCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT1NJVEUxLAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU82LAorCQkJLmdwaW8wICA9IDAsCisJCX0sIHsKKwkJCS50eXBlICAgPSBDWDIzODg1X1ZNVVhfQ09NUE9TSVRFMiwKKwkJCS52bXV4ICAgPSBDWDI1ODQwX0NPTVBPU0lURTIsCisJCQkuYW11eCAgID0gQ1gyNTg0MF9BVURJTzYsCisJCQkuZ3BpbzAgID0gMCwKKwkJfSwgeworCQkJLnR5cGUgICA9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUzLAorCQkJLnZtdXggICA9IENYMjU4NDBfQ09NUE9TSVRFMywKKwkJCS5hbXV4ICAgPSBDWDI1ODQwX0FVRElPNywKKwkJCS5ncGlvMCAgPSAwLAorCQl9LCB7CisJCQkudHlwZSAgID0gQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTQsCisJCQkudm11eCAgID0gQ1gyNTg0MF9DT01QT1NJVEU0LAorCQkJLmFtdXggICA9IENYMjU4NDBfQVVESU83LAorCQkJLmdwaW8wICA9IDAsCisJCX0gfSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzODg1X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzg4NV9ib2FyZHMpOwogCkBAIC0xNDE1LDYgKzE0NjYsOCBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYVFYxMjAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9HT1RWSUVXX1g1XzNEX0hZQlJJRDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDA6CisJY2FzZSBDWDIzODg1X0JPQVJEX01QWDg4NToKIAkJZGV2LT5zZF9jeDI1ODQwID0gdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwKIAkJCQkmZGV2LT5pMmNfYnVzWzJdLmkyY19hZGFwLAogCQkJCSJjeDI1ODQwIiwgMHg4OCA+PiAxLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwppbmRleCBlZTQxYTg4Li40MGU2OGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCkBAIC01NCw3ICs1NCw3IEBACiAKICNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pXAogCWRvIHsgaWYgKGRlYnVnID49IGxldmVsKVwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzA6ICIgZm10LCBkZXYtPm5hbWUsICMjIGFyZyk7XAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBkZXYtPm5hbWUsICMjIGFyZyk7XAogCX0gd2hpbGUgKDApCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3gyMzg4NV9kZXZjb3VudDsKQEAgLTE1NSwxMiArMTU1LDEyIEBACiAJCS5jbnQyX3JlZwk9IERNQTVfQ05UMiwKIAl9LAogCVtTUkFNX0NIMDddID0gewotCQkubmFtZQkJPSAiY2g3IiwKLQkJLmNtZHNfc3RhcnQJPSAweDAsCi0JCS5jdHJsX3N0YXJ0CT0gMHgwLAotCQkuY2R0CQk9IDB4MCwKLQkJLmZpZm9fc3RhcnQJPSAweDAsCi0JCS5maWZvX3NpemUJPSAweDAsCisJCS5uYW1lCQk9ICJUViBBdWRpbyIsCisJCS5jbWRzX3N0YXJ0CT0gMHgxMDE5MCwKKwkJLmN0cmxfc3RhcnQJPSAweDEwNDgwLAorCQkuY2R0CQk9IDB4MTBhMDAsCisJCS5maWZvX3N0YXJ0CT0gMHg3MDAwLAorCQkuZmlmb19zaXplCT0gMHgxMDAwLAogCQkucHRyMV9yZWcJPSBETUE2X1BUUjEsCiAJCS5wdHIyX3JlZwk9IERNQTZfUFRSMiwKIAkJLmNudDFfcmVnCT0gRE1BNl9DTlQxLApAQCAtMTA4MiwxMCArMTA4MiwxMCBAQAogc3RhdGljIF9fbGUzMiAqY3gyMzg4NV9yaXNjX2ZpZWxkKF9fbGUzMiAqcnAsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAogCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHUzMiBzeW5jX2xpbmUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwgdW5zaWduZWQgaW50IHBhZGRpbmcsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGxpbmVzKQorCQkJICAgICAgIHVuc2lnbmVkIGludCBsaW5lcywgIHVuc2lnbmVkIGludCBscGkpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQl1bnNpZ25lZCBpbnQgbGluZSwgdG9kbzsKKwl1bnNpZ25lZCBpbnQgbGluZSwgdG9kbywgc29sOwogCiAJLyogc3luYyBpbnN0cnVjdGlvbiAqLwogCWlmIChzeW5jX2xpbmUgIT0gTk9fU1lOQ19MSU5FKQpAQCAtMTA5OCwxNiArMTA5OCwyMiBAQAogCQkJb2Zmc2V0IC09IHNnX2RtYV9sZW4oc2cpOwogCQkJc2crKzsKIAkJfQorCisJCWlmIChscGkgJiYgbGluZSA+IDAgJiYgIShsaW5lICUgbHBpKSkKKwkJCXNvbCA9IFJJU0NfU09MIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DOworCQllbHNlCisJCQlzb2wgPSBSSVNDX1NPTDsKKwogCQlpZiAoYnBsIDw9IHNnX2RtYV9sZW4oc2cpLW9mZnNldCkgewogCQkJLyogZml0cyBpbnRvIGN1cnJlbnQgY2h1bmsgKi8KLQkJCSoocnArKykgPSBjcHVfdG9fbGUzMihSSVNDX1dSSVRFfFJJU0NfU09MfFJJU0NfRU9MfGJwbCk7CisJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19XUklURXxzb2x8UklTQ19FT0x8YnBsKTsKIAkJCSoocnArKykgPSBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzZykrb2Zmc2V0KTsKIAkJCSoocnArKykgPSBjcHVfdG9fbGUzMigwKTsgLyogYml0cyA2My0zMiAqLwogCQkJb2Zmc2V0ICs9IGJwbDsKIAkJfSBlbHNlIHsKIAkJCS8qIHNjYW5saW5lIG5lZWRzIHRvIGJlIHNwbGl0ICovCiAJCQl0b2RvID0gYnBsOwotCQkJKihycCsrKSA9IGNwdV90b19sZTMyKFJJU0NfV1JJVEV8UklTQ19TT0x8CisJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19XUklURXxzb2x8CiAJCQkJCSAgICAoc2dfZG1hX2xlbihzZyktb2Zmc2V0KSk7CiAJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2cpK29mZnNldCk7CiAJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJpdHMgNjMtMzIgKi8KQEAgLTExNjQsMTAgKzExNzAsMTAgQEAKIAlycCA9IHJpc2MtPmNwdTsKIAlpZiAoVU5TRVQgIT0gdG9wX29mZnNldCkKIAkJcnAgPSBjeDIzODg1X3Jpc2NfZmllbGQocnAsIHNnbGlzdCwgdG9wX29mZnNldCwgMCwKLQkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisJCQkJCWJwbCwgcGFkZGluZywgbGluZXMsIDApOwogCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQogCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCBib3R0b21fb2Zmc2V0LCAweDIwMCwKLQkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcyk7CisJCQkJCWJwbCwgcGFkZGluZywgbGluZXMsIDApOwogCiAJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCiAJcmlzYy0+am1wID0gcnA7CkBAIC0xMTc1LDExICsxMTgxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwKK2ludCBjeDIzODg1X3Jpc2NfZGF0YWJ1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCSAgIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCiAJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCiAJCQkJICAgdW5zaWduZWQgaW50IGJwbCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgbGluZXMpCisJCQkJICAgdW5zaWduZWQgaW50IGxpbmVzLCB1bnNpZ25lZCBpbnQgbHBpKQogewogCXUzMiBpbnN0cnVjdGlvbnM7CiAJX19sZTMyICpycDsKQEAgLTExOTksNyArMTIwNSw4IEBACiAKIAkvKiB3cml0ZSByaXNjIGluc3RydWN0aW9ucyAqLwogCXJwID0gcmlzYy0+Y3B1OwotCXJwID0gY3gyMzg4NV9yaXNjX2ZpZWxkKHJwLCBzZ2xpc3QsIDAsIE5PX1NZTkNfTElORSwgYnBsLCAwLCBsaW5lcyk7CisJcnAgPSBjeDIzODg1X3Jpc2NfZmllbGQocnAsIHNnbGlzdCwgMCwgTk9fU1lOQ19MSU5FLAorCQkJCWJwbCwgMCwgbGluZXMsIGxwaSk7CiAKIAkvKiBzYXZlIHBvaW50ZXIgdG8gam1wIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KIAlyaXNjLT5qbXAgPSBycDsKQEAgLTEyMDcsNiArMTIxNCw1NCBAQAogCXJldHVybiAwOwogfQogCitpbnQgY3gyMzg4NV9yaXNjX3ZiaWJ1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LAorCQkJdW5zaWduZWQgaW50IGJvdHRvbV9vZmZzZXQsIHVuc2lnbmVkIGludCBicGwsCisJCQl1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKQoreworCXUzMiBpbnN0cnVjdGlvbnMsIGZpZWxkczsKKwlfX2xlMzIgKnJwOworCWludCByYzsKKworCWZpZWxkcyA9IDA7CisJaWYgKFVOU0VUICE9IHRvcF9vZmZzZXQpCisJCWZpZWxkcysrOworCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQorCQlmaWVsZHMrKzsKKworCS8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIG9uZSB3cml0ZSBwZXIgcGFnZSBib3JkZXIgKworCSAgIG9uZSB3cml0ZSBwZXIgc2NhbiBsaW5lICsgc3luY3MgKyBqdW1wIChhbGwgMiBkd29yZHMpLiAgUGFkZGluZworCSAgIGNhbiBjYXVzZSBuZXh0IGJwbCB0byBzdGFydCBjbG9zZSB0byBhIHBhZ2UgYm9yZGVyLiAgRmlyc3QgRE1BCisJICAgcmVnaW9uIG1heSBiZSBzbWFsbGVyIHRoYW4gUEFHRV9TSVpFICovCisJLyogd3JpdGUgYW5kIGp1bXAgbmVlZCBhbmQgZXh0cmEgZHdvcmQgKi8KKwlpbnN0cnVjdGlvbnMgID0gZmllbGRzICogKDEgKyAoKGJwbCArIHBhZGRpbmcpICogbGluZXMpCisJCS8gUEFHRV9TSVpFICsgbGluZXMpOworCWluc3RydWN0aW9ucyArPSAyOworCXJjID0gYnRjeF9yaXNjbWVtX2FsbG9jKHBjaSwgcmlzYywgaW5zdHJ1Y3Rpb25zKjEyKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJLyogd3JpdGUgcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwlycCA9IHJpc2MtPmNwdTsKKworCS8qIFN5bmMgdG8gbGluZSA2LCBzbyBVUyBDQyBsaW5lIDIxIHdpbGwgYXBwZWFyIGluIGxpbmUgJzEyJworCSAqIGluIHRoZSB1c2VybGFuZCB2YmkgcGF5bG9hZCAqLworCWlmIChVTlNFVCAhPSB0b3Bfb2Zmc2V0KQorCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCB0b3Bfb2Zmc2V0LCA2LAorCQkJCQlicGwsIHBhZGRpbmcsIGxpbmVzLCAwKTsKKworCWlmIChVTlNFVCAhPSBib3R0b21fb2Zmc2V0KQorCQlycCA9IGN4MjM4ODVfcmlzY19maWVsZChycCwgc2dsaXN0LCBib3R0b21fb2Zmc2V0LCAweDIwNywKKwkJCQkJYnBsLCBwYWRkaW5nLCBsaW5lcywgMCk7CisKKworCisJLyogc2F2ZSBwb2ludGVyIHRvIGptcCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCisJcmlzYy0+am1wID0gcnA7CisJQlVHX09OKChyaXNjLT5qbXAgLSByaXNjLT5jcHUgKyAyKSAqIHNpemVvZigqcmlzYy0+Y3B1KSA+IHJpc2MtPnNpemUpOworCXJldHVybiAwOworfQorCisKIGludCBjeDIzODg1X3Jpc2Nfc3RvcHBlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAogCQkJCXUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsdWUpCiB7CkBAIC0xNTE3LDcgKzE1NzIsNyBAQAogCQkJZ290byBmYWlsOwogCQljeDIzODg1X3Jpc2NfZGF0YWJ1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKIAkJCQkJdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKS0+c2dsaXN0LAotCQkJCQlidWYtPnZiLndpZHRoLCBidWYtPnZiLmhlaWdodCk7CisJCQkJCWJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCAwKTsKIAl9CiAJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwogCXJldHVybiAwOwpAQCAtMTc0MSwxNSArMTc5NiwxOSBAQAogCXN0cnVjdCBjeDIzODg1X3RzcG9ydCAqdHMyID0gJmRldi0+dHMyOwogCXUzMiBwY2lfc3RhdHVzLCBwY2lfbWFzazsKIAl1MzIgdmlkYV9zdGF0dXMsIHZpZGFfbWFzazsKKwl1MzIgYXVkaW50X3N0YXR1cywgYXVkaW50X21hc2s7CiAJdTMyIHRzMV9zdGF0dXMsIHRzMV9tYXNrOwogCXUzMiB0czJfc3RhdHVzLCB0czJfbWFzazsKIAlpbnQgdmlkYV9jb3VudCA9IDAsIHRzMV9jb3VudCA9IDAsIHRzMl9jb3VudCA9IDAsIGhhbmRsZWQgPSAwOworCWludCBhdWRpbnRfY291bnQgPSAwOwogCWJvb2wgc3ViZGV2X2hhbmRsZWQ7CiAKIAlwY2lfc3RhdHVzID0gY3hfcmVhZChQQ0lfSU5UX1NUQVQpOwogCXBjaV9tYXNrID0gY3gyMzg4NV9pcnFfZ2V0X21hc2soZGV2KTsKIAl2aWRhX3N0YXR1cyA9IGN4X3JlYWQoVklEX0FfSU5UX1NUQVQpOwogCXZpZGFfbWFzayA9IGN4X3JlYWQoVklEX0FfSU5UX01TSyk7CisJYXVkaW50X3N0YXR1cyA9IGN4X3JlYWQoQVVESU9fSU5UX0lOVF9TVEFUKTsKKwlhdWRpbnRfbWFzayA9IGN4X3JlYWQoQVVESU9fSU5UX0lOVF9NU0spOwogCXRzMV9zdGF0dXMgPSBjeF9yZWFkKFZJRF9CX0lOVF9TVEFUKTsKIAl0czFfbWFzayA9IGN4X3JlYWQoVklEX0JfSU5UX01TSyk7CiAJdHMyX3N0YXR1cyA9IGN4X3JlYWQoVklEX0NfSU5UX1NUQVQpOwpAQCAtMTc1OSwxMiArMTgxOCwxNSBAQAogCQlnb3RvIG91dDsKIAogCXZpZGFfY291bnQgPSBjeF9yZWFkKFZJRF9BX0dQQ05UKTsKKwlhdWRpbnRfY291bnQgPSBjeF9yZWFkKEFVRF9JTlRfQV9HUENOVCk7CiAJdHMxX2NvdW50ID0gY3hfcmVhZCh0czEtPnJlZ19ncGNudCk7CiAJdHMyX2NvdW50ID0gY3hfcmVhZCh0czItPnJlZ19ncGNudCk7CiAJZHByaW50ayg3LCAicGNpX3N0YXR1czogMHglMDh4ICBwY2lfbWFzazogMHglMDh4XG4iLAogCQlwY2lfc3RhdHVzLCBwY2lfbWFzayk7CiAJZHByaW50ayg3LCAidmlkYV9zdGF0dXM6IDB4JTA4eCB2aWRhX21hc2s6IDB4JTA4eCBjb3VudDogMHgleFxuIiwKIAkJdmlkYV9zdGF0dXMsIHZpZGFfbWFzaywgdmlkYV9jb3VudCk7CisJZHByaW50ayg3LCAiYXVkaW50X3N0YXR1czogMHglMDh4IGF1ZGludF9tYXNrOiAweCUwOHggY291bnQ6IDB4JXhcbiIsCisJCWF1ZGludF9zdGF0dXMsIGF1ZGludF9tYXNrLCBhdWRpbnRfY291bnQpOwogCWRwcmludGsoNywgInRzMV9zdGF0dXM6IDB4JTA4eCAgdHMxX21hc2s6IDB4JTA4eCBjb3VudDogMHgleFxuIiwKIAkJdHMxX3N0YXR1cywgdHMxX21hc2ssIHRzMV9jb3VudCk7CiAJZHByaW50ayg3LCAidHMyX3N0YXR1czogMHglMDh4ICB0czJfbWFzazogMHglMDh4IGNvdW50OiAweCV4XG4iLApAQCAtMTg2MSw2ICsxOTIzLDkgQEAKIAlpZiAodmlkYV9zdGF0dXMpCiAJCWhhbmRsZWQgKz0gY3gyMzg4NV92aWRlb19pcnEoZGV2LCB2aWRhX3N0YXR1cyk7CiAKKwlpZiAoYXVkaW50X3N0YXR1cykKKwkJaGFuZGxlZCArPSBjeDIzODg1X2F1ZGlvX2lycShkZXYsIGF1ZGludF9zdGF0dXMsIGF1ZGludF9tYXNrKTsKKwogCWlmIChwY2lfc3RhdHVzICYgUENJX01TS19JUikgewogCQlzdWJkZXZfaGFuZGxlZCA9IGZhbHNlOwogCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGNvcmUsIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCmluZGV4IGFhODNmMDcuLmJjYjQ1YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCkBAIC04NDQsNyArODQ0LDcgQEAKIAkJCXN0YXRpYyBzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsID0gewogCQkJCS5mbmFtZSAgID0gWEMzMDI4TF9ERUZBVUxUX0ZJUk1XQVJFLAogCQkJCS5tYXhfbGVuID0gNjQsCi0JCQkJLmRlbW9kICAgPSA1MDAwLAorCQkJCS5kZW1vZCAgID0gWEMzMDI4X0ZFX0RJQkNPTTUyLAogCQkJCS8qIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGRlbW9kcyB3aXRoCiAJCQkJCXYzNiBmaXJtd2FyZT8gKi8KIAkJCQkudHlwZSAgICA9IFhDMjAyOF9EMjYzMywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKaW5kZXggMzA3ZmY1NC4uMGZmN2E5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaTJjLmMKQEAgLTI4Nyw2ICsyODcsNyBAQAogCVsweDMyID4+IDFdID0gImN4MjQyMjciLAogCVsweDg4ID4+IDFdID0gImN4MjU4MzciLAogCVsweDg0ID4+IDFdID0gInRkYTgyOTUiLAorCVsweDk4ID4+IDFdID0gImZsYXRpcm9uIiwKIAlbMHhhMCA+PiAxXSA9ICJlZXByb20iLAogCVsweGMwID4+IDFdID0gInR1bmVyL210MjEzMS90ZGE4Mjc1IiwKIAlbMHhjMiA+PiAxXSA9ICJ0dW5lci9tdDIxMzEvdGRhODI3NS94YzUwMDAveGMzMDI4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKaW5kZXggYzg3YWM2OC4uYTk5OTM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtcmVnLmgKQEAgLTIwMyw2ICsyMDMsNyBAQAogI2RlZmluZSBTRDJfQklBU19DVFJMCTB4MDAwMDAwMEEKICNkZWZpbmUgQU1QX0JJQVNfQ1RSTAkweDAwMDAwMDBDCiAjZGVmaW5lIENIX1BXUl9DVFJMMQkweDAwMDAwMDBFCisjZGVmaW5lIEZMRF9DSF9TRUwgICAgICAoMSA8PCAzKQogI2RlZmluZSBDSF9QV1JfQ1RSTDIJMHgwMDAwMDAwRgogI2RlZmluZSBEU01fU1RBVFVTMQkweDAwMDAwMDEwCiAjZGVmaW5lIERTTV9TVEFUVVMyCTB4MDAwMDAwMTEKQEAgLTI3MSw3ICsyNzIsOSBAQAogI2RlZmluZSBWSURfQkNfTVNLX09QQ19FUlIgKDEgPDwgMTYpCiAjZGVmaW5lIFZJRF9CQ19NU0tfU1lOQyAgICAoMSA8PCAxMikKICNkZWZpbmUgVklEX0JDX01TS19PRiAgICAgICgxIDw8ICA4KQorI2RlZmluZSBWSURfQkNfTVNLX1ZCSV9SSVNDSTIgKDEgPDwgIDUpCiAjZGVmaW5lIFZJRF9CQ19NU0tfUklTQ0kyICAoMSA8PCAgNCkKKyNkZWZpbmUgVklEX0JDX01TS19WQklfUklTQ0kxICgxIDw8ICAxKQogI2RlZmluZSBWSURfQkNfTVNLX1JJU0NJMSAgIDEKIAogI2RlZmluZSBWSURfQ19JTlRfTVNLCTB4MDAwNDAwNDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKaW5kZXggYzBiNjAzOC4uYTExNTRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmJpLmMKQEAgLTQxLDYgKzQxLDEyIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisjZGVmaW5lIFZCSV9MSU5FX0xFTkdUSCAxNDQwCisjZGVmaW5lIE5UU0NfVkJJX1NUQVJUX0xJTkUgMTAgICAgICAgIC8qIGxpbmUgMTAgLSAyMSAqLworI2RlZmluZSBOVFNDX1ZCSV9FTkRfTElORSAgIDIxCisjZGVmaW5lIE5UU0NfVkJJX0xJTkVTICAgICAgKE5UU0NfVkJJX0VORF9MSU5FIC0gTlRTQ19WQklfU1RBUlRfTElORSArIDEpCisKKwogaW50IGN4MjM4ODVfdmJpX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CkBAIC00OSw0MyArNTUsODYgQEAKIAogCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REXzUyNV82MCkgewogCQkvKiBudHNjICovCi0JCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDI4NjM2MzYzOworCQlmLT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSBWQklfTElORV9MRU5HVEg7CisJCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDI3MDAwMDAwOworCQlmLT5mbXQudmJpLnNhbXBsZV9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfR1JFWTsKKwkJZi0+Zm10LnZiaS5vZmZzZXQgPSAwOworCQlmLT5mbXQudmJpLmZsYWdzID0gMDsKIAkJZi0+Zm10LnZiaS5zdGFydFswXSA9IDEwOwotCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMjczOwotCisJCWYtPmZtdC52YmkuY291bnRbMF0gPSAxNzsKKwkJZi0+Zm10LnZiaS5zdGFydFsxXSA9IDI2MyArIDEwICsgMTsKKwkJZi0+Zm10LnZiaS5jb3VudFsxXSA9IDE3OwogCX0gZWxzZSBpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF82MjVfNTApIHsKIAkJLyogcGFsICovCiAJCWYtPmZtdC52Ymkuc2FtcGxpbmdfcmF0ZSA9IDM1NDY4OTUwOwogCQlmLT5mbXQudmJpLnN0YXJ0WzBdID0gNyAtIDE7CiAJCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSAzMTkgLSAxOwogCX0KKwogCXJldHVybiAwOwogfQogCisvKiBXZSdyZSBnaXZlbiB0aGUgVmlkZW8gSW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4KKyAqIFRoZSBjeDIzODg1X3ZpZGVvX2lycSgpIGZ1bmMgaGFzIGFscmVhZHkgdmFsaWRhdGVkCisgKiB0aGUgcG90ZW50aWFsIGVycm9yIGJpdHMsIHdlIGp1c3QgbmVlZCB0bworICogZGVhbCB3aXRoIHZiaSBwYXlsb2FkIGFuZCByZXR1cm4gaW5kaWNhdGlvbiBpZgorICogd2UgYWN0dWFsbHkgcHJvY2Vzc2VkIGFueSBwYXlsb2FkLgorICovCitpbnQgY3gyMzg4NV92YmlfaXJxKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1MzIgc3RhdHVzKQoreworCXUzMiBjb3VudDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoc3RhdHVzICYgVklEX0JDX01TS19WQklfUklTQ0kxKSB7CisJCWRwcmludGsoMSwgIiVzKCkgVklEX0JDX01TS19WQklfUklTQ0kxXG4iLCBfX2Z1bmNfXyk7CisJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CisJCWNvdW50ID0gY3hfcmVhZChWSURfQV9HUENOVCk7CisJCWN4MjM4ODVfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+dmJpcSwgY291bnQpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisKKwlpZiAoc3RhdHVzICYgVklEX0JDX01TS19WQklfUklTQ0kyKSB7CisJCWRwcmludGsoMSwgIiVzKCkgVklEX0JDX01TS19WQklfUklTQ0kyXG4iLCBfX2Z1bmNfXyk7CisJCWRwcmludGsoMiwgInN0b3BwZXIgdmJpXG4iKTsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShkZXYsICZkZXYtPnZiaXEpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKwogc3RhdGljIGludCBjeDIzODg1X3N0YXJ0X3ZiaV9kbWEoc3RydWN0IGN4MjM4ODVfZGV2ICAgICpkZXYsCiAJCQkgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsCiAJCQkgc3RydWN0IGN4MjM4ODVfYnVmZmVyICAgKmJ1ZikKIHsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKIAkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCiAJY3gyMzg4NV9zcmFtX2NoYW5uZWxfc2V0dXAoZGV2LCAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl0sCiAJCQkJYnVmLT52Yi53aWR0aCwgYnVmLT5yaXNjLmRtYSk7CiAKIAkvKiByZXNldCBjb3VudGVyICovCisJY3hfd3JpdGUoVklEX0FfR1BDTlRfQ1RMLCAzKTsKKwljeF93cml0ZShWSURfQV9WQklfQ1RSTCwgMyk7CisJY3hfd3JpdGUoVkJJX0FfR1BDTlRfQ1RMLCAzKTsKIAlxLT5jb3VudCA9IDE7CiAKLQkvKiBlbmFibGUgaXJxcyAqLworCS8qIGVuYWJsZSBpcnEgKi8KIAljeDIzODg1X2lycV9hZGRfZW5hYmxlKGRldiwgMHgwMSk7CiAJY3hfc2V0KFZJRF9BX0lOVF9NU0ssIDB4MDAwMDIyKTsKIAogCS8qIHN0YXJ0IGRtYSAqLwogCWN4X3NldChERVZfQ05UUkwyLCAoMTw8NSkpOwotCWN4X3NldChWSURfQV9ETUFfQ1RMLCAweDAwMDAwMDIyKTsKKwljeF9zZXQoVklEX0FfRE1BX0NUTCwgMHgyMik7IC8qIEZJRk8gYW5kIFJJU0MgZW5hYmxlICovCiAKIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW50IGN4MjM4ODVfcmVzdGFydF92YmlfcXVldWUoc3RydWN0IGN4MjM4ODVfZGV2ICAgICpkZXYsCitpbnQgY3gyMzg4NV9yZXN0YXJ0X3ZiaV9xdWV1ZShzdHJ1Y3QgY3gyMzg4NV9kZXYgICAgKmRldiwKIAkJCSAgICAgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEpCiB7CiAJc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWY7CkBAIC0xMDIsNyArMTUxLDcgQEAKIAkJYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyMzg4NV9idWZmZXIsIHZiLnF1ZXVlKTsKIAkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CiAJfQotCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgKEJVRkZFUl9USU1FT1VUIC8gMzApKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzLDggKzE2Miw3IEBACiAJc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWN4MjM4ODVfc3JhbV9jaGFubmVsX2R1bXAoZGV2LCAmZGV2LT5zcmFtX2NoYW5uZWxzW1NSQU1fQ0gwMl0pOwotCisJLyogU3RvcCB0aGUgVkJJIGVuZ2luZSAqLwogCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MjIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKQEAgLTEzMiw3ICsxODAsNyBAQAogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgVkJJX0xJTkVfTEVOR1RIIDIwNDgKKyNkZWZpbmUgVkJJX0xJTkVfTEVOR1RIIDE0NDAKICNkZWZpbmUgVkJJX0xJTkVfQ09VTlQgMTcKIAogc3RhdGljIGludApAQCAtMTczLDcgKzIyMSw3IEBACiAJCXJjID0gdmlkZW9idWZfaW9sb2NrKHEsICZidWYtPnZiLCBOVUxMKTsKIAkJaWYgKDAgIT0gcmMpCiAJCQlnb3RvIGZhaWw7Ci0JCWN4MjM4ODVfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCWN4MjM4ODVfcmlzY192YmlidWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCiAJCQkJIGRtYS0+c2dsaXN0LAogCQkJCSAwLCBidWYtPnZiLndpZHRoICogYnVmLT52Yi5oZWlnaHQsCiAJCQkJIGJ1Zi0+dmIud2lkdGgsIDAsCkBAIC0yMDcsNyArMjU1LDcgQEAKIAkJY3gyMzg4NV9zdGFydF92YmlfZG1hKGRldiwgcSwgYnVmKTsKIAkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKIAkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7Ci0JCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIChCVUZGRVJfVElNRU9VVCAvIDMwKSk7CiAJCWRwcmludGsoMiwgIlslcC8lZF0gdmJpX3F1ZXVlIC0gZmlyc3QgYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwppbmRleCA4OTZiYjMyLi5lNzMwYjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJjeDIzODg1LWlvY3RsLmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9jeDI1ODQwLmg+CisKIE1PRFVMRV9ERVNDUklQVElPTigidjRsMiBkcml2ZXIgbW9kdWxlIGZvciBjeDIzODg1IGJhc2VkIFRWIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC02OSwxNCArNzEsMTQgQEAKIAogI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLilcCiAJZG8geyBpZiAodmlkZW9fZGVidWcgPj0gbGV2ZWwpXAotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMvMDogIiBmbXQsIGRldi0+bmFtZSwgIyMgYXJnKTtcCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIGRldi0+bmFtZSwgIyMgYXJnKTtcCiAJfSB3aGlsZSAoMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc3RhdGljIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAjZGVmaW5lIEZPUk1BVF9GTEFHU19QQUNLRUQgICAgICAgMHgwMQotCisjaWYgMAogc3RhdGljIHN0cnVjdCBjeDIzODg1X2ZtdCBmb3JtYXRzW10gPSB7CiAJewogCQkubmFtZSAgICAgPSAiOCBicHAsIGdyYXkiLApAQCAtMTMwLDYgKzEzMiwyMyBAQAogCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAogCX0sCiB9OworI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgY3gyMzg4NV9mbXQgZm9ybWF0c1tdID0geworCXsKKyNpZiAwCisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1VZVlksCisJCS5kZXB0aCAgICA9IDE2LAorCQkuZmxhZ3MgICAgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0sIHsKKyNlbmRpZgorCQkubmFtZSAgICAgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5mb3VyY2MgICA9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkuZGVwdGggICAgPSAxNiwKKwkJLmZsYWdzICAgID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9Cit9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3gyMzg4NV9mbXQgKmZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKIHsKQEAgLTEzOSw3ICsxNTgsMTIgQEAKIAkJaWYgKGZvcm1hdHNbaV0uZm91cmNjID09IGZvdXJjYykKIAkJCXJldHVybiBmb3JtYXRzK2k7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzKDB4JTA4eCkgTk9UIEZPVU5EXG4iLCBfX2Z1bmNfXywgZm91cmNjKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzKCVjJWMlYyVjKSBOT1QgRk9VTkRcbiIsIF9fZnVuY19fLAorCQkoZm91cmNjICYgMHhmZiksCisJCSgoZm91cmNjID4+IDgpICYgMHhmZiksCisJCSgoZm91cmNjID4+IDE2KSAmIDB4ZmYpLAorCQkoKGZvdXJjYyA+PiAyNCkgJiAweGZmKQorCQkpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNzEsNyArMTk1LDcgQEAKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCiAJCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCiAJCQkubWluaW11bSAgICAgICA9IDAsCi0JCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCQkubWF4aW11bSAgICAgICA9IDB4N2YsCiAJCQkuc3RlcCAgICAgICAgICA9IDEsCiAJCQkuZGVmYXVsdF92YWx1ZSA9IDB4M2YsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCkBAIC0xODQsMTAgKzIwOCwxMCBAQAogCQkudiA9IHsKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAogCQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJCS5taW5pbXVtICAgICAgID0gMCwKLQkJCS5tYXhpbXVtICAgICAgID0gMHhmZiwKKwkJCS5taW5pbXVtICAgICAgID0gLTEyNywKKwkJCS5tYXhpbXVtICAgICAgID0gMTI4LAogCQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDdmLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAsCiAJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCX0sCiAJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAxMjgsCkBAIC0yMDIsOSArMjI2LDkgQEAKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKIAkJCS5uYW1lICAgICAgICAgID0gIlNhdHVyYXRpb24iLAogCQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkJLm1heGltdW0gICAgICAgPSAweGZmLAorCQkJLm1heGltdW0gICAgICAgPSAweDdmLAogCQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDdmLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDNmLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQl9LAogCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMCwKQEAgLTI1OCw4ICsyODIsOCBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyB2b2lkIGN4MjM4ODVfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAotCQkgc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKK3ZvaWQgY3gyMzg4NV92aWRlb193YWtldXAoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCkKIHsKIAlzdHJ1Y3QgY3gyMzg4NV9idWZmZXIgKmJ1ZjsKIAlpbnQgYmM7CkBAIC0zOTMsNiArNDE3LDcxIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogfQogCitzdGF0aWMgaW50IGN4MjM4ODVfZmxhdGlyb25fd3JpdGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHU4IHJlZywgdTggZGF0YSkKK3sKKwkvKiA4IGJpdCByZWdpc3RlcnMsIDggYml0IHZhbHVlcyAqLworCXU4IGJ1ZltdID0geyByZWcsIGRhdGEgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDk4ID4+IDEsCisJCS5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSAyIH07CisKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19idXNbMl0uaTJjX2FkYXAsICZtc2csIDEpOworfQorCitzdGF0aWMgdTggY3gyMzg4NV9mbGF0aXJvbl9yZWFkKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1OCByZWcpCit7CisJLyogOCBiaXQgcmVnaXN0ZXJzLCA4IGJpdCB2YWx1ZXMgKi8KKwlpbnQgcmV0OworCXU4IGIwW10gPSB7IHJlZyB9OworCXU4IGIxW10gPSB7IDAgfTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7IC5hZGRyID0gMHg5OCA+PiAxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSAweDk4ID4+IDEsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0KKwl9OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19idXNbMl0uaTJjX2FkYXAsICZtc2dbMF0sIDIpOworCWlmIChyZXQgIT0gMikKKwkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyB2b2lkIGN4MjM4ODVfZmxhdGlyb25fZHVtcChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKwlkcHJpbnRrKDEsICJGbGF0aXJvbiBkdW1wXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyNDsgaSsrKSB7CisJCWRwcmludGsoMSwgIkZJWyUwMnhdID0gJTAyeFxuIiwgaSwKKwkJCWN4MjM4ODVfZmxhdGlyb25fcmVhZChkZXYsIGkpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3gyMzg4NV9mbGF0aXJvbl9tdXgoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIGludCBpbnB1dCkKK3sKKwl1OCB2YWw7CisJZHByaW50aygxLCAiJXMoaW5wdXQgPSAlZClcbiIsIF9fZnVuY19fLCBpbnB1dCk7CisKKwlpZiAoaW5wdXQgPT0gMSkKKwkJdmFsID0gY3gyMzg4NV9mbGF0aXJvbl9yZWFkKGRldiwgQ0hfUFdSX0NUUkwxKSAmIH5GTERfQ0hfU0VMOworCWVsc2UgaWYgKGlucHV0ID09IDIpCisJCXZhbCA9IGN4MjM4ODVfZmxhdGlyb25fcmVhZChkZXYsIENIX1BXUl9DVFJMMSkgfCBGTERfQ0hfU0VMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgfD0gMHgyMDsgLyogRW5hYmxlIGNsb2NrIHRvIGRlbHRhLXNpZ21hIGFuZCBkZWMgZmlsdGVyICovCisKKwljeDIzODg1X2ZsYXRpcm9uX3dyaXRlKGRldiwgQ0hfUFdSX0NUUkwxLCB2YWwpOworCisJLyogV2FrZSB1cCAqLworCWN4MjM4ODVfZmxhdGlyb25fd3JpdGUoZGV2LCBDSF9QV1JfQ1RSTDIsIDApOworCisJaWYgKHZpZGVvX2RlYnVnKQorCQljeDIzODg1X2ZsYXRpcm9uX2R1bXAoZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGN4MjM4ODVfdmlkZW9fbXV4KHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCiB7CiAJZHByaW50aygxLCAiJXMoKSB2aWRlb19tdXg6ICVkIFt2bXV4PSVkLCBncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLApAQCAtNDEzLDI3ICs1MDIsNTkgQEAKIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfY3gyNTg0MCwgdmlkZW8sIHNfcm91dGluZywKIAkJCUlOUFVUKGlucHV0KS0+dm11eCwgMCwgMCk7CiAKKwlpZiAoKGRldi0+Ym9hcmQgPT0gQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTgwMCkgfHwKKwkJKGRldi0+Ym9hcmQgPT0gQ1gyMzg4NV9CT0FSRF9NUFg4ODUpKSB7CisJCS8qIENvbmZpZ3VyZSBhdWRpbyByb3V0aW5nICovCisJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9jeDI1ODQwLCBhdWRpbywgc19yb3V0aW5nLAorCQkJSU5QVVQoaW5wdXQpLT5hbXV4LCAwLCAwKTsKKworCQlpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU83KQorCQkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAxKTsKKwkJZWxzZSBpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU82KQorCQkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeDIzODg1X2F1ZGlvX211eChzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCWRwcmludGsoMSwgIiVzKGlucHV0PSVkKVxuIiwgX19mdW5jX18sIGlucHV0KTsKKworCS8qIFRoZSBiYXNlYmFuZCB2aWRlbyBjb3JlIG9mIHRoZSBjeDIzODg1IGhhcyB0d28gYXVkaW8gaW5wdXRzLgorCSAqIExSMSBhbmQgTFIyLiBJbiBhbG1vc3QgZXZlcnkgc2luZ2xlIGNhc2Ugc28gZmFyIG9ubHkgSFZSMXh4eAorCSAqIGNhcmRzIHdlJ3ZlIG9ubHkgZXZlciBzdXBwb3J0ZWQgTFIxLiBUaW1lIHRvIHN1cHBvcnQgTFIyLAorCSAqIHdoaWNoIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG9wdGlvbmFsIHdoaXRlIGJyZWFrb3V0IGhlYWRlciBvbgorCSAqIHRoZSBib2FyZC4KKwkgKiBXZSdsbCB1c2UgYSBjb3VsZCBvZiBleGlzdGluZyBlbnVtcyBpbiB0aGUgY2FyZCBzdHJ1Y3QgdG8gYWxsb3cKKwkgKiBkZXZzIHRvIHNwZWNpZnkgd2hpY2ggYmFzZWJhbmQgaW5wdXQgdGhleSBuZWVkLCBvciBqdXN0IGRlZmF1bHQKKwkgKiB0byB3aGF0IHdlJ3ZlIGFsd2F5cyB1c2VkLgorCSAqLworCWlmIChJTlBVVChpbnB1dCktPmFtdXggPT0gQ1gyNTg0MF9BVURJTzcpCisJCWN4MjM4ODVfZmxhdGlyb25fbXV4KGRldiwgMSk7CisJZWxzZSBpZiAoSU5QVVQoaW5wdXQpLT5hbXV4ID09IENYMjU4NDBfQVVESU82KQorCQljeDIzODg1X2ZsYXRpcm9uX211eChkZXYsIDIpOworCWVsc2UgeworCQkvKiBOb3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQsIGFzc3VtZSB0aGUgZGVmYXVsdC4gKi8KKwkJY3gyMzg4NV9mbGF0aXJvbl9tdXgoZGV2LCAxKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IGN4MjM4ODVfc2V0X3NjYWxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgd2lkdGgsCi0JdW5zaWduZWQgaW50IGhlaWdodCwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQotewotCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjeDIzODg1X3N0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwKIAkJCSAgIHN0cnVjdCBjeDIzODg1X2RtYXF1ZXVlICpxLAogCQkJICAgc3RydWN0IGN4MjM4ODVfYnVmZmVyICpidWYpCiB7CiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyogU3RvcCB0aGUgZG1hL2ZpZm8gYmVmb3JlIHdlIHRhbXBlciB3aXRoIGl0J3MgcmlzYyBwcm9ncmFtcyAqLworCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MTEpOworCiAJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLwogCWN4MjM4ODVfc3JhbV9jaGFubmVsX3NldHVwKGRldiwgJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdLAogCQkJCWJ1Zi0+YnBsLCBidWYtPnJpc2MuZG1hKTsKLQljeDIzODg1X3NldF9zY2FsZShkZXYsIGJ1Zi0+dmIud2lkdGgsIGJ1Zi0+dmIuaGVpZ2h0LCBidWYtPnZiLmZpZWxkKTsKIAogCS8qIHJlc2V0IGNvdW50ZXIgKi8KIAljeF93cml0ZShWSURfQV9HUENOVF9DVEwsIDMpOwpAQCAtNzQ4LDcgKzg2OSw3IEBACiAJZmgtPnR5cGUgICAgID0gdHlwZTsKIAlmaC0+d2lkdGggICAgPSAzMjA7CiAJZmgtPmhlaWdodCAgID0gMjQwOwotCWZoLT5mbXQgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoVjRMMl9QSVhfRk1UX0JHUjI0KTsKKwlmaC0+Zm10ICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKFY0TDJfUElYX0ZNVF9ZVVlWKTsKIAogCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyMzg4NV92aWRlb19xb3BzLAogCQkJICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKQEAgLTc1Nyw2ICs4NzgsMTQgQEAKIAkJCSAgICBzaXplb2Yoc3RydWN0IGN4MjM4ODVfYnVmZmVyKSwKIAkJCSAgICBmaCwgTlVMTCk7CiAKKwl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmJpcSwgJmN4MjM4ODVfdmJpX3FvcHMsCisJCSZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKKwkJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKKwkJVjRMMl9GSUVMRF9TRVFfVEIsCisJCXNpemVvZihzdHJ1Y3QgY3gyMzg4NV9idWZmZXIpLAorCQlmaCwgTlVMTCk7CisKKwogCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKIAogCXJldHVybiAwOwpAQCAtODg0LDggKzEwMTMsOSBAQAogc3RhdGljIGludCBjeDIzODg1X3NldF9jb250cm9sKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2LAogCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKLQlkcHJpbnRrKDEsICIlcygpIGNhbGxpbmcgY3gyNTg0MChWSURJT0NfU19DVFJMKSIKLQkJIiAoZGlzYWJsZWQgLSBubyBhY3Rpb24pXG4iLCBfX2Z1bmNfXyk7CisJZHByaW50aygxLCAiJXMoKSBjYWxsaW5nIGN4MjU4NDAoVklESU9DX1NfQ1RSTClcbiIsIF9fZnVuY19fKTsKKwljYWxsX2FsbChkZXYsIGNvcmUsIHNfY3RybCwgY3RsKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDU5LDEzICsxMTg5LDIyIEBACiAJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQorCWlmICgoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSAmJgorCQkoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodW5saWtlbHkoIXJlc19nZXQoZGV2LCBmaCwgZ2V0X3Jlc291cmNlKGZoKSkpKQogCQlyZXR1cm4gLUVCVVNZOworCisJLyogRG9uJ3Qgc3RhcnQgVkJJIHN0cmVhbWluZyB1bmxlc3MgdmlkYSBzdHJlYW1pbmcKKwkgKiBoYXMgYWxyZWFkeSBzdGFydGVkLgorCSAqLworCWlmICgoZmgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkgJiYKKwkJKChjeF9yZWFkKFZJRF9BX0RNQV9DVEwpICYgMHgxMSkgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOwogfQogCkBAIC0xMDc2LDcgKzEyMTUsOCBAQAogCWludCBlcnIsIHJlczsKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmICgoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSAmJgorCQkoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChpICE9IGZoLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMTksNyArMTI1OSw3IEBACiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJbiA9IGktPmluZGV4OwotCWlmIChuID49IDQpCisJaWYgKG4gPj0gTUFYX0NYMjM4ODVfSU5QVVQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKDAgPT0gSU5QVVQobiktPnR5cGUpCkBAIC0xMTMzLDYgKzEyNzMsMTEgQEAKIAkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKIAkJaS0+c3RkID0gQ1gyMzg4NV9OT1JNUzsKIAl9CisKKwkvKiBUd28gc2VsZWN0YWJsZSBhdWRpbyBpbnB1dHMgZm9yIG5vbi10diBpbnB1dHMgKi8KKwlpZiAoSU5QVVQobiktPnR5cGUgIT0gQ1gyMzg4NV9WTVVYX1RFTEVWSVNJT04pCisJCWktPmF1ZGlvc2V0ID0gMHgzOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNTksMTMgKzEzMDQsMjAgQEAKIAogCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGkpOwogCi0JaWYgKGkgPj0gNCkgeworCWlmIChpID49IE1BWF9DWDIzODg1X0lOUFVUKSB7CiAJCWRwcmludGsoMSwgIiVzKCkgLUVJTlZBTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoSU5QVVQoaSktPnR5cGUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWN4MjM4ODVfdmlkZW9fbXV4KGRldiwgaSk7CisKKwkvKiBCeSBkZWZhdWx0IGVzdGFibGlzaCB0aGUgZGVmYXVsdCBhdWRpbyBpbnB1dCBmb3IgdGhlIGNhcmQgYWxzbyAqLworCS8qIENhbGxlciBpcyBmcmVlIHRvIHVzZSBWSURJT0NfU19BVURJTyB0byBvdmVycmlkZSBhZnRlcndhcmRzICovCisJY3gyMzg4NV9hdWRpb19tdXgoZGV2LCBpKTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTg1LDYgKzEzMzcsNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjeDIzODg1X3F1ZXJ5X2F1ZGlucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCXN0cnVjdCB2NGwyX2F1ZGlvICppKQoreworCXN0cnVjdCBjeDIzODg1X2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyMzg4NV9maCAqKXByaXYpLT5kZXY7CisJc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7CisJCVswXSA9ICJCYXNlYmFuZCBML1IgMSIsCisJCVsxXSA9ICJCYXNlYmFuZCBML1IgMiIsCisJfTsKKwl1bnNpZ25lZCBpbnQgbjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwluID0gaS0+aW5kZXg7CisJaWYgKG4gPj0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisJaS0+aW5kZXggPSBuOworCXN0cmNweShpLT5uYW1lLCBpbmFtZVtuXSk7CisJaS0+Y2FwYWJpbGl0eSAgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJaS0+bW9kZSAgPSBWNEwyX0FVRE1PREVfQVZMOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fYXVkaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmkpCit7CisJcmV0dXJuIGN4MjM4ODVfcXVlcnlfYXVkaW5wdXQoZmlsZSwgcHJpdiwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJc3RydWN0IHY0bDJfYXVkaW8gKmkpCit7CisJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDIzODg1X2ZoICopcHJpdiktPmRldjsKKworCWktPmluZGV4ID0gZGV2LT5hdWRpbnB1dDsKKwlkcHJpbnRrKDEsICIlcyhpbnB1dD0lZClcbiIsIF9fZnVuY19fLCBpLT5pbmRleCk7CisKKwlyZXR1cm4gY3gyMzg4NV9xdWVyeV9hdWRpbnB1dChmaWxlLCBwcml2LCBpKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9hdWRpbyAqaSkKK3sKKwlzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjM4ODVfZmggKilwcml2KS0+ZGV2OworCWlmIChpLT5pbmRleCA+PSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGktPmluZGV4KTsKKworCWRldi0+YXVkaW5wdXQgPSBpLT5pbmRleDsKKworCS8qIFNraXAgdGhlIGF1ZGlvIGRlZmF1bHRzIGZyb20gdGhlIGNhcmRzIHN0cnVjdCwgY2FsbGVyIHdhbnRzCisJICogZGlyZWN0bHkgdG91Y2ggdGhlIGF1ZGlvIG11eCBoYXJkd2FyZS4gKi8KKwljeDIzODg1X2ZsYXRpcm9uX211eChkZXYsIGRldi0+YXVkaW5wdXQgKyAxKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCiB7CkBAIC0xMjIxLDEwICsxNDMxLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzdHJjcHkodC0+bmFtZSwgIlRlbGV2aXNpb24iKTsKLQl0LT50eXBlICAgICAgID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX05PUk07Ci0JdC0+cmFuZ2VoaWdoICA9IDB4ZmZmZmZmZmZVTDsKLQl0LT5zaWduYWwgPSAweGZmZmYgOyAvKiBMT0NLRUQgKi8KKworCWNhbGxfYWxsKGRldiwgdHVuZXIsIGdfdHVuZXIsIHQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjM3LDYgKzE0NDUsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoMCAhPSB0LT5pbmRleCkKIAkJcmV0dXJuIC1FSU5WQUw7CisJLyogVXBkYXRlIHRoZSBBL1YgY29yZSAqLworCWNhbGxfYWxsKGRldiwgdHVuZXIsIHNfdHVuZXIsIHQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMDIsMTAgKzE1MTMsNiBAQAogCXN0cnVjdCBjeDIzODg1X2J1ZmZlciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljeDIzODg1X3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdKTsKLQotCWN4X2NsZWFyKFZJRF9BX0RNQV9DVEwsIDB4MTEpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKIAkJYnVmID0gbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwKQEAgLTEzMTMsNyArMTUyMCw3IEBACiAJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKIAkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOwogCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCQlwcmludGsoS0VSTl9FUlIgIiVzLzA6IFslcC8lZF0gdGltZW91dCAtIGRtYT0weCUwOGx4XG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBbJXAvJWRdIHRpbWVvdXQgLSBkbWE9MHglMDhseFxuIiwKIAkJCWRldi0+bmFtZSwgYnVmLCBidWYtPnZiLmksCiAJCQkodW5zaWduZWQgbG9uZylidWYtPnJpc2MuZG1hKTsKIAl9CkBAIC0xMzI5LDI3ICsxNTM2LDQzIEBACiAJbWFzayAgID0gY3hfcmVhZChWSURfQV9JTlRfTVNLKTsKIAlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCiAJCXJldHVybiBoYW5kbGVkOworCiAJY3hfd3JpdGUoVklEX0FfSU5UX1NUQVQsIHN0YXR1cyk7CiAKLQlkcHJpbnRrKDIsICIlcygpIHN0YXR1cyA9IDB4JTA4eFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JLyogcmlzYyBvcCBjb2RlIGVycm9yICovCi0JaWYgKHN0YXR1cyAmICgxIDw8IDE2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCi0JCQlkZXYtPm5hbWUpOwotCQljeF9jbGVhcihWSURfQV9ETUFfQ1RMLCAweDExKTsKLQkJY3gyMzg4NV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsICZkZXYtPnNyYW1fY2hhbm5lbHNbU1JBTV9DSDAxXSk7CisJLyogcmlzYyBvcCBjb2RlIGVycm9yLCBmaWZvIG92ZXJmbG93IG9yIGxpbmUgc3luYyBkZXRlY3Rpb24gZXJyb3IgKi8KKwlpZiAoKHN0YXR1cyAmIFZJRF9CQ19NU0tfT1BDX0VSUikgfHwKKwkJKHN0YXR1cyAmIFZJRF9CQ19NU0tfU1lOQykgfHwKKwkJKHN0YXR1cyAmIFZJRF9CQ19NU0tfT0YpKSB7CisKKwkJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfT1BDX0VSUikgeworCQkJZHByaW50ayg3LCAiIChWSURfQkNfTVNLX09QQ19FUlIgMHglMDh4KVxuIiwKKwkJCQlWSURfQkNfTVNLX09QQ19FUlIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHZpZGVvIHJpc2Mgb3AgY29kZSBlcnJvclxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJY3gyMzg4NV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsCisJCQkJJmRldi0+c3JhbV9jaGFubmVsc1tTUkFNX0NIMDFdKTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBWSURfQkNfTVNLX1NZTkMpCisJCQlkcHJpbnRrKDcsICIgKFZJRF9CQ19NU0tfU1lOQyAweCUwOHgpICIKKwkJCQkidmlkZW8gbGluZXMgbWlzcy1tYXRjaFxuIiwKKwkJCQlWSURfQkNfTVNLX1NZTkMpOworCisJCWlmIChzdGF0dXMgJiBWSURfQkNfTVNLX09GKQorCQkJZHByaW50ayg3LCAiIChWSURfQkNfTVNLX09GIDB4JTA4eCkgZmlmbyBvdmVyZmxvd1xuIiwKKwkJCQlWSURfQkNfTVNLX09GKTsKKwogCX0KIAotCS8qIHJpc2MxIHkgKi8KLQlpZiAoc3RhdHVzICYgMHgwMSkgeworCS8qIFZpZGVvICovCisJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfUklTQ0kxKSB7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CiAJCWNvdW50ID0gY3hfcmVhZChWSURfQV9HUENOVCk7CiAJCWN4MjM4ODVfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+dmlkcSwgY291bnQpOwogCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAJCWhhbmRsZWQrKzsKIAl9Ci0JLyogcmlzYzIgeSAqLwotCWlmIChzdGF0dXMgJiAweDEwKSB7CisJaWYgKHN0YXR1cyAmIFZJRF9CQ19NU0tfUklTQ0kyKSB7CiAJCWRwcmludGsoMiwgInN0b3BwZXIgdmlkZW9cbiIpOwogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwogCQljeDIzODg1X3Jlc3RhcnRfdmlkZW9fcXVldWUoZGV2LCAmZGV2LT52aWRxKTsKQEAgLTEzNTcsNiArMTU4MCw5IEBACiAJCWhhbmRsZWQrKzsKIAl9CiAKKwkvKiBBbGxvdyB0aGUgVkJJIGZyYW1ld29yayB0byBwcm9jZXNzIGl0J3MgcGF5bG9hZCAqLworCWhhbmRsZWQgKz0gY3gyMzg4NV92YmlfaXJxKGRldiwgc3RhdHVzKTsKKwogCXJldHVybiBoYW5kbGVkOwogfQogCkBAIC0xNDA1LDYgKzE2MzEsOSBAQAogCS52aWRpb2NfZ19yZWdpc3RlciAgICA9IGN4MjM4ODVfZ19yZWdpc3RlciwKIAkudmlkaW9jX3NfcmVnaXN0ZXIgICAgPSBjeDIzODg1X3NfcmVnaXN0ZXIsCiAjZW5kaWYKKwkudmlkaW9jX2VudW1hdWRpbyAgICAgPSB2aWRpb2NfZW51bV9hdWRpbnB1dCwKKwkudmlkaW9jX2dfYXVkaW8gICAgICAgPSB2aWRpb2NfZ19hdWRpbnB1dCwKKwkudmlkaW9jX3NfYXVkaW8gICAgICAgPSB2aWRpb2Nfc19hdWRpbnB1dCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjM4ODVfdmJpX3RlbXBsYXRlOwpAQCAtMTQyOSw2ICsxNjU4LDE0IEBACiAJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCWN4MjM4ODVfaXJxX3JlbW92ZShkZXYsIDB4MDEpOwogCisJaWYgKGRldi0+dmJpX2RldikgeworCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnZiaV9kZXYpKQorCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52YmlfZGV2KTsKKwkJZGV2LT52YmlfZGV2ID0gTlVMTDsKKwkJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksICZkZXYtPnZiaXEuc3RvcHBlcik7CisJfQogCWlmIChkZXYtPnZpZGVvX2RldikgewogCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnZpZGVvX2RldikpCiAJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZpZGVvX2Rldik7CkBAIC0xNDM4LDYgKzE2NzUsOSBAQAogCiAJCWJ0Y3hfcmlzY21lbV9mcmVlKGRldi0+cGNpLCAmZGV2LT52aWRxLnN0b3BwZXIpOwogCX0KKworCWlmIChkZXYtPmF1ZGlvX2RldikKKwkJY3gyMzg4NV9hdWRpb191bnJlZ2lzdGVyKGRldik7CiB9CiAKIGludCBjeDIzODg1X3ZpZGVvX3JlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQpAQCAtMTQ2Myw3ICsxNzAzLDE0IEBACiAJY3gyMzg4NV9yaXNjX3N0b3BwZXIoZGV2LT5wY2ksICZkZXYtPnZpZHEuc3RvcHBlciwKIAkJVklEX0FfRE1BX0NUTCwgMHgxMSwgMHgwMCk7CiAKLQkvKiBEb24ndCBlbmFibGUgVkJJIHlldCAqLworCS8qIGluaXQgdmJpIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52YmlxLmFjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJpcS5xdWV1ZWQpOworCWRldi0+dmJpcS50aW1lb3V0LmZ1bmN0aW9uID0gY3gyMzg4NV92YmlfdGltZW91dDsKKwlkZXYtPnZiaXEudGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWluaXRfdGltZXIoJmRldi0+dmJpcS50aW1lb3V0KTsKKwljeDIzODg1X3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwgJmRldi0+dmJpcS5zdG9wcGVyLAorCQlWSURfQV9ETUFfQ1RMLCAweDIyLCAweDAwKTsKIAogCWN4MjM4ODVfaXJxX2FkZF9lbmFibGUoZGV2LCAweDAxKTsKIApAQCAtMTUwNCw4ICsxNzUxLDcgQEAKIAkJfQogCX0KIAotCi0JLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KKwkvKiByZWdpc3RlciBWaWRlbyBkZXZpY2UgKi8KIAlkZXYtPnZpZGVvX2RldiA9IGN4MjM4ODVfdmRldl9pbml0KGRldiwgZGV2LT5wY2ksCiAJCSZjeDIzODg1X3ZpZGVvX3RlbXBsYXRlLCAidmlkZW8iKTsKIAllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52aWRlb19kZXYsIFZGTF9UWVBFX0dSQUJCRVIsCkBAIC0xNTE1LDEzICsxNzYxLDMxIEBACiAJCQlkZXYtPm5hbWUpOwogCQlnb3RvIGZhaWxfdW5yZWc7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIiVzLzA6IHJlZ2lzdGVyZWQgZGV2aWNlICVzIFt2NGwyXVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXMgW3Y0bDJdXG4iLAogCSAgICAgICBkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUoZGV2LT52aWRlb19kZXYpKTsKKworCS8qIHJlZ2lzdGVyIFZCSSBkZXZpY2UgKi8KKwlkZXYtPnZiaV9kZXYgPSBjeDIzODg1X3ZkZXZfaW5pdChkZXYsIGRldi0+cGNpLAorCQkmY3gyMzg4NV92YmlfdGVtcGxhdGUsICJ2YmkiKTsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT52YmlfZGV2LCBWRkxfVFlQRV9WQkksCisJCQkJICAgIHZiaV9ucltkZXYtPm5yXSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHZiaSBkZXZpY2VcbiIsCisJCQlkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxfdW5yZWc7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+dmJpX2RldikpOworCisJLyogUmVnaXN0ZXIgQUxTQSBhdWRpbyBkZXZpY2UgKi8KKwlkZXYtPmF1ZGlvX2RldiA9IGN4MjM4ODVfYXVkaW9fcmVnaXN0ZXIoZGV2KTsKKwogCS8qIGluaXRpYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCWN4MjM4ODVfc2V0X3R2bm9ybShkZXYsIGRldi0+dHZub3JtKTsKIAlpbml0X2NvbnRyb2xzKGRldik7CiAJY3gyMzg4NV92aWRlb19tdXgoZGV2LCAwKTsKKwljeDIzODg1X2F1ZGlvX211eChkZXYsIDApOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggZDg2YmMwYi4uYjQ5MDM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCkBAIC04Niw2ICs4Niw3IEBACiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfR09UVklFV19YNV8zRF9IWUJSSUQgICAgIDI5CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJfVF9DX0NJX1JGIDMwCiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMCAzMQorI2RlZmluZSBDWDIzODg1X0JPQVJEX01QWDg4NSAgICAgICAgICAgICAgICAgICAzMgogCiAjZGVmaW5lIEdQSU9fMCAweDAwMDAwMDAxCiAjZGVmaW5lIEdQSU9fMSAweDAwMDAwMDAyCkBAIC0xOTIsNiArMTkzLDcgQEAKIHN0cnVjdCBjeDIzODg1X2lucHV0IHsKIAllbnVtIGN4MjM4ODVfaXR5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgICAgdm11eDsKKwl1bnNpZ25lZCBpbnQgICAgYW11eDsKIAl1MzIgICAgICAgICAgICAgZ3BpbzAsIGdwaW8xLCBncGlvMiwgZ3BpbzM7CiB9OwogCkBAIC0zMTgsNiArMzIwLDM0IEBACiAJc3RydWN0IHJjX2RldgkJKnJjOwogfTsKIAorc3RydWN0IGN4MjM4ODVfYXVkaW9fYnVmZmVyIHsKKwl1bnNpZ25lZCBpbnQJCWJwbDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtCXJpc2M7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZglkbWE7Cit9OworCitzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgeworCXN0cnVjdCBjeDIzODg1X2RldgkqZGV2OworCisJc3RydWN0IHBjaV9kZXYJCSpwY2k7CisKKwlzdHJ1Y3Qgc25kX2NhcmQJCSpjYXJkOworCisJc3BpbmxvY2tfdAkJbG9jazsKKworCWF0b21pY190CQljb3VudDsKKworCXVuc2lnbmVkIGludAkJZG1hX3NpemU7CisJdW5zaWduZWQgaW50CQlwZXJpb2Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCW51bV9wZXJpb2RzOworCisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZgkqZG1hX3Jpc2M7CisKKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19idWZmZXIgICAqYnVmOworCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Cit9OworCiBzdHJ1Y3QgY3gyMzg4NV9kZXYgewogCWF0b21pY190ICAgICAgICAgICAgICAgICAgIHJlZmNvdW50OwogCXN0cnVjdCB2NGwyX2RldmljZSAJICAgdjRsMl9kZXY7CkBAIC0zNjIsNiArMzkyLDcgQEAKIAkvKiBBbmFsb2cgdmlkZW8gKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXM7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgaW5wdXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYXVkaW5wdXQ7IC8qIFNlbGVjdGFibGUgYXVkaW8gaW5wdXQgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICB0dmF1ZGlvOwogCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgIHR2bm9ybTsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOwpAQCAtNDAwLDYgKzQzMSw5IEBACiAJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgdjRsX3JlYWRlcl9jb3VudDsKIAlzdHJ1Y3QgY3gyMzg4NV90dm5vcm0gICAgICBlbmNvZGVybm9ybTsKIAorCS8qIEFuYWxvZyByYXcgYXVkaW8gKi8KKwlzdHJ1Y3QgY3gyMzg4NV9hdWRpb19kZXYgICAqYXVkaW9fZGV2OworCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjeDIzODg1X2RldiAqdG9fY3gyMzg4NShzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQpAQCAtNDc4LDYgKzUxMiwxMSBAQAogCXVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYm90dG9tX29mZnNldCwKIAl1bnNpZ25lZCBpbnQgYnBsLCB1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKTsKIAorZXh0ZXJuIGludCBjeDIzODg1X3Jpc2NfdmJpYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJdW5zaWduZWQgaW50IHRvcF9vZmZzZXQsIHVuc2lnbmVkIGludCBib3R0b21fb2Zmc2V0LAorCXVuc2lnbmVkIGludCBicGwsIHVuc2lnbmVkIGludCBwYWRkaW5nLCB1bnNpZ25lZCBpbnQgbGluZXMpOworCiB2b2lkIGN4MjM4ODVfY2FuY2VsX2J1ZmZlcnMoc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0KTsKIAogZXh0ZXJuIGludCBjeDIzODg1X3Jlc3RhcnRfcXVldWUoc3RydWN0IGN4MjM4ODVfdHNwb3J0ICpwb3J0LApAQCAtNTMzLDYgKzU3Miw4IEBACiBleHRlcm4gaW50IGN4MjM4ODVfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgY3gyMzg4NV92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKIGV4dGVybiBpbnQgY3gyMzg4NV92aWRlb19pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMpOworZXh0ZXJuIHZvaWQgY3gyMzg4NV92aWRlb193YWtldXAoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEsIHUzMiBjb3VudCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjeDIzODg1LXZiaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQwLDYgKzU4MSw5IEBACiAJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIGV4dGVybiB2b2lkIGN4MjM4ODVfdmJpX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKIGV4dGVybiBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjM4ODVfdmJpX3FvcHM7CitleHRlcm4gaW50IGN4MjM4ODVfcmVzdGFydF92YmlfcXVldWUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsCisJc3RydWN0IGN4MjM4ODVfZG1hcXVldWUgKnEpOworZXh0ZXJuIGludCBjeDIzODg1X3ZiaV9pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMpOwogCiAvKiBjeDIzODg1LWkyYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIGV4dGVybiBpbnQgY3gyMzg4NV9pMmNfcmVnaXN0ZXIoc3RydWN0IGN4MjM4ODVfaTJjICpidXMpOwpAQCAtNTYzLDYgKzYwNywxOCBAQAogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19jbGVhcihzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldiwgdTMyIG1hc2spOwogZXh0ZXJuIHZvaWQgbWM0MTdfZ3Bpb19lbmFibGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBtYXNrLCBpbnQgYXNvdXRwdXQpOwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY3gyMzg4NS1hbHNhLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIHN0cnVjdCBjeDIzODg1X2F1ZGlvX2RldiAqY3gyMzg4NV9hdWRpb19yZWdpc3RlcigKKwkJCQkJc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgY3gyMzg4NV9hdWRpb191bnJlZ2lzdGVyKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KTsKK2V4dGVybiBpbnQgY3gyMzg4NV9hdWRpb19pcnEoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYsIHUzMiBzdGF0dXMsIHUzMiBtYXNrKTsKK2V4dGVybiBpbnQgY3gyMzg4NV9yaXNjX2RhdGFidWZmZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJCSAgIHVuc2lnbmVkIGludCBicGwsCisJCQkJICAgdW5zaWduZWQgaW50IGxpbmVzLAorCQkJCSAgIHVuc2lnbmVkIGludCBscGkpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdHYgbm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4OC1pci5jCmluZGV4IGUzN2JlNmYuLmJiMWNlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg4LWlyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODgtaXIuYwpAQCAtNjczLDcgKzY3Myw3IEBACiAKIAl1bnNpZ25lZCBpbnQgaSwgbjsKIAl1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjICpwOwotCXVuc2lnbmVkIHUsIHY7CisJdW5zaWduZWQgdSwgdiwgdzsKIAogCW4gPSBjb3VudCAvIHNpemVvZih1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjKQogCQkqIHNpemVvZih1bmlvbiBjeDIzODg4X2lyX2ZpZm9fcmVjKTsKQEAgLTY5MiwxMSArNjkyLDEyIEBACiAJCWlmICgocC0+aHdfZmlmb19kYXRhICYgRklGT19SWFRYX1JUTykgPT0gRklGT19SWFRYX1JUTykgewogCQkJLyogQXNzdW1lIFJUTyB3YXMgYmVjYXVzZSBvZiBubyBJUiBsaWdodCBpbnB1dCAqLwogCQkJdSA9IDA7Ci0JCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKKwkJCXcgPSAxOwogCQl9IGVsc2UgewogCQkJdSA9IChwLT5od19maWZvX2RhdGEgJiBGSUZPX1JYVFhfTFZMKSA/IDEgOiAwOwogCQkJaWYgKGludmVydCkKIAkJCQl1ID0gdSA/IDAgOiAxOworCQkJdyA9IDA7CiAJCX0KIAogCQl2ID0gKHVuc2lnbmVkKSBwdWxzZV93aWR0aF9jb3VudF90b19ucygKQEAgLTcwNyw5ICs3MDgsMTIgQEAKIAkJaW5pdF9pcl9yYXdfZXZlbnQoJnAtPmlyX2NvcmVfZGF0YSk7CiAJCXAtPmlyX2NvcmVfZGF0YS5wdWxzZSA9IHU7CiAJCXAtPmlyX2NvcmVfZGF0YS5kdXJhdGlvbiA9IHY7CisJCXAtPmlyX2NvcmVfZGF0YS50aW1lb3V0ID0gdzsKIAotCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogJTEwdSBucyAgJXNcbiIsCi0JCQkgdiwgdSA/ICJtYXJrIiA6ICJzcGFjZSIpOworCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogJTEwdSBucyAgJXMgICVzXG4iLAorCQkJIHYsIHUgPyAibWFyayIgOiAic3BhY2UiLCB3ID8gIih0aW1lZCBvdXQpIiA6ICIiKTsKKwkJaWYgKHcpCisJCQl2NGwyX2RiZygyLCBpcl84ODhfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9LY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hbHNhLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1hdWRpby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWJpZmZ1bmNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtYmlmZnVuY3MuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtY2FyZHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLWNvcmUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtZ3Bpby5jCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtaTJjLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLW1lZHVzYS1kZWZpbmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLWRlZmluZXMuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXJlZy5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtcmVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uYwpyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1tZWR1c2EtdmlkZW8uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtbWVkdXNhLXZpZGVvLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS1yZWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1yZWcuaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtcmVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXNyYW0uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtc3JhbS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaApyZW5hbWUgdG8gZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2OTA3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKQEAgLTAsMCArMSwyMDEyIEBACisvKgorICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgorICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KKyAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCisgKiAgUGFydHMgYWRhcHRlZC90YWtlbiBmcm9tIEVkdWFyZG8gTW9zY29zbyBSdWJpbm8KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgRWR1YXJkbyBNb3Njb3NvIFJ1YmlubyA8bW9zY29zb0BUb3BvTG9naWNhLmNvbT4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSAiY3gyNTgyMS12aWRlby5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyNTgyMSBiYXNlZCBUViBjYXJkcyIpOworTU9EVUxFX0FVVEhPUigiSGllcCBIdXluaCA8aGllcC5odXluaEBjb25leGFudC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKENYMjU4MjFfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9fbnJbXSA9IHtbMCAuLi4gKENYMjU4MjFfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHZpZGVvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KHJhZGlvX25yLCBpbnQsIE5VTEwsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAidmlkZW8gZGV2aWNlIG51bWJlcnMiKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsICJyYWRpbyBkZXZpY2UgbnVtYmVycyIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX2RlYnVnID0gVklERU9fREVCVUc7Cittb2R1bGVfcGFyYW0odmlkZW9fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFt2aWRlb10iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfZGVidWc7Cittb2R1bGVfcGFyYW0oaXJxX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSUSBoYW5kbGVyXSIpOworCit1bnNpZ25lZCBpbnQgdmlkX2xpbWl0ID0gMTY7Cittb2R1bGVfcGFyYW0odmlkX2xpbWl0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsICJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKKworc3RhdGljIHZvaWQgY3gyNTgyMV9pbml0X2NvbnRyb2xzKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wczsKKworI2RlZmluZSBGT1JNQVRfRkxBR1NfUEFDS0VEICAgICAgIDB4MDEKKworc3RydWN0IGN4MjU4MjFfZm10IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjggYnBwLCBncmF5IiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9HUkVZLAorCQkuZGVwdGggPSA4LAorCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCSB9LCB7CisJCS5uYW1lID0gIjQ6MToxLCBwYWNrZWQsIFk0MVAiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1k0MVAsCisJCS5kZXB0aCA9IDEyLAorCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAorCX0sIHsKKwkJLm5hbWUgPSAiNDoyOjIsIHBhY2tlZCwgWVVZViIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLmRlcHRoID0gMTYsCisJCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSwgeworCQkubmFtZSA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9VWVZZLAorCQkuZGVwdGggPSAxNiwKKwkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKKwl9LCB7CisJCS5uYW1lID0gIjQ6MjowLCBZVVYiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVVjQyMCwKKwkJLmRlcHRoID0gMTIsCisJCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCisJfSwKK307CisKK2ludCBjeDI1ODIxX2dldF9mb3JtYXRfc2l6ZSh2b2lkKQoreworCXJldHVybiBBUlJBWV9TSVpFKGZvcm1hdHMpOworfQorCitzdHJ1Y3QgY3gyNTgyMV9mbXQgKmN4MjU4MjFfZm9ybWF0X2J5X2ZvdXJjYyh1bnNpZ25lZCBpbnQgZm91cmNjKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWTQxUCB8fCBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQxMVApCisJCXJldHVybiBmb3JtYXRzICsgMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyBpKyspCisJCWlmIChmb3JtYXRzW2ldLmZvdXJjYyA9PSBmb3VyY2MpCisJCQlyZXR1cm4gZm9ybWF0cyArIGk7CisKKwlwcl9lcnIoIiVzKDB4JTA4eCkgTk9UIEZPVU5EXG4iLCBfX2Z1bmNfXywgZm91cmNjKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBjeDI1ODIxX2R1bXBfdmlkZW9fcXVldWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5hY3RpdmUpCisJCSAgICBidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmcS0+cXVldWVkKSkgeworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5xdWV1ZWQpCisJCSAgICBidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCX0KKworfQorCit2b2lkIGN4MjU4MjFfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKKwkJCSAgdTMyIGNvdW50KQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOworCWludCBiYzsKKworCWZvciAoYmMgPSAwOzsgYmMrKykgeworCQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQkJZHByaW50aygxLCAiYmM9JWQgKD0wOiBhY3RpdmUgZW1wdHkpXG4iLCBiYyk7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZiA9CisJCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKKworCQkvKiBjb3VudCBjb21lcyBmcm9tIHRoZSBodyBhbmQgaXQgaXMgMTZiaXQgd2lkZSAtLQorCQkgKiB0aGlzIHRyaWNrIGhhbmRsZXMgd3JhcC1hcm91bmRzIGNvcnJlY3RseSBmb3IKKwkJICogdXAgdG8gMzI3NjcgYnVmZmVycyBpbiBmbGlnaHQuLi4gKi8KKwkJaWYgKChzMTYpIChjb3VudCAtIGJ1Zi0+Y291bnQpIDwgMCkKKwkJCWJyZWFrOworCisJCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOworCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpCisJCWRlbF90aW1lcigmcS0+dGltZW91dCk7CisJZWxzZQorCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJaWYgKGJjICE9IDEpCisJCXByX2VycigiJXM6ICVkIGJ1ZmZlcnMgaGFuZGxlZCAoc2hvdWxkIGJlIDEpXG4iLCBfX2Z1bmNfXywgYmMpOworfQorCisjaWZkZWYgVFVORVJfRkxBRworaW50IGN4MjU4MjFfc2V0X3R2bm9ybShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgdjRsMl9zdGRfaWQgbm9ybSkKK3sKKwlkcHJpbnRrKDEsICIlcyhub3JtID0gMHglMDh4KSBuYW1lOiBbJXNdXG4iLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludClub3JtLCB2NGwyX25vcm1fdG9fbmFtZShub3JtKSk7CisKKwlkZXYtPnR2bm9ybSA9IG5vcm07CisKKwkvKiBUZWxsIHRoZSBpbnRlcm5hbCBBL1YgZGVjb2RlciAqLworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBzX3N0ZCwgbm9ybSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICpjeDI1ODIxX3ZkZXZfaW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgICAgc3RydWN0IHZpZGVvX2RldmljZSAqdGVtcGxhdGUsCisJCQkJICAgICAgIGNoYXIgKnR5cGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChOVUxMID09IHZmZCkKKwkJcmV0dXJuIE5VTEw7CisJKnZmZCA9ICp0ZW1wbGF0ZTsKKwl2ZmQtPnY0bDJfZGV2ID0gJmRldi0+djRsMl9kZXY7CisJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzICVzICglcykiLCBkZXYtPm5hbWUsIHR5cGUsCisJCSBjeDI1ODIxX2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7CisJcmV0dXJuIHZmZDsKK30KKworLyoKK3N0YXRpYyBpbnQgY3gyNTgyMV9jdHJsX3F1ZXJ5KHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJaW50IGk7CisKKwlpZiAocWN0cmwtPmlkIDwgVjRMMl9DSURfQkFTRSB8fCBxY3RybC0+aWQgPj0gVjRMMl9DSURfTEFTVFAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgQ1gyNTgyMV9DVExTOyBpKyspCisJCWlmIChjeDI1ODIxX2N0bHNbaV0udi5pZCA9PSBxY3RybC0+aWQpCisJCQlicmVhazsKKwlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKKwkJKnFjdHJsID0gbm9fY3RsOworCQlyZXR1cm4gMDsKKwl9CisJKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldLnY7CisJcmV0dXJuIDA7Cit9CisqLworCisvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICovCitpbnQgY3gyNTgyMV9yZXNfZ2V0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsCisJCSAgICB1bnNpZ25lZCBpbnQgYml0KQoreworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAoZmgtPnJlc291cmNlcyAmIGJpdCkKKwkJLyogaGF2ZSBpdCBhbHJlYWR5IGFsbG9jYXRlZCAqLworCQlyZXR1cm4gMTsKKworCS8qIGlzIGl0IGZyZWU/ICovCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlpZiAoZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICYgYml0KSB7CisJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCXJldHVybiAwOworCX0KKwkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KKwlmaC0+cmVzb3VyY2VzIHw9IGJpdDsKKwlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgfD0gYml0OworCWRwcmludGsoMSwgInJlczogZ2V0ICVkXG4iLCBiaXQpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworaW50IGN4MjU4MjFfcmVzX2NoZWNrKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKK3sKKwlyZXR1cm4gZmgtPnJlc291cmNlcyAmIGJpdDsKK30KKworaW50IGN4MjU4MjFfcmVzX2xvY2tlZChzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCit7CisJcmV0dXJuIGZoLT5kZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJiBiaXQ7Cit9CisKK3ZvaWQgY3gyNTgyMV9yZXNfZnJlZShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZmggKmZoLAorCQkgICAgICB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlCVUdfT04oKGZoLT5yZXNvdXJjZXMgJiBiaXRzKSAhPSBiaXRzKTsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCWZoLT5yZXNvdXJjZXMgJj0gfmJpdHM7CisJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICY9IH5iaXRzOworCWRwcmludGsoMSwgInJlczogcHV0ICVkXG4iLCBiaXRzKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGVvX211eChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJbWVtc2V0KCZyb3V0ZSwgMCwgc2l6ZW9mKHJvdXRlKSk7CisKKwlkcHJpbnRrKDEsICIlcygpOiB2aWRlb19tdXg6ICVkIFt2bXV4PSVkLCBncGlvPTB4JXgsMHgleCwweCV4LDB4JXhdXG4iLAorCQlfX2Z1bmNfXywgaW5wdXQsIElOUFVUKGlucHV0KS0+dm11eCwgSU5QVVQoaW5wdXQpLT5ncGlvMCwKKwkJSU5QVVQoaW5wdXQpLT5ncGlvMSwgSU5QVVQoaW5wdXQpLT5ncGlvMiwgSU5QVVQoaW5wdXQpLT5ncGlvMyk7CisJZGV2LT5pbnB1dCA9IGlucHV0OworCisJcm91dGUuaW5wdXQgPSBJTlBVVChpbnB1dCktPnZtdXg7CisKKwkvKiBUZWxsIHRoZSBpbnRlcm5hbCBBL1YgZGVjb2RlciAqLworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19yb3V0aW5nLCBJTlBVVChpbnB1dCktPnZtdXgsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKKwkJCSAgICBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiwKKwkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsKQoreworCWludCB0bXAgPSAwOworCisJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLworCWN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwKGRldiwgY2hhbm5lbCwgYnVmLT5icGwsIGJ1Zi0+cmlzYy5kbWEpOworCisJLyogcmVzZXQgY291bnRlciAqLworCWN4X3dyaXRlKGNoYW5uZWwtPmdwY250X2N0bCwgMyk7CisJcS0+Y291bnQgPSAxOworCisJLyogZW5hYmxlIGlycSAqLworCWN4X3NldChQQ0lfSU5UX01TSywgY3hfcmVhZChQQ0lfSU5UX01TSykgfCAoMSA8PCBjaGFubmVsLT5pKSk7CisJY3hfc2V0KGNoYW5uZWwtPmludF9tc2ssIDB4MTEpOworCisJLyogc3RhcnQgZG1hICovCisJY3hfd3JpdGUoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7CS8qIEZJRk8gYW5kIFJJU0MgZW5hYmxlICovCisKKwkvKiBtYWtlIHN1cmUgdXBzdHJlYW0gc2V0dGluZyBpZiBhbnkgaXMgcmV2ZXJzZWQgKi8KKwl0bXAgPSBjeF9yZWFkKFZJRF9DSF9NT0RFX1NFTCk7CisJY3hfd3JpdGUoVklEX0NIX01PREVfU0VMLCB0bXAgJiAweEZGRkZGRTAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxLAorCQkJCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYsICpwcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJYnVmID0KKwkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOworCisJCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLCBjaGFubmVsKTsKKworCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZxLT5hY3RpdmUpIHsKKwkJCWJ1ZiA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJfQorCisJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldiA9IE5VTEw7CisJZm9yICg7OykgeworCQlpZiAobGlzdF9lbXB0eSgmcS0+cXVldWVkKSkKKwkJCXJldHVybiAwOworCisJCWJ1ZiA9CisJCSAgICBsaXN0X2VudHJ5KHEtPnF1ZXVlZC5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKKworCQlpZiAoTlVMTCA9PSBwcmV2KSB7CisJCQlsaXN0X21vdmVfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwgY2hhbm5lbCk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJCX0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aCAmJgorCQkJICAgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0ICYmCisJCQkgICBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKKwkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CisJCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7CisJCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAvKiBCaXRzIDYzIC0gMzIgKi8KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJCXByZXYgPSBidWY7CisJfQorfQorCit2b2lkIGN4MjU4MjFfdmlkX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjeDI1ODIxX2RhdGEgKnRpbWVvdXRfZGF0YSA9IChzdHJ1Y3QgY3gyNTgyMV9kYXRhICopZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IHRpbWVvdXRfZGF0YS0+ZGV2OworCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSB0aW1lb3V0X2RhdGEtPmNoYW5uZWw7CisJc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgY2hhbm5lbCk7ICovCisJY3hfY2xlYXIoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlidWYgPQorCQkgICAgbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7CisJCWxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRVJST1I7CisJCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7CisJfQorCisJY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKGRldiwgcSwgY2hhbm5lbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworfQorCitpbnQgY3gyNTgyMV92aWRlb19pcnEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSwgdTMyIHN0YXR1cykKK3sKKwl1MzIgY291bnQgPSAwOworCWludCBoYW5kbGVkID0gMDsKKwl1MzIgbWFzazsKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gZGV2LT5jaGFubmVsc1tjaGFuX251bV0uc3JhbV9jaGFubmVsczsKKworCW1hc2sgPSBjeF9yZWFkKGNoYW5uZWwtPmludF9tc2spOworCWlmICgwID09IChzdGF0dXMgJiBtYXNrKSkKKwkJcmV0dXJuIGhhbmRsZWQ7CisKKwljeF93cml0ZShjaGFubmVsLT5pbnRfc3RhdCwgc3RhdHVzKTsKKworCS8qIHJpc2Mgb3AgY29kZSBlcnJvciAqLworCWlmIChzdGF0dXMgJiAoMSA8PCAxNikpIHsKKwkJcHJfd2FybigiJXMsICVzOiB2aWRlbyByaXNjIG9wIGNvZGUgZXJyb3JcbiIsCisJCQlkZXYtPm5hbWUsIGNoYW5uZWwtPm5hbWUpOworCQljeF9jbGVhcihjaGFubmVsLT5kbWFfY3RsLCAweDExKTsKKwkJY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsIGNoYW5uZWwpOworCX0KKworCS8qIHJpc2MxIHkgKi8KKwlpZiAoc3RhdHVzICYgRkxEX1ZJRF9EU1RfUklTQzEpIHsKKwkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKKwkJY291bnQgPSBjeF9yZWFkKGNoYW5uZWwtPmdwY250KTsKKwkJY3gyNTgyMV92aWRlb193YWtldXAoZGV2LCAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLAorCQkJCWNvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOworCQloYW5kbGVkKys7CisJfQorCisJLyogcmlzYzIgeSAqLworCWlmIChzdGF0dXMgJiAweDEwKSB7CisJCWRwcmludGsoMiwgInN0b3BwZXIgdmlkZW9cbiIpOworCQlzcGluX2xvY2soJmRldi0+c2xvY2spOworCQljeDI1ODIxX3Jlc3RhcnRfdmlkZW9fcXVldWUoZGV2LAorCQkJCSZkZXYtPmNoYW5uZWxzW2NoYW5uZWwtPmldLnZpZHEsIGNoYW5uZWwpOworCQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisJCWhhbmRsZWQrKzsKKwl9CisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3ZvaWQgY3gyNTgyMV92aWRlb2lvY3RsX3VucmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+aW9jdGxfZGV2KSB7CisJCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+aW9jdGxfZGV2KSkKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW9jdGxfZGV2KTsKKwkJZWxzZQorCQkJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT5pb2N0bF9kZXYpOworCisJCWRldi0+aW9jdGxfZGV2ID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgY3gyNTgyMV92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0pCit7CisJY3hfY2xlYXIoUENJX0lOVF9NU0ssIDEpOworCisJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldikgeworCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpKQorCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoCisJCQkJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2Rldik7CisJCWVsc2UKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKAorCQkJCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOworCisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldiA9IE5VTEw7CisKKwkJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksCisJCQkJJmRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZHEuc3RvcHBlcik7CisKKwkJcHJfd2FybigiZGV2aWNlICVkIHJlbGVhc2VkIVxuIiwgY2hhbl9udW0pOworCX0KKworfQorCitpbnQgY3gyNTgyMV92aWRlb19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKK3sKKwlpbnQgZXJyOworCWludCBpOworCisJc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX2RldmljZSA9IHsKKwkJLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCisJCS5mb3BzID0gJnZpZGVvX2ZvcHMsCisJCS5taW5vciA9IC0xLAorCQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKKwkJLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAorCQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAorCX07CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTSAtIDE7ICsraSkgeworCQljeDI1ODIxX2luaXRfY29udHJvbHMoZGV2LCBpKTsKKworCQljeDI1ODIxX3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwgJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5zdG9wcGVyLAorCQkJCWRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+ZG1hX2N0bCwKKwkJCQkweDExLCAwKTsKKworCQlkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMgPSAmY3gyNTgyMV9zcmFtX2NoYW5uZWxzW2ldOworCQlkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IE5VTEw7CisJCWRldi0+Y2hhbm5lbHNbaV0ucmVzb3VyY2VzID0gMDsKKworCQljeF93cml0ZShkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmludF9zdGF0LCAweGZmZmZmZmZmKTsKKworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFubmVsc1tpXS52aWRxLmFjdGl2ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEucXVldWVkKTsKKworCQlkZXYtPmNoYW5uZWxzW2ldLnRpbWVvdXRfZGF0YS5kZXYgPSBkZXY7CisJCWRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhLmNoYW5uZWwgPQorCQkJJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tpXTsKKwkJZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZnVuY3Rpb24gPQorCQkJY3gyNTgyMV92aWRfdGltZW91dDsKKwkJZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZGF0YSA9CisJCQkodW5zaWduZWQgbG9uZykmZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGE7CisJCWluaXRfdGltZXIoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0KTsKKworCQkvKiByZWdpc3RlciB2NGwgZGV2aWNlcyAqLworCQlkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IGN4MjU4MjFfdmRldl9pbml0KGRldiwKKwkJCQlkZXYtPnBjaSwgJmN4MjU4MjFfdmlkZW9fZGV2aWNlLCAidmlkZW8iKTsKKworCQllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYsCisJCQkJVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnJbZGV2LT5ucl0pOworCisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsX3VucmVnOworCisJfQorCisJLyogc2V0IFBDSSBpbnRlcnJ1cHQgKi8KKwljeF9zZXQoUENJX0lOVF9NU0ssIDB4ZmYpOworCisJLyogaW5pdGlhbCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisjaWZkZWYgVFVORVJfRkxBRworCWRldi0+dHZub3JtID0gY3gyNTgyMV92aWRlb19kZXZpY2UuY3VycmVudF9ub3JtOworCWN4MjU4MjFfc2V0X3R2bm9ybShkZXYsIGRldi0+dHZub3JtKTsKKyNlbmRpZgorCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5yZWc6CisJY3gyNTgyMV92aWRlb191bnJlZ2lzdGVyKGRldiwgaSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGN4MjU4MjFfYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwKKwkJIHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBxLT5wcml2X2RhdGE7CisKKwkqc2l6ZSA9IGZoLT5mbXQtPmRlcHRoICogZmgtPndpZHRoICogZmgtPmhlaWdodCA+PiAzOworCisJaWYgKDAgPT0gKmNvdW50KQorCQkqY291bnQgPSAzMjsKKworCWlmICgqc2l6ZSAqICpjb3VudCA+IHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KQorCQkqY291bnQgPSAodmlkX2xpbWl0ICogMTAyNCAqIDEwMjQpIC8gKnNpemU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQorCSAgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOworCWludCByYywgaW5pdF9idWZmZXIgPSAwOworCXUzMiBsaW5lMF9vZmZzZXQsIGxpbmUxX29mZnNldDsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOworCWludCBicGxfbG9jYWwgPSBMSU5FX1NJWkVfRDE7CisJaW50IGNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7CisKKwlCVUdfT04oTlVMTCA9PSBmaC0+Zm10KTsKKwlpZiAoZmgtPndpZHRoIDwgNDggfHwgZmgtPndpZHRoID4gNzIwIHx8CisJICAgIGZoLT5oZWlnaHQgPCAzMiB8fCBmaC0+aGVpZ2h0ID4gNTc2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1Zi0+dmIuc2l6ZSA9IChmaC0+d2lkdGggKiBmaC0+aGVpZ2h0ICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisKKwlpZiAoMCAhPSBidWYtPnZiLmJhZGRyICYmIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1Zi0+Zm10ICE9IGZoLT5mbXQgfHwKKwkgICAgYnVmLT52Yi53aWR0aCAhPSBmaC0+d2lkdGggfHwKKwkgICAgYnVmLT52Yi5oZWlnaHQgIT0gZmgtPmhlaWdodCB8fCBidWYtPnZiLmZpZWxkICE9IGZpZWxkKSB7CisJCWJ1Zi0+Zm10ID0gZmgtPmZtdDsKKwkJYnVmLT52Yi53aWR0aCA9IGZoLT53aWR0aDsKKwkJYnVmLT52Yi5oZWlnaHQgPSBmaC0+aGVpZ2h0OworCQlidWYtPnZiLmZpZWxkID0gZmllbGQ7CisJCWluaXRfYnVmZmVyID0gMTsKKwl9CisKKwlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSBidWYtPnZiLnN0YXRlKSB7CisJCWluaXRfYnVmZmVyID0gMTsKKwkJcmMgPSB2aWRlb2J1Zl9pb2xvY2socSwgJmJ1Zi0+dmIsIE5VTEwpOworCQlpZiAoMCAhPSByYykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KCJ2aWRlb2J1Zl9pb2xvY2sgZmFpbGVkIVxuIikpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJZHByaW50aygxLCAiaW5pdF9idWZmZXI9JWRcbiIsIGluaXRfYnVmZmVyKTsKKworCWlmIChpbml0X2J1ZmZlcikgeworCisJCWNoYW5uZWxfb3BlbmVkID0gZGV2LT5jaGFubmVsX29wZW5lZDsKKwkJaWYgKGNoYW5uZWxfb3BlbmVkIDwgMCB8fCBjaGFubmVsX29wZW5lZCA+IDcpCisJCQljaGFubmVsX29wZW5lZCA9IDc7CisKKwkJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLnBpeGVsX2Zvcm1hdHMgPT0KKwkJCQlQSVhFTF9GUk1UXzQxMSkKKwkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCAqIGJ1Zi0+dmIud2lkdGgpID4+IDM7CisJCWVsc2UKKwkJCWJ1Zi0+YnBsID0gKGJ1Zi0+Zm10LT5kZXB0aCA+PiAzKSAqIChidWYtPnZiLndpZHRoKTsKKworCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0ucGl4ZWxfZm9ybWF0cyA9PQorCQkJCVBJWEVMX0ZSTVRfNDExKSB7CisJCQlicGxfbG9jYWwgPSBidWYtPmJwbDsKKwkJfSBlbHNlIHsKKwkJCWJwbF9sb2NhbCA9IGJ1Zi0+YnBsOyAgIC8qIERlZmF1bHQgKi8KKworCQkJaWYgKGNoYW5uZWxfb3BlbmVkID49IDAgJiYgY2hhbm5lbF9vcGVuZWQgPD0gNykgeworCQkJCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5uZWxfb3BlbmVkXQorCQkJCQkJLnVzZV9jaWZfcmVzb2x1dGlvbikgeworCQkJCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKKwkJCQkJICAgIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQkJCQkJYnBsX2xvY2FsID0gMzUyIDw8IDE7CisJCQkJCWVsc2UKKwkJCQkJCWJwbF9sb2NhbCA9CisJCQkJCQkgZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0uCisJCQkJCQkgY2lmX3dpZHRoIDw8CisJCQkJCQkgMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlzd2l0Y2ggKGJ1Zi0+dmIuZmllbGQpIHsKKwkJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSAgICBkbWEtPnNnbGlzdCwgMCwgVU5TRVQsCisJCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9CT1RUT006CisJCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAorCQkJCQkgICAgZG1hLT5zZ2xpc3QsIFVOU0VULCAwLAorCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKKwkJCS8qIEFsbCBvdGhlciBmb3JtYXRzIGFyZSB0b3AgZmllbGQgZmlyc3QgKi8KKwkJCWxpbmUwX29mZnNldCA9IDA7CisJCQlsaW5lMV9vZmZzZXQgPSBidWYtPmJwbDsKKwkJCWRwcmludGsoMSwgInRvcCBmaWVsZCBmaXJzdFxuIik7CisKKwkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCisJCQkJCSAgICBkbWEtPnNnbGlzdCwgbGluZTBfb2Zmc2V0LAorCQkJCQkgICAgYnBsX2xvY2FsLCBicGxfbG9jYWwsIGJwbF9sb2NhbCwKKwkJCQkJICAgIGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9GSUVMRF9TRVFfVEI6CisJCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAorCQkJCQkgICAgZG1hLT5zZ2xpc3QsCisJCQkJCSAgICAwLCBidWYtPmJwbCAqIChidWYtPnZiLmhlaWdodCA+PiAxKSwKKwkJCQkJICAgIGJ1Zi0+YnBsLCAwLCBidWYtPnZiLmhlaWdodCA+PiAxKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfRklFTERfU0VRX0JUOgorCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKKwkJCQkJICAgIGRtYS0+c2dsaXN0LAorCQkJCQkgICAgYnVmLT5icGwgKiAoYnVmLT52Yi5oZWlnaHQgPj4gMSksIDAsCisJCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQgPj4gMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcHJlcCAtICVkeCVkICVkYnBwIFwiJXNcIiAtIGRtYT0weCUwOGx4XG4iLAorCQlidWYsIGJ1Zi0+dmIuaSwgZmgtPndpZHRoLCBmaC0+aGVpZ2h0LCBmaC0+Zm10LT5kZXB0aCwKKwkJZmgtPmZtdC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnVmLT5yaXNjLmRtYSk7CisKKwlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUFJFUEFSRUQ7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwljeDI1ODIxX2ZyZWVfYnVmZmVyKHEsIGJ1Zik7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGN4MjU4MjFfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KKwkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKKworCWN4MjU4MjFfZnJlZV9idWZmZXIocSwgYnVmKTsKK30KKworc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpnZXRfcXVldWUoc3RydWN0IGN4MjU4MjFfZmggKmZoKQoreworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJcmV0dXJuICZmaC0+dmlkcTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitpbnQgY3gyNTgyMV9nZXRfcmVzb3VyY2Uoc3RydWN0IGN4MjU4MjFfZmggKmZoLCBpbnQgcmVzb3VyY2UpCit7CisJc3dpdGNoIChmaC0+dHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQlyZXR1cm4gcmVzb3VyY2U7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KK30KKworaW50IGN4MjU4MjFfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZpZGVvYnVmX21tYXBfbWFwcGVyKGdldF9xdWV1ZShmaCksIHZtYSk7Cit9CisKKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KKwkgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxOworCisJLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLworCWJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOworCWJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7CisJYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAgICAgIC8qIGJpdHMgNjMtMzIgKi8KKworCWRwcmludGsoMiwgImptcCB0byBzdG9wcGVyICgweCV4KVxuIiwgYnVmLT5yaXNjLmptcFsxXSk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIHF1ZXVlZFxuIiwgYnVmLAorCQkJCWJ1Zi0+dmIuaSk7CisKKwl9IGVsc2UgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCWN4MjU4MjFfc3RhcnRfdmlkZW9fZG1hKGRldiwgcSwgYnVmLAorCQkJCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnNyYW1fY2hhbm5lbHMpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKKwkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOworCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IGFjdGl2ZSwgYnVmIGNudCA9ICVkLCBxLT5jb3VudCA9ICVkXG4iLAorCQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7CisJfSBlbHNlIHsKKwkJcHJldiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwKKwkJCQl2Yi5xdWV1ZSk7CisJCWlmIChwcmV2LT52Yi53aWR0aCA9PSBidWYtPnZiLndpZHRoCisJCSAgICYmIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodAorCQkgICAmJiBwcmV2LT5mbXQgPT0gYnVmLT5mbXQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOworCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOworCQkJcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKworCQkJLyogNjQgYml0IGJpdHMgNjMtMzIgKi8KKwkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7CisJCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBhY3RpdmUsIGJ1Zi0+Y291bnQ9JWRcbiIsCisJCQkJCWJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50KTsKKworCQl9IGVsc2UgeworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPnF1ZXVlZCk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBxdWV1ZWRcbiIsIGJ1ZiwKKwkJCQkJYnVmLT52Yi5pKTsKKwkJfQorCX0KKworCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQorCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmgsICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCBtaW5vciA9IHZpZGVvX2RldmRhdGEoZmlsZSktPm1pbm9yOworCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXUzMiBwaXhfZm9ybWF0OworCWludCBjaF9pZCA9IDA7CisJaW50IGk7CisKKwlkcHJpbnRrKDEsICJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAorCQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKKworCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCisJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBmaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmY3gyNTgyMV9kZXZsaXN0KQorCXsKKwkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGN4MjU4MjFfZGV2LCBkZXZsaXN0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQlpZiAoaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2ICYmCisJCQkgICBoLT5jaGFubmVsc1tpXS52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSB7CisJCQkJZGV2ID0gaDsKKwkJCQljaF9pZCA9IGk7CisJCQkJdHlwZSAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoTlVMTCA9PSBkZXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOworCQlrZnJlZShmaCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5kZXYgPSBkZXY7CisJZmgtPnR5cGUgPSB0eXBlOworCWZoLT53aWR0aCA9IDcyMDsKKwlmaC0+Y2hhbm5lbF9pZCA9IGNoX2lkOworCisJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQlmaC0+aGVpZ2h0ID0gNTc2OworCWVsc2UKKwkJZmgtPmhlaWdodCA9IDQ4MDsKKworCWRldi0+Y2hhbm5lbF9vcGVuZWQgPSBmaC0+Y2hhbm5lbF9pZDsKKwlpZiAoZGV2LT5jaGFubmVsc1tjaF9pZF0ucGl4ZWxfZm9ybWF0cyA9PSBQSVhFTF9GUk1UXzQxMSkKKwkJcGl4X2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZNDFQOworCWVsc2UKKwkJcGl4X2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZVVlWOworCWZoLT5mbXQgPSBjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7CisKKwl2NGwyX3ByaW9fb3BlbigmZGV2LT5jaGFubmVsc1tjaF9pZF0ucHJpbywgJmZoLT5wcmlvKTsKKworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmY3gyNTgyMV92aWRlb19xb3BzLAorCQkJICAgICAgJmRldi0+cGNpLT5kZXYsICZkZXYtPnNsb2NrLAorCQkJICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkJICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciksIGZoLCBOVUxMKTsKKworCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKKwltdXRleF91bmxvY2soJmN4MjU4MjFfZGV2bGlzdF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJaWYgKGN4MjU4MjFfcmVzX2xvY2tlZChmaCwgUkVTT1VSQ0VfVklERU8wKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCisJCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CisKKwlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJmZoLT52aWRxLnN0cmVhbSkpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmlkcS5zdHJlYW0ubmV4dCwKKwkJCQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnN0cmVhbSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCgpIGNhcHR1cmUgKi8KKwkJYnVmID0gKHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqKWZoLT52aWRxLnJlYWRfYnVmOworCQlpZiAoTlVMTCA9PSBidWYpCisJCQlyZXR1cm4gUE9MTEVSUjsKKwl9CisKKwlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7CisJaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fCBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKSB7CisJCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUpIHsKKwkJCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKworCQkJaWYgKGRldiAmJiBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQorCQkJCQkudXNlX2NpZl9yZXNvbHV0aW9uKSB7CisJCQkJdTggY2FtX2lkID0gKigoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAzKTsKKwkJCQltZW1jcHkoKGNoYXIgKilidWYtPnZiLmJhZGRyLAorCQkJCSAgICAgIChjaGFyICopYnVmLT52Yi5iYWRkciArIChmaC0+d2lkdGggKiAyKSwKKwkJCQkgICAgICAoZmgtPndpZHRoICogMikpOworCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwkvKiBzdG9wIHRoZSByaXNjIGVuZ2luZSBhbmQgZmlmbyAqLworCWN4X3dyaXRlKGNoYW5uZWwwLT5kbWFfY3RsLCAwKTsgLyogRklGTyBhbmQgUklTQyBkaXNhYmxlICovCisKKwkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KKwlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7CisJCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfVklERU8wKTsKKwl9CisKKwlpZiAoZmgtPnZpZHEucmVhZF9idWYpIHsKKwkJY3gyNTgyMV9idWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsIGZoLT52aWRxLnJlYWRfYnVmKTsKKwkJa2ZyZWUoZmgtPnZpZHEucmVhZF9idWYpOworCX0KKworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCisJdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCBmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShmaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLAorCQkJCQkJUkVTT1VSQ0VfVklERU8wKSkpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCWludCBlcnIsIHJlczsKKworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpICE9IGZoLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzApOworCWVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCWludCBlcnI7CisJaW50IHBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKKworCWlmIChmaCkgeworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwllcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7CisKKwlpZiAoMCAhPSBlcnIpCisJCXJldHVybiBlcnI7CisKKwlmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKworCS8qIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkICovCisJaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKQorCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOworCisJaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpCisJCWZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKworCWlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZNDFQKQorCQlwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MTE7CisJZWxzZSBpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikKKwkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDAsIHBpeF9mb3JtYXQpOworCisJLyogY2hlY2sgaWYgY2lmIHJlc29sdXRpb24gKi8KKwlpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKQorCQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS51c2VfY2lmX3Jlc29sdXRpb24gPSAxOworCWVsc2UKKwkJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMDsKKworCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmNpZl93aWR0aCA9IGZoLT53aWR0aDsKKwltZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCBmaC0+d2lkdGgsIFNSQU1fQ0gwMCk7CisKKwlkcHJpbnRrKDIsICIlcygpOiB3aWR0aD0lZCBoZWlnaHQ9JWQgZmllbGQ9JWRcbiIsIF9fZnVuY19fLCBmaC0+d2lkdGgsCisJCWZoLT5oZWlnaHQsIGZoLT52aWRxLmZpZWxkKTsKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmZi0+Zm10LnBpeCwgVjRMMl9NQlVTX0ZNVF9GSVhFRCk7CisJY3gyNTgyMV9jYWxsX2FsbChkZXYsIHZpZGVvLCBzX21idXNfZm10LCAmbWJ1c19mbXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKworCXJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwlwLT5zZXF1ZW5jZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnZpZHEuY291bnQ7CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJY2hhciBuYW1lWzMyICsgMl07CisKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KKwkJCQkJCQkJLnNyYW1fY2hhbm5lbHM7CisJdTMyIHRtcCA9IDA7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy8yIiwgZGV2LT5uYW1lKTsKKwlwcl9pbmZvKCIlcy8yOiA9PT09PT09PT09PT0gIFNUQVJUIExPRyBTVEFUVVMgID09PT09PT09PT09PVxuIiwKKwkJZGV2LT5uYW1lKTsKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgbG9nX3N0YXR1cyk7CisJdG1wID0gY3hfcmVhZChzcmFtX2NoLT5kbWFfY3RsKTsKKwlwcl9pbmZvKCJWaWRlbyBpbnB1dCAwIGlzICVzXG4iLAorCQkodG1wICYgMHgxMSkgPyAic3RyZWFtaW5nIiA6ICJzdG9wcGVkIik7CisJcHJfaW5mbygiJXMvMjogPT09PT09PT09PT09PSAgRU5EIExPRyBTVEFUVVMgID09PT09PT09PT09PT1cbiIsCisJCWRldi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisJaW50IGVycjsKKworCWlmIChmaCkgeworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjeDI1ODIxX3NldF9jb250cm9sKGRldiwgY3RsLCBmaC0+Y2hhbm5lbF9pZCk7Cit9CisKKy8qIFZJREVPIElPQ1RMUyAqLworaW50IGN4MjU4MjFfdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCisJZi0+Zm10LnBpeC53aWR0aCA9IGZoLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5maWVsZCA9IGZoLT52aWRxLmZpZWxkOworCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBmaC0+Zm10LT5mb3VyY2M7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAoZi0+Zm10LnBpeC53aWR0aCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9mbXQgKmZtdDsKKwllbnVtIHY0bDJfZmllbGQgZmllbGQ7CisJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CisKKwlmbXQgPSBjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJaWYgKE5VTEwgPT0gZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwltYXh3ID0gNzIwOworCW1heGggPSA1NzY7CisKKwlpZiAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHsKKwkJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCAvIDIpCisJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJZWxzZQorCQkJZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKKwl9CisKKwlzd2l0Y2ggKGZpZWxkKSB7CisJY2FzZSBWNEwyX0ZJRUxEX1RPUDoKKwljYXNlIFY0TDJfRklFTERfQk9UVE9NOgorCQltYXhoID0gbWF4aCAvIDI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisJaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgMzIpCisJCWYtPmZtdC5waXguaGVpZ2h0ID0gMzI7CisJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBtYXhoOworCWlmIChmLT5mbXQucGl4LndpZHRoIDwgNDgpCisJCWYtPmZtdC5waXgud2lkdGggPSA0ODsKKwlpZiAoZi0+Zm10LnBpeC53aWR0aCA+IG1heHcpCisJCWYtPmZtdC5waXgud2lkdGggPSBtYXh3OworCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDM7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAoZi0+Zm10LnBpeC53aWR0aCAqIGZtdC0+ZGVwdGgpID4+IDM7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKworCXN0cmNweShjYXAtPmRyaXZlciwgImN4MjU4MjEiKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSWU6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOworCWNhcC0+dmVyc2lvbiA9IENYMjU4MjFfVkVSU0lPTl9DT0RFOworCWNhcC0+Y2FwYWJpbGl0aWVzID0KKwkgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlpZiAoVU5TRVQgIT0gZGV2LT50dW5lcl90eXBlKQorCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlpZiAodW5saWtlbHkoZi0+aW5kZXggPj0gQVJSQVlfU0laRShmb3JtYXRzKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm9ybWF0c1tmLT5pbmRleF0ubmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmb3JtYXRzW2YtPmluZGV4XS5mb3VyY2M7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCXJldHVybiB2aWRlb2J1Zl9yZXFidWZzKGdldF9xdWV1ZShmaCksIHApOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJcmV0dXJuIHZpZGVvYnVmX3F1ZXJ5YnVmKGdldF9xdWV1ZShmaCksIHApOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJcmV0dXJuIHZpZGVvYnVmX3FidWYoZ2V0X3F1ZXVlKGZoKSwgcCk7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19nX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLCBlbnVtIHY0bDJfcHJpb3JpdHkgKnApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOworCisJKnAgPSB2NGwyX3ByaW9fbWF4KCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwKKwkJCSAgICAgIGVudW0gdjRsMl9wcmlvcml0eSBwcmlvKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKKworCXJldHVybiB2NGwyX3ByaW9fY2hhbmdlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCAmZmgtPnByaW8sCisJCQlwcmlvKTsKK30KKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKiB0dm5vcm1zKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlpbnQgZXJyOworCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKGZoKSB7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGRldi0+dHZub3JtID09ICp0dm5vcm1zKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJY3gyNTgyMV9zZXRfdHZub3JtKGRldiwgKnR2bm9ybXMpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCW1lZHVzYV9zZXRfdmlkZW9zdGFuZGFyZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGN4MjU4MjFfZW51bV9pbnB1dChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbmFtZVtdID0geworCQlbQ1gyNTgyMV9WTVVYX0NPTVBPU0lURV0gPSAiQ29tcG9zaXRlIiwKKwkJW0NYMjU4MjFfVk1VWF9TVklERU9dID0gIlMtVmlkZW8iLAorCQlbQ1gyNTgyMV9WTVVYX0RFQlVHXSA9ICJmb3IgZGVidWcgb25seSIsCisJfTsKKwl1bnNpZ25lZCBpbnQgbjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwluID0gaS0+aW5kZXg7CisJaWYgKG4gPj0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoMCA9PSBJTlBVVChuKS0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlzdHJjcHkoaS0+bmFtZSwgaW5hbWVbSU5QVVQobiktPnR5cGVdKTsKKworCWktPnN0ZCA9IENYMjU4MjFfTk9STVM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGN4MjU4MjFfZW51bV9pbnB1dChkZXYsIGkpOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisKKwkqaSA9IGRldi0+aW5wdXQ7CisJZHByaW50aygxLCAiJXMoKTogcmV0dXJucyAlZFxuIiwgX19mdW5jX18sICppKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlpbnQgZXJyOworCisJZHByaW50aygxLCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgaSk7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaSA+PSBDWDI1ODIxX05SX0lOUFVUKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IC1FSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwljeDI1ODIxX3ZpZGVvX211eChkZXYsIGkpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisKKwlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKKworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV9zZXRfZnJlcShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OworCisJY3gyNTgyMV9jYWxsX2FsbChkZXYsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgZik7CisKKwkvKiBXaGVuIGNoYW5naW5nIGNoYW5uZWxzIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IFRWQVVESU8gKi8KKwltc2xlZXAoMTApOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKKwlpbnQgZXJyOworCisJaWYgKGZoKSB7CisJCWRldiA9IGZoLT5kZXY7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbnZhbGlkIGZoIHBvaW50ZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGN4MjU4MjFfc2V0X2ZyZXEoZGV2LCBmKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworaW50IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilmaCktPmRldjsKKworCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZmgpLT5kZXY7CisKKwlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2lmZGVmIFRVTkVSX0ZMQUcKK2ludCBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCisJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgwICE9IHQtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOworCXQtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKKwl0LT5yYW5nZWhpZ2ggPSAweGZmZmZmZmZmVUw7CisKKwl0LT5zaWduYWwgPSAweGZmZmY7CS8qIExPQ0tFRCAqLworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCWludCBlcnI7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7CisJLm5hbWUgPSAiNDIiLAorCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjeDI1ODIxX2N0bHNbXSA9IHsKKwkvKiAtLS0gdmlkZW8gLS0tICovCisJeworCSAuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCSAubmFtZSA9ICJCcmlnaHRuZXNzIiwKKwkgLm1pbmltdW0gPSAwLAorCSAubWF4aW11bSA9IDEwMDAwLAorCSAuc3RlcCA9IDEsCisJIC5kZWZhdWx0X3ZhbHVlID0gNjIwMCwKKwkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSB9LCB7CisJICAgICAuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkgICAgIC5uYW1lID0gIkNvbnRyYXN0IiwKKwkgICAgIC5taW5pbXVtID0gMCwKKwkgICAgIC5tYXhpbXVtID0gMTAwMDAsCisJICAgICAuc3RlcCA9IDEsCisJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCisJICAgICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgICB9LCB7CisJCSAuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkgLm5hbWUgPSAiU2F0dXJhdGlvbiIsCisJCSAubWluaW11bSA9IDAsCisJCSAubWF4aW11bSA9IDEwMDAwLAorCQkgLnN0ZXAgPSAxLAorCQkgLmRlZmF1bHRfdmFsdWUgPSA1MDAwLAorCQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkgfSwgeworCQkgICAgIC5pZCA9IFY0TDJfQ0lEX0hVRSwKKwkJICAgICAubmFtZSA9ICJIdWUiLAorCQkgICAgIC5taW5pbXVtID0gMCwKKwkJICAgICAubWF4aW11bSA9IDEwMDAwLAorCQkgICAgIC5zdGVwID0gMSwKKwkJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCisJCSAgICAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkgICAgIH0KK307CitzdGF0aWMgY29uc3QgaW50IENYMjU4MjFfQ1RMUyA9IEFSUkFZX1NJWkUoY3gyNTgyMV9jdGxzKTsKKworc3RhdGljIGludCBjeDI1ODIxX2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlpbnQgaTsKKworCWlmIChxY3RybC0+aWQgPCBWNEwyX0NJRF9CQVNFIHx8IHFjdHJsLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBDWDI1ODIxX0NUTFM7IGkrKykKKwkJaWYgKGN4MjU4MjFfY3Rsc1tpXS5pZCA9PSBxY3RybC0+aWQpCisJCQlicmVhazsKKwlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKKwkJKnFjdHJsID0gbm9fY3RsOworCQlyZXR1cm4gMDsKKwl9CisJKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldOworCXJldHVybiAwOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkgICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJcmV0dXJuIGN4MjU4MjFfY3RybF9xdWVyeShxY3RybCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVklERU8gQ1RSTCBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQorCQlpZiAoY3gyNTgyMV9jdGxzW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIGN4MjU4MjFfY3RscyArIGk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisKKwljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7CisKKwljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKKworCWlmIChOVUxMID09IGN0cmwpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoY3RsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9icmlnaHQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2h1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX3NhdHVyYXRpb247CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfc2V0X2NvbnRyb2woc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwsIGludCBjaGFuX251bSkKK3sKKwlpbnQgZXJyOworCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKKworCWVyciA9IC1FSU5WQUw7CisKKwljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKKworCWlmIChOVUxMID09IGN0cmwpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKwkJaWYgKGN0bC0+dmFsdWUgPCBjdHJsLT5taW5pbXVtKQorCQkJY3RsLT52YWx1ZSA9IGN0cmwtPm1pbmltdW07CisJCWlmIChjdGwtPnZhbHVlID4gY3RybC0+bWF4aW11bSkKKwkJCWN0bC0+dmFsdWUgPSBjdHJsLT5tYXhpbXVtOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBub3RoaW5nICovIDsKKwl9CisKKwlzd2l0Y2ggKGN0bC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9icmlnaHQgPSBjdGwtPnZhbHVlOworCQltZWR1c2Ffc2V0X2JyaWdodG5lc3MoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfaHVlID0gY3RsLT52YWx1ZTsKKwkJbWVkdXNhX3NldF9odWUoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CisJCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX3NhdHVyYXRpb24gPSBjdGwtPnZhbHVlOworCQltZWR1c2Ffc2V0X3NhdHVyYXRpb24oZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CisJCWJyZWFrOworCX0KKworCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBjeDI1ODIxX2luaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSkKK3sKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKSB7CisJCWN0cmwuaWQgPSBjeDI1ODIxX2N0bHNbaV0uaWQ7CisJCWN0cmwudmFsdWUgPSBjeDI1ODIxX2N0bHNbaV0uZGVmYXVsdF92YWx1ZTsKKworCQljeDI1ODIxX3NldF9jb250cm9sKGRldiwgJmN0cmwsIGNoYW5fbnVtKTsKKwl9Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCisJaWYgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljcm9wY2FwLT5ib3VuZHMudG9wID0gY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTc2IDogNDgwOworCWNyb3BjYXAtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9CisJCWRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU5IDogMTA7CisJY3JvcGNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPQorCQlkZXYtPnR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcgPyA1NCA6IDExOworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDI1ODIxX3ZpZGlvY19zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCWludCBlcnI7CisKKwlpZiAoZmgpIHsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKKwkJaWYgKDAgIT0gZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKK3sKKwkvKiBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZCAqLworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogbm9ybSkKK3sKKwkvKiBtZWR1c2EgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBzdGFuZGFyZCBzZW5zaW5nIG9mIGN1cnJlbnQgaW5wdXQgKi8KKwkqbm9ybSA9IENYMjU4MjFfTk9STVM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgodTMyIHdpZHRoLCB2NGwyX3N0ZF9pZCB0dm5vcm0pCit7CisJaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcpIHsKKwkJaWYgKHdpZHRoID09IDM1MiB8fCB3aWR0aCA9PSA3MjApCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9OVFNDX00pIHsKKwkJaWYgKHdpZHRoID09IDMyMCB8fCB3aWR0aCA9PSAzNTIgfHwgd2lkdGggPT0gNzIwKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KHUzMiBoZWlnaHQsIHY0bDJfc3RkX2lkIHR2bm9ybSkKK3sKKwlpZiAodHZub3JtID09IFY0TDJfU1REX1BBTF9CRykgeworCQlpZiAoaGVpZ2h0ID09IDU3NiB8fCBoZWlnaHQgPT0gMjg4KQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmICh0dm5vcm0gPT0gVjRMMl9TVERfTlRTQ19NKSB7CisJCWlmIChoZWlnaHQgPT0gNDgwIHx8IGhlaWdodCA9PSAyNDApCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlpbnQgY29tbWFuZCA9IDA7CisJc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKworCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkJcHJfZXJyKCIlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwljb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKwlpZiAoY29tbWFuZCAhPSBVUFNUUkVBTV9TVEFSVF9WSURFTyAmJiBjb21tYW5kICE9IFVQU1RSRUFNX1NUT1BfVklERU8pCisJCXJldHVybiAwOworCisJZGV2LT5pbnB1dF9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT52aWRfc3RkbmFtZSA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKKwlkZXYtPnBpeGVsX2Zvcm1hdCA9IGRhdGFfZnJvbV91c2VyLT5waXhlbF9mb3JtYXQ7CisJZGV2LT5jaGFubmVsX3NlbGVjdCA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKKwlkZXYtPmNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86CisJCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGNvbW1hbmQgPSAwOworCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CisJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQorCQlyZXR1cm4gMDsKKworCWRldi0+aW5wdXRfZmlsZW5hbWVfY2gyID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworCWRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPnZpZF9zdGRuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKKwlkZXYtPnBpeGVsX2Zvcm1hdF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCWRldi0+Y2hhbm5lbF9zZWxlY3RfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OworCWRldi0+Y29tbWFuZF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86CisJCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGNvbW1hbmQgPSAwOworCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CisKKwlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CisJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKQorCQlyZXR1cm4gMDsKKworCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisJZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7CisJZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgorCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aWRlb19pb2N0bF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKKwlpbnQgY29tbWFuZDsKKwlpbnQgd2lkdGggPSA3MjA7CisJaW50IHNlbGVjdGVkX2NoYW5uZWwgPSAwLCBwaXhfZm9ybWF0ID0gMCwgaSA9IDA7CisJaW50IGNpZl9lbmFibGUgPSAwLCBjaWZfd2lkdGggPSAwOworCXUzMiB2YWx1ZSA9IDA7CisKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKworCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKKwkJcHJfZXJyKCIlcygpOiBVc2VyIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKworCWlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCisJICAgJiYgY29tbWFuZCAhPSBFTkFCTEVfQ0lGX1JFU09MVVRJT04gJiYgY29tbWFuZCAhPSBSRUdfUkVBRAorCSAgICYmIGNvbW1hbmQgIT0gUkVHX1dSSVRFICYmIGNvbW1hbmQgIT0gTUVEVVNBX1JFQUQKKwkgICAmJiBjb21tYW5kICE9IE1FRFVTQV9XUklURSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFNFVF9WSURFT19TVEQ6CisJCWlmICghc3RyY21wKGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZSwgIlBBTCIpKQorCQkJZGV2LT50dm5vcm0gPSBWNEwyX1NURF9QQUxfQkc7CisJCWVsc2UKKwkJCWRldi0+dHZub3JtID0gVjRMMl9TVERfTlRTQ19NOworCQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFVF9QSVhFTF9GT1JNQVQ6CisJCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJCXBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCisJCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJCX0KKworCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQorCQkJY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKKwkJCQkJCXBpeF9mb3JtYXQpOworCisJCWJyZWFrOworCisJY2FzZSBFTkFCTEVfQ0lGX1JFU09MVVRJT046CisJCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJCWNpZl9lbmFibGUgPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3Jlc29sdXRpb25fZW5hYmxlOworCQljaWZfd2lkdGggPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3dpZHRoOworCisJCWlmIChjaWZfZW5hYmxlKSB7CisJCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKKwkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykgeworCQkJCXdpZHRoID0gMzUyOworCQkJfSBlbHNlIHsKKwkJCQl3aWR0aCA9IGNpZl93aWR0aDsKKwkJCQlpZiAoY2lmX3dpZHRoICE9IDMyMCAmJiBjaWZfd2lkdGggIT0gMzUyKQorCQkJCQl3aWR0aCA9IDMyMDsKKwkJCX0KKwkJfQorCisJCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJCX0KKworCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkgeworCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS4KKwkJCQl1c2VfY2lmX3Jlc29sdXRpb24gPSBjaWZfZW5hYmxlOworCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS5jaWZfd2lkdGggPSB3aWR0aDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgeworCQkJCWRldi0+Y2hhbm5lbHNbaV0udXNlX2NpZl9yZXNvbHV0aW9uID0KKwkJCQkJY2lmX2VuYWJsZTsKKwkJCQlkZXYtPmNoYW5uZWxzW2ldLmNpZl93aWR0aCA9IHdpZHRoOworCQkJfQorCQl9CisKKwkJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgd2lkdGgsIHNlbGVjdGVkX2NoYW5uZWwpOworCQlicmVhazsKKwljYXNlIFJFR19SRUFEOgorCQlkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEgPSBjeF9yZWFkKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgUkVHX1dSSVRFOgorCQljeF93cml0ZShkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1JFQUQ6CisJCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCQkgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCQkgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1dSSVRFOgorCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50ICByZXQgPSAwOworCisJc3RydWN0IGN4MjU4MjFfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KKwlpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7CisJCXJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7CisJCXJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7Cit9CisKKy8qIGV4cG9ydGVkIHN0dWZmICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2aWRlb19vcGVuLAorCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKKwkucmVhZCA9IHZpZGVvX3JlYWQsCisJLnBvbGwgPSB2aWRlb19wb2xsLAorCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAorCS5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKyNpZmRlZiBUVU5FUl9GTEFHCisJLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAorCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKKyNlbmRpZgorCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCisJLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCisJLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCisJLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAorCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCisJLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKKyNpZmRlZiBUVU5FUl9GTEFHCisJLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKKwkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICJjeDI1ODIxLXZpZGVvaW9jdGwiLAorCS5mb3BzID0gJnZpZGVvX2ZvcHMsCisJLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCisJLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAorCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4MjEvY3gyNTgyMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODIxL2N4MjU4MjEuaApAQCAtMCwwICsxLDYxNyBAQAorLyoKKyAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KKyAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+CisgKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQ1gyNTgyMV9IXworI2RlZmluZSBDWDI1ODIxX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dmVlcHJvbS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWR2Yi5oPgorCisjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCisjaW5jbHVkZSAiY3gyNTgyMS1yZWcuaCIKKyNpbmNsdWRlICJjeDI1ODIxLW1lZHVzYS1yZWcuaCIKKyNpbmNsdWRlICJjeDI1ODIxLXNyYW0uaCIKKyNpbmNsdWRlICJjeDI1ODIxLWF1ZGlvLmgiCisjaW5jbHVkZSAibWVkaWEvY3gyMzQxeC5oIgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNkZWZpbmUgQ1gyNTgyMV9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMTA2KQorCisjZGVmaW5lIFVOU0VUICgtMVUpCisjZGVmaW5lIE5PX1NZTkNfTElORSAoLTFVKQorCisjZGVmaW5lIENYMjU4MjFfTUFYQk9BUkRTIDIKKworI2RlZmluZSBUUlVFICAgIDEKKyNkZWZpbmUgRkFMU0UgICAwCisjZGVmaW5lIExJTkVfU0laRV9EMSAgICAxNDQwCisKKy8qIE51bWJlciBvZiBkZWNvZGVycyBhbmQgZW5jb2RlcnMgKi8KKyNkZWZpbmUgTUFYX0RFQ09ERVJTICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfRU5DT0RFUlMgICAgICAgICAgICAyCisjZGVmaW5lIFFVQURfREVDT0RFUlMgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX0NBTUVSQVMgICAgICAgICAgICAgMTYKKworLyogTWF4IG51bWJlciBvZiBpbnB1dHMgYnkgY2FyZCAqLworI2RlZmluZSBNQVhfQ1gyNTgyMV9JTlBVVCA4CisjZGVmaW5lIElOUFVUKG5yKSAoJmN4MjU4MjFfYm9hcmRzW2Rldi0+Ym9hcmRdLmlucHV0W25yXSkKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8wICAgICAgIDEKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xICAgICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8yICAgICAgIDQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8zICAgICAgIDgKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU80ICAgICAgIDE2CisjZGVmaW5lIFJFU09VUkNFX1ZJREVPNSAgICAgICAzMgorI2RlZmluZSBSRVNPVVJDRV9WSURFTzYgICAgICAgNjQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU83ICAgICAgIDEyOAorI2RlZmluZSBSRVNPVVJDRV9WSURFTzggICAgICAgMjU2CisjZGVmaW5lIFJFU09VUkNFX1ZJREVPOSAgICAgICA1MTIKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xMCAgICAgIDEwMjQKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU8xMSAgICAgIDIwNDgKKyNkZWZpbmUgUkVTT1VSQ0VfVklERU9fSU9DVEwgIDQwOTYKKworI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaKQkvKiAwLjUgc2Vjb25kcyAqLworCisjZGVmaW5lIFVOS05PV05fQk9BUkQgICAgICAgMAorI2RlZmluZSBDWDI1ODIxX0JPQVJEICAgICAgICAxCisKKy8qIEN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBDWDI1ODIxX05PUk1TIChcCisJVjRMMl9TVERfTlRTQ19NIHwgIFY0TDJfU1REX05UU0NfTV9KUCB8IFY0TDJfU1REX05UU0NfTV9LUiB8IFwKKwlWNEwyX1NURF9QQUxfQkcgfCAgVjRMMl9TVERfUEFMX0RLICAgIHwgIFY0TDJfU1REX1BBTF9JICAgIHwgXAorCVY0TDJfU1REX1BBTF9NICB8ICBWNEwyX1NURF9QQUxfTiAgICAgfCAgVjRMMl9TVERfUEFMX0ggICAgfCBcCisJVjRMMl9TVERfUEFMX05jKQorCisjZGVmaW5lIENYMjU4MjFfQk9BUkRfQ09ORVhBTlRfQVRIRU5BMTAgMQorI2RlZmluZSBNQVhfVklEX0NIQU5ORUxfTlVNICAgICAxMgorI2RlZmluZSBWSURfQ0hBTk5FTF9OVU0gOAorI2RlZmluZSBDWDI1ODIxX05SX0lOUFVUIDIKKworc3RydWN0IGN4MjU4MjFfZm10IHsKKwljaGFyICpuYW1lOworCXUzMiBmb3VyY2M7CQkvKiB2NGwyIGZvcm1hdCBpZCAqLworCWludCBkZXB0aDsKKwlpbnQgZmxhZ3M7CisJdTMyIGN4Zm9ybWF0OworfTsKKworc3RydWN0IGN4MjU4MjFfY3RybCB7CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHY7CisJdTMyIG9mZjsKKwl1MzIgcmVnOworCXUzMiBtYXNrOworCXUzMiBzaGlmdDsKK307CisKK3N0cnVjdCBjeDI1ODIxX3R2bm9ybSB7CisJY2hhciAqbmFtZTsKKwl2NGwyX3N0ZF9pZCBpZDsKKwl1MzIgY3hpZm9ybWF0OworCXUzMiBjeG9mb3JtYXQ7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9maCB7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJaW50IHJhZGlvOworCXUzMiByZXNvdXJjZXM7CisKKwllbnVtIHY0bDJfcHJpb3JpdHkgcHJpbzsKKworCS8qIHZpZGVvIG92ZXJsYXkgKi8KKwlzdHJ1Y3QgdjRsMl93aW5kb3cgd2luOworCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBzOworCXVuc2lnbmVkIGludCBuY2xpcHM7CisKKwkvKiB2aWRlbyBjYXB0dXJlICovCisJc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7CisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGNoYW5uZWxfaWQ7CisKKwkvKiB2YmkgY2FwdHVyZSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2aWRxOworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSB2YmlxOworCisJLyogSDI2NCBFbmNvZGVyIHNwZWNpZmljcyBPTkxZICovCisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlIG1wZWdxOworCWF0b21pY190IHY0bF9yZWFkaW5nOworfTsKKworZW51bSBjeDI1ODIxX2l0eXBlIHsKKwlDWDI1ODIxX1ZNVVhfQ09NUE9TSVRFID0gMSwKKwlDWDI1ODIxX1ZNVVhfU1ZJREVPLAorCUNYMjU4MjFfVk1VWF9ERUJVRywKKwlDWDI1ODIxX1JBRElPLAorfTsKKworZW51bSBjeDI1ODIxX3NyY19zZWxfdHlwZSB7CisJQ1gyNTgyMV9TUkNfU0VMX0VYVF82NTZfVklERU8gPSAwLAorCUNYMjU4MjFfU1JDX1NFTF9QQVJBTExFTF9NUEVHX1ZJREVPCit9OworCisvKiBidWZmZXIgZm9yIG9uZSB2aWRlbyBmcmFtZSAqLworc3RydWN0IGN4MjU4MjFfYnVmZmVyIHsKKwkvKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciB2YjsKKworCS8qIGN4MjU4MjEgc3BlY2lmaWMgKi8KKwl1bnNpZ25lZCBpbnQgYnBsOworCXN0cnVjdCBidGN4X3Jpc2NtZW0gcmlzYzsKKwlzdHJ1Y3QgY3gyNTgyMV9mbXQgKmZtdDsKKwl1MzIgY291bnQ7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9pbnB1dCB7CisJZW51bSBjeDI1ODIxX2l0eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IHZtdXg7CisJdTMyIGdwaW8wLCBncGlvMSwgZ3BpbzIsIGdwaW8zOworfTsKKworZW51bSBwb3J0IHsKKwlDWDI1ODIxX1VOREVGSU5FRCA9IDAsCisJQ1gyNTgyMV9SQVcsCisJQ1gyNTgyMV8yNjQKK307CisKK3N0cnVjdCBjeDI1ODIxX2JvYXJkIHsKKwljaGFyICpuYW1lOworCWVudW0gcG9ydCBwb3J0YTsKKwllbnVtIHBvcnQgcG9ydGI7CisJZW51bSBwb3J0IHBvcnRjOworCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCByYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJhZGlvX2FkZHI7CisKKwl1MzIgY2xrX2ZyZXE7CisJc3RydWN0IGN4MjU4MjFfaW5wdXQgaW5wdXRbQ1gyNTgyMV9OUl9JTlBVVF07Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9zdWJpZCB7CisJdTE2IHN1YnZlbmRvcjsKKwl1MTYgc3ViZGV2aWNlOworCXUzMiBjYXJkOworfTsKKworc3RydWN0IGN4MjU4MjFfaTJjIHsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKKworCWludCBucjsKKworCS8qIGkyYyBpL28gKi8KKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CisJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGkyY19hbGdvOworCXN0cnVjdCBpMmNfY2xpZW50IGkyY19jbGllbnQ7CisJdTMyIGkyY19yYzsKKworCS8qIGN4MjU4MjEgcmVnaXN0ZXJzIHVzZWQgZm9yIHJhdyBhZGRlc3MgKi8KKwl1MzIgaTJjX3BlcmlvZDsKKwl1MzIgcmVnX2N0cmw7CisJdTMyIHJlZ19zdGF0OworCXUzMiByZWdfYWRkcjsKKwl1MzIgcmVnX3JkYXRhOworCXUzMiByZWdfd2RhdGE7Cit9OworCitzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWQ7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKKwlzdHJ1Y3QgYnRjeF9yaXNjbWVtIHN0b3BwZXI7CisJdTMyIGNvdW50OworfTsKKworc3RydWN0IGN4MjU4MjFfZGF0YSB7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbDsKK307CisKK3N0cnVjdCBjeDI1ODIxX2NoYW5uZWwgeworCXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgcHJpbzsKKworCWludCBjdGxfYnJpZ2h0OworCWludCBjdGxfY29udHJhc3Q7CisJaW50IGN0bF9odWU7CisJaW50IGN0bF9zYXR1cmF0aW9uOworCXN0cnVjdCBjeDI1ODIxX2RhdGEgdGltZW91dF9kYXRhOworCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZGV2OworCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlIHZpZHE7CisKKwlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpzcmFtX2NoYW5uZWxzOworCisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IHJlc291cmNlczsKKworCWludCBwaXhlbF9mb3JtYXRzOworCWludCB1c2VfY2lmX3Jlc29sdXRpb247CisJaW50IGNpZl93aWR0aDsKK307CisKK3N0cnVjdCBjeDI1ODIxX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZsaXN0OworCWF0b21pY190IHJlZmNvdW50OworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKworCS8qIHBjaSBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJdW5zaWduZWQgY2hhciBwY2lfcmV2LCBwY2lfbGF0OworCWludCBwY2lfYnVzLCBwY2lfc2xvdDsKKwl1MzIgYmFzZV9pb19hZGRyOworCXUzMiBfX2lvbWVtICpsbW1pbzsKKwl1OCBfX2lvbWVtICpibW1pbzsKKwlpbnQgcGNpX2lycW1hc2s7CisJaW50IGh3cmV2aXNpb247CisKKwl1MzIgY2xrX2ZyZXE7CisKKwkvKiBJMkMgYWRhcHRlcnM6IE1hc3RlciAxICYgMiAoRXh0ZXJuYWwpICYgTWFzdGVyIDMgKEludGVybmFsIG9ubHkpICovCisJc3RydWN0IGN4MjU4MjFfaTJjIGkyY19idXNbM107CisKKwlpbnQgbnI7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlzdHJ1Y3QgY3gyNTgyMV9jaGFubmVsIGNoYW5uZWxzW01BWF9WSURfQ0hBTk5FTF9OVU1dOworCisJLyogYm9hcmQgZGV0YWlscyAqLworCXVuc2lnbmVkIGludCBib2FyZDsKKwljaGFyIG5hbWVbMzJdOworCisJLyogQW5hbG9nIHZpZGVvICovCisJdTMyIHJlc291cmNlczsKKwl1bnNpZ25lZCBpbnQgaW5wdXQ7CisJdTMyIHR2YXVkaW87CisJdjRsMl9zdGRfaWQgdHZub3JtOworCXVuc2lnbmVkIGludCB0dW5lcl90eXBlOworCXVuc2lnbmVkIGNoYXIgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgcmFkaW9fdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHJhZGlvX2FkZHI7CisJdW5zaWduZWQgaW50IGhhc19yYWRpbzsKKwl1bnNpZ25lZCBpbnQgdmlkZWNfdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHZpZGVjX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgX21heF9udW1fZGVjb2RlcnM7CisKKwkvKiBBbmFsb2cgQXVkaW8gVXBzdHJlYW0gKi8KKwlpbnQgX2F1ZGlvX2lzX3J1bm5pbmc7CisJaW50IF9hdWRpb3BpeGVsX2Zvcm1hdDsKKwlpbnQgX2lzX2ZpcnN0X2F1ZGlvX2ZyYW1lOworCWludCBfYXVkaW9maWxlX3N0YXR1czsKKwlpbnQgX2F1ZGlvX2xpbmVzX2NvdW50OworCWludCBfYXVkaW9mcmFtZV9jb3VudDsKKwlpbnQgX2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWw7CisJaW50IF9sYXN0X2luZGV4X2lycTsgICAgLyogVGhlIGxhc3QgaW50ZXJydXB0IGluZGV4IHByb2Nlc3NlZC4gKi8KKworCV9fbGUzMiAqX3Jpc2NfYXVkaW9fam1wX2FkZHI7CisJX19sZTMyICpfcmlzY192aXJ0X3N0YXJ0X2FkZHI7CisJX19sZTMyICpfcmlzY192aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBfcmlzY19waHlzX2FkZHI7CisJZG1hX2FkZHJfdCBfcmlzY19waHlzX3N0YXJ0X2FkZHI7CisKKwl1bnNpZ25lZCBpbnQgX2F1ZGlvcmlzY19zaXplOworCXVuc2lnbmVkIGludCBfYXVkaW9kYXRhX2J1Zl9zaXplOworCV9fbGUzMiAqX2F1ZGlvZGF0YV9idWZfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgX2F1ZGlvZGF0YV9idWZfcGh5c19hZGRyOworCWNoYXIgKl9hdWRpb2ZpbGVuYW1lOworCisJLyogVjRsICovCisJdTMyIGZyZXE7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmJpX2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpyYWRpb19kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqaW9jdGxfZGV2OworCisJc3BpbmxvY2tfdCBzbG9jazsKKworCS8qIFZpZGVvIFVwc3RyZWFtICovCisJaW50IF9saW5lX3NpemU7CisJaW50IF9wcm9nX2NudDsKKwlpbnQgX3BpeGVsX2Zvcm1hdDsKKwlpbnQgX2lzX2ZpcnN0X2ZyYW1lOworCWludCBfaXNfcnVubmluZzsKKwlpbnQgX2ZpbGVfc3RhdHVzOworCWludCBfbGluZXNfY291bnQ7CisJaW50IF9mcmFtZV9jb3VudDsKKwlpbnQgX2NoYW5uZWxfdXBzdHJlYW1fc2VsZWN0OworCXVuc2lnbmVkIGludCBfcmlzY19zaXplOworCisJX19sZTMyICpfZG1hX3ZpcnRfc3RhcnRfYWRkcjsKKwlfX2xlMzIgKl9kbWFfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgX2RtYV9waHlzX2FkZHI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfc3RhcnRfYWRkcjsKKworCXVuc2lnbmVkIGludCBfZGF0YV9idWZfc2l6ZTsKKwlfX2xlMzIgKl9kYXRhX2J1Zl92aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBfZGF0YV9idWZfcGh5c19hZGRyOworCWNoYXIgKl9maWxlbmFtZTsKKwljaGFyICpfZGVmYXVsdG5hbWU7CisKKwlpbnQgX2xpbmVfc2l6ZV9jaDI7CisJaW50IF9wcm9nX2NudF9jaDI7CisJaW50IF9waXhlbF9mb3JtYXRfY2gyOworCWludCBfaXNfZmlyc3RfZnJhbWVfY2gyOworCWludCBfaXNfcnVubmluZ19jaDI7CisJaW50IF9maWxlX3N0YXR1c19jaDI7CisJaW50IF9saW5lc19jb3VudF9jaDI7CisJaW50IF9mcmFtZV9jb3VudF9jaDI7CisJaW50IF9jaGFubmVsMl91cHN0cmVhbV9zZWxlY3Q7CisJdW5zaWduZWQgaW50IF9yaXNjX3NpemVfY2gyOworCisJX19sZTMyICpfZG1hX3ZpcnRfc3RhcnRfYWRkcl9jaDI7CisJX19sZTMyICpfZG1hX3ZpcnRfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZG1hX3BoeXNfc3RhcnRfYWRkcl9jaDI7CisKKwl1bnNpZ25lZCBpbnQgX2RhdGFfYnVmX3NpemVfY2gyOworCV9fbGUzMiAqX2RhdGFfYnVmX3ZpcnRfYWRkcl9jaDI7CisJZG1hX2FkZHJfdCBfZGF0YV9idWZfcGh5c19hZGRyX2NoMjsKKwljaGFyICpfZmlsZW5hbWVfY2gyOworCWNoYXIgKl9kZWZhdWx0bmFtZV9jaDI7CisKKwkvKiBNUEVHIEVuY29kZXIgT05MWSBzZXR0aW5ncyAqLworCXUzMiBjeDIzNDE3X21haWxib3g7CisJc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgbXBlZ19wYXJhbXM7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdjRsX2RldmljZTsKKwlhdG9taWNfdCB2NGxfcmVhZGVyX2NvdW50OworCXN0cnVjdCBjeDI1ODIxX3R2bm9ybSBlbmNvZGVybm9ybTsKKworCXUzMiB1cHN0cmVhbV9yaXNjYnVmX3NpemU7CisJdTMyIHVwc3RyZWFtX2RhdGFidWZfc2l6ZTsKKwl1MzIgdXBzdHJlYW1fcmlzY2J1Zl9zaXplX2NoMjsKKwl1MzIgdXBzdHJlYW1fZGF0YWJ1Zl9zaXplX2NoMjsKKwl1MzIgYXVkaW9fdXBzdHJlYW1fcmlzY2J1Zl9zaXplOworCXUzMiBhdWRpb191cHN0cmVhbV9kYXRhYnVmX3NpemU7CisJaW50IF9pc05UU0M7CisJaW50IF9mcmFtZV9pbmRleDsKKwlpbnQgX2F1ZGlvZnJhbWVfaW5kZXg7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfcXVldWVzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBfaXJxX3dvcmtfZW50cnk7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfcXVldWVzX2NoMjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgX2lycV93b3JrX2VudHJ5X2NoMjsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX2lycV9hdWRpb19xdWV1ZXM7CisJc3RydWN0IHdvcmtfc3RydWN0IF9hdWRpb193b3JrX2VudHJ5OworCWNoYXIgKmlucHV0X2ZpbGVuYW1lOworCWNoYXIgKmlucHV0X2ZpbGVuYW1lX2NoMjsKKwlpbnQgX2ZyYW1lX2luZGV4X2NoMjsKKwlpbnQgX2lzTlRTQ19jaDI7CisJY2hhciAqdmlkX3N0ZG5hbWVfY2gyOworCWludCBwaXhlbF9mb3JtYXRfY2gyOworCWludCBjaGFubmVsX3NlbGVjdF9jaDI7CisJaW50IGNvbW1hbmRfY2gyOworCWNoYXIgKmlucHV0X2F1ZGlvZmlsZW5hbWU7CisJY2hhciAqdmlkX3N0ZG5hbWU7CisJaW50IHBpeGVsX2Zvcm1hdDsKKwlpbnQgY2hhbm5lbF9zZWxlY3Q7CisJaW50IGNvbW1hbmQ7CisJaW50IGNoYW5uZWxfb3BlbmVkOworfTsKKworc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0IHsKKwljaGFyICppbnB1dF9maWxlbmFtZTsKKwljaGFyICp2aWRfc3RkbmFtZTsKKwlpbnQgcGl4ZWxfZm9ybWF0OworCWludCBjaGFubmVsX3NlbGVjdDsKKwlpbnQgY29tbWFuZDsKK307CisKK3N0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0IHsKKwljaGFyICp2aWRfc3RkbmFtZTsKKwlpbnQgcGl4ZWxfZm9ybWF0OworCWludCBjaWZfcmVzb2x1dGlvbl9lbmFibGU7CisJaW50IGNpZl93aWR0aDsKKwlpbnQgZGVjb2Rlcl9zZWxlY3Q7CisJaW50IGNvbW1hbmQ7CisJaW50IHJlZ19hZGRyZXNzOworCWludCByZWdfZGF0YTsKK307CisKK2V4dGVybiBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKnVwX2RhdGE7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN4MjU4MjFfZGV2ICpnZXRfY3gyNTgyMShzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBjeDI1ODIxX2RldiwgdjRsMl9kZXYpOworfQorCisjZGVmaW5lIGN4MjU4MjFfY2FsbF9hbGwoZGV2LCBvLCBmLCBhcmdzLi4uKSBcCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIG8sIGYsICMjYXJncykKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3gyNTgyMV9kZXZsaXN0OworZXh0ZXJuIHN0cnVjdCBtdXRleCBjeDI1ODIxX2Rldmxpc3RfbXV0ZXg7CisKK2V4dGVybiBzdHJ1Y3QgY3gyNTgyMV9ib2FyZCBjeDI1ODIxX2JvYXJkc1tdOworZXh0ZXJuIHN0cnVjdCBjeDI1ODIxX3N1YmlkIGN4MjU4MjFfc3ViaWRzW107CisKKyNkZWZpbmUgU1JBTV9DSDAwICAwCQkvKiBWaWRlbyBBICovCisjZGVmaW5lIFNSQU1fQ0gwMSAgMQkJLyogVmlkZW8gQiAqLworI2RlZmluZSBTUkFNX0NIMDIgIDIJCS8qIFZpZGVvIEMgKi8KKyNkZWZpbmUgU1JBTV9DSDAzICAzCQkvKiBWaWRlbyBEICovCisjZGVmaW5lIFNSQU1fQ0gwNCAgNAkJLyogVmlkZW8gRSAqLworI2RlZmluZSBTUkFNX0NIMDUgIDUJCS8qIFZpZGVvIEYgKi8KKyNkZWZpbmUgU1JBTV9DSDA2ICA2CQkvKiBWaWRlbyBHICovCisjZGVmaW5lIFNSQU1fQ0gwNyAgNwkJLyogVmlkZW8gSCAqLworCisjZGVmaW5lIFNSQU1fQ0gwOCAgOAkJLyogQXVkaW8gQSAqLworI2RlZmluZSBTUkFNX0NIMDkgIDkJCS8qIFZpZGVvIFVwc3RyZWFtIEkgKi8KKyNkZWZpbmUgU1JBTV9DSDEwICAxMAkJLyogVmlkZW8gVXBzdHJlYW0gSiAqLworI2RlZmluZSBTUkFNX0NIMTEgIDExCQkvKiBBdWRpbyBVcHN0cmVhbSBBVURfQ0hBTk5FTF9CICovCisKKyNkZWZpbmUgVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9JICAgICBTUkFNX0NIMDkKKyNkZWZpbmUgVklEX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9KICAgICBTUkFNX0NIMTAKKyNkZWZpbmUgQVVESU9fVVBTVFJFQU1fU1JBTV9DSEFOTkVMX0IgICBTUkFNX0NIMTEKKyNkZWZpbmUgVklERU9fSU9DVExfQ0ggIDExCisKK3N0cnVjdCBzcmFtX2NoYW5uZWwgeworCWNoYXIgKm5hbWU7CisJdTMyIGk7CisJdTMyIGNtZHNfc3RhcnQ7CisJdTMyIGN0cmxfc3RhcnQ7CisJdTMyIGNkdDsKKwl1MzIgZmlmb19zdGFydDsKKwl1MzIgZmlmb19zaXplOworCXUzMiBwdHIxX3JlZzsKKwl1MzIgcHRyMl9yZWc7CisJdTMyIGNudDFfcmVnOworCXUzMiBjbnQyX3JlZzsKKwl1MzIgaW50X21zazsKKwl1MzIgaW50X3N0YXQ7CisJdTMyIGludF9tc3RhdDsKKwl1MzIgZG1hX2N0bDsKKwl1MzIgZ3BjbnRfY3RsOworCXUzMiBncGNudDsKKwl1MzIgYXVkX2xlbmd0aDsKKwl1MzIgYXVkX2NmZzsKKwl1MzIgZmxkX2F1ZF9maWZvX2VuOworCXUzMiBmbGRfYXVkX3Jpc2NfZW47CisKKwkvKiBGb3IgVXBzdHJlYW0gVmlkZW8gKi8KKwl1MzIgdmlkX2ZtdF9jdGw7CisJdTMyIHZpZF9hY3RpdmVfY3RsMTsKKwl1MzIgdmlkX2FjdGl2ZV9jdGwyOworCXUzMiB2aWRfY2R0X3NpemU7CisKKwl1MzIgdmlwX2N0bDsKKwl1MzIgcGl4X2ZybXQ7CisJdTMyIGp1bXBvbmx5OworCXUzMiBpcnFfYml0OworfTsKK2V4dGVybiBzdHJ1Y3Qgc3JhbV9jaGFubmVsIGN4MjU4MjFfc3JhbV9jaGFubmVsc1tdOworCisjZGVmaW5lIFNUQVRVU19TVUNDRVNTICAgICAgICAgMAorI2RlZmluZSBTVEFUVVNfVU5TVUNDRVNTRlVMICAgIC0xCisKKyNkZWZpbmUgY3hfcmVhZChyZWcpICAgICAgICAgICAgIHJlYWRsKGRldi0+bG1taW8gKyAoKHJlZyk+PjIpKQorI2RlZmluZSBjeF93cml0ZShyZWcsIHZhbHVlKSAgICAgd3JpdGVsKCh2YWx1ZSksIGRldi0+bG1taW8gKyAoKHJlZyk+PjIpKQorCisjZGVmaW5lIGN4X2FuZG9yKHJlZywgbWFzaywgdmFsdWUpIFwKKwl3cml0ZWwoKHJlYWRsKGRldi0+bG1taW8rKChyZWcpPj4yKSkgJiB+KG1hc2spKSB8XAorCSgodmFsdWUpICYgKG1hc2spKSwgZGV2LT5sbW1pbysoKHJlZyk+PjIpKQorCisjZGVmaW5lIGN4X3NldChyZWcsIGJpdCkgICAgICAgICAgY3hfYW5kb3IoKHJlZyksIChiaXQpLCAoYml0KSkKKyNkZWZpbmUgY3hfY2xlYXIocmVnLCBiaXQpICAgICAgICBjeF9hbmRvcigocmVnKSwgKGJpdCksIDApCisKKyNkZWZpbmUgU2V0X0dQSU9fQml0KEJpdCkgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEJpdCkKKyNkZWZpbmUgQ2xlYXJfR1BJT19CaXQoQml0KSAgICAgICAgICAgICAgICAgICAgICh+KDEgPDwgQml0KSkKKworI2RlZmluZSBDWDI1ODIxX0VSUihmbXQsIGFyZ3MuLi4pCQkJXAorCXByX2VycigiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKyNkZWZpbmUgQ1gyNTgyMV9XQVJOKGZtdCwgYXJncy4uLikJCQlcCisJcHJfd2FybigiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKyNkZWZpbmUgQ1gyNTgyMV9JTkZPKGZtdCwgYXJncy4uLikJCQlcCisJcHJfaW5mbygiKCVkKTogIiBmbXQsIGRldi0+Ym9hcmQsICMjYXJncykKKworZXh0ZXJuIGludCBjeDI1ODIxX2kyY19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cyk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2NhcmRfc2V0dXAoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOworZXh0ZXJuIGludCBjeDI1ODIxX2lyX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY19yZWFkKHN0cnVjdCBjeDI1ODIxX2kyYyAqYnVzLCB1MTYgcmVnX2FkZHIsIGludCAqdmFsdWUpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY193cml0ZShzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cywgdTE2IHJlZ19hZGRyLCBpbnQgdmFsdWUpOworZXh0ZXJuIGludCBjeDI1ODIxX2kyY191bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2kyYyAqYnVzKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfZ3Bpb19pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc2V0X2dwaW9waW5fZGlyZWN0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgIGludCBwaW5fbnVtYmVyLCBpbnQgcGluX2xvZ2ljX3ZhbHVlKTsKKworZXh0ZXJuIGludCBtZWR1c2FfdmlkZW9faW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gaW50IG1lZHVzYV9zZXRfdmlkZW9zdGFuZGFyZChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBtZWR1c2Ffc2V0X3Jlc29sdXRpb24oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCB3aWR0aCwKKwkJCQkgIGludCBkZWNvZGVyX3NlbGVjdCk7CitleHRlcm4gaW50IG1lZHVzYV9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGJyaWdodG5lc3MsCisJCQkJIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9jb250cmFzdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNvbnRyYXN0LAorCQkJICAgICAgIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9odWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBodWUsIGludCBkZWNvZGVyKTsKK2V4dGVybiBpbnQgbWVkdXNhX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgc2F0dXJhdGlvbiwKKwkJCQkgaW50IGRlY29kZXIpOworCitleHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoLCB1bnNpZ25lZCBpbnQgYnBsLAorCQkJCSAgICAgIHUzMiByaXNjKTsKKworZXh0ZXJuIGludCBjeDI1ODIxX3Jpc2NfYnVmZmVyKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRvcF9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJvdHRvbV9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGFkZGluZywgdW5zaWduZWQgaW50IGxpbmVzKTsKK2V4dGVybiBpbnQgY3gyNTgyMV9yaXNjX2RhdGFidWZmZXJfYXVkaW8oc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkJIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MsCisJCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCQkJIHVuc2lnbmVkIGludCBicGwsCisJCQkJCSB1bnNpZ25lZCBpbnQgbGluZXMsIHVuc2lnbmVkIGludCBscGkpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYpOworZXh0ZXJuIGludCBjeDI1ODIxX3Jpc2Nfc3RvcHBlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAorCQkJCXUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsdWUpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpOworCitleHRlcm4gc3RydWN0IGN4MjU4MjFfZGV2ICpjeDI1ODIxX2Rldl9nZXQoc3RydWN0IHBjaV9kZXYgKnBjaSk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKKwkJCQkgIGludCBsZW4sIHUzMiBiaXRzLCB1MzIgbWFzayk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfc2V0dXBfYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBicGwsIHUzMiByaXNjKTsKKworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZHVwc3RyZWFtX2luaXRfY2gxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQlpbnQgY2hhbm5lbF9zZWxlY3QsIGludCBwaXhlbF9mb3JtYXQpOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZHVwc3RyZWFtX2luaXRfY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQlpbnQgY2hhbm5lbF9zZWxlY3QsIGludCBwaXhlbF9mb3JtYXQpOworZXh0ZXJuIGludCBjeDI1ODIxX2F1ZGlvX3Vwc3RyZWFtX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJICAgICAgIGludCBjaGFubmVsX3NlbGVjdCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX2ZyZWVfbWVtX3Vwc3RyZWFtX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdAorCQkJCQkgICAgICp1cF9kYXRhKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdAorCQkJCQkgICAgICp1cF9kYXRhKTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKnVwX2RhdGEpOworZXh0ZXJuIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fdmlkZW9fY2gyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIGN4MjU4MjFfc3RvcF91cHN0cmVhbV9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX3Vwc3RyZWFtKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYyk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFubmVsLAorCQkJCSAgICAgdTMyIGZvcm1hdCk7CitleHRlcm4gdm9pZCBjeDI1ODIxX3ZpZGVvaW9jdGxfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7CitleHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSAqY3gyNTgyMV92ZGV2X2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCisJCQkJCSAgICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAorCQkJCQkgICAgICBjaGFyICp0eXBlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL01ha2VmaWxlCmluZGV4IDJlZTk2ZDMuLmRjNDBkZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvTWFrZWZpbGUKQEAgLTMsNCArMyw0IEBACiAKIG9iai0kKENPTkZJR19WSURFT19DWDI1ODQwKSArPSBjeDI1ODQwLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKaW5kZXggMzRiOTZjNy4uMDA1ZjExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCkBAIC00ODAsNiArNDgwLDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X3ZvbHVtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdm9sdW1lKQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlpbnQgdm9sOwogCiAJLyogQ29udmVydCB0aGUgdm9sdW1lIHRvIG1zcDM0MDAgdmFsdWVzICgwLTEyNykgKi8KQEAgLTQ5NSw3ICs0OTYsMTQgQEAKIAl9CiAKIAkvKiBQQVRIMV9WT0xVTUUgKi8KLQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDQsIDIyOCAtICh2b2wgKiAyKSk7CisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpKSB7CisJCS8qIGZvciBjeDIzODg1IHZvbHVtZSBkb2Vzbid0IHdvcmssCisJCSAqIHRoZSBjYWxjdWxhdGlvbiBhbHdheXMgcmVzdWx0cyBpbgorCQkgKiBlNCByZWdhcmRsZXNzLgorCQkgKi8KKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4OGQ0LCB2b2x1bWUpOworCX0gZWxzZQorCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4ZDQsIDIyOCAtICh2b2wgKiAyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9iYWxhbmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBiYWxhbmNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCmluZGV4IGI3ZWUyYWUuLmNkOTk3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKQEAgLTcwMiw2ICs3MDIsMTMgQEAKIAogCS8qIHN0YXJ0IG1pY3JvY29udHJvbGxlciAqLwogCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAweDEwKTsKKworCS8qIENDIHJhdyBlbmFibGUgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MDQsIDB4MGIpOworCisJLyogQ0Mgb24gKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MmYsIDB4NjYpOworCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg0NzQsIDB4MWUxZTYwMWEpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTA2Nyw2ICsxMDc0LDE4IEBACiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDkxOSwgMHgwMSk7CiAJfQogCisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpICYmICgoYXVkX2lucHV0ID09IENYMjU4NDBfQVVESU83KSB8fAorCQkoYXVkX2lucHV0ID09IENYMjU4NDBfQVVESU82KSkpIHsKKwkJLyogQ29uZmlndXJlIGF1ZGlvIGZyb20gTFIxIG9yIExSMiBpbnB1dCAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTEwLCAwKTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhkMCwgMHg2MzA3Myk7CisJfSBlbHNlCisJaWYgKGlzX2N4MjM4OHgoc3RhdGUpICYmIChhdWRfaW5wdXQgPT0gQ1gyNTg0MF9BVURJTzgpKSB7CisJCS8qIENvbmZpZ3VyZSBhdWRpbyBmcm9tIHR1bmVyL3NpZiBpbnB1dCAqLworCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTEwLCAweDEyYjAwMGM5KTsKKwkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhkMCwgMHgxZjA2Mzg3MCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1pci5jCmluZGV4IDdlYjc5YWYuLjEzYzM4MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtaXIuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvY3gyNTg0MC5oPgogI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KIApAQCAtNjY4LDcgKzY2OSw3IEBACiAJdTE2IGRpdmlkZXI7CiAJdW5zaWduZWQgaW50IGksIG47CiAJdW5pb24gY3gyNTg0MF9pcl9maWZvX3JlYyAqcDsKLQl1bnNpZ25lZCB1LCB2OworCXVuc2lnbmVkIHUsIHYsIHc7CiAKIAlpZiAoaXJfc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02OTQsMTEgKzY5NSwxMiBAQAogCQlpZiAoKHAtPmh3X2ZpZm9fZGF0YSAmIEZJRk9fUlhUWF9SVE8pID09IEZJRk9fUlhUWF9SVE8pIHsKIAkJCS8qIEFzc3VtZSBSVE8gd2FzIGJlY2F1c2Ugb2Ygbm8gSVIgbGlnaHQgaW5wdXQgKi8KIAkJCXUgPSAwOwotCQkJdjRsMl9kYmcoMiwgaXJfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKKwkJCXcgPSAxOwogCQl9IGVsc2UgewogCQkJdSA9IChwLT5od19maWZvX2RhdGEgJiBGSUZPX1JYVFhfTFZMKSA/IDEgOiAwOwogCQkJaWYgKGludmVydCkKIAkJCQl1ID0gdSA/IDAgOiAxOworCQkJdyA9IDA7CiAJCX0KIAogCQl2ID0gKHVuc2lnbmVkKSBwdWxzZV93aWR0aF9jb3VudF90b19ucygKQEAgLTcwOSw5ICs3MTEsMTIgQEAKIAkJaW5pdF9pcl9yYXdfZXZlbnQoJnAtPmlyX2NvcmVfZGF0YSk7CiAJCXAtPmlyX2NvcmVfZGF0YS5wdWxzZSA9IHU7CiAJCXAtPmlyX2NvcmVfZGF0YS5kdXJhdGlvbiA9IHY7CisJCXAtPmlyX2NvcmVfZGF0YS50aW1lb3V0ID0gdzsKIAotCQl2NGwyX2RiZygyLCBpcl9kZWJ1Zywgc2QsICJyeCByZWFkOiAlMTB1IG5zICAlc1xuIiwKLQkJCSB2LCB1ID8gIm1hcmsiIDogInNwYWNlIik7CisJCXY0bDJfZGJnKDIsIGlyX2RlYnVnLCBzZCwgInJ4IHJlYWQ6ICUxMHUgbnMgICVzICAlc1xuIiwKKwkJCSB2LCB1ID8gIm1hcmsiIDogInNwYWNlIiwgdyA/ICIodGltZWQgb3V0KSIgOiAiIik7CisJCWlmICh3KQorCQkJdjRsMl9kYmcoMiwgaXJfZGVidWcsIHNkLCAicnggcmVhZDogZW5kIG9mIHJ4XG4iKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKaW5kZXggNWI3ZTI2Ny4uYzFhMjc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCiBvYmotJChDT05GSUdfVklERU9fQ1g4OF9WUDMwNTQpICs9IGN4ODgtdnAzMDU0LWkyYy5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggZmJjYWExYy4uZmJmZGQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtNjM2LDkgKzYzNiw2IEBACiAJY3hfd3JpdGUoTU9fUENJX0lOVFNUQVQsICAgMHhGRkZGRkZGRik7IC8vIENsZWFyIFBDSSBpbnQKIAljeF93cml0ZShNT19JTlQxX1NUQVQsICAgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUklTQyBpbnQKIAotCS8qIHNldCBkZWZhdWx0IG5vdGNoIGZpbHRlciAqLwotCWN4X2FuZG9yKE1PX0hUT1RBTCwgMHgxODAwLCAoSExOb3RjaEZpbHRlcjR4RnNjIDw8IDExKSk7Ci0KIAkvKiBSZXNldCBvbi1ib2FyZCBwYXJ0cyAqLwogCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOwogCW1zbGVlcCgxMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA2MGQyOGZkLi45MjFjNTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLAogCQkJLm5hbWUgICAgICAgICAgPSAiTm90Y2ggZmlsdGVyIiwKIAkJCS5taW5pbXVtICAgICAgID0gMCwKLQkJCS5tYXhpbXVtICAgICAgID0gMywKKwkJCS5tYXhpbXVtICAgICAgID0gMSwKIAkJCS5zdGVwICAgICAgICAgID0gMSwKIAkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtMzU1X2NjZGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTM1NV9jY2RjLmMKaW5kZXggYzI5YWM4OC4uYmQ0NDNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtMzU1X2NjZGMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvZG0zNTVfY2NkYy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL2RtMzU1X2NjZGMuaD4KICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9kbTY0NHhfY2NkYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKaW5kZXggYzhiMzJjMS4uODA1MWMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL2RtNjQ0eF9jY2RjLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvZG02NDR4X2NjZGMuaD4KICNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYwppbmRleCA3ZjFkODNhLi44NTg4YTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCkBAIC00Myw3ICs0Myw2IEBACiAKIHN0YXRpYyBpbnQgZGVidWc7CiAKLSNkZWZpbmUgVlBCRV9ESVNQTEFZX1NEX0JVRl9TSVpFICg3MjAqNTc2KjIpCiAjZGVmaW5lIFZQQkVfREVGQVVMVF9OVU1fQlVGUyAzCiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKaW5kZXggNTM1Mjg4NC4uY2VjY2Y0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKQEAgLTExNjIsNyArMTE2Miw3IEBACiAJCWdvdG8gZnJlZV9tZW07CiAJfQogCW9zZC0+b3NkX2Jhc2VfcGh5cyA9IHJlcy0+c3RhcnQ7Ci0Jb3NkLT5vc2Rfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJb3NkLT5vc2Rfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvc2QtPm9zZF9iYXNlX3BoeXMsIG9zZC0+b3NkX3NpemUsCiAJCQkJTU9EVUxFX05BTUUpKSB7CiAJCWRldl9lcnIob3NkLT5kZXYsICJVbmFibGUgdG8gcmVzZXJ2ZSBPU0QgTU1JTyByZWdpb25cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKaW5kZXggMjgxZWU0Mi4uZjZmNjIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCkBAIC00MSw2ICs0MSw4IEBACiAJc2VsZWN0IERWQl9DWEQyODIwUiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREExMDA3MSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfQTgyOTMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgVklERU9CVUZfRFZCCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQiBjYXJkcyBiYXNlZCBvbiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKaW5kZXggMzhhYWEwMC4uMmFiZGY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKQEAgLTksOCArOSw4IEBACiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYX0FMU0EpICs9IGVtMjh4eC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19FTTI4WFhfRFZCKSArPSBlbTI4eHgtZHZiLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCAzZTM5NTlmLi45Yjc0N2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtNjAsNyArNjAsNyBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjYXJkLCAgICAgImNhcmQgdHlwZSIpOwogCi0vKiBCaXRtYXNrIG1hcmtpbmcgYWxsb2NhdGVkIGRldmljZXMgZnJvbSAwIHRvIEVNMjhYWF9NQVhCT0FSRFMgKi8KKy8qIEJpdG1hc2sgbWFya2luZyBhbGxvY2F0ZWQgZGV2aWNlcyBmcm9tIDAgdG8gRU0yOFhYX01BWEJPQVJEUyAtIDEgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVtMjh4eF9kZXZ1c2VkOwogCiBzdHJ1Y3QgZW0yOHh4X2hhc2hfdGFibGUgewpAQCAtMzE3LDYgKzMxNywyNSBAQAogfTsKICNlbmRpZgogCisvKiAyMDEzOjAyNGYgUENUViBEVkItUzIgU3RpY2sgNDYwZQorICogR1BJT18wIC0gUE9XRVJfT04KKyAqIEdQSU9fMSAtIEJPT1NUCisgKiBHUElPXzIgLSBWVVZfTE5CIChyZWQgTEVEKQorICogR1BJT18zIC0gRVhUXzEyVgorICogR1BJT180IC0gSU5UX0RFTSAoREVNT0QgR1BJT18wKQorICogR1BJT181IC0gSU5UX0xOQgorICogR1BJT182IC0gUkVTRVRfREVNCisgKiBHUElPXzcgLSBMRUQgKGdyZWVuIExFRCkKKyAqLworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSBwY3R2XzQ2MGVbXSA9IHsKKwl7RU0yODc0X1I4MF9HUElPLCAweDAxLCAweGZmLCAgNTB9LAorCXsweDBkLCAgICAgICAgICAgIDB4ZmYsIDB4ZmYsICA1MH0sCisJe0VNMjg3NF9SODBfR1BJTywgMHg0MSwgMHhmZiwgIDUwfSwgLyogR1BJT182PTEgKi8KKwl7MHgwZCwgICAgICAgICAgICAweDQyLCAweGZmLCAgNTB9LAorCXtFTTI4NzRfUjgwX0dQSU8sIDB4NjEsIDB4ZmYsICA1MH0sIC8qIEdQSU9fNT0xICovCisJeyAgICAgICAgICAgICAtMSwgICAtMSwgICAtMSwgIC0xfSwKK307CisKIC8qCiAgKiAgQm9hcmQgZGVmaW5pdGlvbnMKICAqLwpAQCAtMTgxMCw2ICsxODI5LDE3IEBACiAJCS5oYXNfZHZiICAgICAgID0gMSwKIAkJLmlyX2NvZGVzICAgICAgPSBSQ19NQVBfUElOTkFDTEVfUENUVl9IRCwKIAl9LAorCS8qIDIwMTM6MDI0ZiBQQ1RWIERWQi1TMiBTdGljayA0NjBlCisJICogRW1waWEgRU0yODE3NCwgTlhQIFREQTEwMDcxLCBDb25leGFudCBDWDI0MTE4QSBhbmQgQWxsZWdybyBBODI5MyAqLworCVtFTTI4MTc0X0JPQVJEX1BDVFZfNDYwRV0gPSB7CisJCS5pMmNfc3BlZWQgICAgID0gRU0yODc0X0kyQ19TRUNPTkRBUllfQlVTX1NFTEVDVCB8CisJCQlFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8IEVNMjhYWF9JMkNfRlJFUV80MDBfS0haLAorCQkubmFtZSAgICAgICAgICA9ICJQQ1RWIERWQi1TMiBTdGljayAoNDYwZSkiLAorCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnR1bmVyX2dwaW8gICAgPSBwY3R2XzQ2MGUsCisJCS5oYXNfZHZiICAgICAgID0gMSwKKwkJLmlyX2NvZGVzICAgICAgPSBSQ19NQVBfUElOTkFDTEVfUENUVl9IRCwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBlbTI4eHhfYmNvdW50ID0gQVJSQVlfU0laRShlbTI4eHhfYm9hcmRzKTsKIApAQCAtMTg5Myw2ICsxOTIzLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg2MF9CT0FSRF9URVJSQVRFQ19BVjM1MCB9LAogCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA5NiksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4NjBfQk9BUkRfVEVSUkFURUNfR1JBQkJZIH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgxMEFGKSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg2MF9CT0FSRF9URVJSQVRFQ19HUkFCQlkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwZmQ5LCAweDAwMzMpLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODYwX0JPQVJEX0VMR0FUT19WSURFT19DQVBUVVJFfSwKIAl7IFVTQl9ERVZJQ0UoMHgxODViLCAweDI4NzApLApAQCAtMTk0MSw2ICsxOTczLDggQEAKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg3MF9CT0FSRF9LV09STERfQTM0MCB9LAogCXsgVVNCX0RFVklDRSgweDIwMTMsIDB4MDI0ZiksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4MTc0X0JPQVJEX1BDVFZfMjkwRSB9LAorCXsgVVNCX0RFVklDRSgweDIwMTMsIDB4MDI0YyksCisJCQkuZHJpdmVyX2luZm8gPSBFTTI4MTc0X0JPQVJEX1BDVFZfNDYwRSB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZW0yOHh4X2lkX3RhYmxlKTsKQEAgLTI3NjgsOSArMjgwMiw5IEBACiAjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KIAogLyoKLSAqIGVtMjh4eF9yZWFsZWFzZV9yZXNvdXJjZXMoKQorICogZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKCkKICAqIHVucmVnaXN0ZXJzIHRoZSB2NGwyLGkyYyBhbmQgdXNiIGRldmljZXMKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25lY3RlZCBvciBhdCBtb2R1bGUgdW5sb2FkCisgKiBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdldHMgZGlzY29ubmVjdGVkIG9yIGF0IG1vZHVsZSB1bmxvYWQKICovCiB2b2lkIGVtMjh4eF9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CkBAIC0yNzg0LDggKzI4MTgsNiBAQAogCiAJZW0yOHh4X3JlbGVhc2VfYW5hbG9nX3Jlc291cmNlcyhkZXYpOwogCi0JZW0yOHh4X3JlbW92ZV9mcm9tX2Rldmxpc3QoZGV2KTsKLQogCWVtMjh4eF9pMmNfdW5yZWdpc3RlcihkZXYpOwogCiAJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CkBAIC0yNzkzLDcgKzI4MjUsNyBAQAogCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CiAKIAkvKiBNYXJrIGRldmljZSBhcyB1bnVzZWQgKi8KLQllbTI4eHhfZGV2dXNlZCAmPSB+KDEgPDwgZGV2LT5kZXZubyk7CisJY2xlYXJfYml0KGRldi0+ZGV2bm8sICZlbTI4eHhfZGV2dXNlZCk7CiB9OwogCiAvKgpAQCAtMjgwNiw3ICsyODM4LDYgQEAKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSAqZGV2aGFuZGxlOwogCWludCByZXR2YWw7Ci0JaW50IGVyckNvZGU7CiAKIAlkZXYtPnVkZXYgPSB1ZGV2OwogCW11dGV4X2luaXQoJmRldi0+Y3RybF91cmJfbG9jayk7CkBAIC0yODgzLDEwICsyOTE0LDkgQEAKIAl9CiAKIAlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7Ci0JCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKLQkJaWYgKGVyckNvZGUpCisJCXJldHZhbCA9IGVtMjh4eF9hdWRpb19zZXR1cChkZXYpOworCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWVtMjh4eF9hZGRfaW50b19kZXZsaXN0KGRldik7CiAJCWVtMjh4eF9pbml0X2V4dGVuc2lvbihkZXYpOwogCiAJCXJldHVybiAwOwpAQCAtMjkwMyw3ICsyOTMzLDcgQEAKIAkJLyogUmVzZXRzIEkyQyBzcGVlZCAqLwogCQllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCBkZXYtPmJvYXJkLmkyY19zcGVlZCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZ3NfcmVxIGZhaWxlZCEiCisJCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyBmYWlsZWQhIgogCQkJCSAgICAgICIgcmV0dmFsIFslZF1cbiIsCiAJCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7CiAJCQlyZXR1cm4gcmV0dmFsOwpAQCAtMjkxNywxMiArMjk0NywxMSBAQAogCX0KIAogCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KLQllcnJDb2RlID0gZW0yOHh4X2kyY19yZWdpc3RlcihkZXYpOwotCWlmIChlcnJDb2RlIDwgMCkgewotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKLQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgLSBlcnJDb2RlIFslZF0hXG4iLAotCQkJX19mdW5jX18sIGVyckNvZGUpOwotCQlyZXR1cm4gZXJyQ29kZTsKKwlyZXR2YWwgPSBlbTI4eHhfaTJjX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF9pMmNfcmVnaXN0ZXIgLSBlcnJvciBbJWRdIVxuIiwKKwkJCV9fZnVuY19fLCByZXR2YWwpOworCQlnb3RvIHVucmVnaXN0ZXJfZGV2OwogCX0KIAogCS8qCkBAIC0yOTM2LDExICsyOTY1LDExIEBACiAJZW0yOHh4X2NhcmRfc2V0dXAoZGV2KTsKIAogCS8qIENvbmZpZ3VyZSBhdWRpbyAqLwotCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKLQlpZiAoZXJyQ29kZSA8IDApIHsKLQkJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7Ci0JCWVtMjh4eF9lcnJkZXYoIiVzOiBFcnJvciB3aGlsZSBzZXR0aW5nIGF1ZGlvIC0gZXJyQ29kZSBbJWRdIVxuIiwKLQkJCV9fZnVuY19fLCBlcnJDb2RlKTsKKwlyZXR2YWwgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQllbTI4eHhfZXJyZGV2KCIlczogRXJyb3Igd2hpbGUgc2V0dGluZyBhdWRpbyAtIGVycm9yIFslZF0hXG4iLAorCQkJX19mdW5jX18sIHJldHZhbCk7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiB3YWtlIGkyYyBkZXZpY2VzICovCkBAIC0yOTU0LDQxICsyOTgzLDQxIEBACiAKIAlpZiAoZGV2LT5ib2FyZC5oYXNfbXNwMzR4eCkgewogCQkvKiBTZW5kIGEgcmVzZXQgdG8gb3RoZXIgY2hpcHMgdmlhIGdwaW8gKi8KLQkJZXJyQ29kZSA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZjcpOwotCQlpZiAoZXJyQ29kZSA8IDApIHsKLQkJCWVtMjh4eF9lcnJkZXYoIiVzOiBlbTI4eHhfd3JpdGVfcmVnc19yZXEgLSAiCi0JCQkJICAgICAgIm1zcDM0eHgoMSkgZmFpbGVkISBlcnJDb2RlIFslZF1cbiIsCi0JCQkJICAgICAgX19mdW5jX18sIGVyckNvZGUpOwotCQkJcmV0dXJuIGVyckNvZGU7CisJCXJldHZhbCA9IGVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA4X0dQSU8sIDB4ZjcpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWcgLSAiCisJCQkJICAgICAgIm1zcDM0eHgoMSkgZmFpbGVkISBlcnJvciBbJWRdXG4iLAorCQkJCSAgICAgIF9fZnVuY19fLCByZXR2YWwpOworCQkJZ290byBmYWlsOwogCQl9CiAJCW1zbGVlcCgzKTsKIAotCQllcnJDb2RlID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZik7Ci0JCWlmIChlcnJDb2RlIDwgMCkgewotCQkJZW0yOHh4X2VycmRldigiJXM6IGVtMjh4eF93cml0ZV9yZWdzX3JlcSAtICIKLQkJCQkgICAgICAibXNwMzR4eCgyKSBmYWlsZWQhIGVyckNvZGUgWyVkXVxuIiwKLQkJCQkgICAgICBfX2Z1bmNfXywgZXJyQ29kZSk7Ci0JCQlyZXR1cm4gZXJyQ29kZTsKKwkJcmV0dmFsID0gZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDhfR1BJTywgMHhmZik7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQllbTI4eHhfZXJyZGV2KCIlczogZW0yOHh4X3dyaXRlX3JlZyAtICIKKwkJCQkgICAgICAibXNwMzR4eCgyKSBmYWlsZWQhIGVycm9yIFslZF1cbiIsCisJCQkJICAgICAgX19mdW5jX18sIHJldHZhbCk7CisJCQlnb3RvIGZhaWw7CiAJCX0KIAkJbXNsZWVwKDMpOwogCX0KIAotCWVtMjh4eF9hZGRfaW50b19kZXZsaXN0KGRldik7Ci0KIAlyZXR2YWwgPSBlbTI4eHhfcmVnaXN0ZXJfYW5hbG9nX2RldmljZXMoZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKLQkJZ290byBmYWlsX3JlZ19kZXZpY2VzOworCQlnb3RvIGZhaWw7CiAJfQogCi0JZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7Ci0KIAkvKiBTYXZlIHNvbWUgcG93ZXIgYnkgcHV0dGluZyB0dW5lciB0byBzbGVlcCAqLwogCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3Bvd2VyLCAwKTsKIAogCXJldHVybiAwOwogCi1mYWlsX3JlZ19kZXZpY2VzOgorZmFpbDoKKwllbTI4eHhfaTJjX3VucmVnaXN0ZXIoZGV2KTsKKwordW5yZWdpc3Rlcl9kZXY6CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0zMDE1LDggKzMwNDQsMTYgQEAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKIAogCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KLQluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmVtMjh4eF9kZXZ1c2VkLCBFTTI4WFhfTUFYQk9BUkRTKTsKLQllbTI4eHhfZGV2dXNlZCB8PSAxPDxucjsKKwlkbyB7CisJCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCgmZW0yOHh4X2RldnVzZWQsIEVNMjhYWF9NQVhCT0FSRFMpOworCQlpZiAobnIgPj0gRU0yOFhYX01BWEJPQVJEUykgeworCQkJLyogTm8gZnJlZSBkZXZpY2Ugc2xvdHMgKi8KKwkJCXByaW50ayhEUklWRVJfTkFNRSAiOiBTdXBwb3J0cyBvbmx5ICVpIGVtMjh4eCBib2FyZHMuXG4iLAorCQkJCQlFTTI4WFhfTUFYQk9BUkRTKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9ub19zbG90OworCQl9CisJfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChuciwgJmVtMjh4eF9kZXZ1c2VkKSk7CiAKIAkvKiBEb24ndCByZWdpc3RlciBhdWRpbyBpbnRlcmZhY2VzICovCiAJaWYgKGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfQVVESU8pIHsKQEAgLTMwMjcsNyArMzA2NCw2IEBACiAJCQlpZm51bSwKIAkJCWludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CiAKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMwNzYsNyArMzExMiw2IEBACiAJCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIFRoaXMgaXMgYW4gYW5jaWxpYXJ5ICIKIAkJCQkJImludGVyZmFjZSBub3QgdXNlZCBieSB0aGUgZHJpdmVyXG4iKTsKIAotCQkJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOwogCQkJCXJldHZhbCA9IC1FTk9ERVY7CiAJCQkJZ290byBlcnI7CiAJCQl9CkBAIC0zMTMyLDI5ICszMTY3LDE5IEBACiAJCXByaW50ayhEUklWRVJfTkFNRSAiOiBEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CiAJCXByaW50ayhEUklWRVJfTkFNRSAiOiBEZXZpY2UgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSBoaWdoLXNwZWVkIgogCQkgICAgICAgIiBVU0IgMi4wIHBvcnQuXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyOwogCX0KIAotCWlmIChuciA+PSBFTTI4WFhfTUFYQk9BUkRTKSB7Ci0JCXByaW50ayhEUklWRVJfTkFNRSAiOiBTdXBwb3J0cyBvbmx5ICVpIGVtMjh4eCBib2FyZHMuXG4iLAotCQkJCUVNMjhYWF9NQVhCT0FSRFMpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICI6IG91dCBvZiBtZW1vcnkhXG4iKTsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KIAotCXNucHJpbnRmKGRldi0+bmFtZSwgMjksICJlbTI4eHggIyVkIiwgbnIpOworCXNucHJpbnRmKGRldi0+bmFtZSwgc2l6ZW9mKGRldi0+bmFtZSksICJlbTI4eHggIyVkIiwgbnIpOwogCWRldi0+ZGV2bm8gPSBucjsKIAlkZXYtPm1vZGVsID0gaWQtPmRyaXZlcl9pbmZvOwogCWRldi0+YWx0ICAgPSAtMTsKQEAgLTMxNzcsNyArMzIwMiw2IEBACiAKIAlpZiAoZGV2LT5hbHRfbWF4X3BrdF9zaXplID09IE5VTEwpIHsKIAkJZW0yOHh4X2VycmRldigib3V0IG9mIG1lbW9yeSFcbiIpOwotCQllbTI4eHhfZGV2dXNlZCAmPSB+KDE8PG5yKTsKIAkJa2ZyZWUoZGV2KTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnI7CkBAIC0zMjA0LDggKzMyMjgsOCBAQAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJcmV0dmFsID0gZW0yOHh4X2luaXRfZGV2KCZkZXYsIHVkZXYsIGludGVyZmFjZSwgbnIpOwogCWlmIChyZXR2YWwpIHsKLQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxkZXYtPmRldm5vKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlrZnJlZShkZXYtPmFsdF9tYXhfcGt0X3NpemUpOwogCQlrZnJlZShkZXYpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMjE3LDE1ICszMjQxLDI2IEBACiAJICovCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCisJLyoKKwkgKiBUaGVzZSBleHRlbnNpb25zIGNhbiBiZSBtb2R1bGVzLiBJZiB0aGUgbW9kdWxlcyBhcmUgYWxyZWFkeQorCSAqIGxvYWRlZCB0aGVuIHdlIGNhbiBpbml0aWFsaXNlIHRoZSBkZXZpY2Ugbm93LCBvdGhlcndpc2Ugd2UKKwkgKiB3aWxsIGluaXRpYWxpc2UgaXQgd2hlbiB0aGUgbW9kdWxlcyBsb2FkIGluc3RlYWQuCisJICovCisJZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7CisKIAlyZXR1cm4gMDsKIAogZXJyOgorCWNsZWFyX2JpdChuciwgJmVtMjh4eF9kZXZ1c2VkKTsKKworZXJyX25vX3Nsb3Q6CisJdXNiX3B1dF9kZXYodWRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoKICAqIGVtMjh4eF91c2JfZGlzY29ubmVjdCgpCi0gKiBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdldHMgZGljb25lbmN0ZWQKKyAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25uZWN0ZWQKICAqIHZpZGVvIGRldmljZSB3aWxsIGJlIHVucmVnaXN0ZXJlZCBvbiB2NGwyX2Nsb3NlIGluIGNhc2UgaXQgaXMgc3RpbGwgb3BlbgogICovCiBzdGF0aWMgdm9pZCBlbTI4eHhfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKQEAgLTMyNzMsMTAgKzMzMDgsMTAgQEAKIAkJZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKGRldik7CiAJfQogCi0JZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOwotCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCisJZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOworCiAJaWYgKCFkZXYtPnVzZXJzKSB7CiAJCWtmcmVlKGRldi0+YWx0X21heF9wa3Rfc2l6ZSk7CiAJCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCA1N2IxYjVjLi44MDRhNGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTExODQsMjUgKzExODQsNiBAQAogc3RhdGljIERFRklORV9NVVRFWChlbTI4eHhfZGV2bGlzdF9tdXRleCk7CiAKIC8qCi0gKiBlbTI4eHhfcmVhbGVhc2VfcmVzb3VyY2VzKCkKLSAqIHVucmVnaXN0ZXJzIHRoZSB2NGwyLGkyYyBhbmQgdXNiIGRldmljZXMKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaXNjb25lY3RlZCBvciBhdCBtb2R1bGUgdW5sb2FkCi0qLwotdm9pZCBlbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOwotCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotfTsKLQotdm9pZCBlbTI4eHhfYWRkX2ludG9fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJmVtMjh4eF9kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLS8qCiAgKiBFeHRlbnNpb24gaW50ZXJmYWNlCiAgKi8KIApAQCAtMTIxNyw4ICsxMTk4LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmVtMjh4eF9kZXZsaXN0LCBkZXZsaXN0KSB7CiAJCW9wcy0+aW5pdChkZXYpOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOwogCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOworCXByaW50ayhLRVJOX0lORk8gIkVtMjh4eDogSW5pdGlhbGl6ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24pOwpAQCAtMTIzMSwzNiArMTIxMiwzNCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZW0yOHh4X2Rldmxpc3QsIGRldmxpc3QpIHsKIAkJb3BzLT5maW5pKGRldik7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIkVtMjh4eDogUmVtb3ZlZCAoJXMpIGV4dGVuc2lvblxuIiwgb3BzLT5uYW1lKTsKIAlsaXN0X2RlbCgmb3BzLT5uZXh0KTsKIAltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKKwlwcmludGsoS0VSTl9JTkZPICJFbTI4eHg6IFJlbW92ZWQgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7CiAKIHZvaWQgZW0yOHh4X2luaXRfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKLQkJCWlmIChvcHMtPmluaXQpCi0JCQkJb3BzLT5pbml0KGRldik7Ci0JCX0KKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsICZlbTI4eHhfZGV2bGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJaWYgKG9wcy0+aW5pdCkKKwkJCW9wcy0+aW5pdChkZXYpOwogCX0KIAltdXRleF91bmxvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKIH0KIAogdm9pZCBlbTI4eHhfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZW0yOHh4X29wcyAqb3BzID0gTlVMTDsKIAogCW11dGV4X2xvY2soJmVtMjh4eF9kZXZsaXN0X211dGV4KTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZlbTI4eHhfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKLQkJCWlmIChvcHMtPmZpbmkpCi0JCQkJb3BzLT5maW5pKGRldik7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJmVtMjh4eF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgeworCQlpZiAob3BzLT5maW5pKQorCQkJb3BzLT5maW5pKGRldik7CiAJfQorCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOwogCW11dGV4X3VubG9jaygmZW0yOHh4X2Rldmxpc3RfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCmluZGV4IGU1OTE2ZGUuLmNlZjdhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJjeGQyODIwci5oIgogI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgogI2luY2x1ZGUgImRyeGsuaCIKKyNpbmNsdWRlICJ0ZGExMDA3MS5oIgorI2luY2x1ZGUgImE4MjkzLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBlbTI4eHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKQEAgLTEyMiw3ICsxMjQsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgZHZiX2lzb2NfY29weShzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbmxpbmUgaW50IGVtMjh4eF9kdmJfaXNvY19jb3B5KHN0cnVjdCBlbTI4eHggKmRldiwgc3RydWN0IHVyYiAqdXJiKQogewogCWludCBpOwogCkBAIC0xNTUsNyArMTU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyBpbnQgZW0yOHh4X3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiKQogewogCWludCByYzsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBkdmItPmFkYXB0ZXIucHJpdjsKQEAgLTE3NSwxMCArMTc3LDEwIEBACiAKIAlyZXR1cm4gZW0yOHh4X2luaXRfaXNvYyhkZXYsIEVNMjhYWF9EVkJfTUFYX1BBQ0tFVFMsCiAJCQkJRU0yOFhYX0RWQl9OVU1fQlVGUywgbWF4X2R2Yl9wYWNrZXRfc2l6ZSwKLQkJCQlkdmJfaXNvY19jb3B5KTsKKwkJCQllbTI4eHhfZHZiX2lzb2NfY29weSk7CiB9CiAKLXN0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyBpbnQgZW0yOHh4X3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCBlbTI4eHhfZHZiICpkdmIpCiB7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gZHZiLT5hZGFwdGVyLnByaXY7CiAKQEAgLTE4OSw3ICsxOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQorc3RhdGljIGludCBlbTI4eHhfc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGRlbXV4LT5wcml2OwpAQCAtMjAzLDcgKzIwNSw3IEBACiAJcmMgPSBkdmItPm5mZWVkczsKIAogCWlmIChkdmItPm5mZWVkcyA9PSAxKSB7Ci0JCXJldCA9IHN0YXJ0X3N0cmVhbWluZyhkdmIpOworCQlyZXQgPSBlbTI4eHhfc3RhcnRfc3RyZWFtaW5nKGR2Yik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmMgPSByZXQ7CiAJfQpAQCAtMjEyLDcgKzIxNCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHN0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCitzdGF0aWMgaW50IGVtMjh4eF9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ICA9IGZlZWQtPmRlbXV4OwogCXN0cnVjdCBlbTI4eHhfZHZiICpkdmIgPSBkZW11eC0+cHJpdjsKQEAgLTIyMiw3ICsyMjQsNyBAQAogCWR2Yi0+bmZlZWRzLS07CiAKIAlpZiAoMCA9PSBkdmItPm5mZWVkcykKLQkJZXJyID0gc3RvcF9zdHJlYW1pbmcoZHZiKTsKKwkJZXJyID0gZW0yOHh4X3N0b3Bfc3RyZWFtaW5nKGR2Yik7CiAKIAltdXRleF91bmxvY2soJmR2Yi0+bG9jayk7CiAJcmV0dXJuIGVycjsKQEAgLTM4MCw3ICszODIsNyBAQAogCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2VuZCk7CiB9OwogCi1zdGF0aWMgaW50IG10MzUyX3RlcnJhdGVjX3hzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IGVtMjh4eF9tdDM1Ml90ZXJyYXRlY194c19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCS8qIFZhbHVlcyBleHRyYWN0ZWQgZnJvbSBhIFVTQiB0cmFjZSBvZiB0aGUgVGVycmF0ZWMgV2luZG93cyBkcml2ZXIgKi8KIAlzdGF0aWMgdTggY2xvY2tfY29uZmlnW10gICA9IHsgQ0xPQ0tfQ1RMLCAgMHgzOCwgMHgyYyB9OwpAQCAtNDEyLDcgKzQxNCw3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAoMHgxZSA+PiAxKSwKIAkubm9fdHVuZXIgPSAxLAogCS5pZjIgPSA0NTYwMCwKLQkuZGVtb2RfaW5pdCA9IG10MzUyX3RlcnJhdGVjX3hzX2luaXQsCisJLmRlbW9kX2luaXQgPSBlbTI4eHhfbXQzNTJfdGVycmF0ZWNfeHNfaW5pdCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwMjNfY29uZmlnIGVtMjh4eF90ZGExMDAyM19jb25maWcgPSB7CkBAIC00MzgsMTEgKzQ0MCwyNSBAQAogCiBzdGF0aWMgc3RydWN0IHRkYTE4MjcxX2NvbmZpZyBlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnID0gewogCS5vdXRwdXRfb3B0ID0gVERBMTgyNzFfT1VUUFVUX0xUX09GRiwKKwkuZ2F0ZSA9IFREQTE4MjcxX0dBVEVfRElHSVRBTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGRhMTAwNzFfY29uZmlnIGVtMjh4eF90ZGExMDA3MV9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg1NSwgLyogKDB4YWEgPj4gMSkgKi8KKwkuaTJjX3dyX21heCA9IDY0LAorCS50c19tb2RlID0gVERBMTAwNzFfVFNfU0VSSUFMLAorCS5zcGVjX2ludiA9IDAsCisJLnh0YWwgPSA0MDQ0NDAwMCwgLyogNDAuNDQ0IE1IeiAqLworCS5wbGxfbXVsdGlwbGllciA9IDIwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhODI5M19jb25maWcgZW0yOHh4X2E4MjkzX2NvbmZpZyA9IHsKKwkuaTJjX2FkZHIgPSAweDA4LCAvKiAoMHgxMCA+PiAxKSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgYXR0YWNoX3hjMzAyOCh1OCBhZGRyLCBzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW50IGVtMjh4eF9hdHRhY2hfeGMzMDI4KHU4IGFkZHIsIHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKIAlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmc7CkBAIC00NzIsMTAgKzQ4OCw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHJlZ2lzdGVyX2R2YihzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiLAotCQkgc3RydWN0IG1vZHVsZSAqbW9kdWxlLAotCQkgc3RydWN0IGVtMjh4eCAqZGV2LAotCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBlbTI4eHhfcmVnaXN0ZXJfZHZiKHN0cnVjdCBlbTI4eHhfZHZiICpkdmIsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKKwkJCSAgICAgICBzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0OwogCkBAIC01MjIsOCArNTM2LDggQEAKIAlkdmItPmRlbXV4LnByaXYgICAgICAgPSBkdmI7CiAJZHZiLT5kZW11eC5maWx0ZXJudW0gID0gMjU2OwogCWR2Yi0+ZGVtdXguZmVlZG51bSAgICA9IDI1NjsKLQlkdmItPmRlbXV4LnN0YXJ0X2ZlZWQgPSBzdGFydF9mZWVkOwotCWR2Yi0+ZGVtdXguc3RvcF9mZWVkICA9IHN0b3BfZmVlZDsKKwlkdmItPmRlbXV4LnN0YXJ0X2ZlZWQgPSBlbTI4eHhfc3RhcnRfZmVlZDsKKwlkdmItPmRlbXV4LnN0b3BfZmVlZCAgPSBlbTI4eHhfc3RvcF9mZWVkOwogCiAJcmVzdWx0ID0gZHZiX2RteF9pbml0KCZkdmItPmRlbXV4KTsKIAlpZiAocmVzdWx0IDwgMCkgewpAQCAtNTkxLDcgKzYwNSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9kdmIoc3RydWN0IGVtMjh4eF9kdmIgKmR2YikKK3N0YXRpYyB2b2lkIGVtMjh4eF91bnJlZ2lzdGVyX2R2YihzdHJ1Y3QgZW0yOHh4X2R2YiAqZHZiKQogewogCWR2Yl9uZXRfcmVsZWFzZSgmZHZiLT5uZXQpOwogCWR2Yi0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiLT5kZW11eC5kbXgsICZkdmItPmZlX21lbSk7CkBAIC02MDcsOSArNjIxLDkgQEAKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOwogfQogCi1zdGF0aWMgaW50IGR2Yl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKK3N0YXRpYyBpbnQgZW0yOHh4X2R2Yl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKIHsKLQlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMCwgbWZlX3NoYXJlZCA9IDA7CiAJc3RydWN0IGVtMjh4eF9kdmIgKmR2YjsKIAogCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CkBAIC02NDgsNyArNjYyLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLAogCQkJCQkgICAmZW0yODgwX2xnZHQzMzAzX2RldiwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02NTcsNyArNjcxLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfemwxMDM1M193aXRoX3hjMzAyOCwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02NjgsNyArNjgyLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfemwxMDM1M194YzMwMjhfbm9faTJjX2dhdGUsCiAJCQkJCSAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGF0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKKwkJaWYgKGVtMjh4eF9hdHRhY2hfeGMzMDI4KDB4NjEsIGRldikgPCAwKSB7CiAJCQlyZXN1bHQgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQpAQCAtNjg5LDcgKzcwMyw3IEBACiAJCQkJCQkgICAmZGV2LT5pMmNfYWRhcCk7CiAJCX0KIAotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC02OTksNyArNzEzLDcgQEAKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goczVoMTQwOV9hdHRhY2gsCiAJCQkJCSAgICZlbTI4eHhfczVoMTQwOV93aXRoX3hjMzAyOCwKIAkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC03MjAsNyArNzM0LDcgQEAKIAljYXNlIEVNMjg4Ml9CT0FSRF9QSU5OQUNMRV9IWUJSSURfUFJPXzMzMEU6CiAJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGRyeGRfYXR0YWNoLCAmZW0yOHh4X2RyeGQsIE5VTEwsCiAJCQkJCSAgICZkZXYtPmkyY19hZGFwLCAmZGV2LT51ZGV2LT5kZXYpOwotCQlpZiAoYXR0YWNoX3hjMzAyOCgweDYxLCBkZXYpIDwgMCkgeworCQlpZiAoZW0yOHh4X2F0dGFjaF94YzMwMjgoMHg2MSwgZGV2KSA8IDApIHsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CkBAIC03NTMsMTEgKzc2Nyw5IEBACiAJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGN4ZDI4MjByX2F0dGFjaCwKIAkJCSZlbTI4eHhfY3hkMjgyMHJfY29uZmlnLCAmZGV2LT5pMmNfYWRhcCwgTlVMTCk7CiAJCWlmIChkdmItPmZlWzBdKSB7Ci0JCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY190dW5lcjsKLQkJCWkyY190dW5lciA9IGN4ZDI4MjByX2dldF90dW5lcl9pMmNfYWRhcHRlcihkdmItPmZlWzBdKTsKIAkJCS8qIEZFIDAgYXR0YWNoIHR1bmVyICovCiAJCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBkdmItPmZlWzBdLCAweDYwLAotCQkJCWkyY190dW5lciwgJmVtMjh4eF9jeGQyODIwcl90ZGExODI3MV9jb25maWcpKSB7CisJCQkJJmRldi0+aTJjX2FkYXAsICZlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnKSkgewogCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVswXSk7CiAJCQkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dF9mcmVlOwpAQCAtNzY4LDEwICs3ODAsMTIgQEAKIAkJCWR2Yi0+ZmVbMV0tPmlkID0gMTsKIAkJCS8qIEZFIDEgYXR0YWNoIHR1bmVyICovCiAJCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBkdmItPmZlWzFdLCAweDYwLAotCQkJCWkyY190dW5lciwgJmVtMjh4eF9jeGQyODIwcl90ZGExODI3MV9jb25maWcpKSB7CisJCQkJJmRldi0+aTJjX2FkYXAsICZlbTI4eHhfY3hkMjgyMHJfdGRhMTgyNzFfY29uZmlnKSkgewogCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVsxXSk7CiAJCQkJLyogbGVhdmUgRkUgMCBzdGlsbCBhY3RpdmUgKi8KIAkJCX0KKworCQkJbWZlX3NoYXJlZCA9IDE7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDU6CkBAIC04MDksNiArODIzLDE2IEBACiAJCSAgICAgICBzaXplb2YoZHZiLT5mZVswXS0+b3BzLnR1bmVyX29wcykpOwogCiAJCWJyZWFrOworCWNhc2UgRU0yODE3NF9CT0FSRF9QQ1RWXzQ2MEU6CisJCS8qIGF0dGFjaCBkZW1vZCAqLworCQlkdmItPmZlWzBdID0gZHZiX2F0dGFjaCh0ZGExMDA3MV9hdHRhY2gsCisJCQkmZW0yOHh4X3RkYTEwMDcxX2NvbmZpZywgJmRldi0+aTJjX2FkYXApOworCisJCS8qIGF0dGFjaCBTRUMgKi8KKwkJaWYgKGR2Yi0+ZmVbMF0pCisJCQlkdmJfYXR0YWNoKGE4MjkzX2F0dGFjaCwgZHZiLT5mZVswXSwgJmRldi0+aTJjX2FkYXAsCisJCQkJJmVtMjh4eF9hODI5M19jb25maWcpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllbTI4eHhfZXJyZGV2KCIvMjogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCIKIAkJCQkiIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIpOwpAQCAtODIzLDExICs4NDcsMTQgQEAKIAlkdmItPmZlWzBdLT5jYWxsYmFjayA9IGVtMjh4eF90dW5lcl9jYWxsYmFjazsKIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KLQlyZXN1bHQgPSByZWdpc3Rlcl9kdmIoZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT51ZGV2LT5kZXYpOworCXJlc3VsdCA9IGVtMjh4eF9yZWdpc3Rlcl9kdmIoZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT51ZGV2LT5kZXYpOwogCiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAKKwkvKiBNRkUgbG9jayAqLworCWR2Yi0+YWRhcHRlci5tZmVfc2hhcmVkID0gbWZlX3NoYXJlZDsKKwogCWVtMjh4eF9pbmZvKCJTdWNjZXNzZnVsbHkgbG9hZGVkIGVtMjh4eC1kdmJcbiIpOwogcmV0OgogCWVtMjh4eF9zZXRfbW9kZShkZXYsIEVNMjhYWF9TVVNQRU5EKTsKQEAgLTg0MCw3ICs4NjcsMTQgQEAKIAlnb3RvIHJldDsKIH0KIAotc3RhdGljIGludCBkdmJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJldmVudF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyAqb3BzKQoreworCW9wcy0+c2V0X3ZvbHRhZ2UgPSBOVUxMOworCW9wcy0+c2xlZXAgPSBOVUxMOworCW9wcy0+dHVuZXJfb3BzLnNsZWVwID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbTI4eHhfZHZiX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KQogewogCWlmICghZGV2LT5ib2FyZC5oYXNfZHZiKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAqLwpAQCAtODQ4LDggKzg4MiwxOSBAQAogCX0KIAogCWlmIChkZXYtPmR2YikgewotCQl1bnJlZ2lzdGVyX2R2YihkZXYtPmR2Yik7Ci0JCWtmcmVlKGRldi0+ZHZiKTsKKwkJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGRldi0+ZHZiOworCisJCWlmIChkZXYtPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgeworCQkJLyogV2UgY2Fubm90IHRlbGwgdGhlIGRldmljZSB0byBzbGVlcAorCQkJICogb25jZSBpdCBoYXMgYmVlbiB1bnBsdWdnZWQuICovCisJCQlpZiAoZHZiLT5mZVswXSkKKwkJCQlwcmV2ZW50X3NsZWVwKCZkdmItPmZlWzBdLT5vcHMpOworCQkJaWYgKGR2Yi0+ZmVbMV0pCisJCQkJcHJldmVudF9zbGVlcCgmZHZiLT5mZVsxXS0+b3BzKTsKKwkJfQorCisJCWVtMjh4eF91bnJlZ2lzdGVyX2R2YihkdmIpOworCQlrZnJlZShkdmIpOwogCQlkZXYtPmR2YiA9IE5VTEw7CiAJfQogCkBAIC04NTksOCArOTA0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgZW0yOHh4X29wcyBkdmJfb3BzID0gewogCS5pZCAgID0gRU0yOFhYX0RWQiwKIAkubmFtZSA9ICJFbTI4eHggZHZiIEV4dGVuc2lvbiIsCi0JLmluaXQgPSBkdmJfaW5pdCwKLQkuZmluaSA9IGR2Yl9maW5pLAorCS5pbml0ID0gZW0yOHh4X2R2Yl9pbml0LAorCS5maW5pID0gZW0yOHh4X2R2Yl9maW5pLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZW0yOHh4X2R2Yl9yZWdpc3Rlcih2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwppbmRleCA1ZDEyYjE0Li42NzlkYTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwpAQCAtNDYzLDExICs0NjMsMTEgQEAKIAlpZiAoIWlyKQogCQlyZXR1cm4gMDsKIAotCWVtMjh4eF9pcl9zdG9wKGlyLT5yYyk7Ci0JcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKLQlrZnJlZShpcik7CisJaWYgKGlyLT5yYykKKwkJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKIAogCS8qIGRvbmUgKi8KKwlrZnJlZShpcik7CiAJZGV2LT5pciA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IGQxNzZkYzAuLjliNDU1N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC0xMTU2LDYgKzExNTYsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpub3JtKQoreworCXN0cnVjdCBlbTI4eHhfZmggICAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgZW0yOHh4ICAgICAgKmRldiA9IGZoLT5kZXY7CisJaW50ICAgICAgICAgICAgICAgIHJjOworCisJcmMgPSBjaGVja19kZXYoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdmlkZW8sIHF1ZXJ5c3RkLCBub3JtKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKm5vcm0pCiB7CiAJc3RydWN0IGVtMjh4eF9maCAgICpmaCAgPSBwcml2OwpAQCAtMTc4Nyw2ICsxODAyLDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4X2ZoICAgICAgKmZoICA9IHByaXY7CisJc3RydWN0IGVtMjh4eCAgICAgICAgICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBlbTI4eHhfZm10ICAgICAqZm10OworCXVuc2lnbmVkIGludAkgICAgICBtYXh3ID0gbm9ybV9tYXh3KGRldik7CisJdW5zaWduZWQgaW50CSAgICAgIG1heGggPSBub3JtX21heGgoZGV2KTsKKworCWZtdCA9IGZvcm1hdF9ieV9mb3VyY2MoZnNpemUtPnBpeGVsX2Zvcm1hdCk7CisJaWYgKCFmbXQpIHsKKwkJZW0yOHh4X3ZpZGVvZGJnKCJGb3VyY2MgZm9ybWF0ICglMDh4KSBpbnZhbGlkLlxuIiwKKwkJCQlmc2l6ZS0+cGl4ZWxfZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRldi0+Ym9hcmQuaXNfZW0yODAwKSB7CisJCWlmIChmc2l6ZS0+aW5kZXggPiAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEU7CisJCWZzaXplLT5kaXNjcmV0ZS53aWR0aCA9IG1heHcgLyAoMSArIGZzaXplLT5pbmRleCk7CisJCWZzaXplLT5kaXNjcmV0ZS5oZWlnaHQgPSBtYXhoIC8gKDEgKyBmc2l6ZS0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZnNpemUtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVwb3J0IGEgY29udGludW91cyByYW5nZSAqLworCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0U7CisJZnNpemUtPnN0ZXB3aXNlLm1pbl93aWR0aCA9IDQ4OworCWZzaXplLT5zdGVwd2lzZS5taW5faGVpZ2h0ID0gMzI7CisJZnNpemUtPnN0ZXB3aXNlLm1heF93aWR0aCA9IG1heHc7CisJZnNpemUtPnN0ZXB3aXNlLm1heF9oZWlnaHQgPSBtYXhoOworCWZzaXplLT5zdGVwd2lzZS5zdGVwX3dpZHRoID0gMTsKKwlmc2l6ZS0+c3RlcHdpc2Uuc3RlcF9oZWlnaHQgPSAxOworCXJldHVybiAwOworfQorCiAvKiBTbGljZWQgVkJJIGlvY3RscyAqLwogc3RhdGljIGludCB2aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKQEAgLTIyMDAsNiArMjI1NCw3IEBACiAJCSAgIGZyZWUgdGhlIHJlbWFpbmluZyByZXNvdXJjZXMgKi8KIAkJaWYgKGRldi0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSB7CiAJCQllbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKKwkJCWtmcmVlKGRldi0+YWx0X21heF9wa3Rfc2l6ZSk7CiAJCQlrZnJlZShkZXYpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIzNDAsMTAgKzIzOTUsMTAgQEAKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKIAkudmlkaW9jX2dfZm10X3ZiaV9jYXAgICAgICAgPSB2aWRpb2NfZ19mbXRfdmJpX2NhcCwKIAkudmlkaW9jX3NfZm10X3ZiaV9jYXAgICAgICAgPSB2aWRpb2Nfc19mbXRfdmJpX2NhcCwKKwkudmlkaW9jX2VudW1fZnJhbWVzaXplcyAgICAgPSB2aWRpb2NfZW51bV9mcmFtZXNpemVzLAogCS52aWRpb2NfZ19hdWRpbyAgICAgICAgICAgICA9IHZpZGlvY19nX2F1ZGlvLAogCS52aWRpb2Nfc19hdWRpbyAgICAgICAgICAgICA9IHZpZGlvY19zX2F1ZGlvLAogCS52aWRpb2NfY3JvcGNhcCAgICAgICAgICAgICA9IHZpZGlvY19jcm9wY2FwLAotCiAJLnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX2NhcCAgID0gdmlkaW9jX2dfZm10X3NsaWNlZF92YmlfY2FwLAogCS52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX2NhcCA9IHZpZGlvY190cnlfc2V0X3NsaWNlZF92YmlfY2FwLAogCS52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9jYXAgICA9IHZpZGlvY190cnlfc2V0X3NsaWNlZF92YmlfY2FwLApAQCAtMjM1Myw2ICsyNDA4LDcgQEAKIAkudmlkaW9jX3FidWYgICAgICAgICAgICAgICAgPSB2aWRpb2NfcWJ1ZiwKIAkudmlkaW9jX2RxYnVmICAgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCiAJLnZpZGlvY19nX3N0ZCAgICAgICAgICAgICAgID0gdmlkaW9jX2dfc3RkLAorCS52aWRpb2NfcXVlcnlzdGQgICAgICAgICAgICA9IHZpZGlvY19xdWVyeXN0ZCwKIAkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgICAgPSB2aWRpb2Nfc19zdGQsCiAJLnZpZGlvY19nX3Bhcm0JCSAgICA9IHZpZGlvY19nX3Bhcm0sCiAJLnZpZGlvY19zX3Bhcm0JCSAgICA9IHZpZGlvY19zX3Bhcm0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCmluZGV4IGQ4MDY1OGIuLjJhMmNiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCkBAIC0xMjAsNiArMTIwLDcgQEAKICNkZWZpbmUgRU0yODc0X0JPQVJEX0xFQURFUlNISVBfSVNEQlQJCSAgNzcKICNkZWZpbmUgRU0yODE3NF9CT0FSRF9QQ1RWXzI5MEUgICAgICAgICAgICAgICAgICAgNzgKICNkZWZpbmUgRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1CQkgIDc5CisjZGVmaW5lIEVNMjgxNzRfQk9BUkRfUENUVl80NjBFICAgICAgICAgICAgICAgICAgIDgwCiAKIC8qIExpbWl0cyBtaW5pbXVtIGFuZCBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCiAjZGVmaW5lIEVNMjhYWF9NSU5fQlVGIDQKQEAgLTY3Nyw4ICs2NzgsNiBAQAogaW50IGVtMjh4eF9zZXRfbW9kZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgc2V0X21vZGUpOwogaW50IGVtMjh4eF9ncGlvX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSAqZ3Bpbyk7CiB2b2lkIGVtMjh4eF93YWtlX2kyYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfYWRkX2ludG9fZGV2bGlzdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IGVtMjh4eF9vcHMgKmRldik7CiB2b2lkIGVtMjh4eF91bnJlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgZW0yOHh4X29wcyAqZGV2KTsKIHZvaWQgZW0yOHh4X2luaXRfZXh0ZW5zaW9uKHN0cnVjdCBlbTI4eHggKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmgKaW5kZXggMTRiYjkwNy4uMzM3ZGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTEuaApAQCAtMTY1LDQ1ICsxNjUsNDkgQEAKICN1bmRlZiBEQkcKICN1bmRlZiBLREJHCiAjaWZkZWYgRVQ2MVgyNTFfREVCVUcKLSMJZGVmaW5lIERCRyhsZXZlbCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZGVidWcgPj0gKGxldmVsKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoKGxldmVsKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWRldl9lcnIoJmNhbS0+dXNiZGV2LT5kZXYsIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgIFwKLQkJZWxzZSBpZiAoKGxldmVsKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgZm10ICJcbiIsICMjIGFyZ3MpOyAgICAgICBcCi0JCWVsc2UgaWYgKChsZXZlbCkgPj0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJZGV2X2luZm8oJmNhbS0+dXNiZGV2LT5kZXYsICJbJXM6JXM6JWRdICIgZm10ICJcbiIsICAgXAotCQkJCSBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fICwgIyMgYXJncyk7IFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBEQkcobGV2ZWwsIGZtdCwgLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGRlYnVnID49IChsZXZlbCkpIHsJCQkJCQlcCisJCWlmICgobGV2ZWwpID09IDEpCQkJCQlcCisJCQlkZXZfZXJyKCZjYW0tPnVzYmRldi0+ZGV2LCBmbXQgIlxuIiwJCVwKKwkJCQkjI19fVkFfQVJHU19fKTsJCQkJXAorCQllbHNlIGlmICgobGV2ZWwpID09IDIpCQkJCQlcCisJCQlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgZm10ICJcbiIsCQlcCisJCQkJICMjX19WQV9BUkdTX18pOwkJCVwKKwkJZWxzZSBpZiAoKGxldmVsKSA+PSAzKQkJCQkJXAorCQkJZGV2X2luZm8oJmNhbS0+dXNiZGV2LT5kZXYsICJbJXM6JXM6JWRdICIgZm10ICJcbiIsIFwKKwkJCQkgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywJCVwKKwkJCQkgIyNfX1ZBX0FSR1NfXyk7CQkJXAorCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCi0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGRlYnVnID49IChsZXZlbCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKChsZXZlbCkgPT0gMSB8fCAobGV2ZWwpID09IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcl9pbmZvKCJldDYxeDI1MTogIiBmbXQgIlxuIiwgIyMgYXJncyk7ICAgICAgICAgICAgICBcCi0JCWVsc2UgaWYgKChsZXZlbCkgPT0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJfZGVidWcoInNuOWMxMDI6IFslczolczolZF0gIiBmbXQgIlxuIiwgX19GSUxFX18sICAgXAotCQkJCSBfX2Z1bmNfXywgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBLREJHKGxldmVsLCBmbXQsIC4uLikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSB7CQkJCQkJXAorCQlpZiAoKGxldmVsKSA9PSAxIHx8IChsZXZlbCkgPT0gMikJCQlcCisJCQlwcl9pbmZvKGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsJCVwKKwkJZWxzZSBpZiAoKGxldmVsKSA9PSAzKQkJCQkJXAorCQkJcHJfZGVidWcoIlslczolczolZF0gIiBmbXQgIlxuIiwJCVwKKwkJCQkgX19GSUxFX18sICBfX2Z1bmNfXywgX19MSU5FX18sCQlcCisJCQkJICMjX19WQV9BUkdTX18pOwkJCVwKKwl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQotIwlkZWZpbmUgVjRMREJHKGxldmVsLCBuYW1lLCBjbWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChkZWJ1ZyA+PSAobGV2ZWwpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXY0bF9wcmludF9pb2N0bChuYW1lLCBjbWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGRlYnVnID49IChsZXZlbCkpCQkJCQkJXAorCQl2NGxfcHJpbnRfaW9jdGwobmFtZSwgY21kKTsJCQkJXAogfSB3aGlsZSAoMCkKICNlbHNlCi0jCWRlZmluZSBEQkcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApCi0jCWRlZmluZSBLREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKQotIwlkZWZpbmUgVjRMREJHKGxldmVsLCBuYW1lLCBjbWQpIGRvIHs7fSB3aGlsZSgwKQorI2RlZmluZSBEQkcobGV2ZWwsIGZtdCwgLi4uKSBkbyB7O30gd2hpbGUoMCkKKyNkZWZpbmUgS0RCRyhsZXZlbCwgZm10LCAuLi4pIGRvIHs7fSB3aGlsZSgwKQorI2RlZmluZSBWNExEQkcobGV2ZWwsIG5hbWUsIGNtZCkgZG8gezt9IHdoaWxlKDApCiAjZW5kaWYKIAogI3VuZGVmIFBEQkcKLSNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRldl9pbmZvKCZjYW0tPnVzYmRldi0+ZGV2LCAiWyVzOiVzOiVkXSAiIGZtdCAiXG4iLCBfX0ZJTEVfXywgX19mdW5jX18sICAgXAotCSBfX0xJTkVfXyAsICMjIGFyZ3MpCisjZGVmaW5lIFBEQkcoZm10LCAuLi4pCQkJCQkJCVwKKwlkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgIlslczolczolZF0gIiBmbXQgIlxuIiwJCVwKKwkJIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pCiAKICN1bmRlZiBQREJHRwotI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSgwKSAvKiBwbGFjZWhvbGRlciAqLworI2RlZmluZSBQREJHRyhmbXQsIGFyZ3MuLi4pIGRvIHs7fSB3aGlsZSAoMCkgLyogcGxhY2Vob2xkZXIgKi8KIAogI2VuZGlmIC8qIF9FVDYxWDI1MV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwppbmRleCA5YTFlODBhLi5kMzc3N2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfdGFzNTEzMGQxYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKaW5kZXggMDRiN2ZiYi4uY2VkMmUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV90YXM1MTMwZDFiLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgImV0NjF4MjUxX3NlbnNvci5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwppbmRleCA0M2Q5YTIwLi4xMDNhZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCkBAIC0zNTYsNiArMzU2LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV90NjEzLgogCitjb25maWcgVVNCX0dTUENBX1RPUFJPCisJdHJpc3RhdGUgIlRPUFJPIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlCisJICBUUDY4MDAgYW5kIFRQNjgxMCBUb3BybyBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfdG9wcm8uCisKIGNvbmZpZyBVU0JfR1NQQ0FfVFY4NTMyCiAJdHJpc3RhdGUgIlRWODUzMiBVU0IgQ2FtZXJhIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQppbmRleCBkNjM2NGE4Li5mMzQ1ZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDcgQEAKIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU1RLMDE0KSAgICs9IGdzcGNhX3N0azAxNC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NUVjA2ODApICArPSBnc3BjYV9zdHYwNjgwLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfVDYxMykgICAgICs9IGdzcGNhX3Q2MTMubworb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9UT1BSTykgICAgKz0gZ3NwY2FfdG9wcm8ubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9UVjg1MzIpICAgKz0gZ3NwY2FfdHY4NTMyLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfVkMwMzJYKSAgICs9IGdzcGNhX3ZjMDMyeC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1ZJQ0FNKSAgICArPSBnc3BjYV92aWNhbS5vCkBAIC03OCw2ICs3OSw3IEBACiBnc3BjYV9zdHYwNjgwLW9ianMgIDo9IHN0djA2ODAubwogZ3NwY2Ffc3VucGx1cy1vYmpzICA6PSBzdW5wbHVzLm8KIGdzcGNhX3Q2MTMtb2JqcyAgICAgOj0gdDYxMy5vCitnc3BjYV90b3Byby1vYmpzICAgIDo9IHRvcHJvLm8KIGdzcGNhX3R2ODUzMi1vYmpzICAgOj0gdHY4NTMyLm8KIGdzcGNhX3ZjMDMyeC1vYmpzICAgOj0gdmMwMzJ4Lm8KIGdzcGNhX3ZpY2FtLW9ianMgICAgOj0gdmljYW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9iZW5xLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYwppbmRleCBhMDljNDcwLi42YWUyNjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2JlbnEuYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImJlbnEiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtNjIsNyArNjQsNyBAQAogCQkJMCwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTg0LDIwICs4Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RfaXNvY19pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsCi0JCWdzcGNhX2Rldi0+bmJhbHQgLSAxKTsKLQlpZiAocmV0IDwgMCkgewotCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlIGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLS8qCXJlZ193KGdzcGNhX2RldiwgMHgwMDAzLCAweDAwMDIpOyAqLwotCXJldHVybiAwOwotfQotCiAvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCiBzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKQEAgLTExMyw3ICsxMDEsNyBAQAogCWZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihTRF9OUEtULCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CkBAIC0xMjMsNyArMTExLDcgQEAKIAkJCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2FsbG9jX2NvaGVyZW50IGZhaWxlZCIpOworCQkJcHJfZXJyKCJ1c2JfYWxsb2NfY29oZXJlbnQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVyYi0+ZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC0xODEsNyArMTY5LDcgQEAKIAkJaWYgKGdzcGNhX2Rldi0+ZnJvemVuKQogCQkJcmV0dXJuOwogI2VuZGlmCi0JCWVycigidXJiIHN0YXR1czogJWQiLCB1cmItPnN0YXR1cyk7CisJCXByX2VycigidXJiIHN0YXR1czogJWRcbiIsIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjA5LDcgKzE5Nyw3IEBACiAJCWlmIChzdCA9PSAwKQogCQkJc3QgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIAkJaWYgKHN0KSB7Ci0JCQllcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBzdGF0dXM9JWQiLAorCQkJcHJfZXJyKCJJU09DIGRhdGEgZXJyb3I6IFslZF0gc3RhdHVzPSVkXG4iLAogCQkJCWksIHN0KTsKIAkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCQkJY29udGludWU7CkBAIC0yNTYsMTAgKzI0NCwxMCBAQAogCS8qIHJlc3VibWl0IHRoZSBVUkJzICovCiAJc3QgPSB1c2Jfc3VibWl0X3VyYih1cmIwLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3QgPCAwKQotCQllcnIoInVzYl9zdWJtaXRfdXJiKDApIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigwKSByZXQgJWRcbiIsIHN0KTsKIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogfQogCiAvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCkBAIC0yNjksNyArMjU3LDYgQEAKIAkubmN0cmxzID0gQVJSQVlfU0laRShzZF9jdHJscyksCiAJLmNvbmZpZyA9IHNkX2NvbmZpZywKIAkuaW5pdCA9IHNkX2luaXQsCi0JLmlzb2NfaW5pdCA9IHNkX2lzb2NfaW5pdCwKIAkuc3RhcnQgPSBzZF9zdGFydCwKIAkuc3RvcE4gPSBzZF9zdG9wTiwKIAkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY29uZXguYwppbmRleCA4YjM5ODQ5Li40YzU2ZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NvbmV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jb25leC5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAiY29uZXgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTI5LDcgKzEzMSw3IEBACiAKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0xNjksNyArMTcxLDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfdzogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAJUERFQlVHKERfVVNCTywgInJlZyB3cml0ZSBbJTAyeF0gPSAlMDJ4Li4iLCBpbmRleCwgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NwaWExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2NwaWExLmMKaW5kZXggZjJhOTQ1MS4uZjliODZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9jcGlhMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvY3BpYTEuYwpAQCAtMjYsNiArMjYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImNwaWExIgogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTU1MCw4ICs1NTIsNyBAQAogCQkJICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmLCBkYXRhYnl0ZXMsIDEwMDApOwogCiAJaWYgKHJldCA8IDApCi0JCWVycigidXNiX2NvbnRyb2xfbXNnICUwMngsIGVycm9yICVkIiwgY29tbWFuZFsxXSwKLQkJICAgICAgIHJldCk7CisJCXByX2VycigidXNiX2NvbnRyb2xfbXNnICUwMngsIGVycm9yICVkXG4iLCBjb21tYW5kWzFdLCByZXQpOwogCiAJaWYgKHJldCA9PSAtRVBJUEUgJiYgcmV0cmllcyA+IDApIHsKIAkJcmV0cmllcy0tOwpAQCAtMTI3OSw3ICsxMjgwLDcgQEAKIAljbWRbN10gPSAwOwogCXJldCA9IGNwaWFfdXNiX3RyYW5zZmVyQ21kKGdzcGNhX2RldiwgY21kKTsKIAlpZiAocmV0KSB7Ci0JCWVycigiUmVhZFZQUmVncygzMCw0LDksOCkgLSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJSZWFkVlBSZWdzKDMwLDQsOSw4KSAtIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCXJldHVybjsKIAl9CiAJZXhwX2FjYyA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZXRvbXMuYwppbmRleCA0YjJjNDgzLi4wMzU3ZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2V0b21zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9ldG9tcy5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAiZXRvbXMiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMjM2LDcgKzIzOCw3IEBACiAKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0yNzQsNyArMjc2LDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfdzogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAJUERFQlVHKERfVVNCTywgInJlZyB3cml0ZSBbJTAyeF0gPSAlMDJ4Li4iLCBpbmRleCwgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2ZpbmVwaXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZmluZXBpeC5jCmluZGV4IDk4N2I0YjY5ZC4uZWE0ODIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9maW5lcGl4LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJmaW5lcGl4IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTE4Miw3ICsxODQsNyBAQAogCS8qIEluaXQgdGhlIGRldmljZSAqLwogCXJldCA9IGNvbW1hbmQoZ3NwY2FfZGV2LCAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoImluaXQgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJpbml0IGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE5NCwxNCArMTk2LDE0IEBACiAJCQlGUElYX01BWF9UUkFOU0ZFUiwgJmxlbiwKIAkJCUZQSVhfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJ1c2JfYnVsa19tc2cgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJ1c2JfYnVsa19tc2cgZmFpbGVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIFJlcXVlc3QgYSBmcmFtZSwgYnV0IGRvbid0IHJlYWQgaXQgKi8KIAlyZXQgPSBjb21tYW5kKGdzcGNhX2RldiwgMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJmcmFtZSByZXF1ZXN0IGZhaWxlZCAlZCIsIHJldCk7CisJCXByX2VycigiZnJhbWUgcmVxdWVzdCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9NYWtlZmlsZQppbmRleCAxM2M5NDAzLi5mNTExZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvTWFrZWZpbGUKQEAgLTYsNSArNiw1IEBACiAJCSAgICBnbDg2MC1vdjk2NTUubyBcCiAJCSAgICBnbDg2MC1taTIwMjAubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuYwppbmRleCBlOGUwNzFhLi4yY2VkM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5jCkBAIC0xOCw2ICsxOCw5IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAiZ3NwY2EuaCIKICNpbmNsdWRlICJnbDg2MC5oIgogCkBAIC01NzIsOSArNTc1LDggQEAKIAl9CiAKIAlpZiAociA8IDApCi0JCWVycigiY3RybCB0cmFuc2ZlciBmYWlsZWQgJTRkICIKLQkJCSJbcCUwMnggciVkIHYlMDR4IGklMDR4IGxlbiVkXSIsCi0JCQlyLCBwcmVmLCByZXEsIHZhbCwgaW5kZXgsIGxlbik7CisJCXByX2VycigiY3RybCB0cmFuc2ZlciBmYWlsZWQgJTRkIFtwJTAyeCByJWQgdiUwNHggaSUwNHggbGVuJWRdXG4iLAorCQkgICAgICAgciwgcHJlZiwgcmVxLCB2YWwsIGluZGV4LCBsZW4pOwogCWVsc2UgaWYgKGxlbiA+IDEgJiYgciA8IGxlbikKIAkJUERFQlVHKERfRVJSLCAic2hvcnQgY3RybCB0cmFuc2ZlciAlZC8lZCIsIHIsIGxlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwppbmRleCA1ZGE0ODc5Li44ODFlMDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCkBAIC0yMSw3ICsyMSw5IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jZGVmaW5lIE1PRFVMRV9OQU1FICJnc3BjYSIKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2RlZmluZSBHU1BDQV9WRVJTSU9OCSIyLjE0LjAiCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTUwLDEyICs1MiwxMCBAQAogI2Vycm9yICJERUZfTlVSQlMgdG9vIGJpZyIKICNlbmRpZgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUgkiMi4xMy4wIgotCiBNT0RVTEVfQVVUSE9SKCJKZWFuLUZyYW7Dp29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OX05VTUJFUik7CitNT0RVTEVfVkVSU0lPTihHU1BDQV9WRVJTSU9OKTsKIAogI2lmZGVmIEdTUENBX0RFQlVHCiBpbnQgZ3NwY2FfZGVidWcgPSBEX0VSUiB8IERfUFJPQkU7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpZiAocmV0ID09IDApIHsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApCi0JCQllcnIoIlJlc3VibWl0IFVSQiBmYWlsZWQgd2l0aCBlcnJvciAlaSIsIHJldCk7CisJCQlwcl9lcnIoIlJlc3VibWl0IFVSQiBmYWlsZWQgd2l0aCBlcnJvciAlaVxuIiwgcmV0KTsKIAl9CiB9CiAKQEAgLTE3Nyw4ICsxNzcsOCBAQAogCiAJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwogCQlpZiAoZXJyKSB7Ci0JCQllcnIoIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWkiLAotCQkJCWVycik7CisJCQlwcl9lcnIoIklucHV0IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWlcbiIsCisJCQkgICAgICAgZXJyKTsKIAkJCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCQl9IGVsc2UgewpAQCAtMzIzLDggKzMyMyw4IEBACiAJCS8qIGNoZWNrIHRoZSBwYWNrZXQgc3RhdHVzIGFuZCBsZW5ndGggKi8KIAkJc3QgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIAkJaWYgKHN0KSB7Ci0JCQllcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBsZW49JWQsIHN0YXR1cz0lZCIsCi0JCQkJaSwgbGVuLCBzdCk7CisJCQlwcl9lcnIoIklTT0MgZGF0YSBlcnJvcjogWyVkXSBsZW49JWQsIHN0YXR1cz0lZFxuIiwKKwkJCSAgICAgICBpLCBsZW4sIHN0KTsKIAkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOwogCQkJY29udGludWU7CiAJCX0KQEAgLTM0Niw3ICszNDYsNyBAQAogCS8qIHJlc3VibWl0IHRoZSBVUkIgKi8KIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0IDwgMCkKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZCIsIHN0KTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogfQogCiAvKgpAQCAtNDAwLDcgKzQwMCw3IEBACiAJaWYgKGdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgIT0gMCkgewogCQlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdCA8IDApCi0JCQllcnIoInVzYl9zdWJtaXRfdXJiKCkgcmV0ICVkIiwgc3QpOworCQkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYigpIHJldCAlZFxuIiwgc3QpOwogCX0KIH0KIApAQCAtNDY0LDcgKzQ2NCw3IEBACiAJCX0gZWxzZSB7CiAvKiAhISBpbWFnZSBpcyBOVUxMIG9ubHkgd2hlbiBsYXN0IHBrdCBpcyBMQVNUIG9yIERJU0NBUkQKIAkJCWlmIChnc3BjYV9kZXYtPmltYWdlID09IE5VTEwpIHsKLQkJCQllcnIoImdzcGNhX2ZyYW1lX2FkZCgpIGltYWdlID09IE5VTEwiKTsKKwkJCQlwcl9lcnIoImdzcGNhX2ZyYW1lX2FkZCgpIGltYWdlID09IE5VTExcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KICAqLwpAQCAtNDk3LDE5ICs0OTcsNiBAQAogfQogRVhQT1JUX1NZTUJPTChnc3BjYV9mcmFtZV9hZGQpOwogCi1zdGF0aWMgaW50IGdzcGNhX2lzX2NvbXByZXNzZWQoX191MzIgZm9ybWF0KQotewotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTUpQRUc6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfSlBFRzoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUENBNTYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1BBQzIwNzoKLQljYXNlIFY0TDJfUElYX0ZNVF9NUjk3MzEwQToKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGZyYW1lX2FsbG9jKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldiwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQllbnVtIHY0bDJfbWVtb3J5IG1lbW9yeSwgdW5zaWduZWQgaW50IGNvdW50KQogewpAQCAtNTI1LDcgKzUxMiw3IEBACiAJCWNvdW50ID0gR1NQQ0FfTUFYX0ZSQU1FUyAtIDE7CiAJZ3NwY2FfZGV2LT5mcmJ1ZiA9IHZtYWxsb2NfMzIoZnJzeiAqIGNvdW50KTsKIAlpZiAoIWdzcGNhX2Rldi0+ZnJidWYpIHsKLQkJZXJyKCJmcmFtZSBhbGxvYyBmYWlsZWQiKTsKKwkJcHJfZXJyKCJmcmFtZSBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZ3NwY2FfZGV2LT5jYXB0X2ZpbGUgPSBmaWxlOwpAQCAtNTk3LDcgKzU4NCw3IEBACiAJCXJldHVybiAwOwogCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJzZXQgYWx0IDAgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzZXQgYWx0IDAgZXJyICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0MCw1MyArNjI3LDEwNCBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogbG9vayBmb3IgYW4gaW5wdXQgKGlzb2Mgb3IgYnVsaykgZW5kcG9pbnQKLSAqCi0gKiBUaGUgZW5kcG9pbnQgaXMgZGVmaW5lZCBieSB0aGUgc3ViZHJpdmVyLgotICogVXNlIG9ubHkgdGhlIGZpcnN0IGlzb2MgKHNvbWUgWm9yYW4gLSAweDA1NzI6MHgwMDAxIC0gaGF2ZSB0d28gc3VjaCBlcCkuCi0gKiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBtYW55IHRpbWVzIHdoZW4gdGhlIGJhbmR3aWR0aCBpcyB0b28gc21hbGwKLSAqICh0aGUgYmFuZHdpZHRoIGlzIGNoZWNrZWQgb24gdXJiIHN1Ym1pdCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmdldF9lcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCisvKiBjb21wdXRlIHRoZSBtaW5pbXVtIGJhbmR3aWR0aCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmZXIgKi8KK3N0YXRpYyB1MzIgd2hpY2hfYmFuZHdpZHRoKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKIHsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOwotCWludCB4ZmVyLCBpLCByZXQ7CisJdTMyIGJhbmR3aWR0aDsKKwlpbnQgaTsKIAotCWludGYgPSB1c2JfaWZudW1fdG9faWYoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UpOwotCWVwID0gTlVMTDsKLQl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKLQkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7Ci0JaSA9IGdzcGNhX2Rldi0+YWx0OwkJCS8qIHByZXZpb3VzIGFsdCBzZXR0aW5nICovCi0JaWYgKGdzcGNhX2Rldi0+Y2FtLnJldmVyc2VfYWx0cykgewotCQl3aGlsZSAoKytpIDwgZ3NwY2FfZGV2LT5uYmFsdCkgewotCQkJZXAgPSBhbHRfeGZlcigmaW50Zi0+YWx0c2V0dGluZ1tpXSwgeGZlcik7Ci0JCQlpZiAoZXApCi0JCQkJYnJlYWs7Ci0JCX0KKwlpID0gZ3NwY2FfZGV2LT5jdXJyX21vZGU7CisJYmFuZHdpZHRoID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0uc2l6ZWltYWdlOworCisJLyogaWYgdGhlIGltYWdlIGlzIGNvbXByZXNzZWQsIGVzdGltYXRlIHRoZSBtZWFuIGltYWdlIHNpemUgKi8KKwlpZiAoYmFuZHdpZHRoIDwgZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0ud2lkdGggKgorCQkJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2ldLmhlaWdodCkKKwkJYmFuZHdpZHRoIC89IDM7CisKKwkvKiBlc3RpbWF0ZSB0aGUgZnJhbWUgcmF0ZSAqLworCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmdldF9zdHJlYW1wYXJtKSB7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gcGFybTsKKworCQlwYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSAxNTsKKwkJZ3NwY2FfZGV2LT5zZF9kZXNjLT5nZXRfc3RyZWFtcGFybShnc3BjYV9kZXYsICZwYXJtKTsKKwkJYmFuZHdpZHRoICo9IHBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcjsKIAl9IGVsc2UgewotCQl3aGlsZSAoLS1pID49IDApIHsKLQkJCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbaV0sIHhmZXIpOwotCQkJaWYgKGVwKQotCQkJCWJyZWFrOworCQliYW5kd2lkdGggKj0gMTU7CQkvKiAxNSBmcHMgKi8KKwl9CisKKwlQREVCVUcoRF9TVFJFQU0sICJtaW4gYmFuZHdpZHRoOiAlZCIsIGJhbmR3aWR0aCk7CisJcmV0dXJuIGJhbmR3aWR0aDsKK30KKworLyogZW5kcG9pbnQgdGFibGUgKi8KKyNkZWZpbmUgTUFYX0FMVCAxNgorc3RydWN0IGVwX3RiX3MgeworCXUzMiBhbHQ7CisJdTMyIGJhbmR3aWR0aDsKK307CisKKy8qCisgKiBidWlsZCB0aGUgdGFibGUgb2YgdGhlIGVuZHBvaW50cworICogYW5kIGNvbXB1dGUgdGhlIG1pbmltdW0gYmFuZHdpZHRoIGZvciB0aGUgaW1hZ2UgdHJhbnNmZXIKKyAqLworc3RhdGljIGludCBidWlsZF9lcF90YihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWludCB4ZmVyLAorCQkJc3RydWN0IGVwX3RiX3MgKmVwX3RiKQoreworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CisJaW50IGksIGosIG5iYWx0LCBwc2l6ZSwgZm91bmQ7CisJdTMyIGJhbmR3aWR0aCwgbGFzdF9idzsKKworCW5iYWx0ID0gaW50Zi0+bnVtX2FsdHNldHRpbmc7CisJaWYgKG5iYWx0ID4gTUFYX0FMVCkKKwkJbmJhbHQgPSBNQVhfQUxUOwkvKiBmaXhtZTogc2hvdWxkIHdhcm4gKi8KKworCS8qIGJ1aWxkIHRoZSBlbmRwb2ludCB0YWJsZSAqLworCWkgPSAwOworCWxhc3RfYncgPSAwOworCWZvciAoOzspIHsKKwkJZXBfdGItPmJhbmR3aWR0aCA9IDIwMDAgKiAyMDAwICogMTIwOworCQlmb3VuZCA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBuYmFsdDsgaisrKSB7CisJCQllcCA9IGFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2pdLCB4ZmVyKTsKKwkJCWlmIChlcCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJcHNpemUgPSBsZTE2X3RvX2NwdShlcC0+ZGVzYy53TWF4UGFja2V0U2l6ZSk7CisJCQlpZiAoIWdzcGNhX2Rldi0+Y2FtLmJ1bGspCQkvKiBpc29jICovCisJCQkJcHNpemUgPSAocHNpemUgJiAweDA3ZmYpICoKKwkJCQkJCSgxICsgKChwc2l6ZSA+PiAxMSkgJiAzKSk7CisJCQliYW5kd2lkdGggPSBwc2l6ZSAqIGVwLT5kZXNjLmJJbnRlcnZhbCAqIDEwMDA7CisJCQlpZiAoZ3NwY2FfZGV2LT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdICisJCQkgfHwgZ3NwY2FfZGV2LT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJCQliYW5kd2lkdGggKj0gODsKKwkJCWlmIChiYW5kd2lkdGggPD0gbGFzdF9idykKKwkJCQljb250aW51ZTsKKwkJCWlmIChiYW5kd2lkdGggPCBlcF90Yi0+YmFuZHdpZHRoKSB7CisJCQkJZXBfdGItPmJhbmR3aWR0aCA9IGJhbmR3aWR0aDsKKwkJCQllcF90Yi0+YWx0ID0gajsKKwkJCQlmb3VuZCA9IDE7CisJCQl9CiAJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCWJyZWFrOworCQlQREVCVUcoRF9TVFJFQU0sICJhbHQgJWQgYmFuZHdpZHRoICVkIiwKKwkJCQllcF90Yi0+YWx0LCBlcF90Yi0+YmFuZHdpZHRoKTsKKwkJbGFzdF9idyA9IGVwX3RiLT5iYW5kd2lkdGg7CisJCWkrKzsKKwkJZXBfdGIrKzsKIAl9Ci0JaWYgKGVwID09IE5VTEwpIHsKLQkJZXJyKCJubyB0cmFuc2ZlciBlbmRwb2ludCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKKworCS8qIGdldCB0aGUgcmVxdWVzdGVkIGJhbmR3aWR0aCBhbmQgc3RhcnQgYXQgdGhlIGhpZ2hlc3QgYXRsc2V0dGluZyAqLworCWJhbmR3aWR0aCA9IHdoaWNoX2JhbmR3aWR0aChnc3BjYV9kZXYpOworCWVwX3RiLS07CisJd2hpbGUgKGkgPiAxKSB7CisJCWVwX3RiLS07CisJCWlmIChlcF90Yi0+YmFuZHdpZHRoIDwgYmFuZHdpZHRoKQorCQkJYnJlYWs7CisJCWktLTsKIAl9Ci0JUERFQlVHKERfU1RSRUFNLCAidXNlIGFsdCAlZCBlcCAweCUwMngiLAotCQkJaSwgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7Ci0JZ3NwY2FfZGV2LT5hbHQgPSBpOwkJLyogbWVtb3JpemUgdGhlIGN1cnJlbnQgYWx0IHNldHRpbmcgKi8KLQlpZiAoZ3NwY2FfZGV2LT5uYmFsdCA+IDEpIHsKLQkJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZ3NwY2FfZGV2LT5kZXYsIGdzcGNhX2Rldi0+aWZhY2UsIGkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZXJyKCJzZXQgYWx0ICVkIGVyciAlZCIsIGksIHJldCk7Ci0JCQllcCA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVwOworCXJldHVybiBpOwogfQogCiAvKgpAQCAtNzMxLDcgKzc2OSw3IEBACiAJZm9yIChuID0gMDsgbiA8IG51cmJzOyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGt0LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVycigidXNiX2FsbG9jX3VyYiBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CkBAIC03NDEsNyArNzc5LDcgQEAKIAkJCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CiAKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2FsbG9jX2NvaGVyZW50IGZhaWxlZCIpOworCQkJcHJfZXJyKCJ1c2JfYWxsb2NfY29oZXJlbnQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXVyYi0+ZGV2ID0gZ3NwY2FfZGV2LT5kZXY7CkBAIC03NTIsNyArNzkwLDEwIEBACiAJCQkJCQkgICAgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQCiAJCQkJCXwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCQl1cmItPmludGVydmFsID0gZXAtPmRlc2MuYkludGVydmFsOworCQkJaWYgKGdzcGNhX2Rldi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfTE9XKQorCQkJCXVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CisJCQllbHNlCisJCQkJdXJiLT5pbnRlcnZhbCA9IDEgPDwgKGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOwogCQkJdXJiLT5jb21wbGV0ZSA9IGlzb2NfaXJxOwogCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG5wa3Q7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnBrdDsgaSsrKSB7CkBAIC03NzQsOSArODE1LDExIEBACiAgKi8KIHN0YXRpYyBpbnQgZ3NwY2FfaW5pdF90cmFuc2ZlcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcDsKIAlzdHJ1Y3QgdXJiICp1cmI7Ci0JaW50IG4sIHJldDsKKwlzdHJ1Y3QgZXBfdGJfcyBlcF90YltNQVhfQUxUXTsKKwlpbnQgbiwgcmV0LCB4ZmVyLCBhbHQsIGFsdF9pZHg7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZnc3BjYV9kZXYtPnVzYl9sb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKQEAgLTc5NCwzMCArODM3LDY1IEBACiAKIAlnc3BjYV9kZXYtPnVzYl9lcnIgPSAwOwogCi0JLyogc2V0IHRoZSBoaWdoZXIgYWx0ZXJuYXRlIHNldHRpbmcgYW5kCi0JICogbG9vcCB1bnRpbCB1cmIgc3VibWl0IHN1Y2NlZWRzICovCi0JaWYgKGdzcGNhX2Rldi0+Y2FtLnJldmVyc2VfYWx0cykKLQkJZ3NwY2FfZGV2LT5hbHQgPSAwOwotCWVsc2UKLQkJZ3NwY2FfZGV2LT5hbHQgPSBnc3BjYV9kZXYtPm5iYWx0OwotCisJLyogZG8gdGhlIHNwZWNpZmljIHN1YmRyaXZlciBzdHVmZiBiZWZvcmUgZW5kcG9pbnQgc2VsZWN0aW9uICovCisJZ3NwY2FfZGV2LT5hbHQgPSAwOwogCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdCkgewogCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdChnc3BjYV9kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gdW5sb2NrOwogCX0KKwlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlKTsKKwl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKKwkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7CiAKLQlnc3BjYV9pbnB1dF9kZXN0cm95X3VyYihnc3BjYV9kZXYpOwotCWVwID0gZ2V0X2VwKGdzcGNhX2Rldik7Ci0JaWYgKGVwID09IE5VTEwpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXQ7CisJLyogaWYgdGhlIHN1YmRyaXZlciBmb3JjZWQgYW4gYWx0c2V0dGluZywgZ2V0IHRoZSBlbmRwb2ludCAqLworCWlmIChnc3BjYV9kZXYtPmFsdCAhPSAwKSB7CisJCWdzcGNhX2Rldi0+YWx0LS07CS8qIChwcmV2aW91cyB2ZXJzaW9uIGNvbXBhdGliaWxpdHkpICovCisJCWVwID0gYWx0X3hmZXIoJmludGYtPmFsdHNldHRpbmdbZ3NwY2FfZGV2LT5hbHRdLCB4ZmVyKTsKKwkJaWYgKGVwID09IE5VTEwpIHsKKwkJCXByX2VycigiYmFkIGFsdHNldHRpbmcgJWRcbiIsIGdzcGNhX2Rldi0+YWx0KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQllcF90YlswXS5hbHQgPSBnc3BjYV9kZXYtPmFsdDsKKwkJYWx0X2lkeCA9IDE7CisJfSBlbHNlIHsKKworCS8qIGVsc2UsIGNvbXB1dGUgdGhlIG1pbmltdW0gYmFuZHdpZHRoCisJICogYW5kIGJ1aWxkIHRoZSBlbmRwb2ludCB0YWJsZSAqLworCQlhbHRfaWR4ID0gYnVpbGRfZXBfdGIoZ3NwY2FfZGV2LCBpbnRmLCB4ZmVyLCBlcF90Yik7CisJCWlmIChhbHRfaWR4IDw9IDApIHsKKwkJCXByX2Vycigibm8gdHJhbnNmZXIgZW5kcG9pbnQgZm91bmRcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gdW5sb2NrOworCQl9CiAJfQorCisJLyogc2V0IHRoZSBoaWdoZXN0IGFsdGVybmF0ZSBzZXR0aW5nIGFuZAorCSAqIGxvb3AgdW50aWwgdXJiIHN1Ym1pdCBzdWNjZWVkcyAqLworCWdzcGNhX2lucHV0X2Rlc3Ryb3lfdXJiKGdzcGNhX2Rldik7CisKKwlnc3BjYV9kZXYtPmFsdCA9IGVwX3RiWy0tYWx0X2lkeF0uYWx0OworCWFsdCA9IC0xOwogCWZvciAoOzspIHsKKwkJaWYgKGFsdCAhPSBnc3BjYV9kZXYtPmFsdCkgeworCQkJYWx0ID0gZ3NwY2FfZGV2LT5hbHQ7CisJCQlpZiAoZ3NwY2FfZGV2LT5uYmFsdCA+IDEpIHsKKwkJCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShnc3BjYV9kZXYtPmRldiwKKwkJCQkJCQlnc3BjYV9kZXYtPmlmYWNlLAorCQkJCQkJCWFsdCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkJCQkJZ290byByZXRyeTsgLypmaXhtZTogdWdseSovCisJCQkJCXByX2Vycigic2V0IGFsdCAlZCBlcnIgJWRcbiIsIGFsdCwgcmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CiAJCWlmICghZ3NwY2FfZGV2LT5jYW0ubm9fdXJiX2NyZWF0ZSkgewotCQkJUERFQlVHKERfU1RSRUFNLCAiaW5pdCB0cmFuc2ZlciBhbHQgJWQiLAotCQkJCWdzcGNhX2Rldi0+YWx0KTsKLQkJCXJldCA9IGNyZWF0ZV91cmJzKGdzcGNhX2RldiwgZXApOworCQkJUERFQlVHKERfU1RSRUFNLCAiaW5pdCB0cmFuc2ZlciBhbHQgJWQiLCBhbHQpOworCQkJcmV0ID0gY3JlYXRlX3VyYnMoZ3NwY2FfZGV2LAorCQkJCWFsdF94ZmVyKCZpbnRmLT5hbHRzZXR0aW5nW2FsdF0sIHhmZXIpKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZGVzdHJveV91cmJzKGdzcGNhX2Rldik7CiAJCQkJZ290byBvdXQ7CkBAIC04NTEsMjkgKzkyOSwzNSBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXQgPj0gMCkKLQkJCWJyZWFrOworCQkJYnJlYWs7CQkJLyogdHJhbnNmZXIgaXMgc3RhcnRlZCAqLworCisJCS8qIHNvbWV0aGluZyB3aGVuIHdyb25nCisJCSAqIHN0b3AgdGhlIHdlYmNhbSBhbmQgZnJlZSB0aGUgdHJhbnNmZXIgcmVzb3VyY2VzICovCiAJCWdzcGNhX3N0cmVhbV9vZmYoZ3NwY2FfZGV2KTsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKSB7Ci0JCQllcnIoInVzYl9zdWJtaXRfdXJiIGFsdCAlZCBlcnIgJWQiLAotCQkJCWdzcGNhX2Rldi0+YWx0LCByZXQpOworCQkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYiBhbHQgJWQgZXJyICVkXG4iLAorCQkJICAgICAgIGdzcGNhX2Rldi0+YWx0LCByZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiB0aGUgYmFuZHdpZHRoIGlzIG5vdCB3aWRlIGVub3VnaAogCQkgKiBuZWdvdGlhdGUgb3IgdHJ5IGEgbG93ZXIgYWx0ZXJuYXRlIHNldHRpbmcgKi8KK3JldHJ5OgogCQlQREVCVUcoRF9FUlJ8RF9TVFJFQU0sCi0JCQkiYmFuZHdpZHRoIG5vdCB3aWRlIGVub3VnaCAtIHRyeWluZyBhZ2FpbiIpOworCQkJImFsdCAlZCAtIGJhbmR3aWR0aCBub3Qgd2lkZSBlbm91Z2ggLSB0cnlpbmcgYWdhaW4iLAorCQkJYWx0KTsKIAkJbXNsZWVwKDIwKTsJLyogd2FpdCBmb3Iga2lsbCBjb21wbGV0ZSAqLwogCQlpZiAoZ3NwY2FfZGV2LT5zZF9kZXNjLT5pc29jX25lZ28pIHsKIAkJCXJldCA9IGdzcGNhX2Rldi0+c2RfZGVzYy0+aXNvY19uZWdvKGdzcGNhX2Rldik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCWVwID0gZ2V0X2VwKGdzcGNhX2Rldik7Ci0JCQlpZiAoZXAgPT0gTlVMTCkgeworCQkJaWYgKGFsdF9pZHggPD0gMCkgeworCQkJCXByX2Vycigibm8gdHJhbnNmZXIgZW5kcG9pbnQgZm91bmRcbiIpOwogCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlhbHQgPSBlcF90YlstLWFsdF9pZHhdLmFsdDsKIAkJfQogCX0KIG91dDoKQEAgLTEwNDQsNyArMTEyOCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwkJLyogbm8gbW9yZSBmb3JtYXQgKi8KIAogCWZtdGRlc2MtPnBpeGVsZm9ybWF0ID0gZm10X3RiW2luZGV4XTsKLQlpZiAoZ3NwY2FfaXNfY29tcHJlc3NlZChmbXRfdGJbaW5kZXhdKSkKKwlpZiAoZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbaV0uc2l6ZWltYWdlIDwKKwkJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2ldLndpZHRoICoKKwkJCQlnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtpXS5oZWlnaHQpCiAJCWZtdGRlc2MtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOwogCWZtdGRlc2MtPmRlc2NyaXB0aW9uWzBdID0gZm10ZGVzYy0+cGl4ZWxmb3JtYXQgJiAweGZmOwogCWZtdGRlc2MtPmRlc2NyaXB0aW9uWzFdID0gKGZtdGRlc2MtPnBpeGVsZm9ybWF0ID4+IDgpICYgMHhmZjsKQEAgLTIxOTUsMTkgKzIyODEsMjAgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlpbnQgcmV0OwogCi0JUERFQlVHKERfUFJPQkUsICJwcm9iaW5nICUwNHg6JTA0eCIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CisJcHJfaW5mbygiJXMtIiBHU1BDQV9WRVJTSU9OICIgcHJvYmluZyAlMDR4OiUwNHhcbiIsCisJCXNkX2Rlc2MtPm5hbWUsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAKIAkvKiBjcmVhdGUgdGhlIGRldmljZSAqLwogCWlmIChkZXZfc2l6ZSA8IHNpemVvZiAqZ3NwY2FfZGV2KQogCQlkZXZfc2l6ZSA9IHNpemVvZiAqZ3NwY2FfZGV2OwogCWdzcGNhX2RldiA9IGt6YWxsb2MoZGV2X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghZ3NwY2FfZGV2KSB7Ci0JCWVycigiY291bGRuJ3Qga3phbGxvYyBnc3BjYSBzdHJ1Y3QiKTsKKwkJcHJfZXJyKCJjb3VsZG4ndCBremFsbG9jIGdzcGNhIHN0cnVjdFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlnc3BjYV9kZXYtPnVzYl9idWYgPSBrbWFsbG9jKFVTQl9CVUZfU1osIEdGUF9LRVJORUwpOwogCWlmICghZ3NwY2FfZGV2LT51c2JfYnVmKSB7Ci0JCWVycigib3V0IG9mIG1lbW9yeSIpOworCQlwcl9lcnIoIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjY0LDcgKzIzNTEsNyBAQAogCQkJCSAgVkZMX1RZUEVfR1JBQkJFUiwKIAkJCQkgIC0xKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBlcnIgJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjI5Niw4ICsyMzgzLDggQEAKIAogCS8qIHdlIGRvbid0IGhhbmRsZSBtdWx0aS1jb25maWcgY2FtZXJhcyAqLwogCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpIHsKLQkJZXJyKCIlMDR4OiUwNHggdG9vIG1hbnkgY29uZmlnIiwKLQkJCQlpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOworCQlwcl9lcnIoIiUwNHg6JTA0eCB0b28gbWFueSBjb25maWdcbiIsCisJCSAgICAgICBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTI0ODAsNyArMjU2Nyw3IEBACiAvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCiBzdGF0aWMgaW50IF9faW5pdCBnc3BjYV9pbml0KHZvaWQpCiB7Ci0JaW5mbygidiIgRFJJVkVSX1ZFUlNJT05fTlVNQkVSICIgcmVnaXN0ZXJlZCIpOworCXByX2luZm8oInYiIEdTUENBX1ZFUlNJT04gIiByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyB2b2lkIF9fZXhpdCBnc3BjYV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmgKaW5kZXggNDllMmZjYi4uZTQ0NGYxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuaApAQCAtMTQsMTEgKzE0LDEyIEBACiAjaWZkZWYgR1NQQ0FfREVCVUcKIC8qIEdTUENBIG91ciBkZWJ1ZyBtZXNzYWdlcyAqLwogZXh0ZXJuIGludCBnc3BjYV9kZWJ1ZzsKLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKLQlkbyB7XAotCQlpZiAoZ3NwY2FfZGVidWcgJiAobGV2ZWwpKSBcCi0JCQlwcmludGsoS0VSTl9JTkZPIE1PRFVMRV9OQU1FICI6ICIgZm10ICJcbiIsICMjIGFyZ3MpOyBcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoZ3NwY2FfZGVidWcgJiAobGV2ZWwpKQkJCQlcCisJCXByX2luZm8oZm10LCAjI19fVkFfQVJHU19fKTsJCQlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIERfRVJSICAweDAxCiAjZGVmaW5lIERfUFJPQkUgMHgwMgogI2RlZmluZSBEX0NPTkYgMHgwNApAQCAtMjksMTcgKzMwLDggQEAKICNkZWZpbmUgRF9VU0JPIDB4MDAKICNkZWZpbmUgRF9WNEwyIDB4MDEwMAogI2Vsc2UKLSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCAuLi4pCiAjZW5kaWYKLSN1bmRlZiBlcnIKLSNkZWZpbmUgZXJyKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiAiIGZtdCAiXG4iLCAjIyBhcmdzKQotI3VuZGVmIGluZm8KLSNkZWZpbmUgaW5mbyhmbXQsIGFyZ3MuLi4pIFwKLQlwcmludGsoS0VSTl9JTkZPIE1PRFVMRV9OQU1FICI6ICIgZm10ICJcbiIsICMjIGFyZ3MpCi0jdW5kZWYgd2FybgotI2RlZmluZSB3YXJuKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EVUxFX05BTUUgIjogIiBmbXQgIlxuIiwgIyMgYXJncykKIAogI2RlZmluZSBHU1BDQV9NQVhfRlJBTUVTIDE2CS8qIG1heGltdW0gbnVtYmVyIG9mIHZpZGVvIGZyYW1lIGJ1ZmZlcnMgKi8KIC8qIGltYWdlIHRyYW5zZmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9qZWlsaW5qLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYwppbmRleCAxYmQ5YzRiLi44ZTNkYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2plaWxpbmouYwpAQCAtMjQsNiArMjQsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImplaWxpbmoiCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMTMsOCArMTE1LDggQEAKIAkJCXVzYl9zbmRidWxrcGlwZShnc3BjYV9kZXYtPmRldiwgMyksCiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDIsIE5VTEwsIDUwMCk7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJZXJyKCJjb21tYW5kIHdyaXRlIFslMDJ4XSBlcnJvciAlZCIsCi0JCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOworCQlwcl9lcnIoImNvbW1hbmQgd3JpdGUgWyUwMnhdIGVycm9yICVkXG4iLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXR2YWw7CiAJfQogfQpAQCAtMTMxLDggKzEzMyw4IEBACiAJCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBOVUxMLCA1MDApOwogCXJlc3BvbnNlID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWVycigicmVhZCBjb21tYW5kIFslMDJ4XSBlcnJvciAlZCIsCi0JCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXR2YWwpOworCQlwcl9lcnIoInJlYWQgY29tbWFuZCBbJTAyeF0gZXJyb3IgJWRcbiIsCisJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJldHZhbCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldHZhbDsKIAl9CiB9CkBAIC00MDMsMTMgKzQwNSw3IEBACiAJZGV2LT50eXBlID0gaWQtPmRyaXZlcl9pbmZvOwogCWdzcGNhX2Rldi0+Y2FtLmN0cmxzID0gZGV2LT5jdHJsczsKIAlkZXYtPnF1YWxpdHkgPSBRVUFMSVRZX0RFRjsKLQlkZXYtPmN0cmxzW0xJR0hURlJFUV0uZGVmID0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWjsKLQlkZXYtPmN0cmxzW1JFRF0uZGVmID0gUkVEX0JBTEFOQ0VfREVGOwotCWRldi0+Y3RybHNbR1JFRU5dLmRlZiA9IEdSRUVOX0JBTEFOQ0VfREVGOwotCWRldi0+Y3RybHNbQkxVRV0uZGVmID0gQkxVRV9CQUxBTkNFX0RFRjsKLQlQREVCVUcoRF9QUk9CRSwKLQkJIkpFSUxJTkogY2FtZXJhIGRldGVjdGVkIgotCQkiICh2aWQvcGlkIDB4JTA0WDoweCUwNFgpIiwgaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKKwogCWNhbS0+Y2FtX21vZGUgPSBqbGpfbW9kZTsKIAljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUoamxqX21vZGUpOwogCWNhbS0+YnVsayA9IDE7CkBAIC00MjIsNyArNDE4LDcgQEAKIHsKIAlpbnQgaTsKIAl1OCAqYnVmOwotCXU4IHN0b3BfY29tbWFuZHNbXVsyXSA9IHsKKwlzdGF0aWMgdTggc3RvcF9jb21tYW5kc1tdWzJdID0gewogCQl7MHg3MSwgMHgwMH0sCiAJCXsweDcwLCAweDA5fSwKIAkJezB4NzEsIDB4ODB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9raW5lY3QuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva2luZWN0LmMKaW5kZXggMjZmYzIwNi4uNGZlNTFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9raW5lY3QuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2tpbmVjdC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAia2luZWN0IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTM0LDExICszNiw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBL0tpbmVjdCBTZW5zb3IgRGV2aWNlIFVTQiBDYW1lcmEgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNpZmRlZiBHU1BDQV9ERUJVRwotaW50IGdzcGNhX2RlYnVnID0gRF9FUlIgfCBEX1BST0JFIHwgRF9DT05GIHwgRF9TVFJFQU0gfCBEX0ZSQU0gfCBEX1BBQ0sgfAotCURfVVNCSSB8IERfVVNCTyB8IERfVjRMMjsKLSNlbmRpZgotCiBzdHJ1Y3QgcGt0X2hkciB7CiAJdWludDhfdCBtYWdpY1syXTsKIAl1aW50OF90IHBhZDsKQEAgLTE0MSw3ICsxMzgsNyBAQAogCXN0cnVjdCBjYW1faGRyICpyaGRyID0gKHZvaWQgKilpYnVmOwogCiAJaWYgKGNtZF9sZW4gJiAxIHx8IGNtZF9sZW4gPiAoMHg0MDAgLSBzaXplb2YoKmNoZHIpKSkgewotCQllcnIoInNlbmRfY21kOiBJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoICgweCV4KSIsIGNtZF9sZW4pOworCQlwcl9lcnIoInNlbmRfY21kOiBJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoICgweCV4KVxuIiwgY21kX2xlbik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE1Nyw3ICsxNTQsNyBAQAogCVBERUJVRyhEX1VTQk8sICJDb250cm9sIGNtZD0lMDR4IHRhZz0lMDR4IGxlbj0lMDR4OiAlZCIsIGNtZCwKIAkJc2QtPmNhbV90YWcsIGNtZF9sZW4sIHJlcyk7CiAJaWYgKHJlcyA8IDApIHsKLQkJZXJyKCJzZW5kX2NtZDogT3V0cHV0IGNvbnRyb2wgdHJhbnNmZXIgZmFpbGVkICglZCkiLCByZXMpOworCQlwcl9lcnIoInNlbmRfY21kOiBPdXRwdXQgY29udHJvbCB0cmFuc2ZlciBmYWlsZWQgKCVkKVxuIiwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKQEAgLTE2NiwzMyArMTYzLDM1IEBACiAJfSB3aGlsZSAoYWN0dWFsX2xlbiA9PSAwKTsKIAlQREVCVUcoRF9VU0JPLCAiQ29udHJvbCByZXBseTogJWQiLCByZXMpOwogCWlmIChhY3R1YWxfbGVuIDwgc2l6ZW9mKCpyaGRyKSkgewotCQllcnIoInNlbmRfY21kOiBJbnB1dCBjb250cm9sIHRyYW5zZmVyIGZhaWxlZCAoJWQpIiwgcmVzKTsKKwkJcHJfZXJyKCJzZW5kX2NtZDogSW5wdXQgY29udHJvbCB0cmFuc2ZlciBmYWlsZWQgKCVkKVxuIiwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAJYWN0dWFsX2xlbiAtPSBzaXplb2YoKnJoZHIpOwogCiAJaWYgKHJoZHItPm1hZ2ljWzBdICE9IDB4NTIgfHwgcmhkci0+bWFnaWNbMV0gIT0gMHg0MikgewotCQllcnIoInNlbmRfY21kOiBCYWQgbWFnaWMgJTAyeCAlMDJ4Iiwgcmhkci0+bWFnaWNbMF0sCi0JCQlyaGRyLT5tYWdpY1sxXSk7CisJCXByX2Vycigic2VuZF9jbWQ6IEJhZCBtYWdpYyAlMDJ4ICUwMnhcbiIsCisJCSAgICAgICByaGRyLT5tYWdpY1swXSwgcmhkci0+bWFnaWNbMV0pOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmIChyaGRyLT5jbWQgIT0gY2hkci0+Y21kKSB7Ci0JCWVycigic2VuZF9jbWQ6IEJhZCBjbWQgJTAyeCAhPSAlMDJ4Iiwgcmhkci0+Y21kLCBjaGRyLT5jbWQpOworCQlwcl9lcnIoInNlbmRfY21kOiBCYWQgY21kICUwMnggIT0gJTAyeFxuIiwKKwkJICAgICAgIHJoZHItPmNtZCwgY2hkci0+Y21kKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAocmhkci0+dGFnICE9IGNoZHItPnRhZykgewotCQllcnIoInNlbmRfY21kOiBCYWQgdGFnICUwNHggIT0gJTA0eCIsIHJoZHItPnRhZywgY2hkci0+dGFnKTsKKwkJcHJfZXJyKCJzZW5kX2NtZDogQmFkIHRhZyAlMDR4ICE9ICUwNHhcbiIsCisJCSAgICAgICByaGRyLT50YWcsIGNoZHItPnRhZyk7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKGNwdV90b19sZTE2KHJoZHItPmxlbikgIT0gKGFjdHVhbF9sZW4vMikpIHsKLQkJZXJyKCJzZW5kX2NtZDogQmFkIGxlbiAlMDR4ICE9ICUwNHgiLAotCQkJCWNwdV90b19sZTE2KHJoZHItPmxlbiksIChpbnQpKGFjdHVhbF9sZW4vMikpOworCQlwcl9lcnIoInNlbmRfY21kOiBCYWQgbGVuICUwNHggIT0gJTA0eFxuIiwKKwkJICAgICAgIGNwdV90b19sZTE2KHJoZHItPmxlbiksIChpbnQpKGFjdHVhbF9sZW4vMikpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGFjdHVhbF9sZW4gPiByZXBseV9sZW4pIHsKLQkJd2Fybigic2VuZF9jbWQ6IERhdGEgYnVmZmVyIGlzICVkIGJ5dGVzIGxvbmcsIGJ1dCBnb3QgJWQgYnl0ZXMiLAotCQkJCXJlcGx5X2xlbiwgYWN0dWFsX2xlbik7CisJCXByX3dhcm4oInNlbmRfY21kOiBEYXRhIGJ1ZmZlciBpcyAlZCBieXRlcyBsb25nLCBidXQgZ290ICVkIGJ5dGVzXG4iLAorCQkJcmVwbHlfbGVuLCBhY3R1YWxfbGVuKTsKIAkJbWVtY3B5KHJlcGx5YnVmLCBpYnVmK3NpemVvZigqcmhkciksIHJlcGx5X2xlbik7CiAJfSBlbHNlIHsKIAkJbWVtY3B5KHJlcGx5YnVmLCBpYnVmK3NpemVvZigqcmhkciksIGFjdHVhbF9sZW4pOwpAQCAtMjE4LDggKzIxNyw4IEBACiAJaWYgKHJlcyA8IDApCiAJCXJldHVybiByZXM7CiAJaWYgKHJlcyAhPSAyKSB7Ci0JCXdhcm4oInNlbmRfY21kIHJldHVybmVkICVkIFslMDR4ICUwNHhdLCAwMDAwIGV4cGVjdGVkIiwKLQkJCQlyZXMsIHJlcGx5WzBdLCByZXBseVsxXSk7CisJCXByX3dhcm4oInNlbmRfY21kIHJldHVybmVkICVkIFslMDR4ICUwNHhdLCAwMDAwIGV4cGVjdGVkXG4iLAorCQkJcmVzLCByZXBseVswXSwgcmVwbHlbMV0pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1Myw4ICszNTIsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoaGRyLT5tYWdpY1swXSAhPSAnUicgfHwgaGRyLT5tYWdpY1sxXSAhPSAnQicpIHsKLQkJd2FybigiW1N0cmVhbSAlMDJ4XSBJbnZhbGlkIG1hZ2ljICUwMnglMDJ4Iiwgc2QtPnN0cmVhbV9mbGFnLAotCQkJCWhkci0+bWFnaWNbMF0sIGhkci0+bWFnaWNbMV0pOworCQlwcl93YXJuKCJbU3RyZWFtICUwMnhdIEludmFsaWQgbWFnaWMgJTAyeCUwMnhcbiIsCisJCQlzZC0+c3RyZWFtX2ZsYWcsIGhkci0+bWFnaWNbMF0sIGhkci0+bWFnaWNbMV0pOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNjgsNyArMzY3LDcgQEAKIAkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIGRhdGFsZW4pOwogCiAJZWxzZQotCQl3YXJuKCJQYWNrZXQgdHlwZSBub3QgcmVjb2duaXplZC4uLiIpOworCQlwcl93YXJuKCJQYWNrZXQgdHlwZSBub3QgcmVjb2duaXplZC4uLlxuIik7CiB9CiAKIC8qIHN1Yi1kcml2ZXIgZGVzY3JpcHRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva29uaWNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2tvbmljYS5jCmluZGV4IDU5NjQ2OTEuLmYzZjdmZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Eva29uaWNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9rb25pY2EuYwpAQCAtMjgsNiArMjgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgImtvbmljYSIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0yMDAsNyArMjAyLDcgQEAKIAkJCTAsCiAJCQkxMDAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMjIxLDcgKzIyMyw3IEBACiAJCQkyLAogCQkJMTAwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTI4NCw3ICsyODYsNyBAQAogCWludGYgPSB1c2JfaWZudW1fdG9faWYoc2QtPmdzcGNhX2Rldi5kZXYsIHNkLT5nc3BjYV9kZXYuaWZhY2UpOwogCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCBzZC0+Z3NwY2FfZGV2LmFsdCk7CiAJaWYgKCFhbHQpIHsKLQkJZXJyKCJDb3VsZG4ndCBnZXQgYWx0c2V0dGluZyIpOworCQlwcl9lcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0zMTUsNyArMzE3LDcgQEAKIAkJCWxlMTZfdG9fY3B1KGFsdC0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQllcnIoInVzYl9hbGxvY191cmIgZmFpbGVkIik7CisJCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWdzcGNhX2Rldi0+dXJiW25dID0gdXJiOwpAQCAtMzI0LDcgKzMyNiw3IEBACiAJCQkJCQlHRlBfS0VSTkVMLAogCQkJCQkJJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJCWVycigidXNiX2J1ZmZlcl9hbGxvYyBmYWlsZWQiKTsKKwkJCXByX2VycigidXNiX2J1ZmZlcl9hbGxvYyBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMzg2LDcgKzM4OCw3IEBACiAJCVBERUJVRyhEX0VSUiwgInVyYiBzdGF0dXM6ICVkIiwgdXJiLT5zdGF0dXMpOwogCQlzdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdCA8IDApCi0JCQllcnIoInJlc3VibWl0IHVyYiBlcnJvciAlZCIsIHN0KTsKKwkJCXByX2VycigicmVzdWJtaXQgdXJiIGVycm9yICVkXG4iLCBzdCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ3Nyw3ICs0NzksNyBAQAogCX0KIAlzdCA9IHVzYl9zdWJtaXRfdXJiKHN0YXR1c191cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdCA8IDApCi0JCWVycigidXNiX3N1Ym1pdF91cmIoc3RhdHVzX3VyYikgcmV0ICVkIiwgc3QpOworCQlwcl9lcnIoInVzYl9zdWJtaXRfdXJiKHN0YXR1c191cmIpIHJldCAlZFxuIiwgc3QpOwogfQogCiBzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9NYWtlZmlsZQppbmRleCBiZjdhMTlhLi43ZjUyOTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvTWFrZWZpbGUKQEAgLTgsNCArOCw0IEBACiAJCSAgICBtNTYwMl9zNWs4M2EubyBcCiAJCSAgICBtNTYwMl9zNWs0YWEubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCmluZGV4IGE3NzIyYjEuLjY3NTMzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfY29yZS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX292OTY1MC5oIgogI2luY2x1ZGUgIm01NjAyX292NzY2MC5oIgogI2luY2x1ZGUgIm01NjAyX210OW0xMTEuaCIKQEAgLTE5MiwxMCArMTk0LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMHg4MDsgaSsrKSB7CiAJCXVuc2lnbmVkIGNoYXIgdmFsID0gMDsKIAkJbTU2MDJfcmVhZF9icmlkZ2Uoc2QsIGksICZ2YWwpOwotCQlpbmZvKCJBTGkgbTU2MDIgYWRkcmVzcyAweCV4IGNvbnRhaW5zIDB4JXgiLCBpLCB2YWwpOworCQlwcl9pbmZvKCJBTGkgbTU2MDIgYWRkcmVzcyAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGksIHZhbCk7CiAJfQotCWluZm8oIldhcm5pbmc6IFRoZSBBTGkgbTU2MDIgd2ViY2FtIHByb2JhYmx5IHdvbid0IHdvcmsgIgotCQkidW50aWwgaXQncyBwb3dlciBjeWNsZWQiKTsKKwlwcl9pbmZvKCJXYXJuaW5nOiBUaGUgQUxpIG01NjAyIHdlYmNhbSBwcm9iYWJseSB3b24ndCB3b3JrIHVudGlsIGl0J3MgcG93ZXIgY3ljbGVkXG4iKTsKIH0KIAogc3RhdGljIGludCBtNTYwMl9wcm9iZV9zZW5zb3Ioc3RydWN0IHNkICpzZCkKQEAgLTIzMSw3ICsyMzIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE1vcmUgc2Vuc29yIHByb2JlIGZ1bmN0aW9uIGdvZXMgaGVyZSAqLwotCWluZm8oIkZhaWxlZCB0byBmaW5kIGEgc2Vuc29yIik7CisJcHJfaW5mbygiRmFpbGVkIHRvIGZpbmQgYSBzZW5zb3JcbiIpOwogCXNkLT5zZW5zb3IgPSBOVUxMOwogCXJldHVybiAtRU5PREVWOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9tdDltMTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwppbmRleCAwZDYwNWE1Li42MjY4YWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX210OW0xMTEuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJtNTYwMl9tdDltMTExLmgiCiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfdmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpAQCAtMTYzLDcgKzE2NSw3IEBACiAKIAlpZiAoZm9yY2Vfc2Vuc29yKSB7CiAJCWlmIChmb3JjZV9zZW5zb3IgPT0gTVQ5TTExMV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBtdDltMTExLm5hbWUpOworCQkJcHJfaW5mbygiRm9yY2luZyBhICVzIHNlbnNvclxuIiwgbXQ5bTExMS5uYW1lKTsKIAkJCWdvdG8gc2Vuc29yX2ZvdW5kOwogCQl9CiAJCS8qIElmIHdlIHdhbnQgdG8gZm9yY2UgYW5vdGhlciBzZW5zb3IsIGRvbid0IHRyeSB0byBwcm9iZSB0aGlzCkBAIC0xOTEsNyArMTkzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGRhdGFbMF0gPT0gMHgxNCkgJiYgKGRhdGFbMV0gPT0gMHgzYSkpIHsKLQkJaW5mbygiRGV0ZWN0ZWQgYSBtdDltMTExIHNlbnNvciIpOworCQlwcl9pbmZvKCJEZXRlY3RlZCBhIG10OW0xMTEgc2Vuc29yXG4iKTsKIAkJZ290byBzZW5zb3JfZm91bmQ7CiAJfQogCkBAIC02MTIsMzQgKzYxNCwzNCBAQAogewogCXU4IGFkZHJlc3MsIHZhbHVlWzJdID0gezB4MDAsIDB4MDB9OwogCi0JaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSByZWdpc3RlciBzdGF0ZSIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgcmVnaXN0ZXIgc3RhdGVcbiIpOwogCi0JaW5mbygiRHVtcGluZyB0aGUgbXQ5bTExMSBzZW5zb3IgY29yZSByZWdpc3RlcnMiKTsKKwlwcl9pbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIHNlbnNvciBjb3JlIHJlZ2lzdGVyc1xuIik7CiAJdmFsdWVbMV0gPSBNVDlNMTExX1NFTlNPUl9DT1JFOwogCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKLQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCV4XG4iLAorCQkJYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKIAl9CiAKLQlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNvbG9yIHBpcGVsaW5lIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgY29sb3IgcGlwZWxpbmUgcmVnaXN0ZXJzXG4iKTsKIAl2YWx1ZVsxXSA9IE1UOU0xMTFfQ09MT1JQSVBFOwogCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgTVQ5TTExMV9QQUdFX01BUCwgdmFsdWUsIDIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsIHZhbHVlLCAyKTsKLQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlWzBdLCB2YWx1ZVsxXSk7CisJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCV4XG4iLAorCQkJYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKIAl9CiAKLQlpbmZvKCJEdW1waW5nIHRoZSBtdDltMTExIGNhbWVyYSBjb250cm9sIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG10OW0xMTEgY2FtZXJhIGNvbnRyb2wgcmVnaXN0ZXJzXG4iKTsKIAl2YWx1ZVsxXSA9IE1UOU0xMTFfQ0FNRVJBX0NPTlRST0w7CiAJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBNVDlNMTExX1BBR0VfTUFQLCB2YWx1ZSwgMik7CiAJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4ZmY7IGFkZHJlc3MrKykgewogCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgdmFsdWUsIDIpOwotCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWVbMF0sIHZhbHVlWzFdKTsKKwkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4JXhcbiIsCisJCQlhZGRyZXNzLCB2YWx1ZVswXSwgdmFsdWVbMV0pOwogCX0KIAotCWluZm8oIm10OW0xMTEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oIm10OW0xMTEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292NzY2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjc2NjAuYwppbmRleCBiMTJmNjA0Li45YTE0ODM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292NzY2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y3NjYwLmMKQEAgLTE2LDYgKzE2LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAibTU2MDJfb3Y3NjYwLmgiCiAKIHN0YXRpYyBpbnQgb3Y3NjYwX2dldF9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC0xNDksNyArMTUxLDcgQEAKIAogCWlmIChmb3JjZV9zZW5zb3IpIHsKIAkJaWYgKGZvcmNlX3NlbnNvciA9PSBPVjc2NjBfU0VOU09SKSB7Ci0JCQlpbmZvKCJGb3JjaW5nIGFuICVzIHNlbnNvciIsIG92NzY2MC5uYW1lKTsKKwkJCXByX2luZm8oIkZvcmNpbmcgYW4gJXMgc2Vuc29yXG4iLCBvdjc2NjAubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLApAQCAtMTgwLDEwICsxODIsMTAgQEAKIAlpZiAobTU2MDJfcmVhZF9zZW5zb3Ioc2QsIE9WNzY2MF9WRVIsICZ2ZXJfaWQsIDEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oIlNlbnNvciByZXBvcnRlZCAweCV4JXgiLCBwcm9kX2lkLCB2ZXJfaWQpOworCXByX2luZm8oIlNlbnNvciByZXBvcnRlZCAweCV4JXhcbiIsIHByb2RfaWQsIHZlcl9pZCk7CiAKIAlpZiAoKHByb2RfaWQgPT0gMHg3NikgJiYgKHZlcl9pZCA9PSAweDYwKSkgewotCQlpbmZvKCJEZXRlY3RlZCBhIG92NzY2MCBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYSBvdjc2NjAgc2Vuc29yXG4iKTsKIAkJZ290byBzZW5zb3JfZm91bmQ7CiAJfQogCXJldHVybiAtRU5PREVWOwpAQCAtNDU3LDE3ICs0NTksMTYgQEAKIHN0YXRpYyB2b2lkIG92NzY2MF9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQogewogCWludCBhZGRyZXNzOwotCWluZm8oIkR1bXBpbmcgdGhlIG92NzY2MCByZWdpc3RlciBzdGF0ZSIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIG92NzY2MCByZWdpc3RlciBzdGF0ZVxuIik7CiAJZm9yIChhZGRyZXNzID0gMDsgYWRkcmVzcyA8IDB4YTk7IGFkZHJlc3MrKykgewogCQl1OCB2YWx1ZTsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7Ci0JCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWUpOworCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGFkZHJlc3MsIHZhbHVlKTsKIAl9CiAKLQlpbmZvKCJvdjc2NjAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oIm92NzY2MCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAotCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlIik7CisJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOwogCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OwpAQCAtNDc3LDkgKzQ3OCw5IEBACiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZVswXSkKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwgYWRkcmVzcyk7CiAJCWVsc2UKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwgYWRkcmVzcyk7CiAKIAkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfb3Y5NjUwLmMKaW5kZXggNzAzZDQ4Ni4uMjExNGE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9vdjk2NTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX292OTY1MC5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX292OTY1MC5oIgogCiBzdGF0aWMgaW50IG92OTY1MF9zZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpAQCAtMjk5LDcgKzMwMSw3IEBACiAKIAlpZiAoZm9yY2Vfc2Vuc29yKSB7CiAJCWlmIChmb3JjZV9zZW5zb3IgPT0gT1Y5NjUwX1NFTlNPUikgewotCQkJaW5mbygiRm9yY2luZyBhbiAlcyBzZW5zb3IiLCBvdjk2NTAubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGFuICVzIHNlbnNvclxuIiwgb3Y5NjUwLm5hbWUpOwogCQkJZ290byBzZW5zb3JfZm91bmQ7CiAJCX0KIAkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwKQEAgLTMzMCw3ICszMzIsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgocHJvZF9pZCA9PSAweDk2KSAmJiAodmVyX2lkID09IDB4NTIpKSB7Ci0JCWluZm8oIkRldGVjdGVkIGFuIG92OTY1MCBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYW4gb3Y5NjUwIHNlbnNvclxuIik7CiAJCWdvdG8gc2Vuc29yX2ZvdW5kOwogCX0KIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTg1MCwxNyArODUyLDE2IEBACiBzdGF0aWMgdm9pZCBvdjk2NTBfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgYWRkcmVzczsKLQlpbmZvKCJEdW1waW5nIHRoZSBvdjk2NTAgcmVnaXN0ZXIgc3RhdGUiKTsKKwlwcl9pbmZvKCJEdW1waW5nIHRoZSBvdjk2NTAgcmVnaXN0ZXIgc3RhdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGE5OyBhZGRyZXNzKyspIHsKIAkJdTggdmFsdWU7CiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmdmFsdWUsIDEpOwotCQlpbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXgiLAotCQkgICAgIGFkZHJlc3MsIHZhbHVlKTsKKwkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4XG4iLCBhZGRyZXNzLCB2YWx1ZSk7CiAJfQogCi0JaW5mbygib3Y5NjUwIHJlZ2lzdGVyIHN0YXRlIGR1bXAgY29tcGxldGUiKTsKKwlwcl9pbmZvKCJvdjk2NTAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiAKLQlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSIpOworCXByX2luZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlXG4iKTsKIAlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDwgMHhmZjsgYWRkcmVzcysrKSB7CiAJCXU4IG9sZF92YWx1ZSwgY3RybF92YWx1ZTsKIAkJdTggdGVzdF92YWx1ZVsyXSA9IHsweGZmLCAweGZmfTsKQEAgLTg3MCw5ICs4NzEsOSBAQAogCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJmN0cmxfdmFsdWUsIDEpOwogCiAJCWlmIChjdHJsX3ZhbHVlID09IHRlc3RfdmFsdWVbMF0pCi0JCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZSIsIGFkZHJlc3MpOworCQkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGVcbiIsIGFkZHJlc3MpOwogCQllbHNlCi0JCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seSIsIGFkZHJlc3MpOworCQkJcHJfaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHlcbiIsIGFkZHJlc3MpOwogCiAJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KIAkJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBhZGRyZXNzLCAmb2xkX3ZhbHVlLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3BvMTAzMC5jCmluZGV4IDFmZWJkMzQuLmI4NzcxNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfcG8xMDMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9wbzEwMzAuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJtNTYwMl9wbzEwMzAuaCIKIAogc3RhdGljIGludCBwbzEwMzBfZ2V0X2V4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CkBAIC0xOTcsNyArMTk5LDcgQEAKIAogCWlmIChmb3JjZV9zZW5zb3IpIHsKIAkJaWYgKGZvcmNlX3NlbnNvciA9PSBQTzEwMzBfU0VOU09SKSB7Ci0JCQlpbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yIiwgcG8xMDMwLm5hbWUpOworCQkJcHJfaW5mbygiRm9yY2luZyBhICVzIHNlbnNvclxuIiwgcG8xMDMwLm5hbWUpOwogCQkJZ290byBzZW5zb3JfZm91bmQ7CiAJCX0KIAkJLyogSWYgd2Ugd2FudCB0byBmb3JjZSBhbm90aGVyIHNlbnNvciwgZG9uJ3QgdHJ5IHRvIHByb2JlIHRoaXMKQEAgLTIyMSw3ICsyMjMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZfaWRfaCA9PSAweDMwKSB7Ci0JCWluZm8oIkRldGVjdGVkIGEgcG8xMDMwIHNlbnNvciIpOworCQlwcl9pbmZvKCJEZXRlY3RlZCBhIHBvMTAzMCBzZW5zb3JcbiIpOwogCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNjcsNyArMjY5LDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTczMywxNiArNzM1LDE1IEBACiAJaW50IGFkZHJlc3M7CiAJdTggdmFsdWUgPSAwOwogCi0JaW5mbygiRHVtcGluZyB0aGUgcG8xMDMwIHNlbnNvciBjb3JlIHJlZ2lzdGVycyIpOworCXByX2luZm8oIkR1bXBpbmcgdGhlIHBvMTAzMCBzZW5zb3IgY29yZSByZWdpc3RlcnNcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweDdmOyBhZGRyZXNzKyspIHsKIAkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWx1ZSwgMSk7Ci0JCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCSAgICAgYWRkcmVzcywgdmFsdWUpOworCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGNvbnRhaW5zIDB4JXhcbiIsIGFkZHJlc3MsIHZhbHVlKTsKIAl9CiAKLQlpbmZvKCJwbzEwMzAgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oInBvMTAzMCByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAotCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlIik7CisJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGVcbiIpOwogCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPCAweGZmOyBhZGRyZXNzKyspIHsKIAkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlOwogCQl1OCB0ZXN0X3ZhbHVlWzJdID0gezB4ZmYsIDB4ZmZ9OwpAQCAtNzUyLDkgKzc1Myw5IEBACiAJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJaWYgKGN0cmxfdmFsdWUgPT0gdGVzdF92YWx1ZVswXSkKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlIiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwgYWRkcmVzcyk7CiAJCWVsc2UKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5IiwgYWRkcmVzcyk7CisJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwgYWRkcmVzcyk7CiAKIAkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIGFkZHJlc3MsICZvbGRfdmFsdWUsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrNGFhLmMKaW5kZXggZDI3MjgwYi4uY2M4ZWMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs0YWEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azRhYS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgIm01NjAyX3M1azRhYS5oIgogCiBzdGF0aWMgaW50IHM1azRhYV9nZXRfZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKQEAgLTI0MCw3ICsyNDIsNyBAQAogCiAJaWYgKGZvcmNlX3NlbnNvcikgewogCQlpZiAoZm9yY2Vfc2Vuc29yID09IFM1SzRBQV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBzNWs0YWEubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yXG4iLCBzNWs0YWEubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLCBkb24ndCB0cnkgdG8gcHJvYmUgdGhpcwpAQCAtMjc2LDcgKzI3OCw3IEBACiAJCQkJCQkgIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTI5Miw3ICsyOTQsNyBAQAogCWlmIChtZW1jbXAocHJvZF9pZCwgZXhwZWN0ZWRfcHJvZF9pZCwgc2l6ZW9mKHByb2RfaWQpKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZWxzZQotCQlpbmZvKCJEZXRlY3RlZCBhIHM1azRhYSBzZW5zb3IiKTsKKwkJcHJfaW5mbygiRGV0ZWN0ZWQgYSBzNWs0YWEgc2Vuc29yXG4iKTsKIAogc2Vuc29yX2ZvdW5kOgogCXNlbnNvcl9zZXR0aW5ncyA9IGttYWxsb2MoCkBAIC0zNDcsNyArMzQ5LDcgQEAKIAkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWVycigiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQkJcHJfZXJyKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC0zODMsNyArMzg1LDcgQEAKIAkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWVycigiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0Iik7CisJCQkJcHJfZXJyKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXRcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC00NDcsNyArNDQ5LDcgQEAKIAkJCQlpbml0X3M1azRhYVtpXVsxXSwgZGF0YSwgMik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWluZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdCIpOworCQkJcHJfaW5mbygiSW52YWxpZCBzdHJlYW0gY29tbWFuZCwgZXhpdGluZyBpbml0XG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtNjg2LDIwICs2ODgsMjEgQEAKIAltNTYwMl9yZWFkX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmb2xkX3BhZ2UsIDEpOwogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLNEFBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIkR1bXBpbmcgdGhlIHM1azRhYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CisJCXByX2luZm8oIkR1bXBpbmcgdGhlIHM1azRhYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCB2YWx1ZSA9IDA7CiAJCQltNTYwMl9yZWFkX3NlbnNvcihzZCwgYWRkcmVzcywgJnZhbHVlLCAxKTsKLQkJCWluZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleCIsCi0JCQkgICAgIGFkZHJlc3MsIHZhbHVlKTsKKwkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleFxuIiwKKwkJCQlhZGRyZXNzLCB2YWx1ZSk7CiAJCX0KIAl9Ci0JaW5mbygiczVrNGFhIHJlZ2lzdGVyIHN0YXRlIGR1bXAgY29tcGxldGUiKTsKKwlwcl9pbmZvKCJzNWs0YWEgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZVxuIik7CiAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgMTY7IHBhZ2UrKykgewogCQltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJnBhZ2UsIDEpOwotCQlpbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgIgotCQkgICAgICJyZWFkL3dyaXRlIGZvciBwYWdlIDB4JXgiLCBwYWdlKTsKKwkJcHJfaW5mbygiUHJvYmluZyBmb3Igd2hpY2ggcmVnaXN0ZXJzIHRoYXQgYXJlIHJlYWQvd3JpdGUgZm9yIHBhZ2UgMHgleFxuIiwKKwkJCXBhZ2UpOwogCQlmb3IgKGFkZHJlc3MgPSAwOyBhZGRyZXNzIDw9IDB4ZmY7IGFkZHJlc3MrKykgewogCQkJdTggb2xkX3ZhbHVlLCBjdHJsX3ZhbHVlLCB0ZXN0X3ZhbHVlID0gMHhmZjsKIApAQCAtNzA4LDE0ICs3MTEsMTYgQEAKIAkJCW01NjAyX3JlYWRfc2Vuc29yKHNkLCBhZGRyZXNzLCAmY3RybF92YWx1ZSwgMSk7CiAKIAkJCWlmIChjdHJsX3ZhbHVlID09IHRlc3RfdmFsdWUpCi0JCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyB3cml0ZWFibGUiLCBhZGRyZXNzKTsKKwkJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZVxuIiwKKwkJCQkJYWRkcmVzcyk7CiAJCQllbHNlCi0JCQkJaW5mbygicmVnaXN0ZXIgMHgleCBpcyByZWFkIG9ubHkiLCBhZGRyZXNzKTsKKwkJCQlwcl9pbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seVxuIiwKKwkJCQkJYWRkcmVzcyk7CiAKIAkJCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KIAkJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWx1ZSwgMSk7CiAJCX0KIAl9Ci0JaW5mbygiUmVhZC93cml0ZSByZWdpc3RlciBwcm9iaW5nIGNvbXBsZXRlIik7CisJcHJfaW5mbygiUmVhZC93cml0ZSByZWdpc3RlciBwcm9iaW5nIGNvbXBsZXRlXG4iKTsKIAltNTYwMl93cml0ZV9zZW5zb3Ioc2QsIFM1SzRBQV9QQUdFX01BUCwgJm9sZF9wYWdlLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCmluZGV4IGZiZDkxNTQuLjFkZTc0M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwpAQCAtMTYsNiArMTYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSAibTU2MDJfczVrODNhLmgiCiAKQEAgLTEzNSw3ICsxMzcsNyBAQAogCiAJaWYgKGZvcmNlX3NlbnNvcikgewogCQlpZiAoZm9yY2Vfc2Vuc29yID09IFM1SzgzQV9TRU5TT1IpIHsKLQkJCWluZm8oIkZvcmNpbmcgYSAlcyBzZW5zb3IiLCBzNWs4M2EubmFtZSk7CisJCQlwcl9pbmZvKCJGb3JjaW5nIGEgJXMgc2Vuc29yXG4iLCBzNWs4M2EubmFtZSk7CiAJCQlnb3RvIHNlbnNvcl9mb3VuZDsKIAkJfQogCQkvKiBJZiB3ZSB3YW50IHRvIGZvcmNlIGFub3RoZXIgc2Vuc29yLCBkb24ndCB0cnkgdG8gcHJvYmUgdGhpcwpAQCAtMTY4LDcgKzE3MCw3IEBACiAJaWYgKChwcm9kX2lkID09IDB4ZmYpIHx8ICh2ZXJfaWQgPT0gMHhmZikpCiAJCXJldHVybiAtRU5PREVWOwogCWVsc2UKLQkJaW5mbygiRGV0ZWN0ZWQgYSBzNWs4M2Egc2Vuc29yIik7CisJCXByX2luZm8oIkRldGVjdGVkIGEgczVrODNhIHNlbnNvclxuIik7CiAKIHNlbnNvcl9mb3VuZDoKIAlzZW5zX3ByaXYgPSBrbWFsbG9jKApAQCAtMjI3LDcgKzIyOSw3IEBACiAJCQkJaW5pdF9zNWs4M2FbaV1bMV0sIGRhdGEsIDIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvKCJJbnZhbGlkIHN0cmVhbSBjb21tYW5kLCBleGl0aW5nIGluaXQiKTsKKwkJCXByX2luZm8oIkludmFsaWQgc3RyZWFtIGNvbW1hbmQsIGV4aXRpbmcgaW5pdFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTI3Myw3ICsyNzUsNyBAQAogCQlzNWs4M2FfZ2V0X3JvdGF0aW9uKHNkLCAmcmVnKTsKIAkJaWYgKHByZXZpb3VzX3JvdGF0aW9uICE9IHJlZykgewogCQkJcHJldmlvdXNfcm90YXRpb24gPSByZWc7Ci0JCQlpbmZvKCJDYW1lcmEgd2FzIGZsaXBwZWQiKTsKKwkJCXByX2luZm8oIkNhbWVyYSB3YXMgZmxpcHBlZFxuIik7CiAKIAkJCXM1azgzYV9nZXRfdmZsaXAoKHN0cnVjdCBnc3BjYV9kZXYgKikgc2QsICZ2ZmxpcCk7CiAJCQlzNWs4M2FfZ2V0X2hmbGlwKChzdHJ1Y3QgZ3NwY2FfZGV2ICopIHNkLCAmaGZsaXApOwpAQCAtNTY2LDIwICs1NjgsMjAgQEAKIAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIkR1bXBpbmcgdGhlIHM1azgzYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4IiwgcGFnZSk7CisJCXByX2luZm8oIkR1bXBpbmcgdGhlIHM1azgzYSByZWdpc3RlciBzdGF0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCB2YWwgPSAwOwogCQkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZ2YWwsIDEpOwotCQkJaW5mbygicmVnaXN0ZXIgMHgleCBjb250YWlucyAweCV4IiwKLQkJCSAgICAgYWRkcmVzcywgdmFsKTsKKwkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggY29udGFpbnMgMHgleFxuIiwgYWRkcmVzcywgdmFsKTsKIAkJfQogCX0KLQlpbmZvKCJzNWs4M2EgcmVnaXN0ZXIgc3RhdGUgZHVtcCBjb21wbGV0ZSIpOworCXByX2luZm8oInM1azgzYSByZWdpc3RlciBzdGF0ZSBkdW1wIGNvbXBsZXRlXG4iKTsKIAogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCAxNjsgcGFnZSsrKSB7CiAJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgUzVLODNBX1BBR0VfTUFQLCAmcGFnZSwgMSk7Ci0JCWluZm8oIlByb2JpbmcgZm9yIHdoaWNoIHJlZ2lzdGVycyB0aGF0IGFyZSByZWFkL3dyaXRlICIKLQkJCQkiZm9yIHBhZ2UgMHgleCIsIHBhZ2UpOworCQlwcl9pbmZvKCJQcm9iaW5nIGZvciB3aGljaCByZWdpc3RlcnMgdGhhdCBhcmUgcmVhZC93cml0ZSBmb3IgcGFnZSAweCV4XG4iLAorCQkJcGFnZSk7CiAJCWZvciAoYWRkcmVzcyA9IDA7IGFkZHJlc3MgPD0gMHhmZjsgYWRkcmVzcysrKSB7CiAJCQl1OCBvbGRfdmFsLCBjdHJsX3ZhbCwgdGVzdF92YWwgPSAweGZmOwogCkBAIC01ODgsMTQgKzU5MCwxNiBAQAogCQkJbTU2MDJfcmVhZF9zZW5zb3Ioc2QsIGFkZHJlc3MsICZjdHJsX3ZhbCwgMSk7CiAKIAkJCWlmIChjdHJsX3ZhbCA9PSB0ZXN0X3ZhbCkKLQkJCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHdyaXRlYWJsZSIsIGFkZHJlc3MpOworCQkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggaXMgd3JpdGVhYmxlXG4iLAorCQkJCQlhZGRyZXNzKTsKIAkJCWVsc2UKLQkJCQlpbmZvKCJyZWdpc3RlciAweCV4IGlzIHJlYWQgb25seSIsIGFkZHJlc3MpOworCQkJCXByX2luZm8oInJlZ2lzdGVyIDB4JXggaXMgcmVhZCBvbmx5XG4iLAorCQkJCQlhZGRyZXNzKTsKIAogCQkJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWwgKi8KIAkJCW01NjAyX3dyaXRlX3NlbnNvcihzZCwgYWRkcmVzcywgJm9sZF92YWwsIDEpOwogCQl9CiAJfQotCWluZm8oIlJlYWQvd3JpdGUgcmVnaXN0ZXIgcHJvYmluZyBjb21wbGV0ZSIpOworCXByX2luZm8oIlJlYWQvd3JpdGUgcmVnaXN0ZXIgcHJvYmluZyBjb21wbGV0ZVxuIik7CiAJbTU2MDJfd3JpdGVfc2Vuc29yKHNkLCBTNUs4M0FfUEFHRV9NQVAsICZvbGRfcGFnZSwgMSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbWFycy5jCmluZGV4IDAxOTYyMDkuLmVmNDVmYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21hcnMuYwpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgIm1hcnMiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTc4LDggKzE4MCw4IEBACiAJCQkmYWxlbiwKIAkJCTUwMCk7CS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWcgd3JpdGUgWyUwMnhdIGVycm9yICVkIiwKLQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGUgWyUwMnhdIGVycm9yICVkXG4iLAorCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tcjk3MzEwYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tcjk3MzEwYS5jCmluZGV4IDk3ZTUwNzkuLjQ3M2U4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbXI5NzMxMGEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL21yOTczMTBhLmMKQEAgLTQwLDYgKzQwLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJtcjk3MzEwYSIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0yNjcsNyArMjY5LDcgQEAKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LCA0KSwKIAkJCSAgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sIE5VTEwsIDUwMCk7CiAJaWYgKHJjIDwgMCkKLQkJZXJyKCJyZWcgd3JpdGUgWyUwMnhdIGVycm9yICVkIiwKKwkJcHJfZXJyKCJyZWcgd3JpdGUgWyUwMnhdIGVycm9yICVkXG4iLAogCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCByYyk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMjgxLDcgKzI4Myw3IEBACiAJCQkgIHVzYl9yY3ZidWxrcGlwZShnc3BjYV9kZXYtPmRldiwgMyksCiAJCQkgIGdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLCBOVUxMLCA1MDApOwogCWlmIChyYyA8IDApCi0JCWVycigicmVnIHJlYWQgWyUwMnhdIGVycm9yICVkIiwKKwkJcHJfZXJyKCJyZWcgcmVhZCBbJTAyeF0gZXJyb3IgJWRcbiIsCiAJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC01NDAsNyArNTQyLDcgQEAKIAkJCXNkLT5zZW5zb3JfdHlwZSA9IDE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWVycigiVW5rbm93biBDSUYgU2Vuc29yIGlkIDogJTAyeCIsCisJCQlwcl9lcnIoIlVua25vd24gQ0lGIFNlbnNvciBpZCA6ICUwMnhcbiIsCiAJCQkgICAgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzFdKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC01NzUsMTAgKzU3NywxMCBAQAogCQkJc2QtPnNlbnNvcl90eXBlID0gMjsKIAkJfSBlbHNlIGlmICgoZ3NwY2FfZGV2LT51c2JfYnVmWzBdICE9IDB4MDMpICYmCiAJCQkJCShnc3BjYV9kZXYtPnVzYl9idWZbMF0gIT0gMHgwNCkpIHsKLQkJCWVycigiVW5rbm93biBWR0EgU2Vuc29yIGlkIEJ5dGUgMDogJTAyeCIsCi0JCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7Ci0JCQllcnIoIkRlZmF1bHRzIGFzc3VtZWQsIG1heSBub3Qgd29yayIpOwotCQkJZXJyKCJQbGVhc2UgcmVwb3J0IHRoaXMiKTsKKwkJCXByX2VycigiVW5rbm93biBWR0EgU2Vuc29yIGlkIEJ5dGUgMDogJTAyeFxuIiwKKwkJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOworCQkJcHJfZXJyKCJEZWZhdWx0cyBhc3N1bWVkLCBtYXkgbm90IHdvcmtcbiIpOworCQkJcHJfZXJyKCJQbGVhc2UgcmVwb3J0IHRoaXNcbiIpOwogCQl9CiAJCS8qIFNha2FyIERpZ2l0YWwgY29sb3IgbmVlZHMgdG8gYmUgYWRqdXN0ZWQuICovCiAJCWlmICgoZ3NwY2FfZGV2LT51c2JfYnVmWzBdID09IDB4MDMpICYmCkBAIC01OTUsMTAgKzU5NywxMCBAQAogCQkJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gKi8KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJZXJyKCJVbmtub3duIFZHQSBTZW5zb3IgaWQgQnl0ZSAxOiAlMDJ4IiwKLQkJCQkJZ3NwY2FfZGV2LT51c2JfYnVmWzFdKTsKLQkJCQllcnIoIkRlZmF1bHRzIGFzc3VtZWQsIG1heSBub3Qgd29yayIpOwotCQkJCWVycigiUGxlYXNlIHJlcG9ydCB0aGlzIik7CisJCQkJcHJfZXJyKCJVbmtub3duIFZHQSBTZW5zb3IgaWQgQnl0ZSAxOiAlMDJ4XG4iLAorCQkJCSAgICAgICBnc3BjYV9kZXYtPnVzYl9idWZbMV0pOworCQkJCXByX2VycigiRGVmYXVsdHMgYXNzdW1lZCwgbWF5IG5vdCB3b3JrXG4iKTsKKwkJCQlwcl9lcnIoIlBsZWFzZSByZXBvcnQgdGhpc1xuIik7CiAJCQl9CiAJCX0KIAkJUERFQlVHKERfUFJPQkUsICJNUjk3MzEwQSBWR0EgY2FtZXJhIGRldGVjdGVkLCBzZW5zb3I6ICVkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evbnc4MHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evbnc4MHguYwppbmRleCA4ZTc1NGZkLi43NjgxODE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL253ODB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9udzgweC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAibnc4MHgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTU3MSw3ICsxNTczLDcgQEAKIAkJCWxlbiwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTE1OTIsNyArMTU5NCw3IEBACiAJCQkweDAwLCBpbmRleCwKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLCA1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAkJcmV0dXJuOwogCX0KQEAgLTE4MDIsNyArMTgwNCw4IEBACiAJCX0KIAl9CiAJaWYgKHdlYmNhbV9jaGlwW3NkLT53ZWJjYW1dICE9IHNkLT5icmlkZ2UpIHsKLQkJZXJyKCJCYWQgd2ViY2FtIHR5cGUgJWQgZm9yIE5XODAlZCIsIHNkLT53ZWJjYW0sIHNkLT5icmlkZ2UpOworCQlwcl9lcnIoIkJhZCB3ZWJjYW0gdHlwZSAlZCBmb3IgTlc4MCVkXG4iLAorCQkgICAgICAgc2QtPndlYmNhbSwgc2QtPmJyaWRnZSk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FTk9ERVY7CiAJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IDE4MzA1YzguLjZhMDFiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTM2LDYgKzM2LDkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAib3Y1MTkiCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMjE3MSw3ICsyMTc0LDcgQEAKIAkJCXNkLT5nc3BjYV9kZXYudXNiX2J1ZiwgMSwgNTAwKTsKIGxlYXZlOgogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3cgJTAyeCBmYWlsZWQgJWQiLCBpbmRleCwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdyAlMDJ4IGZhaWxlZCAlZFxuIiwgaW5kZXgsIHJldCk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAkJcmV0dXJuOwogCX0KQEAgLTIyMTAsNyArMjIxMyw3IEBACiAJCVBERUJVRyhEX1VTQkksICJHRVQgJTAyeCAwMDAwICUwNHggJTAyeCIsCiAJCQlyZXEsIGluZGV4LCByZXQpOwogCX0gZWxzZSB7Ci0JCWVycigicmVnX3IgJTAyeCBmYWlsZWQgJWQiLCBpbmRleCwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciAlMDJ4IGZhaWxlZCAlZFxuIiwgaW5kZXgsIHJldCk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAl9CiAKQEAgLTIyMzUsNyArMjIzOCw3IEBACiAJaWYgKHJldCA+PSAwKSB7CiAJCXJldCA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXTsKIAl9IGVsc2UgewotCQllcnIoInJlZ19yOCAlMDJ4IGZhaWxlZCAlZCIsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ19yOCAlMDJ4IGZhaWxlZCAlZFxuIiwgaW5kZXgsIHJldCk7CiAJCXNkLT5nc3BjYV9kZXYudXNiX2VyciA9IHJldDsKIAl9CiAKQEAgLTIyODgsNyArMjI5MSw3IEBACiAJCQkwLCBpbmRleCwKIAkJCXNkLT5nc3BjYV9kZXYudXNiX2J1ZiwgbiwgNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193MzIgJTAyeCBmYWlsZWQgJWQiLCBpbmRleCwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdzMyICUwMnggZmFpbGVkICVkXG4iLCBpbmRleCwgcmV0KTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTI0NTcsNyArMjQ2MCw3IEBACiAJCQkodTE2KSB2YWx1ZSwgKHUxNikgcmVnLCBOVUxMLCAwLCA1MDApOwogCiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJvdmZ4Ml9pMmNfdyAlMDJ4IGZhaWxlZCAlZCIsIHJlZywgcmV0KTsKKwkJcHJfZXJyKCJvdmZ4Ml9pMmNfdyAlMDJ4IGZhaWxlZCAlZFxuIiwgcmVnLCByZXQpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogCkBAIC0yNDgxLDcgKzI0ODQsNyBAQAogCQlyZXQgPSBzZC0+Z3NwY2FfZGV2LnVzYl9idWZbMF07CiAJCVBERUJVRyhEX1VTQkksICJvdmZ4Ml9pMmNfciAlMDJ4ICUwMngiLCByZWcsIHJldCk7CiAJfSBlbHNlIHsKLQkJZXJyKCJvdmZ4Ml9pMmNfciAlMDJ4IGZhaWxlZCAlZCIsIHJlZywgcmV0KTsKKwkJcHJfZXJyKCJvdmZ4Ml9pMmNfciAlMDJ4IGZhaWxlZCAlZFxuIiwgcmVnLCByZXQpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogCkBAIC0yNzI3LDcgKzI3MzAsNyBAQAogCWludCBoaWdoLCBsb3c7CiAKIAlpZiAoc2QtPmJyaWRnZSAhPSBCUklER0VfT1ZGWDIpIHsKLQkJZXJyKCJlcnJvciBoaXJlcyBzZW5zb3JzIG9ubHkgc3VwcG9ydGVkIHdpdGggb3ZmeDIiKTsKKwkJcHJfZXJyKCJlcnJvciBoaXJlcyBzZW5zb3JzIG9ubHkgc3VwcG9ydGVkIHdpdGggb3ZmeDJcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNzYyLDcgKzI3NjUsNyBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQllcnIoIkVycm9yIHVua25vd24gc2Vuc29yIHR5cGU6ICUwMnglMDJ4IiwgaGlnaCwgbG93KTsKKwlwcl9lcnIoIkVycm9yIHVua25vd24gc2Vuc29yIHR5cGU6ICUwMnglMDJ4XG4iLCBoaWdoLCBsb3cpOwogfQogCiAvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjgxMTAsIE9WODYxMCBzZW5zb3IuIFRoZSBPVjgxMTAgdXNlcwpAQCAtMjc4Myw3ICsyNzg2LDcgQEAKIAlpZiAoKHJjICYgMykgPT0gMSkKIAkJc2QtPnNlbnNvciA9IFNFTl9PVjg2MTA7CiAJZWxzZQotCQllcnIoIlVua25vd24gaW1hZ2Ugc2Vuc29yIHZlcnNpb246ICVkIiwgcmMgJiAzKTsKKwkJcHJfZXJyKCJVbmtub3duIGltYWdlIHNlbnNvciB2ZXJzaW9uOiAlZFxuIiwgcmMgJiAzKTsKIH0KIAogLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1Y3NjEwLCBPVjc2MjAsIG9yIE9WNzZCRSBzZW5zb3IuIFRoZSBPVjc2QkUgdXNlcwpAQCAtMjg0MCw4ICsyODQzLDggQEAKIAkJaWYgKGhpZ2ggPT0gMHg3NikgewogCQkJc3dpdGNoIChsb3cpIHsKIAkJCWNhc2UgMHgzMDoKLQkJCQllcnIoIlNlbnNvciBpcyBhbiBPVjc2MzAvT1Y3NjM1Iik7Ci0JCQkJZXJyKCI3NjMwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIiKTsKKwkJCQlwcl9lcnIoIlNlbnNvciBpcyBhbiBPVjc2MzAvT1Y3NjM1XG4iKTsKKwkJCQlwcl9lcnIoIjc2MzAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlclxuIik7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSAweDQwOgogCQkJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGFuIE9WNzY0NSIpOwpAQCAtMjg2OCw3ICsyODcxLDcgQEAKIAkJCXNkLT5zZW5zb3IgPSBTRU5fT1Y3NjIwOwogCQl9CiAJfSBlbHNlIHsKLQkJZXJyKCJVbmtub3duIGltYWdlIHNlbnNvciB2ZXJzaW9uOiAlZCIsIHJjICYgMyk7CisJCXByX2VycigiVW5rbm93biBpbWFnZSBzZW5zb3IgdmVyc2lvbjogJWRcbiIsIHJjICYgMyk7CiAJfQogfQogCkBAIC0yODkxLDggKzI4OTQsNyBAQAogCXN3aXRjaCAocmMpIHsKIAljYXNlIDB4MDA6CiAJCXNkLT5zZW5zb3IgPSBTRU5fT1Y2NjMwOwotCQl3YXJuKCJXQVJOSU5HOiBTZW5zb3IgaXMgYW4gT1Y2NjMwOC4gWW91ciBjYW1lcmEgbWF5IGhhdmUiKTsKLQkJd2FybigiYmVlbiBtaXNkZXRlY3RlZCBpbiBwcmV2aW91cyBkcml2ZXIgdmVyc2lvbnMuIik7CisJCXByX3dhcm4oIldBUk5JTkc6IFNlbnNvciBpcyBhbiBPVjY2MzA4LiBZb3VyIGNhbWVyYSBtYXkgaGF2ZSBiZWVuIG1pc2RldGVjdGVkIGluIHByZXZpb3VzIGRyaXZlciB2ZXJzaW9ucy5cbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDE6CiAJCXNkLT5zZW5zb3IgPSBTRU5fT1Y2NjIwOwpAQCAtMjkwOCwxMSArMjkxMCwxMCBAQAogCQlicmVhazsKIAljYXNlIDB4OTA6CiAJCXNkLT5zZW5zb3IgPSBTRU5fT1Y2NjMwOwotCQl3YXJuKCJXQVJOSU5HOiBTZW5zb3IgaXMgYW4gT1Y2NjMwNy4gWW91ciBjYW1lcmEgbWF5IGhhdmUiKTsKLQkJd2FybigiYmVlbiBtaXNkZXRlY3RlZCBpbiBwcmV2aW91cyBkcml2ZXIgdmVyc2lvbnMuIik7CisJCXByX3dhcm4oIldBUk5JTkc6IFNlbnNvciBpcyBhbiBPVjY2MzA3LiBZb3VyIGNhbWVyYSBtYXkgaGF2ZSBiZWVuIG1pc2RldGVjdGVkIGluIHByZXZpb3VzIGRyaXZlciB2ZXJzaW9ucy5cbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnIoIkZBVEFMOiBVbmtub3duIHNlbnNvciB2ZXJzaW9uOiAweCUwMngiLCByYyk7CisJCXByX2VycigiRkFUQUw6IFVua25vd24gc2Vuc29yIHZlcnNpb246IDB4JTAyeFxuIiwgcmMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNDA1LDcgKzM0MDYsNyBAQAogCX0gZWxzZSBpZiAoaW5pdF9vdl9zZW5zb3Ioc2QsIE9WX0hJUkVTX1NJRCkgPj0gMCkgewogCQlvdl9oaXJlc19jb25maWd1cmUoc2QpOwogCX0gZWxzZSB7Ci0JCWVycigiQ2FuJ3QgZGV0ZXJtaW5lIHNlbnNvciBzbGF2ZSBJRHMiKTsKKwkJcHJfZXJyKCJDYW4ndCBkZXRlcm1pbmUgc2Vuc29yIHNsYXZlIElEc1xuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0zNTkwLDcgKzM1OTEsNyBAQAogCWludGYgPSB1c2JfaWZudW1fdG9faWYoc2QtPmdzcGNhX2Rldi5kZXYsIHNkLT5nc3BjYV9kZXYuaWZhY2UpOwogCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCBzZC0+Z3NwY2FfZGV2LmFsdCk7CiAJaWYgKCFhbHQpIHsKLQkJZXJyKCJDb3VsZG4ndCBnZXQgYWx0c2V0dGluZyIpOworCQlwcl9lcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nXG4iKTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gLUVJTzsKIAkJcmV0dXJuOwogCX0KQEAgLTM3MTMsNyArMzcxNCw3IEBACiAJaW50ZiA9IHVzYl9pZm51bV90b19pZihzZC0+Z3NwY2FfZGV2LmRldiwgc2QtPmdzcGNhX2Rldi5pZmFjZSk7CiAJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIHNkLT5nc3BjYV9kZXYuYWx0KTsKIAlpZiAoIWFsdCkgewotCQllcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nIik7CisJCXByX2VycigiQ291bGRuJ3QgZ2V0IGFsdHNldHRpbmdcbiIpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSAtRUlPOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUzNC5jCmluZGV4IDBjNjM2OWIuLjc2OTA3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0LmMKQEAgLTI4LDYgKzI4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJvdjUzNCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC03NzUsNyArNzc3LDcgQEAKIAkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDB4MDAsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBDVFJMX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigid3JpdGUgZmFpbGVkICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJ3cml0ZSBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC03OTQsNyArNzk2LDcgQEAKIAkJCSAgICAgIDB4MDAsIHJlZywgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBDVFJMX1RJTUVPVVQpOwogCVBERUJVRyhEX1VTQkksICJHRVQgMDEgMDAwMCAlMDR4ICUwMngiLCByZWcsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWFkIGZhaWxlZCAlZCIsIHJldCk7CisJCXByX2VycigicmVhZCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiAJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKQEAgLTg1OCw3ICs4NjAsNyBAQAogCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1dSSVRFXzMpOwogCiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKSB7Ci0JCWVycigic2NjYl9yZWdfd3JpdGUgZmFpbGVkIik7CisJCXByX2Vycigic2NjYl9yZWdfd3JpdGUgZmFpbGVkXG4iKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVJTzsKIAl9CiB9CkBAIC04NjgsMTEgKzg3MCwxMSBAQAogCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIE9WNTM0X1JFR19TVUJBRERSLCByZWcpOwogCW92NTM0X3JlZ193cml0ZShnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1dSSVRFXzIpOwogCWlmICghc2NjYl9jaGVja19zdGF0dXMoZ3NwY2FfZGV2KSkKLQkJZXJyKCJzY2NiX3JlZ19yZWFkIGZhaWxlZCAxIik7CisJCXByX2Vycigic2NjYl9yZWdfcmVhZCBmYWlsZWQgMVxuIik7CiAKIAlvdjUzNF9yZWdfd3JpdGUoZ3NwY2FfZGV2LCBPVjUzNF9SRUdfT1BFUkFUSU9OLCBPVjUzNF9PUF9SRUFEXzIpOwogCWlmICghc2NjYl9jaGVja19zdGF0dXMoZ3NwY2FfZGV2KSkKLQkJZXJyKCJzY2NiX3JlZ19yZWFkIGZhaWxlZCAyIik7CisJCXByX2Vycigic2NjYl9yZWdfcmVhZCBmYWlsZWQgMlxuIik7CiAKIAlyZXR1cm4gb3Y1MzRfcmVnX3JlYWQoZ3NwY2FfZGV2LCBPVjUzNF9SRUdfUkVBRCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTM0XzkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzRfOS5jCmluZGV4IGFhZjU0MjguLmIzYjFlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzRfOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MzRfOS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIG92NTM0LW92OTY1eCBnc3BjYSBkcml2ZXIKKyAqIG92NTM0LW92OXh4eCBnc3BjYSBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBKZWFuLUZyYW5jb2lzIE1vaW5lIGh0dHA6Ly9tb2luZWpmLmZyZWUuZnIKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIEplYW4tRnJhbmNvaXMgTW9pbmUgaHR0cDovL21vaW5lamYuZnJlZS5mcgogICogQ29weXJpZ2h0IChDKSAyMDA4IEFudG9uaW8gT3NwaXRlIDxvc3BpdGVAc3R1ZGVudGkudW5pbmEuaXQ+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmltIFBhcmlzIDxqaW1AanRhbi5jb20+CiAgKgpAQCAtMjQsNiArMjQsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgIm92NTM0XzkiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtNDUsMzkgKzQ3LDQ0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkdTUENBL09WNTM0XzkgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorLyogY29udHJvbHMgKi8KK2VudW0gZV9jdHJsIHsKKwlCUklHSFRORVNTLAorCUNPTlRSQVNULAorCUFVVE9HQUlOLAorCUVYUE9TVVJFLAorCVNIQVJQTkVTUywKKwlTQVRVUiwKKwlMSUdIVEZSRVEsCisJTkNUUkxTCQkvKiBudW1iZXIgb2YgY29udHJvbHMgKi8KK307CisKIC8qIHNwZWNpZmljIHdlYmNhbSBkZXNjcmlwdG9yICovCiBzdHJ1Y3Qgc2QgewogCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisJc3RydWN0IGdzcGNhX2N0cmwgY3RybHNbTkNUUkxTXTsKIAlfX3UzMiBsYXN0X3B0czsKIAl1OCBsYXN0X2ZpZDsKIAotCXU4IGJyaWdodG5lc3M7Ci0JdTggY29udHJhc3Q7Ci0JdTggYXV0b2dhaW47Ci0JdTggZXhwb3N1cmU7Ci0Jczggc2hhcnBuZXNzOwotCXU4IHNhdHVyOwotCXU4IGZyZXE7CisJdTggc2Vuc29yOworfTsKK2VudW0gc2Vuc29ycyB7CisJU0VOU09SX09WOTY1eCwJCS8qIG92OTY1NyAqLworCVNFTlNPUl9PVjk3MXgsCQkvKiBvdjk3MTIgKi8KKwlOU0VOU09SUwogfTsKIAogLyogVjRMMiBjb250cm9scyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwotc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKLXN0YXRpYyBpbnQgc2RfZ2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRjb250cmFzdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7Ci1zdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7Ci1zdGF0aWMgaW50IHNkX3NldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKLXN0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKLXN0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKLXN0YXRpYyBpbnQgc2Rfc2V0c2F0dXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwotc3RhdGljIGludCBzZF9nZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwotc3RhdGljIGludCBzZF9zZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKLXN0YXRpYyBpbnQgc2RfZ2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOworc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKK3N0YXRpYyB2b2lkIHNldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0c2hhcnBuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0bGlnaHRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tdID0gewotICAgIHsJCQkJCQkJLyogMCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW05DVFJMU10gPSB7CitbQlJJR0hUTkVTU10gPSB7CiAJewogCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTg1LDEzICs5MiwxMSBAQAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gMTUsCiAJCS5zdGVwICAgID0gMSwKLSNkZWZpbmUgQlJJR0hUTkVTU19ERUYgNwotCQkuZGVmYXVsdF92YWx1ZSA9IEJSSUdIVE5FU1NfREVGLAorCQkuZGVmYXVsdF92YWx1ZSA9IDcKIAl9LAotCS5zZXQgPSBzZF9zZXRicmlnaHRuZXNzLAotCS5nZXQgPSBzZF9nZXRicmlnaHRuZXNzLAorCS5zZXRfY29udHJvbCA9IHNldGJyaWdodG5lc3MKICAgICB9LAotICAgIHsJCQkJCQkJLyogMSAqLworW0NPTlRSQVNUXSA9IHsKIAl7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTk5LDEzICsxMDQsMTEgQEAKIAkJLm1pbmltdW0gPSAwLAogCQkubWF4aW11bSA9IDE1LAogCQkuc3RlcCAgICA9IDEsCi0jZGVmaW5lIENPTlRSQVNUX0RFRiAzCi0JCS5kZWZhdWx0X3ZhbHVlID0gQ09OVFJBU1RfREVGLAorCQkuZGVmYXVsdF92YWx1ZSA9IDMKIAl9LAotCS5zZXQgPSBzZF9zZXRjb250cmFzdCwKLQkuZ2V0ID0gc2RfZ2V0Y29udHJhc3QsCisJLnNldF9jb250cm9sID0gc2V0Y29udHJhc3QKICAgICB9LAotICAgIHsJCQkJCQkJLyogMiAqLworW0FVVE9HQUlOXSA9IHsKIAl7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfQVVUT0dBSU4sCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKQEAgLTExNiwxMSArMTE5LDkgQEAKICNkZWZpbmUgQVVUT0dBSU5fREVGIDEKIAkJLmRlZmF1bHRfdmFsdWUgPSBBVVRPR0FJTl9ERUYsCiAJfSwKLQkuc2V0ID0gc2Rfc2V0YXV0b2dhaW4sCi0JLmdldCA9IHNkX2dldGF1dG9nYWluLAorCS5zZXRfY29udHJvbCA9IHNldGF1dG9nYWluCiAgICAgfSwKLSNkZWZpbmUgRVhQT19JRFggMwotICAgIHsJCQkJCQkJLyogMyAqLworW0VYUE9TVVJFXSA9IHsKIAl7CiAJCS5pZCAgICAgID0gVjRMMl9DSURfRVhQT1NVUkUsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTEyOCwxMyArMTI5LDExIEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSAzLAogCQkuc3RlcCAgICA9IDEsCi0jZGVmaW5lIEVYUE9fREVGIDAKLQkJLmRlZmF1bHRfdmFsdWUgPSBFWFBPX0RFRiwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwCiAJfSwKLQkuc2V0ID0gc2Rfc2V0ZXhwb3N1cmUsCi0JLmdldCA9IHNkX2dldGV4cG9zdXJlLAorCS5zZXRfY29udHJvbCA9IHNldGV4cG9zdXJlCiAgICAgfSwKLSAgICB7CQkJCQkJCS8qIDQgKi8KK1tTSEFSUE5FU1NdID0gewogCXsKIAkJLmlkICAgICAgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTE0MiwxMyArMTQxLDExIEBACiAJCS5taW5pbXVtID0gLTEsCQkvKiAtMSA9IGF1dG8gKi8KIAkJLm1heGltdW0gPSA0LAogCQkuc3RlcCAgICA9IDEsCi0jZGVmaW5lIFNIQVJQTkVTU19ERUYgLTEKLQkJLmRlZmF1bHRfdmFsdWUgPSBTSEFSUE5FU1NfREVGLAorCQkuZGVmYXVsdF92YWx1ZSA9IC0xCiAJfSwKLQkuc2V0ID0gc2Rfc2V0c2hhcnBuZXNzLAotCS5nZXQgPSBzZF9nZXRzaGFycG5lc3MsCisJLnNldF9jb250cm9sID0gc2V0c2hhcnBuZXNzCiAgICAgfSwKLSAgICB7CQkJCQkJCS8qIDUgKi8KK1tTQVRVUl0gPSB7CiAJewogCQkuaWQgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTE1NiwxMyArMTUzLDExIEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSA0LAogCQkuc3RlcCAgICA9IDEsCi0jZGVmaW5lIFNBVFVSX0RFRiAyCi0JCS5kZWZhdWx0X3ZhbHVlID0gU0FUVVJfREVGLAorCQkuZGVmYXVsdF92YWx1ZSA9IDIKIAl9LAotCS5zZXQgPSBzZF9zZXRzYXR1ciwKLQkuZ2V0ID0gc2RfZ2V0c2F0dXIsCisJLnNldF9jb250cm9sID0gc2V0c2F0dXIKICAgICB9LAotICAgIHsKK1tMSUdIVEZSRVFdID0gewogCXsKIAkJLmlkCSA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAogCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCkBAIC0xNzAsMTEgKzE2NSw5IEBACiAJCS5taW5pbXVtID0gMCwKIAkJLm1heGltdW0gPSAyLAkvKiAwOiAwLCAxOiA1MEh6LCAyOjYwSHogKi8KIAkJLnN0ZXAgICAgPSAxLAotI2RlZmluZSBGUkVRX0RFRiAwCi0JCS5kZWZhdWx0X3ZhbHVlID0gRlJFUV9ERUYsCisJCS5kZWZhdWx0X3ZhbHVlID0gMAogCX0sCi0JLnNldCA9IHNkX3NldGZyZXEsCi0JLmdldCA9IHNkX2dldGZyZXEsCisJLnNldF9jb250cm9sID0gc2V0bGlnaHRmcmVxCiAgICAgfSwKIH07CiAKQEAgLTIwNiw2ICsxOTksMTQgQEAKIAkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBvdjk3MXhfbW9kZVtdID0geworCXs2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gNjQwLAorCQkuc2l6ZWltYWdlID0gNjQwICogNDgwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCCisJfQorfTsKKwogc3RhdGljIGNvbnN0IHU4IGJyaWRnZV9pbml0W11bMl0gPSB7CiAJezB4ODgsIDB4Zjh9LAogCXsweDg5LCAweGZmfSwKQEAgLTI0MCw3ICsyNDEsNyBAQAogCXsweDk0LCAweDExfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3JfaW5pdFtdWzJdID0geworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9pbml0W11bMl0gPSB7CiAJezB4MTIsIDB4ODB9LAkvKiBjb203IC0gU1NDQiByZXNldCAqLwogCXsweDAwLCAweDAwfSwJLyogZ2FpbiAqLwogCXsweDAxLCAweDgwfSwJLyogYmx1ZSAqLwpAQCAtNDUwLDcgKzQ1MSw3IEBACiAJezB4OTQsIDB4MTF9LAogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9pbml0XzJbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvdjk2NXhfaW5pdF8yW11bMl0gPSB7CiAJezB4M2IsIDB4YzR9LAogCXsweDFlLCAweDA0fSwJLyogbXZmcCAqLwogCXsweDEzLCAweGUwfSwJLyogY29tOCAqLwpAQCAtNDkyLDcgKzQ5Myw2NSBAQAogCXsweDEzLCAweGU3fSwJLyogY29tOCAtIGV2ZXJ5dGhpbmcgKEFHQywgQVdCIGFuZCBBRUMpICovCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzFfdmdhW11bMl0gPSB7CS8qIHNhbWUgZm9yIHF2Z2EgKi8KK3N0YXRpYyBjb25zdCB1OCBvdjk3MXhfaW5pdFtdWzJdID0geworCXsweDEyLCAweDgwfSwKKwl7MHgwOSwgMHgxMH0sCisJezB4MWUsIDB4MDd9LAorCXsweDVmLCAweDE4fSwKKwl7MHg2OSwgMHgwNH0sCisJezB4NjUsIDB4MmF9LAorCXsweDY4LCAweDBhfSwKKwl7MHgzOSwgMHgyOH0sCisJezB4NGQsIDB4OTB9LAorCXsweGMxLCAweDgwfSwKKwl7MHgwYywgMHgzMH0sCisJezB4NmQsIDB4MDJ9LAorCXsweDk2LCAweGYxfSwKKwl7MHhiYywgMHg2OH0sCisJezB4MTIsIDB4MDB9LAorCXsweDNiLCAweDAwfSwKKwl7MHg5NywgMHg4MH0sCisJezB4MTcsIDB4MjV9LAorCXsweDE4LCAweGEyfSwKKwl7MHgxOSwgMHgwMX0sCisJezB4MWEsIDB4Y2F9LAorCXsweDAzLCAweDBhfSwKKwl7MHgzMiwgMHgwN30sCisJezB4OTgsIDB4NDB9LAkvKnsweDk4LCAweDAwfSwqLworCXsweDk5LCAweEEwfSwJLyp7MHg5OSwgMHgwMH0sKi8KKwl7MHg5YSwgMHgwMX0sCS8qezB4OWEsIDB4MDB9LCovCisJezB4NTcsIDB4MDB9LAorCXsweDU4LCAweDc4fSwJLyp7MHg1OCwgMHhjOH0sKi8KKwl7MHg1OSwgMHg1MH0sCS8qezB4NTksIDB4YTB9LCovCisJezB4NGMsIDB4MTN9LAorCXsweDRiLCAweDM2fSwKKwl7MHgzZCwgMHgzY30sCisJezB4M2UsIDB4MDN9LAorCXsweGJkLCAweDUwfSwJLyp7MHhiZCwgMHhhMH0sKi8KKwl7MHhiZSwgMHg3OH0sCS8qezB4YmUsIDB4Yzh9LCovCisJezB4NGUsIDB4NTV9LAorCXsweDRmLCAweDU1fSwKKwl7MHg1MCwgMHg1NX0sCisJezB4NTEsIDB4NTV9LAorCXsweDI0LCAweDU1fSwKKwl7MHgyNSwgMHg0MH0sCisJezB4MjYsIDB4YTF9LAorCXsweDVjLCAweDU5fSwKKwl7MHg1ZCwgMHgwMH0sCisJezB4MTEsIDB4MDB9LAorCXsweDJhLCAweDk4fSwKKwl7MHgyYiwgMHgwNn0sCisJezB4MmQsIDB4MDB9LAorCXsweDJlLCAweDAwfSwKKwl7MHgxMywgMHhhNX0sCisJezB4MTQsIDB4NDB9LAorCXsweDRhLCAweDAwfSwKKwl7MHg0OSwgMHhjZX0sCisJezB4MjIsIDB4MDN9LAorCXsweDA5LCAweDAwfQorfTsKKworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9zdGFydF8xX3ZnYVtdWzJdID0gewkvKiBzYW1lIGZvciBxdmdhICovCiAJezB4MTIsIDB4NjJ9LAkvKiBjb203IC0gMzBmcHMgVkdBIFlVViAqLwogCXsweDM2LCAweGZhfSwJLyogYXJlZjMgKi8KIAl7MHg2OSwgMHgwYX0sCS8qIGh2ICovCkBAIC01MTUsNyArNTc0LDcgQEAKIAl7MHhjMCwgMHhhYX0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzFfc3ZnYVtdWzJdID0geworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9zdGFydF8xX3N2Z2FbXVsyXSA9IHsKIAl7MHgxMiwgMHgwMn0sCS8qIGNvbTcgLSBZVVlWIC0gVkdBIDE1IGZ1bGwgcmVzb2x1dGlvbiAqLwogCXsweDM2LCAweGY4fSwJLyogYXJlZjMgKi8KIAl7MHg2OSwgMHgwMn0sCS8qIGh2ICovCkBAIC01MzcsNyArNTk2LDcgQEAKIAl7MHhjMCwgMHhlMn0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzFfeGdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzFfeGdhW11bMl0gPSB7CiAJezB4MTIsIDB4MDJ9LAkvKiBjb203ICovCiAJezB4MzYsIDB4Zjh9LAkvKiBhcmVmMyAqLwogCXsweDY5LCAweDAyfSwJLyogaHYgKi8KQEAgLTU2MCw3ICs2MTksNyBAQAogCXsweGMwLCAweGUyfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMV9zeGdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzFfc3hnYVtdWzJdID0gewogCXsweDEyLCAweDAyfSwJLyogY29tNyAqLwogCXsweDM2LCAweGY4fSwJLyogYXJlZjMgKi8KIAl7MHg2OSwgMHgwMn0sCS8qIGh2ICovCkBAIC03MDksNyArNzY4LDcgQEAKIAl7MHg5NCwgMHgxMX0sCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzJfcXZnYVtdWzJdID0geworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9zdGFydF8yX3F2Z2FbXVsyXSA9IHsKIAl7MHgzYiwgMHhlNH0sCS8qIGNvbTExIC0gbmlnaHQgbW9kZSAxLzQgZnJhbWUgcmF0ZSAqLwogCXsweDFlLCAweDA0fSwJLyogbXZmcCAqLwogCXsweDEzLCAweGUwfSwJLyogY29tOCAqLwpAQCAtNzI3LDcgKzc4Niw3IEBACiAJezB4M2EsIDB4ODB9LAkvKiB0c2xiIC0geXV5diAqLwogfTsKIAotc3RhdGljIGNvbnN0IHU4IHNlbnNvcl9zdGFydF8yX3ZnYVtdWzJdID0geworc3RhdGljIGNvbnN0IHU4IG92OTY1eF9zdGFydF8yX3ZnYVtdWzJdID0gewogCXsweDNiLCAweGM0fSwJLyogY29tMTEgLSBuaWdodCBtb2RlIDEvNCBmcmFtZSByYXRlICovCiAJezB4MWUsIDB4MDR9LAkvKiBtdmZwICovCiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCkBAIC03NDMsNyArODAyLDcgQEAKIAl7MHgyZCwgMHgwMH0sCS8qIGFkdmZsICovCiB9OwogCi1zdGF0aWMgY29uc3QgdTggc2Vuc29yX3N0YXJ0XzJfc3ZnYVtdWzJdID0gewkvKiBzYW1lIGZvciB4Z2EgKi8KK3N0YXRpYyBjb25zdCB1OCBvdjk2NXhfc3RhcnRfMl9zdmdhW11bMl0gPSB7CS8qIHNhbWUgZm9yIHhnYSAqLwogCXsweDNiLCAweGM0fSwJLyogY29tMTEgLSBuaWdodCBtb2RlIDEvNCBmcmFtZSByYXRlICovCiAJezB4MWUsIDB4MDR9LAkvKiBtdmZwICovCiAJezB4MTMsIDB4ZTB9LAkvKiBjb204ICovCkBAIC03NTcsNyArODE2LDcgQEAKIAl7MHhhMywgMHg0MX0sCS8qIGJkNjAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCB1OCBzZW5zb3Jfc3RhcnRfMl9zeGdhW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTggb3Y5NjV4X3N0YXJ0XzJfc3hnYVtdWzJdID0gewogCXsweDEzLCAweGUwfSwJLyogY29tOCAqLwogCXsweDAwLCAweDAwfSwKIAl7MHgxMywgMHhlN30sCS8qIGNvbTggLSBldmVyeXRoaW5nIChBR0MsIEFXQiBhbmQgQUVDKSAqLwpAQCAtNzg1LDcgKzg0NCw3IEBACiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkgICAgICAweDAwLCByZWcsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193IGZhaWxlZCAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3cgZmFpbGVkICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtODEwLDcgKzg2OSw3IEBACiAJCQkgICAgICAweDAwLCByZWcsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwgQ1RSTF9USU1FT1VUKTsKIAlQREVCVUcoRF9VU0JJLCAicmVnX3IgWyUwNHhdIC0+ICUwMngiLCByZWcsIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfciBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ19yIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIAlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOwpAQCAtODQ4LDcgKzkwNyw3IEBACiAJcmVnX3dfaShnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1dSSVRFXzMpOwogCiAJaWYgKCFzY2NiX2NoZWNrX3N0YXR1cyhnc3BjYV9kZXYpKQotCQllcnIoInNjY2Jfd3JpdGUgZmFpbGVkIik7CisJCXByX2Vycigic2NjYl93cml0ZSBmYWlsZWRcbiIpOwogfQogCiBzdGF0aWMgdTggc2NjYl9yZWFkKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHJlZykKQEAgLTg1NiwxMSArOTE1LDExIEBACiAJcmVnX3coZ3NwY2FfZGV2LCBPVjUzNF9SRUdfU1VCQUREUiwgcmVnKTsKIAlyZWdfdyhnc3BjYV9kZXYsIE9WNTM0X1JFR19PUEVSQVRJT04sIE9WNTM0X09QX1dSSVRFXzIpOwogCWlmICghc2NjYl9jaGVja19zdGF0dXMoZ3NwY2FfZGV2KSkKLQkJZXJyKCJzY2NiX3JlYWQgZmFpbGVkIDEiKTsKKwkJcHJfZXJyKCJzY2NiX3JlYWQgZmFpbGVkIDFcbiIpOwogCiAJcmVnX3coZ3NwY2FfZGV2LCBPVjUzNF9SRUdfT1BFUkFUSU9OLCBPVjUzNF9PUF9SRUFEXzIpOwogCWlmICghc2NjYl9jaGVja19zdGF0dXMoZ3NwY2FfZGV2KSkKLQkJZXJyKCJzY2NiX3JlYWQgZmFpbGVkIDIiKTsKKwkJcHJfZXJyKCJzY2NiX3JlYWQgZmFpbGVkIDJcbiIpOwogCiAJcmV0dXJuIHJlZ19yKGdzcGNhX2RldiwgT1Y1MzRfUkVHX1JFQUQpOwogfQpAQCAtOTIyLDcgKzk4MSw5IEBACiAJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXU4IHZhbDsKIAotCXZhbCA9IHNkLT5icmlnaHRuZXNzOworCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgQlJJR0hUTkVTUykpCisJCXJldHVybjsKKwl2YWwgPSBzZC0+Y3RybHNbQlJJR0hUTkVTU10udmFsOwogCWlmICh2YWwgPCA4KQogCQl2YWwgPSAxNSAtIHZhbDsJCS8qIGYgLi4gOCAqLwogCWVsc2UKQEAgLTkzNSw4ICs5OTYsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IENPTlRSQVNUKSkKKwkJcmV0dXJuOwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweDU2LAkvKiBjbnN0MSAtIGNvbnRyYXN0IDEgY3RybCBjb2VmZiAqLwotCQkJc2QtPmNvbnRyYXN0IDw8IDQpOworCQkJc2QtPmN0cmxzW0NPTlRSQVNUXS52YWwgPDwgNCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKQEAgLTk0NCwxMCArMTAwNywxMiBAQAogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAl1OCB2YWw7CiAKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IEFVVE9HQUlOKSkKKwkJcmV0dXJuOwogLypmaXhtZTogc2hvdWxkIGFkanVzdCBhZ2MvYXdiL2FlYyBieSBkaWZmZXJlbnQgY29udHJvbHMgKi8KIAl2YWwgPSBzY2NiX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJCS8qIGNvbTggKi8KIAlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7Ci0JaWYgKHNkLT5hdXRvZ2FpbikKKwlpZiAoc2QtPmN0cmxzW0FVVE9HQUlOXS52YWwpCiAJCXZhbCB8PSAweDA1OwkJLyogYWdjICYgYWVjICovCiAJZWxzZQogCQl2YWwgJj0gMHhmYTsKQEAgLTk2MCw4ICsxMDI1LDEwIEBACiAJdTggdmFsOwogCXN0YXRpYyBjb25zdCB1OCBleHBvWzRdID0gezB4MDAsIDB4MjUsIDB4MzgsIDB4NWV9OwogCisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBFWFBPU1VSRSkpCisJCXJldHVybjsKIAlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHgxMCwJCQkvKiBhZWNbOToyXSAqLwotCQkJZXhwb1tzZC0+ZXhwb3N1cmVdKTsKKwkJCWV4cG9bc2QtPmN0cmxzW0VYUE9TVVJFXS52YWxdKTsKIAogCXZhbCA9IHNjY2JfcmVhZChnc3BjYV9kZXYsIDB4MTMpOwkJLyogY29tOCAqLwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsKQEAgLTk3Nyw3ICsxMDQ0LDkgQEAKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CiAJczggdmFsOwogCi0JdmFsID0gc2QtPnNoYXJwbmVzczsKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IFNIQVJQTkVTUykpCisJCXJldHVybjsKKwl2YWwgPSBzZC0+Y3RybHNbU0hBUlBORVNTXS52YWw7CiAJaWYgKHZhbCA8IDApIHsJCQkJLyogYXV0byAqLwogCQl2YWwgPSBzY2NiX3JlYWQoZ3NwY2FfZGV2LCAweDQyKTsJLyogY29tMTcgKi8KIAkJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwpAQCAtMTAwNiw4ICsxMDc1LDEwIEBACiAJCXsweDQ4LCAweDkwfQogCX07CiAKLQl2YWwxID0gbWF0cml4W3NkLT5zYXR1cl1bMF07Ci0JdmFsMiA9IG1hdHJpeFtzZC0+c2F0dXJdWzFdOworCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgU0FUVVIpKQorCQlyZXR1cm47CisJdmFsMSA9IG1hdHJpeFtzZC0+Y3RybHNbU0FUVVJdLnZhbF1bMF07CisJdmFsMiA9IG1hdHJpeFtzZC0+Y3RybHNbU0FUVVJdLnZhbF1bMV07CiAJdmFsMyA9IHZhbDEgKyB2YWwyOwogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweDRmLCB2YWwzKTsJLyogbWF0cml4IGNvZWZmICovCiAJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4NTAsIHZhbDMpOwpAQCAtMTAyMiwxNCArMTA5MywxNiBAQAogCXNjY2Jfd3JpdGUoZ3NwY2FfZGV2LCAweDQxLCB2YWwxKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0ZnJlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCitzdGF0aWMgdm9pZCBzZXRsaWdodGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogewogCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKIAl1OCB2YWw7CiAKKwlpZiAoZ3NwY2FfZGV2LT5jdHJsX2RpcyAmICgxIDw8IExJR0hURlJFUSkpCisJCXJldHVybjsKIAl2YWwgPSBzY2NiX3JlYWQoZ3NwY2FfZGV2LCAweDEzKTsJCS8qIGNvbTggKi8KIAlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7Ci0JaWYgKHNkLT5mcmVxID09IDApIHsKKwlpZiAoc2QtPmN0cmxzW0xJR0hURlJFUV0udmFsID09IDApIHsKIAkJc2NjYl93cml0ZShnc3BjYV9kZXYsIDB4MTMsIHZhbCAmIDB4ZGYpOwogCQlyZXR1cm47CiAJfQpAQCAtMTAzNyw3ICsxMTEwLDcgQEAKIAogCXZhbCA9IHNjY2JfcmVhZChnc3BjYV9kZXYsIDB4NDIpOwkJLyogY29tMTcgKi8KIAlzY2NiX3dyaXRlKGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7Ci0JaWYgKHNkLT5mcmVxID09IDEpCisJaWYgKHNkLT5jdHJsc1tMSUdIVEZSRVFdLnZhbCA9PSAxKQogCQl2YWwgfD0gMHgwMTsKIAllbHNlCiAJCXZhbCAmPSAweGZlOwpAQCAtMTA0OSwzNCArMTEyMiwxOSBAQAogCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0Jc3RydWN0IGNhbSAqY2FtOwogCi0JY2FtID0gJmdzcGNhX2Rldi0+Y2FtOworCWdzcGNhX2Rldi0+Y2FtLmN0cmxzID0gc2QtPmN0cmxzOwogCi0JY2FtLT5jYW1fbW9kZSA9IG92OTY1eF9tb2RlOwotCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdjk2NXhfbW9kZSk7Ci0KLQlzZC0+YnJpZ2h0bmVzcyA9IEJSSUdIVE5FU1NfREVGOwotCXNkLT5jb250cmFzdCA9IENPTlRSQVNUX0RFRjsKICNpZiBBVVRPR0FJTl9ERUYgIT0gMAotCXNkLT5hdXRvZ2FpbiA9IEFVVE9HQUlOX0RFRjsKLQlnc3BjYV9kZXYtPmN0cmxfaW5hYyB8PSAoMSA8PCBFWFBPX0lEWCk7CisJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgRVhQT1NVUkUpOwogI2VuZGlmCi0jaWYgRVhQT19ERUYgIT0gMAotCXNkLT5leHBvc3VyZSA9IEVYUE9fREVGOwotI2VuZGlmCi0jaWYgU0hBUlBORVNTX0RFRiAhPSAwCi0Jc2QtPnNoYXJwbmVzcyA9IFNIQVJQTkVTU19ERUY7Ci0jZW5kaWYKLQlzZC0+c2F0dXIgPSBTQVRVUl9ERUY7Ci0Jc2QtPmZyZXEgPSBGUkVRX0RFRjsKLQogCXJldHVybiAwOwogfQogCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSBhbmQgcmVzdW1lIHRpbWUgKi8KIHN0YXRpYyBpbnQgc2RfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwogCXUxNiBzZW5zb3JfaWQ7CiAKIAkvKiByZXNldCBicmlkZ2UgKi8KQEAgLTEwOTksNjggKzExNTcsMTE3IEBACiAJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgSUQ6ICUwNHgiLCBzZW5zb3JfaWQpOwogCiAJLyogaW5pdGlhbGl6ZSAqLwotCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX2luaXQsCi0JCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0KSk7Ci0Jc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX2luaXQsCi0JCQlBUlJBWV9TSVpFKHNlbnNvcl9pbml0KSk7Ci0JcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF8yLAotCQkJQVJSQVlfU0laRShicmlkZ2VfaW5pdF8yKSk7Ci0Jc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX2luaXRfMiwKLQkJCUFSUkFZX1NJWkUoc2Vuc29yX2luaXRfMikpOwotCXJlZ193KGdzcGNhX2RldiwgMHhlMCwgMHgwMCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweGUwLCAweDAxKTsKLQlzZXRfbGVkKGdzcGNhX2RldiwgMCk7Ci0JcmVnX3coZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKKwlpZiAoKHNlbnNvcl9pZCAmIDB4ZmZmMCkgPT0gMHg5NjUwKSB7CisJCXNkLT5zZW5zb3IgPSBTRU5TT1JfT1Y5NjV4OworCisJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlID0gb3Y5NjV4X21vZGU7CisJCWdzcGNhX2Rldi0+Y2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUob3Y5NjV4X21vZGUpOworCisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX2luaXQsCisJCQkJQVJSQVlfU0laRShicmlkZ2VfaW5pdCkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfaW5pdCwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9pbml0KSk7CisJCXJlZ193X2FycmF5KGdzcGNhX2RldiwgYnJpZGdlX2luaXRfMiwKKwkJCQlBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzIpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X2luaXRfMiwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9pbml0XzIpKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGUwLCAweDAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweGUwLCAweDAxKTsKKwkJc2V0X2xlZChnc3BjYV9kZXYsIDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4ZTAsIDB4MDApOworCX0gZWxzZSBpZiAoKHNlbnNvcl9pZCAmIDB4ZmZmMCkgPT0gMHg5NzEwKSB7CisJCWNvbnN0IGNoYXIgKnA7CisJCWludCBsOworCisJCXNkLT5zZW5zb3IgPSBTRU5TT1JfT1Y5NzF4OworCisJCWdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlID0gb3Y5NzF4X21vZGU7CisJCWdzcGNhX2Rldi0+Y2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUob3Y5NzF4X21vZGUpOworCisJCS8qIG5vIGNvbnRyb2wgeWV0ICovCisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBOQ1RSTFMpIC0gMTsKKworCQlnc3BjYV9kZXYtPmNhbS5idWxrID0gMTsKKwkJZ3NwY2FfZGV2LT5jYW0uYnVsa19zaXplID0gMTYzODQ7CisJCWdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgPSAyOworCisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTcxeF9pbml0LAorCQkJCUFSUkFZX1NJWkUob3Y5NzF4X2luaXQpKTsKKworCQkvKiBzZXQgdmlkZW8gZm9ybWF0IG9uIGJyaWRnZSBwcm9jZXNzb3IgKi8KKwkJLyogYWNjZXNzIGJyaWRnZSBwcm9jZXNzb3IncyB2aWRlbyBmb3JtYXQgcmVnaXN0ZXJzIGF0OiAweDAwICovCisJCXJlZ193KGdzcGNhX2RldiwgMHgxYywgMHgwMCk7CisJCS8qc2V0IHJlZ2lzdGVyOiAweDAwIGlzICdSQVc4JywgMHg0MCBpcyAnWVVWNDIyJyAoWVVZVj8pKi8KKwkJcmVnX3coZ3NwY2FfZGV2LCAweDFkLCAweDAwKTsKKworCQkvKiBXaWxsIFcuIHNwZWNpZmljIHN0dWZmCisJCSAqIHNldCBWU1lOQyB0bworCQkgKglvdXRwdXQgKDB4MWYpIGlmIGZpcnN0IHdlYmNhbQorCQkgKglpbnB1dCAoMHgxNykgaWYgMm5kIG9yIDNyZCB3ZWJjYW0gKi8KKwkJcCA9IHZpZGVvX2RldmljZV9ub2RlX25hbWUoJmdzcGNhX2Rldi0+dmRldik7CisJCWwgPSBzdHJsZW4ocCkgLSAxOworCQlpZiAocFtsXSA9PSAnMCcpCisJCQlyZWdfdyhnc3BjYV9kZXYsIDB4NTYsIDB4MWYpOworCQllbHNlCisJCQlyZWdfdyhnc3BjYV9kZXYsIDB4NTYsIDB4MTcpOworCX0gZWxzZSB7CisJCWVycigiVW5rbm93biBzZW5zb3IgJTA0eCIsIHNlbnNvcl9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQogeworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9PVjk3MXgpCisJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiAJc3dpdGNoIChnc3BjYV9kZXYtPmN1cnJfbW9kZSkgewogCWNhc2UgUVZHQV9NT0RFOgkJCS8qIDMyMHgyNDAgKi8KLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzFfdmdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzFfdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8xX3ZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8xX3ZnYSkpOwogCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF9xdmdhLAogCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X3F2Z2EpKTsKLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzJfcXZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8yX3F2Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzJfcXZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8yX3F2Z2EpKTsKIAkJYnJlYWs7CiAJY2FzZSBWR0FfTU9ERToJCQkvKiA2NDB4NDgwICovCi0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF8xX3ZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8xX3ZnYSkpOworCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBvdjk2NXhfc3RhcnRfMV92Z2EsCisJCQkJQVJSQVlfU0laRShvdjk2NXhfc3RhcnRfMV92Z2EpKTsKIAkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfdmdhLAogCQkJCUFSUkFZX1NJWkUoYnJpZGdlX3N0YXJ0X3ZnYSkpOwotCQlzY2NiX3dfYXJyYXkoZ3NwY2FfZGV2LCBzZW5zb3Jfc3RhcnRfMl92Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMl92Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzJfdmdhLAorCQkJCUFSUkFZX1NJWkUob3Y5NjV4X3N0YXJ0XzJfdmdhKSk7CiAJCWJyZWFrOwogCWNhc2UgU1ZHQV9NT0RFOgkJCS8qIDgwMHg2MDAgKi8KLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzFfc3ZnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8xX3N2Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzFfc3ZnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8xX3N2Z2EpKTsKIAkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfc3ZnYSwKIAkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9zdmdhKSk7Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF8yX3N2Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMl9zdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8yX3N2Z2EsCisJCQkJQVJSQVlfU0laRShvdjk2NXhfc3RhcnRfMl9zdmdhKSk7CiAJCWJyZWFrOwogCWNhc2UgWEdBX01PREU6CQkJLyogMTAyNHg3NjggKi8KLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzFfeGdhLAotCQkJCUFSUkFZX1NJWkUoc2Vuc29yX3N0YXJ0XzFfeGdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8xX3hnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8xX3hnYSkpOwogCQlyZWdfd19hcnJheShnc3BjYV9kZXYsIGJyaWRnZV9zdGFydF94Z2EsCiAJCQkJQVJSQVlfU0laRShicmlkZ2Vfc3RhcnRfeGdhKSk7Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF8yX3N2Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMl9zdmdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8yX3N2Z2EsCisJCQkJQVJSQVlfU0laRShvdjk2NXhfc3RhcnRfMl9zdmdhKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAvKgljYXNlIFNYR0FfTU9ERToJCQkgKiAxMjgweDEwMjQgKi8KLQkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgc2Vuc29yX3N0YXJ0XzFfc3hnYSwKLQkJCQlBUlJBWV9TSVpFKHNlbnNvcl9zdGFydF8xX3N4Z2EpKTsKKwkJc2NjYl93X2FycmF5KGdzcGNhX2Rldiwgb3Y5NjV4X3N0YXJ0XzFfc3hnYSwKKwkJCQlBUlJBWV9TSVpFKG92OTY1eF9zdGFydF8xX3N4Z2EpKTsKIAkJcmVnX3dfYXJyYXkoZ3NwY2FfZGV2LCBicmlkZ2Vfc3RhcnRfc3hnYSwKIAkJCQlBUlJBWV9TSVpFKGJyaWRnZV9zdGFydF9zeGdhKSk7Ci0JCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIHNlbnNvcl9zdGFydF8yX3N4Z2EsCi0JCQkJQVJSQVlfU0laRShzZW5zb3Jfc3RhcnRfMl9zeGdhKSk7CisJCXNjY2Jfd19hcnJheShnc3BjYV9kZXYsIG92OTY1eF9zdGFydF8yX3N4Z2EsCisJCQkJQVJSQVlfU0laRShvdjk2NXhfc3RhcnRfMl9zeGdhKSk7CiAJCWJyZWFrOwogCX0KLQlzZXRmcmVxKGdzcGNhX2Rldik7CisJc2V0bGlnaHRmcmVxKGdzcGNhX2Rldik7CiAJc2V0YXV0b2dhaW4oZ3NwY2FfZGV2KTsKIAlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CiAJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKQEAgLTExOTgsOSArMTMwNSwxMSBAQAogCV9fdTMyIHRoaXNfcHRzOwogCXU4IHRoaXNfZmlkOwogCWludCByZW1haW5pbmdfbGVuID0gbGVuOworCWludCBwYXlsb2FkX2xlbjsKIAorCXBheWxvYWRfbGVuID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IDIwNDggOiAyMDQwOwogCWRvIHsKLQkJbGVuID0gbWluKHJlbWFpbmluZ19sZW4sIDIwNDApOworCQlsZW4gPSBtaW4ocmVtYWluaW5nX2xlbiwgcGF5bG9hZF9sZW4pOwogCiAJCS8qIFBheWxvYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgVVZDLXN0eWxlIGhlYWRlci4gIFdlCiAJCSAgIGNvbnNpZGVyIGEgZnJhbWUgdG8gc3RhcnQgd2hlbiB0aGUgRklEIHRvZ2dsZXMsIG9yIHRoZSBQVFMKQEAgLTEyNjIsMTM4ICsxMzcxLDYgQEAKIAl9IHdoaWxlIChyZW1haW5pbmdfbGVuID4gMCk7CiB9CiAKLS8qIGNvbnRyb2xzICovCi1zdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmJyaWdodG5lc3MgPSB2YWw7Ci0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKLX0KLQotc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmJyaWdodG5lc3M7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmNvbnRyYXN0ID0gdmFsOwotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKLQkJc2V0Y29udHJhc3QoZ3NwY2FfZGV2KTsKLQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwotfQotCi1zdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmNvbnRyYXN0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNkX3NldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCXNkLT5hdXRvZ2FpbiA9IHZhbDsKLQotCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgewotCQlpZiAodmFsKQotCQkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgRVhQT19JRFgpOwotCQllbHNlCi0JCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyAmPSB+KDEgPDwgRVhQT19JRFgpOwotCQlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOwotCX0KLQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwotfQotCi1zdGF0aWMgaW50IHNkX2dldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmF1dG9nYWluOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNkX3NldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCXNkLT5leHBvc3VyZSA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKLX0KLQotc3RhdGljIGludCBzZF9nZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0JKnZhbCA9IHNkLT5leHBvc3VyZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZF9zZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPnNoYXJwbmVzcyA9IHZhbDsKLQlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCi0JCXNldHNoYXJwbmVzcyhnc3BjYV9kZXYpOwotCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0c2hhcnBuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPnNoYXJwbmVzczsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZF9zZXRzYXR1cihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQlzZC0+c2F0dXIgPSB2YWw7Ci0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRzYXR1cihnc3BjYV9kZXYpOwotCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2RfZ2V0c2F0dXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQotewotCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKLQotCSp2YWwgPSBzZC0+c2F0dXI7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IHNkX3NldGZyZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCi17Ci0Jc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwotCi0Jc2QtPmZyZXEgPSB2YWw7Ci0JaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQotCQlzZXRmcmVxKGdzcGNhX2Rldik7Ci0JcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKLX0KLQotc3RhdGljIGludCBzZF9nZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7Ci0KLQkqdmFsID0gc2QtPmZyZXE7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc2RfcXVlcnltZW51KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKIAkJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqbWVudSkKIHsKQEAgLTE0MTksNyArMTM5Niw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKIAkubmFtZSAgICAgPSBNT0RVTEVfTkFNRSwKIAkuY3RybHMgICAgPSBzZF9jdHJscywKLQkubmN0cmxzICAgPSBBUlJBWV9TSVpFKHNkX2N0cmxzKSwKKwkubmN0cmxzICAgPSBOQ1RSTFMsCiAJLmNvbmZpZyAgID0gc2RfY29uZmlnLAogCS5pbml0ICAgICA9IHNkX2luaXQsCiAJLnN0YXJ0ICAgID0gc2Rfc3RhcnQsCkBAIC0xNDMwLDYgKzE0MDcsNyBAQAogCiAvKiAtLSBtb2R1bGUgaW5pdGlhbGlzYXRpb24gLS0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA1YTksIDB4ODA2NSl9LAogCXtVU0JfREVWSUNFKDB4MDZmOCwgMHgzMDAzKX0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWMyMDcuYwppbmRleCA4MTczOWEyLi4xNjAwZGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzIwNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjMjA3LmMKQEAgLTIzLDYgKzIzLDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJwYWMyMDciCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMTc4LDggKzE4MCw4IEBACiAJCQkweDAwLCBpbmRleCwKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuZ3RoLCBQQUMyMDdfQ1RSTF9USU1FT1VUKTsKIAlpZiAoZXJyIDwgMCkKLQkJZXJyKCJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXJzIHRvIGluZGV4IDB4JTA0WCwgZXJyb3IgJWQpIiwKLQkJCWluZGV4LCBlcnIpOworCQlwcl9lcnIoIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlcnMgdG8gaW5kZXggMHglMDRYLCBlcnJvciAlZFxuIiwKKwkJICAgICAgIGluZGV4LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE5NCw4ICsxOTYsOCBAQAogCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJdmFsdWUsIGluZGV4LCBOVUxMLCAwLCBQQUMyMDdfQ1RSTF9USU1FT1VUKTsKIAlpZiAoZXJyKQotCQllcnIoIkZhaWxlZCB0byB3cml0ZSBhIHJlZ2lzdGVyIChpbmRleCAweCUwNFgsIgotCQkJIiB2YWx1ZSAweCUwMlgsIGVycm9yICVkKSIsIGluZGV4LCB2YWx1ZSwgZXJyKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gd3JpdGUgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCB2YWx1ZSAweCUwMlgsIGVycm9yICVkKVxuIiwKKwkJICAgICAgIGluZGV4LCB2YWx1ZSwgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yMTAsOCArMjEyLDggQEAKIAkJCTB4MDAsIGluZGV4LAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCAxLCBQQUMyMDdfQ1RSTF9USU1FT1VUKTsKIAlpZiAocmVzIDwgMCkgewotCQllcnIoIkZhaWxlZCB0byByZWFkIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwgZXJyb3IgJWQpIiwKLQkJCWluZGV4LCByZXMpOworCQlwcl9lcnIoIkZhaWxlZCB0byByZWFkIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwgZXJyb3IgJWQpXG4iLAorCQkgICAgICAgaW5kZXgsIHJlcyk7CiAJCXJldHVybiByZXM7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3BhYzczMDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jCmluZGV4IDU2MTVkN2IuLjFjNDRmNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMwMi5jCkBAIC02MSw2ICs2MSw4IEBACiAgICAgMyAgIHwgMHgyMSAgICAgICB8IHNldGh2ZmxpcCgpCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInBhYzczMDIiCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtNDA4LDggKzQxMCw4IEBACiAJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3dfYnVmIGZhaWxlZCBpbmRleCAweCUwMngsIGVycm9yICVkIiwKLQkJCWluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ193X2J1ZiBmYWlsZWQgaW5kZXggMHglMDJ4LCBlcnJvciAlZFxuIiwKKwkJICAgICAgIGluZGV4LCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtNDMxLDggKzQzMyw4IEBACiAJCQkwLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193KCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgdmFsdWUgMHglMDJ4LCBlcnJvciAlZCIsCi0JCQlpbmRleCwgdmFsdWUsIHJldCk7CisJCXByX2VycigicmVnX3coKSBmYWlsZWQgaW5kZXggMHglMDJ4LCB2YWx1ZSAweCUwMngsIGVycm9yICVkXG4iLAorCQkgICAgICAgaW5kZXgsIHZhbHVlLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtNDY2LDkgKzQ2OCw4IEBACiAJCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCQk1MDApOwogCQlpZiAocmV0IDwgMCkgewotCQkJZXJyKCJyZWdfd19wYWdlKCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgIgotCQkJInZhbHVlIDB4JTAyeCwgZXJyb3IgJWQiLAotCQkJCWluZGV4LCBwYWdlW2luZGV4XSwgcmV0KTsKKwkJCXByX2VycigicmVnX3dfcGFnZSgpIGZhaWxlZCBpbmRleCAweCUwMngsIHZhbHVlIDB4JTAyeCwgZXJyb3IgJWRcbiIsCisJCQkgICAgICAgaW5kZXgsIHBhZ2VbaW5kZXhdLCByZXQpOwogCQkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjNzMxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKaW5kZXggZjg4MDFiNS4uNzUwOWQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9wYWM3MzExLmMKQEAgLTQ5LDYgKzQ5LDggQEAKIAkJZm9yIG1heCBnYWluLCAweDE0IGZvciBtaW5pbWFsIGdhaW4uCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInBhYzczMTEiCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMjc2LDggKzI3OCw4IEBACiAJCQlpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3dfYnVmKCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgZXJyb3IgJWQiLAotCQkJaW5kZXgsIHJldCk7CisJCXByX2VycigicmVnX3dfYnVmKCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgZXJyb3IgJWRcbiIsCisJCSAgICAgICBpbmRleCwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTI5OSw4ICszMDEsOCBAQAogCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdygpIGZhaWxlZCBpbmRleCAweCUwMngsIHZhbHVlIDB4JTAyeCwgZXJyb3IgJWQiLAotCQkJaW5kZXgsIHZhbHVlLCByZXQpOworCQlwcl9lcnIoInJlZ193KCkgZmFpbGVkIGluZGV4IDB4JTAyeCwgdmFsdWUgMHglMDJ4LCBlcnJvciAlZFxuIiwKKwkJICAgICAgIGluZGV4LCB2YWx1ZSwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTMzNCw5ICszMzYsOCBAQAogCQkJCTAsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQkJNTAwKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWVycigicmVnX3dfcGFnZSgpIGZhaWxlZCBpbmRleCAweCUwMngsICIKLQkJCSJ2YWx1ZSAweCUwMngsIGVycm9yICVkIiwKLQkJCQlpbmRleCwgcGFnZVtpbmRleF0sIHJldCk7CisJCQlwcl9lcnIoInJlZ193X3BhZ2UoKSBmYWlsZWQgaW5kZXggMHglMDJ4LCB2YWx1ZSAweCUwMngsIGVycm9yICVkXG4iLAorCQkJICAgICAgIGluZGV4LCBwYWdlW2luZGV4XSwgcmV0KTsKIAkJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmMKaW5kZXggNGMyODNjMi4uM2I3MWJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuYwpAQCAtMjMsNiArMjMsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNlNDAxIgogCiAjZGVmaW5lIEJVTEtfU0laRSA0MDk2CkBAIC0xNDQsOCArMTQ2LDggQEAKIAkJCSAgICAgIHZhbHVlLCAwLCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoIXNpbGVudCkKLQkJCWVycigid3JpdGUgcmVxIGZhaWxlZCByZXEgJSMwNHggdmFsICUjMDR4IGVycm9yICVkIiwKLQkJCSAgICByZXEsIHZhbHVlLCBlcnIpOworCQkJcHJfZXJyKCJ3cml0ZSByZXEgZmFpbGVkIHJlcSAlIzA0eCB2YWwgJSMwNHggZXJyb3IgJWRcbiIsCisJCQkgICAgICAgcmVxLCB2YWx1ZSwgZXJyKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOwogCX0KIH0KQEAgLTE1OCw3ICsxNjAsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoVVNCX0JVRl9TWiA8IFJFQURfUkVRX1NJWkUpIHsKLQkJZXJyKCJVU0JfQlVGX1NaIHRvbyBzbWFsbCEhIik7CisJCXByX2VycigiVVNCX0JVRl9TWiB0b28gc21hbGwhIVxuIik7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FTk9CVUZTOwogCQlyZXR1cm47CiAJfQpAQCAtMTY5LDcgKzE3MSw4IEBACiAJCQkgICAgICAwLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIFJFQURfUkVRX1NJWkUsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmICghc2lsZW50KQotCQkJZXJyKCJyZWFkIHJlcSBmYWlsZWQgcmVxICUjMDR4IGVycm9yICVkIiwgcmVxLCBlcnIpOworCQkJcHJfZXJyKCJyZWFkIHJlcSBmYWlsZWQgcmVxICUjMDR4IGVycm9yICVkXG4iLAorCQkJICAgICAgIHJlcSwgZXJyKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOwogCX0KIH0KQEAgLTE4OCw4ICsxOTEsOCBAQAogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgcGFyYW0sIHNlbGVjdG9yLCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIoInNldCBmZWF0dXJlIGZhaWxlZCBzZWwgJSMwNHggcGFyYW0gJSMwNHggZXJyb3IgJWQiLAotCQkgICAgc2VsZWN0b3IsIHBhcmFtLCBlcnIpOworCQlwcl9lcnIoInNldCBmZWF0dXJlIGZhaWxlZCBzZWwgJSMwNHggcGFyYW0gJSMwNHggZXJyb3IgJWRcbiIsCisJCSAgICAgICBzZWxlY3RvciwgcGFyYW0sIGVycik7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IGVycjsKIAl9CiB9CkBAIC0yMDIsNyArMjA1LDcgQEAKIAkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIAogCWlmIChVU0JfQlVGX1NaIDwgMikgewotCQllcnIoIlVTQl9CVUZfU1ogdG9vIHNtYWxsISEiKTsKKwkJcHJfZXJyKCJVU0JfQlVGX1NaIHRvbyBzbWFsbCEhXG4iKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVOT0JVRlM7CiAJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiAJfQpAQCAtMjEzLDcgKzIxNiw4IEBACiAJCQkgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDAsIHNlbGVjdG9yLCBnc3BjYV9kZXYtPnVzYl9idWYsIDIsIDEwMDApOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiZ2V0IGZlYXR1cmUgZmFpbGVkIHNlbCAlIzA0eCBlcnJvciAlZCIsIHNlbGVjdG9yLCBlcnIpOworCQlwcl9lcnIoImdldCBmZWF0dXJlIGZhaWxlZCBzZWwgJSMwNHggZXJyb3IgJWRcbiIsCisJCSAgICAgICBzZWxlY3RvciwgZXJyKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTMwMCwyMSArMzA0LDIxIEBACiAJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiAKIAlpZiAoY2RbMV0gIT0gMHg0MSkgewotCQllcnIoIldyb25nIGRlc2NyaXB0b3IgdHlwZSIpOworCQlwcl9lcnIoIldyb25nIGRlc2NyaXB0b3IgdHlwZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICghKGNkWzJdICYgU0U0MDFfRk9STUFUX0JBWUVSKSkgewotCQllcnIoIkJheWVyIGZvcm1hdCBub3Qgc3VwcG9ydGVkISIpOworCQlwcl9lcnIoIkJheWVyIGZvcm1hdCBub3Qgc3VwcG9ydGVkIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChjZFszXSkKLQkJaW5mbygiRXh0cmFGZWF0dXJlczogJWQiLCBjZFszXSk7CisJCXByX2luZm8oIkV4dHJhRmVhdHVyZXM6ICVkXG4iLCBjZFszXSk7CiAKIAluID0gY2RbNF0gfCAoY2RbNV0gPDwgOCk7CiAJaWYgKG4gPiBNQVhfTU9ERVMpIHsKLQkJZXJyKCJUb28gbWFueSBmcmFtZSBzaXplcyIpOworCQlwcl9lcnIoIlRvbyBtYW55IGZyYW1lIHNpemVzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0zNTMsMTUgKzM1NywxNiBAQAogCQkJc2QtPmZtdHNbaV0ucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4OwogCQkJc2QtPmZtdHNbaV0uYnl0ZXNwZXJsaW5lID0gd2lkdGhzW2ldOwogCQkJc2QtPmZtdHNbaV0uc2l6ZWltYWdlID0gd2lkdGhzW2ldICogaGVpZ2h0c1tpXTsKLQkJCWluZm8oIkZyYW1lIHNpemU6ICVkeCVkIGJheWVyIiwgd2lkdGhzW2ldLCBoZWlnaHRzW2ldKTsKKwkJCXByX2luZm8oIkZyYW1lIHNpemU6ICVkeCVkIGJheWVyXG4iLAorCQkJCXdpZHRoc1tpXSwgaGVpZ2h0c1tpXSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBGb3VuZCBhIG1hdGNoIHVzZSBqYW5nZ3UgY29tcHJlc3Npb24gKi8KIAkJCXNkLT5mbXRzW2ldLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NFNDAxOwogCQkJc2QtPmZtdHNbaV0uYnl0ZXNwZXJsaW5lID0gMDsKIAkJCXNkLT5mbXRzW2ldLnNpemVpbWFnZSA9IHdpZHRoc1tpXSAqIGhlaWdodHNbaV0gKiAzOwotCQkJaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgMS8lZHRoIGphbmdndSIsCi0JCQkgICAgIHdpZHRoc1tpXSwgaGVpZ2h0c1tpXSwKLQkJCSAgICAgc2QtPmZtdHNbaV0ucHJpdiAqIHNkLT5mbXRzW2ldLnByaXYpOworCQkJcHJfaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgMS8lZHRoIGphbmdndVxuIiwKKwkJCQl3aWR0aHNbaV0sIGhlaWdodHNbaV0sCisJCQkJc2QtPmZtdHNbaV0ucHJpdiAqIHNkLT5mbXRzW2ldLnByaXYpOwogCQl9CiAJfQogCkBAIC01NzEsMTEgKzU3NiwxMiBAQAogCQlwbGVuICAgPSAoKGJpdHMgKyA0NykgPj4gNCkgPDwgMTsKIAkJLyogU2FuaXR5IGNoZWNrcyAqLwogCQlpZiAocGxlbiA+IDEwMjQpIHsKLQkJCWVycigiaW52YWxpZCBwYWNrZXQgbGVuICVkIHJlc3RhcnRpbmcgc3RyZWFtIiwgcGxlbik7CisJCQlwcl9lcnIoImludmFsaWQgcGFja2V0IGxlbiAlZCByZXN0YXJ0aW5nIHN0cmVhbVxuIiwKKwkJCSAgICAgICBwbGVuKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJaWYgKGluZm8gPT0gMykgewotCQkJZXJyKCJ1bmtub3duIGZyYW1lIGluZm8gdmFsdWUgcmVzdGFydGluZyBzdHJlYW0iKTsKKwkJCXByX2VycigidW5rbm93biBmcmFtZSBpbmZvIHZhbHVlIHJlc3RhcnRpbmcgc3RyZWFtXG4iKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIApAQCAtNTk5LDggKzYwNSw4IEBACiAJCQlicmVhazsKIAkJY2FzZSAxOiAvKiBFT0YgKi8KIAkJCWlmIChzZC0+cGl4ZWxzX3JlYWQgIT0gaW1hZ2VzaXplKSB7Ci0JCQkJZXJyKCJmcmFtZSBzaXplICVkIGV4cGVjdGVkICVkIiwKLQkJCQkgICAgc2QtPnBpeGVsc19yZWFkLCBpbWFnZXNpemUpOworCQkJCXByX2VycigiZnJhbWUgc2l6ZSAlZCBleHBlY3RlZCAlZFxuIiwKKwkJCQkgICAgICAgc2QtPnBpeGVsc19yZWFkLCBpbWFnZXNpemUpOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCQlzZF9jb21wbGV0ZV9mcmFtZShnc3BjYV9kZXYsIHNkLT5wYWNrZXQsIHBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjAyOC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjAyOC5jCmluZGV4IDQyNzFmODYuLjQ4YWFlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc245YzIwMjguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NuOWMyMDI4LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzbjljMjAyOCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC03NSw4ICs3Nyw4IEBACiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCiAJCQkyLCAwLCBnc3BjYV9kZXYtPnVzYl9idWYsIDYsIDUwMCk7CiAJaWYgKHJjIDwgMCkgewotCQllcnIoImNvbW1hbmQgd3JpdGUgWyUwMnhdIGVycm9yICVkIiwKLQkJCQlnc3BjYV9kZXYtPnVzYl9idWZbMF0sIHJjKTsKKwkJcHJfZXJyKCJjb21tYW5kIHdyaXRlIFslMDJ4XSBlcnJvciAlZFxuIiwKKwkJICAgICAgIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC05Myw3ICs5NSw3IEBACiAJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCTEsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwgNTAwKTsKIAlpZiAocmMgIT0gMSkgewotCQllcnIoInJlYWQxIGVycm9yICVkIiwgcmMpOworCQlwcl9lcnIoInJlYWQxIGVycm9yICVkXG4iLCByYyk7CiAJCXJldHVybiAocmMgPCAwKSA/IHJjIDogLUVJTzsKIAl9CiAJUERFQlVHKERfVVNCSSwgInJlYWQxIHJlc3BvbnNlICUwMngiLCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwpAQCAtMTA5LDcgKzExMSw3IEBACiAJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCTQsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgNCwgNTAwKTsKIAlpZiAocmMgIT0gNCkgewotCQllcnIoInJlYWQ0IGVycm9yICVkIiwgcmMpOworCQlwcl9lcnIoInJlYWQ0IGVycm9yICVkXG4iLCByYyk7CiAJCXJldHVybiAocmMgPCAwKSA/IHJjIDogLUVJTzsKIAl9CiAJbWVtY3B5KHJlYWRpbmcsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgNCk7CkBAIC0xMzEsNyArMTMzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjU2ICYmIHN0YXR1cyA8IDI7IGkrKykKIAkJc3RhdHVzID0gc245YzIwMjhfcmVhZDEoZ3NwY2FfZGV2KTsKIAlpZiAoc3RhdHVzICE9IDIpIHsKLQkJZXJyKCJsb25nIGNvbW1hbmQgc3RhdHVzIHJlYWQgZXJyb3IgJWQiLCBzdGF0dXMpOworCQlwcl9lcnIoImxvbmcgY29tbWFuZCBzdGF0dXMgcmVhZCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJuIChzdGF0dXMgPCAwKSA/IHN0YXR1cyA6IC1FSU87CiAJfQogCkBAIC02MzgsNyArNjQwLDcgQEAKIAkJZXJyX2NvZGUgPSBzdGFydF92aXZpdGFyX2NhbShnc3BjYV9kZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnIoIlN0YXJ0aW5nIHVua25vd24gY2FtZXJhLCBwbGVhc2UgcmVwb3J0IHRoaXMiKTsKKwkJcHJfZXJyKCJTdGFydGluZyB1bmtub3duIGNhbWVyYSwgcGxlYXNlIHJlcG9ydCB0aGlzXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc245YzIweC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKaW5kZXggYzQzMTkwMC4uODZlMDdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zbjljMjB4LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xMTIzLDcgKzExMjUsNyBAQAogCQkJbGVuZ3RoLAogCQkJNTAwKTsKIAlpZiAodW5saWtlbHkocmVzdWx0IDwgMCB8fCByZXN1bHQgIT0gbGVuZ3RoKSkgewotCQllcnIoIlJlYWQgcmVnaXN0ZXIgZmFpbGVkIDB4JTAyWCIsIHJlZyk7CisJCXByX2VycigiUmVhZCByZWdpc3RlciBmYWlsZWQgMHglMDJYXG4iLCByZWcpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMTQ0LDcgKzExNDYsNyBAQAogCQkJbGVuZ3RoLAogCQkJNTAwKTsKIAlpZiAodW5saWtlbHkocmVzdWx0IDwgMCB8fCByZXN1bHQgIT0gbGVuZ3RoKSkgewotCQllcnIoIldyaXRlIHJlZ2lzdGVyIGZhaWxlZCBpbmRleCAweCUwMlgiLCByZWcpOworCQlwcl9lcnIoIldyaXRlIHJlZ2lzdGVyIGZhaWxlZCBpbmRleCAweCUwMlhcbiIsIHJlZyk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEyNzUsMTQgKzEyNzcsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaWQgIT0gMHg3ZmEyKSB7Ci0JCWVycigic2Vuc29yIGlkIGZvciBvdjk2NTAgZG9lc24ndCBtYXRjaCAoMHglMDR4KSIsIGlkKTsKKwkJcHJfZXJyKCJzZW5zb3IgaWQgZm9yIG92OTY1MCBkb2Vzbid0IG1hdGNoICgweCUwNHgpXG4iLCBpZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92OTY1MF9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBvdjk2NTBfaW5pdFtpXS5yZWcsCiAJCQkJb3Y5NjUwX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiT1Y5NjUwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiT1Y5NjUwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMjk5LDcgKzEzMDEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92OTY1NV9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBvdjk2NTVfaW5pdFtpXS5yZWcsCiAJCQkJb3Y5NjU1X2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiT1Y5NjU1IHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiT1Y5NjU1IHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMzE4LDcgKzEzMjAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNvaTk2OF9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBzb2k5NjhfaW5pdFtpXS5yZWcsCiAJCQkJc29pOTY4X2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiU09JOTY4IHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiU09JOTY4IHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMzM4LDcgKzEzNDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92NzY2MF9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBvdjc2NjBfaW5pdFtpXS5yZWcsCiAJCQkJb3Y3NjYwX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiT1Y3NjYwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiT1Y3NjYwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMzU1LDcgKzEzNTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92NzY3MF9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBvdjc2NzBfaW5pdFtpXS5yZWcsCiAJCQkJb3Y3NjcwX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiT1Y3NjcwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiT1Y3NjcwIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xMzc5LDE0ICsxMzgxLDE0IEBACiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXYwMTFfaW5pdCk7IGkrKykgewogCQkJaWYgKGkyY193Mihnc3BjYV9kZXYsIG10OXYwMTFfaW5pdFtpXS5yZWcsCiAJCQkJCW10OXYwMTFfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJCWVycigiTVQ5VjAxMSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQkJcHJfZXJyKCJNVDlWMDExIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRU5PREVWOwogCQkJfQogCQl9CiAJCXNkLT5oc3RhcnQgPSAyOwogCQlzZC0+dnN0YXJ0ID0gMjsKIAkJc2QtPnNlbnNvciA9IFNFTlNPUl9NVDlWMDExOwotCQlpbmZvKCJNVDlWMDExIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJNVDlWMDExIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTM5Nyw3ICsxMzk5LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5djExMV9pbml0KTsgaSsrKSB7CiAJCQlpZiAoaTJjX3cyKGdzcGNhX2RldiwgbXQ5djExMV9pbml0W2ldLnJlZywKIAkJCQkJbXQ5djExMV9pbml0W2ldLnZhbCkgPCAwKSB7Ci0JCQkJZXJyKCJNVDlWMTExIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCQlwcl9lcnIoIk1UOVYxMTEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAJCX0KQEAgLTE0MDcsNyArMTQwOSw3IEBACiAJCXNkLT5oc3RhcnQgPSAyOwogCQlzZC0+dnN0YXJ0ID0gMjsKIAkJc2QtPnNlbnNvciA9IFNFTlNPUl9NVDlWMTExOwotCQlpbmZvKCJNVDlWMTExIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJNVDlWMTExIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTQyMiwxNCArMTQyNCwxNCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDl2MTEyX2luaXQpOyBpKyspIHsKIAkJCWlmIChpMmNfdzIoZ3NwY2FfZGV2LCBtdDl2MTEyX2luaXRbaV0ucmVnLAogCQkJCQltdDl2MTEyX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCQllcnIoIk1UOVYxMTIgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJCXByX2VycigiTVQ5VjExMiBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KIAkJfQogCQlzZC0+aHN0YXJ0ID0gNjsKIAkJc2QtPnZzdGFydCA9IDI7CiAJCXNkLT5zZW5zb3IgPSBTRU5TT1JfTVQ5VjExMjsKLQkJaW5mbygiTVQ5VjExMiBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiTVQ5VjExMiBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE0NDMsNyArMTQ0NSw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ5bTExMl9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzIoZ3NwY2FfZGV2LCBtdDltMTEyX2luaXRbaV0ucmVnLAogCQkJCW10OW0xMTJfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJNVDlNMTEyIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiTVQ5TTExMiBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMTQ2MSw3ICsxNDYzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDltMTExX2luaXQpOyBpKyspIHsKIAkJaWYgKGkyY193Mihnc3BjYV9kZXYsIG10OW0xMTFfaW5pdFtpXS5yZWcsCiAJCQkJbXQ5bTExMV9pbml0W2ldLnZhbCkgPCAwKSB7Ci0JCQllcnIoIk1UOU0xMTEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJNVDlNMTExIHNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC0xNDg1LDIwICsxNDg3LDIwIEBACiAJc3dpdGNoIChpZCkgewogCWNhc2UgMHg4NDExOgogCWNhc2UgMHg4NDIxOgotCQlpbmZvKCJNVDlNMDAxIGNvbG9yIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJNVDlNMDAxIGNvbG9yIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHg4NDMxOgotCQlpbmZvKCJNVDlNMDAxIG1vbm8gc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOU0wMDEgbW9ubyBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnIoIk5vIE1UOU0wMDEgY2hpcCBkZXRlY3RlZCwgSUQgPSAleFxuIiwgaWQpOworCQlwcl9lcnIoIk5vIE1UOU0wMDEgY2hpcCBkZXRlY3RlZCwgSUQgPSAleFxuXG4iLCBpZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OW0wMDFfaW5pdCk7IGkrKykgewogCQlpZiAoaTJjX3cyKGdzcGNhX2RldiwgbXQ5bTAwMV9pbml0W2ldLnJlZywKIAkJCQltdDltMDAxX2luaXRbaV0udmFsKSA8IDApIHsKLQkJCWVycigiTVQ5TTAwMSBzZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCQlwcl9lcnIoIk1UOU0wMDEgc2Vuc29yIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTE1MTcsNyArMTUxOSw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHY3MTMxcl9pbml0KTsgaSsrKSB7CiAJCWlmIChpMmNfdzEoZ3NwY2FfZGV2LCBodjcxMzFyX2luaXRbaV0ucmVnLAogCQkJCWh2NzEzMXJfaW5pdFtpXS52YWwpIDwgMCkgewotCQkJZXJyKCJIVjcxMzFSIFNlbnNvciBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJCXByX2VycigiSFY3MTMxUiBTZW5zb3IgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMjEwMyw3ICsyMTA1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicmlkZ2VfaW5pdCk7IGkrKykgewogCQl2YWx1ZSA9IGJyaWRnZV9pbml0W2ldWzFdOwogCQlpZiAocmVnX3coZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdFtpXVswXSwgJnZhbHVlLCAxKSA8IDApIHsKLQkJCWVycigiRGV2aWNlIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQkJcHJfZXJyKCJEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMjExNCw3ICsyMTE2LDcgQEAKIAkJcmVnX3cxKGdzcGNhX2RldiwgMHgxMDA2LCAweDIwKTsKIAogCWlmIChyZWdfdyhnc3BjYV9kZXYsIDB4MTBjMCwgaTJjX2luaXQsIDkpIDwgMCkgewotCQllcnIoIkRldmljZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJcHJfZXJyKCJEZXZpY2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMTIyLDI3ICsyMTI0LDI3IEBACiAJY2FzZSBTRU5TT1JfT1Y5NjUwOgogCQlpZiAob3Y5NjUwX2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk9WOTY1MCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiT1Y5NjUwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WOTY1NToKIAkJaWYgKG92OTY1NV9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwotCQlpbmZvKCJPVjk2NTUgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk9WOTY1NSBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9TT0k5Njg6CiAJCWlmIChzb2k5NjhfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaW5mbygiU09JOTY4IHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJTT0k5Njggc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfT1Y3NjYwOgogCQlpZiAob3Y3NjYwX2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk9WNzY2MCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiT1Y3NjYwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX09WNzY3MDoKIAkJaWYgKG92NzY3MF9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwotCQlpbmZvKCJPVjc2NzAgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk9WNzY3MCBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAljYXNlIFNFTlNPUl9NVDlWUFJCOgogCQlpZiAobXQ5dl9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKQEAgLTIxNTEsMTIgKzIxNTMsMTIgQEAKIAljYXNlIFNFTlNPUl9NVDlNMTExOgogCQlpZiAobXQ5bTExMV9pbml0X3NlbnNvcihnc3BjYV9kZXYpIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwotCQlpbmZvKCJNVDlNMTExIHNlbnNvciBkZXRlY3RlZCIpOworCQlwcl9pbmZvKCJNVDlNMTExIHNlbnNvciBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0VOU09SX01UOU0xMTI6CiAJCWlmIChtdDltMTEyX2luaXRfc2Vuc29yKGdzcGNhX2RldikgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWluZm8oIk1UOU0xMTIgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIk1UOU0xMTIgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBTRU5TT1JfTVQ5TTAwMToKIAkJaWYgKG10OW0wMDFfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCkBAIC0yMTY1LDEwICsyMTY3LDEwIEBACiAJY2FzZSBTRU5TT1JfSFY3MTMxUjoKIAkJaWYgKGh2NzEzMXJfaW5pdF9zZW5zb3IoZ3NwY2FfZGV2KSA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaW5mbygiSFY3MTMxUiBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygiSFY3MTMxUiBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlpbmZvKCJVbnN1cHBvcnRlZCBTZW5zb3IiKTsKKwkJcHJfaW5mbygiVW5zdXBwb3J0ZWQgU2Vuc29yXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMjYzLDE5ICsyMjY1LDE5IEBACiAJc3dpdGNoIChtb2RlICYgU0NBTEVfTUFTSykgewogCWNhc2UgU0NBTEVfMTI4MHgxMDI0OgogCQlzY2FsZSA9IDB4YzA7Ci0JCWluZm8oIlNldCAxMjgweDEwMjQiKTsKKwkJcHJfaW5mbygiU2V0IDEyODB4MTAyNFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0NBTEVfNjQweDQ4MDoKIAkJc2NhbGUgPSAweDgwOwotCQlpbmZvKCJTZXQgNjQweDQ4MCIpOworCQlwcl9pbmZvKCJTZXQgNjQweDQ4MFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0NBTEVfMzIweDI0MDoKIAkJc2NhbGUgPSAweDkwOwotCQlpbmZvKCJTZXQgMzIweDI0MCIpOworCQlwcl9pbmZvKCJTZXQgMzIweDI0MFxuIik7CiAJCWJyZWFrOwogCWNhc2UgU0NBTEVfMTYweDEyMDoKIAkJc2NhbGUgPSAweGEwOwotCQlpbmZvKCJTZXQgMTYweDEyMCIpOworCQlwcl9pbmZvKCJTZXQgMTYweDEyMFxuIik7CiAJCWJyZWFrOwogCX0KIApAQCAtMjUxMyw3ICsyNTE1LDcgQEAKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjI4ZiksIFNOOUMyMFgoT1Y5NjUwLCAweDMwLCAwKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYyYTApLCBTTjlDMjBYKE9WNzY3MCwgMHgyMSwgMCl9LAogCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MmIwKSwgU045QzIwWChNVDlWUFJCLCAweDAwLCAwKX0sCi0Je1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYyYjMpLCBTTjlDMjBYKE9WOTY1NSwgMHgzMCwgMCl9LAorCXtVU0JfREVWSUNFKDB4MGM0NSwgMHg2MmIzKSwgU045QzIwWChPVjk2NTUsIDB4MzAsIExFRF9SRVZFUlNFKX0sCiAJe1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYyYmIpLCBTTjlDMjBYKE9WNzY2MCwgMHgyMSwgTEVEX1JFVkVSU0UpfSwKIAl7VVNCX0RFVklDRSgweDBjNDUsIDB4NjJiYyksIFNOOUMyMFgoSFY3MTMxUiwgMHgxMSwgMCl9LAogCXtVU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMGY0KSwgU045QzIwWChPVjk2NTAsIDB4MzAsIDApfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Nvbml4ai5jCmluZGV4IGM0NzdhZDEuLmM3NDZiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc29uaXhqLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zb25peGouYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTb25peCBzbjljMTAycCBzbjljMTA1IHNuOWMxMjAgKGpwZWcpIHN1YmRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEplYW4tRnJhbsOnb2lzIE1vaW5lIDxodHRwOi8vbW9pbmVqZi5mcmVlLmZyPgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgSmVhbi1GcmFuw6dvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWljaGVsIFhoYWFyZCBteGhhYXJkQG1hZ2ljLmZyCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzb25peGoiCiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMTM2LDcgKzEzOCw3IEBACiBzdGF0aWMgdm9pZCBzZXRmcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tOQ1RSTFNdID0gewotW0JSSUdIVE5FU1NdID0gIHsKK1tCUklHSFRORVNTXSA9IHsKIAkgICAgewogCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCiAJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKQEAgLTE1Nyw3ICsxNTksNyBAQAogI2RlZmluZSBDT05UUkFTVF9NQVggMTI3CiAJCS5tYXhpbXVtID0gQ09OVFJBU1RfTUFYLAogCQkuc3RlcCAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gNjMsCisJCS5kZWZhdWx0X3ZhbHVlID0gMjAsCiAJICAgIH0sCiAJICAgIC5zZXRfY29udHJvbCA9IHNldGNvbnRyYXN0CiAJfSwKQEAgLTczNyw3ICs3MzksNyBAQAogCXsweGQxLCAweDVkLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKIAl7MHhkMSwgMHg1ZCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMH0sCiAJezB4ZDEsIDB4NWQsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MTB9LAotCXsweGQxLCAweDVkLCAweDJmLCAweGY3LCAweEIwLCAweDAwLCAweDA0LCAweDEwfSwKKwl7MHhkMSwgMHg1ZCwgMHgyZiwgMHhmNywgMHhiMCwgMHgwMCwgMHgwNCwgMHgxMH0sCiAJezB4ZDEsIDB4NWQsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LAogCXsweGQxLCAweDVkLCAweDMzLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDEwfSwKIAl7MHhiMSwgMHg1ZCwgMHgzZCwgMHgwNiwgMHg4ZiwgMHgwMCwgMHgwMCwgMHgxMH0sCkBAIC0xMjc3LDcgKzEyNzksNyBAQAogCQkJLyogZ2xvYmFsIGdhaW4gPyA6IDA3IC0gY2hhbmdlIHdpdGggMHgxNSBhdCB0aGUgZW5kICovCiAJezB4YTEsIDB4MjEsIDB4MTAsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTB9LCAvKiA/Pz8/IDogMDYzZiAqLwogCXsweGExLCAweDIxLCAweDA0LCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDEwfSwKLQl7MHhiMSwgMHgyMSwgMHgyZCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgxMH0sCisJezB4YjEsIDB4MjEsIDB4MmQsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MTB9LAogCQkJLyogZXhwb3N1cmUgPyA6IDAyMDAgLSBjaGFuZ2Ugd2l0aCAweDFlIGF0IHRoZSBlbmQgKi8KIAl7fQogfTsKQEAgLTEzOTUsNyArMTM5Nyw3IEBACiAJCXJldHVybjsKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ19yOiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0xNDA4LDcgKzE0MTAsNyBAQAogCQkJNTAwKTsKIAlQREVCVUcoRF9VU0JJLCAicmVnX3IgWyUwMnhdIC0+ICUwMngiLCB2YWx1ZSwgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTQzMiw3ICsxNDM0LDcgQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdzEgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdzEgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTQ0OSw3ICsxNDUxLDcgQEAKIAkJdmFsdWUsIGJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKICNpZmRlZiBHU1BDQV9ERUJVRwogCWlmIChsZW4gPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigicmVnX3c6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQlwcl9lcnIoInJlZ193OiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCkBAIC0xNDYyLDcgKzE0NjQsNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCBsZW4sCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3cgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdyBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xNTAyLDcgKzE1MDQsNyBAQAogCQkJZ3NwY2FfZGV2LT51c2JfYnVmLCA4LAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoImkyY193MSBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoImkyY193MSBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xNTI3LDcgKzE1MjksNyBAQAogCQkJNTAwKTsKIAltc2xlZXAoMik7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJpMmNfdzggZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJpMmNfdzggZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTU5MSw3ICsxNTkzLDcgQEAKIAkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgSFY3MTMxUiBmb3VuZCIpOwogCQlyZXR1cm47CiAJfQotCXdhcm4oIkVycm9uZW91cyBIVjcxMzFSIElEIDB4JTAyeCAweCUwMnggMHglMDJ4IiwKKwlwcl93YXJuKCJFcnJvbmVvdXMgSFY3MTMxUiBJRCAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKIAkJZ3NwY2FfZGV2LT51c2JfYnVmWzBdLCBnc3BjYV9kZXYtPnVzYl9idWZbMV0sCiAJCWdzcGNhX2Rldi0+dXNiX2J1ZlsyXSk7CiB9CkBAIC0xNzEwLDcgKzE3MTIsNyBAQAogCQlzZC0+c2Vuc29yID0gU0VOU09SX1BPMTAzMDsKIAkJcmV0dXJuOwogCX0KLQllcnIoIlVua25vd24gc2Vuc29yICUwNHgiLCB2YWwpOworCXByX2VycigiVW5rbm93biBzZW5zb3IgJTA0eFxuIiwgdmFsKTsKIH0KIAogLyogMGM0NTo2MTQyIHNlbnNvciBtYXkgYmUgcG8yMDMwbiwgZ2MwMzA1IG9yIGdjMDMwNyAqLwpAQCAtMTc0OCw3ICsxNzUwLDcgQEAKIAkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgcG8yMDMwbiIpOwogLyoJCXNkLT5zZW5zb3IgPSBTRU5TT1JfUE8yMDMwTjsgKi8KIAl9IGVsc2UgewotCQllcnIoIlVua25vd24gc2Vuc29yIElEICUwNHgiLCB2YWwpOworCQlwcl9lcnIoIlVua25vd24gc2Vuc29yIElEICUwNHhcbiIsIHZhbCk7CiAJfQogfQogCkBAIC0yMDA2LDggKzIwMDgsNyBAQAogCWNhc2UgU0VOU09SX09NNjgwMjoKIAkJZXhwbyA9IGJyaWdodG5lc3MgPDwgMjsKIAkJc2QtPmV4cG9zdXJlID0gc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2LCBleHBvKTsKLQkJazIgPSBicmlnaHRuZXNzID4+IDM7Ci0JCWJyZWFrOworCQlyZXR1cm47CQkJLyogWSBvZmZzZXQgYWxyZWFkeSBzZXQgKi8KIAl9CiAKIAlyZWdfdzEoZ3NwY2FfZGV2LCAweDk2LCBrMik7CS8qIGNvbG9yIG1hdHJpeCBZIG9mZnNldCAqLwpAQCAtMjAxOSwxMyArMjAyMCwxMyBAQAogCXU4IGsyOwogCXU4IGNvbnRyYXN0WzZdOwogCi0JazIgPSBzZC0+Y3RybHNbQ09OVFJBU1RdLnZhbCAqIDB4MzAgLyAoQ09OVFJBU1RfTUFYICsgMSkKLQkJCQkrIDB4MTA7CQkvKiAxMC4uNDAgKi8KKwlrMiA9IHNkLT5jdHJsc1tDT05UUkFTVF0udmFsICogMzcgLyAoQ09OVFJBU1RfTUFYICsgMSkKKwkJCQkrIDM3OwkJLyogMzcuLjczICovCiAJY29udHJhc3RbMF0gPSAoazIgKyAxKSAvIDI7CQkvKiByZWQgKi8KIAljb250cmFzdFsxXSA9IDA7CiAJY29udHJhc3RbMl0gPSBrMjsJCQkvKiBncmVlbiAqLwogCWNvbnRyYXN0WzNdID0gMDsKLQljb250cmFzdFs0XSA9IChrMiArIDEpIC8gNTsJCS8qIGJsdWUgKi8KKwljb250cmFzdFs0XSA9IGsyIC8gNTsJCQkvKiBibHVlICovCiAJY29udHJhc3RbNV0gPSAwOwogCXJlZ193KGdzcGNhX2RldiwgMHg4NCwgY29udHJhc3QsIHNpemVvZiBjb250cmFzdCk7CiB9CkBAIC0yNTA3LDkgKzI1MDgsNyBAQAogCQlicmVhazsKIAljYXNlIFNFTlNPUl9IVjcxMzFSOgogCWNhc2UgU0VOU09SX01JMDM2MDoKLQkJaWYgKG1vZGUpCi0JCQlyZWcwMSB8PSBTWVNfU0VMXzQ4TTsJLyogMzIweDI0MDogY2xrIDQ4TWh6ICovCi0JCWVsc2UKKwkJaWYgKCFtb2RlKQogCQkJcmVnMDEgJj0gflNZU19TRUxfNDhNOwkvKiA2NDB4NDgwOiBjbGsgMjRNaHogKi8KIAkJcmVnMTcgJj0gfk1DS19TSVpFX01BU0s7CiAJCXJlZzE3IHw9IDB4MDE7CQkJLyogY2xvY2sgLyAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2ExNTI4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2ExNTI4LmMKaW5kZXggNzZjMDA2Yi4uNjk1NjczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhMTUyOC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTE1MjguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBzcGNhMTUyOCBzdWJkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSmVhbi1GcmFuY29pcyBNb2luZSAoaHR0cDovL21vaW5lamYuZnJlZS5mcikKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEplYW4tRnJhbmNvaXMgTW9pbmUgKGh0dHA6Ly9tb2luZWpmLmZyZWUuZnIpCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOCw2ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3BjYTE1MjgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTcxLDcgKzE3Myw3IEBACiAJUERFQlVHKERfVVNCSSwgIkdFVCAlMDJ4IDAwMDAgJTA0eCAlMDJ4IiwgcmVxLCBpbmRleCwKIAkJCSBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3IgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfciBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xOTMsNyArMTk1LDcgQEAKIAkJCXZhbHVlLCBpbmRleCwKIAkJCU5VTEwsIDAsIDUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTIxNywyMSArMjE5LDIzIEBACiAJCQl2YWx1ZSwgaW5kZXgsCiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDEsIDUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KIAogc3RhdGljIHZvaWQgd2FpdF9zdGF0dXNfMChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCiB7Ci0JaW50IGk7CisJaW50IGksIHc7CiAKLQlpID0gMjA7CisJaSA9IDE2OworCXcgPSAwOwogCWRvIHsKIAkJcmVnX3IoZ3NwY2FfZGV2LCAweDIxLCAweDAwMDAsIDEpOwogCQlpZiAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdID09IDApCiAJCQlyZXR1cm47Ci0JCW1zbGVlcCgzMCk7CisJCXcgKz0gMTU7CisJCW1zbGVlcCh3KTsKIAl9IHdoaWxlICgtLWkgPiAwKTsKIAlQREVCVUcoRF9FUlIsICJ3YWl0X3N0YXR1c18wIHRpbWVvdXQiKTsKIAlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRVRJTUU7CkBAIC0zMDcsOCArMzExLDYgQEAKIAlzZC0+Y29sb3IgPSBDT0xPUl9ERUY7CiAJc2QtPnNoYXJwbmVzcyA9IFNIQVJQTkVTU19ERUY7CiAKLQlnc3BjYV9kZXYtPm5iYWx0ID0gNDsJCS8qIHVzZSBhbHRlcm5hdGUgc2V0dGluZyAzICovCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ3LDggKzM0OSwxMiBAQAogCW1vZGUgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKIAlyZWdfd2IoZ3NwY2FfZGV2LCAweDI1LCAweDAwMDAsIDB4MDAwNCwgbW9kZSk7CiAJcmVnX3IoZ3NwY2FfZGV2LCAweDI1LCAweDAwMDQsIDEpOwotCXJlZ193Yihnc3BjYV9kZXYsIDB4MjcsIDB4MDAwMCwgMHgwMDAwLCAweDA2KTsKKwlyZWdfd2IoZ3NwY2FfZGV2LCAweDI3LCAweDAwMDAsIDB4MDAwMCwgMHgwNik7CS8qIDQyMCAqLwogCXJlZ19yKGdzcGNhX2RldiwgMHgyNywgMHgwMDAwLCAxKTsKKworLyogbm90IHVzZWZ1bC4uCisJZ3NwY2FfZGV2LT5hbHQgPSA0OwkJKiB1c2UgYWx0ZXJuYXRlIHNldHRpbmcgMyAqLworCiAJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKIH0KIApAQCAtMzYxLDggKzM2Nyw4IEBACiAJanBlZ19kZWZpbmUoc2QtPmpwZWdfaGRyLCBnc3BjYV9kZXYtPmhlaWdodCwgZ3NwY2FfZGV2LT53aWR0aCwKIAkJCTB4MjIpOwkJLyogSlBFRyA0MTEgKi8KIAotCS8qIHRoZSBKUEVHIHF1YWxpdHkgc2VlbXMgdG8gYmUgODIlICovCi0JanBlZ19zZXRfcXVhbChzZC0+anBlZ19oZHIsIDgyKTsKKwkvKiB0aGUgSlBFRyBxdWFsaXR5IHNoYWxsIGJlIDg1JSAqLworCWpwZWdfc2V0X3F1YWwoc2QtPmpwZWdfaGRyLCA4NSk7CiAKIAkvKiBzZXQgdGhlIGNvbnRyb2xzICovCiAJc2V0YnJpZ2h0bmVzcyhnc3BjYV9kZXYpOwpAQCAtMzc3LDcgKzM4Myw3IEBACiAKIAkvKiBzdGFydCB0aGUgY2FwdHVyZSAqLwogCXdhaXRfc3RhdHVzXzAoZ3NwY2FfZGV2KTsKLQlyZWdfdyhnc3BjYV9kZXYsIDB4MzEsIDB4MDAwMCwgMHgwMDA0KTsKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MzEsIDB4MDAwMCwgMHgwMDA0KTsJLyogc3RhcnQgcmVxdWVzdCAqLwogCXdhaXRfc3RhdHVzXzEoZ3NwY2FfZGV2KTsKIAl3YWl0X3N0YXR1c18wKGdzcGNhX2Rldik7CiAJbXNsZWVwKDIwMCk7CkBAIC0zOTAsNyArMzk2LDcgQEAKIHsKIAkvKiBzdG9wIHRoZSBjYXB0dXJlICovCiAJd2FpdF9zdGF0dXNfMChnc3BjYV9kZXYpOwotCXJlZ193KGdzcGNhX2RldiwgMHgzMSwgMHgwMDAwLCAweDAwMDApOworCXJlZ193KGdzcGNhX2RldiwgMHgzMSwgMHgwMDAwLCAweDAwMDApOwkvKiBzdG9wIHJlcXVlc3QgKi8KIAl3YWl0X3N0YXR1c18xKGdzcGNhX2Rldik7CiAJd2FpdF9zdGF0dXNfMChnc3BjYV9kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYwppbmRleCAzZTc2OTUxLi5iYjgyYzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDAuYwpAQCAtMTksNiArMTksOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNwY2E1MDAiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMzk2LDcgKzM5OCw3IEBACiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDUwMCk7CiAJaWYgKHJldCA8IDApCi0JCWVycigicmVnIHdyaXRlOiBlcnJvciAlZCIsIHJldCk7CisJCXByX2VycigicmVnIHdyaXRlOiBlcnJvciAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MTgsNyArNDIwLDcgQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuZ3RoLAogCQkJNTAwKTsJCS8qIHRpbWVvdXQgKi8KIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yXzEyIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3JfMTIgZXJyICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gKGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKaW5kZXggZjdlZjI4Mi4uN2FhYWM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTAxLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcGNhNTAxIgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTE4NTIsNyArMTg1NCw3IEBACiAJUERFQlVHKERfVVNCTywgInJlZyB3cml0ZTogMHglMDJ4IDB4JTAyeCAweCUwMngiLAogCQlyZXEsIGluZGV4LCB2YWx1ZSk7CiAJaWYgKHJldCA8IDApCi0JCWVycigicmVnIHdyaXRlOiBlcnJvciAlZCIsIHJldCk7CisJCXByX2VycigicmVnIHdyaXRlOiBlcnJvciAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCmluZGV4IGU1YmY4NjUuLjE2NzIyZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTUwNS5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3BjYTUwNSIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC01NzgsNyArNTgwLDcgQEAKIAlQREVCVUcoRF9VU0JPLCAicmVnIHdyaXRlOiAweCUwMngsMHglMDJ4OjB4JTAyeCwgJWQiLAogCQlyZXEsIGluZGV4LCB2YWx1ZSwgcmV0KTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4NSw4ICs2ODcsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAocmV0ICE9IDB4MDEwMSkgewotCQllcnIoIkFmdGVyIHZlY3RvciByZWFkIHJldHVybnMgMHglMDR4IHNob3VsZCBiZSAweDAxMDEiLAotCQkJcmV0KTsKKwkJcHJfZXJyKCJBZnRlciB2ZWN0b3IgcmVhZCByZXR1cm5zIDB4JTA0eCBzaG91bGQgYmUgMHgwMTAxXG4iLAorCQkgICAgICAgcmV0KTsKIAl9CiAKIAlyZXQgPSByZWdfd3JpdGUoZ3NwY2FfZGV2LT5kZXYsIDB4MDYsIDB4MTYsIDB4MGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcGNhNTA4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwppbmRleCA5ZDBiNDYwLi5hNDRmZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1MDguYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInNwY2E1MDgiCiAKICNpbmNsdWRlICJnc3BjYS5oIgpAQCAtMTI3NSw3ICsxMjc3LDcgQEAKIAlQREVCVUcoRF9VU0JPLCAicmVnIHdyaXRlIGk6MHglMDR4ID0gMHglMDJ4IiwKIAkJaW5kZXgsIHZhbHVlKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyOTcsNyArMTI5OSw3IEBACiAJUERFQlVHKERfVVNCSSwgInJlZyByZWFkIGk6JTA0eCAtLT4gJTAyeCIsCiAJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3JlYWQgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfcmVhZCBlcnIgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiBnc3BjYV9kZXYtPnVzYl9idWZbMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NwY2E1NjEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCmluZGV4IGU4MzZlNzcuLmM4MmZkNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3BjYTU2MS5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3BjYTU2MSIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0zMTUsNyArMzE3LDcgQEAKIAkJCSAgICAgIHZhbHVlLCBpbmRleCwgTlVMTCwgMCwgNTAwKTsKIAlQREVCVUcoRF9VU0JPLCAicmVnIHdyaXRlOiAweCUwMng6MHglMDJ4IiwgaW5kZXgsIHZhbHVlKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWcgd3JpdGU6IGVycm9yICVkXG4iLCByZXQpOwogfQogCiBzdGF0aWMgdm9pZCB3cml0ZV92ZWN0b3Ioc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNS5jCmluZGV4IDViYTk2YWYuLmRmODA1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1LmMKQEAgLTMzLDYgKzMzLDggQEAKICAqIGRyaXZlcnMuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJzcTkwNSIKIAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtMTIzLDggKzEyNSw3IEBACiAJCQkgICAgICBTUTkwNV9DT01NQU5ELCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJICAgICAgU1E5MDVfQ01EX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKSIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKKwkJcHJfZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEzNSw4ICsxMzYsNyBAQAogCQkJICAgICAgU1E5MDVfUElORywgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJICAgICAgU1E5MDVfQ01EX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgMiAoJWQpIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlwcl9lcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkIDIgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJCSAgICAgIFNROTA1X1JFQURfRE9ORSwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCAxLAogCQkJICAgICAgU1E5MDVfQ01EX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKSIsIF9fZnVuY19fLCByZXQpOworCQlwcl9lcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAJaWYgKG5lZWRfbG9jaykKIAkJbXV0ZXhfdW5sb2NrKCZnc3BjYV9kZXYtPnVzYl9sb2NrKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZCkiLCBfX2Z1bmNfXywgcmV0KTsKKwkJcHJfZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJcmV0ID0gdXNiX2J1bGtfbXNnKGdzcGNhX2Rldi0+ZGV2LApAQCAtMTk1LDggKzE5NSw3IEBACiAKIAkvKiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDAsIG90aGVyd2lzZSAgbmVnYXRpdmUgKi8KIAlpZiAocmV0IDwgMCB8fCBhY3RfbGVuICE9IHNpemUpIHsKLQkJZXJyKCJidWxrIHJlYWQgZmFpbCAoJWQpIGxlbiAlZC8lZCIsCi0JCQlyZXQsIGFjdF9sZW4sIHNpemUpOworCQlwcl9lcnIoImJ1bGsgcmVhZCBmYWlsICglZCkgbGVuICVkLyVkXG4iLCByZXQsIGFjdF9sZW4sIHNpemUpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CkBAIC0yMjYsNyArMjI1LDcgQEAKIAogCWJ1ZmZlciA9IGttYWxsb2MoU1E5MDVfTUFYX1RSQU5TRkVSLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpIHsKLQkJZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyIik7CisJCXByX2VycigiQ291bGRuJ3QgYWxsb2NhdGUgVVNCIGJ1ZmZlclxuIik7CiAJCWdvdG8gcXVpdF9zdHJlYW07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1Yy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkwNWMuYwppbmRleCA0NTc1NjNiLi5jMmMwNTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTA1Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MDVjLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIGFuZCBtYXkgY29udGFpbiBjb2RlIGZyYWdtZW50cyBmcm9tIGl0LgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3E5MDVjIgogCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC05NSw4ICs5Nyw3IEBACiAJCQkgICAgICBjb21tYW5kLCBpbmRleCwgTlVMTCwgMCwKIAkJCSAgICAgIFNROTA1Q19DTURfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCIlczogdXNiX2NvbnRyb2xfbXNnIGZhaWxlZCAoJWQpIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlwcl9lcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTE1LDggKzExNiw3IEBACiAJCQkgICAgICBjb21tYW5kLCBpbmRleCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBzaXplLAogCQkJICAgICAgU1E5MDVDX0NNRF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoIiVzOiB1c2JfY29udHJvbF9tc2cgZmFpbGVkICglZCkiLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCXByX2VycigiJXM6IHVzYl9jb250cm9sX21zZyBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCWJ1ZmZlciA9IGttYWxsb2MoU1E5MDVDX01BWF9UUkFOU0ZFUiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCWlmICghYnVmZmVyKSB7Ci0JCWVycigiQ291bGRuJ3QgYWxsb2NhdGUgVVNCIGJ1ZmZlciIpOworCQlwcl9lcnIoIkNvdWxkbid0IGFsbG9jYXRlIFVTQiBidWZmZXJcbiIpOwogCQlnb3RvIHF1aXRfc3RyZWFtOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkzMHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3E5MzB4LmMKaW5kZXggODIxNWQ1ZC4uZTQyNTViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zcTkzMHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NxOTMweC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3E5MzB4IgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKQEAgLTQ2OCw3ICs0NzAsNyBAQAogCQkJdmFsdWUsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yICUwNHggZmFpbGVkICVkIiwgdmFsdWUsIHJldCk7CisJCXByX2VycigicmVnX3IgJTA0eCBmYWlsZWQgJWRcbiIsIHZhbHVlLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtNDg4LDcgKzQ5MCw3IEBACiAJCQk1MDApOwogCW1zbGVlcCgzMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyAlMDR4ICUwNHggZmFpbGVkICVkIiwgdmFsdWUsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ193ICUwNHggJTA0eCBmYWlsZWQgJWRcbiIsIHZhbHVlLCBpbmRleCwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTUxMSw3ICs1MTMsNyBAQAogCQkJMTAwMCk7CiAJbXNsZWVwKDMwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ193YiAlMDR4ICUwNHggZmFpbGVkICVkIiwgdmFsdWUsIGluZGV4LCByZXQpOworCQlwcl9lcnIoInJlZ193YiAlMDR4ICUwNHggZmFpbGVkICVkXG4iLCB2YWx1ZSwgaW5kZXgsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC01NTYsNyArNTU4LDcgQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgYnVmIC0gZ3NwY2FfZGV2LT51c2JfYnVmLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoImkyY193cml0ZSBmYWlsZWQgJWQiLCByZXQpOworCQlwcl9lcnIoImkyY193cml0ZSBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC01NzUsNyArNTc3LDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKChiYXRjaHNpemUgLSAxKSAqIDMgPiBVU0JfQlVGX1NaKSB7Ci0JCWVycigiQnVnOiB1c2JfYnVmIG92ZXJmbG93Iik7CisJCXByX2VycigiQnVnOiB1c2JfYnVmIG92ZXJmbG93XG4iKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVOT01FTTsKIAkJcmV0dXJuOwogCX0KQEAgLTYxMiw3ICs2MTQsNyBAQAogCQkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgYnVmIC0gZ3NwY2FfZGV2LT51c2JfYnVmLAogCQkJCTUwMCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQllcnIoInVjYnVzX3dyaXRlIGZhaWxlZCAlZCIsIHJldCk7CisJCQlwcl9lcnIoInVjYnVzX3dyaXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAkJCXJldHVybjsKIAkJfQpAQCAtNjg4LDcgKzY5MCw3IEBACiAJCQlicmVhazsKIAl9CiAJaWYgKGkgPj0gQVJSQVlfU0laRShwcm9iZV9vcmRlcikpIHsKLQkJZXJyKCJVbmtub3duIHNlbnNvciIpOworCQlwcl9lcnIoIlVua25vd24gc2Vuc29yXG4iKTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVJTlZBTDsKIAkJcmV0dXJuOwogCX0KQEAgLTY5Niw3ICs2OTgsOCBAQAogCXN3aXRjaCAoc2QtPnNlbnNvcikgewogCWNhc2UgU0VOU09SX09WNzY2MDoKIAljYXNlIFNFTlNPUl9PVjk2MzA6Ci0JCWVycigiU2Vuc29yICVzIG5vdCB5ZXQgdHJlYXRlZCIsIHNlbnNvcl90YltzZC0+c2Vuc29yXS5uYW1lKTsKKwkJcHJfZXJyKCJTZW5zb3IgJXMgbm90IHlldCB0cmVhdGVkXG4iLAorCQkgICAgICAgc2Vuc29yX3RiW3NkLT5zZW5zb3JdLm5hbWUpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0xMDkxLDcgKzEwOTQsNyBAQAogCWdzcGNhX2Rldi0+Y2FtLmJ1bGtfbnVyYnMgPSAxOwogCXJldCA9IHVzYl9zdWJtaXRfdXJiKGdzcGNhX2Rldi0+dXJiWzBdLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0IDwgMCkKLQkJZXJyKCJzZF9kcV9jYWxsYmFjaygpIGVyciAlZCIsIHJldCk7CisJCXByX2Vycigic2RfZHFfY2FsbGJhY2soKSBlcnIgJWRcbiIsIHJldCk7CiAKIAkvKiB3YWl0IGEgbGl0dGxlIHRpbWUsIG90aGVyd2lzZSB0aGUgd2ViY2FtIGNyYXNoZXMgKi8KIAltc2xlZXAoMTAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0azAxNC5jCmluZGV4IDc2Mzc0NzcuLjQyYTdhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3RrMDE0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdGswMTQuYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInN0azAxNCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0xMzcsNyArMTM5LDcgQEAKIAkJCWdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfciBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ19yIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNjIsNyArMTY0LDcgQEAKIAkJCTAsCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3cgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfdyBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0xOTIsNyArMTk0LDcgQEAKIAkJCSZhbGVuLAogCQkJNTAwKTsJCS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyY3ZfdmFsIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmN2X3ZhbCBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC0yMzUsNyArMjM3LDcgQEAKIAkJCSZhbGVuLAogCQkJNTAwKTsJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KIAlpZiAocmV0IDwgMCkgewotCQllcnIoInNuZF92YWwgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJzbmRfdmFsIGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0gZWxzZSB7CiAJCWlmIChhZHMgPT0gMHgwMDNmMDgpIHsKQEAgLTMxNSw3ICszMTcsNyBAQAogCXJldCA9IHJlZ19yKGdzcGNhX2RldiwgMHgwNzQwKTsKIAlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyID49IDApIHsKIAkJaWYgKHJldCAhPSAweGZmKSB7Ci0JCQllcnIoImluaXQgcmVnOiAweCUwMngiLCByZXQpOworCQkJcHJfZXJyKCJpbml0IHJlZzogMHglMDJ4XG4iLCByZXQpOwogCQkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVJTzsKIAkJfQogCX0KQEAgLTM0OSw4ICszNTEsOCBAQAogCQkJCQlnc3BjYV9kZXYtPmlmYWNlLAogCQkJCQlnc3BjYV9kZXYtPmFsdCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJzZXQgaW50ZiAlZCAlZCBmYWlsZWQiLAotCQkJZ3NwY2FfZGV2LT5pZmFjZSwgZ3NwY2FfZGV2LT5hbHQpOworCQlwcl9lcnIoInNldCBpbnRmICVkICVkIGZhaWxlZFxuIiwKKwkJICAgICAgIGdzcGNhX2Rldi0+aWZhY2UsIGdzcGNhX2Rldi0+YWx0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jCmluZGV4IGUyZWY0MWMuLjRkY2M3ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDY4MC5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3R2MDY4MCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC03OSw3ICs4MSw3IEBACiAJCQkgICAgICB2YWwsIDAsIGdzcGNhX2Rldi0+dXNiX2J1Ziwgc2l6ZSwgNTAwKTsKIAogCWlmICgocmV0IDwgMCkgJiYgKHJlcSAhPSAweDBhKSkKLQkJZXJyKCJ1c2JfY29udHJvbF9tc2cgZXJyb3IgJWksIHJlcXVlc3QgPSAweCV4LCBlcnJvciA9ICVpIiwKKwkJcHJfZXJyKCJ1c2JfY29udHJvbF9tc2cgZXJyb3IgJWksIHJlcXVlc3QgPSAweCV4LCBlcnJvciA9ICVpXG4iLAogCQkgICAgICAgc2V0LCByZXEsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjM2LDcgKzIzOCw3IEBACiAKIAlpZiAoc3R2X3NuZGN0cmwoZ3NwY2FfZGV2LCAyLCAweDA2LCAweDAxMDAsIDB4MTIpICE9IDB4MTIgfHwKIAkgICAgZ3NwY2FfZGV2LT51c2JfYnVmWzhdICE9IDB4NTMgfHwgZ3NwY2FfZGV2LT51c2JfYnVmWzldICE9IDB4MDUpIHsKLQkJZXJyKCJDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDEwMC4iKTsKKwkJcHJfZXJyKCJDb3VsZCBub3QgZ2V0IGRlc2NyaXB0b3IgMDEwMFxuIik7CiAJCXJldHVybiBzdHYwNjgwX2hhbmRsZV9lcnJvcihnc3BjYV9kZXYsIC1FSU8pOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L01ha2VmaWxlCmluZGV4IDJmM2MzYTYuLjViMzE4ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvTWFrZWZpbGUKQEAgLTYsNSArNiw1IEBACiAJCSAgICAgIHN0djA2eHhfcGIwMTAwLm8gXAogCQkgICAgICBzdHYwNnh4X3N0NjQyMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmMKaW5kZXggYWJmMTY1OC4uYjFmY2E3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKiBQL04gODYxMDQwLTAwMDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBRdWlja0NhbSBXZWIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgInN0djA2eHhfc2Vuc29yLmgiCiAKQEAgLTE4OSw3ICsxOTEsNyBAQAogCQkJICAgICAgMHgwNCwgMHg0MCwgMHgxNDAwLCAwLCBidWYsIEkyQ19CVUZGRVJfTEVOR1RILAogCQkJICAgICAgU1RWMDZYWF9VUkJfTVNHX1RJTUVPVVQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWVycigiSTJDOiBSZWFkIGVycm9yIHdyaXRpbmcgYWRkcmVzczogJWQiLCBlcnIpOworCQlwcl9lcnIoIkkyQzogUmVhZCBlcnJvciB3cml0aW5nIGFkZHJlc3M6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjEzLDE0ICsyMTUsMTQgQEAKIAlpbnQgaTsKIAl1OCBkYXRhLCBidWY7CiAKLQlpbmZvKCJEdW1waW5nIGFsbCBzdHYwNnh4IGJyaWRnZSByZWdpc3RlcnMiKTsKKwlwcl9pbmZvKCJEdW1waW5nIGFsbCBzdHYwNnh4IGJyaWRnZSByZWdpc3RlcnNcbiIpOwogCWZvciAoaSA9IDB4MTQwMDsgaSA8IDB4MTYwZjsgaSsrKSB7CiAJCXN0djA2eHhfcmVhZF9icmlkZ2Uoc2QsIGksICZkYXRhKTsKIAotCQlpbmZvKCJSZWFkIDB4JXggZnJvbSBhZGRyZXNzIDB4JXgiLCBkYXRhLCBpKTsKKwkJcHJfaW5mbygiUmVhZCAweCV4IGZyb20gYWRkcmVzcyAweCV4XG4iLCBkYXRhLCBpKTsKIAl9CiAKLQlpbmZvKCJUZXN0aW5nIHN0djA2eHggYnJpZGdlIHJlZ2lzdGVycyBmb3Igd3JpdGFiaWxpdHkiKTsKKwlwcl9pbmZvKCJUZXN0aW5nIHN0djA2eHggYnJpZGdlIHJlZ2lzdGVycyBmb3Igd3JpdGFiaWxpdHlcbiIpOwogCWZvciAoaSA9IDB4MTQwMDsgaSA8IDB4MTYwZjsgaSsrKSB7CiAJCXN0djA2eHhfcmVhZF9icmlkZ2Uoc2QsIGksICZkYXRhKTsKIAkJYnVmID0gZGF0YTsKQEAgLTIyOCwxMiArMjMwLDEyIEBACiAJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBpLCAweGZmKTsKIAkJc3R2MDZ4eF9yZWFkX2JyaWRnZShzZCwgaSwgJmRhdGEpOwogCQlpZiAoZGF0YSA9PSAweGZmKQotCQkJaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkL3dyaXRlIiwgaSk7CisJCQlwcl9pbmZvKCJSZWdpc3RlciAweCV4IGlzIHJlYWQvd3JpdGVcbiIsIGkpOwogCQllbHNlIGlmIChkYXRhICE9IGJ1ZikKLQkJCWluZm8oIlJlZ2lzdGVyIDB4JXggaXMgcmVhZC93cml0ZSwiCi0JCQkgICAgICIgYnV0IG9ubHkgcGFydGlhbGx5IiwgaSk7CisJCQlwcl9pbmZvKCJSZWdpc3RlciAweCV4IGlzIHJlYWQvd3JpdGUsIGJ1dCBvbmx5IHBhcnRpYWxseVxuIiwKKwkJCQlpKTsKIAkJZWxzZQotCQkJaW5mbygiUmVnaXN0ZXIgMHgleCBpcyByZWFkLW9ubHkiLCBpKTsKKwkJCXByX2luZm8oIlJlZ2lzdGVyIDB4JXggaXMgcmVhZC1vbmx5XG4iLCBpKTsKIAogCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgaSwgYnVmKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHguaAppbmRleCBlMGY2M2M1Li5kMjcwYTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4LmgKQEAgLTM3LDYgKzM3LDggQEAKIAogI2RlZmluZSBTVFZfSVNPQ19FTkRQT0lOVF9BRERSCQkweDgxCiAKKyNkZWZpbmUgU1RWX1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MDkKKwogI2RlZmluZSBTVFZfUkVHMjMJCQkweDA0MjMKIAogLyogQ29udHJvbCByZWdpc3RlcnMgb2YgdGhlIFNUVjA2MDAgQVNJQyAqLwpAQCAtNjEsNyArNjMsOSBAQAogCiAvKiBSZWZlcnMgdG8gdGhlIENJRiAzNTJ4Mjg4IGFuZCBRQ0lGIDE3NngxNDQgKi8KIC8qIDE6IDI4OCBsaW5lcywgMjogMTQ0IGxpbmVzICovCi0jZGVmaW5lIFNUVl9ZX0NUUkwJCQkweDE1YzMKKyNkZWZpbmUgU1RWX1lfQ1RSTAkJICAgICAgICAweDE1YzMKKworI2RlZmluZSBTVFZfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTYyMAogCiAvKiAweGE6IDM1MiBjb2x1bW5zLCAweDY6IDE3NiBjb2x1bW5zICovCiAjZGVmaW5lIFNUVl9YX0NUUkwJCQkweDE2ODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X2hkY3MuYwppbmRleCBiODE1Njg1Li5hODY5OGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9oZGNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfaGRjcy5jCkBAIC0yOCw2ICsyOCw4IEBACiAgKiBQL04gODYxMDQwLTAwMDA6IFNlbnNvciBTVCBWVjY0MTAgICAgICAgQVNJQyBTVFYwNjEwICAgLSBRdWlja0NhbSBXZWIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJzdHYwNnh4X2hkY3MuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIGhkY3MxeDAwX2N0cmxbXSA9IHsKQEAgLTQyOCw3ICs0MzAsNyBAQAogCWlmIChyZXQgPCAwIHx8IHNlbnNvciAhPSAweDA4KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oIkhEQ1MtMTAwMC8xMTAwIHNlbnNvciBkZXRlY3RlZCIpOworCXByX2luZm8oIkhEQ1MtMTAwMC8xMTAwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAKIAlzZC0+Z3NwY2FfZGV2LmNhbS5jYW1fbW9kZSA9IGhkY3MxeDAwX21vZGU7CiAJc2QtPmdzcGNhX2Rldi5jYW0ubm1vZGVzID0gQVJSQVlfU0laRShoZGNzMXgwMF9tb2RlKTsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogCWlmIChyZXQgPCAwIHx8IHNlbnNvciAhPSAweDEwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWluZm8oIkhEQ1MtMTAyMCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwlwcl9pbmZvKCJIRENTLTEwMjAgc2Vuc29yIGRldGVjdGVkXG4iKTsKIAogCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gaGRjczEwMjBfbW9kZTsKIAlzZC0+Z3NwY2FfZGV2LmNhbS5ubW9kZXMgPSBBUlJBWV9TSVpFKGhkY3MxMDIwX21vZGUpOwpAQCAtNjAxLDExICs2MDMsMTEgQEAKIHsKIAl1MTYgcmVnLCB2YWw7CiAKLQlpbmZvKCJEdW1waW5nIHNlbnNvciByZWdpc3RlcnM6Iik7CisJcHJfaW5mbygiRHVtcGluZyBzZW5zb3IgcmVnaXN0ZXJzOlxuIik7CiAKIAlmb3IgKHJlZyA9IEhEQ1NfSURFTlQ7IHJlZyA8PSBIRENTX1JPV0VYUEg7IHJlZysrKSB7CiAJCXN0djA2eHhfcmVhZF9zZW5zb3Ioc2QsIHJlZywgJnZhbCk7Ci0JCWluZm8oInJlZyAweCUwMnggPSAweCUwMngiLCByZWcsIHZhbCk7CisJCXByX2luZm8oInJlZyAweCUwMnggPSAweCUwMnhcbiIsIHJlZywgdmFsKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9wYjAxMDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3BiMDEwMC5jCmluZGV4IDc1YTViOWMuLjI2ZjE0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3BiMDEwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3BiMDEwMC5jCkBAIC00NCw2ICs0NCw4IEBACiAgKiBQQl9DRklMTElOICAgICAgID0gUjUgID0gMHgwRSAoMTQgZGVjKSAgICAgOiBTZXRzIHRoZSBmcmFtZSByYXRlCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSAic3R2MDZ4eF9wYjAxMDAuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHBiMDEwMF9jdHJsW10gPSB7CkBAIC0xOTAsNyArMTkyLDcgQEAKIAkJaWYgKCFzZW5zb3Jfc2V0dGluZ3MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlpbmZvKCJQaG90b2JpdCBwYjAxMDAgc2Vuc29yIGRldGVjdGVkIik7CisJCXByX2luZm8oIlBob3RvYml0IHBiMDEwMCBzZW5zb3IgZGV0ZWN0ZWRcbiIpOwogCiAJCXNkLT5nc3BjYV9kZXYuY2FtLmNhbV9tb2RlID0gcGIwMTAwX21vZGU7CiAJCXNkLT5nc3BjYV9kZXYuY2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUocGIwMTAwX21vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfc3Q2NDIyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zdDY0MjIuYwppbmRleCA4YTQ1NmRlLi45OTQwZTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zdDY0MjIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF9zdDY0MjIuYwpAQCAtMjYsNiArMjYsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlICJzdHYwNnh4X3N0NjQyMi5oIgogCiAvKiBjb250cm9scyAqLwpAQCAtMTM2LDcgKzEzOCw3IEBACiAJaWYgKHNkLT5icmlkZ2UgIT0gQlJJREdFX1NUNjQyMikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpbmZvKCJzdDY0MjIgc2Vuc29yIGRldGVjdGVkIik7CisJcHJfaW5mbygic3Q2NDIyIHNlbnNvciBkZXRlY3RlZFxuIik7CiAKIAlzZW5zb3Jfc2V0dGluZ3MgPSBrbWFsbG9jKHNpemVvZiAqc2Vuc29yX3NldHRpbmdzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNlbnNvcl9zZXR0aW5ncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3R2MDZ4eC9zdHYwNnh4X3Z2NjQxMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMKaW5kZXggZjgzOTg0My4uYTVjNjlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIFAvTiA4NjEwNDAtMDAwMDogU2Vuc29yIFNUIFZWNjQxMCAgICAgICBBU0lDIFNUVjA2MTAgICAtIFF1aWNrQ2FtIFdlYgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgInN0djA2eHhfdnY2NDEwLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZ2NjQxMF9tb2RlW10gPSB7CkBAIC0xMTIsNyArMTE0LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoZGF0YSA9PSAweDE5KSB7Ci0JCWluZm8oInZ2NjQxMCBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJcHJfaW5mbygidnY2NDEwIHNlbnNvciBkZXRlY3RlZFxuIik7CiAKIAkJc2Vuc29yX3NldHRpbmdzID0ga21hbGxvYyhBUlJBWV9TSVpFKHZ2NjQxMF9jdHJsKSAqIHNpemVvZihzMzIpLAogCQkJCQkgIEdGUF9LRVJORUwpOwpAQCAtMTM4LDE4ICsxNDAsNyBAQAogCXMzMiAqc2Vuc29yX3NldHRpbmdzID0gc2QtPnNlbnNvcl9wcml2OwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3R2X2JyaWRnZV9pbml0KTsgaSsrKSB7Ci0JCS8qIGlmIE5VTEwgdGhlbiBsZW4gY29udGFpbnMgc2luZ2xlIHZhbHVlICovCi0JCWlmIChzdHZfYnJpZGdlX2luaXRbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQllcnIgPSBzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwKLQkJCQlzdHZfYnJpZGdlX2luaXRbaV0uc3RhcnQsCi0JCQkJc3R2X2JyaWRnZV9pbml0W2ldLmxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgajsKLQkJCWZvciAoaiA9IDA7IGogPCBzdHZfYnJpZGdlX2luaXRbaV0ubGVuOyBqKyspCi0JCQkJZXJyID0gc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsCi0JCQkJCXN0dl9icmlkZ2VfaW5pdFtpXS5zdGFydCArIGosCi0JCQkJCXN0dl9icmlkZ2VfaW5pdFtpXS5kYXRhW2pdKTsKLQkJfQorCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgc3R2X2JyaWRnZV9pbml0W2ldLmFkZHIsIHN0dl9icmlkZ2VfaW5pdFtpXS5kYXRhKTsKIAl9CiAKIAlpZiAoZXJyIDwgMCkKQEAgLTE4MywxNSArMTc0LDYgQEAKIAlzdHJ1Y3QgY2FtICpjYW0gPSAmc2QtPmdzcGNhX2Rldi5jYW07CiAJdTMyIHByaXYgPSBjYW0tPmNhbV9tb2RlW3NkLT5nc3BjYV9kZXYuY3Vycl9tb2RlXS5wcml2OwogCi0JaWYgKHByaXYgJiBWVjY0MTBfQ1JPUF9UT19RVkdBKSB7Ci0JCVBERUJVRyhEX0NPTkYsICJDcm9wcGluZyB0byBRVkdBIik7Ci0JCXN0djA2eHhfd3JpdGVfc2Vuc29yKHNkLCBWVjY0MTBfWEVOREgsIDMyMCAtIDEpOwotCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgVlY2NDEwX1lFTkRILCAyNDAgLSAxKTsKLQl9IGVsc2UgewotCQlzdHYwNnh4X3dyaXRlX3NlbnNvcihzZCwgVlY2NDEwX1hFTkRILCAzNjAgLSAxKTsKLQkJc3R2MDZ4eF93cml0ZV9zZW5zb3Ioc2QsIFZWNjQxMF9ZRU5ESCwgMjk0IC0gMSk7Ci0JfQotCiAJaWYgKHByaXYgJiBWVjY0MTBfU1VCU0FNUExFKSB7CiAJCVBERUJVRyhEX0NPTkYsICJFbmFibGluZyBzdWJzYW1wbGluZyIpOwogCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1lfQ1RSTCwgMHgwMik7CkBAIC0yMDEsOCArMTgzLDggQEAKIAl9IGVsc2UgewogCQlzdHYwNnh4X3dyaXRlX2JyaWRnZShzZCwgU1RWX1lfQ1RSTCwgMHgwMSk7CiAJCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfWF9DVFJMLCAweDBhKTsKKwkJc3R2MDZ4eF93cml0ZV9icmlkZ2Uoc2QsIFNUVl9TQ0FOX1JBVEUsIDB4MDApOwogCi0JCXN0djA2eHhfd3JpdGVfYnJpZGdlKHNkLCBTVFZfU0NBTl9SQVRFLCAweDIwKTsKIAl9CiAKIAkvKiBUdXJuIG9uIExFRCAqLwpAQCAtMjQyLDExICsyMjQsMTEgQEAKIAl1OCBpOwogCWludCBlcnIgPSAwOwogCi0JaW5mbygiRHVtcGluZyBhbGwgdnY2NDEwIHNlbnNvciByZWdpc3RlcnMiKTsKKwlwcl9pbmZvKCJEdW1waW5nIGFsbCB2djY0MTAgc2Vuc29yIHJlZ2lzdGVyc1xuIik7CiAJZm9yIChpID0gMDsgaSA8IDB4ZmYgJiYgIWVycjsgaSsrKSB7CiAJCXUxNiBkYXRhOwogCQllcnIgPSBzdHYwNnh4X3JlYWRfc2Vuc29yKHNkLCBpLCAmZGF0YSk7Ci0JCWluZm8oIlJlZ2lzdGVyIDB4JXggY29udGFpbmVkIDB4JXgiLCBpLCBkYXRhKTsKKwkJcHJfaW5mbygiUmVnaXN0ZXIgMHgleCBjb250YWluZWQgMHgleFxuIiwgaSwgZGF0YSk7CiAJfQogCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdHYwNnh4L3N0djA2eHhfdnY2NDEwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuaAppbmRleCA3ZmUzNTg3Li5hMjViODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N0djA2eHgvc3R2MDZ4eF92djY0MTAuaApAQCAtMjExLDQ5ICsyMTEsNDkgQEAKIAogLyogSWYgTlVMTCwgb25seSBzaW5nbGUgdmFsdWUgdG8gd3JpdGUsIHN0b3JlZCBpbiBsZW4gKi8KIHN0cnVjdCBzdHZfaW5pdCB7Ci0JY29uc3QgdTggKmRhdGE7Ci0JdTE2IHN0YXJ0OwotCXU4IGxlbjsKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCB4MTUwMFtdID0gewkvKiAweDE1MDAgLSAweDE1MGYgKi8KLQkweDBiLCAweGE3LCAweGI3LCAweDAwLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdTggeDE1MzZbXSA9IHsJLyogMHgxNTM2IC0gMHgxNTNiICovCi0JMHgwMiwgMHgwMCwgMHg2MCwgMHgwMSwgMHgyMCwgMHgwMQorCXUxNiBhZGRyOworCXU4IGRhdGE7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN0dl9pbml0IHN0dl9icmlkZ2VfaW5pdFtdID0gewogCS8qIFRoaXMgcmVnIGlzIHdyaXR0ZW4gdHdpY2UuIFNvbWUga2luZCBvZiByZXNldD8gKi8KLQl7TlVMTCwgIDB4MTYyMCwgMHg4MH0sCi0Je05VTEwsICAweDE2MjAsIDB4MDB9LAotCXtOVUxMLCAgMHgxNDQzLCAweDAwfSwKLQl7TlVMTCwgIDB4MTQyMywgMHgwNH0sCi0Je3gxNTAwLCAweDE1MDAsIEFSUkFZX1NJWkUoeDE1MDApfSwKLQl7eDE1MzYsIDB4MTUzNiwgQVJSQVlfU0laRSh4MTUzNil9LAorCXtTVFZfUkVTRVQsIDB4ODB9LAorCXtTVFZfUkVTRVQsIDB4MDB9LAorCXtTVFZfU0NBTl9SQVRFLCAweDAwfSwKKwl7U1RWX0kyQ19GTFVTSCwgMHgwNH0sCisJe1NUVl9SRUcwMCwgMHgwYn0sCisJe1NUVl9SRUcwMSwgMHhhN30sCisJe1NUVl9SRUcwMiwgMHhiN30sCisJe1NUVl9SRUcwMywgMHgwMH0sCisJe1NUVl9SRUcwNCwgMHgwMH0sCisJezB4MTUzNiwgMHgwMn0sCisJezB4MTUzNywgMHgwMH0sCisJezB4MTUzOCwgMHg2MH0sCisJezB4MTUzOSwgMHgwMX0sCisJezB4MTUzYSwgMHgyMH0sCisJezB4MTUzYiwgMHgwMX0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTggdnY2NDEwX3NlbnNvcl9pbml0W11bMl0gPSB7CiAJLyogU2V0dXAgcmVnaXN0ZXJzICovCi0Je1ZWNjQxMF9TRVRVUDAsCQlWVjY0MTBfU09GVF9SRVNFVH0sCi0Je1ZWNjQxMF9TRVRVUDAsCQlWVjY0MTBfTE9XX1BPV0VSX01PREV9LAorCXtWVjY0MTBfU0VUVVAwLAlWVjY0MTBfU09GVF9SRVNFVH0sCisJe1ZWNjQxMF9TRVRVUDAsCVZWNjQxMF9MT1dfUE9XRVJfTU9ERX0sCiAJLyogVXNlIHNodWZmbGVkIHJlYWQtb3V0IG1vZGUgKi8KLQl7VlY2NDEwX1NFVFVQMSwJCUJJVCg2KX0sCi0JLyogQWxsIG1vZGVzIHRvIDEgKi8KLQl7VlY2NDEwX0ZHTU9ERVMsCUJJVCg2KSB8IEJJVCg0KSB8IEJJVCgyKSB8IEJJVCgwKX0sCi0Je1ZWNjQxMF9QSU5NQVBQSU5HLAkweDAwfSwKKwl7VlY2NDEwX1NFVFVQMSwJQklUKDYpfSwKKwkvKiBBbGwgbW9kZXMgdG8gMSwgRlNULCBGYXN0IFFDSywgRnJlZSBydW5uaW5nIFFDSywgRnJlZSBydW5uaW5nIExTVCwgRlNUIHdpbGwgcXVhbGlmeSB2aXNpYmxlIHBpeGVscyAqLworCXtWVjY0MTBfRkdNT0RFUywgQklUKDYpIHwgQklUKDQpIHwgQklUKDIpIHwgQklUKDApfSwKKwl7VlY2NDEwX1BJTk1BUFBJTkcsIDB4MDB9LAogCS8qIFByZS1jbG9jayBnZW5lcmF0b3IgZGl2aWRlIG9mZiAqLwotCXtWVjY0MTBfREFUQUZPUk1BVCwJQklUKDcpIHwgQklUKDApfSwKKwl7VlY2NDEwX0RBVEFGT1JNQVQsIEJJVCg3KSB8IEJJVCgwKX0sCiAKLQl7VlY2NDEwX0NMS0RJViwJCVZWNjQxMF9DTEtfRElWXzJ9LAorCXtWVjY0MTBfQ0xLRElWLAlWVjY0MTBfQ0xLX0RJVl8yfSwKIAogCS8qIFN5c3RlbSByZWdpc3RlcnMgKi8KIAkvKiBFbmFibGUgdm9sdGFnZSBkb3VibGVyICovCi0Je1ZWNjQxMF9BUzAsCQlCSVQoNikgfCBCSVQoNCkgfCBCSVQoMykgfCBCSVQoMikgfCBCSVQoMSl9LAotCXtWVjY0MTBfQVQwLAkJMHgwMH0sCisJe1ZWNjQxMF9BUzAsIEJJVCg2KSB8IEJJVCg0KSB8IEJJVCgzKSB8IEJJVCgyKSB8IEJJVCgxKX0sCisJe1ZWNjQxMF9BVDAsIDB4MDB9LAogCS8qIFBvd2VyIHVwIGF1ZGlvLCBkaWZmZXJlbnRpYWwgKi8KLQl7VlY2NDEwX0FUMSwJCUJJVCg0KXxCSVQoMCl9LAorCXtWVjY0MTBfQVQxLCBCSVQoNCkgfCBCSVQoMCl9LAogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCmluZGV4IDZlYzIzMjkuLmM4OTA5NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAic3VucGx1cyIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0zMjUsNyArMzI3LDcgQEAKIAogI2lmZGVmIEdTUENBX0RFQlVHCiAJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKLQkJZXJyKCJyZWdfcjogYnVmZmVyIG92ZXJmbG93Iik7CisJCXByX2VycigicmVnX3I6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKQEAgLTM0MCw3ICszNDIsNyBAQAogCQkJbGVuID8gZ3NwY2FfZGV2LT51c2JfYnVmIDogTlVMTCwgbGVuLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMzY1LDcgKzM2Nyw3IEBACiAJCQlnc3BjYV9kZXYtPnVzYl9idWYsIDEsCiAJCQk1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigicmVnX3dfMSBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193XzEgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMzg1LDcgKzM4Nyw3IEBACiAJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfd19yaXYgZXJyICVkIiwgcmV0KTsKKwkJcHJfZXJyKCJyZWdfd19yaXYgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCmluZGV4IGQxZDczM2IuLjkwZjA4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKgkJCUNvc3RhbnRpbm8gTGVhbmRybwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAidDYxMyIKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTU3Miw3ICs1NzQsNyBAQAogCiAJCXRtcGJ1ZiA9IGttZW1kdXAoYnVmZmVyLCBsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcGJ1ZikgewotCQkJZXJyKCJPdXQgb2YgbWVtb3J5Iik7CisJCQlwcl9lcnIoIk91dCBvZiBtZW1vcnlcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCXVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKQEAgLTU5OCw3ICs2MDAsNyBAQAogCX0gZWxzZSB7CiAJCXAgPSB0bXBidWYgPSBrbWFsbG9jKGxlbiAqIDIsIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcGJ1ZikgewotCQkJZXJyKCJPdXQgb2YgbWVtb3J5Iik7CisJCQlwcl9lcnIoIk91dCBvZiBtZW1vcnlcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtNjUyLDcgKzY1NCw3IEBACiAJfQogCWJ5dGUgPSByZWdfcihnc3BjYV9kZXYsIDB4MDA2Myk7CiAJaWYgKGJ5dGUgIT0gMHgxNykgewotCQllcnIoIkJhZCBzZW5zb3IgcmVzZXQgJTAyeCIsIGJ5dGUpOworCQlwcl9lcnIoIkJhZCBzZW5zb3IgcmVzZXQgJTAyeFxuIiwgYnl0ZSk7CiAJCS8qIGNvbnRpbnVlPyAqLwogCX0KIApAQCAtODkwLDcgKzg5Miw3IEBACiAJCXNkLT5zZW5zb3IgPSBTRU5TT1JfT002ODAyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnIoInVua25vd24gc2Vuc29yICUwNHgiLCBzZW5zb3JfaWQpOworCQlwcl9lcnIoInVua25vd24gc2Vuc29yICUwNHhcbiIsIHNlbnNvcl9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTA1LDcgKzkwNyw3IEBACiAJCQkJYnJlYWs7CQkvKiBPSyAqLwogCQl9CiAJCWlmIChpIDwgMCkgewotCQkJZXJyKCJCYWQgc2Vuc29yIHJlc2V0ICUwMngiLCB0ZXN0X2J5dGUpOworCQkJcHJfZXJyKCJCYWQgc2Vuc29yIHJlc2V0ICUwMnhcbiIsIHRlc3RfYnl0ZSk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlyZWdfd19idWYoZ3NwY2FfZGV2LCBuMiwgc2l6ZW9mIG4yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdG9wcm8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdG9wcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU5NmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90b3Byby5jCkBAIC0wLDAgKzEsNDk4OSBAQAorLyoKKyAqIFRvcHJvIFRQNjgwMC82ODEwIHdlYmNhbSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEplYW4tRnJhbsOnb2lzIE1vaW5lIChodHRwOi8vbW9pbmVqZi5mcmVlLmZyKQorICogQ29weXJpZ2h0IChDKSAyMDA5IEFuZGVycyBCbG9tZGVsbCAoYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlKQorICogQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBDaGFtcGFnbmUgKGxhZmV1aWxAZ21haWwuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlICJnc3BjYS5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRvcHJvIFRQNjgwMC82ODEwIGdzcGNhIHdlYmNhbSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkplYW4tRnJhbmNvaXMgTW9pbmUgPGh0dHA6Ly9tb2luZWpmLmZyZWUuZnI+LCAiCisJCSJBbmRlcnMgQmxvbWRlbGwgPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBmb3JjZV9zZW5zb3IgPSAtMTsKKworLyogSlBFRyBoZWFkZXIgKi8KK3N0YXRpYyBjb25zdCB1OCBqcGVnX2hlYWRbXSA9IHsKKwkweGZmLCAweGQ4LAkJCS8qIGpwZWcgKi8KKworLyogcXVhbnRpemF0aW9uIHRhYmxlIHF1YWxpdHkgNTAlICovCisJMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwJCS8qIERRVCAqLworMCwKKyNkZWZpbmUgSlBFR19RVDBfT0ZGU0VUIDcKKwkweDEwLCAweDBiLCAweDBjLCAweDBlLCAweDBjLCAweDBhLCAweDEwLCAweDBlLAorCTB4MGQsIDB4MGUsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MTMsIDB4MTgsIDB4MjgsCisJMHgxYSwgMHgxOCwgMHgxNiwgMHgxNiwgMHgxOCwgMHgzMSwgMHgyMywgMHgyNSwKKwkweDFkLCAweDI4LCAweDNhLCAweDMzLCAweDNkLCAweDNjLCAweDM5LCAweDMzLAorCTB4MzgsIDB4MzcsIDB4NDAsIDB4NDgsIDB4NWMsIDB4NGUsIDB4NDAsIDB4NDQsCisJMHg1NywgMHg0NSwgMHgzNywgMHgzOCwgMHg1MCwgMHg2ZCwgMHg1MSwgMHg1NywKKwkweDVmLCAweDYyLCAweDY3LCAweDY4LCAweDY3LCAweDNlLCAweDRkLCAweDcxLAorCTB4NzksIDB4NzAsIDB4NjQsIDB4NzgsIDB4NWMsIDB4NjUsIDB4NjcsIDB4NjMsCisxLAorI2RlZmluZSBKUEVHX1FUMV9PRkZTRVQgNzIKKwkweDExLCAweDEyLCAweDEyLCAweDE4LCAweDE1LCAweDE4LCAweDJmLCAweDFhLAorCTB4MWEsIDB4MmYsIDB4NjMsIDB4NDIsIDB4MzgsIDB4NDIsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisJMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywgMHg2MywKKwkweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCTB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsIDB4NjMsCisKKwkvKiBEZWZpbmUgSHVmZm1hbiB0YWJsZSAodGhhbmtzIHRvIFRob21hcyBLYWlzZXIpICovCisJMHhmZiwgMHhjNCwgMHgwMSwgMHg1ZSwKKwkweDAwLCAweDAwLCAweDAyLCAweDAzLAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwKKwkweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDEwLAorCTB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDQsCisJMHgwNywgMHgwNSwgMHgwNCwgMHgwNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHg1NywKKwkweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDExLCAweDA0LCAweDEyLCAweDIxLAorCTB4MzEsIDB4MTMsIDB4NDEsIDB4NTEsIDB4NjEsIDB4MDUsIDB4MjIsIDB4MzIsCisJMHgxNCwgMHg3MSwgMHg4MSwgMHg5MSwgMHgxNSwgMHgyMywgMHg0MiwgMHg1MiwKKwkweDYyLCAweGExLCAweGIxLCAweDA2LCAweDMzLCAweDcyLCAweGMxLCAweGQxLAorCTB4MjQsIDB4NDMsIDB4NTMsIDB4ODIsIDB4MTYsIDB4MzQsIDB4OTIsIDB4YTIsCisJMHhlMSwgMHhmMSwgMHhmMCwgMHgwNywgMHgwOCwgMHgxNywgMHgxOCwgMHgyNSwKKwkweDI2LCAweDI3LCAweDI4LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDQ0LAorCTB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisJMHg1OCwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg3MywKKwkweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDgzLCAweDg0LCAweDg1LAorCTB4ODYsIDB4ODcsIDB4ODgsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisJMHg5OCwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhiMiwKKwkweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGMyLCAweGMzLAorCTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisJMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwKKwkweGU2LCAweGU3LCAweGU4LCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LAorCTB4ZjcsIDB4ZjgsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LAorCTB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MTEsIDB4MDAsIDB4MDIsCisJMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywgMHgwNCwgMHgwNywgMHgwNSwKKwkweDA0LCAweDA2LCAweDAxLCAweDAwLCAweDAwLCAweDU3LCAweDAwLCAweDAxLAorCTB4MTEsIDB4MDIsIDB4MjEsIDB4MDMsIDB4MTIsIDB4MzEsIDB4NDEsIDB4MTMsCisJMHgyMiwgMHg1MSwgMHg2MSwgMHgwNCwgMHgzMiwgMHg3MSwgMHgwNSwgMHgxNCwKKwkweDIzLCAweDQyLCAweDMzLCAweDUyLCAweDgxLCAweDkxLCAweGExLCAweGIxLAorCTB4ZjAsIDB4MDYsIDB4MTUsIDB4YzEsIDB4ZDEsIDB4ZTEsIDB4MjQsIDB4NDMsCisJMHg2MiwgMHhmMSwgMHgxNiwgMHgyNSwgMHgzNCwgMHg1MywgMHg3MiwgMHg4MiwKKwkweDkyLCAweDA3LCAweDA4LCAweDE3LCAweDE4LCAweDI2LCAweDI3LCAweDI4LAorCTB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisJMHg0OCwgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg2MywgMHg2NCwKKwkweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDczLCAweDc0LCAweDc1LCAweDc2LAorCTB4NzcsIDB4NzgsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsCisJMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHhhMiwgMHhhMywKKwkweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGIyLCAweGIzLCAweGI0LAorCTB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsCisJMHhjNiwgMHhjNywgMHhjOCwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwKKwkweGQ3LCAweGQ4LCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LAorCTB4ZTgsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisJMHhmZiwgMHhjMCwgMHgwMCwgMHgxMSwJCS8qIFNPRjAgKHN0YXJ0IG9mIGZyYW1lIDAgKi8KKwkweDA4LAkJCQkvKiBkYXRhIHByZWNpc2lvbiAqLworI2RlZmluZSBKUEVHX0hFSUdIVF9PRkZTRVQgNDkzCisJMHgwMSwgMHhlMCwJCQkvKiBoZWlnaHQgKi8KKwkweDAyLCAweDgwLAkJCS8qIHdpZHRoICovCisJMHgwMywJCQkJLyogY29tcG9uZW50IG51bWJlciAqLworCQkweDAxLAorCQkJMHgyMSwJCS8qIHNhbXBsZXMgWSA9IGpwZWcgNDIyICovCisJCQkweDAwLAkJLyogcXVhbnQgWSAqLworCQkweDAyLCAweDExLCAweDAxLAkvKiBzYW1wbGVzIENiQ3IgLSBxdWFudCBDYkNyICovCisJCTB4MDMsIDB4MTEsIDB4MDEsCisKKwkweGZmLCAweGRhLCAweDAwLCAweDBjLAkJLyogU09TIChzdGFydCBvZiBzY2FuKSAqLworCTB4MDMsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MTEsIDB4MDMsIDB4MTEsIDB4MDAsIDB4M2YsIDB4MDAKKyNkZWZpbmUgSlBFR19IRFJfU1ogNTIxCit9OworCitlbnVtIGVfY3RybCB7CisJRVhQT1NVUkUsCisJUVVBTElUWSwKKwlTSEFSUE5FU1MsCisJUkdBSU4sCisJR0FJTiwKKwlCR0FJTiwKKwlHQU1NQSwKKwlBVVRPR0FJTiwKKwlOQ1RSTFMJCS8qIG51bWJlciBvZiBjb250cm9scyAqLworfTsKKworI2RlZmluZSBBVVRPR0FJTl9ERUYgMQorCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisKKwlzdHJ1Y3QgZ3NwY2FfY3RybCBjdHJsc1tOQ1RSTFNdOworCisJdTggZnJhbWVyYXRlOworCXU4IHF1YWxpdHk7CQkvKiB3ZWJjYW0gY3VycmVudCBKUEVHIHF1YWxpdHkgKDAuLjE2KSAqLworCXM4IGFnX2NudDsJCS8qIGF1dG9nYWluIC8gc3RhcnQgY291bnRlciBmb3IgdHA2ODEwICovCisjZGVmaW5lIEFHX0NOVF9TVEFSVCAxMwkJLyogY2hlY2sgZ2FpbiBldmVyeSBOIGZyYW1lcyAqLworCisJdTggYnJpZGdlOworCXU4IHNlbnNvcjsKKworCXU4IGpwZWdfaGRyW0pQRUdfSERSX1NaXTsKK307CisKK2VudW0gYnJpZGdlcyB7CisJQlJJREdFX1RQNjgwMCwKKwlCUklER0VfVFA2ODEwLAorfTsKKworZW51bSBzZW5zb3JzIHsKKwlTRU5TT1JfQ1gwMzQyLAorCVNFTlNPUl9TT0k3NjNBLAkJLyogfj0gb3Y3NjMwIC8gb3Y3NjQ4ICovCisJTlNFTlNPUlMKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7CisJezMyMCwgMjQwLCBWNEwyX1BJWF9GTVRfSlBFRywgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMzIwLAorCQkuc2l6ZWltYWdlID0gMzIwICogMjQwICogNCAvIDggKyA1OTAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAorCXs2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX0pQRUcsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCAqIDMgLyA4ICsgNTkwLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHfQorfTsKKworLyoKKyAqIEpQRUcgcXVhbGl0eQorICogaW5kZXg6IHdlYmNhbSBjb21wcmVzc2lvbgorICogdmFsdWU6IEpQRUcgcXVhbGl0eSBpbiAlCisgKi8KK3N0YXRpYyBjb25zdCB1OCBqcGVnX3FbMTddID0geworCTg4LCA3NywgNjcsIDU3LCA1NSwgNTUsIDQ1LCA0NSwgMzYsIDM2LCAzMCwgMzAsIDI2LCAyNiwgMjIsIDIyLCA5NAorfTsKKworI2RlZmluZSBCVUxLX09VVF9TSVpFCQkweDIwCisjaWYgQlVMS19PVVRfU0laRSA+IFVTQl9CVUZfU1oKKyNlcnJvciAiVVNCIGJ1ZmZlciB0b28gc21hbGwiCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHU4IHJhdGVzW10gPSB7MzAsIDIwLCAxNSwgMTAsIDcsIDV9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmFtZXJhdGVzIGZyYW1lcmF0ZXNbXSA9IHsKKwl7CisJCS5yYXRlcyA9IHJhdGVzLAorCQkubnJhdGVzID0gQVJSQVlfU0laRShyYXRlcykKKwl9LAorCXsKKwkJLnJhdGVzID0gcmF0ZXMsCisJCS5ucmF0ZXMgPSBBUlJBWV9TSVpFKHJhdGVzKQorCX0KK307CitzdGF0aWMgY29uc3QgdTggcmF0ZXNfNjgxMFtdID0gezMwLCAxNSwgMTAsIDcsIDV9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmFtZXJhdGVzIGZyYW1lcmF0ZXNfNjgxMFtdID0geworCXsKKwkJLnJhdGVzID0gcmF0ZXNfNjgxMCwKKwkJLm5yYXRlcyA9IEFSUkFZX1NJWkUocmF0ZXNfNjgxMCkKKwl9LAorCXsKKwkJLnJhdGVzID0gcmF0ZXNfNjgxMCwKKwkJLm5yYXRlcyA9IEFSUkFZX1NJWkUocmF0ZXNfNjgxMCkKKwl9Cit9OworCisvKgorICogd2ViY2FtIHF1YWxpdHkgaW4gJQorICogdGhlIGxhc3QgdmFsdWUgaXMgdGhlIHVsdHJhIGZpbmUgcXVhbGl0eQorICovCisKKy8qIFRQNjgwMCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFRQNjgwMF9SMTBfU0lGX1RZUEUJCTB4MTAKKyNkZWZpbmUgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTAkJMHgxMQorI2RlZmluZSBUUDY4MDBfUjEyX1NJRl9BRERSX1MJCTB4MTIKKyNkZWZpbmUgVFA2ODAwX1IxM19TSUZfVFhfREFUQQkJMHgxMworI2RlZmluZSBUUDY4MDBfUjE0X1NJRl9SWF9EQVRBCQkweDE0CisjZGVmaW5lIFRQNjgwMF9SMTVfR1BJT19QVQkJMHgxNQorI2RlZmluZSBUUDY4MDBfUjE2X0dQSU9fUEQJCTB4MTYKKyNkZWZpbmUgVFA2ODAwX1IxN19HUElPX0lPCQkweDE3CisjZGVmaW5lIFRQNjgwMF9SMThfR1BJT19EQVRBCQkweDE4CisjZGVmaW5lIFRQNjgwMF9SMTlfU0lGX0FERFJfUzIJCTB4MTkKKyNkZWZpbmUgVFA2ODAwX1IxQV9TSUZfVFhfREFUQTIJCTB4MWEKKyNkZWZpbmUgVFA2ODAwX1IxQl9TSUZfUlhfREFUQTIJCTB4MWIKKyNkZWZpbmUgVFA2ODAwX1IyMV9FTkRQXzFfQ1RMCQkweDIxCisjZGVmaW5lIFRQNjgwMF9SMkZfVElNSU5HX0NGRwkJMHgyZgorI2RlZmluZSBUUDY4MDBfUjMwX1NFTlNPUl9DRkcJCTB4MzAKKyNkZWZpbmUgVFA2ODAwX1IzMV9QSVhFTF9TVEFSVAkJMHgzMQorI2RlZmluZSBUUDY4MDBfUjMyX1BJWEVMX0VORF9MCQkweDMyCisjZGVmaW5lIFRQNjgwMF9SMzNfUElYRUxfRU5EX0gJCTB4MzMKKyNkZWZpbmUgVFA2ODAwX1IzNF9MSU5FX1NUQVJUCQkweDM0CisjZGVmaW5lIFRQNjgwMF9SMzVfTElORV9FTkRfTAkJMHgzNQorI2RlZmluZSBUUDY4MDBfUjM2X0xJTkVfRU5EX0gJCTB4MzYKKyNkZWZpbmUgVFA2ODAwX1IzN19GUk9OVF9EQVJLX1NUCTB4MzcKKyNkZWZpbmUgVFA2ODAwX1IzOF9GUk9OVF9EQVJLX0VORAkweDM4CisjZGVmaW5lIFRQNjgwMF9SMzlfUkVBUl9EQVJLX1NUX0wJMHgzOQorI2RlZmluZSBUUDY4MDBfUjNBX1JFQVJfREFSS19TVF9ICTB4M2EKKyNkZWZpbmUgVFA2ODAwX1IzQl9SRUFSX0RBUktfRU5EX0wJMHgzYgorI2RlZmluZSBUUDY4MDBfUjNDX1JFQVJfREFSS19FTkRfSAkweDNjCisjZGVmaW5lIFRQNjgwMF9SM0RfSE9SSVpfREFSS19MSU5FX0wJMHgzZAorI2RlZmluZSBUUDY4MDBfUjNFX0hPUklaX0RBUktfTElORV9ICTB4M2UKKyNkZWZpbmUgVFA2ODAwX1IzRl9GUkFNRV9SQVRFCQkweDNmCisjZGVmaW5lIFRQNjgwMF9SNTAJCQkweDUwCisjZGVmaW5lIFRQNjgwMF9SNTEJCQkweDUxCisjZGVmaW5lIFRQNjgwMF9SNTIJCQkweDUyCisjZGVmaW5lIFRQNjgwMF9SNTMJCQkweDUzCisjZGVmaW5lIFRQNjgwMF9SNTRfREFSS19DRkcJCTB4NTQKKyNkZWZpbmUgVFA2ODAwX1I1NV9HQU1NQV9SCQkweDU1CisjZGVmaW5lIFRQNjgwMF9SNTZfR0FNTUFfRwkJMHg1NgorI2RlZmluZSBUUDY4MDBfUjU3X0dBTU1BX0IJCTB4NTcKKyNkZWZpbmUgVFA2ODAwX1I1Q19FREdFX1RIUkxECQkweDVjCisjZGVmaW5lIFRQNjgwMF9SNURfREVNT1NBSUNfQ0ZHCQkweDVkCisjZGVmaW5lIFRQNjgwMF9SNzhfRk9STUFUCQkweDc4CisjZGVmaW5lIFRQNjgwMF9SNzlfUVVBTElUWQkJMHg3OQorI2RlZmluZSBUUDY4MDBfUjdBX0JMS19USFJMRAkJMHg3YQorCisvKiBDWDAzNDIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCisjZGVmaW5lIENYMDM0Ml9TRU5TT1JfSUQJCTB4MDAKKyNkZWZpbmUgQ1gwMzQyX1ZFUlNJT05fTk8JCTB4MDEKKyNkZWZpbmUgQ1gwMzQyX09SR19YX0wJCQkweDAyCisjZGVmaW5lIENYMDM0Ml9PUkdfWF9ICQkJMHgwMworI2RlZmluZSBDWDAzNDJfT1JHX1lfTAkJCTB4MDQKKyNkZWZpbmUgQ1gwMzQyX09SR19ZX0gJCQkweDA1CisjZGVmaW5lIENYMDM0Ml9TVE9QX1hfTAkJCTB4MDYKKyNkZWZpbmUgQ1gwMzQyX1NUT1BfWF9ICQkJMHgwNworI2RlZmluZSBDWDAzNDJfU1RPUF9ZX0wJCQkweDA4CisjZGVmaW5lIENYMDM0Ml9TVE9QX1lfSAkJCTB4MDkKKyNkZWZpbmUgQ1gwMzQyX0ZSQU1FX1dJRFRIX0wJCTB4MGEKKyNkZWZpbmUgQ1gwMzQyX0ZSQU1FX1dJRFRIX0gJCTB4MGIKKyNkZWZpbmUgQ1gwMzQyX0ZSQU1FX0hFSUdIX0wJCTB4MGMKKyNkZWZpbmUgQ1gwMzQyX0ZSQU1FX0hFSUdIX0gJCTB4MGQKKyNkZWZpbmUgQ1gwMzQyX0VYUE9fTElORV9MCQkweDEwCisjZGVmaW5lIENYMDM0Ml9FWFBPX0xJTkVfSAkJMHgxMQorI2RlZmluZSBDWDAzNDJfRVhQT19DTEtfTAkJMHgxMgorI2RlZmluZSBDWDAzNDJfRVhQT19DTEtfSAkJMHgxMworI2RlZmluZSBDWDAzNDJfUkFXX0dSR0FJTl9MCQkweDE0CisjZGVmaW5lIENYMDM0Ml9SQVdfR1JHQUlOX0gJCTB4MTUKKyNkZWZpbmUgQ1gwMzQyX1JBV19HQkdBSU5fTAkJMHgxNgorI2RlZmluZSBDWDAzNDJfUkFXX0dCR0FJTl9ICQkweDE3CisjZGVmaW5lIENYMDM0Ml9SQVdfUkdBSU5fTAkJMHgxOAorI2RlZmluZSBDWDAzNDJfUkFXX1JHQUlOX0gJCTB4MTkKKyNkZWZpbmUgQ1gwMzQyX1JBV19CR0FJTl9MCQkweDFhCisjZGVmaW5lIENYMDM0Ml9SQVdfQkdBSU5fSAkJMHgxYgorI2RlZmluZSBDWDAzNDJfR0xPQkFMX0dBSU4JCTB4MWMKKyNkZWZpbmUgQ1gwMzQyX1NZU19DVFJMXzAJCTB4MjAKKyNkZWZpbmUgQ1gwMzQyX1NZU19DVFJMXzEJCTB4MjEKKyNkZWZpbmUgQ1gwMzQyX1NZU19DVFJMXzIJCTB4MjIKKyNkZWZpbmUgQ1gwMzQyX0JZUEFTU19NT0RFCQkweDIzCisjZGVmaW5lIENYMDM0Ml9TWVNfQ1RSTF8zCQkweDI0CisjZGVmaW5lIENYMDM0Ml9USU1JTkdfRU4JCTB4MjUKKyNkZWZpbmUgQ1gwMzQyX09VVFBVVF9DVFJMCQkweDI2CisjZGVmaW5lIENYMDM0Ml9BVVRPX0FEQ19DQUxJQgkJMHgyNworI2RlZmluZSBDWDAzNDJfU1lTX0NUUkxfNAkJMHgyOAorI2RlZmluZSBDWDAzNDJfQURDR04JCQkweDMwCisjZGVmaW5lIENYMDM0Ml9TTFBDUgkJCTB4MzEKKyNkZWZpbmUgQ1gwMzQyX1NMUEZOX0xPCQkJMHgzMgorI2RlZmluZSBDWDAzNDJfQURDX0NUTAkJCTB4MzMKKyNkZWZpbmUgQ1gwMzQyX0xWUlNUX0JMQklBUwkJMHgzNAorI2RlZmluZSBDWDAzNDJfVlRIU0VMCQkJMHgzNQorI2RlZmluZSBDWDAzNDJfUkFNUF9SSVYJCQkweDM2CisjZGVmaW5lIENYMDM0Ml9MRE9TRUwJCQkweDM3CisjZGVmaW5lIENYMDM0Ml9DTE9DS19HRU4JCTB4NDAKKyNkZWZpbmUgQ1gwMzQyX1NPRlRfUkVTRVQJCTB4NDEKKyNkZWZpbmUgQ1gwMzQyX1BMTAkJCTB4NDIKKyNkZWZpbmUgQ1gwMzQyX0RSX0VOSF9QVUxTRV9PRkZTRVRfTAkweDQzCisjZGVmaW5lIENYMDM0Ml9EUl9FTkhfUFVMU0VfT0ZGU0VUX0gJMHg0NAorI2RlZmluZSBDWDAzNDJfRFJfRU5IX1BVTFNFX1BPU19MCTB4NDUKKyNkZWZpbmUgQ1gwMzQyX0RSX0VOSF9QVUxTRV9QT1NfSAkweDQ2CisjZGVmaW5lIENYMDM0Ml9EUl9FTkhfUFVMU0VfV0lEVEgJMHg0NworI2RlZmluZSBDWDAzNDJfQVNfQ1VSUkVOVF9DTlRfTAkJMHg0OAorI2RlZmluZSBDWDAzNDJfQVNfQ1VSUkVOVF9DTlRfSAkJMHg0OQorI2RlZmluZSBDWDAzNDJfQVNfUFJFVklPVVNfQ05UX0wJMHg0YQorI2RlZmluZSBDWDAzNDJfQVNfUFJFVklPVVNfQ05UX0gJMHg0YgorI2RlZmluZSBDWDAzNDJfU1BWX1ZBTFVFX0wJCTB4NGMKKyNkZWZpbmUgQ1gwMzQyX1NQVl9WQUxVRV9ICQkweDRkCisjZGVmaW5lIENYMDM0Ml9HUFhMVEhEX0wJCTB4NTAKKyNkZWZpbmUgQ1gwMzQyX0dQWExUSERfSAkJMHg1MQorI2RlZmluZSBDWDAzNDJfUkJQWExUSERfTAkJMHg1MgorI2RlZmluZSBDWDAzNDJfUkJQWExUSERfSAkJMHg1MworI2RlZmluZSBDWDAzNDJfUExBTkVUSERfTAkJMHg1NAorI2RlZmluZSBDWDAzNDJfUExBTkVUSERfSAkJMHg1NQorI2RlZmluZSBDWDAzNDJfUk9XREFSS19USAkJMHg1NgorI2RlZmluZSBDWDAzNDJfUk9XREFSS19UT0wJCTB4NTcKKyNkZWZpbmUgQ1gwMzQyX1JCX0dBUF9MCQkJMHg1OAorI2RlZmluZSBDWDAzNDJfUkJfR0FQX0gJCQkweDU5CisjZGVmaW5lIENYMDM0Ml9HX0dBUF9MCQkJMHg1YQorI2RlZmluZSBDWDAzNDJfR19HQVBfSAkJCTB4NWIKKyNkZWZpbmUgQ1gwMzQyX0FVVE9fUk9XX0RBUksJCTB4NjAKKyNkZWZpbmUgQ1gwMzQyX01BTlVBTF9EQVJLX1ZBTFVFCTB4NjEKKyNkZWZpbmUgQ1gwMzQyX0dCX0RBUktfT0ZGU0VUCQkweDYyCisjZGVmaW5lIENYMDM0Ml9HUl9EQVJLX09GRlNFVAkJMHg2MworI2RlZmluZSBDWDAzNDJfUkVEX0RBUktfT0ZGU0VUCQkweDY0CisjZGVmaW5lIENYMDM0Ml9CTFVFX0RBUktfT0ZGU0VUCQkweDY1CisjZGVmaW5lIENYMDM0Ml9EQVRBX1NDQUxJTkdfTVVMVEkJMHg2NgorI2RlZmluZSBDWDAzNDJfQVVUT0RfUV9GUkFNRQkJMHg2NworI2RlZmluZSBDWDAzNDJfQVVUT0RfQUxMT1dfVkFSSQkJMHg2OAorI2RlZmluZSBDWDAzNDJfQVVUT19EQVJLX1ZBTFVFX0wJMHg2OQorI2RlZmluZSBDWDAzNDJfQVVUT19EQVJLX1ZBTFVFX0gJMHg2YQorI2RlZmluZSBDWDAzNDJfSU9fQ1RSTF8wCQkweDcwCisjZGVmaW5lIENYMDM0Ml9JT19DVFJMXzEJCTB4NzEKKyNkZWZpbmUgQ1gwMzQyX0lPX0NUUkxfMgkJMHg3MgorI2RlZmluZSBDWDAzNDJfSURMRV9DVFJMCQkweDczCisjZGVmaW5lIENYMDM0Ml9URVNUX01PREUJCTB4NzQKKyNkZWZpbmUgQ1gwMzQyX0ZSQU1FX0ZJWF9EQVRBX1RFU1QJMHg3NQorI2RlZmluZSBDWDAzNDJfRlJBTUVfQ05UX1RFU1QJCTB4NzYKKyNkZWZpbmUgQ1gwMzQyX1JTVF9PVkVSRkxPV19MCQkweDgwCisjZGVmaW5lIENYMDM0Ml9SU1RfT1ZFUkZMT1dfSAkJMHg4MQorI2RlZmluZSBDWDAzNDJfUlNUX1VOREVSRkxPV19MCQkweDgyCisjZGVmaW5lIENYMDM0Ml9SU1RfVU5ERVJGTE9XX0gJCTB4ODMKKyNkZWZpbmUgQ1gwMzQyX0RBVEFfT1ZFUkZMT1dfTAkJMHg4NAorI2RlZmluZSBDWDAzNDJfREFUQV9PVkVSRkxPV19ICQkweDg1CisjZGVmaW5lIENYMDM0Ml9EQVRBX1VOREVSRkxPV19MCQkweDg2CisjZGVmaW5lIENYMDM0Ml9EQVRBX1VOREVSRkxPV19ICQkweDg3CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfMF9MX2lyc3QJMHg5MAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzBfSF9pcnN0CTB4OTEKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF8xX0xfaXJzdAkweDkyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfMV9IX2lyc3QJMHg5MworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzJfTF9pcnN0CTB4OTQKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF8yX0hfaXJzdAkweDk1CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfM19MX2lyc3QJMHg5NgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzNfSF9pcnN0CTB4OTcKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF80X0xfaXJzdAkweDk4CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfNF9IX2lyc3QJMHg5OQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzVfTF9pcnN0CTB4OWEKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF81X0hfaXJzdAkweDliCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfNl9MX2lyc3QJMHg5YworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8wXzZfSF9pcnN0CTB4OWQKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfMF83X0xfaXJzdAkweDllCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzBfN19IX2lyc3QJMHg5ZgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzBfTF9pdHgJMHhhMAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzBfSF9pdHgJMHhhMQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzFfTF9pdHgJMHhhMgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzFfSF9pdHgJMHhhMworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzJfTF9pdHgJMHhhNAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzJfSF9pdHgJMHhhNQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzNfTF9pdHgJMHhhNgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzNfSF9pdHgJMHhhNworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzRfTF9pdHgJMHhhOAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzRfSF9pdHgJMHhhOQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzVfTF9pdHgJMHhhYQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzVfSF9pdHgJMHhhYgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzZfTF9pdHgJMHhhYworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzZfSF9pdHgJMHhhZAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzdfTF9pdHgJMHhhZQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8xXzdfSF9pdHgJMHhhZgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzBfTF9pd2wJMHhiMAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzBfSF9pd2wJMHhiMQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzFfTF9pd2wJMHhiMgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzFfSF9pd2wJMHhiMworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzJfTF9pd2wJMHhiNAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzJfSF9pd2wJMHhiNQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzNfTF9pd2wJMHhiNgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzNfSF9pd2wJMHhiNworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzRfTF9pd2wJMHhiOAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzRfSF9pd2wJMHhiOQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzVfTF9pd2wJMHhiYQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzVfSF9pd2wJMHhiYgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzZfTF9pd2wJMHhiYworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzZfSF9pd2wJMHhiZAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzdfTF9pd2wJMHhiZQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8yXzdfSF9pd2wJMHhiZgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzBfTF9lbnNwCTB4YzAKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM18wX0hfZW5zcAkweGMxCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfMV9MX2Vuc3AJMHhjMgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzFfSF9lbnNwCTB4YzMKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM18yX0xfZW5zcAkweGM0CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfMl9IX2Vuc3AJMHhjNQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzNfTF9lbnNwCTB4YzYKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM18zX0hfZW5zcAkweGM3CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfNF9MX2Vuc3AJMHhjOAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzRfSF9lbnNwCTB4YzkKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM181X0xfZW5zcAkweGNhCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfNV9IX2Vuc3AJMHhjYgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzZfTF9lbnNwCTB4Y2MKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfM182X0hfZW5zcAkweGNkCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzNfN19MX2Vuc3AJMHhjZQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF8zXzdfSF9lbnNwCTB4Y2YKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNF8wX0xfc2VsYQkweGQwCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzRfMF9IX3NlbGEJMHhkMQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF80XzFfTF9zZWxhCTB4ZDIKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNF8xX0hfc2VsYQkweGQzCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzVfMF9MX2ludGxhCTB4ZTAKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8wX0hfaW50bGEJMHhlMQorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF81XzFfTF9pbnRsYQkweGUyCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzVfMV9IX2ludGxhCTB4ZTMKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8yX0xfaW50bGEJMHhlNAorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF81XzJfSF9pbnRsYQkweGU1CisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzVfM19MX2ludGxhCTB4ZTYKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNV8zX0hfaW50bGEJMHhlNworI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF82XzBfTF94YV9zZWxfcG9zIDB4ZjAKKyNkZWZpbmUgQ1gwMzQyX0NIQU5ORUxfNl8wX0hfeGFfc2VsX3BvcyAweGYxCisjZGVmaW5lIENYMDM0Ml9DSEFOTkVMXzdfMV9MX2Nkc19wb3MJMHhmMgorI2RlZmluZSBDWDAzNDJfQ0hBTk5FTF83XzFfSF9jZHNfcG9zCTB4ZjMKKyNkZWZpbmUgQ1gwMzQyX1NFTlNPUl9IRUlHSFRfTAkJMHhmYgorI2RlZmluZSBDWDAzNDJfU0VOU09SX0hFSUdIVF9ICQkweGZjCisjZGVmaW5lIENYMDM0Ml9TRU5TT1JfV0lEVEhfTAkJMHhmZAorI2RlZmluZSBDWDAzNDJfU0VOU09SX1dJRFRIX0gJCTB4ZmUKKyNkZWZpbmUgQ1gwMzQyX1ZTWU5DX0hTWU5DX1JFQUQJCTB4ZmYKKworc3RydWN0IGNtZCB7CisJdTggcmVnOworCXU4IHZhbDsKK307CisKK3N0YXRpYyBjb25zdCB1OCBEUVRbMTddWzEzMF0gPSB7CisJLyogRGVmaW5lIHF1YW50aXphdGlvbiB0YWJsZSAodGhhbmtzIHRvIFRob21hcyBLYWlzZXIpICovCisJewkJCS8qIFF1YWxpdHkgMCAqLworCSAweDAwLAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDAxLAorCSAweDA0LCAweDA0LCAweDA0LCAweDA2LCAweDA1LCAweDA2LCAweDBiLCAweDA2LAorCSAweDA2LCAweDBiLCAweDE4LCAweDEwLCAweDBlLCAweDEwLCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDEgKi8KKwkgMHgwMCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkgMHgwNCwgMHgwNCwgMHgwNCwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwKKwkgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwKKwkgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwKKwkgMHgwMSwKKwkgMHgwOCwgMHgwOSwgMHgwOSwgMHgwYywgMHgwYSwgMHgwYywgMHgxNywgMHgwZCwKKwkgMHgwZCwgMHgxNywgMHgzMSwgMHgyMSwgMHgxYywgMHgyMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAyICovCisJIDB4MDAsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsCisJIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsCisJIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsCisJIDB4MDYsIDB4MDYsIDB4MDYsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MDEsCisJIDB4MGMsIDB4MGQsIDB4MGQsIDB4MTIsIDB4MGYsIDB4MTIsIDB4MjMsIDB4MTMsCisJIDB4MTMsIDB4MjMsIDB4NGEsIDB4MzEsIDB4MmEsIDB4MzEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsIDB4NGEsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMyAqLworCSAweDAwLAorCSAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA0LCAweDA4LCAweDA4LCAweDA4LCAweDA0LCAweDA0LCAweDA0LAorCSAweDA0LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCSAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCSAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCSAweDA4LCAweDA4LCAweDA4LCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorCSAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorCSAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLCAweDEzLAorCSAweDAxLAorCSAweDExLCAweDEyLCAweDEyLCAweDE4LCAweDE1LCAweDE4LCAweDJmLCAweDFhLAorCSAweDFhLCAweDJmLCAweDYzLCAweDQyLCAweDM4LCAweDQyLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDQgKi8KKwkgMHgwMCwKKwkgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwKKwkgMHgwNSwgMHgwNSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwNSwgMHgwNSwgMHgwNSwKKwkgMHgwNSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKwkgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKwkgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwKKwkgMHgwYSwgMHgwYSwgMHgwYSwgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkgMHgwMSwKKwkgMHgxMSwgMHgxNiwgMHgxNiwgMHgxZSwgMHgxYSwgMHgxZSwgMHgzYSwgMHgyMCwKKwkgMHgyMCwgMHgzYSwgMHg3YiwgMHg1MiwgMHg0NiwgMHg1MiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSA1ICovCisJIDB4MDAsCisJIDB4MDQsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsCisJIDB4MDYsIDB4MDYsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MDYsIDB4MDYsIDB4MDYsCisJIDB4MDYsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsCisJIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsCisJIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsCisJIDB4MGMsIDB4MGMsIDB4MGMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MDEsCisJIDB4MTEsIDB4MWIsIDB4MWIsIDB4MjQsIDB4MWYsIDB4MjQsIDB4NDYsIDB4MjcsCisJIDB4MjcsIDB4NDYsIDB4OTQsIDB4NjMsIDB4NTQsIDB4NjMsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgNiAqLworCSAweDAwLAorCSAweDA1LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCSAweDA3LCAweDA3LCAweDBlLCAweDBlLCAweDBlLCAweDA3LCAweDA3LCAweDA3LAorCSAweDA3LCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLAorCSAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLAorCSAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLCAweDBlLAorCSAweDBlLCAweDBlLCAweDBlLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLAorCSAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLAorCSAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLAorCSAweDAxLAorCSAweDE1LCAweDFmLCAweDFmLCAweDJhLCAweDI0LCAweDJhLCAweDUyLCAweDJkLAorCSAweDJkLCAweDUyLCAweGFkLCAweDczLCAweDYyLCAweDczLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDcgKi8KKwkgMHgwMCwKKwkgMHgwNSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKwkgMHgwOCwgMHgwOCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgwOCwgMHgwOCwgMHgwOCwKKwkgMHgwOCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgxMCwgMHgxMCwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwKKwkgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwKKwkgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwgMHgyNiwKKwkgMHgwMSwKKwkgMHgxNSwgMHgyNCwgMHgyNCwgMHgzMCwgMHgyYSwgMHgzMCwgMHg1ZSwgMHgzNCwKKwkgMHgzNCwgMHg1ZSwgMHhjNiwgMHg4NCwgMHg3MCwgMHg4NCwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSA4ICovCisJIDB4MDAsCisJIDB4MDYsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsCisJIDB4MGEsIDB4MGEsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MGEsIDB4MGEsIDB4MGEsCisJIDB4MGEsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsCisJIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsCisJIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsCisJIDB4MDEsCisJIDB4MTksIDB4MmQsIDB4MmQsIDB4M2MsIDB4MzQsIDB4M2MsIDB4NzUsIDB4NDEsCisJIDB4NDEsIDB4NzUsIDB4ZjcsIDB4YTUsIDB4OGMsIDB4YTUsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgOSAqLworCSAweDAwLAorCSAweDA2LCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLAorCSAweDBjLCAweDBjLCAweDE4LCAweDE4LCAweDE4LCAweDBjLCAweDBjLCAweDBjLAorCSAweDBjLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorCSAweDE4LCAweDE4LCAweDE4LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LAorCSAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LAorCSAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LCAweDM5LAorCSAweDAxLAorCSAweDE5LCAweDM2LCAweDM2LCAweDQ4LCAweDNmLCAweDQ4LCAweDhkLCAweDRlLAorCSAweDRlLCAweDhkLCAweGZmLCAweGM2LCAweGE4LCAweGM2LCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDEwICovCisJIDB4MDAsCisJIDB4MDcsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MGUsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MGUsIDB4MGUsIDB4MGUsCisJIDB4MGUsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsIDB4MWMsCisJIDB4MWMsIDB4MWMsIDB4MWMsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsCisJIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsCisJIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDIsCisJIDB4MDEsCisJIDB4MWQsIDB4M2YsIDB4M2YsIDB4NTQsIDB4NDksIDB4NTQsIDB4YTQsIDB4NWIsCisJIDB4NWIsIDB4YTQsIDB4ZmYsIDB4ZTcsIDB4YzQsIDB4ZTcsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMTEgKi8KKwkgMHgwMCwKKwkgMHgwNywgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkgMHgxMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkgMHgyMCwgMHgyMCwgMHgyMCwgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywKKwkgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywKKwkgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywgMHg0YywKKwkgMHgwMSwKKwkgMHgxZCwgMHg0OCwgMHg0OCwgMHg2MCwgMHg1NCwgMHg2MCwgMHhiYywgMHg2OCwKKwkgMHg2OCwgMHhiYywgMHhmZiwgMHhmZiwgMHhlMCwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAxMiAqLworCSAweDAwLAorCSAweDA4LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDI4LCAweDI4LCAweDI4LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LAorCSAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LAorCSAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LAorCSAweDI4LCAweDI4LCAweDI4LCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLAorCSAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLAorCSAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLCAweDVmLAorCSAweDAxLAorCSAweDIyLCAweDVhLCAweDVhLCAweDc4LCAweDY5LCAweDc4LCAweGViLCAweDgyLAorCSAweDgyLCAweGViLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDEzICovCisJIDB4MDAsCisJIDB4MDgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MTgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MTgsIDB4MTgsIDB4MTgsCisJIDB4MTgsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsCisJIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsCisJIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsCisJIDB4MzAsIDB4MzAsIDB4MzAsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsCisJIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsCisJIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsIDB4NzIsCisJIDB4MDEsCisJIDB4MjIsIDB4NmMsIDB4NmMsIDB4OTAsIDB4N2UsIDB4OTAsIDB4ZmYsIDB4OWMsCisJIDB4OWMsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJIH0sCisJewkJCS8qIFF1YWxpdHkgMTQgKi8KKwkgMHgwMCwKKwkgMHgwYSwgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgxYywgMHgzOCwgMHgzOCwgMHgzOCwgMHgxYywgMHgxYywgMHgxYywKKwkgMHgxYywgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwKKwkgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwKKwkgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwKKwkgMHgzOCwgMHgzOCwgMHgzOCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwKKwkgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwKKwkgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwKKwkgMHgwMSwKKwkgMHgyYSwgMHg3ZSwgMHg3ZSwgMHhhOCwgMHg5MywgMHhhOCwgMHhmZiwgMHhiNiwKKwkgMHhiNiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkgfSwKKwl7CQkJLyogUXVhbGl0eSAxNSAqLworCSAweDAwLAorCSAweDBhLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDQwLCAweDQwLCAweDQwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLAorCSAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLAorCSAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLAorCSAweDQwLCAweDQwLCAweDQwLCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LAorCSAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LAorCSAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk4LAorCSAweDAxLAorCSAweDJhLCAweDkwLCAweDkwLCAweGMwLCAweGE4LCAweGMwLCAweGZmLCAweGQwLAorCSAweGQwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCSB9LAorCXsJCQkvKiBRdWFsaXR5IDE2LTMxICovCisJIDB4MDAsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDEsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsCisJIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHRwNjgxMF9jeF9pbml0X2NvbW1vbltdID0geworCXsweDFjLCAweDAwfSwKKwl7VFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwMH0sCisJezB4NGUsIDB4MDB9LAorCXsweDRmLCAweDAwfSwKKwl7VFA2ODAwX1I1MCwgMHhmZn0sCisJe1RQNjgwMF9SNTEsIDB4MDN9LAorCXsweDAwLCAweDA3fSwKKwl7VFA2ODAwX1I3OV9RVUFMSVRZLCAweDAzfSwKKwl7VFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDM3fSwKKwl7VFA2ODAwX1IzMF9TRU5TT1JfQ0ZHLCAweDEwfSwKKwl7VFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAwfSwKKwl7VFA2ODAwX1I1MiwgMHg0MH0sCisJe1RQNjgwMF9SNTMsIDB4NDB9LAorCXtUUDY4MDBfUjU0X0RBUktfQ0ZHLCAweDQwfSwKKwl7VFA2ODAwX1IzMF9TRU5TT1JfQ0ZHLCAweDE4fSwKKwl7MHg0YiwgMHgwMH0sCisJe1RQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHg4M30sCisJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwNX0sCisJe1RQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMH0sCisJezB4N2MsIDB4MDR9LAorCXsweDI1LCAweDE0fSwKKwl7MHgyNiwgMHgwZn0sCisJezB4N2IsIDB4MTB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgdHA2ODEwX292X2luaXRfY29tbW9uW10gPSB7CisJezB4MWMsIDB4MDB9LAorCXtUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDAwfSwKKwl7MHg0ZSwgMHgwMH0sCisJezB4NGYsIDB4MDB9LAorCXtUUDY4MDBfUjUwLCAweGZmfSwKKwl7VFA2ODAwX1I1MSwgMHgwM30sCisJezB4MDAsIDB4MDd9LAorCXtUUDY4MDBfUjUyLCAweDQwfSwKKwl7VFA2ODAwX1I1MywgMHg0MH0sCisJe1RQNjgwMF9SNTRfREFSS19DRkcsIDB4NDB9LAorCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDN9LAorCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MTd9LAorCXtUUDY4MDBfUjMwX1NFTlNPUl9DRkcsIDB4MTh9LAorCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDB9LAorCXtUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4ODZ9LAorCXsweDI1LCAweDE4fSwKKwl7MHgyNiwgMHgwZn0sCisJezB4N2IsIDB4OTB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgdHA2ODEwX2JyaWRnZV9zdGFydFtdID0geworCXsweDU5LCAweDg4fSwKKwl7MHg1YSwgMHgwZn0sCisJezB4NWIsIDB4NGV9LAorCXtUUDY4MDBfUjVDX0VER0VfVEhSTEQsIDB4NjN9LAorCXtUUDY4MDBfUjVEX0RFTU9TQUlDX0NGRywgMHgwMH0sCisJezB4MDMsIDB4N2Z9LAorCXsweDA0LCAweDgwfSwKKwl7MHgwNiwgMHgwMH0sCisJezB4MDAsIDB4MDB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgdHA2ODEwX2xhdGVfc3RhcnRbXSA9IHsKKwl7MHg3ZCwgMHgwMX0sCisJezB4YjAsIDB4MDR9LAorCXsweGIxLCAweDA0fSwKKwl7MHhiMiwgMHgwNH0sCisJezB4YjMsIDB4MDR9LAorCXsweGI0LCAweDA0fSwKKwl7MHhiNSwgMHgwNH0sCisJezB4YjYsIDB4MDh9LAorCXsweGI3LCAweDA4fSwKKwl7MHhiOCwgMHgwNH0sCisJezB4YjksIDB4MDR9LAorCXsweGJhLCAweDA0fSwKKwl7MHhiYiwgMHgwNH0sCisJezB4YmMsIDB4MDR9LAorCXsweGJkLCAweDA4fSwKKwl7MHhiZSwgMHgwOH0sCisJezB4YmYsIDB4MDh9LAorCXsweGMwLCAweDA0fSwKKwl7MHhjMSwgMHgwNH0sCisJezB4YzIsIDB4MDh9LAorCXsweGMzLCAweDA4fSwKKwl7MHhjNCwgMHgwOH0sCisJezB4YzUsIDB4MDh9LAorCXsweGM2LCAweDA4fSwKKwl7MHhjNywgMHgxM30sCisJezB4YzgsIDB4MDR9LAorCXsweGM5LCAweDA4fSwKKwl7MHhjYSwgMHgwOH0sCisJezB4Y2IsIDB4MDh9LAorCXsweGNjLCAweDA4fSwKKwl7MHhjZCwgMHgwOH0sCisJezB4Y2UsIDB4MTN9LAorCXsweGNmLCAweDEzfSwKKwl7MHhkMCwgMHgwOH0sCisJezB4ZDEsIDB4MDh9LAorCXsweGQyLCAweDA4fSwKKwl7MHhkMywgMHgwOH0sCisJezB4ZDQsIDB4MDh9LAorCXsweGQ1LCAweDEzfSwKKwl7MHhkNiwgMHgxM30sCisJezB4ZDcsIDB4MTN9LAorCXsweGQ4LCAweDA4fSwKKwl7MHhkOSwgMHgwOH0sCisJezB4ZGEsIDB4MDh9LAorCXsweGRiLCAweDA4fSwKKwl7MHhkYywgMHgxM30sCisJezB4ZGQsIDB4MTN9LAorCXsweGRlLCAweDEzfSwKKwl7MHhkZiwgMHgxM30sCisJezB4ZTAsIDB4MDh9LAorCXsweGUxLCAweDA4fSwKKwl7MHhlMiwgMHgwOH0sCisJezB4ZTMsIDB4MTN9LAorCXsweGU0LCAweDEzfSwKKwl7MHhlNSwgMHgxM30sCisJezB4ZTYsIDB4MTN9LAorCXsweGU3LCAweDEzfSwKKwl7MHhlOCwgMHgwOH0sCisJezB4ZTksIDB4MDh9LAorCXsweGVhLCAweDEzfSwKKwl7MHhlYiwgMHgxM30sCisJezB4ZWMsIDB4MTN9LAorCXsweGVkLCAweDEzfSwKKwl7MHhlZSwgMHgxM30sCisJezB4ZWYsIDB4MTN9LAorCXsweDdkLCAweDAyfSwKKworCS8qIGxhdGVyIGFmdGVyIGlzb2Mgc3RhcnQgKi8KKwl7MHg3ZCwgMHgwOH0sCisJezB4N2QsIDB4MDB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgY3gwMzQyX3RpbWluZ19zZXFbXSA9IHsKKwl7Q1gwMzQyX0NIQU5ORUxfMF8xX0xfaXJzdCwgMHgyMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzBfMl9MX2lyc3QsIDB4MjR9LAorCXtDWDAzNDJfQ0hBTk5FTF8wXzJfSF9pcnN0LCAweDAwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfMF8zX0xfaXJzdCwgMHgyZn0sCisJe0NYMDM0Ml9DSEFOTkVMXzBfM19IX2lyc3QsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzBfTF9pdHgsIDB4MDJ9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzBfSF9pdHgsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzFfTF9pdHgsIDB4MjB9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzFfSF9pdHgsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzJfTF9pdHgsIDB4ZTR9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzJfSF9pdHgsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzNfTF9pdHgsIDB4ZWV9LAorCXtDWDAzNDJfQ0hBTk5FTF8xXzNfSF9pdHgsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8yXzBfTF9pd2wsIDB4MzB9LAorCXtDWDAzNDJfQ0hBTk5FTF8yXzBfSF9pd2wsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8zXzBfTF9lbnNwLCAweDM0fSwKKwl7Q1gwMzQyX0NIQU5ORUxfM18xX0xfZW5zcCwgMHhlMn0sCisJe0NYMDM0Ml9DSEFOTkVMXzNfMV9IX2Vuc3AsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF8zXzJfTF9lbnNwLCAweGY2fSwKKwl7Q1gwMzQyX0NIQU5ORUxfM18yX0hfZW5zcCwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzNfM19MX2Vuc3AsIDB4ZjR9LAorCXtDWDAzNDJfQ0hBTk5FTF8zXzNfSF9lbnNwLCAweDAyfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNF8wX0xfc2VsYSwgMHgyNn0sCisJe0NYMDM0Ml9DSEFOTkVMXzRfMF9IX3NlbGEsIDB4MDB9LAorCXtDWDAzNDJfQ0hBTk5FTF80XzFfTF9zZWxhLCAweGUyfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNF8xX0hfc2VsYSwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzVfMF9MX2ludGxhLCAweDI2fSwKKwl7Q1gwMzQyX0NIQU5ORUxfNV8xX0xfaW50bGEsIDB4Mjl9LAorCXtDWDAzNDJfQ0hBTk5FTF81XzJfTF9pbnRsYSwgMHhmMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzVfMl9IX2ludGxhLCAweDAwfSwKKwl7Q1gwMzQyX0NIQU5ORUxfNV8zX0xfaW50bGEsIDB4ZjN9LAorCXtDWDAzNDJfQ0hBTk5FTF81XzNfSF9pbnRsYSwgMHgwMH0sCisJe0NYMDM0Ml9DSEFOTkVMXzZfMF9MX3hhX3NlbF9wb3MsIDB4MjR9LAorCXtDWDAzNDJfQ0hBTk5FTF83XzFfTF9jZHNfcG9zLCAweDAyfSwKKwl7Q1gwMzQyX1RJTUlOR19FTiwgMHgwMX0sCit9OworCisvKiBkZWZpbmUgdGhlIEpQRUcgaGVhZGVyICovCitzdGF0aWMgdm9pZCBqcGVnX2RlZmluZSh1OCAqanBlZ19oZHIsCisJCQlpbnQgaGVpZ2h0LAorCQkJaW50IHdpZHRoKQoreworCW1lbWNweShqcGVnX2hkciwganBlZ19oZWFkLCBzaXplb2YganBlZ19oZWFkKTsKKwlqcGVnX2hkcltKUEVHX0hFSUdIVF9PRkZTRVQgKyAwXSA9IGhlaWdodCA+PiA4OworCWpwZWdfaGRyW0pQRUdfSEVJR0hUX09GRlNFVCArIDFdID0gaGVpZ2h0OworCWpwZWdfaGRyW0pQRUdfSEVJR0hUX09GRlNFVCArIDJdID0gd2lkdGggPj4gODsKKwlqcGVnX2hkcltKUEVHX0hFSUdIVF9PRkZTRVQgKyAzXSA9IHdpZHRoOworfQorCisvKiBzZXQgdGhlIEpQRUcgcXVhbGl0eSBmb3Igc2Vuc29yIHNvaTc2M2EgKi8KK3N0YXRpYyB2b2lkIGpwZWdfc2V0X3F1YWwodTggKmpwZWdfaGRyLAorCQkJICBpbnQgcXVhbGl0eSkKK3sKKwlpbnQgaSwgc2M7CisKKwlpZiAocXVhbGl0eSA8IDUwKQorCQlzYyA9IDUwMDAgLyBxdWFsaXR5OworCWVsc2UKKwkJc2MgPSAyMDAgLSBxdWFsaXR5ICogMjsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlqcGVnX2hkcltKUEVHX1FUMF9PRkZTRVQgKyBpXSA9CisJCQkoanBlZ19oZWFkW0pQRUdfUVQwX09GRlNFVCArIGldICogc2MgKyA1MCkgLyAxMDA7CisJCWpwZWdfaGRyW0pQRUdfUVQxX09GRlNFVCArIGldID0KKwkJCShqcGVnX2hlYWRbSlBFR19RVDFfT0ZGU0VUICsgaV0gKiBzYyArIDUwKSAvIDEwMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlZ193KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggaW5kZXgsIHU4IHZhbHVlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBnc3BjYV9kZXYtPmRldjsKKwlpbnQgcmV0OworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybjsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCTB4MGUsCisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQl2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDUwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJyZWdfdyBlcnIgJWRcbiIsIHJldCk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwl9Cit9CisKKy8qIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpbiBnc3BjYV9kZXYtPnVzYl9idWYgKi8KK3N0YXRpYyB2b2lkIHJlZ19yKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggaW5kZXgpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJMHgwZCwKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwgNTAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoInJlZ19yIGVyciAlZFxuIiwgcmV0KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVnX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IHN0cnVjdCBjbWQgKnAsIGludCBsKQoreworCWRvIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCBwLT5yZWcsIHAtPnZhbCk7CisJCXArKzsKKwl9IHdoaWxlICgtLWwgPiAwKTsKK30KKworc3RhdGljIGludCBpMmNfdyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4IGluZGV4LCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTFfU0lGX0NPTlRST0wsIDB4MDApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOV9TSUZfQUREUl9TMiwgaW5kZXgpOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxM19TSUZfVFhfREFUQSwgdmFsdWUpOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMSk7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJcmV0dXJuIDA7CisJbXNsZWVwKDUpOworCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTFfU0lGX0NPTlRST0wsIDB4MDApOworCXJldHVybiAtMTsJCQkJLyogZXJyb3IgKi8KK30KKworc3RhdGljIHZvaWQgaTJjX3dfYnVmKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IHN0cnVjdCBjbWQgKnAsIGludCBsKQoreworCWRvIHsKKwkJaTJjX3coZ3NwY2FfZGV2LCBwLT5yZWcsIHAtPnZhbCk7CisJCXArKzsKKwl9IHdoaWxlICgtLWwgPiAwKTsKK30KKworc3RhdGljIGludCBpMmNfcihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4IGluZGV4LCBpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgdjsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOV9TSUZfQUREUl9TMiwgaW5kZXgpOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMik7CisJbXNsZWVwKDUpOworCXJlZ19yKGdzcGNhX2RldiwgVFA2ODAwX1IxNF9TSUZfUlhfREFUQSk7CisJdiA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQlyZXR1cm4gdjsKKwlpZiAobGVuID4gMSkgeworCQlyZWdfcihnc3BjYV9kZXYsIFRQNjgwMF9SMUJfU0lGX1JYX0RBVEEyKTsKKwkJdiB8PSAoZ3NwY2FfZGV2LT51c2JfYnVmWzBdIDw8IDgpOworCX0KKwlyZWdfcihnc3BjYV9kZXYsIFRQNjgwMF9SMTFfU0lGX0NPTlRST0wpOworCWlmIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gPT0gMCkKKwkJcmV0dXJuIHY7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjExX1NJRl9DT05UUk9MLCAweDAwKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGJ1bGtfdyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCSAgdTggdGFnLAorCQkgIGNvbnN0IHU4ICpkYXRhLAorCQkgIGludCBsZW5ndGgpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGdzcGNhX2Rldi0+ZGV2OworCWludCBjb3VudCwgYWN0dWFsX2NvdW50LCByZXQ7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCWZvciAoOzspIHsKKwkJY291bnQgPSBsZW5ndGggPiBCVUxLX09VVF9TSVpFIC0gMQorCQkJCT8gQlVMS19PVVRfU0laRSAtIDEgOiBsZW5ndGg7CisJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IHRhZzsKKwkJbWVtY3B5KCZnc3BjYV9kZXYtPnVzYl9idWZbMV0sIGRhdGEsIGNvdW50KTsKKwkJcmV0ID0gdXNiX2J1bGtfbXNnKGRldiwKKwkJCQkgICB1c2Jfc25kYnVsa3BpcGUoZGV2LCAzKSwKKwkJCQkgICBnc3BjYV9kZXYtPnVzYl9idWYsIGNvdW50ICsgMSwKKwkJCQkgICAmYWN0dWFsX2NvdW50LCA1MDApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJidWxrIHdyaXRlIGVycm9yICVkIHRhZz0lMDJ4XG4iLAorCQkJCXJldCwgdGFnKTsKKwkJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKKwkJCXJldHVybjsKKwkJfQorCQlsZW5ndGggLT0gY291bnQ7CisJCWlmIChsZW5ndGggPD0gMCkKKwkJCWJyZWFrOworCQlkYXRhICs9IGNvdW50OworCX0KK30KKworc3RhdGljIGludCBwcm9iZV82ODEwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwl1OCBncGlvOworCWludCByZXQ7CisKKwlyZWdfcihnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBKTsKKwlncGlvID0gZ3NwY2FfZGV2LT51c2JfYnVmWzBdOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDQpOwkvKiBpMmMgMTYgYml0cyAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIxKTsJLyogb3Y/Pz8gKi8KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMUFfU0lGX1RYX0RBVEEyLCAweDAwKTsKKwlpZiAoaTJjX3coZ3NwY2FfZGV2LCAweDAwLCAweDAwKSA+PSAwKQorCQlyZXR1cm4gU0VOU09SX1NPSTc2M0E7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDAwKTsJLyogaTJjIDggYml0cyAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDdmKTsJLyogKHVua25vd24gaTJjKSAqLworCWlmIChpMmNfdyhnc3BjYV9kZXYsIDB4MDAsIDB4MDApID49IDApCisJCXJldHVybiAtMjsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEwX1NJRl9UWVBFLCAweDAwKTsJLyogaTJjIDggYml0cyAqLworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDExKTsJLyogdGFzPz8/IC8gaHY/Pz8gKi8KKwlyZXQgPSBpMmNfcihnc3BjYV9kZXYsIDB4MDAsIDEpOworCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gLTM7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3Bpbyk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDZlKTsJLyogcG8/Pz8gKi8KKwlyZXQgPSBpMmNfcihnc3BjYV9kZXYsIDB4MDAsIDEpOworCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gLTQ7CisKKwlyZXQgPSBpMmNfcihnc3BjYV9kZXYsIDB4MDEsIDEpOworCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gLTU7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3Bpbyk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwNCk7CS8qIGkyYyAxNiBiaXRzICovCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4NWQpOwkvKiBtaS9tdD8/PyAqLworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgwMCwgMik7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAtNjsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4NWMpOwkvKiBtaS9tdD8/PyAqLworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgzNiwgMik7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAtNzsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8pOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxOF9HUElPX0RBVEEsIGdwaW8gfCAweDIwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHg2MSk7CS8qICh1bmtub3duIGkyYykgKi8KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMUFfU0lGX1RYX0RBVEEyLCAweDEwKTsKKwlpZiAoaTJjX3coZ3NwY2FfZGV2LCAweGZmLCAweDAwKSA+PSAwKQorCQlyZXR1cm4gLTg7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBLCBncGlvIHwgMHgyMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3Bpbyk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZ3BpbyB8IDB4MjApOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMF9TSUZfVFlQRSwgMHgwMCk7CS8qIGkyYyA4IGJpdHMgKi8KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHgyMCk7CS8qIGN4MDM0MiAqLworCXJldCA9IGkyY19yKGdzcGNhX2RldiwgMHgwMCwgMSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiBTRU5TT1JfQ1gwMzQyOworCXJldHVybiAtOTsKK30KKworc3RhdGljIHZvaWQgY3gwMzQyXzY4MTBfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgcmVnX2luaXRfMVtdID0geworCQl7VFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDJmfSwKKwkJezB4MjUsIDB4MDJ9LAorCQl7VFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAwfSwKKwkJe1RQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHg4MH0sCisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MmZ9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4ZTF9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4YzF9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4ZTF9LAorCQl7VFA2ODAwX1IxMV9TSUZfQ09OVFJPTCwgMHgwMH0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCByZWdfaW5pdF8yW10gPSB7CisJCXtUUDY4MDBfUjc4X0ZPUk1BVCwgMHg0OH0sCisJCXtUUDY4MDBfUjExX1NJRl9DT05UUk9MLCAweDAwfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHNlbnNvcl9pbml0W10gPSB7CisJCXtDWDAzNDJfT1VUUFVUX0NUUkwsIDB4MDd9LAorCQl7Q1gwMzQyX0JZUEFTU19NT0RFLCAweDU4fSwKKwkJe0NYMDM0Ml9HUFhMVEhEX0wsIDB4Mjh9LAorCQl7Q1gwMzQyX1JCUFhMVEhEX0wsIDB4Mjh9LAorCQl7Q1gwMzQyX1BMQU5FVEhEX0wsIDB4NTB9LAorCQl7Q1gwMzQyX1BMQU5FVEhEX0gsIDB4MDN9LAorCQl7Q1gwMzQyX1JCX0dBUF9MLCAweGZmfSwKKwkJe0NYMDM0Ml9SQl9HQVBfSCwgMHgwN30sCisJCXtDWDAzNDJfR19HQVBfTCwgMHhmZn0sCisJCXtDWDAzNDJfR19HQVBfSCwgMHgwN30sCisJCXtDWDAzNDJfUlNUX09WRVJGTE9XX0wsIDB4NWN9LAorCQl7Q1gwMzQyX1JTVF9PVkVSRkxPV19ILCAweDAxfSwKKwkJe0NYMDM0Ml9EQVRBX09WRVJGTE9XX0wsIDB4ZmN9LAorCQl7Q1gwMzQyX0RBVEFfT1ZFUkZMT1dfSCwgMHgwM30sCisJCXtDWDAzNDJfREFUQV9VTkRFUkZMT1dfTCwgMHgwMH0sCisJCXtDWDAzNDJfREFUQV9VTkRFUkZMT1dfSCwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHg0MH0sCisJCXtDWDAzNDJfR0xPQkFMX0dBSU4sIDB4MDF9LAorCQl7Q1gwMzQyX0NMT0NLX0dFTiwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHgwMn0sCisJCXtDWDAzNDJfSURMRV9DVFJMLCAweDA1fSwKKwkJe0NYMDM0Ml9BRENHTiwgMHgwMH0sCisJCXtDWDAzNDJfQURDX0NUTCwgMHgwMH0sCisJCXtDWDAzNDJfTFZSU1RfQkxCSUFTLCAweDAxfSwKKwkJe0NYMDM0Ml9WVEhTRUwsIDB4MGJ9LAorCQl7Q1gwMzQyX1JBTVBfUklWLCAweDBifSwKKwkJe0NYMDM0Ml9MRE9TRUwsIDB4MDd9LAorCQl7Q1gwMzQyX1NQVl9WQUxVRV9MLCAweDQwfSwKKwkJe0NYMDM0Ml9TUFZfVkFMVUVfSCwgMHgwMn0sCisKKwkJe0NYMDM0Ml9BVVRPX0FEQ19DQUxJQiwgMHg4MX0sCisJCXtDWDAzNDJfVElNSU5HX0VOLCAweDAxfSwKKwl9OworCisJcmVnX3dfYnVmKGdzcGNhX2RldiwgcmVnX2luaXRfMSwgQVJSQVlfU0laRShyZWdfaW5pdF8xKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgdHA2ODEwX2N4X2luaXRfY29tbW9uLAorCQkJQVJSQVlfU0laRSh0cDY4MTBfY3hfaW5pdF9jb21tb24pKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCByZWdfaW5pdF8yLCBBUlJBWV9TSVpFKHJlZ19pbml0XzIpKTsKKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IxMl9TSUZfQUREUl9TLCAweDIwKTsJLyogY3gwMzQyIEkyQyBhZGRyICovCisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXQsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXQpKTsKKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBjeDAzNDJfdGltaW5nX3NlcSwgQVJSQVlfU0laRShjeDAzNDJfdGltaW5nX3NlcSkpOworfQorCitzdGF0aWMgdm9pZCBzb2k3NjNhXzY4MTBfaW5pdChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgcmVnX2luaXRfMVtdID0geworCQl7VFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDJmfSwKKwkJe1RQNjgwMF9SMThfR1BJT19EQVRBLCAweGUxfSwKKwkJezB4MjUsIDB4MDJ9LAorCQl7VFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAwfSwKKwkJe1RQNjgwMF9SM0ZfRlJBTUVfUkFURSwgMHg4MH0sCisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4MmZ9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4YzF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgcmVnX2luaXRfMltdID0geworCQl7VFA2ODAwX1I3OF9GT1JNQVQsIDB4NTR9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRbXSA9IHsKKwkJezB4MDAsIDB4MDB9LAorCQl7MHgwMSwgMHg4MH0sCisJCXsweDAyLCAweDgwfSwKKwkJezB4MDMsIDB4OTB9LAorCQl7MHgwNCwgMHgyMH0sCisJCXsweDA1LCAweDIwfSwKKwkJezB4MDYsIDB4ODB9LAorCQl7MHgwNywgMHgwMH0sCisJCXsweDA4LCAweGZmfSwKKwkJezB4MDksIDB4ZmZ9LAorCQl7MHgwYSwgMHg3Nn0sCQkvKiA3NjMwID0gc29pNjczYSAqLworCQl7MHgwYiwgMHgzMH0sCisJCXsweDBjLCAweDIwfSwKKwkJezB4MGQsIDB4MjB9LAorCQl7MHgwZSwgMHhmZn0sCisJCXsweDBmLCAweGZmfSwKKwkJezB4MTAsIDB4NDF9LAorCQl7MHgxNSwgMHgxNH0sCisJCXsweDExLCAweDQwfSwKKwkJezB4MTIsIDB4NDh9LAorCQl7MHgxMywgMHg4MH0sCisJCXsweDE0LCAweDgwfSwKKwkJezB4MTYsIDB4MDN9LAorCQl7MHgyOCwgMHhiMH0sCisJCXsweDcxLCAweDIwfSwKKwkJezB4NzUsIDB4OGV9LAorCQl7MHgxNywgMHgxYn0sCisJCXsweDE4LCAweGJkfSwKKwkJezB4MTksIDB4MDV9LAorCQl7MHgxYSwgMHhmNn0sCisJCXsweDFiLCAweDA0fSwKKwkJezB4MWMsIDB4N2Z9LAkJLyogb21uaXZpc2lvbiAqLworCQl7MHgxZCwgMHhhMn0sCisJCXsweDFlLCAweDAwfSwKKwkJezB4MWYsIDB4MDB9LAorCQl7MHgyMCwgMHg0NX0sCisJCXsweDIxLCAweDgwfSwKKwkJezB4MjIsIDB4ODB9LAorCQl7MHgyMywgMHhlZX0sCisJCXsweDI0LCAweDUwfSwKKwkJezB4MjUsIDB4N2F9LAorCQl7MHgyNiwgMHhhMH0sCisJCXsweDI3LCAweDlhfSwKKwkJezB4MjksIDB4MzB9LAorCQl7MHgyYSwgMHg4MH0sCisJCXsweDJiLCAweDAwfSwKKwkJezB4MmMsIDB4YWN9LAorCQl7MHgyZCwgMHgwNX0sCisJCXsweDJlLCAweDgwfSwKKwkJezB4MmYsIDB4M2N9LAorCQl7MHgzMCwgMHgyMn0sCisJCXsweDMxLCAweDAwfSwKKwkJezB4MzIsIDB4ODZ9LAorCQl7MHgzMywgMHgwOH0sCisJCXsweDM0LCAweGZmfSwKKwkJezB4MzUsIDB4ZmZ9LAorCQl7MHgzNiwgMHhmZn0sCisJCXsweDM3LCAweGZmfSwKKwkJezB4MzgsIDB4ZmZ9LAorCQl7MHgzOSwgMHhmZn0sCisJCXsweDNhLCAweGZlfSwKKwkJezB4M2IsIDB4ZmV9LAorCQl7MHgzYywgMHhmZX0sCisJCXsweDNkLCAweGZlfSwKKwkJezB4M2UsIDB4ZmV9LAorCQl7MHgzZiwgMHg3MX0sCisJCXsweDQwLCAweGZmfSwKKwkJezB4NDEsIDB4ZmZ9LAorCQl7MHg0MiwgMHhmZn0sCisJCXsweDQzLCAweGZmfSwKKwkJezB4NDQsIDB4ZmZ9LAorCQl7MHg0NSwgMHhmZn0sCisJCXsweDQ2LCAweGZmfSwKKwkJezB4NDcsIDB4ZmZ9LAorCQl7MHg0OCwgMHhmZn0sCisJCXsweDQ5LCAweGZmfSwKKwkJezB4NGEsIDB4ZmV9LAorCQl7MHg0YiwgMHhmZn0sCisJCXsweDRjLCAweDAwfSwKKwkJezB4NGQsIDB4MDB9LAorCQl7MHg0ZSwgMHhmZn0sCisJCXsweDRmLCAweGZmfSwKKwkJezB4NTAsIDB4ZmZ9LAorCQl7MHg1MSwgMHhmZn0sCisJCXsweDUyLCAweGZmfSwKKwkJezB4NTMsIDB4ZmZ9LAorCQl7MHg1NCwgMHhmZn0sCisJCXsweDU1LCAweGZmfSwKKwkJezB4NTYsIDB4ZmZ9LAorCQl7MHg1NywgMHhmZn0sCisJCXsweDU4LCAweGZmfSwKKwkJezB4NTksIDB4ZmZ9LAorCQl7MHg1YSwgMHhmZn0sCisJCXsweDViLCAweGZlfSwKKwkJezB4NWMsIDB4ZmZ9LAorCQl7MHg1ZCwgMHg4Zn0sCisJCXsweDVlLCAweGZmfSwKKwkJezB4NWYsIDB4OGZ9LAorCQl7MHg2MCwgMHhhMn0sCisJCXsweDYxLCAweDRhfSwKKwkJezB4NjIsIDB4ZjN9LAorCQl7MHg2MywgMHg3NX0sCisJCXsweDY0LCAweGYwfSwKKwkJezB4NjUsIDB4MDB9LAorCQl7MHg2NiwgMHg1NX0sCisJCXsweDY3LCAweDkyfSwKKwkJezB4NjgsIDB4YTB9LAorCQl7MHg2OSwgMHg0YX0sCisJCXsweDZhLCAweDIyfSwKKwkJezB4NmIsIDB4MDB9LAorCQl7MHg2YywgMHgzM30sCisJCXsweDZkLCAweDQ0fSwKKwkJezB4NmUsIDB4MjJ9LAorCQl7MHg2ZiwgMHg4NH0sCisJCXsweDcwLCAweDBifSwKKwkJezB4NzIsIDB4MTB9LAorCQl7MHg3MywgMHg1MH0sCisJCXsweDc0LCAweDIxfSwKKwkJezB4NzYsIDB4MDB9LAorCQl7MHg3NywgMHhhNX0sCisJCXsweDc4LCAweDgwfSwKKwkJezB4NzksIDB4ODB9LAorCQl7MHg3YSwgMHg4MH0sCisJCXsweDdiLCAweGUyfSwKKwkJezB4N2MsIDB4MDB9LAorCQl7MHg3ZCwgMHhmN30sCisJCXsweDdlLCAweDAwfSwKKwkJezB4N2YsIDB4MDB9LAorCX07CisKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCByZWdfaW5pdF8xLCBBUlJBWV9TSVpFKHJlZ19pbml0XzEpKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfb3ZfaW5pdF9jb21tb24sCisJCQlBUlJBWV9TSVpFKHRwNjgxMF9vdl9pbml0X2NvbW1vbikpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHJlZ19pbml0XzIsIEFSUkFZX1NJWkUocmVnX2luaXRfMikpOworCisJaTJjX3coZ3NwY2FfZGV2LCAweDEyLCAweDgwKTsJCS8qIHNlbnNvciByZXNldCAqLworCW1zbGVlcCgxMCk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXQsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXQpKTsKK30KKworLyogc2V0IHRoZSBnYWluIGFuZCBleHBvc3VyZSAqLworc3RhdGljIHZvaWQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+c2Vuc29yID09IFNFTlNPUl9DWDAzNDIpIHsKKwkJaW50IGV4cG87CisKKwkJZXhwbyA9IChzZC0+Y3RybHNbRVhQT1NVUkVdLnZhbCA8PCAyKSAtIDE7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX0VYUE9fTElORV9MLCBleHBvKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfRVhQT19MSU5FX0gsIGV4cG8gPj4gOCk7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfR0JHQUlOX0gsCisJCQkJCQlzZC0+Y3RybHNbR0FJTl0udmFsID4+IDgpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfR0JHQUlOX0wsIHNkLT5jdHJsc1tHQUlOXS52YWwpOworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX0dSR0FJTl9ILAorCQkJCQkJc2QtPmN0cmxzW0dBSU5dLnZhbCA+PiA4KTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX0dSR0FJTl9MLCBzZC0+Y3RybHNbR0FJTl0udmFsKTsKKwkJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19CR0FJTl9ILAorCQkJCQkJc2QtPmN0cmxzW0JHQUlOXS52YWwgPj4gOCk7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19CR0FJTl9MLCBzZC0+Y3RybHNbQkdBSU5dLnZhbCk7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfUkdBSU5fSCwKKwkJCQkJCXNkLT5jdHJsc1tSR0FJTl0udmFsID4+IDgpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfUkdBSU5fTCwgc2QtPmN0cmxzW1JHQUlOXS52YWwpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9TWVNfQ1RSTF8wLAorCQkJCXNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCA/IDB4ODAgOiAweDgxKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNvaTc2M2EgKi8KKwlpMmNfdyhnc3BjYV9kZXYsIDB4MTAsCQkvKiBBRUNfSCAoZXhwb3N1cmUgdGltZSkgKi8KKwkJCSBzZC0+Y3RybHNbRVhQT1NVUkVdLnZhbCk7CisvKglpMmNfdyhnc3BjYV9kZXYsIDB4NzYsIDB4MDIpOwkgKiBBRUNfTCAoWzE6MF0gKi8KKwlpMmNfdyhnc3BjYV9kZXYsIDB4MDAsCQkvKiBnYWluICovCisJCQkgc2QtPmN0cmxzW0dBSU5dLnZhbCk7Cit9CisKKy8qIHNldCB0aGUgSlBFRyBxdWFudGl6YXRpb24gdGFibGVzICovCitzdGF0aWMgdm9pZCBzZXRfZHF0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggcSkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwkvKiB1cGRhdGUgdGhlIGpwZWcgcXVhbnRpemF0aW9uIHRhYmxlcyAqLworCVBERUJVRyhEX1NUUkVBTSwgInEgJWQgLT4gJWQiLCBzZC0+cXVhbGl0eSwgcSk7CisJc2QtPnF1YWxpdHkgPSBxOworCWlmIChxID4gMTYpCisJCXEgPSAxNjsKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfU09JNzYzQSkKKwkJanBlZ19zZXRfcXVhbChzZC0+anBlZ19oZHIsIGpwZWdfcVtxXSk7CisJZWxzZQorCQltZW1jcHkoJnNkLT5qcGVnX2hkcltKUEVHX1FUMF9PRkZTRVQgLSAxXSwKKwkJCURRVFtxXSwgc2l6ZW9mIERRVFswXSk7Cit9CisKKy8qIHNldCB0aGUgSlBFRyBjb21wcmVzc2lvbiBxdWFsaXR5IGZhY3RvciAqLworc3RhdGljIHZvaWQgc2V0cXVhbGl0eShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXUxNiBxOworCisJcSA9IHNkLT5jdHJsc1tRVUFMSVRZXS52YWw7CisJaWYgKHEgIT0gMTYpCisJCXEgPSAxNSAtIHE7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SN0FfQkxLX1RIUkxELCAweDAwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzlfUVVBTElUWSwgMHgwNCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjc5X1FVQUxJVFksIHEpOworCisJLyogYXV0byBxdWFsaXR5ICovCisJaWYgKHEgPT0gMTUgJiYgc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCW1zbGVlcCg0KTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjdBX0JMS19USFJMRCwgMHgxOSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgdTggY29sb3JfbnVsbFsxOF0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CitzdGF0aWMgY29uc3QgdTggY29sb3JfZ2FpbltOU0VOU09SU11bMThdID0geworW1NFTlNPUl9DWDAzNDJdID0KKwl7MHg0YywgMHgwMCwgMHhhOSwgMHgwMCwgMHgzMSwgMHgwMCwJLyogWSBSL0cvQiAoTEUgdmFsdWVzKSAqLworCSAweGI2LCAweDAzLCAweDZjLCAweDAzLCAweGUwLCAweDAwLAkvKiBVIFIvRy9CICovCisJIDB4ZGYsIDB4MDAsIDB4NDYsIDB4MDMsIDB4ZGMsIDB4MDN9LAkvKiBWIFIvRy9CICovCitbU0VOU09SX1NPSTc2M0FdID0KKwl7MHg0YywgMHgwMCwgMHg5NSwgMHgwMCwgMHgxZCwgMHgwMCwJLyogWSBSL0cvQiAoTEUgdmFsdWVzKSAqLworCSAweGI2LCAweDAzLCAweDZjLCAweDAzLCAweGQ3LCAweDAwLAkvKiBVIFIvRy9CICovCisJIDB4ZDUsIDB4MDAsIDB4NDYsIDB4MDMsIDB4ZGMsIDB4MDN9LAkvKiBWIFIvRy9CICovCit9OworCitzdGF0aWMgdm9pZCBzZXRnYW1tYShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBnYW1tYTsKKyNkZWZpbmUgTkdBTU1BIDYKKwlzdGF0aWMgY29uc3QgdTggZ2FtbWFfdGJbTkdBTU1BXVszXVsxMDI0XSA9IHsKKwkgICAgewkJCQkvKiBnYW1tYSAwIC0gZnJvbSB0cDY4MDAgKyBzb2k3NjNhICovCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwKKwkJIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDksIDB4MDksCisJCSAweDBhLCAweDBjLCAweDBjLCAweDBkLCAweDBlLCAweDBlLCAweDEwLCAweDExLAorCQkgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNiwgMHgxNywKKwkJIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWEsIDB4MWIsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFlLCAweDFmLCAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLCAweDIzLAorCQkgMHgyNSwgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgMHgyNywgMHgyOCwgMHgyOCwKKwkJIDB4MjksIDB4MjksIDB4MmIsIDB4MmMsIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmYsCisJCSAweDJmLCAweDMwLCAweDMwLCAweDMxLCAweDMxLCAweDMzLCAweDMzLCAweDM0LAorCQkgMHgzNCwgMHgzNCwgMHgzNSwgMHgzNSwgMHgzNywgMHgzNywgMHgzOCwgMHgzOCwKKwkJIDB4MzksIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2MsCisJCSAweDNjLCAweDNkLCAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQwLCAweDQwLAorCQkgMHg0MiwgMHg0MiwgMHg0MywgMHg0MywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NSwKKwkJIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDgsIDB4NDksIDB4NDksCisJCSAweDRhLCAweDRhLCAweDRhLCAweDRiLCAweDRiLCAweDRiLCAweDRjLCAweDRjLAorCQkgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MCwKKwkJIDB4NTIsIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsIDB4NTQsCisJCSAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDU2LCAweDU4LCAweDU4LCAweDU4LAorCQkgMHg1OSwgMHg1OSwgMHg1OSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YiwgMHg1YiwKKwkJIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWUsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYxLAorCQkgMHg2MiwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwKKwkJIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NjgsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDZhLCAweDZhLAorCQkgMHg2YSwgMHg2YywgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsCisJCSAweDcwLCAweDcxLCAweDcxLCAweDcxLCAweDcxLCAweDczLCAweDczLCAweDczLAorCQkgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NywKKwkJIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksCisJCSAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwKKwkJIDB4N2QsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJCSAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksCisJCSAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwKKwkJIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsCisJCSAweDkwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCQkgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywKKwkJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisJCSAweDk2LCAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk4LCAweDk4LCAweDk4LAorCQkgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDlkLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwKKwkJIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE4LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhZCwKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisJCSAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLAorCQkgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMiwKKwkJIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LAorCQkgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiOCwKKwkJIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisJCSAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJjLCAweGJjLAorCQkgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwKKwkJIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCQkgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwKKwkJIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsCisJCSAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsCisJCSAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsCisJCSAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUwLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwKKwkJIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDksIDB4MDksCisJCSAweDBhLCAweDBjLCAweDBjLCAweDBkLCAweDBlLCAweDBlLCAweDEwLCAweDExLAorCQkgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNiwgMHgxNywKKwkJIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWEsIDB4MWIsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFlLCAweDFmLCAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLCAweDIzLAorCQkgMHgyNSwgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgMHgyNywgMHgyOCwgMHgyOCwKKwkJIDB4MjksIDB4MjksIDB4MmIsIDB4MmMsIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmYsCisJCSAweDJmLCAweDMwLCAweDMwLCAweDMxLCAweDMxLCAweDMzLCAweDMzLCAweDM0LAorCQkgMHgzNCwgMHgzNCwgMHgzNSwgMHgzNSwgMHgzNywgMHgzNywgMHgzOCwgMHgzOCwKKwkJIDB4MzksIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2MsCisJCSAweDNjLCAweDNkLCAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQwLCAweDQwLAorCQkgMHg0MiwgMHg0MiwgMHg0MywgMHg0MywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NSwKKwkJIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDgsIDB4NDksIDB4NDksCisJCSAweDRhLCAweDRhLCAweDRhLCAweDRiLCAweDRiLCAweDRiLCAweDRjLCAweDRjLAorCQkgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MCwKKwkJIDB4NTIsIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsIDB4NTQsCisJCSAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDU2LCAweDU4LCAweDU4LCAweDU4LAorCQkgMHg1OSwgMHg1OSwgMHg1OSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YiwgMHg1YiwKKwkJIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWUsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYxLAorCQkgMHg2MiwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwKKwkJIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NjgsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDZhLCAweDZhLAorCQkgMHg2YSwgMHg2YywgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsCisJCSAweDcwLCAweDcxLCAweDcxLCAweDcxLCAweDcxLCAweDczLCAweDczLCAweDczLAorCQkgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NywKKwkJIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksCisJCSAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwKKwkJIDB4N2QsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJCSAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksCisJCSAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwKKwkJIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsCisJCSAweDkwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCQkgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywKKwkJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisJCSAweDk2LCAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk4LCAweDk4LCAweDk4LAorCQkgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDlkLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwKKwkJIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE4LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhZCwKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisJCSAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLAorCQkgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMiwKKwkJIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LAorCQkgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiOCwKKwkJIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisJCSAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJjLCAweGJjLAorCQkgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwKKwkJIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCQkgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwKKwkJIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsCisJCSAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsCisJCSAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsCisJCSAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUwLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwKKwkJIDB4MDIsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDcsIDB4MDgsIDB4MDksIDB4MDksCisJCSAweDBhLCAweDBjLCAweDBjLCAweDBkLCAweDBlLCAweDBlLCAweDEwLCAweDExLAorCQkgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNiwgMHgxNywKKwkJIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWEsIDB4MWIsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFlLCAweDFmLCAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLCAweDIzLAorCQkgMHgyNSwgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgMHgyNywgMHgyOCwgMHgyOCwKKwkJIDB4MjksIDB4MjksIDB4MmIsIDB4MmMsIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmYsCisJCSAweDJmLCAweDMwLCAweDMwLCAweDMxLCAweDMxLCAweDMzLCAweDMzLCAweDM0LAorCQkgMHgzNCwgMHgzNCwgMHgzNSwgMHgzNSwgMHgzNywgMHgzNywgMHgzOCwgMHgzOCwKKwkJIDB4MzksIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2MsCisJCSAweDNjLCAweDNkLCAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQwLCAweDQwLAorCQkgMHg0MiwgMHg0MiwgMHg0MywgMHg0MywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NSwKKwkJIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDgsIDB4NDksIDB4NDksCisJCSAweDRhLCAweDRhLCAweDRhLCAweDRiLCAweDRiLCAweDRiLCAweDRjLCAweDRjLAorCQkgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MCwKKwkJIDB4NTIsIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsIDB4NTQsCisJCSAweDU1LCAweDU1LCAweDU1LCAweDU2LCAweDU2LCAweDU4LCAweDU4LCAweDU4LAorCQkgMHg1OSwgMHg1OSwgMHg1OSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YiwgMHg1YiwKKwkJIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWUsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDYwLCAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYxLAorCQkgMHg2MiwgMHg2MiwgMHg2MiwgMHg2MywgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwKKwkJIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjcsIDB4NjgsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDY5LCAweDY5LCAweDZhLCAweDZhLAorCQkgMHg2YSwgMHg2YywgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsCisJCSAweDcwLCAweDcxLCAweDcxLCAweDcxLCAweDcxLCAweDczLCAweDczLCAweDczLAorCQkgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NiwKKwkJIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksCisJCSAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwKKwkJIDB4N2QsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCisJCSAweDgxLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksCisJCSAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwKKwkJIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsCisJCSAweDkwLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLAorCQkgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywKKwkJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisJCSAweDk2LCAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk4LCAweDk4LCAweDk4LAorCQkgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsCisJCSAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDlkLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwKKwkJIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwKKwkJIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE4LCAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhYywgMHhhZCwKKwkJIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsCisJCSAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLAorCQkgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMiwKKwkJIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LAorCQkgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiOCwKKwkJIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksCisJCSAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJhLCAweGJjLCAweGJjLAorCQkgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwKKwkJIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAorCQkgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwKKwkJIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsCisJCSAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsCisJCSAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsCisJCSAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUwLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVkLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0KKwkgICAgfSwKKwkgICAgewkJCQkvKiBnYW1tYSAxIC0gZnJvbSB0cDY4MTAgKyBzb2k3NjNhICovCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAxLCAweDAyLCAweDAzLCAweDA1LCAweDA3LCAweDA4LCAweDA5LCAweDBhLAorCQkgMHgwYywgMHgwZCwgMHgwZSwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxNCwgMHgxNSwKKwkJIDB4MTYsIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFmLCAweDIwLCAweDIyLCAweDIyLCAweDIzLCAweDI1LCAweDI2LCAweDI3LAorCQkgMHgyNywgMHgyOCwgMHgyOSwgMHgyYiwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZiwKKwkJIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzUsCisJCSAweDM3LCAweDM4LCAweDM4LCAweDM5LCAweDNhLCAweDNhLCAweDNiLCAweDNjLAorCQkgMHgzYywgMHgzZCwgMHgzZiwgMHgzZiwgMHg0MCwgMHg0MiwgMHg0MiwgMHg0MywKKwkJIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDksCisJCSAweDQ5LCAweDRhLCAweDRhLCAweDRiLCAweDRiLCAweDRjLCAweDRkLCAweDRkLAorCQkgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywKKwkJIDB4NTQsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTksCisJCSAweDU5LCAweDVhLCAweDVhLCAweDViLCAweDViLCAweDVjLCAweDVjLCAweDVlLAorCQkgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwgMHg2MSwgMHg2MSwKKwkJIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsIDB4NjUsIDB4NjUsIDB4NjYsCisJCSAweDY2LCAweDY3LCAweDY3LCAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDY5LAorCQkgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsIDB4NzEsIDB4NzEsCisJCSAweDczLCAweDczLCAweDczLCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LAorCQkgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwKKwkJIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2MsCisJCSAweDdkLCAweDdkLCAweDdkLCAweDdmLCAweDdmLCAweDgwLCAweDgwLCAweDgwLAorCQkgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4NCwKKwkJIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODgsCisJCSAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwKKwkJIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsCisJCSAweDkxLCAweDkxLCAweDkyLCAweDkyLCAweDkyLCAweDkyLCAweDkzLCAweDkzLAorCQkgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywKKwkJIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksCisJCSAweDk5LCAweDlhLCAweDlhLCAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLAorCQkgMHg5YywgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwKKwkJIDB4OWUsIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsCisJCSAweGExLCAweGExLCAweGEyLCAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLAorCQkgMHhhMywgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwKKwkJIDB4YTUsIDB4YTYsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE5LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLCAweGFiLAorCQkgMHhhYywgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwKKwkJIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiNCwKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsCisJCSAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI4LAorCQkgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwKKwkJIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisJCSAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwKKwkJIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsCisJCSAweGM0LCAweGM0LCAweGM0LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywKKwkJIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LCAweGQ4LAorCQkgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkYSwKKwkJIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsCisJCSAweGVjLCAweGVjLCAweGVjLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLAorCQkgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwKKwkJIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLCAweGYzLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwKKwkJIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwKKwkJIDB4ZjksIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmUsCisJCSAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAorCQkgMHgwNSwgMHgwNywgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYywgMHgwZCwKKwkJIDB4MGUsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTUsCisJCSAweDE2LCAweDE3LCAweDE4LCAweDFhLCAweDFhLCAweDFiLCAweDFjLCAweDFlLAorCQkgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMCwgMHgyMiwgMHgyMywgMHgyNSwgMHgyNSwKKwkJIDB4MjYsIDB4MjcsIDB4MjcsIDB4MjgsIDB4MjksIDB4MjksIDB4MmIsIDB4MmMsCisJCSAweDJjLCAweDJkLCAweDJkLCAweDJmLCAweDMwLCAweDMwLCAweDMxLCAweDMxLAorCQkgMHgzMywgMHgzNCwgMHgzNCwgMHgzNSwgMHgzNSwgMHgzNywgMHgzOCwgMHgzOCwKKwkJIDB4MzksIDB4MzksIDB4M2EsIDB4M2EsIDB4M2IsIDB4M2IsIDB4M2MsIDB4M2QsCisJCSAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQwLCAweDQyLCAweDQyLCAweDQzLAorCQkgMHg0MywgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NSwgMHg0NywgMHg0NywgMHg0OCwKKwkJIDB4NDgsIDB4NDksIDB4NDksIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGMsCisJCSAweDRjLCAweDRkLCAweDRkLCAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUwLAorCQkgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywgMHg1MywgMHg1NCwgMHg1NCwgMHg1NSwKKwkJIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTksIDB4NTksCisJCSAweDVhLCAweDVhLCAweDVhLCAweDViLCAweDViLCAweDVjLCAweDVjLCAweDVjLAorCQkgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwgMHg2MCwKKwkJIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsCisJCSAweDY1LCAweDY1LCAweDY2LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY3LAorCQkgMHg2OCwgMHg2OCwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YSwKKwkJIDB4NmMsIDB4NmMsIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsCisJCSAweDZlLCAweDZmLCAweDZmLCAweDZmLCAweDcwLCAweDcwLCAweDcwLCAweDcxLAorCQkgMHg3MSwgMHg3MSwgMHg3MywgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwgMHg3NCwKKwkJIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsCisJCSAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLAorCQkgMHg3YiwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwKKwkJIDB4N2QsIDB4N2QsIDB4N2YsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsCisJCSAweDgwLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAweDgyLCAweDgyLCAweDgyLAorCQkgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NSwgMHg4NiwKKwkJIDB4ODYsIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksCisJCSAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLCAweDhiLCAweDhiLCAweDhiLAorCQkgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwgMHg4ZSwKKwkJIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsCisJCSAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkyLCAweDkyLCAweDkyLCAweDkyLAorCQkgMHg5MywgMHg5MywgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NCwKKwkJIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTcsCisJCSAweDk4LCAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDk5LAorCQkgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwKKwkJIDB4OWIsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsCisJCSAweDlkLCAweDllLCAweDllLCAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLAorCQkgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsCisJCSAweGE0LCAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LAorCQkgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsCisJCSAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLAorCQkgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwKKwkJIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisJCSAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLAorCQkgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwKKwkJIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsCisJCSAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LAorCQkgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsIDB4ZGIsCisJCSAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUwLCAweGUwLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywKKwkJIDB4ZTMsIDB4ZTMsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsCisJCSAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LAorCQkgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGU5LCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCQkgMHhlYiwgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVlLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwKKwkJIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsCisJCSAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LCAweGY1LCAweGY1LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmMsIDB4ZmMsCisJCSAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmYywgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwKKwkJIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNywKKwkJIDB4MDgsIDB4MDksIDB4MGEsIDB4MGEsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGUsCisJCSAweDEwLCAweDExLCAweDEyLCAweDEyLCAweDE0LCAweDE1LCAweDE2LCAweDE2LAorCQkgMHgxNywgMHgxOCwgMHgxOCwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgMHgxZSwKKwkJIDB4MWUsIDB4MWYsIDB4MWYsIDB4MjAsIDB4MjIsIDB4MjIsIDB4MjMsIDB4MjMsCisJCSAweDI1LCAweDI2LCAweDI2LCAweDI3LCAweDI3LCAweDI4LCAweDI5LCAweDI5LAorCQkgMHgyYiwgMHgyYiwgMHgyYywgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwgMHgzMCwKKwkJIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzQsIDB4MzUsCisJCSAweDM1LCAweDM3LCAweDM3LCAweDM4LCAweDM4LCAweDM5LCAweDM5LCAweDNhLAorCQkgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYywgMHgzYywgMHgzZCwgMHgzZCwKKwkJIDB4M2YsIDB4M2YsIDB4NDAsIDB4NDAsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDMsCisJCSAweDQzLCAweDQ0LCAweDQ0LCAweDQ1LCAweDQ1LCAweDQ3LCAweDQ3LCAweDQ3LAorCQkgMHg0OCwgMHg0OCwgMHg0OSwgMHg0OSwgMHg0OSwgMHg0YSwgMHg0YSwgMHg0YiwKKwkJIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsIDB4NGQsIDB4NGQsIDB4NGQsIDB4NGYsCisJCSAweDRmLCAweDUwLCAweDUwLCAweDUwLCAweDUyLCAweDUyLCAweDUyLCAweDUzLAorCQkgMHg1MywgMHg1NCwgMHg1NCwgMHg1NCwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NiwKKwkJIDB4NTYsIDB4NTgsIDB4NTgsIDB4NTgsIDB4NTksIDB4NTksIDB4NTksIDB4NWEsCisJCSAweDVhLCAweDVhLCAweDViLCAweDViLCAweDViLCAweDVjLCAweDVjLCAweDVjLAorCQkgMHg1ZSwgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwKKwkJIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjIsIDB4NjMsCisJCSAweDYzLCAweDYzLCAweDY1LCAweDY1LCAweDY1LCAweDY2LCAweDY2LCAweDY2LAorCQkgMHg2NiwgMHg2NywgMHg2NywgMHg2NywgMHg2OCwgMHg2OCwgMHg2OCwgMHg2OSwKKwkJIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmMsIDB4NmMsCisJCSAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZkLCAweDZlLCAweDZlLCAweDZlLAorCQkgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MCwgMHg3MSwKKwkJIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzMsIDB4NzQsIDB4NzQsCisJCSAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAweDc3LCAweDc3LAorCQkgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwKKwkJIDB4NzksIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLAorCQkgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsCisJCSAweDgyLCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LAorCQkgMHg4NSwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwKKwkJIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsCisJCSAweDhhLCAweDhhLCAweDhiLCAweDhiLCAweDhiLCAweDhiLCAweDhiLCAweDhkLAorCQkgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZSwgMHg4ZSwKKwkJIDB4OGYsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTAsCisJCSAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkyLCAweDkyLCAweDkyLAorCQkgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwKKwkJIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTYsCisJCSAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk3LCAweDk4LCAweDk4LCAweDk4LAorCQkgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsCisJCSAweDljLCAweDljLCAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLAorCQkgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwKKwkJIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTEsCisJCSAweGExLCAweGEyLCAweGEyLCAweGEyLCAweGEyLCAweGEyLCAweGEzLCAweGEzLAorCQkgMHhhMywgMHhhMywgMHhhMywgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNCwKKwkJIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTYsIDB4YTYsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LCAweGE4LCAweGE4LAorCQkgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLAorCQkgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwKKwkJIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsCisJCSAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIyLAorCQkgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiNCwKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsCisJCSAweGI2LCAweGI2LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI3LAorCQkgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJkLCAweGJkLAorCQkgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwKKwkJIDB4YmUsIDB4YmUsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsIDB4YmYsCisJCSAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMyLCAweGMyLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywKKwkJIDB4YzcsIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNhLCAweGNhLCAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLAorCQkgMHhjYiwgMHhjYiwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsIDB4Y2UsCisJCSAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNmLCAweGNmLCAweGNmLCAweGNmLAorCQkgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsCisJCSAweGQzLCAweGQzLCAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LAorCQkgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNywKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisJCSAweGVmLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYxLAorCQkgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywgMHhmMywgMHhmMywgMHhmMywKKwkJIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsCisJCSAweGY1LCAweGY1LCAweGY1LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmQsCisJCSAweGZkLCAweGZkLCAweGZkLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0KKwkgICAgfSwKKwkgICAgewkJCQkJCQkvKiBnYW1tYSAyICovCisJCXsweDAwLCAweDAxLCAweDAyLCAweDA1LCAweDA3LCAweDA4LCAweDBhLCAweDBjLAorCQkgMHgwZCwgMHgwZSwgMHgxMCwgMHgxMiwgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKwkJIDB4MTgsIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjIsCisJCSAweDIzLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJiLCAweDJjLAorCQkgMHgyZCwgMHgyZCwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNCwKKwkJIDB4MzUsIDB4MzcsIDB4MzgsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2IsCisJCSAweDNjLCAweDNkLCAweDNmLCAweDNmLCAweDQwLCAweDQyLCAweDQyLCAweDQzLAorCQkgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NywgMHg0NywgMHg0OCwgMHg0OSwgMHg0OSwKKwkJIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGMsIDB4NGMsIDB4NGQsIDB4NGYsIDB4NGYsCisJCSAweDUwLCAweDUwLCAweDUyLCAweDUzLCAweDUzLCAweDU0LCAweDU0LCAweDU1LAorCQkgMHg1NSwgMHg1NiwgMHg1NiwgMHg1OCwgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YSwKKwkJIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWYsIDB4NWYsCisJCSAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYyLCAweDYyLCAweDYzLCAweDYzLAorCQkgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2OCwKKwkJIDB4NjgsIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmMsIDB4NmMsCisJCSAweDZkLCAweDZkLCAweDZlLCAweDZlLCAweDZlLCAweDZmLCAweDZmLCAweDcwLAorCQkgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MSwgMHg3MywgMHg3MywgMHg3MywgMHg3NCwKKwkJIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsCisJCSAweDc4LCAweDc5LCAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdiLCAweDdiLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZiwgMHg3ZiwKKwkJIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsCisJCSAweDgyLCAweDgyLCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LAorCQkgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwKKwkJIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGQsCisJCSAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhmLCAweDhmLAorCQkgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkJIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsCisJCSAweDk0LCAweDk0LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LAorCQkgMHg5NywgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwKKwkJIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWIsCisJCSAweDljLCAweDljLCAweDljLCAweDlkLCAweDlkLCAweDlkLCAweDlkLCAweDllLAorCQkgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwKKwkJIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsCisJCSAweGEzLCAweGEzLCAweGE0LCAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LAorCQkgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwKKwkJIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLCAweGIyLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywgMHhiNCwgMHhiNCwKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsCisJCSAweGI3LCAweGI3LCAweGI3LCAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI4LAorCQkgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYSwgMHhiYSwKKwkJIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsCisJCSAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJlLAorCQkgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwgMHhjMCwgMHhjMCwKKwkJIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LAorCQkgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwKKwkJIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsCisJCSAweGM3LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwKKwkJIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQ0LCAweGQ0LAorCQkgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGQsIDB4ZGQsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLAorCQkgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVlLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwKKwkJIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJCSAweGY3LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LAorCQkgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA1LAorCQkgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwZCwgMHgwZSwgMHgxMCwgMHgxMSwKKwkJIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MWEsCisJCSAweDFiLCAweDFjLCAweDFlLCAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLAorCQkgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyOSwgMHgyYiwKKwkJIDB4MmMsIDB4MmQsIDB4MmQsIDB4MmYsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzMsCisJCSAweDMzLCAweDM0LCAweDM1LCAweDM1LCAweDM3LCAweDM4LCAweDM4LCAweDM5LAorCQkgMHgzYSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZCwgMHgzZiwKKwkJIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDIsIDB4NDMsIDB4NDMsIDB4NDQsIDB4NDQsCisJCSAweDQ1LCAweDQ1LCAweDQ3LCAweDQ3LCAweDQ4LCAweDQ4LCAweDQ5LCAweDRhLAorCQkgMHg0YSwgMHg0YiwgMHg0YiwgMHg0YywgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZCwKKwkJIDB4NGYsIDB4NGYsIDB4NTAsIDB4NTAsIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTMsCisJCSAweDU0LCAweDU0LCAweDU1LCAweDU1LCAweDU2LCAweDU2LCAweDU2LCAweDU4LAorCQkgMHg1OCwgMHg1OSwgMHg1OSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YiwgMHg1YiwKKwkJIDB4NWMsIDB4NWMsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWYsIDB4NWYsIDB4NWYsCisJCSAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYxLCAweDYyLCAweDYyLCAweDYzLAorCQkgMHg2MywgMHg2MywgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NywKKwkJIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjgsIDB4NjgsIDB4NjksIDB4NjksIDB4NjksCisJCSAweDZhLCAweDZhLCAweDZjLCAweDZjLCAweDZjLCAweDZkLCAweDZkLCAweDZkLAorCQkgMHg2ZSwgMHg2ZSwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwKKwkJIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzMsIDB4NzMsCisJCSAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc3LCAweDc3LAorCQkgMHg3NywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OSwKKwkJIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsCisJCSAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdkLCAweDdkLCAweDdmLCAweDdmLAorCQkgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwKKwkJIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsCisJCSAweDg1LCAweDg1LCAweDg1LCAweDg1LCAweDg2LCAweDg2LCAweDg2LCAweDg4LAorCQkgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4YSwKKwkJIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGQsCisJCSAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhlLCAweDhmLAorCQkgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwKKwkJIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsCisJCSAweDkzLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk0LAorCQkgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywKKwkJIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksCisJCSAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLCAweDlhLCAweDlhLCAweDliLAorCQkgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5YywKKwkJIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsCisJCSAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGEwLCAweGEwLCAweGExLAorCQkgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMiwKKwkJIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE1LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLAorCQkgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwKKwkJIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWUsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsCisJCSAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIwLCAweGIwLCAweGIwLCAweGIxLAorCQkgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMSwgMHhiMiwgMHhiMiwgMHhiMiwKKwkJIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjMsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LAorCQkgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiNywKKwkJIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksCisJCSAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsCisJCSAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwKKwkJIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM0LAorCQkgMHhjNCwgMHhjNCwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwKKwkJIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsCisJCSAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM5LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQxLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsCisJCSAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNiwgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsCisJCSAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LAorCQkgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGViLCAweGViLCAweGViLAorCQkgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYywgMHhlYywgMHhlYywgMHhlYywKKwkJIDB4ZWMsIDB4ZWMsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWQsCisJCSAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVmLAorCQkgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsCisJCSAweGYxLCAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGYzLCAweGY0LAorCQkgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwKKwkJIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwKKwkJIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDA1LCAweDA3LCAweDA4LAorCQkgMHgwOSwgMHgwYSwgMHgwYywgMHgwZSwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxNCwKKwkJIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFmLCAweDIwLCAweDIwLCAweDIyLCAweDIzLCAweDI1LCAweDI2LCAweDI3LAorCQkgMHgyOCwgMHgyOCwgMHgyOSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZCwgMHgyZiwKKwkJIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzUsIDB4MzcsCisJCSAweDM4LCAweDM4LCAweDM5LCAweDNhLCAweDNhLCAweDNiLCAweDNjLCAweDNjLAorCQkgMHgzZCwgMHgzZiwgMHgzZiwgMHg0MCwgMHg0MCwgMHg0MiwgMHg0MywgMHg0MywKKwkJIDB4NDQsIDB4NDQsIDB4NDUsIDB4NDcsIDB4NDcsIDB4NDgsIDB4NDgsIDB4NDksCisJCSAweDRhLCAweDRhLCAweDRiLCAweDRiLCAweDRjLCAweDRjLCAweDRkLCAweDRkLAorCQkgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MCwgMHg1MiwgMHg1MiwgMHg1MywgMHg1MywKKwkJIDB4NTQsIDB4NTQsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsIDB4NTgsCisJCSAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDViLCAweDViLCAweDVjLCAweDVjLAorCQkgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwgMHg2MSwKKwkJIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsIDB4NjUsCisJCSAweDY1LCAweDY2LCAweDY2LCAweDY3LCAweDY3LCAweDY3LCAweDY4LCAweDY4LAorCQkgMHg2OSwgMHg2OSwgMHg2OSwgMHg2YSwgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywKKwkJIDB4NmQsIDB4NmQsIDB4NmQsIDB4NmUsIDB4NmUsIDB4NmUsIDB4NmYsIDB4NmYsCisJCSAweDcwLCAweDcwLCAweDcwLCAweDcxLCAweDcxLCAweDcxLCAweDczLCAweDczLAorCQkgMHg3MywgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NywKKwkJIDB4NzcsIDB4NzgsIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4N2EsCisJCSAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdiLCAweDdjLCAweDdjLAorCQkgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg4MCwKKwkJIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsCisJCSAweDgyLCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAweDg1LAorCQkgMHg4NiwgMHg4NiwgMHg4NiwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwKKwkJIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsCisJCSAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLAorCQkgMHg4ZSwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwKKwkJIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTIsCisJCSAweDkzLCAweDkzLCAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk0LCAweDk0LAorCQkgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywgMHg5NywKKwkJIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OTksIDB4OTksCisJCSAweDlhLCAweDlhLCAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLCAweDliLAorCQkgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwKKwkJIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsCisJCSAweGEwLCAweGEwLCAweGExLCAweGExLCAweGExLCAweGExLCAweGEyLCAweGEyLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhMywgMHhhNCwKKwkJIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE1LCAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LAorCQkgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwKKwkJIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisJCSAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLAorCQkgMHhiMywgMHhiMywgMHhiMywgMHhiNCwgMHhiMywgMHhiNCwgMHhiNCwgMHhiNCwKKwkJIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsCisJCSAweGI3LCAweGI3LCAweGI3LCAweGI4LCAweGI4LCAweGI4LCAweGI4LCAweGI4LAorCQkgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwgMHhiYSwKKwkJIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisJCSAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJlLCAweGJlLAorCQkgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4YzIsCisJCSAweGMyLCAweGMyLCAweGMyLCAweGMyLCAweGMzLCAweGMzLCAweGMzLCAweGMzLAorCQkgMHhjMywgMHhjMywgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNCwgMHhjNSwKKwkJIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzUsIDB4YzYsIDB4YzYsIDB4YzYsCisJCSAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LCAweGM3LCAweGM3LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsCisJCSAweGNmLCAweGNmLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLCAweGQwLAorCQkgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMywgMHhkMywKKwkJIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsCisJCSAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLAorCQkgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVlLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwKKwkJIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsCisJCSAweGY3LCAweGY3LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYn0KKwkgICAgfSwKKwkgICAgewkJCQkvKiBnYW1tYSAzIC0gZnJvbSB0cDY4MTAgKyBjeDAzNDIgKi8KKwkJezB4MDgsIDB4MDksIDB4MGMsIDB4MGQsIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsCisJCSAweDE3LCAweDE4LCAweDFhLCAweDFjLCAweDFlLCAweDFmLCAweDIwLCAweDIzLAorCQkgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZiwKKwkJIDB4MzAsIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzcsIDB4MzgsIDB4MzksCisJCSAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNmLCAweDQwLCAweDQyLCAweDQzLAorCQkgMHg0NCwgMHg0NSwgMHg0NywgMHg0OCwgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKKwkJIDB4NGMsIDB4NGQsIDB4NGQsIDB4NGYsIDB4NTAsIDB4NTIsIDB4NTMsIDB4NTMsCisJCSAweDU0LCAweDU1LCAweDU2LCAweDU2LCAweDU4LCAweDU5LCAweDVhLCAweDVhLAorCQkgMHg1YiwgMHg1YywgMHg1YywgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MSwKKwkJIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsIDB4NjYsIDB4NjYsIDB4NjcsCisJCSAweDY4LCAweDY4LCAweDY5LCAweDY5LCAweDZhLCAweDZjLCAweDZjLCAweDZkLAorCQkgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MywKKwkJIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzcsIDB4NzcsIDB4NzgsCisJCSAweDc4LCAweDc5LCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdjLCAweDdjLAorCQkgMHg3ZCwgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwKKwkJIDB4ODIsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsCisJCSAweDg2LCAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhiLAorCQkgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg4ZiwKKwkJIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTMsCisJCSAweDkzLCAweDkzLCAweDk0LCAweDk0LCAweDk2LCAweDk2LCAweDk3LCAweDk3LAorCQkgMHg5NywgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsIDB4OWQsCisJCSAweDllLCAweDllLCAweDllLCAweGEwLCAweGEwLCAweGEwLCAweGExLCAweGExLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhNCwgMHhhNCwKKwkJIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTYsIDB4YTYsIDB4YTgsIDB4YTgsCisJCSAweGE4LCAweGE5LCAweGE5LCAweGE5LCAweGFiLCAweGFiLCAweGFiLCAweGFjLAorCQkgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsCisJCSAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywKKwkJIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksIDB4YjksIDB4YjksCisJCSAweGJhLCAweGJhLCAweGJhLCAweGJjLCAweGJjLCAweGJjLCAweGJjLCAweGJkLAorCQkgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwgMHhiZiwKKwkJIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4YzIsIDB4YzIsCisJCSAweGMzLCAweGMzLCAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM1LAorCQkgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywKKwkJIDB4YzcsIDB4YzcsIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNjLCAweGNjLAorCQkgMHhjYywgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwKKwkJIDB4Y2UsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisJCSAweGQwLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGYsIDB4ZGYsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLCAweGUwLCAweGUwLCAweGUxLAorCQkgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwKKwkJIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsCisJCSAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LAorCQkgMHhlNiwgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYwLCAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYxLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsCisJCSAweGY2LCAweGY2LCAweGY2LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LAorCQkgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwKKwkJIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsCisJCSAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MDMsIDB4MDUsIDB4MDcsIDB4MDksIDB4MGEsIDB4MGMsIDB4MGQsIDB4MTAsCisJCSAweDExLCAweDEyLCAweDE0LCAweDE1LCAweDE3LCAweDE4LCAweDFhLCAweDFiLAorCQkgMHgxYywgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMiwgMHgyMywgMHgyNSwgMHgyNiwKKwkJIDB4MjcsIDB4MjgsIDB4MjksIDB4MmIsIDB4MmMsIDB4MmMsIDB4MmQsIDB4MmYsCisJCSAweDMwLCAweDMxLCAweDMzLCAweDMzLCAweDM0LCAweDM1LCAweDM3LCAweDM4LAorCQkgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZiwKKwkJIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDUsCisJCSAweDQ3LCAweDQ3LCAweDQ4LCAweDQ5LCAweDQ5LCAweDRhLCAweDRiLCAweDRiLAorCQkgMHg0YywgMHg0ZCwgMHg0ZCwgMHg0ZiwgMHg0ZiwgMHg1MCwgMHg1MiwgMHg1MiwKKwkJIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsIDB4NTUsIDB4NTUsIDB4NTYsIDB4NTgsCisJCSAweDU4LCAweDU5LCAweDU5LCAweDVhLCAweDVhLCAweDViLCAweDViLCAweDVjLAorCQkgMHg1YywgMHg1ZSwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MCwgMHg2MSwKKwkJIDB4NjEsIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjMsIDB4NjUsIDB4NjUsIDB4NjYsCisJCSAweDY2LCAweDY3LCAweDY3LCAweDY3LCAweDY4LCAweDY4LCAweDY5LCAweDY5LAorCQkgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZSwKKwkJIDB4NmUsIDB4NmYsIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzAsIDB4NzEsIDB4NzEsCisJCSAweDcxLCAweDczLCAweDczLCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LAorCQkgMHg3NywgMHg3NywgMHg3NywgMHg3OCwgMHg3OCwgMHg3OSwgMHg3OSwgMHg3OSwKKwkJIDB4N2EsIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsIDB4N2IsIDB4N2MsIDB4N2MsCisJCSAweDdkLCAweDdkLCAweDdkLCAweDdmLCAweDdmLCAweDdmLCAweDgwLCAweDgwLAorCQkgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4NCwKKwkJIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsIDB4ODYsCisJCSAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDg5LCAweDhhLCAweDhhLAorCQkgMHg4YSwgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwKKwkJIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsCisJCSAweDkwLCAweDkxLCAweDkxLCAweDkxLCAweDkxLCAweDkyLCAweDkyLCAweDkyLAorCQkgMHg5MywgMHg5MywgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwKKwkJIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsCisJCSAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDk5LCAweDlhLCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5YywKKwkJIDB4OWMsIDB4OWQsIDB4OWQsIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWUsCisJCSAweGEwLCAweGEwLCAweGEwLCAweGEwLCAweGExLCAweGExLCAweGExLCAweGExLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhMywKKwkJIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE4LCAweGE4LCAweGE4LCAweGE4LAorCQkgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwgMHhhYiwKKwkJIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWMsIDB4YWQsIDB4YWQsIDB4YWQsCisJCSAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFlLCAweGFmLCAweGFmLAorCQkgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwKKwkJIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsCisJCSAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGIzLCAweGI0LCAweGI0LCAweGI0LAorCQkgMHhiNCwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNiwgMHhiNywgMHhiNywKKwkJIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjgsIDB4YjksCisJCSAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisJCSAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLAorCQkgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsCisJCSAweGM0LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjNywKKwkJIDB4YzcsIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsCisJCSAweGNhLCAweGNhLCAweGNhLCAweGNiLCAweGNiLCAweGNiLCAweGNiLCAweGNiLAorCQkgMHhjYiwgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjZCwgMHhjZCwKKwkJIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsIDB4Y2UsIDB4Y2UsIDB4Y2UsCisJCSAweGNlLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGNmLCAweGQwLAorCQkgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMSwgMHhkMSwgMHhkMSwgMHhkMSwKKwkJIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsCisJCSAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkNywKKwkJIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDksIDB4ZDksCisJCSAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLCAweGRhLCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRlLCAweGRlLCAweGRlLCAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGRmLAorCQkgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWIsCisJCSAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisJCSAweGVmLCAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywKKwkJIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsCisJCSAweGY0LCAweGY0LCAweGY0LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZjLCAweGZjLCAweGZjLCAweGZjLAorCQkgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmUsCisJCSAweGZlLCAweGZlLCAweGZlLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MDcsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsIDB4MTAsIDB4MTIsIDB4MTQsCisJCSAweDE2LCAweDE3LCAweDE4LCAweDFiLCAweDFjLCAweDFlLCAweDFmLCAweDIwLAorCQkgMHgyMywgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYiwgMHgyZCwKKwkJIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzcsIDB4MzgsCisJCSAweDM5LCAweDNhLCAweDNiLCAweDNiLCAweDNjLCAweDNkLCAweDNmLCAweDQwLAorCQkgMHg0MiwgMHg0MywgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NywgMHg0OCwgMHg0OSwKKwkJIDB4NGEsIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGQsIDB4NGYsIDB4NTAsCisJCSAweDUyLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU1LCAweDU2LCAweDU4LAorCQkgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YiwgMHg1YywgMHg1ZSwgMHg1ZSwKKwkJIDB4NWYsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjMsCisJCSAweDY1LCAweDY1LCAweDY2LCAweDY3LCAweDY3LCAweDY4LCAweDY4LCAweDY5LAorCQkgMHg2YSwgMHg2YSwgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZSwgMHg2ZSwKKwkJIDB4NmYsIDB4NzAsIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzMsIDB4NzQsCisJCSAweDc0LCAweDc1LCAweDc1LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc5LAorCQkgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YywgMHg3YywgMHg3ZCwKKwkJIDB4N2QsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsCisJCSAweDgyLCAweDgyLCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg2LCAweDg2LAorCQkgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwgMHg4YSwgMHg4YSwgMHg4YiwKKwkJIDB4OGIsIDB4OGIsIDB4OGQsIDB4OGQsIDB4OGUsIDB4OGUsIDB4OGUsIDB4OGYsCisJCSAweDhmLCAweDkwLCAweDkwLCAweDkwLCAweDkxLCAweDkxLCAweDkyLCAweDkyLAorCQkgMHg5MiwgMHg5MywgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwKKwkJIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksCisJCSAweDk5LCAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLAorCQkgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwKKwkJIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsCisJCSAweGEzLCAweGEzLCAweGE0LCAweGE0LCAweGE0LCAweGE1LCAweGE1LCAweGE1LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOSwKKwkJIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWMsCisJCSAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLCAweGFmLCAweGFmLAorCQkgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwgMHhiMSwKKwkJIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjQsCisJCSAweGI0LCAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LCAweGI3LCAweGI3LAorCQkgMHhiNywgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwKKwkJIDB4YjksIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsCisJCSAweGJkLCAweGJkLCAweGJkLCAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJmLAorCQkgMHhiZiwgMHhiZiwgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwKKwkJIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsCisJCSAweGM0LCAweGM0LCAweGM1LCAweGM1LCAweGM1LCAweGM1LCAweGM2LCAweGM2LAorCQkgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwKKwkJIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwKKwkJIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsCisJCSAweGQxLCAweGQxLCAweGQxLCAweGQzLCAweGQzLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkYiwgMHhkZCwKKwkJIDB4ZGQsIDB4ZGQsIDB4ZGQsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsIDB4ZGUsCisJCSAweGRmLCAweGRmLCAweGRmLCAweGRmLCAweGUwLCAweGUwLCAweGUwLCAweGUwLAorCQkgMHhlMCwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMSwgMHhlMiwgMHhlMiwKKwkJIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTQsCisJCSAweGU0LCAweGU0LCAweGU0LCAweGU0LCAweGU1LCAweGU1LCAweGU1LCAweGU1LAorCQkgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTcsIDB4ZTcsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGViLCAweGViLCAweGViLCAweGViLAorCQkgMHhlYiwgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwKKwkJIDB4ZWQsIDB4ZWQsIDB4ZWQsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsCisJCSAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywKKwkJIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsCisJCSAweGY0LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY2LCAweGY2LAorCQkgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmNywKKwkJIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksCisJCSAweGY5LCAweGY5LCAweGY5LCAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsCisJCSAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZkLCAweGZkLCAweGZkLAorCQkgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfQorCSAgICB9LAorCSAgICB7CQkJCS8qIGdhbW1hIDQgLSBmcm9tIHRwNjgwMCArIHNvaTc2M2EgKi8KKwkJezB4MTEsIDB4MTQsIDB4MTUsIDB4MTcsIDB4MWEsIDB4MWIsIDB4MWUsIDB4MWYsCisJCSAweDIyLCAweDIzLCAweDI1LCAweDI3LCAweDI4LCAweDJiLCAweDJjLCAweDJkLAorCQkgMHgyZiwgMHgzMSwgMHgzMywgMHgzNCwgMHgzNSwgMHgzOCwgMHgzOSwgMHgzYSwKKwkJIDB4M2IsIDB4M2MsIDB4M2QsIDB4NDAsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsCisJCSAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRmLAorCQkgMHg1MCwgMHg1MiwgMHg1MywgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1OCwKKwkJIDB4NTksIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWUsIDB4NWYsIDB4NjAsCisJCSAweDYxLCAweDYxLCAweDYyLCAweDYzLCAweDY1LCAweDY1LCAweDY2LCAweDY3LAorCQkgMHg2OCwgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YywgMHg2YywgMHg2ZCwgMHg2ZSwKKwkJIDB4NmYsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzEsIDB4NzMsIDB4NzQsIDB4NzQsCisJCSAweDc1LCAweDc3LCAweDc3LCAweDc4LCAweDc5LCAweDc5LCAweDdhLCAweDdhLAorCQkgMHg3YiwgMHg3YywgMHg3YywgMHg3ZCwgMHg3ZiwgMHg3ZiwgMHg4MCwgMHg4MCwKKwkJIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODYsCisJCSAweDg2LCAweDg4LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhiLCAweDhiLAorCQkgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MSwKKwkJIDB4OTEsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTYsCisJCSAweDk2LCAweDk3LCAweDk3LCAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LAorCQkgMHg5YSwgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwKKwkJIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTIsCisJCSAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LCAweGE1LCAweGE1LAorCQkgMHhhNiwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhYiwKKwkJIDB4YWIsIDB4YWIsIDB4YWMsIDB4YWMsIDB4YWQsIDB4YWQsIDB4YWQsIDB4YWUsCisJCSAweGFlLCAweGFmLCAweGFmLCAweGFmLCAweGIwLCAweGIwLCAweGIxLCAweGIxLAorCQkgMHhiMSwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiNCwgMHhiNCwKKwkJIDB4YjQsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsCisJCSAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLCAweGJhLCAweGJjLAorCQkgMHhiYywgMHhiZCwgMHhiZCwgMHhiZCwgMHhiZSwgMHhiZSwgMHhiZSwgMHhiZiwKKwkJIDB4YmYsIDB4YmYsIDB4YzAsIDB4YzAsIDB4YzAsIDB4YzIsIDB4YzIsIDB4YzIsCisJCSAweGMzLCAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM1LCAweGM1LAorCQkgMHhjNSwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywgMHhjNywgMHhjNywgMHhjOSwKKwkJIDB4YzksIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNlLAorCQkgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwKKwkJIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsCisJCSAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ3LCAweGQ3LAorCQkgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwKKwkJIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLCAweGRmLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwgMHhlMSwgMHhlMSwKKwkJIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTIsIDB4ZTMsIDB4ZTMsCisJCSAweGUzLCAweGUzLCAweGU0LCAweGU0LCAweGU0LCAweGU1LCAweGU1LCAweGU1LAorCQkgMHhlNSwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTcsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksCisJCSAweGU5LCAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZSwgMHhlZSwgMHhlZSwKKwkJIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisJCSAweGYwLCAweGYxLCAweGYxLCAweGYxLCAweGYxLCAweGYzLCAweGYzLCAweGYzLAorCQkgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwKKwkJIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsCisJCSAweGY3LCAweGY3LCAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmOSwgMHhmYSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsCisJCSAweDE2LCAweDE3LCAweDFhLCAweDFiLCAweDFjLCAweDFlLCAweDFmLCAweDIwLAorCQkgMHgyMywgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYiwgMHgyYywKKwkJIDB4MmQsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzMsIDB4MzQsIDB4MzQsIDB4MzUsCisJCSAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNjLCAweDNkLAorCQkgMHgzZiwgMHg0MCwgMHg0MiwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NSwKKwkJIDB4NDcsIDB4NDgsIDB4NDksIDB4NDksIDB4NGEsIDB4NGIsIDB4NGIsIDB4NGMsCisJCSAweDRkLCAweDRmLCAweDRmLCAweDUwLCAweDUyLCAweDUyLCAweDUzLCAweDU0LAorCQkgMHg1NCwgMHg1NSwgMHg1NSwgMHg1NiwgMHg1OCwgMHg1OCwgMHg1OSwgMHg1YSwKKwkJIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWUsIDB4NWUsIDB4NWYsIDB4NWYsCisJCSAweDYwLCAweDYwLCAweDYxLCAweDYxLCAweDYyLCAweDYzLCAweDYzLCAweDY1LAorCQkgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2OCwgMHg2OCwgMHg2OSwKKwkJIDB4NjksIDB4NmEsIDB4NmEsIDB4NmMsIDB4NmMsIDB4NmQsIDB4NmQsIDB4NmUsCisJCSAweDZlLCAweDZmLCAweDZmLCAweDcwLCAweDcwLCAweDcxLCAweDcxLCAweDczLAorCQkgMHg3MywgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NywgMHg3NywKKwkJIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2IsCisJCSAweDdiLCAweDdjLCAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdmLCAweDdmLAorCQkgMHg3ZiwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwKKwkJIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODYsIDB4ODYsCisJCSAweDg4LCAweDg4LCAweDg4LCAweDg5LCAweDg5LCAweDhhLCAweDhhLCAweDhhLAorCQkgMHg4YiwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZCwgMHg4ZSwgMHg4ZSwKKwkJIDB4OGUsIDB4OGYsIDB4OGYsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTEsCisJCSAweDkxLCAweDkyLCAweDkyLCAweDkyLCAweDkzLCAweDkzLCAweDkzLCAweDk0LAorCQkgMHg5NCwgMHg5NCwgMHg5NiwgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywKKwkJIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OTksIDB4OWEsCisJCSAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLCAweDljLAorCQkgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwgMHg5ZSwgMHhhMCwKKwkJIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsIDB4YTEsIDB4YTIsIDB4YTIsCisJCSAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LCAweGE0LAorCQkgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwgMHhhNiwgMHhhNiwKKwkJIDB4YTgsIDB4YTgsIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YTksIDB4YWIsCisJCSAweGFhLCAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFkLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwKKwkJIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsCisJCSAweGIxLCAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLAorCQkgMHhiMywgMHhiMywgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNiwgMHhiNiwKKwkJIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjgsIDB4YjgsCisJCSAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisJCSAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLAorCQkgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM3LAorCQkgMHhjNywgMHhjNywgMHhjNywgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwKKwkJIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwKKwkJIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisJCSAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQzLAorCQkgMHhkMywgMHhkMywgMHhkMywgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwKKwkJIDB4ZDQsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsCisJCSAweGQ3LCAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LAorCQkgMHhkOCwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwKKwkJIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGIsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwKKwkJIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsCisJCSAweGU1LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LAorCQkgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwKKwkJIDB4ZTgsIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWIsCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisJCSAweGVmLCAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMywKKwkJIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjQsCisJCSAweGY0LCAweGY0LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LCAweGY1LAorCQkgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywgMHhmNywKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGZhLAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifSwKKwkJezB4MGQsIDB4MTAsIDB4MTEsIDB4MTQsIDB4MTUsIDB4MTcsIDB4MTgsIDB4MWIsCisJCSAweDFjLCAweDFlLCAweDIwLCAweDIyLCAweDIzLCAweDI2LCAweDI3LCAweDI4LAorCQkgMHgyOSwgMHgyYiwgMHgyZCwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMywgMHgzNCwKKwkJIDB4MzUsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsCisJCSAweDNmLCAweDQwLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ3LCAweDQ4LAorCQkgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZiwgMHg1MCwKKwkJIDB4NTIsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTYsIDB4NTgsCisJCSAweDU5LCAweDVhLCAweDVhLCAweDViLCAweDVjLCAweDVlLCAweDVlLCAweDVmLAorCQkgMHg2MCwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MiwgMHg2MywgMHg2NSwgMHg2NSwKKwkJIDB4NjYsIDB4NjcsIDB4NjcsIDB4NjgsIDB4NjksIDB4NjksIDB4NmEsIDB4NmMsCisJCSAweDZjLCAweDZkLCAweDZkLCAweDZlLCAweDZmLCAweDZmLCAweDcwLCAweDcwLAorCQkgMHg3MSwgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NywKKwkJIDB4NzgsIDB4NzgsIDB4NzksIDB4NzksIDB4N2EsIDB4N2EsIDB4N2IsIDB4N2IsCisJCSAweDdjLCAweDdjLCAweDdkLCAweDdkLCAweDdmLCAweDdmLCAweDgwLCAweDgwLAorCQkgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwKKwkJIDB4ODYsIDB4ODYsIDB4ODgsIDB4ODgsIDB4ODksIDB4ODksIDB4OGEsIDB4OGEsCisJCSAweDhiLCAweDhiLCAweDhkLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhmLAorCQkgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwKKwkJIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIDB4OTcsCisJCSAweDk3LCAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwKKwkJIDB4OWQsIDB4OWUsIDB4OWUsIDB4YTAsIDB4YTAsIDB4YTAsIDB4YTEsIDB4YTEsCisJCSAweGExLCAweGEyLCAweGEyLCAweGEzLCAweGEzLCAweGEzLCAweGE0LCAweGE0LAorCQkgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNiwgMHhhOCwgMHhhOCwKKwkJIDB4YTgsIDB4YTksIDB4YTksIDB4YTksIDB4YWIsIDB4YWIsIDB4YWIsIDB4YWMsCisJCSAweGFjLCAweGFjLCAweGFkLCAweGFkLCAweGFkLCAweGFlLCAweGFlLCAweGFlLAorCQkgMHhhZiwgMHhhZiwgMHhhZiwgMHhiMCwgMHhiMCwgMHhiMCwgMHhiMSwgMHhiMSwKKwkJIDB4YjEsIDB4YjIsIDB4YjIsIDB4YjIsIDB4YjMsIDB4YjMsIDB4YjMsIDB4YjQsCisJCSAweGI0LCAweGI0LCAweGI2LCAweGI2LCAweGI2LCAweGI2LCAweGI3LCAweGI3LAorCQkgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOSwgMHhiOSwgMHhiOSwgMHhiYSwKKwkJIDB4YmEsIDB4YmEsIDB4YmEsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsIDB4YmQsCisJCSAweGJkLCAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLCAweGJmLAorCQkgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LAorCQkgMHhjNywgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAweGNkLCAweGNkLCAweGNkLCAweGNkLCAweGNlLCAweGNlLCAweGNlLCAweGNlLAorCQkgMHhjZiwgMHhjZiwgMHhjZiwgMHhjZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwKKwkJIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDEsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsCisJCSAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ2LCAweGQ2LCAweGQ2LCAweGQ2LAorCQkgMHhkNywgMHhkNywgMHhkNywgMHhkNywgMHhkOCwgMHhkOCwgMHhkOCwgMHhkOCwKKwkJIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZDksIDB4ZGEsIDB4ZGEsIDB4ZGEsIDB4ZGEsCisJCSAweGRiLCAweGRiLCAweGRiLCAweGRiLCAweGRkLCAweGRkLCAweGRkLCAweGRkLAorCQkgMHhkZCwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwKKwkJIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwKKwkJIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsCisJCSAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU4LCAweGU4LCAweGU4LAorCQkgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjMsCisJCSAweGYzLCAweGYzLCAweGYzLCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LAorCQkgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjYsIDB4ZjYsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LAorCQkgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZiLCAweGZifQorCSAgICB9LAorCSAgICB7CQkJCQkJCS8qIGdhbW1hIDUgKi8KKwkJezB4MTYsIDB4MTgsIDB4MTksIDB4MWIsIDB4MWQsIDB4MWUsIDB4MjAsIDB4MjEsCisJCSAweDIzLCAweDI0LCAweDI1LCAweDI3LCAweDI4LCAweDJhLCAweDJiLCAweDJjLAorCQkgMHgyZCwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzNCwgMHgzNSwgMHgzNiwKKwkJIDB4MzcsIDB4MzgsIDB4MzksIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisJCSAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorCQkgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwKKwkJIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsCisJCSAweDU2LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDU5LCAweDVhLCAweDViLAorCQkgMHg1YywgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg1ZiwgMHg2MCwgMHg2MSwKKwkJIDB4NjIsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjYsCisJCSAweDY3LCAweDY4LCAweDY4LCAweDY5LCAweDZhLCAweDZhLCAweDZiLCAweDZiLAorCQkgMHg2YywgMHg2ZCwgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg2ZiwgMHg3MCwgMHg3MCwKKwkJIDB4NzEsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzUsCisJCSAweDc1LCAweDc2LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc5LCAweDc5LAorCQkgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZSwKKwkJIDB4N2UsIDB4N2YsIDB4N2YsIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODIsCisJCSAweDgyLCAweDgzLCAweDgzLCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LAorCQkgMHg4NiwgMHg4NiwgMHg4NywgMHg4NywgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwKKwkJIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGMsIDB4OGMsIDB4OGQsCisJCSAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhmLCAweDhmLCAweDkwLCAweDkwLAorCQkgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwgMHg5MywgMHg5MywgMHg5NCwKKwkJIDB4OTQsIDB4OTQsIDB4OTUsIDB4OTUsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsCisJCSAweDk3LCAweDk4LCAweDk4LCAweDk4LCAweDk5LCAweDk5LCAweDlhLCAweDlhLAorCQkgMHg5YSwgMHg5YiwgMHg5YiwgMHg5YiwgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwKKwkJIDB4OWQsIDB4OWUsIDB4OWUsIDB4OWUsIDB4OWYsIDB4OWYsIDB4YTAsIDB4YTAsCisJCSAweGEwLCAweGExLCAweGExLCAweGExLCAweGEyLCAweGEyLCAweGEyLCAweGEzLAorCQkgMHhhMywgMHhhNCwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNSwgMHhhNSwgMHhhNiwKKwkJIDB4YTYsIDB4YTYsIDB4YTcsIDB4YTcsIDB4YTcsIDB4YTgsIDB4YTgsIDB4YTgsCisJCSAweGE5LCAweGE5LCAweGE5LCAweGFhLCAweGFhLCAweGFhLCAweGFiLCAweGFiLAorCQkgMHhhYiwgMHhhYywgMHhhYywgMHhhYywgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwKKwkJIDB4YWUsIDB4YWUsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIyLCAweGIyLCAweGIyLCAweGIzLAorCQkgMHhiMywgMHhiMywgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNSwgMHhiNSwKKwkJIDB4YjUsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisJCSAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGJhLCAweGJhLAorCQkgMHhiYSwgMHhiYSwgMHhiYiwgMHhiYiwgMHhiYiwgMHhiYywgMHhiYywgMHhiYywKKwkJIDB4YmMsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisJCSAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLCAweGMwLCAweGMxLAorCQkgMHhjMSwgMHhjMSwgMHhjMSwgMHhjMiwgMHhjMiwgMHhjMiwgMHhjMywgMHhjMywKKwkJIDB4YzMsIDB4YzMsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzQsIDB4YzUsIDB4YzUsCisJCSAweGM1LCAweGM1LCAweGM2LCAweGM2LCAweGM2LCAweGM3LCAweGM3LCAweGM3LAorCQkgMHhjNywgMHhjOCwgMHhjOCwgMHhjOCwgMHhjOCwgMHhjOSwgMHhjOSwgMHhjOSwKKwkJIDB4YzksIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsCisJCSAweGNiLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZiwgMHhjZiwgMHhjZiwKKwkJIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ZDEsIDB4ZDEsIDB4ZDEsCisJCSAweGQxLCAweGQyLCAweGQyLCAweGQyLCAweGQyLCAweGQzLCAweGQzLCAweGQzLAorCQkgMHhkMywgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNCwgMHhkNSwgMHhkNSwgMHhkNSwKKwkJIDB4ZDUsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsCisJCSAweGQ3LCAweGQ3LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGQsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwgMHhlMCwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTIsIDB4ZTIsCisJCSAweGUyLCAweGUyLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGUzLCAweGU0LAorCQkgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwgMHhlNSwKKwkJIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTYsIDB4ZTcsIDB4ZTcsIDB4ZTcsIDB4ZTcsCisJCSAweGU3LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU4LCAweGU5LCAweGU5LAorCQkgMHhlOSwgMHhlOSwgMHhlYSwgMHhlYSwgMHhlYSwgMHhlYSwgMHhlYSwgMHhlYiwKKwkJIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWIsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsCisJCSAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYzLCAweGYzLCAweGYzLAorCQkgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwKKwkJIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjYsIDB4ZjYsIDB4ZjYsIDB4ZjYsCisJCSAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY3LCAweGY4LCAweGY4LCAweGY4LAorCQkgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwKKwkJIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmEsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmIsCisJCSAweGZiLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZjLCAweGZkLCAweGZkLAorCQkgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MGYsIDB4MTEsIDB4MTIsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTgsIDB4MTksCisJCSAweDFhLCAweDFiLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLAorCQkgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKKwkJIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzEsIDB4MzIsCisJCSAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM4LCAweDM5LAorCQkgMHgzYSwgMHgzYiwgMHgzYywgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHgzZiwKKwkJIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDQsIDB4NDUsCisJCSAweDQ2LCAweDQ3LCAweDQ3LCAweDQ4LCAweDQ5LCAweDQ5LCAweDRhLCAweDRiLAorCQkgMHg0YiwgMHg0YywgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZSwgMHg0ZiwgMHg1MCwKKwkJIDB4NTAsIDB4NTEsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTMsIDB4NTQsIDB4NTQsCisJCSAweDU1LCAweDU1LCAweDU2LCAweDU2LCAweDU3LCAweDU4LCAweDU4LCAweDU5LAorCQkgMHg1OSwgMHg1YSwgMHg1YSwgMHg1YiwgMHg1YiwgMHg1YywgMHg1YywgMHg1ZCwKKwkJIDB4NWQsIDB4NWUsIDB4NWUsIDB4NWYsIDB4NWYsIDB4NjAsIDB4NjAsIDB4NjEsCisJCSAweDYxLCAweDYyLCAweDYyLCAweDYzLCAweDYzLCAweDY0LCAweDY0LCAweDY1LAorCQkgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2OCwgMHg2OCwKKwkJIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsIDB4NmEsIDB4NmIsIDB4NmIsIDB4NmMsCisJCSAweDZjLCAweDZkLCAweDZkLCAweDZkLCAweDZlLCAweDZlLCAweDZmLCAweDZmLAorCQkgMHg2ZiwgMHg3MCwgMHg3MCwgMHg3MSwgMHg3MSwgMHg3MSwgMHg3MiwgMHg3MiwKKwkJIDB4NzMsIDB4NzMsIDB4NzMsIDB4NzQsIDB4NzQsIDB4NzUsIDB4NzUsIDB4NzUsCisJCSAweDc2LCAweDc2LCAweDc2LCAweDc3LCAweDc3LCAweDc4LCAweDc4LCAweDc4LAorCQkgMHg3OSwgMHg3OSwgMHg3OSwgMHg3YSwgMHg3YSwgMHg3YSwgMHg3YiwgMHg3YiwKKwkJIDB4N2IsIDB4N2MsIDB4N2MsIDB4N2QsIDB4N2QsIDB4N2QsIDB4N2UsIDB4N2UsCisJCSAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDgwLCAweDgwLCAweDgwLCAweDgxLAorCQkgMHg4MSwgMHg4MSwgMHg4MiwgMHg4MiwgMHg4MiwgMHg4MywgMHg4MywgMHg4MywKKwkJIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsCisJCSAweDg2LCAweDg2LCAweDg3LCAweDg3LCAweDg3LCAweDg4LCAweDg4LCAweDg4LAorCQkgMHg4OCwgMHg4OSwgMHg4OSwgMHg4OSwgMHg4YSwgMHg4YSwgMHg4YSwgMHg4YiwKKwkJIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGMsIDB4OGMsIDB4OGMsIDB4OGQsIDB4OGQsCisJCSAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhlLCAweDhmLCAweDhmLCAweDhmLAorCQkgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwgMHg5MSwgMHg5MSwKKwkJIDB4OTIsIDB4OTIsIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsCisJCSAweDk0LCAweDk0LCAweDk0LCAweDk1LCAweDk1LCAweDk1LCAweDk2LCAweDk2LAorCQkgMHg5NiwgMHg5NiwgMHg5NywgMHg5NywgMHg5NywgMHg5NywgMHg5OCwgMHg5OCwKKwkJIDB4OTgsIDB4OTgsIDB4OTksIDB4OTksIDB4OTksIDB4OTksIDB4OWEsIDB4OWEsCisJCSAweDlhLCAweDlhLCAweDliLCAweDliLCAweDliLCAweDliLCAweDljLCAweDljLAorCQkgMHg5YywgMHg5YywgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZCwgMHg5ZSwgMHg5ZSwKKwkJIDB4OWUsIDB4OWUsIDB4OWYsIDB4OWYsIDB4OWYsIDB4OWYsIDB4YTAsIDB4YTAsCisJCSAweGEwLCAweGEwLCAweGExLCAweGExLCAweGExLCAweGExLCAweGEyLCAweGEyLAorCQkgMHhhMiwgMHhhMiwgMHhhMiwgMHhhMywgMHhhMywgMHhhMywgMHhhMywgMHhhNCwKKwkJIDB4YTQsIDB4YTQsIDB4YTQsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsIDB4YTUsCisJCSAweGE2LCAweGE2LCAweGE2LCAweGE2LCAweGE3LCAweGE3LCAweGE3LCAweGE3LAorCQkgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOSwgMHhhOSwgMHhhOSwKKwkJIDB4YTksIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLAorCQkgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwKKwkJIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsCisJCSAweGIwLCAweGIwLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIxLCAweGIyLAorCQkgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMiwgMHhiMywgMHhiMywgMHhiMywgMHhiMywKKwkJIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjQsIDB4YjUsIDB4YjUsIDB4YjUsCisJCSAweGI1LCAweGI1LCAweGI2LCAweGI2LCAweGI2LCAweGI2LCAweGI2LCAweGI3LAorCQkgMHhiNywgMHhiNywgMHhiNywgMHhiNywgMHhiOCwgMHhiOCwgMHhiOCwgMHhiOCwKKwkJIDB4YjgsIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YjksIDB4YmEsIDB4YmEsCisJCSAweGJhLCAweGJhLCAweGJhLCAweGJiLCAweGJiLCAweGJiLCAweGJiLCAweGJiLAorCQkgMHhiYiwgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiYywgMHhiZCwgMHhiZCwKKwkJIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsIDB4YmUsCisJCSAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGJmLCAweGMwLCAweGMwLCAweGMwLAorCQkgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMSwgMHhjMSwgMHhjMSwgMHhjMSwgMHhjMSwKKwkJIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM0LAorCQkgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwgMHhjNiwKKwkJIDB4YzYsIDB4YzYsIDB4YzYsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsCisJCSAweGM3LCAweGM4LCAweGM4LCAweGM4LCAweGM4LCAweGM4LCAweGM5LCAweGM5LAorCQkgMHhjOSwgMHhjOSwgMHhjOSwgMHhjOSwgMHhjYSwgMHhjYSwgMHhjYSwgMHhjYSwKKwkJIDB4Y2EsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2IsIDB4Y2MsCisJCSAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNkLCAweGNkLCAweGNkLCAweGNkLAorCQkgMHhjZCwgMHhjZCwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwgMHhjZSwKKwkJIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4Y2YsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisJCSAweGQwLCAweGQwLCAweGQwLCAweGQxLCAweGQxLCAweGQxLCAweGQxLCAweGQxLAorCQkgMHhkMSwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMiwgMHhkMywKKwkJIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDMsIDB4ZDQsIDB4ZDQsIDB4ZDQsIDB4ZDQsCisJCSAweGQ0LCAweGQ0LCAweGQ1LCAweGQ1LCAweGQ1LCAweGQ1LCAweGQ1LCAweGQ1LAorCQkgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNiwgMHhkNywgMHhkNywKKwkJIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsIDB4ZDgsCisJCSAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LCAweGRhLAorCQkgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGMsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLAorCQkgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwKKwkJIDB4ZGYsIDB4ZGYsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsCisJCSAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUxLCAweGUyLCAweGUyLAorCQkgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMiwgMHhlMywgMHhlMywgMHhlMywgMHhlMywKKwkJIDB4ZTMsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTQsIDB4ZTUsCisJCSAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU1LCAweGU2LCAweGU2LCAweGU2LAorCQkgMHhlNiwgMHhlNiwgMHhlNiwgMHhlNywgMHhlNywgMHhlNywgMHhlNywgMHhlNywKKwkJIDB4ZTcsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTgsIDB4ZTksIDB4ZTksCisJCSAweGU5LCAweGU5LCAweGU5LCAweGU5LCAweGVhLCAweGVhLCAweGVhLCAweGVhLAorCQkgMHhlYSwgMHhlYSwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwgMHhlYiwKKwkJIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWMsIDB4ZWQsIDB4ZWQsCisJCSAweGVkLCAweGVkLCAweGVkLCAweGVlLCAweGVlLCAweGVlLCAweGVlLCAweGVlLAorCQkgMHhlZSwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhmMCwKKwkJIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjEsIDB4ZjEsCisJCSAweGYxLCAweGYxLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLCAweGYyLAorCQkgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmMywgMHhmNCwgMHhmNCwgMHhmNCwKKwkJIDB4ZjQsIDB4ZjQsIDB4ZjQsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsIDB4ZjUsCisJCSAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY2LCAweGY3LCAweGY3LAorCQkgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwKKwkJIDB4ZjgsIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZjksIDB4ZmEsIDB4ZmEsCisJCSAweGZhLCAweGZhLCAweGZhLCAweGZhLCAweGZiLCAweGZiLCAweGZiLCAweGZiLAorCQkgMHhmYiwgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmZCwgMHhmZCwKKwkJIDB4ZmQsIDB4ZmQsIDB4ZmQsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsIDB4ZmUsCisJCSAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkJezB4MTMsIDB4MTUsIDB4MTYsIDB4MTgsIDB4MTksIDB4MWIsIDB4MWMsIDB4MWUsCisJCSAweDFmLCAweDIwLCAweDIyLCAweDIzLCAweDI0LCAweDI2LCAweDI3LCAweDI4LAorCQkgMHgyOSwgMHgyYSwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwKKwkJIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCisJCSAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLAorCQkgMHg0MiwgMHg0MywgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwKKwkJIDB4NDksIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGQsIDB4NGUsCisJCSAweDRmLCAweDUwLCAweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDUzLCAweDU0LAorCQkgMHg1NSwgMHg1NSwgMHg1NiwgMHg1NywgMHg1NywgMHg1OCwgMHg1OSwgMHg1OSwKKwkJIDB4NWEsIDB4NWIsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWQsIDB4NWUsIDB4NWYsCisJCSAweDVmLCAweDYwLCAweDYwLCAweDYxLCAweDYyLCAweDYyLCAweDYzLCAweDYzLAorCQkgMHg2NCwgMHg2NSwgMHg2NSwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NywgMHg2OCwKKwkJIDB4NjksIDB4NjksIDB4NmEsIDB4NmEsIDB4NmIsIDB4NmIsIDB4NmMsIDB4NmMsCisJCSAweDZkLCAweDZkLCAweDZlLCAweDZlLCAweDZmLCAweDZmLCAweDcwLCAweDcwLAorCQkgMHg3MSwgMHg3MSwgMHg3MiwgMHg3MiwgMHg3MywgMHg3MywgMHg3NCwgMHg3NCwKKwkJIDB4NzUsIDB4NzUsIDB4NzYsIDB4NzYsIDB4NzcsIDB4NzcsIDB4NzgsIDB4NzgsCisJCSAweDc5LCAweDc5LCAweDdhLCAweDdhLCAweDdhLCAweDdiLCAweDdiLCAweDdjLAorCQkgMHg3YywgMHg3ZCwgMHg3ZCwgMHg3ZSwgMHg3ZSwgMHg3ZSwgMHg3ZiwgMHg3ZiwKKwkJIDB4ODAsIDB4ODAsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODMsCisJCSAweDgzLCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg2LCAweDg2LAorCQkgMHg4NiwgMHg4NywgMHg4NywgMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHg4OSwKKwkJIDB4ODksIDB4OGEsIDB4OGEsIDB4OGIsIDB4OGIsIDB4OGIsIDB4OGMsIDB4OGMsCisJCSAweDhjLCAweDhkLCAweDhkLCAweDhlLCAweDhlLCAweDhlLCAweDhmLCAweDhmLAorCQkgMHg4ZiwgMHg5MCwgMHg5MCwgMHg5MCwgMHg5MSwgMHg5MSwgMHg5MiwgMHg5MiwKKwkJIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTUsCisJCSAweDk1LCAweDk1LCAweDk2LCAweDk2LCAweDk2LCAweDk3LCAweDk3LCAweDk3LAorCQkgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHg5OSwgMHg5OSwgMHg5YSwgMHg5YSwKKwkJIDB4OWEsIDB4OWIsIDB4OWIsIDB4OWIsIDB4OWMsIDB4OWMsIDB4OWMsIDB4OWQsCisJCSAweDlkLCAweDlkLCAweDllLCAweDllLCAweDllLCAweDllLCAweDlmLCAweDlmLAorCQkgMHg5ZiwgMHhhMCwgMHhhMCwgMHhhMCwgMHhhMSwgMHhhMSwgMHhhMSwgMHhhMiwKKwkJIDB4YTIsIDB4YTIsIDB4YTIsIDB4YTMsIDB4YTMsIDB4YTMsIDB4YTQsIDB4YTQsCisJCSAweGE0LCAweGE1LCAweGE1LCAweGE1LCAweGE1LCAweGE2LCAweGE2LCAweGE2LAorCQkgMHhhNywgMHhhNywgMHhhNywgMHhhNywgMHhhOCwgMHhhOCwgMHhhOCwgMHhhOSwKKwkJIDB4YTksIDB4YTksIDB4YTksIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWIsIDB4YWIsCisJCSAweGFiLCAweGFiLCAweGFjLCAweGFjLCAweGFjLCAweGFjLCAweGFkLCAweGFkLAorCQkgMHhhZCwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZSwgMHhhZiwgMHhhZiwgMHhhZiwKKwkJIDB4YWYsIDB4YjAsIDB4YjAsIDB4YjAsIDB4YjEsIDB4YjEsIDB4YjEsIDB4YjEsCisJCSAweGIyLCAweGIyLCAweGIyLCAweGIyLCAweGIzLCAweGIzLCAweGIzLCAweGIzLAorCQkgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNCwgMHhiNSwgMHhiNSwgMHhiNSwgMHhiNSwKKwkJIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjYsIDB4YjcsIDB4YjcsIDB4YjcsIDB4YjcsCisJCSAweGI4LCAweGI4LCAweGI4LCAweGI4LCAweGI5LCAweGI5LCAweGI5LCAweGI5LAorCQkgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYSwgMHhiYiwgMHhiYiwgMHhiYiwgMHhiYiwKKwkJIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmMsIDB4YmQsIDB4YmQsIDB4YmQsIDB4YmQsCisJCSAweGJlLCAweGJlLCAweGJlLCAweGJlLCAweGJmLCAweGJmLCAweGJmLCAweGJmLAorCQkgMHhiZiwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMCwgMHhjMSwgMHhjMSwgMHhjMSwKKwkJIDB4YzEsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzIsIDB4YzMsIDB4YzMsCisJCSAweGMzLCAweGMzLCAweGM0LCAweGM0LCAweGM0LCAweGM0LCAweGM1LCAweGM1LAorCQkgMHhjNSwgMHhjNSwgMHhjNSwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNywKKwkJIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzcsIDB4YzgsIDB4YzgsIDB4YzgsIDB4YzgsCisJCSAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGM5LCAweGNhLCAweGNhLCAweGNhLAorCQkgMHhjYSwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYiwgMHhjYywgMHhjYywKKwkJIDB4Y2MsIDB4Y2MsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2QsIDB4Y2UsCisJCSAweGNlLCAweGNlLCAweGNlLCAweGNlLCAweGNmLCAweGNmLCAweGNmLCAweGNmLAorCQkgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMCwgMHhkMSwgMHhkMSwgMHhkMSwKKwkJIDB4ZDEsIDB4ZDEsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDIsIDB4ZDMsCisJCSAweGQzLCAweGQzLCAweGQzLCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LCAweGQ0LAorCQkgMHhkNSwgMHhkNSwgMHhkNSwgMHhkNSwgMHhkNSwgMHhkNiwgMHhkNiwgMHhkNiwKKwkJIDB4ZDYsIDB4ZDYsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDcsIDB4ZDgsCisJCSAweGQ4LCAweGQ4LCAweGQ4LCAweGQ4LCAweGQ5LCAweGQ5LCAweGQ5LCAweGQ5LAorCQkgMHhkOSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYSwgMHhkYiwgMHhkYiwKKwkJIDB4ZGIsIDB4ZGIsIDB4ZGIsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGMsIDB4ZGMsCisJCSAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRkLCAweGRlLCAweGRlLCAweGRlLAorCQkgMHhkZSwgMHhkZSwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhkZiwgMHhlMCwKKwkJIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTAsIDB4ZTEsIDB4ZTEsIDB4ZTEsIDB4ZTEsCisJCSAweGUxLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUyLCAweGUzLCAweGUzLAorCQkgMHhlMywgMHhlMywgMHhlMywgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwgMHhlNCwKKwkJIDB4ZTQsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTYsCisJCSAweGU2LCAweGU2LCAweGU2LCAweGU3LCAweGU3LCAweGU3LCAweGU3LCAweGU3LAorCQkgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOCwgMHhlOSwgMHhlOSwgMHhlOSwKKwkJIDB4ZTksIDB4ZTksIDB4ZTksIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4ZWEsIDB4ZWEsCisJCSAweGViLCAweGViLCAweGViLCAweGViLCAweGViLCAweGVjLCAweGVjLCAweGVjLAorCQkgMHhlYywgMHhlYywgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwgMHhlZCwKKwkJIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWYsIDB4ZWYsIDB4ZWYsCisJCSAweGVmLCAweGVmLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorCQkgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMSwgMHhmMiwgMHhmMiwgMHhmMiwKKwkJIDB4ZjIsIDB4ZjIsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsIDB4ZjMsCisJCSAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY0LCAweGY1LCAweGY1LCAweGY1LAorCQkgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwKKwkJIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjcsIDB4ZjgsIDB4ZjgsIDB4ZjgsCisJCSAweGY4LCAweGY4LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LCAweGY5LAorCQkgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwgMHhmYiwKKwkJIDB4ZmIsIDB4ZmIsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsIDB4ZmMsCisJCSAweGZkLCAweGZkLCAweGZkLCAweGZkLCAweGZkLCAweGZlLCAweGZlLCAweGZlLAorCQkgMHhmZSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCQkgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCSAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfSwKKwkgICAgfSwKKwl9OworCisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDApOworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApCisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyOCk7CisvKgltc2xlZXAoNTApOyAqLworCWdhbW1hID0gc2QtPmN0cmxzW0dBTU1BXS52YWw7CisJYnVsa193KGdzcGNhX2RldiwgMHgwMCwgZ2FtbWFfdGJbZ2FtbWFdWzBdLCAxMDI0KTsKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAxLCBnYW1tYV90YltnYW1tYV1bMV0sIDEwMjQpOworCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDIsIGdhbW1hX3RiW2dhbW1hXVsyXSwgMTAyNCk7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgxMCkgeworCQlpbnQgaTsKKworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIDB4MmIpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIDB4MjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjU1X0dBTU1BX1IsCisJCQkJZ2FtbWFfdGJbZ2FtbWFdWzBdW2ldKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCAweDJiKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDAyLCAweDI4KTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1Nl9HQU1NQV9HLAorCQkJCWdhbW1hX3RiW2dhbW1hXVsxXVtpXSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyYik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwMiwgMHgyOCk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNTdfR0FNTUFfQiwKKwkJCQlnYW1tYV90YltnYW1tYV1bMl1baV0pOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDIsIDB4MjgpOworCX0KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMjFfRU5EUF8xX0NUTCwgMHgwMyk7CisvKgltc2xlZXAoNTApOyAqLworfQorCitzdGF0aWMgdm9pZCBzZXRzaGFycG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1OCB2YWw7CisKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKSB7CisJCXZhbCA9IHNkLT5jdHJsc1tTSEFSUE5FU1NdLnZhbAorCQkJCXwgMHgwODsJCS8qIGdyaWQgY29tcGVuc2F0aW9uIGVuYWJsZSAqLworCQlpZiAoZ3NwY2FfZGV2LT53aWR0aCA9PSA2NDApCisJCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULCAweDAwKTsgLyogdmdhICovCisJCWVsc2UKKwkJCXZhbCB8PSAweDA0OwkJLyogc2NhbGluZyBkb3duIGVuYWJsZSAqLworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNURfREVNT1NBSUNfQ0ZHLCB2YWwpOworCX0gZWxzZSB7CisJCXZhbCA9IChzZC0+Y3RybHNbU0hBUlBORVNTXS52YWwgPDwgNSkgfCAweDA4OworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NTksIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBBVVRPR0FJTikpCisJCXJldHVybjsKKwlpZiAoc2QtPmN0cmxzW0FVVE9HQUlOXS52YWwpIHsKKwkJc2QtPmFnX2NudCA9IEFHX0NOVF9TVEFSVDsKKwkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgRVhQT1NVUkUpIHwgKDEgPDwgR0FJTik7CisJfSBlbHNlIHsKKwkJc2QtPmFnX2NudCA9IC0xOworCQlnc3BjYV9kZXYtPmN0cmxfaW5hYyAmPSB+KCgxIDw8IEVYUE9TVVJFKSB8ICgxIDw8IEdBSU4pKTsKKwl9Cit9CisKKy8qIHNldCB0aGUgcmVzb2x1dGlvbiBmb3Igc2Vuc29yIGN4MDM0MiAqLworc3RhdGljIHZvaWQgc2V0X3Jlc29sdXRpb24oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAwKTsKKwlpZiAoZ3NwY2FfZGV2LT53aWR0aCA9PSAzMjApIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4MDYpOworCQltc2xlZXAoMTAwKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfQVVUT19BRENfQ0FMSUIsIDB4MDEpOworCQltc2xlZXAoMTAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDMpOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULCAweDAxKTsJLyogcXZnYSAqLworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNURfREVNT1NBSUNfQ0ZHLCAweDBkKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfRVhQT19MSU5FX0wsIDB4MzcpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9FWFBPX0xJTkVfSCwgMHgwMSk7CisJfSBlbHNlIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4MDUpOworCQltc2xlZXAoMTAwKTsKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfQVVUT19BRENfQ0FMSUIsIDB4MDEpOworCQltc2xlZXAoMTAwKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDMpOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULCAweDAwKTsJLyogdmdhICovCisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1RF9ERU1PU0FJQ19DRkcsIDB4MDkpOworCQlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9FWFBPX0xJTkVfTCwgMHhjZik7CisJCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX0VYUE9fTElORV9ILCAweDAwKTsKKwl9CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfU1lTX0NUUkxfMCwgMHgwMSk7CisJYnVsa193KGdzcGNhX2RldiwgMHgwMywgY29sb3JfZ2FpbltTRU5TT1JfQ1gwMzQyXSwKKwkJCQlBUlJBWV9TSVpFKGNvbG9yX2dhaW5bMF0pKTsKKwlzZXRnYW1tYShnc3BjYV9kZXYpOworCXNldHF1YWxpdHkoZ3NwY2FfZGV2KTsKK30KKworLyogY29udmVydCB0aGUgZnJhbWUgcmF0ZSB0byBhIHRwNjh4MCB2YWx1ZSAqLworc3RhdGljIGludCBnZXRfZnJfaWR4KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGk7CisKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKSAtIDE7IGkrKykgeworCQkJaWYgKHNkLT5mcmFtZXJhdGUgPj0gcmF0ZXNbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJaSA9IDYgLSBpOwkJLyogMSA9IDVmcHMgLi4gNiA9IDMwZnBzICovCisKKwkJLyogNjQweDQ4MCAqIDMwIGZwcyBkb2VzIG5vdCB3b3JrICovCisJCWlmIChpID09IDYJCQkvKiBpZiAzMCBmcHMgKi8KKwkJICYmIGdzcGNhX2Rldi0+d2lkdGggPT0gNjQwKQorCQkJaSA9IDB4ODY7CQkvKiAxNSBmcHMgKi8KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlc182ODEwKSAtIDE7IGkrKykgeworCQkJaWYgKHNkLT5mcmFtZXJhdGUgPj0gcmF0ZXNfNjgxMFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpID0gNyAtIGk7CQkvKiAzID0gNWZwcyAuLiA3ID0gMzBmcHMgKi8KKworCQkvKiA2NDB4NDgwICogMzAgZnBzIGRvZXMgbm90IHdvcmsgKi8KKwkJaWYgKGkgPT0gNwkJCS8qIGlmIDMwIGZwcyAqLworCQkgJiYgZ3NwY2FfZGV2LT53aWR0aCA9PSA2NDApCisJCQlpID0gNjsJCQkvKiAxNSBmcHMgKi8KKwkJaSB8PSAweDgwOwkJCS8qIGNsb2NrICogMSAqLworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgc2V0ZnJhbWVyYXRlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJdTggZnJfaWR4OworCisJZnJfaWR4ID0gZ2V0X2ZyX2lkeChnc3BjYV9kZXYpOworCisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgxMCkgeworCQlyZWdfcihnc3BjYV9kZXYsIDB4N2IpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4N2IsCisJCQlzZC0+c2Vuc29yID09IFNFTlNPUl9DWDAzNDIgPyAweDEwIDogMHg5MCk7CisJCWlmIChzZC0+Y3RybHNbRVhQT1NVUkVdLnZhbCA+PSAxMjgpCisJCQlmcl9pZHggPSAweGYwOwkJLyogbG93ZXIgZnJhbWUgcmF0ZSAqLworCX0KKworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IzRl9GUkFNRV9SQVRFLCBmcl9pZHgpOworCisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX0NYMDM0MikKKwkJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfQVVUT19BRENfQ0FMSUIsIDB4MDEpOworfQorCitzdGF0aWMgdm9pZCBzZXRyZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCByZ2FpbjsKKworCXJnYWluID0gc2QtPmN0cmxzW1JHQUlOXS52YWw7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfUkFXX1JHQUlOX0gsIHJnYWluID4+IDgpOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19SR0FJTl9MLCByZ2Fpbik7CisJaTJjX3coZ3NwY2FfZGV2LCBDWDAzNDJfU1lTX0NUUkxfMCwgMHg4MCk7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfQ1gwMzQyKSB7CisJCXNkLT5jdHJsc1tCR0FJTl0udmFsID0gc2QtPmN0cmxzW0JHQUlOXS52YWwKKwkJCQkJKiB2YWwgLyBzZC0+Y3RybHNbR0FJTl0udmFsOworCQlpZiAoc2QtPmN0cmxzW0JHQUlOXS52YWwgPiA0MDk1KQorCQkJc2QtPmN0cmxzW0JHQUlOXS52YWwgPSA0MDk1OworCQlzZC0+Y3RybHNbUkdBSU5dLnZhbCA9IHNkLT5jdHJsc1tSR0FJTl0udmFsCisJCQkJCSogdmFsIC8gc2QtPmN0cmxzW0dBSU5dLnZhbDsKKwkJaWYgKHNkLT5jdHJsc1tSR0FJTl0udmFsID4gNDA5NSkKKwkJCXNkLT5jdHJsc1tSR0FJTl0udmFsID0gNDA5NTsKKwl9CisJc2QtPmN0cmxzW0dBSU5dLnZhbCA9IHZhbDsKKwlpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCisJCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2V0YmdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgYmdhaW47CisKKwliZ2FpbiA9IHNkLT5jdHJsc1tCR0FJTl0udmFsOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1JBV19CR0FJTl9ILCBiZ2FpbiA+PiA4KTsKKwlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9SQVdfQkdBSU5fTCwgYmdhaW4pOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX1NZU19DVFJMXzAsIDB4ODApOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBwcm9iZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2NvbmZpZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCXNkLT5icmlkZ2UgPSBpZC0+ZHJpdmVyX2luZm87CisKKwlnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZSA9IHZnYV9tb2RlOworCWdzcGNhX2Rldi0+Y2FtLm5tb2RlcyA9IEFSUkFZX1NJWkUodmdhX21vZGUpOworCWdzcGNhX2Rldi0+Y2FtLm1vZGVfZnJhbWVyYXRlcyA9IHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCA/CisJCQlmcmFtZXJhdGVzIDogZnJhbWVyYXRlc182ODEwOworCisJc2QtPmZyYW1lcmF0ZSA9IDMwOwkJLyogZGVmYXVsdDogMzAgZnBzICovCisJZ3NwY2FfZGV2LT5jYW0uY3RybHMgPSBzZC0+Y3RybHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLworc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgdHA2ODAwX3ByZWluaXRbXSA9IHsKKwkJe1RQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDF9LAkvKiBzaWYgKi8KKwkJe1RQNjgwMF9SMTFfU0lGX0NPTlRST0wsIDB4MDF9LAorCQl7VFA2ODAwX1IxNV9HUElPX1BVLCAweDlmfSwKKwkJe1RQNjgwMF9SMTZfR1BJT19QRCwgMHg5Zn0sCisJCXtUUDY4MDBfUjE3X0dQSU9fSU8sIDB4ODB9LAorCQl7VFA2ODAwX1IxOF9HUElPX0RBVEEsIDB4NDB9LAkvKiBMRUQgb2ZmICovCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCB0cDY4MTBfcHJlaW5pdFtdID0geworCQl7VFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDJmfSwKKwkJe1RQNjgwMF9SMTVfR1BJT19QVSwgMHg2Zn0sCisJCXtUUDY4MDBfUjE2X0dQSU9fUEQsIDB4NDB9LAorCQl7VFA2ODAwX1IxN19HUElPX0lPLCAweDlmfSwKKwkJe1RQNjgwMF9SMThfR1BJT19EQVRBLCAweGMxfSwJLyogTEVEIG9mZiAqLworCX07CisKKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MDBfcHJlaW5pdCwKKwkJCQlBUlJBWV9TSVpFKHRwNjgwMF9wcmVpbml0KSk7CisJZWxzZQorCQlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfcHJlaW5pdCwKKwkJCQlBUlJBWV9TSVpFKHRwNjgxMF9wcmVpbml0KSk7CisJbXNsZWVwKDE1KTsKKwlyZWdfcihnc3BjYV9kZXYsIFRQNjgwMF9SMThfR1BJT19EQVRBKTsKKwlQREVCVUcoRF9QUk9CRSwgImdwaW86ICUwMngiLCBnc3BjYV9kZXYtPnVzYl9idWZbMF0pOworLyogdmFsdWVzOgorICoJMHg4MDogc25hcHNob3QgYnV0dG9uCisgKgkweDQwOiBMRUQKKyAqCTB4MjA6IChicmlkZ2UgLyBzZW5zb3IpIHJlc2V0IGZvciB0cDY4MTAgPworICoJMHgwNzogc2Vuc29yIHR5cGUgPworICovCisKKwkvKiBndWVzcyB0aGUgc2Vuc29yIHR5cGUgKi8KKwlpZiAoZm9yY2Vfc2Vuc29yID49IDApIHsKKwkJc2QtPnNlbnNvciA9IGZvcmNlX3NlbnNvcjsKKwl9IGVsc2UgeworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKSB7CisvKmZpeG1lOiBub3Qgc3VyZSB0aGlzIGlzIHdvcmtpbmcqLworCQkJc3dpdGNoIChnc3BjYV9kZXYtPnVzYl9idWZbMF0gJiAweDA3KSB7CisJCQljYXNlIDA6CisJCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9TT0k3NjNBOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXNkLT5zZW5zb3IgPSBTRU5TT1JfQ1gwMzQyOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IHNlbnNvcjsKKworCQkJc2Vuc29yID0gcHJvYmVfNjgxMChnc3BjYV9kZXYpOworCQkJaWYgKHNlbnNvciA8IDApIHsKKwkJCQlwcl93YXJuKCJVbmtub3duIHNlbnNvciAlZCAtIGZvcmNlZCB0byBzb2k3NjNhXG4iLAorCQkJCQktc2Vuc29yKTsKKwkJCQlzZW5zb3IgPSBTRU5TT1JfU09JNzYzQTsKKwkJCX0KKwkJCXNkLT5zZW5zb3IgPSBzZW5zb3I7CisJCX0KKwl9CisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX1NPSTc2M0EpIHsKKwkJcHJfaW5mbygiU2Vuc29yIHNvaTc2M2FcbiIpOworCQlzZC0+Y3RybHNbR0FNTUFdLmRlZiA9IHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCA/IDAgOiAxOworCQlzZC0+Y3RybHNbR0FJTl0ubWF4ID0gMTU7CisJCXNkLT5jdHJsc1tHQUlOXS5kZWYgPSAzOworCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgUkdBSU4pIHwgKDEgPDwgQkdBSU4pOworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCQlzb2k3NjNhXzY4MTBfaW5pdChnc3BjYV9kZXYpOworI2lmIEFVVE9HQUlOX0RFRgorCQkJZ3NwY2FfZGV2LT5jdHJsX2luYWMgfD0gKDEgPDwgRVhQT1NVUkUpIHwgKDEgPDwgR0FJTik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWdzcGNhX2Rldi0+Y3RybF9kaXMgfD0gKDEgPDwgQVVUT0dBSU4pOworCQl9CisJfSBlbHNlIHsKKwkJcHJfaW5mbygiU2Vuc29yIGN4MDM0MlxuIik7CisJCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApIHsKKwkJCWN4MDM0Ml82ODEwX2luaXQoZ3NwY2FfZGV2KTsKKyNpZiBBVVRPR0FJTl9ERUYKKwkJCWdzcGNhX2Rldi0+Y3RybF9pbmFjIHw9ICgxIDw8IEVYUE9TVVJFKSB8ICgxIDw8IEdBSU4pOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlnc3BjYV9kZXYtPmN0cmxfZGlzIHw9ICgxIDw8IEFVVE9HQUlOKTsKKwkJfQorCX0KKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MTApCisJCXNkLT5jdHJsc1tRVUFMSVRZXS5kZWYgPSAwOwkvKiBhdXRvIHF1YWxpdHkgKi8KKwlzZXRfZHF0KGdzcGNhX2RldiwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBjaG9vc2luZyB0aGUgYWx0IHNldHRpbmcgKi8KK3N0YXRpYyBpbnQgc2RfaXNvY19pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgY3hfc2Vuc29yX2luaXRbXSA9IHsKKwkJe0NYMDM0Ml9BVVRPX0FEQ19DQUxJQiwgMHg4MX0sCisJCXtDWDAzNDJfRVhQT19MSU5FX0wsIDB4Mzd9LAorCQl7Q1gwMzQyX0VYUE9fTElORV9ILCAweDAxfSwKKwkJe0NYMDM0Ml9SQVdfR1JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19HQkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX1JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19CR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9TWVNfQ1RSTF8wLCAweDgxfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIGN4X2JyaWRnZV9pbml0W10gPSB7CisJCXsweDRkLCAweDAwfSwKKwkJezB4NGMsIDB4ZmZ9LAorCQl7MHg0ZSwgMHhmZn0sCisJCXsweDRmLCAweDAwfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIG92X3NlbnNvcl9pbml0W10gPSB7CisJCXsweDEwLCAweDc1fSwJCS8qIGV4cG9zdXJlICovCisJCXsweDc2LCAweDAzfSwKKwkJezB4MDAsIDB4MDB9LAkJLyogZ2FpbiAqLworCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgb3ZfYnJpZGdlX2luaXRbXSA9IHsKKwkJezB4N2IsIDB4OTB9LAorCQl7VFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDg3fSwKKwl9OworCisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkKKwkJcmV0dXJuIDA7CisJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX0NYMDM0MikgeworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHgyMCk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDg3KTsKKwkJaTJjX3dfYnVmKGdzcGNhX2RldiwgY3hfc2Vuc29yX2luaXQsCisJCQkJQVJSQVlfU0laRShjeF9zZW5zb3JfaW5pdCkpOworCQlyZWdfd19idWYoZ3NwY2FfZGV2LCBjeF9icmlkZ2VfaW5pdCwKKwkJCQlBUlJBWV9TSVpFKGN4X2JyaWRnZV9pbml0KSk7CisJCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDMsIGNvbG9yX251bGwsIHNpemVvZiBjb2xvcl9udWxsKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDU5LCAweDQwKTsKKwl9IGVsc2UgeworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SMTJfU0lGX0FERFJfUywgMHgyMSk7CisJCWkyY193X2J1Zihnc3BjYV9kZXYsIG92X3NlbnNvcl9pbml0LAorCQkJCUFSUkFZX1NJWkUob3Zfc2Vuc29yX2luaXQpKTsKKwkJcmVnX3IoZ3NwY2FfZGV2LCAweDdiKTsKKwkJcmVnX3dfYnVmKGdzcGNhX2Rldiwgb3ZfYnJpZGdlX2luaXQsCisJCQkJQVJSQVlfU0laRShvdl9icmlkZ2VfaW5pdCkpOworCX0KKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULAorCQkJZ3NwY2FfZGV2LT5jdXJyX21vZGUgPyAweDAwIDogMHgwMSk7CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2V0X2xlZChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIGludCBvbikKK3sKKwl1OCBkYXRhOworCisJcmVnX3IoZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSk7CisJZGF0YSA9IGdzcGNhX2Rldi0+dXNiX2J1ZlswXTsKKwlpZiAob24pCisJCWRhdGEgJj0gfjB4NDA7CisJZWxzZQorCQlkYXRhIHw9IDB4NDA7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjE4X0dQSU9fREFUQSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGN4MDM0Ml82ODAwX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCByZWdfaW5pdFtdID0geworLypmaXhtZTogaXMgdGhpcyB1c2VmdWxsPyovCisJCXtUUDY4MDBfUjE3X0dQSU9fSU8sIDB4OWZ9LAorCQl7VFA2ODAwX1IxNl9HUElPX1BELCAweDQwfSwKKwkJe1RQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDB9LAkvKiBpMmMgOCBiaXRzICovCisJCXtUUDY4MDBfUjUwLCAweDAwfSwKKwkJe1RQNjgwMF9SNTEsIDB4MDB9LAorCQl7VFA2ODAwX1I1MiwgMHhmZn0sCisJCXtUUDY4MDBfUjUzLCAweDAzfSwKKwkJe1RQNjgwMF9SNTRfREFSS19DRkcsIDB4MDd9LAorCQl7VFA2ODAwX1I1Q19FREdFX1RIUkxELCAweDQwfSwKKwkJe1RQNjgwMF9SN0FfQkxLX1RIUkxELCAweDQwfSwKKwkJe1RQNjgwMF9SMkZfVElNSU5HX0NGRywgMHgxN30sCisJCXtUUDY4MDBfUjMwX1NFTlNPUl9DRkcsIDB4MTh9LAkvKiBHMUIuLlJHMCAqLworCQl7VFA2ODAwX1IzN19GUk9OVF9EQVJLX1NULCAweDAwfSwKKwkJe1RQNjgwMF9SMzhfRlJPTlRfREFSS19FTkQsIDB4MDB9LAorCQl7VFA2ODAwX1IzOV9SRUFSX0RBUktfU1RfTCwgMHgwMH0sCisJCXtUUDY4MDBfUjNBX1JFQVJfREFSS19TVF9ILCAweDAwfSwKKwkJe1RQNjgwMF9SM0JfUkVBUl9EQVJLX0VORF9MLCAweDAwfSwKKwkJe1RQNjgwMF9SM0NfUkVBUl9EQVJLX0VORF9ILCAweDAwfSwKKwkJe1RQNjgwMF9SM0RfSE9SSVpfREFSS19MSU5FX0wsIDB4MDB9LAorCQl7VFA2ODAwX1IzRV9IT1JJWl9EQVJLX0xJTkVfSCwgMHgwMH0sCisJCXtUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDN9LAorCisJCXtUUDY4MDBfUjMxX1BJWEVMX1NUQVJULCAweDBifSwKKwkJe1RQNjgwMF9SMzJfUElYRUxfRU5EX0wsIDB4OGF9LAorCQl7VFA2ODAwX1IzM19QSVhFTF9FTkRfSCwgMHgwMn0sCisJCXtUUDY4MDBfUjM0X0xJTkVfU1RBUlQsIDB4MGV9LAorCQl7VFA2ODAwX1IzNV9MSU5FX0VORF9MLCAweGY0fSwKKwkJe1RQNjgwMF9SMzZfTElORV9FTkRfSCwgMHgwMX0sCisJCXtUUDY4MDBfUjc4X0ZPUk1BVCwgMHgwMH0sCisJCXtUUDY4MDBfUjEyX1NJRl9BRERSX1MsIDB4MjB9LAkvKiBjeDAzNDIgaTJjIGFkZHIgKi8KKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHNlbnNvcl9pbml0W10gPSB7CisJCXtDWDAzNDJfT1VUUFVUX0NUUkwsIDB4MDd9LAorCQl7Q1gwMzQyX0JZUEFTU19NT0RFLCAweDU4fSwKKwkJe0NYMDM0Ml9HUFhMVEhEX0wsIDB4MTZ9LAorCQl7Q1gwMzQyX1JCUFhMVEhEX0wsIDB4MTZ9LAorCQl7Q1gwMzQyX1BMQU5FVEhEX0wsIDB4YzB9LAorCQl7Q1gwMzQyX1BMQU5FVEhEX0gsIDB4MDN9LAorCQl7Q1gwMzQyX1JCX0dBUF9MLCAweGZmfSwKKwkJe0NYMDM0Ml9SQl9HQVBfSCwgMHgwN30sCisJCXtDWDAzNDJfR19HQVBfTCwgMHhmZn0sCisJCXtDWDAzNDJfR19HQVBfSCwgMHgwN30sCisJCXtDWDAzNDJfUlNUX09WRVJGTE9XX0wsIDB4NWN9LAorCQl7Q1gwMzQyX1JTVF9PVkVSRkxPV19ILCAweDAxfSwKKwkJe0NYMDM0Ml9EQVRBX09WRVJGTE9XX0wsIDB4ZmN9LAorCQl7Q1gwMzQyX0RBVEFfT1ZFUkZMT1dfSCwgMHgwM30sCisJCXtDWDAzNDJfREFUQV9VTkRFUkZMT1dfTCwgMHgwMH0sCisJCXtDWDAzNDJfREFUQV9VTkRFUkZMT1dfSCwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHg0MH0sCisJCXtDWDAzNDJfR0xPQkFMX0dBSU4sIDB4MDF9LAorCQl7Q1gwMzQyX0NMT0NLX0dFTiwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHgwMn0sCisJCXtDWDAzNDJfSURMRV9DVFJMLCAweDA1fSwKKwkJe0NYMDM0Ml9BRENHTiwgMHgwMH0sCisJCXtDWDAzNDJfQURDX0NUTCwgMHgwMH0sCisJCXtDWDAzNDJfTFZSU1RfQkxCSUFTLCAweDAxfSwKKwkJe0NYMDM0Ml9WVEhTRUwsIDB4MGJ9LAorCQl7Q1gwMzQyX1JBTVBfUklWLCAweDBifSwKKwkJe0NYMDM0Ml9MRE9TRUwsIDB4MDd9LAorCQl7Q1gwMzQyX1NQVl9WQUxVRV9MLCAweDQwfSwKKwkJe0NYMDM0Ml9TUFZfVkFMVUVfSCwgMHgwMn0sCisJfTsKKworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHJlZ19pbml0LCBBUlJBWV9TSVpFKHJlZ19pbml0KSk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXQsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXQpKTsKKwlpMmNfd19idWYoZ3NwY2FfZGV2LCBjeDAzNDJfdGltaW5nX3NlcSwgQVJSQVlfU0laRShjeDAzNDJfdGltaW5nX3NlcSkpOworCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I1Q19FREdFX1RIUkxELCAweDEwKTsKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNTRfREFSS19DRkcsIDB4MDApOworCWkyY193KGdzcGNhX2RldiwgQ1gwMzQyX0VYUE9fTElORV9ILCAweDAwKTsKKwlpMmNfdyhnc3BjYV9kZXYsIENYMDM0Ml9TWVNfQ1RSTF8wLCAweDAxKTsKKwlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCXNldF9sZWQoZ3NwY2FfZGV2LCAxKTsKKwlzZXRfcmVzb2x1dGlvbihnc3BjYV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBjeDAzNDJfNjgxMF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRfMltdID0geworCQl7Q1gwMzQyX0VYUE9fTElORV9MLCAweDZmfSwKKwkJe0NYMDM0Ml9FWFBPX0xJTkVfSCwgMHgwMn0sCisJCXtDWDAzNDJfUkFXX0dSR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfR0JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1JBV19SR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfQkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfU1lTX0NUUkxfMCwgMHg4MX0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBicmlkZ2VfaW5pdF8yW10gPSB7CisJCXsweDRkLCAweDAwfSwKKwkJezB4NGMsIDB4ZmZ9LAorCQl7MHg0ZSwgMHhmZn0sCisJCXsweDRmLCAweDAwfSwKKwkJe1RQNjgwMF9SN0FfQkxLX1RIUkxELCAweDAwfSwKKwkJe1RQNjgwMF9SNzlfUVVBTElUWSwgMHgwNH0sCisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgYnJpZGdlX2luaXRfM1tdID0geworCQl7VFA2ODAwX1IzMV9QSVhFTF9TVEFSVCwgMHgwOH0sCisJCXtUUDY4MDBfUjMyX1BJWEVMX0VORF9MLCAweDg3fSwKKwkJe1RQNjgwMF9SMzNfUElYRUxfRU5EX0gsIDB4MDJ9LAorCQl7VFA2ODAwX1IzNF9MSU5FX1NUQVJULCAweDBlfSwKKwkJe1RQNjgwMF9SMzVfTElORV9FTkRfTCwgMHhmNH0sCisJCXtUUDY4MDBfUjM2X0xJTkVfRU5EX0gsIDB4MDF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRfM1tdID0geworCQl7Q1gwMzQyX0FVVE9fQURDX0NBTElCLCAweDgxfSwKKwkJe0NYMDM0Ml9FWFBPX0xJTkVfTCwgMHg2Zn0sCisJCXtDWDAzNDJfRVhQT19MSU5FX0gsIDB4MDJ9LAorCQl7Q1gwMzQyX1JBV19HUkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX0dCR0FJTl9MLCAweDAwfSwKKwkJe0NYMDM0Ml9SQVdfUkdBSU5fTCwgMHgwMH0sCisJCXtDWDAzNDJfUkFXX0JHQUlOX0wsIDB4MDB9LAorCQl7Q1gwMzQyX1NZU19DVFJMXzAsIDB4ODF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgYnJpZGdlX2luaXRfNVtdID0geworCQl7MHg0ZCwgMHgwMH0sCisJCXsweDRjLCAweGZmfSwKKwkJezB4NGUsIDB4ZmZ9LAorCQl7MHg0ZiwgMHgwMH0sCisJfTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBzZW5zb3JfaW5pdF80W10gPSB7CisJCXtDWDAzNDJfRVhQT19MSU5FX0wsIDB4ZDN9LAorCQl7Q1gwMzQyX0VYUE9fTElORV9ILCAweDAxfSwKKy8qZml4bWU6IGdhaW5zLCBidXQgMDAuLjgwIG9ubHkqLworCQl7Q1gwMzQyX1JBV19HUkdBSU5fTCwgMHg0MH0sCisJCXtDWDAzNDJfUkFXX0dCR0FJTl9MLCAweDQwfSwKKwkJe0NYMDM0Ml9SQVdfUkdBSU5fTCwgMHg0MH0sCisJCXtDWDAzNDJfUkFXX0JHQUlOX0wsIDB4NDB9LAorCQl7Q1gwMzQyX1NZU19DVFJMXzAsIDB4ODF9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbWQgc2Vuc29yX2luaXRfNVtdID0geworCQl7Q1gwMzQyX0lETEVfQ1RSTCwgMHgwNX0sCisJCXtDWDAzNDJfQURDR04sIDB4MDB9LAorCQl7Q1gwMzQyX0FEQ19DVEwsIDB4MDB9LAorCQl7Q1gwMzQyX0xWUlNUX0JMQklBUywgMHgwMX0sCisJCXtDWDAzNDJfVlRIU0VMLCAweDBifSwKKwkJe0NYMDM0Ml9SQU1QX1JJViwgMHgwYn0sCisJCXtDWDAzNDJfTERPU0VMLCAweDA3fSwKKwkJe0NYMDM0Ml9TUFZfVkFMVUVfTCwgMHg0MH0sCisJCXtDWDAzNDJfU1BWX1ZBTFVFX0gsIDB4MDJ9LAorCQl7Q1gwMzQyX0FVVE9fQURDX0NBTElCLCAweDgxfSwKKwl9OworCisJcmVnX3coZ3NwY2FfZGV2LCAweDIyLCBnc3BjYV9kZXYtPmFsdCk7CisJaTJjX3dfYnVmKGdzcGNhX2Rldiwgc2Vuc29yX2luaXRfMiwgQVJSQVlfU0laRShzZW5zb3JfaW5pdF8yKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfMiwgQVJSQVlfU0laRShicmlkZ2VfaW5pdF8yKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgdHA2ODEwX2N4X2luaXRfY29tbW9uLAorCQkJQVJSQVlfU0laRSh0cDY4MTBfY3hfaW5pdF9jb21tb24pKTsKKwlyZWdfd19idWYoZ3NwY2FfZGV2LCBicmlkZ2VfaW5pdF8zLCBBUlJBWV9TSVpFKGJyaWRnZV9pbml0XzMpKTsKKwlpZiAoZ3NwY2FfZGV2LT5jdXJyX21vZGUpIHsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDRhLCAweDdmKTsKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDA3LCAweDA1KTsKKwkJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjc4X0ZPUk1BVCwgMHgwMCk7CS8qIHZnYSAqLworCX0gZWxzZSB7CisJCXJlZ193KGdzcGNhX2RldiwgMHg0YSwgMHhmZik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwNywgMHg4NSk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDEpOwkvKiBxdmdhICovCisJfQorCXNldGdhbW1hKGdzcGNhX2Rldik7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgdHA2ODEwX2JyaWRnZV9zdGFydCwKKwkJCUFSUkFZX1NJWkUodHA2ODEwX2JyaWRnZV9zdGFydCkpOworCXNldHNoYXJwbmVzcyhnc3BjYV9kZXYpOworCWJ1bGtfdyhnc3BjYV9kZXYsIDB4MDMsIGNvbG9yX2dhaW5bU0VOU09SX0NYMDM0Ml0sCisJCQkJQVJSQVlfU0laRShjb2xvcl9nYWluWzBdKSk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4ODcpOworCWkyY193X2J1Zihnc3BjYV9kZXYsIHNlbnNvcl9pbml0XzMsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXRfMykpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIGJyaWRnZV9pbml0XzUsIEFSUkFZX1NJWkUoYnJpZGdlX2luaXRfNSkpOworCWkyY193X2J1Zihnc3BjYV9kZXYsIHNlbnNvcl9pbml0XzQsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXRfNCkpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIGJyaWRnZV9pbml0XzUsIEFSUkFZX1NJWkUoYnJpZGdlX2luaXRfNSkpOworCWkyY193X2J1Zihnc3BjYV9kZXYsIHNlbnNvcl9pbml0XzUsIEFSUkFZX1NJWkUoc2Vuc29yX2luaXRfNSkpOworCisJc2V0X2xlZChnc3BjYV9kZXYsIDEpOworLyoJc2V0cXVhbGl0eShnc3BjYV9kZXYpOyAqLworfQorCitzdGF0aWMgdm9pZCBzb2k3NjNhXzY4MDBfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHJlZ19pbml0W10gPSB7CisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDR9LAorCQl7VFA2ODAwX1I3OV9RVUFMSVRZLCAweDAxfSwKKwkJe1RQNjgwMF9SMTBfU0lGX1RZUEUsIDB4MDB9LAkvKiBpMmMgOCBiaXRzICovCisKKwkJe1RQNjgwMF9SNTAsIDB4MDB9LAorCQl7VFA2ODAwX1I1MSwgMHgwMH0sCisJCXtUUDY4MDBfUjUyLCAweGZmfSwKKwkJe1RQNjgwMF9SNTMsIDB4MDN9LAorCQl7VFA2ODAwX1I1NF9EQVJLX0NGRywgMHgwN30sCisJCXtUUDY4MDBfUjVDX0VER0VfVEhSTEQsIDB4NDB9LAorCisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDN9LAorCQl7VFA2ODAwX1I3QV9CTEtfVEhSTEQsIDB4NDB9LAorCisJCXtUUDY4MDBfUjJGX1RJTUlOR19DRkcsIDB4NDZ9LAorCQl7VFA2ODAwX1IzMF9TRU5TT1JfQ0ZHLCAweDEwfSwJLyogQkcxLi5HMFIgKi8KKwkJe1RQNjgwMF9SMzdfRlJPTlRfREFSS19TVCwgMHgwMH0sCisJCXtUUDY4MDBfUjM4X0ZST05UX0RBUktfRU5ELCAweDAwfSwKKwkJe1RQNjgwMF9SMzlfUkVBUl9EQVJLX1NUX0wsIDB4MDB9LAorCQl7VFA2ODAwX1IzQV9SRUFSX0RBUktfU1RfSCwgMHgwMH0sCisJCXtUUDY4MDBfUjNCX1JFQVJfREFSS19FTkRfTCwgMHgwMH0sCisJCXtUUDY4MDBfUjNDX1JFQVJfREFSS19FTkRfSCwgMHgwMH0sCisJCXtUUDY4MDBfUjNEX0hPUklaX0RBUktfTElORV9MLCAweDAwfSwKKwkJe1RQNjgwMF9SM0VfSE9SSVpfREFSS19MSU5FX0gsIDB4MDB9LAorCQl7VFA2ODAwX1IyMV9FTkRQXzFfQ1RMLCAweDAzfSwKKworCQl7VFA2ODAwX1IzRl9GUkFNRV9SQVRFLCAweDA0fSwJLyogMTUgZnBzICovCisJCXtUUDY4MDBfUjVEX0RFTU9TQUlDX0NGRywgMHgwZX0sIC8qIHNjYWxlIGRvd24gLSBtZWRpdW0gZWRnZSAqLworCisJCXtUUDY4MDBfUjMxX1BJWEVMX1NUQVJULCAweDFifSwKKwkJe1RQNjgwMF9SMzJfUElYRUxfRU5EX0wsIDB4OWF9LAorCQl7VFA2ODAwX1IzM19QSVhFTF9FTkRfSCwgMHgwMn0sCisJCXtUUDY4MDBfUjM0X0xJTkVfU1RBUlQsIDB4MGZ9LAorCQl7VFA2ODAwX1IzNV9MSU5FX0VORF9MLCAweGY0fSwKKwkJe1RQNjgwMF9SMzZfTElORV9FTkRfSCwgMHgwMX0sCisJCXtUUDY4MDBfUjc4X0ZPUk1BVCwgMHgwMX0sCS8qIHF2Z2EgKi8KKwkJe1RQNjgwMF9SMTJfU0lGX0FERFJfUywgMHgyMX0sCS8qIHNvaTc2M2EgaTJjIGFkZHIgKi8KKwkJe1RQNjgwMF9SMUFfU0lGX1RYX0RBVEEyLCAweDAwfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIHNlbnNvcl9pbml0W10gPSB7CisJCXsweDEyLCAweDQ4fSwJCS8qIG1pcnJvciAtIFJHQiAqLworCQl7MHgxMywgMHhhMH0sCQkvKiBjbG9jayAtIG5vIEFHQyBub3IgQUVDICovCisJCXsweDAzLCAweGE0fSwJCS8qIHNhdHVyYXRpb24gKi8KKwkJezB4MDQsIDB4MzB9LAkJLyogaHVlICovCisJCXsweDA1LCAweDg4fSwJCS8qIGNvbnRyYXN0ICovCisJCXsweDA2LCAweDYwfSwJCS8qIGJyaWdodG5lc3MgKi8KKwkJezB4MTAsIDB4NDF9LAkJLyogQUVDICovCisJCXsweDExLCAweDQwfSwJCS8qIGNsb2NrIHJhdGUgKi8KKwkJezB4MTMsIDB4YTB9LAorCQl7MHgxNCwgMHgwMH0sCQkvKiA2NDB4NDgwICovCisJCXsweDE1LCAweDE0fSwKKwkJezB4MWYsIDB4NDF9LAorCQl7MHgyMCwgMHg4MH0sCisJCXsweDIzLCAweGVlfSwKKwkJezB4MjQsIDB4NTB9LAorCQl7MHgyNSwgMHg3YX0sCisJCXsweDI2LCAweDAwfSwKKwkJezB4MjcsIDB4ZTJ9LAorCQl7MHgyOCwgMHhiMH0sCisJCXsweDJhLCAweDAwfSwKKwkJezB4MmIsIDB4MDB9LAorCQl7MHgyZCwgMHg4MX0sCisJCXsweDJmLCAweDlkfSwKKwkJezB4NjAsIDB4ODB9LAorCQl7MHg2MSwgMHgwMH0sCisJCXsweDYyLCAweDg4fSwKKwkJezB4NjMsIDB4MTF9LAorCQl7MHg2NCwgMHg4OX0sCisJCXsweDY1LCAweDAwfSwKKwkJezB4NjcsIDB4OTR9LAorCQl7MHg2OCwgMHg3YX0sCisJCXsweDY5LCAweDBmfSwKKwkJezB4NmMsIDB4ODB9LAorCQl7MHg2ZCwgMHg4MH0sCisJCXsweDZlLCAweDgwfSwKKwkJezB4NmYsIDB4ZmZ9LAorCQl7MHg3MSwgMHgyMH0sCisJCXsweDc0LCAweDIwfSwKKwkJezB4NzUsIDB4ODZ9LAorCQl7MHg3NywgMHhiNX0sCisJCXsweDE3LCAweDE4fSwJCS8qIEggaHJlZiBzdGFydCAqLworCQl7MHgxOCwgMHhiZn0sCQkvKiBIIGhyZWYgZW5kICovCisJCXsweDE5LCAweDAzfSwJCS8qIFYgc3RhcnQgKi8KKwkJezB4MWEsIDB4Zjh9LAkJLyogViBlbmQgKi8KKwkJezB4MDEsIDB4ODB9LAkJLyogYmx1ZSBnYWluICovCisJCXsweDAyLCAweDgwfSwJCS8qIHJlZCBnYWluICovCisJfTsKKworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHJlZ19pbml0LCBBUlJBWV9TSVpFKHJlZ19pbml0KSk7CisKKwlpMmNfdyhnc3BjYV9kZXYsIDB4MTIsIDB4ODApOwkJLyogc2Vuc29yIHJlc2V0ICovCisJbXNsZWVwKDEwKTsKKworCWkyY193X2J1Zihnc3BjYV9kZXYsIHNlbnNvcl9pbml0LCBBUlJBWV9TSVpFKHNlbnNvcl9pbml0KSk7CisKKwlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNUNfRURHRV9USFJMRCwgMHgxMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjU0X0RBUktfQ0ZHLCAweDAwKTsKKworCXNldHNoYXJwbmVzcyhnc3BjYV9kZXYpOworCisJYnVsa193KGdzcGNhX2RldiwgMHgwMywgY29sb3JfZ2FpbltTRU5TT1JfU09JNzYzQV0sCisJCQkJQVJSQVlfU0laRShjb2xvcl9nYWluWzBdKSk7CisKKwlzZXRfbGVkKGdzcGNhX2RldiwgMSk7CisJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlzZXRxdWFsaXR5KGdzcGNhX2Rldik7CisJc2V0Z2FtbWEoZ3NwY2FfZGV2KTsKK30KKworc3RhdGljIHZvaWQgc29pNzYzYV82ODEwX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGNtZCBicmlkZ2VfaW5pdF8yW10gPSB7CisJCXtUUDY4MDBfUjdBX0JMS19USFJMRCwgMHgwMH0sCisJCXtUUDY4MDBfUjc5X1FVQUxJVFksIDB4MDR9LAorCQl7VFA2ODAwX1I3OV9RVUFMSVRZLCAweDAxfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIGJyaWRnZV9pbml0XzNbXSA9IHsKKwkJe1RQNjgwMF9SMzFfUElYRUxfU1RBUlQsIDB4MjB9LAorCQl7VFA2ODAwX1IzMl9QSVhFTF9FTkRfTCwgMHg5Zn0sCisJCXtUUDY4MDBfUjMzX1BJWEVMX0VORF9ILCAweDAyfSwKKwkJe1RQNjgwMF9SMzRfTElORV9TVEFSVCwgMHgxM30sCisJCXtUUDY4MDBfUjM1X0xJTkVfRU5EX0wsIDB4Zjh9LAorCQl7VFA2ODAwX1IzNl9MSU5FX0VORF9ILCAweDAxfSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgY21kIGJyaWRnZV9pbml0XzZbXSA9IHsKKwkJezB4MDgsIDB4ZmZ9LAorCQl7MHgwOSwgMHhmZn0sCisJCXsweDBhLCAweDVmfSwKKwkJezB4MGIsIDB4ODB9LAorCX07CisKKwlyZWdfdyhnc3BjYV9kZXYsIDB4MjIsIGdzcGNhX2Rldi0+YWx0KTsKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAzLCBjb2xvcl9udWxsLCBzaXplb2YgY29sb3JfbnVsbCk7CisJcmVnX3coZ3NwY2FfZGV2LCAweDU5LCAweDQwKTsKKwlzZXRleHBvc3VyZShnc3BjYV9kZXYpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIGJyaWRnZV9pbml0XzIsIEFSUkFZX1NJWkUoYnJpZGdlX2luaXRfMikpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgxMF9vdl9pbml0X2NvbW1vbiwKKwkJCUFSUkFZX1NJWkUodHA2ODEwX292X2luaXRfY29tbW9uKSk7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfMywgQVJSQVlfU0laRShicmlkZ2VfaW5pdF8zKSk7CisJaWYgKGdzcGNhX2Rldi0+Y3Vycl9tb2RlKSB7CisJCXJlZ193KGdzcGNhX2RldiwgMHg0YSwgMHg3Zik7CisJCXJlZ193KGdzcGNhX2RldiwgMHgwNywgMHgwNSk7CisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1I3OF9GT1JNQVQsIDB4MDApOwkvKiB2Z2EgKi8KKwl9IGVsc2UgeworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NGEsIDB4ZmYpOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4MDcsIDB4ODUpOworCQlyZWdfdyhnc3BjYV9kZXYsIFRQNjgwMF9SNzhfRk9STUFULCAweDAxKTsJLyogcXZnYSAqLworCX0KKwlzZXRnYW1tYShnc3BjYV9kZXYpOworCXJlZ193X2J1Zihnc3BjYV9kZXYsIHRwNjgxMF9icmlkZ2Vfc3RhcnQsCisJCQlBUlJBWV9TSVpFKHRwNjgxMF9icmlkZ2Vfc3RhcnQpKTsKKworCWlmIChnc3BjYV9kZXYtPmN1cnJfbW9kZSkgeworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NGYsIDB4MDApOworCQlyZWdfdyhnc3BjYV9kZXYsIDB4NGUsIDB4N2MpOworCX0KKworCXJlZ193KGdzcGNhX2RldiwgMHgwMCwgMHgwMCk7CisKKwlzZXRzaGFycG5lc3MoZ3NwY2FfZGV2KTsKKwlidWxrX3coZ3NwY2FfZGV2LCAweDAzLCBjb2xvcl9nYWluW1NFTlNPUl9TT0k3NjNBXSwKKwkJCQlBUlJBWV9TSVpFKGNvbG9yX2dhaW5bMF0pKTsKKwlzZXRfbGVkKGdzcGNhX2RldiwgMSk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjNGX0ZSQU1FX1JBVEUsIDB4ZjApOworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJcmVnX3dfYnVmKGdzcGNhX2RldiwgYnJpZGdlX2luaXRfNiwgQVJSQVlfU0laRShicmlkZ2VfaW5pdF82KSk7Cit9CisKKy8qIC0tIHN0YXJ0IHRoZSBjYW1lcmEgLS0gKi8KK3N0YXRpYyBpbnQgc2Rfc3RhcnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWpwZWdfZGVmaW5lKHNkLT5qcGVnX2hkciwgZ3NwY2FfZGV2LT5oZWlnaHQsIGdzcGNhX2Rldi0+d2lkdGgpOworCXNldF9kcXQoZ3NwY2FfZGV2LCBzZC0+cXVhbGl0eSk7CisJaWYgKHNkLT5icmlkZ2UgPT0gQlJJREdFX1RQNjgwMCkgeworCQlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfQ1gwMzQyKQorCQkJY3gwMzQyXzY4MDBfc3RhcnQoZ3NwY2FfZGV2KTsKKwkJZWxzZQorCQkJc29pNzYzYV82ODAwX3N0YXJ0KGdzcGNhX2Rldik7CisJfSBlbHNlIHsKKwkJaWYgKHNkLT5zZW5zb3IgPT0gU0VOU09SX0NYMDM0MikKKwkJCWN4MDM0Ml82ODEwX3N0YXJ0KGdzcGNhX2Rldik7CisJCWVsc2UKKwkJCXNvaTc2M2FfNjgxMF9zdGFydChnc3BjYV9kZXYpOworCQlyZWdfd19idWYoZ3NwY2FfZGV2LCB0cDY4MTBfbGF0ZV9zdGFydCwKKwkJCQlBUlJBWV9TSVpFKHRwNjgxMF9sYXRlX3N0YXJ0KSk7CisJCXJlZ193KGdzcGNhX2RldiwgMHg4MCwgMHgwMyk7CisJCXJlZ193KGdzcGNhX2RldiwgMHg4MiwgZ3NwY2FfZGV2LT5jdXJyX21vZGUgPyAweDBhIDogMHgwZSk7CisKKwkJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwkJc2V0cXVhbGl0eShnc3BjYV9kZXYpOworCQlzZXRhdXRvZ2Fpbihnc3BjYV9kZXYpOworCX0KKworCXNldGZyYW1lcmF0ZShnc3BjYV9kZXYpOworCisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChzZC0+YnJpZGdlID09IEJSSURHRV9UUDY4MDApCisJCXJlZ193KGdzcGNhX2RldiwgVFA2ODAwX1IyRl9USU1JTkdfQ0ZHLCAweDAzKTsKKwlzZXRfbGVkKGdzcGNhX2RldiwgMCk7CisJcmVnX3coZ3NwY2FfZGV2LCBUUDY4MDBfUjIxX0VORFBfMV9DVEwsIDB4MDApOworfQorCitzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQl1OCAqZGF0YSwKKwkJCWludCBsZW4pCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJLyogdGhlIHN0YXJ0IG9mIGZyYW1lIGNvbnRhaW5zOgorCSAqCWZmIGQ4CisJICoJZmYgZmUKKwkgKgl3aWR0aCAvIDE2CisJICoJaGVpZ2h0IC8gOAorCSAqCXF1YWxpdHkKKwkgKi8KKwlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCWlmICgqZGF0YSAhPSAweDVhKSB7CisvKmZpeG1lOiBkb24ndCBkaXNjYXJkIHRoZSB3aG9sZSBmcmFtZS4uKi8KKwkJCWlmICgqZGF0YSA9PSAweGFhIHx8ICpkYXRhID09IDB4MDApCisJCQkJcmV0dXJuOworCQkJaWYgKCpkYXRhID4gMHhjMCkgeworCQkJCVBERUJVRyhEX0ZSQU0sICJiYWQgZnJhbWUiKTsKKwkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBESVNDQVJEX1BBQ0tFVDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZGF0YSsrOworCQlsZW4tLTsKKwkJaWYgKCpkYXRhID09IDB4ZmYgJiYgZGF0YVsxXSA9PSAweGQ4KSB7CisvKmZpeG1lOiB0aGVyZSBtYXkgYmUgaW5mb3JtYXRpb24gaW4gdGhlIDQgaGlnaCBiaXRzKi8KKwkJCWlmICgoZGF0YVs2XSAmIDB4MGYpICE9IHNkLT5xdWFsaXR5KQorCQkJCXNldF9kcXQoZ3NwY2FfZGV2LCBkYXRhWzZdICYgMHgwZik7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCisJCQkJCXNkLT5qcGVnX2hkciwgSlBFR19IRFJfU1opOworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAorCQkJCQlkYXRhICsgNywgbGVuIC0gNyk7CisJCX0gZWxzZSBpZiAoZGF0YVtsZW4gLSAyXSA9PSAweGZmICYmIGRhdGFbbGVuIC0gMV0gPT0gMHhkOSkgeworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsCisJCQkJCWRhdGEsIGxlbik7CisJCX0gZWxzZSB7CisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCisJCQkJCWRhdGEsIGxlbik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoKmRhdGEpIHsKKwljYXNlIDB4NTU6CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBkYXRhLCAwKTsKKworCQlpZiAobGVuIDwgOAorCQkgfHwgZGF0YVsxXSAhPSAweGZmIHx8IGRhdGFbMl0gIT0gMHhkOAorCQkgfHwgZGF0YVszXSAhPSAweGZmIHx8IGRhdGFbNF0gIT0gMHhmZSkgeworCisJCQkvKiBIYXZlIG9ubHkgc2VlbiB0aGlzIHdpdGggY29ycnVwdCBmcmFtZXMgKi8KKwkJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOworCQkJcmV0dXJuOworCQl9CisJCWlmIChkYXRhWzddICE9IHNkLT5xdWFsaXR5KQorCQkJc2V0X2RxdChnc3BjYV9kZXYsIGRhdGFbN10pOworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsCisJCQkJc2QtPmpwZWdfaGRyLCBKUEVHX0hEUl9TWik7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwKKwkJCQlkYXRhICsgOCwgbGVuIC0gOCk7CisJCWJyZWFrOworCWNhc2UgMHhhYToKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCWJyZWFrOworCWNhc2UgMHhjYzoKKwkJaWYgKGRhdGFbMV0gIT0gMHhmZiB8fCBkYXRhWzJdICE9IDB4ZDgpCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCisJCQkJCWRhdGEgKyAxLCBsZW4gLSAxKTsKKwkJZWxzZQorCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCWJyZWFrOworCX0KK30KKworLyogLS0gZG8gYXV0b2dhaW4gLS0gKi8KKy8qIGdhaW4gc2V0dGluZyBpcyBkb25lIGluIHNldGV4cG9zdXJlKCkgZm9yIHRwNjgxMCAqLworc3RhdGljIHZvaWQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpIHt9CisvKiAhISBjb2Fyc2VfZ3JhaW5lZF9leHBvX2F1dG9nYWluIGlzIG5vdCB1c2VkICEhICovCisjZGVmaW5lIGV4cF90b29fbG93X2NudCBicmlkZ2UKKyNkZWZpbmUgZXhwX3Rvb19oaWdoX2NudCBzZW5zb3IKKworI2luY2x1ZGUgImF1dG9nYWluX2Z1bmN0aW9ucy5oIgorc3RhdGljIHZvaWQgc2RfZHFfY2FsbGJhY2soc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwlpbnQgcmV0LCBhbGVuOworCWludCBsdW1hLCBleHBvOworCisJaWYgKHNkLT5hZ19jbnQgPCAwKQorCQlyZXR1cm47CisJaWYgKC0tc2QtPmFnX2NudCA+IDUpCisJCXJldHVybjsKKwlzd2l0Y2ggKHNkLT5hZ19jbnQpIHsKKy8qCWNhc2UgNTogKi8KKwlkZWZhdWx0OgorCQlyZWdfdyhnc3BjYV9kZXYsIDB4N2QsIDB4MDApOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlZ193KGdzcGNhX2RldiwgMHgyNywgMHhiMCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDBjLCAweDAxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXQgPSB1c2JfYnVsa19tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkJdXNiX3JjdmJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LCAweDAyKSwKKwkJCQlnc3BjYV9kZXYtPnVzYl9idWYsCisJCQkJMzIsCisJCQkJJmFsZW4sCisJCQkJNTAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiYnVsayBlcnIgJWRcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCQkvKiB2YWx1ZXMgbm90IHVzZWQgKHVua25vd24pICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVnX3coZ3NwY2FfZGV2LCAweDI3LCAweGQwKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlyZXQgPSB1c2JfYnVsa19tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkJdXNiX3JjdmJ1bGtwaXBlKGdzcGNhX2Rldi0+ZGV2LCAweDAyKSwKKwkJCQlnc3BjYV9kZXYtPnVzYl9idWYsCisJCQkJMzIsCisJCQkJJmFsZW4sCisJCQkJNTAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiYnVsayBlcnIgJWRcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCQlsdW1hID0gKChnc3BjYV9kZXYtPnVzYl9idWZbOF0gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbN10gKworCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsxMV0gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbMTBdICsKKwkJCShnc3BjYV9kZXYtPnVzYl9idWZbMTRdIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzEzXSArCisJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzE3XSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlsxNl0gKworCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsyMF0gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbMTldICsKKwkJCShnc3BjYV9kZXYtPnVzYl9idWZbMjNdIDw8IDgpICsgZ3NwY2FfZGV2LT51c2JfYnVmWzIyXSArCisJCQkoZ3NwY2FfZGV2LT51c2JfYnVmWzI2XSA8PCA4KSArIGdzcGNhX2Rldi0+dXNiX2J1ZlsyNV0gKworCQkJKGdzcGNhX2Rldi0+dXNiX2J1ZlsyOV0gPDwgOCkgKyBnc3BjYV9kZXYtPnVzYl9idWZbMjhdKQorCQkJCS8gODsKKwkJaWYgKGdzcGNhX2Rldi0+d2lkdGggPT0gNjQwKQorCQkJbHVtYSAvPSA0OworCQlyZWdfdyhnc3BjYV9kZXYsIDB4N2QsIDB4MDApOworCisJCWV4cG8gPSBzZC0+Y3RybHNbRVhQT1NVUkVdLnZhbDsKKwkJcmV0ID0gYXV0b19nYWluX25fZXhwb3N1cmUoZ3NwY2FfZGV2LCBsdW1hLAorCQkJCTYwLAkvKiBkZXNpcmVkIGx1bWEgKi8KKwkJCQk2LAkvKiBkZWFkIHpvbmUgKi8KKwkJCQkyLAkvKiBnYWluIGtuZWUgKi8KKwkJCQk3MCk7CS8qIGV4cG8ga25lZSAqLworCQlzZC0+YWdfY250ID0gQUdfQ05UX1NUQVJUOworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODEwKSB7CisJCQlpZiAoKGV4cG8gPj0gMTI4ICYmIHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsIDwgMTI4KQorCQkJIHx8IChleHBvIDwgMTI4ICYmIHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsID49IDEyOCkpCisJCQkJc2V0ZnJhbWVyYXRlKGdzcGNhX2Rldik7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCisvKiBnZXQgc3RyZWFtIHBhcmFtZXRlcnMgKGZyYW1lcmF0ZSkgKi8KK3N0YXRpYyB2b2lkIHNkX2dldF9zdHJlYW1wYXJtKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKmNwID0gJnBhcm0tPnBhcm0uY2FwdHVyZTsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAqdHBmID0gJmNwLT50aW1lcGVyZnJhbWU7CisJaW50IGZyLCBpOworCisJY3AtPmNhcGFiaWxpdHkgfD0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXRwZi0+bnVtZXJhdG9yID0gMTsKKwlpID0gZ2V0X2ZyX2lkeChnc3BjYV9kZXYpOworCWlmIChpICYgMHg4MCkgeworCQlpZiAoc2QtPmJyaWRnZSA9PSBCUklER0VfVFA2ODAwKQorCQkJZnIgPSByYXRlc1s2IC0gKGkgJiAweDA3KV07CisJCWVsc2UKKwkJCWZyID0gcmF0ZXNfNjgxMFs3IC0gKGkgJiAweDA3KV07CisJfSBlbHNlIHsKKwkJZnIgPSByYXRlc1s2IC0gaV07CisJfQorCXRwZi0+ZGVub21pbmF0b3IgPSBmcjsKK30KKworLyogc2V0IHN0cmVhbSBwYXJhbWV0ZXJzIChmcmFtZXJhdGUpICovCitzdGF0aWMgdm9pZCBzZF9zZXRfc3RyZWFtcGFybShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0pCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtICpjcCA9ICZwYXJtLT5wYXJtLmNhcHR1cmU7CisJc3RydWN0IHY0bDJfZnJhY3QgKnRwZiA9ICZjcC0+dGltZXBlcmZyYW1lOworCWludCBmciwgaTsKKworCXNkLT5mcmFtZXJhdGUgPSB0cGYtPmRlbm9taW5hdG9yIC8gdHBmLT5udW1lcmF0b3I7CisJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQorCQlzZXRmcmFtZXJhdGUoZ3NwY2FfZGV2KTsKKworCS8qIFJldHVybiB0aGUgYWN0dWFsIGZyYW1lcmF0ZSAqLworCWkgPSBnZXRfZnJfaWR4KGdzcGNhX2Rldik7CisJaWYgKGkgJiAweDgwKQorCQlmciA9IHJhdGVzXzY4MTBbNyAtIChpICYgMHgwNyldOworCWVsc2UKKwkJZnIgPSByYXRlc1s2IC0gaV07CisJdHBmLT5udW1lcmF0b3IgPSAxOworCXRwZi0+ZGVub21pbmF0b3IgPSBmcjsKK30KKworc3RhdGljIGludCBzZF9zZXRfamNvbXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqY29tcCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwlpZiAoc2QtPnNlbnNvciA9PSBTRU5TT1JfU09JNzYzQSkKKwkJanBlZ19zZXRfcXVhbChzZC0+anBlZ19oZHIsIGpjb21wLT5xdWFsaXR5KTsKKy8qCWVsc2UKKwkJZml4bWU6IFRPRE8KKyovCisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIGludCBzZF9nZXRfamNvbXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpqY29tcCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisKKwltZW1zZXQoamNvbXAsIDAsIHNpemVvZiAqamNvbXApOworCWpjb21wLT5xdWFsaXR5ID0ganBlZ19xW3NkLT5xdWFsaXR5XTsKKwlqY29tcC0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQKKwkJCXwgVjRMMl9KUEVHX01BUktFUl9EUVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3RybCBzZF9jdHJsc1tOQ1RSTFNdID0geworW0VYUE9TVVJFXSA9IHsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9FWFBPU1VSRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJFeHBvc3VyZSIsCisJCS5taW5pbXVtID0gMHgwMSwKKwkJLm1heGltdW0gPSAweGRjLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMHg0ZSwKKwkgICAgfSwKKwkgICAgLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKKwl9LAorW1FVQUxJVFldID0geworCSAgICB7CisJCS5pZCA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJDb21wcmVzc2lvbiBxdWFsaXR5IiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDE1LAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMTMsCisJICAgIH0sCisJICAgIC5zZXRfY29udHJvbCA9IHNldHF1YWxpdHkKKwl9LAorW1JHQUlOXSA9IHsKKwkgICAgeworCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJSZWQgYmFsYW5jZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA0MDk1LAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMjU2LAorCSAgICB9LAorCSAgICAuc2V0X2NvbnRyb2wgPSBzZXRyZ2FpbgorCX0sCitbR0FJTl0gPSB7CisJICAgIHsKKwkJLmlkID0gVjRMMl9DSURfR0FJTiwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJHYWluIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDQwOTUsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAyNTYsCisJICAgIH0sCisJICAgIC5zZXQgPSBzZF9zZXRnYWluCisJfSwKK1tCR0FJTl0gPSB7CisJICAgIHsKKwkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkJsdWUgYmFsYW5jZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA0MDk1LAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMjU2LAorCSAgICB9LAorCSAgICAuc2V0X2NvbnRyb2wgPSBzZXRiZ2FpbgorCX0sCitbU0hBUlBORVNTXSA9IHsKKwkgICAgeworCQkuaWQJID0gVjRMMl9DSURfU0hBUlBORVNTLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgID0gIlNoYXJwbmVzcyIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAzLAorCQkuc3RlcCAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMiwKKwkgICAgfSwKKwkgICAgLnNldF9jb250cm9sID0gc2V0c2hhcnBuZXNzCisJfSwKK1tHQU1NQV0gPSB7CisJICAgIHsKKwkJLmlkICAgICAgPSBWNEwyX0NJRF9HQU1NQSwKKwkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICA9ICJHYW1tYSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSBOR0FNTUEgLSAxLAorCQkuc3RlcCAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkgICAgfSwKKwkgICAgLnNldF9jb250cm9sID0gc2V0Z2FtbWEKKwl9LAorW0FVVE9HQUlOXSA9IHsKKwkgICAgeworCQkuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9HQUlOLAorCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lICAgID0gIkF1dG8gR2FpbiIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gQVVUT0dBSU5fREVGCisJICAgIH0sCisJICAgIC5zZXRfY29udHJvbCA9IHNldGF1dG9nYWluCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLmN0cmxzID0gc2RfY3RybHMsCisJLm5jdHJscyA9IE5DVFJMUywKKwkuY29uZmlnID0gc2RfY29uZmlnLAorCS5pbml0ID0gc2RfaW5pdCwKKwkuaXNvY19pbml0ID0gc2RfaXNvY19pbml0LAorCS5zdGFydCA9IHNkX3N0YXJ0LAorCS5zdG9wTiA9IHNkX3N0b3BOLAorCS5wa3Rfc2NhbiA9IHNkX3BrdF9zY2FuLAorCS5kcV9jYWxsYmFjayA9IHNkX2RxX2NhbGxiYWNrLAorCS5nZXRfc3RyZWFtcGFybSA9IHNkX2dldF9zdHJlYW1wYXJtLAorCS5zZXRfc3RyZWFtcGFybSA9IHNkX3NldF9zdHJlYW1wYXJtLAorCS5nZXRfamNvbXAgPSBzZF9nZXRfamNvbXAsCisJLnNldF9qY29tcCA9IHNkX3NldF9qY29tcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDA2YTIsIDB4MDAwMyksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9UUDY4MDB9LAorCXtVU0JfREVWSUNFKDB4MDZhMiwgMHg2ODEwKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX1RQNjgxMH0sCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CisKK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZ3NwY2FfZGV2X3Byb2JlKGludGVyZmFjZSwgaWQsICZzZF9kZXNjLCBzaXplb2Yoc3RydWN0IHNkKSwKKwkJCSAgICAgICBUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkuaWRfdGFibGUgPSBkZXZpY2VfdGFibGUsCisJLnByb2JlID0gc2RfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnc3BjYV9kaXNjb25uZWN0LAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gZ3NwY2Ffc3VzcGVuZCwKKwkucmVzdW1lID0gZ3NwY2FfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZF9tb2RfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CisKK21vZHVsZV9wYXJhbShmb3JjZV9zZW5zb3IsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3NlbnNvciwKKwkiRm9yY2Ugc2Vuc29yLiAwOiBjeDAzNDIsIDE6IHNvaTc2M2EiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZjMDMyeC5jCmluZGV4IDZjYWVkNzMuLjdlZTJjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmMwMzJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92YzAzMnguYwpAQCAtMjAsNiArMjAsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgTU9EVUxFX05BTUUgInZjMDMyeCIKIAogI2luY2x1ZGUgImdzcGNhLmgiCkBAIC0zMTY5LDcgKzMxNzEsNyBAQAogCQkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgbGVuLAogCQkJNTAwKTsKIAlpZiAocmV0IDwgMCkgewotCQllcnIoInJlZ19yIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3IgZXJyICVkXG4iLCByZXQpOwogCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMzIxMCw3ICszMjEyLDcgQEAKIAkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfdyBlcnIgJWQiLCByZXQpOworCQlwcl9lcnIoInJlZ193IGVyciAlZFxuIiwgcmV0KTsKIAkJZ3NwY2FfZGV2LT51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTMyMzUsOCArMzIzNyw3IEBACiAKIAlyZWdfcihnc3BjYV9kZXYsIDB4YTEsIDB4YjMzZiwgMSk7CiAJaWYgKCEoZ3NwY2FfZGV2LT51c2JfYnVmWzBdICYgMHgwMikpIHsKLQkJZXJyKCJJMmMgQnVzIEJ1c3kgV2FpdCAlMDJ4IiwKLQkJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSk7CisJCXByX2VycigiSTJjIEJ1cyBCdXN5IFdhaXQgJTAyeFxuIiwgZ3NwY2FfZGV2LT51c2JfYnVmWzBdKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJlZ193KGdzcGNhX2RldiwgMHhhMCwgYWRkcmVzcywgMHhiMzNhKTsKQEAgLTMzNDksNyArMzM1MCw3IEBACiAJCW1zbGVlcCgyMCk7CiAJfSB3aGlsZSAoLS1yZXRyeSA+IDApOwogCWlmIChyZXRyeSA8PSAwKQotCQllcnIoImkyY193cml0ZSB0aW1lb3V0Iik7CisJCXByX2VycigiaTJjX3dyaXRlIHRpbWVvdXRcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBwdXRfdGFiX3RvX3JlZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCkBAIC0zNDQ2LDcgKzM0NDcsNyBAQAogCiAJc3dpdGNoIChzZW5zb3IpIHsKIAljYXNlIC0xOgotCQllcnIoIlVua25vd24gc2Vuc29yLi4uIik7CisJCXByX2VycigiVW5rbm93biBzZW5zb3IuLi5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAljYXNlIFNFTlNPUl9IVjcxMzFSOgogCQlQREVCVUcoRF9QUk9CRSwgIkZpbmQgU2Vuc29yIEhWNzEzMVIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmljYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdmljYW0uYwppbmRleCA4NGRmYmFiLi44MWRkNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3ZpY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS92aWNhbS5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBNT0RVTEVfTkFNRSAidmljYW0iCiAjZGVmaW5lIEhFQURFUl9TSVpFIDY0CiAKQEAgLTExNyw3ICsxMTksNyBAQAogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgdmFsdWUsIGluZGV4LCBkYXRhLCBsZW4sIDEwMDApOwogCWlmIChyZXQgPCAwKQotCQllcnIoImNvbnRyb2wgbXNnIHJlcSAlMDJYIGVycm9yICVkIiwgcmVxdWVzdCwgcmV0KTsKKwkJcHJfZXJyKCJjb250cm9sIG1zZyByZXEgJTAyWCBlcnJvciAlZFxuIiwgcmVxdWVzdCwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xODksOCArMTkxLDggQEAKIAkJCSAgIGRhdGEsIHNpemUsICZhY3RfbGVuLCAxMDAwMCk7CiAJLyogc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyAwLCBvdGhlcndpc2UgIG5lZ2F0aXZlICovCiAJaWYgKHJldCA8IDAgfHwgYWN0X2xlbiAhPSBzaXplKSB7Ci0JCWVycigiYnVsayByZWFkIGZhaWwgKCVkKSBsZW4gJWQvJWQiLAotCQkJcmV0LCBhY3RfbGVuLCBzaXplKTsKKwkJcHJfZXJyKCJidWxrIHJlYWQgZmFpbCAoJWQpIGxlbiAlZC8lZFxuIiwKKwkJICAgICAgIHJldCwgYWN0X2xlbiwgc2l6ZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIxNiw3ICsyMTgsNyBAQAogCQkgICBIRUFERVJfU0laRTsKIAlidWZmZXIgPSBrbWFsbG9jKGZyYW1lX3N6LCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpIHsKLQkJZXJyKCJDb3VsZG4ndCBhbGxvY2F0ZSBVU0IgYnVmZmVyIik7CisJCXByX2VycigiQ291bGRuJ3QgYWxsb2NhdGUgVVNCIGJ1ZmZlclxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI2OSw3ICsyNzEsNyBAQAogCXJldCA9IHJlcXVlc3RfaWhleF9maXJtd2FyZSgmZncsICJ2aWNhbS9maXJtd2FyZS5mdyIsCiAJCQkJICAgICZnc3BjYV9kZXYtPmRldi0+ZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWVycigiRmFpbGVkIHRvIGxvYWQgXCJ2aWNhbS9maXJtd2FyZS5md1wiOiAlZFxuIiwgcmV0KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbG9hZCBcInZpY2FtL2Zpcm13YXJlLmZ3XCI6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS93OTk2WGNmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYwppbmRleCA0YTllNjIyLi4yN2QyY2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3c5OTZYY2YuYwpAQCAtMzEsNiArMzEsOCBAQAogICAgdGhlIHNlbnNvciBkcml2ZXJzIHRvIHY0bDIgc3ViIGRyaXZlcnMsIGFuZCBwcm9wZXJseSBzcGxpdCBvZiB0aGlzCiAgICBkcml2ZXIgZnJvbSBvdjUxOS5jICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2RlZmluZSBXOTk2OENGX0kyQ19CVVNfREVMQVkgICAgNCAvKiBkZWxheSBpbiB1cyBmb3IgSTJDIGJpdCByL3cgb3BlcmF0aW9ucyAqLwogCiAjZGVmaW5lIFlfUVVBTlRBQkxFICgmc2QtPmpwZWdfaGRyW0pQRUdfUVQwX09GRlNFVF0pCkBAIC04MSw3ICs4Myw3IEBACiAJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkgICAgICB2YWx1ZSwgMHgwNiwgc2QtPmdzcGNhX2Rldi51c2JfYnVmLCA2LCA1MDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiV3JpdGUgRlNCIHJlZ2lzdGVycyBmYWlsZWQgKCVkKSIsIHJldCk7CisJCXByX2VycigiV3JpdGUgRlNCIHJlZ2lzdGVycyBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCX0KIH0KQEAgLTEwOCw3ICsxMTAsNyBAQAogCXVkZWxheShXOTk2OENGX0kyQ19CVVNfREVMQVkpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJXcml0ZSBTQiByZWcgWzAxXSAlMDR4IGZhaWxlZCIsIHZhbHVlKTsKKwkJcHJfZXJyKCJXcml0ZSBTQiByZWcgWzAxXSAlMDR4IGZhaWxlZFxuIiwgdmFsdWUpOwogCQlzZC0+Z3NwY2FfZGV2LnVzYl9lcnIgPSByZXQ7CiAJfQogfQpAQCAtMTM1LDcgKzEzNyw3IEBACiAJCXJldCA9IHNkLT5nc3BjYV9kZXYudXNiX2J1ZlswXSB8CiAJCSAgICAgIChzZC0+Z3NwY2FfZGV2LnVzYl9idWZbMV0gPDwgOCk7CiAJfSBlbHNlIHsKLQkJZXJyKCJSZWFkIFNCIHJlZyBbMDFdIGZhaWxlZCIpOworCQlwcl9lcnIoIlJlYWQgU0IgcmVnIFswMV0gZmFpbGVkXG4iKTsKIAkJc2QtPmdzcGNhX2Rldi51c2JfZXJyID0gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS94aXJsaW5rX2NpdC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS94aXJsaW5rX2NpdC5jCmluZGV4IGMwODlhMGYuLjNhZWQ0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EveGlybGlua19jaXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3hpcmxpbmtfY2l0LmMKQEAgLTI3LDYgKzI3LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ4aXJsaW5rLWNpdCIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC04MDAsOCArODAyLDggQEAKIAkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5ULAogCQkJdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKTsKIAlpZiAoZXJyIDwgMCkKLQkJZXJyKCJGYWlsZWQgdG8gd3JpdGUgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCIKLQkJCSIgdmFsdWUgMHglMDJYLCBlcnJvciAlZCkiLCBpbmRleCwgdmFsdWUsIGVycik7CisJCXByX2VycigiRmFpbGVkIHRvIHdyaXRlIGEgcmVnaXN0ZXIgKGluZGV4IDB4JTA0WCwgdmFsdWUgMHglMDJYLCBlcnJvciAlZClcbiIsCisJCSAgICAgICBpbmRleCwgdmFsdWUsIGVycik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgxNiw4ICs4MTgsOCBAQAogCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9FTkRQT0lOVCwKIAkJCTB4MDAsIGluZGV4LCBidWYsIDgsIDEwMDApOwogCWlmIChyZXMgPCAwKSB7Ci0JCWVycigiRmFpbGVkIHRvIHJlYWQgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCBlcnJvciAlZCkiLAotCQkJaW5kZXgsIHJlcyk7CisJCXByX2VycigiRmFpbGVkIHRvIHJlYWQgYSByZWdpc3RlciAoaW5kZXggMHglMDRYLCBlcnJvciAlZClcbiIsCisJCSAgICAgICBpbmRleCwgcmVzKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKQEAgLTE1ODcsNyArMTU4OSw3IEBACiAJaW50ZiA9IHVzYl9pZm51bV90b19pZihnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSk7CiAJYWx0ID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIGdzcGNhX2Rldi0+YWx0KTsKIAlpZiAoIWFsdCkgewotCQllcnIoIkNvdWxkbid0IGdldCBhbHRzZXR0aW5nIik7CisJCXByX2VycigiQ291bGRuJ3QgZ2V0IGFsdHNldHRpbmdcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTI4MjQsNyArMjgyNiw3IEBACiAKIAlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWVycigic2V0IGFsdCAxIGVyciAlZCIsIHJldCk7CisJCXByX2Vycigic2V0IGFsdCAxIGVyciAlZFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3pjM3h4LmMKaW5kZXggNjFjZGQ1Ni4uMzBlYTFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS96YzN4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvemMzeHguYwpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIE1PRFVMRV9OQU1FICJ6YzN4eCIKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC01NjY2LDcgKzU2NjgsNyBAQAogCQkJaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfcl9pIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3JfaSBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNTY5OCw3ICs1NzAwLDcgQEAKIAkJCXZhbHVlLCBpbmRleCwgTlVMTCwgMCwKIAkJCTUwMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJyZWdfd19pIGVyciAlZCIsIHJldCk7CisJCXByX2VycigicmVnX3dfaSBlcnIgJWRcbiIsIHJldCk7CiAJCWdzcGNhX2Rldi0+dXNiX2VyciA9IHJldDsKIAl9CiB9CkBAIC01NzI0LDcgKzU3MjYsNyBAQAogCW1zbGVlcCgyMCk7CiAJcmV0Ynl0ZSA9IHJlZ19yX2koZ3NwY2FfZGV2LCAweDAwOTEpOwkJLyogcmVhZCBzdGF0dXMgKi8KIAlpZiAocmV0Ynl0ZSAhPSAweDAwKQotCQllcnIoImkyY19yIHN0YXR1cyBlcnJvciAlMDJ4IiwgcmV0Ynl0ZSk7CisJCXByX2VycigiaTJjX3Igc3RhdHVzIGVycm9yICUwMnhcbiIsIHJldGJ5dGUpOwogCXJldHZhbCA9IHJlZ19yX2koZ3NwY2FfZGV2LCAweDAwOTUpOwkJLyogcmVhZCBMb3dieXRlICovCiAJcmV0dmFsIHw9IHJlZ19yX2koZ3NwY2FfZGV2LCAweDAwOTYpIDw8IDg7CS8qIHJlYWQgSGlnaHRieXRlICovCiAJUERFQlVHKERfVVNCSSwgImkyYyByIFslMDJ4XSAtPiAlMDR4ICglMDJ4KSIsCkBAIC01NzQ4LDcgKzU3NTAsNyBAQAogCW1zbGVlcCgxKTsKIAlyZXRieXRlID0gcmVnX3JfaShnc3BjYV9kZXYsIDB4MDA5MSk7CQkvKiByZWFkIHN0YXR1cyAqLwogCWlmIChyZXRieXRlICE9IDB4MDApCi0JCWVycigiaTJjX3cgc3RhdHVzIGVycm9yICUwMngiLCByZXRieXRlKTsKKwkJcHJfZXJyKCJpMmNfdyBzdGF0dXMgZXJyb3IgJTAyeFxuIiwgcmV0Ynl0ZSk7CiAJUERFQlVHKERfVVNCTywgImkyYyB3IFslMDJ4XSA9ICUwMnglMDJ4ICglMDJ4KSIsCiAJCQlyZWcsIHZhbEgsIHZhbEwsIHJldGJ5dGUpOwogCXJldHVybiByZXRieXRlOwpAQCAtNjQ5Nyw3ICs2NDk5LDcgQEAKIAkJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBHQzAzMDMiKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJd2FybigiVW5rbm93biBzZW5zb3IgLSBzZXQgdG8gVEFTNTEzMEMiKTsKKwkJCQlwcl93YXJuKCJVbmtub3duIHNlbnNvciAtIHNldCB0byBUQVM1MTMwQ1xuIik7CiAJCQkJc2QtPnNlbnNvciA9IFNFTlNPUl9UQVM1MTMwQzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNjYwMyw3ICs2NjA1LDcgQEAKIAkJCXNkLT5zZW5zb3IgPSBTRU5TT1JfT1Y3NjIwOwkvKiBzYW1lIHNlbnNvciAoPykgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZXJyKCJVbmtub3duIHNlbnNvciAlMDR4Iiwgc2Vuc29yKTsKKwkJCXByX2VycigiVW5rbm93biBzZW5zb3IgJTA0eFxuIiwgc2Vuc29yKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtNjk3MCw2ICs2OTcyLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRSgweDAzZjAsIDB4MWIwNyl9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHgwNDFlKX0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMTcpfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDAxYyksIC5kcml2ZXJfaW5mbyA9IFNFTlNPUl9QQVMxMDZ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvTWFrZWZpbGUKaW5kZXggM2JhYTlmNi4uNTJmMDU3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL01ha2VmaWxlCkBAIC0yLDYgKzIsNiBAQAogCiBvYmotJChDT05GSUdfVklERU9fSERQVlIpICs9IGhkcHZyLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwogCi1FWFRSQV9DRkxBR1MgKz0gJChleHRyYS1jZmxhZ3MteSkgJChleHRyYS1jZmxhZ3MtbSkKK2NjZmxhZ3MteSArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItaTJjLmMKaW5kZXggMmExYWMyOC4uODJlODE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWkyYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJoZHB2ci5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9nZW1pbmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jCmluZGV4IGNiYzUwNWEuLmE2MjMyMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX2dlbWluaS5jCkBAIC0yMSw5ICsyMSwxMiBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIERFQlVHX1ZBUklBQkxFIGRlYnVnCiAKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CkBAIC0xNzUsMTMgKzE3OCwxNCBAQAogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IGkgPSAwOwogCi0JREVCX0QoKCJoZXhpdW1faW5pdF9kb25lIGNhbGxlZC5cbiIpKTsKKwlERUJfRCgiaGV4aXVtX2luaXRfZG9uZSBjYWxsZWRcbiIpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgaGVscGVyIGljcyB0byB1c2VmdWwgdmFsdWVzICovCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihoZXhpdW1fa3MwMTI3Yik7IGkrKykgewogCQlkYXRhLmJ5dGUgPSBoZXhpdW1fa3MwMTI3YltpXTsKIAkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NmMsIDAsIEkyQ19TTUJVU19XUklURSwgaSwgSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpKSB7Ci0JCQlwcmludGsoImhleGl1bV9nZW1pbmk6IGhleGl1bV9pbml0X2RvbmUoKSBmYWlsZWQgZm9yIGFkZHJlc3MgMHglMDJ4XG4iLCBpKTsKKwkJCXByX2VycigiaGV4aXVtX2luaXRfZG9uZSgpIGZhaWxlZCBmb3IgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkgICAgICAgaSk7CiAJCX0KIAl9CiAKQEAgLTE5Miw3ICsxOTYsNyBAQAogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAKLQlERUJfRCgoIi5cbiIpKTsKKwlERUJfRCgiXG4iKTsKIAogCWRhdGEuYnl0ZSA9IGhleGl1bV9pbnB1dF9zZWxlY3RbaW5wdXRdLmJ5dGU7CiAJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NmMsIDAsIEkyQ19TTUJVU19XUklURSwgaGV4aXVtX2lucHV0X3NlbGVjdFtpbnB1dF0uYWRyLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKQEAgLTIwNywxMiArMjExLDEzIEBACiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgaSA9IDA7CiAKLQlERUJfRCgoIi5cbiIpKTsKKwlERUJfRCgiXG4iKTsKIAogCXdoaWxlICh2ZGVjW2ldLmFkciAhPSAtMSkgewogCQlkYXRhLmJ5dGUgPSB2ZGVjW2ldLmJ5dGU7CiAJCWlmICgwICE9IGkyY19zbWJ1c194ZmVyKCZoZXhpdW0tPmkyY19hZGFwdGVyLCAweDZjLCAwLCBJMkNfU01CVVNfV1JJVEUsIHZkZWNbaV0uYWRyLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKLQkJCXByaW50aygiaGV4aXVtX2luaXRfZG9uZTogaGV4aXVtX3NldF9zdGFuZGFyZCgpIGZhaWxlZCBmb3IgYWRkcmVzcyAweCUwMnhcbiIsIGkpOworCQkJcHJfZXJyKCJoZXhpdW1faW5pdF9kb25lOiBoZXhpdW1fc2V0X3N0YW5kYXJkKCkgZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCSAgICAgICBpKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlpKys7CkBAIC0yMjIsMTQgKzIyNywxNCBAQAogCiBzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7Ci0JREVCX0VFKCgiVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJREVCX0VFKCJWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAKIAlpZiAoaS0+aW5kZXggPj0gSEVYSVVNX0lOUFVUUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1jcHkoaSwgJmhleGl1bV9pbnB1dHNbaS0+aW5kZXhdLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKIAotCURFQl9EKCgidjRsMl9pb2N0bDogVklESU9DX0VOVU1JTlBVVCAlZC5cbiIsIGktPmluZGV4KSk7CisJREVCX0QoInY0bDJfaW9jdGw6IFZJRElPQ19FTlVNSU5QVVQgJWRcbiIsIGktPmluZGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQwLDcgKzI0NSw3IEBACiAKIAkqaW5wdXQgPSBoZXhpdW0tPmN1cl9pbnB1dDsKIAotCURFQl9EKCgiVklESU9DX0dfSU5QVVQ6ICVkXG4iLCAqaW5wdXQpKTsKKwlERUJfRCgiVklESU9DX0dfSU5QVVQ6ICVkXG4iLCAqaW5wdXQpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDksNyArMjU0LDcgQEAKIAlzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiA9ICgoc3RydWN0IHNhYTcxNDZfZmggKilmaCktPmRldjsKIAlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OwogCi0JREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCkpOworCURFQl9FRSgiVklESU9DX1NfSU5QVVQgJWRcbiIsIGlucHV0KTsKIAogCWlmIChpbnB1dCA+PSBIRVhJVU1fSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3MCw3ICsyNzUsNyBAQAogCWZvciAoaSA9IEhFWElVTV9DT05UUk9MUyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChoZXhpdW1fY29udHJvbHNbaV0uaWQgPT0gcWMtPmlkKSB7CiAJCQkqcWMgPSBoZXhpdW1fY29udHJvbHNbaV07Ci0JCQlERUJfRCgoIlZJRElPQ19RVUVSWUNUUkwgJWQuXG4iLCBxYy0+aWQpKTsKKwkJCURFQl9EKCJWSURJT0NfUVVFUllDVFJMICVkXG4iLCBxYy0+aWQpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0yOTMsNyArMjk4LDcgQEAKIAogCWlmICh2Yy0+aWQgPT0gVjRMMl9DSURfUFJJVkFURV9CQVNFKSB7CiAJCXZjLT52YWx1ZSA9IGhleGl1bS0+Y3VyX2J3OwotCQlERUJfRCgoIlZJRElPQ19HX0NUUkwgQlc6JWQuXG4iLCB2Yy0+dmFsdWUpKTsKKwkJREVCX0QoIlZJRElPQ19HX0NUUkwgQlc6JWRcbiIsIHZjLT52YWx1ZSk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTMxNiw3ICszMjEsNyBAQAogCWlmICh2Yy0+aWQgPT0gVjRMMl9DSURfUFJJVkFURV9CQVNFKQogCQloZXhpdW0tPmN1cl9idyA9IHZjLT52YWx1ZTsKIAotCURFQl9EKCgiVklESU9DX1NfQ1RSTCBCVzolZC5cbiIsIGhleGl1bS0+Y3VyX2J3KSk7CisJREVCX0QoIlZJRElPQ19TX0NUUkwgQlc6JWRcbiIsIGhleGl1bS0+Y3VyX2J3KTsKIAogCWlmICgwID09IGhleGl1bS0+Y3VyX2J3ICYmIFY0TDJfU1REX1BBTCA9PSBoZXhpdW0tPmN1cl9zdGQpIHsKIAkJaGV4aXVtX3NldF9zdGFuZGFyZChoZXhpdW0sIGhleGl1bV9wYWwpOwpAQCAtMzUxLDE0ICszNTYsMTQgQEAKIC8qIHRoaXMgZnVuY3Rpb24gb25seSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBwcm9iaW5nIHdhcyBzdWNjZXNzZnVsICovCiBzdGF0aWMgaW50IGhleGl1bV9hdHRhY2goc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTQ2X3BjaV9leHRlbnNpb25fZGF0YSAqaW5mbykKIHsKLQlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OworCXN0cnVjdCBoZXhpdW0gKmhleGl1bTsKIAlpbnQgcmV0OwogCi0JREVCX0VFKCgiLlxuIikpOworCURFQl9FRSgiXG4iKTsKIAogCWhleGl1bSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZXhpdW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBoZXhpdW0pIHsKLQkJcHJpbnRrKCJoZXhpdW1fZ2VtaW5pOiBub3QgZW5vdWdoIGtlcm5lbCBtZW1vcnkgaW4gaGV4aXVtX2F0dGFjaCgpLlxuIik7CisJCXByX2Vycigibm90IGVub3VnaCBrZXJuZWwgbWVtb3J5IGluIGhleGl1bV9hdHRhY2goKVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlkZXYtPmV4dF9wcml2ID0gaGV4aXVtOwpAQCAtMzcxLDcgKzM3Niw3IEBACiAJfTsKIAlzYWE3MTQ2X2kyY19hZGFwdGVyX3ByZXBhcmUoZGV2LCAmaGV4aXVtLT5pMmNfYWRhcHRlciwgU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzQ4MCk7CiAJaWYgKGkyY19hZGRfYWRhcHRlcigmaGV4aXVtLT5pMmNfYWRhcHRlcikgPCAwKSB7Ci0JCURFQl9TKCgiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlERUJfUygiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIik7CiAJCWtmcmVlKGhleGl1bSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTQwMiwxMSArNDA3LDExIEBACiAJdnZfZGF0YS5vcHMudmlkaW9jX3NfaW5wdXQgPSB2aWRpb2Nfc19pbnB1dDsKIAlyZXQgPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmaGV4aXVtLT52aWRlb19kZXYsIGRldiwgImhleGl1bSBnZW1pbmkiLCBWRkxfVFlQRV9HUkFCQkVSKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImhleGl1bV9nZW1pbmk6IGNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOworCQlwcl9lcnIoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXByaW50aygiaGV4aXVtX2dlbWluaTogZm91bmQgJ2hleGl1bSBnZW1pbmknIGZyYW1lIGdyYWJiZXItJWQuXG4iLCBoZXhpdW1fbnVtKTsKKwlwcl9pbmZvKCJmb3VuZCAnaGV4aXVtIGdlbWluaScgZnJhbWUgZ3JhYmJlci0lZFxuIiwgaGV4aXVtX251bSk7CiAJaGV4aXVtX251bSsrOwogCiAJcmV0dXJuIDA7CkBAIC00MTYsNyArNDIxLDcgQEAKIHsKIAlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OwogCi0JREVCX0VFKCgiZGV2OiVwXG4iLCBkZXYpKTsKKwlERUJfRUUoImRldjolcFxuIiwgZGV2KTsKIAogCXNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UoJmhleGl1bS0+dmlkZW9fZGV2LCBkZXYpOwogCXNhYTcxNDZfdnZfcmVsZWFzZShkZXYpOwpAQCAtNTA4LDcgKzUxMyw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBoZXhpdW1faW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpZiAoMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2V4dGVuc2lvbigmaGV4aXVtX2V4dGVuc2lvbikpIHsKLQkJREVCX1MoKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uLlxuIikpOworCQlERUJfUygiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvblxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGV4aXVtX29yaW9uLmMKaW5kZXggNmFkN2UxYy4uMjNkZWJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZXhpdW1fb3Jpb24uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hleGl1bV9vcmlvbi5jCkBAIC0yMSw5ICsyMSwxMiBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjZGVmaW5lIERFQlVHX1ZBUklBQkxFIGRlYnVnCiAKICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2X3Z2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CkBAIC0yMDksNyArMjEyLDcgQEAKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWludCBlcnIgPSAwOwogCi0JREVCX0VFKCgiLlxuIikpOworCURFQl9FRSgiXG4iKTsKIAogCS8qIHRoZXJlIGFyZSBubyBoZXhpdW0gb3Jpb24gY2FyZHMgd2l0aCByZXZpc2lvbiAwIHNhYTcxNDZzICovCiAJaWYgKDAgPT0gZGV2LT5yZXZpc2lvbikgewpAQCAtMjE4LDcgKzIyMSw3IEBACiAKIAloZXhpdW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGV4aXVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gaGV4aXVtKSB7Ci0JCXByaW50aygiaGV4aXVtX29yaW9uOiBoZXhpdW1fcHJvYmU6IG5vdCBlbm91Z2gga2VybmVsIG1lbW9yeS5cbiIpOworCQlwcl9lcnIoImhleGl1bV9wcm9iZTogbm90IGVub3VnaCBrZXJuZWwgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yMzQsNyArMjM3LDcgQEAKIAl9OwogCXNhYTcxNDZfaTJjX2FkYXB0ZXJfcHJlcGFyZShkZXYsICZoZXhpdW0tPmkyY19hZGFwdGVyLCBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfNDgwKTsKIAlpZiAoaTJjX2FkZF9hZGFwdGVyKCZoZXhpdW0tPmkyY19hZGFwdGVyKSA8IDApIHsKLQkJREVCX1MoKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKSk7CisJCURFQl9TKCJjYW5ub3QgcmVnaXN0ZXIgaTJjLWRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJa2ZyZWUoaGV4aXVtKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMjQ4LDcgKzI1MSw3IEBACiAKIAkvKiBkZXRlY3QgbmV3ZXIgSGV4aXVtIE9yaW9uIGNhcmRzIGJ5IHN1YnN5c3RlbSBpZHMgKi8KIAlpZiAoMHgxN2M4ID09IGRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yICYmIDB4MDEwMSA9PSBkZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSkgewotCQlwcmludGsoImhleGl1bV9vcmlvbjogZGV2aWNlIGlzIGEgSGV4aXVtIE9yaW9uIHcvIDEgU1ZIUyArIDMgQk5DIGlucHV0cy5cbiIpOworCQlwcl9pbmZvKCJkZXZpY2UgaXMgYSBIZXhpdW0gT3Jpb24gdy8gMSBTVkhTICsgMyBCTkMgaW5wdXRzXG4iKTsKIAkJLyogd2Ugc3RvcmUgdGhlIHBvaW50ZXIgaW4gb3VyIHByaXZhdGUgZGF0YSBmaWVsZCAqLwogCQlkZXYtPmV4dF9wcml2ID0gaGV4aXVtOwogCQloZXhpdW0tPnR5cGUgPSBIRVhJVU1fT1JJT05fMVNWSFNfM0JOQzsKQEAgLTI1Niw3ICsyNTksNyBAQAogCX0KIAogCWlmICgweDE3YzggPT0gZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgJiYgMHgyMTAxID09IGRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlKSB7Ci0JCXByaW50aygiaGV4aXVtX29yaW9uOiBkZXZpY2UgaXMgYSBIZXhpdW0gT3Jpb24gdy8gNCBCTkMgaW5wdXRzLlxuIik7CisJCXByX2luZm8oImRldmljZSBpcyBhIEhleGl1bSBPcmlvbiB3LyA0IEJOQyBpbnB1dHNcbiIpOwogCQkvKiB3ZSBzdG9yZSB0aGUgcG9pbnRlciBpbiBvdXIgcHJpdmF0ZSBkYXRhIGZpZWxkICovCiAJCWRldi0+ZXh0X3ByaXYgPSBoZXhpdW07CiAJCWhleGl1bS0+dHlwZSA9IEhFWElVTV9PUklPTl80Qk5DOwpAQCAtMjY2LDcgKzI2OSw3IEBACiAJLyogY2hlY2sgaWYgdGhpcyBpcyBhbiBvbGQgaGV4aXVtIE9yaW9uIGNhcmQgYnkgbG9va2luZyBhdAogCSAgIGEgc2FhNzExMCBhdCBhZGRyZXNzIDB4NGUgKi8KIAlpZiAoMCA9PSAoZXJyID0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NGUsIDAsIEkyQ19TTUJVU19SRUFELCAweDAwLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpKSB7Ci0JCXByaW50aygiaGV4aXVtX29yaW9uOiBkZXZpY2UgaXMgYSBIZXhpdW0gSFYtUENJNi9PcmlvbiAob2xkKS5cbiIpOworCQlwcl9pbmZvKCJkZXZpY2UgaXMgYSBIZXhpdW0gSFYtUENJNi9PcmlvbiAob2xkKVxuIik7CiAJCS8qIHdlIHN0b3JlIHRoZSBwb2ludGVyIGluIG91ciBwcml2YXRlIGRhdGEgZmllbGQgKi8KIAkJZGV2LT5leHRfcHJpdiA9IGhleGl1bTsKIAkJaGV4aXVtLT50eXBlID0gSEVYSVVNX0hWX1BDSTZfT1JJT047CkBAIC0yODgsMTMgKzI5MSwxMyBAQAogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IGkgPSAwOwogCi0JREVCX0QoKCJoZXhpdW1faW5pdF9kb25lIGNhbGxlZC5cbiIpKTsKKwlERUJfRCgiaGV4aXVtX2luaXRfZG9uZSBjYWxsZWRcbiIpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgaGVscGVyIGljcyB0byB1c2VmdWwgdmFsdWVzICovCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihoZXhpdW1fc2FhNzExMCk7IGkrKykgewogCQlkYXRhLmJ5dGUgPSBoZXhpdW1fc2FhNzExMFtpXTsKIAkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NGUsIDAsIEkyQ19TTUJVU19XUklURSwgaSwgSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpKSB7Ci0JCQlwcmludGsoImhleGl1bV9vcmlvbjogZmFpbGVkIGZvciBhZGRyZXNzIDB4JTAyeFxuIiwgaSk7CisJCQlwcl9lcnIoImZhaWxlZCBmb3IgYWRkcmVzcyAweCUwMnhcbiIsIGkpOwogCQl9CiAJfQogCkBAIC0zMDYsNyArMzA5LDcgQEAKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWludCBpID0gMDsKIAotCURFQl9EKCgiLlxuIikpOworCURFQl9EKCJcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlpbnQgYWRyID0gaGV4aXVtX2lucHV0X3NlbGVjdFtpbnB1dF0uZGF0YVtpXS5hZHI7CkBAIC0zMTQsNyArMzE3LDcgQEAKIAkJaWYgKDAgIT0gaTJjX3NtYnVzX3hmZXIoJmhleGl1bS0+aTJjX2FkYXB0ZXIsIDB4NGUsIDAsIEkyQ19TTUJVU19XUklURSwgYWRyLCBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSkpIHsKIAkJCXJldHVybiAtMTsKIAkJfQotCQlwcmludGsoIiVkOiAweCUwMnggPT4gMHglMDJ4XG4iLGlucHV0LCBhZHIsZGF0YS5ieXRlKTsKKwkJcHJfZGVidWcoIiVkOiAweCUwMnggPT4gMHglMDJ4XG4iLCBpbnB1dCwgYWRyLCBkYXRhLmJ5dGUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzIyLDE0ICszMjUsMTQgQEAKIAogc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2lucHV0ICppKQogewotCURFQl9FRSgoIlZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLCBpLT5pbmRleCkpOworCURFQl9FRSgiVklESU9DX0VOVU1JTlBVVCAlZFxuIiwgaS0+aW5kZXgpOwogCiAJaWYgKGktPmluZGV4ID49IEhFWElVTV9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtY3B5KGksICZoZXhpdW1faW5wdXRzW2ktPmluZGV4XSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSk7CiAKLQlERUJfRCgoInY0bDJfaW9jdGw6IFZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLCBpLT5pbmRleCkpOworCURFQl9EKCJ2NGwyX2lvY3RsOiBWSURJT0NfRU5VTUlOUFVUICVkXG4iLCBpLT5pbmRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0MCw3ICszNDMsNyBAQAogCiAJKmlucHV0ID0gaGV4aXVtLT5jdXJfaW5wdXQ7CiAKLQlERUJfRCgoIlZJRElPQ19HX0lOUFVUOiAlZFxuIiwgKmlucHV0KSk7CisJREVCX0QoIlZJRElPQ19HX0lOUFVUOiAlZFxuIiwgKmlucHV0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY1LDE4ICszNjgsMTggQEAKIHsKIAlzdHJ1Y3QgaGV4aXVtICpoZXhpdW0gPSAoc3RydWN0IGhleGl1bSAqKSBkZXYtPmV4dF9wcml2OwogCi0JREVCX0VFKCgiLlxuIikpOworCURFQl9FRSgiXG4iKTsKIAogCXNhYTcxNDZfdnZfaW5pdChkZXYsICZ2dl9kYXRhKTsKIAl2dl9kYXRhLm9wcy52aWRpb2NfZW51bV9pbnB1dCA9IHZpZGlvY19lbnVtX2lucHV0OwogCXZ2X2RhdGEub3BzLnZpZGlvY19nX2lucHV0ID0gdmlkaW9jX2dfaW5wdXQ7CiAJdnZfZGF0YS5vcHMudmlkaW9jX3NfaW5wdXQgPSB2aWRpb2Nfc19pbnB1dDsKIAlpZiAoMCAhPSBzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmaGV4aXVtLT52aWRlb19kZXYsIGRldiwgImhleGl1bSBvcmlvbiIsIFZGTF9UWVBFX0dSQUJCRVIpKSB7Ci0JCXByaW50aygiaGV4aXVtX29yaW9uOiBjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKTsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgY2FwdHVyZSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaW50aygiaGV4aXVtX29yaW9uOiBmb3VuZCAnaGV4aXVtIG9yaW9uJyBmcmFtZSBncmFiYmVyLSVkLlxuIiwgaGV4aXVtX251bSk7CisJcHJfZXJyKCJmb3VuZCAnaGV4aXVtIG9yaW9uJyBmcmFtZSBncmFiYmVyLSVkXG4iLCBoZXhpdW1fbnVtKTsKIAloZXhpdW1fbnVtKys7CiAKIAkvKiB0aGUgcmVzdCAqLwpAQCAtMzkwLDcgKzM5Myw3IEBACiB7CiAJc3RydWN0IGhleGl1bSAqaGV4aXVtID0gKHN0cnVjdCBoZXhpdW0gKikgZGV2LT5leHRfcHJpdjsKIAotCURFQl9FRSgoImRldjolcFxuIiwgZGV2KSk7CisJREVCX0VFKCJkZXY6JXBcbiIsIGRldik7CiAKIAlzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKCZoZXhpdW0tPnZpZGVvX2RldiwgZGV2KTsKIAlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKQEAgLTQ3OSw3ICs0ODIsNyBAQAogc3RhdGljIGludCBfX2luaXQgaGV4aXVtX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaWYgKDAgIT0gc2FhNzE0Nl9yZWdpc3Rlcl9leHRlbnNpb24oJmV4dGVuc2lvbikpIHsKLQkJREVCX1MoKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uLlxuIikpOworCQlERUJfUygiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvblxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pbXgwNzQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaW14MDc0LmMKaW5kZXggMDM4MmVhNy4uZWVjNzViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pbXgwNzQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lteDA3NC5jCkBAIC0xMiwxMSArMTIsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogCkBAIC0yNjcsNiArMjY4LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW14MDc0X2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19DU0kyOworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfQ1NJMl8yX0xBTkUgfAorCQlWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzAgfAorCQlWNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIGlteDA3NF9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IGlteDA3NF9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAk9IGlteDA3NF9zX2ZtdCwKQEAgLTI3NSw2ICsyODcsNyBAQAogCS5lbnVtX21idXNfZm10CT0gaW14MDc0X2VudW1fZm10LAogCS5nX2Nyb3AJCT0gaW14MDc0X2dfY3JvcCwKIAkuY3JvcGNhcAk9IGlteDA3NF9jcm9wY2FwLAorCS5nX21idXNfY29uZmlnCT0gaW14MDc0X2dfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGlteDA3NF9zdWJkZXZfY29yZV9vcHMgPSB7CkBAIC0yODYsMjggKzI5OSw3IEBACiAJLnZpZGVvCT0gJmlteDA3NF9zdWJkZXZfdmlkZW9fb3BzLAogfTsKIAotLyoKLSAqIFdlIGhhdmUgdG8gcHJvdmlkZSBzb2MtY2FtZXJhIG9wZXJhdGlvbnMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNheQotICogdGhlcmUuIFRoZSBNSVBJIENTSTIgZHJpdmVyIHdpbGwgcHJvdmlkZSAucXVlcnlfYnVzX3BhcmFtIGFuZCAuc2V0X2J1c19wYXJhbQotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbXgwNzRfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlteDA3NF9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIGlteDA3NF9vcHMgPSB7Ci0JLnF1ZXJ5X2J1c19wYXJhbQk9IGlteDA3NF9xdWVyeV9idXNfcGFyYW0sCi0JLnNldF9idXNfcGFyYW0JCT0gaW14MDc0X3NldF9idXNfcGFyYW0sCi19OwotCi1zdGF0aWMgaW50IGlteDA3NF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGlteDA3NF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCByZXQ7CiAJdTE2IGlkOwpAQCAtNDE3LDE3ICs0MDksMTAgQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IGlteDA3NCAqcHJpdjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIklNWDA3NDogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJTVgwNzQ6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ0NSwxMiArNDMwLDEwIEBACiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZpbXgwNzRfc3ViZGV2X29wcyk7CiAKLQlpY2QtPm9wcwk9ICZpbXgwNzRfb3BzOwogCXByaXYtPmZtdAk9ICZpbXgwNzRfY29sb3VyX2ZtdHNbMF07CiAKLQlyZXQgPSBpbXgwNzRfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IGlteDA3NF92aWRlb19wcm9iZShjbGllbnQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKIAkJa2ZyZWUocHJpdik7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNDYxLDEwICs0NDQsOCBAQAogc3RhdGljIGludCBpbXgwNzRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGlteDA3NCAqcHJpdiA9IHRvX2lteDA3NChjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIAlrZnJlZShwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9NYWtlZmlsZQppbmRleCAyNmNlMGQ2Li43MWFiNzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L01ha2VmaWxlCkBAIC03LDggKzcsOCBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0lWVFYpICs9IGl2dHYubwogb2JqLSQoQ09ORklHX1ZJREVPX0ZCX0lWVFYpICs9IGl2dHZmYi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmMKaW5kZXggMGZiNzU1Mi4uNDExMDhhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCkBAIC0xMTgwLDYgKzExODAsOCBAQAogCQlzZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKIAkJc2V0dXAudHlwZSA9IGl0di0+b3B0aW9ucy50dW5lcjsKIAkJc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFY7ICAvKiBtYXRjaGVzIFRWIHR1bmVycyAqLworCQlpZiAoaXR2LT5vcHRpb25zLnJhZGlvID4gMCkKKwkJCXNldHVwLm1vZGVfbWFzayB8PSBUX1JBRElPOwogCQlzZXR1cC50dW5lcl9jYWxsYmFjayA9IChzZXR1cC50eXBlID09IFRVTkVSX1hDMjAyOCkgPwogCQkJaXZ0dl9yZXNldF90dW5lcl9ncGlvIDogTlVMTDsKIAkJaXZ0dl9jYWxsX2FsbChpdHYsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnNldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCmluZGV4IDNlNWMwOTAuLmVjYWZhNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtMTIwMyw5ICsxMjAzLDcgQEAKIAkJCQkJY2FwLT5zZXJ2aWNlX2xpbmVzW2ZdW2xdID0gc2V0OwogCQkJfQogCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY2FwLT50eXBlID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQpIHsKKwl9IGVsc2UgaWYgKGNhcC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUKSB7CiAJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGl0di0+aXNfNjBoeikgewpAQCAtMTIxNSw5ICsxMjEzLDE2IEBACiAJCQljYXAtPnNlcnZpY2VfbGluZXNbMF1bMjNdID0gVjRMMl9TTElDRURfV1NTXzYyNTsKIAkJCWNhcC0+c2VydmljZV9saW5lc1swXVsxNl0gPSBWNEwyX1NMSUNFRF9WUFM7CiAJCX0KLQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJc2V0ID0gMDsKKwlmb3IgKGYgPSAwOyBmIDwgMjsgZisrKQorCQlmb3IgKGwgPSAwOyBsIDwgMjQ7IGwrKykKKwkJCXNldCB8PSBjYXAtPnNlcnZpY2VfbGluZXNbZl1bbF07CisJY2FwLT5zZXJ2aWNlX3NldCA9IHNldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpdnR2X2dfZW5jX2luZGV4KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfZW5jX2lkeCAqaWR4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKaW5kZXggZmI4ZTRhNy4uMDVhYjM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CkBAIC05MzYsNyArOTM3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFwZGF0YS0+aXJxKSB7CisJaWYgKCFjbGllbnQtPmlycSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkludGVycnVwdCBub3QgYXNzaWduZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NzMsNyArOTc0LDcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmlycV93YWl0cSk7CiAJSU5JVF9XT1JLKCZpbmZvLT53b3JrX2lycSwgbTVtb2xzX2lycV93b3JrKTsKLQlyZXQgPSByZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBtNW1vbHNfaXJxX2hhbmRsZXIsCisJcmV0ID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIG01bW9sc19pcnFfaGFuZGxlciwKIAkJCSAgSVJRRl9UUklHR0VSX1JJU0lORywgTU9EVUxFX05BTUUsIHNkKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW50ZXJydXB0IHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgcmV0KTsKQEAgLTk5OCw3ICs5OTksNyBAQAogCXN0cnVjdCBtNW1vbHNfaW5mbyAqaW5mbyA9IHRvX201bW9scyhzZCk7CiAKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7Ci0JZnJlZV9pcnEoaW5mby0+cGRhdGEtPmlycSwgc2QpOworCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzZCk7CiAKIAlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUoc3VwcGxpZXMpLCBzdXBwbGllcyk7CiAJZ3Bpb19mcmVlKGluZm8tPnBkYXRhLT5ncGlvX3Jlc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMKaW5kZXggODNjMTQ1MS4uODBlYzY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCQlidWYgPSBjYW0tPnZiX2J1ZnNbZnJhbWUgXiAweDFdOwogCQljYW0tPnZiX2J1ZnNbZnJhbWVdID0gYnVmOwogCQltY2FtX3JlZ193cml0ZShjYW0sIGZyYW1lID09IDAgPyBSRUdfWTBCQVIgOiBSRUdfWTFCQVIsCi0JCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmJfYnVmLCAwKSk7CisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoJmJ1Zi0+dmJfYnVmLCAwKSk7CiAJCXNldF9iaXQoQ0ZfU0lOR0xFX0JVRkZFUiwgJmNhbS0+ZmxhZ3MpOwogCQlzaW5nbGVzKys7CiAJCXJldHVybjsKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmNhbS0+YnVmZmVycywgc3RydWN0IG1jYW1fdmJfYnVmZmVyLCBxdWV1ZSk7CiAJbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CiAJbWNhbV9yZWdfd3JpdGUoY2FtLCBmcmFtZSA9PSAwID8gUkVHX1kwQkFSIDogUkVHX1kxQkFSLAotCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmJfYnVmLCAwKSk7CisJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcigmYnVmLT52Yl9idWYsIDApKTsKIAljYW0tPnZiX2J1ZnNbZnJhbWVdID0gYnVmOwogCWNsZWFyX2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7CiB9CkBAIC04ODMsOCArODgzLDkgQEAKICAqIFZpZGVvYnVmMiBpbnRlcmZhY2UgY29kZS4KICAqLwogCi1zdGF0aWMgaW50IG1jYW1fdmJfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZnMsCi0JCXVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAorc3RhdGljIGludCBtY2FtX3ZiX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAorCQljb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwgdW5zaWduZWQgaW50ICpuYnVmcywKKwkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwKIAkJdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CkBAIC05NDAsMTIgKzk0MSwxNCBAQAogLyoKICAqIFRoZXNlIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIG11dGV4IGhlbGQgZnJvbSB2YjIKICAqLwotc3RhdGljIGludCBtY2FtX3ZiX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3N0YXRpYyBpbnQgbWNhbV92Yl9zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCi0JaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFKQorCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSkgeworCQlJTklUX0xJU1RfSEVBRCgmY2FtLT5idWZmZXJzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWNhbS0+c2VxdWVuY2UgPSAwOwogCS8qCiAJICogVmlkZW9idWYyIHNuZWFraWx5IGhvYXJkcyBhbGwgdGhlIGJ1ZmZlcnMgYW5kIHdvbid0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tbXAtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tbXAtZHJpdmVyLmMKaW5kZXggZDZiNzY0NS4uZmIwYjEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYwpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAibWNhbS1jb3JlLmgiCiAKK01PRFVMRV9BTElBUygicGxhdGZvcm06bW1wLWNhbWVyYSIpOwogTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKaW5kZXggMTY2YmY5My4uMTI4OTdlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCkBAIC03MzgsOSArNzM4LDEwIEBACiAgKiBRdWV1ZSBvcGVyYXRpb25zCiAgKi8KIAotc3RhdGljIGludCBtMm10ZXN0X3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAotCQkJCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3N0YXRpYyBpbnQgbTJtdGVzdF9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCisJCQkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCXN0cnVjdCBtMm10ZXN0X3FfZGF0YSAqcV9kYXRhOwpAQCAtNzkzLDEwICs3OTQsMjQgQEAKIAl2NGwyX20ybV9idWZfcXVldWUoY3R4LT5tMm1fY3R4LCB2Yik7CiB9CiAKK3N0YXRpYyB2b2lkIG0ybXRlc3Rfd2FpdF9wcmVwYXJlKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IG0ybXRlc3RfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHEpOworCW0ybXRlc3RfdW5sb2NrKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIG0ybXRlc3Rfd2FpdF9maW5pc2goc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgbTJtdGVzdF9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJbTJtdGVzdF9sb2NrKGN0eCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdmIyX29wcyBtMm10ZXN0X3FvcHMgPSB7CiAJLnF1ZXVlX3NldHVwCSA9IG0ybXRlc3RfcXVldWVfc2V0dXAsCiAJLmJ1Zl9wcmVwYXJlCSA9IG0ybXRlc3RfYnVmX3ByZXBhcmUsCiAJLmJ1Zl9xdWV1ZQkgPSBtMm10ZXN0X2J1Zl9xdWV1ZSwKKwkud2FpdF9wcmVwYXJlCSA9IG0ybXRlc3Rfd2FpdF9wcmVwYXJlLAorCS53YWl0X2ZpbmlzaAkgPSBtMm10ZXN0X3dhaXRfZmluaXNoLAogfTsKIAogc3RhdGljIGludCBxdWV1ZV9pbml0KHZvaWQgKnByaXYsIHN0cnVjdCB2YjJfcXVldWUgKnNyY192cSwgc3RydWN0IHZiMl9xdWV1ZSAqZHN0X3ZxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCmluZGV4IGM0M2M4MWYuLmQwZjUzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKQEAgLTQyNiw2ICs0MjYsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtc3BfcXVlcnlzdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKmlkKQoreworCXN0cnVjdCBtc3Bfc3RhdGUgKnN0YXRlID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCSppZCAmPSBzdGF0ZS0+ZGV0ZWN0ZWRfc3RkOworCisJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwKKwkJImRldGVjdGVkIHN0YW5kYXJkOiAlcygweCUwOEx4KVxuIiwKKwkJbXNwX3N0YW5kYXJkX3N0ZF9uYW1lKHN0YXRlLT5zdGQpLCBzdGF0ZS0+ZGV0ZWN0ZWRfc3RkKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1zcF9zX3N0ZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBpZCkKIHsKIAlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKHNkKTsKQEAgLTYxNiw2ICs2MzAsMTAgQEAKIAkuc19zdGQgPSBtc3Bfc19zdGQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtc3BfdmlkZW9fb3BzID0geworCS5xdWVyeXN0ZCA9IG1zcF9xdWVyeXN0ZCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdHVuZXJfb3BzIG1zcF90dW5lcl9vcHMgPSB7CiAJLnNfZnJlcXVlbmN5ID0gbXNwX3NfZnJlcXVlbmN5LAogCS5nX3R1bmVyID0gbXNwX2dfdHVuZXIsCkBAIC02MzAsNiArNjQ4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNwX29wcyA9IHsKIAkuY29yZSA9ICZtc3BfY29yZV9vcHMsCisJLnZpZGVvID0gJm1zcF92aWRlb19vcHMsCiAJLnR1bmVyID0gJm1zcF90dW5lcl9vcHMsCiAJLmF1ZGlvID0gJm1zcF9hdWRpb19vcHMsCiB9OwpAQCAtNjY0LDYgKzY4Myw3IEBACiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoc2QsIGNsaWVudCwgJm1zcF9vcHMpOwogCiAJc3RhdGUtPnY0bDJfc3RkID0gVjRMMl9TVERfTlRTQzsKKwlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfQUxMOwogCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAlzdGF0ZS0+aW5wdXQgPSAtMTsKIAlzdGF0ZS0+aTJzX21vZGUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5oCmluZGV4IDMyYTQ3OGUuLjgzMWU4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmgKQEAgLTc1LDcgKzc1LDcgQEAKIAlpbnQgb3Btb2RlOwogCWludCBzdGQ7CiAJaW50IG1vZGU7Ci0JdjRsMl9zdGRfaWQgdjRsMl9zdGQ7CisJdjRsMl9zdGRfaWQgdjRsMl9zdGQsIGRldGVjdGVkX3N0ZDsKIAlpbnQgbmljYW1fb247CiAJaW50IGFjYjsKIAlpbnQgaW5fc2NhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCmluZGV4IDgwMzg3ZTIuLmY4YjUxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCkBAIC0zNywyOSArMzcsNDkgQEAKIAlpbnQgcmV0dmFsOwogCWludCBtYWluLCBzZWNvbmQ7CiAJY2hhciAqbmFtZTsKKwl2NGwyX3N0ZF9pZCBzdGQ7CiB9IG1zcF9zdGRsaXN0W10gPSB7Ci0JeyAweDAwMDAsIDAsIDAsICJjb3VsZCBub3QgZGV0ZWN0IHNvdW5kIHN0YW5kYXJkIiB9LAotCXsgMHgwMDAxLCAwLCAwLCAiYXV0b2RldGVjdCBzdGFydCIgfSwKLQl7IDB4MDAwMiwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC43MiksICI0LjUvNC43MiAgTSBEdWFsIEZNLVN0ZXJlbyIgfSwKLQl7IDB4MDAwMywgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS43NDIxODc1KSwgIjUuNS81Ljc0ICBCL0cgRHVhbCBGTS1TdGVyZW8iIH0sCi0JeyAweDAwMDQsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuMjU3ODEyNSksICI2LjUvNi4yNSAgRC9LMSBEdWFsIEZNLVN0ZXJlbyIgfSwKLQl7IDB4MDAwNSwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi43NDIxODc1KSwgIjYuNS82Ljc0ICBEL0syIER1YWwgRk0tU3RlcmVvIiB9LAotCXsgMHgwMDA2LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLCAiNi41ICBEL0sgRk0tTW9ubyAoSERFVjMpIiB9LAotCXsgMHgwMDA3LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljc0MjE4NzUpLCAiNi41LzUuNzQgIEQvSzMgRHVhbCBGTS1TdGVyZW8iIH0sCi0JeyAweDAwMDgsIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuODUpLCAiNS41LzUuODUgIEIvRyBOSUNBTSBGTSIgfSwKLQl7IDB4MDAwOSwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgTCBOSUNBTSBBTSIgfSwKLQl7IDB4MDAwYSwgTVNQX0NBUlJJRVIoNi4wKSwgTVNQX0NBUlJJRVIoNi41NSksICI2LjAvNi41NSAgSSBOSUNBTSBGTSIgfSwKLQl7IDB4MDAwYiwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIiB9LAotCXsgMHgwMDBjLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0gKEhERVYyKSIgfSwKLQl7IDB4MDAwZCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNS44NSksICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIChIREVWMykiIH0sCi0JeyAweDAwMjAsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gQlRTQy1TdGVyZW8iIH0sCi0JeyAweDAwMjEsIE1TUF9DQVJSSUVSKDQuNSksIE1TUF9DQVJSSUVSKDQuNSksICI0LjUgIE0gQlRTQy1Nb25vICsgU0FQIiB9LAotCXsgMHgwMDMwLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLCAiNC41ICBNIEVJQS1KIEphcGFuIFN0ZXJlbyIgfSwKLQl7IDB4MDA0MCwgTVNQX0NBUlJJRVIoMTAuNyksIE1TUF9DQVJSSUVSKDEwLjcpLCAiMTAuNyAgRk0tU3RlcmVvIFJhZGlvIiB9LAotCXsgMHgwMDUwLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2LjUpLCAiNi41ICBTQVQtTW9ubyIgfSwKLQl7IDB4MDA1MSwgTVNQX0NBUlJJRVIoNy4wMiksIE1TUF9DQVJSSUVSKDcuMjApLCAiNy4wMi83LjIwICBTQVQtU3RlcmVvIiB9LAotCXsgMHgwMDYwLCBNU1BfQ0FSUklFUig3LjIpLCBNU1BfQ0FSUklFUig3LjIpLCAiNy4yICBTQVQgQURSIiB9LAotCXsgICAgIC0xLCAwLCAwLCBOVUxMIH0sIC8qIEVPRiAqLworCXsgMHgwMDAwLCAwLCAwLCAiY291bGQgbm90IGRldGVjdCBzb3VuZCBzdGFuZGFyZCIsIFY0TDJfU1REX0FMTCB9LAorCXsgMHgwMDAxLCAwLCAwLCAiYXV0b2RldGVjdCBzdGFydCIsIFY0TDJfU1REX0FMTCB9LAorCXsgMHgwMDAyLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjcyKSwKKwkgICI0LjUvNC43MiAgTSBEdWFsIEZNLVN0ZXJlbyIsIFY0TDJfU1REX01OIH0sCisJeyAweDAwMDMsIE1TUF9DQVJSSUVSKDUuNSksIE1TUF9DQVJSSUVSKDUuNzQyMTg3NSksCisJICAiNS41LzUuNzQgIEIvRyBEdWFsIEZNLVN0ZXJlbyIsIFY0TDJfU1REX0JHIH0sCisJeyAweDAwMDQsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDYuMjU3ODEyNSksCisJICAiNi41LzYuMjUgIEQvSzEgRHVhbCBGTS1TdGVyZW8iLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDA1LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig2Ljc0MjE4NzUpLAorCSAgIjYuNS82Ljc0ICBEL0syIER1YWwgRk0tU3RlcmVvIiwgVjRMMl9TVERfREsgfSwKKwl7IDB4MDAwNiwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSwKKwkgICI2LjUgIEQvSyBGTS1Nb25vIChIREVWMykiLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDA3LCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljc0MjE4NzUpLAorCSAgIjYuNS81Ljc0ICBEL0szIER1YWwgRk0tU3RlcmVvIiwgVjRMMl9TVERfREsgfSwKKwl7IDB4MDAwOCwgTVNQX0NBUlJJRVIoNS41KSwgTVNQX0NBUlJJRVIoNS44NSksCisJICAiNS41LzUuODUgIEIvRyBOSUNBTSBGTSIsIFY0TDJfU1REX0JHIH0sCisJeyAweDAwMDksIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLAorCSAgIjYuNS81Ljg1ICBMIE5JQ0FNIEFNIiwgVjRMMl9TVERfTCB9LAorCXsgMHgwMDBhLCBNU1BfQ0FSUklFUig2LjApLCBNU1BfQ0FSUklFUig2LjU1KSwKKwkgICI2LjAvNi41NSAgSSBOSUNBTSBGTSIsIFY0TDJfU1REX1BBTF9JIH0sCisJeyAweDAwMGIsIE1TUF9DQVJSSUVSKDYuNSksIE1TUF9DQVJSSUVSKDUuODUpLAorCSAgIjYuNS81Ljg1ICBEL0sgTklDQU0gRk0iLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDBjLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwKKwkgICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIChIREVWMikiLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDBkLCBNU1BfQ0FSUklFUig2LjUpLCBNU1BfQ0FSUklFUig1Ljg1KSwKKwkgICI2LjUvNS44NSAgRC9LIE5JQ0FNIEZNIChIREVWMykiLCBWNEwyX1NURF9ESyB9LAorCXsgMHgwMDIwLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLAorCSAgIjQuNSAgTSBCVFNDLVN0ZXJlbyIsIFY0TDJfU1REX01UUyB9LAorCXsgMHgwMDIxLCBNU1BfQ0FSUklFUig0LjUpLCBNU1BfQ0FSUklFUig0LjUpLAorCSAgIjQuNSAgTSBCVFNDLU1vbm8gKyBTQVAiLCBWNEwyX1NURF9NVFMgfSwKKwl7IDB4MDAzMCwgTVNQX0NBUlJJRVIoNC41KSwgTVNQX0NBUlJJRVIoNC41KSwKKwkgICI0LjUgIE0gRUlBLUogSmFwYW4gU3RlcmVvIiwgVjRMMl9TVERfTlRTQ19NX0pQIH0sCisJeyAweDAwNDAsIE1TUF9DQVJSSUVSKDEwLjcpLCBNU1BfQ0FSUklFUigxMC43KSwKKwkgICIxMC43ICBGTS1TdGVyZW8gUmFkaW8iLCBWNEwyX1NURF9BTEwgfSwKKwl7IDB4MDA1MCwgTVNQX0NBUlJJRVIoNi41KSwgTVNQX0NBUlJJRVIoNi41KSwKKwkgICI2LjUgIFNBVC1Nb25vIiwgVjRMMl9TVERfQUxMIH0sCisJeyAweDAwNTEsIE1TUF9DQVJSSUVSKDcuMDIpLCBNU1BfQ0FSUklFUig3LjIwKSwKKwkgICI3LjAyLzcuMjAgIFNBVC1TdGVyZW8iLCBWNEwyX1NURF9BTEwgfSwKKwl7IDB4MDA2MCwgTVNQX0NBUlJJRVIoNy4yKSwgTVNQX0NBUlJJRVIoNy4yKSwKKwkgICI3LjIgIFNBVCBBRFIiLCBWNEwyX1NURF9BTEwgfSwKKwl7ICAgICAtMSwgMCwgMCwgTlVMTCwgMCB9LCAvKiBFT0YgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXNwMzQwMGNfaW5pdF9kYXRhX2RlbSB7CkBAIC0xNTYsNiArMTc2LDE2IEBACiAJcmV0dXJuICJ1bmtub3duIjsKIH0KIAorc3RhdGljIHY0bDJfc3RkX2lkIG1zcF9zdGFuZGFyZF9zdGQoaW50IHN0ZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG1zcF9zdGRsaXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlpZiAobXNwX3N0ZGxpc3RbaV0ucmV0dmFsID09IHN0ZCkKKwkJCXJldHVybiBtc3Bfc3RkbGlzdFtpXS5zdGQ7CisJcmV0dXJuIFY0TDJfU1REX0FMTDsKK30KKwogc3RhdGljIHZvaWQgbXNwX3NldF9zb3VyY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHNyYykKIHsKIAlzdHJ1Y3QgbXNwX3N0YXRlICpzdGF0ZSA9IHRvX3N0YXRlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKQEAgLTQ3OSw2ICs1MDksNyBAQAogCWludCBjb3VudCwgbWF4MSwgbWF4MiwgdmFsMSwgdmFsMiwgdmFsLCBpOwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9BTEw7CiAJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgdGhyZWFkOiBzbGVlcFxuIik7CkBAIC01NzksNiArNjEwLDcgQEAKIAkJc3RhdGUtPm1haW4gPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF9tYWluW21heDFdLmNkbzsKIAkJc3dpdGNoIChtYXgxKSB7CiAJCWNhc2UgMTogLyogNS41ICovCisJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfQkcgfCBWNEwyX1NURF9QQUxfSDsKIAkJCWlmIChtYXgyID09IDApIHsKIAkJCQkvKiBCL0cgRk0tc3RlcmVvICovCiAJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzU1W21heDJdLmNkbzsKQEAgLTU5Niw2ICs2MjgsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMjogLyogNi4wICovCiAJCQkvKiBQQUwgSSBOSUNBTSAqLworCQkJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX1BBTF9JOwogCQkJc3RhdGUtPnNlY29uZCA9IE1TUF9DQVJSSUVSKDYuNTUyKTsKIAkJCW1zcDM0MDBjX3NldF9tb2RlKGNsaWVudCwgTVNQX01PREVfRk1fTklDQU0yKTsKIAkJCXN0YXRlLT5uaWNhbV9vbiA9IDE7CkBAIC02MDcsMjIgKzY0MCwyNiBAQAogCQkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF82NVttYXgyXS5jZG87CiAJCQkJbXNwMzQwMGNfc2V0X21vZGUoY2xpZW50LCBNU1BfTU9ERV9GTV9URVJSQSk7CiAJCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQkJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX0RLOwogCQkJfSBlbHNlIGlmIChtYXgyID09IDAgJiYgKHN0YXRlLT52NGwyX3N0ZCAmIFY0TDJfU1REX1NFQ0FNKSkgewogCQkJCS8qIEwgTklDQU0gb3IgQU0tbW9ubyAqLwogCQkJCXN0YXRlLT5zZWNvbmQgPSBtc3AzNDAwY19jYXJyaWVyX2RldGVjdF82NVttYXgyXS5jZG87CiAJCQkJbXNwMzQwMGNfc2V0X21vZGUoY2xpZW50LCBNU1BfTU9ERV9BTV9OSUNBTSk7CiAJCQkJc3RhdGUtPndhdGNoX3N0ZXJlbyA9IDE7CisJCQkJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX0w7CiAJCQl9IGVsc2UgaWYgKG1heDIgPT0gMCAmJiBzdGF0ZS0+aGFzX25pY2FtKSB7CiAJCQkJLyogRC9LIE5JQ0FNICovCiAJCQkJc3RhdGUtPnNlY29uZCA9IG1zcDM0MDBjX2NhcnJpZXJfZGV0ZWN0XzY1W21heDJdLmNkbzsKIAkJCQltc3AzNDAwY19zZXRfbW9kZShjbGllbnQsIE1TUF9NT0RFX0ZNX05JQ0FNMSk7CiAJCQkJc3RhdGUtPm5pY2FtX29uID0gMTsKIAkJCQlzdGF0ZS0+d2F0Y2hfc3RlcmVvID0gMTsKKwkJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfREs7CiAJCQl9IGVsc2UgewogCQkJCWdvdG8gbm9fc2Vjb25kOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMDogLyogNC41ICovCisJCQlzdGF0ZS0+ZGV0ZWN0ZWRfc3RkID0gVjRMMl9TVERfTU47CiAJCWRlZmF1bHQ6CiBub19zZWNvbmQ6CiAJCQlzdGF0ZS0+c2Vjb25kID0gbXNwMzQwMGNfY2Fycmllcl9kZXRlY3RfbWFpblttYXgxXS5jZG87CkBAIC02NjIsNiArNjk5LDcgQEAKIAlpbnQgdmFsLCBpLCBzdGQsIGNvdW50OwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MTAgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBWNEwyX1NURF9BTEw7CiAJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MTAgdGhyZWFkOiBzbGVlcFxuIik7CkBAIC03NDMsNiArNzgxLDggQEAKIAkJCQkJbXNwX3N0ZGxpc3RbOF0ubmFtZSA6ICJ1bmtub3duIiwgdmFsKTsKIAkJCXN0YXRlLT5zdGQgPSB2YWwgPSAweDAwMDk7CiAJCQltc3Bfd3JpdGVfZGVtKGNsaWVudCwgMHgyMCwgdmFsKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBtc3Bfc3RhbmRhcmRfc3RkKHN0YXRlLT5zdGQpOwogCQl9CiAKIAkJLyogc2V0IHN0ZXJlbyAqLwpAQCAtOTU3LDYgKzk5Nyw3IEBACiAJaW50IHZhbCwgaTsKIAogCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyBkYWVtb24gc3RhcnRlZFxuIik7CisJc3RhdGUtPmRldGVjdGVkX3N0ZCA9IFY0TDJfU1REX0FMTDsKIAlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzR4eGcgdGhyZWFkOiBzbGVlcFxuIik7CkBAIC0xMDEzLDYgKzEwNTQsNyBAQAogCQl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LAogCQkJImRldGVjdGVkIHN0YW5kYXJkOiAlcyAoMHglMDR4KVxuIiwKIAkJCW1zcF9zdGFuZGFyZF9zdGRfbmFtZShzdGF0ZS0+c3RkKSwgc3RhdGUtPnN0ZCk7CisJCXN0YXRlLT5kZXRlY3RlZF9zdGQgPSBtc3Bfc3RhbmRhcmRfc3RkKHN0YXRlLT5zdGQpOwogCiAJCWlmIChzdGF0ZS0+c3RkID09IDkpIHsKIAkJCS8qIEFNIE5JQ0FNIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKaW5kZXggNGRhOWNjYS4uZTJiMTAyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKQEAgLTEyLDEwICsxMiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAvKgogICogbXQ5bTAwMSBpMmMgYWRkcmVzcyAweDVkCkBAIC04NCwxNSArODcsMTkgQEAKIAogc3RydWN0IG10OW0wMDEgewogCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhkbDsKKwlzdHJ1Y3QgeworCQkvKiBleHBvc3VyZS9hdXRvLWV4cG9zdXJlIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqYXV0b2V4cG9zdXJlOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpleHBvc3VyZTsKKwl9OwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsJLyogU2Vuc29yIHdpbmRvdyAqLwogCWNvbnN0IHN0cnVjdCBtdDltMDAxX2RhdGFmbXQgKmZtdDsKIAljb25zdCBzdHJ1Y3QgbXQ5bTAwMV9kYXRhZm10ICpmbXRzOwogCWludCBudW1fZm10czsKIAlpbnQgbW9kZWw7CS8qIFY0TDJfSURFTlRfTVQ5TTAwMSogY29kZXMgZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLwotCXVuc2lnbmVkIGludCBnYWluOwotCXVuc2lnbmVkIGludCBleHBvc3VyZTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfaDsKIAl1bnNpZ25lZCBzaG9ydCB5X3NraXBfdG9wOwkvKiBMaW5lcyB0byBza2lwIGF0IHRoZSB0b3AgKi8KLQl1bnNpZ25lZCBjaGFyIGF1dG9leHBvc3VyZTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXQ5bTAwMSAqdG9fbXQ5bTAwMShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtMTY1LDU0ICsxNzIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDltMDAxX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyB3aWR0aF9mbGFnID0gZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQotCS8qIE9ubHkgb25lIHdpZHRoIGJpdCBtYXkgYmUgc2V0ICovCi0JaWYgKCFpc19wb3dlcl9vZl8yKHdpZHRoX2ZsYWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpY2wtPnNldF9idXNfcGFyYW0pCi0JCXJldHVybiBpY2wtPnNldF9idXNfcGFyYW0oaWNsLCB3aWR0aF9mbGFnKTsKLQotCS8qCi0JICogV2l0aG91dCBib2FyZCBzcGVjaWZpYyBidXMgd2lkdGggc2V0dGluZ3Mgd2Ugb25seSBzdXBwb3J0IHRoZQotCSAqIHNlbnNvcnMgbmF0aXZlIGJ1cyB3aWR0aAotCSAqLwotCWlmICh3aWR0aF9mbGFnID09IFNPQ0FNX0RBVEFXSURUSF8xMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXQ5bTAwMV9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JLyogTVQ5TTAwMSBoYXMgYWxsIGNhcHR1cmVfZm9ybWF0IHBhcmFtZXRlcnMgZml4ZWQgKi8KLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgU09DQU1fTUFTVEVSOwotCi0JaWYgKGljbC0+cXVlcnlfYnVzX3BhcmFtKQotCQlmbGFncyB8PSBpY2wtPnF1ZXJ5X2J1c19wYXJhbShpY2wpICYgU09DQU1fREFUQVdJRFRIX01BU0s7Ci0JZWxzZQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgbXQ5bTAwMV9zX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSB0b19tdDltMDAxKGNsaWVudCk7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0ID0gYS0+YzsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IHJldDsKIAljb25zdCB1MTYgaGJsYW5rID0gOSwgdmJsYW5rID0gMjU7Ci0JdW5zaWduZWQgaW50IHRvdGFsX2g7CiAKIAlpZiAobXQ5bTAwMS0+Zm10cyA9PSBtdDltMDAxX2NvbG91cl9mbXRzKQogCQkvKgpAQCAtMjMxLDcgKzE5Nyw3IEBACiAJc29jX2NhbWVyYV9saW1pdF9zaWRlKCZyZWN0LnRvcCwgJnJlY3QuaGVpZ2h0LAogCQkgICAgIE1UOU0wMDFfUk9XX1NLSVAsIE1UOU0wMDFfTUlOX0hFSUdIVCwgTVQ5TTAwMV9NQVhfSEVJR0hUKTsKIAotCXRvdGFsX2ggPSByZWN0LmhlaWdodCArIG10OW0wMDEtPnlfc2tpcF90b3AgKyB2Ymxhbms7CisJbXQ5bTAwMS0+dG90YWxfaCA9IHJlY3QuaGVpZ2h0ICsgbXQ5bTAwMS0+eV9za2lwX3RvcCArIHZibGFuazsKIAogCS8qIEJsYW5raW5nIGFuZCBzdGFydCB2YWx1ZXMgLSBkZWZhdWx0Li4uICovCiAJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9IT1JJWk9OVEFMX0JMQU5LSU5HLCBoYmxhbmspOwpAQCAtMjQwLDcgKzIwNiw3IEBACiAKIAkvKgogCSAqIFRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzdXBwb3J0ZWQgZm9ybWF0LCBhcyB2ZXJpZmllZCBwZXIKLQkgKiBjYWxsIHRvIGljZC0+dHJ5X2ZtdCgpCisJICogY2FsbCB0byAudHJ5X21idXNfZm10KCkKIAkgKi8KIAlpZiAoIXJldCkKIAkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9DT0xVTU5fU1RBUlQsIHJlY3QubGVmdCk7CkBAIC0yNTEsMTcgKzIxNyw4IEBACiAJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOU0wMDFfV0lORE9XX0hFSUdIVCwKIAkJCQlyZWN0LmhlaWdodCArIG10OW0wMDEtPnlfc2tpcF90b3AgLSAxKTsKLQlpZiAoIXJldCAmJiBtdDltMDAxLT5hdXRvZXhwb3N1cmUpIHsKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9TSFVUVEVSX1dJRFRILCB0b3RhbF9oKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwgPQotCQkJCXNvY19jYW1lcmFfZmluZF9xY3RybChpY2QtPm9wcywKLQkJCQkJCSAgICAgIFY0TDJfQ0lEX0VYUE9TVVJFKTsKLQkJCW10OW0wMDEtPmV4cG9zdXJlID0gKDUyNCArICh0b3RhbF9oIC0gMSkgKgotCQkJCSAocWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bSkpIC8KLQkJCQkxMDQ4ICsgcWN0cmwtPm1pbmltdW07Ci0JCX0KLQl9CisJaWYgKCFyZXQgJiYgdjRsMl9jdHJsX2dfY3RybChtdDltMDAxLT5hdXRvZXhwb3N1cmUpID09IFY0TDJfRVhQT1NVUkVfQVVUTykKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9TSFVUVEVSX1dJRFRILCBtdDltMDAxLT50b3RhbF9oKTsKIAogCWlmICghcmV0KQogCQltdDltMDAxLT5yZWN0ID0gcmVjdDsKQEAgLTQyMSwxMDcgKzM3OCw0OCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXQ5bTAwMV9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiR2FpbiIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxMjcsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gNjQsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkUsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMSwKLQkJLm1heGltdW0JPSAyNTUsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMjU1LAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJBdXRvbWF0aWMgRXhwb3N1cmUiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAxLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5bTAwMV9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gbXQ5bTAwMV9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMDAxX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gbXQ5bTAwMV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobXQ5bTAwMV9jb250cm9scyksCi19OwotCi1zdGF0aWMgaW50IG10OW0wMDFfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG10OW0wMDFfZ192b2xhdGlsZV9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gdG9fbXQ5bTAwMShjbGllbnQpOwotCWludCBkYXRhOworCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgbXQ5bTAwMSwgaGRsKTsKKwlzMzIgbWluLCBtYXg7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5TTAwMV9SRUFEX09QVElPTlMyKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4ODAwMCk7Ci0JCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJY3RybC0+dmFsdWUgPSBtdDltMDAxLT5hdXRvZXhwb3N1cmU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJY3RybC0+dmFsdWUgPSBtdDltMDAxLT5nYWluOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQljdHJsLT52YWx1ZSA9IG10OW0wMDEtPmV4cG9zdXJlOworCQltaW4gPSBtdDltMDAxLT5leHBvc3VyZS0+bWluaW11bTsKKwkJbWF4ID0gbXQ5bTAwMS0+ZXhwb3N1cmUtPm1heGltdW07CisJCW10OW0wMDEtPmV4cG9zdXJlLT52YWwgPQorCQkJKDUyNCArIChtdDltMDAxLT50b3RhbF9oIC0gMSkgKiAobWF4IC0gbWluKSkgLyAxMDQ4ICsgbWluOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTAwMV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5bTAwMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLAorCQkJCQkgICAgICAgc3RydWN0IG10OW0wMDEsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZtdDltMDAxLT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gdG9fbXQ5bTAwMShjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOworCXN0cnVjdCB2NGwyX2N0cmwgKmV4cCA9IG10OW0wMDEtPmV4cG9zdXJlOwogCWludCBkYXRhOwogCi0JcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OW0wMDFfb3BzLCBjdHJsLT5pZCk7Ci0KLQlpZiAoIXFjdHJsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCisJCWlmIChjdHJsLT52YWwpCiAJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIE1UOU0wMDFfUkVBRF9PUFRJT05TMiwgMHg4MDAwKTsKIAkJZWxzZQogCQkJZGF0YSA9IHJlZ19jbGVhcihjbGllbnQsIE1UOU0wMDFfUkVBRF9PUFRJT05TMiwgMHg4MDAwKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKKwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwgY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSkKLQkJCXJldHVybiAtRUlOVkFMOwogCQkvKiBTZWUgRGF0YXNoZWV0IFRhYmxlIDcsIEdhaW4gc2V0dGluZ3MuICovCi0JCWlmIChjdHJsLT52YWx1ZSA8PSBxY3RybC0+ZGVmYXVsdF92YWx1ZSkgeworCQlpZiAoY3RybC0+dmFsIDw9IGN0cmwtPmRlZmF1bHRfdmFsdWUpIHsKIAkJCS8qIFBhY2sgaXQgaW50byAwLi4xIHN0ZXAgMC4xMjUsIHJlZ2lzdGVyIHZhbHVlcyAwLi44ICovCi0JCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSBxY3RybC0+bWluaW11bTsKLQkJCWRhdGEgPSAoKGN0cmwtPnZhbHVlIC0gcWN0cmwtPm1pbmltdW0pICogOCArIHJhbmdlIC8gMikgLyByYW5nZTsKKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gY3RybC0+bWluaW11bTsKKwkJCWRhdGEgPSAoKGN0cmwtPnZhbCAtIGN0cmwtPm1pbmltdW0pICogOCArIHJhbmdlIC8gMikgLyByYW5nZTsKIAogCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIGdhaW4gJWRcbiIsIGRhdGEpOwogCQkJZGF0YSA9IHJlZ193cml0ZShjbGllbnQsIE1UOU0wMDFfR0xPQkFMX0dBSU4sIGRhdGEpOwpAQCAtNTMwLDggKzQyOCw4IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBQYWNrIGl0IGludG8gMS4xMjUuLjE1IHZhcmlhYmxlIHN0ZXAsIHJlZ2lzdGVyIHZhbHVlcyA5Li42NyAqLwogCQkJLyogV2UgYXNzdW1lIHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxID4gMCAqLwotCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPmRlZmF1bHRfdmFsdWUgLSAxOwotCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSkgKgorCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGN0cmwtPm1heGltdW0gLSBjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMTsKKwkJCXVuc2lnbmVkIGxvbmcgZ2FpbiA9ICgoY3RybC0+dmFsIC0gY3RybC0+ZGVmYXVsdF92YWx1ZSAtIDEpICoKIAkJCQkJICAgICAgIDExMSArIHJhbmdlIC8gMikgLyByYW5nZSArIDk7CiAKIAkJCWlmIChnYWluIDw9IDMyKQpAQCAtNTQ3LDY2ICs0NDUsNDQgQEAKIAkJCWlmIChkYXRhIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQorCQlyZXR1cm4gMDsKIAotCQkvKiBTdWNjZXNzICovCi0JCW10OW0wMDEtPmdhaW4gPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJLyogbXQ5bTAwMSBoYXMgbWF4aW11bSA9PSBkZWZhdWx0ICovCi0JCWlmIChjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtIHx8IGN0cmwtPnZhbHVlIDwgcWN0cmwtPm1pbmltdW0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZSB7Ci0JCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gcWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bTsKLQkJCXVuc2lnbmVkIGxvbmcgc2h1dHRlciA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiAxMDQ4ICsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCWlmIChjdHJsLT52YWwgPT0gVjRMMl9FWFBPU1VSRV9NQU5VQUwpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBleHAtPm1heGltdW0gLSBleHAtPm1pbmltdW07CisJCQl1bnNpZ25lZCBsb25nIHNodXR0ZXIgPSAoKGV4cC0+dmFsIC0gZXhwLT5taW5pbXVtKSAqIDEwNDggKwogCQkJCQkJIHJhbmdlIC8gMikgLyByYW5nZSArIDE7CiAKIAkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAogCQkJCSJTZXR0aW5nIHNodXR0ZXIgd2lkdGggZnJvbSAlZCB0byAlbHVcbiIsCi0JCQkJcmVnX3JlYWQoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgpLAotCQkJCXNodXR0ZXIpOworCQkJCXJlZ19yZWFkKGNsaWVudCwgTVQ5TTAwMV9TSFVUVEVSX1dJRFRIKSwgc2h1dHRlcik7CiAJCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9TSFVUVEVSX1dJRFRILCBzaHV0dGVyKSA8IDApCiAJCQkJcmV0dXJuIC1FSU87Ci0JCQltdDltMDAxLT5leHBvc3VyZSA9IGN0cmwtPnZhbHVlOwotCQkJbXQ5bTAwMS0+YXV0b2V4cG9zdXJlID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWlmIChjdHJsLT52YWx1ZSkgeworCQl9IGVsc2UgewogCQkJY29uc3QgdTE2IHZibGFuayA9IDI1OwotCQkJdW5zaWduZWQgaW50IHRvdGFsX2ggPSBtdDltMDAxLT5yZWN0LmhlaWdodCArCisKKwkJCW10OW0wMDEtPnRvdGFsX2ggPSBtdDltMDAxLT5yZWN0LmhlaWdodCArCiAJCQkJbXQ5bTAwMS0+eV9za2lwX3RvcCArIHZibGFuazsKLQkJCWlmIChyZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX1NIVVRURVJfV0lEVEgsCi0JCQkJICAgICAgdG90YWxfaCkgPCAwKQorCQkJaWYgKHJlZ193cml0ZShjbGllbnQsIE1UOU0wMDFfU0hVVFRFUl9XSURUSCwgbXQ5bTAwMS0+dG90YWxfaCkgPCAwKQogCQkJCXJldHVybiAtRUlPOwotCQkJcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoaWNkLT5vcHMsIFY0TDJfQ0lEX0VYUE9TVVJFKTsKLQkJCW10OW0wMDEtPmV4cG9zdXJlID0gKDUyNCArICh0b3RhbF9oIC0gMSkgKgotCQkJCSAocWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bSkpIC8KLQkJCQkxMDQ4ICsgcWN0cmwtPm1pbmltdW07Ci0JCQltdDltMDAxLT5hdXRvZXhwb3N1cmUgPSAxOwotCQl9IGVsc2UKLQkJCW10OW0wMDEtPmF1dG9leHBvc3VyZSA9IDA7Ci0JCWJyZWFrOworCQl9CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyoKICAqIEludGVyZmFjZSBhY3RpdmUsIGNhbiB1c2UgaTJjLiBJZiBpdCBmYWlscywgaXQgY2FuIGluZGVlZCBtZWFuLCB0aGF0CiAgKiB0aGlzIHdhc24ndCBvdXIgY2FwdHVyZSBpbnRlcmZhY2UsIHNvLCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgb25lCiAgKi8KLXN0YXRpYyBpbnQgbXQ5bTAwMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKK3N0YXRpYyBpbnQgbXQ5bTAwMV92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCiAJCQkgICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5bTAwMSAqbXQ5bTAwMSA9IHRvX210OW0wMDEoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlzMzIgZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKiBFbmFibGUgdGhlIGNoaXAgKi8KIAlkYXRhID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTAwMV9DSElQX0VOQUJMRSwgMSk7CiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJ3cml0ZTogJWRcbiIsIGRhdGEpOwpAQCAtNjYxLDE4ICs1MzcsMTEgQEAKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGlzZSB0aGUgY2FtZXJhXG4iKTsKIAogCS8qIG10OW0wMDFfaW5pdCgpIGhhcyByZXNldCB0aGUgY2hpcCwgcmV0dXJuaW5nIHJlZ2lzdGVycyB0byBkZWZhdWx0cyAqLwotCW10OW0wMDEtPmdhaW4gPSA2NDsKLQltdDltMDAxLT5leHBvc3VyZSA9IDI1NTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZtdDltMDAxLT5oZGwpOwogfQogCi1zdGF0aWMgdm9pZCBtdDltMDAxX3ZpZGVvX3JlbW92ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3N0YXRpYyB2b2lkIG10OW0wMDFfdmlkZW9fcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCWRldl9kYmcoaWNkLT5wZGV2LCAiVmlkZW8gcmVtb3ZlZDogJXAsICVwXG4iLAotCQlpY2QtPnBhcmVudCwgaWNkLT52ZGV2KTsKIAlpZiAoaWNsLT5mcmVlX2J1cykKIAkJaWNsLT5mcmVlX2J1cyhpY2wpOwogfQpAQCAtNjg3LDkgKzU1NiwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgbXQ5bTAwMV9jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gbXQ5bTAwMV9nX3ZvbGF0aWxlX2N0cmwsCisJLnNfY3RybCA9IG10OW0wMDFfc19jdHJsLAorfTsKKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDltMDAxX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQk9IG10OW0wMDFfZ19jdHJsLAotCS5zX2N0cmwJCT0gbXQ5bTAwMV9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG10OW0wMDFfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG10OW0wMDFfZ19yZWdpc3RlciwKQEAgLTcxMCw2ICs1ODIsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdDltMDAxX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwkvKiBNVDlNMDAxIGhhcyBhbGwgY2FwdHVyZV9mb3JtYXQgcGFyYW1ldGVycyBmaXhlZCAqLworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX01BU1RFUjsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTAwMV9zX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwljb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCXN0cnVjdCBtdDltMDAxICptdDltMDAxID0gdG9fbXQ5bTAwMShjbGllbnQpOworCXVuc2lnbmVkIGludCBicHMgPSBzb2NfbWJ1c19nZXRfZm10ZGVzYyhtdDltMDAxLT5mbXQtPmNvZGUpLT5iaXRzX3Blcl9zYW1wbGU7CisKKwlpZiAoaWNsLT5zZXRfYnVzX3BhcmFtKQorCQlyZXR1cm4gaWNsLT5zZXRfYnVzX3BhcmFtKGljbCwgMSA8PCAoYnBzIC0gMSkpOworCisJLyoKKwkgKiBXaXRob3V0IGJvYXJkIHNwZWNpZmljIGJ1cyB3aWR0aCBzZXR0aW5ncyB3ZSBvbmx5IHN1cHBvcnQgdGhlCisJICogc2Vuc29ycyBuYXRpdmUgYnVzIHdpZHRoCisJICovCisJcmV0dXJuIGJwcyA9PSAxMCA/IDAgOiAtRUlOVkFMOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtdDltMDAxX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gbXQ5bTAwMV9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAk9IG10OW0wMDFfc19mbXQsCkBAIC03MTksNiArNjI1LDggQEAKIAkuZ19jcm9wCQk9IG10OW0wMDFfZ19jcm9wLAogCS5jcm9wY2FwCT0gbXQ5bTAwMV9jcm9wY2FwLAogCS5lbnVtX21idXNfZm10CT0gbXQ5bTAwMV9lbnVtX2ZtdCwKKwkuZ19tYnVzX2NvbmZpZwk9IG10OW0wMDFfZ19tYnVzX2NvbmZpZywKKwkuc19tYnVzX2NvbmZpZwk9IG10OW0wMDFfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfc2Vuc29yX29wcyBtdDltMDAxX3N1YmRldl9zZW5zb3Jfb3BzID0gewpAQCAtNzM1LDE3ICs2NDMsMTAgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBtdDltMDAxICptdDltMDAxOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5TTAwMTogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlNMDAxIGRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NjIsMjUgKzY2Myw0MCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZtdDltMDAxLT5zdWJkZXYsIGNsaWVudCwgJm10OW0wMDFfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5bTAwMS0+aGRsLCA0KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTAwMS0+aGRsLCAmbXQ5bTAwMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTAwMS0+aGRsLCAmbXQ5bTAwMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0dBSU4sIDAsIDEyNywgMSwgNjQpOworCW10OW0wMDEtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoJm10OW0wMDEtPmhkbCwgJm10OW0wMDFfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMSwgMjU1LCAxLCAyNTUpOworCS8qCisJICogU2ltdWxhdGVkIGF1dG9leHBvc3VyZS4gSWYgZW5hYmxlZCwgd2UgY2FsY3VsYXRlIHNodXR0ZXIgd2lkdGgKKwkgKiBvdXJzZWx2ZXMgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiB2ZXJ0aWNhbCBibGFua2luZyBhbmQgZnJhbWUgd2lkdGgKKwkgKi8KKwltdDltMDAxLT5hdXRvZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KCZtdDltMDAxLT5oZGwsCisJCQkmbXQ5bTAwMV9jdHJsX29wcywgVjRMMl9DSURfRVhQT1NVUkVfQVVUTywgMSwgMCwKKwkJCVY0TDJfRVhQT1NVUkVfQVVUTyk7CisJbXQ5bTAwMS0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZtdDltMDAxLT5oZGw7CisJaWYgKG10OW0wMDEtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gbXQ5bTAwMS0+aGRsLmVycm9yOworCisJCWtmcmVlKG10OW0wMDEpOworCQlyZXR1cm4gZXJyOworCX0KKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZtdDltMDAxLT5hdXRvZXhwb3N1cmUsCisJCQkJCVY0TDJfRVhQT1NVUkVfTUFOVUFMLCB0cnVlKTsKIAogCS8qIFNlY29uZCBzdGFnZSBwcm9iZSAtIHdoZW4gYSBjYXB0dXJlIGFkYXB0ZXIgaXMgdGhlcmUgKi8KLQlpY2QtPm9wcwkJPSAmbXQ5bTAwMV9vcHM7Ci0KIAltdDltMDAxLT55X3NraXBfdG9wCT0gMDsKIAltdDltMDAxLT5yZWN0LmxlZnQJPSBNVDlNMDAxX0NPTFVNTl9TS0lQOwogCW10OW0wMDEtPnJlY3QudG9wCT0gTVQ5TTAwMV9ST1dfU0tJUDsKIAltdDltMDAxLT5yZWN0LndpZHRoCT0gTVQ5TTAwMV9NQVhfV0lEVEg7CiAJbXQ5bTAwMS0+cmVjdC5oZWlnaHQJPSBNVDlNMDAxX01BWF9IRUlHSFQ7CiAKLQkvKgotCSAqIFNpbXVsYXRlZCBhdXRvZXhwb3N1cmUuIElmIGVuYWJsZWQsIHdlIGNhbGN1bGF0ZSBzaHV0dGVyIHdpZHRoCi0JICogb3Vyc2VsdmVzIGluIHRoZSBkcml2ZXIgYmFzZWQgb24gdmVydGljYWwgYmxhbmtpbmcgYW5kIGZyYW1lIHdpZHRoCi0JICovCi0JbXQ5bTAwMS0+YXV0b2V4cG9zdXJlID0gMTsKLQotCXJldCA9IG10OW0wMDFfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG10OW0wMDFfdmlkZW9fcHJvYmUoaWNsLCBjbGllbnQpOwogCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDltMDAxLT5oZGwpOwogCQlrZnJlZShtdDltMDAxKTsKIAl9CiAKQEAgLTc5MCwxMCArNzA2LDExIEBACiBzdGF0aWMgaW50IG10OW0wMDFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OW0wMDEgKm10OW0wMDEgPSB0b19tdDltMDAxKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAotCWljZC0+b3BzID0gTlVMTDsKLQltdDltMDAxX3ZpZGVvX3JlbW92ZShpY2QpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZtdDltMDAxLT5zdWJkZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OW0wMDEtPmhkbCk7CisJbXQ5bTAwMV92aWRlb19yZW1vdmUoaWNsKTsKIAlrZnJlZShtdDltMDAxKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYwppbmRleCBhMzU3YWE4Li5jZjJjMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYwpAQCAtMTMsMTAgKzEzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogCiAvKgogICogTVQ5TTExMSwgTVQ5TTExMiBhbmQgTVQ5TTEzMToKQEAgLTE3Nyw2ICsxODAsOCBAQAogCiBzdHJ1Y3QgbXQ5bTExMSB7CiAJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOworCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW47CiAJaW50IG1vZGVsOwkvKiBWNEwyX0lERU5UX01UOU0xMTEgb3IgVjRMMl9JREVOVF9NVDlNMTEyIGNvZGUKIAkJCSAqIGZyb20gdjRsMi1jaGlwLWlkZW50LmggKi8KIAllbnVtIG10OW0xMTFfY29udGV4dCBjb250ZXh0OwpAQCAtMTg0LDEzICsxODksOSBAQAogCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOyAvKiBsb2NrIHRvIHByb3RlY3QgcG93ZXJfY291bnQgKi8KIAlpbnQgcG93ZXJfY291bnQ7CiAJY29uc3Qgc3RydWN0IG10OW0xMTFfZGF0YWZtdCAqZm10OwotCXVuc2lnbmVkIGludCBnYWluOwotCXVuc2lnbmVkIGNoYXIgYXV0b2V4cG9zdXJlOworCWludCBsYXN0cGFnZTsJLyogUGFnZU1hcCBjYWNoZSB2YWx1ZSAqLwogCXVuc2lnbmVkIGNoYXIgZGF0YXdpZHRoOwogCXVuc2lnbmVkIGludCBwb3dlcmVkOjE7Ci0JdW5zaWduZWQgaW50IGhmbGlwOjE7Ci0JdW5zaWduZWQgaW50IHZmbGlwOjE7Ci0JdW5zaWduZWQgaW50IGF1dG93aGl0ZWJhbGFuY2U6MTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXQ5bTExMSAqdG9fbXQ5bTExMShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtMjAyLDE3ICsyMDMsMTcgQEAKIHsKIAlpbnQgcmV0OwogCXUxNiBwYWdlOwotCXN0YXRpYyBpbnQgbGFzdHBhZ2UgPSAtMTsJLyogUGFnZU1hcCBjYWNoZSB2YWx1ZSAqLworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwogCiAJcGFnZSA9IChyZWcgPj4gOCk7Ci0JaWYgKHBhZ2UgPT0gbGFzdHBhZ2UpCisJaWYgKHBhZ2UgPT0gbXQ5bTExMS0+bGFzdHBhZ2UpCiAJCXJldHVybiAwOwogCWlmIChwYWdlID4gMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgTVQ5TTExMV9QQUdFX01BUCwgc3dhYjE2KHBhZ2UpKTsKIAlpZiAoIXJldCkKLQkJbGFzdHBhZ2UgPSBwYWdlOworCQltdDltMTExLT5sYXN0cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzYyLDIxICszNjMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG10OW0xMTFfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9NQVNURVIgfCBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84OwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdW5zaWduZWQgbG9uZyBmKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG10OW0xMTFfbWFrZV9yZWN0KHN0cnVjdCBtdDltMTExICptdDltMTExLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewpAQCAtNjU5LDUwICs2NDUsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXQ5bTExMV9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwgewkvKiBnYWluID0gMS8zMip2YWwgKD0+Z2Fpbj0xIGlmIHZhbD09MzIpICovCi0JCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiR2FpbiIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSA2MyAqIDIgKiAyLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDMyLAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJBdXRvIEV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG10OW0xMTFfb3BzID0gewotCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbSwKLQkuc2V0X2J1c19wYXJhbQkJPSBtdDltMTExX3NldF9idXNfcGFyYW0sCi0JLmNvbnRyb2xzCQk9IG10OW0xMTFfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG10OW0xMTFfY29udHJvbHMpLAotfTsKLQogc3RhdGljIGludCBtdDltMTExX3NldF9mbGlwKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgZmxpcCwgaW50IG1hc2spCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CkBAIC03NDMsNyArNjg1LDYgQEAKIAlpZiAoZ2FpbiA+IDYzICogMiAqIDIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXQ5bTExMS0+Z2FpbiA9IGdhaW47CiAJaWYgKChnYWluID49IDY0ICogMikgJiYgKGdhaW4gPCA2MyAqIDIgKiAyKSkKIAkJdmFsID0gKDEgPDwgMTApIHwgKDEgPDwgOSkgfCAoZ2FpbiAvIDQpOwogCWVsc2UgaWYgKChnYWluID49IDY0KSAmJiAoZ2FpbiA8IDY0ICogMikpCkBAIC03NTcsMTE4ICs2OTgsNDcgQEAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgb24pCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7Ci0JaW50IHJldDsKIAogCWlmIChvbikKLQkJcmV0ID0gcmVnX3NldChPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT0VYUE9fRU4pOwotCWVsc2UKLQkJcmV0ID0gcmVnX2NsZWFyKE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTik7Ci0KLQlpZiAoIXJldCkKLQkJbXQ5bTExMS0+YXV0b2V4cG9zdXJlID0gb247Ci0KLQlyZXR1cm4gcmV0OworCQlyZXR1cm4gcmVnX3NldChPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT0VYUE9fRU4pOworCXJldHVybiByZWdfY2xlYXIoT1BFUl9NT0RFX0NUUkwsIE1UOU0xMTFfT1BNT0RFX0FVVE9FWFBPX0VOKTsKIH0KIAogc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgb24pCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7Ci0JaW50IHJldDsKIAogCWlmIChvbikKLQkJcmV0ID0gcmVnX3NldChPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT1dISVRFQkFMX0VOKTsKLQllbHNlCi0JCXJldCA9IHJlZ19jbGVhcihPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT1dISVRFQkFMX0VOKTsKLQotCWlmICghcmV0KQotCQltdDltMTExLT5hdXRvd2hpdGViYWxhbmNlID0gb247Ci0KLQlyZXR1cm4gcmV0OworCQlyZXR1cm4gcmVnX3NldChPUEVSX01PREVfQ1RSTCwgTVQ5TTExMV9PUE1PREVfQVVUT1dISVRFQkFMX0VOKTsKKwlyZXR1cm4gcmVnX2NsZWFyKE9QRVJfTU9ERV9DVFJMLCBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4pOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG10OW0xMTFfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKLQlpbnQgZGF0YTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLAorCQkJCQkgICAgICAgc3RydWN0IG10OW0xMTEsIGhkbCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKG10OW0xMTEtPmNvbnRleHQgPT0gSElHSFBPV0VSKQotCQkJZGF0YSA9IHJlZ19yZWFkKFJFQURfTU9ERV9CKTsKLQkJZWxzZQotCQkJZGF0YSA9IHJlZ19yZWFkKFJFQURfTU9ERV9BKTsKLQotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1MpOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAobXQ5bTExMS0+Y29udGV4dCA9PSBISUdIUE9XRVIpCi0JCQlkYXRhID0gcmVnX3JlYWQoUkVBRF9NT0RFX0IpOwotCQllbHNlCi0JCQlkYXRhID0gcmVnX3JlYWQoUkVBRF9NT0RFX0EpOwotCi0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJZGF0YSA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gZGF0YTsKLQkJY3RybC0+dmFsdWUgPSBkYXRhOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWN0cmwtPnZhbHVlID0gbXQ5bTExMS0+YXV0b2V4cG9zdXJlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKLQkJY3RybC0+dmFsdWUgPSBtdDltMTExLT5hdXRvd2hpdGViYWxhbmNlOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5bTExMV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKLQlpbnQgcmV0OwotCi0JcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJm10OW0xMTFfb3BzLCBjdHJsLT5pZCk7Ci0JaWYgKCFxY3RybCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJbXQ5bTExMS0+dmZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBjdHJsLT52YWx1ZSwKKwkJcmV0dXJuIG10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgY3RybC0+dmFsLAogCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7Ci0JCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCW10OW0xMTEtPmhmbGlwID0gY3RybC0+dmFsdWU7Ci0JCXJldCA9IG10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgY3RybC0+dmFsdWUsCisJCXJldHVybiBtdDltMTExX3NldF9mbGlwKG10OW0xMTEsIGN0cmwtPnZhbCwKIAkJCQkJTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOwotCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCXJldCA9IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKG10OW0xMTEsIGN0cmwtPnZhbHVlKTsKLQkJYnJlYWs7CisJCXJldHVybiBtdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBjdHJsLT52YWwpOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBjdHJsLT52YWx1ZSk7Ci0JCWJyZWFrOworCQlyZXR1cm4gbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKG10OW0xMTEsIGN0cmwtPnZhbCk7CiAJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCXJldCA9ICBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKG10OW0xMTEsIGN0cmwtPnZhbHVlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgY3RybC0+dmFsKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IG10OW0xMTFfc3VzcGVuZChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQltdDltMTExLT5nYWluID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4obXQ5bTExMSk7CisJdjRsMl9jdHJsX3NfY3RybChtdDltMTExLT5nYWluLCBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihtdDltMTExKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg3OCwxMSArNzQ4LDcgQEAKIAltdDltMTExX3NldF9jb250ZXh0KG10OW0xMTEsIG10OW0xMTEtPmNvbnRleHQpOwogCW10OW0xMTFfc2V0X3BpeGZtdChtdDltMTExLCBtdDltMTExLT5mbXQtPmNvZGUpOwogCW10OW0xMTFfc2V0dXBfcmVjdChtdDltMTExLCAmbXQ5bTExMS0+cmVjdCk7Ci0JbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBtdDltMTExLT5oZmxpcCwgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOwotCW10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgbXQ5bTExMS0+dmZsaXAsIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKLQltdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBtdDltMTExLT5nYWluKTsKLQltdDltMTExX3NldF9hdXRvZXhwb3N1cmUobXQ5bTExMSwgbXQ5bTExMS0+YXV0b2V4cG9zdXJlKTsKLQltdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKG10OW0xMTEsIG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UpOworCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZtdDltMTExLT5oZGwpOwogfQogCiBzdGF0aWMgaW50IG10OW0xMTFfcmVzdW1lKHN0cnVjdCBtdDltMTExICptdDltMTExKQpAQCAtOTEwLDggKzc3Niw2IEBACiAJCXJldCA9IG10OW0xMTFfcmVzZXQobXQ5bTExMSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IG10OW0xMTFfc2V0X2NvbnRleHQobXQ5bTExMSwgbXQ5bTExMS0+Y29udGV4dCk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibXQ5bTExMSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTkyMSwyMCArNzg1LDEyIEBACiAgKiBJbnRlcmZhY2UgYWN0aXZlLCBjYW4gdXNlIGkyYy4gSWYgaXQgZmFpbHMsIGl0IGNhbiBpbmRlZWQgbWVhbiwgdGhhdAogICogdGhpcyB3YXNuJ3Qgb3VyIGNhcHR1cmUgaW50ZXJmYWNlLCBzbywgd2Ugd2FpdCBmb3IgdGhlIHJpZ2h0IG9uZQogICovCi1zdGF0aWMgaW50IG10OW0xMTFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgbXQ5bTExMV92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwogCXMzMiBkYXRhOwogCWludCByZXQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KLQltdDltMTExLT5hdXRvZXhwb3N1cmUgPSAxOwotCW10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UgPSAxOwotCiAJZGF0YSA9IHJlZ19yZWFkKENISVBfVkVSU0lPTik7CiAKIAlzd2l0Y2ggKGRhdGEpIHsKQEAgLTk0OCwxNyArODA0LDE2IEBACiAJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkRldGVjdGVkIGEgTVQ5TTExMiBjaGlwIElEICV4XG4iLCBkYXRhKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0ID0gLUVOT0RFVjsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkiTm8gTVQ5TTExMS9NVDlNMTEyL01UOU0xMzEgY2hpcCBkZXRlY3RlZCByZWdpc3RlciByZWFkICV4XG4iLAogCQkJZGF0YSk7Ci0JCWdvdG8gZWkyYzsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmV0ID0gbXQ5bTExMV9pbml0KG10OW0xMTEpOwotCi1laTJjOgotCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJm10OW0xMTEtPmhkbCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKQEAgLTk5NSw5ICs4NTAsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgbXQ5bTExMV9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gbXQ5bTExMV9zX2N0cmwsCit9OworCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG10OW0xMTFfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2N0cmwJCT0gbXQ5bTExMV9nX2N0cmwsCi0JLnNfY3RybAkJPSBtdDltMTExX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CT0gbXQ5bTExMV9nX2NoaXBfaWRlbnQsCiAJLnNfcG93ZXIJPSBtdDltMTExX3NfcG93ZXIsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwpAQCAtMTAxNiw2ICs4NzMsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdDltMTExX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OW0xMTFfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19tYnVzX2ZtdAk9IG10OW0xMTFfc19mbXQsCiAJLmdfbWJ1c19mbXQJPSBtdDltMTExX2dfZm10LApAQCAtMTAyNCw2ICs4OTYsNyBAQAogCS5nX2Nyb3AJCT0gbXQ5bTExMV9nX2Nyb3AsCiAJLmNyb3BjYXAJPSBtdDltMTExX2Nyb3BjYXAsCiAJLmVudW1fbWJ1c19mbXQJPSBtdDltMTExX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gbXQ5bTExMV9nX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXQ5bTExMV9zdWJkZXZfb3BzID0gewpAQCAtMTAzNSwxNyArOTA4LDEwIEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm10OW0xMTE6IHNvYy1jYW1lcmEgZGF0YSBtaXNzaW5nIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCWlmICghaWNsKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibXQ5bTExMTogZHJpdmVyIG5lZWRzIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNjIsMTkgKzkyOCwzNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZtdDltMTExLT5zdWJkZXYsIGNsaWVudCwgJm10OW0xMTFfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5bTExMS0+aGRsLCA1KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTExMS0+aGRsLCAmbXQ5bTExMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTExMS0+aGRsLCAmbXQ5bTExMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0hGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5bTExMS0+aGRsLCAmbXQ5bTExMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwgMCwgMSwgMSwgMSk7CisJbXQ5bTExMS0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKCZtdDltMTExLT5oZGwsICZtdDltMTExX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgNjMgKiAyICogMiwgMSwgMzIpOworCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoJm10OW0xMTEtPmhkbCwKKwkJCSZtdDltMTExX2N0cmxfb3BzLCBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAxLCAwLAorCQkJVjRMMl9FWFBPU1VSRV9BVVRPKTsKKwltdDltMTExLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJm10OW0xMTEtPmhkbDsKKwlpZiAobXQ5bTExMS0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSBtdDltMTExLT5oZGwuZXJyb3I7CisKKwkJa2ZyZWUobXQ5bTExMSk7CisJCXJldHVybiBlcnI7CisJfQogCiAJLyogU2Vjb25kIHN0YWdlIHByb2JlIC0gd2hlbiBhIGNhcHR1cmUgYWRhcHRlciBpcyB0aGVyZSAqLwotCWljZC0+b3BzCQk9ICZtdDltMTExX29wczsKLQogCW10OW0xMTEtPnJlY3QubGVmdAk9IE1UOU0xMTFfTUlOX0RBUktfQ09MUzsKIAltdDltMTExLT5yZWN0LnRvcAk9IE1UOU0xMTFfTUlOX0RBUktfUk9XUzsKIAltdDltMTExLT5yZWN0LndpZHRoCT0gTVQ5TTExMV9NQVhfV0lEVEg7CiAJbXQ5bTExMS0+cmVjdC5oZWlnaHQJPSBNVDlNMTExX01BWF9IRUlHSFQ7CiAJbXQ5bTExMS0+Zm10CQk9ICZtdDltMTExX2NvbG91cl9mbXRzWzBdOworCW10OW0xMTEtPmxhc3RwYWdlCT0gLTE7CiAKLQlyZXQgPSBtdDltMTExX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50KTsKKwlyZXQgPSBtdDltMTExX3ZpZGVvX3Byb2JlKGNsaWVudCk7CiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OW0xMTEtPmhkbCk7CiAJCWtmcmVlKG10OW0xMTEpOwogCX0KIApAQCAtMTA4NCw5ICs5NjgsOSBAQAogc3RhdGljIGludCBtdDltMTExX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWljZC0+b3BzID0gTlVMTDsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmbXQ5bTExMS0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDltMTExLT5oZGwpOwogCWtmcmVlKG10OW0xMTEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXAwMzEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5cDAzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzA2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXAwMzEuYwpAQCAtMCwwICsxLDk2NCBAQAorLyoKKyAqIERyaXZlciBmb3IgTVQ5UDAzMSBDTU9TIEltYWdlIFNlbnNvciBmcm9tIEFwdGluYQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCBKYXZpZXIgTWFydGluIDxqYXZpZXIubWFydGluQHZpc3RhLXNpbGljb24uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDExLCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgTVQ5VjAzMiBkcml2ZXIgYW5kIEJhc3RpYW4gSGVjaHQncyBjb2RlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9tdDlwMDMxLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2RlZmluZSBNVDlQMDMxX1BJWEVMX0FSUkFZX1dJRFRICQkJMjc1MgorI2RlZmluZSBNVDlQMDMxX1BJWEVMX0FSUkFZX0hFSUdIVAkJCTIwMDQKKworI2RlZmluZSBNVDlQMDMxX0NISVBfVkVSU0lPTgkJCQkweDAwCisjZGVmaW5lCQlNVDlQMDMxX0NISVBfVkVSU0lPTl9WQUxVRQkJMHgxODAxCisjZGVmaW5lIE1UOVAwMzFfUk9XX1NUQVJUCQkJCTB4MDEKKyNkZWZpbmUJCU1UOVAwMzFfUk9XX1NUQVJUX01JTgkJCTAKKyNkZWZpbmUJCU1UOVAwMzFfUk9XX1NUQVJUX01BWAkJCTIwMDQKKyNkZWZpbmUJCU1UOVAwMzFfUk9XX1NUQVJUX0RFRgkJCTU0CisjZGVmaW5lIE1UOVAwMzFfQ09MVU1OX1NUQVJUCQkJCTB4MDIKKyNkZWZpbmUJCU1UOVAwMzFfQ09MVU1OX1NUQVJUX01JTgkJMAorI2RlZmluZQkJTVQ5UDAzMV9DT0xVTU5fU1RBUlRfTUFYCQkyNzUwCisjZGVmaW5lCQlNVDlQMDMxX0NPTFVNTl9TVEFSVF9ERUYJCTE2CisjZGVmaW5lIE1UOVAwMzFfV0lORE9XX0hFSUdIVAkJCQkweDAzCisjZGVmaW5lCQlNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUlOCQkyCisjZGVmaW5lCQlNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUFYCQkyMDA2CisjZGVmaW5lCQlNVDlQMDMxX1dJTkRPV19IRUlHSFRfREVGCQkxOTQ0CisjZGVmaW5lIE1UOVAwMzFfV0lORE9XX1dJRFRICQkJCTB4MDQKKyNkZWZpbmUJCU1UOVAwMzFfV0lORE9XX1dJRFRIX01JTgkJMgorI2RlZmluZQkJTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUFYCQkyNzUyCisjZGVmaW5lCQlNVDlQMDMxX1dJTkRPV19XSURUSF9ERUYJCTI1OTIKKyNkZWZpbmUgTVQ5UDAzMV9IT1JJWk9OVEFMX0JMQU5LCQkJMHgwNQorI2RlZmluZQkJTVQ5UDAzMV9IT1JJWk9OVEFMX0JMQU5LX01JTgkJMAorI2RlZmluZQkJTVQ5UDAzMV9IT1JJWk9OVEFMX0JMQU5LX01BWAkJNDA5NQorI2RlZmluZSBNVDlQMDMxX1ZFUlRJQ0FMX0JMQU5LCQkJCTB4MDYKKyNkZWZpbmUJCU1UOVAwMzFfVkVSVElDQUxfQkxBTktfTUlOCQkwCisjZGVmaW5lCQlNVDlQMDMxX1ZFUlRJQ0FMX0JMQU5LX01BWAkJNDA5NQorI2RlZmluZQkJTVQ5UDAzMV9WRVJUSUNBTF9CTEFOS19ERUYJCTI1CisjZGVmaW5lIE1UOVAwMzFfT1VUUFVUX0NPTlRST0wJCQkJMHgwNworI2RlZmluZQkJTVQ5UDAzMV9PVVRQVVRfQ09OVFJPTF9DRU4JCTIKKyNkZWZpbmUJCU1UOVAwMzFfT1VUUFVUX0NPTlRST0xfU1lOCQkxCisjZGVmaW5lCQlNVDlQMDMxX09VVFBVVF9DT05UUk9MX0RFRgkJMHgxZjgyCisjZGVmaW5lIE1UOVAwMzFfU0hVVFRFUl9XSURUSF9VUFBFUgkJCTB4MDgKKyNkZWZpbmUgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX0xPV0VSCQkJMHgwOQorI2RlZmluZQkJTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX01JTgkJMQorI2RlZmluZQkJTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX01BWAkJMTA0ODU3NQorI2RlZmluZQkJTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX0RFRgkJMTk0MworI2RlZmluZQlNVDlQMDMxX1BMTF9DT05UUk9MCQkJCTB4MTAKKyNkZWZpbmUJCU1UOVAwMzFfUExMX0NPTlRST0xfUFdST0ZGCQkweDAwNTAKKyNkZWZpbmUJCU1UOVAwMzFfUExMX0NPTlRST0xfUFdST04JCTB4MDA1MQorI2RlZmluZQkJTVQ5UDAzMV9QTExfQ09OVFJPTF9VU0VQTEwJCTB4MDA1MgorI2RlZmluZQlNVDlQMDMxX1BMTF9DT05GSUdfMQkJCQkweDExCisjZGVmaW5lCU1UOVAwMzFfUExMX0NPTkZJR18yCQkJCTB4MTIKKyNkZWZpbmUgTVQ5UDAzMV9QSVhFTF9DTE9DS19DT05UUk9MCQkJMHgwYQorI2RlZmluZSBNVDlQMDMxX0ZSQU1FX1JFU1RBUlQJCQkJMHgwYgorI2RlZmluZSBNVDlQMDMxX1NIVVRURVJfREVMQVkJCQkJMHgwYworI2RlZmluZSBNVDlQMDMxX1JTVAkJCQkJMHgwZAorI2RlZmluZQkJTVQ5UDAzMV9SU1RfRU5BQkxFCQkJMQorI2RlZmluZQkJTVQ5UDAzMV9SU1RfRElTQUJMRQkJCTAKKyNkZWZpbmUgTVQ5UDAzMV9SRUFEX01PREVfMQkJCQkweDFlCisjZGVmaW5lIE1UOVAwMzFfUkVBRF9NT0RFXzIJCQkJMHgyMAorI2RlZmluZQkJTVQ5UDAzMV9SRUFEX01PREVfMl9ST1dfTUlSCQkoMSA8PCAxNSkKKyNkZWZpbmUJCU1UOVAwMzFfUkVBRF9NT0RFXzJfQ09MX01JUgkJKDEgPDwgMTQpCisjZGVmaW5lCQlNVDlQMDMxX1JFQURfTU9ERV8yX1JPV19CTEMJCSgxIDw8IDYpCisjZGVmaW5lIE1UOVAwMzFfUk9XX0FERFJFU1NfTU9ERQkJCTB4MjIKKyNkZWZpbmUgTVQ5UDAzMV9DT0xVTU5fQUREUkVTU19NT0RFCQkJMHgyMworI2RlZmluZSBNVDlQMDMxX0dMT0JBTF9HQUlOCQkJCTB4MzUKKyNkZWZpbmUJCU1UOVAwMzFfR0xPQkFMX0dBSU5fTUlOCQkJOAorI2RlZmluZQkJTVQ5UDAzMV9HTE9CQUxfR0FJTl9NQVgJCQkxMDI0CisjZGVmaW5lCQlNVDlQMDMxX0dMT0JBTF9HQUlOX0RFRgkJCTgKKyNkZWZpbmUJCU1UOVAwMzFfR0xPQkFMX0dBSU5fTVVMVAkJKDEgPDwgNikKKyNkZWZpbmUgTVQ5UDAzMV9ST1dfQkxBQ0tfREVGX09GRlNFVAkJCTB4NGIKKyNkZWZpbmUgTVQ5UDAzMV9URVNUX1BBVFRFUk4JCQkJMHhhMAorI2RlZmluZQkJTVQ5UDAzMV9URVNUX1BBVFRFUk5fU0hJRlQJCTMKKyNkZWZpbmUJCU1UOVAwMzFfVEVTVF9QQVRURVJOX0VOQUJMRQkJKDEgPDwgMCkKKyNkZWZpbmUJCU1UOVAwMzFfVEVTVF9QQVRURVJOX0RJU0FCTEUJCSgwIDw8IDApCisjZGVmaW5lIE1UOVAwMzFfVEVTVF9QQVRURVJOX0dSRUVOCQkJMHhhMQorI2RlZmluZSBNVDlQMDMxX1RFU1RfUEFUVEVSTl9SRUQJCQkweGEyCisjZGVmaW5lIE1UOVAwMzFfVEVTVF9QQVRURVJOX0JMVUUJCQkweGEzCisKK3N0cnVjdCBtdDlwMDMxX3BsbF9kaXZzIHsKKwl1MzIgZXh0X2ZyZXE7CisJdTMyIHRhcmdldF9mcmVxOworCXU4IG07CisJdTggbjsKKwl1OCBwMTsKK307CisKK3N0cnVjdCBtdDlwMDMxIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCBtZWRpYV9wYWQgcGFkOworCXN0cnVjdCB2NGwyX3JlY3QgY3JvcDsgIC8qIFNlbnNvciB3aW5kb3cgKi8KKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybHM7CisJc3RydWN0IG10OXAwMzFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7IC8qIGxvY2sgdG8gcHJvdGVjdCBwb3dlcl9jb3VudCAqLworCWludCBwb3dlcl9jb3VudDsKKwl1MTYgeHNraXA7CisJdTE2IHlza2lwOworCisJY29uc3Qgc3RydWN0IG10OXAwMzFfcGxsX2RpdnMgKnBsbDsKKworCS8qIFJlZ2lzdGVycyBjYWNoZSAqLworCXUxNiBvdXRwdXRfY29udHJvbDsKKwl1MTYgbW9kZTI7Cit9OworCitzdGF0aWMgc3RydWN0IG10OXAwMzEgKnRvX210OXAwMzEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5cDAzMSwgc3ViZGV2KTsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXMzMiBkYXRhID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKKwlyZXR1cm4gZGF0YSA8IDAgPyBkYXRhIDogYmUxNl90b19jcHUoZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiBkYXRhKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBjcHVfdG9fYmUxNihkYXRhKSk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zZXRfb3V0cHV0X2NvbnRyb2woc3RydWN0IG10OXAwMzEgKm10OXAwMzEsIHUxNiBjbGVhciwKKwkJCQkgICAgICB1MTYgc2V0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDlwMDMxLT5zdWJkZXYpOworCXUxNiB2YWx1ZSA9IChtdDlwMDMxLT5vdXRwdXRfY29udHJvbCAmIH5jbGVhcikgfCBzZXQ7CisJaW50IHJldDsKKworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX09VVFBVVF9DT05UUk9MLCB2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltdDlwMDMxLT5vdXRwdXRfY29udHJvbCA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfc2V0X21vZGUyKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxLCB1MTYgY2xlYXIsIHUxNiBzZXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJdTE2IHZhbHVlID0gKG10OXAwMzEtPm1vZGUyICYgfmNsZWFyKSB8IHNldDsKKwlpbnQgcmV0OworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUkVBRF9NT0RFXzIsIHZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW10OXAwMzEtPm1vZGUyID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9yZXNldChzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBjaGlwIG91dHB1dCwgc3luY2hyb25vdXMgb3B0aW9uIHVwZGF0ZSAqLworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1JTVCwgTVQ5UDAzMV9SU1RfRU5BQkxFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9SU1QsIE1UOVAwMzFfUlNUX0RJU0FCTEUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG10OXAwMzFfc2V0X291dHB1dF9jb250cm9sKG10OXAwMzEsIE1UOVAwMzFfT1VUUFVUX0NPTlRST0xfQ0VOLAorCQkJCQkgIDApOworfQorCisvKgorICogVGhpcyBzdGF0aWMgdGFibGUgdXNlcyBleHRfZnJlcSBhbmQgdmRkX2lvIHZhbHVlcyB0byBzZWxlY3Qgc3VpdGFibGUKKyAqIFBMTCBkaXZpZGVycyBtLCBuIGFuZCBwMSB3aGljaCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBhcyBzcGVjaWZpZWMgaW4gcDM2CisgKiBvZiBBcHRpbmEncyBtdDlwMDMxIGRhdGFzaGVldC4gTmV3IHZhbHVlcyBzaG91bGQgYmUgYWRkZWQgaGVyZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtdDlwMDMxX3BsbF9kaXZzIG10OXAwMzFfZGl2c1tdID0geworCS8qIGV4dF9mcmVxCXRhcmdldF9mcmVxCW0JbglwMSAqLworCXsyMTAwMDAwMCwJNDgwMDAwMDAsCTI2LAkyLAk2fQorfTsKKworc3RhdGljIGludCBtdDlwMDMxX3BsbF9nZXRfZGl2cyhzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5cDAzMS0+c3ViZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXAwMzFfZGl2cyk7IGkrKykgeworCQlpZiAobXQ5cDAzMV9kaXZzW2ldLmV4dF9mcmVxID09IG10OXAwMzEtPnBkYXRhLT5leHRfZnJlcSAmJgorCQkgIG10OXAwMzFfZGl2c1tpXS50YXJnZXRfZnJlcSA9PSBtdDlwMDMxLT5wZGF0YS0+dGFyZ2V0X2ZyZXEpIHsKKwkJCW10OXAwMzEtPnBsbCA9ICZtdDlwMDMxX2RpdnNbaV07CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ291bGRuJ3QgZmluZCBQTEwgZGl2aWRlcnMgZm9yIGV4dF9mcmVxID0gJWQsICIKKwkJInRhcmdldF9mcmVxID0gJWRcbiIsIG10OXAwMzEtPnBkYXRhLT5leHRfZnJlcSwKKwkJbXQ5cDAzMS0+cGRhdGEtPnRhcmdldF9mcmVxKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3BsbF9lbmFibGUoc3RydWN0IG10OXAwMzEgKm10OXAwMzEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJaW50IHJldDsKKworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1BMTF9DT05UUk9MLAorCQkJICAgIE1UOVAwMzFfUExMX0NPTlRST0xfUFdST04pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUExMX0NPTkZJR18xLAorCQkJICAgIChtdDlwMDMxLT5wbGwtPm0gPDwgOCkgfCAobXQ5cDAzMS0+cGxsLT5uIC0gMSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUExMX0NPTkZJR18yLCBtdDlwMDMxLT5wbGwtPnAxIC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUExMX0NPTlRST0wsCisJCQkgICAgTVQ5UDAzMV9QTExfQ09OVFJPTF9QV1JPTiB8CisJCQkgICAgTVQ5UDAzMV9QTExfQ09OVFJPTF9VU0VQTEwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG10OXAwMzFfcGxsX2Rpc2FibGUoc3RydWN0IG10OXAwMzEgKm10OXAwMzEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisKKwlyZXR1cm4gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUExMX0NPTlRST0wsCisJCQkgICAgIE1UOVAwMzFfUExMX0NPTlRST0xfUFdST0ZGKTsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3Bvd2VyX29uKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxKQoreworCS8qIEVuc3VyZSBSRVNFVF9CQVIgaXMgbG93ICovCisJaWYgKG10OXAwMzEtPnBkYXRhLT5yZXNldCkgeworCQltdDlwMDMxLT5wZGF0YS0+cmVzZXQoJm10OXAwMzEtPnN1YmRldiwgMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisKKwkvKiBFbWFibGUgY2xvY2sgKi8KKwlpZiAobXQ5cDAzMS0+cGRhdGEtPnNldF94Y2xrKQorCQltdDlwMDMxLT5wZGF0YS0+c2V0X3hjbGsoJm10OXAwMzEtPnN1YmRldiwKKwkJCQkJIG10OXAwMzEtPnBkYXRhLT5leHRfZnJlcSk7CisKKwkvKiBOb3cgUkVTRVRfQkFSIG11c3QgYmUgaGlnaCAqLworCWlmIChtdDlwMDMxLT5wZGF0YS0+cmVzZXQpIHsKKwkJbXQ5cDAzMS0+cGRhdGEtPnJlc2V0KCZtdDlwMDMxLT5zdWJkZXYsIDApOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10OXAwMzFfcG93ZXJfb2ZmKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxKQoreworCWlmIChtdDlwMDMxLT5wZGF0YS0+cmVzZXQpIHsKKwkJbXQ5cDAzMS0+cGRhdGEtPnJlc2V0KCZtdDlwMDMxLT5zdWJkZXYsIDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQorCisJaWYgKG10OXAwMzEtPnBkYXRhLT5zZXRfeGNsaykKKwkJbXQ5cDAzMS0+cGRhdGEtPnNldF94Y2xrKCZtdDlwMDMxLT5zdWJkZXYsIDApOworfQorCitzdGF0aWMgaW50IF9fbXQ5cDAzMV9zZXRfcG93ZXIoc3RydWN0IG10OXAwMzEgKm10OXAwMzEsIGJvb2wgb24pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJaW50IHJldDsKKworCWlmICghb24pIHsKKwkJbXQ5cDAzMV9wb3dlcl9vZmYobXQ5cDAzMSk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IG10OXAwMzFfcG93ZXJfb24obXQ5cDAzMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtdDlwMDMxX3Jlc2V0KG10OXAwMzEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlc2V0IHRoZSBjYW1lcmFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmbXQ5cDAzMS0+Y3RybHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zZXRfcGFyYW1zKHN0cnVjdCBtdDlwMDMxICptdDlwMDMxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDlwMDMxLT5zdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdCA9ICZtdDlwMDMxLT5mb3JtYXQ7CisJY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqY3JvcCA9ICZtdDlwMDMxLT5jcm9wOworCXVuc2lnbmVkIGludCBoYmxhbms7CisJdW5zaWduZWQgaW50IHZibGFuazsKKwl1bnNpZ25lZCBpbnQgeHNraXA7CisJdW5zaWduZWQgaW50IHlza2lwOworCXVuc2lnbmVkIGludCB4YmluOworCXVuc2lnbmVkIGludCB5YmluOworCWludCByZXQ7CisKKwkvKiBXaW5kb3dzIHBvc2l0aW9uIGFuZCBzaXplLgorCSAqCisJICogVE9ETzogTWFrZSBzdXJlIHRoZSBzdGFydCBjb29yZGluYXRlcyBhbmQgd2luZG93IHNpemUgbWF0Y2ggdGhlCisJICogc2tpcHBpbmcsIGJpbm5pbmcgYW5kIG1pcnJvcmluZyAoc2VlIGRlc2NyaXB0aW9uIG9mIHJlZ2lzdGVycyAyIGFuZCA0CisJICogaW4gdGFibGUgMTMsIGFuZCBCaW5uaW5nIHNlY3Rpb24gb24gcGFnZSA0MSkuCisJICovCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfQ09MVU1OX1NUQVJULCBjcm9wLT5sZWZ0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9ST1dfU1RBUlQsIGNyb3AtPnRvcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfV0lORE9XX1dJRFRILCBjcm9wLT53aWR0aCAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1dJTkRPV19IRUlHSFQsIGNyb3AtPmhlaWdodCAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUm93IGFuZCBjb2x1bW4gYmlubmluZyBhbmQgc2tpcHBpbmcuIFVzZSB0aGUgbWF4aW11bSBiaW5uaW5nIHZhbHVlCisJICogY29tcGF0aWJsZSB3aXRoIHRoZSBza2lwcGluZyBzZXR0aW5ncy4KKwkgKi8KKwl4c2tpcCA9IERJVl9ST1VORF9DTE9TRVNUKGNyb3AtPndpZHRoLCBmb3JtYXQtPndpZHRoKTsKKwl5c2tpcCA9IERJVl9ST1VORF9DTE9TRVNUKGNyb3AtPmhlaWdodCwgZm9ybWF0LT5oZWlnaHQpOworCXhiaW4gPSAxIDw8IChmZnMoeHNraXApIC0gMSk7CisJeWJpbiA9IDEgPDwgKGZmcyh5c2tpcCkgLSAxKTsKKworCXJldCA9IG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX0NPTFVNTl9BRERSRVNTX01PREUsCisJCQkgICAgKCh4YmluIC0gMSkgPDwgNCkgfCAoeHNraXAgLSAxKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUk9XX0FERFJFU1NfTU9ERSwKKwkJCSAgICAoKHliaW4gLSAxKSA8PCA0KSB8ICh5c2tpcCAtIDEpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEJsYW5raW5nIC0gdXNlIG1pbmltdW0gdmFsdWUgZm9yIGhvcml6b250YWwgYmxhbmtpbmcgYW5kIGRlZmF1bHQKKwkgKiB2YWx1ZSBmb3IgdmVydGljYWwgYmxhbmtpbmcuCisJICovCisJaGJsYW5rID0gMzQ2ICogeWJpbiArIDY0ICsgKDgwID4+IG1heF90KHVuc2lnbmVkIGludCwgeGJpbiwgMykpOworCXZibGFuayA9IE1UOVAwMzFfVkVSVElDQUxfQkxBTktfREVGOworCisJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfSE9SSVpPTlRBTF9CTEFOSywgaGJsYW5rKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9WRVJUSUNBTF9CTEFOSywgdmJsYW5rKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFibGUpIHsKKwkJLyogU3RvcCBzZW5zb3IgcmVhZG91dCAqLworCQlyZXQgPSBtdDlwMDMxX3NldF9vdXRwdXRfY29udHJvbChtdDlwMDMxLAorCQkJCQkJIE1UOVAwMzFfT1VUUFVUX0NPTlRST0xfQ0VOLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiBtdDlwMDMxX3BsbF9kaXNhYmxlKG10OXAwMzEpOworCX0KKworCXJldCA9IG10OXAwMzFfc2V0X3BhcmFtcyhtdDlwMDMxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFN3aXRjaCB0byBtYXN0ZXIgIm5vcm1hbCIgbW9kZSAqLworCXJldCA9IG10OXAwMzFfc2V0X291dHB1dF9jb250cm9sKG10OXAwMzEsIDAsCisJCQkJCSBNVDlQMDMxX09VVFBVVF9DT05UUk9MX0NFTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbXQ5cDAzMV9wbGxfZW5hYmxlKG10OXAwMzEpOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCisJaWYgKGNvZGUtPnBhZCB8fCBjb2RlLT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb2RlLT5jb2RlID0gbXQ5cDAzMS0+Zm9ybWF0LmNvZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9lbnVtX2ZyYW1lX3NpemUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZnJhbWVfc2l6ZV9lbnVtICpmc2UpCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisKKwlpZiAoZnNlLT5pbmRleCA+PSA4IHx8IGZzZS0+Y29kZSAhPSBtdDlwMDMxLT5mb3JtYXQuY29kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc2UtPm1pbl93aWR0aCA9IE1UOVAwMzFfV0lORE9XX1dJRFRIX0RFRgorCQkgICAgICAgLyBtaW5fdCh1bnNpZ25lZCBpbnQsIDcsIGZzZS0+aW5kZXggKyAxKTsKKwlmc2UtPm1heF93aWR0aCA9IGZzZS0+bWluX3dpZHRoOworCWZzZS0+bWluX2hlaWdodCA9IE1UOVAwMzFfV0lORE9XX0hFSUdIVF9ERUYgLyAoZnNlLT5pbmRleCArIDEpOworCWZzZS0+bWF4X2hlaWdodCA9IGZzZS0+bWluX2hlaWdodDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqCitfX210OXAwMzFfZ2V0X3BhZF9mb3JtYXQoc3RydWN0IG10OXAwMzEgKm10OXAwMzEsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgdW5zaWduZWQgaW50IHBhZCwgdTMyIHdoaWNoKQoreworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9UUlk6CisJCXJldHVybiB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgcGFkKTsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU6CisJCXJldHVybiAmbXQ5cDAzMS0+Zm9ybWF0OworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3JlY3QgKgorX19tdDlwMDMxX2dldF9wYWRfY3JvcChzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJICAgICB1bnNpZ25lZCBpbnQgcGFkLCB1MzIgd2hpY2gpCit7CisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX1RSWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgcGFkKTsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU6CisJCXJldHVybiAmbXQ5cDAzMS0+Y3JvcDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9nZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKworCWZtdC0+Zm9ybWF0ID0gKl9fbXQ5cDAzMV9nZXRfcGFkX2Zvcm1hdChtdDlwMDMxLCBmaCwgZm10LT5wYWQsCisJCQkJCQlmbXQtPndoaWNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3NldF9mb3JtYXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm9ybWF0KQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKl9fZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgaHJhdGlvOworCXVuc2lnbmVkIGludCB2cmF0aW87CisKKwlfX2Nyb3AgPSBfX210OXAwMzFfZ2V0X3BhZF9jcm9wKG10OXAwMzEsIGZoLCBmb3JtYXQtPnBhZCwKKwkJCQkJZm9ybWF0LT53aGljaCk7CisKKwkvKiBDbGFtcCB0aGUgd2lkdGggYW5kIGhlaWdodCB0byBhdm9pZCBkaXZpZGluZyBieSB6ZXJvLiAqLworCXdpZHRoID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIEFMSUdOKGZvcm1hdC0+Zm9ybWF0LndpZHRoLCAyKSwKKwkJCW1heChfX2Nyb3AtPndpZHRoIC8gNywgTVQ5UDAzMV9XSU5ET1dfV0lEVEhfTUlOKSwKKwkJCV9fY3JvcC0+d2lkdGgpOworCWhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC5oZWlnaHQsIDIpLAorCQkJbWF4KF9fY3JvcC0+aGVpZ2h0IC8gOCwgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX01JTiksCisJCQlfX2Nyb3AtPmhlaWdodCk7CisKKwlocmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChfX2Nyb3AtPndpZHRoLCB3aWR0aCk7CisJdnJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QoX19jcm9wLT5oZWlnaHQsIGhlaWdodCk7CisKKwlfX2Zvcm1hdCA9IF9fbXQ5cDAzMV9nZXRfcGFkX2Zvcm1hdChtdDlwMDMxLCBmaCwgZm9ybWF0LT5wYWQsCisJCQkJCSAgICBmb3JtYXQtPndoaWNoKTsKKwlfX2Zvcm1hdC0+d2lkdGggPSBfX2Nyb3AtPndpZHRoIC8gaHJhdGlvOworCV9fZm9ybWF0LT5oZWlnaHQgPSBfX2Nyb3AtPmhlaWdodCAvIHZyYXRpbzsKKworCWZvcm1hdC0+Zm9ybWF0ID0gKl9fZm9ybWF0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9nZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCisJY3JvcC0+cmVjdCA9ICpfX210OXAwMzFfZ2V0X3BhZF9jcm9wKG10OXAwMzEsIGZoLCBjcm9wLT5wYWQsCisJCQkJCSAgICAgY3JvcC0+d2hpY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfc2V0X2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpfX2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpfX2Nyb3A7CisJc3RydWN0IHY0bDJfcmVjdCByZWN0OworCisJLyogQ2xhbXAgdGhlIGNyb3AgcmVjdGFuZ2xlIGJvdW5kYXJpZXMgYW5kIGFsaWduIHRoZW0gdG8gYSBtdWx0aXBsZSBvZiAyCisJICogcGl4ZWxzIHRvIGVuc3VyZSBhIEdSQkcgQmF5ZXIgcGF0dGVybi4KKwkgKi8KKwlyZWN0LmxlZnQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmxlZnQsIDIpLCBNVDlQMDMxX0NPTFVNTl9TVEFSVF9NSU4sCisJCQkgIE1UOVAwMzFfQ09MVU1OX1NUQVJUX01BWCk7CisJcmVjdC50b3AgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LnRvcCwgMiksIE1UOVAwMzFfUk9XX1NUQVJUX01JTiwKKwkJCSBNVDlQMDMxX1JPV19TVEFSVF9NQVgpOworCXJlY3Qud2lkdGggPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwKKwkJCSAgIE1UOVAwMzFfV0lORE9XX1dJRFRIX01JTiwKKwkJCSAgIE1UOVAwMzFfV0lORE9XX1dJRFRIX01BWCk7CisJcmVjdC5oZWlnaHQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmhlaWdodCwgMiksCisJCQkgICAgTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX01JTiwKKwkJCSAgICBNVDlQMDMxX1dJTkRPV19IRUlHSFRfTUFYKTsKKworCXJlY3Qud2lkdGggPSBtaW4ocmVjdC53aWR0aCwgTVQ5UDAzMV9QSVhFTF9BUlJBWV9XSURUSCAtIHJlY3QubGVmdCk7CisJcmVjdC5oZWlnaHQgPSBtaW4ocmVjdC5oZWlnaHQsIE1UOVAwMzFfUElYRUxfQVJSQVlfSEVJR0hUIC0gcmVjdC50b3ApOworCisJX19jcm9wID0gX19tdDlwMDMxX2dldF9wYWRfY3JvcChtdDlwMDMxLCBmaCwgY3JvcC0+cGFkLCBjcm9wLT53aGljaCk7CisKKwlpZiAocmVjdC53aWR0aCAhPSBfX2Nyb3AtPndpZHRoIHx8IHJlY3QuaGVpZ2h0ICE9IF9fY3JvcC0+aGVpZ2h0KSB7CisJCS8qIFJlc2V0IHRoZSBvdXRwdXQgaW1hZ2Ugc2l6ZSBpZiB0aGUgY3JvcCByZWN0YW5nbGUgc2l6ZSBoYXMKKwkJICogYmVlbiBtb2RpZmllZC4KKwkJICovCisJCV9fZm9ybWF0ID0gX19tdDlwMDMxX2dldF9wYWRfZm9ybWF0KG10OXAwMzEsIGZoLCBjcm9wLT5wYWQsCisJCQkJCQkgICAgY3JvcC0+d2hpY2gpOworCQlfX2Zvcm1hdC0+d2lkdGggPSByZWN0LndpZHRoOworCQlfX2Zvcm1hdC0+aGVpZ2h0ID0gcmVjdC5oZWlnaHQ7CisJfQorCisJKl9fY3JvcCA9IHJlY3Q7CisJY3JvcC0+cmVjdCA9IHJlY3Q7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgc3ViZGV2IGNvbnRyb2wgb3BlcmF0aW9ucworICovCisKKyNkZWZpbmUgVjRMMl9DSURfVEVTVF9QQVRURVJOCQkoVjRMMl9DSURfVVNFUl9CQVNFIHwgMHgxMDAxKQorCitzdGF0aWMgaW50IG10OXAwMzFfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPQorCQkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBtdDlwMDMxLCBjdHJscyk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXAwMzEtPnN1YmRldik7CisJdTE2IGRhdGE7CisJaW50IHJldDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX1VQUEVSLAorCQkJCSAgICAoY3RybC0+dmFsID4+IDE2KSAmIDB4ZmZmZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfU0hVVFRFUl9XSURUSF9MT1dFUiwKKwkJCQkgICAgIGN0cmwtPnZhbCAmIDB4ZmZmZik7CisKKwljYXNlIFY0TDJfQ0lEX0dBSU46CisJCS8qIEdhaW4gaXMgY29udHJvbGxlZCBieSAyIGFuYWxvZyBzdGFnZXMgYW5kIGEgZGlnaXRhbCBzdGFnZS4KKwkJICogVmFsaWQgdmFsdWVzIGZvciB0aGUgMyBzdGFnZXMgYXJlCisJCSAqCisJCSAqIFN0YWdlICAgICAgICAgICAgICAgIE1pbiAgICAgTWF4ICAgICBTdGVwCisJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKiBGaXJzdCBhbmFsb2cgc3RhZ2UgICB4MSAgICAgIHgyICAgICAgMQorCQkgKiBTZWNvbmQgYW5hbG9nIHN0YWdlICB4MSAgICAgIHg0ICAgICAgMC4xMjUKKwkJICogRGlnaXRhbCBzdGFnZSAgICAgICAgeDEgICAgICB4MTYgICAgIDAuMTI1CisJCSAqCisJCSAqIFRvIG1pbmltaXplIG5vaXNlLCB0aGUgZ2FpbiBzdGFnZXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlCisJCSAqIHNlY29uZCBhbmFsb2cgc3RhZ2UsIGZpcnN0IGFuYWxvZyBzdGFnZSwgZGlnaXRhbCBzdGFnZSBvcmRlci4KKwkJICogR2FpbiBmcm9tIGEgcHJldmlvdXMgc3RhZ2Ugc2hvdWxkIGJlIHB1c2hlZCB0byBpdHMgbWF4aW11bQorCQkgKiB2YWx1ZSBiZWZvcmUgdGhlIG5leHQgc3RhZ2UgaXMgdXNlZC4KKwkJICovCisJCWlmIChjdHJsLT52YWwgPD0gMzIpIHsKKwkJCWRhdGEgPSBjdHJsLT52YWw7CisJCX0gZWxzZSBpZiAoY3RybC0+dmFsIDw9IDY0KSB7CisJCQljdHJsLT52YWwgJj0gfjE7CisJCQlkYXRhID0gKDEgPDwgNikgfCAoY3RybC0+dmFsID4+IDEpOworCQl9IGVsc2UgeworCQkJY3RybC0+dmFsICY9IH43OworCQkJZGF0YSA9ICgoY3RybC0+dmFsIC0gNjQpIDw8IDUpIHwgKDEgPDwgNikgfCAzMjsKKwkJfQorCisJCXJldHVybiBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9HTE9CQUxfR0FJTiwgZGF0YSk7CisKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCQlpZiAoY3RybC0+dmFsKQorCQkJcmV0dXJuIG10OXAwMzFfc2V0X21vZGUyKG10OXAwMzEsCisJCQkJCTAsIE1UOVAwMzFfUkVBRF9NT0RFXzJfQ09MX01JUik7CisJCWVsc2UKKwkJCXJldHVybiBtdDlwMDMxX3NldF9tb2RlMihtdDlwMDMxLAorCQkJCQlNVDlQMDMxX1JFQURfTU9ERV8yX0NPTF9NSVIsIDApOworCisJY2FzZSBWNEwyX0NJRF9WRkxJUDoKKwkJaWYgKGN0cmwtPnZhbCkKKwkJCXJldHVybiBtdDlwMDMxX3NldF9tb2RlMihtdDlwMDMxLAorCQkJCQkwLCBNVDlQMDMxX1JFQURfTU9ERV8yX1JPV19NSVIpOworCQllbHNlCisJCQlyZXR1cm4gbXQ5cDAzMV9zZXRfbW9kZTIobXQ5cDAzMSwKKwkJCQkJTVQ5UDAzMV9SRUFEX01PREVfMl9ST1dfTUlSLCAwKTsKKworCWNhc2UgVjRMMl9DSURfVEVTVF9QQVRURVJOOgorCQlpZiAoIWN0cmwtPnZhbCkgeworCQkJcmV0ID0gbXQ5cDAzMV9zZXRfbW9kZTIobXQ5cDAzMSwKKwkJCQkJMCwgTVQ5UDAzMV9SRUFEX01PREVfMl9ST1dfQkxDKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXJldHVybiBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9URVNUX1BBVFRFUk4sCisJCQkJCSAgICAgTVQ5UDAzMV9URVNUX1BBVFRFUk5fRElTQUJMRSk7CisJCX0KKworCQlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9URVNUX1BBVFRFUk5fR1JFRU4sIDB4MDVhMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfVEVTVF9QQVRURVJOX1JFRCwgMHgwYTUwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBtdDlwMDMxX3dyaXRlKGNsaWVudCwgTVQ5UDAzMV9URVNUX1BBVFRFUk5fQkxVRSwgMHgwYWEwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IG10OXAwMzFfc2V0X21vZGUyKG10OXAwMzEsIE1UOVAwMzFfUkVBRF9NT0RFXzJfUk9XX0JMQywKKwkJCQkJMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gbXQ5cDAzMV93cml0ZShjbGllbnQsIE1UOVAwMzFfUk9XX0JMQUNLX0RFRl9PRkZTRVQsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0dXJuIG10OXAwMzFfd3JpdGUoY2xpZW50LCBNVDlQMDMxX1RFU1RfUEFUVEVSTiwKKwkJCQkoKGN0cmwtPnZhbCAtIDEpIDw8IE1UOVAwMzFfVEVTVF9QQVRURVJOX1NISUZUKQorCQkJCXwgTVQ5UDAzMV9URVNUX1BBVFRFUk5fRU5BQkxFKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtdDlwMDMxX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBtdDlwMDMxX3NfY3RybCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXQ5cDAzMV90ZXN0X3BhdHRlcm5fbWVudVtdID0geworCSJEaXNhYmxlZCIsCisJIkNvbG9yIEZpZWxkIiwKKwkiSG9yaXpvbnRhbCBHcmFkaWVudCIsCisJIlZlcnRpY2FsIEdyYWRpZW50IiwKKwkiRGlhZ29uYWwgR3JhZGllbnQiLAorCSJDbGFzc2ljIFRlc3QgUGF0dGVybiIsCisJIldhbGtpbmcgMXMiLAorCSJNb25vY2hyb21lIEhvcml6b250YWwgQmFycyIsCisJIk1vbm9jaHJvbWUgVmVydGljYWwgQmFycyIsCisJIlZlcnRpY2FsIENvbG9yIEJhcnMiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIG10OXAwMzFfY3RybHNbXSA9IHsKKwl7CisJCS5vcHMJCT0gJm10OXAwMzFfY3RybF9vcHMsCisJCS5pZAkJPSBWNEwyX0NJRF9URVNUX1BBVFRFUk4sCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5uYW1lCQk9ICJUZXN0IFBhdHRlcm4iLAorCQkubWluCQk9IDAsCisJCS5tYXgJCT0gQVJSQVlfU0laRShtdDlwMDMxX3Rlc3RfcGF0dGVybl9tZW51KSAtIDEsCisJCS5zdGVwCQk9IDAsCisJCS5kZWYJCT0gMCwKKwkJLmZsYWdzCQk9IDAsCisJCS5tZW51X3NraXBfbWFzawk9IDAsCisJCS5xbWVudQkJPSBtdDlwMDMxX3Rlc3RfcGF0dGVybl9tZW51LAorCX0KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiBjb3JlIG9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG10OXAwMzFfc2V0X3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBpbnQgb24pCit7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZtdDlwMDMxLT5wb3dlcl9sb2NrKTsKKworCS8qIElmIHRoZSBwb3dlciBjb3VudCBpcyBtb2RpZmllZCBmcm9tIDAgdG8gIT0gMCBvciBmcm9tICE9IDAgdG8gMCwKKwkgKiB1cGRhdGUgdGhlIHBvd2VyIHN0YXRlLgorCSAqLworCWlmIChtdDlwMDMxLT5wb3dlcl9jb3VudCA9PSAhb24pIHsKKwkJcmV0ID0gX19tdDlwMDMxX3NldF9wb3dlcihtdDlwMDMxLCAhIW9uKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHBvd2VyIGNvdW50LiAqLworCW10OXAwMzEtPnBvd2VyX2NvdW50ICs9IG9uID8gMSA6IC0xOworCVdBUk5fT04obXQ5cDAzMS0+cG93ZXJfY291bnQgPCAwKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbXQ5cDAzMS0+cG93ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgc3ViZGV2IGludGVybmFsIG9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG10OXAwMzFfcmVnaXN0ZXJlZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzdWJkZXYpOworCXN0cnVjdCBtdDlwMDMxICptdDlwMDMxID0gdG9fbXQ5cDAzMShzdWJkZXYpOworCXMzMiBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBtdDlwMDMxX3Bvd2VyX29uKG10OXAwMzEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5UDAzMSBwb3dlciB1cCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFJlYWQgb3V0IHRoZSBjaGlwIHZlcnNpb24gcmVnaXN0ZXIgKi8KKwlkYXRhID0gbXQ5cDAzMV9yZWFkKGNsaWVudCwgTVQ5UDAzMV9DSElQX1ZFUlNJT04pOworCWlmIChkYXRhICE9IE1UOVAwMzFfQ0hJUF9WRVJTSU9OX1ZBTFVFKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5UDAzMSBub3QgZGV0ZWN0ZWQsIHdyb25nIHZlcnNpb24gIgorCQkJIjB4JTA0eFxuIiwgZGF0YSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW10OXAwMzFfcG93ZXJfb2ZmKG10OXAwMzEpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiTVQ5UDAzMSBkZXRlY3RlZCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJIGNsaWVudC0+YWRkcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OXAwMzFfb3BlbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgbXQ5cDAzMSAqbXQ5cDAzMSA9IHRvX210OXAwMzEoc3ViZGV2KTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmb3JtYXQ7CisJc3RydWN0IHY0bDJfcmVjdCAqY3JvcDsKKworCWNyb3AgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIDApOworCWNyb3AtPmxlZnQgPSBNVDlQMDMxX0NPTFVNTl9TVEFSVF9ERUY7CisJY3JvcC0+dG9wID0gTVQ5UDAzMV9ST1dfU1RBUlRfREVGOworCWNyb3AtPndpZHRoID0gTVQ5UDAzMV9XSU5ET1dfV0lEVEhfREVGOworCWNyb3AtPmhlaWdodCA9IE1UOVAwMzFfV0lORE9XX0hFSUdIVF9ERUY7CisKKwlmb3JtYXQgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisKKwlpZiAobXQ5cDAzMS0+cGRhdGEtPnZlcnNpb24gPT0gTVQ5UDAzMV9NT05PQ0hST01FX1ZFUlNJT04pCisJCWZvcm1hdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfWTEyXzFYMTI7CisJZWxzZQorCQlmb3JtYXQtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTJfMVgxMjsKKworCWZvcm1hdC0+d2lkdGggPSBNVDlQMDMxX1dJTkRPV19XSURUSF9ERUY7CisJZm9ybWF0LT5oZWlnaHQgPSBNVDlQMDMxX1dJTkRPV19IRUlHSFRfREVGOworCWZvcm1hdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZm9ybWF0LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisKKwltdDlwMDMxLT54c2tpcCA9IDE7CisJbXQ5cDAzMS0+eXNraXAgPSAxOworCXJldHVybiBtdDlwMDMxX3NldF9wb3dlcihzdWJkZXYsIDEpOworfQorCitzdGF0aWMgaW50IG10OXAwMzFfY2xvc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJcmV0dXJuIG10OXAwMzFfc2V0X3Bvd2VyKHN1YmRldiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXQ5cDAzMV9zdWJkZXZfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIgICAgICAgID0gbXQ5cDAzMV9zZXRfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtdDlwMDMxX3N1YmRldl92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtICAgICAgID0gbXQ5cDAzMV9zX3N0cmVhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBtdDlwMDMxX3N1YmRldl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IG10OXAwMzFfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IG10OXAwMzFfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gbXQ5cDAzMV9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gbXQ5cDAzMV9zZXRfZm9ybWF0LAorCS5nZXRfY3JvcCA9IG10OXAwMzFfZ2V0X2Nyb3AsCisJLnNldF9jcm9wID0gbXQ5cDAzMV9zZXRfY3JvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG10OXAwMzFfc3ViZGV2X29wcyA9IHsKKwkuY29yZSAgID0gJm10OXAwMzFfc3ViZGV2X2NvcmVfb3BzLAorCS52aWRlbyAgPSAmbXQ5cDAzMV9zdWJkZXZfdmlkZW9fb3BzLAorCS5wYWQgICAgPSAmbXQ5cDAzMV9zdWJkZXZfcGFkX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG10OXAwMzFfc3ViZGV2X2ludGVybmFsX29wcyA9IHsKKwkucmVnaXN0ZXJlZCA9IG10OXAwMzFfcmVnaXN0ZXJlZCwKKwkub3BlbiA9IG10OXAwMzFfb3BlbiwKKwkuY2xvc2UgPSBtdDlwMDMxX2Nsb3NlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmluZworICovCisKK3N0YXRpYyBpbnQgbXQ5cDAzMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCit7CisJc3RydWN0IG10OXAwMzFfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzE7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkgeworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCQkiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IEkyQ19GVU5DX1NNQlVTX1dPUkRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltdDlwMDMxID0ga3phbGxvYyhzaXplb2YoKm10OXAwMzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAobXQ5cDAzMSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW10OXAwMzEtPnBkYXRhID0gcGRhdGE7CisJbXQ5cDAzMS0+b3V0cHV0X2NvbnRyb2wJPSBNVDlQMDMxX09VVFBVVF9DT05UUk9MX0RFRjsKKwltdDlwMDMxLT5tb2RlMiA9IE1UOVAwMzFfUkVBRF9NT0RFXzJfUk9XX0JMQzsKKworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJm10OXAwMzEtPmN0cmxzLCBBUlJBWV9TSVpFKG10OXAwMzFfY3RybHMpICsgNCk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5cDAzMS0+Y3RybHMsICZtdDlwMDMxX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9FWFBPU1VSRSwgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX01JTiwKKwkJCSAgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX01BWCwgMSwKKwkJCSAgTVQ5UDAzMV9TSFVUVEVSX1dJRFRIX0RFRik7CisJdjRsMl9jdHJsX25ld19zdGQoJm10OXAwMzEtPmN0cmxzLCAmbXQ5cDAzMV9jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfR0FJTiwgTVQ5UDAzMV9HTE9CQUxfR0FJTl9NSU4sCisJCQkgIE1UOVAwMzFfR0xPQkFMX0dBSU5fTUFYLCAxLCBNVDlQMDMxX0dMT0JBTF9HQUlOX0RFRik7CisJdjRsMl9jdHJsX25ld19zdGQoJm10OXAwMzEtPmN0cmxzLCAmbXQ5cDAzMV9jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDlwMDMxLT5jdHJscywgJm10OXAwMzFfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXAwMzFfY3RybHMpOyArK2kpCisJCXY0bDJfY3RybF9uZXdfY3VzdG9tKCZtdDlwMDMxLT5jdHJscywgJm10OXAwMzFfY3RybHNbaV0sIE5VTEwpOworCisJbXQ5cDAzMS0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZtdDlwMDMxLT5jdHJsczsKKworCWlmIChtdDlwMDMxLT5jdHJscy5lcnJvcikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gZXJyb3IgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgbXQ5cDAzMS0+Y3RybHMuZXJyb3IpOworCisJbXV0ZXhfaW5pdCgmbXQ5cDAzMS0+cG93ZXJfbG9jayk7CisJdjRsMl9pMmNfc3ViZGV2X2luaXQoJm10OXAwMzEtPnN1YmRldiwgY2xpZW50LCAmbXQ5cDAzMV9zdWJkZXZfb3BzKTsKKwltdDlwMDMxLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJm10OXAwMzFfc3ViZGV2X2ludGVybmFsX29wczsKKworCW10OXAwMzEtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJm10OXAwMzEtPnN1YmRldi5lbnRpdHksIDEsICZtdDlwMDMxLT5wYWQsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwltdDlwMDMxLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisKKwltdDlwMDMxLT5jcm9wLndpZHRoID0gTVQ5UDAzMV9XSU5ET1dfV0lEVEhfREVGOworCW10OXAwMzEtPmNyb3AuaGVpZ2h0ID0gTVQ5UDAzMV9XSU5ET1dfSEVJR0hUX0RFRjsKKwltdDlwMDMxLT5jcm9wLmxlZnQgPSBNVDlQMDMxX0NPTFVNTl9TVEFSVF9ERUY7CisJbXQ5cDAzMS0+Y3JvcC50b3AgPSBNVDlQMDMxX1JPV19TVEFSVF9ERUY7CisKKwlpZiAobXQ5cDAzMS0+cGRhdGEtPnZlcnNpb24gPT0gTVQ5UDAzMV9NT05PQ0hST01FX1ZFUlNJT04pCisJCW10OXAwMzEtPmZvcm1hdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZMTJfMVgxMjsKKwllbHNlCisJCW10OXAwMzEtPmZvcm1hdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEyXzFYMTI7CisKKwltdDlwMDMxLT5mb3JtYXQud2lkdGggPSBNVDlQMDMxX1dJTkRPV19XSURUSF9ERUY7CisJbXQ5cDAzMS0+Zm9ybWF0LmhlaWdodCA9IE1UOVAwMzFfV0lORE9XX0hFSUdIVF9ERUY7CisJbXQ5cDAzMS0+Zm9ybWF0LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCW10OXAwMzEtPmZvcm1hdC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisKKwlyZXQgPSBtdDlwMDMxX3BsbF9nZXRfZGl2cyhtdDlwMDMxKTsKKworZG9uZToKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDlwMDMxLT5jdHJscyk7CisJCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZtdDlwMDMxLT5zdWJkZXYuZW50aXR5KTsKKwkJa2ZyZWUobXQ5cDAzMSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdDlwMDMxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG10OXAwMzEgKm10OXAwMzEgPSB0b19tdDlwMDMxKHN1YmRldik7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZtdDlwMDMxLT5jdHJscyk7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc3ViZGV2KTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmc3ViZGV2LT5lbnRpdHkpOworCWtmcmVlKG10OXAwMzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDlwMDMxX2lkW10gPSB7CisJeyAibXQ5cDAzMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbXQ5cDAzMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDlwMDMxX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXQ5cDAzMSIsCisJfSwKKwkucHJvYmUgICAgICAgICAgPSBtdDlwMDMxX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IG10OXAwMzFfcmVtb3ZlLAorCS5pZF90YWJsZSAgICAgICA9IG10OXAwMzFfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtdDlwMDMxX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtdDlwMDMxX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXQ5cDAzMV9tb2RfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtdDlwMDMxX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtdDlwMDMxX21vZF9pbml0KTsKK21vZHVsZV9leGl0KG10OXAwMzFfbW9kX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFwdGluYSBNVDlQMDMxIENhbWVyYSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhc3RpYW4gSGVjaHQgPGhlY2h0YkBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDc0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMDEuYwpAQCAtMCwwICsxLDgzNiBAQAorLyoKKyAqIERyaXZlciBmb3IgTVQ5VDAwMSBDTU9TIEltYWdlIFNlbnNvciBmcm9tIEFwdGluYSAoTWljcm9uKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExLCBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+CisgKgorICogQmFzZWQgb24gdGhlIE1UOU0wMDEgZHJpdmVyLAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9tdDl0MDAxLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2RlZmluZSBNVDlUMDAxX1BJWEVMX0FSUkFZX0hFSUdIVAkJCTE1NjgKKyNkZWZpbmUgTVQ5VDAwMV9QSVhFTF9BUlJBWV9XSURUSAkJCTIxMTIKKworI2RlZmluZSBNVDlUMDAxX0NISVBfVkVSU0lPTgkJCQkweDAwCisjZGVmaW5lCQlNVDlUMDAxX0NISVBfSUQJCQkJMHgxNjIxCisjZGVmaW5lIE1UOVQwMDFfUk9XX1NUQVJUCQkJCTB4MDEKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX1NUQVJUX01JTgkJCTAKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX1NUQVJUX0RFRgkJCTIwCisjZGVmaW5lCQlNVDlUMDAxX1JPV19TVEFSVF9NQVgJCQkxNTM0CisjZGVmaW5lIE1UOVQwMDFfQ09MVU1OX1NUQVJUCQkJCTB4MDIKKyNkZWZpbmUJCU1UOVQwMDFfQ09MVU1OX1NUQVJUX01JTgkJMAorI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fU1RBUlRfREVGCQkzMgorI2RlZmluZQkJTVQ5VDAwMV9DT0xVTU5fU1RBUlRfTUFYCQkyMDQ2CisjZGVmaW5lIE1UOVQwMDFfV0lORE9XX0hFSUdIVAkJCQkweDAzCisjZGVmaW5lCQlNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUlOCQkxCisjZGVmaW5lCQlNVDlUMDAxX1dJTkRPV19IRUlHSFRfREVGCQkxNTM1CisjZGVmaW5lCQlNVDlUMDAxX1dJTkRPV19IRUlHSFRfTUFYCQkxNTY3CisjZGVmaW5lIE1UOVQwMDFfV0lORE9XX1dJRFRICQkJCTB4MDQKKyNkZWZpbmUJCU1UOVQwMDFfV0lORE9XX1dJRFRIX01JTgkJMQorI2RlZmluZQkJTVQ5VDAwMV9XSU5ET1dfV0lEVEhfREVGCQkyMDQ3CisjZGVmaW5lCQlNVDlUMDAxX1dJTkRPV19XSURUSF9NQVgJCTIxMTEKKyNkZWZpbmUgTVQ5VDAwMV9IT1JJWk9OVEFMX0JMQU5LSU5HCQkJMHgwNQorI2RlZmluZQkJTVQ5VDAwMV9IT1JJWk9OVEFMX0JMQU5LSU5HX01JTgkJMjEKKyNkZWZpbmUJCU1UOVQwMDFfSE9SSVpPTlRBTF9CTEFOS0lOR19NQVgJCTEwMjMKKyNkZWZpbmUgTVQ5VDAwMV9WRVJUSUNBTF9CTEFOS0lORwkJCTB4MDYKKyNkZWZpbmUJCU1UOVQwMDFfVkVSVElDQUxfQkxBTktJTkdfTUlOCQkzCisjZGVmaW5lCQlNVDlUMDAxX1ZFUlRJQ0FMX0JMQU5LSU5HX01BWAkJMTAyMworI2RlZmluZSBNVDlUMDAxX09VVFBVVF9DT05UUk9MCQkJCTB4MDcKKyNkZWZpbmUJCU1UOVQwMDFfT1VUUFVUX0NPTlRST0xfU1lOQwkJKDEgPDwgMCkKKyNkZWZpbmUJCU1UOVQwMDFfT1VUUFVUX0NPTlRST0xfQ0hJUF9FTkFCTEUJKDEgPDwgMSkKKyNkZWZpbmUJCU1UOVQwMDFfT1VUUFVUX0NPTlRST0xfVEVTVF9EQVRBCSgxIDw8IDYpCisjZGVmaW5lIE1UOVQwMDFfU0hVVFRFUl9XSURUSF9ISUdICQkJMHgwOAorI2RlZmluZSBNVDlUMDAxX1NIVVRURVJfV0lEVEhfTE9XCQkJMHgwOQorI2RlZmluZQkJTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX01JTgkJMQorI2RlZmluZQkJTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX0RFRgkJMTU2MQorI2RlZmluZQkJTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX01BWAkJKDEwMjQgKiAxMDI0KQorI2RlZmluZSBNVDlUMDAxX1BJWEVMX0NMT0NLCQkJCTB4MGEKKyNkZWZpbmUJCU1UOVQwMDFfUElYRUxfQ0xPQ0tfSU5WRVJUCQkoMSA8PCAxNSkKKyNkZWZpbmUJCU1UOVQwMDFfUElYRUxfQ0xPQ0tfU0hJRlRfTUFTSwkJKDcgPDwgOCkKKyNkZWZpbmUJCU1UOVQwMDFfUElYRUxfQ0xPQ0tfU0hJRlRfU0hJRlQJCTgKKyNkZWZpbmUJCU1UOVQwMDFfUElYRUxfQ0xPQ0tfRElWSURFX01BU0sJCSgweDdmIDw8IDApCisjZGVmaW5lIE1UOVQwMDFfRlJBTUVfUkVTVEFSVAkJCQkweDBiCisjZGVmaW5lIE1UOVQwMDFfU0hVVFRFUl9ERUxBWQkJCQkweDBjCisjZGVmaW5lCQlNVDlUMDAxX1NIVVRURVJfREVMQVlfTUFYCQkyMDQ3CisjZGVmaW5lIE1UOVQwMDFfUkVTRVQJCQkJCTB4MGQKKyNkZWZpbmUgTVQ5VDAwMV9SRUFEX01PREUxCQkJCTB4MWUKKyNkZWZpbmUJCU1UOVQwMDFfUkVBRF9NT0RFX1NOQVBTSE9UCQkoMSA8PCA4KQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfU1RST0JFX0VOQUJMRQkJKDEgPDwgOSkKKyNkZWZpbmUJCU1UOVQwMDFfUkVBRF9NT0RFX1NUUk9CRV9XSURUSAkJKDEgPDwgMTApCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9TVFJPQkVfT1ZFUlJJREUJKDEgPDwgMTEpCisjZGVmaW5lIE1UOVQwMDFfUkVBRF9NT0RFMgkJCQkweDIwCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9CQURfRlJBTUVTCQkoMSA8PCAwKQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfTElORV9WQUxJRF9DT05USU5VT1VTCSgxIDw8IDkpCisjZGVmaW5lCQlNVDlUMDAxX1JFQURfTU9ERV9MSU5FX1ZBTElEX0ZSQU1FCSgxIDw8IDEwKQorI2RlZmluZSBNVDlUMDAxX1JFQURfTU9ERTMJCQkJMHgyMQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfR0xPQkFMX1JFU0VUCQkoMSA8PCAwKQorI2RlZmluZQkJTVQ5VDAwMV9SRUFEX01PREVfR0hTVF9DVEwJCSgxIDw8IDEpCisjZGVmaW5lIE1UOVQwMDFfUk9XX0FERFJFU1NfTU9ERQkJCTB4MjIKKyNkZWZpbmUJCU1UOVQwMDFfUk9XX1NLSVBfTUFTSwkJCSg3IDw8IDApCisjZGVmaW5lCQlNVDlUMDAxX1JPV19CSU5fTUFTSwkJCSgzIDw8IDMpCisjZGVmaW5lCQlNVDlUMDAxX1JPV19CSU5fU0hJRlQJCQkzCisjZGVmaW5lIE1UOVQwMDFfQ09MVU1OX0FERFJFU1NfTU9ERQkJCTB4MjMKKyNkZWZpbmUJCU1UOVQwMDFfQ09MVU1OX1NLSVBfTUFTSwkJKDcgPDwgMCkKKyNkZWZpbmUJCU1UOVQwMDFfQ09MVU1OX0JJTl9NQVNLCQkJKDMgPDwgMykKKyNkZWZpbmUJCU1UOVQwMDFfQ09MVU1OX0JJTl9TSElGVAkJMworI2RlZmluZSBNVDlUMDAxX0dSRUVOMV9HQUlOCQkJCTB4MmIKKyNkZWZpbmUgTVQ5VDAwMV9CTFVFX0dBSU4JCQkJMHgyYworI2RlZmluZSBNVDlUMDAxX1JFRF9HQUlOCQkJCTB4MmQKKyNkZWZpbmUgTVQ5VDAwMV9HUkVFTjJfR0FJTgkJCQkweDJlCisjZGVmaW5lIE1UOVQwMDFfVEVTVF9EQVRBCQkJCTB4MzIKKyNkZWZpbmUgTVQ5VDAwMV9HTE9CQUxfR0FJTgkJCQkweDM1CisjZGVmaW5lCQlNVDlUMDAxX0dMT0JBTF9HQUlOX01JTgkJCTgKKyNkZWZpbmUJCU1UOVQwMDFfR0xPQkFMX0dBSU5fTUFYCQkJMTAyNAorI2RlZmluZSBNVDlUMDAxX0JMQUNLX0xFVkVMCQkJCTB4NDkKKyNkZWZpbmUgTVQ5VDAwMV9ST1dfQkxBQ0tfREVGQVVMVF9PRkZTRVQJCTB4NGIKKyNkZWZpbmUgTVQ5VDAwMV9CTENfREVMVEFfVEhSRVNIT0xEUwkJCTB4NWQKKyNkZWZpbmUgTVQ5VDAwMV9DQUxfVEhSRVNIT0xEUwkJCQkweDVmCisjZGVmaW5lIE1UOVQwMDFfR1JFRU4xX09GRlNFVAkJCQkweDYwCisjZGVmaW5lIE1UOVQwMDFfR1JFRU4yX09GRlNFVAkJCQkweDYxCisjZGVmaW5lIE1UOVQwMDFfQkxBQ0tfTEVWRUxfQ0FMSUJSQVRJT04JCQkweDYyCisjZGVmaW5lCQlNVDlUMDAxX0JMQUNLX0xFVkVMX09WRVJSSURFCQkoMSA8PCAwKQorI2RlZmluZQkJTVQ5VDAwMV9CTEFDS19MRVZFTF9ESVNBQkxFX09GRlNFVAkoMSA8PCAxKQorI2RlZmluZQkJTVQ5VDAwMV9CTEFDS19MRVZFTF9SRUNBTENVTEFURQkJKDEgPDwgMTIpCisjZGVmaW5lCQlNVDlUMDAxX0JMQUNLX0xFVkVMX0xPQ0tfUkVEX0JMVUUJKDEgPDwgMTMpCisjZGVmaW5lCQlNVDlUMDAxX0JMQUNLX0xFVkVMX0xPQ0tfR1JFRU4JCSgxIDw8IDE0KQorI2RlZmluZSBNVDlUMDAxX1JFRF9PRkZTRVQJCQkJMHg2MworI2RlZmluZSBNVDlUMDAxX0JMVUVfT0ZGU0VUCQkJCTB4NjQKKworc3RydWN0IG10OXQwMDEgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IG1lZGlhX3BhZCBwYWQ7CisKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3A7CisKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybHM7CisJc3RydWN0IHY0bDJfY3RybCAqZ2FpbnNbNF07CisKKwl1MTYgb3V0cHV0X2NvbnRyb2w7CisJdTE2IGJsYWNrX2xldmVsOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXQ5dDAwMSAqdG9fbXQ5dDAwMShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDl0MDAxLCBzdWJkZXYpOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJczMyIGRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCXJldHVybiBkYXRhIDwgMCA/IGRhdGEgOiBiZTE2X3RvX2NwdShkYXRhKTsKK30KKworc3RhdGljIGludCBtdDl0MDAxX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIGNwdV90b19iZTE2KGRhdGEpKTsKK30KKworc3RhdGljIGludCBtdDl0MDAxX3NldF9vdXRwdXRfY29udHJvbChzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSwgdTE2IGNsZWFyLAorCQkJCSAgICAgIHUxNiBzZXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OXQwMDEtPnN1YmRldik7CisJdTE2IHZhbHVlID0gKG10OXQwMDEtPm91dHB1dF9jb250cm9sICYgfmNsZWFyKSB8IHNldDsKKwlpbnQgcmV0OworCisJaWYgKHZhbHVlID09IG10OXQwMDEtPm91dHB1dF9jb250cm9sKQorCQlyZXR1cm4gMDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX09VVFBVVF9DT05UUk9MLCB2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltdDl0MDAxLT5vdXRwdXRfY29udHJvbCA9IHZhbHVlOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgdmlkZW8gb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICoKK19fbXQ5dDAwMV9nZXRfcGFkX2Zvcm1hdChzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSB1bnNpZ25lZCBpbnQgcGFkLCBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX1RSWToKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBwYWQpOworCWNhc2UgVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRToKKwkJcmV0dXJuICZtdDl0MDAxLT5mb3JtYXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHY0bDJfcmVjdCAqCitfX210OXQwMDFfZ2V0X3BhZF9jcm9wKHN0cnVjdCBtdDl0MDAxICptdDl0MDAxLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkgICAgICAgdW5zaWduZWQgaW50IHBhZCwgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQoreworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIFY0TDJfU1VCREVWX0ZPUk1BVF9UUlk6CisJCXJldHVybiB2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIHBhZCk7CisJY2FzZSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOgorCQlyZXR1cm4gJm10OXQwMDEtPmNyb3A7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IG10OXQwMDFfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBlbmFibGUpCit7CisJY29uc3QgdTE2IG1vZGUgPSBNVDlUMDAxX09VVFBVVF9DT05UUk9MX0NISVBfRU5BQkxFOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CisJc3RydWN0IG10OXQwMDEgKm10OXQwMDEgPSB0b19tdDl0MDAxKHN1YmRldik7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0ID0gJm10OXQwMDEtPmZvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wID0gJm10OXQwMDEtPmNyb3A7CisJdW5zaWduZWQgaW50IGhyYXRpbzsKKwl1bnNpZ25lZCBpbnQgdnJhdGlvOworCWludCByZXQ7CisKKwlpZiAoIWVuYWJsZSkKKwkJcmV0dXJuIG10OXQwMDFfc2V0X291dHB1dF9jb250cm9sKG10OXQwMDEsIG1vZGUsIDApOworCisJLyogQ29uZmlndXJlIHRoZSB3aW5kb3cgc2l6ZSBhbmQgcm93L2NvbHVtbiBiaW4gKi8KKwlocmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChjcm9wLT53aWR0aCwgZm9ybWF0LT53aWR0aCk7CisJdnJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QoY3JvcC0+aGVpZ2h0LCBmb3JtYXQtPmhlaWdodCk7CisKKwlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9ST1dfQUREUkVTU19NT0RFLCBocmF0aW8gLSAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX0NPTFVNTl9BRERSRVNTX01PREUsIHZyYXRpbyAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfQ09MVU1OX1NUQVJULCBjcm9wLT5sZWZ0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1JPV19TVEFSVCwgY3JvcC0+dG9wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1dJTkRPV19XSURUSCwgY3JvcC0+d2lkdGggLSAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1dJTkRPV19IRUlHSFQsIGNyb3AtPmhlaWdodCAtIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU3dpdGNoIHRvIG1hc3RlciAibm9ybWFsIiBtb2RlICovCisJcmV0dXJuIG10OXQwMDFfc2V0X291dHB1dF9jb250cm9sKG10OXQwMDEsIDAsIG1vZGUpOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQoreworCWlmIChjb2RlLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJY29kZS0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCWlmIChmc2UtPmluZGV4ID49IDggfHwgZnNlLT5jb2RlICE9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZzZS0+bWluX3dpZHRoID0gKE1UOVQwMDFfV0lORE9XX1dJRFRIX0RFRiArIDEpIC8gZnNlLT5pbmRleDsKKwlmc2UtPm1heF93aWR0aCA9IGZzZS0+bWluX3dpZHRoOworCWZzZS0+bWluX2hlaWdodCA9IChNVDlUMDAxX1dJTkRPV19IRUlHSFRfREVGICsgMSkgLyBmc2UtPmluZGV4OworCWZzZS0+bWF4X2hlaWdodCA9IGZzZS0+bWluX2hlaWdodDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfZ2V0X2Zvcm1hdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmb3JtYXQpCit7CisJc3RydWN0IG10OXQwMDEgKm10OXQwMDEgPSB0b19tdDl0MDAxKHN1YmRldik7CisKKwlmb3JtYXQtPmZvcm1hdCA9ICpfX210OXQwMDFfZ2V0X3BhZF9mb3JtYXQobXQ5dDAwMSwgZmgsIGZvcm1hdC0+cGFkLAorCQkJCQkJICAgZm9ybWF0LT53aGljaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9zZXRfZm9ybWF0KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSA9IHRvX210OXQwMDEoc3ViZGV2KTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpfX2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpfX2Nyb3A7CisJdW5zaWduZWQgaW50IHdpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJdW5zaWduZWQgaW50IGhyYXRpbzsKKwl1bnNpZ25lZCBpbnQgdnJhdGlvOworCisJX19jcm9wID0gX19tdDl0MDAxX2dldF9wYWRfY3JvcChtdDl0MDAxLCBmaCwgZm9ybWF0LT5wYWQsCisJCQkJCWZvcm1hdC0+d2hpY2gpOworCisJLyogQ2xhbXAgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdG8gYXZvaWQgZGl2aWRpbmcgYnkgemVyby4gKi8KKwl3aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC53aWR0aCwgMiksCisJCQltYXgoX19jcm9wLT53aWR0aCAvIDgsIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NSU4gKyAxKSwKKwkJCV9fY3JvcC0+d2lkdGgpOworCWhlaWdodCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBBTElHTihmb3JtYXQtPmZvcm1hdC5oZWlnaHQsIDIpLAorCQkJIG1heChfX2Nyb3AtPmhlaWdodCAvIDgsIE1UOVQwMDFfV0lORE9XX0hFSUdIVF9NSU4gKyAxKSwKKwkJCSBfX2Nyb3AtPmhlaWdodCk7CisKKwlocmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVChfX2Nyb3AtPndpZHRoLCB3aWR0aCk7CisJdnJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QoX19jcm9wLT5oZWlnaHQsIGhlaWdodCk7CisKKwlfX2Zvcm1hdCA9IF9fbXQ5dDAwMV9nZXRfcGFkX2Zvcm1hdChtdDl0MDAxLCBmaCwgZm9ybWF0LT5wYWQsCisJCQkJCSAgICBmb3JtYXQtPndoaWNoKTsKKwlfX2Zvcm1hdC0+d2lkdGggPSBfX2Nyb3AtPndpZHRoIC8gaHJhdGlvOworCV9fZm9ybWF0LT5oZWlnaHQgPSBfX2Nyb3AtPmhlaWdodCAvIHZyYXRpbzsKKworCWZvcm1hdC0+Zm9ybWF0ID0gKl9fZm9ybWF0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9nZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBtdDl0MDAxICptdDl0MDAxID0gdG9fbXQ5dDAwMShzdWJkZXYpOworCisJY3JvcC0+cmVjdCA9ICpfX210OXQwMDFfZ2V0X3BhZF9jcm9wKG10OXQwMDEsIGZoLCBjcm9wLT5wYWQsCisJCQkJCSAgICAgY3JvcC0+d2hpY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQwMDFfc2V0X2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSA9IHRvX210OXQwMDEoc3ViZGV2KTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpfX2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpfX2Nyb3A7CisJc3RydWN0IHY0bDJfcmVjdCByZWN0OworCisJLyogQ2xhbXAgdGhlIGNyb3AgcmVjdGFuZ2xlIGJvdW5kYXJpZXMgYW5kIGFsaWduIHRoZW0gdG8gYSBtdWx0aXBsZSBvZiAyCisJICogcGl4ZWxzLgorCSAqLworCXJlY3QubGVmdCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QubGVmdCwgMiksCisJCQkgIE1UOVQwMDFfQ09MVU1OX1NUQVJUX01JTiwKKwkJCSAgTVQ5VDAwMV9DT0xVTU5fU1RBUlRfTUFYKTsKKwlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wLCAyKSwKKwkJCSBNVDlUMDAxX1JPV19TVEFSVF9NSU4sCisJCQkgTVQ5VDAwMV9ST1dfU1RBUlRfTUFYKTsKKwlyZWN0LndpZHRoID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC53aWR0aCwgMiksCisJCQkgICBNVDlUMDAxX1dJTkRPV19XSURUSF9NSU4gKyAxLAorCQkJICAgTVQ5VDAwMV9XSU5ET1dfV0lEVEhfTUFYICsgMSk7CisJcmVjdC5oZWlnaHQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmhlaWdodCwgMiksCisJCQkgICAgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX01JTiArIDEsCisJCQkgICAgTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX01BWCArIDEpOworCisJcmVjdC53aWR0aCA9IG1pbihyZWN0LndpZHRoLCBNVDlUMDAxX1BJWEVMX0FSUkFZX1dJRFRIIC0gcmVjdC5sZWZ0KTsKKwlyZWN0LmhlaWdodCA9IG1pbihyZWN0LmhlaWdodCwgTVQ5VDAwMV9QSVhFTF9BUlJBWV9IRUlHSFQgLSByZWN0LnRvcCk7CisKKwlfX2Nyb3AgPSBfX210OXQwMDFfZ2V0X3BhZF9jcm9wKG10OXQwMDEsIGZoLCBjcm9wLT5wYWQsIGNyb3AtPndoaWNoKTsKKworCWlmIChyZWN0LndpZHRoICE9IF9fY3JvcC0+d2lkdGggfHwgcmVjdC5oZWlnaHQgIT0gX19jcm9wLT5oZWlnaHQpIHsKKwkJLyogUmVzZXQgdGhlIG91dHB1dCBpbWFnZSBzaXplIGlmIHRoZSBjcm9wIHJlY3RhbmdsZSBzaXplIGhhcworCQkgKiBiZWVuIG1vZGlmaWVkLgorCQkgKi8KKwkJX19mb3JtYXQgPSBfX210OXQwMDFfZ2V0X3BhZF9mb3JtYXQobXQ5dDAwMSwgZmgsIGNyb3AtPnBhZCwKKwkJCQkJCSAgICBjcm9wLT53aGljaCk7CisJCV9fZm9ybWF0LT53aWR0aCA9IHJlY3Qud2lkdGg7CisJCV9fZm9ybWF0LT5oZWlnaHQgPSByZWN0LmhlaWdodDsKKwl9CisKKwkqX19jcm9wID0gcmVjdDsKKwljcm9wLT5yZWN0ID0gcmVjdDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgY29udHJvbCBvcGVyYXRpb25zCisgKi8KKworI2RlZmluZSBWNEwyX0NJRF9URVNUX1BBVFRFUk4JCShWNEwyX0NJRF9VU0VSX0JBU0UgfCAweDEwMDEpCisjZGVmaW5lIFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0FVVE8JKFY0TDJfQ0lEX1VTRVJfQkFTRSB8IDB4MTAwMikKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUxfT0ZGU0VUCShWNEwyX0NJRF9VU0VSX0JBU0UgfCAweDEwMDMpCisjZGVmaW5lIFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0NBTElCUkFURQkoVjRMMl9DSURfVVNFUl9CQVNFIHwgMHgxMDA0KQorCisjZGVmaW5lIFY0TDJfQ0lEX0dBSU5fUkVECQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMSkKKyNkZWZpbmUgVjRMMl9DSURfR0FJTl9HUkVFTl9SRUQJCShWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMHgxMDAyKQorI2RlZmluZSBWNEwyX0NJRF9HQUlOX0dSRUVOX0JMVUUJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDEwMDMpCisjZGVmaW5lIFY0TDJfQ0lEX0dBSU5fQkxVRQkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDEwMDQpCisKK3N0YXRpYyB1MTYgbXQ5dDAwMV9nYWluX3ZhbHVlKHMzMiAqZ2FpbikKK3sKKwkvKiBHYWluIGlzIGNvbnRyb2xsZWQgYnkgMiBhbmFsb2cgc3RhZ2VzIGFuZCBhIGRpZ2l0YWwgc3RhZ2UuIFZhbGlkCisJICogdmFsdWVzIGZvciB0aGUgMyBzdGFnZXMgYXJlCisJICoKKwkgKiBTdGFnZQkJTWluCU1heAlTdGVwCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRmlyc3QgYW5hbG9nIHN0YWdlCXgxCXgyCTEKKwkgKiBTZWNvbmQgYW5hbG9nIHN0YWdlCXgxCXg0CTAuMTI1CisJICogRGlnaXRhbCBzdGFnZQl4MQl4MTYJMC4xMjUKKwkgKgorCSAqIFRvIG1pbmltaXplIG5vaXNlLCB0aGUgZ2FpbiBzdGFnZXMgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHNlY29uZAorCSAqIGFuYWxvZyBzdGFnZSwgZmlyc3QgYW5hbG9nIHN0YWdlLCBkaWdpdGFsIHN0YWdlIG9yZGVyLiBHYWluIGZyb20gYQorCSAqIHByZXZpb3VzIHN0YWdlIHNob3VsZCBiZSBwdXNoZWQgdG8gaXRzIG1heGltdW0gdmFsdWUgYmVmb3JlIHRoZSBuZXh0CisJICogc3RhZ2UgaXMgdXNlZC4KKwkgKi8KKwlpZiAoKmdhaW4gPD0gMzIpCisJCXJldHVybiAqZ2FpbjsKKworCWlmICgqZ2FpbiA8PSA2NCkgeworCQkqZ2FpbiAmPSB+MTsKKwkJcmV0dXJuICgxIDw8IDYpIHwgKCpnYWluID4+IDEpOworCX0KKworCSpnYWluICY9IH43OworCXJldHVybiAoKCpnYWluIC0gNjQpIDw8IDUpIHwgKDEgPDwgNikgfCAzMjsKK30KKworc3RhdGljIGludCBtdDl0MDAxX2N0cmxfZnJlZXplKHN0cnVjdCBtdDl0MDAxICptdDl0MDAxLCBib29sIGZyZWV6ZSkKK3sKKwlyZXR1cm4gbXQ5dDAwMV9zZXRfb3V0cHV0X2NvbnRyb2wobXQ5dDAwMSwKKwkJZnJlZXplID8gMCA6IE1UOVQwMDFfT1VUUFVUX0NPTlRST0xfU1lOQywKKwkJZnJlZXplID8gTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9TWU5DIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdGF0aWMgY29uc3QgdTggZ2FpbnNbNF0gPSB7CisJCU1UOVQwMDFfUkVEX0dBSU4sIE1UOVQwMDFfR1JFRU4xX0dBSU4sCisJCU1UOVQwMDFfR1JFRU4yX0dBSU4sIE1UOVQwMDFfQkxVRV9HQUlOCisJfTsKKworCXN0cnVjdCBtdDl0MDAxICptdDl0MDAxID0KKwkJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgbXQ5dDAwMSwgY3RybHMpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDl0MDAxLT5zdWJkZXYpOworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MTYgdmFsdWU7CisJaW50IHJldDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0dBSU5fUkVEOgorCWNhc2UgVjRMMl9DSURfR0FJTl9HUkVFTl9SRUQ6CisJY2FzZSBWNEwyX0NJRF9HQUlOX0dSRUVOX0JMVUU6CisJY2FzZSBWNEwyX0NJRF9HQUlOX0JMVUU6CisKKwkJLyogRGlzYWJsZSBjb250cm9sIHVwZGF0ZXMgaWYgbW9yZSB0aGFuIG9uZSBjb250cm9sIGhhcyBjaGFuZ2VkCisJCSAqIGluIHRoZSBjbHVzdGVyLgorCQkgKi8KKwkJZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgNDsgKytpKSB7CisJCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluID0gbXQ5dDAwMS0+Z2FpbnNbaV07CisKKwkJCWlmIChnYWluLT52YWwgIT0gZ2Fpbi0+Y3VyLnZhbCkKKwkJCQljb3VudCsrOworCQl9CisKKwkJaWYgKGNvdW50ID4gMSkgeworCQkJcmV0ID0gbXQ5dDAwMV9jdHJsX2ZyZWV6ZShtdDl0MDAxLCB0cnVlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIGdhaW4gY29udHJvbHMuICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW4gPSBtdDl0MDAxLT5nYWluc1tpXTsKKworCQkJaWYgKGdhaW4tPnZhbCA9PSBnYWluLT5jdXIudmFsKQorCQkJCWNvbnRpbnVlOworCisJCQl2YWx1ZSA9IG10OXQwMDFfZ2Fpbl92YWx1ZSgmZ2Fpbi0+dmFsKTsKKwkJCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBnYWluc1tpXSwgdmFsdWUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltdDl0MDAxX2N0cmxfZnJlZXplKG10OXQwMDEsIGZhbHNlKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisKKwkJLyogRW5hYmxlIGNvbnRyb2wgdXBkYXRlcy4gKi8KKwkJaWYgKGNvdW50ID4gMSkgeworCQkJcmV0ID0gbXQ5dDAwMV9jdHJsX2ZyZWV6ZShtdDl0MDAxLCBmYWxzZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX0xPVywKKwkJCQkgICAgY3RybC0+dmFsICYgMHhmZmZmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9TSFVUVEVSX1dJRFRIX0hJR0gsCisJCQkJICAgICBjdHJsLT52YWwgPj4gMTYpOworCisJY2FzZSBWNEwyX0NJRF9URVNUX1BBVFRFUk46CisJCXJldCA9IG10OXQwMDFfc2V0X291dHB1dF9jb250cm9sKG10OXQwMDEsCisJCQljdHJsLT52YWwgPyAwIDogTVQ5VDAwMV9PVVRQVVRfQ09OVFJPTF9URVNUX0RBVEEsCisJCQljdHJsLT52YWwgPyBNVDlUMDAxX09VVFBVVF9DT05UUk9MX1RFU1RfREFUQSA6IDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0dXJuIG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX1RFU1RfREFUQSwgY3RybC0+dmFsIDw8IDIpOworCisJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTF9BVVRPOgorCQl2YWx1ZSA9IGN0cmwtPnZhbCA/IDAgOiBNVDlUMDAxX0JMQUNLX0xFVkVMX09WRVJSSURFOworCQlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9CTEFDS19MRVZFTF9DQUxJQlJBVElPTiwKKwkJCQkgICAgdmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJbXQ5dDAwMS0+YmxhY2tfbGV2ZWwgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMX09GRlNFVDoKKwkJcmV0ID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfR1JFRU4xX09GRlNFVCwgY3RybC0+dmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX0dSRUVOMl9PRkZTRVQsIGN0cmwtPnZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9SRURfT0ZGU0VULCBjdHJsLT52YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0dXJuIG10OXQwMDFfd3JpdGUoY2xpZW50LCBNVDlUMDAxX0JMVUVfT0ZGU0VULCBjdHJsLT52YWwpOworCisJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTF9DQUxJQlJBVEU6CisJCXJldHVybiBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9CTEFDS19MRVZFTF9DQUxJQlJBVElPTiwKKwkJCQkgICAgIE1UOVQwMDFfQkxBQ0tfTEVWRUxfUkVDQUxDVUxBVEUgfAorCQkJCSAgICAgbXQ5dDAwMS0+YmxhY2tfbGV2ZWwpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfY3RybF9vcHMgbXQ5dDAwMV9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gbXQ5dDAwMV9zX2N0cmwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgbXQ5dDAwMV9jdHJsc1tdID0geworCXsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX1RFU1RfUEFUVEVSTiwKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUJCT0gIlRlc3QgcGF0dGVybiIsCisJCS5taW4JCT0gMCwKKwkJLm1heAkJPSAxMDIzLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmCQk9IDAsCisJCS5mbGFncwkJPSAwLAorCX0sIHsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX0JMQUNLX0xFVkVMX0FVVE8sCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lCQk9ICJCbGFjayBMZXZlbCwgQXV0byIsCisJCS5taW4JCT0gMCwKKwkJLm1heAkJPSAxLAorCQkuc3RlcAkJPSAxLAorCQkuZGVmCQk9IDEsCisJCS5mbGFncwkJPSAwLAorCX0sIHsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX0JMQUNLX0xFVkVMX09GRlNFVCwKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUJCT0gIkJsYWNrIExldmVsLCBPZmZzZXQiLAorCQkubWluCQk9IC0yNTYsCisJCS5tYXgJCT0gMjU1LAorCQkuc3RlcAkJPSAxLAorCQkuZGVmCQk9IDMyLAorCQkuZmxhZ3MJCT0gMCwKKwl9LCB7CisJCS5vcHMJCT0gJm10OXQwMDFfY3RybF9vcHMsCisJCS5pZAkJPSBWNEwyX0NJRF9CTEFDS19MRVZFTF9DQUxJQlJBVEUsCisJCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKKwkJLm5hbWUJCT0gIkJsYWNrIExldmVsLCBDYWxpYnJhdGUiLAorCQkubWluCQk9IDAsCisJCS5tYXgJCT0gMCwKKwkJLnN0ZXAJCT0gMCwKKwkJLmRlZgkJPSAwLAorCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIG10OXQwMDFfZ2FpbnNbXSA9IHsKKwl7CisJCS5vcHMJCT0gJm10OXQwMDFfY3RybF9vcHMsCisJCS5pZAkJPSBWNEwyX0NJRF9HQUlOX1JFRCwKKwkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUJCT0gIkdhaW4sIFJlZCIsCisJCS5taW4JCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NSU4sCisJCS5tYXgJCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NQVgsCisJCS5zdGVwCQk9IDEsCisJCS5kZWYJCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NSU4sCisJCS5mbGFncwkJPSAwLAorCX0sIHsKKwkJLm9wcwkJPSAmbXQ5dDAwMV9jdHJsX29wcywKKwkJLmlkCQk9IFY0TDJfQ0lEX0dBSU5fR1JFRU5fUkVELAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiwgR3JlZW4gKFIpIiwKKwkJLm1pbgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLm1heAkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01BWCwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLmZsYWdzCQk9IDAsCisJfSwgeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfR0FJTl9HUkVFTl9CTFVFLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiwgR3JlZW4gKEIpIiwKKwkJLm1pbgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLm1heAkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01BWCwKKwkJLnN0ZXAJCT0gMSwKKwkJLmRlZgkJPSBNVDlUMDAxX0dMT0JBTF9HQUlOX01JTiwKKwkJLmZsYWdzCQk9IDAsCisJfSwgeworCQkub3BzCQk9ICZtdDl0MDAxX2N0cmxfb3BzLAorCQkuaWQJCT0gVjRMMl9DSURfR0FJTl9CTFVFLAorCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQkJPSAiR2FpbiwgQmx1ZSIsCisJCS5taW4JCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NSU4sCisJCS5tYXgJCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NQVgsCisJCS5zdGVwCQk9IDEsCisJCS5kZWYJCT0gTVQ5VDAwMV9HTE9CQUxfR0FJTl9NSU4sCisJCS5mbGFncwkJPSAwLAorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgaW50ZXJuYWwgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wOworCisJY3JvcCA9IHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgMCk7CisJY3JvcC0+bGVmdCA9IE1UOVQwMDFfQ09MVU1OX1NUQVJUX0RFRjsKKwljcm9wLT50b3AgPSBNVDlUMDAxX1JPV19TVEFSVF9ERUY7CisJY3JvcC0+d2lkdGggPSBNVDlUMDAxX1dJTkRPV19XSURUSF9ERUYgKyAxOworCWNyb3AtPmhlaWdodCA9IE1UOVQwMDFfV0lORE9XX0hFSUdIVF9ERUYgKyAxOworCisJZm9ybWF0ID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIDApOworCWZvcm1hdC0+Y29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwOworCWZvcm1hdC0+d2lkdGggPSBNVDlUMDAxX1dJTkRPV19XSURUSF9ERUYgKyAxOworCWZvcm1hdC0+aGVpZ2h0ID0gTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX0RFRiArIDE7CisJZm9ybWF0LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmb3JtYXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtdDl0MDAxX3N1YmRldl92aWRlb19vcHMgPSB7CisJLnNfc3RyZWFtID0gbXQ5dDAwMV9zX3N0cmVhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBtdDl0MDAxX3N1YmRldl9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZSA9IG10OXQwMDFfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZSA9IG10OXQwMDFfZW51bV9mcmFtZV9zaXplLAorCS5nZXRfZm10ID0gbXQ5dDAwMV9nZXRfZm9ybWF0LAorCS5zZXRfZm10ID0gbXQ5dDAwMV9zZXRfZm9ybWF0LAorCS5nZXRfY3JvcCA9IG10OXQwMDFfZ2V0X2Nyb3AsCisJLnNldF9jcm9wID0gbXQ5dDAwMV9zZXRfY3JvcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG10OXQwMDFfc3ViZGV2X29wcyA9IHsKKwkudmlkZW8gPSAmbXQ5dDAwMV9zdWJkZXZfdmlkZW9fb3BzLAorCS5wYWQgPSAmbXQ5dDAwMV9zdWJkZXZfcGFkX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG10OXQwMDFfc3ViZGV2X2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IG10OXQwMDFfb3BlbiwKK307CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtdDl0MDAxX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzMzIgZGF0YTsKKwlpbnQgcmV0OworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUHJvYmluZyBNVDlUMDAxIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkgY2xpZW50LT5hZGRyKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwIGFuZCBzdG9wIGRhdGEgcmVhZCBvdXQgKi8KKwlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9SRVNFVCwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtdDl0MDAxX3dyaXRlKGNsaWVudCwgTVQ5VDAwMV9SRVNFVCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfT1VUUFVUX0NPTlRST0wsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29uZmlndXJlIHRoZSBwaXhlbCBjbG9jayBwb2xhcml0eSAqLworCWlmIChwZGF0YSAmJiBwZGF0YS0+Y2xrX3BvbCkgeworCQlyZXQgID0gbXQ5dDAwMV93cml0ZShjbGllbnQsIE1UOVQwMDFfUElYRUxfQ0xPQ0ssCisJCQkJICAgICBNVDlUMDAxX1BJWEVMX0NMT0NLX0lOVkVSVCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZWFkIGFuZCBjaGVjayB0aGUgc2Vuc29yIHZlcnNpb24gKi8KKwlkYXRhID0gbXQ5dDAwMV9yZWFkKGNsaWVudCwgTVQ5VDAwMV9DSElQX1ZFUlNJT04pOworCWlmIChkYXRhICE9IE1UOVQwMDFfQ0hJUF9JRCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOVQwMDEgbm90IGRldGVjdGVkLCB3cm9uZyB2ZXJzaW9uICIKKwkJCSIweCUwNHhcbiIsIGRhdGEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNVDlUMDAxIGRldGVjdGVkIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkgY2xpZW50LT5hZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDAwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCit7CisJc3RydWN0IG10OXQwMDEgKm10OXQwMDE7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkgeworCQlkZXZfd2FybigmY2xpZW50LT5hZGFwdGVyLT5kZXYsCisJCQkgIkkyQy1BZGFwdGVyIGRvZXNuJ3Qgc3VwcG9ydCBJMkNfRlVOQ19TTUJVU19XT1JEXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gbXQ5dDAwMV92aWRlb19wcm9iZShjbGllbnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXQ5dDAwMSA9IGt6YWxsb2Moc2l6ZW9mKCptdDl0MDAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdDl0MDAxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJm10OXQwMDEtPmN0cmxzLCBBUlJBWV9TSVpFKG10OXQwMDFfY3RybHMpICsKKwkJCQkJCUFSUkFZX1NJWkUobXQ5dDAwMV9nYWlucykgKyAyKTsKKworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDAxLT5jdHJscywgJm10OXQwMDFfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX0VYUE9TVVJFLCBNVDlUMDAxX1NIVVRURVJfV0lEVEhfTUlOLAorCQkJICBNVDlUMDAxX1NIVVRURVJfV0lEVEhfTUFYLCAxLAorCQkJICBNVDlUMDAxX1NIVVRURVJfV0lEVEhfREVGKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5dDAwMS0+Y3RybHMsICZtdDl0MDAxX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9CTEFDS19MRVZFTCwgMSwgMSwgMSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDl0MDAxX2N0cmxzKTsgKytpKQorCQl2NGwyX2N0cmxfbmV3X2N1c3RvbSgmbXQ5dDAwMS0+Y3RybHMsICZtdDl0MDAxX2N0cmxzW2ldLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXQwMDFfZ2FpbnMpOyArK2kpCisJCW10OXQwMDEtPmdhaW5zW2ldID0gdjRsMl9jdHJsX25ld19jdXN0b20oJm10OXQwMDEtPmN0cmxzLAorCQkJJm10OXQwMDFfZ2FpbnNbaV0sIE5VTEwpOworCisJdjRsMl9jdHJsX2NsdXN0ZXIoQVJSQVlfU0laRShtdDl0MDAxX2dhaW5zKSwgbXQ5dDAwMS0+Z2FpbnMpOworCisJbXQ5dDAwMS0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZtdDl0MDAxLT5jdHJsczsKKworCWlmIChtdDl0MDAxLT5jdHJscy5lcnJvcikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29udHJvbCBpbml0aWFsaXphdGlvbiBlcnJvciAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBtdDl0MDAxLT5jdHJscy5lcnJvcik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltdDl0MDAxLT5jcm9wLmxlZnQgPSBNVDlUMDAxX0NPTFVNTl9TVEFSVF9ERUY7CisJbXQ5dDAwMS0+Y3JvcC50b3AgPSBNVDlUMDAxX1JPV19TVEFSVF9ERUY7CisJbXQ5dDAwMS0+Y3JvcC53aWR0aCA9IE1UOVQwMDFfV0lORE9XX1dJRFRIX0RFRiArIDE7CisJbXQ5dDAwMS0+Y3JvcC5oZWlnaHQgPSBNVDlUMDAxX1dJTkRPV19IRUlHSFRfREVGICsgMTsKKworCW10OXQwMDEtPmZvcm1hdC5jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR1JCRzEwXzFYMTA7CisJbXQ5dDAwMS0+Zm9ybWF0LndpZHRoID0gTVQ5VDAwMV9XSU5ET1dfV0lEVEhfREVGICsgMTsKKwltdDl0MDAxLT5mb3JtYXQuaGVpZ2h0ID0gTVQ5VDAwMV9XSU5ET1dfSEVJR0hUX0RFRiArIDE7CisJbXQ5dDAwMS0+Zm9ybWF0LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCW10OXQwMDEtPmZvcm1hdC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmbXQ5dDAwMS0+c3ViZGV2LCBjbGllbnQsICZtdDl0MDAxX3N1YmRldl9vcHMpOworCW10OXQwMDEtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXQ5dDAwMV9zdWJkZXZfaW50ZXJuYWxfb3BzOworCW10OXQwMDEtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCW10OXQwMDEtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJm10OXQwMDEtPnN1YmRldi5lbnRpdHksIDEsICZtdDl0MDAxLT5wYWQsIDApOworCitkb25lOgorCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXQwMDEtPmN0cmxzKTsKKwkJbWVkaWFfZW50aXR5X2NsZWFudXAoJm10OXQwMDEtPnN1YmRldi5lbnRpdHkpOworCQlrZnJlZShtdDl0MDAxKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OXQwMDFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5dDAwMSAqbXQ5dDAwMSA9IHRvX210OXQwMDEoc3ViZGV2KTsKKworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXQwMDEtPmN0cmxzKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzdWJkZXYpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdWJkZXYtPmVudGl0eSk7CisJa2ZyZWUobXQ5dDAwMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDl0MDAxX2lkW10gPSB7CisJeyAibXQ5dDAwMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbXQ5dDAwMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDl0MDAxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdDl0MDAxIiwKKwl9LAorCS5wcm9iZQkJPSBtdDl0MDAxX3Byb2JlLAorCS5yZW1vdmUJCT0gbXQ5dDAwMV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbXQ5dDAwMV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG10OXQwMDFfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbXQ5dDAwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXQ5dDAwMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm10OXQwMDFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXQ5dDAwMV9pbml0KTsKK21vZHVsZV9leGl0KG10OXQwMDFfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXB0aW5hIChNaWNyb24pIE1UOVQwMDEgQ2FtZXJhIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYwppbmRleCAzMDU0N2NjLi4wZTc4NDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYwpAQCAtMTMsMTEgKzEzLDIxIEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKworLyoKKyAqIEFUVEVOVElPTjogdGhpcyBkcml2ZXIgc3RpbGwgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgc29jLWNhbWVyYQorICogZnJhbWV3b3JrIGJlY2F1c2Ugb2YgaXRzIFBNIGltcGxlbWVudGF0aW9uLCB1c2luZyB0aGUgdmlkZW9fZGV2aWNlIG5vZGUuCisgKiBJZiBoYXJkd2FyZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGVzdGluZywgYWx0ZXJuYXRpdmUgUE0gYXBwcm9hY2hlcyBzaGFsbAorICogYmUgY29uc2lkZXJlZCBhbmQgdGVzdGVkLgorICovCiAKIC8qCiAgKiBtdDl0MDMxIGkyYyBhZGRyZXNzIDB4NWQKQEAgLTU3LDIxICs2NywyMCBAQAogI2RlZmluZSBNVDlUMDMxX0NPTFVNTl9TS0lQCQkzMgogI2RlZmluZSBNVDlUMDMxX1JPV19TS0lQCQkyMAogCi0jZGVmaW5lIE1UOVQwMzFfQlVTX1BBUkFNCShTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAlcCi0JU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwJXAotCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8CVwKLQlTT0NBTV9NQVNURVIgfCBTT0NBTV9EQVRBV0lEVEhfMTApCi0KIHN0cnVjdCBtdDl0MDMxIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7CisJc3RydWN0IHsKKwkJLyogZXhwb3N1cmUvYXV0by1leHBvc3VyZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9leHBvc3VyZTsKKwkJc3RydWN0IHY0bDJfY3RybCAqZXhwb3N1cmU7CisJfTsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CS8qIFNlbnNvciB3aW5kb3cgKi8KIAlpbnQgbW9kZWw7CS8qIFY0TDJfSURFTlRfTVQ5VDAzMSogY29kZXMgZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLwogCXUxNiB4c2tpcDsKIAl1MTYgeXNraXA7Ci0JdW5zaWduZWQgaW50IGdhaW47CisJdW5zaWduZWQgaW50IHRvdGFsX2g7CiAJdW5zaWduZWQgc2hvcnQgeV9za2lwX3RvcDsJLyogTGluZXMgdG8gc2tpcCBhdCB0aGUgdG9wICovCi0JdW5zaWduZWQgaW50IGV4cG9zdXJlOwotCXVuc2lnbmVkIGNoYXIgYXV0b2V4cG9zdXJlOwogfTsKIAogc3RhdGljIHN0cnVjdCBtdDl0MDMxICp0b19tdDl0MDMxKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0xNzksOTUgKzE4OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5dDAzMV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQotCS8qIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgcXVlcmllZCBvdXIgcGFyYW1ldGVycywgY2hlY2sgYW55d2F5ICovCi0JaWYgKGZsYWdzICYgfk1UOVQwMzFfQlVTX1BBUkFNKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChmbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCi0JCXJlZ19jbGVhcihjbGllbnQsIE1UOVQwMzFfUElYRUxfQ0xPQ0tfQ09OVFJPTCwgMHg4MDAwKTsKLQllbHNlCi0JCXJlZ19zZXQoY2xpZW50LCBNVDlUMDMxX1BJWEVMX0NMT0NLX0NPTlRST0wsIDB4ODAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXQ5dDAzMV9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBNVDlUMDMxX0JVU19QQVJBTSk7Ci19Ci0KLWVudW0gewotCU1UOVQwMzFfQ1RSTF9WRkxJUCwKLQlNVDlUMDMxX0NUUkxfSEZMSVAsCi0JTVQ5VDAzMV9DVFJMX0dBSU4sCi0JTVQ5VDAzMV9DVFJMX0VYUE9TVVJFLAotCU1UOVQwMzFfQ1RSTF9FWFBPU1VSRV9BVVRPLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtdDl0MDMxX2NvbnRyb2xzW10gPSB7Ci0JW01UOVQwMzFfQ1RSTF9WRkxJUF0gPSB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQlbTVQ5VDAzMV9DVFJMX0hGTElQXSA9IHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBIb3Jpem9udGFsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi0JW01UOVQwMzFfQ1RSTF9HQUlOXSA9IHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJHYWluIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEyNywKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSA2NCwKLQkJLmZsYWdzCQk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUiwKLQl9LAotCVtNVDlUMDMxX0NUUkxfRVhQT1NVUkVdID0gewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkUsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMSwKLQkJLm1heGltdW0JPSAyNTUsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMjU1LAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sCi0JW01UOVQwMzFfQ1RSTF9FWFBPU1VSRV9BVVRPXSA9IHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJBdXRvbWF0aWMgRXhwb3N1cmUiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAxLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5dDAzMV9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gbXQ5dDAzMV9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBtdDl0MDMxX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gbXQ5dDAzMV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobXQ5dDAzMV9jb250cm9scyksCi19OwotCiAvKiB0YXJnZXQgbXVzdCBiZSBfZXZlbl8gKi8KIHN0YXRpYyB1MTYgbXQ5dDAzMV9za2lwKHMzMiAqc291cmNlLCBzMzIgdGFyZ2V0LCBzMzIgbWF4KQogewpAQCAtMzUzLDcgKzI3Myw3IEBACiAKIAkvKgogCSAqIFRoZSBjYWxsZXIgcHJvdmlkZXMgYSBzdXBwb3J0ZWQgZm9ybWF0LCBhcyBndWFyYW50ZWVkIGJ5Ci0JICogaWNkLT50cnlfZm10X2NhcCgpLCBzb2NfY2FtZXJhX3NfY3JvcCgpIGFuZCBzb2NfY2FtZXJhX2Nyb3BjYXAoKQorCSAqIC50cnlfbWJ1c19mbXQoKSwgc29jX2NhbWVyYV9zX2Nyb3AoKSBhbmQgc29jX2NhbWVyYV9jcm9wY2FwKCkKIAkgKi8KIAlpZiAocmV0ID49IDApCiAJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVQwMzFfQ09MVU1OX1NUQVJULCByZWN0LT5sZWZ0KTsKQEAgLTM2NCwxNyArMjg0LDEwIEBACiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlUMDMxX1dJTkRPV19IRUlHSFQsCiAJCQkJcmVjdC0+aGVpZ2h0ICsgbXQ5dDAzMS0+eV9za2lwX3RvcCAtIDEpOwotCWlmIChyZXQgPj0gMCAmJiBtdDl0MDMxLT5hdXRvZXhwb3N1cmUpIHsKLQkJdW5zaWduZWQgaW50IHRvdGFsX2ggPSByZWN0LT5oZWlnaHQgKyBtdDl0MDMxLT55X3NraXBfdG9wICsgdmJsYW5rOwotCQlyZXQgPSBzZXRfc2h1dHRlcihjbGllbnQsIHRvdGFsX2gpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCWNvbnN0IHUzMiBzaHV0dGVyX21heCA9IE1UOVQwMzFfTUFYX0hFSUdIVCArIHZibGFuazsKLQkJCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwgPQotCQkJCSZtdDl0MDMxX2NvbnRyb2xzW01UOVQwMzFfQ1RSTF9FWFBPU1VSRV07Ci0JCQltdDl0MDMxLT5leHBvc3VyZSA9IChzaHV0dGVyX21heCAvIDIgKyAodG90YWxfaCAtIDEpICoKLQkJCQkgKHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW0pKSAvCi0JCQkJc2h1dHRlcl9tYXggKyBxY3RybC0+bWluaW11bTsKLQkJfQorCWlmIChyZXQgPj0gMCAmJiB2NGwyX2N0cmxfZ19jdHJsKG10OXQwMzEtPmF1dG9leHBvc3VyZSkgPT0gVjRMMl9FWFBPU1VSRV9BVVRPKSB7CisJCW10OXQwMzEtPnRvdGFsX2ggPSByZWN0LT5oZWlnaHQgKyBtdDl0MDMxLT55X3NraXBfdG9wICsgdmJsYW5rOworCisJCXJldCA9IHNldF9zaHV0dGVyKGNsaWVudCwgbXQ5dDAzMS0+dG90YWxfaCk7CiAJfQogCiAJLyogUmUtZW5hYmxlIHJlZ2lzdGVyIHVwZGF0ZSwgY29tbWl0IGFsbCBjaGFuZ2VzICovCkBAIC01NDMsNzEgKzQ1Niw1NyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbXQ5dDAzMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5dDAzMV9nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSB0b19tdDl0MDMxKGNsaWVudCk7Ci0JaW50IGRhdGE7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwKKwkJCQkJICAgICAgIHN0cnVjdCBtdDl0MDMxLCBoZGwpOworCWNvbnN0IHUzMiBzaHV0dGVyX21heCA9IE1UOVQwMzFfTUFYX0hFSUdIVCArIE1UOVQwMzFfVkVSVElDQUxfQkxBTks7CisJczMyIG1pbiwgbWF4OwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVQwMzFfUkVBRF9NT0RFXzIpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHg4MDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5VDAzMV9SRUFEX01PREVfMik7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiAweDQwMDApOwotCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCWN0cmwtPnZhbHVlID0gbXQ5dDAzMS0+YXV0b2V4cG9zdXJlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWN0cmwtPnZhbHVlID0gbXQ5dDAzMS0+Z2FpbjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJY3RybC0+dmFsdWUgPSBtdDl0MDMxLT5leHBvc3VyZTsKKwkJbWluID0gbXQ5dDAzMS0+ZXhwb3N1cmUtPm1pbmltdW07CisJCW1heCA9IG10OXQwMzEtPmV4cG9zdXJlLT5tYXhpbXVtOworCQltdDl0MDMxLT5leHBvc3VyZS0+dmFsID0KKwkJCShzaHV0dGVyX21heCAvIDIgKyAobXQ5dDAzMS0+dG90YWxfaCAtIDEpICogKG1heCAtIG1pbikpCisJCQkJLyBzaHV0dGVyX21heCArIG1pbjsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10OXQwMzFfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG10OXQwMzFfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7CisJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwKKwkJCQkJICAgICAgIHN0cnVjdCBtdDl0MDMxLCBoZGwpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmbXQ5dDAzMS0+c3ViZGV2OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5dDAzMSAqbXQ5dDAzMSA9IHRvX210OXQwMzEoY2xpZW50KTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOworCXN0cnVjdCB2NGwyX2N0cmwgKmV4cCA9IG10OXQwMzEtPmV4cG9zdXJlOwogCWludCBkYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5VDAzMV9SRUFEX01PREVfMiwgMHg4MDAwKTsKIAkJZWxzZQogCQkJZGF0YSA9IHJlZ19jbGVhcihjbGllbnQsIE1UOVQwMzFfUkVBRF9NT0RFXzIsIDB4ODAwMCk7CiAJCWlmIChkYXRhIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQlicmVhazsKKwkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJaWYgKGN0cmwtPnZhbHVlKQorCQlpZiAoY3RybC0+dmFsKQogCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBNVDlUMDMxX1JFQURfTU9ERV8yLCAweDQwMDApOwogCQllbHNlCiAJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VDAzMV9SRUFEX01PREVfMiwgMHg0MDAwKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCXFjdHJsID0gJm10OXQwMzFfY29udHJvbHNbTVQ5VDAzMV9DVFJMX0dBSU5dOwotCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIFNlZSBEYXRhc2hlZXQgVGFibGUgNywgR2FpbiBzZXR0aW5ncy4gKi8KLQkJaWYgKGN0cmwtPnZhbHVlIDw9IHFjdHJsLT5kZWZhdWx0X3ZhbHVlKSB7CisJCWlmIChjdHJsLT52YWwgPD0gY3RybC0+ZGVmYXVsdF92YWx1ZSkgewogCQkJLyogUGFjayBpdCBpbnRvIDAuLjEgc3RlcCAwLjEyNSwgcmVnaXN0ZXIgdmFsdWVzIDAuLjggKi8KLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+ZGVmYXVsdF92YWx1ZSAtIHFjdHJsLT5taW5pbXVtOwotCQkJZGF0YSA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiA4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlOworCQkJdW5zaWduZWQgbG9uZyByYW5nZSA9IGN0cmwtPmRlZmF1bHRfdmFsdWUgLSBjdHJsLT5taW5pbXVtOworCQkJZGF0YSA9ICgoY3RybC0+dmFsIC0gY3RybC0+bWluaW11bSkgKiA4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlOwogCiAJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNldHRpbmcgZ2FpbiAlZFxuIiwgZGF0YSk7CiAJCQlkYXRhID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VDAzMV9HTE9CQUxfR0FJTiwgZGF0YSk7CkBAIC02MTYsOSArNTE1LDkgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIFBhY2sgaXQgaW50byAxLjEyNS4uMTI4IHZhcmlhYmxlIHN0ZXAsIHJlZ2lzdGVyIHZhbHVlcyA5Li4weDc4NjAgKi8KIAkJCS8qIFdlIGFzc3VtZSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSA+IDAgKi8KLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMTsKKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBjdHJsLT5tYXhpbXVtIC0gY3RybC0+ZGVmYXVsdF92YWx1ZSAtIDE7CiAJCQkvKiBjYWxjdWxhdGVkIGdhaW46IG1hcCA2NS4uMTI3IHRvIDkuLjEwMjQgc3RlcCAwLjEyNSAqLwotCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSkgKgorCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWwgLSBjdHJsLT5kZWZhdWx0X3ZhbHVlIC0gMSkgKgogCQkJCQkgICAgICAgMTAxNSArIHJhbmdlIC8gMikgLyByYW5nZSArIDk7CiAKIAkJCWlmIChnYWluIDw9IDMyKQkJLyogY2FsY3VsYXRlZCBnYWluIDkuLjMyIC0+IDkuLjMyICovCkBAIC02MzUsMTkgKzUzNCwxMyBAQAogCQkJaWYgKGRhdGEgPCAwKQogCQkJCXJldHVybiAtRUlPOwogCQl9CisJCXJldHVybiAwOwogCi0JCS8qIFN1Y2Nlc3MgKi8KLQkJbXQ5dDAzMS0+Z2FpbiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlxY3RybCA9ICZtdDl0MDMxX2NvbnRyb2xzW01UOVQwMzFfQ1RSTF9FWFBPU1VSRV07Ci0JCS8qIG10OXQwMzEgaGFzIG1heGltdW0gPT0gZGVmYXVsdCAqLwotCQlpZiAoY3RybC0+dmFsdWUgPiBxY3RybC0+bWF4aW11bSB8fCBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJY29uc3QgdW5zaWduZWQgbG9uZyByYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07Ci0JCQljb25zdCB1MzIgc2h1dHRlciA9ICgoY3RybC0+dmFsdWUgLSBxY3RybC0+bWluaW11bSkgKiAxMDQ4ICsKLQkJCQkJICAgICByYW5nZSAvIDIpIC8gcmFuZ2UgKyAxOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJaWYgKGN0cmwtPnZhbCA9PSBWNEwyX0VYUE9TVVJFX01BTlVBTCkgeworCQkJdW5zaWduZWQgaW50IHJhbmdlID0gZXhwLT5tYXhpbXVtIC0gZXhwLT5taW5pbXVtOworCQkJdW5zaWduZWQgaW50IHNodXR0ZXIgPSAoKGV4cC0+dmFsIC0gZXhwLT5taW5pbXVtKSAqIDEwNDggKworCQkJCQkJIHJhbmdlIC8gMikgLyByYW5nZSArIDE7CiAJCQl1MzIgb2xkOwogCiAJCQlnZXRfc2h1dHRlcihjbGllbnQsICZvbGQpOwpAQCAtNjU1LDI3ICs1NDgsMTUgQEAKIAkJCQlvbGQsIHNodXR0ZXIpOwogCQkJaWYgKHNldF9zaHV0dGVyKGNsaWVudCwgc2h1dHRlcikgPCAwKQogCQkJCXJldHVybiAtRUlPOwotCQkJbXQ5dDAzMS0+ZXhwb3N1cmUgPSBjdHJsLT52YWx1ZTsKLQkJCW10OXQwMzEtPmF1dG9leHBvc3VyZSA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQlpZiAoY3RybC0+dmFsdWUpIHsKKwkJfSBlbHNlIHsKIAkJCWNvbnN0IHUxNiB2YmxhbmsgPSBNVDlUMDMxX1ZFUlRJQ0FMX0JMQU5LOwotCQkJY29uc3QgdTMyIHNodXR0ZXJfbWF4ID0gTVQ5VDAzMV9NQVhfSEVJR0hUICsgdmJsYW5rOwotCQkJdW5zaWduZWQgaW50IHRvdGFsX2ggPSBtdDl0MDMxLT5yZWN0LmhlaWdodCArCisJCQltdDl0MDMxLT50b3RhbF9oID0gbXQ5dDAzMS0+cmVjdC5oZWlnaHQgKwogCQkJCW10OXQwMzEtPnlfc2tpcF90b3AgKyB2Ymxhbms7CiAKLQkJCWlmIChzZXRfc2h1dHRlcihjbGllbnQsIHRvdGFsX2gpIDwgMCkKKwkJCWlmIChzZXRfc2h1dHRlcihjbGllbnQsIG10OXQwMzEtPnRvdGFsX2gpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKLQkJCXFjdHJsID0gJm10OXQwMzFfY29udHJvbHNbTVQ5VDAzMV9DVFJMX0VYUE9TVVJFXTsKLQkJCW10OXQwMzEtPmV4cG9zdXJlID0gKHNodXR0ZXJfbWF4IC8gMiArICh0b3RhbF9oIC0gMSkgKgotCQkJCSAocWN0cmwtPm1heGltdW0gLSBxY3RybC0+bWluaW11bSkpIC8KLQkJCQlzaHV0dGVyX21heCArIHFjdHJsLT5taW5pbXVtOwotCQkJbXQ5dDAzMS0+YXV0b2V4cG9zdXJlID0gMTsKLQkJfSBlbHNlCi0JCQltdDl0MDMxLT5hdXRvZXhwb3N1cmUgPSAwOwotCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03MDAsOCArNTgxLDcgQEAKIHN0YXRpYyBpbnQgbXQ5dDAzMV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdmRldl90b19zdWJkZXYodmRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gdG9fbXQ5dDAzMShjbGllbnQpOwogCkBAIC03MzQsNiArNjE0LDE5IEBACiAJLnBtCT0gJm10OXQwMzFfZGV2X3BtX29wcywKIH07CiAKK3N0YXRpYyBpbnQgbXQ5dDAzMV9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHNvY19jYW1lcmFfaTJjX3RvX3ZkZXYoY2xpZW50KTsKKworCWlmIChvbikKKwkJdmRldi0+ZGV2LnR5cGUgPSAmbXQ5dDAzMV9kZXZfdHlwZTsKKwllbHNlCisJCXZkZXYtPmRldi50eXBlID0gTlVMTDsKKworCXJldHVybiAwOworfQorCiAvKgogICogSW50ZXJmYWNlIGFjdGl2ZSwgY2FuIHVzZSBpMmMuIElmIGl0IGZhaWxzLCBpdCBjYW4gaW5kZWVkIG1lYW4sIHRoYXQKICAqIHRoaXMgd2Fzbid0IG91ciBjYXB0dXJlIGludGVyZmFjZSwgc28sIHdlIHdhaXQgZm9yIHRoZSByaWdodCBvbmUKQEAgLTc0MSw3ICs2MzQsNiBAQAogc3RhdGljIGludCBtdDl0MDMxX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSB0b19tdDl0MDMxKGNsaWVudCk7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHNvY19jYW1lcmFfaTJjX3RvX3ZkZXYoY2xpZW50KTsKIAlzMzIgZGF0YTsKIAlpbnQgcmV0OwogCkBAIC03NjgsMTEgKzY2MCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpc2UgdGhlIGNhbWVyYVxuIik7CiAJZWxzZQotCQl2ZGV2LT5kZXYudHlwZSA9ICZtdDl0MDMxX2Rldl90eXBlOwotCi0JLyogbXQ5dDAzMV9pZGxlKCkgaGFzIHJlc2V0IHRoZSBjaGlwIHRvIGRlZmF1bHQuICovCi0JbXQ5dDAzMS0+ZXhwb3N1cmUgPSAyNTU7Ci0JbXQ5dDAzMS0+Z2FpbiA9IDY0OworCQl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmbXQ5dDAzMS0+aGRsKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03ODcsMTAgKzY3NSwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgbXQ5dDAzMV9jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gbXQ5dDAzMV9nX3ZvbGF0aWxlX2N0cmwsCisJLnNfY3RybCA9IG10OXQwMzFfc19jdHJsLAorfTsKKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDl0MDMxX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQk9IG10OXQwMzFfZ19jdHJsLAotCS5zX2N0cmwJCT0gbXQ5dDAzMV9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG10OXQwMzFfZ19jaGlwX2lkZW50LAorCS5zX3Bvd2VyCT0gbXQ5dDAzMV9zX3Bvd2VyLAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG10OXQwMzFfZ19yZWdpc3RlciwKIAkuc19yZWdpc3Rlcgk9IG10OXQwMzFfc19yZWdpc3RlciwKQEAgLTgwNyw2ICs2OTksMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdDl0MDMxX2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDl0MDMxX3NfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwlpZiAoc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZykgJgorCSAgICBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykKKwkJcmV0dXJuIHJlZ19jbGVhcihjbGllbnQsIE1UOVQwMzFfUElYRUxfQ0xPQ0tfQ09OVFJPTCwgMHg4MDAwKTsKKwllbHNlCisJCXJldHVybiByZWdfc2V0KGNsaWVudCwgTVQ5VDAzMV9QSVhFTF9DTE9DS19DT05UUk9MLCAweDgwMDApOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtdDl0MDMxX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gbXQ5dDAzMV9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAk9IG10OXQwMzFfc19mbXQsCkBAIC04MTYsNiArNzM2LDggQEAKIAkuZ19jcm9wCQk9IG10OXQwMzFfZ19jcm9wLAogCS5jcm9wY2FwCT0gbXQ5dDAzMV9jcm9wY2FwLAogCS5lbnVtX21idXNfZm10CT0gbXQ5dDAzMV9lbnVtX2ZtdCwKKwkuZ19tYnVzX2NvbmZpZwk9IG10OXQwMzFfZ19tYnVzX2NvbmZpZywKKwkuc19tYnVzX2NvbmZpZwk9IG10OXQwMzFfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfc2Vuc29yX29wcyBtdDl0MDMxX3N1YmRldl9zZW5zb3Jfb3BzID0gewpAQCAtODMyLDE4ICs3NTQsMTMgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKIAlpbnQgcmV0OwogCi0JaWYgKGljZCkgewotCQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQkJaWYgKCFpY2wpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5VDAzMSBkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWljZC0+b3BzID0gJm10OXQwMzFfb3BzOworCWlmICghaWNsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTVQ5VDAzMSBkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkgewpAQCAtODU3LDYgKzc3NCwzMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZtdDl0MDMxLT5zdWJkZXYsIGNsaWVudCwgJm10OXQwMzFfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmbXQ5dDAzMS0+aGRsLCA1KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5dDAzMS0+aGRsLCAmbXQ5dDAzMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5dDAzMS0+aGRsLCAmbXQ5dDAzMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0hGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmbXQ5dDAzMS0+aGRsLCAmbXQ5dDAzMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0dBSU4sIDAsIDEyNywgMSwgNjQpOworCisJLyoKKwkgKiBTaW11bGF0ZWQgYXV0b2V4cG9zdXJlLiBJZiBlbmFibGVkLCB3ZSBjYWxjdWxhdGUgc2h1dHRlciB3aWR0aAorCSAqIG91cnNlbHZlcyBpbiB0aGUgZHJpdmVyIGJhc2VkIG9uIHZlcnRpY2FsIGJsYW5raW5nIGFuZCBmcmFtZSB3aWR0aAorCSAqLworCW10OXQwMzEtPmF1dG9leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoJm10OXQwMzEtPmhkbCwKKwkJCSZtdDl0MDMxX2N0cmxfb3BzLCBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAxLCAwLAorCQkJVjRMMl9FWFBPU1VSRV9BVVRPKTsKKwltdDl0MDMxLT5leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZtdDl0MDMxLT5oZGwsICZtdDl0MDMxX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfRVhQT1NVUkUsIDEsIDI1NSwgMSwgMjU1KTsKKworCW10OXQwMzEtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmbXQ5dDAzMS0+aGRsOworCWlmIChtdDl0MDMxLT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IG10OXQwMzEtPmhkbC5lcnJvcjsKKworCQlrZnJlZShtdDl0MDMxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmbXQ5dDAzMS0+YXV0b2V4cG9zdXJlLAorCQkJCVY0TDJfRVhQT1NVUkVfTUFOVUFMLCB0cnVlKTsKIAogCW10OXQwMzEtPnlfc2tpcF90b3AJPSAwOwogCW10OXQwMzEtPnJlY3QubGVmdAk9IE1UOVQwMzFfQ09MVU1OX1NLSVA7CkBAIC04NjQsMTIgKzgwOCw2IEBACiAJbXQ5dDAzMS0+cmVjdC53aWR0aAk9IE1UOVQwMzFfTUFYX1dJRFRIOwogCW10OXQwMzEtPnJlY3QuaGVpZ2h0CT0gTVQ5VDAzMV9NQVhfSEVJR0hUOwogCi0JLyoKLQkgKiBTaW11bGF0ZWQgYXV0b2V4cG9zdXJlLiBJZiBlbmFibGVkLCB3ZSBjYWxjdWxhdGUgc2h1dHRlciB3aWR0aAotCSAqIG91cnNlbHZlcyBpbiB0aGUgZHJpdmVyIGJhc2VkIG9uIHZlcnRpY2FsIGJsYW5raW5nIGFuZCBmcmFtZSB3aWR0aAotCSAqLwotCW10OXQwMzEtPmF1dG9leHBvc3VyZSA9IDE7Ci0KIAltdDl0MDMxLT54c2tpcCA9IDE7CiAJbXQ5dDAzMS0+eXNraXAgPSAxOwogCkBAIC04ODAsOCArODE4LDcgQEAKIAltdDl0MDMxX2Rpc2FibGUoY2xpZW50KTsKIAogCWlmIChyZXQpIHsKLQkJaWYgKGljZCkKLQkJCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5dDAzMS0+aGRsKTsKIAkJa2ZyZWUobXQ5dDAzMSk7CiAJfQogCkBAIC04OTEsMTAgKzgyOCw5IEBACiBzdGF0aWMgaW50IG10OXQwMzFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSB0b19tdDl0MDMxKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKGljZCkKLQkJaWNkLT5vcHMgPSBOVUxMOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZtdDl0MDMxLT5zdWJkZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXQwMzEtPmhkbCk7CiAJa2ZyZWUobXQ5dDAzMSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMKaW5kZXggZDJlMGE1MC4uMzIxMTRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMKQEAgLTIyLDExICsyMiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvbXQ5dDExMi5oPgogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCkBAIC0zNCwxMSArMzQsNyBAQAogLyogI2RlZmluZSBFWFRfQ0xPQ0sgMjQwMDAwMDAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCW1hY3JvCi0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGZyYW1lIHNpemUKQEAgLTgwLDE3ICs3Niw4IEBACiAjZGVmaW5lIFZBUjgoaWQsIG9mZnNldCkgX1ZBUihpZCwgb2Zmc2V0LCAweDgwMDApCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCiAJCQlzdHJ1Y3QKLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgbXQ5dDExMl9mcmFtZV9zaXplIHsKLQl1MTYgd2lkdGg7Ci0JdTE2IGhlaWdodDsKLX07Ci0KIHN0cnVjdCBtdDl0MTEyX2Zvcm1hdCB7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CiAJZW51bSB2NGwyX2NvbG9yc3BhY2UgY29sb3JzcGFjZTsKQEAgLTEwMiwyMSArODksMTcgQEAKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCSBzdWJkZXY7CiAJc3RydWN0IG10OXQxMTJfY2FtZXJhX2luZm8JKmluZm87CiAJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlCSBpY2Q7Ci0Jc3RydWN0IG10OXQxMTJfZnJhbWVfc2l6ZQkgZnJhbWU7CisJc3RydWN0IHY0bDJfcmVjdAkJIGZyYW1lOwogCWNvbnN0IHN0cnVjdCBtdDl0MTEyX2Zvcm1hdAkqZm9ybWF0OwogCWludAkJCQkgbW9kZWw7CiAJdTMyCQkJCSBmbGFnczsKIC8qIGZvciBmbGFncyAqLwotI2RlZmluZSBJTklUX0RPTkUgICgxPDwwKQorI2RlZmluZSBJTklUX0RPTkUJKDEgPDwgMCkKKyNkZWZpbmUgUENMS19SSVNJTkcJKDEgPDwgMSkKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCiAJCQlzdXBwb3J0ZWQgZm9ybWF0Ci0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG10OXQxMTJfZm9ybWF0IG10OXQxMTJfY2ZtdHNbXSA9IHsKQEAgLTE1NCwxMSArMTM3LDcgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCiAJCQlnZW5lcmFsIGZ1bmN0aW9uCi0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBtdDl0MTEyX3ByaXYgKnRvX210OXQxMTIoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKQEAgLTMyNiw1MCArMzA1LDQ3IEBACiAJbiA9IChuID4+IDgpICYgMHgwMDNmOwogCiAJZW5hYmxlID0gKCg2MDAwID4gZXh0KSB8fCAoNTQwMDAgPCBleHQpKSA/ICJYIiA6ICIiOwotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkVYVENMSyAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgZXh0LCBlbmFibGUpOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRVhUQ0xLICAgICAgICAgIDogJTEwdSBLICVzXG4iLCBleHQsIGVuYWJsZSk7CiAKIAl2Y28gPSAyICogbSAqIGV4dCAvIChuKzEpOwogCWVuYWJsZSA9ICgoMzg0MDAwID4gdmNvKSB8fCAoNzY4MDAwIDwgdmNvKSkgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJWQ08gICAgICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIHZjbywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlZDTyAgICAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgdmNvLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHAxKzEpIC8gKHAyKzEpOwogCWVuYWJsZSA9ICg5NjAwMCA8IGNsaykgPyAiWCIgOiAiIjsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJQSVhDTEsgICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlBJWENMSyAgICAgICAgICA6ICUxMHUgSyAlc1xuIiwgY2xrLCBlbmFibGUpOwogCiAJY2xrID0gdmNvIC8gKHAzKzEpOwogCWVuYWJsZSA9ICg3NjgwMDAgPCBjbGspID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiTUlQSUNMSyAgICAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJNSVBJQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKIAogCWNsayA9IHZjbyAvIChwNisxKTsKIAllbmFibGUgPSAoOTYwMDAgPCBjbGspID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiTUNVIENMSyAgICAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJNQ1UgQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKIAogCWNsayA9IHZjbyAvIChwNSsxKTsKIAllbmFibGUgPSAoNTQwMDAgPCBjbGspID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiU09DIENMSyAgICAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTT0MgQ0xLICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKIAogCWNsayA9IHZjbyAvIChwNCsxKTsKIAllbmFibGUgPSAoNzAwMDAgPCBjbGspID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiU2Vuc29yIENMSyAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZW5zb3IgQ0xLICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKIAogCWNsayA9IHZjbyAvIChwNysxKTsKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJFeHRlcm5hbCBzZW5zb3IgOiAlMTB1IEtcbiIsIGNsayk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJFeHRlcm5hbCBzZW5zb3IgOiAlMTB1IEtcbiIsIGNsayk7CiAKIAljbGsgPSBleHQgLyAobisxKTsKIAllbmFibGUgPSAoKDIwMDAgPiBjbGspIHx8ICgyNDAwMCA8IGNsaykpID8gIlgiIDogIiI7Ci0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiUEZEICAgICAgICAgICAgIDogJTEwdSBLICVzXG4iLCBjbGssIGVuYWJsZSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJQRkQgICAgICAgICAgICAgOiAlMTB1IEsgJXNcbiIsIGNsaywgZW5hYmxlKTsKIAogCXJldHVybiAwOwogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIG10OXQxMTJfZnJhbWVfY2hlY2sodTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCitzdGF0aWMgdm9pZCBtdDl0MTEyX2ZyYW1lX2NoZWNrKHUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0LCB1MzIgKmxlZnQsIHUzMiAqdG9wKQogewotCWlmICgqd2lkdGggPiBNQVhfV0lEVEgpCi0JCSp3aWR0aCA9IE1BWF9XSURUSDsKLQotCWlmICgqaGVpZ2h0ID4gTUFYX0hFSUdIVCkKLQkJKmhlaWdodCA9IE1BWF9IRUlHSFQ7CisJc29jX2NhbWVyYV9saW1pdF9zaWRlKGxlZnQsIHdpZHRoLCAwLCAwLCBNQVhfV0lEVEgpOworCXNvY19jYW1lcmFfbGltaXRfc2lkZSh0b3AsIGhlaWdodCwgMCwgMCwgTUFYX0hFSUdIVCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5dDExMl9zZXRfYV9mcmFtZV9zaXplKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC03NTgsNDggKzczNCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0JCQlzb2NfY2FtZXJhX29wcwotCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbXQ5dDExMl9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSB1bnNpZ25lZCBsb25nCWZsYWdzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtdDl0MTEyX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fTUFTVEVSIHwgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlmbGFncyB8PSAocHJpdi0+aW5mby0+ZmxhZ3MgJiBNVDlUMTEyX0ZMQUdfUENMS19SSVNJTkdfRURHRSkgPwotCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgOiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOwotCi0JaWYgKHByaXYtPmluZm8tPmZsYWdzICYgTVQ5VDExMl9GTEFHX0RBVEFXSURUSF84KQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfODsKLQllbHNlCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBtdDl0MTEyX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBtdDl0MTEyX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG10OXQxMTJfcXVlcnlfYnVzX3BhcmFtLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCXY0bDJfc3ViZGV2X2NvcmVfb3BzCi0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBtdDl0MTEyX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKQEAgLTg1MCwxMSArNzg1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQogCQkJdjRsMl9zdWJkZXZfdmlkZW9fb3BzCi0KLQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBtdDl0MTEyX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCiB7CkBAIC04NzcsOCArODA4LDcgQEAKIAl9CiAKIAlpZiAoIShwcml2LT5mbGFncyAmIElOSVRfRE9ORSkpIHsKLQkJdTE2IHBhcmFtID0gKE1UOVQxMTJfRkxBR19QQ0xLX1JJU0lOR19FREdFICYKLQkJCSAgICAgcHJpdi0+aW5mby0+ZmxhZ3MpID8gMHgwMDAxIDogMHgwMDAwOworCQl1MTYgcGFyYW0gPSBQQ0xLX1JJU0lORyAmIHByaXYtPmZsYWdzID8gMHgwMDAxIDogMHgwMDAwOwogCiAJCUVDSEVDS0VSKHJldCwgbXQ5dDExMl9pbml0X2NhbWVyYShjbGllbnQpKTsKIApAQCAtOTEwLDE5ICs4NDAsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OXQxMTJfc2V0X3BhcmFtcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCitzdGF0aWMgaW50IG10OXQxMTJfc2V0X3BhcmFtcyhzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqcmVjdCwKIAkJCSAgICAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKQogewotCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7CiAJaW50IGk7CiAKLQlwcml2LT5mb3JtYXQgPSBOVUxMOwotCi0JLyoKLQkgKiBmcmFtZSBzaXplIGNoZWNrCi0JICovCi0JbXQ5dDExMl9mcmFtZV9jaGVjaygmd2lkdGgsICZoZWlnaHQpOwotCiAJLyoKIAkgKiBnZXQgY29sb3IgZm9ybWF0CiAJICovCkBAIC05MzMsOCArODU2LDEzIEBACiAJaWYgKGkgPT0gQVJSQVlfU0laRShtdDl0MTEyX2NmbXRzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2LT5mcmFtZS53aWR0aCAgPSAodTE2KXdpZHRoOwotCXByaXYtPmZyYW1lLmhlaWdodCA9ICh1MTYpaGVpZ2h0OworCXByaXYtPmZyYW1lICA9ICpyZWN0OworCisJLyoKKwkgKiBmcmFtZSBzaXplIGNoZWNrCisJICovCisJbXQ5dDExMl9mcmFtZV9jaGVjaygmcHJpdi0+ZnJhbWUud2lkdGgsICZwcml2LT5mcmFtZS5oZWlnaHQsCisJCQkgICAgJnByaXYtPmZyYW1lLmxlZnQsICZwcml2LT5mcmFtZS50b3ApOwogCiAJcHJpdi0+Zm9ybWF0ID0gbXQ5dDExMl9jZm10cyArIGk7CiAKQEAgLTk0NSw5ICs4NzMsMTIgQEAKIHsKIAlhLT5ib3VuZHMubGVmdAkJCT0gMDsKIAlhLT5ib3VuZHMudG9wCQkJPSAwOwotCWEtPmJvdW5kcy53aWR0aAkJCT0gVkdBX1dJRFRIOwotCWEtPmJvdW5kcy5oZWlnaHQJCT0gVkdBX0hFSUdIVDsKLQlhLT5kZWZyZWN0CQkJPSBhLT5ib3VuZHM7CisJYS0+Ym91bmRzLndpZHRoCQkJPSBNQVhfV0lEVEg7CisJYS0+Ym91bmRzLmhlaWdodAkJPSBNQVhfSEVJR0hUOworCWEtPmRlZnJlY3QubGVmdAkJCT0gMDsKKwlhLT5kZWZyZWN0LnRvcAkJCT0gMDsKKwlhLT5kZWZyZWN0LndpZHRoCQk9IFZHQV9XSURUSDsKKwlhLT5kZWZyZWN0LmhlaWdodAkJPSBWR0FfSEVJR0hUOwogCWEtPnR5cGUJCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJYS0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yCT0gMTsKIAlhLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvcgk9IDE7CkBAIC05NTcsMTEgKzg4OCwxMSBAQAogCiBzdGF0aWMgaW50IG10OXQxMTJfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7Ci0JYS0+Yy5sZWZ0CT0gMDsKLQlhLT5jLnRvcAk9IDA7Ci0JYS0+Yy53aWR0aAk9IFZHQV9XSURUSDsKLQlhLT5jLmhlaWdodAk9IFZHQV9IRUlHSFQ7Ci0JYS0+dHlwZQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7CisKKwlhLT5jCT0gcHJpdi0+ZnJhbWU7CisJYS0+dHlwZQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAogCXJldHVybiAwOwogfQpAQCAtOTY5LDEwICs5MDAsMTAgQEAKIHN0YXRpYyBpbnQgbXQ5dDExMl9zX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CiAKLQlyZXR1cm4gbXQ5dDExMl9zZXRfcGFyYW1zKGNsaWVudCwgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCwKLQkJCQkgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgpOworCXJldHVybiBtdDl0MTEyX3NldF9wYXJhbXMocHJpdiwgcmVjdCwgcHJpdi0+Zm9ybWF0LT5jb2RlKTsKIH0KIAogc3RhdGljIGludCBtdDl0MTEyX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC05ODEsMTYgKzkxMiw5IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCBtdDl0MTEyX3ByaXYgKnByaXYgPSB0b19tdDl0MTEyKGNsaWVudCk7CiAKLQlpZiAoIXByaXYtPmZvcm1hdCkgewotCQlpbnQgcmV0ID0gbXQ5dDExMl9zZXRfcGFyYW1zKGNsaWVudCwgVkdBX1dJRFRILCBWR0FfSEVJR0hULAotCQkJCQkgICAgIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCW1mLT53aWR0aAk9IHByaXYtPmZyYW1lLndpZHRoOwogCW1mLT5oZWlnaHQJPSBwcml2LT5mcmFtZS5oZWlnaHQ7Ci0JLyogVE9ETzogc2V0IGNvbG9yc3BhY2UgKi8KKwltZi0+Y29sb3JzcGFjZQk9IHByaXYtPmZvcm1hdC0+Y29sb3JzcGFjZTsKIAltZi0+Y29kZQk9IHByaXYtPmZvcm1hdC0+Y29kZTsKIAltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CiAKQEAgLTEwMDEsMTcgKzkyNSw0MiBAQAogCQkJIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOworCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IHsKKwkJLndpZHRoID0gbWYtPndpZHRoLAorCQkuaGVpZ2h0ID0gbWYtPmhlaWdodCwKKwkJLmxlZnQgPSBwcml2LT5mcmFtZS5sZWZ0LAorCQkudG9wID0gcHJpdi0+ZnJhbWUudG9wLAorCX07CisJaW50IHJldDsKIAotCS8qIFRPRE86IHNldCBjb2xvcnNwYWNlICovCi0JcmV0dXJuIG10OXQxMTJfc2V0X3BhcmFtcyhjbGllbnQsIG1mLT53aWR0aCwgbWYtPmhlaWdodCwgbWYtPmNvZGUpOworCXJldCA9IG10OXQxMTJfc2V0X3BhcmFtcyhwcml2LCAmcmVjdCwgbWYtPmNvZGUpOworCisJaWYgKCFyZXQpCisJCW1mLT5jb2xvcnNwYWNlID0gcHJpdi0+Zm9ybWF0LT5jb2xvcnNwYWNlOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtdDl0MTEyX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCW10OXQxMTJfZnJhbWVfY2hlY2soJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOworCXVuc2lnbmVkIGludCB0b3AsIGxlZnQ7CisJaW50IGk7CiAKLQkvKiBUT0RPOiBzZXQgY29sb3JzcGFjZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10OXQxMTJfY2ZtdHMpOyBpKyspCisJCWlmIChtdDl0MTEyX2NmbXRzW2ldLmNvZGUgPT0gbWYtPmNvZGUpCisJCQlicmVhazsKKworCWlmIChpID09IEFSUkFZX1NJWkUobXQ5dDExMl9jZm10cykpIHsKKwkJbWYtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODsKKwkJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwl9IGVsc2UgeworCQltZi0+Y29sb3JzcGFjZQk9IG10OXQxMTJfY2ZtdHNbaV0uY29sb3JzcGFjZTsKKwl9CisKKwltdDl0MTEyX2ZyYW1lX2NoZWNrKCZtZi0+d2lkdGgsICZtZi0+aGVpZ2h0LCAmbGVmdCwgJnRvcCk7CisKIAltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAKIAlyZXR1cm4gMDsKQEAgLTEwMjQsNiArOTczLDM1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJKmNvZGUgPSBtdDl0MTEyX2NmbXRzW2luZGV4XS5jb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXQ5dDExMl9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJIHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfTUFTVEVSIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXQxMTJfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJc3RydWN0IG10OXQxMTJfcHJpdiAqcHJpdiA9IHRvX210OXQxMTIoY2xpZW50KTsKKworCWlmIChzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKSAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcpCisJCXByaXYtPmZsYWdzIHw9IFBDTEtfUklTSU5HOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMzYsMzEgKzEwMTQsMjQgQEAKIAkuZ19jcm9wCQk9IG10OXQxMTJfZ19jcm9wLAogCS5zX2Nyb3AJCT0gbXQ5dDExMl9zX2Nyb3AsCiAJLmVudW1fbWJ1c19mbXQJPSBtdDl0MTEyX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gbXQ5dDExMl9nX21idXNfY29uZmlnLAorCS5zX21idXNfY29uZmlnCT0gbXQ5dDExMl9zX21idXNfY29uZmlnLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCWkyYyBkcml2ZXIKLQotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtdDl0MTEyX3N1YmRldl9vcHMgPSB7CiAJLmNvcmUJPSAmbXQ5dDExMl9zdWJkZXZfY29yZV9vcHMsCiAJLnZpZGVvCT0gJm10OXQxMTJfc3ViZGV2X3ZpZGVvX29wcywKIH07CiAKLXN0YXRpYyBpbnQgbXQ5dDExMl9jYW1lcmFfcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgbXQ5dDExMl9jYW1lcmFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOwogCWNvbnN0IGNoYXIgICAgICAgICAgKmRldm5hbWU7CiAJaW50ICAgICAgICAgICAgICAgICAgY2hpcGlkOwogCi0JLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KLQlCVUdfT04oIWljZC0+cGFyZW50IHx8Ci0JICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwotCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBjaGlwIElECiAJICovCkBAIC0xMDg4LDIwICsxMDU5LDIxIEBACiBzdGF0aWMgaW50IG10OXQxMTJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewotCXN0cnVjdCBtdDl0MTEyX3ByaXYgICAgICAgICpwcml2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAgICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgICAgICppY2w7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKwlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2OworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3QgPSB7CisJCS53aWR0aCA9IFZHQV9XSURUSCwKKwkJLmhlaWdodCA9IFZHQV9IRUlHSFQsCisJCS5sZWZ0ID0gKE1BWF9XSURUSCAtIFZHQV9XSURUSCkgLyAyLAorCQkudG9wID0gKE1BWF9IRUlHSFQgLSBWR0FfSEVJR0hUKSAvIDIsCisJfTsKKwlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJtdDl0MTEyOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOworCWlmICghaWNsIHx8ICFpY2wtPnByaXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJtdDl0MTEyOiBtaXNzaW5nIHBsYXRmb3JtIGRhdGEhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JaWYgKCFpY2wgfHwgIWljbC0+cHJpdikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTExMCwxMyArMTA4MiwxMiBAQAogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmbXQ5dDExMl9zdWJkZXZfb3BzKTsKIAotCWljZC0+b3BzID0gJm10OXQxMTJfb3BzOwotCi0JcmV0ID0gbXQ5dDExMl9jYW1lcmFfcHJvYmUoaWNkLCBjbGllbnQpOwotCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCXJldCA9IG10OXQxMTJfY2FtZXJhX3Byb2JlKGNsaWVudCk7CisJaWYgKHJldCkKIAkJa2ZyZWUocHJpdik7Ci0JfQorCisJLyogQ2Fubm90IGZhaWw6IHVzaW5nIHRoZSBkZWZhdWx0IHN1cHBvcnRlZCBwaXhlbCBjb2RlICovCisJbXQ5dDExMl9zZXRfcGFyYW1zKHByaXYsICZyZWN0LCBWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEyNCw5ICsxMDk1LDcgQEAKIHN0YXRpYyBpbnQgbXQ5dDExMl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbXQ5dDExMl9wcml2ICpwcml2ID0gdG9fbXQ5dDExMihjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWljZC0+b3BzID0gTlVMTDsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNDcsMTEgKzExMTYsNyBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KIAkJCW1vZHVsZSBmdW5jdGlvbgotCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBpbnQgX19pbml0IG10OXQxMTJfbW9kdWxlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKaW5kZXggODkzYThiOC4uZGI3NGRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKaW5kZXggNTFiMGZjYy4uNjkwZWUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKQEAgLTEzLDEwICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAogLyoKICAqIG10OXYwMjIgaTJjIGFkZHJlc3MgMHg0OCwgMHg0YywgMHg1OCwgMHg1YwpAQCAtMTAwLDYgKzEwMywxNyBAQAogCiBzdHJ1Y3QgbXQ5djAyMiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOworCXN0cnVjdCB7CisJCS8qIGV4cG9zdXJlL2F1dG8tZXhwb3N1cmUgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICphdXRvZXhwb3N1cmU7CisJCXN0cnVjdCB2NGwyX2N0cmwgKmV4cG9zdXJlOworCX07CisJc3RydWN0IHsKKwkJLyogZ2Fpbi9hdXRvLWdhaW4gY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICphdXRvZ2FpbjsKKwkJc3RydWN0IHY0bDJfY3RybCAqZ2FpbjsKKwl9OwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsJLyogU2Vuc29yIHdpbmRvdyAqLwogCWNvbnN0IHN0cnVjdCBtdDl2MDIyX2RhdGFmbXQgKmZtdDsKIAljb25zdCBzdHJ1Y3QgbXQ5djAyMl9kYXRhZm10ICpmbXRzOwpAQCAtMTc4LDYgKzE5Miw4IEBACiAJCXJldCA9IHJlZ19jbGVhcihjbGllbnQsIE1UOVYwMjJfQkxBQ0tfTEVWRUxfQ0FMSUJfQ1RSTCwgMSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVYwMjJfRElHSVRBTF9URVNUX1BBVFRFUk4sIDApOworCWlmICghcmV0KQorCQlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJm10OXYwMjItPmhkbCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk5LDc4ICsyMTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10OXYwMjJfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSB0b19tdDl2MDIyKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgaW50IHdpZHRoX2ZsYWcgPSBmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLOwotCWludCByZXQ7Ci0JdTE2IHBpeGNsayA9IDA7Ci0KLQkvKiBPbmx5IG9uZSB3aWR0aCBiaXQgbWF5IGJlIHNldCAqLwotCWlmICghaXNfcG93ZXJfb2ZfMih3aWR0aF9mbGFnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoaWNsLT5zZXRfYnVzX3BhcmFtKSB7Ci0JCXJldCA9IGljbC0+c2V0X2J1c19wYXJhbShpY2wsIHdpZHRoX2ZsYWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBXaXRob3V0IGJvYXJkIHNwZWNpZmljIGJ1cyB3aWR0aCBzZXR0aW5ncyB3ZSBvbmx5IHN1cHBvcnQgdGhlCi0JCSAqIHNlbnNvcnMgbmF0aXZlIGJ1cyB3aWR0aAotCQkgKi8KLQkJaWYgKHdpZHRoX2ZsYWcgIT0gU09DQU1fREFUQVdJRFRIXzEwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLQotCWlmIChmbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCi0JCXBpeGNsayB8PSAweDEwOwotCi0JaWYgKCEoZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCkpCi0JCXBpeGNsayB8PSAweDE7Ci0KLQlpZiAoIShmbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSkKLQkJcGl4Y2xrIHw9IDB4MjsKLQotCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVYwMjJfUElYQ0xLX0ZWX0xWLCBwaXhjbGspOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKCEoZmxhZ3MgJiBTT0NBTV9NQVNURVIpKQotCQltdDl2MDIyLT5jaGlwX2NvbnRyb2wgJj0gfjB4ODsKLQotCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVYwMjJfQ0hJUF9DT05UUk9MLCBtdDl2MDIyLT5jaGlwX2NvbnRyb2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2RiZygmY2xpZW50LT5kZXYsICJDYWxjdWxhdGVkIHBpeGNsayAweCV4LCBjaGlwIGNvbnRyb2wgMHgleFxuIiwKLQkJcGl4Y2xrLCBtdDl2MDIyLT5jaGlwX2NvbnRyb2wpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG10OXYwMjJfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCXVuc2lnbmVkIGludCBmbGFncyA9IFNPQ0FNX01BU1RFUiB8IFNPQ0FNX1NMQVZFIHwKLQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlpZiAoaWNsLT5xdWVyeV9idXNfcGFyYW0pCi0JCWZsYWdzIHw9IGljbC0+cXVlcnlfYnVzX3BhcmFtKGljbCkgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQllbHNlCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBtdDl2MDIyX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTM4OSw3ICszMzMsNyBAQAogCiAJLyoKIAkgKiBUaGUgY2FsbGVyIHByb3ZpZGVzIGEgc3VwcG9ydGVkIGZvcm1hdCwgYXMgdmVyaWZpZWQgcGVyIGNhbGwgdG8KLQkgKiBpY2QtPnRyeV9mbXQoKSwgZGF0YXdpZHRoIGlzIGZyb20gb3VyIHN1cHBvcnRlZCBmb3JtYXQgbGlzdAorCSAqIC50cnlfbWJ1c19mbXQoKSwgZGF0YXdpZHRoIGlzIGZyb20gb3VyIHN1cHBvcnRlZCBmb3JtYXQgbGlzdAogCSAqLwogCXN3aXRjaCAobWYtPmNvZGUpIHsKIAljYXNlIFY0TDJfTUJVU19GTVRfWThfMVg4OgpAQCAtNTAyLDIzNiArNDQ2LDEzMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbXQ5djAyMl9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiQW5hbG9nIEdhaW4iLAotCQkubWluaW11bQk9IDY0LAotCQkubWF4aW11bQk9IDEyNywKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSA2NCwKLQkJLmZsYWdzCQk9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUiwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9FWFBPU1VSRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkV4cG9zdXJlIiwKLQkJLm1pbmltdW0JPSAxLAotCQkubWF4aW11bQk9IDI1NSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAyNTUsCi0JCS5mbGFncwkJPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfQVVUT0dBSU4sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJBdXRvbWF0aWMgR2FpbiIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG9tYXRpYyBFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBtdDl2MDIyX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBtdDl2MDIyX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG10OXYwMjJfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBtdDl2MDIyX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtdDl2MDIyX2NvbnRyb2xzKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXQ5djAyMl9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgbXQ5djAyMl9nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3QgbXQ5djAyMiAqbXQ5djAyMiA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLAorCQkJCQkgICAgICAgc3RydWN0IG10OXYwMjIsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZtdDl2MDIyLT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CisJc3RydWN0IHY0bDJfY3RybCAqZ2FpbiA9IG10OXYwMjItPmdhaW47CisJc3RydWN0IHY0bDJfY3RybCAqZXhwID0gbXQ5djAyMi0+ZXhwb3N1cmU7CiAJdW5zaWduZWQgbG9uZyByYW5nZTsKIAlpbnQgZGF0YTsKIAotCXFjdHJsID0gc29jX2NhbWVyYV9maW5kX3FjdHJsKCZtdDl2MDIyX29wcywgY3RybC0+aWQpOwotCiAJc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfUkVBRF9NT0RFKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4MTApOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX1JFQURfTU9ERSk7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9ICEhKGRhdGEgJiAweDIwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX0FFQ19BR0NfRU5BQkxFKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIDB4MSk7Ci0JCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgMHgyKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgogCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX0FOQUxPR19HQUlOKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAKLQkJcmFuZ2UgPSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtOwotCQljdHJsLT52YWx1ZSA9ICgoZGF0YSAtIDE2KSAqIHJhbmdlICsgMjQpIC8gNDggKyBxY3RybC0+bWluaW11bTsKLQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQlyYW5nZSA9IGdhaW4tPm1heGltdW0gLSBnYWluLT5taW5pbXVtOworCQlnYWluLT52YWwgPSAoKGRhdGEgLSAxNikgKiByYW5nZSArIDI0KSAvIDQ4ICsgZ2Fpbi0+bWluaW11bTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX1RPVEFMX1NIVVRURVJfV0lEVEgpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyYW5nZSA9IHFjdHJsLT5tYXhpbXVtIC0gcWN0cmwtPm1pbmltdW07Ci0JCWN0cmwtPnZhbHVlID0gKChkYXRhIC0gMSkgKiByYW5nZSArIDIzOSkgLyA0NzkgKyBxY3RybC0+bWluaW11bTsKLQotCQlicmVhazsKKwkJcmFuZ2UgPSBleHAtPm1heGltdW0gLSBleHAtPm1pbmltdW07CisJCWV4cC0+dmFsID0gKChkYXRhIC0gMSkgKiByYW5nZSArIDIzOSkgLyA0NzkgKyBleHAtPm1pbmltdW07CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBtdDl2MDIyX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBtdDl2MDIyX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCWludCBkYXRhOworCXN0cnVjdCBtdDl2MDIyICptdDl2MDIyID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCSAgICAgICBzdHJ1Y3QgbXQ5djAyMiwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJm10OXYwMjItPnN1YmRldjsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKLQotCXFjdHJsID0gc29jX2NhbWVyYV9maW5kX3FjdHJsKCZtdDl2MDIyX29wcywgY3RybC0+aWQpOwotCWlmICghcWN0cmwpCi0JCXJldHVybiAtRUlOVkFMOworCWludCBkYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5VjAyMl9SRUFEX01PREUsIDB4MTApOwogCQllbHNlCiAJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9SRUFEX01PREUsIDB4MTApOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWlmIChjdHJsLT52YWx1ZSkKKwkJaWYgKGN0cmwtPnZhbCkKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgTVQ5VjAyMl9SRUFEX01PREUsIDB4MjApOwogCQllbHNlCiAJCQlkYXRhID0gcmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9SRUFEX01PREUsIDB4MjApOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQkvKiBtdDl2MDIyIGhhcyBtaW5pbXVtID09IGRlZmF1bHQgKi8KLQkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwgY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQlpZiAoY3RybC0+dmFsKSB7CisJCQlpZiAocmVnX3NldChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MikgPCAwKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgeworCQkJc3RydWN0IHY0bDJfY3RybCAqZ2FpbiA9IG10OXYwMjItPmdhaW47CisJCQkvKiBtdDl2MDIyIGhhcyBtaW5pbXVtID09IGRlZmF1bHQgKi8KKwkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBnYWluLT5tYXhpbXVtIC0gZ2Fpbi0+bWluaW11bTsKIAkJCS8qIFZhbGlkIHZhbHVlcyAxNiB0byA2NCwgMzIgdG8gNjQgbXVzdCBiZSBldmVuLiAqLwotCQkJdW5zaWduZWQgbG9uZyBnYWluID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5taW5pbXVtKSAqCisJCQl1bnNpZ25lZCBsb25nIGdhaW5fdmFsID0gKChnYWluLT52YWwgLSBnYWluLT5taW5pbXVtKSAqCiAJCQkJCSAgICAgIDQ4ICsgcmFuZ2UgLyAyKSAvIHJhbmdlICsgMTY7Ci0JCQlpZiAoZ2FpbiA+PSAzMikKLQkJCQlnYWluICY9IH4xOworCisJCQlpZiAoZ2Fpbl92YWwgPj0gMzIpCisJCQkJZ2Fpbl92YWwgJj0gfjE7CisKIAkJCS8qCiAJCQkgKiBUaGUgdXNlciB3YW50cyB0byBzZXQgZ2FpbiBtYW51YWxseSwgaG9wZSwgc2hlCiAJCQkgKiBrbm93cywgd2hhdCBzaGUncyBkb2luZy4uLiBTd2l0Y2ggQUdDIG9mZi4KIAkJCSAqLwotCiAJCQlpZiAocmVnX2NsZWFyKGNsaWVudCwgTVQ5VjAyMl9BRUNfQUdDX0VOQUJMRSwgMHgyKSA8IDApCiAJCQkJcmV0dXJuIC1FSU87CiAKIAkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBnYWluIGZyb20gJWQgdG8gJWx1XG4iLAotCQkJCXJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9BTkFMT0dfR0FJTiksIGdhaW4pOwotCQkJaWYgKHJlZ193cml0ZShjbGllbnQsIE1UOVYwMjJfQU5BTE9HX0dBSU4sIGdhaW4pIDwgMCkKKwkJCQlyZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQU5BTE9HX0dBSU4pLCBnYWluX3ZhbCk7CisJCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9BTkFMT0dfR0FJTiwgZ2Fpbl92YWwpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQkvKiBtdDl2MDIyIGhhcyBtYXhpbXVtID09IGRlZmF1bHQgKi8KLQkJaWYgKGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0gfHwgY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGxvbmcgcmFuZ2UgPSBxY3RybC0+bWF4aW11bSAtIHFjdHJsLT5taW5pbXVtOwotCQkJdW5zaWduZWQgbG9uZyBzaHV0dGVyID0gKChjdHJsLT52YWx1ZSAtIHFjdHJsLT5taW5pbXVtKSAqCi0JCQkJCQkgNDc5ICsgcmFuZ2UgLyAyKSAvIHJhbmdlICsgMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlpZiAoY3RybC0+dmFsID09IFY0TDJfRVhQT1NVUkVfQVVUTykgeworCQkJZGF0YSA9IHJlZ19zZXQoY2xpZW50LCBNVDlWMDIyX0FFQ19BR0NfRU5BQkxFLCAweDEpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHY0bDJfY3RybCAqZXhwID0gbXQ5djAyMi0+ZXhwb3N1cmU7CisJCQl1bnNpZ25lZCBsb25nIHJhbmdlID0gZXhwLT5tYXhpbXVtIC0gZXhwLT5taW5pbXVtOworCQkJdW5zaWduZWQgbG9uZyBzaHV0dGVyID0gKChleHAtPnZhbCAtIGV4cC0+bWluaW11bSkgKgorCQkJCQk0NzkgKyByYW5nZSAvIDIpIC8gcmFuZ2UgKyAxOworCiAJCQkvKgogCQkJICogVGhlIHVzZXIgd2FudHMgdG8gc2V0IHNodXR0ZXIgd2lkdGggbWFudWFsbHksIGhvcGUsCiAJCQkgKiBzaGUga25vd3MsIHdoYXQgc2hlJ3MgZG9pbmcuLi4gU3dpdGNoIEFFQyBvZmYuCiAJCQkgKi8KLQotCQkJaWYgKHJlZ19jbGVhcihjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MSkgPCAwKQorCQkJZGF0YSA9IHJlZ19jbGVhcihjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MSk7CisJCQlpZiAoZGF0YSA8IDApCiAJCQkJcmV0dXJuIC1FSU87Ci0KIAkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2h1dHRlciB3aWR0aCBmcm9tICVkIHRvICVsdVxuIiwKLQkJCQlyZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfVE9UQUxfU0hVVFRFUl9XSURUSCksCi0JCQkJc2h1dHRlcik7CisJCQkJCXJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9UT1RBTF9TSFVUVEVSX1dJRFRIKSwKKwkJCQkJc2h1dHRlcik7CiAJCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9UT1RBTF9TSFVUVEVSX1dJRFRILAotCQkJCSAgICAgIHNodXR0ZXIpIDwgMCkKKwkJCQkJCXNodXR0ZXIpIDwgMCkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQlkYXRhID0gcmVnX3NldChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4Mik7Ci0JCWVsc2UKLQkJCWRhdGEgPSByZWdfY2xlYXIoY2xpZW50LCBNVDlWMDIyX0FFQ19BR0NfRU5BQkxFLCAweDIpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQlkYXRhID0gcmVnX3NldChjbGllbnQsIE1UOVYwMjJfQUVDX0FHQ19FTkFCTEUsIDB4MSk7Ci0JCWVsc2UKLQkJCWRhdGEgPSByZWdfY2xlYXIoY2xpZW50LCBNVDlWMDIyX0FFQ19BR0NfRU5BQkxFLCAweDEpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyoKICAqIEludGVyZmFjZSBhY3RpdmUsIGNhbiB1c2UgaTJjLiBJZiBpdCBmYWlscywgaXQgY2FuIGluZGVlZCBtZWFuLCB0aGF0CiAgKiB0aGlzIHdhc24ndCBvdXIgY2FwdHVyZSBpbnRlcmZhY2UsIHNvLCB3ZSB3YWl0IGZvciB0aGUgcmlnaHQgb25lCiAgKi8KLXN0YXRpYyBpbnQgbXQ5djAyMl92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDl2MDIyX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSB0b19tdDl2MDIyKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCXMzMiBkYXRhOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qIFJlYWQgb3V0IHRoZSBjaGlwIHZlcnNpb24gcmVnaXN0ZXIgKi8KIAlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBNVDlWMDIyX0NISVBfVkVSU0lPTik7CiAKQEAgLTgwNSwxNiArNjQ0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBtdDl2MDIyX3ZpZGVvX3JlbW92ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCWRldl9kYmcoaWNkLT5wZGV2LCAiVmlkZW8gcmVtb3ZlZDogJXAsICVwXG4iLAotCQlpY2QtPnBhcmVudCwgaWNkLT52ZGV2KTsKLQlpZiAoaWNsLT5mcmVlX2J1cykKLQkJaWNsLT5mcmVlX2J1cyhpY2wpOwotfQotCiBzdGF0aWMgaW50IG10OXYwMjJfZ19za2lwX3RvcF9saW5lcyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgKmxpbmVzKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKQEAgLTgyNSw5ICs2NTQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIG10OXYwMjJfY3RybF9vcHMgPSB7CisJLmdfdm9sYXRpbGVfY3RybCA9IG10OXYwMjJfZ192b2xhdGlsZV9jdHJsLAorCS5zX2N0cmwgPSBtdDl2MDIyX3NfY3RybCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXQ5djAyMl9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJPSBtdDl2MDIyX2dfY3RybCwKLQkuc19jdHJsCQk9IG10OXYwMjJfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSBtdDl2MDIyX2dfY2hpcF9pZGVudCwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSBtdDl2MDIyX2dfcmVnaXN0ZXIsCkBAIC04NDgsNiArNjgwLDcyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXQ5djAyMl9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19NQVNURVIgfCBWNEwyX01CVVNfU0xBVkUgfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10OXYwMjJfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJc3RydWN0IG10OXYwMjIgKm10OXYwMjIgPSB0b19tdDl2MDIyKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCXVuc2lnbmVkIGludCBicHMgPSBzb2NfbWJ1c19nZXRfZm10ZGVzYyhtdDl2MDIyLT5mbXQtPmNvZGUpLT5iaXRzX3Blcl9zYW1wbGU7CisJaW50IHJldDsKKwl1MTYgcGl4Y2xrID0gMDsKKworCWlmIChpY2wtPnNldF9idXNfcGFyYW0pIHsKKwkJcmV0ID0gaWNsLT5zZXRfYnVzX3BhcmFtKGljbCwgMSA8PCAoYnBzIC0gMSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKGJwcyAhPSAxMCkgeworCQkvKgorCQkgKiBXaXRob3V0IGJvYXJkIHNwZWNpZmljIGJ1cyB3aWR0aCBzZXR0aW5ncyB3ZSBvbmx5IHN1cHBvcnQgdGhlCisJCSAqIHNlbnNvcnMgbmF0aXZlIGJ1cyB3aWR0aAorCQkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJCXBpeGNsayB8PSAweDEwOworCisJaWYgKCEoZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gpKQorCQlwaXhjbGsgfD0gMHgxOworCisJaWYgKCEoZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gpKQorCQlwaXhjbGsgfD0gMHgyOworCisJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgTVQ5VjAyMl9QSVhDTEtfRlZfTFYsIHBpeGNsayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIShmbGFncyAmIFY0TDJfTUJVU19NQVNURVIpKQorCQltdDl2MDIyLT5jaGlwX2NvbnRyb2wgJj0gfjB4ODsKKworCXJldCA9IHJlZ193cml0ZShjbGllbnQsIE1UOVYwMjJfQ0hJUF9DT05UUk9MLCBtdDl2MDIyLT5jaGlwX2NvbnRyb2wpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJDYWxjdWxhdGVkIHBpeGNsayAweCV4LCBjaGlwIGNvbnRyb2wgMHgleFxuIiwKKwkJcGl4Y2xrLCBtdDl2MDIyLT5jaGlwX2NvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG10OXYwMjJfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBtdDl2MDIyX3Nfc3RyZWFtLAogCS5zX21idXNfZm10CT0gbXQ5djAyMl9zX2ZtdCwKQEAgLTg1Nyw2ICs3NTUsOCBAQAogCS5nX2Nyb3AJCT0gbXQ5djAyMl9nX2Nyb3AsCiAJLmNyb3BjYXAJPSBtdDl2MDIyX2Nyb3BjYXAsCiAJLmVudW1fbWJ1c19mbXQJPSBtdDl2MDIyX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gbXQ5djAyMl9nX21idXNfY29uZmlnLAorCS5zX21idXNfY29uZmlnCT0gbXQ5djAyMl9zX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9zZW5zb3Jfb3BzIG10OXYwMjJfc3ViZGV2X3NlbnNvcl9vcHMgPSB7CkBAIC04NzMsMTcgKzc3MywxMCBAQAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IG10OXYwMjIgKm10OXYwMjI7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKIAlpbnQgcmV0OwogCi0JaWYgKCFpY2QpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNVDlWMDIyOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlpZiAoIWljbCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1UOVYwMjIgZHJpdmVyIG5lZWRzIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTkwMCwxMCArNzkzLDM5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJm10OXYwMjItPnN1YmRldiwgY2xpZW50LCAmbXQ5djAyMl9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZtdDl2MDIyLT5oZGwsIDYpOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl2MDIyLT5oZGwsICZtdDl2MDIyX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfVkZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZtdDl2MDIyLT5oZGwsICZtdDl2MDIyX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCW10OXYwMjItPmF1dG9nYWluID0gdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMjItPmhkbCwgJm10OXYwMjJfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9BVVRPR0FJTiwgMCwgMSwgMSwgMSk7CisJbXQ5djAyMi0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKCZtdDl2MDIyLT5oZGwsICZtdDl2MDIyX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMTI3LCAxLCA2NCk7CisKKwkvKgorCSAqIFNpbXVsYXRlZCBhdXRvZXhwb3N1cmUuIElmIGVuYWJsZWQsIHdlIGNhbGN1bGF0ZSBzaHV0dGVyIHdpZHRoCisJICogb3Vyc2VsdmVzIGluIHRoZSBkcml2ZXIgYmFzZWQgb24gdmVydGljYWwgYmxhbmtpbmcgYW5kIGZyYW1lIHdpZHRoCisJICovCisJbXQ5djAyMi0+YXV0b2V4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGRfbWVudSgmbXQ5djAyMi0+aGRsLAorCQkJJm10OXYwMjJfY3RybF9vcHMsIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sIDEsIDAsCisJCQlWNEwyX0VYUE9TVVJFX0FVVE8pOworCW10OXYwMjItPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoJm10OXYwMjItPmhkbCwgJm10OXYwMjJfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMSwgMjU1LCAxLCAyNTUpOworCisJbXQ5djAyMi0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZtdDl2MDIyLT5oZGw7CisJaWYgKG10OXYwMjItPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gbXQ5djAyMi0+aGRsLmVycm9yOworCisJCWtmcmVlKG10OXYwMjIpOworCQlyZXR1cm4gZXJyOworCX0KKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZtdDl2MDIyLT5hdXRvZXhwb3N1cmUsCisJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIHRydWUpOworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJm10OXYwMjItPmF1dG9nYWluLCAwLCB0cnVlKTsKIAogCW10OXYwMjItPmNoaXBfY29udHJvbCA9IE1UOVYwMjJfQ0hJUF9DT05UUk9MX0RFRkFVTFQ7CiAKLQlpY2QtPm9wcwkJPSAmbXQ5djAyMl9vcHM7CiAJLyoKIAkgKiBNVDlWMDIyIF9yZWFsbHlfIGNvcnJ1cHRzIHRoZSBmaXJzdCByZWFkIG91dCBsaW5lLgogCSAqIFRPRE86IHZlcmlmeSBvbiBpLk1YMzEKQEAgLTkxNCw5ICs4MzYsOSBAQAogCW10OXYwMjItPnJlY3Qud2lkdGgJPSBNVDlWMDIyX01BWF9XSURUSDsKIAltdDl2MDIyLT5yZWN0LmhlaWdodAk9IE1UOVYwMjJfTUFYX0hFSUdIVDsKIAotCXJldCA9IG10OXYwMjJfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG10OXYwMjJfdmlkZW9fcHJvYmUoY2xpZW50KTsKIAlpZiAocmV0KSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmbXQ5djAyMi0+aGRsKTsKIAkJa2ZyZWUobXQ5djAyMik7CiAJfQogCkBAIC05MjYsMTAgKzg0OCwxMiBAQAogc3RhdGljIGludCBtdDl2MDIyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBtdDl2MDIyICptdDl2MDIyID0gdG9fbXQ5djAyMihjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAKLQlpY2QtPm9wcyA9IE5VTEw7Ci0JbXQ5djAyMl92aWRlb19yZW1vdmUoaWNkKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmbXQ5djAyMi0+c3ViZGV2KTsKKwlpZiAoaWNsLT5mcmVlX2J1cykKKwkJaWNsLT5mcmVlX2J1cyhpY2wpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJm10OXYwMjItPmhkbCk7CiAJa2ZyZWUobXQ5djAyMik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKaW5kZXggYzY0ZTFkYy4uZjA4MGMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvbXQ5djAzMi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKaW5kZXggMDg3ZGIxMi4uMThlOTRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKQEAgLTc4LDExICs3OCwxMCBAQAogI2RlZmluZSBDU0lfSVJRX01BU0sJKENTSVNSX1NGRl9PUl9JTlQgfCBDU0lTUl9SRkZfT1JfSU5UIHwgXAogCQkJQ1NJU1JfU1RBVEZGX0lOVCB8IENTSVNSX1JYRkZfSU5UIHwgQ1NJU1JfU09GX0lOVCkKIAotI2RlZmluZSBDU0lfQlVTX0ZMQUdTCShTT0NBTV9NQVNURVIgfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFwKLQkJCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8IFwKLQkJCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfCBcCi0JCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgU09DQU1fREFUQV9BQ1RJVkVfTE9XIHwgXAotCQkJU09DQU1fREFUQVdJRFRIXzgpCisjZGVmaW5lIENTSV9CVVNfRkxBR1MJKFY0TDJfTUJVU19NQVNURVIgfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBcCisJCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyB8IFwKKwkJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8IFwKKwkJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVykKIAogI2RlZmluZSBNQVhfVklERU9fTUVNIDE2CS8qIFZpZGVvIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMgKi8KIApAQCAtNDkwLDU5ICs0ODksNzMgQEAKIAogc3RhdGljIGludCBteDFfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKIAl1bnNpZ25lZCBpbnQgY3NpY3IxOwogCWludCByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7Ci0KIAkvKiBNWDEgc3VwcG9ydHMgb25seSA4Yml0IGJ1c3dpZHRoICovCi0JY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsCi0JCQkJCQkgICAgICAgQ1NJX0JVU19GTEFHUyk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLCBDU0lfQlVTX0ZMQUdTKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCV4XG4iLAorCQkJCSBjZmcuZmxhZ3MsIENTSV9CVVNfRkxBR1MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQljb21tb25fZmxhZ3MgPSBDU0lfQlVTX0ZMQUdTOworCX0KIAogCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gY2hvaWNlICovCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkgJiYKLQkJKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gpICYmCisJCShjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVykpIHsKIAkJCWlmICghcGNkZXYtPnBkYXRhIHx8CiAJCQkgICAgIHBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBNWDFfQ0FNRVJBX1ZTWU5DX0hJR0gpCi0JCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCQkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1c7CiAJCQllbHNlCi0JCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfSElHSDsKKwkJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkJKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCQkoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CiAJCQlpZiAoIXBjZGV2LT5wZGF0YSB8fAogCQkJICAgICBwY2Rldi0+cGRhdGEtPmZsYWdzICYgTVgxX0NBTUVSQV9QQ0xLX1JJU0lORykKLQkJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKIAkJCWVsc2UKLQkJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKKwkJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CiAJfQogCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBX0FDVElWRV9ISUdIKSAmJgotCQkoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQV9BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gpICYmCisJCShjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XKSkgewogCQkJaWYgKCFwY2Rldi0+cGRhdGEgfHwKIAkJCSAgICAgcGNkZXYtPnBkYXRhLT5mbGFncyAmIE1YMV9DQU1FUkFfREFUQV9ISUdIKQotCQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fREFUQV9BQ1RJVkVfTE9XOworCQkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVzsKIAkJCWVsc2UKLQkJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7CisJCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKIAl9CiAKLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjYW1lcmEgc19tYnVzX2NvbmZpZygweCVseCkgcmV0dXJuZWQgJWRcbiIsCisJCQljb21tb25fZmxhZ3MsIHJldCk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJY3NpY3IxID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDU0lDUjEpOwogCi0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykKIAkJY3NpY3IxIHw9IENTSUNSMV9SRURHRTsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkKIAkJY3NpY3IxIHw9IENTSUNSMV9TT0ZfUE9MOwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBX0FDVElWRV9MT1cpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1cpCiAJCWNzaWNyMSB8PSBDU0lDUjFfREFUQV9QT0w7CiAKIAlfX3Jhd193cml0ZWwoY3NpY3IxLCBwY2Rldi0+YmFzZSArIENTSUNSMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Ml9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jCmluZGV4IGVjMjQxMGMuLmE4MDNkOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jCkBAIC02ODYsMTYgKzY4NiwxNSBAQAogCQkJaWNkLCAmaWNkLT52aWRlb19sb2NrKTsKIH0KIAotI2RlZmluZSBNWDJfQlVTX0ZMQUdTCShTT0NBTV9EQVRBV0lEVEhfOCB8IFwKLQkJCVNPQ0FNX01BU1RFUiB8IFwKLQkJCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgXAotCQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8IFwKLQkJCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgXAotCQkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8IFwKLQkJCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFwKLQkJCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfCBcCi0JCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwgXAotCQkJU09DQU1fREFUQV9BQ1RJVkVfTE9XKQorI2RlZmluZSBNWDJfQlVTX0ZMQUdTCShWNEwyX01CVVNfTUFTVEVSIHwgXAorCQkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgXAorCQkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfCBcCisJCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBcCisJCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8IFwKKwkJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBcCisJCQlWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8IFwKKwkJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIIHwgXAorCQkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVykKIAogc3RhdGljIGludCBteDI3X2NhbWVyYV9lbW1hX3BycF9yZXNldChzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2KQogewpAQCAtNzcwLDQ2ICs3NjksNTkgQEAKIHN0YXRpYyBpbnQgbXgyX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQlfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKKwlpbnQgcmV0OwogCWludCBieXRlc3BlcmxpbmU7CiAJdTMyIGNzaWNyMSA9IHBjZGV2LT5jc2ljcjE7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7Ci0KLQljb21tb25fZmxhZ3MgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKLQkJCQlNWDJfQlVTX0ZMQUdTKTsKLQlpZiAoIWNvbW1vbl9mbGFncykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKLQkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfSFNZTkNfSElHSCkKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKLQkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfSElHSDsKLQl9Ci0KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7Ci0JCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBNWDJfQ0FNRVJBX1BDTEtfU0FNUExFX1JJU0lORykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKLQkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkc7Ci0JfQotCi0JcmV0ID0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBjb21tb25fZmxhZ3MpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLCBNWDJfQlVTX0ZMQUdTKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCV4XG4iLAorCQkJCSBjZmcuZmxhZ3MsIE1YMl9CVVNfRkxBR1MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKIAkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQljb21tb25fZmxhZ3MgPSBNWDJfQlVTX0ZMQUdTOworCX0KIAotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpCisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykpIHsKKwkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfSFNZTkNfSElHSCkKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1c7CisJCWVsc2UKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIOworCX0KKworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgeworCQlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgTVgyX0NBTUVSQV9QQ0xLX1NBTVBMRV9SSVNJTkcpCisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkc7CisJfQorCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjYW1lcmEgc19tYnVzX2NvbmZpZygweCVseCkgcmV0dXJuZWQgJWRcbiIsCisJCQljb21tb25fZmxhZ3MsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcpCiAJCWNzaWNyMSB8PSBDU0lDUjFfUkVER0U7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gpCiAJCWNzaWNyMSB8PSBDU0lDUjFfU09GX1BPTDsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpCisJaWYgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkKIAkJY3NpY3IxIHw9IENTSUNSMV9IU1lOQ19QT0w7CiAJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIE1YMl9DQU1FUkFfU1dBUDE2KQogCQljc2ljcjEgfD0gQ1NJQ1IxX1NXQVAxNl9FTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKaW5kZXggYzA0NWI0Ny4uZjk2ZjkyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKQEAgLTEwOSwxMCArMTA5LDEyIEBACiAKIAl1bnNpZ25lZCBsb25nCQlwbGF0Zm9ybV9mbGFnczsKIAl1bnNpZ25lZCBsb25nCQltY2xrOworCXUxNgkJCXdpZHRoX2ZsYWdzOwkvKiBtYXggMTUgYml0cyAqLwogCiAJc3RydWN0IGxpc3RfaGVhZAljYXB0dXJlOwogCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBQcm90ZWN0cyB2aWRlbyBidWZmZXIgbGlzdHMgKi8KIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmFjdGl2ZTsKKwlzaXplX3QJCQlidWZfdG90YWw7CiAJc3RydWN0IHZiMl9hbGxvY19jdHgJKmFsbG9jX2N0eDsKIAllbnVtIHY0bDJfZmllbGQJCWZpZWxkOwogCWludAkJCXNlcXVlbmNlOwpAQCAtMTkwLDc5ICsxOTIsNTMgQEAKICAqIENhbGN1bGF0ZSB0aGUgX19idWZmZXJfXyAobm90IGRhdGEpIHNpemUgYW5kIG51bWJlciBvZiBidWZmZXJzLgogICovCiBzdGF0aWMgaW50IG14M192aWRlb2J1Zl9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAogCQkJdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAotCQkJdW5zaWduZWQgbG9uZyBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCisJCQl1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodnEpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwotCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKLQkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKLQotCWlmIChieXRlc19wZXJfbGluZSA8IDApCi0JCXJldHVybiBieXRlc19wZXJfbGluZTsKKwlpbnQgYnl0ZXNfcGVyX2xpbmU7CisJdW5zaWduZWQgaW50IGhlaWdodDsKIAogCWlmICghbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqbnVtX3BsYW5lcyA9IDE7Ci0KLQlteDNfY2FtLT5zZXF1ZW5jZSA9IDA7Ci0Jc2l6ZXNbMF0gPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7Ci0JYWxsb2NfY3R4c1swXSA9IG14M19jYW0tPmFsbG9jX2N0eDsKLQotCWlmICghKmNvdW50KQotCQkqY291bnQgPSAzMjsKLQotCWlmIChzaXplc1swXSAqICpjb3VudCA+IE1BWF9WSURFT19NRU0gKiAxMDI0ICogMTAyNCkKLQkJKmNvdW50ID0gTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0IC8gc2l6ZXNbMF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteDNfdmlkZW9idWZfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwotCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKLQlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWY7Ci0Jc2l6ZV90IG5ld19zaXplOwotCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwlpZiAoZm10KSB7CisJCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsCisJCQkJCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJCWlmICgheGxhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShmbXQtPmZtdC5waXgud2lkdGgsCisJCQkJCQkJIHhsYXRlLT5ob3N0X2ZtdCk7CisJCWhlaWdodCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJLyogQ2FsbGVkIGZyb20gVklESU9DX1JFUUJVRlMgb3IgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJCWJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAogCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwotCisJCWhlaWdodCA9IGljZC0+dXNlcl9oZWlnaHQ7CisJfQogCWlmIChieXRlc19wZXJfbGluZSA8IDApCiAJCXJldHVybiBieXRlc19wZXJfbGluZTsKIAotCWJ1ZiA9IHRvX214M192Yih2Yik7Ci0Jc2cgPSAmYnVmLT5zZzsKKwlzaXplc1swXSA9IGJ5dGVzX3Blcl9saW5lICogaGVpZ2h0OwogCi0JbmV3X3NpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CisJYWxsb2NfY3R4c1swXSA9IG14M19jYW0tPmFsbG9jX2N0eDsKIAotCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBuZXdfc2l6ZSkgewotCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJXp1KVxuIiwKLQkJCXZiMl9wbGFuZV9zaXplKHZiLCAwKSwgbmV3X3NpemUpOwotCQlyZXR1cm4gLUVOT0JVRlM7Ci0JfQorCWlmICghdnEtPm51bV9idWZmZXJzKQorCQlteDNfY2FtLT5zZXF1ZW5jZSA9IDA7CiAKLQlpZiAoYnVmLT5zdGF0ZSA9PSBDU0lfQlVGX05FRURTX0lOSVQpIHsKLQkJc2dfZG1hX2FkZHJlc3Moc2cpCT0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOwotCQlzZ19kbWFfbGVuKHNnKQkJPSBuZXdfc2l6ZTsKKwlpZiAoISpjb3VudCkKKwkJKmNvdW50ID0gMjsKIAotCQlidWYtPnR4ZCA9IGljaGFuLT5kbWFfY2hhbi5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKAotCQkJJmljaGFuLT5kbWFfY2hhbiwgc2csIDEsIERNQV9GUk9NX0RFVklDRSwKLQkJCURNQV9QUkVQX0lOVEVSUlVQVCk7Ci0JCWlmICghYnVmLT50eGQpCi0JCQlyZXR1cm4gLUVJTzsKKwkvKiBJZiAqbnVtX3BsYW5lcyAhPSAwLCB3ZSBoYXZlIGFscmVhZHkgdmVyaWZpZWQgKmNvdW50LiAqLworCWlmICghKm51bV9wbGFuZXMgJiYKKwkgICAgc2l6ZXNbMF0gKiAqY291bnQgKyBteDNfY2FtLT5idWZfdG90YWwgPiBNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQpCisJCSpjb3VudCA9IChNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQgLSBteDNfY2FtLT5idWZfdG90YWwpIC8KKwkJCXNpemVzWzBdOwogCi0JCWJ1Zi0+dHhkLT5jYWxsYmFja19wYXJhbQk9IGJ1Zi0+dHhkOwotCQlidWYtPnR4ZC0+Y2FsbGJhY2sJCT0gbXgzX2NhbV9kbWFfZG9uZTsKLQotCQlidWYtPnN0YXRlID0gQ1NJX0JVRl9QUkVQQVJFRDsKLQl9Ci0KLQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIG5ld19zaXplKTsKKwkqbnVtX3BsYW5lcyA9IDE7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NiwyOCArMjYyLDU4IEBACiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gYnVmLT50eGQ7Ci0Jc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gdG9faWRtYWNfY2hhbih0eGQtPmNoYW4pOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmYnVmLT5zZzsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZDsKKwlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwogCXN0cnVjdCBpZG1hY192aWRlb19wYXJhbSAqdmlkZW8gPSAmaWNoYW4tPnBhcmFtcy52aWRlbzsKLQlkbWFfY29va2llX3QgY29va2llOwotCXUzMiBmb3VyY2MgPSBpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjOworCWNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCAqaG9zdF9mbXQgPSBpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdDsKKwlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsIGhvc3RfZm10KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9jb29raWVfdCBjb29raWU7CisJc2l6ZV90IG5ld19zaXplOworCisJQlVHX09OKGJ5dGVzX3Blcl9saW5lIDw9IDApOworCisJbmV3X3NpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CisKKwlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgbmV3X3NpemUpIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkJ1ZmZlciAjJWQgdG9vIHNtYWxsICglbHUgPCAlenUpXG4iLAorCQkJdmItPnY0bDJfYnVmLmluZGV4LCB2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIG5ld19zaXplKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoYnVmLT5zdGF0ZSA9PSBDU0lfQlVGX05FRURTX0lOSVQpIHsKKwkJc2dfZG1hX2FkZHJlc3Moc2cpCT0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOworCQlzZ19kbWFfbGVuKHNnKQkJPSBuZXdfc2l6ZTsKKworCQl0eGQgPSBpY2hhbi0+ZG1hX2NoYW4uZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZygKKwkJCSZpY2hhbi0+ZG1hX2NoYW4sIHNnLCAxLCBETUFfRlJPTV9ERVZJQ0UsCisJCQlETUFfUFJFUF9JTlRFUlJVUFQpOworCQlpZiAoIXR4ZCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJdHhkLT5jYWxsYmFja19wYXJhbQk9IHR4ZDsKKwkJdHhkLT5jYWxsYmFjawkJPSBteDNfY2FtX2RtYV9kb25lOworCisJCWJ1Zi0+c3RhdGUJCT0gQ1NJX0JVRl9QUkVQQVJFRDsKKwkJYnVmLT50eGQJCT0gdHhkOworCX0gZWxzZSB7CisJCXR4ZCA9IGJ1Zi0+dHhkOworCX0KKworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgbmV3X3NpemUpOwogCiAJLyogVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBvZiBvbmUgc2ctZWxlbWVudCAqLwotCXZpZGVvLT5vdXRfcGl4ZWxfZm10CT0gZm91cmNjX3RvX2lwdV9waXgoZm91cmNjKTsKKwl2aWRlby0+b3V0X3BpeGVsX2ZtdCA9IGZvdXJjY190b19pcHVfcGl4KGhvc3RfZm10LT5mb3VyY2MpOwogCiAJaWYgKHZpZGVvLT5vdXRfcGl4ZWxfZm10ID09IElQVV9QSVhfRk1UX0dFTkVSSUMpIHsKIAkJLyoKLQkJICogSWYgdGhlIElQVSBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIHRvIHRyYW5zcG9ydAotCQkgKiBnZW5lcmljIDgtYml0IGRhdGEsIHdlIGhhdmUgdG8gc2V0IHVwIGNvcnJlY3RseSB0aGUKLQkJICogZ2VvbWV0cnkgcGFyYW1ldGVycyB1cG9uIHRoZSBjdXJyZW50IHBpeGVsIGZvcm1hdC4KLQkJICogU28sIHNpbmNlIHRoZSBETUEgaG9yaXpvbnRhbCBwYXJhbWV0ZXJzIGFyZSBleHByZXNzZWQKLQkJICogaW4gYnl0ZXMgbm90IHBpeGVscywgY29udmVydCB0aGVzZSBpbiB0aGUgcmlnaHQgdW5pdC4KKwkJICogSWYgdGhlIElQVSBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIHRvIHRyYW5zZmVyIGdlbmVyaWMKKwkJICogOC1iaXQgZGF0YSwgd2UgaGF2ZSB0byBzZXQgdXAgdGhlIGdlb21ldHJ5IHBhcmFtZXRlcnMKKwkJICogY29ycmVjdGx5LCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGl4ZWwgZm9ybWF0LiBUaGUgRE1BCisJCSAqIGhvcml6b250YWwgcGFyYW1ldGVycyBpbiB0aGlzIGNhc2UgYXJlIGV4cHJlc3NlZCBpbiBieXRlcywKKwkJICogbm90IGluIHBpeGVscy4KIAkJICovCi0JCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKLQkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKLQkJQlVHX09OKGJ5dGVzX3Blcl9saW5lIDw9IDApOwotCiAJCXZpZGVvLT5vdXRfd2lkdGgJPSBieXRlc19wZXJfbGluZTsKIAkJdmlkZW8tPm91dF9oZWlnaHQJPSBpY2QtPnVzZXJfaGVpZ2h0OwogCQl2aWRlby0+b3V0X3N0cmlkZQk9IGJ5dGVzX3Blcl9saW5lOwpAQCAtMzUxLDYgKzM1Nyw3IEBACiAJCW14M19jYW0tPmFjdGl2ZSA9IE5VTEw7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZteDNfY2FtLT5sb2NrLCBmbGFncyk7CitlcnJvcjoKIAl2YjJfYnVmZmVyX2RvbmUodmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOwogfQogCkBAIC0zODQsMTcgKzM5MSwyNCBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm14M19jYW0tPmxvY2ssIGZsYWdzKTsKKworCW14M19jYW0tPmJ1Zl90b3RhbCAtPSB2YjJfcGxhbmVfc2l6ZSh2YiwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbXgzX3ZpZGVvYnVmX2luaXQoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogeworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOworCiAJLyogVGhpcyBpcyBmb3IgbG9ja2luZyBkZWJ1Z2dpbmcgb25seSAqLwogCUlOSVRfTElTVF9IRUFEKCZidWYtPnF1ZXVlKTsKIAlzZ19pbml0X3RhYmxlKCZidWYtPnNnLCAxKTsKIAogCWJ1Zi0+c3RhdGUgPSBDU0lfQlVGX05FRURTX0lOSVQ7Ci0JYnVmLT50eGQgPSBOVUxMOworCisJbXgzX2NhbS0+YnVmX3RvdGFsICs9IHZiMl9wbGFuZV9zaXplKHZiLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDA1LDEzICs0MTksMTIgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZiwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGljaGFuKSB7Ci0JCWNoYW4gPSAmaWNoYW4tPmRtYV9jaGFuOwotCQljaGFuLT5kZXZpY2UtPmRldmljZV9jb250cm9sKGNoYW4sIERNQV9URVJNSU5BVEVfQUxMLCAwKTsKKwkJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gJmljaGFuLT5kbWFfY2hhbjsKKwkJY2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbChjaGFuLCBETUFfUEFVU0UsIDApOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZteDNfY2FtLT5sb2NrLCBmbGFncyk7CkBAIC00MTksOCArNDMyLDggQEAKIAlteDNfY2FtLT5hY3RpdmUgPSBOVUxMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgdG1wLCAmbXgzX2NhbS0+Y2FwdHVyZSwgcXVldWUpIHsKLQkJYnVmLT5zdGF0ZSA9IENTSV9CVUZfTkVFRFNfSU5JVDsKIAkJbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXgzX2NhbS0+bG9jaywgZmxhZ3MpOwpAQCAtNDMwLDcgKzQ0Myw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmIyX29wcyBteDNfdmlkZW9idWZfb3BzID0gewogCS5xdWV1ZV9zZXR1cAk9IG14M192aWRlb2J1Zl9zZXR1cCwKLQkuYnVmX3ByZXBhcmUJPSBteDNfdmlkZW9idWZfcHJlcGFyZSwKIAkuYnVmX3F1ZXVlCT0gbXgzX3ZpZGVvYnVmX3F1ZXVlLAogCS5idWZfY2xlYW51cAk9IG14M192aWRlb2J1Zl9yZWxlYXNlLAogCS5idWZfaW5pdAk9IG14M192aWRlb2J1Zl9pbml0LApAQCAtNTE0LDYgKzUyNiw3IEBACiAKIAlteDNfY2FtZXJhX2FjdGl2YXRlKG14M19jYW0sIGljZCk7CiAKKwlteDNfY2FtLT5idWZfdG90YWwgPSAwOwogCW14M19jYW0tPmljZCA9IGljZDsKIAogCWRldl9pbmZvKGljZC0+cGFyZW50LCAiTVgzIENhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLApAQCAtNTQ4LDU4ICs1NjEsMjcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAkvKgorCSAqIElmIHJlcXVlc3RlZCBkYXRhIHdpZHRoIGlzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0sIHVzZSBpdCBvciBhbnkKKwkgKiBwb3NzaWJsZSBsb3dlciB2YWx1ZSAtIGkuTVgzMSBpcyBzbWFydCBlbm91Z2ggdG8gc2hpZnQgYml0cworCSAqLworCWlmIChidXN3aWR0aCA+IGZscyhteDNfY2FtLT53aWR0aF9mbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKIAkgKiBQbGF0Zm9ybSBzcGVjaWZpZWQgc3luY2hyb25pemF0aW9uIGFuZCBwaXhlbCBjbG9jayBwb2xhcml0aWVzIGFyZQogCSAqIG9ubHkgYSByZWNvbW1lbmRhdGlvbiBhbmQgYXJlIG9ubHkgdXNlZCBkdXJpbmcgcHJvYmluZy4gTVgzeAogCSAqIGNhbWVyYSBpbnRlcmZhY2Ugb25seSB3b3JrcyBpbiBtYXN0ZXIgbW9kZSwgaS5lLiwgdXNlcyBIU1lOQyBhbmQKIAkgKiBWU1lOQyBzaWduYWxzIGZyb20gdGhlIHNlbnNvcgogCSAqLwotCSpmbGFncyA9IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfTE9XOwotCi0JLyoKLQkgKiBJZiByZXF1ZXN0ZWQgZGF0YSB3aWR0aCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCB1c2UgaXQgb3IgYW55Ci0JICogcG9zc2libGUgbG93ZXIgdmFsdWUgLSBpLk1YMzEgaXMgc21hcnQgZW5vdWdoIHRvIHNjaGlmdCBiaXRzCi0JICovCi0JaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfMTUpCi0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTUgfCBTT0NBTV9EQVRBV0lEVEhfMTAgfAotCQkJU09DQU1fREFUQVdJRFRIXzggfCBTT0NBTV9EQVRBV0lEVEhfNDsKLQllbHNlIGlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfREFUQVdJRFRIXzEwKQotCQkqZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzEwIHwgU09DQU1fREFUQVdJRFRIXzggfAotCQkJU09DQU1fREFUQVdJRFRIXzQ7Ci0JZWxzZSBpZiAobXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgJiBNWDNfQ0FNRVJBX0RBVEFXSURUSF84KQotCQkqZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzggfCBTT0NBTV9EQVRBV0lEVEhfNDsKLQllbHNlIGlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfREFUQVdJRFRIXzQpCi0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfNDsKLQotCXN3aXRjaCAoYnVzd2lkdGgpIHsKLQljYXNlIDE1OgotCQlpZiAoISgqZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfMTUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCWlmICghKCpmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF8xMCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlpZiAoISgqZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfOCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoISgqZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfNCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4obXgzX2NhbS0+c29jX2hvc3QudjRsMl9kZXYuZGV2LAotCQkJICJVbnN1cHBvcnRlZCBidXMgd2lkdGggJWRcbiIsIGJ1c3dpZHRoKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCSpmbGFncyA9IFY0TDJfTUJVU19NQVNURVIgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDcsOSArNTg5LDExIEBACiBzdGF0aWMgaW50IG14M19jYW1lcmFfdHJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkgICAgY29uc3QgdW5zaWduZWQgaW50IGRlcHRoKQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwotCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3M7CisJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMLH07CisJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShteDNfY2FtLCBkZXB0aCwgJmJ1c19mbGFncyk7CiAKIAlkZXZfZGJnKGljZC0+cGFyZW50LCAicmVxdWVzdCBidXMgd2lkdGggJWQgYml0OiAlZFxuIiwgZGVwdGgsIHJldCk7CkBAIC02MTcsMTUgKzYwMSwyMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgYnVzX2ZsYWdzKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCVseFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBidXNfZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHJldDsKKwl9CiAKLQlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCi0JCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhICVseCwgaG9zdCAlbHhcbiIsCi0JCQkgY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGJvb2wgY2hhbl9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICphcmcpCkBAIC05OTQsOSArOTg0LDExIEBACiAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBfX3UzMiBwaXhmbXQpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3M7CiAJdTMyIGR3LCBzZW5zX2NvbmY7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CiAJaW50IGJ1c3dpZHRoOwpAQCAtMTAwOCw4MyArMTAwMCw3NiBAQAogCWlmICghZm10KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWJ1c3dpZHRoID0gZm10LT5iaXRzX3Blcl9zYW1wbGU7Ci0JcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShteDNfY2FtLCBidXN3aWR0aCwgJmJ1c19mbGFncyk7Ci0KIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKIAlpZiAoIXhsYXRlKSB7CiAJCWRldl93YXJuKGRldiwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWJ1c3dpZHRoID0gZm10LT5iaXRzX3Blcl9zYW1wbGU7CisJcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShteDNfY2FtLCBidXN3aWR0aCwgJmJ1c19mbGFncyk7CisKIAlkZXZfZGJnKGRldiwgInJlcXVlc3RlZCBidXMgd2lkdGggJWQgYml0OiAlZFxuIiwgYnVzd2lkdGgsIHJldCk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOwotCWRldl9kYmcoZGV2LCAiRmxhZ3MgY2FtOiAweCVseCBob3N0OiAweCVseCBjb21tb246IDB4JWx4XG4iLAotCQljYW1lcmFfZmxhZ3MsIGJ1c19mbGFncywgY29tbW9uX2ZsYWdzKTsKLQlpZiAoIWNvbW1vbl9mbGFncykgewotCQlkZXZfZGJnKGRldiwgIm5vIGNvbW1vbiBmbGFncyIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKCFyZXQpIHsKKwkJY29tbW9uX2ZsYWdzID0gc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUoJmNmZywKKwkJCQkJCQkgIGJ1c19mbGFncyk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHglbHhcbiIsCisJCQkJIGNmZy5mbGFncywgYnVzX2ZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJY29tbW9uX2ZsYWdzID0gYnVzX2ZsYWdzOwogCX0KIAorCWRldl9kYmcoZGV2LCAiRmxhZ3MgY2FtOiAweCV4IGhvc3Q6IDB4JWx4IGNvbW1vbjogMHglbHhcbiIsCisJCWNmZy5mbGFncywgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3MpOworCiAJLyogTWFrZSBjaG9pY2VzLCBiYXNlZCBvbiBwbGF0Zm9ybSBwcmVmZXJlbmNlcyAqLwotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpKSB7CiAJCWlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfSFNQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpKSB7CiAJCWlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfVlNQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQV9BQ1RJVkVfSElHSCkgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0RBVEFfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVykpIHsKIAkJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EUCkKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fREFUQV9BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CiAJCWVsc2UKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fREFUQV9BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykpIHsKIAkJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9QQ1ApCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORzsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKIAl9CiAKLQkvKgotCSAqIE1ha2UgdGhlIGNhbWVyYSB3b3JrIGluIHdpZGVzdCBjb21tb24gbW9kZSwgd2UnbGwgdGFrZSBjYXJlIG9mCi0JICogdGhlIHJlc3QKLQkgKi8KLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQVdJRFRIXzE1KQotCQljb21tb25fZmxhZ3MgPSAoY29tbW9uX2ZsYWdzICYgflNPQ0FNX0RBVEFXSURUSF9NQVNLKSB8Ci0JCQlTT0NBTV9EQVRBV0lEVEhfMTU7Ci0JZWxzZSBpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQVdJRFRIXzEwKQotCQljb21tb25fZmxhZ3MgPSAoY29tbW9uX2ZsYWdzICYgflNPQ0FNX0RBVEFXSURUSF9NQVNLKSB8Ci0JCQlTT0NBTV9EQVRBV0lEVEhfMTA7Ci0JZWxzZSBpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQVdJRFRIXzgpCi0JCWNvbW1vbl9mbGFncyA9IChjb21tb25fZmxhZ3MgJiB+U09DQU1fREFUQVdJRFRIX01BU0spIHwKLQkJCVNPQ0FNX0RBVEFXSURUSF84OwotCWVsc2UKLQkJY29tbW9uX2ZsYWdzID0gKGNvbW1vbl9mbGFncyAmIH5TT0NBTV9EQVRBV0lEVEhfTUFTSykgfAotCQkJU09DQU1fREFUQVdJRFRIXzQ7Ci0KLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2RiZyhkZXYsICJjYW1lcmEgc2V0X2J1c19wYXJhbSglbHgpIHJldHVybmVkICVkXG4iLAorCWNmZy5mbGFncyA9IGNvbW1vbl9mbGFnczsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlkZXZfZGJnKGRldiwgImNhbWVyYSBzX21idXNfY29uZmlnKDB4JWx4KSByZXR1cm5lZCAlZFxuIiwKIAkJCWNvbW1vbl9mbGFncywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMTA4LDEzICsxMDkzLDEzIEBACiAJLyogVGhpcyBoYXMgYmVlbiBzZXQgaW4gbXgzX2NhbWVyYV9hY3RpdmF0ZSgpLCBidXQgd2UgY2xlYXIgaXQgYWJvdmUgKi8KIAlzZW5zX2NvbmYgfD0gQ1NJX1NFTlNfQ09ORl9EQVRBX0ZNVF9CQVlFUjsKIAotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykKIAkJc2Vuc19jb25mIHw9IDEgPDwgQ1NJX1NFTlNfQ09ORl9QSVhfQ0xLX1BPTF9TSElGVDsKLQlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCiAJCXNlbnNfY29uZiB8PSAxIDw8IENTSV9TRU5TX0NPTkZfSFNZTkNfUE9MX1NISUZUOwotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKQorCWlmIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVykKIAkJc2Vuc19jb25mIHw9IDEgPDwgQ1NJX1NFTlNfQ09ORl9WU1lOQ19QT0xfU0hJRlQ7Ci0JaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0RBVEFfQUNUSVZFX0xPVykKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVykKIAkJc2Vuc19jb25mIHw9IDEgPDwgQ1NJX1NFTlNfQ09ORl9EQVRBX1BPTF9TSElGVDsKIAogCS8qIEp1c3QgZG8gd2hhdCB3ZSdyZSBhc2tlZCB0byBkbyAqLwpAQCAtMTE5OSw2ICsxMTg0LDE0IEBACiAJCQkgImRhdGEgd2lkdGhzLCB1c2luZyBkZWZhdWx0IDggYml0XG4iKTsKIAkJbXgzX2NhbS0+cGxhdGZvcm1fZmxhZ3MgfD0gTVgzX0NBTUVSQV9EQVRBV0lEVEhfODsKIAl9CisJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfNCkKKwkJbXgzX2NhbS0+d2lkdGhfZmxhZ3MgPSAxIDw8IDM7CisJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfOCkKKwkJbXgzX2NhbS0+d2lkdGhfZmxhZ3MgfD0gMSA8PCA3OworCWlmIChteDNfY2FtLT5wbGF0Zm9ybV9mbGFncyAmIE1YM19DQU1FUkFfREFUQVdJRFRIXzEwKQorCQlteDNfY2FtLT53aWR0aF9mbGFncyB8PSAxIDw8IDk7CisJaWYgKG14M19jYW0tPnBsYXRmb3JtX2ZsYWdzICYgTVgzX0NBTUVSQV9EQVRBV0lEVEhfMTUpCisJCW14M19jYW0tPndpZHRoX2ZsYWdzIHw9IDEgPDwgMTQ7CiAKIAlteDNfY2FtLT5tY2xrID0gbXgzX2NhbS0+cGRhdGEtPm1jbGtfMTBraHogKiAxMDAwMDsKIAlpZiAoIW14M19jYW0tPm1jbGspIHsKQEAgLTEyODEsOCArMTI3NCw2IEBACiAKIAlkbWFlbmdpbmVfcHV0KCk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaS5NWDN4IENhbWVyYSBkcml2ZXIgdW5sb2FkZWRcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCmluZGV4IDBiMzg1MDAuLjJlNDEzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwpAQCAtMjEsMTIgKzIxLDE1IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNkZWZpbmUgREVCVUdfVkFSSUFCTEUgZGVidWcKIAogI2luY2x1ZGUgPG1lZGlhL3NhYTcxNDZfdnYuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzExNS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAibXhiLmgiCiAjaW5jbHVkZSAidGVhNjQxNWMuaCIKQEAgLTE3MSw3ICsxNzQsNyBAQAogCiAJbXhiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG14YiksIEdGUF9LRVJORUwpOwogCWlmIChteGIgPT0gTlVMTCkgewotCQlERUJfRCgoIm5vdCBlbm91Z2gga2VybmVsIG1lbW9yeS5cbiIpKTsKKwkJREVCX0QoIm5vdCBlbm91Z2gga2VybmVsIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTc5LDcgKzE4Miw3IEBACiAKIAlzYWE3MTQ2X2kyY19hZGFwdGVyX3ByZXBhcmUoZGV2LCAmbXhiLT5pMmNfYWRhcHRlciwgU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzQ4MCk7CiAJaWYgKGkyY19hZGRfYWRhcHRlcigmbXhiLT5pMmNfYWRhcHRlcikgPCAwKSB7Ci0JCURFQl9TKCgiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlERUJfUygiY2Fubm90IHJlZ2lzdGVyIGkyYy1kZXZpY2UuIHNraXBwaW5nLlxuIik7CiAJCWtmcmVlKG14Yik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTIwMCw3ICsyMDMsNyBAQAogCS8qIGNoZWNrIGlmIGFsbCBkZXZpY2VzIGFyZSBwcmVzZW50ICovCiAJaWYgKCFteGItPnRlYTY0MjBfMSB8fCAhbXhiLT50ZWE2NDIwXzIgfHwgIW14Yi0+dGVhNjQxNWMgfHwKIAkgICAgIW14Yi0+dGRhOTg0MCB8fCAhbXhiLT5zYWE3MTExYSB8fCAhbXhiLT50dW5lcikgewotCQlwcmludGsoIm14YjogZGlkIG5vdCBmaW5kIGFsbCBpMmMgZGV2aWNlcy4gYWJvcnRpbmdcbiIpOworCQlwcl9lcnIoImRpZCBub3QgZmluZCBhbGwgaTJjIGRldmljZXMuIGFib3J0aW5nXG4iKTsKIAkJaTJjX2RlbF9hZGFwdGVyKCZteGItPmkyY19hZGFwdGVyKTsKIAkJa2ZyZWUobXhiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zNDYsMTEgKzM0OSwxMSBAQAogCQkJbXNnLmJ1ZiA9ICZteGJfc2FhNzc0MF9pbml0W2ldLmRhdGFbMF07CiAJCQllcnIgPSBpMmNfdHJhbnNmZXIoJm14Yi0+aTJjX2FkYXB0ZXIsICZtc2csIDEpOwogCQkJaWYgKGVyciAhPSAxKSB7Ci0JCQkJREVCX0QoKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSAnc291bmQgYXJlbmEgbW9kdWxlJy5cbiIpKTsKKwkJCQlERUJfRCgiZmFpbGVkIHRvIGluaXRpYWxpemUgJ3NvdW5kIGFyZW5hIG1vZHVsZSdcbiIpOwogCQkJCWdvdG8gZXJyOwogCQkJfQogCQl9Ci0JCUlORk8oKCInc291bmQgYXJlbmEgbW9kdWxlJyBkZXRlY3RlZC5cbiIpKTsKKwkJcHJfaW5mbygiJ3NvdW5kIGFyZW5hIG1vZHVsZScgZGV0ZWN0ZWRcbiIpOwogCX0KIGVycjoKIAkvKiB0aGUgcmVzdCBmb3Igc2FhNzE0NjogeW91IHNob3VsZCBkZWZpbml0ZWx5IHNldCBzb21lIGJhc2ljIHZhbHVlcwpAQCAtMzkwLDcgKzM5Myw3IEBACiAJZm9yIChpID0gTUFYQ09OVFJPTFMgLSAxOyBpID49IDA7IGktLSkgewogCQlpZiAobXhiX2NvbnRyb2xzW2ldLmlkID09IHFjLT5pZCkgewogCQkJKnFjID0gbXhiX2NvbnRyb2xzW2ldOwotCQkJREVCX0QoKCJWSURJT0NfUVVFUllDVFJMICVkLlxuIiwgcWMtPmlkKSk7CisJCQlERUJfRCgiVklESU9DX1FVRVJZQ1RSTCAlZFxuIiwgcWMtPmlkKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDEzLDExICs0MTYsMTEgQEAKIAogCWlmICh2Yy0+aWQgPT0gVjRMMl9DSURfQVVESU9fTVVURSkgewogCQl2Yy0+dmFsdWUgPSBteGItPmN1cl9tdXRlOwotCQlERUJfRCgoIlZJRElPQ19HX0NUUkwgVjRMMl9DSURfQVVESU9fTVVURTolZC5cbiIsIHZjLT52YWx1ZSkpOworCQlERUJfRCgiVklESU9DX0dfQ1RSTCBWNEwyX0NJRF9BVURJT19NVVRFOiVkXG4iLCB2Yy0+dmFsdWUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlERUJfRUUoKCJWSURJT0NfR19DVFJMIFY0TDJfQ0lEX0FVRElPX01VVEU6JWQuXG4iLCB2Yy0+dmFsdWUpKTsKKwlERUJfRUUoIlZJRElPQ19HX0NUUkwgVjRMMl9DSURfQVVESU9fTVVURTolZFxuIiwgdmMtPnZhbHVlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQwLDE0ICs0NDMsMTQgQEAKIAkJLyogc3dpdGNoIHRoZSBhdWRpby1zb3VyY2UgKi8KIAkJdGVhNjQyMF9yb3V0ZV9saW5lKG14YiwgdmMtPnZhbHVlID8gNiA6CiAJCQkJdmlkZW9fYXVkaW9fY29ubmVjdFtteGItPmN1cl9pbnB1dF0pOwotCQlERUJfRUUoKCJWSURJT0NfU19DVFJMLCBWNEwyX0NJRF9BVURJT19NVVRFOiAlZC5cbiIsIHZjLT52YWx1ZSkpOworCQlERUJfRUUoIlZJRElPQ19TX0NUUkwsIFY0TDJfQ0lEX0FVRElPX01VVEU6ICVkXG4iLCB2Yy0+dmFsdWUpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2lucHV0ICppKQogewotCURFQl9FRSgoIlZJRElPQ19FTlVNSU5QVVQgJWQuXG4iLCBpLT5pbmRleCkpOworCURFQl9FRSgiVklESU9DX0VOVU1JTlBVVCAlZFxuIiwgaS0+aW5kZXgpOwogCWlmIChpLT5pbmRleCA+PSBNWEJfSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHkoaSwgJm14Yl9pbnB1dHNbaS0+aW5kZXhdLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKQEAgLTQ2MCw3ICs0NjMsNyBAQAogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAkqaSA9IG14Yi0+Y3VyX2lucHV0OwogCi0JREVCX0VFKCgiVklESU9DX0dfSU5QVVQgJWQuXG4iLCAqaSkpOworCURFQl9FRSgiVklESU9DX0dfSU5QVVQgJWRcbiIsICppKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDcxLDcgKzQ3NCw3IEBACiAJaW50IGVyciA9IDA7CiAJaW50IGkgPSAwOwogCi0JREVCX0VFKCgiVklESU9DX1NfSU5QVVQgJWQuXG4iLCBpbnB1dCkpOworCURFQl9FRSgiVklESU9DX1NfSU5QVVQgJWRcbiIsIGlucHV0KTsKIAogCWlmIChpbnB1dCA+PSBNWEJfSU5QVVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxNCw3ICs1MTcsNyBAQAogCiAJLyogc3dpdGNoIHZpZGVvIGluIHNhYTcxMTFhICovCiAJaWYgKHNhYTcxMTFhX2NhbGwobXhiLCB2aWRlbywgc19yb3V0aW5nLCBpLCBTQUE3MTExX0ZNVF9DQ0lSLCAwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJWSURJT0NfU19JTlBVVDogY291bGQgbm90IGFkZHJlc3Mgc2FhNzExMWEuXG4iKTsKKwkJcHJfZXJyKCJWSURJT0NfU19JTlBVVDogY291bGQgbm90IGFkZHJlc3Mgc2FhNzExMWFcbiIpOwogCiAJLyogc3dpdGNoIHRoZSBhdWRpby1zb3VyY2Ugb25seSBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoMCA9PSBteGItPmN1cl9tdXRlKQpAQCAtNTI5LDExICs1MzIsMTIgQEAKIAlzdHJ1Y3QgbXhiICpteGIgPSAoc3RydWN0IG14YiAqKWRldi0+ZXh0X3ByaXY7CiAKIAlpZiAodC0+aW5kZXgpIHsKLQkJREVCX0QoKCJWSURJT0NfR19UVU5FUjogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIgYXR0YWNoZWQuXG4iLCB0LT5pbmRleCkpOworCQlERUJfRCgiVklESU9DX0dfVFVORVI6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIGF0dGFjaGVkXG4iLAorCQkgICAgICB0LT5pbmRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCURFQl9FRSgoIlZJRElPQ19HX1RVTkVSOiAlZFxuIiwgdC0+aW5kZXgpKTsKKwlERUJfRUUoIlZJRElPQ19HX1RVTkVSOiAlZFxuIiwgdC0+aW5kZXgpOwogCiAJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOwogCXN0cmxjcHkodC0+bmFtZSwgIlRWIFR1bmVyIiwgc2l6ZW9mKHQtPm5hbWUpKTsKQEAgLTU1MCw3ICs1NTQsOCBAQAogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAogCWlmICh0LT5pbmRleCkgewotCQlERUJfRCgoIlZJRElPQ19TX1RVTkVSOiBjaGFubmVsICVkIGRvZXMgbm90IGhhdmUgYSB0dW5lciBhdHRhY2hlZC5cbiIsIHQtPmluZGV4KSk7CisJCURFQl9EKCJWSURJT0NfU19UVU5FUjogY2hhbm5lbCAlZCBkb2VzIG5vdCBoYXZlIGEgdHVuZXIgYXR0YWNoZWRcbiIsCisJCSAgICAgIHQtPmluZGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01NjQsMTQgKzU2OSwxNCBAQAogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAogCWlmIChteGItPmN1cl9pbnB1dCkgewotCQlERUJfRCgoIlZJRElPQ19HX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIiwKLQkJCQkJbXhiLT5jdXJfaW5wdXQpKTsKKwkJREVCX0QoIlZJRElPQ19HX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIiwKKwkJICAgICAgbXhiLT5jdXJfaW5wdXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkqZiA9IG14Yi0+Y3VyX2ZyZXE7CiAKLQlERUJfRUUoKCJWSURJT0NfR19GUkVROiBmcmVxOjB4JTA4eC5cbiIsIG14Yi0+Y3VyX2ZyZXEuZnJlcXVlbmN5KSk7CisJREVCX0VFKCJWSURJT0NfR19GUkVROiBmcmVxOjB4JTA4eFxuIiwgbXhiLT5jdXJfZnJlcS5mcmVxdWVuY3kpOwogCXJldHVybiAwOwogfQogCkBAIC01ODgsMTIgKzU5MywxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChteGItPmN1cl9pbnB1dCkgewotCQlERUJfRCgoIlZJRElPQ19TX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIiwgbXhiLT5jdXJfaW5wdXQpKTsKKwkJREVCX0QoIlZJRElPQ19TX0ZSRVE6IGNoYW5uZWwgJWQgZG9lcyBub3QgaGF2ZSBhIHR1bmVyIVxuIiwKKwkJICAgICAgbXhiLT5jdXJfaW5wdXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlteGItPmN1cl9mcmVxID0gKmY7Ci0JREVCX0VFKCgiVklESU9DX1NfRlJFUVVFTkNZOiBmcmVxOjB4JTA4eC5cbiIsIG14Yi0+Y3VyX2ZyZXEuZnJlcXVlbmN5KSk7CisJREVCX0VFKCJWSURJT0NfU19GUkVRVUVOQ1k6IGZyZXE6MHglMDh4XG4iLCBteGItPmN1cl9mcmVxLmZyZXF1ZW5jeSk7CiAKIAkvKiB0dW5lIGluIGRlc2lyZWQgZnJlcXVlbmN5ICovCiAJdHVuZXJfY2FsbChteGIsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgJm14Yi0+Y3VyX2ZyZXEpOwpAQCAtNjEyLDE4ICs2MTgsMTggQEAKIAlzdHJ1Y3QgbXhiICpteGIgPSAoc3RydWN0IG14YiAqKWRldi0+ZXh0X3ByaXY7CiAKIAlpZiAoYS0+aW5kZXggPiBNWEJfSU5QVVRTKSB7Ci0JCURFQl9EKCgiVklESU9DX0dfQVVESU8gJWQgb3V0IG9mIHJhbmdlLlxuIiwgYS0+aW5kZXgpKTsKKwkJREVCX0QoIlZJRElPQ19HX0FVRElPICVkIG91dCBvZiByYW5nZVxuIiwgYS0+aW5kZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlERUJfRUUoKCJWSURJT0NfR19BVURJTyAlZC5cbiIsIGEtPmluZGV4KSk7CisJREVCX0VFKCJWSURJT0NfR19BVURJTyAlZFxuIiwgYS0+aW5kZXgpOwogCW1lbWNweShhLCAmbXhiX2F1ZGlvc1t2aWRlb19hdWRpb19jb25uZWN0W214Yi0+Y3VyX2lucHV0XV0sIHNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpbykpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYXVkaW8gKmEpCiB7Ci0JREVCX0QoKCJWSURJT0NfU19BVURJTyAlZC5cbiIsIGEtPmluZGV4KSk7CisJREVCX0QoIlZJRElPQ19TX0FVRElPICVkXG4iLCBhLT5pbmRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1NSwxMSArNjYxLDExIEBACiAJCWludCBpID0gKihpbnQgKilhcmc7CiAKIAkJaWYgKGkgPCAwIHx8IGkgPj0gTVhCX0FVRElPUykgewotCQkJREVCX0QoKCJpbGxlZ2FsIGFyZ3VtZW50IHRvIE1YQl9TX0FVRElPX0NEOiBpOiVkLlxuIiwgaSkpOworCQkJREVCX0QoImludmFsaWQgYXJndW1lbnQgdG8gTVhCX1NfQVVESU9fQ0Q6IGk6JWRcbiIsIGkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlERUJfRUUoKCJNWEJfU19BVURJT19DRDogaTolZC5cbiIsIGkpKTsKKwkJREVCX0VFKCJNWEJfU19BVURJT19DRDogaTolZFxuIiwgaSk7CiAKIAkJdGVhNjQyMF9yb3V0ZV9jZChteGIsIGkpOwogCQlyZXR1cm4gMDsKQEAgLTY2OSwxNyArNjc1LDE4IEBACiAJCWludCBpID0gKihpbnQgKilhcmc7CiAKIAkJaWYgKGkgPCAwIHx8IGkgPj0gTVhCX0FVRElPUykgewotCQkJREVCX0QoKCJpbGxlZ2FsIGFyZ3VtZW50IHRvIE1YQl9TX0FVRElPX0xJTkU6IGk6JWQuXG4iLCBpKSk7CisJCQlERUJfRCgiaW52YWxpZCBhcmd1bWVudCB0byBNWEJfU19BVURJT19MSU5FOiBpOiVkXG4iLAorCQkJICAgICAgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCURFQl9FRSgoIk1YQl9TX0FVRElPX0xJTkU6IGk6JWQuXG4iLCBpKSk7CisJCURFQl9FRSgiTVhCX1NfQVVESU9fTElORTogaTolZFxuIiwgaSk7CiAJCXRlYTY0MjBfcm91dGVfbGluZShteGIsIGkpOwogCQlyZXR1cm4gMDsKIAl9CiAJZGVmYXVsdDoKIC8qCi0JCURFQjIocHJpbnRrKCJkb2VzIG5vdCBoYW5kbGUgdGhpcyBpb2N0bC5cbiIpKTsKKwkJREVCMihwcl9lcnIoImRvZXMgbm90IGhhbmRsZSB0aGlzIGlvY3RsXG4iKSk7CiAqLwogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KQEAgLTY5Myw3ICs3MDAsNyBAQAogewogCXN0cnVjdCBteGIgKm14YjsKIAotCURFQl9FRSgoImRldjolcFxuIiwgZGV2KSk7CisJREVCX0VFKCJkZXY6JXBcbiIsIGRldik7CiAKIAlzYWE3MTQ2X3Z2X2luaXQoZGV2LCAmdnZfZGF0YSk7CiAJaWYgKG14Yl9wcm9iZShkZXYpKSB7CkBAIC03MjAsNyArNzI3LDcgQEAKICNlbmRpZgogCXZ2X2RhdGEub3BzLnZpZGlvY19kZWZhdWx0ID0gdmlkaW9jX2RlZmF1bHQ7CiAJaWYgKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKCZteGItPnZpZGVvX2RldiwgZGV2LCAibXhiIiwgVkZMX1RZUEVfR1JBQkJFUikpIHsKLQkJRVJSKCgiY2Fubm90IHJlZ2lzdGVyIGNhcHR1cmUgdjRsMiBkZXZpY2UuIHNraXBwaW5nLlxuIikpOworCQlFUlIoImNhbm5vdCByZWdpc3RlciBjYXB0dXJlIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpOwogCQlzYWE3MTQ2X3Z2X3JlbGVhc2UoZGV2KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTcyOCwxMSArNzM1LDExIEBACiAJLyogaW5pdGlhbGl6YXRpb24gc3R1ZmYgKHZiaSkgKG9ubHkgZm9yIHJldmlzaW9uID4gMCBhbmQgZm9yIGV4dGVuc2lvbnMgd2hpY2ggd2FudCBpdCkqLwogCWlmIChNWEJfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKSB7CiAJCWlmIChzYWE3MTQ2X3JlZ2lzdGVyX2RldmljZSgmbXhiLT52YmlfZGV2LCBkZXYsICJteGIiLCBWRkxfVFlQRV9WQkkpKSB7Ci0JCQlFUlIoKCJjYW5ub3QgcmVnaXN0ZXIgdmJpIHY0bDIgZGV2aWNlLiBza2lwcGluZy5cbiIpKTsKKwkJCUVSUigiY2Fubm90IHJlZ2lzdGVyIHZiaSB2NGwyIGRldmljZS4gc2tpcHBpbmcuXG4iKTsKIAkJfQogCX0KIAotCXByaW50aygibXhiOiBmb3VuZCBNdWx0aW1lZGlhIGVYdGVuc2lvbiBCb2FyZCAjJWQuXG4iLCBteGJfbnVtKTsKKwlwcl9pbmZvKCJmb3VuZCBNdWx0aW1lZGlhIGVYdGVuc2lvbiBCb2FyZCAjJWRcbiIsIG14Yl9udW0pOwogCiAJbXhiX251bSsrOwogCW14Yl9pbml0X2RvbmUoZGV2KTsKQEAgLTc0Myw3ICs3NTAsNyBAQAogewogCXN0cnVjdCBteGIgKm14YiA9IChzdHJ1Y3QgbXhiICopZGV2LT5leHRfcHJpdjsKIAotCURFQl9FRSgoImRldjolcFxuIiwgZGV2KSk7CisJREVCX0VFKCJkZXY6JXBcbiIsIGRldik7CiAKIAlzYWE3MTQ2X3VucmVnaXN0ZXJfZGV2aWNlKCZteGItPnZpZGVvX2RldixkZXYpOwogCWlmIChNWEJfQk9BUkRfQ0FOX0RPX1ZCSShkZXYpKQpAQCAtNzY1LDcgKzc3Miw3IEBACiAJaWYgKFY0TDJfU1REX1BBTF9JID09IHN0YW5kYXJkLT5pZCkgewogCQl2NGwyX3N0ZF9pZCBzdGQgPSBWNEwyX1NURF9QQUxfSTsKIAotCQlERUJfRCgoIlZJRElPQ19TX1NURDogc2V0dGluZyBteGIgZm9yIFBBTF9JLlxuIikpOworCQlERUJfRCgiVklESU9DX1NfU1REOiBzZXR0aW5nIG14YiBmb3IgUEFMX0lcbiIpOwogCQkvKiBzZXQgdGhlIDcxNDYgZ3BpbyByZWdpc3RlciAtLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMgZXhhY3RseSAqLwogCQlzYWE3MTQ2X3dyaXRlKGRldiwgR1BJT19DVFJMLCAweDAwNDA0MDUwKTsKIAkJLyogdW5zZXQgdGhlIDcxMTEgZ3BpbyByZWdpc3RlciAtLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMgZXhhY3RseSAqLwpAQCAtNzc0LDcgKzc4MSw3IEBACiAJfSBlbHNlIHsKIAkJdjRsMl9zdGRfaWQgc3RkID0gVjRMMl9TVERfUEFMX0JHOwogCi0JCURFQl9EKCgiVklESU9DX1NfU1REOiBzZXR0aW5nIG14YiBmb3IgUEFML05UU0MvU0VDQU0uXG4iKSk7CisJCURFQl9EKCJWSURJT0NfU19TVEQ6IHNldHRpbmcgbXhiIGZvciBQQUwvTlRTQy9TRUNBTVxuIik7CiAJCS8qIHNldCB0aGUgNzE0NiBncGlvIHJlZ2lzdGVyIC0tIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcyBleGFjdGx5ICovCiAJCXNhYTcxNDZfd3JpdGUoZGV2LCBHUElPX0NUUkwsIDB4MDA0MDQwNTApOwogCQkvKiBzZXQgdGhlIDcxMTEgZ3BpbyByZWdpc3RlciAtLSBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGRvZXMgZXhhY3RseSAqLwpAQCAtODUyLDcgKzg1OSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBteGJfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpZiAoc2FhNzE0Nl9yZWdpc3Rlcl9leHRlbnNpb24oJmV4dGVuc2lvbikpIHsKLQkJREVCX1MoKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0ZW5zaW9uLlxuIikpOworCQlERUJfUygiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGVuc2lvblxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ub29uMDEwcGMzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9ub29uMDEwcGMzMC5jCmluZGV4IDM1ZjcyMmEuLjUwODM4YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbm9vbjAxMHBjMzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL25vb24wMTBwYzMwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogRHJpdmVyIGZvciBTaWxpY29uRmlsZSBOT09OMDEwUEMzMCBDSUYgKDEvMTEiKSBJbWFnZSBTZW5zb3Igd2l0aCBJU1AKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgogICogQ29udGFjdDogU3lsd2VzdGVyIE5hd3JvY2tpLCA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KICAqCiAgKiBJbml0aWFsIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gYSBkcml2ZXIgYXV0aG9yZWQgYnkKQEAgLTEwLDcgKzEwLDcgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcmdzaW9uLgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9ub29uMDEwcGMzMC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KQEAgLTEzMSwxNyArMTMyLDIzIEBACiAKIHN0cnVjdCBub29uMDEwX2luZm8gewogCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwlzdHJ1Y3QgbWVkaWFfcGFkIHBhZDsKIAlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgaGRsOwotCWNvbnN0IHN0cnVjdCBub29uMDEwcGMzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbHlbTk9PTjAxMF9OVU1fU1VQUExJRVNdOworCXUzMiBncGlvX25yZXNldDsKKwl1MzIgZ3Bpb19uc3RieTsKKworCS8qIFByb3RlY3RzIHRoZSBzdHJ1Y3QgbWVtYmVycyBiZWxvdyAqLworCXN0cnVjdCBtdXRleCBsb2NrOworCiAJY29uc3Qgc3RydWN0IG5vb24wMTBfZm9ybWF0ICpjdXJyX2ZtdDsKIAljb25zdCBzdHJ1Y3Qgbm9vbjAxMF9mcm1zaXplICpjdXJyX3dpbjsKKwl1bnNpZ25lZCBpbnQgYXBwbHlfbmV3X2NmZzoxOworCXVuc2lnbmVkIGludCBzdHJlYW1pbmc6MTsKIAl1bnNpZ25lZCBpbnQgaGZsaXA6MTsKIAl1bnNpZ25lZCBpbnQgdmZsaXA6MTsKIAl1bnNpZ25lZCBpbnQgcG93ZXI6MTsKIAl1OCBpMmNfcmVnX3BhZ2U7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGx5W05PT04wMTBfTlVNX1NVUFBMSUVTXTsKLQl1MzIgZ3Bpb19ucmVzZXQ7Ci0JdTMyIGdwaW9fbnN0Ynk7CiB9OwogCiBzdHJ1Y3QgaTJjX3JlZ3ZhbCB7CkBAIC0yOTIsOCArMjk5LDEwIEBACiAJdTggcmVnID0gc2xlZXAgPyAweEYxIDogMHhGMDsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChyZXNldCkKKwlpZiAocmVzZXQpIHsKIAkJcmV0ID0gY2FtX2kyY193cml0ZShzZCwgUE9XRVJfQ1RSTF9SRUcsIHJlZyB8IDB4MDIpOworCQl1ZGVsYXkoMjApOworCX0KIAlpZiAoIXJldCkgewogCQlyZXQgPSBjYW1faTJjX3dyaXRlKHNkLCBQT1dFUl9DVFJMX1JFRywgcmVnKTsKIAkJaWYgKHJlc2V0ICYmICFyZXQpCkBAIC0zMTMsNiArMzIyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBDYWxsZWQgd2l0aCBzdHJ1Y3Qgbm9vbjAxMF9pbmZvLmxvY2sgbXV0ZXggaGVsZCAqLwogc3RhdGljIGludCBub29uMDEwX3NldF9mbGlwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBoZmxpcCwgaW50IHZmbGlwKQogewogCXN0cnVjdCBub29uMDEwX2luZm8gKmluZm8gPSB0b19ub29uMDEwKHNkKTsKQEAgLTM0MCwyMSArMzUwLDE4IEBACiBzdGF0aWMgaW50IG5vb24wMTBfc2V0X3BhcmFtcyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBub29uMDEwX2luZm8gKmluZm8gPSB0b19ub29uMDEwKHNkKTsKLQlpbnQgcmV0OwogCi0JaWYgKCFpbmZvLT5jdXJyX3dpbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBjYW1faTJjX3dyaXRlKHNkLCBWRE9fQ1RMX1JFRygwKSwgaW5mby0+Y3Vycl93aW4tPnZpZF9jdGwxKTsKLQotCWlmICghcmV0ICYmIGluZm8tPmN1cnJfZm10KQotCQlyZXQgPSBjYW1faTJjX3dyaXRlKHNkLCBJU1BfQ1RMX1JFRygwKSwKLQkJCQlpbmZvLT5jdXJyX2ZtdC0+aXNwY3RsMV9yZWcpOwotCXJldHVybiByZXQ7CisJaW50IHJldCA9IGNhbV9pMmNfd3JpdGUoc2QsIFZET19DVExfUkVHKDApLAorCQkJCWluZm8tPmN1cnJfd2luLT52aWRfY3RsMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gY2FtX2kyY193cml0ZShzZCwgSVNQX0NUTF9SRUcoMCksCisJCQkgICAgIGluZm8tPmN1cnJfZm10LT5pc3BjdGwxX3JlZyk7CiB9CiAKIC8qIEZpbmQgbmVhcmVzdCBtYXRjaGluZyBpbWFnZSBwaXhlbCBzaXplLiAqLwotc3RhdGljIGludCBub29uMDEwX3RyeV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQorc3RhdGljIGludCBub29uMDEwX3RyeV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mLAorCQkJCSAgY29uc3Qgc3RydWN0IG5vb24wMTBfZnJtc2l6ZSAqKnNpemUpCiB7CiAJdW5zaWduZWQgaW50IG1pbl9lcnIgPSB+MDsKIAlpbnQgaSA9IEFSUkFZX1NJWkUobm9vbjAxMF9zaXplcyk7CkBAIC0zNzQsMTEgKzM4MSwxNCBAQAogCWlmIChtYXRjaCkgewogCQltZi0+d2lkdGggID0gbWF0Y2gtPndpZHRoOwogCQltZi0+aGVpZ2h0ID0gbWF0Y2gtPmhlaWdodDsKKwkJaWYgKHNpemUpCisJCQkqc2l6ZSA9IG1hdGNoOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qIENhbGxlZCB3aXRoIGluZm8ubG9jayBtdXRleCBoZWxkICovCiBzdGF0aWMgaW50IHBvd2VyX2VuYWJsZShzdHJ1Y3Qgbm9vbjAxMF9pbmZvICppbmZvKQogewogCWludCByZXQ7CkBAIC00MTksNiArNDI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogQ2FsbGVkIHdpdGggaW5mby5sb2NrIG11dGV4IGhlbGQgKi8KIHN0YXRpYyBpbnQgcG93ZXJfZGlzYWJsZShzdHJ1Y3Qgbm9vbjAxMF9pbmZvICppbmZvKQogewogCWludCByZXQ7CkBAIC00NDgsMTQ3ICs0NTksMTc1IEBACiBzdGF0aWMgaW50IG5vb24wMTBfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHRvX3NkKGN0cmwpOworCXN0cnVjdCBub29uMDEwX2luZm8gKmluZm8gPSB0b19ub29uMDEwKHNkKTsKKwlpbnQgcmV0ID0gMDsKIAogCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIiVzOiBjdHJsX2lkOiAlZCwgdmFsdWU6ICVkXG4iLAogCQkgX19mdW5jX18sIGN0cmwtPmlkLCBjdHJsLT52YWwpOwogCisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBwb3dlcmVkIHVwIGJ5IHRoZSBob3N0IGRyaXZlciBkbworCSAqIG5vdCBhcHBseSBhbnkgY29udHJvbHMgdG8gSC9XIGF0IHRoaXMgdGltZS4gSW5zdGVhZAorCSAqIHRoZSBjb250cm9scyB3aWxsIGJlIHJlc3RvcmVkIHJpZ2h0IGFmdGVyIHBvd2VyLXVwLgorCSAqLworCWlmICghaW5mby0+cG93ZXIpCisJCWdvdG8gdW5sb2NrOworCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQlyZXR1cm4gbm9vbjAxMF9lbmFibGVfYXV0b3doaXRlYmFsYW5jZShzZCwgY3RybC0+dmFsKTsKKwkJcmV0ID0gbm9vbjAxMF9lbmFibGVfYXV0b3doaXRlYmFsYW5jZShzZCwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCXJldHVybiBjYW1faTJjX3dyaXRlKHNkLCBNV0JfQkdBSU5fUkVHLCBjdHJsLT52YWwpOworCQlyZXQgPSBjYW1faTJjX3dyaXRlKHNkLCBNV0JfQkdBSU5fUkVHLCBjdHJsLT52YWwpOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlyZXR1cm4gY2FtX2kyY193cml0ZShzZCwgTVdCX1JHQUlOX1JFRywgY3RybC0+dmFsKTsKKwkJcmV0ID0gIGNhbV9pMmNfd3JpdGUoc2QsIE1XQl9SR0FJTl9SRUcsIGN0cmwtPnZhbCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOwogCX0KK3VubG9jazoKKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbm9vbjAxMF9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCQkgICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQorc3RhdGljIGludCBub29uMDEwX2VudW1fbWJ1c19jb2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X21idXNfY29kZV9lbnVtICpjb2RlKQogewotCWlmICghY29kZSB8fCBpbmRleCA+PSBBUlJBWV9TSVpFKG5vb24wMTBfZm9ybWF0cykpCisJaWYgKGNvZGUtPmluZGV4ID49IEFSUkFZX1NJWkUobm9vbjAxMF9mb3JtYXRzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqY29kZSA9IG5vb24wMTBfZm9ybWF0c1tpbmRleF0uY29kZTsKKwljb2RlLT5jb2RlID0gbm9vbjAxMF9mb3JtYXRzW2NvZGUtPmluZGV4XS5jb2RlOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG5vb24wMTBfZ19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCitzdGF0aWMgaW50IG5vb24wMTBfZ2V0X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQogewogCXN0cnVjdCBub29uMDEwX2luZm8gKmluZm8gPSB0b19ub29uMDEwKHNkKTsKLQlpbnQgcmV0OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mOwogCi0JaWYgKCFtZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWluZm8tPmN1cnJfd2luIHx8ICFpbmZvLT5jdXJyX2ZtdCkgewotCQlyZXQgPSBub29uMDEwX3NldF9wYXJhbXMoc2QpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwlpZiAoZm10LT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKSB7CisJCWlmIChmaCkgeworCQkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisJCQlmbXQtPmZvcm1hdCA9ICptZjsKKwkJfQorCQlyZXR1cm4gMDsKIAl9CisJbWYgPSAmZm10LT5mb3JtYXQ7CiAKLQltZi0+d2lkdGgJPSBpbmZvLT5jdXJyX3dpbi0+d2lkdGg7Ci0JbWYtPmhlaWdodAk9IGluZm8tPmN1cnJfd2luLT5oZWlnaHQ7Ci0JbWYtPmNvZGUJPSBpbmZvLT5jdXJyX2ZtdC0+Y29kZTsKLQltZi0+Y29sb3JzcGFjZQk9IGluZm8tPmN1cnJfZm10LT5jb2xvcnNwYWNlOwotCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKwltZi0+d2lkdGggPSBpbmZvLT5jdXJyX3dpbi0+d2lkdGg7CisJbWYtPmhlaWdodCA9IGluZm8tPmN1cnJfd2luLT5oZWlnaHQ7CisJbWYtPmNvZGUgPSBpbmZvLT5jdXJyX2ZtdC0+Y29kZTsKKwltZi0+Y29sb3JzcGFjZSA9IGluZm8tPmN1cnJfZm10LT5jb2xvcnNwYWNlOworCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAorCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIFJldHVybiBuZWFyZXN0IG1lZGlhIGJ1cyBmcmFtZSBmb3JtYXQuICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vb24wMTBfZm9ybWF0ICp0cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCitzdGF0aWMgY29uc3Qgc3RydWN0IG5vb24wMTBfZm9ybWF0ICpub29uMDEwX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCQkJICAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCWludCBpID0gQVJSQVlfU0laRShub29uMDEwX2Zvcm1hdHMpOwogCi0Jbm9vbjAxMF90cnlfZnJhbWVfc2l6ZShtZik7Ci0KLQl3aGlsZSAoaS0tKQorCXdoaWxlICgtLWkpCiAJCWlmIChtZi0+Y29kZSA9PSBub29uMDEwX2Zvcm1hdHNbaV0uY29kZSkKIAkJCWJyZWFrOwotCiAJbWYtPmNvZGUgPSBub29uMDEwX2Zvcm1hdHNbaV0uY29kZTsKIAogCXJldHVybiAmbm9vbjAxMF9mb3JtYXRzW2ldOwogfQogCi1zdGF0aWMgaW50IG5vb24wMTBfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCi17Ci0JaWYgKCFzZCB8fCAhbWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdHJ5X2ZtdChzZCwgbWYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5vb24wMTBfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCSBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3N0YXRpYyBpbnQgbm9vbjAxMF9zZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCiB7CiAJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOworCWNvbnN0IHN0cnVjdCBub29uMDEwX2ZybXNpemUgKnNpemUgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBub29uMDEwX2Zvcm1hdCAqbmY7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWY7CisJaW50IHJldCA9IDA7CiAKLQlpZiAoIXNkIHx8ICFtZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJbmYgPSBub29uMDEwX3RyeV9mbXQoc2QsICZmbXQtPmZvcm1hdCk7CisJbm9vbjAxMF90cnlfZnJhbWVfc2l6ZSgmZm10LT5mb3JtYXQsICZzaXplKTsKKwlmbXQtPmZvcm1hdC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CiAKLQlpbmZvLT5jdXJyX2ZtdCA9IHRyeV9mbXQoc2QsIG1mKTsKLQotCXJldHVybiBub29uMDEwX3NldF9wYXJhbXMoc2QpOworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJaWYgKGZoKSB7CisJCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKwkJCSptZiA9IGZtdC0+Zm9ybWF0OworCQl9CisJCXJldHVybiAwOworCX0KKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKwlpZiAoIWluZm8tPnN0cmVhbWluZykgeworCQlpbmZvLT5hcHBseV9uZXdfY2ZnID0gMTsKKwkJaW5mby0+Y3Vycl9mbXQgPSBuZjsKKwkJaW5mby0+Y3Vycl93aW4gPSBzaXplOworCX0gZWxzZSB7CisJCXJldCA9IC1FQlVTWTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCisvKiBDYWxsZWQgd2l0aCBzdHJ1Y3Qgbm9vbjAxMF9pbmZvLmxvY2sgbXV0ZXggaGVsZCAqLwogc3RhdGljIGludCBub29uMDEwX2Jhc2VfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7Ci0Jc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBub29uMDEwX2J1bGtfd3JpdGVfcmVnKHNkLCBub29uMDEwX2Jhc2VfcmVncyk7Ci0JaWYgKCFyZXQpIHsKLQkJaW5mby0+Y3Vycl9mbXQgPSAmbm9vbjAxMF9mb3JtYXRzWzBdOwotCQlpbmZvLT5jdXJyX3dpbiA9ICZub29uMDEwX3NpemVzWzBdOworCWludCByZXQgPSBub29uMDEwX2J1bGtfd3JpdGVfcmVnKHNkLCBub29uMDEwX2Jhc2VfcmVncyk7CisJaWYgKCFyZXQpCiAJCXJldCA9IG5vb24wMTBfc2V0X3BhcmFtcyhzZCk7Ci0JfQogCWlmICghcmV0KQogCQlyZXQgPSBub29uMDEwX3NldF9mbGlwKHNkLCAxLCAwKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gbm9vbjAxMF9wb3dlcl9jdHJsKHNkLCBmYWxzZSwgZmFsc2UpOwogCi0JLyogc3luYyB0aGUgaGFuZGxlciBhbmQgdGhlIHJlZ2lzdGVycyBzdGF0ZSAqLwotCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZ0b19ub29uMDEwKHNkKS0+aGRsKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG5vb24wMTBfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCiB7CiAJc3RydWN0IG5vb24wMTBfaW5mbyAqaW5mbyA9IHRvX25vb24wMTAoc2QpOwotCWNvbnN0IHN0cnVjdCBub29uMDEwcGMzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGluZm8tPnBkYXRhOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQlpZiAoV0FSTihwZGF0YSA9PSBOVUxMLCAiTm8gcGxhdGZvcm0gZGF0YSFcbiIpKQotCQlyZXR1cm4gLUVOT01FTTsKLQorCW11dGV4X2xvY2soJmluZm8tPmxvY2spOwogCWlmIChvbikgewogCQlyZXQgPSBwb3dlcl9lbmFibGUoaW5mbyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBub29uMDEwX2Jhc2VfY29uZmlnKHNkKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBub29uMDEwX2Jhc2VfY29uZmlnKHNkKTsKIAl9IGVsc2UgewogCQlub29uMDEwX3Bvd2VyX2N0cmwoc2QsIGZhbHNlLCB0cnVlKTsKIAkJcmV0ID0gcG93ZXJfZGlzYWJsZShpbmZvKTsKLQkJaW5mby0+Y3Vycl93aW4gPSBOVUxMOwotCQlpbmZvLT5jdXJyX2ZtdCA9IE5VTEw7CiAJfQorCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisKKwkvKiBSZXN0b3JlIHRoZSBjb250cm9scyBzdGF0ZSAqLworCWlmICghcmV0ICYmIG9uKQorCQlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmaW5mby0+aGRsKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbm9vbjAxMF9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKK3N0YXRpYyBpbnQgbm9vbjAxMF9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBub29uMDEwX2luZm8gKmluZm8gPSB0b19ub29uMDEwKHNkKTsKKwlpbnQgcmV0ID0gMDsKIAotCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGNoaXAsCi0JCQkJCSAgVjRMMl9JREVOVF9OT09OMDEwUEMzMCwgMCk7CisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CisJaWYgKCFpbmZvLT5zdHJlYW1pbmcgIT0gIW9uKSB7CisJCXJldCA9IG5vb24wMTBfcG93ZXJfY3RybChzZCwgZmFsc2UsICFvbik7CisJCWlmICghcmV0KQorCQkJaW5mby0+c3RyZWFtaW5nID0gb247CisJfQorCWlmICghcmV0ICYmIG9uICYmIGluZm8tPmFwcGx5X25ld19jZmcpIHsKKwkJcmV0ID0gbm9vbjAxMF9zZXRfcGFyYW1zKHNkKTsKKwkJaWYgKCFyZXQpCisJCQlpbmZvLT5hcHBseV9uZXdfY2ZnID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG5vb24wMTBfbG9nX3N0YXR1cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQpAQCAtNTk5LDEyICs2MzgsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBub29uMDEwX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCAwKTsKKworCW1mLT53aWR0aCA9IG5vb24wMTBfc2l6ZXNbMF0ud2lkdGg7CisJbWYtPmhlaWdodCA9IG5vb24wMTBfc2l6ZXNbMF0uaGVpZ2h0OworCW1mLT5jb2RlID0gbm9vbjAxMF9mb3JtYXRzWzBdLmNvZGU7CisJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG5vb24wMTBfc3ViZGV2X2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IG5vb24wMTBfb3BlbiwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBub29uMDEwX2N0cmxfb3BzID0gewogCS5zX2N0cmwgPSBub29uMDEwX3NfY3RybCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbm9vbjAxMF9jb3JlX29wcyA9IHsKLQkuZ19jaGlwX2lkZW50CT0gbm9vbjAxMF9nX2NoaXBfaWRlbnQsCiAJLnNfcG93ZXIJPSBub29uMDEwX3NfcG93ZXIsCiAJLmdfY3RybAkJPSB2NGwyX3N1YmRldl9nX2N0cmwsCiAJLnNfY3RybAkJPSB2NGwyX3N1YmRldl9zX2N0cmwsCkBAIC02MTYsMTUgKzY3MCwxOSBAQAogCS5sb2dfc3RhdHVzCT0gbm9vbjAxMF9sb2dfc3RhdHVzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbm9vbjAxMF92aWRlb19vcHMgPSB7Ci0JLmdfbWJ1c19mbXQJPSBub29uMDEwX2dfZm10LAotCS5zX21idXNfZm10CT0gbm9vbjAxMF9zX2ZtdCwKLQkudHJ5X21idXNfZm10CT0gbm9vbjAxMF90cnlfZm10LAotCS5lbnVtX21idXNfZm10CT0gbm9vbjAxMF9lbnVtX2ZtdCwKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfcGFkX29wcyBub29uMDEwX3BhZF9vcHMgPSB7CisJLmVudW1fbWJ1c19jb2RlCT0gbm9vbjAxMF9lbnVtX21idXNfY29kZSwKKwkuZ2V0X2ZtdAk9IG5vb24wMTBfZ2V0X2ZtdCwKKwkuc2V0X2ZtdAk9IG5vb24wMTBfc2V0X2ZtdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG5vb24wMTBfdmlkZW9fb3BzID0geworCS5zX3N0cmVhbQk9IG5vb24wMTBfc19zdHJlYW0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBub29uMDEwX29wcyA9IHsKIAkuY29yZQk9ICZub29uMDEwX2NvcmVfb3BzLAorCS5wYWQJPSAmbm9vbjAxMF9wYWRfb3BzLAogCS52aWRlbwk9ICZub29uMDEwX3ZpZGVvX29wcywKIH07CiAKQEAgLTY2NSwxMCArNzIzLDE0IEBACiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW11dGV4X2luaXQoJmluZm8tPmxvY2spOwogCXNkID0gJmluZm8tPnNkOwogCXN0cmxjcHkoc2QtPm5hbWUsIE1PRFVMRV9OQU1FLCBzaXplb2Yoc2QtPm5hbWUpKTsKIAl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmbm9vbjAxMF9vcHMpOwogCisJc2QtPmludGVybmFsX29wcyA9ICZub29uMDEwX3N1YmRldl9pbnRlcm5hbF9vcHM7CisJc2QtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCiAJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmaW5mby0+aGRsLCAzKTsKIAogCXY0bDJfY3RybF9uZXdfc3RkKCZpbmZvLT5oZGwsICZub29uMDEwX2N0cmxfb3BzLApAQCAtNjg0LDEwICs3NDYsMTEgQEAKIAlpZiAocmV0KQogCQlnb3RvIG5wX2VycjsKIAotCWluZm8tPnBkYXRhCQk9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW5mby0+aTJjX3JlZ19wYWdlCT0gLTE7CiAJaW5mby0+Z3Bpb19ucmVzZXQJPSAtRUlOVkFMOwogCWluZm8tPmdwaW9fbnN0YnkJPSAtRUlOVkFMOworCWluZm8tPmN1cnJfZm10CQk9ICZub29uMDEwX2Zvcm1hdHNbMF07CisJaW5mby0+Y3Vycl93aW4JCT0gJm5vb24wMTBfc2l6ZXNbMF07CiAKIAlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19ucmVzZXQpKSB7CiAJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+Z3Bpb19ucmVzZXQsICJOT09OMDEwUEMzMCBOUlNUIik7CkBAIC03MTksMTEgKzc4MiwxNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gbnBfcmVnX2VycjsKIAorCWluZm8tPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJc2QtPmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfU0VOU09SOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZzZC0+ZW50aXR5LCAxLCAmaW5mby0+cGFkLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBucF9tZV9lcnI7CisKIAlyZXQgPSBub29uMDEwX2RldGVjdChjbGllbnQsIGluZm8pOwogCWlmICghcmV0KQogCQlyZXR1cm4gMDsKIAotCS8qIHRoZSBzZW5zb3IgZGV0ZWN0aW9uIGZhaWxlZCAqLworbnBfbWVfZXJyOgogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoTk9PTjAxMF9OVU1fU1VQUExJRVMsIGluZm8tPnN1cHBseSk7CiBucF9yZWdfZXJyOgogCWlmIChncGlvX2lzX3ZhbGlkKGluZm8tPmdwaW9fbnN0YnkpKQpAQCAtNzU0LDYgKzgyMyw3IEBACiAJaWYgKGdwaW9faXNfdmFsaWQoaW5mby0+Z3Bpb19uc3RieSkpCiAJCWdwaW9fZnJlZShpbmZvLT5ncGlvX25zdGJ5KTsKIAorCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzZC0+ZW50aXR5KTsKIAlrZnJlZShpbmZvKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYwppbmRleCBiM2E1ZWNkLi45YzVjMTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCkBAIC00MDAsNyArNDAwLDYgQEAKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAlpbmZvLnBhZGRyID0gYWRkcjsKLQlpbmZvLnZhZGRyID0gTlVMTDsKIAlpbmZvLndpZHRoID0gY3JvcHdpZHRoOwogCWluZm8uaGVpZ2h0ID0gY3JvcGhlaWdodDsKIAlpbmZvLmNvbG9yX21vZGUgPSB2b3V0LT5kc3NfbW9kZTsKQEAgLTgzNCw2ICs4MzMsMTUgQEAKIC8qCiAgKiAgRmlsZSBvcGVyYXRpb25zCiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgb21hcF92b3V0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSA9ICZ2b3V0LT52YnE7CisKKwlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgcSwgd2FpdCk7Cit9CisKIHN0YXRpYyB2b2lkIG9tYXBfdm91dF92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CkBAIC0xMTY1LDEyICsxMTczLDE3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQgPSBmaDsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJc3RydWN0IG9tYXB2aWRlb19pbmZvICpvdmlkOwogCXN0cnVjdCB2NGwyX3dpbmRvdyAqd2luID0gJmYtPmZtdC53aW47CiAKKwlvdmlkID0gJnZvdXQtPnZpZF9pbmZvOworCW92bCA9IG92aWQtPm92ZXJsYXlzWzBdOworCiAJcmV0ID0gb21hcF92b3V0X3RyeV93aW5kb3coJnZvdXQtPmZidWYsIHdpbik7CiAKIAlpZiAoIXJldCkgewotCQlpZiAodm91dC0+dmlkID09IE9NQVBfVklERU8xKQorCQlpZiAoKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBKSA9PSAwKQogCQkJd2luLT5nbG9iYWxfYWxwaGEgPSAyNTU7CiAJCWVsc2UKIAkJCXdpbi0+Z2xvYmFsX2FscGhhID0gZi0+Zm10Lndpbi5nbG9iYWxfYWxwaGE7CkBAIC0xMTk0LDggKzEyMDcsOCBAQAogCiAJcmV0ID0gb21hcF92b3V0X25ld193aW5kb3coJnZvdXQtPmNyb3AsICZ2b3V0LT53aW4sICZ2b3V0LT5mYnVmLCB3aW4pOwogCWlmICghcmV0KSB7Ci0JCS8qIFZpZGVvMSBwbGFuZSBkb2VzIG5vdCBzdXBwb3J0IGdsb2JhbCBhbHBoYSAqLwotCQlpZiAob3ZsLT5pZCA9PSBPTUFQX0RTU19WSURFTzEpCisJCS8qIFZpZGVvMSBwbGFuZSBkb2VzIG5vdCBzdXBwb3J0IGdsb2JhbCBhbHBoYSBvbiBPTUFQMyAqLworCQlpZiAoKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBKSA9PSAwKQogCQkJdm91dC0+d2luLmdsb2JhbF9hbHBoYSA9IDI1NTsKIAkJZWxzZQogCQkJdm91dC0+d2luLmdsb2JhbF9hbHBoYSA9IGYtPmZtdC53aW4uZ2xvYmFsX2FscGhhOwpAQCAtMTc4OCw3ICsxODAxLDkgQEAKIAlpZiAob3ZsLT5tYW5hZ2VyICYmIG92bC0+bWFuYWdlci0+Z2V0X21hbmFnZXJfaW5mbyAmJgogCQkJb3ZsLT5tYW5hZ2VyLT5zZXRfbWFuYWdlcl9pbmZvKSB7CiAJCW92bC0+bWFuYWdlci0+Z2V0X21hbmFnZXJfaW5mbyhvdmwtPm1hbmFnZXIsICZpbmZvKTsKLQkJaW5mby5hbHBoYV9lbmFibGVkID0gZW5hYmxlOworCQkvKiBlbmFibGUgdGhpcyBvbmx5IGlmIHRoZXJlIGlzIG5vIHpvcmRlciBjYXAgKi8KKwkJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgPT0gMCkKKwkJCWluZm8ucGFydGlhbF9hbHBoYV9lbmFibGVkID0gZW5hYmxlOwogCQlpZiAob3ZsLT5tYW5hZ2VyLT5zZXRfbWFuYWdlcl9pbmZvKG92bC0+bWFuYWdlciwgJmluZm8pKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTgyMCw3ICsxODM1LDcgQEAKIAl9CiAJaWYgKG92bC0+bWFuYWdlciAmJiBvdmwtPm1hbmFnZXItPmdldF9tYW5hZ2VyX2luZm8pIHsKIAkJb3ZsLT5tYW5hZ2VyLT5nZXRfbWFuYWdlcl9pbmZvKG92bC0+bWFuYWdlciwgJmluZm8pOwotCQlpZiAoaW5mby5hbHBoYV9lbmFibGVkKQorCQlpZiAoaW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQpCiAJCQlhLT5mbGFncyB8PSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9BTFBIQTsKIAl9CiAKQEAgLTE4NTUsNiArMTg3MCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgb21hcF92b3V0X2ZvcHMgPSB7CiAJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkucG9sbAkJPSBvbWFwX3ZvdXRfcG9sbCwKIAkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCiAJLm1tYXAgCQk9IG9tYXBfdm91dF9tbWFwLAogCS5vcGVuIAkJPSBvbWFwX3ZvdXRfb3BlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jCmluZGV4IDhhOTQ3ZTYuLmU4N2FlMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYwpAQCAtMTAyLDEwICsxMDIsMTAgQEAKIC8qIGVuZCBvZiBPTUFQMSBDYW1lcmEgSW50ZXJmYWNlIHJlZ2lzdGVycyAqLwogCiAKLSNkZWZpbmUgU09DQU1fQlVTX0ZMQUdTCShTT0NBTV9NQVNURVIgfCBcCi0JCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgXAotCQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8IFwKLQkJCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBV0lEVEhfOCkKKyNkZWZpbmUgU09DQU1fQlVTX0ZMQUdTCShWNEwyX01CVVNfTUFTVEVSIHwgXAorCQkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgXAorCQkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwgXAorCQkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gpCiAKIAogI2RlZmluZSBGSUZPX1NJWkUJCSgoVEhSRVNIT0xEX01BU0sgPj4gVEhSRVNIT0xEX1NISUZUKSArIDEpCkBAIC0xNDM4LDQxICsxNDM4LDU1IEBACiBzdGF0aWMgaW50IG9tYXAxX2NhbV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQlfX3UzMiBwaXhmbXQpCiB7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIGNvbW1vbl9mbGFnczsKIAl1MzIgY3RybGNsb2NrLCBtb2RlOwogCWludCByZXQ7CiAKLQljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7Ci0KLQljb21tb25fZmxhZ3MgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKLQkJCVNPQ0FNX0JVU19GTEFHUyk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogTWFrZSBjaG9pY2VzLCBwb3NzaWJseSBiYXNlZCBvbiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uICovCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCi0JCQkoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKLQkJaWYgKCFwY2Rldi0+cGRhdGEgfHwKLQkJCQlwY2Rldi0+cGRhdGEtPmZsYWdzICYgT01BUDFfQ0FNRVJBX0xDTEtfUklTSU5HKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOwotCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKCFyZXQpIHsKKwkJY29tbW9uX2ZsYWdzID0gc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUoJmNmZywgU09DQU1fQlVTX0ZMQUdTKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGRldiwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHgleFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBTT0NBTV9CVVNfRkxBR1MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQljb21tb25fZmxhZ3MgPSBTT0NBTV9CVVNfRkxBR1M7CiAJfQogCi0JcmV0ID0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBjb21tb25fZmxhZ3MpOwotCWlmIChyZXQgPCAwKQorCS8qIE1ha2UgY2hvaWNlcywgcG9zc2libHkgYmFzZWQgb24gcGxhdGZvcm0gY29uZmlndXJhdGlvbiAqLworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykgJiYKKwkJCShjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykpIHsKKwkJaWYgKCFwY2Rldi0+cGRhdGEgfHwKKwkJCQlwY2Rldi0+cGRhdGEtPmZsYWdzICYgT01BUDFfQ0FNRVJBX0xDTEtfUklTSU5HKQorCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKKwkJZWxzZQorCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HOworCX0KKworCWNmZy5mbGFncyA9IGNvbW1vbl9mbGFnczsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlkZXZfZGJnKGRldiwgImNhbWVyYSBzX21idXNfY29uZmlnKDB4JWx4KSByZXR1cm5lZCAlZFxuIiwKKwkJCWNvbW1vbl9mbGFncywgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAljdHJsY2xvY2sgPSBDQU1fUkVBRF9DQUNIRShwY2RldiwgQ1RSTENMT0NLKTsKIAlpZiAoY3RybGNsb2NrICYgTENMS19FTikKIAkJQ0FNX1dSSVRFKHBjZGV2LCBDVFJMQ0xPQ0ssIGN0cmxjbG9jayAmIH5MQ0xLX0VOKTsKIAotCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpIHsKKwlpZiAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykgewogCQlkZXZfZGJnKGRldiwgIkNUUkxDTE9DS19SRUcgfD0gUE9MQ0xLXG4iKTsKIAkJY3RybGNsb2NrIHw9IFBPTENMSzsKIAl9IGVsc2UgewpAQCAtMTU2NSwxMCArMTU3OSwxMCBAQAogCXBjZGV2LT5jbGsgPSBjbGs7CiAKIAlwY2Rldi0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlwY2Rldi0+cGZsYWdzID0gcGNkZXYtPnBkYXRhLT5mbGFnczsKLQotCWlmIChwY2Rldi0+cGRhdGEpCisJaWYgKHBjZGV2LT5wZGF0YSkgeworCQlwY2Rldi0+cGZsYWdzID0gcGNkZXYtPnBkYXRhLT5mbGFnczsKIAkJcGNkZXYtPmNhbWV4Y2xrID0gcGNkZXYtPnBkYXRhLT5jYW1leGNsa19raHogKiAxMDAwOworCX0KIAogCXN3aXRjaCAocGNkZXYtPmNhbWV4Y2xrKSB7CiAJY2FzZSA2MDAwMDAwOgpAQCAtMTU3OCw2ICsxNTkyLDcgQEAKIAljYXNlIDI0MDAwMDAwOgogCQlicmVhazsKIAlkZWZhdWx0OgorCQkvKiBwY2Rldi0+Y2FtZXhjbGsgIT0gMCA9PiBwY2Rldi0+cGRhdGEgIT0gTlVMTCAqLwogCQlkZXZfd2FybigmcGRldi0+ZGV2LAogCQkJCSJJbmNvcnJlY3Qgc2Vuc29yIGNsb2NrIGZyZXF1ZW5jeSAlbGQga0h6LCAiCiAJCQkJInNob3VsZCBiZSBvbmUgb2YgMCwgNiwgOCwgOS42LCAxMiBvciAyNCBNSHosICIKQEAgLTE1ODUsOCArMTYwMCw3IEBACiAJCQkJcGNkZXYtPnBkYXRhLT5jYW1leGNsa19raHopOwogCQlwY2Rldi0+Y2FtZXhjbGsgPSAwOwogCWNhc2UgMDoKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwKLQkJCQkiTm90IHByb3ZpZGluZyBzZW5zb3IgY2xvY2tcbiIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTm90IHByb3ZpZGluZyBzZW5zb3IgY2xvY2tcbiIpOwogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZwY2Rldi0+Y2FwdHVyZSk7CkBAIC0xNzE2LDUgKzE3MzAsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQMSBDYW1lcmEgSW50ZXJmYWNlIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiSmFudXN6IEtyenlzenRvZmlrIDxqa3J6eXN6dEB0aXMuaWNuZXQucGw+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfTElDRU5TRShEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCmluZGV4IGViOTdiZmYuLjQ1NTIyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9NYWtlZmlsZQppbmRleCBiMWIzNDQ3Ny4uZTg4NDdlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL01ha2VmaWxlCkBAIC0xLDggKzEsNiBAQAogIyBNYWtlZmlsZSBmb3IgT01BUDMgSVNQIGRyaXZlcgogCi1pZmRlZiBDT05GSUdfVklERU9fT01BUDNfREVCVUcKLUVYVFJBX0NGTEFHUyArPSAtRERFQlVHCi1lbmRpZgorY2NmbGFncy0kKENPTkZJR19WSURFT19PTUFQM19ERUJVRykgKz0gLURERUJVRwogCiBvbWFwMy1pc3Atb2JqcyArPSBcCiAJaXNwLm8gaXNwcXVldWUubyBpc3B2aWRlby5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCmluZGV4IDVjZWEyYmIuLmI4MThjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYwpAQCAtODAsNiArODAsMTMgQEAKICNpbmNsdWRlICJpc3BoM2EuaCIKICNpbmNsdWRlICJpc3BoaXN0LmgiCiAKKy8qCisgKiB0aGlzIGlzIHByb3ZpZGVkIGFzIGFuIGludGVyaW0gc29sdXRpb24gdW50aWwgb21hcDNpc3AgZG9lc24ndCBuZWVkCisgKiBhbnkgb21hcC1zcGVjaWZpYyBpb21tdSBBUEkKKyAqLworI2RlZmluZSB0b19pb21tdShkZXYpCQkJCQkJCVwKKwkoc3RydWN0IG9tYXBfaW9tbXUgKilwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSkKKwogc3RhdGljIHVuc2lnbmVkIGludCBhdXRvaWRsZTsKIG1vZHVsZV9wYXJhbShhdXRvaWRsZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXV0b2lkbGUsICJFbmFibGUgT01BUDNJU1AgQVVUT0lETEUgc3VwcG9ydCIpOwpAQCAtNzMyLDcgKzczOSw3IEBACiAJc3RydWN0IG1lZGlhX3BhZCAqcGFkOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwaXBlLT5sb2NrLCBmbGFncyk7CiAJcGlwZS0+c3RhdGUgJj0gfihJU1BfUElQRUxJTkVfSURMRV9JTlBVVCB8IElTUF9QSVBFTElORV9JRExFX09VVFBVVCk7CkBAIC03NTYsNyArNzYzLDcgQEAKIAogCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHN1YmRldiwgdmlkZW8sIHNfc3RyZWFtLCBtb2RlKTsKIAkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkKLQkJCWJyZWFrOworCQkJcmV0dXJuIHJldDsKIAogCQlpZiAoc3ViZGV2ID09ICZpc3AtPmlzcF9jY2RjLnN1YmRldikgewogCQkJdjRsMl9zdWJkZXZfY2FsbCgmaXNwLT5pc3BfYWV3Yi5zdWJkZXYsIHZpZGVvLApAQCAtNzc3LDcgKzc4NCw3IEBACiAJaWYgKHBpcGUtPmRvX3Byb3BhZ2F0aW9uICYmIG1vZGUgPT0gSVNQX1BJUEVMSU5FX1NUUkVBTV9TSU5HTEVTSE9UKQogCQlhdG9taWNfaW5jKCZwaXBlLT5mcmFtZV9udW1iZXIpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpc3BfcGlwZWxpbmVfd2FpdF9yZXNpemVyKHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCkBAIC0xMTA4LDcgKzExMTUsNyBAQAogewogCWlzcF9zYXZlX2NvbnRleHQoaXNwLCBpc3BfcmVnX2xpc3QpOwogCWlmIChpc3AtPmlvbW11KQotCQlpb21tdV9zYXZlX2N0eChpc3AtPmlvbW11KTsKKwkJb21hcF9pb21tdV9zYXZlX2N0eChpc3AtPmlvbW11KTsKIH0KIAogLyoKQEAgLTExMjIsNyArMTEyOSw3IEBACiB7CiAJaXNwX3Jlc3RvcmVfY29udGV4dChpc3AsIGlzcF9yZWdfbGlzdCk7CiAJaWYgKGlzcC0+aW9tbXUpCi0JCWlvbW11X3Jlc3RvcmVfY3R4KGlzcC0+aW9tbXUpOworCQlvbWFwX2lvbW11X3Jlc3RvcmVfY3R4KGlzcC0+aW9tbXUpOwogCW9tYXAzaXNwX2NjZGNfcmVzdG9yZV9jb250ZXh0KGlzcCk7CiAJb21hcDNpc3BfcHJldmlld19yZXN0b3JlX2NvbnRleHQoaXNwKTsKIH0KQEAgLTE2OTcsNiArMTcwNCw3IEBACiAJaXNwLT5tZWRpYV9kZXYuZGV2ID0gaXNwLT5kZXY7CiAJc3RybGNweShpc3AtPm1lZGlhX2Rldi5tb2RlbCwgIlRJIE9NQVAzIElTUCIsCiAJCXNpemVvZihpc3AtPm1lZGlhX2Rldi5tb2RlbCkpOworCWlzcC0+bWVkaWFfZGV2Lmh3X3JldmlzaW9uID0gaXNwLT5yZXZpc2lvbjsKIAlpc3AtPm1lZGlhX2Rldi5saW5rX25vdGlmeSA9IGlzcF9waXBlbGluZV9saW5rX25vdGlmeTsKIAlyZXQgPSBtZWRpYV9kZXZpY2VfcmVnaXN0ZXIoJmlzcC0+bWVkaWFfZGV2KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTk3NSw3ICsxOTgzLDggQEAKIAlpc3BfY2xlYW51cF9tb2R1bGVzKGlzcCk7CiAKIAlvbWFwM2lzcF9nZXQoaXNwKTsKLQlpb21tdV9wdXQoaXNwLT5pb21tdSk7CisJaW9tbXVfZGV0YWNoX2RldmljZShpc3AtPmRvbWFpbiwgaXNwLT5pb21tdV9kZXYpOworCWlvbW11X2RvbWFpbl9mcmVlKGlzcC0+ZG9tYWluKTsKIAlvbWFwM2lzcF9wdXQoaXNwKTsKIAogCWZyZWVfaXJxKGlzcC0+aXJxX251bSwgaXNwKTsKQEAgLTIxMjMsMjUgKzIxMzIsNDEgQEAKIAl9CiAKIAkvKiBJT01NVSAqLwotCWlzcC0+aW9tbXUgPSBpb21tdV9nZXQoImlzcCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChpc3AtPmlvbW11KSkgewotCQlpc3AtPmlvbW11ID0gTlVMTDsKKwlpc3AtPmlvbW11X2RldiA9IG9tYXBfZmluZF9pb21tdV9kZXZpY2UoImlzcCIpOworCWlmICghaXNwLT5pb21tdV9kZXYpIHsKKwkJZGV2X2Vycihpc3AtPmRldiwgIm9tYXBfZmluZF9pb21tdV9kZXZpY2UgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcl9pc3A7CiAJfQogCisJLyogdG8gYmUgcmVtb3ZlZCBvbmNlIGlvbW11IG1pZ3JhdGlvbiBpcyBjb21wbGV0ZSAqLworCWlzcC0+aW9tbXUgPSB0b19pb21tdShpc3AtPmlvbW11X2Rldik7CisKKwlpc3AtPmRvbWFpbiA9IGlvbW11X2RvbWFpbl9hbGxvYyhwZGV2LT5kZXYuYnVzKTsKKwlpZiAoIWlzcC0+ZG9tYWluKSB7CisJCWRldl9lcnIoaXNwLT5kZXYsICJjYW4ndCBhbGxvYyBpb21tdSBkb21haW5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2lzcDsKKwl9CisKKwlyZXQgPSBpb21tdV9hdHRhY2hfZGV2aWNlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11X2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhdHRhY2ggaW9tbXUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBmcmVlX2RvbWFpbjsKKwl9CisKIAkvKiBJbnRlcnJ1cHQgKi8KIAlpc3AtPmlycV9udW0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChpc3AtPmlycV9udW0gPD0gMCkgewogCQlkZXZfZXJyKGlzcC0+ZGV2LCAiTm8gSVJRIHJlc291cmNlXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl9pc3A7CisJCWdvdG8gZGV0YWNoX2RldjsKIAl9CiAKIAlpZiAocmVxdWVzdF9pcnEoaXNwLT5pcnFfbnVtLCBpc3BfaXNyLCBJUlFGX1NIQVJFRCwgIk9NQVAzIElTUCIsIGlzcCkpIHsKIAkJZGV2X2Vycihpc3AtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IElSUVxuIik7CiAJCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3JfaXNwOworCQlnb3RvIGRldGFjaF9kZXY7CiAJfQogCiAJLyogRW50aXRpZXMgKi8KQEAgLTIxNjIsOCArMjE4NywxMSBAQAogCWlzcF9jbGVhbnVwX21vZHVsZXMoaXNwKTsKIGVycm9yX2lycToKIAlmcmVlX2lycShpc3AtPmlycV9udW0sIGlzcCk7CitkZXRhY2hfZGV2OgorCWlvbW11X2RldGFjaF9kZXZpY2UoaXNwLT5kb21haW4sIGlzcC0+aW9tbXVfZGV2KTsKK2ZyZWVfZG9tYWluOgorCWlvbW11X2RvbWFpbl9mcmVlKGlzcC0+ZG9tYWluKTsKIGVycm9yX2lzcDoKLQlpb21tdV9wdXQoaXNwLT5pb21tdSk7CiAJb21hcDNpc3BfcHV0KGlzcCk7CiBlcnJvcjoKIAlpc3BfcHV0X2Nsb2Nrcyhpc3ApOwpAQCAtMjE4Myw2ICsyMjExLDggQEAKIAlyZWd1bGF0b3JfcHV0KGlzcC0+aXNwX2NzaXBoeTIudmRkKTsKIAlyZWd1bGF0b3JfcHV0KGlzcC0+aXNwX2NzaXBoeTEudmRkKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCW11dGV4X2Rlc3Ryb3koJmlzcC0+aXNwX211dGV4KTsKIAlrZnJlZShpc3ApOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5oCmluZGV4IDUyOWU1ODIuLjcwNTk0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuaApAQCAtMjcsMTEgKzI3LDEzIEBACiAjaWZuZGVmIE9NQVAzX0lTUF9DT1JFX0gKICNkZWZpbmUgT01BUDNfSVNQX0NPUkVfSAogCisjaW5jbHVkZSA8bWVkaWEvb21hcDNpc3AuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CiAjaW5jbHVkZSA8cGxhdC9pb21tdS5oPgogI2luY2x1ZGUgPHBsYXQvaW92bW0uaD4KIApAQCAtOTQsMTQgKzk2LDYgQEAKIAlPTUFQM19JU1BfU1VCQ0xLX1JFU0laRVIJPSAoMSA8PCA0KSwKIH07CiAKLWVudW0gaXNwX2ludGVyZmFjZV90eXBlIHsKLQlJU1BfSU5URVJGQUNFX1BBUkFMTEVMLAotCUlTUF9JTlRFUkZBQ0VfQ1NJMkFfUEhZMiwKLQlJU1BfSU5URVJGQUNFX0NDUDJCX1BIWTEsCi0JSVNQX0lOVEVSRkFDRV9DQ1AyQl9QSFkyLAotCUlTUF9JTlRFUkZBQ0VfQ1NJMkNfUEhZMSwKLX07Ci0KIC8qIElTUDogT01BUCAzNHh4IEVTIDEuMCAqLwogI2RlZmluZSBJU1BfUkVWSVNJT05fMV8wCQkweDEwCiAvKiBJU1AyOiBPTUFQIDM0eHggRVMgMi4wLCAyLjEgYW5kIDMuMCAqLwpAQCAtMTMwLDgyICsxMjQsNiBAQAogCXUzMiB2YWw7CiB9OwogCi0vKioKLSAqIHN0cnVjdCBpc3BfcGFyYWxsZWxfcGxhdGZvcm1fZGF0YSAtIFBhcmFsbGVsIGludGVyZmFjZSBwbGF0Zm9ybSBkYXRhCi0gKiBAZGF0YV9sYW5lX3NoaWZ0OiBEYXRhIGxhbmUgc2hpZnRlcgotICoJCTAgLSBDQU1FWFRbMTM6MF0gLT4gQ0FNWzEzOjBdCi0gKgkJMSAtIENBTUVYVFsxMzoyXSAtPiBDQU1bMTE6MF0KLSAqCQkyIC0gQ0FNRVhUWzEzOjRdIC0+IENBTVs5OjBdCi0gKgkJMyAtIENBTUVYVFsxMzo2XSAtPiBDQU1bNzowXQotICogQGNsa19wb2w6IFBpeGVsIGNsb2NrIHBvbGFyaXR5Ci0gKgkJMCAtIE5vbiBJbnZlcnRlZCwgMSAtIEludmVydGVkCi0gKiBAaHNfcG9sOiBIb3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBwb2xhcml0eQotICoJCTAgLSBBY3RpdmUgaGlnaCwgMSAtIEFjdGl2ZSBsb3cKLSAqIEB2c19wb2w6IFZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb2xhcml0eQotICoJCTAgLSBBY3RpdmUgaGlnaCwgMSAtIEFjdGl2ZSBsb3cKLSAqIEBicmlkZ2U6IENDREMgQnJpZGdlIGlucHV0IGNvbnRyb2wKLSAqCQlJU1BDVFJMX1BBUl9CUklER0VfRElTQUJMRSAtIERpc2FibGUKLSAqCQlJU1BDVFJMX1BBUl9CUklER0VfTEVORElBTiAtIExpdHRsZSBlbmRpYW4KLSAqCQlJU1BDVFJMX1BBUl9CUklER0VfQkVORElBTiAtIEJpZyBlbmRpYW4KLSAqLwotc3RydWN0IGlzcF9wYXJhbGxlbF9wbGF0Zm9ybV9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgZGF0YV9sYW5lX3NoaWZ0OjI7Ci0JdW5zaWduZWQgaW50IGNsa19wb2w6MTsKLQl1bnNpZ25lZCBpbnQgaHNfcG9sOjE7Ci0JdW5zaWduZWQgaW50IHZzX3BvbDoxOwotCXVuc2lnbmVkIGludCBicmlkZ2U6NDsKLX07Ci0KLS8qKgotICogc3RydWN0IGlzcF9jY3AyX3BsYXRmb3JtX2RhdGEgLSBDQ1AyIGludGVyZmFjZSBwbGF0Zm9ybSBkYXRhCi0gKiBAc3Ryb2JlX2Nsa19wb2w6IFN0cm9iZS9jbG9jayBwb2xhcml0eQotICoJCTAgLSBOb24gSW52ZXJ0ZWQsIDEgLSBJbnZlcnRlZAotICogQGNyYzogRW5hYmxlIHRoZSBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjawotICogQGNjcDJfbW9kZTogRW5hYmxlIENDUDIgY29tcGF0aWJpbGl0eSBtb2RlCi0gKgkJMCAtIE1JUEktQ1NJMSBtb2RlLCAxIC0gQ0NQMiBtb2RlCi0gKiBAcGh5X2xheWVyOiBQaHlzaWNhbCBsYXllciBzZWxlY3Rpb24KLSAqCQlJU1BDQ1AyX0NUUkxfUEhZX1NFTF9DTE9DSyAtIERhdGEvY2xvY2sgcGh5c2ljYWwgbGF5ZXIKLSAqCQlJU1BDQ1AyX0NUUkxfUEhZX1NFTF9TVFJPQkUgLSBEYXRhL3N0cm9iZSBwaHlzaWNhbCBsYXllcgotICogQHZwY2xrX2RpdjogVmlkZW8gcG9ydCBvdXRwdXQgY2xvY2sgY29udHJvbAotICovCi1zdHJ1Y3QgaXNwX2NjcDJfcGxhdGZvcm1fZGF0YSB7Ci0JdW5zaWduZWQgaW50IHN0cm9iZV9jbGtfcG9sOjE7Ci0JdW5zaWduZWQgaW50IGNyYzoxOwotCXVuc2lnbmVkIGludCBjY3AyX21vZGU6MTsKLQl1bnNpZ25lZCBpbnQgcGh5X2xheWVyOjE7Ci0JdW5zaWduZWQgaW50IHZwY2xrX2RpdjoyOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXNwX2NzaTJfcGxhdGZvcm1fZGF0YSAtIENTSTIgaW50ZXJmYWNlIHBsYXRmb3JtIGRhdGEKLSAqIEBjcmM6IEVuYWJsZSB0aGUgY3ljbGljIHJlZHVuZGFuY3kgY2hlY2sKLSAqIEB2cGNsa19kaXY6IFZpZGVvIHBvcnQgb3V0cHV0IGNsb2NrIGNvbnRyb2wKLSAqLwotc3RydWN0IGlzcF9jc2kyX3BsYXRmb3JtX2RhdGEgewotCXVuc2lnbmVkIGNyYzoxOwotCXVuc2lnbmVkIHZwY2xrX2RpdjoyOwotfTsKLQotc3RydWN0IGlzcF9zdWJkZXZfaTJjX2JvYXJkX2luZm8gewotCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqYm9hcmRfaW5mbzsKLQlpbnQgaTJjX2FkYXB0ZXJfaWQ7Ci19OwotCi1zdHJ1Y3QgaXNwX3Y0bDJfc3ViZGV2c19ncm91cCB7Ci0Jc3RydWN0IGlzcF9zdWJkZXZfaTJjX2JvYXJkX2luZm8gKnN1YmRldnM7Ci0JZW51bSBpc3BfaW50ZXJmYWNlX3R5cGUgaW50ZXJmYWNlOwotCXVuaW9uIHsKLQkJc3RydWN0IGlzcF9wYXJhbGxlbF9wbGF0Zm9ybV9kYXRhIHBhcmFsbGVsOwotCQlzdHJ1Y3QgaXNwX2NjcDJfcGxhdGZvcm1fZGF0YSBjY3AyOwotCQlzdHJ1Y3QgaXNwX2NzaTJfcGxhdGZvcm1fZGF0YSBjc2kyOwotCX0gYnVzOyAvKiBnY2MgPCA0LjYuMCBjaG9rZXMgb24gYW5vbnltb3VzIHVuaW9uIGluaXRpYWxpemVycyAqLwotfTsKLQotc3RydWN0IGlzcF9wbGF0Zm9ybV9kYXRhIHsKLQlzdHJ1Y3QgaXNwX3Y0bDJfc3ViZGV2c19ncm91cCAqc3ViZGV2czsKLQl2b2lkICgqc2V0X2NvbnN0cmFpbnRzKShzdHJ1Y3QgaXNwX2RldmljZSAqaXNwLCBib29sIGVuYWJsZSk7Ci19OwotCiBzdHJ1Y3QgaXNwX3BsYXRmb3JtX2NhbGxiYWNrIHsKIAl1MzIgKCpzZXRfeGNsaykoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCwgdTMyIHhjbGssIHU4IHhjbGtzZWwpOwogCWludCAoKmNzaXBoeV9jb25maWcpKHN0cnVjdCBpc3BfY3NpcGh5ICpwaHksCkBAIC0yOTQsNyArMjEyLDkgQEAKIAl1bnNpZ25lZCBpbnQgc2JsX3Jlc291cmNlczsKIAl1bnNpZ25lZCBpbnQgc3ViY2xrX3Jlc291cmNlczsKIAotCXN0cnVjdCBpb21tdSAqaW9tbXU7CisJc3RydWN0IG9tYXBfaW9tbXUgKmlvbW11OworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgZGV2aWNlICppb21tdV9kZXY7CiAKIAlzdHJ1Y3QgaXNwX3BsYXRmb3JtX2NhbGxiYWNrIHBsYXRmb3JtX2NiOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY2RjLmMKaW5kZXggODA3OTZlYi4uYjBiMGZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY2RjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY2RjLmMKQEAgLTM2Niw3ICszNjYsNyBAQAogCQlkbWFfdW5tYXBfc2coaXNwLT5kZXYsIHJlcS0+aW92bS0+c2d0LT5zZ2wsCiAJCQkgICAgIHJlcS0+aW92bS0+c2d0LT5uZW50cywgRE1BX1RPX0RFVklDRSk7CiAJaWYgKHJlcS0+dGFibGUpCi0JCWlvbW11X3ZmcmVlKGlzcC0+aW9tbXUsIHJlcS0+dGFibGUpOworCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LCByZXEtPnRhYmxlKTsKIAlrZnJlZShyZXEpOwogfQogCkBAIC00MzgsMTUgKzQzOCwxNSBAQAogCiAJCXJlcS0+ZW5hYmxlID0gMTsKIAotCQlyZXEtPnRhYmxlID0gaW9tbXVfdm1hbGxvYyhpc3AtPmlvbW11LCAwLCByZXEtPmNvbmZpZy5zaXplLAotCQkJCQkgICBJT01NVV9GTEFHKTsKKwkJcmVxLT50YWJsZSA9IG9tYXBfaW9tbXVfdm1hbGxvYyhpc3AtPmRvbWFpbiwgaXNwLT5pb21tdSwgMCwKKwkJCQkJcmVxLT5jb25maWcuc2l6ZSwgSU9NTVVfRkxBRyk7CiAJCWlmIChJU19FUlJfVkFMVUUocmVxLT50YWJsZSkpIHsKIAkJCXJlcS0+dGFibGUgPSAwOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCXJlcS0+aW92bSA9IGZpbmRfaW92bV9hcmVhKGlzcC0+aW9tbXUsIHJlcS0+dGFibGUpOworCQlyZXEtPmlvdm0gPSBvbWFwX2ZpbmRfaW92bV9hcmVhKGlzcC0+aW9tbXUsIHJlcS0+dGFibGUpOwogCQlpZiAocmVxLT5pb3ZtID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGRvbmU7CkBAIC00NjIsNyArNDYyLDcgQEAKIAkJZG1hX3N5bmNfc2dfZm9yX2NwdShpc3AtPmRldiwgcmVxLT5pb3ZtLT5zZ3QtPnNnbCwKIAkJCQkgICAgcmVxLT5pb3ZtLT5zZ3QtPm5lbnRzLCBETUFfVE9fREVWSUNFKTsKIAotCQl0YWJsZSA9IGRhX3RvX3ZhKGlzcC0+aW9tbXUsIHJlcS0+dGFibGUpOworCQl0YWJsZSA9IG9tYXBfZGFfdG9fdmEoaXNwLT5pb21tdSwgcmVxLT50YWJsZSk7CiAJCWlmIChjb3B5X2Zyb21fdXNlcih0YWJsZSwgY29uZmlnLT5sc2MsIHJlcS0+Y29uZmlnLnNpemUpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBkb25lOwpAQCAtNzMxLDE4ICs3MzEsMTkgQEAKIAogCQkJLyoKIAkJCSAqIHRhYmxlX25ldyBtdXN0IGJlIDY0LWJ5dGVzIGFsaWduZWQsIGJ1dCBpdCdzCi0JCQkgKiBhbHJlYWR5IGRvbmUgYnkgaW9tbXVfdm1hbGxvYygpLgorCQkJICogYWxyZWFkeSBkb25lIGJ5IG9tYXBfaW9tbXVfdm1hbGxvYygpLgogCQkJICovCiAJCQlzaXplID0gY2NkYy0+ZnBjLmZwbnVtICogNDsKLQkJCXRhYmxlX25ldyA9IGlvbW11X3ZtYWxsb2MoaXNwLT5pb21tdSwgMCwgc2l6ZSwKLQkJCQkJCSAgSU9NTVVfRkxBRyk7CisJCQl0YWJsZV9uZXcgPSBvbWFwX2lvbW11X3ZtYWxsb2MoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsCisJCQkJCQkJMCwgc2l6ZSwgSU9NTVVfRkxBRyk7CiAJCQlpZiAoSVNfRVJSX1ZBTFVFKHRhYmxlX25ldykpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkYV90b192YShpc3AtPmlvbW11LCB0YWJsZV9uZXcpLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKG9tYXBfZGFfdG9fdmEoaXNwLT5pb21tdSwgdGFibGVfbmV3KSwKIAkJCQkJICAgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikKIAkJCQkJICAgY2NkYy0+ZnBjLmZwY2FkZHIsIHNpemUpKSB7Ci0JCQkJaW9tbXVfdmZyZWUoaXNwLT5pb21tdSwgdGFibGVfbmV3KTsKKwkJCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LAorCQkJCQkJCQl0YWJsZV9uZXcpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCkBAIC03NTIsNyArNzUzLDcgQEAKIAogCQljY2RjX2NvbmZpZ3VyZV9mcGMoY2NkYyk7CiAJCWlmICh0YWJsZV9vbGQgIT0gMCkKLQkJCWlvbW11X3ZmcmVlKGlzcC0+aW9tbXUsIHRhYmxlX29sZCk7CisJCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LCB0YWJsZV9vbGQpOwogCX0KIAogCXJldHVybiBjY2RjX2xzY19jb25maWcoY2NkYywgY2NkY19zdHJ1Y3QpOwpAQCAtMTQwNSwxMSArMTQwNiwxNCBAQAogCiBzdGF0aWMgdm9pZCBjY2RjX2hzX3ZzX2lzcihzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjKQogeworCXN0cnVjdCBpc3BfcGlwZWxpbmUgKnBpcGUgPQorCQl0b19pc3BfcGlwZWxpbmUoJmNjZGMtPnZpZGVvX291dC52aWRlby5lbnRpdHkpOwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSAmY2NkYy0+c3ViZGV2LmRldm5vZGU7CiAJc3RydWN0IHY0bDJfZXZlbnQgZXZlbnQ7CiAKIAltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQlldmVudC50eXBlID0gVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUzsKKwlldmVudC50eXBlID0gVjRMMl9FVkVOVF9GUkFNRV9TWU5DOworCWV2ZW50LnUuZnJhbWVfc3luYy5mcmFtZV9zZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZwaXBlLT5mcmFtZV9udW1iZXIpOwogCiAJdjRsMl9ldmVudF9xdWV1ZSh2ZGV2LCAmZXZlbnQpOwogfQpAQCAtMTY5MSw3ICsxNjk1LDExIEBACiBzdGF0aWMgaW50IGNjZGNfc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZoICpmaCwKIAkJCQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKIHsKLQlpZiAoc3ViLT50eXBlICE9IFY0TDJfRVZFTlRfT01BUDNJU1BfSFNfVlMpCisJaWYgKHN1Yi0+dHlwZSAhPSBWNEwyX0VWRU5UX0ZSQU1FX1NZTkMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbGluZSBudW1iZXIgaXMgemVybyBhdCBmcmFtZSBzdGFydCAqLworCWlmIChzdWItPmlkICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIE9NQVAzSVNQX0NDRENfTkVWRU5UUyk7CkBAIC0xODI4LDcgKzE4MzYsNyBAQAogCQkgKiBjYWxsZXJzIHRvIHJlcXVlc3QgYW4gb3V0cHV0IHNpemUgYmlnZ2VyIHRoYW4gdGhlIGlucHV0IHNpemUKIAkJICogdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYuCiAJCSAqLwotCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAzMiwgKGZtdC0+d2lkdGggKyAxNSkgJiB+MTUpOworCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIHdpZHRoLCAzMiwgZm10LT53aWR0aCArIDE1KTsKIAkJZm10LT53aWR0aCAmPSB+MTU7CiAJCWZtdC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGhlaWdodCwgMzIsIGZtdC0+aGVpZ2h0KTsKIAkJYnJlYWs7CkBAIC0yMTQ0LDYgKzIxNTIsMzcgQEAKIAkubGlua19zZXR1cCA9IGNjZGNfbGlua19zZXR1cCwKIH07CiAKK3ZvaWQgb21hcDNpc3BfY2NkY191bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY2NkY19kZXZpY2UgKmNjZGMpCit7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNjZGMtPnN1YmRldik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmY2NkYy0+dmlkZW9fb3V0KTsKK30KKworaW50IG9tYXAzaXNwX2NjZGNfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY2RjX2RldmljZSAqY2NkYywKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpCit7CisJaW50IHJldDsKKworCS8qIFJlZ2lzdGVyIHRoZSBzdWJkZXYgYW5kIHZpZGVvIG5vZGUuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjY2RjLT5zdWJkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNjZGMtPnZpZGVvX291dCwgdmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJb21hcDNpc3BfY2NkY191bnJlZ2lzdGVyX2VudGl0aWVzKGNjZGMpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1AgQ0NEQyBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cAorICovCisKIC8qCiAgKiBjY2RjX2luaXRfZW50aXRpZXMgLSBJbml0aWFsaXplIFY0TDIgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkKICAqIEBjY2RjOiBJU1AgQ0NEQyBtb2R1bGUKQEAgLTIxODUsNTAgKzIyMjQsMjMgQEAKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJmNjZGMtPnZpZGVvX291dCwgIkNDREMiKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlbzsKIAogCS8qIENvbm5lY3QgdGhlIENDREMgc3ViZGV2IHRvIHRoZSB2aWRlbyBub2RlLiAqLwogCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmY2NkYy0+c3ViZGV2LmVudGl0eSwgQ0NEQ19QQURfU09VUkNFX09GLAogCQkJJmNjZGMtPnZpZGVvX291dC52aWRlby5lbnRpdHksIDAsIDApOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgb21hcDNpc3BfY2NkY191bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY2NkY19kZXZpY2UgKmNjZGMpCi17Ci0JbWVkaWFfZW50aXR5X2NsZWFudXAoJmNjZGMtPnN1YmRldi5lbnRpdHkpOwotCi0JdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNjZGMtPnN1YmRldik7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmY2NkYy0+dmlkZW9fb3V0KTsKLX0KLQotaW50IG9tYXAzaXNwX2NjZGNfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY2RjX2RldmljZSAqY2NkYywKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpCi17Ci0JaW50IHJldDsKLQotCS8qIFJlZ2lzdGVyIHRoZSBzdWJkZXYgYW5kIHZpZGVvIG5vZGUuICovCi0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjY2RjLT5zdWJkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNjZGMtPnZpZGVvX291dCwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldHVybiAwOwogCi1lcnJvcjoKLQlvbWFwM2lzcF9jY2RjX3VucmVnaXN0ZXJfZW50aXRpZXMoY2NkYyk7CitlcnJvcl9saW5rOgorCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJmNjZGMtPnZpZGVvX291dCk7CitlcnJvcl92aWRlbzoKKwltZWRpYV9lbnRpdHlfY2xlYW51cChtZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIElTUCBDQ0RDIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCi0gKi8KLQogLyoKICAqIG9tYXAzaXNwX2NjZGNfaW5pdCAtIENDREMgbW9kdWxlIGluaXRpYWxpemF0aW9uLgogICogQGRldjogRGV2aWNlIHBvaW50ZXIgc3BlY2lmaWMgdG8gdGhlIE9NQVAzIElTUC4KQEAgLTIyNDAsNiArMjI1Miw3IEBACiBpbnQgb21hcDNpc3BfY2NkY19pbml0KHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCiB7CiAJc3RydWN0IGlzcF9jY2RjX2RldmljZSAqY2NkYyA9ICZpc3AtPmlzcF9jY2RjOworCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmY2NkYy0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2NkYy0+d2FpdCk7CkBAIC0yMjY4LDcgKzIyODEsMTMgQEAKIAljY2RjLT51cGRhdGUgPSBPTUFQM0lTUF9DQ0RDX0JMQ0xBTVA7CiAJY2NkY19hcHBseV9jb250cm9scyhjY2RjKTsKIAotCXJldHVybiBjY2RjX2luaXRfZW50aXRpZXMoY2NkYyk7CisJcmV0ID0gY2NkY19pbml0X2VudGl0aWVzKGNjZGMpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X2Rlc3Ryb3koJmNjZGMtPmlvY3RsX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjI3OSw2ICsyMjk4LDkgQEAKIHsKIAlzdHJ1Y3QgaXNwX2NjZGNfZGV2aWNlICpjY2RjID0gJmlzcC0+aXNwX2NjZGM7CiAKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZjY2RjLT52aWRlb19vdXQpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZjY2RjLT5zdWJkZXYuZW50aXR5KTsKKwogCS8qIEZyZWUgTFNDIHJlcXVlc3RzLiBBcyB0aGUgQ0NEQyBpcyBzdG9wcGVkIHRoZXJlJ3Mgbm8gYWN0aXZlIHJlcXVlc3QsCiAJICogc28gb25seSB0aGUgcGVuZGluZyByZXF1ZXN0IGFuZCB0aGUgZnJlZSBxdWV1ZSBuZWVkIHRvIGJlIGhhbmRsZWQuCiAJICovCkBAIC0yMjg3LDUgKzIzMDksNyBAQAogCWNjZGNfbHNjX2ZyZWVfcXVldWUoY2NkYywgJmNjZGMtPmxzYy5mcmVlX3F1ZXVlKTsKIAogCWlmIChjY2RjLT5mcGMuZnBjYWRkciAhPSAwKQotCQlpb21tdV92ZnJlZShpc3AtPmlvbW11LCBjY2RjLT5mcGMuZnBjYWRkcik7CisJCW9tYXBfaW9tbXVfdmZyZWUoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsIGNjZGMtPmZwYy5mcGNhZGRyKTsKKworCW11dGV4X2Rlc3Ryb3koJmNjZGMtPmlvY3RsX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYwppbmRleCBlYzllMzk1Li45MDRjYThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYwpAQCAtMjQzLDkgKzI0Myw5IEBACiAKIAl2YWwgPSBpc3BfcmVnX3JlYWRsKGlzcCwgT01BUDNfSVNQX0lPTUVNX0NDUDIsIElTUENDUDJfQ1RSTCk7CiAJaWYgKCEodmFsICYgSVNQQ0NQMl9DVFJMX01PREUpKSB7Ci0JCWlmIChwZGF0YS0+Y2NwMl9tb2RlKQorCQlpZiAocGRhdGEtPmNjcDJfbW9kZSA9PSBJU1BfQ0NQMl9NT0RFX0NDUDIpCiAJCQlkZXZfd2Fybihpc3AtPmRldiwgIk9NQVAzIENDUDIgYnVzIG5vdCBhdmFpbGFibGVcbiIpOwotCQlpZiAocGRhdGEtPnBoeV9sYXllciA9PSBJU1BDQ1AyX0NUUkxfUEhZX1NFTF9TVFJPQkUpCisJCWlmIChwZGF0YS0+cGh5X2xheWVyID09IElTUF9DQ1AyX1BIWV9EQVRBX1NUUk9CRSkKIAkJCS8qIFN0cm9iZSBtb2RlIHJlcXVpcmVzIENDUDIgKi8KIAkJCXJldHVybiAtRUlPOwogCX0KQEAgLTEwMzIsNiArMTAzMiw0OCBAQAogfTsKIAogLyoKKyAqIG9tYXAzaXNwX2NjcDJfdW5yZWdpc3Rlcl9lbnRpdGllcyAtIFVucmVnaXN0ZXIgbWVkaWEgZW50aXRpZXM6IHN1YmRldgorICogQGNjcDI6IFBvaW50ZXIgdG8gSVNQIENDUDIgZGV2aWNlCisgKi8KK3ZvaWQgb21hcDNpc3BfY2NwMl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIpCit7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNjcDItPnN1YmRldik7CisJb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmY2NwMi0+dmlkZW9faW4pOworfQorCisvKgorICogb21hcDNpc3BfY2NwMl9yZWdpc3Rlcl9lbnRpdGllcyAtIFJlZ2lzdGVyIHRoZSBzdWJkZXYgbWVkaWEgZW50aXR5CisgKiBAY2NwMjogUG9pbnRlciB0byBJU1AgQ0NQMiBkZXZpY2UKKyAqIEB2ZGV2OiBQb2ludGVyIHRvIHY0bCBkZXZpY2UKKyAqIHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8gb24gc3VjY2VzcworICovCisKK2ludCBvbWFwM2lzcF9jY3AyX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIsCisJCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKK3sKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjY3AyLT5zdWJkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNjcDItPnZpZGVvX2luLCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlvbWFwM2lzcF9jY3AyX3VucmVnaXN0ZXJfZW50aXRpZXMoY2NwMik7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElTUCBjY3AyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCisgKi8KKworLyoKICAqIGNjcDJfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgY2NwMiBzdWJkZXYgYW5kIG1lZGlhIGVudGl0eS4KICAqIEBjY3AyOiBQb2ludGVyIHRvIElTUCBDQ1AyIGRldmljZQogICogcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVybyBvbiBzdWNjZXNzCkBAIC0xMDgzLDcyICsxMTI1LDIzIEBACiAKIAlyZXQgPSBvbWFwM2lzcF92aWRlb19pbml0KCZjY3AyLT52aWRlb19pbiwgIkNDUDIiKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlbzsKIAogCS8qIENvbm5lY3QgdGhlIHZpZGVvIG5vZGUgdG8gdGhlIGNjcDIgc3ViZGV2LiAqLwogCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmY2NwMi0+dmlkZW9faW4udmlkZW8uZW50aXR5LCAwLAogCQkJCSAgICAgICAmY2NwMi0+c3ViZGV2LmVudGl0eSwgQ0NQMl9QQURfU0lOSywgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldHVybiAwOwotfQogCi0vKgotICogb21hcDNpc3BfY2NwMl91bnJlZ2lzdGVyX2VudGl0aWVzIC0gVW5yZWdpc3RlciBtZWRpYSBlbnRpdGllczogc3ViZGV2Ci0gKiBAY2NwMjogUG9pbnRlciB0byBJU1AgQ0NQMiBkZXZpY2UKLSAqLwotdm9pZCBvbWFwM2lzcF9jY3AyX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9jY3AyX2RldmljZSAqY2NwMikKLXsKK2Vycm9yX2xpbms6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmY2NwMi0+dmlkZW9faW4pOworZXJyb3JfdmlkZW86CiAJbWVkaWFfZW50aXR5X2NsZWFudXAoJmNjcDItPnN1YmRldi5lbnRpdHkpOwotCi0JdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmNjcDItPnN1YmRldik7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmY2NwMi0+dmlkZW9faW4pOwotfQotCi0vKgotICogb21hcDNpc3BfY2NwMl9yZWdpc3Rlcl9lbnRpdGllcyAtIFJlZ2lzdGVyIHRoZSBzdWJkZXYgbWVkaWEgZW50aXR5Ci0gKiBAY2NwMjogUG9pbnRlciB0byBJU1AgQ0NQMiBkZXZpY2UKLSAqIEB2ZGV2OiBQb2ludGVyIHRvIHY0bCBkZXZpY2UKLSAqIHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8gb24gc3VjY2VzcwotICovCi0KLWludCBvbWFwM2lzcF9jY3AyX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIsCi0JCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKLXsKLQlpbnQgcmV0OwotCi0JLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCi0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjY3AyLT5zdWJkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNjcDItPnZpZGVvX2luLCB2ZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQlvbWFwM2lzcF9jY3AyX3VucmVnaXN0ZXJfZW50aXRpZXMoY2NwMik7CiAJcmV0dXJuIHJldDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIElTUCBjY3AyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCi0gKi8KLQotLyoKLSAqIG9tYXAzaXNwX2NjcDJfY2xlYW51cCAtIENDUDIgdW4taW5pdGlhbGl6YXRpb24KLSAqIEBpc3AgOiBQb2ludGVyIHRvIElTUCBkZXZpY2UKLSAqLwotdm9pZCBvbWFwM2lzcF9jY3AyX2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKLXsKLQlzdHJ1Y3QgaXNwX2NjcDJfZGV2aWNlICpjY3AyID0gJmlzcC0+aXNwX2NjcDI7Ci0KLQlyZWd1bGF0b3JfcHV0KGNjcDItPnZkZHNfY3NpYik7Ci19Ci0KIC8qCiAgKiBvbWFwM2lzcF9jY3AyX2luaXQgLSBDQ1AyIGluaXRpYWxpemF0aW9uLgogICogQGlzcCA6IFBvaW50ZXIgdG8gSVNQIGRldmljZQpAQCAtMTE4NCwxMyArMTE3NywyNSBAQAogCX0KIAogCXJldCA9IGNjcDJfaW5pdF9lbnRpdGllcyhjY3AyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKHJldCA8IDApIHsKKwkJcmVndWxhdG9yX3B1dChjY3AyLT52ZGRzX2NzaWIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCWNjcDJfcmVzZXQoY2NwMik7Ci1vdXQ6Ci0JaWYgKHJldCkKLQkJb21hcDNpc3BfY2NwMl9jbGVhbnVwKGlzcCk7CisJcmV0dXJuIDA7Cit9CiAKLQlyZXR1cm4gcmV0OworLyoKKyAqIG9tYXAzaXNwX2NjcDJfY2xlYW51cCAtIENDUDIgdW4taW5pdGlhbGl6YXRpb24KKyAqIEBpc3AgOiBQb2ludGVyIHRvIElTUCBkZXZpY2UKKyAqLwordm9pZCBvbWFwM2lzcF9jY3AyX2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKK3sKKwlzdHJ1Y3QgaXNwX2NjcDJfZGV2aWNlICpjY3AyID0gJmlzcC0+aXNwX2NjcDI7CisKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZjY3AyLT52aWRlb19pbik7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmNjcDItPnN1YmRldi5lbnRpdHkpOworCisJcmVndWxhdG9yX3B1dChjY3AyLT52ZGRzX2NzaWIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3Bjc2kyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNzaTIuYwppbmRleCA2OTE2MWE2Li4wYzVmMWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNzaTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNzaTIuYwpAQCAtMTE4Nyw2ICsxMTg3LDM3IEBACiAJLmxpbmtfc2V0dXAgPSBjc2kyX2xpbmtfc2V0dXAsCiB9OwogCit2b2lkIG9tYXAzaXNwX2NzaTJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX2NzaTJfZGV2aWNlICpjc2kyKQoreworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZjc2kyLT5zdWJkZXYpOworCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJmNzaTItPnZpZGVvX291dCk7Cit9CisKK2ludCBvbWFwM2lzcF9jc2kyX3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTIsCisJCQkJICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKK3sKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZjc2kyLT5zdWJkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJmNzaTItPnZpZGVvX291dCwgdmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJb21hcDNpc3BfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKGNzaTIpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1AgQ1NJMiBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cAorICovCisKIC8qCiAgKiBjc2kyX2luaXRfZW50aXRpZXMgLSBJbml0aWFsaXplIHN1YmRldiBhbmQgbWVkaWEgZW50aXR5LgogICogQGNzaTI6IFBvaW50ZXIgdG8gY3NpMiBzdHJ1Y3R1cmUuCkBAIC0xMjI4LDU3ICsxMjU5LDIzIEBACiAKIAlyZXQgPSBvbWFwM2lzcF92aWRlb19pbml0KCZjc2kyLT52aWRlb19vdXQsICJDU0kyYSIpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX3ZpZGVvOwogCiAJLyogQ29ubmVjdCB0aGUgQ1NJMiBzdWJkZXYgdG8gdGhlIHZpZGVvIG5vZGUuICovCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZjc2kyLT5zdWJkZXYuZW50aXR5LCBDU0kyX1BBRF9TT1VSQ0UsCiAJCQkJICAgICAgICZjc2kyLT52aWRlb19vdXQudmlkZW8uZW50aXR5LCAwLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl9saW5rOwogCiAJcmV0dXJuIDA7Ci19CiAKLXZvaWQgb21hcDNpc3BfY3NpMl91bnJlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTIpCi17CitlcnJvcl9saW5rOgorCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJmNzaTItPnZpZGVvX291dCk7CitlcnJvcl92aWRlbzoKIAltZWRpYV9lbnRpdHlfY2xlYW51cCgmY3NpMi0+c3ViZGV2LmVudGl0eSk7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmY3NpMi0+c3ViZGV2KTsKLQlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZjc2kyLT52aWRlb19vdXQpOwotfQotCi1pbnQgb21hcDNpc3BfY3NpMl9yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX2NzaTJfZGV2aWNlICpjc2kyLAotCQkJCSAgICBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpCi17Ci0JaW50IHJldDsKLQotCS8qIFJlZ2lzdGVyIHRoZSBzdWJkZXYgYW5kIHZpZGVvIG5vZGVzLiAqLwotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2ZGV2LCAmY3NpMi0+c3ViZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZjc2kyLT52aWRlb19vdXQsIHZkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCW9tYXAzaXNwX2NzaTJfdW5yZWdpc3Rlcl9lbnRpdGllcyhjc2kyKTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSVNQIENTSTIgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAKLSAqLwotCi0vKgotICogb21hcDNpc3BfY3NpMl9jbGVhbnVwIC0gUm91dGluZSBmb3IgbW9kdWxlIGRyaXZlciBjbGVhbnVwCi0gKi8KLXZvaWQgb21hcDNpc3BfY3NpMl9jbGVhbnVwKHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCi17Ci19Ci0KIC8qCiAgKiBvbWFwM2lzcF9jc2kyX2luaXQgLSBSb3V0aW5lIGZvciBtb2R1bGUgZHJpdmVyIGluaXQKICAqLwpAQCAtMTI5OCw3ICsxMjk1LDcgQEAKIAogCXJldCA9IGNzaTJfaW5pdF9lbnRpdGllcyhjc2kyYSk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZmFpbDsKKwkJcmV0dXJuIHJldDsKIAogCWlmIChpc3AtPnJldmlzaW9uID09IElTUF9SRVZJU0lPTl8xNV8wKSB7CiAJCWNzaTJjLT5pc3AgPSBpc3A7CkBAIC0xMzExLDcgKzEzMDgsMTUgQEAKIAl9CiAKIAlyZXR1cm4gMDsKLWZhaWw6Ci0Jb21hcDNpc3BfY3NpMl9jbGVhbnVwKGlzcCk7Ci0JcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG9tYXAzaXNwX2NzaTJfY2xlYW51cCAtIFJvdXRpbmUgZm9yIG1vZHVsZSBkcml2ZXIgY2xlYW51cAorICovCit2b2lkIG9tYXAzaXNwX2NzaTJfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQoreworCXN0cnVjdCBpc3BfY3NpMl9kZXZpY2UgKmNzaTJhID0gJmlzcC0+aXNwX2NzaTJhOworCisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmY3NpMmEtPnZpZGVvX291dCk7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmNzaTJhLT5zdWJkZXYuZW50aXR5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaDNhX2Fld2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwaDNhX2Fld2IuYwppbmRleCA4MDY4Y2VmLi5hM2M3NmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZXdiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoM2FfYWV3Yi5jCkBAIC0zNzAsNSArMzcwLDUgQEAKIHsKIAlrZnJlZShpc3AtPmlzcF9hZXdiLnByaXYpOwogCWtmcmVlKGlzcC0+aXNwX2Fld2IucmVjb3Zlcl9wcml2KTsKLQlvbWFwM2lzcF9zdGF0X2ZyZWUoJmlzcC0+aXNwX2Fld2IpOworCW9tYXAzaXNwX3N0YXRfY2xlYW51cCgmaXNwLT5pc3BfYWV3Yik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoM2FfYWYuYwppbmRleCBiYTU0ZDBhLi41OGUwYmM0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoM2FfYWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGgzYV9hZi5jCkBAIC00MjUsNSArNDI1LDUgQEAKIHsKIAlrZnJlZShpc3AtPmlzcF9hZi5wcml2KTsKIAlrZnJlZShpc3AtPmlzcF9hZi5yZWNvdmVyX3ByaXYpOwotCW9tYXAzaXNwX3N0YXRfZnJlZSgmaXNwLT5pc3BfYWYpOworCW9tYXAzaXNwX3N0YXRfY2xlYW51cCgmaXNwLT5pc3BfYWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BoaXN0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGhpc3QuYwppbmRleCAxNzQzODU2Li4xMTYzOTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGhpc3QuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGhpc3QuYwpAQCAtNTE2LDUgKzUxNiw1IEBACiAJaWYgKEhJU1RfVVNJTkdfRE1BKCZpc3AtPmlzcF9oaXN0KSkKIAkJb21hcF9mcmVlX2RtYShpc3AtPmlzcF9oaXN0LmRtYV9jaCk7CiAJa2ZyZWUoaXNwLT5pc3BfaGlzdC5wcml2KTsKLQlvbWFwM2lzcF9zdGF0X2ZyZWUoJmlzcC0+aXNwX2hpc3QpOworCW9tYXAzaXNwX3N0YXRfY2xlYW51cCgmaXNwLT5pc3BfaGlzdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHByZXZpZXcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5jCmluZGV4IGFiYTUzN2EuLmNjYjg3NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5jCkBAIC03Niw5ICs3Niw1MSBAQAogCiAjZGVmaW5lIERFRl9ERVRFQ1RfQ09SUkVDVF9WQUwJMHhlCiAKLSNkZWZpbmUgUFJFVl9NSU5fV0lEVEgJCTY0Ci0jZGVmaW5lIFBSRVZfTUlOX0hFSUdIVAkJOAotI2RlZmluZSBQUkVWX01BWF9IRUlHSFQJCTE2Mzg0CisvKgorICogTWFyZ2lucyBhbmQgaW1hZ2Ugc2l6ZSBsaW1pdHMuCisgKgorICogVGhlIHByZXZpZXcgZW5naW5lIGNyb3BzIHNldmVyYWwgcm93cyBhbmQgY29sdW1ucyBpbnRlcm5hbGx5IGRlcGVuZGluZyBvbgorICogd2hpY2ggZmlsdGVycyBhcmUgZW5hYmxlZC4gVG8gYXZvaWQgZm9ybWF0IGNoYW5nZXMgd2hlbiB0aGUgZmlsdGVycyBhcmUKKyAqIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHdoaWNoIHdvdWxkIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIHR1cm5lZCBvbiBvciBvZmYKKyAqIGR1cmluZyBzdHJlYW1pbmcpLCB0aGUgZHJpdmVyIGFzc3VtZXMgYWxsIHRoZSBmaWx0ZXJzIGFyZSBlbmFibGVkIHdoZW4KKyAqIGNvbXB1dGluZyBzaW5rIGNyb3AgYW5kIHNvdXJjZSBmb3JtYXQgbGltaXRzLgorICoKKyAqIElmIGEgZmlsdGVyIGlzIGRpc2FibGVkLCBhZGRpdGlvbmFsIGNyb3BwaW5nIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXQgdGhlCisgKiBwcmV2aWV3IGVuZ2luZSBpbnB1dCBieSB0aGUgZHJpdmVyIHRvIGF2b2lkIG92ZXJmbG93IGF0IGxpbmUgYW5kIGZyYW1lIGVuZC4KKyAqIFRoaXMgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCBmb3IgYXBwbGljYXRpb25zLgorICoKKyAqIE1lZGlhbiBmaWx0ZXIJCTQgcGl4ZWxzCisgKiBOb2lzZSBmaWx0ZXIsCisgKiBGYXVsdHkgcGl4ZWxzIGNvcnJlY3Rpb24JNCBwaXhlbHMsIDQgbGluZXMKKyAqIENGQSBmaWx0ZXIJCQk0IHBpeGVscywgNCBsaW5lcyBpbiBCYXllciBtb2RlCisgKgkJCQkJICAyIGxpbmVzIGluIG90aGVyIG1vZGVzCisgKiBDb2xvciBzdXBwcmVzc2lvbgkJMiBwaXhlbHMKKyAqIG9yIGx1bWEgZW5oYW5jZW1lbnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1heGltdW0gdG90YWwJCTE0IHBpeGVscywgOCBsaW5lcworICoKKyAqIFRoZSBjb2xvciBzdXBwcmVzc2lvbiBhbmQgbHVtYSBlbmhhbmNlbWVudCBmaWx0ZXJzIGFyZSBhcHBsaWVkIGFmdGVyIGJheWVyIHRvCisgKiBZVVYgY29udmVyc2lvbi4gVGhleSB0aHVzIGNhbiBjcm9wIG9uZSBwaXhlbCBvbiB0aGUgbGVmdCBhbmQgb25lIHBpeGVsIG9uIHRoZQorICogcmlnaHQgc2lkZSBvZiB0aGUgaW1hZ2Ugd2l0aG91dCBjaGFuZ2luZyB0aGUgY29sb3IgcGF0dGVybi4gV2hlbiBib3RoIHRob3NlCisgKiBmaWx0ZXJzIGFyZSBkaXNhYmxlZCwgdGhlIGRyaXZlciBtdXN0IGNyb3AgdGhlIHR3byBwaXhlbHMgb24gdGhlIHNhbWUgc2lkZSBvZgorICogdGhlIGltYWdlIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBiYXllciBwYXR0ZXJuLiBUaGUgbGVmdCBtYXJnaW4gaXMgdGh1cyBzZXQgdG8KKyAqIDggcGl4ZWxzIGFuZCB0aGUgcmlnaHQgbWFyZ2luIHRvIDYgcGl4ZWxzLgorICovCisKKyNkZWZpbmUgUFJFVl9NQVJHSU5fTEVGVAk4CisjZGVmaW5lIFBSRVZfTUFSR0lOX1JJR0hUCTYKKyNkZWZpbmUgUFJFVl9NQVJHSU5fVE9QCQk0CisjZGVmaW5lIFBSRVZfTUFSR0lOX0JPVFRPTQk0CisKKyNkZWZpbmUgUFJFVl9NSU5fSU5fV0lEVEgJNjQKKyNkZWZpbmUgUFJFVl9NSU5fSU5fSEVJR0hUCTgKKyNkZWZpbmUgUFJFVl9NQVhfSU5fSEVJR0hUCTE2Mzg0CisKKyNkZWZpbmUgUFJFVl9NSU5fT1VUX1dJRFRICTAKKyNkZWZpbmUgUFJFVl9NSU5fT1VUX0hFSUdIVAkwCisjZGVmaW5lIFBSRVZfTUFYX09VVF9XSURUSAkxMjgwCisjZGVmaW5lIFBSRVZfTUFYX09VVF9XSURUSF9FUzIJMzMwMAorI2RlZmluZSBQUkVWX01BWF9PVVRfV0lEVEhfMzYzMAk0MDk2CiAKIC8qCiAgKiBDb2VmaWNpZW50IFRhYmxlcyBmb3IgdGhlIHN1Ym1vZHVsZXMgaW4gUHJldmlldy4KQEAgLTk3OSw1MiArMTAyMSwzNiBAQAogICogZW5hYmxlZCB3aGVuIHJlcG9ydGluZyBzb3VyY2UgcGFkIGZvcm1hdHMgdG8gdXNlcnNwYWNlLiBJZiB0aGlzIGFzc3VtcHRpb24gaXMKICAqIG5vdCB0cnVlLCByb3dzIGFuZCBjb2x1bW5zIG11c3QgYmUgbWFudWFsbHkgY3JvcHBlZCBhdCB0aGUgcHJldmlldyBlbmdpbmUKICAqIGlucHV0IHRvIGF2b2lkIG92ZXJmbG93cyBhdCB0aGUgZW5kIG9mIGxpbmVzIGFuZCBmcmFtZXMuCisgKgorICogU2VlIHRoZSBleHBsYW5hdGlvbiBhdCB0aGUgUFJFVl9NQVJHSU5fKiBkZWZpbml0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLgogICovCiBzdGF0aWMgdm9pZCBwcmV2aWV3X2NvbmZpZ19pbnB1dF9zaXplKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYpCiB7CiAJc3RydWN0IGlzcF9kZXZpY2UgKmlzcCA9IHRvX2lzcF9kZXZpY2UocHJldik7CiAJc3RydWN0IHByZXZfcGFyYW1zICpwYXJhbXMgPSAmcHJldi0+cGFyYW1zOwotCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdCA9ICZwcmV2LT5mb3JtYXRzW1BSRVZfUEFEX1NJTktdOwotCXVuc2lnbmVkIGludCBzcGggPSAwOwotCXVuc2lnbmVkIGludCBlcGggPSBmb3JtYXQtPndpZHRoIC0gMTsKLQl1bnNpZ25lZCBpbnQgc2x2ID0gMDsKLQl1bnNpZ25lZCBpbnQgZWx2ID0gZm9ybWF0LT5oZWlnaHQgLSAxOworCXVuc2lnbmVkIGludCBzcGggPSBwcmV2LT5jcm9wLmxlZnQ7CisJdW5zaWduZWQgaW50IGVwaCA9IHByZXYtPmNyb3AubGVmdCArIHByZXYtPmNyb3Aud2lkdGggLSAxOworCXVuc2lnbmVkIGludCBzbHYgPSBwcmV2LT5jcm9wLnRvcDsKKwl1bnNpZ25lZCBpbnQgZWx2ID0gcHJldi0+Y3JvcC50b3AgKyBwcmV2LT5jcm9wLmhlaWdodCAtIDE7CiAKLQlpZiAocHJldi0+aW5wdXQgPT0gUFJFVklFV19JTlBVVF9DQ0RDKSB7Ci0JCXNwaCArPSAyOwotCQllcGggLT0gMjsKKwlpZiAocGFyYW1zLT5mZWF0dXJlcyAmIFBSRVZfQ0ZBKSB7CisJCXNwaCAtPSAyOworCQllcGggKz0gMjsKKwkJc2x2IC09IDI7CisJCWVsdiArPSAyOwogCX0KLQotCS8qCi0JICogTWVkaWFuIGZpbHRlcgk0IHBpeGVscwotCSAqIE5vaXNlIGZpbHRlcgkJNCBwaXhlbHMsIDQgbGluZXMKLQkgKiBvciBmYXVsdHkgcGl4ZWxzIGNvcnJlY3Rpb24KLQkgKiBDRkEgZmlsdGVyCQk0IHBpeGVscywgNCBsaW5lcyBpbiBCYXllciBtb2RlCi0JICoJCQkJICAyIGxpbmVzIGluIG90aGVyIG1vZGVzCi0JICogQ29sb3Igc3VwcHJlc3Npb24JMiBwaXhlbHMKLQkgKiBvciBsdW1hIGVuaGFuY2VtZW50Ci0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIE1heGltdW0gdG90YWwJMTQgcGl4ZWxzLCA4IGxpbmVzCi0JICovCi0KLQlpZiAoIShwYXJhbXMtPmZlYXR1cmVzICYgUFJFVl9DRkEpKSB7Ci0JCXNwaCArPSAyOwotCQllcGggLT0gMjsKLQkJc2x2ICs9IDI7Ci0JCWVsdiAtPSAyOworCWlmIChwYXJhbXMtPmZlYXR1cmVzICYgKFBSRVZfREVGRUNUX0NPUiB8IFBSRVZfTk9JU0VfRklMVEVSKSkgeworCQlzcGggLT0gMjsKKwkJZXBoICs9IDI7CisJCXNsdiAtPSAyOworCQllbHYgKz0gMjsKIAl9Ci0JaWYgKCEocGFyYW1zLT5mZWF0dXJlcyAmIChQUkVWX0RFRkVDVF9DT1IgfCBQUkVWX05PSVNFX0ZJTFRFUikpKSB7Ci0JCXNwaCArPSAyOwotCQllcGggLT0gMjsKLQkJc2x2ICs9IDI7Ci0JCWVsdiAtPSAyOworCWlmIChwYXJhbXMtPmZlYXR1cmVzICYgUFJFVl9IT1JaX01FRElBTl9GSUxURVIpIHsKKwkJc3BoIC09IDI7CisJCWVwaCArPSAyOwogCX0KLQlpZiAoIShwYXJhbXMtPmZlYXR1cmVzICYgUFJFVl9IT1JaX01FRElBTl9GSUxURVIpKSB7Ci0JCXNwaCArPSAyOwotCQllcGggLT0gMjsKLQl9Ci0JaWYgKCEocGFyYW1zLT5mZWF0dXJlcyAmIChQUkVWX0NIUk9NQV9TVVBQUkVTUyB8IFBSRVZfTFVNQV9FTkhBTkNFKSkpCi0JCXNwaCArPSAyOworCWlmIChwYXJhbXMtPmZlYXR1cmVzICYgKFBSRVZfQ0hST01BX1NVUFBSRVNTIHwgUFJFVl9MVU1BX0VOSEFOQ0UpKQorCQlzcGggLT0gMjsKIAogCWlzcF9yZWdfd3JpdGVsKGlzcCwgKHNwaCA8PCBJU1BQUlZfSE9SWl9JTkZPX1NQSF9TSElGVCkgfCBlcGgsCiAJCSAgICAgICBPTUFQM19JU1BfSU9NRU1fUFJFViwgSVNQUFJWX0hPUlpfSU5GTyk7CkBAIC0xMjI4LDcgKzEyNTQsNiBAQAogCS8qIEluaXQgdmFsdWVzICovCiAJcGFyYW1zLT5jb250cmFzdCA9IElTUFBSVl9DT05UUkFTVF9ERUYgKiBJU1BQUlZfQ09OVFJBU1RfVU5JVFM7CiAJcGFyYW1zLT5icmlnaHRuZXNzID0gSVNQUFJWX0JSSUdIVF9ERUYgKiBJU1BQUlZfQlJJR0hUX1VOSVRTOwotCXBhcmFtcy0+YXZlcmFnZSA9IE5PX0FWRTsKIAlwYXJhbXMtPmNmYS5mb3JtYXQgPSBPTUFQM0lTUF9DRkFGTVRfQkFZRVI7CiAJbWVtY3B5KHBhcmFtcy0+Y2ZhLnRhYmxlLCBjZmFfY29lZl90YWJsZSwKIAkgICAgICAgc2l6ZW9mKHBhcmFtcy0+Y2ZhLnRhYmxlKSk7CkBAIC0xMjgxLDE0ICsxMzA2LDE0IEBACiAKIAlzd2l0Y2ggKGlzcC0+cmV2aXNpb24pIHsKIAljYXNlIElTUF9SRVZJU0lPTl8xXzA6Ci0JCXJldHVybiBJU1BQUlZfTUFYT1VUUFVUX1dJRFRIOworCQlyZXR1cm4gUFJFVl9NQVhfT1VUX1dJRFRIOwogCiAJY2FzZSBJU1BfUkVWSVNJT05fMl8wOgogCWRlZmF1bHQ6Ci0JCXJldHVybiBJU1BQUlZfTUFYT1VUUFVUX1dJRFRIX0VTMjsKKwkJcmV0dXJuIFBSRVZfTUFYX09VVF9XSURUSF9FUzI7CiAKIAljYXNlIElTUF9SRVZJU0lPTl8xNV8wOgotCQlyZXR1cm4gSVNQUFJWX01BWE9VVFBVVF9XSURUSF8zNjMwOworCQlyZXR1cm4gUFJFVl9NQVhfT1VUX1dJRFRIXzM2MzA7CiAJfQogfQogCkBAIC0xMjk2LDggKzEzMjEsNiBAQAogewogCXN0cnVjdCBpc3BfZGV2aWNlICppc3AgPSB0b19pc3BfZGV2aWNlKHByZXYpOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKLQl1bnNpZ25lZCBpbnQgbWF4X291dF93aWR0aDsKLQl1bnNpZ25lZCBpbnQgZm9ybWF0X2F2ZzsKIAogCXByZXZpZXdfc2V0dXBfaHcocHJldik7CiAKQEAgLTEzMzUsMTAgKzEzNTgsNyBAQAogCQlwcmV2aWV3X2NvbmZpZ19vdXRsaW5lb2Zmc2V0KHByZXYsCiAJCQkJQUxJR04oZm9ybWF0LT53aWR0aCwgMHgxMCkgKiAyKTsKIAotCW1heF9vdXRfd2lkdGggPSBwcmV2aWV3X21heF9vdXRfd2lkdGgocHJldik7Ci0KLQlmb3JtYXRfYXZnID0gZmxzKERJVl9ST1VORF9VUChmb3JtYXQtPndpZHRoLCBtYXhfb3V0X3dpZHRoKSAtIDEpOwotCXByZXZpZXdfY29uZmlnX2F2ZXJhZ2VyKHByZXYsIGZvcm1hdF9hdmcpOworCXByZXZpZXdfY29uZmlnX2F2ZXJhZ2VyKHByZXYsIDApOwogCXByZXZpZXdfY29uZmlnX3ljcG9zKHByZXYsIGZvcm1hdC0+Y29kZSk7CiB9CiAKQEAgLTE1OTcsNiArMTYxNywxNiBAQAogCQlyZXR1cm4gJnByZXYtPmZvcm1hdHNbcGFkXTsKIH0KIAorc3RhdGljIHN0cnVjdCB2NGwyX3JlY3QgKgorX19wcmV2aWV3X2dldF9jcm9wKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCSAgIGVudW0gdjRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZSB3aGljaCkKK3sKKwlpZiAod2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgUFJFVl9QQURfU0lOSyk7CisJZWxzZQorCQlyZXR1cm4gJnByZXYtPmNyb3A7Cit9CisKIC8qIHByZXZpZXdlciBmb3JtYXQgZGVzY3JpcHRpb25zICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHByZXZpZXdfaW5wdXRfZm10c1tdID0gewogCVY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLApAQCAtMTYxMSwyNCArMTY0MSwyNSBAQAogfTsKIAogLyoKLSAqIHByZXZpZXdfdHJ5X2Zvcm1hdCAtIEhhbmRsZSB0cnkgZm9ybWF0IGJ5IHBhZCBzdWJkZXYgbWV0aG9kCi0gKiBAcHJldjogSVNQIHByZXZpZXcgZGV2aWNlCi0gKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQotICogQHBhZDogcGFkIG51bQotICogQGZtdDogcG9pbnRlciB0byB2NGwyIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIHByZXZpZXdfdHJ5X2Zvcm1hdCAtIFZhbGlkYXRlIGEgZm9ybWF0CisgKiBAcHJldjogSVNQIHByZXZpZXcgZW5naW5lCisgKiBAZmg6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCisgKiBAcGFkOiBwYWQgbnVtYmVyCisgKiBAZm10OiBmb3JtYXQgdG8gYmUgdmFsaWRhdGVkCisgKiBAd2hpY2g6IHRyeS9hY3RpdmUgZm9ybWF0IHNlbGVjdG9yCisgKgorICogVmFsaWRhdGUgYW5kIGFkanVzdCB0aGUgZ2l2ZW4gZm9ybWF0IGZvciB0aGUgZ2l2ZW4gcGFkIGJhc2VkIG9uIHRoZSBwcmV2aWV3CisgKiBlbmdpbmUgbGltaXRzIGFuZCB0aGUgZm9ybWF0IGFuZCBjcm9wIHJlY3RhbmdsZXMgb24gb3RoZXIgcGFkcy4KICAqLwogc3RhdGljIHZvaWQgcHJldmlld190cnlfZm9ybWF0KHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYsCiAJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwgdW5zaWduZWQgaW50IHBhZCwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQsCiAJCQkgICAgICAgZW51bSB2NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlIHdoaWNoKQogewotCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKLQl1bnNpZ25lZCBpbnQgbWF4X291dF93aWR0aDsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgcGl4ZWxjb2RlOworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CiAJdW5zaWduZWQgaW50IGk7CiAKLQltYXhfb3V0X3dpZHRoID0gcHJldmlld19tYXhfb3V0X3dpZHRoKHByZXYpOwotCiAJc3dpdGNoIChwYWQpIHsKIAljYXNlIFBSRVZfUEFEX1NJTks6CiAJCS8qIFdoZW4gcmVhZGluZyBkYXRhIGZyb20gdGhlIENDREMsIHRoZSBpbnB1dCBzaXplIGhhcyBhbHJlYWR5CkBAIC0xNjQxLDEwICsxNjcyLDExIEBACiAJCSAqIGZpbHRlciBhcnJheSBpbnRlcnBvbGF0aW9uLgogCQkgKi8KIAkJaWYgKHByZXYtPmlucHV0ID09IFBSRVZJRVdfSU5QVVRfTUVNT1JZKSB7Ci0JCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIGZtdC0+d2lkdGgsIFBSRVZfTUlOX1dJRFRILAotCQkJCQkgICAgIG1heF9vdXRfd2lkdGggKiA4KTsKLQkJCWZtdC0+aGVpZ2h0ID0gY2xhbXBfdCh1MzIsIGZtdC0+aGVpZ2h0LCBQUkVWX01JTl9IRUlHSFQsCi0JCQkJCSAgICAgIFBSRVZfTUFYX0hFSUdIVCk7CisJCQlmbXQtPndpZHRoID0gY2xhbXBfdCh1MzIsIGZtdC0+d2lkdGgsIFBSRVZfTUlOX0lOX1dJRFRILAorCQkJCQkgICAgIHByZXZpZXdfbWF4X291dF93aWR0aChwcmV2KSk7CisJCQlmbXQtPmhlaWdodCA9IGNsYW1wX3QodTMyLCBmbXQtPmhlaWdodCwKKwkJCQkJICAgICAgUFJFVl9NSU5fSU5fSEVJR0hULAorCQkJCQkgICAgICBQUkVWX01BWF9JTl9IRUlHSFQpOwogCQl9CiAKIAkJZm10LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CkBAIC0xNjYxLDE1ICsxNjkzLDggQEAKIAogCWNhc2UgUFJFVl9QQURfU09VUkNFOgogCQlwaXhlbGNvZGUgPSBmbXQtPmNvZGU7Ci0JCWZvcm1hdCA9IF9fcHJldmlld19nZXRfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TSU5LLCB3aGljaCk7Ci0JCW1lbWNweShmbXQsIGZvcm1hdCwgc2l6ZW9mKCpmbXQpKTsKKwkJKmZtdCA9ICpfX3ByZXZpZXdfZ2V0X2Zvcm1hdChwcmV2LCBmaCwgUFJFVl9QQURfU0lOSywgd2hpY2gpOwogCi0JCS8qIFRoZSBwcmV2aWV3IG1vZHVsZSBvdXRwdXQgc2l6ZSBpcyBjb25maWd1cmFibGUgdGhyb3VnaCB0aGUKLQkJICogaW5wdXQgaW50ZXJmYWNlIChob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjcm9wcGluZykgYW5kIHRoZQotCQkgKiBhdmVyYWdlciAoaG9yaXpvbnRhbCBzY2FsaW5nIGJ5IDEvMSwgMS8yLCAxLzQgb3IgMS84KS4gSW4KLQkJICogc3BpdGUgb2YgdGhpcywgaGFyZGNvZGUgdGhlIG91dHB1dCBzaXplIHRvIHRoZSBiaWdnZXN0Ci0JCSAqIHBvc3NpYmxlIHZhbHVlIGZvciBzaW1wbGljaXR5IHJlYXNvbnMuCi0JCSAqLwogCQlzd2l0Y2ggKHBpeGVsY29kZSkgewogCQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMVgxNjoKIAkJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzFYMTY6CkBAIC0xNjgxLDMxICsxNzA2LDE0IEBACiAJCQlicmVhazsKIAkJfQogCi0JCS8qIFRoZSBUUk0gc3RhdGVzICgxMi4xLjQuNy4xLjIpIHRoYXQgMiBwaXhlbHMgbXVzdCBiZSBjcm9wcGVkCi0JCSAqIGZyb20gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIHdoZW4gdGhlIGlucHV0IHNvdXJjZSBpcyB0aGUKLQkJICogQ0NEQy4gVGhpcyBzZWVtcyBub3QgdG8gYmUgbmVlZGVkIGluIHByYWN0aWNlLCBpbnZlc3RpZ2F0aW9uCi0JCSAqIGlzIHJlcXVpcmVkLgorCQkvKiBUaGUgcHJldmlldyBtb2R1bGUgb3V0cHV0IHNpemUgaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlCisJCSAqIGF2ZXJhZ2VyIChob3Jpem9udGFsIHNjYWxpbmcgYnkgMS8xLCAxLzIsIDEvNCBvciAxLzgpLiBUaGlzCisJCSAqIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LCBoYXJkY29kZSB0aGUgb3V0cHV0IHNpemUgdG8gdGhlIGNyb3AKKwkJICogcmVjdGFuZ2xlIHNpemUuCiAJCSAqLwotCQlpZiAocHJldi0+aW5wdXQgPT0gUFJFVklFV19JTlBVVF9DQ0RDKQotCQkJZm10LT53aWR0aCAtPSA0OwotCi0JCS8qIFRoZSBwcmV2aWV3IG1vZHVsZSBjYW4gb3V0cHV0IGEgbWF4aW11bSBvZiAzMzEyIHBpeGVscwotCQkgKiBob3Jpem9udGFsbHkgZHVlIHRvIGZpeGVkIG1lbW9yeS1saW5lIHNpemVzLiBDb21wdXRlIHRoZQotCQkgKiBob3Jpem9udGFsIGF2ZXJhZ2luZyBmYWN0b3IgYWNjb3JkaW5nbHkuIE5vdGUgdGhhdCB0aGUgbGltaXQKLQkJICogYXBwbGllcyB0byB0aGUgbm9pc2UgZmlsdGVyIGFuZCBDRkEgaW50ZXJwb2xhdGlvbiBibG9ja3MsIHNvCi0JCSAqIGl0IGRvZXNuJ3QgdGFrZSBjcm9wcGluZyBieSBmdXJ0aGVyIGJsb2NrcyBpbnRvIGFjY291bnQuCi0JCSAqCi0JCSAqIEVTIDEuMCBoYXJkd2FyZSByZXZpc2lvbiBpcyBsaW1pdGVkIHRvIDEyODAgcGl4ZWxzCi0JCSAqIGhvcml6b250YWxseS4KLQkJICovCi0JCWZtdC0+d2lkdGggPj49IGZscyhESVZfUk9VTkRfVVAoZm10LT53aWR0aCwgbWF4X291dF93aWR0aCkgLSAxKTsKLQotCQkvKiBBc3N1bWUgdGhhdCBhbGwgYmxvY2tzIGFyZSBlbmFibGVkIGFuZCBjcm9wIHBpeGVscyBhbmQgbGluZXMKLQkJICogYWNjb3JkaW5nbHkuIFNlZSBwcmV2aWV3X2NvbmZpZ19pbnB1dF9zaXplKCkgZm9yIG1vcmUKLQkJICogaW5mb3JtYXRpb24uCi0JCSAqLwotCQlmbXQtPndpZHRoIC09IDE0OwotCQlmbXQtPmhlaWdodCAtPSA4OworCQljcm9wID0gX19wcmV2aWV3X2dldF9jcm9wKHByZXYsIGZoLCB3aGljaCk7CisJCWZtdC0+d2lkdGggPSBjcm9wLT53aWR0aDsKKwkJZm10LT5oZWlnaHQgPSBjcm9wLT5oZWlnaHQ7CiAKIAkJZm10LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CiAJCWJyZWFrOwpAQCAtMTcxNSw2ICsxNzIzLDQ5IEBACiB9CiAKIC8qCisgKiBwcmV2aWV3X3RyeV9jcm9wIC0gVmFsaWRhdGUgYSBjcm9wIHJlY3RhbmdsZQorICogQHByZXY6IElTUCBwcmV2aWV3IGVuZ2luZQorICogQHNpbms6IGZvcm1hdCBvbiB0aGUgc2luayBwYWQKKyAqIEBjcm9wOiBjcm9wIHJlY3RhbmdsZSB0byBiZSB2YWxpZGF0ZWQKKyAqCisgKiBUaGUgcHJldmlldyBlbmdpbmUgY3JvcHMgbGluZXMgYW5kIGNvbHVtbnMgZm9yIGl0cyBpbnRlcm5hbCBvcGVyYXRpb24sCisgKiBkZXBlbmRpbmcgb24gd2hpY2ggZmlsdGVycyBhcmUgZW5hYmxlZC4gRW5mb3JjZSBtaW5pbXVtIGNyb3AgbWFyZ2lucyB0bworICogaGFuZGxlIHRoYXQgdHJhbnNwYXJlbnRseSBmb3IgdXNlcnNwYWNlLgorICoKKyAqIFNlZSB0aGUgZXhwbGFuYXRpb24gYXQgdGhlIFBSRVZfTUFSR0lOXyogZGVmaW5pdGlvbnMgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworc3RhdGljIHZvaWQgcHJldmlld190cnlfY3JvcChzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpzaW5rLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wKQoreworCXVuc2lnbmVkIGludCBsZWZ0ID0gUFJFVl9NQVJHSU5fTEVGVDsKKwl1bnNpZ25lZCBpbnQgcmlnaHQgPSBzaW5rLT53aWR0aCAtIFBSRVZfTUFSR0lOX1JJR0hUOworCXVuc2lnbmVkIGludCB0b3AgPSBQUkVWX01BUkdJTl9UT1A7CisJdW5zaWduZWQgaW50IGJvdHRvbSA9IHNpbmstPmhlaWdodCAtIFBSRVZfTUFSR0lOX0JPVFRPTTsKKworCS8qIFdoZW4gcHJvY2Vzc2luZyBkYXRhIG9uLXRoZS1mbHkgZnJvbSB0aGUgQ0NEQywgYXQgbGVhc3QgMiBwaXhlbHMgbXVzdAorCSAqIGJlIGNyb3BwZWQgZnJvbSB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIGltYWdlLiBBcyB3ZSBkb24ndAorCSAqIGtub3cgd2hpY2ggZmlsdGVycyB3aWxsIGJlIGVuYWJsZWQsIGluY3JlYXNlIHRoZSBsZWZ0IGFuZCByaWdodAorCSAqIG1hcmdpbnMgYnkgdHdvLgorCSAqLworCWlmIChwcmV2LT5pbnB1dCA9PSBQUkVWSUVXX0lOUFVUX0NDREMpIHsKKwkJbGVmdCArPSAyOworCQlyaWdodCAtPSAyOworCX0KKworCS8qIFJlc3RyaWN0IGxlZnQvdG9wIHRvIGV2ZW4gdmFsdWVzIHRvIGtlZXAgdGhlIEJheWVyIHBhdHRlcm4uICovCisJY3JvcC0+bGVmdCAmPSB+MTsKKwljcm9wLT50b3AgJj0gfjE7CisKKwljcm9wLT5sZWZ0ID0gY2xhbXBfdCh1MzIsIGNyb3AtPmxlZnQsIGxlZnQsIHJpZ2h0IC0gUFJFVl9NSU5fT1VUX1dJRFRIKTsKKwljcm9wLT50b3AgPSBjbGFtcF90KHUzMiwgY3JvcC0+dG9wLCB0b3AsIGJvdHRvbSAtIFBSRVZfTUlOX09VVF9IRUlHSFQpOworCWNyb3AtPndpZHRoID0gY2xhbXBfdCh1MzIsIGNyb3AtPndpZHRoLCBQUkVWX01JTl9PVVRfV0lEVEgsCisJCQkgICAgICByaWdodCAtIGNyb3AtPmxlZnQpOworCWNyb3AtPmhlaWdodCA9IGNsYW1wX3QodTMyLCBjcm9wLT5oZWlnaHQsIFBSRVZfTUlOX09VVF9IRUlHSFQsCisJCQkgICAgICAgYm90dG9tIC0gY3JvcC0+dG9wKTsKK30KKworLyoKICAqIHByZXZpZXdfZW51bV9tYnVzX2NvZGUgLSBIYW5kbGUgcGl4ZWwgZm9ybWF0IGVudW1lcmF0aW9uCiAgKiBAc2QgICAgIDogcG9pbnRlciB0byB2NGwyIHN1YmRldiBzdHJ1Y3R1cmUKICAqIEBmaCAgICAgOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQpAQCAtMTc3Niw2ICsxODI3LDYwIEBACiB9CiAKIC8qCisgKiBwcmV2aWV3X2dldF9jcm9wIC0gUmV0cmlldmUgdGhlIGNyb3AgcmVjdGFuZ2xlIG9uIGEgcGFkCisgKiBAc2Q6IElTUCBwcmV2aWV3IFY0TDIgc3ViZGV2aWNlCisgKiBAZmg6IFY0TDIgc3ViZGV2IGZpbGUgaGFuZGxlCisgKiBAY3JvcDogY3JvcCByZWN0YW5nbGUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgcHJldmlld19nZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3N1YmRldl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCS8qIENyb3BwaW5nIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHRoZSBzaW5rIHBhZC4gKi8KKwlpZiAoY3JvcC0+cGFkICE9IFBSRVZfUEFEX1NJTkspCisJCXJldHVybiAtRUlOVkFMOworCisJY3JvcC0+cmVjdCA9ICpfX3ByZXZpZXdfZ2V0X2Nyb3AocHJldiwgZmgsIGNyb3AtPndoaWNoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByZXZpZXdfc2V0X2Nyb3AgLSBSZXRyaWV2ZSB0aGUgY3JvcCByZWN0YW5nbGUgb24gYSBwYWQKKyAqIEBzZDogSVNQIHByZXZpZXcgVjRMMiBzdWJkZXZpY2UKKyAqIEBmaDogVjRMMiBzdWJkZXYgZmlsZSBoYW5kbGUKKyAqIEBjcm9wOiBjcm9wIHJlY3RhbmdsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBwcmV2aWV3X3NldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKKworCS8qIENyb3BwaW5nIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHRoZSBzaW5rIHBhZC4gKi8KKwlpZiAoY3JvcC0+cGFkICE9IFBSRVZfUEFEX1NJTkspCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIGNyb3AgcmVjdGFuZ2xlIGNhbid0IGJlIGNoYW5nZWQgd2hpbGUgc3RyZWFtaW5nLiAqLworCWlmIChwcmV2LT5zdGF0ZSAhPSBJU1BfUElQRUxJTkVfU1RSRUFNX1NUT1BQRUQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3JtYXQgPSBfX3ByZXZpZXdfZ2V0X2Zvcm1hdChwcmV2LCBmaCwgUFJFVl9QQURfU0lOSywgY3JvcC0+d2hpY2gpOworCXByZXZpZXdfdHJ5X2Nyb3AocHJldiwgZm9ybWF0LCAmY3JvcC0+cmVjdCk7CisJKl9fcHJldmlld19nZXRfY3JvcChwcmV2LCBmaCwgY3JvcC0+d2hpY2gpID0gY3JvcC0+cmVjdDsKKworCS8qIFVwZGF0ZSB0aGUgc291cmNlIGZvcm1hdC4gKi8KKwlmb3JtYXQgPSBfX3ByZXZpZXdfZ2V0X2Zvcm1hdChwcmV2LCBmaCwgUFJFVl9QQURfU09VUkNFLCBjcm9wLT53aGljaCk7CisJcHJldmlld190cnlfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TT1VSQ0UsIGZvcm1hdCwgY3JvcC0+d2hpY2gpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBwcmV2aWV3X2dldF9mb3JtYXQgLSBIYW5kbGUgZ2V0IGZvcm1hdCBieSBwYWRzIHN1YmRldiBtZXRob2QKICAqIEBzZCA6IHBvaW50ZXIgdG8gdjRsMiBzdWJkZXYgc3RydWN0dXJlCiAgKiBAZmggOiBWNEwyIHN1YmRldiBmaWxlIGhhbmRsZQpAQCAtMTgwOCw2ICsxOTEzLDcgQEAKIHsKIAlzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3A7CiAKIAlmb3JtYXQgPSBfX3ByZXZpZXdfZ2V0X2Zvcm1hdChwcmV2LCBmaCwgZm10LT5wYWQsIGZtdC0+d2hpY2gpOwogCWlmIChmb3JtYXQgPT0gTlVMTCkKQEAgLTE4MTgsOSArMTkyNCwxOCBAQAogCiAJLyogUHJvcGFnYXRlIHRoZSBmb3JtYXQgZnJvbSBzaW5rIHRvIHNvdXJjZSAqLwogCWlmIChmbXQtPnBhZCA9PSBQUkVWX1BBRF9TSU5LKSB7CisJCS8qIFJlc2V0IHRoZSBjcm9wIHJlY3RhbmdsZS4gKi8KKwkJY3JvcCA9IF9fcHJldmlld19nZXRfY3JvcChwcmV2LCBmaCwgZm10LT53aGljaCk7CisJCWNyb3AtPmxlZnQgPSAwOworCQljcm9wLT50b3AgPSAwOworCQljcm9wLT53aWR0aCA9IGZtdC0+Zm9ybWF0LndpZHRoOworCQljcm9wLT5oZWlnaHQgPSBmbXQtPmZvcm1hdC5oZWlnaHQ7CisKKwkJcHJldmlld190cnlfY3JvcChwcmV2LCAmZm10LT5mb3JtYXQsIGNyb3ApOworCisJCS8qIFVwZGF0ZSB0aGUgc291cmNlIGZvcm1hdC4gKi8KIAkJZm9ybWF0ID0gX19wcmV2aWV3X2dldF9mb3JtYXQocHJldiwgZmgsIFBSRVZfUEFEX1NPVVJDRSwKIAkJCQkJICAgICAgZm10LT53aGljaCk7Ci0JCSpmb3JtYXQgPSBmbXQtPmZvcm1hdDsKIAkJcHJldmlld190cnlfZm9ybWF0KHByZXYsIGZoLCBQUkVWX1BBRF9TT1VSQ0UsIGZvcm1hdCwKIAkJCQkgICBmbXQtPndoaWNoKTsKIAl9CkBAIC0xODY5LDYgKzE5ODQsOCBAQAogCS5lbnVtX2ZyYW1lX3NpemUgPSBwcmV2aWV3X2VudW1fZnJhbWVfc2l6ZSwKIAkuZ2V0X2ZtdCA9IHByZXZpZXdfZ2V0X2Zvcm1hdCwKIAkuc2V0X2ZtdCA9IHByZXZpZXdfc2V0X2Zvcm1hdCwKKwkuZ2V0X2Nyb3AgPSBwcmV2aWV3X2dldF9jcm9wLAorCS5zZXRfY3JvcCA9IHByZXZpZXdfc2V0X2Nyb3AsCiB9OwogCiAvKiBzdWJkZXYgb3BlcmF0aW9ucyAqLwpAQCAtMTk2Niw4ICsyMDgzLDQ0IEBACiAJLmxpbmtfc2V0dXAgPSBwcmV2aWV3X2xpbmtfc2V0dXAsCiB9OwogCit2b2lkIG9tYXAzaXNwX3ByZXZpZXdfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2KQoreworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcmV2LT5zdWJkZXYpOworCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnByZXYtPnZpZGVvX2luKTsKKwlvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKCZwcmV2LT52aWRlb19vdXQpOworfQorCitpbnQgb21hcDNpc3BfcHJldmlld19yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2LAorCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKK3sKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZwcmV2LT5zdWJkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJnByZXYtPnZpZGVvX2luLCB2ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9tYXAzaXNwX3ZpZGVvX3JlZ2lzdGVyKCZwcmV2LT52aWRlb19vdXQsIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW9tYXAzaXNwX3ByZXZpZXdfdW5yZWdpc3Rlcl9lbnRpdGllcyhwcmV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSVNQIHByZXZpZXdlciBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cAorICovCisKIC8qCi0gKiByZXZpZXdfaW5pdF9lbnRpdGllcyAtIEluaXRpYWxpemUgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkuCisgKiBwcmV2aWV3X2luaXRfZW50aXRpZXMgLSBJbml0aWFsaXplIHN1YmRldiBhbmQgbWVkaWEgZW50aXR5LgogICogQHByZXYgOiBQb2ludGVyIHRvIHByZXZpZXcgc3RydWN0dXJlCiAgKiByZXR1cm4gLUVOT01FTSBvciB6ZXJvIG9uIHN1Y2Nlc3MKICAqLwpAQCAtMjAyNCw2OSArMjE3NywzNCBAQAogCiAJcmV0ID0gb21hcDNpc3BfdmlkZW9faW5pdCgmcHJldi0+dmlkZW9faW4sICJwcmV2aWV3Iik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfdmlkZW9faW47CiAKIAlyZXQgPSBvbWFwM2lzcF92aWRlb19pbml0KCZwcmV2LT52aWRlb19vdXQsICJwcmV2aWV3Iik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfdmlkZW9fb3V0OwogCiAJLyogQ29ubmVjdCB0aGUgdmlkZW8gbm9kZXMgdG8gdGhlIHByZXZpZXdlciBzdWJkZXYuICovCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZwcmV2LT52aWRlb19pbi52aWRlby5lbnRpdHksIDAsCiAJCQkmcHJldi0+c3ViZGV2LmVudGl0eSwgUFJFVl9QQURfU0lOSywgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldCA9IG1lZGlhX2VudGl0eV9jcmVhdGVfbGluaygmcHJldi0+c3ViZGV2LmVudGl0eSwgUFJFVl9QQURfU09VUkNFLAogCQkJJnByZXYtPnZpZGVvX291dC52aWRlby5lbnRpdHksIDAsIDApOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX2xpbms7CiAKIAlyZXR1cm4gMDsKLX0KIAotdm9pZCBvbWFwM2lzcF9wcmV2aWV3X3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldikKLXsKK2Vycm9yX2xpbms6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcHJldi0+dmlkZW9fb3V0KTsKK2Vycm9yX3ZpZGVvX291dDoKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZwcmV2LT52aWRlb19pbik7CitlcnJvcl92aWRlb19pbjoKIAltZWRpYV9lbnRpdHlfY2xlYW51cCgmcHJldi0+c3ViZGV2LmVudGl0eSk7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJldi0+c3ViZGV2KTsKLQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcmV2LT5jdHJscyk7Ci0Jb21hcDNpc3BfdmlkZW9fdW5yZWdpc3RlcigmcHJldi0+dmlkZW9faW4pOwotCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnByZXYtPnZpZGVvX291dCk7Ci19Ci0KLWludCBvbWFwM2lzcF9wcmV2aWV3X3JlZ2lzdGVyX2VudGl0aWVzKHN0cnVjdCBpc3BfcHJldl9kZXZpY2UgKnByZXYsCi0Jc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2KQotewotCWludCByZXQ7Ci0KLQkvKiBSZWdpc3RlciB0aGUgc3ViZGV2IGFuZCB2aWRlbyBub2Rlcy4gKi8KLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYodmRldiwgJnByZXYtPnN1YmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcHJldi0+dmlkZW9faW4sIHZkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoJnByZXYtPnZpZGVvX291dCwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0Jb21hcDNpc3BfcHJldmlld191bnJlZ2lzdGVyX2VudGl0aWVzKHByZXYpOwogCXJldHVybiByZXQ7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJU1AgcHJldmlld2VyIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwCi0gKi8KLQotdm9pZCBvbWFwM2lzcF9wcmV2aWV3X2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKLXsKLX0KLQogLyoKICAqIGlzcF9wcmV2aWV3X2luaXQgLSBQcmV2aWV3ZXIgaW5pdGlhbGl6YXRpb24uCiAgKiBAZGV2IDogUG9pbnRlciB0byBJU1AgZGV2aWNlCkBAIC0yMDk1LDE5ICsyMjEzLDIwIEBACiBpbnQgb21hcDNpc3BfcHJldmlld19pbml0KHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCiB7CiAJc3RydWN0IGlzcF9wcmV2X2RldmljZSAqcHJldiA9ICZpc3AtPmlzcF9wcmV2OwotCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmcHJldi0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJldi0+d2FpdCk7CiAJcHJldmlld19pbml0X3BhcmFtcyhwcmV2KTsKIAotCXJldCA9IHByZXZpZXdfaW5pdF9lbnRpdGllcyhwcmV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJcmV0dXJuIHByZXZpZXdfaW5pdF9lbnRpdGllcyhwcmV2KTsKK30KIAotb3V0OgotCWlmIChyZXQpCi0JCW9tYXAzaXNwX3ByZXZpZXdfY2xlYW51cChpc3ApOwordm9pZCBvbWFwM2lzcF9wcmV2aWV3X2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKK3sKKwlzdHJ1Y3QgaXNwX3ByZXZfZGV2aWNlICpwcmV2ID0gJmlzcC0+aXNwX3ByZXY7CiAKLQlyZXR1cm4gcmV0OworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByZXYtPmN0cmxzKTsKKwlvbWFwM2lzcF92aWRlb19jbGVhbnVwKCZwcmV2LT52aWRlb19pbik7CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcHJldi0+dmlkZW9fb3V0KTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmcHJldi0+c3ViZGV2LmVudGl0eSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHByZXZpZXcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5oCmluZGV4IGZhOTQzYmQuLmY1NGU3NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcHJldmlldy5oCkBAIC00NSwxMSArNDUsNiBAQAogI2RlZmluZSBJU1BQUlZfQ09OVFJBU1RfSElHSAkJMHhGRgogI2RlZmluZSBJU1BQUlZfQ09OVFJBU1RfVU5JVFMJCTB4MQogCi0jZGVmaW5lIE5PX0FWRQkJCQkweDAKLSNkZWZpbmUgQVZFXzJfUElYCQkJMHgxCi0jZGVmaW5lIEFWRV80X1BJWAkJCTB4MgotI2RlZmluZSBBVkVfOF9QSVgJCQkweDMKLQogLyogRmVhdHVyZXMgbGlzdCAqLwogI2RlZmluZSBQUkVWX0xVTUFfRU5IQU5DRQkJT01BUDNJU1BfUFJFVl9MVU1BRU5ICiAjZGVmaW5lIFBSRVZfSU5WRVJTRV9BTEFXCQlPTUFQM0lTUF9QUkVWX0lOVkFMQVcKQEAgLTEwNiw3ICsxMDEsNiBAQAogICogQHJnYjJ5Y2JjcjogUkdCIHRvIHljYmNyIHBhcmFtZXRlcnMuCiAgKiBAaG1lZDogSG9yaXpvbnRhbCBtZWRpYW4gZmlsdGVyLgogICogQHljbGltaXQ6IFlDIGxpbWl0cyBwYXJhbWV0ZXJzLgotICogQGF2ZXJhZ2U6IERvd25zYW1wbGluZyByYXRlIGZvciBhdmVyYWdlci4KICAqIEBjb250cmFzdDogQ29udHJhc3QuCiAgKiBAYnJpZ2h0bmVzczogQnJpZ2h0bmVzcy4KICAqLwpAQCAtMTI0LDcgKzExOCw2IEBACiAJc3RydWN0IG9tYXAzaXNwX3ByZXZfY3NjIHJnYjJ5Y2JjcjsKIAlzdHJ1Y3Qgb21hcDNpc3BfcHJldl9obWVkIGhtZWQ7CiAJc3RydWN0IG9tYXAzaXNwX3ByZXZfeWNsaW1pdCB5Y2xpbWl0OwotCXU4IGF2ZXJhZ2U7CiAJdTggY29udHJhc3Q7CiAJdTggYnJpZ2h0bmVzczsKIH07CkBAIC0xNTksNiArMTUyLDcgQEAKICAqIEBzdWJkZXY6IFY0TDIgc3ViZGV2aWNlCiAgKiBAcGFkczogTWVkaWEgZW50aXR5IHBhZHMKICAqIEBmb3JtYXRzOiBBY3RpdmUgZm9ybWF0cyBhdCB0aGUgc3ViZGV2IHBhZAorICogQGNyb3A6IEFjdGl2ZSBjcm9wIHJlY3RhbmdsZQogICogQGlucHV0OiBNb2R1bGUgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgaW5wdXQgcGFkCiAgKiBAb3V0cHV0OiBCaXRtYXNrIG9mIHRoZSBhY3RpdmUgb3V0cHV0CiAgKiBAdmlkZW9faW46IElucHV0IHZpZGVvIGVudGl0eQpAQCAtMTc3LDYgKzE3MSw3IEBACiAJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKIAlzdHJ1Y3QgbWVkaWFfcGFkIHBhZHNbUFJFVl9QQURTX05VTV07CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBmb3JtYXRzW1BSRVZfUEFEU19OVU1dOworCXN0cnVjdCB2NGwyX3JlY3QgY3JvcDsKIAogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BxdWV1ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BxdWV1ZS5jCmluZGV4IDljMzE3MTQuLjliZWJiMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcXVldWUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHF1ZXVlLmMKQEAgLTg2OCw2ICs4NjgsMTAgQEAKIAkJZ290byBkb25lOwogCiAJaWYgKHZidWYtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSICYmCisJICAgIHZidWYtPmxlbmd0aCA8IGJ1Zi0+dmJ1Zi5sZW5ndGgpCisJCWdvdG8gZG9uZTsKKworCWlmICh2YnVmLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUiAmJgogCSAgICB2YnVmLT5tLnVzZXJwdHIgIT0gYnVmLT52YnVmLm0udXNlcnB0cikgewogCQlpc3BfdmlkZW9fYnVmZmVyX2NsZWFudXAoYnVmKTsKIAkJYnVmLT52YnVmLm0udXNlcnB0ciA9IHZidWYtPm0udXNlcnB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlZy5oCmluZGV4IDY5ZjZhZjYuLjA4NGVhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3ByZWcuaApAQCAtNDAyLDkgKzQwMiw2IEBACiAjZGVmaW5lIElTUFBSVl9ZRU5IX1RBQkxFX0FERFIJCTB4MTAwMAogI2RlZmluZSBJU1BQUlZfQ0ZBX1RBQkxFX0FERFIJCTB4MTQwMAogCi0jZGVmaW5lIElTUFBSVl9NQVhPVVRQVVRfV0lEVEgJCTEyODAKLSNkZWZpbmUgSVNQUFJWX01BWE9VVFBVVF9XSURUSF9FUzIJMzMwMAotI2RlZmluZSBJU1BQUlZfTUFYT1VUUFVUX1dJRFRIXzM2MzAJNDA5NgogI2RlZmluZSBJU1BSU1pfTUlOX09VVFBVVAkJNjQKICNkZWZpbmUgSVNQUlNaX01BWF9PVVRQVVQJCTMzMTIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3ByZXNpemVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlc2l6ZXIuYwppbmRleCAwYmIwZjhjLi41MGU1OTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlc2l6ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHJlc2l6ZXIuYwpAQCAtMTYwOCw2ICsxNjA4LDQyIEBACiAJLmxpbmtfc2V0dXAgPSByZXNpemVyX2xpbmtfc2V0dXAsCiB9OwogCit2b2lkIG9tYXAzaXNwX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcykKK3sKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcmVzLT5zdWJkZXYpOworCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnJlcy0+dmlkZW9faW4pOworCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnJlcy0+dmlkZW9fb3V0KTsKK30KKworaW50IG9tYXAzaXNwX3Jlc2l6ZXJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9yZXNfZGV2aWNlICpyZXMsCisJCQkJICAgICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKK3sKKwlpbnQgcmV0OworCisJLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZyZXMtPnN1YmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcmVzLT52aWRlb19pbiwgdmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcmVzLT52aWRlb19vdXQsIHZkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW9tYXAzaXNwX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhyZXMpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJU1AgcmVzaXplciBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cAorICovCisKIC8qCiAgKiByZXNpemVyX2luaXRfZW50aXRpZXMgLSBJbml0aWFsaXplIHJlc2l6ZXIgc3ViZGV2IGFuZCBtZWRpYSBlbnRpdHkuCiAgKiBAcmVzIDogUG9pbnRlciB0byByZXNpemVyIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTE2NTIsNjggKzE2ODgsMzQgQEAKIAogCXJldCA9IG9tYXAzaXNwX3ZpZGVvX2luaXQoJnJlcy0+dmlkZW9faW4sICJyZXNpemVyIik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfdmlkZW9faW47CiAKIAlyZXQgPSBvbWFwM2lzcF92aWRlb19pbml0KCZyZXMtPnZpZGVvX291dCwgInJlc2l6ZXIiKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcl92aWRlb19vdXQ7CiAKIAkvKiBDb25uZWN0IHRoZSB2aWRlbyBub2RlcyB0byB0aGUgcmVzaXplciBzdWJkZXYuICovCiAJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKCZyZXMtPnZpZGVvX2luLnZpZGVvLmVudGl0eSwgMCwKIAkJCSZyZXMtPnN1YmRldi5lbnRpdHksIFJFU1pfUEFEX1NJTkssIDApOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX2xpbms7CiAKIAlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnJlcy0+c3ViZGV2LmVudGl0eSwgUkVTWl9QQURfU09VUkNFLAogCQkJJnJlcy0+dmlkZW9fb3V0LnZpZGVvLmVudGl0eSwgMCwgMCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3JfbGluazsKIAogCXJldHVybiAwOwotfQogCi12b2lkIG9tYXAzaXNwX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcykKLXsKK2Vycm9yX2xpbms6CisJb21hcDNpc3BfdmlkZW9fY2xlYW51cCgmcmVzLT52aWRlb19vdXQpOworZXJyb3JfdmlkZW9fb3V0OgorCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJnJlcy0+dmlkZW9faW4pOworZXJyb3JfdmlkZW9faW46CiAJbWVkaWFfZW50aXR5X2NsZWFudXAoJnJlcy0+c3ViZGV2LmVudGl0eSk7Ci0KLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcmVzLT5zdWJkZXYpOwotCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnJlcy0+dmlkZW9faW4pOwotCW9tYXAzaXNwX3ZpZGVvX3VucmVnaXN0ZXIoJnJlcy0+dmlkZW9fb3V0KTsKLX0KLQotaW50IG9tYXAzaXNwX3Jlc2l6ZXJfcmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGlzcF9yZXNfZGV2aWNlICpyZXMsCi0JCQkJICAgICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKLXsKLQlpbnQgcmV0OwotCi0JLyogUmVnaXN0ZXIgdGhlIHN1YmRldiBhbmQgdmlkZW8gbm9kZXMuICovCi0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZyZXMtPnN1YmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcmVzLT52aWRlb19pbiwgdmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBvbWFwM2lzcF92aWRlb19yZWdpc3RlcigmcmVzLT52aWRlb19vdXQsIHZkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCW9tYXAzaXNwX3Jlc2l6ZXJfdW5yZWdpc3Rlcl9lbnRpdGllcyhyZXMpOwogCXJldHVybiByZXQ7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJU1AgcmVzaXplciBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cAotICovCi0KLXZvaWQgb21hcDNpc3BfcmVzaXplcl9jbGVhbnVwKHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCi17Ci19Ci0KIC8qCiAgKiBpc3BfcmVzaXplcl9pbml0IC0gUmVzaXplciBpbml0aWFsaXphdGlvbi4KICAqIEBpc3AgOiBQb2ludGVyIHRvIElTUCBkZXZpY2UKQEAgLTE3MjIsMTcgKzE3MjQsMTcgQEAKIGludCBvbWFwM2lzcF9yZXNpemVyX2luaXQoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKIHsKIAlzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcyA9ICZpc3AtPmlzcF9yZXM7Ci0JaW50IHJldDsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlcy0+d2FpdCk7CiAJYXRvbWljX3NldCgmcmVzLT5zdG9wcGluZywgMCk7Ci0JcmV0ID0gcmVzaXplcl9pbml0X2VudGl0aWVzKHJlcyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCXJldHVybiByZXNpemVyX2luaXRfZW50aXRpZXMocmVzKTsKK30KIAotb3V0OgotCWlmIChyZXQpCi0JCW9tYXAzaXNwX3Jlc2l6ZXJfY2xlYW51cChpc3ApOwordm9pZCBvbWFwM2lzcF9yZXNpemVyX2NsZWFudXAoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCkKK3sKKwlzdHJ1Y3QgaXNwX3Jlc19kZXZpY2UgKnJlcyA9ICZpc3AtPmlzcF9yZXM7CiAKLQlyZXR1cm4gcmV0OworCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJnJlcy0+dmlkZW9faW4pOworCW9tYXAzaXNwX3ZpZGVvX2NsZWFudXAoJnJlcy0+dmlkZW9fb3V0KTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmcmVzLT5zdWJkZXYuZW50aXR5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKaW5kZXggODA4MDY1OS4uNjhkNTM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKQEAgLTM2Niw3ICszNjYsOCBAQAogCQkJCWRtYV91bm1hcF9zZyhpc3AtPmRldiwgYnVmLT5pb3ZtLT5zZ3QtPnNnbCwKIAkJCQkJICAgICBidWYtPmlvdm0tPnNndC0+bmVudHMsCiAJCQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJCWlvbW11X3ZmcmVlKGlzcC0+aW9tbXUsIGJ1Zi0+aW9tbXVfYWRkcik7CisJCQlvbWFwX2lvbW11X3ZmcmVlKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LAorCQkJCQkJCWJ1Zi0+aW9tbXVfYWRkcik7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIWJ1Zi0+dmlydF9hZGRyKQogCQkJCWNvbnRpbnVlOwpAQCAtMzk5LDggKzQwMCw4IEBACiAJCXN0cnVjdCBpb3ZtX3N0cnVjdCAqaW92bTsKIAogCQlXQVJOX09OKGJ1Zi0+ZG1hX2FkZHIpOwotCQlidWYtPmlvbW11X2FkZHIgPSBpb21tdV92bWFsbG9jKGlzcC0+aW9tbXUsIDAsIHNpemUsCi0JCQkJCQlJT01NVV9GTEFHKTsKKwkJYnVmLT5pb21tdV9hZGRyID0gb21hcF9pb21tdV92bWFsbG9jKGlzcC0+ZG9tYWluLCBpc3AtPmlvbW11LCAwLAorCQkJCQkJCXNpemUsIElPTU1VX0ZMQUcpOwogCQlpZiAoSVNfRVJSKCh2b2lkICopYnVmLT5pb21tdV9hZGRyKSkgewogCQkJZGV2X2VycihzdGF0LT5pc3AtPmRldiwKIAkJCQkgIiVzOiBDYW4ndCBhY3F1aXJlIG1lbW9yeSBmb3IgIgpAQCAtNDA5LDcgKzQxMCw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWlvdm0gPSBmaW5kX2lvdm1fYXJlYShpc3AtPmlvbW11LCBidWYtPmlvbW11X2FkZHIpOworCQlpb3ZtID0gb21hcF9maW5kX2lvdm1fYXJlYShpc3AtPmlvbW11LCBidWYtPmlvbW11X2FkZHIpOwogCQlpZiAoIWlvdm0gfHwKIAkJICAgICFkbWFfbWFwX3NnKGlzcC0+ZGV2LCBpb3ZtLT5zZ3QtPnNnbCwgaW92bS0+c2d0LT5uZW50cywKIAkJCQlETUFfRlJPTV9ERVZJQ0UpKSB7CkBAIC00MTgsNyArNDE5LDcgQEAKIAkJfQogCQlidWYtPmlvdm0gPSBpb3ZtOwogCi0JCWJ1Zi0+dmlydF9hZGRyID0gZGFfdG9fdmEoc3RhdC0+aXNwLT5pb21tdSwKKwkJYnVmLT52aXJ0X2FkZHIgPSBvbWFwX2RhX3RvX3ZhKHN0YXQtPmlzcC0+aW9tbXUsCiAJCQkJCSAgKHUzMilidWYtPmlvbW11X2FkZHIpOwogCQlidWYtPmVtcHR5ID0gMTsKIAkJZGV2X2RiZyhzdGF0LT5pc3AtPmRldiwgIiVzOiBidWZmZXJbJWRdIGFsbG9jYXRlZC4iCkBAIC0xMDIyLDI0ICsxMDIzLDYgQEAKIAlfX3N0YXRfaXNyKHN0YXQsIDEpOwogfQogCi1zdGF0aWMgaW50IGlzcF9zdGF0X2luaXRfZW50aXRpZXMoc3RydWN0IGlzcHN0YXQgKnN0YXQsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICpzZF9vcHMpCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSAmc3RhdC0+c3ViZGV2OwotCXN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lID0gJnN1YmRldi0+ZW50aXR5OwotCi0JdjRsMl9zdWJkZXZfaW5pdChzdWJkZXYsIHNkX29wcyk7Ci0Jc25wcmludGYoc3ViZGV2LT5uYW1lLCBWNEwyX1NVQkRFVl9OQU1FX1NJWkUsICJPTUFQMyBJU1AgJXMiLCBuYW1lKTsKLQlzdWJkZXYtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Agc3ViZGV2cyAqLwotCXN1YmRldi0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoc3ViZGV2LCBzdGF0KTsKLQotCXN0YXQtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOwotCW1lLT5vcHMgPSBOVUxMOwotCi0JcmV0dXJuIG1lZGlhX2VudGl0eV9pbml0KG1lLCAxLCAmc3RhdC0+cGFkLCAwKTsKLX0KLQogaW50IG9tYXAzaXNwX3N0YXRfc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAogCQkJCSAgc3RydWN0IHY0bDJfZmggKmZoLAogCQkJCSAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCkBAIC0xMDYxLDcgKzEwNDQsNiBAQAogCiB2b2lkIG9tYXAzaXNwX3N0YXRfdW5yZWdpc3Rlcl9lbnRpdGllcyhzdHJ1Y3QgaXNwc3RhdCAqc3RhdCkKIHsKLQltZWRpYV9lbnRpdHlfY2xlYW51cCgmc3RhdC0+c3ViZGV2LmVudGl0eSk7CiAJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnN0YXQtPnN1YmRldik7CiB9CiAKQEAgLTEwNzEsMjEgKzEwNTMsNTAgQEAKIAlyZXR1cm4gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHZkZXYsICZzdGF0LT5zdWJkZXYpOwogfQogCitzdGF0aWMgaW50IGlzcF9zdGF0X2luaXRfZW50aXRpZXMoc3RydWN0IGlzcHN0YXQgKnN0YXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICpzZF9vcHMpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSAmc3RhdC0+c3ViZGV2OworCXN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lID0gJnN1YmRldi0+ZW50aXR5OworCisJdjRsMl9zdWJkZXZfaW5pdChzdWJkZXYsIHNkX29wcyk7CisJc25wcmludGYoc3ViZGV2LT5uYW1lLCBWNEwyX1NVQkRFVl9OQU1FX1NJWkUsICJPTUFQMyBJU1AgJXMiLCBuYW1lKTsKKwlzdWJkZXYtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Agc3ViZGV2cyAqLworCXN1YmRldi0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCXY0bDJfc2V0X3N1YmRldmRhdGEoc3ViZGV2LCBzdGF0KTsKKworCXN0YXQtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCW1lLT5vcHMgPSBOVUxMOworCisJcmV0dXJuIG1lZGlhX2VudGl0eV9pbml0KG1lLCAxLCAmc3RhdC0+cGFkLCAwKTsKK30KKwogaW50IG9tYXAzaXNwX3N0YXRfaW5pdChzdHJ1Y3QgaXNwc3RhdCAqc3RhdCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKnNkX29wcykKIHsKKwlpbnQgcmV0OworCiAJc3RhdC0+YnVmID0ga2NhbGxvYyhTVEFUX01BWF9CVUZTLCBzaXplb2YoKnN0YXQtPmJ1ZiksIEdGUF9LRVJORUwpOwogCWlmICghc3RhdC0+YnVmKQogCQlyZXR1cm4gLUVOT01FTTsKKwogCWlzcF9zdGF0X2J1Zl9jbGVhcihzdGF0KTsKIAltdXRleF9pbml0KCZzdGF0LT5pb2N0bF9sb2NrKTsKIAlhdG9taWNfc2V0KCZzdGF0LT5idWZfZXJyLCAwKTsKIAotCXJldHVybiBpc3Bfc3RhdF9pbml0X2VudGl0aWVzKHN0YXQsIG5hbWUsIHNkX29wcyk7CisJcmV0ID0gaXNwX3N0YXRfaW5pdF9lbnRpdGllcyhzdGF0LCBuYW1lLCBzZF9vcHMpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X2Rlc3Ryb3koJnN0YXQtPmlvY3RsX2xvY2spOworCQlrZnJlZShzdGF0LT5idWYpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgb21hcDNpc3Bfc3RhdF9mcmVlKHN0cnVjdCBpc3BzdGF0ICpzdGF0KQordm9pZCBvbWFwM2lzcF9zdGF0X2NsZWFudXAoc3RydWN0IGlzcHN0YXQgKnN0YXQpCiB7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnN0YXQtPnN1YmRldi5lbnRpdHkpOworCW11dGV4X2Rlc3Ryb3koJnN0YXQtPmlvY3RsX2xvY2spOwogCWlzcF9zdGF0X2J1ZnNfZnJlZShzdGF0KTsKIAlrZnJlZShzdGF0LT5idWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuaAppbmRleCBkODZkYTk0Li45YjdjODY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCQkJICAgICBzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9kYXRhICpkYXRhKTsKIGludCBvbWFwM2lzcF9zdGF0X2luaXQoc3RydWN0IGlzcHN0YXQgKnN0YXQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICpzZF9vcHMpOwotdm9pZCBvbWFwM2lzcF9zdGF0X2ZyZWUoc3RydWN0IGlzcHN0YXQgKnN0YXQpOwordm9pZCBvbWFwM2lzcF9zdGF0X2NsZWFudXAoc3RydWN0IGlzcHN0YXQgKnN0YXQpOwogaW50IG9tYXAzaXNwX3N0YXRfc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LAogCQkJCSAgc3RydWN0IHY0bDJfZmggKmZoLAogCQkJCSAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCmluZGV4IGZkOTY1YWQuLmQxMDAwNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKQEAgLTI3OCw3ICsyNzgsOCBAQAogICogbGltaXRzIHJlcG9ydGVkIGJ5IGV2ZXJ5IGJsb2NrIGluIHRoZSBwaXBlbGluZS4KICAqCiAgKiBSZXR1cm4gMCBpZiBhbGwgZm9ybWF0cyBtYXRjaCwgb3IgLUVQSVBFIGlmIGF0IGxlYXN0IG9uZSBsaW5rIGlzIGZvdW5kIHdpdGgKLSAqIGRpZmZlcmVudCBmb3JtYXRzIG9uIGl0cyB0d28gZW5kcy4KKyAqIGRpZmZlcmVudCBmb3JtYXRzIG9uIGl0cyB0d28gZW5kcyBvciBpZiB0aGUgcGlwZWxpbmUgZG9lc24ndCBzdGFydCB3aXRoIGEKKyAqIHZpZGVvIHNvdXJjZSAoZWl0aGVyIGEgc3ViZGV2IHdpdGggbm8gaW5wdXQgcGFkLCBvciBhIG5vbi1zdWJkZXYgZW50aXR5KS4KICAqLwogc3RhdGljIGludCBpc3BfdmlkZW9fdmFsaWRhdGVfcGlwZWxpbmUoc3RydWN0IGlzcF9waXBlbGluZSAqcGlwZSkKIHsKQEAgLTMyOSwxMCArMzMwLDE1IEBACiAJCSAqIGluIHRoZSBtaWRkbGUgb2YgaXQuICovCiAJCXNoaWZ0ZXJfbGluayA9IHN1YmRldiA9PSAmaXNwLT5pc3BfY2NkYy5zdWJkZXY7CiAKLQkJLyogUmV0cmlldmUgdGhlIHNvdXJjZSBmb3JtYXQgKi8KKwkJLyogUmV0cmlldmUgdGhlIHNvdXJjZSBmb3JtYXQuIFJldHVybiBhbiBlcnJvciBpZiBubyBzb3VyY2UKKwkJICogZW50aXR5IGNhbiBiZSBmb3VuZCwgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHBpcGVsaW5lIGlmIHRoZQorCQkgKiBzb3VyY2UgZW50aXR5IGlzbid0IGEgc3ViZGV2LgorCQkgKi8KIAkJcGFkID0gbWVkaWFfZW50aXR5X3JlbW90ZV9zb3VyY2UocGFkKTsKLQkJaWYgKHBhZCA9PSBOVUxMIHx8Ci0JCSAgICBtZWRpYV9lbnRpdHlfdHlwZShwYWQtPmVudGl0eSkgIT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYpCisJCWlmIChwYWQgPT0gTlVMTCkKKwkJCXJldHVybiAtRVBJUEU7CisKKwkJaWYgKG1lZGlhX2VudGl0eV90eXBlKHBhZC0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKIAkJCWJyZWFrOwogCiAJCXN1YmRldiA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihwYWQtPmVudGl0eSk7CkBAIC00NDYsNyArNDUyLDcgQEAKIAlzZ3QtPm5lbnRzID0gc2dsZW47CiAJc2d0LT5vcmlnX25lbnRzID0gc2dsZW47CiAKLQlkYSA9IGlvbW11X3ZtYXAoaXNwLT5pb21tdSwgMCwgc2d0LCBJT01NVV9GTEFHKTsKKwlkYSA9IG9tYXBfaW9tbXVfdm1hcChpc3AtPmRvbWFpbiwgaXNwLT5pb21tdSwgMCwgc2d0LCBJT01NVV9GTEFHKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKGRhKSkKIAkJa2ZyZWUoc2d0KTsKIApAQCAtNDYyLDcgKzQ2OCw3IEBACiB7CiAJc3RydWN0IHNnX3RhYmxlICpzZ3Q7CiAKLQlzZ3QgPSBpb21tdV92dW5tYXAoaXNwLT5pb21tdSwgKHUzMilkYSk7CisJc2d0ID0gb21hcF9pb21tdV92dW5tYXAoaXNwLT5kb21haW4sIGlzcC0+aW9tbXUsICh1MzIpZGEpOwogCWtmcmVlKHNndCk7CiB9CiAKQEAgLTEwNTAsNiArMTA1NiwxNCBAQAogCQlpZiAodmlkZW8tPmlzcC0+cGRhdGEtPnNldF9jb25zdHJhaW50cykKIAkJCXZpZGVvLT5pc3AtPnBkYXRhLT5zZXRfY29uc3RyYWludHModmlkZW8tPmlzcCwgZmFsc2UpOwogCQltZWRpYV9lbnRpdHlfcGlwZWxpbmVfc3RvcCgmdmlkZW8tPnZpZGVvLmVudGl0eSk7CisJCS8qIFRoZSBETUEgcXVldWUgbXVzdCBiZSBlbXB0aWVkIGhlcmUsIG90aGVyd2lzZSBDQ0RDIGludGVycnVwdHMKKwkJICogdGhhdCB3aWxsIGdldCB0cmlnZ2VyZWQgdGhlIG5leHQgdGltZSB0aGUgQ0NEQyBpcyBwb3dlcmVkIHVwCisJCSAqIHdpbGwgdHJ5IHRvIGFjY2VzcyBidWZmZXJzIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGZyZWVkIGJ1dAorCQkgKiBzdGlsbCBwcmVzZW50IGluIHRoZSBETUEgcXVldWUuIFRoaXMgY2FuIGVhc2lseSBnZXQgdHJpZ2dlcmVkCisJCSAqIGlmIHRoZSBhYm92ZSBvbWFwM2lzcF9waXBlbGluZV9zZXRfc3RyZWFtKCkgY2FsbCBmYWlscyBvbiBhCisJCSAqIHN5c3RlbSB3aXRoIGEgZnJlZS1ydW5uaW5nIHNlbnNvci4KKwkJICovCisJCUlOSVRfTElTVF9IRUFEKCZ2aWRlby0+ZG1hcXVldWUpOwogCQl2aWRlby0+cXVldWUgPSBOVUxMOwogCX0KIApAQCAtMTMxMSw2ICsxMzI1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgb21hcDNpc3BfdmlkZW9fY2xlYW51cChzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbykKK3sKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmdmlkZW8tPnZpZGVvLmVudGl0eSk7CisJbXV0ZXhfZGVzdHJveSgmdmlkZW8tPnN0cmVhbV9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZ2aWRlby0+bXV0ZXgpOworfQorCiBpbnQgb21hcDNpc3BfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8sIHN0cnVjdCB2NGwyX2RldmljZSAqdmRldikKIHsKIAlpbnQgcmV0OwpAQCAtMTMyNyw4ICsxMzQ4LDYgQEAKIAogdm9pZCBvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKQogewotCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKCZ2aWRlby0+dmlkZW8pKSB7Ci0JCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmlkZW8uZW50aXR5KTsKKwlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZCgmdmlkZW8tPnZpZGVvKSkKIAkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnZpZGVvLT52aWRlbyk7Ci0JfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oCmluZGV4IDUzMTYwYWEuLjA4Y2JmYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmgKQEAgLTE5MCw2ICsxOTAsNyBAQAogCQkJCWNvbnRhaW5lcl9vZihxLCBzdHJ1Y3QgaXNwX3ZpZGVvX2ZoLCBxdWV1ZSkKIAogaW50IG9tYXAzaXNwX3ZpZGVvX2luaXQoc3RydWN0IGlzcF92aWRlbyAqdmlkZW8sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBvbWFwM2lzcF92aWRlb19jbGVhbnVwKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKTsKIGludCBvbWFwM2lzcF92aWRlb19yZWdpc3RlcihzdHJ1Y3QgaXNwX3ZpZGVvICp2aWRlbywKIAkJCSAgICBzdHJ1Y3QgdjRsMl9kZXZpY2UgKnZkZXYpOwogdm9pZCBvbWFwM2lzcF92aWRlb191bnJlZ2lzdGVyKHN0cnVjdCBpc3BfdmlkZW8gKnZpZGVvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jCmluZGV4IDljZTJmYTAuLmI1MjQ3Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYwpAQCAtMTgsMTEgKzE4LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAogI2RlZmluZSBWQUxfU0VUKHgsIG1hc2ssIHJzaGlmdCwgbHNoaWZ0KSAgXAogCQkoKCgoeCkgPj4gcnNoaWZ0KSAmIG1hc2spIDw8IGxzaGlmdCkKQEAgLTI5OSwxMiArMzAxLDEwIEBACiAKIHN0cnVjdCBvdjI2NDBfcHJpdiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2CQlzdWJkZXY7Ci0Jc3RydWN0IG92MjY0MF9jYW1lcmFfaW5mbwkqaW5mbzsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIJaGRsOwogCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZQljZm10X2NvZGU7CiAJY29uc3Qgc3RydWN0IG92MjY0MF93aW5fc2l6ZQkqd2luOwogCWludAkJCQltb2RlbDsKLQl1MTYJCQkJZmxhZ192ZmxpcDoxOwotCXUxNgkJCQlmbGFnX2hmbGlwOjE7CiB9OwogCiAvKgpAQCAtNjEwLDI5ICs2MTAsNiBAQAogfTsKIAogLyoKLSAqIFN1cHBvcnRlZCBjb250cm9scwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG92MjY0MF9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1ZGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiRmxpcCBWZXJ0aWNhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQotLyoKICAqIEdlbmVyYWwgZnVuY3Rpb25zCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgb3YyNjQwX3ByaXYgKnRvX292MjY0MChjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtNzAxLDgxICs2NzgsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvdjI2NDBfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGludCBvdjI2NDBfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyB3aWR0aF9mbGFnID0gZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQotCS8qIE9ubHkgb25lIHdpZHRoIGJpdCBtYXkgYmUgc2V0ICovCi0JaWYgKCFpc19wb3dlcl9vZl8yKHdpZHRoX2ZsYWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpY2wtPnNldF9idXNfcGFyYW0pCi0JCXJldHVybiBpY2wtPnNldF9idXNfcGFyYW0oaWNsLCB3aWR0aF9mbGFnKTsKLQotCS8qCi0JICogV2l0aG91dCBib2FyZCBzcGVjaWZpYyBidXMgd2lkdGggc2V0dGluZ3Mgd2Ugc3VwcG9ydCBvbmx5IHRoZQotCSAqIHNlbnNvcnMgbmF0aXZlIGJ1cyB3aWR0aCB3aXRjaCBhcmUgdGVzdGVkIHdvcmtpbmcKLQkgKi8KLQlpZiAod2lkdGhfZmxhZyAmIChTT0NBTV9EQVRBV0lEVEhfMTAgfCBTT0NBTV9EQVRBV0lEVEhfOCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG92MjY0MF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JaWYgKGljbC0+cXVlcnlfYnVzX3BhcmFtKQotCQlmbGFncyB8PSBpY2wtPnF1ZXJ5X2J1c19wYXJhbShpY2wpICYgU09DQU1fREFUQVdJRFRIX01BU0s7Ci0JZWxzZQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3YyNjQwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoteworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPQorCQkmY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBvdjI2NDBfcHJpdiwgaGRsKS0+c3ViZGV2OwogCXN0cnVjdCBpMmNfY2xpZW50ICAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG92MjY0MF9wcml2ICpwcml2ID0gdG9fb3YyNjQwKGNsaWVudCk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX3ZmbGlwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmZsYWdfaGZsaXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjI2NDBfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgb3YyNjQwX3ByaXYgKnByaXYgPSB0b19vdjI2NDAoY2xpZW50KTsKLQlpbnQgcmV0ID0gMDsKIAl1OCB2YWw7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJdmFsID0gY3RybC0+dmFsdWUgPyBSRUcwNF9WRkxJUF9JTUcgOiAweDAwOwotCQlwcml2LT5mbGFnX3ZmbGlwID0gY3RybC0+dmFsdWUgPyAxIDogMDsKLQkJcmV0ID0gb3YyNjQwX21hc2tfc2V0KGNsaWVudCwgUkVHMDQsIFJFRzA0X1ZGTElQX0lNRywgdmFsKTsKLQkJYnJlYWs7CisJCXZhbCA9IGN0cmwtPnZhbCA/IFJFRzA0X1ZGTElQX0lNRyA6IDB4MDA7CisJCXJldHVybiBvdjI2NDBfbWFza19zZXQoY2xpZW50LCBSRUcwNCwgUkVHMDRfVkZMSVBfSU1HLCB2YWwpOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCXZhbCA9IGN0cmwtPnZhbHVlID8gUkVHMDRfSEZMSVBfSU1HIDogMHgwMDsKLQkJcHJpdi0+ZmxhZ19oZmxpcCA9IGN0cmwtPnZhbHVlID8gMSA6IDA7Ci0JCXJldCA9IG92MjY0MF9tYXNrX3NldChjbGllbnQsIFJFRzA0LCBSRUcwNF9IRkxJUF9JTUcsIHZhbCk7Ci0JCWJyZWFrOworCQl2YWwgPSBjdHJsLT52YWwgPyBSRUcwNF9IRkxJUF9JTUcgOiAweDAwOworCQlyZXR1cm4gb3YyNjQwX21hc2tfc2V0KGNsaWVudCwgUkVHMDQsIFJFRzA0X0hGTElQX0lNRywgdmFsKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IG92MjY0MF9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKQEAgLTEwMjMsMTggKzk0MiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG92MjY0MF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92MjY0MF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBvdjI2NDBfcHJpdiAqcHJpdiA9IHRvX292MjY0MChjbGllbnQpOwogCXU4IHBpZCwgdmVyLCBtaWRoLCBtaWRsOwogCWNvbnN0IGNoYXIgKmRldm5hbWU7CiAJaW50IHJldDsKIAotCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCi0JQlVHX09OKCFpY2QtPnBhcmVudCB8fAotCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKLQogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECiAJICovCkBAIC0xMDYwLDIyICs5NzQsMTcgQEAKIAkJICIlcyBQcm9kdWN0IElEICUweDolMHggTWFudWZhY3R1cmVyIElEICV4OiV4XG4iLAogCQkgZGV2bmFtZSwgcGlkLCB2ZXIsIG1pZGgsIG1pZGwpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZwcml2LT5oZGwpOwogCiBlcnI6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBvdjI2NDBfb3BzID0gewotCS5zZXRfYnVzX3BhcmFtCQk9IG92MjY0MF9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBvdjI2NDBfcXVlcnlfYnVzX3BhcmFtLAotCS5jb250cm9scwkJPSBvdjI2NDBfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG92MjY0MF9jb250cm9scyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgb3YyNjQwX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBvdjI2NDBfc19jdHJsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjI2NDBfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2N0cmwJCT0gb3YyNjQwX2dfY3RybCwKLQkuc19jdHJsCQk9IG92MjY0MF9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG92MjY0MF9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gb3YyNjQwX2dfcmVnaXN0ZXIsCkBAIC0xMDgzLDYgKzk5MiwyMSBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgaW50IG92MjY0MF9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfTUFTVEVSIHwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0g7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX1BBUkFMTEVMOworCWNmZy0+ZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjI2NDBfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBvdjI2NDBfc19zdHJlYW0sCiAJLmdfbWJ1c19mbXQJPSBvdjI2NDBfZ19mbXQsCkBAIC0xMDkxLDYgKzEwMTUsNyBAQAogCS5jcm9wY2FwCT0gb3YyNjQwX2Nyb3BjYXAsCiAJLmdfY3JvcAkJPSBvdjI2NDBfZ19jcm9wLAogCS5lbnVtX21idXNfZm10CT0gb3YyNjQwX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gb3YyNjQwX2dfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjI2NDBfc3ViZGV2X29wcyA9IHsKQEAgLTExMDQsMTggKzEwMjksMTEgQEAKIHN0YXRpYyBpbnQgb3YyNjQwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewotCXN0cnVjdCBvdjI2NDBfcHJpdiAgICAgICAgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgICAgICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICAgICppY2w7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBvdjI2NDBfcHJpdgkqcHJpdjsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rCSppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlpbnQJCQlyZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJPVjI2NDA6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCWlmICghaWNsKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwKIAkJCSJPVjI2NDA6IE1pc3NpbmcgcGxhdGZvcm1fZGF0YSBmb3IgZHJpdmVyXG4iKTsKQEAgLTExMzUsMTUgKzEwNTMsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcHJpdi0+aW5mbyA9IGljbC0+cHJpdjsKLQogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJm92MjY0MF9zdWJkZXZfb3BzKTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZwcml2LT5oZGwsIDIpOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjI2NDBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92MjY0MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0hGTElQLCAwLCAxLCAxLCAwKTsKKwlwcml2LT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJnByaXYtPmhkbDsKKwlpZiAocHJpdi0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSBwcml2LT5oZGwuZXJyb3I7CiAKLQlpY2QtPm9wcyA9ICZvdjI2NDBfb3BzOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKLQlyZXQgPSBvdjI2NDBfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG92MjY0MF92aWRlb19wcm9iZShjbGllbnQpOwogCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCQlrZnJlZShwcml2KTsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiT1YyNjQwIFByb2JlZFxuIik7CkBAIC0xMTU1LDkgKzEwODEsOSBAQAogc3RhdGljIGludCBvdjI2NDBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG92MjY0MF9wcml2ICAgICAgICpwcml2ID0gdG9fb3YyNjQwKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWNkLT5vcHMgPSBOVUxMOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJa2ZyZWUocHJpdik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjU2NDIuYwppbmRleCAzNDlhNGFkLi5iYjM3ZWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMKQEAgLTE0LDE0ICsxNCwxNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogCkBAIC0zNSw3ICszNyw3IEBACiAjZGVmaW5lIFJFR19XSU5ET1dfU1RBUlRfWV9MT1cJCTB4MzgwMwogI2RlZmluZSBSRUdfV0lORE9XX1dJRFRIX0hJR0gJCTB4MzgwNAogI2RlZmluZSBSRUdfV0lORE9XX1dJRFRIX0xPVwkJMHgzODA1Ci0jZGVmaW5lIFJFR19XSU5ET1dfSEVJR0hUX0hJR0ggCQkweDM4MDYKKyNkZWZpbmUgUkVHX1dJTkRPV19IRUlHSFRfSElHSAkJMHgzODA2CiAjZGVmaW5lIFJFR19XSU5ET1dfSEVJR0hUX0xPVwkJMHgzODA3CiAjZGVmaW5lIFJFR19PVVRfV0lEVEhfSElHSAkJMHgzODA4CiAjZGVmaW5lIFJFR19PVVRfV0lEVEhfTE9XCQkweDM4MDkKQEAgLTQ1LDIwICs0Nyw0NSBAQAogI2RlZmluZSBSRUdfT1VUX1RPVEFMX1dJRFRIX0xPVwkJMHgzODBkCiAjZGVmaW5lIFJFR19PVVRfVE9UQUxfSEVJR0hUX0hJR0gJMHgzODBlCiAjZGVmaW5lIFJFR19PVVRfVE9UQUxfSEVJR0hUX0xPVwkweDM4MGYKKyNkZWZpbmUgUkVHX09VVFBVVF9GT1JNQVQJCTB4NDMwMAorI2RlZmluZSBSRUdfSVNQX0NUUkxfMDEJCQkweDUwMDEKKyNkZWZpbmUgUkVHX0FWR19XSU5ET1dfRU5EX1hfSElHSAkweDU2ODIKKyNkZWZpbmUgUkVHX0FWR19XSU5ET1dfRU5EX1hfTE9XCTB4NTY4MworI2RlZmluZSBSRUdfQVZHX1dJTkRPV19FTkRfWV9ISUdICTB4NTY4NgorI2RlZmluZSBSRUdfQVZHX1dJTkRPV19FTkRfWV9MT1cJMHg1Njg3CiAKLS8qCi0gKiBkZWZpbmUgc3RhbmRhcmQgcmVzb2x1dGlvbi4KLSAqIFdvcmtzIGN1cnJlbnRseSBvbmx5IGZvciB1cCB0byA3MjAgbGluZXMKLSAqIGVnLiAzMjB4MjQwLCA2NDB4NDgwLCA4MDB4NjAwLCAxMjgweDcyMCwgMjA0OHg3MjAKLSAqLwotCi0jZGVmaW5lIE9WNTY0Ml9XSURUSAkJMTI4MAotI2RlZmluZSBPVjU2NDJfSEVJR0hUCQk3MjAKLSNkZWZpbmUgT1Y1NjQyX1RPVEFMX1dJRFRICTMyMDAKLSNkZWZpbmUgT1Y1NjQyX1RPVEFMX0hFSUdIVAkyMDAwCisvKiBhY3RpdmUgcGl4ZWwgYXJyYXkgc2l6ZSAqLwogI2RlZmluZSBPVjU2NDJfU0VOU09SX1NJWkVfWAkyNTkyCiAjZGVmaW5lIE9WNTY0Ml9TRU5TT1JfU0laRV9ZCTE5NDQKIAorLyoKKyAqIEFib3V0IE9WNTY0MiByZXNvbHV0aW9uLCBjcm9wcGluZyBhbmQgYmlubmluZzoKKyAqIFRoaXMgc2Vuc29yIHN1cHBvcnRzIGl0IGFsbCwgYXQgbGVhc3QgaW4gdGhlIGZlYXR1cmUgZGVzY3JpcHRpb24uCisgKiBVbmZvcnR1bmF0ZWx5LCBubyBjb21iaW5hdGlvbiBvZiBhcHByb3ByaWF0ZSByZWdpc3RlcnMgc2V0dGluZ3MgY291bGQgbWFrZQorICogdGhlIGNoaXAgd29yayB0aGUgaW50ZW5kZWQgd2F5LiBBcyBpdCB3b3JrcyB3aXRoIHByZWRlZmluZWQgcmVnaXN0ZXIgbGlzdHMsCisgKiBzb21lIHVuZG9jdW1lbnRlZCByZWdpc3RlcnMgYXJlIHByZXN1bWFibHkgY2hhbmdlZCB0aGVyZSB0byBhY2hpZXZlIHRoZWlyCisgKiBnb2Fscy4KKyAqIFRoaXMgZHJpdmVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciByZXNvbHV0aW9ucyB1cCB0byA3MjAgbGluZXMgd2l0aCBhCisgKiAxOjEgc2NhbGUuIEhvcGVmdWxseSB0aGVzZSByZXN0cmljdGlvbnMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgKi8KKyNkZWZpbmUgT1Y1NjQyX01BWF9XSURUSAlPVjU2NDJfU0VOU09SX1NJWkVfWAorI2RlZmluZSBPVjU2NDJfTUFYX0hFSUdIVAk3MjAKKworLyogZGVmYXVsdCBzaXplcyAqLworI2RlZmluZSBPVjU2NDJfREVGQVVMVF9XSURUSAkxMjgwCisjZGVmaW5lIE9WNTY0Ml9ERUZBVUxUX0hFSUdIVAlPVjU2NDJfTUFYX0hFSUdIVAorCisvKiBtaW5pbXVtIGV4dHJhIGJsYW5raW5nICovCisjZGVmaW5lIEJMQU5LSU5HX0VYVFJBX1dJRFRICQk1MDAKKyNkZWZpbmUgQkxBTktJTkdfRVhUUkFfSEVJR0hUCQkyMAorCisvKgorICogdGhlIHNlbnNvcidzIGF1dG9leHBvc3VyZSBpcyBidWdneSB3aGVuIHNldHRpbmcgdG90YWxfaGVpZ2h0IGxvdy4KKyAqIEl0IHRyaWVzIHRvIGV4cG9zZSBsb25nZXIgdGhhbiAxIGZyYW1lIHBlcmlvZCB3aXRob3V0IHRha2luZyBjYXJlIG9mIGl0CisgKiBhbmQgdGhpcyBsZWFkcyB0byB3ZWlyZCBvdXRwdXQuIFNvIHdlIHNldCAxMDAwIGxpbmVzIGFzIG1pbmltdW0uCisgKi8KKyNkZWZpbmUgQkxBTktJTkdfTUlOX0hFSUdIVAkJMTAwMAorCiBzdHJ1Y3QgcmVndmFsX2xpc3QgewogCXUxNiByZWdfbnVtOwogCXU4IHZhbHVlOwpAQCAtNTgyLDYgKzYwOSwxMSBAQAogc3RydWN0IG92NTY0MiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2CQlzdWJkZXY7CiAJY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10CSpmbXQ7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgICAgICAgICBjcm9wX3JlY3Q7CisKKwkvKiBibGFua2luZyBpbmZvcm1hdGlvbiAqLworCWludCB0b3RhbF93aWR0aDsKKwlpbnQgdG90YWxfaGVpZ2h0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdCBvdjU2NDJfY29sb3VyX2ZtdHNbXSA9IHsKQEAgLTY0Miw2ICs2NzQsMjEgQEAKIAogCXJldHVybiAwOwogfQorCisvKgorICogY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gd3JpdGUgMTYgYml0IHJlZ2lzdGVyIHZhbHVlcyB0aGF0IGFyZSBzcGxpdCB1cAorICogaW50byB0d28gY29uc2VjdXRpdmUgaGlnaCBhbmQgbG93IHBhcnRzCisgKi8KK3N0YXRpYyBpbnQgcmVnX3dyaXRlMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTE2IHZhbDE2KQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCByZWcsIHZhbDE2ID4+IDgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIHJlZyArIDEsIHZhbDE2ICYgMHgwMGZmKTsKK30KKwogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIHN0YXRpYyBpbnQgb3Y1NjQyX2dldF9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKIHsKQEAgLTY4NSw1OCArNzMyLDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Y1NjQyX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92NTY0Ml9zZXRfcmVzb2x1dGlvbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2ID0gdG9fb3Y1NjQyKGNsaWVudCk7CisJaW50IHdpZHRoID0gcHJpdi0+Y3JvcF9yZWN0LndpZHRoOworCWludCBoZWlnaHQgPSBwcml2LT5jcm9wX3JlY3QuaGVpZ2h0OworCWludCB0b3RhbF93aWR0aCA9IHByaXYtPnRvdGFsX3dpZHRoOworCWludCB0b3RhbF9oZWlnaHQgPSBwcml2LT50b3RhbF9oZWlnaHQ7CisJaW50IHN0YXJ0X3ggPSAoT1Y1NjQyX1NFTlNPUl9TSVpFX1ggLSB3aWR0aCkgLyAyOworCWludCBzdGFydF95ID0gKE9WNTY0Ml9TRU5TT1JfU0laRV9ZIC0gaGVpZ2h0KSAvIDI7CiAJaW50IHJldDsKLQl1OCBzdGFydF94X2hpZ2ggPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9YIC0gT1Y1NjQyX1dJRFRIKSAvIDIpID4+IDg7Ci0JdTggc3RhcnRfeF9sb3cgID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWCAtIE9WNTY0Ml9XSURUSCkgLyAyKSAmIDB4ZmY7Ci0JdTggc3RhcnRfeV9oaWdoID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWSAtIE9WNTY0Ml9IRUlHSFQpIC8gMikgPj4gODsKLQl1OCBzdGFydF95X2xvdyAgPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9ZIC0gT1Y1NjQyX0hFSUdIVCkgLyAyKSAmIDB4ZmY7CiAKLQl1OCB3aWR0aF9oaWdoCT0gT1Y1NjQyX1dJRFRIICA+PiA4OwotCXU4IHdpZHRoX2xvdwk9IE9WNTY0Ml9XSURUSCAgJiAweGZmOwotCXU4IGhlaWdodF9oaWdoCT0gT1Y1NjQyX0hFSUdIVCA+PiA4OwotCXU4IGhlaWdodF9sb3cJPSBPVjU2NDJfSEVJR0hUICYgMHhmZjsKLQotCXU4IHRvdGFsX3dpZHRoX2hpZ2ggID0gT1Y1NjQyX1RPVEFMX1dJRFRIICA+PiA4OwotCXU4IHRvdGFsX3dpZHRoX2xvdyAgID0gT1Y1NjQyX1RPVEFMX1dJRFRIICAmIDB4ZmY7Ci0JdTggdG90YWxfaGVpZ2h0X2hpZ2ggPSBPVjU2NDJfVE9UQUxfSEVJR0hUID4+IDg7Ci0JdTggdG90YWxfaGVpZ2h0X2xvdyAgPSBPVjU2NDJfVE9UQUxfSEVJR0hUICYgMHhmZjsKLQotCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWF9ISUdILCBzdGFydF94X2hpZ2gpOworCS8qCisJICogVGhpcyBzaG91bGQgc2V0IHRoZSBzdGFydGluZyBwb2ludCBmb3IgY3JvcHBpbmcuCisJICogRG9lc24ndCB3b3JrIHNvIGZhci4KKwkgKi8KKwlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWF9ISUdILCBzdGFydF94KTsKIAlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9YX0xPVywgc3RhcnRfeF9sb3cpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1lfSElHSCwgc3RhcnRfeV9oaWdoKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9ZX0xPVywgc3RhcnRfeV9sb3cpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWV9ISUdILCBzdGFydF95KTsKKwlpZiAoIXJldCkgeworCQlwcml2LT5jcm9wX3JlY3QubGVmdCA9IHN0YXJ0X3g7CisJCXByaXYtPmNyb3BfcmVjdC50b3AgPSBzdGFydF95OworCX0KIAogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1dJRFRIX0hJR0gsIHdpZHRoX2hpZ2gpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19XSU5ET1dfV0lEVEhfSElHSCwgd2lkdGgpOwogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1dJRFRIX0xPVyAsIHdpZHRoX2xvdyk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfSEVJR0hUX0hJR0gsIGhlaWdodF9oaWdoKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19IRUlHSFRfTE9XLCAgaGVpZ2h0X2xvdyk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX1dJTkRPV19IRUlHSFRfSElHSCwgaGVpZ2h0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXByaXYtPmNyb3BfcmVjdC53aWR0aCA9IHdpZHRoOworCXByaXYtPmNyb3BfcmVjdC5oZWlnaHQgPSBoZWlnaHQ7CiAKKwkvKiBTZXQgdGhlIG91dHB1dCB3aW5kb3cgc2l6ZS4gT25seSAxOjEgc2NhbGUgaXMgc3VwcG9ydGVkIHNvIGZhci4gKi8KKwlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19PVVRfV0lEVEhfSElHSCwgd2lkdGgpOwogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1dJRFRIX0hJR0gsIHdpZHRoX2hpZ2gpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1dJRFRIX0xPVyAsIHdpZHRoX2xvdyk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfSEVJR0hUX0hJR0gsIGhlaWdodF9oaWdoKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9IRUlHSFRfTE9XLCAgaGVpZ2h0X2xvdyk7CisJCXJldCA9IHJlZ193cml0ZTE2KGNsaWVudCwgUkVHX09VVF9IRUlHSFRfSElHSCwgaGVpZ2h0KTsKIAorCS8qIFRvdGFsIHdpZHRoID0gb3V0cHV0IHNpemUgKyBibGFua2luZyAqLwogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX1dJRFRIX0hJR0gsIHRvdGFsX3dpZHRoX2hpZ2gpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19PVVRfVE9UQUxfV0lEVEhfSElHSCwgdG90YWxfd2lkdGgpOwogCWlmICghcmV0KQotCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX1dJRFRIX0xPVywgdG90YWxfd2lkdGhfbG93KTsKKwkJcmV0ID0gcmVnX3dyaXRlMTYoY2xpZW50LCBSRUdfT1VUX1RPVEFMX0hFSUdIVF9ISUdILCB0b3RhbF9oZWlnaHQpOworCisJLyogU2V0cyB0aGUgd2luZG93IGZvciBBV0IgY2FsY3VsYXRpb25zICovCiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfSEVJR0hUX0hJR0gsIHRvdGFsX2hlaWdodF9oaWdoKTsKKwkJcmV0ID0gcmVnX3dyaXRlMTYoY2xpZW50LCBSRUdfQVZHX1dJTkRPV19FTkRfWF9ISUdILCB3aWR0aCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfSEVJR0hUX0xPVywgIHRvdGFsX2hlaWdodF9sb3cpOworCQlyZXQgPSByZWdfd3JpdGUxNihjbGllbnQsIFJFR19BVkdfV0lORE9XX0VORF9ZX0hJR0gsIGhlaWdodCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzQ0LDE4ICs3ODgsMTggQEAKIHN0YXRpYyBpbnQgb3Y1NjQyX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKIAljb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQgKmZtdCA9IG92NTY0Ml9maW5kX2RhdGFmbXQobWYtPmNvZGUpOwogCi0JZGV2X2RiZyhzZC0+djRsMl9kZXYtPmRldiwgIiVzKCV1KSB3aWR0aDogJXUgaGVpZ3RoOiAldVxuIiwKLQkJCV9fZnVuY19fLCBtZi0+Y29kZSwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKKwltZi0+d2lkdGggPSBwcml2LT5jcm9wX3JlY3Qud2lkdGg7CisJbWYtPmhlaWdodCA9IHByaXYtPmNyb3BfcmVjdC5oZWlnaHQ7CiAKIAlpZiAoIWZtdCkgewogCQltZi0+Y29kZQk9IG92NTY0Ml9jb2xvdXJfZm10c1swXS5jb2RlOwogCQltZi0+Y29sb3JzcGFjZQk9IG92NTY0Ml9jb2xvdXJfZm10c1swXS5jb2xvcnNwYWNlOwogCX0KIAotCW1mLT53aWR0aAk9IE9WNTY0Ml9XSURUSDsKLQltZi0+aGVpZ2h0CT0gT1Y1NjQyX0hFSUdIVDsKIAltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CiAKIAlyZXR1cm4gMDsKQEAgLTc2NywyMCArODExLDEzIEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKIAotCWRldl9kYmcoc2QtPnY0bDJfZGV2LT5kZXYsICIlcygldSlcbiIsIF9fZnVuY19fLCBtZi0+Y29kZSk7Ci0KIAkvKiBNSVBJIENTSSBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCwgZG91YmxlLWNoZWNrICovCiAJaWYgKCFvdjU2NDJfZmluZF9kYXRhZm10KG1mLT5jb2RlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlvdjU2NDJfdHJ5X2ZtdChzZCwgbWYpOwotCiAJcHJpdi0+Zm10ID0gb3Y1NjQyX2ZpbmRfZGF0YWZtdChtZi0+Y29kZSk7CiAKLQlvdjU2NDJfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjU2NDJfZGVmYXVsdF9yZWdzX2luaXQpOwotCW92NTY0Ml9zZXRfcmVzb2x1dGlvbihjbGllbnQpOwotCW92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfZmluYWxpc2UpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc5NCw4ICs4MzEsOCBAQAogCiAJbWYtPmNvZGUJPSBmbXQtPmNvZGU7CiAJbWYtPmNvbG9yc3BhY2UJPSBmbXQtPmNvbG9yc3BhY2U7Ci0JbWYtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOwotCW1mLT5oZWlnaHQJPSBPVjU2NDJfSEVJR0hUOworCW1mLT53aWR0aAk9IHByaXYtPmNyb3BfcmVjdC53aWR0aDsKKwltZi0+aGVpZ2h0CT0gcHJpdi0+Y3JvcF9yZWN0LmhlaWdodDsKIAltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CiAKIAlyZXR1cm4gMDsKQEAgLTgyOCwxNSArODY1LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb3Y1NjQyX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2ID0gdG9fb3Y1NjQyKGNsaWVudCk7CisJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZhLT5jOworCWludCByZXQ7CisKKwl2NGxfYm91bmRfYWxpZ25faW1hZ2UoJnJlY3QtPndpZHRoLCA0OCwgT1Y1NjQyX01BWF9XSURUSCwgMSwKKwkJCSAgICAgICZyZWN0LT5oZWlnaHQsIDMyLCBPVjU2NDJfTUFYX0hFSUdIVCwgMSwgMCk7CisKKwlwcml2LT5jcm9wX3JlY3Qud2lkdGgJPSByZWN0LT53aWR0aDsKKwlwcml2LT5jcm9wX3JlY3QuaGVpZ2h0CT0gcmVjdC0+aGVpZ2h0OworCXByaXYtPnRvdGFsX3dpZHRoCT0gcmVjdC0+d2lkdGggKyBCTEFOS0lOR19FWFRSQV9XSURUSDsKKwlwcml2LT50b3RhbF9oZWlnaHQJPSBtYXhfdChpbnQsIHJlY3QtPmhlaWdodCArCisJCQkJCQkJQkxBTktJTkdfRVhUUkFfSEVJR0hULAorCQkJCQkJCUJMQU5LSU5HX01JTl9IRUlHSFQpOworCXByaXYtPmNyb3BfcmVjdC53aWR0aAkJPSByZWN0LT53aWR0aDsKKwlwcml2LT5jcm9wX3JlY3QuaGVpZ2h0CQk9IHJlY3QtPmhlaWdodDsKKworCXJldCA9IG92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfaW5pdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92NTY0Ml9zZXRfcmVzb2x1dGlvbihzZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfZmluYWxpc2UpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvdjU2NDJfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CiAKLQlhLT50eXBlCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlyZWN0LT50b3AJPSAwOwotCXJlY3QtPmxlZnQJPSAwOwotCXJlY3QtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOwotCXJlY3QtPmhlaWdodAk9IE9WNTY0Ml9IRUlHSFQ7CisJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpyZWN0ID0gcHJpdi0+Y3JvcF9yZWN0OwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NDUsOCArOTExLDggQEAKIHsKIAlhLT5ib3VuZHMubGVmdAkJCT0gMDsKIAlhLT5ib3VuZHMudG9wCQkJPSAwOwotCWEtPmJvdW5kcy53aWR0aAkJCT0gT1Y1NjQyX1dJRFRIOwotCWEtPmJvdW5kcy5oZWlnaHQJCT0gT1Y1NjQyX0hFSUdIVDsKKwlhLT5ib3VuZHMud2lkdGgJCQk9IE9WNTY0Ml9NQVhfV0lEVEg7CisJYS0+Ym91bmRzLmhlaWdodAkJPSBPVjU2NDJfTUFYX0hFSUdIVDsKIAlhLT5kZWZyZWN0CQkJPSBhLT5ib3VuZHM7CiAJYS0+dHlwZQkJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOwpAQCAtODU1LDE2ICs5MjEsNDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvdjU2NDJfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJY2ZnLT50eXBlID0gVjRMMl9NQlVTX0NTSTI7CisJY2ZnLT5mbGFncyA9IFY0TDJfTUJVU19DU0kyXzJfTEFORSB8IFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMCB8CisJCQkJCVY0TDJfTUJVU19DU0kyX0NPTlRJTlVPVVNfQ0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0OworCisJaWYgKCFvbikKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlyZXQgPSBvdjU2NDJfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjU2NDJfZGVmYXVsdF9yZWdzX2luaXQpOworCWlmICghcmV0KQorCQlyZXQgPSBvdjU2NDJfc2V0X3Jlc29sdXRpb24oc2QpOworCWlmICghcmV0KQorCQlyZXQgPSBvdjU2NDJfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjU2NDJfZGVmYXVsdF9yZWdzX2ZpbmFsaXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92NTY0Ml9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX21idXNfZm10CT0gb3Y1NjQyX3NfZm10LAogCS5nX21idXNfZm10CT0gb3Y1NjQyX2dfZm10LAogCS50cnlfbWJ1c19mbXQJPSBvdjU2NDJfdHJ5X2ZtdCwKIAkuZW51bV9tYnVzX2ZtdAk9IG92NTY0Ml9lbnVtX2ZtdCwKKwkuc19jcm9wCQk9IG92NTY0Ml9zX2Nyb3AsCiAJLmdfY3JvcAkJPSBvdjU2NDJfZ19jcm9wLAogCS5jcm9wY2FwCT0gb3Y1NjQyX2Nyb3BjYXAsCisJLmdfbWJ1c19jb25maWcJPSBvdjU2NDJfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y1NjQyX3N1YmRldl9jb3JlX29wcyA9IHsKKwkuc19wb3dlcgk9IG92NTY0Ml9zX3Bvd2VyLAogCS5nX2NoaXBfaWRlbnQJPSBvdjU2NDJfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG92NTY0Ml9nZXRfcmVnaXN0ZXIsCkBAIC04NzcsMjggKzk3NCw3IEBACiAJLnZpZGVvCT0gJm92NTY0Ml9zdWJkZXZfdmlkZW9fb3BzLAogfTsKIAotLyoKLSAqIFdlIGhhdmUgdG8gcHJvdmlkZSBzb2MtY2FtZXJhIG9wZXJhdGlvbnMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNheQotICogdGhlcmUuIFRoZSBNSVBJIENTSTIgZHJpdmVyIHdpbGwgcHJvdmlkZSAucXVlcnlfYnVzX3BhcmFtIGFuZCAuc2V0X2J1c19wYXJhbQotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb2Nfb3Y1NjQyX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzb2Nfb3Y1NjQyX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgc29jX292NTY0Ml9vcHMgPSB7Ci0JLnF1ZXJ5X2J1c19wYXJhbQk9IHNvY19vdjU2NDJfcXVlcnlfYnVzX3BhcmFtLAotCS5zZXRfYnVzX3BhcmFtCQk9IHNvY19vdjU2NDJfc2V0X2J1c19wYXJhbSwKLX07Ci0KLXN0YXRpYyBpbnQgb3Y1NjQyX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgb3Y1NjQyX3ZpZGVvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJaW50IHJldDsKIAl1OCBpZF9oaWdoLCBpZF9sb3c7CkBAIC05MjksMTYgKzEwMDUsOSBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3Qgb3Y1NjQyICpwcml2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk9WNTY0MjogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJPVjU2NDI6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk1MCwxNyArMTAxOSwyNCBAQAogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3Y1NjQyX3N1YmRldl9vcHMpOwogCi0JaWNkLT5vcHMJPSAmc29jX292NTY0Ml9vcHM7Ci0JcHJpdi0+Zm10CT0gJm92NTY0Ml9jb2xvdXJfZm10c1swXTsKKwlwcml2LT5mbXQJCT0gJm92NTY0Ml9jb2xvdXJfZm10c1swXTsKIAotCXJldCA9IG92NTY0Ml92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJcHJpdi0+Y3JvcF9yZWN0LndpZHRoCT0gT1Y1NjQyX0RFRkFVTFRfV0lEVEg7CisJcHJpdi0+Y3JvcF9yZWN0LmhlaWdodAk9IE9WNTY0Ml9ERUZBVUxUX0hFSUdIVDsKKwlwcml2LT5jcm9wX3JlY3QubGVmdAk9IChPVjU2NDJfTUFYX1dJRFRIIC0gT1Y1NjQyX0RFRkFVTFRfV0lEVEgpIC8gMjsKKwlwcml2LT5jcm9wX3JlY3QudG9wCT0gKE9WNTY0Ml9NQVhfSEVJR0hUIC0gT1Y1NjQyX0RFRkFVTFRfSEVJR0hUKSAvIDI7CisJcHJpdi0+Y3JvcF9yZWN0LndpZHRoCT0gT1Y1NjQyX0RFRkFVTFRfV0lEVEg7CisJcHJpdi0+Y3JvcF9yZWN0LmhlaWdodAk9IE9WNTY0Ml9ERUZBVUxUX0hFSUdIVDsKKwlwcml2LT50b3RhbF93aWR0aCA9IE9WNTY0Ml9ERUZBVUxUX1dJRFRIICsgQkxBTktJTkdfRVhUUkFfV0lEVEg7CisJcHJpdi0+dG90YWxfaGVpZ2h0ID0gQkxBTktJTkdfTUlOX0hFSUdIVDsKKworCXJldCA9IG92NTY0Ml92aWRlb19wcm9iZShjbGllbnQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJcmV0dXJuIDA7CiAKIGVycm9yOgotCWljZC0+b3BzID0gTlVMTDsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTY4LDEwICsxMDQ0LDggQEAKIHN0YXRpYyBpbnQgb3Y1NjQyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCi0JaWNkLT5vcHMgPSBOVUxMOwogCWlmIChpY2wtPmZyZWVfYnVzKQogCQlpY2wtPmZyZWVfYnVzKGljbCk7CiAJa2ZyZWUocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NjY1MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjY2NTAuYwppbmRleCA0NTZkOWFkLi45ZjJkMjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NjY1MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y2NjUwLmMKQEAgLTI4LDEwICsyOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAogLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgUkVHX0dBSU4JCTB4MDAJLyogcmFuZ2UgMDAgLSAzRiAqLwpAQCAtMTc3LDIwICsxNzksMjMgQEAKIAogc3RydWN0IG92NjY1MCB7CiAJc3RydWN0IHY0bDJfc3ViZGV2CXN1YmRldjsKLQotCWludAkJCWdhaW47Ci0JaW50CQkJYmx1ZTsKLQlpbnQJCQlyZWQ7Ci0JaW50CQkJc2F0dXJhdGlvbjsKLQlpbnQJCQlodWU7Ci0JaW50CQkJYnJpZ2h0bmVzczsKLQlpbnQJCQlleHBvc3VyZTsKLQlpbnQJCQlnYW1tYTsKLQlpbnQJCQlhZWM7Ci0JYm9vbAkJCXZmbGlwOwotCWJvb2wJCQloZmxpcDsKLQlib29sCQkJYXdiOwotCWJvb2wJCQlhZ2M7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhkbDsKKwlzdHJ1Y3QgeworCQkvKiBleHBvc3VyZS9hdXRvZXhwb3N1cmUgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICphdXRvZXhwb3N1cmU7CisJCXN0cnVjdCB2NGwyX2N0cmwgKmV4cG9zdXJlOworCX07CisJc3RydWN0IHsKKwkJLyogZ2Fpbi9hdXRvZ2FpbiBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG9nYWluOworCQlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluOworCX07CisJc3RydWN0IHsKKwkJLyogYmx1ZS9yZWQvYXV0b3doaXRlYmFsYW5jZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKmF1dG93YjsKKwkJc3RydWN0IHY0bDJfY3RybCAqYmx1ZTsKKwkJc3RydWN0IHY0bDJfY3RybCAqcmVkOworCX07CiAJYm9vbAkJCWhhbGZfc2NhbGU7CS8qIHNjYWxlIGRvd24gb3V0cHV0IGJ5IDIgKi8KIAlzdHJ1Y3QgdjRsMl9yZWN0CXJlY3Q7CQkvKiBzZW5zb3IgY3JvcHBpbmcgd2luZG93ICovCiAJdW5zaWduZWQgbG9uZwkJcGNsa19saW1pdDsJLyogZnJvbSBob3N0ICovCkBAIC0yMTAsMTI2ICsyMTUsNiBAQAogCVY0TDJfTUJVU19GTVRfWThfMVg4LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBvdjY2NTBfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9BVVRPR0FJTiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkFHQyIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9HQUlOLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiR2FpbiIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAweDNmLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IERFRl9HQUlOLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiQVdCIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMSwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkJsdWUiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMHhmZiwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSBERUZfQkxVRSwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZQkJPSAiUmVkIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4ZmYsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gREVGX1JFRCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJTYXR1cmF0aW9uIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4ZiwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAweDgsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IVUUsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJIdWUiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gSFVFX01BU0ssCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gREVGX0hVRSwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJCcmlnaHRuZXNzIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDB4ZmYsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMHg4MCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJBRUMiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMywKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfRVhQT1NVUkUsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJFeHBvc3VyZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAweGZmLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IERFRl9BRUNILAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfR0FNTUEsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJHYW1tYSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAweGZmLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDB4MTIsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQogLyogcmVhZCBhIHJlZ2lzdGVyICovCiBzdGF0aWMgaW50IG92NjY1MF9yZWdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4ICp2YWwpCiB7CkBAIC00MTksMjEzICszMDQsOTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogQWx0ZXIgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCi1zdGF0aWMgaW50IG92NjY1MF9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwotCWludCByZXQ7Ci0KLQlmbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotCi0JaWYgKGZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKQotCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01KLCBDT01KX1BDTEtfUklTSU5HLCAwKTsKLQllbHNlCi0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUosIDAsIENPTUpfUENMS19SSVNJTkcpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQotCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01GLCBDT01GX0hSRUZfTE9XLCAwKTsKLQllbHNlCi0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUYsIDAsIENPTUZfSFJFRl9MT1cpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgQ09NSl9WU1lOQ19ISUdILCAwKTsKLQllbHNlCi0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUosIDAsIENPTUpfVlNZTkNfSElHSCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y2NjUwX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9NQVNURVIgfAotCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFXSURUSF84OwotCi0JcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwotfQotCiAvKiBHZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLwotc3RhdGljIGludCBvdjY2NTBfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IG92NjU1MF9nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBvdjY2NTAsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZwcml2LT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBvdjY2NTAgKnByaXYgPSB0b19vdjY2NTAoY2xpZW50KTsKLQl1aW50OF90IHJlZzsKLQlpbnQgcmV0ID0gMDsKKwl1aW50OF90IHJlZywgcmVnMjsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+YWdjOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmIChwcml2LT5hZ2MpIHsKLQkJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19HQUlOLCAmcmVnKTsKLQkJCWN0cmwtPnZhbHVlID0gcmVnOwotCQl9IGVsc2UgewotCQkJY3RybC0+dmFsdWUgPSBwcml2LT5nYWluOwotCQl9Ci0JCWJyZWFrOworCQlyZXQgPSBvdjY2NTBfcmVnX3JlYWQoY2xpZW50LCBSRUdfR0FJTiwgJnJlZyk7CisJCWlmICghcmV0KQorCQkJcHJpdi0+Z2Fpbi0+dmFsID0gcmVnOworCQlyZXR1cm4gcmV0OwogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmF3YjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmIChwcml2LT5hd2IpIHsKLQkJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19CTFVFLCAmcmVnKTsKLQkJCWN0cmwtPnZhbHVlID0gcmVnOwotCQl9IGVsc2UgewotCQkJY3RybC0+dmFsdWUgPSBwcml2LT5ibHVlOworCQlyZXQgPSBvdjY2NTBfcmVnX3JlYWQoY2xpZW50LCBSRUdfQkxVRSwgJnJlZyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gb3Y2NjUwX3JlZ19yZWFkKGNsaWVudCwgUkVHX1JFRCwgJnJlZzIpOworCQlpZiAoIXJldCkgeworCQkJcHJpdi0+Ymx1ZS0+dmFsID0gcmVnOworCQkJcHJpdi0+cmVkLT52YWwgPSByZWcyOwogCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmIChwcml2LT5hd2IpIHsKLQkJCXJldCA9IG92NjY1MF9yZWdfcmVhZChjbGllbnQsIFJFR19SRUQsICZyZWcpOwotCQkJY3RybC0+dmFsdWUgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLT52YWx1ZSA9IHByaXYtPnJlZDsKLQkJfQotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+c2F0dXJhdGlvbjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+aHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+YnJpZ2h0bmVzczsKLQkJYnJlYWs7CisJCXJldHVybiByZXQ7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQljdHJsLT52YWx1ZSA9IHByaXYtPmFlYzsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJaWYgKHByaXYtPmFlYykgewotCQkJcmV0ID0gb3Y2NjUwX3JlZ19yZWFkKGNsaWVudCwgUkVHX0FFQ0gsICZyZWcpOwotCQkJY3RybC0+dmFsdWUgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLT52YWx1ZSA9IHByaXYtPmV4cG9zdXJlOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FNTUE6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+Z2FtbWE7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+dmZsaXA7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+aGZsaXA7Ci0JCWJyZWFrOworCQlyZXQgPSBvdjY2NTBfcmVnX3JlYWQoY2xpZW50LCBSRUdfQUVDSCwgJnJlZyk7CisJCWlmICghcmV0KQorCQkJcHJpdi0+ZXhwb3N1cmUtPnZhbCA9IHJlZzsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogU2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBpbnQgb3Y2NjUwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBvdjY1NTBfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7CisJc3RydWN0IG92NjY1MCAqcHJpdiA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgb3Y2NjUwLCBoZGwpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSAmcHJpdi0+c3ViZGV2OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gdG9fb3Y2NjUwKGNsaWVudCk7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgogCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLAotCQkJCWN0cmwtPnZhbHVlID8gQ09NQl9BR0MgOiAwLCBDT01CX0FHQyk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+YWdjID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19HQUlOLCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+Z2FpbiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKKwkJCQljdHJsLT52YWwgPyBDT01CX0FHQyA6IDAsIENPTUJfQUdDKTsKKwkJaWYgKCFyZXQgJiYgIWN0cmwtPnZhbCkKKwkJCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfR0FJTiwgcHJpdi0+Z2Fpbi0+dmFsKTsKKwkJcmV0dXJuIHJldDsKIAljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKIAkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwKLQkJCQljdHJsLT52YWx1ZSA/IENPTUJfQVdCIDogMCwgQ09NQl9BV0IpOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPmF3YiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19CTFVFLCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+Ymx1ZSA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX1JFRCwgY3RybC0+dmFsdWUpOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPnJlZCA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX1NBVCwgU0VUX1NBVChjdHJsLT52YWx1ZSksCi0JCQkJU0FUX01BU0spOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPnNhdHVyYXRpb24gPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0hVRSwgU0VUX0hVRShjdHJsLT52YWx1ZSksCi0JCQkJSFVFX01BU0spOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPmh1ZSA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfQlJULCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+YnJpZ2h0bmVzcyA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86Ci0JCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKLQkJY2FzZSBWNEwyX0VYUE9TVVJFX0FVVE86Ci0JCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01CLCBDT01CX0FFQywgMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUIsIDAsIENPTUJfQUVDKTsKLQkJCWJyZWFrOworCQkJCWN0cmwtPnZhbCA/IENPTUJfQVdCIDogMCwgQ09NQl9BV0IpOworCQlpZiAoIXJldCAmJiAhY3RybC0+dmFsKSB7CisJCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX0JMVUUsIHByaXYtPmJsdWUtPnZhbCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBvdjY2NTBfcmVnX3dyaXRlKGNsaWVudCwgUkVHX1JFRCwKKwkJCQkJCQlwcml2LT5yZWQtPnZhbCk7CiAJCX0KLQkJaWYgKCFyZXQpCi0JCQlwcml2LT5hZWMgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJcmV0ID0gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19BRUNILCBjdHJsLT52YWx1ZSk7Ci0JCWlmICghcmV0KQotCQkJcHJpdi0+ZXhwb3N1cmUgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7CisJCXJldHVybiByZXQ7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlyZXR1cm4gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfU0FULCBTRVRfU0FUKGN0cmwtPnZhbCksCisJCQkJU0FUX01BU0spOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQlyZXR1cm4gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfSFVFLCBTRVRfSFVFKGN0cmwtPnZhbCksCisJCQkJSFVFX01BU0spOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJcmV0dXJuIG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfQlJULCBjdHJsLT52YWwpOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwgY3RybC0+dmFsID09CisJCQkJVjRMMl9FWFBPU1VSRV9BVVRPID8gQ09NQl9BRUMgOiAwLCBDT01CX0FFQyk7CisJCWlmICghcmV0ICYmIGN0cmwtPnZhbCA9PSBWNEwyX0VYUE9TVVJFX01BTlVBTCkKKwkJCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfQUVDSCwKKwkJCQkJCXByaXYtPmV4cG9zdXJlLT52YWwpOworCQlyZXR1cm4gcmV0OwogCWNhc2UgVjRMMl9DSURfR0FNTUE6Ci0JCXJldCA9IG92NjY1MF9yZWdfd3JpdGUoY2xpZW50LCBSRUdfR0FNMSwgY3RybC0+dmFsdWUpOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPmdhbW1hID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y2NjUwX3JlZ193cml0ZShjbGllbnQsIFJFR19HQU0xLCBjdHJsLT52YWwpOwogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUIsCi0JCQkJY3RybC0+dmFsdWUgPyBDT01CX0ZMSVBfViA6IDAsIENPTUJfRkxJUF9WKTsKLQkJaWYgKCFyZXQpCi0JCQlwcml2LT52ZmxpcCA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKKwkJcmV0dXJuIG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUIsCisJCQkJY3RybC0+dmFsID8gQ09NQl9GTElQX1YgOiAwLCBDT01CX0ZMSVBfVik7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwKLQkJCQljdHJsLT52YWx1ZSA/IENPTUJfRkxJUF9IIDogMCwgQ09NQl9GTElQX0gpOwotCQlpZiAoIXJldCkKLQkJCXByaXYtPmhmbGlwID0gY3RybC0+dmFsdWU7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NQiwKKwkJCQljdHJsLT52YWwgPyBDT01CX0ZMSVBfSCA6IDAsIENPTUJfRkxJUF9IKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBHZXQgY2hpcCBpZGVudGlmaWNhdGlvbiAqLwpAQCAtNzc4LDcgKzU0MCw3IEBACiBzdGF0aWMgaW50IG92NjY1MF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CiAJc3RydWN0IHNvY19jYW1lcmFfc2Vuc2UgKnNlbnNlID0gaWNkLT5zZW5zZTsKIAlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gdG9fb3Y2NjUwKGNsaWVudCk7CiAJYm9vbCBoYWxmX3NjYWxlID0gIWlzX3Vuc2NhbGVkX29rKG1mLT53aWR0aCwgbWYtPmhlaWdodCwgJnByaXYtPnJlY3QpOwpAQCAtMTA1Nyw4ICs4MTksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb3Y2NjUwX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92NjY1MF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXU4CQlwaWRoLCBwaWRsLCBtaWRoLCBtaWRsOwogCWludAkJcmV0ID0gMDsKQEAgLTEwOTQsMTYgKzg1NSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgb3Y2NjUwX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBvdjY2NTBfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gb3Y2NjUwX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gb3Y2NjUwX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjY2NTBfY29udHJvbHMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIG92NjU1MF9jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gb3Y2NTUwX2dfdm9sYXRpbGVfY3RybCwKKwkuc19jdHJsID0gb3Y2NTUwX3NfY3RybCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y2NjUwX2NvcmVfb3BzID0gewotCS5nX2N0cmwJCQk9IG92NjY1MF9nX2N0cmwsCi0JLnNfY3RybAkJCT0gb3Y2NjUwX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CQk9IG92NjY1MF9nX2NoaXBfaWRlbnQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCQk9IG92NjY1MF9nZXRfcmVnaXN0ZXIsCkBAIC0xMTExLDYgKzg2OCw1NSBAQAogI2VuZGlmCiB9OwogCisvKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLworc3RhdGljIGludCBvdjY2NTBfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfTUFTVEVSIHwKKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWx0ZXIgYnVzIHNldHRpbmdzIG9uIGNhbWVyYSBzaWRlICovCitzdGF0aWMgaW50IG92NjY1MF9zX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKGljbCwgY2ZnKTsKKwlpbnQgcmV0OworCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgQ09NSl9QQ0xLX1JJU0lORywgMCk7CisJZWxzZQorCQlyZXQgPSBvdjY2NTBfcmVnX3JtdyhjbGllbnQsIFJFR19DT01KLCAwLCBDT01KX1BDTEtfUklTSU5HKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCisJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUYsIENPTUZfSFJFRl9MT1csIDApOworCWVsc2UKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NRiwgMCwgQ09NRl9IUkVGX0xPVyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChmbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkKKwkJcmV0ID0gb3Y2NjUwX3JlZ19ybXcoY2xpZW50LCBSRUdfQ09NSiwgQ09NSl9WU1lOQ19ISUdILCAwKTsKKwllbHNlCisJCXJldCA9IG92NjY1MF9yZWdfcm13KGNsaWVudCwgUkVHX0NPTUosIDAsIENPTUpfVlNZTkNfSElHSCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjY2NTBfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IG92NjY1MF9zX3N0cmVhbSwKIAkuZ19tYnVzX2ZtdAk9IG92NjY1MF9nX2ZtdCwKQEAgLTExMjIsNiArOTI4LDggQEAKIAkuc19jcm9wCQk9IG92NjY1MF9zX2Nyb3AsCiAJLmdfcGFybQkJPSBvdjY2NTBfZ19wYXJtLAogCS5zX3Bhcm0JCT0gb3Y2NjUwX3NfcGFybSwKKwkuZ19tYnVzX2NvbmZpZwk9IG92NjY1MF9nX21idXNfY29uZmlnLAorCS5zX21idXNfY29uZmlnCT0gb3Y2NjUwX3NfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjY2NTBfc3ViZGV2X29wcyA9IHsKQEAgLTExMzYsMTYgKzk0NCw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQogewogCXN0cnVjdCBvdjY2NTAgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHBsYXRmb3JtX2RhdGEgZm9yIGRyaXZlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE1OSw4ICs5NjAsNDYgQEAKIAl9CiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjY2NTBfc3ViZGV2X29wcyk7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmcHJpdi0+aGRsLCAxMyk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXByaXYtPmF1dG9nYWluID0gdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9HQUlOLCAwLCAxLCAxLCAxKTsKKwlwcml2LT5nYWluID0gdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0dBSU4sIDAsIDB4M2YsIDEsIERFRl9HQUlOKTsKKwlwcml2LT5hdXRvd2IgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLCAwLCAxLCAxLCAxKTsKKwlwcml2LT5ibHVlID0gdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwgMCwgMHhmZiwgMSwgREVGX0JMVUUpOworCXByaXYtPnJlZCA9IHY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9SRURfQkFMQU5DRSwgMCwgMHhmZiwgMSwgREVGX1JFRCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1NBVFVSQVRJT04sIDAsIDB4ZiwgMSwgMHg4KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y2NTUwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSFVFLCAwLCBIVUVfTUFTSywgMSwgREVGX0hVRSk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NjU1MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsIDAsIDB4ZmYsIDEsIDB4ODApOworCXByaXYtPmF1dG9leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoJnByaXYtPmhkbCwKKwkJCSZvdjY1NTBfY3RybF9vcHMsIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCQlWNEwyX0VYUE9TVVJFX01BTlVBTCwgMCwgVjRMMl9FWFBPU1VSRV9BVVRPKTsKKwlwcml2LT5leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMCwgMHhmZiwgMSwgREVGX0FFQ0gpOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjY1NTBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9HQU1NQSwgMCwgMHhmZiwgMSwgMHgxMik7CiAKLQlpY2QtPm9wcyA9ICZvdjY2NTBfb3BzOworCXByaXYtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcHJpdi0+aGRsOworCWlmIChwcml2LT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IHByaXYtPmhkbC5lcnJvcjsKKworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmcHJpdi0+YXV0b2dhaW4sIDAsIHRydWUpOworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMywgJnByaXYtPmF1dG93YiwgMCwgdHJ1ZSk7CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmcHJpdi0+YXV0b2V4cG9zdXJlLAorCQkJCVY0TDJfRVhQT1NVUkVfTUFOVUFMLCB0cnVlKTsKIAogCXByaXYtPnJlY3QubGVmdAkgID0gREVGX0hTVFJUIDw8IDE7CiAJcHJpdi0+cmVjdC50b3AJICA9IERFRl9WU1RSVCA8PCAxOwpAQCAtMTE3MCwxMCArMTAwOSwxMiBAQAogCXByaXYtPmNvZGUJICA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OwogCXByaXYtPmNvbG9yc3BhY2UgID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CiAKLQlyZXQgPSBvdjY2NTBfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG92NjY1MF92aWRlb19wcm9iZShjbGllbnQpOworCWlmICghcmV0KQorCQlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmcHJpdi0+aGRsKTsKIAogCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCQlrZnJlZShwcml2KTsKIAl9CiAKQEAgLTExODQsNiArMTAyNSw4IEBACiB7CiAJc3RydWN0IG92NjY1MCAqcHJpdiA9IHRvX292NjY1MChjbGllbnQpOwogCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCmluZGV4IDM5Nzg3MGYuLjlmNmNlM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwpAQCAtMjAsMTIgKzIwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWVkaWEvb3Y3NzJ4Lmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9vdjc3MnguaD4KIAogLyoKICAqIHJlZ2lzdGVyIG9mZnNldApAQCAtNDAwLDYgKzQwMiw3IEBACiAKIHN0cnVjdCBvdjc3MnhfcHJpdiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICAgICAgICAgICAgICAgIHN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIJICBoZGw7CiAJc3RydWN0IG92NzcyeF9jYW1lcmFfaW5mbyAgICAgICAgKmluZm87CiAJY29uc3Qgc3RydWN0IG92NzcyeF9jb2xvcl9mb3JtYXQgKmNmbXQ7CiAJY29uc3Qgc3RydWN0IG92NzcyeF93aW5fc2l6ZSAgICAgKndpbjsKQEAgLTUxNywzNiArNTIwLDYgQEAKIAkucmVncyAgICAgPSBvdjc3MnhfcXZnYV9yZWdzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBvdjc3MnhfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lCQk9ICJCYW5kLXN0b3AgZmlsdGVyIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDI1NiwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi19OwotCiAvKgogICogZ2VuZXJhbCBmdW5jdGlvbgogICovCkBAIC02MjAsNzUgKzU5MywzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG92NzcyeF9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCXVuc2lnbmVkIGxvbmcJCSAgZmxhZ3MpCitzdGF0aWMgaW50IG92NzcyeF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Y3NzJ4X3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX01BU1RFUiB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JaWYgKHByaXYtPmluZm8tPmZsYWdzICYgT1Y3NzJYX0ZMQUdfOEJJVCkKLQkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzg7Ci0JZWxzZQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NzJ4X2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG92NzcyeF9wcml2LCBzdWJkZXYpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+ZmxhZ192ZmxpcDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX2hmbGlwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVI6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+YmFuZF9maWx0ZXI7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjc3Mnhfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17CisJc3RydWN0IG92NzcyeF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsCisJCQkJCQlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYsIGhkbCk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9ICZwcml2LT5zdWJkZXY7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG92NzcyeF9wcml2LCBzdWJkZXYpOwogCWludCByZXQgPSAwOwogCXU4IHZhbDsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQl2YWwgPSBjdHJsLT52YWx1ZSA/IFZGTElQX0lNRyA6IDB4MDA7Ci0JCXByaXYtPmZsYWdfdmZsaXAgPSBjdHJsLT52YWx1ZTsKKwkJdmFsID0gY3RybC0+dmFsID8gVkZMSVBfSU1HIDogMHgwMDsKKwkJcHJpdi0+ZmxhZ192ZmxpcCA9IGN0cmwtPnZhbDsKIAkJaWYgKHByaXYtPmluZm8tPmZsYWdzICYgT1Y3NzJYX0ZMQUdfVkZMSVApCiAJCQl2YWwgXj0gVkZMSVBfSU1HOwotCQlyZXQgPSBvdjc3MnhfbWFza19zZXQoY2xpZW50LCBDT00zLCBWRkxJUF9JTUcsIHZhbCk7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwgQ09NMywgVkZMSVBfSU1HLCB2YWwpOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCXZhbCA9IGN0cmwtPnZhbHVlID8gSEZMSVBfSU1HIDogMHgwMDsKLQkJcHJpdi0+ZmxhZ19oZmxpcCA9IGN0cmwtPnZhbHVlOworCQl2YWwgPSBjdHJsLT52YWwgPyBIRkxJUF9JTUcgOiAweDAwOworCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsOwogCQlpZiAocHJpdi0+aW5mby0+ZmxhZ3MgJiBPVjc3MlhfRkxBR19IRkxJUCkKIAkJCXZhbCBePSBIRkxJUF9JTUc7Ci0JCXJldCA9IG92NzcyeF9tYXNrX3NldChjbGllbnQsIENPTTMsIEhGTElQX0lNRywgdmFsKTsKLQkJYnJlYWs7CisJCXJldHVybiBvdjc3MnhfbWFza19zZXQoY2xpZW50LCBDT00zLCBIRkxJUF9JTUcsIHZhbCk7CiAJY2FzZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSOgotCQlpZiAoKHVuc2lnbmVkKWN0cmwtPnZhbHVlID4gMjU2KQotCQkJY3RybC0+dmFsdWUgPSAyNTY7Ci0JCWlmIChjdHJsLT52YWx1ZSA9PSBwcml2LT5iYW5kX2ZpbHRlcikKLQkJCWJyZWFrOwotCQlpZiAoIWN0cmwtPnZhbHVlKSB7CisJCWlmICghY3RybC0+dmFsKSB7CiAJCQkvKiBTd2l0Y2ggdGhlIGZpbHRlciBvZmYsIGl0IGlzIG9uIG5vdyAqLwogCQkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwgQkRCQVNFLCAweGZmLCAweGZmKTsKIAkJCWlmICghcmV0KQpAQCAtNjk2LDcgKzYyNCw3IEBACiAJCQkJCQkgICAgICBCTkRGX09OX09GRiwgMCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBTd2l0Y2ggdGhlIGZpbHRlciBvbiwgc2V0IEFFQyBsb3cgbGltaXQgKi8KLQkJCXZhbCA9IDI1NiAtIGN0cmwtPnZhbHVlOworCQkJdmFsID0gMjU2IC0gY3RybC0+dmFsOwogCQkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwgQ09NOCwKIAkJCQkJICAgICAgQk5ERl9PTl9PRkYsIEJOREZfT05fT0ZGKTsKIAkJCWlmICghcmV0KQpAQCAtNzA0LDExICs2MzIsMTEgQEAKIAkJCQkJCSAgICAgIDB4ZmYsIHZhbCk7CiAJCX0KIAkJaWYgKCFyZXQpCi0JCQlwcml2LT5iYW5kX2ZpbHRlciA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKKwkJCXByaXYtPmJhbmRfZmlsdGVyID0gY3RybC0+dmFsOworCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgb3Y3NzJ4X2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLApAQCAtODIyLDEzICs3NTAsMTMgQEAKIAkJCWdvdG8gb3Y3NzJ4X3NldF9mbXRfZXJyb3I7CiAKIAkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwKLQkJCQkgICAgICBFREdFX1RSU0hMRCwgRURHRV9USFJFU0hPTERfTUFTSywKKwkJCQkgICAgICBFREdFX1RSU0hMRCwgT1Y3NzJYX0VER0VfVEhSRVNIT0xEX01BU0ssCiAJCQkJICAgICAgcHJpdi0+aW5mby0+ZWRnZWN0cmwudGhyZXNob2xkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG92NzcyeF9zZXRfZm10X2Vycm9yOwogCiAJCXJldCA9IG92NzcyeF9tYXNrX3NldChjbGllbnQsCi0JCQkJICAgICAgRURHRV9TVFJOR1QsIEVER0VfU1RSRU5HVEhfTUFTSywKKwkJCQkgICAgICBFREdFX1NUUk5HVCwgT1Y3NzJYX0VER0VfU1RSRU5HVEhfTUFTSywKIAkJCQkgICAgICBwcml2LT5pbmZvLT5lZGdlY3RybC5zdHJlbmd0aCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdjc3Mnhfc2V0X2ZtdF9lcnJvcjsKQEAgLTg0MCwxMyArNzY4LDEzIEBACiAJCSAqIHNldCB1cHBlciBhbmQgbG93ZXIgbGltaXQKIAkJICovCiAJCXJldCA9IG92NzcyeF9tYXNrX3NldChjbGllbnQsCi0JCQkJICAgICAgRURHRV9VUFBFUiwgRURHRV9VUFBFUl9NQVNLLAorCQkJCSAgICAgIEVER0VfVVBQRVIsIE9WNzcyWF9FREdFX1VQUEVSX01BU0ssCiAJCQkJICAgICAgcHJpdi0+aW5mby0+ZWRnZWN0cmwudXBwZXIpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3Y3NzJ4X3NldF9mbXRfZXJyb3I7CiAKIAkJcmV0ID0gb3Y3NzJ4X21hc2tfc2V0KGNsaWVudCwKLQkJCQkgICAgICBFREdFX0xPV0VSLCBFREdFX0xPV0VSX01BU0ssCisJCQkJICAgICAgRURHRV9MT1dFUiwgT1Y3NzJYX0VER0VfTE9XRVJfTUFTSywKIAkJCQkgICAgICBwcml2LT5pbmZvLT5lZGdlY3RybC5sb3dlcik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdjc3Mnhfc2V0X2ZtdF9lcnJvcjsKQEAgLTEwMjUsMTcgKzk1MywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG92NzcyeF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKLQkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92NzcyeF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBvdjc3MnhfcHJpdiAqcHJpdiA9IHRvX292NzcyeChjbGllbnQpOwogCXU4ICAgICAgICAgICAgICAgICAgcGlkLCB2ZXI7CiAJY29uc3QgY2hhciAgICAgICAgICpkZXZuYW1lOwogCi0JLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KLQlCVUdfT04oIWljZC0+cGFyZW50IHx8Ci0JICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwotCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKIAkgKi8KQEAgLTEwNjQsMjAgKzk4NywxNCBAQAogCQkgdmVyLAogCQkgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUlESCksCiAJCSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNSURMKSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnByaXYtPmhkbCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgb3Y3NzJ4X29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSBvdjc3Mnhfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gb3Y3NzJ4X3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gb3Y3NzJ4X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjc3MnhfY29udHJvbHMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIG92NzcyeF9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gb3Y3NzJ4X3NfY3RybCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y3NzJ4X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQk9IG92NzcyeF9nX2N0cmwsCi0JLnNfY3RybAkJPSBvdjc3Mnhfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSBvdjc3MnhfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG92NzcyeF9nX3JlZ2lzdGVyLApAQCAtMTA5NSw2ICsxMDEyLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb3Y3NzJ4X2dfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwljZmctPmZsYWdzID0gVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORyB8IFY0TDJfTUJVU19NQVNURVIgfAorCQlWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92NzcyeF9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IG92NzcyeF9zX3N0cmVhbSwKIAkuZ19tYnVzX2ZtdAk9IG92NzcyeF9nX2ZtdCwKQEAgLTExMDMsNiArMTAzNSw3IEBACiAJLmNyb3BjYXAJPSBvdjc3MnhfY3JvcGNhcCwKIAkuZ19jcm9wCQk9IG92NzcyeF9nX2Nyb3AsCiAJLmVudW1fbWJ1c19mbXQJPSBvdjc3MnhfZW51bV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBvdjc3MnhfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92NzcyeF9zdWJkZXZfb3BzID0gewpAQCAtMTExNywyMSArMTA1MCwxNiBAQAogc3RhdGljIGludCBvdjc3MnhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7Ci0Jc3RydWN0IG92NzcyeF9wcml2ICAgICAgICAqcHJpdjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgICAgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgICAgKmljbDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICByZXQ7CisJc3RydWN0IG92NzcyeF9wcml2CSpwcml2OworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsJKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCWludAkJCXJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiT1Y3NzJYOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOworCWlmICghaWNsIHx8ICFpY2wtPnByaXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJPVjc3Mlg6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQlpZiAoIWljbCB8fCAhaWNsLT5wcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCiAJCQkiSTJDLUFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0ICIKQEAgLTExNDYsMTIgKzEwNzQsMjQgQEAKIAlwcml2LT5pbmZvID0gaWNsLT5wcml2OwogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3Y3NzJ4X3N1YmRldl9vcHMpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnByaXYtPmhkbCwgMyk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92NzcyeF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y3NzJ4X2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjc3MnhfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLCAwLCAyNTYsIDEsIDApOworCXByaXYtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcHJpdi0+aGRsOworCWlmIChwcml2LT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IHByaXYtPmhkbC5lcnJvcjsKIAotCWljZC0+b3BzCQk9ICZvdjc3Mnhfb3BzOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKLQlyZXQgPSBvdjc3MnhfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG92NzcyeF92aWRlb19wcm9iZShjbGllbnQpOwogCWlmIChyZXQpIHsKLQkJaWNkLT5vcHMgPSBOVUxMOworCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwcml2LT5oZGwpOwogCQlrZnJlZShwcml2KTsKIAl9CiAKQEAgLTExNjEsOSArMTEwMSw5IEBACiBzdGF0aWMgaW50IG92NzcyeF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgb3Y3NzJ4X3ByaXYgKnByaXYgPSB0b19vdjc3MngoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCmluZGV4IDM2ODFhNmYuLmE0Zjk5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYwpAQCAtMjQsMTAgKzI0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAogI2luY2x1ZGUgIm92OTY0MC5oIgogCkBAIC0xNjIsMjcgKzE2NSw2IEBACiAJVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBvdjk2NDBfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9IRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgSG9yaXpvbnRhbGx5IiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5zdGVwCQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQogLyogcmVhZCBhIHJlZ2lzdGVyICovCiBzdGF0aWMgaW50IG92OTY0MF9yZWdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4ICp2YWwpCiB7CkBAIC0yODQsNzUgKzI2NiwyNSBAQAogCXJldHVybiAwOwogfQogCi0vKiBBbHRlciBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KLXN0YXRpYyBpbnQgb3Y5NjQwX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmVxdWVzdCBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG92OTY0MF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0KLQkvKgotCSAqIFJFVklTSVQ6IHRoZSBjYW1lcmEgcHJvYmFibHkgY2FuIGRvIDEwIGJpdCB0cmFuc2ZlcnMsIGJ1dCBJIGRvbid0Ci0JICogICAgICAgICAgaGF2ZSB0aG9zZSBwaW5zIGNvbm5lY3RlZCBvbiBteSBoYXJkd2FyZS4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fTUFTVEVSIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBV0lEVEhfODsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQotLyogR2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBpbnQgb3Y5NjQwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IHRvX292OTY0MF9zZW5zb3Ioc2QpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+ZmxhZ192ZmxpcDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX2hmbGlwOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIFNldCBzdGF0dXMgb2YgYWRkaXRpb25hbCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgaW50IG92OTY0MF9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3N0YXRpYyBpbnQgb3Y5NjQwX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgb3Y5NjQwX3ByaXYgKnByaXYgPSB0b19vdjk2NDBfc2Vuc29yKHNkKTsKLQotCWludCByZXQgPSAwOworCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgb3Y5NjQwX3ByaXYsIGhkbCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldik7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJcHJpdi0+ZmxhZ192ZmxpcCA9IGN0cmwtPnZhbHVlOwotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQlyZXQgPSBvdjk2NDBfcmVnX3JtdyhjbGllbnQsIE9WOTY0MF9NVkZQLAorCQlpZiAoY3RybC0+dmFsKQorCQkJcmV0dXJuIG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCiAJCQkJCQkJT1Y5NjQwX01WRlBfViwgMCk7Ci0JCWVsc2UKLQkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCi0JCQkJCQkJMCwgT1Y5NjQwX01WRlBfVik7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwgMCwgT1Y5NjQwX01WRlBfVik7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJcHJpdi0+ZmxhZ19oZmxpcCA9IGN0cmwtPnZhbHVlOwotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQlyZXQgPSBvdjk2NDBfcmVnX3JtdyhjbGllbnQsIE9WOTY0MF9NVkZQLAorCQlpZiAoY3RybC0+dmFsKQorCQkJcmV0dXJuIG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCiAJCQkJCQkJT1Y5NjQwX01WRlBfSCwgMCk7Ci0JCWVsc2UKLQkJCXJldCA9IG92OTY0MF9yZWdfcm13KGNsaWVudCwgT1Y5NjQwX01WRlAsCi0JCQkJCQkJMCwgT1Y5NjQwX01WRlBfSCk7Ci0JCWJyZWFrOworCQlyZXR1cm4gb3Y5NjQwX3JlZ19ybXcoY2xpZW50LCBPVjk2NDBfTVZGUCwgMCwgT1Y5NjQwX01WRlBfSCk7CiAJfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogR2V0IGNoaXAgaWRlbnRpZmljYXRpb24gKi8KQEAgLTY0NiwxMCArNTc4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KLXN0YXRpYyBpbnQgb3Y5NjQwX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG92OTY0MF92aWRlb19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3Qgb3Y5NjQwX3ByaXYgKnByaXYgPSB0b19vdjk2NDBfc2Vuc29yKHNkKTsKQEAgLTY1NywyOSArNTg2LDE5IEBACiAJY29uc3QgY2hhcgkqZGV2bmFtZTsKIAlpbnQJCXJldCA9IDA7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRAogCSAqLwogCiAJcmV0ID0gb3Y5NjQwX3JlZ19yZWFkKGNsaWVudCwgT1Y5NjQwX1BJRCwgJnBpZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG92OTY0MF9yZWdfcmVhZChjbGllbnQsIE9WOTY0MF9WRVIsICZ2ZXIpOworCWlmICghcmV0KQorCQlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfTUlESCwgJm1pZGgpOworCWlmICghcmV0KQorCQlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfTUlETCwgJm1pZGwpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gb3Y5NjQwX3JlZ19yZWFkKGNsaWVudCwgT1Y5NjQwX1ZFUiwgJnZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBvdjk2NDBfcmVnX3JlYWQoY2xpZW50LCBPVjk2NDBfTUlESCwgJm1pZGgpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gb3Y5NjQwX3JlZ19yZWFkKGNsaWVudCwgT1Y5NjQwX01JREwsICZtaWRsKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJcmV0dXJuIHJldDsKIAogCXN3aXRjaCAoVkVSU0lPTihwaWQsIHZlcikpIHsKIAljYXNlIE9WOTY0MF9WMjoKQEAgLTY5MywyNyArNjEyLDIwIEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUHJvZHVjdCBJRCBlcnJvciAleDoleFxuIiwgcGlkLCB2ZXIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgUHJvZHVjdCBJRCAlMHg6JTB4IE1hbnVmYWN0dXJlciBJRCAleDoleFxuIiwKIAkJIGRldm5hbWUsIHBpZCwgdmVyLCBtaWRoLCBtaWRsKTsKIAotZXJyOgotCXJldHVybiByZXQ7CisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZwcml2LT5oZGwpOwogfQogCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG92OTY0MF9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gb3Y5NjQwX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG92OTY0MF9xdWVyeV9idXNfcGFyYW0sCi0JLmNvbnRyb2xzCQk9IG92OTY0MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUob3Y5NjQwX2NvbnRyb2xzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBvdjk2NDBfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IG92OTY0MF9zX2N0cmwsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92OTY0MF9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQkJPSBvdjk2NDBfZ19jdHJsLAotCS5zX2N0cmwJCQk9IG92OTY0MF9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAkJPSBvdjk2NDBfZ19jaGlwX2lkZW50LAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3RlcgkJPSBvdjk2NDBfZ2V0X3JlZ2lzdGVyLApAQCAtNzIyLDYgKzYzNCwyMiBAQAogCiB9OwogCisvKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLworc3RhdGljIGludCBvdjk2NDBfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y5NjQwX3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSBvdjk2NDBfc19zdHJlYW0sCiAJLnNfbWJ1c19mbXQJPSBvdjk2NDBfc19mbXQsCkBAIC03MjksNyArNjU3LDcgQEAKIAkuZW51bV9tYnVzX2ZtdAk9IG92OTY0MF9lbnVtX2ZtdCwKIAkuY3JvcGNhcAk9IG92OTY0MF9jcm9wY2FwLAogCS5nX2Nyb3AJCT0gb3Y5NjQwX2dfY3JvcCwKLQorCS5nX21idXNfY29uZmlnCT0gb3Y5NjQwX2dfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjk2NDBfc3ViZGV2X29wcyA9IHsKQEAgLTc0NCwxNiArNjcyLDkgQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IG92OTY0MF9wcml2ICpwcml2OwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkCT0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCWlmICghaWNsKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTWlzc2luZyBwbGF0Zm9ybV9kYXRhIGZvciBkcml2ZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc2OCwxMiArNjg5LDIzIEBACiAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjk2NDBfc3ViZGV2X29wcyk7CiAKLQlpY2QtPm9wcwk9ICZvdjk2NDBfb3BzOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnByaXYtPmhkbCwgMik7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92OTY0MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX1ZGTElQLCAwLCAxLCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcHJpdi0+aGRsLCAmb3Y5NjQwX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXByaXYtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmcHJpdi0+aGRsOworCWlmIChwcml2LT5oZGwuZXJyb3IpIHsKKwkJaW50IGVyciA9IHByaXYtPmhkbC5lcnJvcjsKIAotCXJldCA9IG92OTY0MF92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldCA9IG92OTY0MF92aWRlb19wcm9iZShjbGllbnQpOwogCiAJaWYgKHJldCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJCWtmcmVlKHByaXYpOwogCX0KIApAQCAtNzg1LDYgKzcxNyw4IEBACiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBvdjk2NDBfcHJpdiAqcHJpdiA9IHRvX292OTY0MF9zZW5zb3Ioc2QpOwogCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5oCmluZGV4IGY4YTUxYjcuLjZiMzNhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuaApAQCAtMTk4LDEyICsxOTgsMTAgQEAKIAogc3RydWN0IG92OTY0MF9wcml2IHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIJaGRsOwogCiAJaW50CQkJCW1vZGVsOwogCWludAkJCQlyZXZpc2lvbjsKLQotCWJvb2wJCQkJZmxhZ192ZmxpcDsKLQlib29sCQkJCWZsYWdfaGZsaXA7CiB9OwogCiAjZW5kaWYJLyogX19EUklWRVJTX01FRElBX1ZJREVPX09WOTY0MF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jCmluZGV4IGVkZDFmZmMuLmQ5YTlmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYwpAQCAtMTQsOCArMTQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAogI2RlZmluZSB0b19vdjk3NDAoc2QpCQljb250YWluZXJfb2Yoc2QsIHN0cnVjdCBvdjk3NDBfcHJpdiwgc3ViZGV2KQogCkBAIC0xOTIsNiArMTk1LDcgQEAKIAogc3RydWN0IG92OTc0MF9wcml2IHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIJaGRsOwogCiAJaW50CQkJCWlkZW50OwogCXUxNgkJCQltb2RlbDsKQEAgLTM5MiwyNyArMzk2LDYgQEAKIAlWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgb3Y5NzQwX2NvbnRyb2xzW10gPSB7Ci0JewotCQkuaWQJCT0gVjRMMl9DSURfVkZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIFZlcnRpY2FsbHkiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLnN0ZXAJCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sCi0JewotCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIEhvcml6b250YWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLX07Ci0KIC8qIHJlYWQgYSByZWdpc3RlciAqLwogc3RhdGljIGludCBvdjk3NDBfcmVnX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTggKnZhbCkKIHsKQEAgLTU2MCwyNSArNTQzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBBbHRlciBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KLXN0YXRpYyBpbnQgb3Y5NzQwX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmVxdWVzdCBidXMgc2V0dGluZ3Mgb24gY2FtZXJhIHNpZGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG92OTc0MF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fTUFTVEVSIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBTT0NBTV9EQVRBV0lEVEhfODsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQogLyogc2VsZWN0IG5lYXJlc3QgaGlnaGVyIHJlc29sdXRpb24gZm9yIGNhcHR1cmUgKi8KIHN0YXRpYyB2b2lkIG92OTc0MF9yZXNfcm91bmR1cCh1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKIHsKQEAgLTc4OCwzNiArNzUyLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEdldCBzdGF0dXMgb2YgYWRkaXRpb25hbCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCi1zdGF0aWMgaW50IG92OTc0MF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPSB0b19vdjk3NDAoc2QpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gcHJpdi0+ZmxhZ192ZmxpcDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJY3RybC0+dmFsdWUgPSBwcml2LT5mbGFnX2hmbGlwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogU2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KLXN0YXRpYyBpbnQgb3Y5NzQwX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQorc3RhdGljIGludCBvdjk3NDBfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IG92OTc0MF9wcml2ICpwcml2ID0gdG9fb3Y5NzQwKHNkKTsKKwlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IG92OTc0MF9wcml2LCBoZGwpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCXByaXYtPmZsYWdfdmZsaXAgPSBjdHJsLT52YWx1ZTsKKwkJcHJpdi0+ZmxhZ192ZmxpcCA9IGN0cmwtPnZhbDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJcHJpdi0+ZmxhZ19oZmxpcCA9IGN0cmwtPnZhbHVlOworCQlwcml2LT5mbGFnX2hmbGlwID0gY3RybC0+dmFsOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg5MCwxOCArODM2LDEzIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBvdjk3NDBfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBvdjk3NDBfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IG92OTc0MF9wcml2ICpwcml2ID0gdG9fb3Y5NzQwKHNkKTsKIAl1OCBtb2RlbGhpLCBtb2RlbGxvOwogCWludCByZXQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRAogCSAqLwpAQCAtOTQyLDI1ICs4ODMsMzMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIG92OTc0MF9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gb3Y5NzQwX3NldF9idXNfcGFyYW0sCi0JLnF1ZXJ5X2J1c19wYXJhbQk9IG92OTc0MF9xdWVyeV9idXNfcGFyYW0sCi0JLmNvbnRyb2xzCQk9IG92OTc0MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUob3Y5NzQwX2NvbnRyb2xzKSwKLX07CisvKiBSZXF1ZXN0IGJ1cyBzZXR0aW5ncyBvbiBjYW1lcmEgc2lkZSAqLworc3RhdGljIGludCBvdjk3NDBfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKwljZmctPmZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y5NzQwX3ZpZGVvX29wcyA9IHsKLQkuc19zdHJlYW0JCT0gb3Y5NzQwX3Nfc3RyZWFtLAotCS5zX21idXNfZm10CQk9IG92OTc0MF9zX2ZtdCwKLQkudHJ5X21idXNfZm10CQk9IG92OTc0MF90cnlfZm10LAotCS5lbnVtX21idXNfZm10CQk9IG92OTc0MF9lbnVtX2ZtdCwKLQkuY3JvcGNhcAkJPSBvdjk3NDBfY3JvcGNhcCwKLQkuZ19jcm9wCQkJPSBvdjk3NDBfZ19jcm9wLAorCS5zX3N0cmVhbQk9IG92OTc0MF9zX3N0cmVhbSwKKwkuc19tYnVzX2ZtdAk9IG92OTc0MF9zX2ZtdCwKKwkudHJ5X21idXNfZm10CT0gb3Y5NzQwX3RyeV9mbXQsCisJLmVudW1fbWJ1c19mbXQJPSBvdjk3NDBfZW51bV9mbXQsCisJLmNyb3BjYXAJPSBvdjk3NDBfY3JvcGNhcCwKKwkuZ19jcm9wCQk9IG92OTc0MF9nX2Nyb3AsCisJLmdfbWJ1c19jb25maWcJPSBvdjk3NDBfZ19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y5NzQwX2NvcmVfb3BzID0gewotCS5nX2N0cmwJCQk9IG92OTc0MF9nX2N0cmwsCi0JLnNfY3RybAkJCT0gb3Y5NzQwX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CQk9IG92OTc0MF9nX2NoaXBfaWRlbnQsCiAJLnNfcG93ZXIJCT0gb3Y5NzQwX3NfcG93ZXIsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwpAQCAtOTc0LDYgKzkyMywxMCBAQAogCS52aWRlbwkJCT0gJm92OTc0MF92aWRlb19vcHMsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgb3Y5NzQwX2N0cmxfb3BzID0geworCS5zX2N0cmwgPSBvdjk3NDBfc19jdHJsLAorfTsKKwogLyoKICAqIGkyY19kcml2ZXIgZnVuY3Rpb24KICAqLwpAQCAtOTgxLDE2ICs5MzQsOSBAQAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKIHsKIAlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXY7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QJPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJNaXNzaW5nIHBsYXRmb3JtX2RhdGEgZm9yIGRyaXZlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAwMywxMiArOTQ5LDI0IEBACiAJfQogCiAJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3Y5NzQwX3N1YmRldl9vcHMpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnByaXYtPmhkbCwgMTMpOworCXY0bDJfY3RybF9uZXdfc3RkKCZwcml2LT5oZGwsICZvdjk3NDBfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnByaXYtPmhkbCwgJm92OTc0MF9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0hGTElQLCAwLCAxLCAxLCAwKTsKKwlwcml2LT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJnByaXYtPmhkbDsKKwlpZiAocHJpdi0+aGRsLmVycm9yKSB7CisJCWludCBlcnIgPSBwcml2LT5oZGwuZXJyb3I7CiAKLQlpY2QtPm9wcyA9ICZvdjk3NDBfb3BzOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKLQlyZXQgPSBvdjk3NDBfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCXJldCA9IG92OTc0MF92aWRlb19wcm9iZShjbGllbnQpOworCWlmICghcmV0KQorCQlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmcHJpdi0+aGRsKTsKIAlpZiAocmV0IDwgMCkgewotCQlpY2QtPm9wcyA9IE5VTEw7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnByaXYtPmhkbCk7CiAJCWtmcmVlKHByaXYpOwogCX0KIApAQCAtMTAxOSw4ICs5NzcsOSBAQAogewogCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnByaXYtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcHJpdi0+aGRsKTsKIAlrZnJlZShwcml2KTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvTWFrZWZpbGUKaW5kZXggZGUyZmMxNC4uYzE3ZjM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQAogCiBvYmotJChDT05GSUdfVklERU9fUFZSVVNCMikgKz0gcHZydXNiMi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1kZXZhdHRyLmMKaW5kZXggZTc5OTMzMS4uYzZkYThmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZGV2YXR0ci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWRldmF0dHIuYwpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAicHZydXNiMi1kZXZhdHRyLmgiCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAvKiBUaGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBwdWxsIGluIHR1bmVyIHR5cGUgaWRzLi4uICovCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKaW5kZXggZTk4ZDM4Mi4uMTIyYjQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CkBAIC0yOTkzLDYgKzI5OTQsMTMgQEAKIAkJcHZyMl9zdWJkZXZfc2V0X2NvbnRyb2woaGR3LCBpZCwgI2xhYiwgKGhkdyktPmxhYiMjX3ZhbCk7IFwKIAl9CiAKK2ludCBwdnIyX2hkd19nZXRfZGV0ZWN0ZWRfc3RkKHN0cnVjdCBwdnIyX2hkdyAqaGR3LCB2NGwyX3N0ZF9pZCAqc3RkKQoreworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZoZHctPnY0bDJfZGV2LCAwLAorCQkJICAgICB2aWRlbywgcXVlcnlzdGQsIHN0ZCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIEV4ZWN1dGUgd2hhdGV2ZXIgY29tbWFuZHMgYXJlIHJlcXVpcmVkIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYWxsIHRoZQogICAgc3ViLWRldmljZXMgc28gdGhhdCB0aGV5IG1hdGNoIG91ciBjdXJyZW50IGNvbnRyb2wgdmFsdWVzLiAqLwogc3RhdGljIHZvaWQgcHZyMl9zdWJkZXZfdXBkYXRlKHN0cnVjdCBwdnIyX2hkdyAqaGR3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaAppbmRleCBkNzc1M2FlLi42NjU0NjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaApAQCAtMjE0LDYgKzIxNCw5IEBACiBpbnQgcHZyMl9oZHdfZ2V0X3N0ZGVudW1fdmFsdWUoc3RydWN0IHB2cjJfaGR3ICpoZHcsc3RydWN0IHY0bDJfc3RhbmRhcmQgKnN0ZCwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4KTsKIAorLyogR2V0IHRoZSBkZXRlY3RlZCB2aWRlbyBzdGFuZGFyZCAqLworaW50IHB2cjJfaGR3X2dldF9kZXRlY3RlZF9zdGQoc3RydWN0IHB2cjJfaGR3ICpoZHcsIHY0bDJfc3RkX2lkICpzdGQpOworCiAvKiBFbmFibGUgLyBkaXNhYmxlIHJldHJpZXZhbCBvZiBDUFUgZmlybXdhcmUgb3IgcHJvbSBjb250ZW50cy4gIFRoaXMgbXVzdAogICAgYmUgZW5hYmxlZCBiZWZvcmUgcHZyMl9oZHdfY3B1ZndfZ2V0KCkgd2lsbCBmdW5jdGlvbi4gIE5vdGUgdGhhdCBkb2luZwogICAgdGhpcyBtYXkgcHJldmVudCB0aGUgZGV2aWNlIGZyb20gcnVubmluZyAoYW5kIGxlYXZpbmcgdGhpcyBtb2RlIG1heQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKaW5kZXggZTcyZDUxMC4uODg1Y2UxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KICNpbmNsdWRlICJwdnJ1c2IyLWkyYy1jb3JlLmgiCiAjaW5jbHVkZSAicHZydXNiMi1oZHctaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwppbmRleCBlMjdmOGFiLi42ZDY2NjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAicHZydXNiMi12NGwyLmgiCiAjaW5jbHVkZSAicHZydXNiMi1pb3JlYWQuaCIKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMjI3LDYgKzIyOCwxNCBAQAogCQlicmVhazsKIAl9CiAKKwljYXNlIFZJRElPQ19RVUVSWVNURDoKKwl7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCSpzdGQgPSBWNEwyX1NURF9BTEw7CisJCXJldCA9IHB2cjJfaGR3X2dldF9kZXRlY3RlZF9zdGQoaGR3LCBzdGQpOworCQlicmVhazsKKwl9CisKIAljYXNlIFZJRElPQ19HX1NURDoKIAl7CiAJCWludCB2YWwgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCA1MWNhMzU4Li4wMWZmNjQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtNzQ0LDkgKzc0NCw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVmlkZW9idWYyIG9wZXJhdGlvbnMgKi8KIAotc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCQl2b2lkICphbGxvY19jdHhzW10pCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwKKwkJCQl1bnNpZ25lZCBpbnQgKm5idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCisJCQkJdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCkBAIC04MTYsNyArODE2LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKaW5kZXggOGM3MGU2NC4uYTEwZmY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwpAQCAtODMsNiArODMsNyBAQAogCS5pZAk9IFBXQ19DSURfQ1VTVE9NKGNvbnRvdXIpLAogCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkubmFtZQk9ICJDb250b3VyIiwKKwkuZmxhZ3MgID0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAogCS5taW4JPSAwLAogCS5tYXgJPSA2MywKIAkuc3RlcAk9IDEsCkBAIC0yMDYsOCArMjA3LDcgQEAKIAlwZGV2LT5ibHVlX2JhbGFuY2UgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCiAJCQkJVjRMMl9DSURfQkxVRV9CQUxBTkNFLCAwLCAyNTUsIDEsIGRlZik7CiAKLQl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsICZwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UsIGF3Yl9tYW51YWwsCi0JCQkgICAgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT5jdXIudmFsID09IGF3Yl9hdXRvKTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsICZwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UsIGF3Yl9tYW51YWwsIHRydWUpOwogCiAJLyogYXV0b2dhaW4sIGdhaW4gKi8KIAlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsICZkZWYpOwpAQCAtMzMxLDEyICszMzEsMTIgQEAKIAlwZGV2LT5yZXN0b3JlX3VzZXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZwd2NfcmVzdG9yZV91c2VyX2NmZywKIAkJCQkJCSAgTlVMTCk7CiAJaWYgKHBkZXYtPnJlc3RvcmVfdXNlcikKLQkJcGRldi0+cmVzdG9yZV91c2VyLT5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKwkJcGRldi0+cmVzdG9yZV91c2VyLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CiAJcGRldi0+cmVzdG9yZV9mYWN0b3J5ID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLAogCQkJCQkJICAgICAmcHdjX3Jlc3RvcmVfZmFjdG9yeV9jZmcsCiAJCQkJCQkgICAgIE5VTEwpOwogCWlmIChwZGV2LT5yZXN0b3JlX2ZhY3RvcnkpCi0JCXBkZXYtPnJlc3RvcmVfZmFjdG9yeS0+ZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CisJCXBkZXYtPnJlc3RvcmVfZmFjdG9yeS0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOwogCiAJaWYgKCEocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpKQogCQlyZXR1cm4gaGRsLT5lcnJvcjsKQEAgLTU2Myw4ICs1NjMsMTAgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKLQkJaWYgKHBkZXYtPmNvbG9yX2JhbF92YWxpZCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLAotCQkJCXBkZXYtPmxhc3RfY29sb3JfYmFsX3VwZGF0ZSArIEhaIC8gNCkpIHsKKwkJaWYgKHBkZXYtPmNvbG9yX2JhbF92YWxpZCAmJgorCQkJKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsICE9IGF3Yl9hdXRvIHx8CisJCQkgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQlwZGV2LT5sYXN0X2NvbG9yX2JhbF91cGRhdGUgKyBIWiAvIDQpKSkgewogCQkJcGRldi0+cmVkX2JhbGFuY2UtPnZhbCAgPSBwZGV2LT5sYXN0X3JlZF9iYWxhbmNlOwogCQkJcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwgPSBwZGV2LT5sYXN0X2JsdWVfYmFsYW5jZTsKIAkJCWJyZWFrOwpAQCAtNjMwLDcgKzYzMiw3IEBACiAKIHN0YXRpYyBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKQEAgLTYzOSw1MiArNjQxLDM0IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCS8qIFVwZGF0ZSB2YWwgd2hlbiBjb21pbmcgZnJvbSBhdXRvIG9yIGdvaW5nIHRvIGEgcHJlc2V0ICovCi0JCWlmIChwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgfHwKLQkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9pbmRvb3IgfHwKLQkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9vdXRkb29yIHx8Ci0JCSAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2JfZmwpIHsKLQkJCWlmICghcGRldi0+cmVkX2JhbGFuY2UtPmlzX25ldykKLQkJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCi0JCQkJCVJFQURfUkVEX0dBSU5fRk9STUFUVEVSLAotCQkJCQkmcGRldi0+cmVkX2JhbGFuY2UtPnZhbCk7Ci0JCQlpZiAoIXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfbmV3KQotCQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKLQkJCQkJUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSLAotCQkJCQkmcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwpOwotCQl9Ci0JCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2JfYXV0bykgewotCQkJcGRldi0+cmVkX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gdHJ1ZTsKLQkJCXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSB0cnVlOwotCQkJcGRldi0+Y29sb3JfYmFsX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLwotCQl9IGVsc2UgewotCQkJcGRldi0+cmVkX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gZmFsc2U7Ci0JCQlwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlpZiAocmV0ID09IDAgJiYgcGRldi0+cmVkX2JhbGFuY2UtPmlzX25ldykgewogCQlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgIT0gYXdiX21hbnVhbCkKLQkJCXJldHVybiAtRUJVU1k7CisJCQlwZGV2LT5jb2xvcl9iYWxfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJfQorCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCAhPSBhd2JfbWFudWFsKQorCQlyZXR1cm4gMDsKKworCWlmIChwZGV2LT5yZWRfYmFsYW5jZS0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAogCQkJCSAgICAgIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLAogCQkJCSAgICAgIHBkZXYtPnJlZF9iYWxhbmNlLT52YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocmV0ID09IDAgJiYgcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc19uZXcpIHsKLQkJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsICE9IGF3Yl9tYW51YWwpCi0JCQlyZXR1cm4gLUVCVVNZOworCWlmIChwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKIAkJCQkgICAgICBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsCiAJCQkJICAgICAgcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogRm9yIENPREVDMiBtb2RlbHMgd2hpY2ggaGF2ZSBzZXBhcmF0ZSBhdXRvZ2FpbiBhbmQgYXV0byBleHBvc3VyZSAqLwogc3RhdGljIGludCBwd2Nfc2V0X2F1dG9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlpZiAocGRldi0+YXV0b2dhaW4tPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCkBAIC02OTIsMjcgKzY3NiwyOCBAQAogCQkJCSAgICAgIHBkZXYtPmF1dG9nYWluLT52YWwgPyAwIDogMHhmZik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCiAJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQogCQkJcGRldi0+Z2Fpbl92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KLQkJZWxzZSBpZiAoIXBkZXYtPmdhaW4tPmlzX25ldykKLQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKLQkJCQkJUkVBRF9BR0NfRk9STUFUVEVSLAotCQkJCQkmcGRldi0+Z2Fpbi0+dmFsKTsKIAl9Ci0JaWYgKHJldCA9PSAwICYmIHBkZXYtPmdhaW4tPmlzX25ldykgewotCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKLQkJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGRldi0+Z2Fpbi0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKIAkJCQkgICAgICBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwKIAkJCQkgICAgICBwZGV2LT5nYWluLT52YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogRm9yIENPREVDMiBtb2RlbHMgd2hpY2ggaGF2ZSBzZXBhcmF0ZSBhdXRvZ2FpbiBhbmQgYXV0byBleHBvc3VyZSAqLwogc3RhdGljIGludCBwd2Nfc2V0X2V4cG9zdXJlX2F1dG8oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAlpbnQgaXNfYXV0byA9IHBkZXYtPmV4cG9zdXJlX2F1dG8tPnZhbCA9PSBWNEwyX0VYUE9TVVJFX0FVVE87CiAKIAlpZiAocGRldi0+ZXhwb3N1cmVfYXV0by0+aXNfbmV3KSB7CkBAIC03MjEsMjcgKzcwNiwyOCBAQAogCQkJCSAgICAgIGlzX2F1dG8gPyAwIDogMHhmZik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCiAJCWlmIChpc19hdXRvKQogCQkJcGRldi0+ZXhwb3N1cmVfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCi0JCWVsc2UgaWYgKCFwZGV2LT5leHBvc3VyZS0+aXNfbmV3KQotCQkJcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKLQkJCQkJIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsCi0JCQkJCSAmcGRldi0+ZXhwb3N1cmUtPnZhbCk7CiAJfQotCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7Ci0JCWlmIChpc19hdXRvKQotCQkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpc19hdXRvKQorCQlyZXR1cm4gMDsKKworCWlmIChwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7CiAJCXJldCA9IHB3Y19zZXRfdTE2X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCiAJCQkJICAgICAgIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwKIAkJCQkgICAgICAgcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKiBGb3IgQ09ERUMzIG1vZGVscyB3aGljaCBoYXZlIGF1dG9nYWluIGNvbnRyb2xsaW5nIGJvdGggZ2FpbiBhbmQgZXhwb3N1cmUgKi8KIHN0YXRpYyBpbnQgcHdjX3NldF9hdXRvZ2Fpbl9leHBvKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlpZiAocGRldi0+YXV0b2dhaW4tPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCkBAIC03NDksMzUgKzczNSwzMiBAQAogCQkJCSAgICAgIHBkZXYtPmF1dG9nYWluLT52YWwgPyAwIDogMHhmZik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCiAJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKSB7CiAJCQlwZGV2LT5nYWluX3ZhbGlkICAgICA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KIAkJCXBkZXYtPmV4cG9zdXJlX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLwotCQl9IGVsc2UgewotCQkJaWYgKCFwZGV2LT5nYWluLT5pc19uZXcpCi0JCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAotCQkJCQkJUkVBRF9BR0NfRk9STUFUVEVSLAotCQkJCQkJJnBkZXYtPmdhaW4tPnZhbCk7Ci0JCQlpZiAoIXBkZXYtPmV4cG9zdXJlLT5pc19uZXcpCi0JCQkJcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKLQkJCQkJCSBSRUFEX1NIVVRURVJfRk9STUFUVEVSLAotCQkJCQkJICZwZGV2LT5leHBvc3VyZS0+dmFsKTsKIAkJfQogCX0KLQlpZiAocmV0ID09IDAgJiYgcGRldi0+Z2Fpbi0+aXNfbmV3KSB7Ci0JCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQotCQkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQlyZXR1cm4gMDsKKworCWlmIChwZGV2LT5nYWluLT5pc19uZXcpIHsKIAkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAogCQkJCSAgICAgIFBSRVNFVF9BR0NfRk9STUFUVEVSLAogCQkJCSAgICAgIHBkZXYtPmdhaW4tPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAocmV0ID09IDAgJiYgcGRldi0+ZXhwb3N1cmUtPmlzX25ldykgewotCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKLQkJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocGRldi0+ZXhwb3N1cmUtPmlzX25ldykgewogCQlyZXQgPSBwd2Nfc2V0X3UxNl9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAogCQkJCSAgICAgICBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIsCiAJCQkJICAgICAgIHBkZXYtPmV4cG9zdXJlLT52YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwd2Nfc2V0X21vdG9yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQpAQCAtODc4LDEwICs4NjEsNiBAQAogCQkJCQlwZGV2LT5hdXRvY29udG91ci0+dmFsID8gMCA6IDB4ZmYpOwogCQl9CiAJCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5jb250b3VyLT5pc19uZXcpIHsKLQkJCWlmIChwZGV2LT5hdXRvY29udG91ci0+dmFsKSB7Ci0JCQkJcmV0ID0gLUVCVVNZOwotCQkJCWJyZWFrOwotCQkJfQogCQkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAogCQkJCQkgICAgICBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIsCiAJCQkJCSAgICAgIHBkZXYtPmNvbnRvdXItPnZhbCk7CkBAIC0xMDk5LDYgKzEwNzgsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwd2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9sb2dfc3RhdHVzKCZwZGV2LT5jdHJsX2hhbmRsZXIsIFBXQ19OQU1FKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGxvbmcgcHdjX2RlZmF1bHQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBib29sIHZhbGlkX3ByaW8sCiAJCQlpbnQgY21kLCB2b2lkICphcmcpCiB7CkBAIC0xMTIyLDYgKzExMDksNyBAQAogCS52aWRpb2NfZHFidWYJCQkgICAgPSBwd2NfZHFidWYsCiAJLnZpZGlvY19zdHJlYW1vbgkJICAgID0gcHdjX3N0cmVhbW9uLAogCS52aWRpb2Nfc3RyZWFtb2ZmCQkgICAgPSBwd2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfbG9nX3N0YXR1cwkJICAgID0gcHdjX2xvZ19zdGF0dXMsCiAJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMJCSAgICA9IHB3Y19lbnVtX2ZyYW1lc2l6ZXMsCiAJLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzCSAgICA9IHB3Y19lbnVtX2ZyYW1laW50ZXJ2YWxzLAogCS52aWRpb2NfZGVmYXVsdAkJICAgID0gcHdjX2RlZmF1bHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCmluZGV4IGQwN2RmMjJhLi43OWZiMjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwpAQCAtMjE0LDYgKzIxNCw3IEBACiAJdW5zaWduZWQgbG9uZwkJY2ljbGs7CiAJdW5zaWduZWQgbG9uZwkJbWNsazsKIAl1MzIJCQltY2xrX2Rpdmlzb3I7CisJdTE2CQkJd2lkdGhfZmxhZ3M7CS8qIG1heCAxMCBiaXRzICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNhcHR1cmU7CiAKQEAgLTEwMjAsMzcgKzEwMjEsMjAgQEAKIAkgKiBxdWljayBjYXB0dXJlIGludGVyZmFjZSBzdXBwb3J0cyBib3RoLgogCSAqLwogCSpmbGFncyA9IChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX01BU1RFUiA/Ci0JCSAgU09DQU1fTUFTVEVSIDogU09DQU1fU0xBVkUpIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwKLQkJU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8Ci0JCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJCSAgVjRMMl9NQlVTX01BU1RFUiA6IFY0TDJfTUJVU19TTEFWRSkgfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0ggfAorCQlWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwKKwkJVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkc7CiAKIAkvKiBJZiByZXF1ZXN0ZWQgZGF0YSB3aWR0aCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCB1c2UgaXQgKi8KLQlzd2l0Y2ggKGJ1c3dpZHRoKSB7Ci0JY2FzZSAxMDoKLQkJaWYgKCEocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfMTApKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7Ci0JCWJyZWFrOwotCWNhc2UgOToKLQkJaWYgKCEocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfOSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJKmZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF85OwotCQlicmVhazsKLQljYXNlIDg6Ci0JCWlmICghKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfREFUQVdJRFRIXzgpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCSpmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmICgoMSA8PCAoYnVzd2lkdGggLSAxKSkgJiBwY2Rldi0+d2lkdGhfZmxhZ3MpCisJCXJldHVybiAwOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyB2b2lkIHB4YV9jYW1lcmFfc2V0dXBfY2ljcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKQEAgLTEwNzAsMTIgKzEwNTQsMTIgQEAKIAkgKiBEYXRhd2lkdGggaXMgbm93IGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZSB0aHJlZSB2YWx1ZXMuCiAJICogV2UgZml4IGJpdC1wZXItcGl4ZWwgZXF1YWwgdG8gZGF0YS13aWR0aC4uLgogCSAqLwotCXN3aXRjaCAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykgewotCWNhc2UgU09DQU1fREFUQVdJRFRIXzEwOgorCXN3aXRjaCAoaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmJpdHNfcGVyX3NhbXBsZSkgeworCWNhc2UgMTA6CiAJCWR3ID0gNDsKIAkJYnBwID0gMHg0MDsKIAkJYnJlYWs7Ci0JY2FzZSBTT0NBTV9EQVRBV0lEVEhfOToKKwljYXNlIDk6CiAJCWR3ID0gMzsKIAkJYnBwID0gMHgyMDsKIAkJYnJlYWs7CkBAIC0xMDg0LDcgKzEwNjgsNyBAQAogCQkgKiBBY3R1YWxseSBpdCBjYW4gb25seSBiZSA4IG5vdywKIAkJICogZGVmYXVsdCBpcyBqdXN0IHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MKIAkJICovCi0JY2FzZSBTT0NBTV9EQVRBV0lEVEhfODoKKwljYXNlIDg6CiAJCWR3ID0gMjsKIAkJYnBwID0gMDsKIAl9CkBAIC0xMDkzLDExICsxMDc3LDExIEBACiAJCWNpY3I0IHw9IENJQ1I0X1BDTEtfRU47CiAJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfTUNMS19FTikKIAkJY2ljcjQgfD0gQ0lDUjRfTUNMS19FTjsKLQlpZiAoZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCWlmIChmbGFncyAmIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HKQogCQljaWNyNCB8PSBDSUNSNF9QQ1A7Ci0JaWYgKGZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJY2ljcjQgfD0gQ0lDUjRfSFNQOwotCWlmIChmbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpCisJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCiAJCWNpY3I0IHw9IENJQ1I0X1ZTUDsKIAogCWNpY3IwID0gX19yYXdfcmVhZGwocGNkZXYtPmJhc2UgKyBDSUNSMCk7CkBAIC0xMTUxLDkgKzExMzUsMTEgQEAKIAogc3RhdGljIGludCBweGFfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3M7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcHhhX2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7CiAKQEAgLTExNjIsNDUgKzExNDgsNTkgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKLQotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOwotCWlmICghY29tbW9uX2ZsYWdzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKCFyZXQpIHsKKwkJY29tbW9uX2ZsYWdzID0gc29jX21idXNfY29uZmlnX2NvbXBhdGlibGUoJmNmZywKKwkJCQkJCQkgIGJ1c19mbGFncyk7CisJCWlmICghY29tbW9uX2ZsYWdzKSB7CisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKKwkJCQkgIkZsYWdzIGluY29tcGF0aWJsZTogY2FtZXJhIDB4JXgsIGhvc3QgMHglbHhcbiIsCisJCQkJIGNmZy5mbGFncywgYnVzX2ZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJY29tbW9uX2ZsYWdzID0gYnVzX2ZsYWdzOworCX0KIAogCXBjZGV2LT5jaGFubmVscyA9IDE7CiAKIAkvKiBNYWtlIGNob2lzZXMsIGJhc2VkIG9uIHBsYXRmb3JtIHByZWZlcmVuY2VzICovCi0JaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCkgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykpIHsKIAkJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfSFNQKQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfSElHSDsKKwkJCWNvbW1vbl9mbGFncyAmPSB+VjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9MT1c7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XOwogCX0KIAotCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpICYmCi0JICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKSkgeworCWlmICgoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpKSB7CiAJCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX1ZTUCkKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKLQkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJaWYgKChjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CiAJCWlmIChwY2Rldi0+cGxhdGZvcm1fZmxhZ3MgJiBQWEFfQ0FNRVJBX1BDUCkKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfUklTSU5HOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HOwogCQllbHNlCi0JCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HOworCX0KKworCWNmZy5mbGFncyA9IGNvbW1vbl9mbGFnczsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNmZyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlkZXZfZGJnKGljZC0+cGFyZW50LCAiY2FtZXJhIHNfbWJ1c19jb25maWcoMHglbHgpIHJldHVybmVkICVkXG4iLAorCQkJY29tbW9uX2ZsYWdzLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWNhbS0+ZmxhZ3MgPSBjb21tb25fZmxhZ3M7CiAKLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAlweGFfY2FtZXJhX3NldHVwX2NpY3IoaWNkLCBjb21tb25fZmxhZ3MsIHBpeGZtdCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEyMDksMTcgKzEyMDksMzEgQEAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoKQogeworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzOworCXN0cnVjdCB2NGwyX21idXNfY29uZmlnIGNmZyA9IHsudHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTCx9OworCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3M7CiAJaW50IHJldCA9IHRlc3RfcGxhdGZvcm1fcGFyYW0ocGNkZXYsIGJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAoIXJldCkgeworCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgYnVzX2ZsYWdzKTsKKwkJaWYgKCFjb21tb25fZmxhZ3MpIHsKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAorCQkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgMHgleCwgaG9zdCAweCVseFxuIiwKKwkJCQkgY2ZnLmZsYWdzLCBidXNfZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKHJldCA9PSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0ID0gMDsKKwl9CiAKLQlyZXR1cm4gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncykgPyAwIDogLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10IHB4YV9jYW1lcmFfZm9ybWF0c1tdID0gewpAQCAtMTY4Nyw2ICsxNzAxLDEyIEBACiAJCQkgImRhdGEgd2lkdGhzLCB1c2luZyBkZWZhdWx0IDEwIGJpdFxuIik7CiAJCXBjZGV2LT5wbGF0Zm9ybV9mbGFncyB8PSBQWEFfQ0FNRVJBX0RBVEFXSURUSF8xMDsKIAl9CisJaWYgKHBjZGV2LT5wbGF0Zm9ybV9mbGFncyAmIFBYQV9DQU1FUkFfREFUQVdJRFRIXzgpCisJCXBjZGV2LT53aWR0aF9mbGFncyA9IDEgPDwgNzsKKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfOSkKKwkJcGNkZXYtPndpZHRoX2ZsYWdzIHw9IDEgPDwgODsKKwlpZiAocGNkZXYtPnBsYXRmb3JtX2ZsYWdzICYgUFhBX0NBTUVSQV9EQVRBV0lEVEhfMTApCisJCXBjZGV2LT53aWR0aF9mbGFncyB8PSAxIDw8IDk7CiAJcGNkZXYtPm1jbGsgPSBwY2Rldi0+cGRhdGEtPm1jbGtfMTBraHogKiAxMDAwMDsKIAlpZiAoIXBjZGV2LT5tY2xrKSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCmluZGV4IDg0N2NjYzAuLjk5MzczODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCkBAIC0xMSwxMyArMTEsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9yajU0bjFjYjBjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCiAjZGVmaW5lIFJKNTROMV9ERVZfQ09ERQkJCTB4MDQwMAogI2RlZmluZSBSSjU0TjFfREVWX0NPREUyCQkweDA0MDEKQEAgLTE0OCw2ICsxNTAsNyBAQAogCiBzdHJ1Y3Qgcmo1NG4xIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBoZGw7CiAJc3RydWN0IHJqNTRuMV9jbG9ja19kaXYgY2xrX2RpdjsKIAljb25zdCBzdHJ1Y3Qgcmo1NG4xX2RhdGFmbXQgKmZtdDsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CS8qIFNlbnNvciB3aW5kb3cgKi8KQEAgLTQ5OSwzMSArNTAyLDYgQEAKIAlyZXR1cm4gcmVnX3NldChjbGllbnQsIFJKNTROMV9TVElMTF9DT05UUk9MLCAoIWVuYWJsZSkgPDwgNywgMHg4MCk7CiB9CiAKLXN0YXRpYyBpbnQgcmo1NG4xX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JLyogRmlndXJlcyAyLjUtMSB0byAyLjUtMyAtIGRlZmF1bHQgZmFsbGluZyBwaXhjbGsgZWRnZSAqLwotCi0JaWYgKGZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKQotCQlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX09VVF9TSUdQTywgMSA8PCA0KTsKLQllbHNlCi0JCXJldHVybiByZWdfd3JpdGUoY2xpZW50LCBSSjU0TjFfT1VUX1NJR1BPLCAwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmo1NG4xX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0KLQkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8Ci0JCVNPQ0FNX01BU1RFUiB8IFNPQ0FNX0RBVEFXSURUSF84IHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7Ci0KLQlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgcmo1NG4xX3NldF9yZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgICB1MTYgcmVnX3gsIHUxNiByZWdfeSwgdTE2IHJlZ194eSwKIAkJCSAgIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKQEAgLTEyMDIsMTM0ICsxMTgwLDUxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByajU0bjFfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkZsaXAgVmVydGljYWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfSEZMSVAsCi0JCS50eXBlCQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JCS5uYW1lCQk9ICJGbGlwIEhvcml6b250YWxseSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwgewotCQkuaWQJCT0gVjRMMl9DSURfR0FJTiwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIkdhaW4iLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMTI3LAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDY2LAotCQkuZmxhZ3MJCT0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkF1dG8gd2hpdGUgYmFsYW5jZSIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgcmo1NG4xX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSByajU0bjFfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gcmo1NG4xX3F1ZXJ5X2J1c19wYXJhbSwKLQkuY29udHJvbHMJCT0gcmo1NG4xX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShyajU0bjFfY29udHJvbHMpLAotfTsKLQotc3RhdGljIGludCByajU0bjFfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCitzdGF0aWMgaW50IHJqNTRuMV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKKwlzdHJ1Y3Qgcmo1NG4xICpyajU0bjEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHJqNTRuMSwgaGRsKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gJnJqNTRuMS0+c3ViZGV2OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgcmo1NG4xICpyajU0bjEgPSB0b19yajU0bjEoY2xpZW50KTsKIAlpbnQgZGF0YTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlkYXRhID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfTUlSUk9SX1NUSUxMX01PREUpOwotCQlpZiAoZGF0YSA8IDApCi0JCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSAhKGRhdGEgJiAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFKTsKLQkJaWYgKGRhdGEgPCAwKQotCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gIShkYXRhICYgMik7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgUko1NE4xX1lfR0FJTik7Ci0JCWlmIChkYXRhIDwgMCkKLQkJCXJldHVybiAtRUlPOwotCi0JCWN0cmwtPnZhbHVlID0gZGF0YSAvIDI7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQljdHJsLT52YWx1ZSA9IHJqNTRuMS0+YXV0b193YjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmo1NG4xX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCWludCBkYXRhOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgcmo1NG4xICpyajU0bjEgPSB0b19yajU0bjEoY2xpZW50KTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsOwotCi0JcWN0cmwgPSBzb2NfY2FtZXJhX2ZpbmRfcWN0cmwoJnJqNTRuMV9vcHMsIGN0cmwtPmlkKTsKLQlpZiAoIXFjdHJsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCisJCWlmIChjdHJsLT52YWwpCiAJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9NSVJST1JfU1RJTExfTU9ERSwgMCwgMSk7CiAJCWVsc2UKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFLCAxLCAxKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCisJCWlmIChjdHJsLT52YWwpCiAJCQlkYXRhID0gcmVnX3NldChjbGllbnQsIFJKNTROMV9NSVJST1JfU1RJTExfTU9ERSwgMCwgMik7CiAJCWVsc2UKIAkJCWRhdGEgPSByZWdfc2V0KGNsaWVudCwgUko1NE4xX01JUlJPUl9TVElMTF9NT0RFLCAyLCAyKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmIChjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtIHx8Ci0JCSAgICBjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UgaWYgKHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9ZX0dBSU4sIGN0cmwtPnZhbHVlICogMikgPCAwKQorCQlpZiAocmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX1lfR0FJTiwgY3RybC0+dmFsICogMikgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKIAkJLyogQXV0byBXQiBhcmVhIC0gd2hvbGUgaW1hZ2UgKi8KLQkJaWYgKHJlZ19zZXQoY2xpZW50LCBSSjU0TjFfV0JfU0VMX1dFSUdIVF9JLCBjdHJsLT52YWx1ZSA8PCA3LAorCQlpZiAocmVnX3NldChjbGllbnQsIFJKNTROMV9XQl9TRUxfV0VJR0hUX0ksIGN0cmwtPnZhbCA8PCA3LAogCQkJICAgIDB4ODApIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQlyajU0bjEtPmF1dG9fd2IgPSBjdHJsLT52YWx1ZTsKLQkJYnJlYWs7CisJCXJqNTRuMS0+YXV0b193YiA9IGN0cmwtPnZhbDsKKwkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyByajU0bjFfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IHJqNTRuMV9zX2N0cmwsCit9OworCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHJqNTRuMV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJPSByajU0bjFfZ19jdHJsLAotCS5zX2N0cmwJCT0gcmo1NG4xX3NfY3RybCwKIAkuZ19jaGlwX2lkZW50CT0gcmo1NG4xX2dfY2hpcF9pZGVudCwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSByajU0bjFfZ19yZWdpc3RlciwKQEAgLTEzMzcsNiArMTIzMiwzNiBAQAogI2VuZGlmCiB9OwogCitzdGF0aWMgaW50IHJqNTRuMV9nX21idXNfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gc29jX2NhbWVyYV9pMmNfdG9fbGluayhjbGllbnQpOworCisJY2ZnLT5mbGFncyA9CisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyB8CisJCVY0TDJfTUJVU19NQVNURVIgfCBWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSCB8CisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmo1NG4xX3NfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisKKwkvKiBGaWd1cmVzIDIuNS0xIHRvIDIuNS0zIC0gZGVmYXVsdCBmYWxsaW5nIHBpeGNsayBlZGdlICovCisJaWYgKHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpICYKKwkgICAgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORykKKwkJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIFJKNTROMV9PVVRfU0lHUE8sIDEgPDwgNCk7CisJZWxzZQorCQlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgUko1NE4xX09VVF9TSUdQTywgMCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHJqNTRuMV9zdWJkZXZfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQk9IHJqNTRuMV9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAk9IHJqNTRuMV9zX2ZtdCwKQEAgLTEzNDYsNiArMTI3MSw4IEBACiAJLmdfY3JvcAkJPSByajU0bjFfZ19jcm9wLAogCS5zX2Nyb3AJCT0gcmo1NG4xX3NfY3JvcCwKIAkuY3JvcGNhcAk9IHJqNTRuMV9jcm9wY2FwLAorCS5nX21idXNfY29uZmlnCT0gcmo1NG4xX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSByajU0bjFfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHJqNTRuMV9zdWJkZXZfb3BzID0gewpAQCAtMTM1NywxNyArMTI4NCwxMiBAQAogICogSW50ZXJmYWNlIGFjdGl2ZSwgY2FuIHVzZSBpMmMuIElmIGl0IGZhaWxzLCBpdCBjYW4gaW5kZWVkIG1lYW4sIHRoYXQKICAqIHRoaXMgd2Fzbid0IG91ciBjYXB0dXJlIGludGVyZmFjZSwgc28sIHdlIHdhaXQgZm9yIHRoZSByaWdodCBvbmUKICAqLwotc3RhdGljIGludCByajU0bjFfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorc3RhdGljIGludCByajU0bjFfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICAgIHN0cnVjdCByajU0bjFfcGRhdGEgKnByaXYpCiB7CiAJaW50IGRhdGExLCBkYXRhMjsKIAlpbnQgcmV0OwogCi0JLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KLQlCVUdfT04oIWljZC0+cGFyZW50IHx8Ci0JICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwotCiAJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwogCWRhdGExID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfREVWX0NPREUpOwogCWRhdGEyID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfREVWX0NPREUyKTsKQEAgLTEzOTUsMTggKzEzMTcsMTEgQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiB7CiAJc3RydWN0IHJqNTRuMSAqcmo1NG4xOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CiAJc3RydWN0IHJqNTRuMV9wZGF0YSAqcmo1NG4xX3ByaXY7CiAJaW50IHJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUko1NE4xQ0IwQzogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJaWYgKCFpY2wgfHwgIWljbC0+cHJpdikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlJKNTROMUNCMEM6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0MjUsOCArMTM0MCwyMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZyajU0bjEtPnN1YmRldiwgY2xpZW50LCAmcmo1NG4xX3N1YmRldl9vcHMpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnJqNTRuMS0+aGRsLCA0KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmcmo1NG4xLT5oZGwsICZyajU0bjFfY3RybF9vcHMsCisJCQlWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJnJqNTRuMS0+aGRsLCAmcmo1NG4xX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZyajU0bjEtPmhkbCwgJnJqNTRuMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0dBSU4sIDAsIDEyNywgMSwgNjYpOworCXY0bDJfY3RybF9uZXdfc3RkKCZyajU0bjEtPmhkbCwgJnJqNTRuMV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwgMCwgMSwgMSwgMSk7CisJcmo1NG4xLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJnJqNTRuMS0+aGRsOworCWlmIChyajU0bjEtPmhkbC5lcnJvcikgeworCQlpbnQgZXJyID0gcmo1NG4xLT5oZGwuZXJyb3I7CiAKLQlpY2QtPm9wcwkJPSAmcmo1NG4xX29wczsKKwkJa2ZyZWUocmo1NG4xKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlyajU0bjEtPmNsa19kaXYJCT0gY2xrX2RpdjsKIAlyajU0bjEtPnJlY3QubGVmdAk9IFJKNTROMV9DT0xVTU5fU0tJUDsKQEAgLTE0NDAsMjUgKzEzNjksMjQgQEAKIAlyajU0bjEtPnRnY2xrX21oegk9IChyajU0bjFfcHJpdi0+bWNsa19mcmVxIC8gUExMX0wgKiBQTExfTikgLwogCQkoY2xrX2Rpdi5yYXRpb190ZyArIDEpIC8gKGNsa19kaXYucmF0aW9fdCArIDEpOwogCi0JcmV0ID0gcmo1NG4xX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50LCByajU0bjFfcHJpdik7CisJcmV0ID0gcmo1NG4xX3ZpZGVvX3Byb2JlKGNsaWVudCwgcmo1NG4xX3ByaXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcmo1NG4xLT5oZGwpOwogCQlrZnJlZShyajU0bjEpOwogCQlyZXR1cm4gcmV0OwogCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZyajU0bjEtPmhkbCk7CiB9CiAKIHN0YXRpYyBpbnQgcmo1NG4xX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCByajU0bjEgKnJqNTRuMSA9IHRvX3JqNTRuMShjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJnJqNTRuMS0+c3ViZGV2KTsKIAlpZiAoaWNsLT5mcmVlX2J1cykKIAkJaWNsLT5mcmVlX2J1cyhpY2wpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnJqNTRuMS0+aGRsKTsKIAlrZnJlZShyajU0bjEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1azZhYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNWs2YWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGY3ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNWs2YWEuYwpAQCAtMCwwICsxLDE2ODEgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFNhbXN1bmcgUzVLNkFBRlggU1hHQSAxLzYiIDEuM00gQ01PUyBJbWFnZSBTZW5zb3IKKyAqIHdpdGggZW1iZWRkZWQgU29DIElTUC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CisgKgorICogQmFzZWQgb24gYSBkcml2ZXIgYXV0aG9yZWQgYnkgRG9uZ3NvbyBOYXRoYW5pZWwgS2ltLgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBEb25nc29vIE5hdGhhbmllbCBLaW0gPGRvbmdzb280NS5raW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbWVkaWEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYS1lbnRpdHkuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zNWs2YWEuaD4KKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKKworI2RlZmluZSBEUklWRVJfTkFNRQkJCSJTNUs2QUEiCisKKy8qIFRoZSB0b2tlbiB0byBpbmRpY2F0ZSBhcnJheSB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBTNUs2QUFfVEVSTQkJCTB4ZmZmZgorI2RlZmluZSBTNUs2QUFfT1VUX1dJRFRIX0RFRgkJNjQwCisjZGVmaW5lIFM1SzZBQV9PVVRfSEVJR0hUX0RFRgkJNDgwCisjZGVmaW5lIFM1SzZBQV9XSU5fV0lEVEhfTUFYCQkxMjgwCisjZGVmaW5lIFM1SzZBQV9XSU5fSEVJR0hUX01BWAkJMTAyNAorI2RlZmluZSBTNUs2QUFfV0lOX1dJRFRIX01JTgkJOAorI2RlZmluZSBTNUs2QUFfV0lOX0hFSUdIVF9NSU4JCTgKKworLyoKKyAqIEgvVyByZWdpc3RlciBJbnRlcmZhY2UgKDB4RDAwMDAwMDAgLSAweEQwMDAwRkZGKQorICovCisjZGVmaW5lIEFIQl9NU0JfQUREUl9QVFIJCTB4ZmNmYworI2RlZmluZSBHRU5fUkVHX09GRlNICQkJMHhkMDAwCisjZGVmaW5lIFJFR19DTURXUl9BRERSSAkJCTB4MDAyOAorI2RlZmluZSBSRUdfQ01EV1JfQUREUkwJCQkweDAwMmEKKyNkZWZpbmUgUkVHX0NNRFJEX0FERFJICQkJMHgwMDJjCisjZGVmaW5lIFJFR19DTURSRF9BRERSTAkJCTB4MDAyZQorI2RlZmluZSBSRUdfQ01EQlVGMF9BRERSCQkweDBmMTIKKyNkZWZpbmUgUkVHX0NNREJVRjFfQUREUgkJMHgwZjEwCisKKy8qCisgKiBIb3N0IFMvVyBSZWdpc3RlciBpbnRlcmZhY2UgKDB4NzAwMDAwMDAgLSAweDcwMDAyMDAwKQorICogVGhlIHZhbHVlIG9mIHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBhZGRyZXNzIGJ5dGVzIGlzIDB4NzAwMCwKKyAqIChIT1NUX1NXSUZfT0ZGU19IKS4gVGhlIHJlZ2lzdGVyIGFkZHJlc3NlcyBiZWxvdyBzcGVjaWZ5IDIgTFNCcy4KKyAqLworI2RlZmluZSBIT1NUX1NXSUZfT0ZGU0gJCQkweDcwMDAKKworLyogSW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworLyogTWFzdGVyIGNsb2NrIGZyZXF1ZW5jeSBpbiBLSHogKi8KKyNkZWZpbmUgUkVHX0lfSU5DTEtfRlJFUV9MCQkweDAxYjgKKyNkZWZpbmUgUkVHX0lfSU5DTEtfRlJFUV9ICQkweDAxYmEKKyNkZWZpbmUgIE1JTl9NQ0xLX0ZSRVFfS0haCQk2MDAwVQorI2RlZmluZSAgTUFYX01DTEtfRlJFUV9LSFoJCTI3MDAwVQorI2RlZmluZSBSRUdfSV9VU0VfTlBWSV9DTE9DS1MJCTB4MDFjNgorI2RlZmluZSBSRUdfSV9VU0VfTk1JUElfQ0xPQ0tTCQkweDAxYzgKKworLyogQ2xvY2sgY29uZmlndXJhdGlvbnMsIG4gPSAwLi4yLiBSRUdfSV8qIGZyZXF1ZW5jeSB1bml0IGlzIDQga0h6LiAqLworI2RlZmluZSBSRUdfSV9PUENMS180S0haKG4pCQkoKG4pICogNiArIDB4MDFjYykKKyNkZWZpbmUgUkVHX0lfTUlOX09VVFJBVEVfNEtIWihuKQkoKG4pICogNiArIDB4MDFjZSkKKyNkZWZpbmUgUkVHX0lfTUFYX09VVFJBVEVfNEtIWihuKQkoKG4pICogNiArIDB4MDFkMCkKKyNkZWZpbmUgIFNZU19QTExfT1VUX0ZSRVEJCSg0ODAwMDAwMCAvIDQwMDApCisjZGVmaW5lICBQQ0xLX0ZSRVFfTUlOCQkJKDI0MDAwMDAwIC8gNDAwMCkKKyNkZWZpbmUgIFBDTEtfRlJFUV9NQVgJCQkoNDgwMDAwMDAgLyA0MDAwKQorI2RlZmluZSBSRUdfSV9JTklUX1BBUkFNU19VUERBVEVECTB4MDFlMAorI2RlZmluZSBSRUdfSV9FUlJPUl9JTkZPCQkweDAxZTIKKworLyogR2VuZXJhbCBwdXJwb3NlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUkVHX1VTRVJfQlJJR0hUTkVTUwkJMHgwMWU0CisjZGVmaW5lIFJFR19VU0VSX0NPTlRSQVNUCQkweDAxZTYKKyNkZWZpbmUgUkVHX1VTRVJfU0FUVVJBVElPTgkJMHgwMWU4CisjZGVmaW5lIFJFR19VU0VSX1NIQVJQQkxVUgkJMHgwMWVhCisKKyNkZWZpbmUgUkVHX0dfU1BFQ19FRkZFQ1RTCQkweDAxZWUKKyNkZWZpbmUgUkVHX0dfRU5BQkxFX1BSRVYJCTB4MDFmMAorI2RlZmluZSBSRUdfR19FTkFCTEVfUFJFVl9DSEcJCTB4MDFmMgorI2RlZmluZSBSRUdfR19ORVdfQ0ZHX1NZTkMJCTB4MDFmOAorI2RlZmluZSBSRUdfR19QUkVWWk9PTV9JTl9XSURUSAkJMHgwMjBhCisjZGVmaW5lIFJFR19HX1BSRVZaT09NX0lOX0hFSUdIVAkweDAyMGMKKyNkZWZpbmUgUkVHX0dfUFJFVlpPT01fSU5fWE9GRlMJCTB4MDIwZQorI2RlZmluZSBSRUdfR19QUkVWWk9PTV9JTl9ZT0ZGUwkJMHgwMjEwCisjZGVmaW5lIFJFR19HX0lOUFVUU19DSEFOR0VfUkVRCQkweDAyMWEKKyNkZWZpbmUgUkVHX0dfQUNUSVZFX1BSRVZfQ0ZHCQkweDAyMWMKKyNkZWZpbmUgUkVHX0dfUFJFVl9DRkdfQ0hHCQkweDAyMWUKKyNkZWZpbmUgUkVHX0dfUFJFVl9PUEVOX0FGVEVSX0NICTB4MDIyMAorI2RlZmluZSBSRUdfR19QUkVWX0NGR19FUlJPUgkJMHgwMjIyCisKKy8qIFByZXZpZXcgY29udHJvbCBzZWN0aW9uLiBuID0gMC4uLjQuICovCisjZGVmaW5lIFBSRUcobiwgeCkJCQkoKG4pICogMHgyNiArIHgpCisjZGVmaW5lIFJFR19QX09VVF9XSURUSChuKQkJUFJFRyhuLCAweDAyNDIpCisjZGVmaW5lIFJFR19QX09VVF9IRUlHSFQobikJCVBSRUcobiwgMHgwMjQ0KQorI2RlZmluZSBSRUdfUF9GTVQobikJCQlQUkVHKG4sIDB4MDI0NikKKyNkZWZpbmUgUkVHX1BfTUFYX09VVF9SQVRFKG4pCQlQUkVHKG4sIDB4MDI0OCkKKyNkZWZpbmUgUkVHX1BfTUlOX09VVF9SQVRFKG4pCQlQUkVHKG4sIDB4MDI0YSkKKyNkZWZpbmUgUkVHX1BfUFZJX01BU0sobikJCVBSRUcobiwgMHgwMjRjKQorI2RlZmluZSBSRUdfUF9DTEtfSU5ERVgobikJCVBSRUcobiwgMHgwMjRlKQorI2RlZmluZSBSRUdfUF9GUl9SQVRFX1RZUEUobikJCVBSRUcobiwgMHgwMjUwKQorI2RlZmluZSAgRlJfUkFURV9EWU5BTUlDCQkwCisjZGVmaW5lICBGUl9SQVRFX0ZJWEVECQkJMQorI2RlZmluZSAgRlJfUkFURV9GSVhFRF9BQ0NVUkFURQkJMgorI2RlZmluZSBSRUdfUF9GUl9SQVRFX1FfVFlQRShuKQkJUFJFRyhuLCAweDAyNTIpCisjZGVmaW5lICBGUl9SQVRFX1FfQkVTVF9GUlJBVEUJCTEgLyogQmlubmluZyBlbmFibGVkICovCisjZGVmaW5lICBGUl9SQVRFX1FfQkVTVF9RVUFMSVRZCQkyIC8qIEJpbm5pbmcgZGlzYWJsZWQgKi8KKy8qIEZyYW1lIHBlcmlvZCBpbiAwLjEgbXMgdW5pdHMgKi8KKyNkZWZpbmUgUkVHX1BfTUFYX0ZSX1RJTUUobikJCVBSRUcobiwgMHgwMjU0KQorI2RlZmluZSBSRUdfUF9NSU5fRlJfVElNRShuKQkJUFJFRyhuLCAweDAyNTYpCisvKiBDb252ZXJzaW9uIHRvIFJFR19QX1tNQVgvTUlOXV9GUl9USU1FIHZhbHVlOyBfX3Q6IHRpbWUgaW4gdXMgKi8KKyNkZWZpbmUgIFVTX1RPX0ZSX1RJTUUoX190KQkJKChfX3QpIC8gMTAwKQorI2RlZmluZSAgUzVLNkFBX01JTl9GUl9USU1FCQkzMzMwMCAgLyogdXMgKi8KKyNkZWZpbmUgIFM1SzZBQV9NQVhfRlJfVElNRQkJNjUwMDAwIC8qIHVzICovCisjZGVmaW5lICBTNUs2QUFfTUFYX0hJR0hSRVNfRlJfVElNRQk2NjYgICAgLyogeDEwMCB1cyAqLworLyogVGhlIGJlbG93IDUgcmVnaXN0ZXJzIGFyZSBmb3IgImRldmljZSBjb3JyZWN0aW9uIiB2YWx1ZXMgKi8KKyNkZWZpbmUgUkVHX1BfQ09MT1JURU1QKG4pCQlQUkVHKG4sIDB4MDI1ZSkKKyNkZWZpbmUgUkVHX1BfUFJFVl9NSVJST1IobikJCVBSRUcobiwgMHgwMjYyKQorCisvKiBFeHRlbmRlZCBpbWFnZSBwcm9wZXJ0eSBjb250cm9scyAqLworLyogRXhwb3N1cmUgdGltZSBpbiAxMCB1cyB1bml0cyAqLworI2RlZmluZSBSRUdfU0ZfVVNSX0VYUE9TVVJFX0wJCTB4MDNjNgorI2RlZmluZSBSRUdfU0ZfVVNSX0VYUE9TVVJFX0gJCTB4MDNjOAorI2RlZmluZSBSRUdfU0ZfVVNSX0VYUE9TVVJFX0NIRwkJMHgwM2NhCisjZGVmaW5lIFJFR19TRl9VU1JfVE9UX0dBSU4JCTB4MDNjYworI2RlZmluZSBSRUdfU0ZfVVNSX1RPVF9HQUlOX0NIRwkJMHgwM2NlCisjZGVmaW5lIFJFR19TRl9SR0FJTgkJCTB4MDNkMAorI2RlZmluZSBSRUdfU0ZfUkdBSU5fQ0hHCQkweDAzZDIKKyNkZWZpbmUgUkVHX1NGX0dHQUlOCQkJMHgwM2Q0CisjZGVmaW5lIFJFR19TRl9HR0FJTl9DSEcJCTB4MDNkNgorI2RlZmluZSBSRUdfU0ZfQkdBSU4JCQkweDAzZDgKKyNkZWZpbmUgUkVHX1NGX0JHQUlOX0NIRwkJMHgwM2RhCisjZGVmaW5lIFJFR19TRl9GTElDS0VSX1FVQU5UCQkweDAzZGMKKyNkZWZpbmUgUkVHX1NGX0ZMSUNLRVJfUVVBTlRfQ0hHCTB4MDNkZQorCisvKiBPdXRwdXQgaW50ZXJmYWNlIChwYXJhbGxlbC9NSVBJKSBzZXR1cCAqLworI2RlZmluZSBSRUdfT0lGX0VOX01JUElfTEFORVMJCTB4MDNmYQorI2RlZmluZSBSRUdfT0lGX0VOX1BBQ0tFVFMJCTB4MDNmYworI2RlZmluZSBSRUdfT0lGX0NGR19DSEcJCQkweDAzZmUKKworLyogQXV0by1hbGdvcml0aG1zIGVuYWJsZSBtYXNrICovCisjZGVmaW5lIFJFR19EQkdfQVVUT0FMR19FTgkJMHgwNDAwCisjZGVmaW5lICBBQUxHX0FMTF9FTl9NQVNLCQkoMSA8PCAwKQorI2RlZmluZSAgQUFMR19BRV9FTl9NQVNLCQkoMSA8PCAxKQorI2RlZmluZSAgQUFMR19ESVZMRUlfRU5fTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgIEFBTEdfV0JfRU5fTUFTSwkJKDEgPDwgMykKKyNkZWZpbmUgIEFBTEdfRkxJQ0tFUl9FTl9NQVNLCQkoMSA8PCA1KQorI2RlZmluZSAgQUFMR19GSVRfRU5fTUFTSwkJKDEgPDwgNikKKyNkZWZpbmUgIEFBTEdfV1JIV19FTl9NQVNLCQkoMSA8PCA3KQorCisvKiBGaXJtd2FyZSByZXZpc2lvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBSRUdfRldfQVBJVkVSCQkJMHgwMTJlCisjZGVmaW5lICBTNUs2QUFGWF9GV19BUElWRVIJCTB4MDAwMQorI2RlZmluZSBSRUdfRldfUkVWSVNJT04JCQkweDAxMzAKKworLyogRm9yIG5vdyB3ZSB1c2Ugb25seSBvbmUgdXNlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHNldCAqLworI2RlZmluZSBTNUs2QUFfTUFYX1BSRVNFVFMJCTEKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzNWs2YWFfc3VwcGx5X25hbWVzW10gPSB7CisJInZkZF9jb3JlIiwJLyogRGlnaXRhbCBjb3JlIHN1cHBseSAxLjVWICgxLjRWIHRvIDEuNlYpICovCisJInZkZGEiLAkJLyogQW5hbG9nIHBvd2VyIHN1cHBseSAyLjhWICgyLjZWIHRvIDMuMFYpICovCisJInZkZF9yZWciLAkvKiBSZWd1bGF0b3IgaW5wdXQgcG93ZXIgMS44ViAoMS43ViB0byAxLjlWKQorCQkJICAgb3IgMi44ViAoMi42ViB0byAzLjApICovCisJInZkZGlvIiwJLyogSS9PIHN1cHBseSAxLjhWICgxLjY1ViB0byAxLjk1VikKKwkJCSAgIG9yIDIuOFYgKDIuNVYgdG8gMy4xVikgKi8KK307CisjZGVmaW5lIFM1SzZBQV9OVU1fU1VQUExJRVMgQVJSQVlfU0laRShzNWs2YWFfc3VwcGx5X25hbWVzKQorCitlbnVtIHM1azZhYV9ncGlvX2lkIHsKKwlTVEJZLAorCVJTVCwKKwlHUElPX05VTSwKK307CisKK3N0cnVjdCBzNWs2YWFfcmVndmFsIHsKKwl1MTYgYWRkcjsKKwl1MTYgdmFsOworfTsKKworc3RydWN0IHM1azZhYV9waXhmbXQgeworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOworCXUzMiBjb2xvcnNwYWNlOworCS8qIFJFR19QX0ZNVCh4KSByZWdpc3RlciB2YWx1ZSAqLworCXUxNiByZWdfcF9mbXQ7Cit9OworCitzdHJ1Y3QgczVrNmFhX3ByZXNldCB7CisJLyogb3V0cHV0IHBpeGVsIGZvcm1hdCBhbmQgcmVzb2x1dGlvbiAqLworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CisJdTggY2xrX2lkOworCXU4IGluZGV4OworfTsKKworc3RydWN0IHM1azZhYV9jdHJscyB7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGhhbmRsZXI7CisJLyogQXV0byAvIG1hbnVhbCB3aGl0ZSBiYWxhbmNlIGNsdXN0ZXIgKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsICphd2I7CisJc3RydWN0IHY0bDJfY3RybCAqZ2Fpbl9yZWQ7CisJc3RydWN0IHY0bDJfY3RybCAqZ2Fpbl9ibHVlOworCXN0cnVjdCB2NGwyX2N0cmwgKmdhaW5fZ3JlZW47CisJLyogTWlycm9yIGNsdXN0ZXIgKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsICpoZmxpcDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICp2ZmxpcDsKKwkvKiBBdXRvIGV4cG9zdXJlIC8gbWFudWFsIGV4cG9zdXJlIGFuZCBnYWluIGNsdXN0ZXIgKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsICphdXRvX2V4cDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpleHBvc3VyZTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpnYWluOworfTsKKworc3RydWN0IHM1azZhYV9pbnRlcnZhbCB7CisJdTE2IHJlZ19mcl90aW1lOworCXN0cnVjdCB2NGwyX2ZyYWN0IGludGVydmFsOworCS8qIE1heGltdW0gcmVjdGFuZ2xlIGZvciB0aGUgaW50ZXJ2YWwgKi8KKwlzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlIHNpemU7Cit9OworCitzdHJ1Y3QgczVrNmFhIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisJc3RydWN0IG1lZGlhX3BhZCBwYWQ7CisKKwllbnVtIHY0bDJfbWJ1c190eXBlIGJ1c190eXBlOworCXU4IG1pcGlfbGFuZXM7CisKKwlpbnQgKCpzX3Bvd2VyKShpbnQgZW5hYmxlKTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tTNUs2QUFfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3QgczVrNmFhX2dwaW8gZ3Bpb1tHUElPX05VTV07CisKKwkvKiBleHRlcm5hbCBtYXN0ZXIgY2xvY2sgZnJlcXVlbmN5ICovCisJdW5zaWduZWQgbG9uZyBtY2xrX2ZyZXF1ZW5jeTsKKwkvKiBJU1AgaW50ZXJuYWwgbWFzdGVyIGNsb2NrIGZyZXF1ZW5jeSAqLworCXUxNiBjbGtfZm9wOworCS8qIG91dHB1dCBwaXhlbCBjbG9jayBmcmVxdWVuY3kgcmFuZ2UgKi8KKwl1MTYgcGNsa19mbWluOworCXUxNiBwY2xrX2ZtYXg7CisKKwl1bnNpZ25lZCBpbnQgaW52X2hmbGlwOjE7CisJdW5zaWduZWQgaW50IGludl92ZmxpcDoxOworCisJLyogcHJvdGVjdHMgdGhlIHN0cnVjdCBtZW1iZXJzIGJlbG93ICovCisJc3RydWN0IG11dGV4IGxvY2s7CisKKwkvKiBzZW5zb3IgbWF0cml4IHNjYW4gd2luZG93ICovCisJc3RydWN0IHY0bDJfcmVjdCBjY2RfcmVjdDsKKworCXN0cnVjdCBzNWs2YWFfY3RybHMgY3RybHM7CisJc3RydWN0IHM1azZhYV9wcmVzZXQgcHJlc2V0c1tTNUs2QUFfTUFYX1BSRVNFVFNdOworCXN0cnVjdCBzNWs2YWFfcHJlc2V0ICpwcmVzZXQ7CisJY29uc3Qgc3RydWN0IHM1azZhYV9pbnRlcnZhbCAqZml2OworCisJdW5zaWduZWQgaW50IHN0cmVhbWluZzoxOworCXVuc2lnbmVkIGludCBhcHBseV9jZmc6MTsKKwl1bnNpZ25lZCBpbnQgYXBwbHlfY3JvcDoxOworCXVuc2lnbmVkIGludCBwb3dlcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgczVrNmFhX3JlZ3ZhbCBzNWs2YWFfYW5hbG9nX2NvbmZpZ1tdID0geworCS8qIEFuYWxvZyBzZXR0aW5ncyAqLworCXsgMHgxMTJhLCAweDAwMDAgfSwgeyAweDExMzIsIDB4MDAwMCB9LAorCXsgMHgxMTNlLCAweDAwMDAgfSwgeyAweDExNWMsIDB4MDAwMCB9LAorCXsgMHgxMTY0LCAweDAwMDAgfSwgeyAweDExNzQsIDB4MDAwMCB9LAorCXsgMHgxMTc4LCAweDAwMDAgfSwgeyAweDA3N2EsIDB4MDAwMCB9LAorCXsgMHgwNzdjLCAweDAwMDAgfSwgeyAweDA3N2UsIDB4MDAwMCB9LAorCXsgMHgwNzgwLCAweDAwMDAgfSwgeyAweDA3ODIsIDB4MDAwMCB9LAorCXsgMHgwNzg0LCAweDAwMDAgfSwgeyAweDA3ODYsIDB4MDAwMCB9LAorCXsgMHgwNzg4LCAweDAwMDAgfSwgeyAweDA3YTIsIDB4MDAwMCB9LAorCXsgMHgwN2E0LCAweDAwMDAgfSwgeyAweDA3YTYsIDB4MDAwMCB9LAorCXsgMHgwN2E4LCAweDAwMDAgfSwgeyAweDA3YjYsIDB4MDAwMCB9LAorCXsgMHgwN2I4LCAweDAwMDIgfSwgeyAweDA3YmEsIDB4MDAwNCB9LAorCXsgMHgwN2JjLCAweDAwMDQgfSwgeyAweDA3YmUsIDB4MDAwNSB9LAorCXsgMHgwN2MwLCAweDAwMDUgfSwgeyBTNUs2QUFfVEVSTSwgMCB9LAorfTsKKworLyogVE9ETzogQWRkIFJHQjg4OCBhbmQgQmF5ZXIgZm9ybWF0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHM1azZhYV9waXhmbXQgczVrNmFhX2Zvcm1hdHNbXSA9IHsKKwl7IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LAlWNEwyX0NPTE9SU1BBQ0VfSlBFRywJNSB9LAorCS8qIHJhbmdlIDE2LTI0MCAqLworCXsgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCVY0TDJfQ09MT1JTUEFDRV9SRUM3MDksCTYgfSwKKwl7IFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9CRSwJVjRMMl9DT0xPUlNQQUNFX0pQRUcsCTAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgczVrNmFhX2ludGVydmFsIHM1azZhYV9pbnRlcnZhbHNbXSA9IHsKKwl7IDEwMDAsIHsxMDAwMCwgMTAwMDAwMH0sIHsxMjgwLCAxMDI0fSB9LCAvKiAxMCBmcHMgKi8KKwl7IDY2NiwgIHsxNTAwMCwgMTAwMDAwMH0sIHsxMjgwLCAxMDI0fSB9LCAvKiAxNSBmcHMgKi8KKwl7IDUwMCwgIHsyMDAwMCwgMTAwMDAwMH0sIHsxMjgwLCA3MjB9IH0sICAvKiAyMCBmcHMgKi8KKwl7IDQwMCwgIHsyNTAwMCwgMTAwMDAwMH0sIHs2NDAsIDQ4MH0gfSwgICAvKiAyNSBmcHMgKi8KKwl7IDMzMywgIHszMzMwMCwgMTAwMDAwMH0sIHs2NDAsIDQ4MH0gfSwgICAvKiAzMCBmcHMgKi8KK307CisKKyNkZWZpbmUgUzVLNkFBX0lOVEVSVkFMX0RFRl9JTkRFWCAxIC8qIDE1IGZwcyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqY3RybF90b19zZChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXJldHVybiAmY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBzNWs2YWEsIGN0cmxzLmhhbmRsZXIpLT5zZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgczVrNmFhICp0b19zNWs2YWEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgczVrNmFhLCBzZCk7Cit9CisKKy8qIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgYWxsIHByZXZpZXcgcHJlc2V0cyAqLworc3RhdGljIHZvaWQgczVrNmFhX3ByZXNldHNfZGF0YV9pbml0KHN0cnVjdCBzNWs2YWEgKnM1azZhYSkKK3sKKwlzdHJ1Y3QgczVrNmFhX3ByZXNldCAqcHJlc2V0ID0gJnM1azZhYS0+cHJlc2V0c1swXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTNUs2QUFfTUFYX1BSRVNFVFM7IGkrKykgeworCQlwcmVzZXQtPm1idXNfZm10LndpZHRoCT0gUzVLNkFBX09VVF9XSURUSF9ERUY7CisJCXByZXNldC0+bWJ1c19mbXQuaGVpZ2h0CT0gUzVLNkFBX09VVF9IRUlHSFRfREVGOworCQlwcmVzZXQtPm1idXNfZm10LmNvZGUJPSBzNWs2YWFfZm9ybWF0c1swXS5jb2RlOworCQlwcmVzZXQtPmluZGV4CQk9IGk7CisJCXByZXNldC0+Y2xrX2lkCQk9IDA7CisJCXByZXNldCsrOworCX0KKworCXM1azZhYS0+Zml2ID0gJnM1azZhYV9pbnRlcnZhbHNbUzVLNkFBX0lOVEVSVkFMX0RFRl9JTkRFWF07CisJczVrNmFhLT5wcmVzZXQgPSAmczVrNmFhLT5wcmVzZXRzWzBdOworfQorCitzdGF0aWMgaW50IHM1azZhYV9pMmNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTE2ICp2YWwpCit7CisJdTggd2J1ZlsyXSA9IHthZGRyID4+IDgsIGFkZHIgJiAweEZGfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CisJdTggcmJ1ZlsyXTsKKwlpbnQgcmV0OworCisJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CisJbXNnWzBdLmZsYWdzID0gMDsKKwltc2dbMF0ubGVuID0gMjsKKwltc2dbMF0uYnVmID0gd2J1ZjsKKworCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSAyOworCW1zZ1sxXS5idWYgPSByYnVmOworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwkqdmFsID0gYmUxNl90b19jcHUoKigodTE2ICopcmJ1ZikpOworCisJdjRsMl9kYmcoMywgZGVidWcsIGNsaWVudCwgImkyY19yZWFkOiAweCUwNFggOiAweCUwNHhcbiIsIGFkZHIsICp2YWwpOworCisJcmV0dXJuIHJldCA9PSAyID8gMCA6IHJldDsKK30KKworc3RhdGljIGludCBzNWs2YWFfaTJjX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1MTYgdmFsKQoreworCXU4IGJ1Zls0XSA9IHthZGRyID4+IDgsIGFkZHIgJiAweEZGLCB2YWwgPj4gOCwgdmFsICYgMHhGRn07CisKKwlpbnQgcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCA0KTsKKwl2NGwyX2RiZygzLCBkZWJ1ZywgY2xpZW50LCAiaTJjX3dyaXRlOiAweCUwNFggOiAweCUwNHhcbiIsIGFkZHIsIHZhbCk7CisKKwlyZXR1cm4gcmV0ID09IDQgPyAwIDogcmV0OworfQorCisvKiBUaGUgY29tbWFuZCByZWdpc3RlciB3cml0ZSwgYXNzdW1lcyBDb21tYW5kX1dyX2FkZEggPSAweDcwMDAuICovCitzdGF0aWMgaW50IHM1azZhYV93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdTE2IGFkZHIsIHUxNiB2YWwpCit7CisJaW50IHJldCA9IHM1azZhYV9pMmNfd3JpdGUoYywgUkVHX0NNRFdSX0FERFJMLCBhZGRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzNWs2YWFfaTJjX3dyaXRlKGMsIFJFR19DTURCVUYwX0FERFIsIHZhbCk7Cit9CisKKy8qIFRoZSBjb21tYW5kIHJlZ2lzdGVyIHJlYWQsIGFzc3VtZXMgQ29tbWFuZF9SZF9hZGRIID0gMHg3MDAwLiAqLworc3RhdGljIGludCBzNWs2YWFfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTE2ICp2YWwpCit7CisJaW50IHJldCA9IHM1azZhYV9pMmNfd3JpdGUoY2xpZW50LCBSRUdfQ01EUkRfQUREUkwsIGFkZHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHM1azZhYV9pMmNfcmVhZChjbGllbnQsIFJFR19DTURCVUYwX0FERFIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3dyaXRlX2FycmF5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgczVrNmFhX3JlZ3ZhbCAqbXNnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwl1MTYgYWRkcl9pbmNyID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlIChtc2ctPmFkZHIgIT0gUzVLNkFBX1RFUk0pIHsKKwkJaWYgKGFkZHJfaW5jciAhPSAyKQorCQkJcmV0ID0gczVrNmFhX2kyY193cml0ZShjbGllbnQsIFJFR19DTURXUl9BRERSTCwKKwkJCQkJICAgICAgIG1zZy0+YWRkcik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcmV0ID0gczVrNmFhX2kyY193cml0ZShjbGllbnQsIFJFR19DTURCVUYwX0FERFIsIG1zZy0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQkvKiBBc3N1bWUgdGhhdCBtc2ctPmFkZHIgaXMgYWx3YXlzIGxlc3MgdGhhbiAweGZmZmMgKi8KKwkJYWRkcl9pbmNyID0gKG1zZyArIDEpLT5hZGRyIC0gbXNnLT5hZGRyOworCQltc2crKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb25maWd1cmUgdGhlIEFIQiBoaWdoIGFkZHJlc3MgYnl0ZXMgZm9yIEdURyByZWdpc3RlcnMgYWNjZXNzICovCitzdGF0aWMgaW50IHM1azZhYV9zZXRfYWhiX2FkZHJlc3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gczVrNmFhX2kyY193cml0ZShjbGllbnQsIEFIQl9NU0JfQUREUl9QVFIsIEdFTl9SRUdfT0ZGU0gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gczVrNmFhX2kyY193cml0ZShjbGllbnQsIFJFR19DTURSRF9BRERSSCwgSE9TVF9TV0lGX09GRlNIKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzNWs2YWFfaTJjX3dyaXRlKGNsaWVudCwgUkVHX0NNRFdSX0FERFJILCBIT1NUX1NXSUZfT0ZGU0gpOworfQorCisvKioKKyAqIHM1azZhYV9jb25maWd1cmVfcGl4ZWxfY2xvY2sgLSBhcHBseSBJU1AgbWFpbiBjbG9jay9QTEwgY29uZmlndXJhdGlvbgorICoKKyAqIENvbmZpZ3VyZSB0aGUgaW50ZXJuYWwgSVNQIFBMTCBmb3IgdGhlIHJlcXVpcmVkIG91dHB1dCBmcmVxdWVuY3kuCisgKiBMb2NraW5nOiBjYWxsZWQgd2l0aCBzNWs2YWEubG9jayBtdXRleCBoZWxkLgorICovCitzdGF0aWMgaW50IHM1azZhYV9jb25maWd1cmVfcGl4ZWxfY2xvY2tzKHN0cnVjdCBzNWs2YWEgKnM1azZhYSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXVuc2lnbmVkIGxvbmcgZm1jbGsgPSBzNWs2YWEtPm1jbGtfZnJlcXVlbmN5IC8gMTAwMDsKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlpZiAoV0FSTihmbWNsayA8IE1JTl9NQ0xLX0ZSRVFfS0haIHx8IGZtY2xrID4gTUFYX01DTEtfRlJFUV9LSFosCisJCSAiSW52YWxpZCBjbG9jayBmcmVxdWVuY3k6ICVsZFxuIiwgZm1jbGspKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXM1azZhYS0+cGNsa19mbWluID0gUENMS19GUkVRX01JTjsKKwlzNWs2YWEtPnBjbGtfZm1heCA9IFBDTEtfRlJFUV9NQVg7CisJczVrNmFhLT5jbGtfZm9wID0gU1lTX1BMTF9PVVRfRlJFUTsKKworCS8qIEV4dGVybmFsIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHogKi8KKwlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0lfSU5DTEtfRlJFUV9ILCBmbWNsayA+PiAxNik7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfSV9JTkNMS19GUkVRX0wsIGZtY2xrICYgMHhGRkZGKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19JX1VTRV9OUFZJX0NMT0NLUywgMSk7CisJLyogSW50ZXJuYWwgUExMIGZyZXF1ZW5jeSAqLworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0lfT1BDTEtfNEtIWigwKSwgczVrNmFhLT5jbGtfZm9wKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19JX01JTl9PVVRSQVRFXzRLSFooMCksCisJCQkJICAgczVrNmFhLT5wY2xrX2ZtaW4pOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0lfTUFYX09VVFJBVEVfNEtIWigwKSwKKwkJCQkgICBzNWs2YWEtPnBjbGtfZm1heCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfSV9JTklUX1BBUkFNU19VUERBVEVELCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3JlYWQoYywgUkVHX0lfRVJST1JfSU5GTywgJnN0YXR1cyk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogKHN0YXR1cyA/IC1FSU5WQUwgOiAwKTsKK30KKworLyogU2V0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGltYWdlIGZsaXBwaW5nICovCitzdGF0aWMgaW50IHM1azZhYV9zZXRfbWlycm9yKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwgaW50IGhvcml6X2ZsaXApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCWludCBpbmRleCA9IHM1azZhYS0+cHJlc2V0LT5pbmRleDsKKworCXVuc2lnbmVkIGludCB2ZmxpcCA9IHM1azZhYS0+Y3RybHMudmZsaXAtPnZhbCBeIHM1azZhYS0+aW52X3ZmbGlwOworCXVuc2lnbmVkIGludCBmbGlwID0gKGhvcml6X2ZsaXAgXiBzNWs2YWEtPmludl9oZmxpcCkgfCAodmZsaXAgPDwgMSk7CisKKwlyZXR1cm4gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfUFJFVl9NSVJST1IoaW5kZXgpLCBmbGlwKTsKK30KKworLyogQ29uZmlndXJlIGF1dG8vbWFudWFsIHdoaXRlIGJhbGFuY2UgYW5kIFIvRy9CIGdhaW5zICovCitzdGF0aWMgaW50IHM1azZhYV9zZXRfYXdiKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwgaW50IGF3YikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXN0cnVjdCBzNWs2YWFfY3RybHMgKmN0cmxzID0gJnM1azZhYS0+Y3RybHM7CisJdTE2IHJlZzsKKworCWludCByZXQgPSBzNWs2YWFfcmVhZChjLCBSRUdfREJHX0FVVE9BTEdfRU4sICZyZWcpOworCisJaWYgKCFyZXQgJiYgIWF3YikgeworCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX1NGX1JHQUlOLCBjdHJscy0+Z2Fpbl9yZWQtPnZhbCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19TRl9SR0FJTl9DSEcsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX1NGX0dHQUlOLCBjdHJscy0+Z2Fpbl9ncmVlbi0+dmFsKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX1NGX0dHQUlOX0NIRywgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfU0ZfQkdBSU4sIGN0cmxzLT5nYWluX2JsdWUtPnZhbCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gczVrNmFhX3dyaXRlKGMsIFJFR19TRl9CR0FJTl9DSEcsIDEpOworCX0KKwlpZiAoIXJldCkgeworCQlyZWcgPSBhd2IgPyByZWcgfCBBQUxHX1dCX0VOX01BU0sgOiByZWcgJiB+QUFMR19XQl9FTl9NQVNLOworCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0RCR19BVVRPQUxHX0VOLCByZWcpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFByb2dyYW0gRlcgd2l0aCBleHBvc3VyZSB0aW1lLCAnZXhwb3N1cmUnIGluIHVzIHVuaXRzICovCitzdGF0aWMgaW50IHM1azZhYV9zZXRfdXNlcl9leHBvc3VyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZXhwb3N1cmUpCit7CisJdW5zaWduZWQgaW50IHRpbWUgPSBleHBvc3VyZSAvIDEwOworCisJaW50IHJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19TRl9VU1JfRVhQT1NVUkVfTCwgdGltZSAmIDB4ZmZmZik7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19TRl9VU1JfRVhQT1NVUkVfSCwgdGltZSA+PiAxNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1NGX1VTUl9FWFBPU1VSRV9DSEcsIDEpOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfdXNlcl9nYWluKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBnYWluKQoreworCWludCByZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfU0ZfVVNSX1RPVF9HQUlOLCBnYWluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfU0ZfVVNSX1RPVF9HQUlOX0NIRywgMSk7Cit9CisKKy8qIFNldCBhdXRvL21hbnVhbCBleHBvc3VyZSBhbmQgdG90YWwgZ2FpbiAqLworc3RhdGljIGludCBzNWs2YWFfc2V0X2F1dG9fZXhwb3N1cmUoc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwl1bnNpZ25lZCBpbnQgZXhwX3RpbWUgPSBzNWs2YWEtPmN0cmxzLmV4cG9zdXJlLT52YWw7CisJdTE2IGF1dG9fYWxnOworCisJaW50IHJldCA9IHM1azZhYV9yZWFkKGMsIFJFR19EQkdfQVVUT0FMR19FTiwgJmF1dG9fYWxnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsIGMsICJtYW5fZXhwOiAlZCwgYXV0b19leHA6ICVkLCBhX2FsZzogMHgleFxuIiwKKwkJIGV4cF90aW1lLCB2YWx1ZSwgYXV0b19hbGcpOworCisJaWYgKHZhbHVlID09IFY0TDJfRVhQT1NVUkVfQVVUTykgeworCQlhdXRvX2FsZyB8PSBBQUxHX0FFX0VOX01BU0sgfCBBQUxHX0RJVkxFSV9FTl9NQVNLOworCX0gZWxzZSB7CisJCXJldCA9IHM1azZhYV9zZXRfdXNlcl9leHBvc3VyZShjLCBleHBfdGltZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBzNWs2YWFfc2V0X3VzZXJfZ2FpbihjLCBzNWs2YWEtPmN0cmxzLmdhaW4tPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlhdXRvX2FsZyAmPSB+KEFBTEdfQUVfRU5fTUFTSyB8IEFBTEdfRElWTEVJX0VOX01BU0spOworCX0KKworCXJldHVybiBzNWs2YWFfd3JpdGUoYywgUkVHX0RCR19BVVRPQUxHX0VOLCBhdXRvX2FsZyk7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3NldF9hbnRpX2ZsaWNrZXIoc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnM1azZhYS0+c2QpOworCXUxNiBhdXRvX2FsZzsKKwlpbnQgcmV0OworCisJcmV0ID0gczVrNmFhX3JlYWQoY2xpZW50LCBSRUdfREJHX0FVVE9BTEdfRU4sICZhdXRvX2FsZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWx1ZSA9PSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9BVVRPKSB7CisJCWF1dG9fYWxnIHw9IEFBTEdfRkxJQ0tFUl9FTl9NQVNLOworCX0gZWxzZSB7CisJCWF1dG9fYWxnICY9IH5BQUxHX0ZMSUNLRVJfRU5fTUFTSzsKKwkJLyogVGhlIFY0TDJfQ0lEX0xJTkVfRlJFUVVFTkNZIGNvbnRyb2wgdmFsdWVzIG1hdGNoCisJCSAqIHRoZSByZWdpc3RlciB2YWx1ZXMgKi8KKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1NGX0ZMSUNLRVJfUVVBTlQsIHZhbHVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19TRl9GTElDS0VSX1FVQU5UX0NIRywgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfREJHX0FVVE9BTEdfRU4sIGF1dG9fYWxnKTsKK30KKworc3RhdGljIGludCBzNWs2YWFfc2V0X2NvbG9yZngoc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgdmFsKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCBjb2xvcmZ4W10gPSB7CisJCXsgVjRMMl9DT0xPUkZYX05PTkUsCSAwIH0sCisJCXsgVjRMMl9DT0xPUkZYX0JXLAkgMSB9LAorCQl7IFY0TDJfQ09MT1JGWF9ORUdBVElWRSwgMiB9LAorCQl7IFY0TDJfQ09MT1JGWF9TRVBJQSwJIDMgfSwKKwkJeyBWNEwyX0NPTE9SRlhfU0tZX0JMVUUsIDQgfSwKKwkJeyBWNEwyX0NPTE9SRlhfU0tFVENILAkgNSB9LAorCX07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2xvcmZ4KTsgaSsrKSB7CisJCWlmIChjb2xvcmZ4W2ldLmlkID09IHZhbCkKKwkJCXJldHVybiBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19TUEVDX0VGRkVDVFMsCisJCQkJCSAgICBjb2xvcmZ4W2ldLnZhbHVlKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3ByZXZpZXdfY29uZmlnX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXUxNiBlcnJvciA9IDA7CisJaW50IHJldCA9IHM1azZhYV9yZWFkKGNsaWVudCwgUkVHX0dfUFJFVl9DRkdfRVJST1IsICZlcnJvcik7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiZXJyb3I6IDB4JXggKCVkKVxuIiwgZXJyb3IsIHJldCk7CisJcmV0dXJuIHJldCA/IHJldCA6IChlcnJvciA/IC1FSU5WQUwgOiAwKTsKK30KKworc3RhdGljIGludCBzNWs2YWFfZ2V0X3BpeGZtdF9pbmRleChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsCisJCQkJICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNWs2YWFfZm9ybWF0cyk7IGkrKykKKwkJaWYgKG1mLT5jb2xvcnNwYWNlID09IHM1azZhYV9mb3JtYXRzW2ldLmNvbG9yc3BhY2UgJiYKKwkJICAgIG1mLT5jb2RlID09IHM1azZhYV9mb3JtYXRzW2ldLmNvZGUpCisJCQlyZXR1cm4gaTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWs2YWFfc2V0X291dHB1dF9mcmFtZWZtdChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsCisJCQkJICAgICAgc3RydWN0IHM1azZhYV9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJaW50IGZtdF9pbmRleCA9IHM1azZhYV9nZXRfcGl4Zm10X2luZGV4KHM1azZhYSwgJnByZXNldC0+bWJ1c19mbXQpOworCWludCByZXQ7CisKKwlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9PVVRfV0lEVEgocHJlc2V0LT5pbmRleCksCisJCQkgICBwcmVzZXQtPm1idXNfZm10LndpZHRoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfT1VUX0hFSUdIVChwcmVzZXQtPmluZGV4KSwKKwkJCQkgICBwcmVzZXQtPm1idXNfZm10LmhlaWdodCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX0ZNVChwcmVzZXQtPmluZGV4KSwKKwkJCQkgICBzNWs2YWFfZm9ybWF0c1tmbXRfaW5kZXhdLnJlZ19wX2ZtdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs2YWFfc2V0X2lucHV0X3BhcmFtcyhzdHJ1Y3QgczVrNmFhICpzNWs2YWEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyID0gJnM1azZhYS0+Y2NkX3JlY3Q7CisJaW50IHJldDsKKworCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfR19QUkVWWk9PTV9JTl9XSURUSCwgci0+d2lkdGgpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0dfUFJFVlpPT01fSU5fSEVJR0hULCByLT5oZWlnaHQpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0dfUFJFVlpPT01fSU5fWE9GRlMsIHItPmxlZnQpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoYywgUkVHX0dfUFJFVlpPT01fSU5fWU9GRlMsIHItPnRvcCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjLCBSRUdfR19JTlBVVFNfQ0hBTkdFX1JFUSwgMSk7CisJaWYgKCFyZXQpCisJCXM1azZhYS0+YXBwbHlfY3JvcCA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHM1azZhYV9jb25maWd1cmVfdmlkZW9fYnVzIC0gY29uZmlndXJlIHRoZSB2aWRlbyBvdXRwdXQgaW50ZXJmYWNlCisgKiBAYnVzX3R5cGU6IHZpZGVvIGJ1cyB0eXBlOiBwYXJhbGxlbCBvciBNSVBJLUNTSQorICogQG5sYW5lczogbnVtYmVyIG9mIE1JUEkgbGFuZXMgdG8gYmUgdXNlZCAoTUlQSS1DU0kgb25seSkKKyAqCisgKiBOb3RlOiBPbmx5IHBhcmFsbGVsIGJ1cyBvcGVyYXRpb24gaGFzIGJlZW4gdGVzdGVkLgorICovCitzdGF0aWMgaW50IHM1azZhYV9jb25maWd1cmVfdmlkZW9fYnVzKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgICAgICBlbnVtIHY0bDJfbWJ1c190eXBlIGJ1c190eXBlLCBpbnQgbmxhbmVzKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwl1MTYgY2ZnID0gMDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBUT0RPOiBUaGUgc2Vuc29yIGlzIHN1cHBvc2VkIHRvIHN1cHBvcnQgQlQuNjAxIGFuZCBCVC42NTYKKwkgKiBidXQgdGhlcmUgaXMgbm90aGluZyBpbmRpY2F0aW5nIGhvdyB0byBzd2l0Y2ggYmV0d2VlbiBib3RoCisJICogaW4gdGhlIGRhdGFzaGVldC4gRm9yIG5vdyBkZWZhdWx0IEJULjYwMSBpbnRlcmZhY2UgaXMgYXNzdW1lZC4KKwkgKi8KKwlpZiAoYnVzX3R5cGUgPT0gVjRMMl9NQlVTX0NTSTIpCisJCWNmZyA9IG5sYW5lczsKKwllbHNlIGlmIChidXNfdHlwZSAhPSBWNEwyX01CVVNfUEFSQUxMRUwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX09JRl9FTl9NSVBJX0xBTkVTLCBjZmcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHM1azZhYV93cml0ZShjbGllbnQsIFJFR19PSUZfQ0ZHX0NIRywgMSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHN3aXRjaGluZyB0byBuZXcgdXNlciBjb25maWd1cmF0aW9uIHNldCovCitzdGF0aWMgaW50IHM1azZhYV9uZXdfY29uZmlnX3N5bmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHRpbWVvdXQsCisJCQkJICBpbnQgY2lkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJdTE2IHJlZyA9IDE7CisJaW50IHJldDsKKworCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19HX0FDVElWRV9QUkVWX0NGRywgY2lkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX0dfUFJFVl9DRkdfQ0hHLCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX0dfTkVXX0NGR19TWU5DLCAxKTsKKwlpZiAodGltZW91dCA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKHJldCA+PSAwICYmIHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhlbmQpKSB7CisJCXJldCA9IHM1azZhYV9yZWFkKGNsaWVudCwgUkVHX0dfTkVXX0NGR19TWU5DLCAmcmVnKTsKKwkJaWYgKCFyZWcpCisJCQlyZXR1cm4gMDsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDUwMDApOworCX0KKwlyZXR1cm4gcmV0ID8gcmV0IDogLUVUSU1FRE9VVDsKK30KKworLyoqCisgKiBzNWs2YWFfc2V0X3ByZXZfY29uZmlnIC0gd3JpdGUgdXNlciBwcmV2aWV3IHJlZ2lzdGVyIHNldAorICoKKyAqIENvbmZpZ3VyZSBvdXRwdXQgcmVzb2x1dGlvbiBhbmQgY29sb3IgZnJvbWF0LCBwaXhlbCBjbG9jaworICogZnJlcXVlbmN5IHJhbmdlLCBkZXZpY2UgZnJhbWUgcmF0ZSB0eXBlIGFuZCBmcmFtZSBwZXJpb2QgcmFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF9wcmV2X2NvbmZpZyhzdHJ1Y3QgczVrNmFhICpzNWs2YWEsCisJCQkJICBzdHJ1Y3QgczVrNmFhX3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwlpbnQgaWR4ID0gcHJlc2V0LT5pbmRleDsKKwl1MTYgZnJhbWVfcmF0ZV9xOworCWludCByZXQ7CisKKwlpZiAoczVrNmFhLT5maXYtPnJlZ19mcl90aW1lID49IFM1SzZBQV9NQVhfSElHSFJFU19GUl9USU1FKQorCQlmcmFtZV9yYXRlX3EgPSBGUl9SQVRFX1FfQkVTVF9GUlJBVEU7CisJZWxzZQorCQlmcmFtZV9yYXRlX3EgPSBGUl9SQVRFX1FfQkVTVF9RVUFMSVRZOworCisJcmV0ID0gczVrNmFhX3NldF9vdXRwdXRfZnJhbWVmbXQoczVrNmFhLCBwcmVzZXQpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9NQVhfT1VUX1JBVEUoaWR4KSwKKwkJCQkgICBzNWs2YWEtPnBjbGtfZm1heCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX01JTl9PVVRfUkFURShpZHgpLAorCQkJCSAgIHM1azZhYS0+cGNsa19mbWluKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX1BfQ0xLX0lOREVYKGlkeCksCisJCQkJICAgcHJlc2V0LT5jbGtfaWQpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9GUl9SQVRFX1RZUEUoaWR4KSwKKwkJCQkgICBGUl9SQVRFX0RZTkFNSUMpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9GUl9SQVRFX1FfVFlQRShpZHgpLAorCQkJCSAgIGZyYW1lX3JhdGVfcSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19QX01BWF9GUl9USU1FKGlkeCksCisJCQkJICAgczVrNmFhLT5maXYtPnJlZ19mcl90aW1lICsgMzMpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9NSU5fRlJfVElNRShpZHgpLAorCQkJCSAgIHM1azZhYS0+Zml2LT5yZWdfZnJfdGltZSAtIDMzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX25ld19jb25maWdfc3luYyhjbGllbnQsIDI1MCwgaWR4KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3ByZXZpZXdfY29uZmlnX3N0YXR1cyhjbGllbnQpOworCWlmICghcmV0KQorCQlzNWs2YWEtPmFwcGx5X2NmZyA9IDA7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAiRnJhbWUgaW50ZXJ2YWw6ICVkICsvLSAzLjNtcy4gKCVkKVxuIiwKKwkJIHM1azZhYS0+Zml2LT5yZWdfZnJfdGltZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHM1azZhYV9pbml0aWFsaXplX2lzcCAtIGJhc2ljIElTUCBNQ1UgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb25maWd1cmUgQUhCIGFkZHJlc3NlcyBmb3IgcmVnaXN0ZXJzIHJlYWQvd3JpdGU7IGNvbmZpZ3VyZSBQTExzIGZvcgorICogcmVxdWlyZWQgb3V0cHV0IHBpeGVsIGNsb2NrLiBUaGUgSVNQIHBvd2VyIHN1cHBseSBuZWVkcyB0byBiZSBhbHJlYWR5CisgKiBlbmFibGVkLCB3aXRoIGFuIG9wdGlvbmFsIEgvVyByZXNldC4KKyAqIExvY2tpbmc6IGNhbGxlZCB3aXRoIHM1azZhYS5sb2NrIG11dGV4IGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX2luaXRpYWxpemVfaXNwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJaW50IHJldDsKKworCXM1azZhYS0+YXBwbHlfY3JvcCA9IDE7CisJczVrNmFhLT5hcHBseV9jZmcgPSAxOworCW1zbGVlcCgxMDApOworCisJcmV0ID0gczVrNmFhX3NldF9haGJfYWRkcmVzcyhjbGllbnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gczVrNmFhX2NvbmZpZ3VyZV92aWRlb19idXMoczVrNmFhLCBzNWs2YWEtPmJ1c190eXBlLAorCQkJCQkgczVrNmFhLT5taXBpX2xhbmVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHM1azZhYV93cml0ZV9hcnJheShzZCwgczVrNmFhX2FuYWxvZ19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbXNsZWVwKDIwKTsKKworCXJldHVybiBzNWs2YWFfY29uZmlndXJlX3BpeGVsX2Nsb2NrcyhzNWs2YWEpOworfQorCitzdGF0aWMgaW50IHM1azZhYV9ncGlvX3NldF92YWx1ZShzdHJ1Y3QgczVrNmFhICpwcml2LCBpbnQgaWQsIHUzMiB2YWwpCit7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHByaXYtPmdwaW9baWRdLmdwaW8pKQorCQlyZXR1cm4gMDsKKwlncGlvX3NldF92YWx1ZShwcml2LT5ncGlvW2lkXS5ncGlvLCAhIXZhbCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2dwaW9fYXNzZXJ0KHN0cnVjdCBzNWs2YWEgKnByaXYsIGludCBpZCkKK3sKKwlyZXR1cm4gczVrNmFhX2dwaW9fc2V0X3ZhbHVlKHByaXYsIGlkLCBwcml2LT5ncGlvW2lkXS5sZXZlbCk7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2dwaW9fZGVhc3NlcnQoc3RydWN0IHM1azZhYSAqcHJpdiwgaW50IGlkKQoreworCXJldHVybiBzNWs2YWFfZ3Bpb19zZXRfdmFsdWUocHJpdiwgaWQsICFwcml2LT5ncGlvW2lkXS5sZXZlbCk7Cit9CisKK3N0YXRpYyBpbnQgX19zNWs2YWFfcG93ZXJfb24oc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoUzVLNkFBX05VTV9TVVBQTElFUywgczVrNmFhLT5zdXBwbGllcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoczVrNmFhX2dwaW9fZGVhc3NlcnQoczVrNmFhLCBTVEJZKSkKKwkJdXNsZWVwX3JhbmdlKDE1MCwgMjAwKTsKKworCWlmIChzNWs2YWEtPnNfcG93ZXIpCisJCXJldCA9IHM1azZhYS0+c19wb3dlcigxKTsKKwl1c2xlZXBfcmFuZ2UoNDAwMCwgNDAwMCk7CisKKwlpZiAoczVrNmFhX2dwaW9fZGVhc3NlcnQoczVrNmFhLCBSU1QpKQorCQltc2xlZXAoMjApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX3M1azZhYV9wb3dlcl9vZmYoc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCWludCByZXQ7CisKKwlpZiAoczVrNmFhX2dwaW9fYXNzZXJ0KHM1azZhYSwgUlNUKSkKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMTUwKTsKKworCWlmIChzNWs2YWEtPnNfcG93ZXIpIHsKKwkJcmV0ID0gczVrNmFhLT5zX3Bvd2VyKDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHM1azZhYV9ncGlvX2Fzc2VydChzNWs2YWEsIFNUQlkpKQorCQl1c2xlZXBfcmFuZ2UoNTAsIDEwMCk7CisJczVrNmFhLT5zdHJlYW1pbmcgPSAwOworCisJcmV0dXJuIHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoUzVLNkFBX05VTV9TVVBQTElFUywgczVrNmFhLT5zdXBwbGllcyk7Cit9CisKKy8qCisgKiBWNEwyIHN1YmRldiBjb3JlIGFuZCB2aWRlbyBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX3NldF9wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisKKwlpZiAoIW9uID09IHM1azZhYS0+cG93ZXIpIHsKKwkJaWYgKG9uKSB7CisJCQlyZXQgPSBfX3M1azZhYV9wb3dlcl9vbihzNWs2YWEpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gczVrNmFhX2luaXRpYWxpemVfaXNwKHNkKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IF9fczVrNmFhX3Bvd2VyX29mZihzNWs2YWEpOworCQl9CisKKwkJaWYgKCFyZXQpCisJCQlzNWs2YWEtPnBvd2VyICs9IG9uID8gMSA6IC0xOworCX0KKworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCWlmICghb24gfHwgcmV0IHx8IHM1azZhYS0+cG93ZXIgIT0gMSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cChzZC0+Y3RybF9oYW5kbGVyKTsKK30KKworc3RhdGljIGludCBfX3M1azZhYV9zdHJlYW0oc3RydWN0IHM1azZhYSAqczVrNmFhLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZzNWs2YWEtPnNkKTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19HX0VOQUJMRV9QUkVWLCBlbmFibGUpOworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19FTkFCTEVfUFJFVl9DSEcsIDEpOworCWlmICghcmV0KQorCQlzNWs2YWEtPnN0cmVhbWluZyA9IGVuYWJsZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKworCWlmIChzNWs2YWEtPnN0cmVhbWluZyA9PSAhb24pIHsKKwkJaWYgKCFyZXQgJiYgczVrNmFhLT5hcHBseV9jZmcpCisJCQlyZXQgPSBzNWs2YWFfc2V0X3ByZXZfY29uZmlnKHM1azZhYSwgczVrNmFhLT5wcmVzZXQpOworCQlpZiAoczVrNmFhLT5hcHBseV9jcm9wKQorCQkJcmV0ID0gczVrNmFhX3NldF9pbnB1dF9wYXJhbXMoczVrNmFhKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBfX3M1azZhYV9zdHJlYW0oczVrNmFhLCAhIW9uKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzNWs2YWFfZ19mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAqZmkpCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJZmktPmludGVydmFsID0gczVrNmFhLT5maXYtPmludGVydmFsOworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fczVrNmFhX3NldF9mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsCisJCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAqZmkpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWJ1c19mbXQgPSAmczVrNmFhLT5wcmVzZXQtPm1idXNfZm10OworCWNvbnN0IHN0cnVjdCBzNWs2YWFfaW50ZXJ2YWwgKmZpdiA9ICZzNWs2YWFfaW50ZXJ2YWxzWzBdOworCXVuc2lnbmVkIGludCBlcnIsIG1pbl9lcnIgPSBVSU5UX01BWDsKKwl1bnNpZ25lZCBpbnQgaSwgZnJfdGltZTsKKworCWlmIChmaS0+aW50ZXJ2YWwuZGVub21pbmF0b3IgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcl90aW1lID0gZmktPmludGVydmFsLm51bWVyYXRvciAqIDEwMDAwIC8gZmktPmludGVydmFsLmRlbm9taW5hdG9yOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczVrNmFhX2ludGVydmFscyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgczVrNmFhX2ludGVydmFsICppdiA9ICZzNWs2YWFfaW50ZXJ2YWxzW2ldOworCisJCWlmIChtYnVzX2ZtdC0+d2lkdGggPiBpdi0+c2l6ZS53aWR0aCB8fAorCQkgICAgbWJ1c19mbXQtPmhlaWdodCA+IGl2LT5zaXplLmhlaWdodCkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGFicyhpdi0+cmVnX2ZyX3RpbWUgLSBmcl90aW1lKTsKKwkJaWYgKGVyciA8IG1pbl9lcnIpIHsKKwkJCWZpdiA9IGl2OworCQkJbWluX2VyciA9IGVycjsKKwkJfQorCX0KKwlzNWs2YWEtPmZpdiA9IGZpdjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmczVrNmFhLT5zZCwgIkNoYW5nZWQgZnJhbWUgaW50ZXJ2YWwgdG8gJWQgdXNcbiIsCisJCSBmaXYtPnJlZ19mcl90aW1lICogMTAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWs2YWFfc19mcmFtZV9pbnRlcnZhbChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSAgIHN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCAqZmkpCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiU2V0dGluZyAlZC8lZCBmcmFtZSBpbnRlcnZhbFxuIiwKKwkJIGZpLT5pbnRlcnZhbC5udW1lcmF0b3IsIGZpLT5pbnRlcnZhbC5kZW5vbWluYXRvcik7CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCXJldCA9IF9fczVrNmFhX3NldF9mcmFtZV9pbnRlcnZhbChzNWs2YWEsIGZpKTsKKwlzNWs2YWEtPmFwcGx5X2NmZyA9IDE7CisKKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFY0TDIgc3ViZGV2IHBhZCBsZXZlbCBhbmQgdmlkZW8gb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IHM1azZhYV9lbnVtX2ZyYW1lX2ludGVydmFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsX2VudW0gKmZpZSkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCWNvbnN0IHN0cnVjdCBzNWs2YWFfaW50ZXJ2YWwgKmZpOworCWludCByZXQgPSAwOworCisJaWYgKGZpZS0+aW5kZXggPiBBUlJBWV9TSVpFKHM1azZhYV9pbnRlcnZhbHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmZmllLT53aWR0aCwgUzVLNkFBX1dJTl9XSURUSF9NSU4sCisJCQkgICAgICBTNUs2QUFfV0lOX1dJRFRIX01BWCwgMSwKKwkJCSAgICAgICZmaWUtPmhlaWdodCwgUzVLNkFBX1dJTl9IRUlHSFRfTUlOLAorCQkJICAgICAgUzVLNkFBX1dJTl9IRUlHSFRfTUFYLCAxLCAwKTsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJZmkgPSAmczVrNmFhX2ludGVydmFsc1tmaWUtPmluZGV4XTsKKwlpZiAoZmllLT53aWR0aCA+IGZpLT5zaXplLndpZHRoIHx8IGZpZS0+aGVpZ2h0ID4gZmktPnNpemUuaGVpZ2h0KQorCQlyZXQgPSAtRUlOVkFMOworCWVsc2UKKwkJZmllLT5pbnRlcnZhbCA9IGZpLT5pbnRlcnZhbDsKKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azZhYV9lbnVtX21idXNfY29kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSBzdHJ1Y3QgdjRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW0gKmNvZGUpCit7CisJaWYgKGNvZGUtPmluZGV4ID49IEFSUkFZX1NJWkUoczVrNmFhX2Zvcm1hdHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvZGUtPmNvZGUgPSBzNWs2YWFfZm9ybWF0c1tjb2RlLT5pbmRleF0uY29kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWs2YWFfZW51bV9mcmFtZV9zaXplKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bSAqZnNlKQoreworCWludCBpID0gQVJSQVlfU0laRShzNWs2YWFfZm9ybWF0cyk7CisKKwlpZiAoZnNlLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKC0taSkKKwkJaWYgKGZzZS0+Y29kZSA9PSBzNWs2YWFfZm9ybWF0c1tpXS5jb2RlKQorCQkJYnJlYWs7CisKKwlmc2UtPmNvZGUgPSBzNWs2YWFfZm9ybWF0c1tpXS5jb2RlOworCWZzZS0+bWluX3dpZHRoICA9IFM1SzZBQV9XSU5fV0lEVEhfTUlOOworCWZzZS0+bWF4X3dpZHRoICA9IFM1SzZBQV9XSU5fV0lEVEhfTUFYOworCWZzZS0+bWF4X2hlaWdodCA9IFM1SzZBQV9XSU5fSEVJR0hUX01JTjsKKwlmc2UtPm1pbl9oZWlnaHQgPSBTNUs2QUFfV0lOX0hFSUdIVF9NQVg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3JlY3QgKgorX19zNWs2YWFfZ2V0X2Nyb3BfcmVjdChzdHJ1Y3QgczVrNmFhICpzNWs2YWEsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCSAgICAgICBlbnVtIHY0bDJfc3ViZGV2X2Zvcm1hdF93aGVuY2Ugd2hpY2gpCit7CisJaWYgKHdoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUpCisJCXJldHVybiAmczVrNmFhLT5jY2RfcmVjdDsKKwlpZiAod2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgMCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgczVrNmFhX3RyeV9mb3JtYXQoc3RydWN0IHM1azZhYSAqczVrNmFhLAorCQkJICAgICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZtZi0+d2lkdGgsIFM1SzZBQV9XSU5fV0lEVEhfTUlOLAorCQkJICAgICAgUzVLNkFBX1dJTl9XSURUSF9NQVgsIDEsCisJCQkgICAgICAmbWYtPmhlaWdodCwgUzVLNkFBX1dJTl9IRUlHSFRfTUlOLAorCQkJICAgICAgUzVLNkFBX1dJTl9IRUlHSFRfTUFYLCAxLCAwKTsKKworCWlmIChtZi0+Y29sb3JzcGFjZSAhPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRyAmJgorCSAgICBtZi0+Y29sb3JzcGFjZSAhPSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5KQorCQltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOworCisJaW5kZXggPSBzNWs2YWFfZ2V0X3BpeGZtdF9pbmRleChzNWs2YWEsIG1mKTsKKworCW1mLT5jb2xvcnNwYWNlCT0gczVrNmFhX2Zvcm1hdHNbaW5kZXhdLmNvbG9yc3BhY2U7CisJbWYtPmNvZGUJPSBzNWs2YWFfZm9ybWF0c1tpbmRleF0uY29kZTsKKwltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX2dldF9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCSAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWY7CisKKwltZW1zZXQoZm10LT5yZXNlcnZlZCwgMCwgc2l6ZW9mKGZtdC0+cmVzZXJ2ZWQpKTsKKworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisJCWZtdC0+Zm9ybWF0ID0gKm1mOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCWZtdC0+Zm9ybWF0ID0gczVrNmFhLT5wcmVzZXQtPm1idXNfZm10OworCW11dGV4X3VubG9jaygmczVrNmFhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgIHN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCXN0cnVjdCBzNWs2YWFfcHJlc2V0ICpwcmVzZXQgPSBzNWs2YWEtPnByZXNldDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmczVrNmFhLT5sb2NrKTsKKwlzNWs2YWFfdHJ5X2Zvcm1hdChzNWs2YWEsICZmbXQtPmZvcm1hdCk7CisKKwlpZiAoZm10LT53aGljaCA9PSBWNEwyX1NVQkRFVl9GT1JNQVRfVFJZKSB7CisJCW1mID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIGZtdC0+cGFkKTsKKwkJY3JvcCA9IHY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgMCk7CisJfSBlbHNlIHsKKwkJaWYgKHM1azZhYS0+c3RyZWFtaW5nKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0gZWxzZSB7CisJCQltZiA9ICZwcmVzZXQtPm1idXNfZm10OworCQkJY3JvcCA9ICZzNWs2YWEtPmNjZF9yZWN0OworCQkJczVrNmFhLT5hcHBseV9jZmcgPSAxOworCQl9CisJfQorCisJaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCB2NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbCBmaXYgPSB7CisJCQkuaW50ZXJ2YWwgPSB7MCwgMX0KKwkJfTsKKworCQkqbWYgPSBmbXQtPmZvcm1hdDsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBjcm9wIHdpbmRvdyBpcyB2YWxpZCwgaS5lLiBpdHMgc2l6ZSBpcworCQkgKiBncmVhdGVyIHRoYW4gdGhlIG91dHB1dCB3aW5kb3csIGFzIHRoZSBJU1Agc3VwcG9ydHMKKwkJICogb25seSBkb3duLXNjYWxpbmcuCisJCSAqLworCQljcm9wLT53aWR0aCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBjcm9wLT53aWR0aCwgbWYtPndpZHRoLAorCQkJCSAgICAgIFM1SzZBQV9XSU5fV0lEVEhfTUFYKTsKKwkJY3JvcC0+aGVpZ2h0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGNyb3AtPmhlaWdodCwgbWYtPmhlaWdodCwKKwkJCQkgICAgICAgUzVLNkFBX1dJTl9IRUlHSFRfTUFYKTsKKwkJY3JvcC0+bGVmdCA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBjcm9wLT5sZWZ0LCAwLAorCQkJCSAgICAgUzVLNkFBX1dJTl9XSURUSF9NQVggLSBjcm9wLT53aWR0aCk7CisJCWNyb3AtPnRvcCAgPSBjbGFtcF90KHVuc2lnbmVkIGludCwgY3JvcC0+dG9wLCAwLAorCQkJCSAgICAgUzVLNkFBX1dJTl9IRUlHSFRfTUFYIC0gY3JvcC0+aGVpZ2h0KTsKKworCQkvKiBSZXNldCB0byBtaW5pbXVtIHBvc3NpYmxlIGZyYW1lIGludGVydmFsICovCisJCXJldCA9IF9fczVrNmFhX3NldF9mcmFtZV9pbnRlcnZhbChzNWs2YWEsICZmaXYpOworCX0KKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHM1azZhYV9nZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0OworCisJbWVtc2V0KGNyb3AtPnJlc2VydmVkLCAwLCBzaXplb2YoY3JvcC0+cmVzZXJ2ZWQpKTsKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCisJcmVjdCA9IF9fczVrNmFhX2dldF9jcm9wX3JlY3QoczVrNmFhLCBmaCwgY3JvcC0+d2hpY2gpOworCWlmIChyZWN0KQorCQljcm9wLT5yZWN0ID0gKnJlY3Q7CisKKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJDdXJyZW50IGNyb3AgcmVjdGFuZ2xlOiAoJWQsJWQpLyVkeCVkXG4iLAorCQkgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9zZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJICAgc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHM1azZhYSAqczVrNmFhID0gdG9fczVrNmFhKHNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZjsKKwl1bnNpZ25lZCBpbnQgbWF4X3gsIG1heF95OworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3BfcjsKKworCW11dGV4X2xvY2soJnM1azZhYS0+bG9jayk7CisJY3JvcF9yID0gX19zNWs2YWFfZ2V0X2Nyb3BfcmVjdChzNWs2YWEsIGZoLCBjcm9wLT53aGljaCk7CisKKwlpZiAoY3JvcC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRSkgeworCQltZiA9ICZzNWs2YWEtPnByZXNldC0+bWJ1c19mbXQ7CisJCXM1azZhYS0+YXBwbHlfY3JvcCA9IDE7CisJfSBlbHNlIHsKKwkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgMCk7CisJfQorCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmY3JvcC0+cmVjdC53aWR0aCwgbWYtPndpZHRoLAorCQkJICAgICAgUzVLNkFBX1dJTl9XSURUSF9NQVgsIDEsCisJCQkgICAgICAmY3JvcC0+cmVjdC5oZWlnaHQsIG1mLT5oZWlnaHQsCisJCQkgICAgICBTNUs2QUFfV0lOX0hFSUdIVF9NQVgsIDEsIDApOworCisJbWF4X3ggPSAoUzVLNkFBX1dJTl9XSURUSF9NQVggLSBjcm9wLT5yZWN0LndpZHRoKSAmIH4xOworCW1heF95ID0gKFM1SzZBQV9XSU5fSEVJR0hUX01BWCAtIGNyb3AtPnJlY3QuaGVpZ2h0KSAmIH4xOworCisJY3JvcC0+cmVjdC5sZWZ0ID0gY2xhbXBfdCh1bnNpZ25lZCBpbnQsIGNyb3AtPnJlY3QubGVmdCwgMCwgbWF4X3gpOworCWNyb3AtPnJlY3QudG9wICA9IGNsYW1wX3QodW5zaWduZWQgaW50LCBjcm9wLT5yZWN0LnRvcCwgMCwgbWF4X3kpOworCisJKmNyb3BfciA9IGNyb3AtPnJlY3Q7CisKKwltdXRleF91bmxvY2soJnM1azZhYS0+bG9jayk7CisKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJTZXQgY3JvcCByZWN0YW5nbGU6ICglZCwlZCkvJWR4JWRcbiIsCisJCSBjcm9wX3ItPmxlZnQsIGNyb3Bfci0+dG9wLCBjcm9wX3ItPndpZHRoLCBjcm9wX3ItPmhlaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9wYWRfb3BzIHM1azZhYV9wYWRfb3BzID0geworCS5lbnVtX21idXNfY29kZQkJPSBzNWs2YWFfZW51bV9tYnVzX2NvZGUsCisJLmVudW1fZnJhbWVfc2l6ZQk9IHM1azZhYV9lbnVtX2ZyYW1lX3NpemUsCisJLmVudW1fZnJhbWVfaW50ZXJ2YWwJPSBzNWs2YWFfZW51bV9mcmFtZV9pbnRlcnZhbCwKKwkuZ2V0X2ZtdAkJPSBzNWs2YWFfZ2V0X2ZtdCwKKwkuc2V0X2ZtdAkJPSBzNWs2YWFfc2V0X2ZtdCwKKwkuZ2V0X2Nyb3AJCT0gczVrNmFhX2dldF9jcm9wLAorCS5zZXRfY3JvcAkJPSBzNWs2YWFfc2V0X2Nyb3AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzNWs2YWFfdmlkZW9fb3BzID0geworCS5nX2ZyYW1lX2ludGVydmFsCT0gczVrNmFhX2dfZnJhbWVfaW50ZXJ2YWwsCisJLnNfZnJhbWVfaW50ZXJ2YWwJPSBzNWs2YWFfc19mcmFtZV9pbnRlcnZhbCwKKwkuc19zdHJlYW0JCT0gczVrNmFhX3Nfc3RyZWFtLAorfTsKKworLyoKKyAqIFY0TDIgc3ViZGV2IGNvbnRyb2xzCisgKi8KKworc3RhdGljIGludCBzNWs2YWFfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGN0cmxfdG9fc2QoY3RybCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzNWs2YWEgKnM1azZhYSA9IHRvX3M1azZhYShzZCk7CisJaW50IGlkeCwgZXJyID0gMDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgImN0cmw6IDB4JXgsIHZhbHVlOiAlZFxuIiwgY3RybC0+aWQsIGN0cmwtPnZhbCk7CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBub3QgcG93ZXJlZCB1cCBieSB0aGUgaG9zdCBkcml2ZXIgZG8KKwkgKiBub3QgYXBwbHkgYW55IGNvbnRyb2xzIHRvIEgvVyBhdCB0aGlzIHRpbWUuIEluc3RlYWQKKwkgKiB0aGUgY29udHJvbHMgd2lsbCBiZSByZXN0b3JlZCByaWdodCBhZnRlciBwb3dlci11cC4KKwkgKi8KKwlpZiAoczVrNmFhLT5wb3dlciA9PSAwKQorCQlnb3RvIHVubG9jazsKKwlpZHggPSBzNWs2YWEtPnByZXNldC0+aW5kZXg7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCWVyciA9IHM1azZhYV9zZXRfYXdiKHM1azZhYSwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19VU0VSX0JSSUdIVE5FU1MsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9DT0xPUkZYOgorCQllcnIgPSBzNWs2YWFfc2V0X2NvbG9yZngoczVrNmFhLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWVyciA9IHM1azZhYV93cml0ZShjbGllbnQsIFJFR19VU0VSX0NPTlRSQVNULCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJZXJyID0gczVrNmFhX3NldF9hdXRvX2V4cG9zdXJlKHM1azZhYSwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgorCQllcnIgPSBzNWs2YWFfc2V0X21pcnJvcihzNWs2YWEsIGN0cmwtPnZhbCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJZXJyID0gczVrNmFhX3dyaXRlKGNsaWVudCwgUkVHX0dfUFJFVl9DRkdfQ0hHLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZOgorCQllcnIgPSBzNWs2YWFfc2V0X2FudGlfZmxpY2tlcihzNWs2YWEsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQllcnIgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfVVNFUl9TQVRVUkFUSU9OLCBjdHJsLT52YWwpOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQllcnIgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfVVNFUl9TSEFSUEJMVVIsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFOgorCQllcnIgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfUF9DT0xPUlRFTVAoaWR4KSwgY3RybC0+dmFsKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQllcnIgPSBzNWs2YWFfd3JpdGUoY2xpZW50LCBSRUdfR19QUkVWX0NGR19DSEcsIDEpOworCQlicmVhazsKKwl9Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzNWs2YWFfY3RybF9vcHMgPSB7CisJLnNfY3RybAk9IHM1azZhYV9zX2N0cmwsCit9OworCitzdGF0aWMgaW50IHM1azZhYV9sb2dfc3RhdHVzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJdjRsMl9jdHJsX2hhbmRsZXJfbG9nX3N0YXR1cyhzZC0+Y3RybF9oYW5kbGVyLCBzZC0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVjRMMl9DSURfUkVEX0dBSU4JKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDEwMDEpCisjZGVmaW5lIFY0TDJfQ0lEX0dSRUVOX0dBSU4JKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDEwMDIpCisjZGVmaW5lIFY0TDJfQ0lEX0JMVUVfR0FJTgkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMykKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHM1azZhYV9jdHJsc1tdID0geworCXsKKwkJLm9wcwk9ICZzNWs2YWFfY3RybF9vcHMsCisJCS5pZAk9IFY0TDJfQ0lEX1JFRF9HQUlOLAorCQkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCT0gIkdhaW4sIFJlZCIsCisJCS5taW4JPSAwLAorCQkubWF4CT0gMjU2LAorCQkuZGVmCT0gMTI3LAorCQkuc3RlcAk9IDEsCisJfSwgeworCQkub3BzCT0gJnM1azZhYV9jdHJsX29wcywKKwkJLmlkCT0gVjRMMl9DSURfR1JFRU5fR0FJTiwKKwkJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZQk9ICJHYWluLCBHcmVlbiIsCisJCS5taW4JPSAwLAorCQkubWF4CT0gMjU2LAorCQkuZGVmCT0gMTI3LAorCQkuc3RlcAk9IDEsCisJfSwgeworCQkub3BzCT0gJnM1azZhYV9jdHJsX29wcywKKwkJLmlkCT0gVjRMMl9DSURfQkxVRV9HQUlOLAorCQkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lCT0gIkdhaW4sIEJsdWUiLAorCQkubWluCT0gMCwKKwkJLm1heAk9IDI1NiwKKwkJLmRlZgk9IDEyNywKKwkJLnN0ZXAJPSAxLAorCX0sCit9OworCitzdGF0aWMgaW50IHM1azZhYV9pbml0aWFsaXplX2N0cmxzKHN0cnVjdCBzNWs2YWEgKnM1azZhYSkKK3sKKwljb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyAqb3BzID0gJnM1azZhYV9jdHJsX29wczsKKwlzdHJ1Y3QgczVrNmFhX2N0cmxzICpjdHJscyA9ICZzNWs2YWEtPmN0cmxzOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsID0gJmN0cmxzLT5oYW5kbGVyOworCisJaW50IHJldCA9IHY0bDJfY3RybF9oYW5kbGVyX2luaXQoaGRsLCAxNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKiBBdXRvIHdoaXRlIGJhbGFuY2UgY2x1c3RlciAqLworCWN0cmxzLT5hd2IgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAorCQkJCSAgICAgICAwLCAxLCAxLCAxKTsKKwljdHJscy0+Z2Fpbl9yZWQgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZzNWs2YWFfY3RybHNbMF0sIE5VTEwpOworCWN0cmxzLT5nYWluX2dyZWVuID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmczVrNmFhX2N0cmxzWzFdLCBOVUxMKTsKKwljdHJscy0+Z2Fpbl9ibHVlID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmczVrNmFhX2N0cmxzWzJdLCBOVUxMKTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDQsICZjdHJscy0+YXdiLCAwLCBmYWxzZSk7CisKKwljdHJscy0+aGZsaXAgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfSEZMSVAsIDAsIDEsIDEsIDApOworCWN0cmxzLT52ZmxpcCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX2NsdXN0ZXIoMiwgJmN0cmxzLT5oZmxpcCk7CisKKwljdHJscy0+YXV0b19leHAgPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgb3BzLAorCQkJCVY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCQkJVjRMMl9FWFBPU1VSRV9NQU5VQUwsIDAsIFY0TDJfRVhQT1NVUkVfQVVUTyk7CisJLyogRXhwb3N1cmUgdGltZTogeCAxIHVzICovCisJY3RybHMtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCBvcHMsIFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJCQkgICAgMCwgNjAwMDAwMFUsIDEsIDEwMDAwMFUpOworCS8qIFRvdGFsIGdhaW46IDI1NiA8PT4gMXggKi8KKwljdHJscy0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9HQUlOLAorCQkJCQkwLCAyNTYsIDEsIDI1Nik7CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigzLCAmY3RybHMtPmF1dG9fZXhwLCAwLCBmYWxzZSk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgb3BzLCBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSwKKwkJCSAgICAgICBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9BVVRPLCAwLAorCQkJICAgICAgIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0FVVE8pOworCisJdjRsMl9jdHJsX25ld19zdGRfbWVudShoZGwsIG9wcywgVjRMMl9DSURfQ09MT1JGWCwKKwkJCSAgICAgICBWNEwyX0NPTE9SRlhfU0tZX0JMVUUsIH4weDZmLCBWNEwyX0NPTE9SRlhfTk9ORSk7CisKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwKKwkJCSAgMCwgMjU2LCAxLCAwKTsKKworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9TQVRVUkFUSU9OLCAtMTI3LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9CUklHSFRORVNTLCAtMTI3LCAxMjcsIDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKGhkbCwgb3BzLCBWNEwyX0NJRF9DT05UUkFTVCwgLTEyNywgMTI3LCAxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZChoZGwsIG9wcywgVjRMMl9DSURfU0hBUlBORVNTLCAtMTI3LCAxMjcsIDEsIDApOworCisJaWYgKGhkbC0+ZXJyb3IpIHsKKwkJcmV0ID0gaGRsLT5lcnJvcjsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZShoZGwpOworCQlyZXR1cm4gcmV0OworCX0KKworCXM1azZhYS0+c2QuY3RybF9oYW5kbGVyID0gaGRsOworCXJldHVybiAwOworfQorCisvKgorICogVjRMMiBzdWJkZXYgaW50ZXJuYWwgb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IHM1azZhYV9vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm9ybWF0ID0gdjRsMl9zdWJkZXZfZ2V0X3RyeV9mb3JtYXQoZmgsIDApOworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3AgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIDApOworCisJZm9ybWF0LT5jb2xvcnNwYWNlID0gczVrNmFhX2Zvcm1hdHNbMF0uY29sb3JzcGFjZTsKKwlmb3JtYXQtPmNvZGUgPSBzNWs2YWFfZm9ybWF0c1swXS5jb2RlOworCWZvcm1hdC0+d2lkdGggPSBTNUs2QUFfT1VUX1dJRFRIX0RFRjsKKwlmb3JtYXQtPmhlaWdodCA9IFM1SzZBQV9PVVRfSEVJR0hUX0RFRjsKKwlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCisJY3JvcC0+d2lkdGggPSBTNUs2QUFfV0lOX1dJRFRIX01BWDsKKwljcm9wLT5oZWlnaHQgPSBTNUs2QUFfV0lOX0hFSUdIVF9NQVg7CisJY3JvcC0+bGVmdCA9IDA7CisJY3JvcC0+dG9wID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgczVrNmFhX2NoZWNrX2Z3X3JldmlzaW9uKHN0cnVjdCBzNWs2YWEgKnM1azZhYSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmczVrNmFhLT5zZCk7CisJdTE2IGFwaV92ZXIgPSAwLCBmd19yZXYgPSAwOworCisJaW50IHJldCA9IHM1azZhYV9zZXRfYWhiX2FkZHJlc3MoY2xpZW50KTsKKworCWlmICghcmV0KQorCQlyZXQgPSBzNWs2YWFfcmVhZChjbGllbnQsIFJFR19GV19BUElWRVIsICZhcGlfdmVyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gczVrNmFhX3JlYWQoY2xpZW50LCBSRUdfRldfUkVWSVNJT04sICZmd19yZXYpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnM1azZhYS0+c2QsICJGVyByZXZpc2lvbiBjaGVjayBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2NGwyX2luZm8oJnM1azZhYS0+c2QsICJGVyBBUEkgdmVyLjogMHglWCwgRlcgcmV2LjogMHglWFxuIiwKKwkJICBhcGlfdmVyLCBmd19yZXYpOworCisJcmV0dXJuIGFwaV92ZXIgPT0gUzVLNkFBRlhfRldfQVBJVkVSID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3JlZ2lzdGVyZWQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzNWs2YWEtPmxvY2spOworCXJldCA9IF9fczVrNmFhX3Bvd2VyX29uKHM1azZhYSk7CisJaWYgKCFyZXQpIHsKKwkJbXNsZWVwKDEwMCk7CisJCXJldCA9IHM1azZhYV9jaGVja19md19yZXZpc2lvbihzNWs2YWEpOworCQlfX3M1azZhYV9wb3dlcl9vZmYoczVrNmFhKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzNWs2YWEtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgczVrNmFhX3N1YmRldl9pbnRlcm5hbF9vcHMgPSB7CisJLnJlZ2lzdGVyZWQgPSBzNWs2YWFfcmVnaXN0ZXJlZCwKKwkub3BlbiA9IHM1azZhYV9vcGVuLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBzNWs2YWFfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIgPSBzNWs2YWFfc2V0X3Bvd2VyLAorCS5sb2dfc3RhdHVzID0gczVrNmFhX2xvZ19zdGF0dXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzNWs2YWFfc3ViZGV2X29wcyA9IHsKKwkuY29yZSA9ICZzNWs2YWFfY29yZV9vcHMsCisJLnBhZCA9ICZzNWs2YWFfcGFkX29wcywKKwkudmlkZW8gPSAmczVrNmFhX3ZpZGVvX29wcywKK307CisKKy8qCisgKiBHUElPIHNldHVwCisgKi8KK3N0YXRpYyBpbnQgczVrNmFhX2NvbmZpZ3VyZV9ncGlvKGludCBuciwgaW50IHZhbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gdmFsID8gR1BJT0ZfT1VUX0lOSVRfSElHSCA6IEdQSU9GX09VVF9JTklUX0xPVzsKKwlpbnQgcmV0OworCisJaWYgKCFncGlvX2lzX3ZhbGlkKG5yKSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShuciwgZmxhZ3MsIG5hbWUpOworCWlmICghcmV0KQorCQlncGlvX2V4cG9ydChuciwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgczVrNmFhX2ZyZWVfZ3Bpb3Moc3RydWN0IHM1azZhYSAqczVrNmFhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczVrNmFhLT5ncGlvKTsgaSsrKSB7CisJCWlmICghZ3Bpb19pc192YWxpZChzNWs2YWEtPmdwaW9baV0uZ3BpbykpCisJCQljb250aW51ZTsKKwkJZ3Bpb19mcmVlKHM1azZhYS0+Z3Bpb1tpXS5ncGlvKTsKKwkJczVrNmFhLT5ncGlvW2ldLmdwaW8gPSAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzNWs2YWFfY29uZmlndXJlX2dwaW9zKHN0cnVjdCBzNWs2YWEgKnM1azZhYSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzNWs2YWFfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJY29uc3Qgc3RydWN0IHM1azZhYV9ncGlvICpncGlvID0gJnBkYXRhLT5ncGlvX3N0Ynk7CisJaW50IHJldDsKKworCXM1azZhYS0+Z3Bpb1tTVEJZXS5ncGlvID0gLUVJTlZBTDsKKwlzNWs2YWEtPmdwaW9bUlNUXS5ncGlvICA9IC1FSU5WQUw7CisKKwlyZXQgPSBzNWs2YWFfY29uZmlndXJlX2dwaW8oZ3Bpby0+Z3BpbywgZ3Bpby0+bGV2ZWwsICJTNUs2QUFfU1RCWSIpOworCWlmIChyZXQpIHsKKwkJczVrNmFhX2ZyZWVfZ3Bpb3MoczVrNmFhKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJczVrNmFhLT5ncGlvW1NUQlldID0gKmdwaW87CisJaWYgKGdwaW9faXNfdmFsaWQoZ3Bpby0+Z3BpbykpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8tPmdwaW8sIDApOworCisJZ3BpbyA9ICZwZGF0YS0+Z3Bpb19yZXNldDsKKwlyZXQgPSBzNWs2YWFfY29uZmlndXJlX2dwaW8oZ3Bpby0+Z3BpbywgZ3Bpby0+bGV2ZWwsICJTNUs2QUFfUlNUIik7CisJaWYgKHJldCkgeworCQlzNWs2YWFfZnJlZV9ncGlvcyhzNWs2YWEpOworCQlyZXR1cm4gcmV0OworCX0KKwlzNWs2YWEtPmdwaW9bUlNUXSA9ICpncGlvOworCWlmIChncGlvX2lzX3ZhbGlkKGdwaW8tPmdwaW8pKQorCQlncGlvX3NldF92YWx1ZShncGlvLT5ncGlvLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1azZhYV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWNvbnN0IHN0cnVjdCBzNWs2YWFfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJc3RydWN0IHM1azZhYSAqczVrNmFhOworCWludCBpLCByZXQ7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBsYXRmb3JtIGRhdGEgbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwZGF0YS0+bWNsa19mcmVxdWVuY3kgPT0gMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk1DTEsgZnJlcXVlbmN5IG5vdCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzNWs2YWEgPSBremFsbG9jKHNpemVvZigqczVrNmFhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzNWs2YWEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmczVrNmFhLT5sb2NrKTsKKworCXM1azZhYS0+bWNsa19mcmVxdWVuY3kgPSBwZGF0YS0+bWNsa19mcmVxdWVuY3k7CisJczVrNmFhLT5idXNfdHlwZSA9IHBkYXRhLT5idXNfdHlwZTsKKwlzNWs2YWEtPm1pcGlfbGFuZXMgPSBwZGF0YS0+bmxhbmVzOworCXM1azZhYS0+c19wb3dlcgk9IHBkYXRhLT5zZXRfcG93ZXI7CisJczVrNmFhLT5pbnZfaGZsaXAgPSBwZGF0YS0+aG9yaXpfZmxpcDsKKwlzNWs2YWEtPmludl92ZmxpcCA9IHBkYXRhLT52ZXJ0X2ZsaXA7CisKKwlzZCA9ICZzNWs2YWEtPnNkOworCXN0cmxjcHkoc2QtPm5hbWUsIERSSVZFUl9OQU1FLCBzaXplb2Yoc2QtPm5hbWUpKTsKKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmczVrNmFhX3N1YmRldl9vcHMpOworCisJc2QtPmludGVybmFsX29wcyA9ICZzNWs2YWFfc3ViZGV2X2ludGVybmFsX29wczsKKwlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisKKwlzNWs2YWEtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CisJc2QtPmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVZfU0VOU09SOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZzZC0+ZW50aXR5LCAxLCAmczVrNmFhLT5wYWQsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjE7CisKKwlyZXQgPSBzNWs2YWFfY29uZmlndXJlX2dwaW9zKHM1azZhYSwgcGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjI7CisKKwlmb3IgKGkgPSAwOyBpIDwgUzVLNkFBX05VTV9TVVBQTElFUzsgaSsrKQorCQlzNWs2YWEtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHM1azZhYV9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJmNsaWVudC0+ZGV2LCBTNUs2QUFfTlVNX1NVUFBMSUVTLAorCQkJCSBzNWs2YWEtPnN1cHBsaWVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCByZWd1bGF0b3JzXG4iKTsKKwkJZ290byBvdXRfZXJyMzsKKwl9CisKKwlyZXQgPSBzNWs2YWFfaW5pdGlhbGl6ZV9jdHJscyhzNWs2YWEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjQ7CisKKwlzNWs2YWFfcHJlc2V0c19kYXRhX2luaXQoczVrNmFhKTsKKworCXM1azZhYS0+Y2NkX3JlY3Qud2lkdGggPSBTNUs2QUFfV0lOX1dJRFRIX01BWDsKKwlzNWs2YWEtPmNjZF9yZWN0LmhlaWdodAk9IFM1SzZBQV9XSU5fSEVJR0hUX01BWDsKKwlzNWs2YWEtPmNjZF9yZWN0LmxlZnQgPSAwOworCXM1azZhYS0+Y2NkX3JlY3QudG9wID0gMDsKKworCXJldHVybiAwOworCitvdXRfZXJyNDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKFM1SzZBQV9OVU1fU1VQUExJRVMsIHM1azZhYS0+c3VwcGxpZXMpOworb3V0X2VycjM6CisJczVrNmFhX2ZyZWVfZ3Bpb3MoczVrNmFhKTsKK291dF9lcnIyOgorCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzNWs2YWEtPnNkLmVudGl0eSk7CitvdXRfZXJyMToKKwlrZnJlZShzNWs2YWEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgczVrNmFhX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgczVrNmFhICpzNWs2YWEgPSB0b19zNWs2YWEoc2QpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2QpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoc2QtPmN0cmxfaGFuZGxlcik7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoUzVLNkFBX05VTV9TVVBQTElFUywgczVrNmFhLT5zdXBwbGllcyk7CisJczVrNmFhX2ZyZWVfZ3Bpb3MoczVrNmFhKTsKKwlrZnJlZShzNWs2YWEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzNWs2YWFfaWRbXSA9IHsKKwl7IERSSVZFUl9OQU1FLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzNWs2YWFfaWQpOworCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzNWs2YWFfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FCisJfSwKKwkucHJvYmUJCT0gczVrNmFhX3Byb2JlLAorCS5yZW1vdmUJCT0gczVrNmFhX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBzNWs2YWFfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzNWs2YWFfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmczVrNmFhX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgczVrNmFhX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmczVrNmFhX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzNWs2YWFfaW5pdCk7Cittb2R1bGVfZXhpdChzNWs2YWFfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNUs2QUEoRlgpIFNYR0EgY2FtZXJhIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvTWFrZWZpbGUKaW5kZXggZGY2OTU0YS4uMzNkZWM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAotczVwLWZpbWMtb2JqcyA6PSBmaW1jLWNvcmUubyBmaW1jLXJlZy5vIGZpbWMtY2FwdHVyZS5vCitzNXAtZmltYy1vYmpzIDo9IGZpbWMtY29yZS5vIGZpbWMtcmVnLm8gZmltYy1jYXB0dXJlLm8gZmltYy1tZGV2aWNlLm8KIHM1cC1jc2lzLW9ianMgOj0gbWlwaS1jc2lzLm8KIAogb2JqLSQoQ09ORklHX1ZJREVPX1M1UF9NSVBJX0NTSVMpCSs9IHM1cC1jc2lzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCmluZGV4IDBkNzMwZTUuLmM4ZDkxYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYwpAQCAtMTYsMTEgKzE2LDkgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0yOSwxMzUgKzI3LDg4IEBACiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgogCisjaW5jbHVkZSAiZmltYy1tZGV2aWNlLmgiCiAjaW5jbHVkZSAiZmltYy1jb3JlLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXYgKmZpbWNfc3ViZGV2X3JlZ2lzdGVyKHN0cnVjdCBmaW1jX2RldiAqZmltYywKLQkJCQkJICAgIHN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqaXNwX2luZm8pCitzdGF0aWMgaW50IGZpbWNfaW5pdF9jYXB0dXJlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gTlVMTDsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvICpzZW5zb3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKIAotCWkyY19hZGFwID0gaTJjX2dldF9hZGFwdGVyKGlzcF9pbmZvLT5pMmNfYnVzX251bSk7Ci0JaWYgKCFpMmNfYWRhcCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlzZCA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJnZpZF9jYXAtPnY0bDJfZGV2LCBpMmNfYWRhcCwKLQkJCQkgICAgICAgaXNwX2luZm8tPmJvYXJkX2luZm8sIE5VTEwpOwotCWlmICghc2QpIHsKLQkJdjRsMl9lcnIoJnZpZF9jYXAtPnY0bDJfZGV2LCAiZmFpbGVkIHRvIGFjcXVpcmUgc3ViZGV2XG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdjRsMl9pbmZvKCZ2aWRfY2FwLT52NGwyX2RldiwgInN1YmRldmljZSAlcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWx5XG4iLAotCQlpc3BfaW5mby0+Ym9hcmRfaW5mby0+dHlwZSk7Ci0KLQlyZXR1cm4gc2Q7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbWNfc3ViZGV2X3VucmVnaXN0ZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQotewotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXAgPSAmZmltYy0+dmlkX2NhcDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCi0JaWYgKHZpZF9jYXAtPmlucHV0X2luZGV4IDwgMCkKLQkJcmV0dXJuOwkvKiBTdWJkZXZpY2UgYWxyZWFkeSByZWxlYXNlZCBvciBub3QgcmVnaXN0ZXJlZC4gKi8KLQotCWlmICh2aWRfY2FwLT5zZCkgewotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldih2aWRfY2FwLT5zZCk7Ci0JCWNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEodmlkX2NhcC0+c2QpOwotCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY2xpZW50KTsKLQkJaTJjX3B1dF9hZGFwdGVyKGNsaWVudC0+YWRhcHRlcik7Ci0JCXZpZF9jYXAtPnNkID0gTlVMTDsKLQl9Ci0KLQl2aWRfY2FwLT5pbnB1dF9pbmRleCA9IC0xOwotfQotCi0vKioKLSAqIGZpbWNfc3ViZGV2X2F0dGFjaCAtIGF0dGFjaCB2NGwyX3N1YmRldiB0byBjYW1lcmEgaG9zdCBpbnRlcmZhY2UKLSAqCi0gKiBAZmltYzogRklNQyBkZXZpY2UgaW5mb3JtYXRpb24KLSAqIEBpbmRleDogaW5kZXggdG8gdGhlIGFycmF5IG9mIGF2YWlsYWJsZSBzdWJkZXZpY2VzLAotICoJICAgLTEgZm9yIGZ1bGwgYXJyYXkgc2VhcmNoIG9yIG5vbiBuZWdhdGl2ZSB2YWx1ZQotICoJICAgdG8gc2VsZWN0IHNwZWNpZmljIHN1YmRldmljZQotICovCi1zdGF0aWMgaW50IGZpbWNfc3ViZGV2X2F0dGFjaChzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7Ci0Jc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwZGF0YSA9IGZpbWMtPnBkYXRhOwotCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqaXNwX2luZm87Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2NsaWVudHM7ICsraSkgewotCQlpc3BfaW5mbyA9ICZwZGF0YS0+aXNwX2luZm9baV07Ci0KLQkJaWYgKGluZGV4ID49IDAgJiYgaSAhPSBpbmRleCkKLQkJCWNvbnRpbnVlOwotCi0JCXNkID0gZmltY19zdWJkZXZfcmVnaXN0ZXIoZmltYywgaXNwX2luZm8pOwotCQlpZiAoIUlTX0VSUl9PUl9OVUxMKHNkKSkgewotCQkJdmlkX2NhcC0+c2QgPSBzZDsKLQkJCXZpZF9jYXAtPmlucHV0X2luZGV4ID0gaTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQl2aWRfY2FwLT5pbnB1dF9pbmRleCA9IC0xOwotCXZpZF9jYXAtPnNkID0gTlVMTDsKLQl2NGwyX2VycigmdmlkX2NhcC0+djRsMl9kZXYsICJmaW1jJWQ6IHNlbnNvciBhdHRhY2ggZmFpbGVkXG4iLAotCQkgZmltYy0+aWQpOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IGZpbWNfaXNwX3N1YmRldl9pbml0KHN0cnVjdCBmaW1jX2RldiAqZmltYywgdW5zaWduZWQgaW50IGluZGV4KQotewotCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqaXNwX2luZm87Ci0Jc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwZGF0YSA9IGZpbWMtPnBkYXRhOwotCWludCByZXQ7Ci0KLQlpZiAoaW5kZXggPj0gcGRhdGEtPm51bV9jbGllbnRzKQorCWlmIChmaW1jLT5waXBlbGluZS5zZW5zb3IgPT0gTlVMTCB8fCBjdHggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoY3R4LT5zX2ZyYW1lLmZtdCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlzcF9pbmZvID0gJnBkYXRhLT5pc3BfaW5mb1tpbmRleF07CisJc2Vuc29yID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKGZpbWMtPnBpcGVsaW5lLnNlbnNvcik7CiAKLQlpZiAoaXNwX2luZm8tPmNsa19mcmVxdWVuY3kpCi0JCWNsa19zZXRfcmF0ZShmaW1jLT5jbG9ja1tDTEtfQ0FNXSwgaXNwX2luZm8tPmNsa19mcmVxdWVuY3kpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCWZpbWNfcHJlcGFyZV9kbWFfb2Zmc2V0KGN0eCwgJmN0eC0+ZF9mcmFtZSk7CisJZmltY19zZXRfeXV2X29yZGVyKGN0eCk7CiAKLQlyZXQgPSBjbGtfZW5hYmxlKGZpbWMtPmNsb2NrW0NMS19DQU1dKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWZpbWNfaHdfc2V0X2NhbWVyYV9wb2xhcml0eShmaW1jLCBzZW5zb3ItPnBkYXRhKTsKKwlmaW1jX2h3X3NldF9jYW1lcmFfdHlwZShmaW1jLCBzZW5zb3ItPnBkYXRhKTsKKwlmaW1jX2h3X3NldF9jYW1lcmFfc291cmNlKGZpbWMsIHNlbnNvci0+cGRhdGEpOworCWZpbWNfaHdfc2V0X2NhbWVyYV9vZmZzZXQoZmltYywgJmN0eC0+c19mcmFtZSk7CiAKLQlyZXQgPSBmaW1jX3N1YmRldl9hdHRhY2goZmltYywgaW5kZXgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBmaW1jX2h3X3NldF9jYW1lcmFfcG9sYXJpdHkoZmltYywgaXNwX2luZm8pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGZpbWMtPnZpZF9jYXAuc2QsIGNvcmUsIHNfcG93ZXIsIDEpOwotCWlmICghcmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogZW5hYmxpbmcgcG93ZXIgZmFpbGVkIHNvIHVucmVnaXN0ZXIgc3ViZGV2ICovCi0JZmltY19zdWJkZXZfdW5yZWdpc3RlcihmaW1jKTsKLQotCXY0bDJfZXJyKCZmaW1jLT52aWRfY2FwLnY0bDJfZGV2LCAiSVNQIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJWRcbiIsCi0JCSByZXQpOwotCisJcmV0ID0gZmltY19zZXRfc2NhbGVyX2luZm8oY3R4KTsKKwlpZiAoIXJldCkgeworCQlmaW1jX2h3X3NldF9pbnB1dF9wYXRoKGN0eCk7CisJCWZpbWNfaHdfc2V0X3ByZXNjYWxlcihjdHgpOworCQlmaW1jX2h3X3NldF9tYWluc2NhbGVyKGN0eCk7CisJCWZpbWNfaHdfc2V0X3RhcmdldF9mb3JtYXQoY3R4KTsKKwkJZmltY19od19zZXRfcm90YXRpb24oY3R4KTsKKwkJZmltY19od19zZXRfZWZmZWN0KGN0eCwgZmFsc2UpOworCQlmaW1jX2h3X3NldF9vdXRwdXRfcGF0aChjdHgpOworCQlmaW1jX2h3X3NldF9vdXRfZG1hKGN0eCk7CisJCWNsZWFyX2JpdChTVF9DQVBUX0FQUExZX0NGRywgJmZpbWMtPnN0YXRlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGZpbWNfc3RvcF9jYXB0dXJlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3N0YXRpYyBpbnQgZmltY19jYXB0dXJlX3N0YXRlX2NsZWFudXAoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBib29sIHN1c3BlbmQpCit7CisJc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwID0gJmZpbWMtPnZpZF9jYXA7CisJc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBzdHJlYW1pbmc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwlzdHJlYW1pbmcgPSBmaW1jLT5zdGF0ZSAmICgxIDw8IFNUX0NBUFRfSVNQX1NUUkVBTSk7CisKKwlmaW1jLT5zdGF0ZSAmPSB+KDEgPDwgU1RfQ0FQVF9SVU4gfCAxIDw8IFNUX0NBUFRfU0hVVCB8CisJCQkgMSA8PCBTVF9DQVBUX1NUUkVBTSB8IDEgPDwgU1RfQ0FQVF9JU1BfU1RSRUFNKTsKKwlpZiAoIXN1c3BlbmQpCisJCWZpbWMtPnN0YXRlICY9IH4oMSA8PCBTVF9DQVBUX1BFTkQgfCAxIDw8IFNUX0NBUFRfU1VTUEVOREVEKTsKKworCS8qIFJlbGVhc2UgdW51c2VkIGJ1ZmZlcnMgKi8KKwl3aGlsZSAoIXN1c3BlbmQgJiYgIWxpc3RfZW1wdHkoJmNhcC0+cGVuZGluZ19idWZfcSkpIHsKKwkJYnVmID0gZmltY19wZW5kaW5nX3F1ZXVlX3BvcChjYXApOworCQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCX0KKwkvKiBJZiBzdXNwZW5kaW5nIHB1dCB1bnVzZWQgYnVmZmVycyBvbnRvIHBlbmRpbmcgcXVldWUgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhcC0+YWN0aXZlX2J1Zl9xKSkgeworCQlidWYgPSBmaW1jX2FjdGl2ZV9xdWV1ZV9wb3AoY2FwKTsKKwkJaWYgKHN1c3BlbmQpCisJCQlmaW1jX3BlbmRpbmdfcXVldWVfYWRkKGNhcCwgYnVmKTsKKwkJZWxzZQorCQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9CisJc2V0X2JpdChTVF9DQVBUX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKHN0cmVhbWluZykKKwkJcmV0dXJuIGZpbWNfcGlwZWxpbmVfc19zdHJlYW0oZmltYywgMCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX3N0b3BfY2FwdHVyZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGJvb2wgc3VzcGVuZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcDsKLQlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWY7Ci0KLQljYXAgPSAmZmltYy0+dmlkX2NhcDsKIAogCWlmICghZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSkKIAkJcmV0dXJuIDA7CkBAIC0xNjksODEgKzEyMCw3MyBAQAogCiAJd2FpdF9ldmVudF90aW1lb3V0KGZpbWMtPmlycV9xdWV1ZSwKIAkJCSAgICF0ZXN0X2JpdChTVF9DQVBUX1NIVVQsICZmaW1jLT5zdGF0ZSksCi0JCQkgICBGSU1DX1NIVVRET1dOX1RJTUVPVVQpOworCQkJICAgKDIqSFovMTApKTsgLyogMjAwIG1zICovCiAKLQl2NGwyX3N1YmRldl9jYWxsKGNhcC0+c2QsIHZpZGVvLCBzX3N0cmVhbSwgMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKLQlmaW1jLT5zdGF0ZSAmPSB+KDEgPDwgU1RfQ0FQVF9SVU4gfCAxIDw8IFNUX0NBUFRfUEVORCB8Ci0JCQkgMSA8PCBTVF9DQVBUX1NIVVQgfCAxIDw8IFNUX0NBUFRfU1RSRUFNKTsKLQotCWZpbWMtPnZpZF9jYXAuYWN0aXZlX2J1Zl9jbnQgPSAwOwotCi0JLyogUmVsZWFzZSBidWZmZXJzIHRoYXQgd2VyZSBlbnF1ZXVlZCBpbiB0aGUgZHJpdmVyIGJ5IHZpZGVvYnVmMi4gKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhcC0+cGVuZGluZ19idWZfcSkpIHsKLQkJYnVmID0gcGVuZGluZ19xdWV1ZV9wb3AoY2FwKTsKLQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKLQl9Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhcC0+YWN0aXZlX2J1Zl9xKSkgewotCQlidWYgPSBhY3RpdmVfcXVldWVfcG9wKGNhcCk7Ci0JCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKLQotCWRiZygic3RhdGU6IDB4JWx4IiwgZmltYy0+c3RhdGUpOwotCXJldHVybiAwOworCXJldHVybiBmaW1jX2NhcHR1cmVfc3RhdGVfY2xlYW51cChmaW1jLCBzdXNwZW5kKTsKIH0KIAotc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKKy8qKgorICogZmltY19jYXB0dXJlX2NvbmZpZ191cGRhdGUgLSBhcHBseSB0aGUgY2FtZXJhIGludGVyZmFjZSBjb25maWd1cmF0aW9uCisgKgorICogVG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aXRoIGZpbWMuc2xvY2sKKyAqIHNwaW5sb2NrIGhlbGQuIEl0IHVwZGF0ZXMgdGhlIGNhbWVyYSBwaXhlbCBjcm9wLCByb3RhdGlvbiBhbmQKKyAqIGltYWdlIGZsaXAgaW4gSC9XLgorICovCitpbnQgZmltY19jYXB0dXJlX2NvbmZpZ191cGRhdGUoc3RydWN0IGZpbWNfY3R4ICpjdHgpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBxLT5kcnZfcHJpdjsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqaXNwX2luZm87CiAJaW50IHJldDsKIAotCWZpbWNfaHdfcmVzZXQoZmltYyk7CisJaWYgKHRlc3RfYml0KFNUX0NBUFRfQVBQTFlfQ0ZHLCAmZmltYy0+c3RhdGUpKQorCQlyZXR1cm4gMDsKIAotCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgdmlkZW8sIHNfc3RyZWFtLCAxKTsKLQlpZiAocmV0ICYmIHJldCAhPSAtRU5PSU9DVExDTUQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBmaW1jX3ByZXBhcmVfY29uZmlnKGN0eCwgY3R4LT5zdGF0ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlzcF9pbmZvID0gJmZpbWMtPnBkYXRhLT5pc3BfaW5mb1tmaW1jLT52aWRfY2FwLmlucHV0X2luZGV4XTsKLQlmaW1jX2h3X3NldF9jYW1lcmFfdHlwZShmaW1jLCBpc3BfaW5mbyk7Ci0JZmltY19od19zZXRfY2FtZXJhX3NvdXJjZShmaW1jLCBpc3BfaW5mbyk7CisJc3Bpbl9sb2NrKCZjdHgtPnNsb2NrKTsKIAlmaW1jX2h3X3NldF9jYW1lcmFfb2Zmc2V0KGZpbWMsICZjdHgtPnNfZnJhbWUpOwotCi0JaWYgKGN0eC0+c3RhdGUgJiBGSU1DX1BBUkFNUykgewotCQlyZXQgPSBmaW1jX3NldF9zY2FsZXJfaW5mbyhjdHgpOwotCQlpZiAocmV0KSB7Ci0JCQllcnIoIlNjYWxlciBzZXR1cCBlcnJvciIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlmaW1jX2h3X3NldF9pbnB1dF9wYXRoKGN0eCk7CisJcmV0ID0gZmltY19zZXRfc2NhbGVyX2luZm8oY3R4KTsKKwlpZiAocmV0ID09IDApIHsKIAkJZmltY19od19zZXRfcHJlc2NhbGVyKGN0eCk7CiAJCWZpbWNfaHdfc2V0X21haW5zY2FsZXIoY3R4KTsKIAkJZmltY19od19zZXRfdGFyZ2V0X2Zvcm1hdChjdHgpOwogCQlmaW1jX2h3X3NldF9yb3RhdGlvbihjdHgpOwotCQlmaW1jX2h3X3NldF9lZmZlY3QoY3R4KTsKKwkJZmltY19wcmVwYXJlX2RtYV9vZmZzZXQoY3R4LCAmY3R4LT5kX2ZyYW1lKTsKKwkJZmltY19od19zZXRfb3V0X2RtYShjdHgpOworCQlzZXRfYml0KFNUX0NBUFRfQVBQTFlfQ0ZHLCAmZmltYy0+c3RhdGUpOwogCX0KKwlzcGluX3VubG9jaygmY3R4LT5zbG9jayk7CisJcmV0dXJuIHJldDsKK30KIAotCWZpbWNfaHdfc2V0X291dHB1dF9wYXRoKGN0eCk7Ci0JZmltY19od19zZXRfb3V0X2RtYShjdHgpOworc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcS0+ZHJ2X3ByaXY7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7CisJaW50IG1pbl9idWZzOworCWludCByZXQ7CiAKLQlJTklUX0xJU1RfSEVBRCgmZmltYy0+dmlkX2NhcC5wZW5kaW5nX2J1Zl9xKTsKLQlJTklUX0xJU1RfSEVBRCgmZmltYy0+dmlkX2NhcC5hY3RpdmVfYnVmX3EpOwotCWZpbWMtPnZpZF9jYXAuYWN0aXZlX2J1Zl9jbnQgPSAwOwotCWZpbWMtPnZpZF9jYXAuZnJhbWVfY291bnQgPSAwOwotCWZpbWMtPnZpZF9jYXAuYnVmX2luZGV4ID0gMDsKKwlmaW1jX2h3X3Jlc2V0KGZpbWMpOworCXZpZF9jYXAtPmZyYW1lX2NvdW50ID0gMDsKKworCXJldCA9IGZpbWNfaW5pdF9jYXB0dXJlKGZpbWMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CiAKIAlzZXRfYml0KFNUX0NBUFRfUEVORCwgJmZpbWMtPnN0YXRlKTsKIAorCW1pbl9idWZzID0gZmltYy0+dmlkX2NhcC5yZXFidWZzX2NvdW50ID4gMSA/IDIgOiAxOworCisJaWYgKHZpZF9jYXAtPmFjdGl2ZV9idWZfY250ID49IG1pbl9idWZzICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFNUX0NBUFRfU1RSRUFNLCAmZmltYy0+c3RhdGUpKSB7CisJCWZpbWNfYWN0aXZhdGVfY2FwdHVyZShjdHgpOworCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTVF9DQVBUX0lTUF9TVFJFQU0sICZmaW1jLT5zdGF0ZSkpCisJCQlmaW1jX3BpcGVsaW5lX3Nfc3RyZWFtKGZpbWMsIDEpOworCX0KKwogCXJldHVybiAwOworZXJyb3I6CisJZmltY19jYXB0dXJlX3N0YXRlX2NsZWFudXAoZmltYywgZmFsc2UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKQEAgLTI1NCw3ICsxOTcsNDYgQEAKIAlpZiAoIWZpbWNfY2FwdHVyZV9hY3RpdmUoZmltYykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGZpbWNfc3RvcF9jYXB0dXJlKGZpbWMpOworCXJldHVybiBmaW1jX3N0b3BfY2FwdHVyZShmaW1jLCBmYWxzZSk7Cit9CisKK2ludCBmaW1jX2NhcHR1cmVfc3VzcGVuZChzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJYm9vbCBzdXNwZW5kID0gZmltY19jYXB0dXJlX2J1c3koZmltYyk7CisKKwlpbnQgcmV0ID0gZmltY19zdG9wX2NhcHR1cmUoZmltYywgc3VzcGVuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gZmltY19waXBlbGluZV9zaHV0ZG93bihmaW1jKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2Yik7CisKK2ludCBmaW1jX2NhcHR1cmVfcmVzdW1lKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7CisJc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmOworCWludCBpOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoU1RfQ0FQVF9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJSU5JVF9MSVNUX0hFQUQoJmZpbWMtPnZpZF9jYXAuYWN0aXZlX2J1Zl9xKTsKKwl2aWRfY2FwLT5idWZfaW5kZXggPSAwOworCWZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZShmaW1jLCAmZmltYy0+dmlkX2NhcC52ZmQtPmVudGl0eSwKKwkJCQkgZmFsc2UpOworCWZpbWNfaW5pdF9jYXB0dXJlKGZpbWMpOworCisJY2xlYXJfYml0KFNUX0NBUFRfU1VTUEVOREVELCAmZmltYy0+c3RhdGUpOworCisJZm9yIChpID0gMDsgaSA8IHZpZF9jYXAtPnJlcWJ1ZnNfY291bnQ7IGkrKykgeworCQlpZiAobGlzdF9lbXB0eSgmdmlkX2NhcC0+cGVuZGluZ19idWZfcSkpCisJCQlicmVhazsKKwkJYnVmID0gZmltY19wZW5kaW5nX3F1ZXVlX3BvcCh2aWRfY2FwKTsKKwkJYnVmZmVyX3F1ZXVlKCZidWYtPnZiKTsKKwl9CisJcmV0dXJuIDA7CisKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRfcGxhbmVfc2l6ZShzdHJ1Y3QgZmltY19mcmFtZSAqZnIsIHVuc2lnbmVkIGludCBwbGFuZSkKQEAgLTI2NCw5ICsyNDYsOSBAQAogCXJldHVybiBmci0+Zl93aWR0aCAqIGZyLT5mX2hlaWdodCAqIGZyLT5mbXQtPmRlcHRoW3BsYW5lXSAvIDg7CiB9CiAKLXN0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJICAgICAgIHZvaWQgKmFsbG9jYXRvcnNbXSkKK3N0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsICBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLCB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NhdG9yc1tdKQogewogCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdnEtPmRydl9wcml2OwogCXN0cnVjdCBmaW1jX2ZtdCAqZm10ID0gY3R4LT5kX2ZyYW1lLmZtdDsKQEAgLTI4OSwyMSArMjcxLDIwIEBACiB7CiAJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOwogCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdnEtPmRydl9wcml2OwotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSAmY3R4LT5maW1jX2Rldi0+bTJtLnY0bDJfZGV2OwogCWludCBpOwogCi0JaWYgKCFjdHgtPmRfZnJhbWUuZm10IHx8IHZxLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJaWYgKGN0eC0+ZF9mcmFtZS5mbXQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY3R4LT5kX2ZyYW1lLmZtdC0+bWVtcGxhbmVzOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBzaXplID0gZ2V0X3BsYW5lX3NpemUoJmN0eC0+ZF9mcmFtZSwgaSk7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGN0eC0+ZF9mcmFtZS5wYXlsb2FkW2ldOwogCiAJCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgaSkgPCBzaXplKSB7Ci0JCQl2NGwyX2Vycih2NGwyX2RldiwgIlVzZXIgYnVmZmVyIHRvbyBzbWFsbCAoJWxkIDwgJWxkKVxuIiwKKwkJCXY0bDJfZXJyKGN0eC0+ZmltY19kZXYtPnZpZF9jYXAudmZkLAorCQkJCSAiVXNlciBidWZmZXIgdG9vIHNtYWxsICglbGQgPCAlbGQpXG4iLAogCQkJCSB2YjJfcGxhbmVfc2l6ZSh2YiwgaSksIHNpemUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQogCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIGksIHNpemUpOwogCX0KIApAQCAtMzEyLDEwICsyOTMsMTAgQEAKIAogc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKIAlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWYKIAkJPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBmaW1jX3ZpZF9idWZmZXIsIHZiKTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKIAlzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwID0gJmZpbWMtPnZpZF9jYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbWluX2J1ZnM7CkBAIC0zMjMsMTUgKzMwNCwxNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwogCWZpbWNfcHJlcGFyZV9hZGRyKGN0eCwgJmJ1Zi0+dmIsICZjdHgtPmRfZnJhbWUsICZidWYtPnBhZGRyKTsKIAotCWlmICghdGVzdF9iaXQoU1RfQ0FQVF9TVFJFQU0sICZmaW1jLT5zdGF0ZSkKLQkgICAgICYmIHZpZF9jYXAtPmFjdGl2ZV9idWZfY250IDwgRklNQ19NQVhfT1VUX0JVRlMpIHsKKwlpZiAoIXRlc3RfYml0KFNUX0NBUFRfU1VTUEVOREVELCAmZmltYy0+c3RhdGUpICYmCisJICAgICF0ZXN0X2JpdChTVF9DQVBUX1NUUkVBTSwgJmZpbWMtPnN0YXRlKSAmJgorCSAgICB2aWRfY2FwLT5hY3RpdmVfYnVmX2NudCA8IEZJTUNfTUFYX09VVF9CVUZTKSB7CiAJCS8qIFNldHVwIHRoZSBidWZmZXIgZGlyZWN0bHkgZm9yIHByb2Nlc3NpbmcuICovCiAJCWludCBidWZfaWQgPSAodmlkX2NhcC0+cmVxYnVmc19jb3VudCA9PSAxKSA/IC0xIDoKIAkJCQl2aWRfY2FwLT5idWZfaW5kZXg7CiAKIAkJZmltY19od19zZXRfb3V0cHV0X2FkZHIoZmltYywgJmJ1Zi0+cGFkZHIsIGJ1Zl9pZCk7CiAJCWJ1Zi0+aW5kZXggPSB2aWRfY2FwLT5idWZfaW5kZXg7Ci0JCWFjdGl2ZV9xdWV1ZV9hZGQodmlkX2NhcCwgYnVmKTsKKwkJZmltY19hY3RpdmVfcXVldWVfYWRkKHZpZF9jYXAsIGJ1Zik7CiAKIAkJaWYgKCsrdmlkX2NhcC0+YnVmX2luZGV4ID49IEZJTUNfTUFYX09VVF9CVUZTKQogCQkJdmlkX2NhcC0+YnVmX2luZGV4ID0gMDsKQEAgLTM0MSwxMCArMzIzLDE3IEBACiAKIAltaW5fYnVmcyA9IHZpZF9jYXAtPnJlcWJ1ZnNfY291bnQgPiAxID8gMiA6IDE7CiAKLQlpZiAodmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQgPj0gbWluX2J1ZnMgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoU1RfQ0FQVF9TVFJFQU0sICZmaW1jLT5zdGF0ZSkpCi0JCWZpbWNfYWN0aXZhdGVfY2FwdHVyZShjdHgpOwogCisJaWYgKHZiMl9pc19zdHJlYW1pbmcoJnZpZF9jYXAtPnZicSkgJiYKKwkgICAgdmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQgPj0gbWluX2J1ZnMgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoU1RfQ0FQVF9TVFJFQU0sICZmaW1jLT5zdGF0ZSkpIHsKKwkJZmltY19hY3RpdmF0ZV9jYXB0dXJlKGN0eCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNUX0NBUFRfSVNQX1NUUkVBTSwgJmZpbWMtPnN0YXRlKSkKKwkJCWZpbWNfcGlwZWxpbmVfc19zdHJlYW0oZmltYywgMSk7CisJCXJldHVybjsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMzcwLDEwICszNTksNDAgQEAKIAkuc3RvcF9zdHJlYW1pbmcJCT0gc3RvcF9zdHJlYW1pbmcsCiB9OwogCisvKioKKyAqIGZpbWNfY2FwdHVyZV9jdHJsc19jcmVhdGUgLSBpbml0aWFsaXplIHRoZSBjb250cm9sIGhhbmRsZXIKKyAqIEluaXRpYWxpemUgdGhlIGNhcHR1cmUgdmlkZW8gbm9kZSBjb250cm9sIGhhbmRsZXIgYW5kIGZpbGwgaXQKKyAqIHdpdGggdGhlIEZJTUMgY29udHJvbHMuIEluaGVyaXQgYW55IHNlbnNvcidzIGNvbnRyb2xzIGlmIHRoZQorICogJ3VzZXJfc3ViZGV2X2FwaScgZmxhZyBpcyBmYWxzZSAoZGVmYXVsdCBiZWhhdmlvdXIpLgorICogVGhpcyBmdW5jdGlvbiBuZWVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBncmFwaCBtdXRleCBoZWxkLgorICovCitpbnQgZmltY19jYXB0dXJlX2N0cmxzX2NyZWF0ZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCA9ICZmaW1jLT52aWRfY2FwOworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTih2aWRfY2FwLT5jdHggPT0gTlVMTCkpCisJCXJldHVybiAtRU5YSU87CisJaWYgKHZpZF9jYXAtPmN0eC0+Y3RybHNfcmR5KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGZpbWNfY3RybHNfY3JlYXRlKHZpZF9jYXAtPmN0eCk7CisJaWYgKHJldCB8fCB2aWRfY2FwLT51c2VyX3N1YmRldl9hcGkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdjRsMl9jdHJsX2FkZF9oYW5kbGVyKCZ2aWRfY2FwLT5jdHgtPmN0cmxfaGFuZGxlciwKKwkJCQkgICAgZmltYy0+cGlwZWxpbmUuc2Vuc29yLT5jdHJsX2hhbmRsZXIpOworfQorCitzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9zZXRfZGVmYXVsdF9mb3JtYXQoc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKKwogc3RhdGljIGludCBmaW1jX2NhcHR1cmVfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCByZXQgPSAwOworCWludCByZXQgPSB2NGwyX2ZoX29wZW4oZmlsZSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJZGJnKCJwaWQ6ICVkLCBzdGF0ZTogMHglbHgiLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgZmltYy0+c3RhdGUpOwogCkBAIC0zODEsMTcgKzQwMCwyNyBAQAogCWlmIChmaW1jX20ybV9hY3RpdmUoZmltYykpCiAJCXJldHVybiAtRUJVU1k7CiAKKwlzZXRfYml0KFNUX0NBUFRfQlVTWSwgJmZpbWMtPnN0YXRlKTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZmaW1jLT5wZGV2LT5kZXYpOworCiAJaWYgKCsrZmltYy0+dmlkX2NhcC5yZWZjbnQgPT0gMSkgewotCQlyZXQgPSBmaW1jX2lzcF9zdWJkZXZfaW5pdChmaW1jLCAwKTsKLQkJaWYgKHJldCkgeworCQlyZXQgPSBmaW1jX3BpcGVsaW5lX2luaXRpYWxpemUoZmltYywKKwkJCSAgICAgICAmZmltYy0+dmlkX2NhcC52ZmQtPmVudGl0eSwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZmaW1jLT5wZGV2LT5kZXYsCisJCQkJIlZpZGVvIHBpcGVsaW5lIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CisJCQlwbV9ydW50aW1lX3B1dF9zeW5jKCZmaW1jLT5wZGV2LT5kZXYpOwogCQkJZmltYy0+dmlkX2NhcC5yZWZjbnQtLTsKLQkJCXJldHVybiAtRUlPOworCQkJdjRsMl9maF9yZWxlYXNlKGZpbGUpOworCQkJY2xlYXJfYml0KFNUX0NBUFRfQlVTWSwgJmZpbWMtPnN0YXRlKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KKwkJcmV0ID0gZmltY19jYXB0dXJlX2N0cmxzX2NyZWF0ZShmaW1jKTsKKworCQlpZiAoIXJldCAmJiAhZmltYy0+dmlkX2NhcC51c2VyX3N1YmRldl9hcGkpCisJCQlyZXQgPSBmaW1jX2NhcHR1cmVfc2V0X2RlZmF1bHRfZm9ybWF0KGZpbWMpOwogCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZpbWMtPnZpZF9jYXAuY3R4OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcHR1cmVfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCkBAIC00MDEsMzcgKzQzMCwzNiBAQAogCWRiZygicGlkOiAlZCwgc3RhdGU6IDB4JWx4IiwgdGFza19waWRfbnIoY3VycmVudCksIGZpbWMtPnN0YXRlKTsKIAogCWlmICgtLWZpbWMtPnZpZF9jYXAucmVmY250ID09IDApIHsKLQkJZmltY19zdG9wX2NhcHR1cmUoZmltYyk7Ci0JCXZiMl9xdWV1ZV9yZWxlYXNlKCZmaW1jLT52aWRfY2FwLnZicSk7Ci0KLQkJdjRsMl9lcnIoJmZpbWMtPnZpZF9jYXAudjRsMl9kZXYsICJyZWxlYXNpbmcgSVNQXG4iKTsKLQotCQl2NGwyX3N1YmRldl9jYWxsKGZpbWMtPnZpZF9jYXAuc2QsIGNvcmUsIHNfcG93ZXIsIDApOwotCQljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tDTEtfQ0FNXSk7Ci0JCWZpbWNfc3ViZGV2X3VucmVnaXN0ZXIoZmltYyk7CisJCWNsZWFyX2JpdChTVF9DQVBUX0JVU1ksICZmaW1jLT5zdGF0ZSk7CisJCWZpbWNfc3RvcF9jYXB0dXJlKGZpbWMsIGZhbHNlKTsKKwkJZmltY19waXBlbGluZV9zaHV0ZG93bihmaW1jKTsKKwkJY2xlYXJfYml0KFNUX0NBUFRfU1VTUEVOREVELCAmZmltYy0+c3RhdGUpOwogCX0KIAotCXJldHVybiAwOworCXBtX3J1bnRpbWVfcHV0KCZmaW1jLT5wZGV2LT5kZXYpOworCisJaWYgKGZpbWMtPnZpZF9jYXAucmVmY250ID09IDApIHsKKwkJdmIyX3F1ZXVlX3JlbGVhc2UoJmZpbWMtPnZpZF9jYXAudmJxKTsKKwkJZmltY19jdHJsc19kZWxldGUoZmltYy0+dmlkX2NhcC5jdHgpOworCX0KKwlyZXR1cm4gdjRsMl9maF9yZWxlYXNlKGZpbGUpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZpbWNfY2FwdHVyZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKIAlyZXR1cm4gdmIyX3BvbGwoJmZpbWMtPnZpZF9jYXAudmJxLCBmaWxlLCB3YWl0KTsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcHR1cmVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJcmV0dXJuIHZiMl9tbWFwKCZmaW1jLT52aWRfY2FwLnZicSwgdm1hKTsKIH0KIAotLyogdmlkZW8gZGV2aWNlIGZpbGUgb3BlcmF0aW9ucyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBmaW1jX2NhcHR1cmVfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZmltY19jYXB0dXJlX29wZW4sCkBAIC00NDEsMjYzICs0NjksNTUzIEBACiAJLm1tYXAJCT0gZmltY19jYXB0dXJlX21tYXAsCiB9OwogCisvKgorICogRm9ybWF0IGFuZCBjcm9wIG5lZ290aWF0aW9uIGhlbHBlcnMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbWNfZm10ICpmaW1jX2NhcHR1cmVfdHJ5X2Zvcm1hdChzdHJ1Y3QgZmltY19jdHggKmN0eCwKKwkJCQkJCXUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0LAorCQkJCQkJdTMyICpjb2RlLCB1MzIgKmZvdXJjYywgaW50IHBhZCkKK3sKKwlib29sIHJvdGF0aW9uID0gY3R4LT5yb3RhdGlvbiA9PSA5MCB8fCBjdHgtPnJvdGF0aW9uID09IDI3MDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyID0gZmltYy0+dmFyaWFudDsKKwlzdHJ1Y3QgZmltY19waXhfbGltaXQgKnBsID0gdmFyLT5waXhfbGltaXQ7CisJc3RydWN0IGZpbWNfZnJhbWUgKmRzdCA9ICZjdHgtPmRfZnJhbWU7CisJdTMyIGRlcHRoLCBtaW5fdywgbWF4X3csIG1pbl9oLCBhbGlnbl9oID0gMzsKKwl1MzIgbWFzayA9IEZNVF9GTEFHU19DQU07CisJc3RydWN0IGZpbWNfZm10ICpmZm10OworCisJLyogQ29sb3IgY29udmVyc2lvbiBmcm9tL3RvIEpQRUcgaXMgbm90IHN1cHBvcnRlZCAqLworCWlmIChjb2RlICYmIGN0eC0+c19mcmFtZS5mbXQgJiYgcGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSAmJgorCSAgICBmaW1jX2ZtdF9pc19qcGVnKGN0eC0+c19mcmFtZS5mbXQtPmNvbG9yKSkKKwkJKmNvZGUgPSBWNEwyX01CVVNfRk1UX0pQRUdfMVg4OworCisJaWYgKGZvdXJjYyAmJiAqZm91cmNjICE9IFY0TDJfUElYX0ZNVF9KUEVHICYmIHBhZCAhPSBGSU1DX1NEX1BBRF9TSU5LKQorCQltYXNrIHw9IEZNVF9GTEFHU19NMk07CisKKwlmZm10ID0gZmltY19maW5kX2Zvcm1hdChmb3VyY2MsIGNvZGUsIG1hc2ssIDApOworCWlmIChXQVJOX09OKCFmZm10KSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGNvZGUpCisJCSpjb2RlID0gZmZtdC0+bWJ1c19jb2RlOworCWlmIChmb3VyY2MpCisJCSpmb3VyY2MgPSBmZm10LT5mb3VyY2M7CisKKwlpZiAocGFkID09IEZJTUNfU0RfUEFEX1NJTkspIHsKKwkJbWF4X3cgPSBmaW1jX2ZtdF9pc19qcGVnKGZmbXQtPmNvbG9yKSA/CisJCQlwbC0+c2NhbGVyX2Rpc193IDogcGwtPnNjYWxlcl9lbl93OworCQkvKiBBcHBseSB0aGUgY2FtZXJhIGlucHV0IGludGVyZmFjZSBwaXhlbCBjb25zdHJhaW50cyAqLworCQl2NGxfYm91bmRfYWxpZ25faW1hZ2Uod2lkdGgsIG1heF90KHUzMiwgKndpZHRoLCAzMiksIG1heF93LCA0LAorCQkJCSAgICAgIGhlaWdodCwgbWF4X3QodTMyLCAqaGVpZ2h0LCAzMiksCisJCQkJICAgICAgRklNQ19DQU1JRl9NQVhfSEVJR0hULAorCQkJCSAgICAgIGZpbWNfZm10X2lzX2pwZWcoZmZtdC0+Y29sb3IpID8gMyA6IDEsCisJCQkJICAgICAgMCk7CisJCXJldHVybiBmZm10OworCX0KKwkvKiBDYW4ndCBzY2FsZSBvciBjcm9wIGluIHRyYW5zcGFyZW50IChKUEVHKSB0cmFuc2ZlciBtb2RlICovCisJaWYgKGZpbWNfZm10X2lzX2pwZWcoZmZtdC0+Y29sb3IpKSB7CisJCSp3aWR0aCAgPSBjdHgtPnNfZnJhbWUuZl93aWR0aDsKKwkJKmhlaWdodCA9IGN0eC0+c19mcmFtZS5mX2hlaWdodDsKKwkJcmV0dXJuIGZmbXQ7CisJfQorCS8qIEFwcGx5IHRoZSBzY2FsZXIgYW5kIHRoZSBvdXRwdXQgRE1BIGNvbnN0cmFpbnRzICovCisJbWF4X3cgPSByb3RhdGlvbiA/IHBsLT5vdXRfcm90X2VuX3cgOiBwbC0+b3V0X3JvdF9kaXNfdzsKKwltaW5fdyA9IGN0eC0+c3RhdGUgJiBGSU1DX0RTVF9DUk9QID8gZHN0LT53aWR0aCA6IHZhci0+bWluX291dF9waXhzaXplOworCW1pbl9oID0gY3R4LT5zdGF0ZSAmIEZJTUNfRFNUX0NST1AgPyBkc3QtPmhlaWdodCA6IHZhci0+bWluX291dF9waXhzaXplOworCWlmIChmaW1jLT5pZCA9PSAxICYmIHZhci0+cGl4X2hvZmYpCisJCWFsaWduX2ggPSBmaW1jX2ZtdF9pc19yZ2IoZmZtdC0+Y29sb3IpID8gMCA6IDE7CisKKwlkZXB0aCA9IGZpbWNfZ2V0X2Zvcm1hdF9kZXB0aChmZm10KTsKKwl2NGxfYm91bmRfYWxpZ25faW1hZ2Uod2lkdGgsIG1pbl93LCBtYXhfdywKKwkJCSAgICAgIGZmcyh2YXItPm1pbl9vdXRfcGl4c2l6ZSkgLSAxLAorCQkJICAgICAgaGVpZ2h0LCBtaW5faCwgRklNQ19DQU1JRl9NQVhfSEVJR0hULAorCQkJICAgICAgYWxpZ25faCwKKwkJCSAgICAgIDY0LyhBTElHTihkZXB0aCwgOCkpKTsKKworCWRiZygicGFkJWQ6IGNvZGU6IDB4JXgsICVkeCVkLiBkc3QgZm10OiAlZHglZCIsCisJICAgIHBhZCwgY29kZSA/ICpjb2RlIDogMCwgKndpZHRoLCAqaGVpZ2h0LAorCSAgICBkc3QtPmZfd2lkdGgsIGRzdC0+Zl9oZWlnaHQpOworCisJcmV0dXJuIGZmbXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfY2FwdHVyZV90cnlfY3JvcChzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IHY0bDJfcmVjdCAqciwKKwkJCQkgIGludCBwYWQpCit7CisJYm9vbCByb3RhdGUgPSBjdHgtPnJvdGF0aW9uID09IDkwIHx8IGN0eC0+cm90YXRpb24gPT0gMjcwOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXIgPSBmaW1jLT52YXJpYW50OworCXN0cnVjdCBmaW1jX3BpeF9saW1pdCAqcGwgPSB2YXItPnBpeF9saW1pdDsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqc2luayA9ICZjdHgtPnNfZnJhbWU7CisJdTMyIG1heF93LCBtYXhfaCwgbWluX3cgPSAwLCBtaW5faCA9IDAsIG1pbl9zejsKKwl1MzIgYWxpZ25fc3ogPSAwLCBhbGlnbl9oID0gNDsKKwl1MzIgbWF4X3NjX2gsIG1heF9zY192OworCisJLyogSW4gSlBFRyB0cmFuc3BhcmVudCB0cmFuc2ZlciBtb2RlIGNyb3BwaW5nIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoZmltY19mbXRfaXNfanBlZyhjdHgtPmRfZnJhbWUuZm10LT5jb2xvcikpIHsKKwkJci0+d2lkdGggID0gc2luay0+Zl93aWR0aDsKKwkJci0+aGVpZ2h0ID0gc2luay0+Zl9oZWlnaHQ7CisJCXItPmxlZnQgICA9IHItPnRvcCA9IDA7CisJCXJldHVybjsKKwl9CisJaWYgKHBhZCA9PSBGSU1DX1NEX1BBRF9TT1VSQ0UpIHsKKwkJaWYgKGN0eC0+cm90YXRpb24gIT0gOTAgJiYgY3R4LT5yb3RhdGlvbiAhPSAyNzApCisJCQlhbGlnbl9oID0gMTsKKwkJbWF4X3NjX2ggPSBtaW4oU0NBTEVSX01BWF9IUkFUSU8sIDEgPDwgKGZmcyhzaW5rLT53aWR0aCkgLSAzKSk7CisJCW1heF9zY192ID0gbWluKFNDQUxFUl9NQVhfVlJBVElPLCAxIDw8IChmZnMoc2luay0+aGVpZ2h0KSAtIDEpKTsKKwkJbWluX3N6ID0gdmFyLT5taW5fb3V0X3BpeHNpemU7CisJfSBlbHNlIHsKKwkJdTMyIGRlcHRoID0gZmltY19nZXRfZm9ybWF0X2RlcHRoKHNpbmstPmZtdCk7CisJCWFsaWduX3N6ID0gNjQvQUxJR04oZGVwdGgsIDgpOworCQltaW5fc3ogPSB2YXItPm1pbl9pbnBfcGl4c2l6ZTsKKwkJbWluX3cgPSBtaW5faCA9IG1pbl9zejsKKwkJbWF4X3NjX2ggPSBtYXhfc2NfdiA9IDE7CisJfQorCS8qCisJICogRm9yIHRoZSBjcm9wIHJlY3RhbmdsZSBhdCBzb3VyY2UgcGFkIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMKKwkgKiBtdXN0IGJlIG1ldDoKKwkgKiAtIGl0IG11c3QgZml0IGluIHRoZSBzaW5rIHBhZCBmb3JtYXQgcmVjdGFuZ2xlIChmX3dpZHRoL2ZfaGVpZ2h0KTsKKwkgKiAtIG1heGltdW0gZG93bnNjYWxpbmcgcmF0aW8gaXMgNjQ7CisJICogLSBtYXhpbXVtIGNyb3Agc2l6ZSBkZXBlbmRzIGlmIHRoZSByb3RhdG9yIGlzIHVzZWQgb3Igbm90OworCSAqIC0gdGhlIHNpbmsgcGFkIGZvcm1hdCB3aWR0aC9oZWlnaHQgbXVzdCBiZSA0IG11bHRpcGxlIG9mIHRoZQorCSAqICAgcHJlc2NhbGVyIHJhdGlvcyBkZXRlcm1pbmVkIGJ5IHNpbmsgcGFkIHNpemUgYW5kIHNvdXJjZSBwYWQgY3JvcCwKKwkgKiAgIHRoZSBwcmVzY2FsZXIgcmF0aW8gaXMgcmV0dXJuZWQgYnkgZmltY19nZXRfc2NhbGVyX2ZhY3RvcigpLgorCSAqLworCW1heF93ID0gbWluX3QodTMyLAorCQkgICAgICByb3RhdGUgPyBwbC0+b3V0X3JvdF9lbl93IDogcGwtPm91dF9yb3RfZGlzX3csCisJCSAgICAgIHJvdGF0ZSA/IHNpbmstPmZfaGVpZ2h0IDogc2luay0+Zl93aWR0aCk7CisJbWF4X2ggPSBtaW5fdCh1MzIsIEZJTUNfQ0FNSUZfTUFYX0hFSUdIVCwgc2luay0+Zl9oZWlnaHQpOworCWlmIChwYWQgPT0gRklNQ19TRF9QQURfU09VUkNFKSB7CisJCW1pbl93ID0gbWluX3QodTMyLCBtYXhfdywgc2luay0+Zl93aWR0aCAvIG1heF9zY19oKTsKKwkJbWluX2ggPSBtaW5fdCh1MzIsIG1heF9oLCBzaW5rLT5mX2hlaWdodCAvIG1heF9zY192KTsKKwkJaWYgKHJvdGF0ZSkgeworCQkJc3dhcChtYXhfc2NfaCwgbWF4X3NjX3YpOworCQkJc3dhcChtaW5fdywgbWluX2gpOworCQl9CisJfQorCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmci0+d2lkdGgsIG1pbl93LCBtYXhfdywgZmZzKG1pbl9zeikgLSAxLAorCQkJICAgICAgJnItPmhlaWdodCwgbWluX2gsIG1heF9oLCBhbGlnbl9oLAorCQkJICAgICAgYWxpZ25fc3opOworCS8qIEFkanVzdCBsZWZ0L3RvcCBpZiBjcm9wcGluZyByZWN0YW5nbGUgaXMgb3V0IG9mIGJvdW5kcyAqLworCXItPmxlZnQgPSBjbGFtcF90KHUzMiwgci0+bGVmdCwgMCwgc2luay0+Zl93aWR0aCAtIHItPndpZHRoKTsKKwlyLT50b3AgID0gY2xhbXBfdCh1MzIsIHItPnRvcCwgMCwgc2luay0+Zl9oZWlnaHQgLSByLT5oZWlnaHQpOworCXItPmxlZnQgPSByb3VuZF9kb3duKHItPmxlZnQsIHZhci0+aG9yX29mZnNfYWxpZ24pOworCisJZGJnKCJwYWQlZDogKCVkLCVkKS8lZHglZCwgc2luayBmbXQ6ICVkeCVkIiwKKwkgICAgcGFkLCByLT5sZWZ0LCByLT50b3AsIHItPndpZHRoLCByLT5oZWlnaHQsCisJICAgIHNpbmstPmZfd2lkdGgsIHNpbmstPmZfaGVpZ2h0KTsKK30KKworLyoKKyAqIFRoZSB2aWRlbyBub2RlIGlvY3RsIG9wZXJhdGlvbnMKKyAqLwogc3RhdGljIGludCBmaW1jX3ZpZGlvY19xdWVyeWNhcF9jYXB0dXJlKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCiAJc3RybmNweShjYXAtPmRyaXZlciwgZmltYy0+cGRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkU7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfCBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORTsKIAogCXJldHVybiAwOwogfQogCi0vKiBTeW5jaHJvbml6ZSBmb3JtYXRzIG9mIHRoZSBjYW1lcmEgaW50ZXJmYWNlIGlucHV0IGFuZCBhdHRhY2hlZCAgc2Vuc29yLiAqLwotc3RhdGljIGludCBzeW5jX2NhcHR1cmVfZm10KHN0cnVjdCBmaW1jX2N0eCAqY3R4KQorc3RhdGljIGludCBmaW1jX2NhcF9lbnVtX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCiB7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lID0gJmN0eC0+c19mcmFtZTsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCA9ICZmaW1jLT52aWRfY2FwLmZtdDsKLQlpbnQgcmV0OworCXN0cnVjdCBmaW1jX2ZtdCAqZm10OwogCi0JZm10LT53aWR0aCAgPSBjdHgtPmRfZnJhbWUub193aWR0aDsKLQlmbXQtPmhlaWdodCA9IGN0eC0+ZF9mcmFtZS5vX2hlaWdodDsKLQotCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgdmlkZW8sIHNfbWJ1c19mbXQsIGZtdCk7Ci0JaWYgKHJldCA9PSAtRU5PSU9DVExDTUQpIHsKLQkJZXJyKCJzX21idXNfZm10IGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlkYmcoInc6ICVkLCBoOiAlZCwgY29kZT0gJWQiLCBmbXQtPndpZHRoLCBmbXQtPmhlaWdodCwgZm10LT5jb2RlKTsKLQotCWZyYW1lLT5mbXQgPSBmaW5kX21idXNfZm9ybWF0KGZtdCwgRk1UX0ZMQUdTX0NBTSk7Ci0JaWYgKCFmcmFtZS0+Zm10KSB7Ci0JCWVycigiZmltYyBzb3VyY2UgZm9ybWF0IG5vdCBmb3VuZFxuIik7CisJZm10ID0gZmltY19maW5kX2Zvcm1hdChOVUxMLCBOVUxMLCBGTVRfRkxBR1NfQ0FNIHwgRk1UX0ZMQUdTX00yTSwKKwkJCSAgICAgICBmLT5pbmRleCk7CisJaWYgKCFmbXQpCiAJCXJldHVybiAtRUlOVkFMOworCXN0cm5jcHkoZi0+ZGVzY3JpcHRpb24sIGZtdC0+bmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSAtIDEpOworCWYtPnBpeGVsZm9ybWF0ID0gZm10LT5mb3VyY2M7CisJaWYgKGZtdC0+Zm91cmNjID09IFY0TDJfTUJVU19GTVRfSlBFR18xWDgpCisJCWYtPmZsYWdzIHw9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaW1jX3BpcGVsaW5lX3RyeV9mb3JtYXQgLSBuZWdvdGlhdGUgYW5kL29yIHNldCBmb3JtYXRzIGF0IHBpcGVsaW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cworICogQGN0eDogRklNQyBjYXB0dXJlIGNvbnRleHQKKyAqIEB0Zm10OiBtZWRpYSBidXMgZm9ybWF0IHRvIHRyeS9zZXQgb24gc3ViZGV2cworICogQGZtdF9pZDogZmltYyBwaXhlbCBmb3JtYXQgaWQgY29ycmVzcG9uZGluZyB0byByZXR1cm5lZCBAdGZtdCAob3V0cHV0KQorICogQHNldDogdHJ1ZSB0byBzZXQgZm9ybWF0IG9uIHN1YmRldnMsIGZhbHNlIHRvIHRyeSBvbmx5CisgKi8KK3N0YXRpYyBpbnQgZmltY19waXBlbGluZV90cnlfZm9ybWF0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICp0Zm10LAorCQkJCSAgICBzdHJ1Y3QgZmltY19mbXQgKipmbXRfaWQsCisJCQkJICAgIGJvb2wgc2V0KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGZpbWMtPnBpcGVsaW5lLnNlbnNvcjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaXMgPSBmaW1jLT5waXBlbGluZS5jc2lzOworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgc2ZtdDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZiA9ICZzZm10LmZvcm1hdDsKKwlzdHJ1Y3QgZmltY19mbXQgKmZmbXQgPSBOVUxMOworCWludCByZXQsIGkgPSAwOworCisJaWYgKFdBUk5fT04oIXNkIHx8ICF0Zm10KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJnNmbXQsIDAsIHNpemVvZihzZm10KSk7CisJc2ZtdC5mb3JtYXQgPSAqdGZtdDsKKworCXNmbXQud2hpY2ggPSBzZXQgPyBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFIDogVjRMMl9TVUJERVZfRk9STUFUX1RSWTsKKwl3aGlsZSAoMSkgeworCQlmZm10ID0gZmltY19maW5kX2Zvcm1hdChOVUxMLCBtZi0+Y29kZSAhPSAwID8gJm1mLT5jb2RlIDogTlVMTCwKKwkJCQkJRk1UX0ZMQUdTX0NBTSwgaSsrKTsKKwkJaWYgKGZmbXQgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIE5vdGlmeSB1c2VyLXNwYWNlIGlmIGNvbW1vbiBwaXhlbCBjb2RlIGZvcgorCQkJICogaG9zdCBhbmQgc2Vuc29yIGRvZXMgbm90IGV4aXN0LgorCQkJICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZi0+Y29kZSA9IHRmbXQtPmNvZGUgPSBmZm10LT5tYnVzX2NvZGU7CisKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgcGFkLCBzZXRfZm10LCBOVUxMLCAmc2ZtdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAobWYtPmNvZGUgIT0gdGZtdC0+Y29kZSkgeworCQkJbWYtPmNvZGUgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG1mLT53aWR0aCAhPSB0Zm10LT53aWR0aCB8fCBtZi0+d2lkdGggIT0gdGZtdC0+d2lkdGgpIHsKKwkJCXUzMiBmY2MgPSBmZm10LT5mb3VyY2M7CisJCQl0Zm10LT53aWR0aCAgPSBtZi0+d2lkdGg7CisJCQl0Zm10LT5oZWlnaHQgPSBtZi0+aGVpZ2h0OworCQkJZmZtdCA9IGZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KGN0eCwKKwkJCQkJICAgICAgICZ0Zm10LT53aWR0aCwgJnRmbXQtPmhlaWdodCwKKwkJCQkJICAgICAgIE5VTEwsICZmY2MsIEZJTUNfU0RfUEFEX1NPVVJDRSk7CisJCQlpZiAoZmZtdCAmJiBmZm10LT5tYnVzX2NvZGUpCisJCQkJbWYtPmNvZGUgPSBmZm10LT5tYnVzX2NvZGU7CisJCQlpZiAobWYtPndpZHRoICE9IHRmbXQtPndpZHRoIHx8IG1mLT53aWR0aCAhPSB0Zm10LT53aWR0aCkKKwkJCQljb250aW51ZTsKKwkJCXRmbXQtPmNvZGUgPSBtZi0+Y29kZTsKKwkJfQorCQlpZiAoY3NpcykKKwkJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY3NpcywgcGFkLCBzZXRfZm10LCBOVUxMLCAmc2ZtdCk7CisKKwkJaWYgKG1mLT5jb2RlID09IHRmbXQtPmNvZGUgJiYKKwkJICAgIG1mLT53aWR0aCA9PSB0Zm10LT53aWR0aCAmJiBtZi0+d2lkdGggPT0gdGZtdC0+d2lkdGgpCisJCQlicmVhazsKIAl9CiAKLQlmcmFtZS0+Zl93aWR0aAk9IGZtdC0+d2lkdGg7Ci0JZnJhbWUtPmZfaGVpZ2h0ID0gZm10LT5oZWlnaHQ7Ci0JZnJhbWUtPndpZHRoCT0gZm10LT53aWR0aDsKLQlmcmFtZS0+aGVpZ2h0CT0gZm10LT5oZWlnaHQ7Ci0JZnJhbWUtPm9fd2lkdGgJPSBmbXQtPndpZHRoOwotCWZyYW1lLT5vX2hlaWdodCA9IGZtdC0+aGVpZ2h0OwotCWZyYW1lLT5vZmZzX2gJPSAwOwotCWZyYW1lLT5vZmZzX3YJPSAwOworCWlmIChmbXRfaWQgJiYgZmZtdCkKKwkJKmZtdF9pZCA9IGZmbXQ7CisJKnRmbXQgPSAqbWY7CiAKKwlkYmcoImNvZGU6IDB4JXgsICVkeCVkLCAlcCIsIG1mLT5jb2RlLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQsIGZmbXQpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGZpbWNfY2FwX2dfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisKKwlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBmaW1jX2ZpbGxfZm9ybWF0KCZjdHgtPmRfZnJhbWUsIGYpOworfQorCitzdGF0aWMgaW50IGZpbWNfY2FwX3RyeV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeCA9ICZmLT5mbXQucGl4X21wOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaW1jLT52aWRfY2FwLmN0eDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOworCXN0cnVjdCBmaW1jX2ZtdCAqZmZtdCA9IE5VTEw7CisKKwlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9KUEVHKSB7CisJCWZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KGN0eCwgJnBpeC0+d2lkdGgsICZwaXgtPmhlaWdodCwKKwkJCQkJTlVMTCwgJnBpeC0+cGl4ZWxmb3JtYXQsCisJCQkJCUZJTUNfU0RfUEFEX1NJTkspOworCQljdHgtPnNfZnJhbWUuZl93aWR0aCAgPSBwaXgtPndpZHRoOworCQljdHgtPnNfZnJhbWUuZl9oZWlnaHQgPSBwaXgtPmhlaWdodDsKKwl9CisJZmZtdCA9IGZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KGN0eCwgJnBpeC0+d2lkdGgsICZwaXgtPmhlaWdodCwKKwkJCQkgICAgICAgTlVMTCwgJnBpeC0+cGl4ZWxmb3JtYXQsCisJCQkJICAgICAgIEZJTUNfU0RfUEFEX1NPVVJDRSk7CisJaWYgKCFmZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmltYy0+dmlkX2NhcC51c2VyX3N1YmRldl9hcGkpIHsKKwkJbWYud2lkdGggID0gcGl4LT53aWR0aDsKKwkJbWYuaGVpZ2h0ID0gcGl4LT5oZWlnaHQ7CisJCW1mLmNvZGUgICA9IGZmbXQtPm1idXNfY29kZTsKKwkJZmltY19tZF9ncmFwaF9sb2NrKGZpbWMpOworCQlmaW1jX3BpcGVsaW5lX3RyeV9mb3JtYXQoY3R4LCAmbWYsICZmZm10LCBmYWxzZSk7CisJCWZpbWNfbWRfZ3JhcGhfdW5sb2NrKGZpbWMpOworCisJCXBpeC0+d2lkdGgJID0gbWYud2lkdGg7CisJCXBpeC0+aGVpZ2h0CSA9IG1mLmhlaWdodDsKKwkJaWYgKGZmbXQpCisJCQlwaXgtPnBpeGVsZm9ybWF0ID0gZmZtdC0+Zm91cmNjOworCX0KKworCWZpbWNfYWRqdXN0X21wbGFuZV9mb3JtYXQoZmZtdCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQsIHBpeCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfY2FwdHVyZV9tYXJrX2pwZWdfeGZlcihzdHJ1Y3QgZmltY19jdHggKmN0eCwgYm9vbCBqcGVnKQoreworCWN0eC0+c2NhbGVyLmVuYWJsZWQgPSAhanBlZzsKKwlmaW1jX2N0cmxzX2FjdGl2YXRlKGN0eCwgIWpwZWcpOworCisJaWYgKGpwZWcpCisJCXNldF9iaXQoU1RfQ0FQVF9KUEVHLCAmY3R4LT5maW1jX2Rldi0+c3RhdGUpOworCWVsc2UKKwkJY2xlYXJfYml0KFNUX0NBUFRfSlBFRywgJmN0eC0+ZmltY19kZXYtPnN0YXRlKTsKK30KKworc3RhdGljIGludCBmaW1jX2NhcHR1cmVfc2V0X2Zvcm1hdChzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXggPSAmZi0+Zm10LnBpeF9tcDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZiA9ICZmaW1jLT52aWRfY2FwLm1mOworCXN0cnVjdCBmaW1jX2ZyYW1lICpmZiA9ICZjdHgtPmRfZnJhbWU7CisJc3RydWN0IGZpbWNfZm10ICpzX2ZtdCA9IE5VTEw7CisJaW50IHJldCwgaTsKKworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YjJfaXNfYnVzeSgmZmltYy0+dmlkX2NhcC52YnEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogUHJlLWNvbmZpZ3VyZSBmb3JtYXQgYXQgY2FtZXJhIGludGVyZmFjZSBpbnB1dCwgZm9yIEpQRUcgb25seSAqLworCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9KUEVHKSB7CisJCWZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KGN0eCwgJnBpeC0+d2lkdGgsICZwaXgtPmhlaWdodCwKKwkJCQkJTlVMTCwgJnBpeC0+cGl4ZWxmb3JtYXQsCisJCQkJCUZJTUNfU0RfUEFEX1NJTkspOworCQljdHgtPnNfZnJhbWUuZl93aWR0aCAgPSBwaXgtPndpZHRoOworCQljdHgtPnNfZnJhbWUuZl9oZWlnaHQgPSBwaXgtPmhlaWdodDsKKwl9CisJLyogVHJ5IHRoZSBmb3JtYXQgYXQgdGhlIHNjYWxlciBhbmQgdGhlIERNQSBvdXRwdXQgKi8KKwlmZi0+Zm10ID0gZmltY19jYXB0dXJlX3RyeV9mb3JtYXQoY3R4LCAmcGl4LT53aWR0aCwgJnBpeC0+aGVpZ2h0LAorCQkJCQkgIE5VTEwsICZwaXgtPnBpeGVsZm9ybWF0LAorCQkJCQkgIEZJTUNfU0RfUEFEX1NPVVJDRSk7CisJaWYgKCFmZi0+Zm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBUcnkgdG8gbWF0Y2ggZm9ybWF0IGF0IHRoZSBob3N0IGFuZCB0aGUgc2Vuc29yICovCisJaWYgKCFmaW1jLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSkgeworCQltZi0+Y29kZSAgID0gZmYtPmZtdC0+bWJ1c19jb2RlOworCQltZi0+d2lkdGggID0gcGl4LT53aWR0aDsKKwkJbWYtPmhlaWdodCA9IHBpeC0+aGVpZ2h0OworCisJCWZpbWNfbWRfZ3JhcGhfbG9jayhmaW1jKTsKKwkJcmV0ID0gZmltY19waXBlbGluZV90cnlfZm9ybWF0KGN0eCwgbWYsICZzX2ZtdCwgdHJ1ZSk7CisJCWZpbWNfbWRfZ3JhcGhfdW5sb2NrKGZpbWMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcGl4LT53aWR0aCAgPSBtZi0+d2lkdGg7CisJCXBpeC0+aGVpZ2h0ID0gbWYtPmhlaWdodDsKKwl9CisJZmltY19hZGp1c3RfbXBsYW5lX2Zvcm1hdChmZi0+Zm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCwgcGl4KTsKKwlmb3IgKGkgPSAwOyBpIDwgZmYtPmZtdC0+Y29scGxhbmVzOyBpKyspCisJCWZmLT5wYXlsb2FkW2ldID0KKwkJCShwaXgtPndpZHRoICogcGl4LT5oZWlnaHQgKiBmZi0+Zm10LT5kZXB0aFtpXSkgLyA4OworCisJc2V0X2ZyYW1lX2JvdW5kcyhmZiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCS8qIFJlc2V0IHRoZSBjb21wb3NpdGlvbiByZWN0YW5nbGUgaWYgbm90IHlldCBjb25maWd1cmVkICovCisJaWYgKCEoY3R4LT5zdGF0ZSAmIEZJTUNfRFNUX0NST1ApKQorCQlzZXRfZnJhbWVfY3JvcChmZiwgMCwgMCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCisJZmltY19jYXB0dXJlX21hcmtfanBlZ194ZmVyKGN0eCwgZmltY19mbXRfaXNfanBlZyhmZi0+Zm10LT5jb2xvcikpOworCisJLyogUmVzZXQgY3JvcHBpbmcgYW5kIHNldCBmb3JtYXQgYXQgdGhlIGNhbWVyYSBpbnRlcmZhY2UgaW5wdXQgKi8KKwlpZiAoIWZpbWMtPnZpZF9jYXAudXNlcl9zdWJkZXZfYXBpKSB7CisJCWN0eC0+c19mcmFtZS5mbXQgPSBzX2ZtdDsKKwkJc2V0X2ZyYW1lX2JvdW5kcygmY3R4LT5zX2ZyYW1lLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisJCXNldF9mcmFtZV9jcm9wKCZjdHgtPnNfZnJhbWUsIDAsIDAsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGZpbWNfY2FwX3NfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCXN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZTsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4OwotCWludCByZXQ7Ci0JaW50IGk7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gZmltY192aWRpb2NfdHJ5X2ZtdF9tcGxhbmUoZmlsZSwgcHJpdiwgZik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICh2YjJfaXNfYnVzeSgmZmltYy0+dmlkX2NhcC52YnEpIHx8IGZpbWNfY2FwdHVyZV9hY3RpdmUoZmltYykpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlmcmFtZSA9ICZjdHgtPmRfZnJhbWU7Ci0KLQlwaXggPSAmZi0+Zm10LnBpeF9tcDsKLQlmcmFtZS0+Zm10ID0gZmluZF9mb3JtYXQoZiwgRk1UX0ZMQUdTX00yTSB8IEZNVF9GTEFHU19DQU0pOwotCWlmICghZnJhbWUtPmZtdCkgewotCQllcnIoImZpbWMgdGFyZ2V0IGZvcm1hdCBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPmZtdC0+Y29scGxhbmVzOyBpKyspIHsKLQkJZnJhbWUtPnBheWxvYWRbaV0gPQotCQkJKHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodCAqIGZyYW1lLT5mbXQtPmRlcHRoW2ldKSA+PiAzOwotCX0KLQotCS8qIE91dHB1dCBETUEgZnJhbWUgcGl4ZWwgc2l6ZSBhbmQgb2Zmc2V0cy4gKi8KLQlmcmFtZS0+Zl93aWR0aCA9IHBpeC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSAqIDgKLQkJCS8gZnJhbWUtPmZtdC0+ZGVwdGhbMF07Ci0JZnJhbWUtPmZfaGVpZ2h0ID0gcGl4LT5oZWlnaHQ7Ci0JZnJhbWUtPndpZHRoCT0gcGl4LT53aWR0aDsKLQlmcmFtZS0+aGVpZ2h0CT0gcGl4LT5oZWlnaHQ7Ci0JZnJhbWUtPm9fd2lkdGgJPSBwaXgtPndpZHRoOwotCWZyYW1lLT5vX2hlaWdodCA9IHBpeC0+aGVpZ2h0OwotCWZyYW1lLT5vZmZzX2gJPSAwOwotCWZyYW1lLT5vZmZzX3YJPSAwOwotCi0JY3R4LT5zdGF0ZSB8PSAoRklNQ19QQVJBTVMgfCBGSU1DX0RTVF9GTVQpOwotCi0JcmV0ID0gc3luY19jYXB0dXJlX2ZtdChjdHgpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGZpbWNfY2FwdHVyZV9zZXRfZm9ybWF0KGZpbWMsIGYpOwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwbGRhdGEgPSBjdHgtPmZpbWNfZGV2LT5wZGF0YTsKLQlzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gKmlzcF9pbmZvOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGZpbWMtPnBpcGVsaW5lLnNlbnNvcjsKIAotCWlmIChpLT5pbmRleCA+PSBwbGRhdGEtPm51bV9jbGllbnRzKQorCWlmIChpLT5pbmRleCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlzcF9pbmZvID0gJnBsZGF0YS0+aXNwX2luZm9baS0+aW5kZXhdOwotCiAJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0Jc3RybmNweShpLT5uYW1lLCBpc3BfaW5mby0+Ym9hcmRfaW5mby0+dHlwZSwgMzIpOworCWlmIChzZCkKKwkJc3RybGNweShpLT5uYW1lLCBzZC0+bmFtZSwgc2l6ZW9mKGktPm5hbWUpKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaW1jX2NhcF9zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSAgdW5zaWduZWQgaW50IGkpCitzdGF0aWMgaW50IGZpbWNfY2FwX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwotCXN0cnVjdCBzNXBfcGxhdGZvcm1fZmltYyAqcGRhdGEgPSBmaW1jLT5wZGF0YTsKLQotCWlmIChmaW1jX2NhcHR1cmVfYWN0aXZlKGN0eC0+ZmltY19kZXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKGkgPj0gcGRhdGEtPm51bV9jbGllbnRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCi0JaWYgKGZpbWMtPnZpZF9jYXAuc2QpIHsKLQkJaW50IHJldCA9IHY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgY29yZSwgc19wb3dlciwgMCk7Ci0JCWlmIChyZXQpCi0JCQllcnIoInNfcG93ZXIgZmFpbGVkOiAlZCIsIHJldCk7Ci0KLQkJY2xrX2Rpc2FibGUoZmltYy0+Y2xvY2tbQ0xLX0NBTV0pOwotCX0KLQotCS8qIFJlbGVhc2UgdGhlIGF0dGFjaGVkIHNlbnNvciBzdWJkZXZpY2UuICovCi0JZmltY19zdWJkZXZfdW5yZWdpc3RlcihmaW1jKTsKLQotCXJldHVybiBmaW1jX2lzcF9zdWJkZXZfaW5pdChmaW1jLCBpKTsKKwlyZXR1cm4gaSA9PSAwID8gaSA6IC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19jYXBfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50ICppKQorc3RhdGljIGludCBmaW1jX2NhcF9nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcCA9ICZjdHgtPmZpbWNfZGV2LT52aWRfY2FwOworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KIAotCSppID0gY2FwLT5pbnB1dF9pbmRleDsKKy8qKgorICogZmltY19waXBlbGluZV92YWxpZGF0ZSAtIGNoZWNrIGZvciBmb3JtYXRzIGluY29uc2lzdGVuY2llcworICogICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gc291cmNlIGFuZCBzaW5rIHBhZCBvZiBlYWNoIGxpbmsKKyAqCisgKiBSZXR1cm4gMCBpZiBhbGwgZm9ybWF0cyBtYXRjaCBvciAtRVBJUEUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGZpbWNfcGlwZWxpbmVfdmFsaWRhdGUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXN0cnVjdCB2NGwyX3N1YmRldl9mb3JtYXQgc2lua19mbXQsIHNyY19mbXQ7CisJc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCA9ICZmaW1jLT52aWRfY2FwOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJc3RydWN0IG1lZGlhX3BhZCAqcGFkOworCWludCByZXQ7CisKKwkvKiBTdGFydCB3aXRoIHRoZSB2aWRlbyBjYXB0dXJlIG5vZGUgcGFkICovCisJcGFkID0gbWVkaWFfZW50aXR5X3JlbW90ZV9zb3VyY2UoJnZpZF9jYXAtPnZkX3BhZCk7CisJaWYgKHBhZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVQSVBFOworCS8qIEZJTUMue059IHN1YmRldmljZSAqLworCXNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHBhZC0+ZW50aXR5KTsKKworCXdoaWxlICgxKSB7CisJCS8qIFJldHJpZXZlIGZvcm1hdCBhdCB0aGUgc2luayBwYWQgKi8KKwkJcGFkID0gJnNkLT5lbnRpdHkucGFkc1swXTsKKwkJaWYgKCEocGFkLT5mbGFncyAmIE1FRElBX1BBRF9GTF9TSU5LKSkKKwkJCWJyZWFrOworCQkvKiBEb24ndCBjYWxsIEZJTUMgc3ViZGV2IG9wZXJhdGlvbiB0byBhdm9pZCBuZXN0ZWQgbG9ja2luZyAqLworCQlpZiAoc2QgPT0gZmltYy0+dmlkX2NhcC5zdWJkZXYpIHsKKwkJCXN0cnVjdCBmaW1jX2ZyYW1lICpmZiA9ICZ2aWRfY2FwLT5jdHgtPnNfZnJhbWU7CisJCQlzaW5rX2ZtdC5mb3JtYXQud2lkdGggPSBmZi0+Zl93aWR0aDsKKwkJCXNpbmtfZm10LmZvcm1hdC5oZWlnaHQgPSBmZi0+Zl9oZWlnaHQ7CisJCQlzaW5rX2ZtdC5mb3JtYXQuY29kZSA9IGZmLT5mbXQgPyBmZi0+Zm10LT5tYnVzX2NvZGUgOiAwOworCQl9IGVsc2UgeworCQkJc2lua19mbXQucGFkID0gcGFkLT5pbmRleDsKKwkJCXNpbmtfZm10LndoaWNoID0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKKwkJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHBhZCwgZ2V0X2ZtdCwgTlVMTCwgJnNpbmtfZm10KTsKKwkJCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQpCisJCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCQkvKiBSZXRyaWV2ZSBmb3JtYXQgYXQgdGhlIHNvdXJjZSBwYWQgKi8KKwkJcGFkID0gbWVkaWFfZW50aXR5X3JlbW90ZV9zb3VyY2UocGFkKTsKKwkJaWYgKHBhZCA9PSBOVUxMIHx8CisJCSAgICBtZWRpYV9lbnRpdHlfdHlwZShwYWQtPmVudGl0eSkgIT0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVYpCisJCQlicmVhazsKKworCQlzZCA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihwYWQtPmVudGl0eSk7CisJCXNyY19mbXQucGFkID0gcGFkLT5pbmRleDsKKwkJc3JjX2ZtdC53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7CisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHBhZCwgZ2V0X2ZtdCwgTlVMTCwgJnNyY19mbXQpOworCQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuIC1FUElQRTsKKworCQlpZiAoc3JjX2ZtdC5mb3JtYXQud2lkdGggIT0gc2lua19mbXQuZm9ybWF0LndpZHRoIHx8CisJCSAgICBzcmNfZm10LmZvcm1hdC5oZWlnaHQgIT0gc2lua19mbXQuZm9ybWF0LmhlaWdodCB8fAorCQkgICAgc3JjX2ZtdC5mb3JtYXQuY29kZSAhPSBzaW5rX2ZtdC5mb3JtYXQuY29kZSkKKwkJCXJldHVybiAtRVBJUEU7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBmaW1jX3BpcGVsaW5lICpwID0gJmZpbWMtPnBpcGVsaW5lOworCWludCByZXQ7CiAKLQlpZiAoZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSB8fCAhZmltYy0+dmlkX2NhcC5zZCkKKwlpZiAoZmltY19jYXB0dXJlX2FjdGl2ZShmaW1jKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmICghKGN0eC0+c3RhdGUgJiBGSU1DX0RTVF9GTVQpKSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT52aWRfY2FwLnY0bDJfZGV2LCAiRm9ybWF0IGlzIG5vdCBzZXRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJbWVkaWFfZW50aXR5X3BpcGVsaW5lX3N0YXJ0KCZwLT5zZW5zb3ItPmVudGl0eSwgcC0+cGlwZSk7CiAKKwlpZiAoZmltYy0+dmlkX2NhcC51c2VyX3N1YmRldl9hcGkpIHsKKwkJcmV0ID0gZmltY19waXBlbGluZV92YWxpZGF0ZShmaW1jKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCXJldHVybiB2YjJfc3RyZWFtb24oJmZpbWMtPnZpZF9jYXAudmJxLCB0eXBlKTsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcF9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZmltYy0+cGlwZWxpbmUuc2Vuc29yOworCWludCByZXQ7CiAKLQlyZXR1cm4gdmIyX3N0cmVhbW9mZigmZmltYy0+dmlkX2NhcC52YnEsIHR5cGUpOworCXJldCA9IHZiMl9zdHJlYW1vZmYoJmZpbWMtPnZpZF9jYXAudmJxLCB0eXBlKTsKKwlpZiAocmV0ID09IDApCisJCW1lZGlhX2VudGl0eV9waXBlbGluZV9zdG9wKCZzZC0+ZW50aXR5KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZpbWNfY2FwX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcCA9ICZjdHgtPmZpbWNfZGV2LT52aWRfY2FwOwotCWludCByZXQ7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlpbnQgcmV0ID0gdmIyX3JlcWJ1ZnMoJmZpbWMtPnZpZF9jYXAudmJxLCByZXFidWZzKTsKIAotCi0JcmV0ID0gdmIyX3JlcWJ1ZnMoJmNhcC0+dmJxLCByZXFidWZzKTsKIAlpZiAoIXJldCkKLQkJY2FwLT5yZXFidWZzX2NvdW50ID0gcmVxYnVmcy0+Y291bnQ7Ci0KKwkJZmltYy0+dmlkX2NhcC5yZXFidWZzX2NvdW50ID0gcmVxYnVmcy0+Y291bnQ7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmaW1jX2NhcF9xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKLQlzdHJ1Y3QgZmltY192aWRfY2FwICpjYXAgPSAmY3R4LT5maW1jX2Rldi0+dmlkX2NhcDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JcmV0dXJuIHZiMl9xdWVyeWJ1ZigmY2FwLT52YnEsIGJ1Zik7CisJcmV0dXJuIHZiMl9xdWVyeWJ1ZigmZmltYy0+dmlkX2NhcC52YnEsIGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKmNhcCA9ICZjdHgtPmZpbWNfZGV2LT52aWRfY2FwOwotCXJldHVybiB2YjJfcWJ1ZigmY2FwLT52YnEsIGJ1Zik7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXJldHVybiB2YjJfcWJ1ZigmZmltYy0+dmlkX2NhcC52YnEsIGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0JcmV0dXJuIHZiMl9kcWJ1ZigmY3R4LT5maW1jX2Rldi0+dmlkX2NhcC52YnEsIGJ1ZiwKLQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQorCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLXN0YXRpYyBpbnQgZmltY19jYXBfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JLyogQWxsb3cgYW55IGNvbnRyb2xzIGJ1dCA5MC8yNzAgcm90YXRpb24gd2hpbGUgc3RyZWFtaW5nICovCi0JaWYgKCFmaW1jX2NhcHR1cmVfYWN0aXZlKGN0eC0+ZmltY19kZXYpIHx8Ci0JICAgIGN0cmwtPmlkICE9IFY0TDJfQ0lEX1JPVEFURSB8fAotCSAgICAoY3RybC0+dmFsdWUgIT0gOTAgJiYgY3RybC0+dmFsdWUgIT0gMjcwKSkgewotCQlyZXQgPSBjaGVja19jdHJsX3ZhbChjdHgsIGN0cmwpOwotCQlpZiAoIXJldCkgewotCQkJcmV0ID0gZmltY19zX2N0cmwoY3R4LCBjdHJsKTsKLQkJCWlmICghcmV0KQotCQkJCWN0eC0+c3RhdGUgfD0gRklNQ19QQVJBTVM7Ci0JCX0KLQl9Ci0JaWYgKHJldCA9PSAtRUlOVkFMKQotCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGN0eC0+ZmltY19kZXYtPnZpZF9jYXAuc2QsCi0JCQkJICAgICAgIGNvcmUsIHNfY3RybCwgY3RybCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdmIyX2RxYnVmKCZmaW1jLT52aWRfY2FwLnZicSwgYnVmLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19jYXBfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkgICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3IpCiB7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmY7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBmaW1jX2ZyYW1lICpmID0gJmZpbWMtPnZpZF9jYXAuY3R4LT5zX2ZyYW1lOwogCiAJaWYgKGNyLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZiA9ICZjdHgtPnNfZnJhbWU7Ci0KIAljci0+Ym91bmRzLmxlZnQJCT0gMDsKIAljci0+Ym91bmRzLnRvcAkJPSAwOwogCWNyLT5ib3VuZHMud2lkdGgJPSBmLT5vX3dpZHRoOwpAQCAtNzA5LDEwICsxMDI3LDggQEAKIAogc3RhdGljIGludCBmaW1jX2NhcF9nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKIHsKLQlzdHJ1Y3QgZmltY19mcmFtZSAqZjsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWYgPSAmY3R4LT5zX2ZyYW1lOworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGZpbWNfZnJhbWUgKmYgPSAmZmltYy0+dmlkX2NhcC5jdHgtPnNfZnJhbWU7CiAKIAljci0+Yy5sZWZ0CT0gZi0+b2Zmc19oOwogCWNyLT5jLnRvcAk9IGYtPm9mZnNfdjsKQEAgLTcyMiw1MyArMTAzOCwzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbWNfY2FwX3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkgICAgICAgc3RydWN0IHY0bDJfY3JvcCAqY3IpCitzdGF0aWMgaW50IGZpbWNfY2FwX3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyKQogewotCXN0cnVjdCBmaW1jX2ZyYW1lICpmOwotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCBmaW1jX2ZyYW1lICpmZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGZpbWNfY2FwdHVyZV9hY3RpdmUoZmltYykpCi0JCXJldHVybiAtRUJVU1k7CisJZmltY19jYXB0dXJlX3RyeV9jcm9wKGN0eCwgJmNyLT5jLCBGSU1DX1NEX1BBRF9TSU5LKTsKKwlmZiA9ICZjdHgtPnNfZnJhbWU7CiAKLQlyZXQgPSBmaW1jX3RyeV9jcm9wKGN0eCwgY3IpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoIShjdHgtPnN0YXRlICYgRklNQ19EU1RfRk1UKSkgewotCQl2NGwyX2VycigmZmltYy0+dmlkX2NhcC52NGwyX2RldiwKLQkJCSAiQ2FwdHVyZSBjb2xvciBmb3JtYXQgbm90IHNldFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOyAvKiBUT0RPOiBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgdmFsdWUgKi8KLQl9Ci0KLQlmID0gJmN0eC0+c19mcmFtZTsKLQkvKiBDaGVjayBmb3IgdGhlIHBpeGVsIHNjYWxpbmcgcmF0aW8gd2hlbiBjcm9wcGluZyBpbnB1dCBpbWFnZS4gKi8KLQlyZXQgPSBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhjci0+Yy53aWR0aCwgY3ItPmMuaGVpZ2h0LAotCQkJCSAgICAgIGN0eC0+ZF9mcmFtZS53aWR0aCwgY3R4LT5kX2ZyYW1lLmhlaWdodCwKLQkJCQkgICAgICBjdHgtPnJvdGF0aW9uKTsKLQlpZiAocmV0KSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT52aWRfY2FwLnY0bDJfZGV2LCAiT3V0IG9mIHRoZSBzY2FsZXIgcmFuZ2VcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWYtPm9mZnNfaCA9IGNyLT5jLmxlZnQ7Ci0JZi0+b2Zmc192ID0gY3ItPmMudG9wOwotCWYtPndpZHRoICA9IGNyLT5jLndpZHRoOwotCWYtPmhlaWdodCA9IGNyLT5jLmhlaWdodDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwlzZXRfZnJhbWVfY3JvcChmZiwgY3ItPmMubGVmdCwgY3ItPmMudG9wLCBjci0+Yy53aWR0aCwgY3ItPmMuaGVpZ2h0KTsKKwlzZXRfYml0KFNUX0NBUFRfQVBQTFlfQ0ZHLCAmZmltYy0+c3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGZpbWNfY2FwdHVyZV9pb2N0bF9vcHMgPSB7CiAJLnZpZGlvY19xdWVyeWNhcAkJPSBmaW1jX3ZpZGlvY19xdWVyeWNhcF9jYXB0dXJlLAogCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfdmlkaW9jX2VudW1fZm10X21wbGFuZSwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX3ZpZGlvY190cnlfZm10X21wbGFuZSwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19jYXBfZW51bV9mbXRfbXBsYW5lLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfY2FwX3RyeV9mbXRfbXBsYW5lLAogCS52aWRpb2Nfc19mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX2NhcF9zX2ZtdF9tcGxhbmUsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfdmlkaW9jX2dfZm10X21wbGFuZSwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY19jYXBfZ19mbXRfbXBsYW5lLAogCiAJLnZpZGlvY19yZXFidWZzCQkJPSBmaW1jX2NhcF9yZXFidWZzLAogCS52aWRpb2NfcXVlcnlidWYJCT0gZmltY19jYXBfcXVlcnlidWYsCkBAIC03NzksMTAgKzEwNzMsNiBAQAogCS52aWRpb2Nfc3RyZWFtb24JCT0gZmltY19jYXBfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYJCT0gZmltY19jYXBfc3RyZWFtb2ZmLAogCi0JLnZpZGlvY19xdWVyeWN0cmwJCT0gZmltY192aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsCQkJPSBmaW1jX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCQk9IGZpbWNfY2FwX3NfY3RybCwKLQogCS52aWRpb2NfZ19jcm9wCQkJPSBmaW1jX2NhcF9nX2Nyb3AsCiAJLnZpZGlvY19zX2Nyb3AJCQk9IGZpbWNfY2FwX3NfY3JvcCwKIAkudmlkaW9jX2Nyb3BjYXAJCQk9IGZpbWNfY2FwX2Nyb3BjYXAsCkBAIC03OTIsMTcgKzEwODIsMzI4IEBACiAJLnZpZGlvY19nX2lucHV0CQkJPSBmaW1jX2NhcF9nX2lucHV0LAogfTsKIAotLyogZmltYy0+bG9jayBtdXN0IGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KLWludCBmaW1jX3JlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKKy8qIENhcHR1cmUgc3ViZGV2IG1lZGlhIGVudGl0eSBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGZpbWNfbGlua19zZXR1cChzdHJ1Y3QgbWVkaWFfZW50aXR5ICplbnRpdHksCisJCQkgICBjb25zdCBzdHJ1Y3QgbWVkaWFfcGFkICpsb2NhbCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBtZWRpYV9wYWQgKnJlbW90ZSwgdTMyIGZsYWdzKQogewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSAmZmltYy0+dmlkX2NhcC52NGwyX2RldjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KGVudGl0eSk7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAobWVkaWFfZW50aXR5X3R5cGUocmVtb3RlLT5lbnRpdHkpICE9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKGZpbWMgPT0gTlVMTCkpCisJCXJldHVybiAwOworCisJZGJnKCIlcyAtLT4gJXMsIGZsYWdzOiAweCV4LiBpbnB1dDogMHgleCIsCisJICAgIGxvY2FsLT5lbnRpdHktPm5hbWUsIHJlbW90ZS0+ZW50aXR5LT5uYW1lLCBmbGFncywKKwkgICAgZmltYy0+dmlkX2NhcC5pbnB1dCk7CisKKwlpZiAoZmxhZ3MgJiBNRURJQV9MTktfRkxfRU5BQkxFRCkgeworCQlpZiAoZmltYy0+dmlkX2NhcC5pbnB1dCAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZmltYy0+dmlkX2NhcC5pbnB1dCA9IHNkLT5ncnBfaWQ7CisJCXJldHVybiAwOworCX0KKworCWZpbWMtPnZpZF9jYXAuaW5wdXQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lZGlhX2VudGl0eV9vcGVyYXRpb25zIGZpbWNfc2RfbWVkaWFfb3BzID0geworCS5saW5rX3NldHVwID0gZmltY19saW5rX3NldHVwLAorfTsKKworLyoqCisgKiBmaW1jX3NlbnNvcl9ub3RpZnkgLSB2NGwyX2RldmljZSBub3RpZmljYXRpb24gZnJvbSBhIHNlbnNvciBzdWJkZXYKKyAqIEBzZDogcG9pbnRlciB0byBhIHN1YmRldiBnZW5lcmF0aW5nIHRoZSBub3RpZmljYXRpb24KKyAqIEBub3RpZmljYXRpb246IHRoZSBub3RpZmljYXRpb24gdHlwZSwgbXVzdCBiZSBTNVBfRklNQ19UWF9FTkRfTk9USUZZCisgKiBAYXJnOiBwb2ludGVyIHRvIGFuIHUzMiB0eXBlIGludGVnZXIgdGhhdCBzdG9yZXMgdGhlIGZyYW1lIHBheWxvYWQgdmFsdWUKKyAqCisgKiBUaGUgRW5kIE9mIEZyYW1lIG5vdGlmaWNhdGlvbiBzZW50IGJ5IHNlbnNvciBzdWJkZXYgaW4gaXRzIHN0aWxsIGNhcHR1cmUKKyAqIG1vZGUuIElmIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgVlNZTkMgZ2VuZXJhdGVkIGJ5IHRoZSBzZW5zb3IgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgYSBmcmFtZSB0cmFuc21pc3Npb24sIEZJTUMgZG9lcyBub3QgaXNzdWUgdGhlIExhc3RJcnEKKyAqIChlbmQgb2YgZnJhbWUpIGludGVycnVwdC4gQW5kIHRoaXMgbm90aWZpY2F0aW9uIGlzIHVzZWQgdG8gY29tcGxldGUgdGhlCisgKiBmcmFtZSBjYXB0dXJlIGFuZCByZXR1cm5pbmcgYSBidWZmZXIgdG8gdXNlci1zcGFjZS4gU3ViZGV2IGRyaXZlcnMgc2hvdWxkCisgKiBjYWxsIHRoaXMgbm90aWZpY2F0aW9uIGZyb20gdGhlaXIgbGFzdCAnRW5kIG9mIGZyYW1lIGNhcHR1cmUnIGludGVycnVwdC4KKyAqLwordm9pZCBmaW1jX3NlbnNvcl9ub3RpZnkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IG5vdGlmaWNhdGlvbiwKKwkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbwkqc2Vuc29yOworCXN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kOworCXN0cnVjdCBmaW1jX2RldiAqZmltYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHNkID09IE5VTEwpCisJCXJldHVybjsKKworCXNlbnNvciA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7CisJZm1kID0gZW50aXR5X3RvX2ZpbWNfbWRldigmc2QtPmVudGl0eSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZm1kLT5zbG9jaywgZmxhZ3MpOworCWZpbWMgPSBzZW5zb3IgPyBzZW5zb3ItPmhvc3QgOiBOVUxMOworCisJaWYgKGZpbWMgJiYgYXJnICYmIG5vdGlmaWNhdGlvbiA9PSBTNVBfRklNQ19UWF9FTkRfTk9USUZZICYmCisJICAgIHRlc3RfYml0KFNUX0NBUFRfUEVORCwgJmZpbWMtPnN0YXRlKSkgeworCQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBpcnFfZmxhZ3MpOworCQlpZiAoIWxpc3RfZW1wdHkoJmZpbWMtPnZpZF9jYXAuYWN0aXZlX2J1Zl9xKSkgeworCQkJYnVmID0gbGlzdF9lbnRyeShmaW1jLT52aWRfY2FwLmFjdGl2ZV9idWZfcS5uZXh0LAorCQkJCQkgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciwgbGlzdCk7CisJCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoJmJ1Zi0+dmIsIDAsICooKHUzMiAqKWFyZykpOworCQl9CisJCWZpbWNfY2FwdHVyZV9pcnFfaGFuZGxlcihmaW1jLCB0cnVlKTsKKwkJZmltY19kZWFjdGl2YXRlX2NhcHR1cmUoZmltYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBpcnFfZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbWQtPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZmltY19zdWJkZXZfZW51bV9tYnVzX2NvZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQkgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoLAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bSAqY29kZSkKK3sKKwlzdHJ1Y3QgZmltY19mbXQgKmZtdDsKKworCWZtdCA9IGZpbWNfZmluZF9mb3JtYXQoTlVMTCwgTlVMTCwgRk1UX0ZMQUdTX0NBTSwgY29kZS0+aW5kZXgpOworCWlmICghZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKwljb2RlLT5jb2RlID0gZm10LT5tYnVzX2NvZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmltY19zdWJkZXZfZ2V0X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWY7CisJc3RydWN0IGZpbWNfZnJhbWUgKmZmOworCisJaWYgKGZtdC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQltZiA9IHY0bDJfc3ViZGV2X2dldF90cnlfZm9ybWF0KGZoLCBmbXQtPnBhZCk7CisJCWZtdC0+Zm9ybWF0ID0gKm1mOworCQlyZXR1cm4gMDsKKwl9CisJbWYgPSAmZm10LT5mb3JtYXQ7CisJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwlmZiA9IGZtdC0+cGFkID09IEZJTUNfU0RfUEFEX1NJTksgPyAmY3R4LT5zX2ZyYW1lIDogJmN0eC0+ZF9mcmFtZTsKKworCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOworCS8qIFRoZSBwaXhlbCBjb2RlIGlzIHNhbWUgb24gYm90aCBpbnB1dCBhbmQgb3V0cHV0IHBhZCAqLworCWlmICghV0FSTl9PTihjdHgtPnNfZnJhbWUuZm10ID09IE5VTEwpKQorCQltZi0+Y29kZSA9IGN0eC0+c19mcmFtZS5mbXQtPm1idXNfY29kZTsKKwltZi0+d2lkdGggID0gZmYtPmZfd2lkdGg7CisJbWYtPmhlaWdodCA9IGZmLT5mX2hlaWdodDsKKwltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmltY19zdWJkZXZfc2V0X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mID0gJmZtdC0+Zm9ybWF0OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmltYy0+dmlkX2NhcC5jdHg7CisJc3RydWN0IGZpbWNfZnJhbWUgKmZmOworCXN0cnVjdCBmaW1jX2ZtdCAqZmZtdDsKKworCWRiZygicGFkJWQ6IGNvZGU6IDB4JXgsICVkeCVkIiwKKwkgICAgZm10LT5wYWQsIG1mLT5jb2RlLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCisJaWYgKGZtdC0+cGFkID09IEZJTUNfU0RfUEFEX1NPVVJDRSAmJgorCSAgICB2YjJfaXNfYnVzeSgmZmltYy0+dmlkX2NhcC52YnEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJZmZtdCA9IGZpbWNfY2FwdHVyZV90cnlfZm9ybWF0KGN0eCwgJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQsCisJCQkJICAgICAgICZtZi0+Y29kZSwgTlVMTCwgZm10LT5wYWQpOworCW11dGV4X3VubG9jaygmZmltYy0+bG9jayk7CisJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKworCWlmIChmbXQtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJbWYgPSB2NGwyX3N1YmRldl9nZXRfdHJ5X2Zvcm1hdChmaCwgZm10LT5wYWQpOworCQkqbWYgPSBmbXQtPmZvcm1hdDsKKwkJcmV0dXJuIDA7CisJfQorCWZpbWNfY2FwdHVyZV9tYXJrX2pwZWdfeGZlcihjdHgsIGZpbWNfZm10X2lzX2pwZWcoZmZtdC0+Y29sb3IpKTsKKworCWZmID0gZm10LT5wYWQgPT0gRklNQ19TRF9QQURfU0lOSyA/CisJCSZjdHgtPnNfZnJhbWUgOiAmY3R4LT5kX2ZyYW1lOworCisJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJc2V0X2ZyYW1lX2JvdW5kcyhmZiwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKKwlmZi0+Zm10ID0gZmZtdDsKKworCS8qIFJlc2V0IHRoZSBjcm9wIHJlY3RhbmdsZSBpZiByZXF1aXJlZC4gKi8KKwlpZiAoIShmbXQtPnBhZCA9PSBGSU1DX1NEX1BBRF9TT1VSQ0UgJiYgKGN0eC0+c3RhdGUgJiBGSU1DX0RTVF9DUk9QKSkpCisJCXNldF9mcmFtZV9jcm9wKGZmLCAwLCAwLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCisJaWYgKGZtdC0+cGFkID09IEZJTUNfU0RfUEFEX1NJTkspCisJCWN0eC0+c3RhdGUgJj0gfkZJTUNfRFNUX0NST1A7CisJbXV0ZXhfdW5sb2NrKCZmaW1jLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX3N1YmRldl9nZXRfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaW1jLT52aWRfY2FwLmN0eDsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyID0gJmNyb3AtPnJlY3Q7CisJc3RydWN0IGZpbWNfZnJhbWUgKmZmOworCisJaWYgKGNyb3AtPndoaWNoID09IFY0TDJfU1VCREVWX0ZPUk1BVF9UUlkpIHsKKwkJY3JvcC0+cmVjdCA9ICp2NGwyX3N1YmRldl9nZXRfdHJ5X2Nyb3AoZmgsIGNyb3AtPnBhZCk7CisJCXJldHVybiAwOworCX0KKwlmZiA9IGNyb3AtPnBhZCA9PSBGSU1DX1NEX1BBRF9TSU5LID8KKwkJJmN0eC0+c19mcmFtZSA6ICZjdHgtPmRfZnJhbWU7CisKKwltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwlyLT5sZWZ0CSAgPSBmZi0+b2Zmc19oOworCXItPnRvcAkgID0gZmYtPm9mZnNfdjsKKwlyLT53aWR0aCAgPSBmZi0+d2lkdGg7CisJci0+aGVpZ2h0ID0gZmYtPmhlaWdodDsKKwltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCisJZGJnKCJmZjolcCwgcGFkJWQ6IGw6JWQsIHQ6JWQsICVkeCVkLCBmX3c6ICVkLCBmX2g6ICVkIiwKKwkgICAgZmYsIGNyb3AtPnBhZCwgci0+bGVmdCwgci0+dG9wLCByLT53aWR0aCwgci0+aGVpZ2h0LAorCSAgICBmZi0+Zl93aWR0aCwgZmYtPmZfaGVpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbWNfc3ViZGV2X3NldF9jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfY3JvcCAqY3JvcCkKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbWMtPnZpZF9jYXAuY3R4OworCXN0cnVjdCB2NGwyX3JlY3QgKnIgPSAmY3JvcC0+cmVjdDsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZmY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZygiKCVkLCVkKS8lZHglZCIsIHItPmxlZnQsIHItPnRvcCwgci0+d2lkdGgsIHItPmhlaWdodCk7CisKKwlmZiA9IGNyb3AtPnBhZCA9PSBGSU1DX1NEX1BBRF9TT1VSQ0UgPworCQkmY3R4LT5kX2ZyYW1lIDogJmN0eC0+c19mcmFtZTsKKworCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOworCWZpbWNfY2FwdHVyZV90cnlfY3JvcChjdHgsIHIsIGNyb3AtPnBhZCk7CisKKwlpZiAoY3JvcC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX1RSWSkgeworCQltdXRleF9sb2NrKCZmaW1jLT5sb2NrKTsKKwkJKnY0bDJfc3ViZGV2X2dldF90cnlfY3JvcChmaCwgY3JvcC0+cGFkKSA9ICpyOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJc2V0X2ZyYW1lX2Nyb3AoZmYsIHItPmxlZnQsIHItPnRvcCwgci0+d2lkdGgsIHItPmhlaWdodCk7CisJaWYgKGNyb3AtPnBhZCA9PSBGSU1DX1NEX1BBRF9TT1VSQ0UpCisJCWN0eC0+c3RhdGUgfD0gRklNQ19EU1RfQ1JPUDsKKworCXNldF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKworCWRiZygicGFkJWQ6ICglZCwlZCkvJWR4JWQiLCBjcm9wLT5wYWQsIHItPmxlZnQsIHItPnRvcCwKKwkgICAgci0+d2lkdGgsIHItPmhlaWdodCk7CisKKwltdXRleF91bmxvY2soJmZpbWMtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3BhZF9vcHMgZmltY19zdWJkZXZfcGFkX29wcyA9IHsKKwkuZW51bV9tYnVzX2NvZGUgPSBmaW1jX3N1YmRldl9lbnVtX21idXNfY29kZSwKKwkuZ2V0X2ZtdCA9IGZpbWNfc3ViZGV2X2dldF9mbXQsCisJLnNldF9mbXQgPSBmaW1jX3N1YmRldl9zZXRfZm10LAorCS5nZXRfY3JvcCA9IGZpbWNfc3ViZGV2X2dldF9jcm9wLAorCS5zZXRfY3JvcCA9IGZpbWNfc3ViZGV2X3NldF9jcm9wLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgZmltY19zdWJkZXZfb3BzID0geworCS5wYWQgPSAmZmltY19zdWJkZXZfcGFkX29wcywKK307CisKK3N0YXRpYyBpbnQgZmltY19jcmVhdGVfY2FwdHVyZV9zdWJkZXYoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlpbnQgcmV0OworCisJc2QgPSBremFsbG9jKHNpemVvZigqc2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXY0bDJfc3ViZGV2X2luaXQoc2QsICZmaW1jX3N1YmRldl9vcHMpOworCXNkLT5mbGFncyA9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCXNucHJpbnRmKHNkLT5uYW1lLCBzaXplb2Yoc2QtPm5hbWUpLCAiRklNQy4lZCIsIGZpbWMtPnBkZXYtPmlkKTsKKworCWZpbWMtPnZpZF9jYXAuc2RfcGFkc1tGSU1DX1NEX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOworCWZpbWMtPnZpZF9jYXAuc2RfcGFkc1tGSU1DX1NEX1BBRF9TT1VSQ0VdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmc2QtPmVudGl0eSwgRklNQ19TRF9QQURTX05VTSwKKwkJCQlmaW1jLT52aWRfY2FwLnNkX3BhZHMsIDApOworCWlmIChyZXQpCisJCWdvdG8gbWVfZXJyOworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2NGwyX2Rldiwgc2QpOworCWlmIChyZXQpCisJCWdvdG8gc2RfZXJyOworCisJZmltYy0+dmlkX2NhcC5zdWJkZXYgPSBzZDsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKHNkLCBmaW1jKTsKKwlzZC0+ZW50aXR5Lm9wcyA9ICZmaW1jX3NkX21lZGlhX29wczsKKwlyZXR1cm4gMDsKK3NkX2VycjoKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmc2QtPmVudGl0eSk7CittZV9lcnI6CisJa2ZyZWUoc2QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfZGVzdHJveV9jYXB0dXJlX3N1YmRldihzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGZpbWMtPnZpZF9jYXAuc3ViZGV2OworCisJaWYgKCFzZCkKKwkJcmV0dXJuOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzZC0+ZW50aXR5KTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihzZCk7CisJa2ZyZWUoc2QpOworCXNkID0gTlVMTDsKK30KKworLyogU2V0IGRlZmF1bHQgZm9ybWF0IGF0IHRoZSBzZW5zb3IgYW5kIGhvc3QgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGZpbWNfY2FwdHVyZV9zZXRfZGVmYXVsdF9mb3JtYXQoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoreworCXN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQgPSB7CisJCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwKKwkJLmZtdC5waXhfbXAgPSB7CisJCQkud2lkdGgJCT0gNjQwLAorCQkJLmhlaWdodAkJPSA0ODAsCisJCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJCS5maWVsZAkJPSBWNEwyX0ZJRUxEX05PTkUsCisJCQkuY29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCQl9LAorCX07CisKKwlyZXR1cm4gZmltY19jYXB0dXJlX3NldF9mb3JtYXQoZmltYywgJmZtdCk7Cit9CisKKy8qIGZpbWMtPmxvY2sgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpemVkICovCitpbnQgZmltY19yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsCisJCQkJIHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCit7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOwogCXN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXA7CiAJc3RydWN0IGZpbWNfY3R4ICpjdHg7Ci0Jc3RydWN0IHY0bDJfZm9ybWF0IGY7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmZyOwogCXN0cnVjdCB2YjJfcXVldWUgKnE7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKIAogCWN0eCA9IGt6YWxsb2Moc2l6ZW9mICpjdHgsIEdGUF9LRVJORUwpOwogCWlmICghY3R4KQpAQCAtODEyLDMzICsxNDEzLDIxIEBACiAJY3R4LT5pbl9wYXRoCSA9IEZJTUNfQ0FNRVJBOwogCWN0eC0+b3V0X3BhdGgJID0gRklNQ19ETUE7CiAJY3R4LT5zdGF0ZQkgPSBGSU1DX0NUWF9DQVA7Ci0KLQkvKiBEZWZhdWx0IGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZyYW1lcyAqLwotCWYuZm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKLQlmciA9ICZjdHgtPmRfZnJhbWU7Ci0JZnItPmZtdCA9IGZpbmRfZm9ybWF0KCZmLCBGTVRfRkxBR1NfTTJNKTsKLQlmci0+d2lkdGggPSBmci0+Zl93aWR0aCA9IGZyLT5vX3dpZHRoID0gNjQwOwotCWZyLT5oZWlnaHQgPSBmci0+Zl9oZWlnaHQgPSBmci0+b19oZWlnaHQgPSA0ODA7Ci0KLQlpZiAoIXY0bDJfZGV2LT5uYW1lWzBdKQotCQlzbnByaW50Zih2NGwyX2Rldi0+bmFtZSwgc2l6ZW9mKHY0bDJfZGV2LT5uYW1lKSwKLQkJCSAiJXMuY2FwdHVyZSIsIGRldl9uYW1lKCZmaW1jLT5wZGV2LT5kZXYpKTsKLQotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsIHY0bDJfZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9pbmZvOworCWN0eC0+c19mcmFtZS5mbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KE5VTEwsIE5VTEwsIEZNVF9GTEFHU19DQU0sIDApOworCWN0eC0+ZF9mcmFtZS5mbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KE5VTEwsIE5VTEwsIEZNVF9GTEFHU19DQU0sIDApOwogCiAJdmZkID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKCF2ZmQpIHsKIAkJdjRsMl9lcnIodjRsMl9kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdmlkZW8gZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfdjRsMl9yZWc7CisJCWdvdG8gZXJyX3ZkX2FsbG9jOwogCX0KIAotCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlczpjYXAiLAorCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcy5jYXB0dXJlIiwKIAkJIGRldl9uYW1lKCZmaW1jLT5wZGV2LT5kZXYpKTsKIAogCXZmZC0+Zm9wcwk9ICZmaW1jX2NhcHR1cmVfZm9wczsKIAl2ZmQtPmlvY3RsX29wcwk9ICZmaW1jX2NhcHR1cmVfaW9jdGxfb3BzOworCXZmZC0+djRsMl9kZXYJPSB2NGwyX2RldjsKIAl2ZmQtPm1pbm9yCT0gLTE7CiAJdmZkLT5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CiAJdmZkLT5sb2NrCT0gJmZpbWMtPmxvY2s7CkBAIC04NDksOCArMTQzOCw2IEBACiAJdmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQgPSAwOwogCXZpZF9jYXAtPnJlcWJ1ZnNfY291bnQgID0gMDsKIAl2aWRfY2FwLT5yZWZjbnQgPSAwOwotCS8qIERlZmF1bHQgY29sb3IgZm9ybWF0IGZvciBpbWFnZSBzZW5zb3IgKi8KLQl2aWRfY2FwLT5mbXQuY29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OwogCiAJSU5JVF9MSVNUX0hFQUQoJnZpZF9jYXAtPnBlbmRpbmdfYnVmX3EpOwogCUlOSVRfTElTVF9IRUFEKCZ2aWRfY2FwLT5hY3RpdmVfYnVmX3EpOwpAQCAtODY4LDM0ICsxNDU1LDM3IEBACiAKIAl2YjJfcXVldWVfaW5pdChxKTsKIAotCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKLQlpZiAocmV0KSB7Ci0JCXY0bDJfZXJyKHY0bDJfZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX3ZkX3JlZzsKLQl9CisJZmltYy0+dmlkX2NhcC52ZF9wYWQuZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmdmZkLT5lbnRpdHksIDEsICZmaW1jLT52aWRfY2FwLnZkX3BhZCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZW50OworCXJldCA9IGZpbWNfY3JlYXRlX2NhcHR1cmVfc3ViZGV2KGZpbWMsIHY0bDJfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9zZF9yZWc7CiAKLQl2NGwyX2luZm8odjRsMl9kZXYsCi0JCSAgIkZJTUMgY2FwdHVyZSBkcml2ZXIgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWRcbiIsCi0JCSAgdmZkLT5udW0pOwotCisJdmZkLT5jdHJsX2hhbmRsZXIgPSAmY3R4LT5jdHJsX2hhbmRsZXI7CiAJcmV0dXJuIDA7CiAKLWVycl92ZF9yZWc6CitlcnJfc2RfcmVnOgorCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2ZmQtPmVudGl0eSk7CitlcnJfZW50OgogCXZpZGVvX2RldmljZV9yZWxlYXNlKHZmZCk7Ci1lcnJfdjRsMl9yZWc6Ci0JdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7Ci1lcnJfaW5mbzoKK2Vycl92ZF9hbGxvYzoKIAlrZnJlZShjdHgpOwotCWRldl9lcnIoJmZpbWMtPnBkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGZpbWNfdW5yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCiB7Ci0Jc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwdHVyZSA9ICZmaW1jLT52aWRfY2FwOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGZpbWMtPnZpZF9jYXAudmZkOwogCi0JaWYgKGNhcHR1cmUtPnZmZCkKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoY2FwdHVyZS0+dmZkKTsKLQotCWtmcmVlKGNhcHR1cmUtPmN0eCk7CisJaWYgKHZmZCkgeworCQltZWRpYV9lbnRpdHlfY2xlYW51cCgmdmZkLT5lbnRpdHkpOworCQkvKiBDYW4gYWxzbyBiZSBjYWxsZWQgaWYgdmlkZW8gZGV2aWNlIHdhcworCQkgICBub3QgcmVnaXN0ZXJlZCAqLworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2ZmQpOworCX0KKwlmaW1jX2Rlc3Ryb3lfY2FwdHVyZV9zdWJkZXYoZmltYyk7CisJa2ZyZWUoZmltYy0+dmlkX2NhcC5jdHgpOworCWZpbWMtPnZpZF9jYXAuY3R4ID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCmluZGV4IGFhNTUwNjYuLjE5Y2E2ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yNyw5ICsyOCwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CiAKICNpbmNsdWRlICJmaW1jLWNvcmUuaCIKKyNpbmNsdWRlICJmaW1jLW1kZXZpY2UuaCIKIAogc3RhdGljIGNoYXIgKmZpbWNfY2xvY2tzW01BWF9GSU1DX0NMT0NLU10gPSB7Ci0JInNjbGtfZmltYyIsICJmaW1jIiwgInNjbGtfY2FtIgorCSJzY2xrX2ZpbWMiLCAiZmltYyIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZmltY19mbXQgZmltY19mb3JtYXRzW10gPSB7CkBAIC0xNTcsNTkgKzE1OSwyOCBAQAogCQkubWVtcGxhbmVzCT0gMiwKIAkJLmNvbHBsYW5lcwk9IDIsCiAJCS5mbGFncwkJPSBGTVRfRkxBR1NfTTJNLAorCX0sIHsKKwkJLm5hbWUJCT0gIkpQRUcgZW5jb2RlZCBkYXRhIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfSlBFRywKKwkJLmNvbG9yCQk9IFM1UF9GSU1DX0pQRUcsCisJCS5kZXB0aAkJPSB7IDggfSwKKwkJLm1lbXBsYW5lcwk9IDEsCisJCS5jb2xwbGFuZXMJPSAxLAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9KUEVHXzFYOCwKKwkJLmZsYWdzCQk9IEZNVF9GTEFHU19DQU0sCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgZmltY19jdHJsc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX0hGTElQLAotCQkudHlwZQkJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZQkJPSAiSG9yaXpvbnRhbCBmbGlwIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LCB7Ci0JCS5pZAkJPSBWNEwyX0NJRF9WRkxJUCwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIlZlcnRpY2FsIGZsaXAiLAotCQkubWluaW11bQk9IDAsCi0JCS5tYXhpbXVtCT0gMSwKLQkJLmRlZmF1bHRfdmFsdWUJPSAwLAotCX0sIHsKLQkJLmlkCQk9IFY0TDJfQ0lEX1JPVEFURSwKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUJCT0gIlJvdGF0aW9uIChDQ1cpIiwKLQkJLm1pbmltdW0JPSAwLAotCQkubWF4aW11bQk9IDI3MCwKLQkJLnN0ZXAJCT0gOTAsCi0JCS5kZWZhdWx0X3ZhbHVlCT0gMCwKLQl9LAotfTsKLQotCi1zdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsICpnZXRfY3RybChpbnQgaWQpCitpbnQgZmltY19jaGVja19zY2FsZXJfcmF0aW8oc3RydWN0IGZpbWNfY3R4ICpjdHgsIGludCBzdywgaW50IHNoLAorCQkJICAgIGludCBkdywgaW50IGRoLCBpbnQgcm90YXRpb24pCiB7Ci0JaW50IGk7CisJaWYgKHJvdGF0aW9uID09IDkwIHx8IHJvdGF0aW9uID09IDI3MCkKKwkJc3dhcChkdywgZGgpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmltY19jdHJscyk7ICsraSkKLQkJaWYgKGlkID09IGZpbWNfY3RybHNbaV0uaWQpCi0JCQlyZXR1cm4gJmZpbWNfY3RybHNbaV07Ci0JcmV0dXJuIE5VTEw7Ci19CisJaWYgKCFjdHgtPnNjYWxlci5lbmFibGVkKQorCQlyZXR1cm4gKHN3ID09IGR3ICYmIHNoID09IGRoKSA/IDAgOiAtRUlOVkFMOwogCi1pbnQgZmltY19jaGVja19zY2FsZXJfcmF0aW8oaW50IHN3LCBpbnQgc2gsIGludCBkdywgaW50IGRoLCBpbnQgcm90KQotewotCWludCB0eCwgdHk7Ci0KLQlpZiAocm90ID09IDkwIHx8IHJvdCA9PSAyNzApIHsKLQkJdHkgPSBkdzsKLQkJdHggPSBkaDsKLQl9IGVsc2UgewotCQl0eCA9IGR3OwotCQl0eSA9IGRoOwotCX0KLQotCWlmICgoc3cgPj0gU0NBTEVSX01BWF9IUkFUSU8gKiB0eCkgfHwgKHNoID49IFNDQUxFUl9NQVhfVlJBVElPICogdHkpKQorCWlmICgoc3cgPj0gU0NBTEVSX01BWF9IUkFUSU8gKiBkdykgfHwgKHNoID49IFNDQUxFUl9NQVhfVlJBVElPICogZGgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpAQCAtMjM1LDEwICsyMDYsMTEgQEAKIAogaW50IGZpbWNfc2V0X3NjYWxlcl9pbmZvKHN0cnVjdCBmaW1jX2N0eCAqY3R4KQogeworCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGN0eC0+ZmltY19kZXYtPnZhcmlhbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+ZmltY19kZXYtPnBkZXYtPmRldjsKIAlzdHJ1Y3QgZmltY19zY2FsZXIgKnNjID0gJmN0eC0+c2NhbGVyOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpzX2ZyYW1lID0gJmN0eC0+c19mcmFtZTsKIAlzdHJ1Y3QgZmltY19mcmFtZSAqZF9mcmFtZSA9ICZjdHgtPmRfZnJhbWU7Ci0Jc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50ICp2YXJpYW50ID0gY3R4LT5maW1jX2Rldi0+dmFyaWFudDsKIAlpbnQgdHgsIHR5LCBzeCwgc3k7CiAJaW50IHJldDsKIApAQCAtMjUwLDE1ICsyMjIsMTQgQEAKIAkJdHkgPSBkX2ZyYW1lLT5oZWlnaHQ7CiAJfQogCWlmICh0eCA8PSAwIHx8IHR5IDw9IDApIHsKLQkJdjRsMl9lcnIoJmN0eC0+ZmltY19kZXYtPm0ybS52NGwyX2RldiwKLQkJCSJpbnZhbGlkIHRhcmdldCBzaXplOiAlZCB4ICVkIiwgdHgsIHR5KTsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIHRhcmdldCBzaXplOiAlZHglZCIsIHR4LCB0eSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN4ID0gc19mcmFtZS0+d2lkdGg7CiAJc3kgPSBzX2ZyYW1lLT5oZWlnaHQ7CiAJaWYgKHN4IDw9IDAgfHwgc3kgPD0gMCkgewotCQllcnIoImludmFsaWQgc291cmNlIHNpemU6ICVkIHggJWQiLCBzeCwgc3kpOworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgc291cmNlIHNpemU6ICVkeCVkIiwgc3gsIHN5KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNjLT5yZWFsX3dpZHRoID0gc3g7CkBAIC0zMDEsNyArMjcyLDYgQEAKIHN0YXRpYyB2b2lkIGZpbWNfbTJtX2pvYl9maW5pc2goc3RydWN0IGZpbWNfY3R4ICpjdHgsIGludCB2Yl9zdGF0ZSkKIHsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX3ZiLCAqZHN0X3ZiOwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAKIAlpZiAoIWN0eCB8fCAhY3R4LT5tMm1fY3R4KQogCQlyZXR1cm47CkBAIC0zMTIsNTQgKzI4Miw2OCBAQAogCWlmIChzcmNfdmIgJiYgZHN0X3ZiKSB7CiAJCXY0bDJfbTJtX2J1Zl9kb25lKHNyY192YiwgdmJfc3RhdGUpOwogCQl2NGwyX20ybV9idWZfZG9uZShkc3RfdmIsIHZiX3N0YXRlKTsKLQkJdjRsMl9tMm1fam9iX2ZpbmlzaChmaW1jLT5tMm0ubTJtX2RldiwgY3R4LT5tMm1fY3R4KTsKKwkJdjRsMl9tMm1fam9iX2ZpbmlzaChjdHgtPmZpbWNfZGV2LT5tMm0ubTJtX2RldiwKKwkJCQkgICAgY3R4LT5tMm1fY3R4KTsKIAl9CiB9CiAKIC8qIENvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiB3aGljaCBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbi4gKi8KLXN0YXRpYyB2b2lkIGZpbWNfbTJtX3NodXRkb3duKHN0cnVjdCBmaW1jX2N0eCAqY3R4KQorc3RhdGljIGludCBmaW1jX20ybV9zaHV0ZG93bihzdHJ1Y3QgZmltY19jdHggKmN0eCkKIHsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCWludCByZXQ7CiAKIAlpZiAoIWZpbWNfbTJtX3BlbmRpbmcoZmltYykpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlmaW1jX2N0eF9zdGF0ZV9sb2NrX3NldChGSU1DX0NUWF9TSFVULCBjdHgpOwogCiAJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGZpbWMtPmlycV9xdWV1ZSwKIAkJCSAgICFmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19DVFhfU0hVVCwgY3R4KSwKIAkJCSAgIEZJTUNfU0hVVERPV05fVElNRU9VVCk7Ci0JLyoKLQkgKiBJbiBjYXNlIG9mIGEgdGltZW91dCB0aGUgYnVmZmVycyBhcmUgbm90IHJlbGVhc2VkIGluIHRoZSBpbnRlcnJ1cHQKLQkgKiBoYW5kbGVyIHNvIHJldHVybiB0aGVtIGhlcmUgd2l0aCB0aGUgZXJyb3IgZmxhZyBzZXQsIGlmIHRoZXJlIGFyZQotCSAqIGFueSBvbiB0aGUgcXVldWUuCi0JICovCi0JaWYgKHJldCA9PSAwKQotCQlmaW1jX20ybV9qb2JfZmluaXNoKGN0eCwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisKKwlyZXR1cm4gcmV0ID09IDAgPyAtRVRJTUVET1VUIDogcmV0OworfQorCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBxLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmY3R4LT5maW1jX2Rldi0+cGRldi0+ZGV2KTsKKwlyZXR1cm4gcmV0ID4gMCA/IDAgOiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHEtPmRydl9wcml2OworCWludCByZXQ7CiAKLQlmaW1jX20ybV9zaHV0ZG93bihjdHgpOworCXJldCA9IGZpbWNfbTJtX3NodXRkb3duKGN0eCk7CisJaWYgKHJldCA9PSAtRVRJTUVET1VUKQorCQlmaW1jX20ybV9qb2JfZmluaXNoKGN0eCwgVkIyX0JVRl9TVEFURV9FUlJPUik7CiAKKwlwbV9ydW50aW1lX3B1dCgmY3R4LT5maW1jX2Rldi0+cGRldi0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmltY19jYXB0dXJlX2lycV9oYW5kbGVyKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3ZvaWQgZmltY19jYXB0dXJlX2lycV9oYW5kbGVyKHN0cnVjdCBmaW1jX2RldiAqZmltYywgYm9vbCBmaW5hbCkKIHsKIAlzdHJ1Y3QgZmltY192aWRfY2FwICpjYXAgPSAmZmltYy0+dmlkX2NhcDsKIAlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICp2X2J1ZjsKIAlzdHJ1Y3QgdGltZXZhbCAqdHY7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwogCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVF9DQVBUX1NIVVQsICZmaW1jLT5zdGF0ZSkpIHsKKwkJd2FrZV91cCgmZmltYy0+aXJxX3F1ZXVlKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICghbGlzdF9lbXB0eSgmY2FwLT5hY3RpdmVfYnVmX3EpICYmCi0JICAgIHRlc3RfYml0KFNUX0NBUFRfUlVOLCAmZmltYy0+c3RhdGUpKSB7CisJICAgIHRlc3RfYml0KFNUX0NBUFRfUlVOLCAmZmltYy0+c3RhdGUpICYmIGZpbmFsKSB7CiAJCWt0aW1lX2dldF9yZWFsX3RzKCZ0cyk7CiAKLQkJdl9idWYgPSBhY3RpdmVfcXVldWVfcG9wKGNhcCk7CisJCXZfYnVmID0gZmltY19hY3RpdmVfcXVldWVfcG9wKGNhcCk7CiAKIAkJdHYgPSAmdl9idWYtPnZiLnY0bDJfYnVmLnRpbWVzdGFtcDsKIAkJdHYtPnR2X3NlYyA9IHRzLnR2X3NlYzsKQEAgLTM2OSwxOSArMzUzLDE0IEBACiAJCXZiMl9idWZmZXJfZG9uZSgmdl9idWYtPnZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwogCX0KIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RfQ0FQVF9TSFVULCAmZmltYy0+c3RhdGUpKSB7Ci0JCXdha2VfdXAoJmZpbWMtPmlycV9xdWV1ZSk7Ci0JCXJldHVybjsKLQl9Ci0KIAlpZiAoIWxpc3RfZW1wdHkoJmNhcC0+cGVuZGluZ19idWZfcSkpIHsKIAotCQl2X2J1ZiA9IHBlbmRpbmdfcXVldWVfcG9wKGNhcCk7CisJCXZfYnVmID0gZmltY19wZW5kaW5nX3F1ZXVlX3BvcChjYXApOwogCQlmaW1jX2h3X3NldF9vdXRwdXRfYWRkcihmaW1jLCAmdl9idWYtPnBhZGRyLCBjYXAtPmJ1Zl9pbmRleCk7CiAJCXZfYnVmLT5pbmRleCA9IGNhcC0+YnVmX2luZGV4OwogCiAJCS8qIE1vdmUgdGhlIGJ1ZmZlciB0byB0aGUgY2FwdHVyZSBhY3RpdmUgcXVldWUgKi8KLQkJYWN0aXZlX3F1ZXVlX2FkZChjYXAsIHZfYnVmKTsKKwkJZmltY19hY3RpdmVfcXVldWVfYWRkKGNhcCwgdl9idWYpOwogCiAJCWRiZygibmV4dCBmcmFtZTogJWQsIGRvbmUgZnJhbWU6ICVkIiwKIAkJICAgIGZpbWNfaHdfZ2V0X2ZyYW1lX2luZGV4KGZpbWMpLCB2X2J1Zi0+aW5kZXgpOwpAQCAtMzkxLDcgKzM3MCw4IEBACiAJfQogCiAJaWYgKGNhcC0+YWN0aXZlX2J1Zl9jbnQgPT0gMCkgewotCQljbGVhcl9iaXQoU1RfQ0FQVF9SVU4sICZmaW1jLT5zdGF0ZSk7CisJCWlmIChmaW5hbCkKKwkJCWNsZWFyX2JpdChTVF9DQVBUX1JVTiwgJmZpbWMtPnN0YXRlKTsKIAogCQlpZiAoKytjYXAtPmJ1Zl9pbmRleCA+PSBGSU1DX01BWF9PVVRfQlVGUykKIAkJCWNhcC0+YnVmX2luZGV4ID0gMDsKQEAgLTM5OSwxMSArMzc5LDEzIEBACiAJCXNldF9iaXQoU1RfQ0FQVF9SVU4sICZmaW1jLT5zdGF0ZSk7CiAJfQogCisJZmltY19jYXB0dXJlX2NvbmZpZ191cGRhdGUoY2FwLT5jdHgpOworCiAJZGJnKCJmcmFtZTogJWQsIGFjdGl2ZV9idWZfY250OiAlZCIsCiAJICAgIGZpbWNfaHdfZ2V0X2ZyYW1lX2luZGV4KGZpbWMpLCBjYXAtPmFjdGl2ZV9idWZfY250KTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGZpbWNfaXNyKGludCBpcnEsIHZvaWQgKnByaXYpCitzdGF0aWMgaXJxcmV0dXJuX3QgZmltY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHByaXY7CiAJc3RydWN0IGZpbWNfdmlkX2NhcCAqY2FwID0gJmZpbWMtPnZpZF9jYXA7CkBAIC00MTEsOSArMzkzLDE3IEBACiAKIAlmaW1jX2h3X2NsZWFyX2lycShmaW1jKTsKIAorCXNwaW5fbG9jaygmZmltYy0+c2xvY2spOworCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVF9NMk1fUEVORCwgJmZpbWMtPnN0YXRlKSkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUX00yTV9TVVNQRU5ESU5HLCAmZmltYy0+c3RhdGUpKSB7CisJCQlzZXRfYml0KFNUX00yTV9TVVNQRU5ERUQsICZmaW1jLT5zdGF0ZSk7CisJCQl3YWtlX3VwKCZmaW1jLT5pcnFfcXVldWUpOworCQkJZ290byBvdXQ7CisJCX0KIAkJY3R4ID0gdjRsMl9tMm1fZ2V0X2N1cnJfcHJpdihmaW1jLT5tMm0ubTJtX2Rldik7CiAJCWlmIChjdHggIT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2soJmZpbWMtPnNsb2NrKTsKIAkJCWZpbWNfbTJtX2pvYl9maW5pc2goY3R4LCBWQjJfQlVGX1NUQVRFX0RPTkUpOwogCiAJCQlzcGluX2xvY2soJmN0eC0+c2xvY2spOwpAQCAtNDIzLDIxICs0MTMsMTYgQEAKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKCZjdHgtPnNsb2NrKTsKIAkJfQotCiAJCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzcGluX2xvY2soJmZpbWMtPnNsb2NrKTsKLQotCWlmICh0ZXN0X2JpdChTVF9DQVBUX1BFTkQsICZmaW1jLT5zdGF0ZSkpIHsKLQkJZmltY19jYXB0dXJlX2lycV9oYW5kbGVyKGZpbWMpOwotCisJfSBlbHNlIGlmICh0ZXN0X2JpdChTVF9DQVBUX1BFTkQsICZmaW1jLT5zdGF0ZSkpIHsKKwkJZmltY19jYXB0dXJlX2lycV9oYW5kbGVyKGZpbWMsCisJCQkJICF0ZXN0X2JpdChTVF9DQVBUX0pQRUcsICZmaW1jLT5zdGF0ZSkpOwogCQlpZiAoY2FwLT5hY3RpdmVfYnVmX2NudCA9PSAxKSB7CiAJCQlmaW1jX2RlYWN0aXZhdGVfY2FwdHVyZShmaW1jKTsKIAkJCWNsZWFyX2JpdChTVF9DQVBUX1NUUkVBTSwgJmZpbWMtPnN0YXRlKTsKIAkJfQogCX0KLQorb3V0OgogCXNwaW5fdW5sb2NrKCZmaW1jLT5zbG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDU3LDcgKzQ0Miw3IEBACiAJZGJnKCJtZW1wbGFuZXM9ICVkLCBjb2xwbGFuZXM9ICVkLCBwaXhfc2l6ZT0gJWQiLAogCQlmcmFtZS0+Zm10LT5tZW1wbGFuZXMsIGZyYW1lLT5mbXQtPmNvbHBsYW5lcywgcGl4X3NpemUpOwogCi0JcGFkZHItPnkgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJcGFkZHItPnkgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CiAKIAlpZiAoZnJhbWUtPmZtdC0+bWVtcGxhbmVzID09IDEpIHsKIAkJc3dpdGNoIChmcmFtZS0+Zm10LT5jb2xwbGFuZXMpIHsKQEAgLTQ4NSwxMCArNDcwLDEwIEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAoZnJhbWUtPmZtdC0+bWVtcGxhbmVzID49IDIpCi0JCQlwYWRkci0+Y2IgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMSk7CisJCQlwYWRkci0+Y2IgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMSk7CiAKIAkJaWYgKGZyYW1lLT5mbXQtPm1lbXBsYW5lcyA9PSAzKQotCQkJcGFkZHItPmNyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDIpOworCQkJcGFkZHItPmNyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDIpOwogCX0KIAogCWRiZygiUEhZU19BRERSOiB5PSAweCVYICBjYj0gMHglWCBjcj0gMHglWCByZXQ9ICVkIiwKQEAgLTQ5OCw3ICs0ODMsNyBAQAogfQogCiAvKiBTZXQgb3JkZXIgZm9yIDEgYW5kIDIgcGxhbmUgWUNCQ1IgNDoyOjIgZm9ybWF0cy4gKi8KLXN0YXRpYyB2b2lkIGZpbWNfc2V0X3l1dl9vcmRlcihzdHJ1Y3QgZmltY19jdHggKmN0eCkKK3ZvaWQgZmltY19zZXRfeXV2X29yZGVyKHN0cnVjdCBmaW1jX2N0eCAqY3R4KQogewogCS8qIFRoZSBvbmUgb25seSBtb2RlIHN1cHBvcnRlZCBpbiBTb0MuICovCiAJY3R4LT5pbl9vcmRlcl8ycCA9IFM1UF9GSU1DX0xTQl9DUkNCOwpAQCAtNTQwLDcgKzUyNSw3IEBACiAJZGJnKCJjdHgtPm91dF9vcmRlcl8xcD0gJWQiLCBjdHgtPm91dF9vcmRlcl8xcCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbWNfcHJlcGFyZV9kbWFfb2Zmc2V0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgZmltY19mcmFtZSAqZikKK3ZvaWQgZmltY19wcmVwYXJlX2RtYV9vZmZzZXQoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCBmaW1jX2ZyYW1lICpmKQogewogCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGN0eC0+ZmltY19kZXYtPnZhcmlhbnQ7CiAJdTMyIGksIGRlcHRoID0gMDsKQEAgLTYwNiw5ICs1OTEsNiBAQAogCQlmaW1jX3NldF95dXZfb3JkZXIoY3R4KTsKIAl9CiAKLQkvKiBJbnB1dCBETUEgbW9kZSBpcyBub3QgYWxsb3dlZCB3aGVuIHRoZSBzY2FsZXIgaXMgZGlzYWJsZWQuICovCi0JY3R4LT5zY2FsZXIuZW5hYmxlZCA9IDE7Ci0KIAlpZiAoZmxhZ3MgJiBGSU1DX1NSQ19BRERSKSB7CiAJCXZiID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+bTJtX2N0eCk7CiAJCXJldCA9IGZpbWNfcHJlcGFyZV9hZGRyKGN0eCwgdmIsIHNfZnJhbWUsICZzX2ZyYW1lLT5wYWRkcik7CkBAIC02MzUsMTAgKzYxNywxMCBAQAogCQlyZXR1cm47CiAKIAlmaW1jID0gY3R4LT5maW1jX2RldjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPnNsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CiAJc2V0X2JpdChTVF9NMk1fUEVORCwgJmZpbWMtPnN0YXRlKTsKIAorCXNwaW5fbG9jaygmY3R4LT5zbG9jayk7CiAJY3R4LT5zdGF0ZSB8PSAoRklNQ19TUkNfQUREUiB8IEZJTUNfRFNUX0FERFIpOwogCXJldCA9IGZpbWNfcHJlcGFyZV9jb25maWcoY3R4LCBjdHgtPnN0YXRlKTsKIAlpZiAocmV0KQpAQCAtNjQ5LDggKzYzMSw2IEBACiAJCWN0eC0+c3RhdGUgfD0gRklNQ19QQVJBTVM7CiAJCWZpbWMtPm0ybS5jdHggPSBjdHg7CiAJfQotCi0Jc3Bpbl9sb2NrKCZmaW1jLT5zbG9jayk7CiAJZmltY19od19zZXRfaW5wdXRfYWRkcihmaW1jLCAmY3R4LT5zX2ZyYW1lLnBhZGRyKTsKIAogCWlmIChjdHgtPnN0YXRlICYgRklNQ19QQVJBTVMpIHsKQEAgLTY2NSw3ICs2NDUsNyBAQAogCQlmaW1jX2h3X3NldF9tYWluc2NhbGVyKGN0eCk7CiAJCWZpbWNfaHdfc2V0X3RhcmdldF9mb3JtYXQoY3R4KTsKIAkJZmltY19od19zZXRfcm90YXRpb24oY3R4KTsKLQkJZmltY19od19zZXRfZWZmZWN0KGN0eCk7CisJCWZpbWNfaHdfc2V0X2VmZmVjdChjdHgsIGZhbHNlKTsKIAl9CiAKIAlmaW1jX2h3X3NldF9vdXRwdXRfcGF0aChjdHgpOwpAQCAtNjgwLDEwICs2NjAsOSBAQAogCWN0eC0+c3RhdGUgJj0gKEZJTUNfQ1RYX00yTSB8IEZJTUNfQ1RYX0NBUCB8CiAJCSAgICAgICBGSU1DX1NSQ19GTVQgfCBGSU1DX0RTVF9GTVQpOwogCWZpbWNfaHdfYWN0aXZhdGVfaW5wdXRfZG1hKGZpbWMsIHRydWUpOwotCXNwaW5fdW5sb2NrKCZmaW1jLT5zbG9jayk7Ci0KIGRtYV91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZjdHgtPnNsb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBmaW1jX2pvYl9hYm9ydCh2b2lkICpwcml2KQpAQCAtNjkxLDkgKzY3MCw5IEBACiAJZmltY19tMm1fc2h1dGRvd24ocHJpdik7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKLQkJCSAgICB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCSAgICB2b2lkICphbGxvY2F0b3JzW10pCitzdGF0aWMgaW50IGZpbWNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJICAgIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NhdG9yc1tdKQogewogCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CiAJc3RydWN0IGZpbWNfZnJhbWUgKmY7CkBAIC03NjIsMTY3ICs3NDEsMjA1IEBACiAJLndhaXRfcHJlcGFyZQkgPSBmaW1jX3VubG9jaywKIAkud2FpdF9maW5pc2gJID0gZmltY19sb2NrLAogCS5zdG9wX3N0cmVhbWluZwkgPSBzdG9wX3N0cmVhbWluZywKKwkuc3RhcnRfc3RyZWFtaW5nID0gc3RhcnRfc3RyZWFtaW5nLAogfTsKIAotc3RhdGljIGludCBmaW1jX20ybV9xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKKy8qCisgKiBWNEwyIGNvbnRyb2xzIGhhbmRsaW5nCisgKi8KKyNkZWZpbmUgY3RybF90b19jdHgoX19jdHJsKSBcCisJY29udGFpbmVyX29mKChfX2N0cmwpLT5oYW5kbGVyLCBzdHJ1Y3QgZmltY19jdHgsIGN0cmxfaGFuZGxlcikKKworc3RhdGljIGludCBmaW1jX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gY3RybF90b19jdHgoY3RybCk7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKKwlzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgKnZhcmlhbnQgPSBmaW1jLT52YXJpYW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19JTkFDVElWRSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+c2xvY2ssIGZsYWdzKTsKKwkJY3R4LT5oZmxpcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCQljdHgtPnZmbGlwID0gY3RybC0+dmFsOworCQlicmVhazsKKworCWNhc2UgVjRMMl9DSURfUk9UQVRFOgorCQlpZiAoZmltY19jYXB0dXJlX3BlbmRpbmcoZmltYykgfHwKKwkJICAgIGZpbWNfY3R4X3N0YXRlX2lzX3NldChGSU1DX0RTVF9GTVQgfCBGSU1DX1NSQ19GTVQsIGN0eCkpIHsKKwkJCXJldCA9IGZpbWNfY2hlY2tfc2NhbGVyX3JhdGlvKGN0eCwgY3R4LT5zX2ZyYW1lLndpZHRoLAorCQkJCQljdHgtPnNfZnJhbWUuaGVpZ2h0LCBjdHgtPmRfZnJhbWUud2lkdGgsCisJCQkJCWN0eC0+ZF9mcmFtZS5oZWlnaHQsIGN0cmwtPnZhbCk7CisJCX0KKwkJaWYgKHJldCkgeworCQkJdjRsMl9lcnIoZmltYy0+bTJtLnZmZCwgIk91dCBvZiBzY2FsZXIgcmFuZ2VcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKChjdHJsLT52YWwgPT0gOTAgfHwgY3RybC0+dmFsID09IDI3MCkgJiYKKwkJICAgICF2YXJpYW50LT5oYXNfb3V0X3JvdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCQljdHgtPnJvdGF0aW9uID0gY3RybC0+dmFsOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXY0bDJfZXJyKGZpbWMtPnY0bDJfZGV2LCAiSW52YWxpZCBjb250cm9sOiAweCVYXG4iLCBjdHJsLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljdHgtPnN0YXRlIHw9IEZJTUNfUEFSQU1TOworCXNldF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5zbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgZmltY19jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gZmltY19zX2N0cmwsCit9OworCitpbnQgZmltY19jdHJsc19jcmVhdGUoc3RydWN0IGZpbWNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+Y3RybHNfcmR5KQorCQlyZXR1cm4gMDsKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZjdHgtPmN0cmxfaGFuZGxlciwgMyk7CisKKwljdHgtPmN0cmxfcm90YXRlID0gdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybF9oYW5kbGVyLCAmZmltY19jdHJsX29wcywKKwkJCQkgICAgIFY0TDJfQ0lEX0hGTElQLCAwLCAxLCAxLCAwKTsKKwljdHgtPmN0cmxfaGZsaXAgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJsX2hhbmRsZXIsICZmaW1jX2N0cmxfb3BzLAorCQkJCSAgICBWNEwyX0NJRF9WRkxJUCwgMCwgMSwgMSwgMCk7CisJY3R4LT5jdHJsX3ZmbGlwID0gdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybF9oYW5kbGVyLCAmZmltY19jdHJsX29wcywKKwkJCQkgICAgVjRMMl9DSURfUk9UQVRFLCAwLCAyNzAsIDkwLCAwKTsKKwljdHgtPmN0cmxzX3JkeSA9IGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yID09IDA7CisKKwlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7Cit9CisKK3ZvaWQgZmltY19jdHJsc19kZWxldGUoc3RydWN0IGZpbWNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+Y3RybHNfcmR5KSB7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oYW5kbGVyKTsKKwkJY3R4LT5jdHJsc19yZHkgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgZmltY19jdHJsc19hY3RpdmF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCwgYm9vbCBhY3RpdmUpCit7CisJaWYgKCFjdHgtPmN0cmxzX3JkeSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmY3R4LT5jdHJsX2hhbmRsZXIubG9jayk7CisJdjRsMl9jdHJsX2FjdGl2YXRlKGN0eC0+Y3RybF9yb3RhdGUsIGFjdGl2ZSk7CisJdjRsMl9jdHJsX2FjdGl2YXRlKGN0eC0+Y3RybF9oZmxpcCwgYWN0aXZlKTsKKwl2NGwyX2N0cmxfYWN0aXZhdGUoY3R4LT5jdHJsX3ZmbGlwLCBhY3RpdmUpOworCisJaWYgKGFjdGl2ZSkgeworCQljdHgtPnJvdGF0aW9uID0gY3R4LT5jdHJsX3JvdGF0ZS0+dmFsOworCQljdHgtPmhmbGlwICAgID0gY3R4LT5jdHJsX2hmbGlwLT52YWw7CisJCWN0eC0+dmZsaXAgICAgPSBjdHgtPmN0cmxfdmZsaXAtPnZhbDsKKwl9IGVsc2UgeworCQljdHgtPnJvdGF0aW9uID0gMDsKKwkJY3R4LT5oZmxpcCAgICA9IDA7CisJCWN0eC0+dmZsaXAgICAgPSAwOworCX0KKwltdXRleF91bmxvY2soJmN0eC0+Y3RybF9oYW5kbGVyLmxvY2spOworfQorCisvKgorICogVjRMMiBpb2N0bCBoYW5kbGVycworICovCitzdGF0aWMgaW50IGZpbWNfbTJtX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSAgICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCiAJc3RybmNweShjYXAtPmRyaXZlciwgZmltYy0+cGRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwKLQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgZmltY192aWRpb2NfZW51bV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCitzdGF0aWMgaW50IGZpbWNfbTJtX2VudW1fZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKIHsKIAlzdHJ1Y3QgZmltY19mbXQgKmZtdDsKIAotCWlmIChmLT5pbmRleCA+PSBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cykpCisJZm10ID0gZmltY19maW5kX2Zvcm1hdChOVUxMLCBOVUxMLCBGTVRfRkxBR1NfTTJNLCBmLT5pbmRleCk7CisJaWYgKCFmbXQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm10ID0gJmZpbWNfZm9ybWF0c1tmLT5pbmRleF07CiAJc3RybmNweShmLT5kZXNjcmlwdGlvbiwgZm10LT5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pIC0gMSk7CiAJZi0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKLQogCXJldHVybiAwOwogfQogCi1pbnQgZmltY192aWRpb2NfZ19mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCitpbnQgZmltY19maWxsX2Zvcm1hdChzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWUsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lOwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhtOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhtID0gJmYtPmZtdC5waXhfbXA7CiAJaW50IGk7CiAKLQlmcmFtZSA9IGN0eF9nZXRfZnJhbWUoY3R4LCBmLT50eXBlKTsKLQlpZiAoSVNfRVJSKGZyYW1lKSkKLQkJcmV0dXJuIFBUUl9FUlIoZnJhbWUpOwotCi0JcGl4bSA9ICZmLT5mbXQucGl4X21wOwotCi0JcGl4bS0+d2lkdGgJCT0gZnJhbWUtPndpZHRoOwotCXBpeG0tPmhlaWdodAkJPSBmcmFtZS0+aGVpZ2h0OwotCXBpeG0tPmZpZWxkCQk9IFY0TDJfRklFTERfTk9ORTsKLQlwaXhtLT5waXhlbGZvcm1hdAk9IGZyYW1lLT5mbXQtPmZvdXJjYzsKLQlwaXhtLT5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7Ci0JcGl4bS0+bnVtX3BsYW5lcwk9IGZyYW1lLT5mbXQtPm1lbXBsYW5lczsKKwlwaXhtLT53aWR0aCA9IGZyYW1lLT5vX3dpZHRoOworCXBpeG0tPmhlaWdodCA9IGZyYW1lLT5vX2hlaWdodDsKKwlwaXhtLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlwaXhtLT5waXhlbGZvcm1hdCA9IGZyYW1lLT5mbXQtPmZvdXJjYzsKKwlwaXhtLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUc7CisJcGl4bS0+bnVtX3BsYW5lcyA9IGZyYW1lLT5mbXQtPm1lbXBsYW5lczsKIAogCWZvciAoaSA9IDA7IGkgPCBwaXhtLT5udW1fcGxhbmVzOyArK2kpIHsKLQkJaW50IGJwbCA9IGZyYW1lLT5vX3dpZHRoOwotCisJCWludCBicGwgPSBmcmFtZS0+Zl93aWR0aDsKIAkJaWYgKGZyYW1lLT5mbXQtPmNvbHBsYW5lcyA9PSAxKSAvKiBwYWNrZWQgZm9ybWF0cyAqLwogCQkJYnBsID0gKGJwbCAqIGZyYW1lLT5mbXQtPmRlcHRoWzBdKSAvIDg7Ci0KIAkJcGl4bS0+cGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZSA9IGJwbDsKLQogCQlwaXhtLT5wbGFuZV9mbXRbaV0uc2l6ZWltYWdlID0gKGZyYW1lLT5vX3dpZHRoICoKIAkJCWZyYW1lLT5vX2hlaWdodCAqIGZyYW1lLT5mbXQtPmRlcHRoW2ldKSAvIDg7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBmaW1jX2ZtdCAqZmluZF9mb3JtYXQoc3RydWN0IHY0bDJfZm9ybWF0ICpmLCB1bnNpZ25lZCBpbnQgbWFzaykKK3ZvaWQgZmltY19maWxsX2ZyYW1lKHN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZSwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBmaW1jX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhtID0gJmYtPmZtdC5waXhfbXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaW1jX2Zvcm1hdHMpOyArK2kpIHsKLQkJZm10ID0gJmZpbWNfZm9ybWF0c1tpXTsKLQkJaWYgKGZtdC0+Zm91cmNjID09IGYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgJiYKLQkJICAgKGZtdC0+ZmxhZ3MgJiBtYXNrKSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAoaSA9PSBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cykpID8gTlVMTCA6IGZtdDsKKwlmcmFtZS0+Zl93aWR0aCAgPSBwaXhtLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lOworCWlmIChmcmFtZS0+Zm10LT5jb2xwbGFuZXMgPT0gMSkKKwkJZnJhbWUtPmZfd2lkdGggPSAoZnJhbWUtPmZfd2lkdGggKiA4KSAvIGZyYW1lLT5mbXQtPmRlcHRoWzBdOworCWZyYW1lLT5mX2hlaWdodAk9IHBpeG0tPmhlaWdodDsKKwlmcmFtZS0+d2lkdGggICAgPSBwaXhtLT53aWR0aDsKKwlmcmFtZS0+aGVpZ2h0ICAgPSBwaXhtLT5oZWlnaHQ7CisJZnJhbWUtPm9fd2lkdGggID0gcGl4bS0+d2lkdGg7CisJZnJhbWUtPm9faGVpZ2h0ID0gcGl4bS0+aGVpZ2h0OworCWZyYW1lLT5vZmZzX2ggICA9IDA7CisJZnJhbWUtPm9mZnNfdiAgID0gMDsKIH0KIAotc3RydWN0IGZpbWNfZm10ICpmaW5kX21idXNfZm9ybWF0KHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmYsCi0JCQkJICB1bnNpZ25lZCBpbnQgbWFzaykKKy8qKgorICogZmltY19hZGp1c3RfbXBsYW5lX2Zvcm1hdCAtIGFkanVzdCBieXRlc3BlcmxpbmUvc2l6ZWltYWdlIGZvciBlYWNoIHBsYW5lCisgKiBAZm10OiBmaW1jIHBpeGVsIGZvcm1hdCBkZXNjcmlwdGlvbiAoaW5wdXQpCisgKiBAd2lkdGg6IHJlcXVlc3RlZCBwaXhlbCB3aWR0aAorICogQGhlaWdodDogcmVxdWVzdGVkIHBpeGVsIGhlaWdodAorICogQHBpeDogbXVsdGktcGxhbmUgZm9ybWF0IHRvIGFkanVzdAorICovCit2b2lkIGZpbWNfYWRqdXN0X21wbGFuZV9mb3JtYXQoc3RydWN0IGZpbWNfZm10ICpmbXQsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4KQogewotCXN0cnVjdCBmaW1jX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCBpOworCXUzMiBieXRlc3BlcmxpbmUgPSAwOworCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmltY19mb3JtYXRzKTsgKytpKSB7Ci0JCWZtdCA9ICZmaW1jX2Zvcm1hdHNbaV07Ci0JCWlmIChmbXQtPm1idXNfY29kZSA9PSBmLT5jb2RlICYmIChmbXQtPmZsYWdzICYgbWFzaykpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKGkgPT0gQVJSQVlfU0laRShmaW1jX2Zvcm1hdHMpKSA/IE5VTEwgOiBmbXQ7Ci19Ci0KLQotaW50IGZpbWNfdmlkaW9jX3RyeV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKLQlzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgKnZhcmlhbnQgPSBmaW1jLT52YXJpYW50OwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXggPSAmZi0+Zm10LnBpeF9tcDsKLQlzdHJ1Y3QgZmltY19mbXQgKmZtdDsKLQl1MzIgbWF4X3dpZHRoLCBtb2RfeCwgbW9kX3ksIG1hc2s7Ci0JaW50IGksIGlzX291dHB1dCA9IDA7Ci0KLQotCWlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgewotCQlpZiAoZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfQ1RYX0NBUCwgY3R4KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpc19vdXRwdXQgPSAxOwotCX0gZWxzZSBpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRiZygidzogJWQsIGg6ICVkIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwotCi0JbWFzayA9IGlzX291dHB1dCA/IEZNVF9GTEFHU19NMk0gOiBGTVRfRkxBR1NfTTJNIHwgRk1UX0ZMQUdTX0NBTTsKLQlmbXQgPSBmaW5kX2Zvcm1hdChmLCBtYXNrKTsKLQlpZiAoIWZtdCkgewotCQl2NGwyX2VycigmZmltYy0+bTJtLnY0bDJfZGV2LCAiRm91cmNjIGZvcm1hdCAoMHglWCkgaW52YWxpZC5cbiIsCi0JCQkgcGl4LT5waXhlbGZvcm1hdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChwaXgtPmZpZWxkID09IFY0TDJfRklFTERfQU5ZKQotCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCWVsc2UgaWYgKFY0TDJfRklFTERfTk9ORSAhPSBwaXgtPmZpZWxkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpc19vdXRwdXQpIHsKLQkJbWF4X3dpZHRoID0gdmFyaWFudC0+cGl4X2xpbWl0LT5zY2FsZXJfZGlzX3c7Ci0JCW1vZF94ID0gZmZzKHZhcmlhbnQtPm1pbl9pbnBfcGl4c2l6ZSkgLSAxOwotCX0gZWxzZSB7Ci0JCW1heF93aWR0aCA9IHZhcmlhbnQtPnBpeF9saW1pdC0+b3V0X3JvdF9kaXNfdzsKLQkJbW9kX3ggPSBmZnModmFyaWFudC0+bWluX291dF9waXhzaXplKSAtIDE7Ci0JfQotCi0JaWYgKHRpbGVkX2ZtdChmbXQpKSB7Ci0JCW1vZF94ID0gNjsgLyogNjQgeCAzMiBwaXhlbHMgdGlsZSAqLwotCQltb2RfeSA9IDU7Ci0JfSBlbHNlIHsKLQkJaWYgKGZpbWMtPmlkID09IDEgJiYgdmFyaWFudC0+cGl4X2hvZmYpCi0JCQltb2RfeSA9IGZpbWNfZm10X2lzX3JnYihmbXQtPmNvbG9yKSA/IDAgOiAxOwotCQllbHNlCi0JCQltb2RfeSA9IG1vZF94OwotCX0KLQotCWRiZygibW9kX3g6ICVkLCBtb2RfeTogJWQsIG1heF93OiAlZCIsIG1vZF94LCBtb2RfeSwgbWF4X3dpZHRoKTsKLQotCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgMTYsIG1heF93aWR0aCwgbW9kX3gsCi0JCSZwaXgtPmhlaWdodCwgOCwgdmFyaWFudC0+cGl4X2xpbWl0LT5zY2FsZXJfZGlzX3csIG1vZF95LCAwKTsKLQotCXBpeC0+bnVtX3BsYW5lcyA9IGZtdC0+bWVtcGxhbmVzOwogCXBpeC0+Y29sb3JzcGFjZQk9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwotCisJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlwaXgtPm51bV9wbGFuZXMgPSBmbXQtPm1lbXBsYW5lczsKKwlwaXgtPmhlaWdodCA9IGhlaWdodDsKKwlwaXgtPndpZHRoID0gd2lkdGg7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGl4LT5udW1fcGxhbmVzOyArK2kpIHsKIAkJdTMyIGJwbCA9IHBpeC0+cGxhbmVfZm10W2ldLmJ5dGVzcGVybGluZTsKQEAgLTkzNiw0OCArOTUzLDE0MiBAQAogCQkJYnBsID0gKHBpeC0+d2lkdGggKiBmbXQtPmRlcHRoWzBdKSAvIDg7CiAKIAkJaWYgKGkgPT0gMCkgLyogU2FtZSBieXRlc3BlcmxpbmUgZm9yIGVhY2ggcGxhbmUuICovCi0JCQltb2RfeCA9IGJwbDsKKwkJCWJ5dGVzcGVybGluZSA9IGJwbDsKIAotCQlwaXgtPnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUgPSBtb2RfeDsKKwkJcGl4LT5wbGFuZV9mbXRbaV0uYnl0ZXNwZXJsaW5lID0gYnl0ZXNwZXJsaW5lOwogCQkqc2l6ZWltYWdlID0gKHBpeC0+d2lkdGggKiBwaXgtPmhlaWdodCAqIGZtdC0+ZGVwdGhbaV0pIC8gODsKIAl9Cit9CiAKK3N0YXRpYyBpbnQgZmltY19tMm1fZ19mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKwlzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWUgPSBjdHhfZ2V0X2ZyYW1lKGN0eCwgZi0+dHlwZSk7CisKKwlpZiAoSVNfRVJSKGZyYW1lKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnJhbWUpOworCisJcmV0dXJuIGZpbWNfZmlsbF9mb3JtYXQoZnJhbWUsIGYpOworfQorCisvKioKKyAqIGZpbWNfZmluZF9mb3JtYXQgLSBsb29rdXAgZmltYyBjb2xvciBmb3JtYXQgYnkgZm91cmNjIG9yIG1lZGlhIGJ1cyBmb3JtYXQKKyAqIEBwaXhlbGZvcm1hdDogZm91cmNjIHRvIG1hdGNoLCBpZ25vcmVkIGlmIG51bGwKKyAqIEBtYnVzX2NvZGU6IG1lZGlhIGJ1cyBjb2RlIHRvIG1hdGNoLCBpZ25vcmVkIGlmIG51bGwKKyAqIEBtYXNrOiB0aGUgY29sb3IgZmxhZ3MgdG8gbWF0Y2gKKyAqIEBpbmRleDogb2Zmc2V0IGluIHRoZSBmaW1jX2Zvcm1hdHMgYXJyYXksIGlnbm9yZWQgaWYgbmVnYXRpdmUKKyAqLworc3RydWN0IGZpbWNfZm10ICpmaW1jX2ZpbmRfZm9ybWF0KHUzMiAqcGl4ZWxmb3JtYXQsIHUzMiAqbWJ1c19jb2RlLAorCQkJCSAgdW5zaWduZWQgaW50IG1hc2ssIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZmltY19mbXQgKmZtdCwgKmRlZl9mbXQgPSBOVUxMOworCXVuc2lnbmVkIGludCBpOworCWludCBpZCA9IDA7CisKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShmaW1jX2Zvcm1hdHMpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZpbWNfZm9ybWF0cyk7ICsraSkgeworCQlmbXQgPSAmZmltY19mb3JtYXRzW2ldOworCQlpZiAoIShmbXQtPmZsYWdzICYgbWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKHBpeGVsZm9ybWF0ICYmIGZtdC0+Zm91cmNjID09ICpwaXhlbGZvcm1hdCkKKwkJCXJldHVybiBmbXQ7CisJCWlmIChtYnVzX2NvZGUgJiYgZm10LT5tYnVzX2NvZGUgPT0gKm1idXNfY29kZSkKKwkJCXJldHVybiBmbXQ7CisJCWlmIChpbmRleCA9PSBpZCkKKwkJCWRlZl9mbXQgPSBmbXQ7CisJCWlkKys7CisJfQorCXJldHVybiBkZWZfZm10OworfQorCitzdGF0aWMgaW50IGZpbWNfdHJ5X2ZtdF9tcGxhbmUoc3RydWN0IGZpbWNfY3R4ICpjdHgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OworCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGZpbWMtPnZhcmlhbnQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeCA9ICZmLT5mbXQucGl4X21wOworCXN0cnVjdCBmaW1jX2ZtdCAqZm10OworCXUzMiBtYXhfdywgbW9kX3gsIG1vZF95OworCisJaWYgKCFJU19NMk0oZi0+dHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGJnKCJ3OiAlZCwgaDogJWQiLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKKwlmbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KCZwaXgtPnBpeGVsZm9ybWF0LCBOVUxMLCBGTVRfRkxBR1NfTTJNLCAwKTsKKwlpZiAoV0FSTihmbXQgPT0gTlVMTCwgIlBpeGVsIGZvcm1hdCBsb29rdXAgZmFpbGVkIikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCW1heF93ID0gdmFyaWFudC0+cGl4X2xpbWl0LT5zY2FsZXJfZGlzX3c7CisJCW1vZF94ID0gZmZzKHZhcmlhbnQtPm1pbl9pbnBfcGl4c2l6ZSkgLSAxOworCX0gZWxzZSB7CisJCW1heF93ID0gdmFyaWFudC0+cGl4X2xpbWl0LT5vdXRfcm90X2Rpc193OworCQltb2RfeCA9IGZmcyh2YXJpYW50LT5taW5fb3V0X3BpeHNpemUpIC0gMTsKKwl9CisKKwlpZiAodGlsZWRfZm10KGZtdCkpIHsKKwkJbW9kX3ggPSA2OyAvKiA2NCB4IDMyIHBpeGVscyB0aWxlICovCisJCW1vZF95ID0gNTsKKwl9IGVsc2UgeworCQlpZiAoZmltYy0+aWQgPT0gMSAmJiB2YXJpYW50LT5waXhfaG9mZikKKwkJCW1vZF95ID0gZmltY19mbXRfaXNfcmdiKGZtdC0+Y29sb3IpID8gMCA6IDE7CisJCWVsc2UKKwkJCW1vZF95ID0gbW9kX3g7CisJfQorCWRiZygibW9kX3g6ICVkLCBtb2RfeTogJWQsIG1heF93OiAlZCIsIG1vZF94LCBtb2RfeSwgbWF4X3cpOworCisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXgtPndpZHRoLCAxNiwgbWF4X3csIG1vZF94LAorCQkmcGl4LT5oZWlnaHQsIDgsIHZhcmlhbnQtPnBpeF9saW1pdC0+c2NhbGVyX2Rpc193LCBtb2RfeSwgMCk7CisKKwlmaW1jX2FkanVzdF9tcGxhbmVfZm9ybWF0KGZtdCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQsICZmLT5mbXQucGl4X21wKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9zX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCitzdGF0aWMgaW50IGZpbWNfbTJtX3RyeV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCisJcmV0dXJuIGZpbWNfdHJ5X2ZtdF9tcGxhbmUoY3R4LCBmKTsKK30KKworc3RhdGljIGludCBmaW1jX20ybV9zX2ZtdF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAogCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCXN0cnVjdCB2YjJfcXVldWUgKnZxOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZTsKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4OwogCWludCBpLCByZXQgPSAwOwogCi0JcmV0ID0gZmltY192aWRpb2NfdHJ5X2ZtdF9tcGxhbmUoZmlsZSwgcHJpdiwgZik7CisJcmV0ID0gZmltY190cnlfZm10X21wbGFuZShjdHgsIGYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOwogCiAJaWYgKHZiMl9pc19idXN5KHZxKSkgewotCQl2NGwyX2VycigmZmltYy0+bTJtLnY0bDJfZGV2LCAicXVldWUgKCVkKSBidXN5XG4iLCBmLT50eXBlKTsKKwkJdjRsMl9lcnIoZmltYy0+bTJtLnZmZCwgInF1ZXVlICglZCkgYnVzeVxuIiwgZi0+dHlwZSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQogCQlmcmFtZSA9ICZjdHgtPnNfZnJhbWU7Ci0JfSBlbHNlIGlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwllbHNlCiAJCWZyYW1lID0gJmN0eC0+ZF9mcmFtZTsKLQl9IGVsc2UgewotCQl2NGwyX2VycigmZmltYy0+bTJtLnY0bDJfZGV2LAotCQkJICJXcm9uZyBidWZmZXIvdmlkZW8gcXVldWUgdHlwZSAoJWQpXG4iLCBmLT50eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJcGl4ID0gJmYtPmZtdC5waXhfbXA7Ci0JZnJhbWUtPmZtdCA9IGZpbmRfZm9ybWF0KGYsIEZNVF9GTEFHU19NMk0pOworCWZyYW1lLT5mbXQgPSBmaW1jX2ZpbmRfZm9ybWF0KCZwaXgtPnBpeGVsZm9ybWF0LCBOVUxMLAorCQkJCSAgICAgIEZNVF9GTEFHU19NMk0sIDApOwogCWlmICghZnJhbWUtPmZtdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTk4NiwxNSArMTA5Nyw5IEBACiAJCQkocGl4LT53aWR0aCAqIHBpeC0+aGVpZ2h0ICogZnJhbWUtPmZtdC0+ZGVwdGhbaV0pIC8gODsKIAl9CiAKLQlmcmFtZS0+Zl93aWR0aAk9IHBpeC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSAqIDggLwotCQlmcmFtZS0+Zm10LT5kZXB0aFswXTsKLQlmcmFtZS0+Zl9oZWlnaHQJPSBwaXgtPmhlaWdodDsKLQlmcmFtZS0+d2lkdGgJPSBwaXgtPndpZHRoOwotCWZyYW1lLT5oZWlnaHQJPSBwaXgtPmhlaWdodDsKLQlmcmFtZS0+b193aWR0aAk9IHBpeC0+d2lkdGg7Ci0JZnJhbWUtPm9faGVpZ2h0ID0gcGl4LT5oZWlnaHQ7Ci0JZnJhbWUtPm9mZnNfaAk9IDA7Ci0JZnJhbWUtPm9mZnNfdgk9IDA7CisJZmltY19maWxsX2ZyYW1lKGZyYW1lLCBmKTsKKworCWN0eC0+c2NhbGVyLmVuYWJsZWQgPSAxOwogCiAJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKIAkJZmltY19jdHhfc3RhdGVfbG9ja19zZXQoRklNQ19QQVJBTVMgfCBGSU1DX0RTVF9GTVQsIGN0eCk7CkBAIC0xMDA2LDM5ICsxMTExLDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCitzdGF0aWMgaW50IGZpbWNfbTJtX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXFidWZzKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisKIAlyZXR1cm4gdjRsMl9tMm1fcmVxYnVmcyhmaWxlLCBjdHgtPm0ybV9jdHgsIHJlcWJ1ZnMpOwogfQogCi1zdGF0aWMgaW50IGZpbWNfbTJtX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCitzdGF0aWMgaW50IGZpbWNfbTJtX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCSAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKKwogCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCitzdGF0aWMgaW50IGZpbWNfbTJtX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CiAKIAlyZXR1cm4gdjRsMl9tMm1fcWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgsIGJ1Zik7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3N0YXRpYyBpbnQgZmltY19tMm1fZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOworCiAJcmV0dXJuIHY0bDJfbTJtX2RxYnVmKGZpbGUsIGN0eC0+bTJtX2N0eCwgYnVmKTsKIH0KIAotc3RhdGljIGludCBmaW1jX20ybV9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQorc3RhdGljIGludCBmaW1jX20ybV9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkgICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CiAKIAkvKiBUaGUgc291cmNlIGFuZCB0YXJnZXQgY29sb3IgZm9ybWF0IG5lZWQgdG8gYmUgc2V0ICovCiAJaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQodHlwZSkpIHsKQEAgLTEwNTEsMTQ5ICsxMTU5LDE5IEBACiAJcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9uKGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7CiB9CiAKLXN0YXRpYyBpbnQgZmltY19tMm1fc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorc3RhdGljIGludCBmaW1jX20ybV9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAogCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gcHJpdjsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CisKIAlyZXR1cm4gdjRsMl9tMm1fc3RyZWFtb2ZmKGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7CiB9CiAKLWludCBmaW1jX3ZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKLXsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IHByaXY7Ci0Jc3RydWN0IHY0bDJfcXVlcnljdHJsICpjOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JYyA9IGdldF9jdHJsKHFjLT5pZCk7Ci0JaWYgKGMpIHsKLQkJKnFjID0gKmM7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChmaW1jX2N0eF9zdGF0ZV9pc19zZXQoRklNQ19DVFhfQ0FQLCBjdHgpKSB7Ci0JCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKGN0eC0+ZmltY19kZXYtPnZpZF9jYXAuc2QsCi0JCQkJCWNvcmUsIHF1ZXJ5Y3RybCwgcWMpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZmltY192aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJY3RybC0+dmFsdWUgPSAoRkxJUF9YX0FYSVMgJiBjdHgtPmZsaXApID8gMSA6IDA7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWN0cmwtPnZhbHVlID0gKEZMSVBfWV9BWElTICYgY3R4LT5mbGlwKSA/IDEgOiAwOwotCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1JPVEFURToKLQkJY3RybC0+dmFsdWUgPSBjdHgtPnJvdGF0aW9uOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfQ1RYX0NBUCwgY3R4KSkgewotCQkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoZmltYy0+dmlkX2NhcC5zZCwgY29yZSwKLQkJCQkJCWdfY3RybCwgY3RybCk7Ci0JCX0gZWxzZSB7Ci0JCQl2NGwyX2VycigmZmltYy0+bTJtLnY0bDJfZGV2LCAiSW52YWxpZCBjb250cm9sXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCWRiZygiY3RybC0+dmFsdWU9ICVkIiwgY3RybC0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjaGVja19jdHJsX3ZhbChzdHJ1Y3QgZmltY19jdHggKmN0eCwgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHY0bDJfcXVlcnljdHJsICpjOwotCWMgPSBnZXRfY3RybChjdHJsLT5pZCk7Ci0JaWYgKCFjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjdHJsLT52YWx1ZSA8IGMtPm1pbmltdW0gfHwgY3RybC0+dmFsdWUgPiBjLT5tYXhpbXVtCi0JCXx8IChjLT5zdGVwICE9IDAgJiYgY3RybC0+dmFsdWUgJSBjLT5zdGVwICE9IDApKSB7Ci0JCXY0bDJfZXJyKCZjdHgtPmZpbWNfZGV2LT5tMm0udjRsMl9kZXYsCi0JCSJJbnZhbGlkIGNvbnRyb2wgdmFsdWVcbiIpOwotCQlyZXR1cm4gLUVSQU5HRTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGZpbWNfc19jdHJsKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCAqdmFyaWFudCA9IGN0eC0+ZmltY19kZXYtPnZhcmlhbnQ7Ci0Jc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gY3R4LT5maW1jX2RldjsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAoY3RybC0+dmFsdWUpCi0JCQljdHgtPmZsaXAgfD0gRkxJUF9YX0FYSVM7Ci0JCWVsc2UKLQkJCWN0eC0+ZmxpcCAmPSB+RkxJUF9YX0FYSVM7Ci0JCWJyZWFrOwotCi0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKGN0cmwtPnZhbHVlKQotCQkJY3R4LT5mbGlwIHw9IEZMSVBfWV9BWElTOwotCQllbHNlCi0JCQljdHgtPmZsaXAgJj0gfkZMSVBfWV9BWElTOwotCQlicmVhazsKLQotCWNhc2UgVjRMMl9DSURfUk9UQVRFOgotCQlpZiAoZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfRFNUX0ZNVCB8IEZJTUNfU1JDX0ZNVCwgY3R4KSkgewotCQkJcmV0ID0gZmltY19jaGVja19zY2FsZXJfcmF0aW8oY3R4LT5zX2ZyYW1lLndpZHRoLAotCQkJCQljdHgtPnNfZnJhbWUuaGVpZ2h0LCBjdHgtPmRfZnJhbWUud2lkdGgsCi0JCQkJCWN0eC0+ZF9mcmFtZS5oZWlnaHQsIGN0cmwtPnZhbHVlKTsKLQkJfQotCi0JCWlmIChyZXQpIHsKLQkJCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJPdXQgb2Ygc2NhbGVyIHJhbmdlXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIHRoZSBvdXRwdXQgcm90YXRvciBhdmFpbGFiaWxpdHkgKi8KLQkJaWYgKChjdHJsLT52YWx1ZSA9PSA5MCB8fCBjdHJsLT52YWx1ZSA9PSAyNzApICYmCi0JCSAgICAoY3R4LT5pbl9wYXRoID09IEZJTUNfRE1BICYmICF2YXJpYW50LT5oYXNfb3V0X3JvdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY3R4LT5yb3RhdGlvbiA9IGN0cmwtPnZhbHVlOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsICJJbnZhbGlkIGNvbnRyb2xcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmaW1jX2N0eF9zdGF0ZV9sb2NrX3NldChGSU1DX1BBUkFNUywgY3R4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZpbWNfbTJtX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBwcml2OwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gY2hlY2tfY3RybF92YWwoY3R4LCBjdHJsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gZmltY19zX2N0cmwoY3R4LCBjdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmaW1jX20ybV9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyKQorCQkJICAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyKQogeworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZoKTsKIAlzdHJ1Y3QgZmltY19mcmFtZSAqZnJhbWU7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaDsKIAogCWZyYW1lID0gY3R4X2dldF9mcmFtZShjdHgsIGNyLT50eXBlKTsKIAlpZiAoSVNfRVJSKGZyYW1lKSkKQEAgLTEyMDEsOCArMTE3OSw4IEBACiAKIAljci0+Ym91bmRzLmxlZnQJCT0gMDsKIAljci0+Ym91bmRzLnRvcAkJPSAwOwotCWNyLT5ib3VuZHMud2lkdGgJPSBmcmFtZS0+Zl93aWR0aDsKLQljci0+Ym91bmRzLmhlaWdodAk9IGZyYW1lLT5mX2hlaWdodDsKKwljci0+Ym91bmRzLndpZHRoCT0gZnJhbWUtPm9fd2lkdGg7CisJY3ItPmJvdW5kcy5oZWlnaHQJPSBmcmFtZS0+b19oZWlnaHQ7CiAJY3ItPmRlZnJlY3QJCT0gY3ItPmJvdW5kczsKIAogCXJldHVybiAwOwpAQCAtMTIxMCw4ICsxMTg4LDggQEAKIAogc3RhdGljIGludCBmaW1jX20ybV9nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKIHsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaCk7CiAJc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lOwotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJZnJhbWUgPSBjdHhfZ2V0X2ZyYW1lKGN0eCwgY3ItPnR5cGUpOwogCWlmIChJU19FUlIoZnJhbWUpKQpAQCAtMTIyNSwyNiArMTIwMywyMSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZmltY190cnlfY3JvcChzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IHY0bDJfY3JvcCAqY3IpCitzdGF0aWMgaW50IGZpbWNfbTJtX3RyeV9jcm9wKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcikKIHsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCXN0cnVjdCBmaW1jX2ZyYW1lICpmOwogCXUzMiBtaW5fc2l6ZSwgaGFsaWduLCBkZXB0aCA9IDA7Ci0JYm9vbCBpc19jYXB0dXJlX2N0eDsKIAlpbnQgaTsKIAogCWlmIChjci0+Yy50b3AgPCAwIHx8IGNyLT5jLmxlZnQgPCAwKSB7Ci0JCXY0bDJfZXJyKCZmaW1jLT5tMm0udjRsMl9kZXYsCisJCXY0bDJfZXJyKGZpbWMtPm0ybS52ZmQsCiAJCQkiZG9lc24ndCBzdXBwb3J0IG5lZ2F0aXZlIHZhbHVlcyBmb3IgdG9wICYgbGVmdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQotCWlzX2NhcHR1cmVfY3R4ID0gZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfQ1RYX0NBUCwgY3R4KTsKLQogCWlmIChjci0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQotCQlmID0gaXNfY2FwdHVyZV9jdHggPyAmY3R4LT5zX2ZyYW1lIDogJmN0eC0+ZF9mcmFtZTsKLQllbHNlIGlmIChjci0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUgJiYKLQkJICFpc19jYXB0dXJlX2N0eCkKKwkJZiA9ICZjdHgtPmRfZnJhbWU7CisJZWxzZSBpZiAoY3ItPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQogCQlmID0gJmN0eC0+c19mcmFtZTsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI1MywxNSArMTIyNiwxMCBAQAogCQlmaW1jLT52YXJpYW50LT5taW5faW5wX3BpeHNpemUgOiBmaW1jLT52YXJpYW50LT5taW5fb3V0X3BpeHNpemU7CiAKIAkvKiBHZXQgcGl4ZWwgYWxpZ25tZW50IGNvbnN0cmFpbnRzLiAqLwotCWlmIChpc19jYXB0dXJlX2N0eCkgewotCQltaW5fc2l6ZSA9IDE2OwotCQloYWxpZ24gPSA0OwotCX0gZWxzZSB7Ci0JCWlmIChmaW1jLT5pZCA9PSAxICYmIGZpbWMtPnZhcmlhbnQtPnBpeF9ob2ZmKQotCQkJaGFsaWduID0gZmltY19mbXRfaXNfcmdiKGYtPmZtdC0+Y29sb3IpID8gMCA6IDE7Ci0JCWVsc2UKLQkJCWhhbGlnbiA9IGZmcyhtaW5fc2l6ZSkgLSAxOwotCX0KKwlpZiAoZmltYy0+aWQgPT0gMSAmJiBmaW1jLT52YXJpYW50LT5waXhfaG9mZikKKwkJaGFsaWduID0gZmltY19mbXRfaXNfcmdiKGYtPmZtdC0+Y29sb3IpID8gMCA6IDE7CisJZWxzZQorCQloYWxpZ24gPSBmZnMobWluX3NpemUpIC0gMTsKIAogCWZvciAoaSA9IDA7IGkgPCBmLT5mbXQtPmNvbHBsYW5lczsgaSsrKQogCQlkZXB0aCArPSBmLT5mbXQtPmRlcHRoW2ldOwpAQCAtMTI3OCw3ICsxMjQ2LDcgQEAKIAkJY3ItPmMudG9wID0gZi0+b19oZWlnaHQgLSBjci0+Yy5oZWlnaHQ7CiAKIAljci0+Yy5sZWZ0ID0gcm91bmRfZG93bihjci0+Yy5sZWZ0LCBtaW5fc2l6ZSk7Ci0JY3ItPmMudG9wICA9IHJvdW5kX2Rvd24oY3ItPmMudG9wLCBpc19jYXB0dXJlX2N0eCA/IDE2IDogOCk7CisJY3ItPmMudG9wICA9IHJvdW5kX2Rvd24oY3ItPmMudG9wLCBmaW1jLT52YXJpYW50LT5ob3Jfb2Zmc19hbGlnbik7CiAKIAlkYmcoImw6JWQsIHQ6JWQsIHc6JWQsIGg6JWQsIGZfdzogJWQsIGZfaDogJWQiLAogCSAgICBjci0+Yy5sZWZ0LCBjci0+Yy50b3AsIGNyLT5jLndpZHRoLCBjci0+Yy5oZWlnaHQsCkBAIC0xMjg5LDEyICsxMjU3LDEyIEBACiAKIHN0YXRpYyBpbnQgZmltY19tMm1fc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JvcCAqY3IpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmgpOwogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAJc3RydWN0IGZpbWNfZnJhbWUgKmY7CiAJaW50IHJldDsKIAotCXJldCA9IGZpbWNfdHJ5X2Nyb3AoY3R4LCBjcik7CisJcmV0ID0gZmltY19tMm1fdHJ5X2Nyb3AoY3R4LCBjcik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTMwNCwxOCArMTI3MiwxNiBAQAogCS8qIENoZWNrIHRvIHNlZSBpZiBzY2FsaW5nIHJhdGlvIGlzIHdpdGhpbiBzdXBwb3J0ZWQgcmFuZ2UgKi8KIAlpZiAoZmltY19jdHhfc3RhdGVfaXNfc2V0KEZJTUNfRFNUX0ZNVCB8IEZJTUNfU1JDX0ZNVCwgY3R4KSkgewogCQlpZiAoY3ItPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7Ci0JCQlyZXQgPSBmaW1jX2NoZWNrX3NjYWxlcl9yYXRpbyhjci0+Yy53aWR0aCwgY3ItPmMuaGVpZ2h0LAotCQkJCQkJICAgICAgY3R4LT5kX2ZyYW1lLndpZHRoLAotCQkJCQkJICAgICAgY3R4LT5kX2ZyYW1lLmhlaWdodCwKLQkJCQkJCSAgICAgIGN0eC0+cm90YXRpb24pOworCQkJcmV0ID0gZmltY19jaGVja19zY2FsZXJfcmF0aW8oY3R4LCBjci0+Yy53aWR0aCwKKwkJCQkJY3ItPmMuaGVpZ2h0LCBjdHgtPmRfZnJhbWUud2lkdGgsCisJCQkJCWN0eC0+ZF9mcmFtZS5oZWlnaHQsIGN0eC0+cm90YXRpb24pOwogCQl9IGVsc2UgewotCQkJcmV0ID0gZmltY19jaGVja19zY2FsZXJfcmF0aW8oY3R4LT5zX2ZyYW1lLndpZHRoLAotCQkJCQkJICAgICAgY3R4LT5zX2ZyYW1lLmhlaWdodCwKLQkJCQkJCSAgICAgIGNyLT5jLndpZHRoLCBjci0+Yy5oZWlnaHQsCi0JCQkJCQkgICAgICBjdHgtPnJvdGF0aW9uKTsKKwkJCXJldCA9IGZpbWNfY2hlY2tfc2NhbGVyX3JhdGlvKGN0eCwgY3R4LT5zX2ZyYW1lLndpZHRoLAorCQkJCQljdHgtPnNfZnJhbWUuaGVpZ2h0LCBjci0+Yy53aWR0aCwKKwkJCQkJY3ItPmMuaGVpZ2h0LCBjdHgtPnJvdGF0aW9uKTsKIAkJfQogCQlpZiAocmV0KSB7Ci0JCQl2NGwyX2VycigmZmltYy0+bTJtLnY0bDJfZGV2LCAiT3V0IG9mIHNjYWxlciByYW5nZVxuIik7CisJCQl2NGwyX2VycihmaW1jLT5tMm0udmZkLCAiT3V0IG9mIHNjYWxlciByYW5nZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTEzMzMsMTQgKzEyOTksMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgZmltY19tMm1faW9jdGxfb3BzID0gewogCS52aWRpb2NfcXVlcnljYXAJCT0gZmltY19tMm1fcXVlcnljYXAsCiAKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lCT0gZmltY192aWRpb2NfZW51bV9mbXRfbXBsYW5lLAotCS52aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUJPSBmaW1jX3ZpZGlvY19lbnVtX2ZtdF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfbTJtX2VudW1fZm10X21wbGFuZSwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY19tMm1fZW51bV9mbXRfbXBsYW5lLAogCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfdmlkaW9jX2dfZm10X21wbGFuZSwKLQkudmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY192aWRpb2NfZ19mbXRfbXBsYW5lLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUJPSBmaW1jX20ybV9nX2ZtdF9tcGxhbmUsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZQk9IGZpbWNfbTJtX2dfZm10X21wbGFuZSwKIAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfdmlkaW9jX3RyeV9mbXRfbXBsYW5lLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X21wbGFuZQk9IGZpbWNfdmlkaW9jX3RyeV9mbXRfbXBsYW5lLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfbTJtX3RyeV9mbXRfbXBsYW5lLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X21wbGFuZQk9IGZpbWNfbTJtX3RyeV9mbXRfbXBsYW5lLAogCiAJLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZQk9IGZpbWNfbTJtX3NfZm10X21wbGFuZSwKIAkudmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lCT0gZmltY19tMm1fc19mbXRfbXBsYW5lLApAQCAtMTM1NCwxMCArMTMyMCw2IEBACiAJLnZpZGlvY19zdHJlYW1vbgkJPSBmaW1jX20ybV9zdHJlYW1vbiwKIAkudmlkaW9jX3N0cmVhbW9mZgkJPSBmaW1jX20ybV9zdHJlYW1vZmYsCiAKLQkudmlkaW9jX3F1ZXJ5Y3RybAkJPSBmaW1jX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwJCQk9IGZpbWNfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJCT0gZmltY19tMm1fc19jdHJsLAotCiAJLnZpZGlvY19nX2Nyb3AJCQk9IGZpbWNfbTJtX2dfY3JvcCwKIAkudmlkaW9jX3NfY3JvcAkJCT0gZmltY19tMm1fc19jcm9wLAogCS52aWRpb2NfY3JvcGNhcAkJCT0gZmltY19tMm1fY3JvcGNhcApAQCAtMTM5Niw3ICsxMzU4LDggQEAKIHN0YXRpYyBpbnQgZmltY19tMm1fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eDsKKwlpbnQgcmV0OwogCiAJZGJnKCJwaWQ6ICVkLCBzdGF0ZTogMHglbHgsIHJlZmNudDogJWQiLAogCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgZmltYy0+c3RhdGUsIGZpbWMtPnZpZF9jYXAucmVmY250KTsKQEAgLTE0MDgsMTkgKzEzNzEsMjQgQEAKIAlpZiAoZmltYy0+dmlkX2NhcC5yZWZjbnQgPiAwKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JZmltYy0+bTJtLnJlZmNudCsrOwotCXNldF9iaXQoU1RfT1VURE1BX1JVTiwgJmZpbWMtPnN0YXRlKTsKLQogCWN0eCA9IGt6YWxsb2Moc2l6ZW9mICpjdHgsIEdGUF9LRVJORUwpOwogCWlmICghY3R4KQogCQlyZXR1cm4gLUVOT01FTTsKKwl2NGwyX2ZoX2luaXQoJmN0eC0+ZmgsIGZpbWMtPm0ybS52ZmQpOworCXJldCA9IGZpbWNfY3RybHNfY3JlYXRlKGN0eCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9maDsKIAotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKKwkvKiBVc2Ugc2VwYXJhdGUgY29udHJvbCBoYW5kbGVyIHBlciBmaWxlIGhhbmRsZSAqLworCWN0eC0+ZmguY3RybF9oYW5kbGVyID0gJmN0eC0+Y3RybF9oYW5kbGVyOworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZjdHgtPmZoOworCXY0bDJfZmhfYWRkKCZjdHgtPmZoKTsKKwogCWN0eC0+ZmltY19kZXYgPSBmaW1jOwogCS8qIERlZmF1bHQgY29sb3IgZm9ybWF0ICovCiAJY3R4LT5zX2ZyYW1lLmZtdCA9ICZmaW1jX2Zvcm1hdHNbMF07CiAJY3R4LT5kX2ZyYW1lLmZtdCA9ICZmaW1jX2Zvcm1hdHNbMF07Ci0JLyogU2V0dXAgdGhlIGRldmljZSBjb250ZXh0IGZvciBtZW0ybWVtIG1vZGUuICovCisJLyogU2V0dXAgdGhlIGRldmljZSBjb250ZXh0IGZvciBtZW1vcnktdG8tbWVtb3J5IG1vZGUgKi8KIAljdHgtPnN0YXRlID0gRklNQ19DVFhfTTJNOwogCWN0eC0+ZmxhZ3MgPSAwOwogCWN0eC0+aW5fcGF0aCA9IEZJTUNfRE1BOwpAQCAtMTQyOSwzNCArMTM5Nyw0NiBAQAogCiAJY3R4LT5tMm1fY3R4ID0gdjRsMl9tMm1fY3R4X2luaXQoZmltYy0+bTJtLm0ybV9kZXYsIGN0eCwgcXVldWVfaW5pdCk7CiAJaWYgKElTX0VSUihjdHgtPm0ybV9jdHgpKSB7Ci0JCWludCBlcnIgPSBQVFJfRVJSKGN0eC0+bTJtX2N0eCk7Ci0JCWtmcmVlKGN0eCk7Ci0JCXJldHVybiBlcnI7CisJCXJldCA9IFBUUl9FUlIoY3R4LT5tMm1fY3R4KTsKKwkJZ290byBlcnJvcl9jOwogCX0KIAorCWlmIChmaW1jLT5tMm0ucmVmY250KysgPT0gMCkKKwkJc2V0X2JpdChTVF9NMk1fUlVOLCAmZmltYy0+c3RhdGUpOwogCXJldHVybiAwOworCitlcnJvcl9jOgorCWZpbWNfY3RybHNfZGVsZXRlKGN0eCk7CitlcnJvcl9maDoKKwl2NGwyX2ZoX2RlbCgmY3R4LT5maCk7CisJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKKwlrZnJlZShjdHgpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19tMm1fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmltY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaWxlLT5wcml2YXRlX2RhdGEpOwogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IGN0eC0+ZmltY19kZXY7CiAKIAlkYmcoInBpZDogJWQsIHN0YXRlOiAweCVseCwgcmVmY250PSAlZCIsCiAJCXRhc2tfcGlkX25yKGN1cnJlbnQpLCBmaW1jLT5zdGF0ZSwgZmltYy0+bTJtLnJlZmNudCk7CiAKIAl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPm0ybV9jdHgpOwotCWtmcmVlKGN0eCk7Ci0JaWYgKC0tZmltYy0+bTJtLnJlZmNudCA8PSAwKQotCQljbGVhcl9iaXQoU1RfT1VURE1BX1JVTiwgJmZpbWMtPnN0YXRlKTsKKwlmaW1jX2N0cmxzX2RlbGV0ZShjdHgpOworCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOwogCisJaWYgKC0tZmltYy0+bTJtLnJlZmNudCA8PSAwKQorCQljbGVhcl9iaXQoU1RfTTJNX1JVTiwgJmZpbWMtPnN0YXRlKTsKKwlrZnJlZShjdHgpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZpbWNfbTJtX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCisJCQkJICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbWNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAogCXJldHVybiB2NGwyX20ybV9wb2xsKGZpbGUsIGN0eC0+bTJtX2N0eCwgd2FpdCk7CiB9CkBAIC0xNDY0LDcgKzE0NDQsNyBAQAogCiBzdGF0aWMgaW50IGZpbWNfbTJtX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmaW1jX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKIAlyZXR1cm4gdjRsMl9tMm1fbW1hcChmaWxlLCBjdHgtPm0ybV9jdHgsIHZtYSk7CiB9CkBAIC0xNDgzLDkyICsxNDYzLDczIEBACiAJLmpvYl9hYm9ydAk9IGZpbWNfam9iX2Fib3J0LAogfTsKIAotc3RhdGljIGludCBmaW1jX3JlZ2lzdGVyX20ybV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQoraW50IGZpbWNfcmVnaXN0ZXJfbTJtX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsCisJCQkgICAgIHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldjsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghZmltYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwZGV2ID0gZmltYy0+cGRldjsKLQl2NGwyX2RldiA9ICZmaW1jLT5tMm0udjRsMl9kZXY7Ci0KLQkvKiBzZXQgbmFtZSBpZiBpdCBpcyBlbXB0eSAqLwotCWlmICghdjRsMl9kZXYtPm5hbWVbMF0pCi0JCXNucHJpbnRmKHY0bDJfZGV2LT5uYW1lLCBzaXplb2YodjRsMl9kZXYtPm5hbWUpLAotCQkJICIlcy5tMm0iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0KLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCB2NGwyX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfbTJtX3IxOworCWZpbWMtPnY0bDJfZGV2ID0gdjRsMl9kZXY7CiAKIAl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKIAlpZiAoIXZmZCkgewogCQl2NGwyX2Vycih2NGwyX2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9tMm1fcjE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXZmZC0+Zm9wcwk9ICZmaW1jX20ybV9mb3BzOwogCXZmZC0+aW9jdGxfb3BzCT0gJmZpbWNfbTJtX2lvY3RsX29wczsKKwl2ZmQtPnY0bDJfZGV2CT0gdjRsMl9kZXY7CiAJdmZkLT5taW5vcgk9IC0xOwogCXZmZC0+cmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlOwogCXZmZC0+bG9jawk9ICZmaW1jLT5sb2NrOwogCi0Jc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzOm0ybSIsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQorCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcy5tMm0iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CiAJdmlkZW9fc2V0X2RydmRhdGEodmZkLCBmaW1jKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmaW1jKTsKIAogCWZpbWMtPm0ybS52ZmQgPSB2ZmQ7CiAJZmltYy0+bTJtLm0ybV9kZXYgPSB2NGwyX20ybV9pbml0KCZtMm1fb3BzKTsKIAlpZiAoSVNfRVJSKGZpbWMtPm0ybS5tMm1fZGV2KSkgewogCQl2NGwyX2Vycih2NGwyX2RldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHY0bDItbTJtIGRldmljZVxuIik7CiAJCXJldCA9IFBUUl9FUlIoZmltYy0+bTJtLm0ybV9kZXYpOwotCQlnb3RvIGVycl9tMm1fcjI7CisJCWdvdG8gZXJyX2luaXQ7CiAJfQogCi0JcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChyZXQpIHsKLQkJdjRsMl9lcnIodjRsMl9kZXYsCi0JCQkgIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfbTJtX3IzOwotCX0KLQl2NGwyX2luZm8odjRsMl9kZXYsCi0JCSAgIkZJTUMgbTJtIGRyaXZlciByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZFxuIiwgdmZkLT5udW0pOworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZ2ZmQtPmVudGl0eSwgMCwgTlVMTCwgMCk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOwogCi0JcmV0dXJuIDA7Ci0KLWVycl9tMm1fcjM6CiAJdjRsMl9tMm1fcmVsZWFzZShmaW1jLT5tMm0ubTJtX2Rldik7Ci1lcnJfbTJtX3IyOgorZXJyX2luaXQ6CiAJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZmltYy0+bTJtLnZmZCk7Ci1lcnJfbTJtX3IxOgotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIodjRsMl9kZXYpOwotCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZmltY191bnJlZ2lzdGVyX20ybV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQordm9pZCBmaW1jX3VucmVnaXN0ZXJfbTJtX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCiB7Ci0JaWYgKGZpbWMpIHsKLQkJdjRsMl9tMm1fcmVsZWFzZShmaW1jLT5tMm0ubTJtX2Rldik7Ci0JCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGZpbWMtPm0ybS52ZmQpOworCWlmICghZmltYykKKwkJcmV0dXJuOwogCi0JCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmZpbWMtPm0ybS52NGwyX2Rldik7CisJaWYgKGZpbWMtPm0ybS5tMm1fZGV2KQorCQl2NGwyX20ybV9yZWxlYXNlKGZpbWMtPm0ybS5tMm1fZGV2KTsKKwlpZiAoZmltYy0+bTJtLnZmZCkgeworCQltZWRpYV9lbnRpdHlfY2xlYW51cCgmZmltYy0+bTJtLnZmZC0+ZW50aXR5KTsKKwkJLyogQ2FuIGFsc28gYmUgY2FsbGVkIGlmIHZpZGVvIGRldmljZSB3YXNuJ3QgcmVnaXN0ZXJlZCAqLworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShmaW1jLT5tMm0udmZkKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGZpbWNfY2xrX3JlbGVhc2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKQorc3RhdGljIHZvaWQgZmltY19jbGtfcHV0KHN0cnVjdCBmaW1jX2RldiAqZmltYykKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgZmltYy0+bnVtX2Nsb2NrczsgaSsrKSB7Ci0JCWlmIChmaW1jLT5jbG9ja1tpXSkgewotCQkJY2xrX2Rpc2FibGUoZmltYy0+Y2xvY2tbaV0pOworCQlpZiAoZmltYy0+Y2xvY2tbaV0pCiAJCQljbGtfcHV0KGZpbWMtPmNsb2NrW2ldKTsKLQkJfQogCX0KIH0KIApAQCAtMTU3NywxNSArMTUzOCw1MCBAQAogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBmaW1jLT5udW1fY2xvY2tzOyBpKyspIHsKIAkJZmltYy0+Y2xvY2tbaV0gPSBjbGtfZ2V0KCZmaW1jLT5wZGV2LT5kZXYsIGZpbWNfY2xvY2tzW2ldKTsKLQotCQlpZiAoIUlTX0VSUl9PUl9OVUxMKGZpbWMtPmNsb2NrW2ldKSkgewotCQkJY2xrX2VuYWJsZShmaW1jLT5jbG9ja1tpXSk7CisJCWlmICghSVNfRVJSX09SX05VTEwoZmltYy0+Y2xvY2tbaV0pKQogCQkJY29udGludWU7Ci0JCX0KIAkJZGV2X2VycigmZmltYy0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBmaW1jIGNsb2NrOiAlc1xuIiwKIAkJCWZpbWNfY2xvY2tzW2ldKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX20ybV9zdXNwZW5kKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0aW1lb3V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJaWYgKCFmaW1jX20ybV9wZW5kaW5nKGZpbWMpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwljbGVhcl9iaXQoU1RfTTJNX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKTsKKwlzZXRfYml0KFNUX00yTV9TVVNQRU5ESU5HLCAmZmltYy0+c3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisKKwl0aW1lb3V0ID0gd2FpdF9ldmVudF90aW1lb3V0KGZpbWMtPmlycV9xdWV1ZSwKKwkJCSAgICAgdGVzdF9iaXQoU1RfTTJNX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKSwKKwkJCSAgICAgRklNQ19TSFVURE9XTl9USU1FT1VUKTsKKworCWNsZWFyX2JpdChTVF9NMk1fU1VTUEVORElORywgJmZpbWMtPnN0YXRlKTsKKwlyZXR1cm4gdGltZW91dCA9PSAwID8gLUVBR0FJTiA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZmltY19tMm1fcmVzdW1lKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CisJLyogQ2xlYXIgZm9yIGZ1bGwgSC9XIHNldHVwIGluIGZpcnN0IHJ1biBhZnRlciByZXN1bWUgKi8KKwlmaW1jLT5tMm0uY3R4ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVF9NMk1fU1VTUEVOREVELCAmZmltYy0+c3RhdGUpKQorCQlmaW1jX20ybV9qb2JfZmluaXNoKGZpbWMtPm0ybS5jdHgsCisJCQkJICAgIFZCMl9CVUZfU1RBVEVfRVJST1IpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTk2LDcgKzE1OTIsNiBAQAogCXN0cnVjdCBzYW1zdW5nX2ZpbWNfZHJpdmVyZGF0YSAqZHJ2X2RhdGE7CiAJc3RydWN0IHM1cF9wbGF0Zm9ybV9maW1jICpwZGF0YTsKIAlpbnQgcmV0ID0gMDsKLQlpbnQgY2FwX2lucHV0X2luZGV4ID0gLTE7CiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcygpOlxuIiwgX19mdW5jX18pOwogCkBAIC0xNjE0LDE1ICsxNjA5LDE2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmltYy0+aWQgPSBwZGV2LT5pZDsKKwogCWZpbWMtPnZhcmlhbnQgPSBkcnZfZGF0YS0+dmFyaWFudFtmaW1jLT5pZF07CiAJZmltYy0+cGRldiA9IHBkZXY7CiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlmaW1jLT5wZGF0YSA9IHBkYXRhOwotCWZpbWMtPnN0YXRlID0gU1RfSURMRTsKKworCXNldF9iaXQoU1RfTFBNLCAmZmltYy0+c3RhdGUpOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZmltYy0+aXJxX3F1ZXVlKTsKIAlzcGluX2xvY2tfaW5pdCgmZmltYy0+c2xvY2spOwotCiAJbXV0ZXhfaW5pdCgmZmltYy0+bG9jayk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpAQCAtMTY0Nyw3MSArMTY0Myw1MSBAQAogCQlnb3RvIGVycl9yZXFfcmVnaW9uOwogCX0KIAotCWZpbWMtPm51bV9jbG9ja3MgPSBNQVhfRklNQ19DTE9DS1MgLSAxOwotCi0JLyogQ2hlY2sgaWYgYSB2aWRlbyBjYXB0dXJlIG5vZGUgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZC4gKi8KLQlpZiAocGRhdGEgJiYgcGRhdGEtPm51bV9jbGllbnRzID4gMCkgewotCQljYXBfaW5wdXRfaW5kZXggPSAwOwotCQlmaW1jLT5udW1fY2xvY2tzKys7Ci0JfQotCi0JcmV0ID0gZmltY19jbGtfZ2V0KGZpbWMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JlZ3NfdW5tYXA7Ci0JY2xrX3NldF9yYXRlKGZpbWMtPmNsb2NrW0NMS19CVVNdLCBkcnZfZGF0YS0+bGNsa19mcmVxdWVuY3kpOwotCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKIAlpZiAoIXJlcykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IElSUSByZXNvdXJjZVxuIik7CiAJCXJldCA9IC1FTlhJTzsKLQkJZ290byBlcnJfY2xrOworCQlnb3RvIGVycl9yZWdzX3VubWFwOwogCX0KIAlmaW1jLT5pcnEgPSByZXMtPnN0YXJ0OwogCi0JZmltY19od19yZXNldChmaW1jKTsKKwlmaW1jLT5udW1fY2xvY2tzID0gTUFYX0ZJTUNfQ0xPQ0tTOworCXJldCA9IGZpbWNfY2xrX2dldChmaW1jKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWdzX3VubWFwOworCWNsa19zZXRfcmF0ZShmaW1jLT5jbG9ja1tDTEtfQlVTXSwgZHJ2X2RhdGEtPmxjbGtfZnJlcXVlbmN5KTsKKwljbGtfZW5hYmxlKGZpbWMtPmNsb2NrW0NMS19CVVNdKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGZpbWMtPmlycSwgZmltY19pc3IsIDAsIHBkZXYtPm5hbWUsIGZpbWMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZpbWMpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZmltYy0+aXJxLCBmaW1jX2lycV9oYW5kbGVyLCAwLCBwZGV2LT5uYW1lLCBmaW1jKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLCByZXQpOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfaXJxOwogCS8qIEluaXRpYWxpemUgY29udGlndW91cyBtZW1vcnkgYWxsb2NhdG9yICovCi0JZmltYy0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoJmZpbWMtPnBkZXYtPmRldik7CisJZmltYy0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoJnBkZXYtPmRldik7CiAJaWYgKElTX0VSUihmaW1jLT5hbGxvY19jdHgpKSB7CiAJCXJldCA9IFBUUl9FUlIoZmltYy0+YWxsb2NfY3R4KTsKLQkJZ290byBlcnJfaXJxOworCQlnb3RvIGVycl9wbTsKIAl9CiAKLQlyZXQgPSBmaW1jX3JlZ2lzdGVyX20ybV9kZXZpY2UoZmltYyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfaXJxOworCWRldl9kYmcoJnBkZXYtPmRldiwgIkZJTUMuJWQgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcbiIsIGZpbWMtPmlkKTsKIAotCS8qIEF0IGxlYXN0IG9uZSBjYW1lcmEgc2Vuc29yIGlzIHJlcXVpcmVkIHRvIHJlZ2lzdGVyIGNhcHR1cmUgbm9kZSAqLwotCWlmIChjYXBfaW5wdXRfaW5kZXggPj0gMCkgewotCQlyZXQgPSBmaW1jX3JlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKGZpbWMpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfbTJtOwotCQljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tDTEtfQ0FNXSk7Ci0JfQotCS8qCi0JICogRXhjbHVkZSB0aGUgYWRkaXRpb25hbCBvdXRwdXQgRE1BIGFkZHJlc3MgcmVnaXN0ZXJzIGJ5IG1hc2tpbmcKLQkgKiB0aGVtIG91dCBvbiBIVyByZXZpc2lvbnMgdGhhdCBwcm92aWRlIGV4dGVuZGVkIGNhcGFiaWxpdGVzLgotCSAqLwotCWlmIChmaW1jLT52YXJpYW50LT5vdXRfYnVmX2NvdW50ID4gNCkKLQkJZmltY19od19zZXRfZG1hX3NlcShmaW1jLCAweEYpOwotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoKTogZmltYy0lZCByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuIiwKLQkJX19mdW5jX18sIGZpbWMtPmlkKTsKLQorCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCXJldHVybiAwOwogCi1lcnJfbTJtOgotCWZpbWNfdW5yZWdpc3Rlcl9tMm1fZGV2aWNlKGZpbWMpOworZXJyX3BtOgorCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogZXJyX2lycToKIAlmcmVlX2lycShmaW1jLT5pcnEsIGZpbWMpOwogZXJyX2NsazoKLQlmaW1jX2Nsa19yZWxlYXNlKGZpbWMpOworCWZpbWNfY2xrX3B1dChmaW1jKTsKIGVycl9yZWdzX3VubWFwOgogCWlvdW5tYXAoZmltYy0+cmVncyk7CiBlcnJfcmVxX3JlZ2lvbjoKQEAgLTE3MTksMzEgKzE2OTUsMTA1IEBACiAJa2ZyZWUoZmltYy0+cmVnc19yZXMpOwogZXJyX2luZm86CiAJa2ZyZWUoZmltYyk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGZpbWNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9CWRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGJnKCJmaW1jJWQ6IHN0YXRlOiAweCVseCIsIGZpbWMtPmlkLCBmaW1jLT5zdGF0ZSk7CisKKwkvKiBFbmFibGUgY2xvY2tzIGFuZCBwZXJmb3JtIGJhc2ljIGluaXRhbGl6YXRpb24gKi8KKwljbGtfZW5hYmxlKGZpbWMtPmNsb2NrW0NMS19HQVRFXSk7CisJZmltY19od19yZXNldChmaW1jKTsKKwlpZiAoZmltYy0+dmFyaWFudC0+b3V0X2J1Zl9jb3VudCA+IDQpCisJCWZpbWNfaHdfc2V0X2RtYV9zZXEoZmltYywgMHhGKTsKKworCS8qIFJlc3VtZSB0aGUgY2FwdHVyZSBvciBtZW0tdG8tbWVtIGRldmljZSAqLworCWlmIChmaW1jX2NhcHR1cmVfYnVzeShmaW1jKSkKKwkJcmV0dXJuIGZpbWNfY2FwdHVyZV9yZXN1bWUoZmltYyk7CisJZWxzZSBpZiAoZmltY19tMm1fcGVuZGluZyhmaW1jKSkKKwkJcmV0dXJuIGZpbWNfbTJtX3Jlc3VtZShmaW1jKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW1jX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0JZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmltY19jYXB0dXJlX2J1c3koZmltYykpCisJCXJldCA9IGZpbWNfY2FwdHVyZV9zdXNwZW5kKGZpbWMpOworCWVsc2UKKwkJcmV0ID0gZmltY19tMm1fc3VzcGVuZChmaW1jKTsKKwlpZiAoIXJldCkKKwkJY2xrX2Rpc2FibGUoZmltYy0+Y2xvY2tbQ0xLX0dBVEVdKTsKKworCWRiZygiZmltYyVkOiBzdGF0ZTogMHglbHgiLCBmaW1jLT5pZCwgZmltYy0+c3RhdGUpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgZmltY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9CWRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoImZpbWMlZDogc3RhdGU6IDB4JWx4IiwgZmltYy0+aWQsIGZpbWMtPnN0YXRlKTsKKworCS8qIERvIG5vdCByZXN1bWUgaWYgdGhlIGRldmljZSB3YXMgaWRsZSBiZWZvcmUgc3lzdGVtIHN1c3BlbmQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTVF9MUE0sICZmaW1jLT5zdGF0ZSkgfHwKKwkgICAgKCFmaW1jX20ybV9hY3RpdmUoZmltYykgJiYgIWZpbWNfY2FwdHVyZV9idXN5KGZpbWMpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJZmltY19od19yZXNldChmaW1jKTsKKwlpZiAoZmltYy0+dmFyaWFudC0+b3V0X2J1Zl9jb3VudCA+IDQpCisJCWZpbWNfaHdfc2V0X2RtYV9zZXEoZmltYywgMHhGKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaW1jLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKGZpbWNfY2FwdHVyZV9idXN5KGZpbWMpKQorCQlyZXR1cm4gZmltY19jYXB0dXJlX3Jlc3VtZShmaW1jKTsKKworCXJldHVybiBmaW1jX20ybV9yZXN1bWUoZmltYyk7Cit9CisKK3N0YXRpYyBpbnQgZmltY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPQlkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRiZygiZmltYyVkOiBzdGF0ZTogMHglbHgiLCBmaW1jLT5pZCwgZmltYy0+c3RhdGUpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU1RfTFBNLCAmZmltYy0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoZmltY19jYXB0dXJlX2J1c3koZmltYykpCisJCXJldHVybiBmaW1jX2NhcHR1cmVfc3VzcGVuZChmaW1jKTsKKworCXJldHVybiBmaW1jX20ybV9zdXNwZW5kKGZpbWMpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBmaW1jX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9Ci0JCShzdHJ1Y3QgZmltY19kZXYgKilwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWZyZWVfaXJxKGZpbWMtPmlycSwgZmltYyk7Ci0JZmltY19od19yZXNldChmaW1jKTsKLQotCWZpbWNfdW5yZWdpc3Rlcl9tMm1fZGV2aWNlKGZpbWMpOwotCWZpbWNfdW5yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShmaW1jKTsKLQotCWZpbWNfY2xrX3JlbGVhc2UoZmltYyk7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWZpbWNfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmcGRldi0+ZGV2KTsKIAogCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGZpbWMtPmFsbG9jX2N0eCk7CiAKKwljbGtfZGlzYWJsZShmaW1jLT5jbG9ja1tDTEtfQlVTXSk7CisJZmltY19jbGtfcHV0KGZpbWMpOworCWZyZWVfaXJxKGZpbWMtPmlycSwgZmltYyk7CiAJaW91bm1hcChmaW1jLT5yZWdzKTsKIAlyZWxlYXNlX3Jlc291cmNlKGZpbWMtPnJlZ3NfcmVzKTsKIAlrZnJlZShmaW1jLT5yZWdzX3Jlcyk7CiAJa2ZyZWUoZmltYyk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMgZHJpdmVyIHVubG9hZGVkXG4iLCBwZGV2LT5uYW1lKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZHJpdmVyIHVubG9hZGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc4Niw2ICsxODM2LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgZmltYzBfdmFyaWFudF9zNXAgPSB7CiAJLmhhc19pbnBfcm90CSA9IDEsCiAJLmhhc19vdXRfcm90CSA9IDEsCisJLmhhc19jYW1faWYJID0gMSwKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LAogCS5ob3Jfb2Zmc19hbGlnbgkgPSA4LApAQCAtMTc5NCw2ICsxODQ1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgZmltYzJfdmFyaWFudF9zNXAgPSB7CisJLmhhc19jYW1faWYJID0gMSwKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LAogCS5ob3Jfb2Zmc19hbGlnbgkgPSA4LApAQCAtMTgwNSw2ICsxODU3LDcgQEAKIAkucGl4X2hvZmYJID0gMSwKIAkuaGFzX2lucF9yb3QJID0gMSwKIAkuaGFzX291dF9yb3QJID0gMSwKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCiAJLmhvcl9vZmZzX2FsaWduCSA9IDgsCkBAIC0xODE2LDYgKzE4NjksNyBAQAogCS5waXhfaG9mZgkgPSAxLAogCS5oYXNfaW5wX3JvdAkgPSAxLAogCS5oYXNfb3V0X3JvdAkgPSAxLAorCS5oYXNfY2FtX2lmCSA9IDEsCiAJLmhhc19tYWluc2NhbGVyX2V4dCA9IDEsCiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKQEAgLTE4MjUsNiArMTg3OSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfZmltY192YXJpYW50IGZpbWMyX3ZhcmlhbnRfczVwdjIxMCA9IHsKKwkuaGFzX2NhbV9pZgkgPSAxLAogCS5waXhfaG9mZgkgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCkBAIC0xODM3LDIyICsxODkyLDI0IEBACiAJLnBpeF9ob2ZmCSA9IDEsCiAJLmhhc19pbnBfcm90CSA9IDEsCiAJLmhhc19vdXRfcm90CSA9IDEsCisJLmhhc19jYW1faWYJID0gMSwKIAkuaGFzX2Npc3RhdHVzMgkgPSAxLAogCS5oYXNfbWFpbnNjYWxlcl9leHQgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCi0JLmhvcl9vZmZzX2FsaWduCSA9IDEsCisJLmhvcl9vZmZzX2FsaWduCSA9IDIsCiAJLm91dF9idWZfY291bnQJID0gMzIsCiAJLnBpeF9saW1pdAkgPSAmczVwX3BpeF9saW1pdFsxXSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19maW1jX3ZhcmlhbnQgZmltYzJfdmFyaWFudF9leHlub3M0ID0geworc3RhdGljIHN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCBmaW1jM192YXJpYW50X2V4eW5vczQgPSB7CiAJLnBpeF9ob2ZmCSA9IDEsCisJLmhhc19jYW1faWYJID0gMSwKIAkuaGFzX2Npc3RhdHVzMgkgPSAxLAogCS5oYXNfbWFpbnNjYWxlcl9leHQgPSAxLAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCi0JLmhvcl9vZmZzX2FsaWduCSA9IDEsCisJLmhvcl9vZmZzX2FsaWduCSA9IDIsCiAJLm91dF9idWZfY291bnQJID0gMzIsCiAJLnBpeF9saW1pdAkgPSAmczVwX3BpeF9saW1pdFszXSwKIH07CkBAIC0xODg1LDcgKzE5NDIsNyBAQAogCQlbMF0gPSAmZmltYzBfdmFyaWFudF9leHlub3M0LAogCQlbMV0gPSAmZmltYzBfdmFyaWFudF9leHlub3M0LAogCQlbMl0gPSAmZmltYzBfdmFyaWFudF9leHlub3M0LAotCQlbM10gPSAmZmltYzJfdmFyaWFudF9leHlub3M0LAorCQlbM10gPSAmZmltYzNfdmFyaWFudF9leHlub3M0LAogCX0sCiAJLm51bV9lbnRpdGllcyA9IDQsCiAJLmxjbGtfZnJlcXVlbmN5ID0gMTY2MDAwMDAwVUwsCkBAIC0xOTA2LDMzICsxOTYzLDI4IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgZmltY19kcml2ZXJfaWRzKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGZpbWNfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGZpbWNfc3VzcGVuZCwgZmltY19yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGZpbWNfcnVudGltZV9zdXNwZW5kLCBmaW1jX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZmltY19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGZpbWNfcHJvYmUsCi0JLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGZpbWNfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGZpbWNfcmVtb3ZlKSwKIAkuaWRfdGFibGUJPSBmaW1jX2RyaXZlcl9pZHMsCiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm5hbWUJPSBGSU1DX01PRFVMRV9OQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtICAgICA9ICZmaW1jX3BtX29wcywKIAl9CiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBmaW1jX2luaXQodm9pZCkKK2ludCBfX2luaXQgZmltY19yZWdpc3Rlcl9kcml2ZXIodm9pZCkKIHsKLQlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmaW1jX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZXJyKCJwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmZpbWNfZHJpdmVyLCBmaW1jX3Byb2JlKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGZpbWNfZXhpdCh2b2lkKQordm9pZCBfX2V4aXQgZmltY191bnJlZ2lzdGVyX2RyaXZlcih2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmaW1jX2RyaXZlcik7CiB9Ci0KLW1vZHVsZV9pbml0KGZpbWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW1jX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlM1UCBGSU1DIGNhbWVyYSBob3N0IGludGVyZmFjZS92aWRlbyBwb3N0cHJvY2Vzc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjEuMC4xIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaAppbmRleCAxZjcwNzcyLi5hNjkzNmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmgKQEAgLTExLDEyICsxMSwxNiBAQAogCiAvKiNkZWZpbmUgREVCVUcqLwogCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL21lZGlhLWVudGl0eS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgpAQCAtMzIsMzggKzM2LDQ2IEBACiAKIC8qIFRpbWUgdG8gd2FpdCBmb3IgbmV4dCBmcmFtZSBWU1lOQyBpbnRlcnJ1cHQgd2hpbGUgc3RvcHBpbmcgb3BlcmF0aW9uLiAqLwogI2RlZmluZSBGSU1DX1NIVVRET1dOX1RJTUVPVVQJKCgxMDAqSFopLzEwMDApCi0jZGVmaW5lIE1BWF9GSU1DX0NMT0NLUwkJMwotI2RlZmluZSBNT0RVTEVfTkFNRQkJInM1cC1maW1jIgorI2RlZmluZSBNQVhfRklNQ19DTE9DS1MJCTIKKyNkZWZpbmUgRklNQ19NT0RVTEVfTkFNRQkiczVwLWZpbWMiCiAjZGVmaW5lIEZJTUNfTUFYX0RFVlMJCTQKICNkZWZpbmUgRklNQ19NQVhfT1VUX0JVRlMJNAogI2RlZmluZSBTQ0FMRVJfTUFYX0hSQVRJTwk2NAogI2RlZmluZSBTQ0FMRVJfTUFYX1ZSQVRJTwk2NAogI2RlZmluZSBETUFfTUlOX1NJWkUJCTgKKyNkZWZpbmUgRklNQ19DQU1JRl9NQVhfSEVJR0hUCTB4MjAwMAogCiAvKiBpbmRpY2VzIHRvIHRoZSBjbG9ja3MgYXJyYXkgKi8KIGVudW0gewogCUNMS19CVVMsCiAJQ0xLX0dBVEUsCi0JQ0xLX0NBTSwKIH07CiAKIGVudW0gZmltY19kZXZfZmxhZ3MgewotCS8qIGZvciBtMm0gbm9kZSAqLwotCVNUX0lETEUsCi0JU1RfT1VURE1BX1JVTiwKKwlTVF9MUE0sCisJLyogbTJtIG5vZGUgKi8KKwlTVF9NMk1fUlVOLAogCVNUX00yTV9QRU5ELAotCS8qIGZvciBjYXB0dXJlIG5vZGUgKi8KKwlTVF9NMk1fU1VTUEVORElORywKKwlTVF9NMk1fU1VTUEVOREVELAorCS8qIGNhcHR1cmUgbm9kZSAqLwogCVNUX0NBUFRfUEVORCwKIAlTVF9DQVBUX1JVTiwKIAlTVF9DQVBUX1NUUkVBTSwKKwlTVF9DQVBUX0lTUF9TVFJFQU0sCisJU1RfQ0FQVF9TVVNQRU5ERUQsCiAJU1RfQ0FQVF9TSFVULAorCVNUX0NBUFRfQlVTWSwKKwlTVF9DQVBUX0FQUExZX0NGRywKKwlTVF9DQVBUX0pQRUcsCiB9OwogCi0jZGVmaW5lIGZpbWNfbTJtX2FjdGl2ZShkZXYpIHRlc3RfYml0KFNUX09VVERNQV9SVU4sICYoZGV2KS0+c3RhdGUpCisjZGVmaW5lIGZpbWNfbTJtX2FjdGl2ZShkZXYpIHRlc3RfYml0KFNUX00yTV9SVU4sICYoZGV2KS0+c3RhdGUpCiAjZGVmaW5lIGZpbWNfbTJtX3BlbmRpbmcoZGV2KSB0ZXN0X2JpdChTVF9NMk1fUEVORCwgJihkZXYpLT5zdGF0ZSkKIAogI2RlZmluZSBmaW1jX2NhcHR1cmVfcnVubmluZyhkZXYpIHRlc3RfYml0KFNUX0NBUFRfUlVOLCAmKGRldiktPnN0YXRlKQogI2RlZmluZSBmaW1jX2NhcHR1cmVfcGVuZGluZyhkZXYpIHRlc3RfYml0KFNUX0NBUFRfUEVORCwgJihkZXYpLT5zdGF0ZSkKKyNkZWZpbmUgZmltY19jYXB0dXJlX2J1c3koZGV2KSB0ZXN0X2JpdChTVF9DQVBUX0JVU1ksICYoZGV2KS0+c3RhdGUpCiAKIGVudW0gZmltY19kYXRhcGF0aCB7CiAJRklNQ19DQU1FUkEsCkBAIC04Myw5ICs5NSwxNCBAQAogCVM1UF9GSU1DX0NCWUNSWTQyMiwKIAlTNVBfRklNQ19DUllDQlk0MjIsCiAJUzVQX0ZJTUNfWUNCQ1I0NDRfTE9DQUwsCisJUzVQX0ZJTUNfSlBFRyA9IDB4NDAsCiB9OwogCi0jZGVmaW5lIGZpbWNfZm10X2lzX3JnYih4KSAoKHgpICYgMHgxMCkKKyNkZWZpbmUgZmltY19mbXRfaXNfcmdiKHgpICghISgoeCkgJiAweDEwKSkKKyNkZWZpbmUgZmltY19mbXRfaXNfanBlZyh4KSAoISEoKHgpICYgMHg0MCkpCisKKyNkZWZpbmUgSVNfTTJNKF9fc3RydCkgKChfX3N0cnQpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSB8fCBcCisJCQlfX3N0cnQgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKIAogLyogQ2IvQ3IgY2hyb21pbmFuY2UgY29tcG9uZW50cyBvcmRlciBmb3IgMiBwbGFuZSBZL0NiQ3IgNDoyOjIgZm9ybWF0cy4gKi8KICNkZWZpbmUJUzVQX0ZJTUNfTFNCX0NSQ0IJUzVQX0NJT0NUUkxfT1JERVI0MjJfMlBfTFNCX0NSQ0IKQEAgLTEwNCw5ICsxMjEsMTAgQEAKICNkZWZpbmUJRklNQ19EU1RfQUREUgkJKDEgPDwgMikKICNkZWZpbmUJRklNQ19TUkNfRk1UCQkoMSA8PCAzKQogI2RlZmluZQlGSU1DX0RTVF9GTVQJCSgxIDw8IDQpCi0jZGVmaW5lCUZJTUNfQ1RYX00yTQkJKDEgPDwgNSkKLSNkZWZpbmUJRklNQ19DVFhfQ0FQCQkoMSA8PCA2KQotI2RlZmluZQlGSU1DX0NUWF9TSFVUCQkoMSA8PCA3KQorI2RlZmluZQlGSU1DX0RTVF9DUk9QCQkoMSA8PCA1KQorI2RlZmluZQlGSU1DX0NUWF9NMk0JCSgxIDw8IDE2KQorI2RlZmluZQlGSU1DX0NUWF9DQVAJCSgxIDw8IDE3KQorI2RlZmluZQlGSU1DX0NUWF9TSFVUCQkoMSA8PCAxOCkKIAogLyogSW1hZ2UgY29udmVyc2lvbiBmbGFncyAqLwogI2RlZmluZQlGSU1DX0lOX0RNQV9BQ0NFU1NfVElMRUQJKDEgPDwgMCkKQEAgLTEyMiwxMSArMTQwLDYgQEAKIC8qIFkgKDE2IH4gMjM1KSwgQ2IvQ3IgKDE2IH4gMjQwKSAqLwogI2RlZmluZQlGSU1DX0NPTE9SX1JBTkdFX05BUlJPVwkJKDEgPDwgMykKIAotI2RlZmluZQlGTElQX05PTkUJCQkwCi0jZGVmaW5lCUZMSVBfWF9BWElTCQkJMQotI2RlZmluZQlGTElQX1lfQVhJUwkJCTIKLSNkZWZpbmUJRkxJUF9YWV9BWElTCQkJKEZMSVBfWF9BWElTIHwgRkxJUF9ZX0FYSVMpCi0KIC8qKgogICogc3RydWN0IGZpbWNfZm10IC0gdGhlIGRyaXZlcidzIGludGVybmFsIGNvbG9yIGZvcm1hdCBkYXRhCiAgKiBAbWJ1c19jb2RlOiBNZWRpYSBCdXMgcGl4ZWwgY29kZSwgLTEgaWYgbm90IGFwcGxpY2FibGUKQEAgLTI3NSwyNiArMjg4LDI5IEBACiAvKioKICAqIHN0cnVjdCBmaW1jX20ybV9kZXZpY2UgLSB2NGwyIG1lbW9yeS10by1tZW1vcnkgZGV2aWNlIGRhdGEKICAqIEB2ZmQ6IHRoZSB2aWRlbyBkZXZpY2Ugbm9kZSBmb3IgdjRsMiBtMm0gbW9kZQotICogQHY0bDJfZGV2OiB2NGwyIGRldmljZSBmb3IgbTJtIG1vZGUKICAqIEBtMm1fZGV2OiB2NGwyIG1lbW9yeS10by1tZW1vcnkgZGV2aWNlIGRhdGEKICAqIEBjdHg6IGhhcmR3YXJlIGNvbnRleHQgZGF0YQogICogQHJlZmNudDogdGhlIHJlZmVyZW5jZSBjb3VudGVyCiAgKi8KIHN0cnVjdCBmaW1jX20ybV9kZXZpY2UgewogCXN0cnVjdCB2aWRlb19kZXZpY2UJKnZmZDsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UJdjRsMl9kZXY7CiAJc3RydWN0IHY0bDJfbTJtX2RldgkqbTJtX2RldjsKIAlzdHJ1Y3QgZmltY19jdHgJCSpjdHg7CiAJaW50CQkJcmVmY250OwogfTsKIAorI2RlZmluZSBGSU1DX1NEX1BBRF9TSU5LCTAKKyNkZWZpbmUgRklNQ19TRF9QQURfU09VUkNFCTEKKyNkZWZpbmUgRklNQ19TRF9QQURTX05VTQkyCisKIC8qKgogICogc3RydWN0IGZpbWNfdmlkX2NhcCAtIGNhbWVyYSBjYXB0dXJlIGRldmljZSBpbmZvcm1hdGlvbgogICogQGN0eDogaGFyZHdhcmUgY29udGV4dCBkYXRhCiAgKiBAdmZkOiB2aWRlbyBkZXZpY2Ugbm9kZSBmb3IgY2FtZXJhIGNhcHR1cmUgbW9kZQotICogQHY0bDJfZGV2OiB2NGwyX2RldmljZSBzdHJ1Y3QgdG8gbWFuYWdlIHN1YmRldnMKLSAqIEBzZDogcG9pbnRlciB0byBjYW1lcmEgc2Vuc29yIHN1YmRldmljZSBjdXJyZW50bHkgaW4gdXNlCi0gKiBAZm10OiBNZWRpYSBCdXMgZm9ybWF0IGNvbmZpZ3VyZWQgYXQgc2VsZWN0ZWQgaW1hZ2Ugc2Vuc29yCisgKiBAc3ViZGV2OiBzdWJkZXYgZXhwb3NpbmcgdGhlIEZJTUMgcHJvY2Vzc2luZyBibG9jaworICogQHZkX3BhZDogZmltYyB2aWRlbyBjYXB0dXJlIG5vZGUgcGFkCisgKiBAc2RfcGFkczogZmltYyB2aWRlbyBwcm9jZXNzaW5nIGJsb2NrIHBhZHMKKyAqIEBtZjogbWVkaWEgYnVzIGZvcm1hdCBhdCB0aGUgRklNQyBjYW1lcmEgaW5wdXQgKGFuZCB0aGUgc2NhbGVyIG91dHB1dCkgcGFkCiAgKiBAcGVuZGluZ19idWZfcTogdGhlIHBlbmRpbmcgYnVmZmVyIHF1ZXVlIGhlYWQKICAqIEBhY3RpdmVfYnVmX3E6IHRoZSBxdWV1ZSBoZWFkIG9mIGJ1ZmZlcnMgc2NoZWR1bGVkIGluIGhhcmR3YXJlCiAgKiBAdmJxOiB0aGUgY2FwdHVyZSBhbSB2aWRlbyBidWZmZXIgcXVldWUKQEAgLTMwNCwxNCArMzIwLDE3IEBACiAgKiBAcmVxYnVmc19jb3VudDogdGhlIG51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCBpbiBSRVFCVUZTIGlvY3RsCiAgKiBAaW5wdXRfaW5kZXg6IGlucHV0IChjYW1lcmEgc2Vuc29yKSBpbmRleAogICogQHJlZmNudDogZHJpdmVyJ3MgcHJpdmF0ZSByZWZlcmVuY2UgY291bnRlcgorICogQGlucHV0OiBjYXB0dXJlIGlucHV0IHR5cGUsIGdycF9pZCBvZiB0aGUgYXR0YWNoZWQgc3ViZGV2CisgKiBAdXNlcl9zdWJkZXZfYXBpOiB0cnVlIGlmIHN1YmRldnMgYXJlIG5vdCBjb25maWd1cmVkIGJ5IHRoZSBob3N0IGRyaXZlcgogICovCiBzdHJ1Y3QgZmltY192aWRfY2FwIHsKIAlzdHJ1Y3QgZmltY19jdHgJCQkqY3R4OwogCXN0cnVjdCB2YjJfYWxsb2NfY3R4CQkqYWxsb2NfY3R4OwogCXN0cnVjdCB2aWRlb19kZXZpY2UJCSp2ZmQ7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlCQl2NGwyX2RldjsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYJCSpzZDs7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdAlmbXQ7CisJc3RydWN0IHY0bDJfc3ViZGV2CQkqc3ViZGV2OworCXN0cnVjdCBtZWRpYV9wYWQJCXZkX3BhZDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10CW1mOworCXN0cnVjdCBtZWRpYV9wYWQJCXNkX3BhZHNbRklNQ19TRF9QQURTX05VTV07CiAJc3RydWN0IGxpc3RfaGVhZAkJcGVuZGluZ19idWZfcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlhY3RpdmVfYnVmX3E7CiAJc3RydWN0IHZiMl9xdWV1ZQkJdmJxOwpAQCAtMzIxLDYgKzM0MCw4IEBACiAJdW5zaWduZWQgaW50CQkJcmVxYnVmc19jb3VudDsKIAlpbnQJCQkJaW5wdXRfaW5kZXg7CiAJaW50CQkJCXJlZmNudDsKKwl1MzIJCQkJaW5wdXQ7CisJYm9vbAkJCQl1c2VyX3N1YmRldl9hcGk7CiB9OwogCiAvKioKQEAgLTM1MSw2ICszNzIsNyBAQAogICogQGhhc19jaXN0YXR1czI6IDEgaWYgQ0lTVEFUVVMyIHJlZ2lzdGVyIGlzIHByZXNlbnQgaW4gdGhpcyBJUCByZXZpc2lvbgogICogQGhhc19tYWluc2NhbGVyX2V4dDogMSBpZiBleHRlbmRlZCBtYWluc2NhbGVyIHJhdGlvcyBpbiBDSUVYVEVOIHJlZ2lzdGVyCiAgKgkJCSBhcmUgcHJlc2VudCBpbiB0aGlzIElQIHJldmlzaW9uCisgKiBAaGFzX2NhbV9pZjogc2V0IGlmIHRoaXMgaW5zdGFuY2UgaGFzIGEgY2FtZXJhIGlucHV0IGludGVyZmFjZQogICogQHBpeF9saW1pdDogcGl4ZWwgc2l6ZSBjb25zdHJhaW50cyBmb3IgdGhlIHNjYWxlcgogICogQG1pbl9pbnBfcGl4c2l6ZTogbWluaW11bSBpbnB1dCBwaXhlbCBzaXplCiAgKiBAbWluX291dF9waXhzaXplOiBtaW5pbXVtIG91dHB1dCBwaXhlbCBzaXplCkBAIC0zNjMsNiArMzg1LDcgQEAKIAl1bnNpZ25lZCBpbnQJaGFzX291dF9yb3Q6MTsKIAl1bnNpZ25lZCBpbnQJaGFzX2Npc3RhdHVzMjoxOwogCXVuc2lnbmVkIGludAloYXNfbWFpbnNjYWxlcl9leHQ6MTsKKwl1bnNpZ25lZCBpbnQJaGFzX2NhbV9pZjoxOwogCXN0cnVjdCBmaW1jX3BpeF9saW1pdCAqcGl4X2xpbWl0OwogCXUxNgkJbWluX2lucF9waXhzaXplOwogCXUxNgkJbWluX291dF9waXhzaXplOwpAQCAtMzgzLDYgKzQwNiwxMiBAQAogCWludAkJbnVtX2VudGl0aWVzOwogfTsKIAorc3RydWN0IGZpbWNfcGlwZWxpbmUgeworCXN0cnVjdCBtZWRpYV9waXBlbGluZSAqcGlwZTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaXM7Cit9OworCiBzdHJ1Y3QgZmltY19jdHg7CiAKIC8qKgpAQCAtMzk5LDEwICs0MjgsMTIgQEAKICAqIEByZWdzX3JlczoJdGhlIHJlc291cmNlIGNsYWltZWQgZm9yIElPIHJlZ2lzdGVycwogICogQGlycToJRklNQyBpbnRlcnJ1cHQgbnVtYmVyCiAgKiBAaXJxX3F1ZXVlOglpbnRlcnJ1cHQgaGFuZGxlciB3YWl0cXVldWUKKyAqIEB2NGwyX2RldjoJcm9vdCB2NGwyX2RldmljZQogICogQG0ybToJbWVtb3J5LXRvLW1lbW9yeSBWNEwyIGRldmljZSBpbmZvcm1hdGlvbgogICogQHZpZF9jYXA6CWNhbWVyYSBjYXB0dXJlIGRldmljZSBpbmZvcm1hdGlvbgogICogQHN0YXRlOglmbGFncyB1c2VkIHRvIHN5bmNocm9uaXplIG0ybSBhbmQgY2FwdHVyZSBtb2RlIG9wZXJhdGlvbgogICogQGFsbG9jX2N0eDoJdmlkZW9idWYyIG1lbW9yeSBhbGxvY2F0b3IgY29udGV4dAorICogQHBpcGVsaW5lOglmaW1jIHZpZGVvIGNhcHR1cmUgcGlwZWxpbmUgZGF0YSBzdHJ1Y3R1cmUKICAqLwogc3RydWN0IGZpbWNfZGV2IHsKIAlzcGlubG9ja190CQkJc2xvY2s7CkBAIC00MTcsMTAgKzQ0OCwxMiBAQAogCXN0cnVjdCByZXNvdXJjZQkJCSpyZWdzX3JlczsKIAlpbnQJCQkJaXJxOwogCXdhaXRfcXVldWVfaGVhZF90CQlpcnFfcXVldWU7CisJc3RydWN0IHY0bDJfZGV2aWNlCQkqdjRsMl9kZXY7CiAJc3RydWN0IGZpbWNfbTJtX2RldmljZQkJbTJtOwogCXN0cnVjdCBmaW1jX3ZpZF9jYXAJCXZpZF9jYXA7CiAJdW5zaWduZWQgbG9uZwkJCXN0YXRlOwogCXN0cnVjdCB2YjJfYWxsb2NfY3R4CQkqYWxsb2NfY3R4OworCXN0cnVjdCBmaW1jX3BpcGVsaW5lCQlwaXBlbGluZTsKIH07CiAKIC8qKgpAQCAtNDM3LDExICs0NzAsMTggQEAKICAqIEBzY2FsZXI6CQlpbWFnZSBzY2FsZXIgcHJvcGVydGllcwogICogQGVmZmVjdDoJCWltYWdlIGVmZmVjdAogICogQHJvdGF0aW9uOgkJaW1hZ2UgY2xvY2t3aXNlIHJvdGF0aW9uIGluIGRlZ3JlZXMKLSAqIEBmbGlwOgkJaW1hZ2UgZmxpcCBtb2RlCisgKiBAaGZsaXA6CQlpbmRpY2F0ZXMgaW1hZ2UgaG9yaXpvbnRhbCBmbGlwIGlmIHNldAorICogQHZmbGlwOgkJaW5kaWNhdGVzIGltYWdlIHZlcnRpY2FsIGZsaXAgaWYgc2V0CiAgKiBAZmxhZ3M6CQlhZGRpdGlvbmFsIGZsYWdzIGZvciBpbWFnZSBjb252ZXJzaW9uCiAgKiBAc3RhdGU6CQlmbGFncyB0byBrZWVwIHRyYWNrIG9mIHVzZXIgY29uZmlndXJhdGlvbgogICogQGZpbWNfZGV2OgkJdGhlIEZJTUMgZGV2aWNlIHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCiAgKiBAbTJtX2N0eDoJCW1lbW9yeS10by1tZW1vcnkgZGV2aWNlIGNvbnRleHQKKyAqIEBmaDoJCQl2NGwyIGZpbGUgaGFuZGxlCisgKiBAY3RybF9oYW5kbGVyOgl2NGwyIGNvbnRyb2xzIGhhbmRsZXIKKyAqIEBjdHJsX3JvdGF0ZQkJaW1hZ2Ugcm90YXRpb24gY29udHJvbAorICogQGN0cmxfaGZsaXAJCWhvcml6b250YWwgZmxpcCBjb250cm9sCisgKiBAY3RybF92ZmxpcAkJdmFydGljYWwgZmxpcCBjb250cm9sCisgKiBAY3RybHNfcmR5OgkJdHJ1ZSBpZiB0aGUgY29udHJvbCBoYW5kbGVyIGlzIGluaXRpYWxpemVkCiAgKi8KIHN0cnVjdCBmaW1jX2N0eCB7CiAJc3BpbmxvY2tfdAkJc2xvY2s7CkBAIC00NTYsMTMgKzQ5Niw0OSBAQAogCXN0cnVjdCBmaW1jX3NjYWxlcglzY2FsZXI7CiAJc3RydWN0IGZpbWNfZWZmZWN0CWVmZmVjdDsKIAlpbnQJCQlyb3RhdGlvbjsKLQl1MzIJCQlmbGlwOworCXVuc2lnbmVkIGludAkJaGZsaXA6MTsKKwl1bnNpZ25lZCBpbnQJCXZmbGlwOjE7CiAJdTMyCQkJZmxhZ3M7CiAJdTMyCQkJc3RhdGU7CiAJc3RydWN0IGZpbWNfZGV2CQkqZmltY19kZXY7CiAJc3RydWN0IHY0bDJfbTJtX2N0eAkqbTJtX2N0eDsKKwlzdHJ1Y3QgdjRsMl9maAkJZmg7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxfaGFuZGxlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCSpjdHJsX3JvdGF0ZTsKKwlzdHJ1Y3QgdjRsMl9jdHJsCSpjdHJsX2hmbGlwOworCXN0cnVjdCB2NGwyX2N0cmwJKmN0cmxfdmZsaXA7CisJYm9vbAkJCWN0cmxzX3JkeTsKIH07CiAKKyNkZWZpbmUgZmhfdG9fY3R4KF9fZmgpIGNvbnRhaW5lcl9vZihfX2ZoLCBzdHJ1Y3QgZmltY19jdHgsIGZoKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZyYW1lX2JvdW5kcyhzdHJ1Y3QgZmltY19mcmFtZSAqZiwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCWYtPm9fd2lkdGggID0gd2lkdGg7CisJZi0+b19oZWlnaHQgPSBoZWlnaHQ7CisJZi0+Zl93aWR0aCAgPSB3aWR0aDsKKwlmLT5mX2hlaWdodCA9IGhlaWdodDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9mcmFtZV9jcm9wKHN0cnVjdCBmaW1jX2ZyYW1lICpmLAorCQkJCSAgdTMyIGxlZnQsIHUzMiB0b3AsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKK3sKKwlmLT5vZmZzX2ggPSBsZWZ0OworCWYtPm9mZnNfdiA9IHRvcDsKKwlmLT53aWR0aCAgPSB3aWR0aDsKKwlmLT5oZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGZpbWNfZ2V0X2Zvcm1hdF9kZXB0aChzdHJ1Y3QgZmltY19mbXQgKmZmKQoreworCXUzMiBpLCBkZXB0aCA9IDA7CisKKwlpZiAoZmYgIT0gTlVMTCkKKwkJZm9yIChpID0gMDsgaSA8IGZmLT5jb2xwbGFuZXM7IGkrKykKKwkJCWRlcHRoICs9IGZmLT5kZXB0aFtpXTsKKwlyZXR1cm4gZGVwdGg7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBmaW1jX2NhcHR1cmVfYWN0aXZlKHN0cnVjdCBmaW1jX2RldiAqZmltYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTYxLDcgKzYzNyw3IEBACiAJfSBlbHNlIGlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FID09IHR5cGUpIHsKIAkJZnJhbWUgPSAmY3R4LT5kX2ZyYW1lOwogCX0gZWxzZSB7Ci0JCXY0bDJfZXJyKCZjdHgtPmZpbWNfZGV2LT5tMm0udjRsMl9kZXYsCisJCXY0bDJfZXJyKGN0eC0+ZmltY19kZXYtPnY0bDJfZGV2LAogCQkJIldyb25nIGJ1ZmZlci92aWRlbyBxdWV1ZSB0eXBlICglZClcbiIsIHR5cGUpOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CkBAIC01OTUsNyArNjcxLDcgQEAKIHZvaWQgZmltY19od19zZXRfcHJlc2NhbGVyKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKIHZvaWQgZmltY19od19zZXRfbWFpbnNjYWxlcihzdHJ1Y3QgZmltY19jdHggKmN0eCk7CiB2b2lkIGZpbWNfaHdfZW5fY2FwdHVyZShzdHJ1Y3QgZmltY19jdHggKmN0eCk7Ci12b2lkIGZpbWNfaHdfc2V0X2VmZmVjdChzdHJ1Y3QgZmltY19jdHggKmN0eCk7Cit2b2lkIGZpbWNfaHdfc2V0X2VmZmVjdChzdHJ1Y3QgZmltY19jdHggKmN0eCwgYm9vbCBhY3RpdmUpOwogdm9pZCBmaW1jX2h3X3NldF9pbl9kbWEoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwogdm9pZCBmaW1jX2h3X3NldF9pbnB1dF9wYXRoKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKIHZvaWQgZmltY19od19zZXRfb3V0cHV0X3BhdGgoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwpAQCAtNjE0LDM2ICs2OTAsNDUgQEAKIC8qIGZpbWMtY29yZS5jICovCiBpbnQgZmltY192aWRpb2NfZW51bV9mbXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwotaW50IGZpbWNfdmlkaW9jX2dfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKLWludCBmaW1jX3ZpZGlvY190cnlfZm10X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwotaW50IGZpbWNfdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyk7Ci1pbnQgZmltY192aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7CitpbnQgZmltY19jdHJsc19jcmVhdGUoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwordm9pZCBmaW1jX2N0cmxzX2RlbGV0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCk7Cit2b2lkIGZpbWNfY3RybHNfYWN0aXZhdGUoc3RydWN0IGZpbWNfY3R4ICpjdHgsIGJvb2wgYWN0aXZlKTsKK2ludCBmaW1jX2ZpbGxfZm9ybWF0KHN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZSwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKK3ZvaWQgZmltY19hZGp1c3RfbXBsYW5lX2Zvcm1hdChzdHJ1Y3QgZmltY19mbXQgKmZtdCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXgpOworc3RydWN0IGZpbWNfZm10ICpmaW1jX2ZpbmRfZm9ybWF0KHUzMiAqcGl4ZWxmb3JtYXQsIHUzMiAqbWJ1c19jb2RlLAorCQkJCSAgdW5zaWduZWQgaW50IG1hc2ssIGludCBpbmRleCk7CiAKLWludCBmaW1jX3RyeV9jcm9wKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcik7Ci1pbnQgY2hlY2tfY3RybF92YWwoc3RydWN0IGZpbWNfY3R4ICpjdHgsICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKLWludCBmaW1jX3NfY3RybChzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7Ci0KLXN0cnVjdCBmaW1jX2ZtdCAqZmluZF9mb3JtYXQoc3RydWN0IHY0bDJfZm9ybWF0ICpmLCB1bnNpZ25lZCBpbnQgbWFzayk7Ci1zdHJ1Y3QgZmltY19mbXQgKmZpbmRfbWJ1c19mb3JtYXQoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZiwKLQkJCQkgIHVuc2lnbmVkIGludCBtYXNrKTsKLQotaW50IGZpbWNfY2hlY2tfc2NhbGVyX3JhdGlvKGludCBzdywgaW50IHNoLCBpbnQgZHcsIGludCBkaCwgaW50IHJvdCk7CitpbnQgZmltY19jaGVja19zY2FsZXJfcmF0aW8oc3RydWN0IGZpbWNfY3R4ICpjdHgsIGludCBzdywgaW50IHNoLAorCQkJICAgIGludCBkdywgaW50IGRoLCBpbnQgcm90YXRpb24pOwogaW50IGZpbWNfc2V0X3NjYWxlcl9pbmZvKHN0cnVjdCBmaW1jX2N0eCAqY3R4KTsKIGludCBmaW1jX3ByZXBhcmVfY29uZmlnKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCB1MzIgZmxhZ3MpOwogaW50IGZpbWNfcHJlcGFyZV9hZGRyKHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsCiAJCSAgICAgIHN0cnVjdCBmaW1jX2ZyYW1lICpmcmFtZSwgc3RydWN0IGZpbWNfYWRkciAqcGFkZHIpOwordm9pZCBmaW1jX3ByZXBhcmVfZG1hX29mZnNldChzdHJ1Y3QgZmltY19jdHggKmN0eCwgc3RydWN0IGZpbWNfZnJhbWUgKmYpOwordm9pZCBmaW1jX3NldF95dXZfb3JkZXIoc3RydWN0IGZpbWNfY3R4ICpjdHgpOwordm9pZCBmaW1jX2ZpbGxfZnJhbWUoc3RydWN0IGZpbWNfZnJhbWUgKmZyYW1lLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwordm9pZCBmaW1jX2NhcHR1cmVfaXJxX2hhbmRsZXIoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBib29sIGRvbmUpOworCitpbnQgZmltY19yZWdpc3Rlcl9tMm1fZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYywKKwkJCSAgICAgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2Rldik7Cit2b2lkIGZpbWNfdW5yZWdpc3Rlcl9tMm1fZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYyk7CitpbnQgZmltY19yZWdpc3Rlcl9kcml2ZXIodm9pZCk7Cit2b2lkIGZpbWNfdW5yZWdpc3Rlcl9kcml2ZXIodm9pZCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIGZpbWMtY2FwdHVyZS5jCQkJCQkqLwotaW50IGZpbWNfcmVnaXN0ZXJfY2FwdHVyZV9kZXZpY2Uoc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKK2ludCBmaW1jX3JlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKHN0cnVjdCBmaW1jX2RldiAqZmltYywKKwkJCQkgc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2Rldik7CiB2b2lkIGZpbWNfdW5yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOwotaW50IGZpbWNfc2Vuc29yX3NkX2luaXQoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBpbnQgaW5kZXgpOworaW50IGZpbWNfY2FwdHVyZV9jdHJsc19jcmVhdGUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKIGludCBmaW1jX3ZpZF9jYXBfYnVmX3F1ZXVlKHN0cnVjdCBmaW1jX2RldiAqZmltYywKIAkJCSAgICAgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqZmltY192Yik7Cit2b2lkIGZpbWNfc2Vuc29yX25vdGlmeShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgbm90aWZpY2F0aW9uLAorCQkJdm9pZCAqYXJnKTsKK2ludCBmaW1jX2NhcHR1cmVfc3VzcGVuZChzdHJ1Y3QgZmltY19kZXYgKmZpbWMpOworaW50IGZpbWNfY2FwdHVyZV9yZXN1bWUoc3RydWN0IGZpbWNfZGV2ICpmaW1jKTsKK2ludCBmaW1jX2NhcHR1cmVfY29uZmlnX3VwZGF0ZShzdHJ1Y3QgZmltY19jdHggKmN0eCk7CiAKIC8qIExvY2tpbmc6IHRoZSBjYWxsZXIgaG9sZHMgZmltYy0+c2xvY2sgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmaW1jX2FjdGl2YXRlX2NhcHR1cmUoc3RydWN0IGZpbWNfY3R4ICpjdHgpCkBAIC02NjEsMjIgKzc0NiwyNyBAQAogfQogCiAvKgotICogQWRkIGJ1ZiB0byB0aGUgY2FwdHVyZSBhY3RpdmUgYnVmZmVycyBxdWV1ZS4KLSAqIExvY2tpbmc6IE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggZmltY19kZXY6OnNsb2NrIGhlbGQuCisgKiBCdWZmZXIgbGlzdCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLiBNdXN0IGJlIGNhbGxlZCB3aXRoIGZpbWMuc2xvY2sgaGVsZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGFjdGl2ZV9xdWV1ZV9hZGQoc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCwKLQkJCQkgICAgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmKQorCisvKioKKyAqIGZpbWNfYWN0aXZlX3F1ZXVlX2FkZCAtIGFkZCBidWZmZXIgdG8gdGhlIGNhcHR1cmUgYWN0aXZlIGJ1ZmZlcnMgcXVldWUKKyAqIEBidWY6IGJ1ZmZlciB0byBhZGQgdG8gdGhlIGFjdGl2ZSBidWZmZXJzIGxpc3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZpbWNfYWN0aXZlX3F1ZXVlX2FkZChzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwLAorCQkJCQkgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmKQogewogCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnZpZF9jYXAtPmFjdGl2ZV9idWZfcSk7CiAJdmlkX2NhcC0+YWN0aXZlX2J1Zl9jbnQrKzsKIH0KIAotLyoKLSAqIFBvcCBhIHZpZGVvIGJ1ZmZlciBmcm9tIHRoZSBjYXB0dXJlIGFjdGl2ZSBidWZmZXJzIHF1ZXVlCi0gKiBMb2NraW5nOiBOZWVkIHRvIGJlIGNhbGxlZCB3aXRoIGZpbWNfZGV2OjpzbG9jayBoZWxkLgorLyoqCisgKiBmaW1jX2FjdGl2ZV9xdWV1ZV9wb3AgLSBwb3AgYnVmZmVyIGZyb20gdGhlIGNhcHR1cmUgYWN0aXZlIGJ1ZmZlcnMgcXVldWUKKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoZSBhY3RpdmVfYnVmX3EgbGlzdCBpcyBub3QgZW1wdHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqCi1hY3RpdmVfcXVldWVfcG9wKHN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXApCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmZpbWNfYWN0aXZlX3F1ZXVlX3BvcCgKKwkJCQkgICAgc3RydWN0IGZpbWNfdmlkX2NhcCAqdmlkX2NhcCkKIHsKIAlzdHJ1Y3QgZmltY192aWRfYnVmZmVyICpidWY7CiAJYnVmID0gbGlzdF9lbnRyeSh2aWRfY2FwLT5hY3RpdmVfYnVmX3EubmV4dCwKQEAgLTY4NiwxNiArNzc2LDIzIEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotLyogQWRkIHZpZGVvIGJ1ZmZlciB0byB0aGUgY2FwdHVyZSBwZW5kaW5nIGJ1ZmZlcnMgcXVldWUgKi8KKy8qKgorICogZmltY19wZW5kaW5nX3F1ZXVlX2FkZCAtIGFkZCBidWZmZXIgdG8gdGhlIGNhcHR1cmUgcGVuZGluZyBidWZmZXJzIHF1ZXVlCisgKiBAYnVmOiBidWZmZXIgdG8gYWRkIHRvIHRoZSBwZW5kaW5nIGJ1ZmZlcnMgbGlzdAorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZmltY19wZW5kaW5nX3F1ZXVlX2FkZChzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwLAogCQkJCQkgIHN0cnVjdCBmaW1jX3ZpZF9idWZmZXIgKmJ1ZikKIHsKIAlsaXN0X2FkZF90YWlsKCZidWYtPmxpc3QsICZ2aWRfY2FwLT5wZW5kaW5nX2J1Zl9xKTsKIH0KIAotLyogQWRkIHZpZGVvIGJ1ZmZlciB0byB0aGUgY2FwdHVyZSBwZW5kaW5nIGJ1ZmZlcnMgcXVldWUgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqCi1wZW5kaW5nX3F1ZXVlX3BvcChzdHJ1Y3QgZmltY192aWRfY2FwICp2aWRfY2FwKQorLyoqCisgKiBmaW1jX3BlbmRpbmdfcXVldWVfcG9wIC0gcG9wIGJ1ZmZlciBmcm9tIHRoZSBjYXB0dXJlIHBlbmRpbmcgYnVmZmVycyBxdWV1ZQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhlIHBlbmRpbmdfYnVmX3EgbGlzdCBpcyBub3QgZW1wdHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqZmltY19wZW5kaW5nX3F1ZXVlX3BvcCgKKwkJCQkgICAgIHN0cnVjdCBmaW1jX3ZpZF9jYXAgKnZpZF9jYXApCiB7CiAJc3RydWN0IGZpbWNfdmlkX2J1ZmZlciAqYnVmOwogCWJ1ZiA9IGxpc3RfZW50cnkodmlkX2NhcC0+cGVuZGluZ19idWZfcS5uZXh0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1tZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzMzdiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1tZGV2aWNlLmMKQEAgLTAsMCArMSw4NTggQEAKKy8qCisgKiBTNVAvRVhZTk9TNCBTb0Mgc2VyaWVzIGNhbWVyYSBob3N0IGludGVyZmFjZSBtZWRpYSBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBDb250YWN0OiBTeWx3ZXN0ZXIgTmF3cm9ja2ksIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhLWRldmljZS5oPgorCisjaW5jbHVkZSAiZmltYy1jb3JlLmgiCisjaW5jbHVkZSAiZmltYy1tZGV2aWNlLmgiCisjaW5jbHVkZSAibWlwaS1jc2lzLmgiCisKK3N0YXRpYyBpbnQgX19maW1jX21kX3NldF9jYW1jbGsoc3RydWN0IGZpbWNfbWQgKmZtZCwKKwkJCQlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbyAqc19pbmZvLAorCQkJCWJvb2wgb24pOworLyoqCisgKiBmaW1jX3BpcGVsaW5lX3ByZXBhcmUgLSB1cGRhdGUgcGlwZWxpbmUgaW5mb3JtYXRpb24gd2l0aCBzdWJkZXZpY2UgcG9pbnRlcnMKKyAqIEBmaW1jOiBmaW1jIGRldmljZSB0ZXJtaW5hdGluZyB0aGUgcGlwZWxpbmUKKyAqCisgKiBDYWxsZXIgaG9sZHMgdGhlIGdyYXBoIG11dGV4LgorICovCit2b2lkIGZpbWNfcGlwZWxpbmVfcHJlcGFyZShzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIHN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lKQoreworCXN0cnVjdCBtZWRpYV9lbnRpdHlfZ3JhcGggZ3JhcGg7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKworCW1lZGlhX2VudGl0eV9ncmFwaF93YWxrX3N0YXJ0KCZncmFwaCwgbWUpOworCisJd2hpbGUgKChtZSA9IG1lZGlhX2VudGl0eV9ncmFwaF93YWxrX25leHQoJmdyYXBoKSkpIHsKKwkJaWYgKG1lZGlhX2VudGl0eV90eXBlKG1lKSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKKwkJCWNvbnRpbnVlOworCQlzZCA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihtZSk7CisKKwkJaWYgKHNkLT5ncnBfaWQgPT0gU0VOU09SX0dST1VQX0lEKQorCQkJZmltYy0+cGlwZWxpbmUuc2Vuc29yID0gc2Q7CisJCWVsc2UgaWYgKHNkLT5ncnBfaWQgPT0gQ1NJU19HUk9VUF9JRCkKKwkJCWZpbWMtPnBpcGVsaW5lLmNzaXMgPSBzZDsKKwl9Cit9CisKKy8qKgorICogX19zdWJkZXZfc2V0X3Bvd2VyIC0gY2hhbmdlIHBvd2VyIHN0YXRlIG9mIGEgc2luZ2xlIHN1YmRldgorICogQHNkOiBzdWJkZXZpY2UgdG8gY2hhbmdlIHBvd2VyIHN0YXRlIGZvcgorICogQG9uOiAxIHRvIGVuYWJsZSBwb3dlciBvciAwIHRvIGRpc2FibGUKKyAqCisgKiBSZXR1cm4gcmVzdWx0IG9mIHNfcG93ZXIgc3ViZGV2IG9wZXJhdGlvbiBvciAtRU5YSU8gaWYgc2QgYXJndW1lbnQKKyAqIGlzIE5VTEwuIFJldHVybiAwIGlmIHRoZSBzdWJkZXZpY2UgZG9lcyBub3QgaW1wbGVtZW50IHNfcG93ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19zdWJkZXZfc2V0X3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlpbnQgKnVzZV9jb3VudDsKKwlpbnQgcmV0OworCisJaWYgKHNkID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwl1c2VfY291bnQgPSAmc2QtPmVudGl0eS51c2VfY291bnQ7CisJaWYgKG9uICYmICgqdXNlX2NvdW50KSsrID4gMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoIW9uICYmICgqdXNlX2NvdW50ID09IDAgfHwgLS0oKnVzZV9jb3VudCkgPiAwKSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgc19wb3dlciwgb24pOworCisJcmV0dXJuIHJldCAhPSAtRU5PSU9DVExDTUQgPyByZXQgOiAwOworfQorCisvKioKKyAqIGZpbWNfcGlwZWxpbmVfc19wb3dlciAtIGNoYW5nZSBwb3dlciBzdGF0ZSBvZiBhbGwgcGlwZWxpbmUgc3ViZGV2cworICogQGZpbWM6IGZpbWMgZGV2aWNlIHRlcm1pbmF0aW5nIHRoZSBwaXBlbGluZQorICogQHN0YXRlOiAxIHRvIGVuYWJsZSBwb3dlciBvciAwIGZvciBwb3dlciBkb3duCisgKgorICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgZ3JhcGggbXV0ZXggaGVsZC4KKyAqLworaW50IGZpbWNfcGlwZWxpbmVfc19wb3dlcihzdHJ1Y3QgZmltY19kZXYgKmZpbWMsIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmaW1jLT5waXBlbGluZS5zZW5zb3IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmIChzdGF0ZSkgeworCQlyZXQgPSBfX3N1YmRldl9zZXRfcG93ZXIoZmltYy0+cGlwZWxpbmUuY3NpcywgMSk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTlhJTykKKwkJCXJldHVybiByZXQ7CisJCXJldHVybiBfX3N1YmRldl9zZXRfcG93ZXIoZmltYy0+cGlwZWxpbmUuc2Vuc29yLCAxKTsKKwl9CisKKwlyZXQgPSBfX3N1YmRldl9zZXRfcG93ZXIoZmltYy0+cGlwZWxpbmUuc2Vuc29yLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IF9fc3ViZGV2X3NldF9wb3dlcihmaW1jLT5waXBlbGluZS5jc2lzLCAwKTsKKworCXJldHVybiByZXQgPT0gLUVOWElPID8gMCA6IHJldDsKK30KKworLyoqCisgKiBfX2ZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZSAtIHVwZGF0ZSB0aGUgcGlwZWxpbmUgaW5mb3JtYXRpb24sIGVuYWJsZSBwb3dlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGwgcGlwZWxpbmUgc3ViZGV2cyBhbmQgdGhlIHNlbnNvciBjbG9jaworICogQG1lOiBtZWRpYSBlbnRpdHkgdG8gc3RhcnQgZ3JhcGggd2FsayB3aXRoCisgKiBAcHJlcDogdHJ1ZSB0byBhY3F1aXJlIHNlbnNvciAoYW5kIGNzaXMpIHN1YmRldnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGdyYXBoIG11dGV4IGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgX19maW1jX3BpcGVsaW5lX2luaXRpYWxpemUoc3RydWN0IGZpbWNfZGV2ICpmaW1jLAorCQkJCSAgICAgIHN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lLCBib29sIHByZXApCit7CisJaW50IHJldDsKKworCWlmIChwcmVwKQorCQlmaW1jX3BpcGVsaW5lX3ByZXBhcmUoZmltYywgbWUpOworCWlmIChmaW1jLT5waXBlbGluZS5zZW5zb3IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gZmltY19tZF9zZXRfY2FtY2xrKGZpbWMtPnBpcGVsaW5lLnNlbnNvciwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gZmltY19waXBlbGluZV9zX3Bvd2VyKGZpbWMsIDEpOworfQorCitpbnQgZmltY19waXBlbGluZV9pbml0aWFsaXplKHN0cnVjdCBmaW1jX2RldiAqZmltYywgc3RydWN0IG1lZGlhX2VudGl0eSAqbWUsCisJCQkgICAgIGJvb2wgcHJlcCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbWUtPnBhcmVudC0+Z3JhcGhfbXV0ZXgpOworCXJldCA9ICBfX2ZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZShmaW1jLCBtZSwgcHJlcCk7CisJbXV0ZXhfdW5sb2NrKCZtZS0+cGFyZW50LT5ncmFwaF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIF9fZmltY19waXBlbGluZV9zaHV0ZG93biAtIGRpc2FibGUgdGhlIHNlbnNvciBjbG9jayBhbmQgcGlwZWxpbmUgcG93ZXIKKyAqIEBmaW1jOiBmaW1jIGRldmljZSB0ZXJtaW5hdGluZyB0aGUgcGlwZWxpbmUKKyAqCisgKiBEaXNhYmxlIHBvd2VyIG9mIGFsbCBzdWJkZXZzIGluIHRoZSBwaXBlbGluZSBhbmQgdHVybiBvZmYgdGhlIGV4dGVybmFsCisgKiBzZW5zb3IgY2xvY2suCisgKiBDYWxsZWQgd2l0aCB0aGUgZ3JhcGggbXV0ZXggaGVsZC4KKyAqLworaW50IF9fZmltY19waXBlbGluZV9zaHV0ZG93bihzdHJ1Y3QgZmltY19kZXYgKmZpbWMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZmltYy0+cGlwZWxpbmUuc2Vuc29yKSB7CisJCXJldCA9IGZpbWNfcGlwZWxpbmVfc19wb3dlcihmaW1jLCAwKTsKKwkJZmltY19tZF9zZXRfY2FtY2xrKGZpbWMtPnBpcGVsaW5lLnNlbnNvciwgZmFsc2UpOworCX0KKwlyZXR1cm4gcmV0ID09IC1FTlhJTyA/IDAgOiByZXQ7Cit9CisKK2ludCBmaW1jX3BpcGVsaW5lX3NodXRkb3duKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5ICptZSA9ICZmaW1jLT52aWRfY2FwLnZmZC0+ZW50aXR5OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZtZS0+cGFyZW50LT5ncmFwaF9tdXRleCk7CisJcmV0ID0gX19maW1jX3BpcGVsaW5lX3NodXRkb3duKGZpbWMpOworCW11dGV4X3VubG9jaygmbWUtPnBhcmVudC0+Z3JhcGhfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaW1jX3BpcGVsaW5lX3Nfc3RyZWFtIC0gaW52b2tlIHNfc3RyZWFtIG9uIHBpcGVsaW5lIHN1YmRldnMKKyAqIEBmaW1jOiBmaW1jIGRldmljZSB0ZXJtaW5hdGluZyB0aGUgcGlwZWxpbmUKKyAqIEBvbjogcGFzc2VkIGFzIHRoZSBzX3N0cmVhbSBjYWxsIGFyZ3VtZW50CisgKi8KK2ludCBmaW1jX3BpcGVsaW5lX3Nfc3RyZWFtKHN0cnVjdCBmaW1jX2RldiAqZmltYywgaW50IG9uKQoreworCXN0cnVjdCBmaW1jX3BpcGVsaW5lICpwID0gJmZpbWMtPnBpcGVsaW5lOworCWludCByZXQgPSAwOworCisJaWYgKHAtPnNlbnNvciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgob24gJiYgcC0+Y3NpcykgfHwgIW9uKQorCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKG9uID8gcC0+Y3NpcyA6IHAtPnNlbnNvciwKKwkJCQkgICAgICAgdmlkZW8sIHNfc3RyZWFtLCBvbik7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKCFvbiAmJiBwLT5jc2lzKSB8fCBvbikKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChvbiA/IHAtPnNlbnNvciA6IHAtPmNzaXMsCisJCQkJICAgICAgIHZpZGVvLCBzX3N0cmVhbSwgb24pOworCXJldHVybiByZXQgPT0gLUVOT0lPQ1RMQ01EID8gMCA6IHJldDsKK30KKworLyoKKyAqIFNlbnNvciBzdWJkZXZpY2UgaGVscGVyIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICpmaW1jX21kX3JlZ2lzdGVyX3NlbnNvcihzdHJ1Y3QgZmltY19tZCAqZm1kLAorCQkJCSAgIHN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvICpzX2luZm8pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBOVUxMOworCisJaWYgKCFzX2luZm8gfHwgIWZtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHNfaW5mby0+cGRhdGEtPmkyY19idXNfbnVtKTsKKwlpZiAoIWFkYXB0ZXIpCisJCXJldHVybiBOVUxMOworCXNkID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmZm1kLT52NGwyX2RldiwgYWRhcHRlciwKKwkJCQkgICAgICAgc19pbmZvLT5wZGF0YS0+Ym9hcmRfaW5mbywgTlVMTCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHNkKSkgeworCQl2NGwyX2VycigmZm1kLT52NGwyX2RldiwgIkZhaWxlZCB0byBhY3F1aXJlIHN1YmRldlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEoc2QsIHNfaW5mbyk7CisJc2QtPmdycF9pZCA9IFNFTlNPUl9HUk9VUF9JRDsKKworCXY0bDJfaW5mbygmZm1kLT52NGwyX2RldiwgIlJlZ2lzdGVyZWQgc2Vuc29yIHN1YmRldmljZSAlc1xuIiwKKwkJICBzX2luZm8tPnBkYXRhLT5ib2FyZF9pbmZvLT50eXBlKTsKKwlyZXR1cm4gc2Q7Cit9CisKK3N0YXRpYyB2b2lkIGZpbWNfbWRfdW5yZWdpc3Rlcl9zZW5zb3Ioc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY2xpZW50KTsKKwlpMmNfcHV0X2FkYXB0ZXIoY2xpZW50LT5hZGFwdGVyKTsKK30KKworc3RhdGljIGludCBmaW1jX21kX3JlZ2lzdGVyX3NlbnNvcl9lbnRpdGllcyhzdHJ1Y3QgZmltY19tZCAqZm1kKQoreworCXN0cnVjdCBzNXBfcGxhdGZvcm1fZmltYyAqcGRhdGEgPSBmbWQtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBmaW1jX2RldiAqZmQgPSBOVUxMOworCWludCBudW1fY2xpZW50cywgcmV0LCBpOworCisJLyoKKwkgKiBSdW50aW1lIHJlc3VtZSBvbmUgb2YgdGhlIEZJTUMgZW50aXRpZXMgdG8gbWFrZSBzdXJlCisJICogdGhlIHNjbGtfY2FtIGNsb2NrcyBhcmUgbm90IGdsb2JhbGx5IGRpc2FibGVkLgorCSAqLworCWZvciAoaSA9IDA7ICFmZCAmJiBpIDwgQVJSQVlfU0laRShmbWQtPmZpbWMpOyBpKyspCisJCWlmIChmbWQtPmZpbWNbaV0pCisJCQlmZCA9IGZtZC0+ZmltY1tpXTsKKwlpZiAoIWZkKQorCQlyZXR1cm4gLUVOWElPOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJmZkLT5wZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJV0FSTl9PTihwZGF0YS0+bnVtX2NsaWVudHMgPiBBUlJBWV9TSVpFKGZtZC0+c2Vuc29yKSk7CisJbnVtX2NsaWVudHMgPSBtaW5fdCh1MzIsIHBkYXRhLT5udW1fY2xpZW50cywgQVJSQVlfU0laRShmbWQtPnNlbnNvcikpOworCisJZm1kLT5udW1fc2Vuc29ycyA9IG51bV9jbGllbnRzOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xpZW50czsgaSsrKSB7CisJCWZtZC0+c2Vuc29yW2ldLnBkYXRhID0gJnBkYXRhLT5pc3BfaW5mb1tpXTsKKwkJcmV0ID0gX19maW1jX21kX3NldF9jYW1jbGsoZm1kLCAmZm1kLT5zZW5zb3JbaV0sIHRydWUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWZtZC0+c2Vuc29yW2ldLnN1YmRldiA9CisJCQlmaW1jX21kX3JlZ2lzdGVyX3NlbnNvcihmbWQsICZmbWQtPnNlbnNvcltpXSk7CisJCXJldCA9IF9fZmltY19tZF9zZXRfY2FtY2xrKGZtZCwgJmZtZC0+c2Vuc29yW2ldLCBmYWxzZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJcG1fcnVudGltZV9wdXQoJmZkLT5wZGV2LT5kZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNSVBJIENTSVMgYW5kIEZJTUMgcGxhdGZvcm0gZGV2aWNlcyByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgZmltY19yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGZpbWNfZGV2ICpmaW1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGZpbWNfbWQgKmZtZCA9IHA7CisJaW50IHJldDsKKworCWlmICghZmltYyB8fCAhZmltYy0+cGRldikKKwkJcmV0dXJuIDA7CisJaWYgKGZpbWMtPnBkZXYtPmlkIDwgMCB8fCBmaW1jLT5wZGV2LT5pZCA+PSBGSU1DX01BWF9ERVZTKQorCQlyZXR1cm4gMDsKKworCWZtZC0+ZmltY1tmaW1jLT5wZGV2LT5pZF0gPSBmaW1jOworCXJldCA9IGZpbWNfcmVnaXN0ZXJfbTJtX2RldmljZShmaW1jLCAmZm1kLT52NGwyX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBmaW1jX3JlZ2lzdGVyX2NhcHR1cmVfZGV2aWNlKGZpbWMsICZmbWQtPnY0bDJfZGV2KTsKKwlpZiAoIXJldCkKKwkJZmltYy0+dmlkX2NhcC51c2VyX3N1YmRldl9hcGkgPSBmbWQtPnVzZXJfc3ViZGV2X2FwaTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNzaXNfcmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBmaW1jX21kICpmbWQgPSBwOworCWludCBpZCwgcmV0OworCisJaWYgKCFzZCkKKwkJcmV0dXJuIDA7CisJcGRldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCWlmICghcGRldiB8fCBwZGV2LT5pZCA8IDAgfHwgcGRldi0+aWQgPj0gQ1NJU19NQVhfRU5USVRJRVMpCisJCXJldHVybiAwOworCXY0bDJfaW5mbyhzZCwgImNzaXMlZCBzZDogJXNcbiIsIHBkZXYtPmlkLCBzZC0+bmFtZSk7CisKKwlpZCA9IHBkZXYtPmlkIDwgMCA/IDAgOiBwZGV2LT5pZDsKKwlmbWQtPmNzaXNbaWRdLnNkID0gc2Q7CisJc2QtPmdycF9pZCA9IENTSVNfR1JPVVBfSUQ7CisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KCZmbWQtPnY0bDJfZGV2LCBzZCk7CisJaWYgKHJldCkKKwkJdjRsMl9lcnIoJmZtZC0+djRsMl9kZXYsCisJCQkgIkZhaWxlZCB0byByZWdpc3RlciBDU0lTIHN1YmRldmljZTogJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaW1jX21kX3JlZ2lzdGVyX3BsYXRmb3JtX2VudGl0aWVzIC0gcmVnaXN0ZXIgRklNQyBhbmQgQ1NJUyBtZWRpYSBlbnRpdGllcworICovCitzdGF0aWMgaW50IGZpbWNfbWRfcmVnaXN0ZXJfcGxhdGZvcm1fZW50aXRpZXMoc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworCWludCByZXQ7CisKKwlkcml2ZXIgPSBkcml2ZXJfZmluZChGSU1DX01PRFVMRV9OQU1FLCAmcGxhdGZvcm1fYnVzX3R5cGUpOworCWlmICghZHJpdmVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXQgPSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKGRyaXZlciwgTlVMTCwgZm1kLAorCQkJCSAgICAgZmltY19yZWdpc3Rlcl9jYWxsYmFjayk7CisJcHV0X2RyaXZlcihkcml2ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkcml2ZXIgPSBkcml2ZXJfZmluZChDU0lTX0RSSVZFUl9OQU1FLCAmcGxhdGZvcm1fYnVzX3R5cGUpOworCWlmIChkcml2ZXIpIHsKKwkJcmV0ID0gZHJpdmVyX2Zvcl9lYWNoX2RldmljZShkcml2ZXIsIE5VTEwsIGZtZCwKKwkJCQkJICAgICBjc2lzX3JlZ2lzdGVyX2NhbGxiYWNrKTsKKwkJcHV0X2RyaXZlcihkcml2ZXIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmaW1jX21kX3VucmVnaXN0ZXJfZW50aXRpZXMoc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9ERVZTOyBpKyspIHsKKwkJaWYgKGZtZC0+ZmltY1tpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZpbWNfdW5yZWdpc3Rlcl9tMm1fZGV2aWNlKGZtZC0+ZmltY1tpXSk7CisJCWZpbWNfdW5yZWdpc3Rlcl9jYXB0dXJlX2RldmljZShmbWQtPmZpbWNbaV0pOworCQlmbWQtPmZpbWNbaV0gPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQ1NJU19NQVhfRU5USVRJRVM7IGkrKykgeworCQlpZiAoZm1kLT5jc2lzW2ldLnNkID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoZm1kLT5jc2lzW2ldLnNkKTsKKwkJZm1kLT5jc2lzW2ldLnNkID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGZtZC0+bnVtX3NlbnNvcnM7IGkrKykgeworCQlpZiAoZm1kLT5zZW5zb3JbaV0uc3ViZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZmltY19tZF91bnJlZ2lzdGVyX3NlbnNvcihmbWQtPnNlbnNvcltpXS5zdWJkZXYpOworCQlmbWQtPnNlbnNvcltpXS5zdWJkZXYgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBmaW1jX21kX3JlZ2lzdGVyX3ZpZGVvX25vZGVzKHN0cnVjdCBmaW1jX21kICpmbWQpCit7CisJaW50IGksIHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfREVWUyAmJiAhcmV0OyBpKyspIHsKKwkJaWYgKCFmbWQtPmZpbWNbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAoZm1kLT5maW1jW2ldLT5tMm0udmZkKQorCQkJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGZtZC0+ZmltY1tpXS0+bTJtLnZmZCwKKwkJCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJaWYgKGZtZC0+ZmltY1tpXS0+dmlkX2NhcC52ZmQpCisJCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZm1kLT5maW1jW2ldLT52aWRfY2FwLnZmZCwKKwkJCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfX2ZpbWNfbWRfY3JlYXRlX2ZpbWNfbGlua3MgLSBjcmVhdGUgbGlua3MgdG8gYWxsIEZJTUMgZW50aXRpZXMKKyAqIEBmbWQ6IGZpbWMgbWVkaWEgZGV2aWNlCisgKiBAc291cmNlOiB0aGUgc291cmNlIGVudGl0eSB0byBjcmVhdGUgbGlua3MgdG8gYWxsIGZpbWMgZW50aXRpZXMgZnJvbQorICogQHNlbnNvcjogc2Vuc29yIHN1YmRldiBsaW5rZWQgdG8gRklNQ1tmaW1jX2lkXSBlbnRpdHksIG1heSBiZSBudWxsCisgKiBAcGFkOiB0aGUgc291cmNlIGVudGl0eSBwYWQgaW5kZXgKKyAqIEBmaW1jX2lkOiBpbmRleCBvZiB0aGUgZmltYyBkZXZpY2UgZm9yIHdoaWNoIGxpbmsgc2hvdWxkIGJlIGVuYWJsZWQKKyAqLworc3RhdGljIGludCBfX2ZpbWNfbWRfY3JlYXRlX2ZpbWNfbGlua3Moc3RydWN0IGZpbWNfbWQgKmZtZCwKKwkJCQkgICAgICAgc3RydWN0IG1lZGlhX2VudGl0eSAqc291cmNlLAorCQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvciwKKwkJCQkgICAgICAgaW50IHBhZCwgaW50IGZpbWNfaWQpCit7CisJc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gKnNfaW5mbzsKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzaW5rOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgcmV0LCBpOworCisJZm9yIChpID0gMDsgaSA8IEZJTUNfTUFYX0RFVlM7IGkrKykgeworCQlpZiAoIWZtZC0+ZmltY1tpXSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBTb21lIEZJTUMgdmFyaWFudHMgYXJlIG5vdCBmaXR0ZWQgd2l0aCBjYW1lcmEgY2FwdHVyZQorCQkgKiBpbnRlcmZhY2UuIFNraXAgY3JlYXRpbmcgYSBsaW5rIGZyb20gc2Vuc29yIGZvciB0aG9zZS4KKwkJICovCisJCWlmIChzZW5zb3ItPmdycF9pZCA9PSBTRU5TT1JfR1JPVVBfSUQgJiYKKwkJICAgICFmbWQtPmZpbWNbaV0tPnZhcmlhbnQtPmhhc19jYW1faWYpCisJCQljb250aW51ZTsKKworCQlmbGFncyA9IChpID09IGZpbWNfaWQpID8gTUVESUFfTE5LX0ZMX0VOQUJMRUQgOiAwOworCQlzaW5rID0gJmZtZC0+ZmltY1tpXS0+dmlkX2NhcC5zdWJkZXYtPmVudGl0eTsKKwkJcmV0ID0gbWVkaWFfZW50aXR5X2NyZWF0ZV9saW5rKHNvdXJjZSwgcGFkLCBzaW5rLAorCQkJCQkgICAgICBGSU1DX1NEX1BBRF9TSU5LLCBmbGFncyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIE5vdGlmeSBGSU1DIGNhcHR1cmUgc3ViZGV2IGVudGl0eSAqLworCQlyZXQgPSBtZWRpYV9lbnRpdHlfY2FsbChzaW5rLCBsaW5rX3NldHVwLCAmc2luay0+cGFkc1swXSwKKwkJCQkJJnNvdXJjZS0+cGFkc1twYWRdLCBmbGFncyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQl2NGwyX2luZm8oJmZtZC0+djRsMl9kZXYsICJjcmVhdGVkIGxpbmsgWyVzXSAlYz4gWyVzXSIsCisJCQkgIHNvdXJjZS0+bmFtZSwgZmxhZ3MgPyAnPScgOiAnLScsIHNpbmstPm5hbWUpOworCisJCWlmIChmbGFncyA9PSAwKQorCQkJY29udGludWU7CisJCXNfaW5mbyA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZW5zb3IpOworCQlpZiAoIVdBUk5fT04oc19pbmZvID09IE5VTEwpKSB7CisJCQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZmbWQtPnNsb2NrLCBpcnFfZmxhZ3MpOworCQkJc19pbmZvLT5ob3N0ID0gZm1kLT5maW1jW2ldOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm1kLT5zbG9jaywgaXJxX2ZsYWdzKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaW1jX21kX2NyZWF0ZV9saW5rcyAtIGNyZWF0ZSBkZWZhdWx0IGxpbmtzIGJldHdlZW4gcmVnaXN0ZXJlZCBlbnRpdGllcworICoKKyAqIFBhcmFsbGVsIGludGVyZmFjZSBzZW5zb3IgZW50aXRpZXMgYXJlIGNvbm5lY3RlZCBkaXJlY3RseSB0byBGSU1DIGNhcHR1cmUKKyAqIGVudGl0aWVzLiBUaGUgc2Vuc29ycyB1c2luZyBNSVBJIENTSVMgYnVzIGFyZSBjb25uZWN0ZWQgdGhyb3VnaCBpbW11dGFibGUKKyAqIGxpbmsgd2l0aCBDU0kgcmVjZWl2ZXIgZW50aXR5IHNwZWNpZmllZCBieSBtdXhfaWQuIEFueSByZWdpc3RlcmVkIENTSVMKKyAqIGVudGl0eSBoYXMgYSBsaW5rIHRvIGVhY2ggcmVnaXN0ZXJlZCBGSU1DIGNhcHR1cmUgZW50aXR5LiBFbmFibGVkIGxpbmtzCisgKiBhcmUgY3JlYXRlZCBieSBkZWZhdWx0IGJldHdlZW4gZWFjaCBzdWJzZXF1ZW50IHJlZ2lzdGVyZWQgc2Vuc29yIGFuZAorICogc3Vic2VxdWVudCBGSU1DIGNhcHR1cmUgZW50aXR5LiBUaGUgbnVtYmVyIG9mIGRlZmF1bHQgYWN0aXZlIGxpbmtzIGlzCisgKiBkZXRlcm1pbmVkIGJ5IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNlbnNvcnMgb3IgRklNQyBlbnRpdGllcywKKyAqIHdoaWNoZXZlciBpcyBsZXNzLgorICovCitzdGF0aWMgaW50IGZpbWNfbWRfY3JlYXRlX2xpbmtzKHN0cnVjdCBmaW1jX21kICpmbWQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3IsICpjc2lzOworCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqcGRhdGE7CisJc3RydWN0IGZpbWNfc2Vuc29yX2luZm8gKnNfaW5mbzsKKwlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzb3VyY2UsICpzaW5rOworCWludCBpLCBwYWQsIGZpbWNfaWQgPSAwOworCWludCByZXQgPSAwOworCXUzMiBmbGFnczsKKworCWZvciAoaSA9IDA7IGkgPCBmbWQtPm51bV9zZW5zb3JzOyBpKyspIHsKKwkJaWYgKGZtZC0+c2Vuc29yW2ldLnN1YmRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJc2Vuc29yID0gZm1kLT5zZW5zb3JbaV0uc3ViZGV2OworCQlzX2luZm8gPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2Vuc29yKTsKKwkJaWYgKCFzX2luZm8gfHwgIXNfaW5mby0+cGRhdGEpCisJCQljb250aW51ZTsKKworCQlzb3VyY2UgPSBOVUxMOworCQlwZGF0YSA9IHNfaW5mby0+cGRhdGE7CisKKwkJc3dpdGNoIChwZGF0YS0+YnVzX3R5cGUpIHsKKwkJY2FzZSBGSU1DX01JUElfQ1NJMjoKKwkJCWlmIChXQVJOKHBkYXRhLT5tdXhfaWQgPj0gQ1NJU19NQVhfRU5USVRJRVMsCisJCQkJIldyb25nIENTSSBjaGFubmVsIGlkOiAlZFxuIiwgcGRhdGEtPm11eF9pZCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWNzaXMgPSBmbWQtPmNzaXNbcGRhdGEtPm11eF9pZF0uc2Q7CisJCQlpZiAoV0FSTihjc2lzID09IE5VTEwsCisJCQkJICJNSVBJLUNTSSBpbnRlcmZhY2Ugc3BlY2lmaWVkICIKKwkJCQkgImJ1dCBzNXAtY3NpcyBtb2R1bGUgaXMgbm90IGxvYWRlZCFcbiIpKQorCQkJCWNvbnRpbnVlOworCisJCQlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnNlbnNvci0+ZW50aXR5LCAwLAorCQkJCQkgICAgICAmY3Npcy0+ZW50aXR5LCBDU0lTX1BBRF9TSU5LLAorCQkJCQkgICAgICBNRURJQV9MTktfRkxfSU1NVVRBQkxFIHwKKwkJCQkJICAgICAgTUVESUFfTE5LX0ZMX0VOQUJMRUQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl2NGwyX2luZm8oJmZtZC0+djRsMl9kZXYsICJjcmVhdGVkIGxpbmsgWyVzXSA9PiBbJXNdIiwKKwkJCQkgIHNlbnNvci0+ZW50aXR5Lm5hbWUsIGNzaXMtPmVudGl0eS5uYW1lKTsKKworCQkJc291cmNlID0gJmNzaXMtPmVudGl0eTsKKwkJCXBhZCA9IENTSVNfUEFEX1NPVVJDRTsKKwkJCWJyZWFrOworCisJCWNhc2UgRklNQ19JVFVfNjAxLi4uRklNQ19JVFVfNjU2OgorCQkJc291cmNlID0gJnNlbnNvci0+ZW50aXR5OworCQkJcGFkID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2NGwyX2VycigmZm1kLT52NGwyX2RldiwgIldyb25nIGJ1c190eXBlOiAleFxuIiwKKwkJCQkgcGRhdGEtPmJ1c190eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChzb3VyY2UgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IF9fZmltY19tZF9jcmVhdGVfZmltY19saW5rcyhmbWQsIHNvdXJjZSwgc2Vuc29yLCBwYWQsCisJCQkJCQkgIGZpbWNfaWQrKyk7CisJfQorCS8qIENyZWF0ZSBpbW11dGFibGUgbGlua3MgYmV0d2VlbiBlYWNoIEZJTUMncyBzdWJkZXYgYW5kIHZpZGVvIG5vZGUgKi8KKwlmbGFncyA9IE1FRElBX0xOS19GTF9JTU1VVEFCTEUgfCBNRURJQV9MTktfRkxfRU5BQkxFRDsKKwlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfREVWUzsgaSsrKSB7CisJCWlmICghZm1kLT5maW1jW2ldKQorCQkJY29udGludWU7CisJCXNvdXJjZSA9ICZmbWQtPmZpbWNbaV0tPnZpZF9jYXAuc3ViZGV2LT5lbnRpdHk7CisJCXNpbmsgPSAmZm1kLT5maW1jW2ldLT52aWRfY2FwLnZmZC0+ZW50aXR5OworCQlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoc291cmNlLCBGSU1DX1NEX1BBRF9TT1VSQ0UsCisJCQkJCSAgICAgIHNpbmssIDAsIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGUgcGVyaXBoZXJhbCBzZW5zb3IgY2xvY2sgbWFuYWdlbWVudC4KKyAqLworc3RhdGljIGludCBmaW1jX21kX2dldF9jbG9ja3Moc3RydWN0IGZpbWNfbWQgKmZtZCkKK3sKKwljaGFyIGNsa19uYW1lWzMyXTsKKwlzdHJ1Y3QgY2xrICpjbG9jazsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGSU1DX01BWF9DQU1DTEtTOyBpKyspIHsKKwkJc25wcmludGYoY2xrX25hbWUsIHNpemVvZihjbGtfbmFtZSksICJzY2xrX2NhbSV1IiwgaSk7CisJCWNsb2NrID0gY2xrX2dldChOVUxMLCBjbGtfbmFtZSk7CisJCWlmIChJU19FUlJfT1JfTlVMTChjbG9jaykpIHsKKwkJCXY0bDJfZXJyKCZmbWQtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIGdldCBjbG9jazogJXMiLAorCQkJCSAgY2xrX25hbWUpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCQlmbWQtPmNhbWNsa1tpXS5jbG9jayA9IGNsb2NrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmltY19tZF9wdXRfY2xvY2tzKHN0cnVjdCBmaW1jX21kICpmbWQpCit7CisJaW50IGkgPSBGSU1DX01BWF9DQU1DTEtTOworCisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWlmIChJU19FUlJfT1JfTlVMTChmbWQtPmNhbWNsa1tpXS5jbG9jaykpCisJCQljb250aW51ZTsKKwkJY2xrX3B1dChmbWQtPmNhbWNsa1tpXS5jbG9jayk7CisJCWZtZC0+Y2FtY2xrW2ldLmNsb2NrID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19maW1jX21kX3NldF9jYW1jbGsoc3RydWN0IGZpbWNfbWQgKmZtZCwKKwkJCQkJIHN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvICpzX2luZm8sCisJCQkJCSBib29sIG9uKQoreworCXN0cnVjdCBzNXBfZmltY19pc3BfaW5mbyAqcGRhdGEgPSBzX2luZm8tPnBkYXRhOworCXN0cnVjdCBmaW1jX2NhbWNsa19pbmZvICpjYW1jbGs7CisJaW50IHJldCA9IDA7CisKKwlpZiAoV0FSTl9PTihwZGF0YS0+Y2xrX2lkID49IEZJTUNfTUFYX0NBTUNMS1MpIHx8IGZtZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzX2luZm8tPmNsa19vbiA9PSBvbikKKwkJcmV0dXJuIDA7CisJY2FtY2xrID0gJmZtZC0+Y2FtY2xrW3BkYXRhLT5jbGtfaWRdOworCisJZGJnKCJjYW1jbGsgJWQsIGY6ICVsdSwgY2xrOiAlcCwgb246ICVkIiwKKwkgICAgcGRhdGEtPmNsa19pZCwgcGRhdGEtPmNsa19mcmVxdWVuY3ksIGNhbWNsaywgb24pOworCisJaWYgKG9uKSB7CisJCWlmIChjYW1jbGstPnVzZV9jb3VudCA+IDAgJiYKKwkJICAgIGNhbWNsay0+ZnJlcXVlbmN5ICE9IHBkYXRhLT5jbGtfZnJlcXVlbmN5KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNhbWNsay0+dXNlX2NvdW50KysgPT0gMCkgeworCQkJY2xrX3NldF9yYXRlKGNhbWNsay0+Y2xvY2ssIHBkYXRhLT5jbGtfZnJlcXVlbmN5KTsKKwkJCWNhbWNsay0+ZnJlcXVlbmN5ID0gcGRhdGEtPmNsa19mcmVxdWVuY3k7CisJCQlyZXQgPSBjbGtfZW5hYmxlKGNhbWNsay0+Y2xvY2spOworCQl9CisJCXNfaW5mby0+Y2xrX29uID0gMTsKKwkJZGJnKCJFbmFibGVkIGNhbWNsayAlZDogZjogJWx1IiwgcGRhdGEtPmNsa19pZCwKKwkJICAgIGNsa19nZXRfcmF0ZShjYW1jbGstPmNsb2NrKSk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoV0FSTl9PTihjYW1jbGstPnVzZV9jb3VudCA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoLS1jYW1jbGstPnVzZV9jb3VudCA9PSAwKSB7CisJCWNsa19kaXNhYmxlKGNhbWNsay0+Y2xvY2spOworCQlzX2luZm8tPmNsa19vbiA9IDA7CisJCWRiZygiRGlzYWJsZWQgY2FtY2xrICVkIiwgcGRhdGEtPmNsa19pZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZmltY19tZF9zZXRfY2FtY2xrIC0gcGVyaXBoZXJhbCBzZW5zb3IgY2xvY2sgc2V0dXAKKyAqIEBzZDogc2Vuc29yIHN1YmRldiB0byBjb25maWd1cmUgc2Nsa19jYW0gY2xvY2sgZm9yCisgKiBAb246IDEgdG8gZW5hYmxlIG9yIDAgdG8gZGlzYWJsZSB0aGUgY2xvY2sKKyAqCisgKiBUaGVyZSBhcmUgMiBzZXBhcmF0ZSBjbG9jayBvdXRwdXRzIGF2YWlsYWJsZSBpbiB0aGUgU29DIGZvciBleHRlcm5hbAorICogaW1hZ2UgcHJvY2Vzc29ycy4gVGhlc2UgY2xvY2tzIGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgcmVnaXN0ZXJlZCBGSU1DCisgKiBkZXZpY2VzIHRvIHdoaWNoIHNlbnNvcnMgY2FuIGJlIGF0dGFjaGVkLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaAorICogdGhlIE1JUEkgQ1NJIHJlY2VpdmVyLiBUaGUgY2xvY2sgaXMgYWxsb3dlZCBoZXJlIHRvIGJlIHVzZWQgYnkKKyAqIG11bHRpcGxlIHNlbnNvcnMgY29uY3VycmVudGx5IGlmIHRoZXkgdXNlIHNhbWUgZnJlcXVlbmN5LgorICogVGhlIHBlciBzZW5zb3Igc3ViZGV2IGNsa19vbiBhdHRyaWJ1dGUgaGVscHMgdG8gc3luY2hyb25pemUgYWNjZXNzZXMKKyAqIHRvIHRoZSBzY2xrX2NhbSBjbG9ja3MgZnJvbSB0aGUgdmlkZW8gYW5kIG1lZGlhIGRldmljZSBub2Rlcy4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGdyYXBoIG11dGV4IGlzIGhlbGQuCisgKi8KK2ludCBmaW1jX21kX3NldF9jYW1jbGsoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgYm9vbCBvbikKK3sKKwlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbyAqc19pbmZvID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kID0gZW50aXR5X3RvX2ZpbWNfbWRldigmc2QtPmVudGl0eSk7CisKKwlyZXR1cm4gX19maW1jX21kX3NldF9jYW1jbGsoZm1kLCBzX2luZm8sIG9uKTsKK30KKworc3RhdGljIGludCBmaW1jX21kX2xpbmtfbm90aWZ5KHN0cnVjdCBtZWRpYV9wYWQgKnNvdXJjZSwKKwkJCSAgICAgICBzdHJ1Y3QgbWVkaWFfcGFkICpzaW5rLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWM7CisJaW50IHJldCA9IDA7CisKKwlpZiAobWVkaWFfZW50aXR5X3R5cGUoc2luay0+ZW50aXR5KSAhPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVikKKwkJcmV0dXJuIDA7CisKKwlzZCA9IG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihzaW5rLT5lbnRpdHkpOworCWZpbWMgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmICghKGZsYWdzICYgTUVESUFfTE5LX0ZMX0VOQUJMRUQpKSB7CisJCXJldCA9IF9fZmltY19waXBlbGluZV9zaHV0ZG93bihmaW1jKTsKKwkJZmltYy0+cGlwZWxpbmUuc2Vuc29yID0gTlVMTDsKKwkJZmltYy0+cGlwZWxpbmUuY3NpcyA9IE5VTEw7CisKKwkJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJCWZpbWNfY3RybHNfZGVsZXRlKGZpbWMtPnZpZF9jYXAuY3R4KTsKKwkJbXV0ZXhfdW5sb2NrKCZmaW1jLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyoKKwkgKiBMaW5rIGFjdGl2YXRpb24uIEVuYWJsZSBwb3dlciBvZiBwaXBlbGluZSBlbGVtZW50cyBvbmx5IGlmIHRoZQorCSAqIHBpcGVsaW5lIGlzIGFscmVhZHkgaW4gdXNlLCBpLmUuIGl0cyB2aWRlbyBub2RlIGlzIG9wZW5lZC4KKwkgKiBSZWNyZWF0ZSB0aGUgY29udHJvbHMgZGVzdHJveWVkIGR1cmluZyB0aGUgbGluayBkZWFjdGl2YXRpb24uCisJICovCisJbXV0ZXhfbG9jaygmZmltYy0+bG9jayk7CisJaWYgKGZpbWMtPnZpZF9jYXAucmVmY250ID4gMCkgeworCQlyZXQgPSBfX2ZpbWNfcGlwZWxpbmVfaW5pdGlhbGl6ZShmaW1jLCBzb3VyY2UtPmVudGl0eSwgdHJ1ZSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZmltY19jYXB0dXJlX2N0cmxzX2NyZWF0ZShmaW1jKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZmaW1jLT5sb2NrKTsKKworCXJldHVybiByZXQgPyAtRVBJUEUgOiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZpbWNfbWRfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZm1kLT51c2VyX3N1YmRldl9hcGkpCisJCXJldHVybiBzdHJsY3B5KGJ1ZiwgIlN1Yi1kZXZpY2UgQVBJIChzdWItZGV2KVxuIiwgUEFHRV9TSVpFKTsKKworCXJldHVybiBzdHJsY3B5KGJ1ZiwgIlY0TDIgdmlkZW8gbm9kZSBvbmx5IEFQSSAodmlkLWRldilcbiIsIFBBR0VfU0laRSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZpbWNfbWRfc3lzZnNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJYm9vbCBzdWJkZXZfYXBpOworCWludCBpOworCisJaWYgKCFzdHJjbXAoYnVmLCAidmlkLWRldlxuIikpCisJCXN1YmRldl9hcGkgPSBmYWxzZTsKKwllbHNlIGlmICghc3RyY21wKGJ1ZiwgInN1Yi1kZXZcbiIpKQorCQlzdWJkZXZfYXBpID0gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBjb3VudDsKKworCWZtZC0+dXNlcl9zdWJkZXZfYXBpID0gc3ViZGV2X2FwaTsKKwlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfREVWUzsgaSsrKQorCQlpZiAoZm1kLT5maW1jW2ldKQorCQkJZm1kLT5maW1jW2ldLT52aWRfY2FwLnVzZXJfc3ViZGV2X2FwaSA9IHN1YmRldl9hcGk7CisJcmV0dXJuIGNvdW50OworfQorLyoKKyAqIFRoaXMgZGV2aWNlIGF0dHJpYnV0ZSBpcyB0byBzZWxlY3QgdmlkZW8gcGlwZWxpbmUgY29uZmlndXJhdGlvbiBtZXRob2QuCisgKiBUaGVyZSBhcmUgZm9sbG93aW5nIHZhbGlkIHZhbHVlczoKKyAqICB2aWQtZGV2IC0gZm9yIFY0TDIgdmlkZW8gbm9kZSBBUEkgb25seSwgc3ViZGV2aWNlIHdpbGwgYmUgY29uZmlndXJlZAorICogIGJ5IHRoZSBob3N0IGRyaXZlci4KKyAqICBzdWItZGV2IC0gZm9yIG1lZGlhIGNvbnRyb2xsZXIgQVBJLCBzdWJkZXZzIG11c3QgYmUgY29uZmlndXJlZCBpbiB1c2VyCisgKiAgc3BhY2UgYmVmb3JlIHN0YXJ0aW5nIHN0cmVhbWluZy4KKyAqLworc3RhdGljIERFVklDRV9BVFRSKHN1YmRldl9jb25mX21vZGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICBmaW1jX21kX3N5c2ZzX3Nob3csIGZpbWNfbWRfc3lzZnNfc3RvcmUpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmaW1jX21kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldjsKKwlzdHJ1Y3QgZmltY19tZCAqZm1kOworCWludCByZXQ7CisKKwlpZiAoV0FSTighcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsICJQbGF0Zm9ybSBkYXRhIG5vdCBzcGVjaWZpZWQhXG4iKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmltY19tZCksIEdGUF9LRVJORUwpOworCWlmICghZm1kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZmbWQtPnNsb2NrKTsKKwlmbWQtPnBkZXYgPSBwZGV2OworCisJc3RybGNweShmbWQtPm1lZGlhX2Rldi5tb2RlbCwgIlNBTVNVTkcgUzVQIEZJTUMiLAorCQlzaXplb2YoZm1kLT5tZWRpYV9kZXYubW9kZWwpKTsKKwlmbWQtPm1lZGlhX2Rldi5saW5rX25vdGlmeSA9IGZpbWNfbWRfbGlua19ub3RpZnk7CisJZm1kLT5tZWRpYV9kZXYuZGV2ID0gJnBkZXYtPmRldjsKKworCXY0bDJfZGV2ID0gJmZtZC0+djRsMl9kZXY7CisJdjRsMl9kZXYtPm1kZXYgPSAmZm1kLT5tZWRpYV9kZXY7CisJdjRsMl9kZXYtPm5vdGlmeSA9IGZpbWNfc2Vuc29yX25vdGlmeTsKKwlzbnByaW50Zih2NGwyX2Rldi0+bmFtZSwgc2l6ZW9mKHY0bDJfZGV2LT5uYW1lKSwgIiVzIiwKKwkJIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZmbWQtPnY0bDJfZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2Vycih2NGwyX2RldiwgIkZhaWxlZCB0byByZWdpc3RlciB2NGwyX2RldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyMTsKKwl9CisJcmV0ID0gbWVkaWFfZGV2aWNlX3JlZ2lzdGVyKCZmbWQtPm1lZGlhX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIodjRsMl9kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbWVkaWEgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnIyOworCX0KKwlyZXQgPSBmaW1jX21kX2dldF9jbG9ja3MoZm1kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlmbWQtPnVzZXJfc3ViZGV2X2FwaSA9IGZhbHNlOworCXJldCA9IGZpbWNfbWRfcmVnaXN0ZXJfcGxhdGZvcm1fZW50aXRpZXMoZm1kKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlyZXQgPSBmaW1jX21kX3JlZ2lzdGVyX3NlbnNvcl9lbnRpdGllcyhmbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKwlyZXQgPSBmaW1jX21kX2NyZWF0ZV9saW5rcyhmbWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXZfbm9kZXMoJmZtZC0+djRsMl9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKwlyZXQgPSBmaW1jX21kX3JlZ2lzdGVyX3ZpZGVvX25vZGVzKGZtZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdWJkZXZfY29uZl9tb2RlKTsKKwlpZiAoIXJldCkgeworCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmbWQpOworCQlyZXR1cm4gMDsKKwl9CitlcnIzOgorCW1lZGlhX2RldmljZV91bnJlZ2lzdGVyKCZmbWQtPm1lZGlhX2Rldik7CisJZmltY19tZF9wdXRfY2xvY2tzKGZtZCk7CisJZmltY19tZF91bnJlZ2lzdGVyX2VudGl0aWVzKGZtZCk7CitlcnIyOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmZtZC0+djRsMl9kZXYpOworZXJyMToKKwlrZnJlZShmbWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGZpbWNfbWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGZpbWNfbWQgKmZtZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFmbWQpCisJCXJldHVybiAwOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfc3ViZGV2X2NvbmZfbW9kZSk7CisJZmltY19tZF91bnJlZ2lzdGVyX2VudGl0aWVzKGZtZCk7CisJbWVkaWFfZGV2aWNlX3VucmVnaXN0ZXIoJmZtZC0+bWVkaWFfZGV2KTsKKwlmaW1jX21kX3B1dF9jbG9ja3MoZm1kKTsKKwlrZnJlZShmbWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmaW1jX21kX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZmltY19tZF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGZpbWNfbWRfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzNXAtZmltYy1tZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK2ludCBfX2luaXQgZmltY19tZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXF1ZXN0X21vZHVsZSgiczVwLWNzaXMiKTsKKwlyZXQgPSBmaW1jX3JlZ2lzdGVyX2RyaXZlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZmltY19tZF9kcml2ZXIpOworfQordm9pZCBfX2V4aXQgZmltY19tZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZpbWNfbWRfZHJpdmVyKTsKKwlmaW1jX3VucmVnaXN0ZXJfZHJpdmVyKCk7Cit9CisKK21vZHVsZV9pbml0KGZpbWNfbWRfaW5pdCk7Cittb2R1bGVfZXhpdChmaW1jX21kX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlM1UCBGSU1DIGNhbWVyYSBob3N0IGludGVyZmFjZS92aWRlbyBwb3N0cHJvY2Vzc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjIuMC4xIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtbWRldmljZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTM3ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBGSU1DX01ERVZJQ0VfSF8KKyNkZWZpbmUgRklNQ19NREVWSUNFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhLWVudGl0eS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2luY2x1ZGUgImZpbWMtY29yZS5oIgorI2luY2x1ZGUgIm1pcGktY3Npcy5oIgorCisvKiBHcm91cCBJRHMgb2Ygc2Vuc29yLCBNSVBJIENTSVMgYW5kIHRoZSB3cml0ZWJhY2sgc3ViZGV2cy4gKi8KKyNkZWZpbmUgU0VOU09SX0dST1VQX0lECQkoMSA8PCA4KQorI2RlZmluZSBDU0lTX0dST1VQX0lECQkoMSA8PCA5KQorI2RlZmluZSBXUklURUJBQ0tfR1JPVVBfSUQJKDEgPDwgMTApCisKKyNkZWZpbmUgRklNQ19NQVhfU0VOU09SUwk4CisjZGVmaW5lIEZJTUNfTUFYX0NBTUNMS1MJMgorCitzdHJ1Y3QgZmltY19jc2lzX2luZm8geworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJaW50IGlkOworfTsKKworc3RydWN0IGZpbWNfY2FtY2xrX2luZm8geworCXN0cnVjdCBjbGsgKmNsb2NrOworCWludCB1c2VfY291bnQ7CisJdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7Cit9OworCisvKioKKyAqIHN0cnVjdCBmaW1jX3NlbnNvcl9pbmZvIC0gaW1hZ2UgZGF0YSBzb3VyY2Ugc3ViZGV2IGluZm9ybWF0aW9uCisgKiBAcGRhdGE6IHNlbnNvcidzIGF0cnJpYnV0ZXMgcGFzc2VkIGFzIG1lZGlhIGRldmljZSdzIHBsYXRmb3JtIGRhdGEKKyAqIEBzdWJkZXY6IGltYWdlIHNlbnNvciB2NGwyIHN1YmRldgorICogQGhvc3Q6IGZpbWMgZGV2aWNlIHRoZSBzZW5zb3IgaXMgY3VycmVudGx5IGxpbmtlZCB0bworICogQGNsa19vbjogc2Nsa19jYW0gY2xvY2sncyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJkZXYKKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGFwcGxpZXMgdG8gaW1hZ2Ugc2Vuc29yIGFuZCB0aGUgd3JpdGViYWNrIHN1YmRldnMuCisgKi8KK3N0cnVjdCBmaW1jX3NlbnNvcl9pbmZvIHsKKwlzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gKnBkYXRhOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OworCXN0cnVjdCBmaW1jX2RldiAqaG9zdDsKKwlib29sIGNsa19vbjsKK307CisKKy8qKgorICogc3RydWN0IGZpbWNfbWQgLSBmaW1jIG1lZGlhIGRldmljZSBpbmZvcm1hdGlvbgorICogQGNzaXM6IE1JUEkgQ1NJUyBzdWJkZXZzIGRhdGEKKyAqIEBzZW5zb3I6IGFycmF5IG9mIHJlZ2lzdGVyZWQgc2Vuc29yIHN1YmRldnMKKyAqIEBudW1fc2Vuc29yczogYWN0dWFsIG51bWJlciBvZiByZWdpc3RlcmVkIHNlbnNvcnMKKyAqIEBjYW1jbGs6IGV4dGVybmFsIHNlbnNvciBjbG9jayBpbmZvcm1hdGlvbgorICogQGZpbWM6IGFycmF5IG9mIHJlZ2lzdGVyZWQgZmltYyBkZXZpY2VzCisgKiBAbWVkaWFfZGV2OiB0b3AgbGV2ZWwgbWVkaWEgZGV2aWNlCisgKiBAdjRsMl9kZXY6IHRvcCBsZXZlbCB2NGwyX2RldmljZSBob2xkaW5nIHVwIHRoZSBzdWJkZXZzCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHRoaXMgbWVkaWEgZGV2aWNlIGlzIGhvb2tlZCB1cCBpbnRvCisgKiBAdXNlcl9zdWJkZXZfYXBpOiB0cnVlIGlmIHN1YmRldnMgYXJlIG5vdCBjb25maWd1cmVkIGJ5IHRoZSBob3N0IGRyaXZlcgorICogQHNsb2NrOiBzcGlubG9jayBwcm90ZWN0aW5nIEBzZW5zb3IgYXJyYXkKKyAqLworc3RydWN0IGZpbWNfbWQgeworCXN0cnVjdCBmaW1jX2NzaXNfaW5mbyBjc2lzW0NTSVNfTUFYX0VOVElUSUVTXTsKKwlzdHJ1Y3QgZmltY19zZW5zb3JfaW5mbyBzZW5zb3JbRklNQ19NQVhfU0VOU09SU107CisJaW50IG51bV9zZW5zb3JzOworCXN0cnVjdCBmaW1jX2NhbWNsa19pbmZvIGNhbWNsa1tGSU1DX01BWF9DQU1DTEtTXTsKKwlzdHJ1Y3QgZmltY19kZXYgKmZpbWNbRklNQ19NQVhfREVWU107CisJc3RydWN0IG1lZGlhX2RldmljZSBtZWRpYV9kZXY7CisJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJYm9vbCB1c2VyX3N1YmRldl9hcGk7CisJc3BpbmxvY2tfdCBzbG9jazsKK307CisKKyNkZWZpbmUgaXNfc3ViZGV2X3BhZChwYWQpIChwYWQgPT0gTlVMTCB8fCBcCisJbWVkaWFfZW50aXR5X3R5cGUocGFkLT5lbnRpdHkpID09IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWKQorCisjZGVmaW5lIG1lX3N1YnR5cGUobWUpIFwKKwkoKG1lLT50eXBlKSAmIChNRURJQV9FTlRfVFlQRV9NQVNLIHwgTUVESUFfRU5UX1NVQlRZUEVfTUFTSykpCisKKyNkZWZpbmUgc3ViZGV2X2hhc19kZXZub2RlKF9fc2QpIChfX3NkLT5mbGFncyAmIFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmaW1jX21kICplbnRpdHlfdG9fZmltY19tZGV2KHN0cnVjdCBtZWRpYV9lbnRpdHkgKm1lKQoreworCXJldHVybiBtZS0+cGFyZW50ID09IE5VTEwgPyBOVUxMIDoKKwkJY29udGFpbmVyX29mKG1lLT5wYXJlbnQsIHN0cnVjdCBmaW1jX21kLCBtZWRpYV9kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmltY19tZF9ncmFwaF9sb2NrKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlCVUdfT04oZmltYy0+dmlkX2NhcC52ZmQgPT0gTlVMTCk7CisJbXV0ZXhfbG9jaygmZmltYy0+dmlkX2NhcC52ZmQtPmVudGl0eS5wYXJlbnQtPmdyYXBoX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbWNfbWRfZ3JhcGhfdW5sb2NrKHN0cnVjdCBmaW1jX2RldiAqZmltYykKK3sKKwlCVUdfT04oZmltYy0+dmlkX2NhcC52ZmQgPT0gTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZmaW1jLT52aWRfY2FwLnZmZC0+ZW50aXR5LnBhcmVudC0+Z3JhcGhfbXV0ZXgpOworfQorCitpbnQgZmltY19tZF9zZXRfY2FtY2xrKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGJvb2wgb24pOwordm9pZCBmaW1jX3BpcGVsaW5lX3ByZXBhcmUoc3RydWN0IGZpbWNfZGV2ICpmaW1jLCBzdHJ1Y3QgbWVkaWFfZW50aXR5ICptZSk7CitpbnQgZmltY19waXBlbGluZV9pbml0aWFsaXplKHN0cnVjdCBmaW1jX2RldiAqZmltYywgc3RydWN0IG1lZGlhX2VudGl0eSAqbWUsCisJCQkgICAgIGJvb2wgcmVzdW1lKTsKK2ludCBmaW1jX3BpcGVsaW5lX3NodXRkb3duKHN0cnVjdCBmaW1jX2RldiAqZmltYyk7CitpbnQgZmltY19waXBlbGluZV9zX3Bvd2VyKHN0cnVjdCBmaW1jX2RldiAqZmltYywgaW50IHN0YXRlKTsKK2ludCBmaW1jX3BpcGVsaW5lX3Nfc3RyZWFtKHN0cnVjdCBmaW1jX2RldiAqZmltYywgaW50IHN0YXRlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtcmVnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtcmVnLmMKaW5kZXggNDg5M2IyZC4uMjBlNjY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLXJlZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1yZWcuYwpAQCAtMzAsNyArMzAsNyBAQAogCWNmZyA9IHJlYWRsKGRldi0+cmVncyArIFM1UF9DSUdDVFJMKTsKIAljZmcgfD0gKFM1UF9DSUdDVFJMX1NXUlNUIHwgUzVQX0NJR0NUUkxfSVJRX0xFVkVMKTsKIAl3cml0ZWwoY2ZnLCBkZXYtPnJlZ3MgKyBTNVBfQ0lHQ1RSTCk7Ci0JdWRlbGF5KDEwMDApOworCXVkZWxheSgxMCk7CiAKIAljZmcgPSByZWFkbChkZXYtPnJlZ3MgKyBTNVBfQ0lHQ1RSTCk7CiAJY2ZnICY9IH5TNVBfQ0lHQ1RSTF9TV1JTVDsKQEAgLTQxLDE5ICs0MSwxMSBAQAogewogCXUzMiBmbGlwID0gUzVQX01TQ1RSTF9GTElQX05PUk1BTDsKIAotCXN3aXRjaCAoY3R4LT5mbGlwKSB7Ci0JY2FzZSBGTElQX1hfQVhJUzoKKwlpZiAoY3R4LT5oZmxpcCkKIAkJZmxpcCA9IFM1UF9NU0NUUkxfRkxJUF9YX01JUlJPUjsKLQkJYnJlYWs7Ci0JY2FzZSBGTElQX1lfQVhJUzoKKwlpZiAoY3R4LT52ZmxpcCkKIAkJZmxpcCA9IFM1UF9NU0NUUkxfRkxJUF9ZX01JUlJPUjsKLQkJYnJlYWs7Ci0JY2FzZSBGTElQX1hZX0FYSVM6Ci0JCWZsaXAgPSBTNVBfTVNDVFJMX0ZMSVBfMTgwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisKIAlpZiAoY3R4LT5yb3RhdGlvbiA8PSA5MCkKIAkJcmV0dXJuIGZsaXA7CiAKQEAgLTY0LDE5ICs1NiwxMSBAQAogewogCXUzMiBmbGlwID0gUzVQX0NJVFJHRk1UX0ZMSVBfTk9STUFMOwogCi0Jc3dpdGNoIChjdHgtPmZsaXApIHsKLQljYXNlIEZMSVBfWF9BWElTOgotCQlmbGlwID0gUzVQX0NJVFJHRk1UX0ZMSVBfWF9NSVJST1I7Ci0JCWJyZWFrOwotCWNhc2UgRkxJUF9ZX0FYSVM6Ci0JCWZsaXAgPSBTNVBfQ0lUUkdGTVRfRkxJUF9ZX01JUlJPUjsKLQkJYnJlYWs7Ci0JY2FzZSBGTElQX1hZX0FYSVM6Ci0JCWZsaXAgPSBTNVBfQ0lUUkdGTVRfRkxJUF8xODA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwlpZiAoY3R4LT5oZmxpcCkKKwkJZmxpcCB8PSBTNVBfQ0lUUkdGTVRfRkxJUF9YX01JUlJPUjsKKwlpZiAoY3R4LT52ZmxpcCkKKwkJZmxpcCB8PSBTNVBfQ0lUUkdGTVRfRkxJUF9ZX01JUlJPUjsKKwogCWlmIChjdHgtPnJvdGF0aW9uIDw9IDkwKQogCQlyZXR1cm4gZmxpcDsKIApAQCAtMzY4LDE3ICszNTIsMTkgQEAKIAl3cml0ZWwoY2ZnIHwgUzVQX0NJSU1HQ1BUX0lNR0NQVEVOLCBkZXYtPnJlZ3MgKyBTNVBfQ0lJTUdDUFQpOwogfQogCi12b2lkIGZpbWNfaHdfc2V0X2VmZmVjdChzdHJ1Y3QgZmltY19jdHggKmN0eCkKK3ZvaWQgZmltY19od19zZXRfZWZmZWN0KHN0cnVjdCBmaW1jX2N0eCAqY3R4LCBib29sIGFjdGl2ZSkKIHsKIAlzdHJ1Y3QgZmltY19kZXYgKmRldiA9IGN0eC0+ZmltY19kZXY7CiAJc3RydWN0IGZpbWNfZWZmZWN0ICplZmZlY3QgPSAmY3R4LT5lZmZlY3Q7Ci0JdTMyIGNmZyA9IChTNVBfQ0lJTUdFRkZfSUVfRU5BQkxFIHwgUzVQX0NJSU1HRUZGX0lFX1NDX0FGVEVSKTsKKwl1MzIgY2ZnID0gMDsKIAotCWNmZyB8PSBlZmZlY3QtPnR5cGU7Ci0KLQlpZiAoZWZmZWN0LT50eXBlID09IFM1UF9GSU1DX0VGRkVDVF9BUkJJVFJBUlkpIHsKLQkJY2ZnIHw9IFM1UF9DSUlNR0VGRl9QQVRfQ0IoZWZmZWN0LT5wYXRfY2IpOwotCQljZmcgfD0gUzVQX0NJSU1HRUZGX1BBVF9DUihlZmZlY3QtPnBhdF9jcik7CisJaWYgKGFjdGl2ZSkgeworCQljZmcgfD0gUzVQX0NJSU1HRUZGX0lFX1NDX0FGVEVSIHwgUzVQX0NJSU1HRUZGX0lFX0VOQUJMRTsKKwkJY2ZnIHw9IGVmZmVjdC0+dHlwZTsKKwkJaWYgKGVmZmVjdC0+dHlwZSA9PSBTNVBfRklNQ19FRkZFQ1RfQVJCSVRSQVJZKSB7CisJCQljZmcgfD0gUzVQX0NJSU1HRUZGX1BBVF9DQihlZmZlY3QtPnBhdF9jYik7CisJCQljZmcgfD0gUzVQX0NJSU1HRUZGX1BBVF9DUihlZmZlY3QtPnBhdF9jcik7CisJCX0KIAl9CiAKIAl3cml0ZWwoY2ZnLCBkZXYtPnJlZ3MgKyBTNVBfQ0lJTUdFRkYpOwpAQCAtNTQ3LDIwICs1MzMsMjQgQEAKIAl1MzIgY2ZnID0gcmVhZGwoZmltYy0+cmVncyArIFM1UF9DSUdDVFJMKTsKIAogCWNmZyAmPSB+KFM1UF9DSUdDVFJMX0lOVlBPTFBDTEsgfCBTNVBfQ0lHQ1RSTF9JTlZQT0xWU1lOQyB8Ci0JCSBTNVBfQ0lHQ1RSTF9JTlZQT0xIUkVGIHwgUzVQX0NJR0NUUkxfSU5WUE9MSFNZTkMpOworCQkgUzVQX0NJR0NUUkxfSU5WUE9MSFJFRiB8IFM1UF9DSUdDVFJMX0lOVlBPTEhTWU5DIHwKKwkJIFM1UF9DSUdDVFJMX0lOVlBPTEZJRUxEKTsKIAotCWlmIChjYW0tPmZsYWdzICYgRklNQ19DTEtfSU5WX1BDTEspCisJaWYgKGNhbS0+ZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykKIAkJY2ZnIHw9IFM1UF9DSUdDVFJMX0lOVlBPTFBDTEs7CiAKLQlpZiAoY2FtLT5mbGFncyAmIEZJTUNfQ0xLX0lOVl9WU1lOQykKKwlpZiAoY2FtLT5mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKQogCQljZmcgfD0gUzVQX0NJR0NUUkxfSU5WUE9MVlNZTkM7CiAKLQlpZiAoY2FtLT5mbGFncyAmIEZJTUNfQ0xLX0lOVl9IUkVGKQorCWlmIChjYW0tPmZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCiAJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9JTlZQT0xIUkVGOwogCi0JaWYgKGNhbS0+ZmxhZ3MgJiBGSU1DX0NMS19JTlZfSFNZTkMpCisJaWYgKGNhbS0+ZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKIAkJY2ZnIHw9IFM1UF9DSUdDVFJMX0lOVlBPTEhTWU5DOwogCisJaWYgKGNhbS0+ZmxhZ3MgJiBWNEwyX01CVVNfRklFTERfRVZFTl9MT1cpCisJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9JTlZQT0xGSUVMRDsKKwogCXdyaXRlbChjZmcsIGZpbWMtPnJlZ3MgKyBTNVBfQ0lHQ1RSTCk7CiAKIAlyZXR1cm4gMDsKQEAgLTU4OCw3ICs1NzgsNyBAQAogCiAJaWYgKGNhbS0+YnVzX3R5cGUgPT0gRklNQ19JVFVfNjAxIHx8IGNhbS0+YnVzX3R5cGUgPT0gRklNQ19JVFVfNjU2KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpeF9kZXNjKTsgaSsrKSB7Ci0JCQlpZiAoZmltYy0+dmlkX2NhcC5mbXQuY29kZSA9PSBwaXhfZGVzY1tpXS5waXhlbGNvZGUpIHsKKwkJCWlmIChmaW1jLT52aWRfY2FwLm1mLmNvZGUgPT0gcGl4X2Rlc2NbaV0ucGl4ZWxjb2RlKSB7CiAJCQkJY2ZnID0gcGl4X2Rlc2NbaV0uY2lzcmNmbXQ7CiAJCQkJYnVzX3dpZHRoID0gcGl4X2Rlc2NbaV0uYnVzX3dpZHRoOwogCQkJCWJyZWFrOwpAQCAtNTk2LDkgKzU4Niw5IEBACiAJCX0KIAogCQlpZiAoaSA9PSBBUlJBWV9TSVpFKHBpeF9kZXNjKSkgewotCQkJdjRsMl9lcnIoJmZpbWMtPnZpZF9jYXAudjRsMl9kZXYsCisJCQl2NGwyX2VycihmaW1jLT52aWRfY2FwLnZmZCwKIAkJCQkgIkNhbWVyYSBjb2xvciBmb3JtYXQgbm90IHN1cHBvcnRlZDogJWRcbiIsCi0JCQkJIGZpbWMtPnZpZF9jYXAuZm10LmNvZGUpOworCQkJCSBmaW1jLT52aWRfY2FwLm1mLmNvZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtNjA4LDYgKzU5OCw5IEBACiAJCQllbHNlIGlmIChidXNfd2lkdGggPT0gMTYpCiAJCQkJY2ZnIHw9IFM1UF9DSVNSQ0ZNVF9JVFU2MDFfMTZCSVQ7CiAJCX0gLyogZWxzZSBkZWZhdWx0cyB0byBJVFUtUiBCVC42NTYgOC1iaXQgKi8KKwl9IGVsc2UgaWYgKGNhbS0+YnVzX3R5cGUgPT0gRklNQ19NSVBJX0NTSTIpIHsKKwkJaWYgKGZpbWNfZm10X2lzX2pwZWcoZi0+Zm10LT5jb2xvcikpCisJCQljZmcgfD0gUzVQX0NJU1JDRk1UX0lUVTYwMV84QklUOwogCX0KIAogCWNmZyB8PSBTNVBfQ0lTUkNGTVRfSFNJWkUoZi0+b193aWR0aCkgfCBTNVBfQ0lTUkNGTVRfVlNJWkUoZi0+b19oZWlnaHQpOwpAQCAtNjQ5LDcgKzY0Miw3IEBACiAJLyogU2VsZWN0IElUVSBCIGludGVyZmFjZSwgZGlzYWJsZSBXcml0ZWJhY2sgcGF0aCBhbmQgdGVzdCBwYXR0ZXJuLiAqLwogCWNmZyAmPSB+KFM1UF9DSUdDVFJMX1RFU1RQQVRfTUFTSyB8IFM1UF9DSUdDVFJMX1NFTENBTV9JVFVfQSB8CiAJCVM1UF9DSUdDVFJMX1NFTENBTV9NSVBJIHwgUzVQX0NJR0NUUkxfQ0FNSUZfU0VMV0IgfAotCQlTNVBfQ0lHQ1RSTF9TRUxDQU1fTUlQSV9BKTsKKwkJUzVQX0NJR0NUUkxfU0VMQ0FNX01JUElfQSB8IFM1UF9DSUdDVFJMX0NBTV9KUEVHKTsKIAogCWlmIChjYW0tPmJ1c190eXBlID09IEZJTUNfTUlQSV9DU0kyKSB7CiAJCWNmZyB8PSBTNVBfQ0lHQ1RSTF9TRUxDQU1fTUlQSTsKQEAgLTY1OCwxMSArNjUxLDE4IEBACiAJCQljZmcgfD0gUzVQX0NJR0NUUkxfU0VMQ0FNX01JUElfQTsKIAogCQkvKiBUT0RPOiBhZGQgcmVtYWluaW5nIHN1cHBvcnRlZCBmb3JtYXRzLiAqLwotCQlpZiAodmlkX2NhcC0+Zm10LmNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDgpIHsKKwkJc3dpdGNoICh2aWRfY2FwLT5tZi5jb2RlKSB7CisJCWNhc2UgVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDg6CiAJCQl0bXAgPSBTNVBfQ1NJSU1HRk1UX1lDQkNSNDIyXzhCSVQ7Ci0JCX0gZWxzZSB7Ci0JCQllcnIoImNhbWVyYSBpbWFnZSBmb3JtYXQgbm90IHN1cHBvcnRlZDogJWQiLAotCQkJICAgIHZpZF9jYXAtPmZtdC5jb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTUJVU19GTVRfSlBFR18xWDg6CisJCQl0bXAgPSBTNVBfQ1NJSU1HRk1UX1VTRVIoMSk7CisJCQljZmcgfD0gUzVQX0NJR0NUUkxfQ0FNX0pQRUc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXY0bDJfZXJyKGZpbWMtPnZpZF9jYXAudmZkLAorCQkJCSAiTm90IHN1cHBvcnRlZCBjYW1lcmEgcGl4ZWwgZm9ybWF0OiAlZCIsCisJCQkJIHZpZF9jYXAtPm1mLmNvZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJdG1wIHw9IChjYW0tPmNzaV9kYXRhX2FsaWduID09IDMyKSA8PCA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9taXBpLWNzaXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvbWlwaS1jc2lzLmMKaW5kZXggZWYwNTZkNi4uNTlkNzliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9taXBpLWNzaXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL21pcGktY3Npcy5jCkBAIC04MSw2ICs4MSwxMiBAQAogfTsKICNkZWZpbmUgTlVNX0NTSVNfQ0xPQ0tTCUFSUkFZX1NJWkUoY3NpX2Nsb2NrX25hbWUpCiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3Npc19zdXBwbHlfbmFtZVtdID0geworCSJ2ZGQxMSIsIC8qIDEuMVYgb3IgMS4yViAoczVwYzEwMCkgTUlQSSBDU0kgc3VwcHBseSAqLworCSJ2ZGQxOCIsIC8qIFZERCAxLjhWIGFuZCBNSVBJIENTSSBQTEwgc3VwcGx5ICovCit9OworI2RlZmluZSBDU0lTX05VTV9TVVBQTElFUyBBUlJBWV9TSVpFKGNzaXNfc3VwcGx5X25hbWUpCisKIGVudW0gewogCVNUX1BPV0VSRUQJPSAxLAogCVNUX1NUUkVBTUlORwk9IDIsCkBAIC0xMDksOSArMTE1LDkgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXN0cnVjdCByZXNvdXJjZSAqcmVnc19yZXM7CiAJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0NTSVNfTlVNX1NVUFBMSUVTXTsKIAlzdHJ1Y3QgY2xrICpjbG9ja1tOVU1fQ1NJU19DTE9DS1NdOwogCWludCBpcnE7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5OwogCXUzMiBmbGFnczsKIAljb25zdCBzdHJ1Y3QgY3Npc19waXhfZm9ybWF0ICpjc2lzX2ZtdDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKQEAgLTQ2MCw2ICs0NjYsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVnc19yZXM7CiAJc3RydWN0IGNzaXNfc3RhdGUgKnN0YXRlOwogCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOwogCiAJc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXRlKQpAQCAtNTE5LDE0ICs1MjYsMTMgQEAKIAkJZ290byBlX2Nsa3B1dDsKIAl9CiAKLQlpZiAoIXBkYXRhLT5maXhlZF9waHlfdmRkKSB7Ci0JCXN0YXRlLT5zdXBwbHkgPSByZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ2ZGQiKTsKLQkJaWYgKElTX0VSUihzdGF0ZS0+c3VwcGx5KSkgewotCQkJcmV0ID0gUFRSX0VSUihzdGF0ZS0+c3VwcGx5KTsKLQkJCXN0YXRlLT5zdXBwbHkgPSBOVUxMOwotCQkJZ290byBlX2Nsa3B1dDsKLQkJfQotCX0KKwlmb3IgKGkgPSAwOyBpIDwgQ1NJU19OVU1fU1VQUExJRVM7IGkrKykKKwkJc3RhdGUtPnN1cHBsaWVzW2ldLnN1cHBseSA9IGNzaXNfc3VwcGx5X25hbWVbaV07CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJnBkZXYtPmRldiwgQ1NJU19OVU1fU1VQUExJRVMsCisJCQkJIHN0YXRlLT5zdXBwbGllcyk7CisJaWYgKHJldCkKKwkJZ290byBlX2Nsa3B1dDsKIAogCXJldCA9IHJlcXVlc3RfaXJxKHN0YXRlLT5pcnEsIHM1cGNzaXNfaXJxX2hhbmRsZXIsIDAsCiAJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBzdGF0ZSk7CkBAIC01NTMsNyArNTU5LDYgQEAKIAkvKiAuLiBhbmQgYSBwb2ludGVyIHRvIHRoZSBzdWJkZXYuICovCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnN0YXRlLT5zZCk7CiAKLQlzdGF0ZS0+ZmxhZ3MgPSBTVF9TVVNQRU5ERUQ7CiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTU2MSw4ICs1NjYsNyBAQAogZV9pcnFmcmVlOgogCWZyZWVfaXJxKHN0YXRlLT5pcnEsIHN0YXRlKTsKIGVfcmVncHV0OgotCWlmIChzdGF0ZS0+c3VwcGx5KQotCQlyZWd1bGF0b3JfcHV0KHN0YXRlLT5zdXBwbHkpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQ1NJU19OVU1fU1VQUExJRVMsIHN0YXRlLT5zdXBwbGllcyk7CiBlX2Nsa3B1dDoKIAljbGtfZGlzYWJsZShzdGF0ZS0+Y2xvY2tbQ1NJU19DTEtfTVVYXSk7CiAJczVwY3Npc19jbGtfcHV0KHN0YXRlKTsKQEAgLTU3NSw3ICs1NzksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgczVwY3Npc19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczVwY3Npc19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBydW50aW1lKQogewogCXN0cnVjdCBzNXBfcGxhdGZvcm1fbWlwaV9jc2lzICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CkBAIC01OTIsMjEgKzU5NiwyMSBAQAogCQlyZXQgPSBwZGF0YS0+cGh5X2VuYWJsZShzdGF0ZS0+cGRldiwgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJZ290byB1bmxvY2s7Ci0JCWlmIChzdGF0ZS0+c3VwcGx5KSB7Ci0JCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+c3VwcGx5KTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byB1bmxvY2s7Ci0JCX0KKwkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShDU0lTX05VTV9TVVBQTElFUywKKwkJCQkJICAgICBzdGF0ZS0+c3VwcGxpZXMpOworCQlpZiAocmV0KQorCQkJZ290byB1bmxvY2s7CiAJCWNsa19kaXNhYmxlKHN0YXRlLT5jbG9ja1tDU0lTX0NMS19HQVRFXSk7CiAJCXN0YXRlLT5mbGFncyAmPSB+U1RfUE9XRVJFRDsKKwkJaWYgKCFydW50aW1lKQorCQkJc3RhdGUtPmZsYWdzIHw9IFNUX1NVU1BFTkRFRDsKIAl9Ci0Jc3RhdGUtPmZsYWdzIHw9IFNUX1NVU1BFTkRFRDsKICB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bG9jayk7CiAJcmV0dXJuIHJldCA/IC1FQUdBSU4gOiAwOwogfQogCi1zdGF0aWMgaW50IHM1cGNzaXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczVwY3Npc19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHJ1bnRpbWUpCiB7CiAJc3RydWN0IHM1cF9wbGF0Zm9ybV9taXBpX2NzaXMgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKQEAgLTYxOCwyMCArNjIyLDIwIEBACiAJCSBfX2Z1bmNfXywgc3RhdGUtPmZsYWdzKTsKIAogCW11dGV4X2xvY2soJnN0YXRlLT5sb2NrKTsKLQlpZiAoIShzdGF0ZS0+ZmxhZ3MgJiBTVF9TVVNQRU5ERUQpKQorCWlmICghcnVudGltZSAmJiAhKHN0YXRlLT5mbGFncyAmIFNUX1NVU1BFTkRFRCkpCiAJCWdvdG8gdW5sb2NrOwogCiAJaWYgKCEoc3RhdGUtPmZsYWdzICYgU1RfUE9XRVJFRCkpIHsKLQkJaWYgKHN0YXRlLT5zdXBwbHkpCi0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0YXRlLT5zdXBwbHkpOworCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQ1NJU19OVU1fU1VQUExJRVMsCisJCQkJCSAgICBzdGF0ZS0+c3VwcGxpZXMpOwogCQlpZiAocmV0KQogCQkJZ290byB1bmxvY2s7Ci0KIAkJcmV0ID0gcGRhdGEtPnBoeV9lbmFibGUoc3RhdGUtPnBkZXYsIHRydWUpOwogCQlpZiAoIXJldCkgewogCQkJc3RhdGUtPmZsYWdzIHw9IFNUX1BPV0VSRUQ7Ci0JCX0gZWxzZSBpZiAoc3RhdGUtPnN1cHBseSkgewotCQkJcmVndWxhdG9yX2Rpc2FibGUoc3RhdGUtPnN1cHBseSk7CisJCX0gZWxzZSB7CisJCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKENTSVNfTlVNX1NVUFBMSUVTLAorCQkJCQkgICAgICAgc3RhdGUtPnN1cHBsaWVzKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJCWNsa19lbmFibGUoc3RhdGUtPmNsb2NrW0NTSVNfQ0xLX0dBVEVdKTsKQEAgLTY0NiwyNCArNjUwLDI2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgczVwY3Npc19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgczVwY3Npc19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gczVwY3Npc19zdXNwZW5kKGRldik7CisJcmV0dXJuIHM1cGNzaXNfcG1fc3VzcGVuZChkZXYsIGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBzNXBjc2lzX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHM1cGNzaXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpbnQgcmV0OworCXJldHVybiBzNXBjc2lzX3BtX3Jlc3VtZShkZXYsIGZhbHNlKTsKK30KKyNlbmRpZgogCi0JcmV0ID0gczVwY3Npc19yZXN1bWUoZGV2KTsKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBzNXBjc2lzX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHM1cGNzaXNfcG1fc3VzcGVuZChkZXYsIHRydWUpOworfQogCi0JaWYgKCFyZXQpIHsKLQkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7Ci0JCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOwotCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwotCX0KLQotCXJldHVybiByZXQ7CitzdGF0aWMgaW50IHM1cGNzaXNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzNXBjc2lzX3BtX3Jlc3VtZShkZXYsIHRydWUpOwogfQogI2VuZGlmCiAKQEAgLTY3OSw4ICs2ODUsNyBAQAogCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmcGRldi0+ZGV2KTsKIAogCXM1cGNzaXNfY2xrX3B1dChzdGF0ZSk7Ci0JaWYgKHN0YXRlLT5zdXBwbHkpCi0JCXJlZ3VsYXRvcl9wdXQoc3RhdGUtPnN1cHBseSk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShDU0lTX05VTV9TVVBQTElFUywgc3RhdGUtPnN1cHBsaWVzKTsKIAogCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzdGF0ZS0+c2QuZW50aXR5KTsKIAlmcmVlX2lycShzdGF0ZS0+aXJxLCBzdGF0ZSk7CkBAIC02OTIsOCArNjk3LDkgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHM1cGNzaXNfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BNX09QUyhzNXBjc2lzX3N1c3BlbmQsIHM1cGNzaXNfcmVzdW1lLCBOVUxMKQotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHM1cGNzaXNfcG1fc3VzcGVuZCwgczVwY3Npc19wbV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHM1cGNzaXNfcnVudGltZV9zdXNwZW5kLCBzNXBjc2lzX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzNXBjc2lzX3N1c3BlbmQsIHM1cGNzaXNfcmVzdW1lKQogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwY3Npc19kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL3JlZ3MtZmltYy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9yZWdzLWZpbWMuaAppbmRleCAwZmVhM2U2Li5jOGUzYjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL3JlZ3MtZmltYy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvcmVncy1maW1jLmgKQEAgLTU0LDEyICs1NCwxNCBAQAogI2RlZmluZSBTNVBfQ0lHQ1RSTF9JUlFfQ0xSCQkoMSA8PCAxOSkKICNkZWZpbmUgUzVQX0NJR0NUUkxfSVJRX0VOQUJMRQkJKDEgPDwgMTYpCiAjZGVmaW5lIFM1UF9DSUdDVFJMX1NIRFdfRElTQUJMRQkoMSA8PCAxMikKKyNkZWZpbmUgUzVQX0NJR0NUUkxfQ0FNX0pQRUcJCSgxIDw8IDgpCiAjZGVmaW5lIFM1UF9DSUdDVFJMX1NFTENBTV9NSVBJX0EJKDEgPDwgNykKICNkZWZpbmUgUzVQX0NJR0NUUkxfQ0FNSUZfU0VMV0IJCSgxIDw8IDYpCiAvKiAwIC0gSVRVNjAxOyAxIC0gSVRVNzA5ICovCiAjZGVmaW5lIFM1UF9DSUdDVFJMX0NTQ19JVFU2MDFfNzA5CSgxIDw8IDUpCiAjZGVmaW5lIFM1UF9DSUdDVFJMX0lOVlBPTEhTWU5DCQkoMSA8PCA0KQogI2RlZmluZSBTNVBfQ0lHQ1RSTF9TRUxDQU1fTUlQSQkJKDEgPDwgMykKKyNkZWZpbmUgUzVQX0NJR0NUUkxfSU5WUE9MRklFTEQJCSgxIDw8IDEpCiAjZGVmaW5lIFM1UF9DSUdDVFJMX0lOVEVSTEFDRQkJKDEgPDwgMCkKIAogLyogV2luZG93IG9mZnNldCAyICovCkBAIC0xODQsNyArMTg2LDYgQEAKIAogLyogSW1hZ2UgZWZmZWN0ICovCiAjZGVmaW5lIFM1UF9DSUlNR0VGRgkJCTB4ZDAKLSNkZWZpbmUgUzVQX0NJSU1HRUZGX0lFX0RJU0FCTEUJCSgwIDw8IDMwKQogI2RlZmluZSBTNVBfQ0lJTUdFRkZfSUVfRU5BQkxFCQkoMSA8PCAzMCkKICNkZWZpbmUgUzVQX0NJSU1HRUZGX0lFX1NDX0JFRk9SRQkoMCA8PCAyOSkKICNkZWZpbmUgUzVQX0NJSU1HRUZGX0lFX1NDX0FGVEVSCSgxIDw8IDI5KQpAQCAtMjg2LDEwICsyODcsOCBAQAogI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1JBVzgJCTB4MmEKICNkZWZpbmUgUzVQX0NTSUlNR0ZNVF9SQVcxMAkJMHgyYgogI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1JBVzEyCQkweDJjCi0jZGVmaW5lIFM1UF9DU0lJTUdGTVRfVVNFUjEJCTB4MzAKLSNkZWZpbmUgUzVQX0NTSUlNR0ZNVF9VU0VSMgkJMHgzMQotI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1VTRVIzCQkweDMyCi0jZGVmaW5lIFM1UF9DU0lJTUdGTVRfVVNFUjQJCTB4MzMKKy8qIFVzZXIgZGVmaW5lZCBmb3JtYXRzLiB4ID0gMC4uLjE2LiAqLworI2RlZmluZSBTNVBfQ1NJSU1HRk1UX1VTRVIoeCkJCSgweDMwICsgeCAtIDEpCiAKIC8qIE91dHB1dCBmcmFtZSBidWZmZXIgc2VxdWVuY2UgbWFzayAqLwogI2RlZmluZSBTNVBfQ0lGQ05UU0VRCQkJMHgxRkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mYy5jCmluZGV4IDdkYzdlYWIuLjhiZThiNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmMuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJICAgYXBwcm9wcmFpdGUgZmxhZ3MgKi8KIAlzcmNfYnVmID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHN0X2J1ZiwgJmN0eC0+ZHN0X3F1ZXVlLCBsaXN0KSB7Ci0JCWlmICh2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfYnVmLT5iLCAwKSA9PSBkZWNfeV9hZGRyKSB7CisJCWlmICh2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihkc3RfYnVmLT5iLCAwKSA9PSBkZWNfeV9hZGRyKSB7CiAJCQltZW1jcHkoJmRzdF9idWYtPmItPnY0bDJfYnVmLnRpbWVjb2RlLAogCQkJCSZzcmNfYnVmLT5iLT52NGwyX2J1Zi50aW1lY29kZSwKIAkJCQlzaXplb2Yoc3RydWN0IHY0bDJfdGltZWNvZGUpKTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCSAqIGNoZWNrIHdoaWNoIHZpZGVvYnVmIGRvZXMgaXQgY29ycmVzcG9uZCB0byAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHN0X2J1ZiwgJmN0eC0+ZHN0X3F1ZXVlLCBsaXN0KSB7CiAJCS8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIGJ1ZmZlciB3ZSdyZSBsb29raW5nIGZvciAqLwotCQlpZiAodmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X2J1Zi0+YiwgMCkgPT0gZHNwbF95X2FkZHIpIHsKKwkJaWYgKHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9idWYtPmIsIDApID09IGRzcGxfeV9hZGRyKSB7CiAJCQlsaXN0X2RlbCgmZHN0X2J1Zi0+bGlzdCk7CiAJCQljdHgtPmRzdF9xdWV1ZV9jbnQtLTsKIAkJCWRzdF9idWYtPmItPnY0bDJfYnVmLnNlcXVlbmNlID0gY3R4LT5zZXF1ZW5jZTsKQEAgLTk0MCw5ICs5NDAsOCBAQAogCXJldHVybiAhc3RyY21wKGRldl9uYW1lKGRldiksIChjaGFyICopZGF0YSk7CiB9CiAKLQogLyogTUZDIHByb2JlIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzNXBfbWZjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHM1cF9tZmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgczVwX21mY19kZXYgKmRldjsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CkBAIC0xMjM2LDcgKzEyMzUsNyBAQAogCQkJICAgTlVMTCkKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHM1cF9tZmNfcGRydiA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHM1cF9tZmNfZHJpdmVyID0gewogCS5wcm9iZQk9IHM1cF9tZmNfcHJvYmUsCiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHM1cF9tZmNfcmVtb3ZlKSwKIAkuZHJpdmVyCT0gewpAQCAtMTI1NCwxNSArMTI1MywxNSBAQAogCWludCByZXQ7CiAKIAlwcl9pbmZvKCIlcyIsIGJhbm5lcik7Ci0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzNXBfbWZjX3BkcnYpOworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmczVwX21mY19kcml2ZXIpOwogCWlmIChyZXQpCiAJCXByX2VycigiUGxhdGZvcm0gZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgczVwX21mY19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgczVwX21mY19leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnM1cF9tZmNfcGRydik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnM1cF9tZmNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoczVwX21mY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuYwppbmRleCA1ZjRkYTgwLi5mMjQ4MWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jCkBAIC0zOCw3ICszOCw3IEBACiAJICogaW50byBrZXJuZWwuICovCiAJbWZjX2RlYnVnX2VudGVyKCk7CiAJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqKSZmd19ibG9iLAotCQkJCSAgICAgInM1cGMxMTAtbWZjLmZ3IiwgZGV2LT52NGwyX2Rldi5kZXYpOworCQkJCSAgICAgInM1cC1tZmMuZnciLCBkZXYtPnY0bDJfZGV2LmRldik7CiAJaWYgKGVyciAhPSAwKSB7CiAJCW1mY19lcnIoIkZpcm13YXJlIGlzIG5vdCBwcmVzZW50IGluIHRoZSAvbGliL2Zpcm13YXJlIGRpcmVjdG9yeSBub3IgY29tcGlsZWQgaW4ga2VybmVsXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkgKiBpbnRvIGtlcm5lbC4gKi8KIAltZmNfZGVidWdfZW50ZXIoKTsKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKiopJmZ3X2Jsb2IsCi0JCQkJICAgICAiczVwYzExMC1tZmMuZnciLCBkZXYtPnY0bDJfZGV2LmRldik7CisJCQkJICAgICAiczVwLW1mYy5mdyIsIGRldi0+djRsMl9kZXYuZGV2KTsKIAlpZiAoZXJyICE9IDApIHsKIAkJbWZjX2VycigiRmlybXdhcmUgaXMgbm90IHByZXNlbnQgaW4gdGhlIC9saWIvZmlybXdhcmUgZGlyZWN0b3J5IG5vciBjb21waWxlZCBpbiBrZXJuZWxcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKaW5kZXggYjJjNTA1Mi4uODQ0YTRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCQkubWF4aW11bSA9IDMyLAogCQkuc3RlcCA9IDEsCiAJCS5kZWZhdWx0X3ZhbHVlID0gMSwKLQkJLmlzX3ZvbGF0aWxlID0gMSwKKwkJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUsCiAJfSwKIH07CiAKQEAgLTIyMCw4ICsyMjAsOCBAQAogCXN0cm5jcHkoY2FwLT5jYXJkLCBkZXYtPnBsYXRfZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwogCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVAotCQkJCQkJICAgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUgfAorCQkJVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQ0LDkgKzc0NCwxMCBAQAogCS52aWRpb2NfZ19jcm9wID0gdmlkaW9jX2dfY3JvcCwKIH07CiAKLXN0YXRpYyBpbnQgczVwX21mY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpidWZfY291bnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwgdW5zaWduZWQgbG9uZyBwc2l6ZVtdLAotCQkJICAgICAgIHZvaWQgKmFsbG9jYXRvcnNbXSkKK3N0YXRpYyBpbnQgczVwX21mY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LCB1bnNpZ25lZCBpbnQgKmJ1Zl9jb3VudCwKKwkJCXVuc2lnbmVkIGludCAqcGxhbmVfY291bnQsIHVuc2lnbmVkIGludCBwc2l6ZVtdLAorCQkJdm9pZCAqYWxsb2NhdG9yc1tdKQogewogCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CiAKQEAgLTgyNCw3ICs4MjUsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWZvciAoaSA9IDA7IGkgPD0gY3R4LT5zcmNfZm10LT5udW1fcGxhbmVzIDsgaSsrKSB7CiAJCQlpZiAoSVNfRVJSX09SX05VTEwoRVJSX1BUUigKLQkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIGkpKSkpIHsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIGkpKSkpIHsKIAkJCQltZmNfZXJyKCJQbGFuZSBtZW0gbm90IGFsbG9jYXRlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC04MzcsMTMgKzgzOCwxMyBAQAogCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OwogCQljdHgtPmRzdF9idWZzW2ldLmIgPSB2YjsKIAkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUucmF3Lmx1bWEgPQotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAwKTsKIAkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUucmF3LmNocm9tYSA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAxKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDEpOwogCQljdHgtPmRzdF9idWZzX2NudCsrOwogCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CiAJCWlmIChJU19FUlJfT1JfTlVMTChFUlJfUFRSKAotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCkpKSkgeworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCkpKSkgewogCQkJbWZjX2VycigiUGxhbmUgbWVtb3J5IG5vdCBhbGxvY2F0ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg1NSw3ICs4NTYsNyBAQAogCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OwogCQljdHgtPnNyY19idWZzW2ldLmIgPSB2YjsKIAkJY3R4LT5zcmNfYnVmc1tpXS5jb29raWUuc3RyZWFtID0KLQkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CiAJCWN0eC0+c3JjX2J1ZnNfY250Kys7CiAJfSBlbHNlIHsKIAkJbWZjX2VycigiczVwX21mY19idWZfaW5pdDogdW5rbm93biBxdWV1ZSB0eXBlXG4iKTsKQEAgLTg2NCw3ICs4NjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCitzdGF0aWMgaW50IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CiAJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKQEAgLTEwMjAsNyArMTAyMSw3IEBACiAJCQlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7CiAJCX0KIAkJaWYgKGNvbnRyb2xzW2ldLmlzX3ZvbGF0aWxlICYmIGN0eC0+Y3RybHNbaV0pCi0JCQljdHgtPmN0cmxzW2ldLT5pc192b2xhdGlsZSA9IDE7CisJCQljdHgtPmN0cmxzW2ldLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19lbmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jCmluZGV4IGZlZTA5NGEuLjFlOGNkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jCkBAIC01OTksOCArNTk5LDggQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+cmVmX3F1ZXVlKSkgewogCQltYl9lbnRyeSA9IGxpc3RfZW50cnkoKCZjdHgtPnJlZl9xdWV1ZSktPm5leHQsCiAJCQkJCQlzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwotCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7Ci0JCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAxKTsKKwkJbWJfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIobWJfZW50cnktPmIsIDApOworCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMSk7CiAJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CiAJCWN0eC0+cmVmX3F1ZXVlX2NudC0tOwogCQlsaXN0X2FkZF90YWlsKCZtYl9lbnRyeS0+bGlzdCwgJmN0eC0+c3JjX3F1ZXVlKTsKQEAgLTYyMiw3ICs2MjIsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwogCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKLQlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihkc3RfbWItPmIsIDApOwogCWRzdF9zaXplID0gdmIyX3BsYW5lX3NpemUoZHN0X21iLT5iLCAwKTsKIAlzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihjdHgsIGRzdF9hZGRyLCBkc3Rfc2l6ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CkBAIC02NjgsMTQgKzY2OCwxNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwogCXNyY19tYiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKLQlzcmNfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoc3JjX21iLT5iLCAwKTsKLQlzcmNfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoc3JjX21iLT5iLCAxKTsKKwlzcmNfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoc3JjX21iLT5iLCAwKTsKKwlzcmNfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoc3JjX21iLT5iLCAxKTsKIAlzNXBfbWZjX3NldF9lbmNfZnJhbWVfYnVmZmVyKGN0eCwgc3JjX3lfYWRkciwgc3JjX2NfYWRkcik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwotCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9tYi0+YiwgMCk7CiAJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOwogCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKQEAgLTcwMyw4ICs3MDMsOCBAQAogCWlmIChzbGljZV90eXBlID49IDApIHsKIAkJczVwX21mY19nZXRfZW5jX2ZyYW1lX2J1ZmZlcihjdHgsICZlbmNfeV9hZGRyLCAmZW5jX2NfYWRkcik7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobWJfZW50cnksICZjdHgtPnNyY19xdWV1ZSwgbGlzdCkgewotCQkJbWJfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIobWJfZW50cnktPmIsIDApOwotCQkJbWJfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIobWJfZW50cnktPmIsIDEpOworCQkJbWJfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIobWJfZW50cnktPmIsIDApOworCQkJbWJfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIobWJfZW50cnktPmIsIDEpOwogCQkJaWYgKChlbmNfeV9hZGRyID09IG1iX3lfYWRkcikgJiYKIAkJCQkJCShlbmNfY19hZGRyID09IG1iX2NfYWRkcikpIHsKIAkJCQlsaXN0X2RlbCgmbWJfZW50cnktPmxpc3QpOwpAQCAtNzE1LDggKzcxNSw4IEBACiAJCQl9CiAJCX0KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYl9lbnRyeSwgJmN0eC0+cmVmX3F1ZXVlLCBsaXN0KSB7Ci0JCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7Ci0JCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMSk7CisJCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihtYl9lbnRyeS0+YiwgMSk7CiAJCQlpZiAoKGVuY195X2FkZHIgPT0gbWJfeV9hZGRyKSAmJgogCQkJCQkJKGVuY19jX2FkZHIgPT0gbWJfY19hZGRyKSkgewogCQkJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CkBAIC03ODUsOCArNzg1LDggQEAKIAlzdHJuY3B5KGNhcC0+Y2FyZCwgZGV2LT5wbGF0X2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkgLSAxKTsKIAljYXAtPmJ1c19pbmZvWzBdID0gMDsKIAljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigxLCAwLCAwKTsKLQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKLQkJCSAgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FCisJCQkgIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORQogCQkJICB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MDEsMjAgKzE1MDEsMjEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBmbXQtPm51bV9wbGFuZXM7IGkrKykgewotCQlpZiAoIXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCBpKSkgeworCQlpZiAoIXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCBpKSkgewogCQkJbWZjX2VycigiZmFpbGVkIHRvIGdldCBwbGFuZSBjb29raWVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJbWZjX2RlYnVnKDIsICJpbmRleDogJWQsIHBsYW5lWyVkXSBjb29raWU6IDB4JTA4engiLAogCQkJCXZiLT52NGwyX2J1Zi5pbmRleCwgaSwKLQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgaSkpOworCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCBpKSk7CiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHM1cF9tZmNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgKmJ1Zl9jb3VudCwgdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHNpemVbXSwgdm9pZCAqYWxsb2NhdG9yc1tdKQorCQkJY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCQl1bnNpZ25lZCBpbnQgKmJ1Zl9jb3VudCwgdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwKKwkJCXVuc2lnbmVkIGludCBwc2l6ZVtdLCB2b2lkICphbGxvY2F0b3JzW10pCiB7CiAJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKIApAQCAtMTU4NCw3ICsxNTg1LDcgQEAKIAkJaSA9IHZiLT52NGwyX2J1Zi5pbmRleDsKIAkJY3R4LT5kc3RfYnVmc1tpXS5iID0gdmI7CiAJCWN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnN0cmVhbSA9Ci0JCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwogCQljdHgtPmRzdF9idWZzX2NudCsrOwogCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CiAJCXJldCA9IGNoZWNrX3ZiX3dpdGhfZm10KGN0eC0+c3JjX2ZtdCwgdmIpOwpAQCAtMTU5Myw5ICsxNTk0LDkgQEAKIAkJaSA9IHZiLT52NGwyX2J1Zi5pbmRleDsKIAkJY3R4LT5zcmNfYnVmc1tpXS5iID0gdmI7CiAJCWN0eC0+c3JjX2J1ZnNbaV0uY29va2llLnJhdy5sdW1hID0KLQkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcih2YiwgMCk7CiAJCWN0eC0+c3JjX2J1ZnNbaV0uY29va2llLnJhdy5jaHJvbWEgPQotCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMSk7CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHZiLCAxKTsKIAkJY3R4LT5zcmNfYnVmc19jbnQrKzsKIAl9IGVsc2UgewogCQltZmNfZXJyKCJpbmF2bGlkIHF1ZXVlIHR5cGU6ICVkXG4iLCB2cS0+dHlwZSk7CkBAIC0xNjQwLDcgKzE2NDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCitzdGF0aWMgaW50IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CiAJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKQEAgLTE4MTQsNyArMTgxNSw3IEBACiAJCQlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7CiAJCX0KIAkJaWYgKGNvbnRyb2xzW2ldLmlzX3ZvbGF0aWxlICYmIGN0eC0+Y3RybHNbaV0pCi0JCQljdHgtPmN0cmxzW2ldLT5pc192b2xhdGlsZSA9IDE7CisJCQljdHgtPmN0cmxzW2ldLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19WT0xBVElMRTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19vcHIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jCmluZGV4IDdiMjM5MTYuLmUwOGIyMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jCkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCXRlbXBfdmIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CiAJdGVtcF92Yi0+dXNlZCA9IDE7CiAJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LAotCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih0ZW1wX3ZiLT5iLCAwKSwgY3R4LT5jb25zdW1lZF9zdHJlYW0sCisJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHRlbXBfdmItPmIsIDApLCBjdHgtPmNvbnN1bWVkX3N0cmVhbSwKIAkJCQkJdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKIAlpbmRleCA9IHRlbXBfdmItPmItPnY0bDJfYnVmLmluZGV4OwpAQCAtMTE3MiwxMiArMTE3MiwxMiBAQAogCX0KIAlzcmNfbWIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CiAJc3JjX21iLT51c2VkID0gMTsKLQlzcmNfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoc3JjX21iLT5iLCAwKTsKLQlzcmNfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoc3JjX21iLT5iLCAxKTsKKwlzcmNfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoc3JjX21iLT5iLCAwKTsKKwlzcmNfY19hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoc3JjX21iLT5iLCAxKTsKIAlzNXBfbWZjX3NldF9lbmNfZnJhbWVfYnVmZmVyKGN0eCwgc3JjX3lfYWRkciwgc3JjX2NfYWRkcik7CiAJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOwogCWRzdF9tYi0+dXNlZCA9IDE7Ci0JZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfbWItPmIsIDApOworCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIoZHN0X21iLT5iLCAwKTsKIAlkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9zaXplKGRzdF9tYi0+YiwgMCk7CiAJczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoY3R4LCBkc3RfYWRkciwgZHN0X3NpemUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwpAQCAtMTIwMCw3ICsxMjAwLDcgQEAKIAlzNXBfbWZjX3NldF9kZWNfZGVzY19idWZmZXIoY3R4KTsKIAltZmNfZGVidWcoMiwgIkhlYWRlciBzaXplOiAlZFxuIiwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKIAlzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihjdHgsCi0JCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodGVtcF92Yi0+YiwgMCksCisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodGVtcF92Yi0+YiwgMCksCiAJCQkJMCwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKIAlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CkBAIC0xMjE5LDcgKzEyMTksNyBAQAogCXM1cF9tZmNfc2V0X2VuY19yZWZfYnVmZmVyKGN0eCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOwogCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKLQlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihkc3RfbWItPmIsIDApOwogCWRzdF9zaXplID0gdmIyX3BsYW5lX3NpemUoZHN0X21iLT5iLCAwKTsKIAlzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihjdHgsIGRzdF9hZGRyLCBkc3Rfc2l6ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogCXRlbXBfdmIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CiAJbWZjX2RlYnVnKDIsICJIZWFkZXIgc2l6ZTogJWRcbiIsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CiAJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LAotCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHRlbXBfdmItPmIsIDApLAorCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKHRlbXBfdmItPmIsIDApLAogCQkJCTAsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CiAJZGV2LT5jdXJyX2N0eCA9IGN0eC0+bnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWcKaW5kZXggOWMzN2RlZS4uZjJhMDk3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnCkBAIC04LDcgKzgsNyBAQAogCiBjb25maWcgVklERU9fU0FNU1VOR19TNVBfVFYKIAlib29sICJTYW1zdW5nIFRWIGRyaXZlciBmb3IgUzVQIHBsYXRmb3JtIChleHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gUExBVF9TNVAKKwlkZXBlbmRzIG9uIFBMQVRfUzVQICYmIFBNX1JVTlRJTUUKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pX2Rydi5jCmluZGV4IDA2ZDY2NjMuLjAyNzllNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYwpAQCAtMjEwLDIwICsyMTAsMTcgQEAKIAkvKiBlbmFibGUgSFBEIGludGVycnVwdHMgKi8KIAloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9JTlRDX0NPTiwgfjAsIEhETUlfSU5UQ19FTl9HTE9CQUwgfAogCQlIRE1JX0lOVENfRU5fSFBEX1BMVUcgfCBIRE1JX0lOVENfRU5fSFBEX1VOUExVRyk7Ci0JLyogY2hvb3NlIEhETUkgbW9kZSAqLworCS8qIGNob29zZSBEVkkgbW9kZSAqLwogCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX01PREVfU0VMLAotCQlIRE1JX01PREVfSERNSV9FTiwgSERNSV9NT0RFX01BU0spOworCQlIRE1JX01PREVfRFZJX0VOLCBIRE1JX01PREVfTUFTSyk7CisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfQ09OXzIsIH4wLAorCQlIRE1JX0RWSV9QRVJBTUJMRV9FTiB8IEhETUlfRFZJX0JBTkRfRU4pOwogCS8qIGRpc2FibGUgYmx1ZXNjcmVlbiAqLwogCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8wLCAwLCBIRE1JX0JMVUVfU0NSX0VOKTsKIAkvKiBjaG9vc2UgYmx1ZXNjcmVlbiAoZmVjYWwpIGNvbG9yICovCiAJaGRtaV93cml0ZWIoaGRldiwgSERNSV9CTFVFX1NDUkVFTl8wLCAweDEyKTsKIAloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0JMVUVfU0NSRUVOXzEsIDB4MzQpOwogCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQkxVRV9TQ1JFRU5fMiwgMHg1Nik7Ci0JLyogZW5hYmxlIEFWSSBwYWNrZXQgZXZlcnkgdnN5bmMsIGZpeGVzIHB1cnBsZSBsaW5lIHByb2JsZW0gKi8KLQloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0FWSV9DT04sIDB4MDIpOwotCS8qIGZvcmNlIFlVVjQ0NCwgbG9vayB0byBDRUEtODYxLUQsIHRhYmxlIDcgZm9yIG1vcmUgZGV0YWlsICovCi0JaGRtaV93cml0ZWIoaGRldiwgSERNSV9BVklfQllURSgwKSwgMiA8PCA1KTsKLQloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9DT05fMSwgMiwgMyA8PCA1KTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV90aW1pbmdfYXBwbHkoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LApAQCAtNDQzLDYgKzQ0MCw3IEBACiAJCS5oZWlnaHQgPSA0ODAsCiAJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCiAJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAl9LAogfTsKIApAQCAtNDc1LDYgKzQ3Myw3IEBACiAJCS5oZWlnaHQgPSA3MjAsCiAJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCiAJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKIAl9LAogfTsKIApAQCAtNTA3LDYgKzUwNiw3IEBACiAJCS5oZWlnaHQgPSAxMDgwLAogCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQsIC8qIG1lYW5zIFJHQjg4OCAqLwogCQkuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkUsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJfSwKIH07CiAKQEAgLTUzOSw2ICs1MzksNyBAQAogCQkuaGVpZ2h0ID0gMTA4MCwKIAkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KIAkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXIuaAppbmRleCBlMjI0MjI0Li41MWFkNTliMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oCkBAIC0xMTEsOCArMTExLDYgQEAKIGVudW0gbXhyX2xheWVyX3N0YXRlIHsKIAkvKiogbGF5ZXJzIGlzIG5vdCBzaG93biAqLwogCU1YUl9MQVlFUl9JRExFID0gMCwKLQkvKiogc3RhdGUgYmV0d2VlbiBTVFJFQU1PTiBhbmQgaGFyZHdhcmUgc3RhcnQgKi8KLQlNWFJfTEFZRVJfU1RSRUFNSU5HX1NUQVJULAogCS8qKiBsYXllciBpcyBzaG93biAqLwogCU1YUl9MQVlFUl9TVFJFQU1JTkcsCiAJLyoqIHN0YXRlIGJlZm9yZSBTVFJFQU1PRkYgaXMgZmluaXNoZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX2dycF9sYXllci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZ3JwX2xheWVyLmMKaW5kZXggNThmMGJhNC4uZGU4MjcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZ3JwX2xheWVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZ3JwX2xheWVyLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlkbWFfYWRkcl90IGFkZHIgPSAwOwogCiAJaWYgKGJ1ZikKLQkJYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiLCAwKTsKKwkJYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKCZidWYtPnZiLCAwKTsKIAlteHJfcmVnX2dyYXBoX2J1ZmZlcihsYXllci0+bWRldiwgbGF5ZXItPmlkeCwgYWRkcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3JlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfcmVnLmMKaW5kZXggMzhkYWM2Ny4uNDgwMGEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfcmVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfcmVnLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CiAKIAkvKiBzZXQgb3V0cHV0IGluIFJHQjg4OCBtb2RlICovCi0JbXhyX3dyaXRlKG1kZXYsIE1YUl9DRkcsIE1YUl9DRkdfT1VUX1lVVjQ0NCk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9DRkcsIE1YUl9DRkdfT1VUX1JHQjg4OCk7CiAKIAkvKiAxNiBiZWF0IGJ1cnN0IGluIERNQSAqLwogCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9TVEFUVVMsIE1YUl9TVEFUVVNfMTZfQlVSU1QsCkBAIC0zNzYsNiArMzc2LDEyIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOwogCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKIAorCS8qIHNlbGVjdGluZyBjb2xvcnNwYWNlIGFjY2VwdGVkIGJ5IG91dHB1dCAqLworCWlmIChmbXQtPmNvbG9yc3BhY2UgPT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcpCisJCXZhbCB8PSBNWFJfQ0ZHX09VVF9ZVVY0NDQ7CisJZWxzZQorCQl2YWwgfD0gTVhSX0NGR19PVVRfUkdCODg4OworCiAJLyogY2hvb3NpbmcgYmV0d2VlbiBpbnRlcmxhY2UgYW5kIHByb2dyZXNzaXZlIG1vZGUgKi8KIAlpZiAoZm10LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpCiAJCXZhbCB8PSBNWFJfQ0ZHX1NDQU5fSU5URVJMQUNFOwpAQCAtMzk0LDcgKzQwMCw4IEBACiAJZWxzZQogCQlXQVJOKDEsICJ1bnJlY29nbml6ZWQgbWJ1cyBoZWlnaHQgJXUhXG4iLCBmbXQtPmhlaWdodCk7CiAKLQlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfU0NBTl9NQVNLKTsKKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfU0NBTl9NQVNLIHwKKwkJTVhSX0NGR19PVVRfTUFTSyk7CiAKIAl2YWwgPSAoZm10LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpID8gfjAgOiAwOwogCXZwX3dyaXRlX21hc2sobWRldiwgVlBfTU9ERSwgdmFsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZpZGVvLmMKaW5kZXggNDNhYzIyZi4uZTE2ZDNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jCkBAIC03MjcsOCArNzI3LDggQEAKIAkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCiB9OwogCi1zdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAotCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAorc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10LAorCXVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsIHVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgaW50IHNpemVzW10sCiAJdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CkBAIC03NjQsMTkgKzc2NCwxMCBAQAogCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKIAlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG11c3Rfc3RhcnQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKLQlpZiAobGF5ZXItPnN0YXRlID09IE1YUl9MQVlFUl9TVFJFQU1JTkdfU1RBUlQpIHsKLQkJbGF5ZXItPnN0YXRlID0gTVhSX0xBWUVSX1NUUkVBTUlORzsKLQkJbXVzdF9zdGFydCA9IDE7Ci0JfQogCWxpc3RfYWRkX3RhaWwoJmJ1ZmZlci0+bGlzdCwgJmxheWVyLT5lbnFfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOwotCWlmIChtdXN0X3N0YXJ0KSB7Ci0JCWxheWVyLT5vcHMuc3RyZWFtX3NldChsYXllciwgTVhSX0VOQUJMRSk7Ci0JCW14cl9zdHJlYW1lcl9nZXQobWRldik7Ci0JfQogCiAJbXhyX2RiZyhtZGV2LCAicXVldWluZyBidWZmZXJcbiIpOwogfQpAQCAtNzk3LDEzICs3ODgsMTkgQEAKIAltdXRleF91bmxvY2soJmxheWVyLT5tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW14cl9kYmcobWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlteHJfZGJnKG1kZXYsICJubyBvdXRwdXQgYnVmZmVycyBxdWV1ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBibG9jayBhbnkgY2hhbmdlcyBpbiBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwogCW14cl9vdXRwdXRfZ2V0KG1kZXYpOwogCkBAIC04MTQsOSArODExLDEyIEBACiAJbGF5ZXItPm9wcy5mb3JtYXRfc2V0KGxheWVyKTsKIAkvKiBlbmFibGluZyBsYXllciBpbiBoYXJkd2FyZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7Ci0JbGF5ZXItPnN0YXRlID0gTVhSX0xBWUVSX1NUUkVBTUlOR19TVEFSVDsKKwlsYXllci0+c3RhdGUgPSBNWFJfTEFZRVJfU1RSRUFNSU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKIAorCWxheWVyLT5vcHMuc3RyZWFtX3NldChsYXllciwgTVhSX0VOQUJMRSk7CisJbXhyX3N0cmVhbWVyX2dldChtZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92cF9sYXllci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdnBfbGF5ZXIuYwppbmRleCA2OTUwZWQ4Li5mM2JiMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92cF9sYXllci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZwX2xheWVyLmMKQEAgLTk3LDkgKzk3LDkgQEAKIAkJbXhyX3JlZ192cF9idWZmZXIobGF5ZXItPm1kZXYsIGx1bWFfYWRkciwgY2hyb21hX2FkZHIpOwogCQlyZXR1cm47CiAJfQotCWx1bWFfYWRkclswXSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiLCAwKTsKKwlsdW1hX2FkZHJbMF0gPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcigmYnVmLT52YiwgMCk7CiAJaWYgKGxheWVyLT5mbXQtPm51bV9zdWJmcmFtZXMgPT0gMikgewotCQljaHJvbWFfYWRkclswXSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiLCAxKTsKKwkJY2hyb21hX2FkZHJbMF0gPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcigmYnVmLT52YiwgMSk7CiAJfSBlbHNlIHsKIAkJLyogRklYTUU6IG14cl9nZXRfcGxhbmVfc2l6ZSBjb21wdXRlIGludGVnZXIgZGl2aXNpb24sCiAJCSAqIHdoaWNoIGlzIHNsb3cgYW5kIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGluIGludGVycnVwdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1oZG1pLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaAppbmRleCBhYzkzYWQ2Li4zMzI0N2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaApAQCAtMTI3LDYgKzEyNywxMCBAQAogI2RlZmluZSBIRE1JX0JMVUVfU0NSX0VOCQkoMSA8PCA1KQogI2RlZmluZSBIRE1JX0VOCQkJCSgxIDw8IDApCiAKKy8qIEhETUlfQ09OXzIgKi8KKyNkZWZpbmUgSERNSV9EVklfUEVSQU1CTEVfRU4JCSgxIDw8IDUpCisjZGVmaW5lIEhETUlfRFZJX0JBTkRfRU4JCSgxIDw8IDEpCisKIC8qIEhETUlfUEhZX1NUQVRVUyAqLwogI2RlZmluZSBIRE1JX1BIWV9TVEFUVVNfUkVBRFkJCSgxIDw8IDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtbWl4ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtbWl4ZXIuaAppbmRleCAzYzg0NDI2Li4xNThhYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLW1peGVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1taXhlci5oCkBAIC02Nyw2ICs2Nyw3IEBACiAvKiBiaXRzIGZvciBNWFJfQ0ZHICovCiAjZGVmaW5lIE1YUl9DRkdfT1VUX1lVVjQ0NAkJKDAgPDwgOCkKICNkZWZpbmUgTVhSX0NGR19PVVRfUkdCODg4CQkoMSA8PCA4KQorI2RlZmluZSBNWFJfQ0ZHX09VVF9NQVNLCQkoMSA8PCA4KQogI2RlZmluZSBNWFJfQ0ZHX0RTVF9TRE8JCQkoMCA8PCA3KQogI2RlZmluZSBNWFJfQ0ZHX0RTVF9IRE1JCQkoMSA8PCA3KQogI2RlZmluZSBNWFJfQ0ZHX0RTVF9NQVNLCQkoMSA8PCA3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvc2RvX2Rydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvc2RvX2Rydi5jCmluZGV4IDRkZGRkNmIuLjhjZWM2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9zZG9fZHJ2LmMKQEAgLTE3MCw2ICsxNzAsNyBAQAogCWZtdC0+aGVpZ2h0ID0gc2Rldi0+Zm10LT5oZWlnaHQ7CiAJZm10LT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRDsKIAlmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCWZtdC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCmluZGV4IGYyYWU0MDUuLjVjZmRiYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCkBAIC03OTMsNyArNzkzLDYgQEAKIAkJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMEZfQ0hST01BX0dBSU5fQ05UTCwgc3RhdGUtPmdhaW4tPnZhbCk7CiAJCWVsc2UKIAkJCXNhYTcxMXhfd3JpdGUoc2QsIFJfMEZfQ0hST01BX0dBSU5fQ05UTCwgc3RhdGUtPmdhaW4tPnZhbCB8IDB4ODApOwotCQl2NGwyX2N0cmxfYWN0aXZhdGUoc3RhdGUtPmdhaW4sICFzdGF0ZS0+YWdjLT52YWwpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xMzQ1LDM1ICsxMzQ0LDU3IEBACiBzdGF0aWMgaW50IHNhYTcxMXhfcXVlcnlzdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCkKIHsKIAlzdHJ1Y3Qgc2FhNzExeF9zdGF0ZSAqc3RhdGUgPSB0b19zdGF0ZShzZCk7Ci0JaW50IHJlZzFlOworCWludCByZWcxZiwgcmVnMWU7CiAKLQkqc3RkID0gVjRMMl9TVERfQUxMOwotCWlmIChzdGF0ZS0+aWRlbnQgIT0gVjRMMl9JREVOVF9TQUE3MTE1KSB7Ci0JCWludCByZWcxZiA9IHNhYTcxMXhfcmVhZChzZCwgUl8xRl9TVEFUVVNfQllURV8yX1ZEX0RFQyk7CisJLyoKKwkgKiBUaGUgVjRMMiBjb3JlIGFscmVhZHkgaW5pdGlhbGl6ZXMgc3RkIHdpdGggYWxsIHN1cHBvcnRlZAorCSAqIFN0YW5kYXJkcy4gQWxsIGRyaXZlciBuZWVkcyB0byBkbyBpcyB0byBtYXNrIGl0LCB0byByZW1vdmUKKwkgKiBzdGFuZGFyZHMgdGhhdCBkb24ndCBhcHBseSBmcm9tIHRoZSBtYXNrCisJICovCiAKLQkJaWYgKHJlZzFmICYgMHgyMCkKLQkJCSpzdGQgPSBWNEwyX1NURF81MjVfNjA7Ci0JCWVsc2UKLQkJCSpzdGQgPSBWNEwyX1NURF82MjVfNTA7CisJcmVnMWYgPSBzYWE3MTF4X3JlYWQoc2QsIFJfMUZfU1RBVFVTX0JZVEVfMl9WRF9ERUMpOworCXY0bDJfZGJnKDEsIGRlYnVnLCBzZCwgIlN0YXR1cyBieXRlIDIgKDB4MWYpPTB4JTAyeFxuIiwgcmVnMWYpOwogCi0JCXJldHVybiAwOwotCX0KKwkvKiBob3Jpem9udGFsL3ZlcnRpY2FsIG5vdCBsb2NrZWQgKi8KKwlpZiAocmVnMWYgJiAweDQwKQorCQlnb3RvIHJldDsKKworCWlmIChyZWcxZiAmIDB4MjApCisJCSpzdGQgJj0gVjRMMl9TVERfNTI1XzYwOworCWVsc2UKKwkJKnN0ZCAmPSBWNEwyX1NURF82MjVfNTA7CisKKwlpZiAoc3RhdGUtPmlkZW50ICE9IFY0TDJfSURFTlRfU0FBNzExNSkKKwkJZ290byByZXQ7CiAKIAlyZWcxZSA9IHNhYTcxMXhfcmVhZChzZCwgUl8xRV9TVEFUVVNfQllURV8xX1ZEX0RFQyk7CiAKIAlzd2l0Y2ggKHJlZzFlICYgMHgwMykgewogCWNhc2UgMToKLQkJKnN0ZCA9IFY0TDJfU1REX05UU0M7CisJCSpzdGQgJj0gVjRMMl9TVERfTlRTQzsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQkqc3RkID0gVjRMMl9TVERfUEFMOworCQkvKgorCQkgKiBWNEwyX1NURF9QQUwganVzdCBjb3ZlciB0aGUgZXVyb3BlYW4gUEFMIHN0YW5kYXJkcy4KKwkJICogVGhpcyBpcyB3cm9uZywgYXMgdGhlIGRldmljZSBjb3VsZCBhbHNvIGJlIHVzaW5nIGFuCisJCSAqIG90aGVyIFBBTCBzdGFuZGFyZC4KKwkJICovCisJCSpzdGQgJj0gVjRMMl9TVERfUEFMICAgfCBWNEwyX1NURF9QQUxfTiAgfCBWNEwyX1NURF9QQUxfTmMgfAorCQkJVjRMMl9TVERfUEFMX00gfCBWNEwyX1NURF9QQUxfNjA7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJKnN0ZCA9IFY0TDJfU1REX1NFQ0FNOworCQkqc3RkICY9IFY0TDJfU1REX1NFQ0FNOwogCQlicmVhazsKIAlkZWZhdWx0OgorCQkvKiBDYW4ndCBkZXRlY3QgYW55dGhpbmcgKi8KIAkJYnJlYWs7CiAJfQorCisJdjRsMl9kYmcoMSwgZGVidWcsIHNkLCAiU3RhdHVzIGJ5dGUgMSAoMHgxZSk9MHglMDJ4XG4iLCByZWcxZSk7CisKK3JldDoKKwl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZXRlY3RlZCBzdGQgbWFzayA9ICUwOEx4XG4iLCAqc3RkKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjAxLDcgKzE2MjIsNiBAQAogCQkJVjRMMl9DSURfQ0hST01BX0FHQywgMCwgMSwgMSwgMSk7CiAJc3RhdGUtPmdhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZzYWE3MTF4X2N0cmxfb3BzLAogCQkJVjRMMl9DSURfQ0hST01BX0dBSU4sIDAsIDEyNywgMSwgNDApOwotCXN0YXRlLT5nYWluLT5pc192b2xhdGlsZSA9IDE7CiAJc2QtPmN0cmxfaGFuZGxlciA9IGhkbDsKIAlpZiAoaGRsLT5lcnJvcikgewogCQlpbnQgZXJyID0gaGRsLT5lcnJvcjsKQEAgLTE2MTAsOCArMTYzMCw3IEBACiAJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jc3RhdGUtPmFnYy0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOwotCXY0bDJfY3RybF9jbHVzdGVyKDIsICZzdGF0ZS0+YWdjKTsKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZzdGF0ZS0+YWdjLCAwLCB0cnVlKTsKIAogCXN0YXRlLT5pbnB1dCA9IC0xOwogCXN0YXRlLT5vdXRwdXQgPSBTQUE3MTE1X0lQT1JUX09OOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L01ha2VmaWxlCmluZGV4IDhhNWZmNGQuLmE2NDZjY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDcgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX1NBQTcxMzRfRFZCKSArPSBzYWE3MTM0LWR2Yi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCBiYzhkNmJiLi45YjU1MDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTg0MywxMCArODQzLDEwIEBACiBpbnQgc2FhNzEzNF9pcl9zdGFydChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiB2b2lkIHNhYTcxMzRfaXJfc3RvcChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiAjZWxzZQotI2RlZmluZSBzYWE3MTM0X2lucHV0X2luaXQxKGRldikJKDApCi0jZGVmaW5lIHNhYTcxMzRfaW5wdXRfZmluaShkZXYpCQkoMCkKLSNkZWZpbmUgc2FhNzEzNF9pbnB1dF9pcnEoZGV2KQkJKDApCi0jZGVmaW5lIHNhYTcxMzRfcHJvYmVfaTJjX2lyKGRldikJKDApCi0jZGVmaW5lIHNhYTcxMzRfaXJfc3RhcnQoZGV2KQkJKDApCi0jZGVmaW5lIHNhYTcxMzRfaXJfc3RvcChkZXYpCQkoMCkKKyNkZWZpbmUgc2FhNzEzNF9pbnB1dF9pbml0MShkZXYpCSgodm9pZCkwKQorI2RlZmluZSBzYWE3MTM0X2lucHV0X2ZpbmkoZGV2KQkJKCh2b2lkKTApCisjZGVmaW5lIHNhYTcxMzRfaW5wdXRfaXJxKGRldikJCSgodm9pZCkwKQorI2RlZmluZSBzYWE3MTM0X3Byb2JlX2kyY19pcihkZXYpCSgodm9pZCkwKQorI2RlZmluZSBzYWE3MTM0X2lyX3N0YXJ0KGRldikJCSgodm9pZCkwKQorI2RlZmluZSBzYWE3MTM0X2lyX3N0b3AoZGV2KQkJKCh2b2lkKTApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9NYWtlZmlsZQppbmRleCA2MzAzYThlLi5lY2Q1ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L01ha2VmaWxlCkBAIC00LDkgKzQsOSBAQAogCiBvYmotJChDT05GSUdfVklERU9fU0FBNzE2NCkgKz0gc2FhNzE2NC5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCiAKLUVYVFJBX0NGTEFHUyArPSAkKGV4dHJhLWNmbGFncy15KSAkKGV4dHJhLWNmbGFncy1tKQorY2NmbGFncy15ICs9ICQoZXh0cmEtY2ZsYWdzLXkpICQoZXh0cmEtY2ZsYWdzLW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY2FyZHMuYwppbmRleCA2OTgyMmE0Li45NzE1OTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNhcmRzLmMKQEAgLTIwMyw2ICsyMDMsNjYgQEAKIAkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAogCQl9IH0sCiAJfSwKKwlbU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF80XSA9IHsKKwkJLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5UVi1IVlIyMjAwIiwKKwkJLnBvcnRhCQk9IFNBQTcxNjRfTVBFR19EVkIsCisJCS5wb3J0YgkJPSBTQUE3MTY0X01QRUdfRFZCLAorCQkucG9ydGMJCT0gU0FBNzE2NF9NUEVHX0VOQ09ERVIsCisJCS5wb3J0ZAkJPSBTQUE3MTY0X01QRUdfRU5DT0RFUiwKKwkJLnBvcnRlCQk9IFNBQTcxNjRfTVBFR19WQkksCisJCS5wb3J0ZgkJPSBTQUE3MTY0X01QRUdfVkJJLAorCQkuY2hpcHJldgk9IFNBQTcxNjRfQ0hJUF9SRVYzLAorCQkudW5pdAkJPSB7eworCQkJLmlkCQk9IDB4MWQsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfRUVQUk9NLAorCQkJLm5hbWUJCT0gIjRLIEVFUFJPTSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18wLAorCQkJLmkyY19idXNfYWRkcgk9IDB4YTAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgwNCwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9UVU5FUiwKKwkJCS5uYW1lCQk9ICJUREExODI3MS0xIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzEsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhjMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDA1LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0FOQUxPR19ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREE4MjkwLTEiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMSwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDg0ID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MWIsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfVFVORVIsCisJCQkubmFtZQkJPSAiVERBMTgyNzEtMiIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18yLAorCQkJLmkyY19idXNfYWRkcgk9IDB4YzAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgxYywKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9BTkFMT0dfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBODI5MC0yIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzIsCisJCQkuaTJjX2J1c19hZGRyCT0gMHg4NCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDFlLAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0RJR0lUQUxfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBMTAwNDgtMSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18xLAorCQkJLmkyY19idXNfYWRkcgk9IDB4MTAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgxZiwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9ESUdJVEFMX0RFTU9EVUxBVE9SLAorCQkJLm5hbWUJCT0gIlREQTEwMDQ4LTIiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMiwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDEyID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSB9LAorCX0sCiAJW1NBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBdID0gewogCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWLUhWUjIyNTAiLAogCQkucG9ydGEJCT0gU0FBNzE2NF9NUEVHX0RWQiwKQEAgLTM4Nyw2ICs0NDcsNjIgQEAKIAkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAogCQl9IH0sCiAJfSwKKwlbU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF81XSA9IHsKKwkJLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5UVi1IVlIyMjAwIiwKKwkJLnBvcnRhCQk9IFNBQTcxNjRfTVBFR19EVkIsCisJCS5wb3J0YgkJPSBTQUE3MTY0X01QRUdfRFZCLAorCQkuY2hpcHJldgk9IFNBQTcxNjRfQ0hJUF9SRVYzLAorCQkudW5pdAkJPSB7eworCQkJLmlkCQk9IDB4MjMsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfRUVQUk9NLAorCQkJLm5hbWUJCT0gIjRLIEVFUFJPTSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18wLAorCQkJLmkyY19idXNfYWRkcgk9IDB4YTAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgwNCwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9UVU5FUiwKKwkJCS5uYW1lCQk9ICJUREExODI3MS0xIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzEsCisJCQkuaTJjX2J1c19hZGRyCT0gMHhjMCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDA1LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0FOQUxPR19ERU1PRFVMQVRPUiwKKwkJCS5uYW1lCQk9ICJUREE4MjkwLTEiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMSwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDg0ID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSwgeworCQkJLmlkCQk9IDB4MjEsCisJCQkudHlwZQkJPSBTQUE3MTY0X1VOSVRfVFVORVIsCisJCQkubmFtZQkJPSAiVERBMTgyNzEtMiIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18yLAorCQkJLmkyY19idXNfYWRkcgk9IDB4YzAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgyMiwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9BTkFMT0dfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBODI5MC0yIiwKKwkJCS5pMmNfYnVzX25yCT0gU0FBNzE2NF9JMkNfQlVTXzIsCisJCQkuaTJjX2J1c19hZGRyCT0gMHg4NCA+PiAxLAorCQkJLmkyY19yZWdfbGVuCT0gUkVHTEVOXzhiaXQsCisJCX0sIHsKKwkJCS5pZAkJPSAweDI0LAorCQkJLnR5cGUJCT0gU0FBNzE2NF9VTklUX0RJR0lUQUxfREVNT0RVTEFUT1IsCisJCQkubmFtZQkJPSAiVERBMTAwNDgtMSIsCisJCQkuaTJjX2J1c19ucgk9IFNBQTcxNjRfSTJDX0JVU18xLAorCQkJLmkyY19idXNfYWRkcgk9IDB4MTAgPj4gMSwKKwkJCS5pMmNfcmVnX2xlbgk9IFJFR0xFTl84Yml0LAorCQl9LCB7CisJCQkuaWQJCT0gMHgyNSwKKwkJCS50eXBlCQk9IFNBQTcxNjRfVU5JVF9ESUdJVEFMX0RFTU9EVUxBVE9SLAorCQkJLm5hbWUJCT0gIlREQTEwMDQ4LTIiLAorCQkJLmkyY19idXNfbnIJPSBTQUE3MTY0X0kyQ19CVVNfMiwKKwkJCS5pMmNfYnVzX2FkZHIJPSAweDEyID4+IDEsCisJCQkuaTJjX3JlZ19sZW4JPSBSRUdMRU5fOGJpdCwKKwkJfSB9LAorCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IHNhYTcxNjRfYmNvdW50ID0gQVJSQVlfU0laRShzYWE3MTY0X2JvYXJkcyk7CiAKQEAgLTQyNiw2ICs1NDIsMTQgQEAKIAkJLnN1YnZlbmRvciA9IDB4MDA3MCwKIAkJLnN1YmRldmljZSA9IDB4ODg1MSwKIAkJLmNhcmQgICAgICA9IFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMiwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDg5NDAsCisJCS5jYXJkICAgICAgPSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzQsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHg4OTUzLAorCQkuY2FyZCAgICAgID0gU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF81LAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IHNhYTcxNjRfaWRjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzE2NF9zdWJpZHMpOwpAQCAtNDY5LDYgKzU5Myw4IEBACiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF8yOgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF8zOgorCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF80OgorCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMF81OgogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjI1MDoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMjoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMzoKQEAgLTU0OSw2ICs2NzUsOCBAQAogCWNhc2UgU0FBNzE2NF9CT0FSRF9IQVVQUEFVR0VfSFZSMjIwMDoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfMjoKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfMzoKKwljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNDoKKwljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNToKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTA6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjUwXzI6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjUwXzM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCmluZGV4IGY2NWVhYjYuLjVjNWNjM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWR2Yi5jCkBAIC00NzUsNiArNDc1LDggQEAKIAljYXNlIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDA6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzI6CiAJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzM6CisJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzQ6CisJY2FzZSBTQUE3MTY0X0JPQVJEX0hBVVBQQVVHRV9IVlIyMjAwXzU6CiAJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzW3BvcnQtPm5yICsgMV07CiAJCXN3aXRjaCAocG9ydC0+bnIpIHsKIAkJY2FzZSAwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmgKaW5kZXggNjY3OGJmMS4uNzQyYjM0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oCkBAIC04Miw2ICs4Miw4IEBACiAjZGVmaW5lIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfMwk2CiAjZGVmaW5lIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMgk3CiAjZGVmaW5lIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyNTBfMwk4CisjZGVmaW5lIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNAk5CisjZGVmaW5lIFNBQTcxNjRfQk9BUkRfSEFVUFBBVUdFX0hWUjIyMDBfNQkxMAogCiAjZGVmaW5lIFNBQTcxNjRfTUFYX1VOSVRTCQk4CiAjZGVmaW5lIFNBQTcxNjRfVFNfTlVNQkVSX09GX0xJTkVTCTMxMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCmluZGV4IGU1NDA4OTguLmYzOTA2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKQEAgLTkwLDcgKzkwLDYgQEAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciB7CiAJc3RydWN0IHZiMl9idWZmZXIgdmI7IC8qIHY0bCBidWZmZXIgbXVzdCBiZSBmaXJzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7Ci0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CiB9OwogCiBzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgewpAQCAtMTAwLDcgKzk5LDggQEAKIAogCXVuc2lnbmVkIGludCBpcnE7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwotCXVuc2lnbmVkIGxvbmcgdmlkZW9fbGltaXQ7CisJc2l6ZV90IHZpZGVvX2xpbWl0OworCXNpemVfdCBidWZfdG90YWw7CiAKIAlzcGlubG9ja190IGxvY2s7CQkvKiBQcm90ZWN0cyB2aWRlbyBidWZmZXIgbGlzdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNhcHR1cmU7CkBAIC0xMjEsNyArMTIxLDcgQEAKIH07CiAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSB7Ci0JLyogQ0VVIG9mZnNldHMgd2l0aGluIHNjYWxlZCBieSB0aGUgQ0VVIGNhbWVyYSBvdXRwdXQgKi8KKwkvKiBDRVUgb2Zmc2V0cyB3aXRoaW4gdGhlIGNhbWVyYSBvdXRwdXQsIGJlZm9yZSB0aGUgQ0VVIHNjYWxlciAqLwogCXVuc2lnbmVkIGludCBjZXVfbGVmdDsKIAl1bnNpZ25lZCBpbnQgY2V1X3RvcDsKIAkvKiBDbGllbnQgb3V0cHV0LCBhcyBzZWVuIGJ5IHRoZSBDRVUgKi8KQEAgLTE0NCwzMCArMTQ0LDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9idWZmZXIsIHZiKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFrZV9idXNfcGFyYW0oc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZmxhZ3MgPSBTT0NBTV9NQVNURVIgfAotCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAotCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgfAotCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOwotCi0JaWYgKHBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBTSF9DRVVfRkxBR19VU0VfOEJJVF9CVVMpCi0JCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF84OwotCi0JaWYgKHBjZGV2LT5wZGF0YS0+ZmxhZ3MgJiBTSF9DRVVfRkxBR19VU0VfMTZCSVRfQlVTKQotCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTY7Ci0KLQlpZiAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykKLQkJcmV0dXJuIGZsYWdzOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGNldV93cml0ZShzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnByaXYsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmVnX29mZnMsIHUzMiBkYXRhKQogewpAQCAtMjE2LDM0ICsxOTIsNjIgQEAKIC8qCiAgKiAgVmlkZW9idWYgb3BlcmF0aW9ucwogICovCisKKy8qCisgKiAucXVldWVfc2V0dXAoKSBpcyBjYWxsZWQgdG8gY2hlY2ssIHdoZXRoZXIgdGhlIGRyaXZlciBjYW4gYWNjZXB0IHRoZQorICoJCSAgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIGFuZCB0byBmaWxsIGluIHBsYW5lIHNpemVzCisgKgkJICBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgZm9ybWF0IGlmIHJlcXVpcmVkCisgKi8KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV92aWRlb2J1Zl9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAogCQkJdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAotCQkJdW5zaWduZWQgbG9uZyBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCisJCQl1bnNpZ25lZCBpbnQgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAotCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCWludCBieXRlc19wZXJfbGluZTsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OwogCisJaWYgKGZtdCkgeworCQljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLAorCQkJCQkJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCQlpZiAoIXhsYXRlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoZm10LT5mbXQucGl4LndpZHRoLAorCQkJCQkJCSB4bGF0ZS0+aG9zdF9mbXQpOworCQloZWlnaHQgPSBmbXQtPmZtdC5waXguaGVpZ2h0OworCX0gZWxzZSB7CisJCS8qIENhbGxlZCBmcm9tIFZJRElPQ19SRVFCVUZTIG9yIGluIGNvbXBhdGliaWxpdHkgbW9kZSAqLworCQlieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKwkJaGVpZ2h0ID0gaWNkLT51c2VyX2hlaWdodDsKKwl9CiAJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKIAkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOwogCi0JKm51bV9wbGFuZXMgPSAxOworCXNpemVzWzBdID0gYnl0ZXNfcGVyX2xpbmUgKiBoZWlnaHQ7CiAKLQlwY2Rldi0+c2VxdWVuY2UgPSAwOwotCXNpemVzWzBdID0gYnl0ZXNfcGVyX2xpbmUgKiBpY2QtPnVzZXJfaGVpZ2h0OwogCWFsbG9jX2N0eHNbMF0gPSBwY2Rldi0+YWxsb2NfY3R4OwogCisJaWYgKCF2cS0+bnVtX2J1ZmZlcnMpCisJCXBjZGV2LT5zZXF1ZW5jZSA9IDA7CisKIAlpZiAoISpjb3VudCkKIAkJKmNvdW50ID0gMjsKIAotCWlmIChwY2Rldi0+dmlkZW9fbGltaXQpIHsKLQkJaWYgKFBBR0VfQUxJR04oc2l6ZXNbMF0pICogKmNvdW50ID4gcGNkZXYtPnZpZGVvX2xpbWl0KQotCQkJKmNvdW50ID0gcGNkZXYtPnZpZGVvX2xpbWl0IC8gUEFHRV9BTElHTihzaXplc1swXSk7CisJLyogSWYgKm51bV9wbGFuZXMgIT0gMCwgd2UgaGF2ZSBhbHJlYWR5IHZlcmlmaWVkICpjb3VudC4gKi8KKwlpZiAocGNkZXYtPnZpZGVvX2xpbWl0ICYmICEqbnVtX3BsYW5lcykgeworCQlzaXplX3Qgc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZXNbMF0pICogKmNvdW50OworCisJCWlmIChzaXplICsgcGNkZXYtPmJ1Zl90b3RhbCA+IHBjZGV2LT52aWRlb19saW1pdCkKKwkJCSpjb3VudCA9IChwY2Rldi0+dmlkZW9fbGltaXQgLSBwY2Rldi0+YnVmX3RvdGFsKSAvCisJCQkJUEFHRV9BTElHTihzaXplc1swXSk7CiAJfQogCi0JZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVsdVxuIiwgKmNvdW50LCBzaXplc1swXSk7CisJKm51bV9wbGFuZXMgPSAxOworCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSV1XG4iLCAqY291bnQsIHNpemVzWzBdKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY3LDYgKzI3MSw3IEBACiAJdW5zaWduZWQgbG9uZyB0b3AxLCB0b3AyOwogCXVuc2lnbmVkIGxvbmcgYm90dG9tMSwgYm90dG9tMjsKIAl1MzIgc3RhdHVzOworCWJvb2wgcGxhbmFyOwogCWludCByZXQgPSAwOwogCiAJLyoKQEAgLTMxMiwxOSArMzE3LDMxIEBACiAJCWJvdHRvbTIJPSBDREJDUjsKIAl9CiAKLQlwaHlzX2FkZHJfdG9wID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIocGNkZXYtPmFjdGl2ZSwgMCk7Ci0KLQljZXVfd3JpdGUocGNkZXYsIHRvcDEsIHBoeXNfYWRkcl90b3ApOwotCWlmIChWNEwyX0ZJRUxEX05PTkUgIT0gcGNkZXYtPmZpZWxkKSB7Ci0JCXBoeXNfYWRkcl9ib3R0b20gPSBwaHlzX2FkZHJfdG9wICsgaWNkLT51c2VyX3dpZHRoOwotCQljZXVfd3JpdGUocGNkZXYsIGJvdHRvbTEsIHBoeXNfYWRkcl9ib3R0b20pOwotCX0KKwlwaHlzX2FkZHJfdG9wID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIocGNkZXYtPmFjdGl2ZSwgMCk7CiAKIAlzd2l0Y2ggKGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2MpIHsKIAljYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgogCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKIAljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgorCQlwbGFuYXIgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwbGFuYXIgPSBmYWxzZTsKKwl9CisKKwljZXVfd3JpdGUocGNkZXYsIHRvcDEsIHBoeXNfYWRkcl90b3ApOworCWlmIChWNEwyX0ZJRUxEX05PTkUgIT0gcGNkZXYtPmZpZWxkKSB7CisJCWlmIChwbGFuYXIpCisJCQlwaHlzX2FkZHJfYm90dG9tID0gcGh5c19hZGRyX3RvcCArIGljZC0+dXNlcl93aWR0aDsKKwkJZWxzZQorCQkJcGh5c19hZGRyX2JvdHRvbSA9IHBoeXNfYWRkcl90b3AgKworCQkJCXNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CisJCWNldV93cml0ZShwY2RldiwgYm90dG9tMSwgcGh5c19hZGRyX2JvdHRvbSk7CisJfQorCisJaWYgKHBsYW5hcikgewogCQlwaHlzX2FkZHJfdG9wICs9IGljZC0+dXNlcl93aWR0aCAqCiAJCQlpY2QtPnVzZXJfaGVpZ2h0OwogCQljZXVfd3JpdGUocGNkZXYsIHRvcDIsIHBoeXNfYWRkcl90b3ApOwpAQCAtMzQxLDQ0ICszNTgsMTEgQEAKIAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3ZpZGVvYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZiLT52YjJfcXVldWUsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOwotCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciAqYnVmOwotCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKLQkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0KLQlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQotCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7Ci0KLQlidWYgPSB0b19jZXVfdmIodmIpOwotCi0JZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCi0JCXZiLCB2YjJfcGxhbmVfdmFkZHIodmIsIDApLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9idWZmZXIgKmJ1ZiA9IHRvX2NldV92Yih2Yik7CiAKIAkvKiBBZGRlZCBsaXN0IGhlYWQgaW5pdGlhbGl6YXRpb24gb24gYWxsb2MgKi8KIAlXQVJOKCFsaXN0X2VtcHR5KCZidWYtPnF1ZXVlKSwgIkJ1ZmZlciAlcCBvbiBxdWV1ZSFcbiIsIHZiKTsKIAotI2lmZGVmIERFQlVHCi0JLyoKLQkgKiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc2VlIGlmIHdlIGFjdHVhbGx5IGZpbGwKLQkgKiB0aGUgYnVmZmVyIHdpdGggc29tZXRoaW5nCi0JICovCi0JaWYgKHZiMl9wbGFuZV92YWRkcih2YiwgMCkpCi0JCW1lbXNldCh2YjJfcGxhbmVfdmFkZHIodmIsIDApLCAweGFhLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKLSNlbmRpZgotCi0JQlVHX09OKE5VTEwgPT0gaWNkLT5jdXJyZW50X2ZtdCk7Ci0KLQlzaXplID0gaWNkLT51c2VyX2hlaWdodCAqIGJ5dGVzX3Blcl9saW5lOwotCi0JaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHNpemUpIHsKLQkJZGV2X2VycihpY2QtPnBhcmVudCwgIkJ1ZmZlciB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsCi0JCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIHNpemUpOwotCQlyZXR1cm4gLUVOT0JVRlM7Ci0JfQotCi0JdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZiLCAwLCBzaXplKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zODgsMTAgKzM3MiwzNSBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9idWZmZXIgKmJ1ZiA9IHRvX2NldV92Yih2Yik7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKworCWlmIChieXRlc19wZXJfbGluZSA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzaXplID0gaWNkLT51c2VyX2hlaWdodCAqIGJ5dGVzX3Blcl9saW5lOworCisJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHNpemUpIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkJ1ZmZlciAjJWQgdG9vIHNtYWxsICglbHUgPCAlbHUpXG4iLAorCQkJdmItPnY0bDJfYnVmLmluZGV4LCB2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIHNpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgc2l6ZSk7CiAKIAlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JXAgJWx1XG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiMl9wbGFuZV92YWRkcih2YiwgMCksIHZiMl9nZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCkpOwogCisjaWZkZWYgREVCVUcKKwkvKgorCSAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgaWYgd2UgYWN0dWFsbHkgZmlsbAorCSAqIHRoZSBidWZmZXIgd2l0aCBzb21ldGhpbmcKKwkgKi8KKwlpZiAodmIyX3BsYW5lX3ZhZGRyKHZiLCAwKSkKKwkJbWVtc2V0KHZiMl9wbGFuZV92YWRkcih2YiwgMCksIDB4YWEsIHZiMl9nZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCkpOworI2VuZGlmCisKIAlzcGluX2xvY2tfaXJxKCZwY2Rldi0+bG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYnVmLT5xdWV1ZSwgJnBjZGV2LT5jYXB0dXJlKTsKIApAQCAtNDA1LDYgKzQxNCwxMSBAQAogCQlzaF9tb2JpbGVfY2V1X2NhcHR1cmUocGNkZXYpOwogCX0KIAlzcGluX3VubG9ja19pcnEoJnBjZGV2LT5sb2NrKTsKKworCXJldHVybjsKKworZXJyb3I6CisJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKIH0KIAogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV92aWRlb2J1Zl9yZWxlYXNlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKQEAgLTQyOSwxMSArNDQzLDIzIEBACiAJaWYgKGJ1Zi0+cXVldWUubmV4dCkKIAkJbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CiAKKwlwY2Rldi0+YnVmX3RvdGFsIC09IFBBR0VfQUxJR04odmIyX3BsYW5lX3NpemUodmIsIDApKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMoKSAlenUgYnl0ZXMgYnVmZmVyc1xuIiwgX19mdW5jX18sCisJCXBjZGV2LT5idWZfdG90YWwpOworCiAJc3Bpbl91bmxvY2tfaXJxKCZwY2Rldi0+bG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV92aWRlb2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZih2Yi0+dmIyX3F1ZXVlLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CisKKwlwY2Rldi0+YnVmX3RvdGFsICs9IFBBR0VfQUxJR04odmIyX3BsYW5lX3NpemUodmIsIDApKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMoKSAlenUgYnl0ZXMgYnVmZmVyc1xuIiwgX19mdW5jX18sCisJCXBjZGV2LT5idWZfdG90YWwpOworCiAJLyogVGhpcyBpcyBmb3IgbG9ja2luZyBkZWJ1Z2dpbmcgb25seSAqLwogCUlOSVRfTElTVF9IRUFEKCZ0b19jZXVfdmIodmIpLT5xdWV1ZSk7CiAJcmV0dXJuIDA7CkBAIC01MzUsMTkgKzU2MSwyOSBAQAogCiAJcG1fcnVudGltZV9nZXRfc3luYyhpY2ktPnY0bDJfZGV2LmRldik7CiAKKwlwY2Rldi0+YnVmX3RvdGFsID0gMDsKKwogCXJldCA9IHNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7CiAKIAljc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKKwlpZiAoY3NpMl9zZCkKKwkJY3NpMl9zZC0+Z3JwX2lkID0gKGxvbmcpaWNkOwogCiAJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChjc2kyX3NkLCBjb3JlLCBzX3Bvd2VyLCAxKTsKLQlpZiAocmV0ICE9IC1FTk9ERVYgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCAmJiByZXQgPCAwKSB7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCAmJiByZXQgIT0gLUVOT0RFVikgewogCQlwbV9ydW50aW1lX3B1dF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKLQl9IGVsc2UgewotCQlwY2Rldi0+aWNkID0gaWNkOwotCQlyZXQgPSAwOworCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldHVybiByZXQ7CisJLyoKKwkgKiAtRU5PREVWIGlzIHNwZWNpYWw6IGVpdGhlciBjc2kyX3NkID09IE5VTEwgb3IgdGhlIENTSS0yIGRyaXZlcgorCSAqIGhhcyBub3QgZm91bmQgdGhpcyBzb2MtY2FtZXJhIGRldmljZSBhbW9uZyBpdHMgY2xpZW50cworCSAqLworCWlmIChyZXQgPT0gLUVOT0RFViAmJiBjc2kyX3NkKQorCQljc2kyX3NkLT5ncnBfaWQgPSAwOworCXBjZGV2LT5pY2QgPSBpY2Q7CisKKwlyZXR1cm4gMDsKIH0KIAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwpAQCAtNTYwLDYgKzU5Niw4IEBACiAJQlVHX09OKGljZCAhPSBwY2Rldi0+aWNkKTsKIAogCXY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMCk7CisJaWYgKGNzaTJfc2QpCisJCWNzaTJfc2QtPmdycF9pZCA9IDA7CiAJLyogZGlzYWJsZSBjYXB0dXJlLCBkaXNhYmxlIGludGVycnVwdHMgKi8KIAljZXVfd3JpdGUocGNkZXYsIENFSUVSLCAwKTsKIAlzaF9tb2JpbGVfY2V1X3NvZnRfcmVzZXQocGNkZXYpOwpAQCAtNjI4LDIyICs2NjYsMjIgQEAKIAlsZWZ0X29mZnNldAk9IGNhbS0+Y2V1X2xlZnQ7CiAJdG9wX29mZnNldAk9IGNhbS0+Y2V1X3RvcDsKIAotCS8qIENFVSBjcm9wcGluZyAoQ0ZTWlIpIGlzIGFwcGxpZWQgX2FmdGVyXyB0aGUgc2NhbGluZyBmaWx0ZXIgKENGTENSKSAqLworCVdBUk5fT04oaWNkLT51c2VyX3dpZHRoICYgMyB8fCBpY2QtPnVzZXJfaGVpZ2h0ICYgMyk7CisKKwl3aWR0aCA9IGljZC0+dXNlcl93aWR0aDsKKwogCWlmIChwY2Rldi0+aW1hZ2VfbW9kZSkgewogCQlpbl93aWR0aCA9IGNhbS0+d2lkdGg7CiAJCWlmICghcGNkZXYtPmlzXzE2Yml0KSB7CiAJCQlpbl93aWR0aCAqPSAyOwogCQkJbGVmdF9vZmZzZXQgKj0gMjsKIAkJfQotCQl3aWR0aCA9IGljZC0+dXNlcl93aWR0aDsKLQkJY2R3ZHJfd2lkdGggPSBpY2QtPnVzZXJfd2lkdGg7CisJCWNkd2RyX3dpZHRoID0gd2lkdGg7CiAJfSBlbHNlIHsKLQkJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZSh3aWR0aCwKIAkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKIAkJdW5zaWduZWQgaW50IHdfZmFjdG9yOwogCi0JCXdpZHRoID0gaWNkLT51c2VyX3dpZHRoOwotCiAJCXN3aXRjaCAoaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPnBhY2tpbmcpIHsKIAkJY2FzZSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISToKIAkJCXdfZmFjdG9yID0gMjsKQEAgLTY1MywxMCArNjkxLDEwIEBACiAJCX0KIAogCQlpbl93aWR0aCA9IGNhbS0+d2lkdGggKiB3X2ZhY3RvcjsKLQkJbGVmdF9vZmZzZXQgPSBsZWZ0X29mZnNldCAqIHdfZmFjdG9yOworCQlsZWZ0X29mZnNldCAqPSB3X2ZhY3RvcjsKIAogCQlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQotCQkJY2R3ZHJfd2lkdGggPSBpY2QtPnVzZXJfd2lkdGg7CisJCQljZHdkcl93aWR0aCA9IHdpZHRoOwogCQllbHNlCiAJCQljZHdkcl93aWR0aCA9IGJ5dGVzX3Blcl9saW5lOwogCX0KQEAgLTY2NCw3ICs3MDIsNyBAQAogCWhlaWdodCA9IGljZC0+dXNlcl9oZWlnaHQ7CiAJaW5faGVpZ2h0ID0gY2FtLT5oZWlnaHQ7CiAJaWYgKFY0TDJfRklFTERfTk9ORSAhPSBwY2Rldi0+ZmllbGQpIHsKLQkJaGVpZ2h0IC89IDI7CisJCWhlaWdodCA9IChoZWlnaHQgLyAyKSAmIH4zOwogCQlpbl9oZWlnaHQgLz0gMjsKIAkJdG9wX29mZnNldCAvPSAyOwogCQljZHdkcl93aWR0aCAqPSAyOwpAQCAtNjg2LDYgKzcyNCw3IEBACiAKIAljZXVfd3JpdGUocGNkZXYsIENBTU9SLCBjYW1vcik7CiAJY2V1X3dyaXRlKHBjZGV2LCBDQVBXUiwgKGluX2hlaWdodCA8PCAxNikgfCBpbl93aWR0aCk7CisJLyogQ0ZTWlIgY2xpcHBpbmcgaXMgYXBwbGllZCBfYWZ0ZXJfIHRoZSBzY2FsaW5nIGZpbHRlciAoQ0ZMQ1IpICovCiAJY2V1X3dyaXRlKHBjZGV2LCBDRlNaUiwgKGhlaWdodCA8PCAxNikgfCB3aWR0aCk7CiAJY2V1X3dyaXRlKHBjZGV2LCBDRFdEUiwgY2R3ZHJfd2lkdGgpOwogfQpAQCAtNzIzLDY2ICs3NjIsOTMgQEAKIAkJY2V1X3dyaXRlKHBjZGV2LCBDQVBTUiwgY2Fwc3IpOwogfQogCisvKiBGaW5kIHRoZSBidXMgc3ViZGV2aWNlIGRyaXZlciwgZS5nLiwgQ1NJMiAqLworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqZmluZF9idXNfc3ViZGV2KHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYsCisJCQkJCSAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCWlmIChwY2Rldi0+Y3NpMl9wZGV2KSB7CisJCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpMl9zZCA9IGZpbmRfY3NpMihwY2Rldik7CisJCWlmIChjc2kyX3NkICYmIGNzaTJfc2QtPmdycF9pZCA9PSAodTMyKWljZCkKKwkJCXJldHVybiBjc2kyX3NkOworCX0KKworCXJldHVybiBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworfQorCisjZGVmaW5lIENFVV9CVVNfRkxBR1MgKFY0TDJfTUJVU19NQVNURVIgfAlcCisJCVY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfAlcCisJCVY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CVwKKwkJVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cgfAlcCisJCVY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIKQorCiAvKiBDYXB0dXJlIGlzIG5vdCBydW5uaW5nLCBubyBpbnRlcnJ1cHRzLCBubyBsb2NraW5nIG5lZWRlZCAqLwogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgICAgIF9fdTMyIHBpeGZtdCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzLCB2YWx1ZTsKLQlpbnQgeXV2X2xpbmVza2lwOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBmaW5kX2J1c19zdWJkZXYocGNkZXYsIGljZCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtICpjYW0gPSBpY2QtPmhvc3RfcHJpdjsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlLCBjb21tb25fZmxhZ3MgPSBDRVVfQlVTX0ZMQUdTOwogCXUzMiBjYXBzciA9IGNhcHR1cmVfc2F2ZV9yZXNldChwY2Rldik7CisJdW5zaWduZWQgaW50IHl1dl9saW5lc2tpcDsKKwlpbnQgcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOwotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAotCQkJCQkJICAgICAgIG1ha2VfYnVzX3BhcmFtKHBjZGV2KSk7Ci0JaWYgKCFjb21tb25fZmxhZ3MpCi0JCXJldHVybiAtRUlOVkFMOworCS8qCisJICogSWYgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBnX21idXNfY29uZmlnLCB3ZSBqdXN0IHVzZSBvdXIKKwkgKiBwbGF0Zm9ybSBkYXRhCisJICovCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KSB7CisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsCisJCQkJCQkJICBjb21tb25fZmxhZ3MpOworCQlpZiAoIWNvbW1vbl9mbGFncykKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkgeworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gcHJlZmVyZW5jZXMgKi8KLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAocGNkZXYtPnBkYXRhLT5mbGFncyAmIFNIX0NFVV9GTEFHX0hTWU5DX0xPVykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgotCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykpIHsKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKSkgewogCQlpZiAocGNkZXYtPnBkYXRhLT5mbGFncyAmIFNIX0NFVV9GTEFHX1ZTWU5DX0xPVykKLQkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0hJR0g7CisJCQljb21tb25fZmxhZ3MgJj0gflY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSDsKIAkJZWxzZQotCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCQkJY29tbW9uX2ZsYWdzICY9IH5WNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVzsKIAl9CiAKLQlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7Ci0JaWYgKHJldCA8IDApCisJY2ZnLmZsYWdzID0gY29tbW9uX2ZsYWdzOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfY29uZmlnLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQogCQlyZXR1cm4gcmV0OwogCi0Jc3dpdGNoIChjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykgewotCWNhc2UgU09DQU1fREFUQVdJRFRIXzg6Ci0JCXBjZGV2LT5pc18xNmJpdCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU09DQU1fREFUQVdJRFRIXzE2OgorCWlmIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Yml0c19wZXJfc2FtcGxlID4gOCkKIAkJcGNkZXYtPmlzXzE2Yml0ID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWVsc2UKKwkJcGNkZXYtPmlzXzE2Yml0ID0gMDsKIAogCWNldV93cml0ZShwY2RldiwgQ1JDTlRSLCAwKTsKIAljZXVfd3JpdGUocGNkZXYsIENSQ01QUiwgMCk7CiAKIAl2YWx1ZSA9IDB4MDAwMDAwMTA7IC8qIGRhdGEgZmV0Y2ggYnkgZGVmYXVsdCAqLwotCXl1dl9saW5lc2tpcCA9IDA7CisJeXV2X2xpbmVza2lwID0gMHgxMDsKIAogCXN3aXRjaCAoaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmZvdXJjYykgewogCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6CiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLQkJeXV2X2xpbmVza2lwID0gMTsgLyogc2tpcCBmb3IgTlYxMi8yMSwgbm8gc2tpcCBmb3IgTlYxNi82MSAqLworCQkvKiBjb252ZXJ0IDQ6MjoyIC0+IDQ6MjowICovCisJCXl1dl9saW5lc2tpcCA9IDA7IC8qIHNraXAgZm9yIE5WMTIvMjEsIG5vIHNraXAgZm9yIE5WMTYvNjEgKi8KIAkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKIAljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgpAQCAtODA4LDggKzg3NCw4IEBACiAJICAgIGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WNjEpCiAJCXZhbHVlIF49IDB4MDAwMDAxMDA7IC8qIHN3YXAgVSwgViB0byBjaGFuZ2UgZnJvbSBOVjF4LT5OVngxICovCiAKLQl2YWx1ZSB8PSBjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XID8gMSA8PCAxIDogMDsKLQl2YWx1ZSB8PSBjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XID8gMSA8PCAwIDogMDsKKwl2YWx1ZSB8PSBjb21tb25fZmxhZ3MgJiBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyA/IDEgPDwgMSA6IDA7CisJdmFsdWUgfD0gY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgPyAxIDw8IDAgOiAwOwogCXZhbHVlIHw9IHBjZGV2LT5pc18xNmJpdCA/IDEgPDwgMTIgOiAwOwogCiAJLyogQ1NJMiBtb2RlICovCkBAIC04NTIsOSArOTE4LDcgQEAKIAkgKiB1c2luZyA3IHdlIHN3YXAgdGhlIGRhdGEgYnl0ZXMgdG8gbWF0Y2ggdGhlIGluY29taW5nIG9yZGVyOgogCSAqIEQwLCBEMSwgRDIsIEQzLCBENCwgRDUsIEQ2LCBENwogCSAqLwotCXZhbHVlID0gMHgwMDAwMDAxNzsKLQlpZiAoeXV2X2xpbmVza2lwKQotCQl2YWx1ZSAmPSB+MHgwMDAwMDAxMDsgLyogY29udmVydCA0OjI6MiAtPiA0OjI6MCAqLworCXZhbHVlID0gMHgwMDAwMDAwNyB8IHl1dl9saW5lc2tpcDsKIAogCWNldV93cml0ZShwY2RldiwgQ0RPQ1IsIHZhbHVlKTsKIAljZXVfd3JpdGUocGNkZXYsIENGV0NSLCAwKTsgLyoga2VlcCAiZGF0YWZldGNoIGZpcmV3YWxsIiBkaXNhYmxlZCAqLwpAQCAtODc1LDEzICs5MzksMTkgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0JdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZmluZF9idXNfc3ViZGV2KHBjZGV2LCBpY2QpOworCXVuc2lnbmVkIGxvbmcgY29tbW9uX2ZsYWdzID0gQ0VVX0JVU19GTEFHUzsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmcgPSB7LnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUwsfTsKKwlpbnQgcmV0OwogCi0JY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOwotCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAotCQkJCQkJICAgICAgIG1ha2VfYnVzX3BhcmFtKHBjZGV2KSk7Ci0JaWYgKCFjb21tb25fZmxhZ3MgfHwgYnVzd2lkdGggPiAxNiB8fAotCSAgICAoYnVzd2lkdGggPiA4ICYmICEoY29tbW9uX2ZsYWdzICYgU09DQU1fREFUQVdJRFRIXzE2KSkpCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmICghcmV0KQorCQljb21tb25fZmxhZ3MgPSBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZSgmY2ZnLAorCQkJCQkJCSAgY29tbW9uX2ZsYWdzKTsKKwllbHNlIGlmIChyZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFjb21tb25fZmxhZ3MgfHwgYnVzd2lkdGggPiAxNikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKQEAgLTg5MSwyNiArOTYxLDI2IEBACiAJewogCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfTlYxMiwKIAkJLm5hbWUJCQk9ICJOVjEyIiwKLQkJLmJpdHNfcGVyX3NhbXBsZQk9IDEyLAotCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HX05PTkUsCisJCS5iaXRzX3Blcl9zYW1wbGUJPSA4LAorCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HXzFfNVg4LAogCQkub3JkZXIJCQk9IFNPQ19NQlVTX09SREVSX0xFLAogCX0sIHsKIAkJLmZvdXJjYwkJCT0gVjRMMl9QSVhfRk1UX05WMjEsCiAJCS5uYW1lCQkJPSAiTlYyMSIsCi0JCS5iaXRzX3Blcl9zYW1wbGUJPSAxMiwKLQkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR19OT05FLAorCQkuYml0c19wZXJfc2FtcGxlCT0gOCwKKwkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR18xXzVYOCwKIAkJLm9yZGVyCQkJPSBTT0NfTUJVU19PUkRFUl9MRSwKIAl9LCB7CiAJCS5mb3VyY2MJCQk9IFY0TDJfUElYX0ZNVF9OVjE2LAogCQkubmFtZQkJCT0gIk5WMTYiLAotCQkuYml0c19wZXJfc2FtcGxlCT0gMTYsCi0JCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfTk9ORSwKKwkJLmJpdHNfcGVyX3NhbXBsZQk9IDgsCisJCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfMlg4X1BBREhJLAogCQkub3JkZXIJCQk9IFNPQ19NQlVTX09SREVSX0xFLAogCX0sIHsKIAkJLmZvdXJjYwkJCT0gVjRMMl9QSVhfRk1UX05WNjEsCiAJCS5uYW1lCQkJPSAiTlY2MSIsCi0JCS5iaXRzX3Blcl9zYW1wbGUJPSAxNiwKLQkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR19OT05FLAorCQkuYml0c19wZXJfc2FtcGxlCT0gOCwKKwkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEksCiAJCS5vcmRlcgkJCT0gU09DX01CVVNfT1JERVJfTEUsCiAJfSwKIH07CkBAIC05MjAsNiArOTkwLDggQEAKIHsKIAlyZXR1cm4JZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfTk9ORSB8fAogCQkoZm10LT5iaXRzX3Blcl9zYW1wbGUgPT0gOCAmJgorCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfMV81WDgpIHx8CisJCShmbXQtPmJpdHNfcGVyX3NhbXBsZSA9PSA4ICYmCiAJCSBmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEkpIHx8CiAJCShmbXQtPmJpdHNfcGVyX3NhbXBsZSA+IDggJiYKIAkJIGZtdC0+cGFja2luZyA9PSBTT0NfTUJVU19QQUNLSU5HX0VYVEVORDE2KTsKQEAgLTkyNyw2ICs5OTksMzggQEAKIAogc3RhdGljIGludCBjbGllbnRfZ19yZWN0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpOwogCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICpjdHJsX3RvX2ljZChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXJldHVybiBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLAorCQkJCQkJCWN0cmxfaGFuZGxlcik7Cit9CisKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGN0cmxfdG9faWNkKGN0cmwpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKKwkJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjKSB7CisJCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6CisJCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CisJCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6CisJCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisJCQljZXVfd3JpdGUocGNkZXYsIENMRkNSLCAhY3RybC0+dmFsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgc2hfbW9iaWxlX2NldV9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gc2hfbW9iaWxlX2NldV9zX2N0cmwsCit9OworCiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfZ2V0X2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHVuc2lnbmVkIGludCBpZHgsCiAJCQkJICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQogewpAQCAtOTUyLDYgKzEwNTYsNyBAQAogCX0KIAogCWlmICghcGNkZXYtPnBkYXRhLT5jc2kyKSB7CisJCS8qIEFyZSB0aGVyZSBhbnkgcmVzdHJpY3Rpb25zIGluIHRoZSBDU0ktMiBjYXNlPyAqLwogCQlyZXQgPSBzaF9tb2JpbGVfY2V1X3RyeV9idXNfcGFyYW0oaWNkLCBmbXQtPmJpdHNfcGVyX3NhbXBsZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIDA7CkBAIC05NjIsNiArMTA2NywxMiBAQAogCQlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CiAJCWludCBzaGlmdCA9IDA7CiAKKwkJLyogQWRkIG91ciBjb250cm9sICovCisJCXY0bDJfY3RybF9uZXdfc3RkKCZpY2QtPmN0cmxfaGFuZGxlciwgJnNoX21vYmlsZV9jZXVfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9TSEFSUE5FU1MsIDAsIDEsIDEsIDApOworCQlpZiAoaWNkLT5jdHJsX2hhbmRsZXIuZXJyb3IpCisJCQlyZXR1cm4gaWNkLT5jdHJsX2hhbmRsZXIuZXJyb3I7CisKIAkJLyogRklYTUU6IHN1YndpbmRvdyBpcyBsb3N0IGJldHdlZW4gY2xvc2UgLyBvcGVuICovCiAKIAkJLyogQ2FjaGUgY3VycmVudCBjbGllbnQgZ2VvbWV0cnkgKi8KQEAgLTEwMDQsOSArMTExNSw2IEBACiAJCWNhbS0+d2lkdGgJPSBtZi53aWR0aDsKIAkJY2FtLT5oZWlnaHQJPSBtZi5oZWlnaHQ7CiAKLQkJY2FtLT53aWR0aAk9IG1mLndpZHRoOwotCQljYW0tPmhlaWdodAk9IG1mLmhlaWdodDsKLQogCQlpY2QtPmhvc3RfcHJpdiA9IGNhbTsKIAl9IGVsc2UgewogCQljYW0gPSBpY2QtPmhvc3RfcHJpdjsKQEAgLTEyNzgsNiArMTM4Niw3IEBACiAJdW5zaWduZWQgaW50IHdpZHRoID0gbWYtPndpZHRoLCBoZWlnaHQgPSBtZi0+aGVpZ2h0LCB0bXBfdywgdG1wX2g7CiAJdW5zaWduZWQgaW50IG1heF93aWR0aCwgbWF4X2hlaWdodDsKIAlzdHJ1Y3QgdjRsMl9jcm9wY2FwIGNhcDsKKwlib29sIGNldV8xdG8xOwogCWludCByZXQ7CiAKIAlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIChsb25nKWljZCwgdmlkZW8sCkBAIC0xMjg3LDcgKzEzOTYsMTQgQEAKIAogCWRldl9nZW8oZGV2LCAiY2FtZXJhIHNjYWxlZCB0byAldXgldVxuIiwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKIAotCWlmICgod2lkdGggPT0gbWYtPndpZHRoICYmIGhlaWdodCA9PSBtZi0+aGVpZ2h0KSB8fCAhY2V1X2Nhbl9zY2FsZSkKKwlpZiAod2lkdGggPT0gbWYtPndpZHRoICYmIGhlaWdodCA9PSBtZi0+aGVpZ2h0KSB7CisJCS8qIFBlcmZlY3QhIFRoZSBjbGllbnQgaGFzIGRvbmUgaXQgYWxsLiAqLworCQljZXVfMXRvMSA9IHRydWU7CisJCWdvdG8gdXBkYXRlX2NhY2hlOworCX0KKworCWNldV8xdG8xID0gZmFsc2U7CisJaWYgKCFjZXVfY2FuX3NjYWxlKQogCQlnb3RvIHVwZGF0ZV9jYWNoZTsKIAogCWNhcC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwpAQCAtMTMyNyw3ICsxNDQzLDEwIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQl1cGRhdGVfc3VicmVjdChjYW0pOworCWlmIChjZXVfMXRvMSkKKwkJY2FtLT5zdWJyZWN0ID0gY2FtLT5yZWN0OworCWVsc2UKKwkJdXBkYXRlX3N1YnJlY3QoY2FtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQxNCw3ICsxNTMzLDEwIEBACiAJY2Fwc3IgPSBjYXB0dXJlX3NhdmVfcmVzZXQocGNkZXYpOwogCWRldl9kYmcoZGV2LCAiQ0FQU1IgMHgleCwgQ0ZMQ1IgMHgleFxuIiwgY2Fwc3IsIHBjZGV2LT5jZmxjcik7CiAKLQkvKiAxLiAtIDIuIEFwcGx5IGl0ZXJhdGl2ZSBjYW1lcmEgU19DUk9QIGZvciBuZXcgaW5wdXQgd2luZG93LiAqLworCS8qCisJICogMS4gLSAyLiBBcHBseSBpdGVyYXRpdmUgY2FtZXJhIFNfQ1JPUCBmb3IgbmV3IGlucHV0IHdpbmRvdywgcmVhZCBiYWNrCisJICogYWN0dWFsIGNhbWVyYSByZWN0YW5nbGUuCisJICovCiAJcmV0ID0gY2xpZW50X3NfY3JvcChpY2QsIGEsICZjYW1fY3JvcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xNDk4LDggKzE2MjAsOSBAQAogCQljZXVfd3JpdGUocGNkZXYsIENGTENSLCBjZmxjcik7CiAJfQogCi0JaWNkLT51c2VyX3dpZHRoCSA9IG91dF93aWR0aDsKLQlpY2QtPnVzZXJfaGVpZ2h0ID0gb3V0X2hlaWdodDsKKwlpY2QtPnVzZXJfd2lkdGgJID0gb3V0X3dpZHRoICYgfjM7CisJaWNkLT51c2VyX2hlaWdodCA9IG91dF9oZWlnaHQgJiB+MzsKKwkvKiBPZmZzZXRzIGFyZSBhcHBsaWVkIGF0IHRoZSBDRVUgc2NhbGluZyBmaWx0ZXIgaW5wdXQgKi8KIAljYW0tPmNldV9sZWZ0CSA9IHNjYWxlX2Rvd24ocmVjdC0+bGVmdCAtIGNhbV9yZWN0LT5sZWZ0LCBzY2FsZV9jYW1faCkgJiB+MTsKIAljYW0tPmNldV90b3AJID0gc2NhbGVfZG93bihyZWN0LT50b3AgLSBjYW1fcmVjdC0+dG9wLCBzY2FsZV9jYW1fdikgJiB+MTsKIApAQCAtMTUzOCw3ICsxNjYxLDcgQEAKICAqIENFVSBjcm9wLCBtYXBwZWQgYmFja2VkIG9udG8gdGhlIGNsaWVudCBpbnB1dCAoc3VicmVjdCkuCiAgKi8KIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9jbGllbnRfb3V0cHV0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQorCQljb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CkBAIC0xNTc0LDggKzE2OTcsOCBAQAogCWRldl9nZW8oZGV2LCAiMzogc2NhbGVzICV1OiV1XG4iLCBzY2FsZV9oLCBzY2FsZV92KTsKIAogCS8qCi0JICogNC4gQ2FsY3VsYXRlIGNsaWVudCBvdXRwdXQgd2luZG93IGJ5IGFwcGx5aW5nIGNvbWJpbmVkIHNjYWxlcyB0byByZWFsCi0JICogICAgaW5wdXQgd2luZG93LgorCSAqIDQuIENhbGN1bGF0ZSBkZXNpcmVkIGNsaWVudCBvdXRwdXQgd2luZG93IGJ5IGFwcGx5aW5nIGNvbWJpbmVkIHNjYWxlcworCSAqICAgIHRvIGNsaWVudCAocmVhbCkgaW5wdXQgd2luZG93LgogCSAqLwogCW1mLT53aWR0aAk9IHNjYWxlX2Rvd24oY2FtLT5yZWN0LndpZHRoLCBzY2FsZV9oKTsKIAltZi0+aGVpZ2h0CT0gc2NhbGVfZG93bihjYW0tPnJlY3QuaGVpZ2h0LCBzY2FsZV92KTsKQEAgLTE2MDAsOCArMTcyMyw2IEBACiAJYm9vbCBpbWFnZV9tb2RlOwogCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKIAotCWRldl9nZW8oZGV2LCAiU19GTVQocGl4PTB4JXgsICV1eCV1KVxuIiwgcGl4Zm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7Ci0KIAlzd2l0Y2ggKHBpeC0+ZmllbGQpIHsKIAlkZWZhdWx0OgogCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwpAQCAtMTYyMiw4ICsxNzQzLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogMS4tNC4gQ2FsY3VsYXRlIGNsaWVudCBvdXRwdXQgZ2VvbWV0cnkgKi8KLQljYWxjdWxhdGVfY2xpZW50X291dHB1dChpY2QsICZmLT5mbXQucGl4LCAmbWYpOworCS8qIDEuLTQuIENhbGN1bGF0ZSBkZXNpcmVkIGNsaWVudCBvdXRwdXQgZ2VvbWV0cnkgKi8KKwljYWxjdWxhdGVfY2xpZW50X291dHB1dChpY2QsIHBpeCwgJm1mKTsKIAltZi5maWVsZAk9IHBpeC0+ZmllbGQ7CiAJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKIAltZi5jb2RlCQk9IHhsYXRlLT5jb2RlOwpAQCAtMTYzOSw2ICsxNzYwLDkgQEAKIAkJaW1hZ2VfbW9kZSA9IGZhbHNlOwogCX0KIAorCWRldl9nZW8oZGV2LCAiU19GTVQocGl4PTB4JXgsIGZsZCAweCV4LCBjb2RlIDB4JXgsICV1eCV1KVxuIiwgcGl4Zm10LCBtZi5maWVsZCwgbWYuY29kZSwKKwkJcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCiAJZGV2X2dlbyhkZXYsICI0OiByZXF1ZXN0IGNhbWVyYSBvdXRwdXQgJXV4JXVcbiIsIG1mLndpZHRoLCBtZi5oZWlnaHQpOwogCiAJLyogNS4gLSA5LiAqLwpAQCAtMTcwMCw2ICsxODI0LDEwIEBACiAJcGNkZXYtPmZpZWxkID0gZmllbGQ7CiAJcGNkZXYtPmltYWdlX21vZGUgPSBpbWFnZV9tb2RlOwogCisJLyogQ0ZTWlIgcmVxdWlyZW1lbnQgKi8KKwlwaXgtPndpZHRoCSY9IH4zOworCXBpeC0+aGVpZ2h0CSY9IH4zOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3MjUsNyArMTg1Myw4IEBACiAKIAkvKiBGSVhNRTogY2FsY3VsYXRlIHVzaW5nIGRlcHRoIGFuZCBidXMgd2lkdGggKi8KIAotCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgMiwgMjU2MCwgMSwKKwkvKiBDRlNaUiByZXF1aXJlcyBoZWlnaHQgYW5kIHdpZHRoIHRvIGJlIDQtcGl4ZWwgYWxpZ25lZCAqLworCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgMiwgMjU2MCwgMiwKIAkJCSAgICAgICZwaXgtPmhlaWdodCwgNCwgMTkyMCwgMiwgMCk7CiAKIAl3aWR0aCA9IHBpeC0+d2lkdGg7CkBAIC0xNzc4LDYgKzE5MDcsOSBAQAogCQkJcGl4LT5oZWlnaHQgPSBoZWlnaHQ7CiAJfQogCisJcGl4LT53aWR0aAkmPSB+MzsKKwlwaXgtPmhlaWdodAkmPSB+MzsKKwogCWRldl9nZW8oaWNkLT5wYXJlbnQsICIlcygpOiByZXR1cm4gJWQsIGZtdCAweCV4LCAldXgldVxuIiwKIAkJX19mdW5jX18sIHJldCwgcGl4LT5waXhlbGZvcm1hdCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCkBAIC0xODI0LDggKzE5NTYsOCBAQAogCQkJICAgICBvdXRfaGVpZ2h0ICE9IGYuZm10LnBpeC5oZWlnaHQpKQogCQkJcmV0ID0gLUVJTlZBTDsKIAkJaWYgKCFyZXQpIHsKLQkJCWljZC0+dXNlcl93aWR0aAkJPSBvdXRfd2lkdGg7Ci0JCQlpY2QtPnVzZXJfaGVpZ2h0CT0gb3V0X2hlaWdodDsKKwkJCWljZC0+dXNlcl93aWR0aAkJPSBvdXRfd2lkdGggJiB+MzsKKwkJCWljZC0+dXNlcl9oZWlnaHQJPSBvdXRfaGVpZ2h0ICYgfjM7CiAJCQlyZXQgPSBzaF9tb2JpbGVfY2V1X3NldF9idXNfcGFyYW0oaWNkLAogCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjKTsKIAkJfQpAQCAtMTg2OSw1NSArMjAwMSw2IEBACiAJcmV0dXJuIHZiMl9xdWV1ZV9pbml0KHEpOwogfQogCi1zdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfZ2V0X2N0cmwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7Ci0Jc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQl1MzIgdmFsOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgotCQl2YWwgPSBjZXVfcmVhZChwY2RldiwgQ0xGQ1IpOwotCQljdHJsLT52YWx1ZSA9IHZhbCBeIDE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotfQotCi1zdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc2V0X2N0cmwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7Ci0Jc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKLQkJc3dpdGNoIChpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjKSB7Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6Ci0JCQljZXVfd3JpdGUocGNkZXYsIENMRkNSLCAhY3RybC0+dmFsdWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAtRU5PSU9DVExDTUQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgc2hfbW9iaWxlX2NldV9jb250cm9sc1tdID0gewotCXsKLQkJLmlkCQk9IFY0TDJfQ0lEX1NIQVJQTkVTUywKLQkJLnR5cGUJCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkJLm5hbWUJCT0gIkxvdy1wYXNzIGZpbHRlciIsCi0JCS5taW5pbXVtCT0gMCwKLQkJLm1heGltdW0JPSAxLAotCQkuc3RlcAkJPSAxLAotCQkuZGVmYXVsdF92YWx1ZQk9IDAsCi0JfSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0X29wcyBzaF9tb2JpbGVfY2V1X2hvc3Rfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuYWRkCQk9IHNoX21vYmlsZV9jZXVfYWRkX2RldmljZSwKQEAgLTE5MjksMTQgKzIwMTIsMTAgQEAKIAkuc2V0X2xpdmVjcm9wCT0gc2hfbW9iaWxlX2NldV9zZXRfbGl2ZWNyb3AsCiAJLnNldF9mbXQJPSBzaF9tb2JpbGVfY2V1X3NldF9mbXQsCiAJLnRyeV9mbXQJPSBzaF9tb2JpbGVfY2V1X3RyeV9mbXQsCi0JLnNldF9jdHJsCT0gc2hfbW9iaWxlX2NldV9zZXRfY3RybCwKLQkuZ2V0X2N0cmwJPSBzaF9tb2JpbGVfY2V1X2dldF9jdHJsLAogCS5wb2xsCQk9IHNoX21vYmlsZV9jZXVfcG9sbCwKIAkucXVlcnljYXAJPSBzaF9tb2JpbGVfY2V1X3F1ZXJ5Y2FwLAogCS5zZXRfYnVzX3BhcmFtCT0gc2hfbW9iaWxlX2NldV9zZXRfYnVzX3BhcmFtLAogCS5pbml0X3ZpZGVvYnVmMgk9IHNoX21vYmlsZV9jZXVfaW5pdF92aWRlb2J1ZiwKLQkuY29udHJvbHMJPSBzaF9tb2JpbGVfY2V1X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKHNoX21vYmlsZV9jZXVfY29udHJvbHMpLAogfTsKIAogc3RydWN0IGJ1c193YWl0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYwppbmRleCAyODkzYTAxLi5lYTRmMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgogI2luY2x1ZGUgPG1lZGlhL3NoX21vYmlsZV9jc2kyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMzUsMTEgKzM3LDEwIEBACiAJc3RydWN0IHY0bDJfc3ViZGV2CQlzdWJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKIAl1bnNpZ25lZCBpbnQJCQlpcnE7CisJdW5zaWduZWQgbG9uZwkJCW1pcGlfZmxhZ3M7CiAJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAJc3RydWN0IHNoX2NzaTJfY2xpZW50X2NvbmZpZwkqY2xpZW50OwotCXVuc2lnbmVkIGxvbmcgKCpxdWVyeV9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKLQlpbnQgKCpzZXRfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CiB9OwogCiBzdGF0aWMgaW50IHNoX2NzaTJfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLApAQCAtMTI3LDkgKzEyOCwzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNoX2NzaTJfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIOworCWNmZy0+dHlwZSA9IFY0TDJfTUJVU19QQVJBTExFTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX2NzaTJfc19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCSBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBzaF9jc2kyICpwcml2ID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3Qgc2hfY3NpMiwgc3ViZGV2KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilzZC0+Z3JwX2lkOworCXN0cnVjdCB2NGwyX3N1YmRldiAqY2xpZW50X3NkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjbGllbnRfY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX0NTSTIsCisJCQkJCSAgICAgIC5mbGFncyA9IHByaXYtPm1pcGlfZmxhZ3N9OworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoY2xpZW50X3NkLCB2aWRlbywgc19tYnVzX2NvbmZpZywgJmNsaWVudF9jZmcpOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzaF9jc2kyX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfbWJ1c19mbXQJPSBzaF9jc2kyX3NfZm10LAogCS50cnlfbWJ1c19mbXQJPSBzaF9jc2kyX3RyeV9mbXQsCisJLmdfbWJ1c19jb25maWcJPSBzaF9jc2kyX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSBzaF9jc2kyX3NfbWJ1c19jb25maWcsCiB9OwogCiBzdGF0aWMgdm9pZCBzaF9jc2kyX2h3aW5pdChzdHJ1Y3Qgc2hfY3NpMiAqcHJpdikKQEAgLTE0NCwxMSArMTcwLDIxIEBACiAJdWRlbGF5KDUpOwogCWlvd3JpdGUzMigweDAwMDAwMDAwLCBwcml2LT5iYXNlICsgU0hfQ1NJMl9TUlNUKTsKIAotCWlmIChwcml2LT5jbGllbnQtPmxhbmVzICYgMykKLQkJdG1wIHw9IHByaXYtPmNsaWVudC0+bGFuZXMgJiAzOwotCWVsc2UKLQkJLyogRGVmYXVsdCAtIGJvdGggbGFuZXMgKi8KLQkJdG1wIHw9IDM7CisJc3dpdGNoIChwZGF0YS0+dHlwZSkgeworCWNhc2UgU0hfQ1NJMkM6CisJCWlmIChwcml2LT5jbGllbnQtPmxhbmVzID09IDEpCisJCQl0bXAgfD0gMTsKKwkJZWxzZQorCQkJLyogRGVmYXVsdCAtIGJvdGggbGFuZXMgKi8KKwkJCXRtcCB8PSAzOworCQlicmVhazsKKwljYXNlIFNIX0NTSTJJOgorCQlpZiAoIXByaXYtPmNsaWVudC0+bGFuZXMgfHwgcHJpdi0+Y2xpZW50LT5sYW5lcyA+IDQpCisJCQkvKiBEZWZhdWx0IC0gYWxsIDQgbGFuZXMgKi8KKwkJCXRtcCB8PSAweGY7CisJCWVsc2UKKwkJCXRtcCB8PSAoMSA8PCBwcml2LT5jbGllbnQtPmxhbmVzKSAtIDE7CisJfQogCiAJaWYgKHByaXYtPmNsaWVudC0+cGh5ID09IFNIX0NTSTJfUEhZX01BSU4pCiAJCXRtcCB8PSAweDgwMDA7CkBAIC0xNjMsMzggKzE5OSwxOCBAQAogCWlvd3JpdGUzMih0bXAsIHByaXYtPmJhc2UgKyBTSF9DU0kyX0NIS1NVTSk7CiB9CiAKLXN0YXRpYyBpbnQgc2hfY3NpMl9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaF9jc2kyX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQljb25zdCB1bnNpZ25lZCBsb25nIGZsYWdzID0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKLQkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8Ci0JCVNPQ0FNX01BU1RFUiB8IFNPQ0FNX0RBVEFXSURUSF84IHwgU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKLQotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBzaF9jc2kyX2NsaWVudF9jb25uZWN0KHN0cnVjdCBzaF9jc2kyICpwcml2KQogewogCXN0cnVjdCBzaF9jc2kyX3BkYXRhICpwZGF0YSA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QsICpjc2kyX3NkID0gJnByaXYtPnN1YmRldjsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IE5VTEw7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopcHJpdi0+c3ViZGV2LmdycF9pZDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNsaWVudF9zZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KTsKLQlpbnQgaTsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmc7CisJdW5zaWduZWQgbG9uZyBjb21tb25fZmxhZ3MsIGNzaTJfZmxhZ3M7CisJaW50IGksIHJldDsKIAotCXY0bDJfZGV2aWNlX2Zvcl9lYWNoX3N1YmRldihzZCwgY3NpMl9zZC0+djRsMl9kZXYpCi0JCWlmIChzZC0+Z3JwX2lkKSB7Ci0JCQlpY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopc2QtPmdycF9pZDsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAoIWljZCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHByaXYtPmNsaWVudCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2NsaWVudHM7IGkrKykKIAkJaWYgKCZwZGF0YS0+Y2xpZW50c1tpXS5wZGV2LT5kZXYgPT0gaWNkLT5wZGV2KQpAQCAtMjA1LDE1ICsyMjEsNDIgQEAKIAlpZiAoaSA9PSBwZGF0YS0+bnVtX2NsaWVudHMpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogQ2hlY2sgaWYgd2UgY2FuIHN1cHBvcnQgdGhpcyBjYW1lcmEgKi8KKwljc2kyX2ZsYWdzID0gVjRMMl9NQlVTX0NTSTJfQ09OVElOVU9VU19DTE9DSyB8IFY0TDJfTUJVU19DU0kyXzFfTEFORTsKKworCXN3aXRjaCAocGRhdGEtPnR5cGUpIHsKKwljYXNlIFNIX0NTSTJDOgorCQlpZiAocGRhdGEtPmNsaWVudHNbaV0ubGFuZXMgIT0gMSkKKwkJCWNzaTJfZmxhZ3MgfD0gVjRMMl9NQlVTX0NTSTJfMl9MQU5FOworCQlicmVhazsKKwljYXNlIFNIX0NTSTJJOgorCQlzd2l0Y2ggKHBkYXRhLT5jbGllbnRzW2ldLmxhbmVzKSB7CisJCWRlZmF1bHQ6CisJCQljc2kyX2ZsYWdzIHw9IFY0TDJfTUJVU19DU0kyXzRfTEFORTsKKwkJY2FzZSAzOgorCQkJY3NpMl9mbGFncyB8PSBWNEwyX01CVVNfQ1NJMl8zX0xBTkU7CisJCWNhc2UgMjoKKwkJCWNzaTJfZmxhZ3MgfD0gVjRMMl9NQlVTX0NTSTJfMl9MQU5FOworCQl9CisJfQorCisJY2ZnLnR5cGUgPSBWNEwyX01CVVNfQ1NJMjsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGNsaWVudF9zZCwgdmlkZW8sIGdfbWJ1c19jb25maWcsICZjZmcpOworCWlmIChyZXQgPT0gLUVOT0lPQ1RMQ01EKQorCQljb21tb25fZmxhZ3MgPSBjc2kyX2ZsYWdzOworCWVsc2UgaWYgKCFyZXQpCisJCWNvbW1vbl9mbGFncyA9IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKCZjZmcsCisJCQkJCQkJICBjc2kyX2ZsYWdzKTsKKwllbHNlCisJCWNvbW1vbl9mbGFncyA9IDA7CisKKwlpZiAoIWNvbW1vbl9mbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGwgZ29vZDogY2FtZXJhIE1JUEkgY29uZmlndXJhdGlvbiBzdXBwb3J0ZWQgKi8KKwlwcml2LT5taXBpX2ZsYWdzID0gY29tbW9uX2ZsYWdzOwogCXByaXYtPmNsaWVudCA9IHBkYXRhLT5jbGllbnRzICsgaTsKIAotCXByaXYtPnNldF9idXNfcGFyYW0JCT0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW07Ci0JcHJpdi0+cXVlcnlfYnVzX3BhcmFtCQk9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW07Ci0JaWNkLT5vcHMtPnNldF9idXNfcGFyYW0JCT0gc2hfY3NpMl9zZXRfYnVzX3BhcmFtOwotCWljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0JPSBzaF9jc2kyX3F1ZXJ5X2J1c19wYXJhbTsKLQotCWNzaTJfc2QtPmdycF9pZCA9IChsb25nKWljZDsKLQogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAogCXNoX2NzaTJfaHdpbml0KHByaXYpOwpAQCAtMjIzLDE2ICsyNjYsMTAgQEAKIAogc3RhdGljIHZvaWQgc2hfY3NpMl9jbGllbnRfZGlzY29ubmVjdChzdHJ1Y3Qgc2hfY3NpMiAqcHJpdikKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilwcml2LT5zdWJkZXYuZ3JwX2lkOworCWlmICghcHJpdi0+Y2xpZW50KQorCQlyZXR1cm47CiAKIAlwcml2LT5jbGllbnQgPSBOVUxMOwotCXByaXYtPnN1YmRldi5ncnBfaWQgPSAwOwotCi0JLyogRHJpdmVyIGlzIGFib3V0IHRvIGJlIHVuYm91bmQgKi8KLQlpY2QtPm9wcy0+c2V0X2J1c19wYXJhbQkJPSBwcml2LT5zZXRfYnVzX3BhcmFtOwotCWljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0JPSBwcml2LT5xdWVyeV9idXNfcGFyYW07Ci0JcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBOVUxMOwotCXByaXYtPnF1ZXJ5X2J1c19wYXJhbQkJPSBOVUxMOwogCiAJcG1fcnVudGltZV9wdXQodjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF92b3UuYwppbmRleCA2YTcyOTg3Li45NjQ0YmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc2hfdm91Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKaW5kZXggNWJkZmU3ZS4uYjcyNTgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMKQEAgLTUwLDQ5ICs1MCw2NSBAQAogc3RhdGljIExJU1RfSEVBRChkZXZpY2VzKTsKIHN0YXRpYyBERUZJTkVfTVVURVgobGlzdF9sb2NrKTsJCS8qIFByb3RlY3RzIHRoZSBsaXN0IG9mIGhvc3RzICovCiAKLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9wb3dlcl9zZXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAotCQkJCWludCBwb3dlcl9vbikKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wb3dlcl9vbihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlpbnQgcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKGljbC0+bnVtX3JlZ3VsYXRvcnMsCisJCQkJCWljbC0+cmVndWxhdG9ycyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpY2QtPnBkZXYsICJDYW5ub3QgZW5hYmxlIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAotCWlmIChwb3dlcl9vbikgewotCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoaWNsLT5udW1fcmVndWxhdG9ycywKLQkJCQkJICAgIGljbC0+cmVndWxhdG9ycyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGljZC0+cGRldiwgIkNhbm5vdCBlbmFibGUgcmVndWxhdG9yc1xuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJaWYgKGljbC0+cG93ZXIpCi0JCQlyZXQgPSBpY2wtPnBvd2VyKGljZC0+cGRldiwgcG93ZXJfb24pOworCWlmIChpY2wtPnBvd2VyKSB7CisJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCAxKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJCSJQbGF0Zm9ybSBmYWlsZWQgdG8gcG93ZXItb24gdGhlIGNhbWVyYS5cbiIpOwotCi0JCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGljbC0+bnVtX3JlZ3VsYXRvcnMsCi0JCQkJCSAgICAgICBpY2wtPnJlZ3VsYXRvcnMpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZWxpbmtwd3I7CiAJCX0KLQl9IGVsc2UgewotCQlyZXQgPSAwOwotCQlpZiAoaWNsLT5wb3dlcikKLQkJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCAwKTsKKwl9CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCAxKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EICYmIHJldCAhPSAtRU5PREVWKQorCQlnb3RvIGVzZHB3cjsKKworCXJldHVybiAwOworCitlc2Rwd3I6CisJaWYgKGljbC0+cG93ZXIpCisJCWljbC0+cG93ZXIoaWNkLT5wZGV2LCAwKTsKK2VsaW5rcHdyOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaWNsLT5udW1fcmVndWxhdG9ycywKKwkJCSAgICAgICBpY2wtPnJlZ3VsYXRvcnMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wb3dlcl9vZmYoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCWludCByZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCAwKTsKKworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PSU9DVExDTUQgJiYgcmV0ICE9IC1FTk9ERVYpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaWNsLT5wb3dlcikgeworCQlyZXQgPSBpY2wtPnBvd2VyKGljZC0+cGRldiwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGljZC0+cGRldiwKIAkJCQkiUGxhdGZvcm0gZmFpbGVkIHRvIHBvd2VyLW9mZiB0aGUgY2FtZXJhLlxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0KLQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAotCQkJCQkgICAgIGljbC0+cmVndWxhdG9ycyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGljZC0+cGRldiwgIkNhbm5vdCBkaXNhYmxlIHJlZ3VsYXRvcnNcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQogCX0KIAotCXJldHVybiAwOworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaWNsLT5udW1fcmVndWxhdG9ycywKKwkJCQkgICAgIGljbC0+cmVndWxhdG9ycyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKApAQCAtMTA4LDM4ICsxMjQsMzggQEAKIEVYUE9SVF9TWU1CT0woc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MpOwogCiAvKioKLSAqIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKCkgLSBhcHBseSBwbGF0Zm9ybSBTT0NBTV9TRU5TT1JfSU5WRVJUXyogZmxhZ3MKKyAqIHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoKSAtIGFwcGx5IHBsYXRmb3JtIFNPQ0FNX1NFTlNPUl9JTlZFUlRfKiBmbGFncwogICogQGljbDoJY2FtZXJhIHBsYXRmb3JtIHBhcmFtZXRlcnMKLSAqIEBmbGFnczoJZmxhZ3MgdG8gYmUgaW52ZXJ0ZWQgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKyAqIEBjZmc6CW1lZGlhIGJ1cyBjb25maWd1cmF0aW9uCiAgKiBAcmV0dXJuOglyZXN1bHRpbmcgZmxhZ3MKICAqLwotdW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQordW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZykKIHsKLQl1bnNpZ25lZCBsb25nIGY7CisJdW5zaWduZWQgbG9uZyBmLCBmbGFncyA9IGNmZy0+ZmxhZ3M7CiAKIAkvKiBJZiBvbmx5IG9uZSBvZiB0aGUgdHdvIHBvbGFyaXRpZXMgaXMgc3VwcG9ydGVkLCBzd2l0Y2ggdG8gdGhlIG9wcG9zaXRlICovCiAJaWYgKGljbC0+ZmxhZ3MgJiBTT0NBTV9TRU5TT1JfSU5WRVJUX0hTWU5DKSB7Ci0JCWYgPSBmbGFncyAmIChTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpOwotCQlpZiAoZiA9PSBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8fCBmID09IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpCi0JCQlmbGFncyBePSBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9MT1c7CisJCWYgPSBmbGFncyAmIChWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyk7CisJCWlmIChmID09IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSCB8fCBmID09IFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XKQorCQkJZmxhZ3MgXj0gVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1c7CiAJfQogCiAJaWYgKGljbC0+ZmxhZ3MgJiBTT0NBTV9TRU5TT1JfSU5WRVJUX1ZTWU5DKSB7Ci0JCWYgPSBmbGFncyAmIChTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpOwotCQlpZiAoZiA9PSBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8fCBmID09IFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpCi0JCQlmbGFncyBePSBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJCWYgPSBmbGFncyAmIChWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0ggfCBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVyk7CisJCWlmIChmID09IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8fCBmID09IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKQorCQkJZmxhZ3MgXj0gVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1c7CiAJfQogCiAJaWYgKGljbC0+ZmxhZ3MgJiBTT0NBTV9TRU5TT1JfSU5WRVJUX1BDTEspIHsKLQkJZiA9IGZsYWdzICYgKFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpOwotCQlpZiAoZiA9PSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfHwgZiA9PSBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKQotCQkJZmxhZ3MgXj0gU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwgU09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwkJZiA9IGZsYWdzICYgKFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORyk7CisJCWlmIChmID09IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfHwgZiA9PSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORykKKwkJCWZsYWdzIF49IFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcgfCBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORzsKIAl9CiAKIAlyZXR1cm4gZmxhZ3M7CiB9Ci1FWFBPUlRfU1lNQk9MKHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKTsKK0VYUE9SVF9TWU1CT0woc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyk7CiAKICNkZWZpbmUgcGl4Zm10c3RyKHgpICh4KSAmIDB4ZmYsICgoeCkgPj4gOCkgJiAweGZmLCAoKHgpID4+IDE2KSAmIDB4ZmYsIFwKIAkoKHgpID4+IDI0KSAmIDB4ZmYKQEAgLTIzMyw2ICsyNDksMTQgQEAKIAlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgc19zdGQsICphKTsKIH0KIAorc3RhdGljIGludCBzb2NfY2FtZXJhX2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqYSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKworCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBnX3N0ZCwgYSk7Cit9CisKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9lbnVtX2ZzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJCSBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSAqZnNpemUpCiB7CkBAIC0zMTgsNiArMzQyLDMyIEBACiAJCXJldHVybiB2YjJfZHFidWYoJmljZC0+dmIyX3ZpZHEsIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KIAorc3RhdGljIGludCBzb2NfY2FtZXJhX2NyZWF0ZV9idWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzICpjcmVhdGUpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKworCS8qIHZpZGVvYnVmMiBvbmx5ICovCisJaWYgKGljaS0+b3BzLT5pbml0X3ZpZGVvYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiB2YjJfY3JlYXRlX2J1ZnMoJmljZC0+dmIyX3ZpZHEsIGNyZWF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wcmVwYXJlX2J1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCisJLyogdmlkZW9idWYyIG9ubHkgKi8KKwlpZiAoaWNpLT5vcHMtPmluaXRfdmlkZW9idWYpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJcmV0dXJuIHZiMl9wcmVwYXJlX2J1ZigmaWNkLT52YjJfdmlkcSwgYik7Cit9CisKIC8qIEFsd2F5cyBlbnRlcmVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIGludCBzb2NfY2FtZXJhX2luaXRfdXNlcl9mb3JtYXRzKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewpAQCAtNDQ4LDcgKzQ5OCw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpOwogCWludCByZXQ7CiAKLQlpZiAoIWljZC0+b3BzKQorCWlmICghdG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpCiAJCS8qIE5vIGRldmljZSBkcml2ZXIgYXR0YWNoZWQgKi8KIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTQ3Niw3ICs1MjYsNyBAQAogCQkJfSwKIAkJfTsKIAotCQlyZXQgPSBzb2NfY2FtZXJhX3Bvd2VyX3NldChpY2QsIGljbCwgMSk7CisJCXJldCA9IHNvY19jYW1lcmFfcG93ZXJfb24oaWNkLCBpY2wpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXBvd2VyOwogCkBAIC01MTIsNiArNTYyLDcgQEAKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZWluaXR2YjsKIAkJfQorCQl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmaWNkLT5jdHJsX2hhbmRsZXIpOwogCX0KIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGljZDsKQEAgLTUyOSw3ICs1ODAsNyBAQAogZXJlc3VtZToKIAlpY2ktPm9wcy0+cmVtb3ZlKGljZCk7CiBlaWNpYWRkOgotCXNvY19jYW1lcmFfcG93ZXJfc2V0KGljZCwgaWNsLCAwKTsKKwlzb2NfY2FtZXJhX3Bvd2VyX29mZihpY2QsIGljbCk7CiBlcG93ZXI6CiAJaWNkLT51c2VfY291bnQtLTsKIAltb2R1bGVfcHV0KGljaS0+b3BzLT5vd25lcik7CkBAIC01NTMsNyArNjA0LDcgQEAKIAkJaWYgKGljaS0+b3BzLT5pbml0X3ZpZGVvYnVmMikKIAkJCXZiMl9xdWV1ZV9yZWxlYXNlKCZpY2QtPnZiMl92aWRxKTsKIAotCQlzb2NfY2FtZXJhX3Bvd2VyX3NldChpY2QsIGljbCwgMCk7CisJCXNvY19jYW1lcmFfcG93ZXJfb2ZmKGljZCwgaWNsKTsKIAl9CiAKIAlpZiAoaWNkLT5zdHJlYW1lciA9PSBmaWxlKQpAQCAtNzgxLDc1ICs4MzIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCi17Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKLQlpbnQgaTsKLQotCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCi0JaWYgKCFxYy0+aWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogRmlyc3QgY2hlY2sgaG9zdCBjb250cm9scyAqLwotCWZvciAoaSA9IDA7IGkgPCBpY2ktPm9wcy0+bnVtX2NvbnRyb2xzOyBpKyspCi0JCWlmIChxYy0+aWQgPT0gaWNpLT5vcHMtPmNvbnRyb2xzW2ldLmlkKSB7Ci0JCQltZW1jcHkocWMsICYoaWNpLT5vcHMtPmNvbnRyb2xzW2ldKSwKLQkJCQlzaXplb2YoKnFjKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JLyogVGhlbiBkZXZpY2UgY29udHJvbHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaWNkLT5vcHMtPm51bV9jb250cm9sczsgaSsrKQotCQlpZiAocWMtPmlkID09IGljZC0+b3BzLT5jb250cm9sc1tpXS5pZCkgewotCQkJbWVtY3B5KHFjLCAmKGljZC0+b3BzLT5jb250cm9sc1tpXSksCi0JCQkJc2l6ZW9mKCpxYykpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0JaW50IHJldDsKLQotCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCi0JaWYgKGljaS0+b3BzLT5nZXRfY3RybCkgewotCQlyZXQgPSBpY2ktPm9wcy0+Z2V0X2N0cmwoaWNkLCBjdHJsKTsKLQkJaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBnX2N0cmwsIGN0cmwpOwotfQotCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0JaW50IHJldDsKLQotCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCi0JaWYgKGljaS0+b3BzLT5zZXRfY3RybCkgewotCQlyZXQgPSBpY2ktPm9wcy0+c2V0X2N0cmwoaWNkLCBjdHJsKTsKLQkJaWYgKHJldCAhPSAtRU5PSU9DVExDTUQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX2N0cmwsIGN0cmwpOwotfQotCiBzdGF0aWMgaW50IHNvY19jYW1lcmFfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQogewpAQCAtMTAwMyw3ICs5ODUsNyBAQAogCQlnb3RvIGVpMmNnYTsKIAl9CiAKLQlpY2wtPmJvYXJkX2luZm8tPnBsYXRmb3JtX2RhdGEgPSBpY2Q7CisJaWNsLT5ib2FyZF9pbmZvLT5wbGF0Zm9ybV9kYXRhID0gaWNsOwogCiAJc3ViZGV2ID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmaWNpLT52NGwyX2RldiwgYWRhcCwKIAkJCQlpY2wtPmJvYXJkX2luZm8sIE5VTEwpOwpAQCAtMTA1MiwxMiArMTAzNCwyOSBAQAogCiAJZGV2X2luZm8oaWNkLT5wZGV2LCAiUHJvYmluZyAlc1xuIiwgZGV2X25hbWUoaWNkLT5wZGV2KSk7CiAKKwkvKgorCSAqIEN1cnJlbnRseSB0aGUgc3ViZGV2IHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGNvbnRyb2xzICgxMykgaXMKKwkgKiBvdjY1NTAuIFNvIGxldCdzIHBpY2sgMTYgYXMgYSBoaW50IGZvciB0aGUgY29udHJvbCBoYW5kbGVyLiBOb3RlCisJICogdGhhdCB0aGlzIGlzIGEgaGludCBvbmx5OiB0b28gbGFyZ2UgYW5kIHlvdSB3YXN0ZSBzb21lIG1lbW9yeSwgdG9vCisJICogc21hbGwgYW5kIHRoZXJlIGlzIGEgKHZlcnkpIHNtYWxsIHBlcmZvcm1hbmNlIGhpdCB3aGVuIGxvb2tpbmcgdXAKKwkgKiBjb250cm9scyBpbiB0aGUgaW50ZXJuYWwgaGFzaC4KKwkgKi8KKwlyZXQgPSB2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZpY2QtPmN0cmxfaGFuZGxlciwgMTYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KGljZC0+cGRldiwgaWNsLT5udW1fcmVndWxhdG9ycywKIAkJCQkgaWNsLT5yZWd1bGF0b3JzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcmVnOwogCi0JcmV0ID0gc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDEpOworCS8qCisJICogVGhpcyB3aWxsIG5vdCB5ZXQgY2FsbCB2NGwyX3N1YmRldl9jb3JlX29wczo6c19wb3dlcigxKSwgYmVjYXVzZSB0aGUKKwkgKiBzdWJkZXZpY2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHlldC4gV2UnbGwgaGF2ZSB0byBjYWxsIGl0IG9uY2UKKwkgKiBhZ2FpbiBhZnRlciBpbml0aWFsaXNhdGlvbiwgZXZlbiB0aG91Z2ggaXQgc2hvdWxkbid0IGJlIG5lZWRlZCwgd2UKKwkgKiBkb24ndCBkbyBhbnkgSU8gaGVyZS4KKwkgKi8KKwlyZXQgPSBzb2NfY2FtZXJhX3Bvd2VyX29uKGljZCwgaWNsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcG93ZXI7CiAKQEAgLTEwOTgsNiArMTA5Nyw3IEBACiAJCWlmICghY29udHJvbCB8fCAhY29udHJvbC0+ZHJpdmVyIHx8ICFkZXZfZ2V0X2RydmRhdGEoY29udHJvbCkgfHwKIAkJICAgICF0cnlfbW9kdWxlX2dldChjb250cm9sLT5kcml2ZXItPm93bmVyKSkgewogCQkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CisJCQlyZXQgPSAtRU5PREVWOwogCQkJZ290byBlbm9kcnY7CiAJCX0KIAl9CkBAIC0xMTA1LDYgKzExMDUsOSBAQAogCXNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzZC0+Z3JwX2lkID0gKGxvbmcpaWNkOwogCisJaWYgKHY0bDJfY3RybF9hZGRfaGFuZGxlcigmaWNkLT5jdHJsX2hhbmRsZXIsIHNkLT5jdHJsX2hhbmRsZXIpKQorCQlnb3RvIGVjdHJsOworCiAJLyogQXQgdGhpcyBwb2ludCBjbGllbnQgLnByb2JlKCkgc2hvdWxkIGhhdmUgcnVuIGFscmVhZHkgKi8KIAlyZXQgPSBzb2NfY2FtZXJhX2luaXRfdXNlcl9mb3JtYXRzKGljZCk7CiAJaWYgKHJldCA8IDApCkBAIC0xMTIzLDYgKzExMjYsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBldmlkc3RhcnQ7CiAKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCAxKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQorCQlnb3RvIGVzZHB3cjsKKwogCS8qIFRyeSB0byBpbXByb3ZlIG91ciBndWVzcyBvZiBhIHJlYXNvbmFibGUgd2luZG93IGZvcm1hdCAqLwogCWlmICghdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19mbXQsICZtZikpIHsKIAkJaWNkLT51c2VyX3dpZHRoCQk9IG1mLndpZHRoOwpAQCAtMTEzMywxNiArMTE0MCwxOSBAQAogCiAJaWNpLT5vcHMtPnJlbW92ZShpY2QpOwogCi0Jc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDApOworCXNvY19jYW1lcmFfcG93ZXJfb2ZmKGljZCwgaWNsKTsKIAogCW11dGV4X3VubG9jaygmaWNkLT52aWRlb19sb2NrKTsKIAogCXJldHVybiAwOwogCitlc2Rwd3I6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoaWNkLT52ZGV2KTsKIGV2aWRzdGFydDoKIAltdXRleF91bmxvY2soJmljZC0+dmlkZW9fbG9jayk7CiAJc29jX2NhbWVyYV9mcmVlX3VzZXJfZm9ybWF0cyhpY2QpOwogZWl1Zm10OgorZWN0cmw6CiAJaWYgKGljbC0+Ym9hcmRfaW5mbykgewogCQlzb2NfY2FtZXJhX2ZyZWVfaTJjKGljZCk7CiAJfSBlbHNlIHsKQEAgLTExNTIsMTMgKzExNjIsMTUgQEAKIGVub2RydjoKIGVhZGRkZXY6CiAJdmlkZW9fZGV2aWNlX3JlbGVhc2UoaWNkLT52ZGV2KTsKKwlpY2QtPnZkZXYgPSBOVUxMOwogZXZkYzoKIAlpY2ktPm9wcy0+cmVtb3ZlKGljZCk7CiBlYWRkOgotCXNvY19jYW1lcmFfcG93ZXJfc2V0KGljZCwgaWNsLCAwKTsKKwlzb2NfY2FtZXJhX3Bvd2VyX29mZihpY2QsIGljbCk7CiBlcG93ZXI6CiAJcmVndWxhdG9yX2J1bGtfZnJlZShpY2wtPm51bV9yZWd1bGF0b3JzLCBpY2wtPnJlZ3VsYXRvcnMpOwogZXJlZzoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZpY2QtPmN0cmxfaGFuZGxlcik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTE3Myw2ICsxMTg1LDcgQEAKIAogCUJVR19PTighaWNkLT5wYXJlbnQpOwogCisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmaWNkLT5jdHJsX2hhbmRsZXIpOwogCWlmICh2ZGV2KSB7CiAJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkZXYpOwogCQlpY2QtPnZkZXYgPSBOVUxMOwpAQCAtMTM2MywyNCArMTM3NiwyNCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHNvY19jYW1lcmFfaW9jdGxfb3BzID0gewogCS52aWRpb2NfcXVlcnljYXAJID0gc29jX2NhbWVyYV9xdWVyeWNhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAgPSBzb2NfY2FtZXJhX3RyeV9mbXRfdmlkX2NhcCwKIAkudmlkaW9jX2dfZm10X3ZpZF9jYXAgICAgPSBzb2NfY2FtZXJhX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gc29jX2NhbWVyYV9lbnVtX2ZtdF92aWRfY2FwLAogCS52aWRpb2Nfc19mbXRfdmlkX2NhcCAgICA9IHNvY19jYW1lcmFfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBzb2NfY2FtZXJhX2VudW1fZm10X3ZpZF9jYXAsCiAJLnZpZGlvY19lbnVtX2lucHV0CSA9IHNvY19jYW1lcmFfZW51bV9pbnB1dCwKIAkudmlkaW9jX2dfaW5wdXQJCSA9IHNvY19jYW1lcmFfZ19pbnB1dCwKIAkudmlkaW9jX3NfaW5wdXQJCSA9IHNvY19jYW1lcmFfc19pbnB1dCwKIAkudmlkaW9jX3Nfc3RkCQkgPSBzb2NfY2FtZXJhX3Nfc3RkLAorCS52aWRpb2NfZ19zdGQJCSA9IHNvY19jYW1lcmFfZ19zdGQsCiAJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgID0gc29jX2NhbWVyYV9lbnVtX2ZzaXplcywKIAkudmlkaW9jX3JlcWJ1ZnMJCSA9IHNvY19jYW1lcmFfcmVxYnVmcywKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAgPSBzb2NfY2FtZXJhX3RyeV9mbXRfdmlkX2NhcCwKIAkudmlkaW9jX3F1ZXJ5YnVmCSA9IHNvY19jYW1lcmFfcXVlcnlidWYsCiAJLnZpZGlvY19xYnVmCQkgPSBzb2NfY2FtZXJhX3FidWYsCiAJLnZpZGlvY19kcWJ1ZgkJID0gc29jX2NhbWVyYV9kcWJ1ZiwKKwkudmlkaW9jX2NyZWF0ZV9idWZzCSA9IHNvY19jYW1lcmFfY3JlYXRlX2J1ZnMsCisJLnZpZGlvY19wcmVwYXJlX2J1ZgkgPSBzb2NfY2FtZXJhX3ByZXBhcmVfYnVmLAogCS52aWRpb2Nfc3RyZWFtb24JID0gc29jX2NhbWVyYV9zdHJlYW1vbiwKIAkudmlkaW9jX3N0cmVhbW9mZgkgPSBzb2NfY2FtZXJhX3N0cmVhbW9mZiwKLQkudmlkaW9jX3F1ZXJ5Y3RybAkgPSBzb2NfY2FtZXJhX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybAkJID0gc29jX2NhbWVyYV9nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCSA9IHNvY19jYW1lcmFfc19jdHJsLAogCS52aWRpb2NfY3JvcGNhcAkJID0gc29jX2NhbWVyYV9jcm9wY2FwLAogCS52aWRpb2NfZ19jcm9wCQkgPSBzb2NfY2FtZXJhX2dfY3JvcCwKIAkudmlkaW9jX3NfY3JvcAkJID0gc29jX2NhbWVyYV9zX2Nyb3AsCkBAIC0xNDA5LDYgKzE0MjIsNyBAQAogCXZkZXYtPmlvY3RsX29wcwkJPSAmc29jX2NhbWVyYV9pb2N0bF9vcHM7CiAJdmRldi0+cmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAl2ZGV2LT50dm5vcm1zCQk9IFY0TDJfU1REX1VOS05PV047CisJdmRldi0+Y3RybF9oYW5kbGVyCT0gJmljZC0+Y3RybF9oYW5kbGVyOwogCXZkZXYtPmxvY2sJCT0gJmljZC0+dmlkZW9fbG9jazsKIAogCWljZC0+dmRldiA9IHZkZXY7CkBAIC0xNDI3LDExICsxNDQxLDYgQEAKIAlpZiAoIWljZC0+cGFyZW50KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghaWNkLT5vcHMgfHwKLQkgICAgIWljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0gfHwKLQkgICAgIWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShpY2QtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGljZC0+cGRldiwgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhX3BsYXRmb3JtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwppbmRleCA4MDY5Y2Q2Li40NDAyYThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYwpAQCAtMzAsMzIgKzMwLDEyIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihzdWJkZXYsIHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX3ByaXYsIHN1YmRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICpnZXRfaW5mbyhzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KLQkJdG9fcGxhdGZvcm1fZGV2aWNlKHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQlyZXR1cm4gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci19Ci0KIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKnAgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlyZXR1cm4gcC0+c2V0X2NhcHR1cmUocCwgZW5hYmxlKTsKIH0KIAotc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvY19jYW1lcmFfcGxhdGZvcm1fcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKnAgPSBnZXRfaW5mbyhpY2QpOwotCXJldHVybiBwLT5idXNfcGFyYW07Ci19Ci0KIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9maWxsX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKQEAgLTExNSw2ICs5NSwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCQkgICAgIHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJY2ZnLT5mbGFncyA9IHAtPm1idXNfcGFyYW07CisJY2ZnLT50eXBlID0gcC0+bWJ1c190eXBlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHBsYXRmb3JtX3N1YmRldl92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zX3N0cmVhbSwKIAkuZW51bV9tYnVzX2ZtdAk9IHNvY19jYW1lcmFfcGxhdGZvcm1fZW51bV9mbXQsCkBAIC0xMjMsNiArMTE0LDcgQEAKIAkudHJ5X21idXNfZm10CT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9maWxsX2ZtdCwKIAkuZ19tYnVzX2ZtdAk9IHNvY19jYW1lcmFfcGxhdGZvcm1fZmlsbF9mbXQsCiAJLnNfbWJ1c19mbXQJPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2ZpbGxfZm10LAorCS5nX21idXNfY29uZmlnCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9nX21idXNfY29uZmlnLAogfTsKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgcGxhdGZvcm1fc3ViZGV2X29wcyA9IHsKQEAgLTEzMCwxMSArMTIyLDYgQEAKIAkudmlkZW8JPSAmcGxhdGZvcm1fc3ViZGV2X3ZpZGVvX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgc29jX2NhbWVyYV9wbGF0Zm9ybV9vcHMgPSB7Ci0JLnNldF9idXNfcGFyYW0JCT0gc29jX2NhbWVyYV9wbGF0Zm9ybV9zZXRfYnVzX3BhcmFtLAotCS5xdWVyeV9idXNfcGFyYW0JPSBzb2NfY2FtZXJhX3BsYXRmb3JtX3F1ZXJ5X2J1c19wYXJhbSwKLX07Ci0KIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaTsKQEAgLTE2Myw4ICsxNTAsNiBAQAogCS8qIFNldCB0aGUgY29udHJvbCBkZXZpY2UgcmVmZXJlbmNlICovCiAJaWNkLT5jb250cm9sID0gJnBkZXYtPmRldjsKIAotCWljZC0+b3BzID0gJnNvY19jYW1lcmFfcGxhdGZvcm1fb3BzOwotCiAJaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCXY0bDJfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgJnBsYXRmb3JtX3N1YmRldl9vcHMpOwpAQCAtMTc4LDcgKzE2Myw2IEBACiAJcmV0dXJuIHJldDsKIAogZXZkcnM6Ci0JaWNkLT5vcHMgPSBOVUxMOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKHByaXYpOwogCXJldHVybiByZXQ7CkBAIC0xODcsMTEgKzE3MSwxMCBAQAogc3RhdGljIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX3ByaXYgKnByaXYgPSBnZXRfcHJpdihwZGV2KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICpwID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBwLT5pY2Q7CisJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldik7CiAKKwlwLT5pY2QtPmNvbnRyb2wgPSBOVUxMOwogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOwotCWljZC0+b3BzID0gTlVMTDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX21lZGlhYnVzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19tZWRpYWJ1cy5jCmluZGV4IGJlYTdjOWMuLmNmN2YyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX21lZGlhYnVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfbWVkaWFidXMuYwpAQCAtMzgzLDYgKzM4MywzOSBAQAogfQogRVhQT1JUX1NZTUJPTChzb2NfbWJ1c19nZXRfZm10ZGVzYyk7CiAKK3Vuc2lnbmVkIGludCBzb2NfbWJ1c19jb25maWdfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnLAorCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBjb21tb25fZmxhZ3M7CisJYm9vbCBoc3luYyA9IHRydWUsIHZzeW5jID0gdHJ1ZSwgcGNsaywgZGF0YSwgbW9kZTsKKwlib29sIG1pcGlfbGFuZXMsIG1pcGlfY2xvY2s7CisKKwljb21tb25fZmxhZ3MgPSBjZmctPmZsYWdzICYgZmxhZ3M7CisKKwlzd2l0Y2ggKGNmZy0+dHlwZSkgeworCWNhc2UgVjRMMl9NQlVTX1BBUkFMTEVMOgorCQloc3luYyA9IGNvbW1vbl9mbGFncyAmIChWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0ggfAorCQkJCQlWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVyk7CisJCXZzeW5jID0gY29tbW9uX2ZsYWdzICYgKFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8CisJCQkJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKTsKKwljYXNlIFY0TDJfTUJVU19CVDY1NjoKKwkJcGNsayA9IGNvbW1vbl9mbGFncyAmIChWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwKKwkJCQkgICAgICAgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpOworCQlkYXRhID0gY29tbW9uX2ZsYWdzICYgKFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdIIHwKKwkJCQkgICAgICAgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVyk7CisJCW1vZGUgPSBjb21tb25fZmxhZ3MgJiAoVjRMMl9NQlVTX01BU1RFUiB8IFY0TDJfTUJVU19TTEFWRSk7CisJCXJldHVybiAoIWhzeW5jIHx8ICF2c3luYyB8fCAhcGNsayB8fCAhZGF0YSB8fCAhbW9kZSkgPworCQkJMCA6IGNvbW1vbl9mbGFnczsKKwljYXNlIFY0TDJfTUJVU19DU0kyOgorCQltaXBpX2xhbmVzID0gY29tbW9uX2ZsYWdzICYgVjRMMl9NQlVTX0NTSTJfTEFORVM7CisJCW1pcGlfY2xvY2sgPSBjb21tb25fZmxhZ3MgJiAoVjRMMl9NQlVTX0NTSTJfTk9OQ09OVElOVU9VU19DTE9DSyB8CisJCQkJCSAgICAgVjRMMl9NQlVTX0NTSTJfQ09OVElOVU9VU19DTE9DSyk7CisJCXJldHVybiAoIW1pcGlfbGFuZXMgfHwgIW1pcGlfY2xvY2spID8gMCA6IGNvbW1vbl9mbGFnczsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKTsKKwogc3RhdGljIGludCBfX2luaXQgc29jX21idXNfaW5pdCh2b2lkKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zcjAzMHBjMzAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMKaW5kZXggOGFmYjBlOC4uZDFiMDdhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zcjAzMHBjMzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NyMDMwcGMzMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KQEAgLTcxNCwxMSArNzE1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNyMDMwcGMzMF9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHNyMDMwcGMzMF9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CkBAIC03NjQsNyArNzYwLDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHNyMDMwcGMzMF92aWRlb19vcHMgPSB7Ci0JLnNfc3RyZWFtCT0gc3IwMzBwYzMwX3Nfc3RyZWFtLAogCS5nX21idXNfZm10CT0gc3IwMzBwYzMwX2dfZm10LAogCS5zX21idXNfZm10CT0gc3IwMzBwYzMwX3NfZm10LAogCS50cnlfbWJ1c19mbXQJPSBzcjAzMHBjMzBfdHJ5X2ZtdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RrLXdlYmNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKaW5kZXggZDFhMmNlZi4uY2JjMTA1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdGstd2ViY2FtLmMKQEAgLTU1LDYgKzU1LDggQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU3ludGVrIERDMTEyNSB3ZWJjYW0gZHJpdmVyIik7CiAKIAorLyogYm9vbCBmb3Igd2ViY2FtIExFRCBtYW5hZ2VtZW50ICovCitpbnQgZmlyc3RfaW5pdCA9IDE7CiAKIC8qIFNvbWUgY2FtZXJhcyBoYXZlIGF1ZGlvIGludGVyZmFjZXMsIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRob3NlICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc3Rrd2ViY2FtX3RhYmxlW10gPSB7CkBAIC01MTgsNyArNTIwLDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQlmb3IgKGkgPSAwOyBpIDwgbl9zYnVmczsgaSsrKSB7CiAJCQlpZiAoc3RrX3NldHVwX3Npb2J1ZihkZXYsIGkpKQotCQkJCXJldHVybiAoZGV2LT5uX3NidWZzID4gMSk/IDAgOiAtRU5PTUVNOworCQkJCXJldHVybiAoZGV2LT5uX3NidWZzID4gMSA/IDAgOiAtRU5PTUVNKTsKIAkJCWRldi0+bl9zYnVmcyA9IGkrMTsKIAkJfQogCX0KQEAgLTU1OCw5ICs1NjAsMTQgQEAKIAl2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmcCk7CiAJZGV2ID0gdmRldl90b19jYW1lcmEodmRldik7CiAKLQlpZiAoZGV2ID09IE5VTEwgfHwgIWlzX3ByZXNlbnQoZGV2KSkgeworCWlmIChkZXYgPT0gTlVMTCB8fCAhaXNfcHJlc2VudChkZXYpKQogCQlyZXR1cm4gLUVOWElPOwotCX0KKworCWlmICghZmlyc3RfaW5pdCkKKwkJc3RrX2NhbWVyYV93cml0ZV9yZWcoZGV2LCAweDAsIDB4MjQpOworCWVsc2UKKwkJZmlyc3RfaW5pdCA9IDA7CisKIAlmcC0+cHJpdmF0ZV9kYXRhID0gZGV2OwogCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShkZXYtPmludGVyZmFjZSk7CiAKQEAgLTU3NCwxMCArNTgxLDEyIEBACiAJaWYgKGRldi0+b3duZXIgPT0gZnApIHsKIAkJc3RrX3N0b3Bfc3RyZWFtKGRldik7CiAJCXN0a19mcmVlX2J1ZmZlcnMoZGV2KTsKKwkJc3RrX2NhbWVyYV93cml0ZV9yZWcoZGV2LCAweDAsIDB4NDkpOyAvKiB0dXJuIG9mZiB0aGUgTEVEICovCisJCXVuc2V0X2luaXRpYWxpc2VkKGRldik7CiAJCWRldi0+b3duZXIgPSBOVUxMOwogCX0KIAotCWlmKGlzX3ByZXNlbnQoZGV2KSkKKwlpZiAoaXNfcHJlc2VudChkZXYpKQogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGV2LT5pbnRlcmZhY2UpOwogCiAJcmV0dXJuIDA7CkBAIC02NTQsNyArNjYzLDcgQEAKIAkJcmV0dXJuIFBPTExFUlI7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmRldi0+c2lvX2Z1bGwpKQotCQlyZXR1cm4gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXJldHVybiAwOwogfQpAQCAtODkxLDkgKzkwMCw5IEBACiAJc3RydWN0IHN0a19jYW1lcmEgKmRldiA9IHByaXY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGtfc2l6ZXMpCi0JCQkmJiBzdGtfc2l6ZXNbaV0ubSAhPSBkZXYtPnZzZXR0aW5ncy5tb2RlOwotCQlpKyspOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0a19zaXplcykgJiYKKwkJCXN0a19zaXplc1tpXS5tICE9IGRldi0+dnNldHRpbmdzLm1vZGU7IGkrKykKKwkJOwogCWlmIChpID09IEFSUkFZX1NJWkUoc3RrX3NpemVzKSkgewogCQlTVEtfRVJST1IoIkVSUk9SOiBtb2RlIGludmFsaWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzMDUsOSArMTMxNCw4IEBACiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CiAKIAllcnIgPSBzdGtfcmVnaXN0ZXJfdmlkZW9fZGV2aWNlKGRldik7Ci0JaWYgKGVycikgeworCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJcmV0dXJuIDA7CiAKQEAgLTEzNTAsNiArMTM1OCw3IEBACiAJCXJldHVybiAwOwogCXVuc2V0X2luaXRpYWxpc2VkKGRldik7CiAJc3RrX2luaXRpYWxpc2UoZGV2KTsKKwlzdGtfY2FtZXJhX3dyaXRlX3JlZyhkZXYsIDB4MCwgMHg0OSk7CiAJc3RrX3NldHVwX2Zvcm1hdChkZXYpOwogCWlmIChpc19zdHJlYW1pbmcoZGV2KSkKIAkJc3RrX3N0YXJ0X3N0cmVhbShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90Y204MjV4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RjbTgyNXguYwppbmRleCBiNmVlMWJkLi40NjJjYWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RjbTgyNXguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RjbTgyNXguYwpAQCAtMjcsNiArMjcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWludC1kZXZpY2UuaD4KIAogI2luY2x1ZGUgInRjbTgyNXguaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGltYmxvZ2l3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RpbWJsb2dpdy5jCmluZGV4IDg0Y2QxYjYuLmEwODk1YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGltYmxvZ2l3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvTWFrZWZpbGUKaW5kZXggODFiYjdmZC4uZWEwOWI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9NYWtlZmlsZQpAQCAtMiw4ICsyLDggQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX1RMRzIzMDApICs9IHBvc2VpZG9uLm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC9LY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy90bTYwMDAvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWFsc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDY3NWM3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1hbHNhLmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKgorICogIFN1cHBvcnQgZm9yIGF1ZGlvIGNhcHR1cmUgZm9yIHRtNTYwMC82MDAwLzYwMTAKKyAqICAgIChjKSAyMDA3LTIwMDggTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CisgKgorICogIEJhc2VkIG9uIGN4ODgtYWxzYS5jCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworCisjaW5jbHVkZSAidG02MDAwLmgiCisjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKKworI3VuZGVmIGRwcmludGsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgZG8gewkJCQkgICBcCisJaWYgKGRlYnVnID49IGxldmVsKQkJCQkJCSAgIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMvMTogIiBmbXQsIGNoaXAtPmNvcmUtPm5hbWUgLCAjIyBhcmcpOyBcCisJfSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCU1vZHVsZSBnbG9iYWwgc3RhdGljIHZhcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLworCitzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSB7MSwgWzEgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDF9OworCittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIHRtNjAwMHggc291bmRjYXJkLiBkZWZhdWx0IGVuYWJsZWQuIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgdG02MDAweCBjYXB0dXJlIGludGVyZmFjZShzKS4iKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJCU1vZHVsZSBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgZHJpdmVyIG1vZHVsZSBmb3IgdG01NjAwL3RtNjAwMC90bTYwMTAgYmFzZWQgVFYgY2FyZHMiKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7VHJpZGVudCx0bTU2MDB9LCIKKwkJCSJ7e1RyaWRlbnQsdG02MDAwfSwiCisJCQkie3tUcmlkZW50LHRtNjAxMH0iKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQlNb2R1bGUgc3BlY2lmaWMgZnVudGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQk9BUkQgU3BlY2lmaWM6IFNldHMgYXVkaW8gRE1BCisgKi8KKworc3RhdGljIGludCBfdG02MDAwX3N0YXJ0X2F1ZGlvX2RtYShzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7CisKKwlkcHJpbnRrKDEsICJTdGFydGluZyBhdWRpbyBETUFcbiIpOworCisJLyogRW5hYmxlcyBhdWRpbyAqLworCXRtNjAwMF9zZXRfcmVnX21hc2soY29yZSwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsIDB4NDAsIDB4NDApOworCisJdG02MDAwX3NldF9hdWRpb19iaXRyYXRlKGNvcmUsIDQ4MDAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQk9BUkQgU3BlY2lmaWM6IFJlc2V0cyBhdWRpbyBETUEKKyAqLworc3RhdGljIGludCBfdG02MDAwX3N0b3BfYXVkaW9fZG1hKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXApCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKKworCWRwcmludGsoMSwgIlN0b3BwaW5nIGF1ZGlvIERNQVxuIik7CisKKwkvKiBEaXNhYmxlcyBhdWRpbyAqLworCXRtNjAwMF9zZXRfcmVnX21hc2soY29yZSwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsIDB4MDAsIDB4NDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzcF9idWZmZXJfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJZHByaW50aygyLCAiRnJlZWluZyBidWZmZXJcbiIpOworCisJdmZyZWUoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSk7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IE5VTEw7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSAwOworfQorCitzdGF0aWMgaW50IGRzcF9idWZmZXJfYWxsb2Moc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBzaXplKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlkcHJpbnRrKDIsICJBbGxvY2F0aW5nIGJ1ZmZlclxuIik7CisKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgeworCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPiBzaXplKQorCQkJcmV0dXJuIDA7CisKKwkJZHNwX2J1ZmZlcl9mcmVlKHN1YnN0cmVhbSk7CisJfQorCisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHZtYWxsb2Moc2l6ZSk7CisJaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkJQUxTQSBQQ00gSW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERpZ2l0YWwgaGFyZHdhcmUgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIERFRkFVTFRfRklGT19TSVpFCTQwOTYKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF90bTYwMDBfZGlnaXRhbF9odyA9IHsKKwkuaW5mbyA9IFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCwKKwkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkucmF0ZV9taW4gPSA0ODAwMCwKKwkucmF0ZV9tYXggPSA0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDY0LAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gMTI1NDQsCisJLnBlcmlvZHNfbWluID0gMSwKKwkucGVyaW9kc19tYXggPSA5OCwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDYyNzIwICogOCwKK307CisKKy8qCisgKiBhdWRpbyBwY20gY2FwdHVyZSBvcGVuIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3RtNjAwMF9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsCisJCQkJCSBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gX2Vycm9yOworCisJY2hpcC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJcnVudGltZS0+aHcgPSBzbmRfdG02MDAwX2RpZ2l0YWxfaHc7CisKKwlyZXR1cm4gMDsKK19lcnJvcjoKKwlkcHJpbnRrKDEsICJFcnJvciBvcGVuaW5nIFBDTSFcbiIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBhdWRpbyBjbG9zZSBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF90bTYwMDBfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOworCisJaWYgKGF0b21pY19yZWFkKCZjb3JlLT5zdHJlYW1fc3RhcnRlZCkgPiAwKSB7CisJCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAwKTsKKwkJc2NoZWR1bGVfd29yaygmY29yZS0+d3FfdHJpZ2dlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2ZpbGxidWYoc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlLCBjaGFyICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBjb3JlLT5hZGV2OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY2hpcC0+c3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlLCBidWZfcG9zOworCWludCBsZW5ndGg7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvcmUtPnN0cmVhbV9zdGFydGVkKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghc2l6ZSB8fCAhc3Vic3RyZWFtKSB7CisJCWRwcmludGsoMSwgInN1YnN0cmVhbSB3YXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaWYgKCFydW50aW1lIHx8ICFydW50aW1lLT5kbWFfYXJlYSkgeworCQlkcHJpbnRrKDEsICJydW50aW1lIHdhcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnVmX3BvcyA9IGNoaXAtPmJ1Zl9wb3M7CisJc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOworCisJaWYgKHN0cmlkZSA9PSAwKSB7CisJCWRwcmludGsoMSwgInN0cmlkZSBpcyB6ZXJvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGVuZ3RoID0gc2l6ZSAvIHN0cmlkZTsKKwlpZiAobGVuZ3RoID09IDApIHsKKwkJZHByaW50aygxLCAiJXM6IGxlbmd0aCB3YXMgemVyb1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcHJpbnRrKDEsICJDb3B5aW5nICVkIGJ5dGVzIGF0ICVwWyVkXSAtIGJ1ZiBzaXplPSVkIHggJWRcbiIsIHNpemUsCisJCXJ1bnRpbWUtPmRtYV9hcmVhLCBidWZfcG9zLAorCQkodW5zaWduZWQgaW50KXJ1bnRpbWUtPmJ1ZmZlcl9zaXplLCBzdHJpZGUpOworCisJaWYgKGJ1Zl9wb3MgKyBsZW5ndGggPj0gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKKwkJdW5zaWduZWQgaW50IGNudCA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gYnVmX3BvczsKKwkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcyAqIHN0cmlkZSwgYnVmLCBjbnQgKiBzdHJpZGUpOworCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEsIGJ1ZiArIGNudCAqIHN0cmlkZSwKKwkJCWxlbmd0aCAqIHN0cmlkZSAtIGNudCAqIHN0cmlkZSk7CisJfSBlbHNlCisJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIGJ1Zl9wb3MgKiBzdHJpZGUsIGJ1ZiwKKwkJCWxlbmd0aCAqIHN0cmlkZSk7CisKKwlzbmRfcGNtX3N0cmVhbV9sb2NrKHN1YnN0cmVhbSk7CisKKwljaGlwLT5idWZfcG9zICs9IGxlbmd0aDsKKwlpZiAoY2hpcC0+YnVmX3BvcyA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJY2hpcC0+YnVmX3BvcyAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKworCWNoaXAtPnBlcmlvZF9wb3MgKz0gbGVuZ3RoOworCWlmIChjaGlwLT5wZXJpb2RfcG9zID49IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7CisJCWNoaXAtPnBlcmlvZF9wb3MgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCXBlcmlvZF9lbGFwc2VkID0gMTsKKwl9CisKKwlzbmRfcGNtX3N0cmVhbV91bmxvY2soc3Vic3RyZWFtKTsKKworCWlmIChwZXJpb2RfZWxhcHNlZCkKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBod19wYXJhbXMgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBzbmRfdG02MDAwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCWludCBzaXplLCByYzsKKworCXNpemUgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcykgKiBwYXJhbXNfcGVyaW9kcyhod19wYXJhbXMpOworCisJcmMgPSBkc3BfYnVmZmVyX2FsbG9jKHN1YnN0cmVhbSwgc2l6ZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBodyBmcmVlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgc25kX3RtNjAwMF9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKKworCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpID4gMCkgeworCQlhdG9taWNfc2V0KCZjb3JlLT5zdHJlYW1fc3RhcnRlZCwgMCk7CisJCXNjaGVkdWxlX3dvcmsoJmNvcmUtPndxX3RyaWdnZXIpOworCX0KKworCWRzcF9idWZmZXJfZnJlZShzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSBjYWxsYmFjaworICovCitzdGF0aWMgaW50IHNuZF90bTYwMDBfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJY2hpcC0+YnVmX3BvcyA9IDA7CisJY2hpcC0+cGVyaW9kX3BvcyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogdHJpZ2dlciBjYWxsYmFjaworICovCitzdGF0aWMgdm9pZCBhdWRpb190cmlnZ2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRtNjAwMF9jb3JlLAorCQkJCQkJd3FfdHJpZ2dlcik7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IGNvcmUtPmFkZXY7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNvcmUtPnN0cmVhbV9zdGFydGVkKSkgeworCQlkcHJpbnRrKDEsICJzdGFydGluZyBjYXB0dXJlIik7CisJCV90bTYwMDBfc3RhcnRfYXVkaW9fZG1hKGNoaXApOworCX0gZWxzZSB7CisJCWRwcmludGsoMSwgInN0b3BwaW5nIGNhcHR1cmUiKTsKKwkJX3RtNjAwMF9zdG9wX2F1ZGlvX2RtYShjaGlwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX3RtNjAwMF9jYXJkX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlhdG9taWNfc2V0KCZjb3JlLT5zdHJlYW1fc3RhcnRlZCwgMSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJYXRvbWljX3NldCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJc2NoZWR1bGVfd29yaygmY29yZS0+d3FfdHJpZ2dlcik7CisKKwlyZXR1cm4gZXJyOworfQorLyoKKyAqIHBvaW50ZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF90bTYwMDBfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcmV0dXJuIGNoaXAtPmJ1Zl9wb3M7Cit9CisKKy8qCisgKiBvcGVyYXRvcnMKKyAqLworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdG02MDAwX3BjbV9vcHMgPSB7CisJLm9wZW4gPSBzbmRfdG02MDAwX3BjbV9vcGVuLAorCS5jbG9zZSA9IHNuZF90bTYwMDBfY2xvc2UsCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9IHNuZF90bTYwMDBfaHdfcGFyYW1zLAorCS5od19mcmVlID0gc25kX3RtNjAwMF9od19mcmVlLAorCS5wcmVwYXJlID0gc25kX3RtNjAwMF9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX3RtNjAwMF9jYXJkX3RyaWdnZXIsCisJLnBvaW50ZXIgPSBzbmRfdG02MDAwX3BvaW50ZXIsCit9OworCisvKgorICogY3JlYXRlIGEgUENNIGRldmljZQorICovCisKKy8qIEZJWE1FOiBDb250cm9sIGludGVyZmFjZSAtIEhvdyB0byBjb250cm9sIHZvbHVtZS9tdXRlPyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJQmFzaWMgRmxvdyBmb3IgU291bmQgRGV2aWNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBbHNhIENvbnN0cnVjdG9yIC0gQ29tcG9uZW50IHByb2JlCisgKi8KK3N0YXRpYyBpbnQgdG02MDAwX2F1ZGlvX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHNuZF9jYXJkCQkqY2FyZDsKKwlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkCSpjaGlwOworCWludAkJCXJjOworCXN0YXRpYyBpbnQJCWRldm5yOworCWNoYXIJCQljb21wb25lbnRbMTRdOworCXN0cnVjdCBzbmRfcGNtCQkqcGNtOworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKGRldm5yID49IFNORFJWX0NBUkRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZW5hYmxlW2Rldm5yXSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyYyA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJ0bTYwMDAiLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOworCWlmIChyYyA8IDApIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IGNyZWF0ZSBjYXJkIGluc3RhbmNlICVkXG4iLCBkZXZucik7CisJCXJldHVybiByYzsKKwl9CisJc3RyY3B5KGNhcmQtPmRyaXZlciwgInRtNjAwMC1hbHNhIik7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlRNNTYwMC82MHgwIik7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIlRNNTYwMC82MHgwIEF1ZGlvIGF0IGJ1cyAlZCBkZXZpY2UgJWQiLAorCQlkZXYtPnVkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPnVkZXYtPmRldm51bSk7CisKKwlzcHJpbnRmKGNvbXBvbmVudCwgIlVTQiUwNHg6JTA0eCIsCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKwlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21wb25lbnQpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldi0+dWRldi0+ZGV2KTsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljaGlwLT5jb3JlID0gZGV2OworCWNoaXAtPmNhcmQgPSBjYXJkOworCWRldi0+YWRldiA9IGNoaXA7CisJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPnJlZ19sb2NrKTsKKworCXJjID0gc25kX3BjbV9uZXcoY2FyZCwgIlRNNjAwMCBBdWRpbyIsIDAsIDAsIDEsICZwY20pOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3JfY2hpcDsKKworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCXN0cmNweShwY20tPm5hbWUsICJUcmlkZW50IFRNNTYwMC82MHgwIik7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsICZzbmRfdG02MDAwX3BjbV9vcHMpOworCisJSU5JVF9XT1JLKCZkZXYtPndxX3RyaWdnZXIsIGF1ZGlvX3RyaWdnZXIpOworCXJjID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJvcl9jaGlwOworCisJZHByaW50aygxLCAiUmVnaXN0ZXJlZCBhdWRpbyBkcml2ZXIgZm9yICVzXG4iLCBjYXJkLT5sb25nbmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY2hpcDoKKwlrZnJlZShjaGlwKTsKKwlkZXYtPmFkZXYgPSBOVUxMOworZXJyb3I6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2F1ZGlvX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHNuZF90bTYwMDBfY2FyZAkqY2hpcCA9IGRldi0+YWRldjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNoaXAtPmNhcmQpCisJCXJldHVybiAwOworCisJc25kX2NhcmRfZnJlZShjaGlwLT5jYXJkKTsKKwljaGlwLT5jYXJkID0gTlVMTDsKKwlrZnJlZShjaGlwKTsKKwlkZXYtPmFkZXYgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX29wcyBhdWRpb19vcHMgPSB7CisJLnR5cGUJPSBUTTYwMDBfQVVESU8sCisJLm5hbWUJPSAiVE02MDAwIEF1ZGlvIEV4dGVuc2lvbiIsCisJLmluaXQJPSB0bTYwMDBfYXVkaW9faW5pdCwKKwkuZmluaQk9IHRtNjAwMF9hdWRpb19maW5pLAorCS5maWxsYnVmID0gdG02MDAwX2ZpbGxidWYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bTYwMDBfYWxzYV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZhdWRpb19vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX2Fsc2FfdW5yZWdpc3Rlcih2b2lkKQoreworCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmYXVkaW9fb3BzKTsKK30KKworbW9kdWxlX2luaXQodG02MDAwX2Fsc2FfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQodG02MDAwX2Fsc2FfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1jYXJkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMjU3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtY2FyZHMuYwpAQCAtMCwwICsxLDE0MDIgQEAKKy8qCisgKiAgdG02MDAwLWNhcmRzLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvdHZhdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2kyYy1hZGRyLmg+CisjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CisKKyNpbmNsdWRlICJ0bTYwMDAuaCIKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgorI2luY2x1ZGUgInhjNTAwMC5oIgorCisjZGVmaW5lIFRNNjAwMF9CT0FSRF9VTktOT1dOCQkJMAorI2RlZmluZSBUTTU2MDBfQk9BUkRfR0VORVJJQwkJCTEKKyNkZWZpbmUgVE02MDAwX0JPQVJEX0dFTkVSSUMJCQkyCisjZGVmaW5lIFRNNjAxMF9CT0FSRF9HRU5FUklDCQkJMworI2RlZmluZSBUTTU2MDBfQk9BUkRfMTBNT09OU19VVDgyMQkJNAorI2RlZmluZSBUTTU2MDBfQk9BUkRfMTBNT09OU19VVDMzMAkJNQorI2RlZmluZSBUTTYwMDBfQk9BUkRfQURTVEVDSF9EVUFMX1RWCQk2CisjZGVmaW5lIFRNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSCTcKKyNkZWZpbmUgVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWCTgKKyNkZWZpbmUgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBICQk5CisjZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSCQkxMAorI2RlZmluZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVIJCTExCisjZGVmaW5lIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRQkxMgorI2RlZmluZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMQkJMTMKKyNkZWZpbmUgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURQkJMTQKKyNkZWZpbmUgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEUJMTUKKyNkZWZpbmUgVE01NjAwX0JPQVJEX1RFUlJBVEVDX0dSQUJTVEVSCQkxNgorCisjZGVmaW5lIGlzX2dlbmVyaWMobW9kZWwpICgobW9kZWwgPT0gVE02MDAwX0JPQVJEX1VOS05PV04pIHx8IFwKKwkJCSAgIChtb2RlbCA9PSBUTTU2MDBfQk9BUkRfR0VORVJJQykgfHwgXAorCQkJICAgKG1vZGVsID09IFRNNjAwMF9CT0FSRF9HRU5FUklDKSB8fCBcCisJCQkgICAobW9kZWwgPT0gVE02MDEwX0JPQVJEX0dFTkVSSUMpKQorCisjZGVmaW5lIFRNNjAwMF9NQVhCT0FSRFMgICAgICAgIDE2CitzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRbXSAgICAgPSB7WzAgLi4uIChUTTYwMDBfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICBpbnQsIE5VTEwsIDA0NDQpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0bTYwMDBfZGV2dXNlZDsKKworCitzdHJ1Y3QgdG02MDAwX2JvYXJkIHsKKwljaGFyICAgICAgICAgICAgKm5hbWU7CisJY2hhcgkJZWVuYW1lWzE2XTsJCS8qIEVFUFJPTSBuYW1lICovCisJdW5zaWduZWQJZWVuYW1lX3NpemU7CQkvKiBzaXplIG9mIEVFUFJPTSBuYW1lICovCisJdW5zaWduZWQJZWVuYW1lX3BvczsJCS8qIFBvc2l0aW9uIHdoZXJlIGl0IGFwcGVhcnMgYXQgUk9NICovCisKKwlzdHJ1Y3QgdG02MDAwX2NhcGFiaWxpdGllcyBjYXBzOworCisJZW51bQkJdG02MDAwX2RldnR5cGUgdHlwZTsJLyogdmFyaWFudCBvZiB0aGUgY2hpcHNldCAqLworCWludCAgICAgICAgICAgICB0dW5lcl90eXBlOyAgICAgLyogdHlwZSBvZiB0aGUgdHVuZXIgKi8KKwlpbnQgICAgICAgICAgICAgdHVuZXJfYWRkcjsgICAgIC8qIHR1bmVyIGFkZHJlc3MgKi8KKwlpbnQgICAgICAgICAgICAgZGVtb2RfYWRkcjsgICAgIC8qIGRlbW9kdWxhdG9yIGFkZHJlc3MgKi8KKworCXN0cnVjdCB0bTYwMDBfZ3BpbyBncGlvOworCisJc3RydWN0IHRtNjAwMF9pbnB1dAl2aW5wdXRbM107CisJc3RydWN0IHRtNjAwMF9pbnB1dAlyaW5wdXQ7CisKKwljaGFyCQkqaXJfY29kZXM7Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9ib2FyZCB0bTYwMDBfYm9hcmRzW10gPSB7CisJW1RNNjAwMF9CT0FSRF9VTktOT1dOXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJVbmtub3duIHRtNjAwMCB2aWRlbyBncmFiYmVyIiwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyCT0gMSwKKwkJCS5oYXNfZWVwcm9tCT0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT18xLAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTU2MDBfQk9BUkRfR0VORVJJQ10gPSB7CisJCS5uYW1lICAgICAgICAgPSAiR2VuZXJpYyB0bTU2MDAgYm9hcmQiLAorCQkudHlwZSAgICAgICAgID0gVE01NjAwLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIJPSAxLAorCQkJLmhhc19lZXByb20JPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAwMF9CT0FSRF9HRU5FUklDXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJHZW5lcmljIHRtNjAwMCBib2FyZCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lcgk9IDEsCisJCQkuaGFzX2VlcHJvbQk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fMSwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDEwX0JPQVJEX0dFTkVSSUNdID0geworCQkubmFtZSAgICAgICAgID0gIkdlbmVyaWMgdG02MDEwIGJvYXJkIiwKKwkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyCT0gMSwKKwkJCS5oYXNfZHZiCT0gMSwKKwkJCS5oYXNfemwxMDM1Mwk9IDEsCisJCQkuaGFzX2VlcHJvbQk9IDEsCisJCQkuaGFzX3JlbW90ZQk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKKwkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCisJCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAorCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAorCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAorCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUODIxXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDgyMSIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCisJCS5lZW5hbWUgICAgICAgPSB7ICcxJywgJzAnLCAnTScsICdPJywgJ08nLCAnTicsICdTJywgJzUnLCAnNicsICcwJywgJzAnLCAweGZmLCAweDQ1LCAweDVifSwKKwkJLmVlbmFtZV9zaXplICA9IDE0LAorCQkuZWVuYW1lX3BvcyAgID0gMHgxNCwKKwkJLnR5cGUgICAgICAgICA9IFRNNTYwMCwKKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUMzMwXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDMzMCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQsCisJCS50dW5lcl9hZGRyICAgPSAweGM4ID4+IDEsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgID0gMCwKKwkJCS5oYXNfemwxMDM1MyAgPSAwLAorCQkJLmhhc19lZXByb20gICA9IDEsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAwMF9CT0FSRF9BRFNURUNIX0RVQUxfVFZdID0geworCQkubmFtZSAgICAgICAgID0gIkFEU1RFQ0ggRHVhbCBUViBVU0IiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAorCQkudHVuZXJfYWRkciAgID0gMHhjOCA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc190ZGE5ODc0ICA9IDEsCisJCQkuaGFzX2R2YiAgICAgID0gMSwKKwkJCS5oYXNfemwxMDM1MyAgPSAxLAorCQkJLmhhc19lZXByb20gICA9IDEsCisJCX0sCisJCS52aW5wdXQgPSB7IHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LAorCQl9LAorCX0sCisJW1RNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJGcmVlY29tIEh5YnJpZCBTdGljayAvIE1va2EgRFZCLVQgUmVjZWl2ZXIgRHVhbCIsCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLworCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgPSAxLAorCQkJLmhhc19kdmIgICAgICA9IDEsCisJCQkuaGFzX3psMTAzNTMgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgPSAwLAorCQkJLmhhc19yZW1vdGUgICA9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fNCwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJBRFNURUNIIE1pbmkgRHVhbCBUViBVU0IiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KKwkJLnR1bmVyX2FkZHIgICA9IDB4YzggPj4gMSwKKwkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICA9IDEsCisJCQkuaGFzX2VlcHJvbSAgID0gMCwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT180LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEhdID0geworCQkubmFtZSAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBIVlItOTAwSCAvIFdpblRWIFVTQjItU3RpY2siLAorCQkuZWVuYW1lICAgICAgID0geyAnSCcsIDAsICdWJywgMCwgJ1InLCAwLCAnOScsIDAsICcwJywgMCwgJzAnLCAwLCAnSCcsIDAgfSwKKwkJLmVlbmFtZV9zaXplICA9IDE0LAorCQkuZWVuYW1lX3BvcyAgID0gMHg0MiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwgLyogaGFzIGEgWEMzMDI4ICovCisJCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCisJCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCisJCS50eXBlICAgICAgICAgPSBUTTYwMTAsCisJCS5jYXBzID0geworCQkJLmhhc190dW5lciAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgID0gMSwKKwkJCS5oYXNfemwxMDM1MyAgPSAxLAorCQkJLmhhc19lZXByb20gICA9IDEsCisJCQkuaGFzX3JlbW90ZSAgID0gMSwKKwkJfSwKKwkJLmdwaW8gPSB7CisJCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18yLAorCQkJLnR1bmVyX29uCT0gVE02MDEwX0dQSU9fMywKKwkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCisJCQkuZGVtb2Rfb24JPSBUTTYwMTBfR1BJT180LAorCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzcsCisJCQkuZHZiX2xlZAk9IFRNNjAxMF9HUElPXzUsCisJCQkuaXIJCT0gVE02MDEwX0dQSU9fMCwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJfSwKKwlbVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJdID0geworCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBEVkItVC9UVi9GTSBVU0IyLjAiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICAgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgICA9IDEsCisJCQkuaGFzX3JlbW90ZSAgICAgPSAxLAorCQkJLmhhc19yYWRpbwk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKKwkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCisJCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJCS5yaW5wdXQgPSB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJdID0geworCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFZveWFnZXIgVFYvRk0gVVNCMi4wIiwKKwkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDNTAwMCwKKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgICAgPSAxLAorCQkJLmhhc19kdmIgICAgICAgID0gMCwKKwkJCS5oYXNfemwxMDM1MyAgICA9IDAsCisJCQkuaGFzX2VlcHJvbSAgICAgPSAxLAorCQkJLmhhc19yZW1vdGUgICAgID0gMSwKKwkJCS5oYXNfcmFkaW8JPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzAsCisJCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJCS5yaW5wdXQgPSB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEVdID0geworCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFhFIC8gQ2luZXJneSBIeWJyaWQtU3RpY2siLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKKwkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICA9IDEsCisJCQkuaGFzX2VlcHJvbSAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgPSAxLAorCQkJLmhhc19yYWRpbyAgICA9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKKwkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCisJCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAorCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAorCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAorCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCisJCX0sCisJCS5pcl9jb2RlcyA9IFJDX01BUF9ORUNfVEVSUkFURUNfQ0lORVJHWV9YUywKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAorCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKKwkJCX0sCisJCX0sCisJCS5yaW5wdXQgPSB7CisJCQkudHlwZSA9IFRNNjAwMF9JTlBVVF9SQURJTywKKwkJCS5hbXV4ID0gVE02MDAwX0FNVVhfU0lGMSwKKwkJfSwKKwl9LAorCVtUTTU2MDBfQk9BUkRfVEVSUkFURUNfR1JBQlNURVJdID0geworCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIEdyYWJzdGVyIEFWIDE1MC8yNTAgTVgiLAorCQkudHlwZSAgICAgICAgID0gVE01NjAwLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfQUJTRU5ULAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMV0gPSB7CisJCS5uYW1lICAgICAgICAgPSAiVHdpbmhhbiBUVTUwMSg3MDREMSkiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KKwkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKKwkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKKwkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKKwkJLmNhcHMgPSB7CisJCQkuaGFzX3R1bmVyICAgID0gMSwKKwkJCS5oYXNfZHZiICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICA9IDEsCisJCQkuaGFzX2VlcHJvbSAgID0gMSwKKwkJCS5oYXNfcmVtb3RlICAgPSAxLAorCQl9LAorCQkuZ3BpbyA9IHsKKwkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzIsCisJCQkudHVuZXJfb24JPSBUTTYwMTBfR1BJT18zLAorCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKKwkJCS5kZW1vZF9vbgk9IFRNNjAxMF9HUElPXzQsCisJCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNywKKwkJCS5kdmJfbGVkCT0gVE02MDEwX0dQSU9fNSwKKwkJCS5pcgkJPSBUTTYwMTBfR1BJT18wLAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sIHsKKwkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCisJCQl9LCB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAorCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFXSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJCZWhvbGRlciBXYW5kZXIgTGl0ZSBEVkItVC9UVi9GTSBVU0IyLjAiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgICAgPSAxLAorCQkJLmhhc196bDEwMzUzICAgID0gMSwKKwkJCS5oYXNfZWVwcm9tICAgICA9IDEsCisJCQkuaGFzX3JlbW90ZSAgICAgPSAwLAorCQkJLmhhc19yYWRpbwk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKKwkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCisJCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKKwkJfSwKKwkJLnZpbnB1dCA9IHsgeworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCisJCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCisJCQl9LAorCQl9LAorCQkucmlucHV0ID0geworCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfUkFESU8sCisJCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCisJCX0sCisJfSwKKwlbVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEVdID0geworCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFZveWFnZXIgTGl0ZSBUVi9GTSBVU0IyLjAiLAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAorCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAorCQkudHlwZSAgICAgICAgID0gVE02MDEwLAorCQkuY2FwcyA9IHsKKwkJCS5oYXNfdHVuZXIgICAgICA9IDEsCisJCQkuaGFzX2R2YiAgICAgICAgPSAwLAorCQkJLmhhc196bDEwMzUzICAgID0gMCwKKwkJCS5oYXNfZWVwcm9tICAgICA9IDEsCisJCQkuaGFzX3JlbW90ZSAgICAgPSAwLAorCQkJLmhhc19yYWRpbwk9IDEsCisJCX0sCisJCS5ncGlvID0geworCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKKwkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAorCQl9LAorCQkudmlucHV0ID0geyB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKKwkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKKwkJCX0sCisJCX0sCisJCS5yaW5wdXQgPSB7CisJCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKKwkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKKwkJfSwKKwl9LAorfTsKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHRtNjAwMF9pZF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4MDAwMSksIC5kcml2ZXJfaW5mbyA9IFRNNTYwMF9CT0FSRF9HRU5FUklDIH0sCisJeyBVU0JfREVWSUNFKDB4NjAwMCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0dFTkVSSUMgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNmUxLCAweGYzMzIpLCAuZHJpdmVyX2luZm8gPSBUTTYwMDBfQk9BUkRfQURTVEVDSF9EVUFMX1RWIH0sCisJeyBVU0JfREVWSUNFKDB4MTRhYSwgMHgwNjIwKSwgLmRyaXZlcl9pbmZvID0gVE02MDAwX0JPQVJEX0ZSRUVDT01fQU5EX1NJTUlMQVIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNmUxLCAweGIzMzkpLCAuZHJpdmVyX2luZm8gPSBUTTYwMDBfQk9BUkRfQURTVEVDSF9NSU5JX0RVQUxfVFYgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDY2MDApLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEggfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDY2MDEpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEggfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDY2MTApLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEggfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDQwLCAweDY2MTEpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEggfSwKKwl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzApLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUiB9LAorCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4ZGVjMSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUiB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA4NiksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRSB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDBBNSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRSB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA3OSksIC5kcml2ZXJfaW5mbyA9IFRNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUiB9LAorCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzI0MCksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxIH0sCisJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMjQxKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNDMpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAorCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzI2NCksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxIH0sCisJeyBVU0JfREVWSUNFKDB4NjAwMCwgMHhkZWMyKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURSB9LAorCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4ZGVjMyksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFIH0sCisJeyB9Cit9OworCisvKiBDb250cm9sIHBvd2VyIGxlZCBmb3Igc2hvdyBzb21lIGFjdGl2aXR5ICovCit2b2lkIHRtNjAwMF9mbGFzaF9sZWQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHN0YXRlKQoreworCS8qIFBvd2VyIExFRCB1bmNvbmZpZ3VyZWQgKi8KKwlpZiAoIWRldi0+Z3Bpby5wb3dlcl9sZWQpCisJCXJldHVybjsKKworCS8qIE9OIFBvd2VyIExFRCAqLworCWlmIChzdGF0ZSkgeworCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKKwkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6CisJCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgorCQljYXNlIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxOgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVI6CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSOgorCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEU6CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEU6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMSk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBPRkYgUG93ZXIgTEVEICovCisJZWxzZSB7CisJCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCQljYXNlIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSDoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMSk7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBUdW5lciBjYWxsYmFjayB0byBwcm92aWRlIHRoZSBwcm9wZXIgZ3BpbyBjaGFuZ2VzIG5lZWRlZCBmb3IgeGM1MDAwICovCitpbnQgdG02MDAwX3hjNTAwMF9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBwdHI7CisKKwlpZiAoZGV2LT50dW5lcl90eXBlICE9IFRVTkVSX1hDNTAwMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFhDNTAwMF9UVU5FUl9SRVNFVDoKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOworCQltc2xlZXAoMTUpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF94YzUwMDBfY2FsbGJhY2spOworCisvKiBUdW5lciBjYWxsYmFjayB0byBwcm92aWRlIHRoZSBwcm9wZXIgZ3BpbyBjaGFuZ2VzIG5lZWRlZCBmb3IgeGMyMDI4ICovCisKK2ludCB0bTYwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gcHRyOworCisJaWYgKGRldi0+dHVuZXJfdHlwZSAhPSBUVU5FUl9YQzIwMjgpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBYQzIwMjhfUkVTRVRfQ0xLOgorCQl0bTYwMDBfaXJfd2FpdChkZXYsIDApOworCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwKKwkJCQkJMHgwMiwgYXJnKTsKKwkJbXNsZWVwKDEwKTsKKwkJcmMgPSB0bTYwMDBfaTJjX3Jlc2V0KGRldiwgMTApOworCQlicmVhazsKKwljYXNlIFhDMjAyOF9UVU5FUl9SRVNFVDoKKwkJLyogUmVzZXQgY29kZXMgZHVyaW5nIGxvYWQgZmlybXdhcmUgKi8KKwkJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSAwOgorCQkJLyogbmV3ZXIgdHVuZXIgY2FuIGZhc3RlciByZXNldCAqLworCQkJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJCQljYXNlIFRNNTYwMF9CT0FSRF8xME1PT05TX1VUODIxOgorCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgMHgzMDAsIDB4MDEpOworCQkJCW1zbGVlcCgxMCk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAwKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICAweDMwMCwgMHgwMCk7CisJCQkJbXNsZWVwKDEwKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIDB4MzAwLCAweDAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgorCQkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJCQljYXNlIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxOgorCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCQkJbXNsZWVwKDYwKTsKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOworCQkJCW1zbGVlcCg3NSk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKKwkJCQltc2xlZXAoNjApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOworCQkJCW1zbGVlcCgxMzApOworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7CisJCQkJbXNsZWVwKDEzMCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXRtNjAwMF9pcl93YWl0KGRldiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULAorCQkJCQkJMHgwMiwgMHgwMSk7CisJCQltc2xlZXAoMTApOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJjID0gdG02MDAwX2kyY19yZXNldChkZXYsIDEwMCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFhDMjAyOF9JMkNfRkxVU0g6CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzUwX1NFVF9TVEFSVCwgMCwgMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzUxX1NFVF9TVE9QLCAwLCAwKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF90dW5lcl9jYWxsYmFjayk7CisKK2ludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJLyoKKwkgKiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSGFuZGxlcyBhbGwgR1BJTworCSAqIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlcyB0aGF0IGFyZSBib2FyZC1zcGVjaWZpYy4KKwkgKiBVcCB0byBub3csIGFsbCBmb3VuZCBkZXZpY2VzIHVzZSBHUElPMSBhbmQgR1BJTzQgYXQgdGhlIHNhbWUgd2F5LgorCSAqIFByb2JhYmx5LCB0aGV5J3JlIGFsbCBiYXNlZCBvbiBzb21lIHJlZmVyZW5jZSBkZXZpY2UuIER1ZSB0byB0aGF0LAorCSAqIHRoZXJlJ3MgYSBjb21tb24gcm91dGluZSBhdCB0aGUgZW5kIHRvIGhhbmRsZSB0aG9zZSBHUElPJ3MuIERldmljZXMKKwkgKiB0aGF0IHVzZSBkaWZmZXJlbnQgcGludXBzIG9yIGluaXQgc2VxdWVuY2VzIGNhbiBqdXN0IHJldHVybiBhdAorCSAqIHRoZSBib2FyZC1zcGVjaWZpYyBzZXNzaW9uLgorCSAqLworCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgorCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgorCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6CisJY2FzZSBUTTYwMTBfQk9BUkRfR0VORVJJQzoKKwkJLyogVHVybiB4Y2VpdmUgMzAyOCBvbiAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby50dW5lcl9vbiwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCS8qIFR1cm4gemFybGluayB6bDEwMzUzIG9uICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX29uLCAweDAwKTsKKwkJbXNsZWVwKDE1KTsKKwkJLyogUmVzZXQgemFybGluayB6bDEwMzUzICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX3Jlc2V0LCAweDAwKTsKKwkJbXNsZWVwKDUwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDEpOworCQltc2xlZXAoMTUpOworCQkvKiBUdXJuIHphcmxpbmsgemwxMDM1MyBvZmYgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDEpOworCQltc2xlZXAoMTUpOworCQkvKiBpciA/ICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmlyLCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOworCQltc2xlZXAoMTUpOworCQkvKiBEVkIgbGVkIG9mZiAob3JhbmdlKSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJLyogVHVybiB6YXJsaW5rIHpsMTAzNTMgb24gKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDApOworCQltc2xlZXAoMTUpOworCQlicmVhazsKKwljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgorCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKKwkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDEpOworCQltc2xlZXAoMTUpOworCQkvKiBSZXNldCB6YXJsaW5rIHpsMTAzNTMgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDApOworCQltc2xlZXAoNTApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9yZXNldCwgMHgwMSk7CisJCW1zbGVlcCgxNSk7CisJCWJyZWFrOworCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSOgorCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEU6CisJCS8qIFBvd2VyIGxlZCBvbiAoYmx1ZSkgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKKwkJbXNsZWVwKDE1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uLiBNb3N0IG9mIHRoZSBkZXZpY2VzIHNlZW0gdG8gdXNlIEdQSU8xCisJICogYW5kIEdQSU80Lm9uIHRoZSBzYW1lIHdheSwgc28sIHRoaXMgaGFuZGxlcyB0aGUgY29tbW9uIHNlcXVlbmNlCisJICogdXNlZCBieSBtb3N0IGRldmljZXMuCisJICogSWYgYSBkZXZpY2UgdXNlcyBhIGRpZmZlcmVudCBzZXF1ZW5jZSBvciBkaWZmZXJlbnQgR1BJTyBwaW5zIGZvcgorCSAqIHJlc2V0LCBqdXN0IGFkZCB0aGUgY29kZSBhdCB0aGUgYm9hcmQtc3BlY2lmaWMgcGFydAorCSAqLworCisJaWYgKGRldi0+Z3Bpby50dW5lcl9yZXNldCkgeworCQlpbnQgcmM7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAorCQkJCQkJZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAwKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIGRvaW5nIHR1bmVyIHJlc2V0XG4iLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCisJCQltc2xlZXAoMTApOyAvKiBKdXN0IHRvIGJlIGNvbnNlcnZhdGl2ZSAqLworCQkJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQkJCQlkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWkgZG9pbmcgdHVuZXIgcmVzZXRcbiIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIlR1bmVyIHJlc2V0IGlzIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1zbGVlcCg1MCk7CisKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9jb25maWdfdHVuZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKworCS8qIExvYWQgdHVuZXIgbW9kdWxlICovCisJdjRsMl9pMmNfbmV3X3N1YmRldigmZGV2LT52NGwyX2RldiwgJmRldi0+aTJjX2FkYXAsCisJCSJ0dW5lciIsIGRldi0+dHVuZXJfYWRkciwgTlVMTCk7CisKKwltZW1zZXQoJnR1bl9zZXR1cCwgMCwgc2l6ZW9mKHR1bl9zZXR1cCkpOworCXR1bl9zZXR1cC50eXBlID0gZGV2LT50dW5lcl90eXBlOworCXR1bl9zZXR1cC5hZGRyID0gZGV2LT50dW5lcl9hZGRyOworCisJdHVuX3NldHVwLm1vZGVfbWFzayA9IDA7CisJaWYgKGRldi0+Y2Fwcy5oYXNfdHVuZXIpCisJCXR1bl9zZXR1cC5tb2RlX21hc2sgfD0gKFRfQU5BTE9HX1RWIHwgVF9SQURJTyk7CisKKwlzd2l0Y2ggKGRldi0+dHVuZXJfdHlwZSkgeworCWNhc2UgVFVORVJfWEMyMDI4OgorCQl0dW5fc2V0dXAudHVuZXJfY2FsbGJhY2sgPSB0bTYwMDBfdHVuZXJfY2FsbGJhY2s7CisJCWJyZWFrOworCWNhc2UgVFVORVJfWEM1MDAwOgorCQl0dW5fc2V0dXAudHVuZXJfY2FsbGJhY2sgPSB0bTYwMDBfeGM1MDAwX2NhbGxiYWNrOworCQlicmVhazsKKwl9CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfdHlwZV9hZGRyLCAmdHVuX3NldHVwKTsKKworCXN3aXRjaCAoZGV2LT50dW5lcl90eXBlKSB7CisJY2FzZSBUVU5FUl9YQzIwMjg6IHsKKwkJc3RydWN0IHY0bDJfcHJpdl90dW5fY29uZmlnIHhjMjAyOF9jZmc7CisJCXN0cnVjdCB4YzIwMjhfY3RybCBjdGw7CisKKwkJbWVtc2V0KCZ4YzIwMjhfY2ZnLCAwLCBzaXplb2YoeGMyMDI4X2NmZykpOworCQltZW1zZXQoJmN0bCwgMCwgc2l6ZW9mKGN0bCkpOworCisJCWN0bC5kZW1vZCA9IFhDMzAyOF9GRV9aQVJMSU5LNDU2OworCisJCXhjMjAyOF9jZmcudHVuZXIgPSBUVU5FUl9YQzIwMjg7CisJCXhjMjAyOF9jZmcucHJpdiAgPSAmY3RsOworCisJCXN3aXRjaCAoZGV2LT5tb2RlbCkgeworCQljYXNlIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSDoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6CisJCQljdGwuZm5hbWUgPSAieGMzMDI4TC12MzYuZnciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApCisJCQkJY3RsLmZuYW1lID0gInhjMzAyOC12MjcuZnciOworCQkJZWxzZQorCQkJCWN0bC5mbmFtZSA9ICJ4YzMwMjgtdjI0LmZ3IjsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgZmlybXdhcmUgcGFyYW1ldGVycyBmb3IgeGMyMDI4XG4iKTsKKwkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2NvbmZpZywKKwkJCQkgICAgICZ4YzIwMjhfY2ZnKTsKKworCQl9CisJCWJyZWFrOworCWNhc2UgVFVORVJfWEM1MDAwOgorCQl7CisJCXN0cnVjdCB2NGwyX3ByaXZfdHVuX2NvbmZpZyAgeGM1MDAwX2NmZzsKKwkJc3RydWN0IHhjNTAwMF9jb25maWcgY3RsID0geworCQkJLmkyY19hZGRyZXNzID0gZGV2LT50dW5lcl9hZGRyLAorCQkJLmlmX2toeiAgICAgID0gNDU3MCwKKwkJCS5yYWRpb19pbnB1dCA9IFhDNTAwMF9SQURJT19GTTFfTU9OTywKKwkJCX07CisKKwkJeGM1MDAwX2NmZy50dW5lciA9IFRVTkVSX1hDNTAwMDsKKwkJeGM1MDAwX2NmZy5wcml2ICA9ICZjdGw7CisKKwkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2NvbmZpZywKKwkJCQkgICAgICZ4YzUwMDBfY2ZnKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIHR1bmVyIHR5cGUuIFR1bmVyIGlzIG5vdCBjb25maWd1cmVkLlxuIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBmaWxsX2JvYXJkX3NwZWNpZmljX2RhdGEoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaW50IHJjOworCisJZGV2LT5kZXZfdHlwZSAgID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS50eXBlOworCWRldi0+dHVuZXJfdHlwZSA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udHVuZXJfdHlwZTsKKwlkZXYtPnR1bmVyX2FkZHIgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnR1bmVyX2FkZHI7CisKKwlkZXYtPmdwaW8gPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmdwaW87CisKKwlkZXYtPmlyX2NvZGVzID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5pcl9jb2RlczsKKworCWRldi0+ZGVtb2RfYWRkciA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uZGVtb2RfYWRkcjsKKworCWRldi0+Y2FwcyA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uY2FwczsKKworCWRldi0+dmlucHV0WzBdID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS52aW5wdXRbMF07CisJZGV2LT52aW5wdXRbMV0gPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnZpbnB1dFsxXTsKKwlkZXYtPnZpbnB1dFsyXSA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udmlucHV0WzJdOworCWRldi0+cmlucHV0ID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5yaW5wdXQ7CisKKwkvKiBzZXR1cCBwZXItbW9kZWwgcXVpcmtzICovCisJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6CisJCWRldi0+cXVpcmtzIHw9IFRNNjAwMF9RVUlSS19OT19VU0JfREVMQVk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLworCXJjID0gdG02MDAwX2luaXQoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+dWRldi0+ZGV2LCAmZGV2LT52NGwyX2Rldik7Cit9CisKKworc3RhdGljIHZvaWQgdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaW50IGksIG1vZGVsID0gLTE7CisKKwlpZiAoIWRldi0+ZWVkYXRhX3NpemUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9ib2FyZHMpOyBpKyspIHsKKwkJaWYgKCF0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9zaXplKQorCQkJY29udGludWU7CisJCWlmIChkZXYtPmVlZGF0YV9zaXplIDwgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfcG9zICsKKwkJCQkgICAgICAgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbWVtY21wKCZkZXYtPmVlZGF0YVt0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9wb3NdLAorCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lLAorCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lX3NpemUpKSB7CisJCQltb2RlbCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobW9kZWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRldmljZSBoYXMgZWVwcm9tIGJ1dCBpcyBjdXJyZW50bHkgdW5rbm93blxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPm1vZGVsID0gbW9kZWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgaWRlbnRpZmllZCB2aWEgZWVwcm9tIGFzICVzICh0eXBlID0gJWQpXG4iLAorCSAgICAgICB0bTYwMDBfYm9hcmRzW21vZGVsXS5uYW1lLCBtb2RlbCk7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2luaXRfZGV2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOworCWludCByYyA9IDA7CisKKwltdXRleF9pbml0KCZkZXYtPmxvY2spOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisKKwlpZiAoIWlzX2dlbmVyaWMoZGV2LT5tb2RlbCkpIHsKKwkJcmMgPSBmaWxsX2JvYXJkX3NwZWNpZmljX2RhdGEoZGV2KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCisJCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KKwkJcmMgPSB0bTYwMDBfaTJjX3JlZ2lzdGVyKGRldik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeworCQkvKiByZWdpc3RlciBpMmMgYnVzICovCisJCXJjID0gdG02MDAwX2kyY19yZWdpc3RlcihkZXYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisKKwkJdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2QoZGV2KTsKKworCQlyYyA9IGZpbGxfYm9hcmRfc3BlY2lmaWNfZGF0YShkZXYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJLyogRGVmYXVsdCB2YWx1ZXMgZm9yIFNURCBhbmQgcmVzb2x1dGlvbnMgKi8KKwlkZXYtPndpZHRoID0gNzIwOworCWRldi0+aGVpZ2h0ID0gNDgwOworCWRldi0+bm9ybSA9IFY0TDJfU1REX1BBTF9NOworCisJLyogQ29uZmlndXJlIHR1bmVyICovCisJdG02MDAwX2NvbmZpZ190dW5lcihkZXYpOworCisJLyogU2V0IHZpZGVvIHN0YW5kYXJkICovCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIGNvcmUsIHNfc3RkLCBkZXYtPm5vcm0pOworCisJLyogU2V0IHR1bmVyIGZyZXF1ZW5jeSAtIGFsc28gbG9hZHMgZmlybXdhcmUgb24geGMyMDI4L3hjMzAyOCAqLworCWYudHVuZXIgPSAwOworCWYudHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCWYuZnJlcXVlbmN5ID0gMzA5MjsJLyogMTkzLjI1IE1IeiAqLworCWRldi0+ZnJlcSA9IGYuZnJlcXVlbmN5OworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksICZmKTsKKworCWlmIChkZXYtPmNhcHMuaGFzX3RkYTk4NzQpCisJCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAorCQkJInR2YXVkaW8iLCBJMkNfQUREUl9UREE5ODc0LCBOVUxMKTsKKworCS8qIHJlZ2lzdGVyIGFuZCBpbml0aWFsaXplIFY0TDIgKi8KKwlyYyA9IHRtNjAwMF92NGwyX3JlZ2lzdGVyKGRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwl0bTYwMDBfYWRkX2ludG9fZGV2bGlzdChkZXYpOworCXRtNjAwMF9pbml0X2V4dGVuc2lvbihkZXYpOworCisJdG02MDAwX2lyX2luaXQoZGV2KTsKKworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQorCitzdGF0aWMgdm9pZCBnZXRfbWF4X2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQkJICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQsCisJCQkgICAgIGNoYXIgKm1zZ3R5cGUsCisJCQkgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqY3Vycl9lLAorCQkJICAgICBzdHJ1Y3QgdG02MDAwX2VuZHBvaW50ICp0bV9lcCkKK3sKKwl1MTYgdG1wID0gbGUxNl90b19jcHUoY3Vycl9lLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRtcCAmIDB4N2ZmOworCisJaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlzaXplID0gc2l6ZSAqIGhiX211bHQodG1wKTsKKworCWlmIChzaXplID4gdG1fZXAtPm1heHNpemUpIHsKKwkJdG1fZXAtPmVuZHAgPSBjdXJyX2U7CisJCXRtX2VwLT5tYXhzaXplID0gc2l6ZTsKKwkJdG1fZXAtPmJJbnRlcmZhY2VOdW1iZXIgPSBhbHQtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkJdG1fZXAtPmJBbHRlcm5hdGVTZXR0aW5nID0gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOworCisJCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogJXMgZW5kcG9pbnQ6IDB4JTAyeCAobWF4IHNpemU9JXUgYnl0ZXMpXG4iLAorCQkJCQltc2d0eXBlLCBjdXJyX2UtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKKwkJCQkJc2l6ZSk7CisJfQorfQorCisvKgorICogdG02MDAwX3VzYl9wcm9iZSgpCisgKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgdG02MDAwX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gTlVMTDsKKwlpbnQgaSwgcmMgPSAwOworCWludCBuciA9IDA7CisJY2hhciAqc3BlZWQ7CisKKwl1c2JkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCisJLyogU2VsZWN0cyB0aGUgcHJvcGVyIGludGVyZmFjZSAqLworCXJjID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZGV2LCAwLCAxKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KKwluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnRtNjAwMF9kZXZ1c2VkLCBUTTYwMDBfTUFYQk9BUkRTKTsKKwlpZiAobnIgPj0gVE02MDAwX01BWEJPQVJEUykgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogU3VwcG9ydHMgb25seSAlaSB0bTYweHggYm9hcmRzLlxuIiwgVE02MDAwX01BWEJPQVJEUyk7CisJCXVzYl9wdXRfZGV2KHVzYmRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBkZXYgc3RydWN0ICovCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMCIgIjogb3V0IG9mIG1lbW9yeSFcbiIpOworCQl1c2JfcHV0X2Rldih1c2JkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOworCW11dGV4X2luaXQoJmRldi0+dXNiX2xvY2spOworCisJLyogSW5jcmVtZW50IHVzYWdlIGNvdW50ICovCisJc2V0X2JpdChuciwgJnRtNjAwMF9kZXZ1c2VkKTsKKwlzbnByaW50ZihkZXYtPm5hbWUsIDI5LCAidG02MDAwICMlZCIsIG5yKTsKKworCWRldi0+bW9kZWwgPSBpZC0+ZHJpdmVyX2luZm87CisJaWYgKGNhcmRbbnJdIDwgQVJSQVlfU0laRSh0bTYwMDBfYm9hcmRzKSkKKwkJZGV2LT5tb2RlbCA9IGNhcmRbbnJdOworCisJZGV2LT51ZGV2ID0gdXNiZGV2OworCWRldi0+ZGV2bm8gPSBucjsKKworCXN3aXRjaCAodXNiZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJc3BlZWQgPSAiMS41IjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfVU5LTk9XTjoKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlzcGVlZCA9ICIxMiI7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCXNwZWVkID0gIjQ4MCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNwZWVkID0gInVua25vd24iOworCX0KKworCS8qIEdldCBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7CisJCWludCBlcDsKKworCQlmb3IgKGVwID0gMDsgZXAgPCBpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0uZGVzYy5iTnVtRW5kcG9pbnRzOyBlcCsrKSB7CisJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmU7CisJCQlpbnQgZGlyX291dDsKKworCQkJZSA9ICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0uZW5kcG9pbnRbZXBdOworCisJCQlkaXJfb3V0ID0gKChlLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBhbHQgJWQsIGludGVyZmFjZSAlaSwgY2xhc3MgJWlcbiIsCisJCQkgICAgICAgaSwKKwkJCSAgICAgICBpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJICAgICAgIGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CisKKwkJCXN3aXRjaCAoZS0+ZGVzYy5ibUF0dHJpYnV0ZXMpIHsKKwkJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJCQlpZiAoIWRpcl9vdXQpIHsKKwkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCisJCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJICJCdWxrIElOIiwgZSwKKwkJCQkJCQkgJmRldi0+YnVsa19pbik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCisJCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJICJCdWxrIE9VVCIsIGUsCisJCQkJCQkJICZkZXYtPmJ1bGtfb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCQkJaWYgKCFkaXJfb3V0KSB7CisJCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAorCQkJCQkJCSAmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLAorCQkJCQkJCSAiSVNPQyBJTiIsIGUsCisJCQkJCQkJICZkZXYtPmlzb2NfaW4pOworCQkJCX0gZWxzZSB7CisJCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAorCQkJCQkJCSAmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLAorCQkJCQkJCSAiSVNPQyBPVVQiLCBlLAorCQkJCQkJCSAmZGV2LT5pc29jX291dCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCQkJaWYgKCFkaXJfb3V0KSB7CisJCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAorCQkJCQkJCSZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCisJCQkJCQkJIklOVCBJTiIsIGUsCisJCQkJCQkJJmRldi0+aW50X2luKTsKKwkJCQl9IGVsc2UgeworCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKKwkJCQkJCQkmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLAorCQkJCQkJCSJJTlQgT1VUIiwgZSwKKwkJCQkJCQkmZGV2LT5pbnRfb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogTmV3IHZpZGVvIGRldmljZSBAICVzIE1icHMgKCUwNHg6JTA0eCwgaWZudW0gJWQpXG4iLAorCQlzcGVlZCwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCWludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworLyogY2hlY2sgaWYgdGhlIHRoZSBkZXZpY2UgaGFzIHRoZSBpc28gaW4gZW5kcG9pbnQgYXQgdGhlIGNvcnJlY3QgcGxhY2UgKi8KKwlpZiAoIWRldi0+aXNvY19pbi5lbmRwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBwcm9iaW5nIGVycm9yOiBubyBJTiBJU09DIGVuZHBvaW50IVxuIik7CisJCXJjID0gLUVOT0RFVjsKKworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IEZvdW5kICVzXG4iLCB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUpOworCisJcmMgPSB0bTYwMDBfaW5pdF9kZXYoZGV2KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IEVycm9yICVkIHdoaWxlIHJlZ2lzdGVyaW5nXG4iLCByYyk7CisKKwljbGVhcl9iaXQobnIsICZ0bTYwMDBfZGV2dXNlZCk7CisJdXNiX3B1dF9kZXYodXNiZGV2KTsKKworCWtmcmVlKGRldik7CisJcmV0dXJuIHJjOworfQorCisvKgorICogdG02MDAwX3VzYl9kaXNjb25uZWN0KCkKKyAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaWNvbmVuY3RlZAorICogdmlkZW8gZGV2aWNlIHdpbGwgYmUgdW5yZWdpc3RlcmVkIG9uIHY0bDJfY2xvc2UgaW4gY2FzZSBpdCBpcyBzdGlsbCBvcGVuCisgKi8KK3N0YXRpYyB2b2lkIHRtNjAwMF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+bmFtZSk7CisKKwl0bTYwMDBfaXJfZmluaShkZXYpOworCisJaWYgKGRldi0+Z3Bpby5wb3dlcl9sZWQpIHsKKwkJc3dpdGNoIChkZXYtPm1vZGVsKSB7CisJCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgorCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKKwkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKKwkJCW1zbGVlcCgxNSk7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6CisJCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKKwkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKKwkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAwKTsKKwkJCW1zbGVlcCgxNSk7CisJCQlicmVhazsKKwkJfQorCX0KKwl0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKGRldik7CisKKwl0bTYwMDBfaTJjX3VucmVnaXN0ZXIoZGV2KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOworCisJZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOworCisJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKKworCXRtNjAwMF9jbG9zZV9leHRlbnNpb24oZGV2KTsKKwl0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOworCisJY2xlYXJfYml0KGRldi0+ZGV2bm8sICZ0bTYwMDBfZGV2dXNlZCk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHRtNjAwMF91c2JfZHJpdmVyID0geworCQkubmFtZSA9ICJ0bTYwMDAiLAorCQkucHJvYmUgPSB0bTYwMDBfdXNiX3Byb2JlLAorCQkuZGlzY29ubmVjdCA9IHRtNjAwMF91c2JfZGlzY29ubmVjdCwKKwkJLmlkX3RhYmxlID0gdG02MDAwX2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdG02MDAwX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMCIgIiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKKwkgICAgICAgKFRNNjAwMF9WRVJTSU9OICA+PiAxNikgJiAweGZmLAorCSAgICAgICAoVE02MDAwX1ZFUlNJT04gID4+IDgpICYgMHhmZiwgVE02MDAwX1ZFUlNJT04gICYgMHhmZik7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ0bTYwMDBfdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDAiCisJCQkgICAiIHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZC5cbiIsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciBhdCBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnRtNjAwMF91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodG02MDAwX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHRtNjAwMF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGFkYXB0ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4MzYxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1jb3JlLmMKQEAgLTAsMCArMSw5NjUgQEAKKy8qCisgKiAgdG02MDAwLWNvcmUuYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hlbCBMdWR3aWcgPG1pY2hlbC5sdWR3aWdAZ21haWwuY29tPgorICogICAgICAtIERWQi1UIHN1cHBvcnQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgInRtNjAwMC5oIgorI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorCisjZGVmaW5lIFVTQl9USU1FT1VUCSg1ICogSFopIC8qIG1zICovCisKK2ludCB0bTYwMDBfcmVhZF93cml0ZV91c2Ioc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcV90eXBlLCB1OCByZXEsCisJCQkgIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1OCAqYnVmLCB1MTYgbGVuKQoreworCWludCAgICAgICAgICByZXQsIGk7CisJdW5zaWduZWQgaW50IHBpcGU7CisJdTgJICAgICAqZGF0YSA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZkZXYtPnVzYl9sb2NrKTsKKworCWlmIChsZW4pCisJCWRhdGEgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmVxX3R5cGUgJiBVU0JfRElSX0lOKQorCQlwaXBlID0gdXNiX3JjdmN0cmxwaXBlKGRldi0+dWRldiwgMCk7CisJZWxzZSB7CisJCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKTsKKwkJbWVtY3B5KGRhdGEsIGJ1ZiwgbGVuKTsKKwl9CisKKwlpZiAodG02MDAwX2RlYnVnICYgVjRMMl9ERUJVR19JMkMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIihkZXYgJXAsIHBpcGUgJTA4eCk6ICIsIGRldi0+dWRldiwgcGlwZSk7CisKKwkJcHJpbnRrKEtFUk5fQ09OVCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiLAorCQkJKHJlcV90eXBlICYgVVNCX0RJUl9JTikgPyAiIElOIiA6ICJPVVQiLAorCQkJcmVxX3R5cGUsIHJlcSwgdmFsdWUmMHhmZiwgdmFsdWU+PjgsIGluZGV4JjB4ZmYsCisJCQlpbmRleD4+OCwgbGVuJjB4ZmYsIGxlbj4+OCk7CisKKwkJaWYgKCEocmVxX3R5cGUgJiBVU0JfRElSX0lOKSkgeworCQkJcHJpbnRrKEtFUk5fQ09OVCAiPj4+ICIpOworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgYnVmW2ldKTsKKwkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCX0KKwl9CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCBwaXBlLCByZXEsIHJlcV90eXBlLCB2YWx1ZSwgaW5kZXgsCisJCQkgICAgICBkYXRhLCBsZW4sIFVTQl9USU1FT1VUKTsKKworCWlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKQorCQltZW1jcHkoYnVmLCBkYXRhLCBsZW4pOworCisJaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiPDw8IChsZW49JWQpXG4iLCBsZW4pOworCisJCQlwcmludGsoS0VSTl9DT05UICIlczogRXJyb3IgIyVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJfSBlbHNlIGlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKSB7CisJCQlwcmludGsoS0VSTl9DT05UICI8PDwgIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBidWZbaV0pOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJfQorCX0KKworCWtmcmVlKGRhdGEpOworCW1zbGVlcCg1KTsKKworCW11dGV4X3VubG9jaygmZGV2LT51c2JfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHRtNjAwMF9zZXRfcmVnKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQoreworCXJldHVybgorCQl0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwKKwkJCQkgICAgICByZXEsIHZhbHVlLCBpbmRleCwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfc2V0X3JlZyk7CisKK2ludCB0bTYwMDBfZ2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKK3sKKwlpbnQgcmM7CisJdTggYnVmWzFdOworCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCisJCQkJCXZhbHVlLCBpbmRleCwgYnVmLCAxKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAqYnVmOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX2dldF9yZWcpOworCitpbnQgdG02MDAwX3NldF9yZWdfbWFzayhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsCisJCQkJCQl1MTYgaW5kZXgsIHUxNiBtYXNrKQoreworCWludCByYzsKKwl1OCBidWZbMV07CisJdTggbmV3X2luZGV4OworCisJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLCByZXEsCisJCQkJCXZhbHVlLCBpbmRleCwgYnVmLCAxKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW5ld19pbmRleCA9IChidWZbMF0gJiB+bWFzaykgfCAoaW5kZXggJiBtYXNrKTsKKworCWlmIChuZXdfaW5kZXggPT0gaW5kZXgpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAorCQkJCSAgICAgIHJlcSwgdmFsdWUsIG5ld19pbmRleCwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfc2V0X3JlZ19tYXNrKTsKKworaW50IHRtNjAwMF9nZXRfcmVnMTYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCit7CisJaW50IHJjOworCXU4IGJ1ZlsyXTsKKworCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAorCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgMik7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gYnVmWzFdfGJ1ZlswXTw8ODsKK30KKworaW50IHRtNjAwMF9nZXRfcmVnMzIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCit7CisJaW50IHJjOworCXU4IGJ1Zls0XTsKKworCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAorCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgNCk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gYnVmWzNdIHwgYnVmWzJdIDw8IDggfCBidWZbMV0gPDwgMTYgfCBidWZbMF0gPDwgMjQ7Cit9CisKK2ludCB0bTYwMDBfaTJjX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1MTYgdHNsZWVwKQoreworCWludCByYzsKKworCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBUTTYwMDBfR1BJT19DTEssIDApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1zbGVlcCh0c2xlZXApOworCisJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIFRNNjAwMF9HUElPX0NMSywgMSk7CisJbXNsZWVwKHRzbGVlcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQlpbnQgdmFsOworCisJCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsIDApICYgMHhmYzsKKwkJaWYgKGRldi0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9VWVZZKQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgdmFsKTsKKwkJZWxzZQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRiwgdmFsIHwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKGRldi0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9VWVZZKQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwKTsKKwkJZWxzZQorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweDkwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9zZXRfdmJpKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCS8qCisJICogRklYTUU6CisJICogVkJJIGxpbmVzIGFuZCBzdGFydC9lbmQgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIDYwSHogYW5kIDUwSHoKKwkgKiBTbywgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgY29uZmlnIHRvCisJICogc29tZXRoaW5nIHRoYXQgdGFrZXMgaXQgaW50byBhY2NvdW50LCBkb2luZyBzb21ldGhpbmcgZGlmZmVyZW50CisJICogaWYgKGRldi0+bm9ybSAmIFY0TDJfU1REXzUyNV82MCkKKwkgKi8KKworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDFfVEVMRVRFWFRfVkJJX0NPREUxLCAweDI3KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQyX1ZCSV9EQVRBX0hJR0hfTEVWRUwsIDB4NTUpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDNfVkJJX0RBVEFfVFlQRV9MSU5FNywgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0NF9WQklfREFUQV9UWVBFX0xJTkU4LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQ1X1ZCSV9EQVRBX1RZUEVfTElORTksIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjQ2X1ZCSV9EQVRBX1RZUEVfTElORTEwLCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0N19WQklfREFUQV9UWVBFX0xJTkUxMSwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNDhfVkJJX0RBVEFfVFlQRV9MSU5FMTIsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjQ5X1ZCSV9EQVRBX1RZUEVfTElORTEzLCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0QV9WQklfREFUQV9UWVBFX0xJTkUxNCwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNEJfVkJJX0RBVEFfVFlQRV9MSU5FMTUsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjRDX1ZCSV9EQVRBX1RZUEVfTElORTE2LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I0RF9WQklfREFUQV9UWVBFX0xJTkUxNywgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNEVfVkJJX0RBVEFfVFlQRV9MSU5FMTgsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjRGX1ZCSV9EQVRBX1RZUEVfTElORTE5LCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1MF9WQklfREFUQV9UWVBFX0xJTkUyMCwgMHg2Nik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNTFfVkJJX0RBVEFfVFlQRV9MSU5FMjEsIDB4NjYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjUyX1ZCSV9EQVRBX1RZUEVfTElORTIyLCAweDY2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1M19WQklfREFUQV9UWVBFX0xJTkUyMywgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwKKwkJCVRNNjAxMF9SRVEwN19SNTRfVkJJX0RBVEFfVFlQRV9STElORVMsIDB4MDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQlUTTYwMTBfUkVRMDdfUjU1X1ZCSV9MT09QX0ZJTFRFUl9HQUlOLCAweDAxKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1Nl9WQklfTE9PUF9GSUxURVJfSV9HQUlOLCAweDAwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOLCAweDAyKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEsIDB4MzUpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMCwgMHhhMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I1QV9WQklfVEVMRVRFWFRfRFRPMSwgMHgxMSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I1Ql9WQklfVEVMRVRFWFRfRFRPMCwgMHg0Yyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0MF9URUxFVEVYVF9WQklfQ09ERTAsIDB4MDEpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDApOworCX0KK30KKworaW50IHRtNjAwMF9pbml0X2FuYWxvZ19tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXU4IGFjdGl2ZSA9IFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGX0FVRElPX0VOQUJMRTsKKworCQlpZiAoIWRldi0+cmFkaW8pCisJCQlhY3RpdmUgfD0gVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUZfVklERU9fRU5BQkxFOworCisJCS8qIEVuYWJsZSB2aWRlbyBhbmQgYXVkaW8gKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGLAorCQkJCQkJCWFjdGl2ZSwgMHg2MCk7CisJCS8qIERpc2FibGUgVFMgaW5wdXQgKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwKKwkJCQkJCQkweDAwLCAweDQwKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGVzIHNvZnQgcmVzZXQgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxKTsKKworCQlpZiAoZGV2LT5zY2FsZXIpCisJCQkvKiBEaXNhYmxlIEhmaWx0ZXIgYW5kIEVuYWJsZSBUUyBEcm9wIGVyciAqLworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UsIDB4MjApOworCQllbHNlCS8qIEVuYWJsZSBIZmlsdGVyIGFuZCBkaXNhYmxlIFRTIERyb3AgZXJyICovCisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHg4MCk7CisKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4ODgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgyMyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEMV9BRERSX0ZPUl9SRVExLCAweGMwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQyX0FERFJfRk9SX1JFUTIsIDB4ZDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIsIDB4MDYpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREZfUFdET1dOX0FDTEssIDB4MWYpOworCisJCS8qIEFQIFNvZnR3YXJlIHJlc2V0ICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDApOworCisJCXRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChkZXYpOworCisJCS8qIERpc2FibGVzIHNvZnQgcmVzZXQgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwKTsKKwl9CisJbXNsZWVwKDIwKTsKKworCS8qIFR1bmVyIGZpcm13YXJlIGNhbiBub3cgYmUgbG9hZGVkICovCisKKwkvKgorCSAqIEZJWE1FOiBUaGlzIGlzIGEgaGFjayEgeGMzMDI4ICJzbGVlcHMiIHdoZW4gbm8gY2hhbm5lbCBpcyBkZXRlY3RlZAorCSAqIGZvciBtb3JlIHRoYW4gYSBmZXcgc2Vjb25kcy4gTm90IHN1cmUgd2h5LCBhcyB0aGlzIGJlaGF2aW9yIGRvZXMKKwkgKiBub3QgaGFwcGVuIG9uIG90aGVyIGRldmljZXMgd2l0aCB4YzMwMjguIFNvLCBJIHN1c3BlY3QgdGhhdCBpdAorCSAqIGlzIHlldCBhbm90aGVyIGJ1ZyBhdCB0bTYwMDAuIEFmdGVyIHN0YXJ0IHNsZWVwaW5nLCBkZWNvZGluZworCSAqIGRvZXNuJ3Qgc3RhcnQgYXV0b21hdGljYWxseS4gSW5zdGVhZCwgaXQgcmVxdWlyZXMgc29tZQorCSAqIEkyQyBjb21tYW5kcyB0byB3YWtlIGl0IHVwLiBBcyB3ZSB3YW50IHRvIGhhdmUgaW1hZ2UgYXQgdGhlCisJICogYmVnaW5uaW5nLCB3ZSBuZWVkZWQgdG8gYWRkIHRoaXMgaGFjay4gVGhlIGJldHRlciB3b3VsZCBiZSB0bworCSAqIGRpc2NvdmVyIHNvbWUgd2F5IHRvIG1ha2UgdG02MDAwIHRvIHdha2UgdXAgd2l0aG91dCB0aGlzIGhhY2suCisJICovCisJZi5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgJmYpOworCisJbXNsZWVwKDEwMCk7CisJdG02MDAwX3NldF9zdGFuZGFyZChkZXYpOworCXRtNjAwMF9zZXRfdmJpKGRldik7CisJdG02MDAwX3NldF9hdWRpb19iaXRyYXRlKGRldiwgNDgwMDApOworCisJLyogc3dpdGNoIGR2YiBsZWQgb2ZmICovCisJaWYgKGRldi0+Z3Bpby5kdmJfbGVkKSB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKKwkJCWRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJLyogRGlzYWJsZSB2aWRlbyBhbmQgYXVkaW8gKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGLAorCQkJCTB4MDAsIDB4NjApOworCQkvKiBFbmFibGUgVFMgaW5wdXQgKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwKKwkJCQkweDQwLCAweDQwKTsKKwkJLyogYWxsIHBvd2VyIGRvd24sIGJ1dCBub3QgdGhlIGRpZ2l0YWwgZGF0YSBwb3J0ICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOLCAweDI4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZmMpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHhmZik7CisJfSBlbHNlICB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREZfUFdET1dOX0FDTEssIDB4MDgpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTJfVkFEQ19TVEFUVVNfQ1RMLCAweDBjKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHhmZik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHhkOCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDQwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4MDkpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgzNyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEMV9BRERSX0ZPUl9SRVExLCAweGQ4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQyX0FERFJfRk9SX1JFUTIsIDB4YzApOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIsIDB4NjApOworCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwsIDB4MGMpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweGZmKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDA4KTsKKwkJbXNsZWVwKDUwKTsKKworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7CisJCW1zbGVlcCg1MCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAxKTsKKwkJbXNsZWVwKDUwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDApOworCQltc2xlZXAoMTAwKTsKKwl9CisKKwkvKiBzd2l0Y2ggZHZiIGxlZCBvbiAqLworCWlmIChkZXYtPmdwaW8uZHZiX2xlZCkgeworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCisJCQlkZXYtPmdwaW8uZHZiX2xlZCwgMHgwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZSk7CisKK3N0cnVjdCByZWdfaW5pdCB7CisJdTggcmVxOworCXU4IHJlZzsKKwl1OCB2YWw7Cit9OworCisvKiBUaGUgbWVhbmluZyBvZiB0aG9zZSBpbml0aWFsaXphdGlvbnMgYXJlIHVua25vd24gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnX2luaXQgdG02MDAwX2luaXRfdGFiW10gPSB7CisJLyogUkVHICBWQUxVRSAqLworCXsgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSywgMHgxZiB9LAorCXsgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4IH0sCisJeyBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SRDVfUE9XRVJTQVZFLCAweDRmIH0sCisJeyBUTTYwMDBfUkVRMDdfUkRBX0NMS19TRUwsIDB4MjMgfSwKKwl7IFRNNjAwMF9SRVEwN19SREJfT1VUX1NFTCwgMHgwOCB9LAorCXsgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwsIDB4MDAgfSwKKwl7IFRNNjAwMF9SRVEwN19SRTNfVkFEQ19JTlBfTFBGX1NFTDEsIDB4MTAgfSwKKwl7IFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MDAgfSwKKwl7IFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDAwIH0sCisJeyBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDY0IH0sCS8qIDQ4MDAwIGJpdHMvc2FtcGxlLCBleHRlcm5hbCBpbnB1dCAqLworCXsgVE02MDAwX1JFUTA3X1JFRV9WQURDX0NUUkxfU0VMX0NPTlRST0wsIDB4YzIgfSwKKworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAkJLyogU3RhcnQgb2Ygc29mdCByZXNldCAqLworCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1IwNV9OT0lTRV9USFJFU0hPTEQsIDB4NjQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIDB4ODIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDlfTFVNQV9CUklHSFRORVNTX0FESiwgMHgzNiB9LAorCXsgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIDB4NTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMENfQ0hST01BX0FHQ19DT05UUk9MLCAweDZhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjExX0FHQ19QRUFLX0NPTlRST0wsIDB4YzkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTJfQUdDX0dBVEVfU1RBUlRILCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjEzX0FHQ19HQVRFX1NUQVJUTCwgMHgzYiB9LAorCXsgVE02MDEwX1JFUTA3X1IxNF9BR0NfR0FURV9XSURUSCwgMHg0NyB9LAorCXsgVE02MDEwX1JFUTA3X1IxNV9BR0NfQlBfREVMQVksIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTdfSExPT1BfTUFYU1RBVEUsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4YiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGU5IH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjIwX0hTWU5DX1JJU0lOR19FREdFX1RJTUUsIDB4M2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMjFfSFNZTkNfUEhBU0VfT0ZGU0VULCAweDNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJEX0NIUk9NQV9CVVJTVF9FTkQsIDB4NDggfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzJfVlNZTkNfSExPQ0tfTUlOLCAweDc0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNF9WU1lOQ19BR0NfTUlOLCAweDc0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzZfVlNZTkNfVkJJX01JTiwgMHg3YSB9LAorCXsgVE02MDEwX1JFUTA3X1IzN19WU1lOQ19WQklfTUFYLCAweDI2IH0sCisJeyBUTTYwMTBfUkVRMDdfUjM4X1ZTWU5DX1RIUkVTSE9MRCwgMHg0MCB9LAorCXsgVE02MDEwX1JFUTA3X1IzOV9WU1lOQ19USU1FX0NPTlNUQU5ULCAweDBhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjQyX1ZCSV9EQVRBX0hJR0hfTEVWRUwsIDB4NTUgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTFfVkJJX0RBVEFfVFlQRV9MSU5FMjEsIDB4MTEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTVfVkJJX0xPT1BfRklMVEVSX0dBSU4sIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTiwgMHgwMiB9LAorCXsgVE02MDEwX1JFUTA3X1I1OF9WQklfQ0FQVElPTl9EVE8xLCAweDM1IH0sCisJeyBUTTYwMTBfUkVRMDdfUjU5X1ZCSV9DQVBUSU9OX0RUTzAsIDB4YTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SODBfQ09NQl9GSUxURVJfVFJFU0hPTEQsIDB4MTUgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyIH0sCisJeyBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4ODggfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwJCS8qIEVuZCBvZiB0aGUgc29mdCByZXNldCAqLworCXsgVE02MDEwX1JFUTA1X1IxOF9JTUFTSzcsIDB4MDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnX2luaXQgdG02MDEwX2luaXRfdGFiW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UsIDB4MDAgfSwKKwl7IFRNNjAxMF9SRVEwN19SQzRfSFNUQVJUMCwgMHhhMCB9LAorCXsgVE02MDEwX1JFUTA3X1JDNl9IRU5EMCwgMHg0MCB9LAorCXsgVE02MDEwX1JFUTA3X1JDQV9WRU5EMCwgMHgzMSB9LAorCXsgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYsIDB4ZTEgfSwKKwl7IFRNNjAxMF9SRVEwN19SRTBfRFZJREVPX1NPVVJDRSwgMHgwMyB9LAorCXsgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOLCAweDdmIH0sCisKKwl7IFRNNjAxMF9SRVEwOF9SRTJfUE9XRVJfRE9XTl9DVFJMMSwgMHhmMCB9LAorCXsgVE02MDEwX1JFUTA4X1JFM19BRENfSU4xX1NFTCwgMHhmNCB9LAorCXsgVE02MDEwX1JFUTA4X1JFNF9BRENfSU4yX1NFTCwgMHhmOCB9LAorCXsgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwsIDB4ZjIgfSwKKwl7IFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTCwgMHhmMCB9LAorCXsgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwsIDB4YzIgfSwKKwl7IFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywgMHg2MCB9LAorCXsgVE02MDEwX1JFUTA4X1JGMV9BQURDX1BPV0VSX0RPV04sIDB4ZmMgfSwKKworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMCB9LAorCXsgVE02MDEwX1JFUTA3X1IwNV9OT0lTRV9USFJFU0hPTEQsIDB4NjQgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIDB4ODIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDlfTFVNQV9CUklHSFRORVNTX0FESiwgMHgzNiB9LAorCXsgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIDB4NTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMENfQ0hST01BX0FHQ19DT05UUk9MLCAweDZhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjExX0FHQ19QRUFLX0NPTlRST0wsIDB4YzkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTJfQUdDX0dBVEVfU1RBUlRILCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjEzX0FHQ19HQVRFX1NUQVJUTCwgMHgzYiB9LAorCXsgVE02MDEwX1JFUTA3X1IxNF9BR0NfR0FURV9XSURUSCwgMHg0NyB9LAorCXsgVE02MDEwX1JFUTA3X1IxNV9BR0NfQlBfREVMQVksIDB4NmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTdfSExPT1BfTUFYU1RBVEUsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4YiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGU5IH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjIwX0hTWU5DX1JJU0lOR19FREdFX1RJTUUsIDB4M2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMjFfSFNZTkNfUEhBU0VfT0ZGU0VULCAweDNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJEX0NIUk9NQV9CVVJTVF9FTkQsIDB4NDggfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzJfVlNZTkNfSExPQ0tfTUlOLCAweDc0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNF9WU1lOQ19BR0NfTUlOLCAweDc0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzZfVlNZTkNfVkJJX01JTiwgMHg3YSB9LAorCXsgVE02MDEwX1JFUTA3X1IzN19WU1lOQ19WQklfTUFYLCAweDI2IH0sCisJeyBUTTYwMTBfUkVRMDdfUjM4X1ZTWU5DX1RIUkVTSE9MRCwgMHg0MCB9LAorCXsgVE02MDEwX1JFUTA3X1IzOV9WU1lOQ19USU1FX0NPTlNUQU5ULCAweDBhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjQyX1ZCSV9EQVRBX0hJR0hfTEVWRUwsIDB4NTUgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTFfVkJJX0RBVEFfVFlQRV9MSU5FMjEsIDB4MTEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTVfVkJJX0xPT1BfRklMVEVSX0dBSU4sIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTiwgMHgwMiB9LAorCXsgVE02MDEwX1JFUTA3X1I1OF9WQklfQ0FQVElPTl9EVE8xLCAweDM1IH0sCisJeyBUTTYwMTBfUkVRMDdfUjU5X1ZCSV9DQVBUSU9OX0RUTzAsIDB4YTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SODBfQ09NQl9GSUxURVJfVFJFU0hPTEQsIDB4MTUgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyIH0sCisJeyBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4ODggfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKworCXsgVE02MDEwX1JFUTA1X1IxOF9JTUFTSzcsIDB4MDAgfSwKKworCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIxLCAweGFhIH0sCisJeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjAsIDB4MzAgfSwKKwl7IFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMSwgMHgyMCB9LAorCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQwLCAweGQwIH0sCisJeyBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAyLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUkQ4X0lSLCAweDJmIH0sCisKKwkvKiBzZXQgcmVtb3RlIHdha2V1cCBrZXk6YW55IGtleSB3YWtldXAgKi8KKwl7IFRNNjAxMF9SRVEwN19SRTVfUkVNT1RFX1dBS0VVUCwgIDB4ZmUgfSwKKwl7IFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX1NFTCwgIDB4ZmYgfSwKK307CisKK2ludCB0bTYwMDBfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgYm9hcmQsIHJjID0gMCwgaSwgc2l6ZTsKKwlzdHJ1Y3QgcmVnX2luaXQgKnRhYjsKKworCS8qIENoZWNrIGJvYXJkIHJldmlzaW9uICovCisJYm9hcmQgPSB0bTYwMDBfZ2V0X3JlZzMyKGRldiwgUkVRXzQwX0dFVF9WRVJTSU9OLCAwLCAwKTsKKwlpZiAoYm9hcmQgPj0gMCkgeworCQlzd2l0Y2ggKGJvYXJkICYgMHhmZikgeworCQljYXNlIDB4ZjM6CisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCB0bTYwMDBcbiIpOworCQkJaWYgKGRldi0+ZGV2X3R5cGUgIT0gVE02MDAwKQorCQkJCWRldi0+ZGV2X3R5cGUgPSBUTTYwMDA7CisJCQlicmVhazsKKwkJY2FzZSAweGY0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgdG02MDEwXG4iKTsKKwkJCWlmIChkZXYtPmRldl90eXBlICE9IFRNNjAxMCkKKwkJCQlkZXYtPmRldl90eXBlID0gVE02MDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIGJvYXJkIHZlcnNpb24gPSAweCUwOHhcbiIsIGJvYXJkKTsKKwkJfQorCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIHdoaWxlIHJldHJpZXZpbmcgYm9hcmQgdmVyc2lvblxuIiwgYm9hcmQpOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXRhYiA9IHRtNjAxMF9pbml0X3RhYjsKKwkJc2l6ZSA9IEFSUkFZX1NJWkUodG02MDEwX2luaXRfdGFiKTsKKwl9IGVsc2UgeworCQl0YWIgPSB0bTYwMDBfaW5pdF90YWI7CisJCXNpemUgPSBBUlJBWV9TSVpFKHRtNjAwMF9pbml0X3RhYik7CisJfQorCisJLyogTG9hZCBib2FyZCdzIGluaXRpYWxpemF0aW9uIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgdGFiW2ldLnJlcSwgdGFiW2ldLnJlZywgdGFiW2ldLnZhbCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWkgd2hpbGUgc2V0dGluZyByZXEgJWQsICIKKwkJCQkJInJlZyAlZCB0byB2YWx1ZSAlZFxuIiwgcmMsCisJCQkJCXRhYltpXS5yZXEsIHRhYltpXS5yZWcsIHRhYltpXS52YWwpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJbXNsZWVwKDUpOyAvKiBKdXN0IHRvIGJlIGNvbnNlcnZhdGl2ZSAqLworCisJcmMgPSB0bTYwMDBfY2FyZHNfc2V0dXAoZGV2KTsKKworCXJldHVybiByYzsKK30KKworaW50IHRtNjAwMF9yZXNldChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgcGlwZTsKKwlpbnQgZXJyOworCisJbXNsZWVwKDUwMCk7CisKKwllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGRldi0+aXNvY19pbi5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQl0bTYwMDBfZXJyKCJmYWlsZWQgdG8gc2VsZWN0IGludGVyZmFjZSAlZCwgYWx0LiBzZXR0aW5nIDBcbiIsCisJCQkJZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldi0+dWRldik7CisJaWYgKGVyciA8IDApIHsKKwkJdG02MDAwX2VycigiZmFpbGVkIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZGV2LT5xdWlya3MgJiBUTTYwMDBfUVVJUktfTk9fVVNCX0RFTEFZKSA9PSAwKQorCQltc2xlZXAoNSk7CisKKwkvKgorCSAqIE5vdCBhbGwgZGV2aWNlcyBoYXZlIGludF9pbiBkZWZpbmVkCisJICovCisJaWYgKCFkZXYtPmludF9pbi5lbmRwKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIsIDIpOworCWlmIChlcnIgPCAwKSB7CisJCXRtNjAwMF9lcnIoImZhaWxlZCB0byBzZWxlY3QgaW50ZXJmYWNlICVkLCBhbHQuIHNldHRpbmcgMlxuIiwKKwkJCQlkZXYtPmlzb2NfaW4uYkludGVyZmFjZU51bWJlcik7CisJCXJldHVybiBlcnI7CisJfQorCisJbXNsZWVwKDUpOworCisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwKKwkJCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisKKwllcnIgPSB1c2JfY2xlYXJfaGFsdChkZXYtPnVkZXYsIHBpcGUpOworCWlmIChlcnIgPCAwKSB7CisJCXRtNjAwMF9lcnIoInVzYl9jbGVhcl9oYWx0IGZhaWxlZDogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKQoreworCWludCB2YWwgPSAwOworCXU4IGFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLworCXU4IGFyZWdfMGEgPSAweDkxOyAvKiBTSUYgNDhLSHogKi8KKworCXN3aXRjaCAoYml0cmF0ZSkgeworCWNhc2UgNDgwMDA6CisJCWFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLworCQlhcmVnXzBhID0gMHg5MTsgLyogU0lGIDQ4S0h6ICovCisJCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7CisJCWJyZWFrOworCWNhc2UgMzIwMDA6CisJCWFyZWdfZjAgPSAweDAwOyAvKiBBREMgTUNMSyA9IDM3NSBGcyAqLworCQlhcmVnXzBhID0gMHg5MDsgLyogU0lGIDMyS0h6ICovCisJCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJLyogZW5hYmxlIEkyUywgaWYgd2UgdXNlIHNpZiBvciBleHRlcm5hbCBJMlMgZGV2aWNlICovCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXZhbCA9IHRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QsIGFyZWdfMGEpOworCQlpZiAodmFsIDwgMCkKKwkJCXJldHVybiB2YWw7CisKKwkJdmFsID0gdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKKwkJCQkJCQlhcmVnX2YwLCAweGYwKTsKKwkJaWYgKHZhbCA8IDApCisJCQlyZXR1cm4gdmFsOworCX0gZWxzZSB7CisJCXZhbCA9IHRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLAorCQkJCQkJCWFyZWdfZjAsIDB4ZjApOworCQlpZiAodmFsIDwgMCkKKwkJCXJldHVybiB2YWw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9hdWRpb19iaXRyYXRlKTsKKworaW50IHRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQkvKiBBdWRpbyBjcm9zc2JhciBzZXR0aW5nLCBkZWZhdWx0IFNJRjEgKi8KKwkJdTggYXJlZ19mMDsKKworCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKKwkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgorCQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6CisJCQlhcmVnX2YwID0gMHgwMzsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6CisJCQlhcmVnX2YwID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCQlhcmVnX2YwID0gMHgwODsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0kyUzoKKwkJCWFyZWdfZjAgPSAweDA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogYXVkaW8gaW5wdXQgZG9zbid0IHN1cHBvcnRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwkJLyogU2V0IGF1ZGlvIGlucHV0IGNyb3NzYmFyICovCisJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCisJCQkJCQkJYXJlZ19mMCwgMHgwZik7CisJfSBlbHNlIHsKKwkJdTggYXJlZ19lYjsKKwkJLyogQXVkaW8gc2V0dGluZywgZGVmYXVsdCBMSU5FMSAqLworCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKKwkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgorCQkJYXJlZ19lYiA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgorCQkJYXJlZ19lYiA9IDB4MDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdWRpbyBpbnB1dCBkb3NuJ3Qgc3VwcG9ydFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCQkvKiBTZXQgYXVkaW8gaW5wdXQgKi8KKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsCisJCQkJCQkJYXJlZ19lYiwgMHgwZik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0bTYwMTBfc2V0X211dGVfc2lmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBtdXRlKQoreworCXU4IG11dGVfcmVnID0gMDsKKworCWlmIChtdXRlKQorCQltdXRlX3JlZyA9IDB4MDg7CisKKwl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QsIG11dGVfcmVnLCAweDA4KTsKK30KKworc3RhdGljIHZvaWQgdG02MDEwX3NldF9tdXRlX2FkYyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggbXV0ZSkKK3sKKwl1OCBtdXRlX3JlZyA9IDA7CisKKwlpZiAobXV0ZSkKKwkJbXV0ZV9yZWcgPSAweDIwOworCisJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7CisJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYyX0xFRlRfQ0hBTk5FTF9WT0wsCisJCQkJCQkJbXV0ZV9yZWcsIDB4MjApOworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGM19SSUdIVF9DSEFOTkVMX1ZPTCwKKwkJCQkJCQltdXRlX3JlZywgMHgyMCk7CisJfSBlbHNlIHsKKwkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wsCisJCQkJCQkJbXV0ZV9yZWcsIDB4MjApOworCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDAwX1JFUTA3X1JFRF9WQURDX0FBRENfUlZPTCwKKwkJCQkJCQltdXRlX3JlZywgMHgyMCk7CisJfQorfQorCitpbnQgdG02MDAwX3R2YXVkaW9fc2V0X211dGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCit7CisJZW51bSB0bTYwMDBfbXV4IG11eDsKKworCWlmIChkZXYtPnJhZGlvKQorCQltdXggPSBkZXYtPnJpbnB1dC5hbXV4OworCWVsc2UKKwkJbXV4ID0gZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0uYW11eDsKKworCXN3aXRjaCAobXV4KSB7CisJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgorCWNhc2UgVE02MDAwX0FNVVhfU0lGMjoKKwkJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKQorCQkJdG02MDEwX3NldF9tdXRlX3NpZihkZXYsIG11dGUpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBUTTU2MDAgYW5kIFRNNjAwMCBkb24ndCBoYXMiCisJCQkJCSIgU0lGIGF1ZGlvIGlucHV0cy4gUGxlYXNlIGNoZWNrIHRoZSAlcyIKKwkJCQkJIiBjb25maWd1cmF0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgVE02MDAwX0FNVVhfQURDMToKKwljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCXRtNjAxMF9zZXRfbXV0ZV9hZGMoZGV2LCBtdXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG02MDEwX3NldF92b2x1bWVfc2lmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgdm9sKQoreworCXU4IHZvbF9yZWc7CisKKwl2b2xfcmVnID0gdm9sICYgMHgwRjsKKworCWlmICh2b2wgPCAwKQorCQl2b2xfcmVnIHw9IDB4NDA7CisKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDdfQV9MRUZUX1ZPTCwgdm9sX3JlZyk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA4X0FfUklHSFRfVk9MLCB2b2xfcmVnKTsKK30KKworc3RhdGljIHZvaWQgdG02MDEwX3NldF92b2x1bWVfYWRjKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgdm9sKQoreworCXU4IHZvbF9yZWc7CisKKwl2b2xfcmVnID0gKHZvbCArIDB4MTApICYgMHgxZjsKKworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgeworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjJfTEVGVF9DSEFOTkVMX1ZPTCwgdm9sX3JlZyk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGM19SSUdIVF9DSEFOTkVMX1ZPTCwgdm9sX3JlZyk7CisJfSBlbHNlIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVDX1ZBRENfQUFEQ19MVk9MLCB2b2xfcmVnKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVEX1ZBRENfQUFEQ19SVk9MLCB2b2xfcmVnKTsKKwl9Cit9CisKK3ZvaWQgdG02MDAwX3NldF92b2x1bWUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCB2b2wpCit7CisJZW51bSB0bTYwMDBfbXV4IG11eDsKKworCWlmIChkZXYtPnJhZGlvKSB7CisJCW11eCA9IGRldi0+cmlucHV0LmFtdXg7CisJCXZvbCArPSA4OyAvKiBPZmZzZXQgdG8gMCBkQiAqLworCX0gZWxzZQorCQltdXggPSBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS5hbXV4OworCisJc3dpdGNoIChtdXgpIHsKKwljYXNlIFRNNjAwMF9BTVVYX1NJRjE6CisJY2FzZSBUTTYwMDBfQU1VWF9TSUYyOgorCQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApCisJCQl0bTYwMTBfc2V0X3ZvbHVtZV9zaWYoZGV2LCB2b2wpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJFUlJPUjogVE01NjAwIGFuZCBUTTYwMDAgZG9uJ3QgaGFzIgorCQkJCQkiIFNJRiBhdWRpbyBpbnB1dHMuIFBsZWFzZSBjaGVjayB0aGUgJXMiCisJCQkJCSIgY29uZmlndXJhdGlvbi5cbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgVE02MDAwX0FNVVhfQURDMToKKwljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCXRtNjAxMF9zZXRfdm9sdW1lX2FkYyhkZXYsIHZvbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIExJU1RfSEVBRCh0bTYwMDBfZGV2bGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHRtNjAwMF9kZXZsaXN0X211dGV4KTsKKworLyoKKyAqIHRtNjAwMF9yZWFsZWFzZV9yZXNvdXJjZSgpCisgKi8KKwordm9pZCB0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwltdXRleF9sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmRldi0+ZGV2bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Cit9OworCit2b2lkIHRtNjAwMF9hZGRfaW50b19kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsICZ0bTYwMDBfZGV2bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Cit9OworCisvKgorICogRXh0ZW5zaW9uIGludGVyZmFjZQorICovCisKK3N0YXRpYyBMSVNUX0hFQUQodG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KTsKKworaW50IHRtNjAwMF9jYWxsX2ZpbGxidWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGVudW0gdG02MDAwX29wc190eXBlIHR5cGUsCisJCQljaGFyICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOworCisJLyogRklYTUU6IHRtNjAwMF9leHRlbnNpb25fZGV2bGlzdF9sb2NrIHNob3VsZCBiZSBhIHNwaW5sb2NrICovCisKKwlpZiAoIWxpc3RfZW1wdHkoJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJCWlmIChvcHMtPmZpbGxidWYgJiYgb3BzLT50eXBlID09IHR5cGUpCisJCQkJb3BzLT5maWxsYnVmKGRldiwgYnVmLCBzaXplKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX29wcyAqb3BzKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gTlVMTDsKKworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZvcHMtPm5leHQsICZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdG02MDAwX2Rldmxpc3QsIGRldmxpc3QpIHsKKwkJb3BzLT5pbml0KGRldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbml0aWFsaXplZCAoJXMpIGV4dGVuc2lvblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgb3BzLT5uYW1lKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRtNjAwMF9yZWdpc3Rlcl9leHRlbnNpb24pOworCit2b2lkIHRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX29wcyAqb3BzKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gTlVMTDsKKworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnRtNjAwMF9kZXZsaXN0LCBkZXZsaXN0KQorCQlvcHMtPmZpbmkoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogUmVtb3ZlICglcykgZXh0ZW5zaW9uXG4iLCBvcHMtPm5hbWUpOworCWxpc3RfZGVsKCZvcHMtPm5leHQpOworCW11dGV4X3VubG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24pOworCit2b2lkIHRtNjAwMF9pbml0X2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX29wcyAqb3BzID0gTlVMTDsKKworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlpZiAoIWxpc3RfZW1wdHkoJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJCWlmIChvcHMtPmluaXQpCisJCQkJb3BzLT5pbml0KGRldik7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Cit9CisKK3ZvaWQgdG02MDAwX2Nsb3NlX2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX29wcyAqb3BzID0gTlVMTDsKKworCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKKwlpZiAoIWxpc3RfZW1wdHkoJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZ0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QsIG5leHQpIHsKKwkJCWlmIChvcHMtPmZpbmkpCisJCQkJb3BzLT5maW5pKGRldik7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtZHZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2YzEyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1kdmIuYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqICB0bTYwMDAtZHZiLmMgLSBkdmItdCBzdXBwb3J0IGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidG02MDAwLmgiCisjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKKworI2luY2x1ZGUgInpsMTAzNTMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisKKyNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKKyNpbmNsdWRlICJ4YzUwMDAuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgZHJpdmVyIGV4dGVuc2lvbiBtb2R1bGUgZm9yIHRtNTYwMC82MDAwLzYwMTAgYmFzZWQgVFYgY2FyZHMiKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LCB0bTU2MDB9LCIKKwkJCSJ7e1RyaWRlbnQsIHRtNjAwMH0sIgorCQkJInt7VHJpZGVudCwgdG02MDEwfSIpOworCitzdGF0aWMgaW50IGRlYnVnOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2UiKTsKKworc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCisJCQkJICAgIGludCBwYWNrZXQsIGludCBzdGF0dXMpCit7CisJY2hhciAqZXJybXNnID0gIlVua25vd24iOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIC1FTk9FTlQ6CisJCWVycm1zZyA9ICJ1bmxpbmtlZCBzeW5jaHJvbnVvdXNseSI7CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJCWVycm1zZyA9ICJ1bmxpbmtlZCBhc3luY2hyb251b3VzbHkiOworCQlicmVhazsKKwljYXNlIC1FTk9TUjoKKwkJZXJybXNnID0gIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiOworCQlicmVhazsKKwljYXNlIC1FUElQRToKKwkJZXJybXNnID0gIlN0YWxsZWQgKGRldmljZSBub3QgcmVzcG9uZGluZykiOworCQlicmVhazsKKwljYXNlIC1FT1ZFUkZMT1c6CisJCWVycm1zZyA9ICJCYWJibGUgKGJhZCBjYWJsZT8pIjsKKwkJYnJlYWs7CisJY2FzZSAtRVBST1RPOgorCQllcnJtc2cgPSAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSI7CisJCWJyZWFrOworCWNhc2UgLUVJTFNFUToKKwkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOworCQlicmVhazsKKwljYXNlIC1FVElNRToKKwkJZXJybXNnID0gIkRldmljZSBkb2VzIG5vdCByZXNwb25kIjsKKwkJYnJlYWs7CisJfQorCWlmIChwYWNrZXQgPCAwKSB7CisJCWRwcmludGsoZGV2LCAxLCAiVVJCIHN0YXR1cyAlZCBbJXNdLlxuIiwKKwkJCXN0YXR1cywgZXJybXNnKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKGRldiwgMSwgIlVSQiBwYWNrZXQgJWQsIHN0YXR1cyAlZCBbJXNdLlxuIiwKKwkJCXBhY2tldCwgc3RhdHVzLCBlcnJtc2cpOworCX0KK30KKworc3RhdGljIHZvaWQgdG02MDAwX3VyYl9yZWNlaXZlZChzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cyAhPSAwKQorCQlwcmludF9lcnJfc3RhdHVzKGRldiwgMCwgdXJiLT5zdGF0dXMpOworCWVsc2UgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApCisJCWR2Yl9kbXhfc3dmaWx0ZXIoJmRldi0+ZHZiLT5kZW11eCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJaWYgKGRldi0+ZHZiLT5zdHJlYW1zID4gMCkgeworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6ICBlcnJvciAlc1xuIiwgX19mdW5jX18pOworCQkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBwaXBlLCBzaXplOworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0YXJ0IHN0cmVhbSByZXF1ZXN0ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZGV2LT5tb2RlICE9IFRNNjAwMF9NT0RFX0RJR0lUQUwpIHsKKwkJdG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKGRldik7CisJCWRldi0+bW9kZSA9IFRNNjAwMF9NT0RFX0RJR0lUQUw7CisJfQorCisJZHZiLT5idWxrX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGR2Yi0+YnVsa191cmIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdXJiXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGlwZSA9IHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+YnVsa19pbi5lbmRwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MKKwkJCQkJCQkgICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKworCXNpemUgPSB1c2JfbWF4cGFja2V0KGRldi0+dWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCXNpemUgPSBzaXplICogMTU7IC8qIDUxMiB4IDggb3IgMTIgb3IgMTUgKi8KKworCWR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CisJCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IGFsbG9jYXRlIHRyYW5zZmVyIGJ1ZmZlciFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl1c2JfZmlsbF9idWxrX3VyYihkdmItPmJ1bGtfdXJiLCBkZXYtPnVkZXYsIHBpcGUsCisJCQkJCQkgZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkJIHNpemUsCisJCQkJCQkgdG02MDAwX3VyYl9yZWNlaXZlZCwgZGV2KTsKKworCXJldCA9IHVzYl9jbGVhcl9oYWx0KGRldi0+dWRldiwgcGlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGVycm9yICVpIGluICVzIGR1cmluZyBwaXBlIHJlc2V0XG4iLAorCQkJCQkJCXJldCwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogcGlwZSByZXNldHRlZFxuIik7CisKKy8qCW11dGV4X2xvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCisJcmV0ID0gdXNiX3N1Ym1pdF91cmIoZHZiLT5idWxrX3VyYiwgR0ZQX0tFUk5FTCk7CisKKy8qCW11dGV4X3VubG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBzdWJtaXQgb2YgdXJiIGZhaWxlZCAoZXJyb3I9JWkpXG4iLAorCQkJCQkJCQkJcmV0KTsKKworCQlrZnJlZShkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JfZnJlZV91cmIoZHZiLT5idWxrX3VyYik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9zdG9wX3N0cmVhbShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CisKKwlpZiAoZHZiLT5idWxrX3VyYikgeworCQlwcmludGsoS0VSTl9JTkZPICJ1cmIga2lsbGluZ1xuIik7CisJCXVzYl9raWxsX3VyYihkdmItPmJ1bGtfdXJiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXJiIGJ1ZmZlciBmcmVlXG4iKTsKKwkJa2ZyZWUoZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX2ZyZWVfdXJiKGR2Yi0+YnVsa191cmIpOworCQlkdmItPmJ1bGtfdXJiID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBkZW11eC0+cHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CisJcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgZmVlZCByZXF1ZXN0ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZkdmItPm11dGV4KTsKKwlpZiAoZHZiLT5zdHJlYW1zID09IDApIHsKKwkJZHZiLT5zdHJlYW1zID0gMTsKKy8qCQltdXRleF9pbml0KCZ0bTYwMDBfZGV2LT5zdHJlbWluZ19tdXRleCk7ICovCisJCXRtNjAwMF9zdGFydF9zdHJlYW0oZGV2KTsKKwl9IGVsc2UKKwkJKysoZHZiLT5zdHJlYW1zKTsKKwltdXRleF91bmxvY2soJmR2Yi0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGRlbXV4LT5wcml2OworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogZ290IHN0b3AgZmVlZCByZXF1ZXN0ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZkdmItPm11dGV4KTsKKworCXByaW50ayhLRVJOX0lORk8gInN0cmVhbSAlI3hcbiIsIGR2Yi0+c3RyZWFtcyk7CisJLS0oZHZiLT5zdHJlYW1zKTsKKwlpZiAoZHZiLT5zdHJlYW1zID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3RvcCBzdHJlYW1cbiIpOworCQl0bTYwMDBfc3RvcF9zdHJlYW0oZGV2KTsKKy8qCQltdXRleF9kZXN0cm95KCZ0bTYwMDBfZGV2LT5zdHJlYW1pbmdfbXV0ZXgpOyAqLworCX0KKwltdXRleF91bmxvY2soJmR2Yi0+bXV0ZXgpOworLyoJbXV0ZXhfZGVzdHJveSgmdG02MDAwX2Rldi0+c3RyZWFtaW5nX211dGV4KTsgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9kdmJfYXR0YWNoX2Zyb250ZW5kKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCWlmIChkZXYtPmNhcHMuaGFzX3psMTAzNTMpIHsKKwkJc3RydWN0IHpsMTAzNTNfY29uZmlnIGNvbmZpZyA9IHsKKwkJCQkgICAgIC5kZW1vZF9hZGRyZXNzID0gZGV2LT5kZW1vZF9hZGRyLAorCQkJCSAgICAgLm5vX3R1bmVyID0gMSwKKwkJCQkgICAgIC5wYXJhbGxlbF90cyA9IDEsCisJCQkJICAgICAuaWYyID0gNDU3MDAsCisJCQkJICAgICAuZGlzYWJsZV9pMmNfZ2F0ZV9jdHJsID0gMSwKKwkJCQkgICAgfTsKKworCQlkdmItPmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwgJmNvbmZpZywKKwkJCQkJCQkgICAmZGV2LT5pMmNfYWRhcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IG5vIGZyb250ZW5kIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAoIWR2Yi0+ZnJvbnRlbmQpID8gLTEgOiAwOworfQorCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKworc3RhdGljIGludCByZWdpc3Rlcl9kdmIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaW50IHJldCA9IC0xOworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKKworCW11dGV4X2luaXQoJmR2Yi0+bXV0ZXgpOworCisJZHZiLT5zdHJlYW1zID0gMDsKKworCS8qIGF0dGFjaCB0aGUgZnJvbnRlbmQgKi8KKwlyZXQgPSB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhdHRhY2ggdGhlIGZyb250ZW5kIVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIsICJUcmlkZW50IFRWTWFzdGVyIDYwMDAgRFZCLVQiLAorCQkJCQlUSElTX01PRFVMRSwgJmRldi0+dWRldi0+ZGV2LCBhZGFwdGVyX25yKTsKKwlkdmItPmFkYXB0ZXIucHJpdiA9IGRldjsKKworCWlmIChkdmItPmZyb250ZW5kKSB7CisJCXN3aXRjaCAoZGV2LT50dW5lcl90eXBlKSB7CisJCWNhc2UgVFVORVJfWEMyMDI4OiB7CisJCQlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmcgPSB7CisJCQkJLmkyY19hZGFwID0gJmRldi0+aTJjX2FkYXAsCisJCQkJLmkyY19hZGRyID0gZGV2LT50dW5lcl9hZGRyLAorCQkJfTsKKworCQkJZHZiLT5mcm9udGVuZC0+Y2FsbGJhY2sgPSB0bTYwMDBfdHVuZXJfY2FsbGJhY2s7CisJCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7CisJCQkJZ290byBhZGFwdGVyX2VycjsKKwkJCX0KKworCQkJaWYgKCFkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZjZmcpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyICIKKwkJCQkJCSJmcm9udGVuZCAoeGMzMDI4KVxuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGZyb250ZW5kX2VycjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogWEMyMDI4LzMwMjggYXNrZWQgdG8gYmUgIgorCQkJCQkgImF0dGFjaGVkIHRvIGZyb250ZW5kIVxuIik7CisJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBUVU5FUl9YQzUwMDA6IHsKKwkJCXN0cnVjdCB4YzUwMDBfY29uZmlnIGNmZyA9IHsKKwkJCQkuaTJjX2FkZHJlc3MgPSBkZXYtPnR1bmVyX2FkZHIsCisJCQl9OworCisJCQlkdmItPmZyb250ZW5kLT5jYWxsYmFjayA9IHRtNjAwMF94YzUwMDBfY2FsbGJhY2s7CisJCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7CisJCQkJZ290byBhZGFwdGVyX2VycjsKKwkJCX0KKworCQkJaWYgKCFkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLCAmY2ZnKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciAiCisJCQkJCQkiZnJvbnRlbmQgKHhjNTAwMClcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBmcm9udGVuZF9lcnI7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IFhDNTAwMCBhc2tlZCB0byBiZSAiCisJCQkJCSAiYXR0YWNoZWQgdG8gZnJvbnRlbmQhXG4iKTsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBmb3VuZFxuIik7CisKKwlkdmItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HCisJCQkJCQkJICAgIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7CisJZHZiLT5kZW11eC5wcml2ID0gZGV2OworCWR2Yi0+ZGVtdXguZmlsdGVybnVtID0gODsKKwlkdmItPmRlbXV4LmZlZWRudW0gPSA4OworCWR2Yi0+ZGVtdXguc3RhcnRfZmVlZCA9IHRtNjAwMF9zdGFydF9mZWVkOworCWR2Yi0+ZGVtdXguc3RvcF9mZWVkID0gdG02MDAwX3N0b3BfZmVlZDsKKwlkdmItPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOworCXJldCA9IGR2Yl9kbXhfaW5pdCgmZHZiLT5kZW11eCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGR2Yl9kbXhfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLCByZXQpOworCQlnb3RvIGZyb250ZW5kX2VycjsKKwl9CisKKwlkdmItPmRteGRldi5maWx0ZXJudW0gPSBkZXYtPmR2Yi0+ZGVtdXguZmlsdGVybnVtOworCWR2Yi0+ZG14ZGV2LmRlbXV4ID0gJmRldi0+ZHZiLT5kZW11eC5kbXg7CisJZHZiLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKKworCXJldCA9ICBkdmJfZG14ZGV2X2luaXQoJmR2Yi0+ZG14ZGV2LCAmZHZiLT5hZGFwdGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogZHZiX2RteGRldl9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJldCk7CisJCWdvdG8gZHZiX2RteF9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2R2Yl9kbXhfZXJyOgorCWR2Yl9kbXhfcmVsZWFzZSgmZHZiLT5kZW11eCk7Citmcm9udGVuZF9lcnI6CisJaWYgKGR2Yi0+ZnJvbnRlbmQpIHsKKwkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZyb250ZW5kKTsKKwkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7CisJfQorYWRhcHRlcl9lcnI6CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2R2YihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7CisKKwlpZiAoZHZiLT5idWxrX3VyYiAhPSBOVUxMKSB7CisJCXN0cnVjdCB1cmIgKmJ1bGtfdXJiID0gZHZiLT5idWxrX3VyYjsKKworCQlrZnJlZShidWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJYnVsa191cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCXVzYl91bmxpbmtfdXJiKGJ1bGtfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKGJ1bGtfdXJiKTsKKwl9CisKKy8qCW11dGV4X2xvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCisJaWYgKGR2Yi0+ZnJvbnRlbmQpIHsKKwkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZyb250ZW5kKTsKKwkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7CisJfQorCisJZHZiX2RteGRldl9yZWxlYXNlKCZkdmItPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKCZkdmItPmRlbXV4KTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOworCW11dGV4X2Rlc3Ryb3koJmR2Yi0+bXV0ZXgpOworLyoJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLworfQorCitzdGF0aWMgaW50IGR2Yl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfZHZiICpkdmI7CisJaW50IHJjOworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaWYgKCFkZXYtPmNhcHMuaGFzX2R2YikKKwkJcmV0dXJuIDA7CisKKwlkdmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG02MDAwX2R2YiksIEdGUF9LRVJORUwpOworCWlmICghZHZiKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXYtPmR2YiA9IGR2YjsKKworCXJjID0gcmVnaXN0ZXJfZHZiKGRldik7CisJaWYgKHJjIDwgMCkgeworCQlrZnJlZShkdmIpOworCQlkZXYtPmR2YiA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl9maW5pKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWlmICghZGV2LT5jYXBzLmhhc19kdmIpCisJCXJldHVybiAwOworCisJaWYgKGRldi0+ZHZiKSB7CisJCXVucmVnaXN0ZXJfZHZiKGRldik7CisJCWtmcmVlKGRldi0+ZHZiKTsKKwkJZGV2LT5kdmIgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRtNjAwMF9vcHMgZHZiX29wcyA9IHsKKwkudHlwZQk9IFRNNjAwMF9EVkIsCisJLm5hbWUJPSAiVE02MDAwIGR2YiBFeHRlbnNpb24iLAorCS5pbml0CT0gZHZiX2luaXQsCisJLmZpbmkJPSBkdmJfZmluaSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRtNjAwMF9kdmJfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gdG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbigmZHZiX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0bTYwMDBfZHZiX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24oJmR2Yl9vcHMpOworfQorCittb2R1bGVfaW5pdCh0bTYwMDBfZHZiX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHRtNjAwMF9kdmJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MGJiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1pMmMuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqICB0bTYwMDAtaTJjLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KKyAqCS0gRml4IFNNQnVzIFJlYWQgQnl0ZSBjb21tYW5kCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSAidG02MDAwLmgiCisjaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBpMmNfZGVidWc7Cittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2kyY10iKTsKKworI2RlZmluZSBpMmNfZHByaW50ayhsdmwsIGZtdCwgYXJncy4uLikgaWYgKGkyY19kZWJ1ZyA+PSBsdmwpIGRvIHsgXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGF0ICVzOiAiIGZtdCwgXAorCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXywgIyNhcmdzKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCB0bTYwMDBfaTJjX3NlbmRfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAorCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHJjOworCXVuc2lnbmVkIGludCB0c2xlZXA7CisJdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKKworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKKwkJaTJjX3BhY2tldF9saW1pdCA9IDY0OworCisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKworCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAorCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNhcHR1cmUgbXV0ZXggKi8KKwlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCisJCWFkZHIgfCByZWcgPDwgOCwgMCwgYnVmLCBsZW4pOworCisJaWYgKHJjIDwgMCkgeworCQkvKiByZWxlYXNlIG11dGV4ICovCisJCXJldHVybiByYzsKKwl9CisKKwkvKiBDYWxjdWxhdGUgZGVsYXkgdGltZSwgMTQwMDB1cyBmb3IgNjQgYnl0ZXMgKi8KKwl0c2xlZXAgPSAoKGxlbiAqIDIwMCkgKyAyMDAgKyAxMDAwKSAvIDEwMDA7CisJbXNsZWVwKHRzbGVlcCk7CisKKwkvKiByZWxlYXNlIG11dGV4ICovCisJcmV0dXJuIHJjOworfQorCisvKiBHZW5lcmljIHJlYWQgLSBkb2Vzbid0IHdvcmsgZmluZSB3aXRoIDE2Yml0IHJlZ2lzdGVycyAqLworc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAorCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHJjOworCXU4IGJbMl07CisJdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKKworCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKKwkJaTJjX3BhY2tldF9saW1pdCA9IDY0OworCisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKworCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAorCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNhcHR1cmUgbXV0ZXggKi8KKwlpZiAoKGRldi0+Y2Fwcy5oYXNfemwxMDM1MykgJiYgKGRldi0+ZGVtb2RfYWRkciA8PCAxID09IGFkZHIpICYmIChyZWcgJSAyID09IDApKSB7CisJCS8qCisJCSAqIFdvcmthcm91bmQgYW4gSTJDIGJ1ZyB3aGVuIHJlYWRpbmcgZnJvbSB6bDEwMzUzCisJCSAqLworCQlyZWcgLT0gMTsKKwkJbGVuICs9IDE7CisKKwkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGIsIGxlbik7CisKKwkJKmJ1ZiA9IGJbMV07CisJfSBlbHNlIHsKKwkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGJ1ZiwgbGVuKTsKKwl9CisKKwkvKiByZWxlYXNlIG11dGV4ICovCisJcmV0dXJuIHJjOworfQorCisvKgorICogcmVhZCBmcm9tIGEgMTZiaXQgcmVnaXN0ZXIKKyAqIGZvciBleGFtcGxlIHhjMjAyOCwgeGMzMDI4IG9yIHhjMzAyOEwKKyAqLworc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCisJCQkJICBfX3UxNiByZWcsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciB1cmVnOworCisJaWYgKCFidWYgfHwgbGVuICE9IDIpCisJCXJldHVybiAtMTsKKworCS8qIGNhcHR1cmUgbXV0ZXggKi8KKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJdXJlZyA9IHJlZyAmIDB4RkY7CisJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCisJCQlhZGRyIHwgKHJlZyAmIDB4RkYwMCksIDAsICZ1cmVnLCAxKTsKKworCQlpZiAocmMgPCAwKSB7CisJCQkvKiByZWxlYXNlIG11dGV4ICovCisJCQlyZXR1cm4gcmM7CisJCX0KKworCQltc2xlZXAoMTQwMCAvIDEwMDApOworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQsCisJCQlyZWcsIDAsIGJ1ZiwgbGVuKTsKKwl9IGVsc2UgeworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4sCisJCQlhZGRyLCByZWcsIGJ1ZiwgbGVuKTsKKwl9CisKKwkvKiByZWxlYXNlIG11dGV4ICovCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorCQkJICAgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwlpbnQgYWRkciwgcmMsIGksIGJ5dGU7CisKKwlpZiAobnVtIDw9IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlhZGRyID0gKG1zZ3NbaV0uYWRkciA8PCAxKSAmIDB4ZmY7CisJCWkyY19kcHJpbnRrKDIsICIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCisJCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAorCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOworCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQkvKiByZWFkIHJlcXVlc3Qgd2l0aG91dCBwcmVjZWRpbmcgcmVnaXN0ZXIgc2VsZWN0aW9uICovCisJCQkvKgorCQkJICogVGhlIFRNNjAwMCBvbmx5IHN1cHBvcnRzIGEgcmVhZCB0cmFuc2FjdGlvbgorCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYSAxIG9yIDIgYnl0ZSB3cml0ZSB0byBzZWxlY3QKKwkJCSAqIGEgcmVnaXN0ZXIuICBXZSBjYW5ub3QgZnVsZmlsIHRoaXMgcmVxdWVzdC4KKwkJCSAqLworCQkJaTJjX2RwcmludGsoMiwgIiByZWFkIHdpdGhvdXQgcHJlY2VkaW5nIHdyaXRlIG5vdCIKKwkJCQkgICAgICAgIiBzdXBwb3J0ZWQiKTsKKwkJCXJjID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmIChpICsgMSA8IG51bSAmJiBtc2dzW2ldLmxlbiA8PSAyICYmCisJCQkgICAobXNnc1tpICsgMV0uZmxhZ3MgJiBJMkNfTV9SRCkgJiYKKwkJCSAgIG1zZ3NbaV0uYWRkciA9PSBtc2dzW2kgKyAxXS5hZGRyKSB7CisJCQkvKiAxIG9yIDIgYnl0ZSB3cml0ZSBmb2xsb3dlZCBieSBhIHJlYWQgKi8KKwkJCWlmIChpMmNfZGVidWcgPj0gMikKKwkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7CisJCQlpMmNfZHByaW50aygyLCAiOyBqb2luZWQgdG8gcmVhZCAlcyBsZW49JWQ6IiwKKwkJCQkgICAgaSA9PSBudW0gLSAyID8gInN0b3AiIDogIm5vbnN0b3AiLAorCQkJCSAgICBtc2dzW2kgKyAxXS5sZW4pOworCisJCQlpZiAobXNnc1tpXS5sZW4gPT0gMikgeworCQkJCXJjID0gdG02MDAwX2kyY19yZWN2X3JlZ3MxNihkZXYsIGFkZHIsCisJCQkJCW1zZ3NbaV0uYnVmWzBdIDw8IDggfCBtc2dzW2ldLmJ1ZlsxXSwKKwkJCQkJbXNnc1tpICsgMV0uYnVmLCBtc2dzW2kgKyAxXS5sZW4pOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IHRtNjAwMF9pMmNfcmVjdl9yZWdzKGRldiwgYWRkciwgbXNnc1tpXS5idWZbMF0sCisJCQkJCW1zZ3NbaSArIDFdLmJ1ZiwgbXNnc1tpICsgMV0ubGVuKTsKKwkJCX0KKworCQkJaSsrOworCisJCQlpZiAoYWRkciA9PSBkZXYtPnR1bmVyX2FkZHIgPDwgMSkgeworCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzUwX1NFVF9TVEFSVCwgMCwgMCk7CisJCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTFfU0VUX1NUT1AsIDAsIDApOworCQkJfQorCQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQorCQkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQorCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHdyaXRlIGJ5dGVzICovCisJCQlpZiAoaTJjX2RlYnVnID49IDIpCisJCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspCisJCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgbXNnc1tpXS5idWZbYnl0ZV0pOworCQkJcmMgPSB0bTYwMDBfaTJjX3NlbmRfcmVncyhkZXYsIGFkZHIsIG1zZ3NbaV0uYnVmWzBdLAorCQkJCW1zZ3NbaV0uYnVmICsgMSwgbXNnc1tpXS5sZW4gLSAxKTsKKwkJfQorCQlpZiAoaTJjX2RlYnVnID49IDIpCisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIG51bTsKK2VycjoKKwlpMmNfZHByaW50aygyLCAiIEVSUk9SOiAlaVxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0bTYwMDBfaTJjX2VlcHJvbShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlpbnQgaSwgcmM7CisJdW5zaWduZWQgY2hhciAqcCA9IGRldi0+ZWVkYXRhOworCXVuc2lnbmVkIGNoYXIgYnl0ZXNbMTddOworCisJZGV2LT5pMmNfY2xpZW50LmFkZHIgPSAweGEwID4+IDE7CisJZGV2LT5lZWRhdGFfc2l6ZSA9IDA7CisKKwlieXRlc1sxNl0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2LT5lZWRhdGEpOyApIHsKKwkJKnAgPSBpOworCQlyYyA9IHRtNjAwMF9pMmNfcmVjdl9yZWdzKGRldiwgMHhhMCwgaSwgcCwgMSk7CisJCWlmIChyYyA8IDEpIHsKKwkJCWlmIChwID09IGRldi0+ZWVkYXRhKQorCQkJCWdvdG8gbm9lZXByb207CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIiVzOiBpMmMgZWVwcm9tIHJlYWQgZXJyb3IgKGVycj0lZClcbiIsCisJCQkJZGV2LT5uYW1lLCByYyk7CisJCQl9CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZXYtPmVlZGF0YV9zaXplKys7CisJCXArKzsKKwkJaWYgKDAgPT0gKGkgJSAxNikpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaTJjIGVlcHJvbSAlMDJ4OiIsIGRldi0+bmFtZSwgaSk7CisJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgZGV2LT5lZWRhdGFbaV0pOworCQlpZiAoKGRldi0+ZWVkYXRhW2ldID49ICcgJykgJiYgKGRldi0+ZWVkYXRhW2ldIDw9ICd6JykpCisJCQlieXRlc1tpJTE2XSA9IGRldi0+ZWVkYXRhW2ldOworCQllbHNlCisJCQlieXRlc1tpJTE2XSA9ICcuJzsKKworCQlpKys7CisKKwkJaWYgKDAgPT0gKGkgJSAxNikpIHsKKwkJCWJ5dGVzWzE2XSA9ICdcMCc7CisJCQlwcmludGsoS0VSTl9DT05UICIgICVzXG4iLCBieXRlcyk7CisJCX0KKwl9CisJaWYgKDAgIT0gKGklMTYpKSB7CisJCWJ5dGVzW2klMTZdID0gJ1wwJzsKKwkJZm9yIChpICU9IDE2OyBpIDwgMTY7IGkrKykKKwkJCXByaW50ayhLRVJOX0NPTlQgIiAgICIpOworCQlwcmludGsoS0VSTl9DT05UICIgICVzXG4iLCBieXRlcyk7CisJfQorCisJcmV0dXJuIDA7CisKK25vZWVwcm9tOgorCXByaW50ayhLRVJOX0lORk8gIiVzOiBIdWgsIG5vIGVlcHJvbSBwcmVzZW50IChlcnI9JWQpP1xuIiwKKwkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmdW5jdGlvbmFsaXR5KCkKKyAqLworc3RhdGljIHUzMiBmdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHRtNjAwMF9hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gdG02MDAwX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZnVuY3Rpb25hbGl0eSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB0bTYwMDBfaTJjX3JlZ2lzdGVyKCkKKyAqIHJlZ2lzdGVyIGkyYyBidXMKKyAqLworaW50IHRtNjAwMF9pMmNfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaW50IHJjOworCisJZGV2LT5pMmNfYWRhcC5vd25lciA9IFRISVNfTU9EVUxFOworCWRldi0+aTJjX2FkYXAuYWxnbyA9ICZ0bTYwMDBfYWxnbzsKKwlkZXYtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmZGV2LT51ZGV2LT5kZXY7CisJc3RybGNweShkZXYtPmkyY19hZGFwLm5hbWUsIGRldi0+bmFtZSwgc2l6ZW9mKGRldi0+aTJjX2FkYXAubmFtZSkpOworCWRldi0+aTJjX2FkYXAuYWxnb19kYXRhID0gZGV2OworCWkyY19zZXRfYWRhcGRhdGEoJmRldi0+aTJjX2FkYXAsICZkZXYtPnY0bDJfZGV2KTsKKwlyYyA9IGkyY19hZGRfYWRhcHRlcigmZGV2LT5pMmNfYWRhcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkZXYtPmkyY19jbGllbnQuYWRhcHRlciA9ICZkZXYtPmkyY19hZGFwOworCXN0cmxjcHkoZGV2LT5pMmNfY2xpZW50Lm5hbWUsICJ0bTYwMDAgaW50ZXJuYWwiLCBJMkNfTkFNRV9TSVpFKTsKKwl0bTYwMDBfaTJjX2VlcHJvbShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0bTYwMDBfaTJjX3VucmVnaXN0ZXIoKQorICogdW5yZWdpc3RlciBpMmNfYnVzCisgKi8KK2ludCB0bTYwMDBfaTJjX3VucmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJaTJjX2RlbF9hZGFwdGVyKCZkZXYtPmkyY19hZGFwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLWlucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1ZDEyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1pbnB1dC5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogIHRtNjAwMC1pbnB1dC5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBTdGVmYW4gUmluZ2VsIDxzdGVmYW4ucmluZ2VsQGFyY29yLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+CisKKyNpbmNsdWRlICJ0bTYwMDAuaCIKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGlyX2RlYnVnOworbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlIFtJUl0iKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfaXIgPSAxOworbW9kdWxlX3BhcmFtKGVuYWJsZV9pciwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2lyLCAiZW5hYmxlIGlyIChkZWZhdWx0IGlzIGVuYWJsZSkiKTsKKworLyogbnVtYmVyIG9mIDUwbXMgZm9yIE9OLU9GRi1PTiBwb3dlciBsZWQgKi8KKy8qIHNob3cgSVIgYWN0aXZpdHkgKi8KKyNkZWZpbmUgUFdMRURfT0ZGIDIKKworI3VuZGVmIGRwcmludGsKKworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKSBcCisJaWYgKGlyX2RlYnVnKSB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2lyOiAiIGZtdCwgaXItPm5hbWUgLCAjIyBhcmcpOyBcCisJfQorCitzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHsKKwl1MTYgcmNfZGF0YTsKK307CisKK3N0cnVjdCB0bTYwMDBfSVIgeworCXN0cnVjdCB0bTYwMDBfY29yZQkqZGV2OworCXN0cnVjdCByY19kZXYJCSpyYzsKKwljaGFyCQkJbmFtZVszMl07CisJY2hhcgkJCXBoeXNbMzJdOworCisJLyogcG9sbCBleHBlcm5hbCBkZWNvZGVyICovCisJaW50CQkJcG9sbGluZzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7CisJdTgJCQl3YWl0OjE7CisJdTgJCQlrZXk6MTsKKwl1OAkJCXB3bGVkOjE7CisJdTgJCQlwd2xlZGNudDsKKwl1MTYJCQlrZXlfYWRkcjsKKwlzdHJ1Y3QgdXJiCQkqaW50X3VyYjsKKwl1OAkJCSp1cmJfZGF0YTsKKworCWludCAoKmdldF9rZXkpIChzdHJ1Y3QgdG02MDAwX0lSICosIHN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgKik7CisKKwkvKiBJUiBkZXZpY2UgcHJvcGVydGllcyAqLworCXU2NAkJCXJjX3R5cGU7Cit9OworCisKK3ZvaWQgdG02MDAwX2lyX3dhaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHN0YXRlKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKKworCWlmICghZGV2LT5pcikKKwkJcmV0dXJuOworCisJaWYgKHN0YXRlKQorCQlpci0+d2FpdCA9IDE7CisJZWxzZQorCQlpci0+d2FpdCA9IDA7Cit9CisKKworc3RhdGljIGludCB0bTYwMDBfaXJfY29uZmlnKHN0cnVjdCB0bTYwMDBfSVIgKmlyKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaXItPmRldjsKKwl1OCBidWZbMTBdOworCWludCByYzsKKworCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKKwljYXNlIFJDX1RZUEVfTkVDOgorCQkvKiBTZXR1cCBJUiBkZWNvZGVyIGZvciBORUMgc3RhbmRhcmQgMTJNSHogc3lzdGVtIGNsb2NrICovCisJCS8qIElSX0xFQURFUl9DTlQgPSAwLjltcyAgICAgICAgICAgICAqLworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMSwgMHhhYSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwLCAweDMwKTsKKwkJLyogSVJfUFVMU0VfQ05UID0gMC43bXMgICAgICAgICAgICAgICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxLCAweDIwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDAsIDB4ZDApOworCQkvKiBSZW1vdGUgV0FLRVVQID0gZW5hYmxlICovCisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQLCAweGZlKTsKKwkJLyogSVJfV0tVUF9TRUwgPSBMb3cgYnl0ZSBpbiBkZWNvZGVkIElSIGRhdGEgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwsIDB4ZmYpOworCQkvKiBJUl9XS1VfQUREIGNvZGUgKi8KKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9BREQsIDB4ZmYpOworCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7CisJCW1zbGVlcCgxMDApOworCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGhhY2sgKi8KKwkJYnVmWzBdID0gMHhmZjsKKwkJYnVmWzFdID0gMHhmZjsKKwkJYnVmWzJdID0gMHhmMjsKKwkJYnVmWzNdID0gMHgyYjsKKwkJYnVmWzRdID0gMHgyMDsKKwkJYnVmWzVdID0gMHgzNTsKKwkJYnVmWzZdID0gMHg2MDsKKwkJYnVmWzddID0gMHgwNDsKKwkJYnVmWzhdID0gMHhjMDsKKwkJYnVmWzldID0gMHgwODsKKworCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCVVTQl9SRUNJUF9ERVZJQ0UsIFJFUV8wMF9TRVRfSVJfVkFMVUUsIDAsIDAsIGJ1ZiwgMHgwYSk7CisJCW1zbGVlcCgxMDApOworCisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIklSIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRtNjAwMF9pcl91cmJfcmVjZWl2ZWQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKKwlpbnQgcmM7CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibm90IHJlYWR5XG4iKTsKKwllbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCW1lbWNweShpci0+dXJiX2RhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJCWRwcmludGsoImRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgaXItPnVyYl9kYXRhWzBdLAorCQkJaXItPnVyYl9kYXRhWzFdLCBpci0+dXJiX2RhdGFbMl0sIGlyLT51cmJfZGF0YVszXSk7CisKKwkJaXItPmtleSA9IDE7CisJfQorCisJcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcG9sbGluZ19nZXRrZXkoc3RydWN0IHRtNjAwMF9JUiAqaXIsCisJCQkJc3RydWN0IHRtNjAwMF9pcl9wb2xsX3Jlc3VsdCAqcG9sbF9yZXN1bHQpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBpci0+ZGV2OworCWludCByYzsKKwl1OCBidWZbMl07CisKKwlpZiAoaXItPndhaXQgJiYgISZkZXYtPmludF9pbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoJmRldi0+aW50X2luKSB7CisJCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKKwkJY2FzZSBSQ19UWVBFX1JDNToKKwkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdOworCQkJYnJlYWs7CisJCWNhc2UgUkNfVFlQRV9ORUM6CisJCQlpZiAoaXItPnVyYl9kYXRhWzFdID09ICgoaXItPmtleV9hZGRyID4+IDgpICYgMHhmZikpIHsKKwkJCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGlyLT51cmJfZGF0YVswXQorCQkJCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdCisJCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMCk7CisJCW1zbGVlcCgxMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMSk7CisJCW1zbGVlcCgxMCk7CisKKwkJaWYgKGlyLT5yY190eXBlID09IFJDX1RZUEVfUkM1KSB7CisJCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfAorCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkJUkVRXzAyX0dFVF9JUl9DT0RFLCAwLCAwLCBidWYsIDEpOworCisJCQltc2xlZXAoMTApOworCisJCQlkcHJpbnRrKCJyZWFkIGRhdGE9JTAyeFxuIiwgYnVmWzBdKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCisJCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGJ1ZlswXTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8CisJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCQlSRVFfMDJfR0VUX0lSX0NPREUsIDAsIDAsIGJ1ZiwgMik7CisKKwkJCW1zbGVlcCgxMCk7CisKKwkJCWRwcmludGsoInJlYWQgZGF0YT0lMDR4XG4iLCBidWZbMF0gfCBidWZbMV0gPDwgOCk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKworCQkJcG9sbF9yZXN1bHQtPnJjX2RhdGEgPSBidWZbMF0gfCBidWZbMV0gPDwgODsKKwkJfQorCQlpZiAoKHBvbGxfcmVzdWx0LT5yY19kYXRhICYgMHgwMGZmKSAhPSAweGZmKQorCQkJaXItPmtleSA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0bTYwMDBfaXJfaGFuZGxlX2tleShzdHJ1Y3QgdG02MDAwX0lSICppcikKK3sKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGlyLT5kZXY7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHBvbGxfcmVzdWx0OworCisJLyogcmVhZCB0aGUgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgdGhlIElSIHN0YXR1cyAqLworCXJlc3VsdCA9IGlyLT5nZXRfa2V5KGlyLCAmcG9sbF9yZXN1bHQpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImlyLT5nZXRfa2V5KCkgZmFpbGVkICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm47CisJfQorCisJZHByaW50aygiaXItPmdldF9rZXkgcmVzdWx0IGRhdGE9JTA0eFxuIiwgcG9sbF9yZXN1bHQucmNfZGF0YSk7CisKKwlpZiAoaXItPnB3bGVkKSB7CisJCWlmIChpci0+cHdsZWRjbnQgPj0gUFdMRURfT0ZGKSB7CisJCQlpci0+cHdsZWQgPSAwOworCQkJaXItPnB3bGVkY250ID0gMDsKKwkJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAxKTsKKwkJfSBlbHNlCisJCQlpci0+cHdsZWRjbnQgKz0gMTsKKwl9CisKKwlpZiAoaXItPmtleSkgeworCQlyY19rZXlkb3duKGlyLT5yYywgcG9sbF9yZXN1bHQucmNfZGF0YSwgMCk7CisJCWlyLT5rZXkgPSAwOworCQlpci0+cHdsZWQgPSAxOworCQlpci0+cHdsZWRjbnQgPSAwOworCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdG02MDAwX2lyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bTYwMDBfSVIsIHdvcmsud29yayk7CisKKwl0bTYwMDBfaXJfaGFuZGxlX2tleShpcik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9pcl9zdGFydChzdHJ1Y3QgcmNfZGV2ICpyYykKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppciA9IHJjLT5wcml2OworCisJSU5JVF9ERUxBWUVEX1dPUksoJmlyLT53b3JrLCB0bTYwMDBfaXJfd29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG02MDAwX2lyX3N0b3Aoc3RydWN0IHJjX2RldiAqcmMpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaXItPndvcmspOworfQorCitzdGF0aWMgaW50IHRtNjAwMF9pcl9jaGFuZ2VfcHJvdG9jb2woc3RydWN0IHJjX2RldiAqcmMsIHU2NCByY190eXBlKQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gcmMtPnByaXY7CisKKwlpZiAoIWlyKQorCQlyZXR1cm4gMDsKKworCWlmICgocmMtPnJjX21hcC5zY2FuKSAmJiAocmNfdHlwZSA9PSBSQ19UWVBFX05FQykpCisJCWlyLT5rZXlfYWRkciA9ICgocmMtPnJjX21hcC5zY2FuWzBdLnNjYW5jb2RlID4+IDgpICYgMHhmZmZmKTsKKworCWlyLT5nZXRfa2V5ID0gZGVmYXVsdF9wb2xsaW5nX2dldGtleTsKKwlpci0+cmNfdHlwZSA9IHJjX3R5cGU7CisKKwl0bTYwMDBfaXJfY29uZmlnKGlyKTsKKwkvKiBUT0RPICovCisJcmV0dXJuIDA7Cit9CisKK2ludCB0bTYwMDBfaXJfaW50X3N0YXJ0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKKwlpbnQgcGlwZSwgc2l6ZTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCisJaWYgKCFpcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpci0+aW50X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpci0+aW50X3VyYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQlkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MKKwkJJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCisJc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJZHByaW50aygiSVIgbWF4IHNpemU6ICVkXG4iLCBzaXplKTsKKworCWlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJdXNiX2ZyZWVfdXJiKGlyLT5pbnRfdXJiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZHByaW50aygiaW50IGludGVydmFsOiAlZFxuIiwgZGV2LT5pbnRfaW4uZW5kcC0+ZGVzYy5iSW50ZXJ2YWwpOworCXVzYl9maWxsX2ludF91cmIoaXItPmludF91cmIsIGRldi0+dWRldiwgcGlwZSwKKwkJaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlciwgc2l6ZSwKKwkJdG02MDAwX2lyX3VyYl9yZWNlaXZlZCwgZGV2LAorCQlkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIoaXItPmludF91cmIsIEdGUF9LRVJORUwpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7CisJCXJldHVybiBlcnI7CisJfQorCWlyLT51cmJfZGF0YSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0bTYwMDBfaXJfaW50X3N0b3Aoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOworCisJaWYgKCFpcikKKwkJcmV0dXJuOworCisJdXNiX2tpbGxfdXJiKGlyLT5pbnRfdXJiKTsKKwlrZnJlZShpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwl1c2JfZnJlZV91cmIoaXItPmludF91cmIpOworCWlyLT5pbnRfdXJiID0gTlVMTDsKKwlrZnJlZShpci0+dXJiX2RhdGEpOworCWlyLT51cmJfZGF0YSA9IE5VTEw7Cit9CisKK2ludCB0bTYwMDBfaXJfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX0lSICppcjsKKwlzdHJ1Y3QgcmNfZGV2ICpyYzsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWlmICghZW5hYmxlX2lyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZGV2LT5jYXBzLmhhc19yZW1vdGUpCisJCXJldHVybiAwOworCisJaWYgKCFkZXYtPmlyX2NvZGVzKQorCQlyZXR1cm4gMDsKKworCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7CisJcmMgPSByY19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlyIHx8ICFyYykKKwkJZ290byBvdXQ7CisKKwkvKiByZWNvcmQgaGFuZGxlcyB0byBvdXJzZWxmICovCisJaXItPmRldiA9IGRldjsKKwlkZXYtPmlyID0gaXI7CisJaXItPnJjID0gcmM7CisKKwkvKiBpbnB1dCBlaW5yaWNodGVuICovCisJcmMtPmFsbG93ZWRfcHJvdG9zID0gUkNfVFlQRV9SQzUgfCBSQ19UWVBFX05FQzsKKwlyYy0+cHJpdiA9IGlyOworCXJjLT5jaGFuZ2VfcHJvdG9jb2wgPSB0bTYwMDBfaXJfY2hhbmdlX3Byb3RvY29sOworCXJjLT5vcGVuID0gdG02MDAwX2lyX3N0YXJ0OworCXJjLT5jbG9zZSA9IHRtNjAwMF9pcl9zdG9wOworCXJjLT5kcml2ZXJfdHlwZSA9IFJDX0RSSVZFUl9TQ0FOQ09ERTsKKworCWlyLT5wb2xsaW5nID0gNTA7CisJaXItPnB3bGVkID0gMDsKKwlpci0+cHdsZWRjbnQgPSAwOworCisKKwlzbnByaW50Zihpci0+bmFtZSwgc2l6ZW9mKGlyLT5uYW1lKSwgInRtNTYwMC82MHgwIElSICglcykiLAorCQkJCQkJZGV2LT5uYW1lKTsKKworCXVzYl9tYWtlX3BhdGgoZGV2LT51ZGV2LCBpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSk7CisJc3RybGNhdChpci0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoaXItPnBoeXMpKTsKKworCXRtNjAwMF9pcl9jaGFuZ2VfcHJvdG9jb2wocmMsIFJDX1RZUEVfVU5LTk9XTik7CisKKwlyYy0+aW5wdXRfbmFtZSA9IGlyLT5uYW1lOworCXJjLT5pbnB1dF9waHlzID0gaXItPnBoeXM7CisJcmMtPmlucHV0X2lkLmJ1c3R5cGUgPSBCVVNfVVNCOworCXJjLT5pbnB1dF9pZC52ZXJzaW9uID0gMTsKKwlyYy0+aW5wdXRfaWQudmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwlyYy0+aW5wdXRfaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCXJjLT5tYXBfbmFtZSA9IGRldi0+aXJfY29kZXM7CisJcmMtPmRyaXZlcl9uYW1lID0gInRtNjAwMCI7CisJcmMtPmRldi5wYXJlbnQgPSAmZGV2LT51ZGV2LT5kZXY7CisKKwlpZiAoJmRldi0+aW50X2luKSB7CisJCWRwcmludGsoIklSIG92ZXIgaW50XG4iKTsKKworCQllcnIgPSB0bTYwMDBfaXJfaW50X3N0YXJ0KGRldik7CisKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIGlyIHJlZ2lzdGVyICovCisJZXJyID0gcmNfcmVnaXN0ZXJfZGV2aWNlKHJjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworCitvdXQ6CisJZGV2LT5pciA9IE5VTEw7CisJcmNfZnJlZV9kZXZpY2UocmMpOworCWtmcmVlKGlyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgdG02MDAwX2lyX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOworCisJLyogc2tpcCBkZXRhY2ggb24gbm9uIGF0dGFjaGVkIGJvYXJkICovCisKKwlpZiAoIWlyKQorCQlyZXR1cm4gMDsKKworCXJjX3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5yYyk7CisKKwlpZiAoaXItPmludF91cmIpCisJCXRtNjAwMF9pcl9pbnRfc3RvcChkZXYpOworCisJa2ZyZWUoaXIpOworCWRldi0+aXIgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtcmVncy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXJlZ3MuaApAQCAtMCwwICsxLDYwMCBAQAorLyoKKyAqICB0bTYwMDAtcmVncy5oIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFJlcXVlc3QgY29kZXMKKyAqLworI2RlZmluZSBSRVFfMDBfU0VUX0lSX1ZBTFVFCQkwCisjZGVmaW5lIFJFUV8wMV9TRVRfV0FLRVVQX0lSQ09ERQkxCisjZGVmaW5lIFJFUV8wMl9HRVRfSVJfQ09ERQkJMgorI2RlZmluZSBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOCQkzCisjZGVmaW5lIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQJNAorI2RlZmluZSBSRVFfMDVfU0VUX0dFVF9VU0JSRUcJCTUKKwkvKiBXcml0ZTogUmVnTnVtLCBWYWx1ZSwgMCAqLworCS8qIFJlYWQgOiBSZWdOdW0sIFZhbHVlLCAxLCBSZWdTdGF0dXMgKi8KKyNkZWZpbmUgUkVRXzA2X1NFVF9HRVRfVVNCUkVHX0JJVAk2CisjZGVmaW5lIFJFUV8wN19TRVRfR0VUX0FWUkVHCQk3CisJLyogV3JpdGU6IFJlZ051bSwgVmFsdWUsIDAgKi8KKwkvKiBSZWFkIDogUmVnTnVtLCBWYWx1ZSwgMSwgUmVnU3RhdHVzICovCisjZGVmaW5lIFJFUV8wOF9TRVRfR0VUX0FWUkVHX0JJVAk4CisjZGVmaW5lIFJFUV8wOV9TRVRfR0VUX1RVTkVSX0ZRCQk5CisjZGVmaW5lIFJFUV8xMF9TRVRfVFVORVJfU1lTVEVNCQkxMAorI2RlZmluZSBSRVFfMTFfU0VUX0VFUFJPTV9BRERSCQkxMQorI2RlZmluZSBSRVFfMTJfU0VUX0dFVF9FRVBST01CWVRFCTEyCisjZGVmaW5lIFJFUV8xM19HRVRfRUVQUk9NX1NFUVJFQUQJMTMKKyNkZWZpbmUgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4JMTQKKyNkZWZpbmUgUkVRXzE1X1NFVF9HRVRfSTJDQllURQkJMTUKKwkvKiBXcml0ZTogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDAgKi8KKwkvKiBSZWFkIDogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDEgKi8KKyNkZWZpbmUgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4JMTYKKwkvKiBTdWJhZGRyLCBTbGF2ZSBBZGRyLCAwLCBsZW5ndGggKi8KKyNkZWZpbmUgUkVRXzE3X1NFVF9HRVRfSTJDRlAJCTE3CisJLyogV3JpdGU6IFNsYXZlIEFkZHIsIHJlZ2lzdGVyLCB2YWx1ZSAqLworCS8qIFJlYWQgOiBTbGF2ZSBBZGRyLCByZWdpc3RlciwgMiwgZGF0YSAqLworI2RlZmluZSBSRVFfMjBfREFUQV9UUkFOU0ZFUgkJMjAKKyNkZWZpbmUgUkVRXzMwX0kyQ19XUklURQkJMzAKKyNkZWZpbmUgUkVRXzMxX0kyQ19SRUFECQkJMzEKKyNkZWZpbmUgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQJCTM1CisjZGVmaW5lIFJFUV80MF9HRVRfVkVSU0lPTgkJNDAKKyNkZWZpbmUgUkVRXzUwX1NFVF9TVEFSVAkJNTAKKyNkZWZpbmUgUkVRXzUxX1NFVF9TVE9QCQkJNTEKKyNkZWZpbmUgUkVRXzUyX1RSQU5TTUlUX0RBVEEJCTUyCisjZGVmaW5lIFJFUV81M19TUElfSU5JVElBTAkJNTMKKyNkZWZpbmUgUkVRXzU0X1NQSV9TRVRTVEFSVAkJNTQKKyNkZWZpbmUgUkVRXzU1X1NQSV9JTk9VVERBVEEJCTU1CisjZGVmaW5lIFJFUV81Nl9TUElfU0VUU1RPUAkJNTYKKworLyoKKyAqIERlZmluZSBUViBNYXN0ZXIgVE01NjAwL1RNNjAwMC9UTTYwMTAgR1BJTyBsaW5lcworICovCisKKyNkZWZpbmUgVE02MDAwX0dQSU9fQ0xLCQkweDEwMQorI2RlZmluZSBUTTYwMDBfR1BJT19EQVRBCTB4MTAwCisKKyNkZWZpbmUgVE02MDAwX0dQSU9fMQkJMHgxMDIKKyNkZWZpbmUgVE02MDAwX0dQSU9fMgkJMHgxMDMKKyNkZWZpbmUgVE02MDAwX0dQSU9fMwkJMHgxMDQKKyNkZWZpbmUgVE02MDAwX0dQSU9fNAkJMHgzMDAKKyNkZWZpbmUgVE02MDAwX0dQSU9fNQkJMHgzMDEKKyNkZWZpbmUgVE02MDAwX0dQSU9fNgkJMHgzMDQKKyNkZWZpbmUgVE02MDAwX0dQSU9fNwkJMHgzMDUKKworLyogdG02MDEwIGRlZmluZXMgR1BJTyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKi8KKyNkZWZpbmUgVE02MDEwX0dQSU9fMCAgICAgIDB4MDEwMgorI2RlZmluZSBUTTYwMTBfR1BJT18xICAgICAgMHgwMTAzCisjZGVmaW5lIFRNNjAxMF9HUElPXzIgICAgICAweDAxMDQKKyNkZWZpbmUgVE02MDEwX0dQSU9fMyAgICAgIDB4MDEwNQorI2RlZmluZSBUTTYwMTBfR1BJT180ICAgICAgMHgwMTA2CisjZGVmaW5lIFRNNjAxMF9HUElPXzUgICAgICAweDAxMDcKKyNkZWZpbmUgVE02MDEwX0dQSU9fNiAgICAgIDB4MDMwMAorI2RlZmluZSBUTTYwMTBfR1BJT183ICAgICAgMHgwMzAxCisjZGVmaW5lIFRNNjAxMF9HUElPXzkgICAgICAweDAzMDUKKy8qCisgKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVSQiBtZXNzYWdlIGNvZGVzIGFuZCBsZW5ndGgKKyAqLworCitlbnVtIHsKKwlUTTYwMDBfVVJCX01TR19WSURFTyA9IDEsCisJVE02MDAwX1VSQl9NU0dfQVVESU8sCisJVE02MDAwX1VSQl9NU0dfVkJJLAorCVRNNjAwMF9VUkJfTVNHX1BUUywKKwlUTTYwMDBfVVJCX01TR19FUlIsCit9OworCisvKiBEZWZpbmUgc3BlY2lmaWMgVE02MDAwIFZpZGVvIGRlY29kZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRDhfVEVTVF9TRUwJCQkweDA3LCAweGQ4CisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRDlfQV9TSU1fU0VMCQkJMHgwNywgMHhkOQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRBX0NMS19TRUwJCQkweDA3LCAweGRhCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SREJfT1VUX1NFTAkJCTB4MDcsIDB4ZGIKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JEQ19OU0VMX0kyUwkJCTB4MDcsIDB4ZGMKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JERF9HUElPMl9NRFJWCQkJMHgwNywgMHhkZAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRFX0dQSU8xX01EUlYJCQkweDA3LCAweGRlCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SREZfUFdET1dOX0FDTEsJCQkweDA3LCAweGRmCisjZGVmaW5lIFRNNjAwMF9SRVEwN19SRTBfVkFEQ19SRUZfQ1RMCQkJMHgwNywgMHhlMAorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkUxX1ZBRENfREFDTElNUAkJCTB4MDcsIDB4ZTEKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwJCTB4MDcsIDB4ZTIKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMQkJMHgwNywgMHhlMworI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU0X1ZBRENfVEFSR0VUMQkJCTB4MDcsIDB4ZTQKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMgkJMHgwNywgMHhlNQorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkU2X1ZBRENfVEFSR0VUMgkJCTB4MDcsIDB4ZTYKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFN19WQURDX0FHQUlOX0NUTAkJCTB4MDcsIDB4ZTcKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwJCTB4MDcsIDB4ZTgKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFOV9WQURDX0lOUFVUX0NUTDEJCTB4MDcsIDB4ZTkKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFQV9WQURDX0lOUFVUX0NUTDIJCTB4MDcsIDB4ZWEKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERQkJCTB4MDcsIDB4ZWIKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFQ19WQURDX0FBRENfTFZPTAkJCTB4MDcsIDB4ZWMKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFRF9WQURDX0FBRENfUlZPTAkJCTB4MDcsIDB4ZWQKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFRV9WQURDX0NUUkxfU0VMX0NPTlRST0wJCTB4MDcsIDB4ZWUKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JFRl9WQURDX0dBSU5fTUFQX0NUTAkJMHgwNywgMHhlZgorI2RlZmluZSBUTTYwMDBfUkVRMDdfUkZEX0JJU1RfRVJSX1ZTVF9MT1cJCTB4MDcsIDB4ZmQKKyNkZWZpbmUgVE02MDAwX1JFUTA3X1JGRV9CSVNUX0VSUl9WU1RfSElHSAkJMHgwNywgMHhmZQorCisvKiBEZWZpbmUgVE02MDAwL1RNNjAxMCBWaWRlbyBkZWNvZGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwCQkJMHgwNywgMHgwMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxCQkJMHgwNywgMHgwMQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyCQkJMHgwNywgMHgwMgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MCQkJMHgwNywgMHgwMworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MCQkweDA3LCAweDA0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDVfTk9JU0VfVEhSRVNIT0xECQkweDA3LCAweDA1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDZfQUdDX0dBVEVfVEhSRVNIT0xECQkweDA3LCAweDA2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wJCQkweDA3LCAweDA3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREoJCTB4MDcsIDB4MDgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKCQkweDA3LCAweDA5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMEFfQ0hST01BX1NBVFVSQVRJT05fQURKCQkweDA3LCAweDBhCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMEJfQ0hST01BX0hVRV9QSEFTRV9BREoJCTB4MDcsIDB4MGIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwQ19DSFJPTUFfQUdDX0NPTlRST0wJCTB4MDcsIDB4MGMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTAkJMHgwNywgMHgwZAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBGX0NIUk9NQV9BVVRPX1BPU0lUSU9OCQkweDA3LCAweDBmCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMTBfQUdDX1BFQUtfTk9NSU5BTAkJMHgwNywgMHgxMAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjExX0FHQ19QRUFLX0NPTlRST0wJCTB4MDcsIDB4MTEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxMl9BR0NfR0FURV9TVEFSVEgJCTB4MDcsIDB4MTIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxM19BR0NfR0FURV9TVEFSVEwJCTB4MDcsIDB4MTMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxNF9BR0NfR0FURV9XSURUSAkJCTB4MDcsIDB4MTQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxNV9BR0NfQlBfREVMQVkJCQkweDA3LCAweDE1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMTZfTE9DS19DT1VOVAkJCTB4MDcsIDB4MTYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURQkJCTB4MDcsIDB4MTcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMJCTB4MDcsIDB4MTgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIJCTB4MDcsIDB4MTkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEJCTB4MDcsIDB4MWEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAJCTB4MDcsIDB4MWIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMwkJMHgwNywgMHgxYworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyCQkweDA3LCAweDFkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEJCTB4MDcsIDB4MWUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMAkJMHgwNywgMHgxZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjIwX0hTWU5DX1JJU0lOR19FREdFX1RJTUUJCTB4MDcsIDB4MjAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyMV9IU1lOQ19QSEFTRV9PRkZTRVQJCTB4MDcsIDB4MjEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyMl9IU1lOQ19QTExfU1RBUlRfVElNRQkJMHgwNywgMHgyMgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjIzX0hTWU5DX1BMTF9FTkRfVElNRQkJMHgwNywgMHgyMworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI0X0hTWU5DX1RJUF9TVEFSVF9USU1FCQkweDA3LCAweDI0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjVfSFNZTkNfVElQX0VORF9USU1FCQkweDA3LCAweDI1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMjZfSFNZTkNfUklTSU5HX0VER0VfU1RBUlQJMHgwNywgMHgyNgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI3X0hTWU5DX1JJU0lOR19FREdFX0VORAkJMHgwNywgMHgyNworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI4X0JBQ0tQT1JDSF9TVEFSVAkJMHgwNywgMHgyOAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI5X0JBQ0tQT1JDSF9FTkQJCQkweDA3LCAweDI5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMkFfSFNZTkNfRklMVEVSX1NUQVJUCQkweDA3LCAweDJhCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMkJfSFNZTkNfRklMVEVSX0VORAkJMHgwNywgMHgyYgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJDX0NIUk9NQV9CVVJTVF9TVEFSVAkJMHgwNywgMHgyYworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJEX0NIUk9NQV9CVVJTVF9FTkQJCTB4MDcsIDB4MmQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJUCQkweDA3LCAweDJlCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMkZfQUNUSVZFX1ZJREVPX0hXSURUSAkJMHgwNywgMHgyZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQJCTB4MDcsIDB4MzAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hUCQkweDA3LCAweDMxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzJfVlNZTkNfSExPQ0tfTUlOCQkweDA3LCAweDMyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYCQkweDA3LCAweDMzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzRfVlNZTkNfQUdDX01JTgkJCTB4MDcsIDB4MzQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYCQkJMHgwNywgMHgzNQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM2X1ZTWU5DX1ZCSV9NSU4JCQkweDA3LCAweDM2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SMzdfVlNZTkNfVkJJX01BWAkJCTB4MDcsIDB4MzcKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzOF9WU1lOQ19USFJFU0hPTEQJCTB4MDcsIDB4MzgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzOV9WU1lOQ19USU1FX0NPTlNUQU5UCQkweDA3LCAweDM5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SM0FfU1RBVFVTMQkJCTB4MDcsIDB4M2EKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1IzQl9TVEFUVVMyCQkJMHgwNywgMHgzYgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNDX1NUQVRVUzMJCQkweDA3LCAweDNjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQJCQkJMHgwNywgMHgzZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQwX1RFTEVURVhUX1ZCSV9DT0RFMAkJMHgwNywgMHg0MAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQxX1RFTEVURVhUX1ZCSV9DT0RFMQkJMHgwNywgMHg0MQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQyX1ZCSV9EQVRBX0hJR0hfTEVWRUwJCTB4MDcsIDB4NDIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0M19WQklfREFUQV9UWVBFX0xJTkU3CQkweDA3LCAweDQzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDRfVkJJX0RBVEFfVFlQRV9MSU5FOAkJMHgwNywgMHg0NAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ1X1ZCSV9EQVRBX1RZUEVfTElORTkJCTB4MDcsIDB4NDUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Nl9WQklfREFUQV9UWVBFX0xJTkUxMAkJMHgwNywgMHg0NgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ3X1ZCSV9EQVRBX1RZUEVfTElORTExCQkweDA3LCAweDQ3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNDhfVkJJX0RBVEFfVFlQRV9MSU5FMTIJCTB4MDcsIDB4NDgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0OV9WQklfREFUQV9UWVBFX0xJTkUxMwkJMHgwNywgMHg0OQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRBX1ZCSV9EQVRBX1RZUEVfTElORTE0CQkweDA3LCAweDRhCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNEJfVkJJX0RBVEFfVFlQRV9MSU5FMTUJCTB4MDcsIDB4NGIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Q19WQklfREFUQV9UWVBFX0xJTkUxNgkJMHgwNywgMHg0YworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjREX1ZCSV9EQVRBX1RZUEVfTElORTE3CQkweDA3LCAweDRkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNEVfVkJJX0RBVEFfVFlQRV9MSU5FMTgJCTB4MDcsIDB4NGUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Rl9WQklfREFUQV9UWVBFX0xJTkUxOQkJMHgwNywgMHg0ZgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjUwX1ZCSV9EQVRBX1RZUEVfTElORTIwCQkweDA3LCAweDUwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTFfVkJJX0RBVEFfVFlQRV9MSU5FMjEJCTB4MDcsIDB4NTEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Ml9WQklfREFUQV9UWVBFX0xJTkUyMgkJMHgwNywgMHg1MgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjUzX1ZCSV9EQVRBX1RZUEVfTElORTIzCQkweDA3LCAweDUzCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNTRfVkJJX0RBVEFfVFlQRV9STElORVMJCTB4MDcsIDB4NTQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTgkJMHgwNywgMHg1NQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU2X1ZCSV9MT09QX0ZJTFRFUl9JX0dBSU4JCTB4MDcsIDB4NTYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOCQkweDA3LCAweDU3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNThfVkJJX0NBUFRJT05fRFRPMQkJMHgwNywgMHg1OAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU5X1ZCSV9DQVBUSU9OX0RUTzAJCTB4MDcsIDB4NTkKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I1QV9WQklfVEVMRVRFWFRfRFRPMQkJMHgwNywgMHg1YQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVCX1ZCSV9URUxFVEVYVF9EVE8wCQkweDA3LCAweDViCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNUNfVkJJX1dTUzYyNV9EVE8xCQkweDA3LCAweDVjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNURfVkJJX1dTUzYyNV9EVE8wCQkweDA3LCAweDVkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNUVfVkJJX0NBUFRJT05fRlJBTUVfU1RBUlQJMHgwNywgMHg1ZQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVGX1ZCSV9XU1M2MjVfRlJBTUVfU1RBUlQJCTB4MDcsIDB4NWYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2MF9URUxFVEVYVF9GUkFNRV9TVEFSVAkJMHgwNywgMHg2MAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjYxX1ZCSV9DQ0RBVEExCQkJMHgwNywgMHg2MQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjYyX1ZCSV9DQ0RBVEEyCQkJMHgwNywgMHg2MgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjYzX1ZCSV9XU1M2MjVfREFUQTEJCTB4MDcsIDB4NjMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2NF9WQklfV1NTNjI1X0RBVEEyCQkweDA3LCAweDY0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjVfVkJJX0RBVEFfU1RBVFVTCQkweDA3LCAweDY1CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjZfVkJJX0NBUFRJT05fU1RBUlQJCTB4MDcsIDB4NjYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I2N19WQklfV1NTNjI1X1NUQVJUCQkweDA3LCAweDY3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNjhfVkJJX1RFTEVURVhUX1NUQVJUCQkweDA3LCAweDY4CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzBfSFNZTkNfRFRPX0lOQ19TVEFUVVMzCQkweDA3LCAweDcwCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzFfSFNZTkNfRFRPX0lOQ19TVEFUVVMyCQkweDA3LCAweDcxCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzJfSFNZTkNfRFRPX0lOQ19TVEFUVVMxCQkweDA3LCAweDcyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzNfSFNZTkNfRFRPX0lOQ19TVEFUVVMwCQkweDA3LCAweDczCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzRfQ0hST01BX0RUT19JTkNfU1RBVFVTMwkJMHgwNywgMHg3NAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc1X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzIJCTB4MDcsIDB4NzUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Nl9DSFJPTUFfRFRPX0lOQ19TVEFUVVMxCQkweDA3LCAweDc2CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SNzdfQ0hST01BX0RUT19JTkNfU1RBVFVTMAkJMHgwNywgMHg3NworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc4X0FHQ19BR0FJTl9TVEFUVVMJCTB4MDcsIDB4NzgKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3OV9BR0NfREdBSU5fU1RBVFVTCQkweDA3LCAweDc5CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SN0FfQ0hST01BX01BR19TVEFUVVMJCTB4MDcsIDB4N2EKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Ql9DSFJPTUFfR0FJTl9TVEFUVVMxCQkweDA3LCAweDdiCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SN0NfQ0hST01BX0dBSU5fU1RBVFVTMAkJMHgwNywgMHg3YworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdEX0NPUkRJQ19GUkVRX1NUQVRVUwkJMHgwNywgMHg3ZAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdGX1NUQVRVU19OT0lTRQkJCTB4MDcsIDB4N2YKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4MF9DT01CX0ZJTFRFUl9UUkVTSE9MRAkJMHgwNywgMHg4MAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRwkJMHgwNywgMHg4MgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRwkJMHgwNywgMHg4MworI2RlZmluZSBUTTYwMTBfUkVRMDdfUjg0X05PSVNFX05UU0NfQwkJCTB4MDcsIDB4ODQKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4NV9OT0lTRV9QQUxfQwkJCTB4MDcsIDB4ODUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Nl9OT0lTRV9QSEFTRV9DCQkJMHgwNywgMHg4NgorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjg3X05PSVNFX1BIQVNFX1kJCQkweDA3LCAweDg3CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SOEFfQ0hST01BX0xPT1BGSUxURVJfU1RBVEUJMHgwNywgMHg4YQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhCX0NIUk9NQV9IUkVTQU1QTEVSCQkweDA3LCAweDhiCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SOERfQ1BVTVBfREVMQVlfQURKCQkweDA3LCAweDhkCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SOEVfQ1BVTVBfQURKCQkJMHgwNywgMHg4ZQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhGX0NQVU1QX0RFTEFZCQkJMHgwNywgMHg4ZgorCisvKiBEZWZpbmUgVE02MDAwL1RNNjAxMCBNaXNjZWxsYW5lb3VzIHJlZ2lzdGVycyAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkMwX0FDVElWRV9WSURFT19TT1VSQ0UJCTB4MDcsIDB4YzAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRAkJCTB4MDcsIDB4YzEKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDMl9IU1lOQ19XSURUSAkJCTB4MDcsIDB4YzIKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDM19IU1RBUlQxCQkJMHgwNywgMHhjMworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM0X0hTVEFSVDAJCQkweDA3LCAweGM0CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzVfSEVORDEJCQkJMHgwNywgMHhjNQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM2X0hFTkQwCQkJCTB4MDcsIDB4YzYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDN19WU1RBUlQxCQkJMHgwNywgMHhjNworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM4X1ZTVEFSVDAJCQkweDA3LCAweGM4CisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQzlfVkVORDEJCQkJMHgwNywgMHhjOQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkNBX1ZFTkQwCQkJCTB4MDcsIDB4Y2EKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDQl9ERUxBWQkJCQkweDA3LCAweGNiCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfSUYJCQkweDA3LCAweGNjCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX0lGX1ZJREVPX0VOQUJMRSAoMSA8PCA1KQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9JRl9BVURJT19FTkFCTEUgKDEgPDwgNikKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEMF9VU0JfUEVSSVBIRVJZX0NPTlRST0wJCTB4MDcsIDB4ZDAKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEMV9BRERSX0ZPUl9SRVExCQkJMHgwNywgMHhkMQorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQyX0FERFJfRk9SX1JFUTIJCQkweDA3LCAweGQyCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDNfQUREUl9GT1JfUkVRMwkJCTB4MDcsIDB4ZDMKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JENF9BRERSX0ZPUl9SRVE0CQkJMHgwNywgMHhkNAorI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ1X1BPV0VSU0FWRQkJCTB4MDcsIDB4ZDUKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JENl9FTkRQX1JFUTFfUkVRMgkJCTB4MDcsIDB4ZDYKKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEN19FTkRQX1JFUTNfUkVRNAkJCTB4MDcsIDB4ZDcKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSCQkJCTB4MDcsIDB4ZDgKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX0JTSVpFCQkJMHgwNywgMHhkOQorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfV0FLRVVQX1NFTAkJCTB4MDcsIDB4ZGEKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9BREQJCQkweDA3LCAweGRiCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIxCQkJMHgwNywgMHhkYworLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMAkJCTB4MDcsIDB4ZGQKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDEJCQkweDA3LCAweGRlCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQwCQkJMHgwNywgMHhkZgorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTBfRFZJREVPX1NPVVJDRQkJCTB4MDcsIDB4ZTAKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUwX0RWSURFT19TT1VSQ0VfSUYJCTB4MDcsIDB4ZTEKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUyX09VVF9TRUwyCQkJMHgwNywgMHhlMgorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTNfT1VUX1NFTDEJCQkweDA3LCAweGUzCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFNF9PVVRfU0VMMAkJCTB4MDcsIDB4ZTQKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU1X1JFTU9URV9XQUtFVVAJCQkweDA3LCAweGU1CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFN19QVUJfR1BJTwkJCTB4MDcsIDB4ZTcKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU4X1RZUEVTRUxfTU9TX0kyUwkJMHgwNywgMHhlOAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRTlfVFlQRVNFTF9NT1NfVFMJCQkweDA3LCAweGU5CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JFQV9UWVBFU0VMX01PU19DQ0lSCQkweDA3LCAweGVhCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGMF9CSVNUX0NSQ19SRVNVTFQwCQkweDA3LCAweGYwCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGMV9CSVNUX0NSQ19SRVNVTFQxCQkweDA3LCAweGYxCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGMl9CSVNUX0NSQ19SRVNVTFQyCQkweDA3LCAweGYyCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGM19CSVNUX0NSQ19SRVNVTFQzCQkweDA3LCAweGYzCisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGNF9CSVNUX0VSUl9WU1QyCQkJMHgwNywgMHhmNAorLyogT05MWSBmb3IgVE02MDEwICovCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRjVfQklTVF9FUlJfVlNUMQkJCTB4MDcsIDB4ZjUKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkY2X0JJU1RfRVJSX1ZTVDAJCQkweDA3LCAweGY2CisvKiBPTkxZIGZvciBUTTYwMTAgKi8KKyNkZWZpbmUgVE02MDEwX1JFUTA3X1JGN19CSVNUCQkJCTB4MDcsIDB4ZjcKKy8qIE9OTFkgZm9yIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDdfUkZFX1BPV0VSX0RPV04JCQkweDA3LCAweGZlCisjZGVmaW5lIFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVAkJCTB4MDcsIDB4ZmYKKworLyogRGVmaW5lIFRNNjAwMC9UTTYwMTAgVVNCIHJlZ2lzdGVycyAqLworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjAwX01BSU5fQ1RSTAkJMHgwNSwgMHgwMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjAxX0RFVkFERFIJCTB4MDUsIDB4MDEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IwMl9URVNUCQkJMHgwNSwgMHgwMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA0X1NPRk4wCQkJMHgwNSwgMHgwNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA1X1NPRk4xCQkJMHgwNSwgMHgwNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA2X1NPRlRNMAkJCTB4MDUsIDB4MDYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IwN19TT0ZUTTEJCQkweDA1LCAweDA3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDhfUEhZX1RFU1QJCTB4MDUsIDB4MDgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IwOV9WQ1RMCQkJMHgwNSwgMHgwOQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjBBX1ZTVEEJCQkweDA1LCAweDBhCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMEJfQ1hfQ0ZHCQkJMHgwNSwgMHgwYgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjBDX0VORFAwX1JFRzAJCTB4MDUsIDB4MGMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxMF9HTUFTSwkJCTB4MDUsIDB4MTAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxMV9JTUFTSzAJCQkweDA1LCAweDExCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTJfSU1BU0sxCQkJMHgwNSwgMHgxMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjEzX0lNQVNLMgkJCTB4MDUsIDB4MTMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxNF9JTUFTSzMJCQkweDA1LCAweDE0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTVfSU1BU0s0CQkJMHgwNSwgMHgxNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE2X0lNQVNLNQkJCTB4MDUsIDB4MTYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxN19JTUFTSzYJCQkweDA1LCAweDE3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMThfSU1BU0s3CQkJMHgwNSwgMHgxOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE5X1pFUk9QMAkJCTB4MDUsIDB4MTkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IxQV9aRVJPUDEJCQkweDA1LCAweDFhCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMUNfRklGT19FTVAwCQkweDA1LCAweDFjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMURfRklGT19FTVAxCQkweDA1LCAweDFkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjBfSVJRX0dST1VQCQkweDA1LCAweDIwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjFfSVJRX1NPVVJDRTAJCTB4MDUsIDB4MjEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyMl9JUlFfU09VUkNFMQkJMHgwNSwgMHgyMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIzX0lSUV9TT1VSQ0UyCQkweDA1LCAweDIzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjRfSVJRX1NPVVJDRTMJCTB4MDUsIDB4MjQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyNV9JUlFfU09VUkNFNAkJMHgwNSwgMHgyNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI2X0lSUV9TT1VSQ0U1CQkweDA1LCAweDI2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjdfSVJRX1NPVVJDRTYJCTB4MDUsIDB4MjcKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyOF9JUlFfU09VUkNFNwkJMHgwNSwgMHgyOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI5X1NFUV9FUlIwCQkweDA1LCAweDI5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkFfU0VRX0VSUjEJCTB4MDUsIDB4MmEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyQl9TRVFfQUJPUlQwCQkweDA1LCAweDJiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkNfU0VRX0FCT1JUMQkJMHgwNSwgMHgyYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJEX1RYX1pFUk8wCQkweDA1LCAweDJkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkVfVFhfWkVSTzEJCTB4MDUsIDB4MmUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IyRl9JRExFX0NOVAkJMHgwNSwgMHgyZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMQkJCTB4MDUsIDB4MzAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMV9GTk9fUDIJCQkweDA1LCAweDMxCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzJfRk5PX1AzCQkJMHgwNSwgMHgzMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMzX0ZOT19QNAkJCTB4MDUsIDB4MzMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzNF9GTk9fUDUJCQkweDA1LCAweDM0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzVfRk5PX1A2CQkJMHgwNSwgMHgzNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM2X0ZOT19QNwkJCTB4MDUsIDB4MzYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzN19GTk9fUDgJCQkweDA1LCAweDM3CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzhfRk5PX1A5CQkJMHgwNSwgMHgzOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTAJCTB4MDUsIDB4MzkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDExCQkweDA1LCAweDNhCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxMgkJMHgwNSwgMHgzYgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTMJCTB4MDUsIDB4M2MKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDE0CQkweDA1LCAweDNkCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxNQkJMHgwNSwgMHgzZQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzEJCTB4MDUsIDB4NDAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMQkJMHgwNSwgMHg0MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQyX0lOX01BWFBTX0xPVzIJCTB4MDUsIDB4NDIKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0M19JTl9NQVhQU19ISUdIMgkJMHgwNSwgMHg0MworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ0X0lOX01BWFBTX0xPVzMJCTB4MDUsIDB4NDQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0NV9JTl9NQVhQU19ISUdIMwkJMHgwNSwgMHg0NQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ2X0lOX01BWFBTX0xPVzQJCTB4MDUsIDB4NDYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0N19JTl9NQVhQU19ISUdINAkJMHgwNSwgMHg0NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQ4X0lOX01BWFBTX0xPVzUJCTB4MDUsIDB4NDgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0OV9JTl9NQVhQU19ISUdINQkJMHgwNSwgMHg0OQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjRBX0lOX01BWFBTX0xPVzYJCTB4MDUsIDB4NGEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Ql9JTl9NQVhQU19ISUdINgkJMHgwNSwgMHg0YgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjRDX0lOX01BWFBTX0xPVzcJCTB4MDUsIDB4NGMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0RF9JTl9NQVhQU19ISUdINwkJMHgwNSwgMHg0ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjRFX0lOX01BWFBTX0xPVzgJCTB4MDUsIDB4NGUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Rl9JTl9NQVhQU19ISUdIOAkJMHgwNSwgMHg0ZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjUwX0lOX01BWFBTX0xPVzkJCTB4MDUsIDB4NTAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I1MV9JTl9NQVhQU19ISUdIOQkJMHgwNSwgMHg1MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzEwCQkweDA1LCAweDUyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEwCTB4MDUsIDB4NTMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMQkJMHgwNSwgMHg1NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMQkweDA1LCAweDU1CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTIJCTB4MDUsIDB4NTYKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTIJMHgwNSwgMHg1NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzEzCQkweDA1LCAweDU4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEzCTB4MDUsIDB4NTkKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxNAkJMHgwNSwgMHg1YQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxNAkweDA1LCAweDViCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTUJCTB4MDUsIDB4NWMKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTUJMHgwNSwgMHg1ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxCQkweDA1LCAweDYwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxCTB4MDUsIDB4NjEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Ml9PVVRfTUFYUFNfTE9XMgkJMHgwNSwgMHg2MgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYzX09VVF9NQVhQU19ISUdIMgkweDA1LCAweDYzCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjRfT1VUX01BWFBTX0xPVzMJCTB4MDUsIDB4NjQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2NV9PVVRfTUFYUFNfSElHSDMJMHgwNSwgMHg2NQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY2X09VVF9NQVhQU19MT1c0CQkweDA1LCAweDY2CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjdfT1VUX01BWFBTX0hJR0g0CTB4MDUsIDB4NjcKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2OF9PVVRfTUFYUFNfTE9XNQkJMHgwNSwgMHg2OAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY5X09VVF9NQVhQU19ISUdINQkweDA1LCAweDY5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkFfT1VUX01BWFBTX0xPVzYJCTB4MDUsIDB4NmEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Ql9PVVRfTUFYUFNfSElHSDYJMHgwNSwgMHg2YgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZDX09VVF9NQVhQU19MT1c3CQkweDA1LCAweDZjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkRfT1VUX01BWFBTX0hJR0g3CTB4MDUsIDB4NmQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2RV9PVVRfTUFYUFNfTE9XOAkJMHgwNSwgMHg2ZQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZGX09VVF9NQVhQU19ISUdIOAkweDA1LCAweDZmCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNzBfT1VUX01BWFBTX0xPVzkJCTB4MDUsIDB4NzAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I3MV9PVVRfTUFYUFNfSElHSDkJMHgwNSwgMHg3MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxMAkweDA1LCAweDcyCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxMAkweDA1LCAweDczCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzExCTB4MDUsIDB4NzQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDExCTB4MDUsIDB4NzUKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTIJMHgwNSwgMHg3NgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTIJMHgwNSwgMHg3NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxMwkweDA1LCAweDc4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxMwkweDA1LCAweDc5CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzE0CTB4MDUsIDB4N2EKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDE0CTB4MDUsIDB4N2IKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTUJMHgwNSwgMHg3YworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTUJMHgwNSwgMHg3ZAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgwX0ZJRk8wCQkJMHgwNSwgMHg4MAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xCQkJMHgwNSwgMHg4MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgyX0ZJRk8yCQkJMHgwNSwgMHg4MgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgzX0ZJRk8zCQkJMHgwNSwgMHg4MworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg0X0ZJRk80CQkJMHgwNSwgMHg4NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg1X0ZJRk81CQkJMHgwNSwgMHg4NQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg2X0ZJRk82CQkJMHgwNSwgMHg4NgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg3X0ZJRk83CQkJMHgwNSwgMHg4NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg4X0ZJRk84CQkJMHgwNSwgMHg4OAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjg5X0ZJRk85CQkJMHgwNSwgMHg4OQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xMAkJCTB4MDUsIDB4OGEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTEJCQkweDA1LCAweDhiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzEyCQkJMHgwNSwgMHg4YworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xMwkJCTB4MDUsIDB4OGQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTQJCQkweDA1LCAweDhlCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzE1CQkJMHgwNSwgMHg4ZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkwX0NGR19GSUZPMAkJMHgwNSwgMHg5MAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMQkJMHgwNSwgMHg5MQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkyX0NGR19GSUZPMgkJMHgwNSwgMHg5MgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkzX0NGR19GSUZPMwkJMHgwNSwgMHg5MworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk0X0NGR19GSUZPNAkJMHgwNSwgMHg5NAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk1X0NGR19GSUZPNQkJMHgwNSwgMHg5NQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk2X0NGR19GSUZPNgkJMHgwNSwgMHg5NgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk3X0NGR19GSUZPNwkJMHgwNSwgMHg5NworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk4X0NGR19GSUZPOAkJMHgwNSwgMHg5OAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjk5X0NGR19GSUZPOQkJMHgwNSwgMHg5OQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTAJCTB4MDUsIDB4OWEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzExCQkweDA1LCAweDliCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xMgkJMHgwNSwgMHg5YworI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTMJCTB4MDUsIDB4OWQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzE0CQkweDA1LCAweDllCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xNQkJMHgwNSwgMHg5ZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkEwX0NUTF9GSUZPMAkJMHgwNSwgMHhhMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMQkJMHgwNSwgMHhhMQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkEyX0NUTF9GSUZPMgkJMHgwNSwgMHhhMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkEzX0NUTF9GSUZPMwkJMHgwNSwgMHhhMworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE0X0NUTF9GSUZPNAkJMHgwNSwgMHhhNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE1X0NUTF9GSUZPNQkJMHgwNSwgMHhhNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE2X0NUTF9GSUZPNgkJMHgwNSwgMHhhNgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE3X0NUTF9GSUZPNwkJMHgwNSwgMHhhNworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE4X0NUTF9GSUZPOAkJMHgwNSwgMHhhOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkE5X0NUTF9GSUZPOQkJMHgwNSwgMHhhOQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTAJCTB4MDUsIDB4YWEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzExCQkweDA1LCAweGFiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xMgkJMHgwNSwgMHhhYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTMJCTB4MDUsIDB4YWQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzE0CQkweDA1LCAweGFlCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xNQkJMHgwNSwgMHhhZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIwX0JDX0xPV19GSUZPMAkJMHgwNSwgMHhiMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMQkJMHgwNSwgMHhiMQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIyX0JDX0xPV19GSUZPMgkJMHgwNSwgMHhiMgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIzX0JDX0xPV19GSUZPMwkJMHgwNSwgMHhiMworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI0X0JDX0xPV19GSUZPNAkJMHgwNSwgMHhiNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI1X0JDX0xPV19GSUZPNQkJMHgwNSwgMHhiNQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI2X0JDX0xPV19GSUZPNgkJMHgwNSwgMHhiNgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI3X0JDX0xPV19GSUZPNwkJMHgwNSwgMHhiNworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI4X0JDX0xPV19GSUZPOAkJMHgwNSwgMHhiOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkI5X0JDX0xPV19GSUZPOQkJMHgwNSwgMHhiOQorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTAJCTB4MDUsIDB4YmEKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzExCQkweDA1LCAweGJiCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xMgkJMHgwNSwgMHhiYworI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTMJCTB4MDUsIDB4YmQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzE0CQkweDA1LCAweGJlCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xNQkJMHgwNSwgMHhiZgorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkMwX0RBVEFfRklGTzAJCTB4MDUsIDB4YzAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xCQkweDA1LCAweGM0CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzhfREFUQV9GSUZPMgkJMHgwNSwgMHhjOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkNDX0RBVEFfRklGTzMJCTB4MDUsIDB4Y2MKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JEMF9EQVRBX0ZJRk80CQkweDA1LCAweGQwCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SRDRfREFUQV9GSUZPNQkJMHgwNSwgMHhkNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkQ4X0RBVEFfRklGTzYJCTB4MDUsIDB4ZDgKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JEQ19EQVRBX0ZJRk83CQkweDA1LCAweGRjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SRTBfREFUQV9GSUZPOAkJMHgwNSwgMHhlMAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkU0X0RBVEFfRklGTzkJCTB4MDUsIDB4ZTQKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xMAkJMHgwNSwgMHhlOAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzExCQkweDA1LCAweGVjCisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTIJCTB4MDUsIDB4ZjAKKyNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xMwkJMHgwNSwgMHhmNAorI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzE0CQkweDA1LCAweGY4CisjZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTUJCTB4MDUsIDB4ZmMKKworLyogRGVmaW5lIFRNNjAxMCBBdWRpbyBkZWNvZGVyIHJlZ2lzdGVycyAqLworLyogVGhpcyBjb3JlIGF2YWlsYWJsZSBvbmx5IGluIFRNNjAxMCAqLworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjAwX0FfVkVSU0lPTgkJMHgwOCwgMHgwMAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVAkJCTB4MDgsIDB4MDEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwMl9BX0ZJWF9HQUlOX0NUUkwJMHgwOCwgMHgwMgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwJMHgwOCwgMHgwMworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA0X0FfU0lGX0FNUF9DVFJMCQkweDA4LCAweDA0CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDVfQV9TVEFOREFSRF9NT0QJCTB4MDgsIDB4MDUKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwNl9BX1NPVU5EX01PRAkJMHgwOCwgMHgwNgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA3X0FfTEVGVF9WT0wJCTB4MDgsIDB4MDcKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwOF9BX1JJR0hUX1ZPTAkJMHgwOCwgMHgwOAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA5X0FfTUFJTl9WT0wJCTB4MDgsIDB4MDkKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QJCTB4MDgsIDB4MGEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwQl9BX0FTRF9USFJFUzEJCTB4MDgsIDB4MGIKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwQ19BX0FTRF9USFJFUzIJCTB4MDgsIDB4MGMKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwRF9BX0FNRF9USFJFUwkJMHgwOCwgMHgwZAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjBFX0FfTU9OT19USFJFUzEJCTB4MDgsIDB4MGUKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IwRl9BX01PTk9fVEhSRVMyCQkweDA4LCAweDBmCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTBfQV9NVVRFX1RIUkVTMQkJMHgwOCwgMHgxMAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjExX0FfTVVURV9USFJFUzIJCTB4MDgsIDB4MTEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxMl9BX0FHQ19VCQkweDA4LCAweDEyCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTNfQV9BR0NfRVJSX1QJCTB4MDgsIDB4MTMKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxNF9BX0FHQ19HQUlOX0lOSVQJMHgwOCwgMHgxNAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE1X0FfQUdDX1NURVBfVEhSCQkweDA4LCAweDE1CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTZfQV9BR0NfR0FJTl9NQVgJCTB4MDgsIDB4MTYKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxN19BX0FHQ19HQUlOX01JTgkJMHgwOCwgMHgxNworI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE4X0FfVFJfQ1RSTAkJMHgwOCwgMHgxOAorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE5X0FfRkhfMkZIX0dBSU4JCTB4MDgsIDB4MTkKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IxQV9BX05JQ0FNX1NFUl9NQVgJMHgwOCwgMHgxYQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjFCX0FfTklDQU1fU0VSX01JTgkweDA4LCAweDFiCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMUVfQV9HQUlOX0RFRU1QSF9PVVQJMHgwOCwgMHgxZQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjFGX0FfVEVTVF9JTlRGX1NFTAkweDA4LCAweDFmCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjBfQV9URVNUX1BJTl9TRUwJCTB4MDgsIDB4MjAKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyMV9BX0FHQ19FUlIJCTB4MDgsIDB4MjEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyMl9BX0FHQ19HQUlOCQkweDA4LCAweDIyCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjNfQV9OSUNBTV9JTkZPCQkweDA4LCAweDIzCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjRfQV9TRVIJCQkweDA4LCAweDI0CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjVfQV9DMV9BTVAJCTB4MDgsIDB4MjUKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1IyNl9BX0MyX0FNUAkJMHgwOCwgMHgyNgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI3X0FfTk9JU0VfQU1QCQkweDA4LCAweDI3CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjhfQV9BVURJT19NT0RFX1JFUwkweDA4LCAweDI4CisKKy8qIERlZmluZSBUTTYwMTAgVmlkZW8gQURDIHJlZ2lzdGVycyAqLworI2RlZmluZSBUTTYwMTBfUkVRMDhfUkUwX0FEQ19SRUYJCTB4MDgsIDB4ZTAKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFMV9EQUNfQ0xNUAkJMHgwOCwgMHhlMQorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEJMHgwOCwgMHhlMgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkUzX0FEQ19JTjFfU0VMCQkweDA4LCAweGUzCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwJCTB4MDgsIDB4ZTQKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFNV9HQUlOX1BBUkFNCQkweDA4LCAweGU1CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMgkweDA4LCAweGU2CisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTdfUkVHX0dBSU5fWQkJMHgwOCwgMHhlNworI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU4X1JFR19HQUlOX0MJCTB4MDgsIDB4ZTgKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFOV9CSUFTX0NUUkwJCTB4MDgsIDB4ZTkKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMCQkweDA4LCAweGVhCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTAkJMHgwOCwgMHhlYgorI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTAkweDA4LCAweGVjCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRURfR0FJTl9TRUwJCTB4MDgsIDB4ZWQKKworLyogRGVmaW5lIFRNNjAxMCBBdWRpbyBBREMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRwkweDA4LCAweGYwCisjZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOCTB4MDgsIDB4ZjEKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MCTB4MDgsIDB4ZjIKKyNkZWZpbmUgVE02MDEwX1JFUTA4X1JGM19SSUdIVF9DSEFOTkVMX1ZPTAkweDA4LCAweGYzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtc3Rkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXN0ZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQxNDVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC1zdGRzLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiAgdG02MDAwLXN0ZHMuYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgInRtNjAwMC5oIgorI2luY2x1ZGUgInRtNjAwMC1yZWdzLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG02MDEwX2FfbW9kZTsKK21vZHVsZV9wYXJhbSh0bTYwMTBfYV9tb2RlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0bTYwMTBfYV9tb2RlLCAic2V0IHRtNjAxMCBzaWYgYXVkaW8gbW9kZSIpOworCitzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyB7CisJdW5zaWduZWQgY2hhciByZXE7CisJdW5zaWduZWQgY2hhciByZWc7CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKK307CisKKworc3RydWN0IHRtNjAwMF9zdGRfc2V0dGluZ3MgeworCXY0bDJfc3RkX2lkIGlkOworCXN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzICpjb21tb247Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3MgY29tcG9zaXRlX3BhbF9tW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDA0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ODMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDBhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlMCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBjb21wb3NpdGVfcGFsX25jW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDM2IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDFmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHgwYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBjb21wb3NpdGVfcGFsW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDMyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ZDUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDYzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHg1MCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBjb21wb3NpdGVfc2VjYW1bXSA9IHsKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzggfSwKKwl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI0IH0sCisJeyBUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5MiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4ZTggfSwKKwl7IFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGVkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgyYyB9LAorCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDE4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0MiB9LAorCXsgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4ZmYgfSwKKwl7IFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDcgfSwKKwl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIGNvbXBvc2l0ZV9udHNjW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OGIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGEyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlOSB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRkIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBjb21wb3NpdGVfc3Rkc1tdID0geworCXsgLmlkID0gVjRMMl9TVERfUEFMX00sIC5jb21tb24gPSBjb21wb3NpdGVfcGFsX20sIH0sCisJeyAuaWQgPSBWNEwyX1NURF9QQUxfTmMsIC5jb21tb24gPSBjb21wb3NpdGVfcGFsX25jLCB9LAorCXsgLmlkID0gVjRMMl9TVERfUEFMLCAuY29tbW9uID0gY29tcG9zaXRlX3BhbCwgfSwKKwl7IC5pZCA9IFY0TDJfU1REX1NFQ0FNLCAuY29tbW9uID0gY29tcG9zaXRlX3NlY2FtLCB9LAorCXsgLmlkID0gVjRMMl9TVERfTlRTQywgLmNvbW1vbiA9IGNvbXBvc2l0ZV9udHNjLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIHN2aWRlb19wYWxfbVtdID0geworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwNSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNCB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYSB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkYyB9LAorCXsgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3Mgc3ZpZGVvX3BhbF9uY1tdID0geworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzNyB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNCB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMSB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgxZiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4MGMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkYyB9LAorCXsgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3Mgc3ZpZGVvX3BhbFtdID0geworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzMyB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNCB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMCB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweGQ1IH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHg2MyB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4NTAgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4YyB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJhIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkYyB9LAorCXsgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3Mgc3ZpZGVvX3NlY2FtW10gPSB7CisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDM5IH0sCisJeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAzIH0sCisJeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxIH0sCisJeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNCB9LAorCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTIgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGU4IH0sCisJeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlZCB9LAorCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAorCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAorCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMSB9LAorCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MmMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxOCB9LAorCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKKwl7IFRNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweGZmIH0sCisJeyBUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3IH0sCisJeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyBzdmlkZW9fbnRzY1tdID0geworCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwMSB9LAorCXsgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMyB9LAorCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMCB9LAorCXsgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHg4YiB9LAorCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKKwl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhiIH0sCisJeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMiB9LAorCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTkgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKKwl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKKwl7IFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OCB9LAorCXsgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjEgfSwKKwl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjIH0sCisJeyBUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWMgfSwKKwl7IFRNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyIH0sCisJeyBUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2ZiB9LAorCXsgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkZCB9LAorCXsgVE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwNyB9LAorCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRtNjAwMF9zdGRfc2V0dGluZ3Mgc3ZpZGVvX3N0ZHNbXSA9IHsKKwl7IC5pZCA9IFY0TDJfU1REX1BBTF9NLCAuY29tbW9uID0gc3ZpZGVvX3BhbF9tLCB9LAorCXsgLmlkID0gVjRMMl9TVERfUEFMX05jLCAuY29tbW9uID0gc3ZpZGVvX3BhbF9uYywgfSwKKwl7IC5pZCA9IFY0TDJfU1REX1BBTCwgLmNvbW1vbiA9IHN2aWRlb19wYWwsIH0sCisJeyAuaWQgPSBWNEwyX1NURF9TRUNBTSwgLmNvbW1vbiA9IHN2aWRlb19zZWNhbSwgfSwKKwl7IC5pZCA9IFY0TDJfU1REX05UU0MsIC5jb21tb24gPSBzdmlkZW9fbnRzYywgfSwKK307CisKK3N0YXRpYyBpbnQgdG02MDAwX3NldF9hdWRpb19zdGQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJdWludDhfdCBhcmVnXzAyID0gMHgwNDsgLyogR0MxIEZpeGVkIGdhaW4gMGRCICovCisJdWludDhfdCBhcmVnXzA1ID0gMHgwMTsgLyogQXV0byA0LjUgPSBNIEphcGFuLCBBdXRvIDYuNSA9IERLICovCisJdWludDhfdCBhcmVnXzA2ID0gMHgwMjsgLyogQXV0byBkZS1lbXBoYXNpcywgbWFubnVhbCBjaGFubmVsIG1vZGUgKi8KKwl1aW50OF90IG5pY2FtX2ZsYWcgPSAwOyAvKiBObyBOSUNBTSAqLworCisJaWYgKGRldi0+cmFkaW8pIHsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMl9BX0ZJWF9HQUlOX0NUUkwsIDB4MDQpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDNfQV9BVVRPX0dBSU5fQ1RSTCwgMHgwMCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTCwgMHg4MCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNV9BX1NUQU5EQVJEX01PRCwgMHgwYyk7CisJCS8qIHNldCBtb25vIG9yIHN0ZXJlbyAqLworCQlpZiAoZGV2LT5hbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNl9BX1NPVU5EX01PRCwgMHgwMCk7CisJCWVsc2UgaWYgKGRldi0+YW1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNl9BX1NPVU5EX01PRCwgMHgwMik7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MLCAweDE4KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBDX0FfQVNEX1RIUkVTMiwgMHgwYSk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwRF9BX0FNRF9USFJFUywgMHg0MCk7CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGMV9BQURDX1BPV0VSX0RPV04sIDB4ZmUpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMUVfQV9HQUlOX0RFRU1QSF9PVVQsIDB4MTMpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDFfQV9JTklULCAweDgwKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZFX1BPV0VSX0RPV04sIDB4ZmYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHRtNjAxMF9hX21vZGUpIHsKKwkvKiBhdXRvICovCisJY2FzZSAwOgorCQlzd2l0Y2ggKGRldi0+bm9ybSkgeworCQljYXNlIFY0TDJfU1REX05UU0NfTV9LUjoKKwkJCWFyZWdfMDUgfD0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX05UU0NfTV9KUDoKKwkJCWFyZWdfMDUgfD0gMHg0MDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX05UU0NfTToKKwkJY2FzZSBWNEwyX1NURF9QQUxfTToKKwkJY2FzZSBWNEwyX1NURF9QQUxfTjoKKwkJCWFyZWdfMDUgfD0gMHgyMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX1BBTF9OYzoKKwkJCWFyZWdfMDUgfD0gMHg2MDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX1NFQ0FNX0w6CisJCQlhcmVnXzA1IHw9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1NURF9ESzoKKwkJCWFyZWdfMDUgfD0gMHgxMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCS8qIEEyICovCisJY2FzZSAxOgorCQlzd2l0Y2ggKGRldi0+bm9ybSkgeworCQljYXNlIFY0TDJfU1REX0I6CisJCWNhc2UgVjRMMl9TVERfR0g6CisJCQlhcmVnXzA1ID0gMHgwNTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX0RLOgorCQkJYXJlZ18wNSA9IDB4MDk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkvKiBOSUNBTSAqLworCWNhc2UgMjoKKwkJc3dpdGNoIChkZXYtPm5vcm0pIHsKKwkJY2FzZSBWNEwyX1NURF9COgorCQljYXNlIFY0TDJfU1REX0dIOgorCQkJYXJlZ18wNSA9IDB4MDc7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1NURF9ESzoKKwkJCWFyZWdfMDUgPSAweDA2OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfUEFMX0k6CisJCQlhcmVnXzA1ID0gMHgwODsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfU1REX1NFQ0FNX0w6CisJCQlhcmVnXzA1ID0gMHgwYTsKKwkJCWFyZWdfMDIgPSAweDAyOworCQkJYnJlYWs7CisJCX0KKwkJbmljYW1fZmxhZyA9IDE7CisJCWJyZWFrOworCS8qIG90aGVyICovCisJY2FzZSAzOgorCQlzd2l0Y2ggKGRldi0+bm9ybSkgeworCQkvKiBESzNfQTIgKi8KKwkJY2FzZSBWNEwyX1NURF9ESzoKKwkJCWFyZWdfMDUgPSAweDBiOworCQkJYnJlYWs7CisJCS8qIEtvcmVhICovCisJCWNhc2UgVjRMMl9TVERfTlRTQ19NX0tSOgorCQkJYXJlZ18wNSA9IDB4MDQ7CisJCQlicmVhazsKKwkJLyogRUlBSiAqLworCQljYXNlIFY0TDJfU1REX05UU0NfTV9KUDoKKwkJCWFyZWdfMDUgPSAweDAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhcmVnXzA1ID0gMHgwMjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMl9BX0ZJWF9HQUlOX0NUUkwsIGFyZWdfMDIpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwM19BX0FVVE9fR0FJTl9DVFJMLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDRfQV9TSUZfQU1QX0NUUkwsIDB4YTApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNV9BX1NUQU5EQVJEX01PRCwgYXJlZ18wNSk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA2X0FfU09VTkRfTU9ELCBhcmVnXzA2KTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDdfQV9MRUZUX1ZPTCwgMHgwMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA4X0FfUklHSFRfVk9MLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDlfQV9NQUlOX1ZPTCwgMHgwOCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRCwgMHg5MSk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBCX0FfQVNEX1RIUkVTMSwgMHgyMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBDX0FfQVNEX1RIUkVTMiwgMHgxMik7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBEX0FfQU1EX1RIUkVTLCAweDIwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEVfQV9NT05PX1RIUkVTMSwgMHhmMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjBGX0FfTU9OT19USFJFUzIsIDB4ODApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxMF9BX01VVEVfVEhSRVMxLCAweGMwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTFfQV9NVVRFX1RIUkVTMiwgMHg4MCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEyX0FfQUdDX1UsIDB4MTIpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxM19BX0FHQ19FUlJfVCwgMHhmZSk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE0X0FfQUdDX0dBSU5fSU5JVCwgMHgyMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE1X0FfQUdDX1NURVBfVEhSLCAweDE0KTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTZfQV9BR0NfR0FJTl9NQVgsIDB4ZmUpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxN19BX0FHQ19HQUlOX01JTiwgMHgwMSk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE4X0FfVFJfQ1RSTCwgMHhhMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE5X0FfRkhfMkZIX0dBSU4sIDB4MzIpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxQV9BX05JQ0FNX1NFUl9NQVgsIDB4NjQpOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxQl9BX05JQ0FNX1NFUl9NSU4sIDB4MjApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA4X1NFVF9HRVRfQVZSRUdfQklULCAweDFjLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wOF9TRVRfR0VUX0FWUkVHX0JJVCwgMHgxZCwgMHgwMCk7CisJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFFX0FfR0FJTl9ERUVNUEhfT1VULCAweDEzKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMUZfQV9URVNUX0lOVEZfU0VMLCAweDAwKTsKKwl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMjBfQV9URVNUX1BJTl9TRUwsIDB4MDApOworCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4ODApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdG02MDAwX2dldF9zdGRfcmVzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCS8qIEN1cnJlbnRseSwgdGhvc2UgYXJlIHRoZSBvbmx5IHN1cHBvcnRlZCByZXNvbHRpb25zICovCisJaWYgKGRldi0+bm9ybSAmIFY0TDJfU1REXzUyNV82MCkKKwkJZGV2LT5oZWlnaHQgPSA0ODA7CisJZWxzZQorCQlkZXYtPmhlaWdodCA9IDU3NjsKKworCWRldi0+d2lkdGggPSA3MjA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX2xvYWRfc3RkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyAqc2V0KQoreworCWludCBpLCByYzsKKworCS8qIExvYWQgYm9hcmQncyBpbml0aWFsaXphdGlvbiB0YWJsZSAqLworCWZvciAoaSA9IDA7IHNldFtpXS5yZXE7IGkrKykgeworCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgc2V0W2ldLnJlcSwgc2V0W2ldLnJlZywgc2V0W2ldLnZhbHVlKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSBzZXR0aW5nICIKKwkJCSAgICAgICAicmVxICVkLCByZWcgJWQgdG8gdmFsdWUgJWRcbiIsCisJCQkgICAgICAgcmMsIHNldFtpXS5yZXEsIHNldFtpXS5yZWcsIHNldFtpXS52YWx1ZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRtNjAwMF9zZXRfc3RhbmRhcmQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHRtNjAwMF9pbnB1dCAqaW5wdXQ7CisJaW50IGksIHJjID0gMDsKKwl1OCByZWdfMDdfZmUgPSAweDhhOworCXU4IHJlZ18wOF9mMSA9IDB4ZmM7CisJdTggcmVnXzA4X2UyID0gMHhmMDsKKwl1OCByZWdfMDhfZTYgPSAweDBmOworCisJdG02MDAwX2dldF9zdGRfcmVzKGRldik7CisKKwlpZiAoIWRldi0+cmFkaW8pCisJCWlucHV0ID0gJmRldi0+dmlucHV0W2Rldi0+aW5wdXRdOworCWVsc2UKKwkJaW5wdXQgPSAmZGV2LT5yaW5wdXQ7CisKKwlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKKwkJc3dpdGNoIChpbnB1dC0+dm11eCkgeworCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0E6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjQpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwsIDB4ZjEpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZTApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTCwgMHhjMik7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRURfR0FJTl9TRUwsIDB4ZTgpOworCQkJcmVnXzA3X2ZlIHw9IDB4MDE7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19COgorCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUzX0FEQ19JTjFfU0VMLCAweGY4KTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYxKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMLCAweGUwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwsIDB4YzIpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMLCAweGU4KTsKKwkJCXJlZ18wN19mZSB8PSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQUI6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZmMpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMLCAweGY4KTsKKwkJCXJlZ18wOF9lNiA9IDB4MDA7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTCwgMHhmMik7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTCwgMHhmMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFRF9HQUlOX1NFTCwgMHhlMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoaW5wdXQtPmFtdXgpIHsKKwkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgorCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKKwkJCQkweDAwLCAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6CisJCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAorCQkJCTB4MDgsIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKKwkJCXJlZ18wOF9lMiB8PSAweDAyOworCQkJcmVnXzA4X2U2ID0gMHgwODsKKwkJCXJlZ18wN19mZSB8PSAweDQwOworCQkJcmVnXzA4X2YxIHw9IDB4MDI7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjMpOworCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKKwkJCQkweDAyLCAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6CisJCQlyZWdfMDhfZTIgfD0gMHgwMjsKKwkJCXJlZ18wOF9lNiA9IDB4MDg7CisJCQlyZWdfMDdfZmUgfD0gMHg0MDsKKwkJCXJlZ18wOF9mMSB8PSAweDAyOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMLCAweGY3KTsKKwkJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCisJCQkJMHgwMiwgMHgwZik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFMl9QT1dFUl9ET1dOX0NUUkwxLCByZWdfMDhfZTIpOworCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgcmVnXzA4X2U2KTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkYxX0FBRENfUE9XRVJfRE9XTiwgcmVnXzA4X2YxKTsKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZFX1BPV0VSX0RPV04sIHJlZ18wN19mZSk7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChpbnB1dC0+dm11eCkgeworCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0E6CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTNfVkFEQ19JTlBfTFBGX1NFTDEsIDB4MTApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU1X1ZBRENfSU5QX0xQRl9TRUwyLCAweDAwKTsKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwsIDB4MGYpOworCQkJdG02MDAwX3NldF9yZWcoZGV2LAorCQkJICAgIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGlucHV0LT52X2dwaW8sIDApOworCQkJYnJlYWs7CisJCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQjoKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgwMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MDApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHgwZik7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQkgICAgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgaW5wdXQtPnZfZ3BpbywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19BQjoKKwkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgxMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MTApOworCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHgwMCk7CisJCQl0bTYwMDBfc2V0X3JlZyhkZXYsCisJCQkgICAgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgaW5wdXQtPnZfZ3BpbywgMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAoaW5wdXQtPmFtdXgpIHsKKwkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgorCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCisJCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwMCwgMHgwZik7CisJCQlicmVhazsKKwkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgorCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCisJCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwNCwgMHgwZik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpbnB1dC0+dHlwZSA9PSBUTTYwMDBfSU5QVVRfU1ZJREVPKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN2aWRlb19zdGRzKTsgaSsrKSB7CisJCQlpZiAoZGV2LT5ub3JtICYgc3ZpZGVvX3N0ZHNbaV0uaWQpIHsKKwkJCQlyYyA9IHRtNjAwMF9sb2FkX3N0ZChkZXYsIHN2aWRlb19zdGRzW2ldLmNvbW1vbik7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tcG9zaXRlX3N0ZHMpOyBpKyspIHsKKwkJCWlmIChkZXYtPm5vcm0gJiBjb21wb3NpdGVfc3Rkc1tpXS5pZCkgeworCQkJCXJjID0gdG02MDAwX2xvYWRfc3RkKGRldiwgY29tcG9zaXRlX3N0ZHNbaV0uY29tbW9uKTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK3JldDoKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSAmJgorCSAgICAoKGlucHV0LT5hbXV4ID09IFRNNjAwMF9BTVVYX1NJRjEpIHx8CisJICAgIChpbnB1dC0+YW11eCA9PSBUTTYwMDBfQU1VWF9TSUYyKSkpCisJCXRtNjAwMF9zZXRfYXVkaW9fc3RkKGRldik7CisKKwltc2xlZXAoNDApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtdXNiLWlzb2MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZDE1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtdXNiLWlzb2MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogIHRtNjAwMC1idWYuYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNkZWZpbmUgVE02MDAwX1VSQl9NU0dfTEVOIDE4MAorCitzdHJ1Y3QgdXNiX2lzb2NfY3RsIHsKKwkJLyogbWF4IHBhY2tldCBzaXplIG9mIGlzb2MgdHJhbnNhY3Rpb24gKi8KKwlpbnQJCQkJbWF4X3BrdF9zaXplOworCisJCS8qIG51bWJlciBvZiBhbGxvY2F0ZWQgdXJicyAqLworCWludAkJCQludW1fYnVmczsKKworCQkvKiB1cmIgZm9yIGlzb2MgdHJhbnNmZXJzICovCisJc3RydWN0IHVyYgkJCSoqdXJiOworCisJCS8qIHRyYW5zZmVyIGJ1ZmZlcnMgZm9yIGlzb2MgdHJhbnNmZXIgKi8KKwljaGFyCQkJCSoqdHJhbnNmZXJfYnVmZmVyOworCisJCS8qIExhc3QgYnVmZmVyIGNvbW1hbmQgYW5kIHJlZ2lvbiAqLworCXU4CQkJCWNtZDsKKwlpbnQJCQkJcG9zLCBzaXplLCBwa3RzaXplOworCisJCS8qIExhc3QgZmllbGQ6IE9ERCBvciBFVkVOPyAqLworCWludAkJCQl2ZmllbGQsIGZpZWxkOworCisJCS8qIFN0b3JlcyBpbmNvbXBsZXRlIGNvbW1hbmRzICovCisJdTMyCQkJCXRtcF9idWY7CisJaW50CQkJCXRtcF9idWZfbGVuOworCisJCS8qIFN0b3JlcyBhbHJlYWR5IHJlcXVlc3RlZCBidWZmZXJzICovCisJc3RydWN0IHRtNjAwMF9idWZmZXIJCSpidWY7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAtdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVhY2UwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLXZpZGVvLmMKQEAgLTAsMCArMSwxODEzIEBACisvKgorICogICB0bTYwMDAtdmlkZW8uYyAtIGRyaXZlciBmb3IgVE01NjAwL1RNNjAwMC9UTTYwMTAgVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hlbCBMdWR3aWcgPG1pY2hlbC5sdWR3aWdAZ21haWwuY29tPgorICoJLSBGaXhlZCBtb2R1bGUgbG9hZC91bmxvYWQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisKKyNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgorI2luY2x1ZGUgInRtNjAwMC5oIgorCisjZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICBtc2Vjc190b19qaWZmaWVzKDIwMDApICAvKiAyIHNlY29uZHMgKi8KKworLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgVE02MDAwX01JTl9CVUYgNAorI2RlZmluZSBUTTYwMDBfREVGX0JVRiA4CisKKyNkZWZpbmUgVE02MDAwX01BWF9JU09fUEFDS0VUUwk0NgkvKiBNYXggbnVtYmVyIG9mIElTTyBwYWNrZXRzICovCisKKy8qIERlY2xhcmUgc3RhdGljIHZhcnMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2aWRfbGltaXQgPSAxNjsJLyogVmlkZW8gbWVtb3J5IGxpbWl0LCBpbiBNYiAqLworc3RhdGljIGludCB2aWRlb19uciA9IC0xOwkJLyogL2Rldi92aWRlb04sIC0xIGZvciBhdXRvZGV0ZWN0ICovCitzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CQkvKiAvZGV2L3JhZGlvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KKworLyogRGVidWcgbGV2ZWwgKi8KK2ludCB0bTYwMDBfZGVidWc7CitFWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZGVidWcpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG5vX2N0cmwgPSB7CisJLm5hbWUgID0gIjQyIiwKKwkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKK307CisKKy8qIHN1cHBvcnRlZCBjb250cm9scyAqLworc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB0bTYwMDBfcWN0cmxbXSA9IHsKKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDU0LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDI1NSwKKwkJLnN0ZXAgICAgICAgICAgPSAweDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMTE5LAorCQkuZmxhZ3MgICAgICAgICA9IDAsCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAyNTUsCisJCS5zdGVwICAgICAgICAgID0gMHgxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDExMiwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sIHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKKwkJLm1pbmltdW0gICAgICAgPSAtMTI4LAorCQkubWF4aW11bSAgICAgICA9IDEyNywKKwkJLnN0ZXAgICAgICAgICAgPSAweDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLmZsYWdzICAgICAgICAgPSAwLAorCX0sCisJCS8qIC0tLSBhdWRpbyAtLS0gKi8KKwl7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCisJCS5taW5pbXVtICAgICAgID0gMCwKKwkJLm1heGltdW0gICAgICAgPSAxLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJfSwgeworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKKwkJLm5hbWUgICAgICAgICAgPSAiVm9sdW1lIiwKKwkJLm1pbmltdW0gICAgICAgPSAtMTUsCisJCS5tYXhpbXVtICAgICAgID0gMTUsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBDVFJMUyA9IEFSUkFZX1NJWkUodG02MDAwX3FjdHJsKTsKK3N0YXRpYyBpbnQgcWN0bF9yZWdzW0FSUkFZX1NJWkUodG02MDAwX3FjdHJsKV07CisKK3N0YXRpYyBzdHJ1Y3QgdG02MDAwX2ZtdCBmb3JtYXRbXSA9IHsKKwl7CisJCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBZVlkyIiwKKwkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5kZXB0aCAgICA9IDE2LAorCX0sIHsKKwkJLm5hbWUgICAgID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVVlWWSwKKwkJLmRlcHRoICAgID0gMTYsCisJfSwgeworCQkubmFtZSAgICAgPSAiQS9WICsgVkJJIG11eCBwYWNrZXQiLAorCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVE02MDAwLAorCQkuZGVwdGggICAgPSAxNiwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsX2J5X2lkKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDVFJMUzsgaSsrKQorCQlpZiAodG02MDAwX3FjdHJsW2ldLmlkID09IGlkKQorCQkJcmV0dXJuIHRtNjAwMF9xY3RybCtpOworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCURNQSBhbmQgdGhyZWFkIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBub3JtX21heHcoYSkgNzIwCisjZGVmaW5lIG5vcm1fbWF4aChhKSA1NzYKKworI2RlZmluZSBub3JtX21pbncoYSkgbm9ybV9tYXh3KGEpCisjZGVmaW5lIG5vcm1fbWluaChhKSBub3JtX21heGgoYSkKKworLyoKKyAqIHZpZGVvLWJ1ZiBnZW5lcmljIHJvdXRpbmUgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdldF9uZXh0X2J1ZihzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKKwkJCSAgICAgICBzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICoqYnVmKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gY29udGFpbmVyX29mKGRtYV9xLCBzdHJ1Y3QgdG02MDAwX2NvcmUsIHZpZHEpOworCWNoYXIgKm91dHA7CisKKwlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKKwkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJObyBhY3RpdmUgcXVldWUgdG8gc2VydmVcbiIpOworCQkqYnVmID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCSpidWYgPSBsaXN0X2VudHJ5KGRtYV9xLT5hY3RpdmUubmV4dCwKKwkJCXN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yi5xdWV1ZSk7CisKKwkvKiBDbGVhbnMgdXAgYnVmZmVyIC0gVXNlZnVsIGZvciB0ZXN0aW5nIGZvciBmcmFtZS9VUkIgbG9zcyAqLworCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoKmJ1ZiktPnZiKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIEFubm91bmNlcyB0aGF0IGEgYnVmZmVyIHdlcmUgZmlsbGVkIGFuZCByZXF1ZXN0IHRoZSBuZXh0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZmZXJfZmlsbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAorCQkJCSBzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKKwkJCQkgc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZikKK3sKKwkvKiBBZHZpY2UgdGhhdCBidWZmZXIgd2FzIGZpbGxlZCAqLworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJbJXAvJWRdIHdha2V1cFxuIiwgYnVmLCBidWYtPnZiLmkpOworCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOworCWJ1Zi0+dmIuZmllbGRfY291bnQrKzsKKwlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOworCisJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOworCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7Cit9CisKKy8qCisgKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCisgKi8KK3N0YXRpYyBpbnQgY29weV9zdHJlYW1zKHU4ICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCXN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7CisJdTggKnB0ciA9IGRhdGEsICplbmRwID0gZGF0YStsZW4sIGM7CisJdW5zaWduZWQgbG9uZyBoZWFkZXIgPSAwOworCWludCByYyA9IDA7CisJdW5zaWduZWQgaW50IGNtZCwgY3B5c2l6ZSwgcGt0c2l6ZSwgc2l6ZSwgZmllbGQsIGJsb2NrLCBsaW5lLCBwb3MgPSAwOworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICp2YnVmID0gTlVMTDsKKwljaGFyICp2b3V0cCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGxpbmV3aWR0aDsKKworCWlmICghZGV2LT5yYWRpbykgeworCQkvKiBnZXQgdmlkZW8gYnVmZmVyICovCisJCWdldF9uZXh0X2J1ZihkbWFfcSwgJnZidWYpOworCisJCWlmICghdmJ1ZikKKwkJCXJldHVybiByYzsKKwkJdm91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZ2YnVmLT52Yik7CisKKwkJaWYgKCF2b3V0cCkKKwkJCXJldHVybiAwOworCX0KKworCWZvciAocHRyID0gZGF0YTsgcHRyIDwgZW5kcDspIHsKKwkJaWYgKCFkZXYtPmlzb2NfY3RsLmNtZCkgeworCQkJLyogSGVhZGVyICovCisJCQlpZiAoZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA+IDApIHsKKwkJCQkvKiBmcm9tIGxhc3QgdXJiIG9yIHBhY2tldCAqLworCQkJCWhlYWRlciA9IGRldi0+aXNvY19jdGwudG1wX2J1ZjsKKwkJCQlpZiAoNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPiAwKSB7CisJCQkJCW1lbWNweSgodTggKikmaGVhZGVyICsKKwkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4sCisJCQkJCQlwdHIsCisJCQkJCQk0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7CisJCQkJCXB0ciArPSA0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbjsKKwkJCQl9CisJCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlmIChwdHIgKyAzID49IGVuZHApIHsKKwkJCQkJLyogaGF2ZSBpbmNvbXBsZXRlIGhlYWRlciAqLworCQkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuID0gZW5kcCAtIHB0cjsKKwkJCQkJbWVtY3B5KCZkZXYtPmlzb2NfY3RsLnRtcF9idWYsIHB0ciwKKwkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4pOworCQkJCQlyZXR1cm4gcmM7CisJCQkJfQorCQkJCS8qIFNlZWsgZm9yIHN5bmMgKi8KKwkJCQlmb3IgKDsgcHRyIDwgZW5kcCAtIDM7IHB0cisrKSB7CisJCQkJCWlmICgqKHB0ciArIDMpID09IDB4NDcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogR2V0IG1lc3NhZ2UgaGVhZGVyICovCisJCQkJaGVhZGVyID0gKih1bnNpZ25lZCBsb25nICopcHRyOworCQkJCXB0ciArPSA0OworCQkJfQorCisJCQkvKiBzcGxpdCB0aGUgaGVhZGVyIGZpZWxkcyAqLworCQkJYyA9IChoZWFkZXIgPj4gMjQpICYgMHhmZjsKKwkJCXNpemUgPSAoKGhlYWRlciAmIDB4N2UpIDw8IDEpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXNpemUgLT0gNDsKKwkJCWJsb2NrID0gKGhlYWRlciA+PiA3KSAmIDB4ZjsKKwkJCWZpZWxkID0gKGhlYWRlciA+PiAxMSkgJiAweDE7CisJCQlsaW5lICA9IChoZWFkZXIgPj4gMTIpICYgMHgxZmY7CisJCQljbWQgICA9IChoZWFkZXIgPj4gMjEpICYgMHg3OworCQkJLyogVmFsaWRhdGVzIGhhZWRlciBmaWVsZHMgKi8KKwkJCWlmIChzaXplID4gVE02MDAwX1VSQl9NU0dfTEVOKQorCQkJCXNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47CisJCQlwa3RzaXplID0gVE02MDAwX1VSQl9NU0dfTEVOOworCQkJLyoKKwkJCSAqIGNhbGN1bGF0ZSBwb3NpdGlvbiBpbiBidWZmZXIgYW5kIGNoYW5nZSB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCXN3aXRjaCAoY21kKSB7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgorCQkJCWlmICghZGV2LT5yYWRpbykgeworCQkJCQlpZiAoKGRldi0+aXNvY19jdGwudmZpZWxkICE9IGZpZWxkKSAmJgorCQkJCQkJKGZpZWxkID09IDEpKSB7CisJCQkJCQkvKgorCQkJCQkJICogQW5ub3VuY2VzIHRoYXQgYSBuZXcgYnVmZmVyCisJCQkJCQkgKiB3ZXJlIGZpbGxlZAorCQkJCQkJICovCisJCQkJCQlidWZmZXJfZmlsbGVkKGRldiwgZG1hX3EsIHZidWYpOworCQkJCQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywKKwkJCQkJCQkibmV3IGJ1ZmZlciBmaWxsZWRcbiIpOworCQkJCQkJZ2V0X25leHRfYnVmKGRtYV9xLCAmdmJ1Zik7CisJCQkJCQlpZiAoIXZidWYpCisJCQkJCQkJcmV0dXJuIHJjOworCQkJCQkJdm91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZ2YnVmLT52Yik7CisJCQkJCQlpZiAoIXZvdXRwKQorCQkJCQkJCXJldHVybiByYzsKKwkJCQkJCW1lbXNldCh2b3V0cCwgMCwgdmJ1Zi0+dmIuc2l6ZSk7CisJCQkJCX0KKwkJCQkJbGluZXdpZHRoID0gdmJ1Zi0+dmIud2lkdGggPDwgMTsKKwkJCQkJcG9zID0gKChsaW5lIDw8IDEpIC0gZmllbGQgLSAxKSAqCisJCQkJCWxpbmV3aWR0aCArIGJsb2NrICogVE02MDAwX1VSQl9NU0dfTEVOOworCQkJCQkvKiBEb24ndCBhbGxvdyB0byB3cml0ZSBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCQkJCQlpZiAocG9zICsgc2l6ZSA+IHZidWYtPnZiLnNpemUpCisJCQkJCQljbWQgPSBUTTYwMDBfVVJCX01TR19FUlI7CisJCQkJCWRldi0+aXNvY19jdGwudmZpZWxkID0gZmllbGQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUTTYwMDBfVVJCX01TR19WQkk6CisJCQkJYnJlYWs7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX0FVRElPOgorCQkJY2FzZSBUTTYwMDBfVVJCX01TR19QVFM6CisJCQkJc2l6ZSA9IHBrdHNpemU7IC8qIFNpemUgaXMgYWx3YXlzIDE4MCBieXRlcyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQ29udGludWUgdGhlIGxhc3QgY29weSAqLworCQkJY21kID0gZGV2LT5pc29jX2N0bC5jbWQ7CisJCQlzaXplID0gZGV2LT5pc29jX2N0bC5zaXplOworCQkJcG9zID0gZGV2LT5pc29jX2N0bC5wb3M7CisJCQlwa3RzaXplID0gZGV2LT5pc29jX2N0bC5wa3RzaXplOworCQkJZmllbGQgPSBkZXYtPmlzb2NfY3RsLmZpZWxkOworCQl9CisJCWNweXNpemUgPSAoZW5kcCAtIHB0ciA+IHNpemUpID8gc2l6ZSA6IGVuZHAgLSBwdHI7CisJCWlmIChjcHlzaXplKSB7CisJCQkvKiBjb3B5IGRhdGEgaW4gZGlmZmVyZW50IGJ1ZmZlcnMgKi8KKwkJCXN3aXRjaCAoY21kKSB7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgorCQkJCS8qIEZpbGxzIHZpZGVvIGJ1ZmZlciAqLworCQkJCWlmICh2YnVmKQorCQkJCQltZW1jcHkoJnZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX0FVRElPOiB7CisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IGNweXNpemU7IGkgKz0gMikKKwkJCQkJc3dhYjE2cygodTE2ICopKHB0ciArIGkpKTsKKworCQkJCXRtNjAwMF9jYWxsX2ZpbGxidWYoZGV2LCBUTTYwMDBfQVVESU8sIHB0ciwgY3B5c2l6ZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKKwkJCQkvKiBOZWVkIHNvbWUgY29kZSB0byBjb3B5IHZiaSBidWZmZXIgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgVE02MDAwX1VSQl9NU0dfUFRTOiB7CisJCQkJLyogTmVlZCBzb21lIGNvZGUgdG8gY29weSBwdHMgKi8KKwkJCQl1MzIgcHRzOworCQkJCXB0cyA9ICoodTMyICopcHRyOworCQkJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJmaWVsZCAlZCwgUFRTICV4IiwKKwkJCQkJZmllbGQsIHB0cyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl9CisJCX0KKwkJaWYgKHB0ciArIHBrdHNpemUgPiBlbmRwKSB7CisJCQkvKgorCQkJICogRW5kIG9mIFVSQiBwYWNrZXQsIGJ1dCBjbWQgcHJvY2Vzc2luZyBpcyBub3QKKwkJCSAqIGNvbXBsZXRlLiBQcmVzZXJ2ZSB0aGUgc3RhdGUgZm9yIGEgbmV4dCBwYWNrZXQKKwkJCSAqLworCQkJZGV2LT5pc29jX2N0bC5wb3MgPSBwb3MgKyBjcHlzaXplOworCQkJZGV2LT5pc29jX2N0bC5zaXplID0gc2l6ZSAtIGNweXNpemU7CisJCQlkZXYtPmlzb2NfY3RsLmNtZCA9IGNtZDsKKwkJCWRldi0+aXNvY19jdGwuZmllbGQgPSBmaWVsZDsKKwkJCWRldi0+aXNvY19jdGwucGt0c2l6ZSA9IHBrdHNpemUgLSAoZW5kcCAtIHB0cik7CisJCQlwdHIgKz0gZW5kcCAtIHB0cjsKKwkJfSBlbHNlIHsKKwkJCWRldi0+aXNvY19jdGwuY21kID0gMDsKKwkJCXB0ciArPSBwa3RzaXplOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSWRlbnRpZnkgdGhlIHRtNTYwMC82MDAwIGJ1ZmZlciBoZWFkZXIgdHlwZSBhbmQgcHJvcGVybHkgaGFuZGxlcworICovCitzdGF0aWMgaW50IGNvcHlfbXVsdGlwbGV4ZWQodTggKnB0ciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQlzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHRtNjAwMF9kbWFxdWV1ZSAgKmRtYV9xID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gY29udGFpbmVyX29mKGRtYV9xLCBzdHJ1Y3QgdG02MDAwX2NvcmUsIHZpZHEpOworCXVuc2lnbmVkIGludCBwb3MgPSBkZXYtPmlzb2NfY3RsLnBvcywgY3B5c2l6ZTsKKwlpbnQgcmMgPSAxOworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWY7CisJY2hhciAqb3V0cCA9IE5VTEw7CisKKwlnZXRfbmV4dF9idWYoZG1hX3EsICZidWYpOworCWlmIChidWYpCisJCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZidWYtPnZiKTsKKworCWlmICghb3V0cCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQljcHlzaXplID0gbWluKGxlbiwgYnVmLT52Yi5zaXplLXBvcyk7CisJCW1lbWNweSgmb3V0cFtwb3NdLCBwdHIsIGNweXNpemUpOworCQlwb3MgKz0gY3B5c2l6ZTsKKwkJcHRyICs9IGNweXNpemU7CisJCWxlbiAtPSBjcHlzaXplOworCQlpZiAocG9zID49IGJ1Zi0+dmIuc2l6ZSkgeworCQkJcG9zID0gMDsKKwkJCS8qIEFubm91bmNlcyB0aGF0IGEgbmV3IGJ1ZmZlciB3ZXJlIGZpbGxlZCAqLworCQkJYnVmZmVyX2ZpbGxlZChkZXYsIGRtYV9xLCBidWYpOworCQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSVNPQywgIm5ldyBidWZmZXIgZmlsbGVkXG4iKTsKKwkJCWdldF9uZXh0X2J1ZihkbWFfcSwgJmJ1Zik7CisJCQlpZiAoIWJ1ZikKKwkJCQlicmVhazsKKwkJCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoYnVmLT52YikpOworCQkJaWYgKCFvdXRwKQorCQkJCXJldHVybiByYzsKKwkJCXBvcyA9IDA7CisJCX0KKwl9CisKKwlkZXYtPmlzb2NfY3RsLnBvcyA9IHBvczsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9lcnJfc3RhdHVzKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAorCQkJCSAgICAgaW50IHBhY2tldCwgaW50IHN0YXR1cykKK3sKKwljaGFyICplcnJtc2cgPSAiVW5rbm93biI7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLUVOT0VOVDoKKwkJZXJybXNnID0gInVubGlua2VkIHN5bmNocm9udW91c2x5IjsKKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJZXJybXNnID0gInVubGlua2VkIGFzeW5jaHJvbnVvdXNseSI7CisJCWJyZWFrOworCWNhc2UgLUVOT1NSOgorCQllcnJtc2cgPSAiQnVmZmVyIGVycm9yIChvdmVycnVuKSI7CisJCWJyZWFrOworCWNhc2UgLUVQSVBFOgorCQllcnJtc2cgPSAiU3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSI7CisJCWJyZWFrOworCWNhc2UgLUVPVkVSRkxPVzoKKwkJZXJybXNnID0gIkJhYmJsZSAoYmFkIGNhYmxlPykiOworCQlicmVhazsKKwljYXNlIC1FUFJPVE86CisJCWVycm1zZyA9ICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIjsKKwkJYnJlYWs7CisJY2FzZSAtRUlMU0VROgorCQllcnJtc2cgPSAiQ1JDL1RpbWVvdXQgKGNvdWxkIGJlIGFueXRoaW5nKSI7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FOgorCQllcnJtc2cgPSAiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQiOworCQlicmVhazsKKwl9CisJaWYgKHBhY2tldCA8IDApIHsKKwkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJVUkIgc3RhdHVzICVkIFslc10uXG4iLAorCQkJc3RhdHVzLCBlcnJtc2cpOworCX0gZWxzZSB7CisJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX1FVRVVFLCAiVVJCIHBhY2tldCAlZCwgc3RhdHVzICVkIFslc10uXG4iLAorCQkJcGFja2V0LCBzdGF0dXMsIGVycm1zZyk7CisJfQorfQorCisKKy8qCisgKiBDb250cm9scyB0aGUgaXNvYyBjb3B5IG9mIGVhY2ggdXJiIHBhY2tldAorICovCitzdGF0aWMgaW5saW5lIGludCB0bTYwMDBfaXNvY19jb3B5KHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7CisJaW50IGksIGxlbiA9IDAsIHJjID0gMSwgc3RhdHVzOworCWNoYXIgKnA7CisKKwlpZiAodXJiLT5zdGF0dXMgPCAwKSB7CisJCXByaW50X2Vycl9zdGF0dXMoZGV2LCAtMSwgdXJiLT5zdGF0dXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCXN0YXR1cyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcmludF9lcnJfc3RhdHVzKGRldiwgaSwgc3RhdHVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOworCisJCWlmIChsZW4gPiAwKSB7CisJCQlwID0gdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKwkJCWlmICghdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpIHsKKwkJCQlpZiAoKGRldi0+Zm91cmNjKSA9PSBWNEwyX1BJWF9GTVRfVE02MDAwKSB7CisJCQkJCXJjID0gY29weV9tdWx0aXBsZXhlZChwLCBsZW4sIHVyYik7CisJCQkJCWlmIChyYyA8PSAwKQorCQkJCQkJcmV0dXJuIHJjOworCQkJCX0gZWxzZSB7CisJCQkJCWNvcHlfc3RyZWFtcyhwLCBsZW4sIHVyYik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglVUkIgY29udHJvbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIElSUSBjYWxsYmFjaywgY2FsbGVkIGJ5IFVSQiBjYWxsYmFjaworICovCitzdGF0aWMgdm9pZCB0bTYwMDBfaXJxX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7CisJaW50IGk7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCWNhc2UgLUVUSU1FRE9VVDoKKwkJYnJlYWs7CisKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCXRtNjAwMF9lcnIoInVyYiBjb21wbGV0aW9uIGVycm9yICVkLlxuIiwgdXJiLT5zdGF0dXMpOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2soJmRldi0+c2xvY2spOworCXRtNjAwMF9pc29jX2NvcHkodXJiKTsKKwlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CisKKwkvKiBSZXNldCB1cmIgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSAwOworCX0KKworCXVyYi0+c3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAodXJiLT5zdGF0dXMpCisJCXRtNjAwMF9lcnIoInVyYiByZXN1Ym1pdCBmYWlsZWQgKGVycm9yPSVpKVxuIiwKKwkJCXVyYi0+c3RhdHVzKTsKK30KKworLyoKKyAqIFN0b3AgYW5kIERlYWxsb2NhdGUgVVJCcworICovCitzdGF0aWMgdm9pZCB0bTYwMDBfdW5pbml0X2lzb2Moc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCit7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBpOworCisJZGV2LT5pc29jX2N0bC5idWYgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKKwkJdXJiID0gZGV2LT5pc29jX2N0bC51cmJbaV07CisJCWlmICh1cmIpIHsKKwkJCXVzYl9raWxsX3VyYih1cmIpOworCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJCWlmIChkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSkgeworCQkJCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwKKwkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkJCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldLAorCQkJCQkJdXJiLT50cmFuc2Zlcl9kbWEpOworCQkJfQorCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlkZXYtPmlzb2NfY3RsLnVyYltpXSA9IE5VTEw7CisJCX0KKwkJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0gPSBOVUxMOworCX0KKworCWtmcmVlKGRldi0+aXNvY19jdGwudXJiKTsKKwlrZnJlZShkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcik7CisKKwlkZXYtPmlzb2NfY3RsLnVyYiA9IE5VTEw7CisJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSAwOworfQorCisvKgorICogQWxsb2NhdGUgVVJCcyBhbmQgc3RhcnQgSVJRCisgKi8KK3N0YXRpYyBpbnQgdG02MDAwX3ByZXBhcmVfaXNvYyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7CisJaW50IGksIGosIHNiX3NpemUsIHBpcGUsIHNpemUsIG1heF9wYWNrZXRzLCBudW1fYnVmcyA9IDg7CisJc3RydWN0IHVyYiAqdXJiOworCisJLyogRGUtYWxsb2NhdGVzIGFsbCBwZW5kaW5nIHN0dWZmICovCisJdG02MDAwX3VuaW5pdF9pc29jKGRldik7CisJLyogU3RvcCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KKwl0bTYwMDBfaXJfaW50X3N0b3AoZGV2KTsKKworCXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwKKwkJCSAgZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkgIGRldi0+aXNvY19pbi5iQWx0ZXJuYXRlU2V0dGluZyk7CisKKwkvKiBTdGFydCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KKwl0bTYwMDBfaXJfaW50X3N0YXJ0KGRldik7CisKKwlwaXBlID0gdXNiX3Jjdmlzb2NwaXBlKGRldi0+dWRldiwKKwkJCSAgICAgICBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKKwkJCSAgICAgICBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOworCisJc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisKKwlpZiAoc2l6ZSA+IGRldi0+aXNvY19pbi5tYXhzaXplKQorCQlzaXplID0gZGV2LT5pc29jX2luLm1heHNpemU7CisKKwlkZXYtPmlzb2NfY3RsLm1heF9wa3Rfc2l6ZSA9IHNpemU7CisKKwltYXhfcGFja2V0cyA9IFRNNjAwMF9NQVhfSVNPX1BBQ0tFVFM7CisJc2Jfc2l6ZSA9IG1heF9wYWNrZXRzICogc2l6ZTsKKworCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSBudW1fYnVmczsKKworCWRldi0+aXNvY19jdGwudXJiID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmlzb2NfY3RsLnVyYikgeworCQl0bTYwMDBfZXJyKCJjYW5ub3QgYWxsb2MgbWVtb3J5IGZvciB1c2IgYnVmZmVyc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyKSB7CisJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHVzYnRyYW5zZmVyXG4iKTsKKwkJa2ZyZWUoZGV2LT5pc29jX2N0bC51cmIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIkFsbG9jYXRpbmcgJWQgeCAlZCBwYWNrZXRzIgorCQkgICAgIiAoJWQgYnl0ZXMpIG9mICVkIGJ5dGVzIGVhY2ggdG8gaGFuZGxlICV1IHNpemVcbiIsCisJCSAgICBtYXhfcGFja2V0cywgbnVtX2J1ZnMsIHNiX3NpemUsCisJCSAgICBkZXYtPmlzb2NfaW4ubWF4c2l6ZSwgc2l6ZSk7CisKKwkvKiBhbGxvY2F0ZSB1cmJzIGFuZCB0cmFuc2ZlciBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgeworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOworCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWRldi0+aXNvY19jdGwudXJiW2ldID0gdXJiOworCisJCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwKKwkJCXNiX3NpemUsIEdGUF9LRVJORUwsICZ1cmItPnRyYW5zZmVyX2RtYSk7CisJCWlmICghZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0pIHsKKwkJCXRtNjAwMF9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSAlaSBieXRlcyBmb3IgdHJhbnNmZXIiCisJCQkJCSIgYnVmZmVyICVpJXNcbiIsCisJCQkJCXNiX3NpemUsIGksCisJCQkJCWluX2ludGVycnVwdCgpID8gIiB3aGlsZSBpbiBpbnQiIDogIiIpOworCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIDAsIHNiX3NpemUpOworCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCBwaXBlLAorCQkJCSAgZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIHNiX3NpemUsCisJCQkJICB0bTYwMDBfaXJxX2NhbGxiYWNrLCBkbWFfcSk7CisJCXVyYi0+aW50ZXJ2YWwgPSBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iSW50ZXJ2YWw7CisJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBtYXhfcGFja2V0czsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJCWZvciAoaiA9IDA7IGogPCBtYXhfcGFja2V0czsgaisrKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHNpemUgKiBqOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBzaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX3N0YXJ0X3RocmVhZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKK3sKKwlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7CisJaW50IGk7CisKKwlkbWFfcS0+ZnJhbWUgPSAwOworCWRtYV9xLT5pbmlfamlmZmllcyA9IGppZmZpZXM7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcS0+d3EpOworCisJLyogc3VibWl0IHVyYnMgYW5kIGVuYWJsZXMgSVJRICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgeworCQlpbnQgcmMgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmlzb2NfY3RsLnVyYltpXSwgR0ZQX0FUT01JQyk7CisJCWlmIChyYykgeworCQkJdG02MDAwX2Vycigic3VibWl0IG9mIHVyYiAlaSBmYWlsZWQgKGVycm9yPSVpKVxuIiwgaSwKKwkJCQkgICByYyk7CisJCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVZpZGVvYnVmIG9wZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQKK2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCisJKnNpemUgPSBmaC0+Zm10LT5kZXB0aCAqIGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgPj4gMzsKKwlpZiAoMCA9PSAqY291bnQpCisJCSpjb3VudCA9IFRNNjAwMF9ERUZfQlVGOworCisJaWYgKCpjb3VudCA8IFRNNjAwMF9NSU5fQlVGKQorCQkqY291bnQgPSBUTTYwMDBfTUlOX0JVRjsKKworCXdoaWxlICgqc2l6ZSAqICpjb3VudCA+IHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KQorCQkoKmNvdW50KS0tOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCisJLyogV2UgdXNlZCB0byB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGZpbmlzaCBoZXJlLCBidXQgdGhpcyBkaWRuJ3Qgd29yaworCSAgIGJlY2F1c2UsIGFzIHdlIHdlcmUga2VlcGluZyB0aGUgc3RhdGUgYXMgVklERU9CVUZfUVVFVUVELAorCSAgIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCBtYXJrZWQgaXQgYXMgZmluaXNoZWQgZm9yIHVzLgorCSAgIChBbHNvLCBpdCBjb3VsZCB3ZWRnZSBmb3JldmVyIGlmIHRoZSBoYXJkd2FyZSB3YXMgbWlzY29uZmlndXJlZC4pCisKKwkgICBUaGlzIHNob3VsZCBiZSBzYWZlOyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGJ1ZmZlciBpc24ndAorCSAgIHF1ZXVlZCBhbnltb3JlLiBJZiB3ZSBldmVyIHN0YXJ0IG1hcmtpbmcgdGhlIGJ1ZmZlcnMgYXMKKwkgICBWSURFT0JVRl9BQ1RJVkUsIGl0IHdvbid0IGJlLCB0aG91Z2guCisJKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCWlmIChkZXYtPmlzb2NfY3RsLmJ1ZiA9PSBidWYpCisJCWRldi0+aXNvY19jdGwuYnVmID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7CisKKwl2aWRlb2J1Zl92bWFsbG9jX2ZyZWUoJmJ1Zi0+dmIpOworCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOworfQorCitzdGF0aWMgaW50CitidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCQkJCWVudW0gdjRsMl9maWVsZCBmaWVsZCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgICAqZmggID0gdnEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgdG02MDAwX2J1ZmZlciwgdmIpOworCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OworCWludCByYyA9IDA7CisKKwlCVUdfT04oTlVMTCA9PSBmaC0+Zm10KTsKKworCisJLyogRklYTUU6IEl0IGFzc3VtZXMgZGVwdGg9MiAqLworCS8qIFRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9ybWF0IGlzIDE2IGJpdHMvcGl4ZWwgKi8KKwlidWYtPnZiLnNpemUgPSBmaC0+Zm10LT5kZXB0aCpmaC0+d2lkdGgqZmgtPmhlaWdodCA+PiAzOworCWlmICgwICE9IGJ1Zi0+dmIuYmFkZHIgICYmICBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidWYtPmZtdCAgICAgICAhPSBmaC0+Zm10ICAgIHx8CisJICAgIGJ1Zi0+dmIud2lkdGggICE9IGZoLT53aWR0aCAgfHwKKwkgICAgYnVmLT52Yi5oZWlnaHQgIT0gZmgtPmhlaWdodCB8fAorCSAgICBidWYtPnZiLmZpZWxkICAhPSBmaWVsZCkgeworCQlidWYtPmZtdCAgICAgICA9IGZoLT5mbXQ7CisJCWJ1Zi0+dmIud2lkdGggID0gZmgtPndpZHRoOworCQlidWYtPnZiLmhlaWdodCA9IGZoLT5oZWlnaHQ7CisJCWJ1Zi0+dmIuZmllbGQgID0gZmllbGQ7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOworCX0KKworCWlmIChWSURFT0JVRl9ORUVEU19JTklUID09IGJ1Zi0+dmIuc3RhdGUpIHsKKwkJcmMgPSB2aWRlb2J1Zl9pb2xvY2sodnEsICZidWYtPnZiLCBOVUxMKTsKKwkJaWYgKHJjICE9IDApCisJCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFkZXYtPmlzb2NfY3RsLm51bV9idWZzKSB7CisJCXJjID0gdG02MDAwX3ByZXBhcmVfaXNvYyhkZXYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsOworCisJCXJjID0gdG02MDAwX3N0YXJ0X3RocmVhZChkZXYpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsOworCisJfQorCisJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOworCXJldHVybiAwOworCitmYWlsOgorCWZyZWVfYnVmZmVyKHZxLCBidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2J1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICAqYnVmICAgICA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiKTsKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggICAgICA9IHZxLT5wcml2X2RhdGE7CisJc3RydWN0IHRtNjAwMF9jb3JlICAgICAgKmRldiAgICAgPSBmaC0+ZGV2OworCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICp2aWRxICAgID0gJmRldi0+dmlkcTsKKworCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgKmJ1ZiAgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yik7CisKKwlmcmVlX2J1ZmZlcih2cSwgYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgdG02MDAwX3ZpZGVvX3FvcHMgPSB7CisJLmJ1Zl9zZXR1cCAgICAgID0gYnVmZmVyX3NldHVwLAorCS5idWZfcHJlcGFyZSAgICA9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgICAgICA9IGJ1ZmZlcl9xdWV1ZSwKKwkuYnVmX3JlbGVhc2UgICAgPSBidWZmZXJfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJSU9DVEwgaGFuZGxpbmcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBib29sIGlzX3Jlc19yZWFkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKK3sKKwkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLworCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNfcmVzX3N0cmVhbWluZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgc3RydWN0IHRtNjAwMF9maCAqZmgpCit7CisJLyogSXMgdGhlIGN1cnJlbnQgZmggaGFuZGxpbmcgaXQ/IGlmIHNvLCB0aGF0J3MgT0sgKi8KKwlpZiAoZGV2LT5yZXNvdXJjZXMgPT0gZmgpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCByZXNfZ2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCwKKwkJICAgYm9vbCBpc19yZXNfcmVhZCkKK3sKKwkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLworCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkID09IGlzX3Jlc19yZWFkKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIGlzIGl0IGZyZWU/ICovCisJaWYgKGRldi0+cmVzb3VyY2VzKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBncmFiIGl0ICovCisJZGV2LT5yZXNvdXJjZXMgPSBmaDsKKwlkZXYtPmlzX3Jlc19yZWFkID0gaXNfcmVzX3JlYWQ7CisJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUkVTX0xPQ0ssICJyZXM6IGdldFxuIik7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKK3sKKwkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLworCWlmIChkZXYtPnJlc291cmNlcyAhPSBmaCkKKwkJcmV0dXJuOworCisJZGV2LT5yZXNvdXJjZXMgPSBOVUxMOworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX1JFU19MT0NLLCAicmVzOiBwdXRcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCUlPQ1RMIHZpZGlvYyBoYW5kbGluZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gKChzdHJ1Y3QgdG02MDAwX2ZoICopcHJpdiktPmRldjsKKworCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgIlRyaWRlbnQgVFZNYXN0ZXIgVE01NjAwLzYwMDAvNjAxMCIsIHNpemVvZihjYXAtPmNhcmQpKTsKKwljYXAtPnZlcnNpb24gPSBUTTYwMDBfVkVSU0lPTjsKKwljYXAtPmNhcGFiaWxpdGllcyA9CVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAorCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfAorCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKKworCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKQorCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlpZiAodW5saWtlbHkoZi0+aW5kZXggPj0gQVJSQVlfU0laRShmb3JtYXQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCBmb3JtYXRbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0W2YtPmluZGV4XS5mb3VyY2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OworCisJZi0+Zm10LnBpeC53aWR0aCAgICAgICAgPSBmaC0+d2lkdGg7CisJZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OworCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gZmgtPnZiX3ZpZHEuZmllbGQ7CisJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBmaC0+Zm10LT5mb3VyY2M7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQorCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0KKwkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRtNjAwMF9mbXQgKmZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdCk7IGkrKykKKwkJaWYgKGZvcm1hdFtpXS5mb3VyY2MgPT0gZm91cmNjKQorCQkJcmV0dXJuIGZvcm1hdCtpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSAoKHN0cnVjdCB0bTYwMDBfZmggKilwcml2KS0+ZGV2OworCXN0cnVjdCB0bTYwMDBfZm10ICpmbXQ7CisJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOworCisJZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwlpZiAoTlVMTCA9PSBmbXQpIHsKKwkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSU9DVExfQVJHLCAiRm91cmNjIGZvcm1hdCAoMHglMDh4KSIKKwkJCQkiIGludmFsaWQuXG4iLCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCisJaWYgKGZpZWxkID09IFY0TDJfRklFTERfQU5ZKQorCQlmaWVsZCA9IFY0TDJfRklFTERfU0VRX1RCOworCWVsc2UgaWYgKFY0TDJfRklFTERfSU5URVJMQUNFRCAhPSBmaWVsZCkgeworCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JT0NUTF9BUkcsICJGaWVsZCB0eXBlIGludmFsaWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG02MDAwX2dldF9zdGRfcmVzKGRldik7CisKKwlmLT5mbXQucGl4LndpZHRoICA9IGRldi0+d2lkdGg7CisJZi0+Zm10LnBpeC5oZWlnaHQgPSBkZXYtPmhlaWdodDsKKworCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDE7CisKKwlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7CisKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CisJCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKKwlmLT5mbXQucGl4LnNpemVpbWFnZSA9CisJCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisKKwlyZXR1cm4gMDsKK30KKworLypGSVhNRTogVGhpcyBzZWVtcyB0byBiZSBnZW5lcmljIGVub3VnaCB0byBiZSBhdCB2aWRlb2RldjIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKwlpbnQgcmV0ID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmaC0+Zm10ICAgICAgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisJZmgtPndpZHRoICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCWZoLT5oZWlnaHQgICAgICAgID0gZi0+Zm10LnBpeC5oZWlnaHQ7CisJZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCWZoLT50eXBlICAgICAgICAgID0gZi0+dHlwZTsKKworCWRldi0+Zm91cmNjICAgICAgID0gZi0+Zm10LnBpeC5waXhlbGZvcm1hdDsKKworCXRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OworCisJcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoJmZoLT52Yl92aWRxLCBwKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcXVlcnlidWYoJmZoLT52Yl92aWRxLCBwKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfcWJ1ZigmZmgtPnZiX3ZpZHEsIHApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7CisKKwlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAorCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaSAhPSBmaC0+dHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJlc19nZXQoZGV2LCBmaCwgZmFsc2UpKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpICE9IGZoLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOworCXJlc19mcmVlKGRldiwgZmgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlkZXYtPm5vcm0gPSAqbm9ybTsKKwlyYyA9IHRtNjAwMF9pbml0X2FuYWxvZ19tb2RlKGRldik7CisKKwlmaC0+d2lkdGggID0gZGV2LT53aWR0aDsKKwlmaC0+aGVpZ2h0ID0gZGV2LT5oZWlnaHQ7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgY29yZSwgc19zdGQsIGRldi0+bm9ybSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmluYW1lW10gPSB7CisJW1RNNjAwMF9JTlBVVF9UVl0gPSAiVGVsZXZpc2lvbiIsCisJW1RNNjAwMF9JTlBVVF9DT01QT1NJVEUxXSA9ICJDb21wb3NpdGUgMSIsCisJW1RNNjAwMF9JTlBVVF9DT01QT1NJVEUyXSA9ICJDb21wb3NpdGUgMiIsCisJW1RNNjAwMF9JTlBVVF9TVklERU9dID0gIlMtVmlkZW8iLAorfTsKKworc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisJdW5zaWduZWQgaW50IG47CisKKwluID0gaS0+aW5kZXg7CisJaWYgKG4gPj0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldi0+dmlucHV0W25dLnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaS0+aW5kZXggPSBuOworCisJaWYgKGRldi0+dmlucHV0W25dLnR5cGUgPT0gVE02MDAwX0lOUFVUX1RWKQorCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCWVsc2UKKwkJaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlzdHJjcHkoaS0+bmFtZSwgaW5hbWVbZGV2LT52aW5wdXRbbl0udHlwZV0pOworCisJaS0+c3RkID0gVE02MDAwX1NURDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICpmaCA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJKmkgPSBkZXYtPmlucHV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKwlpbnQgcmMgPSAwOworCisJaWYgKGkgPj0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFkZXYtPnZpbnB1dFtpXS50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+aW5wdXQgPSBpOworCisJcmMgPSB2aWRpb2Nfc19zdGQoZmlsZSwgcHJpdiwgJmRldi0+dmZkLT5jdXJyZW50X25vcm0pOworCisJcmV0dXJuIHJjOworfQorCisvKiAtLS0gY29udHJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0bTYwMDBfcWN0cmwpOyBpKyspCisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHRtNjAwMF9xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHRtNjAwMF9xY3RybFtpXSksCisJCQkJc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ICAgID0gZmgtPmRldjsKKwlpbnQgIHZhbDsKKworCS8qIEZJWE1FOiBQcm9iYWJseSwgdGhvc2Ugd29uJ3Qgd29yayEgTWF5YmUgd2UgbmVlZCBzaGFkb3cgcmVncyAqLworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCAwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMEFfQ0hST01BX1NBVFVSQVRJT05fQURKLCAwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQl9DSFJPTUFfSFVFX1BIQVNFX0FESiwgMCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJdmFsID0gZGV2LT5jdGxfbXV0ZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCXZhbCA9IGRldi0+Y3RsX3ZvbHVtZTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwljdHJsLT52YWx1ZSA9IHZhbDsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICpmaCAgPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKwl1OCAgdmFsID0gY3RybC0+dmFsdWU7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA4X0xVTUFfQ09OVFJBU1RfQURKLCB2YWwpOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCB2YWwpOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIHZhbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfSFVFOgorCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMEJfQ0hST01BX0hVRV9QSEFTRV9BREosIHZhbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJZGV2LT5jdGxfbXV0ZSA9IHZhbDsKKwkJdG02MDAwX3R2YXVkaW9fc2V0X211dGUoZGV2LCB2YWwpOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJZGV2LT5jdGxfdm9sdW1lID0gdmFsOworCQl0bTYwMDBfc2V0X3ZvbHVtZShkZXYsIHZhbCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgwICE9IHQtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOworCXQtPnR5cGUgICAgICAgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKKwl0LT5yYW5nZWhpZ2ggID0gMHhmZmZmZmZmZlVMOworCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIGdfdHVuZXIsIHQpOworCisJdC0+YXVkbW9kZSA9IGRldi0+YW1vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5hbW9kZSA9IHQtPmF1ZG1vZGU7CisJZHByaW50ayhkZXYsIDMsICJhdWRpbyBtb2RlOiAleFxuIiwgdC0+YXVkbW9kZSk7CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfdHVuZXIsIHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZi0+dHlwZSA9IGZoLT5yYWRpbyA/IFY0TDJfVFVORVJfUkFESU8gOiBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICpmaCAgPSBwcml2OworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmICh1bmxpa2VseShVTlNFVCA9PSBkZXYtPnR1bmVyX3R5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoZi0+dHVuZXIgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgwID09IGZoLT5yYWRpbyAmJiBWNEwyX1RVTkVSX0FOQUxPR19UViAhPSBmLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoMSA9PSBmaC0+cmFkaW8gJiYgVjRMMl9UVU5FUl9SQURJTyAhPSBmLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIHNfZnJlcXVlbmN5LCBmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidG02MDAwIik7CisJc3RybGNweShjYXAtPmNhcmQsIGRldi0+bmFtZSwgc2l6ZW9mKGRldi0+bmFtZSkpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlVTQiUwNHg6JTA0eCIsCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KGRldi0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKwljYXAtPnZlcnNpb24gPSBkZXYtPmRldl90eXBlOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfAorCQkJVjRMMl9DQVBfQVVESU8gICAgIHwKKwkJCVY0TDJfQ0FQX1JBRElPICAgICB8CisJCQlWNEwyX0NBUF9SRUFEV1JJVEUgfAorCQkJVjRMMl9DQVBfU1RSRUFNSU5HOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQpCit7CisJc3RydWN0IHRtNjAwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKDAgIT0gdC0+aW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCXN0cmNweSh0LT5uYW1lLCAiUmFkaW8iKTsKKwl0LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl0LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCisJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBnX3R1bmVyLCB0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKKworCWlmICgwICE9IHQtPmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190dW5lciwgdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OworCisJaWYgKGktPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXYtPnJpbnB1dC50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShpLT5uYW1lLCAiUmFkaW8iKTsKKwlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoZGV2LT5pbnB1dCAhPSA1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSppID0gZGV2LT5pbnB1dCAtIDU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwltZW1zZXQoYSwgMCwgc2l6ZW9mKCphKSk7CisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGlvX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7CisKKwlpZiAoaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldi0+cmlucHV0LnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5pbnB1dCA9IGkgKyA1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkaW9fc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRpb19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYykKK3sKKwljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7CisKKwlpZiAoYy0+aWQgPCAgVjRMMl9DSURfQkFTRSB8fAorCSAgICBjLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjLT5pZCA9PSBWNEwyX0NJRF9BVURJT19NVVRFKSB7CisJCWN0cmwgPSBjdHJsX2J5X2lkKGMtPmlkKTsKKwkJKmMgPSAqY3RybDsKKwl9IGVsc2UKKwkJKmMgPSBub19jdHJsOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZpbGUgb3BlcmF0aW9ucyBmb3IgdGhlIGRldmljZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB0bTYwMDBfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHRtNjAwMF9maCAqZmg7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJaW50IGksIHJjOworCWludCByYWRpbyA9IDA7CisKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAidG02MDAwOiBvcGVuIGNhbGxlZCAoZGV2PSVzKVxuIiwKKwkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSk7CisKKwlzd2l0Y2ggKHZkZXYtPnZmbF90eXBlKSB7CisJY2FzZSBWRkxfVFlQRV9HUkFCQkVSOgorCQl0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1ZCSToKKwkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU7CisJCWJyZWFrOworCWNhc2UgVkZMX1RZUEVfUkFESU86CisJCXJhZGlvID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogSWYgbW9yZSB0aGFuIG9uZSB1c2VyLCBtdXRleCBzaG91bGQgYmUgYWRkZWQgKi8KKwlkZXYtPnVzZXJzKys7CisKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAib3BlbiBkZXY9JXMgdHlwZT0lcyB1c2Vycz0lZFxuIiwKKwkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwgdjRsMl90eXBlX25hbWVzW3R5cGVdLAorCQlkZXYtPnVzZXJzKTsKKworCS8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCisJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBmaCkgeworCQlkZXYtPnVzZXJzLS07CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5kZXYgICAgICA9IGRldjsKKwlmaC0+cmFkaW8gICAgPSByYWRpbzsKKwlkZXYtPnJhZGlvICAgPSByYWRpbzsKKwlmaC0+dHlwZSAgICAgPSB0eXBlOworCWRldi0+Zm91cmNjICA9IGZvcm1hdFswXS5mb3VyY2M7CisKKwlmaC0+Zm10ICAgICAgPSBmb3JtYXRfYnlfZm91cmNjKGRldi0+Zm91cmNjKTsKKworCXRtNjAwMF9nZXRfc3RkX3JlcyhkZXYpOworCisJZmgtPndpZHRoID0gZGV2LT53aWR0aDsKKwlmaC0+aGVpZ2h0ID0gZGV2LT5oZWlnaHQ7CisKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogZmg9MHglMDhseCwgZGV2PTB4JTA4bHgsICIKKwkJCQkJCSJkZXYtPnZpZHE9MHglMDhseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWZoLCAodW5zaWduZWQgbG9uZylkZXYsCisJCQkodW5zaWduZWQgbG9uZykmZGV2LT52aWRxKTsKKwlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogbGlzdF9lbXB0eSAiCisJCQkJInF1ZXVlZD0lZFxuIiwgbGlzdF9lbXB0eSgmZGV2LT52aWRxLnF1ZXVlZCkpOworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJPcGVuOiBsaXN0X2VtcHR5ICIKKwkJCQkiYWN0aXZlPSVkXG4iLCBsaXN0X2VtcHR5KCZkZXYtPnZpZHEuYWN0aXZlKSk7CisKKwkvKiBpbml0aWFsaXplIGhhcmR3YXJlIG9uIGFuYWxvZyBtb2RlICovCisJcmMgPSB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShkZXYpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmIChkZXYtPm1vZGUgIT0gVE02MDAwX01PREVfQU5BTE9HKSB7CisJCS8qIFB1dCBhbGwgY29udHJvbHMgYXQgYSBzYW5lIHN0YXRlICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9xY3RybCk7IGkrKykKKwkJCXFjdGxfcmVnc1tpXSA9IHRtNjAwMF9xY3RybFtpXS5kZWZhdWx0X3ZhbHVlOworCisJCWRldi0+bW9kZSA9IFRNNjAwMF9NT0RFX0FOQUxPRzsKKwl9CisKKwlpZiAoIWZoLT5yYWRpbykgeworCQl2aWRlb2J1Zl9xdWV1ZV92bWFsbG9jX2luaXQoJmZoLT52Yl92aWRxLCAmdG02MDAwX3ZpZGVvX3FvcHMsCisJCQkJTlVMTCwgJmRldi0+c2xvY2ssCisJCQkJZmgtPnR5cGUsCisJCQkJVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJCXNpemVvZihzdHJ1Y3QgdG02MDAwX2J1ZmZlciksIGZoLCAmZGV2LT5sb2NrKTsKKwl9IGVsc2UgeworCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAidmlkZW9fb3Blbjogc2V0dGluZyByYWRpbyBkZXZpY2VcbiIpOworCQlkZXYtPmlucHV0ID0gNTsKKwkJdG02MDAwX3NldF9hdWRpb19yaW5wdXQoZGV2KTsKKwkJdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3JhZGlvKTsKKwkJdG02MDAwX3ByZXBhcmVfaXNvYyhkZXYpOworCQl0bTYwMDBfc3RhcnRfdGhyZWFkKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0bTYwMDBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlpZiAoIXJlc19nZXQoZmgtPmRldiwgZmgsIHRydWUpKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlyZXR1cm4gdmlkZW9idWZfcmVhZF9zdHJlYW0oJmZoLT52Yl92aWRxLCBkYXRhLCBjb3VudCwgcG9zLCAwLAorCQkJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Cit0bTYwMDBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCB0bTYwMDBfZmggICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICAqYnVmOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAhPSBmaC0+dHlwZSkKKwkJcmV0dXJuIFBPTExFUlI7CisKKwlpZiAoISFpc19yZXNfc3RyZWFtaW5nKGZoLT5kZXYsIGZoKSkKKwkJcmV0dXJuIFBPTExFUlI7CisKKwlpZiAoIWlzX3Jlc19yZWFkKGZoLT5kZXYsIGZoKSkgeworCQkvKiBzdHJlYW1pbmcgY2FwdHVyZSAqLworCQlpZiAobGlzdF9lbXB0eSgmZmgtPnZiX3ZpZHEuc3RyZWFtKSkKKwkJCXJldHVybiBQT0xMRVJSOworCQlidWYgPSBsaXN0X2VudHJ5KGZoLT52Yl92aWRxLnN0cmVhbS5uZXh0LCBzdHJ1Y3QgdG02MDAwX2J1ZmZlciwgdmIuc3RyZWFtKTsKKwl9IGVsc2UgeworCQkvKiByZWFkKCkgY2FwdHVyZSAqLworCQlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52Yl92aWRxLCB3YWl0KTsKKwl9CisJcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOworCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwKKwkgICAgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHRtNjAwMF9maCAgICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgICAgICAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKworCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX09QRU4sICJ0bTYwMDA6IGNsb3NlIGNhbGxlZCAoZGV2PSVzLCB1c2Vycz0lZClcbiIsCisJCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldiksIGRldi0+dXNlcnMpOworCisJZGV2LT51c2Vycy0tOworCisJcmVzX2ZyZWUoZGV2LCBmaCk7CisKKwlpZiAoIWRldi0+dXNlcnMpIHsKKwkJaW50IGVycjsKKworCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKKworCQlpZiAoIWZoLT5yYWRpbykKKwkJCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZiX3ZpZHEpOworCisJCWVyciA9IHRtNjAwMF9yZXNldChkZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWRldl9lcnIoJnZkZXYtPmRldiwgInJlc2V0IGZhaWxlZDogJWRcbiIsIGVycik7CisJfQorCisJa2ZyZWUoZmgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG02MDAwX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdG02MDAwX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB0bTYwMDBfb3BlbiwKKwkucmVsZWFzZSA9IHRtNjAwMF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwgLyogVjRMMiBpb2N0bCBoYW5kbGVyICovCisJLnJlYWQgPSB0bTYwMDBfcmVhZCwKKwkucG9sbCA9IHRtNjAwMF9wb2xsLAorCS5tbWFwID0gdG02MDAwX21tYXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgICAgICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCAgPSB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAgICAgID0gdmlkaW9jX2dfZm10X3ZpZF9jYXAsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgICA9IHZpZGlvY190cnlfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19zdGQgICAgICAgICAgICAgPSB2aWRpb2Nfc19zdGQsCisJLnZpZGlvY19lbnVtX2lucHV0ICAgICAgICA9IHZpZGlvY19lbnVtX2lucHV0LAorCS52aWRpb2NfZ19pbnB1dCAgICAgICAgICAgPSB2aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQgICAgICAgICAgID0gdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19xdWVyeWN0cmwgICAgICAgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICAgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICAgICAgICA9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX3R1bmVyICAgICAgICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgICAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgICAgICAgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19zdHJlYW1vbiAgICAgICAgICA9IHZpZGlvY19zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZiAgICAgICAgID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3JlcWJ1ZnMgICAgICAgICAgID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiAgICAgICAgICA9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYgICAgICAgICAgICAgID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiAgICAgICAgICAgICA9IHZpZGlvY19kcWJ1ZiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHRtNjAwMF90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAidG02MDAwIiwKKwkuZm9wcyAgICAgICAgICAgPSAmdG02MDAwX2ZvcHMsCisJLmlvY3RsX29wcyAgICAgID0gJnZpZGVvX2lvY3RsX29wcywKKwkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS50dm5vcm1zICAgICAgICA9IFRNNjAwMF9TVEQsCisJLmN1cnJlbnRfbm9ybSAgID0gVjRMMl9TVERfTlRTQ19NLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyByYWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB0bTYwMDBfb3BlbiwKKwkucmVsZWFzZQk9IHRtNjAwMF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgcmFkaW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAJPSByYWRpb19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIJCT0gcmFkaW9fZ190dW5lciwKKwkudmlkaW9jX2VudW1faW5wdXQJPSByYWRpb19lbnVtX2lucHV0LAorCS52aWRpb2NfZ19hdWRpbwkJPSByYWRpb19nX2F1ZGlvLAorCS52aWRpb2Nfc190dW5lcgkJPSByYWRpb19zX3R1bmVyLAorCS52aWRpb2Nfc19hdWRpbwkJPSByYWRpb19zX2F1ZGlvLAorCS52aWRpb2Nfc19pbnB1dAkJPSByYWRpb19zX2lucHV0LAorCS52aWRpb2Nfc19zdGQJCT0gcmFkaW9fc19zdGQsCisJLnZpZGlvY19xdWVyeWN0cmwJPSByYWRpb19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2lucHV0CQk9IHJhZGlvX2dfaW5wdXQsCisJLnZpZGlvY19nX2N0cmwJCT0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybAkJPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19mcmVxdWVuY3kJPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeQk9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHRtNjAwMF9yYWRpb190ZW1wbGF0ZSA9IHsKKwkubmFtZQkJCT0gInRtNjAwMCIsCisJLmZvcHMJCQk9ICZyYWRpb19mb3BzLAorCS5pb2N0bF9vcHMJCT0gJnJhZGlvX2lvY3RsX29wcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglJbml0aWFsaXphdGlvbiBhbmQgbW9kdWxlIHN0dWZmCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAorCQljb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlCisJCSp0ZW1wbGF0ZSwgY29uc3QgY2hhciAqdHlwZV9uYW1lKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChOVUxMID09IHZmZCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqdmZkID0gKnRlbXBsYXRlOworCXZmZC0+djRsMl9kZXYgPSAmZGV2LT52NGwyX2RldjsKKwl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKKwl2ZmQtPmRlYnVnID0gdG02MDAwX2RlYnVnOworCXZmZC0+bG9jayA9ICZkZXYtPmxvY2s7CisKKwlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMgJXMiLCBkZXYtPm5hbWUsIHR5cGVfbmFtZSk7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7CisJcmV0dXJuIHZmZDsKK30KKworaW50IHRtNjAwMF92NGwyX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCWludCByZXQgPSAtMTsKKworCWRldi0+dmZkID0gdmRldl9pbml0KGRldiwgJnRtNjAwMF90ZW1wbGF0ZSwgInZpZGVvIik7CisKKwlpZiAoIWRldi0+dmZkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmlkcS5xdWV1ZWQpOworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkLCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCisJICAgICAgIGRldi0+bmFtZSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShkZXYtPnZmZCkpOworCisJaWYgKGRldi0+Y2Fwcy5oYXNfcmFkaW8pIHsKKwkJZGV2LT5yYWRpb19kZXYgPSB2ZGV2X2luaXQoZGV2LCAmdG02MDAwX3JhZGlvX3RlbXBsYXRlLAorCQkJCQkJCSAgICJyYWRpbyIpOworCQlpZiAoIWRldi0+cmFkaW9fZGV2KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgcmFkaW8gZGV2aWNlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gcmV0OyAvKiBGSVhNRSByZWxlYXNlIHJlc291cmNlICovCisJCX0KKworCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYsIFZGTF9UWVBFX1JBRElPLAorCQkJCQkgICAgcmFkaW9fbnIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHJhZGlvIGRldmljZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIHJldDsgLyogRklYTUUgcmVsZWFzZSByZXNvdXJjZSAqLworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+cmFkaW9fZGV2KSk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGJvYXJkIChMb2FkIHN0YXR1czogJWQpXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQoreworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkKTsKKworCWlmIChkZXYtPnJhZGlvX2RldikgeworCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnJhZGlvX2RldikpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2Rldik7CisJCWVsc2UKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+cmFkaW9fZGV2KTsKKwkJZGV2LT5yYWRpb19kZXYgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKQoreworCXJldHVybiAwOworfQorCittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAiQWxsb3cgY2hhbmdpbmcgdmlkZW8gZGV2aWNlIG51bWJlciIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHRtNjAwMF9kZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJhY3RpdmF0ZXMgZGVidWcgaW5mbyIpOworCittb2R1bGVfcGFyYW0odmlkX2xpbWl0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsICJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RtNjAwMC90bTYwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzc3ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bTYwMDAvdG02MDAwLmgKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiAgdG02MDAwLmggLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KKyAqCS0gRFZCLVQgc3VwcG9ydAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaD4KKyNpbmNsdWRlICJ0bTYwMDAtdXNiLWlzb2MuaCIKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKyNpbmNsdWRlICJkdmJfZGVtdXguaCIKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJkbXhkZXYuaCIKKworI2RlZmluZSBUTTYwMDBfVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQorCisvKiBJbnB1dHMgKi8KK2VudW0gdG02MDAwX2l0eXBlIHsKKwlUTTYwMDBfSU5QVVRfVFYJPSAxLAorCVRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAorCVRNNjAwMF9JTlBVVF9DT01QT1NJVEUyLAorCVRNNjAwMF9JTlBVVF9TVklERU8sCisJVE02MDAwX0lOUFVUX0RWQiwKKwlUTTYwMDBfSU5QVVRfUkFESU8sCit9OworCitlbnVtIHRtNjAwMF9tdXggeworCVRNNjAwMF9WTVVYX1ZJREVPX0EgPSAxLAorCVRNNjAwMF9WTVVYX1ZJREVPX0IsCisJVE02MDAwX1ZNVVhfVklERU9fQUIsCisJVE02MDAwX0FNVVhfQURDMSwKKwlUTTYwMDBfQU1VWF9BREMyLAorCVRNNjAwMF9BTVVYX1NJRjEsCisJVE02MDAwX0FNVVhfU0lGMiwKKwlUTTYwMDBfQU1VWF9JMlMsCit9OworCitlbnVtIHRtNjAwMF9kZXZ0eXBlIHsKKwlUTTYwMDAgPSAwLAorCVRNNTYwMCwKKwlUTTYwMTAsCit9OworCitzdHJ1Y3QgdG02MDAwX2lucHV0IHsKKwllbnVtIHRtNjAwMF9pdHlwZQl0eXBlOworCWVudW0gdG02MDAwX211eAkJdm11eDsKKwllbnVtIHRtNjAwMF9tdXgJCWFtdXg7CisJdW5zaWduZWQgaW50CQl2X2dwaW87CisJdW5zaWduZWQgaW50CQlhX2dwaW87Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCUJhc2ljIHN0cnVjdHVyZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0cnVjdCB0bTYwMDBfZm10IHsKKwljaGFyICAqbmFtZTsKKwl1MzIgICBmb3VyY2M7ICAgICAgICAgIC8qIHY0bDIgZm9ybWF0IGlkICovCisJaW50ICAgZGVwdGg7Cit9OworCisvKiBidWZmZXIgZm9yIG9uZSB2aWRlbyBmcmFtZSAqLworc3RydWN0IHRtNjAwMF9idWZmZXIgeworCS8qIGNvbW1vbiB2NGwgYnVmZmVyIHN0dWZmIC0tIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyIHZiOworCisJc3RydWN0IHRtNjAwMF9mbXQgICAgICAqZm10OworfTsKKworc3RydWN0IHRtNjAwMF9kbWFxdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICBhY3RpdmU7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICBxdWV1ZWQ7CisKKwkvKiB0aHJlYWQgZm9yIGdlbmVyYXRpbmcgdmlkZW8gc3RyZWFtKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgICAgICAgICAqa3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICAgICB3cTsKKwkvKiBDb3VudGVycyB0byBjb250cm9sIGZwcyByYXRlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgaW5pX2ppZmZpZXM7Cit9OworCisvKiBkZXZpY2Ugc3RhdGVzICovCitlbnVtIHRtNjAwMF9jb3JlX3N0YXRlIHsKKwlERVZfSU5JVElBTElaRUQgICA9IDB4MDEsCisJREVWX0RJU0NPTk5FQ1RFRCAgPSAweDAyLAorCURFVl9NSVNDT05GSUdVUkVEID0gMHgwNCwKK307CisKKy8qIGlvIG1ldGhvZHMgKi8KK2VudW0gdG02MDAwX2lvX21ldGhvZCB7CisJSU9fTk9ORSwKKwlJT19SRUFELAorCUlPX01NQVAsCit9OworCitlbnVtIHRtNjAwMF9tb2RlIHsKKwlUTTYwMDBfTU9ERV9VTktOT1dOID0gMCwKKwlUTTYwMDBfTU9ERV9BTkFMT0csCisJVE02MDAwX01PREVfRElHSVRBTCwKK307CisKK3N0cnVjdCB0bTYwMDBfZ3BpbyB7CisJaW50CQl0dW5lcl9yZXNldDsKKwlpbnQJCXR1bmVyX29uOworCWludAkJZGVtb2RfcmVzZXQ7CisJaW50CQlkZW1vZF9vbjsKKwlpbnQJCXBvd2VyX2xlZDsKKwlpbnQJCWR2Yl9sZWQ7CisJaW50CQlpcjsKK307CisKK3N0cnVjdCB0bTYwMDBfY2FwYWJpbGl0aWVzIHsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX3R1bmVyOjE7CisJdW5zaWduZWQgaW50ICAgIGhhc190ZGE5ODc0OjE7CisJdW5zaWduZWQgaW50ICAgIGhhc19kdmI6MTsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX3psMTAzNTM6MTsKKwl1bnNpZ25lZCBpbnQgICAgaGFzX2VlcHJvbToxOworCXVuc2lnbmVkIGludCAgICBoYXNfcmVtb3RlOjE7CisJdW5zaWduZWQgaW50ICAgIGhhc19yYWRpbzoxOworfTsKKworc3RydWN0IHRtNjAwMF9kdmIgeworCXN0cnVjdCBkdmJfYWRhcHRlcglhZGFwdGVyOworCXN0cnVjdCBkdmJfZGVtdXgJZGVtdXg7CisJc3RydWN0IGR2Yl9mcm9udGVuZAkqZnJvbnRlbmQ7CisJc3RydWN0IGRteGRldgkJZG14ZGV2OworCXVuc2lnbmVkIGludAkJc3RyZWFtczsKKwlzdHJ1Y3QgdXJiCQkqYnVsa191cmI7CisJc3RydWN0IG11dGV4CQltdXRleDsKK307CisKK3N0cnVjdCBzbmRfdG02MDAwX2NhcmQgeworCXN0cnVjdCBzbmRfY2FyZAkJCSpjYXJkOworCXNwaW5sb2NrX3QJCQlyZWdfbG9jazsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUJCSpjb3JlOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQkqc3Vic3RyZWFtOworCisJLyogdGVtcG9yYXJ5IGRhdGEgZm9yIGJ1ZmZlciBmaWxsIHByb2Nlc3NpbmcgKi8KKwl1bnNpZ25lZAkJCWJ1Zl9wb3M7CisJdW5zaWduZWQJCQlwZXJpb2RfcG9zOworfTsKKworc3RydWN0IHRtNjAwMF9lbmRwb2ludCB7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50CSplbmRwOworCV9fdTgJCQkJYkludGVyZmFjZU51bWJlcjsKKwlfX3U4CQkJCWJBbHRlcm5hdGVTZXR0aW5nOworCXVuc2lnbmVkCQkJbWF4c2l6ZTsKK307CisKKyNkZWZpbmUgVE02MDAwX1FVSVJLX05PX1VTQl9ERUxBWSAoMSA8PCAwKQorCitzdHJ1Y3QgdG02MDAwX2NvcmUgeworCS8qIGdlbmVyaWMgZGV2aWNlIHByb3BlcnRpZXMgKi8KKwljaGFyCQkJCW5hbWVbMzBdOwkvKiBuYW1lIChpbmNsdWRpbmcgbWlub3IpIG9mIHRoZSBkZXZpY2UgKi8KKwlpbnQJCQkJbW9kZWw7CQkvKiBpbmRleCBpbiB0aGUgZGV2aWNlX2RhdGEgc3RydWN0ICovCisJaW50CQkJCWRldm5vOwkJLyogbWFya3MgdGhlIG51bWJlciBvZiB0aGlzIGRldmljZSAqLworCWVudW0gdG02MDAwX2RldnR5cGUJCWRldl90eXBlOwkvKiB0eXBlIG9mIGRldmljZSAqLworCXVuc2lnbmVkIGNoYXIJCQllZWRhdGFbMjU2XTsJLyogRWVwcm9tIGRhdGEgKi8KKwl1bnNpZ25lZAkJCWVlZGF0YV9zaXplOwkvKiBTaXplIG9mIHRoZSBlZXByb20gaW5mbyAqLworCisJdjRsMl9zdGRfaWQgICAgICAgICAgICAgICAgICAgICBub3JtOyAgICAgICAgICAgLyogQ3VycmVudCBub3JtICovCisJaW50CQkJCXdpZHRoLCBoZWlnaHQ7CS8qIFNlbGVjdGVkIHJlc29sdXRpb24gKi8KKworCWVudW0gdG02MDAwX2NvcmVfc3RhdGUJCXN0YXRlOworCisJLyogRGV2aWNlIENhcGFiaWxpdGllcyovCisJc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMJY2FwczsKKworCS8qIFR1bmVyIGNvbmZpZ3VyYXRpb24gKi8KKwlpbnQJCQkJdHVuZXJfdHlwZTsJCS8qIHR5cGUgb2YgdGhlIHR1bmVyICovCisJaW50CQkJCXR1bmVyX2FkZHI7CQkvKiB0dW5lciBhZGRyZXNzICovCisKKwlzdHJ1Y3QgdG02MDAwX2dwaW8JCWdwaW87CisKKwljaGFyCQkJCSppcl9jb2RlczsKKworCV9fdTgJCQkJcmFkaW87CisKKwkvKiBEZW1vZHVsYXRvciBjb25maWd1cmF0aW9uICovCisJaW50CQkJCWRlbW9kX2FkZHI7CS8qIGRlbW9kdWxhdG9yIGFkZHJlc3MgKi8KKworCWludAkJCQlhdWRpb19iaXRyYXRlOworCS8qIGkyYyBpL28gKi8KKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJCWkyY19hZGFwOworCXN0cnVjdCBpMmNfY2xpZW50CQlpMmNfY2xpZW50OworCisKKwkvKiBleHRlbnNpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCQlkZXZsaXN0OworCisJLyogdmlkZW8gZm9yIGxpbnV4ICovCisJaW50CQkJCXVzZXJzOworCisJLyogdmFyaW91cyBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCB0bTYwMDBfZmgJCSpyZXNvdXJjZXM7CS8qIFBvaW50cyB0byBmaCB0aGF0IGlzIHN0cmVhbWluZyAqLworCWJvb2wJCQkJaXNfcmVzX3JlYWQ7CisKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlCQkqdmZkOworCXN0cnVjdCB2aWRlb19kZXZpY2UJCSpyYWRpb19kZXY7CisJc3RydWN0IHRtNjAwMF9kbWFxdWV1ZQkJdmlkcTsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UJCXY0bDJfZGV2OworCisJaW50CQkJCWlucHV0OworCXN0cnVjdCB0bTYwMDBfaW5wdXQJCXZpbnB1dFszXTsJLyogdmlkZW8gaW5wdXQgKi8KKwlzdHJ1Y3QgdG02MDAwX2lucHV0CQlyaW5wdXQ7CQkvKiByYWRpbyBpbnB1dCAqLworCisJaW50CQkJCWZyZXE7CisJdW5zaWduZWQgaW50CQkJZm91cmNjOworCisJZW51bSB0bTYwMDBfbW9kZQkJbW9kZTsKKworCWludAkJCQljdGxfbXV0ZTsgICAgICAgICAgICAgLyogYXVkaW8gKi8KKwlpbnQJCQkJY3RsX3ZvbHVtZTsKKwlpbnQJCQkJYW1vZGU7CisKKwkvKiBEVkItVCBzdXBwb3J0ICovCisJc3RydWN0IHRtNjAwMF9kdmIJCSpkdmI7CisKKwkvKiBhdWRpbyBzdXBwb3J0ICovCisJc3RydWN0IHNuZF90bTYwMDBfY2FyZAkJKmFkZXY7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3cV90cmlnZ2VyOyAgIC8qIFRyaWdnZXIgdG8gc3RhcnQvc3RvcCBhdWRpbyBmb3IgYWxzYSBtb2R1bGUgKi8KKwlhdG9taWNfdAkJCXN0cmVhbV9zdGFydGVkOyAgLyogc3RyZWFtIHNob3VsZCBiZSBydW5uaW5nIGlmIHRydWUgKi8KKworCXN0cnVjdCB0bTYwMDBfSVIJCSppcjsKKworCS8qIGxvY2tzICovCisJc3RydWN0IG11dGV4CQkJbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCQl1c2JfbG9jazsKKworCS8qIHVzYiB0cmFuc2ZlciAqLworCXN0cnVjdCB1c2JfZGV2aWNlCQkqdWRldjsJCS8qIHRoZSB1c2IgZGV2aWNlICovCisKKwlzdHJ1Y3QgdG02MDAwX2VuZHBvaW50CQlidWxrX2luLCBidWxrX291dCwgaXNvY19pbiwgaXNvY19vdXQ7CisJc3RydWN0IHRtNjAwMF9lbmRwb2ludAkJaW50X2luLCBpbnRfb3V0OworCisJLyogc2NhbGVyIT0wIGlmIHNjYWxlciBpcyBhY3RpdmUqLworCWludAkJCQlzY2FsZXI7CisKKwkJLyogSXNvYyBjb250cm9sIHN0cnVjdCAqLworCXN0cnVjdCB1c2JfaXNvY19jdGwgICAgICAgICAgaXNvY19jdGw7CisKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgIHNsb2NrOworCisJdW5zaWduZWQgbG9uZyBxdWlya3M7Cit9OworCitlbnVtIHRtNjAwMF9vcHNfdHlwZSB7CisJVE02MDAwX0FVRElPID0gMHgxMCwKKwlUTTYwMDBfRFZCID0gMHgyMCwKK307CisKK3N0cnVjdCB0bTYwMDBfb3BzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5leHQ7CisJY2hhcgkJCSpuYW1lOworCWVudW0gdG02MDAwX29wc190eXBlCXR5cGU7CisJaW50ICgqaW5pdCkoc3RydWN0IHRtNjAwMF9jb3JlICopOworCWludCAoKmZpbmkpKHN0cnVjdCB0bTYwMDBfY29yZSAqKTsKKwlpbnQgKCpmaWxsYnVmKShzdHJ1Y3QgdG02MDAwX2NvcmUgKiwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7Cit9OworCitzdHJ1Y3QgdG02MDAwX2ZoIHsKKwlzdHJ1Y3QgdG02MDAwX2NvcmUgICAgICAgICAgICpkZXY7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICByYWRpbzsKKworCS8qIHZpZGVvIGNhcHR1cmUgKi8KKwlzdHJ1Y3QgdG02MDAwX2ZtdCAgICAgICAgICAgICpmbXQ7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAgICAgICAgdmJfdmlkcTsKKworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgICAgICAgdHlwZTsKK307CisKKyNkZWZpbmUgVE02MDAwX1NURAkoVjRMMl9TVERfUEFMfFY0TDJfU1REX1BBTF9OfFY0TDJfU1REX1BBTF9OY3wgICAgXAorCQkJVjRMMl9TVERfUEFMX018VjRMMl9TVERfUEFMXzYwfFY0TDJfU1REX05UU0NfTXwgXAorCQkJVjRMMl9TVERfTlRTQ19NX0pQfFY0TDJfU1REX1NFQ0FNKQorCisvKiBJbiB0bTYwMDAtY2FyZHMuYyAqLworCitpbnQgdG02MDAwX3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpOworaW50IHRtNjAwMF94YzUwMDBfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7CitpbnQgdG02MDAwX2NhcmRzX3NldHVwKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK3ZvaWQgdG02MDAwX2ZsYXNoX2xlZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpOworCisvKiBJbiB0bTYwMDAtY29yZS5jICovCisKK2ludCB0bTYwMDBfcmVhZF93cml0ZV91c2Ioc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcXR5cGUsIHU4IHJlcSwKKwkJCSAgIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1OCAqYnVmLCB1MTYgbGVuKTsKK2ludCB0bTYwMDBfZ2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX2dldF9yZWcxNihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX2dldF9yZWczMihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7CitpbnQgdG02MDAwX3NldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpOworaW50IHRtNjAwMF9zZXRfcmVnX21hc2soc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLAorCQkJCQkJdTE2IGluZGV4LCB1MTYgbWFzayk7CitpbnQgdG02MDAwX2kyY19yZXNldChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTE2IHRzbGVlcCk7CitpbnQgdG02MDAwX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9yZXNldChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CisKK2ludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKTsKK2ludCB0bTYwMDBfc2V0X2F1ZGlvX3JpbnB1dChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX3R2YXVkaW9fc2V0X211dGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpOwordm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCk7CisKK2ludCB0bTYwMDBfdjRsMl9yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX3Y0bDJfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKTsKK3ZvaWQgdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKKwordm9pZCB0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Cit2b2lkIHRtNjAwMF9hZGRfaW50b19kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKK2ludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpOwordm9pZCB0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9vcHMgKm9wcyk7Cit2b2lkIHRtNjAwMF9pbml0X2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Cit2b2lkIHRtNjAwMF9jbG9zZV9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9jYWxsX2ZpbGxidWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGVudW0gdG02MDAwX29wc190eXBlIHR5cGUsCisJCQljaGFyICpidWYsIGludCBzaXplKTsKKworCisvKiBJbiB0bTYwMDAtc3Rkcy5jICovCit2b2lkIHRtNjAwMF9nZXRfc3RkX3JlcyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX3NldF9zdGFuZGFyZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CisKKy8qIEluIHRtNjAwMC1pMmMuYyAqLworaW50IHRtNjAwMF9pMmNfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CisKKy8qIEluIHRtNjAwMC1xdWV1ZS5jICovCisKK2ludCB0bTYwMDBfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK2ludCB0bTYwMDBfdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpOworaW50IHRtNjAwMF92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSBpKTsKK2ludCB0bTYwMDBfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYik7CitpbnQgdG02MDAwX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CitpbnQgdG02MDAwX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOworaW50IHRtNjAwMF92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Citzc2l6ZV90IHRtNjAwMF92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpmX3Bvcyk7Cit1bnNpZ25lZCBpbnQgdG02MDAwX3Y0bDJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CitpbnQgdG02MDAwX3F1ZXVlX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworCisvKiBJbiB0bTYwMDAtYWxzYS5jICovCisvKmludCB0bTYwMDBfYXVkaW9faW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGlkeCk7Ki8KKworLyogSW4gdG02MDAwLWlucHV0LmMgKi8KK2ludCB0bTYwMDBfaXJfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7CitpbnQgdG02MDAwX2lyX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwordm9pZCB0bTYwMDBfaXJfd2FpdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpOworaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwordm9pZCB0bTYwMDBfaXJfaW50X3N0b3Aoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOworCisvKiBEZWJ1ZyBzdHVmZiAqLworCitleHRlcm4gaW50IHRtNjAwMF9kZWJ1ZzsKKworI2RlZmluZSBkcHJpbnRrKGRldiwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7XAorCWlmICh0bTYwMDBfZGVidWcgJiBsZXZlbCkgXAorCQlwcmludGsoS0VSTl9JTkZPICIoJWx1KSAlcyAlcyA6ImZtdCwgamlmZmllcywgXAorCQkJIGRldi0+bmFtZSwgX19mdW5jX18gLCAjI2FyZyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVjRMMl9ERUJVR19SRUcJCTB4MDAwNAorI2RlZmluZSBWNEwyX0RFQlVHX0kyQwkJMHgwMDA4CisjZGVmaW5lIFY0TDJfREVCVUdfUVVFVUUJMHgwMDEwCisjZGVmaW5lIFY0TDJfREVCVUdfSVNPQwkJMHgwMDIwCisjZGVmaW5lIFY0TDJfREVCVUdfUkVTX0xPQ0sJMHgwMDQwCS8qIFJlc291cmNlIGxvY2tpbmcgKi8KKyNkZWZpbmUgVjRMMl9ERUJVR19PUEVOCQkweDAwODAJLyogdmlkZW8gb3Blbi9jbG9zZSBkZWJ1ZyAqLworCisjZGVmaW5lIHRtNjAwMF9lcnIoZm10LCBhcmcuLi4pIGRvIHtcCisJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDAgJXMgOiJmbXQsIFwKKwkJX19mdW5jX18gLCAjI2FyZyk7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCmluZGV4IGM0NmEzYmIuLmYyMmRiZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC0xNjk1LDE0ICsxNjk1LDE3IEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgogCXsKIAkJaW50IHZvbHVtZSwgYmFsYW5jZTsKKwogCQlpZiAoIShkZXNjLT5mbGFncyAmIENISVBfSEFTX1ZPTFVNRSkpCiAJCQlicmVhazsKIAotCQl2b2x1bWUgPSBtYXgoY2hpcC0+bGVmdCxjaGlwLT5yaWdodCk7CisJCXZvbHVtZSA9IG1heChjaGlwLT5sZWZ0LCBjaGlwLT5yaWdodCk7CiAJCWJhbGFuY2UgPSBjdHJsLT52YWx1ZTsKKwkJY2hpcC0+bGVmdCA9IChtaW4oNjU1MzYgLSBiYWxhbmNlLCAzMjc2OCkgKiB2b2x1bWUpIC8gMzI3Njg7CisJCWNoaXAtPnJpZ2h0ID0gKG1pbihiYWxhbmNlLCB2b2x1bWUgKiAoX191MTYpMzI3NjgpKSAvIDMyNzY4OwogCi0JCWNoaXBfd3JpdGUoY2hpcCxkZXNjLT5sZWZ0cmVnLGRlc2MtPnZvbGZ1bmMoY2hpcC0+bGVmdCkpOwotCQljaGlwX3dyaXRlKGNoaXAsZGVzYy0+cmlnaHRyZWcsZGVzYy0+dm9sZnVuYyhjaGlwLT5yaWdodCkpOworCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPmxlZnRyZWcsIGRlc2MtPnZvbGZ1bmMoY2hpcC0+bGVmdCkpOworCQljaGlwX3dyaXRlKGNoaXAsIGRlc2MtPnJpZ2h0cmVnLCBkZXNjLT52b2xmdW5jKGNoaXAtPnJpZ2h0KSk7CiAKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTR4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYwppbmRleCA5YjNlODI4Li45MjZmMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNHguYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwppbmRleCBlOTI3ZDI1Li42YWJhYTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3R2cDUxNTAuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MF9yZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MF9yZWcuaAppbmRleCA0MjQwMDQzLi4yNWE5OTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTBfcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dnA1MTUwX3JlZy5oCkBAIC00NSw3ICs0NSwyMiBAQAogCiAvKiBSZXNlcnZlZCAxRmgtMjdoICovCiAKLSNkZWZpbmUgVFZQNTE1MF9WSURFT19TVEQgICAgICAgICAgIDB4MjggLyogVmlkZW8gc3RhbmRhcmQgKi8KKyNkZWZpbmUgVklERU9fU1REX01BU0sJCQkgKDB4MDcgPj4gMSkKKyNkZWZpbmUgVFZQNTE1MF9WSURFT19TVEQgICAgICAgICAgICAgICAgMHgyOCAvKiBWaWRlbyBzdGFuZGFyZCAqLworI2RlZmluZSBWSURFT19TVERfQVVUT19TV0lUQ0hfQklUCSAweDAwCisjZGVmaW5lIFZJREVPX1NURF9OVFNDX01KX0JJVAkJIDB4MDIKKyNkZWZpbmUgVklERU9fU1REX1BBTF9CREdISU5fQklUCSAweDA0CisjZGVmaW5lIFZJREVPX1NURF9QQUxfTV9CSVQJCSAweDA2CisjZGVmaW5lIFZJREVPX1NURF9QQUxfQ09NQklOQVRJT05fTl9CSVQJIDB4MDgKKyNkZWZpbmUgVklERU9fU1REX05UU0NfNF80M19CSVQJCSAweDBhCisjZGVmaW5lIFZJREVPX1NURF9TRUNBTV9CSVQJCSAweDBjCisKKyNkZWZpbmUgVklERU9fU1REX05UU0NfTUpfQklUX0FTICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFZJREVPX1NURF9QQUxfQkRHSElOX0JJVF9BUyAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBWSURFT19TVERfUEFMX01fQklUX0FTCQkgICAgICAgICAweDA1CisjZGVmaW5lIFZJREVPX1NURF9QQUxfQ09NQklOQVRJT05fTl9CSVRfQVMJIDB4MDcKKyNkZWZpbmUgVklERU9fU1REX05UU0NfNF80M19CSVRfQVMJCSAweDA5CisjZGVmaW5lIFZJREVPX1NURF9TRUNBTV9CSVRfQVMJCSAgICAgICAgIDB4MGIKIAogLyogUmVzZXJ2ZWQgMjloLTJiaCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDcwMDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCmluZGV4IGI3OTk4NTEuLjc4NzVlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3R2cDcwMDIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpAQCAtMTI4LDcgKzEyOSw3IEBACiAJeyBUVlA3MDAyX0FEQ19TRVRVUCwgMHg1MCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9DT0FSU0VfQ0xBTVBfQ1RMLCAweDAwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX1NPR19DTEFNUCwgMHg4MCwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9SR0JfQ09BUlNFX0NMQU1QX0NUTCwgMHgwMCwgVFZQNzAwMl9XUklURSB9LAorCXsgVFZQNzAwMl9SR0JfQ09BUlNFX0NMQU1QX0NUTCwgMHg4YywgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9TT0dfQ09BUlNFX0NMQU1QX0NUTCwgMHgwNCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BTENfUExBQ0VNRU5ULCAweDVhLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyAweDMyLCAweDE4LCBUVlA3MDAyX1JFU0VSVkVEIH0sCkBAIC0xODIsNyArMTgzLDYgQEAKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9NU0JTLCAweDM1LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTFNCUywgMHhhMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0NSVEwsIDB4MDIsIFRWUDcwMDJfV1JJVEUgfSwKLQl7IFRWUDcwMDJfSFBMTF9QSEFTRV9TRUwsIDB4MTQsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9MU0JTLCAweDkxLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTVNCUywgMHgwMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUT1BfUElYRUxfTFNCUywgMHgwQiwgVFZQNzAwMl9XUklURSB9LApAQCAtMjA0LDcgKzIwNCw2IEBACiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTVNCUywgMHgzNiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX0xTQlMsIDB4MDAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9DUlRMLCAweDE4LCBUVlA3MDAyX1dSSVRFIH0sCi0JeyBUVlA3MDAyX0hQTExfUEhBU0VfU0VMLCAweDE0LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTFNCUywgMHg5QiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX01TQlMsIDB4MDAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVE9QX1BJWEVMX0xTQlMsIDB4MEYsIFRWUDcwMDJfV1JJVEUgfSwKQEAgLTIyNiw3ICsyMjUsNiBAQAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX01TQlMsIDB4ODksIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9MU0JTLCAweDgwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfQ1JUTCwgMHg5OCwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9IUExMX1BIQVNFX1NFTCwgMHgxNCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX0xTQlMsIDB4MDYsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9NU0JTLCAweDAxLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RPUF9QSVhFTF9MU0JTLCAweDhhLCBUVlA3MDAyX1dSSVRFIH0sCkBAIC0yNDgsNyArMjQ2LDYgQEAKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9NU0JTLCAweDg5LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTFNCUywgMHg4MCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0NSVEwsIDB4RTAsIFRWUDcwMDJfV1JJVEUgfSwKLQl7IFRWUDcwMDJfSFBMTF9QSEFTRV9TRUwsIDB4MTQsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9MU0JTLCAweDA2LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTVNCUywgMHgwMSwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUT1BfUElYRUxfTFNCUywgMHg4YSwgVFZQNzAwMl9XUklURSB9LApAQCAtMjcwLDcgKzI2Nyw2IEBACiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTVNCUywgMHhhNSwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX0xTQlMsIDB4MDAsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9DUlRMLCAweDk4LCBUVlA3MDAyX1dSSVRFIH0sCi0JeyBUVlA3MDAyX0hQTExfUEhBU0VfU0VMLCAweDE0LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTFNCUywgMHgwNiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX01TQlMsIDB4MDEsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVE9QX1BJWEVMX0xTQlMsIDB4OGEsIFRWUDcwMDJfV1JJVEUgfSwKQEAgLTI5Miw3ICsyODgsNiBAQAogCXsgVFZQNzAwMl9IUExMX0ZEQktfRElWX01TQlMsIDB4NjcsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9MU0JTLCAweDIwLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfQ1JUTCwgMHhhMCwgVFZQNzAwMl9XUklURSB9LAotCXsgVFZQNzAwMl9IUExMX1BIQVNFX1NFTCwgMHgxNiwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUQVJUX1BJWEVMX0xTQlMsIDB4NDcsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9NU0JTLCAweDAxLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RPUF9QSVhFTF9MU0JTLCAweDRCLCBUVlA3MDAyX1dSSVRFIH0sCkBAIC0zMTQsNyArMzA5LDYgQEAKIAl7IFRWUDcwMDJfSFBMTF9GREJLX0RJVl9NU0JTLCAweDdiLCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0hQTExfRkRCS19ESVZfTFNCUywgMHhjMCwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9IUExMX0NSVEwsIDB4OTgsIFRWUDcwMDJfV1JJVEUgfSwKLQl7IFRWUDcwMDJfSFBMTF9QSEFTRV9TRUwsIDB4MTYsIFRWUDcwMDJfV1JJVEUgfSwKIAl7IFRWUDcwMDJfQVZJRF9TVEFSVF9QSVhFTF9MU0JTLCAweDQ3LCBUVlA3MDAyX1dSSVRFIH0sCiAJeyBUVlA3MDAyX0FWSURfU1RBUlRfUElYRUxfTVNCUywgMHgwMSwgVFZQNzAwMl9XUklURSB9LAogCXsgVFZQNzAwMl9BVklEX1NUT1BfUElYRUxfTFNCUywgMHg0QiwgVFZQNzAwMl9XUklURSB9LApAQCAtNjg3LDYgKzY4MSw5IEBACiAJdTggY3BsX21zYjsKIAlpbnQgaW5kZXg7CiAKKwkvKiBSZXR1cm4gaW52YWxpZCBwcmVzZXQgaWYgbm8gYWN0aXZlIGlucHV0IGlzIGRldGVjdGVkICovCisJcXByZXNldC0+cHJlc2V0ID0gVjRMMl9EVl9JTlZBTElEOworCiAJZGV2aWNlID0gdG9fdHZwNzAwMihzZCk7CiAKIAkvKiBSZWFkIHN0YW5kYXJkcyBmcm9tIGRldmljZSByZWdpc3RlcnMgKi8KQEAgLTcyMCw4ICs3MTcsNiBAQAogCWlmIChpbmRleCA9PSBOVU1fUFJFU0VUUykgewogCQl2NGwyX2RiZygxLCBkZWJ1Zywgc2QsICJkZXRlY3Rpb24gZmFpbGVkOiBscGYgPSAleCwgY3BsID0gJXhcbiIsCiAJCQkJCQkJCWxwZnIsIGNwbG4pOwotCQkvKiBDb3VsZCBub3QgZGV0ZWN0IGEgc2lnbmFsLCBzbyByZXR1cm4gdGhlICdpbnZhbGlkJyBwcmVzZXQgKi8KLQkJcXByZXNldC0+cHJlc2V0ID0gVjRMMl9EVl9JTlZBTElEOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jCmluZGV4IDc0MjQ4MmUuLmE1MTRmYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYwpAQCAtMjIsMTEgKzIyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHc5OTEwLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KIAogI2RlZmluZSBHRVRfSUQodmFsKSAgKCh2YWwgJiAweEY4KSA+PiAzKQogI2RlZmluZSBHRVRfUkVWKHZhbCkgKHZhbCAmIDB4MDcpCkBAIC0yMDMsNiArMjA1LDEwIEBACiAjZGVmaW5lIFJUU0VMX0ZJRUxEIDB4MDYgLyogMDExMCA9IEZJRUxEICovCiAjZGVmaW5lIFJUU0VMX1JUQ08gIDB4MDcgLyogMDExMSA9IFJUQ08gKCBSZWFsIFRpbWUgQ29udHJvbCApICovCiAKKy8qIEhTWU5DIHN0YXJ0IGFuZCBlbmQgYXJlIGNvbnN0YW50IGZvciBub3cgKi8KKyNkZWZpbmUgSFNZTkNfU1RBUlQJMHgwMjYwCisjZGVmaW5lIEhTWU5DX0VORAkweDAzMDAKKwogLyoKICAqIHN0cnVjdHVyZQogICovCkBAIC0yMjAsMjIgKzIyNiwxMSBAQAogCXUxNiAgICAgICAgICAgICB2c2NhbGU7CiB9OwogCi1zdHJ1Y3QgdHc5OTEwX2Nyb3BwaW5nX2N0cmwgewotCXUxNiB2ZGVsYXk7Ci0JdTE2IHZhY3RpdmU7Ci0JdTE2IGhkZWxheTsKLQl1MTYgaGFjdGl2ZTsKLX07Ci0KLXN0cnVjdCB0dzk5MTBfaHN5bmNfY3RybCB7Ci0JdTE2IHN0YXJ0OwotCXUxNiBlbmQ7Ci19OwotCiBzdHJ1Y3QgdHc5OTEwX3ByaXYgewogCXN0cnVjdCB2NGwyX3N1YmRldgkJc3ViZGV2OwogCXN0cnVjdCB0dzk5MTBfdmlkZW9faW5mbwkqaW5mbzsKIAljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwJKnNjYWxlOworCXY0bDJfc3RkX2lkCQkJbm9ybTsKIAl1MzIJCQkJcmV2aXNpb247CiB9OwogCkBAIC0zMjksMTEgKzMyNCw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHc5OTEwX2hzeW5jX2N0cmwgdHc5OTEwX2hzeW5jX2N0cmwgPSB7Ci0JLnN0YXJ0ID0gMHgwMjYwLAotCS5lbmQgICA9IDB4MDMwMCwKLX07Ci0KIC8qCiAgKiBnZW5lcmFsIGZ1bmN0aW9uCiAgKi8KQEAgLTM3OCwyMSArMzY4LDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB0dzk5MTBfc2V0X2hzeW5jKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IHR3OTkxMF9oc3luY19jdHJsICpoc3luYykKK3N0YXRpYyBpbnQgdHc5OTEwX3NldF9oc3luYyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwogCWludCByZXQ7CiAKIAkvKiBiaXQgMTAgLSAzICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEhTQkVHSU4sCi0JCQkJCShoc3luYy0+c3RhcnQgJiAweDA3RjgpID4+IDMpOworCQkJCQkoSFNZTkNfU1RBUlQgJiAweDA3RjgpID4+IDMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJLyogYml0IDEwIC0gMyAqLwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBIU0VORCwKLQkJCQkJKGhzeW5jLT5lbmQgJiAweDA3RjgpID4+IDMpOworCQkJCQkoSFNZTkNfRU5EICYgMHgwN0Y4KSA+PiAzKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDAwLDggKzM4OSw4IEBACiAJLyogYml0IDIgLSAwICovCiAJaWYgKDEgPT0gcHJpdi0+cmV2aXNpb24pCiAJCXJldCA9IHR3OTkxMF9tYXNrX3NldChjbGllbnQsIEhTTE9XQ1RMLCAweDc3LAotCQkJCSAgICAgIChoc3luYy0+c3RhcnQgJiAweDAwMDcpIDw8IDQgfAotCQkJCSAgICAgIChoc3luYy0+ZW5kICAgJiAweDAwMDcpKTsKKwkJCQkgICAgICAoSFNZTkNfU1RBUlQgJiAweDAwMDcpIDw8IDQgfAorCQkJCSAgICAgIChIU1lOQ19FTkQgICAmIDB4MDAwNykpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQzMywxMiArNDIyLDExIEBACiAJcmV0dXJuIHR3OTkxMF9tYXNrX3NldChjbGllbnQsIEFDTlRMMiwgQUNOVEwyX1BETl9NQVNLLCBhY250bDIpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsKgotdHc5OTEwX3NlbGVjdF9ub3JtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsICp0dzk5MTBfc2VsZWN0X25vcm0odjRsMl9zdGRfaWQgbm9ybSwKKwkJCQkJCQkgIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKIHsKIAljb25zdCBzdHJ1Y3QgdHc5OTEwX3NjYWxlX2N0cmwgKnNjYWxlOwogCWNvbnN0IHN0cnVjdCB0dzk5MTBfc2NhbGVfY3RybCAqcmV0ID0gTlVMTDsKLQl2NGwyX3N0ZF9pZCBub3JtID0gaWNkLT52ZGV2LT5jdXJyZW50X25vcm07CiAJX191MzIgZGlmZiA9IDB4ZmZmZmZmZmYsIHRtcDsKIAlpbnQgc2l6ZSwgaTsKIApAQCAtNDY1LDcgKzQ1Myw3IEBACiB9CiAKIC8qCi0gKiBzb2NfY2FtZXJhX29wcyBmdW5jdGlvbgorICogc3ViZGV2aWNlIG9wZXJhdGlvbnMKICAqLwogc3RhdGljIGludCB0dzk5MTBfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKIHsKQEAgLTUwNyw0OSArNDk1LDI3IEBACiAJcmV0dXJuIHR3OTkxMF9wb3dlcihjbGllbnQsIGVuYWJsZSk7CiB9CiAKLXN0YXRpYyBpbnQgdHc5OTEwX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbnQgdHc5OTEwX2dfc3RkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpub3JtKQogewotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQl1OCB2YWwgPSBWU1NMX1ZWQUxJRCB8IEhTU0xfRFZBTElEOwotCi0JLyoKLQkgKiBzZXQgT1VUQ1RSMQotCSAqCi0JICogV2UgdXNlIFZWQUxJRCBhbmQgRFZBTElEIHNpZ25hbHMgdG8gY29udHJvbCBWU1lOQyBhbmQgSFNZTkMKLQkgKiBvdXRwdXRzLCBpbiB0aGlzIG1vZGUgdGhlaXIgcG9sYXJpdHkgaXMgaW52ZXJ0ZWQuCi0JICovCi0JaWYgKGZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKLQkJdmFsIHw9IEhTUF9ISTsKLQotCWlmIChmbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpCi0JCXZhbCB8PSBWU1BfSEk7Ci0KLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE9VVENUUjEsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHR3OTkxMF9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfCBTT0NBTV9NQVNURVIgfAotCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8IFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKLQkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyAgfCBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XICB8Ci0JCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0ggfCBwcml2LT5pbmZvLT5idXN3aWR0aDsKIAotCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKKwkqbm9ybSA9IHByaXYtPm5vcm07CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0dzk5MTBfc19zdGQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgbm9ybSkKIHsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7CiAKLQlpZiAobm9ybSAmIChWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMKSkKLQkJcmV0ID0gMDsKKwlpZiAoIShub3JtICYgKFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcmV0OworCXByaXYtPm5vcm0gPSBub3JtOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdHc5OTEwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLApAQCAtNjAwLDE5ICs1NjYsMTcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHR3OTkxMF9zX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3N0YXRpYyBpbnQgdHc5OTEwX3NldF9mcmFtZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKIHsKLQlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCB0dzk5MTBfcHJpdiAqcHJpdiA9IHRvX3R3OTkxMChjbGllbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpbnQgICAgICAgICAgICAgICAgIHJldCAgPSAtRUlOVkFMOwotCXU4ICAgICAgICAgICAgICAgICAgdmFsOworCWludCByZXQgPSAtRUlOVkFMOworCXU4IHZhbDsKIAogCS8qCiAJICogc2VsZWN0IHN1aXRhYmxlIG5vcm0KIAkgKi8KLQlwcml2LT5zY2FsZSA9IHR3OTkxMF9zZWxlY3Rfbm9ybShpY2QsIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOworCXByaXYtPnNjYWxlID0gdHc5OTEwX3NlbGVjdF9ub3JtKHByaXYtPm5vcm0sICp3aWR0aCwgKmhlaWdodCk7CiAJaWYgKCFwcml2LT5zY2FsZSkKIAkJZ290byB0dzk5MTBfc2V0X2ZtdF9lcnJvcjsKIApAQCAtNjcwLDE0ICs2MzQsMTIgQEAKIAkvKgogCSAqIHNldCBoc3luYwogCSAqLwotCXJldCA9IHR3OTkxMF9zZXRfaHN5bmMoY2xpZW50LCAmdHc5OTEwX2hzeW5jX2N0cmwpOworCXJldCA9IHR3OTkxMF9zZXRfaHN5bmMoY2xpZW50KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byB0dzk5MTBfc2V0X2ZtdF9lcnJvcjsKIAotCXJlY3QtPndpZHRoID0gcHJpdi0+c2NhbGUtPndpZHRoOwotCXJlY3QtPmhlaWdodCA9IHByaXYtPnNjYWxlLT5oZWlnaHQ7Ci0JcmVjdC0+bGVmdCA9IDA7Ci0JcmVjdC0+dG9wID0gMDsKKwkqd2lkdGggPSBwcml2LT5zY2FsZS0+d2lkdGg7CisJKmhlaWdodCA9IHByaXYtPnNjYWxlLT5oZWlnaHQ7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC02OTQsMjUgKzY1NiwxNSBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAotCWlmICghcHJpdi0+c2NhbGUpIHsKLQkJaW50IHJldDsKLQkJc3RydWN0IHY0bDJfY3JvcCBjcm9wID0gewotCQkJLmMgPSB7Ci0JCQkJLmxlZnQJPSAwLAotCQkJCS50b3AJPSAwLAotCQkJCS53aWR0aAk9IDY0MCwKLQkJCQkuaGVpZ2h0CT0gNDgwLAotCQkJfSwKLQkJfTsKLQkJcmV0ID0gdHc5OTEwX3NfY3JvcChzZCwgJmNyb3ApOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCiAJYS0+Yy5sZWZ0CT0gMDsKIAlhLT5jLnRvcAk9IDA7Ci0JYS0+Yy53aWR0aAk9IHByaXYtPnNjYWxlLT53aWR0aDsKLQlhLT5jLmhlaWdodAk9IHByaXYtPnNjYWxlLT5oZWlnaHQ7CisJaWYgKHByaXYtPm5vcm0gJiBWNEwyX1NURF9OVFNDKSB7CisJCWEtPmMud2lkdGgJPSA2NDA7CisJCWEtPmMuaGVpZ2h0CT0gNDgwOworCX0gZWxzZSB7CisJCWEtPmMud2lkdGgJPSA3Njg7CisJCWEtPmMuaGVpZ2h0CT0gNTc2OworCX0KIAlhLT50eXBlCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAogCXJldHVybiAwOwpAQCAtNzIwLDE0ICs2NzIsMTkgQEAKIAogc3RhdGljIGludCB0dzk5MTBfY3JvcGNhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKKwogCWEtPmJvdW5kcy5sZWZ0CQkJPSAwOwogCWEtPmJvdW5kcy50b3AJCQk9IDA7Ci0JYS0+Ym91bmRzLndpZHRoCQkJPSA3Njg7Ci0JYS0+Ym91bmRzLmhlaWdodAkJPSA1NzY7Ci0JYS0+ZGVmcmVjdC5sZWZ0CQkJPSAwOwotCWEtPmRlZnJlY3QudG9wCQkJPSAwOwotCWEtPmRlZnJlY3Qud2lkdGgJCT0gNjQwOwotCWEtPmRlZnJlY3QuaGVpZ2h0CQk9IDQ4MDsKKwlpZiAocHJpdi0+bm9ybSAmIFY0TDJfU1REX05UU0MpIHsKKwkJYS0+Ym91bmRzLndpZHRoCQk9IDY0MDsKKwkJYS0+Ym91bmRzLmhlaWdodAk9IDQ4MDsKKwl9IGVsc2UgeworCQlhLT5ib3VuZHMud2lkdGgJCT0gNzY4OworCQlhLT5ib3VuZHMuaGVpZ2h0CT0gNTc2OworCX0KKwlhLT5kZWZyZWN0CQkJPSBhLT5ib3VuZHM7CiAJYS0+dHlwZQkJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOwogCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKQEAgLTc0MywxNSArNzAwLDggQEAKIAogCWlmICghcHJpdi0+c2NhbGUpIHsKIAkJaW50IHJldDsKLQkJc3RydWN0IHY0bDJfY3JvcCBjcm9wID0gewotCQkJLmMgPSB7Ci0JCQkJLmxlZnQJPSAwLAotCQkJCS50b3AJPSAwLAotCQkJCS53aWR0aAk9IDY0MCwKLQkJCQkuaGVpZ2h0CT0gNDgwLAotCQkJfSwKLQkJfTsKLQkJcmV0ID0gdHc5OTEwX3NfY3JvcChzZCwgJmNyb3ApOworCQl1MzIgd2lkdGggPSA2NDAsIGhlaWdodCA9IDQ4MDsKKwkJcmV0ID0gdHc5OTEwX3NldF9mcmFtZShzZCwgJndpZHRoLCAmaGVpZ2h0KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTc2OCwxNyArNzE4LDcgQEAKIHN0YXRpYyBpbnQgdHc5OTEwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7Ci0JLyogU2VlIHR3OTkxMF9zX2Nyb3AoKSAtIG5vIHByb3BlciBjcm9wcGluZyBzdXBwb3J0ICovCi0Jc3RydWN0IHY0bDJfY3JvcCBhID0gewotCQkuYyA9IHsKLQkJCS5sZWZ0CT0gMCwKLQkJCS50b3AJPSAwLAotCQkJLndpZHRoCT0gbWYtPndpZHRoLAotCQkJLmhlaWdodAk9IG1mLT5oZWlnaHQsCi0JCX0sCi0JfTsKKwl1MzIgd2lkdGggPSBtZi0+d2lkdGgsIGhlaWdodCA9IG1mLT5oZWlnaHQ7CiAJaW50IHJldDsKIAogCVdBUk5fT04obWYtPmZpZWxkICE9IFY0TDJfRklFTERfQU5ZICYmCkBAIC03OTIsMTAgKzczMiwxMCBAQAogCiAJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKIAotCXJldCA9IHR3OTkxMF9zX2Nyb3Aoc2QsICZhKTsKKwlyZXQgPSB0dzk5MTBfc2V0X2ZyYW1lKHNkLCAmd2lkdGgsICZoZWlnaHQpOwogCWlmICghcmV0KSB7Ci0JCW1mLT53aWR0aAk9IHByaXYtPnNjYWxlLT53aWR0aDsKLQkJbWYtPmhlaWdodAk9IHByaXYtPnNjYWxlLT5oZWlnaHQ7CisJCW1mLT53aWR0aAk9IHdpZHRoOworCQltZi0+aGVpZ2h0CT0gaGVpZ2h0OwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtODA0LDcgKzc0NCw3IEBACiAJCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHR3OTkxMF9wcml2ICpwcml2ID0gdG9fdHc5OTEwKGNsaWVudCk7CiAJY29uc3Qgc3RydWN0IHR3OTkxMF9zY2FsZV9jdHJsICpzY2FsZTsKIAogCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBtZi0+ZmllbGQpIHsKQEAgLTgyMCw3ICs3NjAsNyBAQAogCS8qCiAJICogc2VsZWN0IHN1aXRhYmxlIG5vcm0KIAkgKi8KLQlzY2FsZSA9IHR3OTkxMF9zZWxlY3Rfbm9ybShpY2QsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisJc2NhbGUgPSB0dzk5MTBfc2VsZWN0X25vcm0ocHJpdi0+bm9ybSwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKIAlpZiAoIXNjYWxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtODMwLDE2ICs3NzAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0dzk5MTBfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCi0JCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCB0dzk5MTBfdmlkZW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAlzMzIgaWQ7CiAKLQkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLwotCUJVR19PTighaWNkLT5wYXJlbnQgfHwKLQkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7Ci0KIAkvKgogCSAqIHR3OTkxMCBvbmx5IHVzZSA4IG9yIDE2IGJpdCBidXMgd2lkdGgKIAkgKi8KQEAgLTg2OCwyMCArODAzLDE1IEBACiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAogCQkgInR3OTkxMCBQcm9kdWN0IElEICUweDolMHhcbiIsIGlkLCBwcml2LT5yZXZpc2lvbik7CiAKLQlpY2QtPnZkZXYtPnR2bm9ybXMgICAgICA9IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUw7Ci0JaWNkLT52ZGV2LT5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDOworCXByaXYtPm5vcm0gPSBWNEwyX1NURF9OVFNDOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgdHc5OTEwX29wcyA9IHsKLQkuc2V0X2J1c19wYXJhbQkJPSB0dzk5MTBfc2V0X2J1c19wYXJhbSwKLQkucXVlcnlfYnVzX3BhcmFtCT0gdHc5OTEwX3F1ZXJ5X2J1c19wYXJhbSwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdHc5OTEwX3N1YmRldl9jb3JlX29wcyA9IHsKIAkuZ19jaGlwX2lkZW50CT0gdHc5OTEwX2dfY2hpcF9pZGVudCwKIAkuc19zdGQJCT0gdHc5OTEwX3Nfc3RkLAorCS5nX3N0ZAkJPSB0dzk5MTBfZ19zdGQsCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogCS5nX3JlZ2lzdGVyCT0gdHc5OTEwX2dfcmVnaXN0ZXIsCiAJLnNfcmVnaXN0ZXIJPSB0dzk5MTBfc19yZWdpc3RlciwKQEAgLTg5OCw2ICs4MjgsNDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0dzk5MTBfZ19tYnVzX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJCXN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHNvY19jYW1lcmFfaTJjX3RvX2xpbmsoY2xpZW50KTsKKworCWNmZy0+ZmxhZ3MgPSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HIHwgVjRMMl9NQlVTX01BU1RFUiB8CisJCVY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSCB8IFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdIIHwgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cgfAorCQlWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSDsKKwljZmctPnR5cGUgPSBWNEwyX01CVVNfUEFSQUxMRUw7CisJY2ZnLT5mbGFncyA9IHNvY19jYW1lcmFfYXBwbHlfYm9hcmRfZmxhZ3MoaWNsLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHc5OTEwX3NfbWJ1c19jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJdTggdmFsID0gVlNTTF9WVkFMSUQgfCBIU1NMX0RWQUxJRDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gc29jX2NhbWVyYV9hcHBseV9ib2FyZF9mbGFncyhpY2wsIGNmZyk7CisKKwkvKgorCSAqIHNldCBPVVRDVFIxCisJICoKKwkgKiBXZSB1c2UgVlZBTElEIGFuZCBEVkFMSUQgc2lnbmFscyB0byBjb250cm9sIFZTWU5DIGFuZCBIU1lOQworCSAqIG91dHB1dHMsIGluIHRoaXMgbW9kZSB0aGVpciBwb2xhcml0eSBpcyBpbnZlcnRlZC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVykKKwkJdmFsIHw9IEhTUF9ISTsKKworCWlmIChmbGFncyAmIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XKQorCQl2YWwgfD0gVlNQX0hJOworCisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBPVVRDVFIxLCB2YWwpOworfQorCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyB0dzk5MTBfc3ViZGV2X3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JPSB0dzk5MTBfc19zdHJlYW0sCiAJLmdfbWJ1c19mbXQJPSB0dzk5MTBfZ19mbXQsCkBAIC05MDUsOCArODc0LDkgQEAKIAkudHJ5X21idXNfZm10CT0gdHc5OTEwX3RyeV9mbXQsCiAJLmNyb3BjYXAJPSB0dzk5MTBfY3JvcGNhcCwKIAkuZ19jcm9wCQk9IHR3OTkxMF9nX2Nyb3AsCi0JLnNfY3JvcAkJPSB0dzk5MTBfc19jcm9wLAogCS5lbnVtX21idXNfZm10CT0gdHc5OTEwX2VudW1fZm10LAorCS5nX21idXNfY29uZmlnCT0gdHc5OTEwX2dfbWJ1c19jb25maWcsCisJLnNfbWJ1c19jb25maWcJPSB0dzk5MTBfc19tYnVzX2NvbmZpZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHR3OTkxMF9zdWJkZXZfb3BzID0gewpAQCAtOTIyLDIzICs4OTIsMTggQEAKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCiAKIHsKLQlzdHJ1Y3QgdHc5OTEwX3ByaXYgICAgICAgICAgICAgKnByaXY7Ci0Jc3RydWN0IHR3OTkxMF92aWRlb19pbmZvICAgICAgICppbmZvOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAgICAgICAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgICAgICAgICAgKmFkYXB0ZXIgPQorCXN0cnVjdCB0dzk5MTBfcHJpdgkJKnByaXY7CisJc3RydWN0IHR3OTkxMF92aWRlb19pbmZvCSppbmZvOworCXN0cnVjdCBpMmNfYWRhcHRlcgkJKmFkYXB0ZXIgPQogCQl0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgICAgICAgICAqaWNsOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsJCSppY2wgPSBzb2NfY2FtZXJhX2kyY190b19saW5rKGNsaWVudCk7CisJaW50CQkJCXJldDsKIAotCWlmICghaWNkKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVFc5OTEwOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOworCWlmICghaWNsIHx8ICFpY2wtPnByaXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJUVzk5MTA6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKLQlpZiAoIWljbCB8fCAhaWNsLT5wcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWluZm8gPSBpY2wtPnByaXY7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKQEAgLTk1NiwxNCArOTIxLDkgQEAKIAogCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJnR3OTkxMF9zdWJkZXZfb3BzKTsKIAotCWljZC0+b3BzICAgICA9ICZ0dzk5MTBfb3BzOwotCWljZC0+aWZhY2UgICA9IGljbC0+YnVzX2lkOwotCi0JcmV0ID0gdHc5OTEwX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50KTsKLQlpZiAocmV0KSB7Ci0JCWljZC0+b3BzID0gTlVMTDsKKwlyZXQgPSB0dzk5MTBfdmlkZW9fcHJvYmUoY2xpZW50KTsKKwlpZiAocmV0KQogCQlrZnJlZShwcml2KTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTcxLDkgKzkzMSw3IEBACiBzdGF0aWMgaW50IHR3OTkxMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpY2QtPm9wcyA9IE5VTEw7CiAJa2ZyZWUocHJpdik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL01ha2VmaWxlCmluZGV4IDMzODcxODcuLmFlYTFlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL01ha2VmaWxlCkBAIC0yLDUgKzIsNSBAQAogCiBvYmotJChDT05GSUdfVklERU9fVVNCVklTSU9OKSArPSB1c2J2aXNpb24ubwogCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY2FyZHMuYwppbmRleCA4ZjUyNjYxLi4zMTAzZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY2FyZHMuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogI2luY2x1ZGUgInVzYnZpc2lvbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKaW5kZXggMTBjMjM2NC4uMjU0ZDMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCkBAIC0xMDE2LDcgKzEwMTYsOCBAQAogCiAJbWVudV9pbmZvID0gJm1hcHBpbmctPm1lbnVfaW5mb1txdWVyeV9tZW51LT5pbmRleF07CiAKLQlpZiAoY3RybC0+aW5mby5mbGFncyAmIFVWQ19DVFJMX0ZMQUdfR0VUX1JFUykgeworCWlmIChtYXBwaW5nLT5kYXRhX3R5cGUgPT0gVVZDX0NUUkxfREFUQV9UWVBFX0JJVE1BU0sgJiYKKwkgICAgKGN0cmwtPmluZm8uZmxhZ3MgJiBVVkNfQ1RSTF9GTEFHX0dFVF9SRVMpKSB7CiAJCXMzMiBiaXRtYXA7CiAKIAkJaWYgKCFjdHJsLT5jYWNoZWQpIHsKQEAgLTEyMjUsNyArMTIyNiw4IEBACiAJCS8qIFZhbGlkIG1lbnUgaW5kaWNlcyBhcmUgcmVwb3J0ZWQgYnkgdGhlIEdFVF9SRVMgcmVxdWVzdCBmb3IKIAkJICogVVZDIGNvbnRyb2xzIHRoYXQgc3VwcG9ydCBpdC4KIAkJICovCi0JCWlmIChjdHJsLT5pbmZvLmZsYWdzICYgVVZDX0NUUkxfRkxBR19HRVRfUkVTKSB7CisJCWlmIChtYXBwaW5nLT5kYXRhX3R5cGUgPT0gVVZDX0NUUkxfREFUQV9UWVBFX0JJVE1BU0sgJiYKKwkJICAgIChjdHJsLT5pbmZvLmZsYWdzICYgVVZDX0NUUkxfRkxBR19HRVRfUkVTKSkgewogCQkJaWYgKCFjdHJsLT5jYWNoZWQpIHsKIAkJCQlyZXQgPSB1dmNfY3RybF9wb3B1bGF0ZV9jYWNoZShjaGFpbiwgY3RybCk7CiAJCQkJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKaW5kZXggZTQxMDBiMS4uNjU2ZDRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwpAQCAtMTE0LDYgKzExNCwxMSBAQAogCQkuZ3VpZAkJPSBVVkNfR1VJRF9GT1JNQVRfUkdCUCwKIAkJLmZjYwkJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAogCX0sCisJeworCQkubmFtZQkJPSAiSC4yNjQiLAorCQkuZ3VpZAkJPSBVVkNfR1VJRF9GT1JNQVRfSDI2NCwKKwkJLmZjYwkJPSBWNEwyX1BJWF9GTVRfSDI2NCwKKwl9LAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzMxLDYgKzIzMzYsMTQgQEAKIAkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAxLAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8JCT0gVVZDX1FVSVJLX1BST0JFX0RFRiB9LAorCS8qIFRoZSBJbWFnaW5nIFNvdXJjZSBVU0IgQ0NEIGNhbWVyYXMgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDE5OWUsCisJICAuaWRQcm9kdWN0CQk9IDB4ODEwMiwKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMsCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwIH0sCiAJLyogQm9kZWxpbiBQcm9TY29wZUhSICovCiAJeyAubWF0Y2hfZmxhZ3MJCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UKIAkJCQl8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWX0hJCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYwppbmRleCBlYTcxZDVmLi5kYWRmMTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAqIFVWQyBpb2N0bHMKICAqLwogc3RhdGljIGludCB1dmNfaW9jdGxfY3RybF9tYXAoc3RydWN0IHV2Y192aWRlb19jaGFpbiAqY2hhaW4sCi0Jc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmcgKnhtYXAsIGludCBvbGQpCisJc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmcgKnhtYXApCiB7CiAJc3RydWN0IHV2Y19jb250cm9sX21hcHBpbmcgKm1hcDsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKQEAgLTU4LDEzICs1OCw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgotCQlpZiAob2xkKSB7Ci0JCQl1dmNfdHJhY2UoVVZDX1RSQUNFX0NPTlRST0wsICJWNEwyX0NUUkxfVFlQRV9NRU5VIG5vdCAiCi0JCQkJICAic3VwcG9ydGVkIGZvciBVVkNJT0NfQ1RSTF9NQVBfT0xELlxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KIAkJc2l6ZSA9IHhtYXAtPm1lbnVfY291bnQgKiBzaXplb2YoKm1hcC0+bWVudV9pbmZvKTsKIAkJbWFwLT5tZW51X2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCQlpZiAobWFwLT5tZW51X2luZm8gPT0gTlVMTCkgewpAQCAtNTM4LDIwICs1MzEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB1dmNfdjRsMl9pb2N0bF93YXJuKHZvaWQpCi17Ci0Jc3RhdGljIGludCB3YXJuZWQ7Ci0KLQlpZiAod2FybmVkKQotCQlyZXR1cm47Ci0KLQl1dmNfcHJpbnRrKEtFUk5fSU5GTywgIkRlcHJlY2F0ZWQgVVZDSU9DX0NUUkxfe0FERCxNQVBfT0xELEdFVCxTRVR9ICIKLQkJICAgImlvY3RscyB3aWxsIGJlIHJlbW92ZWQgaW4gMi42LjQyLlxuIik7Ci0JdXZjX3ByaW50ayhLRVJOX0lORk8sICJTZWUgaHR0cDovL3d3dy5pZGVhc29uYm9hcmQub3JnL3V2Yy91cGdyYWRlLyAiCi0JCSAgICJmb3IgdXBncmFkZSBpbnN0cnVjdGlvbnMuXG4iKTsKLQl3YXJuZWQgPSAxOwotfQotCiBzdGF0aWMgbG9uZyB1dmNfdjRsMl9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwpAQCAtMTAzMiwzNyArMTAxMSw4IEBACiAJCXV2Y190cmFjZShVVkNfVFJBQ0VfSU9DVEwsICJVbnN1cHBvcnRlZCBpb2N0bCAweCUwOHhcbiIsIGNtZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogRHluYW1pYyBjb250cm9scy4gVVZDSU9DX0NUUkxfQURELCBVVkNJT0NfQ1RSTF9NQVBfT0xELAotCSAqIFVWQ0lPQ19DVFJMX0dFVCBhbmQgVVZDSU9DX0NUUkxfU0VUIGFyZSBkZXByZWNhdGVkIGFuZCBzY2hlZHVsZWQgZm9yCi0JICogcmVtb3ZhbCBpbiAyLjYuNDIuCi0JICovCi0JY2FzZSBfX1VWQ0lPQ19DVFJMX0FERDoKLQkJdXZjX3Y0bDJfaW9jdGxfd2FybigpOwotCQlyZXR1cm4gLUVFWElTVDsKLQotCWNhc2UgX19VVkNJT0NfQ1RSTF9NQVBfT0xEOgotCQl1dmNfdjRsMl9pb2N0bF93YXJuKCk7Ci0JY2FzZSBfX1VWQ0lPQ19DVFJMX01BUDoKIAljYXNlIFVWQ0lPQ19DVFJMX01BUDoKLQkJcmV0dXJuIHV2Y19pb2N0bF9jdHJsX21hcChjaGFpbiwgYXJnLAotCQkJCQkgIGNtZCA9PSBfX1VWQ0lPQ19DVFJMX01BUF9PTEQpOwotCi0JY2FzZSBfX1VWQ0lPQ19DVFJMX0dFVDoKLQljYXNlIF9fVVZDSU9DX0NUUkxfU0VUOgotCXsKLQkJc3RydWN0IHV2Y194dV9jb250cm9sICp4Y3RybCA9IGFyZzsKLQkJc3RydWN0IHV2Y194dV9jb250cm9sX3F1ZXJ5IHhxcnkgPSB7Ci0JCQkudW5pdAkJPSB4Y3RybC0+dW5pdCwKLQkJCS5zZWxlY3Rvcgk9IHhjdHJsLT5zZWxlY3RvciwKLQkJCS5xdWVyeQkJPSBjbWQgPT0gX19VVkNJT0NfQ1RSTF9HRVQKLQkJCQkJPyBVVkNfR0VUX0NVUiA6IFVWQ19TRVRfQ1VSLAotCQkJLnNpemUJCT0geGN0cmwtPnNpemUsCi0JCQkuZGF0YQkJPSB4Y3RybC0+ZGF0YSwKLQkJfTsKLQotCQl1dmNfdjRsMl9pb2N0bF93YXJuKCk7Ci0JCXJldHVybiB1dmNfeHVfY3RybF9xdWVyeShjaGFpbiwgJnhxcnkpOwotCX0KKwkJcmV0dXJuIHV2Y19pb2N0bF9jdHJsX21hcChjaGFpbiwgYXJnKTsKIAogCWNhc2UgVVZDSU9DX0NUUkxfUVVFUlk6CiAJCXJldHVybiB1dmNfeHVfY3RybF9xdWVyeShjaGFpbiwgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKaW5kZXggZmZkMTE1OC4uYjAxNWU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3ZpZGVvLmMKQEAgLTc5MCw4ICs3OTAsMTIgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBVVkNfVVJCUzsgKytpKSB7CiAJCWlmIChzdHJlYW0tPnVyYl9idWZmZXJbaV0pIHsKKyNpZm5kZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCQkJdXNiX2ZyZWVfY29oZXJlbnQoc3RyZWFtLT5kZXYtPnVkZXYsIHN0cmVhbS0+dXJiX3NpemUsCiAJCQkJc3RyZWFtLT51cmJfYnVmZmVyW2ldLCBzdHJlYW0tPnVyYl9kbWFbaV0pOworI2Vsc2UKKwkJCWtmcmVlKHN0cmVhbS0+dXJiX2J1ZmZlcltpXSk7CisjZW5kaWYKIAkJCXN0cmVhbS0+dXJiX2J1ZmZlcltpXSA9IE5VTEw7CiAJCX0KIAl9CkBAIC04MzEsOSArODM1LDE0IEBACiAJZm9yICg7IG5wYWNrZXRzID4gMTsgbnBhY2tldHMgLz0gMikgewogCQlmb3IgKGkgPSAwOyBpIDwgVVZDX1VSQlM7ICsraSkgewogCQkJc3RyZWFtLT51cmJfc2l6ZSA9IHBzaXplICogbnBhY2tldHM7CisjaWZuZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKIAkJCXN0cmVhbS0+dXJiX2J1ZmZlcltpXSA9IHVzYl9hbGxvY19jb2hlcmVudCgKIAkJCQlzdHJlYW0tPmRldi0+dWRldiwgc3RyZWFtLT51cmJfc2l6ZSwKIAkJCQlnZnBfZmxhZ3MgfCBfX0dGUF9OT1dBUk4sICZzdHJlYW0tPnVyYl9kbWFbaV0pOworI2Vsc2UKKwkJCXN0cmVhbS0+dXJiX2J1ZmZlcltpXSA9CisJCQkgICAga21hbGxvYyhzdHJlYW0tPnVyYl9zaXplLCBnZnBfZmxhZ3MgfCBfX0dGUF9OT1dBUk4pOworI2VuZGlmCiAJCQlpZiAoIXN0cmVhbS0+dXJiX2J1ZmZlcltpXSkgewogCQkJCXV2Y19mcmVlX3VyYl9idWZmZXJzKHN0cmVhbSk7CiAJCQkJYnJlYWs7CkBAIC05MDgsMTAgKzkxNywxNCBAQAogCQl1cmItPmNvbnRleHQgPSBzdHJlYW07CiAJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShzdHJlYW0tPmRldi0+dWRldiwKIAkJCQllcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKKyNpZm5kZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCXVyYi0+dHJhbnNmZXJfZG1hID0gc3RyZWFtLT51cmJfZG1hW2ldOworI2Vsc2UKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKyNlbmRpZgogCQl1cmItPmludGVydmFsID0gZXAtPmRlc2MuYkludGVydmFsOwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHN0cmVhbS0+dXJiX2J1ZmZlcltpXTsKLQkJdXJiLT50cmFuc2Zlcl9kbWEgPSBzdHJlYW0tPnVyYl9kbWFbaV07CiAJCXVyYi0+Y29tcGxldGUgPSB1dmNfdmlkZW9fY29tcGxldGU7CiAJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBucGFja2V0czsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKQEAgLTk2OSw4ICs5ODIsMTAgQEAKIAkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzdHJlYW0tPmRldi0+dWRldiwgcGlwZSwKIAkJCXN0cmVhbS0+dXJiX2J1ZmZlcltpXSwgc2l6ZSwgdXZjX3ZpZGVvX2NvbXBsZXRlLAogCQkJc3RyZWFtKTsKKyNpZm5kZWYgQ09ORklHX0RNQV9OT05DT0hFUkVOVAogCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJCXVyYi0+dHJhbnNmZXJfZG1hID0gc3RyZWFtLT51cmJfZG1hW2ldOworI2VuZGlmCiAKIAkJc3RyZWFtLT51cmJbaV0gPSB1cmI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKaW5kZXggY2JkZDQ5Yi4uNGMxMzkyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCkBAIC0xLDEwNiArMSwxNiBAQAogI2lmbmRlZiBfVVNCX1ZJREVPX0hfCiAjZGVmaW5lIF9VU0JfVklERU9fSF8KIAorI2lmbmRlZiBfX0tFUk5FTF9fCisjZXJyb3IgIlRoZSB1dmN2aWRlby5oIGhlYWRlciBpcyBkZXByZWNhdGVkLCB1c2UgbGludXgvdXZjdmlkZW8uaCBpbnN0ZWFkLiIKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLQotI2lmbmRlZiBfX0tFUk5FTF9fCi0vKgotICogVGhpcyBoZWFkZXIgcHJvdmlkZXMgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIHByaXZhdGUKLSAqIHV2Y3ZpZGVvIEFQSS4gVGhpcyBBUEkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDIuNi40Mi4KLSAqIEFwcGxpY2F0aW9ucyBzaG91bGQgYmUgcmVjb21waWxlZCBhZ2FpbnN0IHRoZSBwdWJsaWMgbGludXgvdXZjdmlkZW8uaCBoZWFkZXIuCi0gKi8KLSN3YXJuICJUaGUgdXZjdmlkZW8uaCBoZWFkZXIgaXMgZGVwcmVjYXRlZCwgdXNlIGxpbnV4L3V2Y3ZpZGVvLmggaW5zdGVhZC4iCi0KLS8qCi0gKiBEeW5hbWljIGNvbnRyb2xzCi0gKi8KLQotLyogRGF0YSB0eXBlcyBmb3IgVVZDIGNvbnRyb2wgZGF0YSAqLwotI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfUkFXCQkwCi0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9TSUdORUQJMQotI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfVU5TSUdORUQJMgotI2RlZmluZSBVVkNfQ1RSTF9EQVRBX1RZUEVfQk9PTEVBTgkzCi0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9FTlVNCQk0Ci0jZGVmaW5lIFVWQ19DVFJMX0RBVEFfVFlQRV9CSVRNQVNLCTUKLQotLyogQ29udHJvbCBmbGFncyAqLwotI2RlZmluZSBVVkNfQ09OVFJPTF9TRVRfQ1VSCSgxIDw8IDApCi0jZGVmaW5lIFVWQ19DT05UUk9MX0dFVF9DVVIJKDEgPDwgMSkKLSNkZWZpbmUgVVZDX0NPTlRST0xfR0VUX01JTgkoMSA8PCAyKQotI2RlZmluZSBVVkNfQ09OVFJPTF9HRVRfTUFYCSgxIDw8IDMpCi0jZGVmaW5lIFVWQ19DT05UUk9MX0dFVF9SRVMJKDEgPDwgNCkKLSNkZWZpbmUgVVZDX0NPTlRST0xfR0VUX0RFRgkoMSA8PCA1KQotI2RlZmluZSBVVkNfQ09OVFJPTF9SRVNUT1JFCSgxIDw8IDYpCi0jZGVmaW5lIFVWQ19DT05UUk9MX0FVVE9fVVBEQVRFCSgxIDw8IDcpCi0KLSNkZWZpbmUgVVZDX0NPTlRST0xfR0VUX1JBTkdFCShVVkNfQ09OVFJPTF9HRVRfQ1VSIHwgVVZDX0NPTlRST0xfR0VUX01JTiB8IFwKLQkJCQkgVVZDX0NPTlRST0xfR0VUX01BWCB8IFVWQ19DT05UUk9MX0dFVF9SRVMgfCBcCi0JCQkJIFVWQ19DT05UUk9MX0dFVF9ERUYpCi0KLXN0cnVjdCB1dmNfbWVudV9pbmZvIHsKLQlfX3UzMiB2YWx1ZTsKLQlfX3U4IG5hbWVbMzJdOwotfTsKLQotc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmcgewotCV9fdTMyIGlkOwotCV9fdTggbmFtZVszMl07Ci0JX191OCBlbnRpdHlbMTZdOwotCV9fdTggc2VsZWN0b3I7Ci0KLQlfX3U4IHNpemU7Ci0JX191OCBvZmZzZXQ7Ci0JX191MzIgdjRsMl90eXBlOwotCV9fdTMyIGRhdGFfdHlwZTsKLQotCXN0cnVjdCB1dmNfbWVudV9pbmZvIF9fdXNlciAqbWVudV9pbmZvOwotCV9fdTMyIG1lbnVfY291bnQ7Ci0KLQlfX3UzMiByZXNlcnZlZFs0XTsKLX07Ci0KLSNlbmRpZgotCi1zdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfaW5mbyB7Ci0JX191OCBlbnRpdHlbMTZdOwotCV9fdTggaW5kZXg7Ci0JX191OCBzZWxlY3RvcjsKLQlfX3UxNiBzaXplOwotCV9fdTMyIGZsYWdzOwotfTsKLQotc3RydWN0IHV2Y194dV9jb250cm9sX21hcHBpbmdfb2xkIHsKLQlfX3U4IHJlc2VydmVkWzY0XTsKLX07Ci0KLXN0cnVjdCB1dmNfeHVfY29udHJvbCB7Ci0JX191OCB1bml0OwotCV9fdTggc2VsZWN0b3I7Ci0JX191MTYgc2l6ZTsKLQlfX3U4IF9fdXNlciAqZGF0YTsKLX07Ci0KLSNpZm5kZWYgX19LRVJORUxfXwotI2RlZmluZSBVVkNJT0NfQ1RSTF9BREQJCV9JT1coJ1UnLCAxLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfaW5mbykKLSNkZWZpbmUgVVZDSU9DX0NUUkxfTUFQX09MRAlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nX29sZCkKLSNkZWZpbmUgVVZDSU9DX0NUUkxfTUFQCQlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nKQotI2RlZmluZSBVVkNJT0NfQ1RSTF9HRVQJCV9JT1dSKCdVJywgMywgc3RydWN0IHV2Y194dV9jb250cm9sKQotI2RlZmluZSBVVkNJT0NfQ1RSTF9TRVQJCV9JT1coJ1UnLCA0LCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wpCi0jZWxzZQotI2RlZmluZSBfX1VWQ0lPQ19DVFJMX0FERAlfSU9XKCdVJywgMSwgc3RydWN0IHV2Y194dV9jb250cm9sX2luZm8pCi0jZGVmaW5lIF9fVVZDSU9DX0NUUkxfTUFQX09MRAlfSU9XUignVScsIDIsIHN0cnVjdCB1dmNfeHVfY29udHJvbF9tYXBwaW5nX29sZCkKLSNkZWZpbmUgX19VVkNJT0NfQ1RSTF9NQVAJX0lPV1IoJ1UnLCAyLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2xfbWFwcGluZykKLSNkZWZpbmUgX19VVkNJT0NfQ1RSTF9HRVQJX0lPV1IoJ1UnLCAzLCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wpCi0jZGVmaW5lIF9fVVZDSU9DX0NUUkxfU0VUCV9JT1coJ1UnLCA0LCBzdHJ1Y3QgdXZjX3h1X2NvbnRyb2wpCi0jZW5kaWYKLQotI2lmZGVmIF9fS0VSTkVMX18KLQogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvdmlkZW8uaD4KICNpbmNsdWRlIDxsaW51eC91dmN2aWRlby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKQEAgLTE3OSw2ICs4OSwxMCBAQAogCXsgJ00nLCAgJzQnLCAgJzInLCAgJzAnLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCBcCiAJIDB4ODAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MzgsIDB4OWIsIDB4NzF9CiAKKyNkZWZpbmUgVVZDX0dVSURfRk9STUFUX0gyNjQgXAorCXsgJ0gnLCAgJzInLCAgJzYnLCAgJzQnLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCBcCisJIDB4ODAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MzgsIDB4OWIsIDB4NzF9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRHJpdmVyIHNwZWNpZmljIGNvbnN0YW50cy4KICAqLwpAQCAtNjk4LDYgKzYxMiw0IEBACiB2b2lkIHV2Y192aWRlb19kZWNvZGVfaXNpZ2h0KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHV2Y19zdHJlYW1pbmcgKnN0cmVhbSwKIAkJc3RydWN0IHV2Y19idWZmZXIgKmJ1Zik7CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYwppbmRleCA2MTk3OWI3Li5jNjg1MzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYwpAQCAtMTU5LDExICsxNTksMjUgQEAKIAl9IGZtdDsKIH07CiAKLXN0YXRpYyBpbnQgZ2V0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKKy8qKgorICogc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMzMiAtIFZJRElPQ19DUkVBVEVfQlVGUzMyIGFyZ3VtZW50CisgKiBAaW5kZXg6CW9uIHJldHVybiwgaW5kZXggb2YgdGhlIGZpcnN0IGNyZWF0ZWQgYnVmZmVyCisgKiBAY291bnQ6CWVudHJ5OiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMsCisgKgkJcmV0dXJuOiBudW1iZXIgb2YgY3JlYXRlZCBidWZmZXJzCisgKiBAbWVtb3J5OglidWZmZXIgbWVtb3J5IHR5cGUKKyAqIEBmb3JtYXQ6CWZyYW1lIGZvcm1hdCwgZm9yIHdoaWNoIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZAorICogQHJlc2VydmVkOglmdXR1cmUgZXh0ZW5zaW9ucworICovCitzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTMyCQkJY291bnQ7CisJZW51bSB2NGwyX21lbW9yeSAgICAgICAgbWVtb3J5OworCXN0cnVjdCB2NGwyX2Zvcm1hdDMyCWZvcm1hdDsKKwlfX3UzMgkJCXJlc2VydmVkWzhdOworfTsKKworc3RhdGljIGludCBfX2dldF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCiB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAotCQkJZ2V0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKIAlzd2l0Y2ggKGtwLT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKQEAgLTE5MiwxMSArMjA2LDI0IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHB1dF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCitzdGF0aWMgaW50IGdldF92NGwyX2Zvcm1hdDMyKHN0cnVjdCB2NGwyX2Zvcm1hdCAqa3AsIHN0cnVjdCB2NGwyX2Zvcm1hdDMyIF9fdXNlciAqdXApCiB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdDMyKSkgfHwKLQkJcHV0X3VzZXIoa3AtPnR5cGUsICZ1cC0+dHlwZSkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdDMyKSkgfHwKKwkJCWdldF91c2VyKGtwLT50eXBlLCAmdXAtPnR5cGUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIF9fZ2V0X3Y0bDJfZm9ybWF0MzIoa3AsIHVwKTsKK30KKworc3RhdGljIGludCBnZXRfdjRsMl9jcmVhdGUzMihzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAqa3AsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyKSkgfHwKKwkgICAgY29weV9mcm9tX3VzZXIoa3AsIHVwLCBvZmZzZXRvZihzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyLCBmb3JtYXQuZm10KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gX19nZXRfdjRsMl9mb3JtYXQzMigma3AtPmZvcm1hdCwgJnVwLT5mb3JtYXQpOworfQorCitzdGF0aWMgaW50IF9fcHV0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKK3sKIAlzd2l0Y2ggKGtwLT50eXBlKSB7CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CiAJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKQEAgLTIyNSw2ICsyNTIsMjIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgcHV0X3Y0bDJfZm9ybWF0MzIoc3RydWN0IHY0bDJfZm9ybWF0ICprcCwgc3RydWN0IHY0bDJfZm9ybWF0MzIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0MzIpKSB8fAorCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIF9fcHV0X3Y0bDJfZm9ybWF0MzIoa3AsIHVwKTsKK30KKworc3RhdGljIGludCBwdXRfdjRsMl9jcmVhdGUzMihzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAqa3AsIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIgX191c2VyICp1cCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVwLCBzaXplb2Yoc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMzMikpIHx8CisJICAgIGNvcHlfdG9fdXNlcih1cCwga3AsIG9mZnNldG9mKHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzMzIsIGZvcm1hdC5mbXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBfX3B1dF92NGwyX2Zvcm1hdDMyKCZrcC0+Zm9ybWF0LCAmdXAtPmZvcm1hdCk7Cit9CisKIHN0cnVjdCB2NGwyX3N0YW5kYXJkMzIgewogCV9fdTMyCQkgICAgIGluZGV4OwogCV9fdTMyCQkgICAgIGlkWzJdOyAvKiBfX3U2NCB3b3VsZCBnZXQgdGhlIGFsaWdubWVudCB3cm9uZyAqLwpAQCAtNzAyLDYgKzc0NSw4IEBACiAjZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUzMyICAgIF9JT1dSKCdWJywgNzIsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyKQogI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUzMyICBfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikKICNkZWZpbmUJVklESU9DX0RRRVZFTlQzMglfSU9SICgnVicsIDg5LCBzdHJ1Y3QgdjRsMl9ldmVudDMyKQorI2RlZmluZSBWSURJT0NfQ1JFQVRFX0JVRlMzMglfSU9XUignVicsIDkyLCBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVyczMyKQorI2RlZmluZSBWSURJT0NfUFJFUEFSRV9CVUYzMglfSU9XUignVicsIDkzLCBzdHJ1Y3QgdjRsMl9idWZmZXIzMikKIAogI2RlZmluZSBWSURJT0NfT1ZFUkxBWTMyCV9JT1cgKCdWJywgMTQsIHMzMikKICNkZWZpbmUgVklESU9DX1NUUkVBTU9OMzIJX0lPVyAoJ1YnLCAxOCwgczMyKQpAQCAtNzIxLDYgKzc2Niw3IEBACiAJCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHYyczsKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIHYyZWNzOwogCQlzdHJ1Y3QgdjRsMl9ldmVudCB2MmV2OworCQlzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyB2MmNydDsKIAkJdW5zaWduZWQgbG9uZyB2eDsKIAkJaW50IHZpOwogCX0ga2FyZzsKQEAgLTc1MSw2ICs3OTcsOCBAQAogCWNhc2UgVklESU9DX1NfSU5QVVQzMjogY21kID0gVklESU9DX1NfSU5QVVQ7IGJyZWFrOwogCWNhc2UgVklESU9DX0dfT1VUUFVUMzI6IGNtZCA9IFZJRElPQ19HX09VVFBVVDsgYnJlYWs7CiAJY2FzZSBWSURJT0NfU19PVVRQVVQzMjogY21kID0gVklESU9DX1NfT1VUUFVUOyBicmVhazsKKwljYXNlIFZJRElPQ19DUkVBVEVfQlVGUzMyOiBjbWQgPSBWSURJT0NfQ1JFQVRFX0JVRlM7IGJyZWFrOworCWNhc2UgVklESU9DX1BSRVBBUkVfQlVGMzI6IGNtZCA9IFZJRElPQ19QUkVQQVJFX0JVRjsgYnJlYWs7CiAJfQogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTc3NSw2ICs4MjMsMTIgQEAKIAkJY29tcGF0aWJsZV9hcmcgPSAwOwogCQlicmVhazsKIAorCWNhc2UgVklESU9DX0NSRUFURV9CVUZTOgorCQllcnIgPSBnZXRfdjRsMl9jcmVhdGUzMigma2FyZy52MmNydCwgdXApOworCQljb21wYXRpYmxlX2FyZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfUFJFUEFSRV9CVUY6CiAJY2FzZSBWSURJT0NfUVVFUllCVUY6CiAJY2FzZSBWSURJT0NfUUJVRjoKIAljYXNlIFZJRElPQ19EUUJVRjoKQEAgLTg2MCw2ICs5MTQsMTAgQEAKIAkJZXJyID0gcHV0X3Y0bDJfZm9ybWF0MzIoJmthcmcudjJmLCB1cCk7CiAJCWJyZWFrOwogCisJY2FzZSBWSURJT0NfQ1JFQVRFX0JVRlM6CisJCWVyciA9IHB1dF92NGwyX2NyZWF0ZTMyKCZrYXJnLnYyY3J0LCB1cCk7CisJCWJyZWFrOworCiAJY2FzZSBWSURJT0NfUVVFUllCVUY6CiAJY2FzZSBWSURJT0NfUUJVRjoKIAljYXNlIFZJRElPQ19EUUJVRjoKQEAgLTk1OSw2ICsxMDE3LDggQEAKIAljYXNlIFZJRElPQ19EUUVWRU5UMzI6CiAJY2FzZSBWSURJT0NfU1VCU0NSSUJFX0VWRU5UOgogCWNhc2UgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UOgorCWNhc2UgVklESU9DX0NSRUFURV9CVUZTMzI6CisJY2FzZSBWSURJT0NfUFJFUEFSRV9CVUYzMjoKIAkJcmV0ID0gZG9fdmlkZW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWN0cmxzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwppbmRleCAwNmI2MDE0Li4wZjQxNWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgpAQCAtNDMsNyArNDQsNyBAQAogfTsKIAogLyogU21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgYXV0b2NsdXN0ZXIgaXMgc2V0IHRvIG1hbnVhbAotICAgbW9kZS4gSW4gdGhhdCBjYXNlIHRoZSBpc192b2xhdGlsZSBmbGFnIHNob3VsZCBiZSBpZ25vcmVkLiAqLworICAgbW9kZS4gKi8KIHN0YXRpYyBib29sIGlzX2N1cl9tYW51YWwoY29uc3Qgc3RydWN0IHY0bDJfY3RybCAqbWFzdGVyKQogewogCXJldHVybiBtYXN0ZXItPmlzX2F1dG8gJiYgbWFzdGVyLT5jdXIudmFsID09IG1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWU7CkBAIC0yMTAsNiArMjExLDcgQEAKIAkJIkRpc2FibGVkIiwKIAkJIjUwIEh6IiwKIAkJIjYwIEh6IiwKKwkJIkF1dG8iLAogCQlOVUxMCiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbWVyYV9leHBvc3VyZV9hdXRvW10gPSB7CkBAIC04MTksOCArODIxLDggQEAKIAlmaWxsX2V2ZW50KCZldiwgY3RybCwgY2hhbmdlcyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNldiwgJmN0cmwtPmV2X3N1YnMsIG5vZGUpCi0JCWlmIChzZXYtPmZoICYmIChzZXYtPmZoICE9IGZoIHx8Ci0JCQkJKHNldi0+ZmxhZ3MgJiBWNEwyX0VWRU5UX1NVQl9GTF9BTExPV19GRUVEQkFDSykpKQorCQlpZiAoc2V2LT5maCAhPSBmaCB8fAorCQkgICAgKHNldi0+ZmxhZ3MgJiBWNEwyX0VWRU5UX1NVQl9GTF9BTExPV19GRUVEQkFDSykpCiAJCQl2NGwyX2V2ZW50X3F1ZXVlX2ZoKHNldi0+ZmgsICZldik7CiB9CiAKQEAgLTkzNyw5ICs5MzksMTUgQEAKIAkJYnJlYWs7CiAJfQogCWlmICh1cGRhdGVfaW5hY3RpdmUpIHsKLQkJY3RybC0+ZmxhZ3MgJj0gflY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOwotCQlpZiAoIWlzX2N1cl9tYW51YWwoY3RybC0+Y2x1c3RlclswXSkpCisJCS8qIE5vdGU6IHVwZGF0ZV9pbmFjdGl2ZSBjYW4gb25seSBiZSB0cnVlIGZvciBhdXRvIGNsdXN0ZXJzLiAqLworCQljdHJsLT5mbGFncyAmPQorCQkJfihWNEwyX0NUUkxfRkxBR19JTkFDVElWRSB8IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFKTsKKwkJaWYgKCFpc19jdXJfbWFudWFsKGN0cmwtPmNsdXN0ZXJbMF0pKSB7CiAJCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJCWlmIChjdHJsLT5jbHVzdGVyWzBdLT5oYXNfdm9sYXRpbGVzKQorCQkJCWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFOworCQl9CisJCWZoID0gTlVMTDsKIAl9CiAJaWYgKGNoYW5nZWQgfHwgdXBkYXRlX2luYWN0aXZlKSB7CiAJCS8qIElmIGEgY29udHJvbCB3YXMgY2hhbmdlZCB0aGF0IHdhcyBub3Qgb25lIG9mIHRoZSBjb250cm9scwpAQCAtMTM5NCwxMCArMTQwMiw4IEBACiAJCQl0eXBlLCBtaW4sIG1heCwKIAkJCWlzX21lbnUgPyBjZmctPm1lbnVfc2tpcF9tYXNrIDogc3RlcCwKIAkJCWRlZiwgZmxhZ3MsIHFtZW51LCBwcml2KTsKLQlpZiAoY3RybCkgeworCWlmIChjdHJsKQogCQljdHJsLT5pc19wcml2YXRlID0gY2ZnLT5pc19wcml2YXRlOwotCQljdHJsLT5pc192b2xhdGlsZSA9IGNmZy0+aXNfdm9sYXRpbGU7Ci0JfQogCXJldHVybiBjdHJsOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfbmV3X2N1c3RvbSk7CkBAIC0xNDkxLDYgKzE0OTcsNyBAQAogLyogQ2x1c3RlciBjb250cm9scyAqLwogdm9pZCB2NGwyX2N0cmxfY2x1c3Rlcih1bnNpZ25lZCBuY29udHJvbHMsIHN0cnVjdCB2NGwyX2N0cmwgKipjb250cm9scykKIHsKKwlib29sIGhhc192b2xhdGlsZXMgPSBmYWxzZTsKIAlpbnQgaTsKIAogCS8qIFRoZSBmaXJzdCBjb250cm9sIGlzIHRoZSBtYXN0ZXIgY29udHJvbCBhbmQgaXQgbXVzdCBub3QgYmUgTlVMTCAqLwpAQCAtMTUwMCw4ICsxNTA3LDExIEBACiAJCWlmIChjb250cm9sc1tpXSkgewogCQkJY29udHJvbHNbaV0tPmNsdXN0ZXIgPSBjb250cm9sczsKIAkJCWNvbnRyb2xzW2ldLT5uY29udHJvbHMgPSBuY29udHJvbHM7CisJCQlpZiAoY29udHJvbHNbaV0tPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpCisJCQkJaGFzX3ZvbGF0aWxlcyA9IHRydWU7CiAJCX0KIAl9CisJY29udHJvbHNbMF0tPmhhc192b2xhdGlsZXMgPSBoYXNfdm9sYXRpbGVzOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfY2x1c3Rlcik7CiAKQEAgLTE1MDksMjIgKzE1MTksMjUgQEAKIAkJCSAgICB1OCBtYW51YWxfdmFsLCBib29sIHNldF92b2xhdGlsZSkKIHsKIAlzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIgPSBjb250cm9sc1swXTsKLQl1MzIgZmxhZzsKKwl1MzIgZmxhZyA9IDA7CiAJaW50IGk7CiAKIAl2NGwyX2N0cmxfY2x1c3RlcihuY29udHJvbHMsIGNvbnRyb2xzKTsKIAlXQVJOX09OKG5jb250cm9scyA8PSAxKTsKIAlXQVJOX09OKG1hbnVhbF92YWwgPCBtYXN0ZXItPm1pbmltdW0gfHwgbWFudWFsX3ZhbCA+IG1hc3Rlci0+bWF4aW11bSk7CisJV0FSTl9PTihzZXRfdm9sYXRpbGUgJiYgIWhhc19vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCkpOwogCW1hc3Rlci0+aXNfYXV0byA9IHRydWU7CisJbWFzdGVyLT5oYXNfdm9sYXRpbGVzID0gc2V0X3ZvbGF0aWxlOwogCW1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWUgPSBtYW51YWxfdmFsOwogCW1hc3Rlci0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOwotCWZsYWcgPSBpc19jdXJfbWFudWFsKG1hc3RlcikgPyAwIDogVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisKKwlpZiAoIWlzX2N1cl9tYW51YWwobWFzdGVyKSkKKwkJZmxhZyA9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIHwKKwkJCShzZXRfdm9sYXRpbGUgPyBWNEwyX0NUUkxfRkxBR19WT0xBVElMRSA6IDApOwogCiAJZm9yIChpID0gMTsgaSA8IG5jb250cm9sczsgaSsrKQotCQlpZiAoY29udHJvbHNbaV0pIHsKLQkJCWNvbnRyb2xzW2ldLT5pc192b2xhdGlsZSA9IHNldF92b2xhdGlsZTsKKwkJaWYgKGNvbnRyb2xzW2ldKQogCQkJY29udHJvbHNbaV0tPmZsYWdzIHw9IGZsYWc7Ci0JCX0KIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2F1dG9fY2x1c3Rlcik7CiAKQEAgLTE1NzksOSArMTU5Miw2IEBACiBzdGF0aWMgdm9pZCBsb2dfY3RybChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAogCQkgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqY29sb24pCiB7Ci0JaW50IGZsX2luYWN0ID0gY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKLQlpbnQgZmxfZ3JhYmJlZCA9IGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRDsKLQogCWlmIChjdHJsLT5mbGFncyAmIChWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCB8IFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09OTFkpKQogCQlyZXR1cm47CiAJaWYgKGN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUykKQEAgLTE2MTIsMTQgKzE2MjIsMTcgQEAKIAkJcHJpbnRrKEtFUk5fQ09OVCAidW5rbm93biB0eXBlICVkIiwgY3RybC0+dHlwZSk7CiAJCWJyZWFrOwogCX0KLQlpZiAoZmxfaW5hY3QgJiYgZmxfZ3JhYmJlZCkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiIChpbmFjdGl2ZSwgZ3JhYmJlZClcbiIpOwotCWVsc2UgaWYgKGZsX2luYWN0KQotCQlwcmludGsoS0VSTl9DT05UICIgKGluYWN0aXZlKVxuIik7Ci0JZWxzZSBpZiAoZmxfZ3JhYmJlZCkKLQkJcHJpbnRrKEtFUk5fQ09OVCAiIChncmFiYmVkKVxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCWlmIChjdHJsLT5mbGFncyAmIChWNEwyX0NUUkxfRkxBR19JTkFDVElWRSB8CisJCQkgICBWNEwyX0NUUkxfRkxBR19HUkFCQkVEIHwKKwkJCSAgIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFKSkgeworCQlpZiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19JTkFDVElWRSkKKwkJCXByaW50ayhLRVJOX0NPTlQgIiBpbmFjdGl2ZSIpOworCQlpZiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiIGdyYWJiZWQiKTsKKwkJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfVk9MQVRJTEUpCisJCQlwcmludGsoS0VSTl9DT05UICIgdm9sYXRpbGUiKTsKKwl9CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIH0KIAogLyogTG9nIGFsbCBjb250cm9scyBvd25lZCBieSB0aGUgaGFuZGxlciAqLwpAQCAtMTk1OSw3ICsxOTcyLDggQEAKIAkJdjRsMl9jdHJsX2xvY2sobWFzdGVyKTsKIAogCQkvKiBnX3ZvbGF0aWxlX2N0cmwgd2lsbCB1cGRhdGUgdGhlIG5ldyBjb250cm9sIHZhbHVlcyAqLwotCQlpZiAoaGFzX29wKG1hc3RlciwgZ192b2xhdGlsZV9jdHJsKSAmJiAhaXNfY3VyX21hbnVhbChtYXN0ZXIpKSB7CisJCWlmICgobWFzdGVyLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFKSB8fAorCQkJKG1hc3Rlci0+aGFzX3ZvbGF0aWxlcyAmJiAhaXNfY3VyX21hbnVhbChtYXN0ZXIpKSkgewogCQkJZm9yIChqID0gMDsgaiA8IG1hc3Rlci0+bmNvbnRyb2xzOyBqKyspCiAJCQkJY3VyX3RvX25ldyhtYXN0ZXItPmNsdXN0ZXJbal0pOwogCQkJcmV0ID0gY2FsbF9vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCk7CkBAIC0yMDA0LDcgKzIwMTgsNyBAQAogCiAJdjRsMl9jdHJsX2xvY2sobWFzdGVyKTsKIAkvKiBnX3ZvbGF0aWxlX2N0cmwgd2lsbCB1cGRhdGUgdGhlIGN1cnJlbnQgY29udHJvbCB2YWx1ZXMgKi8KLQlpZiAoY3RybC0+aXNfdm9sYXRpbGUgJiYgIWlzX2N1cl9tYW51YWwobWFzdGVyKSkgeworCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKQogCQkJY3VyX3RvX25ldyhtYXN0ZXItPmNsdXN0ZXJbaV0pOwogCQlyZXQgPSBjYWxsX29wKG1hc3RlciwgZ192b2xhdGlsZV9jdHJsKTsKQEAgLTIxMjAsNiArMjEzNCwyMCBAQAogCXJldHVybiAwOwogfQogCisvKiBPYnRhaW4gdGhlIGN1cnJlbnQgdm9sYXRpbGUgdmFsdWVzIG9mIGFuIGF1dG9jbHVzdGVyIGFuZCBtYXJrIHRoZW0KKyAgIGFzIG5ldy4gKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9mcm9tX2F1dG9fY2x1c3RlcihzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykKKwkJY3VyX3RvX25ldyhtYXN0ZXItPmNsdXN0ZXJbaV0pOworCWlmICghY2FsbF9vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCkpCisJCWZvciAoaSA9IDE7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKQorCQkJaWYgKG1hc3Rlci0+Y2x1c3RlcltpXSkKKwkJCQltYXN0ZXItPmNsdXN0ZXJbaV0tPmlzX25ldyA9IDE7Cit9CisKIC8qIFRyeSBvciB0cnktYW5kLXNldCBjb250cm9scyAqLwogc3RhdGljIGludCB0cnlfc2V0X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmNzLApAQCAtMjE2NSw2ICsyMTkzLDMxIEBACiAJCQlpZiAobWFzdGVyLT5jbHVzdGVyW2pdKQogCQkJCW1hc3Rlci0+Y2x1c3RlcltqXS0+aXNfbmV3ID0gMDsKIAorCQkvKiBGb3Igdm9sYXRpbGUgYXV0b2NsdXN0ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBpbiBhdXRvIG1vZGUKKwkJICAgd2UgbmVlZCB0byBkaXNjb3ZlciBpZiBpdCB3aWxsIGJlIHNldCB0byBtYW51YWwgbW9kZS4KKwkJICAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBjb3B5IHRoZSBjdXJyZW50IHZvbGF0aWxlIHZhbHVlcworCQkgICBmaXJzdCBzaW5jZSB0aG9zZSB3aWxsIGJlY29tZSB0aGUgbmV3IG1hbnVhbCB2YWx1ZXMgKHdoaWNoCisJCSAgIG1heSBiZSBvdmVyd3JpdHRlbiBieSBleHBsaWNpdCBuZXcgdmFsdWVzIGZyb20gdGhpcyBzZXQKKwkJICAgb2YgY29udHJvbHMpLiAqLworCQlpZiAobWFzdGVyLT5pc19hdXRvICYmIG1hc3Rlci0+aGFzX3ZvbGF0aWxlcyAmJgorCQkJCQkJIWlzX2N1cl9tYW51YWwobWFzdGVyKSkgeworCQkJLyogUGljayBhbiBpbml0aWFsIG5vbi1tYW51YWwgdmFsdWUgKi8KKwkJCXMzMiBuZXdfYXV0b192YWwgPSBtYXN0ZXItPm1hbnVhbF9tb2RlX3ZhbHVlICsgMTsKKwkJCXUzMiB0bXBfaWR4ID0gaWR4OworCisJCQlkbyB7CisJCQkJLyogQ2hlY2sgaWYgdGhlIGF1dG8gY29udHJvbCBpcyBwYXJ0IG9mIHRoZQorCQkJCSAgIGxpc3QsIGFuZCByZW1lbWJlciB0aGUgbmV3IHZhbHVlLiAqLworCQkJCWlmIChoZWxwZXJzW3RtcF9pZHhdLmN0cmwgPT0gbWFzdGVyKQorCQkJCQluZXdfYXV0b192YWwgPSBjcy0+Y29udHJvbHNbdG1wX2lkeF0udmFsdWU7CisJCQkJdG1wX2lkeCA9IGhlbHBlcnNbdG1wX2lkeF0ubmV4dDsKKwkJCX0gd2hpbGUgKHRtcF9pZHgpOworCQkJLyogSWYgdGhlIG5ldyB2YWx1ZSA9PSB0aGUgbWFudWFsIHZhbHVlLCB0aGVuIGNvcHkKKwkJCSAgIHRoZSBjdXJyZW50IHZvbGF0aWxlIHZhbHVlcy4gKi8KKwkJCWlmIChuZXdfYXV0b192YWwgPT0gbWFzdGVyLT5tYW51YWxfbW9kZV92YWx1ZSkKKwkJCQl1cGRhdGVfZnJvbV9hdXRvX2NsdXN0ZXIobWFzdGVyKTsKKwkJfQorCiAJCS8qIENvcHkgdGhlIG5ldyBjYWxsZXItc3VwcGxpZWQgY29udHJvbCB2YWx1ZXMuCiAJCSAgIHVzZXJfdG9fbmV3KCkgc2V0cyAnaXNfbmV3JyB0byAxLiAqLwogCQlkbyB7CkBAIC0yMjM1LDYgKzIyODgsMTIgQEAKIAkJaWYgKG1hc3Rlci0+Y2x1c3RlcltpXSkKIAkJCW1hc3Rlci0+Y2x1c3RlcltpXS0+aXNfbmV3ID0gMDsKIAorCS8qIEZvciBhdXRvY2x1c3RlcnMgd2l0aCB2b2xhdGlsZXMgdGhhdCBhcmUgc3dpdGNoZWQgZnJvbSBhdXRvIHRvCisJICAgbWFudWFsIG1vZGUgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGN1cnJlbnQgdm9sYXRpbGUgdmFsdWVzIHNpbmNlCisJICAgdGhvc2Ugd2lsbCBiZWNvbWUgdGhlIGluaXRpYWwgbWFudWFsIHZhbHVlcyBhZnRlciBzdWNoIGEgc3dpdGNoLiAqLworCWlmIChtYXN0ZXItPmlzX2F1dG8gJiYgbWFzdGVyLT5oYXNfdm9sYXRpbGVzICYmIGN0cmwgPT0gbWFzdGVyICYmCisJICAgICFpc19jdXJfbWFudWFsKG1hc3RlcikgJiYgKnZhbCA9PSBtYXN0ZXItPm1hbnVhbF9tb2RlX3ZhbHVlKQorCQl1cGRhdGVfZnJvbV9hdXRvX2NsdXN0ZXIobWFzdGVyKTsKIAljdHJsLT52YWwgPSAqdmFsOwogCWN0cmwtPmlzX25ldyA9IDE7CiAJcmV0ID0gdHJ5X29yX3NldF9jbHVzdGVyKGZoLCBtYXN0ZXIsIHRydWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCmluZGV4IGU2YTJjM2IuLjBlZGQ2MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKQEAgLTIwLDcgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfU1BJKQogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNlbmRpZgpAQCAtMTkzLDYgKzE5NSwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KTsKIAorc3RhdGljIHZvaWQgdjRsMl9kZXZpY2VfcmVsZWFzZV9zdWJkZXZfbm9kZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlzZC0+ZGV2bm9kZSA9IE5VTEw7CisJa2ZyZWUodmRldik7Cit9CisKIGludCB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXZfbm9kZXMoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OwpAQCAtMjA2LDIyICsyMTUsNDAgQEAKIAkJaWYgKCEoc2QtPmZsYWdzICYgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUpKQogCQkJY29udGludWU7CiAKLQkJdmRldiA9ICZzZC0+ZGV2bm9kZTsKKwkJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKCp2ZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmRldikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKworCQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZGV2LCBzZCk7CiAJCXN0cmxjcHkodmRldi0+bmFtZSwgc2QtPm5hbWUsIHNpemVvZih2ZGV2LT5uYW1lKSk7CiAJCXZkZXYtPnY0bDJfZGV2ID0gdjRsMl9kZXY7CiAJCXZkZXYtPmZvcHMgPSAmdjRsMl9zdWJkZXZfZm9wczsKLQkJdmRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5OworCQl2ZGV2LT5yZWxlYXNlID0gdjRsMl9kZXZpY2VfcmVsZWFzZV9zdWJkZXZfbm9kZTsKIAkJdmRldi0+Y3RybF9oYW5kbGVyID0gc2QtPmN0cmxfaGFuZGxlcjsKIAkJZXJyID0gX192aWRlb19yZWdpc3Rlcl9kZXZpY2UodmRldiwgVkZMX1RZUEVfU1VCREVWLCAtMSwgMSwKIAkJCQkJICAgICAgc2QtPm93bmVyKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUodmRldik7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CiAjaWYgZGVmaW5lZChDT05GSUdfTUVESUFfQ09OVFJPTExFUikKIAkJc2QtPmVudGl0eS52NGwubWFqb3IgPSBWSURFT19NQUpPUjsKIAkJc2QtPmVudGl0eS52NGwubWlub3IgPSB2ZGV2LT5taW5vcjsKICNlbmRpZgorCQlzZC0+ZGV2bm9kZSA9IHZkZXY7CiAJfQogCXJldHVybiAwOworCitjbGVhbl91cDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkLCAmdjRsMl9kZXYtPnN1YmRldnMsIGxpc3QpIHsKKwkJaWYgKCFzZC0+ZGV2bm9kZSkKKwkJCWJyZWFrOworCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzZC0+ZGV2bm9kZSk7CisJfQorCisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldl9ub2Rlcyk7CiAKQEAgLTI0Nyw3ICsyNzQsNyBAQAogCWlmICh2NGwyX2Rldi0+bWRldikKIAkJbWVkaWFfZGV2aWNlX3VucmVnaXN0ZXJfZW50aXR5KCZzZC0+ZW50aXR5KTsKICNlbmRpZgotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZzZC0+ZGV2bm9kZSk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc2QtPmRldm5vZGUpOwogCW1vZHVsZV9wdXQoc2QtPm93bmVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1ldmVudC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMKaW5kZXggNTNiMTkwYy4uYzI2YWQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2V2X3Bvcyhjb25zdCBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYsIHVuc2lnbmVkIGlkeCkKIHsKQEAgLTIxNSw2ICsyMTYsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaTsKIAorCWlmIChzdWItPnR5cGUgPT0gVjRMMl9FVkVOVF9BTEwpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGVsZW1zIDwgMSkKIAkJZWxlbXMgPSAxOwogCWlmIChzdWItPnR5cGUgPT0gVjRMMl9FVkVOVF9DVFJMKSB7CkBAIC0yODIsNiArMjg2LDcgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKIAogCWlmIChzdWItPnR5cGUgPT0gVjRMMl9FVkVOVF9BTEwpIHsKIAkJdjRsMl9ldmVudF91bnN1YnNjcmliZV9hbGwoZmgpOwpAQCAtMjkyLDggKzI5NywxMiBAQAogCiAJc2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBzdWItPnR5cGUsIHN1Yi0+aWQpOwogCWlmIChzZXYgIT0gTlVMTCkgeworCQkvKiBSZW1vdmUgYW55IHBlbmRpbmcgZXZlbnRzIGZvciB0aGlzIHN1YnNjcmlwdGlvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2V2LT5pbl91c2U7IGkrKykgeworCQkJbGlzdF9kZWwoJnNldi0+ZXZlbnRzW3Nldl9wb3Moc2V2LCBpKV0ubGlzdCk7CisJCQlmaC0+bmF2YWlsYWJsZS0tOworCQl9CiAJCWxpc3RfZGVsKCZzZXYtPmxpc3QpOwotCQlzZXYtPmZoID0gTlVMTDsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWZoLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwppbmRleCAxMjI4MjJkLi45ZTNmYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1maC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pbnQtZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW50LWRldmljZS5jCmluZGV4IGE5MzViYWUuLmY0NDczNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1pbnQtZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWludC1kZXZpY2UuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWludC1kZXZpY2UuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwppbmRleCAwMDJjZTEzLi5lMWRhOGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtNTUsNiArNTUsMTkgQEAKIAltZW1zZXQoKHU4ICopKHApICsgb2Zmc2V0b2YodHlwZW9mKCoocCkpLCBmaWVsZCkgKyBzaXplb2YoKHApLT5maWVsZCksIFwKIAkwLCBzaXplb2YoKihwKSkgLSBvZmZzZXRvZih0eXBlb2YoKihwKSksIGZpZWxkKSAtIHNpemVvZigocCktPmZpZWxkKSkKIAorI2RlZmluZSBoYXZlX2ZtdF9vcHMoZm9vKSAoCQkJCQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9jYXAgfHwJCQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9vdXQgfHwJCQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9jYXBfbXBsYW5lIHx8CQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9vdXRfbXBsYW5lIHx8CQkJXAorCW9wcy0+dmlkaW9jXyMjZm9vIyNfZm10X3ZpZF9vdmVybGF5IHx8CQkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF92YmlfY2FwIHx8CQkJCVwKKwlvcHMtPnZpZGlvY18jI2ZvbyMjX2ZtdF92aWRfb3V0X292ZXJsYXkgfHwJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdmJpX291dCB8fAkJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfc2xpY2VkX3ZiaV9jYXAgfHwJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfc2xpY2VkX3ZiaV9vdXQgfHwJCQlcCisJb3BzLT52aWRpb2NfIyNmb28jI19mbXRfdHlwZV9wcml2YXRlKQorCiBzdHJ1Y3Qgc3RkX2Rlc2NyIHsKIAl2NGwyX3N0ZF9pZCBzdGQ7CiAJY29uc3QgY2hhciAqZGVzY3I7CkBAIC0yNjAsNiArMjczLDggQEAKIAlbX0lPQ19OUihWSURJT0NfRFFFVkVOVCldCSAgID0gIlZJRElPQ19EUUVWRU5UIiwKIAlbX0lPQ19OUihWSURJT0NfU1VCU0NSSUJFX0VWRU5UKV0gID0gIlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQiLAogCVtfSU9DX05SKFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCldID0gIlZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCIsCisJW19JT0NfTlIoVklESU9DX0NSRUFURV9CVUZTKV0gICAgICA9ICJWSURJT0NfQ1JFQVRFX0JVRlMiLAorCVtfSU9DX05SKFZJRElPQ19QUkVQQVJFX0JVRildICAgICAgPSAiVklESU9DX1BSRVBBUkVfQlVGIiwKIH07CiAjZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCiAKQEAgLTQ3Nyw2MyArNDkyLDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyoqCi0gKiBmbXRfc3BfdG9fbXAoKSAtIENvbnZlcnQgYSBzaW5nbGUtcGxhbmUgZm9ybWF0IHRvIGl0cyBtdWx0aS1wbGFuYXIgMS1wbGFuZQotICogZXF1aXZhbGVudAotICovCi1zdGF0aWMgaW50IGZtdF9zcF90b19tcChjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZfc3AsCi0JCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZfbXApCi17Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZmX21wLT5mbXQucGl4X21wOwotCWNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmX3NwLT5mbXQucGl4OwotCi0JaWYgKGZfc3AtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlmX21wLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKLQllbHNlIGlmIChmX3NwLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKQotCQlmX21wLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwaXhfbXAtPndpZHRoID0gcGl4LT53aWR0aDsKLQlwaXhfbXAtPmhlaWdodCA9IHBpeC0+aGVpZ2h0OwotCXBpeF9tcC0+cGl4ZWxmb3JtYXQgPSBwaXgtPnBpeGVsZm9ybWF0OwotCXBpeF9tcC0+ZmllbGQgPSBwaXgtPmZpZWxkOwotCXBpeF9tcC0+Y29sb3JzcGFjZSA9IHBpeC0+Y29sb3JzcGFjZTsKLQlwaXhfbXAtPm51bV9wbGFuZXMgPSAxOwotCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IHBpeC0+c2l6ZWltYWdlOwotCXBpeF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IHBpeC0+Ynl0ZXNwZXJsaW5lOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZm10X21wX3RvX3NwKCkgLSBDb252ZXJ0IGEgbXVsdGktcGxhbmFyIDEtcGxhbmUgZm9ybWF0IHRvIGl0cyBzaW5nbGUtcGxhbmFyCi0gKiBlcXVpdmFsZW50Ci0gKi8KLXN0YXRpYyBpbnQgZm10X21wX3RvX3NwKGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZl9tcCwKLQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZl9zcCkKLXsKLQljb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X21wID0gJmZfbXAtPmZtdC5waXhfbXA7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmZfc3AtPmZtdC5waXg7Ci0KLQlpZiAoZl9tcC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQotCQlmX3NwLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCWVsc2UgaWYgKGZfbXAtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQotCQlmX3NwLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBpeC0+d2lkdGggPSBwaXhfbXAtPndpZHRoOwotCXBpeC0+aGVpZ2h0ID0gcGl4X21wLT5oZWlnaHQ7Ci0JcGl4LT5waXhlbGZvcm1hdCA9IHBpeF9tcC0+cGl4ZWxmb3JtYXQ7Ci0JcGl4LT5maWVsZCA9IHBpeF9tcC0+ZmllbGQ7Ci0JcGl4LT5jb2xvcnNwYWNlID0gcGl4X21wLT5jb2xvcnNwYWNlOwotCXBpeC0+c2l6ZWltYWdlID0gcGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOwotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gcGl4X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBsb25nIF9fdmlkZW9fZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCiAJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKQEAgLTU0MSw4ICs0OTksOCBAQAogCWNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyAqb3BzID0gdmZkLT5pb2N0bF9vcHM7CiAJdm9pZCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHY0bDJfZmggKnZmaCA9IE5VTEw7Ci0Jc3RydWN0IHY0bDJfZm9ybWF0IGZfY29weTsKIAlpbnQgdXNlX2ZoX3ByaW8gPSAwOworCWxvbmcgcmV0X3ByaW8gPSAwOwogCWxvbmcgcmV0ID0gLUVOT1RUWTsKIAogCWlmIChvcHMgPT0gTlVMTCkgewpAQCAtNTYyLDM5ICs1MjAsOCBAQAogCQl1c2VfZmhfcHJpbyA9IHRlc3RfYml0KFY0TDJfRkxfVVNFX0ZIX1BSSU8sICZ2ZmQtPmZsYWdzKTsKIAl9CiAKLQlpZiAodXNlX2ZoX3ByaW8pIHsKLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBWSURJT0NfU19DVFJMOgotCQljYXNlIFZJRElPQ19TX1NURDoKLQkJY2FzZSBWSURJT0NfU19JTlBVVDoKLQkJY2FzZSBWSURJT0NfU19PVVRQVVQ6Ci0JCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQljYXNlIFZJRElPQ19TX0ZNVDoKLQkJY2FzZSBWSURJT0NfU19DUk9QOgotCQljYXNlIFZJRElPQ19TX0FVRElPOgotCQljYXNlIFZJRElPQ19TX0FVRE9VVDoKLQkJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6Ci0JCWNhc2UgVklESU9DX1NfRkJVRjoKLQkJY2FzZSBWSURJT0NfU19QUklPUklUWToKLQkJY2FzZSBWSURJT0NfU19EVl9QUkVTRVQ6Ci0JCWNhc2UgVklESU9DX1NfRFZfVElNSU5HUzoKLQkJY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKLQkJY2FzZSBWSURJT0NfU19NT0RVTEFUT1I6Ci0JCWNhc2UgVklESU9DX1NfUEFSTToKLQkJY2FzZSBWSURJT0NfU19IV19GUkVRX1NFRUs6Ci0JCWNhc2UgVklESU9DX0VOQ09ERVJfQ01EOgotCQljYXNlIFZJRElPQ19PVkVSTEFZOgotCQljYXNlIFZJRElPQ19SRVFCVUZTOgotCQljYXNlIFZJRElPQ19TVFJFQU1PTjoKLQkJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgotCQkJcmV0ID0gdjRsMl9wcmlvX2NoZWNrKHZmZC0+cHJpbywgdmZoLT5wcmlvKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBleGl0X3ByaW87Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJaWYgKHVzZV9maF9wcmlvKQorCQlyZXRfcHJpbyA9IHY0bDJfcHJpb19jaGVjayh2ZmQtPnByaW8sIHZmaC0+cHJpbyk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCkBAIC02MzgsMTIgKzU2NSwxNCBAQAogCQllbnVtIHY0bDJfcHJpb3JpdHkgKnAgPSBhcmc7CiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX3ByaW9yaXR5ICYmICF1c2VfZmhfcHJpbykKLQkJCQlicmVhazsKKwkJCWJyZWFrOwogCQlkYmdhcmcoY21kLCAic2V0dGluZyBwcmlvcml0eSB0byAlZFxuIiwgKnApOwogCQlpZiAob3BzLT52aWRpb2Nfc19wcmlvcml0eSkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX3NfcHJpb3JpdHkoZmlsZSwgZmgsICpwKTsKIAkJZWxzZQotCQkJcmV0ID0gdjRsMl9wcmlvX2NoYW5nZSgmdmZkLT52NGwyX2Rldi0+cHJpbywgJnZmaC0+cHJpbywgKnApOworCQkJcmV0ID0gcmV0X3ByaW8gPyByZXRfcHJpbyA6CisJCQkJdjRsMl9wcmlvX2NoYW5nZSgmdmZkLT52NGwyX2Rldi0+cHJpbywKKwkJCQkJCQkmdmZoLT5wcmlvLCAqcCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjU0LDM3ICs1ODMsMzcgQEAKIAogCQlzd2l0Y2ggKGYtPnR5cGUpIHsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOgotCQkJaWYgKG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKLQkJCWlmIChvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3ZlcmxheSkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX292ZXJsYXkpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdmVybGF5KGZpbGUsCiAJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgotCQkJaWYgKG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXQpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXQpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXQoZmlsZSwgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOgotCQkJaWYgKG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKLQkJCWlmIChvcHMtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2VudW1fZm10X3R5cGVfcHJpdmF0ZSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFyZXQpCisJCWlmIChsaWtlbHkgKCFyZXQpKQogCQkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCB0eXBlPSVkLCBmbGFncz0lZCwgIgogCQkJCSJwaXhlbGZvcm1hdD0lYyVjJWMlYywgZGVzY3JpcHRpb249JyVzJ1xuIiwKIAkJCQlmLT5pbmRleCwgZi0+dHlwZSwgZi0+ZmxhZ3MsCkBAIC02OTMsNiArNjIyLDE0IEBACiAJCQkJKGYtPnBpeGVsZm9ybWF0ID4+IDE2KSAmIDB4ZmYsCiAJCQkJKGYtPnBpeGVsZm9ybWF0ID4+IDI0KSAmIDB4ZmYsCiAJCQkJZi0+ZGVzY3JpcHRpb24pOworCQllbHNlIGlmIChyZXQgPT0gLUVOT1RUWSAmJgorCQkJIChvcHMtPnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwIHx8CisJCQkgIG9wcy0+dmlkaW9jX2VudW1fZm10X3ZpZF9vdXQgfHwKKwkJCSAgb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUgfHwKKwkJCSAgb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUgfHwKKwkJCSAgb3BzLT52aWRpb2NfZW51bV9mbXRfdmlkX292ZXJsYXkgfHwKKwkJCSAgb3BzLT52aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKSkKKwkJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ19HX0ZNVDoKQEAgLTcwNCwxMTkgKzY0MSw2NyBAQAogCiAJCXN3aXRjaCAoZi0+dHlwZSkgewogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwKSB7CisJCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcCkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUpIHsKLQkJCQlpZiAoZm10X3NwX3RvX21wKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF92aWRfY2FwX21wbGFuZShmaWxlLCBmaCwKLQkJCQkJCQkJICAgICAgICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJLyogRHJpdmVyIGlzIGN1cnJlbnRseSBpbiBtdWx0aS1wbGFuYXIgZm9ybWF0LAotCQkJCSAqIHdlIGNhbid0IHJldHVybiBpdCBpbiBzaW5nbGUtcGxhbmFyIEFQSSovCi0JCQkJaWYgKGZfY29weS5mbXQucGl4X21wLm51bV9wbGFuZXMgPiAxKSB7Ci0JCQkJCXJldCA9IC1FQlVTWTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0ID0gZm10X21wX3RvX3NwKCZmX2NvcHksIGYpOwotCQkJfQogCQkJaWYgKCFyZXQpCiAJCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCAmZi0+Zm10LnBpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX2NhcCkgewotCQkJCWlmIChmbXRfbXBfdG9fc3AoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9jYXAoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gZm10X3NwX3RvX21wKCZmX2NvcHksIGYpOwotCQkJfQogCQkJaWYgKCFyZXQpCiAJCQkJdjRsX3ByaW50X3BpeF9mbXRfbXBsYW5lKHZmZCwgJmYtPmZtdC5waXhfbXApOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdmVybGF5KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3ZlcmxheSkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19mbXRfdmlkX292ZXJsYXkoZmlsZSwKIAkJCQkJCQkJICAgIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXQpIHsKKwkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0KQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXQoZmlsZSwgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZSkgewotCQkJCWlmIChmbXRfc3BfdG9fbXAoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lKGZpbGUsIGZoLAotCQkJCQkJCQkJJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvKiBEcml2ZXIgaXMgY3VycmVudGx5IGluIG11bHRpLXBsYW5hciBmb3JtYXQsCi0JCQkJICogd2UgY2FuJ3QgcmV0dXJuIGl0IGluIHNpbmdsZS1wbGFuYXIgQVBJKi8KLQkJCQlpZiAoZl9jb3B5LmZtdC5waXhfbXAubnVtX3BsYW5lcyA+IDEpIHsKLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlyZXQgPSBmbXRfbXBfdG9fc3AoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORToKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZSkgeworCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfbXBsYW5lKGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXQpIHsKLQkJCQlpZiAoZm10X21wX3RvX3NwKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0KGZpbGUsCi0JCQkJCQkJCWZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCXJldCA9IGZtdF9zcF90b19tcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWlmICghcmV0KQogCQkJCXY0bF9wcmludF9waXhfZm10X21wbGFuZSh2ZmQsICZmLT5mbXQucGl4X21wKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVk6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdmlkX291dF9vdmVybGF5KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19nX2ZtdF92aWRfb3V0X292ZXJsYXkpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZpZF9vdXRfb3ZlcmxheShmaWxlLAogCQkJCSAgICAgICBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9jYXApCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9jYXApKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9jYXAoZmlsZSwgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgotCQkJaWYgKG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9vdXQpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9vdXQpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3ZiaV9vdXQoZmlsZSwgZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9jYXApCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX2dfZm10X3NsaWNlZF92YmlfY2FwKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX2NhcChmaWxlLAogCQkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKLQkJCWlmIChvcHMtPnZpZGlvY19nX2ZtdF9zbGljZWRfdmJpX291dCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfZ19mbXRfc2xpY2VkX3ZiaV9vdXQpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3NsaWNlZF92Ymlfb3V0KGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6Ci0JCQlpZiAob3BzLT52aWRpb2NfZ19mbXRfdHlwZV9wcml2YXRlKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19nX2ZtdF90eXBlX3ByaXZhdGUpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfZm10X3R5cGVfcHJpdmF0ZShmaWxlLAogCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJfQorCQlpZiAodW5saWtlbHkocmV0ID09IC1FTk9UVFkgJiYgaGF2ZV9mbXRfb3BzKGcpKSkKKwkJCXJldCA9IC1FSU5WQUw7CiAKIAkJYnJlYWs7CiAJfQpAQCAtODI0LDYgKzcwOSwxNCBAQAogCXsKIAkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKIAorCQlpZiAoIWhhdmVfZm10X29wcyhzKSkKKwkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gLUVJTlZBTDsKKwogCQkvKiBGSVhNRTogU2hvdWxkIGJlIG9uZSBkdW1wIHBlciB0eXBlICovCiAJCWRiZ2FyZyhjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMoZi0+dHlwZSwgdjRsMl90eXBlX25hbWVzKSk7CiAKQEAgLTgzMSw0NCArNzI0LDE1IEBACiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnBpeCk7CiAJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwKSB7CisJCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX2NhcCkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX2NhcF9tcGxhbmUpIHsKLQkJCQlpZiAoZm10X3NwX3RvX21wKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZShmaWxlLCBmaCwKLQkJCQkJCQkJCSZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZfY29weS5mbXQucGl4X21wLm51bV9wbGFuZXMgPiAxKSB7Ci0JCQkJCS8qIERyaXZlcnMgc2hvdWxkbid0IGFkanVzdCBmcm9tIDEtcGxhbmUKLQkJCQkJICogdG8gbW9yZSB0aGFuIDEtcGxhbmUgZm9ybWF0cyAqLwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCVdBUk5fT04oMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXJldCA9IGZtdF9tcF90b19zcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4X21wKTsKIAkJCXY0bF9wcmludF9waXhfZm10X21wbGFuZSh2ZmQsICZmLT5mbXQucGl4X21wKTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZSkgeworCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lKGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9jYXAgJiYKLQkJCQkJZi0+Zm10LnBpeF9tcC5udW1fcGxhbmVzID09IDEpIHsKLQkJCQlpZiAoZm10X21wX3RvX3NwKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfY2FwKGZpbGUsCi0JCQkJCQkJCWZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCXJldCA9IGZtdF9zcF90b19tcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC53aW4pOwpAQCAtODc5LDQ0ICs3NDMsMTUgQEAKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5waXgpOwogCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCAmZi0+Zm10LnBpeCk7Ci0JCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmlkX291dCkgeworCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXQpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdmlkX291dChmaWxlLCBmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lKSB7Ci0JCQkJaWYgKGZtdF9zcF90b19tcChmLCAmZl9jb3B5KSkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUoZmlsZSwgZmgsCi0JCQkJCQkJCQkmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCWlmIChmX2NvcHkuZm10LnBpeF9tcC5udW1fcGxhbmVzID4gMSkgewotCQkJCQkvKiBEcml2ZXJzIHNob3VsZG4ndCBhZGp1c3QgZnJvbSAxLXBsYW5lCi0JCQkJCSAqIHRvIG1vcmUgdGhhbiAxLXBsYW5lIGZvcm1hdHMgKi8KLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlXQVJOX09OKDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlyZXQgPSBmbXRfbXBfdG9fc3AoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4X21wKTsKIAkJCXY0bF9wcmludF9waXhfZm10X21wbGFuZSh2ZmQsICZmLT5mbXQucGl4X21wKTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92aWRfb3V0X21wbGFuZSkgeworCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lKGZpbGUsCiAJCQkJCQkJCQlmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3NfZm10X3ZpZF9vdXQgJiYKLQkJCQkJZi0+Zm10LnBpeF9tcC5udW1fcGxhbmVzID09IDEpIHsKLQkJCQlpZiAoZm10X21wX3RvX3NwKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92aWRfb3V0KGZpbGUsCi0JCQkJCQkJCWZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCXJldCA9IGZtdF9tcF90b19zcCgmZl9jb3B5LCBmKTsKLQkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVk6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQud2luKTsKQEAgLTkyNiwyOSArNzYxLDMwIEBACiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnZiaSk7Ci0JCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdmJpX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2Nfc19mbXRfdmJpX2NhcCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfdmJpX2NhcChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQudmJpKTsKLQkJCWlmIChvcHMtPnZpZGlvY19zX2ZtdF92Ymlfb3V0KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19zX2ZtdF92Ymlfb3V0KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF92Ymlfb3V0KGZpbGUsIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnNsaWNlZCk7Ci0JCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9jYXApCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3NfZm10X3NsaWNlZF92YmlfY2FwKSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2ZtdF9zbGljZWRfdmJpX2NhcChmaWxlLAogCQkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKIAkJCUNMRUFSX0FGVEVSX0ZJRUxEKGYsIGZtdC5zbGljZWQpOwotCQkJaWYgKG9wcy0+dmlkaW9jX3NfZm10X3NsaWNlZF92Ymlfb3V0KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19zX2ZtdF9zbGljZWRfdmJpX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19mbXRfc2xpY2VkX3ZiaV9vdXQoZmlsZSwKIAkJCQkJCQkJCWZoLCBmKTsKKwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgogCQkJLyogQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnJhd19kYXRhKTsgPC0gZG9lcyBub3RoaW5nICovCi0JCQlpZiAob3BzLT52aWRpb2Nfc19mbXRfdHlwZV9wcml2YXRlKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY19zX2ZtdF90eXBlX3ByaXZhdGUpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3NfZm10X3R5cGVfcHJpdmF0ZShmaWxlLAogCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKQEAgLTk2NSwxMzIgKzgwMSw3NyBAQAogCQlzd2l0Y2ggKGYtPnR5cGUpIHsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4KTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXApIHsKKwkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXApCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIGZoLCBmKTsKLQkJCX0gZWxzZSBpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZSkgewotCQkJCWlmIChmbXRfc3BfdG9fbXAoZiwgJmZfY29weSkpCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUoZmlsZSwKLQkJCQkJCQkJZmgsICZmX2NvcHkpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGZfY29weS5mbXQucGl4X21wLm51bV9wbGFuZXMgPiAxKSB7Ci0JCQkJCS8qIERyaXZlcnMgc2hvdWxkbid0IGFkanVzdCBmcm9tIDEtcGxhbmUKLQkJCQkJICogdG8gbW9yZSB0aGFuIDEtcGxhbmUgZm9ybWF0cyAqLwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCVdBUk5fT04oMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXQgPSBmbXRfbXBfdG9fc3AoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZmLT5mbXQucGl4KTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4X21wKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lKGZpbGUsCiAJCQkJCQkJCQkgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXAgJiYKLQkJCQkJZi0+Zm10LnBpeF9tcC5udW1fcGxhbmVzID09IDEpIHsKLQkJCQlpZiAoZm10X21wX3RvX3NwKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwKLQkJCQkJCQkJICBmaCwgJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlyZXQgPSBmbXRfc3BfdG9fbXAoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdF9tcGxhbmUodmZkLCAmZi0+Zm10LnBpeF9tcCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQud2luKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5KQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdmVybGF5KGZpbGUsCiAJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnBpeCk7Ci0JCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0KSB7CisJCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0KQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dChmaWxlLCBmaCwgZik7Ci0JCQl9IGVsc2UgaWYgKG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUpIHsKLQkJCQlpZiAoZm10X3NwX3RvX21wKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lKGZpbGUsCi0JCQkJCQkJCWZoLCAmZl9jb3B5KTsKLQkJCQlpZiAocmV0KQotCQkJCQlicmVhazsKLQotCQkJCWlmIChmX2NvcHkuZm10LnBpeF9tcC5udW1fcGxhbmVzID4gMSkgewotCQkJCQkvKiBEcml2ZXJzIHNob3VsZG4ndCBhZGp1c3QgZnJvbSAxLXBsYW5lCi0JCQkJCSAqIHRvIG1vcmUgdGhhbiAxLXBsYW5lIGZvcm1hdHMgKi8KLQkJCQkJcmV0ID0gLUVCVVNZOwotCQkJCQlXQVJOX09OKDEpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcmV0ID0gZm10X21wX3RvX3NwKCZmX2NvcHksIGYpOwotCQkJfQogCQkJaWYgKCFyZXQpCiAJCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCAmZi0+Zm10LnBpeCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucGl4X21wKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lKSB7CisJCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X21wbGFuZSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lKGZpbGUsCiAJCQkJCQkJCQkgZmgsIGYpOwotCQkJfSBlbHNlIGlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXQgJiYKLQkJCQkJZi0+Zm10LnBpeF9tcC5udW1fcGxhbmVzID09IDEpIHsKLQkJCQlpZiAoZm10X21wX3RvX3NwKGYsICZmX2NvcHkpKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXQoZmlsZSwKLQkJCQkJCQkJICBmaCwgJmZfY29weSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlyZXQgPSBmbXRfc3BfdG9fbXAoJmZfY29weSwgZik7Ci0JCQl9CiAJCQlpZiAoIXJldCkKIAkJCQl2NGxfcHJpbnRfcGl4X2ZtdF9tcGxhbmUodmZkLCAmZi0+Zm10LnBpeF9tcCk7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10Lndpbik7Ci0JCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92aWRfb3V0X292ZXJsYXkpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3RyeV9mbXRfdmlkX291dF9vdmVybGF5KSkKIAkJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZm10X3ZpZF9vdXRfb3ZlcmxheShmaWxlLAogCQkJCSAgICAgICBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnZiaSk7Ci0JCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwKQorCQkJaWYgKGxpa2VseShvcHMtPnZpZGlvY190cnlfZm10X3ZiaV9jYXApKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdmJpX2NhcChmaWxlLCBmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CiAJCQlDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQudmJpKTsKLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3ZiaV9vdXQpCisJCQlpZiAobGlrZWx5KG9wcy0+dmlkaW9jX3RyeV9mbXRfdmJpX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0KGZpbGUsIGZoLCBmKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnNsaWNlZCk7Ci0JCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX2NhcCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX2NhcCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX2NhcChmaWxlLAogCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUOgogCQkJQ0xFQVJfQUZURVJfRklFTEQoZiwgZm10LnNsaWNlZCk7Ci0JCQlpZiAob3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX291dCkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX291dCkpCiAJCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2ZtdF9zbGljZWRfdmJpX291dChmaWxlLAogCQkJCQkJCQlmaCwgZik7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CiAJCQkvKiBDTEVBUl9BRlRFUl9GSUVMRChmLCBmbXQucmF3X2RhdGEpOyA8LSBkb2VzIG5vdGhpbmcgKi8KLQkJCWlmIChvcHMtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCWlmIChsaWtlbHkob3BzLT52aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUpKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX3RyeV9mbXRfdHlwZV9wcml2YXRlKGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOwogCQl9Ci0KKwkJaWYgKHVubGlrZWx5KHJldCA9PSAtRU5PVFRZICYmIGhhdmVfZm10X29wcyh0cnkpKSkKKwkJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAkvKiBGSVhNRTogVGhvc2UgYnVmIHJlcXMgY291bGQgYmUgaGFuZGxlZCBoZXJlLApAQCAtMTEwMyw2ICs4ODQsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3JlcWJ1ZnMpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCXJldCA9IGNoZWNrX2ZtdChvcHMsIHAtPnR5cGUpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0xMTY4LDYgKzk1MywxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfb3ZlcmxheSkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgInZhbHVlPSVkXG4iLCAqaSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX292ZXJsYXkoZmlsZSwgZmgsICppKTsKIAkJYnJlYWs7CkBAIC0xMTkzLDYgKzk4MiwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19mYnVmKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAiY2FwYWJpbGl0eT0weCV4LCBmbGFncz0lZCwgYmFzZT0weCUwOGx4XG4iLAogCQkJcC0+Y2FwYWJpbGl0eSwgcC0+ZmxhZ3MsICh1bnNpZ25lZCBsb25nKXAtPmJhc2UpOwogCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsICZwLT5mbXQpOwpAQCAtMTIwNSw2ICs5OTgsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3N0cmVhbW9uKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKGksIHY0bDJfdHlwZV9uYW1lcykpOwogCQlyZXQgPSBvcHMtPnZpZGlvY19zdHJlYW1vbihmaWxlLCBmaCwgaSk7CiAJCWJyZWFrOwpAQCAtMTIxNSw2ICsxMDEyLDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zdHJlYW1vZmYpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCWRiZ2FyZyhjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMoaSwgdjRsMl90eXBlX25hbWVzKSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3N0cmVhbW9mZihmaWxlLCBmaCwgaSk7CiAJCWJyZWFrOwpAQCAtMTIyNyw2ICsxMDI4LDEwIEBACiAJCXVuc2lnbmVkIGludCBpbmRleCA9IHAtPmluZGV4LCBpLCBqID0gMDsKIAkJY29uc3QgY2hhciAqZGVzY3IgPSAiIjsKIAorCQlpZiAoaWQgPT0gMCkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlOVkFMOworCiAJCS8qIFJldHVybiBub3JtIGFycmF5IGluIGEgY2Fub25pY2FsIHdheSAqLwogCQlmb3IgKGkgPSAwOyBpIDw9IGluZGV4ICYmIGlkOyBpKyspIHsKIAkJCS8qIGxhc3Qgc3RkIHZhbHVlIGluIHRoZSBzdGFuZGFyZHMgYXJyYXkgaXMgMCwgc28gdGhpcwpAQCAtMTI2MiwxNiArMTA2NywxNSBAQAogCXsKIAkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwogCi0JCXJldCA9IDA7CiAJCS8qIENhbGxzIHRoZSBzcGVjaWZpYyBoYW5kbGVyICovCiAJCWlmIChvcHMtPnZpZGlvY19nX3N0ZCkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX2dfc3RkKGZpbGUsIGZoLCBpZCk7Ci0JCWVsc2UgaWYgKHZmZC0+Y3VycmVudF9ub3JtKQorCQllbHNlIGlmICh2ZmQtPmN1cnJlbnRfbm9ybSkgeworCQkJcmV0ID0gMDsKIAkJCSppZCA9IHZmZC0+Y3VycmVudF9ub3JtOwotCQllbHNlCi0JCQlyZXQgPSAtRUlOVkFMOworCQl9CiAKLQkJaWYgKCFyZXQpCisJCWlmIChsaWtlbHkoIXJldCkpCiAJCQlkYmdhcmcoY21kLCAic3RkPTB4JTA4THhcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpKmlkKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTI4MSwxNSArMTA4NSwyMCBAQAogCiAJCWRiZ2FyZyhjbWQsICJzdGQ9JTA4THhcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpKmlkKTsKIAorCQlpZiAoIW9wcy0+dmlkaW9jX3Nfc3RkKQorCQkJYnJlYWs7CisKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IC1FSU5WQUw7CiAJCW5vcm0gPSAoKmlkKSAmIHZmZC0+dHZub3JtczsKIAkJaWYgKHZmZC0+dHZub3JtcyAmJiAhbm9ybSkJLyogQ2hlY2sgaWYgc3RkIGlzIHN1cHBvcnRlZCAqLwogCQkJYnJlYWs7CiAKIAkJLyogQ2FsbHMgdGhlIHNwZWNpZmljIGhhbmRsZXIgKi8KLQkJaWYgKG9wcy0+dmlkaW9jX3Nfc3RkKQotCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19zdGQoZmlsZSwgZmgsICZub3JtKTsKLQkJZWxzZQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gb3BzLT52aWRpb2Nfc19zdGQoZmlsZSwgZmgsICZub3JtKTsKIAogCQkvKiBVcGRhdGVzIHN0YW5kYXJkIGluZm9ybWF0aW9uICovCiAJCWlmIChyZXQgPj0gMCkKQEAgLTEzMDIsNiArMTExMSwxNCBAQAogCiAJCWlmICghb3BzLT52aWRpb2NfcXVlcnlzdGQpCiAJCQlicmVhazsKKwkJLyoKKwkJICogSWYgbm90aGluZyBkZXRlY3RlZCwgaXQgc2hvdWxkIHJldHVybiBhbGwgc3VwcG9ydGVkCisJCSAqIERyaXZlcnMganVzdCBuZWVkIHRvIG1hc2sgdGhlIHN0ZCBhcmd1bWVudCwgaW4gb3JkZXIKKwkJICogdG8gcmVtb3ZlIHRoZSBzdGFuZGFyZHMgdGhhdCBkb24ndCBhcHBseSBmcm9tIHRoZSBtYXNrLgorCQkgKiBUaGlzIG1lYW5zIHRoYXQgdHVuZXJzLCBhdWRpbyBhbmQgdmlkZW8gZGVjb2RlcnMgY2FuIGpvaW4KKwkJICogdGhlaXIgZWZmb3J0cyB0byBpbXByb3ZlIHRoZSBzdGFuZGFyZHMgZGV0ZWN0aW9uCisJCSAqLworCQkqcCA9IHZmZC0+dHZub3JtczsKIAkJcmV0ID0gb3BzLT52aWRpb2NfcXVlcnlzdGQoZmlsZSwgZmgsIGFyZyk7CiAJCWlmICghcmV0KQogCQkJZGJnYXJnKGNtZCwgImRldGVjdGVkIHN0ZD0lMDhMeFxuIiwKQEAgLTEzNTgsNiArMTE3NSwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19pbnB1dCkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgInZhbHVlPSVkXG4iLCAqaSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3NfaW5wdXQoZmlsZSwgZmgsICppKTsKIAkJYnJlYWs7CkBAIC0xNDEwLDYgKzEyMzEsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3Nfb3V0cHV0KQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAidmFsdWU9JWRcbiIsICppKTsKIAkJcmV0ID0gb3BzLT52aWRpb2Nfc19vdXRwdXQoZmlsZSwgZmgsICppKTsKIAkJYnJlYWs7CkBAIC0xNDc5LDYgKzEzMDQsMTAgQEAKIAkJaWYgKCEodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKSAmJiAhdmZkLT5jdHJsX2hhbmRsZXIgJiYKIAkJCSFvcHMtPnZpZGlvY19zX2N0cmwgJiYgIW9wcy0+dmlkaW9jX3NfZXh0X2N0cmxzKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCiAJCWRiZ2FyZyhjbWQsICJpZD0weCV4LCB2YWx1ZT0lZFxuIiwgcC0+aWQsIHAtPnZhbHVlKTsKIApAQCAtMTUwNCw2ICsxMzMzLDggQEAKIAkJY3RybC52YWx1ZSA9IHAtPnZhbHVlOwogCQlpZiAoY2hlY2tfZXh0X2N0cmxzKCZjdHJscywgMSkpCiAJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgJmN0cmxzKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgpAQCAtMTUxNSw4ICsxMzQ2LDEwIEBACiAJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKLQkJZWxzZSBpZiAob3BzLT52aWRpb2NfZ19leHRfY3RybHMgJiYgY2hlY2tfZXh0X2N0cmxzKHAsIDApKQotCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19leHRfY3RybHMoZmlsZSwgZmgsIHApOworCQllbHNlIGlmIChvcHMtPnZpZGlvY19nX2V4dF9jdHJscykKKwkJCXJldCA9IGNoZWNrX2V4dF9jdHJscyhwLCAwKSA/CisJCQkJb3BzLT52aWRpb2NfZ19leHRfY3RybHMoZmlsZSwgZmgsIHApIDoKKwkJCQktRUlOVkFMOwogCQllbHNlCiAJCQlicmVhazsKIAkJdjRsX3ByaW50X2V4dF9jdHJscyhjbWQsIHZmZCwgcCwgIXJldCk7CkBAIC0xNTMwLDYgKzEzNjMsMTAgQEAKIAkJaWYgKCEodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKSAmJiAhdmZkLT5jdHJsX2hhbmRsZXIgJiYKIAkJCQkhb3BzLT52aWRpb2Nfc19leHRfY3RybHMpCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCXY0bF9wcmludF9leHRfY3RybHMoY21kLCB2ZmQsIHAsIDEpOwogCQlpZiAodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKQogCQkJcmV0ID0gdjRsMl9zX2V4dF9jdHJscyh2ZmgsIHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKQEAgLTE1MzcsNiArMTM3NCw4IEBACiAJCQlyZXQgPSB2NGwyX3NfZXh0X2N0cmxzKE5VTEwsIHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAoY2hlY2tfZXh0X2N0cmxzKHAsIDApKQogCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19leHRfY3RybHMoZmlsZSwgZmgsIHApOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NfVFJZX0VYVF9DVFJMUzoKQEAgLTE1NTQsNiArMTM5Myw4IEBACiAJCQlyZXQgPSB2NGwyX3RyeV9leHRfY3RybHModmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQllbHNlIGlmIChjaGVja19leHRfY3RybHMocCwgMCkpCiAJCQlyZXQgPSBvcHMtPnZpZGlvY190cnlfZXh0X2N0cmxzKGZpbGUsIGZoLCBwKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX1FVRVJZTUVOVToKQEAgLTE2MTQsNiArMTQ1NSwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19hdWRpbykKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PTB4JXgsICIKIAkJCQkJIm1vZGU9MHgleFxuIiwgcC0+aW5kZXgsIHAtPm5hbWUsCiAJCQkJCXAtPmNhcGFiaWxpdHksIHAtPm1vZGUpOwpAQCAtMTY1NCw2ICsxNDk5LDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2F1ZG91dCkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCAiCiAJCQkJCSJtb2RlPSVkXG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKIAkJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CkBAIC0xNjgzLDYgKzE1MzIsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfbW9kdWxhdG9yKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKIAkJCQkicmFuZ2Vsb3c9JWQsIHJhbmdlaGlnaD0lZCwgdHhzdWJjaGFucz0lZFxuIiwKIAkJCQlwLT5pbmRleCwgcC0+bmFtZSwgcC0+Y2FwYWJpbGl0eSwgcC0+cmFuZ2Vsb3csCkBAIC0xNzA5LDYgKzE1NjIsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfY3JvcCkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyhwLT50eXBlLCB2NGwyX3R5cGVfbmFtZXMpKTsKIAkJZGJncmVjdCh2ZmQsICIiLCAmcC0+Yyk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3NfY3JvcChmaWxlLCBmaCwgcCk7CkBAIC0xNzUyLDExICsxNjA5LDE1IEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19nX2pwZWdjb21wKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlkYmdhcmcoY21kLCAicXVhbGl0eT0lZCwgQVBQbj0lZCwgQVBQX2xlbj0lZCwgIgogCQkJCQkiQ09NX2xlbj0lZCwganBlZ19tYXJrZXJzPSVkXG4iLAogCQkJCQlwLT5xdWFsaXR5LCBwLT5BUFBuLCBwLT5BUFBfbGVuLAogCQkJCQlwLT5DT01fbGVuLCBwLT5qcGVnX21hcmtlcnMpOwotCQkJcmV0ID0gb3BzLT52aWRpb2Nfc19qcGVnY29tcChmaWxlLCBmaCwgcCk7CisJCXJldCA9IG9wcy0+dmlkaW9jX3NfanBlZ2NvbXAoZmlsZSwgZmgsIHApOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NfR19FTkNfSU5ERVg6CkBAIC0xNzc3LDYgKzE2MzgsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX2VuY29kZXJfY21kKQogCQkJYnJlYWs7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQogCQlyZXQgPSBvcHMtPnZpZGlvY19lbmNvZGVyX2NtZChmaWxlLCBmaCwgcCk7CiAJCWlmICghcmV0KQogCQkJZGJnYXJnKGNtZCwgImNtZD0lZCwgZmxhZ3M9JXhcbiIsIHAtPmNtZCwgcC0+ZmxhZ3MpOwpAQCAtMTc5Nyw2ICsxNjYyLDggQEAKIAl7CiAJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnAgPSBhcmc7CiAKKwkJaWYgKCFvcHMtPnZpZGlvY19nX3Bhcm0gJiYgIXZmZC0+Y3VycmVudF9ub3JtKQorCQkJYnJlYWs7CiAJCWlmIChvcHMtPnZpZGlvY19nX3Bhcm0pIHsKIAkJCXJldCA9IGNoZWNrX2ZtdChvcHMsIHAtPnR5cGUpOwogCQkJaWYgKHJldCkKQEAgLTE4MDUsMTQgKzE2NzIsMTMgQEAKIAkJfSBlbHNlIHsKIAkJCXY0bDJfc3RkX2lkIHN0ZCA9IHZmZC0+Y3VycmVudF9ub3JtOwogCisJCQlyZXQgPSAtRUlOVkFMOwogCQkJaWYgKHAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQkJCWJyZWFrOwogCiAJCQlyZXQgPSAwOwogCQkJaWYgKG9wcy0+dmlkaW9jX2dfc3RkKQogCQkJCXJldCA9IG9wcy0+dmlkaW9jX2dfc3RkKGZpbGUsIGZoLCAmc3RkKTsKLQkJCWVsc2UgaWYgKHN0ZCA9PSAwKQotCQkJCXJldCA9IC1FSU5WQUw7CiAJCQlpZiAocmV0ID09IDApCiAJCQkJdjRsMl92aWRlb19zdGRfZnJhbWVfcGVyaW9kKHN0ZCwKIAkJCQkJCSAgICAmcC0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZSk7CkBAIC0xODI3LDYgKzE2OTMsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfcGFybSkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJcmV0ID0gY2hlY2tfZm10KG9wcywgcC0+dHlwZSk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTE4NjIsNiArMTczMiwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc190dW5lcikKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJcC0+dHlwZSA9ICh2ZmQtPnZmbF90eXBlID09IFZGTF9UWVBFX1JBRElPKSA/CiAJCQlWNEwyX1RVTkVSX1JBRElPIDogVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCWRiZ2FyZyhjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgpAQCAtMTg5Niw2ICsxNzcwLDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2ZyZXF1ZW5jeSkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAkJZGJnYXJnKGNtZCwgInR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsCiAJCQkJcC0+dHVuZXIsIHAtPnR5cGUsIHAtPmZyZXF1ZW5jeSk7CiAJCXJldCA9IG9wcy0+dmlkaW9jX3NfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKQEAgLTE5NzAsNiArMTg0OCwxMCBAQAogCiAJCWlmICghb3BzLT52aWRpb2Nfc19od19mcmVxX3NlZWspCiAJCQlicmVhazsKKwkJaWYgKHJldF9wcmlvKSB7CisJCQlyZXQgPSByZXRfcHJpbzsKKwkJCWJyZWFrOworCQl9CiAJCXR5cGUgPSAodmZkLT52ZmxfdHlwZSA9PSBWRkxfVFlQRV9SQURJTykgPwogCQkJVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlkYmdhcmcoY21kLApAQCAtMjA3NCw2ICsxOTU2LDEwIEBACiAKIAkJaWYgKCFvcHMtPnZpZGlvY19zX2R2X3ByZXNldCkKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAogCQlkYmdhcmcoY21kLCAicHJlc2V0PSVkXG4iLCBwLT5wcmVzZXQpOwogCQlyZXQgPSBvcHMtPnZpZGlvY19zX2R2X3ByZXNldChmaWxlLCBmaCwgcCk7CkBAIC0yMTA5LDYgKzE5OTUsMTAgQEAKIAogCQlpZiAoIW9wcy0+dmlkaW9jX3NfZHZfdGltaW5ncykKIAkJCWJyZWFrOworCQlpZiAocmV0X3ByaW8pIHsKKwkJCXJldCA9IHJldF9wcmlvOworCQkJYnJlYWs7CisJCX0KIAogCQlzd2l0Y2ggKHAtPnR5cGUpIHsKIAkJY2FzZSBWNEwyX0RWX0JUXzY1Nl8xMTIwOgpAQCAtMjIxNiwyMCArMjEwNiw0NyBAQAogCQlkYmdhcmcoY21kLCAidHlwZT0weCU4Ljh4Iiwgc3ViLT50eXBlKTsKIAkJYnJlYWs7CiAJfQotCWRlZmF1bHQ6CisJY2FzZSBWSURJT0NfQ1JFQVRFX0JVRlM6CiAJewotCQlib29sIHZhbGlkX3ByaW8gPSB0cnVlOworCQlzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyAqY3JlYXRlID0gYXJnOwogCi0JCWlmICghb3BzLT52aWRpb2NfZGVmYXVsdCkKKwkJaWYgKCFvcHMtPnZpZGlvY19jcmVhdGVfYnVmcykKIAkJCWJyZWFrOwotCQlpZiAodXNlX2ZoX3ByaW8pCi0JCQl2YWxpZF9wcmlvID0gdjRsMl9wcmlvX2NoZWNrKHZmZC0+cHJpbywgdmZoLT5wcmlvKSA+PSAwOwotCQlyZXQgPSBvcHMtPnZpZGlvY19kZWZhdWx0KGZpbGUsIGZoLCB2YWxpZF9wcmlvLCBjbWQsIGFyZyk7CisJCWlmIChyZXRfcHJpbykgeworCQkJcmV0ID0gcmV0X3ByaW87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBjaGVja19mbXQob3BzLCBjcmVhdGUtPmZvcm1hdC50eXBlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXJldCA9IG9wcy0+dmlkaW9jX2NyZWF0ZV9idWZzKGZpbGUsIGZoLCBjcmVhdGUpOworCisJCWRiZ2FyZyhjbWQsICJjb3VudD0lZCBAICVkXG4iLCBjcmVhdGUtPmNvdW50LCBjcmVhdGUtPmluZGV4KTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgVklESU9DX1BSRVBBUkVfQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpiID0gYXJnOworCisJCWlmICghb3BzLT52aWRpb2NfcHJlcGFyZV9idWYpCisJCQlicmVhazsKKwkJcmV0ID0gY2hlY2tfZm10KG9wcywgYi0+dHlwZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlyZXQgPSBvcHMtPnZpZGlvY19wcmVwYXJlX2J1ZihmaWxlLCBmaCwgYik7CisKKwkJZGJnYXJnKGNtZCwgImluZGV4PSVkIiwgYi0+aW5kZXgpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJaWYgKCFvcHMtPnZpZGlvY19kZWZhdWx0KQorCQkJYnJlYWs7CisJCXJldCA9IG9wcy0+dmlkaW9jX2RlZmF1bHQoZmlsZSwgZmgsIHJldF9wcmlvID49IDAsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CiAJfSAvKiBzd2l0Y2ggKi8KIAotZXhpdF9wcmlvOgogCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpIHsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItbWVtMm1lbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLW1lbTJtZW0uYwppbmRleCAzYjE1YmY1Li45NzVkMGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItbWVtMm1lbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1tZW0ybWVtLmMKQEAgLTk3LDExICs5NywxMiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFfY3R4LT5yZHlfc3BpbmxvY2ssIGZsYWdzKTsKIAotCWlmIChsaXN0X2VtcHR5KCZxX2N0eC0+cmR5X3F1ZXVlKSkKLQkJZ290byBlbmQ7CisJaWYgKGxpc3RfZW1wdHkoJnFfY3R4LT5yZHlfcXVldWUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFfY3R4LT5yZHlfc3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJYiA9IGxpc3RfZW50cnkocV9jdHgtPnJkeV9xdWV1ZS5uZXh0LCBzdHJ1Y3QgdjRsMl9tMm1fYnVmZmVyLCBsaXN0KTsKLWVuZDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxX2N0eC0+cmR5X3NwaW5sb2NrLCBmbGFncyk7CiAJcmV0dXJuICZiLT52YjsKIH0KQEAgLTExNywxMiArMTE4LDEzIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxX2N0eC0+cmR5X3NwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZxX2N0eC0+cmR5X3F1ZXVlKSkgewotCQliID0gbGlzdF9lbnRyeShxX2N0eC0+cmR5X3F1ZXVlLm5leHQsIHN0cnVjdCB2NGwyX20ybV9idWZmZXIsCi0JCQkJbGlzdCk7Ci0JCWxpc3RfZGVsKCZiLT5saXN0KTsKLQkJcV9jdHgtPm51bV9yZHktLTsKKwlpZiAobGlzdF9lbXB0eSgmcV9jdHgtPnJkeV9xdWV1ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcV9jdHgtPnJkeV9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKIAl9CisJYiA9IGxpc3RfZW50cnkocV9jdHgtPnJkeV9xdWV1ZS5uZXh0LCBzdHJ1Y3QgdjRsMl9tMm1fYnVmZmVyLCBsaXN0KTsKKwlsaXN0X2RlbCgmYi0+bGlzdCk7CisJcV9jdHgtPm51bV9yZHktLTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxX2N0eC0+cmR5X3NwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gJmItPnZiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jCmluZGV4IGI3OTY3YzkuLjY1YWRlNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMTczLDYgKzE3NCwyNSBAQAogCiAJY2FzZSBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ6CiAJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCB1bnN1YnNjcmliZV9ldmVudCwgdmZoLCBhcmcpOworCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgorCXsKKwkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpwID0gYXJnOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBnX3JlZ2lzdGVyLCBwKTsKKwl9CisJY2FzZSBWSURJT0NfREJHX1NfUkVHSVNURVI6CisJeworCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnAgPSBhcmc7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfcmVnaXN0ZXIsIHApOworCX0KKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1Y0TDJfU1VCREVWX0FQSSkKIAljYXNlIFZJRElPQ19TVUJERVZfR19GTVQ6IHsKIAkJc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqZm9ybWF0ID0gYXJnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItY29yZS5jCmluZGV4IDMwMTVlNjAuLjk1YTNmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1jb3JlLmMKQEAgLTM4LDEzICszOCwxMyBAQAogCSgoKHEpLT5vcHMtPm9wKSA/ICgocSktPm9wcy0+b3AoYXJncykpIDogMCkKIAogI2RlZmluZSBWNEwyX0JVRkZFUl9TVEFURV9GTEFHUwkoVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBWNEwyX0JVRl9GTEFHX1FVRVVFRCB8IFwKLQkJCQkgVjRMMl9CVUZfRkxBR19ET05FIHwgVjRMMl9CVUZfRkxBR19FUlJPUikKKwkJCQkgVjRMMl9CVUZfRkxBR19ET05FIHwgVjRMMl9CVUZfRkxBR19FUlJPUiB8IFwKKwkJCQkgVjRMMl9CVUZfRkxBR19QUkVQQVJFRCkKIAogLyoqCiAgKiBfX3ZiMl9idWZfbWVtX2FsbG9jKCkgLSBhbGxvY2F0ZSB2aWRlbyBtZW1vcnkgZm9yIHRoZSBnaXZlbiBidWZmZXIKICAqLwotc3RhdGljIGludCBfX3ZiMl9idWZfbWVtX2FsbG9jKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwKLQkJCQl1bnNpZ25lZCBsb25nICpwbGFuZV9zaXplcykKK3N0YXRpYyBpbnQgX192YjJfYnVmX21lbV9hbGxvYyhzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHZiMl9xdWV1ZSAqcSA9IHZiLT52YjJfcXVldWU7CiAJdm9pZCAqbWVtX3ByaXY7CkBAIC01MywxMyArNTMsMTMgQEAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBwbGFuZXMgaW4gdGhpcyBidWZmZXIgKi8KIAlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCB2Yi0+bnVtX3BsYW5lczsgKytwbGFuZSkgewogCQltZW1fcHJpdiA9IGNhbGxfbWVtb3AocSwgcGxhbmUsIGFsbG9jLCBxLT5hbGxvY19jdHhbcGxhbmVdLAotCQkJCQlwbGFuZV9zaXplc1twbGFuZV0pOworCQkJCSAgICAgIHEtPnBsYW5lX3NpemVzW3BsYW5lXSk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChtZW1fcHJpdikpCiAJCQlnb3RvIGZyZWU7CiAKIAkJLyogQXNzb2NpYXRlIGFsbG9jYXRvciBwcml2YXRlIGRhdGEgd2l0aCB0aGlzIHBsYW5lICovCiAJCXZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2ID0gbWVtX3ByaXY7Ci0JCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubGVuZ3RoID0gcGxhbmVfc2l6ZXNbcGxhbmVdOworCQl2Yi0+djRsMl9wbGFuZXNbcGxhbmVdLmxlbmd0aCA9IHEtPnBsYW5lX3NpemVzW3BsYW5lXTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMCwxOCArMTEwLDI4IEBACiAgKiBfX3NldHVwX29mZnNldHMoKSAtIHNldHVwIHVuaXF1ZSBvZmZzZXRzICgiY29va2llcyIpIGZvciBldmVyeSBwbGFuZSBpbgogICogZXZlcnkgYnVmZmVyIG9uIHRoZSBxdWV1ZQogICovCi1zdGF0aWMgdm9pZCBfX3NldHVwX29mZnNldHMoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3N0YXRpYyB2b2lkIF9fc2V0dXBfb2Zmc2V0cyhzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgbikKIHsKIAl1bnNpZ25lZCBpbnQgYnVmZmVyLCBwbGFuZTsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7Ci0JdW5zaWduZWQgbG9uZyBvZmYgPSAwOworCXVuc2lnbmVkIGxvbmcgb2ZmOwogCi0JZm9yIChidWZmZXIgPSAwOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsgKytidWZmZXIpIHsKKwlpZiAocS0+bnVtX2J1ZmZlcnMpIHsKKwkJc3RydWN0IHY0bDJfcGxhbmUgKnA7CisJCXZiID0gcS0+YnVmc1txLT5udW1fYnVmZmVycyAtIDFdOworCQlwID0gJnZiLT52NGwyX3BsYW5lc1t2Yi0+bnVtX3BsYW5lcyAtIDFdOworCQlvZmYgPSBQQUdFX0FMSUdOKHAtPm0ubWVtX29mZnNldCArIHAtPmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJb2ZmID0gMDsKKwl9CisKKwlmb3IgKGJ1ZmZlciA9IHEtPm51bV9idWZmZXJzOyBidWZmZXIgPCBxLT5udW1fYnVmZmVycyArIG47ICsrYnVmZmVyKSB7CiAJCXZiID0gcS0+YnVmc1tidWZmZXJdOwogCQlpZiAoIXZiKQogCQkJY29udGludWU7CiAKIAkJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgdmItPm51bV9wbGFuZXM7ICsrcGxhbmUpIHsKKwkJCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubGVuZ3RoID0gcS0+cGxhbmVfc2l6ZXNbcGxhbmVdOwogCQkJdmItPnY0bDJfcGxhbmVzW3BsYW5lXS5tLm1lbV9vZmZzZXQgPSBvZmY7CiAKIAkJCWRwcmludGsoMywgIkJ1ZmZlciAlZCwgcGxhbmUgJWQgb2Zmc2V0IDB4JTA4bHhcbiIsCkBAIC0xNDEsOCArMTUxLDcgQEAKICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBidWZmZXJzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCiAgKi8KIHN0YXRpYyBpbnQgX192YjJfcXVldWVfYWxsb2Moc3RydWN0IHZiMl9xdWV1ZSAqcSwgZW51bSB2NGwyX21lbW9yeSBtZW1vcnksCi0JCQkgICAgIHVuc2lnbmVkIGludCBudW1fYnVmZmVycywgdW5zaWduZWQgaW50IG51bV9wbGFuZXMsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgcGxhbmVfc2l6ZXNbXSkKKwkJCSAgICAgdW5zaWduZWQgaW50IG51bV9idWZmZXJzLCB1bnNpZ25lZCBpbnQgbnVtX3BsYW5lcykKIHsKIAl1bnNpZ25lZCBpbnQgYnVmZmVyOwogCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKQEAgLTE2MywxMyArMTcyLDEzIEBACiAJCXZiLT5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfREVRVUVVRUQ7CiAJCXZiLT52YjJfcXVldWUgPSBxOwogCQl2Yi0+bnVtX3BsYW5lcyA9IG51bV9wbGFuZXM7Ci0JCXZiLT52NGwyX2J1Zi5pbmRleCA9IGJ1ZmZlcjsKKwkJdmItPnY0bDJfYnVmLmluZGV4ID0gcS0+bnVtX2J1ZmZlcnMgKyBidWZmZXI7CiAJCXZiLT52NGwyX2J1Zi50eXBlID0gcS0+dHlwZTsKIAkJdmItPnY0bDJfYnVmLm1lbW9yeSA9IG1lbW9yeTsKIAogCQkvKiBBbGxvY2F0ZSB2aWRlbyBidWZmZXIgbWVtb3J5IGZvciB0aGUgTU1BUCB0eXBlICovCiAJCWlmIChtZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCkgewotCQkJcmV0ID0gX192YjJfYnVmX21lbV9hbGxvYyh2YiwgcGxhbmVfc2l6ZXMpOworCQkJcmV0ID0gX192YjJfYnVmX21lbV9hbGxvYyh2Yik7CiAJCQlpZiAocmV0KSB7CiAJCQkJZHByaW50aygxLCAiRmFpbGVkIGFsbG9jYXRpbmcgbWVtb3J5IGZvciAiCiAJCQkJCQkiYnVmZmVyICVkXG4iLCBidWZmZXIpOwpAQCAtMTkxLDE1ICsyMDAsMTMgQEAKIAkJCX0KIAkJfQogCi0JCXEtPmJ1ZnNbYnVmZmVyXSA9IHZiOworCQlxLT5idWZzW3EtPm51bV9idWZmZXJzICsgYnVmZmVyXSA9IHZiOwogCX0KIAotCXEtPm51bV9idWZmZXJzID0gYnVmZmVyOwotCi0JX19zZXR1cF9vZmZzZXRzKHEpOworCV9fc2V0dXBfb2Zmc2V0cyhxLCBidWZmZXIpOwogCiAJZHByaW50aygxLCAiQWxsb2NhdGVkICVkIGJ1ZmZlcnMsICVkIHBsYW5lKHMpIGVhY2hcbiIsCi0JCQlxLT5udW1fYnVmZmVycywgbnVtX3BsYW5lcyk7CisJCQlidWZmZXIsIG51bV9wbGFuZXMpOwogCiAJcmV0dXJuIGJ1ZmZlcjsKIH0KQEAgLTIwNywxMiArMjE0LDEzIEBACiAvKioKICAqIF9fdmIyX2ZyZWVfbWVtKCkgLSByZWxlYXNlIGFsbCB2aWRlbyBidWZmZXIgbWVtb3J5IGZvciBhIGdpdmVuIHF1ZXVlCiAgKi8KLXN0YXRpYyB2b2lkIF9fdmIyX2ZyZWVfbWVtKHN0cnVjdCB2YjJfcXVldWUgKnEpCitzdGF0aWMgdm9pZCBfX3ZiMl9mcmVlX21lbShzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgYnVmZmVycykKIHsKIAl1bnNpZ25lZCBpbnQgYnVmZmVyOwogCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKIAotCWZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7ICsrYnVmZmVyKSB7CisJZm9yIChidWZmZXIgPSBxLT5udW1fYnVmZmVycyAtIGJ1ZmZlcnM7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOworCSAgICAgKytidWZmZXIpIHsKIAkJdmIgPSBxLT5idWZzW2J1ZmZlcl07CiAJCWlmICghdmIpCiAJCQljb250aW51ZTsKQEAgLTIyNiwxNyArMjM0LDE4IEBACiB9CiAKIC8qKgotICogX192YjJfcXVldWVfZnJlZSgpIC0gZnJlZSB0aGUgcXVldWUgLSB2aWRlbyBtZW1vcnkgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAqIGFuZCByZXR1cm4gdGhlIHF1ZXVlIHRvIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuIE1pZ2h0IGJlIGNhbGxlZCBldmVuIGlmIHRoZQotICogcXVldWUgaGFzIGFscmVhZHkgYmVlbiBmcmVlZC4KKyAqIF9fdmIyX3F1ZXVlX2ZyZWUoKSAtIGZyZWUgYnVmZmVycyBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAtIHZpZGVvIG1lbW9yeSBhbmQKKyAqIHJlbGF0ZWQgaW5mb3JtYXRpb24sIGlmIG5vIGJ1ZmZlcnMgYXJlIGxlZnQgcmV0dXJuIHRoZSBxdWV1ZSB0byBhbgorICogdW5pbml0aWFsaXplZCBzdGF0ZS4gTWlnaHQgYmUgY2FsbGVkIGV2ZW4gaWYgdGhlIHF1ZXVlIGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuCiAgKi8KLXN0YXRpYyB2b2lkIF9fdmIyX3F1ZXVlX2ZyZWUoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3N0YXRpYyB2b2lkIF9fdmIyX3F1ZXVlX2ZyZWUoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGJ1ZmZlcnMpCiB7CiAJdW5zaWduZWQgaW50IGJ1ZmZlcjsKIAogCS8qIENhbGwgZHJpdmVyLXByb3ZpZGVkIGNsZWFudXAgZnVuY3Rpb24gZm9yIGVhY2ggYnVmZmVyLCBpZiBwcm92aWRlZCAqLwogCWlmIChxLT5vcHMtPmJ1Zl9jbGVhbnVwKSB7Ci0JCWZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7ICsrYnVmZmVyKSB7CisJCWZvciAoYnVmZmVyID0gcS0+bnVtX2J1ZmZlcnMgLSBidWZmZXJzOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsKKwkJICAgICArK2J1ZmZlcikgewogCQkJaWYgKE5VTEwgPT0gcS0+YnVmc1tidWZmZXJdKQogCQkJCWNvbnRpbnVlOwogCQkJcS0+b3BzLT5idWZfY2xlYW51cChxLT5idWZzW2J1ZmZlcl0pOwpAQCAtMjQ0LDIzICsyNTMsMjYgQEAKIAl9CiAKIAkvKiBSZWxlYXNlIHZpZGVvIGJ1ZmZlciBtZW1vcnkgKi8KLQlfX3ZiMl9mcmVlX21lbShxKTsKKwlfX3ZiMl9mcmVlX21lbShxLCBidWZmZXJzKTsKIAogCS8qIEZyZWUgdmlkZW9idWYgYnVmZmVycyAqLwotCWZvciAoYnVmZmVyID0gMDsgYnVmZmVyIDwgcS0+bnVtX2J1ZmZlcnM7ICsrYnVmZmVyKSB7CisJZm9yIChidWZmZXIgPSBxLT5udW1fYnVmZmVycyAtIGJ1ZmZlcnM7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOworCSAgICAgKytidWZmZXIpIHsKIAkJa2ZyZWUocS0+YnVmc1tidWZmZXJdKTsKIAkJcS0+YnVmc1tidWZmZXJdID0gTlVMTDsKIAl9CiAKLQlxLT5udW1fYnVmZmVycyA9IDA7Ci0JcS0+bWVtb3J5ID0gMDsKKwlxLT5udW1fYnVmZmVycyAtPSBidWZmZXJzOworCWlmICghcS0+bnVtX2J1ZmZlcnMpCisJCXEtPm1lbW9yeSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnEtPnF1ZXVlZF9saXN0KTsKIH0KIAogLyoqCiAgKiBfX3ZlcmlmeV9wbGFuZXNfYXJyYXkoKSAtIHZlcmlmeSB0aGF0IHRoZSBwbGFuZXMgYXJyYXkgcGFzc2VkIGluIHN0cnVjdAogICogdjRsMl9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgY2FuIGJlIHNhZmVseSB1c2VkCiAgKi8KLXN0YXRpYyBpbnQgX192ZXJpZnlfcGxhbmVzX2FycmF5KHN0cnVjdCB2YjJfYnVmZmVyICp2Yiwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQorc3RhdGljIGludCBfX3ZlcmlmeV9wbGFuZXNfYXJyYXkoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBjb25zdCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7CiAJLyogSXMgbWVtb3J5IGZvciBjb3B5aW5nIHBsYW5lIGluZm9ybWF0aW9uIHByZXNlbnQ/ICovCiAJaWYgKE5VTEwgPT0gYi0+bS5wbGFuZXMpIHsKQEAgLTI3OSwxMyArMjkxLDQ4IEBACiB9CiAKIC8qKgorICogX19idWZmZXJfaW5fdXNlKCkgLSByZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIGluIHVzZSBhbmQKKyAqIHRoZSBxdWV1ZSBjYW5ub3QgYmUgZnJlZWQgKGJ5IHRoZSBtZWFucyBvZiBSRVFCVUZTKDApKSBjYWxsCisgKi8KK3N0YXRpYyBib29sIF9fYnVmZmVyX2luX3VzZShzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJdW5zaWduZWQgaW50IHBsYW5lOworCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHZiLT5udW1fcGxhbmVzOyArK3BsYW5lKSB7CisJCXZvaWQgKm1lbV9wcml2ID0gdmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXY7CisJCS8qCisJCSAqIElmIG51bV91c2VycygpIGhhcyBub3QgYmVlbiBwcm92aWRlZCwgY2FsbF9tZW1vcAorCQkgKiB3aWxsIHJldHVybiAwLCBhcHBhcmVudGx5IG5vYm9keSBjYXJlcyBhYm91dCB0aGlzCisJCSAqIGNhc2UgYW55d2F5LiBJZiBudW1fdXNlcnMoKSByZXR1cm5zIG1vcmUgdGhhbiAxLAorCQkgKiB3ZSBhcmUgbm90IHRoZSBvbmx5IHVzZXIgb2YgdGhlIHBsYW5lJ3MgbWVtb3J5LgorCQkgKi8KKwkJaWYgKG1lbV9wcml2ICYmIGNhbGxfbWVtb3AocSwgcGxhbmUsIG51bV91c2VycywgbWVtX3ByaXYpID4gMSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogX19idWZmZXJzX2luX3VzZSgpIC0gcmV0dXJuIHRydWUgaWYgYW55IGJ1ZmZlcnMgb24gdGhlIHF1ZXVlIGFyZSBpbiB1c2UgYW5kCisgKiB0aGUgcXVldWUgY2Fubm90IGJlIGZyZWVkIChieSB0aGUgbWVhbnMgb2YgUkVRQlVGUygwKSkgY2FsbAorICovCitzdGF0aWMgYm9vbCBfX2J1ZmZlcnNfaW5fdXNlKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJdW5zaWduZWQgaW50IGJ1ZmZlcjsKKwlmb3IgKGJ1ZmZlciA9IDA7IGJ1ZmZlciA8IHEtPm51bV9idWZmZXJzOyArK2J1ZmZlcikgeworCQlpZiAoX19idWZmZXJfaW5fdXNlKHEsIHEtPmJ1ZnNbYnVmZmVyXSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIF9fZmlsbF92NGwyX2J1ZmZlcigpIC0gZmlsbCBpbiBhIHN0cnVjdCB2NGwyX2J1ZmZlciB3aXRoIGluZm9ybWF0aW9uIHRvIGJlCiAgKiByZXR1cm5lZCB0byB1c2Vyc3BhY2UKICAqLwogc3RhdGljIGludCBfX2ZpbGxfdjRsMl9idWZmZXIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7CiAJc3RydWN0IHZiMl9xdWV1ZSAqcSA9IHZiLT52YjJfcXVldWU7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCS8qIENvcHkgYmFjayBkYXRhIHN1Y2ggYXMgdGltZXN0YW1wLCBmbGFncywgaW5wdXQsIGV0Yy4gKi8KIAltZW1jcHkoYiwgJnZiLT52NGwyX2J1Ziwgb2Zmc2V0b2Yoc3RydWN0IHY0bDJfYnVmZmVyLCBtKSk7CkBAIC0zMzIsMTUgKzM3OSwxOCBAQAogCWNhc2UgVkIyX0JVRl9TVEFURV9ET05FOgogCQliLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CiAJCWJyZWFrOworCWNhc2UgVkIyX0JVRl9TVEFURV9QUkVQQVJFRDoKKwkJYi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19QUkVQQVJFRDsKKwkJYnJlYWs7CiAJY2FzZSBWQjJfQlVGX1NUQVRFX0RFUVVFVUVEOgogCQkvKiBub3RoaW5nICovCiAJCWJyZWFrOwogCX0KIAotCWlmICh2Yi0+bnVtX3BsYW5lc19tYXBwZWQgPT0gdmItPm51bV9wbGFuZXMpCisJaWYgKF9fYnVmZmVyX2luX3VzZShxLCB2YikpCiAJCWItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC00MDIsMzMgKzQ1Miw2IEBACiB9CiAKIC8qKgotICogX19idWZmZXJzX2luX3VzZSgpIC0gcmV0dXJuIHRydWUgaWYgYW55IGJ1ZmZlcnMgb24gdGhlIHF1ZXVlIGFyZSBpbiB1c2UgYW5kCi0gKiB0aGUgcXVldWUgY2Fubm90IGJlIGZyZWVkIChieSB0aGUgbWVhbnMgb2YgUkVRQlVGUygwKSkgY2FsbAotICovCi1zdGF0aWMgYm9vbCBfX2J1ZmZlcnNfaW5fdXNlKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0JdW5zaWduZWQgaW50IGJ1ZmZlciwgcGxhbmU7Ci0Jc3RydWN0IHZiMl9idWZmZXIgKnZiOwotCi0JZm9yIChidWZmZXIgPSAwOyBidWZmZXIgPCBxLT5udW1fYnVmZmVyczsgKytidWZmZXIpIHsKLQkJdmIgPSBxLT5idWZzW2J1ZmZlcl07Ci0JCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHZiLT5udW1fcGxhbmVzOyArK3BsYW5lKSB7Ci0JCQkvKgotCQkJICogSWYgbnVtX3VzZXJzKCkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLCBjYWxsX21lbW9wCi0JCQkgKiB3aWxsIHJldHVybiAwLCBhcHBhcmVudGx5IG5vYm9keSBjYXJlcyBhYm91dCB0aGlzCi0JCQkgKiBjYXNlIGFueXdheS4gSWYgbnVtX3VzZXJzKCkgcmV0dXJucyBtb3JlIHRoYW4gMSwKLQkJCSAqIHdlIGFyZSBub3QgdGhlIG9ubHkgdXNlciBvZiB0aGUgcGxhbmUncyBtZW1vcnkuCi0JCQkgKi8KLQkJCWlmIChjYWxsX21lbW9wKHEsIHBsYW5lLCBudW1fdXNlcnMsCi0JCQkJCXZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2KSA+IDEpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogdmIyX3JlcWJ1ZnMoKSAtIEluaXRpYXRlIHN0cmVhbWluZwogICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKICAqIEByZXE6CXN0cnVjdCBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgdG8gdmlkaW9jX3JlcWJ1ZnMgaGFuZGxlciBpbiBkcml2ZXIKQEAgLTQ1Myw4ICs0NzYsNyBAQAogICovCiBpbnQgdmIyX3JlcWJ1ZnMoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKIHsKLQl1bnNpZ25lZCBpbnQgbnVtX2J1ZmZlcnMsIG51bV9wbGFuZXM7Ci0JdW5zaWduZWQgbG9uZyBwbGFuZV9zaXplc1tWSURFT19NQVhfUExBTkVTXTsKKwl1bnNpZ25lZCBpbnQgbnVtX2J1ZmZlcnMsIGFsbG9jYXRlZF9idWZmZXJzLCBudW1fcGxhbmVzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChxLT5maWxlaW8pIHsKQEAgLTUwMiw3ICs1MjQsNyBAQAogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCi0JCV9fdmIyX3F1ZXVlX2ZyZWUocSk7CisJCV9fdmIyX3F1ZXVlX2ZyZWUocSwgcS0+bnVtX2J1ZmZlcnMpOwogCiAJCS8qCiAJCSAqIEluIGNhc2Ugb2YgUkVRQlVGUygwKSByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCBjYWxsaW5nCkBAIC01MTYsNyArNTM4LDcgQEAKIAkgKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgYW5kIGN1cnJlbnQgZGVmYXVsdHMgYXJlIHNhbmUuCiAJICovCiAJbnVtX2J1ZmZlcnMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJlcS0+Y291bnQsIFZJREVPX01BWF9GUkFNRSk7Ci0JbWVtc2V0KHBsYW5lX3NpemVzLCAwLCBzaXplb2YocGxhbmVfc2l6ZXMpKTsKKwltZW1zZXQocS0+cGxhbmVfc2l6ZXMsIDAsIHNpemVvZihxLT5wbGFuZV9zaXplcykpOwogCW1lbXNldChxLT5hbGxvY19jdHgsIDAsIHNpemVvZihxLT5hbGxvY19jdHgpKTsKIAlxLT5tZW1vcnkgPSByZXEtPm1lbW9yeTsKIApAQCAtNTI0LDU3ICs1NDYsMTgwIEBACiAJICogQXNrIHRoZSBkcml2ZXIgaG93IG1hbnkgYnVmZmVycyBhbmQgcGxhbmVzIHBlciBidWZmZXIgaXQgcmVxdWlyZXMuCiAJICogRHJpdmVyIGFsc28gc2V0cyB0aGUgc2l6ZSBhbmQgYWxsb2NhdG9yIGNvbnRleHQgZm9yIGVhY2ggcGxhbmUuCiAJICovCi0JcmV0ID0gY2FsbF9xb3AocSwgcXVldWVfc2V0dXAsIHEsICZudW1fYnVmZmVycywgJm51bV9wbGFuZXMsCi0JCSAgICAgICBwbGFuZV9zaXplcywgcS0+YWxsb2NfY3R4KTsKKwlyZXQgPSBjYWxsX3FvcChxLCBxdWV1ZV9zZXR1cCwgcSwgTlVMTCwgJm51bV9idWZmZXJzLCAmbnVtX3BsYW5lcywKKwkJICAgICAgIHEtPnBsYW5lX3NpemVzLCBxLT5hbGxvY19jdHgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBGaW5hbGx5LCBhbGxvY2F0ZSBidWZmZXJzIGFuZCB2aWRlbyBtZW1vcnkgKi8KLQlyZXQgPSBfX3ZiMl9xdWV1ZV9hbGxvYyhxLCByZXEtPm1lbW9yeSwgbnVtX2J1ZmZlcnMsIG51bV9wbGFuZXMsCi0JCQkJcGxhbmVfc2l6ZXMpOworCXJldCA9IF9fdmIyX3F1ZXVlX2FsbG9jKHEsIHJlcS0+bWVtb3J5LCBudW1fYnVmZmVycywgbnVtX3BsYW5lcyk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCWRwcmludGsoMSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWFsbG9jYXRlZF9idWZmZXJzID0gcmV0OworCiAJLyoKIAkgKiBDaGVjayBpZiBkcml2ZXIgY2FuIGhhbmRsZSB0aGUgYWxsb2NhdGVkIG51bWJlciBvZiBidWZmZXJzLgogCSAqLwotCWlmIChyZXQgPCBudW1fYnVmZmVycykgewotCQl1bnNpZ25lZCBpbnQgb3JpZ19udW1fYnVmZmVyczsKKwlpZiAoYWxsb2NhdGVkX2J1ZmZlcnMgPCBudW1fYnVmZmVycykgeworCQludW1fYnVmZmVycyA9IGFsbG9jYXRlZF9idWZmZXJzOwogCi0JCW9yaWdfbnVtX2J1ZmZlcnMgPSBudW1fYnVmZmVycyA9IHJldDsKLQkJcmV0ID0gY2FsbF9xb3AocSwgcXVldWVfc2V0dXAsIHEsICZudW1fYnVmZmVycywgJm51bV9wbGFuZXMsCi0JCQkgICAgICAgcGxhbmVfc2l6ZXMsIHEtPmFsbG9jX2N0eCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGZyZWVfbWVtOworCQlyZXQgPSBjYWxsX3FvcChxLCBxdWV1ZV9zZXR1cCwgcSwgTlVMTCwgJm51bV9idWZmZXJzLAorCQkJICAgICAgICZudW1fcGxhbmVzLCBxLT5wbGFuZV9zaXplcywgcS0+YWxsb2NfY3R4KTsKIAotCQlpZiAob3JpZ19udW1fYnVmZmVycyA8IG51bV9idWZmZXJzKSB7CisJCWlmICghcmV0ICYmIGFsbG9jYXRlZF9idWZmZXJzIDwgbnVtX2J1ZmZlcnMpCiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBmcmVlX21lbTsKLQkJfQogCiAJCS8qCi0JCSAqIE9rLCBkcml2ZXIgYWNjZXB0ZWQgc21hbGxlciBudW1iZXIgb2YgYnVmZmVycy4KKwkJICogRWl0aGVyIHRoZSBkcml2ZXIgaGFzIGFjY2VwdGVkIGEgc21hbGxlciBudW1iZXIgb2YgYnVmZmVycywKKwkJICogb3IgLnF1ZXVlX3NldHVwKCkgcmV0dXJuZWQgYW4gZXJyb3IKIAkJICovCi0JCXJldCA9IG51bV9idWZmZXJzOworCX0KKworCXEtPm51bV9idWZmZXJzID0gYWxsb2NhdGVkX2J1ZmZlcnM7CisKKwlpZiAocmV0IDwgMCkgeworCQlfX3ZiMl9xdWV1ZV9mcmVlKHEsIGFsbG9jYXRlZF9idWZmZXJzKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKgogCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgYnVmZmVycwogCSAqIHRvIHRoZSB1c2Vyc3BhY2UuCiAJICovCi0JcmVxLT5jb3VudCA9IHJldDsKKwlyZXEtPmNvdW50ID0gYWxsb2NhdGVkX2J1ZmZlcnM7CiAKIAlyZXR1cm4gMDsKLQotZnJlZV9tZW06Ci0JX192YjJfcXVldWVfZnJlZShxKTsKLQlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmIyX3JlcWJ1ZnMpOwogCiAvKioKKyAqIHZiMl9jcmVhdGVfYnVmcygpIC0gQWxsb2NhdGUgYnVmZmVycyBhbmQgYW55IHJlcXVpcmVkIGF1eGlsaWFyeSBzdHJ1Y3RzCisgKiBAcToJCXZpZGVvYnVmMiBxdWV1ZQorICogQGNyZWF0ZToJY3JlYXRpb24gcGFyYW1ldGVycywgcGFzc2VkIGZyb20gdXNlcnNwYWNlIHRvIHZpZGlvY19jcmVhdGVfYnVmcworICoJCWhhbmRsZXIgaW4gZHJpdmVyCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHZpZGlvY19jcmVhdGVfYnVmcyBpb2N0bCBoYW5kbGVyIG9mIGEgZHJpdmVyLgorICogVGhpcyBmdW5jdGlvbjoKKyAqIDEpIHZlcmlmaWVzIHBhcmFtZXRlciBzYW5pdHkKKyAqIDIpIGNhbGxzIHRoZSAucXVldWVfc2V0dXAoKSBxdWV1ZSBvcGVyYXRpb24KKyAqIDMpIHBlcmZvcm1zIGFueSBuZWNlc3NhcnkgbWVtb3J5IGFsbG9jYXRpb25zCisgKgorICogVGhlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGlzIGZ1bmN0aW9uIGFyZSBpbnRlbmRlZCB0byBiZSBkaXJlY3RseSByZXR1cm5lZAorICogZnJvbSB2aWRpb2NfY3JlYXRlX2J1ZnMgaGFuZGxlciBpbiBkcml2ZXIuCisgKi8KK2ludCB2YjJfY3JlYXRlX2J1ZnMoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgKmNyZWF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbnVtX3BsYW5lcyA9IDAsIG51bV9idWZmZXJzLCBhbGxvY2F0ZWRfYnVmZmVyczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChxLT5maWxlaW8pIHsKKwkJZHByaW50aygxLCAiJXMoKTogZmlsZSBpbyBpbiBwcm9ncmVzc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChjcmVhdGUtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQCisJCQkmJiBjcmVhdGUtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9VU0VSUFRSKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IHVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjcmVhdGUtPmZvcm1hdC50eXBlICE9IHEtPnR5cGUpIHsKKwkJZHByaW50aygxLCAiJXMoKTogcmVxdWVzdGVkIHR5cGUgaXMgaW5jb3JyZWN0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGFsbCB0aGUgcmVxdWlyZWQgbWVtb3J5IG9wcyBmb3IgZ2l2ZW4gbWVtb3J5IHR5cGUKKwkgKiBhcmUgYXZhaWxhYmxlLgorCSAqLworCWlmIChjcmVhdGUtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQICYmIF9fdmVyaWZ5X21tYXBfb3BzKHEpKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IE1NQVAgZm9yIGN1cnJlbnQgc2V0dXAgdW5zdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNyZWF0ZS0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIgJiYgX192ZXJpZnlfdXNlcnB0cl9vcHMocSkpIHsKKwkJZHByaW50aygxLCAiJXMoKTogVVNFUlBUUiBmb3IgY3VycmVudCBzZXR1cCB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocS0+bnVtX2J1ZmZlcnMgPT0gVklERU9fTUFYX0ZSQU1FKSB7CisJCWRwcmludGsoMSwgIiVzKCk6IG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwljcmVhdGUtPmluZGV4ID0gcS0+bnVtX2J1ZmZlcnM7CisKKwlpZiAoIXEtPm51bV9idWZmZXJzKSB7CisJCW1lbXNldChxLT5wbGFuZV9zaXplcywgMCwgc2l6ZW9mKHEtPnBsYW5lX3NpemVzKSk7CisJCW1lbXNldChxLT5hbGxvY19jdHgsIDAsIHNpemVvZihxLT5hbGxvY19jdHgpKTsKKwkJcS0+bWVtb3J5ID0gY3JlYXRlLT5tZW1vcnk7CisJfQorCisJbnVtX2J1ZmZlcnMgPSBtaW4oY3JlYXRlLT5jb3VudCwgVklERU9fTUFYX0ZSQU1FIC0gcS0+bnVtX2J1ZmZlcnMpOworCisJLyoKKwkgKiBBc2sgdGhlIGRyaXZlciwgd2hldGhlciB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzLCBwbGFuZXMgcGVyCisJICogYnVmZmVyIGFuZCB0aGVpciBzaXplcyBhcmUgYWNjZXB0YWJsZQorCSAqLworCXJldCA9IGNhbGxfcW9wKHEsIHF1ZXVlX3NldHVwLCBxLCAmY3JlYXRlLT5mb3JtYXQsICZudW1fYnVmZmVycywKKwkJICAgICAgICZudW1fcGxhbmVzLCBxLT5wbGFuZV9zaXplcywgcS0+YWxsb2NfY3R4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRmluYWxseSwgYWxsb2NhdGUgYnVmZmVycyBhbmQgdmlkZW8gbWVtb3J5ICovCisJcmV0ID0gX192YjJfcXVldWVfYWxsb2MocSwgY3JlYXRlLT5tZW1vcnksIG51bV9idWZmZXJzLAorCQkJCW51bV9wbGFuZXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRwcmludGsoMSwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCB3aXRoIGVycm9yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhbGxvY2F0ZWRfYnVmZmVycyA9IHJldDsKKworCS8qCisJICogQ2hlY2sgaWYgZHJpdmVyIGNhbiBoYW5kbGUgdGhlIHNvIGZhciBhbGxvY2F0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMuCisJICovCisJaWYgKHJldCA8IG51bV9idWZmZXJzKSB7CisJCW51bV9idWZmZXJzID0gcmV0OworCisJCS8qCisJCSAqIHEtPm51bV9idWZmZXJzIGNvbnRhaW5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycywgdGhhdCB0aGUKKwkJICogcXVldWUgZHJpdmVyIGhhcyBzZXQgdXAKKwkJICovCisJCXJldCA9IGNhbGxfcW9wKHEsIHF1ZXVlX3NldHVwLCBxLCAmY3JlYXRlLT5mb3JtYXQsICZudW1fYnVmZmVycywKKwkJCSAgICAgICAmbnVtX3BsYW5lcywgcS0+cGxhbmVfc2l6ZXMsIHEtPmFsbG9jX2N0eCk7CisKKwkJaWYgKCFyZXQgJiYgYWxsb2NhdGVkX2J1ZmZlcnMgPCBudW1fYnVmZmVycykKKwkJCXJldCA9IC1FTk9NRU07CisKKwkJLyoKKwkJICogRWl0aGVyIHRoZSBkcml2ZXIgaGFzIGFjY2VwdGVkIGEgc21hbGxlciBudW1iZXIgb2YgYnVmZmVycywKKwkJICogb3IgLnF1ZXVlX3NldHVwKCkgcmV0dXJuZWQgYW4gZXJyb3IKKwkJICovCisJfQorCisJcS0+bnVtX2J1ZmZlcnMgKz0gYWxsb2NhdGVkX2J1ZmZlcnM7CisKKwlpZiAocmV0IDwgMCkgeworCQlfX3ZiMl9xdWV1ZV9mcmVlKHEsIGFsbG9jYXRlZF9idWZmZXJzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgYnVmZmVycworCSAqIHRvIHRoZSB1c2Vyc3BhY2UuCisJICovCisJY3JlYXRlLT5jb3VudCA9IGFsbG9jYXRlZF9idWZmZXJzOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2YjJfY3JlYXRlX2J1ZnMpOworCisvKioKICAqIHZiMl9wbGFuZV92YWRkcigpIC0gUmV0dXJuIGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBvZiBhIGdpdmVuIHBsYW5lCiAgKiBAdmI6CQl2YjJfYnVmZmVyIHRvIHdoaWNoIHRoZSBwbGFuZSBpbiBxdWVzdGlvbiBiZWxvbmdzIHRvCiAgKiBAcGxhbmVfbm86CXBsYW5lIG51bWJlciBmb3Igd2hpY2ggdGhlIGFkZHJlc3MgaXMgdG8gYmUgcmV0dXJuZWQKQEAgLTY1OCw3ICs4MDMsNyBAQAogICogX19maWxsX3ZiMl9idWZmZXIoKSAtIGZpbGwgYSB2YjJfYnVmZmVyIHdpdGggaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4KICAqIGEgdjRsMl9idWZmZXIgYnkgdGhlIHVzZXJzcGFjZQogICovCi1zdGF0aWMgaW50IF9fZmlsbF92YjJfYnVmZmVyKHN0cnVjdCB2YjJfYnVmZmVyICp2Yiwgc3RydWN0IHY0bDJfYnVmZmVyICpiLAorc3RhdGljIGludCBfX2ZpbGxfdmIyX2J1ZmZlcihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIGNvbnN0IHN0cnVjdCB2NGwyX2J1ZmZlciAqYiwKIAkJCQlzdHJ1Y3QgdjRsMl9wbGFuZSAqdjRsMl9wbGFuZXMpCiB7CiAJdW5zaWduZWQgaW50IHBsYW5lOwpAQCAtNzIyLDcgKzg2Nyw3IEBACiAvKioKICAqIF9fcWJ1Zl91c2VycHRyKCkgLSBoYW5kbGUgcWJ1ZiBvZiBhIFVTRVJQVFIgYnVmZmVyCiAgKi8KLXN0YXRpYyBpbnQgX19xYnVmX3VzZXJwdHIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCitzdGF0aWMgaW50IF9fcWJ1Zl91c2VycHRyKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwgY29uc3Qgc3RydWN0IHY0bDJfYnVmZmVyICpiKQogewogCXN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKIAlzdHJ1Y3QgdmIyX3F1ZXVlICpxID0gdmItPnZiMl9xdWV1ZTsKQEAgLTc0NSwxMiArODkwLDIwIEBACiAJCWRwcmludGsoMywgInFidWY6IHVzZXJzcGFjZSBhZGRyZXNzIGZvciBwbGFuZSAlZCBjaGFuZ2VkLCAiCiAJCQkJInJlYWNxdWlyaW5nIG1lbW9yeVxuIiwgcGxhbmUpOwogCisJCS8qIENoZWNrIGlmIHRoZSBwcm92aWRlZCBwbGFuZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCisJCWlmIChwbGFuZXNbcGxhbmVdLmxlbmd0aCA8IHEtPnBsYW5lX3NpemVzW3BsYW5lXSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKIAkJLyogUmVsZWFzZSBwcmV2aW91c2x5IGFjcXVpcmVkIG1lbW9yeSBpZiBwcmVzZW50ICovCiAJCWlmICh2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdikKIAkJCWNhbGxfbWVtb3AocSwgcGxhbmUsIHB1dF91c2VycHRyLAogCQkJCQl2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdik7CiAKIAkJdmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXYgPSBOVUxMOworCQl2Yi0+djRsMl9wbGFuZXNbcGxhbmVdLm0udXNlcnB0ciA9IDA7CisJCXZiLT52NGwyX3BsYW5lc1twbGFuZV0ubGVuZ3RoID0gMDsKIAogCQkvKiBBY3F1aXJlIGVhY2ggcGxhbmUncyBtZW1vcnkgKi8KIAkJaWYgKHEtPm1lbV9vcHMtPmdldF91c2VycHRyKSB7CkBAIC03ODgsMTAgKzk0MSwxMyBAQAogCXJldHVybiAwOwogZXJyOgogCS8qIEluIGNhc2Ugb2YgZXJyb3JzLCByZWxlYXNlIHBsYW5lcyB0aGF0IHdlcmUgYWxyZWFkeSBhY3F1aXJlZCAqLwotCWZvciAoOyBwbGFuZSA+IDA7IC0tcGxhbmUpIHsKLQkJY2FsbF9tZW1vcChxLCBwbGFuZSwgcHV0X3VzZXJwdHIsCi0JCQkJdmItPnBsYW5lc1twbGFuZSAtIDFdLm1lbV9wcml2KTsKLQkJdmItPnBsYW5lc1twbGFuZSAtIDFdLm1lbV9wcml2ID0gTlVMTDsKKwlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCB2Yi0+bnVtX3BsYW5lczsgKytwbGFuZSkgeworCQlpZiAodmItPnBsYW5lc1twbGFuZV0ubWVtX3ByaXYpCisJCQljYWxsX21lbW9wKHEsIHBsYW5lLCBwdXRfdXNlcnB0ciwKKwkJCQkgICB2Yi0+cGxhbmVzW3BsYW5lXS5tZW1fcHJpdik7CisJCXZiLT5wbGFuZXNbcGxhbmVdLm1lbV9wcml2ID0gTlVMTDsKKwkJdmItPnY0bDJfcGxhbmVzW3BsYW5lXS5tLnVzZXJwdHIgPSAwOworCQl2Yi0+djRsMl9wbGFuZXNbcGxhbmVdLmxlbmd0aCA9IDA7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTgwMCw3ICs5NTYsNyBAQAogLyoqCiAgKiBfX3FidWZfbW1hcCgpIC0gaGFuZGxlIHFidWYgb2YgYW4gTU1BUCBidWZmZXIKICAqLwotc3RhdGljIGludCBfX3FidWZfbW1hcChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKK3N0YXRpYyBpbnQgX19xYnVmX21tYXAoc3RydWN0IHZiMl9idWZmZXIgKnZiLCBjb25zdCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCiB7CiAJcmV0dXJuIF9fZmlsbF92YjJfYnVmZmVyKHZiLCBiLCB2Yi0+djRsMl9wbGFuZXMpOwogfQpAQCAtODE3LDYgKzk3Myw5NSBAQAogCXEtPm9wcy0+YnVmX3F1ZXVlKHZiKTsKIH0KIAorc3RhdGljIGludCBfX2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YiwgY29uc3Qgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCB2YjJfcXVldWUgKnEgPSB2Yi0+dmIyX3F1ZXVlOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHEtPm1lbW9yeSkgeworCWNhc2UgVjRMMl9NRU1PUllfTU1BUDoKKwkJcmV0ID0gX19xYnVmX21tYXAodmIsIGIpOworCQlicmVhazsKKwljYXNlIFY0TDJfTUVNT1JZX1VTRVJQVFI6CisJCXJldCA9IF9fcWJ1Zl91c2VycHRyKHZiLCBiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiSW52YWxpZCBxdWV1ZSB0eXBlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gY2FsbF9xb3AocSwgYnVmX3ByZXBhcmUsIHZiKTsKKwlpZiAocmV0KQorCQlkcHJpbnRrKDEsICJxYnVmOiBidWZmZXIgcHJlcGFyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwllbHNlCisJCXZiLT5zdGF0ZSA9IFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZiMl9wcmVwYXJlX2J1ZigpIC0gUGFzcyBvd25lcnNoaXAgb2YgYSBidWZmZXIgZnJvbSB1c2Vyc3BhY2UgdG8gdGhlIGtlcm5lbAorICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKKyAqIEBiOgkJYnVmZmVyIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgdG8gdmlkaW9jX3ByZXBhcmVfYnVmCisgKgkJaGFuZGxlciBpbiBkcml2ZXIKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdmlkaW9jX3ByZXBhcmVfYnVmIGlvY3RsIGhhbmRsZXIgb2YgYSBkcml2ZXIuCisgKiBUaGlzIGZ1bmN0aW9uOgorICogMSkgdmVyaWZpZXMgdGhlIHBhc3NlZCBidWZmZXIsCisgKiAyKSBjYWxscyBidWZfcHJlcGFyZSBjYWxsYmFjayBpbiB0aGUgZHJpdmVyIChpZiBwcm92aWRlZCksIGluIHdoaWNoCisgKiAgICBkcml2ZXItc3BlY2lmaWMgYnVmZmVyIGluaXRpYWxpemF0aW9uIGNhbiBiZSBwZXJmb3JtZWQsCisgKgorICogVGhlIHJldHVybiB2YWx1ZXMgZnJvbSB0aGlzIGZ1bmN0aW9uIGFyZSBpbnRlbmRlZCB0byBiZSBkaXJlY3RseSByZXR1cm5lZAorICogZnJvbSB2aWRpb2NfcHJlcGFyZV9idWYgaGFuZGxlciBpbiBkcml2ZXIuCisgKi8KK2ludCB2YjJfcHJlcGFyZV9idWYoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQoreworCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKKwlpbnQgcmV0OworCisJaWYgKHEtPmZpbGVpbykgeworCQlkcHJpbnRrKDEsICIlcygpOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGItPnR5cGUgIT0gcS0+dHlwZSkgeworCQlkcHJpbnRrKDEsICIlcygpOiBpbnZhbGlkIGJ1ZmZlciB0eXBlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChiLT5pbmRleCA+PSBxLT5udW1fYnVmZmVycykgeworCQlkcHJpbnRrKDEsICIlcygpOiBidWZmZXIgaW5kZXggb3V0IG9mIHJhbmdlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZiID0gcS0+YnVmc1tiLT5pbmRleF07CisJaWYgKE5VTEwgPT0gdmIpIHsKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlkcHJpbnRrKDEsICIlcygpOiBidWZmZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYi0+bWVtb3J5ICE9IHEtPm1lbW9yeSkgeworCQlkcHJpbnRrKDEsICIlcygpOiBpbnZhbGlkIG1lbW9yeSB0eXBlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2Yi0+c3RhdGUgIT0gVkIyX0JVRl9TVEFURV9ERVFVRVVFRCkgeworCQlkcHJpbnRrKDEsICIlcygpOiBpbnZhbGlkIGJ1ZmZlciBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHZiLT5zdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IF9fYnVmX3ByZXBhcmUodmIsIGIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJX19maWxsX3Y0bDJfYnVmZmVyKHZiLCBiKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmIyX3ByZXBhcmVfYnVmKTsKKwogLyoqCiAgKiB2YjJfcWJ1ZigpIC0gUXVldWUgYSBidWZmZXIgZnJvbSB1c2Vyc3BhY2UKICAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCkBAIC04MjYsOCArMTA3MSw4IEBACiAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdmlkaW9jX3FidWYgaW9jdGwgaGFuZGxlciBvZiBhIGRyaXZlci4KICAqIFRoaXMgZnVuY3Rpb246CiAgKiAxKSB2ZXJpZmllcyB0aGUgcGFzc2VkIGJ1ZmZlciwKLSAqIDIpIGNhbGxzIGJ1Zl9wcmVwYXJlIGNhbGxiYWNrIGluIHRoZSBkcml2ZXIgKGlmIHByb3ZpZGVkKSwgaW4gd2hpY2gKLSAqICAgIGRyaXZlci1zcGVjaWZpYyBidWZmZXIgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZCwKKyAqIDIpIGlmIG5lY2Vzc2FyeSwgY2FsbHMgYnVmX3ByZXBhcmUgY2FsbGJhY2sgaW4gdGhlIGRyaXZlciAoaWYgcHJvdmlkZWQpLCBpbgorICogICAgd2hpY2ggZHJpdmVyLXNwZWNpZmljIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBjYW4gYmUgcGVyZm9ybWVkLAogICogMykgaWYgc3RyZWFtaW5nIGlzIG9uLCBxdWV1ZXMgdGhlIGJ1ZmZlciBpbiBkcml2ZXIgYnkgdGhlIG1lYW5zIG9mIGJ1Zl9xdWV1ZQogICogICAgY2FsbGJhY2sgZm9yIHByb2Nlc3NpbmcuCiAgKgpAQCAtODM3LDcgKzEwODIsNyBAQAogaW50IHZiMl9xYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYikKIHsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChxLT5maWxlaW8pIHsKIAkJZHByaW50aygxLCAicWJ1ZjogZmlsZSBpbyBpbiBwcm9ncmVzc1xuIik7CkBAIC04NjYsMjkgKzExMTEsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHZiLT5zdGF0ZSAhPSBWQjJfQlVGX1NUQVRFX0RFUVVFVUVEKSB7CisJc3dpdGNoICh2Yi0+c3RhdGUpIHsKKwljYXNlIFZCMl9CVUZfU1RBVEVfREVRVUVVRUQ6CisJCXJldCA9IF9fYnVmX3ByZXBhcmUodmIsIGIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwljYXNlIFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWRwcmludGsoMSwgInFidWY6IGJ1ZmZlciBhbHJlYWR5IGluIHVzZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChxLT5tZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUCkKLQkJcmV0ID0gX19xYnVmX21tYXAodmIsIGIpOwotCWVsc2UgaWYgKHEtPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSKQotCQlyZXQgPSBfX3FidWZfdXNlcnB0cih2YiwgYik7Ci0JZWxzZSB7Ci0JCVdBUk4oMSwgIkludmFsaWQgcXVldWUgdHlwZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjYWxsX3FvcChxLCBidWZfcHJlcGFyZSwgdmIpOwotCWlmIChyZXQpIHsKLQkJZHByaW50aygxLCAicWJ1ZjogYnVmZmVyIHByZXBhcmF0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyoKIAkgKiBBZGQgdG8gdGhlIHF1ZXVlZCBidWZmZXJzIGxpc3QsIGEgYnVmZmVyIHdpbGwgc3RheSBvbiBpdCB1bnRpbAogCSAqIGRlcXVldWVkIGluIGRxYnVmLgpAQCAtOTAzLDYgKzExMzcsOSBAQAogCWlmIChxLT5zdHJlYW1pbmcpCiAJCV9fZW5xdWV1ZV9pbl9kcml2ZXIodmIpOwogCisJLyogRmlsbCBidWZmZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2Vyc3BhY2UgKi8KKwlfX2ZpbGxfdjRsMl9idWZmZXIodmIsIGIpOworCiAJZHByaW50aygxLCAicWJ1ZiBvZiBidWZmZXIgJWQgc3VjY2VlZGVkXG4iLCB2Yi0+djRsMl9idWYuaW5kZXgpOwogCXJldHVybiAwOwogfQpAQCAtMTA5Niw3MyArMTMzMyw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfZHFidWYpOwogCiAvKioKLSAqIHZiMl9zdHJlYW1vbiAtIHN0YXJ0IHN0cmVhbWluZwotICogQHE6CQl2aWRlb2J1ZjIgcXVldWUKLSAqIEB0eXBlOgl0eXBlIGFyZ3VtZW50IHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB0byB2aWRpb2Nfc3RyZWFtb24gaGFuZGxlcgotICoKLSAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB2aWRpb2Nfc3RyZWFtb24gaGFuZGxlciBvZiBhIGRyaXZlci4KLSAqIFRoaXMgZnVuY3Rpb246Ci0gKiAxKSB2ZXJpZmllcyBjdXJyZW50IHN0YXRlCi0gKiAyKSBzdGFydHMgc3RyZWFtaW5nIGFuZCBwYXNzZXMgYW55IHByZXZpb3VzbHkgcXVldWVkIGJ1ZmZlcnMgdG8gdGhlIGRyaXZlcgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgZGlyZWN0bHkgcmV0dXJuZWQKLSAqIGZyb20gdmlkaW9jX3N0cmVhbW9uIGhhbmRsZXIgaW4gdGhlIGRyaXZlci4KLSAqLwotaW50IHZiMl9zdHJlYW1vbihzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7Ci0JaW50IHJldDsKLQotCWlmIChxLT5maWxlaW8pIHsKLQkJZHByaW50aygxLCAic3RyZWFtb246IGZpbGUgaW8gaW4gcHJvZ3Jlc3NcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICh0eXBlICE9IHEtPnR5cGUpIHsKLQkJZHByaW50aygxLCAic3RyZWFtb246IGludmFsaWQgc3RyZWFtIHR5cGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocS0+c3RyZWFtaW5nKSB7Ci0JCWRwcmludGsoMSwgInN0cmVhbW9uOiBhbHJlYWR5IHN0cmVhbWluZ1xuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyoKLQkgKiBDYW5ub3Qgc3RhcnQgc3RyZWFtaW5nIG9uIGFuIE9VVFBVVCBkZXZpY2UgaWYgbm8gYnVmZmVycyBoYXZlCi0JICogYmVlbiBxdWV1ZWQgeWV0LgotCSAqLwotCWlmIChWNEwyX1RZUEVfSVNfT1VUUFVUKHEtPnR5cGUpKSB7Ci0JCWlmIChsaXN0X2VtcHR5KCZxLT5xdWV1ZWRfbGlzdCkpIHsKLQkJCWRwcmludGsoMSwgInN0cmVhbW9uOiBubyBvdXRwdXQgYnVmZmVycyBxdWV1ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExldCBkcml2ZXIgbm90aWNlIHRoYXQgc3RyZWFtaW5nIHN0YXRlIGhhcyBiZWVuIGVuYWJsZWQuCi0JICovCi0JcmV0ID0gY2FsbF9xb3AocSwgc3RhcnRfc3RyZWFtaW5nLCBxKTsKLQlpZiAocmV0KSB7Ci0JCWRwcmludGsoMSwgInN0cmVhbW9uOiBkcml2ZXIgcmVmdXNlZCB0byBzdGFydCBzdHJlYW1pbmdcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXEtPnN0cmVhbWluZyA9IDE7Ci0KLQkvKgotCSAqIElmIGFueSBidWZmZXJzIHdlcmUgcXVldWVkIGJlZm9yZSBzdHJlYW1vbiwKLQkgKiB3ZSBjYW4gbm93IHBhc3MgdGhlbSB0byBkcml2ZXIgZm9yIHByb2Nlc3NpbmcuCi0JICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2YiwgJnEtPnF1ZXVlZF9saXN0LCBxdWV1ZWRfZW50cnkpCi0JCV9fZW5xdWV1ZV9pbl9kcml2ZXIodmIpOwotCi0JZHByaW50aygzLCAiU3RyZWFtb24gc3VjY2Vzc2Z1bFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2YjJfc3RyZWFtb24pOwotCi0vKioKICAqIF9fdmIyX3F1ZXVlX2NhbmNlbCgpIC0gY2FuY2VsIGFuZCBzdG9wIChwYXVzZSkgc3RyZWFtaW5nCiAgKgogICogUmVtb3ZlcyBhbGwgcXVldWVkIGJ1ZmZlcnMgZnJvbSBkcml2ZXIncyBxdWV1ZSBhbmQgYWxsIGJ1ZmZlcnMgcXVldWVkIGJ5CkBAIC0xMjAwLDYgKzEzNzAsNjQgQEAKIH0KIAogLyoqCisgKiB2YjJfc3RyZWFtb24gLSBzdGFydCBzdHJlYW1pbmcKKyAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCisgKiBAdHlwZToJdHlwZSBhcmd1bWVudCBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgdG8gdmlkaW9jX3N0cmVhbW9uIGhhbmRsZXIKKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdmlkaW9jX3N0cmVhbW9uIGhhbmRsZXIgb2YgYSBkcml2ZXIuCisgKiBUaGlzIGZ1bmN0aW9uOgorICogMSkgdmVyaWZpZXMgY3VycmVudCBzdGF0ZQorICogMikgcGFzc2VzIGFueSBwcmV2aW91c2x5IHF1ZXVlZCBidWZmZXJzIHRvIHRoZSBkcml2ZXIgYW5kIHN0YXJ0cyBzdHJlYW1pbmcKKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlcyBmcm9tIHRoaXMgZnVuY3Rpb24gYXJlIGludGVuZGVkIHRvIGJlIGRpcmVjdGx5IHJldHVybmVkCisgKiBmcm9tIHZpZGlvY19zdHJlYW1vbiBoYW5kbGVyIGluIHRoZSBkcml2ZXIuCisgKi8KK2ludCB2YjJfc3RyZWFtb24oc3RydWN0IHZiMl9xdWV1ZSAqcSwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCWludCByZXQ7CisKKwlpZiAocS0+ZmlsZWlvKSB7CisJCWRwcmludGsoMSwgInN0cmVhbW9uOiBmaWxlIGlvIGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodHlwZSAhPSBxLT50eXBlKSB7CisJCWRwcmludGsoMSwgInN0cmVhbW9uOiBpbnZhbGlkIHN0cmVhbSB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHEtPnN0cmVhbWluZykgeworCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogYWxyZWFkeSBzdHJlYW1pbmdcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qCisJICogSWYgYW55IGJ1ZmZlcnMgd2VyZSBxdWV1ZWQgYmVmb3JlIHN0cmVhbW9uLAorCSAqIHdlIGNhbiBub3cgcGFzcyB0aGVtIHRvIGRyaXZlciBmb3IgcHJvY2Vzc2luZy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZiLCAmcS0+cXVldWVkX2xpc3QsIHF1ZXVlZF9lbnRyeSkKKwkJX19lbnF1ZXVlX2luX2RyaXZlcih2Yik7CisKKwkvKgorCSAqIExldCBkcml2ZXIgbm90aWNlIHRoYXQgc3RyZWFtaW5nIHN0YXRlIGhhcyBiZWVuIGVuYWJsZWQuCisJICovCisJcmV0ID0gY2FsbF9xb3AocSwgc3RhcnRfc3RyZWFtaW5nLCBxLCBhdG9taWNfcmVhZCgmcS0+cXVldWVkX2NvdW50KSk7CisJaWYgKHJldCkgeworCQlkcHJpbnRrKDEsICJzdHJlYW1vbjogZHJpdmVyIHJlZnVzZWQgdG8gc3RhcnQgc3RyZWFtaW5nXG4iKTsKKwkJX192YjJfcXVldWVfY2FuY2VsKHEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXEtPnN0cmVhbWluZyA9IDE7CisKKwlkcHJpbnRrKDMsICJTdHJlYW1vbiBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZiMl9zdHJlYW1vbik7CisKKworLyoqCiAgKiB2YjJfc3RyZWFtb2ZmIC0gc3RvcCBzdHJlYW1pbmcKICAqIEBxOgkJdmlkZW9idWYyIHF1ZXVlCiAgKiBAdHlwZToJdHlwZSBhcmd1bWVudCBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UgdG8gdmlkaW9jX3N0cmVhbW9mZiBoYW5kbGVyCkBAIC0xMzM2LDE0ICsxNTY0LDQyIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXZiX3BsYW5lLT5tYXBwZWQgPSAxOwotCXZiLT5udW1fcGxhbmVzX21hcHBlZCsrOwotCiAJZHByaW50aygzLCAiQnVmZmVyICVkLCBwbGFuZSAlZCBzdWNjZXNzZnVsbHkgbWFwcGVkXG4iLCBidWZmZXIsIHBsYW5lKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9tbWFwKTsKIAorI2lmbmRlZiBDT05GSUdfTU1VCit1bnNpZ25lZCBsb25nIHZiMl9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgdmIyX3F1ZXVlICpxLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgb2ZmID0gcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmI7CisJdW5zaWduZWQgaW50IGJ1ZmZlciwgcGxhbmU7CisJaW50IHJldDsKKworCWlmIChxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQlkcHJpbnRrKDEsICJRdWV1ZSBpcyBub3QgY3VycmVudGx5IHNldCB1cCBmb3IgbW1hcFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogRmluZCB0aGUgcGxhbmUgY29ycmVzcG9uZGluZyB0byB0aGUgb2Zmc2V0IHBhc3NlZCBieSB1c2Vyc3BhY2UuCisJICovCisJcmV0ID0gX19maW5kX3BsYW5lX2J5X29mZnNldChxLCBvZmYsICZidWZmZXIsICZwbGFuZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZiID0gcS0+YnVmc1tidWZmZXJdOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXZiMl9wbGFuZV92YWRkcih2YiwgcGxhbmUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmIyX2dldF91bm1hcHBlZF9hcmVhKTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IF9fdmIyX2luaXRfZmlsZWlvKHN0cnVjdCB2YjJfcXVldWUgKnEsIGludCByZWFkKTsKIHN0YXRpYyBpbnQgX192YjJfY2xlYW51cF9maWxlaW8oc3RydWN0IHZiMl9xdWV1ZSAqcSk7CiAKQEAgLTE0NjEsNyArMTcxNyw3IEBACiB7CiAJX192YjJfY2xlYW51cF9maWxlaW8ocSk7CiAJX192YjJfcXVldWVfY2FuY2VsKHEpOwotCV9fdmIyX3F1ZXVlX2ZyZWUocSk7CisJX192YjJfcXVldWVfZnJlZShxLCBxLT5udW1fYnVmZmVycyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2YjJfcXVldWVfcmVsZWFzZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1jb250aWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1jb250aWcuYwppbmRleCBhNzkwYTVmLi5mMTdhZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCkBAIC0yNCw3ICsyNCw3IEBACiBzdHJ1Y3QgdmIyX2RjX2J1ZiB7CiAJc3RydWN0IHZiMl9kY19jb25mCQkqY29uZjsKIAl2b2lkCQkJCSp2YWRkcjsKLQlkbWFfYWRkcl90CQkJcGFkZHI7CisJZG1hX2FkZHJfdAkJCWRtYV9hZGRyOwogCXVuc2lnbmVkIGxvbmcJCQlzaXplOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAkJKnZtYTsKIAlhdG9taWNfdAkJCXJlZmNvdW50OwpAQCAtNDIsNyArNDIsNyBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWJ1Zi0+dmFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoY29uZi0+ZGV2LCBzaXplLCAmYnVmLT5wYWRkciwKKwlidWYtPnZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGNvbmYtPmRldiwgc2l6ZSwgJmJ1Zi0+ZG1hX2FkZHIsCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghYnVmLT52YWRkcikgewogCQlkZXZfZXJyKGNvbmYtPmRldiwgImRtYV9hbGxvY19jb2hlcmVudCBvZiBzaXplICVsZCBmYWlsZWRcbiIsCkBAIC02OSw3ICs2OSw3IEBACiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnVmLT5yZWZjb3VudCkpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoYnVmLT5jb25mLT5kZXYsIGJ1Zi0+c2l6ZSwgYnVmLT52YWRkciwKLQkJCQkgIGJ1Zi0+cGFkZHIpOworCQkJCSAgYnVmLT5kbWFfYWRkcik7CiAJCWtmcmVlKGJ1Zik7CiAJfQogfQpAQCAtNzgsNyArNzgsNyBAQAogewogCXN0cnVjdCB2YjJfZGNfYnVmICpidWYgPSBidWZfcHJpdjsKIAotCXJldHVybiAmYnVmLT5wYWRkcjsKKwlyZXR1cm4gJmJ1Zi0+ZG1hX2FkZHI7CiB9CiAKIHN0YXRpYyB2b2lkICp2YjJfZG1hX2NvbnRpZ192YWRkcih2b2lkICpidWZfcHJpdikKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gdmIyX21tYXBfcGZuX3JhbmdlKHZtYSwgYnVmLT5wYWRkciwgYnVmLT5zaXplLAorCXJldHVybiB2YjJfbW1hcF9wZm5fcmFuZ2Uodm1hLCBidWYtPmRtYV9hZGRyLCBidWYtPnNpemUsCiAJCQkJICAmdmIyX2NvbW1vbl92bV9vcHMsICZidWYtPmhhbmRsZXIpOwogfQogCkBAIC0xMTUsMTQgKzExNSwxNCBAQAogewogCXN0cnVjdCB2YjJfZGNfYnVmICpidWY7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0JZG1hX2FkZHJfdCBwYWRkciA9IDA7CisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IDA7CiAJaW50IHJldDsKIAogCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mICpidWYsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXJldCA9IHZiMl9nZXRfY29udGlnX3VzZXJwdHIodmFkZHIsIHNpemUsICZ2bWEsICZwYWRkcik7CisJcmV0ID0gdmIyX2dldF9jb250aWdfdXNlcnB0cih2YWRkciwgc2l6ZSwgJnZtYSwgJmRtYV9hZGRyKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIGFjcXVpcmluZyBWTUEgZm9yIHZhZGRyIDB4JTA4bHhcbiIsCiAJCQkJdmFkZHIpOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJfQogCiAJYnVmLT5zaXplID0gc2l6ZTsKLQlidWYtPnBhZGRyID0gcGFkZHI7CisJYnVmLT5kbWFfYWRkciA9IGRtYV9hZGRyOwogCWJ1Zi0+dm1hID0gdm1hOwogCiAJcmV0dXJuIGJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLWRtYS1zZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMKaW5kZXggMDY1ZjQ2OC4uM2JhZDhiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMKQEAgLTc1LDEyICs3NSw2IEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFsbG9jYXRlZCBidWZmZXIgb2YgJWQgcGFnZXNcbiIsCiAJCV9fZnVuY19fLCBidWYtPnNnX2Rlc2MubnVtX3BhZ2VzKTsKLQotCWlmICghYnVmLT52YWRkcikKLQkJYnVmLT52YWRkciA9IHZtX21hcF9yYW0oYnVmLT5wYWdlcywKLQkJCQkJYnVmLT5zZ19kZXNjLm51bV9wYWdlcywKLQkJCQkJLTEsCi0JCQkJCVBBR0VfS0VSTkVMKTsKIAlyZXR1cm4gYnVmOwogCiBmYWlsX3BhZ2VzX2FsbG9jOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItbWVtb3BzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYwppbmRleCA1NjllZWIzLi43MWE3YTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYwpAQCAtNjgsMTIgKzY4LDEyIEBACiAJaWYgKCF2bWEpCiAJCXJldHVybjsKIAotCWlmICh2bWEtPnZtX2ZpbGUpCi0JCWZwdXQodm1hLT52bV9maWxlKTsKLQogCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+Y2xvc2UpCiAJCXZtYS0+dm1fb3BzLT5jbG9zZSh2bWEpOwogCisJaWYgKHZtYS0+dm1fZmlsZSkKKwkJZnB1dCh2bWEtPnZtX2ZpbGUpOworCiAJa2ZyZWUodm1hKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZiMl9wdXRfdm1hKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKaW5kZXggYTg0OGJkMi4uN2Q3NTRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKQEAgLTY1MCw5ICs2NTAsOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJVmlkZW9idWYgb3BlcmF0aW9ucwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCi0JCQkJdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCi0JCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQorc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCQkJdW5zaWduZWQgaW50ICpuYnVmZmVycywgdW5zaWduZWQgaW50ICpucGxhbmVzLAorCQkJCXVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19jdHhzW10pCiB7CiAJc3RydWN0IHZpdmlfZGV2ICpkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKIAl1bnNpZ25lZCBsb25nIHNpemU7CkBAIC03NjYsNyArNzY2LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwogCWRwcmludGsoZGV2LCAxLCAiJXNcbiIsIF9fZnVuY19fKTsKQEAgLTg1Miw2ICs4NTIsMTEgQEAKIAkJKGYtPmZtdC5waXgud2lkdGggKiBkZXYtPmZtdC0+ZGVwdGgpID4+IDM7CiAJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQogCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCWlmIChkZXYtPmZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9ZVVlWIHx8CisJICAgIGRldi0+Zm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1VZVlkpCisJCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJZWxzZQorCQlmLT5mbXQucGl4LmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODg1LDYgKzg5MCwxMSBAQAogCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZtdC0+ZGVwdGgpID4+IDM7CiAJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQogCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCWlmIChmbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWVVZViB8fAorCSAgICBmbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKKwkJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKwllbHNlCisJCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwogCXJldHVybiAwOwogfQogCkBAIC05NDgsNiArOTU4LDE0IEBACiAJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJmRldi0+dmJfdmlkcSwgaSk7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHZpdmlfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJdjRsMl9jdHJsX2hhbmRsZXJfbG9nX3N0YXR1cygmZGV2LT5jdHJsX2hhbmRsZXIsIGRldi0+djRsMl9kZXYubmFtZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaSkKIHsKIAlyZXR1cm4gMDsKQEAgLTExOTEsNiArMTIwOSw3IEBACiAJLnZpZGlvY19zX2lucHV0ICAgICAgID0gdmlkaW9jX3NfaW5wdXQsCiAJLnZpZGlvY19zdHJlYW1vbiAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAogCS52aWRpb2Nfc3RyZWFtb2ZmICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCisJLnZpZGlvY19sb2dfc3RhdHVzICAgID0gdmlkaW9jX2xvZ19zdGF0dXMsCiAJLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgPSB2aWRpb2Nfc3Vic2NyaWJlX2V2ZW50LAogCS52aWRpb2NfdW5zdWJzY3JpYmVfZXZlbnQgPSB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKaW5kZXggY2EzNzJlYi4uZTVjYWQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogCWlmIChwc3RkKQogCQkqcHN0ZCA9IHN0ZDsKIAlpZiAocHN0YXR1cykKLQkJKnBzdGF0dXMgPSBzdGF0dXM7CisJCSpwc3RhdHVzID0gcmVzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzY0eHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCmluZGV4IGM0OTI4NDYuLmU3OGNmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCkBAIC0xNjM4LDYgKzE2MzgsOSBAQAogCiAJaWYgKCFjYW0tPnJlYWRfZW5kcG9pbnQpIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGQgbm90IGZpbmQgYnVsay1pbiBlbmRwb2ludFxuIik7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKGNhbS0+dmRldik7CisJCWtmcmVlKGNhbSk7CisJCWNhbSA9IE5VTEw7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwppbmRleCA4YzFkODVlLi41NmZmMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm1lbXN0aWNrIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCmluZGV4IDRhMTkwOWEuLjk3MjliOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtc3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAibXNwcm9fYmxvY2siCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9qbWIzOHhfbXMuYyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9qbWIzOHhfbXMuYwppbmRleCBkODlkOTI1Li42Y2U3MGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2hvc3Qvam1iMzh4X21zLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXN0aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJqbWIzOHhfbXMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCmluZGV4IDAzZjcxYTQuLmI3YWFjZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGlmbV9tcyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKaW5kZXggNzk1NmExMC4uZTljNmE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKQEAgLTYzLDYgKzYzLDggQEAKICNpZmRlZiBDT05GSUdfTVRSUgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIAogI2luY2x1ZGUgIm1wdGJhc2UuaCIKICNpbmNsdWRlICJsc2kvbXBpX2xvZ19mYy5oIgpAQCAtMzIzLDYgKzMyNSwzMiBAQAogCXJldHVybiByYzsKIH0KIAorCisvKioKKyAqICBtcHRfcmVtb3ZlX2RlYWRfaW9jX2Z1bmMgLSBrdGhyZWFkIGNvbnRleHQgdG8gcmVtb3ZlIGRlYWQgaW9jCisgKiBAYXJnOiBpbnB1dCBhcmd1bWVudCwgdXNlZCB0byBkZXJpdmUgaW9jCisgKgorICogUmV0dXJuIDAgaWYgY29udHJvbGxlciBpcyByZW1vdmVkIGZyb20gcGNpIHN1YnN5c3RlbS4KKyAqIFJldHVybiAtMSBmb3Igb3RoZXIgY2FzZS4KKyAqLworc3RhdGljIGludCBtcHRfcmVtb3ZlX2RlYWRfaW9jX2Z1bmModm9pZCAqYXJnKQoreworCU1QVF9BREFQVEVSICppb2MgPSAoTVBUX0FEQVBURVIgKilhcmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlpZiAoKGlvYyA9PSBOVUxMKSkKKwkJcmV0dXJuIC0xOworCisJcGRldiA9IGlvYy0+cGNpZGV2OworCWlmICgocGRldiA9PSBOVUxMKSkKKwkJcmV0dXJuIC0xOworCisJcGNpX3JlbW92ZV9idXNfZGV2aWNlKHBkZXYpOworCXJldHVybiAwOworfQorCisKKwogLyoqCiAgKgltcHRfZmF1bHRfcmVzZXRfd29yayAtIHdvcmsgcGVyZm9ybWVkIG9uIHdvcmtxIGFmdGVyIGlvYyBmYXVsdAogICoJQHdvcms6IGlucHV0IGFyZ3VtZW50LCB1c2VkIHRvIGRlcml2ZSBpb2MKQEAgLTMzNiwxMiArMzY0LDQ1IEBACiAJdTMyCQkgaW9jX3Jhd19zdGF0ZTsKIAlpbnQJCSByYzsKIAl1bnNpZ25lZCBsb25nCSBmbGFnczsKKwlNUFRfU0NTSV9IT1NUCSpoZDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKIAlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MgfHwgIWlvYy0+YWN0aXZlKQogCQlnb3RvIG91dDsKIAorCiAJaW9jX3Jhd19zdGF0ZSA9IG1wdF9HZXRJb2NTdGF0ZShpb2MsIDApOwotCWlmICgoaW9jX3Jhd19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9GQVVMVCkgeworCWlmICgoaW9jX3Jhd19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9NQVNLKSB7CisJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICIlczogSU9DIGlzIG5vbi1vcGVyYXRpb25hbCAhISEhXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisKKwkJLyoKKwkJICogQ2FsbCBtcHRzY3NpaF9mbHVzaF9wZW5kaW5nX2NtZHMgY2FsbGJhY2sgc28gdGhhdCB3ZQorCQkgKiBmbHVzaCBhbGwgcGVuZGluZyBjb21tYW5kcyBiYWNrIHRvIE9TLgorCQkgKiBUaGlzIGNhbGwgaXMgcmVxdWlyZWQgdG8gYW92aWQgZGVhZGxvY2sgYXQgYmxvY2sgbGF5ZXIuCisJCSAqIERlYWQgSU9DIHdpbGwgZmFpbCB0byBkbyBkaWFnIHJlc2V0LGFuZCB0aGlzIGNhbGwgaXMgc2FmZQorCQkgKiBzaW5jZSBkZWFkIGlvYyB3aWxsIG5ldmVyIHJldHVybiBhbnkgY29tbWFuZCBiYWNrIGZyb20gSFcuCisJCSAqLworCQloZCA9IHNob3N0X3ByaXYoaW9jLT5zaCk7CisJCWlvYy0+c2NoZWR1bGVfZGVhZF9pb2NfZmx1c2hfcnVubmluZ19jbWRzKGhkKTsKKworCQkvKlJlbW92ZSB0aGUgRGVhZCBIb3N0ICovCisJCXAgPSBrdGhyZWFkX3J1bihtcHRfcmVtb3ZlX2RlYWRfaW9jX2Z1bmMsIGlvYywKKwkJCQkibXB0X2RlYWRfaW9jXyVkIiwgaW9jLT5pZCk7CisJCWlmIChJU19FUlIocCkpCXsKKwkJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQKKwkJCQkiJXM6IFJ1bm5pbmcgbXB0X2RlYWRfaW9jIHRocmVhZCBmYWlsZWQgIVxuIiwKKwkJCQlpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkJIiVzOiBSdW5uaW5nIG1wdF9kZWFkX2lvYyB0aHJlYWQgc3VjY2VzcyAhXG4iLAorCQkJCWlvYy0+bmFtZSwgX19mdW5jX18pOworCQl9CisJCXJldHVybjsgLyogZG9uJ3QgcmVhcm0gdGltZXIgKi8KKwl9CisKKwlpZiAoKGlvY19yYXdfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spCisJCQk9PSBNUElfSU9DX1NUQVRFX0ZBVUxUKSB7CiAJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJJT0MgaXMgaW4gRkFVTFQgc3RhdGUgKCUwNHhoKSEhIVxuIiwKIAkJICAgICAgIGlvYy0+bmFtZSwgaW9jX3Jhd19zdGF0ZSAmIE1QSV9ET09SQkVMTF9EQVRBX01BU0spOwogCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiSXNzdWluZyBIYXJkUmVzZXQgZnJvbSAlcyEhXG4iLApAQCAtNjQxMyw4ICs2NDc0LDE5IEBACiAJCQlwUmVxLT5BY3Rpb24sIGlvYy0+bXB0YmFzZV9jbWRzLnN0YXR1cywgdGltZWxlZnQpKTsKIAkJaWYgKGlvYy0+bXB0YmFzZV9jbWRzLnN0YXR1cyAmIE1QVF9NR01UX1NUQVRVU19ESURfSU9DUkVTRVQpCiAJCQlnb3RvIG91dDsKLQkJaWYgKCF0aW1lbGVmdCkKKwkJaWYgKCF0aW1lbGVmdCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+dGFza21nbXRfbG9jaywgZmxhZ3MpOworCQkJaWYgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT50YXNrbWdtdF9sb2NrLAorCQkJCQlmbGFncyk7CisJCQkJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQgIiVzOiBob3N0IHJlc2V0IGluIgorCQkJCQkiIHByb2dyZXNzIG1wdF9jb25maWcgdGltZWQgb3V0LiEhXG4iLAorCQkJCQlfX2Z1bmNfXywgaW9jLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+dGFza21nbXRfbG9jaywgZmxhZ3MpOwogCQkJaXNzdWVfaGFyZF9yZXNldCA9IDE7CisJCX0KIAkJZ290byBvdXQ7CiAJfQogCkBAIC03MTI4LDcgKzcyMDAsMTggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT50YXNrbWdtdF9sb2NrLCBmbGFncyk7CiAJaWYgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+dGFza21nbXRfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKKwkJaW9jLT53YWl0X29uX3Jlc2V0X2NvbXBsZXRpb24gPSAxOworCQlkbyB7CisJCQlzc2xlZXAoMSk7CisJCX0gd2hpbGUgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzID09IDEpOworCQlpb2MtPndhaXRfb25fcmVzZXRfY29tcGxldGlvbiA9IDA7CisJCXJldHVybiBpb2MtPnJlc2V0X3N0YXR1czsKKwl9CisJaWYgKGlvYy0+d2FpdF9vbl9yZXNldF9jb21wbGV0aW9uKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+dGFza21nbXRfbG9jaywgZmxhZ3MpOworCQlyYyA9IDA7CisJCXRpbWVfY291bnQgPSBqaWZmaWVzOworCQlnb3RvIGV4aXQ7CiAJfQogCWlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzID0gMTsKIAlpZiAoaW9jLT5hbHRfaW9jKQpAQCAtNzE2NSw2ICs3MjQ4LDcgQEAKIAlpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzcyA9IDA7CiAJaW9jLT50YXNrbWdtdF9xdWllc2NlX2lvID0gMDsKIAlpb2MtPnRhc2ttZ210X2luX3Byb2dyZXNzID0gMDsKKwlpb2MtPnJlc2V0X3N0YXR1cyA9IHJjOwogCWlmIChpb2MtPmFsdF9pb2MpIHsKIAkJaW9jLT5hbHRfaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MgPSAwOwogCQlpb2MtPmFsdF9pb2MtPnRhc2ttZ210X3F1aWVzY2VfaW8gPSAwOwpAQCAtNzE4MCw3ICs3MjY0LDcgQEAKIAkJCQkJaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1BPU1RfUkVTRVQpOwogCQl9CiAJfQotCitleGl0OgogCWR0bXByaW50ayhpb2MsCiAJICAgIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCQkiSGFyZFJlc2V0SGFuZGxlcjogY29tcGxldGVkICglZCBzZWNvbmRzKTogJXNcbiIsIGlvYy0+bmFtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKaW5kZXggZmU5MDIzMy4uYjRkMjRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKQEAgLTc2LDggKzc2LDggQEAKICNkZWZpbmUgQ09QWVJJR0hUCSJDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCAiIE1PRFVMRUFVVEhPUgogI2VuZGlmCiAKLSNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjA0LjE5IgotI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDQuMTkiCisjZGVmaW5lIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgkiMy4wNC4yMCIKKyNkZWZpbmUgTVBUX0xJTlVYX1BBQ0tBR0VfTkFNRQkJIkAoIyltcHRsaW51eC0zLjA0LjIwIgogI2RlZmluZSBXSEFUX01BR0lDX1NUUklORwkJIkAiICIoIiAiIyIgIikiCiAKICNkZWZpbmUgc2hvd19tcHRtb2RfdmVyKHMsdmVyKSAgXApAQCAtNTU0LDEwICs1NTQsNDcgQEAKIAl1OAkJZmxhZ3M7CiB9OwogCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKKy8qCisgKiBNUFRfU0NTSV9IT1NUIGRlZmluZXMgLSBVc2VkIGJ5IHRoZSBJT0NUTCBhbmQgdGhlIFNDU0kgZHJpdmVycworICogUHJpdmF0ZSB0byB0aGUgZHJpdmVyLgorICovCisKKyNkZWZpbmUgTVBUX0hPU1RfQlVTX1VOS05PV04JCSgweEZGKQorI2RlZmluZSBNUFRfSE9TVF9UT09fTUFOWV9UTQkJKDB4MDUpCisjZGVmaW5lIE1QVF9IT1NUX05WUkFNX0lOVkFMSUQJCSgweEZGRkZGRkZGKQorI2RlZmluZSBNUFRfSE9TVF9OT19DSEFJTgkJKDB4RkZGRkZGRkYpCisjZGVmaW5lIE1QVF9OVlJBTV9NQVNLX1RJTUVPVVQJCSgweDAwMDAwMEZGKQorI2RlZmluZSBNUFRfTlZSQU1fU1lOQ19NQVNLCQkoMHgwMDAwRkYwMCkKKyNkZWZpbmUgTVBUX05WUkFNX1NZTkNfU0hJRlQJCSg4KQorI2RlZmluZSBNUFRfTlZSQU1fRElTQ09OTkVDVF9FTkFCTEUJKDB4MDAwMTAwMDApCisjZGVmaW5lIE1QVF9OVlJBTV9JRF9TQ0FOX0VOQUJMRQkoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTVBUX05WUkFNX0xVTl9TQ0FOX0VOQUJMRQkoMHgwMDA0MDAwMCkKKyNkZWZpbmUgTVBUX05WUkFNX1RBR19RVUVVRV9FTkFCTEUJKDB4MDAwODAwMDApCisjZGVmaW5lIE1QVF9OVlJBTV9XSURFX0RJU0FCTEUJCSgweDAwMTAwMDAwKQorI2RlZmluZSBNUFRfTlZSQU1fQk9PVF9DSE9JQ0UJCSgweDAwMjAwMDAwKQorCit0eXBlZGVmIGVudW0geworCUZDLAorCVNQSSwKKwlTQVMKK30gQlVTX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9NUFRfU0NTSV9IT1NUIHsKKwlzdHJ1Y3QgX01QVF9BREFQVEVSCQkgKmlvYzsKKwl1c2hvcnQJCQkgIHNlbF90aW1lb3V0W01QVF9NQVhfRkNfREVWSUNFU107CisJY2hhcgkJCSAgKmluZm9fa2J1ZjsKKwlsb25nCQkJICBsYXN0X3F1ZXVlX2Z1bGw7CisJdTE2CQkJICBzcGlfcGVuZGluZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSAgdGFyZ2V0X3Jlc2V0X2xpc3Q7Cit9IE1QVF9TQ1NJX0hPU1Q7CisKIHR5cGVkZWYgdm9pZCAoKk1QVF9BRERfU0dFKSh2b2lkICpwQWRkciwgdTMyIGZsYWdzbGVuZ3RoLCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKIHR5cGVkZWYgdm9pZCAoKk1QVF9BRERfQ0hBSU4pKHZvaWQgKnBBZGRyLCB1OCBuZXh0LCB1MTYgbGVuZ3RoLAogCQlkbWFfYWRkcl90IGRtYV9hZGRyKTsKIHR5cGVkZWYgdm9pZCAoKk1QVF9TQ0hFRFVMRV9UQVJHRVRfUkVTRVQpKHZvaWQgKmlvYyk7Cit0eXBlZGVmIHZvaWQgKCpNUFRfRkxVU0hfUlVOTklOR19DTURTKShNUFRfU0NTSV9IT1NUICpoZCk7CiAKIC8qCiAgKiAgQWRhcHRlciBTdHJ1Y3R1cmUgLSBwY2lfZGV2IHNwZWNpZmljLiBNYXhpbXVtOiBNUFRfTUFYX0FEQVBURVJTCkBAIC03MTYsNyArNzUzLDEwIEBACiAJaW50CQkJIHRhc2ttZ210X2luX3Byb2dyZXNzOwogCXU4CQkJIHRhc2ttZ210X3F1aWVzY2VfaW87CiAJdTgJCQkgaW9jX3Jlc2V0X2luX3Byb2dyZXNzOworCXU4CQkJIHJlc2V0X3N0YXR1czsKKwl1OAkJCSB3YWl0X29uX3Jlc2V0X2NvbXBsZXRpb247CiAJTVBUX1NDSEVEVUxFX1RBUkdFVF9SRVNFVCBzY2hlZHVsZV90YXJnZXRfcmVzZXQ7CisJTVBUX0ZMVVNIX1JVTk5JTkdfQ01EUyBzY2hlZHVsZV9kZWFkX2lvY19mbHVzaF9ydW5uaW5nX2NtZHM7CiAJc3RydWN0IHdvcmtfc3RydWN0CSBzYXNfcGVyc2lzdF90YXNrOwogCiAJc3RydWN0IHdvcmtfc3RydWN0CSBmY19zZXR1cF9yZXNldF93b3JrOwpAQCAtODMwLDE5ICs4NzAsNiBAQAogCXUzMglwYWQ7CiB9IE1QVF9MT0NBTF9SRVBMWTsKIAotI2RlZmluZSBNUFRfSE9TVF9CVVNfVU5LTk9XTgkJKDB4RkYpCi0jZGVmaW5lIE1QVF9IT1NUX1RPT19NQU5ZX1RNCQkoMHgwNSkKLSNkZWZpbmUgTVBUX0hPU1RfTlZSQU1fSU5WQUxJRAkJKDB4RkZGRkZGRkYpCi0jZGVmaW5lIE1QVF9IT1NUX05PX0NIQUlOCQkoMHhGRkZGRkZGRikKLSNkZWZpbmUgTVBUX05WUkFNX01BU0tfVElNRU9VVAkJKDB4MDAwMDAwRkYpCi0jZGVmaW5lIE1QVF9OVlJBTV9TWU5DX01BU0sJCSgweDAwMDBGRjAwKQotI2RlZmluZSBNUFRfTlZSQU1fU1lOQ19TSElGVAkJKDgpCi0jZGVmaW5lIE1QVF9OVlJBTV9ESVNDT05ORUNUX0VOQUJMRQkoMHgwMDAxMDAwMCkKLSNkZWZpbmUgTVBUX05WUkFNX0lEX1NDQU5fRU5BQkxFCSgweDAwMDIwMDAwKQotI2RlZmluZSBNUFRfTlZSQU1fTFVOX1NDQU5fRU5BQkxFCSgweDAwMDQwMDAwKQotI2RlZmluZSBNUFRfTlZSQU1fVEFHX1FVRVVFX0VOQUJMRQkoMHgwMDA4MDAwMCkKLSNkZWZpbmUgTVBUX05WUkFNX1dJREVfRElTQUJMRQkJKDB4MDAxMDAwMDApCi0jZGVmaW5lIE1QVF9OVlJBTV9CT09UX0NIT0lDRQkJKDB4MDAyMDAwMDApCiAKIC8qIFRoZSBUTV9TVEFURSB2YXJpYWJsZSBpcyB1c2VkIHRvIHByb3ZpZGUgc3RyaWN0IHNpbmdsZSB0aHJlYWRpbmcgb2YgVE0KICAqIHJlcXVlc3RzIGFzIHdlbGwgYXMgY29tbXVuaWNhdGUgVE0gZXJyb3IgY29uZGl0aW9ucy4KQEAgLTg1MSwyMSArODc4LDYgQEAKICNkZWZpbmUJVE1fU1RBVEVfSU5fUFJPR1JFU1MgICAoMSkKICNkZWZpbmUJVE1fU1RBVEVfRVJST1IJICAgICAgICgyKQogCi10eXBlZGVmIGVudW0gewotCUZDLAotCVNQSSwKLQlTQVMKLX0gQlVTX1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IF9NUFRfU0NTSV9IT1NUIHsKLQlNUFRfQURBUFRFUgkJICppb2M7Ci0JdXNob3J0CQkJICBzZWxfdGltZW91dFtNUFRfTUFYX0ZDX0RFVklDRVNdOwotCWNoYXIgCQkJICAqaW5mb19rYnVmOwotCWxvbmcJCQkgIGxhc3RfcXVldWVfZnVsbDsKLQl1MTYJCQkgIHNwaV9wZW5kaW5nOwotCXN0cnVjdCBsaXN0X2hlYWQJICB0YXJnZXRfcmVzZXRfbGlzdDsKLX0gTVBUX1NDU0lfSE9TVDsKLQogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoKICAqCU1vcmUgRHluYW1pYyBNdWx0aS1QYXRoaW5nIHN0dWZmLi4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwppbmRleCA3NTk2YWVjLi45ZDk1MDQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCkBAIC05Miw2ICs5MiwxMSBAQAogbW9kdWxlX3BhcmFtKG1heF9sdW4sIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9sdW4sICIgbWF4IGx1biwgZGVmYXVsdD0xNjg5NSAiKTsKIAorc3RhdGljIGludCBtcHRfbG9hZHRpbWVfbWF4X3NlY3RvcnMgPSA4MTkyOworbW9kdWxlX3BhcmFtKG1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB0X2xvYWR0aW1lX21heF9zZWN0b3JzLAorCQkiIE1heGltdW0gc2VjdG9yIGRlZmluZSBmb3IgSG9zdCBCdXMgQWRhcHRvci5SYW5nZSA2NCB0byA4MTkyIGRlZmF1bHQ9ODE5MiIpOworCiBzdGF0aWMgdTgJbXB0c2FzRG9uZUN0eCA9IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUzsKIHN0YXRpYyB1OAltcHRzYXNUYXNrQ3R4ID0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOwogc3RhdGljIHU4CW1wdHNhc0ludGVybmFsQ3R4ID0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyAvKiBVc2VkIG9ubHkgZm9yIGludGVybmFsIGNvbW1hbmRzICovCkBAIC0yODUsMTAgKzI5MCwxMSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmZ3X2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZmd19ldmVudC0+bGlzdCwgJmlvYy0+ZndfZXZlbnRfbGlzdCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmZ3X2V2ZW50LT53b3JrLCBtcHRzYXNfZmlybXdhcmVfZXZlbnRfd29yayk7Ci0JZGV2dHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiJXM6IGFkZCAoZndfZXZlbnQ9MHglcClcbiIsCi0JICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIGZ3X2V2ZW50KSk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGlvYy0+ZndfZXZlbnRfcSwgJmZ3X2V2ZW50LT53b3JrLAotCSAgICBkZWxheSk7CisJZGV2dHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiJXM6IGFkZCAoZndfZXZlbnQ9MHglcCkiCisJCSJvbiBjcHVpZCAlZFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywKKwkJZndfZXZlbnQsIHNtcF9wcm9jZXNzb3JfaWQoKSkpOworCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihzbXBfcHJvY2Vzc29yX2lkKCksIGlvYy0+ZndfZXZlbnRfcSwKKwkgICAgJmZ3X2V2ZW50LT53b3JrLCBkZWxheSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5md19ldmVudF9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTMwMCwxMCArMzA2LDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5md19ldmVudF9sb2NrLCBmbGFncyk7CiAJZGV2dHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiJXM6IHJlc2NoZWR1bGUgdGFzayAiCi0JICAgICIoZndfZXZlbnQ9MHglcClcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18sIGZ3X2V2ZW50KSk7CisJICAgICIoZndfZXZlbnQ9MHglcClvbiBjcHVpZCAlZFxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywKKwkJZndfZXZlbnQsIHNtcF9wcm9jZXNzb3JfaWQoKSkpOwogCWZ3X2V2ZW50LT5yZXRyaWVzKys7Ci0JcXVldWVfZGVsYXllZF93b3JrKGlvYy0+ZndfZXZlbnRfcSwgJmZ3X2V2ZW50LT53b3JrLAotCSAgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CisJcXVldWVfZGVsYXllZF93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgaW9jLT5md19ldmVudF9xLAorCSAgICAmZndfZXZlbnQtPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmZ3X2V2ZW50X2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTk0Myw2ICsxOTUwLDE1IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKwkvKiBJbiBjYXNlIGlmIElPQyBpcyBpbiByZXNldCBmcm9tIGludGVybmFsIGNvbnRleHQuCisJKiAgRG8gbm90IGV4ZWN1dGUgRUVIIGZvciB0aGUgc2FtZSBJT0MuIFNNTCBzaG91bGQgdG8gcmVzZXQgdGltZXIuCisJKi8KKwlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3MpIHsKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIjogJXM6IGlvYyBpcyBpbiByZXNldCwiCisJCSAgICAiU01MIG5lZWQgdG8gcmVzZXQgdGhlIHRpbWVyIChzYz0lcClcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBzYykpOworCQlyYyA9IEJMS19FSF9SRVNFVF9USU1FUjsKKwl9CiAJdmRldmljZSA9IHNjLT5kZXZpY2UtPmhvc3RkYXRhOwogCWlmICh2ZGV2aWNlICYmIHZkZXZpY2UtPnZ0YXJnZXQgJiYgKHZkZXZpY2UtPnZ0YXJnZXQtPmluRE1ECiAJCXx8IHZkZXZpY2UtPnZ0YXJnZXQtPmRlbGV0ZWQpKSB7CkBAIC01MTQyLDYgKzUxNTgsOCBAQAogCWlvYy0+VGFza0N0eCA9IG1wdHNhc1Rhc2tDdHg7CiAJaW9jLT5JbnRlcm5hbEN0eCA9IG1wdHNhc0ludGVybmFsQ3R4OwogCWlvYy0+c2NoZWR1bGVfdGFyZ2V0X3Jlc2V0ID0gJm1wdHNhc19zY2hlZHVsZV90YXJnZXRfcmVzZXQ7CisJaW9jLT5zY2hlZHVsZV9kZWFkX2lvY19mbHVzaF9ydW5uaW5nX2NtZHMgPQorCQkJCSZtcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHM7CiAJLyogIEFkZGVkIHNhbml0eSBjaGVjayBvbiByZWFkaW5lc3Mgb2YgdGhlIE1QVCBhZGFwdGVyLgogCSAqLwogCWlmIChpb2MtPmxhc3Rfc3RhdGUgIT0gTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTCkgewpAQCAtNTIzOSw2ICs1MjU3LDIxIEBACiAJCXNoLT5zZ190YWJsZXNpemUgPSBudW1TR0U7CiAJfQogCisJaWYgKG1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycykgeworCQlpZiAobXB0X2xvYWR0aW1lX21heF9zZWN0b3JzIDwgNjQgfHwKKwkJCW1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycyA+IDgxOTIpIHsKKwkJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJJbnZhbGlkIHZhbHVlIHBhc3NlZCBmb3IiCisJCQkJIm1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycyAlZC4iCisJCQkJIlJhbmdlIGZyb20gNjQgdG8gODE5MlxuIiwgaW9jLT5uYW1lLAorCQkJCW1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycyk7CisJCX0KKwkJbXB0X2xvYWR0aW1lX21heF9zZWN0b3JzICY9ICAweEZGRkZGRkZFOworCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkiUmVzZXR0aW5nIG1heCBzZWN0b3IgdG8gJWQgZnJvbSAlZFxuIiwKKwkJICBpb2MtPm5hbWUsIG1wdF9sb2FkdGltZV9tYXhfc2VjdG9ycywgc2gtPm1heF9zZWN0b3JzKSk7CisJCXNoLT5tYXhfc2VjdG9ycyA9IG1wdF9sb2FkdGltZV9tYXhfc2VjdG9yczsKKwl9CisKIAloZCA9IHNob3N0X3ByaXYoc2gpOwogCWhkLT5pb2MgPSBpb2M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwppbmRleCBjZTYxYTU3Li4wYzNjZWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC04MzAsNyArODMwLDggQEAKIAkJCQkJaWYgKChwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfNiAgJiYgKChwU2NzaVJlcS0+Q0RCWzFdICYgMHgwMikgPT0gMCkpIHx8CiAJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTAgfHwKIAkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF8xMiB8fAotCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzE2IHx8CisJCQkJCQkocFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzE2ICYmCisJCQkJCQkoKHBTY3NpUmVxLT5DREJbMV0gJiAweDAyKSA9PSAwKSkgfHwKIAkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gVkVSSUZZICB8fAogCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBWRVJJRllfMTYpIHsKIAkJCQkJCWlmIChzY3NpX2J1ZmZsZW4oc2MpICE9CkBAIC0xMDI0LDcgKzEwMjUsNyBAQAogICoKICAqCU11c3QgYmUgY2FsbGVkIHdoaWxlIG5ldyBJL09zIGFyZSBiZWluZyBxdWV1ZWQuCiAgKi8KLXN0YXRpYyB2b2lkCit2b2lkCiBtcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMoTVBUX1NDU0lfSE9TVCAqaGQpCiB7CiAJTVBUX0FEQVBURVIgKmlvYyA9IGhkLT5pb2M7CkBAIC0xMDU1LDYgKzEwNTYsNyBAQAogCQlzYy0+c2NzaV9kb25lKHNjKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKG1wdHNjc2loX2ZsdXNoX3J1bm5pbmdfY21kcyk7CiAKIC8qCiAgKgltcHRzY3NpaF9zZWFyY2hfcnVubmluZ19jbWRzIC0gRGVsZXRlIGFueSBjb21tYW5kcyBhc3NvY2lhdGVkCkBAIC0xNjI5LDcgKzE2MzEsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGlvY19yYXdfc3RhdGUgJiBNUElfRE9PUkJFTExfQUNUSVZFKSB7CisJLyogRE9PUkJFTEwgQUNUSVZFIGNoZWNrIGlzIG5vdCByZXF1aXJlZCBpZgorCSogIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0hJR0hfUFJJX1EgaXMgc3VwcG9ydGVkLgorCSovCisKKwlpZiAoISgoaW9jLT5mYWN0cy5JT0NDYXBhYmlsaXRpZXMgJiBNUElfSU9DRkFDVFNfQ0FQQUJJTElUWV9ISUdIX1BSSV9RKQorCQkgJiYgKGlvYy0+ZmFjdHMuTXNnVmVyc2lvbiA+PSBNUElfVkVSU0lPTl8wMV8wNSkpICYmCisJCShpb2NfcmF3X3N0YXRlICYgTVBJX0RPT1JCRUxMX0FDVElWRSkpIHsKIAkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKIAkJCSJUYXNrTWdtdCB0eXBlPSV4OiBpb2Nfc3RhdGU6ICIKIAkJCSJET09SQkVMTF9BQ1RJVkUgKDB4JXgpIVxuIiwKQEAgLTE3MjgsNyArMTczNiw5IEBACiAJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCiAJCSAgICAgICAiSXNzdWluZyBSZXNldCBmcm9tICVzISEgZG9vcmJlbGw9MHglMDh4XG4iLAogCQkgICAgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgbXB0X0dldElvY1N0YXRlKGlvYywgMCkpOwotCQlyZXR2YWwgPSBtcHRfU29mdF9IYXJkX1Jlc2V0SGFuZGxlcihpb2MsIENBTl9TTEVFUCk7CisJCXJldHZhbCA9IChpb2MtPmJ1c190eXBlID09IFNBUykgPworCQkJbXB0X0hhcmRSZXNldEhhbmRsZXIoaW9jLCBDQU5fU0xFRVApIDoKKwkJCW1wdF9Tb2Z0X0hhcmRfUmVzZXRIYW5kbGVyKGlvYywgQ0FOX1NMRUVQKTsKIAkJbXB0X2ZyZWVfbXNnX2ZyYW1lKGlvYywgbWYpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCmluZGV4IDQ1YTVmZjMuLjQzZTc1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKQEAgLTEzNSwzICsxMzUsNCBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptcHRzY3NpaF9ob3N0X2F0dHJzW107CiBleHRlcm4gc3RydWN0IHNjc2lfY21uZAkqbXB0c2NzaWhfZ2V0X3Njc2lfbG9va3VwKE1QVF9BREFQVEVSICppb2MsIGludCBpKTsKIGV4dGVybiB2b2lkIG1wdHNjc2loX3Rhc2ttZ210X3Jlc3BvbnNlX2NvZGUoTVBUX0FEQVBURVIgKmlvYywgdTggcmVzcG9uc2VfY29kZSk7CitleHRlcm4gdm9pZCBtcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMoTVBUX1NDU0lfSE9TVCAqaGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKaW5kZXggNzNlNDY1OC4uNzE5MGQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImNvcmUuaCIKIAogI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTy1zdWJzeXN0ZW0iCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCBhNjdhZGNiLi5mMTM5MWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTIsMjMgKzIsOCBAQAogIyBNdWx0aWZ1bmN0aW9uIG1pc2NlbGxhbmVvdXMgZGV2aWNlcwogIwogCi1tZW51Y29uZmlnIE1GRF9TVVBQT1JUCi0JYm9vbCAiTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycyIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCWRlZmF1bHQgeQotCWhlbHAKLQkgIE11bHRpZnVuY3Rpb24gZGV2aWNlcyBlbWJlZCBzZXZlcmFsIGZ1bmN0aW9ucyAoZS5nLiBHUElPcywKLQkgIHRvdWNoc2NyZWVucywga2V5Ym9hcmRzLCBjdXJyZW50IHJlZ3VsYXRvcnMsIHBvd2VyIG1hbmFnZW1lbnQgY2hpcHMsCi0JICBldGMuLi4pIGluIG9uZSBzaW5nbGUgaW50ZWdyYXRlZCBjaXJjdWl0LiBUaGV5IHVzdWFsbHkgdGFsayB0byB0aGUKLQkgIG1haW4gQ1BVIHRocm91Z2ggb25lIG9yIG1vcmUgSVJRIGxpbmVzIGFuZCBsb3cgc3BlZWQgZGF0YSBidXNzZXMgKFNQSSwKLQkgIEkyQywgZXRjLi4pLiBUaGV5IGFwcGVhciBhcyBvbmUgc2luZ2xlIGRldmljZSB0byB0aGUgbWFpbiBzeXN0ZW0KLQkgIHRocm91Z2ggdGhlIGRhdGEgYnVzIGFuZCB0aGUgTUZEIGZyYW1ld29yayBhbGxvd3MgZm9yIHN1YiBkZXZpY2VzCi0JICAoYS5rLmEuIGZ1bmN0aW9ucykgdG8gYXBwZWFyIGFzIGRpc2NyZXRlIHBsYXRmb3JtIGRldmljZXMuCi0JICBNRkRzIGFyZSB0eXBpY2FsbHkgZm91bmQgb24gZW1iZWRkZWQgcGxhdGZvcm1zLgotCi0JICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLgotCi1pZiBNRkRfU1VQUE9SVAoraWYgSEFTX0lPTUVNCittZW51ICJNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzIgogCiBjb25maWcgTUZEX0NPUkUKIAl0cmlzdGF0ZQpAQCAtMzkwLDYgKzM3NSw3IEBACiAJdHJpc3RhdGUgIlN1cHBvcnQgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODQwMCIKIAlzZWxlY3QgTUZEX0NPUkUKIAlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFdvbGZzb24gTWljcm9lbGVjcm9uaWNzIFdNODQwMCBQTUlDIGFuZCBhdWRpbwogCSAgQ09ERUMuICBUaGlzIGRyaXZlciBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nCkBAIC01MDMsNiArNDg5LDcgQEAKIGNvbmZpZyBNRkRfUENGNTA2MzMKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIgogCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IGhhdmUgTlhQIFBDRjUwNjMzIGNoaXAgb24geW91ciBib2FyZC4KIAkgIFRoaXMgY29yZSBkcml2ZXIgcHJvdmlkZXMgcmVnaXN0ZXIgYWNjZXNzIGFuZCBJUlEgaGFuZGxpbmcKQEAgLTU3OSw2ICs1NjYsMjMgQEAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgUENBUCBBU0lDIHByZXNlbnQgb24gRVpYIFBob25lcy4gVGhpcyBpcwogCSAgbmVlZGVkIGZvciBNTUMsIFRvdWNoU2NyZWVuLCBTb3VuZCwgVVNCLCBldGMuLgogCitjb25maWcgQUI1NTAwX0NPUkUKKwlib29sICJTVC1Fcmljc3NvbiBBQjU1MDAgTWl4ZWQgU2lnbmFsIFBvd2VyIE1hbmFnZW1lbnQgY2hpcCIKKwlkZXBlbmRzIG9uIEFCWDUwMF9DT1JFICYmIE1GRF9EQjU1MDBfUFJDTVUKKwlzZWxlY3QgTUZEX0NPUkUKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGFjY2VzcyB0byBBQjU1MDAgcG93ZXIgbWFuYWdlbWVudAorCSAgY2hpcC4gVGhpcyBjb25uZWN0cyB0byB0aGUgZGI1NTAwIGNoaXAgdmlhIHRoZSBJMkMgYnVzIHZpYSBQUkNNVS4KKwkgIFRoaXMgY2hpcCBlbWJlZHMgdmFyaW91cyBvdGhlciBtdWx0aW1lZGlhIGZ1bnRpb25hbGl0aWVzIGFzIHdlbGwuCisKK2NvbmZpZyBBQjU1MDBfREVCVUcKKwlib29sICJFbmFibGUgZGVidWcgaW5mbyB2aWEgZGVidWdmcyIKKwlkZXBlbmRzIG9uIEFCNTUwMF9DT1JFICYmIERFQlVHX0ZTCisJZGVmYXVsdCB5IGlmIERFQlVHX0ZTCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGRlYnVnIGluZm9ybWF0aW9uIGZyb20gdGhlIEFCNTUwMAorCSAgdXNpbmcgdGhlIGRlYnVnIGZpbGVzeXN0ZW0sIGRlYnVnZnMuCisKIGNvbmZpZyBBQjg1MDBfQ09SRQogCWJvb2wgIlNULUVyaWNzc29uIEFCODUwMCBNaXhlZCBTaWduYWwgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgogCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBBQlg1MDBfQ09SRQpAQCAtNjE1LDIwICs2MTksNiBAQAogCWhlbHAKIAkgIEFCODUwMCBHUEFEQyBkcml2ZXIgdXNlZCB0byBjb252ZXJ0IEFjYyBhbmQgYmF0dGVyeS9hYy91c2Igdm9sdGFnZQogCi1jb25maWcgQUIzNTUwX0NPUkUKLSAgICAgICAgYm9vbCAiU1QtRXJpY3Nzb24gQUIzNTUwIE1peGVkIFNpZ25hbCBDaXJjdWl0IGNvcmUgZnVuY3Rpb25zIgotCXNlbGVjdCBNRkRfQ09SRQotCWRlcGVuZHMgb24gSTJDPXkgJiYgR0VORVJJQ19IQVJESVJRUyAmJiBBQlg1MDBfQ09SRQotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSB0aGUgQUIzNTUwIE1peGVkIFNpZ25hbCBJQyBjb3JlCi0JICBmdW5jdGlvbmFsaXR5LiBUaGlzIGNvbm5lY3RzIHRvIGEgQUIzNTUwIG9uIHRoZSBJMkMgYnVzCi0JICBhbmQgZXhwb3NlIGEgbnVtYmVyIG9mIHN5bWJvbHMgbmVlZGVkIGZvciBkZXBlbmRlbnQgZGV2aWNlcwotCSAgdG8gcmVhZCBhbmQgd3JpdGUgcmVnaXN0ZXJzIGFuZCBzdWJzY3JpYmUgdG8gZXZlbnRzIGZyb20KLQkgIHRoaXMgbXVsdGktZnVuY3Rpb25hbCBJQy4gVGhpcyBpcyBuZWVkZWQgdG8gdXNlIG90aGVyIGZlYXR1cmVzCi0JICBvZiB0aGUgQUIzNTUwIHN1Y2ggYXMgYmF0dGVyeS1iYWNrZWQgUlRDLCBjaGFyZ2luZyBjb250cm9sLAotCSAgTEVEcywgdmlicmF0b3IsIHN5c3RlbSBwb3dlciBhbmQgdGVtcGVyYXR1cmUsIHBvd2VyIG1hbmFnZW1lbnQKLQkgIGFuZCBBTFNBIHNvdW5kLgotCiBjb25maWcgTUZEX0RCODUwMF9QUkNNVQogCWJvb2wgIlNULUVyaWNzc29uIERCODUwMCBQb3dlciBSZXNldCBDb250cm9sIE1hbmFnZW1lbnQgVW5pdCIKIAlkZXBlbmRzIG9uIFVYNTAwX1NPQ19EQjg1MDAKQEAgLTc3Myw3ICs3NjMsMTcgQEAKIAkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZQogCSAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGV2aWNlLgogCi1lbmRpZiAjIE1GRF9TVVBQT1JUCitjb25maWcgTUZEX0lOVEVMX01TSUMKKwlib29sICJTdXBwb3J0IGZvciBJbnRlbCBNU0lDIgorCWRlcGVuZHMgb24gSU5URUxfU0NVX0lQQworCXNlbGVjdCBNRkRfQ09SRQorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgYWNjZXNzIHRvIEludGVsIE1TSUMgKEF2YXRlbGUKKwkgIFBhc3NhZ2UpIGNoaXAuIFRoaXMgY2hpcCBlbWJlZHMgYXVkaW8sIGJhdHRlcnksIEdQSU8sIGV0Yy4KKwkgIGRldmljZXMgdXNlZCBpbiBJbnRlbCBNZWRmaWVsZCBwbGF0Zm9ybXMuCisKK2VuZG1lbnUKK2VuZGlmCiAKIG1lbnUgIk11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycyIKIAlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IGM1ODAyMDMuLmIyMjkyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC03OSw3ICs3OSw4IEBACiBvYmotJChDT05GSUdfQUJYNTAwX0NPUkUpCSs9IGFieDUwMC1jb3JlLm8KIG9iai0kKENPTkZJR19BQjMxMDBfQ09SRSkJKz0gYWIzMTAwLWNvcmUubwogb2JqLSQoQ09ORklHX0FCMzEwMF9PVFApCSs9IGFiMzEwMC1vdHAubwotb2JqLSQoQ09ORklHX0FCMzU1MF9DT1JFKQkrPSBhYjM1NTAtY29yZS5vCitvYmotJChDT05GSUdfQUI1NTAwX0NPUkUpCSs9IGFiNTUwMC1jb3JlLm8KK29iai0kKENPTkZJR19BQjU1MDBfREVCVUcpCSs9IGFiNTUwMC1kZWJ1Z2ZzLm8KIG9iai0kKENPTkZJR19BQjg1MDBfQ09SRSkJKz0gYWI4NTAwLWNvcmUubyBhYjg1MDAtc3lzY3RybC5vCiBvYmotJChDT05GSUdfQUI4NTAwX0RFQlVHKQkrPSBhYjg1MDAtZGVidWdmcy5vCiBvYmotJChDT05GSUdfQUI4NTAwX0dQQURDKQkrPSBhYjg1MDAtZ3BhZGMubwpAQCAtMTAyLDMgKzEwMyw0IEBACiBvYmotJChDT05GSUdfTUZEX1BNOFhYWF9JUlEpIAkrPSBwbTh4eHgtaXJxLm8KIG9iai0kKENPTkZJR19UUFM2NTkxMV9DT01QQVJBVE9SKQkrPSB0cHM2NTkxMS1jb21wYXJhdG9yLm8KIG9iai0kKENPTkZJR19NRkRfQUFUMjg3MF9DT1JFKQkrPSBhYXQyODcwLWNvcmUubworb2JqLSQoQ09ORklHX01GRF9JTlRFTF9NU0lDKQkrPSBpbnRlbF9tc2ljLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FhdDI4NzAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWF0Mjg3MC1jb3JlLmMKaW5kZXggMzQ1ZGM2NS4uMDJjNDIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWF0Mjg3MC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYWF0Mjg3MC1jb3JlLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogewogCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbMzJdOwotCWludCBidWZfc2l6ZTsKKwlzc2l6ZV90IGJ1Zl9zaXplOwogCWNoYXIgKnN0YXJ0ID0gYnVmOwogCXVuc2lnbmVkIGxvbmcgYWRkciwgdmFsOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjMxMDAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWIzMTAwLWNvcmUuYwppbmRleCBhMjBlMWM0Li42MDEwN2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjMxMDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL2FiMzEwMC1jb3JlLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTgwOSw3ICs4MTAsNyBAQAogCWNoYXIJKm5hbWU7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFiX2ZhbWlseV9pZCBpZHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhYl9mYW1pbHlfaWQgaWRzW10gX19kZXZpbml0Y29uc3QgPSB7CiAJLyogQUIzMTAwICovCiAJewogCQkuaWQgPSAweGMwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiMzU1MC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmExOTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDEzODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIFNULUVyaWNzc29uCi0gKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKLSAqIExvdy1sZXZlbCBjb3JlIGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBBQjM1NTAgSUMgb24gdGhlIEkyQyBidXMKLSAqIGFuZCBzb21lIGJhc2ljIGNoaXAtY29uZmlndXJhdGlvbi4KLSAqIEF1dGhvcjogQmVuZ3QgSm9uc3NvbiA8YmVuZ3QuZy5qb25zc29uQHN0ZXJpY3Nzb24uY29tPgotICogQXV0aG9yOiBNYXR0aWFzIE5pbHNzb24gPG1hdHRpYXMuaS5uaWxzc29uQHN0ZXJpY3Nzb24uY29tPgotICogQXV0aG9yOiBNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+Ci0gKiBBdXRob3I6IFJpY2thcmQgQW5kZXJzc29uIDxyaWNrYXJkLmFuZGVyc3NvbkBzdGVyaWNzc29uLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgotCi0jZGVmaW5lIEFCMzU1MF9OQU1FX1NUUklORyAiYWIzNTUwIgotI2RlZmluZSBBQjM1NTBfSURfRk9STUFUX1NUUklORyAiQUIzNTUwICVzIgotI2RlZmluZSBBQjM1NTBfTlVNX0JBTktTIDIKLSNkZWZpbmUgQUIzNTUwX05VTV9FVkVOVF9SRUcgNQotCi0vKiBUaGVzZSBhcmUgdGhlIG9ubHkgcmVnaXN0ZXJzIGluc2lkZSBBQjM1NTAgdXNlZCBpbiB0aGlzIG1haW4gZmlsZSAqLwotCi0vKiBDaGlwIElEIHJlZ2lzdGVyICovCi0jZGVmaW5lIEFCMzU1MF9DSURfUkVHICAgICAgICAgICAweDIwCi0KLS8qIEludGVycnVwdCBldmVudCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQUIzNTUwX0VWRU5UX0JBTksgICAgICAgIDAKLSNkZWZpbmUgQUIzNTUwX0VWRU5UX1JFRyAgICAgICAgIDB4MjIKLQotLyogUmVhZC93cml0ZSBvcGVyYXRpb24gdmFsdWVzLiAqLwotI2RlZmluZSBBQjM1NTBfUEVSTV9SRCAoMHgwMSkKLSNkZWZpbmUgQUIzNTUwX1BFUk1fV1IgKDB4MDIpCi0KLS8qIFJlYWQvd3JpdGUgcGVybWlzc2lvbnMuICovCi0jZGVmaW5lIEFCMzU1MF9QRVJNX1JPIChBQjM1NTBfUEVSTV9SRCkKLSNkZWZpbmUgQUIzNTUwX1BFUk1fUlcgKEFCMzU1MF9QRVJNX1JEIHwgQUIzNTUwX1BFUk1fV1IpCi0KLS8qKgotICogc3RydWN0IGFiMzU1MAotICogQGFjY2Vzc19tdXRleDogbG9jayBvdXQgY29uY3VycmVudCBhY2Nlc3NlcyB0byB0aGUgQUIgcmVnaXN0ZXJzCi0gKiBAaTJjX2NsaWVudDogSTJDIGNsaWVudCBmb3IgdGhpcyBjaGlwCi0gKiBAY2hpcF9uYW1lOiBuYW1lIG9mIHRoaXMgY2hpcCB2YXJpYW50Ci0gKiBAY2hpcF9pZDogOCBiaXQgY2hpcCBJRCBmb3IgdGhpcyBjaGlwIHZhcmlhbnQKLSAqIEBtYXNrX3dvcms6IGEgd29ya2VyIGZvciB3cml0aW5nIHRvIG1hc2sgcmVnaXN0ZXJzCi0gKiBAZXZlbnRfbG9jazogYSBsb2NrIHRvIHByb3RlY3QgdGhlIGV2ZW50X21hc2sKLSAqIEBldmVudF9tYXNrOiBhIGxvY2FsIGNvcHkgb2YgdGhlIG1hc2sgZXZlbnQgcmVnaXN0ZXJzCi0gKiBAc3RhcnR1cF9ldmVudHM6IGEgY29weSBvZiB0aGUgZmlyc3QgcmVhZGluZyBvZiB0aGUgZXZlbnQgcmVnaXN0ZXJzCi0gKiBAc3RhcnR1cF9ldmVudHNfcmVhZDogd2hldGhlciB0aGUgZmlyc3QgZXZlbnRzIGhhdmUgYmVlbiByZWFkCi0gKi8KLXN0cnVjdCBhYjM1NTAgewotCXN0cnVjdCBtdXRleCBhY2Nlc3NfbXV0ZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnRbQUIzNTUwX05VTV9CQU5LU107Ci0JY2hhciBjaGlwX25hbWVbMzJdOwotCXU4IGNoaXBfaWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IG1hc2tfd29yazsKLQlzcGlubG9ja190IGV2ZW50X2xvY2s7Ci0JdTggZXZlbnRfbWFza1tBQjM1NTBfTlVNX0VWRU5UX1JFR107Ci0JdTggc3RhcnR1cF9ldmVudHNbQUIzNTUwX05VTV9FVkVOVF9SRUddOwotCWJvb2wgc3RhcnR1cF9ldmVudHNfcmVhZDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQl1bnNpZ25lZCBpbnQgZGVidWdfYmFuazsKLQl1bnNpZ25lZCBpbnQgZGVidWdfYWRkcmVzczsKLSNlbmRpZgotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZQotICogQGZpcnN0OiB0aGUgZmlyc3QgYWRkcmVzcyBvZiB0aGUgcmFuZ2UKLSAqIEBsYXN0OiB0aGUgbGFzdCBhZGRyZXNzIG9mIHRoZSByYW5nZQotICogQHBlcm06IGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgdGhlIHJhbmdlCi0gKi8KLXN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlIHsKLQl1OCBmaXJzdDsKLQl1OCBsYXN0OwotCXU4IHBlcm07Ci19OwotCi0vKioKLSAqIHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcwotICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgbGlzdAotICogQHJhbmdlOiB0aGUgbGlzdCBvZiByZWdpc3RlciByYW5nZXMKLSAqLwotc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VzIHsKLQl1OCBjb3VudDsKLQljb25zdCBzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZSAqcmFuZ2U7Ci19OwotCi0vKgotICogUGVybWlzc2libGUgcmVnaXN0ZXIgcmFuZ2VzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHBlciBkZXZpY2UgYW5kIGJhbmsuCi0gKgotICogVGhlIHJhbmdlcyBtdXN0IGJlIGxpc3RlZCBpbiBpbmNyZWFzaW5nIGFkZHJlc3Mgb3JkZXIsIGFuZCBubyBvdmVybGFwcyBhcmUKLSAqIGFsbG93ZWQuIEl0IGlzIGFzc3VtZWQgdGhhdCB3cml0ZSBwZXJtaXNzaW9uIGltcGxpZXMgcmVhZCBwZXJtaXNzaW9uCi0gKiAoaS5lLiBvbmx5IFJPIGFuZCBSVyBwZXJtaXNzaW9ucyBzaG91bGQgYmUgdXNlZCkuICBSYW5nZXMgd2l0aCB3cml0ZQotICogcGVybWlzc2lvbiBtdXN0IG5vdCBiZSBzcGxpdCB1cC4KLSAqLwotCi0jZGVmaW5lIE5PX1JBTkdFIHsuY291bnQgPSAwLCAucmFuZ2UgPSBOVUxMLH0KLQotc3RhdGljIHN0cnVjdAotYWIzNTUwX3JlZ19yYW5nZXMgYWIzNTUwX3JlZ19yYW5nZXNbQUIzNTUwX05VTV9ERVZJQ0VTXVtBQjM1NTBfTlVNX0JBTktTXSA9IHsKLQlbQUIzNTUwX0RFVklEX0RBQ10gPSB7Ci0JCU5PX1JBTkdFLAotCQl7Ci0JCQkuY291bnQgPSAyLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4YjAsCi0JCQkJCS5sYXN0ID0gMHhiYSwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHhiYywKLQkJCQkJLmxhc3QgPSAweGMzLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9LAotCQl9LAotCX0sCi0JW0FCMzU1MF9ERVZJRF9MRURTXSA9IHsKLQkJTk9fUkFOR0UsCi0JCXsKLQkJCS5jb3VudCA9IDIsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHg1YSwKLQkJCQkJLmxhc3QgPSAweDg4LAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQkJewotCQkJCQkuZmlyc3QgPSAweDhhLAotCQkJCQkubGFzdCA9IDB4YWQsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQl9LAotCVtBQjM1NTBfREVWSURfUE9XRVJdID0gewotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MjEsCi0JCQkJCS5sYXN0ID0gMHgyMSwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9STywKLQkJCQl9LAotCQkJfQotCQl9LAotCQlOT19SQU5HRSwKLQl9LAotCVtBQjM1NTBfREVWSURfUkVHVUxBVE9SU10gPSB7Ci0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHg2OSwKLQkJCQkJLmxhc3QgPSAweGEzLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgxNCwKLQkJCQkJLmxhc3QgPSAweDE2LAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX1NJTV0gPSB7Ci0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgyMSwKLQkJCQkJLmxhc3QgPSAweDIxLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JPLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCXsKLQkJCS5jb3VudCA9IDEsCi0JCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgxNCwKLQkJCQkJLmxhc3QgPSAweDE3LAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JXLAotCQkJCX0sCi0JCQl9Ci0KLQkJfSwKLQl9LAotCVtBQjM1NTBfREVWSURfVUFSVF0gPSB7Ci0JCU5PX1JBTkdFLAotCQlOT19SQU5HRSwKLQl9LAotCVtBQjM1NTBfREVWSURfUlRDXSA9IHsKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDAwLAotCQkJCQkubGFzdCA9IDB4MGMsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCX0KLQkJfSwKLQkJTk9fUkFOR0UsCi0JfSwKLQlbQUIzNTUwX0RFVklEX0NIQVJHRVJdID0gewotCQl7Ci0JCQkuY291bnQgPSAyLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MTAsCi0JCQkJCS5sYXN0ID0gMHgxYSwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJCXsKLQkJCQkJLmZpcnN0ID0gMHgyMSwKLQkJCQkJLmxhc3QgPSAweDIxLAotCQkJCQkucGVybSA9IEFCMzU1MF9QRVJNX1JPLAotCQkJCX0sCi0JCQl9Ci0JCX0sCi0JCU5PX1JBTkdFLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9BRENdID0gewotCQlOT19SQU5HRSwKLQkJewotCQkJLmNvdW50ID0gMSwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDIwLAotCQkJCQkubGFzdCA9IDB4NTYsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQotCQkJfQotCQl9LAotCX0sCi0JW0FCMzU1MF9ERVZJRF9GVUVMR0FVR0VdID0gewotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MjEsCi0JCQkJCS5sYXN0ID0gMHgyMSwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9STywKLQkJCQl9LAotCQkJfQotCQl9LAotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MDAsCi0JCQkJCS5sYXN0ID0gMHgwZSwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJfQotCQl9LAotCX0sCi0JW0FCMzU1MF9ERVZJRF9WSUJSQVRPUl0gPSB7Ci0JCU5PX1JBTkdFLAotCQl7Ci0JCQkuY291bnQgPSAxLAotCQkJLnJhbmdlID0gKHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlW10pIHsKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4MTAsCi0JCQkJCS5sYXN0ID0gMHgxMywKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCi0JCQl9Ci0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX0NPREVDXSA9IHsKLQkJewotCQkJLmNvdW50ID0gMiwKLQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQkJewotCQkJCQkuZmlyc3QgPSAweDMxLAotCQkJCQkubGFzdCA9IDB4NjMsCi0JCQkJCS5wZXJtID0gQUIzNTUwX1BFUk1fUlcsCi0JCQkJfSwKLQkJCQl7Ci0JCQkJCS5maXJzdCA9IDB4NjUsCi0JCQkJCS5sYXN0ID0gMHg2OCwKLQkJCQkJLnBlcm0gPSBBQjM1NTBfUEVSTV9SVywKLQkJCQl9LAotCQkJfQotCQl9LAotCQlOT19SQU5HRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBhYjM1NTBfZGV2c1tBQjM1NTBfTlVNX0RFVklDRVNdID0gewotCVtBQjM1NTBfREVWSURfREFDXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLWRhYyIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9EQUMsCi0JCS5udW1fcmVzb3VyY2VzID0gMCwKLQl9LAotCVtBQjM1NTBfREVWSURfTEVEU10gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1sZWRzIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX0xFRFMsCi0JfSwKLQlbQUIzNTUwX0RFVklEX1BPV0VSXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLXBvd2VyIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX1BPV0VSLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9SRUdVTEFUT1JTXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLXJlZ3VsYXRvcnMiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfUkVHVUxBVE9SUywKLQl9LAotCVtBQjM1NTBfREVWSURfU0lNXSA9IHsKLQkJLm5hbWUgPSAiYWIzNTUwLXNpbSIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9TSU0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX1VBUlRdID0gewotCQkubmFtZSA9ICJhYjM1NTAtdWFydCIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9VQVJULAotCX0sCi0JW0FCMzU1MF9ERVZJRF9SVENdID0gewotCQkubmFtZSA9ICJhYjM1NTAtcnRjIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX1JUQywKLQl9LAotCVtBQjM1NTBfREVWSURfQ0hBUkdFUl0gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1jaGFyZ2VyIiwKLQkJLmlkID0gQUIzNTUwX0RFVklEX0NIQVJHRVIsCi0JfSwKLQlbQUIzNTUwX0RFVklEX0FEQ10gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1hZGMiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfQURDLAotCQkubnVtX3Jlc291cmNlcyA9IDEwLAotCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7Ci0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi0wIiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAxNiwKLQkJCQkuZW5kID0gMTYsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItMSIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMTcsCi0JCQkJLmVuZCA9IDE3LAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLTIiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDE4LAotCQkJCS5lbmQgPSAxOCwKLQkJCX0sCi0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi0zIiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAxOSwKLQkJCQkuZW5kID0gMTksCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItNCIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMjAsCi0JCQkJLmVuZCA9IDIwLAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLTUiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDIxLAotCQkJCS5lbmQgPSAyMSwKLQkJCX0sCi0JCQl7Ci0JCQkJLm5hbWUgPSAiVFJJR0dFUi02IiwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCQkuc3RhcnQgPSAyMiwKLQkJCQkuZW5kID0gMjIsCi0JCQl9LAotCQkJewotCQkJCS5uYW1lID0gIlRSSUdHRVItNyIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMjMsCi0JCQkJLmVuZCA9IDIzLAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLVZCQVQtVFhPTiIsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQkJLnN0YXJ0ID0gMTMsCi0JCQkJLmVuZCA9IDEzLAotCQkJfSwKLQkJCXsKLQkJCQkubmFtZSA9ICJUUklHR0VSLVZCQVQiLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJCS5zdGFydCA9IDEyLAotCQkJCS5lbmQgPSAxMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbQUIzNTUwX0RFVklEX0ZVRUxHQVVHRV0gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC1mdWVsZ2F1Z2UiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfRlVFTEdBVUdFLAotCX0sCi0JW0FCMzU1MF9ERVZJRF9WSUJSQVRPUl0gPSB7Ci0JCS5uYW1lID0gImFiMzU1MC12aWJyYXRvciIsCi0JCS5pZCA9IEFCMzU1MF9ERVZJRF9WSUJSQVRPUiwKLQl9LAotCVtBQjM1NTBfREVWSURfQ09ERUNdID0gewotCQkubmFtZSA9ICJhYjM1NTAtY29kZWMiLAotCQkuaWQgPSBBQjM1NTBfREVWSURfQ09ERUMsCi0JfSwKLX07Ci0KLS8qCi0gKiBJMkMgdHJhbnNhY3Rpb25zIHdpdGggZXJyb3IgbWVzc2FnZXMuCi0gKi8KLXN0YXRpYyBpbnQgYWIzNTUwX2kyY19tYXN0ZXJfc2VuZChzdHJ1Y3QgYWIzNTUwICphYiwgdTggYmFuaywgdTggKmRhdGEsCi0JdTggY291bnQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGkyY19tYXN0ZXJfc2VuZChhYi0+aTJjX2NsaWVudFtiYW5rXSwgZGF0YSwgY291bnQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsICJzZW5kIGVycm9yOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX2kyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgYWIzNTUwICphYiwgdTggYmFuaywgdTggKmRhdGEsCi0JdTggY291bnQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGkyY19tYXN0ZXJfcmVjdihhYi0+aTJjX2NsaWVudFtiYW5rXSwgZGF0YSwgY291bnQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsICJyZWNlaXZlIGVycm9yOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbmFsaXR5IGZvciBnZXR0aW5nL3NldHRpbmcgcmVnaXN0ZXIgdmFsdWVzLgotICovCi1zdGF0aWMgaW50IGdldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBhYjM1NTAgKmFiLCB1OCBiYW5rLCB1OCByZWcsCi0JdTggKnZhbHVlKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFiLT5hY2Nlc3NfbXV0ZXgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBhYjM1NTBfaTJjX21hc3Rlcl9zZW5kKGFiLCBiYW5rLCAmcmVnLCAxKTsKLQlpZiAoIWVycikKLQkJZXJyID0gYWIzNTUwX2kyY19tYXN0ZXJfcmVjdihhYiwgYmFuaywgdmFsdWUsIDEpOwotCi0JbXV0ZXhfdW5sb2NrKCZhYi0+YWNjZXNzX211dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGdldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoc3RydWN0IGFiMzU1MCAqYWIsIHU4IGJhbmssCi0JdTggZmlyc3RfcmVnLCB1OCAqcmVndmFscywgdTggbnVtcmVncykKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhYi0+YWNjZXNzX211dGV4KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gYWIzNTUwX2kyY19tYXN0ZXJfc2VuZChhYiwgYmFuaywgJmZpcnN0X3JlZywgMSk7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IGFiMzU1MF9pMmNfbWFzdGVyX3JlY3YoYWIsIGJhbmssIHJlZ3ZhbHMsIG51bXJlZ3MpOwotCi0JbXV0ZXhfdW5sb2NrKCZhYi0+YWNjZXNzX211dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG1hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBhYjM1NTAgKmFiLCB1OCBiYW5rLAotCXU4IHJlZywgdTggYml0bWFzaywgdTggYml0dmFsdWVzKQotewotCWludCBlcnIgPSAwOwotCi0JaWYgKGxpa2VseShiaXRtYXNrKSkgewotCQl1OCByZWdfYml0c1syXSA9IHtyZWcsIDB9OwotCi0JCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWItPmFjY2Vzc19tdXRleCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWlmIChiaXRtYXNrID09IDB4RkYpIC8qIE5vIG5lZWQgdG8gcmVhZCBpbiB0aGlzIGNhc2UuICovCi0JCQlyZWdfYml0c1sxXSA9IGJpdHZhbHVlczsKLQkJZWxzZSB7IC8qIFJlYWQgYW5kIG1vZGlmeSB0aGUgcmVnaXN0ZXIgdmFsdWUuICovCi0JCQl1OCBiaXRzOwotCi0JCQllcnIgPSBhYjM1NTBfaTJjX21hc3Rlcl9zZW5kKGFiLCBiYW5rLCAmcmVnLCAxKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJCWVyciA9IGFiMzU1MF9pMmNfbWFzdGVyX3JlY3YoYWIsIGJhbmssICZiaXRzLCAxKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJCXJlZ19iaXRzWzFdID0gKCh+Yml0bWFzayAmIGJpdHMpIHwKLQkJCQkoYml0bWFzayAmIGJpdHZhbHVlcykpOwotCQl9Ci0JCS8qIFdyaXRlIHRoZSBuZXcgdmFsdWUuICovCi0JCWVyciA9IGFiMzU1MF9pMmNfbWFzdGVyX3NlbmQoYWIsIGJhbmssIHJlZ19iaXRzLCAyKTsKLXVubG9ja19hbmRfcmV0dXJuOgotCQltdXRleF91bmxvY2soJmFiLT5hY2Nlc3NfbXV0ZXgpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogUmVhZC93cml0ZSBwZXJtaXNzaW9uIGNoZWNraW5nIGZ1bmN0aW9ucy4KLSAqLwotc3RhdGljIGJvb2wgcGFnZV93cml0ZV9hbGxvd2VkKGNvbnN0IHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcyAqcmFuZ2VzLAotCXU4IGZpcnN0X3JlZywgdTggbGFzdF9yZWcpCi17Ci0JdTggaTsKLQotCWlmIChsYXN0X3JlZyA8IGZpcnN0X3JlZykKLQkJcmV0dXJuIGZhbHNlOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlcy0+Y291bnQ7IGkrKykgewotCQlpZiAoZmlyc3RfcmVnIDwgcmFuZ2VzLT5yYW5nZVtpXS5maXJzdCkKLQkJCWJyZWFrOwotCQlpZiAoKGxhc3RfcmVnIDw9IHJhbmdlcy0+cmFuZ2VbaV0ubGFzdCkgJiYKLQkJCShyYW5nZXMtPnJhbmdlW2ldLnBlcm0gJiBBQjM1NTBfUEVSTV9XUikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCByZWdfd3JpdGVfYWxsb3dlZChjb25zdCBzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZXMgKnJhbmdlcywgdTggcmVnKQotewotCXJldHVybiBwYWdlX3dyaXRlX2FsbG93ZWQocmFuZ2VzLCByZWcsIHJlZyk7Ci19Ci0KLXN0YXRpYyBib29sIHBhZ2VfcmVhZF9hbGxvd2VkKGNvbnN0IHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcyAqcmFuZ2VzLAotCXU4IGZpcnN0X3JlZywgdTggbGFzdF9yZWcpCi17Ci0JdTggaTsKLQotCWlmIChsYXN0X3JlZyA8IGZpcnN0X3JlZykKLQkJcmV0dXJuIGZhbHNlOwotCS8qIEZpbmQgdGhlIHJhbmdlIChpZiBpdCBleGlzdHMgaW4gdGhlIGxpc3QpIHRoYXQgaW5jbHVkZXMgZmlyc3RfcmVnLiAqLwotCWZvciAoaSA9IDA7IGkgPCByYW5nZXMtPmNvdW50OyBpKyspIHsKLQkJaWYgKGZpcnN0X3JlZyA8IHJhbmdlcy0+cmFuZ2VbaV0uZmlyc3QpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmaXJzdF9yZWcgPD0gcmFuZ2VzLT5yYW5nZVtpXS5sYXN0KQotCQkJYnJlYWs7Ci0JfQotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbnRpcmUgcmFuZ2UgdXAgdG8gYW5kIGluY2x1ZGluZyBsYXN0X3JlZyBpcwotCSAqIHJlYWRhYmxlLiBUaGlzIG1heSBzcGFuIHNldmVyYWwgb2YgdGhlIHJhbmdlcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQl3aGlsZSAoKGkgPCByYW5nZXMtPmNvdW50KSAmJgotCQkocmFuZ2VzLT5yYW5nZVtpXS5wZXJtICYgQUIzNTUwX1BFUk1fUkQpKSB7Ci0JCWlmIChsYXN0X3JlZyA8PSByYW5nZXMtPnJhbmdlW2ldLmxhc3QpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCgrK2kgPj0gcmFuZ2VzLT5jb3VudCkgfHwKLQkJCShyYW5nZXMtPnJhbmdlW2ldLmZpcnN0ICE9Ci0JCQkgKHJhbmdlcy0+cmFuZ2VbaSAtIDFdLmxhc3QgKyAxKSkpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcmVnX3JlYWRfYWxsb3dlZChjb25zdCBzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZXMgKnJhbmdlcywgdTggcmVnKQotewotCXJldHVybiBwYWdlX3JlYWRfYWxsb3dlZChyYW5nZXMsIHJlZywgcmVnKTsKLX0KLQotLyoKLSAqIFRoZSByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25hbGl0eS4KLSAqLwotc3RhdGljIGludCBhYjM1NTBfZ2V0X2NoaXBfaWQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlyZXR1cm4gKGludClhYi0+Y2hpcF9pZDsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LAotCXU4IGJhbmssIHU4IHJlZywgdTggYml0bWFzaywgdTggYml0dmFsdWVzKQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQotCWlmICgoQUIzNTUwX05VTV9CQU5LUyA8PSBiYW5rKSB8fAotCQkhcmVnX3dyaXRlX2FsbG93ZWQoJmFiMzU1MF9yZWdfcmFuZ2VzW3BkZXYtPmlkXVtiYW5rXSwgcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0JcmV0dXJuIG1hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCBiYW5rLCByZWcsCi0JCWJpdG1hc2ssIGJpdHZhbHVlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggYmFuaywKLQl1OCByZWcsIHU4IHZhbHVlKQotewotCXJldHVybiBhYjM1NTBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCBiYW5rLCByZWcsIDB4RkYsCi0JCXZhbHVlKTsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLAotCXU4IHJlZywgdTggKnZhbHVlKQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQotCWlmICgoQUIzNTUwX05VTV9CQU5LUyA8PSBiYW5rKSB8fAotCQkhcmVnX3JlYWRfYWxsb3dlZCgmYWIzNTUwX3JlZ19yYW5nZXNbcGRldi0+aWRdW2JhbmtdLCByZWcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlyZXR1cm4gZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsIGJhbmssIHJlZywgdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9nZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggYmFuaywKLQl1OCBmaXJzdF9yZWcsIHU4ICpyZWd2YWxzLCB1OCBudW1yZWdzKQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQotCWlmICgoQUIzNTUwX05VTV9CQU5LUyA8PSBiYW5rKSB8fAotCQkhcGFnZV9yZWFkX2FsbG93ZWQoJmFiMzU1MF9yZWdfcmFuZ2VzW3BkZXYtPmlkXVtiYW5rXSwKLQkJCWZpcnN0X3JlZywgKGZpcnN0X3JlZyArIG51bXJlZ3MgLSAxKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCXJldHVybiBnZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlKGFiLCBiYW5rLCBmaXJzdF9yZWcsIHJlZ3ZhbHMsCi0JCW51bXJlZ3MpOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9ldmVudF9yZWdpc3RlcnNfc3RhcnR1cF9zdGF0ZV9nZXQoc3RydWN0IGRldmljZSAqZGV2LAotCXU4ICpldmVudCkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYjsKLQotCWFiID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlpZiAoIWFiLT5zdGFydHVwX2V2ZW50c19yZWFkKQotCQlyZXR1cm4gLUVBR0FJTjsgLyogVHJ5IGFnYWluIGxhdGVyICovCi0KLQltZW1jcHkoZXZlbnQsIGFiLT5zdGFydHVwX2V2ZW50cywgQUIzNTUwX05VTV9FVkVOVF9SRUcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9zdGFydHVwX2lycV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYjsKLQlzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEgKnBsZl9kYXRhOwotCWJvb2wgdmFsOwotCi0JYWIgPSBpcnFfZ2V0X2NoaXBfZGF0YShpcnEpOwotCXBsZl9kYXRhID0gYWItPmkyY19jbGllbnRbMF0tPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlycSAtPSBwbGZfZGF0YS0+aXJxLmJhc2U7Ci0JdmFsID0gKChhYi0+c3RhcnR1cF9ldmVudHNbaXJxIC8gOF0gJiBCSVQoaXJxICUgOCkpICE9IDApOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBhYng1MDBfb3BzIGFiMzU1MF9vcHMgPSB7Ci0JLmdldF9jaGlwX2lkID0gYWIzNTUwX2dldF9jaGlwX2lkLAotCS5nZXRfcmVnaXN0ZXIgPSBhYjM1NTBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUsCi0JLnNldF9yZWdpc3RlciA9IGFiMzU1MF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKLQkuZ2V0X3JlZ2lzdGVyX3BhZ2UgPSBhYjM1NTBfZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZSwKLQkuc2V0X3JlZ2lzdGVyX3BhZ2UgPSBOVUxMLAotCS5tYXNrX2FuZF9zZXRfcmVnaXN0ZXIgPSBhYjM1NTBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUsCi0JLmV2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldCA9Ci0JCWFiMzU1MF9ldmVudF9yZWdpc3RlcnNfc3RhcnR1cF9zdGF0ZV9nZXQsCi0JLnN0YXJ0dXBfaXJxX2VuYWJsZWQgPSBhYjM1NTBfc3RhcnR1cF9pcnFfZW5hYmxlZCwKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhYjM1NTBfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9IGRhdGE7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1OCBlW0FCMzU1MF9OVU1fRVZFTlRfUkVHXTsKLQl1OCAqZXZlbnRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlldmVudHMgPSAoYWItPnN0YXJ0dXBfZXZlbnRzX3JlYWQgPyBlIDogYWItPnN0YXJ0dXBfZXZlbnRzKTsKLQotCWVyciA9IGdldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoYWIsIEFCMzU1MF9FVkVOVF9CQU5LLAotCQlBQjM1NTBfRVZFTlRfUkVHLCBldmVudHMsIEFCMzU1MF9OVU1fRVZFTlRfUkVHKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9ldmVudF9yZDsKLQotCWlmICghYWItPnN0YXJ0dXBfZXZlbnRzX3JlYWQpIHsKLQkJZGV2X2luZm8oJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsCi0JCQkic3RhcnR1cCBldmVudHMgMHgleCwweCV4LDB4JXgsMHgleCwweCV4XG4iLAotCQkJYWItPnN0YXJ0dXBfZXZlbnRzWzBdLCBhYi0+c3RhcnR1cF9ldmVudHNbMV0sCi0JCQlhYi0+c3RhcnR1cF9ldmVudHNbMl0sIGFiLT5zdGFydHVwX2V2ZW50c1szXSwKLQkJCWFiLT5zdGFydHVwX2V2ZW50c1s0XSk7Ci0JCWFiLT5zdGFydHVwX2V2ZW50c19yZWFkID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogVGhlIHR3byBoaWdoZXN0IGJpdHMgaW4gZXZlbnRbNF0gYXJlIG5vdCB1c2VkLiAqLwotCWV2ZW50c1s0XSAmPSAweDNmOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFiLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IEFCMzU1MF9OVU1fRVZFTlRfUkVHOyBpKyspCi0JCWV2ZW50c1tpXSAmPSB+YWItPmV2ZW50X21hc2tbaV07Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBQjM1NTBfTlVNX0VWRU5UX1JFRzsgaSsrKSB7Ci0JCXU4IGJpdDsKLQkJdTggZXZlbnRfcmVnOwotCi0JCWRldl9kYmcoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsICJJUlEgRXZlbnRbJWRdOiAweCUyeFxuIiwKLQkJCWksIGV2ZW50c1tpXSk7Ci0KLQkJZXZlbnRfcmVnID0gZXZlbnRzW2ldOwotCQlmb3IgKGJpdCA9IDA7IGV2ZW50X3JlZzsgYml0KyssIGV2ZW50X3JlZyAvPSAyKSB7Ci0JCQlpZiAoZXZlbnRfcmVnICUgMikgewotCQkJCXVuc2lnbmVkIGludCBpcnE7Ci0JCQkJc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKLQotCQkJCXBsZl9kYXRhID0gYWItPmkyY19jbGllbnRbMF0tPmRldi5wbGF0Zm9ybV9kYXRhOwotCQkJCWlycSA9IHBsZl9kYXRhLT5pcnEuYmFzZSArIChpICogOCkgKyBiaXQ7Ci0JCQkJaGFuZGxlX25lc3RlZF9pcnEoaXJxKTsKLQkJCX0KLQkJfQotCX0KLW91dDoKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLWVycl9ldmVudF9yZDoKLQlkZXZfZGJnKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LCAiZXJyb3IgcmVhZGluZyBldmVudCByZWdpc3RlcnNcbiIpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBhYjM1NTBfcmVnX3JhbmdlcyBkZWJ1Z19yYW5nZXNbQUIzNTUwX05VTV9CQU5LU10gPSB7Ci0JewotCQkuY291bnQgPSA2LAotCQkucmFuZ2UgPSAoc3RydWN0IGFiMzU1MF9yZWdfcmFuZ2VbXSkgewotCQkJewotCQkJCS5maXJzdCA9IDB4MDAsCi0JCQkJLmxhc3QgPSAweDBlLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDEwLAotCQkJCS5sYXN0ID0gMHgxYSwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgxZSwKLQkJCQkubGFzdCA9IDB4NGYsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4NTEsCi0JCQkJLmxhc3QgPSAweDYzLAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDY1LAotCQkJCS5sYXN0ID0gMHhhMywKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHhhNSwKLQkJCQkubGFzdCA9IDB4YTgsCi0JCQl9LAotCQl9Ci0JfSwKLQl7Ci0JCS5jb3VudCA9IDgsCi0JCS5yYW5nZSA9IChzdHJ1Y3QgYWIzNTUwX3JlZ19yYW5nZVtdKSB7Ci0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgwMCwKLQkJCQkubGFzdCA9IDB4MGUsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4MTAsCi0JCQkJLmxhc3QgPSAweDE3LAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDFhLAotCQkJCS5sYXN0ID0gMHgxYywKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgyMCwKLQkJCQkubGFzdCA9IDB4NTYsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4NWEsCi0JCQkJLmxhc3QgPSAweDg4LAotCQkJfSwKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDhhLAotCQkJCS5sYXN0ID0gMHhhZCwKLQkJCX0sCi0JCQl7Ci0JCQkJLmZpcnN0ID0gMHhiMCwKLQkJCQkubGFzdCA9IDB4YmEsCi0JCQl9LAotCQkJewotCQkJCS5maXJzdCA9IDB4YmMsCi0JCQkJLmxhc3QgPSAweGMzLAotCQkJfSwKLQkJfQotCX0sCi19OwotCi1zdGF0aWMgaW50IGFiMzU1MF9yZWdpc3RlcnNfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gcy0+cHJpdmF0ZTsKLQlpbnQgYmFuazsKLQotCXNlcV9wcmludGYocywgQUIzNTUwX05BTUVfU1RSSU5HICIgcmVnaXN0ZXIgdmFsdWVzOlxuIik7Ci0KLQlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgQUIzNTUwX05VTV9CQU5LUzsgYmFuaysrKSB7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCXNlcV9wcmludGYocywgIiBiYW5rICVkOlxuIiwgYmFuayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZWJ1Z19yYW5nZXNbYmFua10uY291bnQ7IGkrKykgewotCQkJdTggcmVnOwotCi0JCQlmb3IgKHJlZyA9IGRlYnVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5maXJzdDsKLQkJCQlyZWcgPD0gZGVidWdfcmFuZ2VzW2JhbmtdLnJhbmdlW2ldLmxhc3Q7Ci0JCQkJcmVnKyspIHsKLQkJCQl1OCB2YWx1ZTsKLQotCQkJCWdldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCBiYW5rLCByZWcsCi0JCQkJCSZ2YWx1ZSk7Ci0JCQkJc2VxX3ByaW50ZihzLCAiICBbJWQvMHglMDJYXTogMHglMDJYXG4iLCBiYW5rLAotCQkJCQlyZWcsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfcmVnaXN0ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiMzU1MF9yZWdpc3RlcnNfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjM1NTBfcmVnaXN0ZXJzX2ZvcHMgPSB7Ci0JLm9wZW4gPSBhYjM1NTBfcmVnaXN0ZXJzX29wZW4sCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IGFiMzU1MF9iYW5rX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9IHMtPnByaXZhdGU7Ci0KLQlzZXFfcHJpbnRmKHMsICIlZFxuIiwgYWItPmRlYnVnX2JhbmspOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9iYW5rX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiMzU1MF9iYW5rX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWIzNTUwX2Jhbmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB1c2VyX2Jhbms7Ci0JaW50IGVycjsKLQotCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KLQllcnIgPSBrc3RydG91bF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdXNlcl9iYW5rKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKHVzZXJfYmFuayA+PSBBQjM1NTBfTlVNX0JBTktTKSB7Ci0JCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsCi0JCQkiZGVidWdmcyBlcnJvciBpbnB1dCA+IG51bWJlciBvZiBiYW5rc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFiLT5kZWJ1Z19iYW5rID0gdXNlcl9iYW5rOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF9hZGRyZXNzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9IHMtPnByaXZhdGU7Ci0KLQlzZXFfcHJpbnRmKHMsICIweCUwMlhcbiIsIGFiLT5kZWJ1Z19hZGRyZXNzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhYjM1NTBfYWRkcmVzc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjM1NTBfYWRkcmVzc19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiMzU1MF9hZGRyZXNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9ICgoc3RydWN0IHNlcV9maWxlICopKGZpbGUtPnByaXZhdGVfZGF0YSkpLT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOwotCWludCBlcnI7Ci0KLQkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYWRkcmVzcyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmICh1c2VyX2FkZHJlc3MgPiAweGZmKSB7Ci0JCWRldl9lcnIoJmFiLT5pMmNfY2xpZW50WzBdLT5kZXYsCi0JCQkiZGVidWdmcyBlcnJvciBpbnB1dCA+IDB4ZmZcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYWItPmRlYnVnX2FkZHJlc3MgPSB1c2VyX2FkZHJlc3M7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IGFiMzU1MF92YWxfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQotewotCXN0cnVjdCBhYjM1NTAgKmFiID0gcy0+cHJpdmF0ZTsKLQlpbnQgZXJyOwotCXU4IHJlZ3ZhbHVlOwotCi0JZXJyID0gZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWIsICh1OClhYi0+ZGVidWdfYmFuaywKLQkJKHU4KWFiLT5kZWJ1Z19hZGRyZXNzLCAmcmVndmFsdWUpOwotCWlmIChlcnIpCi0JCXJldHVybiAtRUlOVkFMOwotCXNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgcmVndmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWIzNTUwX3ZhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjM1NTBfdmFsX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWIzNTUwX3ZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0Jc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwotCWludCBlcnI7Ci0JdTggcmVndmFsdWU7Ci0KLQkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKHVzZXJfdmFsID4gMHhmZikgewotCQlkZXZfZXJyKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LAotCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWVyciA9IG1hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKAotCQlhYiwgKHU4KWFiLT5kZWJ1Z19iYW5rLAotCQkodTgpYWItPmRlYnVnX2FkZHJlc3MsIDB4RkYsICh1OCl1c2VyX3ZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlnZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYiwgKHU4KWFiLT5kZWJ1Z19iYW5rLAotCQkodTgpYWItPmRlYnVnX2FkZHJlc3MsICZyZWd2YWx1ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiMzU1MF9iYW5rX2ZvcHMgPSB7Ci0JLm9wZW4gPSBhYjM1NTBfYmFua19vcGVuLAotCS53cml0ZSA9IGFiMzU1MF9iYW5rX3dyaXRlLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWIzNTUwX2FkZHJlc3NfZm9wcyA9IHsKLQkub3BlbiA9IGFiMzU1MF9hZGRyZXNzX29wZW4sCi0JLndyaXRlID0gYWIzNTUwX2FkZHJlc3Nfd3JpdGUsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjM1NTBfdmFsX2ZvcHMgPSB7Ci0JLm9wZW4gPSBhYjM1NTBfdmFsX29wZW4sCi0JLndyaXRlID0gYWIzNTUwX3ZhbF93cml0ZSwKLQkucmVhZCA9IHNlcV9yZWFkLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjM1NTBfZGlyOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiMzU1MF9yZWdfZmlsZTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjM1NTBfYmFua19maWxlOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiMzU1MF9hZGRyZXNzX2ZpbGU7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYWIzNTUwX3ZhbF9maWxlOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWIzNTUwX3NldHVwX2RlYnVnZnMoc3RydWN0IGFiMzU1MCAqYWIpCi17Ci0JYWItPmRlYnVnX2JhbmsgPSAwOwotCWFiLT5kZWJ1Z19hZGRyZXNzID0gMHgwMDsKLQotCWFiMzU1MF9kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoQUIzNTUwX05BTUVfU1RSSU5HLCBOVUxMKTsKLQlpZiAoIWFiMzU1MF9kaXIpCi0JCWdvdG8gZXhpdF9ub19kZWJ1Z2ZzOwotCi0JYWIzNTUwX3JlZ19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYWxsLXJlZ2lzdGVycyIsCi0JCVNfSVJVR08sIGFiMzU1MF9kaXIsIGFiLCAmYWIzNTUwX3JlZ2lzdGVyc19mb3BzKTsKLQlpZiAoIWFiMzU1MF9yZWdfZmlsZSkKLQkJZ290byBleGl0X2Rlc3Ryb3lfZGlyOwotCi0JYWIzNTUwX2JhbmtfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWJhbmsiLAotCQkoU19JUlVHTyB8IFNfSVdVU1IpLCBhYjM1NTBfZGlyLCBhYiwgJmFiMzU1MF9iYW5rX2ZvcHMpOwotCWlmICghYWIzNTUwX2JhbmtfZmlsZSkKLQkJZ290byBleGl0X2Rlc3Ryb3lfcmVnOwotCi0JYWIzNTUwX2FkZHJlc3NfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWFkZHJlc3MiLAotCQkoU19JUlVHTyB8IFNfSVdVU1IpLCBhYjM1NTBfZGlyLCBhYiwgJmFiMzU1MF9hZGRyZXNzX2ZvcHMpOwotCWlmICghYWIzNTUwX2FkZHJlc3NfZmlsZSkKLQkJZ290byBleGl0X2Rlc3Ryb3lfYmFuazsKLQotCWFiMzU1MF92YWxfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLXZhbHVlIiwKLQkJKFNfSVJVR08gfCBTX0lXVVNSKSwgYWIzNTUwX2RpciwgYWIsICZhYjM1NTBfdmFsX2ZvcHMpOwotCWlmICghYWIzNTUwX3ZhbF9maWxlKQotCQlnb3RvIGV4aXRfZGVzdHJveV9hZGRyZXNzOwotCi0JcmV0dXJuOwotCi1leGl0X2Rlc3Ryb3lfYWRkcmVzczoKLQlkZWJ1Z2ZzX3JlbW92ZShhYjM1NTBfYWRkcmVzc19maWxlKTsKLWV4aXRfZGVzdHJveV9iYW5rOgotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9iYW5rX2ZpbGUpOwotZXhpdF9kZXN0cm95X3JlZzoKLQlkZWJ1Z2ZzX3JlbW92ZShhYjM1NTBfcmVnX2ZpbGUpOwotZXhpdF9kZXN0cm95X2RpcjoKLQlkZWJ1Z2ZzX3JlbW92ZShhYjM1NTBfZGlyKTsKLWV4aXRfbm9fZGVidWdmczoKLQlkZXZfZXJyKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGVudHJpZXMuXG4iKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhYjM1NTBfcmVtb3ZlX2RlYnVnZnModm9pZCkKLXsKLQlkZWJ1Z2ZzX3JlbW92ZShhYjM1NTBfdmFsX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9hZGRyZXNzX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9iYW5rX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGFiMzU1MF9yZWdfZmlsZSk7Ci0JZGVidWdmc19yZW1vdmUoYWIzNTUwX2Rpcik7Ci19Ci0KLSNlbHNlIC8qICFDT05GSUdfREVCVUdfRlMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhYjM1NTBfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgYWIzNTUwICphYikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhYjM1NTBfcmVtb3ZlX2RlYnVnZnModm9pZCkKLXsKLX0KLSNlbmRpZgotCi0vKgotICogQmFzaWMgc2V0LXVwLCBkYXRhc3RydWN0dXJlIGNyZWF0aW9uL2Rlc3RydWN0aW9uIGFuZCBJMkMgaW50ZXJmYWNlLgotICogVGhpcyBzZXRzIHVwIGEgZGVmYXVsdCBjb25maWcgaW4gdGhlIEFCMzU1MCBjaGlwIHNvIHRoYXQgaXQKLSAqIHdpbGwgd29yayBhcyBleHBlY3RlZC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgYWIzNTUwX3NldHVwKHN0cnVjdCBhYjM1NTAgKmFiKQotewotCWludCBlcnIgPSAwOwotCWludCBpOwotCXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSAqcGxmX2RhdGE7Ci0Jc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzICpzZXR0aW5nczsKLQotCXBsZl9kYXRhID0gYWItPmkyY19jbGllbnRbMF0tPmRldi5wbGF0Zm9ybV9kYXRhOwotCXNldHRpbmdzID0gcGxmX2RhdGEtPmluaXRfc2V0dGluZ3M7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGxmX2RhdGEtPmluaXRfc2V0dGluZ3Nfc3o7IGkrKykgewotCQllcnIgPSBtYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYiwKLQkJCXNldHRpbmdzW2ldLmJhbmssCi0JCQlzZXR0aW5nc1tpXS5yZWcsCi0JCQkweEZGLCBzZXR0aW5nc1tpXS5zZXR0aW5nKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9ub19zZXR1cDsKLQotCQkvKiBJZiBldmVudCBtYXNrIHJlZ2lzdGVyIHVwZGF0ZSB0aGUgZXZlbnQgbWFzayBpbiBhYjM1NTAgKi8KLQkJaWYgKChzZXR0aW5nc1tpXS5iYW5rID09IDApICYmCi0JCQkoQUIzNTUwX0lNUjEgPD0gc2V0dGluZ3NbaV0ucmVnKSAmJgotCQkJKHNldHRpbmdzW2ldLnJlZyA8PSBBQjM1NTBfSU1SNSkpIHsKLQkJCWFiLT5ldmVudF9tYXNrW3NldHRpbmdzW2ldLnJlZyAtIEFCMzU1MF9JTVIxXSA9Ci0JCQkJc2V0dGluZ3NbaV0uc2V0dGluZzsKLQkJfQotCX0KLWV4aXRfbm9fc2V0dXA6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYWIzNTUwX21hc2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFiMzU1MCAqYWIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiMzU1MCwgbWFza193b3JrKTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IG1hc2tbQUIzNTUwX05VTV9FVkVOVF9SRUddOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFiLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IEFCMzU1MF9OVU1fRVZFTlRfUkVHOyBpKyspCi0JCW1hc2tbaV0gPSBhYi0+ZXZlbnRfbWFza1tpXTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IEFCMzU1MF9OVU1fRVZFTlRfUkVHOyBpKyspIHsKLQkJaW50IGVycjsKLQotCQllcnIgPSBtYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYiwgMCwKLQkJCShBQjM1NTBfSU1SMSArIGkpLCB+MCwgbWFza1tpXSk7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LAotCQkJCSJhYjM1NTBfbWFza193b3JrIGZhaWxlZCAweCV4LDB4JXhcbiIsCi0JCQkJKEFCMzU1MF9JTVIxICsgaSksIG1hc2tbaV0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWIzNTUwX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGFiMzU1MCAqYWI7Ci0Jc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKLQlpbnQgaXJxOwotCi0JYWIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLQlwbGZfZGF0YSA9IGFiLT5pMmNfY2xpZW50WzBdLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpcnEgPSBkYXRhLT5pcnEgLSBwbGZfZGF0YS0+aXJxLmJhc2U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQlhYi0+ZXZlbnRfbWFza1tpcnEgLyA4XSB8PSBCSVQoaXJxICUgOCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQotCXNjaGVkdWxlX3dvcmsoJmFiLT5tYXNrX3dvcmspOwotfQotCi1zdGF0aWMgdm9pZCBhYjM1NTBfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSAqcGxmX2RhdGE7Ci0JaW50IGlycTsKLQotCWFiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaXJxID0gZGF0YS0+aXJxIC0gcGxmX2RhdGEtPmlycS5iYXNlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFiLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0JYWItPmV2ZW50X21hc2tbaXJxIC8gOF0gJj0gfkJJVChpcnEgJSA4KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0Jc2NoZWR1bGVfd29yaygmYWItPm1hc2tfd29yayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vb3Aoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGFiMzU1MF9pcnFfY2hpcCA9IHsKLQkubmFtZQkJPSAiYWIzNTUwLWNvcmUiLCAvKiBLZWVwIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlcXVlc3QgKi8KLQkuaXJxX2Rpc2FibGUJPSBhYjM1NTBfbWFzaywgLyogTm8gZGVmYXVsdCB0byBtYXNrIGluIGNoaXAuYyAqLwotCS5pcnFfYWNrCT0gbm9vcCwKLQkuaXJxX21hc2sJPSBhYjM1NTBfbWFzaywKLQkuaXJxX3VubWFzawk9IGFiMzU1MF91bm1hc2ssCi19OwotCi1zdHJ1Y3QgYWJfZmFtaWx5X2lkIHsKLQl1OAlpZDsKLQljaGFyCSpuYW1lOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhYl9mYW1pbHlfaWQgaWRzW10gX19pbml0ZGF0YSA9IHsKLQkvKiBBQjM1NTAgKi8KLQl7Ci0JCS5pZCA9IEFCMzU1MF9QMUEsCi0JCS5uYW1lID0gIlAxQSIKLQl9LAotCS8qIFRlcm1pbmF0b3IgKi8KLQl7Ci0JCS5pZCA9IDB4MDAsCi0JfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWIzNTUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBhYjM1NTAgKmFiOwotCXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSAqYWIzNTUwX3BsZl9kYXRhID0KLQkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpbnQgZXJyOwotCWludCBpOwotCWludCBudW1faTJjX2NsaWVudHMgPSAwOwotCi0JYWIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWIzNTUwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhYikgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgIiBBQjM1NTBfTkFNRV9TVFJJTkcgIiBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlICovCi0JbXV0ZXhfaW5pdCgmYWItPmFjY2Vzc19tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFiLT5ldmVudF9sb2NrKTsKLQlhYi0+aTJjX2NsaWVudFswXSA9IGNsaWVudDsKLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGFiKTsKLQotCS8qIFJlYWQgY2hpcCBJRCByZWdpc3RlciAqLwotCWVyciA9IGdldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCAwLCBBQjM1NTBfQ0lEX1JFRywgJmFiLT5jaGlwX2lkKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY291bGQgbm90IGNvbW11bmljYXRlIHdpdGggdGhlIGFuYWxvZyAiCi0JCQkiYmFzZWJhbmQgY2hpcFxuIik7Ci0JCWdvdG8gZXhpdF9ub19kZXRlY3Q7Ci0JfQotCi0JZm9yIChpID0gMDsgaWRzW2ldLmlkICE9IDB4MDsgaSsrKSB7Ci0JCWlmIChpZHNbaV0uaWQgPT0gYWItPmNoaXBfaWQpIHsKLQkJCXNucHJpbnRmKCZhYi0+Y2hpcF9uYW1lWzBdLCBzaXplb2YoYWItPmNoaXBfbmFtZSkgLSAxLAotCQkJCUFCMzU1MF9JRF9GT1JNQVRfU1RSSU5HLCBpZHNbaV0ubmFtZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpZHNbaV0uaWQgPT0gMHgwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5rbm93biBhbmFsb2cgYmFzZWJhbmQgY2hpcCBpZDogMHgleFxuIiwKLQkJCWFiLT5jaGlwX2lkKTsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJkcml2ZXIgbm90IHN0YXJ0ZWQhXG4iKTsKLQkJZ290byBleGl0X25vX2RldGVjdDsKLQl9Ci0KLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJkZXRlY3RlZCBBQiBjaGlwOiAlc1xuIiwgJmFiLT5jaGlwX25hbWVbMF0pOwotCi0JLyogQXR0YWNoIG90aGVyIGR1bW15IEkyQyBjbGllbnRzLiAqLwotCXdoaWxlICgrK251bV9pMmNfY2xpZW50cyA8IEFCMzU1MF9OVU1fQkFOS1MpIHsKLQkJYWItPmkyY19jbGllbnRbbnVtX2kyY19jbGllbnRzXSA9Ci0JCQlpMmNfbmV3X2R1bW15KGNsaWVudC0+YWRhcHRlciwKLQkJCQkoY2xpZW50LT5hZGRyICsgbnVtX2kyY19jbGllbnRzKSk7Ci0JCWlmICghYWItPmkyY19jbGllbnRbbnVtX2kyY19jbGllbnRzXSkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXhpdF9ub19kdW1teV9jbGllbnQ7Ci0JCX0KLQkJc3RybGNweShhYi0+aTJjX2NsaWVudFtudW1faTJjX2NsaWVudHNdLT5uYW1lLCBpZC0+bmFtZSwKLQkJCXNpemVvZihhYi0+aTJjX2NsaWVudFtudW1faTJjX2NsaWVudHNdLT5uYW1lKSk7Ci0JfQotCi0JZXJyID0gYWIzNTUwX3NldHVwKGFiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXRfbm9fc2V0dXA7Ci0KLQlJTklUX1dPUksoJmFiLT5tYXNrX3dvcmssIGFiMzU1MF9tYXNrX3dvcmspOwotCi0JZm9yIChpID0gMDsgaSA8IGFiMzU1MF9wbGZfZGF0YS0+aXJxLmNvdW50OyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycTsKLQotCQlpcnEgPSBhYjM1NTBfcGxmX2RhdGEtPmlycS5iYXNlICsgaTsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBhYik7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZhYjM1NTBfaXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7Ci0JCWlycV9zZXRfbmVzdGVkX3RocmVhZChpcnEsIDEpOwotI2lmZGVmIENPTkZJR19BUk0KLQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwotI2Vsc2UKLQkJaXJxX3NldF9ub3Byb2JlKGlycSk7Ci0jZW5kaWYKLQl9Ci0KLQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgYWIzNTUwX2lycV9oYW5kbGVyLAotCQlJUlFGX09ORVNIT1QsICJhYjM1NTAtY29yZSIsIGFiKTsKLQkvKiBUaGlzIHJlYWwgdW5wcmVkaWN0YWJsZSBJUlEgaXMgb2YgY291cnNlIHNhbXBsZWQgZm9yIGVudHJvcHkgKi8KLQlyYW5kX2luaXRpYWxpemVfaXJxKGNsaWVudC0+aXJxKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9ub19pcnE7Ci0KLQllcnIgPSBhYng1MDBfcmVnaXN0ZXJfb3BzKCZjbGllbnQtPmRldiwgJmFiMzU1MF9vcHMpOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9ub19vcHM7Ci0KLQkvKiBTZXQgdXAgYW5kIHJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2VzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBBQjM1NTBfTlVNX0RFVklDRVM7IGkrKykgewotCQlhYjM1NTBfZGV2c1tpXS5wbGF0Zm9ybV9kYXRhID0gYWIzNTUwX3BsZl9kYXRhLT5kZXZfZGF0YVtpXTsKLQkJYWIzNTUwX2RldnNbaV0ucGRhdGFfc2l6ZSA9IGFiMzU1MF9wbGZfZGF0YS0+ZGV2X2RhdGFfc3pbaV07Ci0JfQotCi0JZXJyID0gbWZkX2FkZF9kZXZpY2VzKCZjbGllbnQtPmRldiwgMCwgYWIzNTUwX2RldnMsCi0JCUFSUkFZX1NJWkUoYWIzNTUwX2RldnMpLCBOVUxMLAotCQlhYjM1NTBfcGxmX2RhdGEtPmlycS5iYXNlKTsKLQotCWFiMzU1MF9zZXR1cF9kZWJ1Z2ZzKGFiKTsKLQotCXJldHVybiAwOwotCi1leGl0X25vX29wczoKLWV4aXRfbm9faXJxOgotZXhpdF9ub19zZXR1cDoKLWV4aXRfbm9fZHVtbXlfY2xpZW50OgotCS8qIFVucmVnaXN0ZXIgdGhlIGR1bW15IGkyYyBjbGllbnRzLiAqLwotCXdoaWxlICgtLW51bV9pMmNfY2xpZW50cykKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGFiLT5pMmNfY2xpZW50W251bV9pMmNfY2xpZW50c10pOwotZXhpdF9ub19kZXRlY3Q6Ci0Ja2ZyZWUoYWIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IGFiMzU1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgYWIzNTUwICphYiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCBudW1faTJjX2NsaWVudHMgPSBBQjM1NTBfTlVNX0JBTktTOwotCi0JbWZkX3JlbW92ZV9kZXZpY2VzKCZjbGllbnQtPmRldik7Ci0JYWIzNTUwX3JlbW92ZV9kZWJ1Z2ZzKCk7Ci0KLQl3aGlsZSAoLS1udW1faTJjX2NsaWVudHMpCi0JCWkyY191bnJlZ2lzdGVyX2RldmljZShhYi0+aTJjX2NsaWVudFtudW1faTJjX2NsaWVudHNdKTsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCwgYWxsIHN1YnNjcmliZXJzIHNob3VsZCBoYXZlIHVucmVnaXN0ZXJlZAotCSAqIHRoZWlyIG5vdGlmaWVycyBzbyBkZWFjdGl2YXRlIElSUQotCSAqLwotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBhYik7Ci0Ja2ZyZWUoYWIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWIzNTUwX2lkW10gPSB7Ci0Je0FCMzU1MF9OQU1FX1NUUklORywgMH0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWIzNTUwX2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFiMzU1MF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSBBQjM1NTBfTkFNRV9TVFJJTkcsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi0JLmlkX3RhYmxlCT0gYWIzNTUwX2lkLAotCS5wcm9iZQkJPSBhYjM1NTBfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChhYjM1NTBfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFiMzU1MF9pMmNfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWIzNTUwX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhYjM1NTBfaTJjX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmYWIzNTUwX2RyaXZlcik7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbChhYjM1NTBfaTJjX2luaXQpOwotbW9kdWxlX2V4aXQoYWIzNTUwX2kyY19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWF0dGlhcyBXYWxsaW4gPG1hdHRpYXMud2FsbGluQHN0ZXJpY3Nzb24uY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBQjM1NTAgY29yZSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiNTUwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYjU1MDAtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTA2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hYjU1MDAtY29yZS5jCkBAIC0wLDAgKzEsMTQ0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDExIFNULUVyaWNzc29uCisgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKKyAqIExvdy1sZXZlbCBjb3JlIGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBBQjU1MDAgSUMgb24gdGhlIEkyQyBidXMKKyAqIGFuZCBzb21lIGJhc2ljIGNoaXAtY29uZmlndXJhdGlvbi4KKyAqIEF1dGhvcjogQmVuZ3QgSm9uc3NvbiA8YmVuZ3QuZy5qb25zc29uQHN0ZXJpY3Nzb24uY29tPgorICogQXV0aG9yOiBNYXR0aWFzIE5pbHNzb24gPG1hdHRpYXMuaS5uaWxzc29uQHN0ZXJpY3Nzb24uY29tPgorICogQXV0aG9yOiBNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IFJpY2thcmQgQW5kZXJzc29uIDxyaWNrYXJkLmFuZGVyc3NvbkBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcjogS2FybCBLb21pZXJvd3NraSAgPGthcmwua29taWVyb3dza2lAc3Rlcmljc3Nvbi5jb20+CisgKiBBdXRob3I6IEJpYmVrIEJhc3UgPGJpYmVrLmJhc3VAc3Rlcmljc3Nvbi5jb20+CisgKgorICogVE9ETzogRXZlbnQgaGFuZGxpbmcgd2l0aCBpcnFfY2hpcC4gV2FpdGluZyBmb3IgUFJDTVUgZncgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RiNTUwMC1wcmNtdS5oPgorCisjaW5jbHVkZSAiYWI1NTAwLWNvcmUuaCIKKyNpbmNsdWRlICJhYjU1MDAtZGVidWdmcy5oIgorCisjZGVmaW5lIEFCNTUwMF9OVU1fRVZFTlRfUkVHIDIzCisjZGVmaW5lIEFCNTUwMF9JVF9MQVRDSDBfUkVHIDB4NDAKKyNkZWZpbmUgQUI1NTAwX0lUX01BU0swX1JFRyAweDYwCisKKy8qCisgKiBQZXJtaXNzaWJsZSByZWdpc3RlciByYW5nZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcGVyIGRldmljZSBhbmQgYmFuay4KKyAqCisgKiBUaGUgcmFuZ2VzIG11c3QgYmUgbGlzdGVkIGluIGluY3JlYXNpbmcgYWRkcmVzcyBvcmRlciwgYW5kIG5vIG92ZXJsYXBzIGFyZQorICogYWxsb3dlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IHdyaXRlIHBlcm1pc3Npb24gaW1wbGllcyByZWFkIHBlcm1pc3Npb24KKyAqIChpLmUuIG9ubHkgUk8gYW5kIFJXIHBlcm1pc3Npb25zIHNob3VsZCBiZSB1c2VkKS4gIFJhbmdlcyB3aXRoIHdyaXRlCisgKiBwZXJtaXNzaW9uIG11c3Qgbm90IGJlIHNwbGl0IHVwLgorICovCisKKyNkZWZpbmUgTk9fUkFOR0Ugey5jb3VudCA9IDAsIC5yYW5nZSA9IE5VTEwsfQorc3RhdGljIHN0cnVjdCBhYjU1MDBfaTJjX2JhbmtzIGFiNTUwMF9iYW5rX3Jhbmdlc1tBQjU1MDBfTlVNX0RFVklDRVNdID0geworCVtBQjU1MDBfREVWSURfVVNCXSA9ICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVVNCLAorCQkJCS5ucmFuZ2VzID0gMTIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMSwKKwkJCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJCQkubGFzdCA9IDB4ODMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDg3LAorCQkJCQkJLmxhc3QgPSAweDhBLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg4QiwKKwkJCQkJCS5sYXN0ID0gMHg4QiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4OTEsCisJCQkJCQkubGFzdCA9IDB4OTIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDkzLAorCQkJCQkJLmxhc3QgPSAweDkzLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg5NCwKKwkJCQkJCS5sYXN0ID0gMHg5NCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QTgsCisJCQkJCQkubGFzdCA9IDB4QjAsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEIyLAorCQkJCQkJLmxhc3QgPSAweEIyLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhCNCwKKwkJCQkJCS5sYXN0ID0gMHhCQywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QkYsCisJCQkJCQkubGFzdCA9IDB4QkYsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEMxLAorCQkJCQkJLmxhc3QgPSAweEM1LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfQURDXSA9ICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQURDLAorCQkJCS5ucmFuZ2VzID0gNiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDFGLAorCQkJCQkJLmxhc3QgPSAweDIyLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgyMywKKwkJCQkJCS5sYXN0ID0gMHgyNCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MjYsCisJCQkJCQkubGFzdCA9IDB4MkQsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDJGLAorCQkJCQkJLmxhc3QgPSAweDM0LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgzNywKKwkJCQkJCS5sYXN0ID0gMHg1NywKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NTgsCisJCQkJCQkubGFzdCA9IDB4NTgsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9MRURTXSA9ICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfTEVELAorCQkJCS5ucmFuZ2VzID0gMSwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAwLAorCQkJCQkJLmxhc3QgPSAweDBDLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfVklERU9dID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVkRFTkMsCisJCQkJLm5yYW5nZXMgPSAxMiwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDAwLAorCQkJCQkJLmxhc3QgPSAweDA4LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwOSwKKwkJCQkJCS5sYXN0ID0gMHgwOSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MEEsCisJCQkJCQkubGFzdCA9IDB4MTIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDE1LAorCQkJCQkJLmxhc3QgPSAweDE5LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxQiwKKwkJCQkJCS5sYXN0ID0gMHgyMSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MjcsCisJCQkJCQkubGFzdCA9IDB4MkMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDQxLAorCQkJCQkJLmxhc3QgPSAweDQxLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg0NSwKKwkJCQkJCS5sYXN0ID0gMHg1QiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NUQsCisJCQkJCQkubGFzdCA9IDB4NUQsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDY5LAorCQkJCQkJLmxhc3QgPSAweDY5LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg2QywKKwkJCQkJCS5sYXN0ID0gMHg2RCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJCQkubGFzdCA9IDB4ODEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9SRUdVTEFUT1JTXSA9ICAgeworCQkubmJhbmtzID0gMiwKKwkJLmJhbmsgPSAgKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19TVEFSVFVQLAorCQkJCS5ucmFuZ2VzID0gMTIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MUYsCisJCQkJCQkubGFzdCA9IDB4MUYsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDJFLAorCQkJCQkJLmxhc3QgPSAweDJFLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgyRiwKKwkJCQkJCS5sYXN0ID0gMHgzMCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4NTAsCisJCQkJCQkubGFzdCA9IDB4NTEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDYwLAorCQkJCQkJLmxhc3QgPSAweDYxLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHg2NiwKKwkJCQkJCS5sYXN0ID0gMHg4QSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4OEMsCisJCQkJCQkubGFzdCA9IDB4OTYsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEFBLAorCQkJCQkJLmxhc3QgPSAweEI0LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHhCNywKKwkJCQkJCS5sYXN0ID0gMHhCRiwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4QzEsCisJCQkJCQkubGFzdCA9IDB4Q0EsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEQzLAorCQkJCQkJLmxhc3QgPSAweEUwLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfU0lNX1VTQlNJTSwKKwkJCQkubnJhbmdlcyA9IDEsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxMywKKwkJCQkJCS5sYXN0ID0gMHgxOSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1NJTV0gPSAgIHsKKwkJLm5iYW5rcyA9IDEsCisJCS5iYW5rID0gKHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyBbXSkgeworCQkJeworCQkJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19TSU1fVVNCU0lNLAorCQkJCS5ucmFuZ2VzID0gMSwKKwkJCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDEzLAorCQkJCQkJLmxhc3QgPSAweDE5LAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfUlRDXSA9ICAgeworCQkubmJhbmtzID0gMSwKKwkJLmJhbmsgPSAoc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIFtdKSB7CisJCQl7CisJCQkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1JUQywKKwkJCQkubnJhbmdlcyA9IDIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkJCS5sYXN0ID0gMHgwNCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MDYsCisJCQkJCQkubGFzdCA9IDB4MEMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9DSEFSR0VSXSA9ICAgeworCQkubmJhbmtzID0gMSwKKwkJLmJhbmsgPSAoc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIFtdKSB7CisJCQl7CisJCQkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0NIRywKKwkJCQkubnJhbmdlcyA9IDIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgxMSwKKwkJCQkJCS5sYXN0ID0gMHgxMSwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MTIsCisJCQkJCQkubGFzdCA9IDB4MUIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9GVUVMR0FVR0VdID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfRkdfQkFUVENPTV9BQ0MsCisJCQkJLm5yYW5nZXMgPSAyLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJCQkubGFzdCA9IDB4MEIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweDBDLAorCQkJCQkJLmxhc3QgPSAweDEwLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfVklCUkFUT1JdID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVklCUkEsCisJCQkJLm5yYW5nZXMgPSAyLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MTAsCisJCQkJCQkubGFzdCA9IDB4MTMsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCQl7CisJCQkJCQkuZmlyc3QgPSAweEZFLAorCQkJCQkJLmxhc3QgPSAweEZFLAorCQkJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCQkJfSwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfQ09ERUNdID0gICB7CisJCS5uYmFua3MgPSAxLAorCQkuYmFuayA9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfQVVESU9fSEVBRFNFVFVTQiwKKwkJCQkubnJhbmdlcyA9IDIsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkJCS5sYXN0ID0gMHg0OCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4RUIsCisJCQkJCQkubGFzdCA9IDB4RkIsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9QT1dFUl0gPSB7CisJCS5uYmFua3MJPSAyLAorCQkuYmFuawk9IChzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgW10pIHsKKwkJCXsKKwkJCQkuYmFua2lkID0gQUI1NTAwX0JBTktfU1RBUlRVUCwKKwkJCQkubnJhbmdlcyA9IDEsCisJCQkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCQkJeworCQkJCQkJLmZpcnN0ID0gMHgzMCwKKwkJCQkJCS5sYXN0ID0gMHgzMCwKKwkJCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQkJCX0sCisJCQkJfSwKKwkJCX0sCisJCQl7CisJCQkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1ZJVF9JT19JMkNfQ0xLX1RTVF9PVFAsCisJCQkJLm5yYW5nZXMgPSAxLAorCQkJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQkJCXsKKwkJCQkJCS5maXJzdCA9IDB4MDEsCisJCQkJCQkubGFzdCA9IDB4MDEsCisJCQkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJCQl9LAorCQkJCX0sCisJCQl9LAorCQl9LAorCX0sCit9OworCisjZGVmaW5lIEFCNTUwMF9JUlEoYmFuaywgYml0KQkoKGJhbmspICogOCArIChiaXQpKQorCisvKiBJIGFwcG9sb2dpemUgZm9yIHRoZSByZXNvdXJjZSBuYW1lcyBiZWVpbmcgYSBtaXggb2YgdXBwZXIgY2FzZQorICogYW5kIGxvd2VyIGNhc2UgYnV0IEkgd2FudCB0aGVtIHRvIGJlIGV4YWN0IGFzIHRoZSBkb2N1bWVudGF0aW9uICovCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFiNTUwMF9kZXZzW0FCNTUwMF9OVU1fREVWSUNFU10gPSB7CisJW0FCNTUwMF9ERVZJRF9MRURTXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLWxlZHMiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfTEVEUywKKwl9LAorCVtBQjU1MDBfREVWSURfUE9XRVJdID0geworCQkubmFtZSA9ICJhYjU1MDAtcG93ZXIiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfUE9XRVIsCisJfSwKKwlbQUI1NTAwX0RFVklEX1JFR1VMQVRPUlNdID0geworCQkubmFtZSA9ICJhYjU1MDAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX1JFR1VMQVRPUlMsCisJfSwKKwlbQUI1NTAwX0RFVklEX1NJTV0gPSB7CisJCS5uYW1lID0gImFiNTUwMC1zaW0iLAorCQkuaWQgPSBBQjU1MDBfREVWSURfU0lNLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZSA9ICJTSU1PRkYiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMiwgMCksIC8qcmlzaW5nKi8KKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgyLCAxKSwgLypmYWxsaW5nKi8KKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1JUQ10gPSB7CisJCS5uYW1lID0gImFiNTUwMC1ydGMiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfUlRDLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJSVENfQWxhcm0iLAorCQkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydAk9IEFCNTUwMF9JUlEoMSwgNyksCisJCQkJLmVuZAk9IEFCNTUwMF9JUlEoMSwgNyksCisJCQl9CisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX0NIQVJHRVJdID0geworCQkubmFtZSA9ICJhYjU1MDAtY2hhcmdlciIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9DSEFSR0VSLAorCX0sCisJW0FCNTUwMF9ERVZJRF9BRENdID0geworCQkubmFtZSA9ICJhYjU1MDAtYWRjIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX0FEQywKKwkJLm51bV9yZXNvdXJjZXMgPSAxMCwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItMCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCAwKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCAwKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi0xIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLTIiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgMiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItMyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCAzKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi00IiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDQpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDQpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLTUiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgNSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgNSksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItNiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgwLCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgwLCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVFJJR0dFUi03IiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDcpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJUUklHR0VSLVZCQVQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMCwgOCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMCwgOCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlRSSUdHRVItVkJBVC1UWE9OIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDAsIDkpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDAsIDkpLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfRlVFTEdBVUdFXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLWZ1ZWxnYXVnZSIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9GVUVMR0FVR0UsCisJCS5udW1fcmVzb3VyY2VzID0gNiwKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lID0gIkJhdHRfYXR0YWNoIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDcsIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDcsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJCYXR0X3JlbW92YWwiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoNywgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoNywgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlVBUlRfZnJhbWluZyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg3LCA3KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg3LCA3KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVUFSVF9vdmVycnVuIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDgsIDApLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDgsIDApLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVQVJUX1JkeV9SWCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg4LCAxKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg4LCAxKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVUFSVF9SZHlfVFgiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOCwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOCwgMiksCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9ERVZJRF9WSUJSQVRPUl0gPSB7CisJCS5uYW1lID0gImFiNTUwMC12aWJyYXRvciIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9WSUJSQVRPUiwKKwl9LAorCVtBQjU1MDBfREVWSURfQ09ERUNdID0geworCQkubmFtZSA9ICJhYjU1MDAtY29kZWMiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfQ09ERUMsCisJCS5udW1fcmVzb3VyY2VzID0gMywKKwkJLnJlc291cmNlcyA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5uYW1lID0gImF1ZGlvX3Nwa3IxX292YyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg5LCA1KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg5LCA1KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiYXVkaW9fcGxsbG9ja2VkIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDYpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJhdWRpb19zcGtyMl9vdmMiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTcsIDQpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE3LCA0KSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX1VTQl0gPSB7CisJCS5uYW1lID0gImFiNTUwMC11c2IiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfVVNCLAorCQkubnVtX3Jlc291cmNlcyA9IDM2LAorCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUgPSAiTGlua19VcGRhdGUiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMjIsIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIyLCAxKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiRENJTyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg4LCAzKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg4LCA0KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVkJVU19SIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDgsIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDgsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJWQlVTX0YiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOCwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOCwgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNIR3N0YXRlXzEwX1BDVkJVU2NoZyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg4LCA3KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg4LCA3KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiRENJT3JldmVyc2Vfb3ZjIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDApLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDApLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJVU0JDaGFyRGV0RG9uZSIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg5LCAxKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg5LCAxKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiRENJT19ub19saW1pdCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSg5LCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSg5LCAyKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVVNCX3N1c3BlbmQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOSwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOSwgMyksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkRDSU9yZXZlcnNlX2Z3ZGN1cnJlbnQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoOSwgNCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoOSwgNCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlZidXNfSW1lYXNtYXhfY2hhbmdlIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDksIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDksIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJPVlYiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTQsIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE0LCA1KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVVNCY2hhcmdpbmdfTk9Ub2siLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTUsIDMpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE1LCAzKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAidXNiX2FkcF9zZW5zb3JvZmYiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTUsIDYpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE1LCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAidXNiX2FkcF9wcm9iZXBsdWciLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTUsIDcpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE1LCA3KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAidXNiX2FkcF9zaW5rZXJyb3IiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTYsIDApLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE2LCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAidXNiX2FkcF9zb3VyY2VlcnJvciIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRnbmRfciIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDIpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRnbmRfZiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRkZXRSMSIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgNCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDUpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRkZXRSMiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNiwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTYsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRkZXRSMyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNywgMCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTcsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJ1c2JfaWRkZXRSNCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNywgMiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTcsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDaGFyVGVtcFdpbmRvd09rIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE3LCA3KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxOCwgMCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlVTQl9TcHJEZXRlY3QiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTgsIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE4LCAxKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAidXNiX2FkcF9wcm9iZV91bnBsdWciLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTgsIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE4LCAyKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiVkJVU0NoRHJvcCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxOCwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTgsIDQpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJkY2lvX2NoYXJfcmVjX2RvbmUiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTgsIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE4LCA1KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ2hhcmdpbmdfc3RvcHBlZF9ieV90ZW1wIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE4LCA2KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxOCwgNiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNIR3N0YXRlXzExX1NhZmVNb2RlVkJVUyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDIpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xMl9jb21sZXRlZFZCVVMiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMjEsIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIxLCAyKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ0hHc3RhdGVfMTNfY29tcGxldGVkVkJVUyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xNF9GdWxsQ2hnRENJTyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgNCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDQpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJDSEdzdGF0ZV8xNV9TYWZlTW9kZURDSU8iLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMjEsIDUpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIxLCA1KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ0hHc3RhdGVfMTZfT0ZGc3VzcGVuZERDSU8iLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMjEsIDYpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIxLCA2KSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiQ0hHc3RhdGVfMTdfY29tcGxldGVkRENJTyIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgyMSwgNyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMjEsIDcpLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfREVWSURfT1RQXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLW90cCIsCisJCS5pZCA9IEFCNTUwMF9ERVZJRF9PVFAsCisJfSwKKwlbQUI1NTAwX0RFVklEX1ZJREVPXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLXZpZGVvIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX1ZJREVPLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZSA9ICJwbHVnVFZkZXQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMjIsIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDIyLCAyKSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX0RCSUVDSV0gPSB7CisJCS5uYW1lID0gImFiNTUwMC1kYmllY2kiLAorCQkuaWQgPSBBQjU1MDBfREVWSURfREJJRUNJLAorCQkubnVtX3Jlc291cmNlcyA9IDEwLAorCQkucmVzb3VyY2VzID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7CisJCQl7CisJCQkJLm5hbWUgPSAiQ09MTCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgMCksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDApLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJSRVNFUlIiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTQsIDEpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE0LCAxKSwKKwkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiRlJBRVJSIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCAyKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgMiksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkNPTUVSUiIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgMyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJCU0lfaW5kaWNhdG9yIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE0LCA0KSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNCwgNCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlNQRFNFVCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgNiksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDYpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJEU0VOVCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNCwgNyksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTQsIDcpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJEUkVDIiwKKwkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQgPSBBQjU1MDBfSVJRKDE1LCAwKSwKKwkJCQkuZW5kID0gQUI1NTAwX0lSUSgxNSwgMCksCisJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIkFDQ0lOVCIsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0ID0gQUI1NTAwX0lSUSgxNSwgMSksCisJCQkJLmVuZCA9IEFCNTUwMF9JUlEoMTUsIDEpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJOT1BJTlQiLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQkJCS5zdGFydCA9IEFCNTUwMF9JUlEoMTUsIDIpLAorCQkJCS5lbmQgPSBBQjU1MDBfSVJRKDE1LCAyKSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0RFVklEX09OU1dBXSA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLW9uc3dhIiwKKwkJLmlkID0gQUI1NTAwX0RFVklEX09OU1dBLAorCQkubnVtX3Jlc291cmNlcyA9IDIsCisJCS5yZXNvdXJjZXMgPSAoc3RydWN0IHJlc291cmNlW10pIHsKKwkJCXsKKwkJCQkubmFtZQk9ICJPTlNXQW5fcmlzaW5nIiwKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwkJCQkuc3RhcnQJPSBBQjU1MDBfSVJRKDEsIDMpLAorCQkJCS5lbmQJPSBBQjU1MDBfSVJRKDEsIDMpLAorCQkJfSwKKwkJCXsKKwkJCQkubmFtZQk9ICJPTlNXQW5fZmFsbGluZyIsCisJCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJCQkJLnN0YXJ0CT0gQUI1NTAwX0lSUSgxLCA0KSwKKwkJCQkuZW5kCT0gQUI1NTAwX0lSUSgxLCA0KSwKKwkJCX0sCisJCX0sCisJfSwKK307CisKKy8qCisgKiBGdW5jdGlvbmFsaXR5IGZvciBnZXR0aW5nL3NldHRpbmcgcmVnaXN0ZXIgdmFsdWVzLgorICovCitpbnQgYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhzdHJ1Y3QgYWI1NTAwICphYiwKKwkJCQkJICB1OCBiYW5rLCB1OCByZWcsCisJCQkJCSAgdTggKnZhbHVlKQoreworCWludCBlcnI7CisKKwlpZiAoYmFuayA+PSBBQjU1MDBfTlVNX0JBTktTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWItPmFjY2Vzc19tdXRleCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBkYjU1MDBfcHJjbXVfYWJiX3JlYWQoYmFua2luZm9bYmFua10uc2xhdmVfYWRkciwgcmVnLCB2YWx1ZSwgMSk7CisKKwltdXRleF91bmxvY2soJmFiLT5hY2Nlc3NfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZShzdHJ1Y3QgYWI1NTAwICphYiwgdTggYmFuaywKKwl1OCBmaXJzdF9yZWcsIHU4ICpyZWd2YWxzLCB1OCBudW1yZWdzKQoreworCWludCBlcnI7CisKKwlpZiAoYmFuayA+PSBBQjU1MDBfTlVNX0JBTktTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWItPmFjY2Vzc19tdXRleCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXdoaWxlIChudW1yZWdzKSB7CisJCS8qIFRoZSBoYXJkd2FyZSBsaW1pdCBmb3IgZ2V0IHBhZ2UgaXMgNCAqLworCQl1OCBjdXJudW0gPSBtaW5fdCh1OCwgbnVtcmVncywgNHUpOworCisJCWVyciA9IGRiNTUwMF9wcmNtdV9hYmJfcmVhZChiYW5raW5mb1tiYW5rXS5zbGF2ZV9hZGRyLAorCQkJCQkgICAgZmlyc3RfcmVnLCByZWd2YWxzLCBjdXJudW0pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJbnVtcmVncyAtPSBjdXJudW07CisJCWZpcnN0X3JlZyArPSBjdXJudW07CisJCXJlZ3ZhbHMgKz0gY3VybnVtOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmYWItPmFjY2Vzc19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoc3RydWN0IGFiNTUwMCAqYWIsIHU4IGJhbmssCisJdTggcmVnLCB1OCBiaXRtYXNrLCB1OCBiaXR2YWx1ZXMpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoYmFuayA+PSBBQjU1MDBfTlVNX0JBTktTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiaXRtYXNrKSB7CisJCXU4IGJ1ZjsKKworCQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFiLT5hY2Nlc3NfbXV0ZXgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoYml0bWFzayA9PSAweEZGKSAvKiBObyBuZWVkIHRvIHJlYWQgaW4gdGhpcyBjYXNlLiAqLworCQkJYnVmID0gYml0dmFsdWVzOworCQllbHNlIHsgLyogUmVhZCBhbmQgbW9kaWZ5IHRoZSByZWdpc3RlciB2YWx1ZS4gKi8KKwkJCWVyciA9IGRiNTUwMF9wcmNtdV9hYmJfcmVhZChiYW5raW5mb1tiYW5rXS5zbGF2ZV9hZGRyLAorCQkJCXJlZywgJmJ1ZiwgMSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCWJ1ZiA9ICgofmJpdG1hc2sgJiBidWYpIHwgKGJpdG1hc2sgJiBiaXR2YWx1ZXMpKTsKKwkJfQorCQkvKiBXcml0ZSB0aGUgbmV3IHZhbHVlLiAqLworCQllcnIgPSBkYjU1MDBfcHJjbXVfYWJiX3dyaXRlKGJhbmtpbmZvW2JhbmtdLnNsYXZlX2FkZHIsIHJlZywKKwkJCQkJICAgICAmYnVmLCAxKTsKKworCQltdXRleF91bmxvY2soJmFiLT5hY2Nlc3NfbXV0ZXgpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitzZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgYWI1NTAwICphYiwgdTggYmFuaywgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwgYmFuaywgcmVnLAorCQkJCQkJCSAgICAgIDB4ZmYsIHZhbHVlKTsKK30KKworLyoKKyAqIFJlYWQvd3JpdGUgcGVybWlzc2lvbiBjaGVja2luZyBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWI1NTAwX2kyY19yYW5nZXMgKmdldF9iYW5rcmVmKHU4IGRldmlkLCB1OCBiYW5rKQoreworCXU4IGk7CisKKwlpZiAoZGV2aWQgPCBBQjU1MDBfTlVNX0RFVklDRVMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFiNTUwMF9iYW5rX3Jhbmdlc1tkZXZpZF0ubmJhbmtzOyBpKyspIHsKKwkJCWlmIChhYjU1MDBfYmFua19yYW5nZXNbZGV2aWRdLmJhbmtbaV0uYmFua2lkID09IGJhbmspCisJCQkJcmV0dXJuICZhYjU1MDBfYmFua19yYW5nZXNbZGV2aWRdLmJhbmtbaV07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIHBhZ2Vfd3JpdGVfYWxsb3dlZCh1OCBkZXZpZCwgdTggYmFuaywgdTggZmlyc3RfcmVnLCB1OCBsYXN0X3JlZykKK3sKKwl1OCBpOyAvKiByYW5nZSBsb29wIGluZGV4ICovCisJY29uc3Qgc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzICpiYW5rcmVmOworCisJYmFua3JlZiA9IGdldF9iYW5rcmVmKGRldmlkLCBiYW5rKTsKKwlpZiAoYmFua3JlZiA9PSBOVUxMIHx8IGxhc3RfcmVnIDwgZmlyc3RfcmVnKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmFua3JlZi0+bnJhbmdlczsgaSsrKSB7CisJCWlmIChmaXJzdF9yZWcgPCBiYW5rcmVmLT5yYW5nZVtpXS5maXJzdCkKKwkJCWJyZWFrOworCQlpZiAoKGxhc3RfcmVnIDw9IGJhbmtyZWYtPnJhbmdlW2ldLmxhc3QpICYmCisJCQkoYmFua3JlZi0+cmFuZ2VbaV0ucGVybSAmIEFCNTUwMF9QRVJNX1dSKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHJlZ193cml0ZV9hbGxvd2VkKHU4IGRldmlkLCB1OCBiYW5rLCB1OCByZWcpCit7CisJcmV0dXJuIHBhZ2Vfd3JpdGVfYWxsb3dlZChkZXZpZCwgYmFuaywgcmVnLCByZWcpOworfQorCitzdGF0aWMgYm9vbCBwYWdlX3JlYWRfYWxsb3dlZCh1OCBkZXZpZCwgdTggYmFuaywgdTggZmlyc3RfcmVnLCB1OCBsYXN0X3JlZykKK3sKKwl1OCBpOworCWNvbnN0IHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyAqYmFua3JlZjsKKworCWJhbmtyZWYgPSBnZXRfYmFua3JlZihkZXZpZCwgYmFuayk7CisJaWYgKGJhbmtyZWYgPT0gTlVMTCB8fCBsYXN0X3JlZyA8IGZpcnN0X3JlZykKKwkJcmV0dXJuIGZhbHNlOworCisKKwkvKiBGaW5kIHRoZSByYW5nZSAoaWYgaXQgZXhpc3RzIGluIHRoZSBsaXN0KSB0aGF0IGluY2x1ZGVzIGZpcnN0X3JlZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmFua3JlZi0+bnJhbmdlczsgaSsrKSB7CisJCWlmIChmaXJzdF9yZWcgPCBiYW5rcmVmLT5yYW5nZVtpXS5maXJzdCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGZpcnN0X3JlZyA8PSBiYW5rcmVmLT5yYW5nZVtpXS5sYXN0KQorCQkJYnJlYWs7CisJfQorCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbnRpcmUgcmFuZ2UgdXAgdG8gYW5kIGluY2x1ZGluZyBsYXN0X3JlZyBpcworCSAqIHJlYWRhYmxlLiBUaGlzIG1heSBzcGFuIHNldmVyYWwgb2YgdGhlIHJhbmdlcyBpbiB0aGUgbGlzdC4KKwkgKi8KKwl3aGlsZSAoKGkgPCBiYW5rcmVmLT5ucmFuZ2VzKSAmJgorCQkoYmFua3JlZi0+cmFuZ2VbaV0ucGVybSAmIEFCNTUwMF9QRVJNX1JEKSkgeworCQlpZiAobGFzdF9yZWcgPD0gYmFua3JlZi0+cmFuZ2VbaV0ubGFzdCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoKCsraSA+PSBiYW5rcmVmLT5ucmFuZ2VzKSB8fAorCQkJKGJhbmtyZWYtPnJhbmdlW2ldLmZpcnN0ICE9CisJCQkJKGJhbmtyZWYtPnJhbmdlW2kgLSAxXS5sYXN0ICsgMSkpKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHJlZ19yZWFkX2FsbG93ZWQodTggZGV2aWQsIHU4IGJhbmssIHU4IHJlZykKK3sKKwlyZXR1cm4gcGFnZV9yZWFkX2FsbG93ZWQoZGV2aWQsIGJhbmssIHJlZywgcmVnKTsKK30KKworCisvKgorICogVGhlIGV4cG9ydGVkIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbmFsaXR5LgorICovCitzdGF0aWMgaW50IGFiNTUwMF9nZXRfY2hpcF9pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCisJcmV0dXJuIChpbnQpYWItPmNoaXBfaWQ7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggYmFuaywgdTggcmVnLCB1OCBiaXRtYXNrLCB1OCBiaXR2YWx1ZXMpCit7CisJc3RydWN0IGFiNTUwMCAqYWI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJaWYgKChBQjU1MDBfTlVNX0JBTktTIDw9IGJhbmspIHx8CisJCSFyZWdfd3JpdGVfYWxsb3dlZChwZGV2LT5pZCwgYmFuaywgcmVnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJcmV0dXJuIGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsIGJhbmssIHJlZywKKwkJYml0bWFzaywgYml0dmFsdWVzKTsKK30KKworc3RhdGljIGludCBhYjU1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLAorCXU4IHJlZywgdTggdmFsdWUpCit7CisJcmV0dXJuIGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIGJhbmssIHJlZywgMHhGRiwKKwkJdmFsdWUpOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGJhbmssCisJCXU4IHJlZywgdTggKnZhbHVlKQoreworCXN0cnVjdCBhYjU1MDAgKmFiOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCWlmICgoQUI1NTAwX05VTV9CQU5LUyA8PSBiYW5rKSB8fAorCQkhcmVnX3JlYWRfYWxsb3dlZChwZGV2LT5pZCwgYmFuaywgcmVnKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJcmV0dXJuIGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsIGJhbmssIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9nZXRfcmVnaXN0ZXJfcGFnZV9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggYmFuaywKKwkJdTggZmlyc3RfcmVnLCB1OCAqcmVndmFscywgdTggbnVtcmVncykKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisKKwlpZiAoKEFCNTUwMF9OVU1fQkFOS1MgPD0gYmFuaykgfHwKKwkJIXBhZ2VfcmVhZF9hbGxvd2VkKHBkZXYtPmlkLCBiYW5rLAorCQkJZmlyc3RfcmVnLCAoZmlyc3RfcmVnICsgbnVtcmVncyAtIDEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJcmV0dXJuIGdldF9yZWdpc3Rlcl9wYWdlX2ludGVycnVwdGlibGUoYWIsIGJhbmssIGZpcnN0X3JlZywgcmVndmFscywKKwkJbnVtcmVncyk7Cit9CisKK3N0YXRpYyBpbnQKK2FiNTUwMF9ldmVudF9yZWdpc3RlcnNfc3RhcnR1cF9zdGF0ZV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqZXZlbnQpCit7CisJc3RydWN0IGFiNTUwMCAqYWI7CisKKwlhYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJaWYgKCFhYi0+c3RhcnR1cF9ldmVudHNfcmVhZCkKKwkJcmV0dXJuIC1FQUdBSU47IC8qIFRyeSBhZ2FpbiBsYXRlciAqLworCisJbWVtY3B5KGV2ZW50LCBhYi0+c3RhcnR1cF9ldmVudHMsIEFCNTUwMF9OVU1fRVZFTlRfUkVHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhYng1MDBfb3BzIGFiNTUwMF9vcHMgPSB7CisJLmdldF9jaGlwX2lkID0gYWI1NTAwX2dldF9jaGlwX2lkLAorCS5nZXRfcmVnaXN0ZXIgPSBhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUsCisJLnNldF9yZWdpc3RlciA9IGFiNTUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSwKKwkuZ2V0X3JlZ2lzdGVyX3BhZ2UgPSBhYjU1MDBfZ2V0X3JlZ2lzdGVyX3BhZ2VfaW50ZXJydXB0aWJsZSwKKwkuc2V0X3JlZ2lzdGVyX3BhZ2UgPSBOVUxMLAorCS5tYXNrX2FuZF9zZXRfcmVnaXN0ZXIgPSBhYjU1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUsCisJLmV2ZW50X3JlZ2lzdGVyc19zdGFydHVwX3N0YXRlX2dldCA9CisJCWFiNTUwMF9ldmVudF9yZWdpc3RlcnNfc3RhcnR1cF9zdGF0ZV9nZXQsCisJLnN0YXJ0dXBfaXJxX2VuYWJsZWQgPSBOVUxMLAorfTsKKworLyoKKyAqIGFiNTUwMF9zZXR1cCA6IEJhc2ljIHNldC11cCwgZGF0YXN0cnVjdHVyZSBjcmVhdGlvbi9kZXN0cnVjdGlvbgorICoJCSAgYW5kIEkyQyBpbnRlcmZhY2UuVGhpcyBzZXRzIHVwIGEgZGVmYXVsdCBjb25maWcKKyAqCQkgIGluIHRoZSBBQjU1MDAgY2hpcCBzbyB0aGF0IGl0IHdpbGwgd29yayBhcyBleHBlY3RlZC4KKyAqIEBhYiA6CSAgUG9pbnRlciB0byBhYjU1MDAgc3RydWN0dXJlCisgKiBAc2V0dGluZ3MgOiAgICBQb2ludGVyIHRvIHN0cnVjdCBhYng1MDBfaW5pdF9zZXR0aW5ncworICogQHNpemUgOiAgICAgICAgU2l6ZSBvZiBpbml0IGRhdGEKKyAqLworc3RhdGljIGludCBfX2luaXQgYWI1NTAwX3NldHVwKHN0cnVjdCBhYjU1MDAgKmFiLAorCXN0cnVjdCBhYng1MDBfaW5pdF9zZXR0aW5ncyAqc2V0dGluZ3MsIHVuc2lnbmVkIGludCBzaXplKQoreworCWludCBlcnIgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQllcnIgPSBhYjU1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLAorCQkJc2V0dGluZ3NbaV0uYmFuaywKKwkJCXNldHRpbmdzW2ldLnJlZywKKwkJCTB4RkYsIHNldHRpbmdzW2ldLnNldHRpbmcpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X25vX3NldHVwOworCisJCS8qIElmIGV2ZW50IG1hc2sgcmVnaXN0ZXIgdXBkYXRlIHRoZSBldmVudCBtYXNrIGluIGFiNTUwMCAqLworCQlpZiAoKHNldHRpbmdzW2ldLmJhbmsgPT0gQUI1NTAwX0JBTktfSVQpICYmCisJCQkoQUI1NTAwX01BU0tfQkFTRSA8PSBzZXR0aW5nc1tpXS5yZWcpICYmCisJCQkoc2V0dGluZ3NbaV0ucmVnIDw9IEFCNTUwMF9NQVNLX0VORCkpIHsKKwkJCWFiLT5tYXNrW3NldHRpbmdzW2ldLnJlZyAtIEFCNTUwMF9NQVNLX0JBU0VdID0KKwkJCQlzZXR0aW5nc1tpXS5zZXR0aW5nOworCQl9CisJfQorZXhpdF9ub19zZXR1cDoKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgYWJfZmFtaWx5X2lkIHsKKwl1OAlpZDsKKwljaGFyCSpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhYl9mYW1pbHlfaWQgaWRzW10gX19pbml0ZGF0YSA9IHsKKwkvKiBBQjU1MDAgKi8KKwl7CisJCS5pZCA9IEFCNTUwMF8xXzAsCisJCS5uYW1lID0gIjEuMCIKKwl9LAorCXsKKwkJLmlkID0gQUI1NTAwXzFfMSwKKwkJLm5hbWUgPSAiMS4xIgorCX0sCisJLyogVGVybWluYXRvciAqLworCXsKKwkJLmlkID0gMHgwMCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYjU1MDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYjsKKwlzdHJ1Y3QgYWI1NTAwX3BsYXRmb3JtX2RhdGEgKmFiNTUwMF9wbGZfZGF0YSA9CisJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnI7CisJaW50IGk7CisKKwlhYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYjU1MDApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFiKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJjb3VsZCBub3QgYWxsb2NhdGUgYWI1NTAwIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmUgKi8KKwltdXRleF9pbml0KCZhYi0+YWNjZXNzX211dGV4KTsKKwltdXRleF9pbml0KCZhYi0+aXJxX2xvY2spOworCWFiLT5kZXYgPSAmcGRldi0+ZGV2OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWIpOworCisJLyogUmVhZCBjaGlwIElEIHJlZ2lzdGVyICovCisJZXJyID0gYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwKKwkJCQkJQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUCwKKwkJCQkJQUI1NTAwX0NISVBfSUQsICZhYi0+Y2hpcF9pZCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgYW5hbG9nICIKKwkJCSJiYXNlYmFuZCBjaGlwXG4iKTsKKwkJZ290byBleGl0X25vX2RldGVjdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpZHNbaV0uaWQgIT0gMHgwOyBpKyspIHsKKwkJaWYgKGlkc1tpXS5pZCA9PSBhYi0+Y2hpcF9pZCkgeworCQkJc25wcmludGYoJmFiLT5jaGlwX25hbWVbMF0sIHNpemVvZihhYi0+Y2hpcF9uYW1lKSAtIDEsCisJCQkJIkFCNTUwMCAlcyIsIGlkc1tpXS5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpZHNbaV0uaWQgPT0gMHgwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVua25vd24gYW5hbG9nIGJhc2ViYW5kIGNoaXAgaWQ6IDB4JXhcbiIsCisJCQlhYi0+Y2hpcF9pZCk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRyaXZlciBub3Qgc3RhcnRlZCFcbiIpOworCQlnb3RvIGV4aXRfbm9fZGV0ZWN0OworCX0KKworCS8qIENsZWFyIGFuZCBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IEFCNTUwMF9OVU1fSVJRX1JFR1M7IGkrKykgeworCQl1OCBsYXRjaHJlZyA9IEFCNTUwMF9JVF9MQVRDSDBfUkVHICsgaTsKKwkJdTggbWFza3JlZyA9IEFCNTUwMF9JVF9NQVNLMF9SRUcgKyBpOworCQl1OCB2YWw7CisKKwkJYWI1NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlX3JhdyhhYiwgQUI1NTAwX0JBTktfSVQsCisJCQkJCQkgICAgICBsYXRjaHJlZywgJnZhbCk7CisJCXNldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLCBBQjU1MDBfQkFOS19JVCwgbWFza3JlZywgMHhmZik7CisJCWFiLT5tYXNrW2ldID0gYWItPm9sZG1hc2tbaV0gPSAweGZmOworCX0KKworCWVyciA9IGFieDUwMF9yZWdpc3Rlcl9vcHMoJnBkZXYtPmRldiwgJmFiNTUwMF9vcHMpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWI1NTAwX3JlZ2lzdGVyIG9wcyBlcnJvclxuIik7CisJCWdvdG8gZXhpdF9ub19kZXRlY3Q7CisJfQorCisJLyogU2V0IHVwIGFuZCByZWdpc3RlciB0aGUgcGxhdGZvcm0gZGV2aWNlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUI1NTAwX05VTV9ERVZJQ0VTOyBpKyspIHsKKwkJYWI1NTAwX2RldnNbaV0ucGxhdGZvcm1fZGF0YSA9IGFiNTUwMF9wbGZfZGF0YS0+ZGV2X2RhdGFbaV07CisJCWFiNTUwMF9kZXZzW2ldLnBkYXRhX3NpemUgPQorCQkJc2l6ZW9mKGFiNTUwMF9wbGZfZGF0YS0+ZGV2X2RhdGFbaV0pOworCX0KKworCWVyciA9IG1mZF9hZGRfZGV2aWNlcygmcGRldi0+ZGV2LCAwLCBhYjU1MDBfZGV2cywKKwkJQVJSQVlfU0laRShhYjU1MDBfZGV2cyksIE5VTEwsCisJCWFiNTUwMF9wbGZfZGF0YS0+aXJxLmJhc2UpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWI1NTAwX21mZF9hZGRfZGV2aWNlIGVycm9yXG4iKTsKKwkJZ290byBleGl0X25vX2RldGVjdDsKKwl9CisKKwllcnIgPSBhYjU1MDBfc2V0dXAoYWIsIGFiNTUwMF9wbGZfZGF0YS0+aW5pdF9zZXR0aW5ncywKKwkJYWI1NTAwX3BsZl9kYXRhLT5pbml0X3NldHRpbmdzX3N6KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFiNTUwMF9zZXR1cCBlcnJvclxuIik7CisJCWdvdG8gZXhpdF9ub19kZXRlY3Q7CisJfQorCisJYWI1NTAwX3NldHVwX2RlYnVnZnMoYWIpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImRldGVjdGVkIEFCIGNoaXA6ICVzXG4iLCAmYWItPmNoaXBfbmFtZVswXSk7CisJcmV0dXJuIDA7CisKK2V4aXRfbm9fZGV0ZWN0OgorCWtmcmVlKGFiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhYjU1MDBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFiNTUwMF9yZW1vdmVfZGVidWdmcygpOworCW1mZF9yZW1vdmVfZGV2aWNlcygmcGRldi0+ZGV2KTsKKwlrZnJlZShhYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiNTUwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWI1NTAwLWNvcmUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUgID0gX19leGl0X3AoYWI1NTAwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYjU1MDBfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYWI1NTAwX2RyaXZlciwgYWI1NTAwX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFiNTUwMF9jb3JlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWI1NTAwX2RyaXZlcik7Cit9CisKK3N1YnN5c19pbml0Y2FsbChhYjU1MDBfY29yZV9pbml0KTsKK21vZHVsZV9leGl0KGFiNTUwMF9jb3JlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXR0aWFzIFdhbGxpbiA8bWF0dGlhcy53YWxsaW5Ac3Rlcmljc3Nvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFCNTUwMCBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI1NTAwLWNvcmUuaCBiL2RyaXZlcnMvbWZkL2FiNTUwMC1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiMzBiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1jb3JlLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTVC1Fcmljc3NvbgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBTaGFyZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIEFCNTUwMCBNRkQgZHJpdmVyCisgKi8KKworLyogUmVhZC93cml0ZSBvcGVyYXRpb24gdmFsdWVzLiAqLworI2RlZmluZSBBQjU1MDBfUEVSTV9SRCAoMHgwMSkKKyNkZWZpbmUgQUI1NTAwX1BFUk1fV1IgKDB4MDIpCisKKy8qIFJlYWQvd3JpdGUgcGVybWlzc2lvbnMuICovCisjZGVmaW5lIEFCNTUwMF9QRVJNX1JPIChBQjU1MDBfUEVSTV9SRCkKKyNkZWZpbmUgQUI1NTAwX1BFUk1fUlcgKEFCNTUwMF9QRVJNX1JEIHwgQUI1NTAwX1BFUk1fV1IpCisKKyNkZWZpbmUgQUI1NTAwX01BU0tfQkFTRSAoMHg2MCkKKyNkZWZpbmUgQUI1NTAwX01BU0tfRU5EICgweDc5KQorI2RlZmluZSBBQjU1MDBfQ0hJUF9JRCAoMHgyMCkKKworLyoqCisgKiBzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZQorICogQGZpcnN0OiB0aGUgZmlyc3QgYWRkcmVzcyBvZiB0aGUgcmFuZ2UKKyAqIEBsYXN0OiB0aGUgbGFzdCBhZGRyZXNzIG9mIHRoZSByYW5nZQorICogQHBlcm06IGFjY2VzcyBwZXJtaXNzaW9ucyBmb3IgdGhlIHJhbmdlCisgKi8KK3N0cnVjdCBhYjU1MDBfcmVnX3JhbmdlIHsKKwl1OCBmaXJzdDsKKwl1OCBsYXN0OworCXU4IHBlcm07Cit9OworCisvKioKKyAqIHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcworICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgbGlzdAorICogQHJhbmdlOiB0aGUgbGlzdCBvZiByZWdpc3RlciByYW5nZXMKKyAqLworc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIHsKKwl1OCBucmFuZ2VzOworCXU4IGJhbmtpZDsKKwljb25zdCBzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZSAqcmFuZ2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBhYjU1MDBfaTJjX2JhbmtzCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgcmFuZ2VzIGluIHRoZSBsaXN0CisgKiBAcmFuZ2U6IHRoZSBsaXN0IG9mIHJlZ2lzdGVyIHJhbmdlcworICovCitzdHJ1Y3QgYWI1NTAwX2kyY19iYW5rcyB7CisJdTggbmJhbmtzOworCWNvbnN0IHN0cnVjdCBhYjU1MDBfaTJjX3JhbmdlcyAqYmFuazsKK307CisKKy8qKgorICogc3RydWN0IGFiNTUwMF9iYW5rCisgKiBAc2xhdmVfYWRkcjogSTJDIHNsYXZlX2FkZHIgZm91bmQgaW4gQUI1NTAwIHNwZWNpZmljYXRpb24KKyAqIEBuYW1lOiBEb2N1bWVudGF0aW9uIG5hbWUgb2YgdGhlIGJhbmsuIEZvciByZWZlcmVuY2UKKyAqLworc3RydWN0IGFiNTUwMF9iYW5rIHsKKwl1OCBzbGF2ZV9hZGRyOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFiNTUwMF9iYW5rIGJhbmtpbmZvW0FCNTUwMF9OVU1fQkFOS1NdID0geworCVtBQjU1MDBfQkFOS19WSVRfSU9fSTJDX0NMS19UU1RfT1RQXSA9IHsKKwkJQUI1NTAwX0FERFJfVklUX0lPX0kyQ19DTEtfVFNUX09UUCwgIlZJVF9JT19JMkNfQ0xLX1RTVF9PVFAifSwKKwlbQUI1NTAwX0JBTktfVkRERElHX0lPX0kyQ19DTEtfVFNUXSA9IHsKKwkJQUI1NTAwX0FERFJfVkRERElHX0lPX0kyQ19DTEtfVFNULCAiVkRERElHX0lPX0kyQ19DTEtfVFNUIn0sCisJW0FCNTUwMF9CQU5LX1ZERU5DXSA9IHtBQjU1MDBfQUREUl9WREVOQywgIlZERU5DIn0sCisJW0FCNTUwMF9CQU5LX1NJTV9VU0JTSU1dID0ge0FCNTUwMF9BRERSX1NJTV9VU0JTSU0sICJTSU1fVVNCU0lNIn0sCisJW0FCNTUwMF9CQU5LX0xFRF0gPSB7QUI1NTAwX0FERFJfTEVELCAiTEVEIn0sCisJW0FCNTUwMF9CQU5LX0FEQ10gPSB7QUI1NTAwX0FERFJfQURDLCAiQURDIn0sCisJW0FCNTUwMF9CQU5LX1JUQ10gPSB7QUI1NTAwX0FERFJfUlRDLCAiUlRDIn0sCisJW0FCNTUwMF9CQU5LX1NUQVJUVVBdID0ge0FCNTUwMF9BRERSX1NUQVJUVVAsICJTVEFSVFVQIn0sCisJW0FCNTUwMF9CQU5LX0RCSV9FQ0ldID0ge0FCNTUwMF9BRERSX0RCSV9FQ0ksICJEQkktRUNJIn0sCisJW0FCNTUwMF9CQU5LX0NIR10gPSB7QUI1NTAwX0FERFJfQ0hHLCAiQ0hHIn0sCisJW0FCNTUwMF9CQU5LX0ZHX0JBVFRDT01fQUNDXSA9IHsKKwkJQUI1NTAwX0FERFJfRkdfQkFUVENPTV9BQ0MsICJGR19CQVRDT01fQUNDIn0sCisJW0FCNTUwMF9CQU5LX1VTQl0gPSB7QUI1NTAwX0FERFJfVVNCLCAiVVNCIn0sCisJW0FCNTUwMF9CQU5LX0lUXSA9IHtBQjU1MDBfQUREUl9JVCwgIklUIn0sCisJW0FCNTUwMF9CQU5LX1ZJQlJBXSA9IHtBQjU1MDBfQUREUl9WSUJSQSwgIlZJQlJBIn0sCisJW0FCNTUwMF9CQU5LX0FVRElPX0hFQURTRVRVU0JdID0geworCQlBQjU1MDBfQUREUl9BVURJT19IRUFEU0VUVVNCLCAiQVVESU9fSEVBRFNFVFVTQiJ9LAorfTsKKworaW50IGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoc3RydWN0IGFiNTUwMCAqYWIsIHU4IGJhbmssIHU4IHJlZywKKwl1OCAqdmFsdWUpOworaW50IGFiNTUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoc3RydWN0IGFiNTUwMCAqYWIsIHU4IGJhbmssCisJdTggcmVnLCB1OCBiaXRtYXNrLCB1OCBiaXR2YWx1ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuYyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjMGViYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmMKQEAgLTAsMCArMSw4MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICogRGVidWdmcyBzdXBwb3J0IGZvciB0aGUgQUI1NTAwIE1GRCBkcml2ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiYWI1NTAwLWNvcmUuaCIKKyNpbmNsdWRlICJhYjU1MDAtZGVidWdmcy5oIgorCitzdGF0aWMgc3RydWN0IGFiNTUwMF9pMmNfcmFuZ2VzIGFiNTUwMF9yZWdfcmFuZ2VzW0FCNTUwMF9OVU1fQkFOS1NdID0geworCVtBQjU1MDBfQkFOS19MRURdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfTEVELAorCQkubnJhbmdlcyA9IDEsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MEMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfQURDXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0FEQywKKwkJLm5yYW5nZXMgPSA2LAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MUYsCisJCQkJLmxhc3QgPSAweDIyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MjMsCisJCQkJLmxhc3QgPSAweDI0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MjYsCisJCQkJLmxhc3QgPSAweDJELAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MkYsCisJCQkJLmxhc3QgPSAweDM0LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MzcsCisJCQkJLmxhc3QgPSAweDU3LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NTgsCisJCQkJLmxhc3QgPSAweDU4LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1JUQ10gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19SVEMsCisJCS5ucmFuZ2VzID0gMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwNCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDA2LAorCQkJCS5sYXN0ID0gMHgwQywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19TVEFSVFVQXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1NUQVJUVVAsCisJCS5ucmFuZ2VzID0gMTIsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MDEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxRiwKKwkJCQkubGFzdCA9IDB4MUYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyRSwKKwkJCQkubGFzdCA9IDB4MkUsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyRiwKKwkJCQkubGFzdCA9IDB4MzAsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg1MCwKKwkJCQkubGFzdCA9IDB4NTEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg2MCwKKwkJCQkubGFzdCA9IDB4NjEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg2NiwKKwkJCQkubGFzdCA9IDB4OEEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg4QywKKwkJCQkubGFzdCA9IDB4OTYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHhBQSwKKwkJCQkubGFzdCA9IDB4QjQsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHhCNywKKwkJCQkubGFzdCA9IDB4QkYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHhDMSwKKwkJCQkubGFzdCA9IDB4Q0EsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHhEMywKKwkJCQkubGFzdCA9IDB4RTAsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfREJJX0VDSV0gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19EQklfRUNJLAorCQkubnJhbmdlcyA9IDMsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MDcsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMCwKKwkJCQkubGFzdCA9IDB4MTAsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMywKKwkJCQkubGFzdCA9IDB4MTMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfQ0hHXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0NIRywKKwkJLm5yYW5nZXMgPSAyLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MTEsCisJCQkJLmxhc3QgPSAweDExLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MTIsCisJCQkJLmxhc3QgPSAweDFCLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUlcsCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX0ZHX0JBVFRDT01fQUNDXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0ZHX0JBVFRDT01fQUNDLAorCQkubnJhbmdlcyA9IDIsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MEIsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgwQywKKwkJCQkubGFzdCA9IDB4MTAsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfVVNCXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1VTQiwKKwkJLm5yYW5nZXMgPSAxMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAxLAorCQkJCS5sYXN0ID0gMHgwMSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDgwLAorCQkJCS5sYXN0ID0gMHg4MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDg3LAorCQkJCS5sYXN0ID0gMHg4QSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDhCLAorCQkJCS5sYXN0ID0gMHg4QiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDkxLAorCQkJCS5sYXN0ID0gMHg5MiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDkzLAorCQkJCS5sYXN0ID0gMHg5MywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDk0LAorCQkJCS5sYXN0ID0gMHg5NCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEE4LAorCQkJCS5sYXN0ID0gMHhCMCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEIyLAorCQkJCS5sYXN0ID0gMHhCMiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEI0LAorCQkJCS5sYXN0ID0gMHhCQywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEJGLAorCQkJCS5sYXN0ID0gMHhCRiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEMxLAorCQkJCS5sYXN0ID0gMHhDNSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19JVF0gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19JVCwKKwkJLm5yYW5nZXMgPSA0LAorCQkucmFuZ2UgPSAoc3RydWN0IGFiNTUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDAyLAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MjAsCisJCQkJLmxhc3QgPSAweDM2LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDAsCisJCQkJLmxhc3QgPSAweDU2LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NjAsCisJCQkJLmxhc3QgPSAweDc2LAorCQkJCS5wZXJtID0gQUI1NTAwX1BFUk1fUk8sCisJCQl9LAorCQl9LAorCX0sCisJW0FCNTUwMF9CQU5LX1ZERERJR19JT19JMkNfQ0xLX1RTVF0gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19WRERESUdfSU9fSTJDX0NMS19UU1QsCisJCS5ucmFuZ2VzID0gNywKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAyLAorCQkJCS5sYXN0ID0gMHgwMiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDEyLAorCQkJCS5sYXN0ID0gMHgxMiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDMwLAorCQkJCS5sYXN0ID0gMHgzNCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQwLAorCQkJCS5sYXN0ID0gMHg0NCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDUwLAorCQkJCS5sYXN0ID0gMHg1NCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDYwLAorCQkJCS5sYXN0ID0gMHg2NCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDcwLAorCQkJCS5sYXN0ID0gMHg3NCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19WSVRfSU9fSTJDX0NMS19UU1RfT1RQXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1ZJVF9JT19JMkNfQ0xLX1RTVF9PVFAsCisJCS5ucmFuZ2VzID0gMTMsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI1NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMSwKKwkJCQkubGFzdCA9IDB4MDEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMiwKKwkJCQkubGFzdCA9IDB4MDIsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9STywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgwRCwKKwkJCQkubGFzdCA9IDB4MEYsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxQywKKwkJCQkubGFzdCA9IDB4MUMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxRSwKKwkJCQkubGFzdCA9IDB4MUUsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyMCwKKwkJCQkubGFzdCA9IDB4MjEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyNSwKKwkJCQkubGFzdCA9IDB4MjUsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyOCwKKwkJCQkubGFzdCA9IDB4MkEsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgzMCwKKwkJCQkubGFzdCA9IDB4MzMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MCwKKwkJCQkubGFzdCA9IDB4NDMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg1MCwKKwkJCQkubGFzdCA9IDB4NTMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg2MCwKKwkJCQkubGFzdCA9IDB4NjMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg3MCwKKwkJCQkubGFzdCA9IDB4NzMsCisJCQkJLnBlcm0gPSBBQjU1MDBfUEVSTV9SVywKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI1NTAwX0JBTktfVklCUkFdID0geworCQkuYmFua2lkID0gQUI1NTAwX0JBTktfVklCUkEsCisJCS5ucmFuZ2VzID0gMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDEwLAorCQkJCS5sYXN0ID0gMHgxMywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEZFLAorCQkJCS5sYXN0ID0gMHhGRSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19BVURJT19IRUFEU0VUVVNCXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX0FVRElPX0hFQURTRVRVU0IsCisJCS5ucmFuZ2VzID0gMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHg0OCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweEVCLAorCQkJCS5sYXN0ID0gMHhGQiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19TSU1fVVNCU0lNXSA9IHsKKwkJLmJhbmtpZCA9IEFCNTUwMF9CQU5LX1NJTV9VU0JTSU0sCisJCS5ucmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDEzLAorCQkJCS5sYXN0ID0gMHgxOSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjU1MDBfQkFOS19WREVOQ10gPSB7CisJCS5iYW5raWQgPSBBQjU1MDBfQkFOS19WREVOQywKKwkJLm5yYW5nZXMgPSAxMiwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjU1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwOCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDA5LAorCQkJCS5sYXN0ID0gMHgwOSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JPLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDBBLAorCQkJCS5sYXN0ID0gMHgxMiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDE1LAorCQkJCS5sYXN0ID0gMHgxOSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDFCLAorCQkJCS5sYXN0ID0gMHgyMSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDI3LAorCQkJCS5sYXN0ID0gMHgyQywKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQxLAorCQkJCS5sYXN0ID0gMHg0MSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQ1LAorCQkJCS5sYXN0ID0gMHg1QiwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDVELAorCQkJCS5sYXN0ID0gMHg1RCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDY5LAorCQkJCS5sYXN0ID0gMHg2OSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDZDLAorCQkJCS5sYXN0ID0gMHg2RCwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDgwLAorCQkJCS5sYXN0ID0gMHg4MSwKKwkJCQkucGVybSA9IEFCNTUwMF9QRVJNX1JXLAorCQkJfSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGludCBhYjU1MDBfcmVnaXN0ZXJzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGk7CisJdTggYmFuayA9ICh1OClhYi0+ZGVidWdfYmFuazsKKworCXNlcV9wcmludGYocywgImFiNTUwMCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgQUI1NTAwX05VTV9CQU5LUzsgYmFuaysrKSB7CisJCXNlcV9wcmludGYocywgIiBiYW5rICV1LCAlcyAoMHgleCk6XG4iLCBiYW5rLAorCQkJCWJhbmtpbmZvW2JhbmtdLm5hbWUsCisJCQkJYmFua2luZm9bYmFua10uc2xhdmVfYWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBhYjU1MDBfcmVnX3Jhbmdlc1tiYW5rXS5ucmFuZ2VzOyBpKyspIHsKKwkJCXU4IHJlZzsKKwkJCWludCBlcnI7CisKKwkJCWZvciAocmVnID0gYWI1NTAwX3JlZ19yYW5nZXNbYmFua10ucmFuZ2VbaV0uZmlyc3Q7CisJCQkJcmVnIDw9IGFiNTUwMF9yZWdfcmFuZ2VzW2JhbmtdLnJhbmdlW2ldLmxhc3Q7CisJCQkJcmVnKyspIHsKKwkJCQl1OCB2YWx1ZTsKKworCQkJCWVyciA9IGFiNTUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZV9yYXcoYWIsCisJCQkJCQkJCWJhbmssIHJlZywKKwkJCQkJCQkJJnZhbHVlKTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQlkZXZfZXJyKGFiLT5kZXYsICJnZXRfcmVnIGZhaWxlZCAlZCIKKwkJCQkJCSJiYW5rIDB4JXggcmVnIDB4JXhcbiIsCisJCQkJCQllcnIsIGJhbmssIHJlZyk7CisJCQkJCXJldHVybiBlcnI7CisJCQkJfQorCisJCQkJZXJyID0gc2VxX3ByaW50ZihzLCAiWyVkLzB4JTAyWF06IDB4JTAyWFxuIiwKKwkJCQkJCWJhbmssIHJlZywgdmFsdWUpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWRldl9lcnIoYWItPmRldiwKKwkJCQkJCSJzZXFfcHJpbnRmIG92ZXJmbG93XG4iKTsKKwkJCQkJLyoKKwkJCQkJICogRXJyb3IgaXMgbm90IHJldHVybmVkIGhlcmUgc2luY2UKKwkJCQkJICogdGhlIG91dHB1dCBpcyB3YW50ZWQgaW4gYW55IGNhc2UKKwkJCQkJICovCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYjU1MDBfcmVnaXN0ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiNTUwMF9yZWdpc3RlcnNfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjU1MDBfcmVnaXN0ZXJzX2ZvcHMgPSB7CisJLm9wZW4gPSBhYjU1MDBfcmVnaXN0ZXJzX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGFiNTUwMF9iYW5rX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWI1NTAwICphYiA9IHMtPnByaXZhdGU7CisKKwlzZXFfcHJpbnRmKHMsICIlZFxuIiwgYWItPmRlYnVnX2JhbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9iYW5rX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiNTUwMF9iYW5rX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWI1NTAwX2Jhbmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhYjU1MDAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVzZXJfYmFuazsKKwlpbnQgZXJyOworCisJLyogR2V0IHVzZXJzcGFjZSBzdHJpbmcgYW5kIGFzc3VyZSB0ZXJtaW5hdGlvbiAqLworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZikgLSAxKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2J1Zl9zaXplXSA9IDA7CisKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX2JhbmspOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzZXJfYmFuayA+PSBBQjU1MDBfTlVNX0JBTktTKSB7CisJCWRldl9lcnIoYWItPmRldiwKKwkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWItPmRlYnVnX2JhbmsgPSB1c2VyX2Jhbms7CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX2FkZHJlc3NfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCBhYjU1MDAgKmFiID0gcy0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgYWItPmRlYnVnX2FkZHJlc3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiNTUwMF9hZGRyZXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiNTUwMF9hZGRyZXNzX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWI1NTAwX2FkZHJlc3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhYjU1MDAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVzZXJfYWRkcmVzczsKKwlpbnQgZXJyOworCisJLyogR2V0IHVzZXJzcGFjZSBzdHJpbmcgYW5kIGFzc3VyZSB0ZXJtaW5hdGlvbiAqLworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZikgLSAxKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2J1Zl9zaXplXSA9IDA7CisKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX2FkZHJlc3MpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1c2VyX2FkZHJlc3MgPiAweGZmKSB7CisJCWRldl9lcnIoYWItPmRldiwKKwkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhYi0+ZGVidWdfYWRkcmVzcyA9IHVzZXJfYWRkcmVzczsKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX3ZhbF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSBzLT5wcml2YXRlOworCWludCBlcnI7CisJdTggcmVndmFsdWU7CisKKwllcnIgPSBhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLCAodTgpYWItPmRlYnVnX2JhbmssCisJCSh1OClhYi0+ZGVidWdfYWRkcmVzcywgJnJlZ3ZhbHVlKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoYWItPmRldiwgImdldF9yZWcgZmFpbGVkICVkLCBiYW5rIDB4JXgiCisJCQkiLCByZWcgMHgleFxuIiwgZXJyLCBhYi0+ZGVidWdfYmFuaywKKwkJCWFiLT5kZWJ1Z19hZGRyZXNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgcmVndmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI1NTAwX3ZhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjU1MDBfdmFsX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWI1NTAwX3ZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFiNTUwMCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKKwljaGFyIGJ1ZlszMl07CisJaW50IGJ1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgdXNlcl92YWw7CisJaW50IGVycjsKKwl1OCByZWd2YWx1ZTsKKworCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpLTEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodXNlcl92YWwgPiAweGZmKSB7CisJCWRldl9lcnIoYWItPmRldiwKKwkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllcnIgPSBhYjU1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KAorCQlhYiwgKHU4KWFiLT5kZWJ1Z19iYW5rLAorCQkodTgpYWItPmRlYnVnX2FkZHJlc3MsIDB4RkYsICh1OCl1c2VyX3ZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhYjU1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGVfcmF3KGFiLCAodTgpYWItPmRlYnVnX2JhbmssCisJCSh1OClhYi0+ZGVidWdfYWRkcmVzcywgJnJlZ3ZhbHVlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBidWZfc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWI1NTAwX2JhbmtfZm9wcyA9IHsKKwkub3BlbiA9IGFiNTUwMF9iYW5rX29wZW4sCisJLndyaXRlID0gYWI1NTAwX2Jhbmtfd3JpdGUsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjU1MDBfYWRkcmVzc19mb3BzID0geworCS5vcGVuID0gYWI1NTAwX2FkZHJlc3Nfb3BlbiwKKwkud3JpdGUgPSBhYjU1MDBfYWRkcmVzc193cml0ZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiNTUwMF92YWxfZm9wcyA9IHsKKwkub3BlbiA9IGFiNTUwMF92YWxfb3BlbiwKKwkud3JpdGUgPSBhYjU1MDBfdmFsX3dyaXRlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiNTUwMF9kaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWI1NTAwX3JlZ19maWxlOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiNTUwMF9iYW5rX2ZpbGU7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYWI1NTAwX2FkZHJlc3NfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphYjU1MDBfdmFsX2ZpbGU7CisKK3ZvaWQgX19pbml0IGFiNTUwMF9zZXR1cF9kZWJ1Z2ZzKHN0cnVjdCBhYjU1MDAgKmFiKQoreworCWFiLT5kZWJ1Z19iYW5rID0gQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUDsKKwlhYi0+ZGVidWdfYWRkcmVzcyA9IEFCNTUwMF9DSElQX0lEOworCisJYWI1NTAwX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYWI1NTAwIiwgTlVMTCk7CisJaWYgKCFhYjU1MDBfZGlyKQorCQlnb3RvIGV4aXRfbm9fZGVidWdmczsKKworCWFiNTUwMF9yZWdfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFsbC1iYW5rLXJlZ2lzdGVycyIsCisJCVNfSVJVR08sIGFiNTUwMF9kaXIsIGFiLCAmYWI1NTAwX3JlZ2lzdGVyc19mb3BzKTsKKwlpZiAoIWFiNTUwMF9yZWdfZmlsZSkKKwkJZ290byBleGl0X2Rlc3Ryb3lfZGlyOworCisJYWI1NTAwX2JhbmtfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWJhbmsiLAorCQkoU19JUlVHTyB8IFNfSVdVR08pLCBhYjU1MDBfZGlyLCBhYiwgJmFiNTUwMF9iYW5rX2ZvcHMpOworCWlmICghYWI1NTAwX2JhbmtfZmlsZSkKKwkJZ290byBleGl0X2Rlc3Ryb3lfcmVnOworCisJYWI1NTAwX2FkZHJlc3NfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWFkZHJlc3MiLAorCQkoU19JUlVHTyB8IFNfSVdVR08pLCBhYjU1MDBfZGlyLCBhYiwgJmFiNTUwMF9hZGRyZXNzX2ZvcHMpOworCWlmICghYWI1NTAwX2FkZHJlc3NfZmlsZSkKKwkJZ290byBleGl0X2Rlc3Ryb3lfYmFuazsKKworCWFiNTUwMF92YWxfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLXZhbHVlIiwKKwkJKFNfSVJVR08gfCBTX0lXVUdPKSwgYWI1NTAwX2RpciwgYWIsICZhYjU1MDBfdmFsX2ZvcHMpOworCWlmICghYWI1NTAwX3ZhbF9maWxlKQorCQlnb3RvIGV4aXRfZGVzdHJveV9hZGRyZXNzOworCisJcmV0dXJuOworCitleGl0X2Rlc3Ryb3lfYWRkcmVzczoKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfYWRkcmVzc19maWxlKTsKK2V4aXRfZGVzdHJveV9iYW5rOgorCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9iYW5rX2ZpbGUpOworZXhpdF9kZXN0cm95X3JlZzoKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfcmVnX2ZpbGUpOworZXhpdF9kZXN0cm95X2RpcjoKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfZGlyKTsKK2V4aXRfbm9fZGVidWdmczoKKwlkZXZfZXJyKGFiLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZW50cmllcy5cbiIpOworCXJldHVybjsKK30KKwordm9pZCBfX2V4aXQgYWI1NTAwX3JlbW92ZV9kZWJ1Z2ZzKHZvaWQpCit7CisJZGVidWdmc19yZW1vdmUoYWI1NTAwX3ZhbF9maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfYWRkcmVzc19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfYmFua19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjU1MDBfcmVnX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGFiNTUwMF9kaXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI1NTAwLWRlYnVnZnMuaCBiL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzMGE5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTVC1Fcmljc3NvbgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKiBEZWJ1Z2ZzIGludGVyZmFjZSB0byB0aGUgQUI1NTAwIGNvcmUgZHJpdmVyCisgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCit2b2lkIGFiNTUwMF9zZXR1cF9kZWJ1Z2ZzKHN0cnVjdCBhYjU1MDAgKmFiKTsKK3ZvaWQgYWI1NTAwX3JlbW92ZV9kZWJ1Z2ZzKHZvaWQpOworCisjZWxzZSAvKiAhQ09ORklHX0RFQlVHX0ZTICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhYjU1MDBfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgYWI1NTAwICphYikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFiNTUwMF9yZW1vdmVfZGVidWdmcyh2b2lkKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCmluZGV4IDM4NzcwNWUuLjFlOTE3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYwpAQCAtOTIsNiArOTIsOCBAQAogI2RlZmluZSBBQjg1MDBfUkVWX1JFRwkJCTB4ODAKICNkZWZpbmUgQUI4NTAwX1NXSVRDSF9PRkZfU1RBVFVTCTB4MDAKIAorI2RlZmluZSBBQjg1MDBfVFVSTl9PTl9TVEFUVVMJCTB4MDAKKwogLyoKICAqIE1hcCBpbnRlcnJ1cHQgbnVtYmVycyB0byB0aGUgTEFUQ0ggYW5kIE1BU0sgcmVnaXN0ZXIgb2Zmc2V0cywgSW50ZXJydXB0CiAgKiBudW1iZXJzIGFyZSBpbmRleGVkIGludG8gdGhpcyBhcnJheSB3aXRoIChudW0gLyA4KS4KQEAgLTI5Myw2ICsyOTUsNyBAQAogCS5pcnFfYnVzX2xvY2sJCT0gYWI4NTAwX2lycV9sb2NrLAogCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gYWI4NTAwX2lycV9zeW5jX3VubG9jaywKIAkuaXJxX21hc2sJCT0gYWI4NTAwX2lycV9tYXNrLAorCS5pcnFfZGlzYWJsZQkJPSBhYjg1MDBfaXJxX21hc2ssCiAJLmlycV91bm1hc2sJCT0gYWI4NTAwX2lycV91bm1hc2ssCiB9OwogCkBAIC04MTEsMTIgKzgxNCw0MCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUjeFxuIiwgdmFsdWUpOwogfQogCisvKgorICogYWI4NTAwIGhhcyB0dXJuZWQgb24gZHVlIHRvIChUVVJOX09OX1NUQVRVUyk6CisgKiAweDAxIFBPUm5WYmF0CisgKiAweDAyIFBvbktleTFkYkYKKyAqIDB4MDQgUG9uS2V5MmRiRgorICogMHgwOCBSVENBbGFybQorICogMHgxMCBNYWluQ2hEZXQKKyAqIDB4MjAgVmJ1c0RldAorICogMHg0MCBVc2JJRERldGVjdAorICogMHg4MCBSZXNlcnZlZAorICovCitzdGF0aWMgc3NpemVfdCBzaG93X3R1cm5fb25fc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsdWU7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwOworCisJYWI4NTAwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0ID0gZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwLCBBQjg1MDBfU1lTX0NUUkwxX0JMT0NLLAorCQlBQjg1MDBfVFVSTl9PTl9TVEFUVVMsICZ2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSN4XG4iLCB2YWx1ZSk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihjaGlwX2lkLCBTX0lSVUdPLCBzaG93X2NoaXBfaWQsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHN3aXRjaF9vZmZfc3RhdHVzLCBTX0lSVUdPLCBzaG93X3N3aXRjaF9vZmZfc3RhdHVzLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0dXJuX29uX3N0YXR1cywgU19JUlVHTywgc2hvd190dXJuX29uX3N0YXR1cywgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphYjg1MDBfc3lzZnNfZW50cmllc1tdID0gewogCSZkZXZfYXR0cl9jaGlwX2lkLmF0dHIsCiAJJmRldl9hdHRyX3N3aXRjaF9vZmZfc3RhdHVzLmF0dHIsCisJJmRldl9hdHRyX3R1cm5fb25fc3RhdHVzLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTg0MywxMSArODc0LDExIEBACiAJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSBBQjg1MDBfQ1VURUFSTFk6CiAJY2FzZSBBQjg1MDBfQ1VUMVAwOgogCWNhc2UgQUI4NTAwX0NVVDFQMToKIAljYXNlIEFCODUwMF9DVVQyUDA6CiAJY2FzZSBBQjg1MDBfQ1VUM1AwOgorCWNhc2UgQUI4NTAwX0NVVDNQMzoKIAkJZGV2X2luZm8oYWI4NTAwLT5kZXYsICJkZXRlY3RlZCBjaGlwLCByZXZpc2lvbjogJSN4XG4iLCB2YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwppbmRleCA2NGJkZWViLi5kZWRiN2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1ncGFkYy5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLWdwYWRjLmMKaW5kZXggZjE2YWZiMi4uZTk4NWQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLWdwYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWdwYWRjLmMKQEAgLTE0MywxMiArMTQzLDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFiODUwMF9ncGFkY19nZXQpOwogCi1zdGF0aWMgaW50IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBpbnB1dCwKKy8qKgorICogYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoKSAtIENvbnZlcnQgYSByYXcgQURDIHZhbHVlIHRvIGEgdm9sdGFnZQorICovCitpbnQgYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2Uoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGNoYW5uZWwsCiAJaW50IGFkX3ZhbHVlKQogewogCWludCByZXM7CiAKLQlzd2l0Y2ggKGlucHV0KSB7CisJc3dpdGNoIChjaGFubmVsKSB7CiAJY2FzZSBNQUlOX0NIQVJHRVJfVjoKIAkJLyogRm9yIHNvbWUgcmVhc29uIHdlIGRvbid0IGhhdmUgY2FsaWJyYXRlZCBkYXRhICovCiAJCWlmICghZ3BhZGMtPmNhbF9kYXRhW0FEQ19JTlBVVF9WTUFJTl0uZ2FpbikgewpAQCAtMjMyLDE4ICsyMzUsNDYgQEAKIAl9CiAJcmV0dXJuIHJlczsKIH0KK0VYUE9SVF9TWU1CT0woYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UpOwogCiAvKioKICAqIGFiODUwMF9ncGFkY19jb252ZXJ0KCkgLSBncGFkYyBjb252ZXJzaW9uCi0gKiBAaW5wdXQ6CWFuYWxvZyBpbnB1dCB0byBiZSBjb252ZXJ0ZWQgdG8gZGlnaXRhbCBkYXRhCisgKiBAY2hhbm5lbDoJYW5hbG9nIGNoYW5uZWwgdG8gYmUgY29udmVydGVkIHRvIGRpZ2l0YWwgZGF0YQogICoKICAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIHNlbGVjdGVkIGFuYWxvZyBpL3AgdG8gZGlnaXRhbAogICogZGF0YS4KICAqLwotaW50IGFiODUwMF9ncGFkY19jb252ZXJ0KHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBpbnB1dCkKK2ludCBhYjg1MDBfZ3BhZGNfY29udmVydChzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYywgdTggY2hhbm5lbCkKK3sKKwlpbnQgYWRfdmFsdWU7CisJaW50IHZvbHRhZ2U7CisKKwlhZF92YWx1ZSA9IGFiODUwMF9ncGFkY19yZWFkX3JhdyhncGFkYywgY2hhbm5lbCk7CisJaWYgKGFkX3ZhbHVlIDwgMCkgeworCQlkZXZfZXJyKGdwYWRjLT5kZXYsICJHUEFEQyByYXcgdmFsdWUgZmFpbGVkIGNoOiAlZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiBhZF92YWx1ZTsKKwl9CisKKwl2b2x0YWdlID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIGNoYW5uZWwsIGFkX3ZhbHVlKTsKKworCWlmICh2b2x0YWdlIDwgMCkKKwkJZGV2X2VycihncGFkYy0+ZGV2LCAiR1BBREMgdG8gdm9sdGFnZSBjb252ZXJzaW9uIGZhaWxlZCBjaDoiCisJCQkiICVkIEFEOiAweCV4XG4iLCBjaGFubmVsLCBhZF92YWx1ZSk7CisKKwlyZXR1cm4gdm9sdGFnZTsKK30KK0VYUE9SVF9TWU1CT0woYWI4NTAwX2dwYWRjX2NvbnZlcnQpOworCisvKioKKyAqIGFiODUwMF9ncGFkY19yZWFkX3JhdygpIC0gZ3BhZGMgcmVhZAorICogQGNoYW5uZWw6CWFuYWxvZyBjaGFubmVsIHRvIGJlIHJlYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIHJhdyBBREMgdmFsdWUsIHRoaXMgdGhlbiBuZWVkcworICogdG8gYmUgY29udmVydGVkIGJ5IGNhbGxpbmcgYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoKQorICovCitpbnQgYWI4NTAwX2dwYWRjX3JlYWRfcmF3KHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBjaGFubmVsKQogewogCWludCByZXQ7Ci0JdTE2IGRhdGEgPSAwOwogCWludCBsb29wbGltaXQgPSAwOwogCXU4IHZhbCwgbG93X2RhdGEsIGhpZ2hfZGF0YTsKIApAQCAtMjc4LDkgKzMwOSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIFNlbGVjdCB0aGUgaW5wdXQgc291cmNlIGFuZCBzZXQgYXZlcmFnZSBzYW1wbGVzIHRvIDE2ICovCisJLyogU2VsZWN0IHRoZSBjaGFubmVsIHNvdXJjZSBhbmQgc2V0IGF2ZXJhZ2Ugc2FtcGxlcyB0byAxNiAqLwogCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShncGFkYy0+ZGV2LCBBQjg1MDBfR1BBREMsCi0JCUFCODUwMF9HUEFEQ19DVFJMMl9SRUcsIChpbnB1dCB8IFNXX0FWR18xNikpOworCQlBQjg1MDBfR1BBRENfQ1RSTDJfUkVHLCAoY2hhbm5lbCB8IFNXX0FWR18xNikpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoZ3BhZGMtPmRldiwKIAkJCSJncGFkY19jb252ZXJzaW9uOiBzZXQgYXZnIHNhbXBsZXMgZmFpbGVkXG4iKTsKQEAgLTI5Miw3ICszMjMsNyBAQAogCSAqIGNoYXJnaW5nIGN1cnJlbnQgc2Vuc2UgaWYgaXQgbmVlZGVkLCBBQkIgMy4wIG5lZWRzIHNvbWUgc3BlY2lhbAogCSAqIHRyZWF0bWVudCB0b28uCiAJICovCi0Jc3dpdGNoIChpbnB1dCkgeworCXN3aXRjaCAoY2hhbm5lbCkgewogCWNhc2UgTUFJTl9DSEFSR0VSX0M6CiAJY2FzZSBVU0JfQ0hBUkdFUl9DOgogCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZ3BhZGMtPmRldiwKQEAgLTM1OSw3ICszOTAsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkYXRhID0gKGhpZ2hfZGF0YSA8PCA4KSB8IGxvd19kYXRhOwogCS8qIERpc2FibGUgR1BBREMgKi8KIAlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZ3BhZGMtPmRldiwgQUI4NTAwX0dQQURDLAogCQlBQjg1MDBfR1BBRENfQ1RSTDFfUkVHLCBESVNfR1BBREMpOwpAQCAtMzcwLDggKzQwMCw4IEBACiAJLyogRGlzYWJsZSBWVFZvdXQgTERPIHRoaXMgaXMgcmVxdWlyZWQgZm9yIEdQQURDICovCiAJcmVndWxhdG9yX2Rpc2FibGUoZ3BhZGMtPnJlZ3UpOwogCW11dGV4X3VubG9jaygmZ3BhZGMtPmFiODUwMF9ncGFkY19sb2NrKTsKLQlyZXQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgaW5wdXQsIGRhdGEpOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKGhpZ2hfZGF0YSA8PCA4KSB8IGxvd19kYXRhOwogCiBvdXQ6CiAJLyoKQEAgLTM4NSwxMCArNDE1LDEwIEBACiAJcmVndWxhdG9yX2Rpc2FibGUoZ3BhZGMtPnJlZ3UpOwogCW11dGV4X3VubG9jaygmZ3BhZGMtPmFiODUwMF9ncGFkY19sb2NrKTsKIAlkZXZfZXJyKGdwYWRjLT5kZXYsCi0JCSJncGFkY19jb252ZXJzaW9uOiBGYWlsZWQgdG8gQUQgY29udmVydCBjaGFubmVsICVkXG4iLCBpbnB1dCk7CisJCSJncGFkY19jb252ZXJzaW9uOiBGYWlsZWQgdG8gQUQgY29udmVydCBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChhYjg1MDBfZ3BhZGNfY29udmVydCk7CitFWFBPUlRfU1lNQk9MKGFiODUwMF9ncGFkY19yZWFkX3Jhdyk7CiAKIC8qKgogICogYWI4NTAwX2JtX2dwc3dhZGNjb252ZW5kX2hhbmRsZXIoKSAtIGlzciBmb3Igcy93IGdwYWRjIGNvbnZlcnNpb24gY29tcGxldGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLXN5c2N0cmwuYyBiL2RyaXZlcnMvbWZkL2FiODUwMC1zeXNjdHJsLmMKaW5kZXggMzkyMTg1OS4uZjIwZmVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLXN5c2N0cmwuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtc3lzY3RybC5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWI4NTAwLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWJ4NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FieDUwMC1jb3JlLmMKaW5kZXggZjEyNzIwZC4uN2NlNjVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWJ4NTAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYng1MDAtY29yZS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgogCiBzdGF0aWMgTElTVF9IRUFEKGFieDUwMF9saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FzaWMzLmMgYi9kcml2ZXJzL21mZC9hc2ljMy5jCmluZGV4IGM3MWFlMDkuLmI4NWJiZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FzaWMzLmMKKysrIGIvZHJpdmVycy9tZmQvYXNpYzMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC01ODQsNyArNTg1LDcgQEAKIAlyZXR1cm4gZ3Bpb2NoaXBfcmVtb3ZlKCZhc2ljLT5ncGlvKTsKIH0KIAotc3RhdGljIGludCBhc2ljM19jbGtfZW5hYmxlKHN0cnVjdCBhc2ljMyAqYXNpYywgc3RydWN0IGFzaWMzX2NsayAqY2xrKQorc3RhdGljIHZvaWQgYXNpYzNfY2xrX2VuYWJsZShzdHJ1Y3QgYXNpYzMgKmFzaWMsIHN0cnVjdCBhc2ljM19jbGsgKmNsaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjZGV4OwpAQCAtNTk2LDggKzU5Nyw2IEBACiAJCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX09GRlNFVChDTE9DSywgQ0RFWCksIGNkZXgpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYXNpYzNfY2xrX2Rpc2FibGUoc3RydWN0IGFzaWMzICphc2ljLCBzdHJ1Y3QgYXNpYzNfY2xrICpjbGspCkBAIC03NzksNiArNzc4LDggQEAKIAkubmFtZSAgICAgICAgICA9ICJ0bWlvLW1tYyIsCiAJLmVuYWJsZSAgICAgICAgPSBhc2ljM19tbWNfZW5hYmxlLAogCS5kaXNhYmxlICAgICAgID0gYXNpYzNfbW1jX2Rpc2FibGUsCisJLnN1c3BlbmQgICAgICAgPSBhc2ljM19tbWNfZGlzYWJsZSwKKwkucmVzdW1lICAgICAgICA9IGFzaWMzX21tY19lbmFibGUsCiAJLnBsYXRmb3JtX2RhdGEgPSAmYXNpYzNfbW1jX2RhdGEsCiAJLnBkYXRhX3NpemUgICAgPSBzaXplb2YoYXNpYzNfbW1jX2RhdGEpLAogCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhc2ljM19tbWNfcmVzb3VyY2VzKSwKQEAgLTgxMSwyNCArODEyLDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXNpYzNfbGVkc19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IG1mZF9jZWxsICpjZWxsID0gbWZkX2dldF9jZWxsKHBkZXYpOworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCXdoaWxlIChhc2ljM19ncGlvX2dldCgmYXNpYy0+Z3BpbywgQVNJQzNfR1BJTyhDLCBjZWxsLT5pZCkpICE9IDApCisJCW1zbGVlcCgxKTsKKworCWFzaWMzX2Nsa19kaXNhYmxlKGFzaWMsICZhc2ljLT5jbG9ja3NbY2xvY2tfbGVkbltjZWxsLT5pZF1dKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFzaWMzX2NlbGxfbGVkc1tBU0lDM19OVU1fTEVEU10gPSB7CiAJWzBdID0gewogCQkubmFtZSAgICAgICAgICA9ICJsZWRzLWFzaWMzIiwKIAkJLmlkICAgICAgICAgICAgPSAwLAogCQkuZW5hYmxlICAgICAgICA9IGFzaWMzX2xlZHNfZW5hYmxlLAogCQkuZGlzYWJsZSAgICAgICA9IGFzaWMzX2xlZHNfZGlzYWJsZSwKKwkJLnN1c3BlbmQgICAgICAgPSBhc2ljM19sZWRzX3N1c3BlbmQsCisJCS5yZXN1bWUgICAgICAgID0gYXNpYzNfbGVkc19lbmFibGUsCiAJfSwKIAlbMV0gPSB7CiAJCS5uYW1lICAgICAgICAgID0gImxlZHMtYXNpYzMiLAogCQkuaWQgICAgICAgICAgICA9IDEsCiAJCS5lbmFibGUgICAgICAgID0gYXNpYzNfbGVkc19lbmFibGUsCiAJCS5kaXNhYmxlICAgICAgID0gYXNpYzNfbGVkc19kaXNhYmxlLAorCQkuc3VzcGVuZCAgICAgICA9IGFzaWMzX2xlZHNfc3VzcGVuZCwKKwkJLnJlc3VtZSAgICAgICAgPSBhc2ljM19sZWRzX2VuYWJsZSwKIAl9LAogCVsyXSA9IHsKIAkJLm5hbWUgICAgICAgICAgPSAibGVkcy1hc2ljMyIsCiAJCS5pZCAgICAgICAgICAgID0gMiwKIAkJLmVuYWJsZSAgICAgICAgPSBhc2ljM19sZWRzX2VuYWJsZSwKIAkJLmRpc2FibGUgICAgICAgPSBhc2ljM19sZWRzX2Rpc2FibGUsCisJCS5zdXNwZW5kICAgICAgID0gYXNpYzNfbGVkc19zdXNwZW5kLAorCQkucmVzdW1lICAgICAgICA9IGFzaWMzX2xlZHNfZW5hYmxlLAogCX0sCiB9OwogCkBAIC05NDksNiArOTY5LDcgQEAKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCisJYXNpYy0+Z3Bpby5sYWJlbCA9ICJhc2ljMyI7CiAJYXNpYy0+Z3Bpby5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKIAlhc2ljLT5ncGlvLm5ncGlvID0gQVNJQzNfTlVNX0dQSU9TOwogCWFzaWMtPmdwaW8uZ2V0ID0gYXNpYzNfZ3Bpb19nZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYTkwM3guYyBiL2RyaXZlcnMvbWZkL2RhOTAzeC5jCmluZGV4IDJmYWRiYWUuLjFiNzljMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvbWZkL2RhOTAzeC5jCkBAIC01MjMsNyArNTIzLDcgQEAKIAljaGlwLT5vcHMtPnJlYWRfZXZlbnRzKGNoaXAsICZ0bXApOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIGRhOTAzeF9pcnFfaGFuZGxlciwKLQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJImRhOTAzeCIsIGNoaXApOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUtcmVncy5oIGIvZHJpdmVycy9tZmQvZGI1NTAwLXByY211LXJlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4ZTllNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC9kYjU1MDAtcHJjbXUtcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNUTWljcm9lbGVjdHJvbmljcyAyMDA5Ci0gKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKLSAqCi0gKiBBdXRob3I6IEt1bWFyIFNhbmdodmkgPGt1bWFyLnNhbmdodmlAc3Rlcmljc3Nvbi5jb20+Ci0gKiBBdXRob3I6IFN1bmRhciBJeWVyIDxzdW5kYXIuaXllckBzdGVyaWNzc29uLmNvbT4KLSAqCi0gKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgotICoKLSAqIFBSQ00gVW5pdCByZWdpc3RlcnMKLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9QUkNNVV9SRUdTX0gKLSNkZWZpbmUgX19NQUNIX1BSQ01VX1JFR1NfSAotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotCi0jZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTCShfUFJDTVVfQkFTRSArIDB4MTE4KQotI2RlZmluZSBQUkNNX0FSTV9QTExESVZQU19BUk1fQlJNX1JBVEUJCTB4M2YKLSNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFNfTUFYX01BU0sJCTB4ZgotCi0jZGVmaW5lIFBSQ01fUExMQVJNX0xPQ0tQICAgICAgIChfUFJDTVVfQkFTRSArIDB4MGE4KQotI2RlZmluZSBQUkNNX1BMTEFSTV9MT0NLUF9QUkNNX1BMTEFSTV9MT0NLUDMJMHgyCi0KLSNkZWZpbmUgUFJDTV9BUk1fQ0hHQ0xLUkVRCShfUFJDTVVfQkFTRSArIDB4MTE0KQotI2RlZmluZSBQUkNNX0FSTV9DSEdDTEtSRVFfUFJDTV9BUk1fQ0hHQ0xLUkVRCTB4MQotCi0jZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRQkoX1BSQ01VX0JBU0UgKyAweDk4KQotI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEVfUFJDTV9QTExBUk1fRU5BQkxFCTB4MQotI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEVfUFJDTV9QTExBUk1fQ09VTlRPTgkweDEwMAotCi0jZGVmaW5lIFBSQ01fQVJNQ0xLRklYX01HVAkoX1BSQ01VX0JBU0UgKyAweDApCi0jZGVmaW5lIFBSQ01fQTlfUkVTRVROX0NMUgkoX1BSQ01VX0JBU0UgKyAweDFmNCkKLSNkZWZpbmUgUFJDTV9BOV9SRVNFVE5fU0VUCShfUFJDTVVfQkFTRSArIDB4MWYwKQotI2RlZmluZSBQUkNNX0FSTV9MU19DTEFNUAkoX1BSQ01VX0JBU0UgKyAweDMwYykKLSNkZWZpbmUgUFJDTV9TUkFNX0E5CQkoX1BSQ01VX0JBU0UgKyAweDMwOCkKLQotLyogQVJNIFdGSSBTdGFuZGJ5IHNpZ25hbCByZWdpc3RlciAqLwotI2RlZmluZSBQUkNNX0FSTV9XRklfU1RBTkRCWSAgICAoX1BSQ01VX0JBU0UgKyAweDEzMCkKLSNkZWZpbmUgUFJDTV9JT0NSCQkoX1BSQ01VX0JBU0UgKyAweDMxMCkKLSNkZWZpbmUgUFJDTV9JT0NSX0lPRk9SQ0UJCQkweDEKLQotLyogQ1BVIG1haWxib3ggcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fTUJPWF9DUFVfVkFMCShfUFJDTVVfQkFTRSArIDB4MGZjKQotI2RlZmluZSBQUkNNX01CT1hfQ1BVX1NFVAkoX1BSQ01VX0JBU0UgKyAweDEwMCkKLSNkZWZpbmUgUFJDTV9NQk9YX0NQVV9DTFIJKF9QUkNNVV9CQVNFICsgMHgxMDQpCi0KLS8qIER1YWwgQTkgY29yZSBpbnRlcnJ1cHQgbWFuYWdlbWVudCB1bml0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRCShfUFJDTVVfQkFTRSArIDB4MzI4KQotI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRX1BSQ01fQTlfTUFTS19SRVEJMHgxCi0KLSNkZWZpbmUgUFJDTV9BOV9NQVNLX0FDSwkoX1BSQ01VX0JBU0UgKyAweDMyYykKLSNkZWZpbmUgUFJDTV9BUk1JVE1TSzMxVE8wCShfUFJDTVVfQkFTRSArIDB4MTFjKQotI2RlZmluZSBQUkNNX0FSTUlUTVNLNjNUTzMyCShfUFJDTVVfQkFTRSArIDB4MTIwKQotI2RlZmluZSBQUkNNX0FSTUlUTVNLOTVUTzY0CShfUFJDTVVfQkFTRSArIDB4MTI0KQotI2RlZmluZSBQUkNNX0FSTUlUTVNLMTI3VE85NgkoX1BSQ01VX0JBU0UgKyAweDEyOCkKLSNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9WQUwJKF9QUkNNVV9CQVNFICsgMHgyNUMpCi0jZGVmaW5lIFBSQ01fQVJNSVRWQUwzMVRPMAkoX1BSQ01VX0JBU0UgKyAweDI2MCkKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDYzVE8zMgkoX1BSQ01VX0JBU0UgKyAweDI2NCkKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDk1VE82NAkoX1BSQ01VX0JBU0UgKyAweDI2OCkKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDEyN1RPOTYJKF9QUkNNVV9CQVNFICsgMHgyNkMpCi0KLSNkZWZpbmUgUFJDTV9IT1NUQUNDRVNTX1JFUQkoX1BSQ01VX0JBU0UgKyAweDMzNCkKLSNkZWZpbmUgQVJNX1dBS0VVUF9NT0RFTQkweDEKLQotI2RlZmluZSBQUkNNX0FSTV9JVDFfQ0xFQVIJKF9QUkNNVV9CQVNFICsgMHg0OEMpCi0jZGVmaW5lIFBSQ01fQVJNX0lUMV9WQUwJKF9QUkNNVV9CQVNFICsgMHg0OTQpCi0jZGVmaW5lIFBSQ01fSE9MRF9FVlQJCShfUFJDTVVfQkFTRSArIDB4MTc0KQotCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVMwCQkoX1BSQ01VX0JBU0UgKyAweDE0OCkKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzEJCShfUFJDTVVfQkFTRSArIDB4MTUwKQotI2RlZmluZSBQUkNNX0lUU1RBVFVTMgkJKF9QUkNNVV9CQVNFICsgMHgxNTgpCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVMzCQkoX1BSQ01VX0JBU0UgKyAweDE2MCkKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzQJCShfUFJDTVVfQkFTRSArIDB4MTY4KQotI2RlZmluZSBQUkNNX0lUU1RBVFVTNQkJKF9QUkNNVV9CQVNFICsgMHg0ODQpCi0jZGVmaW5lIFBSQ01fSVRDTEVBUjUJCShfUFJDTVVfQkFTRSArIDB4NDg4KQotI2RlZmluZSBQUkNNX0FSTUlUX01BU0tYUDcwX0lUCShfUFJDTVVfQkFTRSArIDB4MTAxOCkKLQotLyogU3lzdGVtIHJlc2V0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFBSQ01fQVBFX1NPRlRSU1QJKF9QUkNNVV9CQVNFICsgMHgyMjgpCi0KLS8qIExldmVsIHNoaWZ0ZXIgYW5kIGNsYW1wIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fTU1JUF9MU19DTEFNUF9TRVQgICAgIChfUFJDTVVfQkFTRSArIDB4NDIwKQotI2RlZmluZSBQUkNNX01NSVBfTFNfQ0xBTVBfQ0xSICAgICAoX1BSQ01VX0JBU0UgKyAweDQyNCkKLQotLyogUFJDTVUgY2xvY2svUExML3Jlc2V0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX1BMTERTSV9GUkVRICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwMCkKLSNkZWZpbmUgUFJDTV9QTExEU0lfRU5BQkxFICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MDQpCi0jZGVmaW5lIFBSQ01fUExMRFNJX0xPQ0tQICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTA4KQotI2RlZmluZSBQUkNNX0xDRENMS19NR1QgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDA0NCkKLSNkZWZpbmUgUFJDTV9NQ0RFQ0xLX01HVCAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgwNjQpCi0jZGVmaW5lIFBSQ01fSERNSUNMS19NR1QgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MDU4KQotI2RlZmluZSBQUkNNX1RWQ0xLX01HVCAgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDA3YykKLSNkZWZpbmUgUFJDTV9EU0lfUExMT1VUX1NFTCAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MzApCi0jZGVmaW5lIFBSQ01fRFNJVFZDTEtfRElWICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTJDKQotI2RlZmluZSBQUkNNX1BMTERTSV9MT0NLUCAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwOCkKLSNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX1NFVCAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxRTQpCi0jZGVmaW5lIFBSQ01fQVBFX1JFU0VUTl9DTFIgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MUU4KQotI2RlZmluZSBQUkNNX0NMS09DUgkJICAgKF9QUkNNVV9CQVNFICsgMHgxQ0MpCi0KLS8qIGVQT0QgYW5kIG1lbW9yeSBwb3dlciBzaWduYWwgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9FUE9EX0NfU0VUICAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg0MTApCi0jZGVmaW5lIFBSQ01fU1JBTV9MU19TTEVFUCAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MzA0KQotCi0vKiBEZWJ1ZyBwb3dlciBjb250cm9sIHVuaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fUE9XRVJfU1RBVEVfU0VUICAgICAgIChfUFJDTVVfQkFTRSArIDB4MjU0KQotCi0vKiBNaXNjZWxsYW5lb3VzIHVuaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fRFNJX1NXX1JFU0VUICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MzI0KQotI2RlZmluZSBQUkNNX0dQSU9DUiAgICAgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDEzOCkKLSNkZWZpbmUgUFJDTV9HUElPQ1JfREJHX1NUTV9NT0RfQ01EMSAgICAgICAgICAgIDB4ODAwCi0jZGVmaW5lIFBSQ01fR1BJT0NSX0RCR19VQVJUTU9EX0NNRDAgICAgICAgICAgICAweDEKLQotCi0jZW5kaWYgLyogX19NQUNIX1BSQ01VX19SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RiNTUwMC1wcmNtdS5jIGIvZHJpdmVycy9tZmQvZGI1NTAwLXByY211LmMKaW5kZXggOWRiYjNjYS4uYmIxMTViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGI1NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9tZmQvZGI1NTAwLXByY211LmMKQEAgLTIwLDExICsyMCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvZGI1NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RieDUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2RiNTUwMC1yZWdzLmg+Ci0jaW5jbHVkZSAiZGI1NTAwLXByY211LXJlZ3MuaCIKKyNpbmNsdWRlICJkYng1MDAtcHJjbXUtcmVncy5oIgogCiAjZGVmaW5lIF9QUkNNX01CX0hFQURFUiAodGNkbV9iYXNlICsgMHhGRTgpCiAjZGVmaW5lIFBSQ01fUkVRX01CMF9IRUFERVIgKF9QUkNNX01CX0hFQURFUiArIDB4MCkKQEAgLTEwOSwxNSArMTA5LDE4IEBACiAjZGVmaW5lIFBSQ01VX0RTSV9DTE9DS19TRVRUSU5HCQkJMHgwMDAwMDEyOAogLyogVFZDTEtfTUdUIFBMTFNXPTAwMSAoUExMU09DMCkgUExMRElWPTB4MTMsID0gMTkuMDUgTUhaICovCiAjZGVmaW5lIFBSQ01VX0RTSV9MUF9DTE9DS19TRVRUSU5HCQkweDAwMDAwMTM1Ci0jZGVmaW5lIFBSQ01VX1BMTERTSV9GUkVRX1NFVFRJTkcJCTB4MDAwNDAxM0MKKyNkZWZpbmUgUFJDTVVfUExMRFNJX0ZSRVFfU0VUVElORwkJMHgwMDAyMDEyMQogI2RlZmluZSBQUkNNVV9EU0lfUExMT1VUX1NFTF9TRVRUSU5HCQkweDAwMDAwMDAyCi0jZGVmaW5lIFBSQ01VX0VOQUJMRV9FU0NBUEVfQ0xPQ0tfRElWCQkweDAzMDAwMTAxCisjZGVmaW5lIFBSQ01VX0VOQUJMRV9FU0NBUEVfQ0xPQ0tfRElWCQkweDAzMDAwMjAxCiAjZGVmaW5lIFBSQ01VX0RJU0FCTEVfRVNDQVBFX0NMT0NLX0RJVgkJMHgwMDAwMDEwMQogCiAjZGVmaW5lIFBSQ01VX0VOQUJMRV9QTExEU0kJCQkweDAwMDAwMDAxCiAjZGVmaW5lIFBSQ01VX0RJU0FCTEVfUExMRFNJCQkJMHgwMDAwMDAwMAogCiAjZGVmaW5lIFBSQ01VX0RTSV9SRVNFVF9TVwkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgUFJDTVVfUkVTT1VUTjBfUElOCQkJMHgwMDAwMDAwMQorI2RlZmluZSBQUkNNVV9SRVNPVVROMV9QSU4JCQkweDAwMDAwMDAyCisjZGVmaW5lIFBSQ01VX1JFU09VVE4yX1BJTgkJCTB4MDAwMDAwMDQKIAogI2RlZmluZSBQUkNNVV9QTExEU0lfTE9DS1BfTE9DS0VECQkweDMKIApAQCAtMzE1LDMxICszMTgsMzEgQEAKIAkJciA9IGZhbHNlOwogCQlicmVhazsKIAl9Ci0Jd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCgwKSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF8xKHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCgxKSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfMih2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCgyKSwgUFJDTV9BUk1fSVQxX0NMRUFSKTsKKwl3cml0ZWwoTUJPWF9CSVQoMiksIFBSQ01fQVJNX0lUMV9DTFIpOwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzModm9pZCkKIHsKLQl3cml0ZWwoTUJPWF9CSVQoMyksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDMpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF80KHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0zNjAsMTkgKzM2MywxOSBAQAogCQlwcmludF91bmtub3duX2hlYWRlcl93YXJuaW5nKDUsIGhlYWRlcik7CiAJCWJyZWFrOwogCX0KLQl3cml0ZWwoTUJPWF9CSVQoNSksIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKE1CT1hfQklUKDUpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF82KHZvaWQpCiB7Ci0Jd3JpdGVsKE1CT1hfQklUKDYpLCBQUkNNX0FSTV9JVDFfQ0xFQVIpOworCXdyaXRlbChNQk9YX0JJVCg2KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfNyh2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCg3KSwgUFJDTV9BUk1fSVQxX0NMRUFSKTsKKwl3cml0ZWwoTUJPWF9CSVQoNyksIFBSQ01fQVJNX0lUMV9DTFIpOwogCXJldHVybiBmYWxzZTsKIH0KIApAQCAtNDM0LDcgKzQzNyw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogQ2xlYW4gdXAgdGhlIG1haWxib3ggaW50ZXJydXB0cyBhZnRlciBwcmUta2VybmVsIGNvZGUuICovCi0Jd3JpdGVsKEFMTF9NQk9YX0JJVFMsIFBSQ01fQVJNX0lUMV9DTEVBUik7CisJd3JpdGVsKEFMTF9NQk9YX0JJVFMsIFBSQ01fQVJNX0lUMV9DTFIpOwogCiAJciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKElSUV9EQjU1MDBfUFJDTVUxLCBwcmNtdV9pcnFfaGFuZGxlciwKIAkJcHJjbXVfaXJxX3RocmVhZF9mbiwgMCwgInByY211IiwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYjg1MDAtcHJjbXUtcmVncy5oIGIvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LXJlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZjA0ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC9kYjg1MDAtcHJjbXUtcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNUTWljcm9lbGVjdHJvbmljcyAyMDA5Ci0gKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKLSAqCi0gKiBBdXRob3I6IEt1bWFyIFNhbmdodmkgPGt1bWFyLnNhbmdodmlAc3Rlcmljc3Nvbi5jb20+Ci0gKiBBdXRob3I6IFN1bmRhciBJeWVyIDxzdW5kYXIuaXllckBzdGVyaWNzc29uLmNvbT4KLSAqCi0gKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgotICoKLSAqIFBSQ00gVW5pdCByZWdpc3RlcnMKLSAqLwotI2lmbmRlZiBfX0RCODUwMF9QUkNNVV9SRUdTX0gKLSNkZWZpbmUgX19EQjg1MDBfUFJDTVVfUkVHU19ICi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLSNkZWZpbmUgQklUUyhfc3RhcnQsIF9lbmQpICgoQklUKF9lbmQpIC0gQklUKF9zdGFydCkpICsgQklUKF9lbmQpKQotCi0jZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTIDB4MTE4Ci0jZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTX0FSTV9CUk1fUkFURQlCSVRTKDAsIDUpCi0jZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTX01BWF9NQVNLCTB4RgotCi0jZGVmaW5lIFBSQ01fUExMQVJNX0xPQ0tQIDB4MEE4Ci0jZGVmaW5lIFBSQ01fUExMQVJNX0xPQ0tQX1BSQ01fUExMQVJNX0xPQ0tQMyBCSVQoMSkKLQotI2RlZmluZSBQUkNNX0FSTV9DSEdDTEtSRVEgMHgxMTQKLSNkZWZpbmUgUFJDTV9BUk1fQ0hHQ0xLUkVRX1BSQ01fQVJNX0NIR0NMS1JFUSBCSVQoMCkKLQotI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEUgMHg5OAotI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEVfUFJDTV9QTExBUk1fRU5BQkxFCUJJVCgwKQotI2RlZmluZSBQUkNNX1BMTEFSTV9FTkFCTEVfUFJDTV9QTExBUk1fQ09VTlRPTglCSVQoOCkKLQotI2RlZmluZSBQUkNNX0FSTUNMS0ZJWF9NR1QJMHgwCi0jZGVmaW5lIFBSQ01fQTlfUkVTRVROX0NMUgkweDFmNAotI2RlZmluZSBQUkNNX0E5X1JFU0VUTl9TRVQJMHgxZjAKLSNkZWZpbmUgUFJDTV9BUk1fTFNfQ0xBTVAJMHgzMEMKLSNkZWZpbmUgUFJDTV9TUkFNX0E5CQkweDMwOAotCi0vKiBBUk0gV0ZJIFN0YW5kYnkgc2lnbmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBSQ01fQVJNX1dGSV9TVEFOREJZCTB4MTMwCi0jZGVmaW5lIFBSQ01fSU9DUgkJMHgzMTAKLSNkZWZpbmUgUFJDTV9JT0NSX0lPRk9SQ0UgQklUKDApCi0KLS8qIENQVSBtYWlsYm94IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX01CT1hfQ1BVX1ZBTCAweDBGQwotI2RlZmluZSBQUkNNX01CT1hfQ1BVX1NFVCAweDEwMAotCi0vKiBEdWFsIEE5IGNvcmUgaW50ZXJydXB0IG1hbmFnZW1lbnQgdW5pdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9BOV9NQVNLX1JFUSAweDMyOAotI2RlZmluZSBQUkNNX0E5X01BU0tfUkVRX1BSQ01fQTlfTUFTS19SRVEgQklUKDApCi0KLSNkZWZpbmUgUFJDTV9BOV9NQVNLX0FDSwkweDMyQwotI2RlZmluZSBQUkNNX0FSTUlUTVNLMzFUTzAJMHgxMUMKLSNkZWZpbmUgUFJDTV9BUk1JVE1TSzYzVE8zMgkweDEyMAotI2RlZmluZSBQUkNNX0FSTUlUTVNLOTVUTzY0CTB4MTI0Ci0jZGVmaW5lIFBSQ01fQVJNSVRNU0sxMjdUTzk2CTB4MTI4Ci0jZGVmaW5lIFBSQ01fUE9XRVJfU1RBVEVfVkFMCTB4MjVDCi0jZGVmaW5lIFBSQ01fQVJNSVRWQUwzMVRPMAkweDI2MAotI2RlZmluZSBQUkNNX0FSTUlUVkFMNjNUTzMyCTB4MjY0Ci0jZGVmaW5lIFBSQ01fQVJNSVRWQUw5NVRPNjQJMHgyNjgKLSNkZWZpbmUgUFJDTV9BUk1JVFZBTDEyN1RPOTYJMHgyNkMKLQotI2RlZmluZSBQUkNNX0hPU1RBQ0NFU1NfUkVRIDB4MzM0Ci0jZGVmaW5lIFBSQ01fSE9TVEFDQ0VTU19SRVFfSE9TVEFDQ0VTU19SRVEgQklUKDApCi0KLSNkZWZpbmUgUFJDTV9BUk1fSVQxX0NMUiAweDQ4QwotI2RlZmluZSBQUkNNX0FSTV9JVDFfVkFMIDB4NDk0Ci0KLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzAJCTB4MTQ4Ci0jZGVmaW5lIFBSQ01fSVRTVEFUVVMxCQkweDE1MAotI2RlZmluZSBQUkNNX0lUU1RBVFVTMgkJMHgxNTgKLSNkZWZpbmUgUFJDTV9JVFNUQVRVUzMJCTB4MTYwCi0jZGVmaW5lIFBSQ01fSVRTVEFUVVM0CQkweDE2OAotI2RlZmluZSBQUkNNX0lUU1RBVFVTNQkJMHg0ODQKLSNkZWZpbmUgUFJDTV9JVENMRUFSNQkJMHg0ODgKLSNkZWZpbmUgUFJDTV9BUk1JVF9NQVNLWFA3MF9JVAkweDEwMTgKLQotLyogU3lzdGVtIHJlc2V0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFBSQ01fQVBFX1NPRlRSU1QgMHgyMjgKLQotLyogTGV2ZWwgc2hpZnRlciBhbmQgY2xhbXAgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9NTUlQX0xTX0NMQU1QX1NFVCAweDQyMAotI2RlZmluZSBQUkNNX01NSVBfTFNfQ0xBTVBfQ0xSIDB4NDI0Ci0KLS8qIFBSQ01VIEhXIHNlbWFwaG9yZSAqLwotI2RlZmluZSBQUkNNX1NFTSAweDQwMAotI2RlZmluZSBQUkNNX1NFTV9QUkNNX1NFTSBCSVQoMCkKLQotLyogUFJDTVUgY2xvY2svUExML3Jlc2V0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX1BMTERTSV9GUkVRCTB4NTAwCi0jZGVmaW5lIFBSQ01fUExMRFNJX0VOQUJMRQkweDUwNAotI2RlZmluZSBQUkNNX1BMTERTSV9MT0NLUAkweDUwOAotI2RlZmluZSBQUkNNX0RTSV9QTExPVVRfU0VMCTB4NTMwCi0jZGVmaW5lIFBSQ01fRFNJVFZDTEtfRElWCTB4NTJDCi0jZGVmaW5lIFBSQ01fQVBFX1JFU0VUTl9TRVQJMHgxRTQKLSNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX0NMUgkweDFFOAotCi0jZGVmaW5lIFBSQ01fVENSCQkweDFDOAotI2RlZmluZSBQUkNNX1RDUl9URU5TRUxfTUFTSwlCSVRTKDAsIDcpCi0jZGVmaW5lIFBSQ01fVENSX1NUT1BfVElNRVJTCUJJVCgxNikKLSNkZWZpbmUgUFJDTV9UQ1JfRE9aRV9NT0RFCUJJVCgxNykKLQotI2RlZmluZSBQUkNNX0NMS09DUgkJCTB4MUNDCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYwX1NISUZUCTAKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjBfTUFTSwlCSVRTKDAsIDUpCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwwX1NISUZUCTYKLSNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDBfTUFTSwlCSVRTKDYsIDgpCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYxX1NISUZUCTE2Ci0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYxX01BU0sJQklUUygxNiwgMjEpCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwxX1NISUZUCTIyCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwxX01BU0sJQklUUygyMiwgMjQpCi0jZGVmaW5lIFBSQ01fQ0xLT0NSX0NMSzFUWVBFCQlCSVQoMjgpCi0KLSNkZWZpbmUgUFJDTV9TR0FDTEtfTUdUCQkweDAxNAotI2RlZmluZSBQUkNNX1VBUlRDTEtfTUdUCTB4MDE4Ci0jZGVmaW5lIFBSQ01fTVNQMDJDTEtfTUdUCTB4MDFDCi0jZGVmaW5lIFBSQ01fTVNQMUNMS19NR1QJMHgyODgKLSNkZWZpbmUgUFJDTV9JMkNDTEtfTUdUCQkweDAyMAotI2RlZmluZSBQUkNNX1NETU1DQ0xLX01HVAkweDAyNAotI2RlZmluZSBQUkNNX1NMSU1DTEtfTUdUCTB4MDI4Ci0jZGVmaW5lIFBSQ01fUEVSMUNMS19NR1QJMHgwMkMKLSNkZWZpbmUgUFJDTV9QRVIyQ0xLX01HVAkweDAzMAotI2RlZmluZSBQUkNNX1BFUjNDTEtfTUdUCTB4MDM0Ci0jZGVmaW5lIFBSQ01fUEVSNUNMS19NR1QJMHgwMzgKLSNkZWZpbmUgUFJDTV9QRVI2Q0xLX01HVAkweDAzQwotI2RlZmluZSBQUkNNX1BFUjdDTEtfTUdUCTB4MDQwCi0jZGVmaW5lIFBSQ01fTENEQ0xLX01HVAkJMHgwNDQKLSNkZWZpbmUgUFJDTV9CTUxDTEtfTUdUCQkweDA0QwotI2RlZmluZSBQUkNNX0hTSVRYQ0xLX01HVAkweDA1MAotI2RlZmluZSBQUkNNX0hTSVJYQ0xLX01HVAkweDA1NAotI2RlZmluZSBQUkNNX0hETUlDTEtfTUdUCTB4MDU4Ci0jZGVmaW5lIFBSQ01fQVBFQVRDTEtfTUdUCTB4MDVDCi0jZGVmaW5lIFBSQ01fQVBFVFJBQ0VDTEtfTUdUCTB4MDYwCi0jZGVmaW5lIFBSQ01fTUNERUNMS19NR1QJMHgwNjQKLSNkZWZpbmUgUFJDTV9JUEkyQ0NMS19NR1QJMHgwNjgKLSNkZWZpbmUgUFJDTV9EU0lBTFRDTEtfTUdUCTB4MDZDCi0jZGVmaW5lIFBSQ01fRE1BQ0xLX01HVAkJMHgwNzQKLSNkZWZpbmUgUFJDTV9CMlIyQ0xLX01HVAkweDA3OAotI2RlZmluZSBQUkNNX1RWQ0xLX01HVAkJMHgwN0MKLSNkZWZpbmUgUFJDTV9VTklQUk9DTEtfTUdUCTB4Mjc4Ci0jZGVmaW5lIFBSQ01fU1NQQ0xLX01HVAkJMHgyODAKLSNkZWZpbmUgUFJDTV9STkdDTEtfTUdUCQkweDI4NAotI2RlZmluZSBQUkNNX1VJQ0NDTEtfTUdUCTB4MjdDCi0KLSNkZWZpbmUgUFJDTV9DTEtfTUdUX0NMS1BMTERJVl9NQVNLCUJJVFMoMCwgNCkKLSNkZWZpbmUgUFJDTV9DTEtfTUdUX0NMS1BMTFNXX01BU0sJQklUUyg1LCA3KQotI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLRU4JCUJJVCg4KQotCi0vKiBlUE9EIGFuZCBtZW1vcnkgcG93ZXIgc2lnbmFsIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBSQ01fRVBPRF9DX1NFVAkJMHg0MTAKLSNkZWZpbmUgUFJDTV9TUkFNX0xTX1NMRUVQCTB4MzA0Ci0KLS8qIERlYnVnIHBvd2VyIGNvbnRyb2wgdW5pdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9TRVQgMHgyNTQKLQotLyogTWlzY2VsbGFuZW91cyB1bml0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBQUkNNX0RTSV9TV19SRVNFVCAweDMyNAotI2RlZmluZSBQUkNNX0dQSU9DUgkJMHgxMzgKLQotLyogR1BJT0NSIHJlZ2lzdGVyICovCi0jZGVmaW5lIFBSQ01fR1BJT0NSX1NQSTJfU0VMRUNUIEJJVCgyMykKLQotI2RlZmluZSBQUkNNX0REUl9TVUJTWVNfQVBFX01JTkJXICAweDQzOAotCi0jZW5kaWYgLyogX19EQjg1MDBfUFJDTVVfUkVHU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYjg1MDAtcHJjbXUuYyBiL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS5jCmluZGV4IDAyYTE1ZDcuLmEyNWFiOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS5jCisrKyBiL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS5jCkBAIC0yNywxNCArMjcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RieDUwMC1wcmNtdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kYjg1MDAtcHJjbXUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2RiODUwMC1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9pZC5oPgotI2luY2x1ZGUgImRiODUwMC1wcmNtdS1yZWdzLmgiCisjaW5jbHVkZSAiZGJ4NTAwLXByY211LXJlZ3MuaCIKIAogLyogT2Zmc2V0IGZvciB0aGUgZmlybXdhcmUgdmVyc2lvbiB3aXRoaW4gdGhlIFRDUE0gKi8KICNkZWZpbmUgUFJDTVVfRldfVkVSU0lPTl9PRkZTRVQgMHhBNApAQCAtMTMxLDEyICsxMzEsMTQgQEAKICNkZWZpbmUgTUIxSF9SRVFVRVNUX0FQRV9PUFBfMTAwX1ZPTFQgMHgzCiAjZGVmaW5lIE1CMUhfUkVMRUFTRV9BUEVfT1BQXzEwMF9WT0xUIDB4NAogI2RlZmluZSBNQjFIX1JFTEVBU0VfVVNCX1dBS0VVUCAweDUKKyNkZWZpbmUgTUIxSF9QTExfT05fT0ZGIDB4NgogCiAvKiBNYWlsYm94IDEgUmVxdWVzdHMgKi8KICNkZWZpbmUgUFJDTV9SRVFfTUIxX0FSTV9PUFAJCQkoUFJDTV9SRVFfTUIxICsgMHgwKQogI2RlZmluZSBQUkNNX1JFUV9NQjFfQVBFX09QUAkJCShQUkNNX1JFUV9NQjEgKyAweDEpCi0jZGVmaW5lIFBSQ01fUkVRX01CMV9BUEVfT1BQXzEwMF9SRVNUT1JFCShQUkNNX1JFUV9NQjEgKyAweDQpCi0jZGVmaW5lIFBSQ01fUkVRX01CMV9BUk1fT1BQXzEwMF9SRVNUT1JFCShQUkNNX1JFUV9NQjEgKyAweDgpCisjZGVmaW5lIFBSQ01fUkVRX01CMV9QTExfT05fT0ZGCQkJKFBSQ01fUkVRX01CMSArIDB4NCkKKyNkZWZpbmUgUExMX1NPQzFfT0ZGCTB4NAorI2RlZmluZSBQTExfU09DMV9PTgkweDgKIAogLyogTWFpbGJveCAxIEFDS3MgKi8KICNkZWZpbmUgUFJDTV9BQ0tfTUIxX0NVUlJFTlRfQVJNX09QUAkoUFJDTV9BQ0tfTUIxICsgMHgwKQpAQCAtMTg0LDYgKzE4NiwxMSBAQAogI2RlZmluZSBNQjRIX0hPVERPRwkweDEyCiAjZGVmaW5lIE1CNEhfSE9UTU9OCTB4MTMKICNkZWZpbmUgTUI0SF9IT1RfUEVSSU9ECTB4MTQKKyNkZWZpbmUgTUI0SF9BOVdET0dfQ09ORiAweDE2CisjZGVmaW5lIE1CNEhfQTlXRE9HX0VOICAgMHgxNworI2RlZmluZSBNQjRIX0E5V0RPR19ESVMgIDB4MTgKKyNkZWZpbmUgTUI0SF9BOVdET0dfTE9BRCAweDE5CisjZGVmaW5lIE1CNEhfQTlXRE9HX0tJQ0sgMHgyMAogCiAvKiBNYWlsYm94IDQgUmVxdWVzdHMgKi8KICNkZWZpbmUgUFJDTV9SRVFfTUI0X0REUl9TVF9BUF9TTEVFUF9JRExFCShQUkNNX1JFUV9NQjQgKyAweDApCkBAIC0xOTYsNiArMjAzLDEzIEBACiAjZGVmaW5lIFBSQ01fUkVRX01CNF9IT1RfUEVSSU9ECQkJKFBSQ01fUkVRX01CNCArIDB4MCkKICNkZWZpbmUgSE9UTU9OX0NPTkZJR19MT1cJCQlCSVQoMCkKICNkZWZpbmUgSE9UTU9OX0NPTkZJR19ISUdICQkJQklUKDEpCisjZGVmaW5lIFBSQ01fUkVRX01CNF9BOVdET0dfMAkJCShQUkNNX1JFUV9NQjQgKyAweDApCisjZGVmaW5lIFBSQ01fUkVRX01CNF9BOVdET0dfMQkJCShQUkNNX1JFUV9NQjQgKyAweDEpCisjZGVmaW5lIFBSQ01fUkVRX01CNF9BOVdET0dfMgkJCShQUkNNX1JFUV9NQjQgKyAweDIpCisjZGVmaW5lIFBSQ01fUkVRX01CNF9BOVdET0dfMwkJCShQUkNNX1JFUV9NQjQgKyAweDMpCisjZGVmaW5lIEE5V0RPR19BVVRPX09GRl9FTgkJCUJJVCg3KQorI2RlZmluZSBBOVdET0dfQVVUT19PRkZfRElTCQkJMAorI2RlZmluZSBBOVdET0dfSURfTUFTSwkJCQkweGYKIAogLyogTWFpbGJveCA1IFJlcXVlc3RzICovCiAjZGVmaW5lIFBSQ01fUkVRX01CNV9JMkNfU0xBVkVfT1AJKFBSQ01fUkVRX01CNSArIDB4MCkKQEAgLTQxMiw3ICs0MjYsNyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsa19tZ3RfbG9jayk7CiAKLSNkZWZpbmUgQ0xLX01HVF9FTlRSWShfbmFtZSlbUFJDTVVfIyNfbmFtZV0gPSB7IChQUkNNXyMjX25hbWUjI19NR1QpLCAwIH0KKyNkZWZpbmUgQ0xLX01HVF9FTlRSWShfbmFtZSlbUFJDTVVfIyNfbmFtZV0gPSB7IChQUkNNXyMjX25hbWUjI19NR1RfT0ZGKSwgMCB9CiBzdHJ1Y3QgY2xrX21ndCBjbGtfbWd0W1BSQ01VX05VTV9SRUdfQ0xPQ0tTXSA9IHsKIAlDTEtfTUdUX0VOVFJZKFNHQUNMSyksCiAJQ0xLX01HVF9FTlRSWShVQVJUQ0xLKSwKQEAgLTQ0NSw2ICs0NTksMzUgQEAKIAlDTEtfTUdUX0VOVFJZKFVJQ0NDTEspLAogfTsKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmh3YWNjX3JlZ3VsYXRvcltOVU1fSFdfQUNDXTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpod2FjY19yZXRfcmVndWxhdG9yW05VTV9IV19BQ0NdOworCitzdGF0aWMgYm9vbCBod2FjY19lbmFibGVkW05VTV9IV19BQ0NdOworc3RhdGljIGJvb2wgaHdhY2NfcmV0X2VuYWJsZWRbTlVNX0hXX0FDQ107CisKK3N0YXRpYyBjb25zdCBjaGFyICpod2FjY19yZWd1bGF0b3JfbmFtZVtOVU1fSFdfQUNDXSA9IHsKKwlbSFdfQUNDX1NWQU1NRFNQXQk9ICJod2FjYy1zdmEtbW1kc3AiLAorCVtIV19BQ0NfU1ZBUElQRV0JPSAiaHdhY2Mtc3ZhLXBpcGUiLAorCVtIV19BQ0NfU0lBTU1EU1BdCT0gImh3YWNjLXNpYS1tbWRzcCIsCisJW0hXX0FDQ19TSUFQSVBFXQk9ICJod2FjYy1zaWEtcGlwZSIsCisJW0hXX0FDQ19TR0FdCQk9ICJod2FjYy1zZ2EiLAorCVtIV19BQ0NfQjJSMl0JCT0gImh3YWNjLWIycjIiLAorCVtIV19BQ0NfTUNERV0JCT0gImh3YWNjLW1jZGUiLAorCVtIV19BQ0NfRVNSQU0xXQkJPSAiaHdhY2MtZXNyYW0xIiwKKwlbSFdfQUNDX0VTUkFNMl0JCT0gImh3YWNjLWVzcmFtMiIsCisJW0hXX0FDQ19FU1JBTTNdCQk9ICJod2FjYy1lc3JhbTMiLAorCVtIV19BQ0NfRVNSQU00XQkJPSAiaHdhY2MtZXNyYW00IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpod2FjY19yZXRfcmVndWxhdG9yX25hbWVbTlVNX0hXX0FDQ10gPSB7CisJW0hXX0FDQ19TVkFNTURTUF0JPSAiaHdhY2Mtc3ZhLW1tZHNwLXJldCIsCisJW0hXX0FDQ19TSUFNTURTUF0JPSAiaHdhY2Mtc2lhLW1tZHNwLXJldCIsCisJW0hXX0FDQ19FU1JBTTFdCQk9ICJod2FjYy1lc3JhbTEtcmV0IiwKKwlbSFdfQUNDX0VTUkFNMl0JCT0gImh3YWNjLWVzcmFtMi1yZXQiLAorCVtIV19BQ0NfRVNSQU0zXQkJPSAiaHdhY2MtZXNyYW0zLXJldCIsCisJW0hXX0FDQ19FU1JBTTRdCQk9ICJod2FjYy1lc3JhbTQtcmV0IiwKK307CisKIC8qCiAqIFVzZWQgYnkgTUNERSB0byBzZXR1cCBhbGwgbmVjZXNzYXJ5IFBSQ01VIHJlZ2lzdGVycwogKi8KQEAgLTQ5Myw1NSArNTM2LDUxIEBACiB9IHByY211X3ZlcnNpb247CiAKIAotaW50IHByY211X2VuYWJsZV9kc2lwbGwodm9pZCkKK2ludCBkYjg1MDBfcHJjbXVfZW5hYmxlX2RzaXBsbCh2b2lkKQogewogCWludCBpOwogCXVuc2lnbmVkIGludCBwbGxkc2lmcmVxOwogCiAJLyogQ2xlYXIgRFNJUExMX1JFU0VUTiAqLwotCXdyaXRlbChQUkNNVV9SRVNFVF9EU0lQTEwsIChfUFJDTVVfQkFTRSArIFBSQ01fQVBFX1JFU0VUTl9DTFIpKTsKKwl3cml0ZWwoUFJDTVVfUkVTRVRfRFNJUExMLCBQUkNNX0FQRV9SRVNFVE5fQ0xSKTsKIAkvKiBVbmNsYW1wIERTSVBMTCBpbi9vdXQgKi8KLQl3cml0ZWwoUFJDTVVfVU5DTEFNUF9EU0lQTEwsIChfUFJDTVVfQkFTRSArIFBSQ01fTU1JUF9MU19DTEFNUF9DTFIpKTsKKwl3cml0ZWwoUFJDTVVfVU5DTEFNUF9EU0lQTEwsIFBSQ01fTU1JUF9MU19DTEFNUF9DTFIpOwogCiAJaWYgKHByY211X2lzX3U4NDAwKCkpCiAJCXBsbGRzaWZyZXEgPSBQUkNNVV9QTExEU0lfRlJFUV9TRVRUSU5HX1U4NDAwOwogCWVsc2UKIAkJcGxsZHNpZnJlcSA9IFBSQ01VX1BMTERTSV9GUkVRX1NFVFRJTkc7CiAJLyogU2V0IERTSSBQTEwgRlJFUSAqLwotCXdyaXRlbChwbGxkc2lmcmVxLCAoX1BSQ01VX0JBU0UgKyBQUkNNX1BMTERTSV9GUkVRKSk7Ci0Jd3JpdGVsKFBSQ01VX0RTSV9QTExPVVRfU0VMX1NFVFRJTkcsCi0JCShfUFJDTVVfQkFTRSArIFBSQ01fRFNJX1BMTE9VVF9TRUwpKTsKKwl3cml0ZWwocGxsZHNpZnJlcSwgUFJDTV9QTExEU0lfRlJFUSk7CisJd3JpdGVsKFBSQ01VX0RTSV9QTExPVVRfU0VMX1NFVFRJTkcsIFBSQ01fRFNJX1BMTE9VVF9TRUwpOwogCS8qIEVuYWJsZSBFc2NhcGUgY2xvY2tzICovCi0Jd3JpdGVsKFBSQ01VX0VOQUJMRV9FU0NBUEVfQ0xPQ0tfRElWLAotCQkJCQkoX1BSQ01VX0JBU0UgKyBQUkNNX0RTSVRWQ0xLX0RJVikpOworCXdyaXRlbChQUkNNVV9FTkFCTEVfRVNDQVBFX0NMT0NLX0RJViwgUFJDTV9EU0lUVkNMS19ESVYpOwogCiAJLyogU3RhcnQgRFNJIFBMTCAqLwotCXdyaXRlbChQUkNNVV9FTkFCTEVfUExMRFNJLCAoX1BSQ01VX0JBU0UgKyBQUkNNX1BMTERTSV9FTkFCTEUpKTsKKwl3cml0ZWwoUFJDTVVfRU5BQkxFX1BMTERTSSwgUFJDTV9QTExEU0lfRU5BQkxFKTsKIAkvKiBSZXNldCBEU0kgUExMICovCi0Jd3JpdGVsKFBSQ01VX0RTSV9SRVNFVF9TVywgKF9QUkNNVV9CQVNFICsgUFJDTV9EU0lfU1dfUkVTRVQpKTsKKwl3cml0ZWwoUFJDTVVfRFNJX1JFU0VUX1NXLCBQUkNNX0RTSV9TV19SRVNFVCk7CiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJaWYgKChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fUExMRFNJX0xPQ0tQKSAmCi0JCQlQUkNNVV9QTExEU0lfTE9DS1BfTE9DS0VEKQorCQlpZiAoKHJlYWRsKFBSQ01fUExMRFNJX0xPQ0tQKSAmIFBSQ01VX1BMTERTSV9MT0NLUF9MT0NLRUQpCiAJCQkJCT09IFBSQ01VX1BMTERTSV9MT0NLUF9MT0NLRUQpCiAJCQlicmVhazsKIAkJdWRlbGF5KDEwMCk7CiAJfQogCS8qIFNldCBEU0lQTExfUkVTRVROICovCi0Jd3JpdGVsKFBSQ01VX1JFU0VUX0RTSVBMTCwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUEVfUkVTRVROX1NFVCkpOworCXdyaXRlbChQUkNNVV9SRVNFVF9EU0lQTEwsIFBSQ01fQVBFX1JFU0VUTl9TRVQpOwogCXJldHVybiAwOwogfQogCi1pbnQgcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCkKK2ludCBkYjg1MDBfcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCkKIHsKIAkvKiBEaXNhYmxlIGRzaSBwbGwgKi8KLQl3cml0ZWwoUFJDTVVfRElTQUJMRV9QTExEU0ksIChfUFJDTVVfQkFTRSArIFBSQ01fUExMRFNJX0VOQUJMRSkpOworCXdyaXRlbChQUkNNVV9ESVNBQkxFX1BMTERTSSwgUFJDTV9QTExEU0lfRU5BQkxFKTsKIAkvKiBEaXNhYmxlICBlc2NhcGVjbG9jayAqLwotCXdyaXRlbChQUkNNVV9ESVNBQkxFX0VTQ0FQRV9DTE9DS19ESVYsCi0JCQkJCShfUFJDTVVfQkFTRSArIFBSQ01fRFNJVFZDTEtfRElWKSk7CisJd3JpdGVsKFBSQ01VX0RJU0FCTEVfRVNDQVBFX0NMT0NLX0RJViwgUFJDTV9EU0lUVkNMS19ESVYpOwogCXJldHVybiAwOwogfQogCi1pbnQgcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKHZvaWQpCitpbnQgZGI4NTAwX3ByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGRzaWNsazsKQEAgLTU1NCwxNSArNTkzLDE1IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCiAJLyogR3JhYiB0aGUgSFcgc2VtYXBob3JlLiAqLwotCXdoaWxlICgocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX1NFTSkgJiBQUkNNX1NFTV9QUkNNX1NFTSkgIT0gMCkKKwl3aGlsZSAoKHJlYWRsKFBSQ01fU0VNKSAmIFBSQ01fU0VNX1BSQ01fU0VNKSAhPSAwKQogCQljcHVfcmVsYXgoKTsKIAotCXdyaXRlbChkc2ljbGssIChfUFJDTVVfQkFTRSArIFBSQ01fSERNSUNMS19NR1QpKTsKLQl3cml0ZWwoUFJDTVVfRFNJX0xQX0NMT0NLX1NFVFRJTkcsIChfUFJDTVVfQkFTRSArIFBSQ01fVFZDTEtfTUdUKSk7Ci0Jd3JpdGVsKFBSQ01VX0RQSV9DTE9DS19TRVRUSU5HLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0xDRENMS19NR1QpKTsKKwl3cml0ZWwoZHNpY2xrLCBQUkNNX0hETUlDTEtfTUdUKTsKKwl3cml0ZWwoUFJDTVVfRFNJX0xQX0NMT0NLX1NFVFRJTkcsIFBSQ01fVFZDTEtfTUdUKTsKKwl3cml0ZWwoUFJDTVVfRFBJX0NMT0NLX1NFVFRJTkcsIFBSQ01fTENEQ0xLX01HVCk7CiAKIAkvKiBSZWxlYXNlIHRoZSBIVyBzZW1hcGhvcmUuICovCi0Jd3JpdGVsKDAsIChfUFJDTVVfQkFTRSArIFBSQ01fU0VNKSk7CisJd3JpdGVsKDAsIFBSQ01fU0VNKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCkBAIC01NzgsOCArNjE3LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9jcl9sb2NrLCBmbGFncyk7Ci0JcmVnID0gcmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX0dQSU9DUik7Ci0Jd3JpdGVsKHJlZyB8IFBSQ01fR1BJT0NSX1NQSTJfU0VMRUNULCBfUFJDTVVfQkFTRSArIFBSQ01fR1BJT0NSKTsKKwlyZWcgPSByZWFkbChQUkNNX0dQSU9DUik7CisJd3JpdGVsKHJlZyB8IFBSQ01fR1BJT0NSX1NQSTJfU0VMRUNULCBQUkNNX0dQSU9DUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb2NyX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtNTkyLDggKzYzMSw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvY3JfbG9jaywgZmxhZ3MpOwotCXJlZyA9IHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9HUElPQ1IpOwotCXdyaXRlbChyZWcgJiB+UFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QsIF9QUkNNVV9CQVNFICsgUFJDTV9HUElPQ1IpOworCXJlZyA9IHJlYWRsKFBSQ01fR1BJT0NSKTsKKwl3cml0ZWwocmVnICYgflBSQ01fR1BJT0NSX1NQSTJfU0VMRUNULCBQUkNNX0dQSU9DUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb2NyX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtNzAxLDcgKzc0MCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrb3V0X2xvY2ssIGZsYWdzKTsKIAotCXZhbCA9IHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9DTEtPQ1IpOworCXZhbCA9IHJlYWRsKFBSQ01fQ0xLT0NSKTsKIAlpZiAodmFsICYgZGl2X21hc2spIHsKIAkJaWYgKGRpdikgewogCQkJaWYgKCh2YWwgJiBtYXNrKSAhPSBiaXRzKSB7CkBAIC03MTUsNyArNzU0LDcgQEAKIAkJCX0KIAkJfQogCX0KLQl3cml0ZWwoKGJpdHMgfCAodmFsICYgfm1hc2spKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9DTEtPQ1IpKTsKKwl3cml0ZWwoKGJpdHMgfCAodmFsICYgfm1hc2spKSwgUFJDTV9DTEtPQ1IpOwogCXJlcXVlc3RzW2Nsa291dF0gKz0gKGRpdiA/IDEgOiAtMSk7CiAKIHVubG9ja19hbmRfcmV0dXJuOgpAQCAtNzI0LDcgKzc2Myw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLWludCBwcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLCBib29sIGtlZXBfYXBfcGxsKQoraW50IGRiODUwMF9wcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLCBib29sIGtlZXBfYXBfcGxsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTczMiw3ICs3NzEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1iMF90cmFuc2Zlci5sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgwKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CMEhfUE9XRVJfU1RBVEVfVFJBTlMsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjApKTsKQEAgLTc0MSw3ICs3ODAsNyBAQAogCXdyaXRlYigoa2VlcF91bHBfY2xrID8gMSA6IDApLAogCQkodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIwX1VMUF9DTE9DS19TVEFURSkpOwogCXdyaXRlYigwLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIwX0RPX05PVF9XRkkpKTsKLQl3cml0ZWwoTUJPWF9CSVQoMCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDApLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYjBfdHJhbnNmZXIubG9jaywgZmxhZ3MpOwogCkBAIC03NzAsMTggKzgwOSwxOCBAQAogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDApKQorCQl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMCkpCiAJCQljcHVfcmVsYXgoKTsKIAkJd3JpdGVsKGRiYl9ldmVudHMsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjBfV0FLRVVQXzg1MDApKTsKIAkJd3JpdGVsKGFiYl9ldmVudHMsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjBfV0FLRVVQXzQ1MDApKTsKIAkJd3JpdGViKGhlYWRlcltpXSwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMCkpOwotCQl3cml0ZWwoTUJPWF9CSVQoMCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJCXdyaXRlbChNQk9YX0JJVCgwKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCX0KIAlsYXN0X2RiYl9ldmVudHMgPSBkYmJfZXZlbnRzOwogCWxhc3RfYWJiX2V2ZW50cyA9IGFiYl9ldmVudHM7CiB9CiAKLXZvaWQgcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpCit2b2lkIGRiODUwMF9wcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBiaXRzOwpAQCAtODAyLDcgKzg0MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWIwX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBwcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCit2b2lkIGRiODUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtODE0LDcgKzg1Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWIwX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCBwcmNtdV9nZXRfYWJiX2V2ZW50X2J1ZmZlcih2b2lkIF9faW9tZW0gKipidWYpCit2b2lkIGRiODUwMF9wcmNtdV9nZXRfYWJiX2V2ZW50X2J1ZmZlcih2b2lkIF9faW9tZW0gKipidWYpCiB7CiAJaWYgKHJlYWRiKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CMF9SRUFEX1BPSU5URVIpICYgMSkKIAkJKmJ1ZiA9ICh0Y2RtX2Jhc2UgKyBQUkNNX0FDS19NQjBfV0FLRVVQXzFfNDUwMCk7CkBAIC04MjMsMTMgKzg2MiwxMyBAQAogfQogCiAvKioKLSAqIHByY211X3NldF9hcm1fb3BwIC0gc2V0IHRoZSBhcHByb3ByaWF0ZSBBUk0gT1BQCisgKiBkYjg1MDBfcHJjbXVfc2V0X2FybV9vcHAgLSBzZXQgdGhlIGFwcHJvcHJpYXRlIEFSTSBPUFAKICAqIEBvcHA6IFRoZSBuZXcgQVJNIG9wZXJhdGluZyBwb2ludCB0byB3aGljaCB0cmFuc2l0aW9uIGlzIHRvIGJlIG1hZGUKICAqIFJldHVybnM6IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZQogICoKICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdGhlIG9wZXJhdGluZyBwb2ludCBvZiB0aGUgQVJNLgogICovCi1pbnQgcHJjbXVfc2V0X2FybV9vcHAodTggb3BwKQoraW50IGRiODUwMF9wcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCiB7CiAJaW50IHI7CiAKQEAgLTg0MCwxNCArODc5LDE0IEBACiAKIAltdXRleF9sb2NrKCZtYjFfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CMUhfQVJNX0FQRV9PUFAsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjEpKTsKIAl3cml0ZWIob3BwLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIxX0FSTV9PUFApKTsKIAl3cml0ZWIoQVBFX05PX0NIQU5HRSwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CMV9BUEVfT1BQKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoMSksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWIxX3RyYW5zZmVyLndvcmspOwogCiAJaWYgKChtYjFfdHJhbnNmZXIuYWNrLmhlYWRlciAhPSBNQjFIX0FSTV9BUEVfT1BQKSB8fApAQCAtODYwLDExICs4OTksMTEgQEAKIH0KIAogLyoqCi0gKiBwcmNtdV9nZXRfYXJtX29wcCAtIGdldCB0aGUgY3VycmVudCBBUk0gT1BQCisgKiBkYjg1MDBfcHJjbXVfZ2V0X2FybV9vcHAgLSBnZXQgdGhlIGN1cnJlbnQgQVJNIE9QUAogICoKICAqIFJldHVybnM6IHRoZSBjdXJyZW50IEFSTSBPUFAKICAqLwotaW50IHByY211X2dldF9hcm1fb3BwKHZvaWQpCitpbnQgZGI4NTAwX3ByY211X2dldF9hcm1fb3BwKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRiKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CMV9DVVJSRU5UX0FSTV9PUFApOwogfQpAQCAtODc2LDcgKzkxNSw3IEBACiAgKi8KIGludCBwcmNtdV9nZXRfZGRyX29wcCh2b2lkKQogewotCXJldHVybiByZWFkYihfUFJDTVVfQkFTRSArIFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcpOworCXJldHVybiByZWFkYihQUkNNX0REUl9TVUJTWVNfQVBFX01JTkJXKTsKIH0KIAogLyoqCkBAIC04OTIsNyArOTMxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyogQ2hhbmdpbmcgdGhlIEREUiBPUFAgY2FuIGhhbmcgdGhlIGhhcmR3YXJlIHByZS12MjEgKi8KIAlpZiAoY3B1X2lzX3U4NTAwdjIwX29yX2xhdGVyKCkgJiYgIWNwdV9pc191ODUwMHYyMCgpKQotCQl3cml0ZWIob3BwLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0REUl9TVUJTWVNfQVBFX01JTkJXKSk7CisJCXdyaXRlYihvcHAsIFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDksMTQgKzk0OCwxNCBAQAogCiAJbXV0ZXhfbG9jaygmbWIxX3RyYW5zZmVyLmxvY2spOwogCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQogCQljcHVfcmVsYXgoKTsKIAogCXdyaXRlYihNQjFIX0FSTV9BUEVfT1BQLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIxKSk7CiAJd3JpdGViKEFSTV9OT19DSEFOR0UsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjFfQVJNX09QUCkpOwogCXdyaXRlYihvcHAsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjFfQVBFX09QUCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDEpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgxKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iMV90cmFuc2Zlci53b3JrKTsKIAogCWlmICgobWIxX3RyYW5zZmVyLmFjay5oZWFkZXIgIT0gTUIxSF9BUk1fQVBFX09QUCkgfHwKQEAgLTk2NiwxMiArMTAwNSwxMiBAQAogCQloZWFkZXIgPSBNQjFIX1JFTEVBU0VfQVBFX09QUF8xMDBfVk9MVDsKIAl9CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKGhlYWRlciwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMSkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDEpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgxKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iMV90cmFuc2Zlci53b3JrKTsKIAogCWlmICgobWIxX3RyYW5zZmVyLmFjay5oZWFkZXIgIT0gaGVhZGVyKSB8fApAQCAtOTk1LDEzICsxMDM0LDEzIEBACiAKIAltdXRleF9sb2NrKCZtYjFfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CMUhfUkVMRUFTRV9VU0JfV0FLRVVQLAogCQkodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIxKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoMSksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWIxX3RyYW5zZmVyLndvcmspOwogCiAJaWYgKChtYjFfdHJhbnNmZXIuYWNrLmhlYWRlciAhPSBNQjFIX1JFTEVBU0VfVVNCX1dBS0VVUCkgfHwKQEAgLTEwMTMsMTUgKzEwNTIsMTY5IEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyBpbnQgcmVxdWVzdF9wbGwodTggY2xvY2ssIGJvb2wgZW5hYmxlKQoreworCWludCByID0gMDsKKworCWlmIChjbG9jayA9PSBQUkNNVV9QTExTT0MxKQorCQljbG9jayA9IChlbmFibGUgPyBQTExfU09DMV9PTiA6IFBMTF9TT0MxX09GRik7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1iMV90cmFuc2Zlci5sb2NrKTsKKworCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKKwkJY3B1X3JlbGF4KCk7CisKKwl3cml0ZWIoTUIxSF9QTExfT05fT0ZGLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIxKSk7CisJd3JpdGViKGNsb2NrLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIxX1BMTF9PTl9PRkYpKTsKKworCXdyaXRlbChNQk9YX0JJVCgxKSwgUFJDTV9NQk9YX0NQVV9TRVQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iMV90cmFuc2Zlci53b3JrKTsKKworCWlmIChtYjFfdHJhbnNmZXIuYWNrLmhlYWRlciAhPSBNQjFIX1BMTF9PTl9PRkYpCisJCXIgPSAtRUlPOworCisJbXV0ZXhfdW5sb2NrKCZtYjFfdHJhbnNmZXIubG9jayk7CisKKwlyZXR1cm4gcjsKK30KKwogLyoqCi0gKiBwcmNtdV9zZXRfZXBvZCAtIHNldCB0aGUgc3RhdGUgb2YgYSBFUE9EIChwb3dlciBkb21haW4pCisgKiBwcmNtdV9zZXRfaHdhY2MgLSBzZXQgdGhlIHBvd2VyIHN0YXRlIG9mIGEgaC93IGFjY2VsZXJhdG9yCisgKiBAaHdhY2NfZGV2OiBUaGUgaGFyZHdhcmUgYWNjZWxlcmF0b3IgKGVudW0gaHdfYWNjX2RldikuCisgKiBAc3RhdGU6IFRoZSBuZXcgcG93ZXIgc3RhdGUgKGVudW0gaHdfYWNjX3N0YXRlKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBvd2VyIHN0YXRlIG9mIGEgaGFyZHdhcmUgYWNjZWxlcmF0b3IuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogTk9URSEgRGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIGFsbCB1c2VycyBzd2l0Y2hlZCBvdmVyIHRvIHVzZSB0aGUKKyAqIHJlZ3VsYXRvciBmcmFtZXdvcmsgQVBJLgorICovCitpbnQgcHJjbXVfc2V0X2h3YWNjKHUxNiBod2FjY19kZXYsIHU4IHN0YXRlKQoreworCWludCByID0gMDsKKwlib29sIHJhbV9yZXRlbnRpb24gPSBmYWxzZTsKKwlib29sIGVuYWJsZSwgZW5hYmxlX3JldDsKKworCS8qIGNoZWNrIGFyZ3VtZW50ICovCisJQlVHX09OKGh3YWNjX2RldiA+PSBOVU1fSFdfQUNDKTsKKworCS8qIGdldCBzdGF0ZSBvZiBzd2l0Y2hlcyAqLworCWVuYWJsZSA9IGh3YWNjX2VuYWJsZWRbaHdhY2NfZGV2XTsKKwllbmFibGVfcmV0ID0gaHdhY2NfcmV0X2VuYWJsZWRbaHdhY2NfZGV2XTsKKworCS8qIHNldCBmbGFnIGlmIHJldGVudGlvbiBpcyBwb3NzaWJsZSAqLworCXN3aXRjaCAoaHdhY2NfZGV2KSB7CisJY2FzZSBIV19BQ0NfU1ZBTU1EU1A6CisJY2FzZSBIV19BQ0NfU0lBTU1EU1A6CisJY2FzZSBIV19BQ0NfRVNSQU0xOgorCWNhc2UgSFdfQUNDX0VTUkFNMjoKKwljYXNlIEhXX0FDQ19FU1JBTTM6CisJY2FzZSBIV19BQ0NfRVNSQU00OgorCQlyYW1fcmV0ZW50aW9uID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJLyogY2hlY2sgYXJndW1lbnQgKi8KKwlCVUdfT04oc3RhdGUgPiBIV19PTik7CisJQlVHX09OKHN0YXRlID09IEhXX09GRl9SQU1SRVQgJiYgIXJhbV9yZXRlbnRpb24pOworCisJLyogbW9kaWZ5IGVuYWJsZSBmbGFncyAqLworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEhXX09GRjoKKwkJZW5hYmxlX3JldCA9IGZhbHNlOworCQllbmFibGUgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBIV19PTjoKKwkJZW5hYmxlID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBIV19PRkZfUkFNUkVUOgorCQllbmFibGVfcmV0ID0gdHJ1ZTsKKwkJZW5hYmxlID0gZmFsc2U7CisJCWJyZWFrOworCX0KKworCS8qIGdldCByZWd1bGF0b3IgKGxhenkpICovCisJaWYgKGh3YWNjX3JlZ3VsYXRvcltod2FjY19kZXZdID09IE5VTEwpIHsKKwkJaHdhY2NfcmVndWxhdG9yW2h3YWNjX2Rldl0gPSByZWd1bGF0b3JfZ2V0KE5VTEwsCisJCQlod2FjY19yZWd1bGF0b3JfbmFtZVtod2FjY19kZXZdKTsKKwkJaWYgKElTX0VSUihod2FjY19yZWd1bGF0b3JbaHdhY2NfZGV2XSkpIHsKKwkJCXByX2VycigicHJjbXU6IGZhaWxlZCB0byBnZXQgc3VwcGx5ICVzXG4iLAorCQkJCWh3YWNjX3JlZ3VsYXRvcl9uYW1lW2h3YWNjX2Rldl0pOworCQkJciA9IFBUUl9FUlIoaHdhY2NfcmVndWxhdG9yW2h3YWNjX2Rldl0pOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAocmFtX3JldGVudGlvbikgeworCQlpZiAoaHdhY2NfcmV0X3JlZ3VsYXRvcltod2FjY19kZXZdID09IE5VTEwpIHsKKwkJCWh3YWNjX3JldF9yZWd1bGF0b3JbaHdhY2NfZGV2XSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwKKwkJCQlod2FjY19yZXRfcmVndWxhdG9yX25hbWVbaHdhY2NfZGV2XSk7CisJCQlpZiAoSVNfRVJSKGh3YWNjX3JldF9yZWd1bGF0b3JbaHdhY2NfZGV2XSkpIHsKKwkJCQlwcl9lcnIoInByY211OiBmYWlsZWQgdG8gZ2V0IHN1cHBseSAlc1xuIiwKKwkJCQkJaHdhY2NfcmV0X3JlZ3VsYXRvcl9uYW1lW2h3YWNjX2Rldl0pOworCQkJCXIgPSBQVFJfRVJSKGh3YWNjX3JldF9yZWd1bGF0b3JbaHdhY2NfZGV2XSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwkvKiBzZXQgcmVndWxhdG9ycyAqLworCWlmIChyYW1fcmV0ZW50aW9uKSB7CisJCWlmIChlbmFibGVfcmV0ICYmICFod2FjY19yZXRfZW5hYmxlZFtod2FjY19kZXZdKSB7CisJCQlyID0gcmVndWxhdG9yX2VuYWJsZShod2FjY19yZXRfcmVndWxhdG9yW2h3YWNjX2Rldl0pOworCQkJaWYgKHIgPCAwKSB7CisJCQkJcHJfZXJyKCJwcmNtdV9zZXRfaHdhY2M6IHJldCBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWh3YWNjX3JldF9lbmFibGVkW2h3YWNjX2Rldl0gPSB0cnVlOworCQl9CisJfQorCisJaWYgKGVuYWJsZSAmJiAhaHdhY2NfZW5hYmxlZFtod2FjY19kZXZdKSB7CisJCXIgPSByZWd1bGF0b3JfZW5hYmxlKGh3YWNjX3JlZ3VsYXRvcltod2FjY19kZXZdKTsKKwkJaWYgKHIgPCAwKSB7CisJCQlwcl9lcnIoInByY211X3NldF9od2FjYzogZW5hYmxlIGZhaWxlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlod2FjY19lbmFibGVkW2h3YWNjX2Rldl0gPSB0cnVlOworCX0KKworCWlmICghZW5hYmxlICYmIGh3YWNjX2VuYWJsZWRbaHdhY2NfZGV2XSkgeworCQlyID0gcmVndWxhdG9yX2Rpc2FibGUoaHdhY2NfcmVndWxhdG9yW2h3YWNjX2Rldl0pOworCQlpZiAociA8IDApIHsKKwkJCXByX2VycigicHJjbXVfc2V0X2h3YWNjOiBkaXNhYmxlIGZhaWxlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlod2FjY19lbmFibGVkW2h3YWNjX2Rldl0gPSBmYWxzZTsKKwl9CisKKwlpZiAocmFtX3JldGVudGlvbikgeworCQlpZiAoIWVuYWJsZV9yZXQgJiYgaHdhY2NfcmV0X2VuYWJsZWRbaHdhY2NfZGV2XSkgeworCQkJciA9IHJlZ3VsYXRvcl9kaXNhYmxlKGh3YWNjX3JldF9yZWd1bGF0b3JbaHdhY2NfZGV2XSk7CisJCQlpZiAociA8IDApIHsKKwkJCQlwcl9lcnIoInByY211X3NldF9od2FjYzogcmV0IGRpc2FibGUgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWh3YWNjX3JldF9lbmFibGVkW2h3YWNjX2Rldl0gPSBmYWxzZTsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTChwcmNtdV9zZXRfaHdhY2MpOworCisvKioKKyAqIGRiODUwMF9wcmNtdV9zZXRfZXBvZCAtIHNldCB0aGUgc3RhdGUgb2YgYSBFUE9EIChwb3dlciBkb21haW4pCiAgKiBAZXBvZF9pZDogVGhlIEVQT0QgdG8gc2V0CiAgKiBAZXBvZF9zdGF0ZTogVGhlIG5ldyBFUE9EIHN0YXRlCiAgKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdGF0ZSBvZiBhIEVQT0QgKHBvd2VyIGRvbWFpbikuIEl0IG1heSBub3QgYmUgY2FsbGVkCiAgKiBmcm9tIGludGVycnVwdCBjb250ZXh0LgogICovCi1pbnQgcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCitpbnQgZGI4NTAwX3ByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKQogewogCWludCByID0gMDsKIAlib29sIHJhbV9yZXRlbnRpb24gPSBmYWxzZTsKQEAgLTEwNDgsNyArMTI0MSw3IEBACiAJbXV0ZXhfbG9jaygmbWIyX3RyYW5zZmVyLmxvY2spOwogCiAJLyogd2FpdCBmb3IgbWFpbGJveCAqLwotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDIpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgyKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAkvKiBmaWxsIGluIG1haWxib3ggKi8KQEAgLTEwNTgsNyArMTI1MSw3IEBACiAKIAl3cml0ZWIoTUIySF9EUFMsICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjIpKTsKIAotCXdyaXRlbChNQk9YX0JJVCgyKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMiksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAogCS8qCiAJICogVGhlIGN1cnJlbnQgZmlybXdhcmUgdmVyc2lvbiBkb2VzIG5vdCBoYW5kbGUgZXJyb3JzIGNvcnJlY3RseSwKQEAgLTExNDUsMTMgKzEzMzgsMTMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYjNfdHJhbnNmZXIubG9jaywgZmxhZ3MpOwogCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMykpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDMpKQogCQljcHVfcmVsYXgoKTsKIAogCXdyaXRlYigoZW5hYmxlID8gT04gOiBPRkYpLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUIzX1NZU0NMS19NR1QpKTsKIAogCXdyaXRlYihNQjNIX1NZU0NMSywgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMykpOwotCXdyaXRlbChNQk9YX0JJVCgzKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMyksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1iM190cmFuc2Zlci5sb2NrLCBmbGFncyk7CiAKQEAgLTExNzcsNyArMTM3MCw3IEBACiAKIAlpZiAoIWVuYWJsZSkKIAkJdmFsIHw9IFBSQ01fVENSX1NUT1BfVElNRVJTOwotCXdyaXRlbCh2YWwsIChfUFJDTVVfQkFTRSArIFBSQ01fVENSKSk7CisJd3JpdGVsKHZhbCwgUFJDTV9UQ1IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTkwLDcgKzEzODMsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbGtfbWd0X2xvY2ssIGZsYWdzKTsKIAogCS8qIEdyYWIgdGhlIEhXIHNlbWFwaG9yZS4gKi8KLQl3aGlsZSAoKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9TRU0pICYgUFJDTV9TRU1fUFJDTV9TRU0pICE9IDApCisJd2hpbGUgKChyZWFkbChQUkNNX1NFTSkgJiBQUkNNX1NFTV9QUkNNX1NFTSkgIT0gMCkKIAkJY3B1X3JlbGF4KCk7CiAKIAl2YWwgPSByZWFkbChfUFJDTVVfQkFTRSArIGNsa19tZ3RbY2xvY2tdLm9mZnNldCk7CkBAIC0xMjAzLDM0ICsxMzk2LDYxIEBACiAJd3JpdGVsKHZhbCwgKF9QUkNNVV9CQVNFICsgY2xrX21ndFtjbG9ja10ub2Zmc2V0KSk7CiAKIAkvKiBSZWxlYXNlIHRoZSBIVyBzZW1hcGhvcmUuICovCi0Jd3JpdGVsKDAsIChfUFJDTVVfQkFTRSArIFBSQ01fU0VNKSk7CisJd3JpdGVsKDAsIFBSQ01fU0VNKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVxdWVzdF9zZ2FfY2xvY2sodTggY2xvY2ssIGJvb2wgZW5hYmxlKQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCWlmIChlbmFibGUpIHsKKwkJdmFsID0gcmVhZGwoUFJDTV9DR0FUSU5HX0JZUEFTUyk7CisJCXdyaXRlbCh2YWwgfCBQUkNNX0NHQVRJTkdfQllQQVNTX0lDTjIsIFBSQ01fQ0dBVElOR19CWVBBU1MpOworCX0KKworCXJldCA9IHJlcXVlc3RfcmVnX2Nsb2NrKGNsb2NrLCBlbmFibGUpOworCisJaWYgKCFyZXQgJiYgIWVuYWJsZSkgeworCQl2YWwgPSByZWFkbChQUkNNX0NHQVRJTkdfQllQQVNTKTsKKwkJd3JpdGVsKHZhbCAmIH5QUkNNX0NHQVRJTkdfQllQQVNTX0lDTjIsIFBSQ01fQ0dBVElOR19CWVBBU1MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qKgotICogcHJjbXVfcmVxdWVzdF9jbG9jaygpIC0gUmVxdWVzdCBmb3IgYSBjbG9jayB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgorICogZGI4NTAwX3ByY211X3JlcXVlc3RfY2xvY2soKSAtIFJlcXVlc3QgZm9yIGEgY2xvY2sgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KICAqIEBjbG9jazogICAgICBUaGUgY2xvY2sgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUuCiAgKiBAZW5hYmxlOiAgICAgV2hldGhlciB0aGUgY2xvY2sgc2hvdWxkIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuCiAgKgogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjbG9jayBpbXBsZW1lbnRhdGlvbi4KICAqIERvIG5vdCB1c2UgaXQgZnJvbSBhbnkgb3RoZXIgcGxhY2UhCiAgKi8KLWludCBwcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSkKK2ludCBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCiB7CisJc3dpdGNoKGNsb2NrKSB7CisJY2FzZSBQUkNNVV9TR0FDTEs6CisJCXJldHVybiByZXF1ZXN0X3NnYV9jbG9jayhjbG9jaywgZW5hYmxlKTsKKwljYXNlIFBSQ01VX1RJTUNMSzoKKwkJcmV0dXJuIHJlcXVlc3RfdGltY2xrKGVuYWJsZSk7CisJY2FzZSBQUkNNVV9TWVNDTEs6CisJCXJldHVybiByZXF1ZXN0X3N5c2NsayhlbmFibGUpOworCWNhc2UgUFJDTVVfUExMU09DMToKKwkJcmV0dXJuIHJlcXVlc3RfcGxsKGNsb2NrLCBlbmFibGUpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAlpZiAoY2xvY2sgPCBQUkNNVV9OVU1fUkVHX0NMT0NLUykKIAkJcmV0dXJuIHJlcXVlc3RfcmVnX2Nsb2NrKGNsb2NrLCBlbmFibGUpOwotCWVsc2UgaWYgKGNsb2NrID09IFBSQ01VX1RJTUNMSykKLQkJcmV0dXJuIHJlcXVlc3RfdGltY2xrKGVuYWJsZSk7Ci0JZWxzZSBpZiAoY2xvY2sgPT0gUFJDTVVfU1lTQ0xLKQotCQlyZXR1cm4gcmVxdWVzdF9zeXNjbGsoZW5hYmxlKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiAtRUlOVkFMOwogfQogCi1pbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKQoraW50IGRiODUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCiB7CiAJaWYgKChzdGF0ZSA+IEVTUkFNMF9ERUVQX1NMRUVQX1NUQVRFX1JFVCkgfHwKIAkgICAgKHN0YXRlIDwgRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfT0ZGKSkKQEAgLTEyMzgsNyArMTQ1OCw3IEBACiAKIAltdXRleF9sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CNEhfTUVNX1NULCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUI0KSk7CkBAIC0xMjQ4LDcgKzE0NjgsNyBAQAogCSAgICAgICAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0REUl9TVF9BUF9ERUVQX0lETEUpKTsKIAl3cml0ZWIoc3RhdGUsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfRVNSQU0wX1NUKSk7CiAKLQl3cml0ZWwoTUJPWF9CSVQoNCksIChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfU0VUKSk7CisJd3JpdGVsKE1CT1hfQklUKDQpLCBQUkNNX01CT1hfQ1BVX1NFVCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbWI0X3RyYW5zZmVyLndvcmspOwogCiAJbXV0ZXhfdW5sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CkBAIC0xMjYwLDEzICsxNDgwLDEzIEBACiB7CiAJbXV0ZXhfbG9jaygmbWI0X3RyYW5zZmVyLmxvY2spOwogCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDQpKQogCQljcHVfcmVsYXgoKTsKIAogCXdyaXRlYih0aHJlc2hvbGQsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjRfSE9URE9HX1RIUkVTSE9MRCkpOwogCXdyaXRlYihNQjRIX0hPVERPRywgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CNCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDQpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iNF90cmFuc2Zlci53b3JrKTsKIAogCW11dGV4X3VubG9jaygmbWI0X3RyYW5zZmVyLmxvY2spOwpAQCAtMTI3OCw3ICsxNDk4LDcgQEAKIHsKIAltdXRleF9sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKGxvdywgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNF9IT1RNT05fTE9XKSk7CkBAIC0xMjg3LDcgKzE1MDcsNyBAQAogCQkodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0hPVE1PTl9DT05GSUcpKTsKIAl3cml0ZWIoTUI0SF9IT1RNT04sICh0Y2RtX2Jhc2UgKyBQUkNNX01CT1hfSEVBREVSX1JFUV9NQjQpKTsKIAotCXdyaXRlbChNQk9YX0JJVCg0KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoNCksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjRfdHJhbnNmZXIud29yayk7CiAKIAltdXRleF91bmxvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKQEAgLTEyOTksMTMgKzE1MTksMTMgQEAKIHsKIAltdXRleF9sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg0KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGV3KHZhbCwgKHRjZG1fYmFzZSArIFBSQ01fUkVRX01CNF9IT1RfUEVSSU9EKSk7CiAJd3JpdGViKE1CNEhfSE9UX1BFUklPRCwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CNCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDQpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1iNF90cmFuc2Zlci53b3JrKTsKIAogCW11dGV4X3VubG9jaygmbWI0X3RyYW5zZmVyLmxvY2spOwpAQCAtMTMyNiw2ICsxNTQ2LDc4IEBACiAJcmV0dXJuIGNvbmZpZ19ob3RfcGVyaW9kKDB4RkZGRik7CiB9CiAKK3N0YXRpYyBpbnQgcHJjbXVfYTl3ZG9nKHU4IGNtZCwgdTggZDAsIHU4IGQxLCB1OCBkMiwgdTggZDMpCit7CisKKwltdXRleF9sb2NrKCZtYjRfdHJhbnNmZXIubG9jayk7CisKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNCkpCisJCWNwdV9yZWxheCgpOworCisJd3JpdGViKGQwLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0E5V0RPR18wKSk7CisJd3JpdGViKGQxLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0E5V0RPR18xKSk7CisJd3JpdGViKGQyLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0E5V0RPR18yKSk7CisJd3JpdGViKGQzLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI0X0E5V0RPR18zKSk7CisKKwl3cml0ZWIoY21kLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUI0KSk7CisKKwl3cml0ZWwoTUJPWF9CSVQoNCksIFBSQ01fTUJPWF9DUFVfU0VUKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjRfdHJhbnNmZXIud29yayk7CisKKwltdXRleF91bmxvY2soJm1iNF90cmFuc2Zlci5sb2NrKTsKKworCXJldHVybiAwOworCit9CisKK2ludCBwcmNtdV9jb25maWdfYTl3ZG9nKHU4IG51bSwgYm9vbCBzbGVlcF9hdXRvX29mZikKK3sKKwlCVUdfT04obnVtID09IDAgfHwgbnVtID4gMHhmKTsKKwlyZXR1cm4gcHJjbXVfYTl3ZG9nKE1CNEhfQTlXRE9HX0NPTkYsIG51bSwgMCwgMCwKKwkJCSAgICBzbGVlcF9hdXRvX29mZiA/IEE5V0RPR19BVVRPX09GRl9FTiA6CisJCQkgICAgQTlXRE9HX0FVVE9fT0ZGX0RJUyk7Cit9CisKK2ludCBwcmNtdV9lbmFibGVfYTl3ZG9nKHU4IGlkKQoreworCXJldHVybiBwcmNtdV9hOXdkb2coTUI0SF9BOVdET0dfRU4sIGlkLCAwLCAwLCAwKTsKK30KKworaW50IHByY211X2Rpc2FibGVfYTl3ZG9nKHU4IGlkKQoreworCXJldHVybiBwcmNtdV9hOXdkb2coTUI0SF9BOVdET0dfRElTLCBpZCwgMCwgMCwgMCk7Cit9CisKK2ludCBwcmNtdV9raWNrX2E5d2RvZyh1OCBpZCkKK3sKKwlyZXR1cm4gcHJjbXVfYTl3ZG9nKE1CNEhfQTlXRE9HX0tJQ0ssIGlkLCAwLCAwLCAwKTsKK30KKworLyoKKyAqIHRpbWVvdXQgaXMgMjggYml0LCBpbiBtcy4KKyAqLworI2RlZmluZSBNQVhfV0FUQ0hET0dfVElNRU9VVCAxMzEwMDAKK2ludCBwcmNtdV9sb2FkX2E5d2RvZyh1OCBpZCwgdTMyIHRpbWVvdXQpCit7CisJaWYgKHRpbWVvdXQgPiBNQVhfV0FUQ0hET0dfVElNRU9VVCkKKwkJLyoKKwkJICogRHVlIHRvIGNhbGN1bGF0aW9uIGJ1ZyBpbiBwcmNtdSBmdywgdGltZW91dHMKKwkJICogY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gMTMxIHNlY29uZHMuCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBwcmNtdV9hOXdkb2coTUI0SF9BOVdET0dfTE9BRCwKKwkJCSAgICAoaWQgJiBBOVdET0dfSURfTUFTSykgfAorCQkJICAgIC8qCisJCQkgICAgICogUHV0IHRoZSBsb3dlc3QgMjggYml0cyBvZiB0aW1lb3V0IGF0CisJCQkgICAgICogb2Zmc2V0IDQuIEZvdXIgZmlyc3QgYml0cyBhcmUgdXNlZCBmb3IgaWQuCisJCQkgICAgICovCisJCQkgICAgKHU4KSgodGltZW91dCA8PCA0KSAmIDB4ZjApLAorCQkJICAgICh1OCkoKHRpbWVvdXQgPj4gNCkgJiAweGZmKSwKKwkJCSAgICAodTgpKCh0aW1lb3V0ID4+IDEyKSAmIDB4ZmYpLAorCQkJICAgICh1OCkoKHRpbWVvdXQgPj4gMjApICYgMHhmZikpOworfQorCiAvKioKICAqIHByY211X3NldF9jbG9ja19kaXZpZGVyKCkgLSBDb25maWd1cmUgdGhlIGNsb2NrIGRpdmlkZXIuCiAgKiBAY2xvY2s6CVRoZSBjbG9jayBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZS4KQEAgLTEzNDUsNyArMTYzNyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCiAJLyogR3JhYiB0aGUgSFcgc2VtYXBob3JlLiAqLwotCXdoaWxlICgocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX1NFTSkgJiBQUkNNX1NFTV9QUkNNX1NFTSkgIT0gMCkKKwl3aGlsZSAoKHJlYWRsKFBSQ01fU0VNKSAmIFBSQ01fU0VNX1BSQ01fU0VNKSAhPSAwKQogCQljcHVfcmVsYXgoKTsKIAogCXZhbCA9IHJlYWRsKF9QUkNNVV9CQVNFICsgY2xrX21ndFtjbG9ja10ub2Zmc2V0KTsKQEAgLTEzNTQsNyArMTY0Niw3IEBACiAJd3JpdGVsKHZhbCwgKF9QUkNNVV9CQVNFICsgY2xrX21ndFtjbG9ja10ub2Zmc2V0KSk7CiAKIAkvKiBSZWxlYXNlIHRoZSBIVyBzZW1hcGhvcmUuICovCi0Jd3JpdGVsKDAsIChfUFJDTVVfQkFTRSArIFBSQ01fU0VNKSk7CisJd3JpdGVsKDAsIFBSQ01fU0VNKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsa19tZ3RfbG9jaywgZmxhZ3MpOwogCkBAIC0xMzgwLDcgKzE2NzIsNyBAQAogCiAJbXV0ZXhfbG9jaygmbWI1X3RyYW5zZmVyLmxvY2spOwogCi0Jd2hpbGUgKHJlYWRsKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNSkpCisJd2hpbGUgKHJlYWRsKFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDUpKQogCQljcHVfcmVsYXgoKTsKIAogCXdyaXRlYihQUkNNVV9JMkNfUkVBRChzbGF2ZSksICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1NMQVZFX09QKSk7CkBAIC0xMzg4LDcgKzE2ODAsNyBAQAogCXdyaXRlYihyZWcsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1JFRykpOwogCXdyaXRlYigwLCAodGNkbV9iYXNlICsgUFJDTV9SRVFfTUI1X0kyQ19WQUwpKTsKIAotCXdyaXRlbChNQk9YX0JJVCg1KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoNSksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYjVfdHJhbnNmZXIud29yaywKIAkJCQltc2Vjc190b19qaWZmaWVzKDIwMDAwKSkpIHsKQEAgLTE0MjYsNyArMTcxOCw3IEBACiAKIAltdXRleF9sb2NrKCZtYjVfdHJhbnNmZXIubG9jayk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCg1KSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoNSkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKFBSQ01VX0kyQ19XUklURShzbGF2ZSksICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1NMQVZFX09QKSk7CkBAIC0xNDM0LDcgKzE3MjYsNyBAQAogCXdyaXRlYihyZWcsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1JFRykpOwogCXdyaXRlYigqdmFsdWUsICh0Y2RtX2Jhc2UgKyBQUkNNX1JFUV9NQjVfSTJDX1ZBTCkpOwogCi0Jd3JpdGVsKE1CT1hfQklUKDUpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCg1KSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iNV90cmFuc2Zlci53b3JrLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMDApKSkgewpAQCAtMTQ1NiwyMSArMTc0OCw0NCBAQAogdm9pZCBwcmNtdV9hY193YWtlX3JlcSh2b2lkKQogewogCXUzMiB2YWw7CisJdTMyIHN0YXR1czsKIAogCW11dGV4X2xvY2soJm1iMF90cmFuc2Zlci5hY193YWtlX2xvY2spOwogCi0JdmFsID0gcmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX0hPU1RBQ0NFU1NfUkVRKTsKKwl2YWwgPSByZWFkbChQUkNNX0hPU1RBQ0NFU1NfUkVRKTsKIAlpZiAodmFsICYgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSkKIAkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKIAogCWF0b21pY19zZXQoJmFjX3dha2VfcmVxX3N0YXRlLCAxKTsKIAotCXdyaXRlbCgodmFsIHwgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSksCi0JCShfUFJDTVVfQkFTRSArIFBSQ01fSE9TVEFDQ0VTU19SRVEpKTsKK3JldHJ5OgorCXdyaXRlbCgodmFsIHwgUFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSksIFBSQ01fSE9TVEFDQ0VTU19SRVEpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iMF90cmFuc2Zlci5hY193YWtlX3dvcmssCi0JCQltc2Vjc190b19qaWZmaWVzKDIwMDAwKSkpIHsKLQkJcHJfZXJyKCJwcmNtdTogJXMgdGltZWQgb3V0ICgyMCBzKSB3YWl0aW5nIGZvciBhIHJlcGx5LlxuIiwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpKSB7CisJCXByX2NyaXQoInByY211OiAlcyB0aW1lZCBvdXQgKDUgcykgd2FpdGluZyBmb3IgYSByZXBseS5cbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJfQorCisJLyoKKwkgKiBUaGUgbW9kZW0gY2FuIGdlbmVyYXRlIGFuIEFDX1dBS0VfQUNLLCBhbmQgdGhlbiBzdGlsbCBnbyB0byBzbGVlcC4KKwkgKiBBcyBhIHdvcmthcm91bmQsIHdlIHdhaXQsIGFuZCB0aGVuIGNoZWNrIHRoYXQgdGhlIG1vZGVtIGlzIGluZGVlZAorCSAqIGF3YWtlIChpbiB0ZXJtcyBvZiB0aGUgdmFsdWUgb2YgdGhlIFBSQ01fTU9EX0FXQUtFX1NUQVRVUworCSAqIHJlZ2lzdGVyLCB3aGljaCBtYXkgbm90IGJlIHRoZSB3aG9sZSB0cnV0aCkuCisJICovCisJdWRlbGF5KDQwMCk7CisJc3RhdHVzID0gKHJlYWRsKFBSQ01fTU9EX0FXQUtFX1NUQVRVUykgJiBCSVRTKDAsIDIpKTsKKwlpZiAoc3RhdHVzICE9IChQUkNNX01PRF9BV0FLRV9TVEFUVVNfUFJDTV9NT0RfQUFQRF9BV0FLRSB8CisJCQlQUkNNX01PRF9BV0FLRV9TVEFUVVNfUFJDTV9NT0RfQ09SRVBEX0FXQUtFKSkgeworCQlwcl9lcnIoInByY211OiAlcyByZWNlaXZlZCBhY2ssIGJ1dCBtb2RlbSBub3QgYXdha2UgKDB4JVgpLlxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCQl1ZGVsYXkoMTIwMCk7CisJCXdyaXRlbCh2YWwsIFBSQ01fSE9TVEFDQ0VTU19SRVEpOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYjBfdHJhbnNmZXIuYWNfd2FrZV93b3JrLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpKQorCQkJZ290byByZXRyeTsKKwkJcHJfY3JpdCgicHJjbXU6ICVzIHRpbWVkIG91dCAoNSBzKSB3YWl0aW5nIGZvciBBQ19TTEVFUF9BQ0suXG4iLAogCQkJX19mdW5jX18pOwogCX0KIApAQCAtMTQ4NywxNiArMTgwMiwxNiBAQAogCiAJbXV0ZXhfbG9jaygmbWIwX3RyYW5zZmVyLmFjX3dha2VfbG9jayk7CiAKLQl2YWwgPSByZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fSE9TVEFDQ0VTU19SRVEpOworCXZhbCA9IHJlYWRsKFBSQ01fSE9TVEFDQ0VTU19SRVEpOwogCWlmICghKHZhbCAmIFBSQ01fSE9TVEFDQ0VTU19SRVFfSE9TVEFDQ0VTU19SRVEpKQogCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCiAJd3JpdGVsKCh2YWwgJiB+UFJDTV9IT1NUQUNDRVNTX1JFUV9IT1NUQUNDRVNTX1JFUSksCi0JCShfUFJDTVVfQkFTRSArIFBSQ01fSE9TVEFDQ0VTU19SRVEpKTsKKwkJUFJDTV9IT1NUQUNDRVNTX1JFUSk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbWIwX3RyYW5zZmVyLmFjX3dha2Vfd29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMDApKSkgewotCQlwcl9lcnIoInByY211OiAlcyB0aW1lZCBvdXQgKDIwIHMpIHdhaXRpbmcgZm9yIGEgcmVwbHkuXG4iLAorCQkJbXNlY3NfdG9famlmZmllcyg1MDAwKSkpIHsKKwkJcHJfY3JpdCgicHJjbXU6ICVzIHRpbWVkIG91dCAoNSBzKSB3YWl0aW5nIGZvciBhIHJlcGx5LlxuIiwKIAkJCV9fZnVuY19fKTsKIAl9CiAKQEAgLTE1MDYsMjEgKzE4MjEsMzIgQEAKIAltdXRleF91bmxvY2soJm1iMF90cmFuc2Zlci5hY193YWtlX2xvY2spOwogfQogCi1ib29sIHByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCitib29sIGRiODUwMF9wcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKQogewogCXJldHVybiAoYXRvbWljX3JlYWQoJmFjX3dha2VfcmVxX3N0YXRlKSAhPSAwKTsKIH0KIAogLyoqCi0gKiBwcmNtdV9zeXN0ZW1fcmVzZXQgLSBTeXN0ZW0gcmVzZXQKKyAqIGRiODUwMF9wcmNtdV9zeXN0ZW1fcmVzZXQgLSBTeXN0ZW0gcmVzZXQKICAqCi0gKiBTYXZlcyB0aGUgcmVzZXQgcmVhc29uIGNvZGUgYW5kIHRoZW4gc2V0cyB0aGUgQVBFX1NPRlJTVCByZWdpc3RlciB3aGljaAorICogU2F2ZXMgdGhlIHJlc2V0IHJlYXNvbiBjb2RlIGFuZCB0aGVuIHNldHMgdGhlIEFQRV9TT0ZUUlNUIHJlZ2lzdGVyIHdoaWNoCiAgKiBmaXJlcyBpbnRlcnJ1cHQgdG8gZncKICAqLwotdm9pZCBwcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpCit2b2lkIGRiODUwMF9wcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpCiB7CiAJd3JpdGV3KHJlc2V0X2NvZGUsICh0Y2RtX2Jhc2UgKyBQUkNNX1NXX1JTVF9SRUFTT04pKTsKLQl3cml0ZWwoMSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUEVfU09GVFJTVCkpOworCXdyaXRlbCgxLCBQUkNNX0FQRV9TT0ZUUlNUKTsKK30KKworLyoqCisgKiBkYjg1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUgLSBSZXRyaWV2ZSBTVyByZXNldCByZWFzb24gY29kZQorICoKKyAqIFJldHJpZXZlcyB0aGUgcmVzZXQgcmVhc29uIGNvZGUgc3RvcmVkIGJ5IHByY211X3N5c3RlbV9yZXNldCgpIGJlZm9yZQorICogbGFzdCByZXN0YXJ0LgorICovCit1MTYgZGI4NTAwX3ByY211X2dldF9yZXNldF9jb2RlKHZvaWQpCit7CisJcmV0dXJuIHJlYWR3KHRjZG1fYmFzZSArIFBSQ01fU1dfUlNUX1JFQVNPTik7CiB9CiAKIC8qKgpAQCAtMTUzMCwxMSArMTg1NiwxMSBAQAogewogCW11dGV4X2xvY2soJm1iMV90cmFuc2Zlci5sb2NrKTsKIAotCXdoaWxlIChyZWFkbChfUFJDTVVfQkFTRSArIFBSQ01fTUJPWF9DUFVfVkFMKSAmIE1CT1hfQklUKDEpKQorCXdoaWxlIChyZWFkbChQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgxKSkKIAkJY3B1X3JlbGF4KCk7CiAKIAl3cml0ZWIoTUIxSF9SRVNFVF9NT0RFTSwgKHRjZG1fYmFzZSArIFBSQ01fTUJPWF9IRUFERVJfUkVRX01CMSkpOwotCXdyaXRlbChNQk9YX0JJVCgxKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9NQk9YX0NQVV9TRVQpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMSksIFBSQ01fTUJPWF9DUFVfU0VUKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtYjFfdHJhbnNmZXIud29yayk7CiAKIAkvKgpAQCAtMTU1MSwxMSArMTg3NywxMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1iMF90cmFuc2Zlci5sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1ZBTCkgJiBNQk9YX0JJVCgwKSkKKwl3aGlsZSAocmVhZGwoUFJDTV9NQk9YX0NQVV9WQUwpICYgTUJPWF9CSVQoMCkpCiAJCWNwdV9yZWxheCgpOwogCiAJd3JpdGViKE1CMEhfUkVBRF9XQUtFVVBfQUNLLCAodGNkbV9iYXNlICsgUFJDTV9NQk9YX0hFQURFUl9SRVFfTUIwKSk7Ci0Jd3JpdGVsKE1CT1hfQklUKDApLCAoX1BSQ01VX0JBU0UgKyBQUkNNX01CT1hfQ1BVX1NFVCkpOworCXdyaXRlbChNQk9YX0JJVCgwKSwgUFJDTV9NQk9YX0NQVV9TRVQpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWIwX3RyYW5zZmVyLmxvY2ssIGZsYWdzKTsKIH0KQEAgLTE2MDAsNyArMTkyNiw3IEBACiAJCXIgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQotCXdyaXRlbChNQk9YX0JJVCgwKSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCgwKSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTE2MTMsNyArMTkzOSw3IEBACiAJCVBSQ01fQUNLX01CMV9DVVJSRU5UX0FQRV9PUFApOwogCW1iMV90cmFuc2Zlci5hY2suYXBlX3ZvbHRhZ2Vfc3RhdHVzID0gcmVhZGIodGNkbV9iYXNlICsKIAkJUFJDTV9BQ0tfTUIxX0FQRV9WT0xUQUdFX1NUQVRVUyk7Ci0Jd3JpdGVsKE1CT1hfQklUKDEpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDEpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAljb21wbGV0ZSgmbWIxX3RyYW5zZmVyLndvcmspOwogCXJldHVybiBmYWxzZTsKIH0KQEAgLTE2MjEsMTQgKzE5NDcsMTQgQEAKIHN0YXRpYyBib29sIHJlYWRfbWFpbGJveF8yKHZvaWQpCiB7CiAJbWIyX3RyYW5zZmVyLmFjay5zdGF0dXMgPSByZWFkYih0Y2RtX2Jhc2UgKyBQUkNNX0FDS19NQjJfRFBTX1NUQVRVUyk7Ci0Jd3JpdGVsKE1CT1hfQklUKDIpLCAoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfQ0xSKSk7CisJd3JpdGVsKE1CT1hfQklUKDIpLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAljb21wbGV0ZSgmbWIyX3RyYW5zZmVyLndvcmspOwogCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9tYWlsYm94XzModm9pZCkKIHsKLQl3cml0ZWwoTUJPWF9CSVQoMyksIChfUFJDTVVfQkFTRSArIFBSQ01fQVJNX0lUMV9DTFIpKTsKKwl3cml0ZWwoTUJPWF9CSVQoMyksIFBSQ01fQVJNX0lUMV9DTFIpOwogCXJldHVybiBmYWxzZTsKIH0KIApAQCAtMTY0Myw2ICsxOTY5LDExIEBACiAJY2FzZSBNQjRIX0hPVERPRzoKIAljYXNlIE1CNEhfSE9UTU9OOgogCWNhc2UgTUI0SF9IT1RfUEVSSU9EOgorCWNhc2UgTUI0SF9BOVdET0dfQ09ORjoKKwljYXNlIE1CNEhfQTlXRE9HX0VOOgorCWNhc2UgTUI0SF9BOVdET0dfRElTOgorCWNhc2UgTUI0SF9BOVdET0dfTE9BRDoKKwljYXNlIE1CNEhfQTlXRE9HX0tJQ0s6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50X3Vua25vd25faGVhZGVyX3dhcm5pbmcoNCwgaGVhZGVyKTsKQEAgLTE2NTAsNyArMTk4MSw3IEBACiAJCWJyZWFrOwogCX0KIAotCXdyaXRlbChNQk9YX0JJVCg0KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCg0KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAKIAlpZiAoZG9fY29tcGxldGUpCiAJCWNvbXBsZXRlKCZtYjRfdHJhbnNmZXIud29yayk7CkBAIC0xNjYyLDIwICsxOTkzLDIwIEBACiB7CiAJbWI1X3RyYW5zZmVyLmFjay5zdGF0dXMgPSByZWFkYih0Y2RtX2Jhc2UgKyBQUkNNX0FDS19NQjVfSTJDX1NUQVRVUyk7CiAJbWI1X3RyYW5zZmVyLmFjay52YWx1ZSA9IHJlYWRiKHRjZG1fYmFzZSArIFBSQ01fQUNLX01CNV9JMkNfVkFMKTsKLQl3cml0ZWwoTUJPWF9CSVQoNSksIChfUFJDTVVfQkFTRSArIFBSQ01fQVJNX0lUMV9DTFIpKTsKKwl3cml0ZWwoTUJPWF9CSVQoNSksIFBSQ01fQVJNX0lUMV9DTFIpOwogCWNvbXBsZXRlKCZtYjVfdHJhbnNmZXIud29yayk7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfNih2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCg2KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCg2KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCByZWFkX21haWxib3hfNyh2b2lkKQogewotCXdyaXRlbChNQk9YX0JJVCg3KSwgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChNQk9YX0JJVCg3KSwgUFJDTV9BUk1fSVQxX0NMUik7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNjk2LDcgKzIwMjcsNyBAQAogCXU4IG47CiAJaXJxcmV0dXJuX3QgcjsKIAotCWJpdHMgPSAocmVhZGwoX1BSQ01VX0JBU0UgKyBQUkNNX0FSTV9JVDFfVkFMKSAmIEFMTF9NQk9YX0JJVFMpOworCWJpdHMgPSAocmVhZGwoUFJDTV9BUk1fSVQxX1ZBTCkgJiBBTExfTUJPWF9CSVRTKTsKIAlpZiAodW5saWtlbHkoIWJpdHMpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKQEAgLTE3NjgsNyArMjA5OSw3IEBACiAJLmlycV91bm1hc2sJPSBwcmNtdV9pcnFfdW5tYXNrLAogfTsKIAotdm9pZCBfX2luaXQgcHJjbXVfZWFybHlfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgZGI4NTAwX3ByY211X2Vhcmx5X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMTgyNiw2ICsyMTU3LDE2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgZGI4NTAwX3ByY211X2luaXRfY2xrZm9yY2Uodm9pZCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwoUFJDTV9BOVBMX0ZPUkNFX0NMS0VOKTsKKwl2YWwgJj0gfihQUkNNX0E5UExfRk9SQ0VfQ0xLRU5fUFJDTV9BOVBMX0ZPUkNFX0NMS0VOIHwKKwkJUFJDTV9BOVBMX0ZPUkNFX0NMS0VOX1BSQ01fQTlBWElfRk9SQ0VfQ0xLRU4pOworCXdyaXRlbCh2YWwsIChQUkNNX0E5UExfRk9SQ0VfQ0xLRU4pKTsKK30KKwogLyoKICAqIFBvd2VyIGRvbWFpbiBzd2l0Y2hlcyAoZVBPRHMpIG1vZGVsZWQgYXMgcmVndWxhdG9ycyBmb3IgdGhlIERCODUwMCBTb0MKICAqLwpAQCAtMTg2MSw3ICsyMjAyLDQyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfYjJyMl9tY2RlX2NvbnN1bWVyc1tdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZzdXBwbHkiLCAiYjJyMi4wIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidnN1cHBseSIsICJtY2RlLjAiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2c3VwcGx5IiwgIm1jZGUiKSwKK307CisKKy8qIFNWQSBNTURTUCByZWd1bGF0b3Igc3dpdGNoICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGI4NTAwX3N2YW1tZHNwX2NvbnN1bWVyc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInN2YS1tbWRzcCIsICJjbV9jb250cm9sIiksCit9OworCisvKiBTVkEgcGlwZSByZWd1bGF0b3Igc3dpdGNoICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGI4NTAwX3N2YXBpcGVfY29uc3VtZXJzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgic3ZhLXBpcGUiLCAiY21fY29udHJvbCIpLAorfTsKKworLyogU0lBIE1NRFNQIHJlZ3VsYXRvciBzd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfc2lhbW1kc3BfY29uc3VtZXJzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgic2lhLW1tZHNwIiwgImNtX2NvbnRyb2wiKSwKK307CisKKy8qIFNJQSBwaXBlIHJlZ3VsYXRvciBzd2l0Y2ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkYjg1MDBfc2lhcGlwZV9jb25zdW1lcnNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJzaWEtcGlwZSIsICJjbV9jb250cm9sIiksCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGI4NTAwX3NnYV9jb25zdW1lcnNbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2LW1hbGkiLCBOVUxMKSwKK307CisKKy8qIEVTUkFNMSBhbmQgMiByZWd1bGF0b3Igc3dpdGNoICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGI4NTAwX2VzcmFtMTJfY29uc3VtZXJzW10gPSB7CisJUkVHVUxBVE9SX1NVUFBMWSgiZXNyYW0xMiIsICJjbV9jb250cm9sIiksCit9OworCisvKiBFU1JBTTMgYW5kIDQgcmVndWxhdG9yIHN3aXRjaCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRiODUwMF9lc3JhbTM0X2NvbnN1bWVyc1tdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInYtZXNyYW0zNCIsICJtY2RlIiksCisJUkVHVUxBVE9SX1NVUFBMWSgiZXNyYW0zNCIsICJjbV9jb250cm9sIiksCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgZGI4NTAwX3JlZ3VsYXRvcnNbREI4NTAwX05VTV9SRUdVTEFUT1JTXSA9IHsKQEAgLTE5MjMsNiArMjI5OSw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtc3ZhLW1tZHNwIiwKIAkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCQl9LAorCQkuY29uc3VtZXJfc3VwcGxpZXMgPSBkYjg1MDBfc3ZhbW1kc3BfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfc3ZhbW1kc3BfY29uc3VtZXJzKSwKIAl9LAogCVtEQjg1MDBfUkVHVUxBVE9SX1NXSVRDSF9TVkFNTURTUFJFVF0gPSB7CiAJCS5jb25zdHJhaW50cyA9IHsKQEAgLTE5MzcsNiArMjMxNSw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtc3ZhLXBpcGUiLAogCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJCX0sCisJCS5jb25zdW1lcl9zdXBwbGllcyA9IGRiODUwMF9zdmFwaXBlX2NvbnN1bWVycywKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZGI4NTAwX3N2YXBpcGVfY29uc3VtZXJzKSwKIAl9LAogCVtEQjg1MDBfUkVHVUxBVE9SX1NXSVRDSF9TSUFNTURTUF0gPSB7CiAJCS5zdXBwbHlfcmVndWxhdG9yID0gImRiODUwMC12YXBlIiwKQEAgLTE5NDQsNiArMjMyNCw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtc2lhLW1tZHNwIiwKIAkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCQl9LAorCQkuY29uc3VtZXJfc3VwcGxpZXMgPSBkYjg1MDBfc2lhbW1kc3BfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfc2lhbW1kc3BfY29uc3VtZXJzKSwKIAl9LAogCVtEQjg1MDBfUkVHVUxBVE9SX1NXSVRDSF9TSUFNTURTUFJFVF0gPSB7CiAJCS5jb25zdHJhaW50cyA9IHsKQEAgLTE5NTcsNiArMjMzOSw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtc2lhLXBpcGUiLAogCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJCX0sCisJCS5jb25zdW1lcl9zdXBwbGllcyA9IGRiODUwMF9zaWFwaXBlX2NvbnN1bWVycywKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZGI4NTAwX3NpYXBpcGVfY29uc3VtZXJzKSwKIAl9LAogCVtEQjg1MDBfUkVHVUxBVE9SX1NXSVRDSF9TR0FdID0gewogCQkuc3VwcGx5X3JlZ3VsYXRvciA9ICJkYjg1MDAtdmFwZSIsCkBAIC0xOTY0LDYgKzIzNDgsOSBAQAogCQkJLm5hbWUgPSAiZGI4NTAwLXNnYSIsCiAJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAkJfSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gZGI4NTAwX3NnYV9jb25zdW1lcnMsCisJCS5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBBUlJBWV9TSVpFKGRiODUwMF9zZ2FfY29uc3VtZXJzKSwKKwogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX0IyUjJfTUNERV0gPSB7CiAJCS5zdXBwbHlfcmVndWxhdG9yID0gImRiODUwMC12YXBlIiwKQEAgLTE5ODAsNiArMjM2Nyw4IEBACiAJCQkubmFtZSA9ICJkYjg1MDAtZXNyYW0xMiIsCiAJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAkJfSwKKwkJLmNvbnN1bWVyX3N1cHBsaWVzID0gZGI4NTAwX2VzcmFtMTJfY29uc3VtZXJzLAorCQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gQVJSQVlfU0laRShkYjg1MDBfZXNyYW0xMl9jb25zdW1lcnMpLAogCX0sCiAJW0RCODUwMF9SRUdVTEFUT1JfU1dJVENIX0VTUkFNMTJSRVRdID0gewogCQkuY29uc3RyYWludHMgPSB7CkBAIC0xOTkzLDYgKzIzODIsOCBAQAogCQkJLm5hbWUgPSAiZGI4NTAwLWVzcmFtMzQiLAogCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCiAJCX0sCisJCS5jb25zdW1lcl9zdXBwbGllcyA9IGRiODUwMF9lc3JhbTM0X2NvbnN1bWVycywKKwkJLm51bV9jb25zdW1lcl9zdXBwbGllcyA9IEFSUkFZX1NJWkUoZGI4NTAwX2VzcmFtMzRfY29uc3VtZXJzKSwKIAl9LAogCVtEQjg1MDBfUkVHVUxBVE9SX1NXSVRDSF9FU1JBTTM0UkVUXSA9IHsKIAkJLmNvbnN0cmFpbnRzID0gewpAQCAtMjAyNCw4ICsyNDE1LDEwIEBACiAJaWYgKHV4NTAwX2lzX3N2cCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWRiODUwMF9wcmNtdV9pbml0X2Nsa2ZvcmNlKCk7CisKIAkvKiBDbGVhbiB1cCB0aGUgbWFpbGJveCBpbnRlcnJ1cHRzIGFmdGVyIHByZS1rZXJuZWwgY29kZS4gKi8KLQl3cml0ZWwoQUxMX01CT1hfQklUUywgKF9QUkNNVV9CQVNFICsgUFJDTV9BUk1fSVQxX0NMUikpOworCXdyaXRlbChBTExfTUJPWF9CSVRTLCBQUkNNX0FSTV9JVDFfQ0xSKTsKIAogCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKElSUV9EQjg1MDBfUFJDTVUxLCBwcmNtdV9pcnFfaGFuZGxlciwKIAkJcHJjbXVfaXJxX3RocmVhZF9mbiwgSVJRRl9OT19TVVNQRU5ELCAicHJjbXUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RieDUwMC1wcmNtdS1yZWdzLmggYi9kcml2ZXJzL21mZC9kYng1MDAtcHJjbXUtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMjJlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9kYng1MDAtcHJjbXUtcmVncy5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVE1pY3JvZWxlY3Ryb25pY3MgMjAwOQorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBLdW1hciBTYW5naHZpIDxrdW1hci5zYW5naHZpQHN0ZXJpY3Nzb24uY29tPgorICogQXV0aG9yOiBTdW5kYXIgSXllciA8c3VuZGFyLml5ZXJAc3Rlcmljc3Nvbi5jb20+CisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqCisgKiBQUkNNIFVuaXQgcmVnaXN0ZXJzCisgKi8KKworI2lmbmRlZiBfX0RCODUwMF9QUkNNVV9SRUdTX0gKKyNkZWZpbmUgX19EQjg1MDBfUFJDTVVfUkVHU19ICisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgQklUUyhfc3RhcnQsIF9lbmQpICgoQklUKF9lbmQpIC0gQklUKF9zdGFydCkpICsgQklUKF9lbmQpKQorCisjZGVmaW5lIFBSQ01fU1ZBQ0xLX01HVF9PRkYJCTB4MDA4CisjZGVmaW5lIFBSQ01fU0lBQ0xLX01HVF9PRkYJCTB4MDBDCisjZGVmaW5lIFBSQ01fU0dBQ0xLX01HVF9PRkYJCTB4MDE0CisjZGVmaW5lIFBSQ01fVUFSVENMS19NR1RfT0ZGCQkweDAxOAorI2RlZmluZSBQUkNNX01TUDAyQ0xLX01HVF9PRkYJCTB4MDFDCisjZGVmaW5lIFBSQ01fSTJDQ0xLX01HVF9PRkYJCTB4MDIwCisjZGVmaW5lIFBSQ01fU0RNTUNDTEtfTUdUX09GRgkJMHgwMjQKKyNkZWZpbmUgUFJDTV9TTElNQ0xLX01HVF9PRkYJCTB4MDI4CisjZGVmaW5lIFBSQ01fUEVSMUNMS19NR1RfT0ZGCQkweDAyQworI2RlZmluZSBQUkNNX1BFUjJDTEtfTUdUX09GRgkJMHgwMzAKKyNkZWZpbmUgUFJDTV9QRVIzQ0xLX01HVF9PRkYJCTB4MDM0CisjZGVmaW5lIFBSQ01fUEVSNUNMS19NR1RfT0ZGCQkweDAzOAorI2RlZmluZSBQUkNNX1BFUjZDTEtfTUdUX09GRgkJMHgwM0MKKyNkZWZpbmUgUFJDTV9QRVI3Q0xLX01HVF9PRkYJCTB4MDQwCisjZGVmaW5lIFBSQ01fUFdNQ0xLX01HVF9PRkYJCTB4MDQ0IC8qIGZvciBEQjU1MDAgKi8KKyNkZWZpbmUgUFJDTV9JUkRBQ0xLX01HVF9PRkYJCTB4MDQ4IC8qIGZvciBEQjU1MDAgKi8KKyNkZWZpbmUgUFJDTV9JUlJDQ0xLX01HVF9PRkYJCTB4MDRDIC8qIGZvciBEQjU1MDAgKi8KKyNkZWZpbmUgUFJDTV9MQ0RDTEtfTUdUX09GRgkJMHgwNDQKKyNkZWZpbmUgUFJDTV9CTUxDTEtfTUdUX09GRgkJMHgwNEMKKyNkZWZpbmUgUFJDTV9IU0lUWENMS19NR1RfT0ZGCQkweDA1MAorI2RlZmluZSBQUkNNX0hTSVJYQ0xLX01HVF9PRkYJCTB4MDU0CisjZGVmaW5lIFBSQ01fSERNSUNMS19NR1RfT0ZGCQkweDA1OAorI2RlZmluZSBQUkNNX0FQRUFUQ0xLX01HVF9PRkYJCTB4MDVDCisjZGVmaW5lIFBSQ01fQVBFVFJBQ0VDTEtfTUdUX09GRgkweDA2MAorI2RlZmluZSBQUkNNX01DREVDTEtfTUdUX09GRgkJMHgwNjQKKyNkZWZpbmUgUFJDTV9JUEkyQ0NMS19NR1RfT0ZGCQkweDA2OAorI2RlZmluZSBQUkNNX0RTSUFMVENMS19NR1RfT0ZGCQkweDA2QworI2RlZmluZSBQUkNNX0RNQUNMS19NR1RfT0ZGCQkweDA3NAorI2RlZmluZSBQUkNNX0IyUjJDTEtfTUdUX09GRgkJMHgwNzgKKyNkZWZpbmUgUFJDTV9UVkNMS19NR1RfT0ZGCQkweDA3QworI2RlZmluZSBQUkNNX1VOSVBST0NMS19NR1RfT0ZGCQkweDI3OAorI2RlZmluZSBQUkNNX1NTUENMS19NR1RfT0ZGCQkweDI4MAorI2RlZmluZSBQUkNNX1JOR0NMS19NR1RfT0ZGCQkweDI4NAorI2RlZmluZSBQUkNNX1VJQ0NDTEtfTUdUX09GRgkJMHgyN0MKKyNkZWZpbmUgUFJDTV9NU1AxQ0xLX01HVF9PRkYJCTB4Mjg4CisKKyNkZWZpbmUgUFJDTV9BUk1fUExMRElWUFMJKF9QUkNNVV9CQVNFICsgMHgxMTgpCisjZGVmaW5lIFBSQ01fQVJNX1BMTERJVlBTX0FSTV9CUk1fUkFURQkJMHgzZgorI2RlZmluZSBQUkNNX0FSTV9QTExESVZQU19NQVhfTUFTSwkJMHhmCisKKyNkZWZpbmUgUFJDTV9QTExBUk1fTE9DS1AgICAgICAgKF9QUkNNVV9CQVNFICsgMHgwYTgpCisjZGVmaW5lIFBSQ01fUExMQVJNX0xPQ0tQX1BSQ01fUExMQVJNX0xPQ0tQMwkweDIKKworI2RlZmluZSBQUkNNX0FSTV9DSEdDTEtSRVEJKF9QUkNNVV9CQVNFICsgMHgxMTQpCisjZGVmaW5lIFBSQ01fQVJNX0NIR0NMS1JFUV9QUkNNX0FSTV9DSEdDTEtSRVEJMHgxCisKKyNkZWZpbmUgUFJDTV9QTExBUk1fRU5BQkxFCShfUFJDTVVfQkFTRSArIDB4OTgpCisjZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9FTkFCTEUJMHgxCisjZGVmaW5lIFBSQ01fUExMQVJNX0VOQUJMRV9QUkNNX1BMTEFSTV9DT1VOVE9OCTB4MTAwCisKKyNkZWZpbmUgUFJDTV9BUk1DTEtGSVhfTUdUCShfUFJDTVVfQkFTRSArIDB4MCkKKyNkZWZpbmUgUFJDTV9BOVBMX0ZPUkNFX0NMS0VOCShfUFJDTVVfQkFTRSArIDB4MTlDKQorI2RlZmluZSBQUkNNX0E5X1JFU0VUTl9DTFIJKF9QUkNNVV9CQVNFICsgMHgxZjQpCisjZGVmaW5lIFBSQ01fQTlfUkVTRVROX1NFVAkoX1BSQ01VX0JBU0UgKyAweDFmMCkKKyNkZWZpbmUgUFJDTV9BUk1fTFNfQ0xBTVAJKF9QUkNNVV9CQVNFICsgMHgzMGMpCisjZGVmaW5lIFBSQ01fU1JBTV9BOQkJKF9QUkNNVV9CQVNFICsgMHgzMDgpCisKKyNkZWZpbmUgUFJDTV9BOVBMX0ZPUkNFX0NMS0VOX1BSQ01fQTlQTF9GT1JDRV9DTEtFTiBCSVQoMCkKKyNkZWZpbmUgUFJDTV9BOVBMX0ZPUkNFX0NMS0VOX1BSQ01fQTlBWElfRk9SQ0VfQ0xLRU4gQklUKDEpCisKKy8qIEFSTSBXRkkgU3RhbmRieSBzaWduYWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFJDTV9BUk1fV0ZJX1NUQU5EQlkgICAgKF9QUkNNVV9CQVNFICsgMHgxMzApCisjZGVmaW5lIFBSQ01fSU9DUgkJKF9QUkNNVV9CQVNFICsgMHgzMTApCisjZGVmaW5lIFBSQ01fSU9DUl9JT0ZPUkNFCQkJMHgxCisKKy8qIENQVSBtYWlsYm94IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX01CT1hfQ1BVX1ZBTAkoX1BSQ01VX0JBU0UgKyAweDBmYykKKyNkZWZpbmUgUFJDTV9NQk9YX0NQVV9TRVQJKF9QUkNNVV9CQVNFICsgMHgxMDApCisjZGVmaW5lIFBSQ01fTUJPWF9DUFVfQ0xSCShfUFJDTVVfQkFTRSArIDB4MTA0KQorCisvKiBEdWFsIEE5IGNvcmUgaW50ZXJydXB0IG1hbmFnZW1lbnQgdW5pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFJDTV9BOV9NQVNLX1JFUQkoX1BSQ01VX0JBU0UgKyAweDMyOCkKKyNkZWZpbmUgUFJDTV9BOV9NQVNLX1JFUV9QUkNNX0E5X01BU0tfUkVRCTB4MQorCisjZGVmaW5lIFBSQ01fQTlfTUFTS19BQ0sJKF9QUkNNVV9CQVNFICsgMHgzMmMpCisjZGVmaW5lIFBSQ01fQVJNSVRNU0szMVRPMAkoX1BSQ01VX0JBU0UgKyAweDExYykKKyNkZWZpbmUgUFJDTV9BUk1JVE1TSzYzVE8zMgkoX1BSQ01VX0JBU0UgKyAweDEyMCkKKyNkZWZpbmUgUFJDTV9BUk1JVE1TSzk1VE82NAkoX1BSQ01VX0JBU0UgKyAweDEyNCkKKyNkZWZpbmUgUFJDTV9BUk1JVE1TSzEyN1RPOTYJKF9QUkNNVV9CQVNFICsgMHgxMjgpCisjZGVmaW5lIFBSQ01fUE9XRVJfU1RBVEVfVkFMCShfUFJDTVVfQkFTRSArIDB4MjVDKQorI2RlZmluZSBQUkNNX0FSTUlUVkFMMzFUTzAJKF9QUkNNVV9CQVNFICsgMHgyNjApCisjZGVmaW5lIFBSQ01fQVJNSVRWQUw2M1RPMzIJKF9QUkNNVV9CQVNFICsgMHgyNjQpCisjZGVmaW5lIFBSQ01fQVJNSVRWQUw5NVRPNjQJKF9QUkNNVV9CQVNFICsgMHgyNjgpCisjZGVmaW5lIFBSQ01fQVJNSVRWQUwxMjdUTzk2CShfUFJDTVVfQkFTRSArIDB4MjZDKQorCisjZGVmaW5lIFBSQ01fSE9TVEFDQ0VTU19SRVEJKF9QUkNNVV9CQVNFICsgMHgzMzQpCisjZGVmaW5lIFBSQ01fSE9TVEFDQ0VTU19SRVFfSE9TVEFDQ0VTU19SRVEgMHgxCisjZGVmaW5lIEFSTV9XQUtFVVBfTU9ERU0JMHgxCisKKyNkZWZpbmUgUFJDTV9BUk1fSVQxX0NMUgkoX1BSQ01VX0JBU0UgKyAweDQ4QykKKyNkZWZpbmUgUFJDTV9BUk1fSVQxX1ZBTAkoX1BSQ01VX0JBU0UgKyAweDQ5NCkKKyNkZWZpbmUgUFJDTV9IT0xEX0VWVAkJKF9QUkNNVV9CQVNFICsgMHgxNzQpCisKKyNkZWZpbmUgUFJDTV9NT0RfQVdBS0VfU1RBVFVTCShfUFJDTVVfQkFTRSArIDB4NEEwKQorI2RlZmluZSBQUkNNX01PRF9BV0FLRV9TVEFUVVNfUFJDTV9NT0RfQ09SRVBEX0FXQUtFCUJJVCgwKQorI2RlZmluZSBQUkNNX01PRF9BV0FLRV9TVEFUVVNfUFJDTV9NT0RfQUFQRF9BV0FLRQlCSVQoMSkKKyNkZWZpbmUgUFJDTV9NT0RfQVdBS0VfU1RBVFVTX1BSQ01fTU9EX1ZNT0RFTV9PRkZfSVNPCUJJVCgyKQorCisjZGVmaW5lIFBSQ01fSVRTVEFUVVMwCQkoX1BSQ01VX0JBU0UgKyAweDE0OCkKKyNkZWZpbmUgUFJDTV9JVFNUQVRVUzEJCShfUFJDTVVfQkFTRSArIDB4MTUwKQorI2RlZmluZSBQUkNNX0lUU1RBVFVTMgkJKF9QUkNNVV9CQVNFICsgMHgxNTgpCisjZGVmaW5lIFBSQ01fSVRTVEFUVVMzCQkoX1BSQ01VX0JBU0UgKyAweDE2MCkKKyNkZWZpbmUgUFJDTV9JVFNUQVRVUzQJCShfUFJDTVVfQkFTRSArIDB4MTY4KQorI2RlZmluZSBQUkNNX0lUU1RBVFVTNQkJKF9QUkNNVV9CQVNFICsgMHg0ODQpCisjZGVmaW5lIFBSQ01fSVRDTEVBUjUJCShfUFJDTVVfQkFTRSArIDB4NDg4KQorI2RlZmluZSBQUkNNX0FSTUlUX01BU0tYUDcwX0lUCShfUFJDTVVfQkFTRSArIDB4MTAxOCkKKworLyogU3lzdGVtIHJlc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFBSQ01fQVBFX1NPRlRSU1QJKF9QUkNNVV9CQVNFICsgMHgyMjgpCisKKy8qIExldmVsIHNoaWZ0ZXIgYW5kIGNsYW1wIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBSQ01fTU1JUF9MU19DTEFNUF9TRVQgICAgIChfUFJDTVVfQkFTRSArIDB4NDIwKQorI2RlZmluZSBQUkNNX01NSVBfTFNfQ0xBTVBfQ0xSICAgICAoX1BSQ01VX0JBU0UgKyAweDQyNCkKKworLyogUFJDTVUgY2xvY2svUExML3Jlc2V0IHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX1BMTERTSV9GUkVRICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwMCkKKyNkZWZpbmUgUFJDTV9QTExEU0lfRU5BQkxFICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MDQpCisjZGVmaW5lIFBSQ01fUExMRFNJX0xPQ0tQICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTA4KQorI2RlZmluZSBQUkNNX0xDRENMS19NR1QgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyBQUkNNX0xDRENMS19NR1RfT0ZGKQorI2RlZmluZSBQUkNNX01DREVDTEtfTUdUICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyBQUkNNX01DREVDTEtfTUdUX09GRikKKyNkZWZpbmUgUFJDTV9IRE1JQ0xLX01HVCAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgUFJDTV9IRE1JQ0xLX01HVF9PRkYpCisjZGVmaW5lIFBSQ01fVFZDTEtfTUdUICAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIFBSQ01fVFZDTEtfTUdUX09GRikKKyNkZWZpbmUgUFJDTV9EU0lfUExMT1VUX1NFTCAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg1MzApCisjZGVmaW5lIFBSQ01fRFNJVFZDTEtfRElWICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4NTJDKQorI2RlZmluZSBQUkNNX1BMTERTSV9MT0NLUCAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDUwOCkKKyNkZWZpbmUgUFJDTV9BUEVfUkVTRVROX1NFVCAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgxRTQpCisjZGVmaW5lIFBSQ01fQVBFX1JFU0VUTl9DTFIgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MUU4KQorCisjZGVmaW5lIFBSQ01fQ0xLT0NSCQkgICAoX1BSQ01VX0JBU0UgKyAweDFDQykKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1VUMF9SRUZfQ0xLCSgxIDw8IDApCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09VVDBfTUFTSwlCSVRTKDAsIDEzKQorI2RlZmluZSBQUkNNX0NMS09DUl9DTEtPVVQxX1JFRl9DTEsJKDEgPDwgMTYpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09VVDFfTUFTSwlCSVRTKDE2LCAyOSkKKworLyogZVBPRCBhbmQgbWVtb3J5IHBvd2VyIHNpZ25hbCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBQUkNNX0VQT0RfQ19TRVQgICAgICAgICAgICAoX1BSQ01VX0JBU0UgKyAweDQxMCkKKyNkZWZpbmUgUFJDTV9TUkFNX0xTX1NMRUVQICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgzMDQpCisKKy8qIERlYnVnIHBvd2VyIGNvbnRyb2wgdW5pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFJDTV9QT1dFUl9TVEFURV9TRVQgICAgICAgKF9QUkNNVV9CQVNFICsgMHgyNTQpCisKKy8qIE1pc2NlbGxhbmVvdXMgdW5pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFJDTV9EU0lfU1dfUkVTRVQgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHgzMjQpCisjZGVmaW5lIFBSQ01fR1BJT0NSICAgICAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MTM4KQorI2RlZmluZSBQUkNNX0dQSU9DUl9EQkdfU1RNX01PRF9DTUQxICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgUFJDTV9HUElPQ1JfREJHX1VBUlRNT0RfQ01EMCAgICAgICAgICAgIDB4MQorCisvKiBQUkNNVSBIVyBzZW1hcGhvcmUgKi8KKyNkZWZpbmUgUFJDTV9TRU0gICAgICAgICAgICAgICAgICAgKF9QUkNNVV9CQVNFICsgMHg0MDApCisjZGVmaW5lIFBSQ01fU0VNX1BSQ01fU0VNIEJJVCgwKQorCisjZGVmaW5lIFBSQ01fVENSICAgICAgICAgICAgICAgICAgIChfUFJDTVVfQkFTRSArIDB4MUM4KQorI2RlZmluZSBQUkNNX1RDUl9URU5TRUxfTUFTSyAgICAgICBCSVRTKDAsIDcpCisjZGVmaW5lIFBSQ01fVENSX1NUT1BfVElNRVJTICAgICAgIEJJVCgxNikKKyNkZWZpbmUgUFJDTV9UQ1JfRE9aRV9NT0RFICAgICAgICAgQklUKDE3KQorCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYwX1NISUZUCTAKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT0RJVjBfTUFTSwlCSVRTKDAsIDUpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwwX1NISUZUCTYKKyNkZWZpbmUgUFJDTV9DTEtPQ1JfQ0xLT1NFTDBfTUFTSwlCSVRTKDYsIDgpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYxX1NISUZUCTE2CisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09ESVYxX01BU0sJQklUUygxNiwgMjEpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwxX1NISUZUCTIyCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMS09TRUwxX01BU0sJQklUUygyMiwgMjQpCisjZGVmaW5lIFBSQ01fQ0xLT0NSX0NMSzFUWVBFCQlCSVQoMjgpCisKKyNkZWZpbmUgUFJDTV9DTEtfTUdUX0NMS1BMTERJVl9NQVNLCUJJVFMoMCwgNCkKKyNkZWZpbmUgUFJDTV9DTEtfTUdUX0NMS1BMTFNXX01BU0sJQklUUyg1LCA3KQorI2RlZmluZSBQUkNNX0NMS19NR1RfQ0xLRU4JCUJJVCg4KQorCisvKiBHUElPQ1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFJDTV9HUElPQ1JfU1BJMl9TRUxFQ1QgQklUKDIzKQorCisjZGVmaW5lIFBSQ01fRERSX1NVQlNZU19BUEVfTUlOQlcJKF9QUkNNVV9CQVNFICsgMHg0MzgpCisjZGVmaW5lIFBSQ01fQ0dBVElOR19CWVBBU1MJCShfUFJDTVVfQkFTRSArIDB4MTM0KQorI2RlZmluZSBQUkNNX0NHQVRJTkdfQllQQVNTX0lDTjIJQklUKDYpCisKKy8qIE1pc2NlbGxhbmVvdXMgdW5pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFJDTV9SRVNPVVROX1NFVAkJKF9QUkNNVV9CQVNFICsgMHgyMTQpCisjZGVmaW5lIFBSQ01fUkVTT1VUTl9DTFIJCShfUFJDTVVfQkFTRSArIDB4MjE4KQorCisvKiBTeXN0ZW0gcmVzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFJDTV9BUEVfU09GVFJTVAkJKF9QUkNNVV9CQVNFICsgMHgyMjgpCisKKyNlbmRpZiAvKiBfX0RCODUwMF9QUkNNVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jIGIvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMKaW5kZXggM2Q0YTg2MS4uOGFkODhkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMKKysrIGIvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9pbnRlbF9tc2ljLmMgYi9kcml2ZXJzL21mZC9pbnRlbF9tc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjMjc3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2ludGVsX21zaWMuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqIERyaXZlciBmb3IgSW50ZWwgTVNJQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2ludGVsX21zaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgorCisjZGVmaW5lIE1TSUNfVkVORE9SKGlkKQkJKChpZCA+PiA2KSAmIDMpCisjZGVmaW5lIE1TSUNfVkVSU0lPTihpZCkJKGlkICYgMHgzZikKKyNkZWZpbmUgTVNJQ19NQUpPUihpZCkJCSgnQScgKyAoKGlkID4+IDMpICYgNykpCisjZGVmaW5lIE1TSUNfTUlOT1IoaWQpCQkoaWQgJiA3KQorCisvKgorICogTVNJQyBpbnRlcnJ1cHQgdHJlZSBpcyByZWFkYWJsZSBmcm9tIFNSQU0gYXQgSU5URUxfTVNJQ19JUlFfUEhZU19CQVNFLgorICogU2luY2UgSVJRIGJsb2NrIHN0YXJ0cyBmcm9tIGFkZHJlc3MgMHgwMDIgd2UgbmVlZCB0byBzdWJzdHJhY3QgdGhhdCBmcm9tCisgKiB0aGUgYWN0dWFsIElSUSBzdGF0dXMgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqLworI2RlZmluZSBNU0lDX0lSUV9TVEFUVVMoeCkJKElOVEVMX01TSUNfSVJRX1BIWVNfQkFTRSArICgoeCkgLSAyKSkKKyNkZWZpbmUgTVNJQ19JUlFfU1RBVFVTX0FDQ0RFVAlNU0lDX0lSUV9TVEFUVVMoSU5URUxfTVNJQ19BQ0NERVQpCisKKy8qCisgKiBUaGUgU0NVIGhhcmR3YXJlIGhhcyBsaW1pdGF0aW9uIG9mIDE2IGJ5dGVzIHBlciByZWFkL3dyaXRlIGJ1ZmZlciBvbgorICogTWVkZmllbGQuCisgKi8KKyNkZWZpbmUgU0NVX0lQQ19SV0JVRl9MSU1JVAkxNgorCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljIC0gYW4gTVNJQyBNRkQgaW5zdGFuY2UKKyAqIEBwZGV2OiBwb2ludGVyIHRvIHRoZSBwbGF0Zm9ybSBkZXZpY2UKKyAqIEB2ZW5kb3I6IHZlbmRvciBJRAorICogQHZlcnNpb246IGNoaXAgdmVyc2lvbgorICogQGlycV9iYXNlOiBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBNU0lDIFNSQU0gaW50ZXJydXB0IHRyZWUKKyAqLworc3RydWN0IGludGVsX21zaWMgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworCXVuc2lnbmVkCQkJdmVuZG9yOworCXVuc2lnbmVkCQkJdmVyc2lvbjsKKwl2b2lkIF9faW9tZW0JCQkqaXJxX2Jhc2U7Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfdG91Y2hfcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19hZGNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19iYXR0ZXJ5X3Jlc291cmNlc1tdID0geworCXsKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfZ3Bpb19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX2F1ZGlvX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJCT0gIklSUSIsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCS8qCisJICogV2Ugd2lsbCBwYXNzIElSUV9CQVNFIHRvIHRoZSBkcml2ZXIgbm93IGJ1dCB0aGlzIGNhbiBiZSByZW1vdmVkCisJICogd2hlbi9pZiB0aGUgZHJpdmVyIHN0YXJ0cyB0byB1c2UgaW50ZWxfbXNpY19pcnFfcmVhZCgpLgorCSAqLworCXsKKwkJLm5hbWUJCT0gIklSUV9CQVNFIiwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCQkuc3RhcnQJCT0gTVNJQ19JUlFfU1RBVFVTX0FDQ0RFVCwKKwkJLmVuZAkJPSBNU0lDX0lSUV9TVEFUVVNfQUNDREVULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1zaWNfaGRtaV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtc2ljX3RoZXJtYWxfcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19wb3dlcl9idG5fcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXNpY19vY2RfcmVzb3VyY2VzW10gPSB7CisJeworCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKKy8qCisgKiBEZXZpY2VzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIE1TSUMgYW5kIGFyZSBhdmFpbGFibGUgdmlhIGZpcm13YXJlCisgKiBwb3B1bGF0ZWQgU0ZJIERFVlMgdGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgbXNpY19kZXZzW10gPSB7CisJW0lOVEVMX01TSUNfQkxPQ0tfVE9VQ0hdCT0geworCQkubmFtZQkJCT0gIm1zaWNfdG91Y2giLAorCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKG1zaWNfdG91Y2hfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcwkJPSBtc2ljX3RvdWNoX3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX0FEQ10JCT0geworCQkubmFtZQkJCT0gIm1zaWNfYWRjIiwKKwkJLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShtc2ljX2FkY19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzCQk9IG1zaWNfYWRjX3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX0JBVFRFUlldCT0geworCQkubmFtZQkJCT0gIm1zaWNfYmF0dGVyeSIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19iYXR0ZXJ5X3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19iYXR0ZXJ5X3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX0dQSU9dCQk9IHsKKwkJLm5hbWUJCQk9ICJtc2ljX2dwaW8iLAorCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKG1zaWNfZ3Bpb19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzCQk9IG1zaWNfZ3Bpb19yZXNvdXJjZXMsCisJfSwKKwlbSU5URUxfTVNJQ19CTE9DS19BVURJT10JPSB7CisJCS5uYW1lCQkJPSAibXNpY19hdWRpbyIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19hdWRpb19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzCQk9IG1zaWNfYXVkaW9fcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfSERNSV0JCT0geworCQkubmFtZQkJCT0gIm1zaWNfaGRtaSIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY19oZG1pX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19oZG1pX3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX1RIRVJNQUxdCT0geworCQkubmFtZQkJCT0gIm1zaWNfdGhlcm1hbCIsCisJCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobXNpY190aGVybWFsX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY190aGVybWFsX3Jlc291cmNlcywKKwl9LAorCVtJTlRFTF9NU0lDX0JMT0NLX1BPV0VSX0JUTl0JPSB7CisJCS5uYW1lCQkJPSAibXNpY19wb3dlcl9idG4iLAorCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKG1zaWNfcG93ZXJfYnRuX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19wb3dlcl9idG5fcmVzb3VyY2VzLAorCX0sCisJW0lOVEVMX01TSUNfQkxPQ0tfT0NEXQkJPSB7CisJCS5uYW1lCQkJPSAibXNpY19vY2QiLAorCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKG1zaWNfb2NkX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMJCT0gbXNpY19vY2RfcmVzb3VyY2VzLAorCX0sCit9OworCisvKgorICogT3RoZXIgTVNJQyByZWxhdGVkIGRldmljZXMgd2hpY2ggYXJlIG5vdCBkaXJlY3RseSBhdmFpbGFibGUgdmlhIFNGSSBERVZTCisgKiB0YWJsZS4gVGhlc2UgY2FuIGJlIHBzZXVkbyBkZXZpY2VzLCByZWd1bGF0b3JzIGV0Yy4gd2hpY2ggYXJlIG5lZWRlZCBmb3IKKyAqIGRpZmZlcmVudCBwdXJwb3Nlcy4KKyAqCisgKiBUaGVzZSBkZXZpY2VzIGFwcGVhciBvbmx5IGFmdGVyIHRoZSBNU0lDIGRyaXZlciBpdHNlbGYgaXMgaW5pdGlhbGl6ZWQgc28KKyAqIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgU0NVIElQQyBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgbXNpY19vdGhlcl9kZXZzW10gPSB7CisJLyogQXVkaW8gY29kZWMgaW4gdGhlIE1TSUMgKi8KKwl7CisJCS5pZAkJCT0gLTEsCisJCS5uYW1lCQkJPSAic245NTAzMSIsCisJfSwKK307CisKKy8qKgorICogaW50ZWxfbXNpY19yZWdfcmVhZCAtIHJlYWQgYSBzaW5nbGUgTVNJQyByZWdpc3RlcgorICogQHJlZzogcmVnaXN0ZXIgdG8gcmVhZAorICogQHZhbDogcmVnaXN0ZXIgdmFsdWUgaXMgcGxhY2VkIGhlcmUKKyAqCisgKiBSZWFkIGEgc2luZ2xlIHJlZ2lzdGVyIGZyb20gTVNJQy4gUmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCBuZWdhdGl2ZQorICogZXJybm8gaW4gY2FzZSBvZiBmYWlsdXJlLgorICoKKyAqIEZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqLworaW50IGludGVsX21zaWNfcmVnX3JlYWQodW5zaWduZWQgc2hvcnQgcmVnLCB1OCAqdmFsKQoreworCXJldHVybiBpbnRlbF9zY3VfaXBjX2lvcmVhZDgocmVnLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfbXNpY19yZWdfcmVhZCk7CisKKy8qKgorICogaW50ZWxfbXNpY19yZWdfd3JpdGUgLSB3cml0ZSBhIHNpbmdsZSBNU0lDIHJlZ2lzdGVyCisgKiBAcmVnOiByZWdpc3RlciB0byB3cml0ZQorICogQHZhbDogdmFsdWUgdG8gd3JpdGUgdG8gdGhhdCByZWdpc3RlcgorICoKKyAqIFdyaXRlIGEgc2luZ2xlIE1TSUMgcmVnaXN0ZXIuIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBuZWdhdGl2ZQorICogZXJybm8gaW4gY2FzZSBvZiBmYWlsdXJlLgorICoKKyAqIEZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqLworaW50IGludGVsX21zaWNfcmVnX3dyaXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdTggdmFsKQoreworCXJldHVybiBpbnRlbF9zY3VfaXBjX2lvd3JpdGU4KHJlZywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX21zaWNfcmVnX3dyaXRlKTsKKworLyoqCisgKiBpbnRlbF9tc2ljX3JlZ191cGRhdGUgLSB1cGRhdGUgYSBzaW5nbGUgTVNJQyByZWdpc3RlcgorICogQHJlZzogcmVnaXN0ZXIgdG8gdXBkYXRlCisgKiBAdmFsOiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIKKyAqIEBtYXNrOiBzcGVjaWZpZXMgd2hpY2ggb2YgdGhlIGJpdHMgYXJlIHVwZGF0ZWQgKCUwID0gZG9uJ3QgdXBkYXRlLAorICogICAgICAgICUxID0gdXBkYXRlKQorICoKKyAqIFBlcmZvcm0gYW4gdXBkYXRlIHRvIGEgcmVnaXN0ZXIgQHJlZy4gQG1hc2sgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoCisgKiBiaXRzIGFyZSB1cGRhdGVkLiBSZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJybm8gaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqCisgKiBGdW5jdGlvbiBtYXkgc2xlZXAuCisgKi8KK2ludCBpbnRlbF9tc2ljX3JlZ191cGRhdGUodW5zaWduZWQgc2hvcnQgcmVnLCB1OCB2YWwsIHU4IG1hc2spCit7CisJcmV0dXJuIGludGVsX3NjdV9pcGNfdXBkYXRlX3JlZ2lzdGVyKHJlZywgdmFsLCBtYXNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX21zaWNfcmVnX3VwZGF0ZSk7CisKKy8qKgorICogaW50ZWxfbXNpY19idWxrX3JlYWQgLSByZWFkIGFuIGFycmF5IG9mIHJlZ2lzdGVycworICogQHJlZzogYXJyYXkgb2YgcmVnaXN0ZXIgYWRkcmVzc2VzIHRvIHJlYWQKKyAqIEBidWY6IGFycmF5IHdoZXJlIHRoZSByZWFkIHZhbHVlcyBhcmUgcGxhY2VkCisgKiBAY291bnQ6IG51bWJlciBvZiByZWdpc3RlcnMgdG8gcmVhZAorICoKKyAqIEZ1bmN0aW9uIHJlYWRzIEBjb3VudCByZWdpc3RlcnMgZnJvbSB0aGUgTVNJQyB1c2luZyBhZGRyZXNzZXMgcGFzc2VkIGluCisgKiBAcmVnLiBSZWFkIHZhbHVlcyBhcmUgcGxhY2VkIGluIEBidWYuIFJlYWRzIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseQorICogd3J0LiBNU0lDLgorICoKKyAqIFJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJubyBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogRnVuY3Rpb24gbWF5IHNsZWVwLgorICovCitpbnQgaW50ZWxfbXNpY19idWxrX3JlYWQodW5zaWduZWQgc2hvcnQgKnJlZywgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChXQVJOX09OKGNvdW50ID4gU0NVX0lQQ19SV0JVRl9MSU1JVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGludGVsX3NjdV9pcGNfcmVhZHYocmVnLCBidWYsIGNvdW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX21zaWNfYnVsa19yZWFkKTsKKworLyoqCisgKiBpbnRlbF9tc2ljX2J1bGtfd3JpdGUgLSB3cml0ZSBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gdGhlIE1TSUMgcmVnaXN0ZXJzCisgKiBAcmVnOiBhcnJheSBvZiByZWdpc3RlcnMgdG8gd3JpdGUKKyAqIEBidWY6IHZhbHVlcyB0byB3cml0ZSB0byBlYWNoIHJlZ2lzdGVyCisgKiBAY291bnQ6IG51bWJlciBvZiByZWdpc3RlcnMgdG8gd3JpdGUKKyAqCisgKiBGdW5jdGlvbiB3cml0ZXMgQGNvdW50IHJlZ2lzdGVycyBpbiBAYnVmIHRvIE1TSUMuIFdyaXRlcyBhcmUgcGVyZm9ybWVkCisgKiBhdG9taWNhbGx5IHdydCBNU0lDLiBSZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJybm8gaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqCisgKiBGdW5jdGlvbiBtYXkgc2xlZXAuCisgKi8KK2ludCBpbnRlbF9tc2ljX2J1bGtfd3JpdGUodW5zaWduZWQgc2hvcnQgKnJlZywgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChXQVJOX09OKGNvdW50ID4gU0NVX0lQQ19SV0JVRl9MSU1JVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGludGVsX3NjdV9pcGNfd3JpdGV2KHJlZywgYnVmLCBjb3VudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9tc2ljX2J1bGtfd3JpdGUpOworCisvKioKKyAqIGludGVsX21zaWNfaXJxX3JlYWQgLSByZWFkIGEgcmVnaXN0ZXIgZnJvbSBhbiBNU0lDIGludGVycnVwdCB0cmVlCisgKiBAbXNpYzogTVNJQyBpbnN0YW5jZQorICogQHJlZzogaW50ZXJydXB0IHJlZ2lzdGVyIChiZXR3ZWVuICVJTlRFTF9NU0lDX0lSUUxWTDEgYW5kCisgKgkgJUlOVEVMX01TSUNfUkVTRVRJUlEyKQorICogQHZhbDogdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGlzIHBsYWNlZCBoZXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBhbiBNU0lDIHN1YmRldmljZSBpbnRlcnJ1cHQgaGFuZGxlciB0byByZWFkCisgKiBhIHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1TSUMgaW50ZXJydXB0IHRyZWUuIEluIHRoaXMgd2F5IHN1YmRldmljZQorICogZHJpdmVycyBkb24ndCBoYXZlIHRvIG1hcCBpbiB0aGUgaW50ZXJydXB0IHRyZWUgdGhlbXNlbHZlcyBidXQgY2FuIGp1c3QKKyAqIGNhbGwgdGhpcyBmdW5jdGlvbiBpbnN0ZWFkLgorICoKKyAqIEZ1bmN0aW9uIGRvZXNuJ3Qgc2xlZXAgYW5kIGlzIGNhbGxhYmxlIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogUmV0dXJucyAlLUVJTlZBTCBpZiBAcmVnIGlzIG91dHNpZGUgb2YgdGhlIGFsbG93ZWQgcmVnaXN0ZXIgcmVnaW9uLgorICovCitpbnQgaW50ZWxfbXNpY19pcnFfcmVhZChzdHJ1Y3QgaW50ZWxfbXNpYyAqbXNpYywgdW5zaWduZWQgc2hvcnQgcmVnLCB1OCAqdmFsKQoreworCWlmIChXQVJOX09OKHJlZyA8IElOVEVMX01TSUNfSVJRTFZMMSB8fCByZWcgPiBJTlRFTF9NU0lDX1JFU0VUSVJRMikpCisJCXJldHVybiAtRUlOVkFMOworCisJKnZhbCA9IHJlYWRiKG1zaWMtPmlycV9iYXNlICsgKHJlZyAtIElOVEVMX01TSUNfSVJRTFZMMSkpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfbXNpY19pcnFfcmVhZCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGludGVsX21zaWNfaW5pdF9kZXZpY2VzKHN0cnVjdCBpbnRlbF9tc2ljICptc2ljKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBtc2ljLT5wZGV2OworCXN0cnVjdCBpbnRlbF9tc2ljX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCwgaTsKKworCWlmIChwZGF0YS0+Z3BpbykgeworCQlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSAmbXNpY19kZXZzW0lOVEVMX01TSUNfQkxPQ0tfR1BJT107CisKKwkJY2VsbC0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhLT5ncGlvOworCQljZWxsLT5wZGF0YV9zaXplID0gc2l6ZW9mKCpwZGF0YS0+Z3Bpbyk7CisJfQorCisJaWYgKHBkYXRhLT5vY2QpIHsKKwkJdW5zaWduZWQgZ3BpbyA9IHBkYXRhLT5vY2QtPmdwaW87CisKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShncGlvLCBHUElPRl9JTiwgIm9jZF9ncGlvIik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBPQ0QgR1BJT1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlEgbnVtYmVyIGZvciBPQ0QgR1BJT1xuIik7CisJCQlncGlvX2ZyZWUoZ3Bpbyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogVXBkYXRlIHRoZSBJUlEgbnVtYmVyIGZvciB0aGUgT0NEICovCisJCXBkYXRhLT5pcnFbSU5URUxfTVNJQ19CTE9DS19PQ0RdID0gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zaWNfZGV2cyk7IGkrKykgeworCQlpZiAoIXBkYXRhLT5pcnFbaV0pCisJCQljb250aW51ZTsKKworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoJnBkZXYtPmRldiwgLTEsICZtc2ljX2RldnNbaV0sIDEsIE5VTEwsCisJCQkJICAgICAgcGRhdGEtPmlycVtpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKCZwZGV2LT5kZXYsIDAsIG1zaWNfb3RoZXJfZGV2cywKKwkJCSAgICAgIEFSUkFZX1NJWkUobXNpY19vdGhlcl9kZXZzKSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOworCWlmIChwZGF0YS0+b2NkKQorCQlncGlvX2ZyZWUocGRhdGEtPm9jZC0+Z3Bpbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW50ZWxfbXNpY19yZW1vdmVfZGV2aWNlcyhzdHJ1Y3QgaW50ZWxfbXNpYyAqbXNpYykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gbXNpYy0+cGRldjsKKwlzdHJ1Y3QgaW50ZWxfbXNpY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOworCisJaWYgKHBkYXRhLT5vY2QpCisJCWdwaW9fZnJlZShwZGF0YS0+b2NkLT5ncGlvKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW50ZWxfbXNpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbnRlbF9tc2ljX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGludGVsX21zaWMgKm1zaWM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdTggaWQwLCBpZDE7CisJaW50IHJldDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YSBwYXNzZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCB2YWxpZGF0ZSB0aGF0IHdlIGhhdmUgYW4gTVNJQyBpbiBwbGFjZSAqLworCXJldCA9IGludGVsX3NjdV9pcGNfaW9yZWFkOChJTlRFTF9NU0lDX0lEMCwgJmlkMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaWRlbnRpZnkgdGhlIE1TSUMgY2hpcCAoSUQwKVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0ID0gaW50ZWxfc2N1X2lwY19pb3JlYWQ4KElOVEVMX01TSUNfSUQxLCAmaWQxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpZGVudGlmeSB0aGUgTVNJQyBjaGlwIChJRDEpXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoTVNJQ19WRU5ET1IoaWQwKSAhPSBNU0lDX1ZFTkRPUihpZDEpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgdmVuZG9yIElEOiAleCwgJXhcbiIsIGlkMCwgaWQxKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwltc2ljID0ga3phbGxvYyhzaXplb2YoKm1zaWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zaWMpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNpYy0+dmVuZG9yID0gTVNJQ19WRU5ET1IoaWQwKTsKKwltc2ljLT52ZXJzaW9uID0gTVNJQ19WRVJTSU9OKGlkMCk7CisJbXNpYy0+cGRldiA9IHBkZXY7CisKKwkvKgorCSAqIE1hcCBpbiB0aGUgTVNJQyBpbnRlcnJ1cHQgdHJlZSBhcmVhIGluIFNSQU0uIFRoaXMgaXMgZXhwb3NlZCB0bworCSAqIHRoZSBjbGllbnRzIHZpYSBpbnRlbF9tc2ljX2lycV9yZWFkKCkuCisJICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IFNSQU0gaW9tZW0gcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZnJlZV9tc2ljOworCX0KKworCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpOworCWlmICghcmVzKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsX2ZyZWVfbXNpYzsKKwl9CisKKwltc2ljLT5pcnFfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghbXNpYy0+aXJxX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBTUkFNIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtc2ljKTsKKworCXJldCA9IGludGVsX21zaWNfaW5pdF9kZXZpY2VzKG1zaWMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgTVNJQyBkZXZpY2VzXG4iKTsKKwkJZ290byBmYWlsX3VubWFwX21lbTsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW50ZWwgTVNJQyB2ZXJzaW9uICVjJWQgKHZlbmRvciAlI3gpXG4iLAorCQkgTVNJQ19NQUpPUihtc2ljLT52ZXJzaW9uKSwgTVNJQ19NSU5PUihtc2ljLT52ZXJzaW9uKSwKKwkJIG1zaWMtPnZlbmRvcik7CisKKwlyZXR1cm4gMDsKKworZmFpbF91bm1hcF9tZW06CisJaW91bm1hcChtc2ljLT5pcnFfYmFzZSk7CitmYWlsX3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZmFpbF9mcmVlX21zaWM6CisJa2ZyZWUobXNpYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBpbnRlbF9tc2ljX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbnRlbF9tc2ljICptc2ljID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaW50ZWxfbXNpY19yZW1vdmVfZGV2aWNlcyhtc2ljKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpb3VubWFwKG1zaWMtPmlycV9iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlrZnJlZShtc2ljKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbnRlbF9tc2ljX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaW50ZWxfbXNpY19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGludGVsX21zaWNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiaW50ZWxfbXNpYyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbnRlbF9tc2ljX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbnRlbF9tc2ljX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChpbnRlbF9tc2ljX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaW50ZWxfbXNpY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmludGVsX21zaWNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGludGVsX21zaWNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBJbnRlbCBNU0lDIik7CitNT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMgYi9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKaW5kZXggNTYzNjU0Yy4uMWU5ZWU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgano0NzQwX2FkY19kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfYWRjX2RyaXZlciA9IHsKIAkucHJvYmUJPSBqejQ3NDBfYWRjX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChqejQ3NDBfYWRjX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21heDg5OTcuYyBiL2RyaXZlcnMvbWZkL21heDg5OTcuYwppbmRleCBmODMxMDNiLi41YmU1M2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9tZmQvbWF4ODk5Ny5jCkBAIC0yMyw3ICsyMyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny5oPgpAQCAtMTQyLDcgKzE0NCw2IEBACiAKIAltYXg4OTk3LT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKIAltYXg4OTk3LT5vbm8gPSBwZGF0YS0+b25vOwotCW1heDg5OTctPndha2V1cCA9IHBkYXRhLT53YWtldXA7CiAKIAltdXRleF9pbml0KCZtYXg4OTk3LT5pb2xvY2spOwogCkBAIC0xNjksNiArMTcwLDkgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfbWZkOwogCisJLyogTUFYODk5NyBoYXMgYSBwb3dlciBidXR0b24gaW5wdXQuICovCisJZGV2aWNlX2luaXRfd2FrZXVwKG1heDg5OTctPmRldiwgcGRhdGEtPndha2V1cCk7CisKIAlyZXR1cm4gcmV0OwogCiBlcnJfbWZkOgpAQCAtMzk4LDcgKzQwMiwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1heDg5OTdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCBtYXg4OTk3X2RldiAqbWF4ODk5NyA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWlycV9zZXRfaXJxX3dha2UobWF4ODk5Ny0+aXJxLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg4OTk3X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCBtYXg4OTk3X2RldiAqbWF4ODk5NyA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWlycV9zZXRfaXJxX3dha2UobWF4ODk5Ny0+aXJxLCAwKTsKKwlyZXR1cm4gbWF4ODk5N19pcnFfcmVzdW1lKG1heDg5OTcpOworfQorCiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBtYXg4OTk3X3BtID0geworCS5zdXNwZW5kID0gbWF4ODk5N19zdXNwZW5kLAorCS5yZXN1bWUgPSBtYXg4OTk3X3Jlc3VtZSwKIAkuZnJlZXplID0gbWF4ODk5N19mcmVlemUsCiAJLnJlc3RvcmUgPSBtYXg4OTk3X3Jlc3RvcmUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWMxM3h4eC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYwppbmRleCA3ZTRkNDRiLi5lOTYxOWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYwpAQCAtMjYsMjAgKzI2LDEwIEBACiAKIAlpcnFfaGFuZGxlcl90IGlycWhhbmRsZXJbTUMxM1hYWF9OVU1fSVJRXTsKIAl2b2lkICppcnFkYXRhW01DMTNYWFhfTlVNX0lSUV07Ci19OwotCi1zdHJ1Y3QgbWMxMzc4MyB7Ci0Jc3RydWN0IG1jMTN4eHggbWMxM3h4eDsKIAogCWludCBhZGNmbGFnczsKIH07CiAKLXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzX3RvX21jMTN4eHgoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpCi17Ci0JcmV0dXJuICZtYzEzNzgzLT5tYzEzeHh4OwotfQotRVhQT1JUX1NZTUJPTChtYzEzNzgzX3RvX21jMTN4eHgpOwotCiAjZGVmaW5lIE1DMTNYWFhfSVJRU1RBVDAJMAogI2RlZmluZSBNQzEzWFhYX0lSUVNUQVQwX0FEQ0RPTkVJCSgxIDw8IDApCiAjZGVmaW5lIE1DMTNYWFhfSVJRU1RBVDBfQURDQklTRE9ORUkJKDEgPDwgMSkKQEAgLTEzNiwxNCArMTI2LDE0IEBACiAjZGVmaW5lIE1DMTNYWFhfUkVWSVNJT05fRkFCCQkoMHgwMyA8PCAxMSkKICNkZWZpbmUgTUMxM1hYWF9SRVZJU0lPTl9JQ0lEQ09ERQkoMHgzZiA8PCAxMykKIAotI2RlZmluZSBNQzEzNzgzX0FEQzEJCTQ0Ci0jZGVmaW5lIE1DMTM3ODNfQURDMV9BREVOCQkoMSA8PCAwKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfUkFORAkJKDEgPDwgMSkKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FEU0VMCQkoMSA8PCAzKQotI2RlZmluZSBNQzEzNzgzX0FEQzFfQVNDCQkoMSA8PCAyMCkKLSNkZWZpbmUgTUMxMzc4M19BREMxX0FEVFJJR0lHTgkJKDEgPDwgMjEpCisjZGVmaW5lIE1DMTNYWFhfQURDMQkJNDQKKyNkZWZpbmUgTUMxM1hYWF9BREMxX0FERU4JCSgxIDw8IDApCisjZGVmaW5lIE1DMTNYWFhfQURDMV9SQU5ECQkoMSA8PCAxKQorI2RlZmluZSBNQzEzWFhYX0FEQzFfQURTRUwJCSgxIDw8IDMpCisjZGVmaW5lIE1DMTNYWFhfQURDMV9BU0MJCSgxIDw8IDIwKQorI2RlZmluZSBNQzEzWFhYX0FEQzFfQURUUklHSUdOCQkoMSA8PCAyMSkKIAotI2RlZmluZSBNQzEzNzgzX0FEQzIJCTQ1CisjZGVmaW5lIE1DMTNYWFhfQURDMgkJNDUKIAogI2RlZmluZSBNQzEzWFhYX05VTVJFR1MgMHgzZgogCkBAIC00ODcsNyArNDc3LDcgQEAKIAlNQzEzWFhYX0lEX0lOVkFMSUQsCiB9OwogCi1jb25zdCBjaGFyICptYzEzeHh4X2NoaXBuYW1lW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqbWMxM3h4eF9jaGlwbmFtZVtdID0gewogCVtNQzEzWFhYX0lEX01DMTM3ODNdID0gIm1jMTM3ODMiLAogCVtNQzEzWFhYX0lEX01DMTM4OTJdID0gIm1jMTM4OTIiLAogfTsKQEAgLTU1OCw4ICs1NDgsNiBAQAogCXJldHVybiBtYzEzeHh4X2NoaXBuYW1lW2RldmlkLT5kcml2ZXJfZGF0YV07CiB9CiAKLSNpbmNsdWRlIDxsaW51eC9tZmQvbWMxMzc4My5oPgotCiBpbnQgbWMxM3h4eF9nZXRfZmxhZ3Moc3RydWN0IG1jMTN4eHggKm1jMTN4eHgpCiB7CiAJc3RydWN0IG1jMTN4eHhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQpAQCAtNTY5LDE1ICs1NTcsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWMxM3h4eF9nZXRfZmxhZ3MpOwogCi0jZGVmaW5lIE1DMTM3ODNfQURDMV9DSEFOMF9TSElGVAk1Ci0jZGVmaW5lIE1DMTM3ODNfQURDMV9DSEFOMV9TSElGVAk4CisjZGVmaW5lIE1DMTNYWFhfQURDMV9DSEFOMF9TSElGVAk1CisjZGVmaW5lIE1DMTNYWFhfQURDMV9DSEFOMV9TSElGVAk4CiAKIHN0cnVjdCBtYzEzeHh4X2FkY2RvbmVfZGF0YSB7CiAJc3RydWN0IG1jMTN4eHggKm1jMTN4eHg7CiAJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBtYzEzNzgzX2hhbmRsZXJfYWRjZG9uZShpbnQgaXJxLCB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IG1jMTN4eHhfaGFuZGxlcl9hZGNkb25lKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG1jMTN4eHhfYWRjZG9uZV9kYXRhICphZGNkb25lX2RhdGEgPSBkYXRhOwogCkBAIC01ODgsMTIgKzU3NiwxMSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2RlZmluZSBNQzEzNzgzX0FEQ19XT1JLSU5HICgxIDw8IDApCisjZGVmaW5lIE1DMTNYWFhfQURDX1dPUktJTkcgKDEgPDwgMCkKIAotaW50IG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24oc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBtb2RlLAoraW50IG1jMTN4eHhfYWRjX2RvX2NvbnZlcnNpb24oc3RydWN0IG1jMTN4eHggKm1jMTN4eHgsIHVuc2lnbmVkIGludCBtb2RlLAogCQl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50ICpzYW1wbGUpCiB7Ci0Jc3RydWN0IG1jMTN4eHggKm1jMTN4eHggPSAmbWMxMzc4My0+bWMxM3h4eDsKIAl1MzIgYWRjMCwgYWRjMSwgb2xkX2FkYzA7CiAJaW50IGksIHJldDsKIAlzdHJ1Y3QgbWMxM3h4eF9hZGNkb25lX2RhdGEgYWRjZG9uZV9kYXRhID0gewpAQCAtNjA1LDUxICs1OTIsNTEgQEAKIAogCW1jMTN4eHhfbG9jayhtYzEzeHh4KTsKIAotCWlmIChtYzEzNzgzLT5hZGNmbGFncyAmIE1DMTM3ODNfQURDX1dPUktJTkcpIHsKKwlpZiAobWMxM3h4eC0+YWRjZmxhZ3MgJiBNQzEzWFhYX0FEQ19XT1JLSU5HKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQogCi0JbWMxMzc4My0+YWRjZmxhZ3MgfD0gTUMxMzc4M19BRENfV09SS0lORzsKKwltYzEzeHh4LT5hZGNmbGFncyB8PSBNQzEzWFhYX0FEQ19XT1JLSU5HOwogCi0JbWMxM3h4eF9yZWdfcmVhZChtYzEzeHh4LCBNQzEzNzgzX0FEQzAsICZvbGRfYWRjMCk7CisJbWMxM3h4eF9yZWdfcmVhZChtYzEzeHh4LCBNQzEzWFhYX0FEQzAsICZvbGRfYWRjMCk7CiAKLQlhZGMwID0gTUMxMzc4M19BREMwX0FESU5DMSB8IE1DMTM3ODNfQURDMF9BRElOQzI7Ci0JYWRjMSA9IE1DMTM3ODNfQURDMV9BREVOIHwgTUMxMzc4M19BREMxX0FEVFJJR0lHTiB8IE1DMTM3ODNfQURDMV9BU0M7CisJYWRjMCA9IE1DMTNYWFhfQURDMF9BRElOQzEgfCBNQzEzWFhYX0FEQzBfQURJTkMyOworCWFkYzEgPSBNQzEzWFhYX0FEQzFfQURFTiB8IE1DMTNYWFhfQURDMV9BRFRSSUdJR04gfCBNQzEzWFhYX0FEQzFfQVNDOwogCiAJaWYgKGNoYW5uZWwgPiA3KQotCQlhZGMxIHw9IE1DMTM3ODNfQURDMV9BRFNFTDsKKwkJYWRjMSB8PSBNQzEzWFhYX0FEQzFfQURTRUw7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIE1DMTM3ODNfQURDX01PREVfVFM6Ci0JCWFkYzAgfD0gTUMxMzc4M19BREMwX0FEUkVGRU4gfCBNQzEzNzgzX0FEQzBfVFNNT0QwIHwKLQkJCU1DMTM3ODNfQURDMF9UU01PRDE7Ci0JCWFkYzEgfD0gNCA8PCBNQzEzNzgzX0FEQzFfQ0hBTjFfU0hJRlQ7CisJY2FzZSBNQzEzWFhYX0FEQ19NT0RFX1RTOgorCQlhZGMwIHw9IE1DMTNYWFhfQURDMF9BRFJFRkVOIHwgTUMxM1hYWF9BREMwX1RTTU9EMCB8CisJCQlNQzEzWFhYX0FEQzBfVFNNT0QxOworCQlhZGMxIHw9IDQgPDwgTUMxM1hYWF9BREMxX0NIQU4xX1NISUZUOwogCQlicmVhazsKIAotCWNhc2UgTUMxMzc4M19BRENfTU9ERV9TSU5HTEVfQ0hBTjoKLQkJYWRjMCB8PSBvbGRfYWRjMCAmIE1DMTM3ODNfQURDMF9UU01PRF9NQVNLOwotCQlhZGMxIHw9IChjaGFubmVsICYgMHg3KSA8PCBNQzEzNzgzX0FEQzFfQ0hBTjBfU0hJRlQ7Ci0JCWFkYzEgfD0gTUMxMzc4M19BREMxX1JBTkQ7CisJY2FzZSBNQzEzWFhYX0FEQ19NT0RFX1NJTkdMRV9DSEFOOgorCQlhZGMwIHw9IG9sZF9hZGMwICYgTUMxM1hYWF9BREMwX1RTTU9EX01BU0s7CisJCWFkYzEgfD0gKGNoYW5uZWwgJiAweDcpIDw8IE1DMTNYWFhfQURDMV9DSEFOMF9TSElGVDsKKwkJYWRjMSB8PSBNQzEzWFhYX0FEQzFfUkFORDsKIAkJYnJlYWs7CiAKLQljYXNlIE1DMTM3ODNfQURDX01PREVfTVVMVF9DSEFOOgotCQlhZGMwIHw9IG9sZF9hZGMwICYgTUMxMzc4M19BREMwX1RTTU9EX01BU0s7Ci0JCWFkYzEgfD0gNCA8PCBNQzEzNzgzX0FEQzFfQ0hBTjFfU0hJRlQ7CisJY2FzZSBNQzEzWFhYX0FEQ19NT0RFX01VTFRfQ0hBTjoKKwkJYWRjMCB8PSBvbGRfYWRjMCAmIE1DMTNYWFhfQURDMF9UU01PRF9NQVNLOworCQlhZGMxIHw9IDQgPDwgTUMxM1hYWF9BREMxX0NIQU4xX1NISUZUOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCW1jMTM3ODNfdW5sb2NrKG1jMTM3ODMpOworCQltYzEzeHh4X3VubG9jayhtYzEzeHh4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2X2RiZygmbWMxMzc4My0+bWMxM3h4eC5zcGlkZXYtPmRldiwgIiVzOiByZXF1ZXN0IGlycVxuIiwgX19mdW5jX18pOwotCW1jMTN4eHhfaXJxX3JlcXVlc3QobWMxM3h4eCwgTUMxMzc4M19JUlFfQURDRE9ORSwKLQkJCW1jMTM3ODNfaGFuZGxlcl9hZGNkb25lLCBfX2Z1bmNfXywgJmFkY2RvbmVfZGF0YSk7Ci0JbWMxM3h4eF9pcnFfYWNrKG1jMTN4eHgsIE1DMTM3ODNfSVJRX0FEQ0RPTkUpOworCWRldl9kYmcoJm1jMTN4eHgtPnNwaWRldi0+ZGV2LCAiJXM6IHJlcXVlc3QgaXJxXG4iLCBfX2Z1bmNfXyk7CisJbWMxM3h4eF9pcnFfcmVxdWVzdChtYzEzeHh4LCBNQzEzWFhYX0lSUV9BRENET05FLAorCQkJbWMxM3h4eF9oYW5kbGVyX2FkY2RvbmUsIF9fZnVuY19fLCAmYWRjZG9uZV9kYXRhKTsKKwltYzEzeHh4X2lycV9hY2sobWMxM3h4eCwgTUMxM1hYWF9JUlFfQURDRE9ORSk7CiAKLQltYzEzeHh4X3JlZ193cml0ZShtYzEzeHh4LCBNQzEzNzgzX0FEQzAsIGFkYzApOwotCW1jMTN4eHhfcmVnX3dyaXRlKG1jMTN4eHgsIE1DMTM3ODNfQURDMSwgYWRjMSk7CisJbWMxM3h4eF9yZWdfd3JpdGUobWMxM3h4eCwgTUMxM1hYWF9BREMwLCBhZGMwKTsKKwltYzEzeHh4X3JlZ193cml0ZShtYzEzeHh4LCBNQzEzWFhYX0FEQzEsIGFkYzEpOwogCiAJbWMxM3h4eF91bmxvY2sobWMxM3h4eCk7CiAKQEAgLTY2MCwyNyArNjQ3LDI3IEBACiAKIAltYzEzeHh4X2xvY2sobWMxM3h4eCk7CiAKLQltYzEzeHh4X2lycV9mcmVlKG1jMTN4eHgsIE1DMTM3ODNfSVJRX0FEQ0RPTkUsICZhZGNkb25lX2RhdGEpOworCW1jMTN4eHhfaXJxX2ZyZWUobWMxM3h4eCwgTUMxM1hYWF9JUlFfQURDRE9ORSwgJmFkY2RvbmVfZGF0YSk7CiAKIAlpZiAocmV0ID4gMCkKIAkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogCQkJcmV0ID0gbWMxM3h4eF9yZWdfcmVhZChtYzEzeHh4LAotCQkJCQlNQzEzNzgzX0FEQzIsICZzYW1wbGVbaV0pOworCQkJCQlNQzEzWFhYX0FEQzIsICZzYW1wbGVbaV0pOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKIAkJfQogCi0JaWYgKG1vZGUgPT0gTUMxMzc4M19BRENfTU9ERV9UUykKKwlpZiAobW9kZSA9PSBNQzEzWFhYX0FEQ19NT0RFX1RTKQogCQkvKiByZXN0b3JlIFRTTU9EICovCi0JCW1jMTN4eHhfcmVnX3dyaXRlKG1jMTN4eHgsIE1DMTM3ODNfQURDMCwgb2xkX2FkYzApOworCQltYzEzeHh4X3JlZ193cml0ZShtYzEzeHh4LCBNQzEzWFhYX0FEQzAsIG9sZF9hZGMwKTsKIAotCW1jMTM3ODMtPmFkY2ZsYWdzICY9IH5NQzEzNzgzX0FEQ19XT1JLSU5HOworCW1jMTN4eHgtPmFkY2ZsYWdzICY9IH5NQzEzWFhYX0FEQ19XT1JLSU5HOwogb3V0OgogCW1jMTN4eHhfdW5sb2NrKG1jMTN4eHgpOwogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24pOworRVhQT1JUX1NZTUJPTF9HUEwobWMxM3h4eF9hZGNfZG9fY29udmVyc2lvbik7CiAKIHN0YXRpYyBpbnQgbWMxM3h4eF9hZGRfc3ViZGV2aWNlX3BkYXRhKHN0cnVjdCBtYzEzeHh4ICptYzEzeHh4LAogCQljb25zdCBjaGFyICpmb3JtYXQsIHZvaWQgKnBkYXRhLCBzaXplX3QgcGRhdGFfc2l6ZSkKQEAgLTcxNiw2ICs3MDMsMTEgQEAKIAllbnVtIG1jMTN4eHhfaWQgaWQ7CiAJaW50IHJldDsKIAorCWlmICghcGRhdGEpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltYzEzeHh4ID0ga3phbGxvYyhzaXplb2YoKm1jMTN4eHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1jMTN4eHgpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzYzLDEwICs3NTUsOCBAQAogCWlmIChwZGF0YS0+ZmxhZ3MgJiBNQzEzWFhYX1VTRV9DT0RFQykKIAkJbWMxM3h4eF9hZGRfc3ViZGV2aWNlKG1jMTN4eHgsICIlcy1jb2RlYyIpOwogCi0JaWYgKHBkYXRhLT5mbGFncyAmIE1DMTNYWFhfVVNFX1JFR1VMQVRPUikgewotCQltYzEzeHh4X2FkZF9zdWJkZXZpY2VfcGRhdGEobWMxM3h4eCwgIiVzLXJlZ3VsYXRvciIsCi0JCQkJJnBkYXRhLT5yZWd1bGF0b3JzLCBzaXplb2YocGRhdGEtPnJlZ3VsYXRvcnMpKTsKLQl9CisJbWMxM3h4eF9hZGRfc3ViZGV2aWNlX3BkYXRhKG1jMTN4eHgsICIlcy1yZWd1bGF0b3IiLAorCQkmcGRhdGEtPnJlZ3VsYXRvcnMsIHNpemVvZihwZGF0YS0+cmVndWxhdG9ycykpOwogCiAJaWYgKHBkYXRhLT5mbGFncyAmIE1DMTNYWFhfVVNFX1JUQykKIAkJbWMxM3h4eF9hZGRfc3ViZGV2aWNlKG1jMTN4eHgsICIlcy1ydGMiKTsKQEAgLTc3NCwxMCArNzY0LDE0IEBACiAJaWYgKHBkYXRhLT5mbGFncyAmIE1DMTNYWFhfVVNFX1RPVUNIU0NSRUVOKQogCQltYzEzeHh4X2FkZF9zdWJkZXZpY2UobWMxM3h4eCwgIiVzLXRzIik7CiAKLQlpZiAocGRhdGEtPmZsYWdzICYgTUMxM1hYWF9VU0VfTEVEKQorCWlmIChwZGF0YS0+bGVkcykKIAkJbWMxM3h4eF9hZGRfc3ViZGV2aWNlX3BkYXRhKG1jMTN4eHgsICIlcy1sZWQiLAogCQkJCXBkYXRhLT5sZWRzLCBzaXplb2YoKnBkYXRhLT5sZWRzKSk7CiAKKwlpZiAocGRhdGEtPmJ1dHRvbnMpCisJCW1jMTN4eHhfYWRkX3N1YmRldmljZV9wZGF0YShtYzEzeHh4LCAiJXMtcHdyYnV0dG9uIiwKKwkJCQlwZGF0YS0+YnV0dG9ucywgc2l6ZW9mKCpwZGF0YS0+YnV0dG9ucykpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21lbmVsYXVzLmMgYi9kcml2ZXJzL21mZC9tZW5lbGF1cy5jCmluZGV4IDljZWU4ZTcuLmNiNDkxMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21lbmVsYXVzLmMKKysrIGIvZHJpdmVycy9tZmQvbWVuZWxhdXMuYwpAQCAtNDQsNyArNDQsNyBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPHBsYXQvbWVuZWxhdXMuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRQkJCSJtZW5lbGF1cyIKQEAgLTEyMjYsNyArMTIyNiw3IEBACiAJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMSwgMHg3Myk7CiAKIAlpZiAoY2xpZW50LT5pcnEgPiAwKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBtZW5lbGF1c19pcnEsIElSUUZfRElTQUJMRUQsCisJCWVyciA9IHJlcXVlc3RfaXJxKGNsaWVudC0+aXJxLCBtZW5lbGF1c19pcnEsIDAsCiAJCQkJICBEUklWRVJfTkFNRSwgbWVuZWxhdXMpOwogCQlpZiAoZXJyKSB7CiAJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tZmQtY29yZS5jIGIvZHJpdmVycy9tZmQvbWZkLWNvcmUuYwppbmRleCAwOTAyNTIzLi4wZjU5MjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tZmQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIGludCBtZmRfY2VsbF9lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYwppbmRleCA1Nzg2ODQxNi4uZmYxYTdlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYwpAQCAtMjMsNDUgKzIzLDIyIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvY29yZS5oPgogCi1zdGF0aWMgaW50IF9fcGNmNTA2MzNfcmVhZChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLCBpbnQgbnVtLCB1OCAqZGF0YSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEocGNmLT5pMmNfY2xpZW50LCByZWcsCi0JCQkJbnVtLCBkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihwY2YtPmRldiwgIkVycm9yIHJlYWRpbmcgJWQgcmVncyBhdCAlZFxuIiwgbnVtLCByZWcpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX3BjZjUwNjMzX3dyaXRlKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIGludCBudW0sIHU4ICpkYXRhKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEocGNmLT5pMmNfY2xpZW50LCByZWcsCi0JCQkJbnVtLCBkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihwY2YtPmRldiwgIkVycm9yIHdyaXRpbmcgJWQgcmVncyBhdCAlZFxuIiwgbnVtLCByZWcpOwotCi0JcmV0dXJuIHJldDsKLQotfQotCiAvKiBSZWFkIGEgYmxvY2sgb2YgdXAgdG8gMzIgcmVncyAgKi8KIGludCBwY2Y1MDYzM19yZWFkX2Jsb2NrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsCiAJCQkJCWludCBucl9yZWdzLCB1OCAqZGF0YSkKIHsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKLQlyZXQgPSBfX3BjZjUwNjMzX3JlYWQocGNmLCByZWcsIG5yX3JlZ3MsIGRhdGEpOwotCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKKwlyZXQgPSByZWdtYXBfcmF3X3JlYWQocGNmLT5yZWdtYXAsIHJlZywgZGF0YSwgbnJfcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbnJfcmVnczsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlYWRfYmxvY2spOwogCkBAIC03MSwyMSArNDgsMjIgQEAKIHsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKLQlyZXQgPSBfX3BjZjUwNjMzX3dyaXRlKHBjZiwgcmVnLCBucl9yZWdzLCBkYXRhKTsKLQltdXRleF91bmxvY2soJnBjZi0+bG9jayk7CisJcmV0ID0gcmVnbWFwX3Jhd193cml0ZShwY2YtPnJlZ21hcCwgcmVnLCBkYXRhLCBucl9yZWdzKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBucl9yZWdzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfd3JpdGVfYmxvY2spOwogCiB1OCBwY2Y1MDYzM19yZWdfcmVhZChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnKQogewotCXU4IHZhbDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCV9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCXJldCA9IHJlZ21hcF9yZWFkKHBjZi0+cmVnbWFwLCByZWcsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CiAKIAlyZXR1cm4gdmFsOwogfQpAQCAtOTMsNTYgKzcxLDE5IEBACiAKIGludCBwY2Y1MDYzM19yZWdfd3JpdGUoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgdTggdmFsKQogewotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIDEsICZ2YWwpOwotCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlZ21hcF93cml0ZShwY2YtPnJlZ21hcCwgcmVnLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfcmVnX3dyaXRlKTsKIAogaW50IHBjZjUwNjMzX3JlZ19zZXRfYml0X21hc2soc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgdTggbWFzaywgdTggdmFsKQogewotCWludCByZXQ7Ci0JdTggdG1wOwotCi0JdmFsICY9IG1hc2s7Ci0KLQltdXRleF9sb2NrKCZwY2YtPmxvY2spOwotCXJldCA9IF9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnRtcCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JdG1wICY9IH5tYXNrOwotCXRtcCB8PSB2YWw7Ci0JcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgMSwgJnRtcCk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnBjZi0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocGNmLT5yZWdtYXAsIHJlZywgbWFzaywgdmFsKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ19zZXRfYml0X21hc2spOwogCiBpbnQgcGNmNTA2MzNfcmVnX2NsZWFyX2JpdHMoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgdTggdmFsKQogewotCWludCByZXQ7Ci0JdTggdG1wOwotCi0JbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKLQlyZXQgPSBfX3BjZjUwNjMzX3JlYWQocGNmLCByZWcsIDEsICZ0bXApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCXRtcCAmPSB+dmFsOwotCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIDEsICZ0bXApOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjZi0+cmVnbWFwLCByZWcsIHZhbCwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19yZWdfY2xlYXJfYml0cyk7CiAKQEAgLTI1MSw2ICsxOTIsMTEgQEAKIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHBjZjUwNjMzX3BtLCBwY2Y1MDYzM19zdXNwZW5kLCBwY2Y1MDYzM19yZXN1bWUpOwogCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgcGNmNTA2MzNfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2Y1MDYzM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZHMpCiB7CkBAIC0yNzIsMTYgKzIxOCwyMyBAQAogCiAJbXV0ZXhfaW5pdCgmcGNmLT5sb2NrKTsKIAorCXBjZi0+cmVnbWFwID0gcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnBjZjUwNjMzX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocGNmLT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocGNmLT5yZWdtYXApOworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcDogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9mcmVlOworCX0KKwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBjZik7CiAJcGNmLT5kZXYgPSAmY2xpZW50LT5kZXY7Ci0JcGNmLT5pMmNfY2xpZW50ID0gY2xpZW50OwogCiAJdmVyc2lvbiA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgMCk7CiAJdmFyaWFudCA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgMSk7CiAJaWYgKHZlcnNpb24gPCAwIHx8IHZhcmlhbnQgPCAwKSB7CiAJCWRldl9lcnIocGNmLT5kZXYsICJVbmFibGUgdG8gcHJvYmUgcGNmNTA2MzNcbiIpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9mcmVlOworCQlnb3RvIGVycl9yZWdtYXA7CiAJfQogCiAJZGV2X2luZm8ocGNmLT5kZXYsICJQcm9iZWQgZGV2aWNlIHZlcnNpb24gJWQgdmFyaWFudCAlZFxuIiwKQEAgLTMyOCw2ICsyODEsOCBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycl9yZWdtYXA6CisJcmVnbWFwX2V4aXQocGNmLT5yZWdtYXApOwogZXJyX2ZyZWU6CiAJa2ZyZWUocGNmKTsKIApAQCAtMzUxLDYgKzMwNiw3IEBACiAJZm9yIChpID0gMDsgaSA8IFBDRjUwNjMzX05VTV9SRUdVTEFUT1JTOyBpKyspCiAJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBjZi0+cmVndWxhdG9yX3BkZXZbaV0pOwogCisJcmVnbWFwX2V4aXQocGNmLT5yZWdtYXApOwogCWtmcmVlKHBjZik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWlycS5jIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtaXJxLmMKaW5kZXggMWIwMTkyZi4uMDQ4YTNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtaXJxLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90YzM1ODl4LmMgYi9kcml2ZXJzL21mZC90YzM1ODl4LmMKaW5kZXggYzI3ZTUxNS4uZGU5Nzk3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdGMzNTg5eC5jCisrKyBiL2RyaXZlcnMvbWZkL3RjMzU4OXguYwpAQCAtMzU3LDYgKzM1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgdGMzNTg5eF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMzg3LDYgKzM4OCw3IEBACiAKIHN0YXRpYyBjb25zdCBTSU1QTEVfREVWX1BNX09QUyh0YzM1ODl4X2Rldl9wbV9vcHMsIHRjMzU4OXhfc3VzcGVuZCwKIAkJCQkJCXRjMzU4OXhfcmVzdW1lKTsKKyNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGMzNTg5eF9pZFtdID0gewogCXsgInRjMzU4OXgiLCAyNCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jIGIvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jCmluZGV4IDY5Njg3OWUuLjAyZDY1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RpbWJlcmRhbGUuYworKysgYi9kcml2ZXJzL21mZC90aW1iZXJkYWxlLmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCQlkZXZfZXJyKCZkZXYtPmRldiwgIlRoZSBkcml2ZXIgc3VwcG9ydHMgYW4gb2xkZXIgIgogCQkJInZlcnNpb24gb2YgdGhlIEZQR0EsIHBsZWFzZSB1cGRhdGUgdGhlIGRyaXZlciB0byAiCiAJCQkic3VwcG9ydCAlZC4lZFxuIiwgcHJpdi0+ZncubWFqb3IsIHByaXYtPmZ3Lm1pbm9yKTsKLQkJZ290byBlcnJfaW9yZW1hcDsKKwkJZ290byBlcnJfY29uZmlnOwogCX0KIAlpZiAocHJpdi0+ZncubWFqb3IgPCBUSU1CX1NVUFBPUlRFRF9NQUpPUiB8fAogCQlwcml2LT5mdy5taW5vciA8IFRJTUJfUkVRVUlSRURfTUlOT1IpIHsKQEAgLTcwNSwxMyArNzA1LDEzIEBACiAJCQkicGxlYXNlIHVwZ3JhZGUgdGhlIEZQR0EgdG8gYXQgbGVhc3Q6ICVkLiVkXG4iLAogCQkJcHJpdi0+ZncubWFqb3IsIHByaXYtPmZ3Lm1pbm9yLAogCQkJVElNQl9TVVBQT1JURURfTUFKT1IsIFRJTUJfUkVRVUlSRURfTUlOT1IpOwotCQlnb3RvIGVycl9pb3JlbWFwOworCQlnb3RvIGVycl9jb25maWc7CiAJfQogCiAJbXNpeF9lbnRyaWVzID0ga3phbGxvYyhUSU1CRVJEQUxFX05SX0lSUVMgKiBzaXplb2YoKm1zaXhfZW50cmllcyksCiAJCUdGUF9LRVJORUwpOwogCWlmICghbXNpeF9lbnRyaWVzKQotCQlnb3RvIGVycl9pb3JlbWFwOworCQlnb3RvIGVycl9jb25maWc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVElNQkVSREFMRV9OUl9JUlFTOyBpKyspCiAJCW1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CkBAIC04MjUsNiArODI1LDggQEAKIGVycl9jcmVhdGVfZmlsZToKIAlwY2lfZGlzYWJsZV9tc2l4KGRldik7CiBlcnJfbXNpeDoKKwlrZnJlZShtc2l4X2VudHJpZXMpOworZXJyX2NvbmZpZzoKIAlpb3VubWFwKHByaXYtPmN0bF9tZW1iYXNlKTsKIGVycl9pb3JlbWFwOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5jdGxfbWFwYmFzZSwgQ0hJUENUTFNJWkUpOwpAQCAtODMzLDcgKzgzNSw2IEBACiBlcnJfc3RhcnQ6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiBlcnJfZW5hYmxlOgotCWtmcmVlKG1zaXhfZW50cmllcyk7CiAJa2ZyZWUocHJpdik7CiAJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90bWlvX2NvcmUuYyBiL2RyaXZlcnMvbWZkL3RtaW9fY29yZS5jCmluZGV4IGVkZGMxOWEuLjgzYWY3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RtaW9fY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3RtaW9fY29yZS5jCkBAIC02LDYgKzYsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90bWlvLmg+CiAKIGludCB0bWlvX2NvcmVfbW1jX2VuYWJsZSh2b2lkIF9faW9tZW0gKmNuZiwgaW50IHNoaWZ0LCB1bnNpZ25lZCBsb25nIGJhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMi1jb3JlLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1jb3JlLmMKaW5kZXggOTU1YmMwMC4uNWZlYzIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLWNvcmUuYwpAQCAtMTMxLDkgKzEzMSw2IEBACiAJaWYgKGluaXRfZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluaXRfZGF0YS0+aXJxID0gcG1pY19wbGF0X2RhdGEtPmlycTsKLQlpbml0X2RhdGEtPmlycV9iYXNlID0gcG1pY19wbGF0X2RhdGEtPmlycTsKLQogCW11dGV4X2luaXQoJnRwczY1OTEyLT5pb19tdXRleCk7CiAJZGV2X3NldF9kcnZkYXRhKHRwczY1OTEyLT5kZXYsIHRwczY1OTEyKTsKIApAQCAtMTUzLDEwICsxNTAsMTMgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKKwlpbml0X2RhdGEtPmlycSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CisJaW5pdF9kYXRhLT5pcnFfYmFzZSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CiAJcmV0ID0gdHBzNjU5MTJfaXJxX2luaXQodHBzNjU5MTIsIGluaXRfZGF0YS0+aXJxLCBpbml0X2RhdGEpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAorCWtmcmVlKGluaXRfZGF0YSk7CiAJcmV0dXJuIHJldDsKIAogZXJyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKaW5kZXggMDFlY2ZlZS4uYmZiZDY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC90d2wtY29yZS5jCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTEwOSw3ICsxMTAsNyBAQAogI2RlZmluZSB0d2xfaGFzX3dhdGNoZG9nKCkgICAgICAgIGZhbHNlCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1RXTDQwMzBfQ09ERUMpIHx8IGRlZmluZWQoQ09ORklHX1RXTDQwMzBfQ09ERUNfTU9EVUxFKSB8fFwKKyNpZiBkZWZpbmVkKENPTkZJR19NRkRfVFdMNDAzMF9BVURJTykgfHwgZGVmaW5lZChDT05GSUdfTUZEX1RXTDQwMzBfQVVESU9fTU9EVUxFKSB8fFwKIAlkZWZpbmVkKENPTkZJR19UV0w2MDQwX0NPUkUpIHx8IGRlZmluZWQoQ09ORklHX1RXTDYwNDBfQ09SRV9NT0RVTEUpCiAjZGVmaW5lIHR3bF9oYXNfY29kZWMoKQl0cnVlCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKaW5kZXggOGE3ZWUzMS4uZjA2MmM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CkBAIC0yNzgsNTkgKzI3Nyw2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCB0d2w0MDMwX2lycV9iYXNlOwogCi1zdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gaXJxX2V2ZW50OwotCi0vKgotICogVGhpcyB0aHJlYWQgcHJvY2Vzc2VzIGludGVycnVwdHMgcmVwb3J0ZWQgYnkgdGhlIFByaW1hcnkgSW50ZXJydXB0IEhhbmRsZXIuCi0gKi8KLXN0YXRpYyBpbnQgdHdsNDAzMF9pcnFfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0JbG9uZyBpcnEgPSAobG9uZylkYXRhOwotCXN0YXRpYyB1bnNpZ25lZCBpMmNfZXJyb3JzOwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfaTJjX2Vycm9ycyA9IDEwMDsKLQotCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlpbnQgcmV0OwotCQlpbnQgbW9kdWxlX2lycTsKLQkJdTggcGloX2lzcjsKLQotCQkvKiBXYWl0IGZvciBJUlEsIHRoZW4gcmVhZCBQSUggaXJxIHN0YXR1cyAoYWxzbyBibG9ja2luZykgKi8KLQkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZpcnFfZXZlbnQpOwotCi0JCXJldCA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9QSUgsICZwaWhfaXNyLAotCQkJCQkgIFJFR19QSUhfSVNSX1AxKTsKLQkJaWYgKHJldCkgewotCQkJcHJfd2FybmluZygidHdsNDAzMDogSTJDIGVycm9yICVkIHJlYWRpbmcgUElIIElTUlxuIiwKLQkJCQkJcmV0KTsKLQkJCWlmICgrK2kyY19lcnJvcnMgPj0gbWF4X2kyY19lcnJvcnMpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIk1heGltdW0gSTJDIGVycm9yIGNvdW50IgotCQkJCQkJIiBleGNlZWRlZC4gIFRlcm1pbmF0aW5nICVzLlxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvbXBsZXRlKCZpcnFfZXZlbnQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiB0aGVzZSBoYW5kbGVycyBkZWFsIHdpdGggdGhlIHJlbGV2YW50IFNJSCBpcnEgc3RhdHVzICovCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWZvciAobW9kdWxlX2lycSA9IHR3bDQwMzBfaXJxX2Jhc2U7Ci0JCQkJcGloX2lzcjsKLQkJCQlwaWhfaXNyID4+PSAxLCBtb2R1bGVfaXJxKyspIHsKLQkJCWlmIChwaWhfaXNyICYgMHgxKQotCQkJCWdlbmVyaWNfaGFuZGxlX2lycShtb2R1bGVfaXJxKTsKLQkJfQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQkJZW5hYmxlX2lycShpcnEpOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKgogICogaGFuZGxlX3R3bDQwMzBfcGloKCkgaXMgdGhlIGRlc2MtPmhhbmRsZSBtZXRob2QgZm9yIHRoZSB0d2w0MDMwIGludGVycnVwdC4KICAqIFRoaXMgaXMgYSBjaGFpbmVkIGludGVycnVwdCwgc28gdGhlcmUgaXMgbm8gZGVzYy0+YWN0aW9uIG1ldGhvZCBmb3IgaXQuCkBAIC0zNDIsOSArMjg4LDI1IEBACiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfdHdsNDAzMF9waWgoaW50IGlycSwgdm9pZCAqZGV2aWQpCiB7Ci0JLyogQWNrbm93bGVkZ2UsIGNsZWFyICpBTkQqIG1hc2sgdGhlIGludGVycnVwdC4uLiAqLwotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWNvbXBsZXRlKGRldmlkKTsKKwlpbnQJCW1vZHVsZV9pcnE7CisJaXJxcmV0dXJuX3QJcmV0OworCXU4CQlwaWhfaXNyOworCisJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX1BJSCwgJnBpaF9pc3IsCisJCQlSRUdfUElIX0lTUl9QMSk7CisJaWYgKHJldCkgeworCQlwcl93YXJuaW5nKCJ0d2w0MDMwOiBJMkMgZXJyb3IgJWQgcmVhZGluZyBQSUggSVNSXG4iLCByZXQpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogdGhlc2UgaGFuZGxlcnMgZGVhbCB3aXRoIHRoZSByZWxldmFudCBTSUggaXJxIHN0YXR1cyAqLworCWZvciAobW9kdWxlX2lycSA9IHR3bDQwMzBfaXJxX2Jhc2U7CisJCQlwaWhfaXNyOworCQkJcGloX2lzciA+Pj0gMSwgbW9kdWxlX2lycSsrKSB7CisJCWlmIChwaWhfaXNyICYgMHgxKQorCQkJaGFuZGxlX25lc3RlZF9pcnEobW9kdWxlX2lycSk7CisJfQorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQ2MCwxMTQgKzQyMiwxOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpaF9hZ2VudF9sb2NrKTsKLQotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKLQogc3RydWN0IHNpaF9hZ2VudCB7CiAJaW50CQkJaXJxX2Jhc2U7CiAJY29uc3Qgc3RydWN0IHNpaAkqc2loOwogCiAJdTMyCQkJaW1yOwogCWJvb2wJCQlpbXJfY2hhbmdlX3BlbmRpbmc7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CW1hc2tfd29yazsKIAogCXUzMgkJCWVkZ2VfY2hhbmdlOwotCXN0cnVjdCB3b3JrX3N0cnVjdAllZGdlX3dvcms7CisKKwlzdHJ1Y3QgbXV0ZXgJCWlycV9sb2NrOwogfTsKIAotc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfZG9fbWFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNpaF9hZ2VudAkqYWdlbnQ7Ci0JY29uc3Qgc3RydWN0IHNpaAkqc2loOwotCXVuaW9uIHsKLQkJdTgJYnl0ZXNbNF07Ci0JCXUzMgl3b3JkOwotCX0JCQlpbXI7Ci0JaW50CQkJc3RhdHVzOwotCi0JYWdlbnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNpaF9hZ2VudCwgbWFza193b3JrKTsKLQotCS8qIHNlZSB3aGF0IHdvcmsgd2UgaGF2ZSAqLwotCXNwaW5fbG9ja19pcnEoJnNpaF9hZ2VudF9sb2NrKTsKLQlpZiAoYWdlbnQtPmltcl9jaGFuZ2VfcGVuZGluZykgewotCQlzaWggPSBhZ2VudC0+c2loOwotCQkvKiBieXRlWzBdIGdldHMgb3ZlcndyaXR0ZW4gYXMgd2Ugd3JpdGUgLi4uICovCi0JCWltci53b3JkID0gY3B1X3RvX2xlMzIoYWdlbnQtPmltciA8PCA4KTsKLQkJYWdlbnQtPmltcl9jaGFuZ2VfcGVuZGluZyA9IGZhbHNlOwotCX0gZWxzZQotCQlzaWggPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycSgmc2loX2FnZW50X2xvY2spOwotCWlmICghc2loKQotCQlyZXR1cm47Ci0KLQkvKiB3cml0ZSB0aGUgd2hvbGUgbWFzayAuLi4gc2ltcGxlciB0aGFuIHN1YnNldHRpbmcgaXQgKi8KLQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBpbXIuYnl0ZXMsCi0JCQlzaWgtPm1hc2tbaXJxX2xpbmVdLmltcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfaXhyKTsKLQlpZiAoc3RhdHVzKQotCQlwcl9lcnIoInR3bDQwMzA6ICVzLCAlcyAtLT4gJWRcbiIsIF9fZnVuY19fLAotCQkJCSJ3cml0ZSIsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR3bDQwMzBfc2loX2RvX2VkZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzaWhfYWdlbnQJKmFnZW50OwotCWNvbnN0IHN0cnVjdCBzaWgJKnNpaDsKLQl1OAkJCWJ5dGVzWzZdOwotCXUzMgkJCWVkZ2VfY2hhbmdlOwotCWludAkJCXN0YXR1czsKLQotCWFnZW50ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzaWhfYWdlbnQsIGVkZ2Vfd29yayk7Ci0KLQkvKiBzZWUgd2hhdCB3b3JrIHdlIGhhdmUgKi8KLQlzcGluX2xvY2tfaXJxKCZzaWhfYWdlbnRfbG9jayk7Ci0JZWRnZV9jaGFuZ2UgPSBhZ2VudC0+ZWRnZV9jaGFuZ2U7Ci0JYWdlbnQtPmVkZ2VfY2hhbmdlID0gMDsKLQlzaWggPSBlZGdlX2NoYW5nZSA/IGFnZW50LT5zaWggOiBOVUxMOwotCXNwaW5fdW5sb2NrX2lycSgmc2loX2FnZW50X2xvY2spOwotCWlmICghc2loKQotCQlyZXR1cm47Ci0KLQkvKiBSZWFkLCByZXNlcnZpbmcgZmlyc3QgYnl0ZSBmb3Igd3JpdGUgc2NyYXRjaC4gIFllcywgdGhpcwotCSAqIGNvdWxkIGJlIGNhY2hlZCBmb3Igc29tZSBzcGVlZHVwIC4uLiBidXQgYmUgY2FyZWZ1bCBhYm91dAotCSAqIGFueSBwcm9jZXNzb3Igb24gdGhlIG90aGVyIElSUSBsaW5lLCBFRFIgcmVnaXN0ZXJzIGFyZQotCSAqIHNoYXJlZC4KLQkgKi8KLQlzdGF0dXMgPSB0d2xfaTJjX3JlYWQoc2loLT5tb2R1bGUsIGJ5dGVzICsgMSwKLQkJCXNpaC0+ZWRyX29mZnNldCwgc2loLT5ieXRlc19lZHIpOwotCWlmIChzdGF0dXMpIHsKLQkJcHJfZXJyKCJ0d2w0MDMwOiAlcywgJXMgLS0+ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkicmVhZCIsIHN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBNb2RpZnkgb25seSB0aGUgYml0cyB3ZSBrbm93IG11c3QgY2hhbmdlICovCi0Jd2hpbGUgKGVkZ2VfY2hhbmdlKSB7Ci0JCWludAkJaSA9IGZscyhlZGdlX2NoYW5nZSkgLSAxOwotCQlzdHJ1Y3QgaXJxX2RhdGEJKmlkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpICsgYWdlbnQtPmlycV9iYXNlKTsKLQkJaW50CQlieXRlID0gMSArIChpID4+IDIpOwotCQlpbnQJCW9mZiA9IChpICYgMHgzKSAqIDI7Ci0JCXVuc2lnbmVkIGludAl0eXBlOwotCi0JCWJ5dGVzW2J5dGVdICY9IH4oMHgwMyA8PCBvZmYpOwotCi0JCXR5cGUgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoaWRhdGEpOwotCQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQkJYnl0ZXNbYnl0ZV0gfD0gQklUKG9mZiArIDEpOwotCQlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykKLQkJCWJ5dGVzW2J5dGVdIHw9IEJJVChvZmYgKyAwKTsKLQotCQllZGdlX2NoYW5nZSAmPSB+QklUKGkpOwotCX0KLQotCS8qIFdyaXRlICovCi0Jc3RhdHVzID0gdHdsX2kyY193cml0ZShzaWgtPm1vZHVsZSwgYnl0ZXMsCi0JCQlzaWgtPmVkcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfZWRyKTsKLQlpZiAoc3RhdHVzKQotCQlwcl9lcnIoInR3bDQwMzA6ICVzLCAlcyAtLT4gJWRcbiIsIF9fZnVuY19fLAotCQkJCSJ3cml0ZSIsIHN0YXR1cyk7Ci19Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCkBAIC01NzksNTAgKzQ0NSwxMjUgQEAKIAogc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHNpaF9hZ2VudCAqc2loID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2loX2FnZW50ICphZ2VudCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7Ci0Jc2loLT5pbXIgfD0gQklUKGRhdGEtPmlycSAtIHNpaC0+aXJxX2Jhc2UpOwotCXNpaC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gdHJ1ZTsKLQlxdWV1ZV93b3JrKHdxLCAmc2loLT5tYXNrX3dvcmspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7CisJYWdlbnQtPmltciB8PSBCSVQoZGF0YS0+aXJxIC0gYWdlbnQtPmlycV9iYXNlKTsKKwlhZ2VudC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc2loX2FnZW50ICpzaWggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzaWhfYWdlbnQgKmFnZW50ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKLQlzaWgtPmltciAmPSB+QklUKGRhdGEtPmlycSAtIHNpaC0+aXJxX2Jhc2UpOwotCXNpaC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gdHJ1ZTsKLQlxdWV1ZV93b3JrKHdxLCAmc2loLT5tYXNrX3dvcmspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7CisJYWdlbnQtPmltciAmPSB+QklUKGRhdGEtPmlycSAtIGFnZW50LT5pcnFfYmFzZSk7CisJYWdlbnQtPmltcl9jaGFuZ2VfcGVuZGluZyA9IHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgdHdsNDAzMF9zaWhfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCB0cmlnZ2VyKQogewotCXN0cnVjdCBzaWhfYWdlbnQgKnNpaCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNpaF9hZ2VudCAqYWdlbnQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAogCWlmICh0cmlnZ2VyICYgfihJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9FREdFX1JJU0lORykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7Ci0JaWYgKGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkYXRhKSAhPSB0cmlnZ2VyKSB7Ci0JCXNpaC0+ZWRnZV9jaGFuZ2UgfD0gQklUKGRhdGEtPmlycSAtIHNpaC0+aXJxX2Jhc2UpOwotCQlxdWV1ZV93b3JrKHdxLCAmc2loLT5lZGdlX3dvcmspOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaWhfYWdlbnRfbG9jaywgZmxhZ3MpOworCWlmIChpcnFkX2dldF90cmlnZ2VyX3R5cGUoZGF0YSkgIT0gdHJpZ2dlcikKKwkJYWdlbnQtPmVkZ2VfY2hhbmdlIHw9IEJJVChkYXRhLT5pcnEgLSBhZ2VudC0+aXJxX2Jhc2UpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHR3bDQwMzBfc2loX2J1c19sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2loX2FnZW50CSphZ2VudCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCisJbXV0ZXhfbG9jaygmYWdlbnQtPmlycV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2loX2FnZW50CSphZ2VudCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWNvbnN0IHN0cnVjdCBzaWgJKnNpaCA9IGFnZW50LT5zaWg7CisJaW50CQkJc3RhdHVzOworCisJaWYgKGFnZW50LT5pbXJfY2hhbmdlX3BlbmRpbmcpIHsKKwkJdW5pb24geworCQkJdTMyCXdvcmQ7CisJCQl1OAlieXRlc1s0XTsKKwkJfSBpbXI7CisKKwkJLyogYnl0ZVswXSBnZXRzIG92ZXJ3cml0ZW4gYXMgd2Ugd3JpdGUgLi4uICovCisJCWltci53b3JkID0gY3B1X3RvX2xlMzIoYWdlbnQtPmltciA8PCA4KTsKKwkJYWdlbnQtPmltcl9jaGFuZ2VfcGVuZGluZyA9IGZhbHNlOworCisJCS8qIHdyaXRlIHRoZSB3aG9sZSBtYXNrIC4uLiBzaW1wbGVyIHRoYW4gc3Vic2V0dGluZyBpdCAqLworCQlzdGF0dXMgPSB0d2xfaTJjX3dyaXRlKHNpaC0+bW9kdWxlLCBpbXIuYnl0ZXMsCisJCQkJc2loLT5tYXNrW2lycV9saW5lXS5pbXJfb2Zmc2V0LAorCQkJCXNpaC0+Ynl0ZXNfaXhyKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2VycigidHdsNDAzMDogJXMsICVzIC0tPiAlZFxuIiwgX19mdW5jX18sCisJCQkJCSJ3cml0ZSIsIHN0YXR1cyk7CisJfQorCisJaWYgKGFnZW50LT5lZGdlX2NoYW5nZSkgeworCQl1MzIJCWVkZ2VfY2hhbmdlOworCQl1OAkJYnl0ZXNbNl07CisKKwkJZWRnZV9jaGFuZ2UgPSBhZ2VudC0+ZWRnZV9jaGFuZ2U7CisJCWFnZW50LT5lZGdlX2NoYW5nZSA9IDA7CisKKwkJLyoKKwkJICogUmVhZCwgcmVzZXJ2aW5nIGZpcnN0IGJ5dGUgZm9yIHdyaXRlIHNjcmF0Y2guICBZZXMsIHRoaXMKKwkJICogY291bGQgYmUgY2FjaGVkIGZvciBzb21lIHNwZWVkdXAgLi4uIGJ1dCBiZSBjYXJlZnVsIGFib3V0CisJCSAqIGFueSBwcm9jZXNzb3Igb24gdGhlIG90aGVyIElSUSBsaW5lLCBFRFIgcmVnaXN0ZXJzIGFyZQorCQkgKiBzaGFyZWQuCisJCSAqLworCQlzdGF0dXMgPSB0d2xfaTJjX3JlYWQoc2loLT5tb2R1bGUsIGJ5dGVzICsgMSwKKwkJCQlzaWgtPmVkcl9vZmZzZXQsIHNpaC0+Ynl0ZXNfZWRyKTsKKwkJaWYgKHN0YXR1cykgeworCQkJcHJfZXJyKCJ0d2w0MDMwOiAlcywgJXMgLS0+ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJInJlYWQiLCBzdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogTW9kaWZ5IG9ubHkgdGhlIGJpdHMgd2Uga25vdyBtdXN0IGNoYW5nZSAqLworCQl3aGlsZSAoZWRnZV9jaGFuZ2UpIHsKKwkJCWludAkJaSA9IGZscyhlZGdlX2NoYW5nZSkgLSAxOworCQkJc3RydWN0IGlycV9kYXRhCSppZGF0YTsKKwkJCWludAkJYnl0ZSA9IDEgKyAoaSA+PiAyKTsKKwkJCWludAkJb2ZmID0gKGkgJiAweDMpICogMjsKKwkJCXVuc2lnbmVkIGludAl0eXBlOworCisJCQlpZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEoaSArIGFnZW50LT5pcnFfYmFzZSk7CisKKwkJCWJ5dGVzW2J5dGVdICY9IH4oMHgwMyA8PCBvZmYpOworCisJCQl0eXBlID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGlkYXRhKTsKKwkJCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCisJCQkJYnl0ZXNbYnl0ZV0gfD0gQklUKG9mZiArIDEpOworCQkJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJCQkJYnl0ZXNbYnl0ZV0gfD0gQklUKG9mZiArIDApOworCisJCQllZGdlX2NoYW5nZSAmPSB+QklUKGkpOworCQl9CisKKwkJLyogV3JpdGUgKi8KKwkJc3RhdHVzID0gdHdsX2kyY193cml0ZShzaWgtPm1vZHVsZSwgYnl0ZXMsCisJCQkJc2loLT5lZHJfb2Zmc2V0LCBzaWgtPmJ5dGVzX2Vkcik7CisJCWlmIChzdGF0dXMpCisJCQlwcl9lcnIoInR3bDQwMzA6ICVzLCAlcyAtLT4gJWRcbiIsIF9fZnVuY19fLAorCQkJCQkid3JpdGUiLCBzdGF0dXMpOworCX0KKworCW11dGV4X3VubG9jaygmYWdlbnQtPmlycV9sb2NrKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0d2w0MDMwX3NpaF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAidHdsNDAzMCIsCi0JLmlycV9tYXNrICAgICAgCT0gdHdsNDAzMF9zaWhfbWFzaywKKwkuaXJxX21hc2sJPSB0d2w0MDMwX3NpaF9tYXNrLAogCS5pcnFfdW5tYXNrCT0gdHdsNDAzMF9zaWhfdW5tYXNrLAogCS5pcnFfc2V0X3R5cGUJPSB0d2w0MDMwX3NpaF9zZXRfdHlwZSwKKwkuaXJxX2J1c19sb2NrCT0gdHdsNDAzMF9zaWhfYnVzX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sgPSB0d2w0MDMwX3NpaF9idXNfc3luY191bmxvY2ssCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjU1LDkgKzU5Niw3IEBACiAJaW50IGlzcjsKIAogCS8qIHJlYWRpbmcgSVNSIGFja3MgdGhlIElSUXMsIHVzaW5nIGNsZWFyLW9uLXJlYWQgbW9kZSAqLwotCWxvY2FsX2lycV9lbmFibGUoKTsKIAlpc3IgPSBzaWhfcmVhZF9pc3Ioc2loKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCiAJaWYgKGlzciA8IDApIHsKIAkJcHJfZXJyKCJ0d2w0MDMwOiAlcyBTSUgsIHJlYWQgSVNSIGVycm9yICVkXG4iLApAQCAtNjcyLDcgKzYxMSw3IEBACiAJCWlzciAmPSB+QklUKGlycSk7CiAKIAkJaWYgKGlycSA8IHNpaC0+Yml0cykKLQkJCWdlbmVyaWNfaGFuZGxlX2lycShhZ2VudC0+aXJxX2Jhc2UgKyBpcnEpOworCQkJaGFuZGxlX25lc3RlZF9pcnEoYWdlbnQtPmlycV9iYXNlICsgaXJxKTsKIAkJZWxzZQogCQkJcHJfZXJyKCJ0d2w0MDMwOiAlcyBTSUgsIGludmFsaWQgSVNSIGJpdCAlZFxuIiwKIAkJCQlzaWgtPm5hbWUsIGlycSk7CkBAIC03MTgsMTUgKzY1NywxNCBAQAogCWFnZW50LT5pcnFfYmFzZSA9IGlycV9iYXNlOwogCWFnZW50LT5zaWggPSBzaWg7CiAJYWdlbnQtPmltciA9IH4wOwotCUlOSVRfV09SSygmYWdlbnQtPm1hc2tfd29yaywgdHdsNDAzMF9zaWhfZG9fbWFzayk7Ci0JSU5JVF9XT1JLKCZhZ2VudC0+ZWRnZV93b3JrLCB0d2w0MDMwX3NpaF9kb19lZGdlKTsKKwltdXRleF9pbml0KCZhZ2VudC0+aXJxX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IHNpaC0+Yml0czsgaSsrKSB7CiAJCWlycSA9IGlycV9iYXNlICsgaTsKIAorCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGFnZW50KTsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJnR3bDQwMzBfc2loX2lycV9jaGlwLAogCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBhZ2VudCk7CiAJCWFjdGl2YXRlX2lycShpcnEpOwogCX0KIApAQCAtNzU4LDcgKzY5Niw2IEBACiAKIAlpbnQJCQlzdGF0dXM7CiAJaW50CQkJaTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CiAKIAkvKgogCSAqIE1hc2sgYW5kIGNsZWFyIGFsbCBUV0w0MDMwIGludGVycnVwdHMgc2luY2UgaW5pdGlhbGx5IHdlIGRvCkBAIC03NjgsMTIgKzcwNSw2IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAKLQl3cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ0d2w0MDMwLWlycWNoaXAiKTsKLQlpZiAoIXdxKSB7Ci0JCXByX2VycigidHdsNDAzMDogd29ya3F1ZXVlIEZBSUxcbiIpOwotCQlyZXR1cm4gLUVTUkNIOwotCX0KLQogCXR3bDQwMzBfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIAogCS8qIGluc3RhbGwgYW4gaXJxIGhhbmRsZXIgZm9yIGVhY2ggb2YgdGhlIFNJSCBtb2R1bGVzOwpAQCAtNzg3LDYgKzcxOCw3IEBACiAJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspIHsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZ0d2w0MDMwX2lycV9jaGlwLAogCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCQlpcnFfc2V0X25lc3RlZF90aHJlYWQoaSwgMSk7CiAJCWFjdGl2YXRlX2lycShpKTsKIAl9CiAJdHdsNDAzMF9pcnFfbmV4dCA9IGk7CkBAIC04MDEsMzQgKzczMywyMiBAQAogCX0KIAogCS8qIGluc3RhbGwgYW4gaXJxIGhhbmRsZXIgdG8gZGVtdWx0aXBsZXggdGhlIFRXTDQwMzAgaW50ZXJydXB0ICovCi0KLQotCWluaXRfY29tcGxldGlvbigmaXJxX2V2ZW50KTsKLQotCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGlycV9udW0sIGhhbmRsZV90d2w0MDMwX3BpaCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkiVFdMNDAzMC1QSUgiLCAmaXJxX2V2ZW50KTsKKwlzdGF0dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnFfbnVtLCBOVUxMLCBoYW5kbGVfdHdsNDAzMF9waWgsIDAsCisJCQkJCSJUV0w0MDMwLVBJSCIsIE5VTEwpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCXByX2VycigidHdsNDAzMDogY291bGQgbm90IGNsYWltIGlycSVkOiAlZFxuIiwgaXJxX251bSwgc3RhdHVzKTsKIAkJZ290byBmYWlsX3JxaXJxOwogCX0KIAotCXRhc2sgPSBrdGhyZWFkX3J1bih0d2w0MDMwX2lycV90aHJlYWQsICh2b2lkICopKGxvbmcpaXJxX251bSwKLQkJCQkJCQkJInR3bDQwMzAtaXJxIik7Ci0JaWYgKElTX0VSUih0YXNrKSkgewotCQlwcl9lcnIoInR3bDQwMzA6IGNvdWxkIG5vdCBjcmVhdGUgaXJxICVkIHRocmVhZCFcbiIsIGlycV9udW0pOwotCQlzdGF0dXMgPSBQVFJfRVJSKHRhc2spOwotCQlnb3RvIGZhaWxfa3RocmVhZDsKLQl9CiAJcmV0dXJuIHN0YXR1czsKLWZhaWxfa3RocmVhZDoKLQlmcmVlX2lycShpcnFfbnVtLCAmaXJxX2V2ZW50KTsKIGZhaWxfcnFpcnE6CiAJLyogY2xlYW4gdXAgdHdsNDAzMF9zaWhfc2V0dXAgKi8KIGZhaWw6Ci0JZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspCisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspIHsKKwkJaXJxX3NldF9uZXN0ZWRfdGhyZWFkKGksIDApOwogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgTlVMTCwgTlVMTCk7Ci0JZGVzdHJveV93b3JrcXVldWUod3EpOwotCXdxID0gTlVMTDsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w0MDMwLW1hZGMuYyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jCmluZGV4IDdjYmYyYWEuLjgzNGY4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jCkBAIC03NDAsNiArNzQwLDI4IEBACiAJCQlUV0w0MDMwX0JDSV9CQ0lDVEwxKTsKIAkJZ290byBlcnJfaTJjOwogCX0KKworCS8qIENoZWNrIHRoYXQgTUFEQyBjbG9jayBpcyBvbiAqLworCXJldCA9IHR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9JTlRCUiwgJnJlZ3ZhbCwgVFdMNDAzMF9SRUdfR1BCUjEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlYWQgcmVnIEdQQlIxIDB4JVhcbiIsCisJCQkJVFdMNDAzMF9SRUdfR1BCUjEpOworCQlnb3RvIGVycl9pMmM7CisJfQorCisJLyogSWYgTUFEQyBjbGsgaXMgbm90IG9uLCB0dXJuIGl0IG9uICovCisJaWYgKCEocmVndmFsICYgVFdMNDAzMF9HUEJSMV9NQURDX0hGQ0xLX0VOKSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY2xrIGRpc2FibGVkLCBlbmFibGluZ1xuIik7CisJCXJlZ3ZhbCB8PSBUV0w0MDMwX0dQQlIxX01BRENfSEZDTEtfRU47CisJCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5UQlIsIHJlZ3ZhbCwKKwkJCQkgICAgICAgVFdMNDAzMF9SRUdfR1BCUjEpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gd3JpdGUgcmVnIEdQQlIxIDB4JVhcbiIsCisJCQkJCVRXTDQwMzBfUkVHX0dQQlIxKTsKKwkJCWdvdG8gZXJyX2kyYzsKKwkJfQorCX0KKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1hZGMpOwogCW11dGV4X2luaXQoJm1hZGMtPmxvY2spOwogCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIE5VTEwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jIGIvZHJpdmVycy9tZmQvdHdsNjAzMC1pcnEuYwppbmRleCBlYjNiNWY4Li4zZWVlNDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMKQEAgLTMyLDExICszMiwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlICJ0d2wtY29yZS5oIgogCkBAIC04Myw4ICs4NSw0OCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHVuc2lnbmVkIHR3bDYwMzBfaXJxX2Jhc2U7CitzdGF0aWMgaW50IHR3bF9pcnE7CitzdGF0aWMgYm9vbCB0d2xfaXJxX3dha2VfZW5hYmxlZDsKIAogc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIGlycV9ldmVudDsKK3N0YXRpYyBhdG9taWNfdCB0d2w2MDMwX3dha2VpcnFzID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyBpbnQgdHdsNjAzMF9pcnFfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHBtX2V2ZW50LCB2b2lkICp1bnVzZWQpCit7CisJaW50IGNoYWluZWRfd2FrZXVwczsKKworCXN3aXRjaCAocG1fZXZlbnQpIHsKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwkJY2hhaW5lZF93YWtldXBzID0gYXRvbWljX3JlYWQoJnR3bDYwMzBfd2FrZWlycXMpOworCisJCWlmIChjaGFpbmVkX3dha2V1cHMgJiYgIXR3bF9pcnFfd2FrZV9lbmFibGVkKSB7CisJCQlpZiAoZW5hYmxlX2lycV93YWtlKHR3bF9pcnEpKQorCQkJCXByX2VycigidHdsNjAzMCBJUlEgd2FrZSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCWVsc2UKKwkJCQl0d2xfaXJxX3dha2VfZW5hYmxlZCA9IHRydWU7CisJCX0gZWxzZSBpZiAoIWNoYWluZWRfd2FrZXVwcyAmJiB0d2xfaXJxX3dha2VfZW5hYmxlZCkgeworCQkJZGlzYWJsZV9pcnFfd2FrZSh0d2xfaXJxKTsKKwkJCXR3bF9pcnFfd2FrZV9lbmFibGVkID0gZmFsc2U7CisJCX0KKworCQlkaXNhYmxlX2lycSh0d2xfaXJxKTsKKwkJYnJlYWs7CisKKwljYXNlIFBNX1BPU1RfU1VTUEVORDoKKwkJZW5hYmxlX2lycSh0d2xfaXJxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdHdsNjAzMF9pcnFfcG1fbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB0d2w2MDMwX2lycV9wbV9ub3RpZmllciwKK307CiAKIC8qCiAgKiBUaGlzIHRocmVhZCBwcm9jZXNzZXMgaW50ZXJydXB0cyByZXBvcnRlZCBieSB0aGUgUHJpbWFyeSBJbnRlcnJ1cHQgSGFuZGxlci4KQEAgLTE4Nyw2ICsyMjksMTYgQEAKICNlbmRpZgogfQogCitpbnQgdHdsNjAzMF9pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCit7CisJaWYgKG9uKQorCQlhdG9taWNfaW5jKCZ0d2w2MDMwX3dha2VpcnFzKTsKKwllbHNlCisJCWF0b21pY19kZWMoJnR3bDYwMzBfd2FrZWlycXMpOworCisJcmV0dXJuIDA7Cit9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyB1bnNpZ25lZCB0d2w2MDMwX2lycV9uZXh0OwpAQCAtMzE4LDEwICszNzAsMTIgQEAKIAl0d2w2MDMwX2lycV9jaGlwID0gZHVtbXlfaXJxX2NoaXA7CiAJdHdsNjAzMF9pcnFfY2hpcC5uYW1lID0gInR3bDYwMzAiOwogCXR3bDYwMzBfaXJxX2NoaXAuaXJxX3NldF90eXBlID0gTlVMTDsKKwl0d2w2MDMwX2lycV9jaGlwLmlycV9zZXRfd2FrZSA9IHR3bDYwMzBfaXJxX3NldF93YWtlOwogCiAJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfZW5kOyBpKyspIHsKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZ0d2w2MDMwX2lycV9jaGlwLAogCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCQlpcnFfc2V0X2NoaXBfZGF0YShpLCAodm9pZCAqKWlycV9udW0pOwogCQlhY3RpdmF0ZV9pcnEoaSk7CiAJfQogCkBAIC0zMzEsNiArMzg1LDE0IEBACiAKIAkvKiBpbnN0YWxsIGFuIGlycSBoYW5kbGVyIHRvIGRlbXVsdGlwbGV4IHRoZSBUV0w2MDMwIGludGVycnVwdCAqLwogCWluaXRfY29tcGxldGlvbigmaXJxX2V2ZW50KTsKKworCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGlycV9udW0sIGhhbmRsZV90d2w2MDMwX3BpaCwgMCwKKwkJCQkiVFdMNjAzMC1QSUgiLCAmaXJxX2V2ZW50KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcl9lcnIoInR3bDYwMzA6IGNvdWxkIG5vdCBjbGFpbSBpcnElZDogJWRcbiIsIGlycV9udW0sIHN0YXR1cyk7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCiAJdGFzayA9IGt0aHJlYWRfcnVuKHR3bDYwMzBfaXJxX3RocmVhZCwgKHZvaWQgKilpcnFfbnVtLCAidHdsNjAzMC1pcnEiKTsKIAlpZiAoSVNfRVJSKHRhc2spKSB7CiAJCXByX2VycigidHdsNjAzMDogY291bGQgbm90IGNyZWF0ZSBpcnEgJWQgdGhyZWFkIVxuIiwgaXJxX251bSk7CkBAIC0zMzgsMTcgKzQwMCwxNCBAQAogCQlnb3RvIGZhaWxfa3RocmVhZDsKIAl9CiAKLQlzdGF0dXMgPSByZXF1ZXN0X2lycShpcnFfbnVtLCBoYW5kbGVfdHdsNjAzMF9waWgsIElSUUZfRElTQUJMRUQsCi0JCQkJIlRXTDYwMzAtUElIIiwgJmlycV9ldmVudCk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJfZXJyKCJ0d2w2MDMwOiBjb3VsZCBub3QgY2xhaW0gaXJxJWQ6ICVkXG4iLCBpcnFfbnVtLCBzdGF0dXMpOwotCQlnb3RvIGZhaWxfaXJxOwotCX0KKwl0d2xfaXJxID0gaXJxX251bTsKKwlyZWdpc3Rlcl9wbV9ub3RpZmllcigmdHdsNjAzMF9pcnFfcG1fbm90aWZpZXJfYmxvY2spOwogCXJldHVybiBzdGF0dXM7Ci1mYWlsX2lycToKLQlmcmVlX2lycShpcnFfbnVtLCAmaXJxX2V2ZW50KTsKIAogZmFpbF9rdGhyZWFkOgorCWZyZWVfaXJxKGlycV9udW0sICZpcnFfZXZlbnQpOworCitmYWlsX2lycToKIAlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykKIAkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksIE5VTEwsIE5VTEwpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zNTYsNiArNDE1LDcgQEAKIAogaW50IHR3bDYwMzBfZXhpdF9pcnEodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ0d2w2MDMwX2lycV9wbV9ub3RpZmllcl9ibG9jayk7CiAKIAlpZiAodHdsNjAzMF9pcnFfYmFzZSkgewogCQlwcl9lcnIoInR3bDYwMzA6IGNhbid0IHlldCBjbGVhbiB1cCBJUlFzP1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w2MDQwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bDYwNDAtY29yZS5jCmluZGV4IDI0ZDQzNmMuLjI2OGY4MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDYwNDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDYwNDAtY29yZS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdHdsNjA0MC5oPgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdHdsNjA0MF9kZXY7CisjZGVmaW5lIFZJQlJBQ1RSTF9NRU1CRVIocmVnKSAoKHJlZyA9PSBUV0w2MDQwX1JFR19WSUJDVExMKSA/IDAgOiAxKQogCiBpbnQgdHdsNjA0MF9yZWdfcmVhZChzdHJ1Y3QgdHdsNjA0MCAqdHdsNjA0MCwgdW5zaWduZWQgaW50IHJlZykKIHsKQEAgLTQyLDEwICs0MiwxNiBAQAogCXU4IHZhbCA9IDA7CiAKIAltdXRleF9sb2NrKCZ0d2w2MDQwLT5pb19tdXRleCk7Ci0JcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfQVVESU9fVk9JQ0UsICZ2YWwsIHJlZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZ0d2w2MDQwLT5pb19tdXRleCk7Ci0JCXJldHVybiByZXQ7CisJLyogVmlicmEgY29udHJvbCByZWdpc3RlcnMgZnJvbSBjYWNoZSAqLworCWlmICh1bmxpa2VseShyZWcgPT0gVFdMNjA0MF9SRUdfVklCQ1RMTCB8fAorCQkgICAgIHJlZyA9PSBUV0w2MDQwX1JFR19WSUJDVExSKSkgeworCQl2YWwgPSB0d2w2MDQwLT52aWJyYV9jdHJsX2NhY2hlW1ZJQlJBQ1RSTF9NRU1CRVIocmVnKV07CisJfSBlbHNlIHsKKwkJcmV0ID0gdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfQVVESU9fVk9JQ0UsICZ2YWwsIHJlZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZ0d2w2MDQwLT5pb19tdXRleCk7CiAKQEAgLTU5LDYgKzY1LDkgQEAKIAogCW11dGV4X2xvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKIAlyZXQgPSB0d2xfaTJjX3dyaXRlX3U4KFRXTF9NT0RVTEVfQVVESU9fVk9JQ0UsIHZhbCwgcmVnKTsKKwkvKiBDYWNoZSB0aGUgdmlicmEgY29udHJvbCByZWdpc3RlcnMgKi8KKwlpZiAocmVnID09IFRXTDYwNDBfUkVHX1ZJQkNUTEwgfHwgcmVnID09IFRXTDYwNDBfUkVHX1ZJQkNUTFIpCisJCXR3bDYwNDAtPnZpYnJhX2N0cmxfY2FjaGVbVklCUkFDVFJMX01FTUJFUihyZWcpXSA9IHZhbDsKIAltdXRleF91bmxvY2soJnR3bDYwNDAtPmlvX211dGV4KTsKIAogCXJldHVybiByZXQ7CkBAIC0yMDMsMTEgKzIxMiwxMSBAQAogCWlmIChpbnRpZCAmIFRXTDYwNDBfVEhJTlQpIHsKIAkJc3RhdHVzID0gdHdsNjA0MF9yZWdfcmVhZCh0d2w2MDQwLCBUV0w2MDQwX1JFR19TVEFUVVMpOwogCQlpZiAoc3RhdHVzICYgVFdMNjA0MF9UU0hVVERFVCkgewotCQkJZGV2X3dhcm4oJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfd2Fybih0d2w2MDQwLT5kZXYsCiAJCQkJICJUaGVybWFsIHNodXRkb3duLCBwb3dlcmluZy1vZmYiKTsKIAkJCXR3bDYwNDBfcG93ZXIodHdsNjA0MCwgMCk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfd2FybigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCWRldl93YXJuKHR3bDYwNDAtPmRldiwKIAkJCQkgIkxlYXZpbmcgdGhlcm1hbCBzaHV0ZG93biwgcG93ZXJpbmctb24iKTsKIAkJCXR3bDYwNDBfcG93ZXIodHdsNjA0MCwgMSk7CiAJCX0KQEAgLTIyNyw3ICsyMzYsNyBAQAogCWlmICghdGltZV9sZWZ0KSB7CiAJCWludGlkID0gdHdsNjA0MF9yZWdfcmVhZCh0d2w2MDQwLCBUV0w2MDQwX1JFR19JTlRJRCk7CiAJCWlmICghKGludGlkICYgVFdMNjA0MF9SRUFEWUlOVCkpIHsKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkidGltZW91dCB3YWl0aW5nIGZvciBSRUFEWUlOVFxuIik7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQpAQCAtMjU1LDcgKzI2NCw3IEBACiAJCQkvKiB3YWl0IGZvciBwb3dlci11cCBjb21wbGV0aW9uICovCiAJCQlyZXQgPSB0d2w2MDQwX3Bvd2VyX3VwX2NvbXBsZXRpb24odHdsNjA0MCwgbmF1ZGludCk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwKKwkJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkJImF1dG9tYXRpYyBwb3dlci1kb3duIGZhaWxlZFxuIik7CiAJCQkJdHdsNjA0MC0+cG93ZXJfY291bnQgPSAwOwogCQkJCWdvdG8gb3V0OwpAQCAtMjY0LDcgKzI3Myw3IEBACiAJCQkvKiB1c2UgbWFudWFsIHBvd2VyLXVwIHNlcXVlbmNlICovCiAJCQlyZXQgPSB0d2w2MDQwX3Bvd2VyX3VwKHR3bDYwNDApOwogCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQkJZGV2X2Vycih0d2w2MDQwLT5kZXYsCiAJCQkJCSJtYW51YWwgcG93ZXItdXAgZmFpbGVkXG4iKTsKIAkJCQl0d2w2MDQwLT5wb3dlcl9jb3VudCA9IDA7CiAJCQkJZ290byBvdXQ7CkBAIC0yNzYsNyArMjg1LDcgQEAKIAl9IGVsc2UgewogCQkvKiBhbHJlYWR5IHBvd2VyZWQtZG93biAqLwogCQlpZiAoIXR3bDYwNDAtPnBvd2VyX2NvdW50KSB7Ci0JCQlkZXZfZXJyKCZ0d2w2MDQwX2Rldi0+ZGV2LAorCQkJZGV2X2Vycih0d2w2MDQwLT5kZXYsCiAJCQkJImRldmljZSBpcyBhbHJlYWR5IHBvd2VyZWQtb2ZmXG4iKTsKIAkJCXJldCA9IC1FUEVSTTsKIAkJCWdvdG8gb3V0OwpAQCAtMzI2LDcgKzMzNSw3IEBACiAJCQlscHBsbGN0bCAmPSB+VFdMNjA0MF9MUExMRklOOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKCZ0d2w2MDQwX2Rldi0+ZGV2LAorCQkJZGV2X2Vycih0d2w2MDQwLT5kZXYsCiAJCQkJImZyZXFfb3V0ICVkIG5vdCBzdXBwb3J0ZWRcbiIsIGZyZXFfb3V0KTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIHBsbF9vdXQ7CkBAIC0zNDcsNyArMzU2LDcgQEAKIAkJCQkJICBocHBsbGN0bCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkiZnJlcV9pbiAlZCBub3Qgc3VwcG9ydGVkXG4iLCBmcmVxX2luKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIHBsbF9vdXQ7CkBAIC0zNTYsNyArMzY1LDcgQEAKIAljYXNlIFRXTDYwNDBfU1lTQ0xLX1NFTF9IUFBMTDoKIAkJLyogaGlnaC1wZXJmb3JtYW5jZSBQTEwgY2FuIHByb3ZpZGUgb25seSAxOS4yIE1IeiAqLwogCQlpZiAoZnJlcV9vdXQgIT0gMTkyMDAwMDApIHsKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkiZnJlcV9vdXQgJWQgbm90IHN1cHBvcnRlZFxuIiwgZnJlcV9vdXQpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gcGxsX291dDsKQEAgLTM4OSw3ICszOTgsNyBAQAogCQkJCSAgICBUV0w2MDQwX0hQTExFTkE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnR3bDYwNDBfZGV2LT5kZXYsCisJCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwKIAkJCQkiZnJlcV9pbiAlZCBub3Qgc3VwcG9ydGVkXG4iLCBmcmVxX2luKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIHBsbF9vdXQ7CkBAIC00MDYsNyArNDE1LDcgQEAKIAkJdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgVFdMNjA0MF9SRUdfTFBQTExDVEwsIGxwcGxsY3RsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmdHdsNjA0MF9kZXYtPmRldiwgInVua25vd24gcGxsIGlkICVkXG4iLCBwbGxfaWQpOworCQlkZXZfZXJyKHR3bDYwNDAtPmRldiwgInVua25vd24gcGxsIGlkICVkXG4iLCBwbGxfaWQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHBsbF9vdXQ7CiAJfQpAQCAtNDM1LDYgKzQ0NCwxOCBAQAogfQogRVhQT1JUX1NZTUJPTCh0d2w2MDQwX2dldF9zeXNjbGspOwogCisvKiBHZXQgdGhlIGNvbWJpbmVkIHN0YXR1cyBvZiB0aGUgdmlicmEgY29udHJvbCByZWdpc3RlciAqLworaW50IHR3bDYwNDBfZ2V0X3ZpYnJhbHJfc3RhdHVzKHN0cnVjdCB0d2w2MDQwICp0d2w2MDQwKQoreworCXU4IHN0YXR1czsKKworCXN0YXR1cyA9IHR3bDYwNDAtPnZpYnJhX2N0cmxfY2FjaGVbMF0gfCB0d2w2MDQwLT52aWJyYV9jdHJsX2NhY2hlWzFdOworCXN0YXR1cyAmPSAoVFdMNjA0MF9WSUJFTkEgfCBUV0w2MDQwX1ZJQlNFTCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh0d2w2MDQwX2dldF92aWJyYWxyX3N0YXR1cyk7CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHdsNjA0MF92aWJyYV9yc3JjW10gPSB7CiAJewogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKQEAgLTQ3MSw5ICs0OTIsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHdsNjA0MCk7CiAKLQl0d2w2MDQwX2RldiA9IHBkZXY7CiAJdHdsNjA0MC0+ZGV2ID0gJnBkZXYtPmRldjsKLQl0d2w2MDQwLT5hdWRwd3JvbiA9IHBkYXRhLT5hdWRwd3Jvbl9ncGlvOwogCXR3bDYwNDAtPmlycSA9IHBkYXRhLT5uYXVkaW50X2lycTsKIAl0d2w2MDQwLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKIApAQCAtNDgzLDYgKzUwMiwxMiBAQAogCiAJdHdsNjA0MC0+cmV2ID0gdHdsNjA0MF9yZWdfcmVhZCh0d2w2MDQwLCBUV0w2MDQwX1JFR19BU0lDUkVWKTsKIAorCS8qIEVSUkFUQTogQXV0b21hdGljIHBvd2VyLXVwIGlzIG5vdCBwb3NzaWJsZSBpbiBFUzEuMCAqLworCWlmICh0d2w2MDQwX2dldF9yZXZpZCh0d2w2MDQwKSA+IFRXTDYwNDBfUkVWX0VTMV8wKQorCQl0d2w2MDQwLT5hdWRwd3JvbiA9IHBkYXRhLT5hdWRwd3Jvbl9ncGlvOworCWVsc2UKKwkJdHdsNjA0MC0+YXVkcHdyb24gPSAtRUlOVkFMOworCiAJaWYgKGdwaW9faXNfdmFsaWQodHdsNjA0MC0+YXVkcHdyb24pKSB7CiAJCXJldCA9IGdwaW9fcmVxdWVzdCh0d2w2MDQwLT5hdWRwd3JvbiwgImF1ZHB3cm9uIik7CiAJCWlmIChyZXQpCkBAIC00OTMsMTAgKzUxOCw2IEBACiAJCQlnb3RvIGdwaW8yX2VycjsKIAl9CiAKLQkvKiBFUlJBVEE6IEF1dG9tYXRpYyBwb3dlci11cCBpcyBub3QgcG9zc2libGUgaW4gRVMxLjAgKi8KLQlpZiAodHdsNjA0MC0+cmV2ID09IFRXTDYwNDBfUkVWX0VTMV8wKQotCQl0d2w2MDQwLT5hdWRwd3JvbiA9IC1FSU5WQUw7Ci0KIAkvKiBjb2RlYyBpbnRlcnJ1cHQgKi8KIAlyZXQgPSB0d2w2MDQwX2lycV9pbml0KHR3bDYwNDApOwogCWlmIChyZXQpCkBAIC01NjYsNyArNTg3LDYgQEAKIGdwaW8xX2VycjoKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlrZnJlZSh0d2w2MDQwKTsKLQl0d2w2MDQwX2RldiA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTg2LDcgKzYwNiw2IEBACiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWtmcmVlKHR3bDYwNDApOwotCXR3bDYwNDBfZGV2ID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2wxMjczLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dsMTI3My1jb3JlLmMKaW5kZXggZDk3YTg2OS4uZjM5Yjc1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd2wxMjczLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bDEyNzMtY29yZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvd2wxMjczLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIldMMTI3MyBGTSBSYWRpbyBDb3JlIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMgYi9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKaW5kZXggYWRhMTgzNS4uZjQ3NDdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwpAQCAtNDIwLDEyICs0MjAsMTkgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKIAkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fSU5UX01PREU7CisJCXdtODMxeC0+Z3Bpb19sZXZlbFtpcnFdID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CiAJCXdtODMxeC0+Z3Bpb191cGRhdGVbaXJxXSA9IDB4MTAwMDAgfCBXTTgzMVhfR1BOX1BPTDsKKwkJd204MzF4LT5ncGlvX2xldmVsW2lycV0gPSBmYWxzZTsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CiAJCXdtODMxeC0+Z3Bpb191cGRhdGVbaXJxXSA9IDB4MTAwMDA7CisJCXdtODMxeC0+Z3Bpb19sZXZlbFtpcnFdID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fUE9MOworCQl3bTgzMXgtPmdwaW9fbGV2ZWxbaXJxXSA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDQ5LDcgKzQ1Niw3IEBACiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgcHJpbWFyeSwgc3RhdHVzX2FkZHI7CisJaW50IHByaW1hcnksIHN0YXR1c19hZGRyLCByZXQ7CiAJaW50IHN0YXR1c19yZWdzW1dNODMxWF9OVU1fSVJRX1JFR1NdID0geyAwIH07CiAJaW50IHJlYWRbV004MzFYX05VTV9JUlFfUkVHU10gPSB7IDAgfTsKIAlpbnQgKnN0YXR1czsKQEAgLTUwNyw2ICs1MTQsMTkgQEAKIAogCQlpZiAoKnN0YXR1cyAmIHdtODMxeF9pcnFzW2ldLm1hc2spCiAJCQloYW5kbGVfbmVzdGVkX2lycSh3bTgzMXgtPmlycV9iYXNlICsgaSk7CisKKwkJLyogU2ltdWxhdGUgYW4gZWRnZSB0cmlnZ2VyZWQgSVJRIGJ5IHBvbGxpbmcgdGhlIGlucHV0CisJCSAqIHN0YXR1cy4gIFRoaXMgaXMgc3Vja3kgYnV0IGltcHJvdmVzIGludGVyb3BlcmFiaWxpdHkuCisJCSAqLworCQlpZiAocHJpbWFyeSA9PSBXTTgzMVhfR1BfSU5UICYmCisJCSAgICB3bTgzMXgtPmdwaW9fbGV2ZWxbaSAtIFdNODMxWF9JUlFfR1BJT18xXSkgeworCQkJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0dQSU9fTEVWRUwpOworCQkJd2hpbGUgKHJldCAmIDEgPDwgKGkgLSBXTTgzMVhfSVJRX0dQSU9fMSkpIHsKKwkJCQloYW5kbGVfbmVzdGVkX2lycSh3bTgzMXgtPmlycV9iYXNlICsgaSk7CisJCQkJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwKKwkJCQkJCSAgICAgIFdNODMxWF9HUElPX0xFVkVMKTsKKwkJCX0KKwkJfQogCX0KIAogb3V0OgpAQCAtNTk2LDggKzYxNiw2IEBACiAJCQkgIk5vIGludGVycnVwdCBzcGVjaWZpZWQgLSBmdW5jdGlvbmFsaXR5IGxpbWl0ZWRcbiIpOwogCX0KIAotCi0KIAkvKiBFbmFibGUgdG9wIGxldmVsIGludGVycnVwdHMsIHdlIG1hc2sgYXQgc2Vjb25kYXJ5IGxldmVsICovCiAJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9TWVNURU1fSU5URVJSVVBUU19NQVNLLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKaW5kZXggZTA2YmE5NC4uNjJiNDYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCmluZGV4IGJmZGU0ZTguLjVkNmJhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYwpAQCAtMTY3LDYgKzE2NywxOCBAQAogICogYW5kIHNob3VsZCBiZSBoYW5kbGVkIHZpYSB0aGUgc3RhbmRhcmQgcmVndWxhdG9yIEFQSSBzdXBwbHkKICAqIG1hbmFnZW1lbnQuCiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp3bTE4MTFfbWFpbl9zdXBwbGllc1tdID0geworCSJEQlZERDEiLAorCSJEQlZERDIiLAorCSJEQlZERDMiLAorCSJEQ1ZERCIsCisJIkFWREQxIiwKKwkiQVZERDIiLAorCSJDUFZERCIsCisJIlNQS1ZERDEiLAorCSJTUEtWREQyIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5OTRfbWFpbl9zdXBwbGllc1tdID0gewogCSJEQlZERCIsCiAJIkRDVkREIiwKQEAgLTIwNSw2ICsyMTcsNDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJcmV0ID0gd204OTk0X3JlZ19yZWFkKHdtODk5NCwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBwb3dlciBzdGF0dXM6ICVkXG4iLCByZXQpOworCX0gZWxzZSBpZiAocmV0ICYgKFdNODk5NF9BSUYyQURDTF9FTkEgfCBXTTg5OTRfQUlGMkFEQ1JfRU5BIHwKKwkJCSAgV004OTk0X0FJRjFBREMyTF9FTkEgfCBXTTg5OTRfQUlGMUFEQzJSX0VOQSB8CisJCQkgIFdNODk5NF9BSUYxQURDMUxfRU5BIHwgV004OTk0X0FJRjFBREMxUl9FTkEpKSB7CisJCWRldl9kYmcoZGV2LCAiQ09ERUMgc3RpbGwgYWN0aXZlLCBpZ25vcmluZyBzdXNwZW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gd204OTk0X3JlZ19yZWFkKHdtODk5NCwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBwb3dlciBzdGF0dXM6ICVkXG4iLCByZXQpOworCX0gZWxzZSBpZiAocmV0ICYgKFdNODk5NF9BSUYyREFDTF9FTkEgfCBXTTg5OTRfQUlGMkRBQ1JfRU5BIHwKKwkJCSAgV004OTk0X0FJRjFEQUMyTF9FTkEgfCBXTTg5OTRfQUlGMURBQzJSX0VOQSB8CisJCQkgIFdNODk5NF9BSUYxREFDMUxfRU5BIHwgV004OTk0X0FJRjFEQUMxUl9FTkEpKSB7CisJCWRldl9kYmcoZGV2LCAiQ09ERUMgc3RpbGwgYWN0aXZlLCBpZ25vcmluZyBzdXNwZW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoICh3bTg5OTQtPnR5cGUpIHsKKwljYXNlIFdNODk1ODoKKwkJcmV0ID0gd204OTk0X3JlZ19yZWFkKHdtODk5NCwgV004OTU4X01JQ19ERVRFQ1RfMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIHBvd2VyIHN0YXR1czogJWRcbiIsIHJldCk7CisJCX0gZWxzZSBpZiAocmV0ICYgV004OTU4X01JQ0RfRU5BKSB7CisJCQlkZXZfZGJnKGRldiwgIkNPREVDIHN0aWxsIGFjdGl2ZSwgaWdub3Jpbmcgc3VzcGVuZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBEaXNhYmxlIExETyBwdWxsZG93bnMgd2hpbGUgdGhlIGRldmljZSBpcyBzdXNwZW5kZWQgaWYgd2UKKwkgKiBkb24ndCBrbm93IHRoYXQgc29tZXRoaW5nIHdpbGwgYmUgZHJpdmluZyB0aGVtLiAqLworCWlmICghd204OTk0LT5sZG9fZW5hX2Fsd2F5c19kcml2ZW4pCisJCXdtODk5NF9zZXRfYml0cyh3bTg5OTQsIFdNODk5NF9QVUxMX0NPTlRST0xfMiwKKwkJCQlXTTg5OTRfTERPMUVOQV9QRCB8IFdNODk5NF9MRE8yRU5BX1BELAorCQkJCVdNODk5NF9MRE8xRU5BX1BEIHwgV004OTk0X0xETzJFTkFfUEQpOworCiAJLyogR1BJTyBjb25maWd1cmF0aW9uIHN0YXRlIGlzIHNhdmVkIGhlcmUgc2luY2Ugd2UgbWF5IGJlIGNvbmZpZ3VyaW5nCiAJICogdGhlIEdQSU8gYWx0ZXJuYXRlIGZ1bmN0aW9ucyBldmVuIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgZ3Bpb2xpYgogCSAqIGRyaXZlciBmb3IgdGhlbS4KQEAgLTI3NCw2ICszMjcsMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzdG9yZSBHUElPIHJlZ2lzdGVyczogJWRcbiIsIHJldCk7CiAKKwkvKiBEaXNhYmxlIExETyBwdWxsZG93bnMgd2hpbGUgdGhlIGRldmljZSBpcyBhY3RpdmUgKi8KKwl3bTg5OTRfc2V0X2JpdHMod204OTk0LCBXTTg5OTRfUFVMTF9DT05UUk9MXzIsCisJCQlXTTg5OTRfTERPMUVOQV9QRCB8IFdNODk5NF9MRE8yRU5BX1BELAorCQkJMCk7CisKIAl3bTg5OTQtPnN1c3BlbmRlZCA9IGZhbHNlOwogCiAJcmV0dXJuIDA7CkBAIC0zMjksNiArMzg3LDkgQEAKIAl9CiAKIAlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV00xODExOgorCQl3bTg5OTQtPm51bV9zdXBwbGllcyA9IEFSUkFZX1NJWkUod20xODExX21haW5fc3VwcGxpZXMpOworCQlicmVhazsKIAljYXNlIFdNODk5NDoKIAkJd204OTk0LT5udW1fc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHdtODk5NF9tYWluX3N1cHBsaWVzKTsKIAkJYnJlYWs7CkBAIC0zNDksNiArNDEwLDEwIEBACiAJfQogCiAJc3dpdGNoICh3bTg5OTQtPnR5cGUpIHsKKwljYXNlIFdNMTgxMToKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod20xODExX21haW5fc3VwcGxpZXMpOyBpKyspCisJCQl3bTg5OTQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtMTgxMV9tYWluX3N1cHBsaWVzW2ldOworCQlicmVhazsKIAljYXNlIFdNODk5NDoKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpOyBpKyspCiAJCQl3bTg5OTQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk5NF9tYWluX3N1cHBsaWVzW2ldOwpAQCAtMzgyLDYgKzQ0NywxMyBAQAogCQlnb3RvIGVycl9lbmFibGU7CiAJfQogCXN3aXRjaCAocmV0KSB7CisJY2FzZSAweDE4MTE6CisJCWRldm5hbWUgPSAiV00xODExIjsKKwkJaWYgKHdtODk5NC0+dHlwZSAhPSBXTTE4MTEpCisJCQlkZXZfd2Fybih3bTg5OTQtPmRldiwgIkRldmljZSByZWdpc3RlcmVkIGFzIHR5cGUgJWRcbiIsCisJCQkJIHdtODk5NC0+dHlwZSk7CisJCXdtODk5NC0+dHlwZSA9IFdNMTgxMTsKKwkJYnJlYWs7CiAJY2FzZSAweDg5OTQ6CiAJCWRldm5hbWUgPSAiV004OTk0IjsKIAkJaWYgKHdtODk5NC0+dHlwZSAhPSBXTTg5OTQpCkBAIC00NDEsOCArNTEzLDE1IEBACiAJCQkJCQlwZGF0YS0+Z3Bpb19kZWZhdWx0c1tpXSk7CiAJCQl9CiAJCX0KKworCQl3bTg5OTQtPmxkb19lbmFfYWx3YXlzX2RyaXZlbiA9IHBkYXRhLT5sZG9fZW5hX2Fsd2F5c19kcml2ZW47CiAJfQogCisJLyogRGlzYWJsZSBMRE8gcHVsbGRvd25zIHdoaWxlIHRoZSBkZXZpY2UgaXMgYWN0aXZlICovCisJd204OTk0X3NldF9iaXRzKHdtODk5NCwgV004OTk0X1BVTExfQ09OVFJPTF8yLAorCQkJV004OTk0X0xETzFFTkFfUEQgfCBXTTg5OTRfTERPMkVOQV9QRCwKKwkJCTApOworCiAJLyogSW4gc29tZSBzeXN0ZW0gZGVzaWducyB3aGVyZSB0aGUgcmVndWxhdG9ycyBhcmUgbm90IGluIHVzZSwKIAkgKiB3ZSBjYW4gYWNoaWV2ZSBhIHNtYWxsIHJlZHVjdGlvbiBpbiBsZWFrYWdlIGN1cnJlbnRzIGJ5CiAJICogZmxvYXRpbmcgTERPIG91dHB1dHMuICBUaGlzIGJpdCBtYWtlcyBubyBkaWZmZXJlbmNlIGlmIHRoZQpAQCAtNTM5LDYgKzYxOCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTg5OTRfaTJjX2lkW10gPSB7CisJeyAid20xODExIiwgV00xODExIH0sCiAJeyAid204OTk0IiwgV004OTk0IH0sCiAJeyAid204OTU4IiwgV004OTU4IH0sCiAJeyB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDJkNjQyM2MuLmQ1OTM4NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC02Myw3ICs2Myw3IEBACiAKIGNvbmZpZyBBVE1FTF9QV00KIAl0cmlzdGF0ZSAiQXRtZWwgQVQzMi9BVDkxIFBXTSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVZSMzIgfHwgQVJDSF9BVDkxU0FNOTI2MyB8fCBBUkNIX0FUOTFTQU05UkwgfHwgQVJDSF9BVDkxQ0FQOQorCWRlcGVuZHMgb24gSEFWRV9DTEsKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIFBXTSBjaGFubmVscwogCSAgb24gY2VydGFpbiBBdG1lbCBwcm9jZXNzb3JzLiAgUHVsc2UgV2lkdGggTW9kdWxhdGlvbiBpcyB1c2VkIGZvcgpAQCAtNTA2LDUgKzUwNiw2IEBACiBzb3VyY2UgImRyaXZlcnMvbWlzYy90aS1zdC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvbGlzM2x2MDJkL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9jYXJtYS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL0tjb25maWciCiAKIGVuZGlmICMgTUlTQ19ERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKaW5kZXggOGYzZWZiNi4uYjI2NDk1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpAQCAtNDcsMyArNDcsNCBAQAogb2JqLXkJCQkJKz0gbGlzM2x2MDJkLwogb2JqLXkJCQkJKz0gY2FybWEvCiBvYmotJChDT05GSUdfVVNCX1NXSVRDSF9GU0E5NDgwKSArPSBmc2E5NDgwLm8KK29iai0kKENPTkZJR19BTFRFUkFfU1RBUEwpCSs9YWx0ZXJhLXN0YXBsLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FiODUwMC1wd20uYyBiL2RyaXZlcnMvbWlzYy9hYjg1MDAtcHdtLmMKaW5kZXggMzU5MDMxNS4uMjIwOGE5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FiODUwMC1wd20uYworKysgYi9kcml2ZXJzL21pc2MvYWI4NTAwLXB3bS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FiODUwMC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFBXTSBPdXQgZ2VuZXJhdG9ycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LWkyYy5jIGIvZHJpdmVycy9taXNjL2FkNTI1eF9kcG90LWkyYy5jCmluZGV4IDRmZjczYzIuLmEzOWUwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC1pMmMuYworKysgYi9kcml2ZXJzL21pc2MvYWQ1MjV4X2Rwb3QtaTJjLmMKQEAgLTk4LDYgKzk4LDcgQEAKIAl7ImFkNTI4MiIsIEFENTI4Ml9JRH0sCiAJeyJhZG4yODYwIiwgQUROMjg2MF9JRH0sCiAJeyJhZDUyNzMiLCBBRDUyNzNfSUR9LAorCXsiYWQ1MTYxIiwgQUQ1MTYxX0lEfSwKIAl7ImFkNTE3MSIsIEFENTE3MV9JRH0sCiAJeyJhZDUxNzAiLCBBRDUxNzBfSUR9LAogCXsiYWQ1MTcyIiwgQUQ1MTcyX0lEfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjAxZDhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9LY29uZmlnCkBAIC0wLDAgKzEsOCBAQAorY29tbWVudCAiQWx0ZXJhIEZQR0EgZmlybXdhcmUgZG93bmxvYWQgbW9kdWxlIgorCitjb25maWcgQUxURVJBX1NUQVBMCisJdHJpc3RhdGUgIkFsdGVyYSBGUEdBIGZpcm13YXJlIGRvd25sb2FkIG1vZHVsZSIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEFuIEFsdGVyYSBGUEdBIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgdG9vbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NWY2MWVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK2FsdGVyYS1zdGFwbC1vYmpzID0gYWx0ZXJhLWxwdC5vIGFsdGVyYS1qdGFnLm8gYWx0ZXJhLWNvbXAubyBhbHRlcmEubworCitvYmotJChDT05GSUdfQUxURVJBX1NUQVBMKSArPSBhbHRlcmEtc3RhcGwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtY29tcC5jIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtY29tcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1jb21wLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWNvbXAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtZXhwcnQuaCBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWV4cHJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWV4cHJ0LmgKcmVuYW1lIHRvIGRyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWV4cHJ0LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYyBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJmMjAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCkBAIC0wLDAgKzEsMTAyMSBAQAorLyoKKyAqIGFsdGVyYS1qdGFnLmMKKyAqCisgKiBhbHRlcmEgRlBHQSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFsdGVyYSBDb3Jwb3JhdGlvbiAxOTk4LTIwMDEKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOZXRVUCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdvciBNLiBMaXBsaWFuaW4gPGxpcGxpYW5pbkBuZXR1cC5ydT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bWlzYy9hbHRlcmEuaD4KKyNpbmNsdWRlICJhbHRlcmEtZXhwcnQuaCIKKyNpbmNsdWRlICJhbHRlcmEtanRhZy5oIgorCisjZGVmaW5lCWFsdF9qdGFnX2lvKGEsIGIsIGMpXAorCQlhc3RhdGUtPmNvbmZpZy0+anRhZ19pbyhhc3RhdGUtPmNvbmZpZy0+ZGV2LCBhLCBiLCBjKTsKKworI2RlZmluZQlhbHRfbWFsbG9jKGEpCWt6YWxsb2MoYSwgR0ZQX0tFUk5FTCk7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzaG93cywgZm9yIGVhY2ggSlRBRyBzdGF0ZSwgd2hpY2ggc3RhdGUgaXMgcmVhY2hlZCBhZnRlcgorICogYSBzaW5nbGUgVENLIGNsb2NrIGN5Y2xlIHdpdGggVE1TIGhpZ2ggb3IgVE1TIGxvdywgcmVzcGVjdGl2ZWx5LiAgVGhpcworICogZGVzY3JpYmVzIGFsbCBwb3NzaWJsZSBzdGF0ZSB0cmFuc2l0aW9ucyBpbiB0aGUgSlRBRyBzdGF0ZSBtYWNoaW5lLgorICovCitzdHJ1Y3QgYWx0ZXJhX2p0YWdfbWFjaGluZSB7CisJZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB0bXNfaGlnaDsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHRtc19sb3c7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsdGVyYV9qdGFnX21hY2hpbmUgYWx0ZXJhX3RyYW5zaXRpb25zW10gPSB7CisJLyogUkVTRVQgICAgICovCXsgUkVTRVQsCUlETEUgfSwKKwkvKiBJRExFICAgICAgKi8JeyBEUlNFTEVDVCwJSURMRSB9LAorCS8qIERSU0VMRUNUICAqLwl7IElSU0VMRUNULAlEUkNBUFRVUkUgfSwKKwkvKiBEUkNBUFRVUkUgKi8JeyBEUkVYSVQxLAlEUlNISUZUIH0sCisJLyogRFJTSElGVCAgICovCXsgRFJFWElUMSwJRFJTSElGVCB9LAorCS8qIERSRVhJVDEgICAqLwl7IERSVVBEQVRFLAlEUlBBVVNFIH0sCisJLyogRFJQQVVTRSAgICovCXsgRFJFWElUMiwJRFJQQVVTRSB9LAorCS8qIERSRVhJVDIgICAqLwl7IERSVVBEQVRFLAlEUlNISUZUIH0sCisJLyogRFJVUERBVEUgICovCXsgRFJTRUxFQ1QsCUlETEUgfSwKKwkvKiBJUlNFTEVDVCAgKi8JeyBSRVNFVCwJSVJDQVBUVVJFIH0sCisJLyogSVJDQVBUVVJFICovCXsgSVJFWElUMSwJSVJTSElGVCB9LAorCS8qIElSU0hJRlQgICAqLwl7IElSRVhJVDEsCUlSU0hJRlQgfSwKKwkvKiBJUkVYSVQxICAgKi8JeyBJUlVQREFURSwJSVJQQVVTRSB9LAorCS8qIElSUEFVU0UgICAqLwl7IElSRVhJVDIsCUlSUEFVU0UgfSwKKwkvKiBJUkVYSVQyICAgKi8JeyBJUlVQREFURSwJSVJTSElGVCB9LAorCS8qIElSVVBEQVRFICAqLwl7IERSU0VMRUNULAlJRExFIH0KK307CisKKy8qCisgKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBUTVMgdmFsdWUgdG8gYmUgdXNlZCB0byB0YWtlIHRoZSBORVhUIFNURVAgb24KKyAqIHRoZSBwYXRoIHRvIHRoZSBkZXNpcmVkIHN0YXRlLiAgVGhlIGFycmF5IGluZGV4IGlzIHRoZSBjdXJyZW50IHN0YXRlLAorICogYW5kIHRoZSBiaXQgcG9zaXRpb24gaXMgdGhlIGRlc2lyZWQgZW5kc3RhdGUuICBUbyBmaW5kIG91dCB3aGljaCBzdGF0ZQorICogaXMgdXNlZCBhcyB0aGUgaW50ZXJtZWRpYXRlIHN0YXRlLCBsb29rIHVwIHRoZSBUTVMgdmFsdWUgaW4gdGhlCisgKiBhbHRlcmFfdHJhbnNpdGlvbnNbXSB0YWJsZS4KKyAqLworc3RhdGljIGNvbnN0IHUxNiBhbHRlcmFfanRhZ19wYXRoX21hcFsxNl0gPSB7CisJLyogUlNUCVJUSQlTRFJTCUNEUglTRFIJRTFEUglQRFIJRTJEUiAqLworCTB4MDAwMSwJMHhGRkZELAkweEZFMDEsCTB4RkZFNywJMHhGRkVGLAkweEZGMEYsCTB4RkZCRiwJMHhGRkZGLAorCS8qIFVEUglTSVJTCUNJUglTSVIJRTFJUglQSVIJRTJJUglVSVIgKi8KKwkweEZFRkQsCTB4MDAwMSwJMHhGM0ZGLAkweEY3RkYsCTB4ODdGRiwJMHhERkZGLAkweEZGRkYsCTB4N0ZGRAorfTsKKworLyogRmxhZyBiaXRzIGZvciBhbHRfanRhZ19pbygpIGZ1bmN0aW9uICovCisjZGVmaW5lIFRNU19ISUdIICAgMQorI2RlZmluZSBUTVNfTE9XICAgIDAKKyNkZWZpbmUgVERJX0hJR0ggICAxCisjZGVmaW5lIFRESV9MT1cgICAgMAorI2RlZmluZSBSRUFEX1RETyAgIDEKKyNkZWZpbmUgSUdOT1JFX1RETyAwCisKK2ludCBhbHRlcmFfamluaXQoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlKQoreworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKworCS8qIGluaXRpYWwgSlRBRyBzdGF0ZSBpcyB1bmtub3duICovCisJanMtPmp0YWdfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7CisKKwkvKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgc3RhdGUgKi8KKwlqcy0+ZHJzdG9wX3N0YXRlID0gSURMRTsKKwlqcy0+aXJzdG9wX3N0YXRlID0gSURMRTsKKwlqcy0+ZHJfcHJlICA9IDA7CisJanMtPmRyX3Bvc3QgPSAwOworCWpzLT5pcl9wcmUgID0gMDsKKwlqcy0+aXJfcG9zdCA9IDA7CisJanMtPmRyX2xlbmd0aCAgICA9IDA7CisJanMtPmlyX2xlbmd0aCAgICA9IDA7CisKKwlqcy0+ZHJfcHJlX2RhdGEgID0gTlVMTDsKKwlqcy0+ZHJfcG9zdF9kYXRhID0gTlVMTDsKKwlqcy0+aXJfcHJlX2RhdGEgID0gTlVMTDsKKwlqcy0+aXJfcG9zdF9kYXRhID0gTlVMTDsKKwlqcy0+ZHJfYnVmZmVyCSA9IE5VTEw7CisJanMtPmlyX2J1ZmZlcgkgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhbHRlcmFfc2V0X2Ryc3RvcChzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCBlbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXRlKQoreworCWpzLT5kcnN0b3Bfc3RhdGUgPSBzdGF0ZTsKKworCXJldHVybiAwOworfQorCitpbnQgYWx0ZXJhX3NldF9pcnN0b3Aoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGF0ZSkKK3sKKwlqcy0+aXJzdG9wX3N0YXRlID0gc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFsdGVyYV9zZXRfZHJfcHJlKHN0cnVjdCBhbHRlcmFfanRhZyAqanMsCisJCQkJdTMyIGNvdW50LCB1MzIgc3RhcnRfaW5kZXgsCisJCQkJdTggKnByZWFtYmxlX2RhdGEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGk7CisJdTMyIGo7CisKKwlpZiAoY291bnQgPiBqcy0+ZHJfcHJlKSB7CisJCWtmcmVlKGpzLT5kcl9wcmVfZGF0YSk7CisJCWpzLT5kcl9wcmVfZGF0YSA9ICh1OCAqKWFsdF9tYWxsb2MoKGNvdW50ICsgNykgPj4gMyk7CisJCWlmIChqcy0+ZHJfcHJlX2RhdGEgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCWpzLT5kcl9wcmUgPSBjb3VudDsKKwl9IGVsc2UKKwkJanMtPmRyX3ByZSA9IGNvdW50OworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlqID0gaSArIHN0YXJ0X2luZGV4OworCisJCQlpZiAocHJlYW1ibGVfZGF0YSA9PSBOVUxMKQorCQkJCWpzLT5kcl9wcmVfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOworCQkJZWxzZSB7CisJCQkJaWYgKHByZWFtYmxlX2RhdGFbaiA+PiAzXSAmICgxIDw8IChqICYgNykpKQorCQkJCQlqcy0+ZHJfcHJlX2RhdGFbaSA+PiAzXSB8PQorCQkJCQkJCSgxIDw8IChpICYgNykpOworCQkJCWVsc2UKKwkJCQkJanMtPmRyX3ByZV9kYXRhW2kgPj4gM10gJj0KKwkJCQkJCQl+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9zZXRfaXJfcHJlKHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIHUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAorCQkJCQkJCXU4ICpwcmVhbWJsZV9kYXRhKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBpOworCXUzMiBqOworCisJaWYgKGNvdW50ID4ganMtPmlyX3ByZSkgeworCQlrZnJlZShqcy0+aXJfcHJlX2RhdGEpOworCQlqcy0+aXJfcHJlX2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOworCQlpZiAoanMtPmlyX3ByZV9kYXRhID09IE5VTEwpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQllbHNlCisJCQlqcy0+aXJfcHJlID0gY291bnQ7CisKKwl9IGVsc2UKKwkJanMtPmlyX3ByZSA9IGNvdW50OworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlqID0gaSArIHN0YXJ0X2luZGV4OworCQkJaWYgKHByZWFtYmxlX2RhdGEgPT0gTlVMTCkKKwkJCQlqcy0+aXJfcHJlX2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKKwkJCWVsc2UgeworCQkJCWlmIChwcmVhbWJsZV9kYXRhW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKKwkJCQkJanMtPmlyX3ByZV9kYXRhW2kgPj4gM10gfD0KKwkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKKwkJCQllbHNlCisJCQkJCWpzLT5pcl9wcmVfZGF0YVtpID4+IDNdICY9CisJCQkJCQkJfih1MzIpKDEgPDwgKGkgJiA3KSk7CisKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBhbHRlcmFfc2V0X2RyX3Bvc3Qoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgdTMyIGNvdW50LCB1MzIgc3RhcnRfaW5kZXgsCisJCQkJCQl1OCAqcG9zdGFtYmxlX2RhdGEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGk7CisJdTMyIGo7CisKKwlpZiAoY291bnQgPiBqcy0+ZHJfcG9zdCkgeworCQlrZnJlZShqcy0+ZHJfcG9zdF9kYXRhKTsKKwkJanMtPmRyX3Bvc3RfZGF0YSA9ICh1OCAqKWFsdF9tYWxsb2MoKGNvdW50ICsgNykgPj4gMyk7CisKKwkJaWYgKGpzLT5kcl9wb3N0X2RhdGEgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCWpzLT5kcl9wb3N0ID0gY291bnQ7CisKKwl9IGVsc2UKKwkJanMtPmRyX3Bvc3QgPSBjb3VudDsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJaiA9IGkgKyBzdGFydF9pbmRleDsKKworCQkJaWYgKHBvc3RhbWJsZV9kYXRhID09IE5VTEwpCisJCQkJanMtPmRyX3Bvc3RfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOworCQkJZWxzZSB7CisJCQkJaWYgKHBvc3RhbWJsZV9kYXRhW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKKwkJCQkJanMtPmRyX3Bvc3RfZGF0YVtpID4+IDNdIHw9CisJCQkJCQkJCSgxIDw8IChpICYgNykpOworCQkJCWVsc2UKKwkJCQkJanMtPmRyX3Bvc3RfZGF0YVtpID4+IDNdICY9CisJCQkJCSAgICB+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9zZXRfaXJfcG9zdChzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCB1MzIgY291bnQsIHUzMiBzdGFydF9pbmRleCwKKwkJCQkJCXU4ICpwb3N0YW1ibGVfZGF0YSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgaTsKKwl1MzIgajsKKworCWlmIChjb3VudCA+IGpzLT5pcl9wb3N0KSB7CisJCWtmcmVlKGpzLT5pcl9wb3N0X2RhdGEpOworCQlqcy0+aXJfcG9zdF9kYXRhID0gKHU4ICopYWx0X21hbGxvYygoY291bnQgKyA3KSA+PiAzKTsKKwkJaWYgKGpzLT5pcl9wb3N0X2RhdGEgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCWpzLT5pcl9wb3N0ID0gY291bnQ7CisKKwl9IGVsc2UKKwkJanMtPmlyX3Bvc3QgPSBjb3VudDsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCWogPSBpICsgc3RhcnRfaW5kZXg7CisKKwkJaWYgKHBvc3RhbWJsZV9kYXRhID09IE5VTEwpCisJCQlqcy0+aXJfcG9zdF9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCWVsc2UgeworCQkJaWYgKHBvc3RhbWJsZV9kYXRhW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKKwkJCQlqcy0+aXJfcG9zdF9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCQllbHNlCisJCQkJanMtPmlyX3Bvc3RfZGF0YVtpID4+IDNdICY9CisJCQkJICAgIH4odTMyKSgxIDw8IChpICYgNykpOworCisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhbHRlcmFfanJlc2V0X2lkbGUoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlKQoreworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgaTsKKwkvKiBHbyB0byBUZXN0IExvZ2ljIFJlc2V0IChubyBtYXR0ZXIgd2hhdCB0aGUgc3RhcnRpbmcgc3RhdGUgbWF5IGJlKSAqLworCWZvciAoaSA9IDA7IGkgPCA1OyArK2kpCisJCWFsdF9qdGFnX2lvKFRNU19ISUdILCBURElfTE9XLCBJR05PUkVfVERPKTsKKworCS8qIE5vdyBzdGVwIHRvIFJ1biBUZXN0IC8gSWRsZSAqLworCWFsdF9qdGFnX2lvKFRNU19MT1csIFRESV9MT1csIElHTk9SRV9URE8pOworCWpzLT5qdGFnX3N0YXRlID0gSURMRTsKK30KKworaW50IGFsdGVyYV9nb3RvX2pzdGF0ZShzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQkJCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOworCWludCB0bXM7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChqcy0+anRhZ19zdGF0ZSA9PSBJTExFR0FMX0pUQUdfU1RBVEUpCisJCS8qIGluaXRpYWxpemUgSlRBRyBjaGFpbiB0byBrbm93biBzdGF0ZSAqLworCQlhbHRlcmFfanJlc2V0X2lkbGUoYXN0YXRlKTsKKworCWlmIChqcy0+anRhZ19zdGF0ZSA9PSBzdGF0ZSkgeworCQkvKgorCQkgKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGUgZGVzaXJlZCBzdGF0ZS4KKwkJICogSWYgaXQgaXMgYSBzdGFibGUgc3RhdGUsIGxvb3AgaGVyZS4KKwkJICogT3RoZXJ3aXNlIGRvIG5vdGhpbmcgKG5vIGNsb2NrIGN5Y2xlcykuCisJCSAqLworCQlpZiAoKHN0YXRlID09IElETEUpIHx8IChzdGF0ZSA9PSBEUlNISUZUKSB8fAorCQkJKHN0YXRlID09IERSUEFVU0UpIHx8IChzdGF0ZSA9PSBJUlNISUZUKSB8fAorCQkJCShzdGF0ZSA9PSBJUlBBVVNFKSkgeworCQkJYWx0X2p0YWdfaW8oVE1TX0xPVywgVERJX0xPVywgSUdOT1JFX1RETyk7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gUkVTRVQpCisJCQlhbHRfanRhZ19pbyhUTVNfSElHSCwgVERJX0xPVywgSUdOT1JFX1RETyk7CisKKwl9IGVsc2UgeworCQl3aGlsZSAoKGpzLT5qdGFnX3N0YXRlICE9IHN0YXRlKSAmJiAoY291bnQgPCA5KSkgeworCQkJLyogR2V0IFRNUyB2YWx1ZSB0byB0YWtlIGEgc3RlcCB0b3dhcmQgZGVzaXJlZCBzdGF0ZSAqLworCQkJdG1zID0gKGFsdGVyYV9qdGFnX3BhdGhfbWFwW2pzLT5qdGFnX3N0YXRlXSAmCisJCQkJCQkJKDEgPDwgc3RhdGUpKQorCQkJCQkJCT8gVE1TX0hJR0ggOiBUTVNfTE9XOworCisJCQkvKiBUYWtlIGEgc3RlcCAqLworCQkJYWx0X2p0YWdfaW8odG1zLCBURElfTE9XLCBJR05PUkVfVERPKTsKKworCQkJaWYgKHRtcykKKwkJCQlqcy0+anRhZ19zdGF0ZSA9CisJCQkJCWFsdGVyYV90cmFuc2l0aW9uc1tqcy0+anRhZ19zdGF0ZV0udG1zX2hpZ2g7CisJCQllbHNlCisJCQkJanMtPmp0YWdfc3RhdGUgPQorCQkJCQlhbHRlcmFfdHJhbnNpdGlvbnNbanMtPmp0YWdfc3RhdGVdLnRtc19sb3c7CisKKwkJCSsrY291bnQ7CisJCX0KKwl9CisKKwlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhdGUpCisJCXN0YXR1cyA9IC1FUkVNT1RFSU87CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX3dhaXRfY3ljbGVzKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKKwkJCQkJczMyIGN5Y2xlcywKKwkJCQkJZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB3YWl0X3N0YXRlKQoreworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgdG1zOworCXMzMiBjb3VudDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChqcy0+anRhZ19zdGF0ZSAhPSB3YWl0X3N0YXRlKQorCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCB3YWl0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQkvKgorCQkgKiBTZXQgVE1TIGhpZ2ggdG8gbG9vcCBpbiBSRVNFVCBzdGF0ZQorCQkgKiBTZXQgVE1TIGxvdyB0byBsb29wIGluIGFueSBvdGhlciBzdGFibGUgc3RhdGUKKwkJICovCisJCXRtcyA9ICh3YWl0X3N0YXRlID09IFJFU0VUKSA/IFRNU19ISUdIIDogVE1TX0xPVzsKKworCQlmb3IgKGNvdW50ID0gMEw7IGNvdW50IDwgY3ljbGVzOyBjb3VudCsrKQorCQkJYWx0X2p0YWdfaW8odG1zLCBURElfTE9XLCBJR05PUkVfVERPKTsKKworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBhbHRlcmFfd2FpdF9tc2VjcyhzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQlzMzIgbWljcm9zZWNvbmRzLCBlbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHdhaXRfc3RhdGUpCisvKgorICogQ2F1c2VzIEpUQUcgaGFyZHdhcmUgdG8gc2l0IGluIHRoZSBzcGVjaWZpZWQgc3RhYmxlCisgKiBzdGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBvZiByZWFsIHRpbWUuICBJZgorICogbm8gSlRBRyBvcGVyYXRpb25zIGhhdmUgYmVlbiBwZXJmb3JtZWQgeWV0LCB0aGVuIG9ubHkKKyAqIGEgZGVsYXkgaXMgcGVyZm9ybWVkLiAgVGhpcyBwZXJtaXRzIHRoZSBXQUlUIFVTRUNTCisgKiBzdGF0ZW1lbnQgdG8gYmUgdXNlZCBpbiBWRUNUT1IgcHJvZ3JhbXMgd2l0aG91dCBjYXVzaW5nCisgKiBhbnkgSlRBRyBvcGVyYXRpb25zLgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBlbHNlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgKi8KK3sKKwlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoKGpzLT5qdGFnX3N0YXRlICE9IElMTEVHQUxfSlRBR19TVEFURSkgJiYKKwkgICAgKGpzLT5qdGFnX3N0YXRlICE9IHdhaXRfc3RhdGUpKQorCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCB3YWl0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkKKwkJLyogV2FpdCBmb3Igc3BlY2lmaWVkIHRpbWUgaW50ZXJ2YWwgKi8KKwkJdWRlbGF5KG1pY3Jvc2Vjb25kcyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhbHRlcmFfY29uY2F0ZW5hdGVfZGF0YSh1OCAqYnVmZmVyLAorCQkJCXU4ICpwcmVhbWJsZV9kYXRhLAorCQkJCXUzMiBwcmVhbWJsZV9jb3VudCwKKwkJCQl1OCAqdGFyZ2V0X2RhdGEsCisJCQkJdTMyIHN0YXJ0X2luZGV4LAorCQkJCXUzMiB0YXJnZXRfY291bnQsCisJCQkJdTggKnBvc3RhbWJsZV9kYXRhLAorCQkJCXUzMiBwb3N0YW1ibGVfY291bnQpCisvKgorICogQ29waWVzIHByZWFtYmxlIGRhdGEsIHRhcmdldCBkYXRhLCBhbmQgcG9zdGFtYmxlIGRhdGEKKyAqIGludG8gb25lIGJ1ZmZlciBmb3IgSVIgb3IgRFIgc2NhbnMuCisgKi8KK3sKKwl1MzIgaSwgaiwgazsKKworCWZvciAoaSA9IDBMOyBpIDwgcHJlYW1ibGVfY291bnQ7ICsraSkgeworCQlpZiAocHJlYW1ibGVfZGF0YVtpID4+IDNMXSAmICgxTCA8PCAoaSAmIDdMKSkpCisJCQlidWZmZXJbaSA+PiAzTF0gfD0gKDFMIDw8IChpICYgN0wpKTsKKwkJZWxzZQorCQkJYnVmZmVyW2kgPj4gM0xdICY9IH4odTMyKSgxTCA8PCAoaSAmIDdMKSk7CisKKwl9CisKKwlqID0gc3RhcnRfaW5kZXg7CisJayA9IHByZWFtYmxlX2NvdW50ICsgdGFyZ2V0X2NvdW50OworCWZvciAoOyBpIDwgazsgKytpLCArK2opIHsKKwkJaWYgKHRhcmdldF9kYXRhW2ogPj4gM0xdICYgKDFMIDw8IChqICYgN0wpKSkKKwkJCWJ1ZmZlcltpID4+IDNMXSB8PSAoMUwgPDwgKGkgJiA3TCkpOworCQllbHNlCisJCQlidWZmZXJbaSA+PiAzTF0gJj0gfih1MzIpKDFMIDw8IChpICYgN0wpKTsKKworCX0KKworCWogPSAwTDsKKwlrID0gcHJlYW1ibGVfY291bnQgKyB0YXJnZXRfY291bnQgKyBwb3N0YW1ibGVfY291bnQ7CisJZm9yICg7IGkgPCBrOyArK2ksICsraikgeworCQlpZiAocG9zdGFtYmxlX2RhdGFbaiA+PiAzTF0gJiAoMUwgPDwgKGogJiA3TCkpKQorCQkJYnVmZmVyW2kgPj4gM0xdIHw9ICgxTCA8PCAoaSAmIDdMKSk7CisJCWVsc2UKKwkJCWJ1ZmZlcltpID4+IDNMXSAmPSB+KHUzMikoMUwgPDwgKGkgJiA3TCkpOworCisJfQorfQorCitzdGF0aWMgaW50IGFsdF9qdGFnX2Ryc2NhbihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQlpbnQgc3RhcnRfc3RhdGUsCisJCQlpbnQgY291bnQsCisJCQl1OCAqdGRpLAorCQkJdTggKnRkbykKK3sKKwlpbnQgaSA9IDA7CisJaW50IHRkb19iaXQgPSAwOworCWludCBzdGF0dXMgPSAxOworCisJLyogRmlyc3QgZ28gdG8gRFJTSElGVCBzdGF0ZSAqLworCXN3aXRjaCAoc3RhcnRfc3RhdGUpIHsKKwljYXNlIDA6CQkJCQkJLyogSURMRSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSQ0FQVFVSRSAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJTSElGVCAqLworCQlicmVhazsKKworCWNhc2UgMToJCQkJCQkvKiBEUlBBVVNFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUkVYSVQyICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlVQREFURSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSQ0FQVFVSRSAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJTSElGVCAqLworCQlicmVhazsKKworCWNhc2UgMjoJCQkJCQkvKiBJUlBBVVNFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUkVYSVQyICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlVQREFURSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSQ0FQVFVSRSAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJTSElGVCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IDA7CisJfQorCisJaWYgKHN0YXR1cykgeworCQkvKiBsb29wIGluIHRoZSBTSElGVC1EUiBzdGF0ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJdGRvX2JpdCA9IGFsdF9qdGFnX2lvKAorCQkJCQkoaSA9PSBjb3VudCAtIDEpLAorCQkJCQl0ZGlbaSA+PiAzXSAmICgxIDw8IChpICYgNykpLAorCQkJCQkodGRvICE9IE5VTEwpKTsKKworCQkJaWYgKHRkbyAhPSBOVUxMKSB7CisJCQkJaWYgKHRkb19iaXQpCisJCQkJCXRkb1tpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOworCQkJCWVsc2UKKwkJCQkJdGRvW2kgPj4gM10gJj0gfih1MzIpKDEgPDwgKGkgJiA3KSk7CisKKwkJCX0KKwkJfQorCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUlBBVVNFICovCisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhbHRfanRhZ19pcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAorCQkgICAgaW50IHN0YXJ0X3N0YXRlLAorCQkgICAgaW50IGNvdW50LAorCQkgICAgdTggKnRkaSwKKwkJICAgIHU4ICp0ZG8pCit7CisJaW50IGkgPSAwOworCWludCB0ZG9fYml0ID0gMDsKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qIEZpcnN0IGdvIHRvIElSU0hJRlQgc3RhdGUgKi8KKwlzd2l0Y2ggKHN0YXJ0X3N0YXRlKSB7CisJY2FzZSAwOgkJCQkJCS8qIElETEUgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJDQVBUVVJFICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlNISUZUICovCisJCWJyZWFrOworCisJY2FzZSAxOgkJCQkJCS8qIERSUEFVU0UgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSRVhJVDIgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSVVBEQVRFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSQ0FQVFVSRSAqLworCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJTSElGVCAqLworCQlicmVhazsKKworCWNhc2UgMjoJCQkJCQkvKiBJUlBBVVNFICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUkVYSVQyICovCisJCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlVQREFURSAqLworCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KKwkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSU0VMRUNUICovCisJCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUkNBUFRVUkUgKi8KKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSU0hJRlQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAwOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJLyogbG9vcCBpbiB0aGUgU0hJRlQtSVIgc3RhdGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXRkb19iaXQgPSBhbHRfanRhZ19pbygKKwkJCQkgICAgICAoaSA9PSBjb3VudCAtIDEpLAorCQkJCSAgICAgIHRkaVtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSksCisJCQkJICAgICAgKHRkbyAhPSBOVUxMKSk7CisJCQlpZiAodGRvICE9IE5VTEwpIHsKKwkJCQlpZiAodGRvX2JpdCkKKwkJCQkJdGRvW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7CisJCQkJZWxzZQorCQkJCQl0ZG9baSA+PiAzXSAmPSB+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCQkJfQorCQl9CisKKwkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSUEFVU0UgKi8KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBhbHRlcmFfZXh0cmFjdF90YXJnZXRfZGF0YSh1OCAqYnVmZmVyLAorCQkJCXU4ICp0YXJnZXRfZGF0YSwKKwkJCQl1MzIgc3RhcnRfaW5kZXgsCisJCQkJdTMyIHByZWFtYmxlX2NvdW50LAorCQkJCXUzMiB0YXJnZXRfY291bnQpCisvKgorICogQ29waWVzIHRhcmdldCBkYXRhIGZyb20gc2NhbiBidWZmZXIsIGZpbHRlcmluZyBvdXQKKyAqIHByZWFtYmxlIGFuZCBwb3N0YW1ibGUgZGF0YS4KKyAqLworeworCXUzMiBpOworCXUzMiBqOworCXUzMiBrOworCisJaiA9IHByZWFtYmxlX2NvdW50OworCWsgPSBzdGFydF9pbmRleCArIHRhcmdldF9jb3VudDsKKwlmb3IgKGkgPSBzdGFydF9pbmRleDsgaSA8IGs7ICsraSwgKytqKSB7CisJCWlmIChidWZmZXJbaiA+PiAzXSAmICgxIDw8IChqICYgNykpKQorCQkJdGFyZ2V0X2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKKwkJZWxzZQorCQkJdGFyZ2V0X2RhdGFbaSA+PiAzXSAmPSB+KHUzMikoMSA8PCAoaSAmIDcpKTsKKworCX0KK30KKworaW50IGFsdGVyYV9pcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAorCQkJCXUzMiBjb3VudCwKKwkJCQl1OCAqdGRpX2RhdGEsCisJCQkJdTMyIHN0YXJ0X2luZGV4KQorLyogU2hpZnRzIGRhdGEgaW50byBpbnN0cnVjdGlvbiByZWdpc3RlciAqLworeworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgc3RhcnRfY29kZSA9IDA7CisJdTMyIGFsbG9jX2NoYXJzID0gMDsKKwl1MzIgc2hpZnRfY291bnQgPSBqcy0+aXJfcHJlICsgY291bnQgKyBqcy0+aXJfcG9zdDsKKwlpbnQgc3RhdHVzID0gMDsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXJ0X3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOworCisJc3dpdGNoIChqcy0+anRhZ19zdGF0ZSkgeworCWNhc2UgSUxMRUdBTF9KVEFHX1NUQVRFOgorCWNhc2UgUkVTRVQ6CisJY2FzZSBJRExFOgorCQlzdGFydF9jb2RlID0gMDsKKwkJc3RhcnRfc3RhdGUgPSBJRExFOworCQlicmVhazsKKworCWNhc2UgRFJTRUxFQ1Q6CisJY2FzZSBEUkNBUFRVUkU6CisJY2FzZSBEUlNISUZUOgorCWNhc2UgRFJFWElUMToKKwljYXNlIERSUEFVU0U6CisJY2FzZSBEUkVYSVQyOgorCWNhc2UgRFJVUERBVEU6CisJCXN0YXJ0X2NvZGUgPSAxOworCQlzdGFydF9zdGF0ZSA9IERSUEFVU0U7CisJCWJyZWFrOworCisJY2FzZSBJUlNFTEVDVDoKKwljYXNlIElSQ0FQVFVSRToKKwljYXNlIElSU0hJRlQ6CisJY2FzZSBJUkVYSVQxOgorCWNhc2UgSVJQQVVTRToKKwljYXNlIElSRVhJVDI6CisJY2FzZSBJUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDI7CisJCXN0YXJ0X3N0YXRlID0gSVJQQVVTRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRVJFTU9URUlPOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBzdGFydF9zdGF0ZSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHN0YXJ0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoc2hpZnRfY291bnQgPiBqcy0+aXJfbGVuZ3RoKSB7CisJCQlhbGxvY19jaGFycyA9IChzaGlmdF9jb3VudCArIDcpID4+IDM7CisJCQlrZnJlZShqcy0+aXJfYnVmZmVyKTsKKwkJCWpzLT5pcl9idWZmZXIgPSAodTggKilhbHRfbWFsbG9jKGFsbG9jX2NoYXJzKTsKKwkJCWlmIChqcy0+aXJfYnVmZmVyID09IE5VTEwpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWVsc2UKKwkJCQlqcy0+aXJfbGVuZ3RoID0gYWxsb2NfY2hhcnMgKiA4OworCisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyoKKwkJICogQ29weSBwcmVhbWJsZSBkYXRhLCBJUiBkYXRhLAorCQkgKiBhbmQgcG9zdGFtYmxlIGRhdGEgaW50byBhIGJ1ZmZlcgorCQkgKi8KKwkJYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEoanMtPmlyX2J1ZmZlciwKKwkJCQkJanMtPmlyX3ByZV9kYXRhLAorCQkJCQlqcy0+aXJfcHJlLAorCQkJCQl0ZGlfZGF0YSwKKwkJCQkJc3RhcnRfaW5kZXgsCisJCQkJCWNvdW50LAorCQkJCQlqcy0+aXJfcG9zdF9kYXRhLAorCQkJCQlqcy0+aXJfcG9zdCk7CisJCS8qIERvIHRoZSBJUlNDQU4gKi8KKwkJYWx0X2p0YWdfaXJzY2FuKGFzdGF0ZSwKKwkJCQlzdGFydF9jb2RlLAorCQkJCXNoaWZ0X2NvdW50LAorCQkJCWpzLT5pcl9idWZmZXIsCisJCQkJTlVMTCk7CisKKwkJLyogYWx0X2p0YWdfaXJzY2FuKCkgYWx3YXlzIGVuZHMgaW4gSVJQQVVTRSBzdGF0ZSAqLworCQlqcy0+anRhZ19zdGF0ZSA9IElSUEFVU0U7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlpZiAoanMtPmlyc3RvcF9zdGF0ZSAhPSBJUlBBVVNFKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwganMtPmlyc3RvcF9zdGF0ZSk7CisKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBhbHRlcmFfc3dhcF9pcihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQkgICAgdTMyIGNvdW50LAorCQkJICAgIHU4ICppbl9kYXRhLAorCQkJICAgIHUzMiBpbl9pbmRleCwKKwkJCSAgICB1OCAqb3V0X2RhdGEsCisJCQkgICAgdTMyIG91dF9pbmRleCkKKy8qIFNoaWZ0cyBkYXRhIGludG8gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIsIGNhcHR1cmluZyBvdXRwdXQgZGF0YSAqLworeworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgc3RhcnRfY29kZSA9IDA7CisJdTMyIGFsbG9jX2NoYXJzID0gMDsKKwl1MzIgc2hpZnRfY291bnQgPSBqcy0+aXJfcHJlICsgY291bnQgKyBqcy0+aXJfcG9zdDsKKwlpbnQgc3RhdHVzID0gMDsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXJ0X3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOworCisJc3dpdGNoIChqcy0+anRhZ19zdGF0ZSkgeworCWNhc2UgSUxMRUdBTF9KVEFHX1NUQVRFOgorCWNhc2UgUkVTRVQ6CisJY2FzZSBJRExFOgorCQlzdGFydF9jb2RlID0gMDsKKwkJc3RhcnRfc3RhdGUgPSBJRExFOworCQlicmVhazsKKworCWNhc2UgRFJTRUxFQ1Q6CisJY2FzZSBEUkNBUFRVUkU6CisJY2FzZSBEUlNISUZUOgorCWNhc2UgRFJFWElUMToKKwljYXNlIERSUEFVU0U6CisJY2FzZSBEUkVYSVQyOgorCWNhc2UgRFJVUERBVEU6CisJCXN0YXJ0X2NvZGUgPSAxOworCQlzdGFydF9zdGF0ZSA9IERSUEFVU0U7CisJCWJyZWFrOworCisJY2FzZSBJUlNFTEVDVDoKKwljYXNlIElSQ0FQVFVSRToKKwljYXNlIElSU0hJRlQ6CisJY2FzZSBJUkVYSVQxOgorCWNhc2UgSVJQQVVTRToKKwljYXNlIElSRVhJVDI6CisJY2FzZSBJUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDI7CisJCXN0YXJ0X3N0YXRlID0gSVJQQVVTRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRVJFTU9URUlPOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBzdGFydF9zdGF0ZSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHN0YXJ0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoc2hpZnRfY291bnQgPiBqcy0+aXJfbGVuZ3RoKSB7CisJCQlhbGxvY19jaGFycyA9IChzaGlmdF9jb3VudCArIDcpID4+IDM7CisJCQlrZnJlZShqcy0+aXJfYnVmZmVyKTsKKwkJCWpzLT5pcl9idWZmZXIgPSAodTggKilhbHRfbWFsbG9jKGFsbG9jX2NoYXJzKTsKKwkJCWlmIChqcy0+aXJfYnVmZmVyID09IE5VTEwpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWVsc2UKKwkJCQlqcy0+aXJfbGVuZ3RoID0gYWxsb2NfY2hhcnMgKiA4OworCisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyoKKwkJICogQ29weSBwcmVhbWJsZSBkYXRhLCBJUiBkYXRhLAorCQkgKiBhbmQgcG9zdGFtYmxlIGRhdGEgaW50byBhIGJ1ZmZlcgorCQkgKi8KKwkJYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEoanMtPmlyX2J1ZmZlciwKKwkJCQkJanMtPmlyX3ByZV9kYXRhLAorCQkJCQlqcy0+aXJfcHJlLAorCQkJCQlpbl9kYXRhLAorCQkJCQlpbl9pbmRleCwKKwkJCQkJY291bnQsCisJCQkJCWpzLT5pcl9wb3N0X2RhdGEsCisJCQkJCWpzLT5pcl9wb3N0KTsKKworCQkvKiBEbyB0aGUgSVJTQ0FOICovCisJCWFsdF9qdGFnX2lyc2Nhbihhc3RhdGUsCisJCQkJc3RhcnRfY29kZSwKKwkJCQlzaGlmdF9jb3VudCwKKwkJCQlqcy0+aXJfYnVmZmVyLAorCQkJCWpzLT5pcl9idWZmZXIpOworCisJCS8qIGFsdF9qdGFnX2lyc2NhbigpIGFsd2F5cyBlbmRzIGluIElSUEFVU0Ugc3RhdGUgKi8KKwkJanMtPmp0YWdfc3RhdGUgPSBJUlBBVVNFOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJaWYgKGpzLT5pcnN0b3Bfc3RhdGUgIT0gSVJQQVVTRSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5pcnN0b3Bfc3RhdGUpOworCisKKwlpZiAoc3RhdHVzID09IDApCisJCS8qIE5vdyBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGZyb20gdGhlIGJ1ZmZlciAqLworCQlhbHRlcmFfZXh0cmFjdF90YXJnZXRfZGF0YShqcy0+aXJfYnVmZmVyLAorCQkJCQlvdXRfZGF0YSwgb3V0X2luZGV4LAorCQkJCQlqcy0+aXJfcHJlLCBjb3VudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYWx0ZXJhX2Ryc2NhbihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCisJCQkJdTMyIGNvdW50LAorCQkJCXU4ICp0ZGlfZGF0YSwKKwkJCQl1MzIgc3RhcnRfaW5kZXgpCisvKiBTaGlmdHMgZGF0YSBpbnRvIGRhdGEgcmVnaXN0ZXIgKGlnbm9yaW5nIG91dHB1dCBkYXRhKSAqLworeworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwlpbnQgc3RhcnRfY29kZSA9IDA7CisJdTMyIGFsbG9jX2NoYXJzID0gMDsKKwl1MzIgc2hpZnRfY291bnQgPSBqcy0+ZHJfcHJlICsgY291bnQgKyBqcy0+ZHJfcG9zdDsKKwlpbnQgc3RhdHVzID0gMDsKKwllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXJ0X3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOworCisJc3dpdGNoIChqcy0+anRhZ19zdGF0ZSkgeworCWNhc2UgSUxMRUdBTF9KVEFHX1NUQVRFOgorCWNhc2UgUkVTRVQ6CisJY2FzZSBJRExFOgorCQlzdGFydF9jb2RlID0gMDsKKwkJc3RhcnRfc3RhdGUgPSBJRExFOworCQlicmVhazsKKworCWNhc2UgRFJTRUxFQ1Q6CisJY2FzZSBEUkNBUFRVUkU6CisJY2FzZSBEUlNISUZUOgorCWNhc2UgRFJFWElUMToKKwljYXNlIERSUEFVU0U6CisJY2FzZSBEUkVYSVQyOgorCWNhc2UgRFJVUERBVEU6CisJCXN0YXJ0X2NvZGUgPSAxOworCQlzdGFydF9zdGF0ZSA9IERSUEFVU0U7CisJCWJyZWFrOworCisJY2FzZSBJUlNFTEVDVDoKKwljYXNlIElSQ0FQVFVSRToKKwljYXNlIElSU0hJRlQ6CisJY2FzZSBJUkVYSVQxOgorCWNhc2UgSVJQQVVTRToKKwljYXNlIElSRVhJVDI6CisJY2FzZSBJUlVQREFURToKKwkJc3RhcnRfY29kZSA9IDI7CisJCXN0YXJ0X3N0YXRlID0gSVJQQVVTRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRVJFTU9URUlPOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApCisJCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBzdGFydF9zdGF0ZSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIHN0YXJ0X3N0YXRlKTsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlpZiAoc2hpZnRfY291bnQgPiBqcy0+ZHJfbGVuZ3RoKSB7CisJCQlhbGxvY19jaGFycyA9IChzaGlmdF9jb3VudCArIDcpID4+IDM7CisJCQlrZnJlZShqcy0+ZHJfYnVmZmVyKTsKKwkJCWpzLT5kcl9idWZmZXIgPSAodTggKilhbHRfbWFsbG9jKGFsbG9jX2NoYXJzKTsKKwkJCWlmIChqcy0+ZHJfYnVmZmVyID09IE5VTEwpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWVsc2UKKwkJCQlqcy0+ZHJfbGVuZ3RoID0gYWxsb2NfY2hhcnMgKiA4OworCisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyoKKwkJICogQ29weSBwcmVhbWJsZSBkYXRhLCBEUiBkYXRhLAorCQkgKiBhbmQgcG9zdGFtYmxlIGRhdGEgaW50byBhIGJ1ZmZlcgorCQkgKi8KKwkJYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEoanMtPmRyX2J1ZmZlciwKKwkJCQkJanMtPmRyX3ByZV9kYXRhLAorCQkJCQlqcy0+ZHJfcHJlLAorCQkJCQl0ZGlfZGF0YSwKKwkJCQkJc3RhcnRfaW5kZXgsCisJCQkJCWNvdW50LAorCQkJCQlqcy0+ZHJfcG9zdF9kYXRhLAorCQkJCQlqcy0+ZHJfcG9zdCk7CisJCS8qIERvIHRoZSBEUlNDQU4gKi8KKwkJYWx0X2p0YWdfZHJzY2FuKGFzdGF0ZSwgc3RhcnRfY29kZSwgc2hpZnRfY291bnQsCisJCQkJanMtPmRyX2J1ZmZlciwgTlVMTCk7CisJCS8qIGFsdF9qdGFnX2Ryc2NhbigpIGFsd2F5cyBlbmRzIGluIERSUEFVU0Ugc3RhdGUgKi8KKwkJanMtPmp0YWdfc3RhdGUgPSBEUlBBVVNFOworCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJaWYgKGpzLT5kcnN0b3Bfc3RhdGUgIT0gRFJQQVVTRSkKKwkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5kcnN0b3Bfc3RhdGUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9zd2FwX2RyKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwgdTMyIGNvdW50LAorCQkJCXU4ICppbl9kYXRhLCB1MzIgaW5faW5kZXgsCisJCQkJdTggKm91dF9kYXRhLCB1MzIgb3V0X2luZGV4KQorLyogU2hpZnRzIGRhdGEgaW50byBkYXRhIHJlZ2lzdGVyLCBjYXB0dXJpbmcgb3V0cHV0IGRhdGEgKi8KK3sKKwlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7CisJaW50IHN0YXJ0X2NvZGUgPSAwOworCXUzMiBhbGxvY19jaGFycyA9IDA7CisJdTMyIHNoaWZ0X2NvdW50ID0ganMtPmRyX3ByZSArIGNvdW50ICsganMtPmRyX3Bvc3Q7CisJaW50IHN0YXR1cyA9IDA7CisJZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKKworCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKKwljYXNlIElMTEVHQUxfSlRBR19TVEFURToKKwljYXNlIFJFU0VUOgorCWNhc2UgSURMRToKKwkJc3RhcnRfY29kZSA9IDA7CisJCXN0YXJ0X3N0YXRlID0gSURMRTsKKwkJYnJlYWs7CisKKwljYXNlIERSU0VMRUNUOgorCWNhc2UgRFJDQVBUVVJFOgorCWNhc2UgRFJTSElGVDoKKwljYXNlIERSRVhJVDE6CisJY2FzZSBEUlBBVVNFOgorCWNhc2UgRFJFWElUMjoKKwljYXNlIERSVVBEQVRFOgorCQlzdGFydF9jb2RlID0gMTsKKwkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOworCQlicmVhazsKKworCWNhc2UgSVJTRUxFQ1Q6CisJY2FzZSBJUkNBUFRVUkU6CisJY2FzZSBJUlNISUZUOgorCWNhc2UgSVJFWElUMToKKwljYXNlIElSUEFVU0U6CisJY2FzZSBJUkVYSVQyOgorCWNhc2UgSVJVUERBVEU6CisJCXN0YXJ0X2NvZGUgPSAyOworCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVSRU1PVEVJTzsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCisJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmRyX2xlbmd0aCkgeworCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOworCQkJa2ZyZWUoanMtPmRyX2J1ZmZlcik7CisJCQlqcy0+ZHJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7CisKKwkJCWlmIChqcy0+ZHJfYnVmZmVyID09IE5VTEwpCisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWVsc2UKKwkJCQlqcy0+ZHJfbGVuZ3RoID0gYWxsb2NfY2hhcnMgKiA4OworCisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyoKKwkJICogQ29weSBwcmVhbWJsZSBkYXRhLCBEUiBkYXRhLAorCQkgKiBhbmQgcG9zdGFtYmxlIGRhdGEgaW50byBhIGJ1ZmZlcgorCQkgKi8KKwkJYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEoanMtPmRyX2J1ZmZlciwKKwkJCQlqcy0+ZHJfcHJlX2RhdGEsCisJCQkJanMtPmRyX3ByZSwKKwkJCQlpbl9kYXRhLAorCQkJCWluX2luZGV4LAorCQkJCWNvdW50LAorCQkJCWpzLT5kcl9wb3N0X2RhdGEsCisJCQkJanMtPmRyX3Bvc3QpOworCisJCS8qIERvIHRoZSBEUlNDQU4gKi8KKwkJYWx0X2p0YWdfZHJzY2FuKGFzdGF0ZSwKKwkJCQlzdGFydF9jb2RlLAorCQkJCXNoaWZ0X2NvdW50LAorCQkJCWpzLT5kcl9idWZmZXIsCisJCQkJanMtPmRyX2J1ZmZlcik7CisKKwkJLyogYWx0X2p0YWdfZHJzY2FuKCkgYWx3YXlzIGVuZHMgaW4gRFJQQVVTRSBzdGF0ZSAqLworCQlqcy0+anRhZ19zdGF0ZSA9IERSUEFVU0U7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlpZiAoanMtPmRyc3RvcF9zdGF0ZSAhPSBEUlBBVVNFKQorCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwganMtPmRyc3RvcF9zdGF0ZSk7CisKKwlpZiAoc3RhdHVzID09IDApCisJCS8qIE5vdyBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGZyb20gdGhlIGJ1ZmZlciAqLworCQlhbHRlcmFfZXh0cmFjdF90YXJnZXRfZGF0YShqcy0+ZHJfYnVmZmVyLAorCQkJCQlvdXRfZGF0YSwKKwkJCQkJb3V0X2luZGV4LAorCQkJCQlqcy0+ZHJfcHJlLAorCQkJCQljb3VudCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIGFsdGVyYV9mcmVlX2J1ZmZlcnMoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlKQoreworCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKKwkvKiBJZiB0aGUgSlRBRyBpbnRlcmZhY2Ugd2FzIHVzZWQsIHJlc2V0IGl0IHRvIFRMUiAqLworCWlmIChqcy0+anRhZ19zdGF0ZSAhPSBJTExFR0FMX0pUQUdfU1RBVEUpCisJCWFsdGVyYV9qcmVzZXRfaWRsZShhc3RhdGUpOworCisJa2ZyZWUoanMtPmRyX3ByZV9kYXRhKTsKKwlqcy0+ZHJfcHJlX2RhdGEgPSBOVUxMOworCisJa2ZyZWUoanMtPmRyX3Bvc3RfZGF0YSk7CisJanMtPmRyX3Bvc3RfZGF0YSA9IE5VTEw7CisKKwlrZnJlZShqcy0+ZHJfYnVmZmVyKTsKKwlqcy0+ZHJfYnVmZmVyID0gTlVMTDsKKworCWtmcmVlKGpzLT5pcl9wcmVfZGF0YSk7CisJanMtPmlyX3ByZV9kYXRhID0gTlVMTDsKKworCWtmcmVlKGpzLT5pcl9wb3N0X2RhdGEpOworCWpzLT5pcl9wb3N0X2RhdGEgPSBOVUxMOworCisJa2ZyZWUoanMtPmlyX2J1ZmZlcik7CisJanMtPmlyX2J1ZmZlciA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmggYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS1qdGFnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuaApyZW5hbWUgdG8gZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1scHQuYyBiL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWxwdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS1scHQuYwpyZW5hbWUgdG8gZHJpdmVycy9taXNjL2FsdGVyYS1zdGFwbC9hbHRlcmEtbHB0LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjcyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCkBAIC0wLDAgKzEsMjUzNyBAQAorLyoKKyAqIGFsdGVyYS5jCisgKgorICogYWx0ZXJhIEZQR0EgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSBBbHRlcmEgQ29ycG9yYXRpb24gMTk5OC0yMDAxCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBOZXRVUCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG5ldHVwLnJ1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bWlzYy9hbHRlcmEuaD4KKyNpbmNsdWRlICJhbHRlcmEtZXhwcnQuaCIKKyNpbmNsdWRlICJhbHRlcmEtanRhZy5oIgorCitzdGF0aWMgaW50IGRlYnVnID0gMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiYWx0ZXJhIEZQR0Ega2VybmVsIG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiSWdvciBNLiBMaXBsaWFuaW4gIDxsaXBsaWFuaW5AbmV0dXAucnU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisJaWYgKGRlYnVnKSB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7IFwKKwl9CisKK2VudW0gYWx0ZXJhX2ZwZ2Ffb3Bjb2RlIHsKKwlPUF9OT1AgPSAwLAorCU9QX0RVUCwKKwlPUF9TV1AsCisJT1BfQURELAorCU9QX1NVQiwKKwlPUF9NVUxULAorCU9QX0RJViwKKwlPUF9NT0QsCisJT1BfU0hMLAorCU9QX1NIUiwKKwlPUF9OT1QsCisJT1BfQU5ELAorCU9QX09SLAorCU9QX1hPUiwKKwlPUF9JTlYsCisJT1BfR1QsCisJT1BfTFQsCisJT1BfUkVULAorCU9QX0NNUFMsCisJT1BfUElOVCwKKwlPUF9QUk5ULAorCU9QX0RTUywKKwlPUF9EU1NDLAorCU9QX0lTUywKKwlPUF9JU1NDLAorCU9QX0RQUiA9IDB4MWMsCisJT1BfRFBSTCwKKwlPUF9EUE8sCisJT1BfRFBPTCwKKwlPUF9JUFIsCisJT1BfSVBSTCwKKwlPUF9JUE8sCisJT1BfSVBPTCwKKwlPUF9QQ0hSLAorCU9QX0VYSVQsCisJT1BfRVFVLAorCU9QX1BPUFQsCisJT1BfQUJTID0gMHgyYywKKwlPUF9CQ0gwLAorCU9QX1BTSDAgPSAweDJmLAorCU9QX1BTSEwgPSAweDQwLAorCU9QX1BTSFYsCisJT1BfSk1QLAorCU9QX0NBTEwsCisJT1BfTkVYVCwKKwlPUF9QU1RSLAorCU9QX1NJTlQgPSAweDQ3LAorCU9QX1NULAorCU9QX0lTVFAsCisJT1BfRFNUUCwKKwlPUF9TV1BOLAorCU9QX0RVUE4sCisJT1BfUE9QViwKKwlPUF9QT1BFLAorCU9QX1BPUEEsCisJT1BfSk1QWiwKKwlPUF9EUywKKwlPUF9JUywKKwlPUF9EUFJBLAorCU9QX0RQT0EsCisJT1BfSVBSQSwKKwlPUF9JUE9BLAorCU9QX0VYUFQsCisJT1BfUFNIRSwKKwlPUF9QU0hBLAorCU9QX0RZTkEsCisJT1BfRVhQViA9IDB4NWMsCisJT1BfQ09QWSA9IDB4ODAsCisJT1BfUkVWQSwKKwlPUF9EU0MsCisJT1BfSVNDLAorCU9QX1dBSVQsCisJT1BfVlMsCisJT1BfQ01QQSA9IDB4YzAsCisJT1BfVlNDLAorfTsKKworc3RydWN0IGFsdGVyYV9wcm9jaW5mbyB7CisJY2hhcgkJCSpuYW1lOworCXU4CQkJYXR0cnM7CisJc3RydWN0IGFsdGVyYV9wcm9jaW5mbwkqbmV4dDsKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGVub3VnaCBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUgb24gdGhlIHN0YWNrLiAqLworc3RhdGljIGludCBhbHRlcmFfY2hlY2tfc3RhY2soaW50IHN0YWNrX3B0ciwgaW50IGNvdW50LCBpbnQgKnN0YXR1cykKK3sKKwlpZiAoc3RhY2tfcHRyIDwgY291bnQpIHsKKwkJKnN0YXR1cyA9IC1FT1ZFUkZMT1c7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhbHRlcmFfZXhwb3J0X2ludChjaGFyICprZXksIHMzMiB2YWx1ZSkKK3sKKwlkcHJpbnRrKCJFeHBvcnQ6IGtleSA9IFwiJXNcIiwgdmFsdWUgPSAlZFxuIiwga2V5LCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgSEVYX0xJTkVfQ0hBUlMgNzIKKyNkZWZpbmUgSEVYX0xJTkVfQklUUyAoSEVYX0xJTkVfQ0hBUlMgKiA0KQorCitzdGF0aWMgdm9pZCBhbHRlcmFfZXhwb3J0X2Jvb2xfYXJyYXkoY2hhciAqa2V5LCB1OCAqZGF0YSwgczMyIGNvdW50KQoreworCWNoYXIgc3RyaW5nW0hFWF9MSU5FX0NIQVJTICsgMV07CisJczMyIGksIG9mZnNldDsKKwl1MzIgc2l6ZSwgbGluZSwgbGluZXMsIGxpbmViaXRzLCB2YWx1ZSwgaiwgazsKKworCWlmIChjb3VudCA+IEhFWF9MSU5FX0JJVFMpIHsKKwkJZHByaW50aygiRXhwb3J0OiBrZXkgPSBcIiVzXCIsICVkIGJpdHMsIHZhbHVlID0gSEVYXG4iLAorCQkJCQkJCWtleSwgY291bnQpOworCQlsaW5lcyA9IChjb3VudCArIChIRVhfTElORV9CSVRTIC0gMSkpIC8gSEVYX0xJTkVfQklUUzsKKworCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbGluZXM7ICsrbGluZSkgeworCQkJaWYgKGxpbmUgPCAobGluZXMgLSAxKSkgeworCQkJCWxpbmViaXRzID0gSEVYX0xJTkVfQklUUzsKKwkJCQlzaXplID0gSEVYX0xJTkVfQ0hBUlM7CisJCQkJb2Zmc2V0ID0gY291bnQgLSAoKGxpbmUgKyAxKSAqIEhFWF9MSU5FX0JJVFMpOworCQkJfSBlbHNlIHsKKwkJCQlsaW5lYml0cyA9CisJCQkJCWNvdW50IC0gKChsaW5lcyAtIDEpICogSEVYX0xJTkVfQklUUyk7CisJCQkJc2l6ZSA9IChsaW5lYml0cyArIDMpIC8gNDsKKwkJCQlvZmZzZXQgPSAwTDsKKwkJCX0KKworCQkJc3RyaW5nW3NpemVdID0gJ1wwJzsKKwkJCWogPSBzaXplIC0gMTsKKwkJCXZhbHVlID0gMDsKKworCQkJZm9yIChrID0gMDsgayA8IGxpbmViaXRzOyArK2spIHsKKwkJCQlpID0gayArIG9mZnNldDsKKwkJCQlpZiAoZGF0YVtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSkpCisJCQkJCXZhbHVlIHw9ICgxIDw8IChpICYgMykpOworCQkJCWlmICgoaSAmIDMpID09IDMpIHsKKwkJCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOworCQkJCQl2YWx1ZSA9IDA7CisJCQkJCS0tajsKKwkJCQl9CisJCQl9CisJCQlpZiAoKGsgJiAzKSA+IDApCisJCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOworCisJCQlkcHJpbnRrKCIlc1xuIiwgc3RyaW5nKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJc2l6ZSA9IChjb3VudCArIDMpIC8gNDsKKwkJc3RyaW5nW3NpemVdID0gJ1wwJzsKKwkJaiA9IHNpemUgLSAxOworCQl2YWx1ZSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJCWlmIChkYXRhW2kgPj4gM10gJiAoMSA8PCAoaSAmIDcpKSkKKwkJCQl2YWx1ZSB8PSAoMSA8PCAoaSAmIDMpKTsKKwkJCWlmICgoaSAmIDMpID09IDMpIHsKKwkJCQlzcHJpbnRmKCZzdHJpbmdbal0sICIlMXgiLCB2YWx1ZSk7CisJCQkJdmFsdWUgPSAwOworCQkJCS0tajsKKwkJCX0KKwkJfQorCQlpZiAoKGkgJiAzKSA+IDApCisJCQlzcHJpbnRmKCZzdHJpbmdbal0sICIlMXgiLCB2YWx1ZSk7CisKKwkJZHByaW50aygiRXhwb3J0OiBrZXkgPSBcIiVzXCIsICVkIGJpdHMsIHZhbHVlID0gSEVYICVzXG4iLAorCQkJa2V5LCBjb3VudCwgc3RyaW5nKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX2V4ZWN1dGUoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAorCQkJCXU4ICpwLAorCQkJCXMzMiBwcm9ncmFtX3NpemUsCisJCQkJczMyICplcnJvcl9hZGRyZXNzLAorCQkJCWludCAqZXhpdF9jb2RlLAorCQkJCWludCAqZm9ybWF0X3ZlcnNpb24pCit7CisJc3RydWN0IGFsdGVyYV9jb25maWcgKmFjb25mID0gYXN0YXRlLT5jb25maWc7CisJY2hhciAqbXNnX2J1ZmYgPSBhc3RhdGUtPm1zZ19idWZmOworCWxvbmcgKnN0YWNrID0gYXN0YXRlLT5zdGFjazsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgZmlyc3Rfd29yZCA9IDBMOworCXUzMiBhY3Rpb25fdGFibGUgPSAwTDsKKwl1MzIgcHJvY190YWJsZSA9IDBMOworCXUzMiBzdHJfdGFibGUgPSAwTDsKKwl1MzIgc3ltX3RhYmxlID0gMEw7CisJdTMyIGRhdGFfc2VjdCA9IDBMOworCXUzMiBjb2RlX3NlY3QgPSAwTDsKKwl1MzIgZGVidWdfc2VjdCA9IDBMOworCXUzMiBhY3Rpb25fY291bnQgPSAwTDsKKwl1MzIgcHJvY19jb3VudCA9IDBMOworCXUzMiBzeW1fY291bnQgPSAwTDsKKwlsb25nICp2YXJzID0gTlVMTDsKKwlzMzIgKnZhcl9zaXplID0gTlVMTDsKKwljaGFyICphdHRycyA9IE5VTEw7CisJdTggKnByb2NfYXR0cmlidXRlcyA9IE5VTEw7CisJdTMyIHBjOworCXUzMiBvcGNvZGVfYWRkcmVzczsKKwl1MzIgYXJnc1szXTsKKwl1MzIgb3Bjb2RlOworCXUzMiBuYW1lX2lkOworCXU4IGNoYXJidWZbNF07CisJbG9uZyBsb25nX3RtcDsKKwl1MzIgdmFyaWFibGVfaWQ7CisJdTggKmNoYXJwdHJfdG1wOworCXU4ICpjaGFycHRyX3RtcDI7CisJbG9uZyAqbG9uZ3B0cl90bXA7CisJaW50IHZlcnNpb24gPSAwOworCWludCBkZWx0YSA9IDA7CisJaW50IHN0YWNrX3B0ciA9IDA7CisJdTMyIGFyZ19jb3VudDsKKwlpbnQgZG9uZSA9IDA7CisJaW50IGJhZF9vcGNvZGUgPSAwOworCXUzMiBjb3VudDsKKwl1MzIgaW5kZXg7CisJdTMyIGluZGV4MjsKKwlzMzIgbG9uZ19jb3VudDsKKwlzMzIgbG9uZ19pZHg7CisJczMyIGxvbmdfaWR4MjsKKwl1MzIgaTsKKwl1MzIgajsKKwl1MzIgdW5jb21wX3NpemU7CisJdTMyIG9mZnNldDsKKwl1MzIgdmFsdWU7CisJaW50IGN1cnJlbnRfcHJvYyA9IDA7CisJaW50IHJldmVyc2U7CisKKwljaGFyICpuYW1lOworCisJZHByaW50aygiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIFJlYWQgaGVhZGVyIGluZm9ybWF0aW9uICovCisJaWYgKHByb2dyYW1fc2l6ZSA+IDUyTCkgeworCQlmaXJzdF93b3JkICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKKwkJdmVyc2lvbiA9IChmaXJzdF93b3JkICYgMUwpOworCQkqZm9ybWF0X3ZlcnNpb24gPSB2ZXJzaW9uICsgMTsKKwkJZGVsdGEgPSB2ZXJzaW9uICogODsKKworCQlhY3Rpb25fdGFibGUgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzRdKTsKKwkJcHJvY190YWJsZSAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs4XSk7CisJCXN0cl90YWJsZSAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNCArIGRlbHRhXSk7CisJCXN5bV90YWJsZSAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMTYgKyBkZWx0YV0pOworCQlkYXRhX3NlY3QgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzIwICsgZGVsdGFdKTsKKwkJY29kZV9zZWN0ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsyNCArIGRlbHRhXSk7CisJCWRlYnVnX3NlY3QgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMjggKyBkZWx0YV0pOworCQlhY3Rpb25fY291bnQgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQwICsgZGVsdGFdKTsKKwkJcHJvY19jb3VudCAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0NCArIGRlbHRhXSk7CisJCXN5bV9jb3VudCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDggKyAoMiAqIGRlbHRhKV0pOworCX0KKworCWlmICgoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAwTCkgJiYgKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMUwpKSB7CisJCWRvbmUgPSAxOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGV4aXRfZG9uZTsKKwl9CisKKwlpZiAoc3ltX2NvdW50IDw9IDApCisJCWdvdG8gZXhpdF9kb25lOworCisJdmFycyA9IGt6YWxsb2Moc3ltX2NvdW50ICogc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKworCWlmICh2YXJzID09IE5VTEwpCisJCXN0YXR1cyA9IC1FTk9NRU07CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJdmFyX3NpemUgPSBremFsbG9jKHN5bV9jb3VudCAqIHNpemVvZihzMzIpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAodmFyX3NpemUgPT0gTlVMTCkKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWF0dHJzID0ga3phbGxvYyhzeW1fY291bnQsIEdGUF9LRVJORUwpOworCisJCWlmIChhdHRycyA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSAwKSAmJiAodmVyc2lvbiA+IDApKSB7CisJCXByb2NfYXR0cmlidXRlcyA9IGt6YWxsb2MocHJvY19jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKHByb2NfYXR0cmlidXRlcyA9PSBOVUxMKQorCQkJc3RhdHVzID0gLUVOT01FTTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZXhpdF9kb25lOworCisJZGVsdGEgPSB2ZXJzaW9uICogMjsKKworCWZvciAoaSA9IDA7IGkgPCBzeW1fY291bnQ7ICsraSkgeworCQlvZmZzZXQgPSAoc3ltX3RhYmxlICsgKCgxMSArIGRlbHRhKSAqIGkpKTsKKworCQl2YWx1ZSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtvZmZzZXQgKyAzICsgZGVsdGFdKTsKKworCQlhdHRyc1tpXSA9IHBbb2Zmc2V0XTsKKworCQkvKgorCQkgKiB1c2UgYml0IDcgb2YgYXR0cmlidXRlIGJ5dGUgdG8gaW5kaWNhdGUgdGhhdAorCQkgKiB0aGlzIGJ1ZmZlciB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJCSAqIGFuZCBzaG91bGQgYmUgZnJlZWQgbGF0ZXIKKwkJICovCisJCWF0dHJzW2ldICY9IDB4N2Y7CisKKwkJdmFyX3NpemVbaV0gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbb2Zmc2V0ICsgNyArIGRlbHRhXSk7CisKKwkJLyoKKwkJICogQXR0cmlidXRlIGJpdHM6CisJCSAqIGJpdCAwOiAwID0gcmVhZC1vbmx5LCAxID0gcmVhZC13cml0ZQorCQkgKiBiaXQgMTogMCA9IG5vdCBjb21wcmVzc2VkLCAxID0gY29tcHJlc3NlZAorCQkgKiBiaXQgMjogMCA9IG5vdCBpbml0aWFsaXplZCwgMSA9IGluaXRpYWxpemVkCisJCSAqIGJpdCAzOiAwID0gc2NhbGFyLCAxID0gYXJyYXkKKwkJICogYml0IDQ6IDAgPSBCb29sZWFuLCAxID0gaW50ZWdlcgorCQkgKiBiaXQgNTogMCA9IGRlY2xhcmVkIHZhcmlhYmxlLAorCQkgKgkxID0gY29tcGlsZXIgY3JlYXRlZCB0ZW1wb3JhcnkgdmFyaWFibGUKKwkJICovCisKKwkJaWYgKChhdHRyc1tpXSAmIDB4MGMpID09IDB4MDQpCisJCQkvKiBpbml0aWFsaXplZCBzY2FsYXIgdmFyaWFibGUgKi8KKwkJCXZhcnNbaV0gPSB2YWx1ZTsKKwkJZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgxZSkgPT0gMHgwZSkgeworCQkJLyogaW5pdGlhbGl6ZWQgY29tcHJlc3NlZCBCb29sZWFuIGFycmF5ICovCisJCQl1bmNvbXBfc2l6ZSA9IGdldF91bmFsaWduZWRfbGUzMigmcFtkYXRhX3NlY3QgKyB2YWx1ZV0pOworCisJCQkvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisJCQl2YXJzW2ldID0gKGxvbmcpa3phbGxvYyh1bmNvbXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAodmFyc1tpXSA9PSAwTCkKKwkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZWxzZSB7CisJCQkJLyogc2V0IGZsYWcgc28gYnVmZmVyIHdpbGwgYmUgZnJlZWQgbGF0ZXIgKi8KKwkJCQlhdHRyc1tpXSB8PSAweDgwOworCisJCQkJLyogdW5jb21wcmVzcyB0aGUgZGF0YSAqLworCQkJCWlmIChhbHRlcmFfc2hyaW5rKCZwW2RhdGFfc2VjdCArIHZhbHVlXSwKKwkJCQkJCXZhcl9zaXplW2ldLAorCQkJCQkJKHU4ICopdmFyc1tpXSwKKwkJCQkJCXVuY29tcF9zaXplLAorCQkJCQkJdmVyc2lvbikgIT0gdW5jb21wX3NpemUpCisJCQkJCS8qIGRlY29tcHJlc3Npb24gZmFpbGVkICovCisJCQkJCXN0YXR1cyA9IC1FSU87CisJCQkJZWxzZQorCQkJCQl2YXJfc2l6ZVtpXSA9IHVuY29tcF9zaXplICogOEw7CisKKwkJCX0KKwkJfSBlbHNlIGlmICgoYXR0cnNbaV0gJiAweDFlKSA9PSAweDBjKSB7CisJCQkvKiBpbml0aWFsaXplZCBCb29sZWFuIGFycmF5ICovCisJCQl2YXJzW2ldID0gdmFsdWUgKyBkYXRhX3NlY3QgKyAobG9uZylwOworCQl9IGVsc2UgaWYgKChhdHRyc1tpXSAmIDB4MWMpID09IDB4MWMpIHsKKwkJCS8qIGluaXRpYWxpemVkIGludGVnZXIgYXJyYXkgKi8KKwkJCXZhcnNbaV0gPSB2YWx1ZSArIGRhdGFfc2VjdDsKKwkJfSBlbHNlIGlmICgoYXR0cnNbaV0gJiAweDBjKSA9PSAweDA4KSB7CisJCQkvKiB1bmluaXRpYWxpemVkIGFycmF5ICovCisKKwkJCS8qIGZsYWcgYXR0cnMgc28gdGhhdCBtZW1vcnkgaXMgZnJlZWQgKi8KKwkJCWF0dHJzW2ldIHw9IDB4ODA7CisKKwkJCWlmICh2YXJfc2l6ZVtpXSA+IDApIHsKKwkJCQl1MzIgc2l6ZTsKKworCQkJCWlmIChhdHRyc1tpXSAmIDB4MTApCisJCQkJCS8qIGludGVnZXIgYXJyYXkgKi8KKwkJCQkJc2l6ZSA9ICh2YXJfc2l6ZVtpXSAqIHNpemVvZihzMzIpKTsKKwkJCQllbHNlCisJCQkJCS8qIEJvb2xlYW4gYXJyYXkgKi8KKwkJCQkJc2l6ZSA9ICgodmFyX3NpemVbaV0gKyA3TCkgLyA4TCk7CisKKwkJCQl2YXJzW2ldID0gKGxvbmcpa3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworCQkJCWlmICh2YXJzW2ldID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB6ZXJvIG91dCBtZW1vcnkgKi8KKwkJCQkJZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikKKwkJCQkJCSgodTggKikodmFyc1tpXSkpW2pdID0gMDsKKworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXZhcnNbaV0gPSAwOworCisJCX0gZWxzZQorCQkJdmFyc1tpXSA9IDA7CisKKwl9CisKK2V4aXRfZG9uZToKKwlpZiAoc3RhdHVzICE9IDApCisJCWRvbmUgPSAxOworCisJYWx0ZXJhX2ppbml0KGFzdGF0ZSk7CisKKwlwYyA9IGNvZGVfc2VjdDsKKwltc2dfYnVmZlswXSA9ICdcMCc7CisKKwkvKgorCSAqIEZvciBKQkMgdmVyc2lvbiAyLCB3ZSB3aWxsIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgY29ycmVzcG9uZGluZyB0bworCSAqIHRoZSBzZWxlY3RlZCBBQ1RJT04KKwkgKi8KKwlpZiAodmVyc2lvbiA+IDApIHsKKwkJaWYgKGFjb25mLT5hY3Rpb24gPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWRvbmUgPSAxOworCQl9IGVsc2UgeworCQkJaW50IGFjdGlvbl9mb3VuZCA9IDA7CisJCQlmb3IgKGkgPSAwOyAoaSA8IGFjdGlvbl9jb3VudCkgJiYgIWFjdGlvbl9mb3VuZDsgKytpKSB7CisJCQkJbmFtZV9pZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKworCQkJCQkJCQkoMTIgKiBpKV0pOworCisJCQkJbmFtZSA9ICZwW3N0cl90YWJsZSArIG5hbWVfaWRdOworCisJCQkJaWYgKHN0cm5pY21wKGFjb25mLT5hY3Rpb24sIG5hbWUsIHN0cmxlbihuYW1lKSkgPT0gMCkgeworCQkJCQlhY3Rpb25fZm91bmQgPSAxOworCQkJCQljdXJyZW50X3Byb2MgPQorCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArCisJCQkJCQkJCSgxMiAqIGkpICsgOF0pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFhY3Rpb25fZm91bmQpIHsKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJCWRvbmUgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlpbnQgZmlyc3RfdGltZSA9IDE7CisJCQlpID0gY3VycmVudF9wcm9jOworCQkJd2hpbGUgKChpICE9IDApIHx8IGZpcnN0X3RpbWUpIHsKKwkJCQlmaXJzdF90aW1lID0gMDsKKwkJCQkvKiBjaGVjayBwcm9jZWR1cmUgYXR0cmlidXRlIGJ5dGUgKi8KKwkJCQlwcm9jX2F0dHJpYnV0ZXNbaV0gPQorCQkJCQkJKHBbcHJvY190YWJsZSArCisJCQkJCQkJCSgxMyAqIGkpICsgOF0gJgorCQkJCQkJCQkJMHgwMyk7CisKKwkJCQkvKgorCQkJCSAqIEJJVDAgLSBPUFRJT05BTAorCQkJCSAqIEJJVDEgLSBSRUNPTU1FTkRFRAorCQkJCSAqIEJJVDYgLSBGT1JDRUQgT0ZGCisJCQkJICogQklUNyAtIEZPUkNFRCBPTgorCQkJCSAqLworCisJCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKKwkJCQkJCQkoMTMgKiBpKSArIDRdKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCBjdXJyZW50X3Byb2MgdG8gdGhlIGZpcnN0IHByb2NlZHVyZQorCQkJICogdG8gYmUgZXhlY3V0ZWQKKwkJCSAqLworCQkJaSA9IGN1cnJlbnRfcHJvYzsKKwkJCXdoaWxlICgoaSAhPSAwKSAmJgorCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldID09IDEpIHx8CisJCQkJKChwcm9jX2F0dHJpYnV0ZXNbaV0gJiAweGMwKSA9PSAweDQwKSkpIHsKKwkJCQlpID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKworCQkJCQkJCSgxMyAqIGkpICsgNF0pOworCQkJfQorCisJCQlpZiAoKGkgIT0gMCkgfHwgKChpID09IDApICYmIChjdXJyZW50X3Byb2MgPT0gMCkgJiYKKwkJCQkoKHByb2NfYXR0cmlidXRlc1swXSAhPSAxKSAmJgorCQkJCSgocHJvY19hdHRyaWJ1dGVzWzBdICYgMHhjMCkgIT0gMHg0MCkpKSkgeworCQkJCWN1cnJlbnRfcHJvYyA9IGk7CisJCQkJcGMgPSBjb2RlX3NlY3QgKworCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCisJCQkJCQkJCSgxMyAqIGkpICsgOV0pOworCQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8IChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCX0gZWxzZQorCQkJCS8qIHRoZXJlIGFyZSBubyBwcm9jZWR1cmVzIHRvIGV4ZWN1dGUhICovCisJCQkJZG9uZSA9IDE7CisKKwkJfQorCX0KKworCW1zZ19idWZmWzBdID0gJ1wwJzsKKworCXdoaWxlICghZG9uZSkgeworCQlvcGNvZGUgPSAocFtwY10gJiAweGZmKTsKKwkJb3Bjb2RlX2FkZHJlc3MgPSBwYzsKKwkJKytwYzsKKworCQlpZiAoZGVidWcgPiAxKQorCQkJcHJpbnRrKCJvcGNvZGU6ICUwMnhcbiIsIG9wY29kZSk7CisKKwkJYXJnX2NvdW50ID0gKG9wY29kZSA+PiA2KSAmIDM7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdfY291bnQ7ICsraSkgeworCQkJYXJnc1tpXSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwY10pOworCQkJcGMgKz0gNDsKKwkJfQorCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgT1BfTk9QOgorCQkJYnJlYWs7CisJCWNhc2UgT1BfRFVQOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCSsrc3RhY2tfcHRyOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfU1dQOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9BREQ6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSArPSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfU1VCOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJLS1zdGFja19wdHI7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gLT0gc3RhY2tbc3RhY2tfcHRyXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX01VTFQ6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAqPSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfRElWOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJLS1zdGFja19wdHI7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gLz0gc3RhY2tbc3RhY2tfcHRyXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX01PRDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdICU9IHN0YWNrW3N0YWNrX3B0cl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9TSEw6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA8PD0gc3RhY2tbc3RhY2tfcHRyXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1NIUjoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgeworCQkJCS0tc3RhY2tfcHRyOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID4+PSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfTk9UOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQorCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIF49ICgtMUwpOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9BTkQ6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAmPSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfT1I6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQktLXN0YWNrX3B0cjsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSB8PSBzdGFja1tzdGFja19wdHJdOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfWE9SOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJLS1zdGFja19wdHI7CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gXj0gc3RhY2tbc3RhY2tfcHRyXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0lOVjoKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdID8gMEwgOiAxTDsKKwkJCWJyZWFrOworCQljYXNlIE9QX0dUOgorCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCS0tc3RhY2tfcHRyOworCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQorCQkJCShzdGFja1tzdGFja19wdHIgLSAxXSA+IHN0YWNrW3N0YWNrX3B0cl0pID8KKwkJCQkJCQkJCTFMIDogMEw7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0xUOgorCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCS0tc3RhY2tfcHRyOworCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQorCQkJCShzdGFja1tzdGFja19wdHIgLSAxXSA8IHN0YWNrW3N0YWNrX3B0cl0pID8KKwkJCQkJCQkJCTFMIDogMEw7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFVDoKKwkJCWlmICgodmVyc2lvbiA+IDApICYmIChzdGFja19wdHIgPT0gMCkpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGNvbXBsZXRlZCBvbmUgb2YgdGhlIG1haW4gcHJvY2VkdXJlcworCQkJCSAqIG9mIGFuIEFDVElPTi4KKwkJCQkgKiBGaW5kIHRoZSBuZXh0IHByb2NlZHVyZQorCQkJCSAqIHRvIGJlIGV4ZWN1dGVkIGFuZCBqdW1wIHRvIGl0LgorCQkJCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIHByb2NlZHVyZXMsIHRoZW4gRVhJVC4KKwkJCQkgKi8KKwkJCQlpID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKworCQkJCQkJKDEzICogY3VycmVudF9wcm9jKSArIDRdKTsKKwkJCQl3aGlsZSAoKGkgIT0gMCkgJiYKKwkJCQkJKChwcm9jX2F0dHJpYnV0ZXNbaV0gPT0gMSkgfHwKKwkJCQkJKChwcm9jX2F0dHJpYnV0ZXNbaV0gJiAweGMwKSA9PSAweDQwKSkpCisJCQkJCWkgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCisJCQkJCQkJCSgxMyAqIGkpICsgNF0pOworCisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkvKiBubyBwcm9jZWR1cmVzIHRvIGV4ZWN1dGUhICovCisJCQkJCWRvbmUgPSAxOworCQkJCQkqZXhpdF9jb2RlID0gMDsJLyogc3VjY2VzcyAqLworCQkJCX0gZWxzZSB7CisJCQkJCWN1cnJlbnRfcHJvYyA9IGk7CisJCQkJCXBjID0gY29kZV9zZWN0ICsgZ2V0X3VuYWxpZ25lZF9iZTMyKAorCQkJCQkJCQkmcFtwcm9jX3RhYmxlICsKKwkJCQkJCQkJKDEzICogaSkgKyA5XSk7CisJCQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8CisJCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCisJCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCX0KKworCQkJfSBlbHNlCisJCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJCXBjID0gc3RhY2tbLS1zdGFja19wdHJdICsgY29kZV9zZWN0OworCQkJCQlpZiAoKHBjIDw9IGNvZGVfc2VjdCkgfHwKKwkJCQkJICAgIChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisKKwkJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0NNUFM6CisJCQkvKgorCQkJICogQXJyYXkgc2hvcnQgY29tcGFyZQorCQkJICogLi4uc3RhY2sgMCBpcyBzb3VyY2UgMSB2YWx1ZQorCQkJICogLi4uc3RhY2sgMSBpcyBzb3VyY2UgMiB2YWx1ZQorCQkJICogLi4uc3RhY2sgMiBpcyBtYXNrIHZhbHVlCisJCQkgKiAuLi5zdGFjayAzIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCA0LCAmc3RhdHVzKSkgeworCQkJCXMzMiBhID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXMzMiBiID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCWNvdW50ID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisKKwkJCQlpZiAoKGNvdW50IDwgMSkgfHwgKGNvdW50ID4gMzIpKQorCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWVsc2UgeworCQkJCQlsb25nX3RtcCAmPSAoKC0xTCkgPj4gKDMyIC0gY291bnQpKTsKKworCQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9CisJCQkJCSgoYSAmIGxvbmdfdG1wKSA9PSAoYiAmIGxvbmdfdG1wKSkKKwkJCQkJCQkJPyAxTCA6IDBMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1BJTlQ6CisJCQkvKgorCQkJICogUFJJTlQgYWRkIGludGVnZXIKKwkJCSAqIC4uLnN0YWNrIDAgaXMgaW50ZWdlciB2YWx1ZQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJc3ByaW50ZigmbXNnX2J1ZmZbc3RybGVuKG1zZ19idWZmKV0sCisJCQkJCSIlbGQiLCBzdGFja1stLXN0YWNrX3B0cl0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUFJOVDoKKwkJCS8qIFBSSU5UIGZpbmlzaCAqLworCQkJaWYgKGRlYnVnKQorCQkJCXByaW50ayhtc2dfYnVmZiwgIlxuIik7CisKKwkJCW1zZ19idWZmWzBdID0gJ1wwJzsKKwkJCWJyZWFrOworCQljYXNlIE9QX0RTUzoKKwkJCS8qCisJCQkgKiBEUlNDQU4gc2hvcnQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgc2NhbiBkYXRhCisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7CisJCQlzdGF0dXMgPSBhbHRlcmFfZHJzY2FuKGFzdGF0ZSwgY291bnQsIGNoYXJidWYsIDApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFNTQzoKKwkJCS8qCisJCQkgKiBEUlNDQU4gc2hvcnQgd2l0aCBjYXB0dXJlCisJCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQorCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQljb3VudCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7CisJCQlzdGF0dXMgPSBhbHRlcmFfc3dhcF9kcihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLAorCQkJCQkJCTAsIGNoYXJidWYsIDApOworCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmNoYXJidWZbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfSVNTOgorCQkJLyoKKwkJCSAqIElSU0NBTiBzaG9ydAorCQkJICogLi4uc3RhY2sgMCBpcyBzY2FuIGRhdGEKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9pcnNjYW4oYXN0YXRlLCBjb3VudCwgY2hhcmJ1ZiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9JU1NDOgorCQkJLyoKKwkJCSAqIElSU0NBTiBzaG9ydCB3aXRoIGNhcHR1cmUKKwkJCSAqIC4uLnN0YWNrIDAgaXMgc2NhbiBkYXRhCisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2lyKGFzdGF0ZSwgY291bnQsIGNoYXJidWYsCisJCQkJCQkJMCwgY2hhcmJ1ZiwgMCk7CisJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGdldF91bmFsaWduZWRfbGUzMigmY2hhcmJ1ZlswXSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9EUFI6CisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIDAsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFBSTDoKKwkJCS8qCisJCQkgKiBEUlBSRSB3aXRoIGxpdGVyYWwgZGF0YQorCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAorCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwgMCwKKwkJCQkJCWNoYXJidWYpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFBPOgorCQkJLyoKKwkJCSAqIERSUE9TVAorCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAorCQkJICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKKwkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LAorCQkJCQkJCQkwLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0RQT0w6CisJCQkvKgorCQkJICogRFJQT1NUIHdpdGggbGl0ZXJhbCBkYXRhCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGxpdGVyYWwgZGF0YQorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwgMCwKKwkJCQkJCQljaGFyYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0lQUjoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgeworCQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwKKwkJCQkJCQkJMCwgTlVMTCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9JUFJMOgorCQkJLyoKKwkJCSAqIElSUFJFIHdpdGggbGl0ZXJhbCBkYXRhCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGxpdGVyYWwgZGF0YQorCQkJICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsCisJCQkJCQkJMCwgY2hhcmJ1Zik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9JUE86CisJCQkvKgorCQkJICogSVJQT1NUCisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgeworCQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsCisJCQkJCQkJMCwgTlVMTCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9JUE9MOgorCQkJLyoKKwkJCSAqIElSUE9TVCB3aXRoIGxpdGVyYWwgZGF0YQorCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAorCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIDAsCisJCQkJCQkJY2hhcmJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9QQ0hSOgorCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7CisJCQkJdTggY2g7CisJCQkJY291bnQgPSBzdHJsZW4obXNnX2J1ZmYpOworCQkJCWNoID0gKGNoYXIpIHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlpZiAoKGNoIDwgMSkgfHwgKGNoID4gMTI3KSkgeworCQkJCQkvKgorCQkJCQkgKiBjaGFyYWN0ZXIgY29kZSBvdXQgb2YgcmFuZ2UKKwkJCQkJICogaW5zdGVhZCBvZiBmbGFnZ2luZyBhbiBlcnJvciwKKwkJCQkJICogZm9yY2UgdGhlIHZhbHVlIHRvIDEyNworCQkJCQkgKi8KKwkJCQkJY2ggPSAxMjc7CisJCQkJfQorCQkJCW1zZ19idWZmW2NvdW50XSA9IGNoOworCQkJCW1zZ19idWZmW2NvdW50ICsgMV0gPSAnXDAnOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfRVhJVDoKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQkqZXhpdF9jb2RlID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlkb25lID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0VRVToKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQktLXN0YWNrX3B0cjsKKwkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KKwkJCQkoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPT0gc3RhY2tbc3RhY2tfcHRyXSkgPworCQkJCQkJCQkJMUwgOiAwTDsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BPUFQ6CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJLS1zdGFja19wdHI7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0FCUzoKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlpZiAoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPCAwKQorCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gMCAtIHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9CQ0gwOgorCQkJLyoKKwkJCSAqIEJhdGNoIG9wZXJhdGlvbiAwCisJCQkgKiBTV1AKKwkJCSAqIFNXUE4gNworCQkJICogU1dQCisJCQkgKiBTV1BOIDYKKwkJCSAqIERVUE4gOAorCQkJICogU1dQTiAyCisJCQkgKiBTV1AKKwkJCSAqIERVUE4gNgorCQkJICogRFVQTiA2CisJCQkgKi8KKworCQkJLyogU1dQICAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisKKwkJCS8qIFNXUE4gNyAqLworCQkJaW5kZXggPSA3ICsgMTsKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOworCQkJfQorCisJCQkvKiBTV1AgICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKKwkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDJdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDJdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKworCQkJLyogU1dQTiA2ICovCisJCQlpbmRleCA9IDYgKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisKKwkJCS8qIERVUE4gOCAqLworCQkJaW5kZXggPSA4ICsgMTsKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKKwkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCSsrc3RhY2tfcHRyOworCQkJfQorCisJCQkvKiBTV1BOIDIgKi8KKwkJCWluZGV4ID0gMiArIDE7CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKKwkJCX0KKworCQkJLyogU1dQICAqLworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7CisJCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKKwkJCQlzdGFja1tzdGFja19wdHIgLSAyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisKKwkJCS8qIERVUE4gNiAqLworCQkJaW5kZXggPSA2ICsgMTsKKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKKwkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCSsrc3RhY2tfcHRyOworCQkJfQorCisJCQkvKiBEVVBOIDYgKi8KKwkJCWluZGV4ID0gNiArIDE7CisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7CisJCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKKwkJCQkrK3N0YWNrX3B0cjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX1BTSDA6CisJCQlzdGFja1tzdGFja19wdHIrK10gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUFNITDoKKwkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IChzMzIpIGFyZ3NbMF07CisJCQlicmVhazsKKwkJY2FzZSBPUF9QU0hWOgorCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gdmFyc1thcmdzWzBdXTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0pNUDoKKwkJCXBjID0gYXJnc1swXSArIGNvZGVfc2VjdDsKKwkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8IChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQ0FMTDoKKwkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IHBjOworCQkJcGMgPSBhcmdzWzBdICsgY29kZV9zZWN0OworCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwgKHBjID49IGRlYnVnX3NlY3QpKQorCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQlicmVhazsKKwkJY2FzZSBPUF9ORVhUOgorCQkJLyoKKwkJCSAqIFByb2Nlc3MgRk9SIC8gTkVYVCBsb29wCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIHN0ZXAgdmFsdWUKKwkJCSAqIC4uLnN0YWNrIDEgaXMgZW5kIHZhbHVlCisJCQkgKiAuLi5zdGFjayAyIGlzIHRvcCBhZGRyZXNzCisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkgeworCQkJCXMzMiBzdGVwID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07CisJCQkJczMyIGVuZCA9IHN0YWNrW3N0YWNrX3B0ciAtIDJdOworCQkJCXMzMiB0b3AgPSBzdGFja1tzdGFja19wdHIgLSAzXTsKKwkJCQlzMzIgaXRlcmF0b3IgPSB2YXJzW2FyZ3NbMF1dOworCQkJCWludCBicmVha19vdXQgPSAwOworCisJCQkJaWYgKHN0ZXAgPCAwKSB7CisJCQkJCWlmIChpdGVyYXRvciA8PSBlbmQpCisJCQkJCQlicmVha19vdXQgPSAxOworCQkJCX0gZWxzZSBpZiAoaXRlcmF0b3IgPj0gZW5kKQorCQkJCQlicmVha19vdXQgPSAxOworCisJCQkJaWYgKGJyZWFrX291dCkgeworCQkJCQlzdGFja19wdHIgLT0gMzsKKwkJCQl9IGVsc2UgeworCQkJCQl2YXJzW2FyZ3NbMF1dID0gaXRlcmF0b3IgKyBzdGVwOworCQkJCQlwYyA9IHRvcCArIGNvZGVfc2VjdDsKKwkJCQkJaWYgKChwYyA8IGNvZGVfc2VjdCkgfHwKKwkJCQkJICAgIChwYyA+PSBkZWJ1Z19zZWN0KSkKKwkJCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfUFNUUjoKKwkJCS8qCisJCQkgKiBQUklOVCBhZGQgc3RyaW5nCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0cmluZyBJRAorCQkJICovCisJCQljb3VudCA9IHN0cmxlbihtc2dfYnVmZik7CisJCQlzdHJsY3B5KCZtc2dfYnVmZltjb3VudF0sCisJCQkJJnBbc3RyX3RhYmxlICsgYXJnc1swXV0sCisJCQkJQUxURVJBX01FU1NBR0VfTEVOR1RIIC0gY291bnQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0lOVDoKKwkJCS8qCisJCQkgKiBTVEFURSBpbnRlcm1lZGlhdGUgc3RhdGUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RhdGUgY29kZQorCQkJICovCisJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBhcmdzWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1NUOgorCQkJLyoKKwkJCSAqIFNUQVRFIGZpbmFsIHN0YXRlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0YXRlIGNvZGUKKwkJCSAqLworCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgYXJnc1swXSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9JU1RQOgorCQkJLyoKKwkJCSAqIElSU1RPUCBzdGF0ZQorCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCisJCQkgKi8KKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJzdG9wKCZhc3RhdGUtPmpzLCBhcmdzWzBdKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0RTVFA6CisJCQkvKgorCQkJICogRFJTVE9QIHN0YXRlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0YXRlIGNvZGUKKwkJCSAqLworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcnN0b3AoJmFzdGF0ZS0+anMsIGFyZ3NbMF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPUF9TV1BOOgorCQkJLyoKKwkJCSAqIEV4Y2hhbmdlIHRvcCB3aXRoIE50aCBzdGFjayB2YWx1ZQorCQkJICogLi4uYXJndW1lbnQgMCBpcyAwLWJhc2VkIHN0YWNrIGVudHJ5CisJCQkgKiB0byBzd2FwIHdpdGggdG9wIGVsZW1lbnQKKwkJCSAqLworCQkJaW5kZXggPSAoYXJnc1swXSkgKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9EVVBOOgorCQkJLyoKKwkJCSAqIER1cGxpY2F0ZSBOdGggc3RhY2sgdmFsdWUKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgMC1iYXNlZCBzdGFjayBlbnRyeSB0byBkdXBsaWNhdGUKKwkJCSAqLworCQkJaW5kZXggPSAoYXJnc1swXSkgKyAxOworCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgeworCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07CisJCQkJKytzdGFja19wdHI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9QT1BWOgorCQkJLyoKKwkJCSAqIFBvcCBzdGFjayBpbnRvIHNjYWxhciB2YXJpYWJsZQorCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyB2YWx1ZQorCQkJICovCisJCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJdmFyc1thcmdzWzBdXSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfUE9QRToKKwkJCS8qCisJCQkgKiBQb3Agc3RhY2sgaW50byBpbnRlZ2VyIGFycmF5IGVsZW1lbnQKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgdmFsdWUKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKKworCQkJLyoKKwkJCSAqIElmIHZhcmlhYmxlIGlzIHJlYWQtb25seSwKKwkJCSAqIGNvbnZlcnQgdG8gd3JpdGFibGUgYXJyYXkKKwkJCSAqLworCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYKKwkJCQkoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4OWMpID09IDB4MWMpKSB7CisJCQkJLyogQWxsb2NhdGUgYSB3cml0YWJsZSBidWZmZXIgZm9yIHRoaXMgYXJyYXkgKi8KKwkJCQljb3VudCA9IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKKwkJCQlsb25nX3RtcCA9IHZhcnNbdmFyaWFibGVfaWRdOworCQkJCWxvbmdwdHJfdG1wID0ga3phbGxvYyhjb3VudCAqIHNpemVvZihsb25nKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZylsb25ncHRyX3RtcDsKKworCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7CisJCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGNvcHkgcHJldmlvdXMgY29udGVudHMgaW50byBidWZmZXIgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJCQlsb25ncHRyX3RtcFtpXSA9CisJCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJnBbbG9uZ190bXBdKTsKKwkJCQkJbG9uZ190bXAgKz0gc2l6ZW9mKGxvbmcpOworCQkJCX0KKworCQkJCS8qCisJCQkJICogc2V0IGJpdCA3IC0gYnVmZmVyIHdhcworCQkJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAorCQkJCSAqLworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOworCisJCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKKworCQkJfQorCisJCQkvKiBjaGVjayB0aGF0IHZhcmlhYmxlIGlzIGEgd3JpdGFibGUgaW50ZWdlciBhcnJheSAqLworCQkJaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDFjKSAhPSAweDE4KQorCQkJCXN0YXR1cyA9IC1FUkFOR0U7CisJCQllbHNlIHsKKwkJCQlsb25ncHRyX3RtcCA9IChsb25nICopdmFyc1t2YXJpYWJsZV9pZF07CisKKwkJCQkvKiBwb3AgdGhlIGFycmF5IGluZGV4ICovCisJCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCQkvKiBwb3AgdGhlIHZhbHVlIGFuZCBzdG9yZSBpdCBpbnRvIHRoZSBhcnJheSAqLworCQkJCWxvbmdwdHJfdG1wW2luZGV4XSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgT1BfUE9QQToKKwkJCS8qCisJCQkgKiBQb3Agc3RhY2sgaW50byBCb29sZWFuIGFycmF5CisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGNvdW50CisJCQkgKiAuLi5zdGFjayAxIGlzIGFycmF5IGluZGV4CisJCQkgKiAuLi5zdGFjayAyIGlzIHZhbHVlCisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07CisKKwkJCS8qCisJCQkgKiBJZiB2YXJpYWJsZSBpcyByZWFkLW9ubHksCisJCQkgKiBjb252ZXJ0IHRvIHdyaXRhYmxlIGFycmF5CisJCQkgKi8KKwkJCWlmICgodmVyc2lvbiA+IDApICYmCisJCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDBjKSkgeworCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCisJCQkJbG9uZ190bXAgPQorCQkJCQkodmFyX3NpemVbdmFyaWFibGVfaWRdICsgN0wpID4+IDNMOworCQkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOworCQkJCWNoYXJwdHJfdG1wID0KKwkJCQkJa3phbGxvYyhsb25nX3RtcCwgR0ZQX0tFUk5FTCk7CisJCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZyljaGFycHRyX3RtcDsKKworCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7CisJCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHplcm8gdGhlIGJ1ZmZlciAqLworCQkJCWZvciAobG9uZ19pZHggPSAwTDsKKwkJCQkJbG9uZ19pZHggPCBsb25nX3RtcDsKKwkJCQkJKytsb25nX2lkeCkgeworCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeF0gPSAwOworCQkJCX0KKworCQkJCS8qIGNvcHkgcHJldmlvdXMgY29udGVudHMgaW50byBidWZmZXIgKi8KKwkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7CisJCQkJCWxvbmdfaWR4IDwgdmFyX3NpemVbdmFyaWFibGVfaWRdOworCQkJCQkrK2xvbmdfaWR4KSB7CisJCQkJCWxvbmdfaWR4MiA9IGxvbmdfaWR4OworCisJCQkJCWlmIChjaGFycHRyX3RtcDJbbG9uZ19pZHgyID4+IDNdICYKKwkJCQkJCSgxIDw8IChsb25nX2lkeDIgJiA3KSkpIHsKKwkJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNdIHw9CisJCQkJCQkJKDEgPDwgKGxvbmdfaWR4ICYgNykpOworCQkJCQl9CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBzZXQgYml0IDcgLSBidWZmZXIgd2FzCisJCQkJICogZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJCQkJICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7CisKKwkJCQkvKiBjbGVhciBiaXQgMiAtIHZhcmlhYmxlIGlzIHdyaXRhYmxlICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdICY9IH4weDA0OworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDAxOworCisJCQl9CisKKwkJCS8qCisJCQkgKiBjaGVjayB0aGF0IHZhcmlhYmxlIGlzCisJCQkgKiBhIHdyaXRhYmxlIEJvb2xlYW4gYXJyYXkKKwkJCSAqLworCQkJaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDFjKSAhPSAweDA4KSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKKworCQkJLyogcG9wIHRoZSBjb3VudCAobnVtYmVyIG9mIGJpdHMgdG8gY29weSkgKi8KKwkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCS8qIHBvcCB0aGUgYXJyYXkgaW5kZXggKi8KKwkJCWxvbmdfaWR4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlyZXZlcnNlID0gMDsKKworCQkJaWYgKHZlcnNpb24gPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAorCQkJCSAqLworCisJCQkJaWYgKGxvbmdfaWR4ID4gbG9uZ19jb3VudCkgeworCQkJCQlyZXZlcnNlID0gMTsKKwkJCQkJbG9uZ190bXAgPSBsb25nX2NvdW50OworCQkJCQlsb25nX2NvdW50ID0gMSArIGxvbmdfaWR4IC0KKwkJCQkJCQkJbG9uZ19jb3VudDsKKwkJCQkJbG9uZ19pZHggPSBsb25nX3RtcDsKKworCQkJCQkvKiByZXZlcnNlIFBPUEEgaXMgbm90IHN1cHBvcnRlZCAqLworCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UKKwkJCQkJbG9uZ19jb3VudCA9IDEgKyBsb25nX2NvdW50IC0KKwkJCQkJCQkJbG9uZ19pZHg7CisKKwkJCX0KKworCQkJLyogcG9wIHRoZSBkYXRhICovCisJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJaWYgKGxvbmdfY291bnQgPCAxKSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IGxvbmdfY291bnQ7ICsraSkgeworCQkJCWlmIChsb25nX3RtcCAmICgxTCA8PCAoczMyKSBpKSkKKwkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM0xdIHw9CisJCQkJCQkoMUwgPDwgKGxvbmdfaWR4ICYgN0wpKTsKKwkJCQllbHNlCisJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNMXSAmPQorCQkJCQkJfigxTCA8PCAobG9uZ19pZHggJiA3TCkpOworCisJCQkJKytsb25nX2lkeDsKKwkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgT1BfSk1QWjoKKwkJCS8qCisJCQkgKiBQb3Agc3RhY2sgYW5kIGJyYW5jaCBpZiB6ZXJvCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIGFkZHJlc3MKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY29uZGl0aW9uIHZhbHVlCisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgeworCQkJCWlmIChzdGFja1stLXN0YWNrX3B0cl0gPT0gMCkgeworCQkJCQlwYyA9IGFyZ3NbMF0gKyBjb2RlX3NlY3Q7CisJCQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8CisJCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCisJCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0RTOgorCQljYXNlIE9QX0lTOgorCQkJLyoKKwkJCSAqIERSU0NBTgorCQkJICogSVJTQ0FOCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHNjYW4gZGF0YSB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAorCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJbG9uZ19pZHggPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJcmV2ZXJzZSA9IDA7CisJCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICogc3RhY2sgMiA9IGNvdW50CisJCQkJICovCisJCQkJbG9uZ190bXAgPSBsb25nX2NvdW50OworCQkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCQlpZiAobG9uZ19pZHggPiBsb25nX3RtcCkgeworCQkJCQlyZXZlcnNlID0gMTsKKwkJCQkJbG9uZ19pZHggPSBsb25nX3RtcDsKKwkJCQl9CisJCQl9CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKworCQkJaWYgKHJldmVyc2UpIHsKKwkJCQkvKgorCQkJCSAqIGFsbG9jYXRlIGEgYnVmZmVyCisJCQkJICogYW5kIHJldmVyc2UgdGhlIGRhdGEgb3JkZXIKKwkJCQkgKi8KKwkJCQljaGFycHRyX3RtcDIgPSBjaGFycHRyX3RtcDsKKwkJCQljaGFycHRyX3RtcCA9IGt6YWxsb2MoKGxvbmdfY291bnQgPj4gMykgKyAxLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAoY2hhcnB0cl90bXAgPT0gTlVMTCkgeworCQkJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlsb25nX3RtcCA9IGxvbmdfaWR4ICsgbG9uZ19jb3VudCAtIDE7CisJCQkJbG9uZ19pZHgyID0gMDsKKwkJCQl3aGlsZSAobG9uZ19pZHgyIDwgbG9uZ19jb3VudCkgeworCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfdG1wID4+IDNdICYKKwkJCQkJCQkoMSA8PCAobG9uZ190bXAgJiA3KSkpCisJCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeDIgPj4gM10gfD0KKwkJCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpOworCQkJCQllbHNlCisJCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeDIgPj4gM10gJj0KKwkJCQkJCQl+KDEgPDwgKGxvbmdfaWR4MiAmIDcpKTsKKworCQkJCQktLWxvbmdfdG1wOworCQkJCQkrK2xvbmdfaWR4MjsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChvcGNvZGUgPT0gMHg1MSkgLyogRFMgKi8KKwkJCQlzdGF0dXMgPSBhbHRlcmFfZHJzY2FuKGFzdGF0ZSwgbG9uZ19jb3VudCwKKwkJCQkJCWNoYXJwdHJfdG1wLCBsb25nX2lkeCk7CisJCQllbHNlIC8qIElTICovCisJCQkJc3RhdHVzID0gYWx0ZXJhX2lyc2Nhbihhc3RhdGUsIGxvbmdfY291bnQsCisJCQkJCQljaGFycHRyX3RtcCwgbG9uZ19pZHgpOworCisJCQlpZiAocmV2ZXJzZSkKKwkJCQlrZnJlZShjaGFycHRyX3RtcCk7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0RQUkE6CisJCQkvKgorCQkJICogRFJQUkUgd2l0aCBhcnJheSBkYXRhCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4CisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAodmVyc2lvbiA+IDApCisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAorCQkJCSAqLworCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwgaW5kZXgsCisJCQkJCQkJY2hhcnB0cl90bXApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfRFBPQToKKwkJCS8qCisJCQkgKiBEUlBPU1Qgd2l0aCBhcnJheSBkYXRhCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4CisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAodmVyc2lvbiA+IDApCisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAorCQkJCSAqLworCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAorCQkJCQkJCWNoYXJwdHJfdG1wKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0lQUkE6CisJCQkvKgorCQkJICogSVJQUkUgd2l0aCBhcnJheSBkYXRhCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4CisJCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAodmVyc2lvbiA+IDApCisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAorCQkJCSAqLworCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKwkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcHJlKCZhc3RhdGUtPmpzLCBjb3VudCwgaW5kZXgsCisJCQkJCQkJY2hhcnB0cl90bXApOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9JUE9BOgorCQkJLyoKKwkJCSAqIElSUE9TVCB3aXRoIGFycmF5IGRhdGEKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmICh2ZXJzaW9uID4gMCkKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBhcnJheSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBhcnJheSBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJY291bnQgPSAxICsgY291bnQgLSBpbmRleDsKKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW2FyZ3NbMF1dOworCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwgaW5kZXgsCisJCQkJCQkJY2hhcnB0cl90bXApOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9FWFBUOgorCQkJLyoKKwkJCSAqIEVYUE9SVAorCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdHJpbmcgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgaW50ZWdlciBleHByZXNzaW9uCisJCQkgKi8KKwkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgeworCQkJCW5hbWUgPSAmcFtzdHJfdGFibGUgKyBhcmdzWzBdXTsKKwkJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlhbHRlcmFfZXhwb3J0X2ludChuYW1lLCBsb25nX3RtcCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPUF9QU0hFOgorCQkJLyoKKwkJCSAqIFB1c2ggaW50ZWdlciBhcnJheSBlbGVtZW50CisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4CisJCQkgKi8KKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisJCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07CisJCQlpbmRleCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCisJCQkvKiBjaGVjayB2YXJpYWJsZSB0eXBlICovCisJCQlpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MWYpID09IDB4MTkpIHsKKwkJCQkvKiB3cml0YWJsZSBpbnRlZ2VyIGFycmF5ICovCisJCQkJbG9uZ3B0cl90bXAgPSAobG9uZyAqKXZhcnNbdmFyaWFibGVfaWRdOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ3B0cl90bXBbaW5kZXhdOworCQkJfSBlbHNlIGlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxZikgPT0gMHgxYykgeworCQkJCS8qIHJlYWQtb25seSBpbnRlZ2VyIGFycmF5ICovCisJCQkJbG9uZ190bXAgPSB2YXJzW3ZhcmlhYmxlX2lkXSArCisJCQkJCQkoaW5kZXggKiBzaXplb2YobG9uZykpOworCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KKwkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2xvbmdfdG1wXSk7CisJCQl9IGVsc2UKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9QU0hBOgorCQkJLyoKKwkJCSAqIFB1c2ggQm9vbGVhbiBhcnJheQorCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAorCQkJICogLi4uc3RhY2sgMSBpcyBhcnJheSBpbmRleAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOworCisJCQkvKiBjaGVjayB0aGF0IHZhcmlhYmxlIGlzIGEgQm9vbGVhbiBhcnJheSAqLworCQkJaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDE4KSAhPSAweDA4KSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKKworCQkJLyogcG9wIHRoZSBjb3VudCAobnVtYmVyIG9mIGJpdHMgdG8gY29weSkgKi8KKwkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQkvKiBwb3AgdGhlIGFycmF5IGluZGV4ICovCisJCQlpbmRleCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOworCisJCQlpZiAodmVyc2lvbiA+IDApCisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKKwkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAorCQkJCSAqLworCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7CisKKwkJCWlmICgoY291bnQgPCAxKSB8fCAoY291bnQgPiAzMikpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlsb25nX3RtcCA9IDBMOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJCQlpZiAoY2hhcnB0cl90bXBbKGkgKyBpbmRleCkgPj4gM10gJgorCQkJCQkJKDEgPDwgKChpICsgaW5kZXgpICYgNykpKQorCQkJCQlsb25nX3RtcCB8PSAoMUwgPDwgaSk7CisKKwkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7CisKKwkJCWJyZWFrOworCQljYXNlIE9QX0RZTkE6CisJCQkvKgorCQkJICogRHluYW1pY2FsbHkgY2hhbmdlIHNpemUgb2YgYXJyYXkKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgbmV3IHNpemUKKwkJCSAqLworCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKKwkJCQlicmVhazsKKwkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAobG9uZ190bXAgPiB2YXJfc2l6ZVt2YXJpYWJsZV9pZF0pIHsKKwkJCQl2YXJfc2l6ZVt2YXJpYWJsZV9pZF0gPSBsb25nX3RtcDsKKworCQkJCWlmIChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDEwKQorCQkJCQkvKiBhbGxvY2F0ZSBpbnRlZ2VyIGFycmF5ICovCisJCQkJCWxvbmdfdG1wICo9IHNpemVvZihsb25nKTsKKwkJCQllbHNlCisJCQkJCS8qIGFsbG9jYXRlIEJvb2xlYW4gYXJyYXkgKi8KKwkJCQkJbG9uZ190bXAgPSAobG9uZ190bXAgKyA3KSA+PiAzOworCisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgYnVmZmVyIHdhcyBwcmV2aW91c2x5IGFsbG9jYXRlZCwKKwkJCQkgKiBmcmVlIGl0CisJCQkJICovCisJCQkJaWYgKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4ODApIHsKKwkJCQkJa2ZyZWUoKHZvaWQgKil2YXJzW3ZhcmlhYmxlX2lkXSk7CisJCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gMDsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlcgorCQkJCSAqIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZQorCQkJCSAqLworCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpCisJCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOworCisJCQkJaWYgKHZhcnNbdmFyaWFibGVfaWRdID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGF0dHJpYnV0ZSBiaXQgdG8gaW5kaWNhdGUgdGhhdAorCQkJCSAqIHRoaXMgYnVmZmVyIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kCisJCQkJICogc2hvdWxkIGJlIGZyZWVkIGxhdGVyCisJCQkJICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7CisKKwkJCQkvKiB6ZXJvIG91dCBtZW1vcnkgKi8KKwkJCQljb3VudCA9ICgodmFyX3NpemVbdmFyaWFibGVfaWRdICsgN0wpIC8KKwkJCQkJCQkJCThMKTsKKwkJCQljaGFycHRyX3RtcCA9ICh1OCAqKSh2YXJzW3ZhcmlhYmxlX2lkXSk7CisJCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpCisJCQkJCWNoYXJwdHJfdG1wW2luZGV4XSA9IDA7CisKKwkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgT1BfRVhQVjoKKwkJCS8qCisJCQkgKiBFeHBvcnQgQm9vbGVhbiBhcnJheQorCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdHJpbmcgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgdmFyaWFibGUgSUQKKwkJCSAqIC4uLnN0YWNrIDEgaXMgYXJyYXkgcmlnaHQgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDIgaXMgYXJyYXkgbGVmdCBpbmRleAorCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJaWYgKHZlcnNpb24gPT0gMCkgeworCQkJCS8qIEVYUFYgaXMgbm90IHN1cHBvcnRlZCBpbiBKQkMgMS4wICovCisJCQkJYmFkX29wY29kZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQluYW1lID0gJnBbc3RyX3RhYmxlICsgYXJnc1swXV07CisJCQl2YXJpYWJsZV9pZCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWxvbmdfaWR4ID0gc3RhY2tbLS1zdGFja19wdHJdOy8qIHJpZ2h0IGluZHggKi8KKwkJCWxvbmdfaWR4MiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsvKiBsZWZ0IGluZHggKi8KKworCQkJaWYgKGxvbmdfaWR4ID4gbG9uZ19pZHgyKSB7CisJCQkJLyogcmV2ZXJzZSBpbmRpY2VzIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlsb25nX2NvdW50ID0gMSArIGxvbmdfaWR4MiAtIGxvbmdfaWR4OworCisJCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOworCQkJY2hhcnB0cl90bXAyID0gTlVMTDsKKworCQkJaWYgKChsb25nX2lkeCAmIDdMKSAhPSAwKSB7CisJCQkJczMyIGsgPSBsb25nX2lkeDsKKwkJCQljaGFycHRyX3RtcDIgPQorCQkJCQlremFsbG9jKCgobG9uZ19jb3VudCArIDdMKSAvIDhMKSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAoY2hhcnB0cl90bXAyID09IE5VTEwpIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZm9yIChpID0gMDsgaSA8IGxvbmdfY291bnQ7ICsraSkgeworCQkJCQlpZiAoY2hhcnB0cl90bXBbayA+PiAzXSAmCisJCQkJCQkJKDEgPDwgKGsgJiA3KSkpCisJCQkJCQljaGFycHRyX3RtcDJbaSA+PiAzXSB8PQorCQkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKKwkJCQkJZWxzZQorCQkJCQkJY2hhcnB0cl90bXAyW2kgPj4gM10gJj0KKwkJCQkJCQkJfigxIDw8IChpICYgNykpOworCisJCQkJCSsrazsKKwkJCQl9CisJCQkJY2hhcnB0cl90bXAgPSBjaGFycHRyX3RtcDI7CisKKwkJCX0gZWxzZSBpZiAobG9uZ19pZHggIT0gMCkKKwkJCQljaGFycHRyX3RtcCA9ICZjaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXTsKKworCQkJYWx0ZXJhX2V4cG9ydF9ib29sX2FycmF5KG5hbWUsIGNoYXJwdHJfdG1wLAorCQkJCQkJCWxvbmdfY291bnQpOworCisJCQkvKiBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJCWlmICgobG9uZ19pZHggJiA3TCkgIT0gMCkKKwkJCQlrZnJlZShjaGFycHRyX3RtcDIpOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9DT1BZOiB7CisJCQkvKgorCQkJICogQXJyYXkgY29weQorCQkJICogLi4uYXJndW1lbnQgMCBpcyBkZXN0IElECisJCQkgKiAuLi5hcmd1bWVudCAxIGlzIHNvdXJjZSBJRAorCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAorCQkJICogLi4uc3RhY2sgMSBpcyBkZXN0IGluZGV4CisJCQkgKiAuLi5zdGFjayAyIGlzIHNvdXJjZSBpbmRleAorCQkJICovCisJCQlzMzIgY29weV9jb3VudDsKKwkJCXMzMiBjb3B5X2luZGV4OworCQkJczMyIGNvcHlfaW5kZXgyOworCQkJczMyIGRlc3RsZWZ0OworCQkJczMyIHNyY19jb3VudDsKKwkJCXMzMiBkZXN0X2NvdW50OworCQkJaW50IHNyY19yZXZlcnNlID0gMDsKKwkJCWludCBkZXN0X3JldmVyc2UgPSAwOworCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCisJCQljb3B5X2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJY29weV9pbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWNvcHlfaW5kZXgyID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJcmV2ZXJzZSA9IDA7CisKKwkJCWlmICh2ZXJzaW9uID4gMCkgeworCQkJCS8qCisJCQkJICogc3RhY2sgMCA9IHNvdXJjZSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBzb3VyY2UgbGVmdCBpbmRleAorCQkJCSAqIHN0YWNrIDIgPSBkZXN0aW5hdGlvbiByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDMgPSBkZXN0aW5hdGlvbiBsZWZ0IGluZGV4CisJCQkJICovCisJCQkJZGVzdGxlZnQgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCQlpZiAoY29weV9jb3VudCA+IGNvcHlfaW5kZXgpIHsKKwkJCQkJc3JjX3JldmVyc2UgPSAxOworCQkJCQlyZXZlcnNlID0gMTsKKwkJCQkJc3JjX2NvdW50ID0gMSArIGNvcHlfY291bnQgLSBjb3B5X2luZGV4OworCQkJCQkvKiBjb3B5X2luZGV4ID0gc291cmNlIHN0YXJ0IGluZGV4ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJc3JjX2NvdW50ID0gMSArIGNvcHlfaW5kZXggLSBjb3B5X2NvdW50OworCQkJCQkvKiBzb3VyY2Ugc3RhcnQgaW5kZXggKi8KKwkJCQkJY29weV9pbmRleCA9IGNvcHlfY291bnQ7CisJCQkJfQorCisJCQkJaWYgKGNvcHlfaW5kZXgyID4gZGVzdGxlZnQpIHsKKwkJCQkJZGVzdF9yZXZlcnNlID0gMTsKKwkJCQkJcmV2ZXJzZSA9ICFyZXZlcnNlOworCQkJCQlkZXN0X2NvdW50ID0gMSArIGNvcHlfaW5kZXgyIC0gZGVzdGxlZnQ7CisJCQkJCS8qIGRlc3RpbmF0aW9uIHN0YXJ0IGluZGV4ICovCisJCQkJCWNvcHlfaW5kZXgyID0gZGVzdGxlZnQ7CisJCQkJfSBlbHNlCisJCQkJCWRlc3RfY291bnQgPSAxICsgZGVzdGxlZnQgLSBjb3B5X2luZGV4MjsKKworCQkJCWNvcHlfY291bnQgPSAoc3JjX2NvdW50IDwgZGVzdF9jb3VudCkgPworCQkJCQkJCXNyY19jb3VudCA6IGRlc3RfY291bnQ7CisKKwkJCQlpZiAoKHNyY19yZXZlcnNlIHx8IGRlc3RfcmV2ZXJzZSkgJiYKKwkJCQkJKHNyY19jb3VudCAhPSBkZXN0X2NvdW50KSkKKwkJCQkJLyoKKwkJCQkJICogSWYgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24KKwkJCQkJICogaXMgcmV2ZXJzZWQsIHdlIGNhbid0IHRvbGVyYXRlCisJCQkJCSAqIGEgbGVuZ3RoIG1pc21hdGNoLCBiZWNhdXNlIHdlCisJCQkJCSAqICJsZWZ0IGp1c3RpZnkiIGFycmF5cyB3aGVuIGNvcHlpbmcuCisJCQkJCSAqIFRoaXMgd29uJ3Qgd29yayBjb3JyZWN0bHkKKwkJCQkJICogd2l0aCByZXZlcnNlZCBhcnJheXMuCisJCQkJCSAqLworCQkJCQlzdGF0dXMgPSAtRVJBTkdFOworCisJCQl9CisKKwkJCWNvdW50ID0gY29weV9jb3VudDsKKwkJCWluZGV4ID0gY29weV9pbmRleDsKKwkJCWluZGV4MiA9IGNvcHlfaW5kZXgyOworCisJCQkvKgorCQkJICogSWYgZGVzdGluYXRpb24gaXMgYSByZWFkLW9ubHkgYXJyYXksCisJCQkgKiBhbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgY29udmVydCBpdCB0byBhIHdyaXRhYmxlIGFycmF5CisJCQkgKi8KKwkJCXZhcmlhYmxlX2lkID0gYXJnc1sxXTsKKwkJCWlmICgodmVyc2lvbiA+IDApICYmCisJCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDBjKSkgeworCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCisJCQkJbG9uZ190bXAgPQorCQkJCQkodmFyX3NpemVbdmFyaWFibGVfaWRdICsgN0wpID4+IDNMOworCQkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOworCQkJCWNoYXJwdHJfdG1wID0KKwkJCQkJa3phbGxvYyhsb25nX3RtcCwgR0ZQX0tFUk5FTCk7CisJCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZyljaGFycHRyX3RtcDsKKworCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7CisJCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHplcm8gdGhlIGJ1ZmZlciAqLworCQkJCWZvciAobG9uZ19pZHggPSAwTDsgbG9uZ19pZHggPCBsb25nX3RtcDsKKwkJCQkJCQkJKytsb25nX2lkeCkKKwkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHhdID0gMDsKKworCQkJCS8qIGNvcHkgcHJldmlvdXMgY29udGVudHMgaW50byBidWZmZXIgKi8KKwkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7CisJCQkJCWxvbmdfaWR4IDwgdmFyX3NpemVbdmFyaWFibGVfaWRdOworCQkJCQkJCQkrK2xvbmdfaWR4KSB7CisJCQkJCWxvbmdfaWR4MiA9IGxvbmdfaWR4OworCisJCQkJCWlmIChjaGFycHRyX3RtcDJbbG9uZ19pZHgyID4+IDNdICYKKwkJCQkJCSgxIDw8IChsb25nX2lkeDIgJiA3KSkpCisJCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXSB8PQorCQkJCQkJCSgxIDw8IChsb25nX2lkeCAmIDcpKTsKKworCQkJCX0KKworCQkJCS8qCisJCQkJc2V0IGJpdCA3IC0gYnVmZmVyIHdhcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKKworCQkJCS8qIGNsZWFyIGJpdCAyIC0gdmFyaWFibGUgaXMgd3JpdGFibGUgKi8KKwkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gJj0gfjB4MDQ7CisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4MDE7CisJCQl9CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzFdXTsKKwkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbYXJnc1swXV07CisKKwkJCS8qIGNoZWNrIGlmIGRlc3RpbmF0aW9uIGlzIGEgd3JpdGFibGUgQm9vbGVhbiBhcnJheSAqLworCQkJaWYgKChhdHRyc1thcmdzWzFdXSAmIDB4MWMpICE9IDB4MDgpIHsKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoY291bnQgPCAxKSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHJldmVyc2UpCisJCQkJaW5kZXgyICs9IChjb3VudCAtIDEpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJCWlmIChjaGFycHRyX3RtcDJbaW5kZXggPj4gM10gJgorCQkJCQkJCSgxIDw8IChpbmRleCAmIDcpKSkKKwkJCQkJY2hhcnB0cl90bXBbaW5kZXgyID4+IDNdIHw9CisJCQkJCQkJKDEgPDwgKGluZGV4MiAmIDcpKTsKKwkJCQllbHNlCisJCQkJCWNoYXJwdHJfdG1wW2luZGV4MiA+PiAzXSAmPQorCQkJCQkJfigxIDw8IChpbmRleDIgJiA3KSk7CisKKwkJCQkrK2luZGV4OworCQkJCWlmIChyZXZlcnNlKQorCQkJCQktLWluZGV4MjsKKwkJCQllbHNlCisJCQkJCSsraW5kZXgyOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QX0RTQzoKKwkJY2FzZSBPUF9JU0M6IHsKKwkJCS8qCisJCQkgKiBEUlNDQU4gd2l0aCBjYXB0dXJlCisJCQkgKiBJUlNDQU4gd2l0aCBjYXB0dXJlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHNjYW4gZGF0YSB2YXJpYWJsZSBJRAorCQkJICogLi4uYXJndW1lbnQgMSBpcyBjYXB0dXJlIHZhcmlhYmxlIElECisJCQkgKiAuLi5zdGFjayAwIGlzIGNhcHR1cmUgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgc2NhbiBkYXRhIGluZGV4CisJCQkgKiAuLi5zdGFjayAyIGlzIGNvdW50CisJCQkgKi8KKwkJCXMzMiBzY2FuX3JpZ2h0LCBzY2FuX2xlZnQ7CisJCQlzMzIgY2FwdHVyZV9jb3VudCA9IDA7CisJCQlzMzIgc2Nhbl9jb3VudCA9IDA7CisJCQlzMzIgY2FwdHVyZV9pbmRleDsKKwkJCXMzMiBzY2FuX2luZGV4OworCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCisJCQljYXB0dXJlX2luZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJc2Nhbl9pbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKworCQkJaWYgKHZlcnNpb24gPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBzdGFjayAwID0gY2FwdHVyZSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBjYXB0dXJlIGxlZnQgaW5kZXgKKwkJCQkgKiBzdGFjayAyID0gc2NhbiByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDMgPSBzY2FuIGxlZnQgaW5kZXgKKwkJCQkgKiBzdGFjayA0ID0gY291bnQKKwkJCQkgKi8KKwkJCQlzY2FuX3JpZ2h0ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCXNjYW5fbGVmdCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQljYXB0dXJlX2NvdW50ID0gMSArIHNjYW5faW5kZXggLSBjYXB0dXJlX2luZGV4OworCQkJCXNjYW5fY291bnQgPSAxICsgc2Nhbl9sZWZ0IC0gc2Nhbl9yaWdodDsKKwkJCQlzY2FuX2luZGV4ID0gc2Nhbl9yaWdodDsKKwkJCX0KKworCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCS8qCisJCQkgKiBJZiBjYXB0dXJlIGFycmF5IGlzIHJlYWQtb25seSwgYWxsb2NhdGUgYSBidWZmZXIKKwkJCSAqIGFuZCBjb252ZXJ0IGl0IHRvIGEgd3JpdGFibGUgYXJyYXkKKwkJCSAqLworCQkJdmFyaWFibGVfaWQgPSBhcmdzWzFdOworCQkJaWYgKCh2ZXJzaW9uID4gMCkgJiYKKwkJCQkoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4OWMpID09IDB4MGMpKSB7CisJCQkJLyogQWxsb2NhdGUgYSB3cml0YWJsZSBidWZmZXIgZm9yIHRoaXMgYXJyYXkgKi8KKwkJCQlsb25nX3RtcCA9CisJCQkJCSh2YXJfc2l6ZVt2YXJpYWJsZV9pZF0gKyA3TCkgPj4gM0w7CisJCQkJY2hhcnB0cl90bXAyID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07CisJCQkJY2hhcnB0cl90bXAgPQorCQkJCQlremFsbG9jKGxvbmdfdG1wLCBHRlBfS0VSTkVMKTsKKwkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKWNoYXJwdHJfdG1wOworCisJCQkJaWYgKHZhcnNbdmFyaWFibGVfaWRdID09IDApIHsKKwkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogemVybyB0aGUgYnVmZmVyICovCisJCQkJZm9yIChsb25nX2lkeCA9IDBMOyBsb25nX2lkeCA8IGxvbmdfdG1wOworCQkJCQkJCQkrK2xvbmdfaWR4KQorCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeF0gPSAwOworCisJCQkJLyogY29weSBwcmV2aW91cyBjb250ZW50cyBpbnRvIGJ1ZmZlciAqLworCQkJCWZvciAobG9uZ19pZHggPSAwTDsKKwkJCQkJbG9uZ19pZHggPCB2YXJfc2l6ZVt2YXJpYWJsZV9pZF07CisJCQkJCQkJCSsrbG9uZ19pZHgpIHsKKwkJCQkJbG9uZ19pZHgyID0gbG9uZ19pZHg7CisKKwkJCQkJaWYgKGNoYXJwdHJfdG1wMltsb25nX2lkeDIgPj4gM10gJgorCQkJCQkJKDEgPDwgKGxvbmdfaWR4MiAmIDcpKSkKKwkJCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNdIHw9CisJCQkJCQkJKDEgPDwgKGxvbmdfaWR4ICYgNykpOworCisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBzZXQgYml0IDcgLSBidWZmZXIgd2FzCisJCQkJICogZHluYW1pY2FsbHkgYWxsb2NhdGVkCisJCQkJICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7CisKKwkJCQkvKiBjbGVhciBiaXQgMiAtIHZhcmlhYmxlIGlzIHdyaXRhYmxlICovCisJCQkJYXR0cnNbdmFyaWFibGVfaWRdICY9IH4weDA0OworCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDAxOworCisJCQl9CisKKwkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKwkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbYXJnc1sxXV07CisKKwkJCWlmICgodmVyc2lvbiA+IDApICYmCisJCQkJCSgobG9uZ19jb3VudCA+IGNhcHR1cmVfY291bnQpIHx8CisJCQkJCShsb25nX2NvdW50ID4gc2Nhbl9jb3VudCkpKSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGNoZWNrIHRoYXQgY2FwdHVyZSBhcnJheQorCQkJICogaXMgYSB3cml0YWJsZSBCb29sZWFuIGFycmF5CisJCQkgKi8KKwkJCWlmICgoYXR0cnNbYXJnc1sxXV0gJiAweDFjKSAhPSAweDA4KSB7CisJCQkJc3RhdHVzID0gLUVSQU5HRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQkJaWYgKG9wY29kZSA9PSAweDgyKSAvKiBEU0MgKi8KKwkJCQkJc3RhdHVzID0gYWx0ZXJhX3N3YXBfZHIoYXN0YXRlLAorCQkJCQkJCWxvbmdfY291bnQsCisJCQkJCQkJY2hhcnB0cl90bXAsCisJCQkJCQkJc2Nhbl9pbmRleCwKKwkJCQkJCQljaGFycHRyX3RtcDIsCisJCQkJCQkJY2FwdHVyZV9pbmRleCk7CisJCQkJZWxzZSAvKiBJU0MgKi8KKwkJCQkJc3RhdHVzID0gYWx0ZXJhX3N3YXBfaXIoYXN0YXRlLAorCQkJCQkJCWxvbmdfY291bnQsCisJCQkJCQkJY2hhcnB0cl90bXAsCisJCQkJCQkJc2Nhbl9pbmRleCwKKwkJCQkJCQljaGFycHRyX3RtcDIsCisJCQkJCQkJY2FwdHVyZV9pbmRleCk7CisKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUF9XQUlUOgorCQkJLyoKKwkJCSAqIFdBSVQKKwkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgd2FpdCBzdGF0ZQorCQkJICogLi4uYXJndW1lbnQgMSBpcyBlbmQgc3RhdGUKKwkJCSAqIC4uLnN0YWNrIDAgaXMgY3ljbGVzCisJCQkgKiAuLi5zdGFjayAxIGlzIG1pY3Jvc2Vjb25kcworCQkJICovCisJCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQorCQkJCWJyZWFrOworCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07CisKKwkJCWlmIChsb25nX3RtcCAhPSAwTCkKKwkJCQlzdGF0dXMgPSBhbHRlcmFfd2FpdF9jeWNsZXMoYXN0YXRlLCBsb25nX3RtcCwKKwkJCQkJCQkJYXJnc1swXSk7CisKKwkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAoKHN0YXR1cyA9PSAwKSAmJiAobG9uZ190bXAgIT0gMEwpKQorCQkJCXN0YXR1cyA9IGFsdGVyYV93YWl0X21zZWNzKGFzdGF0ZSwKKwkJCQkJCQkJbG9uZ190bXAsCisJCQkJCQkJCWFyZ3NbMF0pOworCisJCQlpZiAoKHN0YXR1cyA9PSAwKSAmJiAoYXJnc1sxXSAhPSBhcmdzWzBdKSkKKwkJCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLAorCQkJCQkJCQlhcmdzWzFdKTsKKworCQkJaWYgKHZlcnNpb24gPiAwKSB7CisJCQkJLS1zdGFja19wdHI7IC8qIHRocm93IGF3YXkgTUFYIGN5Y2xlcyAqLworCQkJCS0tc3RhY2tfcHRyOyAvKiB0aHJvdyBhd2F5IE1BWCBtaWNyb3NlY29uZHMgKi8KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9QX0NNUEE6IHsKKwkJCS8qCisJCQkgKiBBcnJheSBjb21wYXJlCisJCQkgKiAuLi5hcmd1bWVudCAwIGlzIHNvdXJjZSAxIElECisJCQkgKiAuLi5hcmd1bWVudCAxIGlzIHNvdXJjZSAyIElECisJCQkgKiAuLi5hcmd1bWVudCAyIGlzIG1hc2sgSUQKKwkJCSAqIC4uLnN0YWNrIDAgaXMgc291cmNlIDEgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDEgaXMgc291cmNlIDIgaW5kZXgKKwkJCSAqIC4uLnN0YWNrIDIgaXMgbWFzayBpbmRleAorCQkJICogLi4uc3RhY2sgMyBpcyBjb3VudAorCQkJICovCisJCQlzMzIgYSwgYjsKKwkJCXU4ICpzb3VyY2UxID0gKHU4ICopdmFyc1thcmdzWzBdXTsKKwkJCXU4ICpzb3VyY2UyID0gKHU4ICopdmFyc1thcmdzWzFdXTsKKwkJCXU4ICptYXNrID0gKHU4ICopdmFyc1thcmdzWzJdXTsKKwkJCXUzMiBpbmRleDE7CisJCQl1MzIgaW5kZXgyOworCQkJdTMyIG1hc2tfaW5kZXg7CisKKwkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgNCwgJnN0YXR1cykpCisJCQkJYnJlYWs7CisKKwkJCWluZGV4MSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCWluZGV4MiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCW1hc2tfaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07CisJCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOworCisJCQlpZiAodmVyc2lvbiA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHN0YWNrIDAgPSBzb3VyY2UgMSByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDEgPSBzb3VyY2UgMSBsZWZ0IGluZGV4CisJCQkJICogc3RhY2sgMiA9IHNvdXJjZSAyIHJpZ2h0IGluZGV4CisJCQkJICogc3RhY2sgMyA9IHNvdXJjZSAyIGxlZnQgaW5kZXgKKwkJCQkgKiBzdGFjayA0ID0gbWFzayByaWdodCBpbmRleAorCQkJCSAqIHN0YWNrIDUgPSBtYXNrIGxlZnQgaW5kZXgKKwkJCQkgKi8KKwkJCQlzMzIgbWFza19yaWdodCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKKwkJCQlzMzIgbWFza19sZWZ0ID0gc3RhY2tbLS1zdGFja19wdHJdOworCQkJCS8qIHNvdXJjZSAxIGNvdW50ICovCisJCQkJYSA9IDEgKyBpbmRleDIgLSBpbmRleDE7CisJCQkJLyogc291cmNlIDIgY291bnQgKi8KKwkJCQliID0gMSArIGxvbmdfY291bnQgLSBtYXNrX2luZGV4OworCQkJCWEgPSAoYSA8IGIpID8gYSA6IGI7CisJCQkJLyogbWFzayBjb3VudCAqLworCQkJCWIgPSAxICsgbWFza19sZWZ0IC0gbWFza19yaWdodDsKKwkJCQlhID0gKGEgPCBiKSA/IGEgOiBiOworCQkJCS8qIHNvdXJjZSAyIHN0YXJ0IGluZGV4ICovCisJCQkJaW5kZXgyID0gbWFza19pbmRleDsKKwkJCQkvKiBtYXNrIHN0YXJ0IGluZGV4ICovCisJCQkJbWFza19pbmRleCA9IG1hc2tfcmlnaHQ7CisJCQkJbG9uZ19jb3VudCA9IGE7CisJCQl9CisKKwkJCWxvbmdfdG1wID0gMUw7CisKKwkJCWlmIChsb25nX2NvdW50IDwgMSkKKwkJCQlzdGF0dXMgPSAtRVJBTkdFOworCQkJZWxzZSB7CisJCQkJY291bnQgPSBsb25nX2NvdW50OworCisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJCQkJaWYgKG1hc2tbbWFza19pbmRleCA+PiAzXSAmCisJCQkJCQkoMSA8PCAobWFza19pbmRleCAmIDcpKSkgeworCQkJCQkJYSA9IHNvdXJjZTFbaW5kZXgxID4+IDNdICYKKwkJCQkJCQkoMSA8PCAoaW5kZXgxICYgNykpCisJCQkJCQkJCT8gMSA6IDA7CisJCQkJCQliID0gc291cmNlMltpbmRleDIgPj4gM10gJgorCQkJCQkJCSgxIDw8IChpbmRleDIgJiA3KSkKKwkJCQkJCQkJPyAxIDogMDsKKworCQkJCQkJaWYgKGEgIT0gYikgLyogZmFpbHVyZSAqLworCQkJCQkJCWxvbmdfdG1wID0gMEw7CisJCQkJCX0KKwkJCQkJKytpbmRleDE7CisJCQkJCSsraW5kZXgyOworCQkJCQkrK21hc2tfaW5kZXg7CisJCQkJfQorCQkJfQorCisJCQlzdGFja1tzdGFja19wdHIrK10gPSBsb25nX3RtcDsKKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCS8qIFVucmVjb2duaXplZCBvcGNvZGUgLS0gRVJST1IhICovCisJCQliYWRfb3Bjb2RlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJhZF9vcGNvZGUpCisJCQlzdGF0dXMgPSAtRU5PU1lTOworCisJCWlmICgoc3RhY2tfcHRyIDwgMCkgfHwgKHN0YWNrX3B0ciA+PSBBTFRFUkFfU1RBQ0tfU0laRSkpCisJCQlzdGF0dXMgPSAtRU9WRVJGTE9XOworCisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJZG9uZSA9IDE7CisJCQkqZXJyb3JfYWRkcmVzcyA9IChzMzIpKG9wY29kZV9hZGRyZXNzIC0gY29kZV9zZWN0KTsKKwkJfQorCX0KKworCWFsdGVyYV9mcmVlX2J1ZmZlcnMoYXN0YXRlKTsKKworCS8qIEZyZWUgYWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhcnJheXMgKi8KKwlpZiAoKGF0dHJzICE9IE5VTEwpICYmICh2YXJzICE9IE5VTEwpKQorCQlmb3IgKGkgPSAwOyBpIDwgc3ltX2NvdW50OyArK2kpCisJCQlpZiAoYXR0cnNbaV0gJiAweDgwKQorCQkJCWtmcmVlKCh2b2lkICopdmFyc1tpXSk7CisKKwlrZnJlZSh2YXJzKTsKKwlrZnJlZSh2YXJfc2l6ZSk7CisJa2ZyZWUoYXR0cnMpOworCWtmcmVlKHByb2NfYXR0cmlidXRlcyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFsdGVyYV9nZXRfbm90ZSh1OCAqcCwgczMyIHByb2dyYW1fc2l6ZSwKKwkJCXMzMiAqb2Zmc2V0LCBjaGFyICprZXksIGNoYXIgKnZhbHVlLCBpbnQgbGVuZ3RoKQorLyoKKyAqIEdldHMga2V5IGFuZCB2YWx1ZSBvZiBOT1RFIGZpZWxkcyBpbiB0aGUgSkJDIGZpbGUuCisgKiBDYW4gYmUgY2FsbGVkIGluIHR3byBtb2RlczogIGlmIG9mZnNldCBwb2ludGVyIGlzIE5VTEwsCisgKiB0aGVuIHRoZSBmdW5jdGlvbiBzZWFyY2hlcyBmb3Igbm90ZSBmaWVsZHMgd2hpY2ggbWF0Y2gKKyAqIHRoZSBrZXkgc3RyaW5nIHByb3ZpZGVkLiAgSWYgb2Zmc2V0IGlzIG5vdCBOVUxMLCB0aGVuCisgKiB0aGUgZnVuY3Rpb24gZmluZHMgdGhlIG5leHQgbm90ZSBmaWVsZCBvZiBhbnkga2V5LAorICogc3RhcnRpbmcgYXQgdGhlIG9mZnNldCBzcGVjaWZpZWQgYnkgdGhlIG9mZnNldCBwb2ludGVyLgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBlbHNlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUKKyAqLworeworCWludCBzdGF0dXMgPSAtRU5PREFUQTsKKwl1MzIgbm90ZV9zdHJpbmdzID0gMEw7CisJdTMyIG5vdGVfdGFibGUgPSAwTDsKKwl1MzIgbm90ZV9jb3VudCA9IDBMOworCXUzMiBmaXJzdF93b3JkID0gMEw7CisJaW50IHZlcnNpb24gPSAwOworCWludCBkZWx0YSA9IDA7CisJY2hhciAqa2V5X3B0cjsKKwljaGFyICp2YWx1ZV9wdHI7CisJaW50IGk7CisKKwkvKiBSZWFkIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCWlmIChwcm9ncmFtX3NpemUgPiA1MkwpIHsKKwkJZmlyc3Rfd29yZCAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7CisJCXZlcnNpb24gPSAoZmlyc3Rfd29yZCAmIDFMKTsKKwkJZGVsdGEgPSB2ZXJzaW9uICogODsKKworCQlub3RlX3N0cmluZ3MgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzggKyBkZWx0YV0pOworCQlub3RlX3RhYmxlICAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzEyICsgZGVsdGFdKTsKKwkJbm90ZV9jb3VudCAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0NCArICgyICogZGVsdGEpXSk7CisJfQorCisJaWYgKChmaXJzdF93b3JkICE9IDB4NEE0MTREMDBMKSAmJiAoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAxTCkpCisJCXJldHVybiAtRUlPOworCisJaWYgKG5vdGVfY291bnQgPD0gMEwpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAob2Zmc2V0ID09IE5VTEwpIHsKKwkJLyoKKwkJICogV2Ugd2lsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub3RlIHdpdGggYSBzcGVjaWZpYyBrZXksCisJCSAqIGFuZCByZXR1cm4gb25seSB0aGUgdmFsdWUKKwkJICovCisJCWZvciAoaSA9IDA7IChpIDwgbm90ZV9jb3VudCkgJiYKKwkJCQkJCShzdGF0dXMgIT0gMCk7ICsraSkgeworCQkJa2V5X3B0ciA9ICZwW25vdGVfc3RyaW5ncyArCisJCQkJCWdldF91bmFsaWduZWRfYmUzMigKKwkJCQkJJnBbbm90ZV90YWJsZSArICg4ICogaSldKV07CisJCQlpZiAoKHN0cm5pY21wKGtleSwga2V5X3B0ciwgc3RybGVuKGtleV9wdHIpKSA9PSAwKSAmJgorCQkJCQkJKGtleSAhPSBOVUxMKSkgeworCQkJCXN0YXR1cyA9IDA7CisKKwkJCQl2YWx1ZV9wdHIgPSAmcFtub3RlX3N0cmluZ3MgKworCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKAorCQkJCQkJJnBbbm90ZV90YWJsZSArICg4ICogaSkgKyA0XSldOworCisJCQkJaWYgKHZhbHVlICE9IE5VTEwpCisJCQkJCXN0cmxjcHkodmFsdWUsIHZhbHVlX3B0ciwgbGVuZ3RoKTsKKworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2Ugd2lsbCBzZWFyY2ggZm9yIHRoZSBuZXh0IG5vdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGtleSwKKwkJICogYW5kIHJldHVybiBib3RoIHRoZSB2YWx1ZSBhbmQgdGhlIGtleQorCQkgKi8KKworCQlpID0gKm9mZnNldDsKKworCQlpZiAoKGkgPj0gMCkgJiYgKGkgPCBub3RlX2NvdW50KSkgeworCQkJc3RhdHVzID0gMDsKKworCQkJaWYgKGtleSAhPSBOVUxMKQorCQkJCXN0cmxjcHkoa2V5LCAmcFtub3RlX3N0cmluZ3MgKworCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKAorCQkJCQkJJnBbbm90ZV90YWJsZSArICg4ICogaSldKV0sCisJCQkJCWxlbmd0aCk7CisKKwkJCWlmICh2YWx1ZSAhPSBOVUxMKQorCQkJCXN0cmxjcHkodmFsdWUsICZwW25vdGVfc3RyaW5ncyArCisJCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoCisJCQkJCQkmcFtub3RlX3RhYmxlICsgKDggKiBpKSArIDRdKV0sCisJCQkJCWxlbmd0aCk7CisKKwkJCSpvZmZzZXQgPSBpICsgMTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX2NoZWNrX2NyYyh1OCAqcCwgczMyIHByb2dyYW1fc2l6ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgbG9jYWxfZXhwZWN0ZWQgPSAwLAorCSAgICBsb2NhbF9hY3R1YWwgPSAwLAorCSAgICBzaGlmdF9yZWcgPSAweGZmZmY7CisJaW50IGJpdCwgZmVlZGJhY2s7CisJdTggZGF0YWJ5dGU7CisJdTMyIGk7CisJdTMyIGNyY19zZWN0aW9uID0gMEw7CisJdTMyIGZpcnN0X3dvcmQgPSAwTDsKKwlpbnQgdmVyc2lvbiA9IDA7CisJaW50IGRlbHRhID0gMDsKKworCWlmIChwcm9ncmFtX3NpemUgPiA1MkwpIHsKKwkJZmlyc3Rfd29yZCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOworCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7CisJCWRlbHRhID0gdmVyc2lvbiAqIDg7CisKKwkJY3JjX3NlY3Rpb24gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMzIgKyBkZWx0YV0pOworCX0KKworCWlmICgoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAwTCkgJiYgKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMUwpKQorCQlzdGF0dXMgPSAtRUlPOworCisJaWYgKGNyY19zZWN0aW9uID49IHByb2dyYW1fc2l6ZSkKKwkJc3RhdHVzID0gLUVJTzsKKworCWlmIChzdGF0dXMgPT0gMCkgeworCQlsb2NhbF9leHBlY3RlZCA9ICh1MTYpZ2V0X3VuYWxpZ25lZF9iZTE2KCZwW2NyY19zZWN0aW9uXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNyY19zZWN0aW9uOyArK2kpIHsKKwkJCWRhdGFieXRlID0gcFtpXTsKKwkJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJCQlmZWVkYmFjayA9IChkYXRhYnl0ZSBeIHNoaWZ0X3JlZykgJiAweDAxOworCQkJCXNoaWZ0X3JlZyA+Pj0gMTsKKwkJCQlpZiAoZmVlZGJhY2spCisJCQkJCXNoaWZ0X3JlZyBePSAweDg0MDg7CisKKwkJCQlkYXRhYnl0ZSA+Pj0gMTsKKwkJCX0KKwkJfQorCisJCWxvY2FsX2FjdHVhbCA9ICh1MTYpfnNoaWZ0X3JlZzsKKworCQlpZiAobG9jYWxfZXhwZWN0ZWQgIT0gbG9jYWxfYWN0dWFsKQorCQkJc3RhdHVzID0gLUVJTFNFUTsKKworCX0KKworCWlmIChkZWJ1ZyB8fCBzdGF0dXMpIHsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAwOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENSQyBtYXRjaGVkOiAlMDR4XG4iLCBfX2Z1bmNfXywKKwkJCQlsb2NhbF9hY3R1YWwpOworCQkJYnJlYWs7CisJCWNhc2UgLUVJTFNFUToKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENSQyBtaXNtYXRjaDogZXhwZWN0ZWQgJTA0eCwgIgorCQkJCSJhY3R1YWwgJTA0eFxuIiwgX19mdW5jX18sIGxvY2FsX2V4cGVjdGVkLAorCQkJCWxvY2FsX2FjdHVhbCk7CisJCQlicmVhazsKKwkJY2FzZSAtRU5PREFUQToKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGV4cGVjdGVkIENSQyBub3QgZm91bmQsICIKKwkJCQkiYWN0dWFsIENSQyA9ICUwNHhcbiIsIF9fZnVuY19fLAorCQkJCWxvY2FsX2FjdHVhbCk7CisJCQlicmVhazsKKwkJY2FzZSAtRUlPOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGZvcm1hdCBpc24ndCAiCisJCQkJInJlY29nbml6ZWQuXG4iLCBfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENSQyBmdW5jdGlvbiByZXR1cm5lZCBlcnJvciAiCisJCQkJImNvZGUgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFsdGVyYV9nZXRfZmlsZV9pbmZvKHU4ICpwLAorCQkJCQlzMzIgcHJvZ3JhbV9zaXplLAorCQkJCQlpbnQgKmZvcm1hdF92ZXJzaW9uLAorCQkJCQlpbnQgKmFjdGlvbl9jb3VudCwKKwkJCQkJaW50ICpwcm9jZWR1cmVfY291bnQpCit7CisJaW50IHN0YXR1cyA9IC1FSU87CisJdTMyIGZpcnN0X3dvcmQgPSAwOworCWludCB2ZXJzaW9uID0gMDsKKworCWlmIChwcm9ncmFtX3NpemUgPD0gNTJMKQorCQlyZXR1cm4gc3RhdHVzOworCisJZmlyc3Rfd29yZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7CisKKwlpZiAoKGZpcnN0X3dvcmQgPT0gMHg0QTQxNEQwMEwpIHx8IChmaXJzdF93b3JkID09IDB4NEE0MTREMDFMKSkgeworCQlzdGF0dXMgPSAwOworCisJCXZlcnNpb24gPSAoZmlyc3Rfd29yZCAmIDFMKTsKKwkJKmZvcm1hdF92ZXJzaW9uID0gdmVyc2lvbiArIDE7CisKKwkJaWYgKHZlcnNpb24gPiAwKSB7CisJCQkqYWN0aW9uX2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ4XSk7CisJCQkqcHJvY2VkdXJlX2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzUyXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFsdGVyYV9nZXRfYWN0X2luZm8odTggKnAsCisJCQkJCXMzMiBwcm9ncmFtX3NpemUsCisJCQkJCWludCBpbmRleCwKKwkJCQkJY2hhciAqKm5hbWUsCisJCQkJCWNoYXIgKipkZXNjcmlwdGlvbiwKKwkJCQkJc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqKnByb2NfbGlzdCkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTzsKKwlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICpwcm9jcHRyID0gTlVMTDsKKwlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICp0bXBwdHIgPSBOVUxMOworCXUzMiBmaXJzdF93b3JkID0gMEw7CisJdTMyIGFjdGlvbl90YWJsZSA9IDBMOworCXUzMiBwcm9jX3RhYmxlID0gMEw7CisJdTMyIHN0cl90YWJsZSA9IDBMOworCXUzMiBub3RlX3N0cmluZ3MgPSAwTDsKKwl1MzIgYWN0aW9uX2NvdW50ID0gMEw7CisJdTMyIHByb2NfY291bnQgPSAwTDsKKwl1MzIgYWN0X25hbWVfaWQgPSAwTDsKKwl1MzIgYWN0X2Rlc2NfaWQgPSAwTDsKKwl1MzIgYWN0X3Byb2NfaWQgPSAwTDsKKwl1MzIgYWN0X3Byb2NfbmFtZSA9IDBMOworCXU4IGFjdF9wcm9jX2F0dHJpYnV0ZSA9IDA7CisKKwlpZiAocHJvZ3JhbV9zaXplIDw9IDUyTCkKKwkJcmV0dXJuIHN0YXR1czsKKwkvKiBSZWFkIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCWZpcnN0X3dvcmQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOworCisJaWYgKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMUwpCisJCXJldHVybiBzdGF0dXM7CisKKwlhY3Rpb25fdGFibGUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNF0pOworCXByb2NfdGFibGUgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs4XSk7CisJc3RyX3RhYmxlID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzEyXSk7CisJbm90ZV9zdHJpbmdzID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzE2XSk7CisJYWN0aW9uX2NvdW50ID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ4XSk7CisJcHJvY19jb3VudCAgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzUyXSk7CisKKwlpZiAoaW5kZXggPj0gYWN0aW9uX2NvdW50KQorCQlyZXR1cm4gc3RhdHVzOworCisJYWN0X25hbWVfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsgKDEyICogaW5kZXgpXSk7CisJYWN0X2Rlc2NfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsgKDEyICogaW5kZXgpICsgNF0pOworCWFjdF9wcm9jX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArICgxMiAqIGluZGV4KSArIDhdKTsKKworCSpuYW1lID0gJnBbc3RyX3RhYmxlICsgYWN0X25hbWVfaWRdOworCisJaWYgKGFjdF9kZXNjX2lkIDwgKG5vdGVfc3RyaW5ncyAtIHN0cl90YWJsZSkpCisJCSpkZXNjcmlwdGlvbiA9ICZwW3N0cl90YWJsZSArIGFjdF9kZXNjX2lkXTsKKworCWRvIHsKKwkJYWN0X3Byb2NfbmFtZSA9IGdldF91bmFsaWduZWRfYmUzMigKKwkJCQkJJnBbcHJvY190YWJsZSArICgxMyAqIGFjdF9wcm9jX2lkKV0pOworCQlhY3RfcHJvY19hdHRyaWJ1dGUgPQorCQkJKHBbcHJvY190YWJsZSArICgxMyAqIGFjdF9wcm9jX2lkKSArIDhdICYgMHgwMyk7CisKKwkJcHJvY3B0ciA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGFsdGVyYV9wcm9jaW5mbyksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCisJCWlmIChwcm9jcHRyID09IE5VTEwpCisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQllbHNlIHsKKwkJCXByb2NwdHItPm5hbWUgPSAmcFtzdHJfdGFibGUgKyBhY3RfcHJvY19uYW1lXTsKKwkJCXByb2NwdHItPmF0dHJzID0gYWN0X3Byb2NfYXR0cmlidXRlOworCQkJcHJvY3B0ci0+bmV4dCA9IE5VTEw7CisKKwkJCS8qIGFkZCByZWNvcmQgdG8gZW5kIG9mIGxpbmtlZCBsaXN0ICovCisJCQlpZiAoKnByb2NfbGlzdCA9PSBOVUxMKQorCQkJCSpwcm9jX2xpc3QgPSBwcm9jcHRyOworCQkJZWxzZSB7CisJCQkJdG1wcHRyID0gKnByb2NfbGlzdDsKKwkJCQl3aGlsZSAodG1wcHRyLT5uZXh0ICE9IE5VTEwpCisJCQkJCXRtcHB0ciA9IHRtcHB0ci0+bmV4dDsKKwkJCQl0bXBwdHItPm5leHQgPSBwcm9jcHRyOworCQkJfQorCQl9CisKKwkJYWN0X3Byb2NfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoCisJCQkJJnBbcHJvY190YWJsZSArICgxMyAqIGFjdF9wcm9jX2lkKSArIDRdKTsKKwl9IHdoaWxlICgoYWN0X3Byb2NfaWQgIT0gMCkgJiYgKGFjdF9wcm9jX2lkIDwgcHJvY19jb3VudCkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGFsdGVyYV9pbml0KHN0cnVjdCBhbHRlcmFfY29uZmlnICpjb25maWcsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCit7CisJc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlID0gTlVMTDsKKwlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICpwcm9jX2xpc3QgPSBOVUxMOworCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKnByb2NwdHIgPSBOVUxMOworCWNoYXIgKmtleSA9IE5VTEw7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCWNoYXIgKmFjdGlvbl9uYW1lID0gTlVMTDsKKwljaGFyICpkZXNjcmlwdGlvbiA9IE5VTEw7CisJaW50IGV4ZWNfcmVzdWx0ID0gMDsKKwlpbnQgZXhpdF9jb2RlID0gMDsKKwlpbnQgZm9ybWF0X3ZlcnNpb24gPSAwOworCWludCBhY3Rpb25fY291bnQgPSAwOworCWludCBwcm9jZWR1cmVfY291bnQgPSAwOworCWludCBpbmRleCA9IDA7CisJczMyIG9mZnNldCA9IDBMOworCXMzMiBlcnJvcl9hZGRyZXNzID0gMEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlrZXkgPSBremFsbG9jKDMzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJdmFsdWUgPSBremFsbG9jKDI1NywgR0ZQX0tFUk5FTCk7CisJaWYgKCF2YWx1ZSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfa2V5OworCX0KKwlhc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWx0ZXJhX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc3RhdGUpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3ZhbHVlOworCX0KKworCWFzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCWlmICghYXN0YXRlLT5jb25maWctPmp0YWdfaW8pIHsKKwkJZHByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyBieXRlYmxhc3RlciFcbiIsIF9fZnVuY19fKTsKKwkJYXN0YXRlLT5jb25maWctPmp0YWdfaW8gPSBuZXR1cF9qdGFnX2lvX2xwdDsKKwl9CisKKwlhbHRlcmFfY2hlY2tfY3JjKCh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwlpZiAoZGVidWcpIHsKKwkJYWx0ZXJhX2dldF9maWxlX2luZm8oKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplLCAmZm9ybWF0X3ZlcnNpb24sCisJCQkJCSZhY3Rpb25fY291bnQsICZwcm9jZWR1cmVfY291bnQpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmlsZSBmb3JtYXQgaXMgJXMgQnl0ZUNvZGUgZm9ybWF0XG4iLAorCQkJX19mdW5jX18sIChmb3JtYXRfdmVyc2lvbiA9PSAyKSA/ICJKYW0gU1RBUEwiIDoKKwkJCQkJCSJwcmUtc3RhbmRhcmRpemVkIEphbSAxLjEiKTsKKwkJd2hpbGUgKGFsdGVyYV9nZXRfbm90ZSgodTggKilmdy0+ZGF0YSwgZnctPnNpemUsCisJCQkJCSZvZmZzZXQsIGtleSwgdmFsdWUsIDI1NikgPT0gMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBOT1RFIFwiJXNcIiA9IFwiJXNcIlxuIiwKKwkJCQkJX19mdW5jX18sIGtleSwgdmFsdWUpOworCX0KKworCWlmIChkZWJ1ZyAmJiAoZm9ybWF0X3ZlcnNpb24gPT0gMikgJiYgKGFjdGlvbl9jb3VudCA+IDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBY3Rpb25zIGF2YWlsYWJsZTpcbiIsIF9fZnVuY19fKTsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYWN0aW9uX2NvdW50OyArK2luZGV4KSB7CisJCQlhbHRlcmFfZ2V0X2FjdF9pbmZvKCh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSwKKwkJCQkJCWluZGV4LCAmYWN0aW9uX25hbWUsCisJCQkJCQkmZGVzY3JpcHRpb24sCisJCQkJCQkmcHJvY19saXN0KTsKKworCQkJaWYgKGRlc2NyaXB0aW9uID09IE5VTEwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlhY3Rpb25fbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFwiJXNcIlxuIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJYWN0aW9uX25hbWUsCisJCQkJCQlkZXNjcmlwdGlvbik7CisKKwkJCXByb2NwdHIgPSBwcm9jX2xpc3Q7CisJCQl3aGlsZSAocHJvY3B0ciAhPSBOVUxMKSB7CisJCQkJaWYgKHByb2NwdHItPmF0dHJzICE9IDApCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICAlcyAoJXMpXG4iLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlwcm9jcHRyLT5uYW1lLAorCQkJCQkJKHByb2NwdHItPmF0dHJzID09IDEpID8KKwkJCQkJCSJvcHRpb25hbCIgOiAicmVjb21tZW5kZWQiKTsKKworCQkJCXByb2NfbGlzdCA9IHByb2NwdHItPm5leHQ7CisJCQkJa2ZyZWUocHJvY3B0cik7CisJCQkJcHJvY3B0ciA9IHByb2NfbGlzdDsKKwkJCX0KKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJfQorCisJZXhlY19yZXN1bHQgPSBhbHRlcmFfZXhlY3V0ZShhc3RhdGUsICh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSwKKwkJCQkmZXJyb3JfYWRkcmVzcywgJmV4aXRfY29kZSwgJmZvcm1hdF92ZXJzaW9uKTsKKworCWlmIChleGl0X2NvZGUpCisJCWV4ZWNfcmVzdWx0ID0gLUVSRU1PVEVJTzsKKworCWlmICgoZm9ybWF0X3ZlcnNpb24gPT0gMikgJiYgKGV4ZWNfcmVzdWx0ID09IC1FSU5WQUwpKSB7CisJCWlmIChhc3RhdGUtPmNvbmZpZy0+YWN0aW9uID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvcjogbm8gYWN0aW9uIHNwZWNpZmllZCBmb3IgIgorCQkJCSJKYW0gU1RBUEwgZmlsZS5cbnByb2dyYW0gdGVybWluYXRlZC5cbiIsCisJCQkJX19mdW5jX18pOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvcjogYWN0aW9uIFwiJXNcIiIKKwkJCQkiIGlzIG5vdCBzdXBwb3J0ZWQgIgorCQkJCSJmb3IgdGhpcyBKYW0gU1RBUEwgZmlsZS5cbiIKKwkJCQkiUHJvZ3JhbSB0ZXJtaW5hdGVkLlxuIiwgX19mdW5jX18sCisJCQkJYXN0YXRlLT5jb25maWctPmFjdGlvbik7CisKKwl9IGVsc2UgaWYgKGV4ZWNfcmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZFxuIiwgX19mdW5jX18sIGV4ZWNfcmVzdWx0KTsKKworCWtmcmVlKGFzdGF0ZSk7CitmcmVlX3ZhbHVlOgorCWtmcmVlKHZhbHVlKTsKK2ZyZWVfa2V5OgorCWtmcmVlKGtleSk7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woYWx0ZXJhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jIGIvZHJpdmVycy9taXNjL2F0bWVsLXNzYy5jCmluZGV4IDc2OWE0ZTguLjViYjE4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9hdG1lbC1zc2MuYworKysgYi9kcml2ZXJzL21pc2MvYXRtZWwtc3NjLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsLXNzYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogU2VyaWFsaXplIGFjY2VzcyB0byBzc2NfbGlzdCBhbmQgdXNlciBjb3VudCAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyh1c2VyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2F0bWVsX3RjbGliLmMgYi9kcml2ZXJzL21pc2MvYXRtZWxfdGNsaWIuYwppbmRleCBhODQ0ODEwLi40YmNmYzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXRtZWxfdGNsaWIuYworKysgYi9kcml2ZXJzL21pc2MvYXRtZWxfdGNsaWIuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIE51bWJlciBvZiBieXRlcyB0byByZXNlcnZlIGZvciB0aGUgaW9tZW0gcmVzb3VyY2UgKi8KICNkZWZpbmUgQVRNRUxfVENfSU9NRU1fU0laRQkyNTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYyBiL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYwppbmRleCA4MmZlMmQwLi5iZmVlYTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYmgxNzgwZ2xpLmMKKysrIGIvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIEJIMTc4MF9SRUdfQ09OVFJPTAkweDgwCiAjZGVmaW5lIEJIMTc4MF9SRUdfUEFSVElECTB4OEEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9mc2E5NDgwLmMgYi9kcml2ZXJzL21pc2MvZnNhOTQ4MC5jCmluZGV4IDI3ZGMwZDIuLmY2NTg2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9mc2E5NDgwLmMKKysrIGIvZHJpdmVycy9taXNjL2ZzYTk0ODAuYwpAQCAtNDAwLDcgKzQwMCw4IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKLQkJZGV2aWNlX2luaXRfd2FrZXVwKCZjbGllbnQtPmRldiwgcGRhdGEtPndha2V1cCk7CisJCWlmIChwZGF0YSkKKwkJCWRldmljZV9pbml0X3dha2V1cCgmY2xpZW50LT5kZXYsIHBkYXRhLT53YWtldXApOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2tnZGJ0cy5jIGIvZHJpdmVycy9taXNjL2tnZGJ0cy5jCmluZGV4IDhjZWJlYzUuLjNmN2FkODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9rZ2RidHMuYworKysgYi9kcml2ZXJzL21pc2Mva2dkYnRzLmMKQEAgLTEwMiw2ICsxMDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIHYxcHJpbnRrKGEuLi4pIGRvIHsgXAogCWlmICh2ZXJib3NlKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuYwppbmRleCA4YjUxY2Q2Li4yOWQxMmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCWludCBpOwogCiAJaWYgKGxpczMtPmJsa3JlYWQpIHsKLQkJaWYgKGxpczNfZGV2Lndob2FtaSA9PSBXQUlfMTJCKSB7CisJCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzEyQikgewogCQkJdTE2IGRhdGFbM107CiAJCQlsaXMzLT5ibGtyZWFkKGxpczMsIE9VVFhfTCwgNiwgKHU4ICopZGF0YSk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQpAQCAtMTk1LDE4ICsxOTUsMzAgQEAKIHN0YXRpYyBpbnQgbGlzM18zZGNfcmF0ZXNbMTZdID0gezAsIDEsIDEwLCAyNSwgNTAsIDEwMCwgMjAwLCA0MDAsIDE2MDAsIDUwMDB9OwogCiAvKiBPRFIgaXMgT3V0cHV0IERhdGEgUmF0ZSAqLwotc3RhdGljIGludCBsaXMzbHYwMmRfZ2V0X29kcih2b2lkKQorc3RhdGljIGludCBsaXMzbHYwMmRfZ2V0X29kcihzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogewogCXU4IGN0cmw7CiAJaW50IHNoaWZ0OwogCi0JbGlzM19kZXYucmVhZCgmbGlzM19kZXYsIENUUkxfUkVHMSwgJmN0cmwpOwotCWN0cmwgJj0gbGlzM19kZXYub2RyX21hc2s7Ci0Jc2hpZnQgPSBmZnMobGlzM19kZXYub2RyX21hc2spIC0gMTsKLQlyZXR1cm4gbGlzM19kZXYub2Ryc1soY3RybCA+PiBzaGlmdCldOworCWxpczMtPnJlYWQobGlzMywgQ1RSTF9SRUcxLCAmY3RybCk7CisJY3RybCAmPSBsaXMzLT5vZHJfbWFzazsKKwlzaGlmdCA9IGZmcyhsaXMzLT5vZHJfbWFzaykgLSAxOworCXJldHVybiBsaXMzLT5vZHJzWyhjdHJsID4+IHNoaWZ0KV07CiB9CiAKLXN0YXRpYyBpbnQgbGlzM2x2MDJkX3NldF9vZHIoaW50IHJhdGUpCitzdGF0aWMgaW50IGxpczNsdjAyZF9nZXRfcHdyb25fd2FpdChzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQoreworCWludCBkaXYgPSBsaXMzbHYwMmRfZ2V0X29kcihsaXMzKTsKKworCWlmIChXQVJOX09OQ0UoZGl2ID09IDAsICJkZXZpY2UgcmV0dXJuZWQgc3B1cmlvdXMgZGF0YSIpKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogTElTMyBwb3dlciBvbiBkZWxheSBpcyBxdWl0ZSBsb25nICovCisJbXNsZWVwKGxpczMtPnB3cm9uX2RlbGF5IC8gZGl2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaXMzbHYwMmRfc2V0X29kcihzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzLCBpbnQgcmF0ZSkKIHsKIAl1OCBjdHJsOwogCWludCBpLCBsZW4sIHNoaWZ0OwpAQCAtMjE0LDE0ICsyMjYsMTQgQEAKIAlpZiAoIXJhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGlzM19kZXYucmVhZCgmbGlzM19kZXYsIENUUkxfUkVHMSwgJmN0cmwpOwotCWN0cmwgJj0gfmxpczNfZGV2Lm9kcl9tYXNrOwotCWxlbiA9IDEgPDwgaHdlaWdodF9sb25nKGxpczNfZGV2Lm9kcl9tYXNrKTsgLyogIyBvZiBwb3NzaWJsZSB2YWx1ZXMgKi8KLQlzaGlmdCA9IGZmcyhsaXMzX2Rldi5vZHJfbWFzaykgLSAxOworCWxpczMtPnJlYWQobGlzMywgQ1RSTF9SRUcxLCAmY3RybCk7CisJY3RybCAmPSB+bGlzMy0+b2RyX21hc2s7CisJbGVuID0gMSA8PCBod2VpZ2h0X2xvbmcobGlzMy0+b2RyX21hc2spOyAvKiAjIG9mIHBvc3NpYmxlIHZhbHVlcyAqLworCXNoaWZ0ID0gZmZzKGxpczMtPm9kcl9tYXNrKSAtIDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWlmIChsaXMzX2Rldi5vZHJzW2ldID09IHJhdGUpIHsKLQkJCWxpczNfZGV2LndyaXRlKCZsaXMzX2RldiwgQ1RSTF9SRUcxLAorCQlpZiAobGlzMy0+b2Ryc1tpXSA9PSByYXRlKSB7CisJCQlsaXMzLT53cml0ZShsaXMzLCBDVFJMX1JFRzEsCiAJCQkJCWN0cmwgfCAoaSA8PCBzaGlmdCkpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTI0MCwxMiArMjUyLDEyIEBACiAJbXV0ZXhfbG9jaygmbGlzMy0+bXV0ZXgpOwogCiAJaXJxX2NmZyA9IGxpczMtPmlycV9jZmc7Ci0JaWYgKGxpczNfZGV2Lndob2FtaSA9PSBXQUlfOEIpIHsKKwlpZiAobGlzMy0+d2hvYW1pID09IFdBSV84QikgewogCQlsaXMzLT5kYXRhX3JlYWR5X2NvdW50W0lSUV9MSU5FMF0gPSAwOwogCQlsaXMzLT5kYXRhX3JlYWR5X2NvdW50W0lSUV9MSU5FMV0gPSAwOwogCiAJCS8qIENoYW5nZSBpbnRlcnJ1cHQgY2ZnIHRvIGRhdGEgcmVhZHkgZm9yIHNlbGZ0ZXN0ICovCi0JCWF0b21pY19pbmMoJmxpczNfZGV2Lndha2VfdGhyZWFkKTsKKwkJYXRvbWljX2luYygmbGlzMy0+d2FrZV90aHJlYWQpOwogCQlsaXMzLT5pcnFfY2ZnID0gTElTM19JUlExX0RBVEFfUkVBRFkgfCBMSVMzX0lSUTJfREFUQV9SRUFEWTsKIAkJbGlzMy0+cmVhZChsaXMzLCBDVFJMX1JFRzMsICZjdHJsX3JlZ19kYXRhKTsKIAkJbGlzMy0+d3JpdGUobGlzMywgQ1RSTF9SRUczLCAoY3RybF9yZWdfZGF0YSAmCkBAIC0yNTMsMTIgKzI2NSwxMiBAQAogCQkJCShMSVMzX0lSUTFfREFUQV9SRUFEWSB8IExJUzNfSVJRMl9EQVRBX1JFQURZKSk7CiAJfQogCi0JaWYgKGxpczNfZGV2Lndob2FtaSA9PSBXQUlfM0RDKSB7CisJaWYgKGxpczMtPndob2FtaSA9PSBXQUlfM0RDKSB7CiAJCWN0bHJlZyA9IENUUkxfUkVHNDsKIAkJc2VsZnRlc3QgPSBDVFJMNF9TVDA7CiAJfSBlbHNlIHsKIAkJY3RscmVnID0gQ1RSTF9SRUcxOwotCQlpZiAobGlzM19kZXYud2hvYW1pID09IFdBSV8xMkIpCisJCWlmIChsaXMzLT53aG9hbWkgPT0gV0FJXzEyQikKIAkJCXNlbGZ0ZXN0ID0gQ1RSTDFfU1Q7CiAJCWVsc2UKIAkJCXNlbGZ0ZXN0ID0gQ1RSTDFfU1RQOwpAQCAtMjY2LDcgKzI3OCw5IEBACiAKIAlsaXMzLT5yZWFkKGxpczMsIGN0bHJlZywgJnJlZyk7CiAJbGlzMy0+d3JpdGUobGlzMywgY3RscmVnLCAocmVnIHwgc2VsZnRlc3QpKTsKLQltc2xlZXAobGlzMy0+cHdyb25fZGVsYXkgLyBsaXMzbHYwMmRfZ2V0X29kcigpKTsKKwlyZXQgPSBsaXMzbHYwMmRfZ2V0X3B3cm9uX3dhaXQobGlzMyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOwogCiAJLyogUmVhZCBkaXJlY3RseSB0byBhdm9pZCBheGlzIHJlbWFwICovCiAJeCA9IGxpczMtPnJlYWRfZGF0YShsaXMzLCBPVVRYKTsKQEAgLTI3NSw3ICsyODksOSBAQAogCiAJLyogYmFjayB0byBub3JtYWwgc2V0dGluZ3MgKi8KIAlsaXMzLT53cml0ZShsaXMzLCBjdGxyZWcsIHJlZyk7Ci0JbXNsZWVwKGxpczMtPnB3cm9uX2RlbGF5IC8gbGlzM2x2MDJkX2dldF9vZHIoKSk7CisJcmV0ID0gbGlzM2x2MDJkX2dldF9wd3Jvbl93YWl0KGxpczMpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKIAogCXJlc3VsdHNbMF0gPSB4IC0gbGlzMy0+cmVhZF9kYXRhKGxpczMsIE9VVFgpOwogCXJlc3VsdHNbMV0gPSB5IC0gbGlzMy0+cmVhZF9kYXRhKGxpczMsIE9VVFkpOwpAQCAtMjgzLDkgKzI5OSw5IEBACiAKIAlyZXQgPSAwOwogCi0JaWYgKGxpczNfZGV2Lndob2FtaSA9PSBXQUlfOEIpIHsKKwlpZiAobGlzMy0+d2hvYW1pID09IFdBSV84QikgewogCQkvKiBSZXN0b3JlIG9yaWdpbmFsIGludGVycnVwdCBjb25maWd1cmF0aW9uICovCi0JCWF0b21pY19kZWMoJmxpczNfZGV2Lndha2VfdGhyZWFkKTsKKwkJYXRvbWljX2RlYygmbGlzMy0+d2FrZV90aHJlYWQpOwogCQlsaXMzLT53cml0ZShsaXMzLCBDVFJMX1JFRzMsIGN0cmxfcmVnX2RhdGEpOwogCQlsaXMzLT5pcnFfY2ZnID0gaXJxX2NmZzsKIApAQCAtMzYzLDggKzM3OSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsaXMzbHYwMmRfcG93ZXJvZmYpOwogCi12b2lkIGxpczNsdjAyZF9wb3dlcm9uKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpCitpbnQgbGlzM2x2MDJkX3Bvd2Vyb24oc3RydWN0IGxpczNsdjAyZCAqbGlzMykKIHsKKwlpbnQgZXJyOwogCXU4IHJlZzsKIAogCWxpczMtPmluaXQobGlzMyk7CkBAIC0zODQsMzUgKzQwMSw0MSBAQAogCQlsaXMzLT53cml0ZShsaXMzLCBDVFJMX1JFRzIsIHJlZyk7CiAJfQogCi0JLyogTElTMyBwb3dlciBvbiBkZWxheSBpcyBxdWl0ZSBsb25nICovCi0JbXNsZWVwKGxpczMtPnB3cm9uX2RlbGF5IC8gbGlzM2x2MDJkX2dldF9vZHIoKSk7CisJZXJyID0gbGlzM2x2MDJkX2dldF9wd3Jvbl93YWl0KGxpczMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAobGlzMy0+cmVnX2N0cmwpCiAJCWxpczNfY29udGV4dF9yZXN0b3JlKGxpczMpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsaXMzbHYwMmRfcG93ZXJvbik7CiAKIAogc3RhdGljIHZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX3BvbGwoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBpZGV2KQogeworCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBwaWRldi0+cHJpdmF0ZTsKIAlpbnQgeCwgeSwgejsKIAotCW11dGV4X2xvY2soJmxpczNfZGV2Lm11dGV4KTsKLQlsaXMzbHYwMmRfZ2V0X3h5eigmbGlzM19kZXYsICZ4LCAmeSwgJnopOworCW11dGV4X2xvY2soJmxpczMtPm11dGV4KTsKKwlsaXMzbHYwMmRfZ2V0X3h5eihsaXMzLCAmeCwgJnksICZ6KTsKIAlpbnB1dF9yZXBvcnRfYWJzKHBpZGV2LT5pbnB1dCwgQUJTX1gsIHgpOwogCWlucHV0X3JlcG9ydF9hYnMocGlkZXYtPmlucHV0LCBBQlNfWSwgeSk7CiAJaW5wdXRfcmVwb3J0X2FicyhwaWRldi0+aW5wdXQsIEFCU19aLCB6KTsKIAlpbnB1dF9zeW5jKHBpZGV2LT5pbnB1dCk7Ci0JbXV0ZXhfdW5sb2NrKCZsaXMzX2Rldi5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZsaXMzLT5tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIGxpczNsdjAyZF9qb3lzdGlja19vcGVuKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwaWRldikKIHsKLQlpZiAobGlzM19kZXYucG1fZGV2KQotCQlwbV9ydW50aW1lX2dldF9zeW5jKGxpczNfZGV2LnBtX2Rldik7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IHBpZGV2LT5wcml2YXRlOwogCi0JaWYgKGxpczNfZGV2LnBkYXRhICYmIGxpczNfZGV2Lndob2FtaSA9PSBXQUlfOEIgJiYgbGlzM19kZXYuaWRldikKLQkJYXRvbWljX3NldCgmbGlzM19kZXYud2FrZV90aHJlYWQsIDEpOworCWlmIChsaXMzLT5wbV9kZXYpCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobGlzMy0+cG1fZGV2KTsKKworCWlmIChsaXMzLT5wZGF0YSAmJiBsaXMzLT53aG9hbWkgPT0gV0FJXzhCICYmIGxpczMtPmlkZXYpCisJCWF0b21pY19zZXQoJmxpczMtPndha2VfdGhyZWFkLCAxKTsKIAkvKgogCSAqIFVwZGF0ZSBjb29yZGluYXRlcyBmb3IgdGhlIGNhc2Ugd2hlcmUgcG9sbCBpbnRlcnZhbCBpcyAwIGFuZAogCSAqIHRoZSBjaGlwIGluIHJ1bm5pbmcgcHVyZWx5IHVuZGVyIGludGVycnVwdCBjb250cm9sCkBAIC00MjIsMTQgKzQ0NSwxOCBAQAogCiBzdGF0aWMgdm9pZCBsaXMzbHYwMmRfam95c3RpY2tfY2xvc2Uoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBpZGV2KQogewotCWF0b21pY19zZXQoJmxpczNfZGV2Lndha2VfdGhyZWFkLCAwKTsKLQlpZiAobGlzM19kZXYucG1fZGV2KQotCQlwbV9ydW50aW1lX3B1dChsaXMzX2Rldi5wbV9kZXYpOworCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBwaWRldi0+cHJpdmF0ZTsKKworCWF0b21pY19zZXQoJmxpczMtPndha2VfdGhyZWFkLCAwKTsKKwlpZiAobGlzMy0+cG1fZGV2KQorCQlwbV9ydW50aW1lX3B1dChsaXMzLT5wbV9kZXYpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbGlzMzAyZGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15KQorc3RhdGljIGlycXJldHVybl90IGxpczMwMmRsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewotCWlmICghdGVzdF9iaXQoMCwgJmxpczNfZGV2Lm1pc2Nfb3BlbmVkKSkKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gZGF0YTsKKworCWlmICghdGVzdF9iaXQoMCwgJmxpczMtPm1pc2Nfb3BlbmVkKSkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtNDM3LDEyICs0NjQsMTIgQEAKIAkgKiB0aGUgbGlkIGlzIGNsb3NlZC4gVGhpcyBsZWFkcyB0byBpbnRlcnJ1cHRzIGFzIHNvb24gYXMgYSBsaXR0bGUgbW92ZQogCSAqIGlzIGRvbmUuCiAJICovCi0JYXRvbWljX2luYygmbGlzM19kZXYuY291bnQpOworCWF0b21pY19pbmMoJmxpczMtPmNvdW50KTsKIAotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGlzM19kZXYubWlzY193YWl0KTsKLQlraWxsX2Zhc3luYygmbGlzM19kZXYuYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpczMtPm1pc2Nfd2FpdCk7CisJa2lsbF9mYXN5bmMoJmxpczMtPmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CiBvdXQ6Ci0JaWYgKGF0b21pY19yZWFkKCZsaXMzX2Rldi53YWtlX3RocmVhZCkpCisJaWYgKGF0b21pY19yZWFkKCZsaXMzLT53YWtlX3RocmVhZCkpCiAJCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNTE0LDI4ICs1NDEsMzcgQEAKIAogc3RhdGljIGludCBsaXMzbHYwMmRfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZsaXMzX2Rldi5taXNjX29wZW5lZCkpCisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBsaXMzbHYwMmQsIG1pc2NkZXYpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmxpczMtPm1pc2Nfb3BlbmVkKSkKIAkJcmV0dXJuIC1FQlVTWTsgLyogYWxyZWFkeSBvcGVuICovCiAKLQlpZiAobGlzM19kZXYucG1fZGV2KQotCQlwbV9ydW50aW1lX2dldF9zeW5jKGxpczNfZGV2LnBtX2Rldik7CisJaWYgKGxpczMtPnBtX2RldikKKwkJcG1fcnVudGltZV9nZXRfc3luYyhsaXMzLT5wbV9kZXYpOwogCi0JYXRvbWljX3NldCgmbGlzM19kZXYuY291bnQsIDApOworCWF0b21pY19zZXQoJmxpczMtPmNvdW50LCAwKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsaXMzbHYwMmRfbWlzY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWZhc3luY19oZWxwZXIoLTEsIGZpbGUsIDAsICZsaXMzX2Rldi5hc3luY19xdWV1ZSk7Ci0JY2xlYXJfYml0KDAsICZsaXMzX2Rldi5taXNjX29wZW5lZCk7IC8qIHJlbGVhc2UgdGhlIGRldmljZSAqLwotCWlmIChsaXMzX2Rldi5wbV9kZXYpCi0JCXBtX3J1bnRpbWVfcHV0KGxpczNfZGV2LnBtX2Rldik7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBsaXMzbHYwMmQsIG1pc2NkZXYpOworCisJZmFzeW5jX2hlbHBlcigtMSwgZmlsZSwgMCwgJmxpczMtPmFzeW5jX3F1ZXVlKTsKKwljbGVhcl9iaXQoMCwgJmxpczMtPm1pc2Nfb3BlbmVkKTsgLyogcmVsZWFzZSB0aGUgZGV2aWNlICovCisJaWYgKGxpczMtPnBtX2RldikKKwkJcG1fcnVudGltZV9wdXQobGlzMy0+cG1fZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGlzM2x2MDJkX21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQogeworCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBjb250YWluZXJfb2YoZmlsZS0+cHJpdmF0ZV9kYXRhLAorCQkJCQkgICAgICBzdHJ1Y3QgbGlzM2x2MDJkLCBtaXNjZGV2KTsKKwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXUzMiBkYXRhOwogCXVuc2lnbmVkIGNoYXIgYnl0ZV9kYXRhOwpAQCAtNTQ0LDEwICs1ODAsMTAgQEAKIAlpZiAoY291bnQgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWFkZF93YWl0X3F1ZXVlKCZsaXMzX2Rldi5taXNjX3dhaXQsICZ3YWl0KTsKKwlhZGRfd2FpdF9xdWV1ZSgmbGlzMy0+bWlzY193YWl0LCAmd2FpdCk7CiAJd2hpbGUgKHRydWUpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJZGF0YSA9IGF0b21pY194Y2hnKCZsaXMzX2Rldi5jb3VudCwgMCk7CisJCWRhdGEgPSBhdG9taWNfeGNoZygmbGlzMy0+Y291bnQsIDApOwogCQlpZiAoZGF0YSkKIAkJCWJyZWFrOwogCkBAIC01NzcsMjIgKzYxMywyOCBAQAogCiBvdXQ6CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZsaXMzX2Rldi5taXNjX3dhaXQsICZ3YWl0KTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmbGlzMy0+bWlzY193YWl0LCAmd2FpdCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGxpczNsdjAyZF9taXNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0JcG9sbF93YWl0KGZpbGUsICZsaXMzX2Rldi5taXNjX3dhaXQsIHdhaXQpOwotCWlmIChhdG9taWNfcmVhZCgmbGlzM19kZXYuY291bnQpKQorCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBjb250YWluZXJfb2YoZmlsZS0+cHJpdmF0ZV9kYXRhLAorCQkJCQkgICAgICBzdHJ1Y3QgbGlzM2x2MDJkLCBtaXNjZGV2KTsKKworCXBvbGxfd2FpdChmaWxlLCAmbGlzMy0+bWlzY193YWl0LCB3YWl0KTsKKwlpZiAoYXRvbWljX3JlYWQoJmxpczMtPmNvdW50KSkKIAkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbGlzM2x2MDJkX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKIHsKLQlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZsaXMzX2Rldi5hc3luY19xdWV1ZSk7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBsaXMzbHYwMmQsIG1pc2NkZXYpOworCisJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmbGlzMy0+YXN5bmNfcXVldWUpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaXMzbHYwMmRfbWlzY19mb3BzID0gewpAQCAtNjA1LDg1ICs2NDcsODAgQEAKIAkuZmFzeW5jICA9IGxpczNsdjAyZF9taXNjX2Zhc3luYywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBsaXMzbHYwMmRfbWlzY19kZXZpY2UgPSB7Ci0JLm1pbm9yICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgICAgPSAiZnJlZWZhbGwiLAotCS5mb3BzICAgID0gJmxpczNsdjAyZF9taXNjX2ZvcHMsCi19OwotCi1pbnQgbGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSh2b2lkKQoraW50IGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUoc3RydWN0IGxpczNsdjAyZCAqbGlzMykKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJaW50IGVycjsKIAlpbnQgbWF4X3ZhbCwgZnV6eiwgZmxhdDsKIAlpbnQgYnRuc1tdID0ge0JUTl9YLCBCVE5fWSwgQlROX1p9OwogCi0JaWYgKGxpczNfZGV2LmlkZXYpCisJaWYgKGxpczMtPmlkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGlzM19kZXYuaWRldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKLQlpZiAoIWxpczNfZGV2LmlkZXYpCisJbGlzMy0+aWRldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKKwlpZiAoIWxpczMtPmlkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbGlzM19kZXYuaWRldi0+cG9sbCA9IGxpczNsdjAyZF9qb3lzdGlja19wb2xsOwotCWxpczNfZGV2LmlkZXYtPm9wZW4gPSBsaXMzbHYwMmRfam95c3RpY2tfb3BlbjsKLQlsaXMzX2Rldi5pZGV2LT5jbG9zZSA9IGxpczNsdjAyZF9qb3lzdGlja19jbG9zZTsKLQlsaXMzX2Rldi5pZGV2LT5wb2xsX2ludGVydmFsID0gTURQU19QT0xMX0lOVEVSVkFMOwotCWxpczNfZGV2LmlkZXYtPnBvbGxfaW50ZXJ2YWxfbWluID0gTURQU19QT0xMX01JTjsKLQlsaXMzX2Rldi5pZGV2LT5wb2xsX2ludGVydmFsX21heCA9IE1EUFNfUE9MTF9NQVg7Ci0JaW5wdXRfZGV2ID0gbGlzM19kZXYuaWRldi0+aW5wdXQ7CisJbGlzMy0+aWRldi0+cG9sbCA9IGxpczNsdjAyZF9qb3lzdGlja19wb2xsOworCWxpczMtPmlkZXYtPm9wZW4gPSBsaXMzbHYwMmRfam95c3RpY2tfb3BlbjsKKwlsaXMzLT5pZGV2LT5jbG9zZSA9IGxpczNsdjAyZF9qb3lzdGlja19jbG9zZTsKKwlsaXMzLT5pZGV2LT5wb2xsX2ludGVydmFsID0gTURQU19QT0xMX0lOVEVSVkFMOworCWxpczMtPmlkZXYtPnBvbGxfaW50ZXJ2YWxfbWluID0gTURQU19QT0xMX01JTjsKKwlsaXMzLT5pZGV2LT5wb2xsX2ludGVydmFsX21heCA9IE1EUFNfUE9MTF9NQVg7CisJbGlzMy0+aWRldi0+cHJpdmF0ZSA9IGxpczM7CisJaW5wdXRfZGV2ID0gbGlzMy0+aWRldi0+aW5wdXQ7CiAKIAlpbnB1dF9kZXYtPm5hbWUgICAgICAgPSAiU1QgTElTM0xWMDJETCBBY2NlbGVyb21ldGVyIjsKIAlpbnB1dF9kZXYtPnBoeXMgICAgICAgPSBEUklWRVJfTkFNRSAiL2lucHV0MCI7CiAJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CiAJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gMDsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmbGlzM19kZXYucGRldi0+ZGV2OworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZsaXMzLT5wZGV2LT5kZXY7CiAKIAlzZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7Ci0JbWF4X3ZhbCA9IChsaXMzX2Rldi5tZHBzX21heF92YWwgKiBsaXMzX2Rldi5zY2FsZSkgLyBMSVMzX0FDQ1VSQUNZOwotCWlmIChsaXMzX2Rldi53aG9hbWkgPT0gV0FJXzEyQikgeworCW1heF92YWwgPSAobGlzMy0+bWRwc19tYXhfdmFsICogbGlzMy0+c2NhbGUpIC8gTElTM19BQ0NVUkFDWTsKKwlpZiAobGlzMy0+d2hvYW1pID09IFdBSV8xMkIpIHsKIAkJZnV6eiA9IExJUzNfREVGQVVMVF9GVVpaXzEyQjsKIAkJZmxhdCA9IExJUzNfREVGQVVMVF9GTEFUXzEyQjsKIAl9IGVsc2UgewogCQlmdXp6ID0gTElTM19ERUZBVUxUX0ZVWlpfOEI7CiAJCWZsYXQgPSBMSVMzX0RFRkFVTFRfRkxBVF84QjsKIAl9Ci0JZnV6eiA9IChmdXp6ICogbGlzM19kZXYuc2NhbGUpIC8gTElTM19BQ0NVUkFDWTsKLQlmbGF0ID0gKGZsYXQgKiBsaXMzX2Rldi5zY2FsZSkgLyBMSVMzX0FDQ1VSQUNZOworCWZ1enogPSAoZnV6eiAqIGxpczMtPnNjYWxlKSAvIExJUzNfQUNDVVJBQ1k7CisJZmxhdCA9IChmbGF0ICogbGlzMy0+c2NhbGUpIC8gTElTM19BQ0NVUkFDWTsKIAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIC1tYXhfdmFsLCBtYXhfdmFsLCBmdXp6LCBmbGF0KTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAtbWF4X3ZhbCwgbWF4X3ZhbCwgZnV6eiwgZmxhdCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWiwgLW1heF92YWwsIG1heF92YWwsIGZ1enosIGZsYXQpOwogCi0JbGlzM19kZXYubWFwcGVkX2J0bnNbMF0gPSBsaXMzbHYwMmRfZ2V0X2F4aXMoYWJzKGxpczNfZGV2LmFjLngpLCBidG5zKTsKLQlsaXMzX2Rldi5tYXBwZWRfYnRuc1sxXSA9IGxpczNsdjAyZF9nZXRfYXhpcyhhYnMobGlzM19kZXYuYWMueSksIGJ0bnMpOwotCWxpczNfZGV2Lm1hcHBlZF9idG5zWzJdID0gbGlzM2x2MDJkX2dldF9heGlzKGFicyhsaXMzX2Rldi5hYy56KSwgYnRucyk7CisJbGlzMy0+bWFwcGVkX2J0bnNbMF0gPSBsaXMzbHYwMmRfZ2V0X2F4aXMoYWJzKGxpczMtPmFjLngpLCBidG5zKTsKKwlsaXMzLT5tYXBwZWRfYnRuc1sxXSA9IGxpczNsdjAyZF9nZXRfYXhpcyhhYnMobGlzMy0+YWMueSksIGJ0bnMpOworCWxpczMtPm1hcHBlZF9idG5zWzJdID0gbGlzM2x2MDJkX2dldF9heGlzKGFicyhsaXMzLT5hYy56KSwgYnRucyk7CiAKLQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGxpczNfZGV2LmlkZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UobGlzMy0+aWRldik7CiAJaWYgKGVycikgewotCQlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UobGlzM19kZXYuaWRldik7Ci0JCWxpczNfZGV2LmlkZXYgPSBOVUxMOworCQlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UobGlzMy0+aWRldik7CisJCWxpczMtPmlkZXYgPSBOVUxMOwogCX0KIAogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKTsKIAotdm9pZCBsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSh2b2lkKQordm9pZCBsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZShzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogewotCWlmIChsaXMzX2Rldi5pcnEpCi0JCWZyZWVfaXJxKGxpczNfZGV2LmlycSwgJmxpczNfZGV2KTsKLQlpZiAobGlzM19kZXYucGRhdGEgJiYgbGlzM19kZXYucGRhdGEtPmlycTIpCi0JCWZyZWVfaXJxKGxpczNfZGV2LnBkYXRhLT5pcnEyLCAmbGlzM19kZXYpOworCWlmIChsaXMzLT5pcnEpCisJCWZyZWVfaXJxKGxpczMtPmlycSwgbGlzMyk7CisJaWYgKGxpczMtPnBkYXRhICYmIGxpczMtPnBkYXRhLT5pcnEyKQorCQlmcmVlX2lycShsaXMzLT5wZGF0YS0+aXJxMiwgbGlzMyk7CiAKLQlpZiAoIWxpczNfZGV2LmlkZXYpCisJaWYgKCFsaXMzLT5pZGV2KQogCQlyZXR1cm47CiAKLQlpZiAobGlzM19kZXYuaXJxKQotCQltaXNjX2RlcmVnaXN0ZXIoJmxpczNsdjAyZF9taXNjX2RldmljZSk7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGxpczNfZGV2LmlkZXYpOwotCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShsaXMzX2Rldi5pZGV2KTsKLQlsaXMzX2Rldi5pZGV2ID0gTlVMTDsKKwlpZiAobGlzMy0+aXJxKQorCQltaXNjX2RlcmVnaXN0ZXIoJmxpczMtPm1pc2NkZXYpOworCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShsaXMzLT5pZGV2KTsKKwlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UobGlzMy0+aWRldik7CisJbGlzMy0+aWRldiA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSk7CiAKQEAgLTcwOCw2ICs3NDUsNyBAQAogc3RhdGljIHNzaXplX3QgbGlzM2x2MDJkX3NlbGZ0ZXN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXMxNiB2YWx1ZXNbM107CiAKIAlzdGF0aWMgY29uc3QgY2hhciBva1tdID0gIk9LIjsKQEAgLTcxNSw4ICs3NTMsOCBAQAogCXN0YXRpYyBjb25zdCBjaGFyIGlycVtdID0gIkZBSUxfSVJRIjsKIAljb25zdCBjaGFyICpyZXM7CiAKLQlsaXMzbHYwMmRfc3lzZnNfcG93ZXJvbigmbGlzM19kZXYpOwotCXN3aXRjaCAobGlzM2x2MDJkX3NlbGZ0ZXN0KCZsaXMzX2RldiwgdmFsdWVzKSkgeworCWxpczNsdjAyZF9zeXNmc19wb3dlcm9uKGxpczMpOworCXN3aXRjaCAobGlzM2x2MDJkX3NlbGZ0ZXN0KGxpczMsIHZhbHVlcykpIHsKIAljYXNlIFNFTEZURVNUX0ZBSUw6CiAJCXJlcyA9IGZhaWw7CiAJCWJyZWFrOwpAQCAtNzM1LDMzICs3NzMsMzcgQEAKIHN0YXRpYyBzc2l6ZV90IGxpczNsdjAyZF9wb3NpdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogeworCXN0cnVjdCBsaXMzbHYwMmQgKmxpczMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgeCwgeSwgejsKIAotCWxpczNsdjAyZF9zeXNmc19wb3dlcm9uKCZsaXMzX2Rldik7Ci0JbXV0ZXhfbG9jaygmbGlzM19kZXYubXV0ZXgpOwotCWxpczNsdjAyZF9nZXRfeHl6KCZsaXMzX2RldiwgJngsICZ5LCAmeik7Ci0JbXV0ZXhfdW5sb2NrKCZsaXMzX2Rldi5tdXRleCk7CisJbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24obGlzMyk7CisJbXV0ZXhfbG9jaygmbGlzMy0+bXV0ZXgpOworCWxpczNsdjAyZF9nZXRfeHl6KGxpczMsICZ4LCAmeSwgJnopOworCW11dGV4X3VubG9jaygmbGlzMy0+bXV0ZXgpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiglZCwlZCwlZClcbiIsIHgsIHksIHopOwogfQogCiBzdGF0aWMgc3NpemVfdCBsaXMzbHYwMmRfcmF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24oJmxpczNfZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbGlzM2x2MDJkX2dldF9vZHIoKSk7CisJc3RydWN0IGxpczNsdjAyZCAqbGlzMyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJbGlzM2x2MDJkX3N5c2ZzX3Bvd2Vyb24obGlzMyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxpczNsdjAyZF9nZXRfb2RyKGxpczMpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbGlzM2x2MDJkX3JhdGVfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgbG9uZyByYXRlOwogCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnJhdGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxpczNsdjAyZF9zeXNmc19wb3dlcm9uKCZsaXMzX2Rldik7Ci0JaWYgKGxpczNsdjAyZF9zZXRfb2RyKHJhdGUpKQorCWxpczNsdjAyZF9zeXNmc19wb3dlcm9uKGxpczMpOworCWlmIChsaXMzbHYwMmRfc2V0X29kcihsaXMzLCByYXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC03OTAsNiArODMyLDcgQEAKIAlpZiAoSVNfRVJSKGxpczMtPnBkZXYpKQogCQlyZXR1cm4gUFRSX0VSUihsaXMzLT5wZGV2KTsKIAorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGxpczMtPnBkZXYsIGxpczMpOwogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmxpczMtPnBkZXYtPmRldi5rb2JqLCAmbGlzM2x2MDJkX2F0dHJpYnV0ZV9ncm91cCk7CiB9CiAKQEAgLTgwMyw3ICs4NDYsNyBAQAogCiAJCS8qIFNZU0ZTIG1heSBoYXZlIGxlZnQgY2hpcCBydW5uaW5nLiBUdXJuIG9mZiBpZiBuZWNlc3NhcnkgKi8KIAkJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChsaXMzLT5wbV9kZXYpKQotCQkJbGlzM2x2MDJkX3Bvd2Vyb2ZmKCZsaXMzX2Rldik7CisJCQlsaXMzbHYwMmRfcG93ZXJvZmYobGlzMyk7CiAKIAkJcG1fcnVudGltZV9kaXNhYmxlKGxpczMtPnBtX2Rldik7CiAJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChsaXMzLT5wbV9kZXYpOwpAQCAtODEzLDI0ICs4NTYsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9yZW1vdmVfZnMpOwogCi1zdGF0aWMgdm9pZCBsaXMzbHYwMmRfOGJfY29uZmlndXJlKHN0cnVjdCBsaXMzbHYwMmQgKmRldiwKK3N0YXRpYyB2b2lkIGxpczNsdjAyZF84Yl9jb25maWd1cmUoc3RydWN0IGxpczNsdjAyZCAqbGlzMywKIAkJCQlzdHJ1Y3QgbGlzM2x2MDJkX3BsYXRmb3JtX2RhdGEgKnApCiB7CiAJaW50IGVycjsKIAlpbnQgY3RybDIgPSBwLT5oaXBhc3NfY3RybDsKIAogCWlmIChwLT5jbGlja19mbGFncykgewotCQlkZXYtPndyaXRlKGRldiwgQ0xJQ0tfQ0ZHLCBwLT5jbGlja19mbGFncyk7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19USU1FTElNSVQsIHAtPmNsaWNrX3RpbWVfbGltaXQpOwotCQlkZXYtPndyaXRlKGRldiwgQ0xJQ0tfTEFURU5DWSwgcC0+Y2xpY2tfbGF0ZW5jeSk7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19XSU5ET1csIHAtPmNsaWNrX3dpbmRvdyk7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19USFNaLCBwLT5jbGlja190aHJlc2hfeiAmIDB4Zik7Ci0JCWRldi0+d3JpdGUoZGV2LCBDTElDS19USFNZX1gsCisJCWxpczMtPndyaXRlKGxpczMsIENMSUNLX0NGRywgcC0+Y2xpY2tfZmxhZ3MpOworCQlsaXMzLT53cml0ZShsaXMzLCBDTElDS19USU1FTElNSVQsIHAtPmNsaWNrX3RpbWVfbGltaXQpOworCQlsaXMzLT53cml0ZShsaXMzLCBDTElDS19MQVRFTkNZLCBwLT5jbGlja19sYXRlbmN5KTsKKwkJbGlzMy0+d3JpdGUobGlzMywgQ0xJQ0tfV0lORE9XLCBwLT5jbGlja193aW5kb3cpOworCQlsaXMzLT53cml0ZShsaXMzLCBDTElDS19USFNaLCBwLT5jbGlja190aHJlc2hfeiAmIDB4Zik7CisJCWxpczMtPndyaXRlKGxpczMsIENMSUNLX1RIU1lfWCwKIAkJCShwLT5jbGlja190aHJlc2hfeCAmIDB4ZikgfAogCQkJKHAtPmNsaWNrX3RocmVzaF95IDw8IDQpKTsKIAotCQlpZiAoZGV2LT5pZGV2KSB7Ci0JCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBsaXMzX2Rldi5pZGV2LT5pbnB1dDsKKwkJaWYgKGxpczMtPmlkZXYpIHsKKwkJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGxpczMtPmlkZXYtPmlucHV0OwogCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9LRVksIEJUTl9YKTsKIAkJCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0X2RldiwgRVZfS0VZLCBCVE5fWSk7CiAJCQlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dF9kZXYsIEVWX0tFWSwgQlROX1opOwpAQCAtODM4LDIyICs4ODEsMjIgQEAKIAl9CiAKIAlpZiAocC0+d2FrZXVwX2ZsYWdzKSB7Ci0JCWRldi0+d3JpdGUoZGV2LCBGRl9XVV9DRkdfMSwgcC0+d2FrZXVwX2ZsYWdzKTsKLQkJZGV2LT53cml0ZShkZXYsIEZGX1dVX1RIU18xLCBwLT53YWtldXBfdGhyZXNoICYgMHg3Zik7CisJCWxpczMtPndyaXRlKGxpczMsIEZGX1dVX0NGR18xLCBwLT53YWtldXBfZmxhZ3MpOworCQlsaXMzLT53cml0ZShsaXMzLCBGRl9XVV9USFNfMSwgcC0+d2FrZXVwX3RocmVzaCAmIDB4N2YpOwogCQkvKiBwZGF0YSB2YWx1ZSArIDEgdG8ga2VlcCB0aGlzIGJhY2t3YXJkIGNvbXBhdGlibGUqLwotCQlkZXYtPndyaXRlKGRldiwgRkZfV1VfRFVSQVRJT05fMSwgcC0+ZHVyYXRpb24xICsgMSk7CisJCWxpczMtPndyaXRlKGxpczMsIEZGX1dVX0RVUkFUSU9OXzEsIHAtPmR1cmF0aW9uMSArIDEpOwogCQljdHJsMiBePSBIUF9GRl9XVTE7IC8qIFhvciB0byBrZWVwIGNvbXBhdGlibGUgd2l0aCBvbGQgcGRhdGEqLwogCX0KIAogCWlmIChwLT53YWtldXBfZmxhZ3MyKSB7Ci0JCWRldi0+d3JpdGUoZGV2LCBGRl9XVV9DRkdfMiwgcC0+d2FrZXVwX2ZsYWdzMik7Ci0JCWRldi0+d3JpdGUoZGV2LCBGRl9XVV9USFNfMiwgcC0+d2FrZXVwX3RocmVzaDIgJiAweDdmKTsKKwkJbGlzMy0+d3JpdGUobGlzMywgRkZfV1VfQ0ZHXzIsIHAtPndha2V1cF9mbGFnczIpOworCQlsaXMzLT53cml0ZShsaXMzLCBGRl9XVV9USFNfMiwgcC0+d2FrZXVwX3RocmVzaDIgJiAweDdmKTsKIAkJLyogcGRhdGEgdmFsdWUgKyAxIHRvIGtlZXAgdGhpcyBiYWNrd2FyZCBjb21wYXRpYmxlKi8KLQkJZGV2LT53cml0ZShkZXYsIEZGX1dVX0RVUkFUSU9OXzIsIHAtPmR1cmF0aW9uMiArIDEpOworCQlsaXMzLT53cml0ZShsaXMzLCBGRl9XVV9EVVJBVElPTl8yLCBwLT5kdXJhdGlvbjIgKyAxKTsKIAkJY3RybDIgXj0gSFBfRkZfV1UyOyAvKiBYb3IgdG8ga2VlcCBjb21wYXRpYmxlIHdpdGggb2xkIHBkYXRhKi8KIAl9CiAJLyogQ29uZmlndXJlIGhpcGFzcyBmaWx0ZXJzICovCi0JZGV2LT53cml0ZShkZXYsIENUUkxfUkVHMiwgY3RybDIpOworCWxpczMtPndyaXRlKGxpczMsIENUUkxfUkVHMiwgY3RybDIpOwogCiAJaWYgKHAtPmlycTIpIHsKIAkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocC0+aXJxMiwKQEAgLTg2MSw3ICs5MDQsNyBAQAogCQkJCQlsaXMzMDJkbF9pbnRlcnJ1cHRfdGhyZWFkMl84YiwKIAkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfT05FU0hPVCB8CiAJCQkJCShwLT5pcnFfZmxhZ3MyICYgSVJRRl9UUklHR0VSX01BU0spLAotCQkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKKwkJCQkJRFJJVkVSX05BTUUsIGxpczMpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXByX2VycigiTm8gc2Vjb25kIElSUS4gTGltaXRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKIAl9CkBAIC04NzEsOTMgKzkxNCw5NyBAQAogICogSW5pdGlhbGlzZSB0aGUgYWNjZWxlcm9tZXRlciBhbmQgdGhlIHZhcmlvdXMgc3Vic3lzdGVtcy4KICAqIFNob3VsZCBiZSByYXRoZXIgaW5kZXBlbmRlbnQgb2YgdGhlIGJ1cyBzeXN0ZW0uCiAgKi8KLWludCBsaXMzbHYwMmRfaW5pdF9kZXZpY2Uoc3RydWN0IGxpczNsdjAyZCAqZGV2KQoraW50IGxpczNsdjAyZF9pbml0X2RldmljZShzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzKQogewogCWludCBlcnI7CiAJaXJxX2hhbmRsZXJfdCB0aHJlYWRfZm47CiAJaW50IGlycV9mbGFncyA9IDA7CiAKLQlkZXYtPndob2FtaSA9IGxpczNsdjAyZF9yZWFkXzgoZGV2LCBXSE9fQU1fSSk7CisJbGlzMy0+d2hvYW1pID0gbGlzM2x2MDJkX3JlYWRfOChsaXMzLCBXSE9fQU1fSSk7CiAKLQlzd2l0Y2ggKGRldi0+d2hvYW1pKSB7CisJc3dpdGNoIChsaXMzLT53aG9hbWkpIHsKIAljYXNlIFdBSV8xMkI6CiAJCXByX2luZm8oIjEyIGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKLQkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF8xMjsKLQkJZGV2LT5tZHBzX21heF92YWwgPSAyMDQ4OwotCQlkZXYtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfMTJCOwotCQlkZXYtPm9kcnMgPSBsaXMzXzEyX3JhdGVzOwotCQlkZXYtPm9kcl9tYXNrID0gQ1RSTDFfREYwIHwgQ1RSTDFfREYxOwotCQlkZXYtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV8xMkI7Ci0JCWRldi0+cmVncyA9IGxpczNfd2FpMTJfcmVnczsKLQkJZGV2LT5yZWdzX3NpemUgPSBBUlJBWV9TSVpFKGxpczNfd2FpMTJfcmVncyk7CisJCWxpczMtPnJlYWRfZGF0YSA9IGxpczNsdjAyZF9yZWFkXzEyOworCQlsaXMzLT5tZHBzX21heF92YWwgPSAyMDQ4OworCQlsaXMzLT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzEyQjsKKwkJbGlzMy0+b2RycyA9IGxpczNfMTJfcmF0ZXM7CisJCWxpczMtPm9kcl9tYXNrID0gQ1RSTDFfREYwIHwgQ1RSTDFfREYxOworCQlsaXMzLT5zY2FsZSA9IExJUzNfU0VOU0lUSVZJVFlfMTJCOworCQlsaXMzLT5yZWdzID0gbGlzM193YWkxMl9yZWdzOworCQlsaXMzLT5yZWdzX3NpemUgPSBBUlJBWV9TSVpFKGxpczNfd2FpMTJfcmVncyk7CiAJCWJyZWFrOwogCWNhc2UgV0FJXzhCOgogCQlwcl9pbmZvKCI4IGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKLQkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OwotCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDEyODsKLQkJZGV2LT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzhCOwotCQlkZXYtPm9kcnMgPSBsaXMzXzhfcmF0ZXM7Ci0JCWRldi0+b2RyX21hc2sgPSBDVFJMMV9EUjsKLQkJZGV2LT5zY2FsZSA9IExJUzNfU0VOU0lUSVZJVFlfOEI7Ci0JCWRldi0+cmVncyA9IGxpczNfd2FpOF9yZWdzOwotCQlkZXYtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWk4X3JlZ3MpOworCQlsaXMzLT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OworCQlsaXMzLT5tZHBzX21heF92YWwgPSAxMjg7CisJCWxpczMtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfOEI7CisJCWxpczMtPm9kcnMgPSBsaXMzXzhfcmF0ZXM7CisJCWxpczMtPm9kcl9tYXNrID0gQ1RSTDFfRFI7CisJCWxpczMtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV84QjsKKwkJbGlzMy0+cmVncyA9IGxpczNfd2FpOF9yZWdzOworCQlsaXMzLT5yZWdzX3NpemUgPSBBUlJBWV9TSVpFKGxpczNfd2FpOF9yZWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBXQUlfM0RDOgogCQlwcl9pbmZvKCI4IGJpdHMgM0RDIHNlbnNvciBmb3VuZFxuIik7Ci0JCWRldi0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKLQkJZGV2LT5tZHBzX21heF92YWwgPSAxMjg7Ci0JCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKLQkJZGV2LT5vZHJzID0gbGlzM18zZGNfcmF0ZXM7Ci0JCWRldi0+b2RyX21hc2sgPSBDVFJMMV9PRFIwfENUUkwxX09EUjF8Q1RSTDFfT0RSMnxDVFJMMV9PRFIzOwotCQlkZXYtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV84QjsKKwkJbGlzMy0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKKwkJbGlzMy0+bWRwc19tYXhfdmFsID0gMTI4OworCQlsaXMzLT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzhCOworCQlsaXMzLT5vZHJzID0gbGlzM18zZGNfcmF0ZXM7CisJCWxpczMtPm9kcl9tYXNrID0gQ1RSTDFfT0RSMHxDVFJMMV9PRFIxfENUUkwxX09EUjJ8Q1RSTDFfT0RSMzsKKwkJbGlzMy0+c2NhbGUgPSBMSVMzX1NFTlNJVElWSVRZXzhCOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInVua25vd24gc2Vuc29yIHR5cGUgMHglWFxuIiwgZGV2LT53aG9hbWkpOworCQlwcl9lcnIoInVua25vd24gc2Vuc29yIHR5cGUgMHglWFxuIiwgbGlzMy0+d2hvYW1pKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2LT5yZWdfY2FjaGUgPSBremFsbG9jKG1heChzaXplb2YobGlzM193YWk4X3JlZ3MpLAorCWxpczMtPnJlZ19jYWNoZSA9IGt6YWxsb2MobWF4KHNpemVvZihsaXMzX3dhaThfcmVncyksCiAJCQkJICAgICBzaXplb2YobGlzM193YWkxMl9yZWdzKSksIEdGUF9LRVJORUwpOwogCi0JaWYgKGRldi0+cmVnX2NhY2hlID09IE5VTEwpIHsKKwlpZiAobGlzMy0+cmVnX2NhY2hlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7Ci0JYXRvbWljX3NldCgmZGV2LT53YWtlX3RocmVhZCwgMCk7CisJbXV0ZXhfaW5pdCgmbGlzMy0+bXV0ZXgpOworCWF0b21pY19zZXQoJmxpczMtPndha2VfdGhyZWFkLCAwKTsKIAotCWxpczNsdjAyZF9hZGRfZnMoZGV2KTsKLQlsaXMzbHYwMmRfcG93ZXJvbihkZXYpOwotCi0JaWYgKGRldi0+cG1fZGV2KSB7Ci0JCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYtPnBtX2Rldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKGRldi0+cG1fZGV2KTsKKwlsaXMzbHYwMmRfYWRkX2ZzKGxpczMpOworCWVyciA9IGxpczNsdjAyZF9wb3dlcm9uKGxpczMpOworCWlmIChlcnIpIHsKKwkJbGlzM2x2MDJkX3JlbW92ZV9mcyhsaXMzKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAobGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSgpKQorCWlmIChsaXMzLT5wbV9kZXYpIHsKKwkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGxpczMtPnBtX2Rldik7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGxpczMtPnBtX2Rldik7CisJfQorCisJaWYgKGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUobGlzMykpCiAJCXByX2Vycigiam95c3RpY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAogCS8qIHBhc3NpbmcgaW4gcGxhdGZvcm0gc3BlY2lmaWMgZGF0YSBpcyBwdXJlbHkgb3B0aW9uYWwgYW5kIG9ubHkKIAkgKiB1c2VkIGJ5IHRoZSBTUEkgdHJhbnNwb3J0IGxheWVyIGF0IHRoZSBtb21lbnQgKi8KLQlpZiAoZGV2LT5wZGF0YSkgewotCQlzdHJ1Y3QgbGlzM2x2MDJkX3BsYXRmb3JtX2RhdGEgKnAgPSBkZXYtPnBkYXRhOworCWlmIChsaXMzLT5wZGF0YSkgeworCQlzdHJ1Y3QgbGlzM2x2MDJkX3BsYXRmb3JtX2RhdGEgKnAgPSBsaXMzLT5wZGF0YTsKIAotCQlpZiAoZGV2LT53aG9hbWkgPT0gV0FJXzhCKQotCQkJbGlzM2x2MDJkXzhiX2NvbmZpZ3VyZShkZXYsIHApOworCQlpZiAobGlzMy0+d2hvYW1pID09IFdBSV84QikKKwkJCWxpczNsdjAyZF84Yl9jb25maWd1cmUobGlzMywgcCk7CiAKIAkJaXJxX2ZsYWdzID0gcC0+aXJxX2ZsYWdzMSAmIElSUUZfVFJJR0dFUl9NQVNLOwogCi0JCWRldi0+aXJxX2NmZyA9IHAtPmlycV9jZmc7CisJCWxpczMtPmlycV9jZmcgPSBwLT5pcnFfY2ZnOwogCQlpZiAocC0+aXJxX2NmZykKLQkJCWRldi0+d3JpdGUoZGV2LCBDVFJMX1JFRzMsIHAtPmlycV9jZmcpOworCQkJbGlzMy0+d3JpdGUobGlzMywgQ1RSTF9SRUczLCBwLT5pcnFfY2ZnKTsKIAogCQlpZiAocC0+ZGVmYXVsdF9yYXRlKQotCQkJbGlzM2x2MDJkX3NldF9vZHIocC0+ZGVmYXVsdF9yYXRlKTsKKwkJCWxpczNsdjAyZF9zZXRfb2RyKGxpczMsIHAtPmRlZmF1bHRfcmF0ZSk7CiAJfQogCiAJLyogYmFpbCBpZiB3ZSBkaWQgbm90IGdldCBhbiBJUlEgZnJvbSB0aGUgYnVzIGxheWVyICovCi0JaWYgKCFkZXYtPmlycSkgeworCWlmICghbGlzMy0+aXJxKSB7CiAJCXByX2RlYnVnKCJObyBJUlEuIERpc2FibGluZyAvZGV2L2ZyZWVmYWxsXG4iKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTczLDIzICsxMDIwLDI3IEBACiAJICogaW8tYXBpYyBpcyBub3QgY29uZmlndXJhYmxlIChhbmQgZ2VuZXJhdGVzIGEgd2FybmluZykgYnV0IEkga2VlcCBpdAogCSAqIGluIGNhc2Ugb2Ygc3VwcG9ydCBmb3Igb3RoZXIgaGFyZHdhcmUuCiAJICovCi0JaWYgKGRldi0+cGRhdGEgJiYgZGV2LT53aG9hbWkgPT0gV0FJXzhCKQorCWlmIChsaXMzLT5wZGF0YSAmJiBsaXMzLT53aG9hbWkgPT0gV0FJXzhCKQogCQl0aHJlYWRfZm4gPSBsaXMzMDJkbF9pbnRlcnJ1cHRfdGhyZWFkMV84YjsKIAllbHNlCiAJCXRocmVhZF9mbiA9IE5VTEw7CiAKLQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShkZXYtPmlycSwgbGlzMzAyZGxfaW50ZXJydXB0LAorCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGxpczMtPmlycSwgbGlzMzAyZGxfaW50ZXJydXB0LAogCQkJCXRocmVhZF9mbiwKIAkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9PTkVTSE9UIHwKIAkJCQlpcnFfZmxhZ3MsCi0JCQkJRFJJVkVSX05BTUUsICZsaXMzX2Rldik7CisJCQkJRFJJVkVSX05BTUUsIGxpczMpOwogCiAJaWYgKGVyciA8IDApIHsKIAkJcHJfZXJyKCJDYW5ub3QgZ2V0IElSUVxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChtaXNjX3JlZ2lzdGVyKCZsaXMzbHYwMmRfbWlzY19kZXZpY2UpKQorCWxpczMtPm1pc2NkZXYubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1I7CisJbGlzMy0+bWlzY2Rldi5uYW1lCT0gImZyZWVmYWxsIjsKKwlsaXMzLT5taXNjZGV2LmZvcHMJPSAmbGlzM2x2MDJkX21pc2NfZm9wczsKKworCWlmIChtaXNjX3JlZ2lzdGVyKCZsaXMzLT5taXNjZGV2KSkKIAkJcHJfZXJyKCJtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CiBvdXQ6CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5oIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmQuaAppbmRleCBhMTkzOTU4Li4yYjE0ODJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZC5oCisrKyBiL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAvKgogICogVGhpcyBkcml2ZXIgdHJpZXMgdG8gc3VwcG9ydCB0aGUgImRpZ2l0YWwiIGFjY2VsZXJvbWV0ZXIgY2hpcHMgZnJvbQpAQCAtMjczLDYgKzI3NCw4IEBACiAJc3RydWN0IGZhc3luY19zdHJ1Y3QJKmFzeW5jX3F1ZXVlOyAvKiBxdWV1ZSBmb3IgdGhlIG1pc2MgZGV2aWNlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJbWlzY193YWl0OyAvKiBXYWl0IHF1ZXVlIGZvciB0aGUgbWlzYyBkZXZpY2UgKi8KIAl1bnNpZ25lZCBsb25nCQltaXNjX29wZW5lZDsgLyogYml0MDogd2hldGhlciB0aGUgZGV2aWNlIGlzIG9wZW4gKi8KKwlzdHJ1Y3QgbWlzY2RldmljZQltaXNjZGV2OworCiAJaW50ICAgICAgICAgICAgICAgICAgICAgZGF0YV9yZWFkeV9jb3VudFsyXTsKIAlhdG9taWNfdAkJd2FrZV90aHJlYWQ7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgaXJxX2NmZzsKQEAgLTI4MiwxMCArMjg1LDEwIEBACiB9OwogCiBpbnQgbGlzM2x2MDJkX2luaXRfZGV2aWNlKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpOwotaW50IGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUodm9pZCk7Ci12b2lkIGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKHZvaWQpOworaW50IGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUoc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7Cit2b2lkIGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpOwogdm9pZCBsaXMzbHYwMmRfcG93ZXJvZmYoc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7Ci12b2lkIGxpczNsdjAyZF9wb3dlcm9uKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpOworaW50IGxpczNsdjAyZF9wb3dlcm9uKHN0cnVjdCBsaXMzbHYwMmQgKmxpczMpOwogaW50IGxpczNsdjAyZF9yZW1vdmVfZnMoc3RydWN0IGxpczNsdjAyZCAqbGlzMyk7CiAKIGV4dGVybiBzdHJ1Y3QgbGlzM2x2MDJkIGxpczNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfaTJjLmMgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYwppbmRleCBiMjBkZmI0Li5jMDJmZWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYworKysgYi9kcml2ZXJzL21pc2MvbGlzM2x2MDJkL2xpczNsdjAyZF9pMmMuYwpAQCAtNzksOCArNzksNyBAQAogCXU4IHJlZzsKIAlpbnQgcmV0OwogCi0JaWYgKGxpczMtPnJlZ19jdHJsKQotCQlsaXMzX3JlZ19jdHJsKGxpczMsIExJUzNfUkVHX09OKTsKKwlsaXMzX3JlZ19jdHJsKGxpczMsIExJUzNfUkVHX09OKTsKIAogCWxpczMtPnJlYWQobGlzMywgV0hPX0FNX0ksICZyZWcpOwogCWlmIChyZWcgIT0gbGlzMy0+d2hvYW1pKQpAQCAtMTA2LDEwICsxMDUsNiBAQAogCXN0cnVjdCBsaXMzbHYwMmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAJaWYgKHBkYXRhKSB7Ci0JCS8qIFJlZ3VsYXRvciBjb250cm9sIGlzIG9wdGlvbmFsICovCi0JCWlmIChwZGF0YS0+ZHJpdmVyX2ZlYXR1cmVzICYgTElTM19VU0VfUkVHVUxBVE9SX0NUUkwpCi0JCQlsaXMzX2Rldi5yZWdfY3RybCA9IGxpczNfcmVnX2N0cmw7Ci0KIAkJaWYgKChwZGF0YS0+ZHJpdmVyX2ZlYXR1cmVzICYgTElTM19VU0VfQkxPQ0tfUkVBRCkgJiYKIAkJCShpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCiAJCQkJCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0spKSkKQEAgLTEzMSwxNSArMTI2LDEzIEBACiAJCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKGxpczNfZGV2LnJlZ19jdHJsKSB7Ci0JCWxpczNfZGV2LnJlZ3VsYXRvcnNbMF0uc3VwcGx5ID0gcmVnX3ZkZDsKLQkJbGlzM19kZXYucmVndWxhdG9yc1sxXS5zdXBwbHkgPSByZWdfdmRkX2lvOwotCQlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJmNsaWVudC0+ZGV2LAotCQkJCQlBUlJBWV9TSVpFKGxpczNfZGV2LnJlZ3VsYXRvcnMpLAotCQkJCQlsaXMzX2Rldi5yZWd1bGF0b3JzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JfQorCWxpczNfZGV2LnJlZ3VsYXRvcnNbMF0uc3VwcGx5ID0gcmVnX3ZkZDsKKwlsaXMzX2Rldi5yZWd1bGF0b3JzWzFdLnN1cHBseSA9IHJlZ192ZGRfaW87CisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZjbGllbnQtPmRldiwKKwkJCQkgQVJSQVlfU0laRShsaXMzX2Rldi5yZWd1bGF0b3JzKSwKKwkJCQkgbGlzM19kZXYucmVndWxhdG9ycyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKIAogCWxpczNfZGV2LnBkYXRhCSAgPSBwZGF0YTsKIAlsaXMzX2Rldi5idXNfcHJpdiA9IGNsaWVudDsKQEAgLTE1MywxNiArMTQ2LDE5IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgJmxpczNfZGV2KTsKIAogCS8qIFByb3ZpZGUgcG93ZXIgb3ZlciB0aGUgaW5pdCBjYWxsICovCi0JaWYgKGxpczNfZGV2LnJlZ19jdHJsKQotCQlsaXMzX3JlZ19jdHJsKCZsaXMzX2RldiwgTElTM19SRUdfT04pOworCWxpczNfcmVnX2N0cmwoJmxpczNfZGV2LCBMSVMzX1JFR19PTik7CiAKIAlyZXQgPSBsaXMzbHYwMmRfaW5pdF9kZXZpY2UoJmxpczNfZGV2KTsKIAotCWlmIChsaXMzX2Rldi5yZWdfY3RybCkKLQkJbGlzM19yZWdfY3RybCgmbGlzM19kZXYsIExJUzNfUkVHX09GRik7CisJbGlzM19yZWdfY3RybCgmbGlzM19kZXYsIExJUzNfUkVHX09GRik7CiAKLQlpZiAocmV0ID09IDApCi0JCXJldHVybiAwOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDI7CisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShsaXMzX2Rldi5yZWd1bGF0b3JzKSwKKwkJCQlsaXMzX2Rldi5yZWd1bGF0b3JzKTsKIGZhaWw6CiAJaWYgKHBkYXRhICYmIHBkYXRhLT5yZWxlYXNlX3Jlc291cmNlcykKIAkJcGRhdGEtPnJlbGVhc2VfcmVzb3VyY2VzKCk7CkBAIC0xNzcsMTIgKzE3MywxMSBAQAogCWlmIChwZGF0YSAmJiBwZGF0YS0+cmVsZWFzZV9yZXNvdXJjZXMpCiAJCXBkYXRhLT5yZWxlYXNlX3Jlc291cmNlcygpOwogCi0JbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoKTsKKwlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZShsaXMzKTsKIAlsaXMzbHYwMmRfcmVtb3ZlX2ZzKCZsaXMzX2Rldik7CiAKLQlpZiAobGlzM19kZXYucmVnX2N0cmwpCi0JCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShsaXMzLT5yZWd1bGF0b3JzKSwKLQkJCQlsaXMzX2Rldi5yZWd1bGF0b3JzKTsKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUobGlzMy0+cmVndWxhdG9ycyksCisJCQkgICAgbGlzM19kZXYucmVndWxhdG9ycyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9saXMzbHYwMmQvbGlzM2x2MDJkX3NwaS5jIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKaW5kZXggYzFmOGE4Zi4uYjJjMWJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKKysrIGIvZHJpdmVycy9taXNjL2xpczNsdjAyZC9saXMzbHYwMmRfc3BpLmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGxpczMwMmRsX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbGlzM2x2MDJkICpsaXMzID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0JbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoKTsKKwlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZShsaXMzKTsKIAlsaXMzbHYwMmRfcG93ZXJvZmYobGlzMyk7CiAKIAlyZXR1cm4gbGlzM2x2MDJkX3JlbW92ZV9mcygmbGlzM19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1a3NlcnZpY2VzLmMgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVrc2VydmljZXMuYwppbmRleCA5ZTliZGRhYTkuLjkxM2RlMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydWtzZXJ2aWNlcy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KICNpbmNsdWRlICJncnUuaCIKICNpbmNsdWRlICJncnVsaWIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYyBiL2RyaXZlcnMvbWlzYy90aS1zdC9zdF9raW0uYwppbmRleCAzYTM1ODA1Li40M2VmOGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGktc3Qvc3Rfa2ltLmMKKysrIGIvZHJpdmVycy9taXNjL3RpLXN0L3N0X2tpbS5jCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90aV93aWxpbmtfc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAjZGVmaW5lIE1BWF9TVF9ERVZJQ0VTCTMJLyogSW1hZ2luZSAxIG9uIGVhY2ggVUFSVCBmb3Igbm93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKaW5kZXggYTZlZjE4Mi4uYmEyNDc5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdGlmbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgInRpZm1fN3h4MSIKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuOCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwppbmRleCA0NGQ0NDc1Li4wYmQ1MzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidGlmbV9jb3JlIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC44IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Ztd19iYWxsb29uLmMgYi9kcml2ZXJzL21pc2Mvdm13X2JhbGxvb24uYwppbmRleCAwNTNkMzZjLi5jZDQxZDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvdm13X2JhbGxvb24uYworKysgYi9kcml2ZXJzL21pc2Mvdm13X2JhbGxvb24uYwpAQCAtMTUxLDcgKzE1MSw3IEBACiBzdHJ1Y3Qgdm1iYWxsb29uX3N0YXRzIHsKIAl1bnNpZ25lZCBpbnQgdGltZXI7CiAKLQkvKiBhbGxvY2F0aW9uIHN0YXR1c3RpY3MgKi8KKwkvKiBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgKi8KIAl1bnNpZ25lZCBpbnQgYWxsb2M7CiAJdW5zaWduZWQgaW50IGFsbG9jX2ZhaWw7CiAJdW5zaWduZWQgaW50IHNsZWVwX2FsbG9jOwpAQCAtNDEyLDYgKzQxMiw3IEBACiAJZ2ZwX3QgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGh2X3N0YXR1czsKIAlib29sIGxvY2tlZCA9IGZhbHNlOworCWZsYWdzID0gY2FuX3NsZWVwID8gVk1XX1BBR0VfQUxMT0NfQ0FOU0xFRVAgOiBWTVdfUEFHRV9BTExPQ19OT1NMRUVQOwogCiAJZG8gewogCQlpZiAoIWNhbl9zbGVlcCkKQEAgLTQxOSw3ICs0MjAsNiBAQAogCQllbHNlCiAJCQlTVEFUU19JTkMoYi0+c3RhdHMuc2xlZXBfYWxsb2MpOwogCi0JCWZsYWdzID0gY2FuX3NsZWVwID8gVk1XX1BBR0VfQUxMT0NfQ0FOU0xFRVAgOiBWTVdfUEFHRV9BTExPQ19OT1NMRUVQOwogCQlwYWdlID0gYWxsb2NfcGFnZShmbGFncyk7CiAJCWlmICghcGFnZSkgewogCQkJaWYgKCFjYW5fc2xlZXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKaW5kZXggNGMxYTY0OC4uYTFjYjIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwpAQCAtOTQsNiArOTQsMTEgQEAKIAl1bnNpZ25lZCBpbnQJcmVhZF9vbmx5OwogCXVuc2lnbmVkIGludAlwYXJ0X3R5cGU7CiAJdW5zaWduZWQgaW50CW5hbWVfaWR4OworCXVuc2lnbmVkIGludAlyZXNldF9kb25lOworI2RlZmluZSBNTUNfQkxLX1JFQUQJCUJJVCgwKQorI2RlZmluZSBNTUNfQkxLX1dSSVRFCQlCSVQoMSkKKyNkZWZpbmUgTU1DX0JMS19ESVNDQVJECQlCSVQoMikKKyNkZWZpbmUgTU1DX0JMS19TRUNESVNDQVJECUJJVCgzKQogCiAJLyoKIAkgKiBPbmx5IHNldCBpbiBtYWluIG1tY19ibGtfZGF0YSBhc3NvY2lhdGVkCkBAIC0xMDksMTEgKzExNCwxMSBAQAogZW51bSBtbWNfYmxrX3N0YXR1cyB7CiAJTU1DX0JMS19TVUNDRVNTID0gMCwKIAlNTUNfQkxLX1BBUlRJQUwsCi0JTU1DX0JMS19SRVRSWSwKLQlNTUNfQkxLX1JFVFJZX1NJTkdMRSwKLQlNTUNfQkxLX0RBVEFfRVJSLAogCU1NQ19CTEtfQ01EX0VSUiwKKwlNTUNfQkxLX1JFVFJZLAogCU1NQ19CTEtfQUJPUlQsCisJTU1DX0JMS19EQVRBX0VSUiwKKwlNTUNfQkxLX0VDQ19FUlIsCiB9OwogCiBtb2R1bGVfcGFyYW0ocGVyZGV2X21pbm9ycywgaW50LCAwNDQ0KTsKQEAgLTI5MSw3ICsyOTYsNyBAQAogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJaW50IGVycjsKIApAQCAtNDQyLDE5ICs0NDcsMjQgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1haW5fbWQgPSBtbWNfZ2V0X2RydmRhdGEoY2FyZCk7CisKIAlpZiAobWFpbl9tZC0+cGFydF9jdXJyID09IG1kLT5wYXJ0X3R5cGUpCiAJCXJldHVybiAwOwogCiAJaWYgKG1tY19jYXJkX21tYyhjYXJkKSkgewotCQljYXJkLT5leHRfY3NkLnBhcnRfY29uZmlnICY9IH5FWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19NQVNLOwotCQljYXJkLT5leHRfY3NkLnBhcnRfY29uZmlnIHw9IG1kLT5wYXJ0X3R5cGU7CisJCXU4IHBhcnRfY29uZmlnID0gY2FyZC0+ZXh0X2NzZC5wYXJ0X2NvbmZpZzsKKworCQlwYXJ0X2NvbmZpZyAmPSB+RVhUX0NTRF9QQVJUX0NPTkZJR19BQ0NfTUFTSzsKKwkJcGFydF9jb25maWcgfD0gbWQtPnBhcnRfdHlwZTsKIAogCQlyZXQgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCi0JCQkJIEVYVF9DU0RfUEFSVF9DT05GSUcsIGNhcmQtPmV4dF9jc2QucGFydF9jb25maWcsCisJCQkJIEVYVF9DU0RfUEFSVF9DT05GSUcsIHBhcnRfY29uZmlnLAogCQkJCSBjYXJkLT5leHRfY3NkLnBhcnRfdGltZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotfQorCisJCWNhcmQtPmV4dF9jc2QucGFydF9jb25maWcgPSBwYXJ0X2NvbmZpZzsKKwl9CiAKIAltYWluX21kLT5wYXJ0X2N1cnIgPSBtZC0+cGFydF90eXBlOwogCXJldHVybiAwOwpAQCAtNDY2LDcgKzQ3Niw3IEBACiAJdTMyIHJlc3VsdDsKIAlfX2JlMzIgKmJsb2NrczsKIAotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXVuc2lnbmVkIGludCB0aW1lb3V0X3VzOwpAQCAtNjE2LDcgKzYyNiw3IEBACiAgKiBPdGhlcndpc2Ugd2UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGhhcHBlbmVkLCBzbyBhYm9ydC4KICAqLwogc3RhdGljIGludCBtbWNfYmxrX2NtZF9yZWNvdmVyeShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHN0cnVjdCByZXF1ZXN0ICpyZXEsCi0Jc3RydWN0IG1tY19ibGtfcmVxdWVzdCAqYnJxKQorCXN0cnVjdCBtbWNfYmxrX3JlcXVlc3QgKmJycSwgaW50ICplY2NfZXJyKQogewogCWJvb2wgcHJldl9jbWRfc3RhdHVzX3ZhbGlkID0gdHJ1ZTsKIAl1MzIgc3RhdHVzLCBzdG9wX3N0YXR1cyA9IDA7CkBAIC02NDEsNiArNjUxLDEyIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIEVSUl9BQk9SVDsKIAorCS8qIEZsYWcgRUNDIGVycm9ycyAqLworCWlmICgoc3RhdHVzICYgUjFfQ0FSRF9FQ0NfRkFJTEVEKSB8fAorCSAgICAoYnJxLT5zdG9wLnJlc3BbMF0gJiBSMV9DQVJEX0VDQ19GQUlMRUQpIHx8CisJICAgIChicnEtPmNtZC5yZXNwWzBdICYgUjFfQ0FSRF9FQ0NfRkFJTEVEKSkKKwkJKmVjY19lcnIgPSAxOworCiAJLyoKIAkgKiBDaGVjayB0aGUgY3VycmVudCBjYXJkIHN0YXRlLiAgSWYgaXQgaXMgaW4gc29tZSBkYXRhIHRyYW5zZmVyCiAJICogbW9kZSwgdGVsbCBpdCB0byBzdG9wIChhbmQgaG9wZWZ1bGx5IHRyYW5zaXRpb24gYmFjayB0byBUUkFOLikKQEAgLTY1OCw2ICs2NzQsOCBAQAogCQkgKi8KIAkJaWYgKGVycikKIAkJCXJldHVybiBFUlJfQUJPUlQ7CisJCWlmIChzdG9wX3N0YXR1cyAmIFIxX0NBUkRfRUNDX0ZBSUxFRCkKKwkJCSplY2NfZXJyID0gMTsKIAl9CiAKIAkvKiBDaGVjayBmb3Igc2V0IGJsb2NrIGNvdW50IGVycm9ycyAqLwpAQCAtNjcwLDYgKzY4OCwxMCBAQAogCQlyZXR1cm4gbW1jX2Jsa19jbWRfZXJyb3IocmVxLCAici93IGNtZCIsIGJycS0+Y21kLmVycm9yLAogCQkJCXByZXZfY21kX3N0YXR1c192YWxpZCwgc3RhdHVzKTsKIAorCS8qIERhdGEgZXJyb3JzICovCisJaWYgKCFicnEtPnN0b3AuZXJyb3IpCisJCXJldHVybiBFUlJfQ09OVElOVUU7CisKIAkvKiBOb3cgZm9yIHN0b3AgZXJyb3JzLiAgVGhlc2UgYXJlbid0IGZhdGFsIHRvIHRoZSB0cmFuc2Zlci4gKi8KIAlwcl9lcnIoIiVzOiBlcnJvciAlZCBzZW5kaW5nIHN0b3AgY29tbWFuZCwgb3JpZ2luYWwgY21kIHJlc3BvbnNlICUjeCwgY2FyZCBzdGF0dXMgJSN4XG4iLAogCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgYnJxLT5zdG9wLmVycm9yLApAQCAtNjg2LDEyICs3MDgsNDUgQEAKIAlyZXR1cm4gRVJSX0NPTlRJTlVFOwogfQogCitzdGF0aWMgaW50IG1tY19ibGtfcmVzZXQoc3RydWN0IG1tY19ibGtfZGF0YSAqbWQsIHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwKKwkJCSBpbnQgdHlwZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKG1kLT5yZXNldF9kb25lICYgdHlwZSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwltZC0+cmVzZXRfZG9uZSB8PSB0eXBlOworCWVyciA9IG1tY19od19yZXNldChob3N0KTsKKwkvKiBFbnN1cmUgd2Ugc3dpdGNoIGJhY2sgdG8gdGhlIGNvcnJlY3QgcGFydGl0aW9uICovCisJaWYgKGVyciAhPSAtRU9QTk9UU1VQUCkgeworCQlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptYWluX21kID0gbW1jX2dldF9kcnZkYXRhKGhvc3QtPmNhcmQpOworCQlpbnQgcGFydF9lcnI7CisKKwkJbWFpbl9tZC0+cGFydF9jdXJyID0gbWFpbl9tZC0+cGFydF90eXBlOworCQlwYXJ0X2VyciA9IG1tY19ibGtfcGFydF9zd2l0Y2goaG9zdC0+Y2FyZCwgbWQpOworCQlpZiAocGFydF9lcnIpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGZhaWxlZCB0byBnZXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0CisJCQkgKiBwYXJ0aXRpb24sIHNvIHdlIG5lZWQgdG8gYWJvcnQgdGhlIHdob2xlIHJlcXVlc3QuCisJCQkgKi8KKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfYmxrX3Jlc2V0X3N1Y2Nlc3Moc3RydWN0IG1tY19ibGtfZGF0YSAqbWQsIGludCB0eXBlKQoreworCW1kLT5yZXNldF9kb25lICY9IH50eXBlOworfQorCiBzdGF0aWMgaW50IG1tY19ibGtfaXNzdWVfZGlzY2FyZF9ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOwogCXVuc2lnbmVkIGludCBmcm9tLCBuciwgYXJnOwotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAwLCB0eXBlID0gTU1DX0JMS19ESVNDQVJEOwogCiAJaWYgKCFtbWNfY2FuX2VyYXNlKGNhcmQpKSB7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwpAQCAtNzAxLDExICs3NTYsMTMgQEAKIAlmcm9tID0gYmxrX3JxX3BvcyhyZXEpOwogCW5yID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKIAotCWlmIChtbWNfY2FuX3RyaW0oY2FyZCkpCisJaWYgKG1tY19jYW5fZGlzY2FyZChjYXJkKSkKKwkJYXJnID0gTU1DX0RJU0NBUkRfQVJHOworCWVsc2UgaWYgKG1tY19jYW5fdHJpbShjYXJkKSkKIAkJYXJnID0gTU1DX1RSSU1fQVJHOwogCWVsc2UKIAkJYXJnID0gTU1DX0VSQVNFX0FSRzsKLQorcmV0cnk6CiAJaWYgKGNhcmQtPnF1aXJrcyAmIE1NQ19RVUlSS19JTkFORF9DTUQzOCkgewogCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCiAJCQkJIElOQU5EX0NNRDM4X0FSR19FWFRfQ1NELApAQCAtNzE4LDYgKzc3NSwxMCBAQAogCX0KIAllcnIgPSBtbWNfZXJhc2UoY2FyZCwgZnJvbSwgbnIsIGFyZyk7CiBvdXQ6CisJaWYgKGVyciA9PSAtRUlPICYmICFtbWNfYmxrX3Jlc2V0KG1kLCBjYXJkLT5ob3N0LCB0eXBlKSkKKwkJZ290byByZXRyeTsKKwlpZiAoIWVycikKKwkJbW1jX2Jsa19yZXNldF9zdWNjZXNzKG1kLCB0eXBlKTsKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CiAJX19ibGtfZW5kX3JlcXVlc3QocmVxLCBlcnIsIGJsa19ycV9ieXRlcyhyZXEpKTsKIAlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKQEAgLTczMSwxMyArNzkyLDIwIEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKIAl1bnNpZ25lZCBpbnQgZnJvbSwgbnIsIGFyZzsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMCwgdHlwZSA9IE1NQ19CTEtfU0VDRElTQ0FSRDsKIAotCWlmICghbW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSkgeworCWlmICghKG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkgfHwgbW1jX2Nhbl9zYW5pdGl6ZShjYXJkKSkpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0OwogCX0KIAorCS8qIFRoZSBzYW5pdGl6ZSBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIGF0IHY0LjUgb25seSAqLworCWlmIChtbWNfY2FuX3Nhbml0aXplKGNhcmQpKSB7CisJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQlFWFRfQ1NEX1NBTklUSVpFX1NUQVJULCAxLCAwKTsKKwkJZ290byBvdXQ7CisJfQorCiAJZnJvbSA9IGJsa19ycV9wb3MocmVxKTsKIAluciA9IGJsa19ycV9zZWN0b3JzKHJlcSk7CiAKQEAgLTc0NSw3ICs4MTMsNyBAQAogCQlhcmcgPSBNTUNfU0VDVVJFX1RSSU0xX0FSRzsKIAllbHNlCiAJCWFyZyA9IE1NQ19TRUNVUkVfRVJBU0VfQVJHOwotCityZXRyeToKIAlpZiAoY2FyZC0+cXVpcmtzICYgTU1DX1FVSVJLX0lOQU5EX0NNRDM4KSB7CiAJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKIAkJCQkgSU5BTkRfQ01EMzhfQVJHX0VYVF9DU0QsCkBAIC03NjksNiArODM3LDEwIEBACiAJCWVyciA9IG1tY19lcmFzZShjYXJkLCBmcm9tLCBuciwgTU1DX1NFQ1VSRV9UUklNMl9BUkcpOwogCX0KIG91dDoKKwlpZiAoZXJyID09IC1FSU8gJiYgIW1tY19ibGtfcmVzZXQobWQsIGNhcmQtPmhvc3QsIHR5cGUpKQorCQlnb3RvIHJldHJ5OworCWlmICghZXJyKQorCQltbWNfYmxrX3Jlc2V0X3N1Y2Nlc3MobWQsIHR5cGUpOwogCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKIAlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVyciwgYmxrX3JxX2J5dGVzKHJlcSkpOwogCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwpAQCAtNzc5LDE2ICs4NTEsMTggQEAKIHN0YXRpYyBpbnQgbW1jX2Jsa19pc3N1ZV9mbHVzaChzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOworCWludCByZXQgPSAwOwogCi0JLyoKLQkgKiBOby1vcCwgb25seSBzZXJ2aWNlIHRoaXMgYmVjYXVzZSB3ZSBuZWVkIFJFUV9GVUEgZm9yIHJlbGlhYmxlCi0JICogd3JpdGVzLgotCSAqLworCXJldCA9IG1tY19mbHVzaF9jYWNoZShjYXJkKTsKKwlpZiAocmV0KQorCQlyZXQgPSAtRUlPOworCiAJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwotCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIDApOworCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIHJldCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gcmV0ID8gMCA6IDE7CiB9CiAKIC8qCkBAIC04MjUsMTEgKzg5OSwxMSBAQAogc3RhdGljIGludCBtbWNfYmxrX2Vycl9jaGVjayhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCiAJCQkgICAgIHN0cnVjdCBtbWNfYXN5bmNfcmVxICphcmVxKQogewotCWVudW0gbW1jX2Jsa19zdGF0dXMgcmV0ID0gTU1DX0JMS19TVUNDRVNTOwogCXN0cnVjdCBtbWNfcXVldWVfcmVxICptcV9tcnEgPSBjb250YWluZXJfb2YoYXJlcSwgc3RydWN0IG1tY19xdWV1ZV9yZXEsCiAJCQkJCQkgICAgbW1jX2FjdGl2ZSk7CiAJc3RydWN0IG1tY19ibGtfcmVxdWVzdCAqYnJxID0gJm1xX21ycS0+YnJxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBtcV9tcnEtPnJlcTsKKwlpbnQgZWNjX2VyciA9IDA7CiAKIAkvKgogCSAqIHNiYy5lcnJvciBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggdGhlIHNldCBibG9jayBjb3VudApAQCAtODQxLDggKzkxNSw5IEBACiAJICogc3RvcC5lcnJvciBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggdGhlIHN0b3AgY29tbWFuZC4gIERhdGEKIAkgKiBtYXkgaGF2ZSBiZWVuIHRyYW5zZmVycmVkLCBvciBtYXkgc3RpbGwgYmUgdHJhbnNmZXJyaW5nLgogCSAqLwotCWlmIChicnEtPnNiYy5lcnJvciB8fCBicnEtPmNtZC5lcnJvciB8fCBicnEtPnN0b3AuZXJyb3IpIHsKLQkJc3dpdGNoIChtbWNfYmxrX2NtZF9yZWNvdmVyeShjYXJkLCByZXEsIGJycSkpIHsKKwlpZiAoYnJxLT5zYmMuZXJyb3IgfHwgYnJxLT5jbWQuZXJyb3IgfHwgYnJxLT5zdG9wLmVycm9yIHx8CisJICAgIGJycS0+ZGF0YS5lcnJvcikgeworCQlzd2l0Y2ggKG1tY19ibGtfY21kX3JlY292ZXJ5KGNhcmQsIHJlcSwgYnJxLCAmZWNjX2VycikpIHsKIAkJY2FzZSBFUlJfUkVUUlk6CiAJCQlyZXR1cm4gTU1DX0JMS19SRVRSWTsKIAkJY2FzZSBFUlJfQUJPUlQ6CkBAIC04NzMsNyArOTQ4LDcgQEAKIAkJZG8gewogCQkJaW50IGVyciA9IGdldF9jYXJkX3N0YXR1cyhjYXJkLCAmc3RhdHVzLCA1KTsKIAkJCWlmIChlcnIpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZXF1ZXN0aW5nIHN0YXR1c1xuIiwKKwkJCQlwcl9lcnIoIiVzOiBlcnJvciAlZCByZXF1ZXN0aW5nIHN0YXR1c1xuIiwKIAkJCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVycik7CiAJCQkJcmV0dXJuIE1NQ19CTEtfQ01EX0VSUjsKIAkJCX0KQEAgLTg5NCwyMyArOTY5LDIxIEBACiAJCSAgICAgICBicnEtPmNtZC5yZXNwWzBdLCBicnEtPnN0b3AucmVzcFswXSk7CiAKIAkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgewotCQkJaWYgKGJycS0+ZGF0YS5ibG9ja3MgPiAxKSB7Ci0JCQkJLyogUmVkbyByZWFkIG9uZSBzZWN0b3IgYXQgYSB0aW1lICovCi0JCQkJcHJfd2FybmluZygiJXM6IHJldHJ5aW5nIHVzaW5nIHNpbmdsZSBibG9jayByZWFkXG4iLAotCQkJCQkgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSk7Ci0JCQkJcmV0dXJuIE1NQ19CTEtfUkVUUllfU0lOR0xFOwotCQkJfQorCQkJaWYgKGVjY19lcnIpCisJCQkJcmV0dXJuIE1NQ19CTEtfRUNDX0VSUjsKIAkJCXJldHVybiBNTUNfQkxLX0RBVEFfRVJSOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIE1NQ19CTEtfQ01EX0VSUjsKIAkJfQogCX0KIAotCWlmIChyZXQgPT0gTU1DX0JMS19TVUNDRVNTICYmCi0JICAgIGJsa19ycV9ieXRlcyhyZXEpICE9IGJycS0+ZGF0YS5ieXRlc194ZmVyZWQpCi0JCXJldCA9IE1NQ19CTEtfUEFSVElBTDsKKwlpZiAoIWJycS0+ZGF0YS5ieXRlc194ZmVyZWQpCisJCXJldHVybiBNTUNfQkxLX1JFVFJZOwogCi0JcmV0dXJuIHJldDsKKwlpZiAoYmxrX3JxX2J5dGVzKHJlcSkgIT0gYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCkKKwkJcmV0dXJuIE1NQ19CTEtfUEFSVElBTDsKKworCXJldHVybiBNTUNfQkxLX1NVQ0NFU1M7CiB9CiAKIHN0YXRpYyB2b2lkIG1tY19ibGtfcndfcnFfcHJlcChzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSAqbXFycSwKQEAgLTk1NywxMyArMTAzMCwyMCBAQAogCWlmIChicnEtPmRhdGEuYmxvY2tzID4gY2FyZC0+aG9zdC0+bWF4X2Jsa19jb3VudCkKIAkJYnJxLT5kYXRhLmJsb2NrcyA9IGNhcmQtPmhvc3QtPm1heF9ibGtfY291bnQ7CiAKLQkvKgotCSAqIEFmdGVyIGEgcmVhZCBlcnJvciwgd2UgcmVkbyB0aGUgcmVxdWVzdCBvbmUgc2VjdG9yIGF0IGEgdGltZQotCSAqIGluIG9yZGVyIHRvIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHdoaWNoIHNlY3RvcnMgY2FuIGJlIHJlYWQKLQkgKiBzdWNjZXNzZnVsbHkuCi0JICovCi0JaWYgKGRpc2FibGVfbXVsdGkgJiYgYnJxLT5kYXRhLmJsb2NrcyA+IDEpCi0JCWJycS0+ZGF0YS5ibG9ja3MgPSAxOworCWlmIChicnEtPmRhdGEuYmxvY2tzID4gMSkgeworCQkvKgorCQkgKiBBZnRlciBhIHJlYWQgZXJyb3IsIHdlIHJlZG8gdGhlIHJlcXVlc3Qgb25lIHNlY3RvcgorCQkgKiBhdCBhIHRpbWUgaW4gb3JkZXIgdG8gYWNjdXJhdGVseSBkZXRlcm1pbmUgd2hpY2gKKwkJICogc2VjdG9ycyBjYW4gYmUgcmVhZCBzdWNjZXNzZnVsbHkuCisJCSAqLworCQlpZiAoZGlzYWJsZV9tdWx0aSkKKwkJCWJycS0+ZGF0YS5ibG9ja3MgPSAxOworCisJCS8qIFNvbWUgY29udHJvbGxlcnMgY2FuJ3QgZG8gbXVsdGlibG9jayByZWFkcyBkdWUgdG8gaHcgYnVncyAqLworCQlpZiAoY2FyZC0+aG9zdC0+Y2FwczIgJiBNTUNfQ0FQMl9OT19NVUxUSV9SRUFEICYmCisJCSAgICBycV9kYXRhX2RpcihyZXEpID09IFJFQUQpCisJCQlicnEtPmRhdGEuYmxvY2tzID0gMTsKKwl9CiAKIAlpZiAoYnJxLT5kYXRhLmJsb2NrcyA+IDEgfHwgZG9fcmVsX3dyKSB7CiAJCS8qIFNQSSBtdWx0aWJsb2NrIHdyaXRlcyB0ZXJtaW5hdGUgdXNpbmcgYSBzcGVjaWFsCkBAIC0xMDQ5LDEyICsxMTI5LDQxIEBACiAJbW1jX3F1ZXVlX2JvdW5jZV9wcmUobXFycSk7CiB9CiAKK3N0YXRpYyBpbnQgbW1jX2Jsa19jbWRfZXJyKHN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kLCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCQkgICBzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0ICpicnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsCisJCQkgICBpbnQgcmV0KQoreworCS8qCisJICogSWYgdGhpcyBpcyBhbiBTRCBjYXJkIGFuZCB3ZSdyZSB3cml0aW5nLCB3ZSBjYW4gZmlyc3QKKwkgKiBtYXJrIHRoZSBrbm93biBnb29kIHNlY3RvcnMgYXMgb2suCisJICoKKwkgKiBJZiB0aGUgY2FyZCBpcyBub3QgU0QsIHdlIGNhbiBzdGlsbCBvayB3cml0dGVuIHNlY3RvcnMKKwkgKiBhcyByZXBvcnRlZCBieSB0aGUgY29udHJvbGxlciAod2hpY2ggbWlnaHQgYmUgbGVzcyB0aGFuCisJICogdGhlIHJlYWwgbnVtYmVyIG9mIHdyaXR0ZW4gc2VjdG9ycywgYnV0IG5ldmVyIG1vcmUpLgorCSAqLworCWlmIChtbWNfY2FyZF9zZChjYXJkKSkgeworCQl1MzIgYmxvY2tzOworCisJCWJsb2NrcyA9IG1tY19zZF9udW1fd3JfYmxvY2tzKGNhcmQpOworCQlpZiAoYmxvY2tzICE9ICh1MzIpLTEpIHsKKwkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgYmxvY2tzIDw8IDkpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7CisJCX0KKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CisJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1tY19ibGtfaXNzdWVfcndfcnEoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCByZXF1ZXN0ICpycWMpCiB7CiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKIAlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0ICpicnEgPSAmbXEtPm1xcnFfY3VyLT5icnE7Ci0JaW50IHJldCA9IDEsIGRpc2FibGVfbXVsdGkgPSAwLCByZXRyeSA9IDA7CisJaW50IHJldCA9IDEsIGRpc2FibGVfbXVsdGkgPSAwLCByZXRyeSA9IDAsIHR5cGU7CiAJZW51bSBtbWNfYmxrX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IG1tY19xdWV1ZV9yZXEgKm1xX3JxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CkBAIC0xMDc2LDYgKzExODUsNyBAQAogCQltcV9ycSA9IGNvbnRhaW5lcl9vZihhcmVxLCBzdHJ1Y3QgbW1jX3F1ZXVlX3JlcSwgbW1jX2FjdGl2ZSk7CiAJCWJycSA9ICZtcV9ycS0+YnJxOwogCQlyZXEgPSBtcV9ycS0+cmVxOworCQl0eXBlID0gcnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEID8gTU1DX0JMS19SRUFEIDogTU1DX0JMS19XUklURTsKIAkJbW1jX3F1ZXVlX2JvdW5jZV9wb3N0KG1xX3JxKTsKIAogCQlzd2l0Y2ggKHN0YXR1cykgewpAQCAtMTA4NCwxOCArMTE5NCwxOCBAQAogCQkJLyoKIAkJCSAqIEEgYmxvY2sgd2FzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZC4KIAkJCSAqLworCQkJbW1jX2Jsa19yZXNldF9zdWNjZXNzKG1kLCB0eXBlKTsKIAkJCXNwaW5fbG9ja19pcnEoJm1kLT5sb2NrKTsKIAkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwKIAkJCQkJCWJycS0+ZGF0YS5ieXRlc194ZmVyZWQpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZtZC0+bG9jayk7CisJCQkvKgorCQkJICogSWYgdGhlIGJsa19lbmRfcmVxdWVzdCBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGV2ZW4KKwkJCSAqIHRob3VnaCBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBhbmQgbm8gZXJyb3JzCisJCQkgKiB3ZXJlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbnRyb2xsZXIsIGl0J3MgYSBidWcuCisJCQkgKi8KIAkJCWlmIChzdGF0dXMgPT0gTU1DX0JMS19TVUNDRVNTICYmIHJldCkgewotCQkJCS8qCi0JCQkJICogVGhlIGJsa19lbmRfcmVxdWVzdCBoYXMgcmV0dXJuZWQgbm9uIHplcm8KLQkJCQkgKiBldmVuIHRob3VnaCBhbGwgZGF0YSBpcyB0cmFuc2ZlcmVkIGFuZCBubwotCQkJCSAqIGVycm9zIHJldHVybmVkIGJ5IGhvc3QuCi0JCQkJICogSWYgdGhpcyBoYXBwZW4gaXQncyBhIGJ1Zy4KLQkJCQkgKi8KLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIEJVRyBycV90b3QgJWQgZF94ZmVyICVkXG4iLAorCQkJCXByX2VycigiJXMgQlVHIHJxX3RvdCAlZCBkX3hmZXIgJWRcbiIsCiAJCQkJICAgICAgIF9fZnVuY19fLCBibGtfcnFfYnl0ZXMocmVxKSwKIAkJCQkgICAgICAgYnJxLT5kYXRhLmJ5dGVzX3hmZXJlZCk7CiAJCQkJcnFjID0gTlVMTDsKQEAgLTExMDMsMTYgKzEyMTMsMzYgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE1NQ19CTEtfQ01EX0VSUjoKLQkJCWdvdG8gY21kX2VycjsKLQkJY2FzZSBNTUNfQkxLX1JFVFJZX1NJTkdMRToKLQkJCWRpc2FibGVfbXVsdGkgPSAxOwotCQkJYnJlYWs7CisJCQlyZXQgPSBtbWNfYmxrX2NtZF9lcnIobWQsIGNhcmQsIGJycSwgcmVxLCByZXQpOworCQkJaWYgKCFtbWNfYmxrX3Jlc2V0KG1kLCBjYXJkLT5ob3N0LCB0eXBlKSkKKwkJCQlicmVhazsKKwkJCWdvdG8gY21kX2Fib3J0OwogCQljYXNlIE1NQ19CTEtfUkVUUlk6CiAJCQlpZiAocmV0cnkrKyA8IDUpCiAJCQkJYnJlYWs7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBNTUNfQkxLX0FCT1JUOgorCQkJaWYgKCFtbWNfYmxrX3Jlc2V0KG1kLCBjYXJkLT5ob3N0LCB0eXBlKSkKKwkJCQlicmVhazsKIAkJCWdvdG8gY21kX2Fib3J0OwotCQljYXNlIE1NQ19CTEtfREFUQV9FUlI6CisJCWNhc2UgTU1DX0JMS19EQVRBX0VSUjogeworCQkJaW50IGVycjsKKworCQkJZXJyID0gbW1jX2Jsa19yZXNldChtZCwgY2FyZC0+aG9zdCwgdHlwZSk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJCQlnb3RvIGNtZF9hYm9ydDsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQl9CisJCWNhc2UgTU1DX0JMS19FQ0NfRVJSOgorCQkJaWYgKGJycS0+ZGF0YS5ibG9ja3MgPiAxKSB7CisJCQkJLyogUmVkbyByZWFkIG9uZSBzZWN0b3IgYXQgYSB0aW1lICovCisJCQkJcHJfd2FybmluZygiJXM6IHJldHJ5aW5nIHVzaW5nIHNpbmdsZSBibG9jayByZWFkXG4iLAorCQkJCQkgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSk7CisJCQkJZGlzYWJsZV9tdWx0aSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CiAJCQkvKgogCQkJICogQWZ0ZXIgYW4gZXJyb3IsIHdlIHJlZG8gSS9PIG9uZSBzZWN0b3IgYXQgYQogCQkJICogdGltZSwgc28gd2Ugb25seSByZWFjaCBoZXJlIGFmdGVyIHRyeWluZyB0bwpAQCAtMTEyOSw3ICsxMjU5LDcgQEAKIAogCQlpZiAocmV0KSB7CiAJCQkvKgotCQkJICogSW4gY2FzZSBvZiBhIG5vbmUgY29tcGxldGUgcmVxdWVzdAorCQkJICogSW4gY2FzZSBvZiBhIGluY29tcGxldGUgcmVxdWVzdAogCQkJICogcHJlcGFyZSBpdCBhZ2FpbiBhbmQgcmVzZW5kLgogCQkJICovCiAJCQltbWNfYmxrX3J3X3JxX3ByZXAobXFfcnEsIGNhcmQsIGRpc2FibGVfbXVsdGksIG1xKTsKQEAgLTExMzksMzAgKzEyNjksNiBAQAogCiAJcmV0dXJuIDE7CiAKLSBjbWRfZXJyOgotIAkvKgotIAkgKiBJZiB0aGlzIGlzIGFuIFNEIGNhcmQgYW5kIHdlJ3JlIHdyaXRpbmcsIHdlIGNhbiBmaXJzdAotIAkgKiBtYXJrIHRoZSBrbm93biBnb29kIHNlY3RvcnMgYXMgb2suCi0gCSAqCi0JICogSWYgdGhlIGNhcmQgaXMgbm90IFNELCB3ZSBjYW4gc3RpbGwgb2sgd3JpdHRlbiBzZWN0b3JzCi0JICogYXMgcmVwb3J0ZWQgYnkgdGhlIGNvbnRyb2xsZXIgKHdoaWNoIG1pZ2h0IGJlIGxlc3MgdGhhbgotCSAqIHRoZSByZWFsIG51bWJlciBvZiB3cml0dGVuIHNlY3RvcnMsIGJ1dCBuZXZlciBtb3JlKS4KLQkgKi8KLQlpZiAobW1jX2NhcmRfc2QoY2FyZCkpIHsKLQkJdTMyIGJsb2NrczsKLQotCQlibG9ja3MgPSBtbWNfc2RfbnVtX3dyX2Jsb2NrcyhjYXJkKTsKLQkJaWYgKGJsb2NrcyAhPSAodTMyKS0xKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7Ci0JCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJsb2NrcyA8PCA5KTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmbWQtPmxvY2spOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwotCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIDAsIGJycS0+ZGF0YS5ieXRlc194ZmVyZWQpOwotCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKLQl9Ci0KICBjbWRfYWJvcnQ6CiAJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOwogCXdoaWxlIChyZXQpCkBAIC0xMTkwLDYgKzEyOTYsMTEgQEAKIAogCXJldCA9IG1tY19ibGtfcGFydF9zd2l0Y2goY2FyZCwgbWQpOwogCWlmIChyZXQpIHsKKwkJaWYgKHJlcSkgeworCQkJc3Bpbl9sb2NrX2lycSgmbWQtPmxvY2spOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CisJCQlzcGluX3VubG9ja19pcnEoJm1kLT5sb2NrKTsKKwkJfQogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzc0LDMyICsxNDg1LDM1IEBACiAKIAlzdHJpbmdfZ2V0X3NpemUoKHU2NClnZXRfY2FwYWNpdHkocGFydF9tZC0+ZGlzaykgPDwgOSwgU1RSSU5HX1VOSVRTXzIsCiAJCQljYXBfc3RyLCBzaXplb2YoY2FwX3N0cikpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyBwYXJ0aXRpb24gJXUgJXNcbiIsCisJcHJfaW5mbygiJXM6ICVzICVzIHBhcnRpdGlvbiAldSAlc1xuIiwKIAkgICAgICAgcGFydF9tZC0+ZGlzay0+ZGlza19uYW1lLCBtbWNfY2FyZF9pZChjYXJkKSwKIAkgICAgICAgbW1jX2NhcmRfbmFtZShjYXJkKSwgcGFydF9tZC0+cGFydF90eXBlLCBjYXBfc3RyKTsKIAlyZXR1cm4gMDsKIH0KIAorLyogTU1DIFBoeXNpY2FsIHBhcnRpdGlvbnMgY29uc2lzdCBvZiB0d28gYm9vdCBwYXJ0aXRpb25zIGFuZAorICogdXAgdG8gZm91ciBnZW5lcmFsIHB1cnBvc2UgcGFydGl0aW9ucy4KKyAqIEZvciBlYWNoIHBhcnRpdGlvbiBlbmFibGVkIGluIEVYVF9DU0QgYSBibG9jayBkZXZpY2Ugd2lsbCBiZSBhbGxvY2F0ZWRpCisgKiB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgcGFydGl0aW9uLgorICovCisKIHN0YXRpYyBpbnQgbW1jX2Jsa19hbGxvY19wYXJ0cyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kKQogewotCWludCByZXQgPSAwOworCWludCBpZHgsIHJldCA9IDA7CiAKIAlpZiAoIW1tY19jYXJkX21tYyhjYXJkKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY2FyZC0+ZXh0X2NzZC5ib290X3NpemUpIHsKLQkJcmV0ID0gbW1jX2Jsa19hbGxvY19wYXJ0KGNhcmQsIG1kLCBFWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19CT09UMCwKLQkJCQkJIGNhcmQtPmV4dF9jc2QuYm9vdF9zaXplID4+IDksCi0JCQkJCSB0cnVlLAotCQkJCQkgImJvb3QwIik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBtbWNfYmxrX2FsbG9jX3BhcnQoY2FyZCwgbWQsIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QxLAotCQkJCQkgY2FyZC0+ZXh0X2NzZC5ib290X3NpemUgPj4gOSwKLQkJCQkJIHRydWUsCi0JCQkJCSAiYm9vdDEiKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJZm9yIChpZHggPSAwOyBpZHggPCBjYXJkLT5ucl9wYXJ0czsgaWR4KyspIHsKKwkJaWYgKGNhcmQtPnBhcnRbaWR4XS5zaXplKSB7CisJCQlyZXQgPSBtbWNfYmxrX2FsbG9jX3BhcnQoY2FyZCwgbWQsCisJCQkJY2FyZC0+cGFydFtpZHhdLnBhcnRfY2ZnLAorCQkJCWNhcmQtPnBhcnRbaWR4XS5zaXplID4+IDksCisJCQkJY2FyZC0+cGFydFtpZHhdLmZvcmNlX3JvLAorCQkJCWNhcmQtPnBhcnRbaWR4XS5uYW1lKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNDE1LDcgKzE1MjksNyBAQAogCW1tY19yZWxlYXNlX2hvc3QoY2FyZC0+aG9zdCk7CiAKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBzZXQgYmxvY2sgc2l6ZSB0byA1MTI6ICVkXG4iLAorCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gc2V0IGJsb2NrIHNpemUgdG8gNTEyOiAlZFxuIiwKIAkJCW1kLT5kaXNrLT5kaXNrX25hbWUsIGVycik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE1MTcsNyArMTYzMSw3IEBACiAKIAlzdHJpbmdfZ2V0X3NpemUoKHU2NClnZXRfY2FwYWNpdHkobWQtPmRpc2spIDw8IDksIFNUUklOR19VTklUU18yLAogCQkJY2FwX3N0ciwgc2l6ZW9mKGNhcF9zdHIpKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgJXMgJXMgJXNcbiIsCisJcHJfaW5mbygiJXM6ICVzICVzICVzICVzXG4iLAogCQltZC0+ZGlzay0+ZGlza19uYW1lLCBtbWNfY2FyZF9pZChjYXJkKSwgbW1jX2NhcmRfbmFtZShjYXJkKSwKIAkJY2FwX3N0ciwgbWQtPnJlYWRfb25seSA/ICIocm8pIiA6ICIiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jIGIvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCmluZGV4IDJiZjIyOWEuLmIwMzhjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgUkVTVUxUX09LCQkwCiAjZGVmaW5lIFJFU1VMVF9GQUlMCQkxCkBAIC0yNTAsNyArMjUxLDcgQEAKIAkJaWYgKCFidXN5ICYmIG1tY190ZXN0X2J1c3koJmNtZCkpIHsKIAkJCWJ1c3kgPSAxOwogCQkJaWYgKHRlc3QtPmNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1dBSVRfV0hJTEVfQlVTWSkKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogV2FybmluZzogSG9zdCBkaWQgbm90ICIKKwkJCQlwcl9pbmZvKCIlczogV2FybmluZzogSG9zdCBkaWQgbm90ICIKIAkJCQkJIndhaXQgZm9yIGJ1c3kgc3RhdGUgdG8gZW5kLlxuIiwKIAkJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAkJfQpAQCAtNTUyLDcgKzU1Myw3IEBACiAJcmF0ZSA9IG1tY190ZXN0X3JhdGUoYnl0ZXMsICZ0cyk7CiAJaW9wcyA9IG1tY190ZXN0X3JhdGUoMTAwLCAmdHMpOyAvKiBJL08gb3BzIHBlciBzZWMgeCAxMDAgKi8KIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc2ZlciBvZiAldSBzZWN0b3JzICgldSVzIEtpQikgdG9vayAlbHUuJTA5bHUgIgorCXByX2luZm8oIiVzOiBUcmFuc2ZlciBvZiAldSBzZWN0b3JzICgldSVzIEtpQikgdG9vayAlbHUuJTA5bHUgIgogCQkJICJzZWNvbmRzICgldSBrQi9zLCAldSBLaUIvcywgJXUuJTAydSBJT1BTKVxuIiwKIAkJCSBtbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCksIHNlY3RvcnMsIHNlY3RvcnMgPj4gMSwKIAkJCSAoc2VjdG9ycyAmIDEgPyAiLjUiIDogIiIpLCAodW5zaWduZWQgbG9uZyl0cy50dl9zZWMsCkBAIC01NzgsNyArNTc5LDcgQEAKIAlyYXRlID0gbW1jX3Rlc3RfcmF0ZSh0b3QsICZ0cyk7CiAJaW9wcyA9IG1tY190ZXN0X3JhdGUoY291bnQgKiAxMDAsICZ0cyk7IC8qIEkvTyBvcHMgcGVyIHNlYyB4IDEwMCAqLwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zZmVyIG9mICV1IHggJXUgc2VjdG9ycyAoJXUgeCAldSVzIEtpQikgdG9vayAiCisJcHJfaW5mbygiJXM6IFRyYW5zZmVyIG9mICV1IHggJXUgc2VjdG9ycyAoJXUgeCAldSVzIEtpQikgdG9vayAiCiAJCQkgIiVsdS4lMDlsdSBzZWNvbmRzICgldSBrQi9zLCAldSBLaUIvcywgIgogCQkJICIldS4lMDJ1IElPUFMsIHNnX2xlbiAlZClcbiIsCiAJCQkgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpLCBjb3VudCwgc2VjdG9ycywgY291bnQsCkBAIC0xNDA4LDcgKzE0MDksNyBAQAogCiBzdGF0aWMgaW50IG1tY190ZXN0X25vX2hpZ2htZW0oc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhpZ2htZW0gbm90IGNvbmZpZ3VyZWQgLSB0ZXN0IHNraXBwZWRcbiIsCisJcHJfaW5mbygiJXM6IEhpZ2htZW0gbm90IGNvbmZpZ3VyZWQgLSB0ZXN0IHNraXBwZWRcbiIsCiAJICAgICAgIG1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDM1LDcgKzE0MzYsNyBAQAogCQkJCSAgICAgIHQtPm1heF9zZWdfc3osICZ0LT5zZ19sZW4sIG1pbl9zZ19sZW4pOwogCX0KIAlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIG1hcCBzZyBsaXN0XG4iLAorCQlwcl9pbmZvKCIlczogRmFpbGVkIHRvIG1hcCBzZyBsaXN0XG4iLAogCQkgICAgICAgbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjEzNSw3ICsyMTM2LDcgQEAKIAogCXJldHVybiByZXQ7CiAgZXJyOgotCXByaW50ayhLRVJOX0lORk8gIlslc10gZXJyb3JcbiIsIF9fZnVuY19fKTsKKwlwcl9pbmZvKCJbJXNdIGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjE0OSw3ICsyMTUwLDcgQEAKIAogCWlmIChydy0+ZG9fbm9uYmxvY2tfcmVxICYmCiAJICAgICgoIXByZV9yZXEgJiYgcG9zdF9yZXEpIHx8IChwcmVfcmVxICYmICFwb3N0X3JlcSkpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImVycm9yOiBvbmx5IG9uZSBvZiBwcmUvcG9zdCBpcyBkZWZpbmVkXG4iKTsKKwkJcHJfaW5mbygiZXJyb3I6IG9ubHkgb25lIG9mIHByZS9wb3N0IGlzIGRlZmluZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIzMjgsNiArMjMyOSwzMSBAQAogCXJldHVybiBtbWNfdGVzdF9yd19tdWx0aXBsZV9zZ19sZW4odGVzdCwgJnRlc3RfZGF0YSk7CiB9CiAKKy8qCisgKiBlTU1DIGhhcmR3YXJlIHJlc2V0LgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2h3X3Jlc2V0KHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IHRlc3QtPmNhcmQ7CisJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKKwlpbnQgZXJyOworCisJZXJyID0gbW1jX2h3X3Jlc2V0X2NoZWNrKGhvc3QpOworCWlmICghZXJyKQorCQlyZXR1cm4gUkVTVUxUX09LOworCisJaWYgKGVyciA9PSAtRU5PU1lTKQorCQlyZXR1cm4gUkVTVUxUX0ZBSUw7CisKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFtbWNfY2FuX3Jlc2V0KGNhcmQpKQorCQlyZXR1cm4gUkVTVUxUX1VOU1VQX0NBUkQ7CisKKwlyZXR1cm4gUkVTVUxUX1VOU1VQX0hPU1Q7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX3Rlc3RfY2FzZSBtbWNfdGVzdF9jYXNlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiQmFzaWMgd3JpdGUgKG5vIGRhdGEgdmVyaWZpY2F0aW9uKSIsCkBAIC0yNjUwLDYgKzI2NzYsMTEgQEAKIAkJLnJ1biA9IG1tY190ZXN0X3Byb2ZpbGVfc2dsZW5fcl9ub25ibG9ja19wZXJmLAogCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKIAl9LAorCisJeworCQkubmFtZSA9ICJlTU1DIGhhcmR3YXJlIHJlc2V0IiwKKwkJLnJ1biA9IG1tY190ZXN0X2h3X3Jlc2V0LAorCX0sCiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKG1tY190ZXN0X2xvY2spOwpAQCAtMjY2MCw3ICsyNjkxLDcgQEAKIHsKIAlpbnQgaSwgcmV0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIHRlc3RzIG9mIGNhcmQgJXMuLi5cbiIsCisJcHJfaW5mbygiJXM6IFN0YXJ0aW5nIHRlc3RzIG9mIGNhcmQgJXMuLi5cbiIsCiAJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgbW1jX2NhcmRfaWQodGVzdC0+Y2FyZCkpOwogCiAJbW1jX2NsYWltX2hvc3QodGVzdC0+Y2FyZC0+aG9zdCk7CkBAIC0yNjcxLDE0ICsyNzAyLDE0IEBACiAJCWlmICh0ZXN0Y2FzZSAmJiAoKGkgKyAxKSAhPSB0ZXN0Y2FzZSkpCiAJCQljb250aW51ZTsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlczogVGVzdCBjYXNlICVkLiAlcy4uLlxuIiwKKwkJcHJfaW5mbygiJXM6IFRlc3QgY2FzZSAlZC4gJXMuLi5cbiIsCiAJCQltbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCksIGkgKyAxLAogCQkJbW1jX3Rlc3RfY2FzZXNbaV0ubmFtZSk7CiAKIAkJaWYgKG1tY190ZXN0X2Nhc2VzW2ldLnByZXBhcmUpIHsKIAkJCXJldCA9IG1tY190ZXN0X2Nhc2VzW2ldLnByZXBhcmUodGVzdCk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogUHJlcGFyZSAiCisJCQkJcHJfaW5mbygiJXM6IFJlc3VsdDogUHJlcGFyZSAiCiAJCQkJCSJzdGFnZSBmYWlsZWQhICglZClcbiIsCiAJCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwKIAkJCQkJcmV0KTsKQEAgLTI3MDgsMjUgKzI3MzksMjUgQEAKIAkJcmV0ID0gbW1jX3Rlc3RfY2FzZXNbaV0ucnVuKHRlc3QpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIFJFU1VMVF9PSzoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZXN1bHQ6IE9LXG4iLAorCQkJcHJfaW5mbygiJXM6IFJlc3VsdDogT0tcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKHRlc3QtPmNhcmQtPmhvc3QpKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFU1VMVF9GQUlMOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3VsdDogRkFJTEVEXG4iLAorCQkJcHJfaW5mbygiJXM6IFJlc3VsdDogRkFJTEVEXG4iLAogCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7CiAJCQlicmVhazsKIAkJY2FzZSBSRVNVTFRfVU5TVVBfSE9TVDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZXN1bHQ6IFVOU1VQUE9SVEVEICIKKwkJCXByX2luZm8oIiVzOiBSZXN1bHQ6IFVOU1VQUE9SVEVEICIKIAkJCQkiKGJ5IGhvc3QpXG4iLAogCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7CiAJCQlicmVhazsKIAkJY2FzZSBSRVNVTFRfVU5TVVBfQ0FSRDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZXN1bHQ6IFVOU1VQUE9SVEVEICIKKwkJCXByX2luZm8oIiVzOiBSZXN1bHQ6IFVOU1VQUE9SVEVEICIKIAkJCQkiKGJ5IGNhcmQpXG4iLAogCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZXN1bHQ6IEVSUk9SICglZClcbiIsCisJCQlwcl9pbmZvKCIlczogUmVzdWx0OiBFUlJPUiAoJWQpXG4iLAogCQkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgcmV0KTsKIAkJfQogCkBAIC0yNzM3LDcgKzI3NjgsNyBAQAogCQlpZiAobW1jX3Rlc3RfY2FzZXNbaV0uY2xlYW51cCkgewogCQkJcmV0ID0gbW1jX3Rlc3RfY2FzZXNbaV0uY2xlYW51cCh0ZXN0KTsKIAkJCWlmIChyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogV2FybmluZzogQ2xlYW51cCAiCisJCQkJcHJfaW5mbygiJXM6IFdhcm5pbmc6IENsZWFudXAgIgogCQkJCQkic3RhZ2UgZmFpbGVkISAoJWQpXG4iLAogCQkJCQltbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCksCiAJCQkJCXJldCk7CkBAIC0yNzQ3LDcgKzI3NzgsNyBAQAogCiAJbW1jX3JlbGVhc2VfaG9zdCh0ZXN0LT5jYXJkLT5ob3N0KTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBUZXN0cyBjb21wbGV0ZWQuXG4iLAorCXByX2luZm8oIiVzOiBUZXN0cyBjb21wbGV0ZWQuXG4iLAogCQltbWNfaG9zdG5hbWUodGVzdC0+Y2FyZC0+aG9zdCkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKaW5kZXggNDVmYjM2Mi4uZGNhZDU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCXdha2VfdXBfcHJvY2VzcyhtcS0+dGhyZWFkKTsKIH0KIAotc3RydWN0IHNjYXR0ZXJsaXN0ICptbWNfYWxsb2Nfc2coaW50IHNnX2xlbiwgaW50ICplcnIpCitzdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICptbWNfYWxsb2Nfc2coaW50IHNnX2xlbiwgaW50ICplcnIpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIApAQCAtMTQwLDcgKzE0MCw3IEBACiAJLyogZ3JhbnVsYXJpdHkgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heC4gZGlzY2FyZCAqLwogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2NhcmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gMDsKLQlpZiAobW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSkKKwlpZiAobW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShjYXJkKSB8fCBtbWNfY2FuX3Nhbml0aXplKGNhcmQpKQogCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1NFQ0RJU0NBUkQsIHEpOwogfQogCkBAIC0xOTcsMTMgKzE5NywxMyBAQAogCQlpZiAoYm91bmNlc3ogPiA1MTIpIHsKIAkJCW1xcnFfY3VyLT5ib3VuY2VfYnVmID0ga21hbGxvYyhib3VuY2VzeiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW1xcnFfY3VyLT5ib3VuY2VfYnVmKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byAiCisJCQkJcHJfd2FybmluZygiJXM6IHVuYWJsZSB0byAiCiAJCQkJCSJhbGxvY2F0ZSBib3VuY2UgY3VyIGJ1ZmZlclxuIiwKIAkJCQkJbW1jX2NhcmRfbmFtZShjYXJkKSk7CiAJCQl9CiAJCQltcXJxX3ByZXYtPmJvdW5jZV9idWYgPSBrbWFsbG9jKGJvdW5jZXN6LCBHRlBfS0VSTkVMKTsKIAkJCWlmICghbXFycV9wcmV2LT5ib3VuY2VfYnVmKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byAiCisJCQkJcHJfd2FybmluZygiJXM6IHVuYWJsZSB0byAiCiAJCQkJCSJhbGxvY2F0ZSBib3VuY2UgcHJldiBidWZmZXJcbiIsCiAJCQkJCW1tY19jYXJkX25hbWUoY2FyZCkpOwogCQkJCWtmcmVlKG1xcnFfY3VyLT5ib3VuY2VfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMgYi9kcml2ZXJzL21tYy9jYXJkL3NkaW9fdWFydC5jCmluZGV4IGM4YzllZGIuLjJjMTUxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvc2Rpb191YXJ0LmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9zZGlvX3VhcnQuYwpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoZnVuYy0+Y2xhc3MgPT0gU0RJT19DTEFTU19VQVJUKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBuZWVkIGluZm8gb24gVUFSVCBjbGFzcyBiYXNpYyBzZXR1cFxuIiwKKwkJcHJfd2FybmluZygiJXM6IG5lZWQgaW5mbyBvbiBVQVJUIGNsYXNzIGJhc2ljIHNldHVwXG4iLAogCQkgICAgICAgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKIAkJa2ZyZWUocG9ydCk7CiAJCXJldHVybiAtRU5PU1lTOwpAQCAtMTEwMSwyMyArMTEwMSwyMyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmICghdHBsKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQlwcl93YXJuaW5nKAogICAgICAgICIlczogY2FuJ3QgZmluZCB0dXBsZSAweDkxIHN1YnR1cGxlIDAgKFNVQlRQTF9TSU9SRUcpIGZvciBHUFMgY2xhc3NcbiIsCiAJCQkgICAgICAgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKIAkJCWtmcmVlKHBvcnQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWdpc3RlciBJRCA9IDB4JTAyeCwgRXhwIElEID0gMHglMDJ4XG4iLAorCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIElEID0gMHglMDJ4LCBFeHAgSUQgPSAweCUwMnhcbiIsCiAJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYyksIHRwbC0+ZGF0YVsyXSwgdHBsLT5kYXRhWzNdKTsKIAkJcG9ydC0+cmVnc19vZmZzZXQgPSAodHBsLT5kYXRhWzRdIDw8IDApIHwKIAkJCQkgICAgKHRwbC0+ZGF0YVs1XSA8PCA4KSB8CiAJCQkJICAgICh0cGwtPmRhdGFbNl0gPDwgMTYpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlZ3Mgb2Zmc2V0ID0gMHgleFxuIiwKKwkJcHJfZGVidWcoIiVzOiByZWdzIG9mZnNldCA9IDB4JXhcbiIsCiAJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYyksIHBvcnQtPnJlZ3Nfb2Zmc2V0KTsKIAkJcG9ydC0+dWFydGNsayA9IHRwbC0+ZGF0YVs3XSAqIDExNTIwMDsKIAkJaWYgKHBvcnQtPnVhcnRjbGsgPT0gMCkKIAkJCXBvcnQtPnVhcnRjbGsgPSAxMTUyMDA7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogY2xrICVkIGJhdWRjb2RlICV1IDQ4MDAtZGl2ICV1XG4iLAorCQlwcl9kZWJ1ZygiJXM6IGNsayAlZCBiYXVkY29kZSAldSA0ODAwLWRpdiAldVxuIiwKIAkJICAgICAgIHNkaW9fZnVuY19pZChmdW5jKSwgcG9ydC0+dWFydGNsaywKIAkJICAgICAgIHRwbC0+ZGF0YVs3XSwgdHBsLT5kYXRhWzhdIHwgKHRwbC0+ZGF0YVs5XSA8PCA4KSk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCmluZGV4IDM5M2Q4MTcuLjZiZTQ5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9idXMuYwpAQCAtMTEsOSArMTEsMTEgQEAKICAqICBNTUMgY2FyZCBidXMgZHJpdmVyIG1vZGVsCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTI5NSw3ICsyOTcsNyBAQAogCX0KIAogCWlmIChtbWNfaG9zdF9pc19zcGkoY2FyZC0+aG9zdCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5ldyAlcyVzJXMgY2FyZCBvbiBTUElcbiIsCisJCXByX2luZm8oIiVzOiBuZXcgJXMlcyVzIGNhcmQgb24gU1BJXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAogCQkJbW1jX2NhcmRfaGlnaHNwZWVkKGNhcmQpID8gImhpZ2ggc3BlZWQgIiA6ICIiLAogCQkJbW1jX2NhcmRfZGRyX21vZGUoY2FyZCkgPyAiRERSICIgOiAiIiwKQEAgLTMzNCwxMCArMzM2LDEwIEBACiAKIAlpZiAobW1jX2NhcmRfcHJlc2VudChjYXJkKSkgewogCQlpZiAobW1jX2hvc3RfaXNfc3BpKGNhcmQtPmhvc3QpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogU1BJIGNhcmQgcmVtb3ZlZFxuIiwKKwkJCXByX2luZm8oIiVzOiBTUEkgY2FyZCByZW1vdmVkXG4iLAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FyZCAlMDR4IHJlbW92ZWRcbiIsCisJCQlwcl9pbmZvKCIlczogY2FyZCAlMDR4IHJlbW92ZWRcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjYXJkLT5yY2EpOwogCQl9CiAJCWRldmljZV9kZWwoJmNhcmQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCmluZGV4IGIyN2I5NDAuLjUyNzhmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KQEAgLTgzLDYgKzg1LDQzIEBACiAJZmx1c2hfd29ya3F1ZXVlKHdvcmtxdWV1ZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAorCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb24uIEluamVjdCByYW5kb20gZGF0YSBlcnJvcnMuCisgKiBJZiBtbWNfZGF0YSBpcyBOVUxMIG5vIGVycm9ycyBhcmUgaW5qZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIG1tY19zaG91bGRfZmFpbF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwKKwkJCQkgICAgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQgPSBtcnEtPmNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBtcnEtPmRhdGE7CisJc3RhdGljIGNvbnN0IGludCBkYXRhX2Vycm9yc1tdID0geworCQktRVRJTUVET1VULAorCQktRUlMU0VRLAorCQktRUlPLAorCX07CisKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCWlmIChjbWQtPmVycm9yIHx8IGRhdGEtPmVycm9yIHx8CisJICAgICFzaG91bGRfZmFpbCgmaG9zdC0+ZmFpbF9tbWNfcmVxdWVzdCwgZGF0YS0+Ymxrc3ogKiBkYXRhLT5ibG9ja3MpKQorCQlyZXR1cm47CisKKwlkYXRhLT5lcnJvciA9IGRhdGFfZXJyb3JzW3JhbmRvbTMyKCkgJSBBUlJBWV9TSVpFKGRhdGFfZXJyb3JzKV07CisJZGF0YS0+Ynl0ZXNfeGZlcmVkID0gKHJhbmRvbTMyKCkgJSAoZGF0YS0+Ynl0ZXNfeGZlcmVkID4+IDkpKSA8PCA5OworfQorCisjZWxzZSAvKiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3Nob3VsZF9mYWlsX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCQkgICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19GQUlMX01NQ19SRVFVRVNUICovCisKIC8qKgogICoJbW1jX3JlcXVlc3RfZG9uZSAtIGZpbmlzaCBwcm9jZXNzaW5nIGFuIE1NQyByZXF1ZXN0CiAgKglAaG9zdDogTU1DIGhvc3Qgd2hpY2ggY29tcGxldGVkIHJlcXVlc3QKQEAgLTEwMiwxMyArMTQxLDE1IEBACiAJfQogCiAJaWYgKGVyciAmJiBjbWQtPnJldHJpZXMpIHsKLQkJcHJfZGVidWcoIiVzOiByZXEgZmFpbGVkIChDTUQldSk6ICVkLCByZXRyeWluZy4uLlxuIiwKLQkJCW1tY19ob3N0bmFtZShob3N0KSwgY21kLT5vcGNvZGUsIGVycik7Ci0KLQkJY21kLT5yZXRyaWVzLS07Ci0JCWNtZC0+ZXJyb3IgPSAwOwotCQlob3N0LT5vcHMtPnJlcXVlc3QoaG9zdCwgbXJxKTsKKwkJLyoKKwkJICogUmVxdWVzdCBzdGFydGVyIG11c3QgaGFuZGxlIHJldHJpZXMgLSBzZWUKKwkJICogbW1jX3dhaXRfZm9yX3JlcV9kb25lKCkuCisJCSAqLworCQlpZiAobXJxLT5kb25lKQorCQkJbXJxLT5kb25lKG1ycSk7CiAJfSBlbHNlIHsKKwkJbW1jX3Nob3VsZF9mYWlsX3JlcXVlc3QoaG9zdCwgbXJxKTsKKwogCQlsZWRfdHJpZ2dlcl9ldmVudChob3N0LT5sZWQsIExFRF9PRkYpOwogCiAJCXByX2RlYnVnKCIlczogcmVxIGRvbmUgKENNRCV1KTogJWQ6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCkBAIC0yMTIsNyArMjUzLDIxIEBACiBzdGF0aWMgdm9pZCBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LAogCQkJCSAgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbXJxLT5jb21wbGV0aW9uKTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKKworCXdoaWxlICgxKSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1ycS0+Y29tcGxldGlvbik7CisKKwkJY21kID0gbXJxLT5jbWQ7CisJCWlmICghY21kLT5lcnJvciB8fCAhY21kLT5yZXRyaWVzKQorCQkJYnJlYWs7CisKKwkJcHJfZGVidWcoIiVzOiByZXEgZmFpbGVkIChDTUQldSk6ICVkLCByZXRyeWluZy4uLlxuIiwKKwkJCSBtbWNfaG9zdG5hbWUoaG9zdCksIGNtZC0+b3Bjb2RlLCBjbWQtPmVycm9yKTsKKwkJY21kLT5yZXRyaWVzLS07CisJCWNtZC0+ZXJyb3IgPSAwOworCQlob3N0LT5vcHMtPnJlcXVlc3QoaG9zdCwgbXJxKTsKKwl9CiB9CiAKIC8qKgpAQCAtMjc5LDggKzMzNCwxNCBAQAogCQltbWNfd2FpdF9mb3JfcmVxX2RvbmUoaG9zdCwgaG9zdC0+YXJlcS0+bXJxKTsKIAkJZXJyID0gaG9zdC0+YXJlcS0+ZXJyX2NoZWNrKGhvc3QtPmNhcmQsIGhvc3QtPmFyZXEpOwogCQlpZiAoZXJyKSB7CisJCQkvKiBwb3N0IHByb2Nlc3MgdGhlIGNvbXBsZXRlZCBmYWlsZWQgcmVxdWVzdCAqLwogCQkJbW1jX3Bvc3RfcmVxKGhvc3QsIGhvc3QtPmFyZXEtPm1ycSwgMCk7CiAJCQlpZiAoYXJlcSkKKwkJCQkvKgorCQkJCSAqIENhbmNlbCB0aGUgbmV3IHByZXBhcmVkIHJlcXVlc3QsIGJlY2F1c2UKKwkJCQkgKiBpdCBjYW4ndCBydW4gdW50aWwgdGhlIGZhaWxlZAorCQkJCSAqIHJlcXVlc3QgaGFzIGJlZW4gcHJvcGVybHkgaGFuZGxlZC4KKwkJCQkgKi8KIAkJCQltbWNfcG9zdF9yZXEoaG9zdCwgYXJlcS0+bXJxLCAtRUlOVkFMKTsKIAogCQkJaG9zdC0+YXJlcSA9IE5VTEw7CkBAIC0zMTksNiArMzgwLDYzIEBACiBFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9yZXEpOwogCiAvKioKKyAqCW1tY19pbnRlcnJ1cHRfaHBpIC0gSXNzdWUgZm9yIEhpZ2ggcHJpb3JpdHkgSW50ZXJydXB0CisgKglAY2FyZDogdGhlIE1NQyBjYXJkIGFzc29jaWF0ZWQgd2l0aCB0aGUgSFBJIHRyYW5zZmVyCisgKgorICoJSXNzdWVkIEhpZ2ggUHJpb3JpdHkgSW50ZXJydXB0LCBhbmQgY2hlY2sgZm9yIGNhcmQgc3RhdHVzCisgKgl1dGlsIG91dC1vZiBwcmctc3RhdGUuCisgKi8KK2ludCBtbWNfaW50ZXJydXB0X2hwaShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJaW50IGVycjsKKwl1MzIgc3RhdHVzOworCisJQlVHX09OKCFjYXJkKTsKKworCWlmICghY2FyZC0+ZXh0X2NzZC5ocGlfZW4pIHsKKwkJcHJfaW5mbygiJXM6IEhQSSBlbmFibGUgYml0IHVuc2V0XG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwltbWNfY2xhaW1faG9zdChjYXJkLT5ob3N0KTsKKwllcnIgPSBtbWNfc2VuZF9zdGF0dXMoY2FyZCwgJnN0YXR1cyk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIiVzOiBHZXQgY2FyZCBzdGF0dXMgZmFpbFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY2FyZCBzdGF0dXMgaXMgaW4gUFJHLXN0YXRlLCB3ZSBjYW4gc2VuZCB0aGUgSFBJIGNvbW1hbmQuCisJICovCisJaWYgKFIxX0NVUlJFTlRfU1RBVEUoc3RhdHVzKSA9PSBSMV9TVEFURV9QUkcpIHsKKwkJZG8geworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGtub3cgd2hlbiB0aGUgSFBJIGNvbW1hbmQgd2lsbCBmaW5pc2gKKwkJCSAqIHByb2Nlc3NpbmcsIHNvIHdlIG5lZWQgdG8gcmVzZW5kIEhQSSB1bnRpbCBvdXQKKwkJCSAqIG9mIHByZy1zdGF0ZSwgYW5kIGtlZXAgY2hlY2tpbmcgdGhlIGNhcmQgc3RhdHVzCisJCQkgKiB3aXRoIFNFTkRfU1RBVFVTLiAgSWYgYSB0aW1lb3V0IGVycm9yIG9jY3VycyB3aGVuCisJCQkgKiBzZW5kaW5nIHRoZSBIUEkgY29tbWFuZCwgd2UgYXJlIGFscmVhZHkgb3V0IG9mCisJCQkgKiBwcmctc3RhdGUuCisJCQkgKi8KKwkJCWVyciA9IG1tY19zZW5kX2hwaV9jbWQoY2FyZCwgJnN0YXR1cyk7CisJCQlpZiAoZXJyKQorCQkJCXByX2RlYnVnKCIlczogYWJvcnQgSFBJICglZCBlcnJvcilcbiIsCisJCQkJCSBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGVycik7CisKKwkJCWVyciA9IG1tY19zZW5kX3N0YXR1cyhjYXJkLCAmc3RhdHVzKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKFIxX0NVUlJFTlRfU1RBVEUoc3RhdHVzKSA9PSBSMV9TVEFURV9QUkcpOworCX0gZWxzZQorCQlwcl9kZWJ1ZygiJXM6IExlZnQgcHJnLXN0YXRlXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCitvdXQ6CisJbW1jX3JlbGVhc2VfaG9zdChjYXJkLT5ob3N0KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbWNfaW50ZXJydXB0X2hwaSk7CisKKy8qKgogICoJbW1jX3dhaXRfZm9yX2NtZCAtIHN0YXJ0IGEgY29tbWFuZCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbgogICoJQGhvc3Q6IE1NQyBob3N0IHRvIHN0YXJ0IGNvbW1hbmQKICAqCUBjbWQ6IE1NQyBjb21tYW5kIHRvIHN0YXJ0CkBAIC0zMzAsNyArNDQ4LDcgQEAKICAqLwogaW50IG1tY193YWl0X2Zvcl9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwgaW50IHJldHJpZXMpCiB7Ci0Jc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHswfTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCiAJV0FSTl9PTighaG9zdC0+Y2xhaW1lZCk7CiAKQEAgLTExMTksMTMgKzEyMzcsMTEgQEAKIAkJYml0ID0gZmxzKGhvc3QtPm9jcl9hdmFpbCkgLSAxOwogCiAJaG9zdC0+aW9zLnZkZCA9IGJpdDsKLQlpZiAobW1jX2hvc3RfaXNfc3BpKGhvc3QpKSB7CisJaWYgKG1tY19ob3N0X2lzX3NwaShob3N0KSkKIAkJaG9zdC0+aW9zLmNoaXBfc2VsZWN0ID0gTU1DX0NTX0hJR0g7Ci0JCWhvc3QtPmlvcy5idXNfbW9kZSA9IE1NQ19CVVNNT0RFX1BVU0hQVUxMOwotCX0gZWxzZSB7CisJZWxzZQogCQlob3N0LT5pb3MuY2hpcF9zZWxlY3QgPSBNTUNfQ1NfRE9OVENBUkU7Ci0JCWhvc3QtPmlvcy5idXNfbW9kZSA9IE1NQ19CVVNNT0RFX09QRU5EUkFJTjsKLQl9CisJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfUFVTSFBVTEw7CiAJaG9zdC0+aW9zLnBvd2VyX21vZGUgPSBNTUNfUE9XRVJfVVA7CiAJaG9zdC0+aW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKIAlob3N0LT5pb3MudGltaW5nID0gTU1DX1RJTUlOR19MRUdBQ1k7CkBAIC0xMTUxLDEzICsxMjY3LDQ1IEBACiAJbW1jX2hvc3RfY2xrX3JlbGVhc2UoaG9zdCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1tY19wb3dlcl9vZmYoc3RydWN0IG1tY19ob3N0ICpob3N0KQordm9pZCBtbWNfcG93ZXJfb2ZmKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKKwlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQ7CisJdW5zaWduZWQgaW50IG5vdGlmeV90eXBlOworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCWludCBlcnI7CisKIAltbWNfaG9zdF9jbGtfaG9sZChob3N0KTsKIAorCWNhcmQgPSBob3N0LT5jYXJkOwogCWhvc3QtPmlvcy5jbG9jayA9IDA7CiAJaG9zdC0+aW9zLnZkZCA9IDA7CiAKKwlpZiAoY2FyZCAmJiBtbWNfY2FyZF9tbWMoY2FyZCkgJiYKKwkgICAgKGNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9PSBNTUNfUE9XRVJFRF9PTikpIHsKKworCQlpZiAoaG9zdC0+cG93ZXJfbm90aWZ5X3R5cGUgPT0gTU1DX0hPU1RfUFdfTk9USUZZX1NIT1JUKSB7CisJCQlub3RpZnlfdHlwZSA9IEVYVF9DU0RfUE9XRVJfT0ZGX1NIT1JUOworCQkJdGltZW91dCA9IGNhcmQtPmV4dF9jc2QuZ2VuZXJpY19jbWQ2X3RpbWU7CisJCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfUE9XRVJPRkZfU0hPUlQ7CisJCX0gZWxzZSB7CisJCQlub3RpZnlfdHlwZSA9IEVYVF9DU0RfUE9XRVJfT0ZGX0xPTkc7CisJCQl0aW1lb3V0ID0gY2FyZC0+ZXh0X2NzZC5wb3dlcl9vZmZfbG9uZ3RpbWU7CisJCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfUE9XRVJPRkZfTE9ORzsKKwkJfQorCisJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQkgRVhUX0NTRF9QT1dFUl9PRkZfTk9USUZJQ0FUSU9OLAorCQkJCSBub3RpZnlfdHlwZSwgdGltZW91dCk7CisKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCisJCQlwcl9lcnIoIkRldmljZSBmYWlsZWQgdG8gcmVzcG9uZCB3aXRoaW4gJWQgcG93ZXJvZmYgIgorCQkJICAgICAgICJ0aW1lLiBGb3JjZWZ1bGx5IHBvd2VyaW5nIGRvd24gdGhlIGRldmljZVxuIiwKKwkJCSAgICAgICB0aW1lb3V0KTsKKworCQkvKiBTZXQgdGhlIGNhcmQgc3RhdGUgdG8gbm8gbm90aWZpY2F0aW9uIGFmdGVyIHRoZSBwb3dlcm9mZiAqLworCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfTk9fUE9XRVJfTk9USUZJQ0FUSU9OOworCX0KKwogCS8qCiAJICogUmVzZXQgb2NyIG1hc2sgdG8gYmUgdGhlIGhpZ2hlc3QgcG9zc2libGUgdm9sdGFnZSBzdXBwb3J0ZWQgZm9yCiAJICogdGhpcyBtbWMgaG9zdC4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgYXQgbmV4dCBwb3dlciB1cC4KQEAgLTExNzMsNiArMTMyMSwxMyBAQAogCWhvc3QtPmlvcy50aW1pbmcgPSBNTUNfVElNSU5HX0xFR0FDWTsKIAltbWNfc2V0X2lvcyhob3N0KTsKIAorCS8qCisJICogU29tZSBjb25maWd1cmF0aW9ucywgc3VjaCBhcyB0aGUgODAyLjExIFNESU8gY2FyZCBpbiB0aGUgT0xQQworCSAqIFhPLTEuNSwgcmVxdWlyZSBhIHNob3J0IGRlbGF5IGFmdGVyIHBvd2Vyb2ZmIGJlZm9yZSB0aGUgY2FyZAorCSAqIGNhbiBiZSBzdWNjZXNzZnVsbHkgdHVybmVkIG9uIGFnYWluLgorCSAqLworCW1tY19kZWxheSgxKTsKKwogCW1tY19ob3N0X2Nsa19yZWxlYXNlKGhvc3QpOwogfQogCkBAIC0xMjQxLDggKzEzOTYsNyBAQAogfQogCiAvKgotICogUmVtb3ZlIHRoZSBjdXJyZW50IGJ1cyBoYW5kbGVyIGZyb20gYSBob3N0LiBBc3N1bWVzIHRoYXQgdGhlcmUgYXJlCi0gKiBubyBpbnRlcmVzdGluZyBjYXJkcyBsZWZ0LCBzbyB0aGUgYnVzIGlzIHBvd2VyZWQgZG93bi4KKyAqIFJlbW92ZSB0aGUgY3VycmVudCBidXMgaGFuZGxlciBmcm9tIGEgaG9zdC4KICAqLwogdm9pZCBtbWNfZGV0YWNoX2J1cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CkBAIC0xMjU5LDggKzE0MTMsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCi0JbW1jX3Bvd2VyX29mZihob3N0KTsKLQogCW1tY19idXNfcHV0KGhvc3QpOwogfQogCkBAIC0xNDc4LDkgKzE2MzAsOSBAQAogCWNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1IxIHwgTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CiAJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCAwKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibW1jX2VyYXNlOiBncm91cCBzdGFydCBlcnJvciAlZCwgIgorCQlwcl9lcnIoIm1tY19lcmFzZTogZ3JvdXAgc3RhcnQgZXJyb3IgJWQsICIKIAkJICAgICAgICJzdGF0dXMgJSN4XG4iLCBlcnIsIGNtZC5yZXNwWzBdKTsKLQkJZXJyID0gLUVJTlZBTDsKKwkJZXJyID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xNDkzLDkgKzE2NDUsOSBAQAogCWNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1IxIHwgTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CiAJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChjYXJkLT5ob3N0LCAmY21kLCAwKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibW1jX2VyYXNlOiBncm91cCBlbmQgZXJyb3IgJWQsIHN0YXR1cyAlI3hcbiIsCisJCXByX2VycigibW1jX2VyYXNlOiBncm91cCBlbmQgZXJyb3IgJWQsIHN0YXR1cyAlI3hcbiIsCiAJCSAgICAgICBlcnIsIGNtZC5yZXNwWzBdKTsKLQkJZXJyID0gLUVJTlZBTDsKKwkJZXJyID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xNTA2LDcgKzE2NTgsNyBAQAogCWNtZC5jbWRfdGltZW91dF9tcyA9IG1tY19lcmFzZV90aW1lb3V0KGNhcmQsIGFyZywgcXR5KTsKIAllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGNhcmQtPmhvc3QsICZjbWQsIDApOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtbWNfZXJhc2U6IGVyYXNlIGVycm9yICVkLCBzdGF0dXMgJSN4XG4iLAorCQlwcl9lcnIoIm1tY19lcmFzZTogZXJhc2UgZXJyb3IgJWQsIHN0YXR1cyAlI3hcbiIsCiAJCSAgICAgICBlcnIsIGNtZC5yZXNwWzBdKTsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBvdXQ7CkBAIC0xNTIzLDcgKzE2NzUsNyBAQAogCQkvKiBEbyBub3QgcmV0cnkgZWxzZSB3ZSBjYW4ndCBzZWUgZXJyb3JzICovCiAJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgMCk7CiAJCWlmIChlcnIgfHwgKGNtZC5yZXNwWzBdICYgMHhGREY5MjAwMCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgJWQgcmVxdWVzdGluZyBzdGF0dXMgJSN4XG4iLAorCQkJcHJfZXJyKCJlcnJvciAlZCByZXF1ZXN0aW5nIHN0YXR1cyAlI3hcbiIsCiAJCQkJZXJyLCBjbWQucmVzcFswXSk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBvdXQ7CkBAIC0xNjE0LDEwICsxNzY2LDMyIEBACiB7CiAJaWYgKGNhcmQtPmV4dF9jc2Quc2VjX2ZlYXR1cmVfc3VwcG9ydCAmIEVYVF9DU0RfU0VDX0dCX0NMX0VOKQogCQlyZXR1cm4gMTsKKwlpZiAobW1jX2Nhbl9kaXNjYXJkKGNhcmQpKQorCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobW1jX2Nhbl90cmltKTsKIAoraW50IG1tY19jYW5fZGlzY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJLyoKKwkgKiBBcyB0aGVyZSdzIG5vIHdheSB0byBkZXRlY3QgdGhlIGRpc2NhcmQgc3VwcG9ydCBiaXQgYXQgdjQuNQorCSAqIHVzZSB0aGUgcy93IGZlYXR1cmUgc3VwcG9ydCBmaWxlZC4KKwkgKi8KKwlpZiAoY2FyZC0+ZXh0X2NzZC5mZWF0dXJlX3N1cHBvcnQgJiBNTUNfRElTQ0FSRF9GRUFUVVJFKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2Nhbl9kaXNjYXJkKTsKKworaW50IG1tY19jYW5fc2FuaXRpemUoc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCWlmIChjYXJkLT5leHRfY3NkLnNlY19mZWF0dXJlX3N1cHBvcnQgJiBFWFRfQ1NEX1NFQ19TQU5JVElaRSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19jYW5fc2FuaXRpemUpOworCiBpbnQgbW1jX2Nhbl9zZWN1cmVfZXJhc2VfdHJpbShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCiB7CiAJaWYgKGNhcmQtPmV4dF9jc2Quc2VjX2ZlYXR1cmVfc3VwcG9ydCAmIEVYVF9DU0RfU0VDX0VSX0VOKQpAQCAtMTcyNyw2ICsxOTAxLDk0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG1tY19zZXRfYmxvY2tsZW4pOwogCitzdGF0aWMgdm9pZCBtbWNfaHdfcmVzZXRfZm9yX2luaXQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCWlmICghKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX0hXX1JFU0VUKSB8fCAhaG9zdC0+b3BzLT5od19yZXNldCkKKwkJcmV0dXJuOworCW1tY19ob3N0X2Nsa19ob2xkKGhvc3QpOworCWhvc3QtPm9wcy0+aHdfcmVzZXQoaG9zdCk7CisJbW1jX2hvc3RfY2xrX3JlbGVhc2UoaG9zdCk7Cit9CisKK2ludCBtbWNfY2FuX3Jlc2V0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwl1OCByc3Rfbl9mdW5jdGlvbjsKKworCWlmICghbW1jX2NhcmRfbW1jKGNhcmQpKQorCQlyZXR1cm4gMDsKKwlyc3Rfbl9mdW5jdGlvbiA9IGNhcmQtPmV4dF9jc2QucnN0X25fZnVuY3Rpb247CisJaWYgKChyc3Rfbl9mdW5jdGlvbiAmIEVYVF9DU0RfUlNUX05fRU5fTUFTSykgIT0gRVhUX0NTRF9SU1RfTl9FTkFCTEVEKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2Nhbl9yZXNldCk7CisKK3N0YXRpYyBpbnQgbW1jX2RvX2h3X3Jlc2V0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IGNoZWNrKQoreworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IGhvc3QtPmNhcmQ7CisKKwlpZiAoIWhvc3QtPmJ1c19vcHMtPnBvd2VyX3Jlc3RvcmUpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX0hXX1JFU0VUKSB8fCAhaG9zdC0+b3BzLT5od19yZXNldCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCFjYXJkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbW1jX2Nhbl9yZXNldChjYXJkKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbW1jX2hvc3RfY2xrX2hvbGQoaG9zdCk7CisJbW1jX3NldF9jbG9jayhob3N0LCBob3N0LT5mX2luaXQpOworCisJaG9zdC0+b3BzLT5od19yZXNldChob3N0KTsKKworCS8qIElmIHRoZSByZXNldCBoYXMgaGFwcGVuZWQsIHRoZW4gYSBzdGF0dXMgY29tbWFuZCB3aWxsIGZhaWwgKi8KKwlpZiAoY2hlY2spIHsKKwkJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKKwkJaW50IGVycjsKKworCQljbWQub3Bjb2RlID0gTU1DX1NFTkRfU1RBVFVTOworCQlpZiAoIW1tY19ob3N0X2lzX3NwaShjYXJkLT5ob3N0KSkKKwkJCWNtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7CisJCWNtZC5mbGFncyA9IE1NQ19SU1BfU1BJX1IyIHwgTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CisJCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgMCk7CisJCWlmICghZXJyKSB7CisJCQltbWNfaG9zdF9jbGtfcmVsZWFzZShob3N0KTsKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CisJfQorCisJaG9zdC0+Y2FyZC0+c3RhdGUgJj0gfihNTUNfU1RBVEVfSElHSFNQRUVEIHwgTU1DX1NUQVRFX0hJR0hTUEVFRF9ERFIpOworCWlmIChtbWNfaG9zdF9pc19zcGkoaG9zdCkpIHsKKwkJaG9zdC0+aW9zLmNoaXBfc2VsZWN0ID0gTU1DX0NTX0hJR0g7CisJCWhvc3QtPmlvcy5idXNfbW9kZSA9IE1NQ19CVVNNT0RFX1BVU0hQVUxMOworCX0gZWxzZSB7CisJCWhvc3QtPmlvcy5jaGlwX3NlbGVjdCA9IE1NQ19DU19ET05UQ0FSRTsKKwkJaG9zdC0+aW9zLmJ1c19tb2RlID0gTU1DX0JVU01PREVfT1BFTkRSQUlOOworCX0KKwlob3N0LT5pb3MuYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF8xOworCWhvc3QtPmlvcy50aW1pbmcgPSBNTUNfVElNSU5HX0xFR0FDWTsKKwltbWNfc2V0X2lvcyhob3N0KTsKKworCW1tY19ob3N0X2Nsa19yZWxlYXNlKGhvc3QpOworCisJcmV0dXJuIGhvc3QtPmJ1c19vcHMtPnBvd2VyX3Jlc3RvcmUoaG9zdCk7Cit9CisKK2ludCBtbWNfaHdfcmVzZXQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXJldHVybiBtbWNfZG9faHdfcmVzZXQoaG9zdCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19od19yZXNldCk7CisKK2ludCBtbWNfaHdfcmVzZXRfY2hlY2soc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXJldHVybiBtbWNfZG9faHdfcmVzZXQoaG9zdCwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19od19yZXNldF9jaGVjayk7CisKIHN0YXRpYyBpbnQgbW1jX3Jlc2Nhbl90cnlfZnJlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGZyZXEpCiB7CiAJaG9zdC0+Zl9pbml0ID0gZnJlcTsKQEAgLTE3MzgsNiArMjAwMCwxMiBAQAogCW1tY19wb3dlcl91cChob3N0KTsKIAogCS8qCisJICogU29tZSBlTU1DcyAod2l0aCBWQ0NRIGFsd2F5cyBvbikgbWF5IG5vdCBiZSByZXNldCBhZnRlciBwb3dlciB1cCwgc28KKwkgKiBkbyBhIGhhcmR3YXJlIHJlc2V0IGlmIHBvc3NpYmxlLgorCSAqLworCW1tY19od19yZXNldF9mb3JfaW5pdChob3N0KTsKKworCS8qCiAJICogc2Rpb19yZXNldCBzZW5kcyBDTUQ1MiB0byByZXNldCBjYXJkLiAgU2luY2Ugd2UgZG8gbm90IGtub3cKIAkgKiBpZiB0aGUgY2FyZCBpcyBiZWluZyByZS1pbml0aWFsaXplZCwganVzdCBzZW5kIGl0LiAgQ01ENTIKIAkgKiBzaG91bGQgYmUgaWdub3JlZCBieSBTRC9lTU1DIGNhcmRzLgpAQCAtMTg0NSw2ICsyMTEzLDcgQEAKIAogCQltbWNfY2xhaW1faG9zdChob3N0KTsKIAkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJCW1tY19idXNfcHV0KGhvc3QpOwogCQlyZXR1cm47CkBAIC0xOTQ2LDYgKzIyMTUsNjUgQEAKIH0KIEVYUE9SVF9TWU1CT0wobW1jX2NhcmRfY2FuX3NsZWVwKTsKIAorLyoKKyAqIEZsdXNoIHRoZSBjYWNoZSB0byB0aGUgbm9uLXZvbGF0aWxlIHN0b3JhZ2UuCisgKi8KK2ludCBtbWNfZmx1c2hfY2FjaGUoc3RydWN0IG1tY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIShob3N0LT5jYXBzMiAmIE1NQ19DQVAyX0NBQ0hFX0NUUkwpKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG1tY19jYXJkX21tYyhjYXJkKSAmJgorCQkJKGNhcmQtPmV4dF9jc2QuY2FjaGVfc2l6ZSA+IDApICYmCisJCQkoY2FyZC0+ZXh0X2NzZC5jYWNoZV9jdHJsICYgMSkpIHsKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCUVYVF9DU0RfRkxVU0hfQ0FDSEUsIDEsIDApOworCQlpZiAoZXJyKQorCQkJcHJfZXJyKCIlczogY2FjaGUgZmx1c2ggZXJyb3IgJWRcbiIsCisJCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgZXJyKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbWNfZmx1c2hfY2FjaGUpOworCisvKgorICogVHVybiB0aGUgY2FjaGUgT04vT0ZGLgorICogVHVybmluZyB0aGUgY2FjaGUgT0ZGIHNoYWxsIHRyaWdnZXIgZmx1c2hpbmcgb2YgdGhlIGRhdGEKKyAqIHRvIHRoZSBub24tdm9sYXRpbGUgc3RvcmFnZS4KKyAqLworaW50IG1tY19jYWNoZV9jdHJsKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTggZW5hYmxlKQoreworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IGhvc3QtPmNhcmQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIShob3N0LT5jYXBzMiAmIE1NQ19DQVAyX0NBQ0hFX0NUUkwpIHx8CisJCQltbWNfY2FyZF9pc19yZW1vdmFibGUoaG9zdCkpCisJCXJldHVybiBlcnI7CisKKwlpZiAoY2FyZCAmJiBtbWNfY2FyZF9tbWMoY2FyZCkgJiYKKwkJCShjYXJkLT5leHRfY3NkLmNhY2hlX3NpemUgPiAwKSkgeworCQllbmFibGUgPSAhIWVuYWJsZTsKKworCQlpZiAoY2FyZC0+ZXh0X2NzZC5jYWNoZV9jdHJsIF4gZW5hYmxlKQorCQkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCQlFWFRfQ1NEX0NBQ0hFX0NUUkwsIGVuYWJsZSwgMCk7CisJCWlmIChlcnIpCisJCQlwcl9lcnIoIiVzOiBjYWNoZSAlcyBlcnJvciAlZFxuIiwKKwkJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAorCQkJCQllbmFibGUgPyAib24iIDogIm9mZiIsCisJCQkJCWVycik7CisJCWVsc2UKKwkJCWNhcmQtPmV4dF9jc2QuY2FjaGVfY3RybCA9IGVuYWJsZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbWNfY2FjaGVfY3RybCk7CisKICNpZmRlZiBDT05GSUdfUE0KIAogLyoqCkBAIC0xOTYwLDIzICsyMjg4LDM5IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhvc3QtPmRpc2FibGUpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhvc3QtPmRldGVjdCk7CiAJbW1jX2ZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZXJyID0gbW1jX2NhY2hlX2N0cmwoaG9zdCwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKIAltbWNfYnVzX2dldChob3N0KTsKIAlpZiAoaG9zdC0+YnVzX29wcyAmJiAhaG9zdC0+YnVzX2RlYWQpIHsKLQkJaWYgKGhvc3QtPmJ1c19vcHMtPnN1c3BlbmQpCi0JCQllcnIgPSBob3N0LT5idXNfb3BzLT5zdXNwZW5kKGhvc3QpOwotCQlpZiAoZXJyID09IC1FTk9TWVMgfHwgIWhvc3QtPmJ1c19vcHMtPnJlc3VtZSkgewotCQkJLyoKLQkJCSAqIFdlIHNpbXBseSAicmVtb3ZlIiB0aGUgY2FyZCBpbiB0aGlzIGNhc2UuCi0JCQkgKiBJdCB3aWxsIGJlIHJlZGV0ZWN0ZWQgb24gcmVzdW1lLgotCQkJICovCi0JCQlpZiAoaG9zdC0+YnVzX29wcy0+cmVtb3ZlKQotCQkJCWhvc3QtPmJ1c19vcHMtPnJlbW92ZShob3N0KTsKLQkJCW1tY19jbGFpbV9ob3N0KGhvc3QpOwotCQkJbW1jX2RldGFjaF9idXMoaG9zdCk7Ci0JCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwotCQkJaG9zdC0+cG1fZmxhZ3MgPSAwOwotCQkJZXJyID0gMDsKKworCQkvKgorCQkgKiBBIGxvbmcgcmVzcG9uc2UgdGltZSBpcyBub3QgYWNjZXB0YWJsZSBmb3IgZGV2aWNlIGRyaXZlcnMKKwkJICogd2hlbiBkb2luZyBzdXNwZW5kLiBQcmV2ZW50IG1tY19jbGFpbV9ob3N0IGluIHRoZSBzdXNwZW5kCisJCSAqIHNlcXVlbmNlLCB0byBwb3RlbnRpYWxseSB3YWl0ICJmb3JldmVyIiBieSB0cnlpbmcgdG8KKwkJICogcHJlLWNsYWltIHRoZSBob3N0LgorCQkgKi8KKwkJaWYgKG1tY190cnlfY2xhaW1faG9zdChob3N0KSkgeworCQkJaWYgKGhvc3QtPmJ1c19vcHMtPnN1c3BlbmQpCisJCQkJZXJyID0gaG9zdC0+YnVzX29wcy0+c3VzcGVuZChob3N0KTsKKwkJCWlmIChlcnIgPT0gLUVOT1NZUyB8fCAhaG9zdC0+YnVzX29wcy0+cmVzdW1lKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBzaW1wbHkgInJlbW92ZSIgdGhlIGNhcmQgaW4gdGhpcyBjYXNlLgorCQkJCSAqIEl0IHdpbGwgYmUgcmVkZXRlY3RlZCBvbiByZXN1bWUuCisJCQkJICovCisJCQkJaWYgKGhvc3QtPmJ1c19vcHMtPnJlbW92ZSkKKwkJCQkJaG9zdC0+YnVzX29wcy0+cmVtb3ZlKGhvc3QpOworCQkJCW1tY19jbGFpbV9ob3N0KGhvc3QpOworCQkJCW1tY19kZXRhY2hfYnVzKGhvc3QpOworCQkJCW1tY19wb3dlcl9vZmYoaG9zdCk7CisJCQkJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJCQlob3N0LT5wbV9mbGFncyA9IDA7CisJCQkJZXJyID0gMDsKKwkJCX0KKwkJCW1tY19kb19yZWxlYXNlX2hvc3QoaG9zdCk7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUJVU1k7CiAJCX0KIAl9CiAJbW1jX2J1c19wdXQoaG9zdCk7CkBAIC0xOTg0LDYgKzIzMjgsNyBAQAogCWlmICghZXJyICYmICFtbWNfY2FyZF9rZWVwX3Bvd2VyKGhvc3QpKQogCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwogCitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjAxOCw3ICsyMzYzLDcgQEAKIAkJQlVHX09OKCFob3N0LT5idXNfb3BzLT5yZXN1bWUpOwogCQllcnIgPSBob3N0LT5idXNfb3BzLT5yZXN1bWUoaG9zdCk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBlcnJvciAlZCBkdXJpbmcgcmVzdW1lICIKKwkJCXByX3dhcm5pbmcoIiVzOiBlcnJvciAlZCBkdXJpbmcgcmVzdW1lICIKIAkJCQkJICAgICIoY2FyZCB3YXMgcmVtb3ZlZD8pXG4iLAogCQkJCQkgICAgbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwogCQkJZXJyID0gMDsKQEAgLTIwNDksNiArMjM5NCw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJaG9zdC0+cmVzY2FuX2Rpc2FibGUgPSAxOworCQlob3N0LT5wb3dlcl9ub3RpZnlfdHlwZSA9IE1NQ19IT1NUX1BXX05PVElGWV9TSE9SVDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhvc3QtPmRldGVjdCk7CiAKQEAgLTIwNjEsNiArMjQwNyw3IEBACiAJCQlob3N0LT5idXNfb3BzLT5yZW1vdmUoaG9zdCk7CiAKIAkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJCWhvc3QtPnBtX2ZsYWdzID0gMDsKIAkJYnJlYWs7CkBAIC0yMDcxLDYgKzI0MTgsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCWhvc3QtPnJlc2Nhbl9kaXNhYmxlID0gMDsKKwkJaG9zdC0+cG93ZXJfbm90aWZ5X3R5cGUgPSBNTUNfSE9TVF9QV19OT1RJRllfTE9ORzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmggYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAppbmRleCBkOTQxMWVkLi4xNDY2NGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaApAQCAtNDMsNiArNDMsNyBAQAogCQkJICAgYm9vbCBjbWQxMSk7CiB2b2lkIG1tY19zZXRfdGltaW5nKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHRpbWluZyk7CiB2b2lkIG1tY19zZXRfZHJpdmVyX3R5cGUoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgZHJ2X3R5cGUpOwordm9pZCBtbWNfcG93ZXJfb2ZmKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbWNfZGVsYXkodW5zaWduZWQgaW50IG1zKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYwppbmRleCA5OTg3OTdlLi4zOTIzODgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYwpAQCAtNywxMSArNywxNCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CkBAIC0xOSw2ICsyMiwxNCBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJtbWNfb3BzLmgiCiAKKyNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAorCitzdGF0aWMgREVDTEFSRV9GQVVMVF9BVFRSKGZhaWxfZGVmYXVsdF9hdHRyKTsKK3N0YXRpYyBjaGFyICpmYWlsX3JlcXVlc3Q7Cittb2R1bGVfcGFyYW0oZmFpbF9yZXF1ZXN0LCBjaGFycCwgMCk7CisKKyNlbmRpZiAvKiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVCAqLworCiAvKiBUaGUgZGVidWdmcyBmdW5jdGlvbnMgYXJlIG9wdGltaXplZCBhd2F5IHdoZW4gQ09ORklHX0RFQlVHX0ZTIGlzbid0IHNldC4gKi8KIHN0YXRpYyBpbnQgbW1jX2lvc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKIHsKQEAgLTExMyw2ICsxMjQsMTUgQEAKIAljYXNlIE1NQ19USU1JTkdfU0RfSFM6CiAJCXN0ciA9ICJzZCBoaWdoLXNwZWVkIjsKIAkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFI1MDoKKwkJc3RyID0gInNkIHVocyBTRFI1MCI7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSMTA0OgorCQlzdHIgPSAic2QgdWhzIFNEUjEwNCI7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfRERSNTA6CisJCXN0ciA9ICJzZCB1aHMgRERSNTAiOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlzdHIgPSAiaW52YWxpZCI7CiAJCWJyZWFrOwpAQCAtMTg4LDYgKzIwOCwxNSBAQAogCQkJCXJvb3QsICZob3N0LT5jbGtfZGVsYXkpKQogCQlnb3RvIGVycl9ub2RlOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZBSUxfTU1DX1JFUVVFU1QKKwlpZiAoZmFpbF9yZXF1ZXN0KQorCQlzZXR1cF9mYXVsdF9hdHRyKCZmYWlsX2RlZmF1bHRfYXR0ciwgZmFpbF9yZXF1ZXN0KTsKKwlob3N0LT5mYWlsX21tY19yZXF1ZXN0ID0gZmFpbF9kZWZhdWx0X2F0dHI7CisJaWYgKElTX0VSUihmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsX21tY19yZXF1ZXN0IiwKKwkJCQkJICAgICByb290LAorCQkJCQkgICAgICZob3N0LT5mYWlsX21tY19yZXF1ZXN0KSkpCisJCWdvdG8gZXJyX25vZGU7CisjZW5kaWYKIAlyZXR1cm47CiAKIGVycl9ub2RlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwppbmRleCA3OTNkMGEwLi5lOGE1ZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTMwMSw2ICszMDIsMTcgQEAKIAlob3N0LT5tYXhfYmxrX3NpemUgPSA1MTI7CiAJaG9zdC0+bWF4X2Jsa19jb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAvIDUxMjsKIAorCS8qCisJICogRW5hYmxlIHJ1bnRpbWUgcG93ZXIgbWFuYWdlbWVudCBieSBkZWZhdWx0LiBUaGlzIGZsYWcgd2FzIGFkZGVkIGR1ZQorCSAqIHRvIHJ1bnRpbWUgcG93ZXIgbWFuYWdlbWVudCBjYXVzaW5nIGRpc3J1cHRpb24gZm9yIHNvbWUgdXNlcnMsIGJ1dAorCSAqIHRoZSBwb3dlciBvbi9vZmYgY29kZSBoYXMgYmVlbiBpbXByb3ZlZCBzaW5jZSB0aGVuLgorCSAqCisJICogV2UnbGwgZW5hYmxlIHRoaXMgZmxhZyBieSBkZWZhdWx0IGFzIGFuIGV4cGVyaW1lbnQsIGFuZCBpZiBubworCSAqIHByb2JsZW1zIGFyZSByZXBvcnRlZCwgd2Ugd2lsbCBmb2xsb3cgdXAgbGF0ZXIgYW5kIHJlbW92ZSB0aGUgZmxhZworCSAqIGFsdG9nZXRoZXIuCisJICovCisJaG9zdC0+Y2FwcyA9IE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQ7CisKIAlyZXR1cm4gaG9zdDsKIAogZnJlZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCmluZGV4IDU3MDBiMWMuLmRiZjQyMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTEwMSw3ICsxMDIsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhcmQgaGFzIHVua25vd24gTU1DQSB2ZXJzaW9uICVkXG4iLAorCQlwcl9lcnIoIiVzOiBjYXJkIGhhcyB1bmtub3duIE1NQ0EgdmVyc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2FyZC0+Y3NkLm1tY2FfdnNuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM1LDcgKzEzNiw3IEBACiAJICovCiAJY3NkLT5zdHJ1Y3R1cmUgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTI2LCAyKTsKIAlpZiAoY3NkLT5zdHJ1Y3R1cmUgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQlwcl9lcnIoIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjc2QtPnN0cnVjdHVyZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE5NSw3ICsxOTYsNyBAQAogCSAqLwogCWV4dF9jc2QgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFleHRfY3NkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciB0byAiCisJCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciB0byAiCiAJCQkicmVjZWl2ZSB0aGUgZXh0X2NzZC5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIxNywxMiArMjE4LDEyIEBACiAJCSAqIHN0b3JlZCBpbiB0aGVpciBDU0QuCiAJCSAqLwogCQlpZiAoY2FyZC0+Y3NkLmNhcGFjaXR5ID09ICg0MDk2ICogNTEyKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlYWQgRVhUX0NTRCAiCisJCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcmVhZCBFWFRfQ1NEICIKIAkJCQkib24gYSBwb3NzaWJsZSBoaWdoIGNhcGFjaXR5IGNhcmQuICIKIAkJCQkiQ2FyZCB3aWxsIGJlIGlnbm9yZWQuXG4iLAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHJlYWQgIgorCQkJcHJfd2FybmluZygiJXM6IHVuYWJsZSB0byByZWFkICIKIAkJCQkiRVhUX0NTRCwgcGVyZm9ybWFuY2UgbWlnaHQgIgogCQkJCSJzdWZmZXIuXG4iLAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CkBAIC0yMzksNyArMjQwLDkgQEAKICAqLwogc3RhdGljIGludCBtbWNfcmVhZF9leHRfY3NkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdTggKmV4dF9jc2QpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciA9IDAsIGlkeDsKKwl1bnNpZ25lZCBpbnQgcGFydF9zaXplOworCXU4IGhjX2VyYXNlX2dycF9zeiA9IDAsIGhjX3dwX2dycF9zeiA9IDA7CiAKIAlCVUdfT04oIWNhcmQpOwogCkBAIC0yNTAsNyArMjUzLDcgQEAKIAljYXJkLT5leHRfY3NkLnJhd19leHRfY3NkX3N0cnVjdHVyZSA9IGV4dF9jc2RbRVhUX0NTRF9TVFJVQ1RVUkVdOwogCWlmIChjYXJkLT5jc2Quc3RydWN0dXJlID09IDMpIHsKIAkJaWYgKGNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID4gMikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIEVYVF9DU0Qgc3RydWN0dXJlICIKKwkJCXByX2VycigiJXM6IHVucmVjb2duaXNlZCBFWFRfQ1NEIHN0cnVjdHVyZSAiCiAJCQkJInZlcnNpb24gJWRcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKIAkJCQkJY2FyZC0+ZXh0X2NzZC5yYXdfZXh0X2NzZF9zdHJ1Y3R1cmUpOwogCQkJZXJyID0gLUVJTlZBTDsKQEAgLTI2MCw3ICsyNjMsNyBAQAogCiAJY2FyZC0+ZXh0X2NzZC5yZXYgPSBleHRfY3NkW0VYVF9DU0RfUkVWXTsKIAlpZiAoY2FyZC0+ZXh0X2NzZC5yZXYgPiA2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXNlZCBFWFRfQ1NEIHJldmlzaW9uICVkXG4iLAorCQlwcl9lcnIoIiVzOiB1bnJlY29nbmlzZWQgRVhUX0NTRCByZXZpc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY2FyZC0+ZXh0X2NzZC5yZXYpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTMwNiw3ICszMDksNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBNTUMgdjQgc3BlYyBzYXlzIHRoaXMgY2Fubm90IGhhcHBlbiAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBpcyBtbWMgdjQgYnV0IGRvZXNuJ3QgIgorCQlwcl93YXJuaW5nKCIlczogY2FyZCBpcyBtbWMgdjQgYnV0IGRvZXNuJ3QgIgogCQkJInN1cHBvcnQgYW55IGhpZ2gtc3BlZWQgbW9kZXMuXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAl9CkBAIC0zNDAsNyArMzQzLDE0IEBACiAJCSAqIFRoZXJlIGFyZSB0d28gYm9vdCByZWdpb25zIG9mIGVxdWFsIHNpemUsIGRlZmluZWQgaW4KIAkJICogbXVsdGlwbGVzIG9mIDEyOEsuCiAJCSAqLwotCQljYXJkLT5leHRfY3NkLmJvb3Rfc2l6ZSA9IGV4dF9jc2RbRVhUX0NTRF9CT09UX01VTFRdIDw8IDE3OworCQlpZiAoZXh0X2NzZFtFWFRfQ1NEX0JPT1RfTVVMVF0gJiYgbW1jX2Jvb3RfcGFydGl0aW9uX2FjY2VzcyhjYXJkLT5ob3N0KSkgeworCQkJZm9yIChpZHggPSAwOyBpZHggPCBNTUNfTlVNX0JPT1RfUEFSVElUSU9OOyBpZHgrKykgeworCQkJCXBhcnRfc2l6ZSA9IGV4dF9jc2RbRVhUX0NTRF9CT09UX01VTFRdIDw8IDE3OworCQkJCW1tY19wYXJ0X2FkZChjYXJkLCBwYXJ0X3NpemUsCisJCQkJCUVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QwICsgaWR4LAorCQkJCQkiYm9vdCVkIiwgaWR4LCB0cnVlKTsKKwkJCX0KKwkJfQogCX0KIAogCWNhcmQtPmV4dF9jc2QucmF3X2hjX2VyYXNlX2dhcF9zaXplID0KQEAgLTM1OSwxMSArMzY5LDEyIEBACiAJCSAqIGNhcmQgaGFzIHRoZSBFbmhhbmNlZCBhcmVhIGVuYWJsZWQuICBJZiBzbywgZXhwb3J0IGVuaGFuY2VkCiAJCSAqIGFyZWEgb2Zmc2V0IGFuZCBzaXplIHRvIHVzZXIgYnkgYWRkaW5nIHN5c2ZzIGludGVyZmFjZS4KIAkJICovCisJCWNhcmQtPmV4dF9jc2QucmF3X3BhcnRpdGlvbl9zdXBwb3J0ID0gZXh0X2NzZFtFWFRfQ1NEX1BBUlRJVElPTl9TVVBQT1JUXTsKIAkJaWYgKChleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdICYgMHgyKSAmJgogCQkgICAgKGV4dF9jc2RbRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFXSAmIDB4MSkpIHsKLQkJCXU4IGhjX2VyYXNlX2dycF9zeiA9CisJCQloY19lcmFzZV9ncnBfc3ogPQogCQkJCWV4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV07Ci0JCQl1OCBoY193cF9ncnBfc3ogPQorCQkJaGNfd3BfZ3JwX3N6ID0KIAkJCQlleHRfY3NkW0VYVF9DU0RfSENfV1BfR1JQX1NJWkVdOwogCiAJCQljYXJkLT5leHRfY3NkLmVuaGFuY2VkX2FyZWFfZW4gPSAxOwpAQCAtMzkyLDYgKzQwMyw0MSBAQAogCQkJY2FyZC0+ZXh0X2NzZC5lbmhhbmNlZF9hcmVhX29mZnNldCA9IC1FSU5WQUw7CiAJCQljYXJkLT5leHRfY3NkLmVuaGFuY2VkX2FyZWFfc2l6ZSA9IC1FSU5WQUw7CiAJCX0KKworCQkvKgorCQkgKiBHZW5lcmFsIHB1cnBvc2UgcGFydGl0aW9uIGZlYXR1cmUgc3VwcG9ydCAtLQorCQkgKiBJZiBleHRfY3NkIGhhcyB0aGUgc2l6ZSBvZiBnZW5lcmFsIHB1cnBvc2UgcGFydGl0aW9ucywKKwkJICogc2V0IHNpemUsIHBhcnRfY2ZnLCBwYXJ0aXRpb24gbmFtZSBpbiBtbWNfcGFydC4KKwkJICovCisJCWlmIChleHRfY3NkW0VYVF9DU0RfUEFSVElUSU9OX1NVUFBPUlRdICYKKwkJCUVYVF9DU0RfUEFSVF9TVVBQT1JUX1BBUlRfRU4pIHsKKwkJCWlmIChjYXJkLT5leHRfY3NkLmVuaGFuY2VkX2FyZWFfZW4gIT0gMSkgeworCQkJCWhjX2VyYXNlX2dycF9zeiA9CisJCQkJCWV4dF9jc2RbRVhUX0NTRF9IQ19FUkFTRV9HUlBfU0laRV07CisJCQkJaGNfd3BfZ3JwX3N6ID0KKwkJCQkJZXh0X2NzZFtFWFRfQ1NEX0hDX1dQX0dSUF9TSVpFXTsKKworCQkJCWNhcmQtPmV4dF9jc2QuZW5oYW5jZWRfYXJlYV9lbiA9IDE7CisJCQl9CisKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTU1DX05VTV9HUF9QQVJUSVRJT047IGlkeCsrKSB7CisJCQkJaWYgKCFleHRfY3NkW0VYVF9DU0RfR1BfU0laRV9NVUxUICsgaWR4ICogM10gJiYKKwkJCQkhZXh0X2NzZFtFWFRfQ1NEX0dQX1NJWkVfTVVMVCArIGlkeCAqIDMgKyAxXSAmJgorCQkJCSFleHRfY3NkW0VYVF9DU0RfR1BfU0laRV9NVUxUICsgaWR4ICogMyArIDJdKQorCQkJCQljb250aW51ZTsKKwkJCQlwYXJ0X3NpemUgPQorCQkJCShleHRfY3NkW0VYVF9DU0RfR1BfU0laRV9NVUxUICsgaWR4ICogMyArIDJdCisJCQkJCTw8IDE2KSArCisJCQkJKGV4dF9jc2RbRVhUX0NTRF9HUF9TSVpFX01VTFQgKyBpZHggKiAzICsgMV0KKwkJCQkJPDwgOCkgKworCQkJCWV4dF9jc2RbRVhUX0NTRF9HUF9TSVpFX01VTFQgKyBpZHggKiAzXTsKKwkJCQlwYXJ0X3NpemUgKj0gKHNpemVfdCkoaGNfZXJhc2VfZ3JwX3N6ICoKKwkJCQkJaGNfd3BfZ3JwX3N6KTsKKwkJCQltbWNfcGFydF9hZGQoY2FyZCwgcGFydF9zaXplIDw8IDE5LAorCQkJCQlFWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19HUDAgKyBpZHgsCisJCQkJCSJncCVkIiwgaWR4LCBmYWxzZSk7CisJCQl9CisJCX0KIAkJY2FyZC0+ZXh0X2NzZC5zZWNfdHJpbV9tdWx0ID0KIAkJCWV4dF9jc2RbRVhUX0NTRF9TRUNfVFJJTV9NVUxUXTsKIAkJY2FyZC0+ZXh0X2NzZC5zZWNfZXJhc2VfbXVsdCA9CkBAIC00MDIsMTQgKzQ0OCw0OCBAQAogCQkJZXh0X2NzZFtFWFRfQ1NEX1RSSU1fTVVMVF07CiAJfQogCi0JaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDUpCi0JCWNhcmQtPmV4dF9jc2QucmVsX3BhcmFtID0gZXh0X2NzZFtFWFRfQ1NEX1dSX1JFTF9QQVJBTV07CisJaWYgKGNhcmQtPmV4dF9jc2QucmV2ID49IDUpIHsKKwkJLyogY2hlY2sgd2hldGhlciB0aGUgZU1NQyBjYXJkIHN1cHBvcnRzIEhQSSAqLworCQlpZiAoZXh0X2NzZFtFWFRfQ1NEX0hQSV9GRUFUVVJFU10gJiAweDEpIHsKKwkJCWNhcmQtPmV4dF9jc2QuaHBpID0gMTsKKwkJCWlmIChleHRfY3NkW0VYVF9DU0RfSFBJX0ZFQVRVUkVTXSAmIDB4MikKKwkJCQljYXJkLT5leHRfY3NkLmhwaV9jbWQgPQlNTUNfU1RPUF9UUkFOU01JU1NJT047CisJCQllbHNlCisJCQkJY2FyZC0+ZXh0X2NzZC5ocGlfY21kID0gTU1DX1NFTkRfU1RBVFVTOworCQkJLyoKKwkJCSAqIEluZGljYXRlIHRoZSBtYXhpbXVtIHRpbWVvdXQgdG8gY2xvc2UKKwkJCSAqIGEgY29tbWFuZCBpbnRlcnJ1cHRlZCBieSBIUEkKKwkJCSAqLworCQkJY2FyZC0+ZXh0X2NzZC5vdXRfb2ZfaW50X3RpbWUgPQorCQkJCWV4dF9jc2RbRVhUX0NTRF9PVVRfT0ZfSU5URVJSVVBUX1RJTUVdICogMTA7CisJCX0KIAorCQljYXJkLT5leHRfY3NkLnJlbF9wYXJhbSA9IGV4dF9jc2RbRVhUX0NTRF9XUl9SRUxfUEFSQU1dOworCQljYXJkLT5leHRfY3NkLnJzdF9uX2Z1bmN0aW9uID0gZXh0X2NzZFtFWFRfQ1NEX1JTVF9OX0ZVTkNUSU9OXTsKKwl9CisKKwljYXJkLT5leHRfY3NkLnJhd19lcmFzZWRfbWVtX2NvdW50ID0gZXh0X2NzZFtFWFRfQ1NEX0VSQVNFRF9NRU1fQ09OVF07CiAJaWYgKGV4dF9jc2RbRVhUX0NTRF9FUkFTRURfTUVNX0NPTlRdKQogCQljYXJkLT5lcmFzZWRfYnl0ZSA9IDB4RkY7CiAJZWxzZQogCQljYXJkLT5lcmFzZWRfYnl0ZSA9IDB4MDsKIAorCS8qIGVNTUMgdjQuNSBvciBsYXRlciAqLworCWlmIChjYXJkLT5leHRfY3NkLnJldiA+PSA2KSB7CisJCWNhcmQtPmV4dF9jc2QuZmVhdHVyZV9zdXBwb3J0IHw9IE1NQ19ESVNDQVJEX0ZFQVRVUkU7CisKKwkJY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSA9IDEwICoKKwkJCWV4dF9jc2RbRVhUX0NTRF9HRU5FUklDX0NNRDZfVElNRV07CisJCWNhcmQtPmV4dF9jc2QucG93ZXJfb2ZmX2xvbmd0aW1lID0gMTAgKgorCQkJZXh0X2NzZFtFWFRfQ1NEX1BPV0VSX09GRl9MT05HX1RJTUVdOworCisJCWNhcmQtPmV4dF9jc2QuY2FjaGVfc2l6ZSA9CisJCQlleHRfY3NkW0VYVF9DU0RfQ0FDSEVfU0laRSArIDBdIDw8IDAgfAorCQkJZXh0X2NzZFtFWFRfQ1NEX0NBQ0hFX1NJWkUgKyAxXSA8PCA4IHwKKwkJCWV4dF9jc2RbRVhUX0NTRF9DQUNIRV9TSVpFICsgMl0gPDwgMTYgfAorCQkJZXh0X2NzZFtFWFRfQ1NEX0NBQ0hFX1NJWkUgKyAzXSA8PCAyNDsKKwl9CisKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTMwLDYgKzYxMCw4NiBAQAogfTsKIAogLyoKKyAqIFNlbGVjdCB0aGUgUG93ZXJDbGFzcyBmb3IgdGhlIGN1cnJlbnQgYnVzIHdpZHRoCisgKiBJZiBwb3dlciBjbGFzcyBpcyBkZWZpbmVkIGZvciA0LzggYml0IGJ1cyBpbiB0aGUKKyAqIGV4dGVuZGVkIENTRCByZWdpc3Rlciwgc2VsZWN0IGl0IGJ5IGV4ZWN1dGluZyB0aGUKKyAqIG1tY19zd2l0Y2ggY29tbWFuZC4KKyAqLworc3RhdGljIGludCBtbWNfc2VsZWN0X3Bvd2VyY2xhc3Moc3RydWN0IG1tY19jYXJkICpjYXJkLAorCQl1bnNpZ25lZCBpbnQgYnVzX3dpZHRoLCB1OCAqZXh0X2NzZCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBpbnQgcHdyY2xhc3NfdmFsOworCXVuc2lnbmVkIGludCBpbmRleCA9IDA7CisJc3RydWN0IG1tY19ob3N0ICpob3N0OworCisJQlVHX09OKCFjYXJkKTsKKworCWhvc3QgPSBjYXJkLT5ob3N0OworCUJVR19PTighaG9zdCk7CisKKwlpZiAoZXh0X2NzZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIFBvd2VyIGNsYXNzIHNlbGVjdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIHZlcnNpb25zID49IDQuMCAqLworCWlmIChjYXJkLT5jc2QubW1jYV92c24gPCBDU0RfU1BFQ19WRVJfNCkKKwkJcmV0dXJuIDA7CisKKwkvKiBQb3dlciBjbGFzcyB2YWx1ZXMgYXJlIGRlZmluZWQgb25seSBmb3IgNC84IGJpdCBidXMgKi8KKwlpZiAoYnVzX3dpZHRoID09IEVYVF9DU0RfQlVTX1dJRFRIXzEpCisJCXJldHVybiAwOworCisJc3dpdGNoICgxIDw8IGhvc3QtPmlvcy52ZGQpIHsKKwljYXNlIE1NQ19WRERfMTY1XzE5NToKKwkJaWYgKGhvc3QtPmlvcy5jbG9jayA8PSAyNjAwMDAwMCkKKwkJCWluZGV4ID0gRVhUX0NTRF9QV1JfQ0xfMjZfMTk1OworCQllbHNlIGlmCShob3N0LT5pb3MuY2xvY2sgPD0gNTIwMDAwMDApCisJCQlpbmRleCA9IChidXNfd2lkdGggPD0gRVhUX0NTRF9CVVNfV0lEVEhfOCkgPworCQkJCUVYVF9DU0RfUFdSX0NMXzUyXzE5NSA6CisJCQkJRVhUX0NTRF9QV1JfQ0xfRERSXzUyXzE5NTsKKwkJZWxzZSBpZiAoaG9zdC0+aW9zLmNsb2NrIDw9IDIwMDAwMDAwMCkKKwkJCWluZGV4ID0gRVhUX0NTRF9QV1JfQ0xfMjAwXzE5NTsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVkREXzMyXzMzOgorCWNhc2UgTU1DX1ZERF8zM18zNDoKKwljYXNlIE1NQ19WRERfMzRfMzU6CisJY2FzZSBNTUNfVkREXzM1XzM2OgorCQlpZiAoaG9zdC0+aW9zLmNsb2NrIDw9IDI2MDAwMDAwKQorCQkJaW5kZXggPSBFWFRfQ1NEX1BXUl9DTF8yNl8zNjA7CisJCWVsc2UgaWYJKGhvc3QtPmlvcy5jbG9jayA8PSA1MjAwMDAwMCkKKwkJCWluZGV4ID0gKGJ1c193aWR0aCA8PSBFWFRfQ1NEX0JVU19XSURUSF84KSA/CisJCQkJRVhUX0NTRF9QV1JfQ0xfNTJfMzYwIDoKKwkJCQlFWFRfQ1NEX1BXUl9DTF9ERFJfNTJfMzYwOworCQllbHNlIGlmIChob3N0LT5pb3MuY2xvY2sgPD0gMjAwMDAwMDAwKQorCQkJaW5kZXggPSBFWFRfQ1NEX1BXUl9DTF8yMDBfMzYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl93YXJuaW5nKCIlczogVm9sdGFnZSByYW5nZSBub3Qgc3VwcG9ydGVkICIKKwkJCSAgICJmb3IgcG93ZXIgY2xhc3MuXG4iLCBtbWNfaG9zdG5hbWUoaG9zdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwd3JjbGFzc192YWwgPSBleHRfY3NkW2luZGV4XTsKKworCWlmIChidXNfd2lkdGggJiAoRVhUX0NTRF9CVVNfV0lEVEhfOCB8IEVYVF9DU0RfRERSX0JVU19XSURUSF84KSkKKwkJcHdyY2xhc3NfdmFsID0gKHB3cmNsYXNzX3ZhbCAmIEVYVF9DU0RfUFdSX0NMXzhCSVRfTUFTSykgPj4KKwkJCQlFWFRfQ1NEX1BXUl9DTF84QklUX1NISUZUOworCWVsc2UKKwkJcHdyY2xhc3NfdmFsID0gKHB3cmNsYXNzX3ZhbCAmIEVYVF9DU0RfUFdSX0NMXzRCSVRfTUFTSykgPj4KKwkJCQlFWFRfQ1NEX1BXUl9DTF80QklUX1NISUZUOworCisJLyogSWYgdGhlIHBvd2VyIGNsYXNzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlICovCisJaWYgKHB3cmNsYXNzX3ZhbCA+IDApIHsKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCSBFWFRfQ1NEX1BPV0VSX0NMQVNTLAorCQkJCSBwd3JjbGFzc192YWwsCisJCQkJIGNhcmQtPmV4dF9jc2QuZ2VuZXJpY19jbWQ2X3RpbWUpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qCiAgKiBIYW5kbGUgdGhlIGRldGVjdGlvbiBhbmQgaW5pdGlhbGlzYXRpb24gb2YgYSBjYXJkLgogICoKICAqIEluIHRoZSBjYXNlIG9mIGEgcmVzdW1lLCAib2xkY2FyZCIgd2lsbCBjb250YWluIHRoZSBjYXJkCkBAIC01NDgsMTEgKzcwOCwxNiBAQAogCUJVR19PTighaG9zdCk7CiAJV0FSTl9PTighaG9zdC0+Y2xhaW1lZCk7CiAKKwkvKiBTZXQgY29ycmVjdCBidXMgbW9kZSBmb3IgTU1DIGJlZm9yZSBhdHRlbXB0aW5nIGluaXQgKi8KKwlpZiAoIW1tY19ob3N0X2lzX3NwaShob3N0KSkKKwkJbW1jX3NldF9idXNfbW9kZShob3N0LCBNTUNfQlVTTU9ERV9PUEVORFJBSU4pOworCiAJLyoKIAkgKiBTaW5jZSB3ZSdyZSBjaGFuZ2luZyB0aGUgT0NSIHZhbHVlLCB3ZSBzZWVtIHRvCiAJICogbmVlZCB0byB0ZWxsIHNvbWUgY2FyZHMgdG8gZ28gYmFjayB0byB0aGUgaWRsZQogCSAqIHN0YXRlLiAgV2Ugd2FpdCAxbXMgdG8gZ2l2ZSBjYXJkcyB0aW1lIHRvCiAJICogcmVzcG9uZC4KKwkgKiBtbWNfZ29faWRsZSBpcyBuZWVkZWQgZm9yIGVNTUMgdGhhdCBhcmUgYXNsZWVwCiAJICovCiAJbW1jX2dvX2lkbGUoaG9zdCk7CiAKQEAgLTY2OCw3ICs4MzMsOCBAQAogCSAqLwogCWlmIChjYXJkLT5leHRfY3NkLmVuaGFuY2VkX2FyZWFfZW4pIHsKIAkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAotCQkJCSBFWFRfQ1NEX0VSQVNFX0dST1VQX0RFRiwgMSwgMCk7CisJCQkJIEVYVF9DU0RfRVJBU0VfR1JPVVBfREVGLCAxLAorCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKIAogCQlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKIAkJCWdvdG8gZnJlZV9jYXJkOwpAQCAtNzA2LDE3ICs4NzIsMzUgQEAKIAl9CiAKIAkvKgorCSAqIElmIHRoZSBob3N0IHN1cHBvcnRzIHRoZSBwb3dlcl9vZmZfbm90aWZ5IGNhcGFiaWxpdHkgdGhlbgorCSAqIHNldCB0aGUgbm90aWZpY2F0aW9uIGJ5dGUgaW4gdGhlIGV4dF9jc2QgcmVnaXN0ZXIgb2YgZGV2aWNlCisJICovCisJaWYgKChob3N0LT5jYXBzMiAmIE1NQ19DQVAyX1BPV0VST0ZGX05PVElGWSkgJiYKKwkgICAgKGNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9PSBNTUNfTk9fUE9XRVJfTk9USUZJQ0FUSU9OKSkgeworCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJIEVYVF9DU0RfUE9XRVJfT0ZGX05PVElGSUNBVElPTiwKKwkJCQkgRVhUX0NTRF9QT1dFUl9PTiwKKwkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQorCQkJZ290byBmcmVlX2NhcmQ7CisJfQorCisJaWYgKCFlcnIpCisJCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19QT1dFUkVEX09OOworCisJLyoKIAkgKiBBY3RpdmF0ZSBoaWdoIHNwZWVkIChpZiBzdXBwb3J0ZWQpCiAJICovCiAJaWYgKChjYXJkLT5leHRfY3NkLmhzX21heF9kdHIgIT0gMCkgJiYKIAkJKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX01NQ19ISUdIU1BFRUQpKSB7CiAJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKLQkJCQkgRVhUX0NTRF9IU19USU1JTkcsIDEsIDApOworCQkJCSBFWFRfQ1NEX0hTX1RJTUlORywgMSwKKwkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CiAJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQkJZ290byBmcmVlX2NhcmQ7CiAKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN3aXRjaCB0byBoaWdoc3BlZWQgZmFpbGVkXG4iLAorCQkJcHJfd2FybmluZygiJXM6IHN3aXRjaCB0byBoaWdoc3BlZWQgZmFpbGVkXG4iLAogCQkJICAgICAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCQllcnIgPSAwOwogCQl9IGVsc2UgewpAQCAtNzI2LDYgKzkxMCwyMiBAQAogCX0KIAogCS8qCisJICogRW5hYmxlIEhQSSBmZWF0dXJlIChpZiBzdXBwb3J0ZWQpCisJICovCisJaWYgKGNhcmQtPmV4dF9jc2QuaHBpKSB7CisJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCUVYVF9DU0RfSFBJX01HTVQsIDEsIDApOworCQlpZiAoZXJyICYmIGVyciAhPSAtRUJBRE1TRykKKwkJCWdvdG8gZnJlZV9jYXJkOworCQlpZiAoZXJyKSB7CisJCQlwcl93YXJuaW5nKCIlczogRW5hYmxpbmcgSFBJIGZhaWxlZFxuIiwKKwkJCQkgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQljYXJkLT5leHRfY3NkLmhwaV9lbiA9IDE7CisJfQorCisJLyoKIAkgKiBDb21wdXRlIGJ1cyBzcGVlZC4KIAkgKi8KIAltYXhfZHRyID0gKHVuc2lnbmVkIGludCktMTsKQEAgLTc4MCwxMCArOTgwLDE4IEBACiAJCQlidXNfd2lkdGggPSBidXNfd2lkdGhzW2lkeF07CiAJCQlpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfMSkKIAkJCQlkZHIgPSAwOyAvKiBubyBERFIgZm9yIDEtYml0IHdpZHRoICovCisJCQllcnIgPSBtbWNfc2VsZWN0X3Bvd2VyY2xhc3MoY2FyZCwgZXh0X2NzZF9iaXRzW2lkeF1bMF0sCisJCQkJCQkgICAgZXh0X2NzZCk7CisJCQlpZiAoZXJyKQorCQkJCXByX2VycigiJXM6IHBvd2VyIGNsYXNzIHNlbGVjdGlvbiB0byAiCisJCQkJICAgICAgICJidXMgd2lkdGggJWQgZmFpbGVkXG4iLAorCQkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCisJCQkJICAgICAgIDEgPDwgYnVzX3dpZHRoKTsKKwogCQkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAogCQkJCQkgRVhUX0NTRF9CVVNfV0lEVEgsCiAJCQkJCSBleHRfY3NkX2JpdHNbaWR4XVswXSwKLQkJCQkJIDApOworCQkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CiAJCQlpZiAoIWVycikgewogCQkJCW1tY19zZXRfYnVzX3dpZHRoKGNhcmQtPmhvc3QsIGJ1c193aWR0aCk7CiAKQEAgLTgwMywxMyArMTAxMSwyMSBAQAogCQl9CiAKIAkJaWYgKCFlcnIgJiYgZGRyKSB7CisJCQllcnIgPSBtbWNfc2VsZWN0X3Bvd2VyY2xhc3MoY2FyZCwgZXh0X2NzZF9iaXRzW2lkeF1bMV0sCisJCQkJCQkgICAgZXh0X2NzZCk7CisJCQlpZiAoZXJyKQorCQkJCXByX2VycigiJXM6IHBvd2VyIGNsYXNzIHNlbGVjdGlvbiB0byAiCisJCQkJICAgICAgICJidXMgd2lkdGggJWQgZGRyICVkIGZhaWxlZFxuIiwKKwkJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAorCQkJCSAgICAgICAxIDw8IGJ1c193aWR0aCwgZGRyKTsKKwogCQkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAogCQkJCQkgRVhUX0NTRF9CVVNfV0lEVEgsCiAJCQkJCSBleHRfY3NkX2JpdHNbaWR4XVsxXSwKLQkJCQkJIDApOworCQkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CiAJCX0KIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN3aXRjaCB0byBidXMgd2lkdGggJWQgZGRyICVkICIKKwkJCXByX3dhcm5pbmcoIiVzOiBzd2l0Y2ggdG8gYnVzIHdpZHRoICVkIGRkciAlZCAiCiAJCQkJImZhaWxlZFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAogCQkJCTEgPDwgYnVzX3dpZHRoLCBkZHIpOwogCQkJZ290byBmcmVlX2NhcmQ7CkBAIC04NDAsNiArMTA1NiwyMyBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBJZiBjYWNoZSBzaXplIGlzIGhpZ2hlciB0aGFuIDAsIHRoaXMgaW5kaWNhdGVzCisJICogdGhlIGV4aXN0ZW5jZSBvZiBjYWNoZSBhbmQgaXQgY2FuIGJlIHR1cm5lZCBvbi4KKwkgKi8KKwlpZiAoKGhvc3QtPmNhcHMyICYgTU1DX0NBUDJfQ0FDSEVfQ1RSTCkgJiYKKwkJCWNhcmQtPmV4dF9jc2QuY2FjaGVfc2l6ZSA+IDApIHsKKwkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCUVYVF9DU0RfQ0FDSEVfQ1RSTCwgMSwgMCk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQorCQkJZ290byBmcmVlX2NhcmQ7CisKKwkJLyoKKwkJICogT25seSBpZiBubyBlcnJvciwgY2FjaGUgaXMgdHVybmVkIG9uIHN1Y2Nlc3NmdWxseS4KKwkJICovCisJCWNhcmQtPmV4dF9jc2QuY2FjaGVfY3RybCA9IGVyciA/IDAgOiAxOworCX0KKwogCWlmICghb2xkY2FyZCkKIAkJaG9zdC0+Y2FyZCA9IGNhcmQ7CiAKQEAgLTg5MSw2ICsxMTI0LDcgQEAKIAogCQltbWNfY2xhaW1faG9zdChob3N0KTsKIAkJbW1jX2RldGFjaF9idXMoaG9zdCk7CisJCW1tY19wb3dlcl9vZmYoaG9zdCk7CiAJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJfQogfQpAQCAtOTAwLDE2ICsxMTM0LDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgbW1jX3N1c3BlbmQoc3RydWN0IG1tY19ob3N0ICpob3N0KQogeworCWludCBlcnIgPSAwOworCiAJQlVHX09OKCFob3N0KTsKIAlCVUdfT04oIWhvc3QtPmNhcmQpOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0JaWYgKCFtbWNfaG9zdF9pc19zcGkoaG9zdCkpCisJaWYgKG1tY19jYXJkX2Nhbl9zbGVlcChob3N0KSkKKwkJZXJyID0gbW1jX2NhcmRfc2xlZXAoaG9zdCk7CisJZWxzZSBpZiAoIW1tY19ob3N0X2lzX3NwaShob3N0KSkKIAkJbW1jX2Rlc2VsZWN0X2NhcmRzKGhvc3QpOwogCWhvc3QtPmNhcmQtPnN0YXRlICY9IH5NTUNfU1RBVEVfSElHSFNQRUVEOwogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTAxNiw2ICsxMjU0LDEwIEBACiAJQlVHX09OKCFob3N0KTsKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIAorCS8qIFNldCBjb3JyZWN0IGJ1cyBtb2RlIGZvciBNTUMgYmVmb3JlIGF0dGVtcHRpbmcgYXR0YWNoICovCisJaWYgKCFtbWNfaG9zdF9pc19zcGkoaG9zdCkpCisJCW1tY19zZXRfYnVzX21vZGUoaG9zdCwgTU1DX0JVU01PREVfT1BFTkRSQUlOKTsKKwogCWVyciA9IG1tY19zZW5kX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTEwMzgsNyArMTI4MCw3IEBACiAJICogc3VwcG9ydC4KIAkgKi8KIAlpZiAob2NyICYgMHg3RikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBjbGFpbXMgdG8gc3VwcG9ydCB2b2x0YWdlcyAiCisJCXByX3dhcm5pbmcoIiVzOiBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2VzICIKIAkJICAgICAgICJiZWxvdyB0aGUgZGVmaW5lZCByYW5nZS4gVGhlc2Ugd2lsbCBiZSBpZ25vcmVkLlxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0KSk7CiAJCW9jciAmPSB+MHg3RjsKQEAgLTEwNzcsNyArMTMxOSw3IEBACiBlcnI6CiAJbW1jX2RldGFjaF9idXMoaG9zdCk7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIE1NQyBjYXJkXG4iLAorCXByX2VycigiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgTU1DIGNhcmRcbiIsCiAJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCmluZGV4IDc3MGMzZDAuLjRkNDFmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKQEAgLTIzMyw3ICsyMzQsNyBAQAogbW1jX3NlbmRfY3hkX2RhdGEoc3RydWN0IG1tY19jYXJkICpjYXJkLCBzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCiAJCXUzMiBvcGNvZGUsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTQxNCw3ICs0MTUsNyBAQAogCQkJcmV0dXJuIC1FQkFETVNHOwogCX0gZWxzZSB7CiAJCWlmIChzdGF0dXMgJiAweEZERkZBMDAwKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgc3RhdHVzICUjeCBhZnRlciAiCisJCQlwcl93YXJuaW5nKCIlczogdW5leHBlY3RlZCBzdGF0dXMgJSN4IGFmdGVyICIKIAkJCSAgICAgICAic3dpdGNoIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzICYgUjFfU1dJVENIX0VSUk9SKQogCQkJcmV0dXJuIC1FQkFETVNHOwpAQCAtNDU0LDcgKzQ1NSw3IEBACiBtbWNfc2VuZF9idXNfdGVzdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTggb3Bjb2RlLAogCQkgIHU4IGxlbikKIHsKLQlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0gezB9OworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7TlVMTH07CiAJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKIAlzdHJ1Y3QgbW1jX2RhdGEgZGF0YSA9IHswfTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CkBAIC00NzYsNyArNDc3LDcgQEAKIAllbHNlIGlmIChsZW4gPT0gNCkKIAkJdGVzdF9idWYgPSB0ZXN0ZGF0YV80Yml0OwogCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGJ1c193aWR0aCAlZFxuIiwKKwkJcHJfZXJyKCIlczogSW52YWxpZCBidXNfd2lkdGggJWRcbiIsCiAJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdCksIGxlbik7CiAJCWtmcmVlKGRhdGFfYnVmKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01NDcsMyArNTQ4LDM0IEBACiAJZXJyID0gbW1jX3NlbmRfYnVzX3Rlc3QoY2FyZCwgY2FyZC0+aG9zdCwgTU1DX0JVU19URVNUX1IsIHdpZHRoKTsKIAlyZXR1cm4gZXJyOwogfQorCitpbnQgbW1jX3NlbmRfaHBpX2NtZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHUzMiAqc3RhdHVzKQoreworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQgPSB7MH07CisJdW5zaWduZWQgaW50IG9wY29kZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IGVycjsKKworCW9wY29kZSA9IGNhcmQtPmV4dF9jc2QuaHBpX2NtZDsKKwlpZiAob3Bjb2RlID09IE1NQ19TVE9QX1RSQU5TTUlTU0lPTikKKwkJZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKKwllbHNlIGlmIChvcGNvZGUgPT0gTU1DX1NFTkRfU1RBVFVTKQorCQlmbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOworCisJY21kLm9wY29kZSA9IG9wY29kZTsKKwljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2IHwgMTsKKwljbWQuZmxhZ3MgPSBmbGFnczsKKwljbWQuY21kX3RpbWVvdXRfbXMgPSBjYXJkLT5leHRfY3NkLm91dF9vZl9pbnRfdGltZTsKKworCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoY2FyZC0+aG9zdCwgJmNtZCwgMCk7CisJaWYgKGVycikgeworCQlwcl93YXJuKCIlczogZXJyb3IgJWQgaW50ZXJydXB0aW5nIG9wZXJhdGlvbi4gIgorCQkJIkhQSSBjb21tYW5kIHJlc3BvbnNlICUjeFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAorCQkJZXJyLCBjbWQucmVzcFswXSk7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChzdGF0dXMpCisJCSpzdGF0dXMgPSBjbWQucmVzcFswXTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmggYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaAppbmRleCA5Mjc2OTQ2Li4zZGQ4OTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaApAQCAtMjYsNiArMjYsNyBAQAogaW50IG1tY19zcGlfc2V0X2NyYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIGludCB1c2VfY3JjKTsKIGludCBtbWNfY2FyZF9zbGVlcGF3YWtlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IHNsZWVwKTsKIGludCBtbWNfYnVzX3Rlc3Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCBidXNfd2lkdGgpOworaW50IG1tY19zZW5kX2hwaV9jbWQoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1MzIgKnN0YXR1cyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1aXJrcy5jIGIvZHJpdmVycy9tbWMvY29yZS9xdWlya3MuYwppbmRleCAzYTU5NjIxLi4wNmVlMWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVpcmtzLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KIAogI2lmbmRlZiBTRElPX1ZFTkRPUl9JRF9USQpAQCAtMjEsNiArMjIsMTQgQEAKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxCTB4NDA3NgogI2VuZGlmCiAKKyNpZm5kZWYgU0RJT19WRU5ET1JfSURfU1RFCisjZGVmaW5lIFNESU9fVkVORE9SX0lEX1NURQkJMHgwMDIwCisjZW5kaWYKKworI2lmbmRlZiBTRElPX0RFVklDRV9JRF9TVEVfQ1cxMjAwCisjZGVmaW5lIFNESU9fREVWSUNFX0lEX1NURV9DVzEyMDAJMHgyMjgwCisjZW5kaWYKKwogLyoKICAqIFRoaXMgaG9vayBqdXN0IGFkZHMgYSBxdWlyayBmb3IgYWxsIHNkaW8gZGV2aWNlcwogICovCkBAIC00Niw2ICs1NSw5IEBACiAJU0RJT19GSVhVUChTRElPX1ZFTkRPUl9JRF9USSwgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxLAogCQkgICBhZGRfcXVpcmssIE1NQ19RVUlSS19ESVNBQkxFX0NEKSwKIAorCVNESU9fRklYVVAoU0RJT19WRU5ET1JfSURfU1RFLCBTRElPX0RFVklDRV9JRF9TVEVfQ1cxMjAwLAorCQkgICBhZGRfcXVpcmssIE1NQ19RVUlSS19CUk9LRU5fQllURV9NT0RFXzUxMiksCisKIAlFTkRfRklYVVAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwppbmRleCAwMzcwZTAzLi5mMmEwNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtMTYzLDcgKzE2NCw3IEBACiAJCWNzZC0+ZXJhc2Vfc2l6ZSA9IDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXNlZCBDU0Qgc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCisJCXByX2VycigiJXM6IHVucmVjb2duaXNlZCBDU0Qgc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNzZF9zdHJ1Y3QpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xODcsNyArMTg4LDcgQEAKIAogCXNjcl9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgNjAsIDQpOwogCWlmIChzY3Jfc3RydWN0ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIFNDUiBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJcHJfZXJyKCIlczogdW5yZWNvZ25pc2VkIFNDUiBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgc2NyX3N0cnVjdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIxOCw3ICsyMTksNyBAQAogCXUzMiAqc3NyOwogCiAJaWYgKCEoY2FyZC0+Y3NkLmNtZGNsYXNzICYgQ0NDX0FQUF9TUEVDKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBsYWNrcyBtYW5kYXRvcnkgU0QgU3RhdHVzICIKKwkJcHJfd2FybmluZygiJXM6IGNhcmQgbGFja3MgbWFuZGF0b3J5IFNEIFN0YXR1cyAiCiAJCQkiZnVuY3Rpb24uXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMjksNyArMjMwLDcgQEAKIAogCWVyciA9IG1tY19hcHBfc2Rfc3RhdHVzKGNhcmQsIHNzcik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcHJvYmxlbSByZWFkaW5nIFNEIFN0YXR1cyAiCisJCXByX3dhcm5pbmcoIiVzOiBwcm9ibGVtIHJlYWRpbmcgU0QgU3RhdHVzICIKIAkJCSJyZWdpc3Rlci5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCWVyciA9IDA7CiAJCWdvdG8gb3V0OwpAQCAtMjUzLDcgKzI1NCw3IEBACiAJCQljYXJkLT5zc3IuZXJhc2Vfb2Zmc2V0ID0gZW8gKiAxMDAwOwogCQl9CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNEIFN0YXR1czogSW52YWxpZCBBbGxvY2F0aW9uIFVuaXQgIgorCQlwcl93YXJuaW5nKCIlczogU0QgU3RhdHVzOiBJbnZhbGlkIEFsbG9jYXRpb24gVW5pdCAiCiAJCQkic2l6ZS5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJfQogb3V0OgpAQCAtMjczLDcgKzI3NCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKCEoY2FyZC0+Y3NkLmNtZGNsYXNzICYgQ0NDX1NXSVRDSCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhcmQgbGFja3MgbWFuZGF0b3J5IHN3aXRjaCAiCisJCXByX3dhcm5pbmcoIiVzOiBjYXJkIGxhY2tzIG1hbmRhdG9yeSBzd2l0Y2ggIgogCQkJImZ1bmN0aW9uLCBwZXJmb3JtYW5jZSBtaWdodCBzdWZmZXIuXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJcmV0dXJuIDA7CkBAIC0yODMsNyArMjg0LDcgQEAKIAogCXN0YXR1cyA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOwogCWlmICghc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgorCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yICIKIAkJCSJzd2l0Y2ggY2FwYWJpbGl0aWVzLlxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjk5LDEzICszMDAsMTYgQEAKIAkJaWYgKGVyciAhPSAtRUlOVkFMICYmIGVyciAhPSAtRU5PU1lTICYmIGVyciAhPSAtRUZBVUxUKQogCQkJZ290byBvdXQ7CiAKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHByb2JsZW0gcmVhZGluZyBCdXMgU3BlZWQgbW9kZXMuXG4iLAorCQlwcl93YXJuaW5nKCIlczogcHJvYmxlbSByZWFkaW5nIEJ1cyBTcGVlZCBtb2Rlcy5cbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQllcnIgPSAwOwogCiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChzdGF0dXNbMTNdICYgVUhTX1NEUjUwX0JVU19TUEVFRCkKKwkJY2FyZC0+c3dfY2Fwcy5oc19tYXhfZHRyID0gNTAwMDAwMDA7CisKIAlpZiAoY2FyZC0+c2NyLnNkYV9zcGVjMykgewogCQljYXJkLT5zd19jYXBzLnNkM19idXNfbW9kZSA9IHN0YXR1c1sxM107CiAKQEAgLTMxOSw3ICszMjMsNyBAQAogCQkJaWYgKGVyciAhPSAtRUlOVkFMICYmIGVyciAhPSAtRU5PU1lTICYmIGVyciAhPSAtRUZBVUxUKQogCQkJCWdvdG8gb3V0OwogCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcHJvYmxlbSByZWFkaW5nICIKKwkJCXByX3dhcm5pbmcoIiVzOiBwcm9ibGVtIHJlYWRpbmcgIgogCQkJCSJEcml2ZXIgU3RyZW5ndGguXG4iLAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCQllcnIgPSAwOwpAQCAtMzM5LDcgKzM0Myw3IEBACiAJCQlpZiAoZXJyICE9IC1FSU5WQUwgJiYgZXJyICE9IC1FTk9TWVMgJiYgZXJyICE9IC1FRkFVTFQpCiAJCQkJZ290byBvdXQ7CiAKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwcm9ibGVtIHJlYWRpbmcgIgorCQkJcHJfd2FybmluZygiJXM6IHByb2JsZW0gcmVhZGluZyAiCiAJCQkJIkN1cnJlbnQgTGltaXQuXG4iLAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCQllcnIgPSAwOwpAQCAtMzQ4LDkgKzM1Miw2IEBACiAJCX0KIAogCQljYXJkLT5zd19jYXBzLnNkM19jdXJyX2xpbWl0ID0gc3RhdHVzWzddOwotCX0gZWxzZSB7Ci0JCWlmIChzdGF0dXNbMTNdICYgMHgwMikKLQkJCWNhcmQtPnN3X2NhcHMuaHNfbWF4X2R0ciA9IDUwMDAwMDAwOwogCX0KIAogb3V0OgpAQCAtMzgzLDcgKzM4NCw3IEBACiAKIAlzdGF0dXMgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yICIKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciAiCiAJCQkic3dpdGNoIGNhcGFiaWxpdGllcy5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM5Myw3ICszOTQsNyBAQAogCQlnb3RvIG91dDsKIAogCWlmICgoc3RhdHVzWzE2XSAmIDB4RikgIT0gMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSBzd2l0Y2hpbmcgY2FyZCAiCisJCXByX3dhcm5pbmcoIiVzOiBQcm9ibGVtIHN3aXRjaGluZyBjYXJkICIKIAkJCSJpbnRvIGhpZ2gtc3BlZWQgbW9kZSFcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQllcnIgPSAwOwpAQCAtNDU5LDcgKzQ2MCw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlpZiAoKHN0YXR1c1sxNV0gJiAweEYpICE9IGRyaXZlX3N0cmVuZ3RoKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9ibGVtIHNldHRpbmcgZHJpdmUgc3RyZW5ndGghXG4iLAorCQlwcl93YXJuaW5nKCIlczogUHJvYmxlbSBzZXR0aW5nIGRyaXZlIHN0cmVuZ3RoIVxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTUzOCw3ICs1MzksNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKChzdGF0dXNbMTZdICYgMHhGKSAhPSBjYXJkLT5zZF9idXNfc3BlZWQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9ibGVtIHNldHRpbmcgYnVzIHNwZWVkIG1vZGUhXG4iLAorCQlwcl93YXJuaW5nKCIlczogUHJvYmxlbSBzZXR0aW5nIGJ1cyBzcGVlZCBtb2RlIVxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJZWxzZSB7CiAJCW1tY19zZXRfdGltaW5nKGNhcmQtPmhvc3QsIHRpbWluZyk7CkBAIC02MDAsNyArNjAxLDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWlmICgoKHN0YXR1c1sxNV0gPj4gNCkgJiAweDBGKSAhPSBjdXJyZW50X2xpbWl0KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSBzZXR0aW5nIGN1cnJlbnQgbGltaXQhXG4iLAorCQlwcl93YXJuaW5nKCIlczogUHJvYmxlbSBzZXR0aW5nIGN1cnJlbnQgbGltaXQhXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAogCXJldHVybiAwOwpAQCAtNjIyLDcgKzYyMyw3IEBACiAKIAlzdGF0dXMgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yICIKKwkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIGZvciAiCiAJCQkic3dpdGNoIGNhcGFiaWxpdGllcy5cbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTg1Miw3ICs4NTMsNyBAQAogCQkJcm8gPSBob3N0LT5vcHMtPmdldF9ybyhob3N0KTsKIAogCQlpZiAocm8gPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkb2VzIG5vdCAiCisJCQlwcl93YXJuaW5nKCIlczogaG9zdCBkb2VzIG5vdCAiCiAJCQkJInN1cHBvcnQgcmVhZGluZyByZWFkLW9ubHkgIgogCQkJCSJzd2l0Y2guIGFzc3VtaW5nIHdyaXRlLWVuYWJsZS5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGhvc3QpKTsKQEAgLTkyOSw4ICs5MzAsNiBAQAogCQllcnIgPSBtbWNfc2VuZF9yZWxhdGl2ZV9hZGRyKGhvc3QsICZjYXJkLT5yY2EpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQotCQltbWNfc2V0X2J1c19tb2RlKGhvc3QsIE1NQ19CVVNNT0RFX1BVU0hQVUxMKTsKIAl9CiAKIAlpZiAoIW9sZGNhcmQpIHsKQEAgLTEwNDMsNiArMTA0Miw3IEBACiAKIAkJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJCW1tY19kZXRhY2hfYnVzKGhvc3QpOworCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwogCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCX0KIH0KQEAgLTExNjcsNyArMTE2Nyw3IEBACiAJICogc3VwcG9ydC4KIAkgKi8KIAlpZiAob2NyICYgMHg3RikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FyZCBjbGFpbXMgdG8gc3VwcG9ydCB2b2x0YWdlcyAiCisJCXByX3dhcm5pbmcoIiVzOiBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHZvbHRhZ2VzICIKIAkJICAgICAgICJiZWxvdyB0aGUgZGVmaW5lZCByYW5nZS4gVGhlc2Ugd2lsbCBiZSBpZ25vcmVkLlxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShob3N0KSk7CiAJCW9jciAmPSB+MHg3RjsKQEAgLTExNzUsNyArMTE3NSw3IEBACiAKIAlpZiAoKG9jciAmIE1NQ19WRERfMTY1XzE5NSkgJiYKIAkgICAgIShob3N0LT5vY3JfYXZhaWxfc2QgJiBNTUNfVkREXzE2NV8xOTUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTRCBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHRoZSAiCisJCXByX3dhcm5pbmcoIiVzOiBTRCBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHRoZSAiCiAJCSAgICAgICAiaW5jb21wbGV0ZWx5IGRlZmluZWQgJ2xvdyB2b2x0YWdlIHJhbmdlJy4gVGhpcyAiCiAJCSAgICAgICAid2lsbCBiZSBpZ25vcmVkLlxuIiwgbW1jX2hvc3RuYW1lKGhvc3QpKTsKIAkJb2NyICY9IH5NTUNfVkREXzE2NV8xOTU7CkBAIC0xMjE0LDcgKzEyMTQsNyBAQAogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBTRCBjYXJkXG4iLAorCXByX2VycigiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgU0QgY2FyZFxuIiwKIAkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkX29wcy5jCmluZGV4IDAyMWZlZDEuLjI3NGVmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CkBAIC02Nyw3ICs2OCw3IEBACiBpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCiAJc3RydWN0IG1tY19jb21tYW5kICpjbWQsIGludCByZXRyaWVzKQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAogCWludCBpLCBlcnI7CiAKQEAgLTI0NCw3ICsyNDUsNyBAQAogaW50IG1tY19hcHBfc2VuZF9zY3Ioc3RydWN0IG1tY19jYXJkICpjYXJkLCB1MzIgKnNjcikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTMwMyw3ICszMDQsNyBAQAogaW50IG1tY19zZF9zd2l0Y2goc3RydWN0IG1tY19jYXJkICpjYXJkLCBpbnQgbW9kZSwgaW50IGdyb3VwLAogCXU4IHZhbHVlLCB1OCAqcmVzcCkKIHsKLQlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0gezB9OworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7TlVMTH07CiAJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKIAlzdHJ1Y3QgbW1jX2RhdGEgZGF0YSA9IHswfTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CkBAIC0zNDgsNyArMzQ5LDcgQEAKIGludCBtbWNfYXBwX3NkX3N0YXR1cyhzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHZvaWQgKnNzcikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggMjYyZmZmMC4uM2FiNTY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTExMSw4ICsxMTEsOCBAQAogCiAJY2Njcl92c24gPSBkYXRhICYgMHgwZjsKIAotCWlmIChjY2NyX3ZzbiA+IFNESU9fQ0NDUl9SRVZfMV8yMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgQ0NDUiBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwlpZiAoY2Njcl92c24gPiBTRElPX0NDQ1JfUkVWXzNfMDApIHsKKwkJcHJfZXJyKCIlczogdW5yZWNvZ25pc2VkIENDQ1Igc3RydWN0dXJlIHZlcnNpb24gJWRcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNjY3JfdnNuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDA4LDggKzQwOCw2IEBACiAJCSAqLwogCQlpZiAob2xkY2FyZCkKIAkJCW9sZGNhcmQtPnJjYSA9IGNhcmQtPnJjYTsKLQotCQltbWNfc2V0X2J1c19tb2RlKGhvc3QsIE1NQ19CVVNNT0RFX1BVU0hQVUxMKTsKIAl9CiAKIAkvKgpAQCAtNTk3LDYgKzU5NSw3IEBACiAKIAkJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJCW1tY19kZXRhY2hfYnVzKGhvc3QpOworCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwogCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCX0KIH0KQEAgLTc3OCw3ICs3NzcsNyBAQAogCSAqIHN1cHBvcnQuCiAJICovCiAJaWYgKG9jciAmIDB4N0YpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhcmQgY2xhaW1zIHRvIHN1cHBvcnQgdm9sdGFnZXMgIgorCQlwcl93YXJuaW5nKCIlczogY2FyZCBjbGFpbXMgdG8gc3VwcG9ydCB2b2x0YWdlcyAiCiAJCSAgICAgICAiYmVsb3cgdGhlIGRlZmluZWQgcmFuZ2UuIFRoZXNlIHdpbGwgYmUgaWdub3JlZC5cbiIsCiAJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdCkpOwogCQlvY3IgJj0gfjB4N0Y7CkBAIC04NzUsNyArODc0LDcgQEAKIGVycjoKIAltbWNfZGV0YWNoX2J1cyhob3N0KTsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgU0RJTyBjYXJkXG4iLAorCXByX2VycigiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgU0RJTyBjYXJkXG4iLAogCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCmluZGV4IGU0ZTY4MjIuLjQwOTg5ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKQEAgLTE3Myw3ICsxNzQsNyBAQAogCWRydi0+cmVtb3ZlKGZ1bmMpOwogCiAJaWYgKGZ1bmMtPmlycV9oYW5kbGVyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IGRyaXZlciAlcyBkaWQgbm90IHJlbW92ZSAiCisJCXByX3dhcm5pbmcoIldBUk5JTkc6IGRyaXZlciAlcyBkaWQgbm90IHJlbW92ZSAiCiAJCQkiaXRzIGludGVycnVwdCBoYW5kbGVyIVxuIiwgZHJ2LT5uYW1lKTsKIAkJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCQlzZGlvX3JlbGVhc2VfaXJxKGZ1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2Npcy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2Npcy5jCmluZGV4IDU0MWJkYjguLmYxYzdlZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19jaXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fY2lzLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQlpZiAocmV0ICYmIHJldCAhPSAtRUlMU0VRICYmIHJldCAhPSAtRU5PRU5UKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgJXMgdHVwbGUgMHglMDJ4ICgldSBieXRlcylcbiIsCisJCQlwcl9lcnIoIiVzOiBiYWQgJXMgdHVwbGUgMHglMDJ4ICgldSBieXRlcylcbiIsCiAJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCB0cGxfZGVzY3IsIGNvZGUsIHNpemUpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTMxMyw3ICszMTMsNyBAQAogCiAJCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKIAkJCQkvKiB3YXJuIGFib3V0IHVua25vd24gdHVwbGVzICovCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHF1ZXVpbmcgdW5rbm93biIKKwkJCQlwcl93YXJuaW5nKCIlczogcXVldWluZyB1bmtub3duIgogCQkJCSAgICAgICAiIENJUyB0dXBsZSAweCUwMnggKCV1IGJ5dGVzKVxuIiwKIAkJCQkgICAgICAgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAogCQkJCSAgICAgICB0cGxfY29kZSwgdHBsX2xpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYwppbmRleCAwZjY4N2NkLi5iMWYzMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYwpAQCAtOSw2ICs5LDcgQEAKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faXJxLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9faXJxLmMKaW5kZXggMDNlYWQwMi4uNjhmODFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lycS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pcnEuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCkBAIC00NSw3ICs0Niw3IEBACiAKIAlyZXQgPSBtbWNfaW9fcndfZGlyZWN0KGNhcmQsIDAsIDAsIFNESU9fQ0NDUl9JTlR4LCAwLCAmcGVuZGluZyk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yICVkIHJlYWRpbmcgU0RJT19DQ0NSX0lOVHhcbiIsCisJCXByX2RlYnVnKCIlczogZXJyb3IgJWQgcmVhZGluZyBTRElPX0NDQ1JfSU5UeFxuIiwKIAkJICAgICAgIG1tY19jYXJkX2lkKGNhcmQpLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTU1LDcgKzU2LDcgQEAKIAkJaWYgKHBlbmRpbmcgJiAoMSA8PCBpKSkgewogCQkJZnVuYyA9IGNhcmQtPnNkaW9fZnVuY1tpIC0gMV07CiAJCQlpZiAoIWZ1bmMpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcGVuZGluZyBJUlEgZm9yICIKKwkJCQlwcl93YXJuaW5nKCIlczogcGVuZGluZyBJUlEgZm9yICIKIAkJCQkJIm5vbi1leGlzdGVudCBmdW5jdGlvblxuIiwKIAkJCQkJbW1jX2NhcmRfaWQoY2FyZCkpOwogCQkJCXJldCA9IC1FSU5WQUw7CkBAIC02Myw3ICs2NCw3IEBACiAJCQkJZnVuYy0+aXJxX2hhbmRsZXIoZnVuYyk7CiAJCQkJY291bnQrKzsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBlbmRpbmcgSVJRIHdpdGggbm8gaGFuZGxlclxuIiwKKwkJCQlwcl93YXJuaW5nKCIlczogcGVuZGluZyBJUlEgd2l0aCBubyBoYW5kbGVyXG4iLAogCQkJCSAgICAgICBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCQkJCXJldCA9IC1FSU5WQUw7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMKaW5kZXggZjA4N2Q4Ny4uYjA1MTdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiBpbnQgbW1jX2lvX3J3X2V4dGVuZGVkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgaW50IHdyaXRlLCB1bnNpZ25lZCBmbiwKIAl1bnNpZ25lZCBhZGRyLCBpbnQgaW5jcl9hZGRyLCB1OCAqYnVmLCB1bnNpZ25lZCBibG9ja3MsIHVuc2lnbmVkIGJsa3N6KQogewotCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnEgPSB7MH07CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycSA9IHtOVUxMfTsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCXN0cnVjdCBtbWNfZGF0YSBkYXRhID0gezB9OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTE0NCw4ICsxNDQsMTEgQEAKIAljbWQuYXJnIHw9IGZuIDw8IDI4OwogCWNtZC5hcmcgfD0gaW5jcl9hZGRyID8gMHgwNDAwMDAwMCA6IDB4MDAwMDAwMDA7CiAJY21kLmFyZyB8PSBhZGRyIDw8IDk7Ci0JaWYgKGJsb2NrcyA9PSAxICYmIGJsa3N6IDw9IDUxMikKLQkJY21kLmFyZyB8PSAoYmxrc3ogPT0gNTEyKSA/IDAgOiBibGtzejsJLyogYnl0ZSBtb2RlICovCisJaWYgKGJsb2NrcyA9PSAxICYmIGJsa3N6IDwgNTEyKQorCQljbWQuYXJnIHw9IGJsa3N6OwkJCS8qIGJ5dGUgbW9kZSAqLworCWVsc2UgaWYgKGJsb2NrcyA9PSAxICYmIGJsa3N6ID09IDUxMiAmJgorCQkgIShtbWNfY2FyZF9icm9rZW5fYnl0ZV9tb2RlXzUxMihjYXJkKSkpCisJCWNtZC5hcmcgfD0gMDsJCQkJLyogYnl0ZSBtb2RlLCAwPT01MTIgKi8KIAllbHNlCiAJCWNtZC5hcmcgfD0gMHgwODAwMDAwMCB8IGJsb2NrczsJCS8qIGJsb2NrIG1vZGUgKi8KIAljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SNSB8IE1NQ19SU1BfUjUgfCBNTUNfQ01EX0FEVEM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKaW5kZXggOGM4NzA5Ni4uY2Y0NDRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwpAQCAtMTMwLDEzICsxMzAsMTMgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBNTUNfU0RIQ0lfRVNESENfSU1YCi0JdHJpc3RhdGUgIlNESENJIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgZVNESEMgaS5NWCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gQVJDSF9NWDI1IHx8IEFSQ0hfTVgzNSB8fCBBUkNIX01YNQorCXRyaXN0YXRlICJTREhDSSBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIGVTREhDL3VTREhDIGkuTVggY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfTVhDCiAJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KIAlzZWxlY3QgTU1DX1NESENJX0lPX0FDQ0VTU09SUwogCWhlbHAKLQkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIgc3VwcG9ydCBvbiB0aGUgcGxhdGZvcm0KLQkgIGJ1cywgZm91bmQgb24gcGxhdGZvcm1zIGxpa2UgbXgzNS81MS4KKwkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGVTREhDL3VTREhDIGNvbnRyb2xsZXIgc3VwcG9ydAorCSAgZm91bmQgb24gaS5NWDI1LCBpLk1YMzUgaS5NWDV4IGFuZCBpLk1YNnguCiAKIAkgIElmIHlvdSBoYXZlIGEgY29udHJvbGxlciB3aXRoIHRoaXMgaW50ZXJmYWNlLCBzYXkgWSBvciBNIGhlcmUuCiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiBjb25maWcgTU1DX0FVMVgKIAl0cmlzdGF0ZSAiQWxjaGVteSBBVTFYWDAgTU1DIENhcmQgSW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQVUxMjAwCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIEFNRCBBbGNoZW15KFIpIE11bHRpbWVkaWEgY2FyZCBpbnRlcmZhY2UuCiAJICBJZiB5b3UgaGF2ZSBhIEFsY2hlbXkgcGxhdGZvcm0gd2l0aCBhIE1NQyBzbG90LCBzYXkgWSBvciBNIGhlcmUuCkBAIC0zMjYsMTEgKzMyNiwxMSBAQAogCSAgc3VwcG9ydCBmb3IgU0RJTyBkZXZpY2VzLgogCiBjb25maWcgTU1DX01YQwotCXRyaXN0YXRlICJGcmVlc2NhbGUgaS5NWDIvMyBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQUNIX01YMjEgfHwgTUFDSF9NWDI3IHx8IEFSQ0hfTVgzMQorCXRyaXN0YXRlICJGcmVlc2NhbGUgaS5NWDIxLzI3LzMxIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfTVhDCiAJaGVscAotCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgaS5NWDIvMyBNdWx0aW1lZGlhIGNhcmQgSW50ZXJmYWNlLgotCSAgSWYgeW91IGhhdmUgYSBpLk1YIHBsYXRmb3JtIHdpdGggYSBNdWx0aW1lZGlhIENhcmQgc2xvdCwKKwkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGkuTVgyMSwgaS5NWDI3IGFuZCBpLk1YMzEgTXVsdGltZWRpYSBjYXJkCisJICBJbnRlcmZhY2UuIElmIHlvdSBoYXZlIGEgaS5NWCBwbGF0Zm9ybSB3aXRoIGEgTXVsdGltZWRpYSBDYXJkIHNsb3QsCiAJICBzYXkgWSBvciBNIGhlcmUuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMKaW5kZXggYTRhYTNhZi4uYThiNGQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYwpAQCAtODY5LDcgKzg2OSwxMSBAQAogc3RhdGljIGlycXJldHVybl90IGF0OTFfbW1jX2RldF9pcnEoaW50IGlycSwgdm9pZCAqX2hvc3QpCiB7CiAJc3RydWN0IGF0OTFtY2lfaG9zdCAqaG9zdCA9IF9ob3N0OwotCWludCBwcmVzZW50ID0gIWdwaW9fZ2V0X3ZhbHVlKGlycV90b19ncGlvKGlycSkpOworCWludCBwcmVzZW50OworCisJLyogZW50ZXJpbmcgdGhpcyBJU1IgbWVhbnMgdGhhdCB3ZSBoYXZlIGNvbmZpZ3VyZWQgZGV0X3BpbjoKKwkgKiB3ZSBjYW4gdXNlIGl0cyB2YWx1ZSBpbiBib2FyZCBzdHJ1Y3R1cmUgKi8KKwlwcmVzZW50ID0gIWdwaW9fZ2V0X3ZhbHVlKGhvc3QtPmJvYXJkLT5kZXRfcGluKTsKIAogCS8qCiAJICogd2UgZXhwZWN0IHRoaXMgaXJxIG9uIGJvdGggaW5zZXJ0IGFuZCByZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS1yZWdzLmggYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS1yZWdzLmgKaW5kZXggZmM4YTBmZS4uMDAwYjNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2ktcmVncy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaApAQCAtMTcsMTEyICsxNywxMjYgQEAKICNkZWZpbmUgX19EUklWRVJTX01NQ19BVE1FTF9NQ0lfSF9fCiAKIC8qIE1DSSBSZWdpc3RlciBEZWZpbml0aW9ucyAqLwotI2RlZmluZSBNQ0lfQ1IJCQkweDAwMDAJLyogQ29udHJvbCAqLwotIyBkZWZpbmUgTUNJX0NSX01DSUVOCQkoICAxIDw8ICAwKQkvKiBNQ0kgRW5hYmxlICovCi0jIGRlZmluZSBNQ0lfQ1JfTUNJRElTCQkoICAxIDw8ICAxKQkvKiBNQ0kgRGlzYWJsZSAqLwotIyBkZWZpbmUgTUNJX0NSX1BXU0VOCQkoICAxIDw8ICAyKQkvKiBQb3dlciBTYXZlIEVuYWJsZSAqLwotIyBkZWZpbmUgTUNJX0NSX1BXU0RJUwkJKCAgMSA8PCAgMykJLyogUG93ZXIgU2F2ZSBEaXNhYmxlICovCi0jIGRlZmluZSBNQ0lfQ1JfU1dSU1QJCSggIDEgPDwgIDcpCS8qIFNvZnR3YXJlIFJlc2V0ICovCi0jZGVmaW5lIE1DSV9NUgkJCTB4MDAwNAkvKiBNb2RlICovCi0jIGRlZmluZSBNQ0lfTVJfQ0xLRElWKHgpCSgoeCkgPDwgIDApCS8qIENsb2NrIERpdmlkZXIgKi8KLSMgZGVmaW5lIE1DSV9NUl9QV1NESVYoeCkJKCh4KSA8PCAgOCkJLyogUG93ZXIgU2F2aW5nIERpdmlkZXIgKi8KLSMgZGVmaW5lIE1DSV9NUl9SRFBST09GCQkoICAxIDw8IDExKQkvKiBSZWFkIFByb29mICovCi0jIGRlZmluZSBNQ0lfTVJfV1JQUk9PRgkJKCAgMSA8PCAxMikJLyogV3JpdGUgUHJvb2YgKi8KLSMgZGVmaW5lIE1DSV9NUl9QRENGQllURQkoICAxIDw8IDEzKQkvKiBGb3JjZSBCeXRlIFRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfTVJfUERDUEFEVgkJKCAgMSA8PCAxNCkJLyogUGFkZGluZyBWYWx1ZSAqLwotIyBkZWZpbmUgTUNJX01SX1BEQ01PREUJCSggIDEgPDwgMTUpCS8qIFBEQy1vcmllbnRlZCBNb2RlICovCi0jZGVmaW5lIE1DSV9EVE9SCQkweDAwMDgJLyogRGF0YSBUaW1lb3V0ICovCi0jIGRlZmluZSBNQ0lfRFRPQ1lDKHgpCQkoKHgpIDw8ICAwKQkvKiBEYXRhIFRpbWVvdXQgQ3ljbGVzICovCi0jIGRlZmluZSBNQ0lfRFRPTVVMKHgpCQkoKHgpIDw8ICA0KQkvKiBEYXRhIFRpbWVvdXQgTXVsdGlwbGllciAqLwotI2RlZmluZSBNQ0lfU0RDUgkJMHgwMDBjCS8qIFNEIENhcmQgLyBTRElPICovCi0jIGRlZmluZSBNQ0lfU0RDU0VMX1NMT1RfQQkoICAwIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCi0jIGRlZmluZSBNQ0lfU0RDU0VMX1NMT1RfQgkoICAxIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCi0jIGRlZmluZSBNQ0lfU0RDU0VMX01BU0sJKCAgMyA8PCAgMCkKLSMgZGVmaW5lIE1DSV9TRENCVVNfMUJJVAkoICAwIDw8ICA2KQkvKiAxLWJpdCBkYXRhIGJ1cyAqLwotIyBkZWZpbmUgTUNJX1NEQ0JVU180QklUCSggIDIgPDwgIDYpCS8qIDQtYml0IGRhdGEgYnVzICovCi0jIGRlZmluZSBNQ0lfU0RDQlVTXzhCSVQJKCAgMyA8PCAgNikJLyogOC1iaXQgZGF0YSBidXNbMl0gKi8KLSMgZGVmaW5lIE1DSV9TRENCVVNfTUFTSwkoICAzIDw8ICA2KQotI2RlZmluZSBNQ0lfQVJHUgkJMHgwMDEwCS8qIENvbW1hbmQgQXJndW1lbnQgKi8KLSNkZWZpbmUgTUNJX0NNRFIJCTB4MDAxNAkvKiBDb21tYW5kICovCi0jIGRlZmluZSBNQ0lfQ01EUl9DTUROQih4KQkoKHgpIDw8ICAwKQkvKiBDb21tYW5kIE9wY29kZSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfUlNQVFlQX05PTkUJKCAgMCA8PCAgNikJLyogTm8gcmVzcG9uc2UgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1JTUFRZUF80OEJJVAkoICAxIDw8ICA2KQkvKiA0OC1iaXQgcmVzcG9uc2UgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1JTUFRZUF8xMzZCSVQJKCAgMiA8PCAgNikJLyogMTM2LWJpdCByZXNwb25zZSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU1BDTURfSU5JVAkoICAxIDw8ICA4KQkvKiBJbml0aWFsaXphdGlvbiBjb21tYW5kICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TUENNRF9TWU5DCSggIDIgPDwgIDgpCS8qIFN5bmNocm9uaXplZCBjb21tYW5kICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TUENNRF9JTlQJKCAgNCA8PCAgOCkJLyogSW50ZXJydXB0IGNvbW1hbmQgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NQQ01EX0lOVFJFU1AJKCAgNSA8PCAgOCkJLyogSW50ZXJydXB0IHJlc3BvbnNlICovCi0jIGRlZmluZSBNQ0lfQ01EUl9PUERDTUQJKCAgMSA8PCAxMSkJLyogT3BlbiBEcmFpbiAqLwotIyBkZWZpbmUgTUNJX0NNRFJfTUFYTEFUXzVDWUMJKCAgMCA8PCAxMikJLyogTWF4IGxhdGVuY3kgNSBjeWNsZXMgKi8KLSMgZGVmaW5lIE1DSV9DTURSX01BWExBVF82NENZQwkoICAxIDw8IDEyKQkvKiBNYXggbGF0ZW5jeSA2NCBjeWNsZXMgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NUQVJUX1hGRVIJKCAgMSA8PCAxNikJLyogU3RhcnQgZGF0YSB0cmFuc2ZlciAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU1RPUF9YRkVSCSggIDIgPDwgMTYpCS8qIFN0b3AgZGF0YSB0cmFuc2ZlciAqLwotIyBkZWZpbmUgTUNJX0NNRFJfVFJESVJfV1JJVEUJKCAgMCA8PCAxOCkJLyogV3JpdGUgZGF0YSAqLwotIyBkZWZpbmUgTUNJX0NNRFJfVFJESVJfUkVBRAkoICAxIDw8IDE4KQkvKiBSZWFkIGRhdGEgKi8KLSMgZGVmaW5lIE1DSV9DTURSX0JMT0NLCQkoICAwIDw8IDE5KQkvKiBTaW5nbGUtYmxvY2sgdHJhbnNmZXIgKi8KLSMgZGVmaW5lIE1DSV9DTURSX01VTFRJX0JMT0NLCSggIDEgPDwgMTkpCS8qIE11bHRpLWJsb2NrIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TVFJFQU0JKCAgMiA8PCAxOSkJLyogTU1DIFN0cmVhbSB0cmFuc2ZlciAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU0RJT19CWVRFCSggIDQgPDwgMTkpCS8qIFNESU8gQnl0ZSB0cmFuc2ZlciAqLwotIyBkZWZpbmUgTUNJX0NNRFJfU0RJT19CTE9DSwkoICA1IDw8IDE5KQkvKiBTRElPIEJsb2NrIHRyYW5zZmVyICovCi0jIGRlZmluZSBNQ0lfQ01EUl9TRElPX1NVU1BFTkQJKCAgMSA8PCAyNCkJLyogU0RJTyBTdXNwZW5kIENvbW1hbmQgKi8KLSMgZGVmaW5lIE1DSV9DTURSX1NESU9fUkVTVU1FCSggIDIgPDwgMjQpCS8qIFNESU8gUmVzdW1lIENvbW1hbmQgKi8KLSNkZWZpbmUgTUNJX0JMS1IJCTB4MDAxOAkvKiBCbG9jayAqLwotIyBkZWZpbmUgTUNJX0JDTlQoeCkJCSgoeCkgPDwgIDApCS8qIERhdGEgQmxvY2sgQ291bnQgKi8KLSMgZGVmaW5lIE1DSV9CTEtMRU4oeCkJCSgoeCkgPDwgMTYpCS8qIERhdGEgQmxvY2sgTGVuZ3RoICovCi0jZGVmaW5lIE1DSV9DU1RPUgkJMHgwMDFjCS8qIENvbXBsZXRpb24gU2lnbmFsIFRpbWVvdXRbMl0gKi8KLSMgZGVmaW5lIE1DSV9DU1RPQ1lDKHgpCQkoKHgpIDw8ICAwKQkvKiBDU1QgY3ljbGVzICovCi0jIGRlZmluZSBNQ0lfQ1NUT01VTCh4KQkJKCh4KSA8PCAgNCkJLyogQ1NUIG11bHRpcGxpZXIgKi8KLSNkZWZpbmUgTUNJX1JTUFIJCTB4MDAyMAkvKiBSZXNwb25zZSAwICovCi0jZGVmaW5lIE1DSV9SU1BSMQkJMHgwMDI0CS8qIFJlc3BvbnNlIDEgKi8KLSNkZWZpbmUgTUNJX1JTUFIyCQkweDAwMjgJLyogUmVzcG9uc2UgMiAqLwotI2RlZmluZSBNQ0lfUlNQUjMJCTB4MDAyYwkvKiBSZXNwb25zZSAzICovCi0jZGVmaW5lIE1DSV9SRFIJCQkweDAwMzAJLyogUmVjZWl2ZSBEYXRhICovCi0jZGVmaW5lIE1DSV9URFIJCQkweDAwMzQJLyogVHJhbnNtaXQgRGF0YSAqLwotI2RlZmluZSBNQ0lfU1IJCQkweDAwNDAJLyogU3RhdHVzICovCi0jZGVmaW5lIE1DSV9JRVIJCQkweDAwNDQJLyogSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBNQ0lfSURSCQkJMHgwMDQ4CS8qIEludGVycnVwdCBEaXNhYmxlICovCi0jZGVmaW5lIE1DSV9JTVIJCQkweDAwNGMJLyogSW50ZXJydXB0IE1hc2sgKi8KLSMgZGVmaW5lIE1DSV9DTURSRFkJCSggIDEgPDwgICAwKQkvKiBDb21tYW5kIFJlYWR5ICovCi0jIGRlZmluZSBNQ0lfUlhSRFkJCSggIDEgPDwgICAxKQkvKiBSZWNlaXZlciBSZWFkeSAqLwotIyBkZWZpbmUgTUNJX1RYUkRZCQkoICAxIDw8ICAgMikJLyogVHJhbnNtaXR0ZXIgUmVhZHkgKi8KLSMgZGVmaW5lIE1DSV9CTEtFCQkoICAxIDw8ICAgMykJLyogRGF0YSBCbG9jayBFbmRlZCAqLwotIyBkZWZpbmUgTUNJX0RUSVAJCSggIDEgPDwgICA0KQkvKiBEYXRhIFRyYW5zZmVyIEluIFByb2dyZXNzICovCi0jIGRlZmluZSBNQ0lfTk9UQlVTWQkJKCAgMSA8PCAgIDUpCS8qIERhdGEgTm90IEJ1c3kgKi8KLSMgZGVmaW5lIE1DSV9TRElPSVJRQQkJKCAgMSA8PCAgIDgpCS8qIFNESU8gSVJRIGluIHNsb3QgQSAqLwotIyBkZWZpbmUgTUNJX1NESU9JUlFCCQkoICAxIDw8ICAgOSkJLyogU0RJTyBJUlEgaW4gc2xvdCBCICovCi0jIGRlZmluZSBNQ0lfUklOREUJCSggIDEgPDwgIDE2KQkvKiBSZXNwb25zZSBJbmRleCBFcnJvciAqLwotIyBkZWZpbmUgTUNJX1JESVJFCQkoICAxIDw8ICAxNykJLyogUmVzcG9uc2UgRGlyZWN0aW9uIEVycm9yICovCi0jIGRlZmluZSBNQ0lfUkNSQ0UJCSggIDEgPDwgIDE4KQkvKiBSZXNwb25zZSBDUkMgRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9SRU5ERQkJKCAgMSA8PCAgMTkpCS8qIFJlc3BvbnNlIEVuZCBCaXQgRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9SVE9FCQkoICAxIDw8ICAyMCkJLyogUmVzcG9uc2UgVGltZS1PdXQgRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9EQ1JDRQkJKCAgMSA8PCAgMjEpCS8qIERhdGEgQ1JDIEVycm9yICovCi0jIGRlZmluZSBNQ0lfRFRPRQkJKCAgMSA8PCAgMjIpCS8qIERhdGEgVGltZS1PdXQgRXJyb3IgKi8KLSMgZGVmaW5lIE1DSV9PVlJFCQkoICAxIDw8ICAzMCkJLyogUlggT3ZlcnJ1biBFcnJvciAqLwotIyBkZWZpbmUgTUNJX1VOUkUJCSggIDEgPDwgIDMxKQkvKiBUWCBVbmRlcnJ1biBFcnJvciAqLwotI2RlZmluZSBNQ0lfRE1BCQkJMHgwMDUwCS8qIERNQSBDb25maWd1cmF0aW9uWzJdICovCi0jIGRlZmluZSBNQ0lfRE1BX09GRlNFVCh4KQkoKHgpIDw8ICAwKQkvKiBETUEgV3JpdGUgQnVmZmVyIE9mZnNldCAqLwotIyBkZWZpbmUgTUNJX0RNQV9DSEtTSVpFKHgpCSgoeCkgPDwgIDQpCS8qIERNQSBDaGFubmVsIFJlYWQgYW5kIFdyaXRlIENodW5rIFNpemUgKi8KLSMgZGVmaW5lIE1DSV9ETUFFTgkJKCAgMSA8PCAgOCkJLyogRE1BIEhhcmR3YXJlIEhhbmRzaGFraW5nIEVuYWJsZSAqLwotI2RlZmluZSBNQ0lfQ0ZHCQkJMHgwMDU0CS8qIENvbmZpZ3VyYXRpb25bMl0gKi8KLSMgZGVmaW5lIE1DSV9DRkdfRklGT01PREVfMURBVEEJKCAgMSA8PCAgMCkJLyogTUNJIEludGVybmFsIEZJRk8gY29udHJvbCBtb2RlICovCi0jIGRlZmluZSBNQ0lfQ0ZHX0ZFUlJDVFJMX0NPUgkoICAxIDw8ICA0KQkvKiBGbG93IEVycm9yIGZsYWcgcmVzZXQgY29udHJvbCBtb2RlICovCi0jIGRlZmluZSBNQ0lfQ0ZHX0hTTU9ERQkJKCAgMSA8PCAgOCkJLyogSGlnaCBTcGVlZCBNb2RlICovCi0jIGRlZmluZSBNQ0lfQ0ZHX0xTWU5DCQkoICAxIDw8IDEyKQkvKiBTeW5jaHJvbml6ZSBvbiB0aGUgbGFzdCBibG9jayAqLwotI2RlZmluZSBNQ0lfV1BNUgkJMHgwMGU0CS8qIFdyaXRlIFByb3RlY3Rpb24gTW9kZVsyXSAqLwotIyBkZWZpbmUgTUNJX1dQX0VOCQkoICAxIDw8ICAwKQkvKiBXUCBFbmFibGUgKi8KLSMgZGVmaW5lIE1DSV9XUF9LRVkJCSgweDRkNDM0OSA8PCA4KQkvKiBXUCBLZXkgKi8KLSNkZWZpbmUgTUNJX1dQU1IJCTB4MDBlOAkvKiBXcml0ZSBQcm90ZWN0aW9uIFN0YXR1c1syXSAqLwotIyBkZWZpbmUgTUNJX0dFVF9XUF9WUyh4KQkoKHgpICYgMHgwZikKLSMgZGVmaW5lIE1DSV9HRVRfV1BfVlNSQyh4KQkoKCh4KSA+PiA4KSAmIDB4ZmZmZikKLSNkZWZpbmUgTUNJX0ZJRk9fQVBFUlRVUkUJMHgwMjAwCS8qIEZJRk8gQXBlcnR1cmVbMl0gKi8KKyNkZWZpbmUgQVRNQ0lfQ1IJCQkweDAwMDAJLyogQ29udHJvbCAqLworIyBkZWZpbmUgQVRNQ0lfQ1JfTUNJRU4JCQkoICAxIDw8ICAwKQkvKiBNQ0kgRW5hYmxlICovCisjIGRlZmluZSBBVE1DSV9DUl9NQ0lESVMJCSggIDEgPDwgIDEpCS8qIE1DSSBEaXNhYmxlICovCisjIGRlZmluZSBBVE1DSV9DUl9QV1NFTgkJCSggIDEgPDwgIDIpCS8qIFBvd2VyIFNhdmUgRW5hYmxlICovCisjIGRlZmluZSBBVE1DSV9DUl9QV1NESVMJCSggIDEgPDwgIDMpCS8qIFBvd2VyIFNhdmUgRGlzYWJsZSAqLworIyBkZWZpbmUgQVRNQ0lfQ1JfU1dSU1QJCQkoICAxIDw8ICA3KQkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZSBBVE1DSV9NUgkJCTB4MDAwNAkvKiBNb2RlICovCisjIGRlZmluZSBBVE1DSV9NUl9DTEtESVYoeCkJCSgoeCkgPDwgIDApCS8qIENsb2NrIERpdmlkZXIgKi8KKyMgZGVmaW5lIEFUTUNJX01SX1BXU0RJVih4KQkJKCh4KSA8PCAgOCkJLyogUG93ZXIgU2F2aW5nIERpdmlkZXIgKi8KKyMgZGVmaW5lIEFUTUNJX01SX1JEUFJPT0YJCSggIDEgPDwgMTEpCS8qIFJlYWQgUHJvb2YgKi8KKyMgZGVmaW5lIEFUTUNJX01SX1dSUFJPT0YJCSggIDEgPDwgMTIpCS8qIFdyaXRlIFByb29mICovCisjIGRlZmluZSBBVE1DSV9NUl9QRENGQllURQkJKCAgMSA8PCAxMykJLyogRm9yY2UgQnl0ZSBUcmFuc2ZlciAqLworIyBkZWZpbmUgQVRNQ0lfTVJfUERDUEFEVgkJKCAgMSA8PCAxNCkJLyogUGFkZGluZyBWYWx1ZSAqLworIyBkZWZpbmUgQVRNQ0lfTVJfUERDTU9ERQkJKCAgMSA8PCAxNSkJLyogUERDLW9yaWVudGVkIE1vZGUgKi8KKyNkZWZpbmUgQVRNQ0lfRFRPUgkJCTB4MDAwOAkvKiBEYXRhIFRpbWVvdXQgKi8KKyMgZGVmaW5lIEFUTUNJX0RUT0NZQyh4KQkJKCh4KSA8PCAgMCkJLyogRGF0YSBUaW1lb3V0IEN5Y2xlcyAqLworIyBkZWZpbmUgQVRNQ0lfRFRPTVVMKHgpCQkoKHgpIDw8ICA0KQkvKiBEYXRhIFRpbWVvdXQgTXVsdGlwbGllciAqLworI2RlZmluZSBBVE1DSV9TRENSCQkJMHgwMDBjCS8qIFNEIENhcmQgLyBTRElPICovCisjIGRlZmluZSBBVE1DSV9TRENTRUxfU0xPVF9BCQkoICAwIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCisjIGRlZmluZSBBVE1DSV9TRENTRUxfU0xPVF9CCQkoICAxIDw8ICAwKQkvKiBTZWxlY3QgU0Qgc2xvdCBBICovCisjIGRlZmluZSBBVE1DSV9TRENTRUxfTUFTSwkJKCAgMyA8PCAgMCkKKyMgZGVmaW5lIEFUTUNJX1NEQ0JVU18xQklUCQkoICAwIDw8ICA2KQkvKiAxLWJpdCBkYXRhIGJ1cyAqLworIyBkZWZpbmUgQVRNQ0lfU0RDQlVTXzRCSVQJCSggIDIgPDwgIDYpCS8qIDQtYml0IGRhdGEgYnVzICovCisjIGRlZmluZSBBVE1DSV9TRENCVVNfOEJJVAkJKCAgMyA8PCAgNikJLyogOC1iaXQgZGF0YSBidXNbMl0gKi8KKyMgZGVmaW5lIEFUTUNJX1NEQ0JVU19NQVNLCQkoICAzIDw8ICA2KQorI2RlZmluZSBBVE1DSV9BUkdSCQkJMHgwMDEwCS8qIENvbW1hbmQgQXJndW1lbnQgKi8KKyNkZWZpbmUgQVRNQ0lfQ01EUgkJCTB4MDAxNAkvKiBDb21tYW5kICovCisjIGRlZmluZSBBVE1DSV9DTURSX0NNRE5CKHgpCQkoKHgpIDw8ICAwKQkvKiBDb21tYW5kIE9wY29kZSAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9SU1BUWVBfTk9ORQkJKCAgMCA8PCAgNikJLyogTm8gcmVzcG9uc2UgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfUlNQVFlQXzQ4QklUCSggIDEgPDwgIDYpCS8qIDQ4LWJpdCByZXNwb25zZSAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9SU1BUWVBfMTM2QklUCSggIDIgPDwgIDYpCS8qIDEzNi1iaXQgcmVzcG9uc2UgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU1BDTURfSU5JVAkJKCAgMSA8PCAgOCkJLyogSW5pdGlhbGl6YXRpb24gY29tbWFuZCAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TUENNRF9TWU5DCQkoICAyIDw8ICA4KQkvKiBTeW5jaHJvbml6ZWQgY29tbWFuZCAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TUENNRF9JTlQJCSggIDQgPDwgIDgpCS8qIEludGVycnVwdCBjb21tYW5kICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NQQ01EX0lOVFJFU1AJKCAgNSA8PCAgOCkJLyogSW50ZXJydXB0IHJlc3BvbnNlICovCisjIGRlZmluZSBBVE1DSV9DTURSX09QRENNRAkJKCAgMSA8PCAxMSkJLyogT3BlbiBEcmFpbiAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9NQVhMQVRfNUNZQwkJKCAgMCA8PCAxMikJLyogTWF4IGxhdGVuY3kgNSBjeWNsZXMgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfTUFYTEFUXzY0Q1lDCSggIDEgPDwgMTIpCS8qIE1heCBsYXRlbmN5IDY0IGN5Y2xlcyAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TVEFSVF9YRkVSCQkoICAxIDw8IDE2KQkvKiBTdGFydCBkYXRhIHRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9DTURSX1NUT1BfWEZFUgkJKCAgMiA8PCAxNikJLyogU3RvcCBkYXRhIHRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9DTURSX1RSRElSX1dSSVRFCQkoICAwIDw8IDE4KQkvKiBXcml0ZSBkYXRhICovCisjIGRlZmluZSBBVE1DSV9DTURSX1RSRElSX1JFQUQJCSggIDEgPDwgMTgpCS8qIFJlYWQgZGF0YSAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9CTE9DSwkJKCAgMCA8PCAxOSkJLyogU2luZ2xlLWJsb2NrIHRyYW5zZmVyICovCisjIGRlZmluZSBBVE1DSV9DTURSX01VTFRJX0JMT0NLCQkoICAxIDw8IDE5KQkvKiBNdWx0aS1ibG9jayB0cmFuc2ZlciAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TVFJFQU0JCSggIDIgPDwgMTkpCS8qIE1NQyBTdHJlYW0gdHJhbnNmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU0RJT19CWVRFCQkoICA0IDw8IDE5KQkvKiBTRElPIEJ5dGUgdHJhbnNmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU0RJT19CTE9DSwkJKCAgNSA8PCAxOSkJLyogU0RJTyBCbG9jayB0cmFuc2ZlciAqLworIyBkZWZpbmUgQVRNQ0lfQ01EUl9TRElPX1NVU1BFTkQJKCAgMSA8PCAyNCkJLyogU0RJTyBTdXNwZW5kIENvbW1hbmQgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJfU0RJT19SRVNVTUUJCSggIDIgPDwgMjQpCS8qIFNESU8gUmVzdW1lIENvbW1hbmQgKi8KKyNkZWZpbmUgQVRNQ0lfQkxLUgkJCTB4MDAxOAkvKiBCbG9jayAqLworIyBkZWZpbmUgQVRNQ0lfQkNOVCh4KQkJCSgoeCkgPDwgIDApCS8qIERhdGEgQmxvY2sgQ291bnQgKi8KKyMgZGVmaW5lIEFUTUNJX0JMS0xFTih4KQkJKCh4KSA8PCAxNikJLyogRGF0YSBCbG9jayBMZW5ndGggKi8KKyNkZWZpbmUgQVRNQ0lfQ1NUT1IJCQkweDAwMWMJLyogQ29tcGxldGlvbiBTaWduYWwgVGltZW91dFsyXSAqLworIyBkZWZpbmUgQVRNQ0lfQ1NUT0NZQyh4KQkJKCh4KSA8PCAgMCkJLyogQ1NUIGN5Y2xlcyAqLworIyBkZWZpbmUgQVRNQ0lfQ1NUT01VTCh4KQkJKCh4KSA8PCAgNCkJLyogQ1NUIG11bHRpcGxpZXIgKi8KKyNkZWZpbmUgQVRNQ0lfUlNQUgkJCTB4MDAyMAkvKiBSZXNwb25zZSAwICovCisjZGVmaW5lIEFUTUNJX1JTUFIxCQkJMHgwMDI0CS8qIFJlc3BvbnNlIDEgKi8KKyNkZWZpbmUgQVRNQ0lfUlNQUjIJCQkweDAwMjgJLyogUmVzcG9uc2UgMiAqLworI2RlZmluZSBBVE1DSV9SU1BSMwkJCTB4MDAyYwkvKiBSZXNwb25zZSAzICovCisjZGVmaW5lIEFUTUNJX1JEUgkJCTB4MDAzMAkvKiBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgQVRNQ0lfVERSCQkJMHgwMDM0CS8qIFRyYW5zbWl0IERhdGEgKi8KKyNkZWZpbmUgQVRNQ0lfU1IJCQkweDAwNDAJLyogU3RhdHVzICovCisjZGVmaW5lIEFUTUNJX0lFUgkJCTB4MDA0NAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEFUTUNJX0lEUgkJCTB4MDA0OAkvKiBJbnRlcnJ1cHQgRGlzYWJsZSAqLworI2RlZmluZSBBVE1DSV9JTVIJCQkweDAwNGMJLyogSW50ZXJydXB0IE1hc2sgKi8KKyMgZGVmaW5lIEFUTUNJX0NNRFJEWQkJCSggIDEgPDwgICAwKQkvKiBDb21tYW5kIFJlYWR5ICovCisjIGRlZmluZSBBVE1DSV9SWFJEWQkJCSggIDEgPDwgICAxKQkvKiBSZWNlaXZlciBSZWFkeSAqLworIyBkZWZpbmUgQVRNQ0lfVFhSRFkJCQkoICAxIDw8ICAgMikJLyogVHJhbnNtaXR0ZXIgUmVhZHkgKi8KKyMgZGVmaW5lIEFUTUNJX0JMS0UJCQkoICAxIDw8ICAgMykJLyogRGF0YSBCbG9jayBFbmRlZCAqLworIyBkZWZpbmUgQVRNQ0lfRFRJUAkJCSggIDEgPDwgICA0KQkvKiBEYXRhIFRyYW5zZmVyIEluIFByb2dyZXNzICovCisjIGRlZmluZSBBVE1DSV9OT1RCVVNZCQkJKCAgMSA8PCAgIDUpCS8qIERhdGEgTm90IEJ1c3kgKi8KKyMgZGVmaW5lIEFUTUNJX0VORFJYCQkJKCAgMSA8PCAgIDYpICAgIC8qIEVuZCBvZiBSWCBCdWZmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX0VORFRYCQkJKCAgMSA8PCAgIDcpICAgIC8qIEVuZCBvZiBUWCBCdWZmZXIgKi8KKyMgZGVmaW5lIEFUTUNJX1NESU9JUlFBCQkJKCAgMSA8PCAgIDgpCS8qIFNESU8gSVJRIGluIHNsb3QgQSAqLworIyBkZWZpbmUgQVRNQ0lfU0RJT0lSUUIJCQkoICAxIDw8ICAgOSkJLyogU0RJTyBJUlEgaW4gc2xvdCBCICovCisjIGRlZmluZSBBVE1DSV9TRElPV0FJVAkJCSggIDEgPDwgIDEyKSAgICAvKiBTRElPIFJlYWQgV2FpdCBPcGVyYXRpb24gU3RhdHVzICovCisjIGRlZmluZSBBVE1DSV9DU1JDVgkJCSggIDEgPDwgIDEzKSAgICAvKiBDRS1BVEEgQ29tcGxldGlvbiBTaWduYWwgUmVjZWl2ZWQgKi8KKyMgZGVmaW5lIEFUTUNJX1JYQlVGRgkJCSggIDEgPDwgIDE0KSAgICAvKiBSWCBCdWZmZXIgRnVsbCAqLworIyBkZWZpbmUgQVRNQ0lfVFhCVUZFCQkJKCAgMSA8PCAgMTUpICAgIC8qIFRYIEJ1ZmZlciBFbXB0eSAqLworIyBkZWZpbmUgQVRNQ0lfUklOREUJCQkoICAxIDw8ICAxNikJLyogUmVzcG9uc2UgSW5kZXggRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX1JESVJFCQkJKCAgMSA8PCAgMTcpCS8qIFJlc3BvbnNlIERpcmVjdGlvbiBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfUkNSQ0UJCQkoICAxIDw8ICAxOCkJLyogUmVzcG9uc2UgQ1JDIEVycm9yICovCisjIGRlZmluZSBBVE1DSV9SRU5ERQkJCSggIDEgPDwgIDE5KQkvKiBSZXNwb25zZSBFbmQgQml0IEVycm9yICovCisjIGRlZmluZSBBVE1DSV9SVE9FCQkJKCAgMSA8PCAgMjApCS8qIFJlc3BvbnNlIFRpbWUtT3V0IEVycm9yICovCisjIGRlZmluZSBBVE1DSV9EQ1JDRQkJCSggIDEgPDwgIDIxKQkvKiBEYXRhIENSQyBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfRFRPRQkJCSggIDEgPDwgIDIyKQkvKiBEYXRhIFRpbWUtT3V0IEVycm9yICovCisjIGRlZmluZSBBVE1DSV9DU1RPRQkJCSggIDEgPDwgIDIzKSAgICAvKiBDb21wbGV0aW9uIFNpZ25hbCBUaW1lLW91dCBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfQkxLT1ZSRQkJCSggIDEgPDwgIDI0KSAgICAvKiBETUEgQmxvY2sgT3ZlcnJ1biBFcnJvciAqLworIyBkZWZpbmUgQVRNQ0lfRE1BRE9ORQkJCSggIDEgPDwgIDI1KSAgICAvKiBETUEgVHJhbnNmZXIgRG9uZSAqLworIyBkZWZpbmUgQVRNQ0lfRklGT0VNUFRZCQkoICAxIDw8ICAyNikgICAgLyogRklGTyBFbXB0eSBGbGFnICovCisjIGRlZmluZSBBVE1DSV9YRlJET05FCQkJKCAgMSA8PCAgMjcpICAgIC8qIFRyYW5zZmVyIERvbmUgRmxhZyAqLworIyBkZWZpbmUgQVRNQ0lfQUNLUkNWCQkJKCAgMSA8PCAgMjgpICAgIC8qIEJvb3QgT3BlcmF0aW9uIEFja25vd2xlZGdlIFJlY2VpdmVkICovCisjIGRlZmluZSBBVE1DSV9BQ0tSQ1ZFCQkJKCAgMSA8PCAgMjkpICAgIC8qIEJvb3QgT3BlcmF0aW9uIEFja25vd2xlZGdlIEVycm9yICovCisjIGRlZmluZSBBVE1DSV9PVlJFCQkJKCAgMSA8PCAgMzApCS8qIFJYIE92ZXJydW4gRXJyb3IgKi8KKyMgZGVmaW5lIEFUTUNJX1VOUkUJCQkoICAxIDw8ICAzMSkJLyogVFggVW5kZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgQVRNQ0lfRE1BCQkJMHgwMDUwCS8qIERNQSBDb25maWd1cmF0aW9uWzJdICovCisjIGRlZmluZSBBVE1DSV9ETUFfT0ZGU0VUKHgpCQkoKHgpIDw8ICAwKQkvKiBETUEgV3JpdGUgQnVmZmVyIE9mZnNldCAqLworIyBkZWZpbmUgQVRNQ0lfRE1BX0NIS1NJWkUoeCkJCSgoeCkgPDwgIDQpCS8qIERNQSBDaGFubmVsIFJlYWQgYW5kIFdyaXRlIENodW5rIFNpemUgKi8KKyMgZGVmaW5lIEFUTUNJX0RNQUVOCQkJKCAgMSA8PCAgOCkJLyogRE1BIEhhcmR3YXJlIEhhbmRzaGFraW5nIEVuYWJsZSAqLworI2RlZmluZSBBVE1DSV9DRkcJCQkweDAwNTQJLyogQ29uZmlndXJhdGlvblsyXSAqLworIyBkZWZpbmUgQVRNQ0lfQ0ZHX0ZJRk9NT0RFXzFEQVRBCSggIDEgPDwgIDApCS8qIE1DSSBJbnRlcm5hbCBGSUZPIGNvbnRyb2wgbW9kZSAqLworIyBkZWZpbmUgQVRNQ0lfQ0ZHX0ZFUlJDVFJMX0NPUgkJKCAgMSA8PCAgNCkJLyogRmxvdyBFcnJvciBmbGFnIHJlc2V0IGNvbnRyb2wgbW9kZSAqLworIyBkZWZpbmUgQVRNQ0lfQ0ZHX0hTTU9ERQkJKCAgMSA8PCAgOCkJLyogSGlnaCBTcGVlZCBNb2RlICovCisjIGRlZmluZSBBVE1DSV9DRkdfTFNZTkMJCSggIDEgPDwgMTIpCS8qIFN5bmNocm9uaXplIG9uIHRoZSBsYXN0IGJsb2NrICovCisjZGVmaW5lIEFUTUNJX1dQTVIJCQkweDAwZTQJLyogV3JpdGUgUHJvdGVjdGlvbiBNb2RlWzJdICovCisjIGRlZmluZSBBVE1DSV9XUF9FTgkJCSggIDEgPDwgIDApCS8qIFdQIEVuYWJsZSAqLworIyBkZWZpbmUgQVRNQ0lfV1BfS0VZCQkJKDB4NGQ0MzQ5IDw8IDgpCS8qIFdQIEtleSAqLworI2RlZmluZSBBVE1DSV9XUFNSCQkJMHgwMGU4CS8qIFdyaXRlIFByb3RlY3Rpb24gU3RhdHVzWzJdICovCisjIGRlZmluZSBBVE1DSV9HRVRfV1BfVlMoeCkJCSgoeCkgJiAweDBmKQorIyBkZWZpbmUgQVRNQ0lfR0VUX1dQX1ZTUkMoeCkJCSgoKHgpID4+IDgpICYgMHhmZmZmKQorI2RlZmluZSBBVE1DSV9WRVJTSU9OCQkJMHgwMEZDICAvKiBWZXJzaW9uICovCisjZGVmaW5lIEFUTUNJX0ZJRk9fQVBFUlRVUkUJCTB4MDIwMAkvKiBGSUZPIEFwZXJ0dXJlWzJdICovCiAKIC8qIFRoaXMgaXMgbm90IGluY2x1ZGluZyB0aGUgRklGTyBBcGVydHVyZSBvbiBNQ0kyICovCi0jZGVmaW5lIE1DSV9SRUdTX1NJWkUJCTB4MTAwCisjZGVmaW5lIEFUTUNJX1JFR1NfU0laRQkJMHgxMDAKIAogLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBtY2lfcmVhZGwocG9ydCxyZWcpCQkJCVwKLQlfX3Jhd19yZWFkbCgocG9ydCktPnJlZ3MgKyBNQ0lfIyNyZWcpCi0jZGVmaW5lIG1jaV93cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJXAotCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBNQ0lfIyNyZWcpCisjZGVmaW5lIGF0bWNpX3JlYWRsKHBvcnQscmVnKQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgcmVnKQorI2RlZmluZSBhdG1jaV93cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyByZWcpCiAKICNlbmRpZiAvKiBfX0RSSVZFUlNfTU1DX0FUTUVMX01DSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCmluZGV4IGZhOGNhZTEuLmE3ZWU1MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbF9wZGMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KQEAgLTM5LDcgKzQwLDcgQEAKIAogI2luY2x1ZGUgImF0bWVsLW1jaS1yZWdzLmgiCiAKLSNkZWZpbmUgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUwkoTUNJX0RDUkNFIHwgTUNJX0RUT0UgfCBNQ0lfT1ZSRSB8IE1DSV9VTlJFKQorI2RlZmluZSBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTCShBVE1DSV9EQ1JDRSB8IEFUTUNJX0RUT0UgfCBBVE1DSV9PVlJFIHwgQVRNQ0lfVU5SRSkKICNkZWZpbmUgQVRNQ0lfRE1BX1RIUkVTSE9MRAkxNgogCiBlbnVtIHsKQEAgLTU4LDE4ICs1OSwzNSBAQAogCVNUQVRFX0RBVEFfRVJST1IsCiB9OwogCitlbnVtIGF0bWNpX3hmZXJfZGlyIHsKKwlYRkVSX1JFQ0VJVkUgPSAwLAorCVhGRVJfVFJBTlNNSVQsCit9OworCitlbnVtIGF0bWNpX3BkY19idWYgeworCVBEQ19GSVJTVF9CVUYgPSAwLAorCVBEQ19TRUNPTkRfQlVGLAorfTsKKworc3RydWN0IGF0bWVsX21jaV9jYXBzIHsKKwlib29sICAgIGhhc19kbWE7CisJYm9vbCAgICBoYXNfcGRjOworCWJvb2wgICAgaGFzX2NmZ19yZWc7CisJYm9vbCAgICBoYXNfY3N0b3JfcmVnOworCWJvb2wgICAgaGFzX2hpZ2hzcGVlZDsKKwlib29sICAgIGhhc19yd3Byb29mOworfTsKKwogc3RydWN0IGF0bWVsX21jaV9kbWEgewotI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCiAJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW47CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkYXRhX2Rlc2M7Ci0jZW5kaWYKIH07CiAKIC8qKgogICogc3RydWN0IGF0bWVsX21jaSAtIE1NQyBjb250cm9sbGVyIHN0YXRlIHNoYXJlZCBiZXR3ZWVuIGFsbCBzbG90cwogICogQGxvY2s6IFNwaW5sb2NrIHByb3RlY3RpbmcgdGhlIHF1ZXVlIGFuZCBhc3NvY2lhdGVkIGRhdGEuCiAgKiBAcmVnczogUG9pbnRlciB0byBNTUlPIHJlZ2lzdGVycy4KLSAqIEBzZzogU2NhdHRlcmxpc3QgZW50cnkgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBieSBQSU8gY29kZSwgaWYgYW55LgorICogQHNnOiBTY2F0dGVybGlzdCBlbnRyeSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIGJ5IFBJTyBvciBQREMgY29kZS4KICAqIEBwaW9fb2Zmc2V0OiBPZmZzZXQgaW50byB0aGUgY3VycmVudCBzY2F0dGVybGlzdCBlbnRyeS4KICAqIEBjdXJfc2xvdDogVGhlIHNsb3Qgd2hpY2ggaXMgY3VycmVudGx5IHVzaW5nIHRoZSBjb250cm9sbGVyLgogICogQG1ycTogVGhlIHJlcXVlc3QgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvbiBAY3VyX3Nsb3QsCkBAIC03Nyw2ICs5NSw3IEBACiAgKiBAY21kOiBUaGUgY29tbWFuZCBjdXJyZW50bHkgYmVpbmcgc2VudCB0byB0aGUgY2FyZCwgb3IgTlVMTC4KICAqIEBkYXRhOiBUaGUgZGF0YSBjdXJyZW50bHkgYmVpbmcgdHJhbnNmZXJyZWQsIG9yIE5VTEwgaWYgbm8gZGF0YQogICoJdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MuCisgKiBAZGF0YV9zaXplOiBqdXN0IGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6LgogICogQGRtYTogRE1BIGNsaWVudCBzdGF0ZS4KICAqIEBkYXRhX2NoYW46IERNQSBjaGFubmVsIGJlaW5nIHVzZWQgZm9yIHRoZSBjdXJyZW50IGRhdGEgdHJhbnNmZXIuCiAgKiBAY21kX3N0YXR1czogU25hcHNob3Qgb2YgU1IgdGFrZW4gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50CkBAIC0xMDMsNiArMTIyLDEzIEBACiAgKiBAbWNrOiBUaGUgcGVyaXBoZXJhbCBidXMgY2xvY2sgaG9va2VkIHVwIHRvIHRoZSBNTUMgY29udHJvbGxlci4KICAqIEBwZGV2OiBQbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KICAqIEBzbG90OiBTbG90cyBzaGFyaW5nIHRoaXMgTU1DIGNvbnRyb2xsZXIuCisgKiBAY2FwczogTUNJIGNhcGFiaWxpdGllcyBkZXBlbmRpbmcgb24gTUNJIHZlcnNpb24uCisgKiBAcHJlcGFyZV9kYXRhOiBmdW5jdGlvbiB0byBzZXR1cCBNQ0kgYmVmb3JlIGRhdGEgdHJhbnNmZXIgd2hpY2gKKyAqIGRlcGVuZHMgb24gTUNJIGNhcGFiaWxpdGllcy4KKyAqIEBzdWJtaXRfZGF0YTogZnVuY3Rpb24gdG8gc3RhcnQgZGF0YSB0cmFuc2ZlciB3aGljaCBkZXBlbmRzIG9uIE1DSQorICogY2FwYWJpbGl0aWVzLgorICogQHN0b3BfdHJhbnNmZXI6IGZ1bmN0aW9uIHRvIHN0b3AgZGF0YSB0cmFuc2ZlciB3aGljaCBkZXBlbmRzIG9uIE1DSQorICogY2FwYWJpbGl0aWVzLgogICoKICAqIExvY2tpbmcKICAqID09PT09PT0KQEAgLTE0Myw2ICsxNjksNyBAQAogCXN0cnVjdCBtbWNfcmVxdWVzdAkqbXJxOwogCXN0cnVjdCBtbWNfY29tbWFuZAkqY21kOwogCXN0cnVjdCBtbWNfZGF0YQkJKmRhdGE7CisJdW5zaWduZWQgaW50CQlkYXRhX3NpemU7CiAKIAlzdHJ1Y3QgYXRtZWxfbWNpX2RtYQlkbWE7CiAJc3RydWN0IGRtYV9jaGFuCQkqZGF0YV9jaGFuOwpAQCAtMTY2LDcgKzE5MywxMyBAQAogCXN0cnVjdCBjbGsJCSptY2s7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAotCXN0cnVjdCBhdG1lbF9tY2lfc2xvdAkqc2xvdFtBVE1FTF9NQ0lfTUFYX05SX1NMT1RTXTsKKwlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QJKnNsb3RbQVRNQ0lfTUFYX05SX1NMT1RTXTsKKworCXN0cnVjdCBhdG1lbF9tY2lfY2FwcyAgIGNhcHM7CisKKwl1MzIgKCpwcmVwYXJlX2RhdGEpKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSk7CisJdm9pZCAoKnN1Ym1pdF9kYXRhKShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpOworCXZvaWQgKCpzdG9wX3RyYW5zZmVyKShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KTsKIH07CiAKIC8qKgpAQCAtMjIwLDMxICsyNTMsNiBAQAogCXNldF9iaXQoZXZlbnQsICZob3N0LT5wZW5kaW5nX2V2ZW50cykKIAogLyoKLSAqIEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmVzL3JlZ2lzdGVycyBiYXNlZCBvbgotICogd2hldGhlciB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIHRoZW0KLSAqLwotc3RhdGljIGJvb2wgbWNpX2hhc19yd3Byb29mKHZvaWQpCi17Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxcm05MjAwKCkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotfQotCi0vKgotICogVGhlIG5ldyBNQ0kyIG1vZHVsZSBpc24ndCAxMDAlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIE1DSSBtb2R1bGUsCi0gKiBhbmQgaXQgaGFzIGEgZmV3IG5pY2UgZmVhdHVyZXMgd2hpY2ggd2Ugd2FudCB0byB1c2UuLi4KLSAqLwotc3RhdGljIGlubGluZSBib29sIGF0bWNpX2lzX21jaTIodm9pZCkKLXsKLQlpZiAoY3B1X2lzX2F0OTFzYW05ZzQ1KCkpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qCiAgKiBUaGUgZGVidWdmcyBzdHVmZiBiZWxvdyBpcyBtb3N0bHkgb3B0aW1pemVkIGF3YXkgd2hlbgogICogQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQuCiAgKi8KQEAgLTM1Miw3ICszNjAsNyBAQAogCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBzLT5wcml2YXRlOwogCXUzMgkJCSpidWY7CiAKLQlidWYgPSBrbWFsbG9jKE1DSV9SRUdTX1NJWkUsIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MoQVRNQ0lfUkVHU19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTM2Myw0NyArMzcxLDUwIEBACiAJICovCiAJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKIAljbGtfZW5hYmxlKGhvc3QtPm1jayk7Ci0JbWVtY3B5X2Zyb21pbyhidWYsIGhvc3QtPnJlZ3MsIE1DSV9SRUdTX1NJWkUpOworCW1lbWNweV9mcm9taW8oYnVmLCBob3N0LT5yZWdzLCBBVE1DSV9SRUdTX1NJWkUpOwogCWNsa19kaXNhYmxlKGhvc3QtPm1jayk7CiAJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwogCiAJc2VxX3ByaW50ZihzLCAiTVI6XHQweCUwOHglcyVzIENMS0RJVj0ldVxuIiwKLQkJCWJ1ZltNQ0lfTVIgLyA0XSwKLQkJCWJ1ZltNQ0lfTVIgLyA0XSAmIE1DSV9NUl9SRFBST09GID8gIiBSRFBST09GIiA6ICIiLAotCQkJYnVmW01DSV9NUiAvIDRdICYgTUNJX01SX1dSUFJPT0YgPyAiIFdSUFJPT0YiIDogIiIsCi0JCQlidWZbTUNJX01SIC8gNF0gJiAweGZmKTsKLQlzZXFfcHJpbnRmKHMsICJEVE9SOlx0MHglMDh4XG4iLCBidWZbTUNJX0RUT1IgLyA0XSk7Ci0Jc2VxX3ByaW50ZihzLCAiU0RDUjpcdDB4JTA4eFxuIiwgYnVmW01DSV9TRENSIC8gNF0pOwotCXNlcV9wcmludGYocywgIkFSR1I6XHQweCUwOHhcbiIsIGJ1ZltNQ0lfQVJHUiAvIDRdKTsKKwkJCWJ1ZltBVE1DSV9NUiAvIDRdLAorCQkJYnVmW0FUTUNJX01SIC8gNF0gJiBBVE1DSV9NUl9SRFBST09GID8gIiBSRFBST09GIiA6ICIiLAorCQkJYnVmW0FUTUNJX01SIC8gNF0gJiBBVE1DSV9NUl9XUlBST09GID8gIiBXUlBST09GIiA6ICIiLAorCQkJYnVmW0FUTUNJX01SIC8gNF0gJiAweGZmKTsKKwlzZXFfcHJpbnRmKHMsICJEVE9SOlx0MHglMDh4XG4iLCBidWZbQVRNQ0lfRFRPUiAvIDRdKTsKKwlzZXFfcHJpbnRmKHMsICJTRENSOlx0MHglMDh4XG4iLCBidWZbQVRNQ0lfU0RDUiAvIDRdKTsKKwlzZXFfcHJpbnRmKHMsICJBUkdSOlx0MHglMDh4XG4iLCBidWZbQVRNQ0lfQVJHUiAvIDRdKTsKIAlzZXFfcHJpbnRmKHMsICJCTEtSOlx0MHglMDh4IEJDTlQ9JXUgQkxLTEVOPSV1XG4iLAotCQkJYnVmW01DSV9CTEtSIC8gNF0sCi0JCQlidWZbTUNJX0JMS1IgLyA0XSAmIDB4ZmZmZiwKLQkJCShidWZbTUNJX0JMS1IgLyA0XSA+PiAxNikgJiAweGZmZmYpOwotCWlmIChhdG1jaV9pc19tY2kyKCkpCi0JCXNlcV9wcmludGYocywgIkNTVE9SOlx0MHglMDh4XG4iLCBidWZbTUNJX0NTVE9SIC8gNF0pOworCQkJYnVmW0FUTUNJX0JMS1IgLyA0XSwKKwkJCWJ1ZltBVE1DSV9CTEtSIC8gNF0gJiAweGZmZmYsCisJCQkoYnVmW0FUTUNJX0JMS1IgLyA0XSA+PiAxNikgJiAweGZmZmYpOworCWlmIChob3N0LT5jYXBzLmhhc19jc3Rvcl9yZWcpCisJCXNlcV9wcmludGYocywgIkNTVE9SOlx0MHglMDh4XG4iLCBidWZbQVRNQ0lfQ1NUT1IgLyA0XSk7CiAKIAkvKiBEb24ndCByZWFkIFJTUFIgYW5kIFJEUjsgaXQgd2lsbCBjb25zdW1lIHRoZSBkYXRhIHRoZXJlICovCiAKLQlhdG1jaV9zaG93X3N0YXR1c19yZWcocywgIlNSIiwgYnVmW01DSV9TUiAvIDRdKTsKLQlhdG1jaV9zaG93X3N0YXR1c19yZWcocywgIklNUiIsIGJ1ZltNQ0lfSU1SIC8gNF0pOworCWF0bWNpX3Nob3dfc3RhdHVzX3JlZyhzLCAiU1IiLCBidWZbQVRNQ0lfU1IgLyA0XSk7CisJYXRtY2lfc2hvd19zdGF0dXNfcmVnKHMsICJJTVIiLCBidWZbQVRNQ0lfSU1SIC8gNF0pOwogCi0JaWYgKGF0bWNpX2lzX21jaTIoKSkgeworCWlmIChob3N0LT5jYXBzLmhhc19kbWEpIHsKIAkJdTMyIHZhbDsKIAotCQl2YWwgPSBidWZbTUNJX0RNQSAvIDRdOworCQl2YWwgPSBidWZbQVRNQ0lfRE1BIC8gNF07CiAJCXNlcV9wcmludGYocywgIkRNQTpcdDB4JTA4eCBPRkZTRVQ9JXUgQ0hLU0laRT0ldSVzXG4iLAogCQkJCXZhbCwgdmFsICYgMywKIAkJCQkoKHZhbCA+PiA0KSAmIDMpID8KIAkJCQkJMSA8PCAoKCh2YWwgPj4gNCkgJiAzKSArIDEpIDogMSwKLQkJCQl2YWwgJiBNQ0lfRE1BRU4gPyAiIERNQUVOIiA6ICIiKTsKKwkJCQl2YWwgJiBBVE1DSV9ETUFFTiA/ICIgRE1BRU4iIDogIiIpOworCX0KKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfY2ZnX3JlZykgeworCQl1MzIgdmFsOwogCi0JCXZhbCA9IGJ1ZltNQ0lfQ0ZHIC8gNF07CisJCXZhbCA9IGJ1ZltBVE1DSV9DRkcgLyA0XTsKIAkJc2VxX3ByaW50ZihzLCAiQ0ZHOlx0MHglMDh4JXMlcyVzJXNcbiIsCiAJCQkJdmFsLAotCQkJCXZhbCAmIE1DSV9DRkdfRklGT01PREVfMURBVEEgPyAiIEZJRk9NT0RFX09ORV9EQVRBIiA6ICIiLAotCQkJCXZhbCAmIE1DSV9DRkdfRkVSUkNUUkxfQ09SID8gIiBGRVJSQ1RSTF9DTEVBUl9PTl9SRUFEIiA6ICIiLAotCQkJCXZhbCAmIE1DSV9DRkdfSFNNT0RFID8gIiBIU01PREUiIDogIiIsCi0JCQkJdmFsICYgTUNJX0NGR19MU1lOQyA/ICIgTFNZTkMiIDogIiIpOworCQkJCXZhbCAmIEFUTUNJX0NGR19GSUZPTU9ERV8xREFUQSA/ICIgRklGT01PREVfT05FX0RBVEEiIDogIiIsCisJCQkJdmFsICYgQVRNQ0lfQ0ZHX0ZFUlJDVFJMX0NPUiA/ICIgRkVSUkNUUkxfQ0xFQVJfT05fUkVBRCIgOiAiIiwKKwkJCQl2YWwgJiBBVE1DSV9DRkdfSFNNT0RFID8gIiBIU01PREUiIDogIiIsCisJCQkJdmFsICYgQVRNQ0lfQ0ZHX0xTWU5DID8gIiBMU1lOQyIgOiAiIik7CiAJfQogCiAJa2ZyZWUoYnVmKTsKQEAgLTQ2Niw3ICs0NzcsNyBAQAogCWRldl9lcnIoJm1tYy0+Y2xhc3NfZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZGVidWdmcyBmb3Igc2xvdFxuIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5zX3RvX2Nsb2NrcyhzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRtY2lfbnNfdG9fY2xvY2tzKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCiAJCQkJCXVuc2lnbmVkIGludCBucykKIHsKIAlyZXR1cm4gKG5zICogKGhvc3QtPmJ1c19oeiAvIDEwMDAwMDApICsgOTk5KSAvIDEwMDA7CkBAIC00ODIsNyArNDkzLDggQEAKIAl1bnNpZ25lZAlkdG9jeWM7CiAJdW5zaWduZWQJZHRvbXVsOwogCi0JdGltZW91dCA9IG5zX3RvX2Nsb2Nrcyhob3N0LCBkYXRhLT50aW1lb3V0X25zKSArIGRhdGEtPnRpbWVvdXRfY2xrczsKKwl0aW1lb3V0ID0gYXRtY2lfbnNfdG9fY2xvY2tzKGhvc3QsIGRhdGEtPnRpbWVvdXRfbnMpCisJCSsgZGF0YS0+dGltZW91dF9jbGtzOwogCiAJZm9yIChkdG9tdWwgPSAwOyBkdG9tdWwgPCA4OyBkdG9tdWwrKykgewogCQl1bnNpZ25lZCBzaGlmdCA9IGR0b211bF90b19zaGlmdFtkdG9tdWxdOwpAQCAtNDk4LDcgKzUxMCw3IEBACiAKIAlkZXZfdmRiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJzZXR0aW5nIHRpbWVvdXQgdG8gJXUgY3ljbGVzXG4iLAogCQkJZHRvY3ljIDw8IGR0b211bF90b19zaGlmdFtkdG9tdWxdKTsKLQltY2lfd3JpdGVsKGhvc3QsIERUT1IsIChNQ0lfRFRPTVVMKGR0b211bCkgfCBNQ0lfRFRPQ1lDKGR0b2N5YykpKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfRFRPUiwgKEFUTUNJX0RUT01VTChkdG9tdWwpIHwgQVRNQ0lfRFRPQ1lDKGR0b2N5YykpKTsKIH0KIAogLyoKQEAgLTUxMiwxMyArNTI0LDEzIEBACiAKIAljbWQtPmVycm9yID0gLUVJTlBST0dSRVNTOwogCi0JY21kciA9IE1DSV9DTURSX0NNRE5CKGNtZC0+b3Bjb2RlKTsKKwljbWRyID0gQVRNQ0lfQ01EUl9DTUROQihjbWQtPm9wY29kZSk7CiAKIAlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfUFJFU0VOVCkgewogCQlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KQotCQkJY21kciB8PSBNQ0lfQ01EUl9SU1BUWVBfMTM2QklUOworCQkJY21kciB8PSBBVE1DSV9DTURSX1JTUFRZUF8xMzZCSVQ7CiAJCWVsc2UKLQkJCWNtZHIgfD0gTUNJX0NNRFJfUlNQVFlQXzQ4QklUOworCQkJY21kciB8PSBBVE1DSV9DTURSX1JTUFRZUF80OEJJVDsKIAl9CiAKIAkvKgpAQCAtNTI2LDM0ICs1MzgsMzQgQEAKIAkgKiBpdCdzIHRvbyBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBBQ01EIG9yCiAJICogbm90LiBCZXR0ZXIgbWFrZSBpdCA2NC4KIAkgKi8KLQljbWRyIHw9IE1DSV9DTURSX01BWExBVF82NENZQzsKKwljbWRyIHw9IEFUTUNJX0NNRFJfTUFYTEFUXzY0Q1lDOwogCiAJaWYgKG1tYy0+aW9zLmJ1c19tb2RlID09IE1NQ19CVVNNT0RFX09QRU5EUkFJTikKLQkJY21kciB8PSBNQ0lfQ01EUl9PUERDTUQ7CisJCWNtZHIgfD0gQVRNQ0lfQ01EUl9PUERDTUQ7CiAKIAlkYXRhID0gY21kLT5kYXRhOwogCWlmIChkYXRhKSB7Ci0JCWNtZHIgfD0gTUNJX0NNRFJfU1RBUlRfWEZFUjsKKwkJY21kciB8PSBBVE1DSV9DTURSX1NUQVJUX1hGRVI7CiAKIAkJaWYgKGNtZC0+b3Bjb2RlID09IFNEX0lPX1JXX0VYVEVOREVEKSB7Ci0JCQljbWRyIHw9IE1DSV9DTURSX1NESU9fQkxPQ0s7CisJCQljbWRyIHw9IEFUTUNJX0NNRFJfU0RJT19CTE9DSzsKIAkJfSBlbHNlIHsKIAkJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1NUUkVBTSkKLQkJCQljbWRyIHw9IE1DSV9DTURSX1NUUkVBTTsKKwkJCQljbWRyIHw9IEFUTUNJX0NNRFJfU1RSRUFNOwogCQkJZWxzZSBpZiAoZGF0YS0+YmxvY2tzID4gMSkKLQkJCQljbWRyIHw9IE1DSV9DTURSX01VTFRJX0JMT0NLOworCQkJCWNtZHIgfD0gQVRNQ0lfQ01EUl9NVUxUSV9CTE9DSzsKIAkJCWVsc2UKLQkJCQljbWRyIHw9IE1DSV9DTURSX0JMT0NLOworCQkJCWNtZHIgfD0gQVRNQ0lfQ01EUl9CTE9DSzsKIAkJfQogCiAJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCi0JCQljbWRyIHw9IE1DSV9DTURSX1RSRElSX1JFQUQ7CisJCQljbWRyIHw9IEFUTUNJX0NNRFJfVFJESVJfUkVBRDsKIAl9CiAKIAlyZXR1cm4gY21kcjsKIH0KIAotc3RhdGljIHZvaWQgYXRtY2lfc3RhcnRfY29tbWFuZChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAorc3RhdGljIHZvaWQgYXRtY2lfc2VuZF9jb21tYW5kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCiAJCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kLCB1MzIgY21kX2ZsYWdzKQogewogCVdBUk5fT04oaG9zdC0+Y21kKTsKQEAgLTU2Myw0MyArNTc1LDExOSBAQAogCQkJInN0YXJ0IGNvbW1hbmQ6IEFSR1I9MHglMDh4IENNRFI9MHglMDh4XG4iLAogCQkJY21kLT5hcmcsIGNtZF9mbGFncyk7CiAKLQltY2lfd3JpdGVsKGhvc3QsIEFSR1IsIGNtZC0+YXJnKTsKLQltY2lfd3JpdGVsKGhvc3QsIENNRFIsIGNtZF9mbGFncyk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0FSR1IsIGNtZC0+YXJnKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ01EUiwgY21kX2ZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgc2VuZF9zdG9wX2NtZChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCitzdGF0aWMgdm9pZCBhdG1jaV9zZW5kX3N0b3BfY21kKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKLQlhdG1jaV9zdGFydF9jb21tYW5kKGhvc3QsIGRhdGEtPnN0b3AsIGhvc3QtPnN0b3BfY21kcik7Ci0JbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9DTURSRFkpOworCWF0bWNpX3NlbmRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wLCBob3N0LT5zdG9wX2NtZHIpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX0NNRFJEWSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQQotc3RhdGljIHZvaWQgYXRtY2lfZG1hX2NsZWFudXAoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKKy8qCisgKiBDb25maWd1cmUgZ2l2ZW4gUERDIGJ1ZmZlciB0YWtpbmcgY2FyZSBvZiBhbGlnbmVtZW50IGlzc3Vlcy4KKyAqIFVwZGF0ZSBob3N0LT5kYXRhX3NpemUgYW5kIGhvc3QtPnNnLgorICovCitzdGF0aWMgdm9pZCBhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwKKwllbnVtIGF0bWNpX3hmZXJfZGlyIGRpciwgZW51bSBhdG1jaV9wZGNfYnVmIGJ1Zl9uYikKIHsKLQlzdHJ1Y3QgbW1jX2RhdGEJCQkqZGF0YSA9IGhvc3QtPmRhdGE7CisJdTMyIHBvaW50ZXJfcmVnLCBjb3VudGVyX3JlZzsKIAotCWlmIChkYXRhKQotCQlkbWFfdW5tYXBfc2coaG9zdC0+ZG1hLmNoYW4tPmRldmljZS0+ZGV2LAotCQkJICAgICBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLAotCQkJICAgICAoKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpCi0JCQkgICAgICA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpKTsKLX0KLQotc3RhdGljIHZvaWQgYXRtY2lfc3RvcF9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBob3N0LT5kYXRhX2NoYW47Ci0KLQlpZiAoY2hhbikgewotCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChjaGFuKTsKLQkJYXRtY2lfZG1hX2NsZWFudXAoaG9zdCk7CisJaWYgKGRpciA9PSBYRkVSX1JFQ0VJVkUpIHsKKwkJcG9pbnRlcl9yZWcgPSBBVE1FTF9QRENfUlBSOworCQljb3VudGVyX3JlZyA9IEFUTUVMX1BEQ19SQ1I7CiAJfSBlbHNlIHsKLQkJLyogRGF0YSB0cmFuc2ZlciB3YXMgc3RvcHBlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSk7Ci0JCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBNQ0lfTk9UQlVTWSk7CisJCXBvaW50ZXJfcmVnID0gQVRNRUxfUERDX1RQUjsKKwkJY291bnRlcl9yZWcgPSBBVE1FTF9QRENfVENSOworCX0KKworCWlmIChidWZfbmIgPT0gUERDX1NFQ09ORF9CVUYpIHsKKwkJcG9pbnRlcl9yZWcgKz0gQVRNRUxfUERDX1NDTkRfQlVGX09GRjsKKwkJY291bnRlcl9yZWcgKz0gQVRNRUxfUERDX1NDTkRfQlVGX09GRjsKKwl9CisKKwlhdG1jaV93cml0ZWwoaG9zdCwgcG9pbnRlcl9yZWcsIHNnX2RtYV9hZGRyZXNzKGhvc3QtPnNnKSk7CisJaWYgKGhvc3QtPmRhdGFfc2l6ZSA8PSBzZ19kbWFfbGVuKGhvc3QtPnNnKSkgeworCQlpZiAoaG9zdC0+ZGF0YV9zaXplICYgMHgzKSB7CisJCQkvKiBJZiBzaXplIGlzIGRpZmZlcmVudCBmcm9tIG1vZHVsbyA0LCB0cmFuc2ZlciBieXRlcyAqLworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIGNvdW50ZXJfcmVnLCBob3N0LT5kYXRhX3NpemUpOworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX01SLCBob3N0LT5tb2RlX3JlZyB8IEFUTUNJX01SX1BEQ0ZCWVRFKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVsc2UgdHJhbnNmZXIgMzItYml0cyB3b3JkcyAqLworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIGNvdW50ZXJfcmVnLCBob3N0LT5kYXRhX3NpemUgLyA0KTsKKwkJfQorCQlob3N0LT5kYXRhX3NpemUgPSAwOworCX0gZWxzZSB7CisJCS8qIFdlIGFzc3VtZSB0aGUgc2l6ZSBvZiBhIHBhZ2UgaXMgMzItYml0cyBhbGlnbmVkICovCisJCWF0bWNpX3dyaXRlbChob3N0LCBjb3VudGVyX3JlZywgc2dfZG1hX2xlbihob3N0LT5zZykgLyA0KTsKKwkJaG9zdC0+ZGF0YV9zaXplIC09IHNnX2RtYV9sZW4oaG9zdC0+c2cpOworCQlpZiAoaG9zdC0+ZGF0YV9zaXplKQorCQkJaG9zdC0+c2cgPSBzZ19uZXh0KGhvc3QtPnNnKTsKIAl9CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBETUEgZHJpdmVyIGZyb20gdGFza2xldCBjb250ZXh0LiAqLworLyoKKyAqIENvbmZpZ3VyZSBQREMgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgZGF0YSBzaXplIGllIGNvbmZpZ3VyaW5nIG9uZSBvciB0d28KKyAqIGJ1ZmZlcnMuIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSBvbmx5IHRoZSBzZWNvbmQKKyAqIGJ1ZmZlci4gSW4gdGhpcyBjYXNlLCB1c2UgYXRtY2lfcGRjX3NldF9zaW5nbGVfYnVmLgorICovCitzdGF0aWMgdm9pZCBhdG1jaV9wZGNfc2V0X2JvdGhfYnVmKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIGludCBkaXIpCit7CisJYXRtY2lfcGRjX3NldF9zaW5nbGVfYnVmKGhvc3QsIGRpciwgUERDX0ZJUlNUX0JVRik7CisJaWYgKGhvc3QtPmRhdGFfc2l6ZSkKKwkJYXRtY2lfcGRjX3NldF9zaW5nbGVfYnVmKGhvc3QsIGRpciwgUERDX1NFQ09ORF9CVUYpOworfQorCisvKgorICogVW5tYXAgc2cgbGlzdHMsIGNhbGxlZCB3aGVuIHRyYW5zZmVyIGlzIGZpbmlzaGVkLgorICovCitzdGF0aWMgdm9pZCBhdG1jaV9wZGNfY2xlYW51cChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCXN0cnVjdCBtbWNfZGF0YSAgICAgICAgICpkYXRhID0gaG9zdC0+ZGF0YTsKKworCWlmIChkYXRhKQorCQlkbWFfdW5tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwKKwkJCQlkYXRhLT5zZywgZGF0YS0+c2dfbGVuLAorCQkJCSgoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkKKwkJCQkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKSk7Cit9CisKKy8qCisgKiBEaXNhYmxlIFBEQyB0cmFuc2ZlcnMuIFVwZGF0ZSBwZW5kaW5nIGZsYWdzIHRvIEVWRU5UX1hGRVJfQ09NUExFVEUgYWZ0ZXIKKyAqIGhhdmluZyByZWNlaXZlZCBBVE1DSV9UWEJVRkUgb3IgQVRNQ0lfUlhCVUZGIGludGVycnVwdC4gRW5hYmxlIEFUTUNJX05PVEJVU1kKKyAqIGludGVycnVwdCBuZWVkZWQgZm9yIGJvdGggdHJhbnNmZXIgZGlyZWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgYXRtY2lfcGRjX2NvbXBsZXRlKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUVMX1BEQ19QVENSLCBBVE1FTF9QRENfUlhURElTIHwgQVRNRUxfUERDX1RYVERJUyk7CisJYXRtY2lfcGRjX2NsZWFudXAoaG9zdCk7CisKKwkvKgorCSAqIElmIHRoZSBjYXJkIHdhcyByZW1vdmVkLCBkYXRhIHdpbGwgYmUgTlVMTC4gTm8gcG9pbnQgdHJ5aW5nCisJICogdG8gc2VuZCB0aGUgc3RvcCBjb21tYW5kIG9yIHdhaXRpbmcgZm9yIE5CVVNZIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAoaG9zdC0+ZGF0YSkgeworCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX05PVEJVU1kpOworCX0KK30KKworc3RhdGljIHZvaWQgYXRtY2lfZG1hX2NsZWFudXAoc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2RhdGEgICAgICAgICAgICAgICAgICpkYXRhID0gaG9zdC0+ZGF0YTsKKworCWlmIChkYXRhKQorCQlkbWFfdW5tYXBfc2coaG9zdC0+ZG1hLmNoYW4tPmRldmljZS0+ZGV2LAorCQkJCWRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCisJCQkJKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJCSA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBETUEgZHJpdmVyIGZyb20gdGFza2xldCBjb250ZXh0LgorICovCiBzdGF0aWMgdm9pZCBhdG1jaV9kbWFfY29tcGxldGUodm9pZCAqYXJnKQogewogCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3QgPSBhcmc7CkBAIC02MDcsOSArNjk1LDkgQEAKIAogCWRldl92ZGJnKCZob3N0LT5wZGV2LT5kZXYsICJETUEgY29tcGxldGVcbiIpOwogCi0JaWYgKGF0bWNpX2lzX21jaTIoKSkKKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfZG1hKQogCQkvKiBEaXNhYmxlIERNQSBoYXJkd2FyZSBoYW5kc2hha2luZyBvbiBNQ0kgKi8KLQkJbWNpX3dyaXRlbChob3N0LCBETUEsIG1jaV9yZWFkbChob3N0LCBETUEpICYgfk1DSV9ETUFFTik7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9ETUEsIGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX0RNQSkgJiB+QVRNQ0lfRE1BRU4pOwogCiAJYXRtY2lfZG1hX2NsZWFudXAoaG9zdCk7CiAKQEAgLTY0MSw5OSArNzI5LDEwIEBACiAJCSAqIGNvbXBsZXRpb24gY2FsbGJhY2siIHJ1bGUgb2YgdGhlIGRtYSBlbmdpbmUKIAkJICogZnJhbWV3b3JrLgogCQkgKi8KLQkJbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7CiAJfQogfQogCi1zdGF0aWMgaW50Ci1hdG1jaV9wcmVwYXJlX2RhdGFfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW4JCQkqY2hhbjsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRlc2M7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0CQkqc2c7Ci0JdW5zaWduZWQgaW50CQkJaTsKLQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgkJZGlyZWN0aW9uOwotCXVuc2lnbmVkIGludAkJCXNnbGVuOwotCi0JLyoKLQkgKiBXZSBkb24ndCBkbyBETUEgb24gImNvbXBsZXgiIHRyYW5zZmVycywgaS5lLiB3aXRoCi0JICogbm9uLXdvcmQtYWxpZ25lZCBidWZmZXJzIG9yIGxlbmd0aHMuIEFsc28sIHdlIGRvbid0IGJvdGhlcgotCSAqIHdpdGggYWxsIHRoZSBETUEgc2V0dXAgb3ZlcmhlYWQgZm9yIHNob3J0IHRyYW5zZmVycy4KLQkgKi8KLQlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCBBVE1DSV9ETUFfVEhSRVNIT0xEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGF0YS0+Ymxrc3ogJiAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvcl9lYWNoX3NnKGRhdGEtPnNnLCBzZywgZGF0YS0+c2dfbGVuLCBpKSB7Ci0JCWlmIChzZy0+b2Zmc2V0ICYgMyB8fCBzZy0+bGVuZ3RoICYgMykKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjaGFubmVsLCB3ZSBjYW4ndCBkbyBETUEgKi8KLQljaGFuID0gaG9zdC0+ZG1hLmNoYW47Ci0JaWYgKGNoYW4pCi0JCWhvc3QtPmRhdGFfY2hhbiA9IGNoYW47Ci0KLQlpZiAoIWNoYW4pCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJbWNpX3dyaXRlbChob3N0LCBETUEsIE1DSV9ETUFfQ0hLU0laRSgzKSB8IE1DSV9ETUFFTik7Ci0KLQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQotCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7Ci0JZWxzZQotCQlkaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOwotCi0Jc2dsZW4gPSBkbWFfbWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBkYXRhLT5zZywKLQkJCSAgIGRhdGEtPnNnX2xlbiwgZGlyZWN0aW9uKTsKLQotCWRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKGNoYW4sCi0JCQlkYXRhLT5zZywgc2dsZW4sIGRpcmVjdGlvbiwKLQkJCURNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7Ci0JaWYgKCFkZXNjKQotCQlnb3RvIHVubWFwX2V4aXQ7Ci0KLQlob3N0LT5kbWEuZGF0YV9kZXNjID0gZGVzYzsKLQlkZXNjLT5jYWxsYmFjayA9IGF0bWNpX2RtYV9jb21wbGV0ZTsKLQlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGhvc3Q7Ci0KLQlyZXR1cm4gMDsKLXVubWFwX2V4aXQ6Ci0JZG1hX3VubWFwX3NnKGNoYW4tPmRldmljZS0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOwotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBhdG1jaV9zdWJtaXRfZGF0YShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQotewotCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuID0gaG9zdC0+ZGF0YV9jaGFuOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGVzYyA9IGhvc3QtPmRtYS5kYXRhX2Rlc2M7Ci0KLQlpZiAoY2hhbikgewotCQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOwotCQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKLQl9Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BICovCi0KLXN0YXRpYyBpbnQgYXRtY2lfcHJlcGFyZV9kYXRhX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWNpX3N1Ym1pdF9kYXRhKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpIHt9Ci0KLXN0YXRpYyB2b2lkIGF0bWNpX3N0b3BfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCi17Ci0JLyogRGF0YSB0cmFuc2ZlciB3YXMgc3RvcHBlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKLQltY2lfd3JpdGVsKGhvc3QsIElFUiwgTUNJX05PVEJVU1kpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KLQogLyoKICAqIFJldHVybnMgYSBtYXNrIG9mIGludGVycnVwdCBmbGFncyB0byBiZSBlbmFibGVkIGFmdGVyIHRoZSB3aG9sZQogICogcmVxdWVzdCBoYXMgYmVlbiBwcmVwYXJlZC4KQEAgLTc0NCwzNiArNzQzLDIxMCBAQAogCiAJZGF0YS0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CiAKKwlob3N0LT5zZyA9IGRhdGEtPnNnOworCWhvc3QtPmRhdGEgPSBkYXRhOworCWhvc3QtPmRhdGFfY2hhbiA9IE5VTEw7CisKKwlpZmxhZ3MgPSBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTOworCisJLyoKKwkgKiBFcnJhdGE6IE1NQyBkYXRhIHdyaXRlIG9wZXJhdGlvbiB3aXRoIGxlc3MgdGhhbiAxMgorCSAqIGJ5dGVzIGlzIGltcG9zc2libGUuCisJICoKKwkgKiBFcnJhdGE6IE1DSSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIChURFIpIEZJRk8KKwkgKiBjb3JydXB0aW9uIHdoZW4gbGVuZ3RoIGlzIG5vdCBtdWx0aXBsZSBvZiA0LgorCSAqLworCWlmIChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeiA8IDEyCisJCQl8fCAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3opICYgMykKKwkJaG9zdC0+bmVlZF9yZXNldCA9IHRydWU7CisKKwlob3N0LT5waW9fb2Zmc2V0ID0gMDsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlpZmxhZ3MgfD0gQVRNQ0lfUlhSRFk7CisJZWxzZQorCQlpZmxhZ3MgfD0gQVRNQ0lfVFhSRFk7CisKKwlyZXR1cm4gaWZsYWdzOworfQorCisvKgorICogU2V0IGludGVycnVwdCBmbGFncyBhbmQgc2V0IGJsb2NrIGxlbmd0aCBpbnRvIHRoZSBNQ0kgbW9kZSByZWdpc3RlciBldmVuCisgKiBpZiB0aGlzIHZhbHVlIGlzIGFsc28gYWNjZXNzaWJsZSBpbiB0aGUgTUNJIGJsb2NrIHJlZ2lzdGVyLiBJdCBzZWVtcyB0byBiZQorICogbmVjZXNzYXJ5IGJlZm9yZSB0aGUgSGlnaCBTcGVlZCBNQ0kgdmVyc2lvbi4gSXQgYWxzbyBtYXAgc2cgYW5kIGNvbmZpZ3VyZQorICogUERDIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHUzMgorYXRtY2lfcHJlcGFyZV9kYXRhX3BkYyhzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJdTMyIGlmbGFncywgdG1wOworCXVuc2lnbmVkIGludCBzZ19sZW47CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCisJZGF0YS0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CisKKwlob3N0LT5kYXRhID0gZGF0YTsKKwlob3N0LT5zZyA9IGRhdGEtPnNnOworCWlmbGFncyA9IEFUTUNJX0RBVEFfRVJST1JfRkxBR1M7CisKKwkvKiBFbmFibGUgcGRjIG1vZGUgKi8KKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnIHwgQVRNQ0lfTVJfUERDTU9ERSk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKSB7CisJCWRpciA9IERNQV9GUk9NX0RFVklDRTsKKwkJaWZsYWdzIHw9IEFUTUNJX0VORFJYIHwgQVRNQ0lfUlhCVUZGOworCX0gZWxzZSB7CisJCWRpciA9IERNQV9UT19ERVZJQ0U7CisJCWlmbGFncyB8PSBBVE1DSV9FTkRUWCB8IEFUTUNJX1RYQlVGRTsKKwl9CisKKwkvKiBTZXQgQkxLTEVOICovCisJdG1wID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfTVIpOworCXRtcCAmPSAweDAwMDBmZmZmOworCXRtcCB8PSBBVE1DSV9CTEtMRU4oZGF0YS0+Ymxrc3opOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9NUiwgdG1wKTsKKworCS8qIENvbmZpZ3VyZSBQREMgKi8KKwlob3N0LT5kYXRhX3NpemUgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKKwlzZ19sZW4gPSBkbWFfbWFwX3NnKCZob3N0LT5wZGV2LT5kZXYsIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sIGRpcik7CisJaWYgKGhvc3QtPmRhdGFfc2l6ZSkKKwkJYXRtY2lfcGRjX3NldF9ib3RoX2J1Zihob3N0LAorCQkJKChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSA/IFhGRVJfUkVDRUlWRSA6IFhGRVJfVFJBTlNNSVQpKTsKKworCXJldHVybiBpZmxhZ3M7Cit9CisKK3N0YXRpYyB1MzIKK2F0bWNpX3ByZXBhcmVfZGF0YV9kbWEoc3RydWN0IGF0bWVsX21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJCSpzZzsKKwl1bnNpZ25lZCBpbnQJCQlpOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCQlkaXJlY3Rpb247CisJdW5zaWduZWQgaW50CQkJc2dsZW47CisJdTMyIGlmbGFnczsKKworCWRhdGEtPmVycm9yID0gLUVJTlBST0dSRVNTOworCiAJV0FSTl9PTihob3N0LT5kYXRhKTsKIAlob3N0LT5zZyA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IGRhdGE7CiAKIAlpZmxhZ3MgPSBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTOwotCWlmIChhdG1jaV9wcmVwYXJlX2RhdGFfZG1hKGhvc3QsIGRhdGEpKSB7Ci0JCWhvc3QtPmRhdGFfY2hhbiA9IE5VTEw7CiAKLQkJLyoKLQkJICogRXJyYXRhOiBNTUMgZGF0YSB3cml0ZSBvcGVyYXRpb24gd2l0aCBsZXNzIHRoYW4gMTIKLQkJICogYnl0ZXMgaXMgaW1wb3NzaWJsZS4KLQkJICoKLQkJICogRXJyYXRhOiBNQ0kgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAoVERSKSBGSUZPCi0JCSAqIGNvcnJ1cHRpb24gd2hlbiBsZW5ndGggaXMgbm90IG11bHRpcGxlIG9mIDQuCi0JCSAqLwotCQlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCAxMgotCQkJCXx8IChkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzeikgJiAzKQotCQkJaG9zdC0+bmVlZF9yZXNldCA9IHRydWU7CisJLyoKKwkgKiBXZSBkb24ndCBkbyBETUEgb24gImNvbXBsZXgiIHRyYW5zZmVycywgaS5lLiB3aXRoCisJICogbm9uLXdvcmQtYWxpZ25lZCBidWZmZXJzIG9yIGxlbmd0aHMuIEFsc28sIHdlIGRvbid0IGJvdGhlcgorCSAqIHdpdGggYWxsIHRoZSBETUEgc2V0dXAgb3ZlcmhlYWQgZm9yIHNob3J0IHRyYW5zZmVycy4KKwkgKi8KKwlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCBBVE1DSV9ETUFfVEhSRVNIT0xEKQorCQlyZXR1cm4gYXRtY2lfcHJlcGFyZV9kYXRhKGhvc3QsIGRhdGEpOworCWlmIChkYXRhLT5ibGtzeiAmIDMpCisJCXJldHVybiBhdG1jaV9wcmVwYXJlX2RhdGEoaG9zdCwgZGF0YSk7CiAKLQkJaG9zdC0+c2cgPSBkYXRhLT5zZzsKLQkJaG9zdC0+cGlvX29mZnNldCA9IDA7Ci0JCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCi0JCQlpZmxhZ3MgfD0gTUNJX1JYUkRZOwotCQllbHNlCi0JCQlpZmxhZ3MgfD0gTUNJX1RYUkRZOworCWZvcl9lYWNoX3NnKGRhdGEtPnNnLCBzZywgZGF0YS0+c2dfbGVuLCBpKSB7CisJCWlmIChzZy0+b2Zmc2V0ICYgMyB8fCBzZy0+bGVuZ3RoICYgMykKKwkJCXJldHVybiBhdG1jaV9wcmVwYXJlX2RhdGEoaG9zdCwgZGF0YSk7CiAJfQogCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoYW5uZWwsIHdlIGNhbid0IGRvIERNQSAqLworCWNoYW4gPSBob3N0LT5kbWEuY2hhbjsKKwlpZiAoY2hhbikKKwkJaG9zdC0+ZGF0YV9jaGFuID0gY2hhbjsKKworCWlmICghY2hhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfZG1hKQorCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfRE1BLCBBVE1DSV9ETUFfQ0hLU0laRSgzKSB8IEFUTUNJX0RNQUVOKTsKKworCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpCisJCWRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwllbHNlCisJCWRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisKKwlzZ2xlbiA9IGRtYV9tYXBfc2coY2hhbi0+ZGV2aWNlLT5kZXYsIGRhdGEtPnNnLAorCQkJZGF0YS0+c2dfbGVuLCBkaXJlY3Rpb24pOworCisJZGVzYyA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwKKwkJCWRhdGEtPnNnLCBzZ2xlbiwgZGlyZWN0aW9uLAorCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKKwlpZiAoIWRlc2MpCisJCWdvdG8gdW5tYXBfZXhpdDsKKworCWhvc3QtPmRtYS5kYXRhX2Rlc2MgPSBkZXNjOworCWRlc2MtPmNhbGxiYWNrID0gYXRtY2lfZG1hX2NvbXBsZXRlOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gaG9zdDsKKwogCXJldHVybiBpZmxhZ3M7Cit1bm1hcF9leGl0OgorCWRtYV91bm1hcF9zZyhjaGFuLT5kZXZpY2UtPmRldiwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAorc3RhdGljIHZvaWQKK2F0bWNpX3N1Ym1pdF9kYXRhKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTdGFydCBQREMgYWNjb3JkaW5nIHRvIHRyYW5zZmVyIGRpcmVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2F0bWNpX3N1Ym1pdF9kYXRhX3BkYyhzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUVMX1BEQ19QVENSLCBBVE1FTF9QRENfUlhURU4pOworCWVsc2UKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUVMX1BEQ19QVENSLCBBVE1FTF9QRENfVFhURU4pOworfQorCitzdGF0aWMgdm9pZAorYXRtY2lfc3VibWl0X2RhdGFfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4JCQkqY2hhbiA9IGhvc3QtPmRhdGFfY2hhbjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRlc2MgPSBob3N0LT5kbWEuZGF0YV9kZXNjOworCisJaWYgKGNoYW4pIHsKKwkJZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKwkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdG1jaV9zdG9wX3RyYW5zZmVyKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpCit7CisJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7Cit9CisKKy8qCisgKiBTdG9wIGRhdGEgdHJhbnNmZXIgYmVjYXVzZSBlcnJvcihzKSBvY2N1cmVkLgorICovCitzdGF0aWMgdm9pZCBhdG1jaV9zdG9wX3RyYW5zZmVyX3BkYyhzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX05PVEJVU1kpOworfQorCitzdGF0aWMgdm9pZCBhdG1jaV9zdG9wX3RyYW5zZmVyX2RtYShzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGhvc3QtPmRhdGFfY2hhbjsKKworCWlmIChjaGFuKSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGNoYW4pOworCQlhdG1jaV9kbWFfY2xlYW51cChob3N0KTsKKwl9IGVsc2UgeworCQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlhdG1jaV9zZXRfcGVuZGluZyhob3N0LCBFVkVOVF9YRkVSX0NPTVBMRVRFKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7CisJfQorfQorCisvKgorICogU3RhcnQgYSByZXF1ZXN0OiBwcmVwYXJlIGRhdGEgaWYgbmVlZGVkLCBwcmVwYXJlIHRoZSBjb21tYW5kIGFuZCBhY3RpdmF0ZQorICogaW50ZXJydXB0cy4KKyAqLwogc3RhdGljIHZvaWQgYXRtY2lfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAogCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QpCiB7CkBAIC03OTIsMjQgKzk2NSwyNCBAQAogCWhvc3QtPmRhdGFfc3RhdHVzID0gMDsKIAogCWlmIChob3N0LT5uZWVkX3Jlc2V0KSB7Ci0JCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9TV1JTVCk7Ci0JCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9NQ0lFTik7Ci0JCW1jaV93cml0ZWwoaG9zdCwgTVIsIGhvc3QtPm1vZGVfcmVnKTsKLQkJaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJCW1jaV93cml0ZWwoaG9zdCwgQ0ZHLCBob3N0LT5jZmdfcmVnKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9TV1JTVCk7CisJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfTUNJRU4pOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnKTsKKwkJaWYgKGhvc3QtPmNhcHMuaGFzX2NmZ19yZWcpCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ0ZHLCBob3N0LT5jZmdfcmVnKTsKIAkJaG9zdC0+bmVlZF9yZXNldCA9IGZhbHNlOwogCX0KLQltY2lfd3JpdGVsKGhvc3QsIFNEQ1IsIHNsb3QtPnNkY19yZWcpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9TRENSLCBzbG90LT5zZGNfcmVnKTsKIAotCWlmbGFncyA9IG1jaV9yZWFkbChob3N0LCBJTVIpOwotCWlmIChpZmxhZ3MgJiB+KE1DSV9TRElPSVJRQSB8IE1DSV9TRElPSVJRQikpCisJaWZsYWdzID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfSU1SKTsKKwlpZiAoaWZsYWdzICYgfihBVE1DSV9TRElPSVJRQSB8IEFUTUNJX1NESU9JUlFCKSkKIAkJZGV2X3dhcm4oJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LCAiV0FSTklORzogSU1SPTB4JTA4eFxuIiwKIAkJCQlpZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KHRlc3RfYW5kX2NsZWFyX2JpdChBVE1DSV9DQVJEX05FRURfSU5JVCwgJnNsb3QtPmZsYWdzKSkpIHsKIAkJLyogU2VuZCBpbml0IHNlcXVlbmNlICg3NCBjbG9jayBjeWNsZXMpICovCi0JCW1jaV93cml0ZWwoaG9zdCwgQ01EUiwgTUNJX0NNRFJfU1BDTURfSU5JVCk7Ci0JCXdoaWxlICghKG1jaV9yZWFkbChob3N0LCBTUikgJiBNQ0lfQ01EUkRZKSkKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NNRFIsIEFUTUNJX0NNRFJfU1BDTURfSU5JVCk7CisJCXdoaWxlICghKGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX1NSKSAmIEFUTUNJX0NNRFJEWSkpCiAJCQljcHVfcmVsYXgoKTsKIAl9CiAJaWZsYWdzID0gMDsKQEAgLTgxOCwzMSArOTkxLDMxIEBACiAJCWF0bWNpX3NldF90aW1lb3V0KGhvc3QsIHNsb3QsIGRhdGEpOwogCiAJCS8qIE11c3Qgc2V0IGJsb2NrIGNvdW50L3NpemUgYmVmb3JlIHNlbmRpbmcgY29tbWFuZCAqLwotCQltY2lfd3JpdGVsKGhvc3QsIEJMS1IsIE1DSV9CQ05UKGRhdGEtPmJsb2NrcykKLQkJCQl8IE1DSV9CTEtMRU4oZGF0YS0+Ymxrc3opKTsKKwkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0JMS1IsIEFUTUNJX0JDTlQoZGF0YS0+YmxvY2tzKQorCQkJCXwgQVRNQ0lfQkxLTEVOKGRhdGEtPmJsa3N6KSk7CiAJCWRldl92ZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgIkJMS1I9MHglMDh4XG4iLAotCQkJTUNJX0JDTlQoZGF0YS0+YmxvY2tzKSB8IE1DSV9CTEtMRU4oZGF0YS0+Ymxrc3opKTsKKwkJCUFUTUNJX0JDTlQoZGF0YS0+YmxvY2tzKSB8IEFUTUNJX0JMS0xFTihkYXRhLT5ibGtzeikpOwogCi0JCWlmbGFncyB8PSBhdG1jaV9wcmVwYXJlX2RhdGEoaG9zdCwgZGF0YSk7CisJCWlmbGFncyB8PSBob3N0LT5wcmVwYXJlX2RhdGEoaG9zdCwgZGF0YSk7CiAJfQogCi0JaWZsYWdzIHw9IE1DSV9DTURSRFk7CisJaWZsYWdzIHw9IEFUTUNJX0NNRFJEWTsKIAljbWQgPSBtcnEtPmNtZDsKIAljbWRmbGFncyA9IGF0bWNpX3ByZXBhcmVfY29tbWFuZChzbG90LT5tbWMsIGNtZCk7Ci0JYXRtY2lfc3RhcnRfY29tbWFuZChob3N0LCBjbWQsIGNtZGZsYWdzKTsKKwlhdG1jaV9zZW5kX2NvbW1hbmQoaG9zdCwgY21kLCBjbWRmbGFncyk7CiAKIAlpZiAoZGF0YSkKLQkJYXRtY2lfc3VibWl0X2RhdGEoaG9zdCk7CisJCWhvc3QtPnN1Ym1pdF9kYXRhKGhvc3QsIGRhdGEpOwogCiAJaWYgKG1ycS0+c3RvcCkgewogCQlob3N0LT5zdG9wX2NtZHIgPSBhdG1jaV9wcmVwYXJlX2NvbW1hbmQoc2xvdC0+bW1jLCBtcnEtPnN0b3ApOwotCQlob3N0LT5zdG9wX2NtZHIgfD0gTUNJX0NNRFJfU1RPUF9YRkVSOworCQlob3N0LT5zdG9wX2NtZHIgfD0gQVRNQ0lfQ01EUl9TVE9QX1hGRVI7CiAJCWlmICghKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpKQotCQkJaG9zdC0+c3RvcF9jbWRyIHw9IE1DSV9DTURSX1RSRElSX1JFQUQ7CisJCQlob3N0LT5zdG9wX2NtZHIgfD0gQVRNQ0lfQ01EUl9UUkRJUl9SRUFEOwogCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9TVFJFQU0pCi0JCQlob3N0LT5zdG9wX2NtZHIgfD0gTUNJX0NNRFJfU1RSRUFNOworCQkJaG9zdC0+c3RvcF9jbWRyIHw9IEFUTUNJX0NNRFJfU1RSRUFNOwogCQllbHNlCi0JCQlob3N0LT5zdG9wX2NtZHIgfD0gTUNJX0NNRFJfTVVMVElfQkxPQ0s7CisJCQlob3N0LT5zdG9wX2NtZHIgfD0gQVRNQ0lfQ01EUl9NVUxUSV9CTE9DSzsKIAl9CiAKIAkvKgpAQCAtODUxLDcgKzEwMjQsNyBAQAogCSAqIGNvbmRpdGlvbnMgKGUuZy4gY29tbWFuZCBhbmQgZGF0YSBjb21wbGV0ZSwgYnV0IHN0b3Agbm90CiAJICogcHJlcGFyZWQgeWV0LikKIAkgKi8KLQltY2lfd3JpdGVsKGhvc3QsIElFUiwgaWZsYWdzKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBpZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBhdG1jaV9xdWV1ZV9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCkBAIC05MDksMTMgKzEwODIsMTMgQEAKIAlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0ID0gc2xvdC0+aG9zdDsKIAl1bnNpZ25lZCBpbnQJCWk7CiAKLQlzbG90LT5zZGNfcmVnICY9IH5NQ0lfU0RDQlVTX01BU0s7CisJc2xvdC0+c2RjX3JlZyAmPSB+QVRNQ0lfU0RDQlVTX01BU0s7CiAJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgewogCWNhc2UgTU1DX0JVU19XSURUSF8xOgotCQlzbG90LT5zZGNfcmVnIHw9IE1DSV9TRENCVVNfMUJJVDsKKwkJc2xvdC0+c2RjX3JlZyB8PSBBVE1DSV9TRENCVVNfMUJJVDsKIAkJYnJlYWs7CiAJY2FzZSBNTUNfQlVTX1dJRFRIXzQ6Ci0JCXNsb3QtPnNkY19yZWcgfD0gTUNJX1NEQ0JVU180QklUOworCQlzbG90LT5zZGNfcmVnIHw9IEFUTUNJX1NEQ0JVU180QklUOwogCQlicmVhazsKIAl9CiAKQEAgLTkyNiwxMCArMTA5OSwxMCBAQAogCQlzcGluX2xvY2tfYmgoJmhvc3QtPmxvY2spOwogCQlpZiAoIWhvc3QtPm1vZGVfcmVnKSB7CiAJCQljbGtfZW5hYmxlKGhvc3QtPm1jayk7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfU1dSU1QpOwotCQkJbWNpX3dyaXRlbChob3N0LCBDUiwgTUNJX0NSX01DSUVOKTsKLQkJCWlmIChhdG1jaV9pc19tY2kyKCkpCi0JCQkJbWNpX3dyaXRlbChob3N0LCBDRkcsIGhvc3QtPmNmZ19yZWcpOworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9TV1JTVCk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX01DSUVOKTsKKwkJCWlmIChob3N0LT5jYXBzLmhhc19jZmdfcmVnKQorCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DRkcsIGhvc3QtPmNmZ19yZWcpOwogCQl9CiAKIAkJLyoKQEAgLTkzNyw3ICsxMTEwLDcgQEAKIAkJICogY29yZSBpb3MgdXBkYXRlIHdoZW4gZmluZGluZyB0aGUgbWluaW11bS4KIAkJICovCiAJCXNsb3QtPmNsb2NrID0gaW9zLT5jbG9jazsKLQkJZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVRNQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKIAkJCWlmIChob3N0LT5zbG90W2ldICYmIGhvc3QtPnNsb3RbaV0tPmNsb2NrCiAJCQkJCSYmIGhvc3QtPnNsb3RbaV0tPmNsb2NrIDwgY2xvY2tfbWluKQogCQkJCWNsb2NrX21pbiA9IGhvc3QtPnNsb3RbaV0tPmNsb2NrOwpAQCAtOTUyLDI4ICsxMTI1LDI4IEBACiAJCQljbGtkaXYgPSAyNTU7CiAJCX0KIAotCQlob3N0LT5tb2RlX3JlZyA9IE1DSV9NUl9DTEtESVYoY2xrZGl2KTsKKwkJaG9zdC0+bW9kZV9yZWcgPSBBVE1DSV9NUl9DTEtESVYoY2xrZGl2KTsKIAogCQkvKgogCQkgKiBXUlBST09GIGFuZCBSRFBST09GIHByZXZlbnQgb3ZlcnJ1bnMvdW5kZXJydW5zIGJ5CiAJCSAqIHN0b3BwaW5nIHRoZSBjbG9jayB3aGVuIHRoZSBGSUZPIGlzIGZ1bGwvZW1wdHkuCiAJCSAqIFRoaXMgc3RhdGUgaXMgbm90IGV4cGVjdGVkIHRvIGxhc3QgZm9yIGxvbmcuCiAJCSAqLwotCQlpZiAobWNpX2hhc19yd3Byb29mKCkpCi0JCQlob3N0LT5tb2RlX3JlZyB8PSAoTUNJX01SX1dSUFJPT0YgfCBNQ0lfTVJfUkRQUk9PRik7CisJCWlmIChob3N0LT5jYXBzLmhhc19yd3Byb29mKQorCQkJaG9zdC0+bW9kZV9yZWcgfD0gKEFUTUNJX01SX1dSUFJPT0YgfCBBVE1DSV9NUl9SRFBST09GKTsKIAotCQlpZiAoYXRtY2lfaXNfbWNpMigpKSB7CisJCWlmIChob3N0LT5jYXBzLmhhc19jZmdfcmVnKSB7CiAJCQkvKiBzZXR1cCBIaWdoIFNwZWVkIG1vZGUgaW4gcmVsYXRpb24gd2l0aCBjYXJkIGNhcGFjaXR5ICovCiAJCQlpZiAoaW9zLT50aW1pbmcgPT0gTU1DX1RJTUlOR19TRF9IUykKLQkJCQlob3N0LT5jZmdfcmVnIHw9IE1DSV9DRkdfSFNNT0RFOworCQkJCWhvc3QtPmNmZ19yZWcgfD0gQVRNQ0lfQ0ZHX0hTTU9ERTsKIAkJCWVsc2UKLQkJCQlob3N0LT5jZmdfcmVnICY9IH5NQ0lfQ0ZHX0hTTU9ERTsKKwkJCQlob3N0LT5jZmdfcmVnICY9IH5BVE1DSV9DRkdfSFNNT0RFOwogCQl9CiAKIAkJaWYgKGxpc3RfZW1wdHkoJmhvc3QtPnF1ZXVlKSkgewotCQkJbWNpX3dyaXRlbChob3N0LCBNUiwgaG9zdC0+bW9kZV9yZWcpOwotCQkJaWYgKGF0bWNpX2lzX21jaTIoKSkKLQkJCQltY2lfd3JpdGVsKGhvc3QsIENGRywgaG9zdC0+Y2ZnX3JlZyk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnKTsKKwkJCWlmIChob3N0LT5jYXBzLmhhc19jZmdfcmVnKQorCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DRkcsIGhvc3QtPmNmZ19yZWcpOwogCQl9IGVsc2UgewogCQkJaG9zdC0+bmVlZF9jbG9ja191cGRhdGUgPSB0cnVlOwogCQl9CkBAIC05ODQsMTYgKzExNTcsMTYgQEAKIAogCQlzcGluX2xvY2tfYmgoJmhvc3QtPmxvY2spOwogCQlzbG90LT5jbG9jayA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFUTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CiAJCQlpZiAoaG9zdC0+c2xvdFtpXSAmJiBob3N0LT5zbG90W2ldLT5jbG9jaykgewogCQkJCWFueV9zbG90X2FjdGl2ZSA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJaWYgKCFhbnlfc2xvdF9hY3RpdmUpIHsKLQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9NQ0lESVMpOworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NSLCBBVE1DSV9DUl9NQ0lESVMpOwogCQkJaWYgKGhvc3QtPm1vZGVfcmVnKSB7Ci0JCQkJbWNpX3JlYWRsKGhvc3QsIE1SKTsKKwkJCQlhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9NUik7CiAJCQkJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKIAkJCX0KIAkJCWhvc3QtPm1vZGVfcmVnID0gMDsKQEAgLTEwNTcsOSArMTIzMCw5IEBACiAJc3RydWN0IGF0bWVsX21jaQkqaG9zdCA9IHNsb3QtPmhvc3Q7CiAKIAlpZiAoZW5hYmxlKQotCQltY2lfd3JpdGVsKGhvc3QsIElFUiwgc2xvdC0+c2Rpb19pcnEpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBzbG90LT5zZGlvX2lycSk7CiAJZWxzZQotCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgc2xvdC0+c2Rpb19pcnEpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBzbG90LT5zZGlvX2lycSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGF0bWNpX29wcyA9IHsKQEAgLTEwODYsOSArMTI1OSw5IEBACiAJICogYnVzeSB0cmFuc2ZlcnJpbmcgZGF0YS4KIAkgKi8KIAlpZiAoaG9zdC0+bmVlZF9jbG9ja191cGRhdGUpIHsKLQkJbWNpX3dyaXRlbChob3N0LCBNUiwgaG9zdC0+bW9kZV9yZWcpOwotCQlpZiAoYXRtY2lfaXNfbWNpMigpKQotCQkJbWNpX3dyaXRlbChob3N0LCBDRkcsIGhvc3QtPmNmZ19yZWcpOworCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnKTsKKwkJaWYgKGhvc3QtPmNhcHMuaGFzX2NmZ19yZWcpCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ0ZHLCBob3N0LT5jZmdfcmVnKTsKIAl9CiAKIAlob3N0LT5jdXJfc2xvdC0+bXJxID0gTlVMTDsKQEAgLTExMTcsMTYgKzEyOTAsMTYgQEAKIAl1MzIJCXN0YXR1cyA9IGhvc3QtPmNtZF9zdGF0dXM7CiAKIAkvKiBSZWFkIHRoZSByZXNwb25zZSBmcm9tIHRoZSBjYXJkICh1cCB0byAxNiBieXRlcykgKi8KLQljbWQtPnJlc3BbMF0gPSBtY2lfcmVhZGwoaG9zdCwgUlNQUik7Ci0JY21kLT5yZXNwWzFdID0gbWNpX3JlYWRsKGhvc3QsIFJTUFIpOwotCWNtZC0+cmVzcFsyXSA9IG1jaV9yZWFkbChob3N0LCBSU1BSKTsKLQljbWQtPnJlc3BbM10gPSBtY2lfcmVhZGwoaG9zdCwgUlNQUik7CisJY21kLT5yZXNwWzBdID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfUlNQUik7CisJY21kLT5yZXNwWzFdID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfUlNQUik7CisJY21kLT5yZXNwWzJdID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfUlNQUik7CisJY21kLT5yZXNwWzNdID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfUlNQUik7CiAKLQlpZiAoc3RhdHVzICYgTUNJX1JUT0UpCisJaWYgKHN0YXR1cyAmIEFUTUNJX1JUT0UpCiAJCWNtZC0+ZXJyb3IgPSAtRVRJTUVET1VUOwotCWVsc2UgaWYgKChjbWQtPmZsYWdzICYgTU1DX1JTUF9DUkMpICYmIChzdGF0dXMgJiBNQ0lfUkNSQ0UpKQorCWVsc2UgaWYgKChjbWQtPmZsYWdzICYgTU1DX1JTUF9DUkMpICYmIChzdGF0dXMgJiBBVE1DSV9SQ1JDRSkpCiAJCWNtZC0+ZXJyb3IgPSAtRUlMU0VROwotCWVsc2UgaWYgKHN0YXR1cyAmIChNQ0lfUklOREUgfCBNQ0lfUkRJUkUgfCBNQ0lfUkVOREUpKQorCWVsc2UgaWYgKHN0YXR1cyAmIChBVE1DSV9SSU5ERSB8IEFUTUNJX1JESVJFIHwgQVRNQ0lfUkVOREUpKQogCQljbWQtPmVycm9yID0gLUVJTzsKIAllbHNlCiAJCWNtZC0+ZXJyb3IgPSAwOwpAQCAtMTEzNiwxMCArMTMwOSwxMCBAQAogCQkJImNvbW1hbmQgZXJyb3I6IHN0YXR1cz0weCUwOHhcbiIsIHN0YXR1cyk7CiAKIAkJaWYgKGNtZC0+ZGF0YSkgewotCQkJYXRtY2lfc3RvcF9kbWEoaG9zdCk7CisJCQlob3N0LT5zdG9wX3RyYW5zZmVyKGhvc3QpOwogCQkJaG9zdC0+ZGF0YSA9IE5VTEw7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgTUNJX05PVEJVU1kKLQkJCQkJfCBNQ0lfVFhSRFkgfCBNQ0lfUlhSRFkKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX05PVEJVU1kKKwkJCQkJfCBBVE1DSV9UWFJEWSB8IEFUTUNJX1JYUkRZCiAJCQkJCXwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUyk7CiAJCX0KIAl9CkBAIC0xMTkxLDExICsxMzY0LDExIEBACiAJCQkJICogUmVzZXQgY29udHJvbGxlciB0byB0ZXJtaW5hdGUgYW55IG9uZ29pbmcKIAkJCQkgKiBjb21tYW5kcyBvciBkYXRhIHRyYW5zZmVycy4KIAkJCQkgKi8KLQkJCQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfU1dSU1QpOwotCQkJCW1jaV93cml0ZWwoaG9zdCwgQ1IsIE1DSV9DUl9NQ0lFTik7Ci0JCQkJbWNpX3dyaXRlbChob3N0LCBNUiwgaG9zdC0+bW9kZV9yZWcpOwotCQkJCWlmIChhdG1jaV9pc19tY2kyKCkpCi0JCQkJCW1jaV93cml0ZWwoaG9zdCwgQ0ZHLCBob3N0LT5jZmdfcmVnKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX1NXUlNUKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfQ1IsIEFUTUNJX0NSX01DSUVOKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfTVIsIGhvc3QtPm1vZGVfcmVnKTsKKwkJCQlpZiAoaG9zdC0+Y2Fwcy5oYXNfY2ZnX3JlZykKKwkJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0NGRywgaG9zdC0+Y2ZnX3JlZyk7CiAKIAkJCQlob3N0LT5kYXRhID0gTlVMTDsKIAkJCQlob3N0LT5jbWQgPSBOVUxMOwpAQCAtMTIxMCw3ICsxMzgzLDcgQEAKIAkJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQkJY2FzZSBTVEFURV9TRU5ESU5HX0RBVEE6CiAJCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOwotCQkJCQlhdG1jaV9zdG9wX2RtYShob3N0KTsKKwkJCQkJaG9zdC0+c3RvcF90cmFuc2Zlcihob3N0KTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBTVEFURV9EQVRBX0JVU1k6CiAJCQkJY2FzZSBTVEFURV9EQVRBX0VSUk9SOgpAQCAtMTI2MSw3ICsxNDM0LDcgQEAKIAlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LAogCQkidGFza2xldDogc3RhdGUgJXUgcGVuZGluZy9jb21wbGV0ZWQvbWFzayAlbHgvJWx4LyV4XG4iLAogCQlzdGF0ZSwgaG9zdC0+cGVuZGluZ19ldmVudHMsIGhvc3QtPmNvbXBsZXRlZF9ldmVudHMsCi0JCW1jaV9yZWFkbChob3N0LCBJTVIpKTsKKwkJYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfSU1SKSk7CiAKIAlkbyB7CiAJCXByZXZfc3RhdGUgPSBzdGF0ZTsKQEAgLTEyODksOSArMTQ2Miw5IEBACiAJCWNhc2UgU1RBVEVfU0VORElOR19EQVRBOgogCQkJaWYgKGF0bWNpX3Rlc3RfYW5kX2NsZWFyX3BlbmRpbmcoaG9zdCwKIAkJCQkJCUVWRU5UX0RBVEFfRVJST1IpKSB7Ci0JCQkJYXRtY2lfc3RvcF9kbWEoaG9zdCk7CisJCQkJaG9zdC0+c3RvcF90cmFuc2Zlcihob3N0KTsKIAkJCQlpZiAoZGF0YS0+c3RvcCkKLQkJCQkJc2VuZF9zdG9wX2NtZChob3N0LCBkYXRhKTsKKwkJCQkJYXRtY2lfc2VuZF9zdG9wX2NtZChob3N0LCBkYXRhKTsKIAkJCQlzdGF0ZSA9IFNUQVRFX0RBVEFfRVJST1I7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMzEzLDExICsxNDg2LDExIEBACiAJCQlhdG1jaV9zZXRfY29tcGxldGVkKGhvc3QsIEVWRU5UX0RBVEFfQ09NUExFVEUpOwogCQkJc3RhdHVzID0gaG9zdC0+ZGF0YV9zdGF0dXM7CiAJCQlpZiAodW5saWtlbHkoc3RhdHVzICYgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUykpIHsKLQkJCQlpZiAoc3RhdHVzICYgTUNJX0RUT0UpIHsKKwkJCQlpZiAoc3RhdHVzICYgQVRNQ0lfRFRPRSkgewogCQkJCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCiAJCQkJCQkJImRhdGEgdGltZW91dCBlcnJvclxuIik7CiAJCQkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKLQkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1DSV9EQ1JDRSkgeworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgQVRNQ0lfRENSQ0UpIHsKIAkJCQkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAogCQkJCQkJCSJkYXRhIENSQyBlcnJvclxuIik7CiAJCQkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKQEAgLTEzMzAsNyArMTUwMyw3IEBACiAJCQl9IGVsc2UgewogCQkJCWRhdGEtPmJ5dGVzX3hmZXJlZCA9IGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6OwogCQkJCWRhdGEtPmVycm9yID0gMDsKLQkJCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUyk7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUyk7CiAJCQl9CiAKIAkJCWlmICghZGF0YS0+c3RvcCkgewpAQCAtMTM0MCw3ICsxNTEzLDcgQEAKIAogCQkJcHJldl9zdGF0ZSA9IHN0YXRlID0gU1RBVEVfU0VORElOR19TVE9QOwogCQkJaWYgKCFkYXRhLT5lcnJvcikKLQkJCQlzZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOworCQkJCWF0bWNpX3NlbmRfc3RvcF9jbWQoaG9zdCwgZGF0YSk7CiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAogCQljYXNlIFNUQVRFX1NFTkRJTkdfU1RPUDoKQEAgLTEzODAsNyArMTU1Myw3IEBACiAJdW5zaWduZWQgaW50CQluYnl0ZXMgPSAwOwogCiAJZG8gewotCQl2YWx1ZSA9IG1jaV9yZWFkbChob3N0LCBSRFIpOworCQl2YWx1ZSA9IGF0bWNpX3JlYWRsKGhvc3QsIEFUTUNJX1JEUik7CiAJCWlmIChsaWtlbHkob2Zmc2V0ICsgNCA8PSBzZy0+bGVuZ3RoKSkgewogCQkJcHV0X3VuYWxpZ25lZCh2YWx1ZSwgKHUzMiAqKShidWYgKyBvZmZzZXQpKTsKIApAQCAtMTQxMiw5ICsxNTg1LDkgQEAKIAkJCW5ieXRlcyArPSBvZmZzZXQ7CiAJCX0KIAotCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgU1IpOworCQlzdGF0dXMgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9TUik7CiAJCWlmIChzdGF0dXMgJiBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgKE1DSV9OT1RCVVNZIHwgTUNJX1JYUkRZCisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCAoQVRNQ0lfTk9UQlVTWSB8IEFUTUNJX1JYUkRZCiAJCQkJCQl8IEFUTUNJX0RBVEFfRVJST1JfRkxBR1MpKTsKIAkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOwogCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKQEAgLTE0MjMsNyArMTU5Niw3IEBACiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAkJCXJldHVybjsKIAkJfQotCX0gd2hpbGUgKHN0YXR1cyAmIE1DSV9SWFJEWSk7CisJfSB3aGlsZSAoc3RhdHVzICYgQVRNQ0lfUlhSRFkpOwogCiAJaG9zdC0+cGlvX29mZnNldCA9IG9mZnNldDsKIAlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbmJ5dGVzOwpAQCAtMTQzMSw4ICsxNjA0LDggQEAKIAlyZXR1cm47CiAKIGRvbmU6Ci0JbWNpX3dyaXRlbChob3N0LCBJRFIsIE1DSV9SWFJEWSk7Ci0JbWNpX3dyaXRlbChob3N0LCBJRVIsIE1DSV9OT1RCVVNZKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9SWFJEWSk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfTk9UQlVTWSk7CiAJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKIAlzbXBfd21iKCk7CiAJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfWEZFUl9DT01QTEVURSk7CkBAIC0xNDUxLDcgKzE2MjQsNyBAQAogCWRvIHsKIAkJaWYgKGxpa2VseShvZmZzZXQgKyA0IDw9IHNnLT5sZW5ndGgpKSB7CiAJCQl2YWx1ZSA9IGdldF91bmFsaWduZWQoKHUzMiAqKShidWYgKyBvZmZzZXQpKTsKLQkJCW1jaV93cml0ZWwoaG9zdCwgVERSLCB2YWx1ZSk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfVERSLCB2YWx1ZSk7CiAKIAkJCW9mZnNldCArPSA0OwogCQkJbmJ5dGVzICs9IDQ7CkBAIC0xNDcyLDIwICsxNjQ1LDIwIEBACiAKIAkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKIAkJCWlmICghc2cpIHsKLQkJCQltY2lfd3JpdGVsKGhvc3QsIFREUiwgdmFsdWUpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9URFIsIHZhbHVlKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAKIAkJCW9mZnNldCA9IDQgLSByZW1haW5pbmc7CiAJCQlidWYgPSBzZ192aXJ0KHNnKTsKIAkJCW1lbWNweSgodTggKikmdmFsdWUgKyByZW1haW5pbmcsIGJ1Ziwgb2Zmc2V0KTsKLQkJCW1jaV93cml0ZWwoaG9zdCwgVERSLCB2YWx1ZSk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfVERSLCB2YWx1ZSk7CiAJCQluYnl0ZXMgKz0gb2Zmc2V0OwogCQl9CiAKLQkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIFNSKTsKKwkJc3RhdHVzID0gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfU1IpOwogCQlpZiAoc3RhdHVzICYgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUykgewotCQkJbWNpX3dyaXRlbChob3N0LCBJRFIsIChNQ0lfTk9UQlVTWSB8IE1DSV9UWFJEWQorCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgKEFUTUNJX05PVEJVU1kgfCBBVE1DSV9UWFJEWQogCQkJCQkJfCBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKSk7CiAJCQlob3N0LT5kYXRhX3N0YXR1cyA9IHN0YXR1czsKIAkJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CkBAIC0xNDk0LDcgKzE2NjcsNyBAQAogCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiAJCQlyZXR1cm47CiAJCX0KLQl9IHdoaWxlIChzdGF0dXMgJiBNQ0lfVFhSRFkpOworCX0gd2hpbGUgKHN0YXR1cyAmIEFUTUNJX1RYUkRZKTsKIAogCWhvc3QtPnBpb19vZmZzZXQgPSBvZmZzZXQ7CiAJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKQEAgLTE1MDIsOCArMTY3NSw4IEBACiAJcmV0dXJuOwogCiBkb25lOgotCW1jaV93cml0ZWwoaG9zdCwgSURSLCBNQ0lfVFhSRFkpOwotCW1jaV93cml0ZWwoaG9zdCwgSUVSLCBNQ0lfTk9UQlVTWSk7CisJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfVFhSRFkpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX05PVEJVU1kpOwogCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CiAJc21wX3dtYigpOwogCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX1hGRVJfQ09NUExFVEUpOwpAQCAtMTUxMSw3ICsxNjg0LDcgQEAKIAogc3RhdGljIHZvaWQgYXRtY2lfY21kX2ludGVycnVwdChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LCB1MzIgc3RhdHVzKQogewotCW1jaV93cml0ZWwoaG9zdCwgSURSLCBNQ0lfQ01EUkRZKTsKKwlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9DTURSRFkpOwogCiAJaG9zdC0+Y21kX3N0YXR1cyA9IHN0YXR1czsKIAlzbXBfd21iKCk7CkBAIC0xNTIzLDcgKzE2OTYsNyBAQAogewogCWludAlpOwogCi0JZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBVE1DSV9NQVhfTlJfU0xPVFM7IGkrKykgewogCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOwogCQlpZiAoc2xvdCAmJiAoc3RhdHVzICYgc2xvdC0+c2Rpb19pcnEpKSB7CiAJCQltbWNfc2lnbmFsX3NkaW9faXJxKHNsb3QtPm1tYyk7CkBAIC0xNTM5LDQwICsxNzEyLDkyIEBACiAJdW5zaWduZWQgaW50CQlwYXNzX2NvdW50ID0gMDsKIAogCWRvIHsKLQkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIFNSKTsKLQkJbWFzayA9IG1jaV9yZWFkbChob3N0LCBJTVIpOworCQlzdGF0dXMgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9TUik7CisJCW1hc2sgPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9JTVIpOwogCQlwZW5kaW5nID0gc3RhdHVzICYgbWFzazsKIAkJaWYgKCFwZW5kaW5nKQogCQkJYnJlYWs7CiAKIAkJaWYgKHBlbmRpbmcgJiBBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIElEUiwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUwotCQkJCQl8IE1DSV9SWFJEWSB8IE1DSV9UWFJEWSk7Ci0JCQlwZW5kaW5nICY9IG1jaV9yZWFkbChob3N0LCBJTVIpOworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfREFUQV9FUlJPUl9GTEFHUworCQkJCQl8IEFUTUNJX1JYUkRZIHwgQVRNQ0lfVFhSRFkpOworCQkJcGVuZGluZyAmPSBhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9JTVIpOwogCiAJCQlob3N0LT5kYXRhX3N0YXR1cyA9IHN0YXR1czsKIAkJCXNtcF93bWIoKTsKIAkJCWF0bWNpX3NldF9wZW5kaW5nKGhvc3QsIEVWRU5UX0RBVEFfRVJST1IpOwogCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CiAJCX0KLQkJaWYgKHBlbmRpbmcgJiBNQ0lfTk9UQlVTWSkgewotCQkJbWNpX3dyaXRlbChob3N0LCBJRFIsCi0JCQkJCUFUTUNJX0RBVEFfRVJST1JfRkxBR1MgfCBNQ0lfTk9UQlVTWSk7CisKKwkJaWYgKHBlbmRpbmcgJiBBVE1DSV9UWEJVRkUpIHsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX1RYQlVGRSk7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9FTkRUWCk7CisJCQkvKgorCQkJICogV2UgY2FuIHJlY2VpdmUgdGhpcyBpbnRlcnJ1cHRpb24gYmVmb3JlIGhhdmluZyBjb25maWd1cmVkCisJCQkgKiB0aGUgc2Vjb25kIHBkYyBidWZmZXIsIHNvIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgZmlyc3QgYW5kCisJCQkgKiBzZWNvbmQgYnVmZmVycyBhZ2FpbgorCQkJICovCisJCQlpZiAoaG9zdC0+ZGF0YV9zaXplKSB7CisJCQkJYXRtY2lfcGRjX3NldF9ib3RoX2J1Zihob3N0LCBYRkVSX1RSQU5TTUlUKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9FTkRUWCk7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfVFhCVUZFKTsKKwkJCX0gZWxzZSB7CisJCQkJYXRtY2lfcGRjX2NvbXBsZXRlKGhvc3QpOworCQkJfQorCQl9IGVsc2UgaWYgKHBlbmRpbmcgJiBBVE1DSV9FTkRUWCkgeworCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lEUiwgQVRNQ0lfRU5EVFgpOworCisJCQlpZiAoaG9zdC0+ZGF0YV9zaXplKSB7CisJCQkJYXRtY2lfcGRjX3NldF9zaW5nbGVfYnVmKGhvc3QsCisJCQkJCQlYRkVSX1RSQU5TTUlULCBQRENfU0VDT05EX0JVRik7CisJCQkJYXRtY2lfd3JpdGVsKGhvc3QsIEFUTUNJX0lFUiwgQVRNQ0lfRU5EVFgpOworCQkJfQorCQl9CisKKwkJaWYgKHBlbmRpbmcgJiBBVE1DSV9SWEJVRkYpIHsKKwkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIEFUTUNJX1JYQlVGRik7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9FTkRSWCk7CisJCQkvKgorCQkJICogV2UgY2FuIHJlY2VpdmUgdGhpcyBpbnRlcnJ1cHRpb24gYmVmb3JlIGhhdmluZyBjb25maWd1cmVkCisJCQkgKiB0aGUgc2Vjb25kIHBkYyBidWZmZXIsIHNvIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgZmlyc3QgYW5kCisJCQkgKiBzZWNvbmQgYnVmZmVycyBhZ2FpbgorCQkJICovCisJCQlpZiAoaG9zdC0+ZGF0YV9zaXplKSB7CisJCQkJYXRtY2lfcGRjX3NldF9ib3RoX2J1Zihob3N0LCBYRkVSX1JFQ0VJVkUpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX0VORFJYKTsKKwkJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSUVSLCBBVE1DSV9SWEJVRkYpOworCQkJfSBlbHNlIHsKKwkJCQlhdG1jaV9wZGNfY29tcGxldGUoaG9zdCk7CisJCQl9CisJCX0gZWxzZSBpZiAocGVuZGluZyAmIEFUTUNJX0VORFJYKSB7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLCBBVE1DSV9FTkRSWCk7CisKKwkJCWlmIChob3N0LT5kYXRhX3NpemUpIHsKKwkJCQlhdG1jaV9wZGNfc2V0X3NpbmdsZV9idWYoaG9zdCwKKwkJCQkJCVhGRVJfUkVDRUlWRSwgUERDX1NFQ09ORF9CVUYpOworCQkJCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRVIsIEFUTUNJX0VORFJYKTsKKwkJCX0KKwkJfQorCisKKwkJaWYgKHBlbmRpbmcgJiBBVE1DSV9OT1RCVVNZKSB7CisJCQlhdG1jaV93cml0ZWwoaG9zdCwgQVRNQ0lfSURSLAorCQkJCQlBVE1DSV9EQVRBX0VSUk9SX0ZMQUdTIHwgQVRNQ0lfTk9UQlVTWSk7CiAJCQlpZiAoIWhvc3QtPmRhdGFfc3RhdHVzKQogCQkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOwogCQkJc21wX3dtYigpOwogCQkJYXRtY2lfc2V0X3BlbmRpbmcoaG9zdCwgRVZFTlRfREFUQV9DT01QTEVURSk7CiAJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKIAkJfQotCQlpZiAocGVuZGluZyAmIE1DSV9SWFJEWSkKKwkJaWYgKHBlbmRpbmcgJiBBVE1DSV9SWFJEWSkKIAkJCWF0bWNpX3JlYWRfZGF0YV9waW8oaG9zdCk7Ci0JCWlmIChwZW5kaW5nICYgTUNJX1RYUkRZKQorCQlpZiAocGVuZGluZyAmIEFUTUNJX1RYUkRZKQogCQkJYXRtY2lfd3JpdGVfZGF0YV9waW8oaG9zdCk7CiAKLQkJaWYgKHBlbmRpbmcgJiBNQ0lfQ01EUkRZKQorCQlpZiAocGVuZGluZyAmIEFUTUNJX0NNRFJEWSkKIAkJCWF0bWNpX2NtZF9pbnRlcnJ1cHQoaG9zdCwgc3RhdHVzKTsKIAotCQlpZiAocGVuZGluZyAmIChNQ0lfU0RJT0lSUUEgfCBNQ0lfU0RJT0lSUUIpKQorCQlpZiAocGVuZGluZyAmIChBVE1DSV9TRElPSVJRQSB8IEFUTUNJX1NESU9JUlFCKSkKIAkJCWF0bWNpX3NkaW9faW50ZXJydXB0KGhvc3QsIHN0YXR1cyk7CiAKIAl9IHdoaWxlIChwYXNzX2NvdW50KysgPCA1KTsKQEAgLTE2MjEsNyArMTg0Niw3IEBACiAJbW1jLT5vY3JfYXZhaWwJPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNDsKIAlpZiAoc2Rpb19pcnEpCiAJCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX1NESU9fSVJROwotCWlmIChhdG1jaV9pc19tY2kyKCkpCisJaWYgKGhvc3QtPmNhcHMuaGFzX2hpZ2hzcGVlZCkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfU0RfSElHSFNQRUVEOwogCWlmIChzbG90X2RhdGEtPmJ1c193aWR0aCA+PSA0KQogCQltbWMtPmNhcHMgfD0gTU1DX0NBUF80X0JJVF9EQVRBOwpAQCAtMTcwNCw4ICsxOTI5LDcgQEAKIAltbWNfZnJlZV9ob3N0KHNsb3QtPm1tYyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQQotc3RhdGljIGJvb2wgZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqc2xhdmUpCitzdGF0aWMgYm9vbCBhdG1jaV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpzbGF2ZSkKIHsKIAlzdHJ1Y3QgbWNpX2RtYV9kYXRhCSpzbCA9IHNsYXZlOwogCkBAIC0xNzMwLDE0ICsxOTU0LDE0IEBACiAJCWRtYV9jYXBfbWFza190IG1hc2s7CiAKIAkJc2V0dXBfZG1hX2FkZHIocGRhdGEtPmRtYV9zbGF2ZSwKLQkJCSAgICAgICBob3N0LT5tYXBiYXNlICsgTUNJX1REUiwKLQkJCSAgICAgICBob3N0LT5tYXBiYXNlICsgTUNJX1JEUik7CisJCQkgICAgICAgaG9zdC0+bWFwYmFzZSArIEFUTUNJX1REUiwKKwkJCSAgICAgICBob3N0LT5tYXBiYXNlICsgQVRNQ0lfUkRSKTsKIAogCQkvKiBUcnkgdG8gZ3JhYiBhIERNQSBjaGFubmVsICovCiAJCWRtYV9jYXBfemVybyhtYXNrKTsKIAkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKIAkJaG9zdC0+ZG1hLmNoYW4gPQotCQkJZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIHBkYXRhLT5kbWFfc2xhdmUpOworCQkJZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBhdG1jaV9maWx0ZXIsIHBkYXRhLT5kbWFfc2xhdmUpOwogCX0KIAlpZiAoIWhvc3QtPmRtYS5jaGFuKQogCQlkZXZfbm90aWNlKCZob3N0LT5wZGV2LT5kZXYsICJETUEgbm90IGF2YWlsYWJsZSwgdXNpbmcgUElPXG4iKTsKQEAgLTE3NDYsOSArMTk3MCw2MCBAQAogCQkJCQkiVXNpbmcgJXMgZm9yIERNQSB0cmFuc2ZlcnNcbiIsCiAJCQkJCWRtYV9jaGFuX25hbWUoaG9zdC0+ZG1hLmNoYW4pKTsKIH0KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRtY2lfZ2V0X3ZlcnNpb24oc3RydWN0IGF0bWVsX21jaSAqaG9zdCkKK3sKKwlyZXR1cm4gYXRtY2lfcmVhZGwoaG9zdCwgQVRNQ0lfVkVSU0lPTikgJiAweDAwMDAwZmZmOworfQorCisvKgorICogSFNNQ0kgKEhpZ2ggU3BlZWQgTUNJKSBtb2R1bGUgaXMgbm90IGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBNQ0kgbW9kdWxlLgorICogSFNNQ0kgcHJvdmlkZXMgRE1BIHN1cHBvcnQgYW5kIGEgbmV3IGNvbmZpZyByZWdpc3RlciBidXQgbm8gbW9yZSBzdXBwb3J0cworICogUERDLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgYXRtY2lfZ2V0X2NhcChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0KQoreworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCisJdmVyc2lvbiA9IGF0bWNpX2dldF92ZXJzaW9uKGhvc3QpOworCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCisJCQkidmVyc2lvbjogMHgleFxuIiwgdmVyc2lvbik7CisKKwlob3N0LT5jYXBzLmhhc19kbWEgPSAwOworCWhvc3QtPmNhcHMuaGFzX3BkYyA9IDA7CisJaG9zdC0+Y2Fwcy5oYXNfY2ZnX3JlZyA9IDA7CisJaG9zdC0+Y2Fwcy5oYXNfY3N0b3JfcmVnID0gMDsKKwlob3N0LT5jYXBzLmhhc19oaWdoc3BlZWQgPSAwOworCWhvc3QtPmNhcHMuaGFzX3J3cHJvb2YgPSAwOworCisJLyoga2VlcCBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyICovCisJc3dpdGNoICh2ZXJzaW9uICYgMHhmMDApIHsKKwljYXNlIDB4MTAwOgorCWNhc2UgMHgyMDA6CisJCWhvc3QtPmNhcHMuaGFzX3BkYyA9IDE7CisJCWhvc3QtPmNhcHMuaGFzX3J3cHJvb2YgPSAxOworCQlicmVhazsKKwljYXNlIDB4MzAwOgorCWNhc2UgMHg0MDA6CisJY2FzZSAweDUwMDoKKyNpZmRlZiBDT05GSUdfQVRfSERNQUMKKwkJaG9zdC0+Y2Fwcy5oYXNfZG1hID0gMTsKICNlbHNlCi1zdGF0aWMgdm9pZCBhdG1jaV9jb25maWd1cmVfZG1hKHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QpIHt9CisJCWhvc3QtPmNhcHMuaGFzX2RtYSA9IDA7CisJCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCisJCQkiaGFzIGRtYSBjYXBhYmlsaXR5IGJ1dCBkbWEgZW5naW5lIGlzIG5vdCBzZWxlY3RlZCwgdGhlbiB1c2UgcGlvXG4iKTsKICNlbmRpZgorCQlob3N0LT5jYXBzLmhhc19jZmdfcmVnID0gMTsKKwkJaG9zdC0+Y2Fwcy5oYXNfY3N0b3JfcmVnID0gMTsKKwkJaG9zdC0+Y2Fwcy5oYXNfaGlnaHNwZWVkID0gMTsKKwkJaG9zdC0+Y2Fwcy5oYXNfcndwcm9vZiA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJIlVubWFuYWdlZCBtY2kgdmVyc2lvbiwgc2V0IG1pbmltdW0gY2FwYWJpbGl0aWVzXG4iKTsKKwkJYnJlYWs7CisJfQorfQogCiBzdGF0aWMgaW50IF9faW5pdCBhdG1jaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMTc4OSw3ICsyMDY0LDcgQEAKIAkJZ290byBlcnJfaW9yZW1hcDsKIAogCWNsa19lbmFibGUoaG9zdC0+bWNrKTsKLQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfU1dSU1QpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfU1dSU1QpOwogCWhvc3QtPmJ1c19oeiA9IGNsa19nZXRfcmF0ZShob3N0LT5tY2spOwogCWNsa19kaXNhYmxlKGhvc3QtPm1jayk7CiAKQEAgLTE4MDEsNyArMjA3NiwyNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwogCi0JYXRtY2lfY29uZmlndXJlX2RtYShob3N0KTsKKwkvKiBHZXQgTUNJIGNhcGFiaWxpdGllcyBhbmQgc2V0IG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIGl0ICovCisJYXRtY2lfZ2V0X2NhcChob3N0KTsKKwlpZiAoaG9zdC0+Y2Fwcy5oYXNfZG1hKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ1c2luZyBETUFcbiIpOworCQlob3N0LT5wcmVwYXJlX2RhdGEgPSAmYXRtY2lfcHJlcGFyZV9kYXRhX2RtYTsKKwkJaG9zdC0+c3VibWl0X2RhdGEgPSAmYXRtY2lfc3VibWl0X2RhdGFfZG1hOworCQlob3N0LT5zdG9wX3RyYW5zZmVyID0gJmF0bWNpX3N0b3BfdHJhbnNmZXJfZG1hOworCX0gZWxzZSBpZiAoaG9zdC0+Y2Fwcy5oYXNfcGRjKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ1c2luZyBQRENcbiIpOworCQlob3N0LT5wcmVwYXJlX2RhdGEgPSAmYXRtY2lfcHJlcGFyZV9kYXRhX3BkYzsKKwkJaG9zdC0+c3VibWl0X2RhdGEgPSAmYXRtY2lfc3VibWl0X2RhdGFfcGRjOworCQlob3N0LT5zdG9wX3RyYW5zZmVyID0gJmF0bWNpX3N0b3BfdHJhbnNmZXJfcGRjOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJubyBETUEsIG5vIFBEQ1xuIik7CisJCWhvc3QtPnByZXBhcmVfZGF0YSA9ICZhdG1jaV9wcmVwYXJlX2RhdGE7CisJCWhvc3QtPnN1Ym1pdF9kYXRhID0gJmF0bWNpX3N1Ym1pdF9kYXRhOworCQlob3N0LT5zdG9wX3RyYW5zZmVyID0gJmF0bWNpX3N0b3BfdHJhbnNmZXI7CisJfQorCisJaWYgKGhvc3QtPmNhcHMuaGFzX2RtYSkKKwkJYXRtY2lfY29uZmlndXJlX2RtYShob3N0KTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCkBAIC0xODEwLDEzICsyMTA1LDEzIEBACiAJcmV0ID0gLUVOT0RFVjsKIAlpZiAocGRhdGEtPnNsb3RbMF0uYnVzX3dpZHRoKSB7CiAJCXJldCA9IGF0bWNpX2luaXRfc2xvdChob3N0LCAmcGRhdGEtPnNsb3RbMF0sCi0JCQkJMCwgTUNJX1NEQ1NFTF9TTE9UX0EsIE1DSV9TRElPSVJRQSk7CisJCQkJMCwgQVRNQ0lfU0RDU0VMX1NMT1RfQSwgQVRNQ0lfU0RJT0lSUUEpOwogCQlpZiAoIXJldCkKIAkJCW5yX3Nsb3RzKys7CiAJfQogCWlmIChwZGF0YS0+c2xvdFsxXS5idXNfd2lkdGgpIHsKIAkJcmV0ID0gYXRtY2lfaW5pdF9zbG90KGhvc3QsICZwZGF0YS0+c2xvdFsxXSwKLQkJCQkxLCBNQ0lfU0RDU0VMX1NMT1RfQiwgTUNJX1NESU9JUlFCKTsKKwkJCQkxLCBBVE1DSV9TRENTRUxfU0xPVF9CLCBBVE1DSV9TRElPSVJRQik7CiAJCWlmICghcmV0KQogCQkJbnJfc2xvdHMrKzsKIAl9CkBAIC0xODMzLDEwICsyMTI4LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX2luaXRfc2xvdDoKLSNpZmRlZiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQQogCWlmIChob3N0LT5kbWEuY2hhbikKIAkJZG1hX3JlbGVhc2VfY2hhbm5lbChob3N0LT5kbWEuY2hhbik7Ci0jZW5kaWYKIAlmcmVlX2lycShpcnEsIGhvc3QpOwogZXJyX3JlcXVlc3RfaXJxOgogCWlvdW5tYXAoaG9zdC0+cmVncyk7CkBAIC0xODU0LDE1ICsyMTQ3LDE1IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVRNQ0lfTUFYX05SX1NMT1RTOyBpKyspIHsKIAkJaWYgKGhvc3QtPnNsb3RbaV0pCiAJCQlhdG1jaV9jbGVhbnVwX3Nsb3QoaG9zdC0+c2xvdFtpXSwgaSk7CiAJfQogCiAJY2xrX2VuYWJsZShob3N0LT5tY2spOwotCW1jaV93cml0ZWwoaG9zdCwgSURSLCB+MFVMKTsKLQltY2lfd3JpdGVsKGhvc3QsIENSLCBNQ0lfQ1JfTUNJRElTKTsKLQltY2lfcmVhZGwoaG9zdCwgU1IpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9JRFIsIH4wVUwpOworCWF0bWNpX3dyaXRlbChob3N0LCBBVE1DSV9DUiwgQVRNQ0lfQ1JfTUNJRElTKTsKKwlhdG1jaV9yZWFkbChob3N0LCBBVE1DSV9TUik7CiAJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKIAogI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCkBAIC0xODg1LDcgKzIxNzgsNyBAQAogCXN0cnVjdCBhdG1lbF9tY2kgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaTsKIAotCSBmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUNJX01BWF9OUl9TTE9UUzsgaSsrKSB7CisJIGZvciAoaSA9IDA7IGkgPCBBVE1DSV9NQVhfTlJfU0xPVFM7IGkrKykgewogCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOwogCQlpbnQgcmV0OwogCkBAIC0xOTE2LDcgKzIyMDksNyBAQAogCWludCBpOwogCWludCByZXQgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IEFUTUVMX01DSV9NQVhfTlJfU0xPVFM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBVE1DSV9NQVhfTlJfU0xPVFM7IGkrKykgewogCQlzdHJ1Y3QgYXRtZWxfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOwogCQlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F1MXhtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCmluZGV4IGVmNzJlODcuLjVkM2I5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCkBAIC01NSw3ICs1NSw3IEBACiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBEQkcoZm10LCBpZHgsIGFyZ3MuLi4pCVwKLQlwcmludGsoS0VSTl9ERUJVRyAiYXUxeG1tYyglZCk6IERFQlVHOiAiIGZtdCwgaWR4LCAjI2FyZ3MpCisJcHJfZGVidWcoImF1MXhtbWMoJWQpOiBERUJVRzogIiBmbXQsIGlkeCwgIyNhcmdzKQogI2Vsc2UKICNkZWZpbmUgREJHKGZtdCwgaWR4LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgpAQCAtNjQsMTEgKzY0LDggQEAKICNkZWZpbmUgQVUxWE1NQ19ERVNDUklQVE9SX0NPVU5UIDEKIAogLyogbWF4IERNQSBzZWcgc2l6ZTogNjRLQiBvbiBBdTExMDAsIDRNQiBvbiBBdTEyMDAgKi8KLSNpZmRlZiBDT05GSUdfU09DX0FVMTEwMAotI2RlZmluZSBBVTFYTU1DX0RFU0NSSVBUT1JfU0laRSAweDAwMDBmZmZmCi0jZWxzZQkvKiBBdTEyMDAgKi8KLSNkZWZpbmUgQVUxWE1NQ19ERVNDUklQVE9SX1NJWkUgMHgwMDNmZmZmZgotI2VuZGlmCisjZGVmaW5lIEFVMTEwMF9NTUNfREVTQ1JJUFRPUl9TSVpFIDB4MDAwMGZmZmYKKyNkZWZpbmUgQVUxMjAwX01NQ19ERVNDUklQVE9SX1NJWkUgMHgwMDNmZmZmZgogCiAjZGVmaW5lIEFVMVhNTUNfT0NSIChNTUNfVkREXzI3XzI4IHwgTU1DX1ZERF8yOF8yOSB8IE1NQ19WRERfMjlfMzAgfCBcCiAJCSAgICAgTU1DX1ZERF8zMF8zMSB8IE1NQ19WRERfMzFfMzIgfCBNTUNfVkREXzMyXzMzIHwgXApAQCAtMTI3LDYgKzEyNCw3IEBACiAjZGVmaW5lIEhPU1RfRl9YTUlUCTB4MDAwMQogI2RlZmluZSBIT1NUX0ZfUkVDVgkweDAwMDIKICNkZWZpbmUgSE9TVF9GX0RNQQkweDAwMTAKKyNkZWZpbmUgSE9TVF9GX0RCRE1BCTB4MDAyMAogI2RlZmluZSBIT1NUX0ZfQUNUSVZFCTB4MDEwMAogI2RlZmluZSBIT1NUX0ZfU1RPUAkweDEwMDAKIApAQCAtMTUxLDYgKzE0OSwxNiBAQAogI2RlZmluZSBETUFfQ0hBTk5FTChoKQlcCiAJKCgoaCktPmZsYWdzICYgSE9TVF9GX1hNSVQpID8gKGgpLT50eF9jaGFuIDogKGgpLT5yeF9jaGFuKQogCitzdGF0aWMgaW5saW5lIGludCBoYXNfZGJkbWEodm9pZCkKK3sKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBJUlFfT04oc3RydWN0IGF1MXhtbWNfaG9zdCAqaG9zdCwgdTMyIG1hc2spCiB7CiAJdTMyIHZhbCA9IGF1X3JlYWRsKEhPU1RfQ09ORklHKGhvc3QpKTsKQEAgLTI2OCw3ICsyNzYsNyBAQAogCQltbWNjbWQgfD0gU0RfQ01EX1JUXzM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gImF1MXhtbWM6IHVuaGFuZGxlZCByZXNwb25zZSB0eXBlICUwMnhcbiIsCisJCXByX2luZm8oImF1MXhtbWM6IHVuaGFuZGxlZCByZXNwb25zZSB0eXBlICUwMnhcbiIsCiAJCQltbWNfcmVzcF90eXBlKGNtZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zNTMsMTQgKzM2MSwxMiBAQAogCWRhdGEtPmJ5dGVzX3hmZXJlZCA9IDA7CiAKIAlpZiAoIWRhdGEtPmVycm9yKSB7Ci0JCWlmIChob3N0LT5mbGFncyAmIEhPU1RfRl9ETUEpIHsKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAkvKiBEQkRNQSAqLworCQlpZiAoaG9zdC0+ZmxhZ3MgJiAoSE9TVF9GX0RNQSB8IEhPU1RfRl9EQkRNQSkpIHsKIAkJCXUzMiBjaGFuID0gRE1BX0NIQU5ORUwoaG9zdCk7CiAKIAkJCWNoYW5fdGFiX3QgKmMgPSAqKChjaGFuX3RhYl90ICoqKWNoYW4pOwogCQkJYXUxeF9kbWFfY2hhbl90ICpjcCA9IGMtPmNoYW5fcHRyOwogCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkID0gY3AtPmRkbWFfYnl0ZWNudDsKLSNlbmRpZgogCQl9IGVsc2UKIAkJCWRhdGEtPmJ5dGVzX3hmZXJlZCA9CiAJCQkJKGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6KSAtIGhvc3QtPnBpby5sZW47CkBAIC01NzAsMTEgKzU3NiwxMCBAQAogCiAJaG9zdC0+c3RhdHVzID0gSE9TVF9TX0RBVEE7CiAKLQlpZiAoaG9zdC0+ZmxhZ3MgJiBIT1NUX0ZfRE1BKSB7Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAJLyogREJETUEgKi8KKwlpZiAoKGhvc3QtPmZsYWdzICYgKEhPU1RfRl9ETUEgfCBIT1NUX0ZfREJETUEpKSkgewogCQl1MzIgY2hhbm5lbCA9IERNQV9DSEFOTkVMKGhvc3QpOwogCi0JCS8qIFN0YXJ0IHRoZSBETUEgYXMgc29vbiBhcyB0aGUgYnVmZmVyIGdldHMgc29tZXRoaW5nIGluIGl0ICovCisJCS8qIFN0YXJ0IHRoZSBEQkRNQSBhcyBzb29uIGFzIHRoZSBidWZmZXIgZ2V0cyBzb21ldGhpbmcgaW4gaXQgKi8KIAogCQlpZiAoaG9zdC0+ZmxhZ3MgJiBIT1NUX0ZfUkVDVikgewogCQkJdTMyIG1hc2sgPSBTRF9TVEFUVVNfREIgfCBTRF9TVEFUVVNfTkU7CkBAIC01ODQsNyArNTg5LDYgQEAKIAkJfQogCiAJCWF1MXh4eF9kYmRtYV9zdGFydChjaGFubmVsKTsKLSNlbmRpZgogCX0KIH0KIApAQCAtNjMzLDggKzYzNyw3IEBACiAKIAlhdV93cml0ZWwoZGF0YS0+Ymxrc3ogLSAxLCBIT1NUX0JMS1NJWkUoaG9zdCkpOwogCi0JaWYgKGhvc3QtPmZsYWdzICYgSE9TVF9GX0RNQSkgewotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCS8qIERCRE1BICovCisJaWYgKGhvc3QtPmZsYWdzICYgKEhPU1RfRl9ETUEgfCBIT1NUX0ZfREJETUEpKSB7CiAJCWludCBpOwogCQl1MzIgY2hhbm5lbCA9IERNQV9DSEFOTkVMKGhvc3QpOwogCkBAIC02NjMsNyArNjY2LDYgQEAKIAogCQkJZGF0YWxlbiAtPSBsZW47CiAJCX0KLSNlbmRpZgogCX0gZWxzZSB7CiAJCWhvc3QtPnBpby5pbmRleCA9IDA7CiAJCWhvc3QtPnBpby5vZmZzZXQgPSAwOwpAQCAtODM4LDcgKzg0MCw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKIC8qIDhiaXQgbWVtb3J5IERNQSBkZXZpY2UgKi8KIHN0YXRpYyBkYmRldl90YWJfdCBhdTF4bW1jX21lbV9kYmRldiA9IHsKIAkuZGV2X2lkCQk9IERTQ1JfQ01EMF9BTFdBWVMsCkBAIC05MDUsNyArOTA2LDcgQEAKIAlhdTF4eHhfZGJkbWFfcmluZ19hbGxvYyhob3N0LT5yeF9jaGFuLCBBVTFYTU1DX0RFU0NSSVBUT1JfQ09VTlQpOwogCiAJLyogREJETUEgaXMgZ29vZCB0byBnbyAqLwotCWhvc3QtPmZsYWdzIHw9IEhPU1RfRl9ETUE7CisJaG9zdC0+ZmxhZ3MgfD0gSE9TVF9GX0RNQSB8IEhPU1RfRl9EQkRNQTsKIAogCXJldHVybiAwOwogfQpAQCAtOTE4LDcgKzkxOSw2IEBACiAJCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUoaG9zdC0+cnhfY2hhbik7CiAJfQogfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGF1MXhtbWNfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW4pCiB7CkBAIC05OTcsOCArOTk3LDE2IEBACiAJbW1jLT5mX21pbiA9ICAgNDUwMDAwOwogCW1tYy0+Zl9tYXggPSAyNDAwMDAwMDsKIAotCW1tYy0+bWF4X3NlZ19zaXplID0gQVUxWE1NQ19ERVNDUklQVE9SX1NJWkU7Ci0JbW1jLT5tYXhfc2VncyA9IEFVMVhNTUNfREVTQ1JJUFRPUl9DT1VOVDsKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQltbWMtPm1heF9zZWdfc2l6ZSA9IEFVMTEwMF9NTUNfREVTQ1JJUFRPUl9TSVpFOworCQltbWMtPm1heF9zZWdzID0gQVUxWE1NQ19ERVNDUklQVE9SX0NPVU5UOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTIwMDoKKwkJbW1jLT5tYXhfc2VnX3NpemUgPSBBVTEyMDBfTU1DX0RFU0NSSVBUT1JfU0laRTsKKwkJbW1jLT5tYXhfc2VncyA9IEFVMVhNTUNfREVTQ1JJUFRPUl9DT1VOVDsKKwkJYnJlYWs7CisJfQogCiAJbW1jLT5tYXhfYmxrX3NpemUgPSAyMDQ4OwogCW1tYy0+bWF4X2Jsa19jb3VudCA9IDUxMjsKQEAgLTEwMjgsMTEgKzEwMzYsMTEgQEAKIAl0YXNrbGV0X2luaXQoJmhvc3QtPmZpbmlzaF90YXNrLCBhdTF4bW1jX3Rhc2tsZXRfZmluaXNoLAogCQkJKHVuc2lnbmVkIGxvbmcpaG9zdCk7CiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCXJldCA9IGF1MXhtbWNfZGJkbWFfaW5pdChob3N0KTsKLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IERCRE1BIGluaXQgZmFpbGVkOyB1c2luZyBQSU9cbiIpOwotI2VuZGlmCisJaWYgKGhhc19kYmRtYSgpKSB7CisJCXJldCA9IGF1MXhtbWNfZGJkbWFfaW5pdChob3N0KTsKKwkJaWYgKHJldCkKKwkJCXByX2luZm8oRFJJVkVSX05BTUUgIjogREJETUEgaW5pdCBmYWlsZWQ7IHVzaW5nIFBJT1xuIik7CisJfQogCiAjaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKIAlpZiAoaG9zdC0+cGxhdGRhdGEgJiYgaG9zdC0+cGxhdGRhdGEtPmxlZCkgewpAQCAtMTA1Niw3ICsxMDY0LDcgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBNTUMgQ29udHJvbGxlciAlZCBzZXQgdXAgYXQgJTguOFgiCisJcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBNTUMgQ29udHJvbGxlciAlZCBzZXQgdXAgYXQgJTguOFgiCiAJCSIgKG1vZGU9JXMpXG4iLCBwZGV2LT5pZCwgaG9zdC0+aW9iYXNlLAogCQlob3N0LT5mbGFncyAmIEhPU1RfRl9ETUEgPyAiZG1hIiA6ICJwaW8iKTsKIApAQCAtMTA3Myw5ICsxMDgxLDggQEAKIAlhdV93cml0ZWwoMCwgSE9TVF9DT05GSUcyKGhvc3QpKTsKIAlhdV9zeW5jKCk7CiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAotCWF1MXhtbWNfZGJkbWFfc2h1dGRvd24oaG9zdCk7Ci0jZW5kaWYKKwlpZiAoaG9zdC0+ZmxhZ3MgJiBIT1NUX0ZfREJETUEpCisJCWF1MXhtbWNfZGJkbWFfc2h1dGRvd24oaG9zdCk7CiAKIAl0YXNrbGV0X2tpbGwoJmhvc3QtPmRhdGFfdGFzayk7CiAJdGFza2xldF9raWxsKCZob3N0LT5maW5pc2hfdGFzayk7CkBAIC0xMTIwLDkgKzExMjcsOSBAQAogCQl0YXNrbGV0X2tpbGwoJmhvc3QtPmRhdGFfdGFzayk7CiAJCXRhc2tsZXRfa2lsbCgmaG9zdC0+ZmluaXNoX3Rhc2spOwogCi0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkJYXUxeG1tY19kYmRtYV9zaHV0ZG93bihob3N0KTsKLSNlbmRpZgorCQlpZiAoaG9zdC0+ZmxhZ3MgJiBIT1NUX0ZfREJETUEpCisJCQlhdTF4bW1jX2RiZG1hX3NodXRkb3duKGhvc3QpOworCiAJCWF1MXhtbWNfc2V0X3Bvd2VyKGhvc3QsIDApOwogCiAJCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CkBAIC0xMTgxLDI0ICsxMTg4LDIzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGF1MXhtbWNfaW5pdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCi0JLyogRFNDUl9DTUQwX0FMV0FZUyBoYXMgYSBzdHJpZGUgb2YgMzIgYml0cywgd2UgbmVlZCBhIHN0cmlkZQotCSAqIG9mIDggYml0cy4gIEFuZCBzaW5jZSBkZXZpY2VzIGFyZSBzaGFyZWQsIHdlIG5lZWQgdG8gY3JlYXRlCi0JICogb3VyIG93biB0byBhdm9pZCBmcmVha2luZyBvdXQgb3RoZXIgZGV2aWNlcy4KLQkgKi8KLQltZW1pZCA9IGF1MXh4eF9kZG1hX2FkZF9kZXZpY2UoJmF1MXhtbWNfbWVtX2RiZGV2KTsKLQlpZiAoIW1lbWlkKQotCQlwcmludGsoS0VSTl9FUlIgImF1MXhtbWM6IGNhbm5vdCBhZGQgbWVtb3J5IGRiZG1hIGRldlxuIik7Ci0jZW5kaWYKKwlpZiAoaGFzX2RiZG1hKCkpIHsKKwkJLyogRFNDUl9DTUQwX0FMV0FZUyBoYXMgYSBzdHJpZGUgb2YgMzIgYml0cywgd2UgbmVlZCBhIHN0cmlkZQorCQkqIG9mIDggYml0cy4gIEFuZCBzaW5jZSBkZXZpY2VzIGFyZSBzaGFyZWQsIHdlIG5lZWQgdG8gY3JlYXRlCisJCSogb3VyIG93biB0byBhdm9pZCBmcmVha2luZyBvdXQgb3RoZXIgZGV2aWNlcy4KKwkJKi8KKwkJbWVtaWQgPSBhdTF4eHhfZGRtYV9hZGRfZGV2aWNlKCZhdTF4bW1jX21lbV9kYmRldik7CisJCWlmICghbWVtaWQpCisJCQlwcl9lcnIoImF1MXhtbWM6IGNhbm5vdCBhZGQgbWVtb3J5IGRiZG1hXG4iKTsKKwl9CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXUxeG1tY19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXUxeG1tY19leGl0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQlpZiAobWVtaWQpCisJaWYgKGhhc19kYmRtYSgpICYmIG1lbWlkKQogCQlhdTF4eHhfZGRtYV9kZWxfZGV2aWNlKG1lbWlkKTsKLSNlbmRpZgorCiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MXhtbWNfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCmluZGV4IDAwNzZjNzQuLjY0YTgzMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKQEAgLTgwNywxMiArODA3LDI1IEBACiBzdGF0aWMgdm9pZCBtbWNfZGF2aW5jaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewogCXN0cnVjdCBtbWNfZGF2aW5jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tYy0+cGFyZW50KTsKKwlzdHJ1Y3QgZGF2aW5jaV9tbWNfY29uZmlnICpjb25maWcgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAogCQkiY2xvY2sgJWRIeiBidXNtb2RlICVkIHBvd2VybW9kZSAlZCBWZGQgJTA0eFxuIiwKIAkJaW9zLT5jbG9jaywgaW9zLT5idXNfbW9kZSwgaW9zLT5wb3dlcl9tb2RlLAogCQlpb3MtPnZkZCk7CiAKKwlzd2l0Y2ggKGlvcy0+cG93ZXJfbW9kZSkgeworCWNhc2UgTU1DX1BPV0VSX09GRjoKKwkJaWYgKGNvbmZpZyAmJiBjb25maWctPnNldF9wb3dlcikKKwkJCWNvbmZpZy0+c2V0X3Bvd2VyKHBkZXYtPmlkLCBmYWxzZSk7CisJCWJyZWFrOworCWNhc2UgTU1DX1BPV0VSX1VQOgorCQlpZiAoY29uZmlnICYmIGNvbmZpZy0+c2V0X3Bvd2VyKQorCQkJY29uZmlnLT5zZXRfcG93ZXIocGRldi0+aWQsIHRydWUpOworCQlicmVhazsKKwl9CisKIAlzd2l0Y2ggKGlvcy0+YnVzX3dpZHRoKSB7CiAJY2FzZSBNTUNfQlVTX1dJRFRIXzg6CiAJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiRW5hYmxpbmcgOCBiaXQgbW9kZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwppbmRleCBmZjBmNzE0Li4zYWFlYjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKQEAgLTc2NCwxMSArNzY0LDI5IEBACiAJcmV0dXJuIHByZXNlbnQ7CiB9CiAKK3N0YXRpYyB2b2lkIGR3X21jaV9lbmFibGVfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICptbWMsIGludCBlbmIpCit7CisJc3RydWN0IGR3X21jaV9zbG90ICpzbG90ID0gbW1jX3ByaXYobW1jKTsKKwlzdHJ1Y3QgZHdfbWNpICpob3N0ID0gc2xvdC0+aG9zdDsKKwl1MzIgaW50X21hc2s7CisKKwkvKiBFbmFibGUvZGlzYWJsZSBTbG90IFNwZWNpZmljIFNESU8gaW50ZXJydXB0ICovCisJaW50X21hc2sgPSBtY2lfcmVhZGwoaG9zdCwgSU5UTUFTSyk7CisJaWYgKGVuYikgeworCQltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssCisJCQkgICAoaW50X21hc2sgfCAoMSA8PCBTRE1NQ19JTlRfU0RJTyhzbG90LT5pZCkpKSk7CisJfSBlbHNlIHsKKwkJbWNpX3dyaXRlbChob3N0LCBJTlRNQVNLLAorCQkJICAgKGludF9tYXNrICYgfigxIDw8IFNETU1DX0lOVF9TRElPKHNsb3QtPmlkKSkpKTsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGR3X21jaV9vcHMgPSB7Ci0JLnJlcXVlc3QJPSBkd19tY2lfcmVxdWVzdCwKLQkuc2V0X2lvcwk9IGR3X21jaV9zZXRfaW9zLAotCS5nZXRfcm8JCT0gZHdfbWNpX2dldF9ybywKLQkuZ2V0X2NkCQk9IGR3X21jaV9nZXRfY2QsCisJLnJlcXVlc3QJCT0gZHdfbWNpX3JlcXVlc3QsCisJLnNldF9pb3MJCT0gZHdfbWNpX3NldF9pb3MsCisJLmdldF9ybwkJCT0gZHdfbWNpX2dldF9ybywKKwkuZ2V0X2NkCQkJPSBkd19tY2lfZ2V0X2NkLAorCS5lbmFibGVfc2Rpb19pcnEJPSBkd19tY2lfZW5hYmxlX3NkaW9faXJxLAogfTsKIAogc3RhdGljIHZvaWQgZHdfbWNpX3JlcXVlc3RfZW5kKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQpAQCAtMTAyNSw3ICsxMDQzLDggQEAKIAkJYnVmICs9IGxlbjsKIAkJY250IC09IGxlbjsKIAkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSB8fCBob3N0LT5wYXJ0X2J1Zl9jb3VudCA9PSAyKSB7Ci0JCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmMTYpOworCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKKwkJCQkJaG9zdC0+cGFydF9idWYxNik7CiAJCQlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IDA7CiAJCX0KIAl9CkBAIC0xMDQyLDIxICsxMDYxLDIzIEBACiAJCQljbnQgLT0gbGVuOwogCQkJLyogcHVzaCBkYXRhIGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBmaWZvICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKLQkJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsIGFsaWduZWRfYnVmW2ldKTsKKwkJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQkJYWxpZ25lZF9idWZbaV0pOwogCQl9CiAJfSBlbHNlCiAjZW5kaWYKIAl7CiAJCXUxNiAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gMjsgY250IC09IDIpCi0JCQltY2lfd3JpdGV3KGhvc3QsIERBVEEsICpwZGF0YSsrKTsKKwkJCW1jaV93cml0ZXcoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksICpwZGF0YSsrKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCS8qIHB1dCBhbnl0aGluZyByZW1haW5pbmcgaW4gdGhlIHBhcnRfYnVmICovCiAJaWYgKGNudCkgewogCQlkd19tY2lfc2V0X3BhcnRfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOwogCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpKQotCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBLCBob3N0LT5wYXJ0X2J1ZjE2KTsKKwkJCW1jaV93cml0ZXcoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCWhvc3QtPnBhcnRfYnVmMTYpOwogCX0KIH0KIApAQCAtMTA3MSw3ICsxMDkyLDggQEAKIAkJCWludCBpdGVtcyA9IGxlbiA+PiAxOwogCQkJaW50IGk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKLQkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9yZWFkdyhob3N0LAorCQkJCQkJREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQkJLyogbWVtY3B5IGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBvdXRwdXQgYnVmZmVyICovCiAJCQltZW1jcHkoYnVmLCBhbGlnbmVkX2J1ZiwgbGVuKTsKIAkJCWJ1ZiArPSBsZW47CkBAIC0xMDgyLDExICsxMTA0LDExIEBACiAJewogCQl1MTYgKnBkYXRhID0gYnVmOwogCQlmb3IgKDsgY250ID49IDI7IGNudCAtPSAyKQotCQkJKnBkYXRhKysgPSBtY2lfcmVhZHcoaG9zdCwgREFUQSk7CisJCQkqcGRhdGErKyA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CiAJCWJ1ZiA9IHBkYXRhOwogCX0KIAlpZiAoY250KSB7Ci0JCWhvc3QtPnBhcnRfYnVmMTYgPSBtY2lfcmVhZHcoaG9zdCwgREFUQSk7CisJCWhvc3QtPnBhcnRfYnVmMTYgPSBtY2lfcmVhZHcoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQlkd19tY2lfcHVsbF9maW5hbF9ieXRlcyhob3N0LCBidWYsIGNudCk7CiAJfQogfQpAQCAtMTA5OSw3ICsxMTIxLDggQEAKIAkJYnVmICs9IGxlbjsKIAkJY250IC09IGxlbjsKIAkJaWYgKCFzZ19uZXh0KGhvc3QtPnNnKSB8fCBob3N0LT5wYXJ0X2J1Zl9jb3VudCA9PSA0KSB7Ci0JCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsIGhvc3QtPnBhcnRfYnVmMzIpOworCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKKwkJCQkJaG9zdC0+cGFydF9idWYzMik7CiAJCQlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IDA7CiAJCX0KIAl9CkBAIC0xMTE2LDIxICsxMTM5LDIzIEBACiAJCQljbnQgLT0gbGVuOwogCQkJLyogcHVzaCBkYXRhIGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBmaWZvICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKLQkJCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsIGFsaWduZWRfYnVmW2ldKTsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQkJYWxpZ25lZF9idWZbaV0pOwogCQl9CiAJfSBlbHNlCiAjZW5kaWYKIAl7CiAJCXUzMiAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gNDsgY250IC09IDQpCi0JCQltY2lfd3JpdGVsKGhvc3QsIERBVEEsICpwZGF0YSsrKTsKKwkJCW1jaV93cml0ZWwoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksICpwZGF0YSsrKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCS8qIHB1dCBhbnl0aGluZyByZW1haW5pbmcgaW4gdGhlIHBhcnRfYnVmICovCiAJaWYgKGNudCkgewogCQlkd19tY2lfc2V0X3BhcnRfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOwogCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpKQotCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBLCBob3N0LT5wYXJ0X2J1ZjMyKTsKKwkJCW1jaV93cml0ZWwoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCisJCQkJCQlob3N0LT5wYXJ0X2J1ZjMyKTsKIAl9CiB9CiAKQEAgLTExNDUsNyArMTE3MCw4IEBACiAJCQlpbnQgaXRlbXMgPSBsZW4gPj4gMjsKIAkJCWludCBpOwogCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCi0JCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZGwoaG9zdCwgREFUQSk7CisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZGwoaG9zdCwKKwkJCQkJCURBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJCS8qIG1lbWNweSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gb3V0cHV0IGJ1ZmZlciAqLwogCQkJbWVtY3B5KGJ1ZiwgYWxpZ25lZF9idWYsIGxlbik7CiAJCQlidWYgKz0gbGVuOwpAQCAtMTE1NiwxMSArMTE4MiwxMSBAQAogCXsKIAkJdTMyICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSA0OyBjbnQgLT0gNCkKLQkJCSpwZGF0YSsrID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQkJKnBkYXRhKysgPSBtY2lfcmVhZGwoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJaWYgKGNudCkgewotCQlob3N0LT5wYXJ0X2J1ZjMyID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQlob3N0LT5wYXJ0X2J1ZjMyID0gbWNpX3JlYWRsKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJZHdfbWNpX3B1bGxfZmluYWxfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOwogCX0KIH0KQEAgLTExNzMsNyArMTE5OSw4IEBACiAJCWJ1ZiArPSBsZW47CiAJCWNudCAtPSBsZW47CiAJCWlmICghc2dfbmV4dChob3N0LT5zZykgfHwgaG9zdC0+cGFydF9idWZfY291bnQgPT0gOCkgewotCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBLCBob3N0LT5wYXJ0X2J1Zik7CisJCQltY2lfd3JpdGV3KGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQlob3N0LT5wYXJ0X2J1Zik7CiAJCQlob3N0LT5wYXJ0X2J1Zl9jb3VudCA9IDA7CiAJCX0KIAl9CkBAIC0xMTkwLDIxICsxMjE3LDIzIEBACiAJCQljbnQgLT0gbGVuOwogCQkJLyogcHVzaCBkYXRhIGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBmaWZvICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7ICsraSkKLQkJCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsIGFsaWduZWRfYnVmW2ldKTsKKwkJCQltY2lfd3JpdGVxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQkJYWxpZ25lZF9idWZbaV0pOwogCQl9CiAJfSBlbHNlCiAjZW5kaWYKIAl7CiAJCXU2NCAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gODsgY250IC09IDgpCi0JCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsICpwZGF0YSsrKTsKKwkJCW1jaV93cml0ZXEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksICpwZGF0YSsrKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCS8qIHB1dCBhbnl0aGluZyByZW1haW5pbmcgaW4gdGhlIHBhcnRfYnVmICovCiAJaWYgKGNudCkgewogCQlkd19tY2lfc2V0X3BhcnRfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOwogCQlpZiAoIXNnX25leHQoaG9zdC0+c2cpKQotCQkJbWNpX3dyaXRlcShob3N0LCBEQVRBLCBob3N0LT5wYXJ0X2J1Zik7CisJCQltY2lfd3JpdGVxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAorCQkJCQlob3N0LT5wYXJ0X2J1Zik7CiAJfQogfQogCkBAIC0xMjE5LDcgKzEyNDgsOCBAQAogCQkJaW50IGl0ZW1zID0gbGVuID4+IDM7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWRxKGhvc3QsIERBVEEpOworCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWRxKGhvc3QsCisJCQkJCQlEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CiAJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KIAkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOwogCQkJYnVmICs9IGxlbjsKQEAgLTEyMzAsMTEgKzEyNjAsMTEgQEAKIAl7CiAJCXU2NCAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gODsgY250IC09IDgpCi0JCQkqcGRhdGErKyA9IG1jaV9yZWFkcShob3N0LCBEQVRBKTsKKwkJCSpwZGF0YSsrID0gbWNpX3JlYWRxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCWlmIChjbnQpIHsKLQkJaG9zdC0+cGFydF9idWYgPSBtY2lfcmVhZHEoaG9zdCwgREFUQSk7CisJCWhvc3QtPnBhcnRfYnVmID0gbWNpX3JlYWRxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKIAkJZHdfbWNpX3B1bGxfZmluYWxfYnl0ZXMoaG9zdCwgYnVmLCBjbnQpOwogCX0KIH0KQEAgLTE0MDYsNiArMTQzNiw3IEBACiAJc3RydWN0IGR3X21jaSAqaG9zdCA9IGRldl9pZDsKIAl1MzIgc3RhdHVzLCBwZW5kaW5nOwogCXVuc2lnbmVkIGludCBwYXNzX2NvdW50ID0gMDsKKwlpbnQgaTsKIAogCWRvIHsKIAkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIFJJTlRTVFMpOwpAQCAtMTQ3Nyw2ICsxNTA4LDE1IEBACiAJCQlxdWV1ZV93b3JrKGR3X21jaV9jYXJkX3dvcmtxdWV1ZSwgJmhvc3QtPmNhcmRfd29yayk7CiAJCX0KIAorCQkvKiBIYW5kbGUgU0RJTyBJbnRlcnJ1cHRzICovCisJCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQkJc3RydWN0IGR3X21jaV9zbG90ICpzbG90ID0gaG9zdC0+c2xvdFtpXTsKKwkJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX1NESU8oaSkpIHsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9TRElPKGkpKTsKKwkJCQltbWNfc2lnbmFsX3NkaW9faXJxKHNsb3QtPm1tYyk7CisJCQl9CisJCX0KKwogCX0gd2hpbGUgKHBhc3NfY291bnQrKyA8IDUpOwogCiAjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQwpAQCAtMTY3Myw3ICsxNzEzLDcgQEAKIAogCWhvc3QtPnZtbWMgPSByZWd1bGF0b3JfZ2V0KG1tY19kZXYobW1jKSwgInZtbWMiKTsKIAlpZiAoSVNfRVJSKGhvc3QtPnZtbWMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyB2bW1jIHJlZ3VsYXRvciBmb3VuZFxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOworCQlwcl9pbmZvKCIlczogbm8gdm1tYyByZWd1bGF0b3IgZm91bmRcbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKIAkJaG9zdC0+dm1tYyA9IE5VTEw7CiAJfSBlbHNlCiAJCXJlZ3VsYXRvcl9lbmFibGUoaG9zdC0+dm1tYyk7CkBAIC0xOTI0LDYgKzE5NjQsMTggQEAKIAl9CiAKIAkvKgorCSAqIEluIDIuNDBhIHNwZWMsIERhdGEgb2Zmc2V0IGlzIGNoYW5nZWQuCisJICogTmVlZCB0byBjaGVjayB0aGUgdmVyc2lvbi1pZCBhbmQgc2V0IGRhdGEtb2Zmc2V0IGZvciBEQVRBIHJlZ2lzdGVyLgorCSAqLworCWhvc3QtPnZlcmlkID0gU0RNTUNfR0VUX1ZFUklEKG1jaV9yZWFkbChob3N0LCBWRVJJRCkpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJWZXJzaW9uIElEIGlzICUwNHhcbiIsIGhvc3QtPnZlcmlkKTsKKworCWlmIChob3N0LT52ZXJpZCA8IERXX01NQ18yNDBBKQorCQlob3N0LT5kYXRhX29mZnNldCA9IERBVEFfT0ZGU0VUOworCWVsc2UKKwkJaG9zdC0+ZGF0YV9vZmZzZXQgPSBEQVRBXzI0MEFfT0ZGU0VUOworCisJLyoKIAkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgY29tbWFuZCBkb25lLCBkYXRhIG92ZXIsIGRhdGEgZW1wdHksIGNhcmQgZGV0LAogCSAqIHJlY2VpdmUgcmVhZHkgYW5kIGVycm9yIHN1Y2ggYXMgdHJhbnNtaXQsIHJlY2VpdmUgdGltZW91dCwgY3JjIGVycm9yCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaAppbmRleCAwMjdkMzc3Li43MmMwNzFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKQEAgLTE0LDYgKzE0LDggQEAKICNpZm5kZWYgX0RXX01NQ19IXwogI2RlZmluZSBfRFdfTU1DX0hfCiAKKyNkZWZpbmUgRFdfTU1DXzI0MEEJCTB4MjQwYQorCiAjZGVmaW5lIFNETU1DX0NUUkwJCTB4MDAwCiAjZGVmaW5lIFNETU1DX1BXUkVOCQkweDAwNAogI2RlZmluZSBTRE1NQ19DTEtESVYJCTB4MDA4CkBAIC01MSw3ICs1MywxNCBAQAogI2RlZmluZSBTRE1NQ19JRElOVEVOCQkweDA5MAogI2RlZmluZSBTRE1NQ19EU0NBRERSCQkweDA5NAogI2RlZmluZSBTRE1NQ19CVUZBRERSCQkweDA5OAotI2RlZmluZSBTRE1NQ19EQVRBCQkweDEwMAorI2RlZmluZSBTRE1NQ19EQVRBKHgpCQkoeCkKKworLyoKKyAqIERhdGEgb2Zmc2V0IGlzIGRpZmZlcmVuY2UgYWNjb3JkaW5nIHRvIFZlcnNpb24KKyAqIExvd2VyIHRoYW4gMi40MGEgOiBkYXRhIHJlZ2lzdGVyIG9mZmVzdCBpcyAweDEwMAorICovCisjZGVmaW5lIERBVEFfT0ZGU0VUCQkweDEwMAorI2RlZmluZSBEQVRBXzI0MEFfT0ZGU0VUCTB4MjAwCiAKIC8qIHNoaWZ0IGJpdCBmaWVsZCAqLwogI2RlZmluZSBfU0JGKGYsIHYpCQkoKHYpIDw8IChmKSkKQEAgLTgyLDcgKzkxLDcgQEAKICNkZWZpbmUgU0RNTUNfQ1RZUEVfNEJJVAkJQklUKDApCiAjZGVmaW5lIFNETU1DX0NUWVBFXzFCSVQJCTAKIC8qIEludGVycnVwdCBzdGF0dXMgJiBtYXNrIHJlZ2lzdGVyIGRlZmluZXMgKi8KLSNkZWZpbmUgU0RNTUNfSU5UX1NESU8JCQlCSVQoMTYpCisjZGVmaW5lIFNETU1DX0lOVF9TRElPKG4pCQlCSVQoMTYgKyAobikpCiAjZGVmaW5lIFNETU1DX0lOVF9FQkUJCQlCSVQoMTUpCiAjZGVmaW5lIFNETU1DX0lOVF9BQ0QJCQlCSVQoMTQpCiAjZGVmaW5lIFNETU1DX0lOVF9TQkUJCQlCSVQoMTMpCkBAIC0xMzAsNiArMTM5LDggQEAKICNkZWZpbmUgU0RNTUNfSURNQUNfRU5BQkxFCQlCSVQoNykKICNkZWZpbmUgU0RNTUNfSURNQUNfRkIJCQlCSVQoMSkKICNkZWZpbmUgU0RNTUNfSURNQUNfU1dSRVNFVAkJQklUKDApCisvKiBWZXJzaW9uIElEIHJlZ2lzdGVyIGRlZmluZSAqLworI2RlZmluZSBTRE1NQ19HRVRfVkVSSUQoeCkJCSgoeCkgJiAweEZGRkYpCiAKIC8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KICNkZWZpbmUgbWNpX3JlYWRsKGRldiwgcmVnKQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5jCmluZGV4IDg4MWY3YmEuLmVhMGYzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYwpAQCAtOTQyLDcgKzk0Miw3IEBACiAJaW50IHJldCA9IDAsIGlycTsKIAl1MTYgcmV2X25vOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaS5NWCBtbWMgZHJpdmVyXG4iKTsKKwlwcl9pbmZvKCJpLk1YIG1tYyBkcml2ZXJcbiIpOwogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKaW5kZXggN2MxZTE2YS4uOTI5NDZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjNy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwppbmRleCA1NmU5YTQxNi4uNTBiNWY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTcwLDYgKzE3MSw3IEBACiAJICogYmFjayBpbnRvIHRoZSBkcml2ZXIuLi4KIAkgKi8KIAlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJcG1fcnVudGltZV9wdXQobW1jX2Rldihob3N0LT5tbWMpKTsKIAltbWNfcmVxdWVzdF9kb25lKGhvc3QtPm1tYywgbXJxKTsKIAlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogfQpAQCAtNDY0LDcgKzQ2Niw3IEBACiAJc3RydWN0IG1tY2lfaG9zdF9uZXh0ICpuZXh0ID0gJmhvc3QtPm5leHRfZGF0YTsKIAogCWlmIChkYXRhLT5ob3N0X2Nvb2tpZSAmJiBkYXRhLT5ob3N0X2Nvb2tpZSAhPSBuZXh0LT5jb29raWUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWyVzXSBpbnZhbGlkIGNvb2tpZTogZGF0YS0+aG9zdF9jb29raWUgJWQiCisJCXByX3dhcm5pbmcoIlslc10gaW52YWxpZCBjb29raWU6IGRhdGEtPmhvc3RfY29va2llICVkIgogCQkgICAgICAgIiBob3N0LT5uZXh0X2RhdGEuY29va2llICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIGRhdGEtPmhvc3RfY29va2llLCBob3N0LT5uZXh0X2RhdGEuY29va2llKTsKIAkJZGF0YS0+aG9zdF9jb29raWUgPSAwOwpAQCAtNTI5LDcgKzUzMSw3IEBACiAJaWYgKGNoYW4pIHsKIAkJaWYgKGVycikKIAkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGNoYW4pOwotCQlpZiAoZXJyIHx8IGRhdGEtPmhvc3RfY29va2llKQorCQlpZiAoZGF0YS0+aG9zdF9jb29raWUpCiAJCQlkbWFfdW5tYXBfc2cobW1jX2Rldihob3N0LT5tbWMpLCBkYXRhLT5zZywKIAkJCQkgICAgIGRhdGEtPnNnX2xlbiwgZGlyKTsKIAkJbXJxLT5kYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CkBAIC05ODQsNiArOTg2LDggQEAKIAkJcmV0dXJuOwogCX0KIAorCXBtX3J1bnRpbWVfZ2V0X3N5bmMobW1jX2RldihtbWMpKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKIAlob3N0LT5tcnEgPSBtcnE7CkBAIC0xMTU2LDEwICsxMTYwLDE0IEBACiAJCWdvdG8gaG9zdF9mcmVlOwogCX0KIAotCXJldCA9IGNsa19lbmFibGUoaG9zdC0+Y2xrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZShob3N0LT5jbGspOwogCWlmIChyZXQpCiAJCWdvdG8gY2xrX2ZyZWU7CiAKKwlyZXQgPSBjbGtfZW5hYmxlKGhvc3QtPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBjbGtfdW5wcmVwOworCiAJaG9zdC0+cGxhdCA9IHBsYXQ7CiAJaG9zdC0+dmFyaWFudCA9IHZhcmlhbnQ7CiAJaG9zdC0+bWNsayA9IGNsa19nZXRfcmF0ZShob3N0LT5jbGspOwpAQCAtMTMyNyw2ICsxMzM1LDggQEAKIAogCW1tY2lfZG1hX3NldHVwKGhvc3QpOwogCisJcG1fcnVudGltZV9wdXQoJmRldi0+ZGV2KTsKKwogCW1tY19hZGRfaG9zdChtbWMpOwogCiAJcmV0dXJuIDA7CkBAIC0xMzQ1LDYgKzEzNTUsOCBAQAogCWlvdW5tYXAoaG9zdC0+YmFzZSk7CiAgY2xrX2Rpc2FibGU6CiAJY2xrX2Rpc2FibGUoaG9zdC0+Y2xrKTsKKyBjbGtfdW5wcmVwOgorCWNsa191bnByZXBhcmUoaG9zdC0+Y2xrKTsKICBjbGtfZnJlZToKIAljbGtfcHV0KGhvc3QtPmNsayk7CiAgaG9zdF9mcmVlOgpAQCAtMTM2NCw2ICsxMzc2LDEyIEBACiAJaWYgKG1tYykgewogCQlzdHJ1Y3QgbW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAorCQkvKgorCQkgKiBVbmRvIHBtX3J1bnRpbWVfcHV0KCkgaW4gcHJvYmUuICBXZSB1c2UgdGhlIF9zeW5jCisJCSAqIHZlcnNpb24gaGVyZSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlIHByaW1lY2VsbC4KKwkJICovCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmRldi0+ZGV2KTsKKwogCQltbWNfcmVtb3ZlX2hvc3QobW1jKTsKIAogCQl3cml0ZWwoMCwgaG9zdC0+YmFzZSArIE1NQ0lNQVNLMCk7CkBAIC0xMzg2LDYgKzE0MDQsNyBAQAogCiAJCWlvdW5tYXAoaG9zdC0+YmFzZSk7CiAJCWNsa19kaXNhYmxlKGhvc3QtPmNsayk7CisJCWNsa191bnByZXBhcmUoaG9zdC0+Y2xrKTsKIAkJY2xrX3B1dChob3N0LT5jbGspOwogCiAJCWlmIChob3N0LT52Y2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMgYi9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMKaW5kZXggYTRjODY1YS4uODBkOGViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYwpAQCAtMjEzLDcgKzIxMyw4IEBACiAJbXNtc2RjY193cml0ZWwoaG9zdCwgaG9zdC0+Y21kX3RpbWVvdXQsIE1NQ0lEQVRBVElNRVIpOwogCW1zbXNkY2Nfd3JpdGVsKGhvc3QsICh1bnNpZ25lZCBpbnQpaG9zdC0+Y3Vyci54ZmVyX3NpemUsCiAJCSAgICAgICBNTUNJREFUQUxFTkdUSCk7Ci0JbXNtc2RjY193cml0ZWwoaG9zdCwgaG9zdC0+Y21kX3Bpb19pcnFtYXNrLCBNTUNJTUFTSzEpOworCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIChtc21zZGNjX3JlYWRsKGhvc3QsIE1NQ0lNQVNLMCkgJgorCQkJKH5NQ0lfSVJRX1BJTykpIHwgaG9zdC0+Y21kX3Bpb19pcnFtYXNrLCBNTUNJTUFTSzApOwogCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIGhvc3QtPmNtZF9kYXRhY3RybCwgTU1DSURBVEFDVFJMKTsKIAogCWlmIChob3N0LT5jbWRfY21kKSB7CkBAIC0zODgsNyArMzg5LDcgQEAKIAluID0gZG1hX21hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGhvc3QtPmRtYS5zZywKIAkJCWhvc3QtPmRtYS5udW1fZW50cywgaG9zdC0+ZG1hLmRpcik7CiAJaWYgKG4gPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gbWFwIGluIGFsbCBzZyBlbGVtZW50c1xuIiwKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG1hcCBpbiBhbGwgc2cgZWxlbWVudHNcbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCWhvc3QtPmRtYS5zZyA9IE5VTEw7CiAJCWhvc3QtPmRtYS5udW1fZW50cyA9IDA7CkBAIC00NzQsNyArNDc1LDcgQEAKIAkJKmMgfD0gTUNJX0NTUE1fTUNJQUJPUlQ7CiAKIAlpZiAoaG9zdC0+Y3Vyci5jbWQgIT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdmVybGFwcGluZyBjb21tYW5kIHJlcXVlc3RzXG4iLAorCQlwcl9lcnIoIiVzOiBPdmVybGFwcGluZyBjb21tYW5kIHJlcXVlc3RzXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCX0KIAlob3N0LT5jdXJyLmNtZCA9IGNtZDsKQEAgLTU0Myw3ICs1NDQsOSBAQAogCiAJCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIGhvc3QtPmN1cnIueGZlcl9zaXplLCBNTUNJREFUQUxFTkdUSCk7CiAKLQkJbXNtc2RjY193cml0ZWwoaG9zdCwgcGlvX2lycW1hc2ssIE1NQ0lNQVNLMSk7CisJCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIChtc21zZGNjX3JlYWRsKGhvc3QsIE1NQ0lNQVNLMCkgJgorCQkJCSh+TUNJX0lSUV9QSU8pKSB8IHBpb19pcnFtYXNrLCBNTUNJTUFTSzApOworCiAJCW1zbXNkY2Nfd3JpdGVsKGhvc3QsIGRhdGFjdHJsLCBNTUNJREFUQUNUUkwpOwogCiAJCWlmIChjbWQpIHsKQEAgLTY1OSw4ICs2NjIsMTMgQEAKIHsKIAlzdHJ1Y3QgbXNtc2RjY19ob3N0CSpob3N0ID0gZGV2X2lkOwogCXVpbnQzMl90CQlzdGF0dXM7CisJdTMyIG1jaV9tYXNrMDsKIAogCXN0YXR1cyA9IG1zbXNkY2NfcmVhZGwoaG9zdCwgTU1DSVNUQVRVUyk7CisJbWNpX21hc2swID0gbXNtc2RjY19yZWFkbChob3N0LCBNTUNJTUFTSzApOworCisJaWYgKCgobWNpX21hc2swICYgc3RhdHVzKSAmIE1DSV9JUlFfUElPKSA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlkbyB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03MTksMTAgKzcyNywxMiBAQAogCX0gd2hpbGUgKDEpOwogCiAJaWYgKHN0YXR1cyAmIE1DSV9SWEFDVElWRSAmJiBob3N0LT5jdXJyLnhmZXJfcmVtYWluIDwgTUNJX0ZJRk9TSVpFKQotCQltc21zZGNjX3dyaXRlbChob3N0LCBNQ0lfUlhEQVRBQVZMQkxNQVNLLCBNTUNJTUFTSzEpOworCQltc21zZGNjX3dyaXRlbChob3N0LCAobWNpX21hc2swICYgKH5NQ0lfSVJRX1BJTykpIHwKKwkJCQkJTUNJX1JYREFUQUFWTEJMTUFTSywgTU1DSU1BU0swKTsKIAogCWlmICghaG9zdC0+Y3Vyci54ZmVyX3JlbWFpbikKLQkJbXNtc2RjY193cml0ZWwoaG9zdCwgMCwgTU1DSU1BU0sxKTsKKwkJbXNtc2RjY193cml0ZWwoaG9zdCwgKG1jaV9tYXNrMCAmICh+TUNJX0lSUV9QSU8pKSB8IDAsCisJCQkJCU1NQ0lNQVNLMCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC04NTQsNiArODY0LDggQEAKIAlkbyB7CiAJCXN0YXR1cyA9IG1zbXNkY2NfcmVhZGwoaG9zdCwgTU1DSVNUQVRVUyk7CiAJCXN0YXR1cyAmPSBtc21zZGNjX3JlYWRsKGhvc3QsIE1NQ0lNQVNLMCk7CisJCWlmICgoc3RhdHVzICYgKH5NQ0lfSVJRX1BJTykpID09IDApCisJCQlicmVhazsKIAkJbXNtc2RjY193cml0ZWwoaG9zdCwgc3RhdHVzLCBNTUNJQ0xFQVIpOwogCiAJCWlmIChzdGF0dXMgJiBNQ0lfU0RJT0lOVFIpCkBAIC05MzksNyArOTUxLDcgQEAKIAlzdHJ1Y3QgbXNtX21tY19ncGlvX2RhdGEgKmN1cnI7CiAJaW50IGksIHJjID0gMDsKIAotCWlmICghaG9zdC0+cGxhdC0+Z3Bpb19kYXRhICYmIGhvc3QtPmdwaW9fY29uZmlnX3N0YXR1cyA9PSBlbmFibGUpCisJaWYgKCFob3N0LT5wbGF0LT5ncGlvX2RhdGEgfHwgaG9zdC0+Z3Bpb19jb25maWdfc3RhdHVzID09IGVuYWJsZSkKIAkJcmV0dXJuOwogCiAJY3VyciA9IGhvc3QtPnBsYXQtPmdwaW9fZGF0YTsKQEAgLTEwNTIsMTAgKzEwNjQsMTkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIG1zbXNkY2NfaW5pdF9jYXJkKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IG1zbXNkY2NfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlpZiAoaG9zdC0+cGxhdC0+aW5pdF9jYXJkKQorCQlob3N0LT5wbGF0LT5pbml0X2NhcmQoY2FyZCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIG1zbXNkY2Nfb3BzID0gewogCS5yZXF1ZXN0CT0gbXNtc2RjY19yZXF1ZXN0LAogCS5zZXRfaW9zCT0gbXNtc2RjY19zZXRfaW9zLAogCS5lbmFibGVfc2Rpb19pcnEgPSBtc21zZGNjX2VuYWJsZV9zZGlvX2lycSwKKwkuaW5pdF9jYXJkCT0gbXNtc2RjY19pbml0X2NhcmQsCiB9OwogCiBzdGF0aWMgdm9pZApAQCAtMTA5Miw3ICsxMTEzLDcgQEAKIHsKIAlzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0ID0gZGV2X2lkOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlZFxuIiwgX19mdW5jX18sIGlycSk7CisJcHJfZGVidWcoIiVzOiAlZFxuIiwgX19mdW5jX18sIGlycSk7CiAJbXNtc2RjY19jaGVja19zdGF0dXMoKHVuc2lnbmVkIGxvbmcpIGhvc3QpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTExMDIsNyArMTEyMyw3IEBACiB7CiAJc3RydWN0IG1zbXNkY2NfaG9zdCAqaG9zdCA9IGRldl9pZDsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczogY2FyZF9wcmVzZW50ICVkXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKKwlwcl9kZWJ1ZygiJXM6IGNhcmRfcHJlc2VudCAlZFxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksCiAJICAgICAgIGNhcmRfcHJlc2VudCk7CiAJbXNtc2RjY19jaGVja19zdGF0dXMoKHVuc2lnbmVkIGxvbmcpIGhvc3QpOwogfQpAQCAtMTE1MCw3ICsxMTcxLDYgQEAKIAlzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0OwogCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwogCXN0cnVjdCByZXNvdXJjZSAqY21kX2lycXJlcyA9IE5VTEw7Ci0Jc3RydWN0IHJlc291cmNlICpwaW9faXJxcmVzID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnN0YXRfaXJxcmVzID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbXJlcyA9IE5VTEw7CiAJc3RydWN0IHJlc291cmNlICpkbWFyZXMgPSBOVUxMOwpAQCAtMTE3NSwxMiArMTE5NSwxMCBAQAogCWRtYXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CiAJY21kX2lycXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsCiAJCQkJCQkgICJjbWRfaXJxIik7Ci0JcGlvX2lycXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsCi0JCQkJCQkgICJwaW9faXJxIik7CiAJc3RhdF9pcnFyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSVJRLAogCQkJCQkJICAgInN0YXR1c19pcnEiKTsKIAotCWlmICghY21kX2lycXJlcyB8fCAhcGlvX2lycXJlcyB8fCAhbWVtcmVzKSB7CisJaWYgKCFjbWRfaXJxcmVzIHx8ICFtZW1yZXMpIHsKIAkJcHJfZXJyKCIlczogSW52YWxpZCByZXNvdXJjZVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEyMDAsMTcgKzEyMTgsMjAgQEAKIAlob3N0LT5wbGF0ID0gcGxhdDsKIAlob3N0LT5tbWMgPSBtbWM7CiAJaG9zdC0+Y3Vyci5jbWQgPSBOVUxMOworCWluaXRfdGltZXIoJmhvc3QtPmJ1c2Nsa190aW1lcik7CisJaG9zdC0+YnVzY2xrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaG9zdDsKKwlob3N0LT5idXNjbGtfdGltZXIuZnVuY3Rpb24gPSBtc21zZGNjX2J1c2Nsa19leHBpcmVkOworCiAKIAlob3N0LT5jbWRwb2xsID0gMTsKIAogCWhvc3QtPmJhc2UgPSBpb3JlbWFwKG1lbXJlcy0+c3RhcnQsIFBBR0VfU0laRSk7CiAJaWYgKCFob3N0LT5iYXNlKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCQlnb3RvIGhvc3RfZnJlZTsKIAl9CiAKIAlob3N0LT5jbWRfaXJxcmVzID0gY21kX2lycXJlczsKLQlob3N0LT5waW9faXJxcmVzID0gcGlvX2lycXJlczsKIAlob3N0LT5tZW1yZXMgPSBtZW1yZXM7CiAJaG9zdC0+ZG1hcmVzID0gZG1hcmVzOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKQEAgLTEyMjEsMTMgKzEyNDIsMTkgQEAKIAkvKgogCSAqIFNldHVwIERNQQogCSAqLwotCW1zbXNkY2NfaW5pdF9kbWEoaG9zdCk7CisJaWYgKGhvc3QtPmRtYXJlcykgeworCQlyZXQgPSBtc21zZGNjX2luaXRfZG1hKGhvc3QpOworCQlpZiAocmV0KQorCQkJZ290byBpb3JlbWFwX2ZyZWU7CisJfSBlbHNlIHsKKwkJaG9zdC0+ZG1hLmNoYW5uZWwgPSAtMTsKKwl9CiAKIAkvKiBHZXQgb3VyIGNsb2NrcyAqLwogCWhvc3QtPnBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzZGNfcGNsayIpOwogCWlmIChJU19FUlIoaG9zdC0+cGNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihob3N0LT5wY2xrKTsKLQkJZ290byBob3N0X2ZyZWU7CisJCWdvdG8gZG1hX2ZyZWU7CiAJfQogCiAJaG9zdC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic2RjX2NsayIpOwpAQCAtMTIzNiwxNyArMTI2MywxNyBAQAogCQlnb3RvIHBjbGtfcHV0OwogCX0KIAorCXJldCA9IGNsa19zZXRfcmF0ZShob3N0LT5jbGssIG1zbXNkY2NfZm1pbik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBDbG9jayByYXRlIHNldCBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gY2xrX3B1dDsKKwl9CisKIAkvKiBFbmFibGUgY2xvY2tzICovCiAJcmV0ID0gbXNtc2RjY19lbmFibGVfY2xvY2tzKGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gY2xrX3B1dDsKIAotCXJldCA9IGNsa19zZXRfcmF0ZShob3N0LT5jbGssIG1zbXNkY2NfZm1pbik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBDbG9jayByYXRlIHNldCBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gY2xrX2Rpc2FibGU7Ci0JfQotCiAJaG9zdC0+cGNsa19yYXRlID0gY2xrX2dldF9yYXRlKGhvc3QtPnBjbGspOwogCWhvc3QtPmNsa19yYXRlID0gY2xrX2dldF9yYXRlKGhvc3QtPmNsayk7CiAKQEAgLTEzMTYsMTYgKzEzNDMsMTIgQEAKIAkJaG9zdC0+ZWplY3QgPSAhaG9zdC0+b2xkc3RhdDsKIAl9CiAKLQlpbml0X3RpbWVyKCZob3N0LT5idXNjbGtfdGltZXIpOwotCWhvc3QtPmJ1c2Nsa190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGhvc3Q7Ci0JaG9zdC0+YnVzY2xrX3RpbWVyLmZ1bmN0aW9uID0gbXNtc2RjY19idXNjbGtfZXhwaXJlZDsKLQogCXJldCA9IHJlcXVlc3RfaXJxKGNtZF9pcnFyZXMtPnN0YXJ0LCBtc21zZGNjX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkgIERSSVZFUl9OQU1FICIgKGNtZCkiLCBob3N0KTsKIAlpZiAocmV0KQogCQlnb3RvIHN0YXRfaXJxX2ZyZWU7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShwaW9faXJxcmVzLT5zdGFydCwgbXNtc2RjY19waW9faXJxLCBJUlFGX1NIQVJFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShjbWRfaXJxcmVzLT5zdGFydCwgbXNtc2RjY19waW9faXJxLCBJUlFGX1NIQVJFRCwKIAkJCSAgRFJJVkVSX05BTUUgIiAocGlvKSIsIGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gY21kX2lycV9mcmVlOwpAQCAtMTM2OCw2ICsxMzkxLDEzIEBACiAJY2xrX3B1dChob3N0LT5jbGspOwogIHBjbGtfcHV0OgogCWNsa19wdXQoaG9zdC0+cGNsayk7CitkbWFfZnJlZToKKwlpZiAoaG9zdC0+ZG1hcmVzKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzaXplb2Yoc3RydWN0IG1zbXNkY2NfbmNfZG1hZGF0YSksCisJCQkJCWhvc3QtPmRtYS5uYywgaG9zdC0+ZG1hLm5jX2J1c2FkZHIpOworaW9yZW1hcF9mcmVlOgorCXRhc2tsZXRfa2lsbCgmaG9zdC0+ZG1hX3RsZXQpOworCWlvdW5tYXAoaG9zdC0+YmFzZSk7CiAgaG9zdF9mcmVlOgogCW1tY19mcmVlX2hvc3QobW1jKTsKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmggYi9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmgKaW5kZXggNDJkN2JiYy4uNDAyMDI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuaApAQCAtMTQwLDYgKzE0MCwxMSBAQAogCU1DSV9EQVRBVElNRU9VVE1BU0t8TUNJX1RYVU5ERVJSVU5NQVNLfE1DSV9SWE9WRVJSVU5NQVNLfAlcCiAJTUNJX0NNRFJFU1BFTkRNQVNLfE1DSV9DTURTRU5UTUFTS3xNQ0lfREFUQUVORE1BU0t8TUNJX1BST0dET05FTUFTSykKIAorI2RlZmluZSBNQ0lfSVJRX1BJTyBcCisJKE1DSV9SWERBVEFBVkxCTE1BU0sgfCBNQ0lfVFhEQVRBQVZMQkxNQVNLIHwgTUNJX1JYRklGT0VNUFRZTUFTSyB8IFwKKwkgTUNJX1RYRklGT0VNUFRZTUFTSyB8IE1DSV9SWEZJRk9GVUxMTUFTSyB8IE1DSV9UWEZJRk9GVUxMTUFTSyB8IFwKKwkgTUNJX1JYRklGT0hBTEZGVUxMTUFTSyB8IE1DSV9UWEZJRk9IQUxGRU1QVFlNQVNLIHwgXAorCSBNQ0lfUlhBQ1RJVkVNQVNLIHwgTUNJX1RYQUNUSVZFTUFTSykKIC8qCiAgKiBUaGUgc2l6ZSBvZiB0aGUgRklGTyBpbiBieXRlcy4KICAqLwpAQCAtMjAyLDcgKzIwNyw2IEBACiAKIHN0cnVjdCBtc21zZGNjX2hvc3QgewogCXN0cnVjdCByZXNvdXJjZQkJKmNtZF9pcnFyZXM7Ci0Jc3RydWN0IHJlc291cmNlCQkqcGlvX2lycXJlczsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSptZW1yZXM7CiAJc3RydWN0IHJlc291cmNlCQkqZG1hcmVzOwogCXZvaWQgX19pb21lbQkJKmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jIGIvZHJpdmVycy9tbWMvaG9zdC9tdnNkaW8uYwppbmRleCBhNWJmNjBlLi4yMTFhNDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L212c2Rpby5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbXZzZGlvLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCQlob3N0LT5waW9fc2l6ZSA9IGRhdGEtPmJsb2NrcyAqIGRhdGEtPmJsa3N6OwogCQlob3N0LT5waW9fcHRyID0gc2dfdmlydChkYXRhLT5zZyk7CiAJCWlmICghbm9kbWEpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhbGxiYWNrIHRvIFBJTyBmb3IgZGF0YSAiCisJCQlwcl9kZWJ1ZygiJXM6IGZhbGxiYWNrIHRvIFBJTyBmb3IgZGF0YSAiCiAJCQkJCSAgImF0IDB4JXAgc2l6ZSAlZFxuIiwKIAkJCQkJICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKIAkJCQkJICBob3N0LT5waW9fcHRyLCBob3N0LT5waW9fc2l6ZSk7CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJaWYgKG1ycS0+ZGF0YSkKIAkJCWVycl9zdGF0dXMgPSBtdnNkX2ZpbmlzaF9kYXRhKGhvc3QsIG1ycS0+ZGF0YSwgZXJyX3N0YXR1cyk7CiAJCWlmIChlcnJfc3RhdHVzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmhhbmRsZWQgZXJyb3Igc3RhdHVzICUjMDR4XG4iLAorCQkJcHJfZXJyKCIlczogdW5oYW5kbGVkIGVycm9yIHN0YXR1cyAlIzA0eFxuIiwKIAkJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGVycl9zdGF0dXMpOwogCQkJY21kLT5lcnJvciA9IC1FTk9NU0c7CiAJCX0KQEAgLTQ4OSw3ICs0ODksNyBAQAogCWlmIChpcnFfaGFuZGxlZCkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogdW5oYW5kbGVkIGludGVycnVwdCBzdGF0dXM9MHglMDR4IGVuPTB4JTA0eCAiCisJcHJfZXJyKCIlczogdW5oYW5kbGVkIGludGVycnVwdCBzdGF0dXM9MHglMDR4IGVuPTB4JTA0eCAiCiAJCQkicGlvPSVkXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgaW50cl9zdGF0dXMsCiAJCQlob3N0LT5pbnRyX2VuLCBob3N0LT5waW9fc2l6ZSk7CiAJcmV0dXJuIElSUV9OT05FOwpAQCAtNTA1LDkgKzUwNSw5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAltcnEgPSBob3N0LT5tcnE7CiAJaWYgKG1ycSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlIGludGVycnVwdC5cbiIsCisJCXByX2VycigiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgaGFyZHdhcmUgaW50ZXJydXB0LlxuIiwKIAkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGh3X3N0YXRlPTB4JTA0eCwgaW50cl9zdGF0dXM9MHglMDR4ICIKKwkJcHJfZXJyKCIlczogaHdfc3RhdGU9MHglMDR4LCBpbnRyX3N0YXR1cz0weCUwNHggIgogCQkJCSJpbnRyX2VuPTB4JTA0eFxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksCiAJCQkJbXZzZF9yZWFkKE1WU0RfSFdfU1RBVEUpLAogCQkJCW12c2RfcmVhZChNVlNEX05PUl9JTlRSX1NUQVRVUyksCkBAIC03NjIsNyArNzYyLDcgQEAKIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgbXZzZF9pcnEsIDAsIERSSVZFUl9OQU1FLCBob3N0KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhc3NpZ24gaXJxICVkXG4iLCBEUklWRVJfTkFNRSwgaXJxKTsKKwkJcHJfZXJyKCIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsIERSSVZFUl9OQU1FLCBpcnEpOwogCQlnb3RvIG91dDsKIAl9IGVsc2UKIAkJaG9zdC0+aXJxID0gaXJxOwpAQCAtODAyLDcgKzgwMiw3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAlcyBkcml2ZXIgaW5pdGlhbGl6ZWQsICIsCisJcHJfbm90aWNlKCIlczogJXMgZHJpdmVyIGluaXRpYWxpemVkLCAiLAogCQkJICAgbW1jX2hvc3RuYW1lKG1tYyksIERSSVZFUl9OQU1FKTsKIAlpZiAoaG9zdC0+Z3Bpb19jYXJkX2RldGVjdCkKIAkJcHJpbnRrKCJ1c2luZyBHUElPICVkIGZvciBjYXJkIGRldGVjdGlvblxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCmluZGV4IDE0YWEyMTMuLjMyNWVhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPG1hY2gvbW1jLmg+CiAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAibXhjLW1tYyIKIApAQCAtODQyLDcgKzg0Myw3IEBACiAJaW50IHJldCA9IDAsIGlycTsKIAlkbWFfY2FwX21hc2tfdCBtYXNrOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaS5NWCBTREhDIGRyaXZlclxuIik7CisJcHJfaW5mbygiaS5NWCBTREhDIGRyaXZlclxuIik7CiAKIAlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhzLW1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKaW5kZXggZDUxM2Q0Ny4uOTliNDQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teHMtbW1jLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1hY2gvbXhzLmg+CiAjaW5jbHVkZSA8bWFjaC9jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKaW5kZXggYTZjMzI5MC4uMmRiYTk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L21tYy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KICNpbmNsdWRlIDxwbGF0L211eC5oPgogI2luY2x1ZGUgPHBsYXQvZnBnYS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwppbmRleCAyMWU0YTc5Li4xMDFjZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYwpAQCAtNDUwLDE1ICs0NTAsMTQgQEAKIAkJKiBmcmFtZXdvcmsgaXMgZml4ZWQsIHdlIG5lZWQgYSB3b3JrYXJvdW5kIGxpa2UgdGhpcwogCQkqICh3aGljaCBpcyBzYWZlIGZvciBNTUMsIGJ1dCBub3QgaW4gZ2VuZXJhbCkuCiAJCSovCi0JCWlmIChyZWd1bGF0b3JfaXNfZW5hYmxlZChob3N0LT52Y2MpID4gMCkgewotCQkJcmVndWxhdG9yX2VuYWJsZShob3N0LT52Y2MpOwotCQkJcmVndWxhdG9yX2Rpc2FibGUoaG9zdC0+dmNjKTsKLQkJfQotCQlpZiAoaG9zdC0+dmNjX2F1eCkgewotCQkJaWYgKHJlZ3VsYXRvcl9pc19lbmFibGVkKHJlZykgPiAwKSB7Ci0JCQkJcmVndWxhdG9yX2VuYWJsZShyZWcpOwotCQkJCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZyk7Ci0JCQl9CisJCWlmIChyZWd1bGF0b3JfaXNfZW5hYmxlZChob3N0LT52Y2MpID4gMCB8fAorCQkgICAgKGhvc3QtPnZjY19hdXggJiYgcmVndWxhdG9yX2lzX2VuYWJsZWQoaG9zdC0+dmNjX2F1eCkpKSB7CisJCQlpbnQgdmRkID0gZmZzKG1tY19zbG90KGhvc3QpLm9jcl9tYXNrKSAtIDE7CisKKwkJCW1tY19zbG90KGhvc3QpLnNldF9wb3dlcihob3N0LT5kZXYsIGhvc3QtPnNsb3RfaWQsCisJCQkJCQkgMSwgdmRkKTsKKwkJCW1tY19zbG90KGhvc3QpLnNldF9wb3dlcihob3N0LT5kZXYsIGhvc3QtPnNsb3RfaWQsCisJCQkJCQkgMCwgMCk7CiAJCX0KIAl9CiAKQEAgLTEyNjQsMTQgKzEyNjMsMTQgQEAKIAlob3N0LT5yZXFzX2Jsb2NrZWQgPSAwOwogCWlmIChtbWNfc2xvdChob3N0KS5nZXRfY292ZXJfc3RhdGUoaG9zdC0+ZGV2LCBob3N0LT5zbG90X2lkKSkgewogCQlpZiAoaG9zdC0+cHJvdGVjdF9jYXJkKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY292ZXIgaXMgY2xvc2VkLCAiCisJCQlwcl9pbmZvKCIlczogY292ZXIgaXMgY2xvc2VkLCAiCiAJCQkJCSAiY2FyZCBpcyBub3cgYWNjZXNzaWJsZVxuIiwKIAkJCQkJIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJCWhvc3QtPnByb3RlY3RfY2FyZCA9IDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoIWhvc3QtPnByb3RlY3RfY2FyZCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvdmVyIGlzIG9wZW4sICIKKwkJCXByX2luZm8oIiVzOiBjb3ZlciBpcyBvcGVuLCAiCiAJCQkJCSAiY2FyZCBpcyBub3cgaW5hY2Nlc3NpYmxlXG4iLAogCQkJCQkgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQkJaG9zdC0+cHJvdGVjdF9jYXJkID0gMTsKQEAgLTE0MjIsNyArMTQyMSw3IEBACiAKIAlpZiAoIW5leHQgJiYgZGF0YS0+aG9zdF9jb29raWUgJiYKIAkgICAgZGF0YS0+aG9zdF9jb29raWUgIT0gaG9zdC0+bmV4dF9kYXRhLmNvb2tpZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJbJXNdIGludmFsaWQgY29va2llOiBkYXRhLT5ob3N0X2Nvb2tpZSAlZCIKKwkJcHJfd2FybmluZygiWyVzXSBpbnZhbGlkIGNvb2tpZTogZGF0YS0+aG9zdF9jb29raWUgJWQiCiAJCSAgICAgICAiIGhvc3QtPm5leHRfZGF0YS5jb29raWUgJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgZGF0YS0+aG9zdF9jb29raWUsIGhvc3QtPm5leHRfZGF0YS5jb29raWUpOwogCQlkYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CkBAIC0xOTQzLDYgKzE5NDIsMTAgQEAKIAlvbWFwX2hzbW1jX2NvbnRleHRfc2F2ZShob3N0KTsKIAogCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0RJU0FCTEU7CisJaWYgKGhvc3QtPnBkYXRhLT5jb250cm9sbGVyX2ZsYWdzICYgT01BUF9IU01NQ19CUk9LRU5fTVVMVElCTE9DS19SRUFEKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJtdWx0aWJsb2NrIHJlYWRzIGRpc2FibGVkIGR1ZSB0byAzNXh4IGVycmF0dW0gMi4xLjEuMTI4OyBNTUMgcmVhZCBwZXJmb3JtYW5jZSBtYXkgc3VmZmVyXG4iKTsKKwkJbW1jLT5jYXBzMiB8PSBNTUNfQ0FQMl9OT19NVUxUSV9SRUFEOworCX0KIAogCXBtX3J1bnRpbWVfZW5hYmxlKGhvc3QtPmRldik7CiAJcG1fcnVudGltZV9nZXRfc3luYyhob3N0LT5kZXYpOwpAQCAtMjAxNSw3ICsyMDE4LDcgQEAKIAl9CiAKIAkvKiBSZXF1ZXN0IElSUSBmb3IgTU1DIG9wZXJhdGlvbnMgKi8KLQlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIG9tYXBfaHNtbWNfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgb21hcF9oc21tY19pcnEsIDAsCiAJCQltbWNfaG9zdG5hbWUobW1jKSwgaG9zdCk7CiAJaWYgKHJldCkgewogCQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgIlVuYWJsZSB0byBncmFiIEhTTU1DIElSUVxuIik7CkBAIC0yMDQzLDggKzIwNDYsNyBAQAogCWlmICgobW1jX3Nsb3QoaG9zdCkuY2FyZF9kZXRlY3RfaXJxKSkgewogCQlyZXQgPSByZXF1ZXN0X2lycShtbWNfc2xvdChob3N0KS5jYXJkX2RldGVjdF9pcnEsCiAJCQkJICBvbWFwX2hzbW1jX2NkX2hhbmRsZXIsCi0JCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcKLQkJCQkJICB8IElSUUZfRElTQUJMRUQsCisJCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkJICBtbWNfaG9zdG5hbWUobW1jKSwgaG9zdCk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKaW5kZXggNzI1NzczOC4uZmM0MzU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCkBAIC01NTgsNyArNTU4LDcgQEAKIAlpZiAoZGNzciAmIERDU1JfRU5ESU5UUikgewogCQl3cml0ZWwoQlVGX1BBUlRfRlVMTCwgaG9zdC0+YmFzZSArIE1NQ19QUlRCVUYpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBlcnJvciBvbiBjaGFubmVsICVkIChEQ1NSPSUjeClcbiIsCisJCXByX2VycigiJXM6IERNQSBlcnJvciBvbiBjaGFubmVsICVkIChEQ1NSPSUjeClcbiIsCiAJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgZG1hLCBkY3NyKTsKIAkJaG9zdC0+ZGF0YS0+ZXJyb3IgPSAtRUlPOwogCQlweGFtY2lfZGF0YV9kb25lKGhvc3QsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvczNjbWNpLmMKaW5kZXggYTA0Zjg3ZC4uNzIwZjk5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zM2NtY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3MzY21jaS5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIHsKIAlpZiAoaG9zdC0+c2Rpb19pcnFlbikgewogCQlpZiAoZ3Bpb19nZXRfdmFsdWUoUzNDMjQxMF9HUEUoOCkpID09IDApIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2lnbmFsbGluZyBpcnFcbiIsIF9fZnVuY19fKTsKKwkJCXByX2RlYnVnKCIlczogc2lnbmFsbGluZyBpcnFcbiIsIF9fZnVuY19fKTsKIAkJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdC0+bW1jKTsKIAkJfQogCX0KQEAgLTM0NCw3ICszNDQsNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JLy9wcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zZmVyICVkXG4iLCBfX2Z1bmNfXywgdHJhbnNmZXIpOworCS8qIHByX2RlYnVnKCIlczogdHJhbnNmZXIgJWRcbiIsIF9fZnVuY19fLCB0cmFuc2Zlcik7ICovCiAKIAlob3N0LT5pcnFfZGlzYWJsZWQgPSB0cmFuc2ZlcjsKIApAQCAtOTEzLDkgKzkxMyw5IEBACiB9CiAKIHN0YXRpYyB2b2lkIHMzY21jaV9kbWFfc2V0dXAoc3RydWN0IHMzY21jaV9ob3N0ICpob3N0LAotCQkJICAgICBlbnVtIHMzYzI0MTBfZG1hc3JjIHNvdXJjZSkKKwkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gc291cmNlKQogewotCXN0YXRpYyBlbnVtIHMzYzI0MTBfZG1hc3JjIGxhc3Rfc291cmNlID0gLTE7CisJc3RhdGljIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGxhc3Rfc291cmNlID0gLTE7CiAJc3RhdGljIGludCBzZXR1cF9vazsKIAogCWlmIChsYXN0X3NvdXJjZSA9PSBzb3VyY2UpCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogCiAJQlVHX09OKChkYXRhLT5mbGFncyAmIEJPVEhfRElSKSA9PSBCT1RIX0RJUik7CiAKLQlzM2NtY2lfZG1hX3NldHVwKGhvc3QsIHJ3ID8gUzNDMjQxMF9ETUFTUkNfTUVNIDogUzNDMjQxMF9ETUFTUkNfSFcpOworCXMzY21jaV9kbWFfc2V0dXAoaG9zdCwgcncgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKIAlzM2MyNDEwX2RtYV9jdHJsKGhvc3QtPmRtYSwgUzNDMjQxMF9ETUFPUF9GTFVTSCk7CiAKIAlkbWFfbGVuID0gZG1hX21hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLCBkYXRhLT5zZ19sZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwppbmRleCA0ZGMwMDI4Li40Yjk3NmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKQEAgLTMyLDYgKzMyLDE2IEBACiAvKiBWRU5ET1IgU1BFQyByZWdpc3RlciAqLwogI2RlZmluZSBTREhDSV9WRU5ET1JfU1BFQwkJMHhDMAogI2RlZmluZSAgU0RIQ0lfVkVORE9SX1NQRUNfU0RJT19RVUlSSwkweDAwMDAwMDAyCisjZGVmaW5lIFNESENJX1dUTUtfTFZMCQkJMHg0NAorI2RlZmluZSBTREhDSV9NSVhfQ1RSTAkJCTB4NDgKKworLyoKKyAqIFRoZXJlIGlzIGFuIElOVCBETUEgRVJSIG1pcy1tYXRjaCBiZXR3ZWVuIGVTREhDIGFuZCBTVEQgU0RIQyBTUEVDOgorICogQml0MjUgaXMgdXNlZCBpbiBTVEQgU1BFQywgYW5kIGlzIHJlc2VydmVkIGluIGZzbCBlU0RIQyBkZXNpZ24sCisgKiBidXQgYml0MjggaXMgdXNlZCBhcyB0aGUgSU5UIERNQSBFUlIgaW4gZnNsIGVTREhDIGRlc2lnbi4KKyAqIERlZmluZSB0aGlzIG1hY3JvIERNQSBlcnJvciBJTlQgZm9yIGZzbCBlU0RIQworICovCisjZGVmaW5lIFNESENJX0lOVF9WRU5ET1JfU1BFQ19ETUFfRVJSCTB4MTAwMDAwMDAKIAogLyoKICAqIFRoZSBDTURUWVBFIG9mIHRoZSBDTUQgcmVnaXN0ZXIgKG9mZnNldCAweEUpIHNob3VsZCBiZSBzZXQgdG8KQEAgLTUxLDYgKzYxLDcgQEAKIAlJTVgzNV9FU0RIQywKIAlJTVg1MV9FU0RIQywKIAlJTVg1M19FU0RIQywKKwlJTVg2UV9VU0RIQywKIH07CiAKIHN0cnVjdCBwbHRmbV9pbXhfZGF0YSB7CkBAIC03NCw2ICs4NSw5IEBACiAJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDUzIiwKIAkJLmRyaXZlcl9kYXRhID0gSU1YNTNfRVNESEMsCiAJfSwgeworCQkubmFtZSA9ICJzZGhjaS11c2RoYy1pbXg2cSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDZRX1VTREhDLAorCX0sIHsKIAkJLyogc2VudGluZWwgKi8KIAl9CiB9OwpAQCAtODQsNiArOTgsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDM1LWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YMzVfRVNESENdLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YNTFfRVNESENdLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YNTNfRVNESENdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YNlFfVVNESENdLCB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9lc2RoY19kdF9pZHMpOwpAQCAtMTA4LDYgKzEyMywxMSBAQAogCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDUzX0VTREhDOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19pbXg2cV91c2RoYyhzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YNlFfVVNESEM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBlc2RoY19jbHJzZXRfbGUoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiBtYXNrLCB1MzIgdmFsLCBpbnQgcmVnKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGhvc3QtPmlvYWRkciArIChyZWcgJiB+MHgzKTsKQEAgLTEzNSw2ICsxNTUsMjcgQEAKIAkJCXZhbCB8PSBTREhDSV9DQVJEX1BSRVNFTlQ7CiAJfQogCisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9DQVBBQklMSVRJRVMpKSB7CisJCS8qIEluIEZTTCBlc2RoYyBJQyBtb2R1bGUsIG9ubHkgYml0MjAgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUKKwkJICogQURNQTIgY2FwYWJpbGl0eSBvZiBlc2RoYywgYnV0IHRoaXMgYml0IGlzIG1lc3NlZCB1cCBvbgorCQkgKiBzb21lIFNPQ3MgKGUuZy4gb24gTVgyNSwgTVgzNSB0aGlzIGJpdCBpcyBzZXQsIGJ1dCB0aGV5CisJCSAqIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgQURNQTIpLiBTbyBzZXQgdGhlIEJST0tFTl9BRE1BCisJCSAqIHVpcmsgb24gTVgyNS8zNSBwbGF0Zm9ybXMuCisJCSAqLworCisJCWlmICh2YWwgJiBTREhDSV9DQU5fRE9fQURNQTEpIHsKKwkJCXZhbCAmPSB+U0RIQ0lfQ0FOX0RPX0FETUExOworCQkJdmFsIHw9IFNESENJX0NBTl9ET19BRE1BMjsKKwkJfQorCX0KKworCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfSU5UX1NUQVRVUykpIHsKKwkJaWYgKHZhbCAmIFNESENJX0lOVF9WRU5ET1JfU1BFQ19ETUFfRVJSKSB7CisJCQl2YWwgJj0gflNESENJX0lOVF9WRU5ET1JfU1BFQ19ETUFfRVJSOworCQkJdmFsIHw9IFNESENJX0lOVF9BRE1BX0VSUk9SOworCQl9CisJfQorCiAJcmV0dXJuIHZhbDsKIH0KIApAQCAtMTc5LDEzICsyMjAsMjggQEAKIAkJCXdyaXRlbCh2LCBob3N0LT5pb2FkZHIgKyBTREhDSV9WRU5ET1JfU1BFQyk7CiAJfQogCisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9JTlRfRU5BQkxFIHx8IHJlZyA9PSBTREhDSV9TSUdOQUxfRU5BQkxFKSkgeworCQlpZiAodmFsICYgU0RIQ0lfSU5UX0FETUFfRVJST1IpIHsKKwkJCXZhbCAmPSB+U0RIQ0lfSU5UX0FETUFfRVJST1I7CisJCQl2YWwgfD0gU0RIQ0lfSU5UX1ZFTkRPUl9TUEVDX0RNQV9FUlI7CisJCX0KKwl9CisKIAl3cml0ZWwodmFsLCBob3N0LT5pb2FkZHIgKyByZWcpOwogfQogCiBzdGF0aWMgdTE2IGVzZGhjX3JlYWR3X2xlKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQogewotCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfSE9TVF9WRVJTSU9OKSkKLQkJcmVnIF49IDI7CisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9IT1NUX1ZFUlNJT04pKSB7CisJCXUxNiB2YWwgPSByZWFkdyhob3N0LT5pb2FkZHIgKyAocmVnIF4gMikpOworCQkvKgorCQkgKiB1U0RIQyBzdXBwb3J0cyBTREhDSSB2My4wLCBidXQgaXQncyBlbmNvZGVkIGFzIHZhbHVlCisJCSAqIDB4MyBpbiBob3N0IGNvbnRyb2xsZXIgdmVyc2lvbiByZWdpc3Rlciwgd2hpY2ggdmlvbGF0ZXMKKwkJICogU0RIQ0lfU1BFQ18zMDAgZGVmaW5pdGlvbi4gIFdvcmsgaXQgYXJvdW5kIGhlcmUuCisJCSAqLworCQlpZiAoKHZhbCAmIFNESENJX1NQRUNfVkVSX01BU0spID09IDMpCisJCQlyZXR1cm4gLS12YWw7CisJfQogCiAJcmV0dXJuIHJlYWR3KGhvc3QtPmlvYWRkciArIHJlZyk7CiB9CkBAIC0yMTYsOCArMjcyLDE3IEBACiAJCWlmICgoaG9zdC0+Y21kLT5vcGNvZGUgPT0gTU1DX1NUT1BfVFJBTlNNSVNTSU9OKQogCQkJJiYgKGlteF9kYXRhLT5mbGFncyAmIEVTREhDX0ZMQUdfTVVMVElCTEtfTk9fSU5UKSkKIAkJCXZhbCB8PSBTREhDSV9DTURfQUJPUlRDTUQ7Ci0JCXdyaXRlbCh2YWwgPDwgMTYgfCBpbXhfZGF0YS0+c2NyYXRjaHBhZCwKLQkJCWhvc3QtPmlvYWRkciArIFNESENJX1RSQU5TRkVSX01PREUpOworCisJCWlmIChpc19pbXg2cV91c2RoYyhpbXhfZGF0YSkpIHsKKwkJCXUzMiBtID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgU0RIQ0lfTUlYX0NUUkwpOworCQkJbSA9IGlteF9kYXRhLT5zY3JhdGNocGFkIHwgKG0gJiAweGZmZmYwMDAwKTsKKwkJCXdyaXRlbChtLCBob3N0LT5pb2FkZHIgKyBTREhDSV9NSVhfQ1RSTCk7CisJCQl3cml0ZWwodmFsIDw8IDE2LAorCQkJICAgICAgIGhvc3QtPmlvYWRkciArIFNESENJX1RSQU5TRkVSX01PREUpOworCQl9IGVsc2UgeworCQkJd3JpdGVsKHZhbCA8PCAxNiB8IGlteF9kYXRhLT5zY3JhdGNocGFkLAorCQkJICAgICAgIGhvc3QtPmlvYWRkciArIFNESENJX1RSQU5TRkVSX01PREUpOworCQl9CiAJCXJldHVybjsKIAljYXNlIFNESENJX0JMT0NLX1NJWkU6CiAJCXZhbCAmPSB+U0RIQ0lfTUFLRV9CTEtTWigweDcsIDApOwpAQCAtMzExLDkgKzM3NiwxMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2VzZGhjX2lteF9wZGF0YSA9IHsKLQkucXVpcmtzID0gRVNESENfREVGQVVMVF9RVUlSS1MgfCBTREhDSV9RVUlSS19CUk9LRU5fQURNQQorCS5xdWlya3MgPSBFU0RIQ19ERUZBVUxUX1FVSVJLUyB8IFNESENJX1FVSVJLX05PX0hJU1BEX0JJVAorCQkJfCBTREhDSV9RVUlSS19OT19FTkRBVFRSX0lOX05PUERFU0MKKwkJCXwgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDCiAJCQl8IFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTiwKLQkvKiBBRE1BIGhhcyBpc3N1ZXMuIE1pZ2h0IGJlIGZpeGFibGUgKi8KIAkub3BzID0gJnNkaGNpX2VzZGhjX29wcywKIH07CiAKQEAgLTQwNSwxMSArNDcxLDE5IEBACiAKIAlpZiAoaXNfaW14MjVfZXNkaGMoaW14X2RhdGEpIHx8IGlzX2lteDM1X2VzZGhjKGlteF9kYXRhKSkKIAkJLyogRml4IGVycmF0YSBFTkdjbTA3MjA3IHByZXNlbnQgb24gaS5NWDI1IGFuZCBpLk1YMzUgKi8KLQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX05PX01VTFRJQkxPQ0s7CisJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19OT19NVUxUSUJMT0NLCisJCQl8IFNESENJX1FVSVJLX0JST0tFTl9BRE1BOwogCiAJaWYgKGlzX2lteDUzX2VzZGhjKGlteF9kYXRhKSkKIAkJaW14X2RhdGEtPmZsYWdzIHw9IEVTREhDX0ZMQUdfTVVMVElCTEtfTk9fSU5UOwogCisJLyoKKwkgKiBUaGUgaW14NnEgUk9NIGNvZGUgd2lsbCBjaGFuZ2UgdGhlIGRlZmF1bHQgd2F0ZXJtYXJrIGxldmVsIHNldHRpbmcKKwkgKiB0byBzb21ldGhpbmcgaW5zYW5lLiAgQ2hhbmdlIGl0IGJhY2sgaGVyZS4KKwkgKi8KKwlpZiAoaXNfaW14NnFfdXNkaGMoaW14X2RhdGEpKQorCQl3cml0ZWwoMHgwODEwMDgxMCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfV1RNS19MVkwpOworCiAJYm9hcmRkYXRhID0gJmlteF9kYXRhLT5ib2FyZGRhdGE7CiAJaWYgKHNkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChwZGV2LCBib2FyZGRhdGEpIDwgMCkgewogCQlpZiAoIWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKaW5kZXggZmU2MDRkZi4uNTllOWQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqIENvcHlyaWdodCAoYykgMjAwOSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogQXV0aG9yczogWGlhb2JvIFhpZSA8WC5YaWVAZnJlZXNjYWxlLmNvbT4KQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAjaW5jbHVkZSAic2RoY2ktZXNkaGMuaCIKQEAgLTIyLDExICsyMywyMSBAQAogc3RhdGljIHUxNiBlc2RoY19yZWFkdyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKIHsKIAl1MTYgcmV0OworCWludCBiYXNlID0gcmVnICYgfjB4MzsKKwlpbnQgc2hpZnQgPSAocmVnICYgMHgyKSAqIDg7CiAKIAlpZiAodW5saWtlbHkocmVnID09IFNESENJX0hPU1RfVkVSU0lPTikpCi0JCXJldCA9IGluX2JlMTYoaG9zdC0+aW9hZGRyICsgcmVnKTsKKwkJcmV0ID0gaW5fYmUzMihob3N0LT5pb2FkZHIgKyBiYXNlKSAmIDB4ZmZmZjsKIAllbHNlCi0JCXJldCA9IHNkaGNpX2JlMzJic19yZWFkdyhob3N0LCByZWcpOworCQlyZXQgPSAoaW5fYmUzMihob3N0LT5pb2FkZHIgKyBiYXNlKSA+PiBzaGlmdCkgJiAweGZmZmY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHU4IGVzZGhjX3JlYWRiKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCWludCBiYXNlID0gcmVnICYgfjB4MzsKKwlpbnQgc2hpZnQgPSAocmVnICYgMHgzKSAqIDg7CisJdTggcmV0ID0gKGluX2JlMzIoaG9zdC0+aW9hZGRyICsgYmFzZSkgPj4gc2hpZnQpICYgMHhmZjsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NCw3ICs4NSw3IEBACiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9lc2RoY19vcHMgPSB7CiAJLnJlYWRfbCA9IHNkaGNpX2JlMzJic19yZWFkbCwKIAkucmVhZF93ID0gZXNkaGNfcmVhZHcsCi0JLnJlYWRfYiA9IHNkaGNpX2JlMzJic19yZWFkYiwKKwkucmVhZF9iID0gZXNkaGNfcmVhZGIsCiAJLndyaXRlX2wgPSBzZGhjaV9iZTMyYnNfd3JpdGVsLAogCS53cml0ZV93ID0gZXNkaGNfd3JpdGV3LAogCS53cml0ZV9iID0gZXNkaGNfd3JpdGViLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1obHdkLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwppbmRleCA3MzViZTEzLi45YjBkNzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKaW5kZXggMjZjNTI4Ni4uZDgzM2Q5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTIxLDYgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2ZpLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSAic2RoY2kuaCIKIApAQCAtNDMsNiArNDcsNyBAQAogCiBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzIHsKIAl1bnNpZ25lZCBpbnQJCXF1aXJrczsKKwlib29sCQkJYWxsb3dfcnVudGltZV9wbTsKIAogCWludAkJCSgqcHJvYmUpIChzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgKik7CiAKQEAgLTU5LDEyICs2NCwxNiBAQAogCXN0cnVjdCBzZGhjaV9ob3N0CSpob3N0OwogCiAJaW50CQkJcGNpX2JhcjsKKwlpbnQJCQlyc3Rfbl9ncGlvOworCWludAkJCWNkX2dwaW87CisJaW50CQkJY2RfaXJxOwogfTsKIAogc3RydWN0IHNkaGNpX3BjaV9jaGlwIHsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CiAKIAl1bnNpZ25lZCBpbnQJCXF1aXJrczsKKwlib29sCQkJYWxsb3dfcnVudGltZV9wbTsKIAljb25zdCBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzICpmaXhlczsKIAogCWludAkJCW51bV9zbG90czsJLyogU2xvdHMgb24gY29udHJvbGxlciAqLwpAQCAtMTYzLDEyICsxNzIsMTI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIE1lZGZpZWxkIGVNTUMgaGFyZHdhcmUgcmVzZXQgR1BJT3MgKi8KK3N0YXRpYyBpbnQgbWZkX2VtbWMwX3JzdF9ncGlvID0gLUVJTlZBTDsKK3N0YXRpYyBpbnQgbWZkX2VtbWMxX3JzdF9ncGlvID0gLUVJTlZBTDsKKworc3RhdGljIGludCBtZmRfZW1tY19ncGlvX3BhcnNlKHN0cnVjdCBzZmlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKwlzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqc2IgPSAoc3RydWN0IHNmaV90YWJsZV9zaW1wbGUgKil0YWJsZTsKKwlzdHJ1Y3Qgc2ZpX2dwaW9fdGFibGVfZW50cnkgKmVudHJ5OworCWludCBpLCBudW07CisKKwludW0gPSBTRklfR0VUX05VTV9FTlRSSUVTKHNiLCBzdHJ1Y3Qgc2ZpX2dwaW9fdGFibGVfZW50cnkpOworCWVudHJ5ID0gKHN0cnVjdCBzZmlfZ3Bpb190YWJsZV9lbnRyeSAqKXNiLT5wZW50cnk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyssIGVudHJ5KyspIHsKKwkJaWYgKCFzdHJuY21wKGVudHJ5LT5waW5fbmFtZSwgImVtbWMwX3JzdCIsIFNGSV9OQU1FX0xFTikpCisJCQltZmRfZW1tYzBfcnN0X2dwaW8gPSBlbnRyeS0+cGluX25vOworCQllbHNlIGlmICghc3RybmNtcChlbnRyeS0+cGluX25hbWUsICJlbW1jMV9yc3QiLCBTRklfTkFNRV9MRU4pKQorCQkJbWZkX2VtbWMxX3JzdF9ncGlvID0gZW50cnktPnBpbl9ubzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZmRfc2RfY2QoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCA9IGRldl9pZDsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHNsb3QtPmhvc3Q7CisKKwltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoMjAwKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjZGVmaW5lIE1GTERfU0RfQ0RfUElOIDY5CisKK3N0YXRpYyBpbnQgbWZkX3NkX3Byb2JlX3Nsb3Qoc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90KQoreworCWludCBlcnIsIGlycSwgZ3BpbyA9IE1GTERfU0RfQ0RfUElOOworCisJc2xvdC0+Y2RfZ3BpbyA9IC1FSU5WQUw7CisJc2xvdC0+Y2RfaXJxID0gLUVJTlZBTDsKKworCWVyciA9IGdwaW9fcmVxdWVzdChncGlvLCAic2RfY2QiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlycSA9IGdwaW9fdG9faXJxKGdwaW8pOworCWlmIChpcnEgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBtZmRfc2RfY2QsIElSUUZfVFJJR0dFUl9SSVNJTkcgfAorCQkJICBJUlFGX1RSSUdHRVJfRkFMTElORywgInNkX2NkIiwgc2xvdCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXNsb3QtPmNkX2dwaW8gPSBncGlvOworCXNsb3QtPmNkX2lycSA9IGlycTsKKwlzbG90LT5ob3N0LT5xdWlya3MyIHw9IFNESENJX1FVSVJLMl9PV05fQ0FSRF9ERVRFQ1RJT047CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJZ3Bpb19mcmVlKGdwaW8pOworb3V0OgorCWRldl93YXJuKCZzbG90LT5jaGlwLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY2FyZCBkZXRlY3Qgd2FrZSB1cFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1mZF9zZF9yZW1vdmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3QsIGludCBkZWFkKQoreworCWlmIChzbG90LT5jZF9pcnEgPj0gMCkKKwkJZnJlZV9pcnEoc2xvdC0+Y2RfaXJxLCBzbG90KTsKKwlncGlvX2ZyZWUoc2xvdC0+Y2RfZ3Bpbyk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgbWZkX3NkX3Byb2JlX3Nsb3QJTlVMTAorI2RlZmluZSBtZmRfc2RfcmVtb3ZlX3Nsb3QJTlVMTAorCisjZW5kaWYKKwogc3RhdGljIGludCBtZmRfZW1tY19wcm9iZV9zbG90KHN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCkKIHsKLQlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF84X0JJVF9EQVRBOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCBncGlvID0gLUVJTlZBTDsKKworCXNmaV90YWJsZV9wYXJzZShTRklfU0lHX0dQSU8sIE5VTEwsIE5VTEwsIG1mZF9lbW1jX2dwaW9fcGFyc2UpOworCisJc3dpdGNoIChzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTUZEX0VNTUMwOgorCQlncGlvID0gbWZkX2VtbWMwX3JzdF9ncGlvOworCQluYW1lID0gImVNTUMwX3Jlc2V0IjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX01GRF9FTU1DMToKKwkJZ3BpbyA9IG1mZF9lbW1jMV9yc3RfZ3BpbzsKKwkJbmFtZSA9ICJlTU1DMV9yZXNldCI7CisJCWJyZWFrOworCX0KKworCWlmICghZ3Bpb19yZXF1ZXN0KGdwaW8sIG5hbWUpKSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCAxKTsKKwkJc2xvdC0+cnN0X25fZ3BpbyA9IGdwaW87CisJCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0hXX1JFU0VUOworCX0KKworCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRTsKKworCXNsb3QtPmhvc3QtPm1tYy0+Y2FwczIgPSBNTUNfQ0FQMl9CT09UUEFSVF9OT0FDQzsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtZmRfZW1tY19yZW1vdmVfc2xvdChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3QsIGludCBkZWFkKQoreworCWdwaW9fZnJlZShzbG90LT5yc3Rfbl9ncGlvKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgc2RoY2lfaW50ZWxfbXJzdF9oYzAgPSB7CiAJLnF1aXJrcwkJPSBTREhDSV9RVUlSS19CUk9LRU5fQURNQSB8IFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCwKIAkucHJvYmVfc2xvdAk9IG1yc3RfaGNfcHJvYmVfc2xvdCwKQEAgLTE4MSwxNSArMzA3LDIxIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGNpX2ZpeGVzIHNkaGNpX2ludGVsX21mZF9zZCA9IHsKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKKwkuYWxsb3dfcnVudGltZV9wbSA9IHRydWUsCisJLnByb2JlX3Nsb3QJPSBtZmRfc2RfcHJvYmVfc2xvdCwKKwkucmVtb3ZlX3Nsb3QJPSBtZmRfc2RfcmVtb3ZlX3Nsb3QsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9pbnRlbF9tZmRfc2RpbyA9IHsKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKKwkuYWxsb3dfcnVudGltZV9wbSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9pbnRlbF9tZmRfZW1tYyA9IHsKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKKwkuYWxsb3dfcnVudGltZV9wbSA9IHRydWUsCiAJLnByb2JlX3Nsb3QJPSBtZmRfZW1tY19wcm9iZV9zbG90LAorCS5yZW1vdmVfc2xvdAk9IG1mZF9lbW1jX3JlbW92ZV9zbG90LAogfTsKIAogLyogTzJNaWNybyBleHRyYSByZWdpc3RlcnMgKi8KQEAgLTgzMiw5ICs5NjQsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2RoY2lfcGNpX2h3X3Jlc2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJaW50IHJzdF9uX2dwaW8gPSBzbG90LT5yc3Rfbl9ncGlvOworCisJaWYgKCFncGlvX2lzX3ZhbGlkKHJzdF9uX2dwaW8pKQorCQlyZXR1cm47CisJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocnN0X25fZ3BpbywgMCk7CisJLyogRm9yIGVNTUMsIG1pbmltdW0gaXMgMXVzIGJ1dCBnaXZlIGl0IDEwdXMgZm9yIGdvb2QgbWVhc3VyZSAqLworCXVkZWxheSgxMCk7CisJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocnN0X25fZ3BpbywgMSk7CisJLyogRm9yIGVNTUMsIG1pbmltdW0gaXMgMjAwdXMgYnV0IGdpdmUgaXQgMzAwdXMgZm9yIGdvb2QgbWVhc3VyZSAqLworCXVzbGVlcF9yYW5nZSgzMDAsIDEwMDApOworfQorCiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9wY2lfb3BzID0gewogCS5lbmFibGVfZG1hCT0gc2RoY2lfcGNpX2VuYWJsZV9kbWEsCiAJLnBsYXRmb3JtXzhiaXRfd2lkdGgJPSBzZGhjaV9wY2lfOGJpdF93aWR0aCwKKwkuaHdfcmVzZXQJCT0gc2RoY2lfcGNpX2h3X3Jlc2V0LAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXApAQCAtOTQ0LDYgKzEwOTIsOTUgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGludCBzZGhjaV9wY2lfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOworCXN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqY2hpcDsKKwlzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3Q7CisJcG1fbWVzc2FnZV90IHN0YXRlID0geyAuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EIH07CisJaW50IGksIHJldDsKKworCWNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc2xvdHM7IGkrKykgeworCQlzbG90ID0gY2hpcC0+c2xvdHNbaV07CisJCWlmICghc2xvdCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHNkaGNpX3J1bnRpbWVfc3VzcGVuZF9ob3N0KHNsb3QtPmhvc3QpOworCisJCWlmIChyZXQpIHsKKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJCQlzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KGNoaXAtPnNsb3RzW2ldLT5ob3N0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoY2hpcC0+Zml4ZXMgJiYgY2hpcC0+Zml4ZXMtPnN1c3BlbmQpIHsKKwkJcmV0ID0gY2hpcC0+Zml4ZXMtPnN1c3BlbmQoY2hpcCwgc3RhdGUpOworCQlpZiAocmV0KSB7CisJCQlmb3IgKGkgPSBjaGlwLT5udW1fc2xvdHMgLSAxOyBpID49IDA7IGktLSkKKwkJCQlzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KGNoaXAtPnNsb3RzW2ldLT5ob3N0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZGhjaV9wY2lfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwOworCXN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdDsKKwlpbnQgaSwgcmV0OworCisJY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAwOworCisJaWYgKGNoaXAtPmZpeGVzICYmIGNoaXAtPmZpeGVzLT5yZXN1bWUpIHsKKwkJcmV0ID0gY2hpcC0+Zml4ZXMtPnJlc3VtZShjaGlwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9zbG90czsgaSsrKSB7CisJCXNsb3QgPSBjaGlwLT5zbG90c1tpXTsKKwkJaWYgKCFzbG90KQorCQkJY29udGludWU7CisKKwkJcmV0ID0gc2RoY2lfcnVudGltZV9yZXN1bWVfaG9zdChzbG90LT5ob3N0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RoY2lfcGNpX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgc2RoY2lfcGNpX3J1bnRpbWVfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHNkaGNpX3BjaV9ydW50aW1lX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHNkaGNpX3BjaV9ydW50aW1lX2lkbGUJCU5VTEwKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzZGhjaV9wY2lfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBzZGhjaV9wY2lfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHNkaGNpX3BjaV9ydW50aW1lX3Jlc3VtZSwKKwkucnVudGltZV9pZGxlID0gc2RoY2lfcGNpX3J1bnRpbWVfaWRsZSwKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogRGV2aWNlIHByb2JpbmcvcmVtb3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCkBAIC05ODgsNiArMTIyNSw3IEBACiAJc2xvdC0+Y2hpcCA9IGNoaXA7CiAJc2xvdC0+aG9zdCA9IGhvc3Q7CiAJc2xvdC0+cGNpX2JhciA9IGJhcjsKKwlzbG90LT5yc3Rfbl9ncGlvID0gLUVJTlZBTDsKIAogCWhvc3QtPmh3X25hbWUgPSAiUENJIjsKIAlob3N0LT5vcHMgPSAmc2RoY2lfcGNpX29wczsKQEAgLTEwNTgsNiArMTI5NiwyMSBAQAogCXNkaGNpX2ZyZWVfaG9zdChzbG90LT5ob3N0KTsKIH0KIAorc3RhdGljIHZvaWQgX19kZXZpbml0IHNkaGNpX3BjaV9ydW50aW1lX3BtX2FsbG93KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX2FsbG93KGRldik7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCA1MCk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9zdXNwZW5kX2lnbm9yZV9jaGlsZHJlbihkZXYsIDEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc2RoY2lfcGNpX3J1bnRpbWVfcG1fZm9yYmlkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwbV9ydW50aW1lX2ZvcmJpZChkZXYpOworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0xMTA3LDggKzEzNjAsMTAgQEAKIAogCWNoaXAtPnBkZXYgPSBwZGV2OwogCWNoaXAtPmZpeGVzID0gKGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgKillbnQtPmRyaXZlcl9kYXRhOwotCWlmIChjaGlwLT5maXhlcykKKwlpZiAoY2hpcC0+Zml4ZXMpIHsKIAkJY2hpcC0+cXVpcmtzID0gY2hpcC0+Zml4ZXMtPnF1aXJrczsKKwkJY2hpcC0+YWxsb3dfcnVudGltZV9wbSA9IGNoaXAtPmZpeGVzLT5hbGxvd19ydW50aW1lX3BtOworCX0KIAljaGlwLT5udW1fc2xvdHMgPSBzbG90czsKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKQEAgLTExMzMsNiArMTM4OCw5IEBACiAJCWNoaXAtPnNsb3RzW2ldID0gc2xvdDsKIAl9CiAKKwlpZiAoY2hpcC0+YWxsb3dfcnVudGltZV9wbSkKKwkJc2RoY2lfcGNpX3J1bnRpbWVfcG1fYWxsb3coJnBkZXYtPmRldik7CisKIAlyZXR1cm4gMDsKIAogZnJlZToKQEAgLTExNTIsNiArMTQxMCw5IEBACiAJY2hpcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWlmIChjaGlwKSB7CisJCWlmIChjaGlwLT5hbGxvd19ydW50aW1lX3BtKQorCQkJc2RoY2lfcGNpX3J1bnRpbWVfcG1fZm9yYmlkKCZwZGV2LT5kZXYpOworCiAJCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc2xvdHM7IGkrKykKIAkJCXNkaGNpX3BjaV9yZW1vdmVfc2xvdChjaGlwLT5zbG90c1tpXSk7CiAKQEAgLTExNjksNiArMTQzMCw5IEBACiAJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHNkaGNpX3BjaV9yZW1vdmUpLAogCS5zdXNwZW5kID0Jc2RoY2lfcGNpX3N1c3BlbmQsCiAJLnJlc3VtZQk9CXNkaGNpX3BjaV9yZXN1bWUsCisJLmRyaXZlciA9CXsKKwkJLnBtID0gICAmc2RoY2lfcGNpX3BtX29wcworCX0sCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggNjQxNGVmZS4uYTllMTJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtMjksNiArMjksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2lmZGVmIENPTkZJR19QUEMKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2Mi5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2Mi5jCmluZGV4IDM4ZjU4OTkuLmQ0YmY2ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjIuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYyLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTU5LDcgKzYwLDcgQEAKIAkJICogdHVuZSB0aW1pbmcgb2YgcmVhZCBkYXRhL2NvbW1hbmQgd2hlbiBjcmMgZXJyb3IgaGFwcGVuCiAJCSAqIG5vIHBlcmZvcm1hbmNlIGltcGFjdAogCQkgKi8KLQkJaWYgKHBkYXRhLT5jbGtfZGVsYXlfc2VsID09IDEpIHsKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT5jbGtfZGVsYXlfc2VsID09IDEpIHsKIAkJCXRtcCA9IHJlYWR3KGhvc3QtPmlvYWRkciArIFNEX0NMT0NLX0JVUlNUX1NJWkVfU0VUVVApOwogCiAJCQl0bXAgJj0gfihTRENMS19ERUxBWV9NQVNLIDw8IFNEQ0xLX0RFTEFZX1NISUZUKTsKQEAgLTcxLDcgKzcyLDcgQEAKIAkJCXdyaXRldyh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0NMT0NLX0JVUlNUX1NJWkVfU0VUVVApOwogCQl9CiAKLQkJaWYgKHBkYXRhLT5mbGFncyAmIFBYQV9GTEFHX0VOQUJMRV9DTE9DS19HQVRJTkcpIHsKKwkJaWYgKHBkYXRhICYmIChwZGF0YS0+ZmxhZ3MgJiBQWEFfRkxBR19FTkFCTEVfQ0xPQ0tfR0FUSU5HKSkgewogCQkJdG1wID0gcmVhZHcoaG9zdC0+aW9hZGRyICsgU0RfRklGT19QQVJBTSk7CiAJCQl0bXAgJj0gfkNMS19HQVRFX1NFVFRJTkdfQklUUzsKIAkJCXdyaXRldyh0bXAsIGhvc3QtPmlvYWRkciArIFNEX0ZJRk9fUEFSQU0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2My5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2My5jCmluZGV4IGZjN2U0YTUuLmNmZjRhZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3B4YV9zZGhjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInNkaGNpLmgiCiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKaW5kZXggZmU4ODZkNi4uM2QwMGU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCkBAIC0yMDMsMTcgKzIwMywyMyBAQAogCQl3cml0ZWwoY3RybCwgaG9zdC0+aW9hZGRyICsgUzNDX1NESENJX0NPTlRST0wyKTsKIAl9CiAKLQkvKiByZWNvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgZm9yIG5ldyBjbG9jayByYXRlICovCisJLyogcmVwcm9ncmFtIGRlZmF1bHQgaGFyZHdhcmUgY29uZmlndXJhdGlvbiAqLworCXdyaXRlbChTM0M2NFhYX1NESENJX0NPTlRST0w0X0RSSVZFXzltQSwKKwkJaG9zdC0+aW9hZGRyICsgUzNDNjRYWF9TREhDSV9DT05UUk9MNCk7CiAKLQl7Ci0JCXN0cnVjdCBtbWNfaW9zIGlvczsKKwljdHJsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgUzNDX1NESENJX0NPTlRST0wyKTsKKwljdHJsIHw9IChTM0M2NFhYX1NESENJX0NUUkwyX0VOU1RBQVNZTkNDTFIgfAorCQkgIFMzQzY0WFhfU0RIQ0lfQ1RSTDJfRU5DTURDTkZNU0sgfAorCQkgIFMzQ19TREhDSV9DVFJMMl9FTkZCQ0xLUlggfAorCQkgIFMzQ19TREhDSV9DVFJMMl9ERkNOVF9OT05FIHwKKwkJICBTM0NfU0RIQ0lfQ1RSTDJfRU5DTEtPVVRIT0xEKTsKKwl3cml0ZWwoY3RybCwgaG9zdC0+aW9hZGRyICsgUzNDX1NESENJX0NPTlRST0wyKTsKIAotCQlpb3MuY2xvY2sgPSBjbG9jazsKLQotCQlpZiAob3VyaG9zdC0+cGRhdGEtPmNmZ19jYXJkKQotCQkJKG91cmhvc3QtPnBkYXRhLT5jZmdfY2FyZCkob3VyaG9zdC0+cGRldiwgaG9zdC0+aW9hZGRyLAotCQkJCQkJICAgJmlvcywgTlVMTCk7Ci0JfQorCS8qIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyIGZvciBuZXcgY2xvY2sgcmF0ZSAqLworCWN0cmwgPSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMSB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDApOworCWlmIChjbG9jayA8IDI1ICogMTAwMDAwMCkKKwkJY3RybCB8PSAoUzNDX1NESENJX0NUUkwzX0ZDU0VMMyB8IFMzQ19TREhDSV9DVFJMM19GQ1NFTDIpOworCXdyaXRlbChjdHJsLCBob3N0LT5pb2FkZHIgKyBTM0NfU0RIQ0lfQ09OVFJPTDMpOwogfQogCiAvKioKQEAgLTU2MSw4ICs1NjcsMTAgQEAKIAogIGVycl9yZXFfcmVnczoKIAlmb3IgKHB0ciA9IDA7IHB0ciA8IE1BWF9CVVNfQ0xLOyBwdHIrKykgewotCQljbGtfZGlzYWJsZShzYy0+Y2xrX2J1c1twdHJdKTsKLQkJY2xrX3B1dChzYy0+Y2xrX2J1c1twdHJdKTsKKwkJaWYgKHNjLT5jbGtfYnVzW3B0cl0pIHsKKwkJCWNsa19kaXNhYmxlKHNjLT5jbGtfYnVzW3B0cl0pOworCQkJY2xrX3B1dChzYy0+Y2xrX2J1c1twdHJdKTsKKwkJfQogCX0KIAogIGVycl9ub19idXNjbGtzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zcGVhci5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zcGVhci5jCmluZGV4IDYwYTRjOTcuLjYzY2M4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3BlYXIuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNwZWFyLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xNzcsOCArMTc4LDYgQEAKIAkJCQkJc2RoY2ktPmRhdGEtPmNhcmRfcG93ZXJfZ3Bpbyk7CiAJCQlnb3RvIGVycl9wZ3Bpb19kaXJlY3Rpb247CiAJCX0KLQotCQlncGlvX3NldF92YWx1ZShzZGhjaS0+ZGF0YS0+Y2FyZF9wb3dlcl9ncGlvLCAxKTsKIAl9CiAKIAlpZiAoc2RoY2ktPmRhdGEtPmNhcmRfaW50X2dwaW8gPj0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCmluZGV4IDE4YjBiZDMuLjg5Njk5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKQEAgLTEzLDE1ICsxMywyMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvZ3Bpby10ZWdyYS5oPgogI2luY2x1ZGUgPG1hY2gvc2RoY2kuaD4KIAogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCkBAIC03MywxMCArNzksOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHRlZ3JhX3NkaGNpX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqc2RoY2kpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShtbWNfZGV2KHNkaGNpLT5tbWMpKTsKLQlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKLQotCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoc2RoY2kpOworCXN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gcGx0Zm1faG9zdC0+cHJpdjsKIAogCWlmICghZ3Bpb19pc192YWxpZChwbGF0LT53cF9ncGlvKSkKIAkJcmV0dXJuIC0xOwpAQCAtOTQsMTIgKzk4LDEwIEBACiAKIHN0YXRpYyBpbnQgdGVncmFfc2RoY2lfOGJpdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IGJ1c193aWR0aCkKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7Ci0Jc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gcGx0Zm1faG9zdC0+cHJpdjsKIAl1MzIgY3RybDsKIAotCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQogCWN0cmwgPSBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpOwogCWlmIChwbGF0LT5pc184Yml0ICYmIGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKIAkJY3RybCAmPSB+U0RIQ0lfQ1RSTF80QklUQlVTOwpAQCAtMTMxLDYgKzEzMywzNiBAQAogCS5vcHMgID0gJnRlZ3JhX3NkaGNpX29wcywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkaGNpX3RlZ3JhX2R0X21hdGNoW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkaGNpX2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqIF9fZGV2aW5pdCBzZGhjaV90ZWdyYV9kdF9wYXJzZV9wZGF0YSgKKwkJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJaWYgKCFucCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwbGF0ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGxhdCksIEdGUF9LRVJORUwpOworCWlmICghcGxhdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcGxhdC0+Y2RfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiY2QtZ3Bpb3MiLCAwKTsKKwlwbGF0LT53cF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJ3cC1ncGlvcyIsIDApOworCXBsYXQtPnBvd2VyX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInBvd2VyLWdwaW9zIiwgMCk7CisJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJzdXBwb3J0LThiaXQiLCBOVUxMKSkKKwkJcGxhdC0+aXNfOGJpdCA9IDE7CisKKwlyZXR1cm4gcGxhdDsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfdGVncmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKQEAgLTE0NywxMiArMTc5LDE3IEBACiAKIAlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKKwlpZiAocGxhdCA9PSBOVUxMKQorCQlwbGF0ID0gc2RoY2lfdGVncmFfZHRfcGFyc2VfcGRhdGEocGRldik7CisKIAlpZiAocGxhdCA9PSBOVUxMKSB7CiAJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmMgPSAtRU5YSU87CiAJCWdvdG8gZXJyX25vX3BsYXQ7CiAJfQogCisJcGx0Zm1faG9zdC0+cHJpdiA9IHBsYXQ7CisKIAlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgewogCQlyYyA9IGdwaW9fcmVxdWVzdChwbGF0LT5wb3dlcl9ncGlvLCAic2RoY2lfcG93ZXIiKTsKIAkJaWYgKHJjKSB7CkBAIC0yNDcsMTMgKzI4NCwxMSBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICpwbGF0OworCXN0cnVjdCB0ZWdyYV9zZGhjaV9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gcGx0Zm1faG9zdC0+cHJpdjsKIAlpbnQgZGVhZCA9IChyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9JTlRfU1RBVFVTKSA9PSAweGZmZmZmZmZmKTsKIAogCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIGRlYWQpOwogCi0JcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCiAJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+d3BfZ3BpbykpIHsKIAkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPndwX2dwaW8pOwogCQlncGlvX2ZyZWUocGxhdC0+d3BfZ3Bpbyk7CkBAIC0yODIsNiArMzE3LDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktdGVncmEiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gc2RoY2lfdGVncmFfZHRfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfdGVncmFfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzZGhjaV90ZWdyYV9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IDBlMDJjYzEuLjZkOGVlYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTE2LDEwICsxNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKQEAgLTQxLDYgKzQzLDcgQEAKICNkZWZpbmUgTUFYX1RVTklOR19MT09QIDQwCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWdfcXVpcmtzID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWdfcXVpcmtzMjsKIAogc3RhdGljIHZvaWQgc2RoY2lfZmluaXNoX2RhdGEoc3RydWN0IHNkaGNpX2hvc3QgKik7CiAKQEAgLTQ5LDUzICs1Miw2NyBAQAogc3RhdGljIGludCBzZGhjaV9leGVjdXRlX3R1bmluZyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYyk7CiBzdGF0aWMgdm9pZCBzZGhjaV90dW5pbmdfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHNkaGNpX3J1bnRpbWVfcG1fZ2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgc2RoY2lfcnVudGltZV9wbV9wdXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNkaGNpX3J1bnRpbWVfcG1fZ2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgc2RoY2lfcnVudGltZV9wbV9wdXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgc2RoY2lfZHVtcHJlZ3Moc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogPT09PT09PT09PT0gUkVHSVNURVIgRFVNUCAoJXMpPT09PT09PT09PT1cbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogPT09PT09PT09PT0gUkVHSVNURVIgRFVNUCAoJXMpPT09PT09PT09PT1cbiIsCiAJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IFN5cyBhZGRyOiAweCUwOHggfCBWZXJzaW9uOiAgMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IFN5cyBhZGRyOiAweCUwOHggfCBWZXJzaW9uOiAgMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9ETUFfQUREUkVTUyksCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0hPU1RfVkVSU0lPTikpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEJsayBzaXplOiAweCUwOHggfCBCbGsgY250OiAgMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEJsayBzaXplOiAweCUwOHggfCBCbGsgY250OiAgMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9CTE9DS19TSVpFKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQkxPQ0tfQ09VTlQpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBBcmd1bWVudDogMHglMDh4IHwgVHJuIG1vZGU6IDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBBcmd1bWVudDogMHglMDh4IHwgVHJuIG1vZGU6IDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQVJHVU1FTlQpLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9UUkFOU0ZFUl9NT0RFKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogUHJlc2VudDogIDB4JTA4eCB8IEhvc3QgY3RsOiAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogUHJlc2VudDogIDB4JTA4eCB8IEhvc3QgY3RsOiAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpLAogCQlzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBQb3dlcjogICAgMHglMDh4IHwgQmxrIGdhcDogIDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBQb3dlcjogICAgMHglMDh4IHwgQmxrIGdhcDogIDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lfUE9XRVJfQ09OVFJPTCksCiAJCXNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0JMT0NLX0dBUF9DT05UUk9MKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogV2FrZS11cDogIDB4JTA4eCB8IENsb2NrOiAgICAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogV2FrZS11cDogIDB4JTA4eCB8IENsb2NrOiAgICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRiKGhvc3QsIFNESENJX1dBS0VfVVBfQ09OVFJPTCksCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NMT0NLX0NPTlRST0wpKTsKLQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiBUaW1lb3V0OiAgMHglMDh4IHwgSW50IHN0YXQ6IDB4JTA4eFxuIiwKKwlwcl9kZWJ1ZyhEUklWRVJfTkFNRSAiOiBUaW1lb3V0OiAgMHglMDh4IHwgSW50IHN0YXQ6IDB4JTA4eFxuIiwKIAkJc2RoY2lfcmVhZGIoaG9zdCwgU0RIQ0lfVElNRU9VVF9DT05UUk9MKSwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfSU5UX1NUQVRVUykpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEludCBlbmFiOiAweCUwOHggfCBTaWcgZW5hYjogMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEludCBlbmFiOiAweCUwOHggfCBTaWcgZW5hYjogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9JTlRfRU5BQkxFKSwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfU0lHTkFMX0VOQUJMRSkpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEFDMTIgZXJyOiAweCUwOHggfCBTbG90IGludDogMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEFDMTIgZXJyOiAweCUwOHggfCBTbG90IGludDogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9BQ01EMTJfRVJSKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfU0xPVF9JTlRfU1RBVFVTKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IENhcHNfMTogICAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IENhcHNfMTogICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFUyksCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFU18xKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ21kOiAgICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCisJcHJfZGVidWcoRFJJVkVSX05BTUUgIjogQ21kOiAgICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NPTU1BTkQpLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9NQVhfQ1VSUkVOVCkpOwotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEhvc3QgY3RsMjogMHglMDh4XG4iLAorCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEhvc3QgY3RsMjogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9IT1NUX0NPTlRST0wyKSk7CiAKIAlpZiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfQURNQSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQURNQSBFcnI6IDB4JTA4eCB8IEFETUEgUHRyOiAweCUwOHhcbiIsCisJCXByX2RlYnVnKERSSVZFUl9OQU1FICI6IEFETUEgRXJyOiAweCUwOHggfCBBRE1BIFB0cjogMHglMDh4XG4iLAogCQkgICAgICAgcmVhZGwoaG9zdC0+aW9hZGRyICsgU0RIQ0lfQURNQV9FUlJPUiksCiAJCSAgICAgICByZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9BRE1BX0FERFJFU1MpKTsKIAotCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXByX2RlYnVnKERSSVZFUl9OQU1FICI6ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCkBAIC0xMzIsNiArMTQ5LDkgQEAKIAlpZiAoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OKQogCQlyZXR1cm47CiAKKwlpZiAoaG9zdC0+cXVpcmtzMiAmIFNESENJX1FVSVJLMl9PV05fQ0FSRF9ERVRFQ1RJT04pCisJCXJldHVybjsKKwogCXByZXNlbnQgPSBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9QUkVTRU5UX1NUQVRFKSAmCiAJCQkgICAgICBTREhDSV9DQVJEX1BSRVNFTlQ7CiAJaXJxcyA9IHByZXNlbnQgPyBTREhDSV9JTlRfQ0FSRF9SRU1PVkUgOiBTREhDSV9JTlRfQ0FSRF9JTlNFUlQ7CkBAIC0xODAsNyArMjAwLDcgQEAKIAkvKiBodyBjbGVhcnMgdGhlIGJpdCB3aGVuIGl0J3MgZG9uZSAqLwogCXdoaWxlIChzZGhjaV9yZWFkYihob3N0LCBTREhDSV9TT0ZUV0FSRV9SRVNFVCkgJiBtYXNrKSB7CiAJCWlmICh0aW1lb3V0ID09IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0IDB4JXggbmV2ZXIgY29tcGxldGVkLlxuIiwKKwkJCXByX2VycigiJXM6IFJlc2V0IDB4JXggbmV2ZXIgY29tcGxldGVkLlxuIiwKIAkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgKGludCltYXNrKTsKIAkJCXNkaGNpX2R1bXByZWdzKGhvc3QpOwogCQkJcmV0dXJuOwpAQCAtMjUxLDExICsyNzEsMTQgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKKwlpZiAoaG9zdC0+cnVudGltZV9zdXNwZW5kZWQpCisJCWdvdG8gb3V0OworCiAJaWYgKGJyaWdodG5lc3MgPT0gTEVEX09GRikKIAkJc2RoY2lfZGVhY3RpdmF0ZV9sZWQoaG9zdCk7CiAJZWxzZQogCQlzZGhjaV9hY3RpdmF0ZV9sZWQoaG9zdCk7Ci0KK291dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAjZW5kaWYKQEAgLTY1NCw3ICs2NzcsNyBAQAogCX0KIAogCWlmIChjb3VudCA+PSAweEYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBsYXJnZSB0aW1lb3V0IHJlcXVlc3RlZCBmb3IgQ01EJWQhXG4iLAorCQlwcl93YXJuaW5nKCIlczogVG9vIGxhcmdlIHRpbWVvdXQgcmVxdWVzdGVkIGZvciBDTUQlZCFcbiIsCiAJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgY21kLT5vcGNvZGUpOwogCQljb3VudCA9IDB4RTsKIAl9CkBAIC05NDksNyArOTcyLDcgQEAKIAogCXdoaWxlIChzZGhjaV9yZWFkbChob3N0LCBTREhDSV9QUkVTRU5UX1NUQVRFKSAmIG1hc2spIHsKIAkJaWYgKHRpbWVvdXQgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29udHJvbGxlciBuZXZlciByZWxlYXNlZCAiCisJCQlwcl9lcnIoIiVzOiBDb250cm9sbGVyIG5ldmVyIHJlbGVhc2VkICIKIAkJCQkiaW5oaWJpdCBiaXQocykuXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKIAkJCWNtZC0+ZXJyb3IgPSAtRUlPOwpAQCAtOTcxLDcgKzk5NCw3IEBACiAJc2RoY2lfc2V0X3RyYW5zZmVyX21vZGUoaG9zdCwgY21kKTsKIAogCWlmICgoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KSAmJiAoY21kLT5mbGFncyAmIE1NQ19SU1BfQlVTWSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5zdXBwb3J0ZWQgcmVzcG9uc2UgdHlwZSFcbiIsCisJCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHJlc3BvbnNlIHR5cGUhXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQljbWQtPmVycm9yID0gLUVJTlZBTDsKIAkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQpOwpAQCAtMTEyMSw3ICsxMTQ0LDcgQEAKIAl3aGlsZSAoISgoY2xrID0gc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQ0xPQ0tfQ09OVFJPTCkpCiAJCSYgU0RIQ0lfQ0xPQ0tfSU5UX1NUQUJMRSkpIHsKIAkJaWYgKHRpbWVvdXQgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgY2xvY2sgbmV2ZXIgIgorCQkJcHJfZXJyKCIlczogSW50ZXJuYWwgY2xvY2sgbmV2ZXIgIgogCQkJCSJzdGFiaWxpc2VkLlxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQkJc2RoY2lfZHVtcHJlZ3MoaG9zdCk7CiAJCQlyZXR1cm47CkBAIC0xMjA5LDYgKzEyMzIsOCBAQAogCiAJaG9zdCA9IG1tY19wcml2KG1tYyk7CiAKKwlzZGhjaV9ydW50aW1lX3BtX2dldChob3N0KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKIAlXQVJOX09OKGhvc3QtPm1ycSAhPSBOVUxMKTsKQEAgLTEyNjksMTQgKzEyOTQsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNkaGNpX3NldF9pb3Moc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfaW9zICppb3MpCitzdGF0aWMgdm9pZCBzZGhjaV9kb19zZXRfaW9zKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggY3RybDsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChob3N0LT5mbGFncyAmIFNESENJX0RFVklDRV9ERUFEKQpAQCAtMTQyNiw3ICsxNDQ4LDE2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3JvKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQorc3RhdGljIHZvaWQgc2RoY2lfc2V0X2lvcyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlzZGhjaV9ydW50aW1lX3BtX2dldChob3N0KTsKKwlzZGhjaV9kb19zZXRfaW9zKGhvc3QsIGlvcyk7CisJc2RoY2lfcnVudGltZV9wbV9wdXQoaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgc2RoY2lfY2hlY2tfcm8oc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaXNfcmVhZG9ubHk7CkBAIC0xNDUwLDE5ICsxNDgxLDE2IEBACiAKICNkZWZpbmUgU0FNUExFX0NPVU5UCTUKIAotc3RhdGljIGludCBzZGhjaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCitzdGF0aWMgaW50IHNkaGNpX2RvX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlpbnQgaSwgcm9fY291bnQ7CiAKLQlob3N0ID0gbW1jX3ByaXYobW1jKTsKLQogCWlmICghKGhvc3QtPnF1aXJrcyAmIFNESENJX1FVSVJLX1VOU1RBQkxFX1JPX0RFVEVDVCkpCi0JCXJldHVybiBjaGVja19ybyhob3N0KTsKKwkJcmV0dXJuIHNkaGNpX2NoZWNrX3JvKGhvc3QpOwogCiAJcm9fY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBTQU1QTEVfQ09VTlQ7IGkrKykgewotCQlpZiAoY2hlY2tfcm8oaG9zdCkpIHsKKwkJaWYgKHNkaGNpX2NoZWNrX3JvKGhvc3QpKSB7CiAJCQlpZiAoKytyb19jb3VudCA+IFNBTVBMRV9DT1VOVCAvIDIpCiAJCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTE0NzEsMzggKzE0OTksNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2RoY2lfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW5hYmxlKQorc3RhdGljIHZvaWQgc2RoY2lfaHdfcmVzZXQoc3RydWN0IG1tY19ob3N0ICptbWMpCiB7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAKLQlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlpZiAoaG9zdC0+b3BzICYmIGhvc3QtPm9wcy0+aHdfcmVzZXQpCisJCWhvc3QtPm9wcy0+aHdfcmVzZXQoaG9zdCk7Cit9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworc3RhdGljIGludCBzZGhjaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCWludCByZXQ7CiAKKwlzZGhjaV9ydW50aW1lX3BtX2dldChob3N0KTsKKwlyZXQgPSBzZGhjaV9kb19nZXRfcm8oaG9zdCk7CisJc2RoY2lfcnVudGltZV9wbV9wdXQoaG9zdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2RoY2lfZW5hYmxlX3NkaW9faXJxX25vbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IGVuYWJsZSkKK3sKIAlpZiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9ERVZJQ0VfREVBRCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoZW5hYmxlKQorCQlob3N0LT5mbGFncyB8PSBTREhDSV9TRElPX0lSUV9FTkFCTEVEOworCWVsc2UKKwkJaG9zdC0+ZmxhZ3MgJj0gflNESENJX1NESU9fSVJRX0VOQUJMRUQ7CisKKwkvKiBTRElPIElSUSB3aWxsIGJlIGVuYWJsZWQgYXMgYXBwcm9wcmlhdGUgaW4gcnVudGltZSByZXN1bWUgKi8KKwlpZiAoaG9zdC0+cnVudGltZV9zdXNwZW5kZWQpCisJCWdvdG8gb3V0OworCisJaWYgKGVuYWJsZSkKIAkJc2RoY2lfdW5tYXNrX2lycXMoaG9zdCwgU0RIQ0lfSU5UX0NBUkRfSU5UKTsKIAllbHNlCiAJCXNkaGNpX21hc2tfaXJxcyhob3N0LCBTREhDSV9JTlRfQ0FSRF9JTlQpOwogb3V0OgogCW1taW93YigpOworfQogCitzdGF0aWMgdm9pZCBzZGhjaV9lbmFibGVfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICptbWMsIGludCBlbmFibGUpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCXNkaGNpX2VuYWJsZV9zZGlvX2lycV9ub2xvY2soaG9zdCwgZW5hYmxlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc2RoY2lfc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKHN0cnVjdCBtbWNfaG9zdCAqbW1jLAotCXN0cnVjdCBtbWNfaW9zICppb3MpCitzdGF0aWMgaW50IHNkaGNpX2RvX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKKwkJCQkJCXN0cnVjdCBtbWNfaW9zICppb3MpCiB7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJdTggcHdyOwogCXUxNiBjbGssIGN0cmw7CiAJdTMyIHByZXNlbnRfc3RhdGU7CiAKLQlob3N0ID0gbW1jX3ByaXYobW1jKTsKLQogCS8qCiAJICogU2lnbmFsIFZvbHRhZ2UgU3dpdGNoaW5nIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgSG9zdCBDb250cm9sbGVycwogCSAqIHYzLjAwIGFuZCBhYm92ZS4KQEAgLTE1MjgsNyArMTU4Miw3IEBACiAJCWlmICghKGN0cmwgJiBTREhDSV9DVFJMX1ZERF8xODApKQogCQkJcmV0dXJuIDA7CiAJCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBTd2l0Y2hpbmcgdG8gMy4zViAiCisJCQlwcl9pbmZvKERSSVZFUl9OQU1FICI6IFN3aXRjaGluZyB0byAzLjNWICIKIAkJCQkic2lnbmFsbGluZyB2b2x0YWdlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtMTU4Nyw3ICsxNjQxLDcgQEAKIAkJcHdyIHw9IFNESENJX1BPV0VSX09OOwogCQlzZGhjaV93cml0ZWIoaG9zdCwgcHdyLCBTREhDSV9QT1dFUl9DT05UUk9MKTsKIAotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFN3aXRjaGluZyB0byAxLjhWIHNpZ25hbGxpbmcgIgorCQlwcl9pbmZvKERSSVZFUl9OQU1FICI6IFN3aXRjaGluZyB0byAxLjhWIHNpZ25hbGxpbmcgIgogCQkJInZvbHRhZ2UgZmFpbGVkLCByZXRyeWluZyB3aXRoIFMxOFIgc2V0IHRvIDBcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9IGVsc2UKQEAgLTE1OTUsNiArMTY0OSwyMCBAQAogCQlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZGhjaV9zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2goc3RydWN0IG1tY19ob3N0ICptbWMsCisJc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisJaW50IGVycjsKKworCWlmIChob3N0LT52ZXJzaW9uIDwgU0RIQ0lfU1BFQ18zMDApCisJCXJldHVybiAwOworCXNkaGNpX3J1bnRpbWVfcG1fZ2V0KGhvc3QpOworCWVyciA9IHNkaGNpX2RvX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaChob3N0LCBpb3MpOworCXNkaGNpX3J1bnRpbWVfcG1fcHV0KGhvc3QpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgc2RoY2lfZXhlY3V0ZV90dW5pbmcoc3RydWN0IG1tY19ob3N0ICptbWMpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CkBAIC0xNjA2LDYgKzE2NzQsNyBAQAogCiAJaG9zdCA9IG1tY19wcml2KG1tYyk7CiAKKwlzZGhjaV9ydW50aW1lX3BtX2dldChob3N0KTsKIAlkaXNhYmxlX2lycShob3N0LT5pcnEpOwogCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CiAKQEAgLTE2MjMsNiArMTY5Miw3IEBACiAJZWxzZSB7CiAJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIAkJZW5hYmxlX2lycShob3N0LT5pcnEpOworCQlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNjQ4LDcgKzE3MTgsNyBAQAogCXRpbWVvdXQgPSAxNTA7CiAJZG8gewogCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwotCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0gezB9OworCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxID0ge05VTEx9OwogCiAJCWlmICghdHVuaW5nX2xvb3BfY291bnRlciAmJiAhdGltZW91dCkKIAkJCWJyZWFrOwpAQCAtMTY5NCw3ICsxNzY0LDcgQEAKIAkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKIAogCQlpZiAoIWhvc3QtPnR1bmluZ19kb25lKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFRpbWVvdXQgd2FpdGluZyBmb3IgIgorCQkJcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBUaW1lb3V0IHdhaXRpbmcgZm9yICIKIAkJCQkiQnVmZmVyIFJlYWQgUmVhZHkgaW50ZXJydXB0IGR1cmluZyB0dW5pbmcgIgogCQkJCSJwcm9jZWR1cmUsIGZhbGxpbmcgYmFjayB0byBmaXhlZCBzYW1wbGluZyAiCiAJCQkJImNsb2NrXG4iKTsKQEAgLTE3MjQsNyArMTc5NCw3IEBACiAJCXNkaGNpX3dyaXRldyhob3N0LCBjdHJsLCBTREhDSV9IT1NUX0NPTlRST0wyKTsKIAl9IGVsc2UgewogCQlpZiAoIShjdHJsICYgU0RIQ0lfQ1RSTF9UVU5FRF9DTEspKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFR1bmluZyBwcm9jZWR1cmUiCisJCQlwcl9pbmZvKERSSVZFUl9OQU1FICI6IFR1bmluZyBwcm9jZWR1cmUiCiAJCQkJIiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBmaXhlZCBzYW1wbGluZyIKIAkJCQkiIGNsb2NrXG4iKTsKIAkJCWVyciA9IC1FSU87CkBAIC0xNzY2LDE4ICsxODM2LDE2IEBACiAJc2RoY2lfY2xlYXJfc2V0X2lycXMoaG9zdCwgU0RIQ0lfSU5UX0RBVEFfQVZBSUwsIGllcik7CiAJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCWVuYWJsZV9pcnEoaG9zdC0+aXJxKTsKKwlzZGhjaV9ydW50aW1lX3BtX3B1dChob3N0KTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHNkaGNpX2VuYWJsZV9wcmVzZXRfdmFsdWUoc3RydWN0IG1tY19ob3N0ICptbWMsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgc2RoY2lfZG9fZW5hYmxlX3ByZXNldF92YWx1ZShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJdTE2IGN0cmw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWhvc3QgPSBtbWNfcHJpdihtbWMpOwotCiAJLyogSG9zdCBDb250cm9sbGVyIHYzLjAwIGRlZmluZXMgcHJlc2V0IHZhbHVlIHJlZ2lzdGVycyAqLwogCWlmIChob3N0LT52ZXJzaW9uIDwgU0RIQ0lfU1BFQ18zMDApCiAJCXJldHVybjsKQEAgLTE3OTMsMTggKzE4NjEsMzAgQEAKIAlpZiAoZW5hYmxlICYmICEoY3RybCAmIFNESENJX0NUUkxfUFJFU0VUX1ZBTF9FTkFCTEUpKSB7CiAJCWN0cmwgfD0gU0RIQ0lfQ1RSTF9QUkVTRVRfVkFMX0VOQUJMRTsKIAkJc2RoY2lfd3JpdGV3KGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTDIpOworCQlob3N0LT5mbGFncyB8PSBTREhDSV9QVl9FTkFCTEVEOwogCX0gZWxzZSBpZiAoIWVuYWJsZSAmJiAoY3RybCAmIFNESENJX0NUUkxfUFJFU0VUX1ZBTF9FTkFCTEUpKSB7CiAJCWN0cmwgJj0gflNESENJX0NUUkxfUFJFU0VUX1ZBTF9FTkFCTEU7CiAJCXNkaGNpX3dyaXRldyhob3N0LCBjdHJsLCBTREhDSV9IT1NUX0NPTlRST0wyKTsKKwkJaG9zdC0+ZmxhZ3MgJj0gflNESENJX1BWX0VOQUJMRUQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBzZGhjaV9lbmFibGVfcHJlc2V0X3ZhbHVlKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlzZGhjaV9ydW50aW1lX3BtX2dldChob3N0KTsKKwlzZGhjaV9kb19lbmFibGVfcHJlc2V0X3ZhbHVlKGhvc3QsIGVuYWJsZSk7CisJc2RoY2lfcnVudGltZV9wbV9wdXQoaG9zdCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHNkaGNpX29wcyA9IHsKIAkucmVxdWVzdAk9IHNkaGNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBzZGhjaV9zZXRfaW9zLAogCS5nZXRfcm8JCT0gc2RoY2lfZ2V0X3JvLAorCS5od19yZXNldAk9IHNkaGNpX2h3X3Jlc2V0LAogCS5lbmFibGVfc2Rpb19pcnEgPSBzZGhjaV9lbmFibGVfc2Rpb19pcnEsCiAJLnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaAk9IHNkaGNpX3N0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaCwKIAkuZXhlY3V0ZV90dW5pbmcJCQk9IHNkaGNpX2V4ZWN1dGVfdHVuaW5nLApAQCAtMTgyNiwxOSArMTkwNiwxOSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAotCWlmICghKHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX1BSRVNFTlRfU1RBVEUpICYgU0RIQ0lfQ0FSRF9QUkVTRU5UKSkgewotCQlpZiAoaG9zdC0+bXJxKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJkIHJlbW92ZWQgZHVyaW5nIHRyYW5zZmVyIVxuIiwKLQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXNldHRpbmcgY29udHJvbGxlci5cbiIsCi0JCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOworCS8qIENoZWNrIGhvc3QtPm1ycSBmaXJzdCBpbiBjYXNlIHdlIGFyZSBydW50aW1lIHN1c3BlbmRlZCAqLworCWlmIChob3N0LT5tcnEgJiYKKwkgICAgIShzZGhjaV9yZWFkbChob3N0LCBTREhDSV9QUkVTRU5UX1NUQVRFKSAmIFNESENJX0NBUkRfUFJFU0VOVCkpIHsKKwkJcHJfZXJyKCIlczogQ2FyZCByZW1vdmVkIGR1cmluZyB0cmFuc2ZlciFcbiIsCisJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJCXByX2VycigiJXM6IFJlc2V0dGluZyBjb250cm9sbGVyLlxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAotCQkJc2RoY2lfcmVzZXQoaG9zdCwgU0RIQ0lfUkVTRVRfQ01EKTsKLQkJCXNkaGNpX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0RBVEEpOworCQlzZGhjaV9yZXNldChob3N0LCBTREhDSV9SRVNFVF9DTUQpOworCQlzZGhjaV9yZXNldChob3N0LCBTREhDSV9SRVNFVF9EQVRBKTsKIAotCQkJaG9zdC0+bXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmZpbmlzaF90YXNrbGV0KTsKLQkJfQorCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5maW5pc2hfdGFza2xldCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwpAQCAtMTg1NCwxNCArMTkzNCwxNiBAQAogCiAJaG9zdCA9IChzdHJ1Y3Qgc2RoY2lfaG9zdCopcGFyYW07CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoaXMgdGFza2xldCBnZXRzIHJlc2NoZWR1bGVkIHdoaWxlIHJ1bm5pbmcsIGl0IHdpbGwKICAgICAgICAgICogYmUgcnVuIGFnYWluIGFmdGVyd2FyZHMgYnV0IHdpdGhvdXQgYW55IGFjdGl2ZSByZXF1ZXN0LgogICAgICAgICAgKi8KLQlpZiAoIWhvc3QtPm1ycSkKKwlpZiAoIWhvc3QtPm1ycSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJfQogCiAJZGVsX3RpbWVyKCZob3N0LT50aW1lcik7CiAKQEAgLTE5MDUsNiArMTk4Nyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCiAJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7CisJc2RoY2lfcnVudGltZV9wbV9wdXQoaG9zdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNkaGNpX3RpbWVvdXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMTkxNyw3ICsyMDAwLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGhvc3QtPm1ycSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlICIKKwkJcHJfZXJyKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBoYXJkd2FyZSAiCiAJCQkiaW50ZXJydXB0LlxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKIApAQCAtMTk2Myw3ICsyMDQ2LDcgQEAKIAlCVUdfT04oaW50bWFzayA9PSAwKTsKIAogCWlmICghaG9zdC0+Y21kKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEdvdCBjb21tYW5kIGludGVycnVwdCAweCUwOHggZXZlbiAiCisJCXByX2VycigiJXM6IEdvdCBjb21tYW5kIGludGVycnVwdCAweCUwOHggZXZlbiAiCiAJCQkidGhvdWdoIG5vIGNvbW1hbmQgb3BlcmF0aW9uIHdhcyBpbiBwcm9ncmVzcy5cbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgKHVuc2lnbmVkKWludG1hc2spOwogCQlzZGhjaV9kdW1wcmVncyhob3N0KTsKQEAgLTIwNjMsNyArMjE0Niw3IEBACiAJCQl9CiAJCX0KIAotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHb3QgZGF0YSBpbnRlcnJ1cHQgMHglMDh4IGV2ZW4gIgorCQlwcl9lcnIoIiVzOiBHb3QgZGF0YSBpbnRlcnJ1cHQgMHglMDh4IGV2ZW4gIgogCQkJInRob3VnaCBubyBkYXRhIG9wZXJhdGlvbiB3YXMgaW4gcHJvZ3Jlc3MuXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksICh1bnNpZ25lZClpbnRtYXNrKTsKIAkJc2RoY2lfZHVtcHJlZ3MoaG9zdCk7CkBAIC0yMDgwLDcgKzIxNjMsNyBAQAogCQkJIT0gTU1DX0JVU19URVNUX1IpCiAJCWhvc3QtPmRhdGEtPmVycm9yID0gLUVJTFNFUTsKIAllbHNlIGlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX0FETUFfRVJST1IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQURNQSBlcnJvclxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOworCQlwcl9lcnIoIiVzOiBBRE1BIGVycm9yXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCXNkaGNpX3Nob3dfYWRtYV9lcnJvcihob3N0KTsKIAkJaG9zdC0+ZGF0YS0+ZXJyb3IgPSAtRUlPOwogCX0KQEAgLTIxMzYsMTIgKzIyMTksMTkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzZGhjaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCWlycXJldHVybl90IHJlc3VsdDsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCogaG9zdCA9IGRldl9pZDsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9pZDsKIAl1MzIgaW50bWFzazsKIAlpbnQgY2FyZGludCA9IDA7CiAKIAlzcGluX2xvY2soJmhvc3QtPmxvY2spOwogCisJaWYgKGhvc3QtPnJ1bnRpbWVfc3VzcGVuZGVkKSB7CisJCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKKwkJcHJfd2FybmluZygiJXM6IGdvdCBpcnEgd2hpbGUgcnVudGltZSBzdXNwZW5kZWRcbiIsCisJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKIAlpbnRtYXNrID0gc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfSU5UX1NUQVRVUyk7CiAKIAlpZiAoIWludG1hc2sgfHwgaW50bWFzayA9PSAweGZmZmZmZmZmKSB7CkBAIC0yMTk0LDcgKzIyODQsNyBAQAogCWludG1hc2sgJj0gflNESENJX0lOVF9FUlJPUjsKIAogCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX0JVU19QT1dFUikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJkIGlzIGNvbnN1bWluZyB0b28gbXVjaCBwb3dlciFcbiIsCisJCXByX2VycigiJXM6IENhcmQgaXMgY29uc3VtaW5nIHRvbyBtdWNoIHBvd2VyIVxuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAkJc2RoY2lfd3JpdGVsKGhvc3QsIFNESENJX0lOVF9CVVNfUE9XRVIsIFNESENJX0lOVF9TVEFUVVMpOwogCX0KQEAgLTIyMDcsNyArMjI5Nyw3IEBACiAJaW50bWFzayAmPSB+U0RIQ0lfSU5UX0NBUkRfSU5UOwogCiAJaWYgKGludG1hc2spIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5leHBlY3RlZCBpbnRlcnJ1cHQgMHglMDh4LlxuIiwKKwkJcHJfZXJyKCIlczogVW5leHBlY3RlZCBpbnRlcnJ1cHQgMHglMDh4LlxuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBpbnRtYXNrKTsKIAkJc2RoY2lfZHVtcHJlZ3MoaG9zdCk7CiAKQEAgLTIyNzUsNyArMjM2NSw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCiAJaWYgKGhvc3QtPmZsYWdzICYgKFNESENJX1VTRV9TRE1BIHwgU0RIQ0lfVVNFX0FETUEpKSB7CiAJCWlmIChob3N0LT5vcHMtPmVuYWJsZV9kbWEpCiAJCQlob3N0LT5vcHMtPmVuYWJsZV9kbWEoaG9zdCk7CkBAIC0yMzE0LDYgKzI0MDMsOTAgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKworc3RhdGljIGludCBzZGhjaV9ydW50aW1lX3BtX2dldChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gcG1fcnVudGltZV9nZXRfc3luYyhob3N0LT5tbWMtPnBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgc2RoY2lfcnVudGltZV9wbV9wdXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShob3N0LT5tbWMtPnBhcmVudCk7CisJcmV0dXJuIHBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPm1tYy0+cGFyZW50KTsKK30KKworaW50IHNkaGNpX3J1bnRpbWVfc3VzcGVuZF9ob3N0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIHR1bmluZyBzaW5jZSB3ZSBhcmUgc3VzcGVuZGluZyAqLworCWlmIChob3N0LT52ZXJzaW9uID49IFNESENJX1NQRUNfMzAwICYmCisJICAgIGhvc3QtPnR1bmluZ19tb2RlID09IFNESENJX1RVTklOR19NT0RFXzEpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmhvc3QtPnR1bmluZ190aW1lcik7CisJCWhvc3QtPmZsYWdzICY9IH5TREhDSV9ORUVEU19SRVRVTklORzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCXNkaGNpX21hc2tfaXJxcyhob3N0LCBTREhDSV9JTlRfQUxMX01BU0spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCXN5bmNocm9uaXplX2lycShob3N0LT5pcnEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlob3N0LT5ydW50aW1lX3N1c3BlbmRlZCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNkaGNpX3J1bnRpbWVfc3VzcGVuZF9ob3N0KTsKKworaW50IHNkaGNpX3J1bnRpbWVfcmVzdW1lX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMCwgaG9zdF9mbGFncyA9IGhvc3QtPmZsYWdzOworCisJaWYgKGhvc3RfZmxhZ3MgJiAoU0RIQ0lfVVNFX1NETUEgfCBTREhDSV9VU0VfQURNQSkpIHsKKwkJaWYgKGhvc3QtPm9wcy0+ZW5hYmxlX2RtYSkKKwkJCWhvc3QtPm9wcy0+ZW5hYmxlX2RtYShob3N0KTsKKwl9CisKKwlzZGhjaV9pbml0KGhvc3QsIDApOworCisJLyogRm9yY2UgY2xvY2sgYW5kIHBvd2VyIHJlLXByb2dyYW0gKi8KKwlob3N0LT5wd3IgPSAwOworCWhvc3QtPmNsb2NrID0gMDsKKwlzZGhjaV9kb19zZXRfaW9zKGhvc3QsICZob3N0LT5tbWMtPmlvcyk7CisKKwlzZGhjaV9kb19zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2goaG9zdCwgJmhvc3QtPm1tYy0+aW9zKTsKKwlpZiAoaG9zdF9mbGFncyAmIFNESENJX1BWX0VOQUJMRUQpCisJCXNkaGNpX2RvX2VuYWJsZV9wcmVzZXRfdmFsdWUoaG9zdCwgdHJ1ZSk7CisKKwkvKiBTZXQgdGhlIHJlLXR1bmluZyBleHBpcmF0aW9uIGZsYWcgKi8KKwlpZiAoKGhvc3QtPnZlcnNpb24gPj0gU0RIQ0lfU1BFQ18zMDApICYmIGhvc3QtPnR1bmluZ19jb3VudCAmJgorCSAgICAoaG9zdC0+dHVuaW5nX21vZGUgPT0gU0RIQ0lfVFVOSU5HX01PREVfMSkpCisJCWhvc3QtPmZsYWdzIHw9IFNESENJX05FRURTX1JFVFVOSU5HOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCWhvc3QtPnJ1bnRpbWVfc3VzcGVuZGVkID0gZmFsc2U7CisKKwkvKiBFbmFibGUgU0RJTyBJUlEgKi8KKwlpZiAoKGhvc3QtPmZsYWdzICYgU0RIQ0lfU0RJT19JUlFfRU5BQkxFRCkpCisJCXNkaGNpX2VuYWJsZV9zZGlvX2lycV9ub2xvY2soaG9zdCwgdHJ1ZSk7CisKKwkvKiBFbmFibGUgQ2FyZCBEZXRlY3Rpb24gKi8KKwlzZGhjaV9lbmFibGVfY2FyZF9kZXRlY3Rpb24oaG9zdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2RoY2lfcnVudGltZV9yZXN1bWVfaG9zdCk7CisKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqIERldmljZSBhbGxvY2F0aW9uL3JlZ2lzdHJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMjM1Niw2ICsyNTI5LDggQEAKIAogCWlmIChkZWJ1Z19xdWlya3MpCiAJCWhvc3QtPnF1aXJrcyA9IGRlYnVnX3F1aXJrczsKKwlpZiAoZGVidWdfcXVpcmtzMikKKwkJaG9zdC0+cXVpcmtzMiA9IGRlYnVnX3F1aXJrczI7CiAKIAlzZGhjaV9yZXNldChob3N0LCBTREhDSV9SRVNFVF9BTEwpOwogCkBAIC0yMzYzLDcgKzI1MzgsNyBAQAogCWhvc3QtPnZlcnNpb24gPSAoaG9zdC0+dmVyc2lvbiAmIFNESENJX1NQRUNfVkVSX01BU0spCiAJCQkJPj4gU0RIQ0lfU1BFQ19WRVJfU0hJRlQ7CiAJaWYgKGhvc3QtPnZlcnNpb24gPiBTREhDSV9TUEVDXzMwMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmtub3duIGNvbnRyb2xsZXIgdmVyc2lvbiAoJWQpLiAiCisJCXByX2VycigiJXM6IFVua25vd24gY29udHJvbGxlciB2ZXJzaW9uICglZCkuICIKIAkJCSJZb3UgbWF5IGV4cGVyaWVuY2UgcHJvYmxlbXMuXG4iLCBtbWNfaG9zdG5hbWUobW1jKSwKIAkJCWhvc3QtPnZlcnNpb24pOwogCX0KQEAgLTI0MDAsNyArMjU3NSw3IEBACiAJaWYgKGhvc3QtPmZsYWdzICYgKFNESENJX1VTRV9TRE1BIHwgU0RIQ0lfVVNFX0FETUEpKSB7CiAJCWlmIChob3N0LT5vcHMtPmVuYWJsZV9kbWEpIHsKIAkJCWlmIChob3N0LT5vcHMtPmVuYWJsZV9kbWEoaG9zdCkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gc3VpdGFibGUgRE1BICIKKwkJCQlwcl93YXJuaW5nKCIlczogTm8gc3VpdGFibGUgRE1BICIKIAkJCQkJImF2YWlsYWJsZS4gRmFsbGluZyBiYWNrIHRvIFBJTy5cbiIsCiAJCQkJCW1tY19ob3N0bmFtZShtbWMpKTsKIAkJCQlob3N0LT5mbGFncyAmPQpAQCAtMjQyMCw3ICsyNTk1LDcgQEAKIAkJaWYgKCFob3N0LT5hZG1hX2Rlc2MgfHwgIWhvc3QtPmFsaWduX2J1ZmZlcikgewogCQkJa2ZyZWUoaG9zdC0+YWRtYV9kZXNjKTsKIAkJCWtmcmVlKGhvc3QtPmFsaWduX2J1ZmZlcik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIEFETUEgIgorCQkJcHJfd2FybmluZygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBBRE1BICIKIAkJCQkiYnVmZmVycy4gRmFsbGluZyBiYWNrIHRvIHN0YW5kYXJkIERNQS5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKG1tYykpOwogCQkJaG9zdC0+ZmxhZ3MgJj0gflNESENJX1VTRV9BRE1BOwpAQCAtMjQ0OCw4ICsyNjIzLDcgQEAKIAlpZiAoaG9zdC0+bWF4X2NsayA9PSAwIHx8IGhvc3QtPnF1aXJrcyAmCiAJCQlTREhDSV9RVUlSS19DQVBfQ0xPQ0tfQkFTRV9CUk9LRU4pIHsKIAkJaWYgKCFob3N0LT5vcHMtPmdldF9tYXhfY2xvY2spIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IGJhc2UgY2xvY2sgIgorCQkJcHJfZXJyKCIlczogSGFyZHdhcmUgZG9lc24ndCBzcGVjaWZ5IGJhc2UgY2xvY2sgIgogCQkJICAgICAgICJmcmVxdWVuY3kuXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMjQ5NSw4ICsyNjY5LDcgQEAKIAkJCWhvc3QtPnRpbWVvdXRfY2xrID0gaG9zdC0+b3BzLT5nZXRfdGltZW91dF9jbG9jayhob3N0KTsKIAkJfSBlbHNlIGlmICghKGhvc3QtPnF1aXJrcyAmCiAJCQkJU0RIQ0lfUVVJUktfREFUQV9USU1FT1VUX1VTRVNfU0RDTEspKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IEhhcmR3YXJlIGRvZXNuJ3Qgc3BlY2lmeSB0aW1lb3V0IGNsb2NrICIKKwkJCXByX2VycigiJXM6IEhhcmR3YXJlIGRvZXNuJ3Qgc3BlY2lmeSB0aW1lb3V0IGNsb2NrICIKIAkJCSAgICAgICAiZnJlcXVlbmN5LlxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTI1NjYsNiArMjczOSwxNSBAQAogCWlmIChjYXBzWzFdICYgU0RIQ0lfRFJJVkVSX1RZUEVfRCkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfRFJJVkVSX1RZUEVfRDsKIAorCS8qCisJICogSWYgUG93ZXIgT2ZmIE5vdGlmeSBjYXBhYmlsaXR5IGlzIGVuYWJsZWQgYnkgdGhlIGhvc3QsCisJICogc2V0IG5vdGlmeSB0byBzaG9ydCBwb3dlciBvZmYgbm90aWZ5IHRpbWVvdXQgdmFsdWUuCisJICovCisJaWYgKG1tYy0+Y2FwczIgJiBNTUNfQ0FQMl9QT1dFUk9GRl9OT1RJRlkpCisJCW1tYy0+cG93ZXJfbm90aWZ5X3R5cGUgPSBNTUNfSE9TVF9QV19OT1RJRllfU0hPUlQ7CisJZWxzZQorCQltbWMtPnBvd2VyX25vdGlmeV90eXBlID0gTU1DX0hPU1RfUFdfTk9USUZZX05PTkU7CisKIAkvKiBJbml0aWFsIHZhbHVlIGZvciByZS10dW5pbmcgdGltZXIgY291bnQgKi8KIAlob3N0LT50dW5pbmdfY291bnQgPSAoY2Fwc1sxXSAmIFNESENJX1JFVFVOSU5HX1RJTUVSX0NPVU5UX01BU0spID4+CiAJCQkgICAgICBTREhDSV9SRVRVTklOR19USU1FUl9DT1VOVF9TSElGVDsKQEAgLTI2NTUsNyArMjgzNyw3IEBACiAJCW1tYy0+b2NyX2F2YWlsX21tYyAmPSBob3N0LT5vY3JfYXZhaWxfbW1jOwogCiAJaWYgKG1tYy0+b2NyX2F2YWlsID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKKwkJcHJfZXJyKCIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKIAkJCSJzdXBwb3J0IHZvbHRhZ2VzLlxuIiwgbW1jX2hvc3RuYW1lKG1tYykpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yNzAzLDcgKzI4ODUsNyBAQAogCQltbWMtPm1heF9ibGtfc2l6ZSA9IChjYXBzWzBdICYgU0RIQ0lfTUFYX0JMT0NLX01BU0spID4+CiAJCQkJU0RIQ0lfTUFYX0JMT0NLX1NISUZUOwogCQlpZiAobW1jLT5tYXhfYmxrX3NpemUgPj0gMykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgbWF4aW11bSBibG9jayBzaXplLCAiCisJCQlwcl93YXJuaW5nKCIlczogSW52YWxpZCBtYXhpbXVtIGJsb2NrIHNpemUsICIKIAkJCQkiYXNzdW1pbmcgNTEyIGJ5dGVzXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJCQltbWMtPm1heF9ibGtfc2l6ZSA9IDA7CiAJCX0KQEAgLTI3NDIsNyArMjkyNCw3IEBACiAKIAlob3N0LT52bW1jID0gcmVndWxhdG9yX2dldChtbWNfZGV2KG1tYyksICJ2bW1jIik7CiAJaWYgKElTX0VSUihob3N0LT52bW1jKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gdm1tYyByZWd1bGF0b3IgZm91bmRcbiIsIG1tY19ob3N0bmFtZShtbWMpKTsKKwkJcHJfaW5mbygiJXM6IG5vIHZtbWMgcmVndWxhdG9yIGZvdW5kXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJCWhvc3QtPnZtbWMgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXJlZ3VsYXRvcl9lbmFibGUoaG9zdC0+dm1tYyk7CkBAIC0yNzcxLDcgKzI5NTMsNyBAQAogCiAJbW1jX2FkZF9ob3N0KG1tYyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogU0RIQ0kgY29udHJvbGxlciBvbiAlcyBbJXNdIHVzaW5nICVzXG4iLAorCXByX2luZm8oIiVzOiBTREhDSSBjb250cm9sbGVyIG9uICVzIFslc10gdXNpbmcgJXNcbiIsCiAJCW1tY19ob3N0bmFtZShtbWMpLCBob3N0LT5od19uYW1lLCBkZXZfbmFtZShtbWNfZGV2KG1tYykpLAogCQkoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfQURNQSkgPyAiQURNQSIgOgogCQkoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfU0RNQSkgPyAiRE1BIiA6ICJQSU8iKTsKQEAgLTI4MDQsNyArMjk4Niw3IEBACiAJCWhvc3QtPmZsYWdzIHw9IFNESENJX0RFVklDRV9ERUFEOwogCiAJCWlmIChob3N0LT5tcnEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvbnRyb2xsZXIgcmVtb3ZlZCBkdXJpbmcgIgorCQkJcHJfZXJyKCIlczogQ29udHJvbGxlciByZW1vdmVkIGR1cmluZyAiCiAJCQkJIiB0cmFuc2ZlciFcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAogCQkJaG9zdC0+bXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKQEAgLTI4NjMsOSArMzA0NSw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX2Rydl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQorCXByX2luZm8oRFJJVkVSX05BTUUKIAkJIjogU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBkcml2ZXJcbiIpOwotCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogQ29weXJpZ2h0KGMpIFBpZXJyZSBPc3NtYW5cbiIpOworCXByX2luZm8oRFJJVkVSX05BTUUgIjogQ29weXJpZ2h0KGMpIFBpZXJyZSBPc3NtYW5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODc4LDkgKzMwNjAsMTEgQEAKIG1vZHVsZV9leGl0KHNkaGNpX2Rydl9leGl0KTsKIAogbW9kdWxlX3BhcmFtKGRlYnVnX3F1aXJrcywgdWludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZGVidWdfcXVpcmtzMiwgdWludCwgMDQ0NCk7CiAKIE1PRFVMRV9BVVRIT1IoIlBpZXJyZSBPc3NtYW4gPHBpZXJyZUBvc3NtYW4uZXU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgY29yZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19xdWlya3MsICJGb3JjZSBjZXJ0YWluIHF1aXJrcy4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfcXVpcmtzMiwgIkZvcmNlIGNlcnRhaW4gb3RoZXIgcXVpcmtzLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCmluZGV4IDc0NWM0MmYuLjBhNWI2NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKQEAgLTI3Myw3ICsyNzMsNyBAQAogCXZvaWQJKCpwbGF0Zm9ybV9yZXNldF9lbnRlcikoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IG1hc2spOwogCXZvaWQJKCpwbGF0Zm9ybV9yZXNldF9leGl0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTggbWFzayk7CiAJaW50CSgqc2V0X3Voc19zaWduYWxpbmcpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgdWhzKTsKLQorCXZvaWQJKCpod19yZXNldCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogfTsKIAogI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfSU9fQUNDRVNTT1JTCkBAIC0zNzksNCArMzc5LDkgQEAKIGV4dGVybiB2b2lkIHNkaGNpX2VuYWJsZV9pcnFfd2FrZXVwcyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitleHRlcm4gaW50IHNkaGNpX3J1bnRpbWVfc3VzcGVuZF9ob3N0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKK2V4dGVybiBpbnQgc2RoY2lfcnVudGltZV9yZXN1bWVfaG9zdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fU0RIQ0lfSFdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZHJpY29oX2NzLmMgYi9kcml2ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYwppbmRleCA0OTZiN2VmLi43MDA5ZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYwpAQCAtMjYsNiArMjYsNyBAQAogKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jCmluZGV4IDU1Nzg4NmIuLjM2OTM2NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRQkic2hfbW1jaWYiCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIyMDEwLTA0LTI4IgpAQCAtMTY1LDYgKzE2Niw4IEBACiAJc3RydWN0IG1tY19ob3N0ICptbWM7CiAJc3RydWN0IG1tY19kYXRhICpkYXRhOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkOworCXN0cnVjdCBzaF9kbWFlX3NsYXZlIGRtYV9zbGF2ZV90eDsKKwlzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZSBkbWFfc2xhdmVfcng7CiAJc3RydWN0IGNsayAqaGNsazsKIAl1bnNpZ25lZCBpbnQgY2xrOwogCWludCBidXNfd2lkdGg7CkBAIC0zMjMsMjUgKzMyNiwzNSBAQAogc3RhdGljIHZvaWQgc2hfbW1jaWZfcmVxdWVzdF9kbWEoc3RydWN0IHNoX21tY2lmX2hvc3QgKmhvc3QsCiAJCQkJIHN0cnVjdCBzaF9tbWNpZl9wbGF0X2RhdGEgKnBkYXRhKQogeworCXN0cnVjdCBzaF9kbWFlX3NsYXZlICp0eCwgKnJ4OwogCWhvc3QtPmRtYV9hY3RpdmUgPSBmYWxzZTsKIAogCS8qIFdlIGNhbiBvbmx5IGVpdGhlciB1c2UgRE1BIGZvciBib3RoIFR4IGFuZCBSeCBvciBub3QgdXNlIGl0IGF0IGFsbCAqLwogCWlmIChwZGF0YS0+ZG1hKSB7CisJCWRldl93YXJuKCZob3N0LT5wZC0+ZGV2LAorCQkJICJVcGRhdGUgeW91ciBwbGF0Zm9ybSB0byB1c2UgZW1iZWRkZWQgRE1BIHNsYXZlIElEc1xuIik7CisJCXR4ID0gJnBkYXRhLT5kbWEtPmNoYW5fcHJpdl90eDsKKwkJcnggPSAmcGRhdGEtPmRtYS0+Y2hhbl9wcml2X3J4OworCX0gZWxzZSB7CisJCXR4ID0gJmhvc3QtPmRtYV9zbGF2ZV90eDsKKwkJdHgtPnNsYXZlX2lkID0gcGRhdGEtPnNsYXZlX2lkX3R4OworCQlyeCA9ICZob3N0LT5kbWFfc2xhdmVfcng7CisJCXJ4LT5zbGF2ZV9pZCA9IHBkYXRhLT5zbGF2ZV9pZF9yeDsKKwl9CisJaWYgKHR4LT5zbGF2ZV9pZCA+IDAgJiYgcngtPnNsYXZlX2lkID4gMCkgewogCQlkbWFfY2FwX21hc2tfdCBtYXNrOwogCiAJCWRtYV9jYXBfemVybyhtYXNrKTsKIAkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKIAotCQlob3N0LT5jaGFuX3R4ID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBzaF9tbWNpZl9maWx0ZXIsCi0JCQkJCQkgICAgJnBkYXRhLT5kbWEtPmNoYW5fcHJpdl90eCk7CisJCWhvc3QtPmNoYW5fdHggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHNoX21tY2lmX2ZpbHRlciwgdHgpOwogCQlkZXZfZGJnKCZob3N0LT5wZC0+ZGV2LCAiJXM6IFRYOiBnb3QgY2hhbm5lbCAlcFxuIiwgX19mdW5jX18sCiAJCQlob3N0LT5jaGFuX3R4KTsKIAogCQlpZiAoIWhvc3QtPmNoYW5fdHgpCiAJCQlyZXR1cm47CiAKLQkJaG9zdC0+Y2hhbl9yeCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgc2hfbW1jaWZfZmlsdGVyLAotCQkJCQkJICAgICZwZGF0YS0+ZG1hLT5jaGFuX3ByaXZfcngpOworCQlob3N0LT5jaGFuX3J4ID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBzaF9tbWNpZl9maWx0ZXIsIHJ4KTsKIAkJZGV2X2RiZygmaG9zdC0+cGQtPmRldiwgIiVzOiBSWDogZ290IGNoYW5uZWwgJXBcbiIsIF9fZnVuY19fLAogCQkJaG9zdC0+Y2hhbl9yeCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYwppbmRleCAwYzRhNjcyLi40MWFlNjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmg+CkBAIC05Niw3ICs5Nyw4IEBACiAJc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gKnAgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdDsKIAljaGFyIGNsa19uYW1lWzhdOwotCWludCBpLCBpcnEsIHJldDsKKwlpbnQgaXJxLCByZXQsIGkgPSAwOworCWJvb2wgbXVsdGlwbGV4ZWRfaXNyID0gdHJ1ZTsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGkpLCBHRlBfS0VSTkVMKTsKIAlpZiAocHJpdiA9PSBOVUxMKSB7CkBAIC0xNTMsMjcgKzE1NSw2MCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVwcm9iZTsKIAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJaWYgKGlycSA8IDApIHsKLQkJCWlmIChpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IGlycTsKLQkJCQlnb3RvIGVpcnE7Ci0JCQl9Ci0JCX0KLQkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19pcnEsIDAsCisJLyoKKwkgKiBBbGxvdyBvbmUgb3IgbW9yZSBzcGVjaWZpYyAobmFtZWQpIElTUnMgb3IKKwkgKiBvbmUgb3IgbW9yZSBtdWx0aXBsZXhlZCAodW4tbmFtZWQpIElTUnMuCisJICovCisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBTSF9NT0JJTEVfU0RISV9JUlFfQ0FSRF9ERVRFQ1QpOworCWlmIChpcnEgPj0gMCkgeworCQltdWx0aXBsZXhlZF9pc3IgPSBmYWxzZTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19jYXJkX2RldGVjdF9pcnEsIDAsCiAJCQkJICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaG9zdCk7Ci0JCWlmIChyZXQpIHsKLQkJCXdoaWxlIChpLS0pIHsKLQkJCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwotCQkJCWlmIChpcnEgPj0gMCkKLQkJCQkJZnJlZV9pcnEoaXJxLCBob3N0KTsKLQkJCX0KLQkJCWdvdG8gZWlycTsKLQkJfQorCQlpZiAocmV0KQorCQkJZ290byBlaXJxX2NhcmRfZGV0ZWN0OwogCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIFNIX01PQklMRV9TREhJX0lSUV9TRElPKTsKKwlpZiAoaXJxID49IDApIHsKKwkJbXVsdGlwbGV4ZWRfaXNyID0gZmFsc2U7CisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdG1pb19tbWNfc2Rpb19pcnEsIDAsCisJCQkJICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaG9zdCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVpcnFfc2RpbzsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBTSF9NT0JJTEVfU0RISV9JUlFfU0RDQVJEKTsKKwlpZiAoaXJxID49IDApIHsKKwkJbXVsdGlwbGV4ZWRfaXNyID0gZmFsc2U7CisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdG1pb19tbWNfc2RjYXJkX2lycSwgMCwKKwkJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBob3N0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZWlycV9zZGNhcmQ7CisJfSBlbHNlIGlmICghbXVsdGlwbGV4ZWRfaXNyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJQcmluY2lwYWwgU0QtY2FyZCBJUlEgaXMgbWlzc2luZyBhbW9uZyBuYW1lZCBpbnRlcnJ1cHRzXG4iKTsKKwkJcmV0ID0gaXJxOworCQlnb3RvIGVpcnFfc2RjYXJkOworCX0KKworCWlmIChtdWx0aXBsZXhlZF9pc3IpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCQlpZiAoaXJxIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdG1pb19tbWNfaXJxLCAwLAorCQkJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBob3N0KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlaXJxX211bHRpcGxleGVkOworCQl9CisKKwkJLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgSVJRIHNvdXJjZSAqLworCQlpZiAoIWkpCisJCQlnb3RvIGVpcnFfbXVsdGlwbGV4ZWQ7CisJfQorCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGJhc2UgYXQgMHglMDhseCBjbG9jayByYXRlICV1IE1IelxuIiwKIAkJIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCAodW5zaWduZWQgbG9uZykKIAkJIChwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldixJT1JFU09VUkNFX01FTSwgMCktPnN0YXJ0KSwKQEAgLTE4MSw3ICsyMTYsMjAgQEAKIAogCXJldHVybiByZXQ7CiAKLWVpcnE6CitlaXJxX211bHRpcGxleGVkOgorCXdoaWxlIChpLS0pIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKKwkJZnJlZV9pcnEoaXJxLCBob3N0KTsKKwl9CitlaXJxX3NkY2FyZDoKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBTSF9NT0JJTEVfU0RISV9JUlFfU0RJTyk7CisJaWYgKGlycSA+PSAwKQorCQlmcmVlX2lycShpcnEsIGhvc3QpOworZWlycV9zZGlvOgorCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIFNIX01PQklMRV9TREhJX0lSUV9DQVJEX0RFVEVDVCk7CisJaWYgKGlycSA+PSAwKQorCQlmcmVlX2lycShpcnEsIGhvc3QpOworZWlycV9jYXJkX2RldGVjdDoKIAl0bWlvX21tY19ob3N0X3JlbW92ZShob3N0KTsKIGVwcm9iZToKIAljbGtfZGlzYWJsZShwcml2LT5jbGspOwpAQCAtMTk3LDE2ICsyNDUsMTcgQEAKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CiAJc3RydWN0IHNoX21vYmlsZV9zZGhpICpwcml2ID0gY29udGFpbmVyX29mKGhvc3QtPnBkYXRhLCBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGksIG1tY19kYXRhKTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyAqcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCBpLCBpcnE7CisJaW50IGkgPSAwLCBpcnE7CiAKIAlwLT5wZGF0YSA9IE5VTEw7CiAKIAl0bWlvX21tY19ob3N0X3JlbW92ZShob3N0KTsKIAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJaWYgKGlycSA+PSAwKQotCQkJZnJlZV9pcnEoaXJxLCBob3N0KTsKKwl3aGlsZSAoMSkgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkrKyk7CisJCWlmIChpcnEgPCAwKQorCQkJYnJlYWs7CisJCWZyZWVfaXJxKGlycSwgaG9zdCk7CiAJfQogCiAJY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdGlmbV9zZC5jIGIvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMKaW5kZXggNDU3YzI2ZS4uZjcwZDA0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90aWZtX3NkLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ0aWZtX3NkIgpAQCAtNjMxLDcgKzYzMiw3IEBACiAJfQogCiAJaWYgKGhvc3QtPnJlcSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIDogdW5maW5pc2hlZCByZXF1ZXN0IGRldGVjdGVkXG4iLAorCQlwcl9lcnIoIiVzIDogdW5maW5pc2hlZCByZXF1ZXN0IGRldGVjdGVkXG4iLAogCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQltcnEtPmNtZC0+ZXJyb3IgPSAtRVRJTUVET1VUOwogCQlnb3RvIGVycl9vdXQ7CkBAIC02NzEsNyArNjcyLDcgQEAKIAkJCQkJICAgIHJfZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURQogCQkJCQkgICAgPyBQQ0lfRE1BX1RPREVWSUNFCiAJCQkJCSAgICA6IFBDSV9ETUFfRlJPTURFVklDRSkpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIDogc2NhdHRlcmxpc3QgbWFwIGZhaWxlZFxuIiwKKwkJCQlwcl9lcnIoIiVzIDogc2NhdHRlcmxpc3QgbWFwIGZhaWxlZFxuIiwKIAkJCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQkJCW1ycS0+Y21kLT5lcnJvciA9IC1FTk9NRU07CiAJCQkJZ290byBlcnJfb3V0OwpAQCAtNjgzLDcgKzY4NCw3IEBACiAJCQkJCQkgICA/IFBDSV9ETUFfVE9ERVZJQ0UKIAkJCQkJCSAgIDogUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCWlmIChob3N0LT5zZ19sZW4gPCAxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlcyA6IHNjYXR0ZXJsaXN0IG1hcCBmYWlsZWRcbiIsCisJCQkJcHJfZXJyKCIlcyA6IHNjYXR0ZXJsaXN0IG1hcCBmYWlsZWRcbiIsCiAJCQkJICAgICAgIGRldl9uYW1lKCZzb2NrLT5kZXYpKTsKIAkJCQl0aWZtX3VubWFwX3NnKHNvY2ssICZob3N0LT5ib3VuY2VfYnVmLCAxLAogCQkJCQkgICAgICByX2RhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUKQEAgLTc0Nyw3ICs3NDgsNyBAQAogCWhvc3QtPnJlcSA9IE5VTEw7CiAKIAlpZiAoIW1ycSkgewotCQlwcmludGsoS0VSTl9FUlIgIiAlcyA6IG5vIHJlcXVlc3QgdG8gY29tcGxldGU/XG4iLAorCQlwcl9lcnIoIiAlcyA6IG5vIHJlcXVlc3QgdG8gY29tcGxldGU/XG4iLAogCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKQEAgLTc4Niw4ICs3ODcsNyBAQAogewogCXN0cnVjdCB0aWZtX3NkICpob3N0ID0gKHN0cnVjdCB0aWZtX3NkKilkYXRhOwogCi0JcHJpbnRrKEtFUk5fRVJSCi0JICAgICAgICIlcyA6IGNhcmQgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSAiCisJcHJfZXJyKCIlcyA6IGNhcmQgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSAiCiAJICAgICAgICIoJXgsICV4KVxuIiwKIAkgICAgICAgZGV2X25hbWUoJmhvc3QtPmRldi0+ZGV2KSwgaG9zdC0+cmVxLT5jbWQtPm9wY29kZSwgaG9zdC0+Y21kX2ZsYWdzKTsKIApAQCAtOTA1LDcgKzkwNSw3IEBACiAJfQogCiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgOiBjb250cm9sbGVyIGZhaWxlZCB0byByZXNldFxuIiwKKwkJcHJfZXJyKCIlcyA6IGNvbnRyb2xsZXIgZmFpbGVkIHRvIHJlc2V0XG4iLAogCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC05MzEsOCArOTMxLDcgQEAKIAl9CiAKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXMgOiBjYXJkIG5vdCByZWFkeSAtIHByb2JlIGZhaWxlZCBvbiBpbml0aWFsaXphdGlvblxuIiwKKwkJcHJfZXJyKCIlcyA6IGNhcmQgbm90IHJlYWR5IC0gcHJvYmUgZmFpbGVkIG9uIGluaXRpYWxpemF0aW9uXG4iLAogCQkgICAgICAgZGV2X25hbWUoJnNvY2stPmRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC05NTMsNyArOTUyLDcgQEAKIAogCWlmICghKFRJRk1fU09DS19TVEFURV9PQ0NVUElFRAogCSAgICAgICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfUFJFU0VOVF9TVEFURSkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCisJCXByX3dhcm5pbmcoIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCiAJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCXJldHVybiByYzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMKaW5kZXggNDRhOTY2OC4uYTRlYTEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuYwpAQCAtODgsOCArODgsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gY2VsbF9kaXNhYmxlOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB0bWlvX21tY19pcnEsIElSUUZfRElTQUJMRUQgfAotCQkJICBJUlFGX1RSSUdHRVJfRkFMTElORywgZGV2X25hbWUoJnBkZXYtPmRldiksIGhvc3QpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdG1pb19tbWNfaXJxLCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaG9zdCk7CiAJaWYgKHJldCkKIAkJZ290byBob3N0X3JlbW92ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCmluZGV4IGVlYWY2NDMuLjMwMjBmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKQEAgLTc5LDYgKzc5LDEwIEBACiAJc3RydWN0IGRlbGF5ZWRfd29yawlkZWxheWVkX3Jlc2V0X3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0CWRvbmU7CiAKKwkvKiBDYWNoZSBJUlEgbWFzayAqLworCXUzMgkJCXNkY2FyZF9pcnFfbWFzazsKKwl1MzIJCQlzZGlvX2lycV9tYXNrOworCiAJc3BpbmxvY2tfdAkJbG9jazsJCS8qIHByb3RlY3QgaG9zdCBwcml2YXRlIGRhdGEgKi8KIAl1bnNpZ25lZCBsb25nCQlsYXN0X3JlcV90czsKIAlzdHJ1Y3QgbXV0ZXgJCWlvc19sb2NrOwkvKiBwcm90ZWN0IHNldF9pb3MoKSBjb250ZXh0ICovCkBAIC05Myw2ICs5Nyw5IEBACiB2b2lkIHRtaW9fbW1jX2VuYWJsZV9tbWNfaXJxcyhzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgdTMyIGkpOwogdm9pZCB0bWlvX21tY19kaXNhYmxlX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSk7CiBpcnFyZXR1cm5fdCB0bWlvX21tY19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpOworaXJxcmV0dXJuX3QgdG1pb19tbWNfc2RjYXJkX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCk7CitpcnFyZXR1cm5fdCB0bWlvX21tY19jYXJkX2RldGVjdF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpOworaXJxcmV0dXJuX3QgdG1pb19tbWNfc2Rpb19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpOwogCiBzdGF0aWMgaW5saW5lIGNoYXIgKnRtaW9fbW1jX2ttYXBfYXRvbWljKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCQkJCSB1bnNpZ25lZCBsb25nICpmbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCmluZGV4IDFmMTYzNTcuLmQ4NWE2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwpAQCAtNDgsMTQgKzQ4LDE0IEBACiAKIHZvaWQgdG1pb19tbWNfZW5hYmxlX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSkKIHsKLQl1MzIgbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSykgJiB+KGkgJiBUTUlPX01BU0tfSVJRKTsKLQlzZF9jdHJsX3dyaXRlMzIoaG9zdCwgQ1RMX0lSUV9NQVNLLCBtYXNrKTsKKwlob3N0LT5zZGNhcmRfaXJxX21hc2sgJj0gfihpICYgVE1JT19NQVNLX0lSUSk7CisJc2RfY3RybF93cml0ZTMyKGhvc3QsIENUTF9JUlFfTUFTSywgaG9zdC0+c2RjYXJkX2lycV9tYXNrKTsKIH0KIAogdm9pZCB0bWlvX21tY19kaXNhYmxlX21tY19pcnFzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCB1MzIgaSkKIHsKLQl1MzIgbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSykgfCAoaSAmIFRNSU9fTUFTS19JUlEpOwotCXNkX2N0cmxfd3JpdGUzMihob3N0LCBDVExfSVJRX01BU0ssIG1hc2spOworCWhvc3QtPnNkY2FyZF9pcnFfbWFzayB8PSAoaSAmIFRNSU9fTUFTS19JUlEpOworCXNkX2N0cmxfd3JpdGUzMihob3N0LCBDVExfSVJRX01BU0ssIGhvc3QtPnNkY2FyZF9pcnFfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX2Fja19tbWNfaXJxcyhzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgdTMyIGkpCkBAIC05Miw3ICs5Miw3IEBACiBzdGF0aWMgdm9pZCBwcl9kZWJ1Z19zdGF0dXModTMyIHN0YXR1cykKIHsKIAlpbnQgaSA9IDA7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1czogJTA4eCA9ICIsIHN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1czogJTA4eCA9ICIsIHN0YXR1cyk7CiAJU1RBVFVTX1RPX1RFWFQoQ0FSRF9SRU1PVkUsIHN0YXR1cywgaSk7CiAJU1RBVFVTX1RPX1RFWFQoQ0FSRF9JTlNFUlQsIHN0YXR1cywgaSk7CiAJU1RBVFVTX1RPX1RFWFQoU0lHU1RBVEUsIHN0YXR1cywgaSk7CkBAIC0xMjcsMTEgKzEyNywxMyBAQAogCiAJaWYgKGVuYWJsZSkgewogCQlob3N0LT5zZGlvX2lycV9lbmFibGVkID0gMTsKKwkJaG9zdC0+c2Rpb19pcnFfbWFzayA9IFRNSU9fU0RJT19NQVNLX0FMTCAmCisJCQkJCX5UTUlPX1NESU9fU1RBVF9JT0lSUTsKIAkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9UUkFOU0FDVElPTl9DVEwsIDB4MDAwMSk7Ci0JCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSywKLQkJCShUTUlPX1NESU9fTUFTS19BTEwgJiB+VE1JT19TRElPX1NUQVRfSU9JUlEpKTsKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLLCBob3N0LT5zZGlvX2lycV9tYXNrKTsKIAl9IGVsc2UgewotCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NESU9fSVJRX01BU0ssIFRNSU9fU0RJT19NQVNLX0FMTCk7CisJCWhvc3QtPnNkaW9faXJxX21hc2sgPSBUTUlPX1NESU9fTUFTS19BTEw7CisJCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSywgaG9zdC0+c2Rpb19pcnFfbWFzayk7CiAJCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfVFJBTlNBQ1RJT05fQ1RMLCAweDAwMDApOwogCQlob3N0LT5zZGlvX2lycV9lbmFibGVkID0gMDsKIAl9CkBAIC01NDMsNDUgKzU0NSwyMCBAQAogCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIH0KIAotaXJxcmV0dXJuX3QgdG1pb19tbWNfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQorc3RhdGljIHZvaWQgdG1pb19tbWNfY2FyZF9pcnFfc3RhdHVzKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAorCQkJCSAgICAgICBpbnQgKmlyZWcsIGludCAqc3RhdHVzKQogewotCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gZGV2aWQ7CisJKnN0YXR1cyA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9TVEFUVVMpOworCSppcmVnID0gKnN0YXR1cyAmIFRNSU9fTUFTS19JUlEgJiB+aG9zdC0+c2RjYXJkX2lycV9tYXNrOworCisJcHJfZGVidWdfc3RhdHVzKCpzdGF0dXMpOworCXByX2RlYnVnX3N0YXR1cygqaXJlZyk7Cit9CisKK3N0YXRpYyBib29sIF9fdG1pb19tbWNfY2FyZF9kZXRlY3RfaXJxKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAorCQkJCSAgICAgIGludCBpcmVnLCBpbnQgc3RhdHVzKQorewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gaG9zdC0+bW1jOwotCXN0cnVjdCB0bWlvX21tY19kYXRhICpwZGF0YSA9IGhvc3QtPnBkYXRhOwotCXVuc2lnbmVkIGludCBpcmVnLCBpcnFfbWFzaywgc3RhdHVzOwotCXVuc2lnbmVkIGludCBzZGlvX2lyZWcsIHNkaW9faXJxX21hc2ssIHNkaW9fc3RhdHVzOwotCi0JcHJfZGVidWcoIk1NQyBJUlEgYmVnaW5cbiIpOwotCi0Jc3RhdHVzID0gc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX1NUQVRVUyk7Ci0JaXJxX21hc2sgPSBzZF9jdHJsX3JlYWQzMihob3N0LCBDVExfSVJRX01BU0spOwotCWlyZWcgPSBzdGF0dXMgJiBUTUlPX01BU0tfSVJRICYgfmlycV9tYXNrOwotCi0Jc2Rpb19pcmVnID0gMDsKLQlpZiAoIWlyZWcgJiYgcGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpIHsKLQkJc2Rpb19zdGF0dXMgPSBzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RJT19TVEFUVVMpOwotCQlzZGlvX2lycV9tYXNrID0gc2RfY3RybF9yZWFkMTYoaG9zdCwgQ1RMX1NESU9fSVJRX01BU0spOwotCQlzZGlvX2lyZWcgPSBzZGlvX3N0YXR1cyAmIFRNSU9fU0RJT19NQVNLX0FMTCAmIH5zZGlvX2lycV9tYXNrOwotCi0JCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RJT19TVEFUVVMsIHNkaW9fc3RhdHVzICYgflRNSU9fU0RJT19NQVNLX0FMTCk7Ci0KLQkJaWYgKHNkaW9faXJlZyAmJiAhaG9zdC0+c2Rpb19pcnFfZW5hYmxlZCkgewotCQkJcHJfd2FybmluZygidG1pb19tbWM6IFNwdXJpb3VzIFNESU8gSVJRLCBkaXNhYmxpbmchIDB4JTA0eCAweCUwNHggMHglMDR4XG4iLAotCQkJCSAgIHNkaW9fc3RhdHVzLCBzZGlvX2lycV9tYXNrLCBzZGlvX2lyZWcpOwotCQkJdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKG1tYywgMCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWlmIChtbWMtPmNhcHMgJiBNTUNfQ0FQX1NESU9fSVJRICYmCi0JCQlzZGlvX2lyZWcgJiBUTUlPX1NESU9fU1RBVF9JT0lSUSkKLQkJCW1tY19zaWduYWxfc2Rpb19pcnEobW1jKTsKLQotCQlpZiAoc2Rpb19pcmVnKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JcHJfZGVidWdfc3RhdHVzKHN0YXR1cyk7Ci0JcHJfZGVidWdfc3RhdHVzKGlyZWcpOwogCiAJLyogQ2FyZCBpbnNlcnQgLyByZW1vdmUgYXR0ZW1wdHMgKi8KIAlpZiAoaXJlZyAmIChUTUlPX1NUQVRfQ0FSRF9JTlNFUlQgfCBUTUlPX1NUQVRfQ0FSRF9SRU1PVkUpKSB7CkBAIC01OTEsNDMgKzU2OCwxMDIgQEAKIAkJICAgICAoKGlyZWcgJiBUTUlPX1NUQVRfQ0FSRF9JTlNFUlQpICYmICFtbWMtPmNhcmQpKSAmJgogCQkgICAgIXdvcmtfcGVuZGluZygmbW1jLT5kZXRlY3Qud29yaykpCiAJCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKiBDUkMgYW5kIG90aGVyIGVycm9ycyAqLwotLyoJaWYgKGlyZWcgJiBUTUlPX1NUQVRfRVJSX0lSUSkKLSAqCQloYW5kbGVkIHw9IHRtaW9fZXJyb3JfaXJxKGhvc3QsIGlycSwgc3RhdCk7Ci0gKi8KKwlyZXR1cm4gZmFsc2U7Cit9CiAKK2lycXJldHVybl90IHRtaW9fbW1jX2NhcmRfZGV0ZWN0X2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJlZywgc3RhdHVzOworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gZGV2aWQ7CisKKwl0bWlvX21tY19jYXJkX2lycV9zdGF0dXMoaG9zdCwgJmlyZWcsICZzdGF0dXMpOworCV9fdG1pb19tbWNfY2FyZF9kZXRlY3RfaXJxKGhvc3QsIGlyZWcsIHN0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CitFWFBPUlRfU1lNQk9MKHRtaW9fbW1jX2NhcmRfZGV0ZWN0X2lycSk7CisKK3N0YXRpYyBib29sIF9fdG1pb19tbWNfc2RjYXJkX2lycShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKKwkJCQkgaW50IGlyZWcsIGludCBzdGF0dXMpCit7CiAJLyogQ29tbWFuZCBjb21wbGV0aW9uICovCiAJaWYgKGlyZWcgJiAoVE1JT19TVEFUX0NNRFJFU1BFTkQgfCBUTUlPX1NUQVRfQ01EVElNRU9VVCkpIHsKIAkJdG1pb19tbWNfYWNrX21tY19pcnFzKGhvc3QsCiAJCQkgICAgIFRNSU9fU1RBVF9DTURSRVNQRU5EIHwKIAkJCSAgICAgVE1JT19TVEFUX0NNRFRJTUVPVVQpOwogCQl0bWlvX21tY19jbWRfaXJxKGhvc3QsIHN0YXR1cyk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAkvKiBEYXRhIHRyYW5zZmVyICovCiAJaWYgKGlyZWcgJiAoVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX1RYUlEpKSB7CiAJCXRtaW9fbW1jX2Fja19tbWNfaXJxcyhob3N0LCBUTUlPX1NUQVRfUlhSRFkgfCBUTUlPX1NUQVRfVFhSUSk7CiAJCXRtaW9fbW1jX3Bpb19pcnEoaG9zdCk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKIAkvKiBEYXRhIHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KIAlpZiAoaXJlZyAmIFRNSU9fU1RBVF9EQVRBRU5EKSB7CiAJCXRtaW9fbW1jX2Fja19tbWNfaXJxcyhob3N0LCBUTUlPX1NUQVRfREFUQUVORCk7CiAJCXRtaW9fbW1jX2RhdGFfaXJxKGhvc3QpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJfd2FybmluZygidG1pb19tbWM6IFNwdXJpb3VzIGlycSwgZGlzYWJsaW5nISAiCi0JCSIweCUwOHggMHglMDh4IDB4JTA4eFxuIiwgc3RhdHVzLCBpcnFfbWFzaywgaXJlZyk7Ci0JcHJfZGVidWdfc3RhdHVzKHN0YXR1cyk7Ci0JdG1pb19tbWNfZGlzYWJsZV9tbWNfaXJxcyhob3N0LCBzdGF0dXMgJiB+aXJxX21hc2spOworCXJldHVybiBmYWxzZTsKK30KIAotb3V0OgoraXJxcmV0dXJuX3QgdG1pb19tbWNfc2RjYXJkX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJlZywgc3RhdHVzOworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gZGV2aWQ7CisKKwl0bWlvX21tY19jYXJkX2lycV9zdGF0dXMoaG9zdCwgJmlyZWcsICZzdGF0dXMpOworCV9fdG1pb19tbWNfc2RjYXJkX2lycShob3N0LCBpcmVnLCBzdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorRVhQT1JUX1NZTUJPTCh0bWlvX21tY19zZGNhcmRfaXJxKTsKKworaXJxcmV0dXJuX3QgdG1pb19tbWNfc2Rpb19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKwlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IGhvc3QtPm1tYzsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBob3N0LT5wZGF0YTsKKwl1bnNpZ25lZCBpbnQgaXJlZywgc3RhdHVzOworCisJaWYgKCEocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzdGF0dXMgPSBzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RJT19TVEFUVVMpOworCWlyZWcgPSBzdGF0dXMgJiBUTUlPX1NESU9fTUFTS19BTEwgJiB+aG9zdC0+c2RjYXJkX2lycV9tYXNrOworCisJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX1NUQVRVUywgc3RhdHVzICYgflRNSU9fU0RJT19NQVNLX0FMTCk7CisKKwlpZiAobW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSAmJiBpcmVnICYgVE1JT19TRElPX1NUQVRfSU9JUlEpCisJCW1tY19zaWduYWxfc2Rpb19pcnEobW1jKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KK0VYUE9SVF9TWU1CT0wodG1pb19tbWNfc2Rpb19pcnEpOworCitpcnFyZXR1cm5fdCB0bWlvX21tY19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKwl1bnNpZ25lZCBpbnQgaXJlZywgc3RhdHVzOworCisJcHJfZGVidWcoIk1NQyBJUlEgYmVnaW5cbiIpOworCisJdG1pb19tbWNfY2FyZF9pcnFfc3RhdHVzKGhvc3QsICZpcmVnLCAmc3RhdHVzKTsKKwlpZiAoX190bWlvX21tY19jYXJkX2RldGVjdF9pcnEoaG9zdCwgaXJlZywgc3RhdHVzKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChfX3RtaW9fbW1jX3NkY2FyZF9pcnEoaG9zdCwgaXJlZywgc3RhdHVzKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJdG1pb19tbWNfc2Rpb19pcnEoaXJxLCBkZXZpZCk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiBFWFBPUlRfU1lNQk9MKHRtaW9fbW1jX2lycSk7CkBAIC04ODIsNiArOTE4LDcgQEAKIAl0bWlvX21tY19jbGtfc3RvcChfaG9zdCk7CiAJdG1pb19tbWNfcmVzZXQoX2hvc3QpOwogCisJX2hvc3QtPnNkY2FyZF9pcnFfbWFzayA9IHNkX2N0cmxfcmVhZDMyKF9ob3N0LCBDVExfSVJRX01BU0spOwogCXRtaW9fbW1jX2Rpc2FibGVfbW1jX2lycXMoX2hvc3QsIFRNSU9fTUFTS19BTEwpOwogCWlmIChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkKIAkJdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKG1tYywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3ZpYS1zZG1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC92aWEtc2RtbWMuYwppbmRleCA0ZGZlMmMwLi40YjgzYzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3ZpYS1zZG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTkxLDcgKzExOTIsNyBAQAogCW1taW93YigpOwogCiAJaWYgKHNkaG9zdC0+bXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENvbnRyb2xsZXIgcmVtb3ZlZCBkdXJpbmcgIgorCQlwcl9lcnIoIiVzOiBDb250cm9sbGVyIHJlbW92ZWQgZHVyaW5nICIKIAkJCSJ0cmFuc2ZlclxuIiwgbW1jX2hvc3RuYW1lKHNkaG9zdC0+bW1jKSk7CiAKIAkJLyogbWFrZSBzdXJlIGFsbCBETUEgaXMgc3RvcHBlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC93YnNkLmMgYi9kcml2ZXJzL21tYy9ob3N0L3dic2QuYwppbmRleCA2MmU1YTRkLi42NGFjZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3dic2QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3dic2QuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiB7CiAJdTggc2V0dXA7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXNldHRpbmcgY2hpcFxuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOworCXByX2VycigiJXM6IFJlc2V0dGluZyBjaGlwXG4iLCBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAKIAkvKgogCSAqIFNvZnQgcmVzZXQgb2YgY2hpcCAoU0QvTU1DIHBhcnQpLgpAQCAtNzIxLDcgKzcyMSw3IEBACiAJCSAqIEFueSBsZWZ0b3ZlciBkYXRhPwogCQkgKi8KIAkJaWYgKGNvdW50KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbmNvbXBsZXRlIERNQSB0cmFuc2Zlci4gIgorCQkJcHJfZXJyKCIlczogSW5jb21wbGV0ZSBETUEgdHJhbnNmZXIuICIKIAkJCQkiJWQgYnl0ZXMgbGVmdC5cbiIsCiAJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGNvdW50KTsKIApAQCAtODAzLDcgKzgwMyw3IEBACiAKIAkJZGVmYXVsdDoKICNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRGF0YSBjb21tYW5kICVkIGlzIG5vdCAiCisJCQlwcl93YXJuaW5nKCIlczogRGF0YSBjb21tYW5kICVkIGlzIG5vdCAiCiAJCQkJInN1cHBvcnRlZCBieSB0aGlzIGNvbnRyb2xsZXIuXG4iLAogCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBjbWQtPm9wY29kZSk7CiAjZW5kaWYKQEAgLTEwMjksNyArMTAyOSw3IEBACiAJCWhvc3QtPmZsYWdzICY9IH5XQlNEX0ZDQVJEX1BSRVNFTlQ7CiAKIAkJaWYgKGhvc3QtPm1ycSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FyZCByZW1vdmVkIGR1cmluZyB0cmFuc2ZlciFcbiIsCisJCQlwcl9lcnIoIiVzOiBDYXJkIHJlbW92ZWQgZHVyaW5nIHRyYW5zZmVyIVxuIiwKIAkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CiAJCQl3YnNkX3Jlc2V0KGhvc3QpOwogCkBAIC0xNDI5LDcgKzE0MjksNyBAQAogCWZyZWVfZG1hKGRtYSk7CiAKIGVycjoKLQlwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6IFVuYWJsZSB0byBhbGxvY2F0ZSBETUEgJWQuICIKKwlwcl93YXJuaW5nKERSSVZFUl9OQU1FICI6IFVuYWJsZSB0byBhbGxvY2F0ZSBETUEgJWQuICIKIAkJIkZhbGxpbmcgYmFjayBvbiBGSUZPLlxuIiwgZG1hKTsKIH0KIApAQCAtMTY2NCw3ICsxNjY0LDcgQEAKIAlyZXQgPSB3YnNkX3NjYW4oaG9zdCk7CiAJaWYgKHJldCkgewogCQlpZiAocG5wICYmIChyZXQgPT0gLUVOT0RFVikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUKKwkJCXByX3dhcm5pbmcoRFJJVkVSX05BTUUKIAkJCQkiOiBVbmFibGUgdG8gY29uZmlybSBkZXZpY2UgcHJlc2VuY2UuIFlvdSBtYXkgIgogCQkJCSJleHBlcmllbmNlIGxvY2stdXBzLlxuIik7CiAJCX0gZWxzZSB7CkBAIC0xNjg4LDcgKzE2ODgsNyBAQAogCSAqLwogCWlmIChwbnApIHsKIAkJaWYgKChob3N0LT5jb25maWcgIT0gMCkgJiYgIXdic2RfY2hpcF92YWxpZGF0ZShob3N0KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRQorCQkJcHJfd2FybmluZyhEUklWRVJfTkFNRQogCQkJCSI6IFBuUCBhY3RpdmUgYnV0IGNoaXAgbm90IGNvbmZpZ3VyZWQhICIKIAkJCQkiWW91IHByb2JhYmx5IGhhdmUgYSBidWdneSBCSU9TLiAiCiAJCQkJIkNvbmZpZ3VyaW5nIGNoaXAgbWFudWFsbHkuXG4iKTsKQEAgLTE3MjAsNyArMTcyMCw3IEBACiAKIAltbWNfYWRkX2hvc3QobW1jKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBXODNMNTF4RCIsIG1tY19ob3N0bmFtZShtbWMpKTsKKwlwcl9pbmZvKCIlczogVzgzTDUxeEQiLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJaWYgKGhvc3QtPmNoaXBfaWQgIT0gMCkKIAkJcHJpbnRrKCIgaWQgJXgiLCAoaW50KWhvc3QtPmNoaXBfaWQpOwogCXByaW50aygiIGF0IDB4JXggaXJxICVkIiwgKGludClob3N0LT5iYXNlLCAoaW50KWhvc3QtPmlycSk7CkBAIC0xOTA5LDcgKzE5MDksNyBAQAogCSAqLwogCWlmIChob3N0LT5jb25maWcgIT0gMCkgewogCQlpZiAoIXdic2RfY2hpcF92YWxpZGF0ZShob3N0KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRQorCQkJcHJfd2FybmluZyhEUklWRVJfTkFNRQogCQkJCSI6IFBuUCBhY3RpdmUgYnV0IGNoaXAgbm90IGNvbmZpZ3VyZWQhICIKIAkJCQkiWW91IHByb2JhYmx5IGhhdmUgYSBidWdneSBCSU9TLiAiCiAJCQkJIkNvbmZpZ3VyaW5nIGNoaXAgbWFudWFsbHkuXG4iKTsKQEAgLTE5NzMsOSArMTk3Myw5IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUKKwlwcl9pbmZvKERSSVZFUl9OQU1FCiAJCSI6IFdpbmJvbmQgVzgzTDUxeEQgU0QvTU1DIGNhcmQgaW50ZXJmYWNlIGRyaXZlclxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBDb3B5cmlnaHQoYykgUGllcnJlIE9zc21hblxuIik7CisJcHJfaW5mbyhEUklWRVJfTkFNRSAiOiBDb3B5cmlnaHQoYykgUGllcnJlIE9zc21hblxuIik7CiAKICNpZmRlZiBDT05GSUdfUE5QCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJzL210ZC9LY29uZmlnCmluZGV4IDY2YjYxNmUuLjMxOGE4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtMTIsMjcgKzEyLDE3IEBACiAKIGlmIE1URAogCi1jb25maWcgTVREX0RFQlVHCi0JYm9vbCAiRGVidWdnaW5nIgotCWhlbHAKLQkgIFRoaXMgdHVybnMgb24gbG93LWxldmVsIGRlYnVnZ2luZyBmb3IgdGhlIGVudGlyZSBNVEQgc3ViLXN5c3RlbS4KLQkgIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIHNheSAnTicuCi0KLWNvbmZpZyBNVERfREVCVUdfVkVSQk9TRQotCWludCAiRGVidWdnaW5nIHZlcmJvc2l0eSAoMCA9IHF1aWV0LCAzID0gbm9pc3kpIgotCWRlcGVuZHMgb24gTVREX0RFQlVHCi0JZGVmYXVsdCAiMCIKLQloZWxwCi0JICBEZXRlcm1pbmVzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIE1URCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi0KIGNvbmZpZyBNVERfVEVTVFMKLQl0cmlzdGF0ZSAiTVREIHRlc3RzIHN1cHBvcnQiCisJdHJpc3RhdGUgIk1URCB0ZXN0cyBzdXBwb3J0IChEQU5HRVJPVVMpIgogCWRlcGVuZHMgb24gbQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGluY2x1ZGVzIHZhcmlvdXMgTVREIHRlc3RzIGludG8gY29tcGlsYXRpb24uIFRoZSB0ZXN0cwogCSAgc2hvdWxkIG5vcm1hbGx5IGJlIGNvbXBpbGVkIGFzIGtlcm5lbCBtb2R1bGVzLiBUaGUgbW9kdWxlcyBwZXJmb3JtCiAJICB2YXJpb3VzIGNoZWNrcyBhbmQgdmVyaWZpY2F0aW9ucyB3aGVuIGxvYWRlZC4KIAorCSAgV0FSTklORzogc29tZSBvZiB0aGUgdGVzdHMgd2lsbCBFUkFTRSBlbnRpcmUgTVREIGRldmljZSB3aGljaCB0aGV5CisJICB0ZXN0LiBEbyBub3QgdXNlIHRoZXNlIHRlc3RzIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgZG8uCisKIGNvbmZpZyBNVERfUkVEQk9PVF9QQVJUUwogCXRyaXN0YXRlICJSZWRCb290IHBhcnRpdGlvbiB0YWJsZSBwYXJzaW5nIgogCS0tLWhlbHAtLS0KQEAgLTEzNyw3ICsxMjcsOCBAQAogCSAgJ3BoeXNtYXAnIG1hcCBkcml2ZXIgKENPTkZJR19NVERfUEhZU01BUCkgZG9lcyB0aGlzLCBmb3IgZXhhbXBsZS4KIAogY29uZmlnIE1URF9PRl9QQVJUUwotCWRlZl9ib29sIHkKKwl0cmlzdGF0ZSAiT3BlbkZpcm13YXJlIHBhcnRpdGlvbmluZyBpbmZvcm1hdGlvbiBzdXBwb3J0IgorCWRlZmF1bHQgWQogCWRlcGVuZHMgb24gT0YKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgcGFydGl0aW9uIHBhcnNpbmcgZnVuY3Rpb24gd2hpY2ggZGVyaXZlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9NYWtlZmlsZQppbmRleCAzOTY2NGM0Li45YWFhYzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9NYWtlZmlsZQpAQCAtNSw4ICs1LDggQEAKICMgQ29yZSBmdW5jdGlvbmFsaXR5Lgogb2JqLSQoQ09ORklHX01URCkJCSs9IG10ZC5vCiBtdGQteQkJCQk6PSBtdGRjb3JlLm8gbXRkc3VwZXIubyBtdGRjb25jYXQubyBtdGRwYXJ0Lm8KLW10ZC0kKENPTkZJR19NVERfT0ZfUEFSVFMpCSs9IG9mcGFydC5vCiAKK29iai0kKENPTkZJR19NVERfT0ZfUEFSVFMpCSs9IG9mcGFydC5vCiBvYmotJChDT05GSUdfTVREX1JFREJPT1RfUEFSVFMpICs9IHJlZGJvb3Qubwogb2JqLSQoQ09ORklHX01URF9DTURMSU5FX1BBUlRTKSArPSBjbWRsaW5lcGFydC5vCiBvYmotJChDT05GSUdfTVREX0FGU19QQVJUUykJKz0gYWZzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Fmcy5jIGIvZHJpdmVycy9tdGQvYWZzLmMKaW5kZXggMzAyMzcyYy4uODlhMDJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvYWZzLmMKKysrIGIvZHJpdmVycy9tdGQvYWZzLmMKQEAgLTE2Miw4ICsxNjIsOCBAQAogfQogCiBzdGF0aWMgaW50IHBhcnNlX2Fmc19wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb3JpZ2luKQorCQkJCXN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAorCQkJCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiAJdV9pbnQgbWFzaywgb2ZmLCBpZHgsIHN6OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvYXI3cGFydC5jIGIvZHJpdmVycy9tdGQvYXI3cGFydC5jCmluZGV4IDY2OTdhMWUuLmY0MGVhNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2FyN3BhcnQuYworKysgYi9kcml2ZXJzL210ZC9hcjdwYXJ0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIEFSN19QQVJUUwk0CiAjZGVmaW5lIFJPT1RfT0ZGU0VUCTB4ZTAwMDAKQEAgLTQ2LDcgKzQ3LDcgQEAKIAogc3RhdGljIGludCBjcmVhdGVfbXRkX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCiAJCQkJIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAotCQkJCSB1bnNpZ25lZCBsb25nIG9yaWdpbikKKwkJCQkgc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhICpkYXRhKQogewogCXN0cnVjdCBhcjdfYmluX3JlYyBoZWFkZXI7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKaW5kZXggMjMxNzVlZC4uOGQ3MDg5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKQEAgLTE0NSw4ICsxNDUsNyBAQAogCWlmICgoKG1ham9yIDw8IDgpIHwgbWlub3IpIDwgMHgzMTMxKSB7CiAJCS8qIENGSSB2ZXJzaW9uIDEuMCA9PiBkb24ndCB0cnVzdCBib290bG9jICovCiAKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKLQkJCSIlczogSkVERUMgVmVuZG9yIElEIGlzIDB4JTAyWCBEZXZpY2UgSUQgaXMgMHglMDJYXG4iLAorCQlwcl9kZWJ1ZygiJXM6IEpFREVDIFZlbmRvciBJRCBpcyAweCUwMlggRGV2aWNlIElEIGlzIDB4JTAyWFxuIiwKIAkJCW1hcC0+bmFtZSwgY2ZpLT5tZnIsIGNmaS0+aWQpOwogCiAJCS8qIEFGQUlDUyBhbGwgMjlMVjQwMCB3aXRoIGEgYm90dG9tIGJvb3QgYmxvY2sgaGF2ZSBhIGRldmljZSBJRApAQCAtMTY2LDggKzE2NSw3IEBACiAJCQkgKiB0aGUgOC1iaXQgZGV2aWNlIElELgogCQkJICovCiAJCQkoY2ZpLT5tZnIgPT0gQ0ZJX01GUl9NQUNST05JWCkpIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCQkJIiVzOiBNYWNyb25peCBNWDI5TFY0MDBDIHdpdGggYm90dG9tIGJvb3QgYmxvY2siCisJCQlwcl9kZWJ1ZygiJXM6IE1hY3Jvbml4IE1YMjlMVjQwMEMgd2l0aCBib3R0b20gYm9vdCBibG9jayIKIAkJCQkiIGRldGVjdGVkXG4iLCBtYXAtPm5hbWUpOwogCQkJZXh0cC0+VG9wQm90dG9tID0gMjsJLyogYm90dG9tIGJvb3QgKi8KIAkJfSBlbHNlCkBAIC0xNzgsOCArMTc2LDcgQEAKIAkJCWV4dHAtPlRvcEJvdHRvbSA9IDI7CS8qIGJvdHRvbSBib290ICovCiAJCX0KIAotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLAotCQkJIiVzOiBBTUQgQ0ZJIFBSSSBWJWMuJWMgaGFzIG5vIGJvb3QgYmxvY2sgZmllbGQ7IgorCQlwcl9kZWJ1ZygiJXM6IEFNRCBDRkkgUFJJIFYlYy4lYyBoYXMgbm8gYm9vdCBibG9jayBmaWVsZDsiCiAJCQkiIGRlZHVjZWQgJXMgZnJvbSBEZXZpY2UgSURcbiIsIG1hcC0+bmFtZSwgbWFqb3IsIG1pbm9yLAogCQkJZXh0cC0+VG9wQm90dG9tID09IDIgPyAiYm90dG9tIiA6ICJ0b3AiKTsKIAl9CkBAIC0xOTEsNyArMTg4LDcgQEAKIAlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAlpZiAoY2ZpLT5jZmlxLT5CdWZXcml0ZVRpbWVvdXRUeXApIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlVzaW5nIGJ1ZmZlciB3cml0ZSBtZXRob2RcbiIgKTsKKwkJcHJfZGVidWcoIlVzaW5nIGJ1ZmZlciB3cml0ZSBtZXRob2RcbiIgKTsKIAkJbXRkLT53cml0ZSA9IGNmaV9hbWRzdGRfd3JpdGVfYnVmZmVyczsKIAl9CiB9CkBAIC00NDMsOCArNDQwLDggQEAKIAltdGQtPndyaXRlc2l6ZSA9IDE7CiAJbXRkLT53cml0ZWJ1ZnNpemUgPSBjZmlfaW50ZXJsZWF2ZShjZmkpIDw8IGNmaS0+Y2ZpcS0+TWF4QnVmV3JpdGVTaXplOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiB3cml0ZSBidWZmZXIgc2l6ZSAlZFxuIiwKLQkJX19mdW5jX18sIG10ZC0+d3JpdGVidWZzaXplKTsKKwlwcl9kZWJ1ZygiTVREICVzKCk6IHdyaXRlIGJ1ZmZlciBzaXplICVkXG4iLCBfX2Z1bmNfXywKKwkJCW10ZC0+d3JpdGVidWZzaXplKTsKIAogCW10ZC0+cmVib290X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjZmlfYW1kc3RkX3JlYm9vdDsKIApAQCAtMTE2Myw3ICsxMTYwLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBXUklURSAweCUuOGx4KDB4JS44bHgpXG4iLAorCXByX2RlYnVnKCJNVEQgJXMoKTogV1JJVEUgMHglLjhseCgweCUuOGx4KVxuIiwKIAkgICAgICAgX19mdW5jX18sIGFkciwgZGF0dW0ueFswXSApOwogCiAJLyoKQEAgLTExNzQsNyArMTE3MSw3IEBACiAJICovCiAJb2xkZCA9IG1hcF9yZWFkKG1hcCwgYWRyKTsKIAlpZiAobWFwX3dvcmRfZXF1YWwobWFwLCBvbGRkLCBkYXR1bSkpIHsKLQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogTk9QXG4iLAorCQlwcl9kZWJ1ZygiTVREICVzKCk6IE5PUFxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKIAkJZ290byBvcF9kb25lOwogCX0KQEAgLTE0MDAsNyArMTM5Nyw3IEBACiAKIAlkYXR1bSA9IG1hcF93b3JkX2xvYWQobWFwLCBidWYpOwogCi0JREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogV1JJVEUgMHglLjhseCgweCUuOGx4KVxuIiwKKwlwcl9kZWJ1ZygiTVREICVzKCk6IFdSSVRFIDB4JS44bHgoMHglLjhseClcbiIsCiAJICAgICAgIF9fZnVuY19fLCBhZHIsIGRhdHVtLnhbMF0gKTsKIAogCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7CkBAIC0xNTg3LDcgKzE1ODQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgY2hpcC0+c3RhcnQgKTsKIAogCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIG1hcC0+c2l6ZSk7CkBAIC0xNjc1LDcgKzE2NzIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IEVSQVNFIDB4JS44bHhcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgYWRyICk7CiAKIAlYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOwpAQCAtMTgwMSw4ICsxNzk4LDcgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCWNoaXAtPnN0YXRlID0gRkxfTE9DS0lORzsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogTE9DSyAweCUwOGx4IGxlbiAlZFxuIiwKLQkgICAgICBfX2Z1bmNfXywgYWRyLCBsZW4pOworCXByX2RlYnVnKCJNVEQgJXMoKTogTE9DSyAweCUwOGx4IGxlbiAlZFxuIiwgX19mdW5jX18sIGFkciwgbGVuKTsKIAogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwKIAkJCSBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKQEAgLTE4MzcsOCArMTgzMyw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAljaGlwLT5zdGF0ZSA9IEZMX1VOTE9DS0lORzsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogTE9DSyAweCUwOGx4IGxlbiAlZFxuIiwKLQkgICAgICBfX2Z1bmNfXywgYWRyLCBsZW4pOworCXByX2RlYnVnKCJNVEQgJXMoKTogTE9DSyAweCUwOGx4IGxlbiAlZFxuIiwgX19mdW5jX18sIGFkciwgbGVuKTsKIAogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwKIAkJCSBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmggYi9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCmluZGV4IDVlM2NjODAuLjg5YzY1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaApAQCAtMzQsOCArMzQsNyBAQAogCiAJLyogUmVmdXNlIHRoZSBvcGVyYXRpb24gaWYgdGhlIHdlIGNhbm5vdCBsb29rIGJlaGluZCB0aGUgY2hpcCAqLwogCWlmIChjaGlwLT5zdGFydCA8IDB4NDAwMDAwKSB7Ci0JCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCQkJIk1URCAlcygpOiBjaGlwLT5zdGFydDogJWx4IHdhbnRlZCA+PSAweDQwMDAwMFxuIiwKKwkJcHJfZGVidWcoICJNVEQgJXMoKTogY2hpcC0+c3RhcnQ6ICVseCB3YW50ZWQgPj0gMHg0MDAwMDBcbiIsCiAJCQlfX2Z1bmNfXywgY2hpcC0+c3RhcnQgKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKaW5kZXggZWE4MzJlYS4uYzQ0M2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCkBAIC0xOTE0LDExICsxOTE0LDEwIEBACiAJICogKG9oIGFuZCBpbmNpZGVudGFseSB0aGUgamVkZWMgc3BlYyAtIDMuNS4zLjMpIHRoZSByZXNldAogCSAqIHNlcXVlbmNlIGlzICpzdXBwb3NlZCogdG8gYmUgMHhhYSBhdCAweDU1NTUsIDB4NTUgYXQKIAkgKiAweDJhYWEsIDB4RjAgYXQgMHg1NTU1IHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBBTUQgY2hpcHMKLQkgKiBhcyB0aGV5IHdpbGwgaWdub3JlIHRoZSB3cml0ZXMgYW5kIGRvbnQgY2FyZSB3aGF0IGFkZHJlc3MKKwkgKiBhcyB0aGV5IHdpbGwgaWdub3JlIHRoZSB3cml0ZXMgYW5kIGRvbid0IGNhcmUgd2hhdCBhZGRyZXNzCiAJICogdGhlIEYwIGlzIHdyaXR0ZW4gdG8gKi8KIAlpZiAoY2ZpLT5hZGRyX3VubG9jazEpIHsKLQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCi0JCSAgICAgICAicmVzZXQgdW5sb2NrIGNhbGxlZCAleCAleCBcbiIsCisJCXByX2RlYnVnKCAicmVzZXQgdW5sb2NrIGNhbGxlZCAleCAleCBcbiIsCiAJCSAgICAgICBjZmktPmFkZHJfdW5sb2NrMSxjZmktPmFkZHJfdW5sb2NrMik7CiAJCWNmaV9zZW5kX2dlbl9jbWQoMHhhYSwgY2ZpLT5hZGRyX3VubG9jazEsIGJhc2UsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAkJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgYmFzZSwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMTk0MSw3ICsxOTQwLDcgQEAKIAl1aW50OF90IHVhZGRyOwogCiAJaWYgKCEoamVkZWNfdGFibGVbaW5kZXhdLmRldnR5cGVzICYgY2ZpLT5kZXZpY2VfdHlwZSkpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlJlamVjdGluZyBwb3RlbnRpYWwgJXMgd2l0aCBpbmNvbXBhdGlibGUgJWQtYml0IGRldmljZSB0eXBlXG4iLAorCQlwcl9kZWJ1ZygiUmVqZWN0aW5nIHBvdGVudGlhbCAlcyB3aXRoIGluY29tcGF0aWJsZSAlZC1iaXQgZGV2aWNlIHR5cGVcbiIsCiAJCSAgICAgIGplZGVjX3RhYmxlW2luZGV4XS5uYW1lLCA0ICogKDE8PGNmaS0+ZGV2aWNlX3R5cGUpKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjAyMSw3ICsyMDIwLDcgQEAKIAkJICogdGhlcmUgYXJlbid0LgogCQkgKi8KIAkJaWYgKGZpbmZvLT5kZXZfaWQgPiAweGZmKSB7Ci0JCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIiVzKCk6IElEIGlzIG5vdCA4Yml0XG4iLAorCQkJcHJfZGVidWcoIiVzKCk6IElEIGlzIG5vdCA4Yml0XG4iLAogCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCWdvdG8gbWF0Y2hfZG9uZTsKIAkJfQpAQCAtMjA0NSwxMiArMjA0NCwxMCBAQAogCX0KIAogCS8qIHRoZSBwYXJ0IHNpemUgbXVzdCBmaXQgaW4gdGhlIG1lbW9yeSB3aW5kb3cgKi8KLQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKLQkgICAgICAgIk1URCAlcygpOiBDaGVjayBmaXQgMHglLjh4ICsgMHglLjh4ID0gMHglLjh4XG4iLAorCXByX2RlYnVnKCJNVEQgJXMoKTogQ2hlY2sgZml0IDB4JS44eCArIDB4JS44eCA9IDB4JS44eFxuIiwKIAkgICAgICAgX19mdW5jX18sIGJhc2UsIDEgPDwgZmluZm8tPmRldl9zaXplLCBiYXNlICsgKDEgPDwgZmluZm8tPmRldl9zaXplKSApOwogCWlmICggYmFzZSArIGNmaV9pbnRlcmxlYXZlKGNmaSkgKiAoIDEgPDwgZmluZm8tPmRldl9zaXplICkgPiBtYXAtPnNpemUgKSB7Ci0JCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCQkgICAgICAgIk1URCAlcygpOiAweCUuNHggMHglLjR4ICVkS2lCIGRvZXNuJ3QgZml0XG4iLAorCQlwcl9kZWJ1ZygiTVREICVzKCk6IDB4JS40eCAweCUuNHggJWRLaUIgZG9lc24ndCBmaXRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgZmluZm8tPm1mcl9pZCwgZmluZm8tPmRldl9pZCwKIAkJICAgICAgIDEgPDwgZmluZm8tPmRldl9zaXplICk7CiAJCWdvdG8gbWF0Y2hfZG9uZTsKQEAgLTIwNjEsMTMgKzIwNTgsMTIgQEAKIAogCXVhZGRyID0gZmluZm8tPnVhZGRyOwogCi0JREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogY2hlY2sgdW5sb2NrIGFkZHJzIDB4JS40eCAweCUuNHhcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBjaGVjayB1bmxvY2sgYWRkcnMgMHglLjR4IDB4JS40eFxuIiwKIAkgICAgICAgX19mdW5jX18sIGNmaS0+YWRkcl91bmxvY2sxLCBjZmktPmFkZHJfdW5sb2NrMiApOwogCWlmICggTVREX1VBRERSX1VOTkVDRVNTQVJZICE9IHVhZGRyICYmIE1URF9VQUREUl9ET05UX0NBUkUgIT0gdWFkZHIKIAkgICAgICYmICggdW5sb2NrX2FkZHJzW3VhZGRyXS5hZGRyMSAvIGNmaS0+ZGV2aWNlX3R5cGUgIT0gY2ZpLT5hZGRyX3VubG9jazEgfHwKIAkJICB1bmxvY2tfYWRkcnNbdWFkZHJdLmFkZHIyIC8gY2ZpLT5kZXZpY2VfdHlwZSAhPSBjZmktPmFkZHJfdW5sb2NrMiApICkgewotCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKLQkJCSJNVEQgJXMoKTogMHglLjR4IDB4JS40eCBkaWQgbm90IG1hdGNoXG4iLAorCQlwcl9kZWJ1ZygiTVREICVzKCk6IDB4JS40eCAweCUuNHggZGlkIG5vdCBtYXRjaFxuIiwKIAkJCV9fZnVuY19fLAogCQkJdW5sb2NrX2FkZHJzW3VhZGRyXS5hZGRyMSwKIAkJCXVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjIpOwpAQCAtMjA4MywxNSArMjA3OSwxMyBAQAogCSAqIEZJWE1FIC0gd3JpdGUgYSBkcml2ZXIgdGhhdCB0YWtlcyBhbGwgb2YgdGhlIGNoaXAgaW5mbyBhcwogCSAqIG1vZHVsZSBwYXJhbWV0ZXJzLCBkb2Vzbid0IHByb2JlIGJ1dCBmb3JjZXMgYSBsb2FkLgogCSAqLwotCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAotCSAgICAgICAiTVREICVzKCk6IGNoZWNrIElEJ3MgZGlzYXBwZWFyIHdoZW4gbm90IGluIElEIG1vZGVcbiIsCisJcHJfZGVidWcoIk1URCAlcygpOiBjaGVjayBJRCdzIGRpc2FwcGVhciB3aGVuIG5vdCBpbiBJRCBtb2RlXG4iLAogCSAgICAgICBfX2Z1bmNfXyApOwogCWplZGVjX3Jlc2V0KCBiYXNlLCBtYXAsIGNmaSApOwogCW1mciA9IGplZGVjX3JlYWRfbWZyKCBtYXAsIGJhc2UsIGNmaSApOwogCWlkID0gamVkZWNfcmVhZF9pZCggbWFwLCBiYXNlLCBjZmkgKTsKIAlpZiAoIG1mciA9PSBjZmktPm1mciAmJiBpZCA9PSBjZmktPmlkICkgewotCQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKLQkJICAgICAgICJNVEQgJXMoKTogSUQgMHglLjJ4OjB4JS4yeCBkaWQgbm90IGNoYW5nZSBhZnRlciByZXNldDpcbiIKKwkJcHJfZGVidWcoIk1URCAlcygpOiBJRCAweCUuMng6MHglLjJ4IGRpZCBub3QgY2hhbmdlIGFmdGVyIHJlc2V0OlxuIgogCQkgICAgICAgIllvdSBtaWdodCBuZWVkIHRvIG1hbnVhbGx5IHNwZWNpZnkgSkVERUMgcGFyYW1ldGVycy5cbiIsCiAJCQlfX2Z1bmNfXywgY2ZpLT5tZnIsIGNmaS0+aWQgKTsKIAkJZ290byBtYXRjaF9kb25lOwpAQCAtMjEwNCw3ICsyMDk4LDcgQEAKIAkgKiBQdXQgdGhlIGRldmljZSBiYWNrIGluIElEIG1vZGUgLSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZQogCSAqIHdlcmUgdHJ1bHkgZnJvYmJpbmcgYSByZWFsIGRldmljZS4KIAkgKi8KLQlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiByZXR1cm4gdG8gSUQgbW9kZVxuIiwgX19mdW5jX18gKTsKKwlwcl9kZWJ1ZygiTVREICVzKCk6IHJldHVybiB0byBJRCBtb2RlXG4iLCBfX2Z1bmNfXyApOwogCWlmIChjZmktPmFkZHJfdW5sb2NrMSkgewogCQljZmlfc2VuZF9nZW5fY21kKDB4YWEsIGNmaS0+YWRkcl91bmxvY2sxLCBiYXNlLCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGJhc2UsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKQEAgLTIxNjcsMTMgKzIxNjEsMTEgQEAKIAogCQljZmktPm1mciA9IGplZGVjX3JlYWRfbWZyKG1hcCwgYmFzZSwgY2ZpKTsKIAkJY2ZpLT5pZCA9IGplZGVjX3JlYWRfaWQobWFwLCBiYXNlLCBjZmkpOwotCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLAotCQkgICAgICAiU2VhcmNoIGZvciBpZDooJTAyeCAlMDJ4KSBpbnRlcmxlYXZlKCVkKSB0eXBlKCVkKVxuIiwKKwkJcHJfZGVidWcoIlNlYXJjaCBmb3IgaWQ6KCUwMnggJTAyeCkgaW50ZXJsZWF2ZSglZCkgdHlwZSglZClcbiIsCiAJCQljZmktPm1mciwgY2ZpLT5pZCwgY2ZpX2ludGVybGVhdmUoY2ZpKSwgY2ZpLT5kZXZpY2VfdHlwZSk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGplZGVjX3RhYmxlKTsgaSsrKSB7CiAJCQlpZiAoIGplZGVjX21hdGNoKCBiYXNlLCBtYXAsIGNmaSwgJmplZGVjX3RhYmxlW2ldICkgKSB7Ci0JCQkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCi0JCQkJICAgICAgICJNVEQgJXMoKTogbWF0Y2hlZCBkZXZpY2UgMHgleCwweCV4IHVubG9ja19hZGRyczogMHglLjR4IDB4JS40eFxuIiwKKwkJCQlwcl9kZWJ1ZygiTVREICVzKCk6IG1hdGNoZWQgZGV2aWNlIDB4JXgsMHgleCB1bmxvY2tfYWRkcnM6IDB4JS40eCAweCUuNHhcbiIsCiAJCQkJICAgICAgIF9fZnVuY19fLCBjZmktPm1mciwgY2ZpLT5pZCwKIAkJCQkgICAgICAgY2ZpLT5hZGRyX3VubG9jazEsIGNmaS0+YWRkcl91bmxvY2syICk7CiAJCQkJaWYgKCFjZmlfamVkZWNfc2V0dXAobWFwLCBjZmksIGkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKaW5kZXggZTc5MGYzOC4uZGRmOWVjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYworKysgYi9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBlcnJvciBtZXNzYWdlIHByZWZpeCAqLwogI2RlZmluZSBFUlJQICJtdGQ6ICIKQEAgLTE4OCwxMCArMTg5LDcgQEAKIAkJCSAgICAgZXh0cmFfbWVtX3NpemU7CiAJCXBhcnRzID0ga3phbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwYXJ0cykKLQkJewotCQkJcHJpbnRrKEtFUk5fRVJSIEVSUlAgIm91dCBvZiBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIE5VTEw7Ci0JCX0KIAkJZXh0cmFfbWVtID0gKHVuc2lnbmVkIGNoYXIgKikocGFydHMgKyAqbnVtX3BhcnRzKTsKIAl9CiAJLyogZW50ZXIgdGhpcyBwYXJ0aXRpb24gKG9mZnNldCB3aWxsIGJlIGNhbGN1bGF0ZWQgbGF0ZXIgaWYgaXQgaXMgemVybyBhdCB0aGlzIHBvaW50KSAqLwpAQCAtMzE2LDggKzMxNCw4IEBACiAgKiB0aGUgZmlyc3Qgb25lIGluIHRoZSBjaGFpbiBpZiBhIE5VTEwgbXRkX2lkIGlzIHBhc3NlZCBpbi4KICAqLwogc3RhdGljIGludCBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9yaWdpbikKKwkJCQkgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCisJCQkJICAgIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwppbmRleCAzNTA4MWNlLi4yODNkODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCkBAIC0yNDksNiArMjQ5LDE2IEBACiAJICB1bmRlciAiTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycyIgKGN1cnJlbnRseSB0aGF0IGRyaXZlciBkb2VzIG5vdAogCSAgc3VwcG9ydCBhbGwgTWlsbGVubml1bSBQbHVzIGRldmljZXMpLgogCitjb25maWcgTVREX0RPQ0czCisJdHJpc3RhdGUgIk0tU3lzdGVtcyBEaXNrLU9uLUNoaXAgRzMiCisJLS0taGVscC0tLQorCSAgVGhpcyBwcm92aWRlcyBhbiBNVEQgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE0tU3lzdGVtcyBEaXNrT25DaGlwCisJICBHMyBkZXZpY2VzLgorCisJICBUaGUgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0byBHMyBEaXNrT25DaGlwLCBkaXN0cmlidXRlZCBieQorCSAgTS1TeXN0ZW1zIGFuZCBub3cgU2FuZGlzay4gVGhlIHN1cHBvcnQgaXMgdmVyeSBleHBlcmltZW50YWwsCisJICBhbmQgZG9lc24ndCBnaXZlIGFjY2VzcyB0byBhbnkgd3JpdGUgb3BlcmF0aW9ucy4KKwogY29uZmlnIE1URF9ET0NQUk9CRQogCXRyaXN0YXRlCiAJc2VsZWN0IE1URF9ET0NFQ0MKQEAgLTI2OCw4ICsyNzgsNyBAQAogY29uZmlnIE1URF9ET0NQUk9CRV9BRERSRVNTCiAJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIG9mIERpc2tPbkNoaXAiIGlmIE1URF9ET0NQUk9CRV9BRFZBTkNFRAogCWRlcGVuZHMgb24gTVREX0RPQ1BST0JFCi0JZGVmYXVsdCAiMHgwMDAwIiBpZiBNVERfRE9DUFJPQkVfQURWQU5DRUQKLQlkZWZhdWx0ICIwIiBpZiAhTVREX0RPQ1BST0JFX0FEVkFOQ0VECisJZGVmYXVsdCAiMHgwIgogCS0tLWhlbHAtLS0KIAkgIEJ5IGRlZmF1bHQsIHRoZSBwcm9iZSBmb3IgRGlza09uQ2hpcCBkZXZpY2VzIHdpbGwgbG9vayBmb3IgYQogCSAgRGlza09uQ2hpcCBhdCBldmVyeSBtdWx0aXBsZSBvZiAweDIwMDAgYmV0d2VlbiAweEM4MDAwIGFuZCAweEVFMDAwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKaW5kZXggZjMyMjZiMS4uNTZjN2NkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogb2JqLSQoQ09ORklHX01URF9ET0MyMDAwKQkrPSBkb2MyMDAwLm8KIG9iai0kKENPTkZJR19NVERfRE9DMjAwMSkJKz0gZG9jMjAwMS5vCiBvYmotJChDT05GSUdfTVREX0RPQzIwMDFQTFVTKQkrPSBkb2MyMDAxcGx1cy5vCitvYmotJChDT05GSUdfTVREX0RPQ0czKQkJKz0gZG9jZzMubwogb2JqLSQoQ09ORklHX01URF9ET0NQUk9CRSkJKz0gZG9jcHJvYmUubwogb2JqLSQoQ09ORklHX01URF9ET0NFQ0MpCSs9IGRvY2VjYy5vCiBvYmotJChDT05GSUdfTVREX1NMUkFNKQkJKz0gc2xyYW0ubwpAQCAtMTcsMyArMTgsNSBAQAogb2JqLSQoQ09ORklHX01URF9EQVRBRkxBU0gpCSs9IG10ZF9kYXRhZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9NMjVQODApCSs9IG0yNXA4MC5vCiBvYmotJChDT05GSUdfTVREX1NTVDI1TCkJKz0gc3N0MjVsLm8KKworQ0ZMQUdTX2RvY2czLm8JCQkrPSAtSSQoc3JjKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKaW5kZXggZjdmYmY2MC4uZTlmYWQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKQEAgLTgyLDggKzgyLDcgQEAKIAl2b2lkIF9faW9tZW0gKmRvY3B0ciA9IGRvYy0+dmlydGFkcjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIChIWiAqIDEwKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JICAgICAgIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CisJcHJfZGVidWcoIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CiAKIAkvKiBPdXQtb2YtbGluZSByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaXAgcmVzcG9uc2UgKi8KIAl3aGlsZSAoIShSZWFkRE9DKGRvY3B0ciwgQ0RTTkNvbnRyb2wpICYgQ0RTTl9DVFJMX0ZSX0IpKSB7CkBAIC05Miw3ICs5MSw3IEBACiAJCURvQ19EZWxheShkb2MsIDIpOwogCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIl9Eb0NfV2FpdFJlYWR5IHRpbWVkIG91dC5cbiIpOworCQkJcHJfZGVidWcoIl9Eb0NfV2FpdFJlYWR5IHRpbWVkIG91dC5cbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJdWRlbGF5KDEpOwpAQCAtMzIzLDggKzMyMiw3IEBACiAKIAkvKiBSZXNldCB0aGUgY2hpcCAqLwogCWlmIChEb0NfQ29tbWFuZChkb2MsIE5BTkRfQ01EX1JFU0VULCBDRFNOX0NUUkxfV1ApKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JCSAgICAgICJEb0NfQ29tbWFuZCAocmVzZXQpIGZvciAlZCwlZCByZXR1cm5lZCB0cnVlXG4iLAorCQlwcl9kZWJ1ZygiRG9DX0NvbW1hbmQgKHJlc2V0KSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKIAkJICAgICAgZmxvb3IsIGNoaXApOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zMzIsOCArMzMwLDcgQEAKIAogCS8qIFJlYWQgdGhlIE5BTkQgY2hpcCBJRDogMS4gU2VuZCBSZWFkSUQgY29tbWFuZCAqLwogCWlmIChEb0NfQ29tbWFuZChkb2MsIE5BTkRfQ01EX1JFQURJRCwgQ0RTTl9DVFJMX1dQKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAotCQkgICAgICAiRG9DX0NvbW1hbmQgKFJlYWRJRCkgZm9yICVkLCVkIHJldHVybmVkIHRydWVcbiIsCisJCXByX2RlYnVnKCJEb0NfQ29tbWFuZCAoUmVhZElEKSBmb3IgJWQsJWQgcmV0dXJuZWQgdHJ1ZVxuIiwKIAkJICAgICAgZmxvb3IsIGNoaXApOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02OTksNyArNjk2LDcgQEAKICNpZmRlZiBFQ0NfREVCVUcKIAkJCXByaW50ayhLRVJOX0VSUiAiRGlza09uQ2hpcCBFQ0MgRXJyb3I6IFJlYWQgYXQgJWx4XG4iLCAobG9uZylmcm9tKTsKICNlbmRpZgotCQkJLyogUmVhZCB0aGUgRUNDIHN5bmRyb20gdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MKKwkJCS8qIFJlYWQgdGhlIEVDQyBzeW5kcm9tZSB0aHJvdWdoIHRoZSBEaXNrT25DaGlwIEVDQwogCQkJICAgbG9naWMuICBUaGVzZSBzeW5kcm9tZSB3aWxsIGJlIGFsbCBaRVJPIHdoZW4gdGhlcmUKIAkJCSAgIGlzIG5vIGVycm9yICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CkBAIC05MzAsNyArOTI3LDcgQEAKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5sZW47CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJb2ZzICs9IG9wcy0+b29ib2ZmczsKIApAQCAtMTA5NCw3ICsxMDkxLDcgQEAKIAlzdHJ1Y3QgRGlza09uQ2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKIAlpbnQgcmV0OwogCi0JQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT09CX1BMQUNFKTsKKwlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PUFNfUExBQ0VfT09CKTsKIAogCW11dGV4X2xvY2soJnRoaXMtPmxvY2spOwogCXJldCA9IGRvY193cml0ZV9vb2Jfbm9sb2NrKG10ZCwgb2ZzICsgb3BzLT5vb2JvZmZzLCBvcHMtPmxlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKaW5kZXggMjQxMTkyZi4uYTNmN2EyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxLmMKQEAgLTU1LDE1ICs1NSwxNCBAQAogewogCXVuc2lnbmVkIHNob3J0IGMgPSAweGZmZmY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLAotCSAgICAgICJfRG9DX1dhaXRSZWFkeSBjYWxsZWQgZm9yIG91dC1vZi1saW5lIHdhaXRcbiIpOworCXByX2RlYnVnKCJfRG9DX1dhaXRSZWFkeSBjYWxsZWQgZm9yIG91dC1vZi1saW5lIHdhaXRcbiIpOwogCiAJLyogT3V0LW9mLWxpbmUgcm91dGluZSB0byB3YWl0IGZvciBjaGlwIHJlc3BvbnNlICovCiAJd2hpbGUgKCEoUmVhZERPQyhkb2NwdHIsIENEU05Db250cm9sKSAmIENEU05fQ1RSTF9GUl9CKSAmJiAtLWMpCiAJCTsKIAogCWlmIChjID09IDApCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJfRG9DX1dhaXRSZWFkeSB0aW1lZCBvdXQuXG4iKTsKKwkJcHJfZGVidWcoIl9Eb0NfV2FpdFJlYWR5IHRpbWVkIG91dC5cbiIpOwogCiAJcmV0dXJuIChjID09IDApOwogfQpAQCAtNDY0LDcgKzQ2Myw3IEBACiAjaWZkZWYgRUNDX0RFQlVHCiAJCXByaW50aygiRGlza09uQ2hpcCBFQ0MgRXJyb3I6IFJlYWQgYXQgJWx4XG4iLCAobG9uZylmcm9tKTsKICNlbmRpZgotCQkvKiBSZWFkIHRoZSBFQ0Mgc3luZHJvbSB0aHJvdWdoIHRoZSBEaXNrT25DaGlwIEVDQyBsb2dpYy4KKwkJLyogUmVhZCB0aGUgRUNDIHN5bmRyb21lIHRocm91Z2ggdGhlIERpc2tPbkNoaXAgRUNDIGxvZ2ljLgogCQkgICBUaGVzZSBzeW5kcm9tZSB3aWxsIGJlIGFsbCBaRVJPIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3IgKi8KIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQkJc3luZHJvbWVbaV0gPSBSZWFkRE9DKGRvY3B0ciwgRUNDU3luZHJvbWUwICsgaSk7CkBAIC02MzIsNyArNjMxLDcgQEAKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5sZW47CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJb2ZzICs9IG9wcy0+b29ib2ZmczsKIApAQCAtNjkwLDcgKzY4OSw3IEBACiAJdWludDhfdCAqYnVmID0gb3BzLT5vb2JidWY7CiAJc2l6ZV90IGxlbiA9IG9wcy0+bGVuOwogCi0JQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT09CX1BMQUNFKTsKKwlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PUFNfUExBQ0VfT09CKTsKIAogCW9mcyArPSBvcHMtPm9vYm9mZnM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYwppbmRleCAwOWFlMGFkLi45OTM1MWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jCkBAIC02MSwxNSArNjEsMTQgQEAKIHsKIAl1bnNpZ25lZCBpbnQgYyA9IDB4ZmZmZjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JICAgICAgIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CisJcHJfZGVidWcoIl9Eb0NfV2FpdFJlYWR5IGNhbGxlZCBmb3Igb3V0LW9mLWxpbmUgd2FpdFxuIik7CiAKIAkvKiBPdXQtb2YtbGluZSByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaXAgcmVzcG9uc2UgKi8KIAl3aGlsZSAoKChSZWFkRE9DKGRvY3B0ciwgTXBsdXNfRmxhc2hDb250cm9sKSAmIENEU05fQ1RSTF9GUl9CX01BU0spICE9IENEU05fQ1RSTF9GUl9CX01BU0spICYmIC0tYykKIAkJOwogCiAJaWYgKGMgPT0gMCkKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIl9Eb0NfV2FpdFJlYWR5IHRpbWVkIG91dC5cbiIpOworCQlwcl9kZWJ1ZygiX0RvQ19XYWl0UmVhZHkgdGltZWQgb3V0LlxuIik7CiAKIAlyZXR1cm4gKGMgPT0gMCk7CiB9CkBAIC02NTUsNyArNjU0LDcgQEAKICNpZmRlZiBFQ0NfREVCVUcKIAkJcHJpbnRrKCJEaXNrT25DaGlwIEVDQyBFcnJvcjogUmVhZCBhdCAlbHhcbiIsIChsb25nKWZyb20pOwogI2VuZGlmCi0JCS8qIFJlYWQgdGhlIEVDQyBzeW5kcm9tIHRocm91Z2ggdGhlIERpc2tPbkNoaXAgRUNDIGxvZ2ljLgorCQkvKiBSZWFkIHRoZSBFQ0Mgc3luZHJvbWUgdGhyb3VnaCB0aGUgRGlza09uQ2hpcCBFQ0MgbG9naWMuCiAJCSAgIFRoZXNlIHN5bmRyb21lIHdpbGwgYmUgYWxsIFpFUk8gd2hlbiB0aGVyZSBpcyBubyBlcnJvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJc3luZHJvbWVbaV0gPSBSZWFkRE9DKGRvY3B0ciwgTXBsdXNfRUNDU3luZHJvbWUwICsgaSk7CkBAIC04MzUsNyArODM0LDcgQEAKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5sZW47CiAKLQlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PT0JfUExBQ0UpOworCUJVR19PTihvcHMtPm1vZGUgIT0gTVREX09QU19QTEFDRV9PT0IpOwogCiAJb2ZzICs9IG9wcy0+b29ib2ZmczsKIApAQCAtOTIwLDcgKzkxOSw3IEBACiAJdWludDhfdCAqYnVmID0gb3BzLT5vb2JidWY7CiAJc2l6ZV90IGxlbiA9IG9wcy0+bGVuOwogCi0JQlVHX09OKG9wcy0+bW9kZSAhPSBNVERfT09CX1BMQUNFKTsKKwlCVUdfT04ob3BzLT5tb2RlICE9IE1URF9PUFNfUExBQ0VfT09CKTsKIAogCW9mcyArPSBvcHMtPm9vYm9mZnM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZWNjLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2VjYy5jCmluZGV4IDM3ZWYyOWEuLjRhMWMzOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZWNjLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NlY2MuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEVDQyBhbGdvcml0aG0gZm9yIE0tc3lzdGVtcyBkaXNrIG9uIGNoaXAuIFdlIHVzZSB0aGUgZXhjZWxsZW50IFJlZWQKICAqIFNvbG1vbiBjb2RlIG9mIFBoaWwgS2FybiAoa2FybkBrYTlxLmFtcHIub3JnKSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiBHTlUgR1BMIExpY2Vuc2UuIFRoZSByZXN0IGlzIHNpbXBseSB0byBjb252ZXJ0IHRoZSBkaXNrIG9uIGNoaXAKLSAqIHN5bmRyb20gaW50byBhIHN0YW5kYXJkIHN5bmRvbS4KKyAqIHN5bmRyb21lIGludG8gYSBzdGFuZGFyZCBzeW5kb21lLgogICoKICAqIEF1dGhvcjogRmFicmljZSBCZWxsYXJkIChmYWJyaWNlLmJlbGxhcmRAbmV0Z2VtLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMCBOZXRnZW0gUy5BLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NnMy5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NnMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkY2Y1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY2czLmMKQEAgLTAsMCArMSwxMTE0IEBACisvKgorICogSGFuZGxlcyB0aGUgTS1TeXN0ZW1zIERpc2tPbkNoaXAgRzMgY2hpcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSb2JlcnQgSmFyem1paworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJkb2NnMy5oIgorCisvKgorICogVGhpcyBkcml2ZXIgaGFuZGxlcyB0aGUgRGlza09uQ2hpcCBHMyBmbGFzaCBtZW1vcnkuCisgKgorICogQXMgbm8gc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgZnJvbSBNLVN5c3RlbXMvU2FuZGlzaywgdGhpcyBkcml2ZXJzIGxhY2tzCisgKiBzZXZlcmFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgb24gdGhlIGNoaXAsIGFzIDoKKyAqICAtIGJsb2NrIGVyYXNlCisgKiAgLSBwYWdlIHdyaXRlCisgKiAgLSBJUEwgd3JpdGUKKyAqICAtIEVDQyBmaXhpbmcgKGxhY2sgb2YgQkNIIGFsZ29yaXRoIHVuZGVyc3RhbmRpbmcpCisgKiAgLSBwb3dlcmRvd24gLyBwb3dlcnVwCisgKgorICogVGhlIGJ1cyBkYXRhIHdpZHRoICg4Yml0cyB2ZXJzdXMgMTZiaXRzKSBpcyBub3QgaGFuZGxlZCAoaWZfY2ZnIGZsYWcpLCBhbmQKKyAqIHRoZSBkcml2ZXIgYXNzdW1lcyBhIDE2Yml0cyBkYXRhIGJ1cy4KKyAqCisgKiBEb2NHMyByZWxpZXMgb24gMiBFQ0MgYWxnb3JpdGhtcywgd2hpY2ggYXJlIGhhbmRsZWQgaW4gaGFyZHdhcmUgOgorICogIC0gYSAxIGJ5dGUgSGFtbWluZyBjb2RlIHN0b3JlZCBpbiB0aGUgT09CIGZvciBlYWNoIHBhZ2UKKyAqICAtIGEgNyBieXRlcyBCQ0ggY29kZSBzdG9yZWQgaW4gdGhlIE9PQiBmb3IgZWFjaCBwYWdlCisgKiBUaGUgQkNIIHBhcnQgaXMgb25seSB1c2VkIGZvciBjaGVjayBwdXJwb3NlLCBubyBjb3JyZWN0aW9uIGlzIGF2YWlsYWJsZSBhcworICogc29tZSBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nLiBXaGF0IGlzIGtub3duIGlzIHRoYXQgOgorICogIC0gQkNIIGlzIGluIEdGKDJeMTQpCisgKiAgLSBCQ0ggaXMgb3ZlciBkYXRhIG9mIDUyMCBieXRlcyAoNTEyIHBhZ2UgKyA3IHBhZ2VfaW5mbyBieXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSBoYW1taW5nIGJ5dGUpCisgKiAgLSBCQ0ggY2FuIGNvcnJlY3QgdXAgdG8gNCBiaXRzICh0ID0gNCkKKyAqICAtIEJDSCBzeW5kcm9tcyBhcmUgY2FsY3VsYXRlZCBpbiBoYXJkd2FyZSwgYW5kIGNoZWNrZWQgaW4gaGFyZHdhcmUgYXMgd2VsbAorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHU4IGRvY19yZWFkYihzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1MTYgcmVnKQoreworCXU4IHZhbCA9IHJlYWRiKGRvY2czLT5iYXNlICsgcmVnKTsKKworCXRyYWNlX2RvY2czX2lvKDAsIDgsIHJlZywgKGludCl2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGRvY19yZWFkdyhzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1MTYgcmVnKQoreworCXUxNiB2YWwgPSByZWFkdyhkb2NnMy0+YmFzZSArIHJlZyk7CisKKwl0cmFjZV9kb2NnM19pbygwLCAxNiwgcmVnLCAoaW50KXZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvY193cml0ZWIoc3RydWN0IGRvY2czICpkb2NnMywgdTggdmFsLCB1MTYgcmVnKQoreworCXdyaXRlYih2YWwsIGRvY2czLT5iYXNlICsgcmVnKTsKKwl0cmFjZV9kb2NnM19pbygxLCAxNiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9jX3dyaXRldyhzdHJ1Y3QgZG9jZzMgKmRvY2czLCB1MTYgdmFsLCB1MTYgcmVnKQoreworCXdyaXRldyh2YWwsIGRvY2czLT5iYXNlICsgcmVnKTsKKwl0cmFjZV9kb2NnM19pbygxLCAxNiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9jX2ZsYXNoX2NvbW1hbmQoc3RydWN0IGRvY2czICpkb2NnMywgdTggY21kKQoreworCWRvY193cml0ZWIoZG9jZzMsIGNtZCwgRE9DX0ZMQVNIQ09NTUFORCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb2NfZmxhc2hfc2VxdWVuY2Uoc3RydWN0IGRvY2czICpkb2NnMywgdTggc2VxKQoreworCWRvY193cml0ZWIoZG9jZzMsIHNlcSwgRE9DX0ZMQVNIU0VRVUVOQ0UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9jX2ZsYXNoX2FkZHJlc3Moc3RydWN0IGRvY2czICpkb2NnMywgdTggYWRkcikKK3sKKwlkb2Nfd3JpdGViKGRvY2czLCBhZGRyLCBET0NfRkxBU0hBRERSRVNTKTsKK30KKworc3RhdGljIGNoYXIgY29uc3QgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsICJzYWZ0bHBhcnQiLCBOVUxMIH07CisKK3N0YXRpYyBpbnQgZG9jX3JlZ2lzdGVyX3JlYWRiKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCByZWcpCit7CisJdTggdmFsOworCisJZG9jX3dyaXRldyhkb2NnMywgcmVnLCBET0NfUkVBREFERFJFU1MpOworCXZhbCA9IGRvY19yZWFkYihkb2NnMywgcmVnKTsKKwlkb2NfdmRiZygiUmVhZCByZWdpc3RlciAlMDR4IDogJTAyeFxuIiwgcmVnLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgZG9jX3JlZ2lzdGVyX3JlYWR3KHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCByZWcpCit7CisJdTE2IHZhbDsKKworCWRvY193cml0ZXcoZG9jZzMsIHJlZywgRE9DX1JFQURBRERSRVNTKTsKKwl2YWwgPSBkb2NfcmVhZHcoZG9jZzMsIHJlZyk7CisJZG9jX3ZkYmcoIlJlYWQgcmVnaXN0ZXIgJTA0eCA6ICUwNHhcbiIsIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCisvKioKKyAqIGRvY19kZWxheSAtIGRlbGF5IGRvY2czIG9wZXJhdGlvbnMKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQG5iTk9QczogdGhlIG51bWJlciBvZiBOT1BzIHRvIGlzc3VlCisgKgorICogQXMgbm8gc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUsIHRoZSByaWdodCB0aW1pbmdzIGJldHdlZW4gY2hpcCBjb21tYW5kcyBhcmUKKyAqIHVua25vd24uIFRoZSBvbmx5IGF2YWlsYWJsZSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBhcmUgdGhlIG9ic2VydmVkIG5vcHMgb24gYQorICogd29ya2luZyBkb2NnMyBjaGlwLgorICogVGhlcmVmb3JlLCBkb2NfZGVsYXkgcmVsaWVzIG9uIGEgYnVzeSBsb29wIG9mIE5PUHMsIGluc3RlYWQgb2Ygc2NoZWR1bGVyCisgKiBmcmllbmRsaWVyIG1zbGVlcCgpIGZ1bmN0aW9ucyBvciBibG9ja2luZyBtZGVsYXkoKS4KKyAqLworc3RhdGljIHZvaWQgZG9jX2RlbGF5KHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBuYk5PUHMpCit7CisJaW50IGk7CisKKwlkb2NfZGJnKCJOT1AgeCAlZFxuIiwgbmJOT1BzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJOT1BzOyBpKyspCisJCWRvY193cml0ZWIoZG9jZzMsIDAsIERPQ19OT1ApOworfQorCitzdGF0aWMgaW50IGlzX3Byb3Rfc2VxX2Vycm9yKHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IGN0cmw7CisKKwljdHJsID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRkxBU0hDT05UUk9MKTsKKwlyZXR1cm4gY3RybCAmIChET0NfQ1RSTF9QUk9URUNUSU9OX0VSUk9SIHwgRE9DX0NUUkxfU0VRVUVOQ0VfRVJST1IpOworfQorCitzdGF0aWMgaW50IGRvY19pc19yZWFkeShzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCWludCBjdHJsOworCisJY3RybCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0ZMQVNIQ09OVFJPTCk7CisJcmV0dXJuIGN0cmwgJiBET0NfQ1RSTF9GTEFTSFJFQURZOworfQorCitzdGF0aWMgaW50IGRvY193YWl0X3JlYWR5KHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IG1heFdhaXRDeWNsZXMgPSAxMDA7CisKKwlkbyB7CisJCWRvY19kZWxheShkb2NnMywgNCk7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKCFkb2NfaXNfcmVhZHkoZG9jZzMpICYmIG1heFdhaXRDeWNsZXMtLSk7CisJZG9jX2RlbGF5KGRvY2czLCAyKTsKKwlpZiAobWF4V2FpdEN5Y2xlcyA+IDApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgZG9jX3Jlc2V0X3NlcShzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCWludCByZXQ7CisKKwlkb2Nfd3JpdGViKGRvY2czLCAweDEwLCBET0NfRkxBU0hDT05UUk9MKTsKKwlkb2NfZmxhc2hfc2VxdWVuY2UoZG9jZzMsIERPQ19TRVFfUkVTRVQpOworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1JFU0VUKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCXJldCA9IGRvY193YWl0X3JlYWR5KGRvY2czKTsKKworCWRvY19kYmcoImRvY19yZXNldF9zZXEoKSAtPiBpc1JlYWR5PSVzXG4iLCByZXQgPyAiZmFsc2UiIDogInRydWUiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRvY19yZWFkX2RhdGFfYXJlYSAtIFJlYWQgZGF0YSBmcm9tIGRhdGEgYXJlYQorICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIGZpbGwgaW4KKyAqIEBsZW46IHRoZSBsZW5naHQgdG8gcmVhZAorICogQGZpcnN0OiBmaXJzdCB0aW1lIHJlYWQsIERPQ19SRUFEQUREUkVTUyBzaG91bGQgYmUgc2V0CisgKgorICogUmVhZHMgYnl0ZXMgZnJvbSBmbGFzaCBkYXRhLiBIYW5kbGVzIHRoZSBzaW5nbGUgYnl0ZSAvIGV2ZW4gYnl0ZXMgcmVhZHMuCisgKi8KK3N0YXRpYyB2b2lkIGRvY19yZWFkX2RhdGFfYXJlYShzdHJ1Y3QgZG9jZzMgKmRvY2czLCB2b2lkICpidWYsIGludCBsZW4sCisJCQkgICAgICAgaW50IGZpcnN0KQoreworCWludCBpLCBjZHIsIGxlbjQ7CisJdTE2IGRhdGExNiwgKmRzdDE2OworCXU4IGRhdGE4LCAqZHN0ODsKKworCWRvY19kYmcoImRvY19yZWFkX2RhdGFfYXJlYShidWY9JXAsIGxlbj0lZClcbiIsIGJ1ZiwgbGVuKTsKKwljZHIgPSBsZW4gJiAweDM7CisJbGVuNCA9IGxlbiAtIGNkcjsKKworCWlmIChmaXJzdCkKKwkJZG9jX3dyaXRldyhkb2NnMywgRE9DX0lPU1BBQ0VfREFUQSwgRE9DX1JFQURBRERSRVNTKTsKKwlkc3QxNiA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuNDsgaSArPSAyKSB7CisJCWRhdGExNiA9IGRvY19yZWFkdyhkb2NnMywgRE9DX0lPU1BBQ0VfREFUQSk7CisJCSpkc3QxNiA9IGRhdGExNjsKKwkJZHN0MTYrKzsKKwl9CisKKwlpZiAoY2RyKSB7CisJCWRvY193cml0ZXcoZG9jZzMsIERPQ19JT1NQQUNFX0RBVEEgfCBET0NfUkVBREFERFJfT05FX0JZVEUsCisJCQkgICBET0NfUkVBREFERFJFU1MpOworCQlkb2NfZGVsYXkoZG9jZzMsIDEpOworCQlkc3Q4ID0gKHU4ICopZHN0MTY7CisJCWZvciAoaSA9IDA7IGkgPCBjZHI7IGkrKykgeworCQkJZGF0YTggPSBkb2NfcmVhZGIoZG9jZzMsIERPQ19JT1NQQUNFX0RBVEEpOworCQkJKmRzdDggPSBkYXRhODsKKwkJCWRzdDgrKzsKKwkJfQorCX0KK30KKworLyoqCisgKiBkb2Nfc2V0X2RhdGFfbW9kZSAtIFNldHMgdGhlIGZsYXNoIHRvIHJlbGlhYmxlIGRhdGEgbW9kZQorICogQGRvY2czOiB0aGUgZGV2aWNlCisgKgorICogVGhlIHJlbGlhYmxlIGRhdGEgbW9kZSBpcyBhIGJpdCBzbG93ZXIgdGhhbiB0aGUgZmFzdCBtb2RlLCBidXQgbGVzcyBlcnJvcnMKKyAqIG9jY3VyLiAgRW50ZXJpbmcgdGhlIHJlbGlhYmxlIG1vZGUgY2Fubm90IGJlIGRvbmUgd2l0aG91dCBlbnRlcmluZyB0aGUgZmFzdAorICogbW9kZSBmaXJzdC4KKyAqLworc3RhdGljIHZvaWQgZG9jX3NldF9yZWxpYWJsZV9tb2RlKHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJZG9jX2RiZygiZG9jX3NldF9yZWxpYWJsZV9tb2RlKClcbiIpOworCWRvY19mbGFzaF9zZXF1ZW5jZShkb2NnMywgRE9DX1NFUV9TRVRfTU9ERSk7CisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfRkFTVF9NT0RFKTsKKwlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9SRUxJQUJMRV9NT0RFKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworfQorCisvKioKKyAqIGRvY19zZXRfYXNpY19tb2RlIC0gU2V0IHRoZSBBU0lDIG1vZGUKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQG1vZGU6IHRoZSBtb2RlCisgKgorICogVGhlIEFTSUMgY2FuIHdvcmsgaW4gMyBtb2RlcyA6CisgKiAgLSBSRVNFVDogYWxsIHJlZ2lzdGVycyBhcmUgemVyb2VkCisgKiAgLSBOT1JNQUw6IHJlY2VpdmVzIGFuZCBoYW5kbGVzIGNvbW1hbmRzCisgKiAgLSBQT1dFUkRPV046IG1pbmltYWwgcG93ZXJ1c2UsIGZsYXNoIHBhcnRzIHNodXQgb2ZmCisgKi8KK3N0YXRpYyB2b2lkIGRvY19zZXRfYXNpY19tb2RlKHN0cnVjdCBkb2NnMyAqZG9jZzMsIHU4IG1vZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJZG9jX3JlYWRiKGRvY2czLCBET0NfSU9TUEFDRV9JUEwpOworCisJbW9kZSB8PSBET0NfQVNJQ01PREVfTURXUkVOOworCWRvY19kYmcoImRvY19zZXRfYXNpY19tb2RlKCUwMngpXG4iLCBtb2RlKTsKKwlkb2Nfd3JpdGViKGRvY2czLCBtb2RlLCBET0NfQVNJQ01PREUpOworCWRvY193cml0ZWIoZG9jZzMsIH5tb2RlLCBET0NfQVNJQ01PREVDT05GSVJNKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDEpOworfQorCisvKioKKyAqIGRvY19zZXRfZGV2aWNlX2lkIC0gU2V0cyB0aGUgZGV2aWNlcyBpZCBmb3IgY2FzY2FkZWQgRzMgY2hpcHMKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQGlkOiB0aGUgY2hpcCB0byBzZWxlY3QgKGFtb25nc3QgMCwgMSwgMiwgMykKKyAqCisgKiBUaGVyZSBjYW4gYmUgNCBjYXNjYWRlZCBHMyBjaGlwcy4gVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHRoZSBvbmUgd2hpY2ggd2lsbAorICogc2hvdWxkIGJlIHRoZSBhY3RpdmUgb25lLgorICovCitzdGF0aWMgdm9pZCBkb2Nfc2V0X2RldmljZV9pZChzdHJ1Y3QgZG9jZzMgKmRvY2czLCBpbnQgaWQpCit7CisJdTggY3RybDsKKworCWRvY19kYmcoImRvY19zZXRfZGV2aWNlX2lkKCVkKVxuIiwgaWQpOworCWRvY193cml0ZWIoZG9jZzMsIGlkLCBET0NfREVWSUNFU0VMRUNUKTsKKwljdHJsID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRkxBU0hDT05UUk9MKTsKKworCWN0cmwgJj0gfkRPQ19DVFJMX1ZJT0xBVElPTjsKKwljdHJsIHw9IERPQ19DVFJMX0NFOworCWRvY193cml0ZWIoZG9jZzMsIGN0cmwsIERPQ19GTEFTSENPTlRST0wpOworfQorCisvKioKKyAqIGRvY19zZXRfZXh0cmFfcGFnZV9tb2RlIC0gQ2hhbmdlIGZsYXNoIHBhZ2UgbGF5b3V0CisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqCisgKiBOb3JtYWxseSwgdGhlIGZsYXNoIHBhZ2UgaXMgc3BsaXQgaW50byB0aGUgZGF0YSAoNTEyIGJ5dGVzKSBhbmQgdGhlIG91dCBvZgorICogYmFuZCBkYXRhICgxNiBieXRlcykuIEZvciBlYWNoLCA0IG1vcmUgYnl0ZXMgY2FuIGJlIGFjY2Vzc2VkLCB3aGVyZSB0aGUgd2VhcgorICogbGV2ZWxpbmcgY291bnRlcnMgYXJlIHN0b3JlZC4gIFRvIGFjY2VzcyB0aGlzIGxhc3QgYXJlYSBvZiA0IGJ5dGVzLCBhIHNwZWNpYWwKKyAqIG1vZGUgbXVzdCBiZSBpbnB1dCB0byB0aGUgZmxhc2ggQVNJQy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgbm8gZXJyb3Igb2NjdXJlZCwgLUVJTyBlbHNlLgorICovCitzdGF0aWMgaW50IGRvY19zZXRfZXh0cmFfcGFnZV9tb2RlKHN0cnVjdCBkb2NnMyAqZG9jZzMpCit7CisJaW50IGZjdHJsOworCisJZG9jX2RiZygiZG9jX3NldF9leHRyYV9wYWdlX21vZGUoKVxuIik7CisJZG9jX2ZsYXNoX3NlcXVlbmNlKGRvY2czLCBET0NfU0VRX1BBR0VfU0laRV81MzIpOworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1BBR0VfU0laRV81MzIpOworCWRvY19kZWxheShkb2NnMywgMik7CisKKwlmY3RybCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0ZMQVNIQ09OVFJPTCk7CisJaWYgKGZjdHJsICYgKERPQ19DVFJMX1BST1RFQ1RJT05fRVJST1IgfCBET0NfQ1RSTF9TRVFVRU5DRV9FUlJPUikpCisJCXJldHVybiAtRUlPOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZG9jX3NlZWsgLSBTZXQgYm90aCBmbGFzaCBwbGFuZXMgdG8gdGhlIHNwZWNpZmllZCBibG9jaywgcGFnZSBmb3IgcmVhZGluZworICogQGRvY2czOiB0aGUgZGV2aWNlCisgKiBAYmxvY2swOiB0aGUgZmlyc3QgcGxhbmUgYmxvY2sgaW5kZXgKKyAqIEBibG9jazE6IHRoZSBzZWNvbmQgcGxhbmUgYmxvY2sgaW5kZXgKKyAqIEBwYWdlOiB0aGUgcGFnZSBpbmRleCB3aXRoaW4gdGhlIGJsb2NrCisgKiBAd2VhcjogaWYgdHJ1ZSwgcmVhZCB3aWxsIG9jY3VyIG9uIHRoZSA0IGV4dHJhIGJ5dGVzIG9mIHRoZSB3ZWFyIGFyZWEKKyAqIEBvZnM6IG9mZnNldCBpbiBwYWdlIHRvIHJlYWQKKyAqCisgKiBQcm9ncmFtcyB0aGUgZmxhc2ggZXZlbiBhbmQgb2RkIHBsYW5lcyB0byB0aGUgc3BlY2lmaWMgYmxvY2sgYW5kIHBhZ2UuCisgKiBBbHRlcm5hdGl2ZWx5LCBwcm9ncmFtcyB0aGUgZmxhc2ggdG8gdGhlIHdlYXIgYXJlYSBvZiB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgZG9jX3JlYWRfc2VlayhzdHJ1Y3QgZG9jZzMgKmRvY2czLCBpbnQgYmxvY2swLCBpbnQgYmxvY2sxLCBpbnQgcGFnZSwKKwkJCSBpbnQgd2VhciwgaW50IG9mcykKK3sKKwlpbnQgc2VjdG9yLCByZXQgPSAwOworCisJZG9jX2RiZygiZG9jX3NlZWsoYmxvY2tzPSglZCwlZCksIHBhZ2U9JWQsIG9mcz0lZCwgd2Vhcj0lZClcbiIsCisJCWJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZnMsIHdlYXIpOworCisJaWYgKCF3ZWFyICYmIChvZnMgPCAyICogRE9DX0xBWU9VVF9QQUdFX1NJWkUpKSB7CisJCWRvY19mbGFzaF9zZXF1ZW5jZShkb2NnMywgRE9DX1NFUV9TRVRfUExBTkUxKTsKKwkJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUkVBRF9QTEFORTEpOworCQlkb2NfZGVsYXkoZG9jZzMsIDIpOworCX0gZWxzZSB7CisJCWRvY19mbGFzaF9zZXF1ZW5jZShkb2NnMywgRE9DX1NFUV9TRVRfUExBTkUyKTsKKwkJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUkVBRF9QTEFORTIpOworCQlkb2NfZGVsYXkoZG9jZzMsIDIpOworCX0KKworCWRvY19zZXRfcmVsaWFibGVfbW9kZShkb2NnMyk7CisJaWYgKHdlYXIpCisJCXJldCA9IGRvY19zZXRfZXh0cmFfcGFnZV9tb2RlKGRvY2czKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXNlY3RvciA9IChibG9jazAgPDwgRE9DX0FERFJfQkxPQ0tfU0hJRlQpICsgKHBhZ2UgJiBET0NfQUREUl9QQUdFX01BU0spOworCWRvY19mbGFzaF9zZXF1ZW5jZShkb2NnMywgRE9DX1NFUV9SRUFEKTsKKwlkb2NfZmxhc2hfY29tbWFuZChkb2NnMywgRE9DX0NNRF9QUk9HX0JMT0NLX0FERFIpOworCWRvY19kZWxheShkb2NnMywgMSk7CisJZG9jX2ZsYXNoX2FkZHJlc3MoZG9jZzMsIHNlY3RvciAmIDB4ZmYpOworCWRvY19mbGFzaF9hZGRyZXNzKGRvY2czLCAoc2VjdG9yID4+IDgpICYgMHhmZik7CisJZG9jX2ZsYXNoX2FkZHJlc3MoZG9jZzMsIChzZWN0b3IgPj4gMTYpICYgMHhmZik7CisJZG9jX2RlbGF5KGRvY2czLCAxKTsKKworCXNlY3RvciA9IChibG9jazEgPDwgRE9DX0FERFJfQkxPQ0tfU0hJRlQpICsgKHBhZ2UgJiBET0NfQUREUl9QQUdFX01BU0spOworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1BST0dfQkxPQ0tfQUREUik7CisJZG9jX2RlbGF5KGRvY2czLCAxKTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgc2VjdG9yICYgMHhmZik7CisJZG9jX2ZsYXNoX2FkZHJlc3MoZG9jZzMsIChzZWN0b3IgPj4gOCkgJiAweGZmKTsKKwlkb2NfZmxhc2hfYWRkcmVzcyhkb2NnMywgKHNlY3RvciA+PiAxNikgJiAweGZmKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkb2NfcmVhZF9wYWdlX2VjY19pbml0IC0gSW5pdGlhbGl6ZSBoYXJkd2FyZSBFQ0MgZW5naW5lCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSB0aGUgRUNDIChCQ0ggY292ZXJlZCkKKyAqCisgKiBUaGUgZnVuY3Rpb24gZG9lcyBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBFQ0MgZW5naW5lIHRvIGNvbXB1dGUgdGhlIEhhbW1pbmcKKyAqIEVDQyAob24gMSBieXRlKSBhbmQgdGhlIEJDSCBTeW5kcm9tcyAob24gNyBieXRlcykuCisgKgorICogUmV0dXJuIDAgaWYgc3VjY2VlZGVkLCAtRUlPIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZG9jX3JlYWRfcGFnZV9lY2NfaW5pdChzdHJ1Y3QgZG9jZzMgKmRvY2czLCBpbnQgbGVuKQoreworCWRvY193cml0ZXcoZG9jZzMsIERPQ19FQ0NDT05GMF9SRUFEX01PREUKKwkJICAgfCBET0NfRUNDQ09ORjBfQkNIX0VOQUJMRSB8IERPQ19FQ0NDT05GMF9IQU1NSU5HX0VOQUJMRQorCQkgICB8IChsZW4gJiBET0NfRUNDQ09ORjBfREFUQV9CWVRFU19NQVNLKSwKKwkJICAgRE9DX0VDQ0NPTkYwKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDQpOworCWRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0ZMQVNIQ09OVFJPTCk7CisJcmV0dXJuIGRvY193YWl0X3JlYWR5KGRvY2czKTsKK30KKworLyoqCisgKiBkb2NfcmVhZF9wYWdlX3ByZXBhcmUgLSBQcmVwYXJlcyByZWFkaW5nIGRhdGEgZnJvbSBhIGZsYXNoIHBhZ2UKKyAqIEBkb2NnMzogdGhlIGRldmljZQorICogQGJsb2NrMDogdGhlIGZpcnN0IHBsYW5lIGJsb2NrIGluZGV4IG9uIGZsYXNoIG1lbW9yeQorICogQGJsb2NrMTogdGhlIHNlY29uZCBwbGFuZSBibG9jayBpbmRleCBvbiBmbGFzaCBtZW1vcnkKKyAqIEBwYWdlOiB0aGUgcGFnZSBpbmRleCBpbiB0aGUgYmxvY2sKKyAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgaW4gdGhlIHBhZ2UgKG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0KQorICoKKyAqIFByZXBhcmVzIHRoZSBwYWdlIHRvIGJlIHJlYWQgaW4gdGhlIGZsYXNoIG1lbW9yeSA6CisgKiAgIC0gdGVsbCBBU0lDIHRvIG1hcCB0aGUgZmxhc2ggcGFnZXMKKyAqICAgLSB0ZWxsIEFTSUMgdG8gYmUgaW4gcmVhZCBtb2RlCisgKgorICogQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kLCBhIGNhbGwgdG8gZG9jX3JlYWRfcGFnZV9maW5pc2ggaXMgbWFuZGF0b3J5LAorICogdG8gZW5kIHRoZSByZWFkIGN5Y2xlIG9mIHRoZSBmbGFzaC4KKyAqCisgKiBSZWFkIGRhdGEgZnJvbSBhIGZsYXNoIHBhZ2UuIFRoZSBsZW5ndGggdG8gYmUgcmVhZCBtdXN0IGJlIGJldHdlZW4gMCBhbmQKKyAqIChwYWdlX3NpemUgKyBvb2Jfc2l6ZSArIHdlYXJfc2l6ZSksIGllLiA1MzIsIGFuZCBhIG11bHRpcGxlIG9mIDQgKGJlY2F1c2UKKyAqIHRoZSBleHRyYSBieXRlcyByZWFkaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCkuCisgKgorICogQXMgcGFnZXMgYXJlIGdyb3VwZWQgYnkgMiAoaW4gMiBwbGFuZXMpLCByZWFkaW5nIGZyb20gYSBwYWdlIG11c3QgYmUgZG9uZQorICogaW4gdHdvIHN0ZXBzOgorICogIC0gb25lIHJlYWQgb2YgNTEyIGJ5dGVzIGF0IG9mZnNldCAwCisgKiAgLSBvbmUgcmVhZCBvZiA1MTIgYnl0ZXMgYXQgb2Zmc2V0IDUxMiArIDE2CisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC1FSU8gaWYgYSByZWFkIGVycm9yIG9jY3VyZWQuCisgKi8KK3N0YXRpYyBpbnQgZG9jX3JlYWRfcGFnZV9wcmVwYXJlKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCBibG9jazAsIGludCBibG9jazEsCisJCQkJIGludCBwYWdlLCBpbnQgb2Zmc2V0KQoreworCWludCB3ZWFyX2FyZWEgPSAwLCByZXQgPSAwOworCisJZG9jX2RiZygiZG9jX3JlYWRfcGFnZV9wcmVwYXJlKGJsb2Nrcz0oJWQsJWQpLCBwYWdlPSVkLCBvZnNJblBhZ2U9JWQpXG4iLAorCQlibG9jazAsIGJsb2NrMSwgcGFnZSwgb2Zmc2V0KTsKKwlpZiAob2Zmc2V0ID49IERPQ19MQVlPVVRfV0VBUl9PRkZTRVQpCisJCXdlYXJfYXJlYSA9IDE7CisJaWYgKCF3ZWFyX2FyZWEgJiYgb2Zmc2V0ID4gKERPQ19MQVlPVVRfUEFHRV9PT0JfU0laRSAqIDIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvY19zZXRfZGV2aWNlX2lkKGRvY2czLCBkb2NnMy0+ZGV2aWNlX2lkKTsKKwlyZXQgPSBkb2NfcmVzZXRfc2VxKGRvY2czKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIFByb2dyYW0gdGhlIGZsYXNoIGFkZHJlc3MgYmxvY2sgYW5kIHBhZ2UgKi8KKwlyZXQgPSBkb2NfcmVhZF9zZWVrKGRvY2czLCBibG9jazAsIGJsb2NrMSwgcGFnZSwgd2Vhcl9hcmVhLCBvZmZzZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJZG9jX2ZsYXNoX2NvbW1hbmQoZG9jZzMsIERPQ19DTURfUkVBRF9BTExfUExBTkVTKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDIpOworCWRvY193YWl0X3JlYWR5KGRvY2czKTsKKworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1NFVF9BRERSX1JFQUQpOworCWRvY19kZWxheShkb2NnMywgMSk7CisJaWYgKG9mZnNldCA+PSBET0NfTEFZT1VUX1BBR0VfU0laRSAqIDIpCisJCW9mZnNldCAtPSAyICogRE9DX0xBWU9VVF9QQUdFX1NJWkU7CisJZG9jX2ZsYXNoX2FkZHJlc3MoZG9jZzMsIG9mZnNldCA+PiAyKTsKKwlkb2NfZGVsYXkoZG9jZzMsIDEpOworCWRvY193YWl0X3JlYWR5KGRvY2czKTsKKworCWRvY19mbGFzaF9jb21tYW5kKGRvY2czLCBET0NfQ01EX1JFQURfRkxBU0gpOworCisJcmV0dXJuIDA7CitlcnI6CisJZG9jX3dyaXRlYihkb2NnMywgMCwgRE9DX0RBVEFFTkQpOworCWRvY19kZWxheShkb2NnMywgMik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICogZG9jX3JlYWRfcGFnZV9nZXRieXRlcyAtIFJlYWRzIGJ5dGVzIGZyb20gYSBwcmVwYXJlZCBwYWdlCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDQpCisgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCBpbgorICogQGZpcnN0OiAxIGlmIGZpcnN0IHRpbWUgcmVhZCwgRE9DX1JFQURBRERSRVNTIHNob3VsZCBiZSBzZXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgZG9jX3JlYWRfcGFnZV9nZXRieXRlcyhzdHJ1Y3QgZG9jZzMgKmRvY2czLCBpbnQgbGVuLCB1X2NoYXIgKmJ1ZiwKKwkJCQkgIGludCBmaXJzdCkKK3sKKwlkb2NfcmVhZF9kYXRhX2FyZWEoZG9jZzMsIGJ1ZiwgbGVuLCBmaXJzdCk7CisJZG9jX2RlbGF5KGRvY2czLCAyKTsKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGRvY19nZXRfaHdfYmNoX3N5bmRyb21zIC0gR2V0IGhhcmR3YXJlIGNhbGN1bGF0ZWQgQkNIIHN5bmRyb21zCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBzeW5zOiAgdGhlIGFycmF5IG9mIDcgaW50ZWdlcnMgd2hlcmUgdGhlIHN5bmRyb21zIHdpbGwgYmUgc3RvcmVkCisgKi8KK3N0YXRpYyB2b2lkIGRvY19nZXRfaHdfYmNoX3N5bmRyb21zKHN0cnVjdCBkb2NnMyAqZG9jZzMsIGludCAqc3lucykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBET0NfRUNDX0JDSF9TSVpFOyBpKyspCisJCXN5bnNbaV0gPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19CQ0hfU1lORFJPTShpKSk7Cit9CisKKy8qKgorICogZG9jX3JlYWRfcGFnZV9maW5pc2ggLSBFbmRzIHJlYWRpbmcgb2YgYSBmbGFzaCBwYWdlCisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqCisgKiBBcyBhIHNpZGUgZWZmZWN0LCByZXNldHMgdGhlIGNoaXAgc2VsZWN0b3IgdG8gMC4gVGhpcyBlbnN1cmVzIHRoYXQgYWZ0ZXIgZWFjaAorICogcmVhZCBvcGVyYXRpb24sIHRoZSBmbG9vciAwIGlzIHNlbGVjdGVkLiBUaGVyZWZvcmUsIGlmIHRoZSBzeXN0ZW1zIGhhbHRzLCB0aGUKKyAqIHJlYm9vdCB3aWxsIGJvb3Qgb24gZmxvb3IgMCwgd2hlcmUgdGhlIElQTCBpcy4KKyAqLworc3RhdGljIHZvaWQgZG9jX3JlYWRfcGFnZV9maW5pc2goc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlkb2Nfd3JpdGViKGRvY2czLCAwLCBET0NfREFUQUVORCk7CisJZG9jX2RlbGF5KGRvY2czLCAyKTsKKwlkb2Nfc2V0X2RldmljZV9pZChkb2NnMywgMCk7Cit9CisKKy8qKgorICogY2FsY19ibG9ja19zZWN0b3IgLSBDYWxjdWxhdGUgYmxvY2tzLCBwYWdlcyBhbmQgb2ZzLgorCisgKiBAZnJvbTogb2Zmc2V0IGluIGZsYXNoCisgKiBAYmxvY2swOiBmaXJzdCBwbGFuZSBibG9jayBpbmRleCBjYWxjdWxhdGVkCisgKiBAYmxvY2sxOiBzZWNvbmQgcGxhbmUgYmxvY2sgaW5kZXggY2FsY3VsYXRlZAorICogQHBhZ2U6IHBhZ2UgY2FsY3VsYXRlZAorICogQG9mczogb2Zmc2V0IGluIHBhZ2UKKyAqLworc3RhdGljIHZvaWQgY2FsY19ibG9ja19zZWN0b3IobG9mZl90IGZyb20sIGludCAqYmxvY2swLCBpbnQgKmJsb2NrMSwgaW50ICpwYWdlLAorCQkJICAgICAgaW50ICpvZnMpCit7CisJdWludCBzZWN0b3I7CisKKwlzZWN0b3IgPSBmcm9tIC8gRE9DX0xBWU9VVF9QQUdFX1NJWkU7CisJKmJsb2NrMCA9IHNlY3RvciAvIChET0NfTEFZT1VUX1BBR0VTX1BFUl9CTE9DSyAqIERPQ19MQVlPVVRfTkJQTEFORVMpCisJCSogRE9DX0xBWU9VVF9OQlBMQU5FUzsKKwkqYmxvY2sxID0gKmJsb2NrMCArIDE7CisJKnBhZ2UgPSBzZWN0b3IgJSAoRE9DX0xBWU9VVF9QQUdFU19QRVJfQkxPQ0sgKiBET0NfTEFZT1VUX05CUExBTkVTKTsKKwkqcGFnZSAvPSBET0NfTEFZT1VUX05CUExBTkVTOworCWlmIChzZWN0b3IgJSAyKQorCQkqb2ZzID0gRE9DX0xBWU9VVF9QQUdFX09PQl9TSVpFOworCWVsc2UKKwkJKm9mcyA9IDA7Cit9CisKKy8qKgorICogZG9jX3JlYWQgLSBSZWFkIGJ5dGVzIGZyb20gZmxhc2gKKyAqIEBtdGQ6IHRoZSBkZXZpY2UKKyAqIEBmcm9tOiB0aGUgb2Zmc2V0IGZyb20gZmlyc3QgYmxvY2sgYW5kIGZpcnN0IHBhZ2UsIGluIGJ5dGVzLCBhbGlnbmVkIG9uIHBhZ2UKKyAqICAgICAgICBzaXplCisgKiBAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0KQorICogQHJldGxlbjogdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkCisgKiBAYnVmOiB0aGUgZmlsbGVkIGluIGJ1ZmZlcgorICoKKyAqIFJlYWRzIGZsYXNoIG1lbW9yeSBwYWdlcy4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWFkIHRoZSBPT0IgY2h1bmssIGJ1dCBvbmx5CisgKiB0aGUgcGFnZSBkYXRhLgorICoKKyAqIFJldHVybnMgMCBpZiByZWFkIHN1Y2Nlc3NmdWxsLCBvZiAtRUlPLCAtRUlOVkFMIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworc3RhdGljIGludCBkb2NfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJICAgICBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IG10ZC0+cHJpdjsKKwlpbnQgYmxvY2swLCBibG9jazEsIHBhZ2UsIHJlYWRsZW4sIHJldCwgb2ZzID0gMDsKKwlpbnQgc3luW0RPQ19FQ0NfQkNIX1NJWkVdLCBlY2Njb25mMTsKKwl1OCBvb2JbRE9DX0xBWU9VVF9PT0JfU0laRV07CisKKwlyZXQgPSAtRUlOVkFMOworCWRvY19kYmcoImRvY19yZWFkKGZyb209JWxsZCwgbGVuPSV6dSwgYnVmPSVwKVxuIiwgZnJvbSwgbGVuLCBidWYpOworCWlmIChmcm9tICUgRE9DX0xBWU9VVF9QQUdFX1NJWkUpCisJCWdvdG8gZXJyOworCWlmIChsZW4gJSA0KQorCQlnb3RvIGVycjsKKwljYWxjX2Jsb2NrX3NlY3Rvcihmcm9tLCAmYmxvY2swLCAmYmxvY2sxLCAmcGFnZSwgJm9mcyk7CisJaWYgKGJsb2NrMSA+IGRvY2czLT5tYXhfYmxvY2spCisJCWdvdG8gZXJyOworCisJKnJldGxlbiA9IDA7CisJcmV0ID0gMDsKKwlyZWFkbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIChzaXplX3QpRE9DX0xBWU9VVF9QQUdFX1NJWkUpOworCXdoaWxlICghcmV0ICYmIGxlbiA+IDApIHsKKwkJcmVhZGxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCAoc2l6ZV90KURPQ19MQVlPVVRfUEFHRV9TSVpFKTsKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9wcmVwYXJlKGRvY2czLCBibG9jazAsIGJsb2NrMSwgcGFnZSwgb2ZzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9lY2NfaW5pdChkb2NnMywgRE9DX0VDQ19CQ0hfQ09WRVJFRF9CWVRFUyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfaW5fcmVhZDsKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9nZXRieXRlcyhkb2NnMywgcmVhZGxlbiwgYnVmLCAxKTsKKwkJaWYgKHJldCA8IHJlYWRsZW4pCisJCQlnb3RvIGVycl9pbl9yZWFkOworCQlyZXQgPSBkb2NfcmVhZF9wYWdlX2dldGJ5dGVzKGRvY2czLCBET0NfTEFZT1VUX09PQl9TSVpFLAorCQkJCQkgICAgIG9vYiwgMCk7CisJCWlmIChyZXQgPCBET0NfTEFZT1VUX09PQl9TSVpFKQorCQkJZ290byBlcnJfaW5fcmVhZDsKKworCQkqcmV0bGVuICs9IHJlYWRsZW47CisJCWJ1ZiArPSByZWFkbGVuOworCQlsZW4gLT0gcmVhZGxlbjsKKworCQlvZnMgXj0gRE9DX0xBWU9VVF9QQUdFX09PQl9TSVpFOworCQlpZiAob2ZzID09IDApCisJCQlwYWdlICs9IDI7CisJCWlmIChwYWdlID4gRE9DX0FERFJfUEFHRV9NQVNLKSB7CisJCQlwYWdlID0gMDsKKwkJCWJsb2NrMCArPSAyOworCQkJYmxvY2sxICs9IDI7CisJCX0KKworCQkvKgorCQkgKiBUaGVyZSBzaG91bGQgYmUgYSBCQ0ggYml0c3RyZWFtIGZpeGluZyBhbGdvcml0aG0gaGVyZSAuLi4KKwkJICogQnkgbm93LCBhIHBhZ2UgcmVhZCBmYWlsdXJlIGlzIHRyaWdnZXJlZCBieSBCQ0ggZXJyb3IKKwkJICovCisJCWRvY19nZXRfaHdfYmNoX3N5bmRyb21zKGRvY2czLCBzeW4pOworCQllY2Njb25mMSA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0VDQ0NPTkYxKTsKKworCQlkb2NfZGJnKCJPT0IgLSBJTkZPOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJIG9vYlswXSwgb29iWzFdLCBvb2JbMl0sIG9vYlszXSwgb29iWzRdLAorCQkJIG9vYls1XSwgb29iWzZdKTsKKwkJZG9jX2RiZygiT09CIC0gSEFNTUlORzogJTAyeFxuIiwgb29iWzddKTsKKwkJZG9jX2RiZygiT09CIC0gQkNIX0VDQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSBvb2JbOF0sIG9vYls5XSwgb29iWzEwXSwgb29iWzExXSwgb29iWzEyXSwKKwkJCSBvb2JbMTNdLCBvb2JbMTRdKTsKKwkJZG9jX2RiZygiT09CIC0gVU5VU0VEOiAlMDJ4XG4iLCBvb2JbMTVdKTsKKwkJZG9jX2RiZygiRUNDIGNoZWNrczogRUNDQ29uZjE9JXhcbiIsIGVjY2NvbmYxKTsKKwkJZG9jX2RiZygiRUNDIEJDSCBzeW5kcm9tOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJc3luWzBdLCBzeW5bMV0sIHN5blsyXSwgc3luWzNdLCBzeW5bNF0sIHN5bls1XSwgc3luWzZdKTsKKworCQlyZXQgPSAtRUJBRE1TRzsKKwkJaWYgKGJsb2NrMCA+PSBET0NfTEFZT1VUX0JMT0NLX0ZJUlNUX0RBVEEpIHsKKwkJCWlmIChlY2Njb25mMSAmIERPQ19FQ0NDT05GMV9CQ0hfU1lORFJPTV9FUlIpCisJCQkJZ290byBlcnJfaW5fcmVhZDsKKwkJCWlmIChpc19wcm90X3NlcV9lcnJvcihkb2NnMykpCisJCQkJZ290byBlcnJfaW5fcmVhZDsKKwkJfQorCQlkb2NfcmVhZF9wYWdlX2ZpbmlzaChkb2NnMyk7CisJfQorCisJcmV0dXJuIDA7CitlcnJfaW5fcmVhZDoKKwlkb2NfcmVhZF9wYWdlX2ZpbmlzaChkb2NnMyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkb2NfcmVhZF9vb2IgLSBSZWFkIG91dCBvZiBiYW5kIGJ5dGVzIGZyb20gZmxhc2gKKyAqIEBtdGQ6IHRoZSBkZXZpY2UKKyAqIEBmcm9tOiB0aGUgb2Zmc2V0IGZyb20gZmlyc3QgYmxvY2sgYW5kIGZpcnN0IHBhZ2UsIGluIGJ5dGVzLCBhbGlnbmVkIG9uIHBhZ2UKKyAqICAgICAgICBzaXplCisgKiBAb3BzOiB0aGUgbXRkIG9vYiBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkcyBmbGFzaCBtZW1vcnkgT09CIGFyZWEgb2YgcGFnZXMuCisgKgorICogUmV0dXJucyAwIGlmIHJlYWQgc3VjY2Vzc2Z1bGwsIG9mIC1FSU8sIC1FSU5WQUwgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitzdGF0aWMgaW50IGRvY19yZWFkX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCisJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gbXRkLT5wcml2OworCWludCBibG9jazAsIGJsb2NrMSwgcGFnZSwgb2ZzLCByZXQ7CisJdTggKmJ1ZiA9IG9wcy0+b29iYnVmOworCXNpemVfdCBsZW4gPSBvcHMtPm9vYmxlbjsKKworCWRvY19kYmcoImRvY19yZWFkX29vYihmcm9tPSVsbGQsIGJ1Zj0lcCwgbGVuPSV6dSlcbiIsIGZyb20sIGJ1ZiwgbGVuKTsKKwlpZiAobGVuICE9IERPQ19MQVlPVVRfT09CX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChvcHMtPm1vZGUpIHsKKwljYXNlIE1URF9PUFNfUExBQ0VfT09COgorCQlidWYgKz0gb3BzLT5vb2JvZmZzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljYWxjX2Jsb2NrX3NlY3Rvcihmcm9tLCAmYmxvY2swLCAmYmxvY2sxLCAmcGFnZSwgJm9mcyk7CisJaWYgKGJsb2NrMSA+IGRvY2czLT5tYXhfYmxvY2spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZG9jX3JlYWRfcGFnZV9wcmVwYXJlKGRvY2czLCBibG9jazAsIGJsb2NrMSwgcGFnZSwKKwkJCQkgICAgb2ZzICsgRE9DX0xBWU9VVF9QQUdFX1NJWkUpOworCWlmICghcmV0KQorCQlyZXQgPSBkb2NfcmVhZF9wYWdlX2VjY19pbml0KGRvY2czLCBET0NfTEFZT1VUX09PQl9TSVpFKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9nZXRieXRlcyhkb2NnMywgRE9DX0xBWU9VVF9PT0JfU0laRSwKKwkJCQkJICAgICBidWYsIDEpOworCWRvY19yZWFkX3BhZ2VfZmluaXNoKGRvY2czKTsKKworCWlmIChyZXQgPiAwKQorCQlvcHMtPm9vYnJldGxlbiA9IHJldDsKKwllbHNlCisJCW9wcy0+b29icmV0bGVuID0gMDsKKwlyZXR1cm4gKHJldCA+IDApID8gMCA6IHJldDsKK30KKworc3RhdGljIGludCBkb2NfcmVsb2FkX2JidChzdHJ1Y3QgZG9jZzMgKmRvY2czKQoreworCWludCBibG9jayA9IERPQ19MQVlPVVRfQkxPQ0tfQkJUOworCWludCByZXQgPSAwLCBuYnBhZ2VzLCBwYWdlOworCXVfY2hhciAqYnVmID0gZG9jZzMtPmJidDsKKworCW5icGFnZXMgPSBESVZfUk9VTkRfVVAoZG9jZzMtPm1heF9ibG9jayArIDEsIDggKiBET0NfTEFZT1VUX1BBR0VfU0laRSk7CisJZm9yIChwYWdlID0gMDsgIXJldCAmJiAocGFnZSA8IG5icGFnZXMpOyBwYWdlKyspIHsKKwkJcmV0ID0gZG9jX3JlYWRfcGFnZV9wcmVwYXJlKGRvY2czLCBibG9jaywgYmxvY2sgKyAxLAorCQkJCQkgICAgcGFnZSArIERPQ19MQVlPVVRfUEFHRV9CQlQsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGRvY19yZWFkX3BhZ2VfZWNjX2luaXQoZG9jZzMsCisJCQkJCQkgICAgIERPQ19MQVlPVVRfUEFHRV9TSVpFKTsKKwkJaWYgKCFyZXQpCisJCQlkb2NfcmVhZF9wYWdlX2dldGJ5dGVzKGRvY2czLCBET0NfTEFZT1VUX1BBR0VfU0laRSwKKwkJCQkJICAgICAgIGJ1ZiwgMSk7CisJCWJ1ZiArPSBET0NfTEFZT1VUX1BBR0VfU0laRTsKKwl9CisJZG9jX3JlYWRfcGFnZV9maW5pc2goZG9jZzMpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZG9jX2Jsb2NrX2lzYmFkIC0gQ2hlY2tzIHdoZXRoZXIgYSBibG9jayBpcyBnb29kIG9yIG5vdAorICogQG10ZDogdGhlIGRldmljZQorICogQGZyb206IHRoZSBvZmZzZXQgdG8gZmluZCB0aGUgY29ycmVjdCBibG9jaworICoKKyAqIFJldHVybnMgMSBpZiBibG9jayBpcyBiYWQsIDAgaWYgYmxvY2sgaXMgZ29vZAorICovCitzdGF0aWMgaW50IGRvY19ibG9ja19pc2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20pCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IG10ZC0+cHJpdjsKKwlpbnQgYmxvY2swLCBibG9jazEsIHBhZ2UsIG9mcywgaXNfZ29vZDsKKworCWNhbGNfYmxvY2tfc2VjdG9yKGZyb20sICZibG9jazAsICZibG9jazEsICZwYWdlLCAmb2ZzKTsKKwlkb2NfZGJnKCJkb2NfYmxvY2tfaXNiYWQoZnJvbT0lbGxkKSA9PiBibG9jaz0oJWQsJWQpLCBwYWdlPSVkLCBvZnM9JWRcbiIsCisJCWZyb20sIGJsb2NrMCwgYmxvY2sxLCBwYWdlLCBvZnMpOworCisJaWYgKGJsb2NrMCA8IERPQ19MQVlPVVRfQkxPQ0tfRklSU1RfREFUQSkKKwkJcmV0dXJuIDA7CisJaWYgKGJsb2NrMSA+IGRvY2czLT5tYXhfYmxvY2spCisJCXJldHVybiAtRUlOVkFMOworCisJaXNfZ29vZCA9IGRvY2czLT5iYnRbYmxvY2swID4+IDNdICYgKDEgPDwgKGJsb2NrMCAmIDB4NykpOworCXJldHVybiAhaXNfZ29vZDsKK30KKworLyoqCisgKiBkb2NfZ2V0X2VyYXNlX2NvdW50IC0gR2V0IGJsb2NrIGVyYXNlIGNvdW50CisgKiBAZG9jZzM6IHRoZSBkZXZpY2UKKyAqIEBmcm9tOiB0aGUgb2Zmc2V0IGluIHdoaWNoIHRoZSBibG9jayBpcy4KKyAqCisgKiBHZXQgdGhlIG51bWJlciBvZiB0aW1lcyBhIGJsb2NrIHdhcyBlcmFzZWQuIFRoZSBudW1iZXIgaXMgdGhlIG1heGltdW0gb2YKKyAqIGVyYXNlIHRpbWVzIGJldHdlZW4gZmlyc3QgYW5kIHNlY29uZCBwbGFuZSAod2hpY2ggc2hvdWxkIGJlIGVxdWFsIG5vcm1hbGx5KS4KKyAqCisgKiBSZXR1cm5zIFRoZSBudW1iZXIgb2YgZXJhc2VzLCBvciAtRUlOVkFMIG9yIC1FSU8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZG9jX2dldF9lcmFzZV9jb3VudChzdHJ1Y3QgZG9jZzMgKmRvY2czLCBsb2ZmX3QgZnJvbSkKK3sKKwl1OCBidWZbRE9DX0xBWU9VVF9XRUFSX1NJWkVdOworCWludCByZXQsIHBsYW5lMV9lcmFzZV9jb3VudCwgcGxhbmUyX2VyYXNlX2NvdW50OworCWludCBibG9jazAsIGJsb2NrMSwgcGFnZSwgb2ZzOworCisJZG9jX2RiZygiZG9jX2dldF9lcmFzZV9jb3VudChmcm9tPSVsbGQsIGJ1Zj0lcClcbiIsIGZyb20sIGJ1Zik7CisJaWYgKGZyb20gJSBET0NfTEFZT1VUX1BBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FsY19ibG9ja19zZWN0b3IoZnJvbSwgJmJsb2NrMCwgJmJsb2NrMSwgJnBhZ2UsICZvZnMpOworCWlmIChibG9jazEgPiBkb2NnMy0+bWF4X2Jsb2NrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRvY19yZXNldF9zZXEoZG9jZzMpOworCWlmICghcmV0KQorCQlyZXQgPSBkb2NfcmVhZF9wYWdlX3ByZXBhcmUoZG9jZzMsIGJsb2NrMCwgYmxvY2sxLCBwYWdlLAorCQkJCQkgICAgb2ZzICsgRE9DX0xBWU9VVF9XRUFSX09GRlNFVCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGRvY19yZWFkX3BhZ2VfZ2V0Ynl0ZXMoZG9jZzMsIERPQ19MQVlPVVRfV0VBUl9TSVpFLAorCQkJCQkgICAgIGJ1ZiwgMSk7CisJZG9jX3JlYWRfcGFnZV9maW5pc2goZG9jZzMpOworCisJaWYgKHJldCB8fCAoYnVmWzBdICE9IERPQ19FUkFTRV9NQVJLKSB8fCAoYnVmWzJdICE9IERPQ19FUkFTRV9NQVJLKSkKKwkJcmV0dXJuIC1FSU87CisJcGxhbmUxX2VyYXNlX2NvdW50ID0gKHU4KSh+YnVmWzFdKSB8ICgodTgpKH5idWZbNF0pIDw8IDgpCisJCXwgKCh1OCkofmJ1Zls1XSkgPDwgMTYpOworCXBsYW5lMl9lcmFzZV9jb3VudCA9ICh1OCkofmJ1ZlszXSkgfCAoKHU4KSh+YnVmWzZdKSA8PCA4KQorCQl8ICgodTgpKH5idWZbN10pIDw8IDE2KTsKKworCXJldHVybiBtYXgocGxhbmUxX2VyYXNlX2NvdW50LCBwbGFuZTJfZXJhc2VfY291bnQpOworfQorCisvKgorICogRGVidWcgc3lzZnMgZW50cmllcworICovCitzdGF0aWMgaW50IGRiZ19mbGFzaGN0cmxfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IChzdHJ1Y3QgZG9jZzMgKilzLT5wcml2YXRlOworCisJaW50IHBvcyA9IDA7CisJdTggZmN0cmwgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19GTEFTSENPTlRST0wpOworCisJcG9zICs9IHNlcV9wcmludGYocywKKwkJICJGbGFzaENvbnRyb2wgOiAweCUwMnggKCVzLENFIyAlcywlcywlcyxmbGFzaCAlcylcbiIsCisJCSBmY3RybCwKKwkJIGZjdHJsICYgRE9DX0NUUkxfVklPTEFUSU9OID8gInByb3RvY29sIHZpb2xhdGlvbiIgOiAiLSIsCisJCSBmY3RybCAmIERPQ19DVFJMX0NFID8gImFjdGl2ZSIgOiAiaW5hY3RpdmUiLAorCQkgZmN0cmwgJiBET0NfQ1RSTF9QUk9URUNUSU9OX0VSUk9SID8gInByb3RlY3Rpb24gZXJyb3IiIDogIi0iLAorCQkgZmN0cmwgJiBET0NfQ1RSTF9TRVFVRU5DRV9FUlJPUiA/ICJzZXF1ZW5jZSBlcnJvciIgOiAiLSIsCisJCSBmY3RybCAmIERPQ19DVFJMX0ZMQVNIUkVBRFkgPyAicmVhZHkiIDogIm5vdCByZWFkeSIpOworCXJldHVybiBwb3M7Cit9CitERUJVR0ZTX1JPX0FUVFIoZmxhc2hjb250cm9sLCBkYmdfZmxhc2hjdHJsX3Nob3cpOworCitzdGF0aWMgaW50IGRiZ19hc2ljbW9kZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gKHN0cnVjdCBkb2NnMyAqKXMtPnByaXZhdGU7CisKKwlpbnQgcG9zID0gMDsKKwlpbnQgcGN0cmwgPSBkb2NfcmVnaXN0ZXJfcmVhZGIoZG9jZzMsIERPQ19BU0lDTU9ERSk7CisJaW50IG1vZGUgPSBwY3RybCAmIDB4MDM7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLAorCQkJICIlMDR4IDogUkFNX1dFPSVkLFJTVElOX1JFU0VUPSVkLEJERVRDVF9SRVNFVD0lZCxXUklURV9FTkFCTEU9JWQsUE9XRVJET1dOPSVkLE1PREU9JWQlZCAoIiwKKwkJCSBwY3RybCwKKwkJCSBwY3RybCAmIERPQ19BU0lDTU9ERV9SQU1fV0UgPyAxIDogMCwKKwkJCSBwY3RybCAmIERPQ19BU0lDTU9ERV9SU1RJTl9SRVNFVCA/IDEgOiAwLAorCQkJIHBjdHJsICYgRE9DX0FTSUNNT0RFX0JERVRDVF9SRVNFVCA/IDEgOiAwLAorCQkJIHBjdHJsICYgRE9DX0FTSUNNT0RFX01EV1JFTiA/IDEgOiAwLAorCQkJIHBjdHJsICYgRE9DX0FTSUNNT0RFX1BPV0VSRE9XTiA/IDEgOiAwLAorCQkJIG1vZGUgPj4gMSwgbW9kZSAmIDB4MSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIERPQ19BU0lDTU9ERV9SRVNFVDoKKwkJcG9zICs9IHNlcV9wcmludGYocywgInJlc2V0Iik7CisJCWJyZWFrOworCWNhc2UgRE9DX0FTSUNNT0RFX05PUk1BTDoKKwkJcG9zICs9IHNlcV9wcmludGYocywgIm5vcm1hbCIpOworCQlicmVhazsKKwljYXNlIERPQ19BU0lDTU9ERV9QT1dFUkRPV046CisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJwb3dlcmRvd24iKTsKKwkJYnJlYWs7CisJfQorCXBvcyArPSBzZXFfcHJpbnRmKHMsICIpXG4iKTsKKwlyZXR1cm4gcG9zOworfQorREVCVUdGU19ST19BVFRSKGFzaWNfbW9kZSwgZGJnX2FzaWNtb2RlX3Nob3cpOworCitzdGF0aWMgaW50IGRiZ19kZXZpY2VfaWRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCit7CisJc3RydWN0IGRvY2czICpkb2NnMyA9IChzdHJ1Y3QgZG9jZzMgKilzLT5wcml2YXRlOworCWludCBwb3MgPSAwOworCWludCBpZCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0RFVklDRVNFTEVDVCk7CisKKwlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRGV2aWNlSWQgPSAlZFxuIiwgaWQpOworCXJldHVybiBwb3M7Cit9CitERUJVR0ZTX1JPX0FUVFIoZGV2aWNlX2lkLCBkYmdfZGV2aWNlX2lkX3Nob3cpOworCitzdGF0aWMgaW50IGRiZ19wcm90ZWN0aW9uX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQoreworCXN0cnVjdCBkb2NnMyAqZG9jZzMgPSAoc3RydWN0IGRvY2czICopcy0+cHJpdmF0ZTsKKwlpbnQgcG9zID0gMDsKKwlpbnQgcHJvdGVjdCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX1BST1RFQ1RJT04pOworCWludCBkcHMwID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMF9TVEFUVVMpOworCWludCBkcHMwX2xvdyA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0RQUzBfQUREUkxPVyk7CisJaW50IGRwczBfaGlnaCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0RQUzBfQUREUkhJR0gpOworCWludCBkcHMxID0gZG9jX3JlZ2lzdGVyX3JlYWRiKGRvY2czLCBET0NfRFBTMV9TVEFUVVMpOworCWludCBkcHMxX2xvdyA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0RQUzFfQUREUkxPVyk7CisJaW50IGRwczFfaGlnaCA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0RQUzFfQUREUkhJR0gpOworCisJcG9zICs9IHNlcV9wcmludGYocywgIlByb3RlY3Rpb24gPSAweCUwMnggKCIsCisJCQkgcHJvdGVjdCk7CisJaWYgKHByb3RlY3QgJiBET0NfUFJPVEVDVF9GT1VORFJZX09UUF9MT0NLKQorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRk9VTkRSWV9PVFBfTE9DSywiKTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX0NVU1RPTUVSX09UUF9MT0NLKQorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiQ1VTVE9NRVJfT1RQX0xPQ0ssIik7CisJaWYgKHByb3RlY3QgJiBET0NfUFJPVEVDVF9MT0NLX0lOUFVUKQorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiTE9DS19JTlBVVCwiKTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX1NUSUNLWV9MT0NLKQorCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiU1RJQ0tZX0xPQ0ssIik7CisJaWYgKHByb3RlY3QgJiBET0NfUFJPVEVDVF9QUk9URUNUSU9OX0VOQUJMRUQpCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJQUk9URUNUSU9OIE9OLCIpOworCWlmIChwcm90ZWN0ICYgRE9DX1BST1RFQ1RfSVBMX0RPV05MT0FEX0xPQ0spCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJJUExfRE9XTkxPQURfTE9DSywiKTsKKwlpZiAocHJvdGVjdCAmIERPQ19QUk9URUNUX1BST1RFQ1RJT05fRVJST1IpCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJQUk9URUNUX0VSUiwiKTsKKwllbHNlCisJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJOT19QUk9URUNUX0VSUiIpOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICIpXG4iKTsKKworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJEUFMwID0gMHglMDJ4IDogIgorCQkJICJQcm90ZWN0ZWQgYXJlYSBbMHgleCAtIDB4JXhdIDogT1RQPSVkLCBSRUFEPSVkLCAiCisJCQkgIldSSVRFPSVkLCBIV19MT0NLPSVkLCBLRVlfT0s9JWRcbiIsCisJCQkgZHBzMCwgZHBzMF9sb3csIGRwczBfaGlnaCwKKwkJCSAhIShkcHMwICYgRE9DX0RQU19PVFBfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMwICYgRE9DX0RQU19SRUFEX1BST1RFQ1RFRCksCisJCQkgISEoZHBzMCAmIERPQ19EUFNfV1JJVEVfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMwICYgRE9DX0RQU19IV19MT0NLX0VOQUJMRUQpLAorCQkJICEhKGRwczAgJiBET0NfRFBTX0tFWV9PSykpOworCXBvcyArPSBzZXFfcHJpbnRmKHMsICJEUFMxID0gMHglMDJ4IDogIgorCQkJICJQcm90ZWN0ZWQgYXJlYSBbMHgleCAtIDB4JXhdIDogT1RQPSVkLCBSRUFEPSVkLCAiCisJCQkgIldSSVRFPSVkLCBIV19MT0NLPSVkLCBLRVlfT0s9JWRcbiIsCisJCQkgZHBzMSwgZHBzMV9sb3csIGRwczFfaGlnaCwKKwkJCSAhIShkcHMxICYgRE9DX0RQU19PVFBfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMxICYgRE9DX0RQU19SRUFEX1BST1RFQ1RFRCksCisJCQkgISEoZHBzMSAmIERPQ19EUFNfV1JJVEVfUFJPVEVDVEVEKSwKKwkJCSAhIShkcHMxICYgRE9DX0RQU19IV19MT0NLX0VOQUJMRUQpLAorCQkJICEhKGRwczEgJiBET0NfRFBTX0tFWV9PSykpOworCXJldHVybiBwb3M7Cit9CitERUJVR0ZTX1JPX0FUVFIocHJvdGVjdGlvbiwgZGJnX3Byb3RlY3Rpb25fc2hvdyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGRvY19kYmdfcmVnaXN0ZXIoc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyb290LCAqZW50cnk7CisKKwlyb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJkb2NnMyIsIE5VTEwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZsYXNoY29udHJvbCIsIFNfSVJVU1IsIHJvb3QsIGRvY2czLAorCQkJCSAgJmZsYXNoY29udHJvbF9mb3BzKTsKKwlpZiAoZW50cnkpCisJCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXNpY19tb2RlIiwgU19JUlVTUiwgcm9vdCwKKwkJCQkJICAgIGRvY2czLCAmYXNpY19tb2RlX2ZvcHMpOworCWlmIChlbnRyeSkKKwkJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkZXZpY2VfaWQiLCBTX0lSVVNSLCByb290LAorCQkJCQkgICAgZG9jZzMsICZkZXZpY2VfaWRfZm9wcyk7CisJaWYgKGVudHJ5KQorCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInByb3RlY3Rpb24iLCBTX0lSVVNSLCByb290LAorCQkJCQkgICAgZG9jZzMsICZwcm90ZWN0aW9uX2ZvcHMpOworCWlmIChlbnRyeSkgeworCQlkb2NnMy0+ZGVidWdmc19yb290ID0gcm9vdDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHJvb3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkb2NfZGJnX3VucmVnaXN0ZXIoc3RydWN0IGRvY2czICpkb2NnMykKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZG9jZzMtPmRlYnVnZnNfcm9vdCk7Cit9CisKKy8qKgorICogZG9jX3NldF9kcml2ZXJfaW5mbyAtIEZpbGwgdGhlIG10ZF9pbmZvIHN0cnVjdHVyZSBhbmQgZG9jZzMgc3RydWN0dXJlCisgKiBAY2hpcF9pZDogVGhlIGNoaXAgSUQgb2YgdGhlIHN1cHBvcnRlZCBjaGlwCisgKiBAbXRkOiBUaGUgc3RydWN0dXJlIHRvIGZpbGwKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGRvY19zZXRfZHJpdmVyX2luZm8oaW50IGNoaXBfaWQsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBkb2NnMyAqZG9jZzMgPSBtdGQtPnByaXY7CisJaW50IGNmZzsKKworCWNmZyA9IGRvY19yZWdpc3Rlcl9yZWFkYihkb2NnMywgRE9DX0NPTkZJR1VSQVRJT04pOworCWRvY2czLT5pZl9jZmcgPSAoY2ZnICYgRE9DX0NPTkZfSUZfQ0ZHID8gMSA6IDApOworCisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSBET0NfQ0hJUElEX0czOgorCQltdGQtPm5hbWUgPSAiRGlza09uQ2hpcCBHMyI7CisJCWRvY2czLT5tYXhfYmxvY2sgPSAyMDQ3OworCQlicmVhazsKKwl9CisJbXRkLT50eXBlID0gTVREX05BTkRGTEFTSDsKKwkvKgorCSAqIE9uY2Ugd3JpdGUgbWV0aG9kcyBhcmUgYWRkZWQsIHRoZSBjb3JyZWN0IGZsYWdzIHdpbGwgYmUgc2V0LgorCSAqIG10ZC0+ZmxhZ3MgPSBNVERfQ0FQX05BTkRGTEFTSDsKKwkgKi8KKwltdGQtPmZsYWdzID0gTVREX0NBUF9ST007CisJbXRkLT5zaXplID0gKGRvY2czLT5tYXhfYmxvY2sgKyAxKSAqIERPQ19MQVlPVVRfQkxPQ0tfU0laRTsKKwltdGQtPmVyYXNlc2l6ZSA9IERPQ19MQVlPVVRfQkxPQ0tfU0laRSAqIERPQ19MQVlPVVRfTkJQTEFORVM7CisJbXRkLT53cml0ZXNpemUgPSBET0NfTEFZT1VUX1BBR0VfU0laRTsKKwltdGQtPm9vYnNpemUgPSBET0NfTEFZT1VUX09PQl9TSVpFOworCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwltdGQtPmVyYXNlID0gTlVMTDsKKwltdGQtPnBvaW50ID0gTlVMTDsKKwltdGQtPnVucG9pbnQgPSBOVUxMOworCW10ZC0+cmVhZCA9IGRvY19yZWFkOworCW10ZC0+d3JpdGUgPSBOVUxMOworCW10ZC0+cmVhZF9vb2IgPSBkb2NfcmVhZF9vb2I7CisJbXRkLT53cml0ZV9vb2IgPSBOVUxMOworCW10ZC0+c3luYyA9IE5VTEw7CisJbXRkLT5ibG9ja19pc2JhZCA9IGRvY19ibG9ja19pc2JhZDsKK30KKworLyoqCisgKiBkb2NfcHJvYmUgLSBQcm9iZSB0aGUgSU8gc3BhY2UgZm9yIGEgRGlza09uQ2hpcCBHMyBjaGlwCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlCisgKgorICogUHJvYmVzIGZvciBhIEczIGNoaXAgYXQgdGhlIHNwZWNpZmllZCBJTyBzcGFjZSBpbiB0aGUgcGxhdGZvcm0gZGF0YQorICogcmVzc291cmNlcy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVOT01FTSwgLUVOWElPIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRvY2czX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXN0cnVjdCByZXNvdXJjZSAqcmVzczsKKwlpbnQgcmV0LCBiYnRfbmJwYWdlczsKKwl1MTYgY2hpcF9pZCwgY2hpcF9pZF9pbnY7CisKKwlyZXQgPSAtRU5PTUVNOworCWRvY2czID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRvY2czKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkb2NnMykKKwkJZ290byBub21lbTE7CisJbXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdGQpCisJCWdvdG8gbm9tZW0yOworCW10ZC0+cHJpdiA9IGRvY2czOworCisJcmV0ID0gLUVOWElPOworCXJlc3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzcykgeworCQlkZXZfZXJyKGRldiwgIk5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gbm9yZXNzOworCX0KKwlkb2NnMy0+YmFzZSA9IGlvcmVtYXAocmVzcy0+c3RhcnQsIERPQ19JT1NQQUNFX1NJWkUpOworCisJZG9jZzMtPmRldiA9ICZwZGV2LT5kZXY7CisJZG9jZzMtPmRldmljZV9pZCA9IDA7CisJZG9jX3NldF9kZXZpY2VfaWQoZG9jZzMsIGRvY2czLT5kZXZpY2VfaWQpOworCWRvY19zZXRfYXNpY19tb2RlKGRvY2czLCBET0NfQVNJQ01PREVfUkVTRVQpOworCWRvY19zZXRfYXNpY19tb2RlKGRvY2czLCBET0NfQVNJQ01PREVfTk9STUFMKTsKKworCWNoaXBfaWQgPSBkb2NfcmVnaXN0ZXJfcmVhZHcoZG9jZzMsIERPQ19DSElQSUQpOworCWNoaXBfaWRfaW52ID0gZG9jX3JlZ2lzdGVyX3JlYWR3KGRvY2czLCBET0NfQ0hJUElEX0lOVik7CisKKwlyZXQgPSAtRU5PREVWOworCWlmIChjaGlwX2lkICE9ICh1MTYpKH5jaGlwX2lkX2ludikpIHsKKwkJZG9jX2luZm8oIk5vIGRldmljZSBmb3VuZCBhdCBJTyBhZGRyICVwXG4iLAorCQkJICh2b2lkICopcmVzcy0+c3RhcnQpOworCQlnb3RvIG5vY2hpcGZvdW5kOworCX0KKworCXN3aXRjaCAoY2hpcF9pZCkgeworCWNhc2UgRE9DX0NISVBJRF9HMzoKKwkJZG9jX2luZm8oIkZvdW5kIGEgRzMgRGlza09uQ2hpcCBhdCBhZGRyICVwXG4iLAorCQkJICh2b2lkICopcmVzcy0+c3RhcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkb2NfZXJyKCJDaGlwIGlkICUwNHggaXMgbm90IGEgRGlza09uQ2hpcCBHMyBjaGlwXG4iLCBjaGlwX2lkKTsKKwkJZ290byBub2NoaXBmb3VuZDsKKwl9CisKKwlkb2Nfc2V0X2RyaXZlcl9pbmZvKGNoaXBfaWQsIG10ZCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbXRkKTsKKworCXJldCA9IC1FTk9NRU07CisJYmJ0X25icGFnZXMgPSBESVZfUk9VTkRfVVAoZG9jZzMtPm1heF9ibG9jayArIDEsCisJCQkJICAgOCAqIERPQ19MQVlPVVRfUEFHRV9TSVpFKTsKKwlkb2NnMy0+YmJ0ID0ga3phbGxvYyhiYnRfbmJwYWdlcyAqIERPQ19MQVlPVVRfUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRvY2czLT5iYnQpCisJCWdvdG8gbm9jaGlwZm91bmQ7CisJZG9jX3JlbG9hZF9iYnQoZG9jZzMpOworCisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIHBhcnRfcHJvYmVzLAorCQkJCQlOVUxMLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIHJlZ2lzdGVyX2Vycm9yOworCisJZG9jX2RiZ19yZWdpc3Rlcihkb2NnMyk7CisJcmV0dXJuIDA7CisKK3JlZ2lzdGVyX2Vycm9yOgorCWtmcmVlKGRvY2czLT5iYnQpOworbm9jaGlwZm91bmQ6CisJaW91bm1hcChkb2NnMy0+YmFzZSk7Citub3Jlc3M6CisJa2ZyZWUobXRkKTsKK25vbWVtMjoKKwlrZnJlZShkb2NnMyk7Citub21lbTE6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkb2NnM19yZWxlYXNlIC0gUmVsZWFzZSB0aGUgZHJpdmVyCisgKiBAcGRldjogdGhlIHBsYXRmb3JtIGRldmljZQorICoKKyAqIFJldHVybnMgMAorICovCitzdGF0aWMgaW50IF9fZXhpdCBkb2NnM19yZWxlYXNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG9jZzMgKmRvY2czID0gbXRkLT5wcml2OworCisJZG9jX2RiZ191bnJlZ2lzdGVyKGRvY2czKTsKKwltdGRfZGV2aWNlX3VucmVnaXN0ZXIobXRkKTsKKwlpb3VubWFwKGRvY2czLT5iYXNlKTsKKwlrZnJlZShkb2NnMy0+YmJ0KTsKKwlrZnJlZShkb2NnMyk7CisJa2ZyZWUobXRkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZzNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJkb2NnMyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChkb2NnM19yZWxlYXNlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRvY2czX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZnM19kcml2ZXIsIGRvY2czX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGRvY2czX2luaXQpOworCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkb2NnM19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmczX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkb2NnM19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUm9iZXJ0IEphcnptaWsgPHJvYmVydC5qYXJ6bWlrQGZyZWUuZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBkcml2ZXIgZm9yIERpc2tPbkNoaXAgRzMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZzMuaCBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQwN2JlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2NnMy5oCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogSGFuZGxlcyB0aGUgTS1TeXN0ZW1zIERpc2tPbkNoaXAgRzMgY2hpcAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSb2JlcnQgSmFyem1paworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfTVREX0RPQ0czX0gKKyNkZWZpbmUgX01URF9ET0NHM19ICisKKy8qCisgKiBGbGFzaCBtZW1vcnkgYXJlYXMgOgorICogICAtIDB4MDAwMCAuLiAweDA3ZmYgOiBJUEwKKyAqICAgLSAweDA4MDAgLi4gMHgwZmZmIDogRGF0YSBhcmVhCisgKiAgIC0gMHgxMDAwIC4uIDB4MTdmZiA6IFJlZ2lzdGVycworICogICAtIDB4MTgwMCAuLiAweDFmZmYgOiBVbmtub3duCisgKi8KKyNkZWZpbmUgRE9DX0lPU1BBQ0VfSVBMCQkJMHgwMDAwCisjZGVmaW5lIERPQ19JT1NQQUNFX0RBVEEJCTB4MDgwMAorI2RlZmluZSBET0NfSU9TUEFDRV9TSVpFCQkweDIwMDAKKworLyoKKyAqIERPQyBHMyBsYXlvdXQgYW5kIGFkcmVzc2luZyBzY2hlbWUKKyAqICAgQSBwYWdlIGFkZHJlc3MgZm9yIHRoZSBibG9jayAiYiIsIHBsYW5lICJQIiBhbmQgcGFnZSAicCI6CisgKiAgIGFkZHJlc3MgPSBbYmJiYiBiUHBwIHBwcHBdCisgKi8KKworI2RlZmluZSBET0NfQUREUl9QQUdFX01BU0sJCTB4M2YKKyNkZWZpbmUgRE9DX0FERFJfQkxPQ0tfU0hJRlQJCTYKKyNkZWZpbmUgRE9DX0xBWU9VVF9OQlBMQU5FUwkJMgorI2RlZmluZSBET0NfTEFZT1VUX1BBR0VTX1BFUl9CTE9DSwk2NAorI2RlZmluZSBET0NfTEFZT1VUX1BBR0VfU0laRQkJNTEyCisjZGVmaW5lIERPQ19MQVlPVVRfT09CX1NJWkUJCTE2CisjZGVmaW5lIERPQ19MQVlPVVRfV0VBUl9TSVpFCQk4CisjZGVmaW5lIERPQ19MQVlPVVRfUEFHRV9PT0JfU0laRQkJCQlcCisJKERPQ19MQVlPVVRfUEFHRV9TSVpFICsgRE9DX0xBWU9VVF9PT0JfU0laRSkKKyNkZWZpbmUgRE9DX0xBWU9VVF9XRUFSX09GRlNFVAkJKERPQ19MQVlPVVRfUEFHRV9PT0JfU0laRSAqIDIpCisjZGVmaW5lIERPQ19MQVlPVVRfQkxPQ0tfU0laRQkJCQkJXAorCShET0NfTEFZT1VUX1BBR0VTX1BFUl9CTE9DSyAqIERPQ19MQVlPVVRfUEFHRV9TSVpFKQorI2RlZmluZSBET0NfRUNDX0JDSF9TSVpFCQk3CisjZGVmaW5lIERPQ19FQ0NfQkNIX0NPVkVSRURfQllURVMJCQkJXAorCShET0NfTEFZT1VUX1BBR0VfU0laRSArIERPQ19MQVlPVVRfT09CX1BBR0VJTkZPX1NaICsJXAorCSBET0NfTEFZT1VUX09PQl9IQU1NSU5HX1NaICsgRE9DX0xBWU9VVF9PT0JfQkNIX1NaKQorCisvKgorICogQmxvY2tzIGRpc3RyaWJ1dGlvbgorICovCisjZGVmaW5lIERPQ19MQVlPVVRfQkxPQ0tfQkJUCQkwCisjZGVmaW5lIERPQ19MQVlPVVRfQkxPQ0tfT1RQCQkwCisjZGVmaW5lIERPQ19MQVlPVVRfQkxPQ0tfRklSU1RfREFUQQk2CisKKyNkZWZpbmUgRE9DX0xBWU9VVF9QQUdFX0JCVAkJNAorCisvKgorICogRXh0cmEgcGFnZSBPT0IgKDE2IGJ5dGVzIHdpZGUpIGxheW91dAorICovCisjZGVmaW5lIERPQ19MQVlPVVRfT09CX1BBR0VJTkZPX09GUwkwCisjZGVmaW5lIERPQ19MQVlPVVRfT09CX0hBTU1JTkdfT0ZTCTcKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfQkNIX09GUwkJOAorI2RlZmluZSBET0NfTEFZT1VUX09PQl9VTlVTRURfT0ZTCTE1CisjZGVmaW5lIERPQ19MQVlPVVRfT09CX1BBR0VJTkZPX1NaCTcKKyNkZWZpbmUgRE9DX0xBWU9VVF9PT0JfSEFNTUlOR19TWgkxCisjZGVmaW5lIERPQ19MQVlPVVRfT09CX0JDSF9TWgkJNworI2RlZmluZSBET0NfTEFZT1VUX09PQl9VTlVTRURfU1oJMQorCisKKyNkZWZpbmUgRE9DX0NISVBJRF9HMwkJCTB4MjAwCisjZGVmaW5lIERPQ19FUkFTRV9NQVJLCQkJMHhhYQorLyoKKyAqIEZsYXNoIHJlZ2lzdGVycworICovCisjZGVmaW5lIERPQ19DSElQSUQJCQkweDEwMDAKKyNkZWZpbmUgRE9DX1RFU1QJCQkweDEwMDQKKyNkZWZpbmUgRE9DX0JVU0xPQ0sJCQkweDEwMDYKKyNkZWZpbmUgRE9DX0VORElBTkNPTlRST0wJCTB4MTAwOAorI2RlZmluZSBET0NfREVWSUNFU0VMRUNUCQkweDEwMGEKKyNkZWZpbmUgRE9DX0FTSUNNT0RFCQkJMHgxMDBjCisjZGVmaW5lIERPQ19DT05GSUdVUkFUSU9OCQkweDEwMGUKKyNkZWZpbmUgRE9DX0lOVEVSUlVQVENPTlRST0wJCTB4MTAxMAorI2RlZmluZSBET0NfUkVBREFERFJFU1MJCQkweDEwMWEKKyNkZWZpbmUgRE9DX0RBVEFFTkQJCQkweDEwMWUKKyNkZWZpbmUgRE9DX0lOVEVSUlVQVFNUQVRVUwkJMHgxMDIwCisKKyNkZWZpbmUgRE9DX0ZMQVNIU0VRVUVOQ0UJCTB4MTAzMgorI2RlZmluZSBET0NfRkxBU0hDT01NQU5ECQkweDEwMzQKKyNkZWZpbmUgRE9DX0ZMQVNIQUREUkVTUwkJMHgxMDM2CisjZGVmaW5lIERPQ19GTEFTSENPTlRST0wJCTB4MTAzOAorI2RlZmluZSBET0NfTk9QCQkJCTB4MTAzZQorCisjZGVmaW5lIERPQ19FQ0NDT05GMAkJCTB4MTA0MAorI2RlZmluZSBET0NfRUNDQ09ORjEJCQkweDEwNDIKKyNkZWZpbmUgRE9DX0VDQ1BSRVNFVAkJCTB4MTA0NAorI2RlZmluZSBET0NfSEFNTUlOR1BBUklUWQkJMHgxMDQ2CisjZGVmaW5lIERPQ19CQ0hfU1lORFJPTShpZHgpCQkoMHgxMDQ4ICsgKGlkeCA8PCAxKSkKKworI2RlZmluZSBET0NfUFJPVEVDVElPTgkJCTB4MTA1NgorI2RlZmluZSBET0NfRFBTMF9BRERSTE9XCQkweDEwNjAKKyNkZWZpbmUgRE9DX0RQUzBfQUREUkhJR0gJCTB4MTA2MgorI2RlZmluZSBET0NfRFBTMV9BRERSTE9XCQkweDEwNjQKKyNkZWZpbmUgRE9DX0RQUzFfQUREUkhJR0gJCTB4MTA2NgorI2RlZmluZSBET0NfRFBTMF9TVEFUVVMJCQkweDEwNmMKKyNkZWZpbmUgRE9DX0RQUzFfU1RBVFVTCQkJMHgxMDZlCisKKyNkZWZpbmUgRE9DX0FTSUNNT0RFQ09ORklSTQkJMHgxMDcyCisjZGVmaW5lIERPQ19DSElQSURfSU5WCQkJMHgxMDc0CisKKy8qCisgKiBGbGFzaCBzZXF1ZW5jZXMKKyAqIEEgc2VxdWVuY2UgaXMgcHJlc2V0IGJlZm9yZSBvbmUgb3IgbW9yZSBjb21tYW5kcyBhcmUgaW5wdXQgdG8gdGhlIGNoaXAuCisgKi8KKyNkZWZpbmUgRE9DX1NFUV9SRVNFVAkJCTB4MDAKKyNkZWZpbmUgRE9DX1NFUV9QQUdFX1NJWkVfNTMyCQkweDAzCisjZGVmaW5lIERPQ19TRVFfU0VUX01PREUJCTB4MDkKKyNkZWZpbmUgRE9DX1NFUV9SRUFECQkJMHgxMgorI2RlZmluZSBET0NfU0VRX1NFVF9QTEFORTEJCTB4MGUKKyNkZWZpbmUgRE9DX1NFUV9TRVRfUExBTkUyCQkweDEwCisjZGVmaW5lIERPQ19TRVFfUEFHRV9TRVRVUAkJMHgxZAorCisvKgorICogRmxhc2ggY29tbWFuZHMKKyAqLworI2RlZmluZSBET0NfQ01EX1JFQURfUExBTkUxCQkweDAwCisjZGVmaW5lIERPQ19DTURfU0VUX0FERFJfUkVBRAkJMHgwNQorI2RlZmluZSBET0NfQ01EX1JFQURfQUxMX1BMQU5FUwkJMHgzMAorI2RlZmluZSBET0NfQ01EX1JFQURfUExBTkUyCQkweDUwCisjZGVmaW5lIERPQ19DTURfUkVBRF9GTEFTSAkJMHhlMAorI2RlZmluZSBET0NfQ01EX1BBR0VfU0laRV81MzIJCTB4M2MKKworI2RlZmluZSBET0NfQ01EX1BST0dfQkxPQ0tfQUREUgkJMHg2MAorI2RlZmluZSBET0NfQ01EX1BST0dfQ1lDTEUxCQkweDgwCisjZGVmaW5lIERPQ19DTURfUFJPR19DWUNMRTIJCTB4MTAKKyNkZWZpbmUgRE9DX0NNRF9FUkFTRUNZQ0xFMgkJMHhkMAorCisjZGVmaW5lIERPQ19DTURfUkVMSUFCTEVfTU9ERQkJMHgyMgorI2RlZmluZSBET0NfQ01EX0ZBU1RfTU9ERQkJMHhhMgorCisjZGVmaW5lIERPQ19DTURfUkVTRVQJCQkweGZmCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19GTEFTSENPTlRST0wKKyAqLworI2RlZmluZSBET0NfQ1RSTF9WSU9MQVRJT04JCTB4MjAKKyNkZWZpbmUgRE9DX0NUUkxfQ0UJCQkweDEwCisjZGVmaW5lIERPQ19DVFJMX1VOS05PV05fQklUUwkJMHgwOAorI2RlZmluZSBET0NfQ1RSTF9QUk9URUNUSU9OX0VSUk9SCTB4MDQKKyNkZWZpbmUgRE9DX0NUUkxfU0VRVUVOQ0VfRVJST1IJCTB4MDIKKyNkZWZpbmUgRE9DX0NUUkxfRkxBU0hSRUFEWQkJMHgwMQorCisvKgorICogRmxhc2ggcmVnaXN0ZXIgOiBET0NfQVNJQ01PREUKKyAqLworI2RlZmluZSBET0NfQVNJQ01PREVfUkVTRVQJCTB4MDAKKyNkZWZpbmUgRE9DX0FTSUNNT0RFX05PUk1BTAkJMHgwMQorI2RlZmluZSBET0NfQVNJQ01PREVfUE9XRVJET1dOCQkweDAyCisjZGVmaW5lIERPQ19BU0lDTU9ERV9NRFdSRU4JCTB4MDQKKyNkZWZpbmUgRE9DX0FTSUNNT0RFX0JERVRDVF9SRVNFVAkweDA4CisjZGVmaW5lIERPQ19BU0lDTU9ERV9SU1RJTl9SRVNFVAkweDEwCisjZGVmaW5lIERPQ19BU0lDTU9ERV9SQU1fV0UJCTB4MjAKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX0VDQ0NPTkYwCisgKi8KKyNkZWZpbmUgRE9DX0VDQ0NPTkYwX1JFQURfTU9ERQkJMHg4MDAwCisjZGVmaW5lIERPQ19FQ0NDT05GMF9BVVRPX0VDQ19FTkFCTEUJMHg0MDAwCisjZGVmaW5lIERPQ19FQ0NDT05GMF9IQU1NSU5HX0VOQUJMRQkweDEwMDAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYwX0JDSF9FTkFCTEUJCTB4MDgwMAorI2RlZmluZSBET0NfRUNDQ09ORjBfREFUQV9CWVRFU19NQVNLCTB4MDdmZgorCisvKgorICogRmxhc2ggcmVnaXN0ZXIgOiBET0NfRUNDQ09ORjEKKyAqLworI2RlZmluZSBET0NfRUNDQ09ORjFfQkNIX1NZTkRST01fRVJSCTB4ODAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYxX1VOS09XTjEJCTB4NDAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYxX1VOS09XTjIJCTB4MjAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYxX1VOS09XTjMJCTB4MTAKKyNkZWZpbmUgRE9DX0VDQ0NPTkYxX0hBTU1JTkdfQklUU19NQVNLCTB4MGYKKworLyoKKyAqIEZsYXNoIHJlZ2lzdGVyIDogRE9DX1BST1RFQ1RJT04KKyAqLworI2RlZmluZSBET0NfUFJPVEVDVF9GT1VORFJZX09UUF9MT0NLCTB4MDEKKyNkZWZpbmUgRE9DX1BST1RFQ1RfQ1VTVE9NRVJfT1RQX0xPQ0sJMHgwMgorI2RlZmluZSBET0NfUFJPVEVDVF9MT0NLX0lOUFVUCQkweDA0CisjZGVmaW5lIERPQ19QUk9URUNUX1NUSUNLWV9MT0NLCQkweDA4CisjZGVmaW5lIERPQ19QUk9URUNUX1BST1RFQ1RJT05fRU5BQkxFRAkweDEwCisjZGVmaW5lIERPQ19QUk9URUNUX0lQTF9ET1dOTE9BRF9MT0NLCTB4MjAKKyNkZWZpbmUgRE9DX1BST1RFQ1RfUFJPVEVDVElPTl9FUlJPUgkweDgwCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19EUFMwX1NUQVRVUyBhbmQgRE9DX0RQUzFfU1RBVFVTCisgKi8KKyNkZWZpbmUgRE9DX0RQU19PVFBfUFJPVEVDVEVECQkweDAxCisjZGVmaW5lIERPQ19EUFNfUkVBRF9QUk9URUNURUQJCTB4MDIKKyNkZWZpbmUgRE9DX0RQU19XUklURV9QUk9URUNURUQJCTB4MDQKKyNkZWZpbmUgRE9DX0RQU19IV19MT0NLX0VOQUJMRUQJCTB4MDgKKyNkZWZpbmUgRE9DX0RQU19LRVlfT0sJCQkweDgwCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19DT05GSUdVUkFUSU9OCisgKi8KKyNkZWZpbmUgRE9DX0NPTkZfSUZfQ0ZHCQkJMHg4MAorI2RlZmluZSBET0NfQ09ORl9NQVhfSURfTUFTSwkJMHgzMAorI2RlZmluZSBET0NfQ09ORl9WQ0NRXzNWCQkweDAxCisKKy8qCisgKiBGbGFzaCByZWdpc3RlciA6IERPQ19SRUFEQUREUkVTUworICovCisjZGVmaW5lIERPQ19SRUFEQUREUl9JTkMJCTB4ODAwMAorI2RlZmluZSBET0NfUkVBREFERFJfT05FX0JZVEUJCTB4NDAwMAorI2RlZmluZSBET0NfUkVBREFERFJfQUREUl9NQVNLCQkweDFmZmYKKworLyoqCisgKiBzdHJ1Y3QgZG9jZzMgLSBEaXNrT25DaGlwIGRyaXZlciBwcml2YXRlIGRhdGEKKyAqIEBkZXY6IHRoZSBkZXZpY2UgY3VycmVudGx5IHVuZGVyIGNvbnRyb2wKKyAqIEBiYXNlOiBtYXBwZWQgSU8gc3BhY2UKKyAqIEBkZXZpY2VfaWQ6IG51bWJlciBvZiB0aGUgY2FzY2FkZWQgRG9DRzMgZGV2aWNlICgwLCAxLCAyIG9yIDMpCisgKiBAaWZfY2ZnOiBpZiB0cnVlLCByZWFkcyBhcmUgb24gMTZiaXRzLCBlbHNlIHJlYWRzIGFyZSBvbiA4Yml0cworICogQGJidDogYmFkIGJsb2NrIHRhYmxlIGNhY2hlCisgKiBAZGVidWdmc19yb290OiBkZWJ1Z2ZzIHJvb3Qgbm9kZQorICovCitzdHJ1Y3QgZG9jZzMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaW50IGRldmljZV9pZDo0OworCXVuc2lnbmVkIGludCBpZl9jZmc6MTsKKwlpbnQgbWF4X2Jsb2NrOworCXU4ICpiYnQ7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OworfTsKKworI2RlZmluZSBkb2NfZXJyKGZtdCwgYXJnLi4uKSBkZXZfZXJyKGRvY2czLT5kZXYsIChmbXQpLCAjIyBhcmcpCisjZGVmaW5lIGRvY19pbmZvKGZtdCwgYXJnLi4uKSBkZXZfaW5mbyhkb2NnMy0+ZGV2LCAoZm10KSwgIyMgYXJnKQorI2RlZmluZSBkb2NfZGJnKGZtdCwgYXJnLi4uKSBkZXZfZGJnKGRvY2czLT5kZXYsIChmbXQpLCAjIyBhcmcpCisjZGVmaW5lIGRvY192ZGJnKGZtdCwgYXJnLi4uKSBkZXZfdmRiZyhkb2NnMy0+ZGV2LCAoZm10KSwgIyMgYXJnKQorCisjZGVmaW5lIERFQlVHRlNfUk9fQVRUUihuYW1lLCBzaG93X2ZjdCkgXAorCXN0YXRpYyBpbnQgbmFtZSMjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIFwKKwl7IHJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X2ZjdCwgaW5vZGUtPmlfcHJpdmF0ZSk7IH0gICAgICBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmFtZSMjX2ZvcHMgPSB7IFwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsIFwKKwkJLm9wZW4gPSBuYW1lIyNfb3BlbiwgXAorCQkubGxzZWVrID0gc2VxX2xzZWVrLCBcCisJCS5yZWFkID0gc2VxX3JlYWQsIFwKKwkJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSBcCisJfTsKKyNlbmRpZgorCisvKgorICogVHJhY2UgZXZlbnRzIHBhcnQKKyAqLworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gZG9jZzMKKworI2lmICFkZWZpbmVkKF9NVERfRE9DRzNfVFJBQ0UpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9NVERfRE9DRzNfVFJBQ0UKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworVFJBQ0VfRVZFTlQoZG9jZzNfaW8sCisJICAgIFRQX1BST1RPKGludCBvcCwgaW50IHdpZHRoLCB1MTYgcmVnLCBpbnQgdmFsKSwKKwkgICAgVFBfQVJHUyhvcCwgd2lkdGgsIHJlZywgdmFsKSwKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoaW50LCBvcCkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgY2hhciwgd2lkdGgpCisJCSAgICBfX2ZpZWxkKHUxNiwgcmVnKQorCQkgICAgX19maWVsZChpbnQsIHZhbCkpLAorCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPm9wID0gb3A7CisJCSAgICBfX2VudHJ5LT53aWR0aCA9IHdpZHRoOworCQkgICAgX19lbnRyeS0+cmVnID0gcmVnOworCQkgICAgX19lbnRyeS0+dmFsID0gdmFsOyksCisJICAgIFRQX3ByaW50aygiZG9jZzM6ICVzJTAyZCByZWc9JTA0eCwgdmFsPSUwNHgiLAorCQkgICAgICBfX2VudHJ5LT5vcCA/ICJ3cml0ZSIgOiAicmVhZCIsIF9fZW50cnktPndpZHRoLAorCQkgICAgICBfX2VudHJ5LT5yZWcsIF9fZW50cnktPnZhbCkKKwkpOworI2VuZGlmCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI3VuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgZG9jZzMKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jcHJvYmUuYwppbmRleCBkMzc0NjAzLi40NTExNmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvY3Byb2JlLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2Nwcm9iZS5jCkBAIC01MCwxMSArNTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL2RvYzIwMDAuaD4KIAotLyogV2hlcmUgdG8gbG9vayBmb3IgdGhlIGRldmljZXM/ICovCi0jaWZuZGVmIENPTkZJR19NVERfRE9DUFJPQkVfQUREUkVTUwotI2RlZmluZSBDT05GSUdfTVREX0RPQ1BST0JFX0FERFJFU1MgMAotI2VuZGlmCi0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfRE9DUFJPQkVfQUREUkVTUzsKIG1vZHVsZV9wYXJhbShkb2NfY29uZmlnX2xvY2F0aW9uLCB1bG9uZywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2xhcnQuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCmluZGV4IDc3MmEwZmYuLjNhMTFlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jCkBAIC0zNCw5ICszNCw2IEBACiAvKiBkZWJ1Z2dpbmcgKi8KIC8vI2RlZmluZSBMQVJUX0RFQlVHCiAKLS8qIHBhcnRpdGlvbiBzdXBwb3J0ICovCi0jZGVmaW5lIEhBVkVfUEFSVElUSU9OUwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ0LDkgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpZmRlZiBIQVZFX1BBUlRJVElPTlMKICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX1NBMTEwMF9MQVJUCiAjZXJyb3IgVGhpcyBpcyBmb3IgTEFSVCBhcmNoaXRlY3R1cmUgb25seQpAQCAtNTk4LDcgKzU5Myw2IEBACiAJfQogfTsKIAotI2lmZGVmIEhBVkVfUEFSVElUSU9OUwogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGxhcnRfcGFydGl0aW9uc1tdID0gewogCS8qIGJsb2IgKi8KIAl7CkBAIC02MTksNyArNjEzLDcgQEAKIAkJLnNpemUJPSBJTklUUkRfTEVOLAkJLyogTVREUEFSVF9TSVpfRlVMTCAqLwogCX0KIH07Ci0jZW5kaWYKKyNkZWZpbmUgTlVNX1BBUlRJVElPTlMgQVJSQVlfU0laRShsYXJ0X3BhcnRpdGlvbnMpCiAKIHN0YXRpYyBpbnQgX19pbml0IGxhcnRfZmxhc2hfaW5pdCAodm9pZCkKIHsKQEAgLTY2OCw3ICs2NjIsNiBAQAogCQkJICAgcmVzdWx0LG10ZC5lcmFzZXJlZ2lvbnNbcmVzdWx0XS5lcmFzZXNpemUsbXRkLmVyYXNlcmVnaW9uc1tyZXN1bHRdLmVyYXNlc2l6ZSAvIDEwMjQsCiAJCQkgICByZXN1bHQsbXRkLmVyYXNlcmVnaW9uc1tyZXN1bHRdLm51bWJsb2Nrcyk7CiAKLSNpZmRlZiBIQVZFX1BBUlRJVElPTlMKICAgIHByaW50ayAoIlxucGFydGl0aW9ucyA9ICVkXG4iLCBBUlJBWV9TSVpFKGxhcnRfcGFydGl0aW9ucykpOwogCiAgICBmb3IgKHJlc3VsdCA9IDA7IHJlc3VsdCA8IEFSUkFZX1NJWkUobGFydF9wYXJ0aXRpb25zKTsgcmVzdWx0KyspCkBAIC02ODEsMjUgKzY3NCwxNiBAQAogCQkJIHJlc3VsdCxsYXJ0X3BhcnRpdGlvbnNbcmVzdWx0XS5vZmZzZXQsCiAJCQkgcmVzdWx0LGxhcnRfcGFydGl0aW9uc1tyZXN1bHRdLnNpemUsbGFydF9wYXJ0aXRpb25zW3Jlc3VsdF0uc2l6ZSAvIDEwMjQpOwogI2VuZGlmCi0jZW5kaWYKIAotI2lmbmRlZiBIQVZFX1BBUlRJVElPTlMKLSAgIHJlc3VsdCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJm10ZCwgTlVMTCwgMCk7Ci0jZWxzZQogICAgcmVzdWx0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmbXRkLCBsYXJ0X3BhcnRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobGFydF9wYXJ0aXRpb25zKSk7Ci0jZW5kaWYKIAogICAgcmV0dXJuIChyZXN1bHQpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbGFydF9mbGFzaF9leGl0ICh2b2lkKQogewotI2lmbmRlZiBIQVZFX1BBUlRJVElPTlMKICAgIG10ZF9kZXZpY2VfdW5yZWdpc3RlcigmbXRkKTsKLSNlbHNlCi0gICBtdGRfZGV2aWNlX3VucmVnaXN0ZXIoJm10ZCk7Ci0jZW5kaWYKIH0KIAogbW9kdWxlX2luaXQgKGxhcnRfZmxhc2hfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCAzNTE4MGU0Li44ODQ5MDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvY2ZpLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KQEAgLTg4LDcgKzg5LDYgQEAKIAlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwogCXN0cnVjdCBtdXRleAkJbG9jazsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKLQl1bnNpZ25lZAkJcGFydGl0aW9uZWQ6MTsKIAl1MTYJCQlwYWdlX3NpemU7CiAJdTE2CQkJYWRkcl93aWR0aDsKIAl1OAkJCWVyYXNlX29wY29kZTsKQEAgLTIwOSw5ICsyMDksOCBAQAogICovCiBzdGF0aWMgaW50IGVyYXNlX2NoaXAoc3RydWN0IG0yNXAgKmZsYXNoKQogewotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgJWxsZEtpQlxuIiwKLQkgICAgICBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCi0JICAgICAgKGxvbmcgbG9uZykoZmxhc2gtPm10ZC5zaXplID4+IDEwKSk7CisJcHJfZGVidWcoIiVzOiAlcyAlbGxkS2lCXG4iLCBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCisJCQkobG9uZyBsb25nKShmbGFzaC0+bXRkLnNpemUgPj4gMTApKTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KIAlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKQEAgLTI1MCw5ICsyNDksOCBAQAogICovCiBzdGF0aWMgaW50IGVyYXNlX3NlY3RvcihzdHJ1Y3QgbTI1cCAqZmxhc2gsIHUzMiBvZmZzZXQpCiB7Ci0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiAlcyAlZEtpQiBhdCAweCUwOHhcbiIsCi0JCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCi0JCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsIG9mZnNldCk7CisJcHJfZGVidWcoIiVzOiAlcyAlZEtpQiBhdCAweCUwOHhcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAorCQkJX19mdW5jX18sIGZsYXNoLT5tdGQuZXJhc2VzaXplIC8gMTAyNCwgb2Zmc2V0KTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KIAlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKQEAgLTI4Niw5ICsyODQsOSBAQAogCXUzMiBhZGRyLGxlbjsKIAl1aW50MzJfdCByZW07CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JWxseCwgbGVuICVsbGRcbiIsCi0JICAgICAgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAiYXQiLAotCSAgICAgIChsb25nIGxvbmcpaW5zdHItPmFkZHIsIChsb25nIGxvbmcpaW5zdHItPmxlbik7CisJcHJfZGVidWcoIiVzOiAlcyBhdCAweCVsbHgsIGxlbiAlbGxkXG4iLCBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwKKwkJCV9fZnVuY19fLCAobG9uZyBsb25nKWluc3RyLT5hZGRyLAorCQkJKGxvbmcgbG9uZylpbnN0ci0+bGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gZmxhc2gtPm10ZC5zaXplKQpAQCAtMzQ4LDkgKzM0Niw4IEBACiAJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCi0JCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJmcm9tIiwKLQkJCSh1MzIpZnJvbSwgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6ICVzIGZyb20gMHglMDh4LCBsZW4gJXpkXG4iLCBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwKKwkJCV9fZnVuY19fLCAodTMyKWZyb20sIGxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCiAJaWYgKCFsZW4pCkBAIC00MTcsOSArNDE0LDggQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKLQkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywgInRvIiwKLQkJCSh1MzIpdG8sIGxlbik7CisJcHJfZGVidWcoIiVzOiAlcyB0byAweCUwOHgsIGxlbiAlemRcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAorCQkJX19mdW5jX18sICh1MzIpdG8sIGxlbik7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtNTEwLDkgKzUwNiw4IEBACiAJc2l6ZV90IGFjdHVhbDsKIAlpbnQgY21kX3N6LCByZXQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKLQkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywgInRvIiwKLQkJCSh1MzIpdG8sIGxlbik7CisJcHJfZGVidWcoIiVzOiAlcyB0byAweCUwOHgsIGxlbiAlemRcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAorCQkJX19mdW5jX18sICh1MzIpdG8sIGxlbik7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtNjYxLDYgKzY1Niw3IEBACiAJeyAiYXQyNWZzMDQwIiwgIElORk8oMHgxZjY2MDQsIDAsIDY0ICogMTAyNCwgICA4LCBTRUNUXzRLKSB9LAogCiAJeyAiYXQyNWRmMDQxYSIsIElORk8oMHgxZjQ0MDEsIDAsIDY0ICogMTAyNCwgICA4LCBTRUNUXzRLKSB9LAorCXsgImF0MjVkZjMyMWEiLCBJTkZPKDB4MWY0NzAxLCAwLCA2NCAqIDEwMjQsICA2NCwgU0VDVF80SykgfSwKIAl7ICJhdDI1ZGY2NDEiLCAgSU5GTygweDFmNDgwMCwgMCwgNjQgKiAxMDI0LCAxMjgsIFNFQ1RfNEspIH0sCiAKIAl7ICJhdDI2ZjAwNCIsICAgSU5GTygweDFmMDQwMCwgMCwgNjQgKiAxMDI0LCAgOCwgU0VDVF80SykgfSwKQEAgLTY3MSw2ICs2NjcsNyBAQAogCS8qIEVPTiAtLSBlbjI1eHh4ICovCiAJeyAiZW4yNWYzMiIsIElORk8oMHgxYzMxMTYsIDAsIDY0ICogMTAyNCwgIDY0LCBTRUNUXzRLKSB9LAogCXsgImVuMjVwMzIiLCBJTkZPKDB4MWMyMDE2LCAwLCA2NCAqIDEwMjQsICA2NCwgMCkgfSwKKwl7ICJlbjI1cTMyYiIsIElORk8oMHgxYzMwMTYsIDAsIDY0ICogMTAyNCwgIDY0LCAwKSB9LAogCXsgImVuMjVwNjQiLCBJTkZPKDB4MWMyMDE3LCAwLCA2NCAqIDEwMjQsIDEyOCwgMCkgfSwKIAogCS8qIEludGVsL051bW9ueXggLS0geHh4czMzYiAqLwpAQCAtNzg4LDggKzc4NSw4IEBACiAJICovCiAJdG1wID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjb2RlLCAxLCBpZCwgNSk7CiAJaWYgKHRtcCA8IDApIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBlcnJvciAlZCByZWFkaW5nIEpFREVDIElEXG4iLAotCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgdG1wKTsKKwkJcHJfZGVidWcoIiVzOiBlcnJvciAlZCByZWFkaW5nIEpFREVDIElEXG4iLAorCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHRtcCk7CiAJCXJldHVybiBFUlJfUFRSKHRtcCk7CiAJfQogCWplZGVjID0gaWRbMF07CkBAIC04MjUsOCArODIyLDEyIEBACiAJc3RydWN0IG0yNXAJCQkqZmxhc2g7CiAJc3RydWN0IGZsYXNoX2luZm8JCSppbmZvOwogCXVuc2lnbmVkCQkJaTsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkJKnBhcnRzID0gTlVMTDsKLQlpbnQJCQkJbnJfcGFydHMgPSAwOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YQlwcGRhdGE7CisKKyNpZmRlZiBDT05GSUdfTVREX09GX1BBUlRTCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKHNwaS0+ZGV2Lm9mX25vZGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgogCiAJLyogUGxhdGZvcm0gZGF0YSBoZWxwcyBzb3J0IG91dCB3aGljaCBjaGlwIHR5cGUgd2UgaGF2ZSwgYXMKIAkgKiB3ZWxsIGFzIGhvdyB0aGlzIGJvYXJkIHBhcnRpdGlvbnMgaXQuICBJZiB3ZSBkb24ndCBoYXZlCkBAIC05MjgsNiArOTI5LDcgQEAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBNMjVQX05PX0VSQVNFKQogCQlmbGFzaC0+bXRkLmZsYWdzIHw9IE1URF9OT19FUkFTRTsKIAorCXBwZGF0YS5vZl9ub2RlID0gc3BpLT5kZXYub2Zfbm9kZTsKIAlmbGFzaC0+bXRkLmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJZmxhc2gtPnBhZ2Vfc2l6ZSA9IGluZm8tPnBhZ2Vfc2l6ZTsKIApAQCAtOTQ1LDggKzk0Nyw3IEBACiAJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVsbGQgS2J5dGVzKVxuIiwgaWQtPm5hbWUsCiAJCQkobG9uZyBsb25nKWZsYXNoLT5tdGQuc2l6ZSA+PiAxMCk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAotCQkibXRkIC5uYW1lID0gJXMsIC5zaXplID0gMHglbGx4ICglbGxkTWlCKSAiCisJcHJfZGVidWcoIm10ZCAubmFtZSA9ICVzLCAuc2l6ZSA9IDB4JWxseCAoJWxsZE1pQikgIgogCQkJIi5lcmFzZXNpemUgPSAweCUuOHggKCV1S2lCKSAubnVtZXJhc2VyZWdpb25zID0gJWRcbiIsCiAJCWZsYXNoLT5tdGQubmFtZSwKIAkJKGxvbmcgbG9uZylmbGFzaC0+bXRkLnNpemUsIChsb25nIGxvbmcpKGZsYXNoLT5tdGQuc2l6ZSA+PiAyMCksCkBAIC05NTUsOCArOTU2LDcgQEAKIAogCWlmIChmbGFzaC0+bXRkLm51bWVyYXNlcmVnaW9ucykKIAkJZm9yIChpID0gMDsgaSA8IGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zOyBpKyspCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLAotCQkJCSJtdGQuZXJhc2VyZWdpb25zWyVkXSA9IHsgLm9mZnNldCA9IDB4JWxseCwgIgorCQkJcHJfZGVidWcoIm10ZC5lcmFzZXJlZ2lvbnNbJWRdID0geyAub2Zmc2V0ID0gMHglbGx4LCAiCiAJCQkJIi5lcmFzZXNpemUgPSAweCUuOHggKCV1S2lCKSwgIgogCQkJCSIubnVtYmxvY2tzID0gJWQgfVxuIiwKIAkJCQlpLCAobG9uZyBsb25nKWZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm9mZnNldCwKQEAgLTk2OCw0MSArOTY4LDkgQEAKIAkvKiBwYXJ0aXRpb25zIHNob3VsZCBtYXRjaCBzZWN0b3IgYm91bmRhcmllczsgYW5kIGl0IG1heSBiZSBnb29kIHRvCiAJICogdXNlIHJlYWRvbmx5IHBhcnRpdGlvbnMgZm9yIHdyaXRlcHJvdGVjdGVkIHNlY3RvcnMgKEJQMi4uQlAwKS4KIAkgKi8KLQlpZiAobXRkX2hhc19jbWRsaW5lcGFydCgpKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdCi0JCQk9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgfTsKLQotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkLAotCQkJCQkJcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7Ci0JfQotCi0JaWYgKG5yX3BhcnRzIDw9IDAgJiYgZGF0YSAmJiBkYXRhLT5wYXJ0cykgewotCQlwYXJ0cyA9IGRhdGEtPnBhcnRzOwotCQlucl9wYXJ0cyA9IGRhdGEtPm5yX3BhcnRzOwotCX0KLQotI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKLQlpZiAobnJfcGFydHMgPD0gMCAmJiBzcGktPmRldi5vZl9ub2RlKSB7Ci0JCW5yX3BhcnRzID0gb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoJnNwaS0+ZGV2LAotCQkJCQkJICAgc3BpLT5kZXYub2Zfbm9kZSwgJnBhcnRzKTsKLQl9Ci0jZW5kaWYKLQotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG5yX3BhcnRzOyBpKyspIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJwYXJ0aXRpb25zWyVkXSA9ICIKLQkJCSAgICAgICJ7Lm5hbWUgPSAlcywgLm9mZnNldCA9IDB4JWxseCwgIgotCQkJICAgICAgIi5zaXplID0gMHglbGx4ICglbGxkS2lCKSB9XG4iLAotCQkJICAgICAgaSwgcGFydHNbaV0ubmFtZSwKLQkJCSAgICAgIChsb25nIGxvbmcpcGFydHNbaV0ub2Zmc2V0LAotCQkJICAgICAgKGxvbmcgbG9uZylwYXJ0c1tpXS5zaXplLAotCQkJICAgICAgKGxvbmcgbG9uZykocGFydHNbaV0uc2l6ZSA+PiAxMCkpOwotCQl9Ci0JCWZsYXNoLT5wYXJ0aXRpb25lZCA9IDE7Ci0JfQotCi0JcmV0dXJuIG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmZsYXNoLT5tdGQsIHBhcnRzLCBucl9wYXJ0cykgPT0gMSA/Ci0JCS1FTk9ERVYgOiAwOworCXJldHVybiBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZmbGFzaC0+bXRkLCBOVUxMLCAmcHBkYXRhLAorCQkJZGF0YSA/IGRhdGEtPnBhcnRzIDogTlVMTCwKKwkJCWRhdGEgPyBkYXRhLT5ucl9wYXJ0cyA6IDApOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKaW5kZXggMTM3NDlkNC4uZDc1YzdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CkBAIC0yNCw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAKLQogLyoKICAqIERhdGFGbGFzaCBpcyBhIGtpbmQgb2YgU1BJIGZsYXNoLiAgTW9zdCBBVDQ1IGNoaXBzIGhhdmUgdHdvIGJ1ZmZlcnMgaW4KICAqIGVhY2ggY2hpcCwgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGRvdWJsZSBidWZmZXJlZCBJL087IGJ1dCB0aGlzIGRyaXZlcgpAQCAtOTgsNiArOTksMTYgQEAKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRhdGFmbGFzaF9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0NDUiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsZGF0YWZsYXNoIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisjZWxzZQorI2RlZmluZSBkYXRhZmxhc2hfZHRfaWRzIE5VTEwKKyNlbmRpZgorCiAvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCiAKIC8qCkBAIC0xMjIsNyArMTMzLDcgQEAKIAlmb3IgKDs7KSB7CiAJCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogc3RhdHVzICVkP1xuIiwKKwkJCXByX2RlYnVnKCIlczogc3RhdHVzICVkP1xuIiwKIAkJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzKTsKIAkJCXN0YXR1cyA9IDA7CiAJCX0KQEAgLTE0OSw3ICsxNjAsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAl1aW50MzJfdAkJcmVtOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiBlcmFzZSBhZGRyPTB4JWxseCBsZW4gMHglbGx4XG4iLAorCXByX2RlYnVnKCIlczogZXJhc2UgYWRkcj0weCVsbHggbGVuIDB4JWxseFxuIiwKIAkgICAgICBkZXZfbmFtZSgmc3BpLT5kZXYpLCAobG9uZyBsb25nKWluc3RyLT5hZGRyLAogCSAgICAgIChsb25nIGxvbmcpaW5zdHItPmxlbik7CiAKQEAgLTE4Nyw3ICsxOTgsNyBAQAogCQljb21tYW5kWzJdID0gKHVpbnQ4X3QpKHBhZ2VhZGRyID4+IDgpOwogCQljb21tYW5kWzNdID0gMDsKIAotCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiRVJBU0UgJXM6ICgleCkgJXggJXggJXggWyVpXVxuIiwKKwkJcHJfZGVidWcoIkVSQVNFICVzOiAoJXgpICV4ICV4ICV4IFslaV1cbiIsCiAJCQlkb19ibG9jayA/ICJibG9jayIgOiAicGFnZSIsCiAJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdLAogCQkJcGFnZWFkZHIpOwpAQCAtMjM4LDggKzI0OSw4IEBACiAJdWludDhfdAkJCSpjb21tYW5kOwogCWludAkJCXN0YXR1czsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogcmVhZCAweCV4Li4weCV4XG4iLAotCQlkZXZfbmFtZSgmcHJpdi0+c3BpLT5kZXYpLCAodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSk7CisJcHJfZGVidWcoIiVzOiByZWFkIDB4JXguLjB4JXhcbiIsIGRldl9uYW1lKCZwcml2LT5zcGktPmRldiksCisJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSk7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtMjU1LDcgKzI2Niw3IEBACiAKIAljb21tYW5kID0gcHJpdi0+Y29tbWFuZDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJSRUFEOiAoJXgpICV4ICV4ICV4XG4iLAorCXByX2RlYnVnKCJSRUFEOiAoJXgpICV4ICV4ICV4XG4iLAogCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CkBAIC0yODcsNyArMjk4LDcgQEAKIAkJKnJldGxlbiA9IG1zZy5hY3R1YWxfbGVuZ3RoIC0gODsKIAkJc3RhdHVzID0gMDsKIAl9IGVsc2UKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZWFkICV4Li4leCAtLT4gJWRcbiIsCisJCXByX2RlYnVnKCIlczogcmVhZCAleC4uJXggLS0+ICVkXG4iLAogCQkJZGV2X25hbWUoJnByaXYtPnNwaS0+ZGV2KSwKIAkJCSh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pLAogCQkJc3RhdHVzKTsKQEAgLTMxNCw3ICszMjUsNyBAQAogCWludAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJdWludDhfdAkJCSpjb21tYW5kOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiB3cml0ZSAweCV4Li4weCV4XG4iLAorCXByX2RlYnVnKCIlczogd3JpdGUgMHgleC4uMHgleFxuIiwKIAkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CiAKIAkqcmV0bGVuID0gMDsKQEAgLTM0MCw3ICszNTEsNyBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CiAJd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIndyaXRlIEAgJWk6JWkgbGVuPSVpXG4iLAorCQlwcl9kZWJ1Zygid3JpdGUgQCAlaTolaSBsZW49JWlcbiIsCiAJCQlwYWdlYWRkciwgb2Zmc2V0LCB3cml0ZWxlbik7CiAKIAkJLyogUkVWSVNJVDoKQEAgLTM2OCwxMiArMzc5LDEyIEBACiAJCQljb21tYW5kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OwogCQkJY29tbWFuZFszXSA9IDA7CiAKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJUUkFOU0ZFUjogKCV4KSAleCAleCAleFxuIiwKKwkJCXByX2RlYnVnKCJUUkFOU0ZFUjogKCV4KSAleCAleCAleFxuIiwKIAkJCQljb21tYW5kWzBdLCBjb21tYW5kWzFdLCBjb21tYW5kWzJdLCBjb21tYW5kWzNdKTsKIAogCQkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJCWlmIChzdGF0dXMgPCAwKQotCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogeGZlciAldSAtPiAlZCBcbiIsCisJCQkJcHJfZGVidWcoIiVzOiB4ZmVyICV1IC0+ICVkXG4iLAogCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCQkodm9pZCkgZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwpAQCAtMzg2LDcgKzM5Nyw3IEBACiAJCWNvbW1hbmRbMl0gPSAoYWRkciAmIDB4MDAwMEZGMDApID4+IDg7CiAJCWNvbW1hbmRbM10gPSAoYWRkciAmIDB4MDAwMDAwRkYpOwogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJQUk9HUkFNOiAoJXgpICV4ICV4ICV4XG4iLAorCQlwcl9kZWJ1ZygiUFJPR1JBTTogKCV4KSAleCAleCAleFxuIiwKIAkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOwogCiAJCXhbMV0udHhfYnVmID0gd3JpdGVidWY7CkBAIC0zOTUsNyArNDA2LDcgQEAKIAkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJc3BpX3RyYW5zZmVyX2RlbCh4ICsgMSk7CiAJCWlmIChzdGF0dXMgPCAwKQotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBwZ20gJXUvJXUgLT4gJWQgXG4iLAorCQkJcHJfZGVidWcoIiVzOiBwZ20gJXUvJXUgLT4gJWRcbiIsCiAJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CiAKIAkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKQEAgLTQxMCwxMiArNDIxLDEyIEBACiAJCWNvbW1hbmRbMl0gPSAoYWRkciAmIDB4MDAwMEZGMDApID4+IDg7CiAJCWNvbW1hbmRbM10gPSAwOwogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJDT01QQVJFOiAoJXgpICV4ICV4ICV4XG4iLAorCQlwcl9kZWJ1ZygiQ09NUEFSRTogKCV4KSAleCAleCAleFxuIiwKIAkJCWNvbW1hbmRbMF0sIGNvbW1hbmRbMV0sIGNvbW1hbmRbMl0sIGNvbW1hbmRbM10pOwogCiAJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CiAJCWlmIChzdGF0dXMgPCAwKQotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBjb21wYXJlICV1IC0+ICVkIFxuIiwKKwkJCXByX2RlYnVnKCIlczogY29tcGFyZSAldSAtPiAlZFxuIiwKIAkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCXN0YXR1cyA9IGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKQEAgLTYzNCwxMSArNjQ1LDEwIEBACiB7CiAJc3RydWN0IGRhdGFmbGFzaAkJKnByaXY7CiAJc3RydWN0IG10ZF9pbmZvCQkJKmRldmljZTsKKwlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEJcHBkYXRhOwogCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJY2hhcgkJCQkqb3RwX3RhZyA9ICIiOwogCWludAkJCQllcnIgPSAwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCQkqcGFydHM7Ci0JaW50CQkJCW5yX3BhcnRzID0gMDsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZiAqcHJpdiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpAQCAtNjc3LDI4ICs2ODcsMTEgQEAKIAkJCXBhZ2VzaXplLCBvdHBfdGFnKTsKIAlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBwcml2KTsKIAotCWlmIChtdGRfaGFzX2NtZGxpbmVwYXJ0KCkpIHsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwsIH07CisJcHBkYXRhLm9mX25vZGUgPSBzcGktPmRldi5vZl9ub2RlOworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoZGV2aWNlLCBOVUxMLCAmcHBkYXRhLAorCQkJcGRhdGEgPyBwZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJcGRhdGEgPyBwZGF0YS0+bnJfcGFydHMgOiAwKTsKIAotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGRldmljZSwgcGFydF9wcm9iZXMsICZwYXJ0cywKLQkJCQkJCTApOwotCX0KLQotCWlmIChucl9wYXJ0cyA8PSAwICYmIHBkYXRhICYmIHBkYXRhLT5wYXJ0cykgewotCQlwYXJ0cyA9IHBkYXRhLT5wYXJ0czsKLQkJbnJfcGFydHMgPSBwZGF0YS0+bnJfcGFydHM7Ci0JfQotCi0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlwcml2LT5wYXJ0aXRpb25lZCA9IDE7Ci0JCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlLCBwYXJ0cywgbnJfcGFydHMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAobXRkX2RldmljZV9yZWdpc3RlcihkZXZpY2UsIE5VTEwsIDApID09IDEpCi0JCWVyciA9IC1FTk9ERVY7Ci0KLW91dDoKIAlpZiAoIWVycikKIAkJcmV0dXJuIDA7CiAKQEAgLTc4Nyw3ICs3ODAsNyBAQAogCSAqLwogCXRtcCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY29kZSwgMSwgaWQsIDMpOwogCWlmICh0bXAgPCAwKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogZXJyb3IgJWQgcmVhZGluZyBKRURFQyBJRFxuIiwKKwkJcHJfZGVidWcoIiVzOiBlcnJvciAlZCByZWFkaW5nIEpFREVDIElEXG4iLAogCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgdG1wKTsKIAkJcmV0dXJuIEVSUl9QVFIodG1wKTsKIAl9CkBAIC04MDQsNyArNzk3LDcgQEAKIAkJCXRtcCA8IEFSUkFZX1NJWkUoZGF0YWZsYXNoX2RhdGEpOwogCQkJdG1wKyssIGluZm8rKykgewogCQlpZiAoaW5mby0+amVkZWNfaWQgPT0gamVkZWMpIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogT1RQLCBzZWN0b3IgcHJvdGVjdCVzXG4iLAorCQkJcHJfZGVidWcoIiVzOiBPVFAsIHNlY3RvciBwcm90ZWN0JXNcbiIsCiAJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwKIAkJCQkoaW5mby0+ZmxhZ3MgJiBTVVBfUE9XMlBTKQogCQkJCQk/ICIsIGJpbmFyeSBwYWdlc2l6ZSIgOiAiIgpAQCAtODEyLDggKzgwNSw3IEBACiAJCQlpZiAoaW5mby0+ZmxhZ3MgJiBTVVBfUE9XMlBTKSB7CiAJCQkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCQkJCQkiJXM6IHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJCQkJcHJfZGVidWcoIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCiAJCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCQkJCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOwogCQkJCX0KQEAgLTg3OCw3ICs4NzAsNyBAQAogCSAqLwogCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCisJCXByX2RlYnVnKCIlczogc3RhdHVzIGVycm9yICVkXG4iLAogCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZikKIAkJCXN0YXR1cyA9IC1FTk9ERVY7CkBAIC05MTQsMTQgKzkwNiwxNCBAQAogCQlicmVhazsKIAkvKiBvYnNvbGV0ZSBBVDQ1REIxMjgyIG5vdCAoeWV0Pykgc3VwcG9ydGVkICovCiAJZGVmYXVsdDoKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgKCV4KVxuIiwKLQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMgJiAweDNjKTsKKwkJcHJfZGVidWcoIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgKCV4KVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSwKKwkJCQlzdGF0dXMgJiAweDNjKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAl9CiAKIAlpZiAoc3RhdHVzIDwgMCkKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBhZGRfZGF0YWZsYXNoIC0tPiAlZFxuIiwKLQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOworCQlwcl9kZWJ1ZygiJXM6IGFkZF9kYXRhZmxhc2ggLS0+ICVkXG4iLCBkZXZfbmFtZSgmc3BpLT5kZXYpLAorCQkJCXN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtOTMxLDcgKzkyMyw3IEBACiAJc3RydWN0IGRhdGFmbGFzaAkqZmxhc2ggPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CisJcHJfZGVidWcoIiVzOiByZW1vdmVcbiIsIGRldl9uYW1lKCZzcGktPmRldikpOwogCiAJc3RhdHVzID0gbXRkX2RldmljZV91bnJlZ2lzdGVyKCZmbGFzaC0+bXRkKTsKIAlpZiAoc3RhdHVzID09IDApIHsKQEAgLTk0Niw2ICs5MzgsNyBAQAogCQkubmFtZQkJPSAibXRkX2RhdGFmbGFzaCIsCiAJCS5idXMJCT0gJnNwaV9idXNfdHlwZSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBkYXRhZmxhc2hfZHRfaWRzLAogCX0sCiAKIAkucHJvYmUJCT0gZGF0YWZsYXNoX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9zc3QyNWwuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvc3N0MjVsLmMKaW5kZXggODNlODBjNi4uZDM4ZWYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9zc3QyNWwuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3NzdDI1bC5jCkBAIC01Miw4ICs1Miw2IEBACiAJc3RydWN0IHNwaV9kZXZpY2UJKnNwaTsKIAlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CiAJc3RydWN0IG10ZF9pbmZvCQltdGQ7Ci0KLQlpbnQgCQkJcGFydGl0aW9uZWQ7CiB9OwogCiBzdHJ1Y3QgZmxhc2hfaW5mbyB7CkBAIC0zODEsOCArMzc5LDYgQEAKIAlzdHJ1Y3Qgc3N0MjVsX2ZsYXNoICpmbGFzaDsKIAlzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSAqZGF0YTsKIAlpbnQgcmV0LCBpOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cyA9IE5VTEw7Ci0JaW50IG5yX3BhcnRzID0gMDsKIAogCWZsYXNoX2luZm8gPSBzc3QyNWxfbWF0Y2hfZGV2aWNlKHNwaSk7CiAJaWYgKCFmbGFzaF9pbmZvKQpAQCAtNDE0LDggKzQxMCw3IEBACiAJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVsbGQgS2lCKVxuIiwgZmxhc2hfaW5mby0+bmFtZSwKIAkJIChsb25nIGxvbmcpZmxhc2gtPm10ZC5zaXplID4+IDEwKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JICAgICAgIm10ZCAubmFtZSA9ICVzLCAuc2l6ZSA9IDB4JWxseCAoJWxsZE1pQikgIgorCXByX2RlYnVnKCJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCVsbHggKCVsbGRNaUIpICIKIAkgICAgICAiLmVyYXNlc2l6ZSA9IDB4JS44eCAoJXVLaUIpIC5udW1lcmFzZXJlZ2lvbnMgPSAlZFxuIiwKIAkgICAgICBmbGFzaC0+bXRkLm5hbWUsCiAJICAgICAgKGxvbmcgbG9uZylmbGFzaC0+bXRkLnNpemUsIChsb25nIGxvbmcpKGZsYXNoLT5tdGQuc2l6ZSA+PiAyMCksCkBAIC00MjMsMzcgKzQxOCwxMCBAQAogCSAgICAgIGZsYXNoLT5tdGQubnVtZXJhc2VyZWdpb25zKTsKIAogCi0JaWYgKG10ZF9oYXNfY21kbGluZXBhcnQoKSkgewotCQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsiY21kbGluZXBhcnQiLCBOVUxMfTsKLQotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkLAotCQkJCQkJcGFydF9wcm9iZXMsCi0JCQkJCQkmcGFydHMsIDApOwotCX0KLQotCWlmIChucl9wYXJ0cyA8PSAwICYmIGRhdGEgJiYgZGF0YS0+cGFydHMpIHsKLQkJcGFydHMgPSBkYXRhLT5wYXJ0czsKLQkJbnJfcGFydHMgPSBkYXRhLT5ucl9wYXJ0czsKLQl9Ci0KLQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBucl9wYXJ0czsgaSsrKSB7Ci0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicGFydGl0aW9uc1slZF0gPSAiCi0JCQkgICAgICAiey5uYW1lID0gJXMsIC5vZmZzZXQgPSAweCVsbHgsICIKLQkJCSAgICAgICIuc2l6ZSA9IDB4JWxseCAoJWxsZEtpQikgfVxuIiwKLQkJCSAgICAgIGksIHBhcnRzW2ldLm5hbWUsCi0JCQkgICAgICAobG9uZyBsb25nKXBhcnRzW2ldLm9mZnNldCwKLQkJCSAgICAgIChsb25nIGxvbmcpcGFydHNbaV0uc2l6ZSwKLQkJCSAgICAgIChsb25nIGxvbmcpKHBhcnRzW2ldLnNpemUgPj4gMTApKTsKLQkJfQotCi0JCWZsYXNoLT5wYXJ0aXRpb25lZCA9IDE7Ci0JCXJldHVybiBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZmbGFzaC0+bXRkLCBwYXJ0cywKLQkJCQkJICAgbnJfcGFydHMpOwotCX0KLQotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmZsYXNoLT5tdGQsIE5VTEwsIDApOwotCWlmIChyZXQgPT0gMSkgeworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmZsYXNoLT5tdGQsIE5VTEwsIDAsCisJCQlkYXRhID8gZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJZGF0YSA/IGRhdGEtPm5yX3BhcnRzIDogMCk7CisJaWYgKHJldCkgewogCQlrZnJlZShmbGFzaCk7CiAJCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIE5VTEwpOwogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Z0bC5jIGIvZHJpdmVycy9tdGQvZnRsLmMKaW5kZXggMDM3YjM5OS4uYzczODJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvZnRsLmMKQEAgLTMzOSw3ICszMzksNyBAQAogICAgIHN0cnVjdCBlcmFzZV9pbmZvICplcmFzZTsKIAogICAgIHhmZXIgPSAmcGFydC0+WGZlckluZm9beGZlcm51bV07Ci0gICAgREVCVUcoMSwgImZ0bF9jczogZXJhc2luZyB4ZmVyIHVuaXQgYXQgMHgleFxuIiwgeGZlci0+T2Zmc2V0KTsKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBlcmFzaW5nIHhmZXIgdW5pdCBhdCAweCV4XG4iLCB4ZmVyLT5PZmZzZXQpOwogICAgIHhmZXItPnN0YXRlID0gWEZFUl9FUkFTSU5HOwogCiAgICAgLyogSXMgdGhlcmUgYSBmcmVlIGVyYXNlIHNsb3Q/IEFsd2F5cyBpbiBNVEQuICovCkBAIC00MTUsNyArNDE1LDcgQEAKICAgICB4ZmVyID0gJnBhcnQtPlhmZXJJbmZvW2ldOwogICAgIHhmZXItPnN0YXRlID0gWEZFUl9GQUlMRUQ7CiAKLSAgICBERUJVRygxLCAiZnRsX2NzOiBwcmVwYXJpbmcgeGZlciB1bml0IGF0IDB4JXhcbiIsIHhmZXItPk9mZnNldCk7CisgICAgcHJfZGVidWcoImZ0bF9jczogcHJlcGFyaW5nIHhmZXIgdW5pdCBhdCAweCV4XG4iLCB4ZmVyLT5PZmZzZXQpOwogCiAgICAgLyogV3JpdGUgdGhlIHRyYW5zZmVyIHVuaXQgaGVhZGVyICovCiAgICAgaGVhZGVyID0gcGFydC0+aGVhZGVyOwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAKICAgICBldW4gPSAmcGFydC0+RVVOSW5mb1tzcmN1bml0XTsKICAgICB4ZmVyID0gJnBhcnQtPlhmZXJJbmZvW3hmZXJ1bml0XTsKLSAgICBERUJVRygyLCAiZnRsX2NzOiBjb3B5aW5nIGJsb2NrIDB4JXggdG8gMHgleFxuIiwKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBjb3B5aW5nIGJsb2NrIDB4JXggdG8gMHgleFxuIiwKIAkgIGV1bi0+T2Zmc2V0LCB4ZmVyLT5PZmZzZXQpOwogCiAKQEAgLTU5OCw3ICs1OTgsNyBAQAogICAgIHVuaXQgd2l0aCB0aGUgZmV3ZXN0IGVyYXNlcywgYW5kIHVzdWFsbHkgcGljayB0aGUgZGF0YSB1bml0IHdpdGgKICAgICB0aGUgbW9zdCBkZWxldGVkIGJsb2Nrcy4gIEJ1dCB3aXRoIGEgc21hbGwgcHJvYmFiaWxpdHksIHBpY2sgdGhlCiAgICAgb2xkZXN0IGRhdGEgdW5pdCBpbnN0ZWFkLiAgVGhpcyBtZWFucyB0aGF0IHdlIGdlbmVyYWxseSBwb3N0cG9uZQotICAgIHRoZSBuZXh0IHJlY2xhaW1hdGlvbiBhcyBsb25nIGFzIHBvc3NpYmxlLCBidXQgc2h1ZmZsZSBzdGF0aWMKKyAgICB0aGUgbmV4dCByZWNsYW1hdGlvbiBhcyBsb25nIGFzIHBvc3NpYmxlLCBidXQgc2h1ZmZsZSBzdGF0aWMKICAgICBzdHVmZiBhcm91bmQgYSBiaXQgZm9yIHdlYXIgbGV2ZWxpbmcuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNjA5LDggKzYwOSw4IEBACiAgICAgdWludDMyX3QgYmVzdDsKICAgICBpbnQgcXVldWVkLCByZXQ7CiAKLSAgICBERUJVRygwLCAiZnRsX2NzOiByZWNsYWltaW5nIHNwYWNlLi4uXG4iKTsKLSAgICBERUJVRygzLCAiTnVtVHJhbnNmZXJVbml0cyA9PSAleFxuIiwgcGFydC0+aGVhZGVyLk51bVRyYW5zZmVyVW5pdHMpOworICAgIHByX2RlYnVnKCJmdGxfY3M6IHJlY2xhaW1pbmcgc3BhY2UuLi5cbiIpOworICAgIHByX2RlYnVnKCJOdW1UcmFuc2ZlclVuaXRzID09ICV4XG4iLCBwYXJ0LT5oZWFkZXIuTnVtVHJhbnNmZXJVbml0cyk7CiAgICAgLyogUGljayB0aGUgbGVhc3QgZXJhc2VkIHRyYW5zZmVyIHVuaXQgKi8KICAgICBiZXN0ID0gMHhmZmZmZmZmZjsgeGZlciA9IDB4ZmZmZjsKICAgICBkbyB7CkBAIC02MTgsMjIgKzYxOCwyMiBAQAogCWZvciAoaSA9IDA7IGkgPCBwYXJ0LT5oZWFkZXIuTnVtVHJhbnNmZXJVbml0czsgaSsrKSB7CiAJICAgIGludCBuPTA7CiAJICAgIGlmIChwYXJ0LT5YZmVySW5mb1tpXS5zdGF0ZSA9PSBYRkVSX1VOS05PV04pIHsKLQkJREVCVUcoMywiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfVU5LTk9XTlxuIixpKTsKKwkJcHJfZGVidWcoIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSBYRkVSX1VOS05PV05cbiIsaSk7CiAJCW49MTsKIAkJZXJhc2VfeGZlcihwYXJ0LCBpKTsKIAkgICAgfQogCSAgICBpZiAocGFydC0+WGZlckluZm9baV0uc3RhdGUgPT0gWEZFUl9FUkFTSU5HKSB7Ci0JCURFQlVHKDMsIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSBYRkVSX0VSQVNJTkdcbiIsaSk7CisJCXByX2RlYnVnKCJYZmVySW5mb1slZF0uc3RhdGUgPT0gWEZFUl9FUkFTSU5HXG4iLGkpOwogCQluPTE7CiAJCXF1ZXVlZCA9IDE7CiAJICAgIH0KIAkgICAgZWxzZSBpZiAocGFydC0+WGZlckluZm9baV0uc3RhdGUgPT0gWEZFUl9FUkFTRUQpIHsKLQkJREVCVUcoMywiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfRVJBU0VEXG4iLGkpOworCQlwcl9kZWJ1ZygiWGZlckluZm9bJWRdLnN0YXRlID09IFhGRVJfRVJBU0VEXG4iLGkpOwogCQluPTE7CiAJCXByZXBhcmVfeGZlcihwYXJ0LCBpKTsKIAkgICAgfQogCSAgICBpZiAocGFydC0+WGZlckluZm9baV0uc3RhdGUgPT0gWEZFUl9QUkVQQVJFRCkgewotCQlERUJVRygzLCJYZmVySW5mb1slZF0uc3RhdGUgPT0gWEZFUl9QUkVQQVJFRFxuIixpKTsKKwkJcHJfZGVidWcoIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSBYRkVSX1BSRVBBUkVEXG4iLGkpOwogCQluPTE7CiAJCWlmIChwYXJ0LT5YZmVySW5mb1tpXS5FcmFzZUNvdW50IDw9IGJlc3QpIHsKIAkJICAgIGJlc3QgPSBwYXJ0LT5YZmVySW5mb1tpXS5FcmFzZUNvdW50OwpAQCAtNjQxLDEyICs2NDEsMTIgQEAKIAkJfQogCSAgICB9CiAJCWlmICghbikKLQkJICAgIERFQlVHKDMsIlhmZXJJbmZvWyVkXS5zdGF0ZSA9PSAleFxuIixpLCBwYXJ0LT5YZmVySW5mb1tpXS5zdGF0ZSk7CisJCSAgICBwcl9kZWJ1ZygiWGZlckluZm9bJWRdLnN0YXRlID09ICV4XG4iLGksIHBhcnQtPlhmZXJJbmZvW2ldLnN0YXRlKTsKIAogCX0KIAlpZiAoeGZlciA9PSAweGZmZmYpIHsKIAkgICAgaWYgKHF1ZXVlZCkgewotCQlERUJVRygxLCAiZnRsX2NzOiB3YWl0aW5nIGZvciB0cmFuc2ZlciAiCisJCXByX2RlYnVnKCJmdGxfY3M6IHdhaXRpbmcgZm9yIHRyYW5zZmVyICIKIAkJICAgICAgInVuaXQgdG8gYmUgcHJlcGFyZWQuLi5cbiIpOwogCQlpZiAocGFydC0+bWJkLm10ZC0+c3luYykKIAkJCXBhcnQtPm1iZC5tdGQtPnN5bmMocGFydC0+bWJkLm10ZCk7CkBAIC02NTYsNyArNjU2LDcgQEAKIAkJICAgIHByaW50ayhLRVJOX05PVElDRSAiZnRsX2NzOiByZWNsYWltIGZhaWxlZDogbm8gIgogCQkJICAgInN1aXRhYmxlIHRyYW5zZmVyIHVuaXRzIVxuIik7CiAJCWVsc2UKLQkJICAgIERFQlVHKDEsICJmdGxfY3M6IHJlY2xhaW0gZmFpbGVkOiBubyAiCisJCSAgICBwcl9kZWJ1ZygiZnRsX2NzOiByZWNsYWltIGZhaWxlZDogbm8gIgogCQkJICAic3VpdGFibGUgdHJhbnNmZXIgdW5pdHMhXG4iKTsKIAogCQlyZXR1cm4gLUVJTzsKQEAgLTY2Niw3ICs2NjYsNyBAQAogCiAgICAgZXVuID0gMDsKICAgICBpZiAoKGppZmZpZXMgJSBzaHVmZmxlX2ZyZXEpID09IDApIHsKLQlERUJVRygxLCAiZnRsX2NzOiByZWN5Y2xpbmcgZnJlc2hlc3QgYmxvY2suLi5cbiIpOworCXByX2RlYnVnKCJmdGxfY3M6IHJlY3ljbGluZyBmcmVzaGVzdCBibG9jay4uLlxuIik7CiAJYmVzdCA9IDB4ZmZmZmZmZmY7CiAJZm9yIChpID0gMDsgaSA8IHBhcnQtPkRhdGFVbml0czsgaSsrKQogCSAgICBpZiAocGFydC0+RVVOSW5mb1tpXS5FcmFzZUNvdW50IDw9IGJlc3QpIHsKQEAgLTY4Niw3ICs2ODYsNyBAQAogCQlwcmludGsoS0VSTl9OT1RJQ0UgImZ0bF9jczogcmVjbGFpbSBmYWlsZWQ6ICIKIAkJICAgICAgICJubyBmcmVlIGJsb2NrcyFcbiIpOwogCSAgICBlbHNlCi0JCURFQlVHKDEsImZ0bF9jczogcmVjbGFpbSBmYWlsZWQ6ICIKKwkJcHJfZGVidWcoImZ0bF9jczogcmVjbGFpbSBmYWlsZWQ6ICIKIAkJICAgICAgICJubyBmcmVlIGJsb2NrcyFcbiIpOwogCiAJICAgIHJldHVybiAtRUlPOwpAQCAtNzcxLDcgKzc3MSw3IEBACiAJcHJpbnRrKEtFUk5fTk9USUNFICJmdGxfY3M6IGJhZCBmcmVlIGxpc3QhXG4iKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgREVCVUcoMiwgImZ0bF9jczogZm91bmQgZnJlZSBibG9jayBhdCAlZCBpbiAlZFxuIiwgYmxrLCBldW4pOworICAgIHByX2RlYnVnKCJmdGxfY3M6IGZvdW5kIGZyZWUgYmxvY2sgYXQgJWQgaW4gJWRcbiIsIGJsaywgZXVuKTsKICAgICByZXR1cm4gYmxrOwogCiB9IC8qIGZpbmRfZnJlZSAqLwpAQCAtNzkxLDcgKzc5MSw3IEBACiAgICAgaW50IHJldDsKICAgICBzaXplX3Qgb2Zmc2V0LCByZXRsZW47CiAKLSAgICBERUJVRygyLCAiZnRsX2NzOiBmdGxfcmVhZCgweCVwLCAweCVseCwgJWxkKVxuIiwKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBmdGxfcmVhZCgweCVwLCAweCVseCwgJWxkKVxuIiwKIAkgIHBhcnQsIHNlY3RvciwgbmJsb2Nrcyk7CiAgICAgaWYgKCEocGFydC0+c3RhdGUgJiBGVExfRk9STUFUVEVEKSkgewogCXByaW50ayhLRVJOX05PVElDRSAiZnRsX2NzOiBiYWQgcGFydGl0aW9uXG4iKTsKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgIGludCByZXQ7CiAgICAgc2l6ZV90IHJldGxlbiwgb2Zmc2V0OwogCi0gICAgREVCVUcoMiwgImZ0bF9jczogc2V0X2JhbV9lbnRyeSgweCVwLCAweCV4LCAweCV4KVxuIiwKKyAgICBwcl9kZWJ1ZygiZnRsX2NzOiBzZXRfYmFtX2VudHJ5KDB4JXAsIDB4JXgsIDB4JXgpXG4iLAogCSAgcGFydCwgbG9nX2FkZHIsIHZpcnRfYWRkcik7CiAgICAgYnNpemUgPSAxIDw8IHBhcnQtPmhlYWRlci5FcmFzZVVuaXRTaXplOwogICAgIGV1biA9IGxvZ19hZGRyIC8gYnNpemU7CkBAIC05MDUsNyArOTA1LDcgQEAKICAgICBpbnQgcmV0OwogICAgIHNpemVfdCByZXRsZW4sIG9mZnNldDsKIAotICAgIERFQlVHKDIsICJmdGxfY3M6IGZ0bF93cml0ZSgweCVwLCAlbGQsICVsZClcbiIsCisgICAgcHJfZGVidWcoImZ0bF9jczogZnRsX3dyaXRlKDB4JXAsICVsZCwgJWxkKVxuIiwKIAkgIHBhcnQsIHNlY3RvciwgbmJsb2Nrcyk7CiAgICAgaWYgKCEocGFydC0+c3RhdGUgJiBGVExfRk9STUFUVEVEKSkgewogCXByaW50ayhLRVJOX05PVElDRSAiZnRsX2NzOiBiYWQgcGFydGl0aW9uXG4iKTsKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAJcGFydGl0aW9uX3QgKnBhcnQgPSAodm9pZCAqKWRldjsKIAl1aW50MzJfdCBic2l6ZSA9IDEgPDwgcGFydC0+aGVhZGVyLkVyYXNlVW5pdFNpemU7CiAKLQlERUJVRygxLCAiRlRMIGVyYXNlIHNlY3RvciAlbGQgZm9yICVkIHNlY3RvcnNcbiIsCisJcHJfZGVidWcoIkZUTCBlcmFzZSBzZWN0b3IgJWxkIGZvciAlZCBzZWN0b3JzXG4iLAogCSAgICAgIHNlY3RvciwgbnJfc2VjdHMpOwogCiAJd2hpbGUgKG5yX3NlY3RzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9pbmZ0bGNvcmUuYyBiL2RyaXZlcnMvbXRkL2luZnRsY29yZS5jCmluZGV4IGQ3NTkyZTYuLmRkMDM0ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2luZnRsY29yZS5jCisrKyBiL2RyaXZlcnMvbXRkL2luZnRsY29yZS5jCkBAIC02MywxNCArNjMsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogYWRkX210ZCBmb3IgJXNcbiIsIG10ZC0+bmFtZSk7CisJcHJfZGVidWcoIklORlRMOiBhZGRfbXRkIGZvciAlc1xuIiwgbXRkLT5uYW1lKTsKIAogCWluZnRsID0ga3phbGxvYyhzaXplb2YoKmluZnRsKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIWluZnRsKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIklORlRMOiBPdXQgb2YgbWVtb3J5IGZvciBkYXRhIHN0cnVjdHVyZXNcbiIpOworCWlmICghaW5mdGwpCiAJCXJldHVybjsKLQl9CiAKIAlpbmZ0bC0+bWJkLm10ZCA9IG10ZDsKIAlpbmZ0bC0+bWJkLmRldm51bSA9IC0xOwpAQCAtMTMzLDcgKzEzMSw3IEBACiB7CiAJc3RydWN0IElORlRMcmVjb3JkICppbmZ0bCA9ICh2b2lkICopZGV2OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiByZW1vdmVfZGV2IChpPSVkKVxuIiwgZGV2LT5kZXZudW0pOworCXByX2RlYnVnKCJJTkZUTDogcmVtb3ZlX2RldiAoaT0lZClcbiIsIGRldi0+ZGV2bnVtKTsKIAogCWRlbF9tdGRfYmxrdHJhbnNfZGV2KGRldik7CiAKQEAgLTE1NCw3ICsxNTIsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gb2ZmcyAmIChtdGQtPndyaXRlc2l6ZSAtIDEpOwogCW9wcy5vb2JsZW4gPSBsZW47CiAJb3BzLm9vYmJ1ZiA9IGJ1ZjsKQEAgLTE3NCw3ICsxNzIsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gb2ZmcyAmIChtdGQtPndyaXRlc2l6ZSAtIDEpOwogCW9wcy5vb2JsZW4gPSBsZW47CiAJb3BzLm9vYmJ1ZiA9IGJ1ZjsKQEAgLTE5NCw3ICsxOTIsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gb2ZmczsKIAlvcHMub29ibGVuID0gbXRkLT5vb2JzaXplOwogCW9wcy5vb2JidWYgPSBvb2I7CkBAIC0yMTUsMTYgKzIxMywxNiBAQAogCXUxNiBwb3QgPSBpbmZ0bC0+TGFzdEZyZWVFVU47CiAJaW50IHNpbGx5ID0gaW5mdGwtPm5iX2Jsb2NrczsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogSU5GVExfZmluZGZyZWVibG9jayhpbmZ0bD0lcCwiCi0JCSJkZXNwZXJhdGU9JWQpXG4iLCBpbmZ0bCwgZGVzcGVyYXRlKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IElORlRMX2ZpbmRmcmVlYmxvY2soaW5mdGw9JXAsZGVzcGVyYXRlPSVkKVxuIiwKKwkJCWluZnRsLCBkZXNwZXJhdGUpOwogCiAJLyoKIAkgKiBOb3JtYWxseSwgd2UgZm9yY2UgYSBmb2xkIHRvIGhhcHBlbiBiZWZvcmUgd2UgcnVuIG91dCBvZiBmcmVlCiAJICogYmxvY2tzIGNvbXBsZXRlbHkuCiAJICovCiAJaWYgKCFkZXNwZXJhdGUgJiYgaW5mdGwtPm51bWZyZWVFVU5zIDwgMikgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiSU5GVEw6IHRoZXJlIGFyZSB0b28gZmV3IGZyZWUgIgotCQkJIkVVTnMgKCVkKVxuIiwgaW5mdGwtPm51bWZyZWVFVU5zKTsKKwkJcHJfZGVidWcoIklORlRMOiB0aGVyZSBhcmUgdG9vIGZldyBmcmVlIEVVTnMgKCVkKVxuIiwKKwkJCQlpbmZ0bC0+bnVtZnJlZUVVTnMpOwogCQlyZXR1cm4gQkxPQ0tfTklMOwogCX0KIApAQCAtMjU5LDggKzI1Nyw4IEBACiAJc3RydWN0IGluZnRsX29vYiBvb2I7CiAJc2l6ZV90IHJldGxlbjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogSU5GVExfZm9sZGNoYWluKGluZnRsPSVwLHRoaXNWVUM9JWQsIgotCQkicGVuZGluZz0lZClcbiIsIGluZnRsLCB0aGlzVlVDLCBwZW5kaW5nYmxvY2spOworCXByX2RlYnVnKCJJTkZUTDogSU5GVExfZm9sZGNoYWluKGluZnRsPSVwLHRoaXNWVUM9JWQscGVuZGluZz0lZClcbiIsCisJCQlpbmZ0bCwgdGhpc1ZVQywgcGVuZGluZ2Jsb2NrKTsKIAogCW1lbXNldChCbG9ja01hcCwgMHhmZiwgc2l6ZW9mKEJsb2NrTWFwKSk7CiAJbWVtc2V0KEJsb2NrRGVsZXRlZCwgMCwgc2l6ZW9mKEJsb2NrRGVsZXRlZCkpOwpAQCAtMzIzLDggKzMyMSw3IEBACiAJICogQ2hhaW4sIGFuZCB0aGUgRXJhc2UgVW5pdCBpbnRvIHdoaWNoIHdlIGFyZSBzdXBwb3NlZCB0byBiZSBjb3B5aW5nLgogCSAqIEdvIGZvciBpdC4KIAkgKi8KLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiSU5GVEw6IGZvbGRpbmcgY2hhaW4gJWQgaW50byB1bml0ICVkXG4iLAotCQl0aGlzVlVDLCB0YXJnZXRFVU4pOworCXByX2RlYnVnKCJJTkZUTDogZm9sZGluZyBjaGFpbiAlZCBpbnRvIHVuaXQgJWRcbiIsIHRoaXNWVUMsIHRhcmdldEVVTik7CiAKIAlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBpbmZ0bC0+RXJhc2VTaXplL1NFQ1RPUlNJWkUgOyBibG9jaysrKSB7CiAJCXVuc2lnbmVkIGNoYXIgbW92ZWJ1ZltTRUNUT1JTSVpFXTsKQEAgLTM0OSwxNCArMzQ2LDEzIEBACiAJCXJldCA9IG10ZC0+cmVhZChtdGQsIChpbmZ0bC0+RXJhc2VTaXplICogQmxvY2tNYXBbYmxvY2tdKSArCiAJCQkJKGJsb2NrICogU0VDVE9SU0laRSksIFNFQ1RPUlNJWkUsICZyZXRsZW4sCiAJCQkJbW92ZWJ1Zik7Ci0JCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRVVDTEVBTikgeworCQlpZiAocmV0IDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkgewogCQkJcmV0ID0gbXRkLT5yZWFkKG10ZCwKIAkJCQkJKGluZnRsLT5FcmFzZVNpemUgKiBCbG9ja01hcFtibG9ja10pICsKIAkJCQkJKGJsb2NrICogU0VDVE9SU0laRSksIFNFQ1RPUlNJWkUsCiAJCQkJCSZyZXRsZW4sIG1vdmVidWYpOwogCQkJaWYgKHJldCAhPSAtRUlPKQotCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJJTkZUTDogZXJyb3Igd2VudCAiCi0JCQkJICAgICAgImF3YXkgb24gcmV0cnk/XG4iKTsKKwkJCQlwcl9kZWJ1ZygiSU5GVEw6IGVycm9yIHdlbnQgYXdheSBvbiByZXRyeT9cbiIpOwogCQl9CiAJCW1lbXNldCgmb29iLCAweGZmLCBzaXplb2Yoc3RydWN0IGluZnRsX29vYikpOwogCQlvb2IuYi5TdGF0dXMgPSBvb2IuYi5TdGF0dXMxID0gU0VDVE9SX1VTRUQ7CkBAIC0zNzIsOCArMzY4LDcgQEAKIAkgKiBpcyBpbXBvcnRhbnQsIGJ5IGRvaW5nIG9sZGVzdCBmaXJzdCBpZiB3ZSBjcmFzaC9yZWJvb3QgdGhlbiBpdAogCSAqIGl0IGlzIHJlbGF0aXZlbHkgc2ltcGxlIHRvIGNsZWFuIHVwIHRoZSBtZXNzKS4KIAkgKi8KLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiSU5GVEw6IHdhbnQgdG8gZXJhc2UgdmlydHVhbCBjaGFpbiAlZFxuIiwKLQkJdGhpc1ZVQyk7CisJcHJfZGVidWcoIklORlRMOiB3YW50IHRvIGVyYXNlIHZpcnR1YWwgY2hhaW4gJWRcbiIsIHRoaXNWVUMpOwogCiAJZm9yICg7OykgewogCQkvKiBGaW5kIG9sZGVzdCB1bml0IGluIGNoYWluLiAqLwpAQCAtNDIxLDcgKzQxNiw3IEBACiAJdTE2IENoYWluTGVuZ3RoID0gMCwgdGhpc2xlbjsKIAl1MTYgY2hhaW4sIEVVTjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogSU5GVExfbWFrZWZyZWVibG9jayhpbmZ0bD0lcCwiCisJcHJfZGVidWcoIklORlRMOiBJTkZUTF9tYWtlZnJlZWJsb2NrKGluZnRsPSVwLCIKIAkJInBlbmRpbmc9JWQpXG4iLCBpbmZ0bCwgcGVuZGluZ2Jsb2NrKTsKIAogCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8IGluZnRsLT5uYl9ibG9ja3M7IGNoYWluKyspIHsKQEAgLTQ4NCw4ICs0NzksOCBAQAogCXNpemVfdCByZXRsZW47CiAJaW50IHNpbGx5LCBzaWxseTIgPSAzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9maW5kd3JpdGV1bml0KGluZnRsPSVwLCIKLQkJImJsb2NrPSVkKVxuIiwgaW5mdGwsIGJsb2NrKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IElORlRMX2ZpbmR3cml0ZXVuaXQoaW5mdGw9JXAsYmxvY2s9JWQpXG4iLAorCQkJaW5mdGwsIGJsb2NrKTsKIAogCWRvIHsKIAkJLyoKQEAgLTUwMSw4ICs0OTYsOCBAQAogCQkJCSAgICAgICBibG9ja29mcywgOCwgJnJldGxlbiwgKGNoYXIgKikmYmNpKTsKIAogCQkJc3RhdHVzID0gYmNpLlN0YXR1cyB8IGJjaS5TdGF0dXMxOwotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBzdGF0dXMgb2YgYmxvY2sgJWQgaW4gIgotCQkJCSJFVU4gJWQgaXMgJXhcbiIsIGJsb2NrICwgd3JpdGVFVU4sIHN0YXR1cyk7CisJCQlwcl9kZWJ1ZygiSU5GVEw6IHN0YXR1cyBvZiBibG9jayAlZCBpbiBFVU4gJWQgaXMgJXhcbiIsCisJCQkJCWJsb2NrICwgd3JpdGVFVU4sIHN0YXR1cyk7CiAKIAkJCXN3aXRjaChzdGF0dXMpIHsKIAkJCWNhc2UgU0VDVE9SX0ZSRUU6CkBAIC01NTUsOSArNTUwLDkgQEAKIAkJCSAqIEhvcGVmdWxseSB3ZSBmcmVlIHNvbWV0aGluZywgbGV0cyB0cnkgYWdhaW4uCiAJCQkgKiBUaGlzIHRpbWUgd2UgYXJlIGRlc3BlcmF0ZS4uLgogCQkJICovCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiSU5GVEw6IHVzaW5nIGRlc3BlcmF0ZT09MSAiCi0JCQkJInRvIGZpbmQgZnJlZSBFVU4gdG8gYWNjb21tb2RhdGUgd3JpdGUgdG8gIgotCQkJCSJWVUMgJWRcbiIsIHRoaXNWVUMpOworCQkJcHJfZGVidWcoIklORlRMOiB1c2luZyBkZXNwZXJhdGU9PTEgdG8gZmluZCBmcmVlIEVVTiAiCisJCQkJCSJ0byBhY2NvbW1vZGF0ZSB3cml0ZSB0byBWVUMgJWRcbiIsCisJCQkJCXRoaXNWVUMpOwogCQkJd3JpdGVFVU4gPSBJTkZUTF9maW5kZnJlZWJsb2NrKGluZnRsLCAxKTsKIAkJCWlmICh3cml0ZUVVTiA9PSBCTE9DS19OSUwpIHsKIAkJCQkvKgpAQCAtNjQ3LDcgKzY0Miw3IEBACiAJc3RydWN0IGluZnRsX2JjaSBiY2k7CiAJc2l6ZV90IHJldGxlbjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogSU5GVExfdHJ5ZGVsZXRlY2hhaW4oaW5mdGw9JXAsIgorCXByX2RlYnVnKCJJTkZUTDogSU5GVExfdHJ5ZGVsZXRlY2hhaW4oaW5mdGw9JXAsIgogCQkidGhpc1ZVQz0lZClcbiIsIGluZnRsLCB0aGlzVlVDKTsKIAogCW1lbXNldChCbG9ja1VzZWQsIDAsIHNpemVvZihCbG9ja1VzZWQpKTsKQEAgLTcxMSw3ICs3MDYsNyBAQAogCSAqIEZvciBlYWNoIGJsb2NrIGluIHRoZSBjaGFpbiBmcmVlIGl0IGFuZCBtYWtlIGl0IGF2YWlsYWJsZQogCSAqIGZvciBmdXR1cmUgdXNlLiBFcmFzZSBmcm9tIHRoZSBvbGRlc3QgdW5pdCBmaXJzdC4KIAkgKi8KLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiSU5GVEw6IGRlbGV0aW5nIGVtcHR5IFZVQyAlZFxuIiwgdGhpc1ZVQyk7CisJcHJfZGVidWcoIklORlRMOiBkZWxldGluZyBlbXB0eSBWVUMgJWRcbiIsIHRoaXNWVUMpOwogCiAJZm9yICg7OykgewogCQl1MTYgKnByZXZFVU4gPSAmaW5mdGwtPlZVdGFibGVbdGhpc1ZVQ107CkBAIC03MTksNyArNzE0LDcgQEAKIAogCQkvKiBJZiB0aGUgY2hhaW4gaXMgYWxsIGdvbmUgYWxyZWFkeSwgd2UncmUgZG9uZSAqLwogCQlpZiAodGhpc0VVTiA9PSBCTE9DS19OSUwpIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJJTkZUTDogRW1wdHkgVlVDICVkIGZvciBkZWxldGlvbiB3YXMgYWxyZWFkeSBhYnNlbnRcbiIsIHRoaXNFVU4pOworCQkJcHJfZGVidWcoIklORlRMOiBFbXB0eSBWVUMgJWQgZm9yIGRlbGV0aW9uIHdhcyBhbHJlYWR5IGFic2VudFxuIiwgdGhpc0VVTik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzMxLDcgKzcyNiw3IEBACiAJCQl0aGlzRVVOID0gKnByZXZFVU47CiAJCX0KIAotCQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiRGVsZXRpbmcgRVVOICVkIGZyb20gVlVDICVkXG4iLAorCQlwcl9kZWJ1ZygiRGVsZXRpbmcgRVVOICVkIGZyb20gVlVDICVkXG4iLAogCQkgICAgICB0aGlzRVVOLCB0aGlzVlVDKTsKIAogCQlpZiAoSU5GVExfZm9ybWF0YmxvY2soaW5mdGwsIHRoaXNFVU4pIDwgMCkgewpAQCAtNzY3LDcgKzc2Miw3IEBACiAJc2l6ZV90IHJldGxlbjsKIAlzdHJ1Y3QgaW5mdGxfYmNpIGJjaTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogSU5GVExfZGVsZXRlYmxvY2soaW5mdGw9JXAsIgorCXByX2RlYnVnKCJJTkZUTDogSU5GVExfZGVsZXRlYmxvY2soaW5mdGw9JXAsIgogCQkiYmxvY2s9JWQpXG4iLCBpbmZ0bCwgYmxvY2spOwogCiAJd2hpbGUgKHRoaXNFVU4gPCBpbmZ0bC0+bmJfYmxvY2tzKSB7CkBAIC04MjYsNyArODIxLDcgQEAKIAlzdHJ1Y3QgaW5mdGxfb29iIG9vYjsKIAljaGFyICpwLCAqcGVuZDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogaW5mdGxfd3JpdGVibG9jayhpbmZ0bD0lcCxibG9jaz0lbGQsIgorCXByX2RlYnVnKCJJTkZUTDogaW5mdGxfd3JpdGVibG9jayhpbmZ0bD0lcCxibG9jaz0lbGQsIgogCQkiYnVmZmVyPSVwKVxuIiwgaW5mdGwsIGJsb2NrLCBidWZmZXIpOwogCiAJLyogSXMgYmxvY2sgYWxsIHplcm8/ICovCkBAIC04NzYsNyArODcxLDcgQEAKIAlzdHJ1Y3QgaW5mdGxfYmNpIGJjaTsKIAlzaXplX3QgcmV0bGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBpbmZ0bF9yZWFkYmxvY2soaW5mdGw9JXAsYmxvY2s9JWxkLCIKKwlwcl9kZWJ1ZygiSU5GVEw6IGluZnRsX3JlYWRibG9jayhpbmZ0bD0lcCxibG9jaz0lbGQsIgogCQkiYnVmZmVyPSVwKVxuIiwgaW5mdGwsIGJsb2NrLCBidWZmZXIpOwogCiAJd2hpbGUgKHRoaXNFVU4gPCBpbmZ0bC0+bmJfYmxvY2tzKSB7CkBAIC05MjIsNyArOTE3LDcgQEAKIAkJaW50IHJldCA9IG10ZC0+cmVhZChtdGQsIHB0ciwgU0VDVE9SU0laRSwgJnJldGxlbiwgYnVmZmVyKTsKIAogCQkvKiBIYW5kbGUgY29ycmVjdGVkIGJpdCBmbGlwcyBncmFjZWZ1bGx5ICovCi0JCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRVVDTEVBTikKKwkJaWYgKHJldCA8IDAgJiYgIW10ZF9pc19iaXRmbGlwKHJldCkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMgYi9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMKaW5kZXggMTA0MDUyZS4uMmZmNjAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvaW5mdGxtb3VudC5jCisrKyBiL2RyaXZlcnMvbXRkL2luZnRsbW91bnQuYwpAQCAtNTMsNyArNTMsNyBAQAogCXN0cnVjdCBJTkZUTFBhcnRpdGlvbiAqaXA7CiAJc2l6ZV90IHJldGxlbjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogZmluZF9ib290X3JlY29yZChpbmZ0bD0lcClcbiIsIGluZnRsKTsKKwlwcl9kZWJ1ZygiSU5GVEw6IGZpbmRfYm9vdF9yZWNvcmQoaW5mdGw9JXApXG4iLCBpbmZ0bCk7CiAKICAgICAgICAgLyoKIAkgKiBBc3N1bWUgbG9naWNhbCBFcmFzZVNpemUgPT0gcGh5c2ljYWwgZXJhc2VzaXplIGZvciBzdGFydGluZyB0aGUKQEAgLTEzOSwyNCArMTM5LDIwIEBACiAJCW1oLT5Gb3JtYXRGbGFncyA9IGxlMzJfdG9fY3B1KG1oLT5Gb3JtYXRGbGFncyk7CiAJCW1oLT5QZXJjZW50VXNlZCA9IGxlMzJfdG9fY3B1KG1oLT5QZXJjZW50VXNlZCk7CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UKLQkJaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKSB7Ci0JCQlwcmludGsoIklORlRMOiBNZWRpYSBIZWFkZXIgLT5cbiIKLQkJCQkiICAgIGJvb3RSZWNvcmRJRCAgICAgICAgICA9ICVzXG4iCi0JCQkJIiAgICBOb09mQm9vdEltYWdlQmxvY2tzICAgPSAlZFxuIgotCQkJCSIgICAgTm9PZkJpbmFyeVBhcnRpdGlvbnMgID0gJWRcbiIKLQkJCQkiICAgIE5vT2ZCRFRMUGFydGl0aW9ucyAgICA9ICVkXG4iCi0JCQkJIiAgICBCbG9ja011bHRpcGxlckJpdHMgICAgPSAlZFxuIgotCQkJCSIgICAgRm9ybWF0RmxncyAgICAgICAgICAgID0gJWRcbiIKLQkJCQkiICAgIE9zYWtWZXJzaW9uICAgICAgICAgICA9IDB4JXhcbiIKLQkJCQkiICAgIFBlcmNlbnRVc2VkICAgICAgICAgICA9ICVkXG4iLAotCQkJCW1oLT5ib290UmVjb3JkSUQsIG1oLT5Ob09mQm9vdEltYWdlQmxvY2tzLAotCQkJCW1oLT5Ob09mQmluYXJ5UGFydGl0aW9ucywKLQkJCQltaC0+Tm9PZkJEVExQYXJ0aXRpb25zLAotCQkJCW1oLT5CbG9ja011bHRpcGxpZXJCaXRzLCBtaC0+Rm9ybWF0RmxhZ3MsCi0JCQkJbWgtPk9zYWtWZXJzaW9uLCBtaC0+UGVyY2VudFVzZWQpOwotCQl9Ci0jZW5kaWYKKwkJcHJfZGVidWcoIklORlRMOiBNZWRpYSBIZWFkZXIgLT5cbiIKKwkJCSAiICAgIGJvb3RSZWNvcmRJRCAgICAgICAgICA9ICVzXG4iCisJCQkgIiAgICBOb09mQm9vdEltYWdlQmxvY2tzICAgPSAlZFxuIgorCQkJICIgICAgTm9PZkJpbmFyeVBhcnRpdGlvbnMgID0gJWRcbiIKKwkJCSAiICAgIE5vT2ZCRFRMUGFydGl0aW9ucyAgICA9ICVkXG4iCisJCQkgIiAgICBCbG9ja011bHRpcGxlckJpdHMgICAgPSAlZFxuIgorCQkJICIgICAgRm9ybWF0RmxncyAgICAgICAgICAgID0gJWRcbiIKKwkJCSAiICAgIE9zYWtWZXJzaW9uICAgICAgICAgICA9IDB4JXhcbiIKKwkJCSAiICAgIFBlcmNlbnRVc2VkICAgICAgICAgICA9ICVkXG4iLAorCQkJIG1oLT5ib290UmVjb3JkSUQsIG1oLT5Ob09mQm9vdEltYWdlQmxvY2tzLAorCQkJIG1oLT5Ob09mQmluYXJ5UGFydGl0aW9ucywKKwkJCSBtaC0+Tm9PZkJEVExQYXJ0aXRpb25zLAorCQkJIG1oLT5CbG9ja011bHRpcGxpZXJCaXRzLCBtaC0+Rm9ybWF0RmxhZ3MsCisJCQkgbWgtPk9zYWtWZXJzaW9uLCBtaC0+UGVyY2VudFVzZWQpOwogCiAJCWlmIChtaC0+Tm9PZkJEVExQYXJ0aXRpb25zID09IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklORlRMOiBNZWRpYSBIZWFkZXIgc2FuaXR5IGNoZWNrICIKQEAgLTIwMCwxOSArMTk2LDE1IEBACiAJCQlpcC0+c3BhcmVVbml0cyA9IGxlMzJfdG9fY3B1KGlwLT5zcGFyZVVuaXRzKTsKIAkJCWlwLT5SZXNlcnZlZDAgPSBsZTMyX3RvX2NwdShpcC0+UmVzZXJ2ZWQwKTsKIAotI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotCQkJaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKSB7Ci0JCQkJcHJpbnRrKCIgICAgUEFSVElUSU9OWyVkXSAtPlxuIgotCQkJCQkiICAgICAgICB2aXJ0dWFsVW5pdHMgICAgPSAlZFxuIgotCQkJCQkiICAgICAgICBmaXJzdFVuaXQgICAgICAgPSAlZFxuIgotCQkJCQkiICAgICAgICBsYXN0VW5pdCAgICAgICAgPSAlZFxuIgotCQkJCQkiICAgICAgICBmbGFncyAgICAgICAgICAgPSAweCV4XG4iCi0JCQkJCSIgICAgICAgIHNwYXJlVW5pdHMgICAgICA9ICVkXG4iLAotCQkJCQlpLCBpcC0+dmlydHVhbFVuaXRzLCBpcC0+Zmlyc3RVbml0LAotCQkJCQlpcC0+bGFzdFVuaXQsIGlwLT5mbGFncywKLQkJCQkJaXAtPnNwYXJlVW5pdHMpOwotCQkJfQotI2VuZGlmCisJCQlwcl9kZWJ1ZygiICAgIFBBUlRJVElPTlslZF0gLT5cbiIKKwkJCQkgIiAgICAgICAgdmlydHVhbFVuaXRzICAgID0gJWRcbiIKKwkJCQkgIiAgICAgICAgZmlyc3RVbml0ICAgICAgID0gJWRcbiIKKwkJCQkgIiAgICAgICAgbGFzdFVuaXQgICAgICAgID0gJWRcbiIKKwkJCQkgIiAgICAgICAgZmxhZ3MgICAgICAgICAgID0gMHgleFxuIgorCQkJCSAiICAgICAgICBzcGFyZVVuaXRzICAgICAgPSAlZFxuIiwKKwkJCQkgaSwgaXAtPnZpcnR1YWxVbml0cywgaXAtPmZpcnN0VW5pdCwKKwkJCQkgaXAtPmxhc3RVbml0LCBpcC0+ZmxhZ3MsCisJCQkJIGlwLT5zcGFyZVVuaXRzKTsKIAogCQkJaWYgKGlwLT5SZXNlcnZlZDAgIT0gaXAtPmZpcnN0VW5pdCkgewogCQkJCXN0cnVjdCBlcmFzZV9pbmZvICppbnN0ciA9ICZpbmZ0bC0+aW5zdHI7CkBAIC0zNzUsNyArMzY3LDcgQEAKICAqCiAgKiBSZXR1cm46IDAgd2hlbiBzdWNjZWVkLCAtMSBvbiBlcnJvci4KICAqCi0gKiBUb0RvOiAxLiBJcyBpdCBuZWNlcmVzc2FyeSB0byBjaGVja19mcmVlX3NlY3RvciBhZnRlciBlcmFzaW5nID8/CisgKiBUb0RvOiAxLiBJcyBpdCBuZWNlc3NhcnkgdG8gY2hlY2tfZnJlZV9zZWN0b3IgYWZ0ZXIgZXJhc2luZyA/PwogICovCiBpbnQgSU5GVExfZm9ybWF0YmxvY2soc3RydWN0IElORlRMcmVjb3JkICppbmZ0bCwgaW50IGJsb2NrKQogewpAQCAtMzg1LDggKzM3Nyw3IEBACiAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZ0bC0+bWJkLm10ZDsKIAlpbnQgcGh5c2Jsb2NrOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9mb3JtYXRibG9jayhpbmZ0bD0lcCwiCi0JCSJibG9jaz0lZClcbiIsIGluZnRsLCBibG9jayk7CisJcHJfZGVidWcoIklORlRMOiBJTkZUTF9mb3JtYXRibG9jayhpbmZ0bD0lcCxibG9jaz0lZClcbiIsIGluZnRsLCBibG9jayk7CiAKIAltZW1zZXQoaW5zdHIsIDAsIHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykpOwogCkBAIC00NzYsMzAgKzQ2NywzMCBAQAogewogCWludCBpOwogCi0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCXByX2RlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKLQlwcmludGsoIlZVdGFibGVbJWRdIC0+Iiwgcy0+bmJfYmxvY2tzKTsKKwlwcl9kZWJ1ZygiVlV0YWJsZVslZF0gLT4iLCBzLT5uYl9ibG9ja3MpOwogCWZvciAoaSA9IDA7IGkgPCBzLT5uYl9ibG9ja3M7IGkrKykgewogCQlpZiAoKGkgJSA4KSA9PSAwKQotCQkJcHJpbnRrKCJcbiUwNHg6ICIsIGkpOwotCQlwcmludGsoIiUwNHggIiwgcy0+VlV0YWJsZVtpXSk7CisJCQlwcl9kZWJ1ZygiXG4lMDR4OiAiLCBpKTsKKwkJcHJfZGVidWcoIiUwNHggIiwgcy0+VlV0YWJsZVtpXSk7CiAJfQogCi0JcHJpbnRrKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJfZGVidWcoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIAkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCi0JcHJpbnRrKCJQVXRhYmxlWyVkLSVkPSVkXSAtPiIsIHMtPmZpcnN0RVVOLCBzLT5sYXN0RVVOLCBzLT5uYl9ibG9ja3MpOworCXByX2RlYnVnKCJQVXRhYmxlWyVkLSVkPSVkXSAtPiIsIHMtPmZpcnN0RVVOLCBzLT5sYXN0RVVOLCBzLT5uYl9ibG9ja3MpOwogCWZvciAoaSA9IDA7IGkgPD0gcy0+bGFzdEVVTjsgaSsrKSB7CiAJCWlmICgoaSAlIDgpID09IDApCi0JCQlwcmludGsoIlxuJTA0eDogIiwgaSk7Ci0JCXByaW50aygiJTA0eCAiLCBzLT5QVXRhYmxlW2ldKTsKKwkJCXByX2RlYnVnKCJcbiUwNHg6ICIsIGkpOworCQlwcl9kZWJ1ZygiJTA0eCAiLCBzLT5QVXRhYmxlW2ldKTsKIAl9CiAKLQlwcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcl9kZWJ1ZygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKLQlwcmludGsoIklORlRMIC0+XG4iCisJcHJfZGVidWcoIklORlRMIC0+XG4iCiAJCSIgIEVyYXNlU2l6ZSAgICAgICA9ICVkXG4iCiAJCSIgIGgvcy9jICAgICAgICAgICA9ICVkLyVkLyVkXG4iCiAJCSIgIG51bXZ1bml0cyAgICAgICA9ICVkXG4iCkBAIC01MTMsNyArNTA0LDcgQEAKIAkJcy0+bnVtdnVuaXRzLCBzLT5maXJzdEVVTiwgcy0+bGFzdEVVTiwgcy0+bnVtZnJlZUVVTnMsCiAJCXMtPkxhc3RGcmVlRVVOLCBzLT5uYl9ibG9ja3MsIHMtPm5iX2Jvb3RfYmxvY2tzKTsKIAotCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCXByX2RlYnVnKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIH0KIApAQCAtNTIxLDI1ICs1MTIsMjUgQEAKIHsKIAlpbnQgbG9naWNhbCwgYmxvY2ssIGk7CiAKLQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJfZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAotCXByaW50aygiSU5GVEwgVmlydHVhbCBVbml0IENoYWluczpcbiIpOworCXByX2RlYnVnKCJJTkZUTCBWaXJ0dWFsIFVuaXQgQ2hhaW5zOlxuIik7CiAJZm9yIChsb2dpY2FsID0gMDsgbG9naWNhbCA8IHMtPm5iX2Jsb2NrczsgbG9naWNhbCsrKSB7CiAJCWJsb2NrID0gcy0+VlV0YWJsZVtsb2dpY2FsXTsKIAkJaWYgKGJsb2NrID4gcy0+bmJfYmxvY2tzKQogCQkJY29udGludWU7Ci0JCXByaW50aygiICBMT0dJQ0FMICVkIC0tPiAlZCAiLCBsb2dpY2FsLCBibG9jayk7CisJCXByX2RlYnVnKCIgIExPR0lDQUwgJWQgLS0+ICVkICIsIGxvZ2ljYWwsIGJsb2NrKTsKIAkJZm9yIChpID0gMDsgaSA8IHMtPm5iX2Jsb2NrczsgaSsrKSB7CiAJCQlpZiAocy0+UFV0YWJsZVtibG9ja10gPT0gQkxPQ0tfTklMKQogCQkJCWJyZWFrOwogCQkJYmxvY2sgPSBzLT5QVXRhYmxlW2Jsb2NrXTsKLQkJCXByaW50aygiJWQgIiwgYmxvY2spOworCQkJcHJfZGVidWcoIiVkICIsIGJsb2NrKTsKIAkJfQotCQlwcmludGsoIlxuIik7CisJCXByX2RlYnVnKCJcbiIpOwogCX0KIAotCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlwcl9kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKIAkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogfQogCkBAIC01NTUsNyArNTQ2LDcgQEAKIAlpbnQgaTsKIAl1OCAqQU5BQ3RhYmxlLCBBTkFDOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIklORlRMOiBJTkZUTF9tb3VudChpbmZ0bD0lcClcbiIsIHMpOworCXByX2RlYnVnKCJJTkZUTDogSU5GVExfbW91bnQoaW5mdGw9JXApXG4iLCBzKTsKIAogCS8qIFNlYXJjaCBmb3IgSU5GVEwgTWVkaWFIZWFkZXIgYW5kIFNwYXJlIElORlRMIE1lZGlhIEhlYWRlciAqLwogCWlmIChmaW5kX2Jvb3RfcmVjb3JkKHMpIDwgMCkgewpAQCAtNTg1LDcgKzU3Niw3IEBACiAJICogTk9URVhQTE9SRUQgc3RhdGUuIFRoZW4gYXQgdGhlIGVuZCB3ZSB3aWxsIHRyeSB0byBmb3JtYXQgaXQgYW5kCiAJICogbWFyayBpdCBhcyBmcmVlLgogCSAqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogcGFzcyAxLCBleHBsb3JlIGVhY2ggdW5pdFxuIik7CisJcHJfZGVidWcoIklORlRMOiBwYXNzIDEsIGV4cGxvcmUgZWFjaCB1bml0XG4iKTsKIAlmb3IgKGZpcnN0X2Jsb2NrID0gcy0+Zmlyc3RFVU47IGZpcnN0X2Jsb2NrIDw9IHMtPmxhc3RFVU47IGZpcnN0X2Jsb2NrKyspIHsKIAkJaWYgKHMtPlBVdGFibGVbZmlyc3RfYmxvY2tdICE9IEJMT0NLX05PVEVYUExPUkVEKQogCQkJY29udGludWU7CkBAIC03MTcsMTcgKzcwOCwxNCBAQAogCQlsb2dpY2FsX2Jsb2NrID0gQkxPQ0tfTklMOwogCX0KIAotI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikKLQkJSU5GVExfZHVtcHRhYmxlcyhzKTsKLSNlbmRpZgorCUlORlRMX2R1bXB0YWJsZXMocyk7CiAKIAkvKgogCSAqIFNlY29uZCBwYXNzLCBjaGVjayBmb3IgaW5maW5pdGUgbG9vcHMgaW4gY2hhaW5zLiBUaGVzZSBhcmUKIAkgKiBwb3NzaWJsZSBiZWNhdXNlIHdlIGRvbid0IHVwZGF0ZSB0aGUgcHJldmlvdXMgcG9pbnRlcnMgd2hlbgogCSAqIHdlIGZvbGQgY2hhaW5zLiBObyBiaWcgZGVhbCwganVzdCBmaXggdGhlbSB1cCBpbiBQVXRhYmxlLgogCSAqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJJTkZUTDogcGFzcyAyLCB2YWxpZGF0ZSB2aXJ0dWFsIGNoYWluc1xuIik7CisJcHJfZGVidWcoIklORlRMOiBwYXNzIDIsIHZhbGlkYXRlIHZpcnR1YWwgY2hhaW5zXG4iKTsKIAlmb3IgKGxvZ2ljYWxfYmxvY2sgPSAwOyBsb2dpY2FsX2Jsb2NrIDwgcy0+bnVtdnVuaXRzOyBsb2dpY2FsX2Jsb2NrKyspIHsKIAkJYmxvY2sgPSBzLT5WVXRhYmxlW2xvZ2ljYWxfYmxvY2tdOwogCQlsYXN0X2Jsb2NrID0gQkxPQ0tfTklMOwpAQCAtNzcyLDEyICs3NjAsOCBAQAogCQl9CiAJfQogCi0jaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFCi0JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQotCQlJTkZUTF9kdW1wdGFibGVzKHMpOwotCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikKLQkJSU5GVExfZHVtcFZVY2hhaW5zKHMpOwotI2VuZGlmCisJSU5GVExfZHVtcHRhYmxlcyhzKTsKKwlJTkZUTF9kdW1wVlVjaGFpbnMocyk7CiAKIAkvKgogCSAqIFRoaXJkIHBhc3MsIGZvcm1hdCB1bnJlZmVyZW5jZWQgYmxvY2tzIGFuZCBpbml0IGZyZWUgYmxvY2sgY291bnQuCkBAIC03ODUsNyArNzY5LDcgQEAKIAlzLT5udW1mcmVlRVVOcyA9IDA7CiAJcy0+TGFzdEZyZWVFVU4gPSBCTE9DS19OSUw7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiSU5GVEw6IHBhc3MgMywgZm9ybWF0IHVudXNlZCBibG9ja3NcbiIpOworCXByX2RlYnVnKCJJTkZUTDogcGFzcyAzLCBmb3JtYXQgdW51c2VkIGJsb2Nrc1xuIik7CiAJZm9yIChibG9jayA9IHMtPmZpcnN0RVVOOyBibG9jayA8PSBzLT5sYXN0RVVOOyBibG9jaysrKSB7CiAJCWlmIChzLT5QVXRhYmxlW2Jsb2NrXSA9PSBCTE9DS19OT1RFWFBMT1JFRCkgewogCQkJcHJpbnRrKCJJTkZUTDogdW5yZWZlcmVuY2VkIGJsb2NrICVkLCBmb3JtYXR0aW5nIGl0XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbHBkZHIvbHBkZHJfY21kcy5jIGIvZHJpdmVycy9tdGQvbHBkZHIvbHBkZHJfY21kcy5jCmluZGV4IDY1NjU1ZGQuLjFkY2EzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2xwZGRyL2xwZGRyX2NtZHMuYworKysgYi9kcml2ZXJzL210ZC9scGRkci9scGRkcl9jbWRzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvcGZvdy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9xaW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RhdGljIGludCBscGRkcl9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgYWRyLCBzaXplX3QgbGVuLAogCQkJCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGMwYzMyOGMuLjhlMGM0YmY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtNDEsOCArNDEsNiBAQAogCSAgYXJlIG1hcHBlZCBvbiB5b3VyIHBhcnRpY3VsYXIgdGFyZ2V0IGJvYXJkLiBSZWZlciB0byB0aGUKIAkgIG1lbW9yeSBtYXAgd2hpY2ggc2hvdWxkIGhvcGVmdWxseSBiZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKIAkgIHlvdXIgYm9hcmQuCi0JICBJZ25vcmUgdGhpcyBvcHRpb24gaWYgeW91IHVzZSBydW4tdGltZSBwaHlzbWFwIGNvbmZpZ3VyYXRpb24KLQkgIChpLmUuLCBydW4tdGltZSBjYWxsaW5nIHBoeXNtYXBfY29uZmlndXJlKCkpLgogCiBjb25maWcgTVREX1BIWVNNQVBfTEVOCiAJaGV4ICJQaHlzaWNhbCBsZW5ndGggb2YgZmxhc2ggbWFwcGluZyIKQEAgLTU1LDggKzUzLDYgQEAKIAkgIHRoYW4gdGhlIHRvdGFsIGFtb3VudCBvZiBmbGFzaCBwcmVzZW50LiBSZWZlciB0byB0aGUgbWVtb3J5CiAJICBtYXAgd2hpY2ggc2hvdWxkIGhvcGVmdWxseSBiZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgeW91cgogCSAgYm9hcmQuCi0JICBJZ25vcmUgdGhpcyBvcHRpb24gaWYgeW91IHVzZSBydW4tdGltZSBwaHlzbWFwIGNvbmZpZ3VyYXRpb24KLQkgIChpLmUuLCBydW4tdGltZSBjYWxsaW5nIHBoeXNtYXBfY29uZmlndXJlKCkpLgogCiBjb25maWcgTVREX1BIWVNNQVBfQkFOS1dJRFRICiAJaW50ICJCYW5rIHdpZHRoIGluIG9jdGV0cyIKQEAgLTY3LDggKzYzLDYgQEAKIAkgIGluIG9jdGV0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZGF0YSBidXMgd2lkdGggb2YgMzIKIAkgIGJpdHMsIHlvdSB3b3VsZCBzZXQgdGhlIGJ1cyB3aWR0aCBvY3RldCB2YWx1ZSB0byA0LiBUaGlzIGlzCiAJICB1c2VkIGludGVybmFsbHkgYnkgdGhlIENGSSBkcml2ZXJzLgotCSAgSWdub3JlIHRoaXMgb3B0aW9uIGlmIHlvdSB1c2UgcnVuLXRpbWUgcGh5c21hcCBjb25maWd1cmF0aW9uCi0JICAoaS5lLiwgcnVuLXRpbWUgY2FsbGluZyBwaHlzbWFwX2NvbmZpZ3VyZSgpKS4KIAogY29uZmlnIE1URF9QSFlTTUFQX09GCiAJdHJpc3RhdGUgIkZsYXNoIGRldmljZSBpbiBwaHlzaWNhbCBtZW1vcnkgbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgpAQCAtMjYwLDcgKzI1NCw2IEBACiBjb25maWcgTVREX0xBTlRJUQogCXRyaXN0YXRlICJMYW50aXEgU29DIE5PUiBzdXBwb3J0IgogCWRlcGVuZHMgb24gTEFOVElRCi0Jc2VsZWN0IE1URF9QQVJUSVRJT05TCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTk9SIGZsYXNoIGF0dGFjaGVkIHRvIHRoZSBMYW50aXEgU29DJ3MgRXh0ZXJuYWwgQnVzIFVuaXQuCiAKQEAgLTMzOSwxMCArMzMyLDYgQEAKIAkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIGZsYXNoIGNoaXBzIG9uIHRoZSBIaXRhY2hpIFNvbHV0aW9uRW5naW5lIGFuZAogCSAgc2ltaWxhciBib2FyZHMuIFNheSAnWScgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3Igc3VjaCBhIGJvYXJkLgogCi1jb25maWcgTVREX0FSTV9JTlRFR1JBVE9SCi0JdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIEFSTSBJbnRlZ3JhdG9yL1A3MjBUIgotCWRlcGVuZHMgb24gQVJNICYmIE1URF9DRkkKLQogY29uZmlnIE1URF9DREI4OTcxMgogCXRyaXN0YXRlICJDaXJydXMgQ0RCODk3MTIgZXZhbHVhdGlvbiBib2FyZCBtYXBwaW5ncyIKIAlkZXBlbmRzIG9uIE1URF9DRkkgJiYgQVJDSF9DREI4OTcxMgpAQCAtMzk4LDEzICszODcsNiBAQAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgTlYtUkFNIG9uIGF1dHJvbml4IGF1dGNwdTEyIGJvYXJkLgogCSAgSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLCBzYXkgJ1knLgogCi1jb25maWcgTVREX0VEQjczMTIKLQl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gRURCNzMxMiIKLQlkZXBlbmRzIG9uIEFSQ0hfRURCNzMxMiAmJiBNVERfQ0ZJCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgQ0ZJIEZsYXNoIG9uIHRoZSBDb2dlbnQgRURCNzMxMiBib2FyZC4KLQkgIElmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZCwgc2F5ICdZJyBoZXJlLgotCiBjb25maWcgTVREX0lNUEE3CiAJdHJpc3RhdGUgIkpFREVDIEZsYXNoIGRldmljZSBtYXBwZWQgb24gaW1wQTciCiAJZGVwZW5kcyBvbiBBUk0gJiYgTVREX0pFREVDUFJPQkUKQEAgLTQxMiwxNCArMzk0LDYgQEAKIAkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIE5PUiBGbGFzaCBvbiB0aGUgaW1wQTcgYm9hcmQgb2YKIAkgIGltcGxlbWVudGEgR21iSC4gSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLCBzYXkgJ1knIGhlcmUuCiAKLWNvbmZpZyBNVERfQ0VJVkEKLQl0cmlzdGF0ZSAiSkVERUMgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBDZWl2YS9Qb2xhcm9pZCBQaG90b01heCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUiCi0JZGVwZW5kcyBvbiBNVERfSkVERUNQUk9CRSAmJiBBUkNIX0NFSVZBCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgZmxhc2ggY2hpcHMgb24gdGhlIENlaXZhL1BvbGFyb2lkCi0JICBQaG90b01heCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUuCi0JICBJZiB5b3UgaGF2ZSBzdWNoIGEgZGV2aWNlLCBzYXkgJ1knLgotCiBjb25maWcgTVREX0g3MjBYCiAJdHJpc3RhdGUgIkh5bml4IGV2YWx1YXRpb24gYm9hcmQgbWFwcGluZ3MiCiAJZGVwZW5kcyBvbiBNVERfQ0ZJICYmICggQVJDSF9INzIwMSB8fCBBUkNIX0g3MjAyICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCmluZGV4IGNiNDhiMTEuLjQ1ZGNiOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQpAQCAtMTksNyArMTksNiBAQAogb2JqLSQoQ09ORklHX01URF9UU1VOQU1JKQkrPSB0c3VuYW1pX2ZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfUFhBMlhYKQkrPSBweGEyeHgtZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9NQlg4NjApCSs9IG1ieDg2MC5vCi1vYmotJChDT05GSUdfTVREX0NFSVZBKQkJKz0gY2VpdmEubwogb2JqLSQoQ09ORklHX01URF9PQ1RBR09OKQkrPSBvY3RhZ29uLTUwNjYubwogb2JqLSQoQ09ORklHX01URF9QSFlTTUFQKQkrPSBwaHlzbWFwLm8KIG9iai0kKENPTkZJR19NVERfUEhZU01BUF9PRikJKz0gcGh5c21hcF9vZi5vCkBAIC00MCw3ICszOSw2IEBACiBvYmotJChDT05GSUdfTVREX1NPTFVUSU9ORU5HSU5FKSs9IHNvbHV0aW9uZW5naW5lLm8KIG9iai0kKENPTkZJR19NVERfUENJKQkJKz0gcGNpLm8KIG9iai0kKENPTkZJR19NVERfQVVUQ1BVMTIpCSs9IGF1dGNwdTEyLW52cmFtLm8KLW9iai0kKENPTkZJR19NVERfRURCNzMxMikJKz0gZWRiNzMxMi5vCiBvYmotJChDT05GSUdfTVREX0lNUEE3KQkJKz0gaW1wYTcubwogb2JqLSQoQ09ORklHX01URF9GT1JUVU5FVCkJKz0gZm9ydHVuZXQubwogb2JqLSQoQ09ORklHX01URF9VQ0xJTlVYKQkrPSB1Y2xpbnV4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYmNtOTYzeHgtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvYmNtOTYzeHgtZmxhc2guYwppbmRleCA2MDg5NjdmLi43MzZjYTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2JjbTk2M3h4LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9iY205NjN4eC1mbGFzaC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2JmaW4tYXN5bmMtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvYmZpbi1hc3luYy1mbGFzaC5jCmluZGV4IDY3ODE1ZWUuLjZkNmIyYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvYmZpbi1hc3luYy1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvYmZpbi1hc3luYy1mbGFzaC5jCkBAIC00MSw3ICs0MSw2IEBACiAJdWludDMyX3QgZmxhc2hfYW1iY3RsMCwgZmxhc2hfYW1iY3RsMTsKIAl1aW50MzJfdCBzYXZlX2FtYmN0bDAsIHNhdmVfYW1iY3RsMTsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiB9OwogCiBzdGF0aWMgdm9pZCBzd2l0Y2hfdG9fZmxhc2goc3RydWN0IGFzeW5jX3N0YXRlICpzdGF0ZSkKQEAgLTE2NSwxOCArMTY0LDggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlyZXQgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhzdGF0ZS0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLCAmcGRhdGEtPnBhcnRzLCAwKTsKLQlpZiAocmV0ID4gMCkgewotCQlwcl9kZXZpbml0KEtFUk5fTk9USUNFIERSSVZFUl9OQU1FICI6IFVzaW5nIGNvbW1hbmRsaW5lIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihzdGF0ZS0+bXRkLCBwZGF0YS0+cGFydHMsIHJldCk7Ci0JCXN0YXRlLT5wYXJ0cyA9IHBkYXRhLT5wYXJ0czsKLQl9IGVsc2UgaWYgKHBkYXRhLT5ucl9wYXJ0cykgewotCQlwcl9kZXZpbml0KEtFUk5fTk9USUNFIERSSVZFUl9OQU1FICI6IFVzaW5nIGJvYXJkIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihzdGF0ZS0+bXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7Ci0JfSBlbHNlIHsKLQkJcHJfZGV2aW5pdChLRVJOX05PVElDRSBEUklWRVJfTkFNRSAiOiBubyBwYXJ0aXRpb24gaW5mbyBhdmFpbGFibGUsIHJlZ2lzdGVyaW5nIHdob2xlIGZsYXNoIGF0IG9uY2VcbiIpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHN0YXRlLT5tdGQsIE5VTEwsIDApOwotCX0KKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHN0YXRlLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsIDAsCisJCQlwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdGF0ZSk7CiAKQEAgLTE4OCw3ICsxNzcsNiBAQAogCXN0cnVjdCBhc3luY19zdGF0ZSAqc3RhdGUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlncGlvX2ZyZWUoc3RhdGUtPmVuZXRfZmxhc2hfcGluKTsKIAltdGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RhdGUtPm10ZCk7Ci0Ja2ZyZWUoc3RhdGUtPnBhcnRzKTsKIAltYXBfZGVzdHJveShzdGF0ZS0+bXRkKTsKIAlrZnJlZShzdGF0ZSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2NlaXZhLmMgYi9kcml2ZXJzL210ZC9tYXBzL2NlaXZhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjljOTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9jZWl2YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qCi0gKiBDZWl2YSBmbGFzaCBtZW1vcnkgZHJpdmVyLgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJvYiBTY290dCA8cnNjb3R0QG10cm9iLmZkbnMubmV0PgotICoKLSAqIE5vdGU6IHRoaXMgZHJpdmVyIHN1cHBvcnRzIGplZGVjIGNvbXBhdGlibGUgZGV2aWNlcy4gTW9kaWZpY2F0aW9uCi0gKiBmb3IgQ0ZJIGNvbXBhdGlibGUgZGV2aWNlcyBzaG91bGQgYmUgc3RyYWlnaHQgZm9yd2FyZDogY2hhbmdlCi0gKiBqZWRlY19wcm9iZSB0byBjZmlfcHJvYmUuCi0gKgotICogQmFzZWQgb246IHNhMTEwMC1mbGFzaC5jLCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQ6Ci0gKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIFNBMTF4MCBiYXNlZCBkZXZpY2VzCi0gKgotICogKEMpIDIwMDAgTmljb2xhcyBQaXRyZSA8bmljb0BmbHV4bmljLm5ldD4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvY29uY2F0Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLQotLyoKLSAqIFRoaXMgaXNuJ3QgY29tcGxldGUgeWV0LCBzby4uLgotICovCi0jZGVmaW5lIENPTkZJR19NVERfQ0VJVkFfU1RBVElDTUFQCi0KLSNpZmRlZiBDT05GSUdfTVREX0NFSVZBX1NUQVRJQ01BUAotLyoKLSAqIFNlZSBpbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmggZm9yIGRlZmluaXRpb24gb2YgdGhlIG10ZF9wYXJ0aXRpb24KLSAqIHN0cnVjdHVyZS4KLSAqCi0gKiBQbGVhc2Ugbm90ZToKLSAqICAxLiBUaGUgZmxhc2ggc2l6ZSBnaXZlbiBzaG91bGQgYmUgdGhlIGxhcmdlc3QgZmxhc2ggc2l6ZSB0aGF0IGNhbgotICogICAgIGJlIGFjY29tbW9kYXRlZC4KLSAqCi0gKiAgMi4gVGhlIGJ1cyB3aWR0aCBtdXN0IGRlZmluZWQgaW4gY2xwc19zZXR1cF9mbGFzaC4KLSAqCi0gKiBUaGUgTVREIGxheWVyIHdpbGwgZGV0ZWN0IGZsYXNoIGNoaXAgYWxpYXNpbmcgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZgotICogdGhlIG1hcCBhY2NvcmRpbmdseS4KLSAqCi0gKi8KLQotI2lmZGVmIENPTkZJR19BUkNIX0NFSVZBCi0vKiBGbGFzaCAvIFBhcnRpdGlvbiBzaXppbmcgKi8KLS8qIEZvciB0aGUgMjhGODAwMywgd2UgdXNlIHRoZSBibG9jayBtYXBwaW5nIHRvIGNhbGN1YXRlIHRoZSBzaXplcyAqLwotI2RlZmluZSBNQVhfU0laRV9LaUIgICAgICAgICAgICAgICAgICAoMTYgKyA4ICsgOCArIDk2ICsgKDcqMTI4KSkKLSNkZWZpbmUgQk9PVF9QQVJUSVRJT05fU0laRV9LaUIgICAgICAgKDE2KQotI2RlZmluZSBQQVJBTVNfUEFSVElUSU9OX1NJWkVfS2lCICAgICAoOCkKLSNkZWZpbmUgS0VSTkVMX1BBUlRJVElPTl9TSVpFX0tpQiAgICAgKDQqMTI4KQotLyogVXNlIGJvdGggcmVtYWluaW5nIHBvcnRpb24gb2YgZmlyc3QgZmxhc2gsIGFuZCBhbGwgb2Ygc2Vjb25kIGZsYXNoICovCi0jZGVmaW5lIFJPT1RfUEFSVElUSU9OX1NJWkVfS2lCICAgICAgICgzKjEyOCkgKyAoOCoxMjgpCi0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjZWl2YV9wYXJ0aXRpb25zW10gPSB7Ci0JewotCQkubmFtZSA9ICJDZWl2YSBCT09UIHBhcnRpdGlvbiIsCi0JCS5zaXplICAgPSBCT09UX1BBUlRJVElPTl9TSVpFX0tpQioxMDI0LAotCQkub2Zmc2V0ID0gMCwKLQotCX0sewotCQkubmFtZSA9ICJDZWl2YSBwYXJhbWV0ZXJzIHBhcnRpdGlvbiIsCi0JCS5zaXplICAgPSBQQVJBTVNfUEFSVElUSU9OX1NJWkVfS2lCKjEwMjQsCi0JCS5vZmZzZXQgPSAoMTYgKyA4KSAqIDEwMjQsCi0JfSx7Ci0JCS5uYW1lID0gIkNlaXZhIGtlcm5lbCBwYXJ0aXRpb24iLAotCQkuc2l6ZSA9IChLRVJORUxfUEFSVElUSU9OX1NJWkVfS2lCKSoxMDI0LAotCQkub2Zmc2V0ID0gMHgyMDAwMCwKLQotCX0sewotCQkubmFtZSA9ICJDZWl2YSByb290IGZpbGVzeXN0ZW0gcGFydGl0aW9uIiwKLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkJLnNpemUgPSAoUk9PVF9QQVJUSVRJT05fU0laRV9LaUIpKjEwMjQsCi0JfQotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBjbHBzX3N0YXRpY19wYXJ0aXRpb25zKHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcGFydHMpCi17Ci0JaW50IG5iX3BhcnRzID0gMDsKLQotI2lmZGVmIENPTkZJR19BUkNIX0NFSVZBCi0JaWYgKG1hY2hpbmVfaXNfY2VpdmEoKSkgewotCQkqcGFydHMgICAgICAgPSBjZWl2YV9wYXJ0aXRpb25zOwotCQluYl9wYXJ0cyAgICAgPSBBUlJBWV9TSVpFKGNlaXZhX3BhcnRpdGlvbnMpOwotCX0KLSNlbmRpZgotCXJldHVybiBuYl9wYXJ0czsKLX0KLSNlbmRpZgotCi1zdHJ1Y3QgY2xwc19pbmZvIHsKLQl1bnNpZ25lZCBsb25nIGJhc2U7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCWludCB3aWR0aDsKLQl2b2lkICp2YmFzZTsKLQlzdHJ1Y3QgbWFwX2luZm8gKm1hcDsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLX07Ci0KLSNkZWZpbmUgTlJfU1VCTVREIDQKLQotc3RhdGljIHN0cnVjdCBjbHBzX2luZm8gaW5mb1tOUl9TVUJNVERdOwotCi1zdGF0aWMgaW50IF9faW5pdCBjbHBzX3NldHVwX210ZChzdHJ1Y3QgY2xwc19pbmZvICpjbHBzLCBpbnQgbnIsIHN0cnVjdCBtdGRfaW5mbyAqKnJtdGQpCi17Ci0Jc3RydWN0IG10ZF9pbmZvICpzdWJkZXZbbnJdOwotCXN0cnVjdCBtYXBfaW5mbyAqbWFwczsKLQlpbnQgaSwgZm91bmQgPSAwLCByZXQgPSAwOwotCi0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgbWFwX2luZm8gc3RydWN0cyBpbiBvbmUgZ28uCi0JICovCi0JbWFwcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXBfaW5mbykgKiBuciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXBzKQotCQlyZXR1cm4gLUVOT01FTTsKLQkvKgotCSAqIENsYWltIGFuZCB0aGVuIG1hcCB0aGUgbWVtb3J5IHJlZ2lvbnMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKLQkJaWYgKGNscHNbaV0uYmFzZSA9PSAodW5zaWduZWQgbG9uZyktMSkKLQkJCWJyZWFrOwotCi0JCWNscHNbaV0ucmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNscHNbaV0uYmFzZSwgY2xwc1tpXS5zaXplLCAiY2xwcyBmbGFzaCIpOwotCQlpZiAoIWNscHNbaV0ucmVzKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNscHNbaV0ubWFwID0gbWFwcyArIGk7Ci0KLQkJY2xwc1tpXS5tYXAtPm5hbWUgPSAiY2xwcyBmbGFzaCI7Ci0JCWNscHNbaV0ubWFwLT5waHlzID0gY2xwc1tpXS5iYXNlOwotCi0JCWNscHNbaV0udmJhc2UgPSBpb3JlbWFwKGNscHNbaV0uYmFzZSwgY2xwc1tpXS5zaXplKTsKLQkJaWYgKCFjbHBzW2ldLnZiYXNlKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljbHBzW2ldLm1hcC0+dmlydCA9ICh2b2lkIF9faW9tZW0gKiljbHBzW2ldLnZiYXNlOwotCQljbHBzW2ldLm1hcC0+YmFua3dpZHRoID0gY2xwc1tpXS53aWR0aDsKLQkJY2xwc1tpXS5tYXAtPnNpemUgPSBjbHBzW2ldLnNpemU7Ci0KLQkJc2ltcGxlX21hcF9pbml0KCZjbHBzW2ldLm1hcCk7Ci0KLQkJY2xwc1tpXS5tdGQgPSBkb19tYXBfcHJvYmUoImplZGVjX3Byb2JlIiwgY2xwc1tpXS5tYXApOwotCQlpZiAoY2xwc1tpXS5tdGQgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2xwc1tpXS5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXN1YmRldltpXSA9IGNscHNbaV0ubXRkOwotCi0JCXByaW50ayhLRVJOX0lORk8gImNscHMgZmxhc2g6IEpFREVDIGRldmljZSBhdCAweCUwOGx4LCAlZE1pQiwgIgotCQkJIiVkLWJpdFxuIiwgY2xwc1tpXS5iYXNlLCBjbHBzW2ldLm10ZC0+c2l6ZSA+PiAyMCwKLQkJCWNscHNbaV0ud2lkdGggKiA4KTsKLQkJZm91bmQgKz0gMTsKLQl9Ci0KLQkvKgotCSAqIEVOWElPIGlzIHNwZWNpYWwuICBJdCBtZWFucyB3ZSBkaWRuJ3QgZmluZCBhIGNoaXAgd2hlbgotCSAqIHdlIHByb2JlZC4gIFdlIG5lZWQgdG8gdGVhciBkb3duIHRoZSBtYXBwaW5nLCBmcmVlIHRoZQotCSAqIHJlc291cmNlIGFuZCBtYXJrIGl0IGFzIHN1Y2guCi0JICovCi0JaWYgKHJldCA9PSAtRU5YSU8pIHsKLQkJaW91bm1hcChjbHBzW2ldLnZiYXNlKTsKLQkJY2xwc1tpXS52YmFzZSA9IE5VTEw7Ci0JCXJlbGVhc2VfcmVzb3VyY2UoY2xwc1tpXS5yZXMpOwotCQljbHBzW2ldLnJlcyA9IE5VTEw7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBmb3VuZCBvbmUgZGV2aWNlLCBkb24ndCBib3RoZXIgd2l0aCBjb25jYXQgc3VwcG9ydC4KLQkgKiBJZiB3ZSBmb3VuZCBtdWx0aXBsZSBkZXZpY2VzLCB1c2UgY29uY2F0IGlmIHdlIGhhdmUgaXQKLQkgKiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWlsLgotCSAqLwotCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gLUVOWElPKSB7Ci0JCWlmIChmb3VuZCA9PSAxKSB7Ci0JCQkqcm10ZCA9IHN1YmRldlswXTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZSBpZiAoZm91bmQgPiAxKSB7Ci0JCQkvKgotCQkJICogV2UgZGV0ZWN0ZWQgbXVsdGlwbGUgZGV2aWNlcy4gIENvbmNhdGVuYXRlCi0JCQkgKiB0aGVtIHRvZ2V0aGVyLgotCQkJICovCi0JCQkqcm10ZCA9IG10ZF9jb25jYXRfY3JlYXRlKHN1YmRldiwgZm91bmQsCi0JCQkJCQkgICJjbHBzIGZsYXNoIik7Ci0JCQlpZiAoKnJtdGQgPT0gTlVMTCkKLQkJCQlyZXQgPSAtRU5YSU87Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIElmIHdlIGZhaWxlZCwgY2xlYW4gdXAuCi0JICovCi0JaWYgKHJldCkgewotCQlkbyB7Ci0JCQlpZiAoY2xwc1tpXS5tdGQpCi0JCQkJbWFwX2Rlc3Ryb3koY2xwc1tpXS5tdGQpOwotCQkJaWYgKGNscHNbaV0udmJhc2UpCi0JCQkJaW91bm1hcChjbHBzW2ldLnZiYXNlKTsKLQkJCWlmIChjbHBzW2ldLnJlcykKLQkJCQlyZWxlYXNlX3Jlc291cmNlKGNscHNbaV0ucmVzKTsKLQkJfSB3aGlsZSAoaS0tKTsKLQotCQlrZnJlZShtYXBzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xwc19kZXN0cm95X210ZChzdHJ1Y3QgY2xwc19pbmZvICpjbHBzLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQlpbnQgaTsKLQotCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihtdGQpOwotCi0JaWYgKG10ZCAhPSBjbHBzWzBdLm10ZCkKLQkJbXRkX2NvbmNhdF9kZXN0cm95KG10ZCk7Ci0KLQlmb3IgKGkgPSBOUl9TVUJNVEQ7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChjbHBzW2ldLm10ZCkKLQkJCW1hcF9kZXN0cm95KGNscHNbaV0ubXRkKTsKLQkJaWYgKGNscHNbaV0udmJhc2UpCi0JCQlpb3VubWFwKGNscHNbaV0udmJhc2UpOwotCQlpZiAoY2xwc1tpXS5yZXMpCi0JCQlyZWxlYXNlX3Jlc291cmNlKGNscHNbaV0ucmVzKTsKLQl9Ci0Ja2ZyZWUoY2xwc1swXS5tYXApOwotfQotCi0vKgotICogV2UgZGVmaW5lIHRoZSBtZW1vcnkgc3BhY2UsIHNpemUsIGFuZCB3aWR0aCBmb3IgdGhlIGZsYXNoIG1lbW9yeQotICogc3BhY2UgaGVyZS4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBjbHBzX3NldHVwX2ZsYXNoKHZvaWQpCi17Ci0JaW50IG5yID0gMDsKLQotI2lmZGVmIENPTkZJR19BUkNIX0NFSVZBCi0JaWYgKG1hY2hpbmVfaXNfY2VpdmEoKSkgewotCQlpbmZvWzBdLmJhc2UgPSBDUzBfUEhZU19CQVNFOwotCQlpbmZvWzBdLnNpemUgPSBTWl8zMk07Ci0JCWluZm9bMF0ud2lkdGggPSBDRUlWQV9GTEFTSF9XSURUSDsKLQkJaW5mb1sxXS5iYXNlID0gQ1MxX1BIWVNfQkFTRTsKLQkJaW5mb1sxXS5zaXplID0gU1pfMzJNOwotCQlpbmZvWzFdLndpZHRoID0gQ0VJVkFfRkxBU0hfV0lEVEg7Ci0JCW5yID0gMjsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gbnI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFyc2VkX3BhcnRzOwotc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsIE5VTEwgfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHNfbG9jYXRlX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptdGQpCi17Ci0JY29uc3QgY2hhciAqcGFydF90eXBlID0gTlVMTDsKLQlpbnQgbnJfcGFydHMgPSAwOwotCWRvIHsKLQkJLyoKLQkJICogUGFydGl0aW9uIHNlbGVjdGlvbiBzdHVmZi4KLQkJICovCi0JCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwcm9iZXMsICZwYXJzZWRfcGFydHMsIDApOwotCQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQkJCWJyZWFrOwotCQl9Ci0jaWZkZWYgQ09ORklHX01URF9DRUlWQV9TVEFUSUNNQVAKLQkJbnJfcGFydHMgPSBjbHBzX3N0YXRpY19wYXJ0aXRpb25zKCZwYXJzZWRfcGFydHMpOwotCQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50aygiZm91bmQ6ICVkIHBhcnRpdGlvbnNcbiIsIG5yX3BhcnRzKTsKLSNlbmRpZgotCX0gd2hpbGUgKDApOwotCi0JaWYgKG5yX3BhcnRzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJjbHBzIGZsYXNoOiBubyBwYXJ0aXRpb24gaW5mbyAiCi0JCQkiYXZhaWxhYmxlLCByZWdpc3RlcmluZyB3aG9sZSBmbGFzaFxuIik7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImNscHMgZmxhc2g6IHVzaW5nICVzIHBhcnRpdGlvbiAiCi0JCQkiZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIHBhcnNlZF9wYXJ0cywgbnJfcGFydHMpOwotCX0KLQotCS8qIEFsd2F5cyBzdWNjZWVkcy4gKi8KLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNscHNfZGVzdHJveV9wYXJ0aXRpb25zKHZvaWQpCi17Ci0Ja2ZyZWUocGFyc2VkX3BhcnRzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNscHNfbXRkX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCWludCBucjsKLQotCW5yID0gY2xwc19zZXR1cF9mbGFzaCgpOwotCWlmIChuciA8IDApCi0JCXJldHVybiBucjsKLQotCXJldCA9IGNscHNfc2V0dXBfbXRkKGluZm8sIG5yLCAmbXltdGQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQljbHBzX2xvY2F0ZV9wYXJ0aXRpb25zKG15bXRkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xwc19tdGRfY2xlYW51cCh2b2lkKQotewotCWNscHNfZGVzdHJveV9tdGQoaW5mbywgbXltdGQpOwotCWNscHNfZGVzdHJveV9wYXJ0aXRpb25zKCk7Ci19Ci0KLW1vZHVsZV9pbml0KGNscHNfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQoY2xwc19tdGRfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlJvYiBTY290dCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDaXJydXMgTG9naWMgSkVERUMgbWFwIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9kYzIxMjg1LmMgYi9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYwppbmRleCA3YTllMTk4Li5mNDNiMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2RjMjEyODUuYwpAQCAtMTQ1LDE0ICsxNDUsMTAgQEAKIAogCiAvKiBQYXJ0aXRpb24gc3R1ZmYgKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqZGMyMTI4NV9wYXJ0czsKIHN0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgIlJlZEJvb3QiLCAiY21kbGluZXBhcnQiLCBOVUxMIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfZGMyMTI4NSh2b2lkKQogewotCi0JaW50IG5ycGFydHM7Ci0KIAkvKiBEZXRlcm1pbmUgYmFua3dpZHRoICovCiAJc3dpdGNoICgqQ1NSX1NBMTEwX0NOVEwgJiAoMzw8MTQpKSB7CiAJCWNhc2UgU0ExMTBfQ05UTF9ST01XSURUSF84OgpAQCAtMjAwLDggKzE5Niw3IEBACiAKIAlkYzIxMjg1X210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCW5ycGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhkYzIxMjg1X210ZCwgcHJvYmVzLCAmZGMyMTI4NV9wYXJ0cywgMCk7Ci0JbXRkX2RldmljZV9yZWdpc3RlcihkYzIxMjg1X210ZCwgZGMyMTI4NV9wYXJ0cywgbnJwYXJ0cyk7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihkYzIxMjg1X210ZCwgcHJvYmVzLCAwLCBOVUxMLCAwKTsKIAogCWlmKG1hY2hpbmVfaXNfZWJzYTI4NSgpKSB7CiAJCS8qCkBAIC0yMjQsOCArMjE5LDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2RjMjEyODUodm9pZCkKIHsKIAltdGRfZGV2aWNlX3VucmVnaXN0ZXIoZGMyMTI4NV9tdGQpOwotCWlmIChkYzIxMjg1X3BhcnRzKQotCQlrZnJlZShkYzIxMjg1X3BhcnRzKTsKIAltYXBfZGVzdHJveShkYzIxMjg1X210ZCk7CiAJaW91bm1hcChkYzIxMjg1X21hcC52aXJ0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvZWRiNzMxMi5jIGIvZHJpdmVycy9tdGQvbWFwcy9lZGI3MzEyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNDJhMjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9lZGI3MzEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIEhhbmRsZSBtYXBwaW5nIG9mIHRoZSBOT1IgZmxhc2ggb24gQ29nZW50IEVEQjczMTIgYm9hcmRzCi0gKgotICogQ29weXJpZ2h0IDIwMDIgU1lTR08gUmVhbC1UaW1lIFNvbHV0aW9ucyBHbWJICi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jZGVmaW5lIFdJTkRPV19BRERSIDB4MDAwMDAwMDAgICAgICAvKiBwaHlzaWNhbCBwcm9wZXJ0aWVzIG9mIGZsYXNoICovCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MDEwMDAwMDAKLSNkZWZpbmUgQlVTV0lEVEggICAgMgotI2RlZmluZSBGTEFTSF9CTE9DS1NJWkVfTUFJTgkweDIwMDAwCi0jZGVmaW5lIEZMQVNIX05VTUJMT0NLU19NQUlOCTEyOAotLyogY2FuIGJlICJjZmlfcHJvYmUiLCAiamVkZWNfcHJvYmUiLCAibWFwX3JvbSIsIE5VTEwgfTsgKi8KLSNkZWZpbmUgUFJPQkVUWVBFUyB7ICJjZmlfcHJvYmUiLCBOVUxMIH0KLQotI2RlZmluZSBNU0dfUFJFRklYICJFREI3MzEyLU5PUjoiICAgLyogcHJlZml4IGZvciBvdXIgcHJpbnRrKCkncyAqLwotI2RlZmluZSBNVERJRCAgICAgICJlZGI3MzEyLW5vciIgICAgLyogZm9yIG10ZHBhcnRzPSBwYXJ0aXRpb25pbmcgKi8KLQotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7Ci0KLXN0cnVjdCBtYXBfaW5mbyBlZGI3MzEybm9yX21hcCA9IHsKLQkubmFtZSA9ICJOT1IgZmxhc2ggb24gRURCNzMxMiIsCi0JLnNpemUgPSBXSU5ET1dfU0laRSwKLQkuYmFua3dpZHRoID0gQlVTV0lEVEgsCi0JLnBoeXMgPSBXSU5ET1dfQUREUiwKLX07Ci0KLS8qCi0gKiBNVEQgcGFydGl0aW9uaW5nIHN0dWZmCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzdGF0aWNfcGFydGl0aW9uc1szXSA9Ci17Ci0JewotCQkubmFtZSA9ICJBUk1ib290IiwKLQkJLnNpemUgPSAweDQwMDAwLAotCQkub2Zmc2V0ID0gMAotCX0sCi0JewotCQkubmFtZSA9ICJLZXJuZWwiLAotCQkuc2l6ZSA9IDB4MjAwMDAwLAotCQkub2Zmc2V0ID0gMHg0MDAwMAotCX0sCi0JewotCQkubmFtZSA9ICJSb290RlMiLAotCQkuc2l6ZSA9IDB4REMwMDAwLAotCQkub2Zmc2V0ID0gMHgyNDAwMDAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiUmVkQm9vdCIsICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICBtdGRfcGFydHNfbmIgPSAwOwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgICAgPSAwOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2VkYjczMTJub3Iodm9pZCkKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqcm9tX3Byb2JlX3R5cGVzW10gPSBQUk9CRVRZUEVTOwotCWNvbnN0IGNoYXIgKip0eXBlOwotCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IDA7Ci0KLSAgICAgICAJcHJpbnRrKEtFUk5fTk9USUNFIE1TR19QUkVGSVggIjB4JTA4eCBhdCAweCUwOHhcbiIsCi0JICAgICAgIFdJTkRPV19TSVpFLCBXSU5ET1dfQUREUik7Ci0JZWRiNzMxMm5vcl9tYXAudmlydCA9IGlvcmVtYXAoV0lORE9XX0FERFIsIFdJTkRPV19TSVpFKTsKLQotCWlmICghZWRiNzMxMm5vcl9tYXAudmlydCkgewotCQlwcmludGsoTVNHX1BSRUZJWCAiZmFpbGVkIHRvIGlvcmVtYXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlzaW1wbGVfbWFwX2luaXQoJmVkYjczMTJub3JfbWFwKTsKLQotCW15bXRkID0gMDsKLQl0eXBlID0gcm9tX3Byb2JlX3R5cGVzOwotCWZvcig7ICFteW10ZCAmJiAqdHlwZTsgdHlwZSsrKSB7Ci0JCW15bXRkID0gZG9fbWFwX3Byb2JlKCp0eXBlLCAmZWRiNzMxMm5vcl9tYXApOwotCX0KLQlpZiAobXltdGQpIHsKLQkJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkJbXRkX3BhcnRzX25iID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXltdGQsIHByb2JlcywgJm10ZF9wYXJ0cywgTVRESUQpOwotCQlpZiAobXRkX3BhcnRzX25iID4gMCkKLQkJCXBhcnRfdHlwZSA9ICJkZXRlY3RlZCI7Ci0KLQkJaWYgKG10ZF9wYXJ0c19uYiA9PSAwKSB7Ci0JCQltdGRfcGFydHMgPSBzdGF0aWNfcGFydGl0aW9uczsKLQkJCW10ZF9wYXJ0c19uYiA9IEFSUkFZX1NJWkUoc3RhdGljX3BhcnRpdGlvbnMpOwotCQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JCX0KLQotCQlpZiAobXRkX3BhcnRzX25iID09IDApCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgTVNHX1BSRUZJWCAibm8gcGFydGl0aW9uIGluZm8gYXZhaWxhYmxlXG4iKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fTk9USUNFIE1TR19QUkVGSVgKLQkJCSAgICAgICAidXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7Ci0JCS8qIFJlZ2lzdGVyIHRoZSB3aG9sZSBkZXZpY2UgZmlyc3QuICovCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXltdGQsIE5VTEwsIDApOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG15bXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlvdW5tYXAoKHZvaWQgKillZGI3MzEybm9yX21hcC52aXJ0KTsKLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9lZGI3MzEybm9yKHZvaWQpCi17Ci0JaWYgKG15bXRkKSB7Ci0JCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihteW10ZCk7Ci0JCW1hcF9kZXN0cm95KG15bXRkKTsKLQl9Ci0JaWYgKGVkYjczMTJub3JfbWFwLnZpcnQpIHsKLQkJaW91bm1hcCgodm9pZCAqKWVkYjczMTJub3JfbWFwLnZpcnQpOwotCQllZGI3MzEybm9yX21hcC52aXJ0ID0gMDsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfZWRiNzMxMm5vcik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2VkYjczMTJub3IpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJpdXMgR3JvZWdlciA8bWFnQHN5c2dvLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIGNvbmZpZ3VyYWJsZSBNVEQgbWFwIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9ncGlvLWFkZHItZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvZ3Bpby1hZGRyLWZsYXNoLmMKaW5kZXggNzU2OGM1Zi4uMWVjNjZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9ncGlvLWFkZHItZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2dwaW8tYWRkci1mbGFzaC5jCkBAIC0xODcsNyArMTg3LDYgQEAKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb19mbGFzaF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCBucl9wYXJ0czsKIAlzaXplX3QgaSwgYXJyX3NpemU7CiAJc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlICptZW1vcnk7CkBAIC0yNTIsMjAgKzI1MSw5IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhzdGF0ZS0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLAotCQkJCQkmcGRhdGEtPnBhcnRzLCAwKTsKLQlpZiAobnJfcGFydHMgPiAwKSB7Ci0JCXByX2RldmluaXQoS0VSTl9OT1RJQ0UgUEZYICJVc2luZyBjb21tYW5kbGluZSBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIik7Ci0JCWtmcmVlKHBkYXRhLT5wYXJ0cyk7Ci0JfSBlbHNlIGlmIChwZGF0YS0+bnJfcGFydHMpIHsKLQkJcHJfZGV2aW5pdChLRVJOX05PVElDRSBQRlggIlVzaW5nIGJvYXJkIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKLQkJbnJfcGFydHMgPSBwZGF0YS0+bnJfcGFydHM7Ci0JfSBlbHNlIHsKLQkJcHJfZGV2aW5pdChLRVJOX05PVElDRSBQRlggIm5vIHBhcnRpdGlvbiBpbmZvIGF2YWlsYWJsZSwgcmVnaXN0ZXJpbmcgd2hvbGUgZmxhc2ggYXQgb25jZVxuIik7Ci0JCW5yX3BhcnRzID0gMDsKLQl9CiAKLQltdGRfZGV2aWNlX3JlZ2lzdGVyKHN0YXRlLT5tdGQsIHBkYXRhLT5wYXJ0cywgbnJfcGFydHMpOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoc3RhdGUtPm10ZCwgcGFydF9wcm9iZV90eXBlcywgMCwKKwkJCXBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9oNzIweC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9oNzIweC1mbGFzaC5jCmluZGV4IDdmMDM1ODYuLjQ5YzE0MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaDcyMHgtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2g3MjB4LWZsYXNoLmMKQEAgLTU4LDE4ICs1OCwxMSBAQAogCiAjZGVmaW5lIE5VTV9QQVJUSVRJT05TIEFSUkFZX1NJWkUoaDcyMHhfcGFydGl0aW9ucykKIAotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICBucl9tdGRfcGFydHM7Ci1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0czsKLXN0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiAvKgogICogSW5pdGlhbGl6ZSBGTEFTSCBzdXBwb3J0CiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGg3MjB4X210ZF9pbml0KHZvaWQpCiB7Ci0KLQljaGFyCSpwYXJ0X3R5cGUgPSBOVUxMOwotCiAJaDcyMHhfbWFwLnZpcnQgPSBpb3JlbWFwKGg3MjB4X21hcC5waHlzLCBoNzIweF9tYXAuc2l6ZSk7CiAKIAlpZiAoIWg3MjB4X21hcC52aXJ0KSB7CkBAIC05MiwxNiArODUsOCBAQAogCWlmIChteW10ZCkgewogCQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCQlucl9tdGRfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhteW10ZCwgcHJvYmVzLCAmbXRkX3BhcnRzLCAwKTsKLQkJaWYgKG5yX210ZF9wYXJ0cyA+IDApCi0JCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQkJaWYgKG5yX210ZF9wYXJ0cyA8PSAwKSB7Ci0JCQltdGRfcGFydHMgPSBoNzIweF9wYXJ0aXRpb25zOwotCQkJbnJfbXRkX3BhcnRzID0gTlVNX1BBUlRJVElPTlM7Ci0JCQlwYXJ0X3R5cGUgPSAiYnVpbHRpbiI7Ci0JCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgJXMgcGFydGl0aW9uIHRhYmxlXG4iLCBwYXJ0X3R5cGUpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG15bXRkLCBtdGRfcGFydHMsIG5yX210ZF9wYXJ0cyk7CisJCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXltdGQsIE5VTEwsIDAsCisJCQkJaDcyMHhfcGFydGl0aW9ucywgTlVNX1BBUlRJVElPTlMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEyMCwxMCArMTA1LDYgQEAKIAkJbWFwX2Rlc3Ryb3kobXltdGQpOwogCX0KIAotCS8qIEZyZWUgcGFydGl0aW9uIGluZm8sIGlmIGNvbW1hbmRsaW5lIHBhcnRpdGlvbiB3YXMgdXNlZCAqLwotCWlmIChtdGRfcGFydHMgJiYgKG10ZF9wYXJ0cyAhPSBoNzIweF9wYXJ0aXRpb25zKSkKLQkJa2ZyZWUgKG10ZF9wYXJ0cyk7Ci0KIAlpZiAoaDcyMHhfbWFwLnZpcnQpIHsKIAkJaW91bm1hcCgodm9pZCAqKWg3MjB4X21hcC52aXJ0KTsKIAkJaDcyMHhfbWFwLnZpcnQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pbXBhNy5jIGIvZHJpdmVycy9tdGQvbWFwcy9pbXBhNy5jCmluZGV4IDQwNGE1MGMuLmY0N2FlZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaW1wYTcuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ltcGE3LmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIC8qCiAgKiBNVEQgcGFydGl0aW9uaW5nIHN0dWZmCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzdGF0aWNfcGFydGl0aW9uc1tdID0KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25zW10gPQogewogCXsKIAkJLm5hbWUgPSAiRmlsZVN5c3RlbSIsCkBAIC01OCwxNiArNTgsMTAgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBtdGRfcGFydHNfbmJbTlVNX0ZMQVNIQkFOS1NdOwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHNbTlVNX0ZMQVNIQkFOS1NdOwotCi1zdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9pbXBhNyh2b2lkKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IFBST0JFVFlQRVM7CiAJY29uc3QgY2hhciAqKnR5cGU7Ci0JY29uc3QgY2hhciAqcGFydF90eXBlID0gMDsKIAlpbnQgaTsKIAlzdGF0aWMgc3RydWN0IHsgdV9sb25nIGFkZHI7IHVfbG9uZyBzaXplOyB9IHB0W05VTV9GTEFTSEJBTktTXSA9IHsKIAkgIHsgV0lORE9XX0FERFIwLCBXSU5ET1dfU0laRTAgfSwKQEAgLTk3LDIzICs5MSw5IEBACiAJCWlmIChpbXBhN19tdGRbaV0pIHsKIAkJCWltcGE3X210ZFtpXS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJCWRldmljZXNmb3VuZCsrOwotCQkJbXRkX3BhcnRzX25iW2ldID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW1wYTdfbXRkW2ldLAotCQkJCQkJCSAgICAgICBwcm9iZXMsCi0JCQkJCQkJICAgICAgICZtdGRfcGFydHNbaV0sCi0JCQkJCQkJICAgICAgIDApOwotCQkJaWYgKG10ZF9wYXJ0c19uYltpXSA+IDApIHsKLQkJCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQkJCX0gZWxzZSB7Ci0JCQkJbXRkX3BhcnRzW2ldID0gc3RhdGljX3BhcnRpdGlvbnM7Ci0JCQkJbXRkX3BhcnRzX25iW2ldID0gQVJSQVlfU0laRShzdGF0aWNfcGFydGl0aW9ucyk7Ci0JCQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JCQl9Ci0KLQkJCXByaW50ayhLRVJOX05PVElDRSBNU0dfUFJFRklYCi0JCQkgICAgICAgInVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLAotCQkJICAgICAgIHBhcnRfdHlwZSk7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGltcGE3X210ZFtpXSwKLQkJCQkJICAgIG10ZF9wYXJ0c1tpXSwgbXRkX3BhcnRzX25iW2ldKTsKKwkJCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW1wYTdfbXRkW2ldLCBOVUxMLCAwLAorCQkJCQkJICBwYXJ0aXRpb25zLAorCQkJCQkJICBBUlJBWV9TSVpFKHBhcnRpdGlvbnMpKTsKIAkJfQogCQllbHNlCiAJCQlpb3VubWFwKCh2b2lkICopaW1wYTdfbWFwW2ldLnZpcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pbnRlbF92cl9ub3IuYyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWxfdnJfbm9yLmMKaW5kZXggZDJmNDdiZS4uMDhjMjM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9pbnRlbF92cl9ub3IuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ludGVsX3ZyX25vci5jCkBAIC00NCw3ICs0NCw2IEBACiAJdm9pZCBfX2lvbWVtICpjc3JfYmFzZTsKIAlzdHJ1Y3QgbWFwX2luZm8gbWFwOwogCXN0cnVjdCBtdGRfaW5mbyAqaW5mbzsKLQlpbnQgbnJfcGFydHM7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIH07CiAKQEAgLTcxLDEzICs3MCw5IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHZyX25vcl9pbml0X3BhcnRpdGlvbnMoc3RydWN0IHZyX25vcl9tdGQgKnApCiB7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIAkvKiByZWdpc3RlciB0aGUgZmxhc2ggYmFuayAqLwogCS8qIHBhcnRpdGlvbiB0aGUgZmxhc2ggYmFuayAqLwotCXAtPm5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMocC0+aW5mbywgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7Ci0JcmV0dXJuIG10ZF9kZXZpY2VfcmVnaXN0ZXIocC0+aW5mbywgcGFydHMsIHAtPm5yX3BhcnRzKTsKKwlyZXR1cm4gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihwLT5pbmZvLCBOVUxMLCAwLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZleGl0IHZyX25vcl9kZXN0cm95X210ZF9zZXR1cChzdHJ1Y3QgdnJfbm9yX210ZCAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKaW5kZXggMTU5NGE4MC4uNDM3ZmNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKQEAgLTM4LDcgKzM4LDYgQEAKIHN0cnVjdCBpeHAyMDAwX2ZsYXNoX2luZm8gewogCXN0cnVjdAkJbXRkX2luZm8gKm10ZDsKIAlzdHJ1Y3QJCW1hcF9pbmZvIG1hcDsKLQlzdHJ1Y3QJCW10ZF9wYXJ0aXRpb24gKnBhcnRpdGlvbnM7CiAJc3RydWN0CQlyZXNvdXJjZSAqcmVzOwogfTsKIApAQCAtMTI1LDggKzEyNCw2IEBACiAJaWYgKGluZm8tPm1hcC5tYXBfcHJpdl8xKQogCQlpb3VubWFwKCh2b2lkICopIGluZm8tPm1hcC5tYXBfcHJpdl8xKTsKIAotCWtmcmVlKGluZm8tPnBhcnRpdGlvbnMpOwotCiAJaWYgKGluZm8tPnJlcykgewogCQlyZWxlYXNlX3Jlc291cmNlKGluZm8tPnJlcyk7CiAJCWtmcmVlKGluZm8tPnJlcyk7CkBAIC0yMjksMTMgKzIyNiw3IEBACiAJfQogCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcHJvYmVzLCAmaW5mby0+cGFydGl0aW9ucywgMCk7Ci0JaWYgKGVyciA+IDApIHsKLQkJZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsIGVycik7Ci0JCWlmKGVycikKLQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IHBhcnNlIHBhcnRpdGlvbnNcbiIpOwotCX0KLQorCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwcm9iZXMsIDAsIE5VTEwsIDApOwogCWlmIChlcnIpCiAJCWdvdG8gRXJyb3I7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCmluZGV4IDE1NWIyMTkuLjMwNDA5MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYwpAQCAtMTQ1LDcgKzE0NSw2IEBACiBzdHJ1Y3QgaXhwNHh4X2ZsYXNoX2luZm8gewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCBtYXBfaW5mbyBtYXA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRpdGlvbnM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiB9OwogCkBAIC0xNjgsOCArMTY3LDYgQEAKIAlpZiAoaW5mby0+bWFwLnZpcnQpCiAJCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOwogCi0Ja2ZyZWUoaW5mby0+cGFydGl0aW9ucyk7Ci0KIAlpZiAoaW5mby0+cmVzKSB7CiAJCXJlbGVhc2VfcmVzb3VyY2UoaW5mby0+cmVzKTsKIAkJa2ZyZWUoaW5mby0+cmVzKTsKQEAgLTE4NSw4ICsxODIsNiBAQAogewogCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaXhwNHh4X2ZsYXNoX2luZm8gKmluZm87Ci0JY29uc3QgY2hhciAqcGFydF90eXBlID0gTlVMTDsKLQlpbnQgbnJfcGFydHMgPSAwOwogCWludCBlcnIgPSAtMTsKIAogCWlmICghcGxhdCkKQEAgLTI1MiwyOCArMjQ3LDEyIEBACiAJLyogVXNlIHRoZSBmYXN0IHZlcnNpb24gKi8KIAlpbmZvLT5tYXAud3JpdGUgPSBpeHA0eHhfd3JpdGUxNjsKIAotCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsICZpbmZvLT5wYXJ0aXRpb25zLAotCQkJCQlkZXYtPnJlc291cmNlLT5zdGFydCk7Ci0JaWYgKG5yX3BhcnRzID4gMCkgewotCQlwYXJ0X3R5cGUgPSAiZHluYW1pYyI7Ci0JfSBlbHNlIHsKLQkJaW5mby0+cGFydGl0aW9ucyA9IHBsYXQtPnBhcnRzOwotCQlucl9wYXJ0cyA9IHBsYXQtPm5yX3BhcnRzOwotCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQl9Ci0JaWYgKG5yX3BhcnRzID09IDApCi0JCXByaW50ayhLRVJOX05PVElDRSAiSVhQNHh4IGZsYXNoOiBubyBwYXJ0aXRpb24gaW5mbyAiCi0JCQkiYXZhaWxhYmxlLCByZWdpc3RlcmluZyB3aG9sZSBmbGFzaFxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIklYUDR4eCBmbGFzaDogdXNpbmcgJXMgcGFydGl0aW9uICIKLQkJCSJkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCi0JZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsIG5yX3BhcnRzKTsKLQlpZiAoZXJyKQorCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwcm9iZXMsIGRldi0+cmVzb3VyY2UtPnN0YXJ0LAorCQkJcGxhdC0+cGFydHMsIHBsYXQtPm5yX3BhcnRzKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHBhcnNlIHBhcnRpdGlvbnNcbiIpOwotCi0JaWYgKGVycikKIAkJZ290byBFcnJvcjsKKwl9CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9sYW50aXEtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvbGFudGlxLWZsYXNoLmMKaW5kZXggYTkwY2FiZC4uNGYxMGUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9sYW50aXEtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2xhbnRpcS1mbGFzaC5jCkBAIC0xMDcsMTYgKzEwNywxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVidV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyIGNvbnN0ICpwYXJ0X3Byb2JlX3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIGludCBfX2luaXQKIGx0cV9tdGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhICpsdHFfbXRkX2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCBsdHFfbXRkICpsdHFfbXRkOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgbnJfcGFydHMgPSAwOwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpOwogCWludCBlcnI7CiAKQEAgLTE3MiwxNyArMTY4LDggQEAKIAljZmktPmFkZHJfdW5sb2NrMSBePSAxOwogCWNmaS0+YWRkcl91bmxvY2syIF49IDE7CiAKLQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGx0cV9tdGQtPm10ZCwKLQkJCQlwYXJ0X3Byb2JlX3R5cGVzLCAmcGFydHMsIDApOwotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwKLQkJCSJ1c2luZyAlZCBwYXJ0aXRpb25zIGZyb20gY21kbGluZSIsIG5yX3BhcnRzKTsKLQl9IGVsc2UgewotCQlucl9wYXJ0cyA9IGx0cV9tdGRfZGF0YS0+bnJfcGFydHM7Ci0JCXBhcnRzID0gbHRxX210ZF9kYXRhLT5wYXJ0czsKLQl9Ci0KLQllcnIgPSBhZGRfbXRkX3BhcnRpdGlvbnMobHRxX210ZC0+bXRkLCBwYXJ0cywgbnJfcGFydHMpOworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobHRxX210ZC0+bXRkLCBOVUxMLCAwLAorCQkJbHRxX210ZF9kYXRhLT5wYXJ0cywgbHRxX210ZF9kYXRhLT5ucl9wYXJ0cyk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIHBhcnRpdGlvbnNcbiIpOwogCQlnb3RvIGVycl9kZXN0cm95OwpAQCAtMjA4LDcgKzE5NSw3IEBACiAKIAlpZiAobHRxX210ZCkgewogCQlpZiAobHRxX210ZC0+bXRkKSB7Ci0JCQlkZWxfbXRkX3BhcnRpdGlvbnMobHRxX210ZC0+bXRkKTsKKwkJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihsdHFfbXRkLT5tdGQpOwogCQkJbWFwX2Rlc3Ryb3kobHRxX210ZC0+bXRkKTsKIAkJfQogCQlpZiAobHRxX210ZC0+bWFwLT52aXJ0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9sYXRjaC1hZGRyLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2xhdGNoLWFkZHItZmxhc2guYwppbmRleCA1OTM2YzQ2Li4xMTliYWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2xhdGNoLWFkZHItZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2xhdGNoLWFkZHItZmxhc2guYwpAQCAtMzMsOSArMzMsNiBAQAogCS8qIGNhY2hlOyBjb3VsZCBiZSBmb3VuZCBvdXQgb2YgcmVzICovCiAJdW5zaWduZWQgbG9uZwkJd2luX21hc2s7CiAKLQlpbnQJCQlucl9wYXJ0czsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7Ci0KIAlzcGlubG9ja190CQlsb2NrOwogfTsKIApAQCAtOTcsOCArOTQsNiBAQAogCiBzdGF0aWMgY2hhciAqcm9tX3Byb2JlX3R5cGVzW10gPSB7ICJjZmlfcHJvYmUiLCBOVUxMIH07CiAKLXN0YXRpYyBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIGludCBsYXRjaF9hZGRyX2ZsYXNoX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGxhdGNoX2FkZHJfZmxhc2hfaW5mbyAqaW5mbzsKQEAgLTExMiw4ICsxMDcsNiBAQAogCWxhdGNoX2FkZHJfZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAlpZiAoaW5mby0+bXRkICE9IE5VTEwpIHsKLQkJaWYgKGluZm8tPm5yX3BhcnRzKQotCQkJa2ZyZWUoaW5mby0+cGFydHMpOwogCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+bXRkKTsKIAkJbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKIAl9CkBAIC0yMDYsMjEgKzE5OSw4IEBACiAJfQogCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgKGNvbnN0IGNoYXIgKiopcGFydF9wcm9iZV90eXBlcywKLQkJCQkgICAmaW5mby0+cGFydHMsIDApOwotCWlmIChlcnIgPiAwKSB7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChsYXRjaF9hZGRyX2RhdGEtPm5yX3BhcnRzKSB7Ci0JCXByX25vdGljZSgiVXNpbmcgbGF0Y2gtYWRkci1mbGFzaCBwYXJ0aXRpb24gaW5mb3JtYXRpb25cbiIpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwKLQkJCQkgICAgbGF0Y2hfYWRkcl9kYXRhLT5wYXJ0cywKLQkJCQkgICAgbGF0Y2hfYWRkcl9kYXRhLT5ucl9wYXJ0cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBOVUxMLCAwKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgTlVMTCwgMCwKKwkJCWxhdGNoX2FkZHJfZGF0YS0+cGFydHMsIGxhdGNoX2FkZHJfZGF0YS0+bnJfcGFydHMpOwogCXJldHVybiAwOwogCiBpb3VubWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKaW5kZXggYmJlMTY4Yi4uZThlOWZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCkBAIC0yMiwyMiArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHCi1zdGF0aWMgaW50IGRlYnVnID0gQ09ORklHX01URF9ERUJVR19WRVJCT1NFOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBEZWJ1ZyBMZXZlbCAwPXF1aWV0LCA1PW5vaXN5Iik7Ci0jdW5kZWYgREVCVUcKLSNkZWZpbmUgREVCVUcobiwgZm9ybWF0LCBhcmcuLi4pIFwKLQlpZiAobiA8PSBkZWJ1ZykgewkgXAotCQlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiVzKCk6ICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fICwgIyMgYXJnKTsgXAotCX0KLQotI2Vsc2UKLSN1bmRlZiBERUJVRwotI2RlZmluZSBERUJVRyhuLCBhcmcuLi4pCi1zdGF0aWMgY29uc3QgaW50IGRlYnVnID0gMDsKLSNlbmRpZgotCiAjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gInBjbWNpYW10ZDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKIAogI2RlZmluZSBEUklWRVJfREVTQwkiUENNQ0lBIEZsYXNoIG1lbW9yeSBjYXJkIGRyaXZlciIKQEAgLTEwNSwxMyArODksMTMgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFwY21jaWFfZGV2X3ByZXNlbnQoZGV2LT5wX2RldikpIHsKLQkJREVCVUcoMSwgImRldmljZSByZW1vdmVkIik7CisJCXByX2RlYnVnKCJkZXZpY2UgcmVtb3ZlZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCW9mZnNldCA9IHRvICYgfihkZXYtPndpbl9zaXplLTEpOwogCWlmIChvZmZzZXQgIT0gZGV2LT5vZmZzZXQpIHsKLQkJREVCVUcoMiwgIlJlbWFwcGluZyB3aW5kb3cgZnJvbSAweCU4Ljh4IHRvIDB4JTguOHgiLAorCQlwcl9kZWJ1ZygiUmVtYXBwaW5nIHdpbmRvdyBmcm9tIDB4JTguOHggdG8gMHglOC44eFxuIiwKIAkJICAgICAgZGV2LT5vZmZzZXQsIG9mZnNldCk7CiAJCXJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UoZGV2LT5wX2Rldiwgd2luLCBvZmZzZXQpOwogCQlpZiAocmV0ICE9IDApCkBAIC0xMzIsNyArMTE2LDcgQEAKIAkJcmV0dXJuIGQ7CiAKIAlkLnhbMF0gPSByZWFkYihhZGRyKTsKLQlERUJVRygzLCAib2ZzID0gMHglMDhseCAoJXApIGRhdGEgPSAweCUwMmx4Iiwgb2ZzLCBhZGRyLCBkLnhbMF0pOworCXByX2RlYnVnKCJvZnMgPSAweCUwOGx4ICglcCkgZGF0YSA9IDB4JTAybHhcbiIsIG9mcywgYWRkciwgZC54WzBdKTsKIAlyZXR1cm4gZDsKIH0KIApAQCAtMTQ3LDcgKzEzMSw3IEBACiAJCXJldHVybiBkOwogCiAJZC54WzBdID0gcmVhZHcoYWRkcik7Ci0JREVCVUcoMywgIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDRseCIsIG9mcywgYWRkciwgZC54WzBdKTsKKwlwcl9kZWJ1Zygib2ZzID0gMHglMDhseCAoJXApIGRhdGEgPSAweCUwNGx4XG4iLCBvZnMsIGFkZHIsIGQueFswXSk7CiAJcmV0dXJuIGQ7CiB9CiAKQEAgLTE1Nyw3ICsxNDEsNyBAQAogCXN0cnVjdCBwY21jaWFtdGRfZGV2ICpkZXYgPSAoc3RydWN0IHBjbWNpYW10ZF9kZXYgKiltYXAtPm1hcF9wcml2XzE7CiAJdW5zaWduZWQgbG9uZyB3aW5fc2l6ZSA9IGRldi0+d2luX3NpemU7CiAKLQlERUJVRygzLCAidG8gPSAlcCBmcm9tID0gJWx1IGxlbiA9ICV6ZCIsIHRvLCBmcm9tLCBsZW4pOworCXByX2RlYnVnKCJ0byA9ICVwIGZyb20gPSAlbHUgbGVuID0gJXpkXG4iLCB0bywgZnJvbSwgbGVuKTsKIAl3aGlsZShsZW4pIHsKIAkJaW50IHRvcmVhZCA9IHdpbl9zaXplIC0gKGZyb20gJiAod2luX3NpemUtMSkpOwogCQljYWRkcl90IGFkZHI7CkBAIC0xNjksNyArMTUzLDcgQEAKIAkJaWYoIWFkZHIpCiAJCQlyZXR1cm47CiAKLQkJREVCVUcoNCwgIm1lbWNweSBmcm9tICVwIHRvICVwIGxlbiA9ICVkIiwgYWRkciwgdG8sIHRvcmVhZCk7CisJCXByX2RlYnVnKCJtZW1jcHkgZnJvbSAlcCB0byAlcCBsZW4gPSAlZFxuIiwgYWRkciwgdG8sIHRvcmVhZCk7CiAJCW1lbWNweV9mcm9taW8odG8sIGFkZHIsIHRvcmVhZCk7CiAJCWxlbiAtPSB0b3JlYWQ7CiAJCXRvICs9IHRvcmVhZDsKQEAgLTE4NSw3ICsxNjksNyBAQAogCWlmKCFhZGRyKQogCQlyZXR1cm47CiAKLQlERUJVRygzLCAiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDJseCIsIGFkciwgYWRkciwgZC54WzBdKTsKKwlwcl9kZWJ1ZygiYWRyID0gMHglMDhseCAoJXApICBkYXRhID0gMHglMDJseFxuIiwgYWRyLCBhZGRyLCBkLnhbMF0pOwogCXdyaXRlYihkLnhbMF0sIGFkZHIpOwogfQogCkBAIC0xOTYsNyArMTgwLDcgQEAKIAlpZighYWRkcikKIAkJcmV0dXJuOwogCi0JREVCVUcoMywgImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTA0bHgiLCBhZHIsIGFkZHIsIGQueFswXSk7CisJcHJfZGVidWcoImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTA0bHhcbiIsIGFkciwgYWRkciwgZC54WzBdKTsKIAl3cml0ZXcoZC54WzBdLCBhZGRyKTsKIH0KIApAQCAtMjA2LDcgKzE5MCw3IEBACiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IChzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqKW1hcC0+bWFwX3ByaXZfMTsKIAl1bnNpZ25lZCBsb25nIHdpbl9zaXplID0gZGV2LT53aW5fc2l6ZTsKIAotCURFQlVHKDMsICJ0byA9ICVsdSBmcm9tID0gJXAgbGVuID0gJXpkIiwgdG8sIGZyb20sIGxlbik7CisJcHJfZGVidWcoInRvID0gJWx1IGZyb20gPSAlcCBsZW4gPSAlemRcbiIsIHRvLCBmcm9tLCBsZW4pOwogCXdoaWxlKGxlbikgewogCQlpbnQgdG93cml0ZSA9IHdpbl9zaXplIC0gKHRvICYgKHdpbl9zaXplLTEpKTsKIAkJY2FkZHJfdCBhZGRyOwpAQCAtMjE4LDcgKzIwMiw3IEBACiAJCWlmKCFhZGRyKQogCQkJcmV0dXJuOwogCi0JCURFQlVHKDQsICJtZW1jcHkgZnJvbSAlcCB0byAlcCBsZW4gPSAlZCIsIGZyb20sIGFkZHIsIHRvd3JpdGUpOworCQlwcl9kZWJ1ZygibWVtY3B5IGZyb20gJXAgdG8gJXAgbGVuID0gJWRcbiIsIGZyb20sIGFkZHIsIHRvd3JpdGUpOwogCQltZW1jcHlfdG9pbyhhZGRyLCBmcm9tLCB0b3dyaXRlKTsKIAkJbGVuIC09IHRvd3JpdGU7CiAJCXRvICs9IHRvd3JpdGU7CkBAIC0yNDAsNyArMjI0LDcgQEAKIAkJcmV0dXJuIGQ7CiAKIAlkLnhbMF0gPSByZWFkYih3aW5fYmFzZSArIG9mcyk7Ci0JREVCVUcoMywgIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDJseCIsCisJcHJfZGVidWcoIm9mcyA9IDB4JTA4bHggKCVwKSBkYXRhID0gMHglMDJseFxuIiwKIAkgICAgICBvZnMsIHdpbl9iYXNlICsgb2ZzLCBkLnhbMF0pOwogCXJldHVybiBkOwogfQpAQCAtMjU1LDcgKzIzOSw3IEBACiAJCXJldHVybiBkOwogCiAJZC54WzBdID0gcmVhZHcod2luX2Jhc2UgKyBvZnMpOwotCURFQlVHKDMsICJvZnMgPSAweCUwOGx4ICglcCkgZGF0YSA9IDB4JTA0bHgiLAorCXByX2RlYnVnKCJvZnMgPSAweCUwOGx4ICglcCkgZGF0YSA9IDB4JTA0bHhcbiIsCiAJICAgICAgb2ZzLCB3aW5fYmFzZSArIG9mcywgZC54WzBdKTsKIAlyZXR1cm4gZDsKIH0KQEAgLTI2OCw3ICsyNTIsNyBAQAogCWlmKERFVl9SRU1PVkVEKG1hcCkpCiAJCXJldHVybjsKIAotCURFQlVHKDMsICJ0byA9ICVwIGZyb20gPSAlbHUgbGVuID0gJXpkIiwgdG8sIGZyb20sIGxlbik7CisJcHJfZGVidWcoInRvID0gJXAgZnJvbSA9ICVsdSBsZW4gPSAlemRcbiIsIHRvLCBmcm9tLCBsZW4pOwogCW1lbWNweV9mcm9taW8odG8sIHdpbl9iYXNlICsgZnJvbSwgbGVuKTsKIH0KIApAQCAtMjgwLDcgKzI2NCw3IEBACiAJaWYoREVWX1JFTU9WRUQobWFwKSkKIAkJcmV0dXJuOwogCi0JREVCVUcoMywgImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTAybHgiLAorCXByX2RlYnVnKCJhZHIgPSAweCUwOGx4ICglcCkgIGRhdGEgPSAweCUwMmx4XG4iLAogCSAgICAgIGFkciwgd2luX2Jhc2UgKyBhZHIsIGQueFswXSk7CiAJd3JpdGViKGQueFswXSwgd2luX2Jhc2UgKyBhZHIpOwogfQpAQCAtMjkzLDcgKzI3Nyw3IEBACiAJaWYoREVWX1JFTU9WRUQobWFwKSkKIAkJcmV0dXJuOwogCi0JREVCVUcoMywgImFkciA9IDB4JTA4bHggKCVwKSAgZGF0YSA9IDB4JTA0bHgiLAorCXByX2RlYnVnKCJhZHIgPSAweCUwOGx4ICglcCkgIGRhdGEgPSAweCUwNGx4XG4iLAogCSAgICAgIGFkciwgd2luX2Jhc2UgKyBhZHIsIGQueFswXSk7CiAJd3JpdGV3KGQueFswXSwgd2luX2Jhc2UgKyBhZHIpOwogfQpAQCAtMzA2LDcgKzI5MCw3IEBACiAJaWYoREVWX1JFTU9WRUQobWFwKSkKIAkJcmV0dXJuOwogCi0JREVCVUcoMywgInRvID0gJWx1IGZyb20gPSAlcCBsZW4gPSAlemQiLCB0bywgZnJvbSwgbGVuKTsKKwlwcl9kZWJ1ZygidG8gPSAlbHUgZnJvbSA9ICVwIGxlbiA9ICV6ZFxuIiwgdG8sIGZyb20sIGxlbik7CiAJbWVtY3B5X3RvaW8od2luX2Jhc2UgKyB0bywgZnJvbSwgbGVuKTsKIH0KIApAQCAtMzE2LDcgKzMwMCw3IEBACiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IChzdHJ1Y3QgcGNtY2lhbXRkX2RldiAqKW1hcC0+bWFwX3ByaXZfMTsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGRldi0+cF9kZXY7CiAKLQlERUJVRygyLCAiZGV2ID0gJXAgb24gPSAlZCB2cHAgPSAlZFxuIiwgZGV2LCBvbiwgZGV2LT52cHApOworCXByX2RlYnVnKCJkZXYgPSAlcCBvbiA9ICVkIHZwcCA9ICVkXG5cbiIsIGRldiwgb24sIGRldi0+dnBwKTsKIAlwY21jaWFfZml4dXBfdnBwKGxpbmssIG9uID8gZGV2LT52cHAgOiAwKTsKIH0KIApAQCAtMzI1LDcgKzMwOSw3IEBACiB7CiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IGxpbmstPnByaXY7CiAKLQlERUJVRygzLCAibGluayA9IDB4JXAiLCBsaW5rKTsKKwlwcl9kZWJ1ZygibGluayA9IDB4JXBcbiIsIGxpbmspOwogCiAJaWYgKGxpbmstPnJlc291cmNlWzJdLT5lbmQpIHsKIAkJaWYoZGV2LT53aW5fYmFzZSkgewpAQCAtMzM3LDcgKzMyMSw2IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19NVERfREVCVUcKIHN0YXRpYyBpbnQgcGNtY2lhbXRkX2Npc3RwbF9mb3JtYXQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAogCQkJCXR1cGxlX3QgKnR1cGxlLAogCQkJCXZvaWQgKnByaXZfZGF0YSkKQEAgLTM0Nyw3ICszMzAsNyBAQAogCWlmICghcGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlLCAmcGFyc2UpKSB7CiAJCWNpc3RwbF9mb3JtYXRfdCAqdCA9ICZwYXJzZS5mb3JtYXQ7CiAJCSh2b2lkKXQ7IC8qIFNodXQgdXAsIGdjYyAqLwotCQlERUJVRygyLCAiRm9ybWF0IHR5cGU6ICV1LCBFcnJvciBEZXRlY3Rpb246ICV1LCBvZmZzZXQgPSAldSwgbGVuZ3RoID0ldSIsCisJCXByX2RlYnVnKCJGb3JtYXQgdHlwZTogJXUsIEVycm9yIERldGVjdGlvbjogJXUsIG9mZnNldCA9ICV1LCBsZW5ndGggPSV1XG4iLAogCQkJdC0+dHlwZSwgdC0+ZWRjLCB0LT5vZmZzZXQsIHQtPmxlbmd0aCk7CiAJfQogCXJldHVybiAtRU5PU1BDOwpAQCAtMzYzLDEyICszNDYsMTEgQEAKIAlpZiAoIXBjbWNpYV9wYXJzZV90dXBsZSh0dXBsZSwgJnBhcnNlKSkgewogCQljaXN0cGxfamVkZWNfdCAqdCA9ICZwYXJzZS5qZWRlYzsKIAkJZm9yIChpID0gMDsgaSA8IHQtPm5pZDsgaSsrKQotCQkJREVCVUcoMiwgIkpFREVDOiAweCUwMnggMHglMDJ4IiwKKwkJCXByX2RlYnVnKCJKRURFQzogMHglMDJ4IDB4JTAyeFxuIiwKIAkJCSAgICAgIHQtPmlkW2ldLm1mciwgdC0+aWRbaV0uaW5mbyk7CiAJfQogCXJldHVybiAtRU5PU1BDOwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgcGNtY2lhbXRkX2Npc3RwbF9kZXZpY2Uoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LAogCQkJCXR1cGxlX3QgKnR1cGxlLApAQCAtMzgyLDE0ICszNjQsMTQgQEAKIAlpZiAocGNtY2lhX3BhcnNlX3R1cGxlKHR1cGxlLCAmcGFyc2UpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCURFQlVHKDIsICJDb21tb24gbWVtb3J5OiIpOworCXByX2RlYnVnKCJDb21tb24gbWVtb3J5OlxuIik7CiAJZGV2LT5wY21jaWFfbWFwLnNpemUgPSB0LT5kZXZbMF0uc2l6ZTsKIAkvKiBmcm9tIGhlcmUgb246IERFQlVHIG9ubHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdC0+bmRldjsgaSsrKSB7Ci0JCURFQlVHKDIsICJSZWdpb24gJWQsIHR5cGUgPSAldSIsIGksIHQtPmRldltpXS50eXBlKTsKLQkJREVCVUcoMiwgIlJlZ2lvbiAlZCwgd3AgPSAldSIsIGksIHQtPmRldltpXS53cCk7Ci0JCURFQlVHKDIsICJSZWdpb24gJWQsIHNwZWVkID0gJXUgbnMiLCBpLCB0LT5kZXZbaV0uc3BlZWQpOwotCQlERUJVRygyLCAiUmVnaW9uICVkLCBzaXplID0gJXUgYnl0ZXMiLCBpLCB0LT5kZXZbaV0uc2l6ZSk7CisJCXByX2RlYnVnKCJSZWdpb24gJWQsIHR5cGUgPSAldVxuIiwgaSwgdC0+ZGV2W2ldLnR5cGUpOworCQlwcl9kZWJ1ZygiUmVnaW9uICVkLCB3cCA9ICV1XG4iLCBpLCB0LT5kZXZbaV0ud3ApOworCQlwcl9kZWJ1ZygiUmVnaW9uICVkLCBzcGVlZCA9ICV1IG5zXG4iLCBpLCB0LT5kZXZbaV0uc3BlZWQpOworCQlwcl9kZWJ1ZygiUmVnaW9uICVkLCBzaXplID0gJXUgYnl0ZXNcbiIsIGksIHQtPmRldltpXS5zaXplKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00MDksMTIgKzM5MSwxMiBAQAogCWRldi0+cGNtY2lhX21hcC5iYW5rd2lkdGggPSB0LT5nZW9bMF0uYnVzd2lkdGg7CiAJLyogZnJvbSBoZXJlIG9uOiBERUJVRyBvbmx5ICovCiAJZm9yIChpID0gMDsgaSA8IHQtPm5nZW87IGkrKykgewotCQlERUJVRygyLCAicmVnaW9uOiAlZCBiYW5rd2lkdGggPSAldSIsIGksIHQtPmdlb1tpXS5idXN3aWR0aCk7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIGVyYXNlX2Jsb2NrID0gJXUiLCBpLCB0LT5nZW9baV0uZXJhc2VfYmxvY2spOwotCQlERUJVRygyLCAicmVnaW9uOiAlZCByZWFkX2Jsb2NrID0gJXUiLCBpLCB0LT5nZW9baV0ucmVhZF9ibG9jayk7Ci0JCURFQlVHKDIsICJyZWdpb246ICVkIHdyaXRlX2Jsb2NrID0gJXUiLCBpLCB0LT5nZW9baV0ud3JpdGVfYmxvY2spOwotCQlERUJVRygyLCAicmVnaW9uOiAlZCBwYXJ0aXRpb24gPSAldSIsIGksIHQtPmdlb1tpXS5wYXJ0aXRpb24pOwotCQlERUJVRygyLCAicmVnaW9uOiAlZCBpbnRlcmxlYXZlID0gJXUiLCBpLCB0LT5nZW9baV0uaW50ZXJsZWF2ZSk7CisJCXByX2RlYnVnKCJyZWdpb246ICVkIGJhbmt3aWR0aCA9ICV1XG4iLCBpLCB0LT5nZW9baV0uYnVzd2lkdGgpOworCQlwcl9kZWJ1ZygicmVnaW9uOiAlZCBlcmFzZV9ibG9jayA9ICV1XG4iLCBpLCB0LT5nZW9baV0uZXJhc2VfYmxvY2spOworCQlwcl9kZWJ1ZygicmVnaW9uOiAlZCByZWFkX2Jsb2NrID0gJXVcbiIsIGksIHQtPmdlb1tpXS5yZWFkX2Jsb2NrKTsKKwkJcHJfZGVidWcoInJlZ2lvbjogJWQgd3JpdGVfYmxvY2sgPSAldVxuIiwgaSwgdC0+Z2VvW2ldLndyaXRlX2Jsb2NrKTsKKwkJcHJfZGVidWcoInJlZ2lvbjogJWQgcGFydGl0aW9uID0gJXVcbiIsIGksIHQtPmdlb1tpXS5wYXJ0aXRpb24pOworCQlwcl9kZWJ1ZygicmVnaW9uOiAlZCBpbnRlcmxlYXZlID0gJXVcbiIsIGksIHQtPmdlb1tpXS5pbnRlcmxlYXZlKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00MzIsMTMgKzQxNCwxMSBAQAogCQkJaWYgKHBfZGV2LT5wcm9kX2lkW2ldKQogCQkJCXN0cmNhdChkZXYtPm10ZF9uYW1lLCBwX2Rldi0+cHJvZF9pZFtpXSk7CiAJCX0KLQkJREVCVUcoMiwgIkZvdW5kIG5hbWU6ICVzIiwgZGV2LT5tdGRfbmFtZSk7CisJCXByX2RlYnVnKCJGb3VuZCBuYW1lOiAlc1xuIiwgZGV2LT5tdGRfbmFtZSk7CiAJfQogCi0jaWZkZWYgQ09ORklHX01URF9ERUJVRwogCXBjbWNpYV9sb29wX3R1cGxlKHBfZGV2LCBDSVNUUExfRk9STUFULCBwY21jaWFtdGRfY2lzdHBsX2Zvcm1hdCwgTlVMTCk7CiAJcGNtY2lhX2xvb3BfdHVwbGUocF9kZXYsIENJU1RQTF9KRURFQ19DLCBwY21jaWFtdGRfY2lzdHBsX2plZGVjLCBOVUxMKTsKLSNlbmRpZgogCXBjbWNpYV9sb29wX3R1cGxlKHBfZGV2LCBDSVNUUExfREVWSUNFLCBwY21jaWFtdGRfY2lzdHBsX2RldmljZSwgZGV2KTsKIAlwY21jaWFfbG9vcF90dXBsZShwX2RldiwgQ0lTVFBMX0RFVklDRV9HRU8sIHBjbWNpYW10ZF9jaXN0cGxfZ2VvLCBkZXYpOwogCkBAIC00NTAsMTIgKzQzMCwxMiBAQAogCiAJaWYoZm9yY2Vfc2l6ZSkgewogCQlkZXYtPnBjbWNpYV9tYXAuc2l6ZSA9IGZvcmNlX3NpemUgPDwgMjA7Ci0JCURFQlVHKDIsICJzaXplIGZvcmNlZCB0byAlZE0iLCBmb3JjZV9zaXplKTsKKwkJcHJfZGVidWcoInNpemUgZm9yY2VkIHRvICVkTVxuIiwgZm9yY2Vfc2l6ZSk7CiAJfQogCiAJaWYoYmFua3dpZHRoKSB7CiAJCWRldi0+cGNtY2lhX21hcC5iYW5rd2lkdGggPSBiYW5rd2lkdGg7Ci0JCURFQlVHKDIsICJiYW5rd2lkdGggZm9yY2VkIHRvICVkIiwgYmFua3dpZHRoKTsKKwkJcHJfZGVidWcoImJhbmt3aWR0aCBmb3JjZWQgdG8gJWRcbiIsIGJhbmt3aWR0aCk7CiAJfQogCiAJZGV2LT5wY21jaWFfbWFwLm5hbWUgPSBkZXYtPm10ZF9uYW1lOwpAQCAtNDY0LDcgKzQ0NCw3IEBACiAJCSpuZXdfbmFtZSA9IDE7CiAJfQogCi0JREVCVUcoMSwgIkRldmljZTogU2l6ZTogJWx1IFdpZHRoOiVkIE5hbWU6ICVzIiwKKwlwcl9kZWJ1ZygiRGV2aWNlOiBTaXplOiAlbHUgV2lkdGg6JWQgTmFtZTogJXNcbiIsCiAJICAgICAgZGV2LT5wY21jaWFfbWFwLnNpemUsCiAJICAgICAgZGV2LT5wY21jaWFfbWFwLmJhbmt3aWR0aCA8PCAzLCBkZXYtPm10ZF9uYW1lKTsKIH0KQEAgLTQ3OSw3ICs0NTksNyBAQAogCXN0YXRpYyBjaGFyICpwcm9iZXNbXSA9IHsgImplZGVjX3Byb2JlIiwgImNmaV9wcm9iZSIgfTsKIAlpbnQgbmV3X25hbWUgPSAwOwogCi0JREVCVUcoMywgImxpbms9MHglcCIsIGxpbmspOworCXByX2RlYnVnKCJsaW5rPTB4JXBcbiIsIGxpbmspOwogCiAJY2FyZF9zZXR0aW5ncyhkZXYsIGxpbmssICZuZXdfbmFtZSk7CiAKQEAgLTUxMiwxMSArNDkyLDExIEBACiAKIAlkbyB7CiAJCWludCByZXQ7Ci0JCURFQlVHKDIsICJyZXF1ZXN0aW5nIHdpbmRvdyB3aXRoIHNpemUgPSAlbHVLaUIgbWVtc3BlZWQgPSAlZCIsCisJCXByX2RlYnVnKCJyZXF1ZXN0aW5nIHdpbmRvdyB3aXRoIHNpemUgPSAlbHVLaUIgbWVtc3BlZWQgPSAlZFxuIiwKIAkJCSh1bnNpZ25lZCBsb25nKSByZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzJdKSA+PiAxMCwKIAkJCW1lbV9zcGVlZCk7CiAJCXJldCA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyhsaW5rLCBsaW5rLT5yZXNvdXJjZVsyXSwgbWVtX3NwZWVkKTsKLQkJREVCVUcoMiwgInJldCA9ICVkIGRldi0+d2luX3NpemUgPSAlZCIsIHJldCwgZGV2LT53aW5fc2l6ZSk7CisJCXByX2RlYnVnKCJyZXQgPSAlZCBkZXYtPndpbl9zaXplID0gJWRcbiIsIHJldCwgZGV2LT53aW5fc2l6ZSk7CiAJCWlmKHJldCkgewogCQkJaisrOwogCQkJbGluay0+cmVzb3VyY2VbMl0tPnN0YXJ0ID0gMDsKQEAgLTUyNCwyMSArNTA0LDIxIEBACiAJCQkJCWZvcmNlX3NpemUgPDwgMjAgOiBNQVhfUENNQ0lBX0FERFI7CiAJCQlsaW5rLT5yZXNvdXJjZVsyXS0+ZW5kID4+PSBqOwogCQl9IGVsc2UgewotCQkJREVCVUcoMiwgIkdvdCB3aW5kb3cgb2Ygc2l6ZSAlbHVLaUIiLCAodW5zaWduZWQgbG9uZykKKwkJCXByX2RlYnVnKCJHb3Qgd2luZG93IG9mIHNpemUgJWx1S2lCXG4iLCAodW5zaWduZWQgbG9uZykKIAkJCQlyZXNvdXJjZV9zaXplKGxpbmstPnJlc291cmNlWzJdKSA+PiAxMCk7CiAJCQlkZXYtPndpbl9zaXplID0gcmVzb3VyY2Vfc2l6ZShsaW5rLT5yZXNvdXJjZVsyXSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGxpbmstPnJlc291cmNlWzJdLT5lbmQgPj0gMHgxMDAwKTsKIAotCURFQlVHKDIsICJkZXYtPndpbl9zaXplID0gJWQiLCBkZXYtPndpbl9zaXplKTsKKwlwcl9kZWJ1ZygiZGV2LT53aW5fc2l6ZSA9ICVkXG4iLCBkZXYtPndpbl9zaXplKTsKIAogCWlmKCFkZXYtPndpbl9zaXplKSB7CiAJCWRldl9lcnIoJmRldi0+cF9kZXYtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgd2luZG93XG4iKTsKIAkJcGNtY2lhbXRkX3JlbGVhc2UobGluayk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlERUJVRygxLCAiQWxsb2NhdGVkIGEgd2luZG93IG9mICVkS2lCIiwgZGV2LT53aW5fc2l6ZSA+PiAxMCk7CisJcHJfZGVidWcoIkFsbG9jYXRlZCBhIHdpbmRvdyBvZiAlZEtpQlxuIiwgZGV2LT53aW5fc2l6ZSA+PiAxMCk7CiAKIAkvKiBHZXQgd3JpdGUgcHJvdGVjdCBzdGF0dXMgKi8KIAlkZXYtPndpbl9iYXNlID0gaW9yZW1hcChsaW5rLT5yZXNvdXJjZVsyXS0+c3RhcnQsCkBAIC01NDksNyArNTI5LDcgQEAKIAkJcGNtY2lhbXRkX3JlbGVhc2UobGluayk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlERUJVRygxLCAibWFwcGVkIHdpbmRvdyBkZXYgPSAlcCBAICVwUiwgYmFzZSA9ICVwIiwKKwlwcl9kZWJ1ZygibWFwcGVkIHdpbmRvdyBkZXYgPSAlcCBAICVwUiwgYmFzZSA9ICVwXG4iLAogCSAgICAgIGRldiwgbGluay0+cmVzb3VyY2VbMl0sIGRldi0+d2luX2Jhc2UpOwogCiAJZGV2LT5vZmZzZXQgPSAwOwpAQCAtNTY0LDcgKzU0NCw3IEBACiAJfQogCiAJbGluay0+Y29uZmlnX2luZGV4ID0gMDsKLQlERUJVRygyLCAiU2V0dGluZyBDb25maWd1cmF0aW9uIik7CisJcHJfZGVidWcoIlNldHRpbmcgQ29uZmlndXJhdGlvblxuIik7CiAJcmV0ID0gcGNtY2lhX2VuYWJsZV9kZXZpY2UobGluayk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWlmIChkZXYtPndpbl9iYXNlKSB7CkBAIC01ODAsMTcgKzU2MCwxNyBAQAogCQltdGQgPSBkb19tYXBfcHJvYmUoIm1hcF9yb20iLCAmZGV2LT5wY21jaWFfbWFwKTsKIAl9IGVsc2UgewogCQlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2Jlcyk7IGkrKykgewotCQkJREVCVUcoMSwgIlRyeWluZyAlcyIsIHByb2Jlc1tpXSk7CisJCQlwcl9kZWJ1ZygiVHJ5aW5nICVzXG4iLCBwcm9iZXNbaV0pOwogCQkJbXRkID0gZG9fbWFwX3Byb2JlKHByb2Jlc1tpXSwgJmRldi0+cGNtY2lhX21hcCk7CiAJCQlpZihtdGQpCiAJCQkJYnJlYWs7CiAKLQkJCURFQlVHKDEsICJGQUlMRUQ6ICVzIiwgcHJvYmVzW2ldKTsKKwkJCXByX2RlYnVnKCJGQUlMRUQ6ICVzXG4iLCBwcm9iZXNbaV0pOwogCQl9CiAJfQogCiAJaWYoIW10ZCkgewotCQlERUJVRygxLCAiQ2FuIG5vdCBmaW5kIGFuIE1URCIpOworCQlwcl9kZWJ1ZygiQ2FuIG5vdCBmaW5kIGFuIE1URFxuIik7CiAJCXBjbWNpYW10ZF9yZWxlYXNlKGxpbmspOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC02MTcsNyArNTk3LDcgQEAKIAkvKiBJZiB0aGUgbWVtb3J5IGZvdW5kIGlzIGZpdHMgY29tcGxldGVseSBpbnRvIHRoZSBtYXBwZWQgUENNQ0lBIHdpbmRvdywKIAkgICB1c2UgdGhlIGZhc3RlciBub24tcmVtYXBwaW5nIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCiAJaWYobXRkLT5zaXplIDw9IGRldi0+d2luX3NpemUpIHsKLQkJREVCVUcoMSwgIlVzaW5nIG5vbiByZW1hcHBpbmcgbWVtb3J5IGZ1bmN0aW9ucyIpOworCQlwcl9kZWJ1ZygiVXNpbmcgbm9uIHJlbWFwcGluZyBtZW1vcnkgZnVuY3Rpb25zXG4iKTsKIAkJZGV2LT5wY21jaWFfbWFwLm1hcF9wcml2XzIgPSAodW5zaWduZWQgbG9uZylkZXYtPndpbl9iYXNlOwogCQlpZiAoZGV2LT5wY21jaWFfbWFwLmJhbmt3aWR0aCA9PSAxKSB7CiAJCQlkZXYtPnBjbWNpYV9tYXAucmVhZCA9IHBjbWNpYV9yZWFkODsKQEAgLTY0NSw3ICs2MjUsNyBAQAogCiBzdGF0aWMgaW50IHBjbWNpYW10ZF9zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYpCiB7Ci0JREVCVUcoMiwgIkVWRU5UX1BNX1JFU1VNRSIpOworCXByX2RlYnVnKCJFVkVOVF9QTV9SRVNVTUVcbiIpOwogCiAJLyogZ2V0X2xvY2sobGluayk7ICovCiAKQEAgLTY1NCw3ICs2MzQsNyBAQAogCiBzdGF0aWMgaW50IHBjbWNpYW10ZF9yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldikKIHsKLQlERUJVRygyLCAiRVZFTlRfUE1fU1VTUEVORCIpOworCXByX2RlYnVnKCJFVkVOVF9QTV9TVVNQRU5EXG4iKTsKIAogCS8qIGZyZWVfbG9jayhsaW5rKTsgKi8KIApAQCAtNjY2LDcgKzY0Niw3IEBACiB7CiAJc3RydWN0IHBjbWNpYW10ZF9kZXYgKmRldiA9IGxpbmstPnByaXY7CiAKLQlERUJVRygzLCAibGluaz0weCVwIiwgbGluayk7CisJcHJfZGVidWcoImxpbms9MHglcFxuIiwgbGluayk7CiAKIAlpZihkZXYtPm10ZF9pbmZvKSB7CiAJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihkZXYtPm10ZF9pbmZvKTsKQEAgLTY4Niw3ICs2NjYsNyBAQAogCS8qIENyZWF0ZSBuZXcgbWVtb3J5IGNhcmQgZGV2aWNlICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSByZXR1cm4gLUVOT01FTTsKLQlERUJVRygxLCAiZGV2PTB4JXAiLCBkZXYpOworCXByX2RlYnVnKCJkZXY9MHglcFxuIiwgZGV2KTsKIAogCWRldi0+cF9kZXYgPSBsaW5rOwogCWxpbmstPnByaXYgPSBkZXY7CkBAIC03NTUsNyArNzM1LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcGNtY2lhbXRkKHZvaWQpCiB7Ci0JREVCVUcoMSwgRFJJVkVSX0RFU0MgIiB1bmxvYWRpbmciKTsKKwlwcl9kZWJ1ZyhEUklWRVJfREVTQyAiIHVubG9hZGluZyIpOwogCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcGNtY2lhbXRkX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggZjY0Y2VlNC4uNjZlODIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKQEAgLTI3LDggKzI3LDYgQEAKIAlzdHJ1Y3QgbXRkX2luZm8JCSptdGRbTUFYX1JFU09VUkNFU107CiAJc3RydWN0IG10ZF9pbmZvCQkqY210ZDsKIAlzdHJ1Y3QgbWFwX2luZm8JCW1hcFtNQVhfUkVTT1VSQ0VTXTsKLQlpbnQJCQlucl9wYXJ0czsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CiB9OwogCiBzdGF0aWMgaW50IHBoeXNtYXBfZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKQEAgLTQ2LDggKzQ0LDYgQEAKIAogCWlmIChpbmZvLT5jbXRkKSB7CiAJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5jbXRkKTsKLQkJaWYgKGluZm8tPm5yX3BhcnRzKQotCQkJa2ZyZWUoaW5mby0+cGFydHMpOwogCQlpZiAoaW5mby0+Y210ZCAhPSBpbmZvLT5tdGRbMF0pCiAJCQltdGRfY29uY2F0X2Rlc3Ryb3koaW5mby0+Y210ZCk7CiAJfQpAQCAtMTc1LDIzICsxNzEsOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDsKIAotCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPmNtdGQsIHBhcnRfcHJvYmVfdHlwZXMsCi0JCQkJICAgJmluZm8tPnBhcnRzLCAwKTsKLQlpZiAoZXJyID4gMCkgewotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPmNtdGQsIGluZm8tPnBhcnRzLCBlcnIpOwotCQlpbmZvLT5ucl9wYXJ0cyA9IGVycjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHBoeXNtYXBfZGF0YS0+bnJfcGFydHMpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyBwaHlzbWFwIHBhcnRpdGlvbiBpbmZvcm1hdGlvblxuIik7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgcGh5c21hcF9kYXRhLT5wYXJ0cywKLQkJCQkgICAgcGh5c21hcF9kYXRhLT5ucl9wYXJ0cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgTlVMTCwgMCk7Ci0KKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPmNtdGQsIHBhcnRfcHJvYmVfdHlwZXMsIDAsCisJCQkJICBwaHlzbWFwX2RhdGEtPnBhcnRzLCBwaHlzbWFwX2RhdGEtPm5yX3BhcnRzKTsKIAlyZXR1cm4gMDsKIAogZXJyX291dDoKQEAgLTI0NSwyMSArMjI2LDYgQEAKIAkubnVtX3Jlc291cmNlcwk9IDEsCiAJLnJlc291cmNlCT0gJnBoeXNtYXBfZmxhc2hfcmVzb3VyY2UsCiB9OwotCi12b2lkIHBoeXNtYXBfY29uZmlndXJlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQlpbnQgYmFua3dpZHRoLCB2b2lkICgqc2V0X3ZwcCkoc3RydWN0IG1hcF9pbmZvICosIGludCkpCi17Ci0JcGh5c21hcF9mbGFzaF9yZXNvdXJjZS5zdGFydCA9IGFkZHI7Ci0JcGh5c21hcF9mbGFzaF9yZXNvdXJjZS5lbmQgPSBhZGRyICsgc2l6ZSAtIDE7Ci0JcGh5c21hcF9mbGFzaF9kYXRhLndpZHRoID0gYmFua3dpZHRoOwotCXBoeXNtYXBfZmxhc2hfZGF0YS5zZXRfdnBwID0gc2V0X3ZwcDsKLX0KLQotdm9pZCBwaHlzbWFwX3NldF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cywgaW50IG51bV9wYXJ0cykKLXsKLQlwaHlzbWFwX2ZsYXNoX2RhdGEubnJfcGFydHMgPSBudW1fcGFydHM7Ci0JcGh5c21hcF9mbGFzaF9kYXRhLnBhcnRzID0gcGFydHM7Ci19CiAjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgcGh5c21hcF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCmluZGV4IGQyNTFkMWQuLjdkNjVmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCkBAIC0zNCw1OCArMzQsMTAgQEAKIAogc3RydWN0IG9mX2ZsYXNoIHsKIAlzdHJ1Y3QgbXRkX2luZm8JCSpjbXRkOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIAlpbnQgbGlzdF9zaXplOyAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gb2ZfZmxhc2hfbGlzdCAqLwogCXN0cnVjdCBvZl9mbGFzaF9saXN0CWxpc3RbMF07CiB9OwogCi0jZGVmaW5lIE9GX0ZMQVNIX1BBUlRTKGluZm8pCSgoaW5mbyktPnBhcnRzKQotc3RhdGljIGludCBwYXJzZV9vYnNvbGV0ZV9wYXJ0aXRpb25zKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBvZl9mbGFzaCAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCi17Ci0JaW50IGksIHBsZW4sIG5yX3BhcnRzOwotCWNvbnN0IHN0cnVjdCB7Ci0JCV9fYmUzMiBvZmZzZXQsIGxlbjsKLQl9ICpwYXJ0OwotCWNvbnN0IGNoYXIgKm5hbWVzOwotCi0JcGFydCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInBhcnRpdGlvbnMiLCAmcGxlbik7Ci0JaWYgKCFwYXJ0KQotCQlyZXR1cm4gMDsgLyogTm8gcGFydGl0aW9ucyBmb3VuZCAqLwotCi0JZGV2X3dhcm4oJmRldi0+ZGV2LCAiRGV2aWNlIHRyZWUgdXNlcyBvYnNvbGV0ZSBwYXJ0aXRpb24gbWFwIGJpbmRpbmdcbiIpOwotCi0JbnJfcGFydHMgPSBwbGVuIC8gc2l6ZW9mKHBhcnRbMF0pOwotCi0JaW5mby0+cGFydHMgPSBremFsbG9jKG5yX3BhcnRzICogc2l6ZW9mKCppbmZvLT5wYXJ0cyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mby0+cGFydHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbmFtZXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJwYXJ0aXRpb24tbmFtZXMiLCAmcGxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFydHM7IGkrKykgewotCQlpbmZvLT5wYXJ0c1tpXS5vZmZzZXQgPSBiZTMyX3RvX2NwdShwYXJ0LT5vZmZzZXQpOwotCQlpbmZvLT5wYXJ0c1tpXS5zaXplICAgPSBiZTMyX3RvX2NwdShwYXJ0LT5sZW4pICYgfjE7Ci0JCWlmIChiZTMyX3RvX2NwdShwYXJ0LT5sZW4pICYgMSkgLyogYml0IDAgc2V0IHNpZ25pZmllcyByZWFkIG9ubHkgcGFydGl0aW9uICovCi0JCQlpbmZvLT5wYXJ0c1tpXS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRTsKLQotCQlpZiAobmFtZXMgJiYgKHBsZW4gPiAwKSkgewotCQkJaW50IGxlbiA9IHN0cmxlbihuYW1lcykgKyAxOwotCi0JCQlpbmZvLT5wYXJ0c1tpXS5uYW1lID0gKGNoYXIgKiluYW1lczsKLQkJCXBsZW4gLT0gbGVuOwotCQkJbmFtZXMgKz0gbGVuOwotCQl9IGVsc2UgewotCQkJaW5mby0+cGFydHNbaV0ubmFtZSA9ICJ1bm5hbWVkIjsKLQkJfQotCi0JCXBhcnQrKzsKLQl9Ci0KLQlyZXR1cm4gbnJfcGFydHM7Ci19Ci0KIHN0YXRpYyBpbnQgb2ZfZmxhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb2ZfZmxhc2ggKmluZm87CkBAIC0xMDEsMTEgKzUzLDggQEAKIAkJbXRkX2NvbmNhdF9kZXN0cm95KGluZm8tPmNtdGQpOwogCX0KIAotCWlmIChpbmZvLT5jbXRkKSB7Ci0JCWlmIChPRl9GTEFTSF9QQVJUUyhpbmZvKSkKLQkJCWtmcmVlKE9GX0ZMQVNIX1BBUlRTKGluZm8pKTsKKwlpZiAoaW5mby0+Y210ZCkKIAkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmNtdGQpOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5saXN0X3NpemU7IGkrKykgewogCQlpZiAoaW5mby0+bGlzdFtpXS5tdGQpCkBAIC0xNjUsNyArMTE0LDggQEAKICAgIHNwZWNpZmllcyB0aGUgbGlzdCBvZiBwYXJ0aXRpb24gcHJvYmVycyB0byB1c2UuIElmIG5vbmUgaXMgZ2l2ZW4gdGhlbiB0aGUKICAgIGRlZmF1bHQgaXMgdXNlLiBUaGVzZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBvdGhlciBkZXZpY2UgdHJlZQogICAgaW5mb3JtYXRpb24uICovCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc19kZWZbXSA9IHsgImNtZGxpbmVwYXJ0IiwgIlJlZEJvb3QiLCBOVUxMIH07CitzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc19kZWZbXSA9IHsgImNtZGxpbmVwYXJ0IiwgIlJlZEJvb3QiLAorCQkJCQkib2ZwYXJ0IiwgIm9mb2xkcGFydCIsIE5VTEwgfTsKIHN0YXRpYyBjb25zdCBjaGFyICoqIF9fZGV2aW5pdCBvZl9nZXRfcHJvYmVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7CiAJY29uc3QgY2hhciAqY3A7CkBAIC0yMTgsNiArMTY4LDcgQEAKIAlpbnQgcmVnX3R1cGxlX3NpemU7CiAJc3RydWN0IG10ZF9pbmZvICoqbXRkX2xpc3QgPSBOVUxMOwogCXJlc291cmNlX3NpemVfdCByZXNfc2l6ZTsKKwlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgcHBkYXRhOwogCiAJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfZmxhc2hfbWF0Y2gsICZkZXYtPmRldik7CiAJaWYgKCFtYXRjaCkKQEAgLTMzMSwyOSArMjgyLDEyIEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OwogCisJcHBkYXRhLm9mX25vZGUgPSBkcDsKIAlwYXJ0X3Byb2JlX3R5cGVzID0gb2ZfZ2V0X3Byb2JlcyhkcCk7Ci0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywKLQkJCQkgICAmaW5mby0+cGFydHMsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCW9mX2ZyZWVfcHJvYmVzKHBhcnRfcHJvYmVfdHlwZXMpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQorCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywgJnBwZGF0YSwKKwkJCU5VTEwsIDApOwogCW9mX2ZyZWVfcHJvYmVzKHBhcnRfcHJvYmVfdHlwZXMpOwogCi0JaWYgKGVyciA9PSAwKSB7Ci0JCWVyciA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKCZkZXYtPmRldiwgZHAsICZpbmZvLT5wYXJ0cyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJfb3V0OwotCX0KLQotCWlmIChlcnIgPT0gMCkgewotCQllcnIgPSBwYXJzZV9vYnNvbGV0ZV9wYXJ0aXRpb25zKGRldiwgaW5mbywgZHApOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyX291dDsKLQl9Ci0KLQltdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPmNtdGQsIGluZm8tPnBhcnRzLCBlcnIpOwotCiAJa2ZyZWUobXRkX2xpc3QpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKaW5kZXggOWNhMWVjYy4uOTRmNTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYwpAQCAtNDQsOCArNDQsNiBAQAogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IG10ZF9pbmZvCQkqbXRkOwogCXN0cnVjdCBtYXBfaW5mbwkJIG1hcDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKLQlib29sCQkJZnJlZV9wYXJ0aXRpb25zOwogCXN0cnVjdCByZXNvdXJjZQkJKmFyZWE7CiAJc3RydWN0IHBsYXRkYXRhX210ZF9yYW0JKnBkYXRhOwogfTsKQEAgLTk1LDEwICs5Myw2IEBACiAKIAlpZiAoaW5mby0+bXRkKSB7CiAJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihpbmZvLT5tdGQpOwotCQlpZiAoaW5mby0+cGFydGl0aW9ucykgewotCQkJaWYgKGluZm8tPmZyZWVfcGFydGl0aW9ucykKLQkJCQlrZnJlZShpbmZvLT5wYXJ0aXRpb25zKTsKLQkJfQogCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOwogCX0KIApAQCAtMjI4LDIxICsyMjIsOCBAQAogCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSBwYXJ0aXRpb25zLCBvciB3ZXRoZXIKIAkgKiB0byBhZGQgdGhpcyBkZXZpY2Ugd2hvbGUgKi8KIAotCWlmICghcGRhdGEtPm5yX3BhcnRpdGlvbnMpIHsKLQkJLyogdHJ5IHRvIHByb2JlIHVzaW5nIHRoZSBzdXBwbGllZCBwcm9iZSB0eXBlICovCi0JCWlmIChwZGF0YS0+cHJvYmVzKSB7Ci0JCQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBkYXRhLT5wcm9iZXMsCi0JCQkJCSAgICZpbmZvLT5wYXJ0aXRpb25zLCAwKTsKLQkJCWluZm8tPmZyZWVfcGFydGl0aW9ucyA9IDE7Ci0JCQlpZiAoZXJyID4gMCkKLQkJCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwKLQkJCQkJaW5mby0+cGFydGl0aW9ucywgZXJyKTsKLQkJfQotCX0KLQkvKiB1c2UgdGhlIHN0YXRpYyBtYXBwaW5nICovCi0JZWxzZQotCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcGRhdGEtPnBhcnRpdGlvbnMsCi0JCQkJCSAgcGRhdGEtPm5yX3BhcnRpdGlvbnMpOworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwZGF0YS0+cHJvYmVzLCAwLAorCQkJcGRhdGEtPnBhcnRpdGlvbnMsIHBkYXRhLT5ucl9wYXJ0aXRpb25zKTsKIAlpZiAoIWVycikKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlZ2lzdGVyZWQgbXRkIGRldmljZVxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3B4YTJ4eC1mbGFzaC5jCmluZGV4IDdhZTEzN2QuLjQxMWExN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYwpAQCAtNDEsOCArNDEsNiBAQAogfQogCiBzdHJ1Y3QgcHhhMnh4X2ZsYXNoX2luZm8gewotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKLQlpbnQJCQlucl9wYXJ0czsKIAlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7CiAJc3RydWN0IG1hcF9pbmZvCQltYXA7CiB9OwpAQCAtNTUsOSArNTMsNyBAQAogewogCXN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpmbGFzaCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBweGEyeHhfZmxhc2hfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IHJldCA9IDA7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcmVzKQpAQCAtNzEsOCArNjcsNiBAQAogCWluZm8tPm1hcC5iYW5rd2lkdGggPSBmbGFzaC0+d2lkdGg7CiAJaW5mby0+bWFwLnBoeXMgPSByZXMtPnN0YXJ0OwogCWluZm8tPm1hcC5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwotCWluZm8tPnBhcnRzID0gZmxhc2gtPnBhcnRzOwotCWluZm8tPm5yX3BhcnRzID0gZmxhc2gtPm5yX3BhcnRzOwogCiAJaW5mby0+bWFwLnZpcnQgPSBpb3JlbWFwKGluZm8tPm1hcC5waHlzLCBpbmZvLT5tYXAuc2l6ZSk7CiAJaWYgKCFpbmZvLT5tYXAudmlydCkgewpAQCAtMTA0LDE4ICs5OCw3IEBACiAJfQogCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcHJvYmVzLCAmcGFydHMsIDApOwotCi0JaWYgKHJldCA+IDApIHsKLQkJaW5mby0+bnJfcGFydHMgPSByZXQ7Ci0JCWluZm8tPnBhcnRzID0gcGFydHM7Ci0JfQotCi0JaWYgKCFpbmZvLT5ucl9wYXJ0cykKLQkJcHJpbnRrKCJSZWdpc3RlcmluZyAlcyBhcyB3aG9sZSBkZXZpY2VcbiIsCi0JCSAgICAgICBpbmZvLT5tYXAubmFtZSk7Ci0KLQltdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgaW5mby0+cGFydHMsIGluZm8tPm5yX3BhcnRzKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcHJvYmVzLCAwLCBOVUxMLCAwKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCXJldHVybiAwOwpAQCAtMTMzLDcgKzExNiw2IEBACiAJaW91bm1hcChpbmZvLT5tYXAudmlydCk7CiAJaWYgKGluZm8tPm1hcC5jYWNoZWQpCiAJCWlvdW5tYXAoaW5mby0+bWFwLmNhY2hlZCk7Ci0Ja2ZyZWUoaW5mby0+cGFydHMpOwogCWtmcmVlKGluZm8pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9yYnR4NDkzOS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9yYnR4NDkzOS1mbGFzaC5jCmluZGV4IDc2MWZiNDUuLjAyMzdmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcmJ0eDQ5MzktZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3JidHg0OTM5LWZsYXNoLmMKQEAgLTI1LDggKzI1LDYgQEAKIHN0cnVjdCByYnR4NDkzOV9mbGFzaF9pbmZvIHsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKIAlzdHJ1Y3QgbWFwX2luZm8gbWFwOwotCWludCBucl9wYXJ0czsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiB9OwogCiBzdGF0aWMgaW50IHJidHg0OTM5X2ZsYXNoX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCkBAIC00MSw4ICszOSw2IEBACiAJaWYgKGluZm8tPm10ZCkgewogCQlzdHJ1Y3QgcmJ0eDQ5MzlfZmxhc2hfZGF0YSAqcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JCWlmIChpbmZvLT5ucl9wYXJ0cykKLQkJCWtmcmVlKGluZm8tPnBhcnRzKTsKIAkJbXRkX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPm10ZCk7CiAJCW1hcF9kZXN0cm95KGluZm8tPm10ZCk7CiAJfQpAQCAtNTAsNyArNDYsNiBAQAogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqcm9tX3Byb2JlX3R5cGVzW10gPSB7ICJjZmlfcHJvYmUiLCAiamVkZWNfcHJvYmUiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CiAKIHN0YXRpYyBpbnQgcmJ0eDQ5MzlfZmxhc2hfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewpAQCAtMTA3LDIyICsxMDIsMTEgQEAKIAlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAJaWYgKGVycikKIAkJZ290byBlcnJfb3V0OworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBOVUxMLCAwLAorCQkJcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLAotCQkJCSZpbmZvLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA+IDApIHsKLQkJbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIGluZm8tPnBhcnRzLCBlcnIpOwotCQlpbmZvLT5ucl9wYXJ0cyA9IGVycjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHBkYXRhLT5ucl9wYXJ0cykgewotCQlwcl9ub3RpY2UoIlVzaW5nIHJidHg0OTM5IHBhcnRpdGlvbiBpbmZvcm1hdGlvblxuIik7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBOVUxMLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3NhMTEwMC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zYTExMDAtZmxhc2guYwppbmRleCBhOWI1ZTBlLi5mYTljMGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NhMTEwMC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc2ExMTAwLWZsYXNoLmMKQEAgLTEzMSwxMCArMTMxLDggQEAKIH07CiAKIHN0cnVjdCBzYV9pbmZvIHsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CiAJc3RydWN0IG10ZF9pbmZvCQkqbXRkOwogCWludAkJCW51bV9zdWJkZXY7Ci0JdW5zaWduZWQgaW50CQlucl9wYXJ0czsKIAlzdHJ1Y3Qgc2Ffc3ViZGV2X2luZm8Jc3ViZGV2WzBdOwogfTsKIApAQCAtMjMxLDggKzIyOSw2IEBACiAJCQltdGRfY29uY2F0X2Rlc3Ryb3koaW5mby0+bXRkKTsKIAl9CiAKLQlrZnJlZShpbmZvLT5wYXJ0cyk7Ci0KIAlmb3IgKGkgPSBpbmZvLT5udW1fc3ViZGV2IC0gMTsgaSA+PSAwOyBpLS0pCiAJCXNhMTEwMF9kZXN0cm95X3N1YmRldigmaW5mby0+c3ViZGV2W2ldKTsKIAlrZnJlZShpbmZvKTsKQEAgLTM0MSwxMCArMzM3LDggQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNhMTEwMF9tdGRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSBOVUxMOwogCXN0cnVjdCBzYV9pbmZvICppbmZvOwotCWludCBlcnIsIG5yX3BhcnRzID0gMDsKKwlpbnQgZXJyOwogCiAJaWYgKCFwbGF0KQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM1OCwyNiArMzUyLDggQEAKIAkvKgogCSAqIFBhcnRpdGlvbiBzZWxlY3Rpb24gc3R1ZmYuCiAJICovCi0JbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVzLCAmcGFydHMsIDApOwotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJaW5mby0+cGFydHMgPSBwYXJ0czsKLQkJcGFydF90eXBlID0gImR5bmFtaWMiOwotCX0gZWxzZSB7Ci0JCXBhcnRzID0gcGxhdC0+cGFydHM7Ci0JCW5yX3BhcnRzID0gcGxhdC0+bnJfcGFydHM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KLQotCWlmIChucl9wYXJ0cyA9PSAwKQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNBMTEwMCBmbGFzaDogbm8gcGFydGl0aW9uIGluZm8gIgotCQkJImF2YWlsYWJsZSwgcmVnaXN0ZXJpbmcgd2hvbGUgZmxhc2hcbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJTQTExMDAgZmxhc2g6IHVzaW5nICVzIHBhcnRpdGlvbiAiCi0JCQkiZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQotCW10ZF9kZXZpY2VfcmVnaXN0ZXIoaW5mby0+bXRkLCBwYXJ0cywgbnJfcGFydHMpOwotCi0JaW5mby0+bnJfcGFydHMgPSBucl9wYXJ0czsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcGFydF9wcm9iZXMsIDAsCisJCQlwbGF0LT5wYXJ0cywgcGxhdC0+bnJfcGFydHMpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc29sdXRpb25lbmdpbmUuYyBiL2RyaXZlcnMvbXRkL21hcHMvc29sdXRpb25lbmdpbmUuYwppbmRleCBjYmY2YmFkLi40OTZjNDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NvbHV0aW9uZW5naW5lLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zb2x1dGlvbmVuZ2luZS5jCkBAIC0xOSw4ICsxOSw2IEBACiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpmbGFzaF9tdGQ7CiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICplcHJvbV9tdGQ7CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFyc2VkX3BhcnRzOwotCiBzdHJ1Y3QgbWFwX2luZm8gc29sZW5nX2Vwcm9tX21hcCA9IHsKIAkubmFtZSA9ICJTb2x1dGlvbiBFbmdpbmUgRVBST00iLAogCS5zaXplID0gMHg0MDAwMDAsCkBAIC01MSwxMiArNDksMTQgQEAKIAkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAogCX0KIH07CisjZGVmaW5lIE5VTV9QQVJUSVRJT05TIEFSUkFZX1NJWkUoc3VwZXJoX3NlX3BhcnRpdGlvbnMpCisjZWxzZQorI2RlZmluZSBzdXBlcmhfc2VfcGFydGl0aW9ucyBOVUxMCisjZGVmaW5lIE5VTV9QQVJUSVRJT05TIDAKICNlbmRpZiAvKiBDT05GSUdfTVREX1NVUEVSSF9SRVNFUlZFICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc29sZW5nX21hcHModm9pZCkKIHsKLQlpbnQgbnJfcGFydHMgPSAwOwotCiAJLyogRmlyc3QgcHJvYmUgYXQgb2Zmc2V0IDAgKi8KIAlzb2xlbmdfZmxhc2hfbWFwLnBoeXMgPSAwOwogCXNvbGVuZ19mbGFzaF9tYXAudmlydCA9ICh2b2lkIF9faW9tZW0gKilQMlNFR0FERFIoMCk7CkBAIC05MiwyMSArOTIsOCBAQAogCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGVwcm9tX210ZCwgTlVMTCwgMCk7CiAJfQogCi0JbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhmbGFzaF9tdGQsIHByb2JlcywgJnBhcnNlZF9wYXJ0cywgMCk7Ci0KLSNpZmRlZiBDT05GSUdfTVREX1NVUEVSSF9SRVNFUlZFCi0JaWYgKG5yX3BhcnRzIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyBjb25maWd1cmVkIHBhcnRpdGlvbiBhdCAweCUwOHguXG4iLAotCQkgICAgICAgQ09ORklHX01URF9TVVBFUkhfUkVTRVJWRSk7Ci0JCXBhcnNlZF9wYXJ0cyA9IHN1cGVyaF9zZV9wYXJ0aXRpb25zOwotCQlucl9wYXJ0cyA9IHNpemVvZihzdXBlcmhfc2VfcGFydGl0aW9ucykvc2l6ZW9mKCpwYXJzZWRfcGFydHMpOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfTVREX1NVUEVSSF9SRVNFUlZFICovCi0KLQlpZiAobnJfcGFydHMgPiAwKQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGZsYXNoX210ZCwgcGFyc2VkX3BhcnRzLCBucl9wYXJ0cyk7Ci0JZWxzZQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGZsYXNoX210ZCwgTlVMTCwgMCk7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihmbGFzaF9tdGQsIHByb2JlcywgMCwKKwkJCXN1cGVyaF9zZV9wYXJ0aXRpb25zLCBOVU1fUEFSVElUSU9OUyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExOCwxMCArMTA1LDcgQEAKIAkJbWFwX2Rlc3Ryb3koZXByb21fbXRkKTsKIAl9CiAKLQlpZiAocGFyc2VkX3BhcnRzKQotCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoZmxhc2hfbXRkKTsKLQllbHNlCi0JCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihmbGFzaF9tdGQpOworCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihmbGFzaF9tdGQpOwogCW1hcF9kZXN0cm95KGZsYXNoX210ZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvd3Jfc2JjODJ4eF9mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy93cl9zYmM4Mnh4X2ZsYXNoLmMKaW5kZXggOTAxY2U5Ni4uYWE3ZTBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy93cl9zYmM4Mnh4X2ZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy93cl9zYmM4Mnh4X2ZsYXNoLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vaW1tYXBfY3BtMi5oPgogCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpzYmNtdGRbM107Ci1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnNiY210ZF9wYXJ0c1szXTsKIAogc3RydWN0IG1hcF9pbmZvIHNiYzgyeHhfZmxhc2hfbWFwWzNdID0gewogCXsubmFtZSA9ICJCb290IGZsYXNoIn0sCkBAIC0xMDEsNiArMTAwLDcgQEAKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKIAkJaW50OF90IGZsYXNoY3NbM10gPSB7IDAsIDYsIDEgfTsKIAkJaW50IG5yX3BhcnRzOworCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqZGVmcGFydHM7CiAKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJQb3dlclFVSUNDIElJICVzICglbGQgTWlCIG9uIENTJWQiLAogCQkgICAgICAgc2JjODJ4eF9mbGFzaF9tYXBbaV0ubmFtZSwKQEAgLTExMyw3ICsxMTMsOCBAQAogCQl9CiAJCXByaW50aygiIGF0ICUwOGx4KVxuIiwgIHNiYzgyeHhfZmxhc2hfbWFwW2ldLnBoeXMpOwogCi0JCXNiYzgyeHhfZmxhc2hfbWFwW2ldLnZpcnQgPSBpb3JlbWFwKHNiYzgyeHhfZmxhc2hfbWFwW2ldLnBoeXMsIHNiYzgyeHhfZmxhc2hfbWFwW2ldLnNpemUpOworCQlzYmM4Mnh4X2ZsYXNoX21hcFtpXS52aXJ0ID0gaW9yZW1hcChzYmM4Mnh4X2ZsYXNoX21hcFtpXS5waHlzLAorCQkJCQkJICAgIHNiYzgyeHhfZmxhc2hfbWFwW2ldLnNpemUpOwogCiAJCWlmICghc2JjODJ4eF9mbGFzaF9tYXBbaV0udmlydCkgewogCQkJcHJpbnRrKCJGYWlsZWQgdG8gaW9yZW1hcFxuIik7CkBAIC0xMjksMjQgKzEzMCwyMCBAQAogCiAJCXNiY210ZFtpXS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKHNiY210ZFtpXSwgcGFydF9wcm9iZXMsCi0JCQkJCQkmc2JjbXRkX3BhcnRzW2ldLCAwKTsKLQkJaWYgKG5yX3BhcnRzID4gMCkgewotCQkJbXRkX2RldmljZV9yZWdpc3RlcihzYmNtdGRbaV0sIHNiY210ZF9wYXJ0c1tpXSwKLQkJCQkJICAgIG5yX3BhcnRzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogTm8gcGFydGl0aW9uaW5nIGRldGVjdGVkLiBVc2UgZGVmYXVsdCAqLwogCQlpZiAoaSA9PSAyKSB7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHNiY210ZFtpXSwgTlVMTCwgMCk7CisJCQlkZWZwYXJ0cyA9IE5VTEw7CisJCQlucl9wYXJ0cyA9IDA7CiAJCX0gZWxzZSBpZiAoaSA9PSBiaWdmbGFzaCkgewotCQkJbXRkX2RldmljZV9yZWdpc3RlcihzYmNtdGRbaV0sIGJpZ2ZsYXNoX3BhcnRzLAotCQkJCQkgICAgQVJSQVlfU0laRShiaWdmbGFzaF9wYXJ0cykpOworCQkJZGVmcGFydHMgPSBiaWdmbGFzaF9wYXJ0czsKKwkJCW5yX3BhcnRzID0gQVJSQVlfU0laRShiaWdmbGFzaF9wYXJ0cyk7CiAJCX0gZWxzZSB7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKHNiY210ZFtpXSwgc21hbGxmbGFzaF9wYXJ0cywKLQkJCQkJICAgIEFSUkFZX1NJWkUoc21hbGxmbGFzaF9wYXJ0cykpOworCQkJZGVmcGFydHMgPSBzbWFsbGZsYXNoX3BhcnRzOworCQkJbnJfcGFydHMgPSBBUlJBWV9TSVpFKHNtYWxsZmxhc2hfcGFydHMpOwogCQl9CisKKwkJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihzYmNtdGRbaV0sIHBhcnRfcHJvYmVzLCAwLAorCQkJCQkgIGRlZnBhcnRzLCBucl9wYXJ0cyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTU5LDEyICsxNTYsOCBAQAogCQlpZiAoIXNiY210ZFtpXSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChpPDIgfHwgc2JjbXRkX3BhcnRzW2ldKQotCQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKHNiY210ZFtpXSk7Ci0JCWVsc2UKLQkJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcihzYmNtdGRbaV0pOworCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoc2JjbXRkW2ldKTsKIAotCQlrZnJlZShzYmNtdGRfcGFydHNbaV0pOwogCQltYXBfZGVzdHJveShzYmNtdGRbaV0pOwogCiAJCWlvdW5tYXAoKHZvaWQgKilzYmM4Mnh4X2ZsYXNoX21hcFtpXS52aXJ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCmluZGV4IGNhMzg1NjkuLmVkOGI1ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwpAQCAtNDI2LDYgKzQyNiw4IEBACiAJbmV3LT5ycS0+cXVldWVkYXRhID0gbmV3OwogCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUobmV3LT5ycSwgdHItPmJsa3NpemUpOwogCisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIG5ldy0+cnEpOworCiAJaWYgKHRyLT5kaXNjYXJkKSB7CiAJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgbmV3LT5ycSk7CiAJCW5ldy0+cnEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzID0gVUlOVF9NQVg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRibG9jay5jIGIvZHJpdmVycy9tdGQvbXRkYmxvY2suYwppbmRleCAzMzI2NjE1Li43YzFkYzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRibG9jay5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGJsb2NrLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAllbnVtIHsgU1RBVEVfRU1QVFksIFNUQVRFX0NMRUFOLCBTVEFURV9ESVJUWSB9IGNhY2hlX3N0YXRlOwogfTsKIAotc3RhdGljIHN0cnVjdCBtdXRleCBtdGRibGtzX2xvY2s7CitzdGF0aWMgREVGSU5FX01VVEVYKG10ZGJsa3NfbG9jayk7CiAKIC8qCiAgKiBDYWNoZSBzdHVmZi4uLgpAQCAtMTE5LDcgKzExOSw3IEBACiAJaWYgKG10ZGJsay0+Y2FjaGVfc3RhdGUgIT0gU1RBVEVfRElSVFkpCiAJCXJldHVybiAwOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIm10ZGJsb2NrOiB3cml0aW5nIGNhY2hlZCBkYXRhIGZvciBcIiVzXCIgIgorCXByX2RlYnVnKCJtdGRibG9jazogd3JpdGluZyBjYWNoZWQgZGF0YSBmb3IgXCIlc1wiICIKIAkJCSJhdCAweCVseCwgc2l6ZSAweCV4XG4iLCBtdGQtPm5hbWUsCiAJCQltdGRibGstPmNhY2hlX29mZnNldCwgbXRkYmxrLT5jYWNoZV9zaXplKTsKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAJc2l6ZV90IHJldGxlbjsKIAlpbnQgcmV0OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIm10ZGJsb2NrOiB3cml0ZSBvbiBcIiVzXCIgYXQgMHglbHgsIHNpemUgMHgleFxuIiwKKwlwcl9kZWJ1ZygibXRkYmxvY2s6IHdyaXRlIG9uIFwiJXNcIiBhdCAweCVseCwgc2l6ZSAweCV4XG4iLAogCQltdGQtPm5hbWUsIHBvcywgbGVuKTsKIAogCWlmICghc2VjdF9zaXplKQpAQCAtMjE4LDcgKzIxOCw3IEBACiAJc2l6ZV90IHJldGxlbjsKIAlpbnQgcmV0OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIm10ZGJsb2NrOiByZWFkIG9uIFwiJXNcIiBhdCAweCVseCwgc2l6ZSAweCV4XG4iLAorCXByX2RlYnVnKCJtdGRibG9jazogcmVhZCBvbiBcIiVzXCIgYXQgMHglbHgsIHNpemUgMHgleFxuIiwKIAkJCW10ZC0+bmFtZSwgcG9zLCBsZW4pOwogCiAJaWYgKCFzZWN0X3NpemUpCkBAIC0yODMsNyArMjgzLDcgQEAKIHsKIAlzdHJ1Y3QgbXRkYmxrX2RldiAqbXRkYmxrID0gY29udGFpbmVyX29mKG1iZCwgc3RydWN0IG10ZGJsa19kZXYsIG1iZCk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCJtdGRibG9ja19vcGVuXG4iKTsKKwlwcl9kZWJ1ZygibXRkYmxvY2tfb3BlblxuIik7CiAKIAltdXRleF9sb2NrKCZtdGRibGtzX2xvY2spOwogCWlmIChtdGRibGstPmNvdW50KSB7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAogCW11dGV4X3VubG9jaygmbXRkYmxrc19sb2NrKTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJva1xuIik7CisJcHJfZGVidWcoIm9rXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzEyLDcgKzMxMiw3IEBACiB7CiAJc3RydWN0IG10ZGJsa19kZXYgKm10ZGJsayA9IGNvbnRhaW5lcl9vZihtYmQsIHN0cnVjdCBtdGRibGtfZGV2LCBtYmQpOwogCi0gICAJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIm10ZGJsb2NrX3JlbGVhc2VcbiIpOworCXByX2RlYnVnKCJtdGRibG9ja19yZWxlYXNlXG4iKTsKIAogCW11dGV4X2xvY2soJm10ZGJsa3NfbG9jayk7CiAKQEAgLTMyOSw3ICszMjksNyBAQAogCiAJbXV0ZXhfdW5sb2NrKCZtdGRibGtzX2xvY2spOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIm9rXG4iKTsKKwlwcl9kZWJ1Zygib2tcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODksOCArMzg5LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9tdGRibG9jayh2b2lkKQogewotCW11dGV4X2luaXQoJm10ZGJsa3NfbG9jayk7Ci0KIAlyZXR1cm4gcmVnaXN0ZXJfbXRkX2Jsa3RyYW5zKCZtdGRibG9ja190cik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGJsb2NrX3JvLmMgYi9kcml2ZXJzL210ZC9tdGRibG9ja19yby5jCmluZGV4IDc5NWE4YzAuLjA0NzBhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGJsb2NrX3JvLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkYmxvY2tfcm8uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL2Jsa3RyYW5zLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBpbnQgbXRkYmxvY2tfcmVhZHNlY3Qoc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldiwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2ssIGNoYXIgKmJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNoYXIuYyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwppbmRleCBmMWFmMjIyLi5lN2RjNzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY2hhci5jCkBAIC00Myw3ICs0Myw3IEBACiAKIC8qCiAgKiBEYXRhIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwb2ludGVyIHRvIHRoZSBtdGQgZGV2aWNlIGFzIHdlbGwKLSAqIGFzIG1vZGUgaW5mb3JtYXRpb24gb2ZyIHZhcmlvdXMgdXNlIGNhc2VzLgorICogYXMgbW9kZSBpbmZvcm1hdGlvbiBvZiB2YXJpb3VzIHVzZSBjYXNlcy4KICAqLwogc3RydWN0IG10ZF9maWxlX2luZm8gewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwpAQCAtODYsNyArODYsNyBAQAogCXN0cnVjdCBtdGRfZmlsZV9pbmZvICptZmk7CiAJc3RydWN0IGlub2RlICptdGRfaW5vOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIk1URF9vcGVuXG4iKTsKKwlwcl9kZWJ1ZygiTVREX29wZW5cbiIpOwogCiAJLyogWW91IGNhbid0IG9wZW4gdGhlIFJPIGRldmljZXMgUlcgKi8KIAlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAobWlub3IgJiAxKSkKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXN0cnVjdCBtdGRfZmlsZV9pbmZvICptZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBtZmktPm10ZDsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJNVERfY2xvc2VcbiIpOworCXByX2RlYnVnKCJNVERfY2xvc2VcbiIpOwogCiAJLyogT25seSBzeW5jIGlmIG9wZW5lZCBSVyAqLwogCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIG10ZC0+c3luYykKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXNpemVfdCBzaXplID0gY291bnQ7CiAJY2hhciAqa2J1ZjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDAsIk1URF9yZWFkXG4iKTsKKwlwcl9kZWJ1ZygiTVREX3JlYWRcbiIpOwogCiAJaWYgKCpwcG9zICsgY291bnQgPiBtdGQtPnNpemUpCiAJCWNvdW50ID0gbXRkLT5zaXplIC0gKnBwb3M7CkBAIC0yMTEsMTcgKzIxMSwxNyBAQAogCQlsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBzaXplKTsKIAogCQlzd2l0Y2ggKG1maS0+bW9kZSkgewotCQljYXNlIE1URF9NT0RFX09UUF9GQUNUT1JZOgorCQljYXNlIE1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlk6CiAJCQlyZXQgPSBtdGQtPnJlYWRfZmFjdF9wcm90X3JlZyhtdGQsICpwcG9zLCBsZW4sICZyZXRsZW4sIGtidWYpOwogCQkJYnJlYWs7Ci0JCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfVVNFUjoKIAkJCXJldCA9IG10ZC0+cmVhZF91c2VyX3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CiAJCQlicmVhazsKLQkJY2FzZSBNVERfTU9ERV9SQVc6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9SQVc6CiAJCXsKIAkJCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAKLQkJCW9wcy5tb2RlID0gTVREX09PQl9SQVc7CisJCQlvcHMubW9kZSA9IE1URF9PUFNfUkFXOwogCQkJb3BzLmRhdGJ1ZiA9IGtidWY7CiAJCQlvcHMub29iYnVmID0gTlVMTDsKIAkJCW9wcy5sZW4gPSBsZW47CkBAIC0yMzMsMTYgKzIzMywxNiBAQAogCQlkZWZhdWx0OgogCQkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CiAJCX0KLQkJLyogTmFuZCByZXR1cm5zIC1FQkFETVNHIG9uIGVjYyBlcnJvcnMsIGJ1dCBpdCByZXR1cm5zCisJCS8qIE5hbmQgcmV0dXJucyAtRUJBRE1TRyBvbiBFQ0MgZXJyb3JzLCBidXQgaXQgcmV0dXJucwogCQkgKiB0aGUgZGF0YS4gRm9yIG91ciB1c2Vyc3BhY2UgdG9vbHMgaXQgaXMgaW1wb3J0YW50Ci0JCSAqIHRvIGR1bXAgYXJlYXMgd2l0aCBlY2MgZXJyb3JzICEKKwkJICogdG8gZHVtcCBhcmVhcyB3aXRoIEVDQyBlcnJvcnMhCiAJCSAqIEZvciBrZXJuZWwgaW50ZXJuYWwgdXNhZ2UgaXQgYWxzbyBtaWdodCByZXR1cm4gLUVVQ0xFQU4KIAkJICogdG8gc2lnbmFsIHRoZSBjYWxsZXIgdGhhdCBhIGJpdGZsaXAgaGFzIG9jY3VycmVkIGFuZCBoYXMKIAkJICogYmVlbiBjb3JyZWN0ZWQgYnkgdGhlIEVDQyBhbGdvcml0aG0uCiAJCSAqIFVzZXJzcGFjZSBzb2Z0d2FyZSB3aGljaCBhY2Nlc3NlcyBOQU5EIHRoaXMgd2F5CiAJCSAqIG11c3QgYmUgYXdhcmUgb2YgdGhlIGZhY3QgdGhhdCBpdCBkZWFscyB3aXRoIE5BTkQKIAkJICovCi0JCWlmICghcmV0IHx8IChyZXQgPT0gLUVVQ0xFQU4pIHx8IChyZXQgPT0gLUVCQURNU0cpKSB7CisJCWlmICghcmV0IHx8IG10ZF9pc19iaXRmbGlwX29yX2VjY2VycihyZXQpKSB7CiAJCQkqcHBvcyArPSByZXRsZW47CiAJCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2J1ZiwgcmV0bGVuKSkgewogCQkJCWtmcmVlKGtidWYpOwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJaW50IHJldD0wOwogCWludCBsZW47CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCJNVERfd3JpdGVcbiIpOworCXByX2RlYnVnKCJNVERfd3JpdGVcbiIpOwogCiAJaWYgKCpwcG9zID09IG10ZC0+c2l6ZSkKIAkJcmV0dXJuIC1FTk9TUEM7CkBAIC0zMDIsMTAgKzMwMiwxMCBAQAogCQl9CiAKIAkJc3dpdGNoIChtZmktPm1vZGUpIHsKLQkJY2FzZSBNVERfTU9ERV9PVFBfRkFDVE9SWToKKwkJY2FzZSBNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZOgogCQkJcmV0ID0gLUVST0ZTOwogCQkJYnJlYWs7Ci0JCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfVVNFUjoKIAkJCWlmICghbXRkLT53cml0ZV91c2VyX3Byb3RfcmVnKSB7CiAJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCQkJYnJlYWs7CkBAIC0zMTMsMTMgKzMxMywxNCBAQAogCQkJcmV0ID0gbXRkLT53cml0ZV91c2VyX3Byb3RfcmVnKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CiAJCQlicmVhazsKIAotCQljYXNlIE1URF9NT0RFX1JBVzoKKwkJY2FzZSBNVERfRklMRV9NT0RFX1JBVzoKIAkJewogCQkJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAotCQkJb3BzLm1vZGUgPSBNVERfT09CX1JBVzsKKwkJCW9wcy5tb2RlID0gTVREX09QU19SQVc7CiAJCQlvcHMuZGF0YnVmID0ga2J1ZjsKIAkJCW9wcy5vb2JidWYgPSBOVUxMOworCQkJb3BzLm9vYm9mZnMgPSAwOwogCQkJb3BzLmxlbiA9IGxlbjsKIAogCQkJcmV0ID0gbXRkLT53cml0ZV9vb2IobXRkLCAqcHBvcywgJm9wcyk7CkBAIC0zNjcsMTMgKzM2OCwxMyBAQAogCQlpZiAoIW10ZC0+cmVhZF9mYWN0X3Byb3RfcmVnKQogCQkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWVsc2UKLQkJCW1maS0+bW9kZSA9IE1URF9NT0RFX09UUF9GQUNUT1JZOworCQkJbWZpLT5tb2RlID0gTVREX0ZJTEVfTU9ERV9PVFBfRkFDVE9SWTsKIAkJYnJlYWs7CiAJY2FzZSBNVERfT1RQX1VTRVI6CiAJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCiAJCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJZWxzZQotCQkJbWZpLT5tb2RlID0gTVREX01PREVfT1RQX1VTRVI7CisJCQltZmktPm1vZGUgPSBNVERfRklMRV9NT0RFX09UUF9VU0VSOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzkwLDYgKzM5MSw3IEBACiAJdWludDY0X3Qgc3RhcnQsIHVpbnQzMl90IGxlbmd0aCwgdm9pZCBfX3VzZXIgKnB0ciwKIAl1aW50MzJfdCBfX3VzZXIgKnJldHApCiB7CisJc3RydWN0IG10ZF9maWxlX2luZm8gKm1maSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCXVpbnQzMl90IHJldGxlbjsKIAlpbnQgcmV0ID0gMDsKQEAgLTQwOSw5ICs0MTEsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAogCW9wcy5vb2JsZW4gPSBsZW5ndGg7Ci0Jb3BzLm9vYm9mZnMgPSBzdGFydCAmIChtdGQtPm9vYnNpemUgLSAxKTsKKwlvcHMub29ib2ZmcyA9IHN0YXJ0ICYgKG10ZC0+d3JpdGVzaXplIC0gMSk7CiAJb3BzLmRhdGJ1ZiA9IE5VTEw7Ci0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gKG1maS0+bW9kZSA9PSBNVERfRklMRV9NT0RFX1JBVykgPyBNVERfT1BTX1JBVyA6CisJCU1URF9PUFNfUExBQ0VfT09COwogCiAJaWYgKG9wcy5vb2JvZmZzICYmIG9wcy5vb2JsZW4gPiAobXRkLT5vb2JzaXplIC0gb3BzLm9vYm9mZnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyMCw3ICs0MjMsNyBAQAogCWlmIChJU19FUlIob3BzLm9vYmJ1ZikpCiAJCXJldHVybiBQVFJfRVJSKG9wcy5vb2JidWYpOwogCi0Jc3RhcnQgJj0gfigodWludDY0X3QpbXRkLT5vb2JzaXplIC0gMSk7CisJc3RhcnQgJj0gfigodWludDY0X3QpbXRkLT53cml0ZXNpemUgLSAxKTsKIAlyZXQgPSBtdGQtPndyaXRlX29vYihtdGQsIHN0YXJ0LCAmb3BzKTsKIAogCWlmIChvcHMub29icmV0bGVuID4gMHhGRkZGRkZGRlUpCkBAIC00MzMsOSArNDM2LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdGRfZG9fcmVhZG9vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDY0X3Qgc3RhcnQsCi0JdWludDMyX3QgbGVuZ3RoLCB2b2lkIF9fdXNlciAqcHRyLCB1aW50MzJfdCBfX3VzZXIgKnJldHApCitzdGF0aWMgaW50IG10ZF9kb19yZWFkb29iKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwl1aW50NjRfdCBzdGFydCwgdWludDMyX3QgbGVuZ3RoLCB2b2lkIF9fdXNlciAqcHRyLAorCXVpbnQzMl90IF9fdXNlciAqcmV0cCkKIHsKKwlzdHJ1Y3QgbXRkX2ZpbGVfaW5mbyAqbWZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQ1MSw5ICs0NTYsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAogCW9wcy5vb2JsZW4gPSBsZW5ndGg7Ci0Jb3BzLm9vYm9mZnMgPSBzdGFydCAmIChtdGQtPm9vYnNpemUgLSAxKTsKKwlvcHMub29ib2ZmcyA9IHN0YXJ0ICYgKG10ZC0+d3JpdGVzaXplIC0gMSk7CiAJb3BzLmRhdGJ1ZiA9IE5VTEw7Ci0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gKG1maS0+bW9kZSA9PSBNVERfRklMRV9NT0RFX1JBVykgPyBNVERfT1BTX1JBVyA6CisJCU1URF9PUFNfUExBQ0VfT09COwogCiAJaWYgKG9wcy5vb2JvZmZzICYmIG9wcy5vb2JsZW4gPiAobXRkLT5vb2JzaXplIC0gb3BzLm9vYm9mZnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2Miw3ICs0NjgsNyBAQAogCWlmICghb3BzLm9vYmJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzdGFydCAmPSB+KCh1aW50NjRfdCltdGQtPm9vYnNpemUgLSAxKTsKKwlzdGFydCAmPSB+KCh1aW50NjRfdCltdGQtPndyaXRlc2l6ZSAtIDEpOwogCXJldCA9IG10ZC0+cmVhZF9vb2IobXRkLCBzdGFydCwgJm9wcyk7CiAKIAlpZiAocHV0X3VzZXIob3BzLm9vYnJldGxlbiwgcmV0cCkpCkBAIC00NzIsMTMgKzQ3OCwyOSBAQAogCQlyZXQgPSAtRUZBVUxUOwogCiAJa2ZyZWUob3BzLm9vYmJ1Zik7CisKKwkvKgorCSAqIE5BTkQgcmV0dXJucyAtRUJBRE1TRyBvbiBFQ0MgZXJyb3JzLCBidXQgaXQgcmV0dXJucyB0aGUgT09CCisJICogZGF0YS4gRm9yIG91ciB1c2Vyc3BhY2UgdG9vbHMgaXQgaXMgaW1wb3J0YW50IHRvIGR1bXAgYXJlYXMKKwkgKiB3aXRoIEVDQyBlcnJvcnMhCisJICogRm9yIGtlcm5lbCBpbnRlcm5hbCB1c2FnZSBpdCBhbHNvIG1pZ2h0IHJldHVybiAtRVVDTEVBTgorCSAqIHRvIHNpZ25hbCB0aGUgY2FsbGVyIHRoYXQgYSBiaXRmbGlwIGhhcyBvY2N1cmVkIGFuZCBoYXMKKwkgKiBiZWVuIGNvcnJlY3RlZCBieSB0aGUgRUNDIGFsZ29yaXRobS4KKwkgKgorCSAqIE5vdGU6IGN1cnJlbnRseSB0aGUgc3RhbmRhcmQgTkFORCBmdW5jdGlvbiwgbmFuZF9yZWFkX29vYl9zdGQsCisJICogZG9lcyBub3QgY2FsY3VsYXRlIEVDQyBmb3IgdGhlIE9PQiBhcmVhLCBzbyBkbyBub3QgcmVseSBvbgorCSAqIHRoaXMgYmVoYXZpb3IgdW5sZXNzIHlvdSBoYXZlIHJlcGxhY2VkIGl0IHdpdGggeW91ciBvd24uCisJICovCisJaWYgKG10ZF9pc19iaXRmbGlwX29yX2VjY2VycihyZXQpKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiByZXQ7CiB9CiAKIC8qCiAgKiBDb3BpZXMgKGFuZCB0cnVuY2F0ZXMsIGlmIG5lY2Vzc2FyeSkgZGF0YSBmcm9tIHRoZSBsYXJnZXIgc3RydWN0LAogICogbmFuZF9lY2NsYXlvdXQsIHRvIHRoZSBzbWFsbGVyLCBkZXByZWNhdGVkIGxheW91dCBzdHJ1Y3QsCi0gKiBuYW5kX2VjY2xheW91dF91c2VyLiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIHN1cHBwb3J0IHRoZSBkZXByZWNhdGVkCisgKiBuYW5kX2VjY2xheW91dF91c2VyLiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IHRvIHN1cHBvcnQgdGhlIGRlcHJlY2F0ZWQKICAqIEFQSSBpb2N0bCBFQ0NHRVRMQVlPVVQgd2hpbGUgYWxsb3dpbmcgYWxsIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHVzZQogICogbmFuZF9lY2NsYXlvdXQgZmxleGlibHkgKGkuZS4gdGhlIHN0cnVjdCBtYXkgY2hhbmdlIHNpemUgaW4gbmV3CiAgKiByZWxlYXNlcyB3aXRob3V0IHJlcXVpcmluZyBtYWpvciByZXdyaXRlcykuCkBAIC01NDQsNiArNTY2LDU1IEBACiAJfQogfQogCitzdGF0aWMgaW50IG10ZF93cml0ZV9pb2N0bChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJc3RydWN0IG10ZF93cml0ZV9yZXEgX191c2VyICphcmdwKQoreworCXN0cnVjdCBtdGRfd3JpdGVfcmVxIHJlcTsKKwlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCXZvaWQgX191c2VyICp1c3JfZGF0YSwgKnVzcl9vb2I7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmdwLCBzaXplb2YocmVxKSkgfHwKKwkJCSFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJlcS51c3JfZGF0YSwgcmVxLmxlbikgfHwKKwkJCSFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJlcS51c3Jfb29iLCByZXEub29ibGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFtdGQtPndyaXRlX29vYikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJb3BzLm1vZGUgPSByZXEubW9kZTsKKwlvcHMubGVuID0gKHNpemVfdClyZXEubGVuOworCW9wcy5vb2JsZW4gPSAoc2l6ZV90KXJlcS5vb2JsZW47CisJb3BzLm9vYm9mZnMgPSAwOworCisJdXNyX2RhdGEgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KXJlcS51c3JfZGF0YTsKKwl1c3Jfb29iID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdClyZXEudXNyX29vYjsKKworCWlmIChyZXEudXNyX2RhdGEpIHsKKwkJb3BzLmRhdGJ1ZiA9IG1lbWR1cF91c2VyKHVzcl9kYXRhLCBvcHMubGVuKTsKKwkJaWYgKElTX0VSUihvcHMuZGF0YnVmKSkKKwkJCXJldHVybiBQVFJfRVJSKG9wcy5kYXRidWYpOworCX0gZWxzZSB7CisJCW9wcy5kYXRidWYgPSBOVUxMOworCX0KKworCWlmIChyZXEudXNyX29vYikgeworCQlvcHMub29iYnVmID0gbWVtZHVwX3VzZXIodXNyX29vYiwgb3BzLm9vYmxlbik7CisJCWlmIChJU19FUlIob3BzLm9vYmJ1ZikpIHsKKwkJCWtmcmVlKG9wcy5kYXRidWYpOworCQkJcmV0dXJuIFBUUl9FUlIob3BzLm9vYmJ1Zik7CisJCX0KKwl9IGVsc2UgeworCQlvcHMub29iYnVmID0gTlVMTDsKKwl9CisKKwlyZXQgPSBtdGQtPndyaXRlX29vYihtdGQsIChsb2ZmX3QpcmVxLnN0YXJ0LCAmb3BzKTsKKworCWtmcmVlKG9wcy5kYXRidWYpOworCWtmcmVlKG9wcy5vb2JidWYpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtdGRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKIAlzdHJ1Y3QgbXRkX2ZpbGVfaW5mbyAqbWZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtNTUzLDcgKzYyNCw3IEBACiAJdV9sb25nIHNpemU7CiAJc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJNVERfaW9jdGxcbiIpOworCXByX2RlYnVnKCJNVERfaW9jdGxcbiIpOwogCiAJc2l6ZSA9IChjbWQgJiBJT0NTSVpFX01BU0spID4+IElPQ1NJWkVfU0hJRlQ7CiAJaWYgKGNtZCAmIElPQ19JTikgewpAQCAtNjAxLDggKzY3Miw4IEBACiAJCWluZm8uZXJhc2VzaXplCT0gbXRkLT5lcmFzZXNpemU7CiAJCWluZm8ud3JpdGVzaXplCT0gbXRkLT53cml0ZXNpemU7CiAJCWluZm8ub29ic2l6ZQk9IG10ZC0+b29ic2l6ZTsKLQkJLyogVGhlIGJlbG93IGZpZWxkcyBhcmUgb2Jzb2xldGUgKi8KLQkJaW5mby5lY2N0eXBlCT0gLTE7CisJCS8qIFRoZSBiZWxvdyBmaWVsZCBpcyBvYnNvbGV0ZSAqLworCQlpbmZvLnBhZGRpbmcJPSAwOwogCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2Yoc3RydWN0IG10ZF9pbmZvX3VzZXIpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKQEAgLTY5OCw3ICs3NjksNyBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgYXJncCwgc2l6ZW9mKGJ1ZikpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJZWxzZQotCQkJcmV0ID0gbXRkX2RvX3JlYWRvb2IobXRkLCBidWYuc3RhcnQsIGJ1Zi5sZW5ndGgsCisJCQlyZXQgPSBtdGRfZG9fcmVhZG9vYihmaWxlLCBtdGQsIGJ1Zi5zdGFydCwgYnVmLmxlbmd0aCwKIAkJCQlidWYucHRyLCAmYnVmX3VzZXItPnN0YXJ0KTsKIAkJYnJlYWs7CiAJfQpAQCAtNzI1LDEyICs3OTYsMTkgQEAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIGFyZ3AsIHNpemVvZihidWYpKSkKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCWVsc2UKLQkJCXJldCA9IG10ZF9kb19yZWFkb29iKG10ZCwgYnVmLnN0YXJ0LCBidWYubGVuZ3RoLAorCQkJcmV0ID0gbXRkX2RvX3JlYWRvb2IoZmlsZSwgbXRkLCBidWYuc3RhcnQsIGJ1Zi5sZW5ndGgsCiAJCQkJKHZvaWQgX191c2VyICopKHVpbnRwdHJfdClidWYudXNyX3B0ciwKIAkJCQkmYnVmX3VzZXItPmxlbmd0aCk7CiAJCWJyZWFrOwogCX0KIAorCWNhc2UgTUVNV1JJVEU6CisJeworCQlyZXQgPSBtdGRfd3JpdGVfaW9jdGwobXRkLAorCQkgICAgICAoc3RydWN0IG10ZF93cml0ZV9yZXEgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CisJfQorCiAJY2FzZSBNRU1MT0NLOgogCXsKIAkJc3RydWN0IGVyYXNlX2luZm9fdXNlciBlaW5mbzsKQEAgLTgyNyw3ICs5MDUsNyBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIGFyZ3AsIHNpemVvZihpbnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCW1maS0+bW9kZSA9IE1URF9NT0RFX05PUk1BTDsKKwkJbWZpLT5tb2RlID0gTVREX0ZJTEVfTU9ERV9OT1JNQUw7CiAKIAkJcmV0ID0gb3RwX3NlbGVjdF9maWxlbW9kZShtZmksIG1vZGUpOwogCkBAIC04NDMsMTEgKzkyMSwxMSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlzd2l0Y2ggKG1maS0+bW9kZSkgewotCQljYXNlIE1URF9NT0RFX09UUF9GQUNUT1JZOgorCQljYXNlIE1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlk6CiAJCQlpZiAobXRkLT5nZXRfZmFjdF9wcm90X2luZm8pCiAJCQkJcmV0ID0gbXRkLT5nZXRfZmFjdF9wcm90X2luZm8obXRkLCBidWYsIDQwOTYpOwogCQkJYnJlYWs7Ci0JCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9PVFBfVVNFUjoKIAkJCWlmIChtdGQtPmdldF91c2VyX3Byb3RfaW5mbykKIAkJCQlyZXQgPSBtdGQtPmdldF91c2VyX3Byb3RfaW5mbyhtdGQsIGJ1ZiwgNDA5Nik7CiAJCQlicmVhazsKQEAgLTg3MSw3ICs5NDksNyBAQAogCXsKIAkJc3RydWN0IG90cF9pbmZvIG9pbmZvOwogCi0JCWlmIChtZmktPm1vZGUgIT0gTVREX01PREVfT1RQX1VTRVIpCisJCWlmIChtZmktPm1vZGUgIT0gTVREX0ZJTEVfTU9ERV9PVFBfVVNFUikKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoY29weV9mcm9tX3VzZXIoJm9pbmZvLCBhcmdwLCBzaXplb2Yob2luZm8pKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtODgyLDcgKzk2MCw3IEBACiAJfQogI2VuZGlmCiAKLQkvKiBUaGlzIGlvY3RsIGlzIGJlaW5nIGRlcHJlY2F0ZWQgLSBpdCB0cnVuY2F0ZXMgdGhlIGVjYyBsYXlvdXQgKi8KKwkvKiBUaGlzIGlvY3RsIGlzIGJlaW5nIGRlcHJlY2F0ZWQgLSBpdCB0cnVuY2F0ZXMgdGhlIEVDQyBsYXlvdXQgKi8KIAljYXNlIEVDQ0dFVExBWU9VVDoKIAl7CiAJCXN0cnVjdCBuYW5kX2VjY2xheW91dF91c2VyICp1c3JsYXk7CkBAIC05MTUsMTcgKzk5MywxNyBAQAogCQltZmktPm1vZGUgPSAwOwogCiAJCXN3aXRjaChhcmcpIHsKLQkJY2FzZSBNVERfTU9ERV9PVFBfRkFDVE9SWToKLQkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJY2FzZSBNVERfRklMRV9NT0RFX09UUF9GQUNUT1JZOgorCQljYXNlIE1URF9GSUxFX01PREVfT1RQX1VTRVI6CiAJCQlyZXQgPSBvdHBfc2VsZWN0X2ZpbGVtb2RlKG1maSwgYXJnKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgTVREX01PREVfUkFXOgorCQljYXNlIE1URF9GSUxFX01PREVfUkFXOgogCQkJaWYgKCFtdGQtPnJlYWRfb29iIHx8ICFtdGQtPndyaXRlX29vYikKIAkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCQltZmktPm1vZGUgPSBhcmc7CiAKLQkJY2FzZSBNVERfTU9ERV9OT1JNQUw6CisJCWNhc2UgTVREX0ZJTEVfTU9ERV9OT1JNQUw6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC0xMDExLDcgKzEwODksNyBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgYXJncCwgc2l6ZW9mKGJ1ZikpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJZWxzZQotCQkJcmV0ID0gbXRkX2RvX3JlYWRvb2IobXRkLCBidWYuc3RhcnQsCisJCQlyZXQgPSBtdGRfZG9fcmVhZG9vYihmaWxlLCBtdGQsIGJ1Zi5zdGFydCwKIAkJCQlidWYubGVuZ3RoLCBjb21wYXRfcHRyKGJ1Zi5wdHIpLAogCQkJCSZidWZfdXNlci0+c3RhcnQpOwogCQlicmVhazsKQEAgLTExNDQsNyArMTIyMiw3IEBACiAKIAlpZiAobXRkX2lubykgewogCQkvKiBEZXN0cm95IHRoZSBpbm9kZSBpZiBpdCBleGlzdHMgKi8KLQkJbXRkX2luby0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKG10ZF9pbm8pOwogCQlpcHV0KG10ZF9pbm8pOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKaW5kZXggZTYwMTY3Mi4uNmRmNGQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKQEAgLTk1LDEwICs5NSwxMCBAQAogCiAJCS8qIFNhdmUgaW5mb3JtYXRpb24gYWJvdXQgYml0ZmxpcHMhICovCiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlpZiAoZXJyID09IC1FQkFETVNHKSB7CisJCQlpZiAobXRkX2lzX2VjY2VycihlcnIpKSB7CiAJCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7CiAJCQkJcmV0ID0gZXJyOwotCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVVQ0xFQU4pIHsKKwkJCX0gZWxzZSBpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkgewogCQkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCsrOwogCQkJCS8qIERvIG5vdCBvdmVyd3JpdGUgLUVCQURNU0cgISEgKi8KIAkJCQlpZiAoIXJldCkKQEAgLTI3OSwxMCArMjc5LDEwIEBACiAKIAkJLyogU2F2ZSBpbmZvcm1hdGlvbiBhYm91dCBiaXRmbGlwcyEgKi8KIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCWlmIChlcnIgPT0gLUVCQURNU0cpIHsKKwkJCWlmIChtdGRfaXNfZWNjZXJyKGVycikpIHsKIAkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKIAkJCQlyZXQgPSBlcnI7Ci0JCQl9IGVsc2UgaWYgKGVyciA9PSAtRVVDTEVBTikgeworCQkJfSBlbHNlIGlmIChtdGRfaXNfYml0ZmxpcChlcnIpKSB7CiAJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkKys7CiAJCQkJLyogRG8gbm90IG92ZXJ3cml0ZSAtRUJBRE1TRyAhISAqLwogCQkJCWlmICghcmV0KQpAQCAtNzcwLDcgKzc3MCw3IEBACiAKIAkvKgogCSAqIFNldCB1cCB0aGUgbmV3ICJzdXBlciIgZGV2aWNlJ3MgTVREIG9iamVjdCBzdHJ1Y3R1cmUsIGNoZWNrIGZvcgotCSAqIGluY29tcGF0aWJpbGl0ZXMgYmV0d2VlbiB0aGUgc3ViZGV2aWNlcy4KKwkgKiBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIHRoZSBzdWJkZXZpY2VzLgogCSAqLwogCWNvbmNhdC0+bXRkLnR5cGUgPSBzdWJkZXZbMF0tPnR5cGU7CiAJY29uY2F0LT5tdGQuZmxhZ3MgPSBzdWJkZXZbMF0tPmZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY29yZS5jIGIvZHJpdmVycy9tdGQvbXRkY29yZS5jCmluZGV4IGM1MTBhZmYuLmIwMTk5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGNvcmUuYworKysgYi9kcml2ZXJzL210ZC9tdGRjb3JlLmMKQEAgLTM2Miw3ICszNjIsNyBAQAogCQkJICAgICAgTVREX0RFVlQoaSkgKyAxLAogCQkJICAgICAgTlVMTCwgIm10ZCVkcm8iLCBpKTsKIAotCURFQlVHKDAsICJtdGQ6IEdpdmluZyBvdXQgZGV2aWNlICVkIHRvICVzXG4iLCBpLCBtdGQtPm5hbWUpOworCXByX2RlYnVnKCJtdGQ6IEdpdmluZyBvdXQgZGV2aWNlICVkIHRvICVzXG4iLCBpLCBtdGQtPm5hbWUpOwogCS8qIE5vIG5lZWQgdG8gZ2V0IGEgcmVmY291bnQgb24gdGhlIG1vZHVsZSBjb250YWluaW5nCiAJICAgdGhlIG5vdGlmaWVyLCBzaW5jZSB3ZSBob2xkIHRoZSBtdGRfdGFibGVfbXV0ZXggKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdCwgJm10ZF9ub3RpZmllcnMsIGxpc3QpCkBAIC00MjksMjcgKzQyOSw2MyBAQAogfQogCiAvKioKLSAqIG10ZF9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBhbiBNVEQgZGV2aWNlLgorICogbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlciAtIHBhcnNlIHBhcnRpdGlvbnMgYW5kIHJlZ2lzdGVyIGFuIE1URCBkZXZpY2UuCiAgKgotICogQG1hc3RlcjogdGhlIE1URCBkZXZpY2UgdG8gcmVnaXN0ZXIKLSAqIEBwYXJ0czogdGhlIHBhcnRpdGlvbnMgdG8gcmVnaXN0ZXIgLSBvbmx5IHZhbGlkIGlmIG5yX3BhcnRzID4gMAotICogQG5yX3BhcnRzOiB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gcGFydHMuICBJZiB6ZXJvIHRoZW4gdGhlIGZ1bGwgTVRECi0gKiAgICAgICAgICAgIGRldmljZSBpcyByZWdpc3RlcmVkCisgKiBAbXRkOiB0aGUgTVREIGRldmljZSB0byByZWdpc3RlcgorICogQHR5cGVzOiB0aGUgbGlzdCBvZiBNVEQgcGFydGl0aW9uIHByb2JlcyB0byB0cnksIHNlZQorICogICAgICAgICAncGFyc2VfbXRkX3BhcnRpdGlvbnMoKScgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqIEBwYXJzZXJfZGF0YTogTVREIHBhcnRpdGlvbiBwYXJzZXItc3BlY2lmaWMgZGF0YQorICogQHBhcnRzOiBmYWxsYmFjayBwYXJ0aXRpb24gaW5mb3JtYXRpb24gdG8gcmVnaXN0ZXIsIGlmIHBhcnNpbmcgZmFpbHM7CisgKiAgICAgICAgIG9ubHkgdmFsaWQgaWYgJW5yX3BhcnRzID4gJTAKKyAqIEBucl9wYXJ0czogdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIGluIHBhcnRzLCBpZiB6ZXJvIHRoZW4gdGhlIGZ1bGwKKyAqICAgICAgICAgICAgTVREIGRldmljZSBpcyByZWdpc3RlcmVkIGlmIG5vIHBhcnRpdGlvbiBpbmZvIGlzIGZvdW5kCiAgKgotICogUmVnaXN0ZXIgYW4gTVREIGRldmljZSB3aXRoIHRoZSBzeXN0ZW0gYW5kIG9wdGlvbmFsbHksIGEgbnVtYmVyIG9mCi0gKiBwYXJ0aXRpb25zLiAgSWYgbnJfcGFydHMgaXMgMCB0aGVuIHRoZSB3aG9sZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCwgb3RoZXJ3aXNlCi0gKiBvbmx5IHRoZSBwYXJ0aXRpb25zIGFyZSByZWdpc3RlcmVkLiAgVG8gcmVnaXN0ZXIgYm90aCB0aGUgZnVsbCBkZXZpY2UgKmFuZCoKLSAqIHRoZSBwYXJ0aXRpb25zLCBjYWxsIG10ZF9kZXZpY2VfcmVnaXN0ZXIoKSB0d2ljZSwgb25jZSB3aXRoIG5yX3BhcnRzID09IDAKLSAqIGFuZCBvbmNlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucy4KKyAqIFRoaXMgZnVuY3Rpb24gYWdncmVnYXRlcyBNVEQgcGFydGl0aW9ucyBwYXJzaW5nIChkb25lIGJ5CisgKiAncGFyc2VfbXRkX3BhcnRpdGlvbnMoKScpIGFuZCBNVEQgZGV2aWNlIGFuZCBwYXJ0aXRpb25zIHJlZ2lzdGVyaW5nLiBJdAorICogYmFzaWNhbGx5IGZvbGxvd3MgdGhlIG1vc3QgY29tbW9uIHBhdHRlcm4gZm91bmQgaW4gbWFueSBNVEQgZHJpdmVyczoKKyAqCisgKiAqIEl0IGZpcnN0IHRyaWVzIHRvIHByb2JlIHBhcnRpdGlvbnMgb24gTVREIGRldmljZSBAbXRkIHVzaW5nIHBhcnNlcnMKKyAqICAgc3BlY2lmaWVkIGluIEB0eXBlcyAoaWYgQHR5cGVzIGlzICVOVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpc3Qgb2YgcGFyc2VycworICogICBpcyB1c2VkLCBzZWUgJ3BhcnNlX210ZF9wYXJ0aXRpb25zKCknIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gSWYgbm9uZSBhcmUKKyAqICAgZm91bmQgdGhpcyBmdW5jdGlvbnMgdHJpZXMgdG8gZmFsbGJhY2sgdG8gaW5mb3JtYXRpb24gc3BlY2lmaWVkIGluCisgKiAgIEBwYXJ0cy9AbnJfcGFydHMuCisgKiAqIElmIGFueSBwYXJ0aXRpb25pbmcgaW5mbyB3YXMgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSBmb3VuZAorICogICBwYXJ0aXRpb25zLgorICogKiBJZiBubyBwYXJ0aXRpb25zIHdlcmUgZm91bmQgdGhpcyBmdW5jdGlvbiBqdXN0IHJlZ2lzdGVycyB0aGUgTVREIGRldmljZQorICogICBAbXRkIGFuZCBleGl0cy4KKyAqCisgKiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCi1pbnQgbXRkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwKLQkJCWNvbnN0IHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0cywKLQkJCWludCBucl9wYXJ0cykKK2ludCBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBjaGFyICoqdHlwZXMsCisJCQkgICAgICBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKnBhcnNlcl9kYXRhLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLAorCQkJICAgICAgaW50IG5yX3BhcnRzKQogewotCXJldHVybiBwYXJ0cyA/IGFkZF9tdGRfcGFydGl0aW9ucyhtYXN0ZXIsIHBhcnRzLCBucl9wYXJ0cykgOgotCQlhZGRfbXRkX2RldmljZShtYXN0ZXIpOworCWludCBlcnI7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnJlYWxfcGFydHM7CisKKwllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHR5cGVzLCAmcmVhbF9wYXJ0cywgcGFyc2VyX2RhdGEpOworCWlmIChlcnIgPD0gMCAmJiBucl9wYXJ0cyAmJiBwYXJ0cykgeworCQlyZWFsX3BhcnRzID0ga21lbWR1cChwYXJ0cywgc2l6ZW9mKCpwYXJ0cykgKiBucl9wYXJ0cywKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXJlYWxfcGFydHMpCisJCQllcnIgPSAtRU5PTUVNOworCQllbHNlCisJCQllcnIgPSBucl9wYXJ0czsKKwl9CisKKwlpZiAoZXJyID4gMCkgeworCQllcnIgPSBhZGRfbXRkX3BhcnRpdGlvbnMobXRkLCByZWFsX3BhcnRzLCBlcnIpOworCQlrZnJlZShyZWFsX3BhcnRzKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAwKSB7CisJCWVyciA9IGFkZF9tdGRfZGV2aWNlKG10ZCk7CisJCWlmIChlcnIgPT0gMSkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCisJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG10ZF9kZXZpY2VfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwobXRkX2RldmljZV9wYXJzZV9yZWdpc3Rlcik7CiAKIC8qKgogICogbXRkX2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhbiBleGlzdGluZyBNVEQgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY29yZS5oIGIvZHJpdmVycy9tdGQvbXRkY29yZS5oCmluZGV4IDBlZDYxMjYuLjk2MWEzODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZGNvcmUuaAorKysgYi9kcml2ZXJzL210ZC9tdGRjb3JlLmgKQEAgLTE1LDYgKzE1LDkgQEAKIGV4dGVybiBpbnQgYWRkX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqLCBjb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqLAogCQkJICAgICAgaW50KTsKIGV4dGVybiBpbnQgZGVsX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqKTsKK2V4dGVybiBpbnQgcGFyc2VfbXRkX3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsIGNvbnN0IGNoYXIgKip0eXBlcywKKwkJCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpOwogCiAjZGVmaW5lIG10ZF9mb3JfZWFjaF9kZXZpY2UobXRkKQkJCVwKIAlmb3IgKChtdGQpID0gX19tdGRfbmV4dF9kZXZpY2UoMCk7CQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRvb3BzLmMgYi9kcml2ZXJzL210ZC9tdGRvb3BzLmMKaW5kZXggZTNlNDBmNC4uMWUyZmE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkb29wcy5jCisrKyBiL2RyaXZlcnMvbXRkL210ZG9vcHMuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCXJldCA9IG10ZC0+cmVhZChtdGQsIHBhZ2UgKiByZWNvcmRfc2l6ZSwgTVRET09QU19IRUFERVJfU0laRSwKIAkJCQkmcmV0bGVuLCAodV9jaGFyICopICZjb3VudFswXSk7CiAJCWlmIChyZXRsZW4gIT0gTVRET09QU19IRUFERVJfU0laRSB8fAotCQkJCShyZXQgPCAwICYmIHJldCAhPSAtRVVDTEVBTikpIHsKKwkJCQkocmV0IDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAibXRkb29wczogcmVhZCBmYWlsdXJlIGF0ICVsZCAoJXRkIG9mICVkIHJlYWQpLCBlcnIgJWRcbiIsCiAJCQkgICAgICAgcGFnZSAqIHJlY29yZF9zaXplLCByZXRsZW4sCiAJCQkgICAgICAgTVRET09QU19IRUFERVJfU0laRSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYyBiL2RyaXZlcnMvbXRkL210ZHBhcnQuYwppbmRleCA2MzBiZTNlLi5hMGJkMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCkBAIC03Myw5ICs3Myw5IEBACiAJcmVzID0gcGFydC0+bWFzdGVyLT5yZWFkKHBhcnQtPm1hc3RlciwgZnJvbSArIHBhcnQtPm9mZnNldCwKIAkJCQkgICBsZW4sIHJldGxlbiwgYnVmKTsKIAlpZiAodW5saWtlbHkocmVzKSkgewotCQlpZiAocmVzID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAocmVzKSkKIAkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSBwYXJ0LT5tYXN0ZXItPmVjY19zdGF0cy5jb3JyZWN0ZWQgLSBzdGF0cy5jb3JyZWN0ZWQ7Ci0JCWlmIChyZXMgPT0gLUVCQURNU0cpCisJCWlmIChtdGRfaXNfZWNjZXJyKHJlcykpCiAJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQgKz0gcGFydC0+bWFzdGVyLT5lY2Nfc3RhdHMuZmFpbGVkIC0gc3RhdHMuZmFpbGVkOwogCX0KIAlyZXR1cm4gcmVzOwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJaWYgKG9wcy0+b29iYnVmKSB7CiAJCXNpemVfdCBsZW4sIHBhZ2VzOwogCi0JCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCQlpZiAob3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCQlsZW4gPSBtdGQtPm9vYmF2YWlsOwogCQllbHNlCiAJCQlsZW4gPSBtdGQtPm9vYnNpemU7CkBAIC0xNDIsOSArMTQyLDkgQEAKIAogCXJlcyA9IHBhcnQtPm1hc3Rlci0+cmVhZF9vb2IocGFydC0+bWFzdGVyLCBmcm9tICsgcGFydC0+b2Zmc2V0LCBvcHMpOwogCWlmICh1bmxpa2VseShyZXMpKSB7Ci0JCWlmIChyZXMgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChyZXMpKQogCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkKys7Ci0JCWlmIChyZXMgPT0gLUVCQURNU0cpCisJCWlmIChtdGRfaXNfZWNjZXJyKHJlcykpCiAJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKIAl9CiAJcmV0dXJuIHJlczsKQEAgLTQ3OSw2ICs0NzksMTkgQEAKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWN1cl9vZmZzZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc2xhdmUtPm9mZnNldCk7CiAJCX0KIAl9CisJaWYgKHNsYXZlLT5vZmZzZXQgPT0gTVREUEFSVF9PRlNfUkVUQUlOKSB7CisJCXNsYXZlLT5vZmZzZXQgPSBjdXJfb2Zmc2V0OworCQlpZiAobWFzdGVyLT5zaXplIC0gc2xhdmUtPm9mZnNldCA+PSBzbGF2ZS0+bXRkLnNpemUpIHsKKwkJCXNsYXZlLT5tdGQuc2l6ZSA9IG1hc3Rlci0+c2l6ZSAtIHNsYXZlLT5vZmZzZXQKKwkJCQkJCQktIHNsYXZlLT5tdGQuc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibXRkIHBhcnRpdGlvbiBcIiVzXCIgZG9lc24ndCBoYXZlIGVub3VnaCBzcGFjZTogJSNsbHggPCAlI2xseCwgZGlzYWJsZWRcbiIsCisJCQkJcGFydC0+bmFtZSwgbWFzdGVyLT5zaXplIC0gc2xhdmUtPm9mZnNldCwKKwkJCQlzbGF2ZS0+bXRkLnNpemUpOworCQkJLyogcmVnaXN0ZXIgdG8gcHJlc2VydmUgb3JkZXJpbmcgKi8KKwkJCWdvdG8gb3V0X3JlZ2lzdGVyOworCQl9CisJfQogCWlmIChzbGF2ZS0+bXRkLnNpemUgPT0gTVREUEFSVF9TSVpfRlVMTCkKIAkJc2xhdmUtPm10ZC5zaXplID0gbWFzdGVyLT5zaXplIC0gc2xhdmUtPm9mZnNldDsKIApAQCAtNjkzLDYgKzcwNiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBwdXRfcGFydGl0aW9uX3BhcnNlcihwKSBkbyB7IG1vZHVsZV9wdXQoKHApLT5vd25lcik7IH0gd2hpbGUgKDApCisKIGludCByZWdpc3Rlcl9tdGRfcGFyc2VyKHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgKnApCiB7CiAJc3Bpbl9sb2NrKCZwYXJ0X3BhcnNlcl9sb2NrKTsKQEAgLTcxMiwxOSArNzI3LDUxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXJlZ2lzdGVyX210ZF9wYXJzZXIpOwogCisvKgorICogRG8gbm90IGZvcmdldCB0byB1cGRhdGUgJ3BhcnNlX210ZF9wYXJ0aXRpb25zKCknIGtlcm5lbGRvYyBjb21tZW50IGlmIHlvdQorICogYXJlIGNoYW5naW5nIHRoaXMgYXJyYXkhCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X210ZF9wYXJ0X3R5cGVzW10gPSB7CisJImNtZGxpbmVwYXJ0IiwKKwkib2ZwYXJ0IiwKKwlOVUxMCit9OworCisvKioKKyAqIHBhcnNlX210ZF9wYXJ0aXRpb25zIC0gcGFyc2UgTVREIHBhcnRpdGlvbnMKKyAqIEBtYXN0ZXI6IHRoZSBtYXN0ZXIgcGFydGl0aW9uIChkZXNjcmliZXMgd2hvbGUgTVREIGRldmljZSkKKyAqIEB0eXBlczogbmFtZXMgb2YgcGFydGl0aW9uIHBhcnNlcnMgdG8gdHJ5IG9yICVOVUxMCisgKiBAcHBhcnRzOiBhcnJheSBvZiBwYXJ0aXRpb25zIGZvdW5kIGlzIHJldHVybmVkIGhlcmUKKyAqIEBkYXRhOiBNVEQgcGFydGl0aW9uIHBhcnNlci1zcGVjaWZpYyBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaW5kIHBhcnRpdGlvbiBvbiBNVEQgZGV2aWNlIEBtYXN0ZXIuIEl0IHVzZXMgTVRECisgKiBwYXJ0aXRpb24gcGFyc2Vycywgc3BlY2lmaWVkIGluIEB0eXBlcy4gSG93ZXZlciwgaWYgQHR5cGVzIGlzICVOVUxMLCB0aGVuCisgKiB0aGUgZGVmYXVsdCBsaXN0IG9mIHBhcnNlcnMgaXMgdXNlZC4gVGhlIGRlZmF1bHQgbGlzdCBjb250YWlucyBvbmx5IHRoZQorICogImNtZGxpbmVwYXJ0IiBhbmQgIm9mcGFydCIgcGFyc2VycyBBVE0uCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuOgorICogbyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKiBvIHplcm8gaWYgbm8gcGFydGl0aW9ucyB3ZXJlIGZvdW5kCisgKiBvIGEgcG9zaXRpdmUgbnVtYmVyIG9mIGZvdW5kIHBhcnRpdGlvbnMsIGluIHdoaWNoIGNhc2Ugb24gZXhpdCBAcHBhcnRzIHdpbGwKKyAqICAgcG9pbnQgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGlzIG51bWJlciBvZiAmc3RydWN0IG10ZF9pbmZvIG9iamVjdHMuCisgKi8KIGludCBwYXJzZV9tdGRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwgY29uc3QgY2hhciAqKnR5cGVzLAotCQkJIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzLCB1bnNpZ25lZCBsb25nIG9yaWdpbikKKwkJCSBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCSBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IG10ZF9wYXJ0X3BhcnNlciAqcGFyc2VyOwogCWludCByZXQgPSAwOwogCisJaWYgKCF0eXBlcykKKwkJdHlwZXMgPSBkZWZhdWx0X210ZF9wYXJ0X3R5cGVzOworCiAJZm9yICggOyByZXQgPD0gMCAmJiAqdHlwZXM7IHR5cGVzKyspIHsKIAkJcGFyc2VyID0gZ2V0X3BhcnRpdGlvbl9wYXJzZXIoKnR5cGVzKTsKIAkJaWYgKCFwYXJzZXIgJiYgIXJlcXVlc3RfbW9kdWxlKCIlcyIsICp0eXBlcykpCiAJCQkJcGFyc2VyID0gZ2V0X3BhcnRpdGlvbl9wYXJzZXIoKnR5cGVzKTsKIAkJaWYgKCFwYXJzZXIpCiAJCQljb250aW51ZTsKLQkJcmV0ID0gKCpwYXJzZXItPnBhcnNlX2ZuKShtYXN0ZXIsIHBwYXJ0cywgb3JpZ2luKTsKKwkJcmV0ID0gKCpwYXJzZXItPnBhcnNlX2ZuKShtYXN0ZXIsIHBwYXJ0cywgZGF0YSk7CiAJCWlmIChyZXQgPiAwKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVkICVzIHBhcnRpdGlvbnMgZm91bmQgb24gTVREIGRldmljZSAlc1xuIiwKIAkJCSAgICAgICByZXQsIHBhcnNlci0+bmFtZSwgbWFzdGVyLT5uYW1lKTsKQEAgLTczMyw3ICs3ODAsNiBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwocGFyc2VfbXRkX3BhcnRpdGlvbnMpOwogCiBpbnQgbXRkX2lzX3BhcnRpdGlvbihzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZHN1cGVyLmMgYi9kcml2ZXJzL210ZC9tdGRzdXBlci5jCmluZGV4IDE2YjAyYTEuLmE5MGJmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHN1cGVyLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkc3VwZXIuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbXRkL3N1cGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMjYsMTIgKzI3LDEyIEBACiAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBfbXRkOwogCiAJaWYgKHNiLT5zX210ZCA9PSBtdGQpIHsKLQkJREVCVUcoMiwgIk1URFNCOiBNYXRjaCBvbiBkZXZpY2UgJWQgKFwiJXNcIilcbiIsCisJCXByX2RlYnVnKCJNVERTQjogTWF0Y2ggb24gZGV2aWNlICVkIChcIiVzXCIpXG4iLAogCQkgICAgICBtdGQtPmluZGV4LCBtdGQtPm5hbWUpOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlERUJVRygyLCAiTVREU0I6IE5vIG1hdGNoLCBkZXZpY2UgJWQgKFwiJXNcIiksIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKKwlwcl9kZWJ1ZygiTVREU0I6IE5vIG1hdGNoLCBkZXZpY2UgJWQgKFwiJXNcIiksIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKIAkgICAgICBzYi0+c19tdGQtPmluZGV4LCBzYi0+c19tdGQtPm5hbWUsIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MCw3ICs3MSw3IEBACiAJCWdvdG8gYWxyZWFkeV9tb3VudGVkOwogCiAJLyogZnJlc2ggbmV3IHN1cGVyYmxvY2sgKi8KLQlERUJVRygxLCAiTVREU0I6IE5ldyBzdXBlcmJsb2NrIGZvciBkZXZpY2UgJWQgKFwiJXNcIilcbiIsCisJcHJfZGVidWcoIk1URFNCOiBOZXcgc3VwZXJibG9jayBmb3IgZGV2aWNlICVkIChcIiVzXCIpXG4iLAogCSAgICAgIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSk7CiAKIAlzYi0+c19mbGFncyA9IGZsYWdzOwpAQCAtODcsNyArODgsNyBAQAogCiAJLyogbmV3IG1vdW50cG9pbnQgZm9yIGFuIGFscmVhZHkgbW91bnRlZCBzdXBlcmJsb2NrICovCiBhbHJlYWR5X21vdW50ZWQ6Ci0JREVCVUcoMSwgIk1URFNCOiBEZXZpY2UgJWQgKFwiJXNcIikgaXMgYWxyZWFkeSBtb3VudGVkXG4iLAorCXByX2RlYnVnKCJNVERTQjogRGV2aWNlICVkIChcIiVzXCIpIGlzIGFscmVhZHkgbW91bnRlZFxuIiwKIAkgICAgICBtdGQtPmluZGV4LCBtdGQtPm5hbWUpOwogCXB1dF9tdGRfZGV2aWNlKG10ZCk7CiAJcmV0dXJuIGRnZXQoc2ItPnNfcm9vdCk7CkBAIC0xMDgsNyArMTA5LDcgQEAKIAogCW10ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIG10ZG5yKTsKIAlpZiAoSVNfRVJSKG10ZCkpIHsKLQkJREVCVUcoMCwgIk1URFNCOiBEZXZpY2UgIyV1IGRvZXNuJ3QgYXBwZWFyIHRvIGV4aXN0XG4iLCBtdGRucik7CisJCXByX2RlYnVnKCJNVERTQjogRGV2aWNlICMldSBkb2Vzbid0IGFwcGVhciB0byBleGlzdFxuIiwgbXRkbnIpOwogCQlyZXR1cm4gRVJSX0NBU1QobXRkKTsKIAl9CiAKQEAgLTEzMSw3ICsxMzIsNyBAQAogCWlmICghZGV2X25hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JREVCVUcoMiwgIk1URFNCOiBkZXZfbmFtZSBcIiVzXCJcbiIsIGRldl9uYW1lKTsKKwlwcl9kZWJ1ZygiTVREU0I6IGRldl9uYW1lIFwiJXNcIlxuIiwgZGV2X25hbWUpOwogCiAJLyogdGhlIHByZWZlcnJlZCB3YXkgb2YgbW91bnRpbmcgaW4gZnV0dXJlOyBlc3BlY2lhbGx5IHdoZW4KIAkgKiBDT05GSUdfQkxPQ0s9biAtIHdlIHNwZWNpZnkgdGhlIHVuZGVybHlpbmcgTVREIGRldmljZSBieSBudW1iZXIgb3IKQEAgLTE0Miw3ICsxNDMsNyBAQAogCQkJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAKIAkJCS8qIG1vdW50IGJ5IE1URCBkZXZpY2UgbmFtZSAqLwotCQkJREVCVUcoMSwgIk1URFNCOiBtdGQ6JSVzLCBuYW1lIFwiJXNcIlxuIiwKKwkJCXByX2RlYnVnKCJNVERTQjogbXRkOiUlcywgbmFtZSBcIiVzXCJcbiIsCiAJCQkgICAgICBkZXZfbmFtZSArIDQpOwogCiAJCQltdGQgPSBnZXRfbXRkX2RldmljZV9ubShkZXZfbmFtZSArIDQpOwpAQCAtMTYzLDcgKzE2NCw3IEBACiAJCQltdGRuciA9IHNpbXBsZV9zdHJ0b3VsKGRldl9uYW1lICsgMywgJmVuZHB0ciwgMCk7CiAJCQlpZiAoISplbmRwdHIpIHsKIAkJCQkvKiBJdCB3YXMgYSB2YWxpZCBudW1iZXIgKi8KLQkJCQlERUJVRygxLCAiTVREU0I6IG10ZCUlZCwgbXRkbnIgJWRcbiIsCisJCQkJcHJfZGVidWcoIk1URFNCOiBtdGQlJWQsIG10ZG5yICVkXG4iLAogCQkJCSAgICAgIG10ZG5yKTsKIAkJCQlyZXR1cm4gbW91bnRfbXRkX25yKGZzX3R5cGUsIGZsYWdzLAogCQkJCQkJICAgICBkZXZfbmFtZSwgZGF0YSwKQEAgLTE3OSwxMCArMTgwLDEwIEBACiAJYmRldiA9IGxvb2t1cF9iZGV2KGRldl9uYW1lKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoYmRldik7Ci0JCURFQlVHKDEsICJNVERTQjogbG9va3VwX2JkZXYoKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcHJfZGVidWcoIk1URFNCOiBsb29rdXBfYmRldigpIHJldHVybmVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KLQlERUJVRygxLCAiTVREU0I6IGxvb2t1cF9iZGV2KCkgcmV0dXJuZWQgMFxuIik7CisJcHJfZGVidWcoIk1URFNCOiBsb29rdXBfYmRldigpIHJldHVybmVkIDBcbiIpOwogCiAJcmV0ID0gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkc3dhcC5jIGIvZHJpdmVycy9tdGQvbXRkc3dhcC5jCmluZGV4IGZkNzg4NTMuLmJkOTU5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHN3YXAuYworKysgYi9kcml2ZXJzL210ZC9tdGRzd2FwLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGFjdGl2ZV9jb3VudDsKIAl1bnNpZ25lZCBpbnQgZXJhc2VfY291bnQ7Ci0JdW5zaWduZWQgaW50IHBhZDsJCS8qIHNwZWVkcyB1cCBwb2ludGVyIGRlY3JlbXRudCAqLworCXVuc2lnbmVkIGludCBwYWQ7CQkvKiBzcGVlZHMgdXAgcG9pbnRlciBkZWNyZW1lbnQgKi8KIH07CiAKICNkZWZpbmUgTVREU1dBUF9FQ05UX01JTihyYnJvb3QpIChyYl9lbnRyeShyYl9maXJzdChyYnJvb3QpLCBzdHJ1Y3Qgc3dhcF9lYiwgXApAQCAtMzE0LDcgKzMxNCw3IEBACiB7CiAJaW50IHJldCA9IGQtPm10ZC0+cmVhZF9vb2IoZC0+bXRkLCBmcm9tLCBvcHMpOwogCi0JaWYgKHJldCA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAocmV0KSkKIAkJcmV0dXJuIHJldDsKIAogCWlmIChyZXQpIHsKQEAgLTM1MCwxMSArMzUwLDExIEBACiAJb3BzLm9vYmJ1ZiA9IGQtPm9vYl9idWY7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5kYXRidWYgPSBOVUxMOwotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAogCXJldCA9IG10ZHN3YXBfcmVhZF9vb2IoZCwgb2Zmc2V0LCAmb3BzKTsKIAotCWlmIChyZXQgJiYgcmV0ICE9IC1FVUNMRUFOKQorCWlmIChyZXQgJiYgIW10ZF9pc19iaXRmbGlwKHJldCkpCiAJCXJldHVybiByZXQ7CiAKIAlkYXRhID0gKHN0cnVjdCBtdGRzd2FwX29vYmRhdGEgKilkLT5vb2JfYnVmOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAKIAlpZiAobGUxNl90b19jcHUoZGF0YS0+bWFnaWMpID09IE1URFNXQVBfTUFHSUNfQ0xFQU4pIHsKIAkJZWItPmVyYXNlX2NvdW50ID0gbGUzMl90b19jcHUoZGF0YS0+Y291bnQpOwotCQlpZiAocmV0ID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAocmV0KSkKIAkJCXJldCA9IE1URFNXQVBfU0NBTk5FRF9CSVRGTElQOwogCQllbHNlIHsKIAkJCWlmIChsZTE2X3RvX2NwdShkYXRhMi0+bWFnaWMpID09IE1URFNXQVBfTUFHSUNfRElSVFkpCkBAIC0zODksNyArMzg5LDcgQEAKIAogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29iYnVmID0gKHVpbnQ4X3QgKikmbjsKLQlvcHMubW9kZSA9IE1URF9PT0JfQVVUTzsKKwlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJb3BzLmRhdGJ1ZiA9IE5VTEw7CiAKIAlpZiAobWFya2VyID09IE1URFNXQVBfVFlQRV9DTEVBTikgewpAQCAtNDA4LDcgKzQwOCw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfd2FybihkLT5kZXYsICJXcml0ZSBPT0IgZmFpbGVkIGZvciBibG9jayBhdCAlMDhsbHggIgogCQkJImVycm9yICVkXG4iLCBvZmZzZXQsIHJldCk7Ci0JCWlmIChyZXQgPT0gLUVJTyB8fCByZXQgPT0gLUVCQURNU0cpCisJCWlmIChyZXQgPT0gLUVJTyB8fCBtdGRfaXNfZWNjZXJyKHJldCkpCiAJCQltdGRzd2FwX2hhbmRsZV93cml0ZV9lcnJvcihkLCBlYik7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNjI4LDcgKzYyOCw3IEBACiAJCQlUUkVFX0NPVU5UKGQsIENMRUFOKS0tOwogCiAJCQlyZXQgPSBtdGRzd2FwX3dyaXRlX21hcmtlcihkLCBlYiwgTVREU1dBUF9UWVBFX0RJUlRZKTsKLQkJfSB3aGlsZSAocmV0ID09IC1FSU8gfHwgcmV0ID09IC1FQkFETVNHKTsKKwkJfSB3aGlsZSAocmV0ID09IC1FSU8gfHwgbXRkX2lzX2VjY2VycihyZXQpKTsKIAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCXJldCA9IG10ZHN3YXBfbWFwX2ZyZWVfYmxvY2soZCwgcGFnZSwgYnApOwogCWViID0gZC0+ZWJfZGF0YSArICgqYnAgLyBkLT5wYWdlc19wZXJfZWJsayk7CiAKLQlpZiAocmV0ID09IC1FSU8gfHwgcmV0ID09IC1FQkFETVNHKSB7CisJaWYgKHJldCA9PSAtRUlPIHx8IG10ZF9pc19lY2NlcnIocmV0KSkgewogCQlkLT5jdXJyX3dyaXRlID0gTlVMTDsKIAkJZWItPmFjdGl2ZV9jb3VudC0tOwogCQlkLT5yZXZtYXBbKmJwXSA9IFBBR0VfVU5ERUY7CkBAIC02OTAsNyArNjkwLDcgQEAKIAogCXdyaXRlcG9zID0gKGxvZmZfdCkqYnAgPDwgUEFHRV9TSElGVDsKIAlyZXQgPSAgbXRkLT53cml0ZShtdGQsIHdyaXRlcG9zLCBQQUdFX1NJWkUsICZyZXRsZW4sIGJ1Zik7Ci0JaWYgKHJldCA9PSAtRUlPIHx8IHJldCA9PSAtRUJBRE1TRykgeworCWlmIChyZXQgPT0gLUVJTyB8fCBtdGRfaXNfZWNjZXJyKHJldCkpIHsKIAkJZC0+Y3Vycl93cml0ZV9wb3MtLTsKIAkJZWItPmFjdGl2ZV9jb3VudC0tOwogCQlkLT5yZXZtYXBbKmJwXSA9IFBBR0VfVU5ERUY7CkBAIC03MzgsNyArNzM4LDcgQEAKIHJldHJ5OgogCXJldCA9IG10ZC0+cmVhZChtdGQsIHJlYWRwb3MsIFBBR0VfU0laRSwgJnJldGxlbiwgZC0+cGFnZV9idWYpOwogCi0JaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FVUNMRUFOKSB7CisJaWYgKHJldCA8IDAgJiYgIW10ZF9pc19iaXRmbGlwKHJldCkpIHsKIAkJb2xkZWIgPSBkLT5lYl9kYXRhICsgb2xkYmxvY2sgLyBkLT5wYWdlc19wZXJfZWJsazsKIAkJb2xkZWItPmZsYWdzIHw9IEVCTE9DS19SRUFERVJSOwogCkBAIC05MzEsNyArOTMxLDcgQEAKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXQ7CiAKLQlvcHMubW9kZSA9IE1URF9PT0JfQVVUTzsKKwlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJb3BzLmxlbiA9IG10ZC0+d3JpdGVzaXplOwogCW9wcy5vb2JsZW4gPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CiAJb3BzLm9vYm9mZnMgPSAwOwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAogCWlmIChyZXQgPT0gMCkKIAkJbXRkc3dhcF9yYl9hZGQoZCwgZWIsIE1URFNXQVBfQ0xFQU4pOwotCWVsc2UgaWYgKHJldCAhPSAtRUlPICYmIHJldCAhPSAtRUJBRE1TRykKKwllbHNlIGlmIChyZXQgIT0gLUVJTyAmJiAhbXRkX2lzX2VjY2VycihyZXQpKQogCQltdGRzd2FwX3JiX2FkZChkLCBlYiwgTVREU1dBUF9ESVJUWSk7CiAKIAlyZXR1cm4gMDsKQEAgLTExNjQsNyArMTE2NCw3IEBACiAJcmV0ID0gbXRkLT5yZWFkKG10ZCwgcmVhZHBvcywgUEFHRV9TSVpFLCAmcmV0bGVuLCBidWYpOwogCiAJZC0+bXRkX3JlYWRfY291bnQrKzsKLQlpZiAocmV0ID09IC1FVUNMRUFOKSB7CisJaWYgKG10ZF9pc19iaXRmbGlwKHJldCkpIHsKIAkJZWItPmZsYWdzIHw9IEVCTE9DS19CSVRGTElQOwogCQltdGRzd2FwX3JiX2FkZChkLCBlYiwgTVREU1dBUF9CSVRGTElQKTsKIAkJcmV0ID0gMDsKQEAgLTEzNzQsMTEgKzEzNzQsMTAgQEAKIAkJZ290byByZXZtYXBfZmFpbDsKIAogCWVibGtfYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHN3YXBfZWIpKmQtPmVibGtzOwotCWQtPmViX2RhdGEgPSB2bWFsbG9jKGVibGtfYnl0ZXMpOworCWQtPmViX2RhdGEgPSB2emFsbG9jKGVibGtfYnl0ZXMpOwogCWlmICghZC0+ZWJfZGF0YSkKIAkJZ290byBlYl9kYXRhX2ZhaWw7CiAKLQltZW1zZXQoZC0+ZWJfZGF0YSwgMCwgZWJsa19ieXRlcyk7CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspCiAJCWQtPnBhZ2VfZGF0YVtpXSA9IEJMT0NLX1VOREVGOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKaW5kZXggNGMzNDI1Mi4uY2NlN2I3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwpAQCAtODMsMTYgKzgzLDkgQEAKICAgICAgICAgICBzY3JhdGNoIHJlZ2lzdGVyIGhlcmUgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4gT24gSW50ZWwgTW9vcmVzdG93bgogICAgICAgICAgIGJvYXJkcywgdGhlIHNjcmF0Y2ggcmVnaXN0ZXIgaXMgYXQgMHhGRjEwODAxOC4KIAotY29uZmlnIE1URF9OQU5EX0VEQjczMTIKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQ2lycnVzIExvZ2ljIEVCRDczMTIgZXZhbHVhdGlvbiBib2FyZCIKLQlkZXBlbmRzIG9uIEFSQ0hfRURCNzMxMgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgQ2lycnVzIExvZ2ljIEVCRDczMTIgZXZhbHVhdGlvbgotCSAgYm9hcmQgdG8gYWNjZXNzIHRoZSBvbmJvYXJkIE5BTkQgRmxhc2guCi0KIGNvbmZpZyBNVERfTkFORF9IMTkwMAogCXRyaXN0YXRlICJpUEFRIEgxOTAwIGZsYXNoIgotCWRlcGVuZHMgb24gQVJDSF9QWEEKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBICYmIEJST0tFTgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgaVBBUSBoMTkwMCBmbGFzaC4KIApAQCAtMTE2LDEwICsxMDksMTEgQEAKIAkgIFN1cHBvcnQgZm9yIE5BTkQgZmxhc2ggb24gQW1zdHJhZCBFMyAoRGVsdGEpLgogCiBjb25maWcgTVREX05BTkRfT01BUDIKLQl0cmlzdGF0ZSAiTkFORCBGbGFzaCBkZXZpY2Ugb24gT01BUDIgYW5kIE9NQVAzIgotCWRlcGVuZHMgb24gQVJNICYmIChBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMpCisJdHJpc3RhdGUgIk5BTkQgRmxhc2ggZGV2aWNlIG9uIE9NQVAyLCBPTUFQMyBhbmQgT01BUDQiCisJZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMyB8fCBBUkNIX09NQVA0KQogCWhlbHAKLSAgICAgICAgICBTdXBwb3J0IGZvciBOQU5EIGZsYXNoIG9uIFRleGFzIEluc3RydW1lbnRzIE9NQVAyIGFuZCBPTUFQMyBwbGF0Zm9ybXMuCisgICAgICAgICAgU3VwcG9ydCBmb3IgTkFORCBmbGFzaCBvbiBUZXhhcyBJbnN0cnVtZW50cyBPTUFQMiwgT01BUDMgYW5kIE9NQVA0CisJICBwbGF0Zm9ybXMuCiAKIGNvbmZpZyBNVERfTkFORF9JRFMKIAl0cmlzdGF0ZQpAQCAtMTM4LDcgKzEzMiw3IEBACiAKIGNvbmZpZyBNVERfTkFORF9BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwLzEyMDAgTkFORCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09DX0FVMTIwMCB8fCBTT0NfQVUxNTUwCisJZGVwZW5kcyBvbiBNSVBTX0FMQ0hFTVkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUKIAkgIEFNRC9BbGNoZW15IDE1NTAgU09DLgpAQCAtNDIzLDYgKzQxNywxOSBAQAogCSAgVGhlIHNpbXVsYXRvciBtYXkgc2ltdWxhdGUgdmFyaW91cyBOQU5EIGZsYXNoIGNoaXBzIGZvciB0aGUKIAkgIE1URCBuYW5kIGxheWVyLgogCitjb25maWcgTVREX05BTkRfR1BNSV9OQU5ECisgICAgICAgIGJvb2wgIkdQTUkgTkFORCBGbGFzaCBDb250cm9sbGVyIGRyaXZlciIKKyAgICAgICAgZGVwZW5kcyBvbiBNVERfTkFORCAmJiAoU09DX0lNWDIzIHx8IFNPQ19JTVgyOCkKKwlzZWxlY3QgTVREX1BBUlRJVElPTlMKKwlzZWxlY3QgTVREX0NNRExJTkVfUEFSVFMKKyAgICAgICAgaGVscAorCSBFbmFibGVzIE5BTkQgRmxhc2ggc3VwcG9ydCBmb3IgSU1YMjMgb3IgSU1YMjguCisJIFRoZSBHUE1JIGNvbnRyb2xsZXIgaXMgdmVyeSBwb3dlcmZ1bCwgd2l0aCB0aGUgaGVscCBvZiBCQ0gKKwkgbW9kdWxlLCBpdCBjYW4gZG8gdGhlIGhhcmR3YXJlIEVDQy4gVGhlIEdQTUkgc3VwcG9ydHMgc2V2ZXJhbAorCSBOQU5EIGZsYXNocyBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgR1BNSSBtYXkgY29uZmxpY3RzIHdpdGggb3RoZXIKKwkgYmxvY2ssIHN1Y2ggYXMgU0QgY2FyZC4gU28gcGF5IGF0dGVudGlvbiB0byBpdCB3aGVuIHlvdSBlbmFibGUKKwkgdGhlIEdQTUkuCisKIGNvbmZpZyBNVERfTkFORF9QTEFURk9STQogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBnZW5lcmljIHBsYXRmb3JtIE5BTkQgZHJpdmVyIgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCmluZGV4IDU3NDVkODMuLjYxOGY0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNiBAQAogb2JqLSQoQ09ORklHX01URF9OQU5EX0FNU19ERUxUQSkJKz0gYW1zLWRlbHRhLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9BVVRDUFUxMikJCSs9IGF1dGNwdTEyLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9ERU5BTEkpCQkrPSBkZW5hbGkubwotb2JqLSQoQ09ORklHX01URF9OQU5EX0VEQjczMTIpCQkrPSBlZGI3MzEyLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9BVTE1NTApCQkrPSBhdTE1NTBuZC5vCiBvYmotJChDT05GSUdfTVREX05BTkRfQkY1WFgpCQkrPSBiZjV4eF9uYW5kLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9QUENIQU1FTEVPTkVWQikJKz0gcHBjaGFtZWxlb25ldmIubwpAQCAtNDksNSArNDgsNiBAQAogb2JqLSQoQ09ORklHX01URF9OQU5EX01QQzUxMjFfTkZDKQkrPSBtcGM1MTIxX25mYy5vCiBvYmotJChDT05GSUdfTVREX05BTkRfUklDT0gpCQkrPSByODUyLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9KWjQ3NDApCQkrPSBqejQ3NDBfbmFuZC5vCitvYmotJChDT05GSUdfTVREX05BTkRfR1BNSV9OQU5EKQkrPSBncG1pLW5hbmQvCiAKIG5hbmQtb2JqcyA6PSBuYW5kX2Jhc2UubyBuYW5kX2JidC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2Ftcy1kZWx0YS5jIGIvZHJpdmVycy9tdGQvbmFuZC9hbXMtZGVsdGEuYwppbmRleCA3ODAxN2ViLi45ZTZiNDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Ftcy1kZWx0YS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYW1zLWRlbHRhLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxwbGF0L2JvYXJkLWFtcy1kZWx0YS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9hdG1lbF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYwppbmRleCA1NWRhMjBjLi4yM2U1ZDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2F0bWVsX25hbmQuYwpAQCAtMTYxLDM3ICsxNjEsNiBAQAogICAgICAgICAgICAgICAgICEhaG9zdC0+Ym9hcmQtPnJkeV9waW5fYWN0aXZlX2xvdzsKIH0KIAotLyoKLSAqIE1pbmltYWwtb3ZlcmhlYWQgUElPIGZvciBkYXRhIGFjY2Vzcy4KLSAqLwotc3RhdGljIHZvaWQgYXRtZWxfcmVhZF9idWY4KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBuYW5kX2NoaXAJKm5hbmRfY2hpcCA9IG10ZC0+cHJpdjsKLQotCV9fcmF3X3JlYWRzYihuYW5kX2NoaXAtPklPX0FERFJfUiwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBhdG1lbF9yZWFkX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBuYW5kX2NoaXAJKm5hbmRfY2hpcCA9IG10ZC0+cHJpdjsKLQotCV9fcmF3X3JlYWRzdyhuYW5kX2NoaXAtPklPX0FERFJfUiwgYnVmLCBsZW4gLyAyKTsKLX0KLQotc3RhdGljIHZvaWQgYXRtZWxfd3JpdGVfYnVmOChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwCSpuYW5kX2NoaXAgPSBtdGQtPnByaXY7Ci0KLQlfX3Jhd193cml0ZXNiKG5hbmRfY2hpcC0+SU9fQUREUl9XLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0bWVsX3dyaXRlX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBuYW5kX2NoaXAJKm5hbmRfY2hpcCA9IG10ZC0+cHJpdjsKLQotCV9fcmF3X3dyaXRlc3cobmFuZF9jaGlwLT5JT19BRERSX1csIGJ1ZiwgbGVuIC8gMik7Ci19Ci0KIHN0YXRpYyB2b2lkIGRtYV9jb21wbGV0ZV9mdW5jKHZvaWQgKmNvbXBsZXRpb24pCiB7CiAJY29tcGxldGUoY29tcGxldGlvbik7CkBAIC0yNjYsMzMgKzIzNSwyNyBAQAogc3RhdGljIHZvaWQgYXRtZWxfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHU4ICpidWYsIGludCBsZW4pCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgYXRtZWxfbmFuZF9ob3N0ICpob3N0ID0gY2hpcC0+cHJpdjsKIAogCWlmICh1c2VfZG1hICYmIGxlbiA+IG10ZC0+b29ic2l6ZSkKIAkJLyogb25seSB1c2UgRE1BIGZvciBiaWdnZXIgdGhhbiBvb2Igc2l6ZTogYmV0dGVyIHBlcmZvcm1hbmNlcyAqLwogCQlpZiAoYXRtZWxfbmFuZF9kbWFfb3AobXRkLCBidWYsIGxlbiwgMSkgPT0gMCkKIAkJCXJldHVybjsKIAotCWlmIChob3N0LT5ib2FyZC0+YnVzX3dpZHRoXzE2KQotCQlhdG1lbF9yZWFkX2J1ZjE2KG10ZCwgYnVmLCBsZW4pOwotCWVsc2UKLQkJYXRtZWxfcmVhZF9idWY4KG10ZCwgYnVmLCBsZW4pOworCS8qIGlmIG5vIERNQSBvcGVyYXRpb24gcG9zc2libGUsIHVzZSBQSU8gKi8KKwltZW1jcHlfZnJvbWlvKGJ1ZiwgY2hpcC0+SU9fQUREUl9SLCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBhdG1lbF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgYXRtZWxfbmFuZF9ob3N0ICpob3N0ID0gY2hpcC0+cHJpdjsKIAogCWlmICh1c2VfZG1hICYmIGxlbiA+IG10ZC0+b29ic2l6ZSkKIAkJLyogb25seSB1c2UgRE1BIGZvciBiaWdnZXIgdGhhbiBvb2Igc2l6ZTogYmV0dGVyIHBlcmZvcm1hbmNlcyAqLwogCQlpZiAoYXRtZWxfbmFuZF9kbWFfb3AobXRkLCAodm9pZCAqKWJ1ZiwgbGVuLCAwKSA9PSAwKQogCQkJcmV0dXJuOwogCi0JaWYgKGhvc3QtPmJvYXJkLT5idXNfd2lkdGhfMTYpCi0JCWF0bWVsX3dyaXRlX2J1ZjE2KG10ZCwgYnVmLCBsZW4pOwotCWVsc2UKLQkJYXRtZWxfd3JpdGVfYnVmOChtdGQsIGJ1ZiwgbGVuKTsKKwkvKiBpZiBubyBETUEgb3BlcmF0aW9uIHBvc3NpYmxlLCB1c2UgUElPICovCisJbWVtY3B5X3RvaW8oY2hpcC0+SU9fQUREUl9XLCBidWYsIGxlbik7CiB9CiAKIC8qCkBAIC00ODEsMTAgKzQ0NCw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotI2VuZGlmCi0KIC8qCiAgKiBQcm9iZSBmb3IgdGhlIE5BTkQgZGV2aWNlLgogICovCkBAIC00OTYsOCArNDU1LDYgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CiAJc3RydWN0IHJlc291cmNlICptZW07CiAJaW50IHJlczsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9ucyA9IE5VTEw7Ci0JaW50IG51bV9wYXJ0aXRpb25zID0gMDsKIAogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFtZW0pIHsKQEAgLTU4Myw3ICs1NDAsNyBAQAogCiAJaWYgKG9uX2ZsYXNoX2JidCkgewogCQlwcmludGsoS0VSTl9JTkZPICJhdG1lbF9uYW5kOiBVc2UgT24gRmxhc2ggQkJUXG4iKTsKLQkJbmFuZF9jaGlwLT5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwkJbmFuZF9jaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxBU0g7CiAJfQogCiAJaWYgKCFjcHVfaGFzX2RtYSgpKQpAQCAtNTk0LDcgKzU1MSw3IEBACiAKIAkJZG1hX2NhcF96ZXJvKG1hc2spOwogCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBtYXNrKTsKLQkJaG9zdC0+ZG1hX2NoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIDAsIE5VTEwpOworCQlob3N0LT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgTlVMTCwgTlVMTCk7CiAJCWlmICghaG9zdC0+ZG1hX2NoYW4pIHsKIAkJCWRldl9lcnIoaG9zdC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWxcbiIpOwogCQkJdXNlX2RtYSA9IDA7CkBAIC02NTUsMjcgKzYxMiwxMiBAQAogCQlnb3RvIGVycl9zY2FuX3RhaWw7CiAJfQogCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCiAJbXRkLT5uYW1lID0gImF0bWVsX25hbmQiOwotCW51bV9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywKLQkJCQkJICAgICAgJnBhcnRpdGlvbnMsIDApOwotI2VuZGlmCi0JaWYgKG51bV9wYXJ0aXRpb25zIDw9IDAgJiYgaG9zdC0+Ym9hcmQtPnBhcnRpdGlvbl9pbmZvKQotCQlwYXJ0aXRpb25zID0gaG9zdC0+Ym9hcmQtPnBhcnRpdGlvbl9pbmZvKG10ZC0+c2l6ZSwKLQkJCQkJCQkgJm51bV9wYXJ0aXRpb25zKTsKLQotCWlmICgoIXBhcnRpdGlvbnMpIHx8IChudW1fcGFydGl0aW9ucyA9PSAwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX25hbmQ6IE5vIHBhcnRpdGlvbnMgZGVmaW5lZCwgb3IgdW5zdXBwb3J0ZWQgZGV2aWNlLlxuIik7Ci0JCXJlcyA9IC1FTlhJTzsKLQkJZ290byBlcnJfbm9fcGFydGl0aW9uczsKLQl9Ci0KLQlyZXMgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFydGl0aW9ucywgbnVtX3BhcnRpdGlvbnMpOworCXJlcyA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwLAorCQkJaG9zdC0+Ym9hcmQtPnBhcnRzLCBob3N0LT5ib2FyZC0+bnVtX3BhcnRzKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIHJlczsKIAotZXJyX25vX3BhcnRpdGlvbnM6Ci0JbmFuZF9yZWxlYXNlKG10ZCk7CiBlcnJfc2Nhbl90YWlsOgogZXJyX3NjYW5faWRlbnQ6CiBlcnJfbm9fY2FyZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvYXUxNTUwbmQuYwppbmRleCBlNzc2N2VlLi43ZGQzNzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2F1MTU1MG5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdTE1NTBuZC5jCkBAIC0xOSw3ICsxOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4Lmg+CisjaWZkZWYgQ09ORklHX01JUFNfUEIxNTUwCisjaW5jbHVkZSA8YXNtL21hY2gtcGIxeDAwL3BiMTU1MC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19EQjE1NTApCisjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2Jjc3IuaD4KIAogLyoKQEAgLTQ4LDcgKzUyLDcgQEAKICAqIGF1X3JlYWRfYnl0ZSAtICByZWFkIG9uZSBieXRlIGZyb20gdGhlIGNoaXAKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogIHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogcmVhZCBmdW5jdGlvbiBmb3IgOGJpdCBidXN3aWR0aAogICovCiBzdGF0aWMgdV9jaGFyIGF1X3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTYzLDcgKzY3LDcgQEAKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAYnl0ZToJcG9pbnRlciB0byBkYXRhIGJ5dGUgdG8gd3JpdGUKICAqCi0gKiAgd3JpdGUgZnVuY3Rpb24gZm9yIDhpdCBidXN3aXRoCisgKiB3cml0ZSBmdW5jdGlvbiBmb3IgOGl0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB2b2lkIGF1X3dyaXRlX2J5dGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciBieXRlKQogewpAQCAtNzMsMTEgKzc3LDEwIEBACiB9CiAKIC8qKgotICogYXVfcmVhZF9ieXRlMTYgLSAgcmVhZCBvbmUgYnl0ZSBlbmRpYW5lc3MgYXdhcmUgZnJvbSB0aGUgY2hpcAorICogYXVfcmVhZF9ieXRlMTYgLSAgcmVhZCBvbmUgYnl0ZSBlbmRpYW5uZXNzIGF3YXJlIGZyb20gdGhlIGNoaXAKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGggd2l0aAotICogZW5kaWFuZXNzIGNvbnZlcnNpb24KKyAqIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoIHdpdGggZW5kaWFubmVzcyBjb252ZXJzaW9uCiAgKi8KIHN0YXRpYyB1X2NoYXIgYXVfcmVhZF9ieXRlMTYoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC04OCwxMiArOTEsMTEgQEAKIH0KIAogLyoqCi0gKiBhdV93cml0ZV9ieXRlMTYgLSAgd3JpdGUgb25lIGJ5dGUgZW5kaWFuZXNzIGF3YXJlIHRvIHRoZSBjaGlwCisgKiBhdV93cml0ZV9ieXRlMTYgLSAgd3JpdGUgb25lIGJ5dGUgZW5kaWFubmVzcyBhd2FyZSB0byB0aGUgY2hpcAogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBieXRlOglwb2ludGVyIHRvIGRhdGEgYnl0ZSB0byB3cml0ZQogICoKLSAqICB3cml0ZSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRoCi0gKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICogd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoIHdpdGggZW5kaWFubmVzcyBjb252ZXJzaW9uCiAgKi8KIHN0YXRpYyB2b2lkIGF1X3dyaXRlX2J5dGUxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyIGJ5dGUpCiB7CkBAIC0xMDYsOCArMTA4LDcgQEAKICAqIGF1X3JlYWRfd29yZCAtICByZWFkIG9uZSB3b3JkIGZyb20gdGhlIGNoaXAKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGggd2l0aG91dAotICogZW5kaWFuZXNzIGNvbnZlcnNpb24KKyAqIHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoIHdpdGhvdXQgZW5kaWFubmVzcyBjb252ZXJzaW9uCiAgKi8KIHN0YXRpYyB1MTYgYXVfcmVhZF93b3JkKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtMTIzLDcgKzEyNCw3IEBACiAgKiBAYnVmOglkYXRhIGJ1ZmZlcgogICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCiAgKgotICogIHdyaXRlIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpdGgKKyAqIHdyaXRlIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB2b2lkIGF1X3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC0xNDIsNyArMTQzLDcgQEAKICAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSBkYXRlCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICoKLSAqICByZWFkIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpdGgKKyAqIHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGgKICAqLwogc3RhdGljIHZvaWQgYXVfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQogewpAQCAtMTYxLDcgKzE2Miw3IEBACiAgKiBAYnVmOglidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQogICoKLSAqICB2ZXJpZnkgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogdmVyaWZ5IGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyBpbnQgYXVfdmVyaWZ5X2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC0xODMsNyArMTg0LDcgQEAKICAqIEBidWY6CWRhdGEgYnVmZmVyCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqCi0gKiAgd3JpdGUgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIHdyaXRlIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aAogICovCiBzdGF0aWMgdm9pZCBhdV93cml0ZV9idWYxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCiB7CkBAIC0yMDUsNyArMjA2LDcgQEAKICAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSBkYXRlCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICoKLSAqICByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoCisgKiByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aAogICovCiBzdGF0aWMgdm9pZCBhdV9yZWFkX2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTIyNiw3ICsyMjcsNyBAQAogICogQGJ1ZjoJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29tcGFyZQogICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKICAqCi0gKiAgdmVyaWZ5IGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoCisgKiB2ZXJpZnkgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyBpbnQgYXVfdmVyaWZ5X2J1ZjE2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXV0Y3B1MTIuYyBiL2RyaXZlcnMvbXRkL25hbmQvYXV0Y3B1MTIuYwppbmRleCBlZGRjOWEyLi4yZTQyZWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2F1dGNwdTEyLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdXRjcHUxMi5jCkBAIC0xNzIsOSArMTcyLDkgQEAKIAogCS8qIEVuYWJsZSB0aGUgZm9sbG93aW5nIGZvciBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSAqLwogCS8qCi0JICAgdGhpcy0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwkgICB0aGlzLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAkgKi8KLQl0aGlzLT5vcHRpb25zID0gTkFORF9VU0VfRkxBU0hfQkJUOworCXRoaXMtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCiAJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCiAJaWYgKG5hbmRfc2NhbihhdXRjcHUxMl9tdGQsIDEpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9iY21fdW1pX25hbmQuYwppbmRleCA4YzU2OWU0Li40NmI1OGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2JjbV91bWlfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYmNtX3VtaV9uYW5kLmMKQEAgLTUyLDggKzUyLDYgQEAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRjb25zdCBjaGFyIGdCYW5uZXJbXSA9IEtFUk5fSU5GTyBcCiAJIkJDTSBVTUkgTVREIE5BTkQgRHJpdmVyOiAxLjAwXG4iOwogCi1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KICNpZiBOQU5EX0VDQ19CQ0gKIHN0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmIH07CiAKQEAgLTM3NiwxNiArMzc0LDE4IEBACiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAotCWlmICghcikKLQkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXIpIHsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCS8qIG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCiAJYmNtX3VtaV9pb19iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CiAKIAlpZiAoIWJjbV91bWlfaW9fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgImlvcmVtYXAgdG8gYWNjZXNzIEJDTSBVTUkgTkFORCBjaGlwIGZhaWxlZFxuIik7Ci0JCWtmcmVlKGJvYXJkX210ZCk7Ci0JCXJldHVybiAtRUlPOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwpAQCAtNDAxLDkgKzQwMSw4IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgTkFORCBoYXJkd2FyZS4gICovCiAJaWYgKGJjbV91bWlfbmFuZF9pbml0aHcoKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJCQ00gVU1JIE5BTkQgY2hpcCBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWRcbiIpOwotCQlpb3VubWFwKGJjbV91bWlfaW9fYmFzZSk7Ci0JCWtmcmVlKGJvYXJkX210ZCk7Ci0JCXJldHVybiAtRUlPOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKIAkvKiBTZXQgYWRkcmVzcyBvZiBOQU5EIElPIGxpbmVzICovCkBAIC00MzYsNyArNDM1LDcgQEAKICNpZiBVU0VfRE1BCiAJZXJyID0gbmFuZF9kbWFfaW5pdCgpOwogCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfdW5tYXA7CiAjZW5kaWYKIAogCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgb2YgdGhlIGRldmljZSB0aGF0IHdlIGhhdmUuCkBAIC00NDcsOSArNDQ2LDcgQEAKIAllcnIgPSBuYW5kX3NjYW5faWRlbnQoYm9hcmRfbXRkLCAxLCBOVUxMKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibmFuZF9zY2FuIGZhaWxlZDogJWRcbiIsIGVycik7Ci0JCWlvdW5tYXAoYmNtX3VtaV9pb19iYXNlKTsKLQkJa2ZyZWUoYm9hcmRfbXRkKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJLyogTm93IHRoYXQgd2Uga25vdyB0aGUgbmFuZCBzaXplLCB3ZSBjYW4gc2V0dXAgdGhlIEVDQyBsYXlvdXQgKi8KQEAgLTQ2OCwxMyArNDY1LDE0IEBACiAJCXsKIAkJCXByaW50ayhLRVJOX0VSUiAiTkFORCAtIFVucmVjb2duaXplZCBwYWdlc2l6ZTogJWRcbiIsCiAJCQkJCSBib2FyZF9tdGQtPndyaXRlc2l6ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bm1hcDsKIAkJfQogCX0KIAogI2lmIE5BTkRfRUNDX0JDSAogCWlmIChib2FyZF9tdGQtPndyaXRlc2l6ZSA+IDUxMikgewotCQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVCkKKwkJaWYgKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKQogCQkJbGFyZ2VwYWdlX2JidC5vcHRpb25zID0gTkFORF9CQlRfU0NBTjJORFBBR0U7CiAJCXRoaXMtPmJhZGJsb2NrX3BhdHRlcm4gPSAmbGFyZ2VwYWdlX2JidDsKIAl9CkBAIC00ODUsMzMgKzQ4MywyMCBAQAogCWVyciA9IG5hbmRfc2Nhbl90YWlsKGJvYXJkX210ZCk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfc2NhbiBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotCQlpb3VubWFwKGJjbV91bWlfaW9fYmFzZSk7Ci0JCWtmcmVlKGJvYXJkX210ZCk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X3VubWFwOwogCX0KIAogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0JewotCQlpbnQgbnJfcGFydGl0aW9uczsKLQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRpdGlvbl9pbmZvOwotCi0JCWJvYXJkX210ZC0+bmFtZSA9ICJiY21fdW1pLW5hbmQiOwotCQlucl9wYXJ0aXRpb25zID0KLQkJICAgIHBhcnNlX210ZF9wYXJ0aXRpb25zKGJvYXJkX210ZCwgcGFydF9wcm9iZXMsCi0JCQkJCSAmcGFydGl0aW9uX2luZm8sIDApOwotCi0JCWlmIChucl9wYXJ0aXRpb25zIDw9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiQkNNIFVNSSBOQU5EOiBUb28gZmV3IHBhcnRpdGlvbnMgLSAlZFxuIiwKLQkJCSAgICAgICBucl9wYXJ0aXRpb25zKTsKLQkJCWlvdW5tYXAoYmNtX3VtaV9pb19iYXNlKTsKLQkJCWtmcmVlKGJvYXJkX210ZCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGJvYXJkX210ZCwgcGFydGl0aW9uX2luZm8sIG5yX3BhcnRpdGlvbnMpOwotCX0KKwlib2FyZF9tdGQtPm5hbWUgPSAiYmNtX3VtaS1uYW5kIjsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGJvYXJkX210ZCwgTlVMTCwgMCwgTlVMTCwgMCk7CiAKIAkvKiBSZXR1cm4gaGFwcHkgKi8KIAlyZXR1cm4gMDsKK291dF91bm1hcDoKKwlpb3VubWFwKGJjbV91bWlfaW9fYmFzZSk7CitvdXRfZnJlZToKKwlrZnJlZShib2FyZF9tdGQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgYmNtX3VtaV9uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMKaW5kZXggODdlYmI0ZS4uNzJkM2YyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgQ0FGRV9OQU5EX0NUUkwxCQkweDAwCkBAIC01Nyw3ICs1OCw2IEBACiAKIHN0cnVjdCBjYWZlX3ByaXYgewogCXN0cnVjdCBuYW5kX2NoaXAgbmFuZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJdm9pZCBfX2lvbWVtICptbWlvOwogCXN0cnVjdCByc19jb250cm9sICpyczsKQEAgLTM3MSw3ICszNzEsNyBAQAogCXJldHVybiAxOwogfQogLyoqCi0gKiBjYWZlX25hbmRfcmVhZF9wYWdlX3N5bmRyb21lIC0ge1JFUExBQ0FCTEVdIGhhcmR3YXJlIGVjYyBzeW5kcm9tIGJhc2VkIHBhZ2UgcmVhZAorICogY2FmZV9uYW5kX3JlYWRfcGFnZV9zeW5kcm9tZSAtIFtSRVBMQUNFQUJMRV0gaGFyZHdhcmUgZWNjIHN5bmRyb21lIGJhc2VkIHBhZ2UgcmVhZAogICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCiAgKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCiAgKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCkBAIC02MzAsOCArNjMwLDYgQEAKIAlzdHJ1Y3QgY2FmZV9wcml2ICpjYWZlOwogCXVpbnQzMl90IGN0cmw7CiAJaW50IGVyciA9IDA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwotCWludCBucl9wYXJ0czsKIAogCS8qIFZlcnkgb2xkIHZlcnNpb25zIHNoYXJlZCB0aGUgc2FtZSBQQ0kgaWRlbnQgZm9yIGFsbCB0aHJlZQogCSAgIGZ1bmN0aW9ucyBvbiB0aGUgY2hpcC4gVmVyaWZ5IHRoZSBjbGFzcyB0b28uLi4gKi8KQEAgLTY4Niw3ICs2ODQsOCBAQAogCWNhZmUtPm5hbmQuY2hpcF9kZWxheSA9IDA7CiAKIAkvKiBFbmFibGUgdGhlIGZvbGxvd2luZyBmb3IgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgKi8KLQljYWZlLT5uYW5kLm9wdGlvbnMgPSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX05PX0FVVE9JTkNSIHwgTkFORF9PV05fQlVGRkVSUzsKKwljYWZlLT5uYW5kLmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOworCWNhZmUtPm5hbmQub3B0aW9ucyA9IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EX09XTl9CVUZGRVJTOwogCiAJaWYgKHNraXBiYnQpIHsKIAkJY2FmZS0+bmFuZC5vcHRpb25zIHw9IE5BTkRfU0tJUF9CQlRTQ0FOOwpAQCAtNzk5LDE4ICs3OTgsOSBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG10ZCk7CiAKLQkvKiBXZSByZWdpc3RlciB0aGUgd2hvbGUgZGV2aWNlIGZpcnN0LCBzZXBhcmF0ZSBmcm9tIHRoZSBwYXJ0aXRpb25zICovCi0JbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwotCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCiAJbXRkLT5uYW1lID0gImNhZmVfbmFuZCI7Ci0jZW5kaWYKLQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7Ci0JaWYgKG5yX3BhcnRzID4gMCkgewotCQljYWZlLT5wYXJ0cyA9IHBhcnRzOwotCQlkZXZfaW5mbygmY2FmZS0+cGRldi0+ZGV2LCAiJWQgcGFydGl0aW9ucyBmb3VuZFxuIiwgbnJfcGFydHMpOwotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFydHMsIG5yX3BhcnRzKTsKLQl9CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIHBhcnRfcHJvYmVzLCAwLCBOVUxMLCAwKTsKKwogCWdvdG8gb3V0OwogCiAgb3V0X2lycToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYwppbmRleCA2ZmMwNDNhLi43MzdlZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NteDI3MF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jbXgyNzBfbmFuZC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNTAsOCArNTEsNiBAQAogfTsKICNkZWZpbmUgTlVNX1BBUlRJVElPTlMgKEFSUkFZX1NJWkUocGFydGl0aW9uX2luZm8pKQogCi1jb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIHN0YXRpYyB1X2NoYXIgY214MjcwX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwpAQCAtMTUxLDkgKzE1MCw2IEBACiBzdGF0aWMgaW50IF9faW5pdCBjbXgyNzBfaW5pdCh2b2lkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JY29uc3QgY2hhciAqcGFydF90eXBlOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHM7Ci0JaW50IG10ZF9wYXJ0c19uYiA9IDA7CiAJaW50IHJldDsKIAogCWlmICghKG1hY2hpbmVfaXNfYXJtY29yZSgpICYmIGNwdV9pc19weGEyN3goKSkpCkBAIC0yMjIsMjMgKzIxOCw5IEBACiAJCWdvdG8gZXJyX3NjYW47CiAJfQogCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0JbXRkX3BhcnRzX25iID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoY214MjcwX25hbmRfbXRkLCBwYXJ0X3Byb2JlcywKLQkJCQkJICAgICZtdGRfcGFydHMsIDApOwotCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQllbHNlCi0JCW10ZF9wYXJ0c19uYiA9IDA7Ci0jZW5kaWYKLQlpZiAoIW10ZF9wYXJ0c19uYikgewotCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mbzsKLQkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KLQogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0JcHJfbm90aWNlKCJVc2luZyAlcyBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGNteDI3MF9uYW5kX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoY214MjcwX25hbmRfbXRkLCBOVUxMLCAwLAorCQkJCQlwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3NjYW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYwppbmRleCBmNTlhZDFmLi40MTRhZmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NzNTUzeF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jczU1M3hfbmFuZC5jCkBAIC0yMzksNyArMjM5LDggQEAKIAl0aGlzLT5lY2MuY29ycmVjdCAgPSBuYW5kX2NvcnJlY3RfZGF0YTsKIAogCS8qIEVuYWJsZSB0aGUgZm9sbG93aW5nIGZvciBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSAqLwotCXRoaXMtPm9wdGlvbnMgPSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX05PX0FVVE9JTkNSOworCXRoaXMtPmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIOworCXRoaXMtPm9wdGlvbnMgPSBOQU5EX05PX0FVVE9JTkNSOwogCiAJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCiAJaWYgKG5hbmRfc2NhbihuZXdfbXRkLCAxKSkgewpAQCAtMjc3LDE1ICsyNzgsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogc3RhdGljIGludCBfX2luaXQgY3M1NTN4X2luaXQodm9pZCkKIHsKIAlpbnQgZXJyID0gLUVOWElPOwogCWludCBpOwogCXVpbnQ2NF90IHZhbDsKLQlpbnQgbXRkX3BhcnRzX25iID0gMDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gTlVMTDsKIAogCS8qIElmIHRoZSBDUFUgaXNuJ3QgYSBHZW9kZSBHWCBvciBMWCwgYWJvcnQgKi8KIAlpZiAoIWlzX2dlb2RlKCkpCkBAIC0zMTUsMTMgKzMxMiw5IEBACiAJICAgZG8gbXRkY29uY2F0IGV0Yy4gaWYgd2Ugd2FudCB0by4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlJfQ1M1NTNYX0NPTlRST0xMRVJTOyBpKyspIHsKIAkJaWYgKGNzNTUzeF9tdGRbaV0pIHsKLQogCQkJLyogSWYgYW55IGRldmljZXMgcmVnaXN0ZXJlZCwgcmV0dXJuIHN1Y2Nlc3MuIEVsc2UgdGhlIGxhc3QgZXJyb3IuICovCi0JCQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhjczU1M3hfbXRkW2ldLCBwYXJ0X3Byb2JlcywgJm10ZF9wYXJ0cywgMCk7Ci0JCQlpZiAobXRkX3BhcnRzX25iID4gMCkKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIGNvbW1hbmQgbGluZSBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIik7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKGNzNTUzeF9tdGRbaV0sIG10ZF9wYXJ0cywKLQkJCQkJICAgIG10ZF9wYXJ0c19uYik7CisJCQltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGNzNTUzeF9tdGRbaV0sIE5VTEwsIDAsCisJCQkJCQkgIE5VTEwsIDApOwogCQkJZXJyID0gMDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jCmluZGV4IDFmMzQ5NTEuLmMxNTNlMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYwpAQCAtNTcsNyArNTcsNiBAQAogCiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgY2xrCQkqY2xrOwotCWJvb2wJCQlwYXJ0aXRpb25lZDsKIAogCWJvb2wJCQlpc19yZWFkbW9kZTsKIApAQCAtNTMwLDggKzUyOSw2IEBACiAJaW50CQkJCXJldDsKIAl1aW50MzJfdAkJCXZhbDsKIAluYW5kX2VjY19tb2Rlc190CQllY2NfbW9kZTsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkJKm10ZF9wYXJ0cyA9IE5VTEw7Ci0JaW50CQkJCW10ZF9wYXJ0c19uYiA9IDA7CiAKIAkvKiBpbnNpc3Qgb24gYm9hcmQtc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwogCWlmICghcGRhdGEpCkBAIC01ODEsNyArNTc4LDkgQEAKIAlpbmZvLT5jaGlwLmNoaXBfZGVsYXkJPSAwOwogCWluZm8tPmNoaXAuc2VsZWN0X2NoaXAJPSBuYW5kX2RhdmluY2lfc2VsZWN0X2NoaXA7CiAKLQkvKiBvcHRpb25zIHN1Y2ggYXMgTkFORF9VU0VfRkxBU0hfQkJUIG9yIDE2LWJpdCB3aWR0aHMgKi8KKwkvKiBvcHRpb25zIHN1Y2ggYXMgTkFORF9CQlRfVVNFX0ZMQVNIICovCisJaW5mby0+Y2hpcC5iYnRfb3B0aW9ucwk9IHBkYXRhLT5iYnRfb3B0aW9uczsKKwkvKiBvcHRpb25zIHN1Y2ggYXMgMTYtYml0IHdpZHRocyAqLwogCWluZm8tPmNoaXAub3B0aW9ucwk9IHBkYXRhLT5vcHRpb25zOwogCWluZm8tPmNoaXAuYmJ0X3RkCT0gcGRhdGEtPmJidF90ZDsKIAlpbmZvLT5jaGlwLmJidF9tZAk9IHBkYXRhLT5iYnRfbWQ7CkBAIC03NTEsMzMgKzc1MCw4IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX3NjYW47CiAKLQlpZiAobXRkX2hhc19jbWRsaW5lcGFydCgpKSB7Ci0JCXN0YXRpYyBjb25zdCBjaGFyICpwcm9iZXNbXSBfX2luaXRjb25zdCA9IHsKLQkJCSJjbWRsaW5lcGFydCIsIE5VTEwKLQkJfTsKLQotCQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmaW5mby0+bXRkLCBwcm9iZXMsCi0JCQkJCQkgICAgJm10ZF9wYXJ0cywgMCk7Ci0JfQotCi0JaWYgKG10ZF9wYXJ0c19uYiA8PSAwKSB7Ci0JCW10ZF9wYXJ0cyA9IHBkYXRhLT5wYXJ0czsKLQkJbXRkX3BhcnRzX25iID0gcGRhdGEtPm5yX3BhcnRzOwotCX0KLQotCS8qIFJlZ2lzdGVyIGFueSBwYXJ0aXRpb25zICovCi0JaWYgKG10ZF9wYXJ0c19uYiA+IDApIHsKLQkJcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBtdGRfcGFydHMsCi0JCQkJCSAgbXRkX3BhcnRzX25iKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJaW5mby0+cGFydGl0aW9uZWQgPSB0cnVlOwotCX0KLQotCS8qIElmIHRoZXJlJ3Mgbm8gcGFydGl0aW9uIGluZm8sIGp1c3QgcGFja2FnZSB0aGUgd2hvbGUgY2hpcAotCSAqIGFzIGEgc2luZ2xlIE1URCBkZXZpY2UuCi0JICovCi0JaWYgKCFpbmZvLT5wYXJ0aXRpb25lZCkKLQkJcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwKSA/IC1FTk9ERVYgOiAwOworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgTlVMTCwgMCwKKwkJCXBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKIAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9zY2FuOwpAQCAtODE2LDkgKzc5MCw2IEBACiBzdGF0aWMgaW50IF9fZXhpdCBuYW5kX2RhdmluY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRhdmluY2lfbmFuZF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IG10ZF9kZXZpY2VfdW5yZWdpc3RlcigmaW5mby0+bXRkKTsKIAogCXNwaW5fbG9ja19pcnEoJmRhdmluY2lfbmFuZF9sb2NrKTsKIAlpZiAoaW5mby0+Y2hpcC5lY2MubW9kZSA9PSBOQU5EX0VDQ19IV19TWU5EUk9NRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMgYi9kcml2ZXJzL210ZC9uYW5kL2RlbmFsaS5jCmluZGV4IGQ1Mjc2MjEuLjM5ODRkNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZGVuYWxpLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9kZW5hbGkuYwpAQCAtMTM0Niw2ICsxMzQ2LDcgQEAKIAkgKiAqLwogCWRlbmFsaS0+YmJ0c2tpcGJ5dGVzID0gaW9yZWFkMzIoZGVuYWxpLT5mbGFzaF9yZWcgKwogCQkJCQkJU1BBUkVfQVJFQV9TS0lQX0JZVEVTKTsKKwlkZXRlY3RfbWF4X2JhbmtzKGRlbmFsaSk7CiAJZGVuYWxpX25hbmRfcmVzZXQoZGVuYWxpKTsKIAlpb3dyaXRlMzIoMHgwRiwgZGVuYWxpLT5mbGFzaF9yZWcgKyBSQl9QSU5fRU5BQkxFRCk7CiAJaW93cml0ZTMyKENISVBfRU5fRE9OVF9DQVJFX19GTEFHLApAQCAtMTM1Niw3ICsxMzU3LDYgQEAKIAkvKiBTaG91bGQgc2V0IHZhbHVlIGZvciB0aGVzZSByZWdpc3RlcnMgd2hlbiBpbml0ICovCiAJaW93cml0ZTMyKDAsIGRlbmFsaS0+Zmxhc2hfcmVnICsgVFdPX1JPV19BRERSX0NZQ0xFUyk7CiAJaW93cml0ZTMyKDEsIGRlbmFsaS0+Zmxhc2hfcmVnICsgRUNDX0VOQUJMRSk7Ci0JZGV0ZWN0X21heF9iYW5rcyhkZW5hbGkpOwogCWRlbmFsaV9uYW5kX3RpbWluZ19zZXQoZGVuYWxpKTsKIAlkZW5hbGlfaXJxX2luaXQoZGVuYWxpKTsKIH0KQEAgLTE1NzcsNyArMTU3Nyw4IEBACiAJZGVuYWxpLT5uYW5kLmJidF9tZCA9ICZiYnRfbWlycm9yX2Rlc2NyOwogCiAJLyogc2tpcCB0aGUgc2NhbiBmb3Igbm93IHVudGlsIHdlIGhhdmUgT09CIHJlYWQgYW5kIHdyaXRlIHN1cHBvcnQgKi8KLQlkZW5hbGktPm5hbmQub3B0aW9ucyB8PSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX1NLSVBfQkJUU0NBTjsKKwlkZW5hbGktPm5hbmQuYmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOworCWRlbmFsaS0+bmFuZC5vcHRpb25zIHw9IE5BTkRfU0tJUF9CQlRTQ0FOOwogCWRlbmFsaS0+bmFuZC5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOwogCiAJLyogRGVuYWxpIENvbnRyb2xsZXIgb25seSBzdXBwb3J0IDE1Yml0IGFuZCA4Yml0IEVDQyBpbiBNUlNULApAQCAtMTY3Niw3ICsxNjc3LDYgQEAKIAlzdHJ1Y3QgZGVuYWxpX25hbmRfaW5mbyAqZGVuYWxpID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAKIAluYW5kX3JlbGVhc2UoJmRlbmFsaS0+bXRkKTsKLQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoJmRlbmFsaS0+bXRkKTsKIAogCWRlbmFsaV9pcnFfY2xlYW51cChkZXYtPmlycSwgZGVuYWxpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwppbmRleCA3ODM3NzI4Li41NzgwZGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvaW5mdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogV2hlcmUgdG8gbG9vayBmb3IgdGhlIGRldmljZXM/ICovCiAjaWZuZGVmIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MKQEAgLTEzMiw3ICsxMzMsNyBAQAogCiAvKgogICogVGhlIEhXIGRlY29kZXIgaW4gdGhlIERvQyBBU0lDJ3MgcHJvdmlkZXMgdXMgYSBlcnJvciBzeW5kcm9tZSwKLSAqIHdoaWNoIHdlIG11c3QgY29udmVydCB0byBhIHN0YW5kYXJkIHN5bmRyb20gdXNhYmxlIGJ5IHRoZSBnZW5lcmljCisgKiB3aGljaCB3ZSBtdXN0IGNvbnZlcnQgdG8gYSBzdGFuZGFyZCBzeW5kcm9tZSB1c2FibGUgYnkgdGhlIGdlbmVyaWMKICAqIFJlZWQtU29sb21vbiBsaWJyYXJ5IGNvZGUuCiAgKgogICogRmFicmljZSBCZWxsYXJkIGZpZ3VyZWQgdGhpcyBvdXQgaW4gdGhlIG9sZCBkb2NlY2MgY29kZS4gSSBhZGRlZApAQCAtMTUzLDcgKzE1NCw3IEBACiAJZHNbM10gPSAoKGVjY1szXSAmIDB4YzApID4+IDYpIHwgKChlY2NbMF0gJiAweGZmKSA8PCAyKTsKIAlwYXJpdHkgPSBlY2NbMV07CiAKLQkvKiBJbml0aWFsaXplIHRoZSBzeW5kcm9tIGJ1ZmZlciAqLworCS8qIEluaXRpYWxpemUgdGhlIHN5bmRyb21lIGJ1ZmZlciAqLwogCWZvciAoaSA9IDA7IGkgPCBOUk9PVFM7IGkrKykKIAkJc1tpXSA9IGRzWzBdOwogCS8qCkBAIC0xMDMxLDcgKzEwMzIsNyBAQAogCQlXcml0ZURPQyhET0NfRUNDX0RJUywgZG9jcHRyLCBNcGx1c19FQ0NDb25mKTsKIAllbHNlCiAJCVdyaXRlRE9DKERPQ19FQ0NfRElTLCBkb2NwdHIsIEVDQ0NvbmYpOwotCWlmIChub19lY2NfZmFpbHVyZXMgJiYgKHJldCA9PSAtRUJBRE1TRykpIHsKKwlpZiAobm9fZWNjX2ZhaWx1cmVzICYmIG10ZF9pc19lY2NlcnIocmV0KSkgewogCQlwcmludGsoS0VSTl9FUlIgInN1cHByZXNzaW5nIEVDQyBmYWlsdXJlXG4iKTsKIAkJcmV0ID0gMDsKIAl9CkBAIC0xNjUyLDcgKzE2NTMsNyBAQAogCW5hbmQtPmVjYy5tb2RlCQk9IE5BTkRfRUNDX0hXX1NZTkRST01FOwogCW5hbmQtPmVjYy5zaXplCQk9IDUxMjsKIAluYW5kLT5lY2MuYnl0ZXMJCT0gNjsKLQluYW5kLT5vcHRpb25zCQk9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwluYW5kLT5iYnRfb3B0aW9ucwk9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAogCWRvYy0+cGh5c2FkcgkJPSBwaHlzYWRyOwogCWRvYy0+dmlydGFkcgkJPSB2aXJ0YWRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9lZGI3MzEyLmMgYi9kcml2ZXJzL210ZC9uYW5kL2VkYjczMTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMGQwZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2VkYjczMTIuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogIGRyaXZlcnMvbXRkL25hbmQvZWRiNzMxMi5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBNYXJpdXMgR3LDtmdlciAobWFnQHN5c2dvLmRlKQotICoKLSAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9hdXRjcHUxMi5jCi0gKiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhvbWFzIEdsZWl4bmVyIChnbGVpeG5lckBhdXRyb25peC5kZSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBPdmVydmlldzoKLSAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKLSAqICAgQ0xFUDczMTIgYm9hcmQgd2hpY2ggdXRpbGl6ZXMgdGhlIFRvc2hpYmEgVEM1OFY2NEFGVCBwYXJ0LiBUaGlzIGlzCi0gKiAgIGEgNjRNaWJpdCAoOE1pQiB4IDggYml0cykgTkFORCBmbGFzaCBkZXZpY2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CS8qIGZvciBDTFBTNzExMV9WSVJUX0JBU0UgKi8KLSNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xwczcxMTEuaD4KLQotLyoKLSAqIE1URCBzdHJ1Y3R1cmUgZm9yIEVEQjczMTIgYm9hcmQKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqZXA3MzEyX210ZCA9IE5VTEw7Ci0KLS8qCi0gKiBWYWx1ZXMgc3BlY2lmaWMgdG8gdGhlIEVEQjczMTIgYm9hcmQgKHVzZWQgd2l0aCBFUDczMTIgcHJvY2Vzc29yKQotICovCi0jZGVmaW5lIEVQNzMxMl9GSU9fUEJBU0UgMHgxMDAwMDAwMAkvKiBQaHlzIGFkZHJlc3Mgb2YgZmxhc2ggKi8KLSNkZWZpbmUgRVA3MzEyX1BYRFIJMHgwMDAxCS8qCi0JCQkJICogSU8gb2Zmc2V0IHRvIFBvcnQgQiBkYXRhIHJlZ2lzdGVyCi0JCQkJICogd2hlcmUgdGhlIENMRSwgQUxFIGFuZCBOQ0UgcGlucwotCQkJCSAqIGFyZSB3aXJlZCB0by4KLQkJCQkgKi8KLSNkZWZpbmUgRVA3MzEyX1BYRERSCTB4MDA0MQkvKgotCQkJCSAqIElPIG9mZnNldCB0byBQb3J0IEIgZGF0YSBkaXJlY3Rpb24KLQkJCQkgKiByZWdpc3RlciBzbyB3ZSBjYW4gY29udHJvbCB0aGUgSU8KLQkJCQkgKiBsaW5lcy4KLQkJCQkgKi8KLQotLyoKLSAqIE1vZHVsZSBzdHVmZgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVwNzMxMl9maW9fcGJhc2UgPSBFUDczMTJfRklPX1BCQVNFOwotc3RhdGljIHZvaWQgX19pb21lbSAqZXA3MzEyX3B4ZHIgPSAodm9pZCBfX2lvbWVtICopRVA3MzEyX1BYRFI7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICplcDczMTJfcHhkZHIgPSAodm9pZCBfX2lvbWVtICopRVA3MzEyX1BYRERSOwotCi0vKgotICogRGVmaW5lIHN0YXRpYyBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW10gPSB7Ci0Jey5uYW1lID0gIkVQNzMxMiBOYW5kIEZsYXNoIiwKLQkgLm9mZnNldCA9IDAsCi0JIC5zaXplID0gOCAqIDEwMjQgKiAxMDI0fQotfTsKLQotI2RlZmluZSBOVU1fUEFSVElUSU9OUyAxCi0KLS8qCi0gKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcwotICoKLSAqCU5BTkRfTkNFOiBiaXQgMCAtPiBiaXQgNiAoYml0IDcgPSAxKQotICoJTkFORF9DTEU6IGJpdCAxIC0+IGJpdCA0Ci0gKglOQU5EX0FMRTogYml0IDIgLT4gYml0IDUKLSAqLwotc3RhdGljIHZvaWQgZXA3MzEyX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwgdW5zaWduZWQgaW50IGN0cmwpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKLQotCWlmIChjdHJsICYgTkFORF9DVFJMX0NIQU5HRSkgewotCQl1bnNpZ25lZCBjaGFyIGJpdHMgPSAweDgwOwotCi0JCWJpdHMgfD0gKGN0cmwgJiAoTkFORF9DTEUgfCBOQU5EX0FMRSkpIDw8IDM7Ci0JCWJpdHMgfD0gKGN0cmwgJiBOQU5EX05DRSkgPyAweDAwIDogMHg0MDsKLQotCQljbHBzX3dyaXRlYigoY2xwc19yZWFkYihlcDczMTJfcHhkcikgICYgMHhGMCkgfCBiaXRzLAotCQkJICAgIGVwNzMxMl9weGRyKTsKLQl9Ci0JaWYgKGNtZCAhPSBOQU5EX0NNRF9OT05FKQotCQl3cml0ZWIoY21kLCBjaGlwLT5JT19BRERSX1cpOwotfQotCi0vKgotICoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCi0gKi8KLXN0YXRpYyBpbnQgZXA3MzEyX2RldmljZV9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCi0vKgotICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGVwNzMxMl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSAwOwotCWludCBtdGRfcGFydHNfbmIgPSAwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgPSAwOwotCXZvaWQgX19pb21lbSAqZXA3MzEyX2Zpb19iYXNlOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCi0JZXA3MzEyX210ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCksIEdGUF9LRVJORUwpOwotCWlmICghZXA3MzEyX210ZCkgewotCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBFREI3MzEyIE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQllcDczMTJfZmlvX2Jhc2UgPSBpb3JlbWFwKGVwNzMxMl9maW9fcGJhc2UsIFNaXzFLKTsKLQlpZiAoIWVwNzMxMl9maW9fYmFzZSkgewotCQlwcmludGsoImlvcmVtYXAgRURCNzMxMiBOQU5EIGZsYXNoIGZhaWxlZFxuIik7Ci0JCWtmcmVlKGVwNzMxMl9tdGQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBHZXQgcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KLQl0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikoJmVwNzMxMl9tdGRbMV0pOwotCi0JLyogSW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzICovCi0JbWVtc2V0KGVwNzMxMl9tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQodGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKLQotCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCi0JZXA3MzEyX210ZC0+cHJpdiA9IHRoaXM7Ci0JZXA3MzEyX210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCS8qCi0JICogU2V0IEdQSU8gUG9ydCBCIGNvbnRyb2wgcmVnaXN0ZXIgc28gdGhhdCB0aGUgcGlucyBhcmUgY29uZmlndXJlZAotCSAqIHRvIGJlIG91dHB1dHMgZm9yIGNvbnRyb2xsaW5nIHRoZSBOQU5EIGZsYXNoLgotCSAqLwotCWNscHNfd3JpdGViKDB4ZjAsIGVwNzMxMl9weGRkcik7Ci0KLQkvKiBpbnNlcnQgY2FsbGJhY2tzICovCi0JdGhpcy0+SU9fQUREUl9SID0gZXA3MzEyX2Zpb19iYXNlOwotCXRoaXMtPklPX0FERFJfVyA9IGVwNzMxMl9maW9fYmFzZTsKLQl0aGlzLT5jbWRfY3RybCA9IGVwNzMxMl9od2NvbnRyb2w7Ci0JdGhpcy0+ZGV2X3JlYWR5ID0gZXA3MzEyX2RldmljZV9yZWFkeTsKLQkvKiAxNSB1cyBjb21tYW5kIGRlbGF5IHRpbWUgKi8KLQl0aGlzLT5jaGlwX2RlbGF5ID0gMTU7Ci0KLQkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KLQlpZiAobmFuZF9zY2FuKGVwNzMxMl9tdGQsIDEpKSB7Ci0JCWlvdW5tYXAoKHZvaWQgKillcDczMTJfZmlvX2Jhc2UpOwotCQlrZnJlZShlcDczMTJfbXRkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JZXA3MzEyX210ZC0+bmFtZSA9ICJlZGI3MzEyLW5hbmQiOwotCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGVwNzMxMl9tdGQsIHBhcnRfcHJvYmVzLCAmbXRkX3BhcnRzLCAwKTsKLQlpZiAobXRkX3BhcnRzX25iID4gMCkKLQkJcGFydF90eXBlID0gImNvbW1hbmQgbGluZSI7Ci0JZWxzZQotCQltdGRfcGFydHNfbmIgPSAwOwotCWlmIChtdGRfcGFydHNfbmIgPT0gMCkgewotCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mbzsKLQkJbXRkX3BhcnRzX25iID0gTlVNX1BBUlRJVElPTlM7Ci0JCXBhcnRfdHlwZSA9ICJzdGF0aWMiOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJVc2luZyAlcyBwYXJ0aXRpb24gZGVmaW5pdGlvblxuIiwgcGFydF90eXBlKTsKLQltdGRfZGV2aWNlX3JlZ2lzdGVyKGVwNzMxMl9tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLQotCS8qIFJldHVybiBoYXBweSAqLwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChlcDczMTJfaW5pdCk7Ci0KLS8qCi0gKiBDbGVhbiB1cCByb3V0aW5lCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBlcDczMTJfY2xlYW51cCh2b2lkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSZlcDczMTJfbXRkWzFdOwotCi0JLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCi0JbmFuZF9yZWxlYXNlKGFwNzMxMl9tdGQpOwotCi0JLyogUmVsZWFzZSBpbyByZXNvdXJjZSAqLwotCWlvdW5tYXAodGhpcy0+SU9fQUREUl9SKTsKLQotCS8qIEZyZWUgdGhlIE1URCBkZXZpY2Ugc3RydWN0dXJlICovCi0Ja2ZyZWUoZXA3MzEyX210ZCk7Ci19Ci0KLW1vZHVsZV9leGl0KGVwNzMxMl9jbGVhbnVwKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWFyaXVzIEdyb2VnZXIgPG1hZ0BzeXNnby5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIENvZ2VudCBFREI3MzEyIGJvYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCmluZGV4IDMzZDhhYWQuLmVlZGQ4ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCkBAIC03NSw3ICs3NSw2IEBACiAJdW5zaWduZWQgaW50IHVzZV9tZHI7ICAgIC8qIE5vbiB6ZXJvIGlmIHRoZSBNRFIgaXMgdG8gYmUgc2V0ICAgICAgKi8KIAl1bnNpZ25lZCBpbnQgb29iOyAgICAgICAgLyogTm9uIHplcm8gaWYgb3BlcmF0aW5nIG9uIE9PQiBkYXRhICAgICAqLwogCXVuc2lnbmVkIGludCBjb3VudGVyOwkgLyogY291bnRlciBmb3IgdGhlIGluaXRpYWxpemF0aW9ucwkgICovCi0JY2hhciAqb29iX3BvaTsgICAgICAgICAgIC8qIFBsYWNlIHRvIHdyaXRlIEVDQyBhZnRlciByZWFkIGJhY2sgICAgKi8KIH07CiAKIC8qIFRoZXNlIG1hcCB0byB0aGUgcG9zaXRpb25zIHVzZWQgYnkgdGhlIEZDTSBoYXJkd2FyZSBFQ0MgZ2VuZXJhdG9yICovCkBAIC0yNDQsNiArMjQzLDI1IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCWlmIChjaGlwLT5lY2MubW9kZSAhPSBOQU5EX0VDQ19IVykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZWxiY19mY21fY3RybC0+cmVhZF9ieXRlcyA9PSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSkgeworCQl1aW50MzJfdCBsdGVjY3IgPSBpbl9iZTMyKCZsYmMtPmx0ZWNjcik7CisJCS8qCisJCSAqIGlmIGNvbW1hbmQgd2FzIGEgZnVsbCBwYWdlIHJlYWQgYW5kIHRoZSBFTEJDCisJCSAqIGhhcyB0aGUgTFRFQ0NSIHJlZ2lzdGVyLCB0aGVuIGJpdHMgMTItMTUgKHBwYyBvcmRlcikgb2YKKwkJICogTFRFQ0NSIGluZGljYXRlcyB3aGljaCA1MTIgYnl0ZSBzdWItcGFnZXMgaGFkIGZpeGVkIGVycm9ycy4KKwkJICogYml0cyAyOC0zMSBhcmUgdW5jb3JyZWN0YWJsZSBlcnJvcnMsIG1hcmtlZCBlbHNld2hlcmUuCisJCSAqIGZvciBzbWFsbCBwYWdlIG5hbmQgb25seSAxIGJpdCBpcyB1c2VkLgorCQkgKiBpZiB0aGUgRUxCQyBkb2Vzbid0IGhhdmUgdGhlIGx0ZWNjciByZWdpc3RlciBpdCByZWFkcyAwCisJCSAqLworCQlpZiAobHRlY2NyICYgMHgwMDBGMDAwRikKKwkJCW91dF9iZTMyKCZsYmMtPmx0ZWNjciwgMHgwMDBGMDAwRik7IC8qIGNsZWFyIGx0ZWNjciAqLworCQlpZiAobHRlY2NyICYgMHgwMDBGMDAwMCkKKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCsrOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC00MzUsNyArNDUzLDYgQEAKIAogCS8qIFBBR0VQUk9HIHJldXNlcyBhbGwgb2YgdGhlIHNldHVwIGZyb20gU0VRSU4gYW5kIGFkZHMgdGhlIGxlbmd0aCAqLwogCWNhc2UgTkFORF9DTURfUEFHRVBST0c6IHsKLQkJaW50IGZ1bGxfcGFnZTsKIAkJZGV2X3ZkYmcocHJpdi0+ZGV2LAogCQkgICAgICAgICAiZnNsX2VsYmNfY21kZnVuYzogTkFORF9DTURfUEFHRVBST0cgIgogCQkJICJ3cml0aW5nICVkIGJ5dGVzLlxuIiwgZWxiY19mY21fY3RybC0+aW5kZXgpOwpAQCAtNDQ1LDM0ICs0NjIsMTIgQEAKIAkJICogd3JpdGUgc28gdGhlIEhXIGdlbmVyYXRlcyB0aGUgRUNDLgogCQkgKi8KIAkJaWYgKGVsYmNfZmNtX2N0cmwtPm9vYiB8fCBlbGJjX2ZjbV9jdHJsLT5jb2x1bW4gIT0gMCB8fAotCQkgICAgZWxiY19mY21fY3RybC0+aW5kZXggIT0gbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpIHsKKwkJICAgIGVsYmNfZmNtX2N0cmwtPmluZGV4ICE9IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKQogCQkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgZWxiY19mY21fY3RybC0+aW5kZXgpOwotCQkJZnVsbF9wYWdlID0gMDsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgMCk7Ci0JCQlmdWxsX3BhZ2UgPSAxOwotCQl9CiAKIAkJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKLQotCQkvKiBSZWFkIGJhY2sgdGhlIHBhZ2UgaW4gb3JkZXIgdG8gZmlsbCBpbiB0aGUgRUNDIGZvciB0aGUKLQkJICogY2FsbGVyLiAgSXMgdGhpcyByZWFsbHkgbmVlZGVkPwotCQkgKi8KLQkJaWYgKGZ1bGxfcGFnZSAmJiBlbGJjX2ZjbV9jdHJsLT5vb2JfcG9pKSB7Ci0JCQlvdXRfYmUzMigmbGJjLT5mYmNyLCAzKTsKLQkJCXNldF9hZGRyKG10ZCwgNiwgcGFnZV9hZGRyLCAxKTsKLQotCQkJZWxiY19mY21fY3RybC0+cmVhZF9ieXRlcyA9IG10ZC0+d3JpdGVzaXplICsgOTsKLQotCQkJZnNsX2VsYmNfZG9fcmVhZChjaGlwLCAxKTsKLQkJCWZzbF9lbGJjX3J1bl9jb21tYW5kKG10ZCk7Ci0KLQkJCW1lbWNweV9mcm9taW8oZWxiY19mY21fY3RybC0+b29iX3BvaSArIDYsCi0JCQkJJmVsYmNfZmNtX2N0cmwtPmFkZHJbZWxiY19mY21fY3RybC0+aW5kZXhdLCAzKTsKLQkJCWVsYmNfZmNtX2N0cmwtPmluZGV4ICs9IDM7Ci0JCX0KLQotCQllbGJjX2ZjbV9jdHJsLT5vb2JfcG9pID0gTlVMTDsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzUyLDEzICs3NDcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYpCiB7Ci0Jc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdiA9IGNoaXAtPnByaXY7Ci0Jc3RydWN0IGZzbF9lbGJjX2ZjbV9jdHJsICplbGJjX2ZjbV9jdHJsID0gcHJpdi0+Y3RybC0+bmFuZDsKLQogCWZzbF9lbGJjX3dyaXRlX2J1ZihtdGQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOwogCWZzbF9lbGJjX3dyaXRlX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7Ci0KLQllbGJjX2ZjbV9jdHJsLT5vb2JfcG9pID0gY2hpcC0+b29iX3BvaTsKIH0KIAogc3RhdGljIGludCBmc2xfZWxiY19jaGlwX2luaXQoc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdikKQEAgLTc5MSw4ICs3ODEsOCBAQAogCWNoaXAtPmJidF9tZCA9ICZiYnRfbWlycm9yX2Rlc2NyOwogCiAJLyogc2V0IHVwIG5hbmQgb3B0aW9ucyAqLwotCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX1JFQURSRFkgfCBOQU5EX05PX0FVVE9JTkNSIHwKLQkJCU5BTkRfVVNFX0ZMQVNIX0JCVDsKKwljaGlwLT5vcHRpb25zID0gTkFORF9OT19SRUFEUkRZIHwgTkFORF9OT19BVVRPSU5DUjsKKwljaGlwLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAogCWNoaXAtPmNvbnRyb2xsZXIgPSAmZWxiY19mY21fY3RybC0+Y29udHJvbGxlcjsKIAljaGlwLT5wcml2ID0gcHJpdjsKQEAgLTgyOSw3ICs4MTksNiBAQAogCiAJZWxiY19mY21fY3RybC0+Y2hpcHNbcHJpdi0+YmFua10gPSBOVUxMOwogCWtmcmVlKHByaXYpOwotCWtmcmVlKGVsYmNfZmNtX2N0cmwpOwogCXJldHVybiAwOwogfQogCkBAIC04NDIsMTMgKzgzMSwxNCBAQAogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IGZzbF9lbGJjX2ZjbV9jdHJsICplbGJjX2ZjbV9jdHJsOwogCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzW10KLQkJPSB7ICJjbWRsaW5lcGFydCIsICJSZWRCb290IiwgTlVMTCB9OwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwkJPSB7ICJjbWRsaW5lcGFydCIsICJSZWRCb290IiwgIm9mcGFydCIsIE5VTEwgfTsKIAlpbnQgcmV0OwogCWludCBiYW5rOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgcHBkYXRhOwogCisJcHBkYXRhLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlpZiAoIWZzbF9sYmNfY3RybF9kZXYgfHwgIWZzbF9sYmNfY3RybF9kZXYtPnJlZ3MpCiAJCXJldHVybiAtRU5PREVWOwogCWxiYyA9IGZzbF9sYmNfY3RybF9kZXYtPnJlZ3M7CkBAIC05MzQsMTcgKzkyNCw4IEBACiAKIAkvKiBGaXJzdCBsb29rIGZvciBSZWRCb290IHRhYmxlIG9yIHBhcnRpdGlvbnMgb24gdGhlIGNvbW1hbmQKIAkgKiBsaW5lLCB0aGVzZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBkZXZpY2UgdHJlZSBpbmZvcm1hdGlvbiAqLwotCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZwcml2LT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsICZwYXJ0cywgMCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKHByaXYtPmRldiwgbm9kZSwgJnBhcnRzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQltdGRfZGV2aWNlX3JlZ2lzdGVyKCZwcml2LT5tdGQsIHBhcnRzLCByZXQpOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJnByaXYtPm10ZCwgcGFydF9wcm9iZV90eXBlcywgJnBwZGF0YSwKKwkJCQkgIE5VTEwsIDApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiZUxCQyBOQU5EIGRldmljZSBhdCAweCVsbHgsIGJhbmsgJWRcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLnN0YXJ0LCBwcml2LT5iYW5rKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKaW5kZXggMjM3NTJmZC4uYjRmM2NjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpmbGFzaF9ucDsKLQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF90eXBlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCB9OworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAKIAlmdW4tPmNoaXAuSU9fQUREUl9SID0gZnVuLT5pb19iYXNlOwogCWZ1bi0+Y2hpcC5JT19BRERSX1cgPSBmdW4tPmlvX2Jhc2U7CkBAIC0xOTIsMTggKzE5MiwxMiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmZ1bi0+bXRkLCBwYXJ0X3R5cGVzLCAmZnVuLT5wYXJ0cywgMCk7Ci0KLSNpZmRlZiBDT05GSUdfTVREX09GX1BBUlRTCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKGZ1bi0+ZGV2LCBmbGFzaF9ucCwgJmZ1bi0+cGFydHMpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCX0KLSNlbmRpZgotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmZ1bi0+bXRkLCBmdW4tPnBhcnRzLCByZXQpOworCXBwZGF0YS5vZl9ub2RlID0gZmxhc2hfbnA7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmZnVuLT5tdGQsIE5VTEwsICZwcGRhdGEsIE5VTEwsIDApOwogZXJyOgogCW9mX25vZGVfcHV0KGZsYXNoX25wKTsKKwlpZiAocmV0KQorCQlrZnJlZShmdW4tPm10ZC5uYW1lKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbWNfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc21jX25hbmQuYwppbmRleCBlOWIyNzVhLi5lNTNiNzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbWNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZnNtY19uYW5kLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCXsKIAkJLm5hbWUgPSAiUm9vdCBGaWxlIFN5c3RlbSIsCiAJCS5vZmZzZXQgPSAweDQ2MDAwMCwKLQkJLnNpemUgPSAwLAorCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCiAJfSwKIH07CiAKQEAgLTE3MywxMyArMTczLDEwIEBACiAJewogCQkubmFtZSA9ICJSb290IEZpbGUgU3lzdGVtIiwKIAkJLm9mZnNldCA9IDB4ODAwMDAwLAotCQkuc2l6ZSA9IDAsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotI2VuZGlmCiAKIC8qKgogICogc3RydWN0IGZzbWNfbmFuZF9kYXRhIC0gc3RydWN0dXJlIGZvciBGU01DIE5BTkQgZGV2aWNlIHN0YXRlCkBAIC0xODcsOCArMTg0LDYgQEAKICAqIEBwaWQ6CQlQYXJ0IElEIG9uIHRoZSBBTUJBIFByaW1lQ2VsbCBmb3JtYXQKICAqIEBtdGQ6CQlNVEQgaW5mbyBmb3IgYSBOQU5EIGZsYXNoLgogICogQG5hbmQ6CQlDaGlwIHJlbGF0ZWQgaW5mbyBmb3IgYSBOQU5EIGZsYXNoLgotICogQHBhcnRpdGlvbnM6CQlQYXJ0aXRpb24gaW5mbyBmb3IgYSBOQU5EIEZsYXNoLgotICogQG5yX3BhcnRpdGlvbnM6CVRvdGFsIG51bWJlciBvZiBwYXJ0aXRpb24gb2YgYSBOQU5EIGZsYXNoLgogICoKICAqIEBlY2NfcGxhY2U6CQlFQ0MgcGxhY2luZyBsb2NhdGlvbnMgaW4gb29iZnJlZSB0eXBlIGZvcm1hdC4KICAqIEBiYW5rOgkJQmFuayBudW1iZXIgZm9yIHByb2JlZCBkZXZpY2UuCkBAIC0yMDMsOCArMTk4LDYgQEAKIAl1MzIJCQlwaWQ7CiAJc3RydWN0IG10ZF9pbmZvCQltdGQ7CiAJc3RydWN0IG5hbmRfY2hpcAluYW5kOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0aXRpb25zOwotCXVuc2lnbmVkIGludAkJbnJfcGFydGl0aW9uczsKIAogCXN0cnVjdCBmc21jX2VjY3BsYWNlCSplY2NfcGxhY2U7CiAJdW5zaWduZWQgaW50CQliYW5rOwpAQCAtNzE2LDY1ICs3MDksMTcgQEAKIAkgKiBwbGF0Zm9ybSBkYXRhLAogCSAqIGRlZmF1bHQgcGFydGl0aW9uIGluZm9ybWF0aW9uIHByZXNlbnQgaW4gZHJpdmVyLgogCSAqLwotI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwogCS8qCi0JICogQ2hlY2sgaWYgcGFydGl0aW9uIGluZm8gcGFzc2VkIHZpYSBjb21tYW5kIGxpbmUKKwkgKiBDaGVjayBmb3IgcGFydGl0aW9uIGluZm8gcGFzc2VkCiAJICovCiAJaG9zdC0+bXRkLm5hbWUgPSAibmFuZCI7Ci0JaG9zdC0+bnJfcGFydGl0aW9ucyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZob3N0LT5tdGQsIHBhcnRfcHJvYmVzLAotCQkJJmhvc3QtPnBhcnRpdGlvbnMsIDApOwotCWlmIChob3N0LT5ucl9wYXJ0aXRpb25zIDw9IDApIHsKLSNlbmRpZgotCQkvKgotCQkgKiBDaGVjayBpZiBwYXJ0aXRpb24gaW5mbyBwYXNzZWQgdmlhIGNvbW1hbmQgbGluZQotCQkgKi8KLQkJaWYgKHBkYXRhLT5wYXJ0aXRpb25zKSB7Ci0JCQlob3N0LT5wYXJ0aXRpb25zID0gcGRhdGEtPnBhcnRpdGlvbnM7Ci0JCQlob3N0LT5ucl9wYXJ0aXRpb25zID0gcGRhdGEtPm5yX3BhcnRpdGlvbnM7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uOwotCQkJaW50IGk7Ci0KLQkJCS8qIFNlbGVjdCB0aGUgZGVmYXVsdCBwYXJ0aXRpb25zIGluZm8gKi8KLQkJCXN3aXRjaCAoaG9zdC0+bXRkLnNpemUpIHsKLQkJCWNhc2UgMHgwMTAwMDAwMDoKLQkJCWNhc2UgMHgwMjAwMDAwMDoKLQkJCWNhc2UgMHgwNDAwMDAwMDoKLQkJCQlob3N0LT5wYXJ0aXRpb25zID0gcGFydGl0aW9uX2luZm9fMTZLQl9ibGs7Ci0JCQkJaG9zdC0+bnJfcGFydGl0aW9ucyA9Ci0JCQkJCXNpemVvZihwYXJ0aXRpb25faW5mb18xNktCX2JsaykgLwotCQkJCQlzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDA4MDAwMDAwOgotCQkJY2FzZSAweDEwMDAwMDAwOgotCQkJY2FzZSAweDIwMDAwMDAwOgotCQkJY2FzZSAweDQwMDAwMDAwOgotCQkJCWhvc3QtPnBhcnRpdGlvbnMgPSBwYXJ0aXRpb25faW5mb18xMjhLQl9ibGs7Ci0JCQkJaG9zdC0+bnJfcGFydGl0aW9ucyA9Ci0JCQkJCXNpemVvZihwYXJ0aXRpb25faW5mb18xMjhLQl9ibGspIC8KLQkJCQkJc2l6ZW9mKHN0cnVjdCBtdGRfcGFydGl0aW9uKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0ID0gLUVOWElPOwotCQkJCXByX2VycigiVW5zdXBwb3J0ZWQgTkFORCBzaXplXG4iKTsKLQkJCQlnb3RvIGVycl9wcm9iZTsKLQkJCX0KLQotCQkJcGFydGl0aW9uID0gaG9zdC0+cGFydGl0aW9uczsKLQkJCWZvciAoaSA9IDA7IGkgPCBob3N0LT5ucl9wYXJ0aXRpb25zOyBpKyssIHBhcnRpdGlvbisrKSB7Ci0JCQkJaWYgKHBhcnRpdGlvbi0+c2l6ZSA9PSAwKSB7Ci0JCQkJCXBhcnRpdGlvbi0+c2l6ZSA9IGhvc3QtPm10ZC5zaXplIC0KLQkJCQkJCXBhcnRpdGlvbi0+b2Zmc2V0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQl9Ci0jZW5kaWYKLQotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmhvc3QtPm10ZCwgaG9zdC0+cGFydGl0aW9ucywKLQkJCQkgIGhvc3QtPm5yX3BhcnRpdGlvbnMpOworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmhvc3QtPm10ZCwgTlVMTCwgMCwKKwkJCWhvc3QtPm10ZC5zaXplIDw9IDB4MDQwMDAwMDAgPworCQkJCXBhcnRpdGlvbl9pbmZvXzE2S0JfYmxrIDoKKwkJCQlwYXJ0aXRpb25faW5mb18xMjhLQl9ibGssCisJCQlob3N0LT5tdGQuc2l6ZSA8PSAweDA0MDAwMDAwID8KKwkJCQlBUlJBWV9TSVpFKHBhcnRpdGlvbl9pbmZvXzE2S0JfYmxrKSA6CisJCQkJQVJSQVlfU0laRShwYXJ0aXRpb25faW5mb18xMjhLQl9ibGspKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9wcm9iZTsKIApAQCAtODIyLDcgKzc2Nyw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKIAlpZiAoaG9zdCkgewotCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIoJmhvc3QtPm10ZCk7CisJCW5hbmRfcmVsZWFzZSgmaG9zdC0+bXRkKTsKIAkJY2xrX2Rpc2FibGUoaG9zdC0+Y2xrKTsKIAkJY2xrX3B1dChob3N0LT5jbGspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDYyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK29iai0kKENPTkZJR19NVERfTkFORF9HUE1JX05BTkQpICs9IGdwbWlfbmFuZC5vCitncG1pX25hbmQtb2JqcyArPSBncG1pLW5hbmQubworZ3BtaV9uYW5kLW9ianMgKz0gZ3BtaS1saWIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvYmNoLXJlZ3MuaCBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2JjaC1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmZmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2JjaC1yZWdzLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIEZyZWVzY2FsZSBHUE1JIE5BTkQgRmxhc2ggRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMDggRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworI2lmbmRlZiBfX0dQTUlfTkFORF9CQ0hfUkVHU19ICisjZGVmaW5lIF9fR1BNSV9OQU5EX0JDSF9SRUdTX0gKKworI2RlZmluZSBIV19CQ0hfQ1RSTAkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEhXX0JDSF9DVFJMX1NFVAkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEhXX0JDSF9DVFJMX0NMUgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIEhXX0JDSF9DVFJMX1RPRwkJCQkweDAwMDAwMDBjCisKKyNkZWZpbmUgQk1fQkNIX0NUUkxfQ09NUExFVEVfSVJRX0VOCQkoMSA8PCA4KQorI2RlZmluZSBCTV9CQ0hfQ1RSTF9DT01QTEVURV9JUlEJCSgxIDw8IDApCisKKyNkZWZpbmUgSFdfQkNIX1NUQVRVUzAJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBIV19CQ0hfTU9ERQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIEhXX0JDSF9FTkNPREVQVFIJCQkweDAwMDAwMDMwCisjZGVmaW5lIEhXX0JDSF9EQVRBUFRSCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgSFdfQkNIX01FVEFQVFIJCQkJMHgwMDAwMDA1MAorI2RlZmluZSBIV19CQ0hfTEFZT1VUU0VMRUNUCQkJMHgwMDAwMDA3MAorCisjZGVmaW5lIEhXX0JDSF9GTEFTSDBMQVlPVVQwCQkJMHgwMDAwMDA4MAorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQwX05CTE9DS1MJCTI0CisjZGVmaW5lIEJNX0JDSF9GTEFTSDBMQVlPVVQwX05CTE9DS1MJKDB4ZmYgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUykKKyNkZWZpbmUgQkZfQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUyh2KQkJXAorCSgoKHYpIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQwX05CTE9DS1MpICYgQk1fQkNIX0ZMQVNIMExBWU9VVDBfTkJMT0NLUykKKworI2RlZmluZSBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9NRVRBX1NJWkUJCTE2CisjZGVmaW5lIEJNX0JDSF9GTEFTSDBMQVlPVVQwX01FVEFfU0laRQkoMHhmZiA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9NRVRBX1NJWkUpCisjZGVmaW5lIEJGX0JDSF9GTEFTSDBMQVlPVVQwX01FVEFfU0laRSh2KQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfTUVUQV9TSVpFKVwKKwkJCQkJICYgQk1fQkNIX0ZMQVNIMExBWU9VVDBfTUVUQV9TSVpFKQorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzAJCTEyCisjZGVmaW5lIEJNX0JDSF9GTEFTSDBMQVlPVVQwX0VDQzAJKDB4ZiA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMF9FQ0MwKQorI2RlZmluZSBCRl9CQ0hfRkxBU0gwTEFZT1VUMF9FQ0MwKHYpCQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDBfRUNDMCkgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMF9FQ0MwKQorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQwX0RBVEEwX1NJWkUJCTAKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRQkJXAorCQkJKDB4ZmZmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQwX0RBVEEwX1NJWkUpCisjZGVmaW5lIEJGX0JDSF9GTEFTSDBMQVlPVVQwX0RBVEEwX1NJWkUodikJXAorCSgoKHYpIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQwX0RBVEEwX1NJWkUpXAorCQkJCQkgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMF9EQVRBMF9TSVpFKQorCisjZGVmaW5lIEhXX0JDSF9GTEFTSDBMQVlPVVQxCQkJMHgwMDAwMDA5MAorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQxX1BBR0VfU0laRQkJMTYKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFCQlcCisJCQkoMHhmZmZmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQxX1BBR0VfU0laRSkKKyNkZWZpbmUgQkZfQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFKHYpCVwKKwkoKCh2KSA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMV9QQUdFX1NJWkUpIFwKKwkJCQkJICYgQk1fQkNIX0ZMQVNIMExBWU9VVDFfUEFHRV9TSVpFKQorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04JCTEyCisjZGVmaW5lIEJNX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04JKDB4ZiA8PCBCUF9CQ0hfRkxBU0gwTEFZT1VUMV9FQ0NOKQorI2RlZmluZSBCRl9CQ0hfRkxBU0gwTEFZT1VUMV9FQ0NOKHYpCQlcCisJKCgodikgPDwgQlBfQkNIX0ZMQVNIMExBWU9VVDFfRUNDTikgJiBCTV9CQ0hfRkxBU0gwTEFZT1VUMV9FQ0NOKQorCisjZGVmaW5lIEJQX0JDSF9GTEFTSDBMQVlPVVQxX0RBVEFOX1NJWkUJCTAKKyNkZWZpbmUgQk1fQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRQkJXAorCQkJKDB4ZmZmIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQxX0RBVEFOX1NJWkUpCisjZGVmaW5lIEJGX0JDSF9GTEFTSDBMQVlPVVQxX0RBVEFOX1NJWkUodikJXAorCSgoKHYpIDw8IEJQX0JDSF9GTEFTSDBMQVlPVVQxX0RBVEFOX1NJWkUpIFwKKwkJCQkJICYgQk1fQkNIX0ZMQVNIMExBWU9VVDFfREFUQU5fU0laRSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1saWIuYyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZGI3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLWxpYi5jCkBAIC0wLDAgKzEsMTA1NyBAQAorLyoKKyAqIEZyZWVzY2FsZSBHUE1JIE5BTkQgRmxhc2ggRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbXRkL2dwbWktbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bWFjaC9teHMuaD4KKworI2luY2x1ZGUgImdwbWktbmFuZC5oIgorI2luY2x1ZGUgImdwbWktcmVncy5oIgorI2luY2x1ZGUgImJjaC1yZWdzLmgiCisKK3N0cnVjdCB0aW1pbmdfdGhyZXNob2QgdGltaW5nX2RlZmF1bHRfdGhyZXNob2xkID0geworCS5tYXhfZGF0YV9zZXR1cF9jeWNsZXMgICAgICAgPSAoQk1fR1BNSV9USU1JTkcwX0RBVEFfU0VUVVAgPj4KKwkJCQkJCUJQX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQKSwKKwkuaW50ZXJuYWxfZGF0YV9zZXR1cF9pbl9ucyAgID0gMCwKKwkubWF4X3NhbXBsZV9kZWxheV9mYWN0b3IgICAgID0gKEJNX0dQTUlfQ1RSTDFfUkROX0RFTEFZID4+CisJCQkJCQlCUF9HUE1JX0NUUkwxX1JETl9ERUxBWSksCisJLm1heF9kbGxfY2xvY2tfcGVyaW9kX2luX25zICA9IDMyLAorCS5tYXhfZGxsX2RlbGF5X2luX25zICAgICAgICAgPSAxNiwKK307CisKKy8qCisgKiBDbGVhciB0aGUgYml0IGFuZCBwb2xsIGl0IGNsZWFyZWQuICBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkIHdpdGgKKyAqIGEgcmVzZXQgYWRkcmVzcyBhbmQgbWFzayBiZWluZyBlaXRoZXIgU0ZUUlNUKGJpdCAzMSkgb3IgQ0xLR0FURQorICogKGJpdCAzMCkuCisgKi8KK3N0YXRpYyBpbnQgY2xlYXJfcG9sbF9iaXQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgbWFzaykKK3sKKwlpbnQgdGltZW91dCA9IDB4NDAwOworCisJLyogY2xlYXIgdGhlIGJpdCAqLworCV9fbXhzX2NscmwobWFzaywgYWRkcik7CisKKwkvKgorCSAqIFNGVFJTVCBuZWVkcyAzIEdQTUkgY2xvY2tzIHRvIHNldHRsZSwgdGhlIHJlZmVyZW5jZSBtYW51YWwKKwkgKiByZWNvbW1lbmRzIHRvIHdhaXQgMXVzLgorCSAqLworCXVkZWxheSgxKTsKKworCS8qIHBvbGwgdGhlIGJpdCBiZWNvbWluZyBjbGVhciAqLworCXdoaWxlICgocmVhZGwoYWRkcikgJiBtYXNrKSAmJiAtLXRpbWVvdXQpCisJCS8qIG5vdGhpbmcgKi87CisKKwlyZXR1cm4gIXRpbWVvdXQ7Cit9CisKKyNkZWZpbmUgTU9EVUxFX0NMS0dBVEUJCSgxIDw8IDMwKQorI2RlZmluZSBNT0RVTEVfU0ZUUlNUCQkoMSA8PCAzMSkKKy8qCisgKiBUaGUgY3VycmVudCBteHNfcmVzZXRfYmxvY2soKSB3aWxsIGRvIHR3byB0aGluZ3M6CisgKiAgWzFdIGVuYWJsZSB0aGUgbW9kdWxlLgorICogIFsyXSByZXNldCB0aGUgbW9kdWxlLgorICoKKyAqIEluIG1vc3Qgb2YgdGhlIGNhc2VzLCBpdCdzIG9rLiBCdXQgdGhlcmUgaXMgYSBoYXJkd2FyZSBidWcgaW4gdGhlIEJDSCBibG9jay4KKyAqIElmIHlvdSB0cnkgdG8gc29mdCByZXNldCB0aGUgQkNIIGJsb2NrLCBpdCBiZWNvbWVzIHVudXNhYmxlIHVudGlsCisgKiB0aGUgbmV4dCBoYXJkIHJlc2V0LiBUaGlzIGNhc2Ugb2NjdXJzIGluIHRoZSBOQU5EIGJvb3QgbW9kZS4gV2hlbiB0aGUgYm9hcmQKKyAqIGJvb3RzIGJ5IE5BTkQsIHRoZSBST00gb2YgdGhlIGNoaXAgd2lsbCBpbml0aWFsaXplIHRoZSBCQ0ggYmxvY2tzIGl0c2VsZi4KKyAqIFNvIElmIHRoZSBkcml2ZXIgdHJpZXMgdG8gcmVzZXQgdGhlIEJDSCBhZ2FpbiwgdGhlIEJDSCB3aWxsIG5vdCB3b3JrIGFueW1vcmUuCisgKiBZb3Ugd2lsbCBzZWUgYSBETUEgdGltZW91dCBpbiB0aGlzIGNhc2UuCisgKgorICogVG8gYXZvaWQgdGhpcyBidWcsIGp1c3QgYWRkIGEgbmV3IHBhcmFtZXRlciBganVzdF9lbmFibGVgIGZvcgorICogdGhlIG14c19yZXNldF9ibG9jaygpLCBhbmQgcmV3cml0ZSBpdCBoZXJlLgorICovCitpbnQgZ3BtaV9yZXNldF9ibG9jayh2b2lkIF9faW9tZW0gKnJlc2V0X2FkZHIsIGJvb2wganVzdF9lbmFibGUpCit7CisJaW50IHJldDsKKwlpbnQgdGltZW91dCA9IDB4NDAwOworCisJLyogY2xlYXIgYW5kIHBvbGwgU0ZUUlNUICovCisJcmV0ID0gY2xlYXJfcG9sbF9iaXQocmVzZXRfYWRkciwgTU9EVUxFX1NGVFJTVCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBDTEtHQVRFICovCisJX19teHNfY2xybChNT0RVTEVfQ0xLR0FURSwgcmVzZXRfYWRkcik7CisKKwlpZiAoIWp1c3RfZW5hYmxlKSB7CisJCS8qIHNldCBTRlRSU1QgdG8gcmVzZXQgdGhlIGJsb2NrICovCisJCV9fbXhzX3NldGwoTU9EVUxFX1NGVFJTVCwgcmVzZXRfYWRkcik7CisJCXVkZWxheSgxKTsKKworCQkvKiBwb2xsIENMS0dBVEUgYmVjb21pbmcgc2V0ICovCisJCXdoaWxlICgoIShyZWFkbChyZXNldF9hZGRyKSAmIE1PRFVMRV9DTEtHQVRFKSkgJiYgLS10aW1lb3V0KQorCQkJLyogbm90aGluZyAqLzsKKwkJaWYgKHVubGlrZWx5KCF0aW1lb3V0KSkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLyogY2xlYXIgYW5kIHBvbGwgU0ZUUlNUICovCisJcmV0ID0gY2xlYXJfcG9sbF9iaXQocmVzZXRfYWRkciwgTU9EVUxFX1NGVFJTVCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBhbmQgcG9sbCBDTEtHQVRFICovCisJcmV0ID0gY2xlYXJfcG9sbF9iaXQocmVzZXRfYWRkciwgTU9EVUxFX0NMS0dBVEUpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXByX2VycigiJXMoJXApOiBtb2R1bGUgcmVzZXQgdGltZW91dFxuIiwgX19mdW5jX18sIHJlc2V0X2FkZHIpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitpbnQgZ3BtaV9pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyID0gJnRoaXMtPnJlc291cmNlczsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX2VuYWJsZShyLT5jbG9jayk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0OworCXJldCA9IGdwbWlfcmVzZXRfYmxvY2soci0+Z3BtaV9yZWdzLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0OworCisJLyogQ2hvb3NlIE5BTkQgbW9kZS4gKi8KKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9HUE1JX01PREUsIHItPmdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfQ0xSKTsKKworCS8qIFNldCB0aGUgSVJRIHBvbGFyaXR5LiAqLworCXdyaXRlbChCTV9HUE1JX0NUUkwxX0FUQV9JUlFSRFlfUE9MQVJJVFksCisJCQkJci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9TRVQpOworCisJLyogRGlzYWJsZSBXcml0ZS1Qcm90ZWN0aW9uLiAqLworCXdyaXRlbChCTV9HUE1JX0NUUkwxX0RFVl9SRVNFVCwgci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9TRVQpOworCisJLyogU2VsZWN0IEJDSCBFQ0MuICovCisJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfQkNIX01PREUsIHItPmdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfU0VUKTsKKworCWNsa19kaXNhYmxlKHItPmNsb2NrKTsKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IHVzZWZ1bC4gSXQgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVnIG9jY3VyLiAqLwordm9pZCBncG1pX2R1bXBfaW5mbyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwl1MzIgcmVnOworCWludCBpOworCisJcHJfZXJyKCJTaG93IEdQTUkgcmVnaXN0ZXJzIDpcbiIpOworCWZvciAoaSA9IDA7IGkgPD0gSFdfR1BNSV9ERUJVRyAvIDB4MTAgKyAxOyBpKyspIHsKKwkJcmVnID0gcmVhZGwoci0+Z3BtaV9yZWdzICsgaSAqIDB4MTApOworCQlwcl9lcnIoIm9mZnNldCAweCUuM3ggOiAweCUuOHhcbiIsIGkgKiAweDEwLCByZWcpOworCX0KKworCS8qIHN0YXJ0IHRvIHByaW50IG91dCB0aGUgQkNIIGluZm8gKi8KKwlwcl9lcnIoIkJDSCBHZW9tZXRyeSA6XG4iKTsKKwlwcl9lcnIoIkdGIGxlbmd0aCAgICAgICAgICAgICAgOiAldVxuIiwgZ2VvLT5nZl9sZW4pOworCXByX2VycigiRUNDIFN0cmVuZ3RoICAgICAgICAgICA6ICV1XG4iLCBnZW8tPmVjY19zdHJlbmd0aCk7CisJcHJfZXJyKCJQYWdlIFNpemUgaW4gQnl0ZXMgICAgIDogJXVcbiIsIGdlby0+cGFnZV9zaXplKTsKKwlwcl9lcnIoIk1ldGFkYXRhIFNpemUgaW4gQnl0ZXMgOiAldVxuIiwgZ2VvLT5tZXRhZGF0YV9zaXplKTsKKwlwcl9lcnIoIkVDQyBDaHVuayBTaXplIGluIEJ5dGVzOiAldVxuIiwgZ2VvLT5lY2NfY2h1bmtfc2l6ZSk7CisJcHJfZXJyKCJFQ0MgQ2h1bmsgQ291bnQgICAgICAgIDogJXVcbiIsIGdlby0+ZWNjX2NodW5rX2NvdW50KTsKKwlwcl9lcnIoIlBheWxvYWQgU2l6ZSBpbiBCeXRlcyAgOiAldVxuIiwgZ2VvLT5wYXlsb2FkX3NpemUpOworCXByX2VycigiQXV4aWxpYXJ5IFNpemUgaW4gQnl0ZXM6ICV1XG4iLCBnZW8tPmF1eGlsaWFyeV9zaXplKTsKKwlwcl9lcnIoIkF1eGlsaWFyeSBTdGF0dXMgT2Zmc2V0OiAldVxuIiwgZ2VvLT5hdXhpbGlhcnlfc3RhdHVzX29mZnNldCk7CisJcHJfZXJyKCJCbG9jayBNYXJrIEJ5dGUgT2Zmc2V0IDogJXVcbiIsIGdlby0+YmxvY2tfbWFya19ieXRlX29mZnNldCk7CisJcHJfZXJyKCJCbG9jayBNYXJrIEJpdCBPZmZzZXQgIDogJXVcbiIsIGdlby0+YmxvY2tfbWFya19iaXRfb2Zmc2V0KTsKK30KKworLyogQ29uZmlndXJlcyB0aGUgZ2VvbWV0cnkgZm9yIEJDSC4gICovCitpbnQgYmNoX3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqYmNoX2dlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJdW5zaWduZWQgaW50IGJsb2NrX2NvdW50OworCXVuc2lnbmVkIGludCBibG9ja19zaXplOworCXVuc2lnbmVkIGludCBtZXRhZGF0YV9zaXplOworCXVuc2lnbmVkIGludCBlY2Nfc3RyZW5ndGg7CisJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKGNvbW1vbl9uZmNfc2V0X2dlb21ldHJ5KHRoaXMpKQorCQlyZXR1cm4gITA7CisKKwlibG9ja19jb3VudCAgID0gYmNoX2dlby0+ZWNjX2NodW5rX2NvdW50IC0gMTsKKwlibG9ja19zaXplICAgID0gYmNoX2dlby0+ZWNjX2NodW5rX3NpemU7CisJbWV0YWRhdGFfc2l6ZSA9IGJjaF9nZW8tPm1ldGFkYXRhX3NpemU7CisJZWNjX3N0cmVuZ3RoICA9IGJjaF9nZW8tPmVjY19zdHJlbmd0aCA+PiAxOworCXBhZ2Vfc2l6ZSAgICAgPSBiY2hfZ2VvLT5wYWdlX3NpemU7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHItPmNsb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKKwlyZXQgPSBncG1pX3Jlc2V0X2Jsb2NrKHItPmJjaF9yZWdzLCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiBDb25maWd1cmUgbGF5b3V0IDAuICovCisJd3JpdGVsKEJGX0JDSF9GTEFTSDBMQVlPVVQwX05CTE9DS1MoYmxvY2tfY291bnQpCisJCQl8IEJGX0JDSF9GTEFTSDBMQVlPVVQwX01FVEFfU0laRShtZXRhZGF0YV9zaXplKQorCQkJfCBCRl9CQ0hfRkxBU0gwTEFZT1VUMF9FQ0MwKGVjY19zdHJlbmd0aCkKKwkJCXwgQkZfQkNIX0ZMQVNIMExBWU9VVDBfREFUQTBfU0laRShibG9ja19zaXplKSwKKwkJCXItPmJjaF9yZWdzICsgSFdfQkNIX0ZMQVNIMExBWU9VVDApOworCisJd3JpdGVsKEJGX0JDSF9GTEFTSDBMQVlPVVQxX1BBR0VfU0laRShwYWdlX3NpemUpCisJCQl8IEJGX0JDSF9GTEFTSDBMQVlPVVQxX0VDQ04oZWNjX3N0cmVuZ3RoKQorCQkJfCBCRl9CQ0hfRkxBU0gwTEFZT1VUMV9EQVRBTl9TSVpFKGJsb2NrX3NpemUpLAorCQkJci0+YmNoX3JlZ3MgKyBIV19CQ0hfRkxBU0gwTEFZT1VUMSk7CisKKwkvKiBTZXQgKmFsbCogY2hpcCBzZWxlY3RzIHRvIHVzZSBsYXlvdXQgMC4gKi8KKwl3cml0ZWwoMCwgci0+YmNoX3JlZ3MgKyBIV19CQ0hfTEFZT1VUU0VMRUNUKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCXdyaXRlbChCTV9CQ0hfQ1RSTF9DT01QTEVURV9JUlFfRU4sCisJCQkJci0+YmNoX3JlZ3MgKyBIV19CQ0hfQ1RSTF9TRVQpOworCisJY2xrX2Rpc2FibGUoci0+Y2xvY2spOworCXJldHVybiAwOworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb252ZXJ0cyB0aW1lIGluIG5hbm9zZWNvbmRzIHRvIGN5Y2xlcy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnNfdG9fY3ljbGVzKHVuc2lnbmVkIGludCB0aW1lLAorCQkJdW5zaWduZWQgaW50IHBlcmlvZCwgdW5zaWduZWQgaW50IG1pbikKK3sKKwl1bnNpZ25lZCBpbnQgazsKKworCWsgPSAodGltZSArIHBlcmlvZCAtIDEpIC8gcGVyaW9kOworCXJldHVybiBtYXgoaywgbWluKTsKK30KKworLyogQXBwbHkgdGltaW5nIHRvIGN1cnJlbnQgaGFyZHdhcmUgY29uZGl0aW9ucy4gKi8KK3N0YXRpYyBpbnQgZ3BtaV9uZmNfY29tcHV0ZV9oYXJkd2FyZV90aW1pbmcoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJCQlzdHJ1Y3QgZ3BtaV9uZmNfaGFyZHdhcmVfdGltaW5nICpodykKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdGhpcy0+cGRhdGE7CisJc3RydWN0IHRpbWluZ190aHJlc2hvZCAqbmZjID0gJnRpbWluZ19kZWZhdWx0X3RocmVzaG9sZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gJnRoaXMtPm5hbmQ7CisJc3RydWN0IG5hbmRfdGltaW5nIHRhcmdldCA9IHRoaXMtPnRpbWluZzsKKwlib29sIGltcHJvdmVkX3RpbWluZ19pc19hdmFpbGFibGU7CisJdW5zaWduZWQgbG9uZyBjbG9ja19mcmVxdWVuY3lfaW5faHo7CisJdW5zaWduZWQgaW50IGNsb2NrX3BlcmlvZF9pbl9uczsKKwlib29sIGRsbF91c2VfaGFsZl9wZXJpb2RzOworCXVuc2lnbmVkIGludCBkbGxfZGVsYXlfc2hpZnQ7CisJdW5zaWduZWQgaW50IG1heF9zYW1wbGVfZGVsYXlfaW5fbnM7CisJdW5zaWduZWQgaW50IGFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzOworCXVuc2lnbmVkIGludCBkYXRhX3NldHVwX2luX25zOworCXVuc2lnbmVkIGludCBkYXRhX3NldHVwX2luX2N5Y2xlczsKKwl1bnNpZ25lZCBpbnQgZGF0YV9ob2xkX2luX2N5Y2xlczsKKwlpbnQgaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zOworCXVuc2lnbmVkIGludCBzYW1wbGVfZGVsYXlfZmFjdG9yOworCWludCB0RVlFOworCXVuc2lnbmVkIGludCBtaW5fcHJvcF9kZWxheV9pbl9ucyA9IHBkYXRhLT5taW5fcHJvcF9kZWxheV9pbl9uczsKKwl1bnNpZ25lZCBpbnQgbWF4X3Byb3BfZGVsYXlfaW5fbnMgPSBwZGF0YS0+bWF4X3Byb3BfZGVsYXlfaW5fbnM7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjaGlwcywgd2UgbmVlZCB0byByZWxheCB0aGUgdGltaW5ncyB0byBhbGxvdworCSAqIGZvciBzaWduYWwgZGlzdG9ydGlvbiBkdWUgdG8gaGlnaGVyIGNhcGFjaXRhbmNlLgorCSAqLworCWlmIChuYW5kLT5udW1jaGlwcyA+IDIpIHsKKwkJdGFyZ2V0LmRhdGFfc2V0dXBfaW5fbnMgICAgKz0gMTA7CisJCXRhcmdldC5kYXRhX2hvbGRfaW5fbnMgICAgICs9IDEwOworCQl0YXJnZXQuYWRkcmVzc19zZXR1cF9pbl9ucyArPSAxMDsKKwl9IGVsc2UgaWYgKG5hbmQtPm51bWNoaXBzID4gMSkgeworCQl0YXJnZXQuZGF0YV9zZXR1cF9pbl9ucyAgICArPSA1OworCQl0YXJnZXQuZGF0YV9ob2xkX2luX25zICAgICArPSA1OworCQl0YXJnZXQuYWRkcmVzc19zZXR1cF9pbl9ucyArPSA1OworCX0KKworCS8qIENoZWNrIGlmIGltcHJvdmVkIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICovCisJaW1wcm92ZWRfdGltaW5nX2lzX2F2YWlsYWJsZSA9CisJCSh0YXJnZXQudFJFQV9pbl9ucyAgPj0gMCkgJiYKKwkJKHRhcmdldC50UkxPSF9pbl9ucyA+PSAwKSAmJgorCQkodGFyZ2V0LnRSSE9IX2luX25zID49IDApIDsKKworCS8qIEluc3BlY3QgdGhlIGNsb2NrLiAqLworCWNsb2NrX2ZyZXF1ZW5jeV9pbl9oeiA9IG5mYy0+Y2xvY2tfZnJlcXVlbmN5X2luX2h6OworCWNsb2NrX3BlcmlvZF9pbl9ucyAgICA9IDEwMDAwMDAwMDAgLyBjbG9ja19mcmVxdWVuY3lfaW5faHo7CisKKwkvKgorCSAqIFRoZSBORkMgcXVhbnRpemVzIHNldHVwIGFuZCBob2xkIHBhcmFtZXRlcnMgaW4gdGVybXMgb2YgY2xvY2sgY3ljbGVzLgorCSAqIEhlcmUsIHdlIHF1YW50aXplIHRoZSBzZXR1cCBhbmQgaG9sZCB0aW1pbmcgcGFyYW1ldGVycyB0byB0aGUKKwkgKiBuZXh0LWhpZ2hlc3QgY2xvY2sgcGVyaW9kIHRvIG1ha2Ugc3VyZSB3ZSBhcHBseSBhdCBsZWFzdCB0aGUKKwkgKiBzcGVjaWZpZWQgdGltZXMuCisJICoKKwkgKiBGb3IgZGF0YSBzZXR1cCBhbmQgZGF0YSBob2xkLCB0aGUgaGFyZHdhcmUgaW50ZXJwcmV0cyBhIHZhbHVlIG9mIHplcm8KKwkgKiBhcyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBkZWxheS4gVGhpcyBpcyBub3Qgd2hhdCdzIGludGVuZGVkIGJ5IGEgemVybworCSAqIGluIHRoZSBpbnB1dCBwYXJhbWV0ZXIsIHNvIHdlIGltcG9zZSBhIG1pbmltdW0gb2Ygb25lIGN5Y2xlLgorCSAqLworCWRhdGFfc2V0dXBfaW5fY3ljbGVzICAgID0gbnNfdG9fY3ljbGVzKHRhcmdldC5kYXRhX3NldHVwX2luX25zLAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMSk7CisJZGF0YV9ob2xkX2luX2N5Y2xlcyAgICAgPSBuc190b19jeWNsZXModGFyZ2V0LmRhdGFfaG9sZF9pbl9ucywKKwkJCQkJCQljbG9ja19wZXJpb2RfaW5fbnMsIDEpOworCWFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzID0gbnNfdG9fY3ljbGVzKHRhcmdldC5hZGRyZXNzX3NldHVwX2luX25zLAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMCk7CisKKwkvKgorCSAqIFRoZSBjbG9jaydzIHBlcmlvZCBhZmZlY3RzIHRoZSBzYW1wbGUgZGVsYXkgaW4gYSBudW1iZXIgb2Ygd2F5czoKKwkgKgorCSAqICgxKSBUaGUgTkZDIEhBTCB0ZWxscyB1cyB0aGUgbWF4aW11bSBjbG9jayBwZXJpb2QgdGhlIHNhbXBsZSBkZWxheQorCSAqICAgICBETEwgY2FuIHRvbGVyYXRlLiBJZiB0aGUgY2xvY2sgcGVyaW9kIGlzIGdyZWF0ZXIgdGhhbiBoYWxmIHRoYXQKKwkgKiAgICAgbWF4aW11bSwgd2UgbXVzdCBjb25maWd1cmUgdGhlIERMTCB0byBiZSBkcml2ZW4gYnkgaGFsZiBwZXJpb2RzLgorCSAqCisJICogKDIpIFdlIG5lZWQgdG8gY29udmVydCBmcm9tIGFuIGlkZWFsIHNhbXBsZSBkZWxheSwgaW4gbnMsIHRvIGEKKwkgKiAgICAgInNhbXBsZSBkZWxheSBmYWN0b3IsIiB3aGljaCB0aGUgTkZDIHVzZXMuIFRoaXMgZmFjdG9yIGRlcGVuZHMgb24KKwkgKiAgICAgd2hldGhlciB3ZSdyZSBkcml2aW5nIHRoZSBETEwgd2l0aCBmdWxsIG9yIGhhbGYgcGVyaW9kcy4KKwkgKiAgICAgUGFyYXBocmFzaW5nIHRoZSByZWZlcmVuY2UgbWFudWFsOgorCSAqCisJICogICAgICAgICBBRCA9IFNERiB4IDAuMTI1IHggUlAKKwkgKgorCSAqIHdoZXJlOgorCSAqCisJICogICAgIEFEICAgaXMgdGhlIGFwcGxpZWQgZGVsYXksIGluIG5zLgorCSAqICAgICBTREYgIGlzIHRoZSBzYW1wbGUgZGVsYXkgZmFjdG9yLCB3aGljaCBpcyBkaW1lbnNpb25sZXNzLgorCSAqICAgICBSUCAgIGlzIHRoZSByZWZlcmVuY2UgcGVyaW9kLCBpbiBucywgd2hpY2ggaXMgYSBmdWxsIGNsb2NrIHBlcmlvZAorCSAqICAgICAgICAgIGlmIHRoZSBETEwgaXMgYmVpbmcgZHJpdmVuIGJ5IGZ1bGwgcGVyaW9kcywgb3IgaGFsZiB0aGF0IGlmCisJICogICAgICAgICAgdGhlIERMTCBpcyBiZWluZyBkcml2ZW4gYnkgaGFsZiBwZXJpb2RzLgorCSAqCisJICogTGV0J3MgcmUtYXJyYW5nZSB0aGlzIGluIGEgd2F5IHRoYXQncyBtb3JlIHVzZWZ1bCB0byB1czoKKwkgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgOAorCSAqICAgICAgICAgU0RGICA9ICBBRCB4IC0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgUlAKKwkgKgorCSAqIFRoZSByZWZlcmVuY2UgcGVyaW9kIGlzIGVpdGhlciB0aGUgY2xvY2sgcGVyaW9kIG9yIGhhbGYgdGhhdCwgc28gdGhpcworCSAqIGlzOgorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgIEFEIHggRERGCisJICogICAgICAgICBTREYgID0gIEFEIHggLS0tLS0gID0gIC0tLS0tLS0tCisJICogICAgICAgICAgICAgICAgICAgICAgZiB4IFAgICAgICAgIFAKKwkgKgorCSAqIHdoZXJlOgorCSAqCisJICogICAgICAgZiAgaXMgMSBvciAxLzIsIGRlcGVuZGluZyBvbiBob3cgd2UncmUgZHJpdmluZyB0aGUgRExMLgorCSAqICAgICAgIFAgIGlzIHRoZSBjbG9jayBwZXJpb2QuCisJICogICAgIERERiAgaXMgdGhlIERMTCBEZWxheSBGYWN0b3IsIGEgZGltZW5zaW9ubGVzcyB2YWx1ZSB0aGF0CisJICogICAgICAgICAgaW5jb3Jwb3JhdGVzIGFsbCB0aGUgY29uc3RhbnRzIGluIHRoZSBjb252ZXJzaW9uLgorCSAqCisJICogRERGIHdpbGwgYmUgZWl0aGVyIDggb3IgMTYsIGJvdGggb2Ygd2hpY2ggYXJlIHBvd2VycyBvZiB0d28uIFdlIGNhbgorCSAqIHJlZHVjZSB0aGUgY29zdCBvZiB0aGlzIGNvbnZlcnNpb24gYnkgdXNpbmcgYml0IHNoaWZ0cyBpbnN0ZWFkIG9mCisJICogbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24uIFRodXM6CisJICoKKwkgKiAgICAgICAgICAgICAgICAgQUQgPDwgRERTCisJICogICAgICAgICBTREYgID0gIC0tLS0tLS0tLQorCSAqICAgICAgICAgICAgICAgICAgICAgUAorCSAqCisJICogICAgIG9yCisJICoKKwkgKiAgICAgICAgIEFEICA9ICAoU0RGID4+IEREUykgeCBQCisJICoKKwkgKiB3aGVyZToKKwkgKgorCSAqICAgICBERFMgIGlzIHRoZSBETEwgRGVsYXkgU2hpZnQsIHRoZSBsb2dhcml0aG0gdG8gYmFzZSAyIG9mIHRoZSBEREYuCisJICovCisJaWYgKGNsb2NrX3BlcmlvZF9pbl9ucyA+IChuZmMtPm1heF9kbGxfY2xvY2tfcGVyaW9kX2luX25zID4+IDEpKSB7CisJCWRsbF91c2VfaGFsZl9wZXJpb2RzID0gdHJ1ZTsKKwkJZGxsX2RlbGF5X3NoaWZ0ICAgICAgPSAzICsgMTsKKwl9IGVsc2UgeworCQlkbGxfdXNlX2hhbGZfcGVyaW9kcyA9IGZhbHNlOworCQlkbGxfZGVsYXlfc2hpZnQgICAgICA9IDM7CisJfQorCisJLyoKKwkgKiBDb21wdXRlIHRoZSBtYXhpbXVtIHNhbXBsZSBkZWxheSB0aGUgTkZDIGFsbG93cywgdW5kZXIgY3VycmVudAorCSAqIGNvbmRpdGlvbnMuIElmIHRoZSBjbG9jayBpcyBydW5uaW5nIHRvbyBzbG93bHksIG5vIHNhbXBsZSBkZWxheSBpcworCSAqIHBvc3NpYmxlLgorCSAqLworCWlmIChjbG9ja19wZXJpb2RfaW5fbnMgPiBuZmMtPm1heF9kbGxfY2xvY2tfcGVyaW9kX2luX25zKQorCQltYXhfc2FtcGxlX2RlbGF5X2luX25zID0gMDsKKwllbHNlIHsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgZGVsYXkgaW1wbGllZCBieSB0aGUgbGFyZ2VzdCBzYW1wbGUgZGVsYXkgZmFjdG9yCisJCSAqIHRoZSBORkMgYWxsb3dzLgorCQkgKi8KKwkJbWF4X3NhbXBsZV9kZWxheV9pbl9ucyA9CisJCQkobmZjLT5tYXhfc2FtcGxlX2RlbGF5X2ZhY3RvciAqIGNsb2NrX3BlcmlvZF9pbl9ucykgPj4KKwkJCQkJCQkJZGxsX2RlbGF5X3NoaWZ0OworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBpbXBsaWVkIHNhbXBsZSBkZWxheSBsYXJnZXIgdGhhbiB0aGUgTkZDCisJCSAqIGFjdHVhbGx5IGFsbG93cy4KKwkJICovCisJCWlmIChtYXhfc2FtcGxlX2RlbGF5X2luX25zID4gbmZjLT5tYXhfZGxsX2RlbGF5X2luX25zKQorCQkJbWF4X3NhbXBsZV9kZWxheV9pbl9ucyA9IG5mYy0+bWF4X2RsbF9kZWxheV9pbl9uczsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIGltcHJvdmVkIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuIElmIG5vdCwgd2UgaGF2ZSB0bworCSAqIHVzZSBhIGxlc3Mtc29waGlzdGljYXRlZCBhbGdvcml0aG0uCisJICovCisJaWYgKCFpbXByb3ZlZF90aW1pbmdfaXNfYXZhaWxhYmxlKSB7CisJCS8qCisJCSAqIEZvbGQgdGhlIHJlYWQgc2V0dXAgdGltZSByZXF1aXJlZCBieSB0aGUgTkZDIGludG8gdGhlIGlkZWFsCisJCSAqIHNhbXBsZSBkZWxheS4KKwkJICovCisJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA9IHRhcmdldC5ncG1pX3NhbXBsZV9kZWxheV9pbl9ucyArCisJCQkJCQluZmMtPmludGVybmFsX2RhdGFfc2V0dXBfaW5fbnM7CisKKwkJLyoKKwkJICogVGhlIGlkZWFsIHNhbXBsZSBkZWxheSBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtCisJCSAqIGFsbG93ZWQgYnkgdGhlIE5GQy4gSWYgc28sIHdlIGNhbiB0cmFkZSBvZmYgc2FtcGxlIGRlbGF5IHRpbWUKKwkJICogZm9yIG1vcmUgZGF0YSBzZXR1cCB0aW1lLgorCQkgKgorCQkgKiBJbiBlYWNoIGl0ZXJhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxvb3AsIHdlIGFkZCBhIGN5Y2xlIHRvCisJCSAqIHRoZSBkYXRhIHNldHVwIHRpbWUgYW5kIHN1YnRyYWN0IGEgY29ycmVzcG9uZGluZyBhbW91bnQgZnJvbQorCQkgKiB0aGUgc2FtcGxlIGRlbGF5IHVudGlsIHdlJ3ZlIHNhdGlzaWZpZWQgdGhlIGNvbnN0cmFpbnRzIG9yCisJCSAqIGNhbid0IGRvIGFueSBiZXR0ZXIuCisJCSAqLworCQl3aGlsZSAoKGlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA+IG1heF9zYW1wbGVfZGVsYXlfaW5fbnMpICYmCisJCQkoZGF0YV9zZXR1cF9pbl9jeWNsZXMgPCBuZmMtPm1heF9kYXRhX3NldHVwX2N5Y2xlcykpIHsKKworCQkJZGF0YV9zZXR1cF9pbl9jeWNsZXMrKzsKKwkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyAtPSBjbG9ja19wZXJpb2RfaW5fbnM7CisKKwkJCWlmIChpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPCAwKQorCQkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA9IDA7CisKKwkJfQorCisJCS8qCisJCSAqIENvbXB1dGUgdGhlIHNhbXBsZSBkZWxheSBmYWN0b3IgdGhhdCBjb3JyZXNwb25kcyBtb3N0IGNsb3NlbHkKKwkJICogdG8gdGhlIGlkZWFsIHNhbXBsZSBkZWxheS4gSWYgdGhlIHJlc3VsdCBpcyB0b28gbGFyZ2UgZm9yIHRoZQorCQkgKiBORkMsIHVzZSB0aGUgbWF4aW11bSB2YWx1ZS4KKwkJICoKKwkJICogTm90aWNlIHRoYXQgd2UgdXNlIHRoZSBuc190b19jeWNsZXMgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUKKwkJICogc2FtcGxlIGRlbGF5IGZhY3Rvci4gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSBmb3JtIG9mIHRoZQorCQkgKiBjb21wdXRhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGF0IGZvciBjYWxjdWxhdGluZyBjeWNsZXMuCisJCSAqLworCQlzYW1wbGVfZGVsYXlfZmFjdG9yID0KKwkJCW5zX3RvX2N5Y2xlcygKKwkJCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPDwgZGxsX2RlbGF5X3NoaWZ0LAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMCk7CisKKwkJaWYgKHNhbXBsZV9kZWxheV9mYWN0b3IgPiBuZmMtPm1heF9zYW1wbGVfZGVsYXlfZmFjdG9yKQorCQkJc2FtcGxlX2RlbGF5X2ZhY3RvciA9IG5mYy0+bWF4X3NhbXBsZV9kZWxheV9mYWN0b3I7CisKKwkJLyogU2tpcCB0byB0aGUgcGFydCB3aGVyZSB3ZSByZXR1cm4gb3VyIHJlc3VsdHMuICovCisJCWdvdG8gcmV0dXJuX3Jlc3VsdHM7CisJfQorCisJLyoKKwkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UgaGF2ZSBtb3JlIGRldGFpbGVkIHRpbWluZyBpbmZvcm1hdGlvbiwKKwkgKiBzbyB3ZSBjYW4gdXNlIGEgYmV0dGVyIGFsZ29yaXRobS4KKwkgKi8KKworCS8qCisJICogRm9sZCB0aGUgcmVhZCBzZXR1cCB0aW1lIHJlcXVpcmVkIGJ5IHRoZSBORkMgaW50byB0aGUgbWF4aW11bQorCSAqIHByb3BhZ2F0aW9uIGRlbGF5LgorCSAqLworCW1heF9wcm9wX2RlbGF5X2luX25zICs9IG5mYy0+aW50ZXJuYWxfZGF0YV9zZXR1cF9pbl9uczsKKworCS8qCisJICogRWFybGllciwgd2UgY29tcHV0ZWQgdGhlIG51bWJlciBvZiBjbG9jayBjeWNsZXMgcmVxdWlyZWQgdG8gc2F0aXNmeQorCSAqIHRoZSBkYXRhIHNldHVwIHRpbWUuIE5vdywgd2UgbmVlZCB0byBrbm93IHRoZSBhY3R1YWwgbmFub3NlY29uZHMuCisJICovCisJZGF0YV9zZXR1cF9pbl9ucyA9IGNsb2NrX3BlcmlvZF9pbl9ucyAqIGRhdGFfc2V0dXBfaW5fY3ljbGVzOworCisJLyoKKwkgKiBDb21wdXRlIHRFWUUsIHRoZSB3aWR0aCBvZiB0aGUgZGF0YSBleWUgd2hlbiByZWFkaW5nIGZyb20gdGhlIE5BTkQKKwkgKiBGbGFzaC4gVGhlIGV5ZSB3aWR0aCBpcyBmdW5kYW1lbnRhbGx5IGRldGVybWluZWQgYnkgdGhlIGRhdGEgc2V0dXAKKwkgKiB0aW1lLCBwZXJ0dXJiZWQgYnkgcHJvcGFnYXRpb24gZGVsYXlzIGFuZCBzb21lIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKKwkgKiBOQU5EIEZsYXNoIGRldmljZS4KKwkgKgorCSAqIHN0YXJ0IG9mIHRoZSBleWUgPSBtYXhfcHJvcF9kZWxheSArIHRSRUEKKwkgKiBlbmQgb2YgdGhlIGV5ZSAgID0gbWluX3Byb3BfZGVsYXkgKyB0UkhPSCArIGRhdGFfc2V0dXAKKwkgKi8KKwl0RVlFID0gKGludCltaW5fcHJvcF9kZWxheV9pbl9ucyArIChpbnQpdGFyZ2V0LnRSSE9IX2luX25zICsKKwkJCQkJCQkoaW50KWRhdGFfc2V0dXBfaW5fbnM7CisKKwl0RVlFIC09IChpbnQpbWF4X3Byb3BfZGVsYXlfaW5fbnMgKyAoaW50KXRhcmdldC50UkVBX2luX25zOworCisJLyoKKwkgKiBUaGUgZXllIG11c3QgYmUgb3Blbi4gSWYgaXQncyBub3QsIHdlIGNhbiB0cnkgdG8gb3BlbiBpdCBieQorCSAqIGluY3JlYXNpbmcgaXRzIG1haW4gZm9yY2VyLCB0aGUgZGF0YSBzZXR1cCB0aW1lLgorCSAqCisJICogSW4gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGZvbGxvd2luZyBsb29wLCB3ZSBpbmNyZWFzZSB0aGUgZGF0YSBzZXR1cAorCSAqIHRpbWUgYnkgYSBzaW5nbGUgY2xvY2sgY3ljbGUuIFdlIGRvIHRoaXMgdW50aWwgZWl0aGVyIHRoZSBleWUgaXMKKwkgKiBvcGVuIG9yIHdlIHJ1biBpbnRvIE5GQyBsaW1pdHMuCisJICovCisJd2hpbGUgKCh0RVlFIDw9IDApICYmCisJCQkoZGF0YV9zZXR1cF9pbl9jeWNsZXMgPCBuZmMtPm1heF9kYXRhX3NldHVwX2N5Y2xlcykpIHsKKwkJLyogR2l2ZSBhIGN5Y2xlIHRvIGRhdGEgc2V0dXAuICovCisJCWRhdGFfc2V0dXBfaW5fY3ljbGVzKys7CisJCS8qIFN5bmNocm9uaXplIHRoZSBkYXRhIHNldHVwIHRpbWUgd2l0aCB0aGUgY3ljbGVzLiAqLworCQlkYXRhX3NldHVwX2luX25zICs9IGNsb2NrX3BlcmlvZF9pbl9uczsKKwkJLyogQWRqdXN0IHRFWUUgYWNjb3JkaW5nbHkuICovCisJCXRFWUUgKz0gY2xvY2tfcGVyaW9kX2luX25zOworCX0KKworCS8qCisJICogV2hlbiBjb250cm9sIGFycml2ZXMgaGVyZSwgdGhlIGV5ZSBpcyBvcGVuLiBUaGUgaWRlYWwgdGltZSB0byBzYW1wbGUKKwkgKiB0aGUgZGF0YSBpcyBpbiB0aGUgY2VudGVyIG9mIHRoZSBleWU6CisJICoKKwkgKiAgICAgZW5kIG9mIHRoZSBleWUgKyBzdGFydCBvZiB0aGUgZXllCisJICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLSAgZGF0YV9zZXR1cAorCSAqICAgICAgICAgICAgICAgICAgICAyCisJICoKKwkgKiBBZnRlciBzb21lIGFsZ2VicmEsIHRoaXMgc2ltcGxpZmllcyB0byB0aGUgY29kZSBpbW1lZGlhdGVseSBiZWxvdy4KKwkgKi8KKwlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPQorCQkoKGludCltYXhfcHJvcF9kZWxheV9pbl9ucyArCisJCQkoaW50KXRhcmdldC50UkVBX2luX25zICsKKwkJCQkoaW50KW1pbl9wcm9wX2RlbGF5X2luX25zICsKKwkJCQkJKGludCl0YXJnZXQudFJIT0hfaW5fbnMgLQorCQkJCQkJKGludClkYXRhX3NldHVwX2luX25zKSA+PiAxOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGZpZ3VyZSBpbGx1c3RyYXRlcyBzb21lIGFzcGVjdHMgb2YgYSBOQU5EIEZsYXNoIHJlYWQ6CisJICoKKwkgKgorCSAqICAgICAgICAgICBfXyAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisJICogUkROICAgICAgICAgXF9fX19fX19fX19fX19fX19fLworCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIHRFWUUgLS0tLS0+CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy0tLS0tLS0tLS0tLS0tLS0tXAorCSAqIFJlYWQgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCAgICAgICAgICAgICAgICAgICA+LS0tLS0tLS0tCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS0tLS0tLworCSAqICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgIF4KKwkgKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgfDwtLURhdGEgU2V0dXAgLS0+fDwtLURlbGF5IFRpbWUgLS0+fCAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfDwtLSAgIFF1YW50aXplZCBEZWxheSBUaW1lICAgLS0+fAorCSAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgKgorCSAqCisJICogV2UgaGF2ZSBzb21lIGlzc3VlcyB3ZSBtdXN0IG5vdyBhZGRyZXNzOgorCSAqCisJICogKDEpIFRoZSAqaWRlYWwqIHNhbXBsZSBkZWxheSB0aW1lIG11c3Qgbm90IGJlIG5lZ2F0aXZlLiBJZiBpdCBpcywgd2UKKwkgKiAgICAgamFtIGl0IHRvIHplcm8uCisJICoKKwkgKiAoMikgVGhlICppZGVhbCogc2FtcGxlIGRlbGF5IHRpbWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoYXQKKwkgKiAgICAgYWxsb3dlZCBieSB0aGUgTkZDLiBJZiBpdCBpcywgd2UgY2FuIGluY3JlYXNlIHRoZSBkYXRhIHNldHVwCisJICogICAgIHRpbWUsIHdoaWNoIHdpbGwgcmVkdWNlIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGRhdGEKKwkgKiAgICAgc2V0dXAgYW5kIHRoZSBjZW50ZXIgb2YgdGhlIGV5ZS4gSXQgd2lsbCBhbHNvIG1ha2UgdGhlIGV5ZQorCSAqICAgICBsYXJnZXIsIHdoaWNoIG1pZ2h0IGhlbHAgd2l0aCB0aGUgbmV4dCBpc3N1ZS4uLgorCSAqCisJICogKDMpIFRoZSAqcXVhbnRpemVkKiBzYW1wbGUgZGVsYXkgdGltZSBtdXN0IG5vdCBmYWxsIGVpdGhlciBiZWZvcmUgdGhlCisJICogICAgIGV5ZSBvcGVucyBvciBhZnRlciBpdCBjbG9zZXMgKHRoZSBsYXR0ZXIgaXMgdGhlIHByb2JsZW0KKwkgKiAgICAgaWxsdXN0cmF0ZWQgaW4gdGhlIGFib3ZlIGZpZ3VyZSkuCisJICovCisKKwkvKiBKYW0gYSBuZWdhdGl2ZSBpZGVhbCBzYW1wbGUgZGVsYXkgdG8gemVyby4gKi8KKwlpZiAoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIDwgMCkKKwkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID0gMDsKKworCS8qCisJICogRXh0ZW5kIHRoZSBkYXRhIHNldHVwIGFzIG5lZWRlZCB0byByZWR1Y2UgdGhlIGlkZWFsIHNhbXBsZSBkZWxheQorCSAqIGJlbG93IHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBieSB0aGUgTkZDLgorCSAqLworCXdoaWxlICgoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zID4gbWF4X3NhbXBsZV9kZWxheV9pbl9ucykgJiYKKwkJCShkYXRhX3NldHVwX2luX2N5Y2xlcyA8IG5mYy0+bWF4X2RhdGFfc2V0dXBfY3ljbGVzKSkgeworCisJCS8qIEdpdmUgYSBjeWNsZSB0byBkYXRhIHNldHVwLiAqLworCQlkYXRhX3NldHVwX2luX2N5Y2xlcysrOworCQkvKiBTeW5jaHJvbml6ZSB0aGUgZGF0YSBzZXR1cCB0aW1lIHdpdGggdGhlIGN5Y2xlcy4gKi8KKwkJZGF0YV9zZXR1cF9pbl9ucyArPSBjbG9ja19wZXJpb2RfaW5fbnM7CisJCS8qIEFkanVzdCB0RVlFIGFjY29yZGluZ2x5LiAqLworCQl0RVlFICs9IGNsb2NrX3BlcmlvZF9pbl9uczsKKworCQkvKgorCQkgKiBEZWNyZWFzZSB0aGUgaWRlYWwgc2FtcGxlIGRlbGF5IGJ5IG9uZSBoYWxmIGN5Y2xlLCB0byBrZWVwIGl0CisJCSAqIGluIHRoZSBtaWRkbGUgb2YgdGhlIGV5ZS4KKwkJICovCisJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyAtPSAoY2xvY2tfcGVyaW9kX2luX25zID4+IDEpOworCisJCS8qIEphbSBhIG5lZ2F0aXZlIGlkZWFsIHNhbXBsZSBkZWxheSB0byB6ZXJvLiAqLworCQlpZiAoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIDwgMCkKKwkJCWlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA9IDA7CisJfQorCisJLyoKKwkgKiBDb21wdXRlIHRoZSBzYW1wbGUgZGVsYXkgZmFjdG9yIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGlkZWFsIHNhbXBsZQorCSAqIGRlbGF5LiBJZiB0aGUgcmVzdWx0IGlzIHRvbyBsYXJnZSwgdGhlbiB1c2UgdGhlIG1heGltdW0gYWxsb3dlZAorCSAqIHZhbHVlLgorCSAqCisJICogTm90aWNlIHRoYXQgd2UgdXNlIHRoZSBuc190b19jeWNsZXMgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgc2FtcGxlCisJICogZGVsYXkgZmFjdG9yLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGZvcm0gb2YgdGhlIGNvbXB1dGF0aW9uIGlzIHRoZQorCSAqIHNhbWUgYXMgdGhhdCBmb3IgY2FsY3VsYXRpbmcgY3ljbGVzLgorCSAqLworCXNhbXBsZV9kZWxheV9mYWN0b3IgPQorCQluc190b19jeWNsZXMoaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIDw8IGRsbF9kZWxheV9zaGlmdCwKKwkJCQkJCQljbG9ja19wZXJpb2RfaW5fbnMsIDApOworCisJaWYgKHNhbXBsZV9kZWxheV9mYWN0b3IgPiBuZmMtPm1heF9zYW1wbGVfZGVsYXlfZmFjdG9yKQorCQlzYW1wbGVfZGVsYXlfZmFjdG9yID0gbmZjLT5tYXhfc2FtcGxlX2RlbGF5X2ZhY3RvcjsKKworCS8qCisJICogVGhlc2UgbWFjcm9zIGNvbnZlbmllbnRseSBlbmNhcHN1bGF0ZSBhIGNvbXB1dGF0aW9uIHdlJ2xsIHVzZSB0bworCSAqIGNvbnRpbnVvdXNseSBldmFsdWF0ZSB3aGV0aGVyIG9yIG5vdCB0aGUgZGF0YSBzYW1wbGUgZGVsYXkgaXMgaW5zaWRlCisJICogdGhlIGV5ZS4KKwkgKi8KKwkjZGVmaW5lIElERUFMX0RFTEFZICAoKGludCkgaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zKQorCisJI2RlZmluZSBRVUFOVElaRURfREVMQVkgIFwKKwkJKChpbnQpICgoc2FtcGxlX2RlbGF5X2ZhY3RvciAqIGNsb2NrX3BlcmlvZF9pbl9ucykgPj4gXAorCQkJCQkJCWRsbF9kZWxheV9zaGlmdCkpCisKKwkjZGVmaW5lIERFTEFZX0VSUk9SICAoYWJzKFFVQU5USVpFRF9ERUxBWSAtIElERUFMX0RFTEFZKSkKKworCSNkZWZpbmUgU0FNUExFX0lTX05PVF9XSVRISU5fVEhFX0VZRSAgKERFTEFZX0VSUk9SID4gKHRFWUUgPj4gMSkpCisKKwkvKgorCSAqIFdoaWxlIHRoZSBxdWFudGl6ZWQgc2FtcGxlIHRpbWUgZmFsbHMgb3V0c2lkZSB0aGUgZXllLCByZWR1Y2UgdGhlCisJICogc2FtcGxlIGRlbGF5IG9yIGV4dGVuZCB0aGUgZGF0YSBzZXR1cCB0byBtb3ZlIHRoZSBzYW1wbGluZyBwb2ludCBiYWNrCisJICogdG93YXJkIHRoZSBleWUuIERvIG5vdCBhbGxvdyB0aGUgbnVtYmVyIG9mIGRhdGEgc2V0dXAgY3ljbGVzIHRvCisJICogZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIE5GQy4KKwkgKi8KKwl3aGlsZSAoU0FNUExFX0lTX05PVF9XSVRISU5fVEhFX0VZRSAmJgorCQkJKGRhdGFfc2V0dXBfaW5fY3ljbGVzIDwgbmZjLT5tYXhfZGF0YV9zZXR1cF9jeWNsZXMpKSB7CisJCS8qCisJCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB0aGUgcXVhbnRpemVkIHNhbXBsZSBkZWxheSBmYWxscworCQkgKiBvdXRzaWRlIHRoZSBleWUuIENoZWNrIGlmIGl0J3MgYmVmb3JlIHRoZSBleWUgb3BlbnMsIG9yIGFmdGVyCisJCSAqIHRoZSBleWUgY2xvc2VzLgorCQkgKi8KKwkJaWYgKFFVQU5USVpFRF9ERUxBWSA+IElERUFMX0RFTEFZKSB7CisJCQkvKgorCQkJICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHRoZSBxdWFudGl6ZWQgc2FtcGxlIGRlbGF5CisJCQkgKiBmYWxscyBhZnRlciB0aGUgZXllIGNsb3Nlcy4gRGVjcmVhc2UgdGhlIHF1YW50aXplZAorCQkJICogZGVsYXkgdGltZSBhbmQgdGhlbiBnbyBiYWNrIHRvIHJlLWV2YWx1YXRlLgorCQkJICovCisJCQlpZiAoc2FtcGxlX2RlbGF5X2ZhY3RvciAhPSAwKQorCQkJCXNhbXBsZV9kZWxheV9mYWN0b3ItLTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHRoZSBxdWFudGl6ZWQgc2FtcGxlIGRlbGF5IGZhbGxzCisJCSAqIGJlZm9yZSB0aGUgZXllIG9wZW5zLiBTaGlmdCB0aGUgc2FtcGxlIHBvaW50IGJ5IGluY3JlYXNpbmcKKwkJICogZGF0YSBzZXR1cCB0aW1lLiBUaGlzIHdpbGwgYWxzbyBtYWtlIHRoZSBleWUgbGFyZ2VyLgorCQkgKi8KKworCQkvKiBHaXZlIGEgY3ljbGUgdG8gZGF0YSBzZXR1cC4gKi8KKwkJZGF0YV9zZXR1cF9pbl9jeWNsZXMrKzsKKwkJLyogU3luY2hyb25pemUgdGhlIGRhdGEgc2V0dXAgdGltZSB3aXRoIHRoZSBjeWNsZXMuICovCisJCWRhdGFfc2V0dXBfaW5fbnMgKz0gY2xvY2tfcGVyaW9kX2luX25zOworCQkvKiBBZGp1c3QgdEVZRSBhY2NvcmRpbmdseS4gKi8KKwkJdEVZRSArPSBjbG9ja19wZXJpb2RfaW5fbnM7CisKKwkJLyoKKwkJICogRGVjcmVhc2UgdGhlIGlkZWFsIHNhbXBsZSBkZWxheSBieSBvbmUgaGFsZiBjeWNsZSwgdG8ga2VlcCBpdAorCQkgKiBpbiB0aGUgbWlkZGxlIG9mIHRoZSBleWUuCisJCSAqLworCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgLT0gKGNsb2NrX3BlcmlvZF9pbl9ucyA+PiAxKTsKKworCQkvKiAuLi5hbmQgb25lIGxlc3MgcGVyaW9kIGZvciB0aGUgZGVsYXkgdGltZS4gKi8KKwkJaWRlYWxfc2FtcGxlX2RlbGF5X2luX25zIC09IGNsb2NrX3BlcmlvZF9pbl9uczsKKworCQkvKiBKYW0gYSBuZWdhdGl2ZSBpZGVhbCBzYW1wbGUgZGVsYXkgdG8gemVyby4gKi8KKwkJaWYgKGlkZWFsX3NhbXBsZV9kZWxheV9pbl9ucyA8IDApCisJCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPSAwOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSBuZXcgaWRlYWwgc2FtcGxlIGRlbGF5LCBzbyByZS1jb21wdXRlIHRoZSBxdWFudGl6ZWQKKwkJICogZGVsYXkuCisJCSAqLworCQlzYW1wbGVfZGVsYXlfZmFjdG9yID0KKwkJCW5zX3RvX2N5Y2xlcygKKwkJCQlpZGVhbF9zYW1wbGVfZGVsYXlfaW5fbnMgPDwgZGxsX2RlbGF5X3NoaWZ0LAorCQkJCQkJCWNsb2NrX3BlcmlvZF9pbl9ucywgMCk7CisKKwkJaWYgKHNhbXBsZV9kZWxheV9mYWN0b3IgPiBuZmMtPm1heF9zYW1wbGVfZGVsYXlfZmFjdG9yKQorCQkJc2FtcGxlX2RlbGF5X2ZhY3RvciA9IG5mYy0+bWF4X3NhbXBsZV9kZWxheV9mYWN0b3I7CisJfQorCisJLyogQ29udHJvbCBhcnJpdmVzIGhlcmUgd2hlbiB3ZSdyZSByZWFkeSB0byByZXR1cm4gb3VyIHJlc3VsdHMuICovCityZXR1cm5fcmVzdWx0czoKKwlody0+ZGF0YV9zZXR1cF9pbl9jeWNsZXMgICAgPSBkYXRhX3NldHVwX2luX2N5Y2xlczsKKwlody0+ZGF0YV9ob2xkX2luX2N5Y2xlcyAgICAgPSBkYXRhX2hvbGRfaW5fY3ljbGVzOworCWh3LT5hZGRyZXNzX3NldHVwX2luX2N5Y2xlcyA9IGFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzOworCWh3LT51c2VfaGFsZl9wZXJpb2RzICAgICAgICA9IGRsbF91c2VfaGFsZl9wZXJpb2RzOworCWh3LT5zYW1wbGVfZGVsYXlfZmFjdG9yICAgICA9IHNhbXBsZV9kZWxheV9mYWN0b3I7CisKKwkvKiBSZXR1cm4gc3VjY2Vzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogQmVnaW4gdGhlIEkvTyAqLwordm9pZCBncG1pX2JlZ2luKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2VzICpyID0gJnRoaXMtPnJlc291cmNlczsKKwlzdHJ1Y3QgdGltaW5nX3RocmVzaG9kICpuZmMgPSAmdGltaW5nX2RlZmF1bHRfdGhyZXNob2xkOworCXVuc2lnbmVkIGNoYXIgICpncG1pX3JlZ3MgPSByLT5ncG1pX3JlZ3M7CisJdW5zaWduZWQgaW50ICAgY2xvY2tfcGVyaW9kX2luX25zOworCXVpbnQzMl90ICAgICAgIHJlZzsKKwl1bnNpZ25lZCBpbnQgICBkbGxfd2FpdF90aW1lX2luX3VzOworCXN0cnVjdCBncG1pX25mY19oYXJkd2FyZV90aW1pbmcgIGh3OworCWludCByZXQ7CisKKwkvKiBFbmFibGUgdGhlIGNsb2NrLiAqLworCXJldCA9IGNsa19lbmFibGUoci0+Y2xvY2spOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJXZSBmYWlsZWQgaW4gZW5hYmxlIHRoZSBjbGtcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogc2V0IHJlYWR5L2J1c3kgdGltZW91dCAqLworCXdyaXRlbCgweDUwMCA8PCBCUF9HUE1JX1RJTUlORzFfQlVTWV9USU1FT1VULAorCQlncG1pX3JlZ3MgKyBIV19HUE1JX1RJTUlORzEpOworCisJLyogR2V0IHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gd2UgbmVlZC4gKi8KKwluZmMtPmNsb2NrX2ZyZXF1ZW5jeV9pbl9oeiA9IGNsa19nZXRfcmF0ZShyLT5jbG9jayk7CisJY2xvY2tfcGVyaW9kX2luX25zID0gMTAwMDAwMDAwMCAvIG5mYy0+Y2xvY2tfZnJlcXVlbmN5X2luX2h6OworCisJZ3BtaV9uZmNfY29tcHV0ZV9oYXJkd2FyZV90aW1pbmcodGhpcywgJmh3KTsKKworCS8qIFNldCB1cCBhbGwgdGhlIHNpbXBsZSB0aW1pbmcgcGFyYW1ldGVycy4gKi8KKwlyZWcgPSBCRl9HUE1JX1RJTUlORzBfQUREUkVTU19TRVRVUChody5hZGRyZXNzX3NldHVwX2luX2N5Y2xlcykgfAorCQlCRl9HUE1JX1RJTUlORzBfREFUQV9IT0xEKGh3LmRhdGFfaG9sZF9pbl9jeWNsZXMpICAgICAgICAgfAorCQlCRl9HUE1JX1RJTUlORzBfREFUQV9TRVRVUChody5kYXRhX3NldHVwX2luX2N5Y2xlcykgICAgICAgOworCisJd3JpdGVsKHJlZywgZ3BtaV9yZWdzICsgSFdfR1BNSV9USU1JTkcwKTsKKworCS8qCisJICogRExMX0VOQUJMRSBtdXN0IGJlIHNldCB0byAwIHdoZW4gc2V0dGluZyBSRE5fREVMQVkgb3IgSEFMRl9QRVJJT0QuCisJICovCisJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfRExMX0VOQUJMRSwgZ3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9DTFIpOworCisJLyogQ2xlYXIgb3V0IHRoZSBETEwgY29udHJvbCBmaWVsZHMuICovCisJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfUkROX0RFTEFZLCAgIGdwbWlfcmVncyArIEhXX0dQTUlfQ1RSTDFfQ0xSKTsKKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9IQUxGX1BFUklPRCwgZ3BtaV9yZWdzICsgSFdfR1BNSV9DVFJMMV9DTFIpOworCisJLyogSWYgbm8gc2FtcGxlIGRlbGF5IGlzIGNhbGxlZCBmb3IsIHJldHVybiBpbW1lZGlhdGVseS4gKi8KKwlpZiAoIWh3LnNhbXBsZV9kZWxheV9mYWN0b3IpCisJCXJldHVybjsKKworCS8qIENvbmZpZ3VyZSB0aGUgSEFMRl9QRVJJT0QgZmxhZy4gKi8KKwlpZiAoaHcudXNlX2hhbGZfcGVyaW9kcykKKwkJd3JpdGVsKEJNX0dQTUlfQ1RSTDFfSEFMRl9QRVJJT0QsCisJCQkJCQlncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX1NFVCk7CisKKwkvKiBTZXQgdGhlIGRlbGF5IGZhY3Rvci4gKi8KKwl3cml0ZWwoQkZfR1BNSV9DVFJMMV9SRE5fREVMQVkoaHcuc2FtcGxlX2RlbGF5X2ZhY3RvciksCisJCQkJCQlncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX1NFVCk7CisKKwkvKiBFbmFibGUgdGhlIERMTC4gKi8KKwl3cml0ZWwoQk1fR1BNSV9DVFJMMV9ETExfRU5BQkxFLCBncG1pX3JlZ3MgKyBIV19HUE1JX0NUUkwxX1NFVCk7CisKKwkvKgorCSAqIEFmdGVyIHdlIGVuYWJsZSB0aGUgR1BNSSBETEwsIHdlIGhhdmUgdG8gd2FpdCA2NCBjbG9jayBjeWNsZXMgYmVmb3JlCisJICogd2UgY2FuIHVzZSB0aGUgR1BNSS4KKwkgKgorCSAqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHRpbWUgd2UgbmVlZCB0byB3YWl0LCBpbiBtaWNyb3NlY29uZHMuCisJICovCisJZGxsX3dhaXRfdGltZV9pbl91cyA9IChjbG9ja19wZXJpb2RfaW5fbnMgKiA2NCkgLyAxMDAwOworCisJaWYgKCFkbGxfd2FpdF90aW1lX2luX3VzKQorCQlkbGxfd2FpdF90aW1lX2luX3VzID0gMTsKKworCS8qIFdhaXQgZm9yIHRoZSBETEwgdG8gc2V0dGxlLiAqLworCXVkZWxheShkbGxfd2FpdF90aW1lX2luX3VzKTsKKworZXJyX291dDoKKwlyZXR1cm47Cit9CisKK3ZvaWQgZ3BtaV9lbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnIgPSAmdGhpcy0+cmVzb3VyY2VzOworCWNsa19kaXNhYmxlKHItPmNsb2NrKTsKK30KKworLyogQ2xlYXJzIGEgQkNIIGludGVycnVwdC4gKi8KK3ZvaWQgZ3BtaV9jbGVhcl9iY2goc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnIgPSAmdGhpcy0+cmVzb3VyY2VzOworCXdyaXRlbChCTV9CQ0hfQ1RSTF9DT01QTEVURV9JUlEsIHItPmJjaF9yZWdzICsgSFdfQkNIX0NUUkxfQ0xSKTsKK30KKworLyogUmV0dXJucyB0aGUgUmVhZHkvQnVzeSBzdGF0dXMgb2YgdGhlIGdpdmVuIGNoaXAuICovCitpbnQgZ3BtaV9pc19yZWFkeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsIHVuc2lnbmVkIGNoaXApCit7CisJc3RydWN0IHJlc291cmNlcyAqciA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJdWludDMyX3QgbWFzayA9IDA7CisJdWludDMyX3QgcmVnID0gMDsKKworCWlmIChHUE1JX0lTX01YMjModGhpcykpIHsKKwkJbWFzayA9IE1YMjNfQk1fR1BNSV9ERUJVR19SRUFEWTAgPDwgY2hpcDsKKwkJcmVnID0gcmVhZGwoci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9ERUJVRyk7CisJfSBlbHNlIGlmIChHUE1JX0lTX01YMjgodGhpcykpIHsKKwkJbWFzayA9IE1YMjhfQkZfR1BNSV9TVEFUX1JFQURZX0JVU1koMSA8PCBjaGlwKTsKKwkJcmVnID0gcmVhZGwoci0+Z3BtaV9yZWdzICsgSFdfR1BNSV9TVEFUKTsKKwl9IGVsc2UKKwkJcHJfZXJyKCJ1bmtub3cgYXJjaC5cbiIpOworCXJldHVybiByZWcgJiBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV90eXBlKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywKKwkJCQkJZW51bSBkbWFfb3BzX3R5cGUgdHlwZSkKK3sKKwl0aGlzLT5sYXN0X2RtYV90eXBlID0gdGhpcy0+ZG1hX3R5cGU7CisJdGhpcy0+ZG1hX3R5cGUgPSB0eXBlOworfQorCitpbnQgZ3BtaV9zZW5kX2NvbW1hbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbih0aGlzKTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7CisJaW50IGNoaXAgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJdTMyIHBpb1szXTsKKworCS8qIFsxXSBzZW5kIG91dCB0aGUgUElPIHdvcmRzICovCisJcGlvWzBdID0gQkZfR1BNSV9DVFJMMF9DT01NQU5EX01PREUoQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dSSVRFKQorCQl8IEJNX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEgKKwkJfCBCRl9HUE1JX0NUUkwwX0NTKGNoaXAsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9MT0NLX0NTKExPQ0tfQ1NfRU5BQkxFLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfQUREUkVTUyhCVl9HUE1JX0NUUkwwX0FERFJFU1NfX05BTkRfQ0xFKQorCQl8IEJNX0dQTUlfQ1RSTDBfQUREUkVTU19JTkNSRU1FTlQKKwkJfCBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQodGhpcy0+Y29tbWFuZF9sZW5ndGgpOworCXBpb1sxXSA9IHBpb1syXSA9IDA7CisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBpbywKKwkJCQkJQVJSQVlfU0laRShwaW8pLCBETUFfTk9ORSwgMCk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAxIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFsyXSBzZW5kIG91dCB0aGUgQ09NTUFORCArIEFERFJFU1Mgc3RyaW5nIHN0b3JlZCBpbiBAYnVmZmVyICovCisJc2dsID0gJnRoaXMtPmNtZF9zZ2w7CisKKwlzZ19pbml0X29uZShzZ2wsIHRoaXMtPmNtZF9idWZmZXIsIHRoaXMtPmNvbW1hbmRfbGVuZ3RoKTsKKwlkbWFfbWFwX3NnKHRoaXMtPmRldiwgc2dsLCAxLCBETUFfVE9fREVWSUNFKTsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQlzZ2wsIDEsIERNQV9UT19ERVZJQ0UsIDEpOworCWlmICghZGVzYykgeworCQlwcl9lcnIoInN0ZXAgMiBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBbM10gc3VibWl0IHRoZSBETUEgKi8KKwlzZXRfZG1hX3R5cGUodGhpcywgRE1BX0ZPUl9DT01NQU5EKTsKKwlyZXR1cm4gc3RhcnRfZG1hX3dpdGhvdXRfYmNoX2lycSh0aGlzLCBkZXNjKTsKK30KKworaW50IGdwbWlfc2VuZF9kYXRhKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGRtYV9jaGFuICpjaGFubmVsID0gZ2V0X2RtYV9jaGFuKHRoaXMpOworCWludCBjaGlwID0gdGhpcy0+Y3VycmVudF9jaGlwOworCXVpbnQzMl90IGNvbW1hbmRfbW9kZTsKKwl1aW50MzJfdCBhZGRyZXNzOworCXUzMiBwaW9bMl07CisKKwkvKiBbMV0gUElPICovCisJY29tbWFuZF9tb2RlID0gQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dSSVRFOworCWFkZHJlc3MgICAgICA9IEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBOworCisJcGlvWzBdID0gQkZfR1BNSV9DVFJMMF9DT01NQU5EX01PREUoY29tbWFuZF9tb2RlKQorCQl8IEJNX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEgKKwkJfCBCRl9HUE1JX0NUUkwwX0NTKGNoaXAsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9MT0NLX0NTKExPQ0tfQ1NfRU5BQkxFLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfQUREUkVTUyhhZGRyZXNzKQorCQl8IEJGX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCh0aGlzLT51cHBlcl9sZW4pOworCXBpb1sxXSA9IDA7CisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBpbywKKwkJCQkJQVJSQVlfU0laRShwaW8pLCBETUFfTk9ORSwgMCk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAxIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFsyXSBzZW5kIERNQSByZXF1ZXN0ICovCisJcHJlcGFyZV9kYXRhX2RtYSh0aGlzLCBETUFfVE9fREVWSUNFKTsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLCAmdGhpcy0+ZGF0YV9zZ2wsCisJCQkJCQkxLCBETUFfVE9fREVWSUNFLCAxKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDIgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIFszXSBzdWJtaXQgdGhlIERNQSAqLworCXNldF9kbWFfdHlwZSh0aGlzLCBETUFfRk9SX1dSSVRFX0RBVEEpOworCXJldHVybiBzdGFydF9kbWFfd2l0aG91dF9iY2hfaXJxKHRoaXMsIGRlc2MpOworfQorCitpbnQgZ3BtaV9yZWFkX2RhdGEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW4odGhpcyk7CisJaW50IGNoaXAgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJdTMyIHBpb1syXTsKKworCS8qIFsxXSA6IHNlbmQgUElPICovCisJcGlvWzBdID0gQkZfR1BNSV9DVFJMMF9DT01NQU5EX01PREUoQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1JFQUQpCisJCXwgQk1fR1BNSV9DVFJMMF9XT1JEX0xFTkdUSAorCQl8IEJGX0dQTUlfQ1RSTDBfQ1MoY2hpcCwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0xPQ0tfQ1MoTE9DS19DU19FTkFCTEUsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9BRERSRVNTKEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBKQorCQl8IEJGX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCh0aGlzLT51cHBlcl9sZW4pOworCXBpb1sxXSA9IDA7CisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBpbywKKwkJCQkJQVJSQVlfU0laRShwaW8pLCBETUFfTk9ORSwgMCk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAxIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFsyXSA6IHNlbmQgRE1BIHJlcXVlc3QgKi8KKwlwcmVwYXJlX2RhdGFfZG1hKHRoaXMsIERNQV9GUk9NX0RFVklDRSk7CisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwgJnRoaXMtPmRhdGFfc2dsLAorCQkJCQkJMSwgRE1BX0ZST01fREVWSUNFLCAxKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDIgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzNdIDogc3VibWl0IHRoZSBETUEgKi8KKwlzZXRfZG1hX3R5cGUodGhpcywgRE1BX0ZPUl9SRUFEX0RBVEEpOworCXJldHVybiBzdGFydF9kbWFfd2l0aG91dF9iY2hfaXJxKHRoaXMsIGRlc2MpOworfQorCitpbnQgZ3BtaV9zZW5kX3BhZ2Uoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJZG1hX2FkZHJfdCBwYXlsb2FkLCBkbWFfYWRkcl90IGF1eGlsaWFyeSkKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXVpbnQzMl90IGNvbW1hbmRfbW9kZTsKKwl1aW50MzJfdCBhZGRyZXNzOworCXVpbnQzMl90IGVjY19jb21tYW5kOworCXVpbnQzMl90IGJ1ZmZlcl9tYXNrOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW4odGhpcyk7CisJaW50IGNoaXAgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJdTMyIHBpb1s2XTsKKworCS8qIEEgRE1BIGRlc2NyaXB0b3IgdGhhdCBkb2VzIGFuIEVDQyBwYWdlIHJlYWQuICovCisJY29tbWFuZF9tb2RlID0gQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dSSVRFOworCWFkZHJlc3MgICAgICA9IEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBOworCWVjY19jb21tYW5kICA9IEJWX0dQTUlfRUNDQ1RSTF9FQ0NfQ01EX19CQ0hfRU5DT0RFOworCWJ1ZmZlcl9tYXNrICA9IEJWX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTS19fQkNIX1BBR0UgfAorCQkJCUJWX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTS19fQkNIX0FVWE9OTFk7CisKKwlwaW9bMF0gPSBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERShjb21tYW5kX21vZGUpCisJCXwgQk1fR1BNSV9DVFJMMF9XT1JEX0xFTkdUSAorCQl8IEJGX0dQTUlfQ1RSTDBfQ1MoY2hpcCwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0xPQ0tfQ1MoTE9DS19DU19FTkFCTEUsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9BRERSRVNTKGFkZHJlc3MpCisJCXwgQkZfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKDApOworCXBpb1sxXSA9IDA7CisJcGlvWzJdID0gQk1fR1BNSV9FQ0NDVFJMX0VOQUJMRV9FQ0MKKwkJfCBCRl9HUE1JX0VDQ0NUUkxfRUNDX0NNRChlY2NfY29tbWFuZCkKKwkJfCBCRl9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0soYnVmZmVyX21hc2spOworCXBpb1szXSA9IGdlby0+cGFnZV9zaXplOworCXBpb1s0XSA9IHBheWxvYWQ7CisJcGlvWzVdID0gYXV4aWxpYXJ5OworCisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwKKwkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKXBpbywKKwkJCQkJQVJSQVlfU0laRShwaW8pLCBETUFfTk9ORSwgMCk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAyIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfZG1hX3R5cGUodGhpcywgRE1BX0ZPUl9XUklURV9FQ0NfUEFHRSk7CisJcmV0dXJuIHN0YXJ0X2RtYV93aXRoX2JjaF9pcnEodGhpcywgZGVzYyk7Cit9CisKK2ludCBncG1pX3JlYWRfcGFnZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQkJZG1hX2FkZHJfdCBwYXlsb2FkLCBkbWFfYWRkcl90IGF1eGlsaWFyeSkKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXVpbnQzMl90IGNvbW1hbmRfbW9kZTsKKwl1aW50MzJfdCBhZGRyZXNzOworCXVpbnQzMl90IGVjY19jb21tYW5kOworCXVpbnQzMl90IGJ1ZmZlcl9tYXNrOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW4odGhpcyk7CisJaW50IGNoaXAgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJdTMyIHBpb1s2XTsKKworCS8qIFsxXSBXYWl0IGZvciB0aGUgY2hpcCB0byByZXBvcnQgcmVhZHkuICovCisJY29tbWFuZF9tb2RlID0gQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1dBSVRfRk9SX1JFQURZOworCWFkZHJlc3MgICAgICA9IEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBOworCisJcGlvWzBdID0gIEJGX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKGNvbW1hbmRfbW9kZSkKKwkJfCBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICisJCXwgQkZfR1BNSV9DVFJMMF9DUyhjaGlwLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfTE9DS19DUyhMT0NLX0NTX0VOQUJMRSwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0FERFJFU1MoYWRkcmVzcykKKwkJfCBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQoMCk7CisJcGlvWzFdID0gMDsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilwaW8sIDIsIERNQV9OT05FLCAwKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDEgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzJdIEVuYWJsZSB0aGUgQkNIIGJsb2NrIGFuZCByZWFkLiAqLworCWNvbW1hbmRfbW9kZSA9IEJWX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFX19SRUFEOworCWFkZHJlc3MgICAgICA9IEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBOworCWVjY19jb21tYW5kICA9IEJWX0dQTUlfRUNDQ1RSTF9FQ0NfQ01EX19CQ0hfREVDT0RFOworCWJ1ZmZlcl9tYXNrICA9IEJWX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTS19fQkNIX1BBR0UKKwkJCXwgQlZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLX19CQ0hfQVVYT05MWTsKKworCXBpb1swXSA9ICBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERShjb21tYW5kX21vZGUpCisJCXwgQk1fR1BNSV9DVFJMMF9XT1JEX0xFTkdUSAorCQl8IEJGX0dQTUlfQ1RSTDBfQ1MoY2hpcCwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0xPQ0tfQ1MoTE9DS19DU19FTkFCTEUsIHRoaXMpCisJCXwgQkZfR1BNSV9DVFJMMF9BRERSRVNTKGFkZHJlc3MpCisJCXwgQkZfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKGdlby0+cGFnZV9zaXplKTsKKworCXBpb1sxXSA9IDA7CisJcGlvWzJdID0gIEJNX0dQTUlfRUNDQ1RSTF9FTkFCTEVfRUNDCisJCXwgQkZfR1BNSV9FQ0NDVFJMX0VDQ19DTUQoZWNjX2NvbW1hbmQpCisJCXwgQkZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLKGJ1ZmZlcl9tYXNrKTsKKwlwaW9bM10gPSBnZW8tPnBhZ2Vfc2l6ZTsKKwlwaW9bNF0gPSBwYXlsb2FkOworCXBpb1s1XSA9IGF1eGlsaWFyeTsKKwlkZXNjID0gY2hhbm5lbC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFubmVsLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLAorCQkJCQlBUlJBWV9TSVpFKHBpbyksIERNQV9OT05FLCAxKTsKKwlpZiAoIWRlc2MpIHsKKwkJcHJfZXJyKCJzdGVwIDIgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogWzNdIERpc2FibGUgdGhlIEJDSCBibG9jayAqLworCWNvbW1hbmRfbW9kZSA9IEJWX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFX19XQUlUX0ZPUl9SRUFEWTsKKwlhZGRyZXNzICAgICAgPSBCVl9HUE1JX0NUUkwwX0FERFJFU1NfX05BTkRfREFUQTsKKworCXBpb1swXSA9IEJGX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKGNvbW1hbmRfbW9kZSkKKwkJfCBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICisJCXwgQkZfR1BNSV9DVFJMMF9DUyhjaGlwLCB0aGlzKQorCQl8IEJGX0dQTUlfQ1RSTDBfTE9DS19DUyhMT0NLX0NTX0VOQUJMRSwgdGhpcykKKwkJfCBCRl9HUE1JX0NUUkwwX0FERFJFU1MoYWRkcmVzcykKKwkJfCBCRl9HUE1JX0NUUkwwX1hGRVJfQ09VTlQoZ2VvLT5wYWdlX3NpemUpOworCXBpb1sxXSA9IDA7CisJZGVzYyA9IGNoYW5uZWwtPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbm5lbCwKKwkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopcGlvLCAyLCBETUFfTk9ORSwgMSk7CisJaWYgKCFkZXNjKSB7CisJCXByX2Vycigic3RlcCAzIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFs0XSBzdWJtaXQgdGhlIERNQSAqLworCXNldF9kbWFfdHlwZSh0aGlzLCBETUFfRk9SX1JFQURfRUNDX1BBR0UpOworCXJldHVybiBzdGFydF9kbWFfd2l0aF9iY2hfaXJxKHRoaXMsIGRlc2MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLW5hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFiNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmMKQEAgLTAsMCArMSwxNjE5IEBACisvKgorICogRnJlZXNjYWxlIEdQTUkgTkFORCBGbGFzaCBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEVtYmVkZGVkIEFsbGV5IFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2dwbWktbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlICJncG1pLW5hbmQuaCIKKworLyogYWRkIG91ciBvd25lciBiYnQgZGVzY3JpcHRvciAqLworc3RhdGljIHVpbnQ4X3Qgc2Nhbl9mZl9wYXR0ZXJuW10gPSB7IDB4ZmYgfTsKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgZ3BtaV9iYnRfZGVzY3IgPSB7CisJLm9wdGlvbnMJPSAwLAorCS5vZmZzCQk9IDAsCisJLmxlbgkJPSAxLAorCS5wYXR0ZXJuCT0gc2Nhbl9mZl9wYXR0ZXJuCit9OworCisvKiAgV2Ugd2lsbCB1c2UgYWxsIHRoZSAocGFnZSArIE9PQikuICovCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IGdwbWlfaHdfZWNjbGF5b3V0ID0geworCS5lY2NieXRlcyA9IDAsCisJLmVjY3BvcyA9IHsgMCwgfSwKKwkub29iZnJlZSA9IHsgey5vZmZzZXQgPSAwLCAubGVuZ3RoID0gMH0gfQorfTsKKworc3RhdGljIGlycXJldHVybl90IGJjaF9pcnEoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNvb2tpZTsKKworCWdwbWlfY2xlYXJfYmNoKHRoaXMpOworCWNvbXBsZXRlKCZ0aGlzLT5iY2hfZG9uZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogIENhbGN1bGF0ZSB0aGUgRUNDIHN0cmVuZ3RoIGJ5IGhhbmQ6CisgKglFIDogVGhlIEVDQyBzdHJlbmd0aC4KKyAqCUcgOiB0aGUgbGVuZ3RoIG9mIEdhbG9pcyBGaWVsZC4KKyAqCU4gOiBUaGUgY2h1bmsgY291bnQgb2YgcGVyIHBhZ2UuCisgKglPIDogdGhlIG9vYnNpemUgb2YgdGhlIE5BTkQgY2hpcC4KKyAqCU0gOiB0aGUgbWV0YXNpemUgb2YgcGVyIHBhZ2UuCisgKgorICoJVGhlIGZvcm11bGEgaXMgOgorICoJCUUgKiBHICogTgorICoJICAgICAgLS0tLS0tLS0tLS0tIDw9IChPIC0gTSkKKyAqICAgICAgICAgICAgICAgICAgOAorICoKKyAqICAgICAgU28sIHdlIGdldCBFIGJ5OgorICogICAgICAgICAgICAgICAgICAgIChPIC0gTSkgKiA4CisgKiAgICAgICAgICAgICAgRSA8PSAtLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgRyAqIE4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2VjY19zdHJlbmd0aChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwlzdHJ1Y3QgbXRkX2luZm8JKm10ZCA9ICZ0aGlzLT5tdGQ7CisJaW50IGVjY19zdHJlbmd0aDsKKworCWVjY19zdHJlbmd0aCA9ICgobXRkLT5vb2JzaXplIC0gZ2VvLT5tZXRhZGF0YV9zaXplKSAqIDgpCisJCQkvIChnZW8tPmdmX2xlbiAqIGdlby0+ZWNjX2NodW5rX2NvdW50KTsKKworCS8qIFdlIG5lZWQgdGhlIG1pbm9yIGV2ZW4gbnVtYmVyLiAqLworCXJldHVybiByb3VuZF9kb3duKGVjY19zdHJlbmd0aCwgMik7Cit9CisKK2ludCBjb21tb25fbmZjX3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZ0aGlzLT5tdGQ7CisJdW5zaWduZWQgaW50IG1ldGFkYXRhX3NpemU7CisJdW5zaWduZWQgaW50IHN0YXR1c19zaXplOworCXVuc2lnbmVkIGludCBibG9ja19tYXJrX2JpdF9vZmZzZXQ7CisKKwkvKgorCSAqIFRoZSBzaXplIG9mIHRoZSBtZXRhZGF0YSBjYW4gYmUgY2hhbmdlZCwgdGhvdWdoIHdlIHNldCBpdCB0byAxMAorCSAqIGJ5dGVzIG5vdy4gQnV0IGl0IGNhbid0IGJlIHRvbyBsYXJnZSwgYmVjYXVzZSB3ZSBoYXZlIHRvIHNhdmUKKwkgKiBlbm91Z2ggc3BhY2UgZm9yIEJDSC4KKwkgKi8KKwlnZW8tPm1ldGFkYXRhX3NpemUgPSAxMDsKKworCS8qIFRoZSBkZWZhdWx0IGZvciB0aGUgbGVuZ3RoIG9mIEdhbG9pcyBGaWVsZC4gKi8KKwlnZW8tPmdmX2xlbiA9IDEzOworCisJLyogVGhlIGRlZmF1bHQgZm9yIGNodW5rIHNpemUuIFRoZXJlIGlzIG5vIG9vYnNpemUgZ3JlYXRlciB0aGVuIDUxMi4gKi8KKwlnZW8tPmVjY19jaHVua19zaXplID0gNTEyOworCXdoaWxlIChnZW8tPmVjY19jaHVua19zaXplIDwgbXRkLT5vb2JzaXplKQorCQlnZW8tPmVjY19jaHVua19zaXplICo9IDI7IC8qIGtlZXAgQyA+PSBPICovCisKKwlnZW8tPmVjY19jaHVua19jb3VudCA9IG10ZC0+d3JpdGVzaXplIC8gZ2VvLT5lY2NfY2h1bmtfc2l6ZTsKKworCS8qIFdlIHVzZSB0aGUgc2FtZSBFQ0Mgc3RyZW5ndGggZm9yIGFsbCBjaHVua3MuICovCisJZ2VvLT5lY2Nfc3RyZW5ndGggPSBnZXRfZWNjX3N0cmVuZ3RoKHRoaXMpOworCWlmICghZ2VvLT5lY2Nfc3RyZW5ndGgpIHsKKwkJcHJfZXJyKCJXZSBnZXQgYSB3cm9uZyBFQ0Mgc3RyZW5ndGguXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZ2VvLT5wYWdlX3NpemUgPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZTsKKwlnZW8tPnBheWxvYWRfc2l6ZSA9IG10ZC0+d3JpdGVzaXplOworCisJLyoKKwkgKiBUaGUgYXV4aWxpYXJ5IGJ1ZmZlciBjb250YWlucyB0aGUgbWV0YWRhdGEgYW5kIHRoZSBFQ0Mgc3RhdHVzLiBUaGUKKwkgKiBtZXRhZGF0YSBpcyBwYWRkZWQgdG8gdGhlIG5lYXJlc3QgMzItYml0IGJvdW5kYXJ5LiBUaGUgRUNDIHN0YXR1cworCSAqIGNvbnRhaW5zIG9uZSBieXRlIGZvciBldmVyeSBFQ0MgY2h1bmssIGFuZCBpcyBhbHNvIHBhZGRlZCB0byB0aGUKKwkgKiBuZWFyZXN0IDMyLWJpdCBib3VuZGFyeS4KKwkgKi8KKwltZXRhZGF0YV9zaXplID0gQUxJR04oZ2VvLT5tZXRhZGF0YV9zaXplLCA0KTsKKwlzdGF0dXNfc2l6ZSAgID0gQUxJR04oZ2VvLT5lY2NfY2h1bmtfY291bnQsIDQpOworCisJZ2VvLT5hdXhpbGlhcnlfc2l6ZSA9IG1ldGFkYXRhX3NpemUgKyBzdGF0dXNfc2l6ZTsKKwlnZW8tPmF1eGlsaWFyeV9zdGF0dXNfb2Zmc2V0ID0gbWV0YWRhdGFfc2l6ZTsKKworCWlmICghdGhpcy0+c3dhcF9ibG9ja19tYXJrKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBieXRlIGFuZCBiaXQgb2Zmc2V0cyBvZgorCSAqIHRoZSBwaHlzaWNhbCBibG9jayBtYXJrIHdpdGhpbiB0aGUgRUNDLWJhc2VkIHZpZXcgb2YgdGhlIHBhZ2UuCisJICoKKwkgKiBOQU5EIGNoaXAgd2l0aCAySyBwYWdlIHNob3dzIGJlbG93OgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJsb2NrIE1hcmspCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRCAgIHwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw8LS0tLT58CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWICAgICAgVgorCSAqICAgICstLS0rLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0rLSstLS0tLS0tLS0tKy0rLS0tLS0tLS0tLSstKworCSAqICAgIHwgTSB8ICAgZGF0YSAgIHxFfCAgIGRhdGEgICB8RXwgICBkYXRhICAgfEV8ICAgZGF0YSAgIHxFfAorCSAqICAgICstLS0rLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0rLSstLS0tLS0tLS0tKy0rLS0tLS0tLS0tLSstKworCSAqCisJICogVGhlIHBvc2l0aW9uIG9mIGJsb2NrIG1hcmsgbW92ZXMgZm9yd2FyZCBpbiB0aGUgRUNDLWJhc2VkIHZpZXcKKwkgKiBvZiBwYWdlLCBhbmQgdGhlIGRlbHRhIGlzOgorCSAqCisJICogICAgICAgICAgICAgICAgICAgRSAqIEcgKiAoTiAtIDEpCisJICogICAgICAgICAgICAgRCA9ICgtLS0tLS0tLS0tLS0tLS0tICsgTSkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgOAorCSAqCisJICogV2l0aCB0aGUgZm9ybXVsYSB0byBjb21wdXRlIHRoZSBFQ0Mgc3RyZW5ndGgsIGFuZCB0aGUgY29uZGl0aW9uCisJICogICAgICAgOiBDID49IE8gICAgICAgICAoQyBpcyB0aGUgZWNjIGNodW5rIHNpemUpCisJICoKKwkgKiBJdCdzIGVhc3kgdG8gZGVkdWNlIHRvIHRoZSBmb2xsb3dpbmcgcmVzdWx0OgorCSAqCisJICogICAgICAgICBFICogRyAgICAgICAoTyAtIE0pICAgICAgQyAtIE0gICAgICAgICBDIC0gTQorCSAqICAgICAgLS0tLS0tLS0tLS0gPD0gLS0tLS0tLSA8PSAgLS0tLS0tLS0gIDwgIC0tLS0tLS0tLQorCSAqICAgICAgICAgICA4ICAgICAgICAgICAgTiAgICAgICAgICAgTiAgICAgICAgICAoTiAtIDEpCisJICoKKwkgKiAgU28sIHdlIGdldDoKKwkgKgorCSAqICAgICAgICAgICAgICAgICAgIEUgKiBHICogKE4gLSAxKQorCSAqICAgICAgICAgICAgIEQgPSAoLS0tLS0tLS0tLS0tLS0tLSArIE0pIDwgQworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICA4CisJICoKKwkgKiAgVGhlIGFib3ZlIGluZXF1YWxpdHkgbWVhbnMgdGhlIHBvc2l0aW9uIG9mIGJsb2NrIG1hcmsKKwkgKiAgd2l0aGluIHRoZSBFQ0MtYmFzZWQgdmlldyBvZiB0aGUgcGFnZSBpcyBzdGlsbCBpbiB0aGUgZGF0YSBjaHVuaywKKwkgKiAgYW5kIGl0J3MgTk9UIGluIHRoZSBFQ0MgYml0cyBvZiB0aGUgY2h1bmsuCisJICoKKwkgKiAgVXNlIHRoZSBmb2xsb3dpbmcgdG8gY29tcHV0ZSB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZQorCSAqICBwaHlzaWNhbCBibG9jayBtYXJrIHdpdGhpbiB0aGUgRUNDLWJhc2VkIHZpZXcgb2YgdGhlIHBhZ2U6CisJICogICAgICAgICAgKHBhZ2Vfc2l6ZSAtIEQpICogOAorCSAqCisJICogIC0tSHVhbmcgU2hpamllCisJICovCisJYmxvY2tfbWFya19iaXRfb2Zmc2V0ID0gbXRkLT53cml0ZXNpemUgKiA4IC0KKwkJKGdlby0+ZWNjX3N0cmVuZ3RoICogZ2VvLT5nZl9sZW4gKiAoZ2VvLT5lY2NfY2h1bmtfY291bnQgLSAxKQorCQkJCSsgZ2VvLT5tZXRhZGF0YV9zaXplICogOCk7CisKKwlnZW8tPmJsb2NrX21hcmtfYnl0ZV9vZmZzZXQgPSBibG9ja19tYXJrX2JpdF9vZmZzZXQgLyA4OworCWdlby0+YmxvY2tfbWFya19iaXRfb2Zmc2V0ICA9IGJsb2NrX21hcmtfYml0X29mZnNldCAlIDg7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBkbWFfY2hhbiAqZ2V0X2RtYV9jaGFuKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlpbnQgY2hpcG5yID0gdGhpcy0+Y3VycmVudF9jaGlwOworCisJcmV0dXJuIHRoaXMtPmRtYV9jaGFuc1tjaGlwbnJdOworfQorCisvKiBDYW4gd2UgdXNlIHRoZSB1cHBlcidzIGJ1ZmZlciBkaXJlY3RseSBmb3IgRE1BPyAqLwordm9pZCBwcmVwYXJlX2RhdGFfZG1hKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZHIpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSAmdGhpcy0+ZGF0YV9zZ2w7CisJaW50IHJldDsKKworCXRoaXMtPmRpcmVjdF9kbWFfbWFwX29rID0gdHJ1ZTsKKworCS8qIGZpcnN0IHRyeSB0byBtYXAgdGhlIHVwcGVyIGJ1ZmZlciBkaXJlY3RseSAqLworCXNnX2luaXRfb25lKHNnbCwgdGhpcy0+dXBwZXJfYnVmLCB0aGlzLT51cHBlcl9sZW4pOworCXJldCA9IGRtYV9tYXBfc2codGhpcy0+ZGV2LCBzZ2wsIDEsIGRyKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyogV2UgaGF2ZSB0byB1c2Ugb3VyIG93biBETUEgYnVmZmVyLiAqLworCQlzZ19pbml0X29uZShzZ2wsIHRoaXMtPmRhdGFfYnVmZmVyX2RtYSwgUEFHRV9TSVpFKTsKKworCQlpZiAoZHIgPT0gRE1BX1RPX0RFVklDRSkKKwkJCW1lbWNweSh0aGlzLT5kYXRhX2J1ZmZlcl9kbWEsIHRoaXMtPnVwcGVyX2J1ZiwKKwkJCQl0aGlzLT51cHBlcl9sZW4pOworCisJCXJldCA9IGRtYV9tYXBfc2codGhpcy0+ZGV2LCBzZ2wsIDEsIGRyKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcHJfZXJyKCJtYXAgZmFpbGVkLlxuIik7CisKKwkJdGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPSBmYWxzZTsKKwl9Cit9CisKKy8qIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIERNQSBvcGVyYXRpb24gaXMgZmluaXNoZWQuICovCitzdGF0aWMgdm9pZCBkbWFfaXJxX2NhbGxiYWNrKHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IHBhcmFtOworCXN0cnVjdCBjb21wbGV0aW9uICpkbWFfYyA9ICZ0aGlzLT5kbWFfZG9uZTsKKworCWNvbXBsZXRlKGRtYV9jKTsKKworCXN3aXRjaCAodGhpcy0+ZG1hX3R5cGUpIHsKKwljYXNlIERNQV9GT1JfQ09NTUFORDoKKwkJZG1hX3VubWFwX3NnKHRoaXMtPmRldiwgJnRoaXMtPmNtZF9zZ2wsIDEsIERNQV9UT19ERVZJQ0UpOworCQlicmVhazsKKworCWNhc2UgRE1BX0ZPUl9SRUFEX0RBVEE6CisJCWRtYV91bm1hcF9zZyh0aGlzLT5kZXYsICZ0aGlzLT5kYXRhX3NnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKHRoaXMtPmRpcmVjdF9kbWFfbWFwX29rID09IGZhbHNlKQorCQkJbWVtY3B5KHRoaXMtPnVwcGVyX2J1ZiwgdGhpcy0+ZGF0YV9idWZmZXJfZG1hLAorCQkJCXRoaXMtPnVwcGVyX2xlbik7CisJCWJyZWFrOworCisJY2FzZSBETUFfRk9SX1dSSVRFX0RBVEE6CisJCWRtYV91bm1hcF9zZyh0aGlzLT5kZXYsICZ0aGlzLT5kYXRhX3NnbCwgMSwgRE1BX1RPX0RFVklDRSk7CisJCWJyZWFrOworCisJY2FzZSBETUFfRk9SX1JFQURfRUNDX1BBR0U6CisJY2FzZSBETUFfRk9SX1dSSVRFX0VDQ19QQUdFOgorCQkvKiBXZSBoYXZlIHRvIHdhaXQgdGhlIEJDSCBpbnRlcnJ1cHQgdG8gZmluaXNoLiAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2VycigiaW4gd3JvbmcgRE1BIG9wZXJhdGlvbi5cbiIpOworCX0KK30KKworaW50IHN0YXJ0X2RtYV93aXRob3V0X2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbiAqZG1hX2MgPSAmdGhpcy0+ZG1hX2RvbmU7CisJaW50IGVycjsKKworCWluaXRfY29tcGxldGlvbihkbWFfYyk7CisKKwlkZXNjLT5jYWxsYmFjawkJPSBkbWFfaXJxX2NhbGxiYWNrOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtCT0gdGhpczsKKwlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCisJLyogV2FpdCBmb3IgdGhlIGludGVycnVwdCBmcm9tIHRoZSBETUEgYmxvY2suICovCisJZXJyID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KGRtYV9jLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlpZiAoIWVycikgeworCQlwcl9lcnIoIkRNQSB0aW1lb3V0LCBsYXN0IERNQSA6JWRcbiIsIHRoaXMtPmxhc3RfZG1hX3R5cGUpOworCQlncG1pX2R1bXBfaW5mbyh0aGlzKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJDSCByZWFkaW5nIG9yIEJDSCB3cml0aW5nIHBhZ2VzLgorICogSXQgd2lsbCB3YWl0IGZvciB0aGUgQkNIIGludGVycnVwdCBhcyBsb25nIGFzIE9ORSBzZWNvbmQuCisgKiBBY3R1YWxseSwgd2UgbXVzdCB3YWl0IGZvciB0d28gaW50ZXJydXB0cyA6CisgKglbMV0gZmlyc3RseSB0aGUgRE1BIGludGVycnVwdCBhbmQKKyAqCVsyXSBzZWNvbmRseSB0aGUgQkNIIGludGVycnVwdC4KKyAqLworaW50IHN0YXJ0X2RtYV93aXRoX2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBjb21wbGV0aW9uICpiY2hfYyA9ICZ0aGlzLT5iY2hfZG9uZTsKKwlpbnQgZXJyOworCisJLyogUHJlcGFyZSB0byByZWNlaXZlIGFuIGludGVycnVwdCBmcm9tIHRoZSBCQ0ggYmxvY2suICovCisJaW5pdF9jb21wbGV0aW9uKGJjaF9jKTsKKworCS8qIHN0YXJ0IHRoZSBETUEgKi8KKwlzdGFydF9kbWFfd2l0aG91dF9iY2hfaXJxKHRoaXMsIGRlc2MpOworCisJLyogV2FpdCBmb3IgdGhlIGludGVycnVwdCBmcm9tIHRoZSBCQ0ggYmxvY2suICovCisJZXJyID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KGJjaF9jLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlpZiAoIWVycikgeworCQlwcl9lcnIoIkJDSCB0aW1lb3V0LCBsYXN0IERNQSA6JWRcbiIsIHRoaXMtPmxhc3RfZG1hX3R5cGUpOworCQlncG1pX2R1bXBfaW5mbyh0aGlzKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorYWNxdWlyZV9yZWdpc3Rlcl9ibG9jayhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0aGlzLT5wZGV2OworCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJc3RydWN0IHJlc291cmNlICpyOworCXZvaWQgKnA7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcmVzX25hbWUpOworCWlmICghcikgeworCQlwcl9lcnIoIkNhbid0IGdldCByZXNvdXJjZSBmb3IgJXNcbiIsIHJlc19uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwID0gaW9yZW1hcChyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJaWYgKCFwKSB7CisJCXByX2VycigiQ2FuJ3QgcmVtYXAgJXNcbiIsIHJlc19uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFzdHJjbXAocmVzX25hbWUsIEdQTUlfTkFORF9HUE1JX1JFR1NfQUREUl9SRVNfTkFNRSkpCisJCXJlcy0+Z3BtaV9yZWdzID0gcDsKKwllbHNlIGlmICghc3RyY21wKHJlc19uYW1lLCBHUE1JX05BTkRfQkNIX1JFR1NfQUREUl9SRVNfTkFNRSkpCisJCXJlcy0+YmNoX3JlZ3MgPSBwOworCWVsc2UKKwkJcHJfZXJyKCJ1bmtub3duIHJlc291cmNlIG5hbWUgOiAlc1xuIiwgcmVzX25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVnaXN0ZXJfYmxvY2soc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJaWYgKHJlcy0+Z3BtaV9yZWdzKQorCQlpb3VubWFwKHJlcy0+Z3BtaV9yZWdzKTsKKwlpZiAocmVzLT5iY2hfcmVncykKKwkJaW91bm1hcChyZXMtPmJjaF9yZWdzKTsKKwlyZXMtPmdwbWlfcmVncyA9IE5VTEw7CisJcmVzLT5iY2hfcmVncyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CithY3F1aXJlX2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLCBpcnFfaGFuZGxlcl90IGlycV9oKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0aGlzLT5wZGV2OworCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJY29uc3QgY2hhciAqcmVzX25hbWUgPSBHUE1JX05BTkRfQkNIX0lOVEVSUlVQVF9SRVNfTkFNRTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGVycjsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCByZXNfbmFtZSk7CisJaWYgKCFyKSB7CisJCXByX2VycigiQ2FuJ3QgZ2V0IHJlc291cmNlIGZvciAlc1xuIiwgcmVzX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKHItPnN0YXJ0LCBpcnFfaCwgMCwgcmVzX25hbWUsIHRoaXMpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJDYW4ndCBvd24gJXNcbiIsIHJlc19uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXMtPmJjaF9sb3dfaW50ZXJydXB0ID0gci0+c3RhcnQ7CisJcmVzLT5iY2hfaGlnaF9pbnRlcnJ1cHQgPSByLT5lbmQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYmNoX2lycShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHJlc291cmNlcyAqcmVzID0gJnRoaXMtPnJlc291cmNlczsKKwlpbnQgaSA9IHJlcy0+YmNoX2xvd19pbnRlcnJ1cHQ7CisKKwlmb3IgKDsgaSA8PSByZXMtPmJjaF9oaWdoX2ludGVycnVwdDsgaSsrKQorCQlmcmVlX2lycShpLCB0aGlzKTsKK30KKworc3RhdGljIGJvb2wgZ3BtaV9kbWFfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gcGFyYW07CisJc3RydWN0IHJlc291cmNlICpyID0gdGhpcy0+cHJpdmF0ZTsKKworCWlmICghbXhzX2RtYV9pc19hcGJoKGNoYW4pKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgKiBvbmx5IGNhdGNoIHRoZSBHUE1JIGRtYSBjaGFubmVscyA6CisJICoJZm9yIG14MjMgOglNWDIzX0RNQV9HUE1JMCB+IE1YMjNfRE1BX0dQTUkzCisJICoJCShUaGVzZSBmb3VyIGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIElSUSEpCisJICoKKwkgKglmb3IgbXgyOCA6CU1YMjhfRE1BX0dQTUkwIH4gTVgyOF9ETUFfR1BNSTcKKwkgKgkJKFRoZXNlIGVpZ2h0IGNoYW5uZWxzIHNoYXJlIHRoZSBzYW1lIElSUSEpCisJICovCisJaWYgKHItPnN0YXJ0IDw9IGNoYW4tPmNoYW5faWQgJiYgY2hhbi0+Y2hhbl9pZCA8PSByLT5lbmQpIHsKKwkJY2hhbi0+cHJpdmF0ZSA9ICZ0aGlzLT5kbWFfZGF0YTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9kbWFfY2hhbm5lbHMoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBETUFfQ0hBTlM7IGkrKykKKwkJaWYgKHRoaXMtPmRtYV9jaGFuc1tpXSkgeworCQkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0aGlzLT5kbWFfY2hhbnNbaV0pOworCQkJdGhpcy0+ZG1hX2NoYW5zW2ldID0gTlVMTDsKKwkJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY3F1aXJlX2RtYV9jaGFubmVscyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRoaXMtPnBkZXY7CisJc3RydWN0IGdwbWlfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHRoaXMtPnBkYXRhOworCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJc3RydWN0IHJlc291cmNlICpyLCAqcl9kbWE7CisJdW5zaWduZWQgaW50IGk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0RNQSwKKwkJCQkJR1BNSV9OQU5EX0RNQV9DSEFOTkVMU19SRVNfTkFNRSk7CisJcl9kbWEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSVJRLAorCQkJCQlHUE1JX05BTkRfRE1BX0lOVEVSUlVQVF9SRVNfTkFNRSk7CisJaWYgKCFyIHx8ICFyX2RtYSkgeworCQlwcl9lcnIoIkNhbid0IGdldCByZXNvdXJjZSBmb3IgRE1BXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiB1c2VkIGluIGdwbWlfZG1hX2ZpbHRlcigpICovCisJdGhpcy0+cHJpdmF0ZSA9IHI7CisKKwlmb3IgKGkgPSByLT5zdGFydDsgaSA8PSByLT5lbmQ7IGkrKykgeworCQlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCQlkbWFfY2FwX21hc2tfdCBtYXNrOworCisJCWlmIChpIC0gci0+c3RhcnQgPj0gcGRhdGEtPm1heF9jaGlwX2NvdW50KQorCQkJYnJlYWs7CisKKwkJZG1hX2NhcF96ZXJvKG1hc2spOworCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOworCisJCS8qIGdldCB0aGUgRE1BIGludGVycnVwdCAqLworCQlpZiAocl9kbWEtPnN0YXJ0ID09IHJfZG1hLT5lbmQpIHsKKwkJCS8qIG9ubHkgcmVnaXN0ZXIgdGhlIGZpcnN0LiAqLworCQkJaWYgKGkgPT0gci0+c3RhcnQpCisJCQkJdGhpcy0+ZG1hX2RhdGEuY2hhbl9pcnEgPSByX2RtYS0+c3RhcnQ7CisJCQllbHNlCisJCQkJdGhpcy0+ZG1hX2RhdGEuY2hhbl9pcnEgPSBOT19JUlE7CisJCX0gZWxzZQorCQkJdGhpcy0+ZG1hX2RhdGEuY2hhbl9pcnEgPSByX2RtYS0+c3RhcnQgKyAoaSAtIHItPnN0YXJ0KTsKKworCQlkbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgZ3BtaV9kbWFfZmlsdGVyLCB0aGlzKTsKKwkJaWYgKCFkbWFfY2hhbikKKwkJCWdvdG8gYWNxdWlyZV9lcnI7CisKKwkJLyogZmlsbCB0aGUgZmlyc3QgZW1wdHkgaXRlbSAqLworCQl0aGlzLT5kbWFfY2hhbnNbaSAtIHItPnN0YXJ0XSA9IGRtYV9jaGFuOworCX0KKworCXJlcy0+ZG1hX2xvd19jaGFubmVsID0gci0+c3RhcnQ7CisJcmVzLT5kbWFfaGlnaF9jaGFubmVsID0gaTsKKwlyZXR1cm4gMDsKKworYWNxdWlyZV9lcnI6CisJcHJfZXJyKCJDYW4ndCBhY3F1aXJlIERNQSBjaGFubmVsICV1XG4iLCBpKTsKKwlyZWxlYXNlX2RtYV9jaGFubmVscyh0aGlzKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWNxdWlyZV9yZXNvdXJjZXMoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnJlcyA9ICZ0aGlzLT5yZXNvdXJjZXM7CisJaW50IHJldDsKKworCXJldCA9IGFjcXVpcmVfcmVnaXN0ZXJfYmxvY2sodGhpcywgR1BNSV9OQU5EX0dQTUlfUkVHU19BRERSX1JFU19OQU1FKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfcmVnczsKKworCXJldCA9IGFjcXVpcmVfcmVnaXN0ZXJfYmxvY2sodGhpcywgR1BNSV9OQU5EX0JDSF9SRUdTX0FERFJfUkVTX05BTUUpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9yZWdzOworCisJcmV0ID0gYWNxdWlyZV9iY2hfaXJxKHRoaXMsIGJjaF9pcnEpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9yZWdzOworCisJcmV0ID0gYWNxdWlyZV9kbWFfY2hhbm5lbHModGhpcyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2RtYV9jaGFubmVsczsKKworCXJlcy0+Y2xvY2sgPSBjbGtfZ2V0KCZ0aGlzLT5wZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocmVzLT5jbG9jaykpIHsKKwkJcHJfZXJyKCJjYW4gbm90IGdldCB0aGUgY2xvY2tcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfY2xvY2s7CisJfQorCXJldHVybiAwOworCitleGl0X2Nsb2NrOgorCXJlbGVhc2VfZG1hX2NoYW5uZWxzKHRoaXMpOworZXhpdF9kbWFfY2hhbm5lbHM6CisJcmVsZWFzZV9iY2hfaXJxKHRoaXMpOworZXhpdF9yZWdzOgorCXJlbGVhc2VfcmVnaXN0ZXJfYmxvY2sodGhpcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCByZXNvdXJjZXMgKnIgPSAmdGhpcy0+cmVzb3VyY2VzOworCisJY2xrX3B1dChyLT5jbG9jayk7CisJcmVsZWFzZV9yZWdpc3Rlcl9ibG9jayh0aGlzKTsKKwlyZWxlYXNlX2JjaF9pcnEodGhpcyk7CisJcmVsZWFzZV9kbWFfY2hhbm5lbHModGhpcyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfaGFyZHdhcmUoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSAic2FmZSIgR1BNSSB0aW1pbmcgdGhhdCBzaG91bGQgc3VjY2VlZAorCSAqIHdpdGggYW55IE5BTkQgRmxhc2ggZGV2aWNlCisJICogKGFsdGhvdWdoLCB3aXRoIGxlc3MtdGhhbi1vcHRpbWFsIHBlcmZvcm1hbmNlKS4KKwkgKi8KKwlzdHJ1Y3QgbmFuZF90aW1pbmcgIHNhZmVfdGltaW5nID0geworCQkuZGF0YV9zZXR1cF9pbl9ucyAgICAgICAgPSA4MCwKKwkJLmRhdGFfaG9sZF9pbl9ucyAgICAgICAgID0gNjAsCisJCS5hZGRyZXNzX3NldHVwX2luX25zICAgICA9IDI1LAorCQkuZ3BtaV9zYW1wbGVfZGVsYXlfaW5fbnMgPSAgNiwKKwkJLnRSRUFfaW5fbnMgICAgICAgICAgICAgID0gLTEsCisJCS50UkxPSF9pbl9ucyAgICAgICAgICAgICA9IC0xLAorCQkudFJIT0hfaW5fbnMgICAgICAgICAgICAgPSAtMSwKKwl9OworCisJLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmVzLiAqLworCXJldCA9IGdwbWlfaW5pdCh0aGlzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGhpcy0+dGltaW5nID0gc2FmZV90aW1pbmc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWdlX3ByZXBhcmUoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJdm9pZCAqZGVzdGluYXRpb24sIHVuc2lnbmVkIGxlbmd0aCwKKwkJCXZvaWQgKmFsdF92aXJ0LCBkbWFfYWRkcl90IGFsdF9waHlzLCB1bnNpZ25lZCBhbHRfc2l6ZSwKKwkJCXZvaWQgKip1c2VfdmlydCwgZG1hX2FkZHJfdCAqdXNlX3BoeXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2OworCisJaWYgKHZpcnRfYWRkcl92YWxpZChkZXN0aW5hdGlvbikpIHsKKwkJZG1hX2FkZHJfdCBkZXN0X3BoeXM7CisKKwkJZGVzdF9waHlzID0gZG1hX21hcF9zaW5nbGUoZGV2LCBkZXN0aW5hdGlvbiwKKwkJCQkJCWxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZGVzdF9waHlzKSkgeworCQkJaWYgKGFsdF9zaXplIDwgbGVuZ3RoKSB7CisJCQkJcHJfZXJyKCJBbHRlcm5hdGUgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlnb3RvIG1hcF9mYWlsZWQ7CisJCX0KKwkJKnVzZV92aXJ0ID0gZGVzdGluYXRpb247CisJCSp1c2VfcGh5cyA9IGRlc3RfcGh5czsKKwkJdGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9CisKK21hcF9mYWlsZWQ6CisJKnVzZV92aXJ0ID0gYWx0X3ZpcnQ7CisJKnVzZV9waHlzID0gYWx0X3BoeXM7CisJdGhpcy0+ZGlyZWN0X2RtYV9tYXBfb2sgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlYWRfcGFnZV9lbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJdm9pZCAqZGVzdGluYXRpb24sIHVuc2lnbmVkIGxlbmd0aCwKKwkJCXZvaWQgKmFsdF92aXJ0LCBkbWFfYWRkcl90IGFsdF9waHlzLCB1bnNpZ25lZCBhbHRfc2l6ZSwKKwkJCXZvaWQgKnVzZWRfdmlydCwgZG1hX2FkZHJfdCB1c2VkX3BoeXMpCit7CisJaWYgKHRoaXMtPmRpcmVjdF9kbWFfbWFwX29rKQorCQlkbWFfdW5tYXBfc2luZ2xlKHRoaXMtPmRldiwgdXNlZF9waHlzLCBsZW5ndGgsIERNQV9GUk9NX0RFVklDRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWFkX3BhZ2Vfc3dhcF9lbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJdm9pZCAqZGVzdGluYXRpb24sIHVuc2lnbmVkIGxlbmd0aCwKKwkJCXZvaWQgKmFsdF92aXJ0LCBkbWFfYWRkcl90IGFsdF9waHlzLCB1bnNpZ25lZCBhbHRfc2l6ZSwKKwkJCXZvaWQgKnVzZWRfdmlydCwgZG1hX2FkZHJfdCB1c2VkX3BoeXMpCit7CisJaWYgKCF0aGlzLT5kaXJlY3RfZG1hX21hcF9vaykKKwkJbWVtY3B5KGRlc3RpbmF0aW9uLCBhbHRfdmlydCwgbGVuZ3RoKTsKK30KKworc3RhdGljIGludCBzZW5kX3BhZ2VfcHJlcGFyZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMsCisJCQljb25zdCB2b2lkICpzb3VyY2UsIHVuc2lnbmVkIGxlbmd0aCwKKwkJCXZvaWQgKmFsdF92aXJ0LCBkbWFfYWRkcl90IGFsdF9waHlzLCB1bnNpZ25lZCBhbHRfc2l6ZSwKKwkJCWNvbnN0IHZvaWQgKip1c2VfdmlydCwgZG1hX2FkZHJfdCAqdXNlX3BoeXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2OworCisJaWYgKHZpcnRfYWRkcl92YWxpZChzb3VyY2UpKSB7CisJCWRtYV9hZGRyX3Qgc291cmNlX3BoeXM7CisKKwkJc291cmNlX3BoeXMgPSBkbWFfbWFwX3NpbmdsZShkZXYsICh2b2lkICopc291cmNlLCBsZW5ndGgsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgc291cmNlX3BoeXMpKSB7CisJCQlpZiAoYWx0X3NpemUgPCBsZW5ndGgpIHsKKwkJCQlwcl9lcnIoIkFsdGVybmF0ZSBidWZmZXIgaXMgdG9vIHNtYWxsXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWdvdG8gbWFwX2ZhaWxlZDsKKwkJfQorCQkqdXNlX3ZpcnQgPSBzb3VyY2U7CisJCSp1c2VfcGh5cyA9IHNvdXJjZV9waHlzOworCQlyZXR1cm4gMDsKKwl9CittYXBfZmFpbGVkOgorCS8qCisJICogQ29weSB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBhbHRlcm5hdGUKKwkgKiBidWZmZXIgYW5kIHNldCB1cCB0aGUgcmV0dXJuIHZhbHVlcyBhY2NvcmRpbmdseS4KKwkgKi8KKwltZW1jcHkoYWx0X3ZpcnQsIHNvdXJjZSwgbGVuZ3RoKTsKKworCSp1c2VfdmlydCA9IGFsdF92aXJ0OworCSp1c2VfcGh5cyA9IGFsdF9waHlzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhZ2VfZW5kKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcywKKwkJCWNvbnN0IHZvaWQgKnNvdXJjZSwgdW5zaWduZWQgbGVuZ3RoLAorCQkJdm9pZCAqYWx0X3ZpcnQsIGRtYV9hZGRyX3QgYWx0X3BoeXMsIHVuc2lnbmVkIGFsdF9zaXplLAorCQkJY29uc3Qgdm9pZCAqdXNlZF92aXJ0LCBkbWFfYWRkcl90IHVzZWRfcGh5cykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisJaWYgKHVzZWRfdmlydCA9PSBzb3VyY2UpCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB1c2VkX3BoeXMsIGxlbmd0aCwgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyB2b2lkIGdwbWlfZnJlZV9kbWFfYnVmZmVyKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisKKwlpZiAodGhpcy0+cGFnZV9idWZmZXJfdmlydCAmJiB2aXJ0X2FkZHJfdmFsaWQodGhpcy0+cGFnZV9idWZmZXJfdmlydCkpCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgdGhpcy0+cGFnZV9idWZmZXJfc2l6ZSwKKwkJCQkJdGhpcy0+cGFnZV9idWZmZXJfdmlydCwKKwkJCQkJdGhpcy0+cGFnZV9idWZmZXJfcGh5cyk7CisJa2ZyZWUodGhpcy0+Y21kX2J1ZmZlcik7CisJa2ZyZWUodGhpcy0+ZGF0YV9idWZmZXJfZG1hKTsKKworCXRoaXMtPmNtZF9idWZmZXIJPSBOVUxMOworCXRoaXMtPmRhdGFfYnVmZmVyX2RtYQk9IE5VTEw7CisJdGhpcy0+cGFnZV9idWZmZXJfdmlydAk9IE5VTEw7CisJdGhpcy0+cGFnZV9idWZmZXJfc2l6ZQk9ICAwOworfQorCisvKiBBbGxvY2F0ZSB0aGUgRE1BIGJ1ZmZlcnMgKi8KK3N0YXRpYyBpbnQgZ3BtaV9hbGxvY19kbWFfYnVmZmVyKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpnZW8gPSAmdGhpcy0+YmNoX2dlb21ldHJ5OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsKKworCS8qIFsxXSBBbGxvY2F0ZSBhIGNvbW1hbmQgYnVmZmVyLiBQQUdFX1NJWkUgaXMgZW5vdWdoLiAqLworCXRoaXMtPmNtZF9idWZmZXIgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0RNQSk7CisJaWYgKHRoaXMtPmNtZF9idWZmZXIgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKworCS8qIFsyXSBBbGxvY2F0ZSBhIHJlYWQvd3JpdGUgZGF0YSBidWZmZXIuIFBBR0VfU0laRSBpcyBlbm91Z2guICovCisJdGhpcy0+ZGF0YV9idWZmZXJfZG1hID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9ETUEpOworCWlmICh0aGlzLT5kYXRhX2J1ZmZlcl9kbWEgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKworCS8qCisJICogWzNdIEFsbG9jYXRlIHRoZSBwYWdlIGJ1ZmZlci4KKwkgKgorCSAqIEJvdGggdGhlIHBheWxvYWQgYnVmZmVyIGFuZCB0aGUgYXV4aWxpYXJ5IGJ1ZmZlciBtdXN0IGFwcGVhciBvbgorCSAqIDMyLWJpdCBib3VuZGFyaWVzLiBXZSBwcmVzdW1lIHRoZSBzaXplIG9mIHRoZSBwYXlsb2FkIGJ1ZmZlciBpcyBhCisJICogcG93ZXIgb2YgdHdvIGFuZCBpcyBtdWNoIGxhcmdlciB0aGFuIGZvdXIsIHdoaWNoIGd1YXJhbnRlZXMgdGhlCisJICogYXV4aWxpYXJ5IGJ1ZmZlciB3aWxsIGFwcGVhciBvbiBhIDMyLWJpdCBib3VuZGFyeS4KKwkgKi8KKwl0aGlzLT5wYWdlX2J1ZmZlcl9zaXplID0gZ2VvLT5wYXlsb2FkX3NpemUgKyBnZW8tPmF1eGlsaWFyeV9zaXplOworCXRoaXMtPnBhZ2VfYnVmZmVyX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCB0aGlzLT5wYWdlX2J1ZmZlcl9zaXplLAorCQkJCQkmdGhpcy0+cGFnZV9idWZmZXJfcGh5cywgR0ZQX0RNQSk7CisJaWYgKCF0aGlzLT5wYWdlX2J1ZmZlcl92aXJ0KQorCQlnb3RvIGVycm9yX2FsbG9jOworCisKKwkvKiBTbGljZSB1cCB0aGUgcGFnZSBidWZmZXIuICovCisJdGhpcy0+cGF5bG9hZF92aXJ0ID0gdGhpcy0+cGFnZV9idWZmZXJfdmlydDsKKwl0aGlzLT5wYXlsb2FkX3BoeXMgPSB0aGlzLT5wYWdlX2J1ZmZlcl9waHlzOworCXRoaXMtPmF1eGlsaWFyeV92aXJ0ID0gdGhpcy0+cGF5bG9hZF92aXJ0ICsgZ2VvLT5wYXlsb2FkX3NpemU7CisJdGhpcy0+YXV4aWxpYXJ5X3BoeXMgPSB0aGlzLT5wYXlsb2FkX3BoeXMgKyBnZW8tPnBheWxvYWRfc2l6ZTsKKwlyZXR1cm4gMDsKKworZXJyb3JfYWxsb2M6CisJZ3BtaV9mcmVlX2RtYV9idWZmZXIodGhpcyk7CisJcHJfZXJyKCJhbGxvY2F0ZSBETUEgYnVmZmVyIHJldCEhXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgZ3BtaV9jbWRfY3RybChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGRhdGEsIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBFdmVyeSBvcGVyYXRpb24gYmVnaW5zIHdpdGggYSBjb21tYW5kIGJ5dGUgYW5kIGEgc2VyaWVzIG9mIHplcm8gb3IKKwkgKiBtb3JlIGFkZHJlc3MgYnl0ZXMuIFRoZXNlIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IGVpdGhlciB0aGUgQWRkcmVzcworCSAqIExhdGNoIEVuYWJsZSAoQUxFKSBvciBDb21tYW5kIExhdGNoIEVuYWJsZSAoQ0xFKSBzaWduYWxzIGJlaW5nCisJICogYXNzZXJ0ZWQuIFdoZW4gTVREIGlzIHJlYWR5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQsIGl0IHdpbGwgZGVhc3NlcnQKKwkgKiBib3RoIGxhdGNoIGVuYWJsZXMuCisJICoKKwkgKiBSYXRoZXIgdGhhbiBydW4gYSBzZXBhcmF0ZSBETUEgb3BlcmF0aW9uIGZvciBldmVyeSBzaW5nbGUgYnl0ZSwgd2UKKwkgKiBxdWV1ZSB0aGVtIHVwIGFuZCBydW4gYSBzaW5nbGUgRE1BIG9wZXJhdGlvbiBmb3IgdGhlIGVudGlyZSBzZXJpZXMKKwkgKiBvZiBjb21tYW5kIGFuZCBkYXRhIGJ5dGVzLiBOQU5EX0NNRF9OT05FIG1lYW5zIHRoZSBFTkQgb2YgdGhlIHF1ZXVlLgorCSAqLworCWlmICgoY3RybCAmIChOQU5EX0FMRSB8IE5BTkRfQ0xFKSkpIHsKKwkJaWYgKGRhdGEgIT0gTkFORF9DTURfTk9ORSkKKwkJCXRoaXMtPmNtZF9idWZmZXJbdGhpcy0+Y29tbWFuZF9sZW5ndGgrK10gPSBkYXRhOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0aGlzLT5jb21tYW5kX2xlbmd0aCkKKwkJcmV0dXJuOworCisJcmV0ID0gZ3BtaV9zZW5kX2NvbW1hbmQodGhpcyk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJDaGlwOiAldSwgRXJyb3IgJWRcbiIsIHRoaXMtPmN1cnJlbnRfY2hpcCwgcmV0KTsKKworCXRoaXMtPmNvbW1hbmRfbGVuZ3RoID0gMDsKK30KKworc3RhdGljIGludCBncG1pX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisKKwlyZXR1cm4gZ3BtaV9pc19yZWFkeSh0aGlzLCB0aGlzLT5jdXJyZW50X2NoaXApOworfQorCitzdGF0aWMgdm9pZCBncG1pX3NlbGVjdF9jaGlwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcG5yKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKworCWlmICgodGhpcy0+Y3VycmVudF9jaGlwIDwgMCkgJiYgKGNoaXBuciA+PSAwKSkKKwkJZ3BtaV9iZWdpbih0aGlzKTsKKwllbHNlIGlmICgodGhpcy0+Y3VycmVudF9jaGlwID49IDApICYmIChjaGlwbnIgPCAwKSkKKwkJZ3BtaV9lbmQodGhpcyk7CisKKwl0aGlzLT5jdXJyZW50X2NoaXAgPSBjaGlwbnI7Cit9CisKK3N0YXRpYyB2b2lkIGdwbWlfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisKKwlwcl9kZWJ1ZygibGVuIGlzICVkXG4iLCBsZW4pOworCXRoaXMtPnVwcGVyX2J1Zgk9IGJ1ZjsKKwl0aGlzLT51cHBlcl9sZW4JPSBsZW47CisKKwlncG1pX3JlYWRfZGF0YSh0aGlzKTsKK30KKworc3RhdGljIHZvaWQgZ3BtaV93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisKKwlwcl9kZWJ1ZygibGVuIGlzICVkXG4iLCBsZW4pOworCXRoaXMtPnVwcGVyX2J1Zgk9ICh1aW50OF90ICopYnVmOworCXRoaXMtPnVwcGVyX2xlbgk9IGxlbjsKKworCWdwbWlfc2VuZF9kYXRhKHRoaXMpOworfQorCitzdGF0aWMgdWludDhfdCBncG1pX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisJdWludDhfdCAqYnVmID0gdGhpcy0+ZGF0YV9idWZmZXJfZG1hOworCisJZ3BtaV9yZWFkX2J1ZihtdGQsIGJ1ZiwgMSk7CisJcmV0dXJuIGJ1ZlswXTsKK30KKworLyoKKyAqIEhhbmRsZXMgYmxvY2sgbWFyayBzd2FwcGluZy4KKyAqIEl0IGNhbiBiZSBjYWxsZWQgaW4gc3dhcHBpbmcgdGhlIGJsb2NrIG1hcmssIG9yIHN3YXBwaW5nIGl0IGJhY2ssCisgKiBiZWNhdXNlIHRoZSB0aGUgb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUuCisgKi8KK3N0YXRpYyB2b2lkIGJsb2NrX21hcmtfc3dhcHBpbmcoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzLAorCQkJCXZvaWQgKnBheWxvYWQsIHZvaWQgKmF1eGlsaWFyeSkKK3sKKwlzdHJ1Y3QgYmNoX2dlb21ldHJ5ICpuZmNfZ2VvID0gJnRoaXMtPmJjaF9nZW9tZXRyeTsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKmE7CisJdW5zaWduZWQgaW50ICBiaXQ7CisJdW5zaWduZWQgY2hhciBtYXNrOworCXVuc2lnbmVkIGNoYXIgZnJvbV9kYXRhOworCXVuc2lnbmVkIGNoYXIgZnJvbV9vb2I7CisKKwlpZiAoIXRoaXMtPnN3YXBfYmxvY2tfbWFyaykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UncmUgc3dhcHBpbmcuIE1ha2Ugc29tZSBjb252ZW5pZW5jZQorCSAqIHZhcmlhYmxlcy4KKwkgKi8KKwliaXQgPSBuZmNfZ2VvLT5ibG9ja19tYXJrX2JpdF9vZmZzZXQ7CisJcCAgID0gcGF5bG9hZCArIG5mY19nZW8tPmJsb2NrX21hcmtfYnl0ZV9vZmZzZXQ7CisJYSAgID0gYXV4aWxpYXJ5OworCisJLyoKKwkgKiBHZXQgdGhlIGJ5dGUgZnJvbSB0aGUgZGF0YSBhcmVhIHRoYXQgb3ZlcmxheXMgdGhlIGJsb2NrIG1hcmsuIFNpbmNlCisJICogdGhlIEVDQyBlbmdpbmUgYXBwbGllcyBpdHMgb3duIHZpZXcgdG8gdGhlIGJpdHMgaW4gdGhlIHBhZ2UsIHRoZQorCSAqIHBoeXNpY2FsIGJsb2NrIG1hcmsgd29uJ3QgKGluIGdlbmVyYWwpIGFwcGVhciBvbiBhIGJ5dGUgYm91bmRhcnkgaW4KKwkgKiB0aGUgZGF0YS4KKwkgKi8KKwlmcm9tX2RhdGEgPSAocFswXSA+PiBiaXQpIHwgKHBbMV0gPDwgKDggLSBiaXQpKTsKKworCS8qIEdldCB0aGUgYnl0ZSBmcm9tIHRoZSBPT0IuICovCisJZnJvbV9vb2IgPSBhWzBdOworCisJLyogU3dhcCB0aGVtLiAqLworCWFbMF0gPSBmcm9tX2RhdGE7CisKKwltYXNrID0gKDB4MSA8PCBiaXQpIC0gMTsKKwlwWzBdID0gKHBbMF0gJiBtYXNrKSB8IChmcm9tX29vYiA8PCBiaXQpOworCisJbWFzayA9IH4wIDw8IGJpdDsKKwlwWzFdID0gKHBbMV0gJiBtYXNrKSB8IChmcm9tX29vYiA+PiAoOCAtIGJpdCkpOworfQorCitzdGF0aWMgaW50IGdwbWlfZWNjX3JlYWRfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCQl1aW50OF90ICpidWYsIGludCBwYWdlKQoreworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqbmZjX2dlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJdm9pZCAgICAgICAgICAqcGF5bG9hZF92aXJ0OworCWRtYV9hZGRyX3QgICAgcGF5bG9hZF9waHlzOworCXZvaWQgICAgICAgICAgKmF1eGlsaWFyeV92aXJ0OworCWRtYV9hZGRyX3QgICAgYXV4aWxpYXJ5X3BoeXM7CisJdW5zaWduZWQgaW50ICBpOworCXVuc2lnbmVkIGNoYXIgKnN0YXR1czsKKwl1bnNpZ25lZCBpbnQgIGZhaWxlZDsKKwl1bnNpZ25lZCBpbnQgIGNvcnJlY3RlZDsKKwlpbnQgICAgICAgICAgIHJldDsKKworCXByX2RlYnVnKCJwYWdlIG51bWJlciBpcyA6ICVkXG4iLCBwYWdlKTsKKwlyZXQgPSByZWFkX3BhZ2VfcHJlcGFyZSh0aGlzLCBidWYsIG10ZC0+d3JpdGVzaXplLAorCQkJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywKKwkJCQkJbmZjX2dlby0+cGF5bG9hZF9zaXplLAorCQkJCQkmcGF5bG9hZF92aXJ0LCAmcGF5bG9hZF9waHlzKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiSW5hZGVxdWF0ZSBETUEgYnVmZmVyXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYXV4aWxpYXJ5X3ZpcnQgPSB0aGlzLT5hdXhpbGlhcnlfdmlydDsKKwlhdXhpbGlhcnlfcGh5cyA9IHRoaXMtPmF1eGlsaWFyeV9waHlzOworCisJLyogZ28hICovCisJcmV0ID0gZ3BtaV9yZWFkX3BhZ2UodGhpcywgcGF5bG9hZF9waHlzLCBhdXhpbGlhcnlfcGh5cyk7CisJcmVhZF9wYWdlX2VuZCh0aGlzLCBidWYsIG10ZC0+d3JpdGVzaXplLAorCQkJdGhpcy0+cGF5bG9hZF92aXJ0LCB0aGlzLT5wYXlsb2FkX3BoeXMsCisJCQluZmNfZ2VvLT5wYXlsb2FkX3NpemUsCisJCQlwYXlsb2FkX3ZpcnQsIHBheWxvYWRfcGh5cyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkVycm9yIGluIEVDQy1iYXNlZCByZWFkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0X25mYzsKKwl9CisKKwkvKiBoYW5kbGUgdGhlIGJsb2NrIG1hcmsgc3dhcHBpbmcgKi8KKwlibG9ja19tYXJrX3N3YXBwaW5nKHRoaXMsIHBheWxvYWRfdmlydCwgYXV4aWxpYXJ5X3ZpcnQpOworCisJLyogTG9vcCBvdmVyIHN0YXR1cyBieXRlcywgYWNjdW11bGF0aW5nIEVDQyBzdGF0dXMuICovCisJZmFpbGVkCQk9IDA7CisJY29ycmVjdGVkCT0gMDsKKwlzdGF0dXMJCT0gYXV4aWxpYXJ5X3ZpcnQgKyBuZmNfZ2VvLT5hdXhpbGlhcnlfc3RhdHVzX29mZnNldDsKKworCWZvciAoaSA9IDA7IGkgPCBuZmNfZ2VvLT5lY2NfY2h1bmtfY291bnQ7IGkrKywgc3RhdHVzKyspIHsKKwkJaWYgKCgqc3RhdHVzID09IFNUQVRVU19HT09EKSB8fCAoKnN0YXR1cyA9PSBTVEFUVVNfRVJBU0VEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgqc3RhdHVzID09IFNUQVRVU19VTkNPUlJFQ1RBQkxFKSB7CisJCQlmYWlsZWQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvcnJlY3RlZCArPSAqc3RhdHVzOworCX0KKworCS8qCisJICogUHJvcGFnYXRlIEVDQyBzdGF0dXMgdG8gdGhlIG93bmluZyBNVEQgb25seSB3aGVuIGZhaWxlZCBvcgorCSAqIGNvcnJlY3RlZCB0aW1lcyBuZWFybHkgcmVhY2hlcyBvdXIgRUNDIGNvcnJlY3Rpb24gdGhyZXNob2xkLgorCSAqLworCWlmIChmYWlsZWQgfHwgY29ycmVjdGVkID49IChuZmNfZ2VvLT5lY2Nfc3RyZW5ndGggLSAxKSkgeworCQltdGQtPmVjY19zdGF0cy5mYWlsZWQgICAgKz0gZmFpbGVkOworCQltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQgKz0gY29ycmVjdGVkOworCX0KKworCS8qCisJICogSXQncyB0aW1lIHRvIGRlbGl2ZXIgdGhlIE9PQiBieXRlcy4gU2VlIGdwbWlfZWNjX3JlYWRfb29iKCkgZm9yCisJICogZGV0YWlscyBhYm91dCBvdXIgcG9saWN5IGZvciBkZWxpdmVyaW5nIHRoZSBPT0IuCisJICoKKwkgKiBXZSBmaWxsIHRoZSBjYWxsZXIncyBidWZmZXIgd2l0aCBzZXQgYml0cywgYW5kIHRoZW4gY29weSB0aGUgYmxvY2sKKwkgKiBtYXJrIHRvIHRoIGNhbGxlcidzIGJ1ZmZlci4gTm90ZSB0aGF0LCBpZiBibG9jayBtYXJrIHN3YXBwaW5nIHdhcworCSAqIG5lY2Vzc2FyeSwgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBzbyB3ZSBjYW4gcmVseSBvbiB0aGUgZmlyc3QKKwkgKiBieXRlIG9mIHRoZSBhdXhpbGlhcnkgYnVmZmVyIHRvIGNvbnRhaW4gdGhlIGJsb2NrIG1hcmsuCisJICovCisJbWVtc2V0KGNoaXAtPm9vYl9wb2ksIH4wLCBtdGQtPm9vYnNpemUpOworCWNoaXAtPm9vYl9wb2lbMF0gPSAoKHVpbnQ4X3QgKikgYXV4aWxpYXJ5X3ZpcnQpWzBdOworCisJcmVhZF9wYWdlX3N3YXBfZW5kKHRoaXMsIGJ1ZiwgbXRkLT53cml0ZXNpemUsCisJCQl0aGlzLT5wYXlsb2FkX3ZpcnQsIHRoaXMtPnBheWxvYWRfcGh5cywKKwkJCW5mY19nZW8tPnBheWxvYWRfc2l6ZSwKKwkJCXBheWxvYWRfdmlydCwgcGF5bG9hZF9waHlzKTsKK2V4aXRfbmZjOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdwbWlfZWNjX3dyaXRlX3BhZ2Uoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdWludDhfdCAqYnVmKQoreworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisJc3RydWN0IGJjaF9nZW9tZXRyeSAqbmZjX2dlbyA9ICZ0aGlzLT5iY2hfZ2VvbWV0cnk7CisJY29uc3Qgdm9pZCAqcGF5bG9hZF92aXJ0OworCWRtYV9hZGRyX3QgcGF5bG9hZF9waHlzOworCWNvbnN0IHZvaWQgKmF1eGlsaWFyeV92aXJ0OworCWRtYV9hZGRyX3QgYXV4aWxpYXJ5X3BoeXM7CisJaW50ICAgICAgICByZXQ7CisKKwlwcl9kZWJ1ZygiZWNjIHdyaXRlIHBhZ2UuXG4iKTsKKwlpZiAodGhpcy0+c3dhcF9ibG9ja19tYXJrKSB7CisJCS8qCisJCSAqIElmIGNvbnRyb2wgYXJyaXZlcyBoZXJlLCB3ZSdyZSBkb2luZyBibG9jayBtYXJrIHN3YXBwaW5nLgorCQkgKiBTaW5jZSB3ZSBjYW4ndCBtb2RpZnkgdGhlIGNhbGxlcidzIGJ1ZmZlcnMsIHdlIG11c3QgY29weSB0aGVtCisJCSAqIGludG8gb3VyIG93bi4KKwkJICovCisJCW1lbWNweSh0aGlzLT5wYXlsb2FkX3ZpcnQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOworCQlwYXlsb2FkX3ZpcnQgPSB0aGlzLT5wYXlsb2FkX3ZpcnQ7CisJCXBheWxvYWRfcGh5cyA9IHRoaXMtPnBheWxvYWRfcGh5czsKKworCQltZW1jcHkodGhpcy0+YXV4aWxpYXJ5X3ZpcnQsIGNoaXAtPm9vYl9wb2ksCisJCQkJbmZjX2dlby0+YXV4aWxpYXJ5X3NpemUpOworCQlhdXhpbGlhcnlfdmlydCA9IHRoaXMtPmF1eGlsaWFyeV92aXJ0OworCQlhdXhpbGlhcnlfcGh5cyA9IHRoaXMtPmF1eGlsaWFyeV9waHlzOworCisJCS8qIEhhbmRsZSBibG9jayBtYXJrIHN3YXBwaW5nLiAqLworCQlibG9ja19tYXJrX3N3YXBwaW5nKHRoaXMsCisJCQkJKHZvaWQgKikgcGF5bG9hZF92aXJ0LCAodm9pZCAqKSBhdXhpbGlhcnlfdmlydCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgY29udHJvbCBhcnJpdmVzIGhlcmUsIHdlJ3JlIG5vdCBkb2luZyBibG9jayBtYXJrIHN3YXBwaW5nLAorCQkgKiBzbyB3ZSBjYW4gdG8gdHJ5IGFuZCB1c2UgdGhlIGNhbGxlcidzIGJ1ZmZlcnMuCisJCSAqLworCQlyZXQgPSBzZW5kX3BhZ2VfcHJlcGFyZSh0aGlzLAorCQkJCWJ1ZiwgbXRkLT53cml0ZXNpemUsCisJCQkJdGhpcy0+cGF5bG9hZF92aXJ0LCB0aGlzLT5wYXlsb2FkX3BoeXMsCisJCQkJbmZjX2dlby0+cGF5bG9hZF9zaXplLAorCQkJCSZwYXlsb2FkX3ZpcnQsICZwYXlsb2FkX3BoeXMpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIkluYWRlcXVhdGUgcGF5bG9hZCBETUEgYnVmZmVyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJldCA9IHNlbmRfcGFnZV9wcmVwYXJlKHRoaXMsCisJCQkJY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplLAorCQkJCXRoaXMtPmF1eGlsaWFyeV92aXJ0LCB0aGlzLT5hdXhpbGlhcnlfcGh5cywKKwkJCQluZmNfZ2VvLT5hdXhpbGlhcnlfc2l6ZSwKKwkJCQkmYXV4aWxpYXJ5X3ZpcnQsICZhdXhpbGlhcnlfcGh5cyk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiSW5hZGVxdWF0ZSBhdXhpbGlhcnkgRE1BIGJ1ZmZlclxuIik7CisJCQlnb3RvIGV4aXRfYXV4aWxpYXJ5OworCQl9CisJfQorCisJLyogQXNrIHRoZSBORkMuICovCisJcmV0ID0gZ3BtaV9zZW5kX3BhZ2UodGhpcywgcGF5bG9hZF9waHlzLCBhdXhpbGlhcnlfcGh5cyk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJFcnJvciBpbiBFQ0MtYmFzZWQgd3JpdGU6ICVkXG4iLCByZXQpOworCisJaWYgKCF0aGlzLT5zd2FwX2Jsb2NrX21hcmspIHsKKwkJc2VuZF9wYWdlX2VuZCh0aGlzLCBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUsCisJCQkJdGhpcy0+YXV4aWxpYXJ5X3ZpcnQsIHRoaXMtPmF1eGlsaWFyeV9waHlzLAorCQkJCW5mY19nZW8tPmF1eGlsaWFyeV9zaXplLAorCQkJCWF1eGlsaWFyeV92aXJ0LCBhdXhpbGlhcnlfcGh5cyk7CitleGl0X2F1eGlsaWFyeToKKwkJc2VuZF9wYWdlX2VuZCh0aGlzLCBidWYsIG10ZC0+d3JpdGVzaXplLAorCQkJCXRoaXMtPnBheWxvYWRfdmlydCwgdGhpcy0+cGF5bG9hZF9waHlzLAorCQkJCW5mY19nZW8tPnBheWxvYWRfc2l6ZSwKKwkJCQlwYXlsb2FkX3ZpcnQsIHBheWxvYWRfcGh5cyk7CisJfQorfQorCisvKgorICogVGhlcmUgYXJlIHNldmVyYWwgcGxhY2VzIGluIHRoaXMgZHJpdmVyIHdoZXJlIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBPT0IgYW5kCisgKiBibG9jayBtYXJrcy4gVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhpbmdzIGFyZSB0aGUgbW9zdCBjb21wbGljYXRlZCwgc28KKyAqIHRoaXMgaXMgd2hlcmUgd2UgdHJ5IHRvIGV4cGxhaW4gaXQgYWxsLiBBbGwgdGhlIG90aGVyIHBsYWNlcyByZWZlciBiYWNrIHRvCisgKiBoZXJlLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgcnVsZXMsIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgaW1wb3J0YW5jZToKKyAqCisgKiAxKSBOb3RoaW5nIHRoZSBjYWxsZXIgZG9lcyBjYW4gYmUgYWxsb3dlZCB0byBpbXBlcmlsIHRoZSBibG9jayBtYXJrLgorICoKKyAqIDIpIEluIHJlYWQgb3BlcmF0aW9ucywgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIE9PQiB3ZSByZXR1cm4gbXVzdCByZWZsZWN0IHRoZQorICogICAgdHJ1ZSBzdGF0ZSBvZiB0aGUgYmxvY2sgbWFyaywgbm8gbWF0dGVyIHdoZXJlIHRoYXQgYmxvY2sgbWFyayBhcHBlYXJzIGluCisgKiAgICB0aGUgcGh5c2ljYWwgcGFnZS4KKyAqCisgKiAzKSBFQ0MtYmFzZWQgcmVhZCBvcGVyYXRpb25zIHJldHVybiBhbiBPT0IgZnVsbCBvZiBzZXQgYml0cyAoc2luY2Ugd2UgbmV2ZXIKKyAqICAgIGFsbG93IEVDQy1iYXNlZCB3cml0ZXMgdG8gdGhlIE9PQiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBFQ0MtYmFzZWQgcmVhZHMKKyAqICAgIHJldHVybikuCisgKgorICogNCkgIlJhdyIgcmVhZCBvcGVyYXRpb25zIHJldHVybiBhIGRpcmVjdCB2aWV3IG9mIHRoZSBwaHlzaWNhbCBieXRlcyBpbiB0aGUKKyAqICAgIHBhZ2UsIHVzaW5nIHRoZSBjb252ZW50aW9uYWwgZGVmaW5pdGlvbiBvZiB3aGljaCBieXRlcyBhcmUgZGF0YSBhbmQgd2hpY2gKKyAqICAgIGFyZSBPT0IuIFRoaXMgZ2l2ZXMgdGhlIGNhbGxlciBhIHdheSB0byBzZWUgdGhlIGFjdHVhbCwgcGh5c2ljYWwgYnl0ZXMKKyAqICAgIGluIHRoZSBwYWdlLCB3aXRob3V0IHRoZSBkaXN0b3J0aW9ucyBhcHBsaWVkIGJ5IG91ciBFQ0MgZW5naW5lLgorICoKKyAqCisgKiBXaGF0IHdlIGRvIGZvciB0aGlzIHNwZWNpZmljIHJlYWQgb3BlcmF0aW9uIGRlcGVuZHMgb24gdHdvIHF1ZXN0aW9uczoKKyAqCisgKiAxKSBBcmUgd2UgZG9pbmcgYSAicmF3IiByZWFkLCBvciBhbiBFQ0MtYmFzZWQgcmVhZD8KKyAqCisgKiAyKSBBcmUgd2UgdXNpbmcgYmxvY2sgbWFyayBzd2FwcGluZyBvciB0cmFuc2NyaXB0aW9uPworICoKKyAqIFRoZXJlIGFyZSBmb3VyIGNhc2VzLCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIEthcm5hdWdoIG1hcDoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgUmF3ICAgICAgICAgICB8ICAgICAgICAgRUNDLWJhc2VkICAgICAgIHwKKyAqICAgICAgIC0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICAgICAgICAgICAgICAgIHwgUmVhZCB0aGUgY29udmVudGlvbmFsICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCBPT0IgYXQgdGhlIGVuZCBvZiB0aGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgIFN3YXBwaW5nICAgICB8IHBhZ2UgYW5kIHJldHVybiBpdC4gSXQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgY29udGFpbnMgZXhhY3RseSB3aGF0ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCB3ZSB3YW50LiAgICAgICAgICAgICAgICB8IFJlYWQgdGhlIGJsb2NrIG1hcmsgYW5kIHwKKyAqICAgICAgIC0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgcmV0dXJuIGl0IGluIGEgYnVmZmVyICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgUmVhZCB0aGUgY29udmVudGlvbmFsICAgfCBmdWxsIG9mIHNldCBiaXRzLiAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCBPT0IgYXQgdGhlIGVuZCBvZiB0aGUgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IHBhZ2UgYW5kIGFsc28gdGhlIGJsb2NrIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgVHJhbnNjcmliaW5nIHwgbWFyayBpbiB0aGUgbWV0YWRhdGEuICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgfCBDb3B5IHRoZSBibG9jayBtYXJrICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICB8IGludG8gdGhlIGZpcnN0IGJ5dGUgb2YgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgIHwgdGhlIE9PQi4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAtLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBOb3RlIHRoYXQgd2UgYnJlYWsgcnVsZSAjNCBpbiB0aGUgVHJhbnNjcmliaW5nL1JhdyBjYXNlIGJlY2F1c2Ugd2UncmUgbm90CisgKiBnaXZpbmcgYW4gYWNjdXJhdGUgdmlldyBvZiB0aGUgYWN0dWFsLCBwaHlzaWNhbCBieXRlcyBpbiB0aGUgcGFnZSAod2UncmUKKyAqIG92ZXJ3cml0aW5nIHRoZSBibG9jayBtYXJrKS4gVGhhdCdzIE9LIGJlY2F1c2UgaXQncyBtb3JlIGltcG9ydGFudCB0byBmb2xsb3cKKyAqIHJ1bGUgIzIuCisgKgorICogSXQgdHVybnMgb3V0IHRoYXQga25vd2luZyB3aGV0aGVyIHdlIHdhbnQgYW4gIkVDQy1iYXNlZCIgb3IgInJhdyIgcmVhZCBpcyBub3QKKyAqIGVhc3kuIFdoZW4gcmVhZGluZyBhIHBhZ2UsIGZvciBleGFtcGxlLCB0aGUgTkFORCBGbGFzaCBNVEQgY29kZSBjYWxscyBvdXIKKyAqIGVjYy5yZWFkX3BhZ2Ugb3IgZWNjLnJlYWRfcGFnZV9yYXcgZnVuY3Rpb24uIFRodXMsIHRoZSBmYWN0IHRoYXQgTVREIHdhbnRzIGFuCisgKiBFQ0MtYmFzZWQgb3IgcmF3IHZpZXcgb2YgdGhlIHBhZ2UgaXMgaW1wbGljaXQgaW4gd2hpY2ggZnVuY3Rpb24gaXQgY2FsbHMKKyAqICh0aGVyZSBpcyBhIHNpbWlsYXIgcGFpciBvZiBFQ0MtYmFzZWQvcmF3IGZ1bmN0aW9ucyBmb3Igd3JpdGluZykuCisgKgorICogU2luY2UgTVREIGFzc3VtZXMgdGhlIE9PQiBpcyBub3QgY292ZXJlZCBieSBFQ0MsIHRoZXJlIGlzIG5vIHBhaXIgb2YKKyAqIEVDQy1iYXNlZC9yYXcgZnVuY3Rpb25zIGZvciByZWFkaW5nIG9yIG9yIHdyaXRpbmcgdGhlIE9PQi4gVGhlIGZhY3QgdGhhdCB0aGUKKyAqIGNhbGxlciB3YW50cyBhbiBFQ0MtYmFzZWQgb3IgcmF3IHZpZXcgb2YgdGhlIHBhZ2UgaXMgbm90IHByb3BhZ2F0ZWQgZG93biB0bworICogdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgZ3BtaV9lY2NfcmVhZF9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQkJaW50IHBhZ2UsIGludCBzbmRjbWQpCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gY2hpcC0+cHJpdjsKKworCXByX2RlYnVnKCJwYWdlIG51bWJlciBpcyAlZFxuIiwgcGFnZSk7CisJLyogY2xlYXIgdGhlIE9PQiBidWZmZXIgKi8KKwltZW1zZXQoY2hpcC0+b29iX3BvaSwgfjAsIG10ZC0+b29ic2l6ZSk7CisKKwkvKiBSZWFkIG91dCB0aGUgY29udmVudGlvbmFsIE9PQi4gKi8KKwljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVBRDAsIG10ZC0+d3JpdGVzaXplLCBwYWdlKTsKKwljaGlwLT5yZWFkX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7CisKKwkvKgorCSAqIE5vdywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGJsb2NrIG1hcmsgaXMgY29ycmVjdC4gSW4gdGhlCisJICogU3dhcHBpbmcvUmF3IGNhc2UsIHdlIGFscmVhZHkgaGF2ZSBpdC4gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvCisJICogZXhwbGljaXRseSByZWFkIGl0LgorCSAqLworCWlmICghdGhpcy0+c3dhcF9ibG9ja19tYXJrKSB7CisJCS8qIFJlYWQgdGhlIGJsb2NrIG1hcmsgaW50byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgT09CIGJ1ZmZlci4gKi8KKwkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JFQUQwLCAwLCBwYWdlKTsKKwkJY2hpcC0+b29iX3BvaVswXSA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOworCX0KKworCS8qCisJICogUmV0dXJuIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBzZW5kCisJICogYSBjb21tYW5kLgorCSAqLworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CitncG1pX2VjY193cml0ZV9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQoreworCS8qCisJICogVGhlIEJDSCB3aWxsIHVzZSBhbGwgdGhlIChwYWdlICsgb29iKS4KKwkgKiBPdXIgZ3BtaV9od19lY2NsYXlvdXQgY2FuIG9ubHkgcHJvaGliaXQgdGhlIEpGRlMyIHRvIHdyaXRlIHRoZSBvb2IuCisJICogQnV0IGl0IGNhbiBub3Qgc3RvcCBzb21lIGlvY3RscyBzdWNoIE1FTVdSSVRFT09CIHdoaWNoIHVzZXMKKwkgKiBNVERfT1BTX1BMQUNFX09PQi4gU28gV2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBwcm9oaWJpdAorCSAqIHRoZXNlIGlvY3RscyB0b28uCisJICovCisJcmV0dXJuIC1FUEVSTTsKK30KKworc3RhdGljIGludCBncG1pX2Jsb2NrX21hcmtiYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMgPSBjaGlwLT5wcml2OworCWludCBibG9jaywgcmV0ID0gMDsKKwl1aW50OF90ICpibG9ja19tYXJrOworCWludCBjb2x1bW4sIHBhZ2UsIHN0YXR1cywgY2hpcG5yOworCisJLyogR2V0IGJsb2NrIG51bWJlciAqLworCWJsb2NrID0gKGludCkob2ZzID4+IGNoaXAtPmJidF9lcmFzZV9zaGlmdCk7CisJaWYgKGNoaXAtPmJidCkKKwkJY2hpcC0+YmJ0W2Jsb2NrID4+IDJdIHw9IDB4MDEgPDwgKChibG9jayAmIDB4MDMpIDw8IDEpOworCisJLyogRG8gd2UgaGF2ZSBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSA/ICovCisJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JCVF9VU0VfRkxBU0gpCisJCXJldCA9IG5hbmRfdXBkYXRlX2JidChtdGQsIG9mcyk7CisJZWxzZSB7CisJCWNoaXBuciA9IChpbnQpKG9mcyA+PiBjaGlwLT5jaGlwX3NoaWZ0KTsKKwkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCisJCWNvbHVtbiA9IHRoaXMtPnN3YXBfYmxvY2tfbWFyayA/IG10ZC0+d3JpdGVzaXplIDogMDsKKworCQkvKiBXcml0ZSB0aGUgYmxvY2sgbWFyay4gKi8KKwkJYmxvY2tfbWFyayA9IHRoaXMtPmRhdGFfYnVmZmVyX2RtYTsKKwkJYmxvY2tfbWFya1swXSA9IDA7IC8qIGJhZCBibG9jayBtYXJrZXIgKi8KKworCQkvKiBTaGlmdCB0byBnZXQgcGFnZSAqLworCQlwYWdlID0gKGludCkob2ZzID4+IGNoaXAtPnBhZ2Vfc2hpZnQpOworCisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9TRVFJTiwgY29sdW1uLCBwYWdlKTsKKwkJY2hpcC0+d3JpdGVfYnVmKG10ZCwgYmxvY2tfbWFyaywgMSk7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9QQUdFUFJPRywgLTEsIC0xKTsKKworCQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkKKwkJCXJldCA9IC1FSU87CisKKwkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCAtMSk7CisJfQorCWlmICghcmV0KQorCQltdGQtPmVjY19zdGF0cy5iYWRibG9ja3MrKzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5hbmRfYm9vdF9zZXRfZ2VvbWV0cnkoc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzKQoreworCXN0cnVjdCBib290X3JvbV9nZW9tZXRyeSAqZ2VvbWV0cnkgPSAmdGhpcy0+cm9tX2dlb21ldHJ5OworCisJLyoKKwkgKiBTZXQgdGhlIGJvb3QgYmxvY2sgc3RyaWRlIHNpemUuCisJICoKKwkgKiBJbiBwcmluY2lwbGUsIHdlIHNob3VsZCBiZSByZWFkaW5nIHRoaXMgZnJvbSB0aGUgT1RQIGJpdHMsIHNpbmNlCisJICogdGhhdCdzIHdoZXJlIHRoZSBST00gaXMgZ29pbmcgdG8gZ2V0IGl0LiBJbiBmYWN0LCB3ZSBkb24ndCBoYXZlIGFueQorCSAqIHdheSB0byByZWFkIHRoZSBPVFAgYml0cywgc28gd2UgZ28gd2l0aCB0aGUgZGVmYXVsdCBhbmQgaG9wZSBmb3IgdGhlCisJICogYmVzdC4KKwkgKi8KKwlnZW9tZXRyeS0+c3RyaWRlX3NpemVfaW5fcGFnZXMgPSA2NDsKKworCS8qCisJICogU2V0IHRoZSBzZWFyY2ggYXJlYSBzdHJpZGUgZXhwb25lbnQuCisJICoKKwkgKiBJbiBwcmluY2lwbGUsIHdlIHNob3VsZCBiZSByZWFkaW5nIHRoaXMgZnJvbSB0aGUgT1RQIGJpdHMsIHNpbmNlCisJICogdGhhdCdzIHdoZXJlIHRoZSBST00gaXMgZ29pbmcgdG8gZ2V0IGl0LiBJbiBmYWN0LCB3ZSBkb24ndCBoYXZlIGFueQorCSAqIHdheSB0byByZWFkIHRoZSBPVFAgYml0cywgc28gd2UgZ28gd2l0aCB0aGUgZGVmYXVsdCBhbmQgaG9wZSBmb3IgdGhlCisJICogYmVzdC4KKwkgKi8KKwlnZW9tZXRyeS0+c2VhcmNoX2FyZWFfc3RyaWRlX2V4cG9uZW50ID0gMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgICpmaW5nZXJwcmludCA9ICJTVE1QIjsKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14MjNfY2hlY2tfdHJhbnNjcmlwdGlvbl9zdGFtcChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGJvb3Rfcm9tX2dlb21ldHJ5ICpyb21fZ2VvID0gJnRoaXMtPnJvbV9nZW9tZXRyeTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0aGlzLT5kZXY7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSAmdGhpcy0+bXRkOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhpcy0+bmFuZDsKKwl1bnNpZ25lZCBpbnQgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzOworCXVuc2lnbmVkIGludCBzdHJpZGU7CisJdW5zaWduZWQgaW50IHBhZ2U7CisJbG9mZl90IGJ5dGU7CisJdWludDhfdCAqYnVmZmVyID0gY2hpcC0+YnVmZmVycy0+ZGF0YWJ1ZjsKKwlpbnQgc2F2ZWRfY2hpcF9udW1iZXI7CisJaW50IGZvdW5kX2FuX25jYl9maW5nZXJwcmludCA9IGZhbHNlOworCisJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHN0cmlkZXMgaW4gYSBzZWFyY2ggYXJlYS4gKi8KKwlzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXMgPSAxIDw8IHJvbV9nZW8tPnNlYXJjaF9hcmVhX3N0cmlkZV9leHBvbmVudDsKKworCXNhdmVkX2NoaXBfbnVtYmVyID0gdGhpcy0+Y3VycmVudF9jaGlwOworCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgMCk7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCB0aGUgZmlyc3Qgc2VhcmNoIGFyZWEsIGxvb2tpbmcgZm9yIHRoZSBOQ0IgZmluZ2VycHJpbnQuCisJICovCisJZGV2X2RiZyhkZXYsICJTY2FubmluZyBmb3IgYW4gTkNCIGZpbmdlcnByaW50Li4uXG4iKTsKKworCWZvciAoc3RyaWRlID0gMDsgc3RyaWRlIDwgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzOyBzdHJpZGUrKykgeworCQkvKiBDb21wdXRlIHRoZSBwYWdlIGFuZCBieXRlIGFkZHJlc3Nlcy4gKi8KKwkJcGFnZSA9IHN0cmlkZSAqIHJvbV9nZW8tPnN0cmlkZV9zaXplX2luX3BhZ2VzOworCQlieXRlID0gcGFnZSAgICogbXRkLT53cml0ZXNpemU7CisKKwkJZGV2X2RiZyhkZXYsICJMb29raW5nIGZvciBhIGZpbmdlcnByaW50IGluIHBhZ2UgMHgleFxuIiwgcGFnZSk7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgTkNCIGZpbmdlcnByaW50LiBUaGUgZmluZ2VycHJpbnQgaXMgZm91ciBieXRlcyBsb25nCisJCSAqIGFuZCBzdGFydHMgaW4gdGhlIDEydGggYnl0ZSBvZiB0aGUgcGFnZS4KKwkJICovCisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFEMCwgMTIsIHBhZ2UpOworCQljaGlwLT5yZWFkX2J1ZihtdGQsIGJ1ZmZlciwgc3RybGVuKGZpbmdlcnByaW50KSk7CisKKwkJLyogTG9vayBmb3IgdGhlIGZpbmdlcnByaW50LiAqLworCQlpZiAoIW1lbWNtcChidWZmZXIsIGZpbmdlcnByaW50LCBzdHJsZW4oZmluZ2VycHJpbnQpKSkgeworCQkJZm91bmRfYW5fbmNiX2ZpbmdlcnByaW50ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisKKwljaGlwLT5zZWxlY3RfY2hpcChtdGQsIHNhdmVkX2NoaXBfbnVtYmVyKTsKKworCWlmIChmb3VuZF9hbl9uY2JfZmluZ2VycHJpbnQpCisJCWRldl9kYmcoZGV2LCAiXHRGb3VuZCBhIGZpbmdlcnByaW50XG4iKTsKKwllbHNlCisJCWRldl9kYmcoZGV2LCAiXHRObyBmaW5nZXJwcmludCBmb3VuZFxuIik7CisJcmV0dXJuIGZvdW5kX2FuX25jYl9maW5nZXJwcmludDsKK30KKworLyogV3JpdGVzIGEgdHJhbnNjcmlwdGlvbiBzdGFtcC4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG14MjNfd3JpdGVfdHJhbnNjcmlwdGlvbl9zdGFtcChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdGhpcy0+ZGV2OworCXN0cnVjdCBib290X3JvbV9nZW9tZXRyeSAqcm9tX2dlbyA9ICZ0aGlzLT5yb21fZ2VvbWV0cnk7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSAmdGhpcy0+bXRkOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmdGhpcy0+bmFuZDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZV9pbl9wYWdlczsKKwl1bnNpZ25lZCBpbnQgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzOworCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzOworCXVuc2lnbmVkIGludCBzZWFyY2hfYXJlYV9zaXplX2luX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJdW5zaWduZWQgaW50IHN0cmlkZTsKKwl1bnNpZ25lZCBpbnQgcGFnZTsKKwlsb2ZmX3QgICAgICAgYnl0ZTsKKwl1aW50OF90ICAgICAgKmJ1ZmZlciA9IGNoaXAtPmJ1ZmZlcnMtPmRhdGFidWY7CisJaW50IHNhdmVkX2NoaXBfbnVtYmVyOworCWludCBzdGF0dXM7CisKKwkvKiBDb21wdXRlIHRoZSBzZWFyY2ggYXJlYSBnZW9tZXRyeS4gKi8KKwlibG9ja19zaXplX2luX3BhZ2VzID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsKKwlzZWFyY2hfYXJlYV9zaXplX2luX3N0cmlkZXMgPSAxIDw8IHJvbV9nZW8tPnNlYXJjaF9hcmVhX3N0cmlkZV9leHBvbmVudDsKKwlzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzID0gc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzICoKKwkJCQkJcm9tX2dlby0+c3RyaWRlX3NpemVfaW5fcGFnZXM7CisJc2VhcmNoX2FyZWFfc2l6ZV9pbl9ibG9ja3MgPQorCQkgIChzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzICsgKGJsb2NrX3NpemVfaW5fcGFnZXMgLSAxKSkgLworCQkJCSAgICBibG9ja19zaXplX2luX3BhZ2VzOworCisJZGV2X2RiZyhkZXYsICJTZWFyY2ggQXJlYSBHZW9tZXRyeSA6XG4iKTsKKwlkZXZfZGJnKGRldiwgIlx0aW4gQmxvY2tzIDogJXVcbiIsIHNlYXJjaF9hcmVhX3NpemVfaW5fYmxvY2tzKTsKKwlkZXZfZGJnKGRldiwgIlx0aW4gU3RyaWRlczogJXVcbiIsIHNlYXJjaF9hcmVhX3NpemVfaW5fc3RyaWRlcyk7CisJZGV2X2RiZyhkZXYsICJcdGluIFBhZ2VzICA6ICV1XG4iLCBzZWFyY2hfYXJlYV9zaXplX2luX3BhZ2VzKTsKKworCS8qIFNlbGVjdCBjaGlwIDAuICovCisJc2F2ZWRfY2hpcF9udW1iZXIgPSB0aGlzLT5jdXJyZW50X2NoaXA7CisJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCAwKTsKKworCS8qIExvb3Agb3ZlciBibG9ja3MgaW4gdGhlIGZpcnN0IHNlYXJjaCBhcmVhLCBlcmFzaW5nIHRoZW0uICovCisJZGV2X2RiZyhkZXYsICJFcmFzaW5nIHRoZSBzZWFyY2ggYXJlYS4uLlxuIik7CisKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBzZWFyY2hfYXJlYV9zaXplX2luX2Jsb2NrczsgYmxvY2srKykgeworCQkvKiBDb21wdXRlIHRoZSBwYWdlIGFkZHJlc3MuICovCisJCXBhZ2UgPSBibG9jayAqIGJsb2NrX3NpemVfaW5fcGFnZXM7CisKKwkJLyogRXJhc2UgdGhpcyBibG9jay4gKi8KKwkJZGV2X2RiZyhkZXYsICJcdEVyYXNpbmcgYmxvY2sgMHgleFxuIiwgYmxvY2spOworCQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfRVJBU0UxLCAtMSwgcGFnZSk7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9FUkFTRTIsIC0xLCAtMSk7CisKKwkJLyogV2FpdCBmb3IgdGhlIGVyYXNlIHRvIGZpbmlzaC4gKi8KKwkJc3RhdHVzID0gY2hpcC0+d2FpdGZ1bmMobXRkLCBjaGlwKTsKKwkJaWYgKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpCisJCQlkZXZfZXJyKGRldiwgIlslc10gRXJhc2UgZmFpbGVkLlxuIiwgX19mdW5jX18pOworCX0KKworCS8qIFdyaXRlIHRoZSBOQ0IgZmluZ2VycHJpbnQgaW50byB0aGUgcGFnZSBidWZmZXIuICovCisJbWVtc2V0KGJ1ZmZlciwgfjAsIG10ZC0+d3JpdGVzaXplKTsKKwltZW1zZXQoY2hpcC0+b29iX3BvaSwgfjAsIG10ZC0+b29ic2l6ZSk7CisJbWVtY3B5KGJ1ZmZlciArIDEyLCBmaW5nZXJwcmludCwgc3RybGVuKGZpbmdlcnByaW50KSk7CisKKwkvKiBMb29wIHRocm91Z2ggdGhlIGZpcnN0IHNlYXJjaCBhcmVhLCB3cml0aW5nIE5DQiBmaW5nZXJwcmludHMuICovCisJZGV2X2RiZyhkZXYsICJXcml0aW5nIE5DQiBmaW5nZXJwcmludHMuLi5cbiIpOworCWZvciAoc3RyaWRlID0gMDsgc3RyaWRlIDwgc2VhcmNoX2FyZWFfc2l6ZV9pbl9zdHJpZGVzOyBzdHJpZGUrKykgeworCQkvKiBDb21wdXRlIHRoZSBwYWdlIGFuZCBieXRlIGFkZHJlc3Nlcy4gKi8KKwkJcGFnZSA9IHN0cmlkZSAqIHJvbV9nZW8tPnN0cmlkZV9zaXplX2luX3BhZ2VzOworCQlieXRlID0gcGFnZSAgICogbXRkLT53cml0ZXNpemU7CisKKwkJLyogV3JpdGUgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGN1cnJlbnQgc3RyaWRlLiAqLworCQlkZXZfZGJnKGRldiwgIldyaXRpbmcgYW4gTkNCIGZpbmdlcnByaW50IGluIHBhZ2UgMHgleFxuIiwgcGFnZSk7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9TRVFJTiwgMHgwMCwgcGFnZSk7CisJCWNoaXAtPmVjYy53cml0ZV9wYWdlX3JhdyhtdGQsIGNoaXAsIGJ1ZmZlcik7CisJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9QQUdFUFJPRywgLTEsIC0xKTsKKworCQkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gZmluaXNoLiAqLworCQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkKKwkJCWRldl9lcnIoZGV2LCAiWyVzXSBXcml0ZSBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJLyogRGVzZWxlY3QgY2hpcCAwLiAqLworCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgc2F2ZWRfY2hpcF9udW1iZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteDIzX2Jvb3RfaW5pdChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgICp0aGlzKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRoaXMtPmRldjsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJnRoaXMtPm5hbmQ7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSAmdGhpcy0+bXRkOworCXVuc2lnbmVkIGludCBibG9ja19jb3VudDsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJaW50ICAgICBjaGlwbnI7CisJaW50ICAgICBwYWdlOworCWxvZmZfdCAgYnl0ZTsKKwl1aW50OF90IGJsb2NrX21hcms7CisJaW50ICAgICByZXQgPSAwOworCisJLyoKKwkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UgY2FuJ3QgdXNlIGJsb2NrIG1hcmsgc3dhcHBpbmcsIHdoaWNoCisJICogbWVhbnMgd2UncmUgZm9yY2VkIHRvIHVzZSB0cmFuc2NyaXB0aW9uLiBGaXJzdCwgc2NhbiBmb3IgdGhlCisJICogdHJhbnNjcmlwdGlvbiBzdGFtcC4gSWYgd2UgZmluZCBpdCwgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGRvCisJICogYW55dGhpbmcgLS0gdGhlIGJsb2NrIG1hcmtzIGFyZSBhbHJlYWR5IHRyYW5zY3JpYmVkLgorCSAqLworCWlmIChteDIzX2NoZWNrX3RyYW5zY3JpcHRpb25fc3RhbXAodGhpcykpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBjb250cm9sIGFycml2ZXMgaGVyZSwgd2UgY291bGRuJ3QgZmluZCBhIHRyYW5zY3JpcHRpb24gc3RhbXAsIHNvCisJICogc28gd2UgcHJlc3VtZSB0aGUgYmxvY2sgbWFya3MgYXJlIGluIHRoZSBjb252ZW50aW9uYWwgbG9jYXRpb24uCisJICovCisJZGV2X2RiZyhkZXYsICJUcmFuc2NyaWJpbmcgYmFkIGJsb2NrIG1hcmtzLi4uXG4iKTsKKworCS8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIGVudGlyZSBtZWRpdW0uICovCisJYmxvY2tfY291bnQgPSBjaGlwLT5jaGlwc2l6ZSA+PiBjaGlwLT5waHlzX2VyYXNlX3NoaWZ0OworCisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIHRoZSBibG9ja3MgaW4gdGhlIG1lZGl1bSwgdHJhbnNjcmliaW5nIGJsb2NrIG1hcmtzIGFzCisJICogd2UgZ28uCisJICovCisJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tfY291bnQ7IGJsb2NrKyspIHsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgY2hpcCwgcGFnZSBhbmQgYnl0ZSBhZGRyZXNzZXMgZm9yIHRoaXMgYmxvY2sncworCQkgKiBjb252ZW50aW9uYWwgbWFyay4KKwkJICovCisJCWNoaXBuciA9IGJsb2NrID4+IChjaGlwLT5jaGlwX3NoaWZ0IC0gY2hpcC0+cGh5c19lcmFzZV9zaGlmdCk7CisJCXBhZ2UgPSBibG9jayA8PCAoY2hpcC0+cGh5c19lcmFzZV9zaGlmdCAtIGNoaXAtPnBhZ2Vfc2hpZnQpOworCQlieXRlID0gYmxvY2sgPDwgIGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQ7CisKKwkJLyogU2VuZCB0aGUgY29tbWFuZCB0byByZWFkIHRoZSBjb252ZW50aW9uYWwgYmxvY2sgbWFyay4gKi8KKwkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVBRDAsIG10ZC0+d3JpdGVzaXplLCBwYWdlKTsKKwkJYmxvY2tfbWFyayA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOworCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIC0xKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgYmxvY2sgaXMgbWFya2VkIGJhZC4gSWYgc28sIHdlIG5lZWQgdG8gbWFyayBpdAorCQkgKiBhZ2FpbiwgYnV0IHRoaXMgdGltZSB0aGUgcmVzdWx0IHdpbGwgYmUgYSBtYXJrIGluIHRoZQorCQkgKiBsb2NhdGlvbiB3aGVyZSB3ZSB0cmFuc2NyaWJlIGJsb2NrIG1hcmtzLgorCQkgKi8KKwkJaWYgKGJsb2NrX21hcmsgIT0gMHhmZikgeworCQkJZGV2X2RiZyhkZXYsICJUcmFuc2NyaWJpbmcgbWFyayBpbiBibG9jayAldVxuIiwgYmxvY2spOworCQkJcmV0ID0gY2hpcC0+YmxvY2tfbWFya2JhZChtdGQsIGJ5dGUpOworCQkJaWYgKHJldCkKKwkJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXJrIGJsb2NrIGJhZCB3aXRoICIKKwkJCQkJCQkicmV0ICVkXG4iLCByZXQpOworCQl9CisJfQorCisJLyogV3JpdGUgdGhlIHN0YW1wIHRoYXQgaW5kaWNhdGVzIHdlJ3ZlIHRyYW5zY3JpYmVkIHRoZSBibG9jayBtYXJrcy4gKi8KKwlteDIzX3dyaXRlX3RyYW5zY3JpcHRpb25fc3RhbXAodGhpcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5hbmRfYm9vdF9pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAgKnRoaXMpCit7CisJbmFuZF9ib290X3NldF9nZW9tZXRyeSh0aGlzKTsKKworCS8qIFRoaXMgaXMgUk9NIGFyY2gtc3BlY2lmaWMgaW5pdGlsaXphdGlvbiBiZWZvcmUgdGhlIEJCVCBzY2FubmluZy4gKi8KKwlpZiAoR1BNSV9JU19NWDIzKHRoaXMpKQorCQlyZXR1cm4gbXgyM19ib290X2luaXQodGhpcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwbWlfc2V0X2dlb21ldHJ5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlpbnQgcmV0OworCisJLyogRnJlZSB0aGUgdGVtcG9yYXJ5IERNQSBtZW1vcnkgZm9yIHJlYWRpbmcgSUQuICovCisJZ3BtaV9mcmVlX2RtYV9idWZmZXIodGhpcyk7CisKKwkvKiBTZXQgdXAgdGhlIE5GQyBnZW9tZXRyeSB3aGljaCBpcyB1c2VkIGJ5IEJDSC4gKi8KKwlyZXQgPSBiY2hfc2V0X2dlb21ldHJ5KHRoaXMpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJzZXQgZ2VvbWV0cnkgcmV0IDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogQWxsb2MgdGhlIG5ldyBETUEgYnVmZmVycyBhY2NvcmRpbmcgdG8gdGhlIHBhZ2VzaXplIGFuZCBvb2JzaXplICovCisJcmV0dXJuIGdwbWlfYWxsb2NfZG1hX2J1ZmZlcih0aGlzKTsKK30KKworc3RhdGljIGludCBncG1pX3ByZV9iYnRfc2NhbihzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgICp0aGlzKQoreworCWludCByZXQ7CisKKwkvKiBTZXQgdXAgc3dhcF9ibG9ja19tYXJrLCBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGdwbWlfc2V0X2dlb21ldHJ5KCkgKi8KKwlpZiAoR1BNSV9JU19NWDIzKHRoaXMpKQorCQl0aGlzLT5zd2FwX2Jsb2NrX21hcmsgPSBmYWxzZTsKKwllbHNlCisJCXRoaXMtPnN3YXBfYmxvY2tfbWFyayA9IHRydWU7CisKKwkvKiBTZXQgdXAgdGhlIG1lZGl1bSBnZW9tZXRyeSAqLworCXJldCA9IGdwbWlfc2V0X2dlb21ldHJ5KHRoaXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBOQU5EIGJvb3QgaW5pdCwgZGVwZW5kcyBvbiB0aGUgZ3BtaV9zZXRfZ2VvbWV0cnkoKS4gKi8KKwlyZXR1cm4gbmFuZF9ib290X2luaXQodGhpcyk7Cit9CisKK3N0YXRpYyBpbnQgZ3BtaV9zY2FuX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcyA9IGNoaXAtPnByaXY7CisJaW50IHJldDsKKworCS8qIFByZXBhcmUgZm9yIHRoZSBCQlQgc2Nhbi4gKi8KKwlyZXQgPSBncG1pX3ByZV9iYnRfc2Nhbih0aGlzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogdXNlIHRoZSBkZWZhdWx0IEJCVCBpbXBsZW1lbnRhdGlvbiAqLworCXJldHVybiBuYW5kX2RlZmF1bHRfYmJ0KG10ZCk7Cit9CisKK3ZvaWQgZ3BtaV9uZmNfZXhpdChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKnRoaXMpCit7CisJbmFuZF9yZWxlYXNlKCZ0aGlzLT5tdGQpOworCWdwbWlfZnJlZV9kbWFfYnVmZmVyKHRoaXMpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncG1pX25mY19pbml0KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqdGhpcykKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdGhpcy0+cGRhdGE7CisJc3RydWN0IG10ZF9pbmZvICAqbXRkID0gJnRoaXMtPm10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJnRoaXMtPm5hbmQ7CisJaW50IHJldDsKKworCS8qIGluaXQgY3VycmVudCBjaGlwICovCisJdGhpcy0+Y3VycmVudF9jaGlwCT0gLTE7CisKKwkvKiBpbml0IHRoZSBNVEQgZGF0YSBzdHJ1Y3R1cmVzICovCisJbXRkLT5wcml2CQk9IGNoaXA7CisJbXRkLT5uYW1lCQk9ICJncG1pLW5hbmQiOworCW10ZC0+b3duZXIJCT0gVEhJU19NT0RVTEU7CisKKwkvKiBpbml0IHRoZSBuYW5kX2NoaXB7fSwgd2UgZG9uJ3Qgc3VwcG9ydCBhIDE2LWJpdCBOQU5EIEZsYXNoIGJ1cy4gKi8KKwljaGlwLT5wcml2CQk9IHRoaXM7CisJY2hpcC0+c2VsZWN0X2NoaXAJPSBncG1pX3NlbGVjdF9jaGlwOworCWNoaXAtPmNtZF9jdHJsCQk9IGdwbWlfY21kX2N0cmw7CisJY2hpcC0+ZGV2X3JlYWR5CQk9IGdwbWlfZGV2X3JlYWR5OworCWNoaXAtPnJlYWRfYnl0ZQkJPSBncG1pX3JlYWRfYnl0ZTsKKwljaGlwLT5yZWFkX2J1ZgkJPSBncG1pX3JlYWRfYnVmOworCWNoaXAtPndyaXRlX2J1ZgkJPSBncG1pX3dyaXRlX2J1ZjsKKwljaGlwLT5lY2MucmVhZF9wYWdlCT0gZ3BtaV9lY2NfcmVhZF9wYWdlOworCWNoaXAtPmVjYy53cml0ZV9wYWdlCT0gZ3BtaV9lY2Nfd3JpdGVfcGFnZTsKKwljaGlwLT5lY2MucmVhZF9vb2IJPSBncG1pX2VjY19yZWFkX29vYjsKKwljaGlwLT5lY2Mud3JpdGVfb29iCT0gZ3BtaV9lY2Nfd3JpdGVfb29iOworCWNoaXAtPnNjYW5fYmJ0CQk9IGdwbWlfc2Nhbl9iYnQ7CisJY2hpcC0+YmFkYmxvY2tfcGF0dGVybgk9ICZncG1pX2JidF9kZXNjcjsKKwljaGlwLT5ibG9ja19tYXJrYmFkCT0gZ3BtaV9ibG9ja19tYXJrYmFkOworCWNoaXAtPm9wdGlvbnMJCXw9IE5BTkRfTk9fU1VCUEFHRV9XUklURTsKKwljaGlwLT5lY2MubW9kZQkJPSBOQU5EX0VDQ19IVzsKKwljaGlwLT5lY2Muc2l6ZQkJPSAxOworCWNoaXAtPmVjYy5sYXlvdXQJPSAmZ3BtaV9od19lY2NsYXlvdXQ7CisKKwkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBETUEgYnVmZmVyIGZvciByZWFkaW5nIElEIGluIHRoZSBuYW5kX3NjYW4oKSAqLworCXRoaXMtPmJjaF9nZW9tZXRyeS5wYXlsb2FkX3NpemUgPSAxMDI0OworCXRoaXMtPmJjaF9nZW9tZXRyeS5hdXhpbGlhcnlfc2l6ZSA9IDEyODsKKwlyZXQgPSBncG1pX2FsbG9jX2RtYV9idWZmZXIodGhpcyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0OworCisJcmV0ID0gbmFuZF9zY2FuKG10ZCwgcGRhdGEtPm1heF9jaGlwX2NvdW50KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ2hpcCBzY2FuIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgTlVMTCwKKwkJCXBkYXRhLT5wYXJ0aXRpb25zLCBwZGF0YS0+cGFydGl0aW9uX2NvdW50KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXQ7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJZ3BtaV9uZmNfZXhpdCh0aGlzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncG1pX25hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3BtaV9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzOworCWludCByZXQ7CisKKwl0aGlzID0ga3phbGxvYyhzaXplb2YoKnRoaXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRoaXMpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgcGVyLWRldmljZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0aGlzKTsKKwl0aGlzLT5wZGV2ICA9IHBkZXY7CisJdGhpcy0+ZGV2ICAgPSAmcGRldi0+ZGV2OworCXRoaXMtPnBkYXRhID0gcGRhdGE7CisKKwlpZiAocGRhdGEtPnBsYXRmb3JtX2luaXQpIHsKKwkJcmV0ID0gcGRhdGEtPnBsYXRmb3JtX2luaXQoKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcGxhdGZvcm1faW5pdF9lcnJvcjsKKwl9CisKKwlyZXQgPSBhY3F1aXJlX3Jlc291cmNlcyh0aGlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfYWNxdWlyZV9yZXNvdXJjZXM7CisKKwlyZXQgPSBpbml0X2hhcmR3YXJlKHRoaXMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9uZmNfaW5pdDsKKworCXJldCA9IGdwbWlfbmZjX2luaXQodGhpcyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X25mY19pbml0OworCisJcmV0dXJuIDA7CisKK2V4aXRfbmZjX2luaXQ6CisJcmVsZWFzZV9yZXNvdXJjZXModGhpcyk7CitwbGF0Zm9ybV9pbml0X2Vycm9yOgorZXhpdF9hY3F1aXJlX3Jlc291cmNlczoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZSh0aGlzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBncG1pX25hbmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwbWlfbmFuZF9kYXRhICp0aGlzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlncG1pX25mY19leGl0KHRoaXMpOworCXJlbGVhc2VfcmVzb3VyY2VzKHRoaXMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHRoaXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBncG1pX2lkc1tdID0geworCXsKKwkJLm5hbWUgPSAiaW14MjMtZ3BtaS1uYW5kIiwKKwkJLmRyaXZlcl9kYXRhID0gSVNfTVgyMywKKwl9LCB7CisJCS5uYW1lID0gImlteDI4LWdwbWktbmFuZCIsCisJCS5kcml2ZXJfZGF0YSA9IElTX01YMjgsCisJfSwge30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncG1pX25hbmRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdwbWktbmFuZCIsCisJfSwKKwkucHJvYmUgICA9IGdwbWlfbmFuZF9wcm9iZSwKKwkucmVtb3ZlICA9IF9fZXhpdF9wKGdwbWlfbmFuZF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGdwbWlfaWRzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3BtaV9uYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZncG1pX25hbmRfZHJpdmVyKTsKKwlpZiAoZXJyID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIkdQTUkgTkFORCBkcml2ZXIgcmVnaXN0ZXJlZC4gKElNWClcbiIpOworCWVsc2UKKwkJcHJfZXJyKCJpLk1YIEdQTUkgTkFORCBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdwbWlfbmFuZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwbWlfbmFuZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChncG1pX25hbmRfaW5pdCk7Cittb2R1bGVfZXhpdChncG1pX25hbmRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImkuTVggR1BNSSBOQU5EIEZsYXNoIENvbnRyb2xsZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLW5hbmQuaCBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjNiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLW5hbmQuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIEZyZWVzY2FsZSBHUE1JIE5BTkQgRmxhc2ggRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19EUklWRVJTX01URF9OQU5EX0dQTUlfTkFORF9ICisjZGVmaW5lIF9fRFJJVkVSU19NVERfTkFORF9HUE1JX05BTkRfSAorCisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKK3N0cnVjdCByZXNvdXJjZXMgeworCXZvaWQgICAgICAgICAgKmdwbWlfcmVnczsKKwl2b2lkICAgICAgICAgICpiY2hfcmVnczsKKwl1bnNpZ25lZCBpbnQgIGJjaF9sb3dfaW50ZXJydXB0OworCXVuc2lnbmVkIGludCAgYmNoX2hpZ2hfaW50ZXJydXB0OworCXVuc2lnbmVkIGludCAgZG1hX2xvd19jaGFubmVsOworCXVuc2lnbmVkIGludCAgZG1hX2hpZ2hfY2hhbm5lbDsKKwlzdHJ1Y3QgY2xrICAgICpjbG9jazsKK307CisKKy8qKgorICogc3RydWN0IGJjaF9nZW9tZXRyeSAtIEJDSCBnZW9tZXRyeSBkZXNjcmlwdGlvbi4KKyAqIEBnZl9sZW46ICAgICAgICAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgR2Fsb2lzIEZpZWxkLiAoZS5nLiwgMTMgb3IgMTQpCisgKiBAZWNjX3N0cmVuZ3RoOiAgICAgICAgICAgICBBIG51bWJlciB0aGF0IGRlc2NyaWJlcyB0aGUgc3RyZW5ndGggb2YgdGhlIEVDQworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLgorICogQHBhZ2Vfc2l6ZTogICAgICAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIHBoeXNpY2FsIHBhZ2UsIGluY2x1ZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90aCBkYXRhIGFuZCBPT0IuCisgKiBAbWV0YWRhdGFfc2l6ZTogICAgICAgICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBtZXRhZGF0YS4KKyAqIEBlY2NfY2h1bmtfc2l6ZTogICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgYSBzaW5nbGUgRUNDIGNodW5rLiBOb3RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgY2h1bmsgaW4gdGhlIHBhZ2UgaW5jbHVkZXMgYm90aCBkYXRhIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsIHNvIGl0J3MgYSBiaXQgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZS4KKyAqIEBlY2NfY2h1bmtfY291bnQ6ICAgICAgICAgIFRoZSBudW1iZXIgb2YgRUNDIGNodW5rcyBpbiB0aGUgcGFnZSwKKyAqIEBwYXlsb2FkX3NpemU6ICAgICAgICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHBheWxvYWQgYnVmZmVyLgorICogQGF1eGlsaWFyeV9zaXplOiAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYXV4aWxpYXJ5IGJ1ZmZlci4KKyAqIEBhdXhpbGlhcnlfc3RhdHVzX29mZnNldDogIFRoZSBvZmZzZXQgaW50byB0aGUgYXV4aWxpYXJ5IGJ1ZmZlciBhdCB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEVDQyBzdGF0dXMgYXBwZWFycy4KKyAqIEBibG9ja19tYXJrX2J5dGVfb2Zmc2V0OiAgIFRoZSBieXRlIG9mZnNldCBpbiB0aGUgRUNDLWJhc2VkIHBhZ2UgdmlldyBhdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgYmxvY2sgbWFyayBhcHBlYXJzLgorICogQGJsb2NrX21hcmtfYml0X29mZnNldDogICAgVGhlIGJpdCBvZmZzZXQgaW50byB0aGUgRUNDLWJhc2VkIHBhZ2UgdmlldyBhdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgYmxvY2sgbWFyayBhcHBlYXJzLgorICovCitzdHJ1Y3QgYmNoX2dlb21ldHJ5IHsKKwl1bnNpZ25lZCBpbnQgIGdmX2xlbjsKKwl1bnNpZ25lZCBpbnQgIGVjY19zdHJlbmd0aDsKKwl1bnNpZ25lZCBpbnQgIHBhZ2Vfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIG1ldGFkYXRhX3NpemU7CisJdW5zaWduZWQgaW50ICBlY2NfY2h1bmtfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIGVjY19jaHVua19jb3VudDsKKwl1bnNpZ25lZCBpbnQgIHBheWxvYWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIGF1eGlsaWFyeV9zaXplOworCXVuc2lnbmVkIGludCAgYXV4aWxpYXJ5X3N0YXR1c19vZmZzZXQ7CisJdW5zaWduZWQgaW50ICBibG9ja19tYXJrX2J5dGVfb2Zmc2V0OworCXVuc2lnbmVkIGludCAgYmxvY2tfbWFya19iaXRfb2Zmc2V0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgYm9vdF9yb21fZ2VvbWV0cnkgLSBCb290IFJPTSBnZW9tZXRyeSBkZXNjcmlwdGlvbi4KKyAqIEBzdHJpZGVfc2l6ZV9pbl9wYWdlczogICAgICAgIFRoZSBzaXplIG9mIGEgYm9vdCBibG9jayBzdHJpZGUsIGluIHBhZ2VzLgorICogQHNlYXJjaF9hcmVhX3N0cmlkZV9leHBvbmVudDogVGhlIGxvZ2FyaXRobSB0byBiYXNlIDIgb2YgdGhlIHNpemUgb2YgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoIGFyZWEgaW4gYm9vdCBibG9jayBzdHJpZGVzLgorICovCitzdHJ1Y3QgYm9vdF9yb21fZ2VvbWV0cnkgeworCXVuc2lnbmVkIGludCAgc3RyaWRlX3NpemVfaW5fcGFnZXM7CisJdW5zaWduZWQgaW50ICBzZWFyY2hfYXJlYV9zdHJpZGVfZXhwb25lbnQ7Cit9OworCisvKiBETUEgb3BlcmF0aW9ucyB0eXBlcyAqLworZW51bSBkbWFfb3BzX3R5cGUgeworCURNQV9GT1JfQ09NTUFORCA9IDEsCisJRE1BX0ZPUl9SRUFEX0RBVEEsCisJRE1BX0ZPUl9XUklURV9EQVRBLAorCURNQV9GT1JfUkVBRF9FQ0NfUEFHRSwKKwlETUFfRk9SX1dSSVRFX0VDQ19QQUdFCit9OworCisvKioKKyAqIHN0cnVjdCBuYW5kX3RpbWluZyAtIEZ1bmRhbWVudGFsIHRpbWluZyBhdHRyaWJ1dGVzIGZvciBOQU5ELgorICogQGRhdGFfc2V0dXBfaW5fbnM6ICAgICAgICAgVGhlIGRhdGEgc2V0dXAgdGltZSwgaW4gbmFub3NlY29uZHMuIFVzdWFsbHkgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIG9mIHREUyBhbmQgdFdQLiBBIG5lZ2F0aXZlIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhpcyBjaGFyYWN0ZXJpc3RpYyBpc24ndCBrbm93bi4KKyAqIEBkYXRhX2hvbGRfaW5fbnM6ICAgICAgICAgIFRoZSBkYXRhIGhvbGQgdGltZSwgaW4gbmFub3NlY29uZHMuIFVzdWFsbHkgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIG9mIHRESCwgdFdIIGFuZCB0UkVILiBBIG5lZ2F0aXZlIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhpcyBjaGFyYWN0ZXJpc3RpYyBpc24ndCBrbm93bi4KKyAqIEBhZGRyZXNzX3NldHVwX2luX25zOiAgICAgIFRoZSBhZGRyZXNzIHNldHVwIHRpbWUsIGluIG5hbm9zZWNvbmRzLiBVc3VhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4aW11bSBvZiB0Q0xTLCB0Q1MgYW5kIHRBTFMuIEEgbmVnYXRpdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0IGtub3duLgorICogQGdwbWlfc2FtcGxlX2RlbGF5X2luX25zOiAgQSBHUE1JLXNwZWNpZmljIHRpbWluZyBwYXJhbWV0ZXIuIEEgbmVnYXRpdmUgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0IGtub3duLgorICogQHRSRUFfaW5fbnM6ICAgICAgICAgICAgICAgdFJFQSwgaW4gbmFub3NlY29uZHMsIGZyb20gdGhlIGRhdGEgc2hlZXQuIEEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGlzIGNoYXJhY3RlcmlzdGljIGlzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm93bi4KKyAqIEB0UkxPSF9pbl9uczogICAgICAgICAgICAgIHRSTE9ILCBpbiBuYW5vc2Vjb25kcywgZnJvbSB0aGUgZGF0YSBzaGVldC4gQQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duLgorICogQHRSSE9IX2luX25zOiAgICAgICAgICAgICAgdFJIT0gsIGluIG5hbm9zZWNvbmRzLCBmcm9tIHRoZSBkYXRhIHNoZWV0LiBBCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhpcyBjaGFyYWN0ZXJpc3RpYyBpc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24uCisgKi8KK3N0cnVjdCBuYW5kX3RpbWluZyB7CisJaW50OF90ICBkYXRhX3NldHVwX2luX25zOworCWludDhfdCAgZGF0YV9ob2xkX2luX25zOworCWludDhfdCAgYWRkcmVzc19zZXR1cF9pbl9uczsKKwlpbnQ4X3QgIGdwbWlfc2FtcGxlX2RlbGF5X2luX25zOworCWludDhfdCAgdFJFQV9pbl9uczsKKwlpbnQ4X3QgIHRSTE9IX2luX25zOworCWludDhfdCAgdFJIT0hfaW5fbnM7Cit9OworCitzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgeworCS8qIFN5c3RlbSBJbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGdwbWlfbmFuZF9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKworCS8qIFJlc291cmNlcyAqLworCXN0cnVjdCByZXNvdXJjZXMJcmVzb3VyY2VzOworCisJLyogRmxhc2ggSGFyZHdhcmUgKi8KKwlzdHJ1Y3QgbmFuZF90aW1pbmcJdGltaW5nOworCisJLyogQkNIICovCisJc3RydWN0IGJjaF9nZW9tZXRyeQliY2hfZ2VvbWV0cnk7CisJc3RydWN0IGNvbXBsZXRpb24JYmNoX2RvbmU7CisKKwkvKiBOQU5EIEJvb3QgaXNzdWUgKi8KKwlib29sCQkJc3dhcF9ibG9ja19tYXJrOworCXN0cnVjdCBib290X3JvbV9nZW9tZXRyeSByb21fZ2VvbWV0cnk7CisKKwkvKiBNVEQgLyBOQU5EICovCisJc3RydWN0IG5hbmRfY2hpcAluYW5kOworCXN0cnVjdCBtdGRfaW5mbwkJbXRkOworCisJLyogR2VuZXJhbC11c2UgVmFyaWFibGVzICovCisJaW50CQkJY3VycmVudF9jaGlwOworCXVuc2lnbmVkIGludAkJY29tbWFuZF9sZW5ndGg7CisKKwkvKiBwYXNzZWQgZnJvbSB1cHBlciBsYXllciAqLworCXVpbnQ4X3QJCQkqdXBwZXJfYnVmOworCWludAkJCXVwcGVyX2xlbjsKKworCS8qIGZvciBETUEgb3BlcmF0aW9ucyAqLworCWJvb2wJCQlkaXJlY3RfZG1hX21hcF9vazsKKworCXN0cnVjdCBzY2F0dGVybGlzdAljbWRfc2dsOworCWNoYXIJCQkqY21kX2J1ZmZlcjsKKworCXN0cnVjdCBzY2F0dGVybGlzdAlkYXRhX3NnbDsKKwljaGFyCQkJKmRhdGFfYnVmZmVyX2RtYTsKKworCXZvaWQJCQkqcGFnZV9idWZmZXJfdmlydDsKKwlkbWFfYWRkcl90CQlwYWdlX2J1ZmZlcl9waHlzOworCXVuc2lnbmVkIGludAkJcGFnZV9idWZmZXJfc2l6ZTsKKworCXZvaWQJCQkqcGF5bG9hZF92aXJ0OworCWRtYV9hZGRyX3QJCXBheWxvYWRfcGh5czsKKworCXZvaWQJCQkqYXV4aWxpYXJ5X3ZpcnQ7CisJZG1hX2FkZHJfdAkJYXV4aWxpYXJ5X3BoeXM7CisKKwkvKiBETUEgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRE1BX0NIQU5TCQk4CisJc3RydWN0IGRtYV9jaGFuCQkqZG1hX2NoYW5zW0RNQV9DSEFOU107CisJc3RydWN0IG14c19kbWFfZGF0YQlkbWFfZGF0YTsKKwllbnVtIGRtYV9vcHNfdHlwZQlsYXN0X2RtYV90eXBlOworCWVudW0gZG1hX29wc190eXBlCWRtYV90eXBlOworCXN0cnVjdCBjb21wbGV0aW9uCWRtYV9kb25lOworCisJLyogcHJpdmF0ZSAqLworCXZvaWQJCQkqcHJpdmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IGdwbWlfbmZjX2hhcmR3YXJlX3RpbWluZyAtIEdQTUkgaGFyZHdhcmUgdGltaW5nIHBhcmFtZXRlcnMuCisgKiBAZGF0YV9zZXR1cF9pbl9jeWNsZXM6ICAgICAgVGhlIGRhdGEgc2V0dXAgdGltZSwgaW4gY3ljbGVzLgorICogQGRhdGFfaG9sZF9pbl9jeWNsZXM6ICAgICAgIFRoZSBkYXRhIGhvbGQgdGltZSwgaW4gY3ljbGVzLgorICogQGFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzOiAgIFRoZSBhZGRyZXNzIHNldHVwIHRpbWUsIGluIGN5Y2xlcy4KKyAqIEB1c2VfaGFsZl9wZXJpb2RzOiAgICAgICAgICBJbmRpY2F0ZXMgdGhlIGNsb2NrIGlzIHJ1bm5pbmcgc2xvd2x5LCBzbyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORkMgRExMIHNob3VsZCB1c2UgaGFsZi1wZXJpb2RzLgorICogQHNhbXBsZV9kZWxheV9mYWN0b3I6ICAgICAgIFRoZSBzYW1wbGUgZGVsYXkgZmFjdG9yLgorICovCitzdHJ1Y3QgZ3BtaV9uZmNfaGFyZHdhcmVfdGltaW5nIHsKKwl1aW50OF90ICBkYXRhX3NldHVwX2luX2N5Y2xlczsKKwl1aW50OF90ICBkYXRhX2hvbGRfaW5fY3ljbGVzOworCXVpbnQ4X3QgIGFkZHJlc3Nfc2V0dXBfaW5fY3ljbGVzOworCWJvb2wgICAgIHVzZV9oYWxmX3BlcmlvZHM7CisJdWludDhfdCAgc2FtcGxlX2RlbGF5X2ZhY3RvcjsKK307CisKKy8qKgorICogc3RydWN0IHRpbWluZ190aHJlc2hvZCAtIFRpbWluZyB0aHJlc2hvbGQKKyAqIEBtYXhfZGF0YV9zZXR1cF9jeWNsZXM6ICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXRhIHNldHVwIGN5Y2xlcyB0aGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZXhwcmVzc2VkIGluIHRoZSBoYXJkd2FyZS4KKyAqIEBpbnRlcm5hbF9kYXRhX3NldHVwX2luX25zOiAgIFRoZSB0aW1lLCBpbiBucywgdGhhdCB0aGUgTkZDIGhhcmR3YXJlIHJlcXVpcmVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGF0YSByZWFkIGludGVybmFsIHNldHVwLiBJbiB0aGUgUmVmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW51YWwsIHNlZSB0aGUgY2hhcHRlciAiSGlnaC1TcGVlZCBOQU5ECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1pbmciIGZvciBtb3JlIGRldGFpbHMuCisgKiBAbWF4X3NhbXBsZV9kZWxheV9mYWN0b3I6ICAgICBUaGUgbWF4aW11bSBzYW1wbGUgZGVsYXkgZmFjdG9yIHRoYXQgY2FuIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gdGhlIGhhcmR3YXJlLgorICogQG1heF9kbGxfY2xvY2tfcGVyaW9kX2luX25zOiAgVGhlIG1heGltdW0gcGVyaW9kIG9mIHRoZSBHUE1JIGNsb2NrIHRoYXQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgZGVsYXkgRExMIGhhcmR3YXJlIGNhbiBwb3NzaWJseSB3b3JrCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoICh0aGUgRExMIGlzIHVudXNhYmxlIHdpdGggbG9uZ2VyIHBlcmlvZHMpLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGZ1bGwtY3ljbGUgcGVyaW9kIGlzIGdyZWF0ZXIgdGhhbiBIQUxGCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlLCB0aGUgRExMIG11c3QgYmUgY29uZmlndXJlZCB0byB1c2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGYtcGVyaW9kcy4KKyAqIEBtYXhfZGxsX2RlbGF5X2luX25zOiAgICAgICAgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBkZWxheSwgaW4gbnMsIHRoYXQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETEwgY2FuIGltcGxlbWVudC4KKyAqIEBjbG9ja19mcmVxdWVuY3lfaW5faHo6ICAgICAgIFRoZSBjbG9jayBmcmVxdWVuY3ksIGluIEh6LCBkdXJpbmcgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkvTyB0cmFuc2FjdGlvbi4gSWYgbm8gSS9PIHRyYW5zYWN0aW9uIGlzIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcywgdGhpcyBpcyB0aGUgY2xvY2sgZnJlcXVlbmN5IGR1cmluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vc3QgcmVjZW50IEkvTyB0cmFuc2FjdGlvbi4KKyAqLworc3RydWN0IHRpbWluZ190aHJlc2hvZCB7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgbWF4X2NoaXBfY291bnQ7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgbWF4X2RhdGFfc2V0dXBfY3ljbGVzOworCWNvbnN0IHVuc2lnbmVkIGludCAgICAgIGludGVybmFsX2RhdGFfc2V0dXBfaW5fbnM7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgbWF4X3NhbXBsZV9kZWxheV9mYWN0b3I7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgbWF4X2RsbF9jbG9ja19wZXJpb2RfaW5fbnM7CisJY29uc3QgdW5zaWduZWQgaW50ICAgICAgbWF4X2RsbF9kZWxheV9pbl9uczsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbG9ja19mcmVxdWVuY3lfaW5faHo7CisKK307CisKKy8qIENvbW1vbiBTZXJ2aWNlcyAqLworZXh0ZXJuIGludCBjb21tb25fbmZjX3NldF9nZW9tZXRyeShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gc3RydWN0IGRtYV9jaGFuICpnZXRfZG1hX2NoYW4oc3RydWN0IGdwbWlfbmFuZF9kYXRhICopOworZXh0ZXJuIHZvaWQgcHJlcGFyZV9kYXRhX2RtYShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKiwKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkcik7CitleHRlcm4gaW50IHN0YXJ0X2RtYV93aXRob3V0X2JjaF9pcnEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICosCisJCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopOworZXh0ZXJuIGludCBzdGFydF9kbWFfd2l0aF9iY2hfaXJxKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqLAorCQkJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKTsKKworLyogR1BNSS1OQU5EIGhlbHBlciBmdW5jdGlvbiBsaWJyYXJ5ICovCitleHRlcm4gaW50IGdwbWlfaW5pdChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gdm9pZCBncG1pX2NsZWFyX2JjaChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gdm9pZCBncG1pX2R1bXBfaW5mbyhzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gaW50IGJjaF9zZXRfZ2VvbWV0cnkoc3RydWN0IGdwbWlfbmFuZF9kYXRhICopOworZXh0ZXJuIGludCBncG1pX2lzX3JlYWR5KHN0cnVjdCBncG1pX25hbmRfZGF0YSAqLCB1bnNpZ25lZCBjaGlwKTsKK2V4dGVybiBpbnQgZ3BtaV9zZW5kX2NvbW1hbmQoc3RydWN0IGdwbWlfbmFuZF9kYXRhICopOworZXh0ZXJuIHZvaWQgZ3BtaV9iZWdpbihzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gdm9pZCBncG1pX2VuZChzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKik7CitleHRlcm4gaW50IGdwbWlfcmVhZF9kYXRhKHN0cnVjdCBncG1pX25hbmRfZGF0YSAqKTsKK2V4dGVybiBpbnQgZ3BtaV9zZW5kX2RhdGEoc3RydWN0IGdwbWlfbmFuZF9kYXRhICopOworZXh0ZXJuIGludCBncG1pX3NlbmRfcGFnZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKiwKKwkJCWRtYV9hZGRyX3QgcGF5bG9hZCwgZG1hX2FkZHJfdCBhdXhpbGlhcnkpOworZXh0ZXJuIGludCBncG1pX3JlYWRfcGFnZShzdHJ1Y3QgZ3BtaV9uYW5kX2RhdGEgKiwKKwkJCWRtYV9hZGRyX3QgcGF5bG9hZCwgZG1hX2FkZHJfdCBhdXhpbGlhcnkpOworCisvKiBCQ0ggOiBTdGF0dXMgQmxvY2sgQ29tcGxldGlvbiBDb2RlcyAqLworI2RlZmluZSBTVEFUVVNfR09PRAkJMHgwMAorI2RlZmluZSBTVEFUVVNfRVJBU0VECQkweGZmCisjZGVmaW5lIFNUQVRVU19VTkNPUlJFQ1RBQkxFCTB4ZmUKKworLyogVXNlIHRoZSBwbGF0Zm9ybV9pZCB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgQXJjaHMuICovCisjZGVmaW5lIElTX01YMjMJCQkweDEKKyNkZWZpbmUgSVNfTVgyOAkJCTB4MgorI2RlZmluZSBHUE1JX0lTX01YMjMoeCkJCSgoeCktPnBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YSA9PSBJU19NWDIzKQorI2RlZmluZSBHUE1JX0lTX01YMjgoeCkJCSgoeCktPnBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YSA9PSBJU19NWDI4KQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLXJlZ3MuaCBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDMxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLXJlZ3MuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIEZyZWVzY2FsZSBHUE1JIE5BTkQgRmxhc2ggRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IDIwMDggRW1iZWRkZWQgQWxsZXkgU29sdXRpb25zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworI2lmbmRlZiBfX0dQTUlfTkFORF9HUE1JX1JFR1NfSAorI2RlZmluZSBfX0dQTUlfTkFORF9HUE1JX1JFR1NfSAorCisjZGVmaW5lIEhXX0dQTUlfQ1RSTDAJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMF9TRVQJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBIV19HUE1JX0NUUkwwX0NMUgkJCQkweDAwMDAwMDA4CisjZGVmaW5lIEhXX0dQTUlfQ1RSTDBfVE9HCQkJCTB4MDAwMDAwMGMKKworI2RlZmluZSBCUF9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERQkJCTI0CisjZGVmaW5lIEJNX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFCSgzIDw8IEJQX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFKQorI2RlZmluZSBCRl9HUE1JX0NUUkwwX0NPTU1BTkRfTU9ERSh2KQlcCisJKCgodikgPDwgQlBfR1BNSV9DVFJMMF9DT01NQU5EX01PREUpICYgQk1fR1BNSV9DVFJMMF9DT01NQU5EX01PREUpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFX19XUklURQkJMHgwCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFX19SRUFECQkweDEKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9DT01NQU5EX01PREVfX1JFQURfQU5EX0NPTVBBUkUJMHgyCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQ09NTUFORF9NT0RFX19XQUlUX0ZPUl9SRUFEWQkweDMKKworI2RlZmluZSBCTV9HUE1JX0NUUkwwX1dPUkRfTEVOR1RICQkJKDEgPDwgMjMpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEhfXzE2X0JJVAkJMHgwCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfV09SRF9MRU5HVEhfXzhfQklUCQkweDEKKworLyoKKyAqICBEaWZmZXJlbmNlIGluIExPQ0tfQ1MgYmV0d2VlbiBpbXgyMyBhbmQgaW14MjggOgorICogIFRoaXMgYml0IG1heSBpbXBhY3QgdGhlIF9QT1dFUl8gY29uc3VtcHRpb24uIFNvIHNvbWUgY2hpcHMKKyAqICBkbyBub3Qgc2V0IGl0LgorICovCisjZGVmaW5lIE1YMjNfQlBfR1BNSV9DVFJMMF9MT0NLX0NTCQkJMjIKKyNkZWZpbmUgTVgyOF9CUF9HUE1JX0NUUkwwX0xPQ0tfQ1MJCQkyNworI2RlZmluZSBMT0NLX0NTX0VOQUJMRQkJCQkJMHgxCisjZGVmaW5lIEJGX0dQTUlfQ1RSTDBfTE9DS19DUyh2LCB4KQkJCTB4MAorCisvKiBEaWZmZXJlbmNlIGluIENTIGJldHdlZW4gaW14MjMgYW5kIGlteDI4ICovCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDBfQ1MJCQkJMjAKKyNkZWZpbmUgTVgyM19CTV9HUE1JX0NUUkwwX0NTCQkoMyA8PCBCUF9HUE1JX0NUUkwwX0NTKQorI2RlZmluZSBNWDI4X0JNX0dQTUlfQ1RSTDBfQ1MJCSg3IDw8IEJQX0dQTUlfQ1RSTDBfQ1MpCisjZGVmaW5lIEJGX0dQTUlfQ1RSTDBfQ1ModiwgeCkJCSgoKHYpIDw8IEJQX0dQTUlfQ1RSTDBfQ1MpICYgXAorCQkJCQkJKEdQTUlfSVNfTVgyMygoeCkpIFwKKwkJCQkJCT8gTVgyM19CTV9HUE1JX0NUUkwwX0NTCVwKKwkJCQkJCTogTVgyOF9CTV9HUE1JX0NUUkwwX0NTKSkKKworI2RlZmluZSBCUF9HUE1JX0NUUkwwX0FERFJFU1MJCQkJMTcKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMF9BRERSRVNTCQkoMyA8PCBCUF9HUE1JX0NUUkwwX0FERFJFU1MpCisjZGVmaW5lIEJGX0dQTUlfQ1RSTDBfQUREUkVTUyh2KQlcCisJCSgoKHYpIDw8IEJQX0dQTUlfQ1RSTDBfQUREUkVTUykgJiBCTV9HUE1JX0NUUkwwX0FERFJFU1MpCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDBfQUREUkVTU19fTkFORF9EQVRBCQkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9BRERSRVNTX19OQU5EX0NMRQkJCTB4MQorI2RlZmluZSBCVl9HUE1JX0NUUkwwX0FERFJFU1NfX05BTkRfQUxFCQkJMHgyCisKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMF9BRERSRVNTX0lOQ1JFTUVOVAkJCSgxIDw8IDE2KQorI2RlZmluZSBCVl9HUE1JX0NUUkwwX0FERFJFU1NfSU5DUkVNRU5UX19ESVNBQkxFRAkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMF9BRERSRVNTX0lOQ1JFTUVOVF9fRU5BQkxFRAkweDEKKworI2RlZmluZSBCUF9HUE1JX0NUUkwwX1hGRVJfQ09VTlQJCQkwCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVAkoMHhmZmZmIDw8IEJQX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCkKKyNkZWZpbmUgQkZfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKHYpCVwKKwkJKCgodikgPDwgQlBfR1BNSV9DVFJMMF9YRkVSX0NPVU5UKSAmIEJNX0dQTUlfQ1RSTDBfWEZFUl9DT1VOVCkKKworI2RlZmluZSBIV19HUE1JX0NPTVBBUkUJCQkJCTB4MDAwMDAwMTAKKworI2RlZmluZSBIV19HUE1JX0VDQ0NUUkwJCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgSFdfR1BNSV9FQ0NDVFJMX1NFVAkJCQkweDAwMDAwMDI0CisjZGVmaW5lIEhXX0dQTUlfRUNDQ1RSTF9DTFIJCQkJMHgwMDAwMDAyOAorI2RlZmluZSBIV19HUE1JX0VDQ0NUUkxfVE9HCQkJCTB4MDAwMDAwMmMKKworI2RlZmluZSBCUF9HUE1JX0VDQ0NUUkxfRUNDX0NNRAkJCQkxMworI2RlZmluZSBCTV9HUE1JX0VDQ0NUUkxfRUNDX0NNRAkJKDMgPDwgQlBfR1BNSV9FQ0NDVFJMX0VDQ19DTUQpCisjZGVmaW5lIEJGX0dQTUlfRUNDQ1RSTF9FQ0NfQ01EKHYpCVwKKwkJKCgodikgPDwgQlBfR1BNSV9FQ0NDVFJMX0VDQ19DTUQpICYgQk1fR1BNSV9FQ0NDVFJMX0VDQ19DTUQpCisjZGVmaW5lIEJWX0dQTUlfRUNDQ1RSTF9FQ0NfQ01EX19CQ0hfREVDT0RFCQkweDAKKyNkZWZpbmUgQlZfR1BNSV9FQ0NDVFJMX0VDQ19DTURfX0JDSF9FTkNPREUJCTB4MQorCisjZGVmaW5lIEJNX0dQTUlfRUNDQ1RSTF9FTkFCTEVfRUNDCQkJKDEgPDwgMTIpCisjZGVmaW5lIEJWX0dQTUlfRUNDQ1RSTF9FTkFCTEVfRUNDX19FTkFCTEUJCTB4MQorI2RlZmluZSBCVl9HUE1JX0VDQ0NUUkxfRU5BQkxFX0VDQ19fRElTQUJMRQkJMHgwCisKKyNkZWZpbmUgQlBfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLCQkJMAorI2RlZmluZSBCTV9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0sJKDB4MWZmIDw8IEJQX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTSykKKyNkZWZpbmUgQkZfR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLKHYpCVwKKwkoKCh2KSA8PCBCUF9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0spICYgQk1fR1BNSV9FQ0NDVFJMX0JVRkZFUl9NQVNLKQorI2RlZmluZSBCVl9HUE1JX0VDQ0NUUkxfQlVGRkVSX01BU0tfX0JDSF9BVVhPTkxZCTB4MTAwCisjZGVmaW5lIEJWX0dQTUlfRUNDQ1RSTF9CVUZGRVJfTUFTS19fQkNIX1BBR0UJCTB4MUZGCisKKyNkZWZpbmUgSFdfR1BNSV9FQ0NDT1VOVAkJCQkweDAwMDAwMDMwCisjZGVmaW5lIEhXX0dQTUlfUEFZTE9BRAkJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBIV19HUE1JX0FVWElMSUFSWQkJCQkweDAwMDAwMDUwCisjZGVmaW5lIEhXX0dQTUlfQ1RSTDEJCQkJCTB4MDAwMDAwNjAKKyNkZWZpbmUgSFdfR1BNSV9DVFJMMV9TRVQJCQkJMHgwMDAwMDA2NAorI2RlZmluZSBIV19HUE1JX0NUUkwxX0NMUgkJCQkweDAwMDAwMDY4CisjZGVmaW5lIEhXX0dQTUlfQ1RSTDFfVE9HCQkJCTB4MDAwMDAwNmMKKworI2RlZmluZSBCTV9HUE1JX0NUUkwxX0JDSF9NT0RFCQkJCSgxIDw8IDE4KQorCisjZGVmaW5lIEJQX0dQTUlfQ1RSTDFfRExMX0VOQUJMRQkJCTE3CisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfRExMX0VOQUJMRQkoMSA8PCBCUF9HUE1JX0NUUkwxX0RMTF9FTkFCTEUpCisKKyNkZWZpbmUgQlBfR1BNSV9DVFJMMV9IQUxGX1BFUklPRAkJCTE2CisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfSEFMRl9QRVJJT0QJKDEgPDwgQlBfR1BNSV9DVFJMMV9IQUxGX1BFUklPRCkKKworI2RlZmluZSBCUF9HUE1JX0NUUkwxX1JETl9ERUxBWQkJCQkxMgorI2RlZmluZSBCTV9HUE1JX0NUUkwxX1JETl9ERUxBWQkJKDB4ZiA8PCBCUF9HUE1JX0NUUkwxX1JETl9ERUxBWSkKKyNkZWZpbmUgQkZfR1BNSV9DVFJMMV9SRE5fREVMQVkodikJXAorCQkoKCh2KSA8PCBCUF9HUE1JX0NUUkwxX1JETl9ERUxBWSkgJiBCTV9HUE1JX0NUUkwxX1JETl9ERUxBWSkKKworI2RlZmluZSBCTV9HUE1JX0NUUkwxX0RFVl9SRVNFVAkJCQkoMSA8PCAzKQorI2RlZmluZSBCVl9HUE1JX0NUUkwxX0RFVl9SRVNFVF9fRU5BQkxFRAkJMHgwCisjZGVmaW5lIEJWX0dQTUlfQ1RSTDFfREVWX1JFU0VUX19ESVNBQkxFRAkJMHgxCisKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMV9BVEFfSVJRUkRZX1BPTEFSSVRZCQkoMSA8PCAyKQorI2RlZmluZSBCVl9HUE1JX0NUUkwxX0FUQV9JUlFSRFlfUE9MQVJJVFlfX0FDVElWRUxPVwkweDAKKyNkZWZpbmUgQlZfR1BNSV9DVFJMMV9BVEFfSVJRUkRZX1BPTEFSSVRZX19BQ1RJVkVISUdICTB4MQorCisjZGVmaW5lIEJNX0dQTUlfQ1RSTDFfQ0FNRVJBX01PREUJCQkoMSA8PCAxKQorI2RlZmluZSBCVl9HUE1JX0NUUkwxX0dQTUlfTU9ERV9fTkFORAkJCTB4MAorI2RlZmluZSBCVl9HUE1JX0NUUkwxX0dQTUlfTU9ERV9fQVRBCQkJMHgxCisKKyNkZWZpbmUgQk1fR1BNSV9DVFJMMV9HUE1JX01PREUJCQkJKDEgPDwgMCkKKworI2RlZmluZSBIV19HUE1JX1RJTUlORzAJCQkJCTB4MDAwMDAwNzAKKworI2RlZmluZSBCUF9HUE1JX1RJTUlORzBfQUREUkVTU19TRVRVUAkJCTE2CisjZGVmaW5lIEJNX0dQTUlfVElNSU5HMF9BRERSRVNTX1NFVFVQCSgweGZmIDw8IEJQX0dQTUlfVElNSU5HMF9BRERSRVNTX1NFVFVQKQorI2RlZmluZSBCRl9HUE1JX1RJTUlORzBfQUREUkVTU19TRVRVUCh2KQlcCisJKCgodikgPDwgQlBfR1BNSV9USU1JTkcwX0FERFJFU1NfU0VUVVApICYgQk1fR1BNSV9USU1JTkcwX0FERFJFU1NfU0VUVVApCisKKyNkZWZpbmUgQlBfR1BNSV9USU1JTkcwX0RBVEFfSE9MRAkJCTgKKyNkZWZpbmUgQk1fR1BNSV9USU1JTkcwX0RBVEFfSE9MRAkoMHhmZiA8PCBCUF9HUE1JX1RJTUlORzBfREFUQV9IT0xEKQorI2RlZmluZSBCRl9HUE1JX1RJTUlORzBfREFUQV9IT0xEKHYpCQlcCisJKCgodikgPDwgQlBfR1BNSV9USU1JTkcwX0RBVEFfSE9MRCkgJiBCTV9HUE1JX1RJTUlORzBfREFUQV9IT0xEKQorCisjZGVmaW5lIEJQX0dQTUlfVElNSU5HMF9EQVRBX1NFVFVQCQkJMAorI2RlZmluZSBCTV9HUE1JX1RJTUlORzBfREFUQV9TRVRVUAkoMHhmZiA8PCBCUF9HUE1JX1RJTUlORzBfREFUQV9TRVRVUCkKKyNkZWZpbmUgQkZfR1BNSV9USU1JTkcwX0RBVEFfU0VUVVAodikJCVwKKwkoKCh2KSA8PCBCUF9HUE1JX1RJTUlORzBfREFUQV9TRVRVUCkgJiBCTV9HUE1JX1RJTUlORzBfREFUQV9TRVRVUCkKKworI2RlZmluZSBIV19HUE1JX1RJTUlORzEJCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQlBfR1BNSV9USU1JTkcxX0JVU1lfVElNRU9VVAkJCTE2CisKKyNkZWZpbmUgSFdfR1BNSV9USU1JTkcyCQkJCQkweDAwMDAwMDkwCisjZGVmaW5lIEhXX0dQTUlfREFUQQkJCQkJMHgwMDAwMDBhMAorCisvKiBNWDI4IHVzZXMgdGhpcyB0byBkZXRlY3QgUkVBRFkuICovCisjZGVmaW5lIEhXX0dQTUlfU1RBVAkJCQkJMHgwMDAwMDBiMAorI2RlZmluZSBNWDI4X0JQX0dQTUlfU1RBVF9SRUFEWV9CVVNZCQkJMjQKKyNkZWZpbmUgTVgyOF9CTV9HUE1JX1NUQVRfUkVBRFlfQlVTWQkoMHhmZiA8PCBNWDI4X0JQX0dQTUlfU1RBVF9SRUFEWV9CVVNZKQorI2RlZmluZSBNWDI4X0JGX0dQTUlfU1RBVF9SRUFEWV9CVVNZKHYpCQlcCisJKCgodikgPDwgTVgyOF9CUF9HUE1JX1NUQVRfUkVBRFlfQlVTWSkgJiBNWDI4X0JNX0dQTUlfU1RBVF9SRUFEWV9CVVNZKQorCisvKiBNWDIzIHVzZXMgdGhpcyB0byBkZXRlY3QgUkVBRFkuICovCisjZGVmaW5lIEhXX0dQTUlfREVCVUcJCQkJCTB4MDAwMDAwYzAKKyNkZWZpbmUgTVgyM19CUF9HUE1JX0RFQlVHX1JFQURZMAkJCTI4CisjZGVmaW5lIE1YMjNfQk1fR1BNSV9ERUJVR19SRUFEWTAJKDEgPDwgTVgyM19CUF9HUE1JX0RFQlVHX1JFQURZMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9oMTkxMC5jIGIvZHJpdmVycy9tdGQvbmFuZC9oMTkxMC5jCmluZGV4IDAyYTAzZTYuLjVkYzZmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvaDE5MTAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2gxOTEwLmMKQEAgLTgxLDkgKzgxLDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IGgxOTEwX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwotCWNvbnN0IGNoYXIgKnBhcnRfdHlwZSA9IDA7Ci0JaW50IG10ZF9wYXJ0c19uYiA9IDA7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7CiAJdm9pZCBfX2lvbWVtICpuYW5kYWRkcjsKIAogCWlmICghbWFjaGluZV9pc19oMTkwMCgpKQpAQCAtMTM2LDIyICsxMzMsMTAgQEAKIAkJaW91bm1hcCgodm9pZCAqKW5hbmRhZGRyKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0JbXRkX3BhcnRzX25iID0gcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKGgxOTEwX25hbmRfbXRkLCAmbXRkX3BhcnRzLCAiaDE5MTAtbmFuZCIpOwotCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQllbHNlCi0JCW10ZF9wYXJ0c19uYiA9IDA7Ci0jZW5kaWYKLQlpZiAobXRkX3BhcnRzX25iID09IDApIHsKLQkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm87Ci0JCW10ZF9wYXJ0c19uYiA9IE5VTV9QQVJUSVRJT05TOwotCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQl9CiAKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwotCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7Ci0JbXRkX2RldmljZV9yZWdpc3RlcihoMTkxMF9uYW5kX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOworCW10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoaDE5MTBfbmFuZF9tdGQsIE5VTEwsIDAsCisJCQlwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOwogCiAJLyogUmV0dXJuIGhhcHB5ICovCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2p6NDc0MF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2p6NDc0MF9uYW5kLmMKaW5kZXggNmU4MTNkYS4uZTI2NjQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9qejQ3NDBfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvano0NzQwX25hbmQuYwpAQCAtMjUxLDEwICsyNTEsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsiY21kbGluZSIsIE5VTEx9OwotI2VuZGlmCi0KIHN0YXRpYyBpbnQganpfbmFuZF9pb3JlbWFwX3Jlc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJlc291cmNlICoqcmVzLCB2b2lkIF9faW9tZW0gKipiYXNlKQogewpAQCAtMjk5LDggKzI5NSw2IEBACiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKIAlzdHJ1Y3QganpfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb25faW5mbzsKLQlpbnQgbnVtX3BhcnRpdGlvbnMgPSAwOwogCiAJbmFuZCA9IGt6YWxsb2Moc2l6ZW9mKCpuYW5kKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuYW5kKSB7CkBAIC0zNzMsMTUgKzM2Nyw5IEBACiAJCWdvdG8gZXJyX2dwaW9fZnJlZTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQludW1fcGFydGl0aW9ucyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsCi0JCQkJCQkmcGFydGl0aW9uX2luZm8sIDApOwotI2VuZGlmCi0JaWYgKG51bV9wYXJ0aXRpb25zIDw9IDAgJiYgcGRhdGEpIHsKLQkJbnVtX3BhcnRpdGlvbnMgPSBwZGF0YS0+bnVtX3BhcnRpdGlvbnM7Ci0JCXBhcnRpdGlvbl9pbmZvID0gcGRhdGEtPnBhcnRpdGlvbnM7Ci0JfQotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0aXRpb25faW5mbywgbnVtX3BhcnRpdGlvbnMpOworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwLAorCQkJcGRhdGEgPyBwZGF0YS0+cGFydGl0aW9ucyA6IE5VTEwsCisJCQlwZGF0YSA/IHBkYXRhLT5udW1fcGFydGl0aW9ucyA6IDApOwogCiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIG10ZCBkZXZpY2VcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9tcGM1MTIxX25mYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9tcGM1MTIxX25mYy5jCmluZGV4IGViMWZiYWMuLjVlZGU2NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbXBjNTEyMV9uZmMuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL21wYzUxMjFfbmZjLmMKQEAgLTEzMSw4ICsxMzEsNiBAQAogCiBzdGF0aWMgdm9pZCBtcGM1MTIxX25mY19kb25lKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKm1wYzUxMjFfbmZjX3Bwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiAvKiBSZWFkIE5GQyByZWdpc3RlciAqLwogc3RhdGljIGlubGluZSB1MTYgbmZjX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQgcmVnKQogewpAQCAtNjU2LDEzICs2NTQsMTMgQEAKIAlzdHJ1Y3QgbXBjNTEyMV9uZmNfcHJ2ICpwcnY7CiAJc3RydWN0IHJlc291cmNlIHJlczsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKIAl1bnNpZ25lZCBsb25nIHJlZ3NfcGFkZHIsIHJlZ3Nfc2l6ZTsKIAljb25zdCBfX2JlMzIgKmNoaXBzX25vOwogCWludCByZXNldHRpbWUgPSAwOwogCWludCByZXR2YWwgPSAwOwogCWludCByZXYsIGxlbjsKKwlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgcHBkYXRhOwogCiAJLyoKIAkgKiBDaGVjayBTb0MgcmV2aXNpb24uIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG9ubHkgTkZDCkBAIC03MjcsNiArNzI1LDcgQEAKIAl9CiAKIAltdGQtPm5hbWUgPSAiTVBDNTEyMSBOQU5EIjsKKwlwcGRhdGEub2Zfbm9kZSA9IGRuOwogCWNoaXAtPmRldl9yZWFkeSA9IG1wYzUxMjFfbmZjX2Rldl9yZWFkeTsKIAljaGlwLT5jbWRmdW5jID0gbXBjNTEyMV9uZmNfY29tbWFuZDsKIAljaGlwLT5yZWFkX2J5dGUgPSBtcGM1MTIxX25mY19yZWFkX2J5dGU7CkBAIC03MzUsNyArNzM0LDggQEAKIAljaGlwLT53cml0ZV9idWYgPSBtcGM1MTIxX25mY193cml0ZV9idWY7CiAJY2hpcC0+dmVyaWZ5X2J1ZiA9IG1wYzUxMjFfbmZjX3ZlcmlmeV9idWY7CiAJY2hpcC0+c2VsZWN0X2NoaXAgPSBtcGM1MTIxX25mY19zZWxlY3RfY2hpcDsKLQljaGlwLT5vcHRpb25zID0gTkFORF9OT19BVVRPSU5DUiB8IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwljaGlwLT5vcHRpb25zID0gTkFORF9OT19BVVRPSU5DUjsKKwljaGlwLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CiAKIAkvKiBTdXBwb3J0IGV4dGVybmFsIGNoaXAtc2VsZWN0IGxvZ2ljIG9uIEFEUzUxMjEgYm9hcmQgKi8KQEAgLTgzNywxOSArODM3LDcgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBtdGQpOwogCiAJLyogUmVnaXN0ZXIgZGV2aWNlIGluIE1URCAqLwotCXJldHZhbCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgbXBjNTEyMV9uZmNfcHByb2JlcywgJnBhcnRzLCAwKTsKLSNpZmRlZiBDT05GSUdfTVREX09GX1BBUlRTCi0JaWYgKHJldHZhbCA9PSAwKQotCQlyZXR2YWwgPSBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyhkZXYsIGRuLCAmcGFydHMpOwotI2VuZGlmCi0JaWYgKHJldHZhbCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJFcnJvciBwYXJzaW5nIE1URCBwYXJ0aXRpb25zIVxuIik7Ci0JCWRldm1fZnJlZV9pcnEoZGV2LCBwcnYtPmlycSwgbXRkKTsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR2YWwgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFydHMsIHJldHZhbCk7CisJcmV0dmFsID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsICZwcGRhdGEsIE5VTEwsIDApOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycihkZXYsICJFcnJvciBhZGRpbmcgTVREIGRldmljZSFcbiIpOwogCQlkZXZtX2ZyZWVfaXJxKGRldiwgcHJ2LT5pcnEsIG10ZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKaW5kZXggOTBkZjM0Yy4uNzRhNDNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwpAQCAtNDEsNyArNDEsNyBAQAogCiAjZGVmaW5lIG5mY19pc192MjEoKQkJKGNwdV9pc19teDI1KCkgfHwgY3B1X2lzX214MzUoKSkKICNkZWZpbmUgbmZjX2lzX3YxKCkJCShjcHVfaXNfbXgzMSgpIHx8IGNwdV9pc19teDI3KCkgfHwgY3B1X2lzX214MjEoKSkKLSNkZWZpbmUgbmZjX2lzX3YzXzIoKQkJY3B1X2lzX214NTEoKQorI2RlZmluZSBuZmNfaXNfdjNfMigpCQkoY3B1X2lzX214NTEoKSB8fCBjcHVfaXNfbXg1MygpKQogI2RlZmluZSBuZmNfaXNfdjMoKQkJbmZjX2lzX3YzXzIoKQogCiAvKiBBZGRyZXNzZXMgZm9yIE5GQyByZWdpc3RlcnMgKi8KQEAgLTE0Myw3ICsxNDMsNiBAQAogc3RydWN0IG14Y19uYW5kX2hvc3QgewogCXN0cnVjdCBtdGRfaW5mbwkJbXRkOwogCXN0cnVjdCBuYW5kX2NoaXAJbmFuZDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAogCXZvaWQJCQkqc3BhcmUwOwpAQCAtMzUwLDggKzM0OSw3IEBACiAJCQl1ZGVsYXkoMSk7CiAJCX0KIAkJaWYgKG1heF9yZXRyaWVzIDwgMCkKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogSU5UIG5vdCBzZXRcbiIsCi0JCQkgICAgICBfX2Z1bmNfXyk7CisJCQlwcl9kZWJ1ZygiJXM6IElOVCBub3Qgc2V0XG4iLCBfX2Z1bmNfXyk7CiAJfQogfQogCkBAIC0zNzEsNyArMzY5LDcgQEAKICAqIHdhaXRzIGZvciBjb21wbGV0aW9uLiAqLwogc3RhdGljIHZvaWQgc2VuZF9jbWRfdjFfdjIoc3RydWN0IG14Y19uYW5kX2hvc3QgKmhvc3QsIHVpbnQxNl90IGNtZCwgaW50IHVzZWlycSkKIHsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAic2VuZF9jbWQoaG9zdCwgMHgleCwgJWQpXG4iLCBjbWQsIHVzZWlycSk7CisJcHJfZGVidWcoInNlbmRfY21kKGhvc3QsIDB4JXgsICVkKVxuIiwgY21kLCB1c2VpcnEpOwogCiAJd3JpdGV3KGNtZCwgTkZDX1YxX1YyX0ZMQVNIX0NNRCk7CiAJd3JpdGV3KE5GQ19DTUQsIE5GQ19WMV9WMl9DT05GSUcyKTsKQEAgLTM4Nyw4ICszODUsNyBAQAogCQkJdWRlbGF5KDEpOwogCQl9CiAJCWlmIChtYXhfcmV0cmllcyA8IDApCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IFJFU0VUIGZhaWxlZFxuIiwKLQkJCSAgICAgIF9fZnVuY19fKTsKKwkJCXByX2RlYnVnKCIlczogUkVTRVQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKIAkJLyogV2FpdCBmb3Igb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCiAJCXdhaXRfb3BfZG9uZShob3N0LCB1c2VpcnEpOwpAQCAtNDExLDcgKzQwOCw3IEBACiAgKiBhIE5BTkQgY29tbWFuZC4gKi8KIHN0YXRpYyB2b2lkIHNlbmRfYWRkcl92MV92MihzdHJ1Y3QgbXhjX25hbmRfaG9zdCAqaG9zdCwgdWludDE2X3QgYWRkciwgaW50IGlzbGFzdCkKIHsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAic2VuZF9hZGRyKGhvc3QsIDB4JXggJWQpXG4iLCBhZGRyLCBpc2xhc3QpOworCXByX2RlYnVnKCJzZW5kX2FkZHIoaG9zdCwgMHgleCAlZClcbiIsIGFkZHIsIGlzbGFzdCk7CiAKIAl3cml0ZXcoYWRkciwgTkZDX1YxX1YyX0ZMQVNIX0FERFIpOwogCXdyaXRldyhORkNfQUREUiwgTkZDX1YxX1YyX0NPTkZJRzIpOwpAQCAtNTYxLDggKzU1OCw3IEBACiAJdWludDE2X3QgZWNjX3N0YXR1cyA9IHJlYWR3KE5GQ19WMV9WMl9FQ0NfU1RBVFVTX1JFU1VMVCk7CiAKIAlpZiAoKChlY2Nfc3RhdHVzICYgMHgzKSA9PSAyKSB8fCAoKGVjY19zdGF0dXMgPj4gMikgPT0gMikpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwKLQkJICAgICAgIk1YQ19OQU5EOiBIV0VDQyB1bmNvcnJlY3RhYmxlIDItYml0IEVDQyBlcnJvclxuIik7CisJCXByX2RlYnVnKCJNWENfTkFORDogSFdFQ0MgdW5jb3JyZWN0YWJsZSAyLWJpdCBFQ0MgZXJyb3JcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC04NDksNyArODQ1LDcgQEAKIAkJd3JpdGV3KDB4ZmZmZiwgTkZDX1YyMV9VTkxPQ0tFTkRfQkxLQUREUjMpOwogCX0gZWxzZSBpZiAobmZjX2lzX3YxKCkpIHsKIAkJd3JpdGV3KDB4MCwgTkZDX1YxX1VOTE9DS1NUQVJUX0JMS0FERFIpOwotCQl3cml0ZXcoMHg0MDAwLCBORkNfVjFfVU5MT0NLRU5EX0JMS0FERFIpOworCQl3cml0ZXcoMHhmZmZmLCBORkNfVjFfVU5MT0NLRU5EX0JMS0FERFIpOwogCX0gZWxzZQogCQlCVUcoKTsKIApAQCAtOTMyLDggKzkyOCw3IEBACiAJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0gbXRkLT5wcml2OwogCXN0cnVjdCBteGNfbmFuZF9ob3N0ICpob3N0ID0gbmFuZF9jaGlwLT5wcml2OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywKLQkgICAgICAibXhjX25hbmRfY29tbWFuZCAoY21kID0gMHgleCwgY29sID0gMHgleCwgcGFnZSA9IDB4JXgpXG4iLAorCXByX2RlYnVnKCJteGNfbmFuZF9jb21tYW5kIChjbWQgPSAweCV4LCBjb2wgPSAweCV4LCBwYWdlID0gMHgleClcbiIsCiAJICAgICAgY29tbWFuZCwgY29sdW1uLCBwYWdlX2FkZHIpOwogCiAJLyogUmVzZXQgY29tbWFuZCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwpAQCAtMTA0NCw3ICsxMDM5LDcgQEAKIAlzdHJ1Y3QgbXhjX25hbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgbXhjX25hbmRfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgZXJyID0gMCwgX19tYXliZV91bnVzZWQgbnJfcGFydHMgPSAwOworCWludCBlcnIgPSAwOwogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqb29iX3NtYWxscGFnZSwgKm9vYl9sYXJnZXBhZ2U7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KQEAgLTExNzksNyArMTE3NCw3IEBACiAJCXRoaXMtPmJidF90ZCA9ICZiYnRfbWFpbl9kZXNjcjsKIAkJdGhpcy0+YmJ0X21kID0gJmJidF9taXJyb3JfZGVzY3I7CiAJCS8qIHVwZGF0ZSBmbGFzaCBiYXNlZCBiYnQgKi8KLQkJdGhpcy0+b3B0aW9ucyB8PSBOQU5EX1VTRV9GTEFTSF9CQlQ7CisJCXRoaXMtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAl9CiAKIAlpbml0X2NvbXBsZXRpb24oJmhvc3QtPm9wX2NvbXBsZXRpb24pOwpAQCAtMTIzMSwxNiArMTIyNiw4IEBACiAJfQogCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQlucl9wYXJ0cyA9Ci0JICAgIHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsICZob3N0LT5wYXJ0cywgMCk7Ci0JaWYgKG5yX3BhcnRzID4gMCkKLQkJbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIGhvc3QtPnBhcnRzLCBucl9wYXJ0cyk7Ci0JZWxzZSBpZiAocGRhdGEtPnBhcnRzKQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwotCWVsc2UgewotCQlwcl9pbmZvKCJSZWdpc3RlcmluZyAlcyBhcyB3aG9sZSBkZXZpY2VcbiIsIG10ZC0+bmFtZSk7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsKLQl9CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIHBhcnRfcHJvYmVzLCAwLAorCQkJcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGE0NmU5YmIuLjNlZDljNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMjEsNyArMjEsNyBAQAogICogIFRPRE86CiAgKglFbmFibGUgY2FjaGVkIHByb2dyYW1taW5nIGZvciAyayBwYWdlIHNpemUgY2hpcHMKICAqCUNoZWNrLCBpZiBtdGQtPmVjY3R5cGUgc2hvdWxkIGJlIHNldCB0byBNVERfRUNDX0hXCi0gKglpZiB3ZSBoYXZlIEhXIGVjYyBzdXBwb3J0LgorICoJaWYgd2UgaGF2ZSBIVyBFQ0Mgc3VwcG9ydC4KICAqCVRoZSBBRy1BTkQgY2hpcHMgaGF2ZSBuaWNlIGZlYXR1cmVzIGZvciBzcGVlZCBpbXByb3ZlbWVudCwKICAqCXdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4gUmVhZCAvIHByb2dyYW0gNCBwYWdlcyBpbiBvbmUgZ28uCiAgKglCQlQgdGFibGUgaXMgbm90IHNlcmlhbGl6ZWQsIGhhcyB0byBiZSBmaXhlZApAQCAtMTEzLDIxICsxMTMsMTkgQEAKIAogCS8qIFN0YXJ0IGFkZHJlc3MgbXVzdCBhbGlnbiBvbiBibG9jayBib3VuZGFyeSAqLwogCWlmIChvZnMgJiAoKDEgPDwgY2hpcC0+cGh5c19lcmFzZV9zaGlmdCkgLSAxKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IFVuYWxpZ25lZCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogdW5hbGlnbmVkIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKIAkvKiBMZW5ndGggbXVzdCBhbGlnbiBvbiBibG9jayBib3VuZGFyeSAqLwogCWlmIChsZW4gJiAoKDEgPDwgY2hpcC0+cGh5c19lcmFzZV9zaGlmdCkgLSAxKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IExlbmd0aCBub3QgYmxvY2sgYWxpZ25lZFxuIiwKLQkJCQkJX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGxlbmd0aCBub3QgYmxvY2sgYWxpZ25lZFxuIiwgX19mdW5jX18pOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KIAogCS8qIERvIG5vdCBhbGxvdyBwYXN0IGVuZCBvZiBkZXZpY2UgKi8KIAlpZiAob2ZzICsgbGVuID4gbXRkLT5zaXplKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogUGFzdCBlbmQgb2YgZGV2aWNlXG4iLAotCQkJCQlfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogcGFzdCBlbmQgb2YgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCkBAIC0xMzYsOSArMTM0LDkgQEAKIAogLyoqCiAgKiBuYW5kX3JlbGVhc2VfZGV2aWNlIC0gW0dFTkVSSUNdIHJlbGVhc2UgY2hpcAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogRGVzZWxlY3QsIHJlbGVhc2UgY2hpcCBsb2NrIGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UKKyAqIERlc2VsZWN0LCByZWxlYXNlIGNoaXAgbG9jayBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlLgogICovCiBzdGF0aWMgdm9pZCBuYW5kX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtMTU3LDkgKzE1NSw5IEBACiAKIC8qKgogICogbmFuZF9yZWFkX2J5dGUgLSBbREVGQVVMVF0gcmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoCiAgKi8KIHN0YXRpYyB1aW50OF90IG5hbmRfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtMTY5LDEwICsxNjcsMTEgQEAKIAogLyoqCiAgKiBuYW5kX3JlYWRfYnl0ZTE2IC0gW0RFRkFVTFRdIHJlYWQgb25lIGJ5dGUgZW5kaWFuZXNzIGF3YXJlIGZyb20gdGhlIGNoaXAKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBuYW5kX3JlYWRfYnl0ZTE2IC0gW0RFRkFVTFRdIHJlYWQgb25lIGJ5dGUgZW5kaWFubmVzcyBhd2FyZSBmcm9tIHRoZSBjaGlwCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2l0aCB3aXRoCi0gKiBlbmRpYW5lc3MgY29udmVyc2lvbgorICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aCB3aXRoIGVuZGlhbm5lc3MgY29udmVyc2lvbi4KKyAqCiAgKi8KIHN0YXRpYyB1aW50OF90IG5hbmRfcmVhZF9ieXRlMTYoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0xODIsMTAgKzE4MSw5IEBACiAKIC8qKgogICogbmFuZF9yZWFkX3dvcmQgLSBbREVGQVVMVF0gcmVhZCBvbmUgd29yZCBmcm9tIHRoZSBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGggd2l0aG91dAotICogZW5kaWFuZXNzIGNvbnZlcnNpb24KKyAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGggd2l0aG91dCBlbmRpYW5uZXNzIGNvbnZlcnNpb24uCiAgKi8KIHN0YXRpYyB1MTYgbmFuZF9yZWFkX3dvcmQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0xOTUsOCArMTkzLDggQEAKIAogLyoqCiAgKiBuYW5kX3NlbGVjdF9jaGlwIC0gW0RFRkFVTFRdIGNvbnRyb2wgQ0UgbGluZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBjaGlwbnI6CWNoaXBudW1iZXIgdG8gc2VsZWN0LCAtMSBmb3IgZGVzZWxlY3QKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY2hpcG5yOiBjaGlwbnVtYmVyIHRvIHNlbGVjdCwgLTEgZm9yIGRlc2VsZWN0CiAgKgogICogRGVmYXVsdCBzZWxlY3QgZnVuY3Rpb24gZm9yIDEgY2hpcCBkZXZpY2VzLgogICovCkBAIC0yMTgsMTEgKzIxNiwxMSBAQAogCiAvKioKICAqIG5hbmRfd3JpdGVfYnVmIC0gW0RFRkFVTFRdIHdyaXRlIGJ1ZmZlciB0byBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKLSAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqCi0gKiBEZWZhdWx0IHdyaXRlIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpdGgKKyAqIERlZmF1bHQgd3JpdGUgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2lkdGguCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC0yMzUsMTEgKzIzMywxMSBAQAogCiAvKioKICAqIG5hbmRfcmVhZF9idWYgLSBbREVGQVVMVF0gcmVhZCBjaGlwIGRhdGEgaW50byBidWZmZXIKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgZGF0ZQotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgZGF0ZQorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICAqCi0gKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDhiaXQgYnVzd2l0aAorICogRGVmYXVsdCByZWFkIGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoLgogICovCiBzdGF0aWMgdm9pZCBuYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7CkBAIC0yNTIsMTEgKzI1MCwxMSBAQAogCiAvKioKICAqIG5hbmRfdmVyaWZ5X2J1ZiAtIFtERUZBVUxUXSBWZXJpZnkgY2hpcCBkYXRhIGFnYWluc3QgYnVmZmVyCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29tcGFyZQotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQogICoKLSAqIERlZmF1bHQgdmVyaWZ5IGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpdGgKKyAqIERlZmF1bHQgdmVyaWZ5IGZ1bmN0aW9uIGZvciA4Yml0IGJ1c3dpZHRoLgogICovCiBzdGF0aWMgaW50IG5hbmRfdmVyaWZ5X2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMjcxLDExICsyNjksMTEgQEAKIAogLyoqCiAgKiBuYW5kX3dyaXRlX2J1ZjE2IC0gW0RFRkFVTFRdIHdyaXRlIGJ1ZmZlciB0byBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKLSAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICAqCi0gKiBEZWZhdWx0IHdyaXRlIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoCisgKiBEZWZhdWx0IHdyaXRlIGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aWR0aC4KICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9idWYxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMjkxLDExICsyODksMTEgQEAKIAogLyoqCiAgKiBuYW5kX3JlYWRfYnVmMTYgLSBbREVGQVVMVF0gcmVhZCBjaGlwIGRhdGEgaW50byBidWZmZXIKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgZGF0ZQotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgZGF0ZQorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKICAqCi0gKiBEZWZhdWx0IHJlYWQgZnVuY3Rpb24gZm9yIDE2Yml0IGJ1c3dpdGgKKyAqIERlZmF1bHQgcmVhZCBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGguCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfcmVhZF9idWYxNihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMzEwLDExICszMDgsMTEgQEAKIAogLyoqCiAgKiBuYW5kX3ZlcmlmeV9idWYxNiAtIFtERUZBVUxUXSBWZXJpZnkgY2hpcCBkYXRhIGFnYWluc3QgYnVmZmVyCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29tcGFyZQotICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wYXJlCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQogICoKLSAqIERlZmF1bHQgdmVyaWZ5IGZ1bmN0aW9uIGZvciAxNmJpdCBidXN3aXRoCisgKiBEZWZhdWx0IHZlcmlmeSBmdW5jdGlvbiBmb3IgMTZiaXQgYnVzd2lkdGguCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF92ZXJpZnlfYnVmMTYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTMzMiw5ICszMzAsOSBAQAogCiAvKioKICAqIG5hbmRfYmxvY2tfYmFkIC0gW0RFRkFVTFRdIFJlYWQgYmFkIGJsb2NrIG1hcmtlciBmcm9tIHRoZSBjaGlwCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mczoJb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0Ci0gKiBAZ2V0Y2hpcDoJMCwgaWYgdGhlIGNoaXAgaXMgYWxyZWFkeSBzZWxlY3RlZAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZnM6IG9mZnNldCBmcm9tIGRldmljZSBzdGFydAorICogQGdldGNoaXA6IDAsIGlmIHRoZSBjaGlwIGlzIGFscmVhZHkgc2VsZWN0ZWQKICAqCiAgKiBDaGVjaywgaWYgdGhlIGJsb2NrIGlzIGJhZC4KICAqLwpAQCAtMzQ0LDcgKzM0Miw3IEBACiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKIAl1MTYgYmFkOwogCi0JaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UpCisJaWYgKGNoaXAtPmJidF9vcHRpb25zICYgTkFORF9CQlRfU0NBTkxBU1RQQUdFKQogCQlvZnMgKz0gbXRkLT5lcmFzZXNpemUgLSBtdGQtPndyaXRlc2l6ZTsKIAogCXBhZ2UgPSAoaW50KShvZnMgPj4gY2hpcC0+cGFnZV9zaGlmdCkgJiBjaGlwLT5wYWdlbWFzazsKQEAgLTM4NCwxMSArMzgyLDExIEBACiAKIC8qKgogICogbmFuZF9kZWZhdWx0X2Jsb2NrX21hcmtiYWQgLSBbREVGQVVMVF0gbWFyayBhIGJsb2NrIGJhZAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBvZnM6CW9mZnNldCBmcm9tIGRldmljZSBzdGFydAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvZnM6IG9mZnNldCBmcm9tIGRldmljZSBzdGFydAogICoKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5Ci0gKiBhIGhhcmR3YXJlIHNwZWNpZmljIGRyaXZlci4KKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgaGFyZHdhcmUKKyAqIHNwZWNpZmljIGRyaXZlci4KICovCiBzdGF0aWMgaW50IG5hbmRfZGVmYXVsdF9ibG9ja19tYXJrYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKQogewpAQCAtMzk2LDcgKzM5NCw3IEBACiAJdWludDhfdCBidWZbMl0gPSB7IDAsIDAgfTsKIAlpbnQgYmxvY2ssIHJldCwgaSA9IDA7CiAKLQlpZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5MQVNUUEFHRSkKKwlpZiAoY2hpcC0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UpCiAJCW9mcyArPSBtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXplOwogCiAJLyogR2V0IGJsb2NrIG51bWJlciAqLwpAQCAtNDA0LDMzICs0MDIsMzEgQEAKIAlpZiAoY2hpcC0+YmJ0KQogCQljaGlwLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CiAKLQkvKiBEbyB3ZSBoYXZlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlID8gKi8KLQlpZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVCkKKwkvKiBEbyB3ZSBoYXZlIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlPyAqLworCWlmIChjaGlwLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1VTRV9GTEFTSCkKIAkJcmV0ID0gbmFuZF91cGRhdGVfYmJ0KG10ZCwgb2ZzKTsKIAllbHNlIHsKKwkJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKKwogCQluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9XUklUSU5HKTsKIAotCQkvKiBXcml0ZSB0byBmaXJzdCB0d28gcGFnZXMgYW5kIHRvIGJ5dGUgMSBhbmQgNiBpZiBuZWNlc3NhcnkuCi0JCSAqIElmIHdlIHdyaXRlIHRvIG1vcmUgdGhhbiBvbmUgbG9jYXRpb24sIHRoZSBmaXJzdCBlcnJvcgotCQkgKiBlbmNvdW50ZXJlZCBxdWl0cyB0aGUgcHJvY2VkdXJlLiBXZSB3cml0ZSB0d28gYnl0ZXMgcGVyCi0JCSAqIGxvY2F0aW9uLCBzbyB3ZSBkb250IGhhdmUgdG8gbWVzcyB3aXRoIDE2IGJpdCBhY2Nlc3MuCisJCS8qCisJCSAqIFdyaXRlIHRvIGZpcnN0IHR3byBwYWdlcyBpZiBuZWNlc3NhcnkuIElmIHdlIHdyaXRlIHRvIG1vcmUKKwkJICogdGhhbiBvbmUgbG9jYXRpb24sIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZCBxdWl0cyB0aGUKKwkJICogcHJvY2VkdXJlLiBXZSB3cml0ZSB0d28gYnl0ZXMgcGVyIGxvY2F0aW9uLCBzbyB3ZSBkb250IGhhdmUKKwkJICogdG8gbWVzcyB3aXRoIDE2IGJpdCBhY2Nlc3MuCiAJCSAqLworCQlvcHMubGVuID0gb3BzLm9vYmxlbiA9IDI7CisJCW9wcy5kYXRidWYgPSBOVUxMOworCQlvcHMub29iYnVmID0gYnVmOworCQlvcHMub29ib2ZmcyA9IGNoaXAtPmJhZGJsb2NrcG9zICYgfjB4MDE7CisJCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJCWRvIHsKLQkJCWNoaXAtPm9wcy5sZW4gPSBjaGlwLT5vcHMub29ibGVuID0gMjsKLQkJCWNoaXAtPm9wcy5kYXRidWYgPSBOVUxMOwotCQkJY2hpcC0+b3BzLm9vYmJ1ZiA9IGJ1ZjsKLQkJCWNoaXAtPm9wcy5vb2JvZmZzID0gY2hpcC0+YmFkYmxvY2twb3MgJiB+MHgwMTsKKwkJCXJldCA9IG5hbmRfZG9fd3JpdGVfb29iKG10ZCwgb2ZzLCAmb3BzKTsKIAotCQkJcmV0ID0gbmFuZF9kb193cml0ZV9vb2IobXRkLCBvZnMsICZjaGlwLT5vcHMpOwotCi0JCQlpZiAoIXJldCAmJiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5CWVRFMUFORDYpKSB7Ci0JCQkJY2hpcC0+b3BzLm9vYm9mZnMgPSBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUwotCQkJCQkmIH4weDAxOwotCQkJCXJldCA9IG5hbmRfZG9fd3JpdGVfb29iKG10ZCwgb2ZzLCAmY2hpcC0+b3BzKTsKLQkJCX0KIAkJCWkrKzsKIAkJCW9mcyArPSBtdGQtPndyaXRlc2l6ZTsKLQkJfSB3aGlsZSAoIXJldCAmJiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU4yTkRQQUdFKSAmJgorCQl9IHdoaWxlICghcmV0ICYmIChjaGlwLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1NDQU4yTkRQQUdFKSAmJgogCQkJCWkgPCAyKTsKIAogCQluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CkBAIC00NDMsMTYgKzQzOSwxNiBAQAogCiAvKioKICAqIG5hbmRfY2hlY2tfd3AgLSBbR0VORVJJQ10gY2hlY2sgaWYgdGhlIGNoaXAgaXMgd3JpdGUgcHJvdGVjdGVkCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIFRoZSBmdW5jdGlvbiBleHBlY3RzLCB0aGF0IHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBzZWxlY3RlZAorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkLiBUaGUgZnVuY3Rpb24gZXhwZWN0cywgdGhhdCB0aGUKKyAqIGRldmljZSBpcyBhbHJlYWR5IHNlbGVjdGVkLgogICovCiBzdGF0aWMgaW50IG5hbmRfY2hlY2tfd3Aoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKIAotCS8qIGJyb2tlbiB4RCBjYXJkcyByZXBvcnQgV1AgZGVzcGl0ZSBiZWluZyB3cml0YWJsZSAqLworCS8qIEJyb2tlbiB4RCBjYXJkcyByZXBvcnQgV1AgZGVzcGl0ZSBiZWluZyB3cml0YWJsZSAqLwogCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9CUk9LRU5fWEQpCiAJCXJldHVybiAwOwogCkBAIC00NjMsMTAgKzQ1OSwxMCBAQAogCiAvKioKICAqIG5hbmRfYmxvY2tfY2hlY2tiYWQgLSBbR0VORVJJQ10gQ2hlY2sgaWYgYSBibG9jayBpcyBtYXJrZWQgYmFkCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mczoJb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0Ci0gKiBAZ2V0Y2hpcDoJMCwgaWYgdGhlIGNoaXAgaXMgYWxyZWFkeSBzZWxlY3RlZAotICogQGFsbG93YmJ0OgkxLCBpZiBpdHMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGJidCBhcmVhCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mczogb2Zmc2V0IGZyb20gZGV2aWNlIHN0YXJ0CisgKiBAZ2V0Y2hpcDogMCwgaWYgdGhlIGNoaXAgaXMgYWxyZWFkeSBzZWxlY3RlZAorICogQGFsbG93YmJ0OiAxLCBpZiBpdHMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGJidCBhcmVhCiAgKgogICogQ2hlY2ssIGlmIHRoZSBibG9jayBpcyBiYWQuIEVpdGhlciBieSByZWFkaW5nIHRoZSBiYWQgYmxvY2sgdGFibGUgb3IKICAqIGNhbGxpbmcgb2YgdGhlIHNjYW4gZnVuY3Rpb24uCkBAIC00ODUsOCArNDgxLDggQEAKIAogLyoqCiAgKiBwYW5pY19uYW5kX3dhaXRfcmVhZHkgLSBbR0VORVJJQ10gV2FpdCBmb3IgdGhlIHJlYWR5IHBpbiBhZnRlciBjb21tYW5kcy4KLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAdGltZW86CVRpbWVvdXQKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdGltZW86IFRpbWVvdXQKICAqCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG5hbmRfd2FpdF9yZWFkeSB1c2VkIHdoZW4gbmVlZGluZyB0byB3YWl0IGluIGludGVycnVwdAogICogY29udGV4dC4KQEAgLTUwNSwxMCArNTAxLDcgQEAKIAl9CiB9CiAKLS8qCi0gKiBXYWl0IGZvciB0aGUgcmVhZHkgcGluLCBhZnRlciBhIGNvbW1hbmQKLSAqIFRoZSB0aW1lb3V0IGlzIGNhdGNoZWQgbGF0ZXIuCi0gKi8KKy8qIFdhaXQgZm9yIHRoZSByZWFkeSBwaW4sIGFmdGVyIGEgY29tbWFuZC4gVGhlIHRpbWVvdXQgaXMgY2F1Z2h0IGxhdGVyLiAqLwogdm9pZCBuYW5kX3dhaXRfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKQEAgLTUxOSw3ICs1MTIsNyBAQAogCQlyZXR1cm4gcGFuaWNfbmFuZF93YWl0X3JlYWR5KG10ZCwgNDAwKTsKIAogCWxlZF90cmlnZ2VyX2V2ZW50KG5hbmRfbGVkX3RyaWdnZXIsIExFRF9GVUxMKTsKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkIG9yIHRpbWVvdXQgb2NjdXJlcyAqLworCS8qIFdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgb3IgdGltZW91dCBvY2N1cnMgKi8KIAlkbyB7CiAJCWlmIChjaGlwLT5kZXZfcmVhZHkobXRkKSkKIAkJCWJyZWFrOwpAQCAtNTMxLDEzICs1MjQsMTMgQEAKIAogLyoqCiAgKiBuYW5kX2NvbW1hbmQgLSBbREVGQVVMVF0gU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGNvbW1hbmQ6CXRoZSBjb21tYW5kIHRvIGJlIHNlbnQKLSAqIEBjb2x1bW46CXRoZSBjb2x1bW4gYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCi0gKiBAcGFnZV9hZGRyOgl0aGUgcGFnZSBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY29tbWFuZDogdGhlIGNvbW1hbmQgdG8gYmUgc2VudAorICogQGNvbHVtbjogdGhlIGNvbHVtbiBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKKyAqIEBwYWdlX2FkZHI6IHRoZSBwYWdlIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQogICoKLSAqIFNlbmQgY29tbWFuZCB0byBOQU5EIGRldmljZS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBzbWFsbCBwYWdlCi0gKiBkZXZpY2VzICgyNTYvNTEyIEJ5dGVzIHBlciBwYWdlKQorICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNtYWxsIHBhZ2UgZGV2aWNlcworICogKDI1Ni81MTIgQnl0ZXMgcGVyIHBhZ2UpLgogICovCiBzdGF0aWMgdm9pZCBuYW5kX2NvbW1hbmQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCBjb21tYW5kLAogCQkJIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCkBAIC01NDUsOSArNTM4LDcgQEAKIAlyZWdpc3RlciBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCWludCBjdHJsID0gTkFORF9DVFJMX0NMRSB8IE5BTkRfQ1RSTF9DSEFOR0U7CiAKLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLgotCSAqLworCS8qIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlICovCiAJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfU0VRSU4pIHsKIAkJaW50IHJlYWRjbWQ7CiAKQEAgLTU2Nyw5ICs1NTgsNyBAQAogCX0KIAljaGlwLT5jbWRfY3RybChtdGQsIGNvbW1hbmQsIGN0cmwpOwogCi0JLyoKLQkgKiBBZGRyZXNzIGN5Y2xlLCB3aGVuIG5lY2Vzc2FyeQotCSAqLworCS8qIEFkZHJlc3MgY3ljbGUsIHdoZW4gbmVjZXNzYXJ5ICovCiAJY3RybCA9IE5BTkRfQ1RSTF9BTEUgfCBOQU5EX0NUUkxfQ0hBTkdFOwogCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KIAlpZiAoY29sdW1uICE9IC0xKSB7CkBAIC01OTAsOCArNTc5LDggQEAKIAljaGlwLT5jbWRfY3RybChtdGQsIE5BTkRfQ01EX05PTkUsIE5BTkRfTkNFIHwgTkFORF9DVFJMX0NIQU5HRSk7CiAKIAkvKgotCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMKLQkgKiBzdGF0dXMgYW5kIHNlcXVlbnRpYWwgaW4gbmVlZHMgbm8gZGVsYXkKKwkgKiBQcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzIHN0YXR1cyBhbmQgc2VxdWVudGlhbAorCSAqIGluIG5lZWRzIG5vIGRlbGF5CiAJICovCiAJc3dpdGNoIChjb21tYW5kKSB7CiAKQEAgLTYyNSw4ICs2MTQsMTAgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgotCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLworCS8qCisJICogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KKwkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4KKwkgKi8KIAluZGVsYXkoMTAwKTsKIAogCW5hbmRfd2FpdF9yZWFkeShtdGQpOwpAQCAtNjM0LDE0ICs2MjUsMTQgQEAKIAogLyoqCiAgKiBuYW5kX2NvbW1hbmRfbHAgLSBbREVGQVVMVF0gU2VuZCBjb21tYW5kIHRvIE5BTkQgbGFyZ2UgcGFnZSBkZXZpY2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAY29tbWFuZDoJdGhlIGNvbW1hbmQgdG8gYmUgc2VudAotICogQGNvbHVtbjoJdGhlIGNvbHVtbiBhZGRyZXNzIGZvciB0aGlzIGNvbW1hbmQsIC0xIGlmIG5vbmUKLSAqIEBwYWdlX2FkZHI6CXRoZSBwYWdlIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjb21tYW5kOiB0aGUgY29tbWFuZCB0byBiZSBzZW50CisgKiBAY29sdW1uOiB0aGUgY29sdW1uIGFkZHJlc3MgZm9yIHRoaXMgY29tbWFuZCwgLTEgaWYgbm9uZQorICogQHBhZ2VfYWRkcjogdGhlIHBhZ2UgYWRkcmVzcyBmb3IgdGhpcyBjb21tYW5kLCAtMSBpZiBub25lCiAgKgogICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlLiBUaGlzIGlzIHRoZSB2ZXJzaW9uIGZvciB0aGUgbmV3IGxhcmdlIHBhZ2UKLSAqIGRldmljZXMgV2UgZG9udCBoYXZlIHRoZSBzZXBhcmF0ZSByZWdpb25zIGFzIHdlIGhhdmUgaW4gdGhlIHNtYWxsIHBhZ2UKLSAqIGRldmljZXMuICBXZSBtdXN0IGVtdWxhdGUgTkFORF9DTURfUkVBRE9PQiB0byBrZWVwIHRoZSBjb2RlIGNvbXBhdGlibGUuCisgKiBkZXZpY2VzLiBXZSBkb24ndCBoYXZlIHRoZSBzZXBhcmF0ZSByZWdpb25zIGFzIHdlIGhhdmUgaW4gdGhlIHNtYWxsIHBhZ2UKKyAqIGRldmljZXMuIFdlIG11c3QgZW11bGF0ZSBOQU5EX0NNRF9SRUFET09CIHRvIGtlZXAgdGhlIGNvZGUgY29tcGF0aWJsZS4KICAqLwogc3RhdGljIHZvaWQgbmFuZF9jb21tYW5kX2xwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKIAkJCSAgICBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQpAQCAtNjgzLDggKzY3NCw4IEBACiAJY2hpcC0+Y21kX2N0cmwobXRkLCBOQU5EX0NNRF9OT05FLCBOQU5EX05DRSB8IE5BTkRfQ1RSTF9DSEFOR0UpOwogCiAJLyoKLQkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzCi0JICogc3RhdHVzLCBzZXF1ZW50aWFsIGluLCBhbmQgZGVwbGV0ZTEgbmVlZCBubyBkZWxheQorCSAqIFByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgc3RhdHVzLCBzZXF1ZW50aWFsCisJICogaW4sIGFuZCBkZXBsZXRlMSBuZWVkIG5vIGRlbGF5LgogCSAqLwogCXN3aXRjaCAoY29tbWFuZCkgewogCkBAIC02OTgsMTQgKzY4OSwxMiBAQAogCWNhc2UgTkFORF9DTURfREVQTEVURTE6CiAJCXJldHVybjsKIAotCQkvKgotCQkgKiByZWFkIGVycm9yIHN0YXR1cyBjb21tYW5kcyByZXF1aXJlIG9ubHkgYSBzaG9ydCBkZWxheQotCQkgKi8KIAljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjoKIAljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjA6CiAJY2FzZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IxOgogCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMjoKIAljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjM6CisJCS8qIFJlYWQgZXJyb3Igc3RhdHVzIGNvbW1hbmRzIHJlcXVpcmUgb25seSBhIHNob3J0IGRlbGF5ICovCiAJCXVkZWxheShjaGlwLT5jaGlwX2RlbGF5KTsKIAkJcmV0dXJuOwogCkBAIC03MzksNyArNzI4LDcgQEAKIAlkZWZhdWx0OgogCQkvKgogCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgotCQkgKiBjb21tYW5kIGRlbGF5CisJCSAqIGNvbW1hbmQgZGVsYXkuCiAJCSAqLwogCQlpZiAoIWNoaXAtPmRldl9yZWFkeSkgewogCQkJdWRlbGF5KGNoaXAtPmNoaXBfZGVsYXkpOwpAQCAtNzQ3LDggKzczNiwxMCBAQAogCQl9CiAJfQogCi0JLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KLQkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KKwkvKgorCSAqIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluCisJICogYW55IGNhc2Ugb24gYW55IG1hY2hpbmUuCisJICovCiAJbmRlbGF5KDEwMCk7CiAKIAluYW5kX3dhaXRfcmVhZHkobXRkKTsKQEAgLTc1NiwyNSArNzQ3LDI1IEBACiAKIC8qKgogICogcGFuaWNfbmFuZF9nZXRfZGV2aWNlIC0gW0dFTkVSSUNdIEdldCBjaGlwIGZvciBzZWxlY3RlZCBhY2Nlc3MKLSAqIEBjaGlwOgl0aGUgbmFuZCBjaGlwIGRlc2NyaXB0b3IKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAbmV3X3N0YXRlOgl0aGUgc3RhdGUgd2hpY2ggaXMgcmVxdWVzdGVkCisgKiBAY2hpcDogdGhlIG5hbmQgY2hpcCBkZXNjcmlwdG9yCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19zdGF0ZTogdGhlIHN0YXRlIHdoaWNoIGlzIHJlcXVlc3RlZAogICoKICAqIFVzZWQgd2hlbiBpbiBwYW5pYywgbm8gbG9ja3MgYXJlIHRha2VuLgogICovCiBzdGF0aWMgdm9pZCBwYW5pY19uYW5kX2dldF9kZXZpY2Uoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJICAgICAgc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBuZXdfc3RhdGUpCiB7Ci0JLyogSGFyZHdhcmUgY29udHJvbGxlciBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbmQgZGV2aWNlcyAqLworCS8qIEhhcmR3YXJlIGNvbnRyb2xsZXIgc2hhcmVkIGFtb25nIGluZGVwZW5kZW50IGRldmljZXMgKi8KIAljaGlwLT5jb250cm9sbGVyLT5hY3RpdmUgPSBjaGlwOwogCWNoaXAtPnN0YXRlID0gbmV3X3N0YXRlOwogfQogCiAvKioKICAqIG5hbmRfZ2V0X2RldmljZSAtIFtHRU5FUklDXSBHZXQgY2hpcCBmb3Igc2VsZWN0ZWQgYWNjZXNzCi0gKiBAY2hpcDoJdGhlIG5hbmQgY2hpcCBkZXNjcmlwdG9yCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG5ld19zdGF0ZToJdGhlIHN0YXRlIHdoaWNoIGlzIHJlcXVlc3RlZAorICogQGNoaXA6IHRoZSBuYW5kIGNoaXAgZGVzY3JpcHRvcgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfc3RhdGU6IHRoZSBzdGF0ZSB3aGljaCBpcyByZXF1ZXN0ZWQKICAqCiAgKiBHZXQgdGhlIGRldmljZSBhbmQgbG9jayBpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcwogICovCkBAIC04MTIsMTAgKzgwMywxMCBAQAogfQogCiAvKioKLSAqIHBhbmljX25hbmRfd2FpdCAtIFtHRU5FUklDXSAgd2FpdCB1bnRpbCB0aGUgY29tbWFuZCBpcyBkb25lCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGNoaXA6CU5BTkQgY2hpcCBzdHJ1Y3R1cmUKLSAqIEB0aW1lbzoJVGltZW91dAorICogcGFuaWNfbmFuZF93YWl0IC0gW0dFTkVSSUNdIHdhaXQgdW50aWwgdGhlIGNvbW1hbmQgaXMgZG9uZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBOQU5EIGNoaXAgc3RydWN0dXJlCisgKiBAdGltZW86IHRpbWVvdXQKICAqCiAgKiBXYWl0IGZvciBjb21tYW5kIGRvbmUuIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIG5hbmRfd2FpdCB1c2VkIHdoZW4KICAqIHdlIGFyZSBpbiBpbnRlcnJ1cHQgY29udGV4dC4gTWF5IGhhcHBlbiB3aGVuIGluIHBhbmljIGFuZCB0cnlpbmcgdG8gd3JpdGUKQEAgLTgzOCwxMyArODI5LDEzIEBACiB9CiAKIC8qKgotICogbmFuZF93YWl0IC0gW0RFRkFVTFRdICB3YWl0IHVudGlsIHRoZSBjb21tYW5kIGlzIGRvbmUKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAY2hpcDoJTkFORCBjaGlwIHN0cnVjdHVyZQorICogbmFuZF93YWl0IC0gW0RFRkFVTFRdIHdhaXQgdW50aWwgdGhlIGNvbW1hbmQgaXMgZG9uZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBOQU5EIGNoaXAgc3RydWN0dXJlCiAgKgotICogV2FpdCBmb3IgY29tbWFuZCBkb25lLiBUaGlzIGFwcGxpZXMgdG8gZXJhc2UgYW5kIHByb2dyYW0gb25seQotICogRXJhc2UgY2FuIHRha2UgdXAgdG8gNDAwbXMgYW5kIHByb2dyYW0gdXAgdG8gMjBtcyBhY2NvcmRpbmcgdG8KLSAqIGdlbmVyYWwgTkFORCBhbmQgU21hcnRNZWRpYSBzcGVjcworICogV2FpdCBmb3IgY29tbWFuZCBkb25lLiBUaGlzIGFwcGxpZXMgdG8gZXJhc2UgYW5kIHByb2dyYW0gb25seS4gRXJhc2UgY2FuCisgKiB0YWtlIHVwIHRvIDQwMG1zIGFuZCBwcm9ncmFtIHVwIHRvIDIwbXMgYWNjb3JkaW5nIHRvIGdlbmVyYWwgTkFORCBhbmQKKyAqIFNtYXJ0TWVkaWEgc3BlY3MuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93YWl0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQogewpAQCAtODU5LDggKzg1MCwxMCBAQAogCiAJbGVkX3RyaWdnZXJfZXZlbnQobmFuZF9sZWRfdHJpZ2dlciwgTEVEX0ZVTEwpOwogCi0JLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KLQkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KKwkvKgorCSAqIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluIGFueQorCSAqIGNhc2Ugb24gYW55IG1hY2hpbmUuCisJICovCiAJbmRlbGF5KDEwMCk7CiAKIAlpZiAoKHN0YXRlID09IEZMX0VSQVNJTkcpICYmIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19BTkQpKQpAQCAtODkwLDE2ICs4ODMsMTUgQEAKIAogLyoqCiAgKiBfX25hbmRfdW5sb2NrIC0gW1JFUExBQ0VBQkxFXSB1bmxvY2tzIHNwZWNpZmllZCBsb2NrZWQgYmxvY2tzCi0gKgogICogQG10ZDogbXRkIGluZm8KICAqIEBvZnM6IG9mZnNldCB0byBzdGFydCB1bmxvY2sgZnJvbQogICogQGxlbjogbGVuZ3RoIHRvIHVubG9jawotICogQGludmVydDogICB3aGVuID0gMCwgdW5sb2NrIHRoZSByYW5nZSBvZiBibG9ja3Mgd2l0aGluIHRoZSBsb3dlciBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgIHVwcGVyIGJvdW5kYXJ5IGFkZHJlc3MKLSAqICAgICAgICAgICAgd2hlbiA9IDEsIHVubG9jayB0aGUgcmFuZ2Ugb2YgYmxvY2tzIG91dHNpZGUgdGhlIGJvdW5kYXJpZXMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnkgYWRkcmVzcworICogQGludmVydDogd2hlbiA9IDAsIHVubG9jayB0aGUgcmFuZ2Ugb2YgYmxvY2tzIHdpdGhpbiB0aGUgbG93ZXIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgdXBwZXIgYm91bmRhcnkgYWRkcmVzcworICogICAgICAgICAgd2hlbiA9IDEsIHVubG9jayB0aGUgcmFuZ2Ugb2YgYmxvY2tzIG91dHNpZGUgdGhlIGJvdW5kYXJpZXMKKyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5IGFkZHJlc3MKICAqCi0gKiByZXR1cm4gLSB1bmxvY2sgc3RhdHVzCisgKiBSZXR1cnMgdW5sb2NrIHN0YXR1cy4KICAqLwogc3RhdGljIGludCBfX25hbmRfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLAogCQkJCQl1aW50NjRfdCBsZW4sIGludCBpbnZlcnQpCkBAIC05MTksMTAgKzkxMSw5IEBACiAKIAkvKiBDYWxsIHdhaXQgcmVhZHkgZnVuY3Rpb24gKi8KIAlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOwotCXVkZWxheSgxMDAwKTsKIAkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KIAlpZiAoc3RhdHVzICYgMHgwMSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEVycm9yIHN0YXR1cyA9IDB4JTA4eFxuIiwKKwkJcHJfZGVidWcoIiVzOiBlcnJvciBzdGF0dXMgPSAweCUwOHhcbiIsCiAJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXQgPSAtRUlPOwogCX0KQEAgLTkzMiwxMiArOTIzLDExIEBACiAKIC8qKgogICogbmFuZF91bmxvY2sgLSBbUkVQTEFDRUFCTEVdIHVubG9ja3Mgc3BlY2lmaWVkIGxvY2tlZCBibG9ja3MKLSAqCiAgKiBAbXRkOiBtdGQgaW5mbwogICogQG9mczogb2Zmc2V0IHRvIHN0YXJ0IHVubG9jayBmcm9tCiAgKiBAbGVuOiBsZW5ndGggdG8gdW5sb2NrCiAgKgotICogcmV0dXJuIC0gdW5sb2NrIHN0YXR1cworICogUmV0dXJucyB1bmxvY2sgc3RhdHVzLgogICovCiBpbnQgbmFuZF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKQEAgLTk0NSw3ICs5MzUsNyBAQAogCWludCBjaGlwbnI7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogc3RhcnQgPSAweCUwMTJsbHgsIGxlbiA9ICVsbHVcbiIsCisJcHJfZGVidWcoIiVzOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKIAkJCV9fZnVuY19fLCAodW5zaWduZWQgbG9uZyBsb25nKW9mcywgbGVuKTsKIAogCWlmIChjaGVja19vZmZzX2xlbihtdGQsIG9mcywgbGVuKSkKQEAgLTk2NCw3ICs5NTQsNyBAQAogCiAJLyogQ2hlY2ssIGlmIGl0IGlzIHdyaXRlIHByb3RlY3RlZCAqLwogCWlmIChuYW5kX2NoZWNrX3dwKG10ZCkpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBEZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkISEhXG4iLAorCQlwcl9kZWJ1ZygiJXM6IGRldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhXG4iLAogCQkJCQlfX2Z1bmNfXyk7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0OwpAQCAtOTgxLDE4ICs5NzEsMTYgQEAKIAogLyoqCiAgKiBuYW5kX2xvY2sgLSBbUkVQTEFDRUFCTEVdIGxvY2tzIGFsbCBibG9ja3MgcHJlc2VudCBpbiB0aGUgZGV2aWNlCi0gKgogICogQG10ZDogbXRkIGluZm8KICAqIEBvZnM6IG9mZnNldCB0byBzdGFydCB1bmxvY2sgZnJvbQogICogQGxlbjogbGVuZ3RoIHRvIHVubG9jawogICoKLSAqIHJldHVybiAtIGxvY2sgc3RhdHVzCisgKiBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiBtYW55IE5BTkQgcGFydHMuICdNaWNyb24nIE5BTkQgcGFydHMgZG8KKyAqIGhhdmUgdGhpcyBmZWF0dXJlLCBidXQgaXQgYWxsb3dzIG9ubHkgdG8gbG9jayBhbGwgYmxvY2tzLCBub3QgZm9yIHNwZWNpZmllZAorICogcmFuZ2UgZm9yIGJsb2NrLiBJbXBsZW1lbnRpbmcgJ2xvY2snIGZlYXR1cmUgYnkgbWFraW5nIHVzZSBvZiAndW5sb2NrJywgZm9yCisgKiBub3cuCiAgKgotICogVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbWFueSBOQU5EIHBhcnRzLiAnTWljcm9uJyBOQU5EIHBhcnRzCi0gKiBkbyBoYXZlIHRoaXMgZmVhdHVyZSwgYnV0IGl0IGFsbG93cyBvbmx5IHRvIGxvY2sgYWxsIGJsb2Nrcywgbm90IGZvcgotICogc3BlY2lmaWVkIHJhbmdlIGZvciBibG9jay4KLSAqCi0gKiBJbXBsZW1lbnRpbmcgJ2xvY2snIGZlYXR1cmUgYnkgbWFraW5nIHVzZSBvZiAndW5sb2NrJywgZm9yIG5vdy4KKyAqIFJldHVybnMgbG9jayBzdGF0dXMuCiAgKi8KIGludCBuYW5kX2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKQEAgLTEwMDAsNyArOTg4LDcgQEAKIAlpbnQgY2hpcG5yLCBzdGF0dXMsIHBhZ2U7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogc3RhcnQgPSAweCUwMTJsbHgsIGxlbiA9ICVsbHVcbiIsCisJcHJfZGVidWcoIiVzOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKIAkJCV9fZnVuY19fLCAodW5zaWduZWQgbG9uZyBsb25nKW9mcywgbGVuKTsKIAogCWlmIChjaGVja19vZmZzX2xlbihtdGQsIG9mcywgbGVuKSkKQEAgLTEwMTUsNyArMTAwMyw3IEBACiAKIAkvKiBDaGVjaywgaWYgaXQgaXMgd3JpdGUgcHJvdGVjdGVkICovCiAJaWYgKG5hbmRfY2hlY2tfd3AobXRkKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IERldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhISFcbiIsCisJCXByX2RlYnVnKCIlczogZGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCFcbiIsCiAJCQkJCV9fZnVuY19fKTsKIAkJc3RhdHVzID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJcmV0ID0gLUVJTzsKQEAgLTEwMjgsMTAgKzEwMTYsOSBAQAogCiAJLyogQ2FsbCB3YWl0IHJlYWR5IGZ1bmN0aW9uICovCiAJc3RhdHVzID0gY2hpcC0+d2FpdGZ1bmMobXRkLCBjaGlwKTsKLQl1ZGVsYXkoMTAwMCk7CiAJLyogU2VlIGlmIGRldmljZSB0aGlua3MgaXQgc3VjY2VlZGVkICovCiAJaWYgKHN0YXR1cyAmIDB4MDEpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBFcnJvciBzdGF0dXMgPSAweCUwOHhcbiIsCisJCXByX2RlYnVnKCIlczogZXJyb3Igc3RhdHVzID0gMHglMDh4XG4iLAogCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CkBAIC0xMDQ3LDEzICsxMDM0LDEzIEBACiBFWFBPUlRfU1lNQk9MKG5hbmRfbG9jayk7CiAKIC8qKgotICogbmFuZF9yZWFkX3BhZ2VfcmF3IC0gW0ludGVybl0gcmVhZCByYXcgcGFnZSBkYXRhIHdpdGhvdXQgZWNjCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCisgKiBuYW5kX3JlYWRfcGFnZV9yYXcgLSBbSU5URVJOXSByZWFkIHJhdyBwYWdlIGRhdGEgd2l0aG91dCBlY2MKKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHJlYWQKICAqCi0gKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIGVjYyBjb250cm9sbGVycywgd2hpY2ggdXNlIGEgc3BlY2lhbCBvb2IgbGF5b3V0CisgKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIEVDQyBjb250cm9sbGVycywgd2hpY2ggdXNlIGEgc3BlY2lhbCBvb2IgbGF5b3V0LgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCSAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCkBAIC0xMDY0LDExICsxMDUxLDExIEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX3BhZ2VfcmF3X3N5bmRyb21lIC0gW0ludGVybl0gcmVhZCByYXcgcGFnZSBkYXRhIHdpdGhvdXQgZWNjCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCisgKiBuYW5kX3JlYWRfcGFnZV9yYXdfc3luZHJvbWUgLSBbSU5URVJOXSByZWFkIHJhdyBwYWdlIGRhdGEgd2l0aG91dCBlY2MKKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHJlYWQKICAqCiAgKiBXZSBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0IGFuZCBoYW5kbGluZyBldmVuIHdoZW4gT09CIGlzbid0IHVzZWQuCiAgKi8KQEAgLTExMDcsMTEgKzEwOTQsMTEgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3JlYWRfcGFnZV9zd2VjYyAtIFtSRVBMQUNBQkxFXSBzb2Z0d2FyZSBlY2MgYmFzZWQgcGFnZSByZWFkIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCisgKiBuYW5kX3JlYWRfcGFnZV9zd2VjYyAtIFtSRVBMQUNFQUJMRV0gc29mdHdhcmUgRUNDIGJhc2VkIHBhZ2UgcmVhZCBmdW5jdGlvbgorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlX3N3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCXVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCkBAIC0xMTQ4LDEyICsxMTM1LDEyIEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX3N1YnBhZ2UgLSBbUkVQTEFDQUJMRV0gc29mdHdhcmUgZWNjIGJhc2VkIHN1Yi1wYWdlIHJlYWQgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGRhdGFfb2ZmczoJb2Zmc2V0IG9mIHJlcXVlc3RlZCBkYXRhIHdpdGhpbiB0aGUgcGFnZQotICogQHJlYWRsZW46CWRhdGEgbGVuZ3RoCi0gKiBAYnVmcG9pOglidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBuYW5kX3JlYWRfc3VicGFnZSAtIFtSRVBMQUNFQUJMRV0gc29mdHdhcmUgRUNDIGJhc2VkIHN1Yi1wYWdlIHJlYWQgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGRhdGFfb2Zmczogb2Zmc2V0IG9mIHJlcXVlc3RlZCBkYXRhIHdpdGhpbiB0aGUgcGFnZQorICogQHJlYWRsZW46IGRhdGEgbGVuZ3RoCisgKiBAYnVmcG9pOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3N1YnBhZ2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQl1aW50MzJfdCBkYXRhX29mZnMsIHVpbnQzMl90IHJlYWRsZW4sIHVpbnQ4X3QgKmJ1ZnBvaSkKQEAgLTExNjYsMTIgKzExNTMsMTIgQEAKIAlpbnQgYnVzdyA9IChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgPyAyIDogMTsKIAlpbnQgaW5kZXggPSAwOwogCi0JLyogQ29sdW1uIGFkZHJlc3Mgd2loaW4gdGhlIHBhZ2UgYWxpZ25lZCB0byBFQ0Mgc2l6ZSAoMjU2Ynl0ZXMpLiAqLworCS8qIENvbHVtbiBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBhbGlnbmVkIHRvIEVDQyBzaXplICgyNTZieXRlcykgKi8KIAlzdGFydF9zdGVwID0gZGF0YV9vZmZzIC8gY2hpcC0+ZWNjLnNpemU7CiAJZW5kX3N0ZXAgPSAoZGF0YV9vZmZzICsgcmVhZGxlbiAtIDEpIC8gY2hpcC0+ZWNjLnNpemU7CiAJbnVtX3N0ZXBzID0gZW5kX3N0ZXAgLSBzdGFydF9zdGVwICsgMTsKIAotCS8qIERhdGEgc2l6ZSBhbGlnbmVkIHRvIEVDQyBlY2Muc2l6ZSovCisJLyogRGF0YSBzaXplIGFsaWduZWQgdG8gRUNDIGVjYy5zaXplICovCiAJZGF0YWZyYWdfbGVuID0gbnVtX3N0ZXBzICogY2hpcC0+ZWNjLnNpemU7CiAJZWNjZnJhZ19sZW4gPSBudW1fc3RlcHMgKiBjaGlwLT5lY2MuYnl0ZXM7CiAKQEAgLTExODMsMTMgKzExNzAsMTQgQEAKIAlwID0gYnVmcG9pICsgZGF0YV9jb2xfYWRkcjsKIAljaGlwLT5yZWFkX2J1ZihtdGQsIHAsIGRhdGFmcmFnX2xlbik7CiAKLQkvKiBDYWxjdWxhdGUgIEVDQyAqLworCS8qIENhbGN1bGF0ZSBFQ0MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZWNjZnJhZ19sZW4gOyBpICs9IGNoaXAtPmVjYy5ieXRlcywgcCArPSBjaGlwLT5lY2Muc2l6ZSkKIAkJY2hpcC0+ZWNjLmNhbGN1bGF0ZShtdGQsIHAsICZjaGlwLT5idWZmZXJzLT5lY2NjYWxjW2ldKTsKIAotCS8qIFRoZSBwZXJmb3JtYW5jZSBpcyBmYXN0ZXIgaWYgdG8gcG9zaXRpb24gb2Zmc2V0cwotCSAgIGFjY29yZGluZyB0byBlY2MucG9zLiBMZXQgbWFrZSBzdXJlIGhlcmUgdGhhdAotCSAgIHRoZXJlIGFyZSBubyBnYXBzIGluIGVjYyBwb3NpdGlvbnMgKi8KKwkvKgorCSAqIFRoZSBwZXJmb3JtYW5jZSBpcyBmYXN0ZXIgaWYgd2UgcG9zaXRpb24gb2Zmc2V0cyBhY2NvcmRpbmcgdG8KKwkgKiBlY2MucG9zLiBMZXQncyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZ2FwcyBpbiBFQ0MgcG9zaXRpb25zLgorCSAqLwogCWZvciAoaSA9IDA7IGkgPCBlY2NmcmFnX2xlbiAtIDE7IGkrKykgewogCQlpZiAoZWNjcG9zW2kgKyBzdGFydF9zdGVwICogY2hpcC0+ZWNjLmJ5dGVzXSArIDEgIT0KIAkJCWVjY3Bvc1tpICsgc3RhcnRfc3RlcCAqIGNoaXAtPmVjYy5ieXRlcyArIDFdKSB7CkBAIC0xMjAxLDggKzExODksMTAgQEAKIAkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JORE9VVCwgbXRkLT53cml0ZXNpemUsIC0xKTsKIAkJY2hpcC0+cmVhZF9idWYobXRkLCBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUpOwogCX0gZWxzZSB7Ci0JCS8qIHNlbmQgdGhlIGNvbW1hbmQgdG8gcmVhZCB0aGUgcGFydGljdWxhciBlY2MgYnl0ZXMgKi8KLQkJLyogdGFrZSBjYXJlIGFib3V0IGJ1c3dpZHRoIGFsaWdubWVudCBpbiByZWFkX2J1ZiAqLworCQkvKgorCQkgKiBTZW5kIHRoZSBjb21tYW5kIHRvIHJlYWQgdGhlIHBhcnRpY3VsYXIgRUNDIGJ5dGVzIHRha2UgY2FyZQorCQkgKiBhYm91dCBidXN3aWR0aCBhbGlnbm1lbnQgaW4gcmVhZF9idWYuCisJCSAqLwogCQlpbmRleCA9IHN0YXJ0X3N0ZXAgKiBjaGlwLT5lY2MuYnl0ZXM7CiAKIAkJYWxpZ25lZF9wb3MgPSBlY2Nwb3NbaW5kZXhdICYgfihidXN3IC0gMSk7CkBAIC0xMjM1LDEzICsxMjI1LDEzIEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX3BhZ2VfaHdlY2MgLSBbUkVQTEFDQUJMRV0gaGFyZHdhcmUgZWNjIGJhc2VkIHBhZ2UgcmVhZCBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAYnVmOglidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCi0gKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gcmVhZAorICogbmFuZF9yZWFkX3BhZ2VfaHdlY2MgLSBbUkVQTEFDRUFCTEVdIGhhcmR3YXJlIEVDQyBiYXNlZCBwYWdlIHJlYWQgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHJlYWQKICAqCi0gKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIGVjYyBjb250cm9sbGVycyB3aGljaCBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0CisgKiBOb3QgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW5nIEVDQyBjb250cm9sbGVycyB3aGljaCBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0LgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCXVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCkBAIC0xMjgwLDE4ICsxMjcwLDE3IEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0IC0gW1JFUExBQ0FCTEVdIGh3IGVjYywgcmVhZCBvb2IgZmlyc3QKLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIG5hbmRfcmVhZF9wYWdlX2h3ZWNjX29vYl9maXJzdCAtIFtSRVBMQUNFQUJMRV0gaHcgZWNjLCByZWFkIG9vYiBmaXJzdAorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICoKLSAqIEhhcmR3YXJlIEVDQyBmb3IgbGFyZ2UgcGFnZSBjaGlwcywgcmVxdWlyZSBPT0IgdG8gYmUgcmVhZCBmaXJzdC4KLSAqIEZvciB0aGlzIEVDQyBtb2RlLCB0aGUgd3JpdGVfcGFnZSBtZXRob2QgaXMgcmUtdXNlZCBmcm9tIEVDQ19IVy4KLSAqIFRoZXNlIG1ldGhvZHMgcmVhZC93cml0ZSBFQ0MgZnJvbSB0aGUgT09CIGFyZWEsIHVubGlrZSB0aGUKLSAqIEVDQ19IV19TWU5EUk9NRSBzdXBwb3J0IHdpdGggbXVsdGlwbGUgRUNDIHN0ZXBzLCBmb2xsb3dzIHRoZQotICogImluZml4IEVDQyIgc2NoZW1lIGFuZCByZWFkcy93cml0ZXMgRUNDIGZyb20gdGhlIGRhdGEgYXJlYSwgYnkKLSAqIG92ZXJ3cml0aW5nIHRoZSBOQU5EIG1hbnVmYWN0dXJlciBiYWQgYmxvY2sgbWFya2luZ3MuCisgKiBIYXJkd2FyZSBFQ0MgZm9yIGxhcmdlIHBhZ2UgY2hpcHMsIHJlcXVpcmUgT09CIHRvIGJlIHJlYWQgZmlyc3QuIEZvciB0aGlzCisgKiBFQ0MgbW9kZSwgdGhlIHdyaXRlX3BhZ2UgbWV0aG9kIGlzIHJlLXVzZWQgZnJvbSBFQ0NfSFcuIFRoZXNlIG1ldGhvZHMKKyAqIHJlYWQvd3JpdGUgRUNDIGZyb20gdGhlIE9PQiBhcmVhLCB1bmxpa2UgdGhlIEVDQ19IV19TWU5EUk9NRSBzdXBwb3J0IHdpdGgKKyAqIG11bHRpcGxlIEVDQyBzdGVwcywgZm9sbG93cyB0aGUgImluZml4IEVDQyIgc2NoZW1lIGFuZCByZWFkcy93cml0ZXMgRUNDIGZyb20KKyAqIHRoZSBkYXRhIGFyZWEsIGJ5IG92ZXJ3cml0aW5nIHRoZSBOQU5EIG1hbnVmYWN0dXJlciBiYWQgYmxvY2sgbWFya2luZ3MuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCkBAIC0xMzI5LDE0ICsxMzE4LDE0IEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX3BhZ2Vfc3luZHJvbWUgLSBbUkVQTEFDQUJMRV0gaGFyZHdhcmUgZWNjIHN5bmRyb20gYmFzZWQgcGFnZSByZWFkCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWJ1ZmZlciB0byBzdG9yZSByZWFkIGRhdGEKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCisgKiBuYW5kX3JlYWRfcGFnZV9zeW5kcm9tZSAtIFtSRVBMQUNFQUJMRV0gaGFyZHdhcmUgRUNDIHN5bmRyb21lIGJhc2VkIHBhZ2UgcmVhZAorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAogICoKLSAqIFRoZSBodyBnZW5lcmF0b3IgY2FsY3VsYXRlcyB0aGUgZXJyb3Igc3luZHJvbWUgYXV0b21hdGljYWxseS4gVGhlcmVmb3IKLSAqIHdlIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQgYW5kIGhhbmRsaW5nLgorICogVGhlIGh3IGdlbmVyYXRvciBjYWxjdWxhdGVzIHRoZSBlcnJvciBzeW5kcm9tZSBhdXRvbWF0aWNhbGx5LiBUaGVyZWZvcmUgd2UKKyAqIG5lZWQgYSBzcGVjaWFsIG9vYiBsYXlvdXQgYW5kIGhhbmRsaW5nLgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlX3N5bmRyb21lKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCSAgIHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UpCkBAIC0xMzg0LDI5ICsxMzczLDI5IEBACiB9CiAKIC8qKgotICogbmFuZF90cmFuc2Zlcl9vb2IgLSBbSW50ZXJuYWxdIFRyYW5zZmVyIG9vYiB0byBjbGllbnQgYnVmZmVyCi0gKiBAY2hpcDoJbmFuZCBjaGlwIHN0cnVjdHVyZQotICogQG9vYjoJb29iIGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqIEBvcHM6CW9vYiBvcHMgc3RydWN0dXJlCi0gKiBAbGVuOglzaXplIG9mIG9vYiB0byB0cmFuc2ZlcgorICogbmFuZF90cmFuc2Zlcl9vb2IgLSBbSU5URVJOXSBUcmFuc2ZlciBvb2IgdG8gY2xpZW50IGJ1ZmZlcgorICogQGNoaXA6IG5hbmQgY2hpcCBzdHJ1Y3R1cmUKKyAqIEBvb2I6IG9vYiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAb3BzOiBvb2Igb3BzIHN0cnVjdHVyZQorICogQGxlbjogc2l6ZSBvZiBvb2IgdG8gdHJhbnNmZXIKICAqLwogc3RhdGljIHVpbnQ4X3QgKm5hbmRfdHJhbnNmZXJfb29iKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVpbnQ4X3QgKm9vYiwKIAkJCQkgIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzLCBzaXplX3QgbGVuKQogewogCXN3aXRjaCAob3BzLT5tb2RlKSB7CiAKLQljYXNlIE1URF9PT0JfUExBQ0U6Ci0JY2FzZSBNVERfT09CX1JBVzoKKwljYXNlIE1URF9PUFNfUExBQ0VfT09COgorCWNhc2UgTVREX09QU19SQVc6CiAJCW1lbWNweShvb2IsIGNoaXAtPm9vYl9wb2kgKyBvcHMtPm9vYm9mZnMsIGxlbik7CiAJCXJldHVybiBvb2IgKyBsZW47CiAKLQljYXNlIE1URF9PT0JfQVVUTzogeworCWNhc2UgTVREX09QU19BVVRPX09PQjogewogCQlzdHJ1Y3QgbmFuZF9vb2JmcmVlICpmcmVlID0gY2hpcC0+ZWNjLmxheW91dC0+b29iZnJlZTsKIAkJdWludDMyX3QgYm9mZnMgPSAwLCByb2ZmcyA9IG9wcy0+b29ib2ZmczsKIAkJc2l6ZV90IGJ5dGVzID0gMDsKIAogCQlmb3IgKDsgZnJlZS0+bGVuZ3RoICYmIGxlbjsgZnJlZSsrLCBsZW4gLT0gYnl0ZXMpIHsKLQkJCS8qIFJlYWQgcmVxdWVzdCBub3QgZnJvbSBvZmZzZXQgMCA/ICovCisJCQkvKiBSZWFkIHJlcXVlc3Qgbm90IGZyb20gb2Zmc2V0IDA/ICovCiAJCQlpZiAodW5saWtlbHkocm9mZnMpKSB7CiAJCQkJaWYgKHJvZmZzID49IGZyZWUtPmxlbmd0aCkgewogCQkJCQlyb2ZmcyAtPSBmcmVlLT5sZW5ndGg7CkBAIC0xNDMyLDExICsxNDIxLDEwIEBACiB9CiAKIC8qKgotICogbmFuZF9kb19yZWFkX29wcyAtIFtJbnRlcm5hbF0gUmVhZCBkYXRhIHdpdGggRUNDCi0gKgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCi0gKiBAb3BzOglvb2Igb3BzIHN0cnVjdHVyZQorICogbmFuZF9kb19yZWFkX29wcyAtIFtJTlRFUk5dIFJlYWQgZGF0YSB3aXRoIEVDQworICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmcm9tOiBvZmZzZXQgdG8gcmVhZCBmcm9tCisgKiBAb3BzOiBvb2Igb3BzIHN0cnVjdHVyZQogICoKICAqIEludGVybmFsIGZ1bmN0aW9uLiBDYWxsZWQgd2l0aCBjaGlwIGhlbGQuCiAgKi8KQEAgLTE0NTEsNyArMTQzOSw3IEBACiAJaW50IHJldCA9IDA7CiAJdWludDMyX3QgcmVhZGxlbiA9IG9wcy0+bGVuOwogCXVpbnQzMl90IG9vYnJlYWRsZW4gPSBvcHMtPm9vYmxlbjsKLQl1aW50MzJfdCBtYXhfb29ic2l6ZSA9IG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8gPworCXVpbnQzMl90IG1heF9vb2JzaXplID0gb3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IgPwogCQltdGQtPm9vYmF2YWlsIDogbXRkLT5vb2JzaXplOwogCiAJdWludDhfdCAqYnVmcG9pLCAqb29iLCAqYnVmOwpAQCAtMTQ3Myw3ICsxNDYxLDcgQEAKIAkJYnl0ZXMgPSBtaW4obXRkLT53cml0ZXNpemUgLSBjb2wsIHJlYWRsZW4pOwogCQlhbGlnbmVkID0gKGJ5dGVzID09IG10ZC0+d3JpdGVzaXplKTsKIAotCQkvKiBJcyB0aGUgY3VycmVudCBwYWdlIGluIHRoZSBidWZmZXIgPyAqLworCQkvKiBJcyB0aGUgY3VycmVudCBwYWdlIGluIHRoZSBidWZmZXI/ICovCiAJCWlmIChyZWFscGFnZSAhPSBjaGlwLT5wYWdlYnVmIHx8IG9vYikgewogCQkJYnVmcG9pID0gYWxpZ25lZCA/IGJ1ZiA6IGNoaXAtPmJ1ZmZlcnMtPmRhdGFidWY7CiAKQEAgLTE0ODMsNyArMTQ3MSw3IEBACiAJCQl9CiAKIAkJCS8qIE5vdyByZWFkIHRoZSBwYWdlIGludG8gdGhlIGJ1ZmZlciAqLwotCQkJaWYgKHVubGlrZWx5KG9wcy0+bW9kZSA9PSBNVERfT09CX1JBVykpCisJCQlpZiAodW5saWtlbHkob3BzLT5tb2RlID09IE1URF9PUFNfUkFXKSkKIAkJCQlyZXQgPSBjaGlwLT5lY2MucmVhZF9wYWdlX3JhdyhtdGQsIGNoaXAsCiAJCQkJCQkJICAgICAgYnVmcG9pLCBwYWdlKTsKIAkJCWVsc2UgaWYgKCFhbGlnbmVkICYmIE5BTkRfU1VCUEFHRV9SRUFEKGNoaXApICYmICFvb2IpCkBAIC0xNDkyLDE0ICsxNDgwLDIyIEBACiAJCQllbHNlCiAJCQkJcmV0ID0gY2hpcC0+ZWNjLnJlYWRfcGFnZShtdGQsIGNoaXAsIGJ1ZnBvaSwKIAkJCQkJCQkgIHBhZ2UpOwotCQkJaWYgKHJldCA8IDApCisJCQlpZiAocmV0IDwgMCkgeworCQkJCWlmICghYWxpZ25lZCkKKwkJCQkJLyogSW52YWxpZGF0ZSBwYWdlIGNhY2hlICovCisJCQkJCWNoaXAtPnBhZ2VidWYgPSAtMTsKIAkJCQlicmVhazsKKwkJCX0KIAogCQkJLyogVHJhbnNmZXIgbm90IGFsaWduZWQgZGF0YSAqLwogCQkJaWYgKCFhbGlnbmVkKSB7CiAJCQkJaWYgKCFOQU5EX1NVQlBBR0VfUkVBRChjaGlwKSAmJiAhb29iICYmCi0JCQkJICAgICEobXRkLT5lY2Nfc3RhdHMuZmFpbGVkIC0gc3RhdHMuZmFpbGVkKSkKKwkJCQkgICAgIShtdGQtPmVjY19zdGF0cy5mYWlsZWQgLSBzdGF0cy5mYWlsZWQpICYmCisJCQkJICAgIChvcHMtPm1vZGUgIT0gTVREX09QU19SQVcpKQogCQkJCQljaGlwLT5wYWdlYnVmID0gcmVhbHBhZ2U7CisJCQkJZWxzZQorCQkJCQkvKiBJbnZhbGlkYXRlIHBhZ2UgY2FjaGUgKi8KKwkJCQkJY2hpcC0+cGFnZWJ1ZiA9IC0xOwogCQkJCW1lbWNweShidWYsIGNoaXAtPmJ1ZmZlcnMtPmRhdGFidWYgKyBjb2wsIGJ5dGVzKTsKIAkJCX0KIApAQCAtMTUzOSw3ICsxNTM1LDcgQEAKIAkJaWYgKCFyZWFkbGVuKQogCQkJYnJlYWs7CiAKLQkJLyogRm9yIHN1YnNlcXVlbnQgcmVhZHMgYWxpZ24gdG8gcGFnZSBib3VuZGFyeS4gKi8KKwkJLyogRm9yIHN1YnNlcXVlbnQgcmVhZHMgYWxpZ24gdG8gcGFnZSBib3VuZGFyeSAqLwogCQljb2wgPSAwOwogCQkvKiBJbmNyZW1lbnQgcGFnZSBhZGRyZXNzICovCiAJCXJlYWxwYWdlKys7CkBAIC0xNTUyLDggKzE1NDgsOSBAQAogCQkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOwogCQl9CiAKLQkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQKLQkJICogb3IgaWYgd2UgaGF2ZSBoaXQgYSBibG9jayBib3VuZGFyeS4KKwkJLyoKKwkJICogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQgb3IgaWYgd2UKKwkJICogaGF2ZSBoaXQgYSBibG9jayBib3VuZGFyeS4KIAkJICovCiAJCWlmICghTkFORF9DQU5BVVRPSU5DUihjaGlwKSB8fCAhKHBhZ2UgJiBibGtjaGVjaykpCiAJCQlzbmRjbWQgPSAxOwpAQCAtMTU3NCwxOCArMTU3MSwxOSBAQAogCiAvKioKICAqIG5hbmRfcmVhZCAtIFtNVEQgSW50ZXJmYWNlXSBNVEQgY29tcGF0aWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9kb19yZWFkX2VjYwotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMKLSAqIEBidWY6CXRoZSBkYXRhYnVmZmVyIHRvIHB1dCBkYXRhCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206IG9mZnNldCB0byByZWFkIGZyb20KKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0bGVuOiBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcworICogQGJ1ZjogdGhlIGRhdGFidWZmZXIgdG8gcHV0IGRhdGEKICAqCi0gKiBHZXQgaG9sZCBvZiB0aGUgY2hpcCBhbmQgY2FsbCBuYW5kX2RvX3JlYWQKKyAqIEdldCBob2xkIG9mIHRoZSBjaGlwIGFuZCBjYWxsIG5hbmRfZG9fcmVhZC4KICAqLwogc3RhdGljIGludCBuYW5kX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAogCQkgICAgIHNpemVfdCAqcmV0bGVuLCB1aW50OF90ICpidWYpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXQ7CiAKIAkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCkBAIC0xNTk2LDEzICsxNTk0LDE0IEBACiAKIAluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9SRUFESU5HKTsKIAotCWNoaXAtPm9wcy5sZW4gPSBsZW47Ci0JY2hpcC0+b3BzLmRhdGJ1ZiA9IGJ1ZjsKLQljaGlwLT5vcHMub29iYnVmID0gTlVMTDsKKwlvcHMubGVuID0gbGVuOworCW9wcy5kYXRidWYgPSBidWY7CisJb3BzLm9vYmJ1ZiA9IE5VTEw7CisJb3BzLm1vZGUgPSAwOwogCi0JcmV0ID0gbmFuZF9kb19yZWFkX29wcyhtdGQsIGZyb20sICZjaGlwLT5vcHMpOworCXJldCA9IG5hbmRfZG9fcmVhZF9vcHMobXRkLCBmcm9tLCAmb3BzKTsKIAotCSpyZXRsZW4gPSBjaGlwLT5vcHMucmV0bGVuOworCSpyZXRsZW4gPSBvcHMucmV0bGVuOwogCiAJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCkBAIC0xNjEwLDExICsxNjA5LDExIEBACiB9CiAKIC8qKgotICogbmFuZF9yZWFkX29vYl9zdGQgLSBbUkVQTEFDQUJMRV0gdGhlIG1vc3QgY29tbW9uIE9PQiBkYXRhIHJlYWQgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQHBhZ2U6CXBhZ2UgbnVtYmVyIHRvIHJlYWQKLSAqIEBzbmRjbWQ6CWZsYWcgd2hldGhlciB0byBpc3N1ZSByZWFkIGNvbW1hbmQgb3Igbm90CisgKiBuYW5kX3JlYWRfb29iX3N0ZCAtIFtSRVBMQUNFQUJMRV0gdGhlIG1vc3QgY29tbW9uIE9PQiBkYXRhIHJlYWQgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHJlYWQKKyAqIEBzbmRjbWQ6IGZsYWcgd2hldGhlciB0byBpc3N1ZSByZWFkIGNvbW1hbmQgb3Igbm90CiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9yZWFkX29vYl9zdGQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCiAJCQkgICAgIGludCBwYWdlLCBpbnQgc25kY21kKQpAQCAtMTYyOCwxMiArMTYyNywxMiBAQAogfQogCiAvKioKLSAqIG5hbmRfcmVhZF9vb2Jfc3luZHJvbWUgLSBbUkVQTEFDQUJMRV0gT09CIGRhdGEgcmVhZCBmdW5jdGlvbiBmb3IgSFcgRUNDCisgKiBuYW5kX3JlYWRfb29iX3N5bmRyb21lIC0gW1JFUExBQ0VBQkxFXSBPT0IgZGF0YSByZWFkIGZ1bmN0aW9uIGZvciBIVyBFQ0MKICAqCQkJICAgIHdpdGggc3luZHJvbWVzCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byByZWFkCi0gKiBAc25kY21kOglmbGFnIHdoZXRoZXIgdG8gaXNzdWUgcmVhZCBjb21tYW5kIG9yIG5vdAorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gcmVhZAorICogQHNuZGNtZDogZmxhZyB3aGV0aGVyIHRvIGlzc3VlIHJlYWQgY29tbWFuZCBvciBub3QKICAqLwogc3RhdGljIGludCBuYW5kX3JlYWRfb29iX3N5bmRyb21lKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCSAgaW50IHBhZ2UsIGludCBzbmRjbWQpCkBAIC0xNjY3LDEwICsxNjY2LDEwIEBACiB9CiAKIC8qKgotICogbmFuZF93cml0ZV9vb2Jfc3RkIC0gW1JFUExBQ0FCTEVdIHRoZSBtb3N0IGNvbW1vbiBPT0IgZGF0YSB3cml0ZSBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gd3JpdGUKKyAqIG5hbmRfd3JpdGVfb29iX3N0ZCAtIFtSRVBMQUNFQUJMRV0gdGhlIG1vc3QgY29tbW9uIE9PQiBkYXRhIHdyaXRlIGZ1bmN0aW9uCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBwYWdlOiBwYWdlIG51bWJlciB0byB3cml0ZQogICovCiBzdGF0aWMgaW50IG5hbmRfd3JpdGVfb29iX3N0ZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCSAgICAgIGludCBwYWdlKQpAQCAtMTY5MCwxMSArMTY4OSwxMSBAQAogfQogCiAvKioKLSAqIG5hbmRfd3JpdGVfb29iX3N5bmRyb21lIC0gW1JFUExBQ0FCTEVdIE9PQiBkYXRhIHdyaXRlIGZ1bmN0aW9uIGZvciBIVyBFQ0MKLSAqCQkJICAgICB3aXRoIHN5bmRyb21lIC0gb25seSBmb3IgbGFyZ2UgcGFnZSBmbGFzaCAhCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBwYWdlOglwYWdlIG51bWJlciB0byB3cml0ZQorICogbmFuZF93cml0ZV9vb2Jfc3luZHJvbWUgLSBbUkVQTEFDRUFCTEVdIE9PQiBkYXRhIHdyaXRlIGZ1bmN0aW9uIGZvciBIVyBFQ0MKKyAqCQkJICAgICB3aXRoIHN5bmRyb21lIC0gb25seSBmb3IgbGFyZ2UgcGFnZSBmbGFzaAorICogQG10ZDogbXRkIGluZm8gc3RydWN0dXJlCisgKiBAY2hpcDogbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAcGFnZTogcGFnZSBudW1iZXIgdG8gd3JpdGUKICAqLwogc3RhdGljIGludCBuYW5kX3dyaXRlX29vYl9zeW5kcm9tZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKIAkJCQkgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKQEAgLTE3NDksMzQgKzE3NDgsMzcgQEAKIH0KIAogLyoqCi0gKiBuYW5kX2RvX3JlYWRfb29iIC0gW0ludGVybl0gTkFORCByZWFkIG91dC1vZi1iYW5kCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KLSAqIEBvcHM6CW9vYiBvcGVyYXRpb25zIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICogbmFuZF9kb19yZWFkX29vYiAtIFtJTlRFUk5dIE5BTkQgcmVhZCBvdXQtb2YtYmFuZAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmcm9tOiBvZmZzZXQgdG8gcmVhZCBmcm9tCisgKiBAb3BzOiBvb2Igb3BlcmF0aW9ucyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKICAqCi0gKiBOQU5EIHJlYWQgb3V0LW9mLWJhbmQgZGF0YSBmcm9tIHRoZSBzcGFyZSBhcmVhCisgKiBOQU5EIHJlYWQgb3V0LW9mLWJhbmQgZGF0YSBmcm9tIHRoZSBzcGFyZSBhcmVhLgogICovCiBzdGF0aWMgaW50IG5hbmRfZG9fcmVhZF9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLAogCQkJICAgIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQogewogCWludCBwYWdlLCByZWFscGFnZSwgY2hpcG5yLCBzbmRjbWQgPSAxOwogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IG10ZF9lY2Nfc3RhdHMgc3RhdHM7CiAJaW50IGJsa2NoZWNrID0gKDEgPDwgKGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQgLSBjaGlwLT5wYWdlX3NoaWZ0KSkgLSAxOwogCWludCByZWFkbGVuID0gb3BzLT5vb2JsZW47CiAJaW50IGxlbjsKIAl1aW50OF90ICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogZnJvbSA9IDB4JTA4THgsIGxlbiA9ICVpXG4iLAorCXByX2RlYnVnKCIlczogZnJvbSA9IDB4JTA4THgsIGxlbiA9ICVpXG4iLAogCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpZnJvbSwgcmVhZGxlbik7CiAKLQlpZiAob3BzLT5tb2RlID09IE1URF9PT0JfQVVUTykKKwlzdGF0cyA9IG10ZC0+ZWNjX3N0YXRzOworCisJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQlsZW4gPSBjaGlwLT5lY2MubGF5b3V0LT5vb2JhdmFpbDsKIAllbHNlCiAJCWxlbiA9IG10ZC0+b29ic2l6ZTsKIAogCWlmICh1bmxpa2VseShvcHMtPm9vYm9mZnMgPj0gbGVuKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEF0dGVtcHQgdG8gc3RhcnQgcmVhZCAiCi0JCQkJCSJvdXRzaWRlIG9vYlxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGF0dGVtcHQgdG8gc3RhcnQgcmVhZCBvdXRzaWRlIG9vYlxuIiwKKwkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTc4NCw4ICsxNzg2LDggQEAKIAlpZiAodW5saWtlbHkoZnJvbSA+PSBtdGQtPnNpemUgfHwKIAkJICAgICBvcHMtPm9vYm9mZnMgKyByZWFkbGVuID4gKChtdGQtPnNpemUgPj4gY2hpcC0+cGFnZV9zaGlmdCkgLQogCQkJCQkoZnJvbSA+PiBjaGlwLT5wYWdlX3NoaWZ0KSkgKiBsZW4pKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCByZWFkIGJleW9uZCBlbmQgIgotCQkJCQkib2YgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byByZWFkIGJleW9uZCBlbmQgb2YgZGV2aWNlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzk3LDcgKzE3OTksMTAgQEAKIAlwYWdlID0gcmVhbHBhZ2UgJiBjaGlwLT5wYWdlbWFzazsKIAogCXdoaWxlICgxKSB7Ci0JCXNuZGNtZCA9IGNoaXAtPmVjYy5yZWFkX29vYihtdGQsIGNoaXAsIHBhZ2UsIHNuZGNtZCk7CisJCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19SQVcpCisJCQlzbmRjbWQgPSBjaGlwLT5lY2MucmVhZF9vb2JfcmF3KG10ZCwgY2hpcCwgcGFnZSwgc25kY21kKTsKKwkJZWxzZQorCQkJc25kY21kID0gY2hpcC0+ZWNjLnJlYWRfb29iKG10ZCwgY2hpcCwgcGFnZSwgc25kY21kKTsKIAogCQlsZW4gPSBtaW4obGVuLCByZWFkbGVuKTsKIAkJYnVmID0gbmFuZF90cmFuc2Zlcl9vb2IoY2hpcCwgYnVmLCBvcHMsIGxlbik7CkBAIC0xODMwLDI0ICsxODM1LDI5IEBACiAJCQljaGlwLT5zZWxlY3RfY2hpcChtdGQsIGNoaXBucik7CiAJCX0KIAotCQkvKiBDaGVjaywgaWYgdGhlIGNoaXAgc3VwcG9ydHMgYXV0byBwYWdlIGluY3JlbWVudAotCQkgKiBvciBpZiB3ZSBoYXZlIGhpdCBhIGJsb2NrIGJvdW5kYXJ5LgorCQkvKgorCQkgKiBDaGVjaywgaWYgdGhlIGNoaXAgc3VwcG9ydHMgYXV0byBwYWdlIGluY3JlbWVudCBvciBpZiB3ZQorCQkgKiBoYXZlIGhpdCBhIGJsb2NrIGJvdW5kYXJ5LgogCQkgKi8KIAkJaWYgKCFOQU5EX0NBTkFVVE9JTkNSKGNoaXApIHx8ICEocGFnZSAmIGJsa2NoZWNrKSkKIAkJCXNuZGNtZCA9IDE7CiAJfQogCiAJb3BzLT5vb2JyZXRsZW4gPSBvcHMtPm9vYmxlbjsKLQlyZXR1cm4gMDsKKworCWlmIChtdGQtPmVjY19zdGF0cy5mYWlsZWQgLSBzdGF0cy5mYWlsZWQpCisJCXJldHVybiAtRUJBRE1TRzsKKworCXJldHVybiAgbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkIC0gc3RhdHMuY29ycmVjdGVkID8gLUVVQ0xFQU4gOiAwOwogfQogCiAvKioKICAqIG5hbmRfcmVhZF9vb2IgLSBbTVREIEludGVyZmFjZV0gTkFORCByZWFkIGRhdGEgYW5kL29yIG91dC1vZi1iYW5kCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGZyb206CW9mZnNldCB0byByZWFkIGZyb20KLSAqIEBvcHM6CW9vYiBvcGVyYXRpb24gZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGZyb206IG9mZnNldCB0byByZWFkIGZyb20KKyAqIEBvcHM6IG9vYiBvcGVyYXRpb24gZGVzY3JpcHRpb24gc3RydWN0dXJlCiAgKgotICogTkFORCByZWFkIGRhdGEgYW5kL29yIG91dC1vZi1iYW5kIGRhdGEKKyAqIE5BTkQgcmVhZCBkYXRhIGFuZC9vciBvdXQtb2YtYmFuZCBkYXRhLgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLAogCQkJIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQpAQCAtMTg1OSwxNyArMTg2OSwxNyBAQAogCiAJLyogRG8gbm90IGFsbG93IHJlYWRzIHBhc3QgZW5kIG9mIGRldmljZSAqLwogCWlmIChvcHMtPmRhdGJ1ZiAmJiAoZnJvbSArIG9wcy0+bGVuKSA+IG10ZC0+c2l6ZSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEF0dGVtcHQgcmVhZCAiCi0JCQkJImJleW9uZCBlbmQgb2YgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byByZWFkIGJleW9uZCBlbmQgb2YgZGV2aWNlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbmFuZF9nZXRfZGV2aWNlKGNoaXAsIG10ZCwgRkxfUkVBRElORyk7CiAKIAlzd2l0Y2ggKG9wcy0+bW9kZSkgewotCWNhc2UgTVREX09PQl9QTEFDRToKLQljYXNlIE1URF9PT0JfQVVUTzoKLQljYXNlIE1URF9PT0JfUkFXOgorCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJY2FzZSBNVERfT1BTX0FVVE9fT09COgorCWNhc2UgTVREX09QU19SQVc6CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTE4ODgsMTIgKzE4OTgsMTIgQEAKIAogCiAvKioKLSAqIG5hbmRfd3JpdGVfcGFnZV9yYXcgLSBbSW50ZXJuXSByYXcgcGFnZSB3cml0ZSBmdW5jdGlvbgotICogQG10ZDoJbXRkIGluZm8gc3RydWN0dXJlCi0gKiBAY2hpcDoJbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCi0gKiBAYnVmOglkYXRhIGJ1ZmZlcgorICogbmFuZF93cml0ZV9wYWdlX3JhdyAtIFtJTlRFUk5dIHJhdyBwYWdlIHdyaXRlIGZ1bmN0aW9uCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGRhdGEgYnVmZmVyCiAgKgotICogTm90IGZvciBzeW5kcm9tZSBjYWxjdWxhdGluZyBlY2MgY29udHJvbGxlcnMsIHdoaWNoIHVzZSBhIHNwZWNpYWwgb29iIGxheW91dAorICogTm90IGZvciBzeW5kcm9tZSBjYWxjdWxhdGluZyBFQ0MgY29udHJvbGxlcnMsIHdoaWNoIHVzZSBhIHNwZWNpYWwgb29iIGxheW91dC4KICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9wYWdlX3JhdyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCQljb25zdCB1aW50OF90ICpidWYpCkBAIC0xOTAzLDEwICsxOTEzLDEwIEBACiB9CiAKIC8qKgotICogbmFuZF93cml0ZV9wYWdlX3Jhd19zeW5kcm9tZSAtIFtJbnRlcm5dIHJhdyBwYWdlIHdyaXRlIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWRhdGEgYnVmZmVyCisgKiBuYW5kX3dyaXRlX3BhZ2VfcmF3X3N5bmRyb21lIC0gW0lOVEVSTl0gcmF3IHBhZ2Ugd3JpdGUgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKICAqCiAgKiBXZSBuZWVkIGEgc3BlY2lhbCBvb2IgbGF5b3V0IGFuZCBoYW5kbGluZyBldmVuIHdoZW4gRUNDIGlzbid0IGNoZWNrZWQuCiAgKi8KQEAgLTE5NDIsMTAgKzE5NTIsMTAgQEAKIAkJY2hpcC0+d3JpdGVfYnVmKG10ZCwgb29iLCBzaXplKTsKIH0KIC8qKgotICogbmFuZF93cml0ZV9wYWdlX3N3ZWNjIC0gW1JFUExBQ0FCTEVdIHNvZnR3YXJlIGVjYyBiYXNlZCBwYWdlIHdyaXRlIGZ1bmN0aW9uCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWRhdGEgYnVmZmVyCisgKiBuYW5kX3dyaXRlX3BhZ2Vfc3dlY2MgLSBbUkVQTEFDRUFCTEVdIHNvZnR3YXJlIEVDQyBiYXNlZCBwYWdlIHdyaXRlIGZ1bmN0aW9uCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGRhdGEgYnVmZmVyCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfd3JpdGVfcGFnZV9zd2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCQkgIGNvbnN0IHVpbnQ4X3QgKmJ1ZikKQEAgLTE5NTcsNyArMTk2Nyw3IEBACiAJY29uc3QgdWludDhfdCAqcCA9IGJ1ZjsKIAl1aW50MzJfdCAqZWNjcG9zID0gY2hpcC0+ZWNjLmxheW91dC0+ZWNjcG9zOwogCi0JLyogU29mdHdhcmUgZWNjIGNhbGN1bGF0aW9uICovCisJLyogU29mdHdhcmUgRUNDIGNhbGN1bGF0aW9uICovCiAJZm9yIChpID0gMDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkgKz0gZWNjYnl0ZXMsIHAgKz0gZWNjc2l6ZSkKIAkJY2hpcC0+ZWNjLmNhbGN1bGF0ZShtdGQsIHAsICZlY2NfY2FsY1tpXSk7CiAKQEAgLTE5NjgsMTAgKzE5NzgsMTAgQEAKIH0KIAogLyoqCi0gKiBuYW5kX3dyaXRlX3BhZ2VfaHdlY2MgLSBbUkVQTEFDQUJMRV0gaGFyZHdhcmUgZWNjIGJhc2VkIHBhZ2Ugd3JpdGUgZnVuY3Rpb24KLSAqIEBtdGQ6CW10ZCBpbmZvIHN0cnVjdHVyZQotICogQGNoaXA6CW5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQotICogQGJ1ZjoJZGF0YSBidWZmZXIKKyAqIG5hbmRfd3JpdGVfcGFnZV9od2VjYyAtIFtSRVBMQUNFQUJMRV0gaGFyZHdhcmUgRUNDIGJhc2VkIHBhZ2Ugd3JpdGUgZnVuY3Rpb24KKyAqIEBtdGQ6IG10ZCBpbmZvIHN0cnVjdHVyZQorICogQGNoaXA6IG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQGJ1ZjogZGF0YSBidWZmZXIKICAqLwogc3RhdGljIHZvaWQgbmFuZF93cml0ZV9wYWdlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJCSAgY29uc3QgdWludDhfdCAqYnVmKQpAQCAtMTk5NiwxMyArMjAwNiwxMyBAQAogfQogCiAvKioKLSAqIG5hbmRfd3JpdGVfcGFnZV9zeW5kcm9tZSAtIFtSRVBMQUNBQkxFXSBoYXJkd2FyZSBlY2Mgc3luZHJvbSBiYXNlZCBwYWdlIHdyaXRlCi0gKiBAbXRkOgltdGQgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaGlwOgluYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBidWY6CWRhdGEgYnVmZmVyCisgKiBuYW5kX3dyaXRlX3BhZ2Vfc3luZHJvbWUgLSBbUkVQTEFDRUFCTEVdIGhhcmR3YXJlIEVDQyBzeW5kcm9tZSBiYXNlZCBwYWdlIHdyaXRlCisgKiBAbXRkOiBtdGQgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBidWY6IGRhdGEgYnVmZmVyCiAgKgotICogVGhlIGh3IGdlbmVyYXRvciBjYWxjdWxhdGVzIHRoZSBlcnJvciBzeW5kcm9tZSBhdXRvbWF0aWNhbGx5LiBUaGVyZWZvcgotICogd2UgbmVlZCBhIHNwZWNpYWwgb29iIGxheW91dCBhbmQgaGFuZGxpbmcuCisgKiBUaGUgaHcgZ2VuZXJhdG9yIGNhbGN1bGF0ZXMgdGhlIGVycm9yIHN5bmRyb21lIGF1dG9tYXRpY2FsbHkuIFRoZXJlZm9yZSB3ZQorICogbmVlZCBhIHNwZWNpYWwgb29iIGxheW91dCBhbmQgaGFuZGxpbmcuCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfd3JpdGVfcGFnZV9zeW5kcm9tZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKIAkJCQkgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdWludDhfdCAqYnVmKQpAQCAtMjA0MSwxMiArMjA1MSwxMiBAQAogCiAvKioKICAqIG5hbmRfd3JpdGVfcGFnZSAtIFtSRVBMQUNFQUJMRV0gd3JpdGUgb25lIHBhZ2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAY2hpcDoJTkFORCBjaGlwIGRlc2NyaXB0b3IKLSAqIEBidWY6CXRoZSBkYXRhIHRvIHdyaXRlCi0gKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gd3JpdGUKLSAqIEBjYWNoZWQ6CWNhY2hlZCBwcm9ncmFtbWluZwotICogQHJhdzoJdXNlIF9yYXcgdmVyc2lvbiBvZiB3cml0ZV9wYWdlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGNoaXA6IE5BTkQgY2hpcCBkZXNjcmlwdG9yCisgKiBAYnVmOiB0aGUgZGF0YSB0byB3cml0ZQorICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHdyaXRlCisgKiBAY2FjaGVkOiBjYWNoZWQgcHJvZ3JhbW1pbmcKKyAqIEByYXc6IHVzZSBfcmF3IHZlcnNpb24gb2Ygd3JpdGVfcGFnZQogICovCiBzdGF0aWMgaW50IG5hbmRfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCSAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHBhZ2UsIGludCBjYWNoZWQsIGludCByYXcpCkBAIC0yMDYxLDggKzIwNzEsOCBAQAogCQljaGlwLT5lY2Mud3JpdGVfcGFnZShtdGQsIGNoaXAsIGJ1Zik7CiAKIAkvKgotCSAqIENhY2hlZCBwcm9nYW1taW5nIGRpc2FibGVkIGZvciBub3csIE5vdCBzdXJlIGlmIGl0cyB3b3J0aCB0aGUKLQkgKiB0cm91YmxlLiBUaGUgc3BlZWQgZ2FpbiBpcyBub3QgdmVyeSBpbXByZXNzaXZlLiAoMi4zLT4yLjZNaWIvcykKKwkgKiBDYWNoZWQgcHJvZ2FtbWluZyBkaXNhYmxlZCBmb3Igbm93LiBOb3Qgc3VyZSBpZiBpdCdzIHdvcnRoIHRoZQorCSAqIHRyb3VibGUuIFRoZSBzcGVlZCBnYWluIGlzIG5vdCB2ZXJ5IGltcHJlc3NpdmUuICgyLjMtPjIuNk1pYi9zKS4KIAkgKi8KIAljYWNoZWQgPSAwOwogCkBAIC0yMDcyLDcgKzIwODIsNyBAQAogCQlzdGF0dXMgPSBjaGlwLT53YWl0ZnVuYyhtdGQsIGNoaXApOwogCQkvKgogCQkgKiBTZWUgaWYgb3BlcmF0aW9uIGZhaWxlZCBhbmQgYWRkaXRpb25hbCBzdGF0dXMgY2hlY2tzIGFyZQotCQkgKiBhdmFpbGFibGUKKwkJICogYXZhaWxhYmxlLgogCQkgKi8KIAkJaWYgKChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSAmJiAoY2hpcC0+ZXJyc3RhdCkpCiAJCQlzdGF0dXMgPSBjaGlwLT5lcnJzdGF0KG10ZCwgY2hpcCwgRkxfV1JJVElORywgc3RhdHVzLApAQCAtMjA5NiwyOSArMjEwNiwzNyBAQAogfQogCiAvKioKLSAqIG5hbmRfZmlsbF9vb2IgLSBbSW50ZXJuYWxdIFRyYW5zZmVyIGNsaWVudCBidWZmZXIgdG8gb29iCi0gKiBAY2hpcDoJbmFuZCBjaGlwIHN0cnVjdHVyZQotICogQG9vYjoJb29iIGRhdGEgYnVmZmVyCi0gKiBAbGVuOglvb2IgZGF0YSB3cml0ZSBsZW5ndGgKLSAqIEBvcHM6CW9vYiBvcHMgc3RydWN0dXJlCisgKiBuYW5kX2ZpbGxfb29iIC0gW0lOVEVSTl0gVHJhbnNmZXIgY2xpZW50IGJ1ZmZlciB0byBvb2IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb29iOiBvb2IgZGF0YSBidWZmZXIKKyAqIEBsZW46IG9vYiBkYXRhIHdyaXRlIGxlbmd0aAorICogQG9wczogb29iIG9wcyBzdHJ1Y3R1cmUKICAqLwotc3RhdGljIHVpbnQ4X3QgKm5hbmRfZmlsbF9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdWludDhfdCAqb29iLCBzaXplX3QgbGVuLAotCQkJCQkJc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpCitzdGF0aWMgdWludDhfdCAqbmFuZF9maWxsX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqb29iLCBzaXplX3QgbGVuLAorCQkJICAgICAgc3RydWN0IG10ZF9vb2Jfb3BzICpvcHMpCiB7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKworCS8qCisJICogSW5pdGlhbGlzZSB0byBhbGwgMHhGRiwgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGxlZnQgb3ZlciBPT0IKKwkgKiBkYXRhIGZyb20gYSBwcmV2aW91cyBPT0IgcmVhZC4KKwkgKi8KKwltZW1zZXQoY2hpcC0+b29iX3BvaSwgMHhmZiwgbXRkLT5vb2JzaXplKTsKKwogCXN3aXRjaCAob3BzLT5tb2RlKSB7CiAKLQljYXNlIE1URF9PT0JfUExBQ0U6Ci0JY2FzZSBNVERfT09CX1JBVzoKKwljYXNlIE1URF9PUFNfUExBQ0VfT09COgorCWNhc2UgTVREX09QU19SQVc6CiAJCW1lbWNweShjaGlwLT5vb2JfcG9pICsgb3BzLT5vb2JvZmZzLCBvb2IsIGxlbik7CiAJCXJldHVybiBvb2IgKyBsZW47CiAKLQljYXNlIE1URF9PT0JfQVVUTzogeworCWNhc2UgTVREX09QU19BVVRPX09PQjogewogCQlzdHJ1Y3QgbmFuZF9vb2JmcmVlICpmcmVlID0gY2hpcC0+ZWNjLmxheW91dC0+b29iZnJlZTsKIAkJdWludDMyX3QgYm9mZnMgPSAwLCB3b2ZmcyA9IG9wcy0+b29ib2ZmczsKIAkJc2l6ZV90IGJ5dGVzID0gMDsKIAogCQlmb3IgKDsgZnJlZS0+bGVuZ3RoICYmIGxlbjsgZnJlZSsrLCBsZW4gLT0gYnl0ZXMpIHsKLQkJCS8qIFdyaXRlIHJlcXVlc3Qgbm90IGZyb20gb2Zmc2V0IDAgPyAqLworCQkJLyogV3JpdGUgcmVxdWVzdCBub3QgZnJvbSBvZmZzZXQgMD8gKi8KIAkJCWlmICh1bmxpa2VseSh3b2ZmcykpIHsKIAkJCQlpZiAod29mZnMgPj0gZnJlZS0+bGVuZ3RoKSB7CiAJCQkJCXdvZmZzIC09IGZyZWUtPmxlbmd0aDsKQEAgLTIxNDYsMTIgKzIxNjQsMTIgQEAKICNkZWZpbmUgTk9UQUxJR05FRCh4KQkoKHggJiAoY2hpcC0+c3VicGFnZXNpemUgLSAxKSkgIT0gMCkKIAogLyoqCi0gKiBuYW5kX2RvX3dyaXRlX29wcyAtIFtJbnRlcm5hbF0gTkFORCB3cml0ZSB3aXRoIEVDQwotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bwotICogQG9wczoJb29iIG9wZXJhdGlvbnMgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBuYW5kX2RvX3dyaXRlX29wcyAtIFtJTlRFUk5dIE5BTkQgd3JpdGUgd2l0aCBFQ0MKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdG86IG9mZnNldCB0byB3cml0ZSB0bworICogQG9wczogb29iIG9wZXJhdGlvbnMgZGVzY3JpcHRpb24gc3RydWN0dXJlCiAgKgotICogTkFORCB3cml0ZSB3aXRoIEVDQworICogTkFORCB3cml0ZSB3aXRoIEVDQy4KICAqLwogc3RhdGljIGludCBuYW5kX2RvX3dyaXRlX29wcyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAogCQkJICAgICBzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKQEAgLTIxNjEsNyArMjE3OSw3IEBACiAJdWludDMyX3Qgd3JpdGVsZW4gPSBvcHMtPmxlbjsKIAogCXVpbnQzMl90IG9vYndyaXRlbGVuID0gb3BzLT5vb2JsZW47Ci0JdWludDMyX3Qgb29ibWF4bGVuID0gb3BzLT5tb2RlID09IE1URF9PT0JfQVVUTyA/CisJdWludDMyX3Qgb29ibWF4bGVuID0gb3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IgPwogCQkJCW10ZC0+b29iYXZhaWwgOiBtdGQtPm9vYnNpemU7CiAKIAl1aW50OF90ICpvb2IgPSBvcHMtPm9vYmJ1ZjsKQEAgLTIxNzIsMTAgKzIxOTAsMTAgQEAKIAlpZiAoIXdyaXRlbGVuKQogCQlyZXR1cm4gMDsKIAotCS8qIHJlamVjdCB3cml0ZXMsIHdoaWNoIGFyZSBub3QgcGFnZSBhbGlnbmVkICovCisJLyogUmVqZWN0IHdyaXRlcywgd2hpY2ggYXJlIG5vdCBwYWdlIGFsaWduZWQgKi8KIAlpZiAoTk9UQUxJR05FRCh0bykgfHwgTk9UQUxJR05FRChvcHMtPmxlbikpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXR0ZW1wdCB0byB3cml0ZSBub3QgIgotCQkJCSJwYWdlIGFsaWduZWQgZGF0YVxuIiwgX19mdW5jX18pOworCQlwcl9ub3RpY2UoIiVzOiBhdHRlbXB0IHRvIHdyaXRlIG5vbiBwYWdlIGFsaWduZWQgZGF0YVxuIiwKKwkJCSAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjAxLDEwICsyMjE5LDYgQEAKIAkgICAgKGNoaXAtPnBhZ2VidWYgPDwgY2hpcC0+cGFnZV9zaGlmdCkgPCAodG8gKyBvcHMtPmxlbikpCiAJCWNoaXAtPnBhZ2VidWYgPSAtMTsKIAotCS8qIElmIHdlJ3JlIG5vdCBnaXZlbiBleHBsaWNpdCBPT0IgZGF0YSwgbGV0IGl0IGJlIDB4RkYgKi8KLQlpZiAobGlrZWx5KCFvb2IpKQotCQltZW1zZXQoY2hpcC0+b29iX3BvaSwgMHhmZiwgbXRkLT5vb2JzaXplKTsKLQogCS8qIERvbid0IGFsbG93IG11bHRpcGFnZSBvb2Igd3JpdGVzIHdpdGggb2Zmc2V0ICovCiAJaWYgKG9vYiAmJiBvcHMtPm9vYm9mZnMgJiYgKG9wcy0+b29ib2ZmcyArIG9wcy0+b29ibGVuID4gb29ibWF4bGVuKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjE0LDcgKzIyMjgsNyBAQAogCQlpbnQgY2FjaGVkID0gd3JpdGVsZW4gPiBieXRlcyAmJiBwYWdlICE9IGJsb2NrbWFzazsKIAkJdWludDhfdCAqd2J1ZiA9IGJ1ZjsKIAotCQkvKiBQYXJ0aWFsIHBhZ2Ugd3JpdGUgPyAqLworCQkvKiBQYXJ0aWFsIHBhZ2Ugd3JpdGU/ICovCiAJCWlmICh1bmxpa2VseShjb2x1bW4gfHwgd3JpdGVsZW4gPCAobXRkLT53cml0ZXNpemUgLSAxKSkpIHsKIAkJCWNhY2hlZCA9IDA7CiAJCQlieXRlcyA9IG1pbl90KGludCwgYnl0ZXMgLSBjb2x1bW4sIChpbnQpIHdyaXRlbGVuKTsKQEAgLTIyMjYsMTIgKzIyNDAsMTUgQEAKIAogCQlpZiAodW5saWtlbHkob29iKSkgewogCQkJc2l6ZV90IGxlbiA9IG1pbihvb2J3cml0ZWxlbiwgb29ibWF4bGVuKTsKLQkJCW9vYiA9IG5hbmRfZmlsbF9vb2IoY2hpcCwgb29iLCBsZW4sIG9wcyk7CisJCQlvb2IgPSBuYW5kX2ZpbGxfb29iKG10ZCwgb29iLCBsZW4sIG9wcyk7CiAJCQlvb2J3cml0ZWxlbiAtPSBsZW47CisJCX0gZWxzZSB7CisJCQkvKiBXZSBzdGlsbCBuZWVkIHRvIGVyYXNlIGxlZnRvdmVyIE9PQiBkYXRhICovCisJCQltZW1zZXQoY2hpcC0+b29iX3BvaSwgMHhmZiwgbXRkLT5vb2JzaXplKTsKIAkJfQogCiAJCXJldCA9IGNoaXAtPndyaXRlX3BhZ2UobXRkLCBjaGlwLCB3YnVmLCBwYWdlLCBjYWNoZWQsCi0JCQkJICAgICAgIChvcHMtPm1vZGUgPT0gTVREX09PQl9SQVcpKTsKKwkJCQkgICAgICAgKG9wcy0+bW9kZSA9PSBNVERfT1BTX1JBVykpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAKQEAgLTIyNjAsMTEgKzIyNzcsMTEgQEAKIAogLyoqCiAgKiBwYW5pY19uYW5kX3dyaXRlIC0gW01URCBJbnRlcmZhY2VdIE5BTkQgd3JpdGUgd2l0aCBFQ0MKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAdG86CQlvZmZzZXQgdG8gd3JpdGUgdG8KLSAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQotICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKLSAqIEBidWY6CXRoZSBkYXRhIHRvIHdyaXRlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRvOiBvZmZzZXQgdG8gd3JpdGUgdG8KKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogQHJldGxlbjogcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKKyAqIEBidWY6IHRoZSBkYXRhIHRvIHdyaXRlCiAgKgogICogTkFORCB3cml0ZSB3aXRoIEVDQy4gVXNlZCB3aGVuIHBlcmZvcm1pbmcgd3JpdGVzIGluIGludGVycnVwdCBjb250ZXh0LCB0aGlzCiAgKiBtYXkgZm9yIGV4YW1wbGUgYmUgY2FsbGVkIGJ5IG10ZG9vcHMgd2hlbiB3cml0aW5nIGFuIG9vcHMgd2hpbGUgaW4gcGFuaWMuCkBAIC0yMjczLDYgKzIyOTAsNyBAQAogCQkJICAgIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1aW50OF90ICpidWYpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXQ7CiAKIAkvKiBEbyBub3QgYWxsb3cgcmVhZHMgcGFzdCBlbmQgb2YgZGV2aWNlICovCkBAIC0yMjgxLDM2ICsyMjk5LDM4IEBACiAJaWYgKCFsZW4pCiAJCXJldHVybiAwOwogCi0JLyogV2FpdCBmb3IgdGhlIGRldmljZSB0byBnZXQgcmVhZHkuICAqLworCS8qIFdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gZ2V0IHJlYWR5ICovCiAJcGFuaWNfbmFuZF93YWl0KG10ZCwgY2hpcCwgNDAwKTsKIAotCS8qIEdyYWIgdGhlIGRldmljZS4gICovCisJLyogR3JhYiB0aGUgZGV2aWNlICovCiAJcGFuaWNfbmFuZF9nZXRfZGV2aWNlKGNoaXAsIG10ZCwgRkxfV1JJVElORyk7CiAKLQljaGlwLT5vcHMubGVuID0gbGVuOwotCWNoaXAtPm9wcy5kYXRidWYgPSAodWludDhfdCAqKWJ1ZjsKLQljaGlwLT5vcHMub29iYnVmID0gTlVMTDsKKwlvcHMubGVuID0gbGVuOworCW9wcy5kYXRidWYgPSAodWludDhfdCAqKWJ1ZjsKKwlvcHMub29iYnVmID0gTlVMTDsKKwlvcHMubW9kZSA9IDA7CiAKLQlyZXQgPSBuYW5kX2RvX3dyaXRlX29wcyhtdGQsIHRvLCAmY2hpcC0+b3BzKTsKKwlyZXQgPSBuYW5kX2RvX3dyaXRlX29wcyhtdGQsIHRvLCAmb3BzKTsKIAotCSpyZXRsZW4gPSBjaGlwLT5vcHMucmV0bGVuOworCSpyZXRsZW4gPSBvcHMucmV0bGVuOwogCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogbmFuZF93cml0ZSAtIFtNVEQgSW50ZXJmYWNlXSBOQU5EIHdyaXRlIHdpdGggRUNDCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHRvOgkJb2Zmc2V0IHRvIHdyaXRlIHRvCi0gKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKLSAqIEByZXRsZW46CXBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzCi0gKiBAYnVmOgl0aGUgZGF0YSB0byB3cml0ZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0bzogb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIEByZXRsZW46IHBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzCisgKiBAYnVmOiB0aGUgZGF0YSB0byB3cml0ZQogICoKLSAqIE5BTkQgd3JpdGUgd2l0aCBFQ0MKKyAqIE5BTkQgd3JpdGUgd2l0aCBFQ0MuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAogCQkJICBzaXplX3QgKnJldGxlbiwgY29uc3QgdWludDhfdCAqYnVmKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmV0OwogCiAJLyogRG8gbm90IGFsbG93IHJlYWRzIHBhc3QgZW5kIG9mIGRldmljZSAqLwpAQCAtMjMyMSwxMyArMjM0MSwxNCBAQAogCiAJbmFuZF9nZXRfZGV2aWNlKGNoaXAsIG10ZCwgRkxfV1JJVElORyk7CiAKLQljaGlwLT5vcHMubGVuID0gbGVuOwotCWNoaXAtPm9wcy5kYXRidWYgPSAodWludDhfdCAqKWJ1ZjsKLQljaGlwLT5vcHMub29iYnVmID0gTlVMTDsKKwlvcHMubGVuID0gbGVuOworCW9wcy5kYXRidWYgPSAodWludDhfdCAqKWJ1ZjsKKwlvcHMub29iYnVmID0gTlVMTDsKKwlvcHMubW9kZSA9IDA7CiAKLQlyZXQgPSBuYW5kX2RvX3dyaXRlX29wcyhtdGQsIHRvLCAmY2hpcC0+b3BzKTsKKwlyZXQgPSBuYW5kX2RvX3dyaXRlX29wcyhtdGQsIHRvLCAmb3BzKTsKIAotCSpyZXRsZW4gPSBjaGlwLT5vcHMucmV0bGVuOworCSpyZXRsZW4gPSBvcHMucmV0bGVuOwogCiAJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCkBAIC0yMzM2LDExICsyMzU3LDExIEBACiAKIC8qKgogICogbmFuZF9kb193cml0ZV9vb2IgLSBbTVREIEludGVyZmFjZV0gTkFORCB3cml0ZSBvdXQtb2YtYmFuZAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bwotICogQG9wczoJb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdG86IG9mZnNldCB0byB3cml0ZSB0bworICogQG9wczogb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKICAqCi0gKiBOQU5EIHdyaXRlIG91dC1vZi1iYW5kCisgKiBOQU5EIHdyaXRlIG91dC1vZi1iYW5kLgogICovCiBzdGF0aWMgaW50IG5hbmRfZG9fd3JpdGVfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sCiAJCQkgICAgIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQpAQCAtMjM0OCwyNCArMjM2OSwyNCBAQAogCWludCBjaGlwbnIsIHBhZ2UsIHN0YXR1cywgbGVuOwogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKKwlwcl9kZWJ1ZygiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKIAkJCSBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCl0bywgKGludClvcHMtPm9vYmxlbik7CiAKLQlpZiAob3BzLT5tb2RlID09IE1URF9PT0JfQVVUTykKKwlpZiAob3BzLT5tb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCWxlbiA9IGNoaXAtPmVjYy5sYXlvdXQtPm9vYmF2YWlsOwogCWVsc2UKIAkJbGVuID0gbXRkLT5vb2JzaXplOwogCiAJLyogRG8gbm90IGFsbG93IHdyaXRlIHBhc3QgZW5kIG9mIHBhZ2UgKi8KIAlpZiAoKG9wcy0+b29ib2ZmcyArIG9wcy0+b29ibGVuKSA+IGxlbikgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEF0dGVtcHQgdG8gd3JpdGUgIgotCQkJCSJwYXN0IGVuZCBvZiBwYWdlXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byB3cml0ZSBwYXN0IGVuZCBvZiBwYWdlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHVubGlrZWx5KG9wcy0+b29ib2ZmcyA+PSBsZW4pKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogQXR0ZW1wdCB0byBzdGFydCAiCi0JCQkJIndyaXRlIG91dHNpZGUgb29iXG4iLCBfX2Z1bmNfXyk7CisJCXByX2RlYnVnKCIlczogYXR0ZW1wdCB0byBzdGFydCB3cml0ZSBvdXRzaWRlIG9vYlxuIiwKKwkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjM3NCw4ICsyMzk1LDggQEAKIAkJICAgICBvcHMtPm9vYm9mZnMgKyBvcHMtPm9vYmxlbiA+CiAJCQkoKG10ZC0+c2l6ZSA+PiBjaGlwLT5wYWdlX3NoaWZ0KSAtCiAJCQkgKHRvID4+IGNoaXAtPnBhZ2Vfc2hpZnQpKSAqIGxlbikpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBBdHRlbXB0IHdyaXRlIGJleW9uZCAiCi0JCQkJImVuZCBvZiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBhdHRlbXB0IHRvIHdyaXRlIGJleW9uZCBlbmQgb2YgZGV2aWNlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDAxLDEwICsyNDIyLDEyIEBACiAJaWYgKHBhZ2UgPT0gY2hpcC0+cGFnZWJ1ZikKIAkJY2hpcC0+cGFnZWJ1ZiA9IC0xOwogCi0JbWVtc2V0KGNoaXAtPm9vYl9wb2ksIDB4ZmYsIG10ZC0+b29ic2l6ZSk7Ci0JbmFuZF9maWxsX29vYihjaGlwLCBvcHMtPm9vYmJ1Ziwgb3BzLT5vb2JsZW4sIG9wcyk7Ci0Jc3RhdHVzID0gY2hpcC0+ZWNjLndyaXRlX29vYihtdGQsIGNoaXAsIHBhZ2UgJiBjaGlwLT5wYWdlbWFzayk7Ci0JbWVtc2V0KGNoaXAtPm9vYl9wb2ksIDB4ZmYsIG10ZC0+b29ic2l6ZSk7CisJbmFuZF9maWxsX29vYihtdGQsIG9wcy0+b29iYnVmLCBvcHMtPm9vYmxlbiwgb3BzKTsKKworCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19SQVcpCisJCXN0YXR1cyA9IGNoaXAtPmVjYy53cml0ZV9vb2JfcmF3KG10ZCwgY2hpcCwgcGFnZSAmIGNoaXAtPnBhZ2VtYXNrKTsKKwllbHNlCisJCXN0YXR1cyA9IGNoaXAtPmVjYy53cml0ZV9vb2IobXRkLCBjaGlwLCBwYWdlICYgY2hpcC0+cGFnZW1hc2spOwogCiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTI0MTYsOSArMjQzOSw5IEBACiAKIC8qKgogICogbmFuZF93cml0ZV9vb2IgLSBbTVREIEludGVyZmFjZV0gTkFORCB3cml0ZSBkYXRhIGFuZC9vciBvdXQtb2YtYmFuZAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0bzoJCW9mZnNldCB0byB3cml0ZSB0bwotICogQG9wczoJb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdG86IG9mZnNldCB0byB3cml0ZSB0bworICogQG9wczogb29iIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKICAqLwogc3RhdGljIGludCBuYW5kX3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAogCQkJICBzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKQEAgLTI0MzAsMTcgKzI0NTMsMTcgQEAKIAogCS8qIERvIG5vdCBhbGxvdyB3cml0ZXMgcGFzdCBlbmQgb2YgZGV2aWNlICovCiAJaWYgKG9wcy0+ZGF0YnVmICYmICh0byArIG9wcy0+bGVuKSA+IG10ZC0+c2l6ZSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IEF0dGVtcHQgd3JpdGUgYmV5b25kICIKLQkJCQkiZW5kIG9mIGRldmljZVxuIiwgX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IGF0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGVuZCBvZiBkZXZpY2VcbiIsCisJCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAluYW5kX2dldF9kZXZpY2UoY2hpcCwgbXRkLCBGTF9XUklUSU5HKTsKIAogCXN3aXRjaCAob3BzLT5tb2RlKSB7Ci0JY2FzZSBNVERfT09CX1BMQUNFOgotCWNhc2UgTVREX09PQl9BVVRPOgotCWNhc2UgTVREX09PQl9SQVc6CisJY2FzZSBNVERfT1BTX1BMQUNFX09PQjoKKwljYXNlIE1URF9PUFNfQVVUT19PT0I6CisJY2FzZSBNVERfT1BTX1JBVzoKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjQ1OCwxMSArMjQ4MSwxMSBAQAogfQogCiAvKioKLSAqIHNpbmdsZV9lcmVhc2VfY21kIC0gW0dFTkVSSUNdIE5BTkQgc3RhbmRhcmQgYmxvY2sgZXJhc2UgY29tbWFuZCBmdW5jdGlvbgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBwYWdlOgl0aGUgcGFnZSBhZGRyZXNzIG9mIHRoZSBibG9jayB3aGljaCB3aWxsIGJlIGVyYXNlZAorICogc2luZ2xlX2VyYXNlX2NtZCAtIFtHRU5FUklDXSBOQU5EIHN0YW5kYXJkIGJsb2NrIGVyYXNlIGNvbW1hbmQgZnVuY3Rpb24KKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFnZTogdGhlIHBhZ2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBlcmFzZWQKICAqCi0gKiBTdGFuZGFyZCBlcmFzZSBjb21tYW5kIGZvciBOQU5EIGNoaXBzCisgKiBTdGFuZGFyZCBlcmFzZSBjb21tYW5kIGZvciBOQU5EIGNoaXBzLgogICovCiBzdGF0aWMgdm9pZCBzaW5nbGVfZXJhc2VfY21kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZSkKIHsKQEAgLTI0NzMsMTIgKzI0OTYsMTEgQEAKIH0KIAogLyoqCi0gKiBtdWx0aV9lcmVhc2VfY21kIC0gW0dFTkVSSUNdIEFORCBzcGVjaWZpYyBibG9jayBlcmFzZSBjb21tYW5kIGZ1bmN0aW9uCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQHBhZ2U6CXRoZSBwYWdlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrIHdoaWNoIHdpbGwgYmUgZXJhc2VkCisgKiBtdWx0aV9lcmFzZV9jbWQgLSBbR0VORVJJQ10gQU5EIHNwZWNpZmljIGJsb2NrIGVyYXNlIGNvbW1hbmQgZnVuY3Rpb24KKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFnZTogdGhlIHBhZ2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBlcmFzZWQKICAqCi0gKiBBTkQgbXVsdGkgYmxvY2sgZXJhc2UgY29tbWFuZCBmdW5jdGlvbgotICogRXJhc2UgNCBjb25zZWN1dGl2ZSBibG9ja3MKKyAqIEFORCBtdWx0aSBibG9jayBlcmFzZSBjb21tYW5kIGZ1bmN0aW9uLiBFcmFzZSA0IGNvbnNlY3V0aXZlIGJsb2Nrcy4KICAqLwogc3RhdGljIHZvaWQgbXVsdGlfZXJhc2VfY21kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgcGFnZSkKIHsKQEAgLTI0OTMsMTAgKzI1MTUsMTAgQEAKIAogLyoqCiAgKiBuYW5kX2VyYXNlIC0gW01URCBJbnRlcmZhY2VdIGVyYXNlIGJsb2NrKHMpCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGluc3RyOgllcmFzZSBpbnN0cnVjdGlvbgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpbnN0cjogZXJhc2UgaW5zdHJ1Y3Rpb24KICAqCi0gKiBFcmFzZSBvbmUgb3JlIG1vcmUgYmxvY2tzCisgKiBFcmFzZSBvbmUgb3JlIG1vcmUgYmxvY2tzLgogICovCiBzdGF0aWMgaW50IG5hbmRfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKIHsKQEAgLTI1MDUsMTIgKzI1MjcsMTIgQEAKIAogI2RlZmluZSBCQlRfUEFHRV9NQVNLCTB4ZmZmZmZmM2YKIC8qKgotICogbmFuZF9lcmFzZV9uYW5kIC0gW0ludGVybmFsXSBlcmFzZSBibG9jayhzKQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBpbnN0cjoJZXJhc2UgaW5zdHJ1Y3Rpb24KLSAqIEBhbGxvd2JidDoJYWxsb3cgZXJhc2luZyB0aGUgYmJ0IGFyZWEKKyAqIG5hbmRfZXJhc2VfbmFuZCAtIFtJTlRFUk5dIGVyYXNlIGJsb2NrKHMpCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGluc3RyOiBlcmFzZSBpbnN0cnVjdGlvbgorICogQGFsbG93YmJ0OiBhbGxvdyBlcmFzaW5nIHRoZSBiYnQgYXJlYQogICoKLSAqIEVyYXNlIG9uZSBvcmUgbW9yZSBibG9ja3MKKyAqIEVyYXNlIG9uZSBvcmUgbW9yZSBibG9ja3MuCiAgKi8KIGludCBuYW5kX2VyYXNlX25hbmQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0ciwKIAkJICAgIGludCBhbGxvd2JidCkKQEAgLTI1MjEsOSArMjU0Myw5IEBACiAJdW5zaWduZWQgaW50IGJidF9tYXNrZWRfcGFnZSA9IDB4ZmZmZmZmZmY7CiAJbG9mZl90IGxlbjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogc3RhcnQgPSAweCUwMTJsbHgsIGxlbiA9ICVsbHVcbiIsCi0JCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmFkZHIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+bGVuKTsKKwlwcl9kZWJ1ZygiJXM6IHN0YXJ0ID0gMHglMDEybGx4LCBsZW4gPSAlbGx1XG4iLAorCQkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmFkZHIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWluc3RyLT5sZW4pOwogCiAJaWYgKGNoZWNrX29mZnNfbGVuKG10ZCwgaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI1NDUsOCArMjU2Nyw4IEBACiAKIAkvKiBDaGVjaywgaWYgaXQgaXMgd3JpdGUgcHJvdGVjdGVkICovCiAJaWYgKG5hbmRfY2hlY2tfd3AobXRkKSkgewotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IERldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQhISFcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJcHJfZGVidWcoIiVzOiBkZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkIVxuIiwKKwkJCQlfX2Z1bmNfXyk7CiAJCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9GQUlMRUQ7CiAJCWdvdG8gZXJhc2VfZXhpdDsKIAl9CkBAIC0yNTU1LDcgKzI1NzcsNyBAQAogCSAqIElmIEJCVCByZXF1aXJlcyByZWZyZXNoLCBzZXQgdGhlIEJCVCBwYWdlIG1hc2sgdG8gc2VlIGlmIHRoZSBCQlQKIAkgKiBzaG91bGQgYmUgcmV3cml0dGVuLiBPdGhlcndpc2UgdGhlIG1hc2sgaXMgc2V0IHRvIDB4ZmZmZmZmZmYgd2hpY2gKIAkgKiBjYW4gbm90IGJlIG1hdGNoZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdoZW4gdGhlIGJidCBpcyBhY3R1YWxseQotCSAqIGVyYXNlZCB0byBhdm9pZCByZWN1c3JzaXZlIHVwZGF0ZXMKKwkgKiBlcmFzZWQgdG8gYXZvaWQgcmVjdXJzaXZlIHVwZGF0ZXMuCiAJICovCiAJaWYgKGNoaXAtPm9wdGlvbnMgJiBCQlRfQVVUT19SRUZSRVNIICYmICFhbGxvd2JidCkKIAkJYmJ0X21hc2tlZF9wYWdlID0gY2hpcC0+YmJ0X3RkLT5wYWdlc1tjaGlwbnJdICYgQkJUX1BBR0VfTUFTSzsKQEAgLTI1NjYsMjAgKzI1ODgsMTggQEAKIAlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0lORzsKIAogCXdoaWxlIChsZW4pIHsKLQkJLyoKLQkJICogaGVjayBpZiB3ZSBoYXZlIGEgYmFkIGJsb2NrLCB3ZSBkbyBub3QgZXJhc2UgYmFkIGJsb2NrcyAhCi0JCSAqLworCQkvKiBIZWNrIGlmIHdlIGhhdmUgYSBiYWQgYmxvY2ssIHdlIGRvIG5vdCBlcmFzZSBiYWQgYmxvY2tzISAqLwogCQlpZiAobmFuZF9ibG9ja19jaGVja2JhZChtdGQsICgobG9mZl90KSBwYWdlKSA8PAogCQkJCQljaGlwLT5wYWdlX3NoaWZ0LCAwLCBhbGxvd2JidCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBhdHRlbXB0IHRvIGVyYXNlIGEgYmFkIGJsb2NrICIKLQkJCQkJImF0IHBhZ2UgMHglMDh4XG4iLCBfX2Z1bmNfXywgcGFnZSk7CisJCQlwcl93YXJuKCIlczogYXR0ZW1wdCB0byBlcmFzZSBhIGJhZCBibG9jayBhdCBwYWdlIDB4JTA4eFxuIiwKKwkJCQkgICAgX19mdW5jX18sIHBhZ2UpOwogCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJCWdvdG8gZXJhc2VfZXhpdDsKIAkJfQogCiAJCS8qCiAJCSAqIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUsIGlmIHdlIGVyYXNlIHRoZSBibG9jayB3aGljaAotCQkgKiBjb250YWlucyB0aGUgY3VycmVudCBjYWNoZWQgcGFnZQorCQkgKiBjb250YWlucyB0aGUgY3VycmVudCBjYWNoZWQgcGFnZS4KIAkJICovCiAJCWlmIChwYWdlIDw9IGNoaXAtPnBhZ2VidWYgJiYgY2hpcC0+cGFnZWJ1ZiA8CiAJCSAgICAocGFnZSArIHBhZ2VzX3Blcl9ibG9jaykpCkBAIC0yNTk5LDggKzI2MTksOCBAQAogCiAJCS8qIFNlZSBpZiBibG9jayBlcmFzZSBzdWNjZWVkZWQgKi8KIAkJaWYgKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpIHsKLQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogRmFpbGVkIGVyYXNlLCAiCi0JCQkJCSJwYWdlIDB4JTA4eFxuIiwgX19mdW5jX18sIHBhZ2UpOworCQkJcHJfZGVidWcoIiVzOiBmYWlsZWQgZXJhc2UsIHBhZ2UgMHglMDh4XG4iLAorCQkJCQlfX2Z1bmNfXywgcGFnZSk7CiAJCQlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOwogCQkJaW5zdHItPmZhaWxfYWRkciA9CiAJCQkJKChsb2ZmX3QpcGFnZSA8PCBjaGlwLT5wYWdlX3NoaWZ0KTsKQEAgLTI2MDksNyArMjYyOSw3IEBACiAKIAkJLyoKIAkJICogSWYgQkJUIHJlcXVpcmVzIHJlZnJlc2gsIHNldCB0aGUgQkJUIHJld3JpdGUgZmxhZyB0byB0aGUKLQkJICogcGFnZSBiZWluZyBlcmFzZWQKKwkJICogcGFnZSBiZWluZyBlcmFzZWQuCiAJCSAqLwogCQlpZiAoYmJ0X21hc2tlZF9wYWdlICE9IDB4ZmZmZmZmZmYgJiYKIAkJICAgIChwYWdlICYgQkJUX1BBR0VfTUFTSykgPT0gYmJ0X21hc2tlZF9wYWdlKQpAQCAtMjYyOCw3ICsyNjQ4LDcgQEAKIAogCQkJLyoKIAkJCSAqIElmIEJCVCByZXF1aXJlcyByZWZyZXNoIGFuZCBCQlQtUEVSQ0hJUCwgc2V0IHRoZSBCQlQKLQkJCSAqIHBhZ2UgbWFzayB0byBzZWUgaWYgdGhpcyBCQlQgc2hvdWxkIGJlIHJld3JpdHRlbgorCQkJICogcGFnZSBtYXNrIHRvIHNlZSBpZiB0aGlzIEJCVCBzaG91bGQgYmUgcmV3cml0dGVuLgogCQkJICovCiAJCQlpZiAoYmJ0X21hc2tlZF9wYWdlICE9IDB4ZmZmZmZmZmYgJiYKIAkJCSAgICAoY2hpcC0+YmJ0X3RkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkpCkBAIC0yNjUxLDcgKzI2NzEsNyBAQAogCiAJLyoKIAkgKiBJZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCBhbmQgZXJhc2Ugd2FzIHN1Y2Nlc3NmdWwsIHJld3JpdGUgYW55Ci0JICogc2VsZWN0ZWQgYmFkIGJsb2NrIHRhYmxlcworCSAqIHNlbGVjdGVkIGJhZCBibG9jayB0YWJsZXMuCiAJICovCiAJaWYgKGJidF9tYXNrZWRfcGFnZSA9PSAweGZmZmZmZmZmIHx8IHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTI2NTksMTAgKzI2NzksMTAgQEAKIAlmb3IgKGNoaXBuciA9IDA7IGNoaXBuciA8IGNoaXAtPm51bWNoaXBzOyBjaGlwbnIrKykgewogCQlpZiAoIXJld3JpdGVfYmJ0W2NoaXBucl0pCiAJCQljb250aW51ZTsKLQkJLyogdXBkYXRlIHRoZSBCQlQgZm9yIGNoaXAgKi8KLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBuYW5kX3VwZGF0ZV9iYnQgIgotCQkJIiglZDoweCUwbGx4IDB4JTB4KVxuIiwgX19mdW5jX18sIGNoaXBuciwKLQkJCXJld3JpdGVfYmJ0W2NoaXBucl0sIGNoaXAtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSk7CisJCS8qIFVwZGF0ZSB0aGUgQkJUIGZvciBjaGlwICovCisJCXByX2RlYnVnKCIlczogbmFuZF91cGRhdGVfYmJ0ICglZDoweCUwbGx4IDB4JTB4KVxuIiwKKwkJCQlfX2Z1bmNfXywgY2hpcG5yLCByZXdyaXRlX2JidFtjaGlwbnJdLAorCQkJCWNoaXAtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSk7CiAJCW5hbmRfdXBkYXRlX2JidChtdGQsIHJld3JpdGVfYmJ0W2NoaXBucl0pOwogCX0KIApAQCAtMjY3MiwxNSArMjY5MiwxNSBAQAogCiAvKioKICAqIG5hbmRfc3luYyAtIFtNVEQgSW50ZXJmYWNlXSBzeW5jCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiBTeW5jIGlzIGFjdHVhbGx5IGEgd2FpdCBmb3IgY2hpcCByZWFkeSBmdW5jdGlvbgorICogU3luYyBpcyBhY3R1YWxseSBhIHdhaXQgZm9yIGNoaXAgcmVhZHkgZnVuY3Rpb24uCiAgKi8KIHN0YXRpYyB2b2lkIG5hbmRfc3luYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJLyogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlICovCiAJbmFuZF9nZXRfZGV2aWNlKGNoaXAsIG10ZCwgRkxfU1lOQ0lORyk7CkBAIC0yNjkwLDggKzI3MTAsOCBAQAogCiAvKioKICAqIG5hbmRfYmxvY2tfaXNiYWQgLSBbTVREIEludGVyZmFjZV0gQ2hlY2sgaWYgYmxvY2sgYXQgb2Zmc2V0IGlzIGJhZAotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBvZmZzOglvZmZzZXQgcmVsYXRpdmUgdG8gbXRkIHN0YXJ0CisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mZnM6IG9mZnNldCByZWxhdGl2ZSB0byBtdGQgc3RhcnQKICAqLwogc3RhdGljIGludCBuYW5kX2Jsb2NrX2lzYmFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZmcykKIHsKQEAgLTI3MDQsOCArMjcyNCw4IEBACiAKIC8qKgogICogbmFuZF9ibG9ja19tYXJrYmFkIC0gW01URCBJbnRlcmZhY2VdIE1hcmsgYmxvY2sgYXQgdGhlIGdpdmVuIG9mZnNldCBhcyBiYWQKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAb2ZzOglvZmZzZXQgcmVsYXRpdmUgdG8gbXRkIHN0YXJ0CisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG9mczogb2Zmc2V0IHJlbGF0aXZlIHRvIG10ZCBzdGFydAogICovCiBzdGF0aWMgaW50IG5hbmRfYmxvY2tfbWFya2JhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcykKIHsKQEAgLTI3MTQsNyArMjczNCw3IEBACiAKIAlyZXQgPSBuYW5kX2Jsb2NrX2lzYmFkKG10ZCwgb2ZzKTsKIAlpZiAocmV0KSB7Ci0JCS8qIElmIGl0IHdhcyBiYWQgYWxyZWFkeSwgcmV0dXJuIHN1Y2Nlc3MgYW5kIGRvIG5vdGhpbmcuICovCisJCS8qIElmIGl0IHdhcyBiYWQgYWxyZWFkeSwgcmV0dXJuIHN1Y2Nlc3MgYW5kIGRvIG5vdGhpbmcgKi8KIAkJaWYgKHJldCA+IDApCiAJCQlyZXR1cm4gMDsKIAkJcmV0dXJuIHJldDsKQEAgLTI3MjUsNyArMjc0NSw3IEBACiAKIC8qKgogICogbmFuZF9zdXNwZW5kIC0gW01URCBJbnRlcmZhY2VdIFN1c3BlbmQgdGhlIE5BTkQgZmxhc2gKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICovCiBzdGF0aWMgaW50IG5hbmRfc3VzcGVuZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKQEAgLTI3MzYsNyArMjc1Niw3IEBACiAKIC8qKgogICogbmFuZF9yZXN1bWUgLSBbTVREIEludGVyZmFjZV0gUmVzdW1lIHRoZSBOQU5EIGZsYXNoCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqLwogc3RhdGljIHZvaWQgbmFuZF9yZXN1bWUoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CkBAIC0yNzQ1LDEzICsyNzY1LDExIEBACiAJaWYgKGNoaXAtPnN0YXRlID09IEZMX1BNX1NVU1BFTkRFRCkKIAkJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYWxsZWQgZm9yIGEgY2hpcCB3aGljaCBpcyBub3QgIgotCQkgICAgICAgImluIHN1c3BlbmRlZCBzdGF0ZVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzIGNhbGxlZCBmb3IgYSBjaGlwIHdoaWNoIGlzIG5vdCBpbiBzdXNwZW5kZWQgc3RhdGVcbiIsCisJCQlfX2Z1bmNfXyk7CiB9CiAKLS8qCi0gKiBTZXQgZGVmYXVsdCBmdW5jdGlvbnMKLSAqLworLyogU2V0IGRlZmF1bHQgZnVuY3Rpb25zICovCiBzdGF0aWMgdm9pZCBuYW5kX3NldF9kZWZhdWx0cyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgYnVzdykKIHsKIAkvKiBjaGVjayBmb3IgcHJvcGVyIGNoaXBfZGVsYXkgc2V0dXAsIHNldCAyMHVzIGlmIG5vdCAqLwpAQCAtMjc5MywyMyArMjgxMSwyMSBAQAogCiB9CiAKLS8qCi0gKiBzYW5pdGl6ZSBPTkZJIHN0cmluZ3Mgc28gd2UgY2FuIHNhZmVseSBwcmludCB0aGVtCi0gKi8KKy8qIFNhbml0aXplIE9ORkkgc3RyaW5ncyBzbyB3ZSBjYW4gc2FmZWx5IHByaW50IHRoZW0gKi8KIHN0YXRpYyB2b2lkIHNhbml0aXplX3N0cmluZyh1aW50OF90ICpzLCBzaXplX3QgbGVuKQogewogCXNzaXplX3QgaTsKIAotCS8qIG51bGwgdGVybWluYXRlICovCisJLyogTnVsbCB0ZXJtaW5hdGUgKi8KIAlzW2xlbiAtIDFdID0gMDsKIAotCS8qIHJlbW92ZSBub24gcHJpbnRhYmxlIGNoYXJzICovCisJLyogUmVtb3ZlIG5vbiBwcmludGFibGUgY2hhcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7CiAJCWlmIChzW2ldIDwgJyAnIHx8IHNbaV0gPiAxMjcpCiAJCQlzW2ldID0gJz8nOwogCX0KIAotCS8qIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMgKi8KKwkvKiBSZW1vdmUgdHJhaWxpbmcgc3BhY2VzICovCiAJc3RyaW0ocyk7CiB9CiAKQEAgLTI4MjYsMjggKzI4NDIsMjggQEAKIH0KIAogLyoKLSAqIENoZWNrIGlmIHRoZSBOQU5EIGNoaXAgaXMgT05GSSBjb21wbGlhbnQsIHJldHVybnMgMSBpZiBpdCBpcywgMCBvdGhlcndpc2UKKyAqIENoZWNrIGlmIHRoZSBOQU5EIGNoaXAgaXMgT05GSSBjb21wbGlhbnQsIHJldHVybnMgMSBpZiBpdCBpcywgMCBvdGhlcndpc2UuCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF9mbGFzaF9kZXRlY3Rfb25maShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKLQkJCQkJaW50IGJ1c3cpCisJCQkJCWludCAqYnVzdykKIHsKIAlzdHJ1Y3QgbmFuZF9vbmZpX3BhcmFtcyAqcCA9ICZjaGlwLT5vbmZpX3BhcmFtczsKIAlpbnQgaTsKIAlpbnQgdmFsOwogCi0JLyogdHJ5IE9ORkkgZm9yIHVua25vdyBjaGlwIG9yIExQICovCisJLyogVHJ5IE9ORkkgZm9yIHVua25vd24gY2hpcCBvciBMUCAqLwogCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9SRUFESUQsIDB4MjAsIC0xKTsKIAlpZiAoY2hpcC0+cmVhZF9ieXRlKG10ZCkgIT0gJ08nIHx8IGNoaXAtPnJlYWRfYnl0ZShtdGQpICE9ICdOJyB8fAogCQljaGlwLT5yZWFkX2J5dGUobXRkKSAhPSAnRicgfHwgY2hpcC0+cmVhZF9ieXRlKG10ZCkgIT0gJ0knKQogCQlyZXR1cm4gMDsKIAotCXByaW50ayhLRVJOX0lORk8gIk9ORkkgZmxhc2ggZGV0ZWN0ZWRcbiIpOworCXByX2luZm8oIk9ORkkgZmxhc2ggZGV0ZWN0ZWRcbiIpOwogCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9QQVJBTSwgMCwgLTEpOwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJY2hpcC0+cmVhZF9idWYobXRkLCAodWludDhfdCAqKXAsIHNpemVvZigqcCkpOwogCQlpZiAob25maV9jcmMxNihPTkZJX0NSQ19CQVNFLCAodWludDhfdCAqKXAsIDI1NCkgPT0KIAkJCQlsZTE2X3RvX2NwdShwLT5jcmMpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJPTkZJIHBhcmFtIHBhZ2UgJWQgdmFsaWRcbiIsIGkpOworCQkJcHJfaW5mbygiT05GSSBwYXJhbSBwYWdlICVkIHZhbGlkXG4iLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjg1NSw3ICsyODcxLDcgQEAKIAlpZiAoaSA9PSAzKQogCQlyZXR1cm4gMDsKIAotCS8qIGNoZWNrIHZlcnNpb24gKi8KKwkvKiBDaGVjayB2ZXJzaW9uICovCiAJdmFsID0gbGUxNl90b19jcHUocC0+cmV2aXNpb24pOwogCWlmICh2YWwgJiAoMSA8PCA1KSkKIAkJY2hpcC0+b25maV92ZXJzaW9uID0gMjM7CkBAIC0yODcxLDggKzI4ODcsNyBAQAogCQljaGlwLT5vbmZpX3ZlcnNpb24gPSAwOwogCiAJaWYgKCFjaGlwLT5vbmZpX3ZlcnNpb24pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVuc3VwcG9ydGVkIE9ORkkgdmVyc2lvbjogJWRcbiIsCi0JCQkJCQkJCV9fZnVuY19fLCB2YWwpOworCQlwcl9pbmZvKCIlczogdW5zdXBwb3J0ZWQgT05GSSB2ZXJzaW9uOiAlZFxuIiwgX19mdW5jX18sIHZhbCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjg4NCw5ICsyODk5LDkgQEAKIAltdGQtPmVyYXNlc2l6ZSA9IGxlMzJfdG9fY3B1KHAtPnBhZ2VzX3Blcl9ibG9jaykgKiBtdGQtPndyaXRlc2l6ZTsKIAltdGQtPm9vYnNpemUgPSBsZTE2X3RvX2NwdShwLT5zcGFyZV9ieXRlc19wZXJfcGFnZSk7CiAJY2hpcC0+Y2hpcHNpemUgPSAodWludDY0X3QpbGUzMl90b19jcHUocC0+YmxvY2tzX3Blcl9sdW4pICogbXRkLT5lcmFzZXNpemU7Ci0JYnVzdyA9IDA7CisJKmJ1c3cgPSAwOwogCWlmIChsZTE2X3RvX2NwdShwLT5mZWF0dXJlcykgJiAxKQotCQlidXN3ID0gTkFORF9CVVNXSURUSF8xNjsKKwkJKmJ1c3cgPSBOQU5EX0JVU1dJRFRIXzE2OwogCiAJY2hpcC0+b3B0aW9ucyAmPSB+TkFORF9DSElQT1BUSU9OU19NU0s7CiAJY2hpcC0+b3B0aW9ucyB8PSAoTkFORF9OT19SRUFEUkRZIHwKQEAgLTI4OTYsNyArMjkxMSw3IEBACiB9CiAKIC8qCi0gKiBHZXQgdGhlIGZsYXNoIGFuZCBtYW51ZmFjdHVyZXIgaWQgYW5kIGxvb2t1cCBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQKKyAqIEdldCB0aGUgZmxhc2ggYW5kIG1hbnVmYWN0dXJlciBpZCBhbmQgbG9va3VwIGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZC4KICAqLwogc3RhdGljIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAqbmFuZF9nZXRfZmxhc2hfdHlwZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKIAkJCQkJCSAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKQEAgLTI5MTMsNyArMjkyOCw3IEBACiAKIAkvKgogCSAqIFJlc2V0IHRoZSBjaGlwLCByZXF1aXJlZCBieSBzb21lIGNoaXBzIChlLmcuIE1pY3JvbiBNVDI5RnhHeHh4eHgpCi0JICogYWZ0ZXIgcG93ZXItdXAKKwkgKiBhZnRlciBwb3dlci11cC4KIAkgKi8KIAljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIC0xLCAtMSk7CiAKQEAgLTI5MjQsNyArMjkzOSw4IEBACiAJKm1hZl9pZCA9IGNoaXAtPnJlYWRfYnl0ZShtdGQpOwogCSpkZXZfaWQgPSBjaGlwLT5yZWFkX2J5dGUobXRkKTsKIAotCS8qIFRyeSBhZ2FpbiB0byBtYWtlIHN1cmUsIGFzIHNvbWUgc3lzdGVtcyB0aGUgYnVzLWhvbGQgb3Igb3RoZXIKKwkvKgorCSAqIFRyeSBhZ2FpbiB0byBtYWtlIHN1cmUsIGFzIHNvbWUgc3lzdGVtcyB0aGUgYnVzLWhvbGQgb3Igb3RoZXIKIAkgKiBpbnRlcmZhY2UgY29uY2VybnMgY2FuIGNhdXNlIHJhbmRvbSBkYXRhIHdoaWNoIGxvb2tzIGxpa2UgYQogCSAqIHBvc3NpYmx5IGNyZWRpYmxlIE5BTkQgZmxhc2ggdG8gYXBwZWFyLiBJZiB0aGUgdHdvIHJlc3VsdHMgZG8KIAkgKiBub3QgbWF0Y2gsIGlnbm9yZSB0aGUgZGV2aWNlIGNvbXBsZXRlbHkuCkBAIC0yOTM2LDkgKzI5NTIsOSBAQAogCQlpZF9kYXRhW2ldID0gY2hpcC0+cmVhZF9ieXRlKG10ZCk7CiAKIAlpZiAoaWRfZGF0YVswXSAhPSAqbWFmX2lkIHx8IGlkX2RhdGFbMV0gIT0gKmRldl9pZCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogc2Vjb25kIElEIHJlYWQgZGlkIG5vdCBtYXRjaCAiCi0JCSAgICAgICAiJTAyeCwlMDJ4IGFnYWluc3QgJTAyeCwlMDJ4XG4iLCBfX2Z1bmNfXywKLQkJICAgICAgICptYWZfaWQsICpkZXZfaWQsIGlkX2RhdGFbMF0sIGlkX2RhdGFbMV0pOworCQlwcl9pbmZvKCIlczogc2Vjb25kIElEIHJlYWQgZGlkIG5vdCBtYXRjaCAiCisJCQkiJTAyeCwlMDJ4IGFnYWluc3QgJTAyeCwlMDJ4XG4iLCBfX2Z1bmNfXywKKwkJCSptYWZfaWQsICpkZXZfaWQsIGlkX2RhdGFbMF0sIGlkX2RhdGFbMV0pOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CiAKQEAgLTI5NTIsNyArMjk2OCw3IEBACiAJY2hpcC0+b25maV92ZXJzaW9uID0gMDsKIAlpZiAoIXR5cGUtPm5hbWUgfHwgIXR5cGUtPnBhZ2VzaXplKSB7CiAJCS8qIENoZWNrIGlzIGNoaXAgaXMgT05GSSBjb21wbGlhbnQgKi8KLQkJcmV0ID0gbmFuZF9mbGFzaF9kZXRlY3Rfb25maShtdGQsIGNoaXAsIGJ1c3cpOworCQlyZXQgPSBuYW5kX2ZsYXNoX2RldGVjdF9vbmZpKG10ZCwgY2hpcCwgJmJ1c3cpOwogCQlpZiAocmV0KQogCQkJZ290byBpZGVudF9kb25lOwogCX0KQEAgLTI5NzMsNyArMjk4OSw3IEBACiAJY2hpcC0+Y2hpcHNpemUgPSAodWludDY0X3QpdHlwZS0+Y2hpcHNpemUgPDwgMjA7CiAKIAlpZiAoIXR5cGUtPnBhZ2VzaXplICYmIGNoaXAtPmluaXRfc2l6ZSkgewotCQkvKiBzZXQgdGhlIHBhZ2VzaXplLCBvb2JzaXplLCBlcmFzZXNpemUgYnkgdGhlIGRyaXZlciovCisJCS8qIFNldCB0aGUgcGFnZXNpemUsIG9vYnNpemUsIGVyYXNlc2l6ZSBieSB0aGUgZHJpdmVyICovCiAJCWJ1c3cgPSBjaGlwLT5pbml0X3NpemUobXRkLCBjaGlwLCBpZF9kYXRhKTsKIAl9IGVsc2UgaWYgKCF0eXBlLT5wYWdlc2l6ZSkgewogCQlpbnQgZXh0aWQ7CkBAIC0zMDMzLDcgKzMwNDksNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJLyoKLQkJICogT2xkIGRldmljZXMgaGF2ZSBjaGlwIGRhdGEgaGFyZGNvZGVkIGluIHRoZSBkZXZpY2UgaWQgdGFibGUKKwkJICogT2xkIGRldmljZXMgaGF2ZSBjaGlwIGRhdGEgaGFyZGNvZGVkIGluIHRoZSBkZXZpY2UgaWQgdGFibGUuCiAJCSAqLwogCQltdGQtPmVyYXNlc2l6ZSA9IHR5cGUtPmVyYXNlc2l6ZTsKIAkJbXRkLT53cml0ZXNpemUgPSB0eXBlLT5wYWdlc2l6ZTsKQEAgLTMwNDMsNyArMzA1OSw3IEBACiAJCS8qCiAJCSAqIENoZWNrIGZvciBTcGFuc2lvbi9BTUQgSUQgKyByZXBlYXRpbmcgNXRoLCA2dGggYnl0ZSBzaW5jZQogCQkgKiBzb21lIFNwYW5zaW9uIGNoaXBzIGhhdmUgZXJhc2VzaXplIHRoYXQgY29uZmxpY3RzIHdpdGggc2l6ZQotCQkgKiBsaXN0ZWQgaW4gbmFuZF9pZHMgdGFibGUKKwkJICogbGlzdGVkIGluIG5hbmRfaWRzIHRhYmxlLgogCQkgKiBEYXRhIHNoZWV0ICg1IGJ5dGUgSUQpOiBTcGFuc2lvbiBTMzBNTC1QIE9STkFORCAocC4zOSkKIAkJICovCiAJCWlmICgqbWFmX2lkID09IE5BTkRfTUZSX0FNRCAmJiBpZF9kYXRhWzRdICE9IDB4MDAgJiYKQEAgLTMwNTcsMTUgKzMwNzMsMTYgQEAKIAljaGlwLT5vcHRpb25zICY9IH5OQU5EX0NISVBPUFRJT05TX01TSzsKIAljaGlwLT5vcHRpb25zIHw9IHR5cGUtPm9wdGlvbnMgJiBOQU5EX0NISVBPUFRJT05TX01TSzsKIAotCS8qIENoZWNrIGlmIGNoaXAgaXMgYSBub3QgYSBzYW1zdW5nIGRldmljZS4gRG8gbm90IGNsZWFyIHRoZQotCSAqIG9wdGlvbnMgZm9yIGNoaXBzIHdoaWNoIGFyZSBub3QgaGF2aW5nIGFuIGV4dGVuZGVkIGlkLgorCS8qCisJICogQ2hlY2sgaWYgY2hpcCBpcyBub3QgYSBTYW1zdW5nIGRldmljZS4gRG8gbm90IGNsZWFyIHRoZQorCSAqIG9wdGlvbnMgZm9yIGNoaXBzIHdoaWNoIGRvIG5vdCBoYXZlIGFuIGV4dGVuZGVkIGlkLgogCSAqLwogCWlmICgqbWFmX2lkICE9IE5BTkRfTUZSX1NBTVNVTkcgJiYgIXR5cGUtPnBhZ2VzaXplKQogCQljaGlwLT5vcHRpb25zICY9IH5OQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsKIGlkZW50X2RvbmU6CiAKIAkvKgotCSAqIFNldCBjaGlwIGFzIGEgZGVmYXVsdC4gQm9hcmQgZHJpdmVycyBjYW4gb3ZlcnJpZGUgaXQsIGlmIG5lY2Vzc2FyeQorCSAqIFNldCBjaGlwIGFzIGEgZGVmYXVsdC4gQm9hcmQgZHJpdmVycyBjYW4gb3ZlcnJpZGUgaXQsIGlmIG5lY2Vzc2FyeS4KIAkgKi8KIAljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fQVVUT0lOQ1I7CiAKQEAgLTMwNzcsMjEgKzMwOTQsMjEgQEAKIAogCS8qCiAJICogQ2hlY2ssIGlmIGJ1c3dpZHRoIGlzIGNvcnJlY3QuIEhhcmR3YXJlIGRyaXZlcnMgc2hvdWxkIHNldAotCSAqIGNoaXAgY29ycmVjdCAhCisJICogY2hpcCBjb3JyZWN0IQogCSAqLwogCWlmIChidXN3ICE9IChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCi0JCSAgICAgICAiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsICptYWZfaWQsCi0JCSAgICAgICAqZGV2X2lkLCBuYW5kX21hbnVmX2lkc1ttYWZfaWR4XS5uYW1lLCBtdGQtPm5hbWUpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJOQU5EIGJ1cyB3aWR0aCAlZCBpbnN0ZWFkICVkIGJpdFxuIiwKLQkJICAgICAgIChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgPyAxNiA6IDgsCi0JCSAgICAgICBidXN3ID8gMTYgOiA4KTsKKwkJcHJfaW5mbygiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCisJCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsICptYWZfaWQsCisJCQkqZGV2X2lkLCBuYW5kX21hbnVmX2lkc1ttYWZfaWR4XS5uYW1lLCBtdGQtPm5hbWUpOworCQlwcl93YXJuKCJOQU5EIGJ1cyB3aWR0aCAlZCBpbnN0ZWFkICVkIGJpdFxuIiwKKwkJCSAgIChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgPyAxNiA6IDgsCisJCQkgICBidXN3ID8gMTYgOiA4KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCiAJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIHNoaWZ0IGZyb20gdGhlIHBhZ2Ugc2l6ZSAqLwogCWNoaXAtPnBhZ2Vfc2hpZnQgPSBmZnMobXRkLT53cml0ZXNpemUpIC0gMTsKLQkvKiBDb252ZXJ0IGNoaXBzaXplIHRvIG51bWJlciBvZiBwYWdlcyBwZXIgY2hpcCAtMS4gKi8KKwkvKiBDb252ZXJ0IGNoaXBzaXplIHRvIG51bWJlciBvZiBwYWdlcyBwZXIgY2hpcCAtMSAqLwogCWNoaXAtPnBhZ2VtYXNrID0gKGNoaXAtPmNoaXBzaXplID4+IGNoaXAtPnBhZ2Vfc2hpZnQpIC0gMTsKIAogCWNoaXAtPmJidF9lcmFzZV9zaGlmdCA9IGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQgPQpAQCAtMzEyMSw3ICszMTM4LDcgQEAKIAlpZiAoKGNoaXAtPmNlbGxpbmZvICYgTkFORF9DSV9DRUxMVFlQRV9NU0spICYmCiAJCQkoKm1hZl9pZCA9PSBOQU5EX01GUl9TQU1TVU5HIHx8CiAJCQkgKm1hZl9pZCA9PSBOQU5EX01GUl9IWU5JWCkpCi0JCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9CQlRfU0NBTkxBU1RQQUdFOworCQljaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9TQ0FOTEFTVFBBR0U7CiAJZWxzZSBpZiAoKCEoY2hpcC0+Y2VsbGluZm8gJiBOQU5EX0NJX0NFTExUWVBFX01TSykgJiYKIAkJCQkoKm1hZl9pZCA9PSBOQU5EX01GUl9TQU1TVU5HIHx8CiAJCQkJICptYWZfaWQgPT0gTkFORF9NRlJfSFlOSVggfHwKQEAgLTMxMjksMTcgKzMxNDYsNyBAQAogCQkJCSAqbWFmX2lkID09IE5BTkRfTUZSX0FNRCkpIHx8CiAJCQkobXRkLT53cml0ZXNpemUgPT0gMjA0OCAmJgogCQkJICptYWZfaWQgPT0gTkFORF9NRlJfTUlDUk9OKSkKLQkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX0JCVF9TQ0FOMk5EUEFHRTsKLQotCS8qCi0JICogTnVtb255eC9TVCAySyBwYWdlcywgeDggYnVzIHVzZSBCT1RIIGJ5dGUgMSBhbmQgNgotCSAqLwotCWlmICghKGJ1c3cgJiBOQU5EX0JVU1dJRFRIXzE2KSAmJgotCQkJKm1hZl9pZCA9PSBOQU5EX01GUl9TVE1JQ1JPICYmCi0JCQltdGQtPndyaXRlc2l6ZSA9PSAyMDQ4KSB7Ci0JCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9CQlRfU0NBTkJZVEUxQU5ENjsKLQkJY2hpcC0+YmFkYmxvY2twb3MgPSAwOwotCX0KKwkJY2hpcC0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfU0NBTjJORFBBR0U7CiAKIAkvKiBDaGVjayBmb3IgQU5EIGNoaXBzIHdpdGggNCBwYWdlIHBsYW5lcyAqLwogCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF80UEFHRV9BUlJBWSkKQEAgLTMxNDcsMTIgKzMxNTQsMTEgQEAKIAllbHNlCiAJCWNoaXAtPmVyYXNlX2NtZCA9IHNpbmdsZV9lcmFzZV9jbWQ7CiAKLQkvKiBEbyBub3QgcmVwbGFjZSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgZnVuY3Rpb24gISAqLworCS8qIERvIG5vdCByZXBsYWNlIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBmdW5jdGlvbiEgKi8KIAlpZiAobXRkLT53cml0ZXNpemUgPiA1MTIgJiYgY2hpcC0+Y21kZnVuYyA9PSBuYW5kX2NvbW1hbmQpCiAJCWNoaXAtPmNtZGZ1bmMgPSBuYW5kX2NvbW1hbmRfbHA7CiAKLQkvKiBUT0RPIG9uZmkgZmxhc2ggbmFtZSAqLwotCXByaW50ayhLRVJOX0lORk8gIk5BTkQgZGV2aWNlOiBNYW51ZmFjdHVyZXIgSUQ6IgorCXByX2luZm8oIk5BTkQgZGV2aWNlOiBNYW51ZmFjdHVyZXIgSUQ6IgogCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsICptYWZfaWQsICpkZXZfaWQsCiAJCW5hbmRfbWFudWZfaWRzW21hZl9pZHhdLm5hbWUsCiAJCWNoaXAtPm9uZmlfdmVyc2lvbiA/IGNoaXAtPm9uZmlfcGFyYW1zLm1vZGVsIDogdHlwZS0+bmFtZSk7CkBAIC0zMTYyLDEyICszMTY4LDEyIEBACiAKIC8qKgogICogbmFuZF9zY2FuX2lkZW50IC0gW05BTkQgSW50ZXJmYWNlXSBTY2FuIGZvciB0aGUgTkFORCBkZXZpY2UKLSAqIEBtdGQ6CSAgICAgTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBtYXhjaGlwczoJICAgICBOdW1iZXIgb2YgY2hpcHMgdG8gc2NhbiBmb3IKLSAqIEB0YWJsZToJICAgICBBbHRlcm5hdGl2ZSBOQU5EIElEIHRhYmxlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1heGNoaXBzOiBudW1iZXIgb2YgY2hpcHMgdG8gc2NhbiBmb3IKKyAqIEB0YWJsZTogYWx0ZXJuYXRpdmUgTkFORCBJRCB0YWJsZQogICoKLSAqIFRoaXMgaXMgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZSBub3JtYWwgbmFuZF9zY2FuKCkgZnVuY3Rpb24uIEl0Ci0gKiByZWFkcyB0aGUgZmxhc2ggSUQgYW5kIHNldHMgdXAgTVREIGZpZWxkcyBhY2NvcmRpbmdseS4KKyAqIFRoaXMgaXMgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZSBub3JtYWwgbmFuZF9zY2FuKCkgZnVuY3Rpb24uIEl0IHJlYWRzIHRoZQorICogZmxhc2ggSUQgYW5kIHNldHMgdXAgTVREIGZpZWxkcyBhY2NvcmRpbmdseS4KICAqCiAgKiBUaGUgbXRkLT5vd25lciBmaWVsZCBtdXN0IGJlIHNldCB0byB0aGUgbW9kdWxlIG9mIHRoZSBjYWxsZXIuCiAgKi8KQEAgLTMxODksNyArMzE5NSw3IEBACiAKIAlpZiAoSVNfRVJSKHR5cGUpKSB7CiAJCWlmICghKGNoaXAtPm9wdGlvbnMgJiBOQU5EX1NDQU5fU0lMRU5UX05PREVWKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIE5BTkQgZGV2aWNlIGZvdW5kLlxuIik7CisJCQlwcl93YXJuKCJObyBOQU5EIGRldmljZSBmb3VuZFxuIik7CiAJCWNoaXAtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOwogCQlyZXR1cm4gUFRSX0VSUih0eXBlKTsKIAl9CkBAIC0zMjA3LDcgKzMyMTMsNyBAQAogCQkJYnJlYWs7CiAJfQogCWlmIChpID4gMSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJWQgTkFORCBjaGlwcyBkZXRlY3RlZFxuIiwgaSk7CisJCXByX2luZm8oIiVkIE5BTkQgY2hpcHMgZGV0ZWN0ZWRcbiIsIGkpOwogCiAJLyogU3RvcmUgdGhlIG51bWJlciBvZiBjaGlwcyBhbmQgY2FsYyB0b3RhbCBzaXplIGZvciBtdGQgKi8KIAljaGlwLT5udW1jaGlwcyA9IGk7CkBAIC0zMjIwLDExICszMjI2LDExIEBACiAKIC8qKgogICogbmFuZF9zY2FuX3RhaWwgLSBbTkFORCBJbnRlcmZhY2VdIFNjYW4gZm9yIHRoZSBOQU5EIGRldmljZQotICogQG10ZDoJICAgIE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIFRoaXMgaXMgdGhlIHNlY29uZCBwaGFzZSBvZiB0aGUgbm9ybWFsIG5hbmRfc2NhbigpIGZ1bmN0aW9uLiBJdAotICogZmlsbHMgb3V0IGFsbCB0aGUgdW5pbml0aWFsaXplZCBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHRoZSBkZWZhdWx0cwotICogYW5kIHNjYW5zIGZvciBhIGJhZCBibG9jayB0YWJsZSBpZiBhcHByb3ByaWF0ZS4KKyAqIFRoaXMgaXMgdGhlIHNlY29uZCBwaGFzZSBvZiB0aGUgbm9ybWFsIG5hbmRfc2NhbigpIGZ1bmN0aW9uLiBJdCBmaWxscyBvdXQKKyAqIGFsbCB0aGUgdW5pbml0aWFsaXplZCBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHRoZSBkZWZhdWx0cyBhbmQgc2NhbnMgZm9yIGEKKyAqIGJhZCBibG9jayB0YWJsZSBpZiBhcHByb3ByaWF0ZS4KICAqLwogaW50IG5hbmRfc2Nhbl90YWlsKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewpAQCAtMzI0MCw3ICszMjQ2LDcgQEAKIAljaGlwLT5vb2JfcG9pID0gY2hpcC0+YnVmZmVycy0+ZGF0YWJ1ZiArIG10ZC0+d3JpdGVzaXplOwogCiAJLyoKLQkgKiBJZiBubyBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgaXMgZ2l2ZW4sIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBvbmUKKwkgKiBJZiBubyBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgaXMgZ2l2ZW4sIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBvbmUuCiAJICovCiAJaWYgKCFjaGlwLT5lY2MubGF5b3V0ICYmIChjaGlwLT5lY2MubW9kZSAhPSBOQU5EX0VDQ19TT0ZUX0JDSCkpIHsKIAkJc3dpdGNoIChtdGQtPm9vYnNpemUpIHsKQEAgLTMyNTcsOCArMzI2Myw4IEBACiAJCQljaGlwLT5lY2MubGF5b3V0ID0gJm5hbmRfb29iXzEyODsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm8gb29iIHNjaGVtZSBkZWZpbmVkIGZvciAiCi0JCQkgICAgICAgIm9vYnNpemUgJWRcbiIsIG10ZC0+b29ic2l6ZSk7CisJCQlwcl93YXJuKCJObyBvb2Igc2NoZW1lIGRlZmluZWQgZm9yIG9vYnNpemUgJWRcbiIsCisJCQkJICAgbXRkLT5vb2JzaXplKTsKIAkJCUJVRygpOwogCQl9CiAJfQpAQCAtMzI2Nyw3ICszMjczLDcgQEAKIAkJY2hpcC0+d3JpdGVfcGFnZSA9IG5hbmRfd3JpdGVfcGFnZTsKIAogCS8qCi0JICogY2hlY2sgRUNDIG1vZGUsIGRlZmF1bHQgdG8gc29mdHdhcmUgaWYgM2J5dGUvNTEyYnl0ZSBoYXJkd2FyZSBFQ0MgaXMKKwkgKiBDaGVjayBFQ0MgbW9kZSwgZGVmYXVsdCB0byBzb2Z0d2FyZSBpZiAzYnl0ZS81MTJieXRlIGhhcmR3YXJlIEVDQyBpcwogCSAqIHNlbGVjdGVkIGFuZCB3ZSBoYXZlIDI1NiBieXRlIHBhZ2VzaXplIGZhbGxiYWNrIHRvIHNvZnR3YXJlIEVDQwogCSAqLwogCkBAIC0zMjc2LDE1ICszMjgyLDE1IEBACiAJCS8qIFNpbWlsYXIgdG8gTkFORF9FQ0NfSFcsIGJ1dCBhIHNlcGFyYXRlIHJlYWRfcGFnZSBoYW5kbGUgKi8KIAkJaWYgKCFjaGlwLT5lY2MuY2FsY3VsYXRlIHx8ICFjaGlwLT5lY2MuY29ycmVjdCB8fAogCQkgICAgICFjaGlwLT5lY2MuaHdjdGwpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIEVDQyBmdW5jdGlvbnMgc3VwcGxpZWQ7ICIKLQkJCSAgICAgICAiSGFyZHdhcmUgRUNDIG5vdCBwb3NzaWJsZVxuIik7CisJCQlwcl93YXJuKCJObyBFQ0MgZnVuY3Rpb25zIHN1cHBsaWVkOyAiCisJCQkJICAgImhhcmR3YXJlIEVDQyBub3QgcG9zc2libGVcbiIpOwogCQkJQlVHKCk7CiAJCX0KIAkJaWYgKCFjaGlwLT5lY2MucmVhZF9wYWdlKQogCQkJY2hpcC0+ZWNjLnJlYWRfcGFnZSA9IG5hbmRfcmVhZF9wYWdlX2h3ZWNjX29vYl9maXJzdDsKIAogCWNhc2UgTkFORF9FQ0NfSFc6Ci0JCS8qIFVzZSBzdGFuZGFyZCBod2VjYyByZWFkIHBhZ2UgZnVuY3Rpb24gPyAqLworCQkvKiBVc2Ugc3RhbmRhcmQgaHdlY2MgcmVhZCBwYWdlIGZ1bmN0aW9uPyAqLwogCQlpZiAoIWNoaXAtPmVjYy5yZWFkX3BhZ2UpCiAJCQljaGlwLT5lY2MucmVhZF9wYWdlID0gbmFuZF9yZWFkX3BhZ2VfaHdlY2M7CiAJCWlmICghY2hpcC0+ZWNjLndyaXRlX3BhZ2UpCkBAIC0zMzA1LDExICszMzExLDExIEBACiAJCSAgICAgY2hpcC0+ZWNjLnJlYWRfcGFnZSA9PSBuYW5kX3JlYWRfcGFnZV9od2VjYyB8fAogCQkgICAgICFjaGlwLT5lY2Mud3JpdGVfcGFnZSB8fAogCQkgICAgIGNoaXAtPmVjYy53cml0ZV9wYWdlID09IG5hbmRfd3JpdGVfcGFnZV9od2VjYykpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIEVDQyBmdW5jdGlvbnMgc3VwcGxpZWQ7ICIKLQkJCSAgICAgICAiSGFyZHdhcmUgRUNDIG5vdCBwb3NzaWJsZVxuIik7CisJCQlwcl93YXJuKCJObyBFQ0MgZnVuY3Rpb25zIHN1cHBsaWVkOyAiCisJCQkJICAgImhhcmR3YXJlIEVDQyBub3QgcG9zc2libGVcbiIpOwogCQkJQlVHKCk7CiAJCX0KLQkJLyogVXNlIHN0YW5kYXJkIHN5bmRyb21lIHJlYWQvd3JpdGUgcGFnZSBmdW5jdGlvbiA/ICovCisJCS8qIFVzZSBzdGFuZGFyZCBzeW5kcm9tZSByZWFkL3dyaXRlIHBhZ2UgZnVuY3Rpb24/ICovCiAJCWlmICghY2hpcC0+ZWNjLnJlYWRfcGFnZSkKIAkJCWNoaXAtPmVjYy5yZWFkX3BhZ2UgPSBuYW5kX3JlYWRfcGFnZV9zeW5kcm9tZTsKIAkJaWYgKCFjaGlwLT5lY2Mud3JpdGVfcGFnZSkKQEAgLTMzMjUsOSArMzMzMSw5IEBACiAKIAkJaWYgKG10ZC0+d3JpdGVzaXplID49IGNoaXAtPmVjYy5zaXplKQogCQkJYnJlYWs7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVkIGJ5dGUgSFcgRUNDIG5vdCBwb3NzaWJsZSBvbiAiCi0JCSAgICAgICAiJWQgYnl0ZSBwYWdlIHNpemUsIGZhbGxiYWNrIHRvIFNXIEVDQ1xuIiwKLQkJICAgICAgIGNoaXAtPmVjYy5zaXplLCBtdGQtPndyaXRlc2l6ZSk7CisJCXByX3dhcm4oIiVkIGJ5dGUgSFcgRUNDIG5vdCBwb3NzaWJsZSBvbiAiCisJCQkgICAiJWQgYnl0ZSBwYWdlIHNpemUsIGZhbGxiYWNrIHRvIFNXIEVDQ1xuIiwKKwkJCSAgIGNoaXAtPmVjYy5zaXplLCBtdGQtPndyaXRlc2l6ZSk7CiAJCWNoaXAtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKIAogCWNhc2UgTkFORF9FQ0NfU09GVDoKQEAgLTMzNDcsNyArMzM1Myw3IEBACiAKIAljYXNlIE5BTkRfRUNDX1NPRlRfQkNIOgogCQlpZiAoIW10ZF9uYW5kX2hhc19iY2goKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ09ORklHX01URF9FQ0NfQkNIIG5vdCBlbmFibGVkXG4iKTsKKwkJCXByX3dhcm4oIkNPTkZJR19NVERfRUNDX0JDSCBub3QgZW5hYmxlZFxuIik7CiAJCQlCVUcoKTsKIAkJfQogCQljaGlwLT5lY2MuY2FsY3VsYXRlID0gbmFuZF9iY2hfY2FsY3VsYXRlX2VjYzsKQEAgLTMzNjIsOCArMzM2OCw4IEBACiAJCS8qCiAJCSAqIEJvYXJkIGRyaXZlciBzaG91bGQgc3VwcGx5IGVjYy5zaXplIGFuZCBlY2MuYnl0ZXMgdmFsdWVzIHRvCiAJCSAqIHNlbGVjdCBob3cgbWFueSBiaXRzIGFyZSBjb3JyZWN0YWJsZTsgc2VlIG5hbmRfYmNoX2luaXQoKQotCQkgKiBmb3IgZGV0YWlscy4KLQkJICogT3RoZXJ3aXNlLCBkZWZhdWx0IHRvIDQgYml0cyBmb3IgbGFyZ2UgcGFnZSBkZXZpY2VzCisJCSAqIGZvciBkZXRhaWxzLiBPdGhlcndpc2UsIGRlZmF1bHQgdG8gNCBiaXRzIGZvciBsYXJnZSBwYWdlCisJCSAqIGRldmljZXMuCiAJCSAqLwogCQlpZiAoIWNoaXAtPmVjYy5zaXplICYmIChtdGQtPm9vYnNpemUgPj0gNjQpKSB7CiAJCQljaGlwLT5lY2Muc2l6ZSA9IDUxMjsKQEAgLTMzNzQsMTQgKzMzODAsMTQgQEAKIAkJCQkJICAgICAgIGNoaXAtPmVjYy5ieXRlcywKIAkJCQkJICAgICAgICZjaGlwLT5lY2MubGF5b3V0KTsKIAkJaWYgKCFjaGlwLT5lY2MucHJpdikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQkNIIEVDQyBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKKwkJCXByX3dhcm4oIkJDSCBFQ0MgaW5pdGlhbGl6YXRpb24gZmFpbGVkIVxuIik7CiAJCQlCVUcoKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgTkFORF9FQ0NfTk9ORToKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkFORF9FQ0NfTk9ORSBzZWxlY3RlZCBieSBib2FyZCBkcml2ZXIuICIKLQkJICAgICAgICJUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCAhIVxuIik7CisJCXByX3dhcm4oIk5BTkRfRUNDX05PTkUgc2VsZWN0ZWQgYnkgYm9hcmQgZHJpdmVyLiAiCisJCQkgICAiVGhpcyBpcyBub3QgcmVjb21tZW5kZWQhXG4iKTsKIAkJY2hpcC0+ZWNjLnJlYWRfcGFnZSA9IG5hbmRfcmVhZF9wYWdlX3JhdzsKIAkJY2hpcC0+ZWNjLndyaXRlX3BhZ2UgPSBuYW5kX3dyaXRlX3BhZ2VfcmF3OwogCQljaGlwLT5lY2MucmVhZF9vb2IgPSBuYW5kX3JlYWRfb29iX3N0ZDsKQEAgLTMzOTMsMTQgKzMzOTksMTkgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIE5BTkRfRUNDX01PREUgJWRcbiIsCi0JCSAgICAgICBjaGlwLT5lY2MubW9kZSk7CisJCXByX3dhcm4oIkludmFsaWQgTkFORF9FQ0NfTU9ERSAlZFxuIiwgY2hpcC0+ZWNjLm1vZGUpOwogCQlCVUcoKTsKIAl9CiAKKwkvKiBGb3IgbWFueSBzeXN0ZW1zLCB0aGUgc3RhbmRhcmQgT09CIHdyaXRlIGFsc28gd29ya3MgZm9yIHJhdyAqLworCWlmICghY2hpcC0+ZWNjLnJlYWRfb29iX3JhdykKKwkJY2hpcC0+ZWNjLnJlYWRfb29iX3JhdyA9IGNoaXAtPmVjYy5yZWFkX29vYjsKKwlpZiAoIWNoaXAtPmVjYy53cml0ZV9vb2JfcmF3KQorCQljaGlwLT5lY2Mud3JpdGVfb29iX3JhdyA9IGNoaXAtPmVjYy53cml0ZV9vb2I7CisKIAkvKgogCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciBhIGNsaWVudCB0byBwbGFjZSBkYXRhIGludG8KLQkgKiB0aGUgb3V0IG9mIGJhbmQgYXJlYQorCSAqIHRoZSBvdXQgb2YgYmFuZCBhcmVhLgogCSAqLwogCWNoaXAtPmVjYy5sYXlvdXQtPm9vYmF2YWlsID0gMDsKIAlmb3IgKGkgPSAwOyBjaGlwLT5lY2MubGF5b3V0LT5vb2JmcmVlW2ldLmxlbmd0aApAQCAtMzQxMSwxOSArMzQyMiwxNiBAQAogCiAJLyoKIAkgKiBTZXQgdGhlIG51bWJlciBvZiByZWFkIC8gd3JpdGUgc3RlcHMgZm9yIG9uZSBwYWdlIGRlcGVuZGluZyBvbiBFQ0MKLQkgKiBtb2RlCisJICogbW9kZS4KIAkgKi8KIAljaGlwLT5lY2Muc3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGNoaXAtPmVjYy5zaXplOwogCWlmIChjaGlwLT5lY2Muc3RlcHMgKiBjaGlwLT5lY2Muc2l6ZSAhPSBtdGQtPndyaXRlc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGVjYyBwYXJhbWV0ZXJzXG4iKTsKKwkJcHJfd2FybigiSW52YWxpZCBFQ0MgcGFyYW1ldGVyc1xuIik7CiAJCUJVRygpOwogCX0KIAljaGlwLT5lY2MudG90YWwgPSBjaGlwLT5lY2Muc3RlcHMgKiBjaGlwLT5lY2MuYnl0ZXM7CiAKLQkvKgotCSAqIEFsbG93IHN1YnBhZ2Ugd3JpdGVzIHVwIHRvIGVjYy5zdGVwcy4gTm90IHBvc3NpYmxlIGZvciBNTEMKLQkgKiBGTEFTSC4KLQkgKi8KKwkvKiBBbGxvdyBzdWJwYWdlIHdyaXRlcyB1cCB0byBlY2Muc3RlcHMuIE5vdCBwb3NzaWJsZSBmb3IgTUxDIGZsYXNoICovCiAJaWYgKCEoY2hpcC0+b3B0aW9ucyAmIE5BTkRfTk9fU1VCUEFHRV9XUklURSkgJiYKIAkgICAgIShjaGlwLT5jZWxsaW5mbyAmIE5BTkRfQ0lfQ0VMTFRZUEVfTVNLKSkgewogCQlzd2l0Y2ggKGNoaXAtPmVjYy5zdGVwcykgewpAQCAtMzQ4MSw5ICszNDg5LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MKG5hbmRfc2Nhbl90YWlsKTsKIAotLyogaXNfbW9kdWxlX3RleHRfYWRkcmVzcygpIGlzbid0IGV4cG9ydGVkLCBhbmQgaXQncyBtb3N0bHkgYSBwb2ludGxlc3MKKy8qCisgKiBpc19tb2R1bGVfdGV4dF9hZGRyZXNzKCkgaXNuJ3QgZXhwb3J0ZWQsIGFuZCBpdCdzIG1vc3RseSBhIHBvaW50bGVzcwogICogdGVzdCBpZiB0aGlzIGlzIGEgbW9kdWxlIF9hbnl3YXlfIC0tIHRoZXknZCBoYXZlIHRvIHRyeSBfcmVhbGx5XyBoYXJkCi0gKiB0byBjYWxsIHVzIGZyb20gaW4ta2VybmVsIGNvZGUgaWYgdGhlIGNvcmUgTkFORCBzdXBwb3J0IGlzIG1vZHVsYXIuICovCisgKiB0byBjYWxsIHVzIGZyb20gaW4ta2VybmVsIGNvZGUgaWYgdGhlIGNvcmUgTkFORCBzdXBwb3J0IGlzIG1vZHVsYXIuCisgKi8KICNpZmRlZiBNT0RVTEUKICNkZWZpbmUgY2FsbGVyX2lzX21vZHVsZSgpICgxKQogI2Vsc2UKQEAgLTM0OTMsMTUgKzM1MDMsMTMgQEAKIAogLyoqCiAgKiBuYW5kX3NjYW4gLSBbTkFORCBJbnRlcmZhY2VdIFNjYW4gZm9yIHRoZSBOQU5EIGRldmljZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBtYXhjaGlwczoJTnVtYmVyIG9mIGNoaXBzIHRvIHNjYW4gZm9yCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1heGNoaXBzOiBudW1iZXIgb2YgY2hpcHMgdG8gc2NhbiBmb3IKICAqCi0gKiBUaGlzIGZpbGxzIG91dCBhbGwgdGhlIHVuaW5pdGlhbGl6ZWQgZnVuY3Rpb24gcG9pbnRlcnMKLSAqIHdpdGggdGhlIGRlZmF1bHRzLgotICogVGhlIGZsYXNoIElEIGlzIHJlYWQgYW5kIHRoZSBtdGQvY2hpcCBzdHJ1Y3R1cmVzIGFyZQotICogZmlsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIFRoZSBtdGQtPm93bmVyIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgb2YgdGhlIGNhbGxlcgotICoKKyAqIFRoaXMgZmlsbHMgb3V0IGFsbCB0aGUgdW5pbml0aWFsaXplZCBmdW5jdGlvbiBwb2ludGVycyB3aXRoIHRoZSBkZWZhdWx0cy4KKyAqIFRoZSBmbGFzaCBJRCBpcyByZWFkIGFuZCB0aGUgbXRkL2NoaXAgc3RydWN0dXJlcyBhcmUgZmlsbGVkIHdpdGggdGhlCisgKiBhcHByb3ByaWF0ZSB2YWx1ZXMuIFRoZSBtdGQtPm93bmVyIGZpZWxkIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgb2YgdGhlCisgKiBjYWxsZXIuCiAgKi8KIGludCBuYW5kX3NjYW4oc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtYXhjaGlwcykKIHsKQEAgLTM1MDksOCArMzUxNyw3IEBACiAKIAkvKiBNYW55IGNhbGxlcnMgZ290IHRoaXMgd3JvbmcsIHNvIGNoZWNrIGZvciBpdCBmb3IgYSB3aGlsZS4uLiAqLwogCWlmICghbXRkLT5vd25lciAmJiBjYWxsZXJfaXNfbW9kdWxlKCkpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXMgY2FsbGVkIHdpdGggTlVMTCBtdGQtPm93bmVyIVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCXByX2NyaXQoIiVzIGNhbGxlZCB3aXRoIE5VTEwgbXRkLT5vd25lciFcbiIsIF9fZnVuY19fKTsKIAkJQlVHKCk7CiAJfQogCkBAIC0zNTIzLDggKzM1MzAsOCBAQAogCiAvKioKICAqIG5hbmRfcmVsZWFzZSAtIFtOQU5EIEludGVyZmFjZV0gRnJlZSByZXNvdXJjZXMgaGVsZCBieSB0aGUgTkFORCBkZXZpY2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0qLworICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqLwogdm9pZCBuYW5kX3JlbGVhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYwppbmRleCBjY2JlYWExLi42OTE0OGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKgogICogV2hlbiBuYW5kX3NjYW5fYmJ0IGlzIGNhbGxlZCwgdGhlbiBpdCB0cmllcyB0byBmaW5kIHRoZSBiYWQgYmxvY2sgdGFibGUKICAqIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9ucyBpbiB0aGUgQkJUIGRlc2NyaXB0b3IocykuIElmIG5vIGZsYXNoIGJhc2VkIEJCVAotICogKE5BTkRfVVNFX0ZMQVNIX0JCVCkgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGRldmljZSBpcyBzY2FubmVkIGZvciBmYWN0b3J5CisgKiAoTkFORF9CQlRfVVNFX0ZMQVNIKSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZGV2aWNlIGlzIHNjYW5uZWQgZm9yIGZhY3RvcnkKICAqIG1hcmtlZCBnb29kIC8gYmFkIGJsb2Nrcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG1lbW9yeSBCQlQuCiAgKiBPbmNlIGEgbmV3IGJhZCBibG9jayBpcyBkaXNjb3ZlcmVkIHRoZW4gdGhlICJmYWN0b3J5IiBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkCiAgKiBvbiB0aGUgZGV2aWNlLgpAQCAtMzYsOSArMzYsOSBAQAogICogVGhlIHRhYmxlIGlzIG1hcmtlZCBpbiB0aGUgT09CIGFyZWEgd2l0aCBhbiBpZGVudCBwYXR0ZXJuIGFuZCBhIHZlcnNpb24KICAqIG51bWJlciB3aGljaCBpbmRpY2F0ZXMgd2hpY2ggb2YgYm90aCB0YWJsZXMgaXMgbW9yZSB1cCB0byBkYXRlLiBJZiB0aGUgTkFORAogICogY29udHJvbGxlciBuZWVkcyB0aGUgY29tcGxldGUgT09CIGFyZWEgZm9yIHRoZSBFQ0MgaW5mb3JtYXRpb24gdGhlbiB0aGUKLSAqIG9wdGlvbiBOQU5EX1VTRV9GTEFTSF9CQlRfTk9fT09CIHNob3VsZCBiZSB1c2VkOiBpdCBtb3ZlcyB0aGUgaWRlbnQgcGF0dGVybgotICogYW5kIHRoZSB2ZXJzaW9uIGJ5dGUgaW50byB0aGUgZGF0YSBhcmVhIGFuZCB0aGUgT09CIGFyZWEgd2lsbCByZW1haW4KLSAqIHVudG91Y2hlZC4KKyAqIG9wdGlvbiBOQU5EX0JCVF9OT19PT0Igc2hvdWxkIGJlIHVzZWQgKGFsb25nIHdpdGggTkFORF9CQlRfVVNFX0ZMQVNILCBvZgorICogY291cnNlKTogaXQgbW92ZXMgdGhlIGlkZW50IHBhdHRlcm4gYW5kIHRoZSB2ZXJzaW9uIGJ5dGUgaW50byB0aGUgZGF0YSBhcmVhCisgKiBhbmQgdGhlIE9PQiBhcmVhIHdpbGwgcmVtYWluIHVudG91Y2hlZC4KICAqCiAgKiBUaGUgdGFibGUgdXNlcyAyIGJpdHMgcGVyIGJsb2NrCiAgKiAxMWI6CQlibG9jayBpcyBnb29kCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBpbnQgY2hlY2tfcGF0dGVybl9ub19vb2IodWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewpAQCAtODAsMTcgKzgxLDE1IEBACiAKIC8qKgogICogY2hlY2tfcGF0dGVybiAtIFtHRU5FUklDXSBjaGVjayBpZiBhIHBhdHRlcm4gaXMgaW4gdGhlIGJ1ZmZlcgotICogQGJ1ZjoJdGhlIGJ1ZmZlciB0byBzZWFyY2gKLSAqIEBsZW46CXRoZSBsZW5ndGggb2YgYnVmZmVyIHRvIHNlYXJjaAotICogQHBhZ2xlbjoJdGhlIHBhZ2VsZW5ndGgKLSAqIEB0ZDoJCXNlYXJjaCBwYXR0ZXJuIGRlc2NyaXB0b3IKKyAqIEBidWY6IHRoZSBidWZmZXIgdG8gc2VhcmNoCisgKiBAbGVuOiB0aGUgbGVuZ3RoIG9mIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEBwYWdsZW46IHRoZSBwYWdlbGVuZ3RoCisgKiBAdGQ6IHNlYXJjaCBwYXR0ZXJuIGRlc2NyaXB0b3IKICAqCi0gKiBDaGVjayBmb3IgYSBwYXR0ZXJuIGF0IHRoZSBnaXZlbiBwbGFjZS4gVXNlZCB0byBzZWFyY2ggYmFkIGJsb2NrCi0gKiB0YWJsZXMgYW5kIGdvb2QgLyBiYWQgYmxvY2sgaWRlbnRpZmllcnMuCi0gKiBJZiB0aGUgU0NBTl9FTVBUWSBvcHRpb24gaXMgc2V0IHRoZW4gY2hlY2ssIGlmIGFsbCBieXRlcyBleGNlcHQgdGhlCi0gKiBwYXR0ZXJuIGFyZWEgY29udGFpbiAweGZmCi0gKgotKi8KKyAqIENoZWNrIGZvciBhIHBhdHRlcm4gYXQgdGhlIGdpdmVuIHBsYWNlLiBVc2VkIHRvIHNlYXJjaCBiYWQgYmxvY2sgdGFibGVzIGFuZAorICogZ29vZCAvIGJhZCBibG9jayBpZGVudGlmaWVycy4gSWYgdGhlIFNDQU5fRU1QVFkgb3B0aW9uIGlzIHNldCB0aGVuIGNoZWNrLCBpZgorICogYWxsIGJ5dGVzIGV4Y2VwdCB0aGUgcGF0dGVybiBhcmVhIGNvbnRhaW4gMHhmZi4KKyAqLwogc3RhdGljIGludCBjaGVja19wYXR0ZXJuKHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IHBhZ2xlbiwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKIAlpbnQgaSwgZW5kID0gMDsKQEAgLTEwOSwzMiArMTA4LDggQEAKIAlwICs9IGVuZDsKIAogCS8qIENvbXBhcmUgdGhlIHBhdHRlcm4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgdGQtPmxlbjsgaSsrKSB7Ci0JCWlmIChwW2ldICE9IHRkLT5wYXR0ZXJuW2ldKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENoZWNrIGJvdGggcG9zaXRpb25zIDEgYW5kIDYgZm9yIHBhdHRlcm4/ICovCi0JaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkJZVEUxQU5ENikgewotCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FORU1QVFkpIHsKLQkJCXAgKz0gdGQtPmxlbjsKLQkJCWVuZCArPSBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUyAtIHRkLT5vZmZzOwotCQkJLyogQ2hlY2sgcmVnaW9uIGJldHdlZW4gcG9zaXRpb25zIDEgYW5kIDYgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUyAtIHRkLT5vZmZzIC0gdGQtPmxlbjsKLQkJCQkJaSsrKSB7Ci0JCQkJaWYgKCpwKysgIT0gMHhmZikKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJcCArPSBOQU5EX1NNQUxMX0JBREJMT0NLX1BPUyAtIHRkLT5vZmZzOwotCQl9Ci0JCS8qIENvbXBhcmUgdGhlIHBhdHRlcm4gKi8KLQkJZm9yIChpID0gMDsgaSA8IHRkLT5sZW47IGkrKykgewotCQkJaWYgKHBbaV0gIT0gdGQtPnBhdHRlcm5baV0pCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorCWlmIChtZW1jbXAocCwgdGQtPnBhdHRlcm4sIHRkLT5sZW4pKQorCQlyZXR1cm4gLTE7CiAKIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FORU1QVFkpIHsKIAkJcCArPSB0ZC0+bGVuOwpAQCAtMTQ5LDE0ICsxMjQsMTMgQEAKIAogLyoqCiAgKiBjaGVja19zaG9ydF9wYXR0ZXJuIC0gW0dFTkVSSUNdIGNoZWNrIGlmIGEgcGF0dGVybiBpcyBpbiB0aGUgYnVmZmVyCi0gKiBAYnVmOgl0aGUgYnVmZmVyIHRvIHNlYXJjaAotICogQHRkOgkJc2VhcmNoIHBhdHRlcm4gZGVzY3JpcHRvcgorICogQGJ1ZjogdGhlIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEB0ZDoJc2VhcmNoIHBhdHRlcm4gZGVzY3JpcHRvcgogICoKLSAqIENoZWNrIGZvciBhIHBhdHRlcm4gYXQgdGhlIGdpdmVuIHBsYWNlLiBVc2VkIHRvIHNlYXJjaCBiYWQgYmxvY2sKLSAqIHRhYmxlcyBhbmQgZ29vZCAvIGJhZCBibG9jayBpZGVudGlmaWVycy4gU2FtZSBhcyBjaGVja19wYXR0ZXJuLCBidXQKLSAqIG5vIG9wdGlvbmFsIGVtcHR5IGNoZWNrCi0gKgotKi8KKyAqIENoZWNrIGZvciBhIHBhdHRlcm4gYXQgdGhlIGdpdmVuIHBsYWNlLiBVc2VkIHRvIHNlYXJjaCBiYWQgYmxvY2sgdGFibGVzIGFuZAorICogZ29vZCAvIGJhZCBibG9jayBpZGVudGlmaWVycy4gU2FtZSBhcyBjaGVja19wYXR0ZXJuLCBidXQgbm8gb3B0aW9uYWwgZW1wdHkKKyAqIGNoZWNrLgorICovCiBzdGF0aWMgaW50IGNoZWNrX3Nob3J0X3BhdHRlcm4odWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQogewogCWludCBpOwpAQCAtMTY3LDIxICsxNDEsMTQgQEAKIAkJaWYgKHBbdGQtPm9mZnMgKyBpXSAhPSB0ZC0+cGF0dGVybltpXSkKIAkJCXJldHVybiAtMTsKIAl9Ci0JLyogTmVlZCB0byBjaGVjayBsb2NhdGlvbiAxIEFORCA2PyAqLwotCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5CWVRFMUFORDYpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRkLT5sZW47IGkrKykgewotCQkJaWYgKHBbTkFORF9TTUFMTF9CQURCTE9DS19QT1MgKyBpXSAhPSB0ZC0+cGF0dGVybltpXSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogYWRkX21hcmtlcl9sZW4gLSBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hcmtlciBpbiBkYXRhIGFyZWEKLSAqIEB0ZDoJCUJCVCBkZXNjcmlwdG9yIHVzZWQgZm9yIGNvbXB1dGF0aW9uCisgKiBAdGQ6IEJCVCBkZXNjcmlwdG9yIHVzZWQgZm9yIGNvbXB1dGF0aW9uCiAgKgotICogVGhlIGxlbmd0aCB3aWxsIGJlIDAgaWYgdGhlIG1hcmtlcmlzIGxvY2F0ZWQgaW4gT09CIGFyZWEuCisgKiBUaGUgbGVuZ3RoIHdpbGwgYmUgMCBpZiB0aGUgbWFya2VyIGlzIGxvY2F0ZWQgaW4gT09CIGFyZWEuCiAgKi8KIHN0YXRpYyB1MzIgYWRkX21hcmtlcl9sZW4oc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKQEAgLTE5OCwzNCArMTY1LDMzIEBACiAKIC8qKgogICogcmVhZF9iYnQgLSBbR0VORVJJQ10gUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIHN0YXJ0aW5nIGZyb20gcGFnZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEBwYWdlOgl0aGUgc3RhcnRpbmcgcGFnZQotICogQG51bToJdGhlIG51bWJlciBvZiBiYnQgZGVzY3JpcHRvcnMgdG8gcmVhZAotICogQHRkOgkJdGhlIGJidCBkZXNjcmlidGlvbiB0YWJsZQotICogQG9mZnM6CW9mZnNldCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogdGVtcG9yYXJ5IGJ1ZmZlcgorICogQHBhZ2U6IHRoZSBzdGFydGluZyBwYWdlCisgKiBAbnVtOiB0aGUgbnVtYmVyIG9mIGJidCBkZXNjcmlwdG9ycyB0byByZWFkCisgKiBAdGQ6IHRoZSBiYnQgZGVzY3JpYnRpb24gdGFibGUKKyAqIEBvZmZzOiBvZmZzZXQgaW4gdGhlIG1lbW9yeSB0YWJsZQogICoKICAqIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZSBzdGFydGluZyBmcm9tIHBhZ2UuCi0gKgogICovCiBzdGF0aWMgaW50IHJlYWRfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBwYWdlLCBpbnQgbnVtLAogCQlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkLCBpbnQgb2ZmcykKIHsKLQlpbnQgcmVzLCBpLCBqLCBhY3QgPSAwOworCWludCByZXMsIHJldCA9IDAsIGksIGosIGFjdCA9IDA7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKIAlzaXplX3QgcmV0bGVuLCBsZW4sIHRvdGxlbjsKIAlsb2ZmX3QgZnJvbTsKIAlpbnQgYml0cyA9IHRkLT5vcHRpb25zICYgTkFORF9CQlRfTlJCSVRTX01TSzsKLQl1aW50OF90IG1zayA9ICh1aW50OF90KSAoKDEgPDwgYml0cykgLSAxKTsKKwl1aW50OF90IG1zayA9ICh1aW50OF90KSgoMSA8PCBiaXRzKSAtIDEpOwogCXUzMiBtYXJrZXJfbGVuOwogCWludCByZXNlcnZlZF9ibG9ja19jb2RlID0gdGQtPnJlc2VydmVkX2Jsb2NrX2NvZGU7CiAKIAl0b3RsZW4gPSAobnVtICogYml0cykgPj4gMzsKIAltYXJrZXJfbGVuID0gYWRkX21hcmtlcl9sZW4odGQpOwotCWZyb20gPSAoKGxvZmZfdCkgcGFnZSkgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwlmcm9tID0gKChsb2ZmX3QpcGFnZSkgPDwgdGhpcy0+cGFnZV9zaGlmdDsKIAogCXdoaWxlICh0b3RsZW4pIHsKLQkJbGVuID0gbWluKHRvdGxlbiwgKHNpemVfdCkgKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KSk7CisJCWxlbiA9IG1pbih0b3RsZW4sIChzaXplX3QpKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KSk7CiAJCWlmIChtYXJrZXJfbGVuKSB7CiAJCQkvKgogCQkJICogSW4gY2FzZSB0aGUgQkJUIG1hcmtlciBpcyBub3QgaW4gdGhlIE9PQiBhcmVhIGl0CkBAIC0yMzcsMTEgKzIwMywxOCBAQAogCQl9CiAJCXJlcyA9IG10ZC0+cmVhZChtdGQsIGZyb20sIGxlbiwgJnJldGxlbiwgYnVmKTsKIAkJaWYgKHJlcyA8IDApIHsKLQkJCWlmIChyZXRsZW4gIT0gbGVuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAibmFuZF9iYnQ6IEVycm9yIHJlYWRpbmcgYmFkIGJsb2NrIHRhYmxlXG4iKTsKKwkJCWlmIChtdGRfaXNfZWNjZXJyKHJlcykpIHsKKwkJCQlwcl9pbmZvKCJuYW5kX2JidDogRUNDIGVycm9yIGluIEJCVCBhdCAiCisJCQkJCSIweCUwMTJsbHhcbiIsIGZyb20gJiB+bXRkLT53cml0ZXNpemUpOworCQkJCXJldHVybiByZXM7CisJCQl9IGVsc2UgaWYgKG10ZF9pc19iaXRmbGlwKHJlcykpIHsKKwkJCQlwcl9pbmZvKCJuYW5kX2JidDogY29ycmVjdGVkIGVycm9yIGluIEJCVCBhdCAiCisJCQkJCSIweCUwMTJsbHhcbiIsIGZyb20gJiB+bXRkLT53cml0ZXNpemUpOworCQkJCXJldCA9IHJlczsKKwkJCX0gZWxzZSB7CisJCQkJcHJfaW5mbygibmFuZF9iYnQ6IGVycm9yIHJlYWRpbmcgQkJUXG4iKTsKIAkJCQlyZXR1cm4gcmVzOwogCQkJfQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmFuZF9iYnQ6IEVDQyBlcnJvciB3aGlsZSByZWFkaW5nIGJhZCBibG9jayB0YWJsZVxuIik7CiAJCX0KIAogCQkvKiBBbmFseXNlIGRhdGEgKi8KQEAgLTI1MiwxNyArMjI1LDE5IEBACiAJCQkJaWYgKHRtcCA9PSBtc2spCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChyZXNlcnZlZF9ibG9ja19jb2RlICYmICh0bXAgPT0gcmVzZXJ2ZWRfYmxvY2tfY29kZSkpIHsKLQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm5hbmRfcmVhZF9iYnQ6IFJlc2VydmVkIGJsb2NrIGF0IDB4JTAxMmxseFxuIiwKLQkJCQkJICAgICAgIChsb2ZmX3QpKChvZmZzIDw8IDIpICsgKGFjdCA+PiAxKSkgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKKwkJCQkJcHJfaW5mbygibmFuZF9yZWFkX2JidDogcmVzZXJ2ZWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAorCQkJCQkJIChsb2ZmX3QpKChvZmZzIDw8IDIpICsgKGFjdCA+PiAxKSkgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKIAkJCQkJdGhpcy0+YmJ0W29mZnMgKyAoYWN0ID4+IDMpXSB8PSAweDIgPDwgKGFjdCAmIDB4MDYpOwogCQkJCQltdGQtPmVjY19zdGF0cy5iYnRibG9ja3MrKzsKIAkJCQkJY29udGludWU7CiAJCQkJfQotCQkJCS8qIExlYXZlIGl0IGZvciBub3csIGlmIGl0cyBtYXR1cmVkIHdlIGNhbiBtb3ZlIHRoaXMKLQkJCQkgKiBtZXNzYWdlIHRvIE1URF9ERUJVR19MRVZFTDAgKi8KLQkJCQlwcmludGsoS0VSTl9ERUJVRyAibmFuZF9yZWFkX2JidDogQmFkIGJsb2NrIGF0IDB4JTAxMmxseFxuIiwKLQkJCQkgICAgICAgKGxvZmZfdCkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwotCQkJCS8qIEZhY3RvcnkgbWFya2VkIGJhZCBvciB3b3JuIG91dCA/ICovCisJCQkJLyoKKwkJCQkgKiBMZWF2ZSBpdCBmb3Igbm93LCBpZiBpdCdzIG1hdHVyZWQgd2UgY2FuCisJCQkJICogbW92ZSB0aGlzIG1lc3NhZ2UgdG8gcHJfZGVidWcuCisJCQkJICovCisJCQkJcHJfaW5mbygibmFuZF9yZWFkX2JidDogYmFkIGJsb2NrIGF0IDB4JTAxMmxseFxuIiwKKwkJCQkJIChsb2ZmX3QpKChvZmZzIDw8IDIpICsgKGFjdCA+PiAxKSkgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKKwkJCQkvKiBGYWN0b3J5IG1hcmtlZCBiYWQgb3Igd29ybiBvdXQ/ICovCiAJCQkJaWYgKHRtcCA9PSAwKQogCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MyA8PCAoYWN0ICYgMHgwNik7CiAJCQkJZWxzZQpAQCAtMjczLDIwICsyNDgsMjAgQEAKIAkJdG90bGVuIC09IGxlbjsKIAkJZnJvbSArPSBsZW47CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogcmVhZF9hYnNfYmJ0IC0gW0dFTkVSSUNdIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZSBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCi0gKiBAdGQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlCi0gKiBAY2hpcDoJcmVhZCB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWMgY2hpcCwgLTEgcmVhZCBhbGwgY2hpcHMuCi0gKgkJQXBwbGllcyBvbmx5IGlmIE5BTkRfQkJUX1BFUkNISVAgb3B0aW9uIGlzIHNldAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEB0ZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQorICogQGNoaXA6IHJlYWQgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmljIGNoaXAsIC0xIHJlYWQgYWxsIGNoaXBzOyBhcHBsaWVzIG9ubHkgaWYKKyAqICAgICAgICBOQU5EX0JCVF9QRVJDSElQIG9wdGlvbiBpcyBzZXQKICAqCi0gKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKLSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBiYnQgYml0cyBhcmUgaW4gY29uc2VjdXRpdmUgb3JkZXIuCi0qLworICogUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIGZvciBhbGwgY2hpcHMgc3RhcnRpbmcgYXQgYSBnaXZlbiBwYWdlLiBXZSBhc3N1bWUKKyAqIHRoYXQgdGhlIGJidCBiaXRzIGFyZSBpbiBjb25zZWN1dGl2ZSBvcmRlci4KKyAqLwogc3RhdGljIGludCByZWFkX2Fic19iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1Ziwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwgaW50IGNoaXApCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKQEAgLTMxMiw5ICsyODcsNyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogQkJUIG1hcmtlciBpcyBpbiB0aGUgZmlyc3QgcGFnZSwgbm8gT09CLgotICovCisvKiBCQlQgbWFya2VyIGlzIGluIHRoZSBmaXJzdCBwYWdlLCBubyBPT0IgKi8KIHN0YXRpYyBpbnQgc2Nhbl9yZWFkX3Jhd19kYXRhKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGxvZmZfdCBvZmZzLAogCQkJIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCiB7CkBAIC0zMjgsMzUgKzMwMSwyNiBAQAogCXJldHVybiBtdGQtPnJlYWQobXRkLCBvZmZzLCBsZW4sICZyZXRsZW4sIGJ1Zik7CiB9CiAKLS8qCi0gKiBTY2FuIHJlYWQgcmF3IGRhdGEgZnJvbSBmbGFzaAotICovCisvKiBTY2FuIHJlYWQgcmF3IGRhdGEgZnJvbSBmbGFzaCAqLwogc3RhdGljIGludCBzY2FuX3JlYWRfcmF3X29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBsb2ZmX3Qgb2ZmcywKIAkJCSBzaXplX3QgbGVuKQogewogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9SQVc7CisJb3BzLm1vZGUgPSBNVERfT1BTX1JBVzsKIAlvcHMub29ib2ZmcyA9IDA7CiAJb3BzLm9vYmxlbiA9IG10ZC0+b29ic2l6ZTsKIAotCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJaWYgKGxlbiA8PSBtdGQtPndyaXRlc2l6ZSkgewotCQkJb3BzLm9vYmJ1ZiA9IGJ1ZiArIGxlbjsKLQkJCW9wcy5kYXRidWYgPSBidWY7Ci0JCQlvcHMubGVuID0gbGVuOwotCQkJcmV0dXJuIG10ZC0+cmVhZF9vb2IobXRkLCBvZmZzLCAmb3BzKTsKLQkJfSBlbHNlIHsKLQkJCW9wcy5vb2JidWYgPSBidWYgKyBtdGQtPndyaXRlc2l6ZTsKLQkJCW9wcy5kYXRidWYgPSBidWY7Ci0JCQlvcHMubGVuID0gbXRkLT53cml0ZXNpemU7Ci0JCQlyZXMgPSBtdGQtPnJlYWRfb29iKG10ZCwgb2ZmcywgJm9wcyk7CisJCW9wcy5kYXRidWYgPSBidWY7CisJCW9wcy5sZW4gPSBtaW4obGVuLCAoc2l6ZV90KW10ZC0+d3JpdGVzaXplKTsKKwkJb3BzLm9vYmJ1ZiA9IGJ1ZiArIG9wcy5sZW47CiAKLQkJCWlmIChyZXMpCi0JCQkJcmV0dXJuIHJlczsKLQkJfQorCQlyZXMgPSBtdGQtPnJlYWRfb29iKG10ZCwgb2ZmcywgJm9wcyk7CisKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CiAKIAkJYnVmICs9IG10ZC0+b29ic2l6ZSArIG10ZC0+d3JpdGVzaXplOwogCQlsZW4gLT0gbXRkLT53cml0ZXNpemU7CkBAIC0zNzMsMTUgKzMzNywxMyBAQAogCQlyZXR1cm4gc2Nhbl9yZWFkX3Jhd19vb2IobXRkLCBidWYsIG9mZnMsIGxlbik7CiB9CiAKLS8qCi0gKiBTY2FuIHdyaXRlIGRhdGEgd2l0aCBvb2IgdG8gZmxhc2gKLSAqLworLyogU2NhbiB3cml0ZSBkYXRhIHdpdGggb29iIHRvIGZsYXNoICovCiBzdGF0aWMgaW50IHNjYW5fd3JpdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2Zmcywgc2l6ZV90IGxlbiwKIAkJCSAgdWludDhfdCAqYnVmLCB1aW50OF90ICpvb2IpCiB7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29ibGVuID0gbXRkLT5vb2JzaXplOwogCW9wcy5kYXRidWYgPSBidWY7CkBAIC00MDIsMTUgKzM2NCwxNCBAQAogCiAvKioKICAqIHJlYWRfYWJzX2JidHMgLSBbR0VORVJJQ10gUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlKHMpIGZvciBhbGwgY2hpcHMgc3RhcnRpbmcgYXQgYSBnaXZlbiBwYWdlCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQGJ1ZjoJdGVtcG9yYXJ5IGJ1ZmZlcgotICogQHRkOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZQotICogQG1kOgkJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAdGQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtZDoJZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKICAqCi0gKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUocykgZm9yIGFsbCBjaGlwcyBzdGFydGluZyBhdCBhIGdpdmVuIHBhZ2UKLSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBiYnQgYml0cyBhcmUgaW4gY29uc2VjdXRpdmUgb3JkZXIuCi0gKgotKi8KKyAqIFJlYWQgdGhlIGJhZCBibG9jayB0YWJsZShzKSBmb3IgYWxsIGNoaXBzIHN0YXJ0aW5nIGF0IGEgZ2l2ZW4gcGFnZS4gV2UKKyAqIGFzc3VtZSB0aGF0IHRoZSBiYnQgYml0cyBhcmUgaW4gY29uc2VjdXRpdmUgb3JkZXIuCisgKi8KIHN0YXRpYyBpbnQgcmVhZF9hYnNfYmJ0cyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLAogCQkJIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqbWQpCiB7CkBAIC00MjEsOCArMzgyLDggQEAKIAkJc2Nhbl9yZWFkX3JhdyhtdGQsIGJ1ZiwgKGxvZmZfdCl0ZC0+cGFnZXNbMF0gPDwgdGhpcy0+cGFnZV9zaGlmdCwKIAkJCSAgICAgIG10ZC0+d3JpdGVzaXplLCB0ZCk7CiAJCXRkLT52ZXJzaW9uWzBdID0gYnVmW2JidF9nZXRfdmVyX29mZnMobXRkLCB0ZCldOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLAotCQkgICAgICAgdGQtPnBhZ2VzWzBdLCB0ZC0+dmVyc2lvblswXSk7CisJCXByX2luZm8oIkJhZCBibG9jayB0YWJsZSBhdCBwYWdlICVkLCB2ZXJzaW9uIDB4JTAyWFxuIiwKKwkJCSB0ZC0+cGFnZXNbMF0sIHRkLT52ZXJzaW9uWzBdKTsKIAl9CiAKIAkvKiBSZWFkIHRoZSBtaXJyb3IgdmVyc2lvbiwgaWYgYXZhaWxhYmxlICovCkBAIC00MzAsMTUgKzM5MSwxMyBAQAogCQlzY2FuX3JlYWRfcmF3KG10ZCwgYnVmLCAobG9mZl90KW1kLT5wYWdlc1swXSA8PCB0aGlzLT5wYWdlX3NoaWZ0LAogCQkJICAgICAgbXRkLT53cml0ZXNpemUsIHRkKTsKIAkJbWQtPnZlcnNpb25bMF0gPSBidWZbYmJ0X2dldF92ZXJfb2ZmcyhtdGQsIG1kKV07Ci0JCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgYXQgcGFnZSAlZCwgdmVyc2lvbiAweCUwMlhcbiIsCi0JCSAgICAgICBtZC0+cGFnZXNbMF0sIG1kLT52ZXJzaW9uWzBdKTsKKwkJcHJfaW5mbygiQmFkIGJsb2NrIHRhYmxlIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLAorCQkJIG1kLT5wYWdlc1swXSwgbWQtPnZlcnNpb25bMF0pOwogCX0KIAlyZXR1cm4gMTsKIH0KIAotLyoKLSAqIFNjYW4gYSBnaXZlbiBibG9jayBmdWxsCi0gKi8KKy8qIFNjYW4gYSBnaXZlbiBibG9jayBmdWxsICovCiBzdGF0aWMgaW50IHNjYW5fYmxvY2tfZnVsbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCwKIAkJCSAgIGxvZmZfdCBvZmZzLCB1aW50OF90ICpidWYsIHNpemVfdCByZWFkbGVuLAogCQkJICAgaW50IHNjYW5sZW4sIGludCBsZW4pCkBAIC00NDYsNyArNDA1LDggQEAKIAlpbnQgcmV0LCBqOwogCiAJcmV0ID0gc2Nhbl9yZWFkX3Jhd19vb2IobXRkLCBidWYsIG9mZnMsIHJlYWRsZW4pOwotCWlmIChyZXQpCisJLyogSWdub3JlIEVDQyBlcnJvcnMgd2hlbiBjaGVja2luZyBmb3IgQkJNICovCisJaWYgKHJldCAmJiAhbXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKHJldCkpCiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyssIGJ1ZiArPSBzY2FubGVuKSB7CkBAIC00NTYsOSArNDE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNjYW4gYSBnaXZlbiBibG9jayBwYXJ0aWFsbHkKLSAqLworLyogU2NhbiBhIGdpdmVuIGJsb2NrIHBhcnRpYWxseSAqLwogc3RhdGljIGludCBzY2FuX2Jsb2NrX2Zhc3Qoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQsCiAJCQkgICBsb2ZmX3Qgb2ZmcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKQogewpAQCAtNDY5LDE2ICs0MjcsMTYgQEAKIAlvcHMub29iYnVmID0gYnVmOwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMuZGF0YnVmID0gTlVMTDsKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAogCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykgewogCQkvKgotCQkgKiBSZWFkIHRoZSBmdWxsIG9vYiB1bnRpbCByZWFkX29vYiBpcyBmaXhlZCB0bwotCQkgKiBoYW5kbGUgc2luZ2xlIGJ5dGUgcmVhZHMgZm9yIDE2IGJpdAotCQkgKiBidXN3aWR0aAorCQkgKiBSZWFkIHRoZSBmdWxsIG9vYiB1bnRpbCByZWFkX29vYiBpcyBmaXhlZCB0byBoYW5kbGUgc2luZ2xlCisJCSAqIGJ5dGUgcmVhZHMgZm9yIDE2IGJpdCBidXN3aWR0aC4KIAkJICovCiAJCXJldCA9IG10ZC0+cmVhZF9vb2IobXRkLCBvZmZzLCAmb3BzKTsKLQkJaWYgKHJldCkKKwkJLyogSWdub3JlIEVDQyBlcnJvcnMgd2hlbiBjaGVja2luZyBmb3IgQkJNICovCisJCWlmIChyZXQgJiYgIW10ZF9pc19iaXRmbGlwX29yX2VjY2VycihyZXQpKQogCQkJcmV0dXJuIHJldDsKIAogCQlpZiAoY2hlY2tfc2hvcnRfcGF0dGVybihidWYsIGJkKSkKQEAgLTQ5MSwxNCArNDQ5LDE0IEBACiAKIC8qKgogICogY3JlYXRlX2JidCAtIFtHRU5FUklDXSBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEBiZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgotICogQGNoaXA6CWNyZWF0ZSB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWMgY2hpcCwgLTEgcmVhZCBhbGwgY2hpcHMuCi0gKgkJQXBwbGllcyBvbmx5IGlmIE5BTkRfQkJUX1BFUkNISVAgb3B0aW9uIGlzIHNldAorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBidWY6IHRlbXBvcmFyeSBidWZmZXIKKyAqIEBiZDogZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCisgKiBAY2hpcDogY3JlYXRlIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSByZWFkIGFsbCBjaGlwczsgYXBwbGllcyBvbmx5CisgKiAgICAgICAgaWYgTkFORF9CQlRfUEVSQ0hJUCBvcHRpb24gaXMgc2V0CiAgKgotICogQ3JlYXRlIGEgYmFkIGJsb2NrIHRhYmxlIGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UKLSAqIGZvciB0aGUgZ2l2ZW4gZ29vZC9iYWQgYmxvY2sgaWRlbnRpZnkgcGF0dGVybgorICogQ3JlYXRlIGEgYmFkIGJsb2NrIHRhYmxlIGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UgZm9yIHRoZSBnaXZlbiBnb29kL2JhZCBibG9jaworICogaWRlbnRpZnkgcGF0dGVybi4KICAqLwogc3RhdGljIGludCBjcmVhdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsCiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCwgaW50IGNoaXApCkBAIC01MDksNyArNDY3LDcgQEAKIAlsb2ZmX3QgZnJvbTsKIAlzaXplX3QgcmVhZGxlbjsKIAotCXByaW50ayhLRVJOX0lORk8gIlNjYW5uaW5nIGRldmljZSBmb3IgYmFkIGJsb2Nrc1xuIik7CisJcHJfaW5mbygiU2Nhbm5pbmcgZGV2aWNlIGZvciBiYWQgYmxvY2tzXG4iKTsKIAogCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5BTExQQUdFUykKIAkJbGVuID0gMSA8PCAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gdGhpcy0+cGFnZV9zaGlmdCk7CkBAIC01MjksMTQgKzQ4NywxNiBAQAogCX0KIAogCWlmIChjaGlwID09IC0xKSB7Ci0JCS8qIE5vdGUgdGhhdCBudW1ibG9ja3MgaXMgMiAqIChyZWFsIG51bWJsb2NrcykgaGVyZSwgc2VlIGkrPTIKLQkJICogYmVsb3cgYXMgaXQgbWFrZXMgc2hpZnRpbmcgYW5kIG1hc2tpbmcgbGVzcyBwYWluZnVsICovCisJCS8qCisJCSAqIE5vdGUgdGhhdCBudW1ibG9ja3MgaXMgMiAqIChyZWFsIG51bWJsb2NrcykgaGVyZSwgc2VlIGkrPTIKKwkJICogYmVsb3cgYXMgaXQgbWFrZXMgc2hpZnRpbmcgYW5kIG1hc2tpbmcgbGVzcyBwYWluZnVsCisJCSAqLwogCQludW1ibG9ja3MgPSBtdGQtPnNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpOwogCQlzdGFydGJsb2NrID0gMDsKIAkJZnJvbSA9IDA7CiAJfSBlbHNlIHsKIAkJaWYgKGNoaXAgPj0gdGhpcy0+bnVtY2hpcHMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNyZWF0ZV9iYnQoKTogY2hpcG5yICglZCkgPiBhdmFpbGFibGUgY2hpcHMgKCVkKVxuIiwKKwkJCXByX3dhcm4oImNyZWF0ZV9iYnQoKTogY2hpcG5yICglZCkgPiBhdmFpbGFibGUgY2hpcHMgKCVkKVxuIiwKIAkJCSAgICAgICBjaGlwICsgMSwgdGhpcy0+bnVtY2hpcHMpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTU0Niw3ICs1MDYsNyBAQAogCQlmcm9tID0gKGxvZmZfdClzdGFydGJsb2NrIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKTsKIAl9CiAKLQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5MQVNUUEFHRSkKKwlpZiAodGhpcy0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UpCiAJCWZyb20gKz0gbXRkLT5lcmFzZXNpemUgLSAobXRkLT53cml0ZXNpemUgKiBsZW4pOwogCiAJZm9yIChpID0gc3RhcnRibG9jazsgaSA8IG51bWJsb2NrczspIHsKQEAgLTU2NSw4ICs1MjUsOCBAQAogCiAJCWlmIChyZXQpIHsKIAkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIGVyYXNlYmxvY2sgJWQgYXQgMHglMDEybGx4XG4iLAotCQkJICAgICAgIGkgPj4gMSwgKHVuc2lnbmVkIGxvbmcgbG9uZylmcm9tKTsKKwkJCXByX3dhcm4oIkJhZCBlcmFzZWJsb2NrICVkIGF0IDB4JTAxMmxseFxuIiwKKwkJCQlpID4+IDEsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJvbSk7CiAJCQltdGQtPmVjY19zdGF0cy5iYWRibG9ja3MrKzsKIAkJfQogCkBAIC01NzgsMjAgKzUzOCwxOCBAQAogCiAvKioKICAqIHNlYXJjaF9iYnQgLSBbR0VORVJJQ10gc2NhbiB0aGUgZGV2aWNlIGZvciBhIHNwZWNpZmljIGJhZCBibG9jayB0YWJsZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAdGQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKICAqCi0gKiBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgYnkgc2VhcmNoaW5nIGZvciBhIGdpdmVuIGlkZW50IHBhdHRlcm4uCi0gKiBTZWFyY2ggaXMgcHJlZm9ybWVkIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcgdXAgb3IgZnJvbSB0aGUgZW5kIG9mCi0gKiB0aGUgZGV2aWNlIGRvd253YXJkcy4gVGhlIHNlYXJjaCBzdGFydHMgYWx3YXlzIGF0IHRoZSBzdGFydCBvZiBhCi0gKiBibG9jay4KLSAqIElmIHRoZSBvcHRpb24gTkFORF9CQlRfUEVSQ0hJUCBpcyBnaXZlbiwgZWFjaCBjaGlwIGlzIHNlYXJjaGVkCi0gKiBmb3IgYSBiYnQsIHdoaWNoIGNvbnRhaW5zIHRoZSBiYWQgYmxvY2sgaW5mb3JtYXRpb24gb2YgdGhpcyBjaGlwLgotICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBjZXJ0YWluIERPQyBkZXZpY2VzLgorICogUmVhZCB0aGUgYmFkIGJsb2NrIHRhYmxlIGJ5IHNlYXJjaGluZyBmb3IgYSBnaXZlbiBpZGVudCBwYXR0ZXJuLiBTZWFyY2ggaXMKKyAqIHByZWZvcm1lZCBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nIHVwIG9yIGZyb20gdGhlIGVuZCBvZiB0aGUgZGV2aWNlCisgKiBkb3dud2FyZHMuIFRoZSBzZWFyY2ggc3RhcnRzIGFsd2F5cyBhdCB0aGUgc3RhcnQgb2YgYSBibG9jay4gSWYgdGhlIG9wdGlvbgorICogTkFORF9CQlRfUEVSQ0hJUCBpcyBnaXZlbiwgZWFjaCBjaGlwIGlzIHNlYXJjaGVkIGZvciBhIGJidCwgd2hpY2ggY29udGFpbnMKKyAqIHRoZSBiYWQgYmxvY2sgaW5mb3JtYXRpb24gb2YgdGhpcyBjaGlwLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIHN1cHBvcnQKKyAqIGZvciBjZXJ0YWluIERPQyBkZXZpY2VzLgogICoKLSAqIFRoZSBiYnQgaWRlbnQgcGF0dGVybiByZXNpZGVzIGluIHRoZSBvb2IgYXJlYSBvZiB0aGUgZmlyc3QgcGFnZQotICogaW4gYSBibG9jay4KKyAqIFRoZSBiYnQgaWRlbnQgcGF0dGVybiByZXNpZGVzIGluIHRoZSBvb2IgYXJlYSBvZiB0aGUgZmlyc3QgcGFnZSBpbiBhIGJsb2NrLgogICovCiBzdGF0aWMgaW50IHNlYXJjaF9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1Ziwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKQEAgLTYwMiw3ICs1NjAsNyBAQAogCWludCBiYnRibG9ja3M7CiAJaW50IGJsb2NrdG9wYWdlID0gdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gdGhpcy0+cGFnZV9zaGlmdDsKIAotCS8qIFNlYXJjaCBkaXJlY3Rpb24gdG9wIC0+IGRvd24gPyAqLworCS8qIFNlYXJjaCBkaXJlY3Rpb24gdG9wIC0+IGRvd24/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfTEFTVEJMT0NLKSB7CiAJCXN0YXJ0YmxvY2sgPSAobXRkLT5zaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCkgLSAxOwogCQlkaXIgPSAtMTsKQEAgLTYxMSw3ICs1NjksNyBAQAogCQlkaXIgPSAxOwogCX0KIAotCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXAgPyAqLworCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXA/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgewogCQljaGlwcyA9IHRoaXMtPm51bWNoaXBzOwogCQliYnRibG9ja3MgPSB0aGlzLT5jaGlwc2l6ZSA+PiB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CkBAIC02NTAsMjMgKzYwOCwyMyBAQAogCS8qIENoZWNrLCBpZiB3ZSBmb3VuZCBhIGJidCBmb3IgZWFjaCByZXF1ZXN0ZWQgY2hpcCAqLwogCWZvciAoaSA9IDA7IGkgPCBjaGlwczsgaSsrKSB7CiAJCWlmICh0ZC0+cGFnZXNbaV0gPT0gLTEpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJCYWQgYmxvY2sgdGFibGUgbm90IGZvdW5kIGZvciBjaGlwICVkXG4iLCBpKTsKKwkJCXByX3dhcm4oIkJhZCBibG9jayB0YWJsZSBub3QgZm91bmQgZm9yIGNoaXAgJWRcbiIsIGkpOwogCQllbHNlCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIGZvdW5kIGF0IHBhZ2UgJWQsIHZlcnNpb24gMHglMDJYXG4iLCB0ZC0+cGFnZXNbaV0sCi0JCQkgICAgICAgdGQtPnZlcnNpb25baV0pOworCQkJcHJfaW5mbygiQmFkIGJsb2NrIHRhYmxlIGZvdW5kIGF0IHBhZ2UgJWQsIHZlcnNpb24gIgorCQkJCSAiMHglMDJYXG4iLCB0ZC0+cGFnZXNbaV0sIHRkLT52ZXJzaW9uW2ldKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogc2VhcmNoX3JlYWRfYmJ0cyAtIFtHRU5FUklDXSBzY2FuIHRoZSBkZXZpY2UgZm9yIGJhZCBibG9jayB0YWJsZShzKQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKLSAqIEBtZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUgbWlycm9yCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQGJ1ZjogdGVtcG9yYXJ5IGJ1ZmZlcgorICogQHRkOiBkZXNjcmlwdG9yIGZvciB0aGUgYmFkIGJsb2NrIHRhYmxlCisgKiBAbWQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUgbWlycm9yCiAgKgotICogU2VhcmNoIGFuZCByZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUocykKLSovCisgKiBTZWFyY2ggYW5kIHJlYWQgdGhlIGJhZCBibG9jayB0YWJsZShzKS4KKyAqLwogc3RhdGljIGludCBzZWFyY2hfcmVhZF9iYnRzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICogYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kKQogewogCS8qIFNlYXJjaCB0aGUgcHJpbWFyeSB0YWJsZSAqLwpAQCAtNjgyLDE2ICs2NDAsMTQgQEAKIAogLyoqCiAgKiB3cml0ZV9iYnQgLSBbR0VORVJJQ10gKFJlKXdyaXRlIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAdGQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKKyAqIEBtZDogZGVzY3JpcHRvciBmb3IgdGhlIGJhZCBibG9jayB0YWJsZSBtaXJyb3IKKyAqIEBjaGlwc2VsOiBzZWxlY3RvciBmb3IgYSBzcGVjaWZpYyBjaGlwLCAtMSBmb3IgYWxsCiAgKgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBidWY6CXRlbXBvcmFyeSBidWZmZXIKLSAqIEB0ZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUKLSAqIEBtZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBiYWQgYmxvY2sgdGFibGUgbWlycm9yCi0gKiBAY2hpcHNlbDoJc2VsZWN0b3IgZm9yIGEgc3BlY2lmaWMgY2hpcCwgLTEgZm9yIGFsbAotICoKLSAqIChSZSl3cml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlCi0gKgotKi8KKyAqIChSZSl3cml0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlLgorICovCiBzdGF0aWMgaW50IHdyaXRlX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLAogCQkgICAgIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqbWQsCiAJCSAgICAgaW50IGNoaXBzZWwpCkBAIC03MTAsMTQgKzY2NiwxNCBAQAogCW9wcy5vb2JsZW4gPSBtdGQtPm9vYnNpemU7CiAJb3BzLm9vYm9mZnMgPSAwOwogCW9wcy5kYXRidWYgPSBOVUxMOwotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCiAJaWYgKCFyY29kZSkKIAkJcmNvZGUgPSAweGZmOwotCS8qIFdyaXRlIGJhZCBibG9jayB0YWJsZSBwZXIgY2hpcCByYXRoZXIgdGhhbiBwZXIgZGV2aWNlID8gKi8KKwkvKiBXcml0ZSBiYWQgYmxvY2sgdGFibGUgcGVyIGNoaXAgcmF0aGVyIHRoYW4gcGVyIGRldmljZT8gKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSB7CiAJCW51bWJsb2NrcyA9IChpbnQpKHRoaXMtPmNoaXBzaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7Ci0JCS8qIEZ1bGwgZGV2aWNlIHdyaXRlIG9yIHNwZWNpZmljIGNoaXAgPyAqLworCQkvKiBGdWxsIGRldmljZSB3cml0ZSBvciBzcGVjaWZpYyBjaGlwPyAqLwogCQlpZiAoY2hpcHNlbCA9PSAtMSkgewogCQkJbnJjaGlwcyA9IHRoaXMtPm51bWNoaXBzOwogCQl9IGVsc2UgewpAQCAtNzMxLDggKzY4Nyw4IEBACiAKIAkvKiBMb29wIHRocm91Z2ggdGhlIGNoaXBzICovCiAJZm9yICg7IGNoaXAgPCBucmNoaXBzOyBjaGlwKyspIHsKLQotCQkvKiBUaGVyZSB3YXMgYWxyZWFkeSBhIHZlcnNpb24gb2YgdGhlIHRhYmxlLCByZXVzZSB0aGUgcGFnZQorCQkvKgorCQkgKiBUaGVyZSB3YXMgYWxyZWFkeSBhIHZlcnNpb24gb2YgdGhlIHRhYmxlLCByZXVzZSB0aGUgcGFnZQogCQkgKiBUaGlzIGFwcGxpZXMgZm9yIGFic29sdXRlIHBsYWNlbWVudCB0b28sIGFzIHdlIGhhdmUgdGhlCiAJCSAqIHBhZ2UgbnIuIGluIHRkLT5wYWdlcy4KIAkJICovCkBAIC03NDEsOCArNjk3LDEwIEBACiAJCQlnb3RvIHdyaXRlOwogCQl9CiAKLQkJLyogQXV0b21hdGljIHBsYWNlbWVudCBvZiB0aGUgYmFkIGJsb2NrIHRhYmxlICovCi0JCS8qIFNlYXJjaCBkaXJlY3Rpb24gdG9wIC0+IGRvd24gPyAqLworCQkvKgorCQkgKiBBdXRvbWF0aWMgcGxhY2VtZW50IG9mIHRoZSBiYWQgYmxvY2sgdGFibGUuIFNlYXJjaCBkaXJlY3Rpb24KKwkJICogdG9wIC0+IGRvd24/CisJCSAqLwogCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9MQVNUQkxPQ0spIHsKIAkJCXN0YXJ0YmxvY2sgPSBudW1ibG9ja3MgKiAoY2hpcCArIDEpIC0gMTsKIAkJCWRpciA9IC0xOwpAQCAtNzY2LDcgKzcyNCw3IEBACiAJCQlpZiAoIW1kIHx8IG1kLT5wYWdlc1tjaGlwXSAhPSBwYWdlKQogCQkJCWdvdG8gd3JpdGU7CiAJCX0KLQkJcHJpbnRrKEtFUk5fRVJSICJObyBzcGFjZSBsZWZ0IHRvIHdyaXRlIGJhZCBibG9jayB0YWJsZVxuIik7CisJCXByX2VycigiTm8gc3BhY2UgbGVmdCB0byB3cml0ZSBiYWQgYmxvY2sgdGFibGVcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl3cml0ZToKIApAQCAtNzkxLDI0ICs3NDksMjIgQEAKIAogCQliYnRvZmZzID0gY2hpcCAqIChudW1ibG9ja3MgPj4gMik7CiAKLQkJdG8gPSAoKGxvZmZfdCkgcGFnZSkgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwkJdG8gPSAoKGxvZmZfdClwYWdlKSA8PCB0aGlzLT5wYWdlX3NoaWZ0OwogCi0JCS8qIE11c3Qgd2Ugc2F2ZSB0aGUgYmxvY2sgY29udGVudHMgPyAqLworCQkvKiBNdXN0IHdlIHNhdmUgdGhlIGJsb2NrIGNvbnRlbnRzPyAqLwogCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQVZFQ09OVEVOVCkgewogCQkJLyogTWFrZSBpdCBibG9jayBhbGlnbmVkICovCi0JCQl0byAmPSB+KChsb2ZmX3QpICgoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpIC0gMSkpOworCQkJdG8gJj0gfigobG9mZl90KSgoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpIC0gMSkpOwogCQkJbGVuID0gMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CiAJCQlyZXMgPSBtdGQtPnJlYWQobXRkLCB0bywgbGVuLCAmcmV0bGVuLCBidWYpOwogCQkJaWYgKHJlcyA8IDApIHsKIAkJCQlpZiAocmV0bGVuICE9IGxlbikgewotCQkJCQlwcmludGsoS0VSTl9JTkZPICJuYW5kX2JidDogRXJyb3IgIgotCQkJCQkgICAgICAgInJlYWRpbmcgYmxvY2sgZm9yIHdyaXRpbmcgIgotCQkJCQkgICAgICAgInRoZSBiYWQgYmxvY2sgdGFibGVcbiIpOworCQkJCQlwcl9pbmZvKCJuYW5kX2JidDogZXJyb3IgcmVhZGluZyBibG9jayAiCisJCQkJCQkiZm9yIHdyaXRpbmcgdGhlIGJhZCBibG9jayB0YWJsZVxuIik7CiAJCQkJCXJldHVybiByZXM7CiAJCQkJfQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5hbmRfYmJ0OiBFQ0MgZXJyb3IgIgotCQkJCSAgICAgICAid2hpbGUgcmVhZGluZyBibG9jayBmb3Igd3JpdGluZyAiCi0JCQkJICAgICAgICJiYWQgYmxvY2sgdGFibGVcbiIpOworCQkJCXByX3dhcm4oIm5hbmRfYmJ0OiBFQ0MgZXJyb3Igd2hpbGUgcmVhZGluZyAiCisJCQkJCSJibG9jayBmb3Igd3JpdGluZyBiYWQgYmxvY2sgdGFibGVcbiIpOwogCQkJfQogCQkJLyogUmVhZCBvb2IgZGF0YSAqLwogCQkJb3BzLm9vYmxlbiA9IChsZW4gPj4gdGhpcy0+cGFnZV9zaGlmdCkgKiBtdGQtPm9vYnNpemU7CkBAIC04MjEsMTkgKzc3NywxOSBAQAogCQkJcGFnZW9mZnMgPSBwYWdlIC0gKGludCkodG8gPj4gdGhpcy0+cGFnZV9zaGlmdCk7CiAJCQlvZmZzID0gcGFnZW9mZnMgPDwgdGhpcy0+cGFnZV9zaGlmdDsKIAkJCS8qIFByZXNldCB0aGUgYmJ0IGFyZWEgd2l0aCAweGZmICovCi0JCQltZW1zZXQoJmJ1ZltvZmZzXSwgMHhmZiwgKHNpemVfdCkgKG51bWJsb2NrcyA+PiBzZnQpKTsKKwkJCW1lbXNldCgmYnVmW29mZnNdLCAweGZmLCAoc2l6ZV90KShudW1ibG9ja3MgPj4gc2Z0KSk7CiAJCQlvb2JvZmZzID0gbGVuICsgKHBhZ2VvZmZzICogbXRkLT5vb2JzaXplKTsKIAogCQl9IGVsc2UgaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfTk9fT09CKSB7CiAJCQlvb2JvZmZzID0gMDsKIAkJCW9mZnMgPSB0ZC0+bGVuOwotCQkJLyogdGhlIHZlcnNpb24gYnl0ZSAqLworCQkJLyogVGhlIHZlcnNpb24gYnl0ZSAqLwogCQkJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfVkVSU0lPTikKIAkJCQlvZmZzKys7CiAJCQkvKiBDYWxjIGxlbmd0aCAqLwotCQkJbGVuID0gKHNpemVfdCkgKG51bWJsb2NrcyA+PiBzZnQpOworCQkJbGVuID0gKHNpemVfdCkobnVtYmxvY2tzID4+IHNmdCk7CiAJCQlsZW4gKz0gb2ZmczsKLQkJCS8qIE1ha2UgaXQgcGFnZSBhbGlnbmVkICEgKi8KKwkJCS8qIE1ha2UgaXQgcGFnZSBhbGlnbmVkISAqLwogCQkJbGVuID0gQUxJR04obGVuLCBtdGQtPndyaXRlc2l6ZSk7CiAJCQkvKiBQcmVzZXQgdGhlIGJ1ZmZlciB3aXRoIDB4ZmYgKi8KIAkJCW1lbXNldChidWYsIDB4ZmYsIGxlbik7CkBAIC04NDEsOCArNzk3LDggQEAKIAkJCW1lbWNweShidWYsIHRkLT5wYXR0ZXJuLCB0ZC0+bGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIENhbGMgbGVuZ3RoICovCi0JCQlsZW4gPSAoc2l6ZV90KSAobnVtYmxvY2tzID4+IHNmdCk7Ci0JCQkvKiBNYWtlIGl0IHBhZ2UgYWxpZ25lZCAhICovCisJCQlsZW4gPSAoc2l6ZV90KShudW1ibG9ja3MgPj4gc2Z0KTsKKwkJCS8qIE1ha2UgaXQgcGFnZSBhbGlnbmVkISAqLwogCQkJbGVuID0gQUxJR04obGVuLCBtdGQtPndyaXRlc2l6ZSk7CiAJCQkvKiBQcmVzZXQgdGhlIGJ1ZmZlciB3aXRoIDB4ZmYgKi8KIAkJCW1lbXNldChidWYsIDB4ZmYsIGxlbiArCkBAIC04NTYsMTMgKzgxMiwxMyBAQAogCQlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKQogCQkJYnVmW29vYm9mZnMgKyB0ZC0+dmVyb2Zmc10gPSB0ZC0+dmVyc2lvbltjaGlwXTsKIAotCQkvKiB3YWxrIHRocm91Z2ggdGhlIG1lbW9yeSB0YWJsZSAqLworCQkvKiBXYWxrIHRocm91Z2ggdGhlIG1lbW9yeSB0YWJsZSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmxvY2tzOykgewogCQkJdWludDhfdCBkYXQ7CiAJCQlkYXQgPSB0aGlzLT5iYnRbYmJ0b2ZmcyArIChpID4+IDIpXTsKIAkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyssIGkrKykgewogCQkJCWludCBzZnRjbnQgPSAoaSA8PCAoMyAtIHNmdCkpICYgc2Z0bXNrOwotCQkJCS8qIERvIG5vdCBzdG9yZSB0aGUgcmVzZXJ2ZWQgYmJ0IGJsb2NrcyAhICovCisJCQkJLyogRG8gbm90IHN0b3JlIHRoZSByZXNlcnZlZCBiYnQgYmxvY2tzISAqLwogCQkJCWJ1ZltvZmZzICsgKGkgPj4gc2Z0KV0gJj0KIAkJCQkJfihtc2tbZGF0ICYgMHgwM10gPDwgc2Z0Y250KTsKIAkJCQlkYXQgPj49IDI7CkBAIC04ODMsOCArODM5LDggQEAKIAkJaWYgKHJlcyA8IDApCiAJCQlnb3RvIG91dGVycjsKIAotCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIHdyaXR0ZW4gdG8gMHglMDEybGx4LCB2ZXJzaW9uICIKLQkJICAgICAgICIweCUwMlhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdG8sIHRkLT52ZXJzaW9uW2NoaXBdKTsKKwkJcHJfaW5mbygiQmFkIGJsb2NrIHRhYmxlIHdyaXR0ZW4gdG8gMHglMDEybGx4LCB2ZXJzaW9uIDB4JTAyWFxuIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXRvLCB0ZC0+dmVyc2lvbltjaGlwXSk7CiAKIAkJLyogTWFyayBpdCBhcyB1c2VkICovCiAJCXRkLT5wYWdlc1tjaGlwXSA9IHBhZ2U7CkBAIC04OTIsMTkgKzg0OCwxOCBAQAogCXJldHVybiAwOwogCiAgb3V0ZXJyOgotCXByaW50ayhLRVJOX1dBUk5JTkcKLQkgICAgICAgIm5hbmRfYmJ0OiBFcnJvciB3aGlsZSB3cml0aW5nIGJhZCBibG9jayB0YWJsZSAlZFxuIiwgcmVzKTsKKwlwcl93YXJuKCJuYW5kX2JidDogZXJyb3Igd2hpbGUgd3JpdGluZyBiYWQgYmxvY2sgdGFibGUgJWRcbiIsIHJlcyk7CiAJcmV0dXJuIHJlczsKIH0KIAogLyoqCiAgKiBuYW5kX21lbW9yeV9iYnQgLSBbR0VORVJJQ10gY3JlYXRlIGEgbWVtb3J5IGJhc2VkIGJhZCBibG9jayB0YWJsZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBiZDoJCWRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgorICogQG10ZDogTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBiZDogZGVzY3JpcHRvciBmb3IgdGhlIGdvb2QvYmFkIGJsb2NrIHNlYXJjaCBwYXR0ZXJuCiAgKgotICogVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtZW1vcnkgYmFzZWQgYmJ0IGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UKLSAqIGZvciBtYW51ZmFjdHVyZXIgLyBzb2Z0d2FyZSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MKLSovCisgKiBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhIG1lbW9yeSBiYXNlZCBiYnQgYnkgc2Nhbm5pbmcgdGhlIGRldmljZSBmb3IKKyAqIG1hbnVmYWN0dXJlciAvIHNvZnR3YXJlIG1hcmtlZCBnb29kIC8gYmFkIGJsb2Nrcy4KKyAqLwogc3RhdGljIGlubGluZSBpbnQgbmFuZF9tZW1vcnlfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CkBAIC05MTUsMjUgKzg3MCwyNCBAQAogCiAvKioKICAqIGNoZWNrX2NyZWF0ZSAtIFtHRU5FUklDXSBjcmVhdGUgYW5kIHdyaXRlIGJidChzKSBpZiBuZWNlc3NhcnkKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYnVmOgl0ZW1wb3JhcnkgYnVmZmVyCi0gKiBAYmQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnVmOiB0ZW1wb3JhcnkgYnVmZmVyCisgKiBAYmQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgogICoKLSAqIFRoZSBmdW5jdGlvbiBjaGVja3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIGNhbGwgdG8gcmVhZF9iYnQKLSAqIGFuZCBjcmVhdGVzIC8gdXBkYXRlcyB0aGUgYmJ0KHMpIGlmIG5lY2Vzc2FyeQotICogQ3JlYXRpb24gaXMgbmVjZXNzYXJ5IGlmIG5vIGJidCB3YXMgZm91bmQgZm9yIHRoZSBjaGlwL2RldmljZQotICogVXBkYXRlIGlzIG5lY2Vzc2FyeSBpZiBvbmUgb2YgdGhlIHRhYmxlcyBpcyBtaXNzaW5nIG9yIHRoZQotICogdmVyc2lvbiBuci4gb2Ygb25lIHRhYmxlIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIKLSovCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvIHJlYWRfYmJ0IGFuZCBjcmVhdGVzCisgKiAvIHVwZGF0ZXMgdGhlIGJidChzKSBpZiBuZWNlc3NhcnkuIENyZWF0aW9uIGlzIG5lY2Vzc2FyeSBpZiBubyBiYnQgd2FzIGZvdW5kCisgKiBmb3IgdGhlIGNoaXAvZGV2aWNlLiBVcGRhdGUgaXMgbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgdGFibGVzIGlzIG1pc3Npbmcgb3IKKyAqIHRoZSB2ZXJzaW9uIG5yLiBvZiBvbmUgdGFibGUgaXMgbGVzcyB0aGFuIHRoZSBvdGhlci4KKyAqLwogc3RhdGljIGludCBjaGVja19jcmVhdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QgKmJ1Ziwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCkKIHsKLQlpbnQgaSwgY2hpcHMsIHdyaXRlb3BzLCBjaGlwc2VsLCByZXM7CisJaW50IGksIGNoaXBzLCB3cml0ZW9wcywgY3JlYXRlLCBjaGlwc2VsLCByZXMsIHJlczI7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkID0gdGhpcy0+YmJ0X3RkOwogCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqbWQgPSB0aGlzLT5iYnRfbWQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpyZCwgKnJkMjsKIAotCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXAgPyAqLworCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXA/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkKIAkJY2hpcHMgPSB0aGlzLT5udW1jaGlwczsKIAllbHNlCkBAIC05NDEsODYgKzg5NSw5OCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNoaXBzOyBpKyspIHsKIAkJd3JpdGVvcHMgPSAwOworCQljcmVhdGUgPSAwOwogCQlyZCA9IE5VTEw7CiAJCXJkMiA9IE5VTEw7Ci0JCS8qIFBlciBjaGlwIG9yIHBlciBkZXZpY2UgPyAqLworCQlyZXMgPSByZXMyID0gMDsKKwkJLyogUGVyIGNoaXAgb3IgcGVyIGRldmljZT8gKi8KIAkJY2hpcHNlbCA9ICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1BFUkNISVApID8gaSA6IC0xOwotCQkvKiBNaXJyb3JlZCB0YWJsZSBhdmFpbGFibGUgPyAqLworCQkvKiBNaXJyb3JlZCB0YWJsZSBhdmFpbGFibGU/ICovCiAJCWlmIChtZCkgewogCQkJaWYgKHRkLT5wYWdlc1tpXSA9PSAtMSAmJiBtZC0+cGFnZXNbaV0gPT0gLTEpIHsKKwkJCQljcmVhdGUgPSAxOwogCQkJCXdyaXRlb3BzID0gMHgwMzsKLQkJCQlnb3RvIGNyZWF0ZTsKLQkJCX0KLQotCQkJaWYgKHRkLT5wYWdlc1tpXSA9PSAtMSkgeworCQkJfSBlbHNlIGlmICh0ZC0+cGFnZXNbaV0gPT0gLTEpIHsKIAkJCQlyZCA9IG1kOwotCQkJCXRkLT52ZXJzaW9uW2ldID0gbWQtPnZlcnNpb25baV07Ci0JCQkJd3JpdGVvcHMgPSAxOwotCQkJCWdvdG8gd3JpdGVjaGVjazsKLQkJCX0KLQotCQkJaWYgKG1kLT5wYWdlc1tpXSA9PSAtMSkgeworCQkJCXdyaXRlb3BzID0gMHgwMTsKKwkJCX0gZWxzZSBpZiAobWQtPnBhZ2VzW2ldID09IC0xKSB7CiAJCQkJcmQgPSB0ZDsKLQkJCQltZC0+dmVyc2lvbltpXSA9IHRkLT52ZXJzaW9uW2ldOwotCQkJCXdyaXRlb3BzID0gMjsKLQkJCQlnb3RvIHdyaXRlY2hlY2s7Ci0JCQl9Ci0KLQkJCWlmICh0ZC0+dmVyc2lvbltpXSA9PSBtZC0+dmVyc2lvbltpXSkgeworCQkJCXdyaXRlb3BzID0gMHgwMjsKKwkJCX0gZWxzZSBpZiAodGQtPnZlcnNpb25baV0gPT0gbWQtPnZlcnNpb25baV0pIHsKIAkJCQlyZCA9IHRkOwogCQkJCWlmICghKHRkLT5vcHRpb25zICYgTkFORF9CQlRfVkVSU0lPTikpCiAJCQkJCXJkMiA9IG1kOwotCQkJCWdvdG8gd3JpdGVjaGVjazsKLQkJCX0KLQotCQkJaWYgKCgoaW50OF90KSAodGQtPnZlcnNpb25baV0gLSBtZC0+dmVyc2lvbltpXSkpID4gMCkgeworCQkJfSBlbHNlIGlmICgoKGludDhfdCkodGQtPnZlcnNpb25baV0gLSBtZC0+dmVyc2lvbltpXSkpID4gMCkgewogCQkJCXJkID0gdGQ7Ci0JCQkJbWQtPnZlcnNpb25baV0gPSB0ZC0+dmVyc2lvbltpXTsKLQkJCQl3cml0ZW9wcyA9IDI7CisJCQkJd3JpdGVvcHMgPSAweDAyOwogCQkJfSBlbHNlIHsKIAkJCQlyZCA9IG1kOwotCQkJCXRkLT52ZXJzaW9uW2ldID0gbWQtPnZlcnNpb25baV07Ci0JCQkJd3JpdGVvcHMgPSAxOworCQkJCXdyaXRlb3BzID0gMHgwMTsKIAkJCX0KLQotCQkJZ290byB3cml0ZWNoZWNrOwotCiAJCX0gZWxzZSB7CiAJCQlpZiAodGQtPnBhZ2VzW2ldID09IC0xKSB7CisJCQkJY3JlYXRlID0gMTsKIAkJCQl3cml0ZW9wcyA9IDB4MDE7Ci0JCQkJZ290byBjcmVhdGU7CisJCQl9IGVsc2UgeworCQkJCXJkID0gdGQ7CiAJCQl9Ci0JCQlyZCA9IHRkOwotCQkJZ290byB3cml0ZWNoZWNrOwogCQl9Ci0JY3JlYXRlOgotCQkvKiBDcmVhdGUgdGhlIGJhZCBibG9jayB0YWJsZSBieSBzY2FubmluZyB0aGUgZGV2aWNlID8gKi8KLQkJaWYgKCEodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9DUkVBVEUpKQotCQkJY29udGludWU7CiAKLQkJLyogQ3JlYXRlIHRoZSB0YWJsZSBpbiBtZW1vcnkgYnkgc2Nhbm5pbmcgdGhlIGNoaXAocykgKi8KLQkJaWYgKCEodGhpcy0+b3B0aW9ucyAmIE5BTkRfQ1JFQVRFX0VNUFRZX0JCVCkpCi0JCQljcmVhdGVfYmJ0KG10ZCwgYnVmLCBiZCwgY2hpcHNlbCk7CisJCWlmIChjcmVhdGUpIHsKKwkJCS8qIENyZWF0ZSB0aGUgYmFkIGJsb2NrIHRhYmxlIGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2U/ICovCisJCQlpZiAoISh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0NSRUFURSkpCisJCQkJY29udGludWU7CiAKLQkJdGQtPnZlcnNpb25baV0gPSAxOwotCQlpZiAobWQpCi0JCQltZC0+dmVyc2lvbltpXSA9IDE7Ci0Jd3JpdGVjaGVjazoKLQkJLyogcmVhZCBiYWNrIGZpcnN0ID8gKi8KLQkJaWYgKHJkKQotCQkJcmVhZF9hYnNfYmJ0KG10ZCwgYnVmLCByZCwgY2hpcHNlbCk7Ci0JCS8qIElmIHRoZXkgd2VyZW4ndCB2ZXJzaW9uZWQsIHJlYWQgYm90aC4gKi8KLQkJaWYgKHJkMikKLQkJCXJlYWRfYWJzX2JidChtdGQsIGJ1ZiwgcmQyLCBjaGlwc2VsKTsKKwkJCS8qIENyZWF0ZSB0aGUgdGFibGUgaW4gbWVtb3J5IGJ5IHNjYW5uaW5nIHRoZSBjaGlwKHMpICovCisJCQlpZiAoISh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX0NSRUFURV9FTVBUWSkpCisJCQkJY3JlYXRlX2JidChtdGQsIGJ1ZiwgYmQsIGNoaXBzZWwpOwogCi0JCS8qIFdyaXRlIHRoZSBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZSA/ICovCisJCQl0ZC0+dmVyc2lvbltpXSA9IDE7CisJCQlpZiAobWQpCisJCQkJbWQtPnZlcnNpb25baV0gPSAxOworCQl9CisKKwkJLyogUmVhZCBiYWNrIGZpcnN0PyAqLworCQlpZiAocmQpIHsKKwkJCXJlcyA9IHJlYWRfYWJzX2JidChtdGQsIGJ1ZiwgcmQsIGNoaXBzZWwpOworCQkJaWYgKG10ZF9pc19lY2NlcnIocmVzKSkgeworCQkJCS8qIE1hcmsgdGFibGUgYXMgaW52YWxpZCAqLworCQkJCXJkLT5wYWdlc1tpXSA9IC0xOworCQkJCXJkLT52ZXJzaW9uW2ldID0gMDsKKwkJCQlpLS07CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogSWYgdGhleSB3ZXJlbid0IHZlcnNpb25lZCwgcmVhZCBib3RoICovCisJCWlmIChyZDIpIHsKKwkJCXJlczIgPSByZWFkX2Fic19iYnQobXRkLCBidWYsIHJkMiwgY2hpcHNlbCk7CisJCQlpZiAobXRkX2lzX2VjY2VycihyZXMyKSkgeworCQkJCS8qIE1hcmsgdGFibGUgYXMgaW52YWxpZCAqLworCQkJCXJkMi0+cGFnZXNbaV0gPSAtMTsKKwkJCQlyZDItPnZlcnNpb25baV0gPSAwOworCQkJCWktLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIFNjcnViIHRoZSBmbGFzaCB0YWJsZShzKT8gKi8KKwkJaWYgKG10ZF9pc19iaXRmbGlwKHJlcykgfHwgbXRkX2lzX2JpdGZsaXAocmVzMikpCisJCQl3cml0ZW9wcyA9IDB4MDM7CisKKwkJLyogVXBkYXRlIHZlcnNpb24gbnVtYmVycyBiZWZvcmUgd3JpdGluZyAqLworCQlpZiAobWQpIHsKKwkJCXRkLT52ZXJzaW9uW2ldID0gbWF4KHRkLT52ZXJzaW9uW2ldLCBtZC0+dmVyc2lvbltpXSk7CisJCQltZC0+dmVyc2lvbltpXSA9IHRkLT52ZXJzaW9uW2ldOworCQl9CisKKwkJLyogV3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlPyAqLwogCQlpZiAoKHdyaXRlb3BzICYgMHgwMSkgJiYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CiAJCQlyZXMgPSB3cml0ZV9iYnQobXRkLCBidWYsIHRkLCBtZCwgY2hpcHNlbCk7CiAJCQlpZiAocmVzIDwgMCkKIAkJCQlyZXR1cm4gcmVzOwogCQl9CiAKLQkJLyogV3JpdGUgdGhlIG1pcnJvciBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZSA/ICovCisJCS8qIFdyaXRlIHRoZSBtaXJyb3IgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2U/ICovCiAJCWlmICgod3JpdGVvcHMgJiAweDAyKSAmJiBtZCAmJiAobWQtPm9wdGlvbnMgJiBOQU5EX0JCVF9XUklURSkpIHsKIAkJCXJlcyA9IHdyaXRlX2JidChtdGQsIGJ1ZiwgbWQsIHRkLCBjaGlwc2VsKTsKIAkJCWlmIChyZXMgPCAwKQpAQCAtMTAzMiwyMCArOTk4LDE5IEBACiAKIC8qKgogICogbWFya19iYnRfcmVnaW9ucyAtIFtHRU5FUklDXSBtYXJrIHRoZSBiYWQgYmxvY2sgdGFibGUgcmVnaW9ucwotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEB0ZDoJCWJhZCBibG9jayB0YWJsZSBkZXNjcmlwdG9yCisgKiBAbXRkOiBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRkOiBiYWQgYmxvY2sgdGFibGUgZGVzY3JpcHRvcgogICoKLSAqIFRoZSBiYWQgYmxvY2sgdGFibGUgcmVnaW9ucyBhcmUgbWFya2VkIGFzICJiYWQiIHRvIHByZXZlbnQKLSAqIGFjY2lkZW50YWwgZXJhc3VyZXMgLyB3cml0ZXMuIFRoZSByZWdpb25zIGFyZSBpZGVudGlmaWVkIGJ5Ci0gKiB0aGUgbWFyayAweDAyLgotKi8KKyAqIFRoZSBiYWQgYmxvY2sgdGFibGUgcmVnaW9ucyBhcmUgbWFya2VkIGFzICJiYWQiIHRvIHByZXZlbnQgYWNjaWRlbnRhbAorICogZXJhc3VyZXMgLyB3cml0ZXMuIFRoZSByZWdpb25zIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBtYXJrIDB4MDIuCisgKi8KIHN0YXRpYyB2b2lkIG1hcmtfYmJ0X3JlZ2lvbihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCWludCBpLCBqLCBjaGlwcywgYmxvY2ssIG5yYmxvY2tzLCB1cGRhdGU7CiAJdWludDhfdCBvbGR2YWwsIG5ld3ZhbDsKIAotCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXAgPyAqLworCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXA/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgewogCQljaGlwcyA9IHRoaXMtPm51bWNoaXBzOwogCQlucmJsb2NrcyA9IChpbnQpKHRoaXMtPmNoaXBzaXplID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CkBAIC0xMDgyLDkgKzEwNDcsMTEgQEAKIAkJCQl1cGRhdGUgPSAxOwogCQkJYmxvY2sgKz0gMjsKIAkJfQotCQkvKiBJZiB3ZSB3YW50IHJlc2VydmVkIGJsb2NrcyB0byBiZSByZWNvcmRlZCB0byBmbGFzaCwgYW5kIHNvbWUKLQkJICAgbmV3IG9uZXMgaGF2ZSBiZWVuIG1hcmtlZCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RvcmVkCi0JCSAgIGJidHMuICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbmNlLiAqLworCQkvKgorCQkgKiBJZiB3ZSB3YW50IHJlc2VydmVkIGJsb2NrcyB0byBiZSByZWNvcmRlZCB0byBmbGFzaCwgYW5kIHNvbWUKKwkJICogbmV3IG9uZXMgaGF2ZSBiZWVuIG1hcmtlZCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RvcmVkCisJCSAqIGJidHMuICBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbmNlLgorCQkgKi8KIAkJaWYgKHVwZGF0ZSAmJiB0ZC0+cmVzZXJ2ZWRfYmxvY2tfY29kZSkKIAkJCW5hbmRfdXBkYXRlX2JidChtdGQsIChsb2ZmX3QpKGJsb2NrIC0gMikgPDwgKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpKTsKIAl9CkBAIC0xMDkyLDggKzEwNTksOCBAQAogCiAvKioKICAqIHZlcmlmeV9iYnRfZGVzY3IgLSB2ZXJpZnkgdGhlIGJhZCBibG9jayBkZXNjcmlwdGlvbgotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBiZDoJCXRoZSB0YWJsZSB0byB2ZXJpZnkKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYmQ6IHRoZSB0YWJsZSB0byB2ZXJpZnkKICAqCiAgKiBUaGlzIGZ1bmN0aW9ucyBwZXJmb3JtcyBhIGZldyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBiYWQgYmxvY2sgZGVzY3JpcHRpb24KICAqIHRhYmxlLgpAQCAtMTExMSwxNiArMTA3OCwxNiBAQAogCXBhdHRlcm5fbGVuID0gYmQtPmxlbjsKIAliaXRzID0gYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OUkJJVFNfTVNLOwogCi0JQlVHX09OKCh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUX05PX09PQikgJiYKLQkJCSEodGhpcy0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVCkpOworCUJVR19PTigodGhpcy0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9OT19PT0IpICYmCisJCQkhKHRoaXMtPmJidF9vcHRpb25zICYgTkFORF9CQlRfVVNFX0ZMQVNIKSk7CiAJQlVHX09OKCFiaXRzKTsKIAogCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1ZFUlNJT04pCiAJCXBhdHRlcm5fbGVuKys7CiAKIAlpZiAoYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OT19PT0IpIHsKLQkJQlVHX09OKCEodGhpcy0+b3B0aW9ucyAmIE5BTkRfVVNFX0ZMQVNIX0JCVCkpOwotCQlCVUdfT04oISh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUX05PX09PQikpOworCQlCVUdfT04oISh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1VTRV9GTEFTSCkpOworCQlCVUdfT04oISh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX05PX09PQikpOwogCQlCVUdfT04oYmQtPm9mZnMpOwogCQlpZiAoYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKQogCQkJQlVHX09OKGJkLT52ZXJvZmZzICE9IGJkLT5sZW4pOwpAQCAtMTE0MCwxOCArMTEwNywxNiBAQAogCiAvKioKICAqIG5hbmRfc2Nhbl9iYnQgLSBbTkFORCBJbnRlcmZhY2VdIHNjYW4sIGZpbmQsIHJlYWQgYW5kIG1heWJlIGNyZWF0ZSBiYWQgYmxvY2sgdGFibGUocykKLSAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAYmQ6CQlkZXNjcmlwdG9yIGZvciB0aGUgZ29vZC9iYWQgYmxvY2sgc2VhcmNoIHBhdHRlcm4KKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYmQ6IGRlc2NyaXB0b3IgZm9yIHRoZSBnb29kL2JhZCBibG9jayBzZWFyY2ggcGF0dGVybgogICoKLSAqIFRoZSBmdW5jdGlvbiBjaGVja3MsIGlmIGEgYmFkIGJsb2NrIHRhYmxlKHMpIGlzL2FyZSBhbHJlYWR5Ci0gKiBhdmFpbGFibGUuIElmIG5vdCBpdCBzY2FucyB0aGUgZGV2aWNlIGZvciBtYW51ZmFjdHVyZXIKLSAqIG1hcmtlZCBnb29kIC8gYmFkIGJsb2NrcyBhbmQgd3JpdGVzIHRoZSBiYWQgYmxvY2sgdGFibGUocykgdG8KLSAqIHRoZSBzZWxlY3RlZCBwbGFjZS4KKyAqIFRoZSBmdW5jdGlvbiBjaGVja3MsIGlmIGEgYmFkIGJsb2NrIHRhYmxlKHMpIGlzL2FyZSBhbHJlYWR5IGF2YWlsYWJsZS4gSWYKKyAqIG5vdCBpdCBzY2FucyB0aGUgZGV2aWNlIGZvciBtYW51ZmFjdHVyZXIgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzIGFuZCB3cml0ZXMKKyAqIHRoZSBiYWQgYmxvY2sgdGFibGUocykgdG8gdGhlIHNlbGVjdGVkIHBsYWNlLgogICoKLSAqIFRoZSBiYWQgYmxvY2sgdGFibGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBoZXJlLiBJdCBtdXN0IGJlIGZyZWVkCi0gKiBieSBjYWxsaW5nIHRoZSBuYW5kX2ZyZWVfYmJ0IGZ1bmN0aW9uLgotICoKLSovCisgKiBUaGUgYmFkIGJsb2NrIHRhYmxlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaGVyZS4gSXQgbXVzdCBiZSBmcmVlZCBieSBjYWxsaW5nCisgKiB0aGUgbmFuZF9mcmVlX2JidCBmdW5jdGlvbi4KKyAqLwogaW50IG5hbmRfc2Nhbl9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKQEAgLTExNjEsMTkgKzExMjYsMjEgQEAKIAlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kID0gdGhpcy0+YmJ0X21kOwogCiAJbGVuID0gbXRkLT5zaXplID4+ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgKyAyKTsKLQkvKiBBbGxvY2F0ZSBtZW1vcnkgKDJiaXQgcGVyIGJsb2NrKSBhbmQgY2xlYXIgdGhlIG1lbW9yeSBiYWQgYmxvY2sgdGFibGUgKi8KKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSAoMmJpdCBwZXIgYmxvY2spIGFuZCBjbGVhciB0aGUgbWVtb3J5IGJhZCBibG9jaworCSAqIHRhYmxlLgorCSAqLwogCXRoaXMtPmJidCA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRoaXMtPmJidCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfc2Nhbl9iYnQ6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghdGhpcy0+YmJ0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKLQkvKiBJZiBubyBwcmltYXJ5IHRhYmxlIGRlY3JpcHRvciBpcyBnaXZlbiwgc2NhbiB0aGUgZGV2aWNlCi0JICogdG8gYnVpbGQgYSBtZW1vcnkgYmFzZWQgYmFkIGJsb2NrIHRhYmxlCisJLyoKKwkgKiBJZiBubyBwcmltYXJ5IHRhYmxlIGRlY3JpcHRvciBpcyBnaXZlbiwgc2NhbiB0aGUgZGV2aWNlIHRvIGJ1aWxkIGEKKwkgKiBtZW1vcnkgYmFzZWQgYmFkIGJsb2NrIHRhYmxlLgogCSAqLwogCWlmICghdGQpIHsKIAkJaWYgKChyZXMgPSBuYW5kX21lbW9yeV9iYnQobXRkLCBiZCkpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfYmJ0OiBDYW4ndCBzY2FuIGZsYXNoIGFuZCBidWlsZCB0aGUgUkFNLWJhc2VkIEJCVFxuIik7CisJCQlwcl9lcnIoIm5hbmRfYmJ0OiBjYW4ndCBzY2FuIGZsYXNoIGFuZCBidWlsZCB0aGUgUkFNLWJhc2VkIEJCVFxuIik7CiAJCQlrZnJlZSh0aGlzLT5iYnQpOwogCQkJdGhpcy0+YmJ0ID0gTlVMTDsKIAkJfQpAQCAtMTE4NywxMyArMTE1NCwxMiBAQAogCWxlbiArPSAobGVuID4+IHRoaXMtPnBhZ2Vfc2hpZnQpICogbXRkLT5vb2JzaXplOwogCWJ1ZiA9IHZtYWxsb2MobGVuKTsKIAlpZiAoIWJ1ZikgewotCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfYmJ0OiBPdXQgb2YgbWVtb3J5XG4iKTsKIAkJa2ZyZWUodGhpcy0+YmJ0KTsKIAkJdGhpcy0+YmJ0ID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogSXMgdGhlIGJidCBhdCBhIGdpdmVuIHBhZ2UgPyAqLworCS8qIElzIHRoZSBiYnQgYXQgYSBnaXZlbiBwYWdlPyAqLwogCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX0FCU1BBR0UpIHsKIAkJcmVzID0gcmVhZF9hYnNfYmJ0cyhtdGQsIGJ1ZiwgdGQsIG1kKTsKIAl9IGVsc2UgewpAQCAtMTIxNSwxNSArMTE4MSwxNSBAQAogCiAvKioKICAqIG5hbmRfdXBkYXRlX2JidCAtIFtOQU5EIEludGVyZmFjZV0gdXBkYXRlIGJhZCBibG9jayB0YWJsZShzKQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBvZmZzOgl0aGUgb2Zmc2V0IG9mIHRoZSBuZXdseSBtYXJrZWQgYmxvY2sKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2ZmczogdGhlIG9mZnNldCBvZiB0aGUgbmV3bHkgbWFya2VkIGJsb2NrCiAgKgotICogVGhlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGJhZCBibG9jayB0YWJsZShzKQotKi8KKyAqIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHRoZSBiYWQgYmxvY2sgdGFibGUocykuCisgKi8KIGludCBuYW5kX3VwZGF0ZV9iYnQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZmZzKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0JaW50IGxlbiwgcmVzID0gMCwgd3JpdGVvcHMgPSAwOworCWludCBsZW4sIHJlcyA9IDA7CiAJaW50IGNoaXAsIGNoaXBzZWw7CiAJdWludDhfdCAqYnVmOwogCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQgPSB0aGlzLT5iYnRfdGQ7CkBAIC0xMjM2LDE0ICsxMjAyLDEwIEBACiAJbGVuID0gKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKIAlsZW4gKz0gKGxlbiA+PiB0aGlzLT5wYWdlX3NoaWZ0KSAqIG10ZC0+b29ic2l6ZTsKIAlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJuYW5kX3VwZGF0ZV9iYnQ6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKLQl3cml0ZW9wcyA9IG1kICE9IE5VTEwgPyAweDAzIDogMHgwMTsKLQotCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXAgPyAqLworCS8qIERvIHdlIGhhdmUgYSBiYnQgcGVyIGNoaXA/ICovCiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfUEVSQ0hJUCkgewogCQljaGlwID0gKGludCkob2ZmcyA+PiB0aGlzLT5jaGlwX3NoaWZ0KTsKIAkJY2hpcHNlbCA9IGNoaXA7CkBAIC0xMjU2LDE0ICsxMjE4LDE0IEBACiAJaWYgKG1kKQogCQltZC0+dmVyc2lvbltjaGlwXSsrOwogCi0JLyogV3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlID8gKi8KLQlpZiAoKHdyaXRlb3BzICYgMHgwMSkgJiYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfV1JJVEUpKSB7CisJLyogV3JpdGUgdGhlIGJhZCBibG9jayB0YWJsZSB0byB0aGUgZGV2aWNlPyAqLworCWlmICh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSB7CiAJCXJlcyA9IHdyaXRlX2JidChtdGQsIGJ1ZiwgdGQsIG1kLCBjaGlwc2VsKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlnb3RvIG91dDsKIAl9Ci0JLyogV3JpdGUgdGhlIG1pcnJvciBiYWQgYmxvY2sgdGFibGUgdG8gdGhlIGRldmljZSA/ICovCi0JaWYgKCh3cml0ZW9wcyAmIDB4MDIpICYmIG1kICYmIChtZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSkgeworCS8qIFdyaXRlIHRoZSBtaXJyb3IgYmFkIGJsb2NrIHRhYmxlIHRvIHRoZSBkZXZpY2U/ICovCisJaWYgKG1kICYmIChtZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1dSSVRFKSkgewogCQlyZXMgPSB3cml0ZV9iYnQobXRkLCBidWYsIG1kLCB0ZCwgY2hpcHNlbCk7CiAJfQogCkBAIC0xMjcyLDggKzEyMzQsMTAgQEAKIAlyZXR1cm4gcmVzOwogfQogCi0vKiBEZWZpbmUgc29tZSBnZW5lcmljIGJhZCAvIGdvb2QgYmxvY2sgc2NhbiBwYXR0ZXJuIHdoaWNoIGFyZSB1c2VkCi0gKiB3aGlsZSBzY2FubmluZyBhIGRldmljZSBmb3IgZmFjdG9yeSBtYXJrZWQgZ29vZCAvIGJhZCBibG9ja3MuICovCisvKgorICogRGVmaW5lIHNvbWUgZ2VuZXJpYyBiYWQgLyBnb29kIGJsb2NrIHNjYW4gcGF0dGVybiB3aGljaCBhcmUgdXNlZAorICogd2hpbGUgc2Nhbm5pbmcgYSBkZXZpY2UgZm9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzLgorICovCiBzdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5bXSA9IHsgMHhmZiwgMHhmZiB9OwogCiBzdGF0aWMgdWludDhfdCBzY2FuX2FnYW5kX3BhdHRlcm5bXSA9IHsgMHgxQywgMHg3MSwgMHhDNywgMHgxQywgMHg3MSwgMHhDNyB9OwpAQCAtMTI4NSw4ICsxMjQ5LDcgQEAKIAkucGF0dGVybiA9IHNjYW5fYWdhbmRfcGF0dGVybgogfTsKIAotLyogR2VuZXJpYyBmbGFzaCBiYnQgZGVjcmlwdG9ycwotKi8KKy8qIEdlbmVyaWMgZmxhc2ggYmJ0IGRlc2NyaXB0b3JzICovCiBzdGF0aWMgdWludDhfdCBiYnRfcGF0dGVybltdID0geydCJywgJ2InLCAndCcsICcwJyB9Owogc3RhdGljIHVpbnQ4X3QgbWlycm9yX3BhdHRlcm5bXSA9IHsnMScsICd0JywgJ2InLCAnQicgfTsKIApAQCAtMTMzMCwzMSArMTI5MywyNyBAQAogCS5wYXR0ZXJuID0gbWlycm9yX3BhdHRlcm4KIH07CiAKLSNkZWZpbmUgQkJUX1NDQU5fT1BUSU9OUyAoTkFORF9CQlRfU0NBTkxBU1RQQUdFIHwgTkFORF9CQlRfU0NBTjJORFBBR0UgfCBcCi0JCU5BTkRfQkJUX1NDQU5CWVRFMUFORDYpCisjZGVmaW5lIEJBREJMT0NLX1NDQU5fTUFTSyAofk5BTkRfQkJUX05PX09PQikKIC8qKgotICogbmFuZF9jcmVhdGVfZGVmYXVsdF9iYnRfZGVzY3IgLSBbSW50ZXJuYWxdIENyZWF0ZXMgYSBCQlQgZGVzY3JpcHRvciBzdHJ1Y3R1cmUKLSAqIEB0aGlzOglOQU5EIGNoaXAgdG8gY3JlYXRlIGRlc2NyaXB0b3IgZm9yCisgKiBuYW5kX2NyZWF0ZV9iYWRibG9ja19wYXR0ZXJuIC0gW0lOVEVSTl0gQ3JlYXRlcyBhIEJCVCBkZXNjcmlwdG9yIHN0cnVjdHVyZQorICogQHRoaXM6IE5BTkQgY2hpcCB0byBjcmVhdGUgZGVzY3JpcHRvciBmb3IKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuYW5kX2JidF9kZXNjciBmb3IgQkJNIGRldGVjdGlvbgotICogYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgInRoaXMiLiBUaGUgbmV3IGRlc2NyaXB0b3IgaXMgc3RvcmVkIGluCisgKiBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiBAdGhpcy4gVGhlIG5ldyBkZXNjcmlwdG9yIGlzIHN0b3JlZCBpbgogICogdGhpcy0+YmFkYmxvY2tfcGF0dGVybi4gVGh1cywgdGhpcy0+YmFkYmxvY2tfcGF0dGVybiBzaG91bGQgYmUgTlVMTCB3aGVuCiAgKiBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KLSAqCiAgKi8KLXN0YXRpYyBpbnQgbmFuZF9jcmVhdGVfZGVmYXVsdF9iYnRfZGVzY3Ioc3RydWN0IG5hbmRfY2hpcCAqdGhpcykKK3N0YXRpYyBpbnQgbmFuZF9jcmVhdGVfYmFkYmxvY2tfcGF0dGVybihzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzKQogewogCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQ7CiAJaWYgKHRoaXMtPmJhZGJsb2NrX3BhdHRlcm4pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQkJUIGRlc2NyIGFscmVhZHkgYWxsb2NhdGVkOyBub3QgcmVwbGFjaW5nLlxuIik7CisJCXByX3dhcm4oIkJhZCBibG9jayBwYXR0ZXJuIGFscmVhZHkgYWxsb2NhdGVkOyBub3QgcmVwbGFjaW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWJkID0ga3phbGxvYyhzaXplb2YoKmJkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFiZCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5hbmRfY3JlYXRlX2RlZmF1bHRfYmJ0X2Rlc2NyOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJkKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYmQtPm9wdGlvbnMgPSB0aGlzLT5vcHRpb25zICYgQkJUX1NDQU5fT1BUSU9OUzsKKwliZC0+b3B0aW9ucyA9IHRoaXMtPmJidF9vcHRpb25zICYgQkFEQkxPQ0tfU0NBTl9NQVNLOwogCWJkLT5vZmZzID0gdGhpcy0+YmFkYmxvY2twb3M7CiAJYmQtPmxlbiA9ICh0aGlzLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgPyAyIDogMTsKIAliZC0+cGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybjsKQEAgLTEzNjUsMjIgKzEzMjQsMjAgQEAKIAogLyoqCiAgKiBuYW5kX2RlZmF1bHRfYmJ0IC0gW05BTkQgSW50ZXJmYWNlXSBTZWxlY3QgYSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmb3IgdGhlIGRldmljZQotICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZQotICogc3VwcG9ydCBmb3IgdGhlIGRldmljZSBhbmQgY2FsbHMgdGhlIG5hbmRfc2Nhbl9iYnQgZnVuY3Rpb24KLSAqCi0qLworICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBzdXBwb3J0IGZvciB0aGUgZGV2aWNlIGFuZAorICogY2FsbHMgdGhlIG5hbmRfc2Nhbl9iYnQgZnVuY3Rpb24uCisgKi8KIGludCBuYW5kX2RlZmF1bHRfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAKLQkvKiBEZWZhdWx0IGZvciBBRy1BTkQuIFdlIG11c3QgdXNlIGEgZmxhc2ggYmFzZWQKLQkgKiBiYWQgYmxvY2sgdGFibGUgYXMgdGhlIGRldmljZXMgaGF2ZSBmYWN0b3J5IG1hcmtlZAotCSAqIF9nb29kXyBibG9ja3MuIEVyYXNpbmcgdGhvc2UgYmxvY2tzIGxlYWRzIHRvIGxvc3MKLQkgKiBvZiB0aGUgZ29vZCAvIGJhZCBpbmZvcm1hdGlvbiwgc28gd2UgX211c3RfIHN0b3JlCi0JICogdGhpcyBpbmZvcm1hdGlvbiBpbiBhIGdvb2QgLyBiYWQgdGFibGUgZHVyaW5nCi0JICogc3RhcnR1cAorCS8qCisJICogRGVmYXVsdCBmb3IgQUctQU5ELiBXZSBtdXN0IHVzZSBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSBhcyB0aGUKKwkgKiBkZXZpY2VzIGhhdmUgZmFjdG9yeSBtYXJrZWQgX2dvb2RfIGJsb2Nrcy4gRXJhc2luZyB0aG9zZSBibG9ja3MKKwkgKiBsZWFkcyB0byBsb3NzIG9mIHRoZSBnb29kIC8gYmFkIGluZm9ybWF0aW9uLCBzbyB3ZSBfbXVzdF8gc3RvcmUgdGhpcworCSAqIGluZm9ybWF0aW9uIGluIGEgZ29vZCAvIGJhZCB0YWJsZSBkdXJpbmcgc3RhcnR1cC4KIAkgKi8KIAlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfSVNfQU5EKSB7CiAJCS8qIFVzZSB0aGUgZGVmYXVsdCBwYXR0ZXJuIGRlc2NyaXB0b3JzICovCkBAIC0xMzg4LDE1ICsxMzQ1LDE1IEBACiAJCQl0aGlzLT5iYnRfdGQgPSAmYmJ0X21haW5fZGVzY3I7CiAJCQl0aGlzLT5iYnRfbWQgPSAmYmJ0X21pcnJvcl9kZXNjcjsKIAkJfQotCQl0aGlzLT5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwkJdGhpcy0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOwogCQlyZXR1cm4gbmFuZF9zY2FuX2JidChtdGQsICZhZ2FuZF9mbGFzaGJhc2VkKTsKIAl9CiAKLQkvKiBJcyBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSByZXF1ZXN0ZWQgPyAqLwotCWlmICh0aGlzLT5vcHRpb25zICYgTkFORF9VU0VfRkxBU0hfQkJUKSB7CisJLyogSXMgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUgcmVxdWVzdGVkPyAqLworCWlmICh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRfQkJUX1VTRV9GTEFTSCkgewogCQkvKiBVc2UgdGhlIGRlZmF1bHQgcGF0dGVybiBkZXNjcmlwdG9ycyAqLwogCQlpZiAoIXRoaXMtPmJidF90ZCkgewotCQkJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlRfTk9fT09CKSB7CisJCQlpZiAodGhpcy0+YmJ0X29wdGlvbnMgJiBOQU5EX0JCVF9OT19PT0IpIHsKIAkJCQl0aGlzLT5iYnRfdGQgPSAmYmJ0X21haW5fbm9fYmJ0X2Rlc2NyOwogCQkJCXRoaXMtPmJidF9tZCA9ICZiYnRfbWlycm9yX25vX2JidF9kZXNjcjsKIAkJCX0gZWxzZSB7CkBAIC0xNDEwLDE4ICsxMzY3LDE3IEBACiAJfQogCiAJaWYgKCF0aGlzLT5iYWRibG9ja19wYXR0ZXJuKQotCQluYW5kX2NyZWF0ZV9kZWZhdWx0X2JidF9kZXNjcih0aGlzKTsKKwkJbmFuZF9jcmVhdGVfYmFkYmxvY2tfcGF0dGVybih0aGlzKTsKIAogCXJldHVybiBuYW5kX3NjYW5fYmJ0KG10ZCwgdGhpcy0+YmFkYmxvY2tfcGF0dGVybik7CiB9CiAKIC8qKgogICogbmFuZF9pc2JhZF9iYnQgLSBbTkFORCBJbnRlcmZhY2VdIENoZWNrIGlmIGEgYmxvY2sgaXMgYmFkCi0gKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQotICogQG9mZnM6CW9mZnNldCBpbiB0aGUgZGV2aWNlCi0gKiBAYWxsb3diYnQ6CWFsbG93IGFjY2VzcyB0byBiYWQgYmxvY2sgdGFibGUgcmVnaW9uCi0gKgotKi8KKyAqIEBtdGQ6IE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb2Zmczogb2Zmc2V0IGluIHRoZSBkZXZpY2UKKyAqIEBhbGxvd2JidDogYWxsb3cgYWNjZXNzIHRvIGJhZCBibG9jayB0YWJsZSByZWdpb24KKyAqLwogaW50IG5hbmRfaXNiYWRfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZmcywgaW50IGFsbG93YmJ0KQogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CkBAIC0xNDMyLDggKzEzODgsOSBAQAogCWJsb2NrID0gKGludCkob2ZmcyA+PiAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gMSkpOwogCXJlcyA9ICh0aGlzLT5iYnRbYmxvY2sgPj4gM10gPj4gKGJsb2NrICYgMHgwNikpICYgMHgwMzsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICJuYW5kX2lzYmFkX2JidCgpOiBiYnQgaW5mbyBmb3Igb2ZmcyAweCUwOHg6IChibG9jayAlZCkgMHglMDJ4XG4iLAotCSAgICAgICh1bnNpZ25lZCBpbnQpb2ZmcywgYmxvY2sgPj4gMSwgcmVzKTsKKwlwcl9kZWJ1ZygibmFuZF9pc2JhZF9iYnQoKTogYmJ0IGluZm8gZm9yIG9mZnMgMHglMDh4OiAiCisJCQkiKGJsb2NrICVkKSAweCUwMnhcbiIsCisJCQkodW5zaWduZWQgaW50KW9mZnMsIGJsb2NrID4+IDEsIHJlcyk7CiAKIAlzd2l0Y2ggKChpbnQpcmVzKSB7CiAJY2FzZSAweDAwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JjaC5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JjaC5jCmluZGV4IDBmOTMxZTcuLjM4MDNlMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iY2guYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmNoLmMKQEAgLTkzLDggKzkzLDggQEAKIAkJCQlidWZbZXJybG9jW2ldID4+IDNdIF49ICgxIDw8IChlcnJsb2NbaV0gJiA3KSk7CiAJCQkvKiBlbHNlIGVycm9yIGluIGVjYywgbm8gYWN0aW9uIG5lZWRlZCAqLwogCi0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGNvcnJlY3RlZCBiaXRmbGlwICV1XG4iLAotCQkJICAgICAgX19mdW5jX18sIGVycmxvY1tpXSk7CisJCQlwcl9kZWJ1ZygiJXM6IGNvcnJlY3RlZCBiaXRmbGlwICV1XG4iLCBfX2Z1bmNfXywKKwkJCQkJZXJybG9jW2ldKTsKIAkJfQogCX0gZWxzZSBpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZWNjIHVucmVjb3ZlcmFibGUgZXJyb3JcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2VjYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2VjYy5jCmluZGV4IDI3MWI4ZTcuLmI3Y2ZlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9lY2MuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfZWNjLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCiAvKgogICogYWRkcmVzc2JpdHMgaXMgYSBsb29rdXAgdGFibGUgdG8gZmlsdGVyIG91dCB0aGUgYml0cyBmcm9tIHRoZSB4b3ItZWQKLSAqIGVjYyBkYXRhIHRoYXQgaWRlbnRpZnkgdGhlIGZhdWx0eSBsb2NhdGlvbi4KKyAqIEVDQyBkYXRhIHRoYXQgaWRlbnRpZnkgdGhlIGZhdWx0eSBsb2NhdGlvbi4KICAqIHRoaXMgaXMgb25seSB1c2VkIGZvciByZXBhaXJpbmcgcGFyaXR5CiAgKiBzZWUgdGhlIGNvbW1lbnRzIGluIG5hbmRfY29ycmVjdF9kYXRhIGZvciBtb3JlIGRldGFpbHMKICAqLwpAQCAtMTUzLDcgKzE1Myw3IEBACiAgKiBfX25hbmRfY2FsY3VsYXRlX2VjYyAtIFtOQU5EIEludGVyZmFjZV0gQ2FsY3VsYXRlIDMtYnl0ZSBFQ0MgZm9yIDI1Ni81MTItYnl0ZQogICoJCQkgYmxvY2sKICAqIEBidWY6CWlucHV0IGJ1ZmZlciB3aXRoIHJhdyBkYXRhCi0gKiBAZWNjc2l6ZToJZGF0YSBieXRlcyBwZXIgZWNjIHN0ZXAgKDI1NiBvciA1MTIpCisgKiBAZWNjc2l6ZToJZGF0YSBieXRlcyBwZXIgRUNDIHN0ZXAgKDI1NiBvciA1MTIpCiAgKiBAY29kZToJb3V0cHV0IGJ1ZmZlciB3aXRoIEVDQwogICovCiB2b2lkIF9fbmFuZF9jYWxjdWxhdGVfZWNjKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGVjY3NpemUsCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJcnAxNyA9IChwYXIgXiBycDE2KSAmIDB4ZmY7CiAKIAkvKgotCSAqIEZpbmFsbHkgY2FsY3VsYXRlIHRoZSBlY2MgYml0cy4KKwkgKiBGaW5hbGx5IGNhbGN1bGF0ZSB0aGUgRUNDIGJpdHMuCiAJICogQWdhaW4gaGVyZSBpdCBtaWdodCBzZWVtIHRoYXQgdGhlcmUgYXJlIHBlcmZvcm1hbmNlIG9wdGltaXNhdGlvbnMKIAkgKiBwb3NzaWJsZSwgYnV0IGJlbmNobWFya3Mgc2hvd2VkIHRoYXQgb24gdGhlIHN5c3RlbSB0aGlzIGlzIGRldmVsb3BlZAogCSAqIHRoZSBjb2RlIGJlbG93IGlzIHRoZSBmYXN0ZXN0CkBAIC00MzYsNyArNDM2LDcgQEAKICAqIEBidWY6CXJhdyBkYXRhIHJlYWQgZnJvbSB0aGUgY2hpcAogICogQHJlYWRfZWNjOglFQ0MgZnJvbSB0aGUgY2hpcAogICogQGNhbGNfZWNjOgl0aGUgRUNDIGNhbGN1bGF0ZWQgZnJvbSByYXcgZGF0YQotICogQGVjY3NpemU6CWRhdGEgYnl0ZXMgcGVyIGVjYyBzdGVwICgyNTYgb3IgNTEyKQorICogQGVjY3NpemU6CWRhdGEgYnl0ZXMgcGVyIEVDQyBzdGVwICgyNTYgb3IgNTEyKQogICoKICAqIERldGVjdCBhbmQgY29ycmVjdCBhIDEgYml0IGVycm9yIGZvciBlY2NzaXplIGJ5dGUgYmxvY2sKICAqLwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJfQogCS8qIGNvdW50IG5yIG9mIGJpdHM7IHVzZSB0YWJsZSBsb29rdXAsIGZhc3RlciB0aGFuIGNhbGN1bGF0aW5nIGl0ICovCiAJaWYgKChiaXRzcGVyYnl0ZVtiMF0gKyBiaXRzcGVyYnl0ZVtiMV0gKyBiaXRzcGVyYnl0ZVtiMl0pID09IDEpCi0JCXJldHVybiAxOwkvKiBlcnJvciBpbiBlY2MgZGF0YTsgbm8gYWN0aW9uIG5lZWRlZCAqLworCQlyZXR1cm4gMTsJLyogZXJyb3IgaW4gRUNDIGRhdGE7IG5vIGFjdGlvbiBuZWVkZWQgKi8KIAogCXByaW50ayhLRVJOX0VSUiAidW5jb3JyZWN0YWJsZSBlcnJvciA6ICIpOwogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKaW5kZXggMzU3ZThjNS4uMzRjMDNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKQEAgLTIyNzMsOSArMjI3Myw5IEBACiAKIAlzd2l0Y2ggKGJidCkgewogCWNhc2UgMjoKLQkJIGNoaXAtPm9wdGlvbnMgfD0gTkFORF9VU0VfRkxBU0hfQkJUX05PX09PQjsKKwkJIGNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJUX05PX09PQjsKIAljYXNlIDE6Ci0JCSBjaGlwLT5vcHRpb25zIHw9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKwkJIGNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJUX1VTRV9GTEFTSDsKIAljYXNlIDA6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25kZmMuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCmluZGV4IGVhMmRlYTguLmVlMTcxMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCkBAIC00Miw3ICs0Miw2IEBACiAJc3RydWN0IG5hbmRfY2hpcCBjaGlwOwogCWludCBjaGlwX3NlbGVjdDsKIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sIG5kZmNfY29udHJvbDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CiB9OwogCiBzdGF0aWMgc3RydWN0IG5kZmNfY29udHJvbGxlciBuZGZjX2N0cmxbTkRGQ19NQVhfQ1NdOwpAQCAtMTU5LDEzICsxNTgsOSBAQAogc3RhdGljIGludCBuZGZjX2NoaXBfaW5pdChzdHJ1Y3QgbmRmY19jb250cm9sbGVyICpuZGZjLAogCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7Ci0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0Jc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfdHlwZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotI2Vsc2UKLQlzdGF0aWMgY29uc3QgY2hhciAqcGFydF90eXBlc1tdID0geyBOVUxMIH07Ci0jZW5kaWYKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZsYXNoX25wOwogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmbmRmYy0+Y2hpcDsKKwlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgcHBkYXRhOwogCWludCByZXQ7CiAKIAljaGlwLT5JT19BRERSX1IgPSBuZGZjLT5uZGZjYmFzZSArIE5ERkNfREFUQTsKQEAgLTE5Myw2ICsxODgsNyBAQAogCWlmICghZmxhc2hfbnApCiAJCXJldHVybiAtRU5PREVWOwogCisJcHBkYXRhLT5vZl9ub2RlID0gZmxhc2hfbnA7CiAJbmRmYy0+bXRkLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLiVzIiwKIAkJCWRldl9uYW1lKCZuZGZjLT5vZmRldi0+ZGV2KSwgZmxhc2hfbnAtPm5hbWUpOwogCWlmICghbmRmYy0+bXRkLm5hbWUpIHsKQEAgLTIwNCwxOCArMjAwLDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAotCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZuZGZjLT5tdGQsIHBhcnRfdHlwZXMsICZuZGZjLT5wYXJ0cywgMCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKCZuZGZjLT5vZmRldi0+ZGV2LCBmbGFzaF9ucCwKLQkJCQkJICAgICAgJm5kZmMtPnBhcnRzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZuZGZjLT5tdGQsIG5kZmMtPnBhcnRzLCByZXQpOworCXJldCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJm5kZmMtPm10ZCwgTlVMTCwgJnBwZGF0YSwgTlVMTCwgMCk7CiAKIGVycjoKIAlvZl9ub2RlX3B1dChmbGFzaF9ucCk7CkBAIC0yODgsNiArMjczLDcgQEAKIAlzdHJ1Y3QgbmRmY19jb250cm9sbGVyICpuZGZjID0gZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KTsKIAogCW5hbmRfcmVsZWFzZSgmbmRmYy0+bXRkKTsKKwlrZnJlZShuZGZjLT5tdGQubmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbm9tYWRpa19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL25vbWFkaWtfbmFuZC5jCmluZGV4IGI2YTVjODYuLmI0NjNlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbm9tYWRpa19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ub21hZGlrX25hbmQuYwpAQCAtMTg3LDYgKzE4Nyw3IEBACiAJCXBkYXRhLT5leGl0KCk7CiAKIAlpZiAoaG9zdCkgeworCQluYW5kX3JlbGVhc2UoJmhvc3QtPm10ZCk7CiAJCWlvdW5tYXAoaG9zdC0+Y21kX3ZhKTsKIAkJaW91bm1hcChob3N0LT5kYXRhX3ZhKTsKIAkJaW91bm1hcChob3N0LT5hZGRyX3ZhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbnVjOTAwX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbnVjOTAwX25hbmQuYwppbmRleCA5YzMwYTBiLi5mYThmYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL251YzkwMF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9udWM5MDBfbmFuZC5jCkBAIC0zMzksNiArMzM5LDcgQEAKIAlzdHJ1Y3QgbnVjOTAwX25hbmQgKm51YzkwMF9uYW5kID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKKwluYW5kX3JlbGVhc2UoJm51YzkwMF9uYW5kLT5tdGQpOwogCWlvdW5tYXAobnVjOTAwX25hbmQtPnJlZyk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jIGIvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCmluZGV4IDBkYjJjMGUuLmY3NDVmMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC05NCw4ICs5NSw2IEBACiAjZGVmaW5lIFA0ZV9zKGEpCShURihhICYgTkFORF9FY2NfUDRlKQkJPDwgMCkKICNkZWZpbmUgUDRvX3MoYSkJKFRGKGEgJiBOQU5EX0VjY19QNG8pCQk8PCAxKQogCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCiAvKiBvb2IgaW5mbyBnZW5lcmF0ZWQgcnVudGltZSBkZXBlbmRpbmcgb24gZWNjIGFsZ29yaXRobSBhbmQgbGF5b3V0IHNlbGVjdGVkICovCiBzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IG9tYXBfb29iaW5mbzsKIC8qIERlZmluZSBzb21lIGdlbmVyaWMgYmFkIC8gZ29vZCBibG9jayBzY2FuIHBhdHRlcm4gd2hpY2ggYXJlIHVzZWQKQEAgLTExNCw3ICsxMTMsNiBAQAogCXN0cnVjdCBuYW5kX2h3X2NvbnRyb2wJCWNvbnRyb2xsZXI7CiAJc3RydWN0IG9tYXBfbmFuZF9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKIAlzdHJ1Y3QgbXRkX2luZm8JCQltdGQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JCSpwYXJ0czsKIAlzdHJ1Y3QgbmFuZF9jaGlwCQluYW5kOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwogCkBAIC03NDQsMTIgKzc0MiwxMiBAQAogCiAJY2FzZSAxOgogCQkvKiBVbmNvcnJlY3RhYmxlIGVycm9yICovCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJFQ0MgVU5DT1JSRUNURURfRVJST1IgMVxuIik7CisJCXByX2RlYnVnKCJFQ0MgVU5DT1JSRUNURURfRVJST1IgMVxuIik7CiAJCXJldHVybiAtMTsKIAogCWNhc2UgMTE6CiAJCS8qIFVOLUNvcnJlY3RhYmxlIGVycm9yICovCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJFQ0MgVU5DT1JSRUNURURfRVJST1IgQlxuIik7CisJCXByX2RlYnVnKCJFQ0MgVU5DT1JSRUNURURfRVJST1IgQlxuIik7CiAJCXJldHVybiAtMTsKIAogCWNhc2UgMTI6CkBAIC03NjYsOCArNzY0LDggQEAKIAogCQlmaW5kX2JpdCA9IChlY2NfYml0WzVdIDw8IDIpICsgKGVjY19iaXRbM10gPDwgMSkgKyBlY2NfYml0WzFdOwogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJDb3JyZWN0aW5nIHNpbmdsZSBiaXQgRUNDIGVycm9yIGF0ICIKLQkJCQkib2Zmc2V0OiAlZCwgYml0OiAlZFxuIiwgZmluZF9ieXRlLCBmaW5kX2JpdCk7CisJCXByX2RlYnVnKCJDb3JyZWN0aW5nIHNpbmdsZSBiaXQgRUNDIGVycm9yIGF0IG9mZnNldDogIgorCQkJCSIlZCwgYml0OiAlZFxuIiwgZmluZF9ieXRlLCBmaW5kX2JpdCk7CiAKIAkJcGFnZV9kYXRhW2ZpbmRfYnl0ZV0gXj0gKDEgPDwgZmluZF9iaXQpOwogCkBAIC03NzksNyArNzc3LDcgQEAKIAkJCSAgICBlY2NfZGF0YTJbMl0gPT0gMCkKIAkJCQlyZXR1cm4gMDsKIAkJfQotCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiVU5DT1JSRUNURURfRVJST1IgZGVmYXVsdFxuIik7CisJCXByX2RlYnVnKCJVTkNPUlJFQ1RFRF9FUlJPUiBkZWZhdWx0XG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIH0KQEAgLTExMDMsMTMgKzExMDEsOCBAQAogCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CiAJfQogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmluZm8tPm10ZCwgcGFydF9wcm9iZXMsICZpbmZvLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA+IDApCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgaW5mby0+cGFydHMsIGVycik7Ci0JZWxzZSBpZiAocGRhdGEtPnBhcnRzKQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKLQllbHNlCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgTlVMTCwgMCk7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwLAorCQkJcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJmluZm8tPm10ZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvb3Jpb25fbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMKaW5kZXggNzc5NGQwNi4uMjlmNTA1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMKQEAgLTIxLDggKzIxLDYgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8cGxhdC9vcmlvbl9uYW5kLmg+CiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIHN0YXRpYyB2b2lkIG9yaW9uX25hbmRfY21kX2N0cmwoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsIHVuc2lnbmVkIGludCBjdHJsKQogewogCXN0cnVjdCBuYW5kX2NoaXAgKm5jID0gbXRkLT5wcml2OwpAQCAtODEsOCArNzksNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9ucyA9IE5VTEw7Ci0JaW50IG51bV9wYXJ0ID0gMDsKIAogCW5jID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkgKyBzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuYykgewpAQCAtMTMyLDE3ICsxMjgsOSBAQAogCQlnb3RvIG5vX2RldjsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKIAltdGQtPm5hbWUgPSAib3Jpb25fbmFuZCI7Ci0JbnVtX3BhcnQgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLCAmcGFydGl0aW9ucywgMCk7Ci0jZW5kaWYKLQkvKiBJZiBjbWRsaW5lIHBhcnRpdGlvbnMgaGF2ZSBiZWVuIHBhc3NlZCwgbGV0IHRoZW0gYmUgdXNlZCAqLwotCWlmIChudW1fcGFydCA8PSAwKSB7Ci0JCW51bV9wYXJ0ID0gYm9hcmQtPm5yX3BhcnRzOwotCQlwYXJ0aXRpb25zID0gYm9hcmQtPnBhcnRzOwotCX0KLQotCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwYXJ0aXRpb25zLCBudW1fcGFydCk7CisJcmV0ID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsIDAsCisJCQlib2FyZC0+cGFydHMsIGJvYXJkLT5ucl9wYXJ0cyk7CiAJaWYgKHJldCkgewogCQluYW5kX3JlbGVhc2UobXRkKTsKIAkJZ290byBub19kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Bhc2VtaV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Bhc2VtaV9uYW5kLmMKaW5kZXggYjFhYTQxYi4uYTk3MjY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9wYXNlbWlfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcGFzZW1pX25hbmQuYwpAQCAtMTU1LDcgKzE1NSw4IEBACiAJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOwogCiAJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCi0JY2hpcC0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfTk9fQVVUT0lOQ1I7CisJY2hpcC0+b3B0aW9ucyA9IE5BTkRfTk9fQVVUT0lOQ1I7CisJY2hpcC0+YmJ0X29wdGlvbnMgPSBOQU5EX0JCVF9VU0VfRkxBU0g7CiAKIAkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KIAlpZiAobmFuZF9zY2FuKHBhc2VtaV9uYW5kX210ZCwgMSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCmluZGV4IDYzM2MwNGIuLmVhOGUxMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwpAQCAtMjEsOCArMjEsNiBAQAogCXN0cnVjdCBuYW5kX2NoaXAJY2hpcDsKIAlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKIAl2b2lkIF9faW9tZW0JCSppb19iYXNlOwotCWludAkJCW5yX3BhcnRzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIH07CiAKIC8qCkBAIC03OSw2ICs3Nyw3IEBACiAJZGF0YS0+Y2hpcC5yZWFkX2J1ZiA9IHBkYXRhLT5jdHJsLnJlYWRfYnVmOwogCWRhdGEtPmNoaXAuY2hpcF9kZWxheSA9IHBkYXRhLT5jaGlwLmNoaXBfZGVsYXk7CiAJZGF0YS0+Y2hpcC5vcHRpb25zIHw9IHBkYXRhLT5jaGlwLm9wdGlvbnM7CisJZGF0YS0+Y2hpcC5iYnRfb3B0aW9ucyB8PSBwZGF0YS0+Y2hpcC5iYnRfb3B0aW9uczsKIAogCWRhdGEtPmNoaXAuZWNjLmh3Y3RsID0gcGRhdGEtPmN0cmwuaHdjb250cm9sOwogCWRhdGEtPmNoaXAuZWNjLmxheW91dCA9IHBkYXRhLT5jaGlwLmVjY2xheW91dDsKQEAgLTk5LDIzICs5OCw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChwZGF0YS0+Y2hpcC5wYXJ0X3Byb2JlX3R5cGVzKSB7Ci0JCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZkYXRhLT5tdGQsCi0JCQkJCXBkYXRhLT5jaGlwLnBhcnRfcHJvYmVfdHlwZXMsCi0JCQkJCSZkYXRhLT5wYXJ0cywgMCk7Ci0JCWlmIChlcnIgPiAwKSB7Ci0JCQltdGRfZGV2aWNlX3JlZ2lzdGVyKCZkYXRhLT5tdGQsIGRhdGEtPnBhcnRzLCBlcnIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKHBkYXRhLT5jaGlwLnNldF9wYXJ0cykKLQkJcGRhdGEtPmNoaXAuc2V0X3BhcnRzKGRhdGEtPm10ZC5zaXplLCAmcGRhdGEtPmNoaXApOwotCWlmIChwZGF0YS0+Y2hpcC5wYXJ0aXRpb25zKSB7Ci0JCWRhdGEtPnBhcnRzID0gcGRhdGEtPmNoaXAucGFydGl0aW9uczsKLQkJZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcigmZGF0YS0+bXRkLCBkYXRhLT5wYXJ0cywKLQkJCXBkYXRhLT5jaGlwLm5yX3BhcnRpdGlvbnMpOwotCX0gZWxzZQotCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZkYXRhLT5tdGQsIE5VTEwsIDApOworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmRhdGEtPm10ZCwKKwkJCXBkYXRhLT5jaGlwLnBhcnRfcHJvYmVfdHlwZXMsIDAsCisJCQlwZGF0YS0+Y2hpcC5wYXJ0aXRpb25zLCBwZGF0YS0+Y2hpcC5ucl9wYXJ0aXRpb25zKTsKIAogCWlmICghZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTQ1LDggKzEzMCw2IEBACiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAogCW5hbmRfcmVsZWFzZSgmZGF0YS0+bXRkKTsKLQlpZiAoZGF0YS0+cGFydHMgJiYgZGF0YS0+cGFydHMgIT0gcGRhdGEtPmNoaXAucGFydGl0aW9ucykKLQkJa2ZyZWUoZGF0YS0+cGFydHMpOwogCWlmIChwZGF0YS0+Y3RybC5yZW1vdmUpCiAJCXBkYXRhLT5jdHJsLnJlbW92ZShwZGV2KTsKIAlpb3VubWFwKGRhdGEtPmlvX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9wcGNoYW1lbGVvbmV2Yi5jIGIvZHJpdmVycy9tdGQvbmFuZC9wcGNoYW1lbGVvbmV2Yi5jCmluZGV4IDNiYmI3OTYuLjdlNTJhZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcHBjaGFtZWxlb25ldmIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3BwY2hhbWVsZW9uZXZiLmMKQEAgLTk5LDggKzk5LDYgQEAKIAogI2RlZmluZSBOVU1fUEFSVElUSU9OUyAxCiAKLWV4dGVybiBpbnQgcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywgY29uc3QgY2hhciAqbXRkX2lkKTsKLQogLyoKICAqCWhhcmR3YXJlIHNwZWNpZmljIGFjY2VzcyB0byBjb250cm9sLWxpbmVzCiAgKi8KQEAgLTE4NywxOCArMTg1LDEyIEBACiB9CiAjZW5kaWYKIAotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotY29uc3QgY2hhciAqcGFydF9wcm9iZXNfZXZiW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogLyoKICAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogICovCiBzdGF0aWMgaW50IF9faW5pdCBwcGNoYW1lbGVvbmV2Yl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQljb25zdCBjaGFyICpwYXJ0X3R5cGUgPSAwOwotCWludCBtdGRfcGFydHNfbmIgPSAwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICptdGRfcGFydHMgPSAwOwogCXZvaWQgX19pb21lbSAqcHBjaGFtZWxlb25fZmlvX2Jhc2U7CiAJdm9pZCBfX2lvbWVtICpwcGNoYW1lbGVvbmV2Yl9maW9fYmFzZTsKIApAQCAtMjgxLDI0ICsyNzMsMTMgQEAKICNlbmRpZgogCiAJcHBjaGFtZWxlb25fbXRkLT5uYW1lID0gInBwY2hhbWVsZW9uLW5hbmQiOwotCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKHBwY2hhbWVsZW9uX210ZCwgcGFydF9wcm9iZXMsICZtdGRfcGFydHMsIDApOwotCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQllbHNlCi0JCW10ZF9wYXJ0c19uYiA9IDA7Ci0KLQlpZiAobXRkX3BhcnRzX25iID09IDApIHsKLQkJaWYgKHBwY2hhbWVsZW9uX210ZC0+c2l6ZSA9PSBOQU5EX1NNQUxMX1NJWkUpCi0JCQltdGRfcGFydHMgPSBwYXJ0aXRpb25faW5mb19tZTsKLQkJZWxzZQotCQkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm9faGk7Ci0JCW10ZF9wYXJ0c19uYiA9IE5VTV9QQVJUSVRJT05TOwotCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKLQl9CiAKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwotCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7Ci0JbXRkX2RldmljZV9yZWdpc3RlcihwcGNoYW1lbGVvbl9tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKHBwY2hhbWVsZW9uX210ZCwgTlVMTCwgMCwKKwkJCXBwY2hhbWVsZW9uX210ZC0+c2l6ZSA9PSBOQU5EX1NNQUxMX1NJWkUgPworCQkJCXBhcnRpdGlvbl9pbmZvX21lIDoKKwkJCQlwYXJ0aXRpb25faW5mb19oaSwKKwkJCU5VTV9QQVJUSVRJT05TKTsKIAogIG5hbmRfZXZiX2luaXQ6CiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM4MiwyMSArMzYzLDEzIEBACiAJfQogCiAJcHBjaGFtZWxlb25ldmJfbXRkLT5uYW1lID0gTkFORF9FVkJfTVREX05BTUU7Ci0JbXRkX3BhcnRzX25iID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMocHBjaGFtZWxlb25ldmJfbXRkLCBwYXJ0X3Byb2Jlc19ldmIsICZtdGRfcGFydHMsIDApOwotCWlmIChtdGRfcGFydHNfbmIgPiAwKQotCQlwYXJ0X3R5cGUgPSAiY29tbWFuZCBsaW5lIjsKLQllbHNlCi0JCW10ZF9wYXJ0c19uYiA9IDA7Ci0KLQlpZiAobXRkX3BhcnRzX25iID09IDApIHsKLQkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm9fZXZiOwotCQltdGRfcGFydHNfbmIgPSBOVU1fUEFSVElUSU9OUzsKLQkJcGFydF90eXBlID0gInN0YXRpYyI7Ci0JfQogCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nICVzIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iLCBwYXJ0X3R5cGUpOwotCW10ZF9kZXZpY2VfcmVnaXN0ZXIocHBjaGFtZWxlb25ldmJfbXRkLCBtdGRfcGFydHMsIG10ZF9wYXJ0c19uYik7CisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihwcGNoYW1lbGVvbmV2Yl9tdGQsIE5VTEwsIDAsCisJCQlwcGNoYW1lbGVvbl9tdGQtPnNpemUgPT0gTkFORF9TTUFMTF9TSVpFID8KKwkJCQlwYXJ0aXRpb25faW5mb19tZSA6CisJCQkJcGFydGl0aW9uX2luZm9faGksCisJCQlOVU1fUEFSVElUSU9OUyk7CiAKIAkvKiBSZXR1cm4gaGFwcHkgKi8KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYwppbmRleCAxZmIzYjNhLi45ZWI3Zjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jCkBAIC0xMTAsNiArMTEwLDcgQEAKIAogZW51bSB7CiAJU1RBVEVfSURMRSA9IDAsCisJU1RBVEVfUFJFUEFSRUQsCiAJU1RBVEVfQ01EX0hBTkRMRSwKIAlTVEFURV9ETUFfUkVBRElORywKIAlTVEFURV9ETUFfV1JJVElORywKQEAgLTEyMCwyMSArMTIxLDQwIEBACiAJU1RBVEVfUkVBRFksCiB9OwogCi1zdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyB7Ci0Jc3RydWN0IG5hbmRfY2hpcAluYW5kX2NoaXA7CitzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCB7CisJc3RydWN0IG5hbmRfY2hpcAljaGlwOworCXN0cnVjdCBweGEzeHhfbmFuZF9jbWRzZXQgKmNtZHNldDsKKwlzdHJ1Y3QgbXRkX2luZm8gICAgICAgICAqbXRkOworCXZvaWQJCQkqaW5mb19kYXRhOwogCisJLyogcGFnZSBzaXplIG9mIGF0dGFjaGVkIGNoaXAgKi8KKwl1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsKKwlpbnQJCQl1c2VfZWNjOworCWludAkJCWNzOworCisJLyogY2FsY3VsYXRlZCBmcm9tIHB4YTN4eF9uYW5kX2ZsYXNoIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQJCWNvbF9hZGRyX2N5Y2xlczsKKwl1bnNpZ25lZCBpbnQJCXJvd19hZGRyX2N5Y2xlczsKKwlzaXplX3QJCQlyZWFkX2lkX2J5dGVzOworCisJLyogY2FjaGVkIHJlZ2lzdGVyIHZhbHVlICovCisJdWludDMyX3QJCXJlZ19uZGNyOworCXVpbnQzMl90CQluZHRyMGNzMDsKKwl1aW50MzJfdAkJbmR0cjFjczA7Cit9OworCitzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyB7CiAJc3RydWN0IG5hbmRfaHdfY29udHJvbAljb250cm9sbGVyOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJICpwZGV2OwotCXN0cnVjdCBweGEzeHhfbmFuZF9jbWRzZXQgKmNtZHNldDsKIAogCXN0cnVjdCBjbGsJCSpjbGs7CiAJdm9pZCBfX2lvbWVtCQkqbW1pb19iYXNlOwogCXVuc2lnbmVkIGxvbmcJCW1taW9fcGh5czsKKwlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7CiAKIAl1bnNpZ25lZCBpbnQgCQlidWZfc3RhcnQ7CiAJdW5zaWduZWQgaW50CQlidWZfY291bnQ7CiAKLQlzdHJ1Y3QgbXRkX2luZm8gICAgICAgICAqbXRkOwogCS8qIERNQSBpbmZvcm1hdGlvbiAqLwogCWludAkJCWRyY21yX2RhdDsKIAlpbnQJCQlkcmNtcl9jbWQ7CkBAIC0xNDIsNDQgKzE2MiwyNyBAQAogCXVuc2lnbmVkIGNoYXIJCSpkYXRhX2J1ZmY7CiAJdW5zaWduZWQgY2hhcgkJKm9vYl9idWZmOwogCWRtYV9hZGRyX3QgCQlkYXRhX2J1ZmZfcGh5czsKLQlzaXplX3QJCQlkYXRhX2J1ZmZfc2l6ZTsKIAlpbnQgCQkJZGF0YV9kbWFfY2g7CiAJc3RydWN0IHB4YV9kbWFfZGVzYwkqZGF0YV9kZXNjOwogCWRtYV9hZGRyX3QgCQlkYXRhX2Rlc2NfYWRkcjsKIAotCXVpbnQzMl90CQlyZWdfbmRjcjsKLQotCS8qIHNhdmVkIGNvbHVtbi9wYWdlX2FkZHIgZHVyaW5nIENNRF9TRVFJTiAqLwotCWludAkJCXNlcWluX2NvbHVtbjsKLQlpbnQJCQlzZXFpbl9wYWdlX2FkZHI7Ci0KLQkvKiByZWxhdGUgdG8gdGhlIGNvbW1hbmQgKi8KKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdFtOVU1fQ0hJUF9TRUxFQ1RdOwogCXVuc2lnbmVkIGludAkJc3RhdGU7CiAKKwlpbnQJCQljczsKIAlpbnQJCQl1c2VfZWNjOwkvKiB1c2UgSFcgRUNDID8gKi8KIAlpbnQJCQl1c2VfZG1hOwkvKiB1c2UgRE1BID8gKi8KIAlpbnQJCQlpc19yZWFkeTsKIAogCXVuc2lnbmVkIGludAkJcGFnZV9zaXplOwkvKiBwYWdlIHNpemUgb2YgYXR0YWNoZWQgY2hpcCAqLwogCXVuc2lnbmVkIGludAkJZGF0YV9zaXplOwkvKiBkYXRhIHNpemUgaW4gRklGTyAqLworCXVuc2lnbmVkIGludAkJb29iX3NpemU7CiAJaW50IAkJCXJldGNvZGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24gCWNtZF9jb21wbGV0ZTsKIAogCS8qIGdlbmVyYXRlZCBORENCeCByZWdpc3RlciB2YWx1ZXMgKi8KIAl1aW50MzJfdAkJbmRjYjA7CiAJdWludDMyX3QJCW5kY2IxOwogCXVpbnQzMl90CQluZGNiMjsKLQotCS8qIHRpbWluZyBjYWxjdXRlZCBmcm9tIHNldHRpbmcgKi8KLQl1aW50MzJfdAkJbmR0cjBjczA7Ci0JdWludDMyX3QJCW5kdHIxY3MwOwotCi0JLyogY2FsY3VsYXRlZCBmcm9tIHB4YTN4eF9uYW5kX2ZsYXNoIGRhdGEgKi8KLQlzaXplX3QJCW9vYl9zaXplOwotCXNpemVfdAkJcmVhZF9pZF9ieXRlczsKLQotCXVuc2lnbmVkIGludAljb2xfYWRkcl9jeWNsZXM7Ci0JdW5zaWduZWQgaW50CXJvd19hZGRyX2N5Y2xlczsKIH07CiAKIHN0YXRpYyBpbnQgdXNlX2RtYSA9IDE7CkBAIC0yMjUsNyArMjI4LDcgQEAKIC8qIERlZmluZSBhIGRlZmF1bHQgZmxhc2ggdHlwZSBzZXR0aW5nIHNlcnZlIGFzIGZsYXNoIGRldGVjdGluZyBvbmx5ICovCiAjZGVmaW5lIERFRkFVTFRfRkxBU0hfVFlQRSAoJmJ1aWx0aW5fZmxhc2hfdHlwZXNbMF0pCiAKLWNvbnN0IGNoYXIgKm10ZF9uYW1lc1tdID0geyJweGEzeHhfbmFuZC0wIiwgTlVMTH07Citjb25zdCBjaGFyICptdGRfbmFtZXNbXSA9IHsicHhhM3h4X25hbmQtMCIsICJweGEzeHhfbmFuZC0xIiwgTlVMTH07CiAKICNkZWZpbmUgTkRUUjBfdENIKGMpCShtaW4oKGMpLCA3KSA8PCAxOSkKICNkZWZpbmUgTkRUUjBfdENTKGMpCShtaW4oKGMpLCA3KSA8PCAxNikKQEAgLTI0MSw5ICsyNDQsMTAgQEAKIC8qIGNvbnZlcnQgbmFuby1zZWNvbmRzIHRvIG5hbmQgZmxhc2ggY29udHJvbGxlciBjbG9jayBjeWNsZXMgKi8KICNkZWZpbmUgbnMyY3ljbGUobnMsIGNsaykJKGludCkoKG5zKSAqIChjbGsgLyAxMDAwMDAwKSAvIDEwMDApCiAKLXN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3NldF90aW1pbmcoc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8sCitzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF9zZXRfdGltaW5nKHN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBweGEzeHhfbmFuZF90aW1pbmcgKnQpCiB7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBuYW5kX2NsayA9IGNsa19nZXRfcmF0ZShpbmZvLT5jbGspOwogCXVpbnQzMl90IG5kdHIwLCBuZHRyMTsKIApAQCAtMjU4LDIzICsyNjIsMjQgQEAKIAkJTkRUUjFfdFdIUihuczJjeWNsZSh0LT50V0hSLCBuYW5kX2NsaykpIHwKIAkJTkRUUjFfdEFSKG5zMmN5Y2xlKHQtPnRBUiwgbmFuZF9jbGspKTsKIAotCWluZm8tPm5kdHIwY3MwID0gbmR0cjA7Ci0JaW5mby0+bmR0cjFjczAgPSBuZHRyMTsKKwlob3N0LT5uZHRyMGNzMCA9IG5kdHIwOworCWhvc3QtPm5kdHIxY3MwID0gbmR0cjE7CiAJbmFuZF93cml0ZWwoaW5mbywgTkRUUjBDUzAsIG5kdHIwKTsKIAluYW5kX3dyaXRlbChpbmZvLCBORFRSMUNTMCwgbmR0cjEpOwogfQogCiBzdGF0aWMgdm9pZCBweGEzeHhfc2V0X2RhdGFzaXplKHN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvKQogewotCWludCBvb2JfZW5hYmxlID0gaW5mby0+cmVnX25kY3IgJiBORENSX1NQQVJFX0VOOworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gaW5mby0+aG9zdFtpbmZvLT5jc107CisJaW50IG9vYl9lbmFibGUgPSBob3N0LT5yZWdfbmRjciAmIE5EQ1JfU1BBUkVfRU47CiAKLQlpbmZvLT5kYXRhX3NpemUgPSBpbmZvLT5wYWdlX3NpemU7CisJaW5mby0+ZGF0YV9zaXplID0gaG9zdC0+cGFnZV9zaXplOwogCWlmICghb29iX2VuYWJsZSkgewogCQlpbmZvLT5vb2Jfc2l6ZSA9IDA7CiAJCXJldHVybjsKIAl9CiAKLQlzd2l0Y2ggKGluZm8tPnBhZ2Vfc2l6ZSkgeworCXN3aXRjaCAoaG9zdC0+cGFnZV9zaXplKSB7CiAJY2FzZSAyMDQ4OgogCQlpbmZvLT5vb2Jfc2l6ZSA9IChpbmZvLT51c2VfZWNjKSA/IDQwIDogNjQ7CiAJCWJyZWFrOwpAQCAtMjkyLDkgKzI5NywxMCBAQAogICovCiBzdGF0aWMgdm9pZCBweGEzeHhfbmFuZF9zdGFydChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IGluZm8tPmhvc3RbaW5mby0+Y3NdOwogCXVpbnQzMl90IG5kY3I7CiAKLQluZGNyID0gaW5mby0+cmVnX25kY3I7CisJbmRjciA9IGhvc3QtPnJlZ19uZGNyOwogCW5kY3IgfD0gaW5mby0+dXNlX2VjYyA/IE5EQ1JfRUNDX0VOIDogMDsKIAluZGNyIHw9IGluZm8tPnVzZV9kbWEgPyBORENSX0RNQV9FTiA6IDA7CiAJbmRjciB8PSBORENSX05EX1JVTjsKQEAgLTM1OSw3ICszNjUsNyBAQAogCQkJCQlESVZfUk9VTkRfVVAoaW5mby0+b29iX3NpemUsIDQpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKIAkJCQlpbmZvLT5zdGF0ZSk7CiAJCUJVRygpOwogCX0KQEAgLTM4NSw3ICszOTEsNyBAQAogCQlkZXNjLT5kY21kIHw9IERDTURfSU5DVFJHQUREUiB8IERDTURfRkxPV1NSQzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKIAkJCQlpbmZvLT5zdGF0ZSk7CiAJCUJVRygpOwogCX0KQEAgLTQxNiw2ICs0MjIsMTUgQEAKIHsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGRldmlkOwogCXVuc2lnbmVkIGludCBzdGF0dXMsIGlzX2NvbXBsZXRlZCA9IDA7CisJdW5zaWduZWQgaW50IHJlYWR5LCBjbWRfZG9uZTsKKworCWlmIChpbmZvLT5jcyA9PSAwKSB7CisJCXJlYWR5ICAgICAgICAgICA9IE5EU1JfRkxBU0hfUkRZOworCQljbWRfZG9uZSAgICAgICAgPSBORFNSX0NTMF9DTUREOworCX0gZWxzZSB7CisJCXJlYWR5ICAgICAgICAgICA9IE5EU1JfUkRZOworCQljbWRfZG9uZSAgICAgICAgPSBORFNSX0NTMV9DTUREOworCX0KIAogCXN0YXR1cyA9IG5hbmRfcmVhZGwoaW5mbywgTkRTUik7CiAKQEAgLTQzNywxMSArNDUyLDExIEBACiAJCQloYW5kbGVfZGF0YV9waW8oaW5mbyk7CiAJCX0KIAl9Ci0JaWYgKHN0YXR1cyAmIE5EU1JfQ1MwX0NNREQpIHsKKwlpZiAoc3RhdHVzICYgY21kX2RvbmUpIHsKIAkJaW5mby0+c3RhdGUgPSBTVEFURV9DTURfRE9ORTsKIAkJaXNfY29tcGxldGVkID0gMTsKIAl9Ci0JaWYgKHN0YXR1cyAmIE5EU1JfRkxBU0hfUkRZKSB7CisJaWYgKHN0YXR1cyAmIHJlYWR5KSB7CiAJCWluZm8tPmlzX3JlYWR5ID0gMTsKIAkJaW5mby0+c3RhdGUgPSBTVEFURV9SRUFEWTsKIAl9CkBAIC00NjMsMTIgKzQ3OCw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHB4YTN4eF9uYW5kX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKLQlyZXR1cm4gKG5hbmRfcmVhZGwoaW5mbywgTkRTUikgJiBORFNSX1JEWSkgPyAxIDogMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgaXNfYnVmX2JsYW5rKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCkBAIC00ODEsMTAgKzQ5MCwxMiBAQAogCQl1aW50MTZfdCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCiB7CiAJdWludDE2X3QgY21kOwotCWludCBhZGRyX2N5Y2xlLCBleGVjX2NtZCwgbmRjYjA7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7CisJaW50IGFkZHJfY3ljbGUsIGV4ZWNfY21kOworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0OworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCi0JbmRjYjAgPSAwOworCWhvc3QgPSBpbmZvLT5ob3N0W2luZm8tPmNzXTsKKwltdGQgPSBob3N0LT5tdGQ7CiAJYWRkcl9jeWNsZSA9IDA7CiAJZXhlY19jbWQgPSAxOwogCkBAIC00OTUsNiArNTA2LDEwIEBACiAJaW5mby0+dXNlX2VjYwkJPSAwOwogCWluZm8tPmlzX3JlYWR5CQk9IDA7CiAJaW5mby0+cmV0Y29kZQkJPSBFUlJfTk9ORTsKKwlpZiAoaW5mby0+Y3MgIT0gMCkKKwkJaW5mby0+bmRjYjAgPSBORENCMF9DU0VMOworCWVsc2UKKwkJaW5mby0+bmRjYjAgPSAwOwogCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBOQU5EX0NNRF9SRUFEMDoKQEAgLTUxMiwyMCArNTI3LDE5IEBACiAJCWJyZWFrOwogCX0KIAotCWluZm8tPm5kY2IwID0gbmRjYjA7Ci0JYWRkcl9jeWNsZSA9IE5EQ0IwX0FERFJfQ1lDKGluZm8tPnJvd19hZGRyX2N5Y2xlcwotCQkJCSAgICArIGluZm8tPmNvbF9hZGRyX2N5Y2xlcyk7CisJYWRkcl9jeWNsZSA9IE5EQ0IwX0FERFJfQ1lDKGhvc3QtPnJvd19hZGRyX2N5Y2xlcworCQkJCSAgICArIGhvc3QtPmNvbF9hZGRyX2N5Y2xlcyk7CiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIE5BTkRfQ01EX1JFQURPT0I6CiAJY2FzZSBOQU5EX0NNRF9SRUFEMDoKLQkJY21kID0gaW5mby0+Y21kc2V0LT5yZWFkMTsKKwkJY21kID0gaG9zdC0+Y21kc2V0LT5yZWFkMTsKIAkJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfUkVBRE9PQikKIAkJCWluZm8tPmJ1Zl9zdGFydCA9IG10ZC0+d3JpdGVzaXplICsgY29sdW1uOwogCQllbHNlCiAJCQlpbmZvLT5idWZfc3RhcnQgPSBjb2x1bW47CiAKLQkJaWYgKHVubGlrZWx5KGluZm8tPnBhZ2Vfc2l6ZSA8IFBBR0VfQ0hVTktfU0laRSkpCisJCWlmICh1bmxpa2VseShob3N0LT5wYWdlX3NpemUgPCBQQUdFX0NIVU5LX1NJWkUpKQogCQkJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoMCkKIAkJCQkJfCBhZGRyX2N5Y2xlCiAJCQkJCXwgKGNtZCAmIE5EQ0IwX0NNRDFfTUFTSyk7CkBAIC01MzcsNyArNTUxLDcgQEAKIAogCWNhc2UgTkFORF9DTURfU0VRSU46CiAJCS8qIHNtYWxsIHBhZ2UgYWRkciBzZXR0aW5nICovCi0JCWlmICh1bmxpa2VseShpbmZvLT5wYWdlX3NpemUgPCBQQUdFX0NIVU5LX1NJWkUpKSB7CisJCWlmICh1bmxpa2VseShob3N0LT5wYWdlX3NpemUgPCBQQUdFX0NIVU5LX1NJWkUpKSB7CiAJCQlpbmZvLT5uZGNiMSA9ICgocGFnZV9hZGRyICYgMHhGRkZGRkYpIDw8IDgpCiAJCQkJCXwgKGNvbHVtbiAmIDB4RkYpOwogCkBAIC01NjQsNyArNTc4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJY21kID0gaW5mby0+Y21kc2V0LT5wcm9ncmFtOworCQljbWQgPSBob3N0LT5jbWRzZXQtPnByb2dyYW07CiAJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDB4MSkKIAkJCQl8IE5EQ0IwX0FVVE9fUlMKIAkJCQl8IE5EQ0IwX1NUX1JPV19FTgpAQCAtNTc0LDggKzU4OCw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBOQU5EX0NNRF9SRUFESUQ6Ci0JCWNtZCA9IGluZm8tPmNtZHNldC0+cmVhZF9pZDsKLQkJaW5mby0+YnVmX2NvdW50ID0gaW5mby0+cmVhZF9pZF9ieXRlczsKKwkJY21kID0gaG9zdC0+Y21kc2V0LT5yZWFkX2lkOworCQlpbmZvLT5idWZfY291bnQgPSBob3N0LT5yZWFkX2lkX2J5dGVzOwogCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSgzKQogCQkJCXwgTkRDQjBfQUREUl9DWUMoMSkKIAkJCQl8IGNtZDsKQEAgLTU4Myw3ICs1OTcsNyBAQAogCQlpbmZvLT5kYXRhX3NpemUgPSA4OwogCQlicmVhazsKIAljYXNlIE5BTkRfQ01EX1NUQVRVUzoKLQkJY21kID0gaW5mby0+Y21kc2V0LT5yZWFkX3N0YXR1czsKKwkJY21kID0gaG9zdC0+Y21kc2V0LT5yZWFkX3N0YXR1czsKIAkJaW5mby0+YnVmX2NvdW50ID0gMTsKIAkJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoNCkKIAkJCQl8IE5EQ0IwX0FERFJfQ1lDKDEpCkBAIC01OTMsNyArNjA3LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE5BTkRfQ01EX0VSQVNFMToKLQkJY21kID0gaW5mby0+Y21kc2V0LT5lcmFzZTsKKwkJY21kID0gaG9zdC0+Y21kc2V0LT5lcmFzZTsKIAkJaW5mby0+bmRjYjAgfD0gTkRDQjBfQ01EX1RZUEUoMikKIAkJCQl8IE5EQ0IwX0FVVE9fUlMKIAkJCQl8IE5EQ0IwX0FERFJfQ1lDKDMpCkBAIC02MDQsNyArNjE4LDcgQEAKIAogCQlicmVhazsKIAljYXNlIE5BTkRfQ01EX1JFU0VUOgotCQljbWQgPSBpbmZvLT5jbWRzZXQtPnJlc2V0OworCQljbWQgPSBob3N0LT5jbWRzZXQtPnJlc2V0OwogCQlpbmZvLT5uZGNiMCB8PSBORENCMF9DTURfVFlQRSg1KQogCQkJCXwgY21kOwogCkBAIC02MTYsOCArNjMwLDggQEAKIAogCWRlZmF1bHQ6CiAJCWV4ZWNfY21kID0gMDsKLQkJcHJpbnRrKEtFUk5fRVJSICJweGEzeHgtbmFuZDogbm9uLXN1cHBvcnRlZCIKLQkJCSIgY29tbWFuZCAleFxuIiwgY29tbWFuZCk7CisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIm5vbi1zdXBwb3J0ZWQgY29tbWFuZCAleFxuIiwKKwkJCQljb21tYW5kKTsKIAkJYnJlYWs7CiAJfQogCkBAIC02MjcsNyArNjQxLDggQEAKIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX2NtZGZ1bmMoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsCiAJCQkJaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKIHsKLQlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IGhvc3QtPmluZm9fZGF0YTsKIAlpbnQgcmV0LCBleGVjX2NtZDsKIAogCS8qCkBAIC02MzUsOSArNjUwLDIxIEBACiAJICogImJ5dGUiIGFkZHJlc3MgaW50byBhICJ3b3JkIiBhZGRyZXNzIGFwcHJvcHJpYXRlCiAJICogZm9yIGluZGV4aW5nIGEgd29yZC1vcmllbnRlZCBkZXZpY2UKIAkgKi8KLQlpZiAoaW5mby0+cmVnX25kY3IgJiBORENSX0RXSURUSF9NKQorCWlmIChob3N0LT5yZWdfbmRjciAmIE5EQ1JfRFdJRFRIX00pCiAJCWNvbHVtbiAvPSAyOwogCisJLyoKKwkgKiBUaGVyZSBtYXkgYmUgZGlmZmVyZW50IE5BTkQgY2hpcCBob29rZWQgdG8KKwkgKiBkaWZmZXJlbnQgY2hpcCBzZWxlY3QsIHNvIGNoZWNrIHdoZXRoZXIKKwkgKiBjaGlwIHNlbGVjdCBoYXMgYmVlbiBjaGFuZ2VkLCBpZiB5ZXMsIHJlc2V0IHRoZSB0aW1pbmcKKwkgKi8KKwlpZiAoaW5mby0+Y3MgIT0gaG9zdC0+Y3MpIHsKKwkJaW5mby0+Y3MgPSBob3N0LT5jczsKKwkJbmFuZF93cml0ZWwoaW5mbywgTkRUUjBDUzAsIGhvc3QtPm5kdHIwY3MwKTsKKwkJbmFuZF93cml0ZWwoaW5mbywgTkRUUjFDUzAsIGhvc3QtPm5kdHIxY3MwKTsKKwl9CisKKwlpbmZvLT5zdGF0ZSA9IFNUQVRFX1BSRVBBUkVEOwogCWV4ZWNfY21kID0gcHJlcGFyZV9jb21tYW5kX3Bvb2woaW5mbywgY29tbWFuZCwgY29sdW1uLCBwYWdlX2FkZHIpOwogCWlmIChleGVjX2NtZCkgewogCQlpbml0X2NvbXBsZXRpb24oJmluZm8tPmNtZF9jb21wbGV0ZSk7CkBAIC02NDYsMTIgKzY3MywxMiBAQAogCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmNtZF9jb21wbGV0ZSwKIAkJCQlDSElQX0RFTEFZX1RJTUVPVVQpOwogCQlpZiAoIXJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJXYWl0IHRpbWUgb3V0ISEhXG4iKTsKKwkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIldhaXQgdGltZSBvdXQhISFcbiIpOwogCQkJLyogU3RvcCBTdGF0ZSBNYWNoaW5lIGZvciBuZXh0IGNvbW1hbmQgY3ljbGUgKi8KIAkJCXB4YTN4eF9uYW5kX3N0b3AoaW5mbyk7CiAJCX0KLQkJaW5mby0+c3RhdGUgPSBTVEFURV9JRExFOwogCX0KKwlpbmZvLT5zdGF0ZSA9IFNUQVRFX0lETEU7CiB9CiAKIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsCkBAIC02NjQsNyArNjkxLDggQEAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfcmVhZF9wYWdlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1aW50OF90ICpidWYsIGludCBwYWdlKQogewotCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gaG9zdC0+aW5mb19kYXRhOwogCiAJY2hpcC0+cmVhZF9idWYobXRkLCBidWYsIG10ZC0+d3JpdGVzaXplKTsKIAljaGlwLT5yZWFkX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7CkBAIC02ODUsNiArNzEzLDggQEAKIAkJICogT09CLCBpZ25vcmUgc3VjaCBkb3VibGUgYml0IGVycm9ycwogCQkgKi8KIAkJaWYgKGlzX2J1Zl9ibGFuayhidWYsIG10ZC0+d3JpdGVzaXplKSkKKwkJCWluZm8tPnJldGNvZGUgPSBFUlJfTk9ORTsKKwkJZWxzZQogCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7CiAJfQogCkBAIC02OTMsNyArNzIzLDggQEAKIAogc3RhdGljIHVpbnQ4X3QgcHhhM3h4X25hbmRfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewotCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gaG9zdC0+aW5mb19kYXRhOwogCWNoYXIgcmV0dmFsID0gMHhGRjsKIAogCWlmIChpbmZvLT5idWZfc3RhcnQgPCBpbmZvLT5idWZfY291bnQpCkBAIC03MDUsNyArNzM2LDggQEAKIAogc3RhdGljIHUxNiBweGEzeHhfbmFuZF9yZWFkX3dvcmQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJdTE2IHJldHZhbCA9IDB4RkZGRjsKIAogCWlmICghKGluZm8tPmJ1Zl9zdGFydCAmIDB4MDEpICYmIGluZm8tPmJ1Zl9zdGFydCA8IGluZm8tPmJ1Zl9jb3VudCkgewpAQCAtNzE3LDcgKzc0OSw4IEBACiAKIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJaW50IHJlYWxfbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIGluZm8tPmJ1Zl9jb3VudCAtIGluZm8tPmJ1Zl9zdGFydCk7CiAKIAltZW1jcHkoYnVmLCBpbmZvLT5kYXRhX2J1ZmYgKyBpbmZvLT5idWZfc3RhcnQsIHJlYWxfbGVuKTsKQEAgLTcyNyw3ICs3NjAsOCBAQAogc3RhdGljIHZvaWQgcHhhM3h4X25hbmRfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQljb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJaW50IHJlYWxfbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIGluZm8tPmJ1Zl9jb3VudCAtIGluZm8tPmJ1Zl9zdGFydCk7CiAKIAltZW1jcHkoaW5mby0+ZGF0YV9idWZmICsgaW5mby0+YnVmX3N0YXJ0LCBidWYsIHJlYWxfbGVuKTsKQEAgLTc0Nyw3ICs3ODEsOCBAQAogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3dhaXRmdW5jKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzKQogewotCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gbXRkLT5wcml2OworCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gaG9zdC0+aW5mb19kYXRhOwogCiAJLyogcHhhM3h4X25hbmRfc2VuZF9jb21tYW5kIGhhcyB3YWl0ZWQgZm9yIGNvbW1hbmQgY29tcGxldGUgKi8KIAlpZiAodGhpcy0+c3RhdGUgPT0gRkxfV1JJVElORyB8fCB0aGlzLT5zdGF0ZSA9PSBGTF9FUkFTSU5HKSB7CkBAIC03NzAsNTQgKzgwNSw3MCBAQAogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBpbmZvLT5wZGV2OwogCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBweGEzeHhfbmFuZF9ob3N0ICpob3N0ID0gaW5mby0+aG9zdFtpbmZvLT5jc107CiAJdWludDMyX3QgbmRjciA9IDB4MDsgLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCiAKLQlpZiAoZi0+cGFnZV9zaXplICE9IDIwNDggJiYgZi0+cGFnZV9zaXplICE9IDUxMikKKwlpZiAoZi0+cGFnZV9zaXplICE9IDIwNDggJiYgZi0+cGFnZV9zaXplICE9IDUxMikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDdXJyZW50IG9ubHkgc3VwcG9ydCAyMDQ4IGFuZCA1MTIgc2l6ZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWlmIChmLT5mbGFzaF93aWR0aCAhPSAxNiAmJiBmLT5mbGFzaF93aWR0aCAhPSA4KQorCWlmIChmLT5mbGFzaF93aWR0aCAhPSAxNiAmJiBmLT5mbGFzaF93aWR0aCAhPSA4KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk9ubHkgc3VwcG9ydCA4Yml0IGFuZCAxNiBiaXQhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogY2FsY3VsYXRlIGZsYXNoIGluZm9ybWF0aW9uICovCi0JaW5mby0+Y21kc2V0ID0gJmRlZmF1bHRfY21kc2V0OwotCWluZm8tPnBhZ2Vfc2l6ZSA9IGYtPnBhZ2Vfc2l6ZTsKLQlpbmZvLT5yZWFkX2lkX2J5dGVzID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDQgOiAyOworCWhvc3QtPmNtZHNldCA9ICZkZWZhdWx0X2NtZHNldDsKKwlob3N0LT5wYWdlX3NpemUgPSBmLT5wYWdlX3NpemU7CisJaG9zdC0+cmVhZF9pZF9ieXRlcyA9IChmLT5wYWdlX3NpemUgPT0gMjA0OCkgPyA0IDogMjsKIAogCS8qIGNhbGN1bGF0ZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uICovCi0JaW5mby0+Y29sX2FkZHJfY3ljbGVzID0gKGYtPnBhZ2Vfc2l6ZSA9PSAyMDQ4KSA/IDIgOiAxOworCWhvc3QtPmNvbF9hZGRyX2N5Y2xlcyA9IChmLT5wYWdlX3NpemUgPT0gMjA0OCkgPyAyIDogMTsKIAogCWlmIChmLT5udW1fYmxvY2tzICogZi0+cGFnZV9wZXJfYmxvY2sgPiA2NTUzNikKLQkJaW5mby0+cm93X2FkZHJfY3ljbGVzID0gMzsKKwkJaG9zdC0+cm93X2FkZHJfY3ljbGVzID0gMzsKIAllbHNlCi0JCWluZm8tPnJvd19hZGRyX2N5Y2xlcyA9IDI7CisJCWhvc3QtPnJvd19hZGRyX2N5Y2xlcyA9IDI7CiAKIAluZGNyIHw9IChwZGF0YS0+ZW5hYmxlX2FyYml0ZXIpID8gTkRDUl9ORF9BUkJfRU4gOiAwOwotCW5kY3IgfD0gKGluZm8tPmNvbF9hZGRyX2N5Y2xlcyA9PSAyKSA/IE5EQ1JfUkFfU1RBUlQgOiAwOworCW5kY3IgfD0gKGhvc3QtPmNvbF9hZGRyX2N5Y2xlcyA9PSAyKSA/IE5EQ1JfUkFfU1RBUlQgOiAwOwogCW5kY3IgfD0gKGYtPnBhZ2VfcGVyX2Jsb2NrID09IDY0KSA/IE5EQ1JfUEdfUEVSX0JMSyA6IDA7CiAJbmRjciB8PSAoZi0+cGFnZV9zaXplID09IDIwNDgpID8gTkRDUl9QQUdFX1NaIDogMDsKIAluZGNyIHw9IChmLT5mbGFzaF93aWR0aCA9PSAxNikgPyBORENSX0RXSURUSF9NIDogMDsKIAluZGNyIHw9IChmLT5kZmNfd2lkdGggPT0gMTYpID8gTkRDUl9EV0lEVEhfQyA6IDA7CiAKLQluZGNyIHw9IE5EQ1JfUkRfSURfQ05UKGluZm8tPnJlYWRfaWRfYnl0ZXMpOworCW5kY3IgfD0gTkRDUl9SRF9JRF9DTlQoaG9zdC0+cmVhZF9pZF9ieXRlcyk7CiAJbmRjciB8PSBORENSX1NQQVJFX0VOOyAvKiBlbmFibGUgc3BhcmUgYnkgZGVmYXVsdCAqLwogCi0JaW5mby0+cmVnX25kY3IgPSBuZGNyOworCWhvc3QtPnJlZ19uZGNyID0gbmRjcjsKIAotCXB4YTN4eF9uYW5kX3NldF90aW1pbmcoaW5mbywgZi0+dGltaW5nKTsKKwlweGEzeHhfbmFuZF9zZXRfdGltaW5nKGhvc3QsIGYtPnRpbWluZyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcHhhM3h4X25hbmRfZGV0ZWN0X2NvbmZpZyhzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbykKIHsKKwkvKgorCSAqIFdlIHNldCAwIGJ5IGhhcmQgY29kaW5nIGhlcmUsIGZvciB3ZSBkb24ndCBzdXBwb3J0IGtlZXBfY29uZmlnCisJICogd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNoaXAgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2xsZXIKKwkgKi8KKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdCA9IGluZm8tPmhvc3RbMF07CiAJdWludDMyX3QgbmRjciA9IG5hbmRfcmVhZGwoaW5mbywgTkRDUik7Ci0JaW5mby0+cGFnZV9zaXplID0gbmRjciAmIE5EQ1JfUEFHRV9TWiA/IDIwNDggOiA1MTI7Ci0JLyogc2V0IGluZm8gZmllbGRzIG5lZWRlZCB0byByZWFkIGlkICovCi0JaW5mby0+cmVhZF9pZF9ieXRlcyA9IChpbmZvLT5wYWdlX3NpemUgPT0gMjA0OCkgPyA0IDogMjsKLQlpbmZvLT5yZWdfbmRjciA9IG5kY3I7Ci0JaW5mby0+Y21kc2V0ID0gJmRlZmF1bHRfY21kc2V0OwogCi0JaW5mby0+bmR0cjBjczAgPSBuYW5kX3JlYWRsKGluZm8sIE5EVFIwQ1MwKTsKLQlpbmZvLT5uZHRyMWNzMCA9IG5hbmRfcmVhZGwoaW5mbywgTkRUUjFDUzApOworCWlmIChuZGNyICYgTkRDUl9QQUdFX1NaKSB7CisJCWhvc3QtPnBhZ2Vfc2l6ZSA9IDIwNDg7CisJCWhvc3QtPnJlYWRfaWRfYnl0ZXMgPSA0OworCX0gZWxzZSB7CisJCWhvc3QtPnBhZ2Vfc2l6ZSA9IDUxMjsKKwkJaG9zdC0+cmVhZF9pZF9ieXRlcyA9IDI7CisJfQorCisJaG9zdC0+cmVnX25kY3IgPSBuZGNyICYgfk5EQ1JfSU5UX01BU0s7CisJaG9zdC0+Y21kc2V0ID0gJmRlZmF1bHRfY21kc2V0OworCisJaG9zdC0+bmR0cjBjczAgPSBuYW5kX3JlYWRsKGluZm8sIE5EVFIwQ1MwKTsKKwlob3N0LT5uZHRyMWNzMCA9IG5hbmRfcmVhZGwoaW5mbywgTkRUUjFDUzApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NDcsNyArODk4LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaW5mby0+ZGF0YV9idWZmX3NpemUgPSBNQVhfQlVGRl9TSVpFOwogCWluZm8tPmRhdGFfZGVzYyA9ICh2b2lkICopaW5mby0+ZGF0YV9idWZmICsgZGF0YV9kZXNjX29mZnNldDsKIAlpbmZvLT5kYXRhX2Rlc2NfYWRkciA9IGluZm8tPmRhdGFfYnVmZl9waHlzICsgZGF0YV9kZXNjX29mZnNldDsKIApAQCAtODU1LDcgKzkwNSw3IEBACiAJCQkJcHhhM3h4X25hbmRfZGF0YV9kbWFfaXJxLCBpbmZvKTsKIAlpZiAoaW5mby0+ZGF0YV9kbWFfY2ggPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGRhdGEgZG1hXG4iKTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+ZGF0YV9idWZmX3NpemUsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIE1BWF9CVUZGX1NJWkUsCiAJCQkJaW5mby0+ZGF0YV9idWZmLCBpbmZvLT5kYXRhX2J1ZmZfcGh5cyk7CiAJCXJldHVybiBpbmZvLT5kYXRhX2RtYV9jaDsKIAl9CkBAIC04NjUsMjQgKzkxNSwyOCBAQAogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3NlbnNpbmcoc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7Ci0Jc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKLQorCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCWludCByZXQ7CisJbXRkID0gaW5mby0+aG9zdFtpbmZvLT5jc10tPm10ZDsKIAkvKiB1c2UgdGhlIGNvbW1vbiB0aW1pbmcgdG8gbWFrZSBhIHRyeSAqLwotCXB4YTN4eF9uYW5kX2NvbmZpZ19mbGFzaChpbmZvLCAmYnVpbHRpbl9mbGFzaF90eXBlc1swXSk7Ci0JY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JFU0VULCAwLCAwKTsKKwlyZXQgPSBweGEzeHhfbmFuZF9jb25maWdfZmxhc2goaW5mbywgJmJ1aWx0aW5fZmxhc2hfdHlwZXNbMF0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlweGEzeHhfbmFuZF9jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIDAsIDApOwogCWlmIChpbmZvLT5pc19yZWFkeSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQogCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3NjYW4oc3RydWN0IG10ZF9pbmZvICptdGQpCiB7Ci0Jc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKmhvc3QgPSBtdGQtPnByaXY7CisJc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8gPSBob3N0LT5pbmZvX2RhdGE7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGluZm8tPnBkZXY7CiAJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG5hbmRfZmxhc2hfZGV2IHB4YTN4eF9mbGFzaF9pZHNbMl0gPSB7IHtOVUxMLH0sIHtOVUxMLH0gfTsKKwlzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgcHhhM3h4X2ZsYXNoX2lkc1syXSwgKmRlZiA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IHB4YTN4eF9uYW5kX2ZsYXNoICpmID0gTlVMTDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCXVpbnQzMl90IGlkID0gLTE7CkBAIC04OTMsMjIgKzk0NywyMCBAQAogCQlnb3RvIEtFRVBfQ09ORklHOwogCiAJcmV0ID0gcHhhM3h4X25hbmRfc2Vuc2luZyhpbmZvKTsKLQlpZiAoIXJldCkgewotCQlrZnJlZShtdGQpOwotCQlpbmZvLT5tdGQgPSBOVUxMOwotCQlwcmludGsoS0VSTl9JTkZPICJUaGVyZSBpcyBubyBuYW5kIGNoaXAgb24gY3MgMCFcbiIpOworCWlmIChyZXQpIHsKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIlRoZXJlIGlzIG5vIGNoaXAgb24gY3MgJWQhXG4iLAorCQkJIGluZm8tPmNzKTsKIAotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVBRElELCAwLCAwKTsKIAlpZCA9ICooKHVpbnQxNl90ICopKGluZm8tPmRhdGFfYnVmZikpOwogCWlmIChpZCAhPSAwKQotCQlwcmludGsoS0VSTl9JTkZPICJEZXRlY3QgYSBmbGFzaCBpZCAleFxuIiwgaWQpOworCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiRGV0ZWN0IGEgZmxhc2ggaWQgJXhcbiIsIGlkKTsKIAllbHNlIHsKLQkJa2ZyZWUobXRkKTsKLQkJaW5mby0+bXRkID0gTlVMTDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBvdXQgSUQgMCwgcG90ZW50aWFsIHRpbWluZyBzZXQgd3JvbmchIVxuIik7CisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkgIlJlYWQgb3V0IElEIDAsIHBvdGVudGlhbCB0aW1pbmcgc2V0IHdyb25nISFcbiIpOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkyNiwxNCArOTc4LDE3IEBACiAJfQogCiAJaWYgKGkgPj0gKEFSUkFZX1NJWkUoYnVpbHRpbl9mbGFzaF90eXBlcykgKyBwZGF0YS0+bnVtX2ZsYXNoIC0gMSkpIHsKLQkJa2ZyZWUobXRkKTsKLQkJaW5mby0+bXRkID0gTlVMTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiEhIGZsYXNoIG5vdCBkZWZpbmVkISEhXG4iKTsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiRVJST1IhISBmbGFzaCBub3QgZGVmaW5lZCEhIVxuIik7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHhhM3h4X25hbmRfY29uZmlnX2ZsYXNoKGluZm8sIGYpOworCXJldCA9IHB4YTN4eF9uYW5kX2NvbmZpZ19mbGFzaChpbmZvLCBmKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIkVSUk9SISBDb25maWd1cmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlweGEzeHhfZmxhc2hfaWRzWzBdLm5hbWUgPSBmLT5uYW1lOwogCXB4YTN4eF9mbGFzaF9pZHNbMF0uaWQgPSAoZi0+Y2hpcF9pZCA+PiA4KSAmIDB4ZmZmZjsKIAlweGEzeHhfZmxhc2hfaWRzWzBdLnBhZ2VzaXplID0gZi0+cGFnZV9zaXplOwpAQCAtOTQyLDYyICs5OTcsNzggQEAKIAlweGEzeHhfZmxhc2hfaWRzWzBdLmVyYXNlc2l6ZSA9IGYtPnBhZ2Vfc2l6ZSAqIGYtPnBhZ2VfcGVyX2Jsb2NrOwogCWlmIChmLT5mbGFzaF93aWR0aCA9PSAxNikKIAkJcHhhM3h4X2ZsYXNoX2lkc1swXS5vcHRpb25zID0gTkFORF9CVVNXSURUSF8xNjsKKwlweGEzeHhfZmxhc2hfaWRzWzFdLm5hbWUgPSBOVUxMOworCWRlZiA9IHB4YTN4eF9mbGFzaF9pZHM7CiBLRUVQX0NPTkZJRzoKLQlpZiAobmFuZF9zY2FuX2lkZW50KG10ZCwgMSwgcHhhM3h4X2ZsYXNoX2lkcykpCisJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKKwljaGlwLT5lY2Muc2l6ZSA9IGhvc3QtPnBhZ2Vfc2l6ZTsKKworCWNoaXAtPm9wdGlvbnMgPSBOQU5EX05PX0FVVE9JTkNSOworCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9OT19SRUFEUkRZOworCWlmIChob3N0LT5yZWdfbmRjciAmIE5EQ1JfRFdJRFRIX00pCisJCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9CVVNXSURUSF8xNjsKKworCWlmIChuYW5kX3NjYW5faWRlbnQobXRkLCAxLCBkZWYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAkvKiBjYWxjdWxhdGUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiAqLwotCWluZm8tPmNvbF9hZGRyX2N5Y2xlcyA9IChtdGQtPndyaXRlc2l6ZSA+PSAyMDQ4KSA/IDIgOiAxOworCWlmIChtdGQtPndyaXRlc2l6ZSA+PSAyMDQ4KQorCQlob3N0LT5jb2xfYWRkcl9jeWNsZXMgPSAyOworCWVsc2UKKwkJaG9zdC0+Y29sX2FkZHJfY3ljbGVzID0gMTsKKwogCWluZm8tPm9vYl9idWZmID0gaW5mby0+ZGF0YV9idWZmICsgbXRkLT53cml0ZXNpemU7CiAJaWYgKChtdGQtPnNpemUgPj4gY2hpcC0+cGFnZV9zaGlmdCkgPiA2NTUzNikKLQkJaW5mby0+cm93X2FkZHJfY3ljbGVzID0gMzsKKwkJaG9zdC0+cm93X2FkZHJfY3ljbGVzID0gMzsKIAllbHNlCi0JCWluZm8tPnJvd19hZGRyX2N5Y2xlcyA9IDI7CisJCWhvc3QtPnJvd19hZGRyX2N5Y2xlcyA9IDI7CisKIAltdGQtPm5hbWUgPSBtdGRfbmFtZXNbMF07Ci0JY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKLQljaGlwLT5lY2Muc2l6ZSA9IGYtPnBhZ2Vfc2l6ZTsKLQotCWNoaXAtPm9wdGlvbnMgPSAoZi0+Zmxhc2hfd2lkdGggPT0gMTYpID8gTkFORF9CVVNXSURUSF8xNiA6IDA7Ci0JY2hpcC0+b3B0aW9ucyB8PSBOQU5EX05PX0FVVE9JTkNSOwotCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9OT19SRUFEUkRZOwotCiAJcmV0dXJuIG5hbmRfc2Nhbl90YWlsKG10ZCk7CiB9CiAKLXN0YXRpYwotc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmFsbG9jX25hbmRfcmVzb3VyY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgYWxsb2NfbmFuZF9yZXNvdXJjZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcHhhM3h4X25hbmRfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlpbnQgcmV0LCBpcnE7CisJaW50IHJldCwgaXJxLCBjczsKIAotCW10ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2Yoc3RydWN0IHB4YTN4eF9uYW5kX2luZm8pLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdGQpIHsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbykgKyAoc2l6ZW9mKCptdGQpICsKKwkJICAgICAgIHNpemVvZigqaG9zdCkpICogcGRhdGEtPm51bV9jcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaW5mbyA9IChzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqKSgmbXRkWzFdKTsKLQljaGlwID0gKHN0cnVjdCBuYW5kX2NoaXAgKikoJm10ZFsxXSk7CiAJaW5mby0+cGRldiA9IHBkZXY7Ci0JaW5mby0+bXRkID0gbXRkOwotCW10ZC0+cHJpdiA9IGluZm87Ci0JbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCWZvciAoY3MgPSAwOyBjcyA8IHBkYXRhLT5udW1fY3M7IGNzKyspIHsKKwkJbXRkID0gKHN0cnVjdCBtdGRfaW5mbyAqKSgodW5zaWduZWQgaW50KSZpbmZvWzFdICsKKwkJICAgICAgKHNpemVvZigqbXRkKSArIHNpemVvZigqaG9zdCkpICogY3MpOworCQljaGlwID0gKHN0cnVjdCBuYW5kX2NoaXAgKikoJm10ZFsxXSk7CisJCWhvc3QgPSAoc3RydWN0IHB4YTN4eF9uYW5kX2hvc3QgKiljaGlwOworCQlpbmZvLT5ob3N0W2NzXSA9IGhvc3Q7CisJCWhvc3QtPm10ZCA9IG10ZDsKKwkJaG9zdC0+Y3MgPSBjczsKKwkJaG9zdC0+aW5mb19kYXRhID0gaW5mbzsKKwkJbXRkLT5wcml2ID0gaG9zdDsKKwkJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JY2hpcC0+ZWNjLnJlYWRfcGFnZQk9IHB4YTN4eF9uYW5kX3JlYWRfcGFnZV9od2VjYzsKLQljaGlwLT5lY2Mud3JpdGVfcGFnZQk9IHB4YTN4eF9uYW5kX3dyaXRlX3BhZ2VfaHdlY2M7Ci0JY2hpcC0+Y29udHJvbGxlciAgICAgICAgPSAmaW5mby0+Y29udHJvbGxlcjsKLQljaGlwLT53YWl0ZnVuYwkJPSBweGEzeHhfbmFuZF93YWl0ZnVuYzsKLQljaGlwLT5zZWxlY3RfY2hpcAk9IHB4YTN4eF9uYW5kX3NlbGVjdF9jaGlwOwotCWNoaXAtPmRldl9yZWFkeQkJPSBweGEzeHhfbmFuZF9kZXZfcmVhZHk7Ci0JY2hpcC0+Y21kZnVuYwkJPSBweGEzeHhfbmFuZF9jbWRmdW5jOwotCWNoaXAtPnJlYWRfd29yZAkJPSBweGEzeHhfbmFuZF9yZWFkX3dvcmQ7Ci0JY2hpcC0+cmVhZF9ieXRlCQk9IHB4YTN4eF9uYW5kX3JlYWRfYnl0ZTsKLQljaGlwLT5yZWFkX2J1ZgkJPSBweGEzeHhfbmFuZF9yZWFkX2J1ZjsKLQljaGlwLT53cml0ZV9idWYJCT0gcHhhM3h4X25hbmRfd3JpdGVfYnVmOwotCWNoaXAtPnZlcmlmeV9idWYJPSBweGEzeHhfbmFuZF92ZXJpZnlfYnVmOworCQljaGlwLT5lY2MucmVhZF9wYWdlCT0gcHhhM3h4X25hbmRfcmVhZF9wYWdlX2h3ZWNjOworCQljaGlwLT5lY2Mud3JpdGVfcGFnZQk9IHB4YTN4eF9uYW5kX3dyaXRlX3BhZ2VfaHdlY2M7CisJCWNoaXAtPmNvbnRyb2xsZXIgICAgICAgID0gJmluZm8tPmNvbnRyb2xsZXI7CisJCWNoaXAtPndhaXRmdW5jCQk9IHB4YTN4eF9uYW5kX3dhaXRmdW5jOworCQljaGlwLT5zZWxlY3RfY2hpcAk9IHB4YTN4eF9uYW5kX3NlbGVjdF9jaGlwOworCQljaGlwLT5jbWRmdW5jCQk9IHB4YTN4eF9uYW5kX2NtZGZ1bmM7CisJCWNoaXAtPnJlYWRfd29yZAkJPSBweGEzeHhfbmFuZF9yZWFkX3dvcmQ7CisJCWNoaXAtPnJlYWRfYnl0ZQkJPSBweGEzeHhfbmFuZF9yZWFkX2J5dGU7CisJCWNoaXAtPnJlYWRfYnVmCQk9IHB4YTN4eF9uYW5kX3JlYWRfYnVmOworCQljaGlwLT53cml0ZV9idWYJCT0gcHhhM3h4X25hbmRfd3JpdGVfYnVmOworCQljaGlwLT52ZXJpZnlfYnVmCT0gcHhhM3h4X25hbmRfdmVyaWZ5X2J1ZjsKKwl9CiAKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+Y29udHJvbGxlci0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hpcC0+Y29udHJvbGxlci0+d3EpOwpAQCAtMTA3MCwxMyArMTE0MSwxMyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAKLQlyZXR1cm4gaW5mbzsKKwlyZXR1cm4gMDsKIAogZmFpbF9mcmVlX2J1ZjoKIAlmcmVlX2lycShpcnEsIGluZm8pOwogCWlmICh1c2VfZG1hKSB7CiAJCXB4YV9mcmVlX2RtYShpbmZvLT5kYXRhX2RtYV9jaCk7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIGluZm8tPmRhdGFfYnVmZl9zaXplLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBNQVhfQlVGRl9TSVpFLAogCQkJaW5mby0+ZGF0YV9idWZmLCBpbmZvLT5kYXRhX2J1ZmZfcGh5cyk7CiAJfSBlbHNlCiAJCWtmcmVlKGluZm8tPmRhdGFfYnVmZik7CkBAIC0xMDg4LDE3ICsxMTU5LDIxIEBACiAJY2xrX2Rpc2FibGUoaW5mby0+Y2xrKTsKIAljbGtfcHV0KGluZm8tPmNsayk7CiBmYWlsX2ZyZWVfbXRkOgotCWtmcmVlKG10ZCk7Ci0JcmV0dXJuIE5VTEw7CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBweGEzeHhfbmFuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gaW5mby0+bXRkOworCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0JaW50IGlycTsKKwlpbnQgaXJxLCBjczsKIAorCWlmICghaW5mbykKKwkJcmV0dXJuIDA7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKQEAgLTExMDYsNyArMTE4MSw3IEBACiAJCWZyZWVfaXJxKGlycSwgaW5mbyk7CiAJaWYgKHVzZV9kbWEpIHsKIAkJcHhhX2ZyZWVfZG1hKGluZm8tPmRhdGFfZG1hX2NoKTsKLQkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKCZwZGV2LT5kZXYsIGluZm8tPmRhdGFfYnVmZl9zaXplLAorCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJnBkZXYtPmRldiwgTUFYX0JVRkZfU0laRSwKIAkJCQlpbmZvLT5kYXRhX2J1ZmYsIGluZm8tPmRhdGFfYnVmZl9waHlzKTsKIAl9IGVsc2UKIAkJa2ZyZWUoaW5mby0+ZGF0YV9idWZmKTsKQEAgLTExMTgsMTAgKzExOTMsOSBAQAogCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CiAJY2xrX3B1dChpbmZvLT5jbGspOwogCi0JaWYgKG10ZCkgewotCQltdGRfZGV2aWNlX3VucmVnaXN0ZXIobXRkKTsKLQkJa2ZyZWUobXRkKTsKLQl9CisJZm9yIChjcyA9IDA7IGNzIDwgcGRhdGEtPm51bV9jczsgY3MrKykKKwkJbmFuZF9yZWxlYXNlKGluZm8tPmhvc3RbY3NdLT5tdGQpOworCWtmcmVlKGluZm8pOwogCXJldHVybiAwOwogfQogCkBAIC0xMTI5LDYgKzEyMDMsNyBAQAogewogCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbzsKKwlpbnQgcmV0LCBjcywgcHJvYmVfc3VjY2VzczsKIAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwZGF0YSkgewpAQCAtMTEzNiw1MiArMTIxMSw4OCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpbmZvID0gYWxsb2NfbmFuZF9yZXNvdXJjZShwZGV2KTsKLQlpZiAoaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBhbGxvY19uYW5kX3Jlc291cmNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWxsb2MgbmFuZCByZXNvdXJjZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAotCWlmIChweGEzeHhfbmFuZF9zY2FuKGluZm8tPm10ZCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNjYW4gbmFuZFxuIik7CisJaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXByb2JlX3N1Y2Nlc3MgPSAwOworCWZvciAoY3MgPSAwOyBjcyA8IHBkYXRhLT5udW1fY3M7IGNzKyspIHsKKwkJaW5mby0+Y3MgPSBjczsKKwkJcmV0ID0gcHhhM3h4X25hbmRfc2NhbihpbmZvLT5ob3N0W2NzXS0+bXRkKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byBzY2FuIG5hbmQgYXQgY3MgJWRcbiIsCisJCQkJY3MpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXQgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPmhvc3RbY3NdLT5tdGQsIE5VTEwsIDAsCisJCQkJcGRhdGEtPnBhcnRzW2NzXSwgcGRhdGEtPm5yX3BhcnRzW2NzXSk7CisJCWlmICghcmV0KQorCQkJcHJvYmVfc3VjY2VzcyA9IDE7CisJfQorCisJaWYgKCFwcm9iZV9zdWNjZXNzKSB7CiAJCXB4YTN4eF9uYW5kX3JlbW92ZShwZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKG10ZF9oYXNfY21kbGluZXBhcnQoKSkgewotCQljb25zdCBjaGFyICpwcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OwotCQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JCWludCBucl9wYXJ0czsKLQotCQlucl9wYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcHJvYmVzLCAmcGFydHMsIDApOwotCi0JCWlmIChucl9wYXJ0cykKLQkJCXJldHVybiBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcGFydHMsIG5yX3BhcnRzKTsKLQl9Ci0KLQlyZXR1cm4gbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBweGEzeHhfbmFuZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgcHhhM3h4X25hbmRfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gaW5mby0+bXRkOworCXN0cnVjdCBweGEzeHhfbmFuZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlpbnQgY3M7CiAKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmIChpbmZvLT5zdGF0ZSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkcml2ZXIgYnVzeSwgc3RhdGUgPSAlZFxuIiwgaW5mby0+c3RhdGUpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKKwlmb3IgKGNzID0gMDsgY3MgPCBwZGF0YS0+bnVtX2NzOyBjcysrKSB7CisJCW10ZCA9IGluZm8tPmhvc3RbY3NdLT5tdGQ7CisJCW10ZC0+c3VzcGVuZChtdGQpOworCX0KKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHB4YTN4eF9uYW5kX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBweGEzeHhfbmFuZF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7CisJc3RydWN0IHB4YTN4eF9uYW5kX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCWludCBjczsKIAotCW5hbmRfd3JpdGVsKGluZm8sIE5EVFIwQ1MwLCBpbmZvLT5uZHRyMGNzMCk7Ci0JbmFuZF93cml0ZWwoaW5mbywgTkRUUjFDUzAsIGluZm8tPm5kdHIxY3MwKTsKLQljbGtfZW5hYmxlKGluZm8tPmNsayk7CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkvKiBXZSBkb24ndCB3YW50IHRvIGhhbmRsZSBpbnRlcnJ1cHQgd2l0aG91dCBjYWxsaW5nIG10ZCByb3V0aW5lICovCisJZGlzYWJsZV9pbnQoaW5mbywgTkRDUl9JTlRfTUFTSyk7CisKKwkvKgorCSAqIERpcmVjdGx5IHNldCB0aGUgY2hpcCBzZWxlY3QgdG8gYSBpbnZhbGlkIHZhbHVlLAorCSAqIHRoZW4gdGhlIGRyaXZlciB3b3VsZCByZXNldCB0aGUgdGltaW5nIGFjY29yZGluZworCSAqIHRvIGN1cnJlbnQgY2hpcCBzZWxlY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBjbWRmdW5jCisJICovCisJaW5mby0+Y3MgPSAweGZmOworCisJLyoKKwkgKiBBcyB0aGUgc3BlYyBzYXlzLCB0aGUgTkRTUiB3b3VsZCBiZSB1cGRhdGVkIHRvIDB4MTgwMCB3aGVuCisJICogZG9pbmcgdGhlIG5hbmRfY2xrIGRpc2FibGUvZW5hYmxlLgorCSAqIFRvIHByZXZlbnQgaXQgZGFtYWdpbmcgc3RhdGUgbWFjaGluZSBvZiB0aGUgZHJpdmVyLCBjbGVhcgorCSAqIGFsbCBzdGF0dXMgYmVmb3JlIHJlc3VtZQorCSAqLworCW5hbmRfd3JpdGVsKGluZm8sIE5EU1IsIE5EU1JfTUFTSyk7CisJZm9yIChjcyA9IDA7IGNzIDwgcGRhdGEtPm51bV9jczsgY3MrKykgeworCQltdGQgPSBpbmZvLT5ob3N0W2NzXS0+bXRkOworCQltdGQtPnJlc3VtZShtdGQpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yODUyLmMgYi9kcml2ZXJzL210ZC9uYW5kL3I4NTIuYwppbmRleCBjYWUyZTAxLi5mMjBmMzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3I4NTIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3I4NTIuYwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotaW50IHI4NTJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IHI4NTJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHI4NTJfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXZpY2UpKTsKIApAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHI4NTJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgcjg1Ml9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCByODUyX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2aWNlKSk7CiAKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCByODUyX3BjaV9pZF90YmwpOwogCi1TSU1QTEVfREVWX1BNX09QUyhyODUyX3BtX29wcywgcjg1Ml9zdXNwZW5kLCByODUyX3Jlc3VtZSk7CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocjg1Ml9wbV9vcHMsIHI4NTJfc3VzcGVuZCwgcjg1Ml9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcjg1Ml9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9IERSVl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKaW5kZXggYzlmOTEyNy4uZjMwOWFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogUmVhZCB0aGUgc3luZHJvbSBwYXR0ZXJuIGZyb20gdGhlIEZQR0EgYW5kIGNvcnJlY3QgdGhlIGJpdG9yZGVyICovCisJLyogUmVhZCB0aGUgc3luZHJvbWUgcGF0dGVybiBmcm9tIHRoZSBGUEdBIGFuZCBjb3JyZWN0IHRoZSBiaXRvcmRlciAqLwogCXJzX2VjYyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShydGNfZnJvbTRfZmlvX2Jhc2UgKyBSVENfRlJPTTRfUlNfRUNDKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWVjY1tpXSA9IGJpdHJldjgoKnJzX2VjYyk7CkBAIC0zODAsNyArMzgwLDcgQEAKIAkvKiBMZXQgdGhlIGxpYnJhcnkgY29kZSBkbyBpdHMgbWFnaWMuICovCiAJcmVzID0gZGVjb2RlX3JzOChyc19kZWNvZGVyLCAodWludDhfdCAqKSBidWYsIHBhciwgNTEyLCBzeW4sIDAsIE5VTEwsIDB4ZmYsIE5VTEwpOwogCWlmIChyZXMgPiAwKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICJydGNfZnJvbTRfY29ycmVjdF9kYXRhOiAiICJFQ0MgY29ycmVjdGVkICVkIGVycm9ycyBvbiByZWFkXG4iLCByZXMpOworCQlwcl9kZWJ1ZygicnRjX2Zyb200X2NvcnJlY3RfZGF0YTogIiAiRUNDIGNvcnJlY3RlZCAlZCBlcnJvcnMgb24gcmVhZFxuIiwgcmVzKTsKIAl9CiAJcmV0dXJuIHJlczsKIH0KQEAgLTQ0NCw3ICs0NDQsNiBAQAogCQlsZW4gPSBtdGQtPndyaXRlc2l6ZTsKIAkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJydGNfZnJvbTRfZXJyc3RhdDogT3V0IG9mIG1lbW9yeSFcbiIpOwogCQkJZXJfc3RhdCA9IDE7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwppbmRleCA0NDA1NDY4Li44Njg2ODVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwpAQCAtNzIzLDcgKzcyMyw3IEBACiAKIAkvKiBmcmVlIHRoZSBjb21tb24gcmVzb3VyY2VzICovCiAKLQlpZiAoaW5mby0+Y2xrICE9IE5VTEwgJiYgIUlTX0VSUihpbmZvLT5jbGspKSB7CisJaWYgKCFJU19FUlIoaW5mby0+Y2xrKSkgewogCQlzM2MyNDEwX25hbmRfY2xrX3NldF9zdGF0ZShpbmZvLCBDTE9DS19ESVNBQkxFKTsKIAkJY2xrX3B1dChpbmZvLT5jbGspOwogCX0KQEAgLTc0NCwyNiArNzQ0LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKIHN0YXRpYyBpbnQgczNjMjQxMF9uYW5kX2FkZF9wYXJ0aXRpb24oc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvLAogCQkJCSAgICAgIHN0cnVjdCBzM2MyNDEwX25hbmRfbXRkICptdGQsCiAJCQkJICAgICAgc3RydWN0IHMzYzI0MTBfbmFuZF9zZXQgKnNldCkKIHsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydF9pbmZvOwotCWludCBucl9wYXJ0ID0gMDsKKwlpZiAoc2V0KQorCQltdGQtPm10ZC5uYW1lID0gc2V0LT5uYW1lOwogCi0JaWYgKHNldCA9PSBOVUxMKQotCQlyZXR1cm4gbXRkX2RldmljZV9yZWdpc3RlcigmbXRkLT5tdGQsIE5VTEwsIDApOwotCi0JbXRkLT5tdGQubmFtZSA9IHNldC0+bmFtZTsKLQlucl9wYXJ0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJm10ZC0+bXRkLCBwYXJ0X3Byb2JlcywgJnBhcnRfaW5mbywgMCk7Ci0KLQlpZiAobnJfcGFydCA8PSAwICYmIHNldC0+bnJfcGFydGl0aW9ucyA+IDApIHsKLQkJbnJfcGFydCA9IHNldC0+bnJfcGFydGl0aW9uczsKLQkJcGFydF9pbmZvID0gc2V0LT5wYXJ0aXRpb25zOwotCX0KLQotCXJldHVybiBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZtdGQtPm10ZCwgcGFydF9pbmZvLCBucl9wYXJ0KTsKKwlyZXR1cm4gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmbXRkLT5tdGQsIE5VTEwsIDAsCisJCQlzZXQtPnBhcnRpdGlvbnMsIHNldC0+bnJfcGFydGl0aW9ucyk7CiB9CiAKIC8qKgpAQCAtODgwLDggKzg2OSwxMCBAQAogCS8qIElmIHlvdSB1c2UgdS1ib290IEJCVCBjcmVhdGlvbiBjb2RlLCBzcGVjaWZ5aW5nIHRoaXMgZmxhZyB3aWxsCiAJICogbGV0IHRoZSBrZXJuZWwgZmlzaCBvdXQgdGhlIEJCVCBmcm9tIHRoZSBOQU5ELCBhbmQgYWxzbyBza2lwIHRoZQogCSAqIGZ1bGwgTkFORCBzY2FuIHRoYXQgY2FuIHRha2UgMS8ycyBvciBzby4gTGl0dGxlIHRoaW5ncy4uLiAqLwotCWlmIChzZXQtPmZsYXNoX2JidCkKLQkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX1VTRV9GTEFTSF9CQlQgfCBOQU5EX1NLSVBfQkJUU0NBTjsKKwlpZiAoc2V0LT5mbGFzaF9iYnQpIHsKKwkJY2hpcC0+YmJ0X29wdGlvbnMgfD0gTkFORF9CQlRfVVNFX0ZMQVNIOworCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfU0tJUF9CQlRTQ0FOOworCX0KIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYyBiL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCmluZGV4IDE5ZTI0ZWQuLjYxOWQyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCkBAIC0xMDMsMTYgKzEwMywxMiBAQAogCXJldHVybiByZWFkYihzaGFycHNsLT5pbyArIEVDQ0NOVFIpICE9IDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0KIC8qCiAgKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKICAqLwogc3RhdGljIGludCBfX2RldmluaXQgc2hhcnBzbF9uYW5kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqc2hhcnBzbF9wYXJ0aXRpb25faW5mbzsKLQlpbnQgbnJfcGFydGl0aW9uczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IHNoYXJwc2xfbmFuZCAqc2hhcnBzbDsKQEAgLTE4NCwxNCArMTgwLDkgQEAKIAogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCiAJc2hhcnBzbC0+bXRkLm5hbWUgPSAic2hhcnBzbC1uYW5kIjsKLQlucl9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJnNoYXJwc2wtPm10ZCwgcGFydF9wcm9iZXMsICZzaGFycHNsX3BhcnRpdGlvbl9pbmZvLCAwKTsKLQlpZiAobnJfcGFydGl0aW9ucyA8PSAwKSB7Ci0JCW5yX3BhcnRpdGlvbnMgPSBkYXRhLT5ucl9wYXJ0aXRpb25zOwotCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvID0gZGF0YS0+cGFydGl0aW9uczsKLQl9CiAKLQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZzaGFycHNsLT5tdGQsIHNoYXJwc2xfcGFydGl0aW9uX2luZm8sCi0JCQkJICBucl9wYXJ0aXRpb25zKTsKKwllcnIgPSBtdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKCZzaGFycHNsLT5tdGQsIE5VTEwsIDAsCisJCQlkYXRhLT5wYXJ0aXRpb25zLCBkYXRhLT5ucl9wYXJ0aXRpb25zKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9hZGQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvc21fY29tbW9uLmMgYi9kcml2ZXJzL210ZC9uYW5kL3NtX2NvbW1vbi5jCmluZGV4IGI2MzMyZTguLjMyYWU1YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvc21fY29tbW9uLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zbV9jb21tb24uYwpAQCAtOCw2ICs4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAic21fY29tbW9uLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgbmFuZF9vb2Jfc20gPSB7CkBAIC00Nyw3ICs0OCw3IEBACiAKIAkvKiBBcyBsb25nIGFzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGVyYXNlIGJsb2NrIGJvdW5kYXJpZXMKIAkJaXQgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgMjU2IGJ5dGUgbmFuZCAqLwotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29ibGVuID0gbXRkLT5vb2JzaXplOwogCW9wcy5vb2JidWYgPSAodm9pZCAqKSZvb2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3NvY3JhdGVzX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvc29jcmF0ZXNfbmFuZC5jCmluZGV4IGNhMmQwNTUuLjBmYjI0ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvc29jcmF0ZXNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvc29jcmF0ZXNfbmFuZC5jCkBAIC0xNTUsOCArMTU1LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKLQogLyoKICAqIFByb2JlIGZvciB0aGUgTkFORCBkZXZpY2UuCiAgKi8KQEAgLTE2Niw4ICsxNjQsNyBAQAogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmRfY2hpcDsKIAlpbnQgcmVzOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb25zID0gTlVMTDsKLQlpbnQgbnVtX3BhcnRpdGlvbnMgPSAwOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSBwcGRhdGE7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkZXZpY2Ugc3RydWN0dXJlIChhbmQgemVybyBpdCkgKi8KIAlob3N0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvY3JhdGVzX25hbmRfaG9zdCksIEdGUF9LRVJORUwpOwpAQCAtMTkzLDYgKzE5MCw3IEBACiAJbXRkLT5uYW1lID0gInNvY3JhdGVzX25hbmQiOwogCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAltdGQtPmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKKwlwcGRhdGEub2Zfbm9kZSA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIGRpcmVjdGx5ICovCiAJbmFuZF9jaGlwLT5JT19BRERSX1IgPSAodm9pZCAqKTB4ZGVhZGJlZWY7CkBAIC0yMjUsMzAgKzIyMywxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQludW1fcGFydGl0aW9ucyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsCi0JCQkJCSAgICAgICZwYXJ0aXRpb25zLCAwKTsKLQlpZiAobnVtX3BhcnRpdGlvbnMgPCAwKSB7Ci0JCXJlcyA9IG51bV9wYXJ0aXRpb25zOwotCQlnb3RvIHJlbGVhc2U7Ci0JfQotI2VuZGlmCi0KLQlpZiAobnVtX3BhcnRpdGlvbnMgPT0gMCkgewotCQludW1fcGFydGl0aW9ucyA9IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKCZvZmRldi0+ZGV2LAotCQkJCQkJCSBvZmRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkJICZwYXJ0aXRpb25zKTsKLQkJaWYgKG51bV9wYXJ0aXRpb25zIDwgMCkgewotCQkJcmVzID0gbnVtX3BhcnRpdGlvbnM7Ci0JCQlnb3RvIHJlbGVhc2U7Ci0JCX0KLQl9Ci0KLQlyZXMgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFydGl0aW9ucywgbnVtX3BhcnRpdGlvbnMpOworCXJlcyA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAmcHBkYXRhLCBOVUxMLCAwKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIHJlczsKIAotcmVsZWFzZToKIAluYW5kX3JlbGVhc2UobXRkKTsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKaW5kZXggMTFlODM3MS4uYmVlYmQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCkBAIC0xMjEsOSArMTIxLDYgQEAKIAogI2RlZmluZSBtdGRfdG9fdG1pbyhtKQkJCWNvbnRhaW5lcl9vZihtLCBzdHJ1Y3QgdG1pb19uYW5kLCBtdGQpCiAKLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07Ci0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM4MSw4ICszNzgsNiBAQAogCXN0cnVjdCB0bWlvX25hbmQgKnRtaW87CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKLQlpbnQgbmJwYXJ0cyA9IDA7CiAJaW50IHJldHZhbDsKIAogCWlmIChkYXRhID09IE5VTEwpCkBAIC00NjEsMTUgKzQ1Niw5IEBACiAJCWdvdG8gZXJyX3NjYW47CiAJfQogCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0JbmJwYXJ0cyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsICZwYXJ0cywgMCk7Ci0jZW5kaWYKLQlpZiAobmJwYXJ0cyA8PSAwICYmIGRhdGEpIHsKLQkJcGFydHMgPSBkYXRhLT5wYXJ0aXRpb247Ci0JCW5icGFydHMgPSBkYXRhLT5udW1fcGFydGl0aW9uczsKLQl9Ci0KLQlyZXR2YWwgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgcGFydHMsIG5icGFydHMpOworCXJldHZhbCA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwLAorCQkJZGF0YSA/IGRhdGEtPnBhcnRpdGlvbiA6IE5VTEwsCisJCQlkYXRhID8gZGF0YS0+bnVtX3BhcnRpdGlvbnMgOiAwKTsKIAlpZiAoIXJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90eHg5bmRmbWMuYyBiL2RyaXZlcnMvbXRkL25hbmQvdHh4OW5kZm1jLmMKaW5kZXggYmZiYTRlMy4uYWNlNDZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC90eHg5bmRmbWMuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3R4eDluZGZtYy5jCkBAIC03NCw3ICs3NCw2IEBACiAJdW5zaWduZWQgY2hhciBob2xkOwkvKiBpbiBnYnVzY2xvY2sgKi8KIAl1bnNpZ25lZCBjaGFyIHNwdzsJLyogaW4gZ2J1c2Nsb2NrICovCiAJc3RydWN0IG5hbmRfaHdfY29udHJvbCBod19jb250cm9sOwotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0c1tNQVhfVFhYOU5ERk1DX0RFVl07CiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXRkX3RvX3BsYXRkZXYoc3RydWN0IG10ZF9pbmZvICptdGQpCkBAIC0yODcsNyArMjg2LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IHR4eDluZGZtY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHR4eDluZGZtY19wbGF0Zm9ybV9kYXRhICpwbGF0ID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKIAlpbnQgaG9sZCwgc3B3OwogCWludCBpOwogCXN0cnVjdCB0eHg5bmRmbWNfZHJ2ZGF0YSAqZHJ2ZGF0YTsKQEAgLTMzMyw3ICszMzEsNiBAQAogCQlzdHJ1Y3QgdHh4OW5kZm1jX3ByaXYgKnR4eDlfcHJpdjsKIAkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKIAkJc3RydWN0IG10ZF9pbmZvICptdGQ7Ci0JCWludCBucl9wYXJ0czsKIAogCQlpZiAoIShwbGF0LT5jaF9tYXNrICYgKDEgPDwgaSkpKQogCQkJY29udGludWU7CkBAIC0zOTMsOSArMzkwLDcgQEAKIAkJfQogCQltdGQtPm5hbWUgPSB0eHg5X3ByaXYtPm10ZG5hbWU7CiAKLQkJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHByb2JlcywKLQkJCQkJCSZkcnZkYXRhLT5wYXJ0c1tpXSwgMCk7Ci0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBkcnZkYXRhLT5wYXJ0c1tpXSwgbnJfcGFydHMpOworCQltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgMCwgTlVMTCwgMCk7CiAJCWRydmRhdGEtPm10ZHNbaV0gPSBtdGQ7CiAJfQogCkBAIC00MjEsNyArNDE2LDYgQEAKIAkJdHh4OV9wcml2ID0gY2hpcC0+cHJpdjsKIAogCQluYW5kX3JlbGVhc2UobXRkKTsKLQkJa2ZyZWUoZHJ2ZGF0YS0+cGFydHNbaV0pOwogCQlrZnJlZSh0eHg5X3ByaXYtPm10ZG5hbWUpOwogCQlrZnJlZSh0eHg5X3ByaXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25mdGxjb3JlLmMgYi9kcml2ZXJzL210ZC9uZnRsY29yZS5jCmluZGV4IGIxNTU2NjYuLmNkYTc3YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25mdGxjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvbmZ0bGNvcmUuYwpAQCAtNjMsMTQgKzYzLDEyIEBACiAJCXJldHVybjsKIAl9CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiTkZUTDogYWRkX210ZCBmb3IgJXNcbiIsIG10ZC0+bmFtZSk7CisJcHJfZGVidWcoIk5GVEw6IGFkZF9tdGQgZm9yICVzXG4iLCBtdGQtPm5hbWUpOwogCiAJbmZ0bCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBORlRMcmVjb3JkKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIW5mdGwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZUTDogb3V0IG9mIG1lbW9yeSBmb3IgZGF0YSBzdHJ1Y3R1cmVzXG4iKTsKKwlpZiAoIW5mdGwpCiAJCXJldHVybjsKLQl9CiAKIAluZnRsLT5tYmQubXRkID0gbXRkOwogCW5mdGwtPm1iZC5kZXZudW0gPSAtMTsKQEAgLTEzMiw3ICsxMzAsNyBAQAogewogCXN0cnVjdCBORlRMcmVjb3JkICpuZnRsID0gKHZvaWQgKilkZXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiTkZUTDogcmVtb3ZlX2RldiAoaT0lZClcbiIsIGRldi0+ZGV2bnVtKTsKKwlwcl9kZWJ1ZygiTkZUTDogcmVtb3ZlX2RldiAoaT0lZClcbiIsIGRldi0+ZGV2bnVtKTsKIAogCWRlbF9tdGRfYmxrdHJhbnNfZGV2KGRldik7CiAJa2ZyZWUobmZ0bC0+UmVwbFVuaXRUYWJsZSk7CkBAIC0xNDksNyArMTQ3LDcgQEAKIAlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCWludCByZXM7CiAKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAlvcHMub29ib2ZmcyA9IG9mZnMgJiBtYXNrOwogCW9wcy5vb2JsZW4gPSBsZW47CiAJb3BzLm9vYmJ1ZiA9IGJ1ZjsKQEAgLTE3MCw3ICsxNjgsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IHJlczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwlvcHMubW9kZSA9IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gb2ZmcyAmIG1hc2s7CiAJb3BzLm9vYmxlbiA9IGxlbjsKIAlvcHMub29iYnVmID0gYnVmOwpAQCAtMTkzLDcgKzE5MSw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmVzOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gTVREX09QU19QTEFDRV9PT0I7CiAJb3BzLm9vYm9mZnMgPSBvZmZzICYgbWFzazsKIAlvcHMub29ibGVuID0gbXRkLT5vb2JzaXplOwogCW9wcy5vb2JidWYgPSBvb2I7CkBAIC0yMjAsNyArMjE4LDcgQEAKIAogCS8qIE5vcm1hbGx5LCB3ZSBmb3JjZSBhIGZvbGQgdG8gaGFwcGVuIGJlZm9yZSB3ZSBydW4gb3V0IG9mIGZyZWUgYmxvY2tzIGNvbXBsZXRlbHkgKi8KIAlpZiAoIWRlc3BlcmF0ZSAmJiBuZnRsLT5udW1mcmVlRVVOcyA8IDIpIHsKLQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIk5GVExfZmluZGZyZWVibG9jazogdGhlcmUgYXJlIHRvbyBmZXcgZnJlZSBFVU5zXG4iKTsKKwkJcHJfZGVidWcoIk5GVExfZmluZGZyZWVibG9jazogdGhlcmUgYXJlIHRvbyBmZXcgZnJlZSBFVU5zXG4iKTsKIAkJcmV0dXJuIEJMT0NLX05JTDsKIAl9CiAKQEAgLTI5MSw4ICsyODksNyBAQAogCQkJaWYgKGJsb2NrID09IDIpIHsKIAkJCQlmb2xkbWFyayA9IG9vYi51LmMuRm9sZE1hcmsgfCBvb2IudS5jLkZvbGRNYXJrMTsKIAkJCQlpZiAoZm9sZG1hcmsgPT0gRk9MRF9NQVJLX0lOX1BST0dSRVNTKSB7Ci0JCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCQkJCSAgICAgICJXcml0ZSBJbmhpYml0ZWQgb24gRVVOICVkXG4iLCB0aGlzRVVOKTsKKwkJCQkJcHJfZGVidWcoIldyaXRlIEluaGliaXRlZCBvbiBFVU4gJWRcbiIsIHRoaXNFVU4pOwogCQkJCQlpbnBsYWNlID0gMDsKIAkJCQl9IGVsc2UgewogCQkJCQkvKiBUaGVyZSdzIG5vIG90aGVyIHJlYXNvbiBub3QgdG8gZG8gaW5wbGFjZSwKQEAgLTM1Nyw3ICszNTQsNyBAQAogCQkJaWYgKEJsb2NrTGFzdFN0YXRlW2Jsb2NrXSAhPSBTRUNUT1JfRlJFRSAmJgogCQkJICAgIEJsb2NrTWFwW2Jsb2NrXSAhPSBCTE9DS19OSUwgJiYKIAkJCSAgICBCbG9ja01hcFtibG9ja10gIT0gdGFyZ2V0RVVOKSB7Ci0JCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlNldHRpbmcgaW5wbGFjZSB0byAwLiBWVUMgJWQsICIKKwkJCQlwcl9kZWJ1ZygiU2V0dGluZyBpbnBsYWNlIHRvIDAuIFZVQyAlZCwgIgogCQkJCSAgICAgICJibG9jayAlZCB3YXMgJXggbGFzdEVVTiwgIgogCQkJCSAgICAgICJhbmQgaXMgaW4gRVVOICVkICglcykgJWRcbiIsCiAJCQkJICAgICAgdGhpc1ZVQywgYmxvY2ssIEJsb2NrTGFzdFN0YXRlW2Jsb2NrXSwKQEAgLTM3MywxNCArMzcwLDE0IEBACiAJCSAgICBwZW5kaW5nYmxvY2sgPCAoKHRoaXNWVUMgKyAxKSogKG5mdGwtPkVyYXNlU2l6ZSAvIDUxMikpICYmCiAJCSAgICBCbG9ja0xhc3RTdGF0ZVtwZW5kaW5nYmxvY2sgLSAodGhpc1ZVQyAqIChuZnRsLT5FcmFzZVNpemUgLyA1MTIpKV0gIT0KIAkJICAgIFNFQ1RPUl9GUkVFKSB7Ci0JCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiUGVuZGluZyB3cml0ZSBub3QgZnJlZSBpbiBFVU4gJWQuICIKKwkJCXByX2RlYnVnKCJQZW5kaW5nIHdyaXRlIG5vdCBmcmVlIGluIEVVTiAlZC4gIgogCQkJICAgICAgIkZvbGRpbmcgb3V0IG9mIHBsYWNlLlxuIiwgdGFyZ2V0RVVOKTsKIAkJCWlucGxhY2UgPSAwOwogCQl9CiAJfQogCiAJaWYgKCFpbnBsYWNlKSB7Ci0JCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJDYW5ub3QgZm9sZCBWaXJ0dWFsIFVuaXQgQ2hhaW4gJWQgaW4gcGxhY2UuICIKKwkJcHJfZGVidWcoIkNhbm5vdCBmb2xkIFZpcnR1YWwgVW5pdCBDaGFpbiAlZCBpbiBwbGFjZS4gIgogCQkgICAgICAiVHJ5aW5nIG91dC1vZi1wbGFjZVxuIiwgdGhpc1ZVQyk7CiAJCS8qIFdlIG5lZWQgdG8gZmluZCBhIHRhcmdldEVVTiB0byBmb2xkIGludG8uICovCiAJCXRhcmdldEVVTiA9IE5GVExfZmluZGZyZWVibG9jayhuZnRsLCAxKTsKQEAgLTQxMCw3ICs0MDcsNyBAQAogCSAgIGFuZCB0aGUgRXJhc2UgVW5pdCBpbnRvIHdoaWNoIHdlIGFyZSBzdXBwb3NlZCB0byBiZSBjb3B5aW5nLgogCSAgIEdvIGZvciBpdC4KIAkqLwotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsIkZvbGRpbmcgY2hhaW4gJWQgaW50byB1bml0ICVkXG4iLCB0aGlzVlVDLCB0YXJnZXRFVU4pOworCXByX2RlYnVnKCJGb2xkaW5nIGNoYWluICVkIGludG8gdW5pdCAlZFxuIiwgdGhpc1ZVQywgdGFyZ2V0RVVOKTsKIAlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBuZnRsLT5FcmFzZVNpemUgLyA1MTIgOyBibG9jaysrKSB7CiAJCXVuc2lnbmVkIGNoYXIgbW92ZWJ1Zls1MTJdOwogCQlpbnQgcmV0OwpAQCAtNDI4LDcgKzQyNSw3IEBACiAKIAkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgKG5mdGwtPkVyYXNlU2l6ZSAqIEJsb2NrTWFwW2Jsb2NrXSkgKyAoYmxvY2sgKiA1MTIpLAogCQkJCTUxMiwgJnJldGxlbiwgbW92ZWJ1Zik7Ci0JCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRVVDTEVBTikgeworCQlpZiAocmV0IDwgMCAmJiAhbXRkX2lzX2JpdGZsaXAocmV0KSkgewogCQkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgKG5mdGwtPkVyYXNlU2l6ZSAqIEJsb2NrTWFwW2Jsb2NrXSkKIAkJCQkJKyAoYmxvY2sgKiA1MTIpLCA1MTIsICZyZXRsZW4sCiAJCQkJCW1vdmVidWYpOwpAQCAtNDU3LDcgKzQ1NCw3IEBACiAJICAgaGFzIGR1cGxpY2F0ZSBjaGFpbnMsIHdlIG5lZWQgdG8gZnJlZSBvbmUgb2YgdGhlIGNoYWlucyBiZWNhdXNlIGl0J3Mgbm90IG5lY2Vzc2FyeSBhbnkgbW9yZS4KIAkqLwogCXRoaXNFVU4gPSBuZnRsLT5FVU50YWJsZVt0aGlzVlVDXTsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCJXYW50IHRvIGVyYXNlXG4iKTsKKwlwcl9kZWJ1ZygiV2FudCB0byBlcmFzZVxuIik7CiAKIAkvKiBGb3IgZWFjaCBibG9jayBpbiB0aGUgb2xkIGNoYWluIChleGNlcHQgdGhlIHRhcmdldEVVTiBvZiBjb3Vyc2UpLAogCSAgIGZyZWUgaXQgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBmdXR1cmUgdXNlICovCkBAIC01NzAsNyArNTY3LDcgQEAKIAkJCQkgICAgICAod3JpdGVFVU4gKiBuZnRsLT5FcmFzZVNpemUpICsgYmxvY2tvZnMsCiAJCQkJICAgICAgOCwgJnJldGxlbiwgKGNoYXIgKikmYmNpKTsKIAotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIlN0YXR1cyBvZiBibG9jayAlZCBpbiBFVU4gJWQgaXMgJXhcbiIsCisJCQlwcl9kZWJ1ZygiU3RhdHVzIG9mIGJsb2NrICVkIGluIEVVTiAlZCBpcyAleFxuIiwKIAkJCSAgICAgIGJsb2NrICwgd3JpdGVFVU4sIGxlMTZfdG9fY3B1KGJjaS5TdGF0dXMpKTsKIAogCQkJc3RhdHVzID0gYmNpLlN0YXR1cyB8IGJjaS5TdGF0dXMxOwpAQCAtNjIzLDcgKzYyMCw3IEBACiAJCQkJICAgYnV0IHRoZXkgYXJlIHJlc2VydmVkIGZvciB3aGVuIHdlJ3JlCiAJCQkJICAgZGVzcGVyYXRlLiBXZWxsLCBub3cgd2UncmUgZGVzcGVyYXRlLgogCQkJCSovCi0JCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlVzaW5nIGRlc3BlcmF0ZT09MSB0byBmaW5kIGZyZWUgRVVOIHRvIGFjY29tbW9kYXRlIHdyaXRlIHRvIFZVQyAlZFxuIiwgdGhpc1ZVQyk7CisJCQkJcHJfZGVidWcoIlVzaW5nIGRlc3BlcmF0ZT09MSB0byBmaW5kIGZyZWUgRVVOIHRvIGFjY29tbW9kYXRlIHdyaXRlIHRvIFZVQyAlZFxuIiwgdGhpc1ZVQyk7CiAJCQkJd3JpdGVFVU4gPSBORlRMX2ZpbmRmcmVlYmxvY2sobmZ0bCwgMSk7CiAJCQl9CiAJCQlpZiAod3JpdGVFVU4gPT0gQkxPQ0tfTklMKSB7CkBAIC03NzYsNyArNzczLDcgQEAKIAkJc2l6ZV90IHJldGxlbjsKIAkJaW50IHJlcyA9IG10ZC0+cmVhZChtdGQsIHB0ciwgNTEyLCAmcmV0bGVuLCBidWZmZXIpOwogCi0JCWlmIChyZXMgPCAwICYmIHJlcyAhPSAtRVVDTEVBTikKKwkJaWYgKHJlcyA8IDAgJiYgIW10ZF9pc19iaXRmbGlwKHJlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uZnRsbW91bnQuYyBiL2RyaXZlcnMvbXRkL25mdGxtb3VudC5jCmluZGV4IGUzY2QxZmYuLmFjNDA5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25mdGxtb3VudC5jCisrKyBiL2RyaXZlcnMvbXRkL25mdGxtb3VudC5jCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qIGZpbmRfYm9vdF9yZWNvcmQ6IEZpbmQgdGhlIE5GVEwgTWVkaWEgSGVhZGVyIGFuZCBpdHMgU3BhcmUgY29weSB3aGljaCBjb250YWlucyB0aGUKICAqCXZhcmlvdXMgZGV2aWNlIGluZm9ybWF0aW9uIG9mIHRoZSBORlRMIHBhcnRpdGlvbiBhbmQgQmFkIFVuaXQgVGFibGUuIFVwZGF0ZQotICoJdGhlIFJlcGxVbml0VGFibGVbXSB0YWJsZSBhY2Nyb2RpbmcgdG8gdGhlIEJhZCBVbml0IFRhYmxlLiBSZXBsVW5pdFRhYmxlW10KKyAqCXRoZSBSZXBsVW5pdFRhYmxlW10gdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBCYWQgVW5pdCBUYWJsZS4gUmVwbFVuaXRUYWJsZVtdCiAgKglpcyB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIEVyYXNlIFVuaXQgaW4gb3RoZXIgcm91dGluZXMgaW4gbmZ0bC5jIGFuZCBuZnRsbW91bnQuYwogICovCiBzdGF0aWMgaW50IGZpbmRfYm9vdF9yZWNvcmQoc3RydWN0IE5GVExyZWNvcmQgKm5mdGwpCkBAIC0yOTcsNyArMjk3LDcgQEAKICAqCiAgKiBSZXR1cm46IDAgd2hlbiBzdWNjZWVkLCAtMSBvbiBlcnJvci4KICAqCi0gKiAgVG9EbzogMS4gSXMgaXQgbmVjZXJlc3NhcnkgdG8gY2hlY2tfZnJlZV9zZWN0b3IgYWZ0ZXIgZXJhc2luZyA/PworICogIFRvRG86IDEuIElzIGl0IG5lY2Vzc2FyeSB0byBjaGVja19mcmVlX3NlY3RvciBhZnRlciBlcmFzaW5nID8/CiAgKi8KIGludCBORlRMX2Zvcm1hdGJsb2NrKHN0cnVjdCBORlRMcmVjb3JkICpuZnRsLCBpbnQgYmxvY2spCiB7CkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJbmJfZXJhc2VzID0gbGUzMl90b19jcHUodWNpLldlYXJJbmZvKTsKIAkJbmJfZXJhc2VzKys7CiAKLQkJLyogd3JhcCAoYWxtb3N0IGltcG9zc2libGUgd2l0aCBjdXJyZW50IGZsYXNocykgb3IgZnJlZSBibG9jayAqLworCQkvKiB3cmFwIChhbG1vc3QgaW1wb3NzaWJsZSB3aXRoIGN1cnJlbnQgZmxhc2gpIG9yIGZyZWUgYmxvY2sgKi8KIAkJaWYgKG5iX2VyYXNlcyA9PSAwKQogCQkJbmJfZXJhc2VzID0gMTsKIApAQCAtMzYzLDEwICszNjMsMTAgQEAKICAqCU1hcmsgYXMgJ0lHTk9SRScgZWFjaCBpbmNvcnJlY3Qgc2VjdG9yLiBUaGlzIGNoZWNrIGlzIG9ubHkgZG9uZSBpZiB0aGUgY2hhaW4KICAqCXdhcyBiZWluZyBmb2xkZWQgd2hlbiBORlRMIHdhcyBpbnRlcnJ1cHRlZC4KICAqCi0gKglUaGUgY2hlY2tfZnJlZV9zZWN0b3JzIGluIHRoaXMgZnVuY3Rpb24gaXMgbmVjZXJlc3NhcnkuIFRoZXJlIGlzIGEgcG9zc2libGUKKyAqCVRoZSBjaGVja19mcmVlX3NlY3RvcnMgaW4gdGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkuIFRoZXJlIGlzIGEgcG9zc2libGUKICAqCXNpdHVhdGlvbiB0aGF0IGFmdGVyIHdyaXRpbmcgdGhlIERhdGEgYXJlYSwgdGhlIEJsb2NrIENvbnRyb2wgSW5mb3JtYXRpb24gaXMKICAqCW5vdCB1cGRhdGVkIGFjY29yZGluZyAoZHVlIHRvIHBvd2VyIGZhaWx1cmUgb3Igc29tZXRoaW5nKSB3aGljaCBsZWF2ZXMgdGhlIGJsb2NrCi0gKglpbiBhbiB1bWNvbnNpc3RlbnQgc3RhdGUuIFNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgYSBibG9jayBpcyByZWFsbHkgRlJFRSBpbiB0aGlzCisgKglpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgYSBibG9jayBpcyByZWFsbHkgRlJFRSBpbiB0aGlzCiAgKgljYXNlLiAqLwogc3RhdGljIHZvaWQgY2hlY2tfc2VjdG9yc19pbl9jaGFpbihzdHJ1Y3QgTkZUTHJlY29yZCAqbmZ0bCwgdW5zaWduZWQgaW50IGZpcnN0X2Jsb2NrKQogewpAQCAtNDI4LDcgKzQyOCw3IEBACiAKIAlmb3IgKDs7KSB7CiAJCWxlbmd0aCsrOwotCQkvKiBhdm9pZCBpbmZpbml0ZSBsb29wcywgYWx0aG91Z2ggdGhpcyBpcyBndWFyYW50ZWQgbm90IHRvCisJCS8qIGF2b2lkIGluZmluaXRlIGxvb3BzLCBhbHRob3VnaCB0aGlzIGlzIGd1YXJhbnRlZWQgbm90IHRvCiAJCSAgIGhhcHBlbiBiZWNhdXNlIG9mIHRoZSBwcmV2aW91cyBjaGVja3MgKi8KIAkJaWYgKGxlbmd0aCA+PSBuZnRsLT5uYl9ibG9ja3MpIHsKIAkJCXByaW50aygibmZ0bDogbGVuZ3RoIHRvbyBsb25nICVkICFcbiIsIGxlbmd0aCk7CkBAIC00NDcsMTEgKzQ0NywxMSBAQAogLyogZm9ybWF0X2NoYWluOiBGb3JtYXQgYW4gaW52YWxpZCBWaXJ0dWFsIFVuaXQgY2hhaW4uIEl0IGZyZWVzIGFsbCB0aGUgRXJhc2UgVW5pdHMgaW4gYQogICoJVmlydHVhbCBVbml0IENoYWluLCBpLmUuIGFsbCB0aGUgdW5pdHMgYXJlIGRpc2Nvbm5lY3RlZC4KICAqCi0gKglJdCBpcyBub3Qgc3RyaWNseSBjb3JyZWN0IHRvIGJlZ2luIGZyb20gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBjaGFpbiBiZWNhdXNlCisgKglJdCBpcyBub3Qgc3RyaWN0bHkgY29ycmVjdCB0byBiZWdpbiBmcm9tIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4gYmVjYXVzZQogICoJaWYgd2Ugc3RvcCB0aGUgY29kZSwgd2UgbWF5IHNlZSBhZ2FpbiBhIHZhbGlkIGNoYWluIGlmIHRoZXJlIHdhcyBhIGZpcnN0X2Jsb2NrCiAgKglmbGFnIGluIGEgYmxvY2sgaW5zaWRlIGl0LiBCdXQgaXMgaXQgcmVhbGx5IGEgcHJvYmxlbSA/CiAgKgotICogRml4TWU6IEZpZ3VyZSBvdXQgd2hhdCB0aGUgbGFzdCBzdGF0ZXNtZW50IG1lYW5zLiBXaGF0IGlmIHBvd2VyIGZhaWx1cmUgd2hlbiB3ZSBhcmUKKyAqIEZpeE1lOiBGaWd1cmUgb3V0IHdoYXQgdGhlIGxhc3Qgc3RhdGVtZW50IG1lYW5zLiBXaGF0IGlmIHBvd2VyIGZhaWx1cmUgd2hlbiB3ZSBhcmUKICAqCWluIHRoZSBmb3IgKDs7KSBsb29wIGZvcm1hdHRpbmcgYmxvY2tzID8/CiAgKi8KIHN0YXRpYyB2b2lkIGZvcm1hdF9jaGFpbihzdHJ1Y3QgTkZUTHJlY29yZCAqbmZ0bCwgdW5zaWduZWQgaW50IGZpcnN0X2Jsb2NrKQpAQCAtNDg1LDcgKzQ4NSw3IEBACiAgKgl0b3RhbGx5IGZyZWUgKG9ubHkgMHhmZikuCiAgKgogICogRGVmaW5pdGlvbjogRnJlZSBFcmFzZSBVbml0IC0tIEEgcHJvcGVybHkgZXJhc2VkL2Zvcm1hdHRlZCBGcmVlIEVyYXNlIFVuaXQgc2hvdWxkIGhhdmUgbWVldCB0aGUKLSAqCWZvbGxvd2luZyBjcml0aWE6CisgKglmb2xsb3dpbmcgY3JpdGVyaWE6CiAgKgkxLiAqLwogc3RhdGljIGludCBjaGVja19hbmRfbWFya19mcmVlX2Jsb2NrKHN0cnVjdCBORlRMcmVjb3JkICpuZnRsLCBpbnQgYmxvY2spCiB7CkBAIC01MDIsNyArNTAyLDcgQEAKIAllcmFzZV9tYXJrID0gbGUxNl90b19jcHUgKChoMS5FcmFzZU1hcmsgfCBoMS5FcmFzZU1hcmsxKSk7CiAJaWYgKGVyYXNlX21hcmsgIT0gRVJBU0VfTUFSSykgewogCQkvKiBpZiBubyBlcmFzZSBtYXJrLCB0aGUgYmxvY2sgbXVzdCBiZSB0b3RhbGx5IGZyZWUuIFRoaXMgaXMKLQkJICAgcG9zc2libGUgaW4gdHdvIGNhc2VzIDogZW1wdHkgZmlsc3lzdGVtIG9yIGludGVycnVwdGVkIGVyYXNlICh2ZXJ5IHVubGlrZWx5KSAqLworCQkgICBwb3NzaWJsZSBpbiB0d28gY2FzZXMgOiBlbXB0eSBmaWxlc3lzdGVtIG9yIGludGVycnVwdGVkIGVyYXNlICh2ZXJ5IHVubGlrZWx5KSAqLwogCQlpZiAoY2hlY2tfZnJlZV9zZWN0b3JzIChuZnRsLCBibG9jayAqIG5mdGwtPkVyYXNlU2l6ZSwgbmZ0bC0+RXJhc2VTaXplLCAxKSAhPSAwKQogCQkJcmV0dXJuIC0xOwogCkBAIC01NDQsNyArNTQ0LDcgQEAKIC8qIGdldF9mb2xkX21hcms6IFJlYWQgZm9sZCBtYXJrIGZyb20gVW5pdCBDb250cm9sIEluZm9ybWF0aW9uICMyLCB3ZSB1c2UgRk9MRF9NQVJLX0lOX1BST0dSRVNTCiAgKgl0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBpbiB0aGUgcHJvZ3Jlc3Npb24gb2YgYSBWaXJ0dWFsIFVuaXQgQ2hhaW4gZm9sZGluZy4gSWYgdGhlIFVDSSAjMgogICoJaXMgRk9MRF9NQVJLX0lOX1BST0dSRVNTIHdoZW4gbW91bnRpbmcgdGhlIE5GVEwsIHRoZSAocHJldmlvdXMpIGZvbGRpbmcgcHJvY2VzcyBpcyBpbnRlcnJ1cHRlZAotICoJZm9yIHNvbWUgcmVhc29uLiBBIGNsZWFuIHVwL2NoZWNrIG9mIHRoZSBWVUMgaXMgbmVjZXJlc3NhcnkgaW4gdGhpcyBjYXNlLgorICoJZm9yIHNvbWUgcmVhc29uLiBBIGNsZWFuIHVwL2NoZWNrIG9mIHRoZSBWVUMgaXMgbmVjZXNzYXJ5IGluIHRoaXMgY2FzZS4KICAqCiAgKiBXQVJOSU5HOiByZXR1cm4gMCBpZiByZWFkIGVycm9yCiAgKi8KQEAgLTY1Nyw3ICs2NTcsNyBAQAogCQkJCQkJcHJpbnRrKCJCbG9jayAlZDogaW5jb3JyZWN0IGxvZ2ljYWwgYmxvY2s6ICVkIGV4cGVjdGVkOiAlZFxuIiwKIAkJCQkJCSAgICAgICBibG9jaywgbG9naWNhbF9ibG9jaywgZmlyc3RfbG9naWNhbF9ibG9jayk7CiAJCQkJCQkvKiB0aGUgY2hhaW4gaXMgaW5jb3JyZWN0IDogd2UgbXVzdCBmb3JtYXQgaXQsCi0JCQkJCQkgICBidXQgd2UgbmVlZCB0byByZWFkIGl0IGNvbXBsZXRseSAqLworCQkJCQkJICAgYnV0IHdlIG5lZWQgdG8gcmVhZCBpdCBjb21wbGV0ZWx5ICovCiAJCQkJCQlkb19mb3JtYXRfY2hhaW4gPSAxOwogCQkJCQl9CiAJCQkJCWlmIChpc19maXJzdF9ibG9jaykgewpAQCAtNjY5LDcgKzY2OSw3IEBACiAJCQkJCQkJcHJpbnRrKCJCbG9jayAlZDogaW5jb3JyZWN0bHkgbWFya2VkIGFzIGZpcnN0IGJsb2NrIGluIGNoYWluXG4iLAogCQkJCQkJCSAgICAgICBibG9jayk7CiAJCQkJCQkJLyogdGhlIGNoYWluIGlzIGluY29ycmVjdCA6IHdlIG11c3QgZm9ybWF0IGl0LAotCQkJCQkJCSAgIGJ1dCB3ZSBuZWVkIHRvIHJlYWQgaXQgY29tcGxldGx5ICovCisJCQkJCQkJICAgYnV0IHdlIG5lZWQgdG8gcmVhZCBpdCBjb21wbGV0ZWx5ICovCiAJCQkJCQkJZG9fZm9ybWF0X2NoYWluID0gMTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJcHJpbnRrKCJCbG9jayAlZDogZm9sZGluZyBpbiBwcm9ncmVzcyAtIGlnbm9yaW5nIGZpcnN0IGJsb2NrIGZsYWdcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vZnBhcnQuYyBiL2RyaXZlcnMvbXRkL29mcGFydC5jCmluZGV4IGE5OTY3MTguLjY0YmU4ZjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vZnBhcnQuYworKysgYi9kcml2ZXJzL210ZC9vZnBhcnQuYwpAQCAtMjAsMTQgKzIwLDIzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAKLWludCBfX2RldmluaXQgb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzKQorc3RhdGljIGludCBwYXJzZV9vZnBhcnRfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwKKwkJCQkgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQkgICBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWNvbnN0IGNoYXIgKnBhcnRuYW1lOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHA7CiAJaW50IG5yX3BhcnRzLCBpOwogCisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJbm9kZSA9IGRhdGEtPm9mX25vZGU7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gMDsKKwogCS8qIEZpcnN0IGNvdW50IHRoZSBzdWJub2RlcyAqLwogCXBwID0gTlVMTDsKIAlucl9wYXJ0cyA9IDA7CkBAIC02OSw3ICs3OCw3IEBACiAKIAlpZiAoIWkpIHsKIAkJb2Zfbm9kZV9wdXQocHApOwotCQlkZXZfZXJyKGRldiwgIk5vIHZhbGlkIHBhcnRpdGlvbiBmb3VuZCBvbiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcHJfZXJyKCJObyB2YWxpZCBwYXJ0aXRpb24gZm91bmQgb24gJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCWtmcmVlKCpwcGFydHMpOwogCQkqcHBhcnRzID0gTlVMTDsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03Nyw2ICs4Niw5OSBAQAogCiAJcmV0dXJuIG5yX3BhcnRzOwogfQotRVhQT1JUX1NZTUJPTChvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyk7CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyIG9mcGFydF9wYXJzZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnBhcnNlX2ZuID0gcGFyc2Vfb2ZwYXJ0X3BhcnRpdGlvbnMsCisJLm5hbWUgPSAib2ZwYXJ0IiwKK307CisKK3N0YXRpYyBpbnQgcGFyc2Vfb2ZvbGRwYXJ0X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCisJCQkJICAgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCisJCQkJICAgICAgc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaW50IGksIHBsZW4sIG5yX3BhcnRzOworCWNvbnN0IHN0cnVjdCB7CisJCV9fYmUzMiBvZmZzZXQsIGxlbjsKKwl9ICpwYXJ0OworCWNvbnN0IGNoYXIgKm5hbWVzOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCWRwID0gZGF0YS0+b2Zfbm9kZTsKKwlpZiAoIWRwKQorCQlyZXR1cm4gMDsKKworCXBhcnQgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJwYXJ0aXRpb25zIiwgJnBsZW4pOworCWlmICghcGFydCkKKwkJcmV0dXJuIDA7IC8qIE5vIHBhcnRpdGlvbnMgZm91bmQgKi8KKworCXByX3dhcm5pbmcoIkRldmljZSB0cmVlIHVzZXMgb2Jzb2xldGUgcGFydGl0aW9uIG1hcCBiaW5kaW5nOiAlc1xuIiwKKwkJCWRwLT5mdWxsX25hbWUpOworCisJbnJfcGFydHMgPSBwbGVuIC8gc2l6ZW9mKHBhcnRbMF0pOworCisJKnBwYXJ0cyA9IGt6YWxsb2MobnJfcGFydHMgKiBzaXplb2YoKigqcHBhcnRzKSksIEdGUF9LRVJORUwpOworCWlmICghcHBhcnRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5hbWVzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicGFydGl0aW9uLW5hbWVzIiwgJnBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IG5yX3BhcnRzOyBpKyspIHsKKwkJKCpwcGFydHMpW2ldLm9mZnNldCA9IGJlMzJfdG9fY3B1KHBhcnQtPm9mZnNldCk7CisJCSgqcHBhcnRzKVtpXS5zaXplICAgPSBiZTMyX3RvX2NwdShwYXJ0LT5sZW4pICYgfjE7CisJCS8qIGJpdCAwIHNldCBzaWduaWZpZXMgcmVhZCBvbmx5IHBhcnRpdGlvbiAqLworCQlpZiAoYmUzMl90b19jcHUocGFydC0+bGVuKSAmIDEpCisJCQkoKnBwYXJ0cylbaV0ubWFza19mbGFncyA9IE1URF9XUklURUFCTEU7CisKKwkJaWYgKG5hbWVzICYmIChwbGVuID4gMCkpIHsKKwkJCWludCBsZW4gPSBzdHJsZW4obmFtZXMpICsgMTsKKworCQkJKCpwcGFydHMpW2ldLm5hbWUgPSAoY2hhciAqKW5hbWVzOworCQkJcGxlbiAtPSBsZW47CisJCQluYW1lcyArPSBsZW47CisJCX0gZWxzZSB7CisJCQkoKnBwYXJ0cylbaV0ubmFtZSA9ICJ1bm5hbWVkIjsKKwkJfQorCisJCXBhcnQrKzsKKwl9CisKKwlyZXR1cm4gbnJfcGFydHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyIG9mb2xkcGFydF9wYXJzZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnBhcnNlX2ZuID0gcGFyc2Vfb2ZvbGRwYXJ0X3BhcnRpdGlvbnMsCisJLm5hbWUgPSAib2ZvbGRwYXJ0IiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9mcGFydF9wYXJzZXJfaW5pdCh2b2lkKQoreworCWludCByYzsKKwlyYyA9IHJlZ2lzdGVyX210ZF9wYXJzZXIoJm9mcGFydF9wYXJzZXIpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHJlZ2lzdGVyX210ZF9wYXJzZXIoJm9mb2xkcGFydF9wYXJzZXIpOworCWlmICghcmMpCisJCXJldHVybiAwOworCisJZGVyZWdpc3Rlcl9tdGRfcGFyc2VyKCZvZm9sZHBhcnRfcGFyc2VyKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK21vZHVsZV9pbml0KG9mcGFydF9wYXJzZXJfaW5pdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFyc2VyIGZvciBNVEQgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIGluIGRldmljZSB0cmVlIik7CitNT0RVTEVfQVVUSE9SKCJWaXRhbHkgV29vbCwgRGF2aWQgR2lic29uIik7CisvKgorICogV2hlbiBNVEQgY29yZSBjYW5ub3QgZmluZCB0aGUgcmVxdWVzdGVkIHBhcnNlciwgaXQgdHJpZXMgdG8gbG9hZCB0aGUgbW9kdWxlCisgKiB3aXRoIHRoZSBzYW1lIG5hbWUuIFNpbmNlIHdlIHByb3ZpZGUgdGhlIG9mb2xkcGFydCBwYXJzZXIsIHdlIHNob3VsZCBoYXZlCisgKiB0aGUgY29ycmVzcG9uZGluZyBhbGlhcy4KKyAqLworTU9EVUxFX0FMSUFTKCJvZm9sZHBhcnQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKaW5kZXggMmQ3MGQzNS4uNzgxMzA5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMKQEAgLTMwLDExICszMCw4IEBACiAgKi8KICNkZWZpbmUgRFJJVkVSX05BTUUJIm9uZW5hbmQtZmxhc2giCiAKLXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMLCAgfTsKLQogc3RydWN0IG9uZW5hbmRfaW5mbyB7CiAJc3RydWN0IG10ZF9pbmZvCQltdGQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOwogCXN0cnVjdCBvbmVuYW5kX2NoaXAJb25lbmFuZDsKIH07CiAKQEAgLTczLDEzICs3MCw5IEBACiAJCWdvdG8gb3V0X2lvdW5tYXA7CiAJfQogCi0JZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJmluZm8tPm10ZCwgcGFydF9wcm9iZXMsICZpbmZvLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA+IDApCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgaW5mby0+cGFydHMsIGVycik7Ci0JZWxzZSBpZiAoZXJyIDw9IDAgJiYgcGRhdGEgJiYgcGRhdGEtPnBhcnRzKQotCQltdGRfZGV2aWNlX3JlZ2lzdGVyKCZpbmZvLT5tdGQsIHBkYXRhLT5wYXJ0cywgcGRhdGEtPm5yX3BhcnRzKTsKLQllbHNlCi0JCWVyciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmluZm8tPm10ZCwgTlVMTCwgMCk7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcigmaW5mby0+bXRkLCBOVUxMLCAwLAorCQkJcGRhdGEgPyBwZGF0YS0+cGFydHMgOiBOVUxMLAorCQkJcGRhdGEgPyBwZGF0YS0+bnJfcGFydHMgOiAwKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCkBAIC0xMDQsNyArOTcsNiBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCiAJaWYgKGluZm8pIHsKLQkJbXRkX2RldmljZV91bnJlZ2lzdGVyKCZpbmZvLT5tdGQpOwogCQlvbmVuYW5kX3JlbGVhc2UoJmluZm8tPm10ZCk7CiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplKTsKIAkJaW91bm1hcChpbmZvLT5vbmVuYW5kLmJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCmluZGV4IGE5MTZkZWMuLjdlOWVhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHBsYXQvb25lbmFuZC5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogCkBAIC01Nyw3ICs1Nyw2IEBACiAJdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CiAJaW50IGdwaW9faXJxOwogCXN0cnVjdCBtdGRfaW5mbyBtdGQ7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogCXN0cnVjdCBvbmVuYW5kX2NoaXAgb25lbmFuZDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBpcnFfZG9uZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkbWFfZG9uZTsKQEAgLTY3LDggKzY2LDYgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7CiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgIH07Ci0KIHN0YXRpYyB2b2lkIG9tYXAyX29uZW5hbmRfZG1hX2NiKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG9tYXAyX29uZW5hbmQgKmMgPSBkYXRhOwpAQCAtNzQxLDYgKzczOCw3IEBACiAJCWMtPnJlZ3VsYXRvciA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZvbmVuYW5kIik7CiAJCWlmIChJU19FUlIoYy0+cmVndWxhdG9yKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAgIkZhaWxlZCB0byBnZXQgcmVndWxhdG9yXG4iKTsKKwkJCXIgPSBQVFJfRVJSKGMtPnJlZ3VsYXRvcik7CiAJCQlnb3RvIGVycl9yZWxlYXNlX2RtYTsKIAkJfQogCQljLT5vbmVuYW5kLmVuYWJsZSA9IG9tYXAyX29uZW5hbmRfZW5hYmxlOwpAQCAtNzUzLDEzICs3NTEsOSBAQAogCWlmICgociA9IG9uZW5hbmRfc2NhbigmYy0+bXRkLCAxKSkgPCAwKQogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ3VsYXRvcjsKIAotCXIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucygmYy0+bXRkLCBwYXJ0X3Byb2JlcywgJmMtPnBhcnRzLCAwKTsKLQlpZiAociA+IDApCi0JCXIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKCZjLT5tdGQsIGMtPnBhcnRzLCByKTsKLQllbHNlIGlmIChwZGF0YS0+cGFydHMgIT0gTlVMTCkKLQkJciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmMtPm10ZCwgcGRhdGEtPnBhcnRzLCBwZGF0YS0+bnJfcGFydHMpOwotCWVsc2UKLQkJciA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIoJmMtPm10ZCwgTlVMTCwgMCk7CisJciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoJmMtPm10ZCwgTlVMTCwgMCwKKwkJCXBkYXRhID8gcGRhdGEtPnBhcnRzIDogTlVMTCwKKwkJCXBkYXRhID8gcGRhdGEtPm5yX3BhcnRzIDogMCk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyX3JlbGVhc2Vfb25lbmFuZDsKIApAQCAtNzg2LDcgKzc4MCw2IEBACiBlcnJfZnJlZV9jczoKIAlncG1jX2NzX2ZyZWUoYy0+Z3BtY19jcyk7CiBlcnJfa2ZyZWU6Ci0Ja2ZyZWUoYy0+cGFydHMpOwogCWtmcmVlKGMpOwogCiAJcmV0dXJuIHI7CkBAIC04MDksNyArODAyLDYgQEAKIAlpb3VubWFwKGMtPm9uZW5hbmQuYmFzZSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGMtPnBoeXNfYmFzZSwgT05FTkFORF9JT19TSVpFKTsKIAlncG1jX2NzX2ZyZWUoYy0+Z3BtY19jcyk7Ci0Ja2ZyZWUoYy0+cGFydHMpOwogCWtmcmVlKGMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwppbmRleCBhYzllOTU5Li5hODM5NDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKQEAgLTEwMTUsNyArMTAxNSw3IEBACiB9CiAKIC8qKgotICogb25lbmFuZF90cmFuc2Zlcl9hdXRvX29vYiAtIFtJbnRlcm5hbF0gb29iIGF1dG8tcGxhY2VtZW50IHRyYW5zZmVyCisgKiBvbmVuYW5kX3RyYW5zZmVyX2F1dG9fb29iIC0gW0lOVEVSTl0gb29iIGF1dG8tcGxhY2VtZW50IHRyYW5zZmVyCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhcmFtIGJ1ZgkJZGVzdGluYXRpb24gYWRkcmVzcwogICogQHBhcmFtIGNvbHVtbglvb2Igb2Zmc2V0IHRvIHJlYWQgZnJvbQpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCS8qIGNoZWNrIGlmIHdlIGZhaWxlZCBkdWUgdG8gdW5jb3JyZWN0YWJsZSBlcnJvciAqLwotCWlmIChzdGF0dXMgIT0gLUVCQURNU0cgJiYgc3RhdHVzICE9IE9ORU5BTkRfQkJUX1JFQURfRUNDX0VSUk9SKQorCWlmICghbXRkX2lzX2VjY2VycihzdGF0dXMpICYmIHN0YXR1cyAhPSBPTkVOQU5EX0JCVF9SRUFEX0VDQ19FUlJPUikKIAkJcmV0dXJuIHN0YXR1czsKIAogCS8qIGNoZWNrIGlmIGFkZHJlc3MgbGllcyBpbiBNTEMgcmVnaW9uICovCkBAIC0xMTIyLDEwICsxMTIyLDEwIEBACiAJaW50IHJldCA9IDA7CiAJaW50IHdyaXRlc2l6ZSA9IHRoaXMtPndyaXRlc2l6ZTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogZnJvbSA9IDB4JTA4eCwgbGVuID0gJWlcbiIsCi0JICAgICAgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIGZyb20sIChpbnQpIGxlbik7CisJcHJfZGVidWcoIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZnJvbSwKKwkJCShpbnQpbGVuKTsKIAotCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJb29ic2l6ZSA9IHRoaXMtPmVjY2xheW91dC0+b29iYXZhaWw7CiAJZWxzZQogCQlvb2JzaXplID0gbXRkLT5vb2JzaXplOwpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKIAkJCWlmICh1bmxpa2VseShyZXQpKQogCQkJCXJldCA9IG9uZW5hbmRfcmVjb3Zlcl9sc2IobXRkLCBmcm9tLCByZXQpOwogCQkJb25lbmFuZF91cGRhdGVfYnVmZmVycmFtKG10ZCwgZnJvbSwgIXJldCk7Ci0JCQlpZiAocmV0ID09IC1FQkFETVNHKQorCQkJaWYgKG10ZF9pc19lY2NlcnIocmV0KSkKIAkJCQlyZXQgPSAwOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKQEAgLTExNzAsNyArMTE3MCw3IEBACiAJCQl0aGlzb29ibGVuID0gb29ic2l6ZSAtIG9vYmNvbHVtbjsKIAkJCXRoaXNvb2JsZW4gPSBtaW5fdChpbnQsIHRoaXNvb2JsZW4sIG9vYmxlbiAtIG9vYnJlYWQpOwogCi0JCQlpZiAob3BzLT5tb2RlID09IE1URF9PT0JfQVVUTykKKwkJCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJCQlvbmVuYW5kX3RyYW5zZmVyX2F1dG9fb29iKG10ZCwgb29iYnVmLCBvb2Jjb2x1bW4sIHRoaXNvb2JsZW4pOwogCQkJZWxzZQogCQkJCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgb29iYnVmLCBvb2Jjb2x1bW4sIHRoaXNvb2JsZW4pOwpAQCAtMTIyNiwxMCArMTIyNiwxMCBAQAogCWludCByZXQgPSAwLCBib3VuZGFyeSA9IDA7CiAJaW50IHdyaXRlc2l6ZSA9IHRoaXMtPndyaXRlc2l6ZTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogZnJvbSA9IDB4JTA4eCwgbGVuID0gJWlcbiIsCi0JCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgZnJvbSwgKGludCkgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6IGZyb20gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClmcm9tLAorCQkJKGludClsZW4pOwogCi0JaWYgKG9wcy0+bW9kZSA9PSBNVERfT09CX0FVVE8pCisJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQlvb2JzaXplID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKIAllbHNlCiAJCW9vYnNpemUgPSBtdGQtPm9vYnNpemU7CkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogCQkJdGhpcy0+Y29tbWFuZChtdGQsIE9ORU5BTkRfQ01EX1JFQUQsIGZyb20sIHdyaXRlc2l6ZSk7CiAgCQkJcmV0ID0gdGhpcy0+d2FpdChtdGQsIEZMX1JFQURJTkcpOwogIAkJCW9uZW5hbmRfdXBkYXRlX2J1ZmZlcnJhbShtdGQsIGZyb20sICFyZXQpOwotCQkJaWYgKHJldCA9PSAtRUJBRE1TRykKKwkJCWlmIChtdGRfaXNfZWNjZXJyKHJldCkpCiAJCQkJcmV0ID0gMDsKICAJCX0KICAJfQpAQCAtMTI5MSw3ICsxMjkxLDcgQEAKIAkJCXRoaXNvb2JsZW4gPSBvb2JzaXplIC0gb29iY29sdW1uOwogCQkJdGhpc29vYmxlbiA9IG1pbl90KGludCwgdGhpc29vYmxlbiwgb29ibGVuIC0gb29icmVhZCk7CiAKLQkJCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCQkJaWYgKG9wcy0+bW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQkJCW9uZW5hbmRfdHJhbnNmZXJfYXV0b19vb2IobXRkLCBvb2JidWYsIG9vYmNvbHVtbiwgdGhpc29vYmxlbik7CiAJCQllbHNlCiAJCQkJdGhpcy0+cmVhZF9idWZmZXJyYW0obXRkLCBPTkVOQU5EX1NQQVJFUkFNLCBvb2JidWYsIG9vYmNvbHVtbiwgdGhpc29vYmxlbik7CkBAIC0xMzE1LDcgKzEzMTUsNyBAQAogIAkJLyogTm93IHdhaXQgZm9yIGxvYWQgKi8KICAJCXJldCA9IHRoaXMtPndhaXQobXRkLCBGTF9SRUFESU5HKTsKICAJCW9uZW5hbmRfdXBkYXRlX2J1ZmZlcnJhbShtdGQsIGZyb20sICFyZXQpOwotCQlpZiAocmV0ID09IC1FQkFETVNHKQorCQlpZiAobXRkX2lzX2VjY2VycihyZXQpKQogCQkJcmV0ID0gMDsKICAJfQogCkBAIC0xMzUxLDE5ICsxMzUxLDE5IEBACiAJc3RydWN0IG10ZF9lY2Nfc3RhdHMgc3RhdHM7CiAJaW50IHJlYWQgPSAwLCB0aGlzbGVuLCBjb2x1bW4sIG9vYnNpemU7CiAJc2l6ZV90IGxlbiA9IG9wcy0+b29ibGVuOwotCW10ZF9vb2JfbW9kZV90IG1vZGUgPSBvcHMtPm1vZGU7CisJdW5zaWduZWQgaW50IG1vZGUgPSBvcHMtPm1vZGU7CiAJdV9jaGFyICpidWYgPSBvcHMtPm9vYmJ1ZjsKIAlpbnQgcmV0ID0gMCwgcmVhZGNtZDsKIAogCWZyb20gKz0gb3BzLT5vb2JvZmZzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIGZyb20sIChpbnQpIGxlbik7CisJcHJfZGVidWcoIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpZnJvbSwKKwkJCShpbnQpbGVuKTsKIAogCS8qIEluaXRpYWxpemUgcmV0dXJuIGxlbmd0aCB2YWx1ZSAqLwogCW9wcy0+b29icmV0bGVuID0gMDsKIAotCWlmIChtb2RlID09IE1URF9PT0JfQVVUTykKKwlpZiAobW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQlvb2JzaXplID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKIAllbHNlCiAJCW9vYnNpemUgPSBtdGQtPm9vYnNpemU7CkBAIC0xNDAzLDEzICsxNDAzLDEzIEBACiAJCWlmICh1bmxpa2VseShyZXQpKQogCQkJcmV0ID0gb25lbmFuZF9yZWNvdmVyX2xzYihtdGQsIGZyb20sIHJldCk7CiAKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVCQURNU0cpIHsKKwkJaWYgKHJldCAmJiAhbXRkX2lzX2VjY2VycihyZXQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkIGZhaWxlZCA9IDB4JXhcbiIsCiAJCQkJX19mdW5jX18sIHJldCk7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChtb2RlID09IE1URF9PT0JfQVVUTykKKwkJaWYgKG1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJCW9uZW5hbmRfdHJhbnNmZXJfYXV0b19vb2IobXRkLCBidWYsIGNvbHVtbiwgdGhpc2xlbik7CiAJCWVsc2UKIAkJCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgYnVmLCBjb2x1bW4sIHRoaXNsZW4pOwpAQCAtMTQ4NywxMCArMTQ4NywxMCBAQAogCWludCByZXQ7CiAKIAlzd2l0Y2ggKG9wcy0+bW9kZSkgewotCWNhc2UgTVREX09PQl9QTEFDRToKLQljYXNlIE1URF9PT0JfQVVUTzoKKwljYXNlIE1URF9PUFNfUExBQ0VfT09COgorCWNhc2UgTVREX09QU19BVVRPX09PQjoKIAkJYnJlYWs7Ci0JY2FzZSBNVERfT09CX1JBVzoKKwljYXNlIE1URF9PUFNfUkFXOgogCQkvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTc2LDggKzE1NzYsOCBAQAogCXNpemVfdCBsZW4gPSBvcHMtPm9vYmxlbjsKIAl1X2NoYXIgKmJ1ZiA9IG9wcy0+b29iYnVmOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBmcm9tID0gMHglMDh4LCBsZW4gPSAlemlcbiIsCi0JCV9fZnVuY19fLCAodW5zaWduZWQgaW50KSBmcm9tLCBsZW4pOworCXByX2RlYnVnKCIlczogZnJvbSA9IDB4JTA4eCwgbGVuID0gJXppXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClmcm9tLAorCQkJbGVuKTsKIAogCS8qIEluaXRpYWxpemUgcmV0dXJuIHZhbHVlICovCiAJb3BzLT5vb2JyZXRsZW4gPSAwOwpAQCAtMTc1MCw4ICsxNzUwLDggQEAKIAkvKiBXYWl0IGZvciBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9uIHRvIGNsZWFyICovCiAJb25lbmFuZF9wYW5pY193YWl0KG10ZCk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIHRvLCAoaW50KSBsZW4pOworCXByX2RlYnVnKCIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCl0bywKKwkJCShpbnQpbGVuKTsKIAogCS8qIEluaXRpYWxpemUgcmV0bGVuLCBpbiBjYXNlIG9mIGVhcmx5IGV4aXQgKi8KIAkqcmV0bGVuID0gMDsKQEAgLTE4MjEsNyArMTgyMSw3IEBACiB9CiAKIC8qKgotICogb25lbmFuZF9maWxsX2F1dG9fb29iIC0gW0ludGVybmFsXSBvb2IgYXV0by1wbGFjZW1lbnQgdHJhbnNmZXIKKyAqIG9uZW5hbmRfZmlsbF9hdXRvX29vYiAtIFtJTlRFUk5dIG9vYiBhdXRvLXBsYWNlbWVudCB0cmFuc2ZlcgogICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBwYXJhbSBvb2JfYnVmCW9vYiBidWZmZXIKICAqIEBwYXJhbSBidWYJCXNvdXJjZSBhZGRyZXNzCkBAIC0xODgzLDggKzE4ODMsOCBAQAogCXVfY2hhciAqb29iYnVmOwogCWludCByZXQgPSAwLCBjbWQ7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpIHRvLCAoaW50KSBsZW4pOworCXByX2RlYnVnKCIlczogdG8gPSAweCUwOHgsIGxlbiA9ICVpXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCl0bywKKwkJCShpbnQpbGVuKTsKIAogCS8qIEluaXRpYWxpemUgcmV0bGVuLCBpbiBjYXNlIG9mIGVhcmx5IGV4aXQgKi8KIAlvcHMtPnJldGxlbiA9IDA7CkBAIC0xOTA4LDcgKzE5MDgsNyBAQAogCWlmICghbGVuKQogCQlyZXR1cm4gMDsKIAotCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJb29ic2l6ZSA9IHRoaXMtPmVjY2xheW91dC0+b29iYXZhaWw7CiAJZWxzZQogCQlvb2JzaXplID0gbXRkLT5vb2JzaXplOwpAQCAtMTk0NSw3ICsxOTQ1LDcgQEAKIAkJCQkvKiBXZSBzZW5kIGRhdGEgdG8gc3BhcmUgcmFtIHdpdGggb29ic2l6ZQogCQkJCSAqIHRvIHByZXZlbnQgYnl0ZSBhY2Nlc3MgKi8KIAkJCQltZW1zZXQob29iYnVmLCAweGZmLCBtdGQtPm9vYnNpemUpOwotCQkJCWlmIChvcHMtPm1vZGUgPT0gTVREX09PQl9BVVRPKQorCQkJCWlmIChvcHMtPm1vZGUgPT0gTVREX09QU19BVVRPX09PQikKIAkJCQkJb25lbmFuZF9maWxsX2F1dG9fb29iKG10ZCwgb29iYnVmLCBvb2IsIG9vYmNvbHVtbiwgdGhpc29vYmxlbik7CiAJCQkJZWxzZQogCQkJCQltZW1jcHkob29iYnVmICsgb29iY29sdW1uLCBvb2IsIHRoaXNvb2JsZW4pOwpAQCAtMjA1NSw3ICsyMDU1LDcgQEAKIAogCiAvKioKLSAqIG9uZW5hbmRfd3JpdGVfb29iX25vbG9jayAtIFtJbnRlcm5hbF0gT25lTkFORCB3cml0ZSBvdXQtb2YtYmFuZAorICogb25lbmFuZF93cml0ZV9vb2Jfbm9sb2NrIC0gW0lOVEVSTl0gT25lTkFORCB3cml0ZSBvdXQtb2YtYmFuZAogICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBwYXJhbSB0bwkJb2Zmc2V0IHRvIHdyaXRlIHRvCiAgKiBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKQEAgLTIwNzQsMTcgKzIwNzQsMTcgQEAKIAl1X2NoYXIgKm9vYmJ1ZjsKIAlzaXplX3QgbGVuID0gb3BzLT5vb2JsZW47CiAJY29uc3QgdV9jaGFyICpidWYgPSBvcHMtPm9vYmJ1ZjsKLQltdGRfb29iX21vZGVfdCBtb2RlID0gb3BzLT5tb2RlOworCXVuc2lnbmVkIGludCBtb2RlID0gb3BzLT5tb2RlOwogCiAJdG8gKz0gb3BzLT5vb2JvZmZzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiB0byA9IDB4JTA4eCwgbGVuID0gJWlcbiIsCi0JCV9fZnVuY19fLCAodW5zaWduZWQgaW50KSB0bywgKGludCkgbGVuKTsKKwlwcl9kZWJ1ZygiJXM6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpdG8sCisJCQkoaW50KWxlbik7CiAKIAkvKiBJbml0aWFsaXplIHJldGxlbiwgaW4gY2FzZSBvZiBlYXJseSBleGl0ICovCiAJb3BzLT5vb2JyZXRsZW4gPSAwOwogCi0JaWYgKG1vZGUgPT0gTVREX09PQl9BVVRPKQorCWlmIChtb2RlID09IE1URF9PUFNfQVVUT19PT0IpCiAJCW9vYnNpemUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmF2YWlsOwogCWVsc2UKIAkJb29ic2l6ZSA9IG10ZC0+b29ic2l6ZTsKQEAgLTIxMjgsNyArMjEyOCw3IEBACiAJCS8qIFdlIHNlbmQgZGF0YSB0byBzcGFyZSByYW0gd2l0aCBvb2JzaXplCiAJCSAqIHRvIHByZXZlbnQgYnl0ZSBhY2Nlc3MgKi8KIAkJbWVtc2V0KG9vYmJ1ZiwgMHhmZiwgbXRkLT5vb2JzaXplKTsKLQkJaWYgKG1vZGUgPT0gTVREX09PQl9BVVRPKQorCQlpZiAobW9kZSA9PSBNVERfT1BTX0FVVE9fT09CKQogCQkJb25lbmFuZF9maWxsX2F1dG9fb29iKG10ZCwgb29iYnVmLCBidWYsIGNvbHVtbiwgdGhpc2xlbik7CiAJCWVsc2UKIAkJCW1lbWNweShvb2JidWYgKyBjb2x1bW4sIGJ1ZiwgdGhpc2xlbik7CkBAIC0yMjE3LDEwICsyMjE3LDEwIEBACiAJaW50IHJldDsKIAogCXN3aXRjaCAob3BzLT5tb2RlKSB7Ci0JY2FzZSBNVERfT09CX1BMQUNFOgotCWNhc2UgTVREX09PQl9BVVRPOgorCWNhc2UgTVREX09QU19QTEFDRV9PT0I6CisJY2FzZSBNVERfT1BTX0FVVE9fT09COgogCQlicmVhazsKLQljYXNlIE1URF9PT0JfUkFXOgorCWNhc2UgTVREX09QU19SQVc6CiAJCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyODEsNyArMjI4MSw3IEBACiB9CiAKIC8qKgotICogb25lbmFuZF9tdWx0aWJsb2NrX2VyYXNlIC0gW0ludGVybmFsXSBlcmFzZSBibG9jayhzKSB1c2luZyBtdWx0aWJsb2NrIGVyYXNlCisgKiBvbmVuYW5kX211bHRpYmxvY2tfZXJhc2UgLSBbSU5URVJOXSBlcmFzZSBibG9jayhzKSB1c2luZyBtdWx0aWJsb2NrIGVyYXNlCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhcmFtIGluc3RyCQllcmFzZSBpbnN0cnVjdGlvbgogICogQHBhcmFtIHJlZ2lvbgllcmFzZSByZWdpb24KQEAgLTIzOTcsNyArMjM5Nyw3IEBACiAKIAogLyoqCi0gKiBvbmVuYW5kX2Jsb2NrX2J5X2Jsb2NrX2VyYXNlIC0gW0ludGVybmFsXSBlcmFzZSBibG9jayhzKSB1c2luZyByZWd1bGFyIGVyYXNlCisgKiBvbmVuYW5kX2Jsb2NrX2J5X2Jsb2NrX2VyYXNlIC0gW0lOVEVSTl0gZXJhc2UgYmxvY2socykgdXNpbmcgcmVndWxhciBlcmFzZQogICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBwYXJhbSBpbnN0cgkJZXJhc2UgaW5zdHJ1Y3Rpb24KICAqIEBwYXJhbSByZWdpb24JZXJhc2UgcmVnaW9uCkBAIC0yNDg5LDggKzI0ODksOSBAQAogCXN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gKnJlZ2lvbiA9IE5VTEw7CiAJbG9mZl90IHJlZ2lvbl9vZmZzZXQgPSAwOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBzdGFydD0weCUwMTJsbHgsIGxlbj0lbGx1XG4iLCBfX2Z1bmNfXywKLQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBpbnN0ci0+YWRkciwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5zdHItPmxlbik7CisJcHJfZGVidWcoIiVzOiBzdGFydD0weCUwMTJsbHgsIGxlbj0lbGx1XG4iLCBfX2Z1bmNfXywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmFkZHIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWluc3RyLT5sZW4pOwogCiAJLyogRG8gbm90IGFsbG93IGVyYXNlIHBhc3QgZW5kIG9mIGRldmljZSAqLwogCWlmICh1bmxpa2VseSgobGVuICsgYWRkcikgPiBtdGQtPnNpemUpKSB7CkBAIC0yNTU4LDcgKzI1NTksNyBAQAogICovCiBzdGF0aWMgdm9pZCBvbmVuYW5kX3N5bmMoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7Ci0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAJLyogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlICovCiAJb25lbmFuZF9nZXRfZGV2aWNlKG10ZCwgRkxfU1lOQ0lORyk7CkBAIC0yNjAyLDcgKzI2MDMsNyBAQAogCXN0cnVjdCBiYm1faW5mbyAqYmJtID0gdGhpcy0+YmJtOwogCXVfY2hhciBidWZbMl0gPSB7MCwgMH07CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wcyA9IHsKLQkJLm1vZGUgPSBNVERfT09CX1BMQUNFLAorCQkubW9kZSA9IE1URF9PUFNfUExBQ0VfT09CLAogCQkub29ibGVuID0gMiwKIAkJLm9vYmJ1ZiA9IGJ1ZiwKIAkJLm9vYm9mZnMgPSAwLApAQCAtMjkyMiw3ICsyOTIzLDcgQEAKIH0KIAogLyoqCi0gKiBvbmVuYW5kX290cF93cml0ZV9vb2Jfbm9sb2NrIC0gW0ludGVybmFsXSBPbmVOQU5EIHdyaXRlIG91dC1vZi1iYW5kLCBzcGVjaWZpYyB0byBPVFAKKyAqIG9uZW5hbmRfb3RwX3dyaXRlX29vYl9ub2xvY2sgLSBbSU5URVJOXSBPbmVOQU5EIHdyaXRlIG91dC1vZi1iYW5kLCBzcGVjaWZpYyB0byBPVFAKICAqIEBwYXJhbSBtdGQJCU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGFyYW0gdG8JCW9mZnNldCB0byB3cml0ZSB0bwogICogQHBhcmFtIGxlbgkJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCkBAIC0zMTcwLDcgKzMxNzEsNyBAQAogCQl0aGlzLT5jb21tYW5kKG10ZCwgT05FTkFORF9DTURfUkVTRVQsIDAsIDApOwogCQl0aGlzLT53YWl0KG10ZCwgRkxfUkVTRVRJTkcpOwogCX0gZWxzZSB7Ci0JCW9wcy5tb2RlID0gTVREX09PQl9QTEFDRTsKKwkJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAkJb3BzLm9vYmxlbiA9IGxlbjsKIAkJb3BzLm9vYmJ1ZiA9IGJ1ZjsKIAkJb3BzLm9vYm9mZnMgPSAwOwpAQCAtMzQyOSw2ICszNDMwLDE5IEBACiAJCWVsc2UgaWYgKG51bWJ1ZnMgPT0gMSkgewogCQkJdGhpcy0+b3B0aW9ucyB8PSBPTkVOQU5EX0hBU180S0JfUEFHRTsKIAkJCXRoaXMtPm9wdGlvbnMgfD0gT05FTkFORF9IQVNfQ0FDSEVfUFJPR1JBTTsKKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCA0S2lCIHBhZ2VzaXplIGNoaXBzCisJCQkgKiBhbmQgbm8gd2F5IHRvIGRldGVjdCBpdCBieSBIL1cgY29uZmlnIHZhbHVlcy4KKwkJCSAqCisJCQkgKiBUbyBkZXRlY3QgdGhlIGNvcnJlY3QgTk9QIGZvciBlYWNoIGNoaXBzLAorCQkJICogSXQgc2hvdWxkIGNoZWNrIHRoZSB2ZXJzaW9uIElEIGFzIHdvcmthcm91bmQuCisJCQkgKgorCQkJICogTm93IGl0IGhhcyBhcyBmb2xsb3dpbmcKKwkJCSAqIEtGTTRHMTZRNE0gaGFzIE5PUCA0IHdpdGggdmVyc2lvbiBJRCAweDAxMzEKKwkJCSAqIEtGTTRHMTZRNU0gaGFzIE5PUCAxIHdpdGggdmVyc29pbiBJRCAweDAxM2UKKwkJCSAqLworCQkJaWYgKCh0aGlzLT52ZXJzaW9uX2lkICYgMHhmKSA9PSAweGUpCisJCQkJdGhpcy0+b3B0aW9ucyB8PSBPTkVOQU5EX0hBU19OT1BfMTsKIAkJfQogCiAJY2FzZSBPTkVOQU5EX0RFVklDRV9ERU5TSVRZXzJHYjoKQEAgLTM2NjMsNyArMzY3Nyw3IEBACiAJaW50IGksIHJldDsKIAlpbnQgYmxvY2s7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wcyA9IHsKLQkJLm1vZGUgPSBNVERfT09CX1BMQUNFLAorCQkubW9kZSA9IE1URF9PUFNfUExBQ0VfT09CLAogCQkub29ib2ZmcyA9IDAsCiAJCS5vb2JsZW4JPSBtdGQtPm9vYnNpemUsCiAJCS5kYXRidWYJPSBOVUxMLApAQCAtNDA1NCw2ICs0MDY4LDggQEAKIAkJCXRoaXMtPmVjY2xheW91dCA9ICZvbmVuYW5kX29vYl8xMjg7CiAJCQltdGQtPnN1YnBhZ2Vfc2Z0ID0gMjsKIAkJfQorCQlpZiAoT05FTkFORF9JU19OT1BfMSh0aGlzKSkKKwkJCW10ZC0+c3VicGFnZV9zZnQgPSAwOwogCQlicmVhazsKIAljYXNlIDY0OgogCQl0aGlzLT5lY2NsYXlvdXQgPSAmb25lbmFuZF9vb2JfNjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmJ0LmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmJ0LmMKaW5kZXggZmMyYzE2YS4uNjZmZTNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2JidC5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYnQuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoqCiAgKiBjaGVja19zaG9ydF9wYXR0ZXJuIC0gW0dFTkVSSUNdIGNoZWNrIGlmIGEgcGF0dGVybiBpcyBpbiB0aGUgYnVmZmVyCkBAIC04MCw3ICs4MSw3IEBACiAJc3RhcnRibG9jayA9IDA7CiAJZnJvbSA9IDA7CiAKLQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKIAlvcHMub29ibGVuID0gcmVhZGxlbjsKIAlvcHMub29iYnVmID0gYnVmOwogCW9wcy5sZW4gPSBvcHMub29ib2ZmcyA9IG9wcy5yZXRsZW4gPSBvcHMub29icmV0bGVuID0gMDsKQEAgLTE1Myw3ICsxNTQsNyBAQAogCWJsb2NrID0gKGludCkgKG9uZW5hbmRfYmxvY2sodGhpcywgb2ZmcykgPDwgMSk7CiAJcmVzID0gKGJibS0+YmJ0W2Jsb2NrID4+IDNdID4+IChibG9jayAmIDB4MDYpKSAmIDB4MDM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAib25lbmFuZF9pc2JhZF9iYnQ6IGJidCBpbmZvIGZvciBvZmZzIDB4JTA4eDogKGJsb2NrICVkKSAweCUwMnhcbiIsCisJcHJfZGVidWcoIm9uZW5hbmRfaXNiYWRfYmJ0OiBiYnQgaW5mbyBmb3Igb2ZmcyAweCUwOHg6IChibG9jayAlZCkgMHglMDJ4XG4iLAogCQkodW5zaWduZWQgaW50KSBvZmZzLCBibG9jayA+PiAxLCByZXMpOwogCiAJc3dpdGNoICgoaW50KSByZXMpIHsKQEAgLTE4OCwxMCArMTg5LDggQEAKIAlsZW4gPSB0aGlzLT5jaGlwc2l6ZSA+PiAodGhpcy0+ZXJhc2Vfc2hpZnQgKyAyKTsKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgKDJiaXQgcGVyIGJsb2NrKSBhbmQgY2xlYXIgdGhlIG1lbW9yeSBiYWQgYmxvY2sgdGFibGUgKi8KIAliYm0tPmJidCA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJibS0+YmJ0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib25lbmFuZF9zY2FuX2JidDogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFiYm0tPmJidCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogU2V0IHRoZSBiYWQgYmxvY2sgcG9zaXRpb24gKi8KIAliYm0tPmJhZGJsb2NrcG9zID0gT05FTkFORF9CQURCTE9DS19QT1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL3NhbXN1bmcuYyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvc2Ftc3VuZy5jCmluZGV4IDMzMDZiNWIuLjU0NzQ1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvc2Ftc3VuZy5jCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKmRtYV9yZXM7CiAJdW5zaWduZWQgbG9uZwlwaHlzX2Jhc2U7CiAJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGU7Ci0Jc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogfTsKIAogI2RlZmluZSBDTURfTUFQXzAwKGRldiwgYWRkcikJCShkZXYtPmNtZF9tYXAoTUFQXzAwLCAoKGFkZHIpIDw8IDEpKSkKQEAgLTE1Nyw4ICsxNTYsNiBAQAogCiBzdGF0aWMgc3RydWN0IHMzY19vbmVuYW5kICpvbmVuYW5kOwogCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCwgfTsKLQogc3RhdGljIGlubGluZSBpbnQgczNjX3JlYWRfcmVnKGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIHJlYWRsKG9uZW5hbmQtPmJhc2UgKyBvZmZzZXQpOwpAQCAtMTAxNywxMyArMTAxNCw5IEBACiAJaWYgKHMzY19yZWFkX3JlZyhNRU1fQ0ZHX09GRlNFVCkgJiBPTkVOQU5EX1NZU19DRkcxX1NZTkNfUkVBRCkKIAkJZGV2X2luZm8oJm9uZW5hbmQtPnBkZXYtPmRldiwgIk9uZU5BTkQgU3luYy4gQnVyc3QgUmVhZCBlbmFibGVkXG4iKTsKIAotCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsICZvbmVuYW5kLT5wYXJ0cywgMCk7Ci0JaWYgKGVyciA+IDApCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBvbmVuYW5kLT5wYXJ0cywgZXJyKTsKLQllbHNlIGlmIChlcnIgPD0gMCAmJiBwZGF0YSAmJiBwZGF0YS0+cGFydHMpCi0JCW10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7Ci0JZWxzZQotCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwgMCk7CisJZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5VTEwsIDAsCisJCQkJCXBkYXRhID8gcGRhdGEtPnBhcnRzIDogTlVMTCwKKwkJCQkJcGRhdGEgPyBwZGF0YS0+bnJfcGFydHMgOiAwKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG10ZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3JlZGJvb3QuYyBiL2RyaXZlcnMvbXRkL3JlZGJvb3QuYwppbmRleCA3YTg3ZDA3Li5lMzY2YjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9yZWRib290LmMKKysrIGIvZHJpdmVycy9tdGQvcmVkYm9vdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGZpc19pbWFnZV9kZXNjIHsKICAgICB1bnNpZ25lZCBjaGFyIG5hbWVbMTZdOyAgICAgIC8vIE51bGwgdGVybWluYXRlZCBuYW1lCkBAIC01Niw4ICs1Nyw4IEBACiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfcmVkYm9vdF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmaXNfb3JpZ2luKQorCQkJCSAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cywKKwkJCQkgICAgc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhICpkYXRhKQogewogCWludCBucnBhcnRzID0gMDsKIAlzdHJ1Y3QgZmlzX2ltYWdlX2Rlc2MgKmJ1ZjsKQEAgLTE5NywxMSArMTk4LDEwIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQluZXdfZmwtPmltZyA9ICZidWZbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGZpc19vcmlnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXS5mbGFzaF9iYXNlIC09IGZpc19vcmlnaW47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXS5mbGFzaF9iYXNlICY9IG1hc3Rlci0+c2l6ZS0xOwotICAgICAgICAgICAgICAgIH0KKwkJaWYgKGRhdGEgJiYgZGF0YS0+b3JpZ2luKQorCQkJYnVmW2ldLmZsYXNoX2Jhc2UgLT0gZGF0YS0+b3JpZ2luOworCQllbHNlCisJCQlidWZbaV0uZmxhc2hfYmFzZSAmPSBtYXN0ZXItPnNpemUtMTsKIAogCQkvKiBJJ20gc3VyZSB0aGUgSkZGUzIgY29kZSBoYXMgZG9uZSBtZSBwZXJtYW5lbnQgZGFtYWdlLgogCQkgKiBJIG5vdyB0aGluayB0aGUgZm9sbG93aW5nIGlzIF9ub3JtYWxfCkBAIC0yOTcsNiArMjk3LDkgQEAKIAkubmFtZSA9ICJSZWRCb290IiwKIH07CiAKKy8qIG10ZCBwYXJzZXJzIHdpbGwgcmVxdWVzdCB0aGUgbW9kdWxlIGJ5IHBhcnNlciBuYW1lICovCitNT0RVTEVfQUxJQVMoIlJlZEJvb3QiKTsKKwogc3RhdGljIGludCBfX2luaXQgcmVkYm9vdF9wYXJzZXJfaW5pdCh2b2lkKQogewogCXJldHVybiByZWdpc3Rlcl9tdGRfcGFyc2VyKCZyZWRib290X3BhcnNlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMgYi9kcml2ZXJzL210ZC9yZmRfZnRsLmMKaW5kZXggY2M0ZDE4MC4uNzNhZTIxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCisrKyBiL2RyaXZlcnMvbXRkL3JmZF9mdGwuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NtX2Z0bC5jIGIvZHJpdmVycy9tdGQvc21fZnRsLmMKaW5kZXggZWQzZDZjZC4uZmRkYjcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvc21fZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvc21fZnRsLmMKQEAgLTM0LDcgKzM0LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC0yKSIpOwogCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gc3lzZnMgYXR0cmlidXR0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBzeXNmcyBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0cnVjdCBzbV9zeXNmc19hdHRyaWJ1dGUgewogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwogCWNoYXIgKmRhdGE7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAlpZiAoKGxiYVswXSAmIDB4RjgpICE9IDB4MTApCiAJCXJldHVybiAtMjsKIAotCS8qIGNoZWNrIHBhcml0eSAtIGVuZGlhbmVzcyBkb2Vzbid0IG1hdHRlciAqLworCS8qIGNoZWNrIHBhcml0eSAtIGVuZGlhbm5lc3MgZG9lc24ndCBtYXR0ZXIgKi8KIAlpZiAoaHdlaWdodDE2KCoodWludDE2X3QgKilsYmEpICYgMSkKIAkJcmV0dXJuIC0yOwogCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCiAvKgotICogUmVhZCBMQkEgYXNzY29jaWF0ZWQgd2l0aCBibG9jaworICogUmVhZCBMQkEgYXNzb2NpYXRlZCB3aXRoIGJsb2NrCiAgKiByZXR1cm5zIC0xLCBpZiBibG9jayBpcyBlcmFzZWQKICAqIHJldHVybnMgLTIgaWYgZXJyb3IgaGFwcGVucwogICovCkBAIC0yNTIsMTEgKzI1MiwxMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBVc2VyIG1pZ2h0IG5vdCBuZWVkIHRoZSBvb2IsIGJ1dCB3ZSBkbyBmb3IgZGF0YSB2ZXJ0aWZpY2F0aW9uICovCisJLyogVXNlciBtaWdodCBub3QgbmVlZCB0aGUgb29iLCBidXQgd2UgZG8gZm9yIGRhdGEgdmVyaWZpY2F0aW9uICovCiAJaWYgKCFvb2IpCiAJCW9vYiA9ICZ0bXBfb29iOwogCi0Jb3BzLm1vZGUgPSBmdGwtPnNtYWxscGFnZW5hbmQgPyBNVERfT09CX1JBVyA6IE1URF9PT0JfUExBQ0U7CisJb3BzLm1vZGUgPSBmdGwtPnNtYWxscGFnZW5hbmQgPyBNVERfT1BTX1JBVyA6IE1URF9PUFNfUExBQ0VfT09COwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29ibGVuID0gU01fT09CX1NJWkU7CiAJb3BzLm9vYmJ1ZiA9ICh2b2lkICopb29iOwpAQCAtMjc2LDEyICsyNzYsMTIgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JLyogVW5mb3J0dW5lbGx5LCBvb2IgcmVhZCB3aWxsIF9hbHdheXNfIHN1Y2NlZWQsCisJLyogVW5mb3J0dW5hdGVseSwgb29iIHJlYWQgd2lsbCBfYWx3YXlzXyBzdWNjZWVkLAogCQlkZXNwaXRlIGNhcmQgcmVtb3ZhbC4uLi4uICovCiAJcmV0ID0gbXRkLT5yZWFkX29vYihtdGQsIHNtX21rb2Zmc2V0KGZ0bCwgem9uZSwgYmxvY2ssIGJvZmZzZXQpLCAmb3BzKTsKIAogCS8qIFRlc3QgZm9yIHVua25vd24gZXJyb3JzICovCi0JaWYgKHJldCAhPSAwICYmIHJldCAhPSAtRVVDTEVBTiAmJiByZXQgIT0gLUVCQURNU0cpIHsKKwlpZiAocmV0ICE9IDAgJiYgIW10ZF9pc19iaXRmbGlwX29yX2VjY2VycihyZXQpKSB7CiAJCWRiZygicmVhZCBvZiBibG9jayAlZCBhdCB6b25lICVkLCBmYWlsZWQgZHVlIHRvIGVycm9yICglZCkiLAogCQkJYmxvY2ssIHpvbmUsIHJldCk7CiAJCWdvdG8gYWdhaW47CkBAIC0zMDYsNyArMzA2LDcgQEAKIAl9CiAKIAkvKiBUZXN0IEVDQyovCi0JaWYgKHJldCA9PSAtRUJBRE1TRyB8fAorCWlmIChtdGRfaXNfZWNjZXJyKHJldCkgfHwKIAkJKGZ0bC0+c21hbGxwYWdlbmFuZCAmJiBzbV9jb3JyZWN0X3NlY3RvcihidWZmZXIsIG9vYikpKSB7CiAKIAkJZGJnKCJyZWFkIG9mIGJsb2NrICVkIGF0IHpvbmUgJWQsIGZhaWxlZCBkdWUgdG8gRUNDIGVycm9yIiwKQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmIChmdGwtPnVuc3RhYmxlKQogCQlyZXR1cm4gLUVJTzsKIAotCW9wcy5tb2RlID0gZnRsLT5zbWFsbHBhZ2VuYW5kID8gTVREX09PQl9SQVcgOiBNVERfT09CX1BMQUNFOworCW9wcy5tb2RlID0gZnRsLT5zbWFsbHBhZ2VuYW5kID8gTVREX09QU19SQVcgOiBNVERfT1BTX1BMQUNFX09PQjsKIAlvcHMubGVuID0gU01fU0VDVE9SX1NJWkU7CiAJb3BzLmRhdGJ1ZiA9IGJ1ZmZlcjsKIAlvcHMub29ib2ZmcyA9IDA7CkBAIC00NDcsMTQgKzQ0NywxNCBAQAogCiAJLyogV2UgYXJlbid0IGNoZWNraW5nIHRoZSByZXR1cm4gdmFsdWUsIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSAqLwogCS8qIFRoaXMgYWxzbyBmYWlscyBvbiBmYWtlIHhEIGNhcmRzLCBidXQgSSBndWVzcyB0aGVzZSB3b24ndCBleHBvc2UKLQkJYW55IGJhZCBibG9ja3MgdGlsbCBmYWlsIGNvbXBsZXRseSAqLworCQlhbnkgYmFkIGJsb2NrcyB0aWxsIGZhaWwgY29tcGxldGVseSAqLwogCWZvciAoYm9mZnNldCA9IDA7IGJvZmZzZXQgPCBmdGwtPmJsb2NrX3NpemU7IGJvZmZzZXQgKz0gU01fU0VDVE9SX1NJWkUpCiAJCXNtX3dyaXRlX3NlY3RvcihmdGwsIHpvbmUsIGJsb2NrLCBib2Zmc2V0LCBOVUxMLCAmb29iKTsKIH0KIAogLyoKICAqIEVyYXNlIGEgYmxvY2sgd2l0aGluIGEgem9uZQotICogSWYgZXJhc2Ugc3VjY2VkZXMsIGl0IHVwZGF0ZXMgZnJlZSBibG9jayBmaWZvLCBvdGhlcndpc2UgbWFya3MgYmxvY2sgYXMgYmFkCisgKiBJZiBlcmFzZSBzdWNjZWVkcywgaXQgdXBkYXRlcyBmcmVlIGJsb2NrIGZpZm8sIG90aGVyd2lzZSBtYXJrcyBibG9jayBhcyBiYWQKICAqLwogc3RhdGljIGludCBzbV9lcmFzZV9ibG9jayhzdHJ1Y3Qgc21fZnRsICpmdGwsIGludCB6b25lX251bSwgdWludDE2X3QgYmxvY2ssCiAJCQkgIGludCBwdXRfZnJlZSkKQEAgLTUxMCw3ICs1MTAsNyBAQAogCWNvbXBsZXRlKCZmdGwtPmVyYXNlX2NvbXBsZXRpb24pOwogfQogCi0vKiBUaHJvdWdodGx5IHRlc3QgdGhhdCBibG9jayBpcyB2YWxpZC4gKi8KKy8qIFRob3JvdWdobHkgdGVzdCB0aGF0IGJsb2NrIGlzIHZhbGlkLiAqLwogc3RhdGljIGludCBzbV9jaGVja19ibG9jayhzdHJ1Y3Qgc21fZnRsICpmdGwsIGludCB6b25lLCBpbnQgYmxvY2spCiB7CiAJaW50IGJvZmZzZXQ7CkBAIC01MjYsNyArNTI2LDcgQEAKIAlmb3IgKGJvZmZzZXQgPSAwOyBib2Zmc2V0IDwgZnRsLT5ibG9ja19zaXplOwogCQkJCQlib2Zmc2V0ICs9IFNNX1NFQ1RPUl9TSVpFKSB7CiAKLQkJLyogVGhpcyBzaG91ZG4ndCBoYXBwZW4gYW55d2F5ICovCisJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBhbnl3YXkgKi8KIAkJaWYgKHNtX3JlYWRfc2VjdG9yKGZ0bCwgem9uZSwgYmxvY2ssIGJvZmZzZXQsIE5VTEwsICZvb2IpKQogCQkJcmV0dXJuIC0yOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9zc2ZkYy5jIGIvZHJpdmVycy9tdGQvc3NmZGMuYwppbmRleCA1Y2QxODk3Li45NzZlM2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9zc2ZkYy5jCisrKyBiL2RyaXZlcnMvbXRkL3NzZmRjLmMKQEAgLTEzNSw4ICsxMzUsNyBAQAogCQkJCS8qIEZvdW5kICovCiAJCQkJY2lzX3NlY3RvciA9IChpbnQpKG9mZnNldCA+PiBTRUNUT1JfU0hJRlQpOwogCQkJfSBlbHNlIHsKLQkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLAotCQkJCQkiU1NGRENfUk86IENJUy9JREkgc2VjdG9yIG5vdCBmb3VuZCIKKwkJCQlwcl9kZWJ1ZygiU1NGRENfUk86IENJUy9JREkgc2VjdG9yIG5vdCBmb3VuZCIKIAkJCQkJIiBvbiAlcyAobXRkJWQpXG4iLCBtdGQtPm5hbWUsCiAJCQkJCW10ZC0+aW5kZXgpOwogCQkJfQpAQCAtMTcwLDcgKzE2OSw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmV0OwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX1JBVzsKKwlvcHMubW9kZSA9IE1URF9PUFNfUkFXOwogCW9wcy5vb2JvZmZzID0gMDsKIAlvcHMub29ibGVuID0gT09CX1NJWkU7CiAJb3BzLm9vYmJ1ZiA9IGJ1ZjsKQEAgLTIyMSw4ICsyMjAsNyBAQAogCQkJYmxvY2tfYWRkcmVzcyA+Pj0gMTsKIAogCQkJaWYgKGdldF9wYXJpdHkoYmxvY2tfYWRkcmVzcywgMTApICE9IHBhcml0eSkgewotCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsCi0JCQkJCSJTU0ZEQ19STzogbG9naWNhbCBhZGRyZXNzIGZpZWxkJWQiCisJCQkJcHJfZGVidWcoIlNTRkRDX1JPOiBsb2dpY2FsIGFkZHJlc3MgZmllbGQlZCIKIAkJCQkJInBhcml0eSBlcnJvcigweCUwNFgpXG4iLCBqKzEsCiAJCQkJCWJsb2NrX2FkZHJlc3MpOwogCQkJfSBlbHNlIHsKQEAgLTIzNSw3ICsyMzMsNyBAQAogCWlmICghb2spCiAJCWJsb2NrX2FkZHJlc3MgPSAtMjsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJTU0ZEQ19STzogZ2V0X2xvZ2ljYWxfYWRkcmVzcygpICVkXG4iLAorCXByX2RlYnVnKCJTU0ZEQ19STzogZ2V0X2xvZ2ljYWxfYWRkcmVzcygpICVkXG4iLAogCQlibG9ja19hZGRyZXNzKTsKIAogCXJldHVybiBibG9ja19hZGRyZXNzOwpAQCAtMjQ5LDcgKzI0Nyw3IEBACiAJaW50IHJldCwgYmxvY2tfYWRkcmVzcywgcGh5c19ibG9jazsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IHNzZmRjLT5tYmQubXRkOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlNTRkRDX1JPOiBidWlsZF9ibG9ja19tYXAoKSBuYmxrcz0lZCAoJWx1SylcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiBidWlsZF9ibG9ja19tYXAoKSBuYmxrcz0lZCAoJWx1SylcbiIsCiAJICAgICAgc3NmZGMtPm1hcF9sZW4sCiAJICAgICAgKHVuc2lnbmVkIGxvbmcpc3NmZGMtPm1hcF9sZW4gKiBzc2ZkYy0+ZXJhc2Vfc2l6ZSAvIDEwMjQpOwogCkBAIC0yNjIsOCArMjYwLDcgQEAKIAogCQlyZXQgPSByZWFkX3Jhd19vb2IobXRkLCBvZmZzZXQsIG9vYl9idWYpOwogCQlpZiAocmV0IDwgMCkgewotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwKLQkJCQkiU1NGRENfUk86IG10ZCByZWFkX29vYigpIGZhaWxlZCBhdCAlbHVcbiIsCisJCQlwcl9kZWJ1ZygiU1NGRENfUk86IG10ZCByZWFkX29vYigpIGZhaWxlZCBhdCAlbHVcbiIsCiAJCQkJb2Zmc2V0KTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMjc5LDggKzI3Niw3IEBACiAJCQlzc2ZkYy0+bG9naWNfYmxvY2tfbWFwW2Jsb2NrX2FkZHJlc3NdID0KIAkJCQkodW5zaWduZWQgc2hvcnQpcGh5c19ibG9jazsKIAotCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwKLQkJCQkiU1NGRENfUk86IGJ1aWxkX2Jsb2NrX21hcCgpIHBoeXNfYmxvY2s9JWQsIgorCQkJcHJfZGVidWcoIlNTRkRDX1JPOiBidWlsZF9ibG9ja19tYXAoKSBwaHlzX2Jsb2NrPSVkLCIKIAkJCQkibG9naWNfYmxvY2tfYWRkcj0lZCwgem9uZT0lZFxuIiwKIAkJCQlwaHlzX2Jsb2NrLCBibG9ja19hZGRyZXNzLCB6b25lX2luZGV4KTsKIAkJfQpAQCAtMzA0LDExICszMDAsOCBAQAogCQlyZXR1cm47CiAKIAlzc2ZkYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzc2ZkY3JfcmVjb3JkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc2ZkYykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiU1NGRENfUk86IG91dCBvZiBtZW1vcnkgZm9yIGRhdGEgc3RydWN0dXJlc1xuIik7CisJaWYgKCFzc2ZkYykKIAkJcmV0dXJuOwotCX0KIAogCXNzZmRjLT5tYmQubXRkID0gbXRkOwogCXNzZmRjLT5tYmQuZGV2bnVtID0gLTE7CkBAIC0zMTksOCArMzEyLDcgQEAKIAlzc2ZkYy0+ZXJhc2Vfc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOwogCXNzZmRjLT5tYXBfbGVuID0gKHUzMiltdGQtPnNpemUgLyBtdGQtPmVyYXNlc2l6ZTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCi0JCSJTU0ZEQ19STzogY2lzX2Jsb2NrPSVkLGVyYXNlX3NpemU9JWQsbWFwX2xlbj0lZCxuX3pvbmVzPSVkXG4iLAorCXByX2RlYnVnKCJTU0ZEQ19STzogY2lzX2Jsb2NrPSVkLGVyYXNlX3NpemU9JWQsbWFwX2xlbj0lZCxuX3pvbmVzPSVkXG4iLAogCQlzc2ZkYy0+Y2lzX2Jsb2NrLCBzc2ZkYy0+ZXJhc2Vfc2l6ZSwgc3NmZGMtPm1hcF9sZW4sCiAJCURJVl9ST1VORF9VUChzc2ZkYy0+bWFwX2xlbiwgTUFYX1BIWVNfQkxLX1BFUl9aT05FKSk7CiAKQEAgLTMzMSw3ICszMjMsNyBAQAogCXNzZmRjLT5jeWxpbmRlcnMgPSAodW5zaWduZWQgc2hvcnQpKCgodTMyKW10ZC0+c2l6ZSA+PiBTRUNUT1JfU0hJRlQpIC8KIAkJCSgobG9uZylzc2ZkYy0+c2VjdG9ycyAqIChsb25nKXNzZmRjLT5oZWFkcykpOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlNTRkRDX1JPOiB1c2luZyBDOiVkIEg6JWQgUzolZCA9PSAlbGQgc2VjdHNcbiIsCisJcHJfZGVidWcoIlNTRkRDX1JPOiB1c2luZyBDOiVkIEg6JWQgUzolZCA9PSAlbGQgc2VjdHNcbiIsCiAJCXNzZmRjLT5jeWxpbmRlcnMsIHNzZmRjLT5oZWFkcyAsIHNzZmRjLT5zZWN0b3JzLAogCQkobG9uZylzc2ZkYy0+Y3lsaW5kZXJzICogKGxvbmcpc3NmZGMtPmhlYWRzICoKIAkJKGxvbmcpc3NmZGMtPnNlY3RvcnMpOwpAQCAtMzQyLDExICszMzQsOCBAQAogCS8qIEFsbG9jYXRlIGxvZ2ljYWwgYmxvY2sgbWFwICovCiAJc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcCA9IGttYWxsb2Moc2l6ZW9mKHNzZmRjLT5sb2dpY19ibG9ja19tYXBbMF0pICoKIAkJCQkJIHNzZmRjLT5tYXBfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNzZmRjLT5sb2dpY19ibG9ja19tYXApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJIlNTRkRDX1JPOiBvdXQgb2YgbWVtb3J5IGZvciBkYXRhIHN0cnVjdHVyZXNcbiIpOworCWlmICghc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcCkKIAkJZ290byBvdXRfZXJyOwotCX0KIAltZW1zZXQoc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcCwgMHhmZiwgc2l6ZW9mKHNzZmRjLT5sb2dpY19ibG9ja19tYXBbMF0pICoKIAkJc3NmZGMtPm1hcF9sZW4pOwogCkBAIC0zNzEsNyArMzYwLDcgQEAKIHsKIAlzdHJ1Y3Qgc3NmZGNyX3JlY29yZCAqc3NmZGMgPSAoc3RydWN0IHNzZmRjcl9yZWNvcmQgKilkZXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiU1NGRENfUk86IHJlbW92ZV9kZXYgKGk9JWQpXG4iLCBkZXYtPmRldm51bSk7CisJcHJfZGVidWcoIlNTRkRDX1JPOiByZW1vdmVfZGV2IChpPSVkKVxuIiwgZGV2LT5kZXZudW0pOwogCiAJZGVsX210ZF9ibGt0cmFuc19kZXYoZGV2KTsKIAlrZnJlZShzc2ZkYy0+bG9naWNfYmxvY2tfbWFwKTsKQEAgLTM4Nyw4ICszNzYsNyBAQAogCW9mZnNldCA9IChpbnQpKGxvZ2ljX3NlY3Rfbm8gJSBzZWN0b3JzX3Blcl9ibG9jayk7CiAJYmxvY2tfYWRkcmVzcyA9IChpbnQpKGxvZ2ljX3NlY3Rfbm8gLyBzZWN0b3JzX3Blcl9ibG9jayk7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLAotCQkiU1NGRENfUk86IHNzZmRjcl9yZWFkc2VjdCglbHUpIHNlY19wZXJfYmxrPSVkLCBvZnN0PSVkLCIKKwlwcl9kZWJ1ZygiU1NGRENfUk86IHNzZmRjcl9yZWFkc2VjdCglbHUpIHNlY19wZXJfYmxrPSVkLCBvZnN0PSVkLCIKIAkJIiBibG9ja19hZGRyPSVkXG4iLCBsb2dpY19zZWN0X25vLCBzZWN0b3JzX3Blcl9ibG9jaywgb2Zmc2V0LAogCQlibG9ja19hZGRyZXNzKTsKIApAQCAtMzk3LDggKzM4NSw3IEBACiAKIAlibG9ja19hZGRyZXNzID0gc3NmZGMtPmxvZ2ljX2Jsb2NrX21hcFtibG9ja19hZGRyZXNzXTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JCSJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCkgcGh5c19ibG9ja19hZGRyPSVkXG4iLAorCXByX2RlYnVnKCJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCkgcGh5c19ibG9ja19hZGRyPSVkXG4iLAogCQlibG9ja19hZGRyZXNzKTsKIAogCWlmIChibG9ja19hZGRyZXNzIDwgMHhmZmZmKSB7CkBAIC00MDcsOCArMzk0LDcgQEAKIAkJc2VjdF9ubyA9ICh1bnNpZ25lZCBsb25nKWJsb2NrX2FkZHJlc3MgKiBzZWN0b3JzX3Blcl9ibG9jayArCiAJCQkJb2Zmc2V0OwogCi0JCURFQlVHKE1URF9ERUJVR19MRVZFTDMsCi0JCQkiU1NGRENfUk86IHNzZmRjcl9yZWFkc2VjdCgpIHBoeXNfc2VjdF9ubz0lbHVcbiIsCisJCXByX2RlYnVnKCJTU0ZEQ19STzogc3NmZGNyX3JlYWRzZWN0KCkgcGh5c19zZWN0X25vPSVsdVxuIiwKIAkJCXNlY3Rfbm8pOwogCiAJCWlmIChyZWFkX3BoeXNpY2FsX3NlY3Rvcihzc2ZkYy0+bWJkLm10ZCwgYnVmLCBzZWN0X25vKSA8IDApCkBAIC00MjQsNyArNDEwLDcgQEAKIHsKIAlzdHJ1Y3Qgc3NmZGNyX3JlY29yZCAqc3NmZGMgPSAoc3RydWN0IHNzZmRjcl9yZWNvcmQgKilkZXY7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiU1NGRENfUk86IHNzZmRjcl9nZXRnZW8oKSBDPSVkLCBIPSVkLCBTPSVkXG4iLAorCXByX2RlYnVnKCJTU0ZEQ19STzogc3NmZGNyX2dldGdlbygpIEM9JWQsIEg9JWQsIFM9JWRcbiIsCiAJCQlzc2ZkYy0+Y3lsaW5kZXJzLCBzc2ZkYy0+aGVhZHMsIHNzZmRjLT5zZWN0b3JzKTsKIAogCWdlby0+aGVhZHMgPSBzc2ZkYy0+aGVhZHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfb29idGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX29vYnRlc3QuYwppbmRleCBkZWM5MmFlLi45MzNmN2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfb29idGVzdC5jCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9vb2J0ZXN0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX29vYnRlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMTMxLDcgKzEzMSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcGdjbnQ7ICsraSwgYWRkciArPSBtdGQtPndyaXRlc2l6ZSkgewogCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHVzZV9sZW4pOwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gdXNlX2xlbjsKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IHBnY250OyArK2ksIGFkZHIgKz0gbXRkLT53cml0ZXNpemUpIHsKIAkJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCB1c2VfbGVuKTsKLQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5sZW4gICAgICAgPSAwOwogCQlvcHMucmV0bGVuICAgID0gMDsKIAkJb3BzLm9vYmxlbiAgICA9IHVzZV9sZW47CkBAIC0yMTEsNyArMjExLDcgQEAKIAkJaWYgKHVzZV9vZmZzZXQgIT0gMCB8fCB1c2VfbGVuIDwgbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsKSB7CiAJCQlpbnQgazsKIAotCQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCQkJb3BzLmxlbiAgICAgICA9IDA7CiAJCQlvcHMucmV0bGVuICAgID0gMDsKIAkJCW9wcy5vb2JsZW4gICAgPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAlzaXplX3QgbGVuID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICogcGdjbnQ7CiAKIAlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIGxlbik7Ci0Jb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMubGVuICAgICAgID0gMDsKIAlvcHMucmV0bGVuICAgID0gMDsKIAlvcHMub29ibGVuICAgID0gbGVuOwpAQCAtMzY2LDYgKzM2NiwxMyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCWlmIChkZXYgPCAwKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG10ZC1kZXZpY2UgdmlhIG1vZHVsZSBwYXJhbXRlclxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgIkNBUkVGVUw6IFRoaXMgdGVzdCB3aXBlcyBhbGwgZGF0YSBvbiB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOwogCiAJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKQEAgLTUwNyw3ICs1MTQsNyBAQAogCQlhZGRyMCArPSBtdGQtPmVyYXNlc2l6ZTsKIAogCS8qIEF0dGVtcHQgdG8gd3JpdGUgb2ZmIGVuZCBvZiBPT0IgKi8KLQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX0FVVE9fT09COwogCW9wcy5sZW4gICAgICAgPSAwOwogCW9wcy5yZXRsZW4gICAgPSAwOwogCW9wcy5vb2JsZW4gICAgPSAxOwpAQCAtNTI3LDcgKzUzNCw3IEBACiAJfQogCiAJLyogQXR0ZW1wdCB0byByZWFkIG9mZiBlbmQgb2YgT09CICovCi0Jb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMubGVuICAgICAgID0gMDsKIAlvcHMucmV0bGVuICAgID0gMDsKIAlvcHMub29ibGVuICAgID0gMTsKQEAgLTU1MSw3ICs1NTgsNyBAQAogCQkgICAgICAgImJsb2NrIGlzIGJhZFxuIik7CiAJZWxzZSB7CiAJCS8qIEF0dGVtcHQgdG8gd3JpdGUgb2ZmIGVuZCBvZiBkZXZpY2UgKi8KLQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5sZW4gICAgICAgPSAwOwogCQlvcHMucmV0bGVuICAgID0gMDsKIAkJb3BzLm9vYmxlbiAgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbCArIDE7CkBAIC01NzEsNyArNTc4LDcgQEAKIAkJfQogCiAJCS8qIEF0dGVtcHQgdG8gcmVhZCBvZmYgZW5kIG9mIGRldmljZSAqLwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICsgMTsKQEAgLTU5NSw3ICs2MDIsNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJLyogQXR0ZW1wdCB0byB3cml0ZSBvZmYgZW5kIG9mIGRldmljZSAqLwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOwpAQCAtNjE1LDcgKzYyMiw3IEBACiAJCX0KIAogCQkvKiBBdHRlbXB0IHRvIHJlYWQgb2ZmIGVuZCBvZiBkZXZpY2UgKi8KLQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5sZW4gICAgICAgPSAwOwogCQlvcHMucmV0bGVuICAgID0gMDsKIAkJb3BzLm9vYmxlbiAgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKQEAgLTY1NSw3ICs2NjIsNyBAQAogCQlhZGRyID0gKGkgKyAxKSAqIG10ZC0+ZXJhc2VzaXplIC0gbXRkLT53cml0ZXNpemU7CiAJCWZvciAocGcgPSAwOyBwZyA8IGNudDsgKytwZykgewogCQkJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBzeik7Ci0JCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PUFNfQVVUT19PT0I7CiAJCQlvcHMubGVuICAgICAgID0gMDsKIAkJCW9wcy5yZXRsZW4gICAgPSAwOwogCQkJb3BzLm9vYmxlbiAgICA9IHN6OwpAQCAtNjgzLDcgKzY5MCw3IEBACiAJCQljb250aW51ZTsKIAkJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwgKiAyKTsKIAkJYWRkciA9IChpICsgMSkgKiBtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXplOwotCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSAgICAgID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmxlbiAgICAgICA9IDA7CiAJCW9wcy5yZXRsZW4gICAgPSAwOwogCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICogMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9wYWdldGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3BhZ2V0ZXN0LmMKaW5kZXggMDBiOTM3ZS4uYWZhZmI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3BhZ2V0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3BhZ2V0ZXN0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3BhZ2V0ZXN0OiAiCiAKLXN0YXRpYyBpbnQgZGV2Oworc3RhdGljIGludCBkZXYgPSAtRUlOVkFMOwogbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCWZvciAoaiA9IDA7IGogPCBwZ2NudCAtIDE7ICsraiwgYWRkciArPSBwZ3NpemUpIHsKIAkJLyogRG8gYSByZWFkIHRvIHNldCB0aGUgaW50ZXJuYWwgZGF0YVJBTXMgdG8gZGlmZmVyZW50IGRhdGEgKi8KIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcjAsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IGJ1ZnNpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcm4gLSBidWZzaXplLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCW1lbXNldCh0d29wYWdlcywgMCwgYnVmc2l6ZSk7CiAJCXJlYWQgPSAwOwogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMTY0LDcgKzE2NCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgb2xkbmV4dCA9IG5leHQ7CiAJCS8qIERvIGEgcmVhZCB0byBzZXQgdGhlIGludGVybmFsIGRhdGFSQU1zIHRvIGRpZmZlcmVudCBkYXRhICovCiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMTcyLDcgKzE3Miw3IEBACiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHJuIC0gYnVmc2l6ZSwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKLQkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCQllcnIgPSAwOwogCQlpZiAoZXJyIHx8IHJlYWQgIT0gYnVmc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTE4Miw3ICsxODIsNyBAQAogCQltZW1zZXQodHdvcGFnZXMsIDAsIGJ1ZnNpemUpOwogCQlyZWFkID0gMDsKIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKLQkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCQllcnIgPSAwOwogCQlpZiAoZXJyIHx8IHJlYWQgIT0gYnVmc2l6ZSkgewogCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTIzMSw3ICsyMzEsNyBAQAogCXJlYWQgPSAwOwogCWFkZHIgPSBhZGRybiAtIHBnc2l6ZSAtIHBnc2l6ZTsKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDEpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMjQ0LDcgKzI0NCw3IEBACiAJcmVhZCA9IDA7CiAJYWRkciA9IGFkZHJuIC0gcGdzaXplIC0gcGdzaXplIC0gcGdzaXplOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIHBwMSk7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0yNTgsNyArMjU4LDcgQEAKIAlhZGRyID0gYWRkcjA7CiAJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgcGFnZSBhdCAlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDIpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMjcyLDcgKzI3Miw3IEBACiAJYWRkciA9IGFkZHJuIC0gcGdzaXplOwogCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIHBhZ2UgYXQgJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgcHAzKTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTI4Niw3ICsyODYsNyBAQAogCWFkZHIgPSBhZGRyMDsKIAlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyBwYWdlIGF0ICUjbGx4XG4iLCAobG9uZyBsb25nKWFkZHIpOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIHBwNCk7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOwogCW1lbXNldChyZWFkYnVmLCAwLCBwZ3NpemUpOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBwZ3NpemUsICZyZWFkLCByZWFkYnVmKTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKQEAgLTM4Myw3ICszODMsNyBAQAogCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIDFzdCBwYWdlIG9mIGJsb2NrICVkXG4iLCBlYm51bSk7CiAJbWVtc2V0KHJlYWRidWYsIDAsIHBnc2l6ZSk7CiAJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkcjAsIHBnc2l6ZSwgJnJlYWQsIHJlYWRidWYpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCWVyciA9IDA7CiAJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtNDM5LDcgKzQzOSw3IEBACiAKIAlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBwZ3NpemUsICZyZWFkLCB0d29wYWdlcyk7Ci0JaWYgKGVyciA9PSAtRVVDTEVBTikKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJZXJyID0gMDsKIAlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC01MDQsNiArNTA0LDEzIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3JlYWR0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcmVhZHRlc3QuYwppbmRleCBhZmU3MWFhLi41NTBmZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcmVhZHRlc3QuYworKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcmVhZHRlc3QuYwpAQCAtMjksNyArMjksNyBAQAogCiAjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfcmVhZHRlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtNjYsNyArNjYsNyBAQAogCQlpZiAobXRkLT5vb2JzaXplKSB7CiAJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCi0JCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9QTEFDRTsKKwkJCW9wcy5tb2RlICAgICAgPSBNVERfT1BTX1BMQUNFX09PQjsKIAkJCW9wcy5sZW4gICAgICAgPSAwOwogCQkJb3BzLnJldGxlbiAgICA9IDA7CiAJCQlvcHMub29ibGVuICAgID0gbXRkLT5vb2JzaXplOwpAQCAtNzUsNyArNzUsOCBAQAogCQkJb3BzLmRhdGJ1ZiAgICA9IE5VTEw7CiAJCQlvcHMub29iYnVmICAgID0gb29iYnVmOwogCQkJcmV0ID0gbXRkLT5yZWFkX29vYihtdGQsIGFkZHIsICZvcHMpOwotCQkJaWYgKHJldCB8fCBvcHMub29icmV0bGVuICE9IG10ZC0+b29ic2l6ZSkgeworCQkJaWYgKChyZXQgJiYgIW10ZF9pc19iaXRmbGlwKHJldCkpIHx8CisJCQkJCW9wcy5vb2JyZXRsZW4gIT0gbXRkLT5vb2JzaXplKSB7CiAJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIG9vYiBmYWlsZWQgYXQgIgogCQkJCQkJICAiJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CiAJCQkJaWYgKCFlcnIpCkBAIC0xNjksNiArMTcwLDEyIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOwogCiAJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zcGVlZHRlc3QuYyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zcGVlZHRlc3QuYwppbmRleCA2MjdkNGUyLi40OTNiMzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3BlZWR0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3NwZWVkdGVzdC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgUFJJTlRfUFJFRiBLRVJOX0lORk8gIm10ZF9zcGVlZHRlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMjE2LDcgKzIxNiw3IEBACiAKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBtdGQtPmVyYXNlc2l6ZSwgJnJlYWQsIGlvYnVmKTsKIAkvKiBJZ25vcmUgY29ycmVjdGVkIEVDQyBlcnJvcnMgKi8KLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmIChlcnIgfHwgcmVhZCAhPSBtdGQtPmVyYXNlc2l6ZSkgewogCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLCBhZGRyKTsKQEAgLTIzNyw3ICsyMzcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBwZ2NudDsgaSsrKSB7CiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIGJ1Zik7CiAJCS8qIElnbm9yZSBjb3JyZWN0ZWQgRUNDIGVycm9ycyAqLwotCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkKIAkJCWVyciA9IDA7CiAJCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCkBAIC0yNjMsNyArMjYzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHN6LCAmcmVhZCwgYnVmKTsKIAkJLyogSWdub3JlIGNvcnJlY3RlZCBFQ0MgZXJyb3JzICovCi0JCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQkJZXJyID0gMDsKIAkJaWYgKGVyciB8fCByZWFkICE9IHN6KSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMjc4LDcgKzI3OCw3IEBACiAJaWYgKHBnY250ICUgMikgewogCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBidWYpOwogCQkvKiBJZ25vcmUgY29ycmVjdGVkIEVDQyBlcnJvcnMgKi8KLQkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCQllcnIgPSAwOwogCQlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CiAJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLApAQCAtMzYxLDYgKzM2MSwxMyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCWlmIChkZXYgPCAwKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG10ZC1kZXZpY2UgdmlhIG1vZHVsZSBwYXJhbXRlclxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgIkNBUkVGVUw6IFRoaXMgdGVzdCB3aXBlcyBhbGwgZGF0YSBvbiB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKGNvdW50KQogCQlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWQgICAgY291bnQ6ICVkXG4iLCBkZXYsIGNvdW50KTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3RyZXNzdGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N0cmVzc3Rlc3QuYwppbmRleCA1MzE2MjVmLi41MmZmZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3RyZXNzdGVzdC5jCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zdHJlc3N0ZXN0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3N0cmVzc3Rlc3Q6ICIKIAotc3RhdGljIGludCBkZXY7CitzdGF0aWMgaW50IGRldiA9IC1FSU5WQUw7CiBtb2R1bGVfcGFyYW0oZGV2LCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkZXYsICJNVEQgZGV2aWNlIG51bWJlciB0byB1c2UiKTsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAJfQogCWFkZHIgPSBlYiAqIG10ZC0+ZXJhc2VzaXplICsgb2ZmczsKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBsZW4sICZyZWFkLCByZWFkYnVmKTsKLQlpZiAoZXJyID09IC1FVUNMRUFOKQorCWlmIChtdGRfaXNfYml0ZmxpcChlcnIpKQogCQllcnIgPSAwOwogCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBsZW4pKSB7CiAJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgMHglbGx4XG4iLApAQCAtMjUwLDYgKzI1MCwxMyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCWlmIChkZXYgPCAwKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG10ZC1kZXZpY2UgdmlhIG1vZHVsZSBwYXJhbXRlclxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgIkNBUkVGVUw6IFRoaXMgdGVzdCB3aXBlcyBhbGwgZGF0YSBvbiB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOwogCiAJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zdWJwYWdldGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMKaW5kZXggMzM0ZWFlNS4uMWEwNWJmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3N1YnBhZ2V0ZXN0OiAiCiAKLXN0YXRpYyBpbnQgZGV2Oworc3RhdGljIGludCBkZXYgPSAtRUlOVkFMOwogbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CiAKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXJlYWQgPSAwOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHN1YnBnc2l6ZSwgJnJlYWQsIHJlYWRidWYpOwogCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUpKSB7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4gJiYgcmVhZCA9PSBzdWJwZ3NpemUpIHsKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikgJiYgcmVhZCA9PSBzdWJwZ3NpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJFQ0MgY29ycmVjdGlvbiBhdCAlI2xseFxuIiwKIAkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOwogCQkJZXJyID0gMDsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCXJlYWQgPSAwOwogCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHN1YnBnc2l6ZSwgJnJlYWQsIHJlYWRidWYpOwogCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUpKSB7Ci0JCWlmIChlcnIgPT0gLUVVQ0xFQU4gJiYgcmVhZCA9PSBzdWJwZ3NpemUpIHsKKwkJaWYgKG10ZF9pc19iaXRmbGlwKGVycikgJiYgcmVhZCA9PSBzdWJwZ3NpemUpIHsKIAkJCXByaW50ayhQUklOVF9QUkVGICJFQ0MgY29ycmVjdGlvbiBhdCAlI2xseFxuIiwKIAkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOwogCQkJZXJyID0gMDsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlyZWFkID0gMDsKIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3VicGdzaXplICogaywgJnJlYWQsIHJlYWRidWYpOwogCQlpZiAodW5saWtlbHkoZXJyIHx8IHJlYWQgIT0gc3VicGdzaXplICogaykpIHsKLQkJCWlmIChlcnIgPT0gLUVVQ0xFQU4gJiYgcmVhZCA9PSBzdWJwZ3NpemUgKiBrKSB7CisJCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSAmJiByZWFkID09IHN1YnBnc2l6ZSAqIGspIHsKIAkJCQlwcmludGsoUFJJTlRfUFJFRiAiRUNDIGNvcnJlY3Rpb24gYXQgJSNsbHhcbiIsCiAJCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CiAJCQkJZXJyID0gMDsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCQlyZWFkID0gMDsKIAkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3VicGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7CiAJCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUpKSB7Ci0JCQlpZiAoZXJyID09IC1FVUNMRUFOICYmIHJlYWQgPT0gc3VicGdzaXplKSB7CisJCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSAmJiByZWFkID09IHN1YnBnc2l6ZSkgewogCQkJCXByaW50ayhQUklOVF9QUkVGICJFQ0MgY29ycmVjdGlvbiBhdCAlI2xseFxuIiwKIAkJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKIAkJCQllcnIgPSAwOwpAQCAtMzc5LDYgKzM3OSwxMyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCWlmIChkZXYgPCAwKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG10ZC1kZXZpY2UgdmlhIG1vZHVsZSBwYXJhbXRlclxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgIkNBUkVGVUw6IFRoaXMgdGVzdCB3aXBlcyBhbGwgZGF0YSBvbiB0aGUgc3BlY2lmaWVkIE1URCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOwogCiAJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF90b3J0dXJldGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3RvcnR1cmV0ZXN0LmMKaW5kZXggNWM2YzNkMi4uMDNhYjY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3RvcnR1cmV0ZXN0LmMKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3RvcnR1cmV0ZXN0LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIG1vZHVsZV9wYXJhbShwZ2NudCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocGdjbnQsICJudW1iZXIgb2YgcGFnZXMgcGVyIGVyYXNlYmxvY2sgdG8gdG9ydHVyZSAoMCA9PiBhbGwpIik7CiAKLXN0YXRpYyBpbnQgZGV2Oworc3RhdGljIGludCBkZXYgPSAtRUlOVkFMOwogbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CiAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiByZXRyeToKIAllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBsZW4sICZyZWFkLCBjaGVja19idWYpOwotCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJaWYgKG10ZF9pc19iaXRmbGlwKGVycikpCiAJCXByaW50ayhQUklOVF9QUkVGICJzaW5nbGUgYml0IGZsaXAgb2NjdXJyZWQgYXQgRUIgJWQgIgogCQkgICAgICAgIk1URCByZXBvcnRlZCB0aGF0IGl0IHdhcyBmaXhlZC5cbiIsIGVibnVtKTsKIAllbHNlIGlmIChlcnIpIHsKQEAgLTIxMyw2ICsyMTMsMTMgQEAKIAlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlwcmludGsoUFJJTlRfUFJFRiAiV2FybmluZzogdGhpcyBwcm9ncmFtIGlzIHRyeWluZyB0byB3ZWFyIG91dCB5b3VyICIKIAkgICAgICAgImZsYXNoLCBzdG9wIGl0IGlmIHRoaXMgaXMgbm90IHdhbnRlZC5cbiIpOworCisJaWYgKGRldiA8IDApIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbXRkLWRldmljZSB2aWEgbW9kdWxlIHBhcmFtdGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ0FSRUZVTDogVGhpcyB0ZXN0IHdpcGVzIGFsbCBkYXRhIG9uIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwcmludGsoUFJJTlRfUFJFRiAiTVREIGRldmljZTogJWRcbiIsIGRldik7CiAJcHJpbnRrKFBSSU5UX1BSRUYgInRvcnR1cmUgJWQgZXJhc2VibG9ja3MgKCVkLSVkKSBvZiBtdGQlZFxuIiwKIAkgICAgICAgZWJjbnQsIGViLCBlYiArIGViY250IC0gMSwgZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9lYmEuYyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwppbmRleCA0YmU2NzE4MS4uZmI3ZjE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKSB7CiAJCQlzY3J1YiA9IDE7CiAJCQllcnIgPSAwOwotCQl9IGVsc2UgaWYgKGVyciA9PSAtRUJBRE1TRykgeworCQl9IGVsc2UgaWYgKG10ZF9pc19lY2NlcnIoZXJyKSkgewogCQkJaWYgKHZvbC0+dm9sX3R5cGUgPT0gVUJJX0RZTkFNSUNfVk9MVU1FKQogCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJCXNjcnViID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9pby5jIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKaW5kZXggNmJhNTVjMi4uZjIwYjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2lvLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKQEAgLTE3Miw5ICsxNzIsOSBAQAogcmV0cnk6CiAJZXJyID0gdWJpLT5tdGQtPnJlYWQodWJpLT5tdGQsIGFkZHIsIGxlbiwgJnJlYWQsIGJ1Zik7CiAJaWYgKGVycikgewotCQljb25zdCBjaGFyICplcnJzdHIgPSAoZXJyID09IC1FQkFETVNHKSA/ICIgKEVDQyBlcnJvcikiIDogIiI7CisJCWNvbnN0IGNoYXIgKmVycnN0ciA9IG10ZF9pc19lY2NlcnIoZXJyKSA/ICIgKEVDQyBlcnJvcikiIDogIiI7CiAKLQkJaWYgKGVyciA9PSAtRVVDTEVBTikgeworCQlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkgewogCQkJLyoKIAkJCSAqIC1FVUNMRUFOIGlzIHJlcG9ydGVkIGlmIHRoZXJlIHdhcyBhIGJpdC1mbGlwIHdoaWNoCiAJCQkgKiB3YXMgY29ycmVjdGVkLCBzbyB0aGlzIGlzIGhhcm1sZXNzLgpAQCAtMjA1LDcgKzIwNSw3IEBACiAJCSAqIGFsbCB0aGUgcmVxdWVzdGVkIGRhdGEuIEJ1dCBzb21lIGJ1Z2d5IGRyaXZlcnMgbWlnaHQgZG8KIAkJICogdGhpcywgc28gd2UgY2hhbmdlIGl0IHRvIC1FSU8uCiAJCSAqLwotCQlpZiAocmVhZCAhPSBsZW4gJiYgZXJyID09IC1FQkFETVNHKSB7CisJCWlmIChyZWFkICE9IGxlbiAmJiBtdGRfaXNfZWNjZXJyKGVycikpIHsKIAkJCXViaV9hc3NlcnQoMCk7CiAJCQllcnIgPSAtRUlPOwogCQl9CkBAIC00NjksNyArNDY5LDcgQEAKIAogb3V0OgogCW11dGV4X3VubG9jaygmdWJpLT5idWZfbXV0ZXgpOwotCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTIHx8IGVyciA9PSAtRUJBRE1TRykgeworCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTIHx8IG10ZF9pc19lY2NlcnIoZXJyKSkgewogCQkvKgogCQkgKiBJZiBhIGJpdC1mbGlwIG9yIGRhdGEgaW50ZWdyaXR5IGVycm9yIHdhcyBkZXRlY3RlZCwgdGhlIHRlc3QKIAkJICogaGFzIG5vdCBwYXNzZWQgYmVjYXVzZSBpdCBoYXBwZW5lZCBvbiBhIGZyZXNobHkgZXJhc2VkCkBAIC03NjAsNyArNzYwLDcgQEAKIAogCXJlYWRfZXJyID0gdWJpX2lvX3JlYWQodWJpLCBlY19oZHIsIHBudW0sIDAsIFVCSV9FQ19IRFJfU0laRSk7CiAJaWYgKHJlYWRfZXJyKSB7Ci0JCWlmIChyZWFkX2VyciAhPSBVQklfSU9fQklURkxJUFMgJiYgcmVhZF9lcnIgIT0gLUVCQURNU0cpCisJCWlmIChyZWFkX2VyciAhPSBVQklfSU9fQklURkxJUFMgJiYgIW10ZF9pc19lY2NlcnIocmVhZF9lcnIpKQogCQkJcmV0dXJuIHJlYWRfZXJyOwogCiAJCS8qCkBAIC03NzYsNyArNzc2LDcgQEAKIAogCW1hZ2ljID0gYmUzMl90b19jcHUoZWNfaGRyLT5tYWdpYyk7CiAJaWYgKG1hZ2ljICE9IFVCSV9FQ19IRFJfTUFHSUMpIHsKLQkJaWYgKHJlYWRfZXJyID09IC1FQkFETVNHKQorCQlpZiAobXRkX2lzX2VjY2VycihyZWFkX2VycikpCiAJCQlyZXR1cm4gVUJJX0lPX0JBRF9IRFJfRUJBRE1TRzsKIAogCQkvKgpAQCAtMTAzMiwxMiArMTAzMiwxMiBAQAogCXAgPSAoY2hhciAqKXZpZF9oZHIgLSB1YmktPnZpZF9oZHJfc2hpZnQ7CiAJcmVhZF9lcnIgPSB1YmlfaW9fcmVhZCh1YmksIHAsIHBudW0sIHViaS0+dmlkX2hkcl9hbG9mZnNldCwKIAkJCSAgdWJpLT52aWRfaGRyX2Fsc2l6ZSk7Ci0JaWYgKHJlYWRfZXJyICYmIHJlYWRfZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiByZWFkX2VyciAhPSAtRUJBRE1TRykKKwlpZiAocmVhZF9lcnIgJiYgcmVhZF9lcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmICFtdGRfaXNfZWNjZXJyKHJlYWRfZXJyKSkKIAkJcmV0dXJuIHJlYWRfZXJyOwogCiAJbWFnaWMgPSBiZTMyX3RvX2NwdSh2aWRfaGRyLT5tYWdpYyk7CiAJaWYgKG1hZ2ljICE9IFVCSV9WSURfSERSX01BR0lDKSB7Ci0JCWlmIChyZWFkX2VyciA9PSAtRUJBRE1TRykKKwkJaWYgKG10ZF9pc19lY2NlcnIocmVhZF9lcnIpKQogCQkJcmV0dXJuIFVCSV9JT19CQURfSERSX0VCQURNU0c7CiAKIAkJaWYgKHViaV9jaGVja19wYXR0ZXJuKHZpZF9oZHIsIDB4RkYsIFVCSV9WSURfSERSX1NJWkUpKSB7CkBAIC0xMjE5LDcgKzEyMTksNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWVyciA9IHViaV9pb19yZWFkKHViaSwgZWNfaGRyLCBwbnVtLCAwLCBVQklfRUNfSERSX1NJWkUpOwotCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiBlcnIgIT0gLUVCQURNU0cpCisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmICFtdGRfaXNfZWNjZXJyKGVycikpCiAJCWdvdG8gZXhpdDsKIAogCWNyYyA9IGNyYzMyKFVCSV9DUkMzMl9JTklULCBlY19oZHIsIFVCSV9FQ19IRFJfU0laRV9DUkMpOwpAQCAtMTMwNiw3ICsxMzA2LDcgQEAKIAlwID0gKGNoYXIgKil2aWRfaGRyIC0gdWJpLT52aWRfaGRyX3NoaWZ0OwogCWVyciA9IHViaV9pb19yZWFkKHViaSwgcCwgcG51bSwgdWJpLT52aWRfaGRyX2Fsb2Zmc2V0LAogCQkJICB1YmktPnZpZF9oZHJfYWxzaXplKTsKLQlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgZXJyICE9IC1FQkFETVNHKQorCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUyAmJiAhbXRkX2lzX2VjY2VycihlcnIpKQogCQlnb3RvIGV4aXQ7CiAKIAljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgdmlkX2hkciwgVUJJX0VDX0hEUl9TSVpFX0NSQyk7CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogCX0KIAogCWVyciA9IHViaS0+bXRkLT5yZWFkKHViaS0+bXRkLCBhZGRyLCBsZW4sICZyZWFkLCBidWYxKTsKLQlpZiAoZXJyICYmIGVyciAhPSAtRVVDTEVBTikKKwlpZiAoZXJyICYmICFtdGRfaXNfYml0ZmxpcChlcnIpKQogCQlnb3RvIG91dF9mcmVlOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogCX0KIAogCWVyciA9IHViaS0+bXRkLT5yZWFkKHViaS0+bXRkLCBhZGRyLCBsZW4sICZyZWFkLCBidWYpOwotCWlmIChlcnIgJiYgZXJyICE9IC1FVUNMRUFOKSB7CisJaWYgKGVyciAmJiAhbXRkX2lzX2JpdGZsaXAoZXJyKSkgewogCQl1YmlfZXJyKCJlcnJvciAlZCB3aGlsZSByZWFkaW5nICVkIGJ5dGVzIGZyb20gUEVCICVkOiVkLCAiCiAJCQkicmVhZCAlemQgYnl0ZXMiLCBlcnIsIGxlbiwgcG51bSwgb2Zmc2V0LCByZWFkKTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCmluZGV4IGQzOTcxNmUuLjFhMzVmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2thcGkuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJCXJldHVybiAwOwogCiAJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbCwgbG51bSwgYnVmLCBvZmZzZXQsIGxlbiwgY2hlY2spOwotCWlmIChlcnIgJiYgZXJyID09IC1FQkFETVNHICYmIHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKKwlpZiAoZXJyICYmIG10ZF9pc19lY2NlcnIoZXJyKSAmJiB2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKSB7CiAJCXViaV93YXJuKCJtYXJrIHZvbHVtZSAlZCBhcyBjb3JydXB0ZWQiLCB2b2xfaWQpOwogCQl2b2wtPmNvcnJ1cHRlZCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL21pc2MuYyBiL2RyaXZlcnMvbXRkL3ViaS9taXNjLmMKaW5kZXggZmYyYTY1Yy4uZjZhN2Q3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL21pc2MuYworKysgYi9kcml2ZXJzL210ZC91YmkvbWlzYy5jCkBAIC04MSw3ICs4MSw3IEBACiAKIAkJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbCwgaSwgYnVmLCAwLCBzaXplLCAxKTsKIAkJaWYgKGVycikgewotCQkJaWYgKGVyciA9PSAtRUJBRE1TRykKKwkJCWlmIChtdGRfaXNfZWNjZXJyKGVycikpCiAJCQkJZXJyID0gMTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwppbmRleCBhM2ExOThmLi4wY2IxN2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKQEAgLTM5NSw3ICszOTUsNyBAQAogCX0KIAogCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBidWYsIHBudW0sIDAsIGxlbik7Ci0JaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmIGVyciAhPSAtRUJBRE1TRykKKwlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgIW10ZF9pc19lY2NlcnIoZXJyKSkKIAkJZ290byBvdXRfZnJlZV9idWY7CiAKIAlkYXRhX2NyYyA9IGJlMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfY3JjKTsKQEAgLTc5Myw3ICs3OTMsNyBAQAogCiAJZXJyID0gdWJpX2lvX3JlYWQodWJpLCB1YmktPnBlYl9idWYxLCBwbnVtLCB1YmktPmxlYl9zdGFydCwKIAkJCSAgdWJpLT5sZWJfc2l6ZSk7Ci0JaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgZXJyID09IC1FQkFETVNHKSB7CisJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgbXRkX2lzX2VjY2VycihlcnIpKSB7CiAJCS8qCiAJCSAqIEJpdC1mbGlwcyBvciBpbnRlZ3JpdHkgZXJyb3JzIHdoaWxlIHJlYWRpbmcgdGhlIGRhdGEgYXJlYS4KIAkJICogSXQgaXMgZGlmZmljdWx0IHRvIHNheSBmb3Igc3VyZSB3aGF0IHR5cGUgb2YgY29ycnVwdGlvbiBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jIGIvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCmluZGV4IDk3ZTA5M2QuLjg2MzgzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS92bXQuYworKysgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAidWJpLmgiCiAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKaW5kZXggNGI1MGEzMC4uOWFkMThkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYworKysgYi9kcml2ZXJzL210ZC91YmkvdnRibC5jCkBAIC00MjMsNyArNDIzLDcgQEAKIAogCQllcnIgPSB1YmlfaW9fcmVhZF9kYXRhKHViaSwgbGViW3NlYi0+bG51bV0sIHNlYi0+cG51bSwgMCwKIAkJCQkgICAgICAgdWJpLT52dGJsX3NpemUpOwotCQlpZiAoZXJyID09IFVCSV9JT19CSVRGTElQUyB8fCBlcnIgPT0gLUVCQURNU0cpCisJCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTIHx8IG10ZF9pc19lY2NlcnIoZXJyKSkKIAkJCS8qCiAJCQkgKiBTY3J1YiB0aGUgUEVCIGxhdGVyLiBOb3RlLCAtRUJBRE1TRyBpbmRpY2F0ZXMgYW4KIAkJCSAqIHVuY29ycmVjdGFibGUgRUNDIGVycm9yLCBidXQgd2UgaGF2ZSBvdXIgb3duIENSQyBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCmluZGV4IGMzNGNjMWUuLmIwYzU3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAvKgogICogR2V0IGxpbmsgc3BlZWQgYW5kIGR1cGxleCBmcm9tIHRoZSBzbGF2ZSdzIGJhc2UgZHJpdmVyCiAgKiB1c2luZyBldGh0b29sLiBJZiBmb3Igc29tZSByZWFzb24gdGhlIGNhbGwgZmFpbHMgb3IgdGhlCi0gKiB2YWx1ZXMgYXJlIGludmFsaWQsIGZha2Ugc3BlZWQgYW5kIGR1cGxleCB0byAxMDAvRnVsbAorICogdmFsdWVzIGFyZSBpbnZhbGlkLCBzZXQgc3BlZWQgYW5kIGR1cGxleCB0byAtMSwKICAqIGFuZCByZXR1cm4gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQgYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KHN0cnVjdCBzbGF2ZSAqc2xhdmUpCkBAIC01NjAsOSArNTYwLDggQEAKIAl1MzIgc2xhdmVfc3BlZWQ7CiAJaW50IHJlczsKIAotCS8qIEZha2Ugc3BlZWQgYW5kIGR1cGxleCAqLwotCXNsYXZlLT5zcGVlZCA9IFNQRUVEXzEwMDsKLQlzbGF2ZS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJc2xhdmUtPnNwZWVkID0gU1BFRURfVU5LTk9XTjsKKwlzbGF2ZS0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAKIAlyZXMgPSBfX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHNsYXZlX2RldiwgJmVjbWQpOwogCWlmIChyZXMgPCAwKQpAQCAtMTc1MSwxNiArMTc1MCw3IEBACiAJCW5ld19zbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKIAl9CiAKLQlpZiAoYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KG5ld19zbGF2ZSkgJiYKLQkgICAgKG5ld19zbGF2ZS0+bGluayAhPSBCT05EX0xJTktfRE9XTikpIHsKLQkJcHJfd2FybmluZygiJXM6IFdhcm5pbmc6IGZhaWxlZCB0byBnZXQgc3BlZWQgYW5kIGR1cGxleCBmcm9tICVzLCBhc3N1bWVkIHRvIGJlIDEwME1iL3NlYyBhbmQgRnVsbC5cbiIsCi0JCQkgICBib25kX2Rldi0+bmFtZSwgbmV3X3NsYXZlLT5kZXYtPm5hbWUpOwotCi0JCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7Ci0JCQlwcl93YXJuaW5nKCIlczogV2FybmluZzogT3BlcmF0aW9uIG9mIDgwMi4zYWQgbW9kZSByZXF1aXJlcyBFVEhUT09MIHN1cHBvcnQgaW4gYmFzZSBkcml2ZXIgZm9yIHByb3BlciBhZ2dyZWdhdG9yIHNlbGVjdGlvbi5cbiIsCi0JCQkJICAgYm9uZF9kZXYtPm5hbWUpOwotCQl9Ci0JfQorCWJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChuZXdfc2xhdmUpOwogCiAJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkgJiYgYm9uZC0+cGFyYW1zLnByaW1hcnlbMF0pIHsKIAkJLyogaWYgdGhlcmUgaXMgYSBwcmltYXJ5IHNsYXZlLCByZW1lbWJlciBpdCAqLwpAQCAtMzIyMCw2ICszMjEwLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYgPSBzbGF2ZV9kZXYtPm1hc3RlcjsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGJvbmRfZGV2KTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gTlVMTDsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgpAQCAtMzIzMCwyMCArMzIyMSwxNiBAQAogCQkJCWJvbmRfcmVsZWFzZShib25kX2Rldiwgc2xhdmVfZGV2KTsKIAkJfQogCQlicmVhazsKKwljYXNlIE5FVERFVl9VUDoKIAljYXNlIE5FVERFVl9DSEFOR0U6Ci0JCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEIHx8IGJvbmRfaXNfbGIoYm9uZCkpIHsKLQkJCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJCXNsYXZlID0gYm9uZF9nZXRfc2xhdmVfYnlfZGV2KGJvbmQsIHNsYXZlX2Rldik7CisJCWlmIChzbGF2ZSkgeworCQkJdTMyIG9sZF9zcGVlZCA9IHNsYXZlLT5zcGVlZDsKKwkJCXU4ICBvbGRfZHVwbGV4ID0gc2xhdmUtPmR1cGxleDsKIAotCQkJc2xhdmUgPSBib25kX2dldF9zbGF2ZV9ieV9kZXYoYm9uZCwgc2xhdmVfZGV2KTsKLQkJCWlmIChzbGF2ZSkgewotCQkJCXUzMiBvbGRfc3BlZWQgPSBzbGF2ZS0+c3BlZWQ7Ci0JCQkJdTggIG9sZF9kdXBsZXggPSBzbGF2ZS0+ZHVwbGV4OworCQkJYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KHNsYXZlKTsKIAotCQkJCWJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChzbGF2ZSk7Ci0KLQkJCQlpZiAoYm9uZF9pc19sYihib25kKSkKLQkJCQkJYnJlYWs7Ci0KKwkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCQkJaWYgKG9sZF9zcGVlZCAhPSBzbGF2ZS0+c3BlZWQpCiAJCQkJCWJvbmRfM2FkX2FkYXB0ZXJfc3BlZWRfY2hhbmdlZChzbGF2ZSk7CiAJCQkJaWYgKG9sZF9kdXBsZXggIT0gc2xhdmUtPmR1cGxleCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYwppbmRleCA5NWRlOTNiLi5hZDI4NGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CiAjaW5jbHVkZSAiYm9uZGluZy5oIgpAQCAtMTU3LDggKzE1OCwxNiBAQAogCXNlcV9wcmludGYoc2VxLCAiXG5TbGF2ZSBJbnRlcmZhY2U6ICVzXG4iLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKIAlzZXFfcHJpbnRmKHNlcSwgIk1JSSBTdGF0dXM6ICVzXG4iLAogCQkgICAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSA/ICAidXAiIDogImRvd24iKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlNwZWVkOiAlZCBNYnBzXG4iLCBzbGF2ZS0+c3BlZWQpOwotCXNlcV9wcmludGYoc2VxLCAiRHVwbGV4OiAlc1xuIiwgc2xhdmUtPmR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJaWYgKHNsYXZlLT5zcGVlZCA9PSBTUEVFRF9VTktOT1dOKQorCQlzZXFfcHJpbnRmKHNlcSwgIlNwZWVkOiAlc1xuIiwgIlVua25vd24iKTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAiU3BlZWQ6ICVkIE1icHNcbiIsIHNsYXZlLT5zcGVlZCk7CisKKwlpZiAoc2xhdmUtPmR1cGxleCA9PSBEVVBMRVhfVU5LTk9XTikKKwkJc2VxX3ByaW50ZihzZXEsICJEdXBsZXg6ICVzXG4iLCAiVW5rbm93biIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICJEdXBsZXg6ICVzXG4iLCBzbGF2ZS0+ZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwogCXNlcV9wcmludGYoc2VxLCAiTGluayBGYWlsdXJlIENvdW50OiAldVxuIiwKIAkJICAgc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCmluZGV4IDZkZmY1YTAuLjU5N2Y0ZDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKQEAgLTE1OSw2ICsxNTksNyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgczZnbWFjLgogCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L3NlZXEvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lsYW4vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9zZ2kvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKaW5kZXggYzUzYWQzYS4uYmU1ZGRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKQEAgLTU4LDYgKzU4LDcgQEAKIG9iai0kKENPTkZJR19ORVRfVkVORE9SX1JEQykgKz0gcmRjLwogb2JqLSQoQ09ORklHX1M2R01BQykgKz0gczZnbWFjLm8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX1NFRVEpICs9IHNlZXEvCitvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9TSUxBTikgKz0gc2lsYW4vCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9TSVMpICs9IHNpcy8KIG9iai0kKENPTkZJR19TRkMpICs9IHNmYy8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX1NHSSkgKz0gc2dpLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmMKaW5kZXggODIzODY2Ny4uNDg2NWZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jCkBAIC01NDEsMTkgKzU0MSwxNyBAQAogICogdGhlc2UgYXJlIG5vdCBkZXNjcmlwdG9ycyBzaXR0aW5nIGluIG1lbW9yeS4KICAqLwogc3RhdGljIHZvaWQKLWF1MTAwMF9zZXR1cF9od19yaW5ncyhzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCwgdTMyIHJ4X2Jhc2UsIHUzMiB0eF9iYXNlKQorYXUxMDAwX3NldHVwX2h3X3JpbmdzKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwLCB2b2lkIF9faW9tZW0gKnR4X2Jhc2UpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RNQTsgaSsrKSB7Ci0JCWF1cC0+cnhfZG1hX3JpbmdbaV0gPQotCQkJKHN0cnVjdCByeF9kbWEgKikKLQkJCQkJKHJ4X2Jhc2UgKyBzaXplb2Yoc3RydWN0IHJ4X2RtYSkqaSk7CisJCWF1cC0+cnhfZG1hX3JpbmdbaV0gPSAoc3RydWN0IHJ4X2RtYSAqKQorCQkJKHR4X2Jhc2UgKyAweDEwMCArIHNpemVvZihzdHJ1Y3QgcnhfZG1hKSAqIGkpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RNQTsgaSsrKSB7Ci0JCWF1cC0+dHhfZG1hX3JpbmdbaV0gPQotCQkJKHN0cnVjdCB0eF9kbWEgKikKLQkJCQkJKHR4X2Jhc2UgKyBzaXplb2Yoc3RydWN0IHR4X2RtYSkqaSk7CisJCWF1cC0+dHhfZG1hX3JpbmdbaV0gPSAoc3RydWN0IHR4X2RtYSAqKQorCQkJKHR4X2Jhc2UgKyBzaXplb2Yoc3RydWN0IHR4X2RtYSkgKiBpKTsKIAl9CiB9CiAKQEAgLTEwMjYsNyArMTAyNCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CiAJc3RydWN0IGRiX2Rlc3QgKnBEQiwgKnBEQmZyZWU7CiAJaW50IGlycSwgaSwgZXJyID0gMDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmJhc2UsICptYWNlbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmJhc2UsICptYWNlbiwgKm1hY2RtYTsKIAogCWJhc2UgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghYmFzZSkgewpAQCAtMTA0OSw2ICsxMDQ3LDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCW1hY2RtYSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJaWYgKCFtYWNkbWEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJldHJpZXZlIE1BQ0RNQSByZWdpc3RlcnNcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShiYXNlKSwKIAkJCQkJCQlwZGV2LT5uYW1lKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uIGZvciBiYXNlIHJlZ2lzdGVyc1xuIik7CkBAIC0xMDYzLDYgKzEwNjgsMTMgQEAKIAkJZ290byBlcnJfcmVxdWVzdDsKIAl9CiAKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtYWNkbWEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1hY2RtYSksCisJCQkJCQkJcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgTUFDRE1BIG1lbW9yeSByZWdpb25cbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZXJyX21hY2RtYTsKKwl9CisKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF1MTAwMF9wcml2YXRlKSk7CiAJaWYgKCFkZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWxsb2NfZXRoZXJkZXYgZmFpbGVkXG4iKTsKQEAgLTExMDksMTAgKzExMjEsMTQgQEAKIAl9CiAJYXVwLT5tYWNfaWQgPSBwZGV2LT5pZDsKIAotCWlmIChwZGV2LT5pZCA9PSAwKQotCQlhdTEwMDBfc2V0dXBfaHdfcmluZ3MoYXVwLCBNQUMwX1JYX0RNQV9BRERSLCBNQUMwX1RYX0RNQV9BRERSKTsKLQllbHNlIGlmIChwZGV2LT5pZCA9PSAxKQotCQlhdTEwMDBfc2V0dXBfaHdfcmluZ3MoYXVwLCBNQUMxX1JYX0RNQV9BRERSLCBNQUMxX1RYX0RNQV9BRERSKTsKKwlhdXAtPm1hY2RtYSA9IGlvcmVtYXBfbm9jYWNoZShtYWNkbWEtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1hY2RtYSkpOworCWlmICghYXVwLT5tYWNkbWEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvcmVtYXAgTUFDRE1BIHJlZ2lzdGVyc1xuIik7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBlcnJfcmVtYXAzOworCX0KKworCWF1MTAwMF9zZXR1cF9od19yaW5ncyhhdXAsIGF1cC0+bWFjZG1hKTsKIAogCS8qIHNldCBhIHJhbmRvbSBNQUMgbm93IGluIGNhc2UgcGxhdGZvcm1fZGF0YSBkb2Vzbid0IHByb3ZpZGUgb25lICovCiAJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CkBAIC0xMjUyLDYgKzEyNjgsOCBAQAogZXJyX21kaW9idXNfcmVnOgogCW1kaW9idXNfZnJlZShhdXAtPm1paV9idXMpOwogZXJyX21kaW9idXNfYWxsb2M6CisJaW91bm1hcChhdXAtPm1hY2RtYSk7CitlcnJfcmVtYXAzOgogCWlvdW5tYXAoYXVwLT5lbmFibGUpOwogZXJyX3JlbWFwMjoKIAlpb3VubWFwKGF1cC0+bWFjKTsKQEAgLTEyNjEsNiArMTI3OSw4IEBACiBlcnJfdmFkZHI6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIGVycl9hbGxvYzoKKwlyZWxlYXNlX21lbV9yZWdpb24obWFjZG1hLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtYWNkbWEpKTsKK2Vycl9tYWNkbWE6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG1hY2VuLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtYWNlbikpOwogZXJyX3JlcXVlc3Q6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2UtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGJhc2UpKTsKQEAgLTEyOTMsOSArMTMxMywxMyBAQAogCQkJKE5VTV9UWF9CVUZGUyArIE5VTV9SWF9CVUZGUyksCiAJCQkodm9pZCAqKWF1cC0+dmFkZHIsIGF1cC0+ZG1hX2FkZHIpOwogCisJaW91bm1hcChhdXAtPm1hY2RtYSk7CiAJaW91bm1hcChhdXAtPm1hYyk7CiAJaW91bm1hcChhdXAtPmVuYWJsZSk7CiAKKwliYXNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oYmFzZS0+c3RhcnQsIHJlc291cmNlX3NpemUoYmFzZSkpOworCiAJYmFzZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2UtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGJhc2UpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmgKaW5kZXggNjIyOWM3Ny4uNGI3ZjdhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5oCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkgKi8KIAlzdHJ1Y3QgbWFjX3JlZyAqbWFjOyAgLyogbWFjIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAqLwogCXUzMiAqZW5hYmxlOyAgICAgLyogYWRkcmVzcyBvZiBNQUMgRW5hYmxlIFJlZ2lzdGVyICAgICAqLwotCisJdm9pZCBfX2lvbWVtICptYWNkbWE7CS8qIGJhc2Ugb2YgTUFDIERNQSBwb3J0ICovCiAJdTMyIHZhZGRyOyAgICAgICAgICAgICAgICAvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcngvdHggYnVmZmVycyAgICovCiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsgICAgICAvKiBkbWEgYWRkcmVzcyBvZiByeC90eCBidWZmZXJzICAgICAgICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9LY29uZmlnCmluZGV4IGE3NTlkNTQuLjEzNzVlMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvS2NvbmZpZwpAQCAtNTIsMTggKzUyLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGJtYWMuCiAKLWNvbmZpZyBNQUM4OXgwCi0JdHJpc3RhdGUgIk1hY2ludG9zaCBDUzg5eDAgYmFzZWQgZXRoZXJuZXQgY2FyZHMiCi0JZGVwZW5kcyBvbiBNQUMKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gIElmIHlvdSBoYXZlIGEKLQkgIE51YnVzIG9yIExDLVBEUyBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZAotCSAgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGlzIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbWFjODl4MC4KLQogY29uZmlnIE1BQ01BQ0UKIAlib29sICJNYWNpbnRvc2ggKEFWKSBvbmJvYXJkIE1BQ0UgZXRoZXJuZXQiCiAJZGVwZW5kcyBvbiBNQUMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvTWFrZWZpbGUKaW5kZXggMGQzYTU5MS4uODZlYWExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvTWFrZWZpbGUKQEAgLTQsNSArNCw0IEBACiAKIG9iai0kKENPTkZJR19NQUNFKSArPSBtYWNlLm8KIG9iai0kKENPTkZJR19CTUFDKSArPSBibWFjLm8KLW9iai0kKENPTkZJR19NQUM4OXgwKSArPSBtYWM4OXgwLm8KIG9iai0kKENPTkZJR19NQUNNQUNFKSArPSBtYWNtYWNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKaW5kZXggMTYxY2JiYi4uYmY0MDc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKQEAgLTg5LDEwICs4OSwxMCBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKICNkZWZpbmUgVEczX01BSl9OVU0JCQkzCi0jZGVmaW5lIFRHM19NSU5fTlVNCQkJMTIwCisjZGVmaW5lIFRHM19NSU5fTlVNCQkJMTIxCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglcCiAJX19zdHJpbmdpZnkoVEczX01BSl9OVU0pICIuIiBfX3N0cmluZ2lmeShURzNfTUlOX05VTSkKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJBdWd1c3QgMTgsIDIwMTEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTm92ZW1iZXIgMiwgMjAxMSIKIAogI2RlZmluZSBSRVNFVF9LSU5EX1NIVVRET1dOCTAKICNkZWZpbmUgUkVTRVRfS0lORF9JTklUCQkxCkBAIC02MjgsMTkgKzYyOCwyMyBAQAogCQlyZWdiYXNlID0gVEczX0FQRV9QRVJfTE9DS19HUkFOVDsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGhhc24ndCBhbnkgc3RhbGUgbG9ja3MuICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoaSA9PSBURzNfQVBFX0xPQ0tfR1BJTykKLQkJCWNvbnRpbnVlOwotCQl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogaSwgQVBFX0xPQ0tfR1JBTlRfRFJJVkVSKTsKKwlmb3IgKGkgPSBURzNfQVBFX0xPQ0tfUEhZMDsgaSA8PSBURzNfQVBFX0xPQ0tfR1BJTzsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIFRHM19BUEVfTE9DS19QSFkwOgorCQljYXNlIFRHM19BUEVfTE9DS19QSFkxOgorCQljYXNlIFRHM19BUEVfTE9DS19QSFkyOgorCQljYXNlIFRHM19BUEVfTE9DS19QSFkzOgorCQkJYml0ID0gQVBFX0xPQ0tfR1JBTlRfRFJJVkVSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoIXRwLT5wY2lfZm4pCisJCQkJYml0ID0gQVBFX0xPQ0tfR1JBTlRfRFJJVkVSOworCQkJZWxzZQorCQkJCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKKwkJfQorCQl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogaSwgYml0KTsKIAl9CiAKLQkvKiBDbGVhciB0aGUgY29ycmVjdCBiaXQgb2YgdGhlIEdQSU8gbG9jayB0b28uICovCi0JaWYgKCF0cC0+cGNpX2ZuKQotCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7Ci0JZWxzZQotCQliaXQgPSAxIDw8IHRwLT5wY2lfZm47Ci0KLQl0ZzNfYXBlX3dyaXRlMzIodHAsIHJlZ2Jhc2UgKyA0ICogVEczX0FQRV9MT0NLX0dQSU8sIGJpdCk7CiB9CiAKIHN0YXRpYyBpbnQgdGczX2FwZV9sb2NrKHN0cnVjdCB0ZzMgKnRwLCBpbnQgbG9ja251bSkKQEAgLTY1OCw2ICs2NjIsMTAgQEAKIAkJCXJldHVybiAwOwogCWNhc2UgVEczX0FQRV9MT0NLX0dSQzoKIAljYXNlIFRHM19BUEVfTE9DS19NRU06CisJCWlmICghdHAtPnBjaV9mbikKKwkJCWJpdCA9IEFQRV9MT0NLX1JFUV9EUklWRVI7CisJCWVsc2UKKwkJCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzMsMTEgKzY4MSw2IEBACiAKIAlvZmYgPSA0ICogbG9ja251bTsKIAotCWlmIChsb2NrbnVtICE9IFRHM19BUEVfTE9DS19HUElPIHx8ICF0cC0+cGNpX2ZuKQotCQliaXQgPSBBUEVfTE9DS19SRVFfRFJJVkVSOwotCWVsc2UKLQkJYml0ID0gMSA8PCB0cC0+cGNpX2ZuOwotCiAJdGczX2FwZV93cml0ZTMyKHRwLCByZXEgKyBvZmYsIGJpdCk7CiAKIAkvKiBXYWl0IGZvciB1cCB0byAxIG1pbGxpc2Vjb25kIHRvIGFjcXVpcmUgbG9jay4gKi8KQEAgLTcxMCw2ICs3MTMsMTAgQEAKIAkJCXJldHVybjsKIAljYXNlIFRHM19BUEVfTE9DS19HUkM6CiAJY2FzZSBURzNfQVBFX0xPQ0tfTUVNOgorCQlpZiAoIXRwLT5wY2lfZm4pCisJCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7CisJCWVsc2UKKwkJCWJpdCA9IDEgPDwgdHAtPnBjaV9mbjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwpAQCAtNzIwLDExICs3MjcsNiBAQAogCWVsc2UKIAkJZ250ID0gVEczX0FQRV9QRVJfTE9DS19HUkFOVDsKIAotCWlmIChsb2NrbnVtICE9IFRHM19BUEVfTE9DS19HUElPIHx8ICF0cC0+cGNpX2ZuKQotCQliaXQgPSBBUEVfTE9DS19HUkFOVF9EUklWRVI7Ci0JZWxzZQotCQliaXQgPSAxIDw8IHRwLT5wY2lfZm47Ci0KIAl0ZzNfYXBlX3dyaXRlMzIodHAsIGdudCArIDQgKiBsb2NrbnVtLCBiaXQpOwogfQogCkBAIC01OTI3LDYgKzU5MjksMTggQEAKIAlyZXR1cm4gd29ya19kb25lOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX3Jlc2V0X3Rhc2tfc2NoZWR1bGUoc3RydWN0IHRnMyAqdHApCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFRHM19GTEFHX1JFU0VUX1RBU0tfUEVORElORywgdHAtPnRnM19mbGFncykpCisJCXNjaGVkdWxlX3dvcmsoJnRwLT5yZXNldF90YXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRnM19yZXNldF90YXNrX2NhbmNlbChzdHJ1Y3QgdGczICp0cCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZ0cC0+cmVzZXRfdGFzayk7CisJdGczX2ZsYWdfY2xlYXIodHAsIFJFU0VUX1RBU0tfUEVORElORyk7Cit9CisKIHN0YXRpYyBpbnQgdGczX3BvbGxfbXNpeChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IHRnM19uYXBpICp0bmFwaSA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgdGczX25hcGksIG5hcGkpOwpAQCAtNTk2Nyw3ICs1OTgxLDcgQEAKIHR4X3JlY292ZXJ5OgogCS8qIHdvcmtfZG9uZSBpcyBndWFyYW50ZWVkIHRvIGJlIGxlc3MgdGhhbiBidWRnZXQuICovCiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7CisJdGczX3Jlc2V0X3Rhc2tfc2NoZWR1bGUodHApOwogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKQEAgLTYwMDIsNyArNjAxNiw3IEBACiAJdGczX2R1bXBfc3RhdGUodHApOwogCiAJdGczX2ZsYWdfc2V0KHRwLCBFUlJPUl9QUk9DRVNTRUQpOwotCXNjaGVkdWxlX3dvcmsoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfcmVzZXRfdGFza19zY2hlZHVsZSh0cCk7CiB9CiAKIHN0YXRpYyBpbnQgdGczX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQpAQCAtNjA0OSw3ICs2MDYzLDcgQEAKIHR4X3JlY292ZXJ5OgogCS8qIHdvcmtfZG9uZSBpcyBndWFyYW50ZWVkIHRvIGJlIGxlc3MgdGhhbiBidWRnZXQuICovCiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQlzY2hlZHVsZV93b3JrKCZ0cC0+cmVzZXRfdGFzayk7CisJdGczX3Jlc2V0X3Rhc2tfc2NoZWR1bGUodHApOwogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKQEAgLTYzMzgsMTEgKzYzNTIsMTEgQEAKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGczLCByZXNldF90YXNrKTsKIAlpbnQgZXJyOwotCXVuc2lnbmVkIGludCByZXN0YXJ0X3RpbWVyOwogCiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcodHAtPmRldikpIHsKKwkJdGczX2ZsYWdfY2xlYXIodHAsIFJFU0VUX1RBU0tfUEVORElORyk7CiAJCXRnM19mdWxsX3VubG9jayh0cCk7CiAJCXJldHVybjsKIAl9CkBAIC02MzU1LDkgKzYzNjksNiBAQAogCiAJdGczX2Z1bGxfbG9jayh0cCwgMSk7CiAKLQlyZXN0YXJ0X3RpbWVyID0gdGczX2ZsYWcodHAsIFJFU1RBUlRfVElNRVIpOwotCXRnM19mbGFnX2NsZWFyKHRwLCBSRVNUQVJUX1RJTUVSKTsKLQogCWlmICh0ZzNfZmxhZyh0cCwgVFhfUkVDT1ZFUllfUEVORElORykpIHsKIAkJdHAtPndyaXRlMzJfdHhfbWJveCA9IHRnM193cml0ZTMyX3R4X21ib3g7CiAJCXRwLT53cml0ZTMyX3J4X21ib3ggPSB0ZzNfd3JpdGVfZmx1c2hfcmVnMzI7CkBAIC02MzcyLDE0ICs2MzgzLDEzIEBACiAKIAl0ZzNfbmV0aWZfc3RhcnQodHApOwogCi0JaWYgKHJlc3RhcnRfdGltZXIpCi0JCW1vZF90aW1lcigmdHAtPnRpbWVyLCBqaWZmaWVzICsgMSk7Ci0KIG91dDoKIAl0ZzNfZnVsbF91bmxvY2sodHApOwogCiAJaWYgKCFlcnIpCiAJCXRnM19waHlfc3RhcnQodHApOworCisJdGczX2ZsYWdfY2xlYXIodHAsIFJFU0VUX1RBU0tfUEVORElORyk7CiB9CiAKIHN0YXRpYyB2b2lkIHRnM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02MzkxLDcgKzY0MDEsNyBAQAogCQl0ZzNfZHVtcF9zdGF0ZSh0cCk7CiAJfQogCi0Jc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworCXRnM19yZXNldF90YXNrX3NjaGVkdWxlKHRwKTsKIH0KIAogLyogVGVzdCBmb3IgRE1BIGJ1ZmZlcnMgY3Jvc3NpbmcgYW55IDRHQiBib3VuZGFyaWVzOiA0RywgOEcsIGV0YyAqLwpAQCAtNjQ0MiwzMSArNjQ1MiwyNiBAQAogCQlod2J1ZyA9IDE7CiAKIAlpZiAodGczX2ZsYWcodHAsIDRLX0ZJRk9fTElNSVQpKSB7CisJCXUzMiBwcnZpZHggPSAqZW50cnk7CiAJCXUzMiB0bXBfZmxhZyA9IGZsYWdzICYgflRYRF9GTEFHX0VORDsKLQkJd2hpbGUgKGxlbiA+IFRHM19UWF9CRF9ETUFfTUFYKSB7CisJCXdoaWxlIChsZW4gPiBURzNfVFhfQkRfRE1BX01BWCAmJiAqYnVkZ2V0KSB7CiAJCQl1MzIgZnJhZ19sZW4gPSBURzNfVFhfQkRfRE1BX01BWDsKIAkJCWxlbiAtPSBURzNfVFhfQkRfRE1BX01BWDsKIAotCQkJaWYgKGxlbikgewotCQkJCXRuYXBpLT50eF9idWZmZXJzWyplbnRyeV0uZnJhZ21lbnRlZCA9IHRydWU7Ci0JCQkJLyogQXZvaWQgdGhlIDhieXRlIERNQSBwcm9ibGVtICovCi0JCQkJaWYgKGxlbiA8PSA4KSB7Ci0JCQkJCWxlbiArPSBURzNfVFhfQkRfRE1BX01BWCAvIDI7Ci0JCQkJCWZyYWdfbGVuID0gVEczX1RYX0JEX0RNQV9NQVggLyAyOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXRtcF9mbGFnID0gZmxhZ3M7Ci0KLQkJCWlmICgqYnVkZ2V0KSB7Ci0JCQkJdGczX3R4X3NldF9iZCgmdG5hcGktPnR4X3JpbmdbKmVudHJ5XSwgbWFwLAotCQkJCQkgICAgICBmcmFnX2xlbiwgdG1wX2ZsYWcsIG1zcywgdmxhbik7Ci0JCQkJKCpidWRnZXQpLS07Ci0JCQkJKmVudHJ5ID0gTkVYVF9UWCgqZW50cnkpOwotCQkJfSBlbHNlIHsKLQkJCQlod2J1ZyA9IDE7Ci0JCQkJYnJlYWs7CisJCQkvKiBBdm9pZCB0aGUgOGJ5dGUgRE1BIHByb2JsZW0gKi8KKwkJCWlmIChsZW4gPD0gOCkgeworCQkJCWxlbiArPSBURzNfVFhfQkRfRE1BX01BWCAvIDI7CisJCQkJZnJhZ19sZW4gPSBURzNfVFhfQkRfRE1BX01BWCAvIDI7CiAJCQl9CiAKKwkJCXRuYXBpLT50eF9idWZmZXJzWyplbnRyeV0uZnJhZ21lbnRlZCA9IHRydWU7CisKKwkJCXRnM190eF9zZXRfYmQoJnRuYXBpLT50eF9yaW5nWyplbnRyeV0sIG1hcCwKKwkJCQkgICAgICBmcmFnX2xlbiwgdG1wX2ZsYWcsIG1zcywgdmxhbik7CisJCQkqYnVkZ2V0IC09IDE7CisJCQlwcnZpZHggPSAqZW50cnk7CisJCQkqZW50cnkgPSBORVhUX1RYKCplbnRyeSk7CisKIAkJCW1hcCArPSBmcmFnX2xlbjsKIAkJfQogCkBAIC02NDc0LDEwICs2NDc5LDExIEBACiAJCQlpZiAoKmJ1ZGdldCkgewogCQkJCXRnM190eF9zZXRfYmQoJnRuYXBpLT50eF9yaW5nWyplbnRyeV0sIG1hcCwKIAkJCQkJICAgICAgbGVuLCBmbGFncywgbXNzLCB2bGFuKTsKLQkJCQkoKmJ1ZGdldCktLTsKKwkJCQkqYnVkZ2V0IC09IDE7CiAJCQkJKmVudHJ5ID0gTkVYVF9UWCgqZW50cnkpOwogCQkJfSBlbHNlIHsKIAkJCQlod2J1ZyA9IDE7CisJCQkJdG5hcGktPnR4X2J1ZmZlcnNbcHJ2aWR4XS5mcmFnbWVudGVkID0gZmFsc2U7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewpAQCAtNjUwOSw3ICs2NTE1LDcgQEAKIAkJdHhiID0gJnRuYXBpLT50eF9idWZmZXJzW2VudHJ5XTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKIAkJY29uc3Qgc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCiAJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CkBAIC02NTU5LDYgKzY1NjUsOCBAQAogCQkJZGV2X2tmcmVlX3NrYihuZXdfc2tiKTsKIAkJCXJldCA9IC0xOwogCQl9IGVsc2UgeworCQkJdTMyIHNhdmVfZW50cnkgPSAqZW50cnk7CisKIAkJCWJhc2VfZmxhZ3MgfD0gVFhEX0ZMQUdfRU5EOwogCiAJCQl0bmFwaS0+dHhfYnVmZmVyc1sqZW50cnldLnNrYiA9IG5ld19za2I7CkBAIC02NTY4LDcgKzY1NzYsNyBAQAogCQkJaWYgKHRnM190eF9mcmFnX3NldCh0bmFwaSwgZW50cnksIGJ1ZGdldCwgbmV3X2FkZHIsCiAJCQkJCSAgICBuZXdfc2tiLT5sZW4sIGJhc2VfZmxhZ3MsCiAJCQkJCSAgICBtc3MsIHZsYW4pKSB7Ci0JCQkJdGczX3R4X3NrYl91bm1hcCh0bmFwaSwgKmVudHJ5LCAwKTsKKwkJCQl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCBzYXZlX2VudHJ5LCAtMSk7CiAJCQkJZGV2X2tmcmVlX3NrYihuZXdfc2tiKTsKIAkJCQlyZXQgPSAtMTsKIAkJCX0KQEAgLTY3NTgsMTEgKzY3NjYsMTAgQEAKIAogCWlmICh0ZzNfdHhfZnJhZ19zZXQodG5hcGksICZlbnRyeSwgJmJ1ZGdldCwgbWFwcGluZywgbGVuLCBiYXNlX2ZsYWdzIHwKIAkJCSAgKChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApID8gVFhEX0ZMQUdfRU5EIDogMCksCi0JCQkgICAgbXNzLCB2bGFuKSkKKwkJCSAgICBtc3MsIHZsYW4pKSB7CiAJCXdvdWxkX2hpdF9od2J1ZyA9IDE7Ci0KIAkvKiBOb3cgbG9vcCB0aHJvdWdoIGFkZGl0aW9uYWwgZGF0YSBmcmFnbWVudHMsIGFuZCBxdWV1ZSB0aGVtLiAqLwotCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gMCkgeworCX0gZWxzZSBpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApIHsKIAkJdTMyIHRtcF9tc3MgPSBtc3M7CiAKIAkJaWYgKCF0ZzNfZmxhZyh0cCwgSFdfVFNPXzEpICYmCkBAIC02Nzg0LDExICs2NzkxLDE0IEBACiAJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnRwLT5wZGV2LT5kZXYsIG1hcHBpbmcpKQogCQkJCWdvdG8gZG1hX2Vycm9yOwogCi0JCQlpZiAodGczX3R4X2ZyYWdfc2V0KHRuYXBpLCAmZW50cnksICZidWRnZXQsIG1hcHBpbmcsCisJCQlpZiAoIWJ1ZGdldCB8fAorCQkJICAgIHRnM190eF9mcmFnX3NldCh0bmFwaSwgJmVudHJ5LCAmYnVkZ2V0LCBtYXBwaW5nLAogCQkJCQkgICAgbGVuLCBiYXNlX2ZsYWdzIHwKIAkJCQkJICAgICgoaSA9PSBsYXN0KSA/IFRYRF9GTEFHX0VORCA6IDApLAotCQkJCQkgICAgdG1wX21zcywgdmxhbikpCisJCQkJCSAgICB0bXBfbXNzLCB2bGFuKSkgewogCQkJCXdvdWxkX2hpdF9od2J1ZyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTY4MjgsNyArNjgzOCw3IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZG1hX2Vycm9yOgotCXRnM190eF9za2JfdW5tYXAodG5hcGksIHRuYXBpLT50eF9wcm9kLCBpKTsKKwl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCB0bmFwaS0+dHhfcHJvZCwgLS1pKTsKIAl0bmFwaS0+dHhfYnVmZmVyc1t0bmFwaS0+dHhfcHJvZF0uc2tiID0gTlVMTDsKIGRyb3A6CiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtNzI4MSw3ICs3MjkxLDggQEAKIAkJCWlmICghc2tiKQogCQkJCWNvbnRpbnVlOwogCi0JCQl0ZzNfdHhfc2tiX3VubWFwKHRuYXBpLCBpLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKTsKKwkJCXRnM190eF9za2JfdW5tYXAodG5hcGksIGksCisJCQkJCSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSk7CiAKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCX0KQEAgLTkyMDAsNyArOTIxMSw3IEBACiB7CiAJc3RydWN0IHRnMyAqdHAgPSAoc3RydWN0IHRnMyAqKSBfX29wYXF1ZTsKIAotCWlmICh0cC0+aXJxX3N5bmMpCisJaWYgKHRwLT5pcnFfc3luYyB8fCB0ZzNfZmxhZyh0cCwgUkVTRVRfVEFTS19QRU5ESU5HKSkKIAkJZ290byByZXN0YXJ0X3RpbWVyOwogCiAJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CkBAIC05MjIzLDEwICs5MjM0LDkgQEAKIAkJfQogCiAJCWlmICghKHRyMzIoV0RNQUNfTU9ERSkgJiBXRE1BQ19NT0RFX0VOQUJMRSkpIHsKLQkJCXRnM19mbGFnX3NldCh0cCwgUkVTVEFSVF9USU1FUik7CiAJCQlzcGluX3VubG9jaygmdHAtPmxvY2spOwotCQkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOwotCQkJcmV0dXJuOworCQkJdGczX3Jlc2V0X3Rhc2tfc2NoZWR1bGUodHApOworCQkJZ290byByZXN0YXJ0X3RpbWVyOwogCQl9CiAJfQogCkBAIC05Njc0LDE1ICs5Njg0LDE0IEBACiAJCXN0cnVjdCB0ZzNfbmFwaSAqdG5hcGkgPSAmdHAtPm5hcGlbaV07CiAJCWVyciA9IHRnM19yZXF1ZXN0X2lycSh0cCwgaSk7CiAJCWlmIChlcnIpIHsKLQkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJCWZvciAoaS0tOyBpID49IDA7IGktLSkgeworCQkJCXRuYXBpID0gJnRwLT5uYXBpW2ldOwogCQkJCWZyZWVfaXJxKHRuYXBpLT5pcnFfdmVjLCB0bmFwaSk7Ci0JCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gZXJyX291dDI7CiAJCX0KIAl9CiAKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXQyOwotCiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKIAllcnIgPSB0ZzNfaW5pdF9odyh0cCwgMSk7CkBAIC05NzgzLDcgKzk3OTIsNyBAQAogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXRnM19uYXBpX2Rpc2FibGUodHApOwotCWNhbmNlbF93b3JrX3N5bmMoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfcmVzZXRfdGFza19jYW5jZWwodHApOwogCiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGRldik7CiAKQEAgLTExNTIwLDcgKzExNTI5LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCXRnM190eF9za2JfdW5tYXAodG5hcGksIHRuYXBpLT50eF9wcm9kIC0gMSwgMCk7CisJdGczX3R4X3NrYl91bm1hcCh0bmFwaSwgdG5hcGktPnR4X3Byb2QgLSAxLCAtMSk7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJaWYgKHR4X2lkeCAhPSB0bmFwaS0+dHhfcHJvZCkKQEAgLTE0MjI4LDEyICsxNDIzNywzMCBAQAogCXZhbCA9IHRyMzIoTUVNQVJCX01PREUpOwogCXR3MzIoTUVNQVJCX01PREUsIHZhbCB8IE1FTUFSQl9NT0RFX0VOQUJMRSk7CiAKLQlpZiAodGczX2ZsYWcodHAsIFBDSVhfTU9ERSkpIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LAotCQkJCSAgICAgIHRwLT5wY2l4X2NhcCArIFBDSV9YX1NUQVRVUywgJnZhbCk7Ci0JCXRwLT5wY2lfZm4gPSB2YWwgJiAweDc7Ci0JfSBlbHNlIHsKLQkJdHAtPnBjaV9mbiA9IFBDSV9GVU5DKHRwLT5wZGV2LT5kZXZmbikgJiAzOworCXRwLT5wY2lfZm4gPSBQQ0lfRlVOQyh0cC0+cGRldi0+ZGV2Zm4pICYgMzsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgfHwKKwkgICAgdGczX2ZsYWcodHAsIDU3ODBfQ0xBU1MpKSB7CisJCWlmICh0ZzNfZmxhZyh0cCwgUENJWF9NT0RFKSkgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LAorCQkJCQkgICAgICB0cC0+cGNpeF9jYXAgKyBQQ0lfWF9TVEFUVVMsCisJCQkJCSAgICAgICZ2YWwpOworCQkJdHAtPnBjaV9mbiA9IHZhbCAmIDB4NzsKKwkJfQorCX0gZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcpIHsKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9DUE1VX1NUQVRVUywgJnZhbCk7CisJCWlmICgodmFsICYgTklDX1NSQU1fQ1BNVVNUQVRfU0lHX01TSykgPT0KKwkJICAgIE5JQ19TUkFNX0NQTVVTVEFUX1NJRykgeworCQkJdHAtPnBjaV9mbiA9IHZhbCAmIFRHM19DUE1VX1NUQVRVU19GTVNLXzU3MTc7CisJCQl0cC0+cGNpX2ZuID0gdHAtPnBjaV9mbiA/IDEgOiAwOworCQl9CisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSB8fAorCQkgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcyMCkgeworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0NQTVVfU1RBVFVTLCAmdmFsKTsKKwkJaWYgKCh2YWwgJiBOSUNfU1JBTV9DUE1VU1RBVF9TSUdfTVNLKSA9PQorCQkgICAgTklDX1NSQU1fQ1BNVVNUQVRfU0lHKSB7CisJCQl0cC0+cGNpX2ZuID0gKHZhbCAmIFRHM19DUE1VX1NUQVRVU19GTVNLXzU3MTkpID4+CisJCQkJICAgICBURzNfQ1BNVV9TVEFUVVNfRlNIRlRfNTcxOTsKKwkJfQogCX0KIAogCS8qIEdldCBlZXByb20gaHcgY29uZmlnIGJlZm9yZSBjYWxsaW5nIHRnM19zZXRfcG93ZXJfc3RhdGUoKS4KQEAgLTE1NjY1LDcgKzE1NjkyLDcgQEAKIAkJaWYgKHRwLT5mdykKIAkJCXJlbGVhc2VfZmlybXdhcmUodHAtPmZ3KTsKIAotCQljYW5jZWxfd29ya19zeW5jKCZ0cC0+cmVzZXRfdGFzayk7CisJCXRnM19yZXNldF90YXNrX2NhbmNlbCh0cCk7CiAKIAkJaWYgKHRnM19mbGFnKHRwLCBVU0VfUEhZTElCKSkgewogCQkJdGczX3BoeV9maW5pKHRwKTsKQEAgLTE1Njk5LDcgKzE1NzI2LDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlmbHVzaF93b3JrX3N5bmMoJnRwLT5yZXNldF90YXNrKTsKKwl0ZzNfcmVzZXRfdGFza19jYW5jZWwodHApOwogCXRnM19waHlfc3RvcCh0cCk7CiAJdGczX25ldGlmX3N0b3AodHApOwogCkBAIC0xNTgxMiwxMiArMTU4MzksMTAgQEAKIAl0ZzNfbmV0aWZfc3RvcCh0cCk7CiAKIAlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKLQl0ZzNfZmxhZ19jbGVhcih0cCwgUkVTVEFSVF9USU1FUik7CiAKIAkvKiBXYW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXNldCB0YXNrIGRvZXNuJ3QgcnVuICovCi0JY2FuY2VsX3dvcmtfc3luYygmdHAtPnJlc2V0X3Rhc2spOworCXRnM19yZXNldF90YXNrX2NhbmNlbCh0cCk7CiAJdGczX2ZsYWdfY2xlYXIodHAsIFRYX1JFQ09WRVJZX1BFTkRJTkcpOwotCXRnM19mbGFnX2NsZWFyKHRwLCBSRVNUQVJUX1RJTUVSKTsKIAogCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuaAppbmRleCBmMzJmMjg4Li45NGI0YmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuaApAQCAtMTA5NSw2ICsxMDk1LDExIEBACiAjZGVmaW5lIFRHM19DUE1VX0NMQ0tfT1JJREUJCTB4MDAwMDM2MjQKICNkZWZpbmUgIENQTVVfQ0xDS19PUklERV9NQUNfT1JJREVfRU4JIDB4ODAwMDAwMDAKIAorI2RlZmluZSBURzNfQ1BNVV9TVEFUVVMJCQkweDAwMDAzNjJjCisjZGVmaW5lICBURzNfQ1BNVV9TVEFUVVNfRk1TS181NzE3CSAweDIwMDAwMDAwCisjZGVmaW5lICBURzNfQ1BNVV9TVEFUVVNfRk1TS181NzE5CSAweGMwMDAwMDAwCisjZGVmaW5lICBURzNfQ1BNVV9TVEFUVVNfRlNIRlRfNTcxOQkgMzAKKwogI2RlZmluZSBURzNfQ1BNVV9DTENLX1NUQVQJCTB4MDAwMDM2MzAKICNkZWZpbmUgIENQTVVfQ0xDS19TVEFUX01BQ19DTENLX01BU0sJIDB4MDAxZjAwMDAKICNkZWZpbmUgIENQTVVfQ0xDS19TVEFUX01BQ19DTENLXzYyXzUJIDB4MDAwMDAwMDAKQEAgLTIxMjgsNiArMjEzMywxMCBAQAogI2RlZmluZSAgTklDX1NSQU1fUkdNSUlfRVhUX0lCTkRfUlhfRU4JIDB4MDAwMDAwMDgKICNkZWZpbmUgIE5JQ19TUkFNX1JHTUlJX0VYVF9JQk5EX1RYX0VOCSAweDAwMDAwMDEwCiAKKyNkZWZpbmUgTklDX1NSQU1fQ1BNVV9TVEFUVVMJCTB4MDAwMDBlMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0NQTVVTVEFUX1NJRwkJMHgwMDAwMzYyYworI2RlZmluZSAgTklDX1NSQU1fQ1BNVVNUQVRfU0lHX01TSwkweDAwMDBmZmZmCisKICNkZWZpbmUgTklDX1NSQU1fUlhfTUlOSV9CVUZGRVJfREVTQwkweDAwMDAxMDAwCiAKICNkZWZpbmUgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9CQVNFCTB4MDAwMDIwMDAKQEAgLTIzNDQsOSArMjM1MywxMyBAQAogI2RlZmluZSAgQVBFX1BFUl9MT0NLX0dSQU5UX0RSSVZFUgkgMHgwMDAwMTAwMAogCiAvKiBBUEUgY29udmVuaWVuY2UgZW51bWVyYXRpb25zLiAqLwotI2RlZmluZSBURzNfQVBFX0xPQ0tfR1JDICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVEczX0FQRV9MT0NLX01FTSAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRHM19BUEVfTE9DS19HUElPICAgICAgICAgICAgICAgNworI2RlZmluZSBURzNfQVBFX0xPQ0tfUEhZMAkJMAorI2RlZmluZSBURzNfQVBFX0xPQ0tfR1JDCQkxCisjZGVmaW5lIFRHM19BUEVfTE9DS19QSFkxCQkyCisjZGVmaW5lIFRHM19BUEVfTE9DS19QSFkyCQkzCisjZGVmaW5lIFRHM19BUEVfTE9DS19NRU0JCTQKKyNkZWZpbmUgVEczX0FQRV9MT0NLX1BIWTMJCTUKKyNkZWZpbmUgVEczX0FQRV9MT0NLX0dQSU8JCTcKIAogI2RlZmluZSBURzNfRUVQUk9NX1NCX0YxUjJfTUJBX09GRgkweDEwCiAKQEAgLTI4NjYsNyArMjg3OSw2IEBACiAJVEczX0ZMQUdfSlVNQk9fQ0FQQUJMRSwKIAlURzNfRkxBR19DSElQX1JFU0VUVElORywKIAlURzNfRkxBR19JTklUX0NPTVBMRVRFLAotCVRHM19GTEFHX1JFU1RBUlRfVElNRVIsCiAJVEczX0ZMQUdfVFNPX0JVRywKIAlURzNfRkxBR19JU181Nzg4LAogCVRHM19GTEFHX01BWF9SWFBFTkRfNjQsCkBAIC0yOTA5LDYgKzI5MjEsNyBAQAogCVRHM19GTEFHX0FQRV9IQVNfTkNTSSwKIAlURzNfRkxBR181NzE3X1BMVVMsCiAJVEczX0ZMQUdfNEtfRklGT19MSU1JVCwKKwlURzNfRkxBR19SRVNFVF9UQVNLX1BFTkRJTkcsCiAKIAkvKiBBZGQgbmV3IGZsYWdzIGJlZm9yZSB0aGlzIGNvbW1lbnQgYW5kIFRHM19GTEFHX05VTUJFUl9PRl9GTEFHUyAqLwogCVRHM19GTEFHX05VTUJFUl9PRl9GTEFHUywJLyogTGFzdCBlbnRyeSBpbiBlbnVtIFRHM19GTEFHUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCmluZGV4IDVkNzg3MmUuLjdmMzA5MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImJuYWQuaCIKICNpbmNsdWRlICJibmEuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvYXQ5MV9ldGhlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9hdDkxX2V0aGVyLmMKaW5kZXggMWIwYmE4Yy4uNTY2MjRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9hdDkxX2V0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9hdDkxX2V0aGVyLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwX2VtYWMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KIAogI2luY2x1ZGUgImF0OTFfZXRoZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvY3hnYjNfb2ZmbG9hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKaW5kZXggZGE1YTVkOS4uOTBmZjEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAicmVncy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9sMnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmMKaW5kZXggNDE1NDA5Ny4uNzBmZWM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9sMnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2wydC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJ0M2NkZXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvbDJ0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2wydC5jCmluZGV4IGEyZDMyM2MuLjZhYzc3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvbDJ0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9sMnQuYwpAQCAtMzcsNiArMzcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgImN4Z2I0LmgiCiAjaW5jbHVkZSAibDJ0LmgiCkBAIC01MDMsMTAgKzUwNiw2IEBACiAJcmV0dXJuIGQ7CiB9CiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQogc3RhdGljIGlubGluZSB2b2lkICpsMnRfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnRhYiA9IHNlcS0+cHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCmluZGV4IGRkYzE2OTguLjE0MDI1NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSAiY3hnYjQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL0tjb25maWcKaW5kZXggNmNiYjgxYy4uMWY4NjQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAJYm9vbCAiQ2lycnVzIGRldmljZXMiCiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBJU0EgfHwgRUlTQSB8fCBNQUNIX0lYRFAyMzUxIHx8IEFSQ0hfSVhEUDJYMDEgXAotCQl8fCBNQUNIX01YMzFBRFMgfHwgTUFDSF9RUTI0NDAgfHwgKEFSTSAmJiBBUkNIX0VQOTNYWCkKKwkJfHwgTUFDSF9NWDMxQURTIHx8IE1BQ0hfUVEyNDQwIHx8IChBUk0gJiYgQVJDSF9FUDkzWFgpIHx8IE1BQwogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCiAJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCkBAIC00Nyw0ICs0NywxNiBAQAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIGV0aGVybmV0IGhhcmR3YXJlIGluY2x1ZGVkIGluIEVQOTN4eCBDUFVzLgogCSAgU2F5IFkgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgRVA5M3h4IGJhc2VkIGRldmljZXMuCiAKK2NvbmZpZyBNQUM4OXgwCisJdHJpc3RhdGUgIk1hY2ludG9zaCBDUzg5eDAgYmFzZWQgZXRoZXJuZXQgY2FyZHMiCisJZGVwZW5kcyBvbiBNQUMKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gIElmIHlvdSBoYXZlIGEKKwkgIE51YnVzIG9yIExDLVBEUyBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZAorCSAgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGlzIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWFjODl4MC4KKwogZW5kaWYgIyBORVRfVkVORE9SX0NJUlJVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL01ha2VmaWxlCmluZGV4IDE0YmQ3N2UuLmNhMjQ1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiAKIG9iai0kKENPTkZJR19DUzg5eDApICs9IGNzODl4MC5vCiBvYmotJChDT05GSUdfRVA5M1hYX0VUSCkgKz0gZXA5M3h4X2V0aC5vCitvYmotJChDT05GSUdfTUFDODl4MCkgKz0gbWFjODl4MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9tYWM4OXgwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvbWFjODl4MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9tYWM4OXgwLmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9tYWM4OXgwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCmluZGV4IDgyNGI4ZTYuLjJjN2IzNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYwpAQCAtMzE4LDggKzMxOCw3IEBACiAKIAkJaWYgKG1zZWNzID4gNDAwMCkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAibWJveCBwb2xsIHRpbWVkIG91dFxuIik7Ci0JCQlpZiAoIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQotCQkJCWJlX2RldGVjdF9kdW1wX3VlKGFkYXB0ZXIpOworCQkJYmVfZGV0ZWN0X2R1bXBfdWUoYWRhcHRlcik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtMTU0MCw3ICsxNTM5LDE0IEBACiAKIAkJcmVxLT5pZl9mbGFnc19tYXNrID0gcmVxLT5pZl9mbGFncyA9CiAJCQkJY3B1X3RvX2xlMzIoQkVfSUZfRkxBR1NfTVVMVElDQVNUKTsKLQkJcmVxLT5tY2FzdF9udW0gPSBjcHVfdG9fbGUxNihuZXRkZXZfbWNfY291bnQoYWRhcHRlci0+bmV0ZGV2KSk7CisKKwkJLyogUmVzZXQgbWNhc3QgcHJvbWlzYyBtb2RlIGlmIGFscmVhZHkgc2V0IGJ5IHNldHRpbmcgbWFzaworCQkgKiBhbmQgbm90IHNldHRpbmcgZmxhZ3MgZmllbGQKKwkJICovCisJCXJlcS0+aWZfZmxhZ3NfbWFzayB8PQorCQkJCWNwdV90b19sZTMyKEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTKTsKKworCQlyZXEtPm1jYXN0X251bSA9IGNwdV90b19sZTMyKG5ldGRldl9tY19jb3VudChhZGFwdGVyLT5uZXRkZXYpKTsKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGFkYXB0ZXItPm5ldGRldikKIAkJCW1lbWNweShyZXEtPm1jYXN0X21hY1tpKytdLmJ5dGUsIGhhLT5hZGRyLCBFVEhfQUxFTik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAppbmRleCBmYmM4YTkxLi5mMmM4OWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaApAQCAtNDgsNiArNDgsOCBAQAogLyogTGFuY2VyIFNMSVBPUlRfQ09OVFJPTCBTTElQT1JUX1NUQVRVUyByZWdpc3RlcnMgKi8KICNkZWZpbmUgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUCQkweDQwNAogI2RlZmluZSBTTElQT1JUX0NPTlRST0xfT0ZGU0VUCQkweDQwOAorI2RlZmluZSBTTElQT1JUX0VSUk9SMV9PRkZTRVQJCTB4NDBDCisjZGVmaW5lIFNMSVBPUlRfRVJST1IyX09GRlNFVAkJMHg0MTAKIAogI2RlZmluZSBTTElQT1JUX1NUQVRVU19FUlJfTUFTSwkJMHg4MDAwMDAwMAogI2RlZmluZSBTTElQT1JUX1NUQVRVU19STl9NQVNLCQkweDAxMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwppbmRleCAyMTgwNDk3Li5iZjI2NmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJiZS5oIgogI2luY2x1ZGUgImJlX2NtZHMuaCIKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTE5MDUsNiArMTkwNiw4IEBACiAJCWJlX3J4X3N0YXRzX3VwZGF0ZShyeG8sIHJ4Y3ApOwogCX0KIAorCWJlX2NxX25vdGlmeShhZGFwdGVyLCByeF9jcS0+aWQsIGZhbHNlLCB3b3JrX2RvbmUpOworCiAJLyogUmVmaWxsIHRoZSBxdWV1ZSAqLwogCWlmICh3b3JrX2RvbmUgJiYgYXRvbWljX3JlYWQoJnJ4by0+cS51c2VkKSA8IFJYX0ZSQUdTX1JFRklMTF9XTSkKIAkJYmVfcG9zdF9yeF9mcmFncyhyeG8sIEdGUF9BVE9NSUMpOwpAQCAtMTkxMiwxMCArMTkxNSw4IEBACiAJLyogQWxsIGNvbnN1bWVkICovCiAJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgewogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwotCQliZV9jcV9ub3RpZnkoYWRhcHRlciwgcnhfY3EtPmlkLCB0cnVlLCB3b3JrX2RvbmUpOwotCX0gZWxzZSB7Ci0JCS8qIE1vcmUgdG8gYmUgY29uc3VtZWQ7IGNvbnRpbnVlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLwotCQliZV9jcV9ub3RpZnkoYWRhcHRlciwgcnhfY3EtPmlkLCBmYWxzZSwgd29ya19kb25lKTsKKwkJLyogQXJtIENRICovCisJCWJlX2NxX25vdGlmeShhZGFwdGVyLCByeF9jcS0+aWQsIHRydWUsIDApOwogCX0KIAlyZXR1cm4gd29ya19kb25lOwogfQpAQCAtMTk3Nyw0MiArMTk3OCw2MiBAQAogCiB2b2lkIGJlX2RldGVjdF9kdW1wX3VlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCXUzMiB1ZV9zdGF0dXNfbG8sIHVlX3N0YXR1c19oaSwgdWVfc3RhdHVzX2xvX21hc2ssIHVlX3N0YXR1c19oaV9tYXNrOworCXUzMiB1ZV9sbyA9IDAsIHVlX2hpID0gMCwgdWVfbG9fbWFzayA9IDAsIHVlX2hpX21hc2sgPSAwOworCXUzMiBzbGlwb3J0X3N0YXR1cyA9IDAsIHNsaXBvcnRfZXJyMSA9IDAsIHNsaXBvcnRfZXJyMiA9IDA7CiAJdTMyIGk7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPVywgJnVlX3N0YXR1c19sbyk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCi0JCQkJUENJQ0ZHX1VFX1NUQVRVU19ISUdILCAmdWVfc3RhdHVzX2hpKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLLCAmdWVfc3RhdHVzX2xvX21hc2spOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCVBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX3N0YXR1c19oaV9tYXNrKTsKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJc2xpcG9ydF9zdGF0dXMgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArIFNMSVBPUlRfU1RBVFVTX09GRlNFVCk7CisJCWlmIChzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX0VSUl9NQVNLKSB7CisJCQlzbGlwb3J0X2VycjEgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArCisJCQkJCVNMSVBPUlRfRVJST1IxX09GRlNFVCk7CisJCQlzbGlwb3J0X2VycjIgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArCisJCQkJCVNMSVBPUlRfRVJST1IyX09GRlNFVCk7CisJCX0KKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKKwkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPVywgJnVlX2xvKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCisJCQkJUENJQ0ZHX1VFX1NUQVRVU19ISUdILCAmdWVfaGkpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKKwkJCQlQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLLCAmdWVfbG9fbWFzayk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAorCQkJCVBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX2hpX21hc2spOwogCi0JdWVfc3RhdHVzX2xvID0gKHVlX3N0YXR1c19sbyAmICh+dWVfc3RhdHVzX2xvX21hc2spKTsKLQl1ZV9zdGF0dXNfaGkgPSAodWVfc3RhdHVzX2hpICYgKH51ZV9zdGF0dXNfaGlfbWFzaykpOworCQl1ZV9sbyA9ICh1ZV9sbyAmICh+dWVfbG9fbWFzaykpOworCQl1ZV9oaSA9ICh1ZV9oaSAmICh+dWVfaGlfbWFzaykpOworCX0KIAotCWlmICh1ZV9zdGF0dXNfbG8gfHwgdWVfc3RhdHVzX2hpKSB7CisJaWYgKHVlX2xvIHx8IHVlX2hpIHx8CisJCXNsaXBvcnRfc3RhdHVzICYgU0xJUE9SVF9TVEFUVVNfRVJSX01BU0spIHsKIAkJYWRhcHRlci0+dWVfZGV0ZWN0ZWQgPSB0cnVlOwogCQlhZGFwdGVyLT5lZWhfZXJyID0gdHJ1ZTsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVUUgRGV0ZWN0ZWQhIVxuIik7CiAJfQogCi0JaWYgKHVlX3N0YXR1c19sbykgewotCQlmb3IgKGkgPSAwOyB1ZV9zdGF0dXNfbG87IHVlX3N0YXR1c19sbyA+Pj0gMSwgaSsrKSB7Ci0JCQlpZiAodWVfc3RhdHVzX2xvICYgMSkKKwlpZiAodWVfbG8pIHsKKwkJZm9yIChpID0gMDsgdWVfbG87IHVlX2xvID4+PSAxLCBpKyspIHsKKwkJCWlmICh1ZV9sbyAmIDEpCiAJCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJVRTogJXMgYml0IHNldFxuIiwgdWVfc3RhdHVzX2xvd19kZXNjW2ldKTsKIAkJfQogCX0KLQlpZiAodWVfc3RhdHVzX2hpKSB7Ci0JCWZvciAoaSA9IDA7IHVlX3N0YXR1c19oaTsgdWVfc3RhdHVzX2hpID4+PSAxLCBpKyspIHsKLQkJCWlmICh1ZV9zdGF0dXNfaGkgJiAxKQorCWlmICh1ZV9oaSkgeworCQlmb3IgKGkgPSAwOyB1ZV9oaTsgdWVfaGkgPj49IDEsIGkrKykgeworCQkJaWYgKHVlX2hpICYgMSkKIAkJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIlVFOiAlcyBiaXQgc2V0XG4iLCB1ZV9zdGF0dXNfaGlfZGVzY1tpXSk7CiAJCX0KIAl9CiAKKwlpZiAoc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkic2xpcG9ydCBzdGF0dXMgMHgleFxuIiwgc2xpcG9ydF9zdGF0dXMpOworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkic2xpcG9ydCBlcnJvcjEgMHgleFxuIiwgc2xpcG9ydF9lcnIxKTsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJInNsaXBvcnQgZXJyb3IyIDB4JXhcbiIsIHNsaXBvcnRfZXJyMik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBiZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMjAyMiw3ICsyMDQzLDcgQEAKIAlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CiAJaW50IGk7CiAKLQlpZiAoIWFkYXB0ZXItPnVlX2RldGVjdGVkICYmICFsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwlpZiAoIWFkYXB0ZXItPnVlX2RldGVjdGVkKQogCQliZV9kZXRlY3RfZHVtcF91ZShhZGFwdGVyKTsKIAogCS8qIHdoZW4gaW50ZXJydXB0cyBhcmUgbm90IHlldCBlbmFibGVkLCBqdXN0IHJlYXAgYW55IHBlbmRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCmluZGV4IGJkYjM0OGEuLjI1MWI2MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2V0aG9jLmg+CiAKIHN0YXRpYyBpbnQgYnVmZmVyX3NpemUgPSAweDgwMDA7IC8qIDMyIEtCeXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZwppbmRleCAxY2Y2NzE2Li5jNTIwY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZwpAQCAtNyw4ICs3LDcgQEAKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEZTTF9TT0MgfHwgUVVJQ0NfRU5HSU5FIHx8IENQTTEgfHwgQ1BNMiB8fCBQUENfTVBDNTEyeCB8fCBcCiAJCSAgIE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4IHx8IE01MzJ4IHx8IFwKLQkJICAgQVJDSF9NWEMgfHwgQVJDSF9NWFMgfHwgXAotCQkgICAoUFBDX01QQzUyeHggJiYgUFBDX0JFU1RDT01NKQorCQkgICBBUkNIX01YQyB8fCBBUkNIX01YUyB8fCAoUFBDX01QQzUyeHggJiYgUFBDX0JFU1RDT01NKQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCiAJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCmluZGV4IDQ2ZDY5MGEuLmI1ZGMwMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC8zYzUwNS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzNjNTA1LmMKaW5kZXggNDBlMWExNy4uYmE4MmEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzNjNTA1LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzNjNTA1LmMKQEAgLTEyNiwxNSArMTI2LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBmaWxlbmFtZSBfX0ZJTEVfXwotCiAjZGVmaW5lIHRpbWVvdXRfbXNnICIqKiogdGltZW91dCBhdCAlczolcyAobGluZSAlZCkgKioqXG4iCiAjZGVmaW5lIFRJTUVPVVRfTVNHKGxpbmVubykgXAotCXByX25vdGljZSh0aW1lb3V0X21zZywgZmlsZW5hbWUsIF9fZnVuY19fLCAobGluZW5vKSkKKwlwcl9ub3RpY2UodGltZW91dF9tc2csIF9fRklMRV9fLCBfX2Z1bmNfXywgKGxpbmVubykpCiAKICNkZWZpbmUgaW52YWxpZF9wY2JfbXNnICIqKiogaW52YWxpZCBwY2IgbGVuZ3RoICVkIGF0ICVzOiVzIChsaW5lICVkKSAqKipcbiIKICNkZWZpbmUgSU5WQUxJRF9QQ0JfTVNHKGxlbikgXAotCXByX25vdGljZShpbnZhbGlkX3BjYl9tc2csIChsZW4pLCBmaWxlbmFtZSwgX19mdW5jX18sIF9fTElORV9fKQorCXByX25vdGljZShpbnZhbGlkX3BjYl9tc2csIChsZW4pLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKQogCiAjZGVmaW5lIHNlYXJjaF9tc2cgIiVzOiBMb29raW5nIGZvciAzYzUwNSBhZGFwdGVyIGF0IGFkZHJlc3MgJSN4Li4uIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvS2NvbmZpZwppbmRleCA2MTAyOWRjLi43NjIxMzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL0tjb25maWcKQEAgLTUsNyArNSwxMSBAQAogY29uZmlnIE5FVF9WRU5ET1JfSU5URUwKIAlib29sICJJbnRlbCBkZXZpY2VzIgogCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gUENJIHx8IFBDSV9NU0kKKwlkZXBlbmRzIG9uIFBDSSB8fCBQQ0lfTVNJIHx8IElTQSB8fCBJU0FfRE1BX0FQSSB8fCBBUk0gfHwgXAorCQkgICBBUkNIX0FDT1JOIHx8IE1DQSB8fCBNQ0FfTEVHQUNZIHx8IFNOSV9STSB8fCBTVU4zIHx8IFwKKwkJICAgR1NDIHx8IEJWTUU2MDAwIHx8IE1WTUUxNnggfHwgQVJDSF9FTlAyNjExIHx8IFwKKwkJICAgKEFSTSAmJiBBUkNIX0lYUDRYWCAmJiBJWFA0WFhfTlBFICYmIElYUDRYWF9RTUdSKSB8fCBcCisJCSAgIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCiAJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKaW5kZXggYWUxN2NkMS4uNWEyZmRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYwpAQCAtMjgxMCw2ICsyODEwLDEwIEBACiAKIAllMTAwX2dldF9kZWZhdWx0cyhuaWMpOwogCisJLyogRDEwMCBNQUMgZG9lc24ndCBhbGxvdyByeCBvZiB2bGFuIHBhY2tldHMgd2l0aCBub3JtYWwgTVRVICovCisJaWYgKG5pYy0+bWFjIDwgbWFjXzgyNTU4X0QxMDFfQTQpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisKIAkvKiBsb2NrcyBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGh3X3Jlc2V0ICovCiAJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y2JfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y21kX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggNmExN2M2Mi4uZTJhODBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCkBAIC04NjYsOCArODY2LDcgQEAKIAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KF9fRTEwMDBfQUNDRVNTX1NIQVJFRF9SRVNPVVJDRSwKIAkJCSAgICAgJmh3LT5hZGFwdGVyLT5zdGF0ZSkpIHsKLQkJV0FSTigxLCAiZTEwMDBlOiAlczogY29udGVudGlvbiBmb3IgUGh5IGFjY2Vzc1xuIiwKLQkJICAgICBody0+YWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKKwkJZV9kYmcoImNvbnRlbnRpb24gZm9yIFBoeSBhY2Nlc3NcbiIpOwogCQlyZXR1cm4gLUUxMDAwX0VSUl9QSFk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wYXJhbS5jCmluZGV4IDRkZDliNjMuLjIwZTkzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wYXJhbS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wYXJhbS5jCkBAIC0yNyw2ICsyNyw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlICJlMTAwMC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3BoeS5jCmluZGV4IDdlZGYzMWUuLmIxN2Q3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9waHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcGh5LmMKQEAgLTE2ODcsNyArMTY4Nyw3IEBACiAJCWlmIChyZXRfdmFsKQogCQkJZ290byBvdXQ7CiAKLQkJaXNfY20gPSAhKHBoeV9kYXRhICYgSTM0N0FUNF9QQ0RDX0NBQkxFX0xFTkdUSF9VTklUKTsKKwkJaXNfY20gPSAhKHBoeV9kYXRhMiAmIEkzNDdBVDRfUENEQ19DQUJMRV9MRU5HVEhfVU5JVCk7CiAKIAkJLyogUG9wdWxhdGUgdGhlIHBoeSBzdHJ1Y3R1cmUgd2l0aCBjYWJsZSBsZW5ndGggaW4gbWV0ZXJzICovCiAJCXBoeS0+bWluX2NhYmxlX2xlbmd0aCA9IHBoeV9kYXRhIC8gKGlzX2NtID8gMTAwIDogMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCmluZGV4IDgzNGYwNDQuLmYxMzY1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jCkBAIC0zMzQ0LDcgKzMzNDQsNyBAQAogc3RhdGljIHMzMiBpeGdiZV9ob3N0X2ludGVyZmFjZV9jb21tYW5kKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiAqYnVmZmVyLAogCQkJCQl1MzIgbGVuZ3RoKQogewotCXUzMiBoaWNyLCBpOworCXUzMiBoaWNyLCBpLCBiaTsKIAl1MzIgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JlX2hpY19oZHIpOwogCXU4IGJ1Zl9sZW4sIGR3b3JkX2xlbjsKIApAQCAtMzM5OCw5ICszMzk4LDkgQEAKIAlkd29yZF9sZW4gPSBoZHJfc2l6ZSA+PiAyOwogCiAJLyogZmlyc3QgcHVsbCBpbiB0aGUgaGVhZGVyIHNvIHdlIGtub3cgdGhlIGJ1ZmZlciBsZW5ndGggKi8KLQlmb3IgKGkgPSAwOyBpIDwgZHdvcmRfbGVuOyBpKyspIHsKLQkJYnVmZmVyW2ldID0gSVhHQkVfUkVBRF9SRUdfQVJSQVkoaHcsIElYR0JFX0ZMRVhfTU5HLCBpKTsKLQkJbGUzMl90b19jcHVzKCZidWZmZXJbaV0pOworCWZvciAoYmkgPSAwOyBiaSA8IGR3b3JkX2xlbjsgYmkrKykgeworCQlidWZmZXJbYmldID0gSVhHQkVfUkVBRF9SRUdfQVJSQVkoaHcsIElYR0JFX0ZMRVhfTU5HLCBiaSk7CisJCWxlMzJfdG9fY3B1cygmYnVmZmVyW2JpXSk7CiAJfQogCiAJLyogSWYgdGhlcmUgaXMgYW55IHRoaW5nIGluIGRhdGEgcG9zaXRpb24gcHVsbCBpdCBpbiAqLwpAQCAtMzQxNCwxMiArMzQxNCwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBDYWxjdWxhdGUgbGVuZ3RoIGluIERXT1JEcywgYWRkIG9uZSBmb3Igb2RkIGxlbmd0aHMgKi8KLQlkd29yZF9sZW4gPSAoYnVmX2xlbiArIDEpID4+IDI7CisJLyogQ2FsY3VsYXRlIGxlbmd0aCBpbiBEV09SRHMsIGFkZCAzIGZvciBvZGQgbGVuZ3RocyAqLworCWR3b3JkX2xlbiA9IChidWZfbGVuICsgMykgPj4gMjsKIAotCS8qIFB1bGwgaW4gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAoaSBpcyB3aGVyZSB3ZSBsZWZ0IG9mZikqLwotCWZvciAoOyBpIDwgYnVmX2xlbjsgaSsrKQotCQlidWZmZXJbaV0gPSBJWEdCRV9SRUFEX1JFR19BUlJBWShodywgSVhHQkVfRkxFWF9NTkcsIGkpOworCS8qIFB1bGwgaW4gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAoYmkgaXMgd2hlcmUgd2UgbGVmdCBvZmYpKi8KKwlmb3IgKDsgYmkgPD0gZHdvcmRfbGVuOyBiaSsrKSB7CisJCWJ1ZmZlcltiaV0gPSBJWEdCRV9SRUFEX1JFR19BUlJBWShodywgSVhHQkVfRkxFWF9NTkcsIGJpKTsKKwkJbGUzMl90b19jcHVzKCZidWZmZXJbYmldKTsKKwl9CiAKIG91dDoKIAlyZXR1cm4gcmV0X3ZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2RjYl9ubC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiX25sLmMKaW5kZXggMzYzMWQ2My4uMzNiOTNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiX25sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiX25sLmMKQEAgLTU2MSwxMSArNTYxLDEyIEBACiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlX2V0cyAqbXlfZXRzID0gYWRhcHRlci0+aXhnYmVfaWVlZV9ldHM7CiAKKwlldHMtPmV0c19jYXAgPSBhZGFwdGVyLT5kY2JfY2ZnLm51bV90Y3MucGdfdGNzOworCiAJLyogTm8gSUVFRSBQRkMgc2V0dGluZ3MgYXZhaWxhYmxlICovCiAJaWYgKCFteV9ldHMpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAotCWV0cy0+ZXRzX2NhcCA9IGFkYXB0ZXItPmRjYl9jZmcubnVtX3Rjcy5wZ190Y3M7CiAJZXRzLT5jYnMgPSBteV9ldHMtPmNiczsKIAltZW1jcHkoZXRzLT50Y190eF9idywgbXlfZXRzLT50Y190eF9idywgc2l6ZW9mKGV0cy0+dGNfdHhfYncpKTsKIAltZW1jcHkoZXRzLT50Y19yeF9idywgbXlfZXRzLT50Y19yeF9idywgc2l6ZW9mKGV0cy0+dGNfcnhfYncpKTsKQEAgLTYyMSwxMSArNjIyLDEyIEBACiAJc3RydWN0IGllZWVfcGZjICpteV9wZmMgPSBhZGFwdGVyLT5peGdiZV9pZWVlX3BmYzsKIAlpbnQgaTsKIAorCXBmYy0+cGZjX2NhcCA9IGFkYXB0ZXItPmRjYl9jZmcubnVtX3Rjcy5wZmNfdGNzOworCiAJLyogTm8gSUVFRSBQRkMgc2V0dGluZ3MgYXZhaWxhYmxlICovCiAJaWYgKCFteV9wZmMpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAotCXBmYy0+cGZjX2NhcCA9IGFkYXB0ZXItPmRjYl9jZmcubnVtX3Rjcy5wZmNfdGNzOwogCXBmYy0+cGZjX2VuID0gbXlfcGZjLT5wZmNfZW47CiAJcGZjLT5tYmMgPSBteV9wZmMtPm1iYzsKIAlwZmMtPmRlbGF5ID0gbXlfcGZjLT5kZWxheTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCAwOWI4ZTg4Li44ZWY5MmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC0zMzQ1LDM0ICszMzQ1LDI1IEBACiAKIAlody0+bWFjLm9wcy5zZXRfdmZ0YSgmYWRhcHRlci0+aHcsIDAsIDAsIHRydWUpOwogCisjaWZkZWYgSVhHQkVfRkNPRQorCWlmIChhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GQ09FX01UVSkKKwkJbWF4X2ZyYW1lID0gbWF4KG1heF9mcmFtZSwgSVhHQkVfRkNPRV9KVU1CT19GUkFNRV9TSVpFKTsKKyNlbmRpZgorCiAJLyogcmVjb25maWd1cmUgdGhlIGhhcmR3YXJlICovCiAJaWYgKGFkYXB0ZXItPmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpIHsKLSNpZmRlZiBJWEdCRV9GQ09FCi0JCWlmIChhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GQ09FX01UVSkKLQkJCW1heF9mcmFtZSA9IG1heChtYXhfZnJhbWUsIElYR0JFX0ZDT0VfSlVNQk9fRlJBTUVfU0laRSk7Ci0jZW5kaWYKIAkJaXhnYmVfZGNiX2NhbGN1bGF0ZV90Y19jcmVkaXRzKGh3LCAmYWRhcHRlci0+ZGNiX2NmZywgbWF4X2ZyYW1lLAogCQkJCQkJRENCX1RYX0NPTkZJRyk7CiAJCWl4Z2JlX2RjYl9jYWxjdWxhdGVfdGNfY3JlZGl0cyhodywgJmFkYXB0ZXItPmRjYl9jZmcsIG1heF9mcmFtZSwKIAkJCQkJCURDQl9SWF9DT05GSUcpOwogCQlpeGdiZV9kY2JfaHdfY29uZmlnKGh3LCAmYWRhcHRlci0+ZGNiX2NmZyk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQotCQlpZiAoYWRhcHRlci0+aXhnYmVfaWVlZV9ldHMpIHsKLQkJCXN0cnVjdCBpZWVlX2V0cyAqZXRzID0gYWRhcHRlci0+aXhnYmVfaWVlZV9ldHM7Ci0JCQlpbnQgbWF4X2ZyYW1lID0gZGV2LT5tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOOwotCi0JCQlpeGdiZV9kY2JfaHdfZXRzKCZhZGFwdGVyLT5odywgZXRzLCBtYXhfZnJhbWUpOwotCQl9Ci0KLQkJaWYgKGFkYXB0ZXItPml4Z2JlX2llZWVfcGZjKSB7Ci0JCQlzdHJ1Y3QgaWVlZV9wZmMgKnBmYyA9IGFkYXB0ZXItPml4Z2JlX2llZWVfcGZjOwotCQkJdTggKnByaW9fdGMgPSBhZGFwdGVyLT5peGdiZV9pZWVlX2V0cy0+cHJpb190YzsKLQotCQkJaXhnYmVfZGNiX2h3X3BmY19jb25maWcoJmFkYXB0ZXItPmh3LCBwZmMtPnBmY19lbiwKLQkJCQkJCXByaW9fdGMpOwotCQl9CisJfSBlbHNlIGlmIChhZGFwdGVyLT5peGdiZV9pZWVlX2V0cyAmJiBhZGFwdGVyLT5peGdiZV9pZWVlX3BmYykgeworCQlpeGdiZV9kY2JfaHdfZXRzKCZhZGFwdGVyLT5odywKKwkJCQkgYWRhcHRlci0+aXhnYmVfaWVlZV9ldHMsCisJCQkJIG1heF9mcmFtZSk7CisJCWl4Z2JlX2RjYl9od19wZmNfY29uZmlnKCZhZGFwdGVyLT5odywKKwkJCQkJYWRhcHRlci0+aXhnYmVfaWVlZV9wZmMtPnBmY19lbiwKKwkJCQkJYWRhcHRlci0+aXhnYmVfaWVlZV9ldHMtPnByaW9fdGMpOwogCX0KIAogCS8qIEVuYWJsZSBSU1MgSGFzaCBwZXIgVEMgKi8KQEAgLTYxMjUsNyArNjExNiw2IEBACiAJYXV0b25lZyA9IGh3LT5waHkuYXV0b25lZ19hZHZlcnRpc2VkOwogCWlmICgoIWF1dG9uZWcpICYmIChody0+bWFjLm9wcy5nZXRfbGlua19jYXBhYmlsaXRpZXMpKQogCQlody0+bWFjLm9wcy5nZXRfbGlua19jYXBhYmlsaXRpZXMoaHcsICZhdXRvbmVnLCAmbmVnb3RpYXRpb24pOwotCWh3LT5tYWMuYXV0b3RyeV9yZXN0YXJ0ID0gZmFsc2U7CiAJaWYgKGh3LT5tYWMub3BzLnNldHVwX2xpbmspCiAJCWh3LT5tYWMub3BzLnNldHVwX2xpbmsoaHcsIGF1dG9uZWcsIG5lZ290aWF0aW9uLCB0cnVlKTsKIApAQCAtNzU4OSwxMyArNzU3OSw2IEBACiAJCWdvdG8gZXJyX2VlcHJvbTsKIAl9CiAKLQkvKiBwb3dlciBkb3duIHRoZSBvcHRpY3MgZm9yIG11bHRpc3BlZWQgZmliZXIgYW5kIDgyNTk5IFNGUCsgZmliZXIgKi8KLQlpZiAoaHctPm1hYy5vcHMuZGlzYWJsZV90eF9sYXNlciAmJgotCSAgICAoKGh3LT5waHkubXVsdGlzcGVlZF9maWJlcikgfHwKLQkgICAgICgoaHctPm1hYy5vcHMuZ2V0X21lZGlhX3R5cGUoaHcpID09IGl4Z2JlX21lZGlhX3R5cGVfZmliZXIpICYmCi0JICAgICAgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OTlFQikpKSkKLQkJaHctPm1hYy5vcHMuZGlzYWJsZV90eF9sYXNlcihodyk7Ci0KIAlzZXR1cF90aW1lcigmYWRhcHRlci0+c2VydmljZV90aW1lciwgJml4Z2JlX3NlcnZpY2VfdGltZXIsCiAJICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXIpOwogCkBAIC03NjkzLDYgKzc2NzYsMTMgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9yZWdpc3RlcjsKIAorCS8qIHBvd2VyIGRvd24gdGhlIG9wdGljcyBmb3IgbXVsdGlzcGVlZCBmaWJlciBhbmQgODI1OTkgU0ZQKyBmaWJlciAqLworCWlmIChody0+bWFjLm9wcy5kaXNhYmxlX3R4X2xhc2VyICYmCisJICAgICgoaHctPnBoeS5tdWx0aXNwZWVkX2ZpYmVyKSB8fAorCSAgICAgKChody0+bWFjLm9wcy5nZXRfbWVkaWFfdHlwZShodykgPT0gaXhnYmVfbWVkaWFfdHlwZV9maWJlcikgJiYKKwkgICAgICAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY184MjU5OUVCKSkpKQorCQlody0+bWFjLm9wcy5kaXNhYmxlX3R4X2xhc2VyKGh3KTsKKwogCS8qIGNhcnJpZXIgb2ZmIHJlcG9ydGluZyBpcyBpbXBvcnRhbnQgdG8gZXRodG9vbCBldmVuIEJFRk9SRSBvcGVuICovCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKaW5kZXggZGI5NTczMS4uMDBmY2QzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCkBAIC00NDIsMTIgKzQ0MiwxNCBAQAogCiBpbnQgaXhnYmVfY2hlY2tfdmZfYXNzaWdubWVudChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKyNpZmRlZiBDT05GSUdfUENJX0lPVgogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fdmZzOyBpKyspIHsKIAkJaWYgKGFkYXB0ZXItPnZmaW5mb1tpXS52ZmRldi0+ZGV2X2ZsYWdzICYKIAkJCQlQQ0lfREVWX0ZMQUdTX0FTU0lHTkVEKQogCQkJcmV0dXJuIHRydWU7CiAJfQorI2VuZGlmCiAJcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaAppbmRleCA1YTdlMWViLi5kZjA0ZjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKQEAgLTQzLDkgKzQzLDExIEBACiAJCQkgICAgaW50IHZmLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpOwogdm9pZCBpeGdiZV9jaGVja192Zl9yYXRlX2xpbWl0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgaXhnYmVfZGlzYWJsZV9zcmlvdihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CitpbnQgaXhnYmVfY2hlY2tfdmZfYXNzaWdubWVudChzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CisjaWZkZWYgQ09ORklHX1BDSV9JT1YKIHZvaWQgaXhnYmVfZW5hYmxlX3NyaW92KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJY29uc3Qgc3RydWN0IGl4Z2JlX2luZm8gKmlpKTsKLWludCBpeGdiZV9jaGVja192Zl9hc3NpZ25tZW50KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKKyNlbmRpZgogCiAKICNlbmRpZiAvKiBfSVhHQkVfU1JJT1ZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCmluZGV4IDVlOTJjYzIuLjRjOGUxOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYwpAQCAtNTQsNyArNTQsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgaXhnYmV2Zl9kcml2ZXJfc3RyaW5nW10gPQogCSJJbnRlbChSKSAxMCBHaWdhYml0IFBDSSBFeHByZXNzIFZpcnR1YWwgRnVuY3Rpb24gTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjEuMC1rIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4yLjAtayIKIGNvbnN0IGNoYXIgaXhnYmV2Zl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY2hhciBpeGdiZXZmX2NvcHlyaWdodFtdID0KIAkiQ29weXJpZ2h0IChjKSAyMDA5IC0gMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYwppbmRleCBjYmQwMjZmLi5mZGM2YzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYwpAQCAtMzY2LDE3ICszNjYsNiBAQAogCQkJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRkVfU1BFQ18yLCBzcGVjKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChody0+Y2hpcF9pZCA+PSBDSElQX0lEX1lVS09OX09QVCkgewotCQkJCXUxNiBjdHJsMiA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTF8yKTsKLQotCQkJCS8qIGVuYWJsZSBQSFkgUmV2ZXJzZSBBdXRvLU5lZ290aWF0aW9uICovCi0JCQkJY3RybDIgfD0gMXUgPDwgMTM7Ci0KLQkJCQkvKiBXcml0ZSBQSFkgY2hhbmdlcyAoU1ctcmVzZXQgbXVzdCBmb2xsb3cpICovCi0JCQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTF8yLCBjdHJsMik7Ci0JCQl9Ci0KLQogCQkJLyogZGlzYWJsZSBlbmVyZ3kgZGV0ZWN0ICovCiAJCQljdHJsICY9IH5QSFlfTV9QQ19FTl9ERVRfTVNLOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2FsbG9jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2FsbG9jLmMKaW5kZXggMTE2Y2FlMy4uOGJlMjBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9hbGxvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvYWxsb2MuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NhdGFzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NhdGFzLmMKaW5kZXggMzJmOTQ3MS4uNDVhZWE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jYXRhcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY2F0YXMuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIm1seDQuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKaW5kZXggMjNjZWU3Yi4uNzhmNWExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMKaW5kZXggYmQ4ZWY5Zi4uNDk5YTUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYwpAQCAtMzUsNiArMzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCmluZGV4IDkwZjJjZDIuLmQ5MDFiNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJtbHg0X2VuLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwppbmRleCAxYWQxZjYwLi4yNGVlOTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCkBAIC00ODQsNyArNDg1LDcgQEAKIAogCW1seDRfbXR0X2NsZWFudXAoZGV2LCAmZXEtPm10dCk7CiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAorCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKIAkJCQkgICAgZXEtPnBhZ2VfbGlzdFtpXS5idWYsCiAJCQkJICAgIGVxLT5wYWdlX2xpc3RbaV0ubWFwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCmluZGV4IGVkNDUyZGQuLjQzNWNhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogCiAjaW5jbHVkZSAiZncuaCIKQEAgLTIwNSw2ICsyMDYsOCBAQAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9NQ0dfT0ZGU0VUCQkweDYzCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUlNWRF9QRF9PRkZTRVQJCTB4NjQKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfUERfT0ZGU0VUCQkweDY1CisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUlNWRF9YUkNfT0ZGU0VUCQkweDY2CisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX1hSQ19PRkZTRVQJCTB4NjcKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfQ09VTlRFUlNfT0ZGU0VUCTB4NjgKICNkZWZpbmUgUVVFUllfREVWX0NBUF9SRE1BUkNfRU5UUllfU1pfT0ZGU0VUCTB4ODAKICNkZWZpbmUgUVVFUllfREVWX0NBUF9RUENfRU5UUllfU1pfT0ZGU0VUCTB4ODIKQEAgLTMxOSw2ICszMjIsMTAgQEAKIAlkZXZfY2FwLT5yZXNlcnZlZF9wZHMgPSBmaWVsZCA+PiA0OwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTUFYX1BEX09GRlNFVCk7CiAJZGV2X2NhcC0+bWF4X3BkcyA9IDEgPDwgKGZpZWxkICYgMHgzZik7CisJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9SU1ZEX1hSQ19PRkZTRVQpOworCWRldl9jYXAtPnJlc2VydmVkX3hyY2RzID0gZmllbGQgPj4gNDsKKwlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX01BWF9QRF9PRkZTRVQpOworCWRldl9jYXAtPm1heF94cmNkcyA9IDEgPDwgKGZpZWxkICYgMHgxZik7CiAKIAlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUkRNQVJDX0VOVFJZX1NaX09GRlNFVCk7CiAJZGV2X2NhcC0+cmRtYXJjX2VudHJ5X3N6ID0gc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaAppbmRleCAxZThlY2MzLi5iZjVlYzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCkBAIC05Myw2ICs5Myw4IEBACiAJaW50IG1heF9tY2dzOwogCWludCByZXNlcnZlZF9wZHM7CiAJaW50IG1heF9wZHM7CisJaW50IHJlc2VydmVkX3hyY2RzOworCWludCBtYXhfeHJjZHM7CiAJaW50IHFwY19lbnRyeV9zejsKIAlpbnQgcmRtYXJjX2VudHJ5X3N6OwogCWludCBhbHRjX2VudHJ5X3N6OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9pbnRmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYwppbmRleCA3M2M5NGZjLi5jYTZmZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJtbHg0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKaW5kZXggZjBlZTM1ZC4uOTRiYmM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKQEAgLTk2LDYgKzk2LDggQEAKIHN0YXRpYyBpbnQgbG9nX251bV92bGFuOwogbW9kdWxlX3BhcmFtX25hbWVkKGxvZ19udW1fdmxhbiwgbG9nX251bV92bGFuLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhsb2dfbnVtX3ZsYW4sICJMb2cyIG1heCBudW1iZXIgb2YgVkxBTnMgcGVyIEVUSCBwb3J0ICgwLTcpIik7CisvKiBMb2cyIG1heCBudW1iZXIgb2YgVkxBTnMgcGVyIEVUSCBwb3J0ICgwLTcpICovCisjZGVmaW5lIE1MWDRfTE9HX05VTV9WTEFOUyA3CiAKIHN0YXRpYyBpbnQgdXNlX3ByaW87CiBtb2R1bGVfcGFyYW1fbmFtZWQodXNlX3ByaW8sIHVzZV9wcmlvLCBib29sLCAwNDQ0KTsKQEAgLTIyMCw2ICsyMjIsMTAgQEAKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfbXJ3cwkgICAgID0gZGV2X2NhcC0+cmVzZXJ2ZWRfbXJ3czsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfdWFycwkgICAgID0gZGV2X2NhcC0+cmVzZXJ2ZWRfdWFyczsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfcGRzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9wZHM7CisJZGV2LT5jYXBzLnJlc2VydmVkX3hyY2RzICAgICA9IChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpID8KKwkJCQkJZGV2X2NhcC0+cmVzZXJ2ZWRfeHJjZHMgOiAwOworCWRldi0+Y2Fwcy5tYXhfeHJjZHMgICAgICAgICAgPSAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDKSA/CisJCQkJCWRldl9jYXAtPm1heF94cmNkcyA6IDA7CiAJZGV2LT5jYXBzLm10dF9lbnRyeV9zegkgICAgID0gZGV2LT5jYXBzLm10dHNfcGVyX3NlZyAqIGRldl9jYXAtPm10dF9lbnRyeV9zejsKIAlkZXYtPmNhcHMubWF4X21zZ19zeiAgICAgICAgID0gZGV2X2NhcC0+bWF4X21zZ19zejsKIAlkZXYtPmNhcHMucGFnZV9zaXplX2NhcAkgICAgID0gfih1MzIpIChkZXZfY2FwLT5taW5fcGFnZV9zeiAtIDEpOwpAQCAtMjMwLDcgKzIzNiw3IEBACiAJZGV2LT5jYXBzLm1heF9nc29fc3oJICAgICA9IGRldl9jYXAtPm1heF9nc29fc3o7CiAKIAlkZXYtPmNhcHMubG9nX251bV9tYWNzICA9IGxvZ19udW1fbWFjOwotCWRldi0+Y2Fwcy5sb2dfbnVtX3ZsYW5zID0gbG9nX251bV92bGFuOworCWRldi0+Y2Fwcy5sb2dfbnVtX3ZsYW5zID0gTUxYNF9MT0dfTlVNX1ZMQU5TOwogCWRldi0+Y2Fwcy5sb2dfbnVtX3ByaW9zID0gdXNlX3ByaW8gPyAzIDogMDsKIAogCWZvciAoaSA9IDE7IGkgPD0gZGV2LT5jYXBzLm51bV9wb3J0czsgKytpKSB7CkBAIC05MTIsMTEgKzkxOCwxOCBAQAogCQlnb3RvIGVycl9rYXJfdW5tYXA7CiAJfQogCisJZXJyID0gbWx4NF9pbml0X3hyY2RfdGFibGUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplICIKKwkJCSAicmVsaWFibGUgY29ubmVjdGlvbiBkb21haW4gdGFibGUsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX3BkX3RhYmxlX2ZyZWU7CisJfQorCiAJZXJyID0gbWx4NF9pbml0X21yX3RhYmxlKGRldik7CiAJaWYgKGVycikgewogCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCiAJCQkgIm1lbW9yeSByZWdpb24gdGFibGUsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX3BkX3RhYmxlX2ZyZWU7CisJCWdvdG8gZXJyX3hyY2RfdGFibGVfZnJlZTsKIAl9CiAKIAllcnIgPSBtbHg0X2luaXRfZXFfdGFibGUoZGV2KTsKQEAgLTk5OCw2ICsxMDExLDEzIEBACiAJCQkJICAiaWIgY2FwYWJpbGl0aWVzICglZCkuIENvbnRpbnVpbmcgd2l0aCAiCiAJCQkJICAiY2FwcyA9IDBcbiIsIHBvcnQsIGVycik7CiAJCWRldi0+Y2Fwcy5pYl9wb3J0X2RlZl9jYXBbcG9ydF0gPSBpYl9wb3J0X2RlZmF1bHRfY2FwczsKKworCQllcnIgPSBtbHg0X2NoZWNrX2V4dF9wb3J0X2NhcHMoZGV2LCBwb3J0KTsKKwkJaWYgKGVycikKKwkJCW1seDRfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvcnQgJWQgZXh0ZW5kZWQgIgorCQkJCSAgInBvcnQgY2FwYWJpbGl0aWVzIHN1cHBvcnQgaW5mbyAoJWQpLiIKKwkJCQkgICIgQXNzdW1pbmcgbm90IHN1cHBvcnRlZFxuIiwgcG9ydCwgZXJyKTsKKwogCQllcnIgPSBtbHg0X1NFVF9QT1JUKGRldiwgcG9ydCk7CiAJCWlmIChlcnIpIHsKIAkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcG9ydCAlZCwgYWJvcnRpbmdcbiIsCkBAIC0xMDMzLDYgKzEwNTMsOSBAQAogZXJyX21yX3RhYmxlX2ZyZWU6CiAJbWx4NF9jbGVhbnVwX21yX3RhYmxlKGRldik7CiAKK2Vycl94cmNkX3RhYmxlX2ZyZWU6CisJbWx4NF9jbGVhbnVwX3hyY2RfdGFibGUoZGV2KTsKKwogZXJyX3BkX3RhYmxlX2ZyZWU6CiAJbWx4NF9jbGVhbnVwX3BkX3RhYmxlKGRldik7CiAKQEAgLTEzNTUsNiArMTM3OCw3IEBACiAJbWx4NF9jbWRfdXNlX3BvbGxpbmcoZGV2KTsKIAltbHg0X2NsZWFudXBfZXFfdGFibGUoZGV2KTsKIAltbHg0X2NsZWFudXBfbXJfdGFibGUoZGV2KTsKKwltbHg0X2NsZWFudXBfeHJjZF90YWJsZShkZXYpOwogCW1seDRfY2xlYW51cF9wZF90YWJsZShkZXYpOwogCW1seDRfY2xlYW51cF91YXJfdGFibGUoZGV2KTsKIApAQCAtMTQxNiw2ICsxNDQwLDcgQEAKIAkJbWx4NF9jbWRfdXNlX3BvbGxpbmcoZGV2KTsKIAkJbWx4NF9jbGVhbnVwX2VxX3RhYmxlKGRldik7CiAJCW1seDRfY2xlYW51cF9tcl90YWJsZShkZXYpOworCQltbHg0X2NsZWFudXBfeHJjZF90YWJsZShkZXYpOwogCQltbHg0X2NsZWFudXBfcGRfdGFibGUoZGV2KTsKIAogCQlpb3VubWFwKHByaXYtPmthcik7CkBAIC0xNDg5LDEwICsxNTE0LDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmICgobG9nX251bV92bGFuIDwgMCkgfHwgKGxvZ19udW1fdmxhbiA+IDcpKSB7Ci0JCXByX3dhcm5pbmcoIm1seDRfY29yZTogYmFkIG51bV92bGFuOiAlZFxuIiwgbG9nX251bV92bGFuKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAobG9nX251bV92bGFuICE9IDApCisJCXByX3dhcm5pbmcoIm1seDRfY29yZTogbG9nX251bV92bGFuIC0gb2Jzb2xldGUgbW9kdWxlIHBhcmFtLCB1c2luZyAlZFxuIiwKKwkJCSAgIE1MWDRfTE9HX05VTV9WTEFOUyk7CiAKIAlpZiAoKGxvZ19tdHRzX3Blcl9zZWcgPCAxKSB8fCAobG9nX210dHNfcGVyX3NlZyA+IDcpKSB7CiAJCXByX3dhcm5pbmcoIm1seDRfY29yZTogYmFkIGxvZ19tdHRzX3Blcl9zZWc6ICVkXG4iLCBsb2dfbXR0c19wZXJfc2VnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWNnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21jZy5jCmluZGV4IGNkMTc4NDUuLjk3ODY4OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWNnLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAibWx4NC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCmluZGV4IGEyZmNkODQuLjVkZmE2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCkBAIC0zMzUsNiArMzM1LDcgQEAKIAlzdHJ1Y3QgbWx4NF9jbWQJCWNtZDsKIAogCXN0cnVjdCBtbHg0X2JpdG1hcAlwZF9iaXRtYXA7CisJc3RydWN0IG1seDRfYml0bWFwCXhyY2RfYml0bWFwOwogCXN0cnVjdCBtbHg0X3Vhcl90YWJsZQl1YXJfdGFibGU7CiAJc3RydWN0IG1seDRfbXJfdGFibGUJbXJfdGFibGU7CiAJc3RydWN0IG1seDRfY3FfdGFibGUJY3FfdGFibGU7CkBAIC0zODQsNiArMzg1LDcgQEAKIHZvaWQgbWx4NF9mcmVlX2VxX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIAogaW50IG1seDRfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CitpbnQgbWx4NF9pbml0X3hyY2RfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogaW50IG1seDRfaW5pdF91YXJfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogaW50IG1seDRfaW5pdF9tcl90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiBpbnQgbWx4NF9pbml0X2VxX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKQEAgLTM5Myw2ICszOTUsNyBAQAogaW50IG1seDRfaW5pdF9tY2dfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogCiB2b2lkIG1seDRfY2xlYW51cF9wZF90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7Cit2b2lkIG1seDRfY2xlYW51cF94cmNkX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9jbGVhbnVwX3Vhcl90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiB2b2lkIG1seDRfY2xlYW51cF9tcl90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiB2b2lkIG1seDRfY2xlYW51cF9lcV90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CkBAIC00NTAsNiArNDUzLDcgQEAKIAogaW50IG1seDRfU0VUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpOwogaW50IG1seDRfZ2V0X3BvcnRfaWJfY2FwcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgX19iZTMyICpjYXBzKTsKK2ludCBtbHg0X2NoZWNrX2V4dF9wb3J0X2NhcHMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpOwogCiBpbnQgbWx4NF9xcF9kZXRhY2hfY29tbW9uKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9xcCAqcXAsIHU4IGdpZFsxNl0sCiAJCQkgIGVudW0gbWx4NF9wcm90b2NvbCBwcm90LCBlbnVtIG1seDRfc3RlZXJfdHlwZSBzdGVlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCmluZGV4IGZjYTY2MTYuLjhmZGEzMzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaApAQCAtNTgxLDggKzU4MSw5IEBACiAgKiBwcmludGsgLyBsb2dnaW5nIGZ1bmN0aW9ucwogICovCiAKK19fcHJpbnRmKDMsIDQpCiBpbnQgZW5fcHJpbnQoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYsCi0JICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCSAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogCiAjZGVmaW5lIGVuX2RiZyhtbGV2ZWwsIHByaXYsIGZvcm1hdCwgYXJnLi4uKQkJCVwKIGRvIHsJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbXIuYwppbmRleCA5YzE4OGJkLi5lZmEzZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21yLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jCkBAIC0zMyw2ICszMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KQEAgLTEzOSw3ICsxNDAsNyBAQAogCiAJYnVkZHktPmJpdHMgPSBremFsbG9jKChidWRkeS0+bWF4X29yZGVyICsgMSkgKiBzaXplb2YgKGxvbmcgKiksCiAJCQkgICAgICBHRlBfS0VSTkVMKTsKLQlidWRkeS0+bnVtX2ZyZWUgPSBremFsbG9jKChidWRkeS0+bWF4X29yZGVyICsgMSkgKiBzaXplb2YgKGludCAqKSwKKwlidWRkeS0+bnVtX2ZyZWUgPSBrY2FsbG9jKChidWRkeS0+bWF4X29yZGVyICsgMSksIHNpemVvZiAqYnVkZHktPm51bV9mcmVlLAogCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWRkeS0+Yml0cyB8fCAhYnVkZHktPm51bV9mcmVlKQogCQlnb3RvIGVycl9vdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BkLmMKaW5kZXggMTI4NmI4OC4uMjYwZWQyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcGQuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC02MSw2ICs2MiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9wZF9mcmVlKTsKIAoraW50IG1seDRfeHJjZF9hbGxvYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyICp4cmNkbikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisKKwkqeHJjZG4gPSBtbHg0X2JpdG1hcF9hbGxvYygmcHJpdi0+eHJjZF9iaXRtYXApOworCWlmICgqeHJjZG4gPT0gLTEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3hyY2RfYWxsb2MpOworCit2b2lkIG1seDRfeHJjZF9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgeHJjZG4pCit7CisJbWx4NF9iaXRtYXBfZnJlZSgmbWx4NF9wcml2KGRldiktPnhyY2RfYml0bWFwLCB4cmNkbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3hyY2RfZnJlZSk7CisKIGludCBtbHg0X2luaXRfcGRfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwpAQCAtNzQsNiArOTMsMTggQEAKIAltbHg0X2JpdG1hcF9jbGVhbnVwKCZtbHg0X3ByaXYoZGV2KS0+cGRfYml0bWFwKTsKIH0KIAoraW50IG1seDRfaW5pdF94cmNkX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCXJldHVybiBtbHg0X2JpdG1hcF9pbml0KCZwcml2LT54cmNkX2JpdG1hcCwgKDEgPDwgMTYpLAorCQkJCSgxIDw8IDE2KSAtIDEsIGRldi0+Y2Fwcy5yZXNlcnZlZF94cmNkcyArIDEsIDApOworfQorCit2b2lkIG1seDRfY2xlYW51cF94cmNkX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCW1seDRfYml0bWFwX2NsZWFudXAoJm1seDRfcHJpdihkZXYpLT54cmNkX2JpdG1hcCk7Cit9CiAKIGludCBtbHg0X3Vhcl9hbGxvYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfdWFyICp1YXIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCmluZGV4IDE2M2EzMTQuLmQ5NDJhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgogCkBAIC0xNDgsMjIgKzE0OSwyNiBAQAogCiAJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikgewogCQllcnIgPSBtbHg0X3VjX3N0ZWVyX2FkZChkZXYsIHBvcnQsIG1hYywgcXBuLCAxKTsKLQkJaWYgKCFlcnIpIHsKLQkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKLQkJCWlmICghZW50cnkpIHsKLQkJCQltbHg0X3VjX3N0ZWVyX3JlbGVhc2UoZGV2LCBwb3J0LCBtYWMsICpxcG4sIDEpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJZW50cnktPm1hYyA9IG1hYzsKLQkJCWVyciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZpbmZvLT5tYWNfdHJlZSwgKnFwbiwgZW50cnkpOwotCQkJaWYgKGVycikgewotCQkJCW1seDRfdWNfc3RlZXJfcmVsZWFzZShkZXYsIHBvcnQsIG1hYywgKnFwbiwgMSk7Ci0JCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJfSBlbHNlCisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOworCisJCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgbWFjLCAqcXBuLCAxKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZW50cnktPm1hYyA9IG1hYzsKKwkJZXJyID0gcmFkaXhfdHJlZV9pbnNlcnQoJmluZm8tPm1hY190cmVlLCAqcXBuLCBlbnRyeSk7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCW1seDRfdWNfc3RlZXJfcmVsZWFzZShkZXYsIHBvcnQsIG1hYywgKnFwbiwgMSk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAJfQorCiAJbWx4NF9kYmcoZGV2LCAiUmVnaXN0ZXJpbmcgTUFDOiAweCVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG1hYyk7CisKIAltdXRleF9sb2NrKCZ0YWJsZS0+bXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBNTFg0X01BWF9NQUNfTlVNIC0gMTsgaSsrKSB7CiAJCWlmIChmcmVlIDwgMCAmJiAhdGFibGUtPnJlZnNbaV0pIHsKQEAgLTQ2NSw2ICs0NzAsNDggQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgbWx4NF9jaGVja19leHRfcG9ydF9jYXBzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0KQoreworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbm1haWxib3gsICpvdXRtYWlsYm94OworCXU4ICppbmJ1ZiwgKm91dGJ1ZjsKKwlpbnQgZXJyLCBwYWNrZXRfZXJyb3I7CisKKwlpbm1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CisJaWYgKElTX0VSUihpbm1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihpbm1haWxib3gpOworCisJb3V0bWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKG91dG1haWxib3gpKSB7CisJCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIGlubWFpbGJveCk7CisJCXJldHVybiBQVFJfRVJSKG91dG1haWxib3gpOworCX0KKworCWluYnVmID0gaW5tYWlsYm94LT5idWY7CisJb3V0YnVmID0gb3V0bWFpbGJveC0+YnVmOworCW1lbXNldChpbmJ1ZiwgMCwgMjU2KTsKKwltZW1zZXQob3V0YnVmLCAwLCAyNTYpOworCWluYnVmWzBdID0gMTsKKwlpbmJ1ZlsxXSA9IDE7CisJaW5idWZbMl0gPSAxOworCWluYnVmWzNdID0gMTsKKworCSooX19iZTE2ICopICgmaW5idWZbMTZdKSA9IE1MWDRfQVRUUl9FWFRFTkRFRF9QT1JUX0lORk87CisJKihfX2JlMzIgKikgKCZpbmJ1ZlsyMF0pID0gY3B1X3RvX2JlMzIocG9ydCk7CisKKwllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCBpbm1haWxib3gtPmRtYSwgb3V0bWFpbGJveC0+ZG1hLCBwb3J0LCAzLAorCQkJICAgTUxYNF9DTURfTUFEX0lGQywgTUxYNF9DTURfVElNRV9DTEFTU19DKTsKKworCXBhY2tldF9lcnJvciA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopIChvdXRidWYgKyA0KSk7CisKKwlkZXYtPmNhcHMuZXh0X3BvcnRfY2FwW3BvcnRdID0gKCFlcnIgJiYgIXBhY2tldF9lcnJvcikgPworCQkJCSAgICAgICBNTFhfRVhUX1BPUlRfQ0FQX0ZMQUdfRVhURU5ERURfUE9SVF9JTkZPCisJCQkJICAgICAgIDogMDsKKworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIGlubWFpbGJveCk7CisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgb3V0bWFpbGJveCk7CisJcmV0dXJuIGVycjsKK30KKwogaW50IG1seDRfU0VUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMKaW5kZXggZWM5MzUwZS4uMTVmODcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9xcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYwpAQCAtMzQsNiArMzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgogI2luY2x1ZGUgPGxpbnV4L21seDQvcXAuaD4KIApAQCAtMjgwLDYgKzI4MSw5IEBACiAJICogV2UgcmVzZXJ2ZSAyIGV4dHJhIFFQcyBwZXIgcG9ydCBmb3IgdGhlIHNwZWNpYWwgUVBzLiAgVGhlCiAJICogYmxvY2sgb2Ygc3BlY2lhbCBRUHMgbXVzdCBiZSBhbGlnbmVkIHRvIGEgbXVsdGlwbGUgb2YgOCwgc28KIAkgKiByb3VuZCB1cC4KKwkgKgorCSAqIFdlIGFsc28gcmVzZXJ2ZSB0aGUgTVNCIG9mIHRoZSAyNC1iaXQgUVAgbnVtYmVyIHRvIGluZGljYXRlCisJICogdGhhdCBhIFFQIGlzIGFuIFhSQyBRUC4KIAkgKi8KIAlkZXYtPmNhcHMuc3FwX3N0YXJ0ID0KIAkJQUxJR04oZGV2LT5jYXBzLnJlc2VydmVkX3Fwc19jbnRbTUxYNF9RUF9SRUdJT05fRlddLCA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NycS5jCmluZGV4IDNiMDdiODAuLjljYmYzZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogCiAjaW5jbHVkZSAibWx4NC5oIgpAQCAtNDAsMjAgKzQxLDIwIEBACiBzdHJ1Y3QgbWx4NF9zcnFfY29udGV4dCB7CiAJX19iZTMyCQkJc3RhdGVfbG9nc2l6ZV9zcnFuOwogCXU4CQkJbG9nc3RyaWRlOwotCXU4CQkJcmVzZXJ2ZWQxWzNdOwotCXU4CQkJcGdfb2Zmc2V0OwotCXU4CQkJcmVzZXJ2ZWQyWzNdOwotCXUzMgkJCXJlc2VydmVkMzsKKwl1OAkJCXJlc2VydmVkMTsKKwlfX2JlMTYJCQl4cmNkOworCV9fYmUzMgkJCXBnX29mZnNldF9jcW47CisJdTMyCQkJcmVzZXJ2ZWQyOwogCXU4CQkJbG9nX3BhZ2Vfc2l6ZTsKLQl1OAkJCXJlc2VydmVkNFsyXTsKKwl1OAkJCXJlc2VydmVkM1syXTsKIAl1OAkJCW10dF9iYXNlX2FkZHJfaDsKIAlfX2JlMzIJCQltdHRfYmFzZV9hZGRyX2w7CiAJX19iZTMyCQkJcGQ7CiAJX19iZTE2CQkJbGltaXRfd2F0ZXJtYXJrOwogCV9fYmUxNgkJCXdxZV9jbnQ7Ci0JdTE2CQkJcmVzZXJ2ZWQ1OworCXUxNgkJCXJlc2VydmVkNDsKIAlfX2JlMTYJCQl3cWVfY291bnRlcjsKLQl1MzIJCQlyZXNlcnZlZDY7CisJdTMyCQkJcmVzZXJ2ZWQ1OwogCV9fYmU2NAkJCWRiX3JlY19hZGRyOwogfTsKIApAQCAtMTA5LDggKzExMCw4IEBACiAJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BKTsKIH0KIAotaW50IG1seDRfc3JxX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuLCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKLQkJICAgdTY0IGRiX3JlYywgc3RydWN0IG1seDRfc3JxICpzcnEpCitpbnQgbWx4NF9zcnFfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBwZG4sIHUzMiBjcW4sIHUxNiB4cmNkLAorCQkgICBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwgdTY0IGRiX3JlYywgc3RydWN0IG1seDRfc3JxICpzcnEpCiB7CiAJc3RydWN0IG1seDRfc3JxX3RhYmxlICpzcnFfdGFibGUgPSAmbWx4NF9wcml2KGRldiktPnNycV90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKQEAgLTE0OCw2ICsxNDksOCBAQAogCXNycV9jb250ZXh0LT5zdGF0ZV9sb2dzaXplX3NycW4gPSBjcHVfdG9fYmUzMigoaWxvZzIoc3JxLT5tYXgpIDw8IDI0KSB8CiAJCQkJCQkgICAgICBzcnEtPnNycW4pOwogCXNycV9jb250ZXh0LT5sb2dzdHJpZGUgICAgICAgICAgPSBzcnEtPndxZV9zaGlmdCAtIDQ7CisJc3JxX2NvbnRleHQtPnhyY2QJCT0gY3B1X3RvX2JlMTYoeHJjZCk7CisJc3JxX2NvbnRleHQtPnBnX29mZnNldF9jcW4JPSBjcHVfdG9fYmUzMihjcW4gJiAweGZmZmZmZik7CiAJc3JxX2NvbnRleHQtPmxvZ19wYWdlX3NpemUgICAgICA9IG10dC0+cGFnZV9zaGlmdCAtIE1MWDRfSUNNX1BBR0VfU0hJRlQ7CiAKIAltdHRfYWRkciA9IG1seDRfbXR0X2FkZHIoZGV2LCBtdHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9LY29uZmlnCmluZGV4IDRhNmI5ZmQuLmViODM2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL0tjb25maWcKQEAgLTUsNyArNSwxMCBAQAogY29uZmlnIE5FVF9WRU5ET1JfTkFUU0VNSQogCWJvb2wgIk5hdGlvbmFsIFNlbWktY29uZHVjdG9yIGRldmljZXMiCiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBNQ0EgfHwgTUFDIHx8IE1BQ0hfSkFaWiB8fCBQQ0kgfHwgWFRFTlNBX1BMQVRGT1JNX1hUMjAwMAorCWRlcGVuZHMgb24gQU1JR0FfUENNQ0lBIHx8IEFSTSB8fCBFSVNBIHx8IEVYUEVSSU1FTlRBTCB8fCBIODMwMCB8fCBcCisJCSAgIElTQSB8fCBNMzJSIHx8IE1BQyB8fCBNQUNIX0pBWlogfHwgTUFDSF9UWDQ5WFggfHwgTUNBIHx8IFwKKwkJICAgTUNBX0xFR0FDWSB8fCBNSVBTIHx8IFBDSSB8fCBQQ01DSUEgfHwgU1VQRVJIIHx8IFwKKwkJICAgWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCB8fCBaT1JSTwogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCiAJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYwppbmRleCA2NzFlMTY2Li5hODMxOTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldF90c3RhbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInZ4Z2UtbWFpbi5oIgogI2luY2x1ZGUgInZ4Z2UtcmVnLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L252aWRpYS9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L252aWRpYS9mb3JjZWRldGguYwppbmRleCAxZTM3ZWI5Li4xZGNhNTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnZpZGlhL2ZvcmNlZGV0aC5jCkBAIC0xNjgyLDYgKzE2ODIsNyBAQAogCQlucC0+ZXN0YXRzLnR4X3BhdXNlICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4UGF1c2UpOwogCQlucC0+ZXN0YXRzLnJ4X3BhdXNlICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4UGF1c2UpOwogCQlucC0+ZXN0YXRzLnJ4X2Ryb3BfZnJhbWUgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhEcm9wRnJhbWUpOworCQlucC0+ZXN0YXRzLnJ4X2Vycm9yc190b3RhbCArPSBucC0+ZXN0YXRzLnJ4X2Ryb3BfZnJhbWU7CiAJfQogCiAJaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDU19WMykgewpAQCAtMTcwNiwxMSArMTcwNywxNCBAQAogCQludl9nZXRfaHdfc3RhdHMoZGV2KTsKIAogCQkvKiBjb3B5IHRvIG5ldF9kZXZpY2Ugc3RhdHMgKi8KKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzID0gbnAtPmVzdGF0cy50eF9wYWNrZXRzOworCQlkZXYtPnN0YXRzLnJ4X2J5dGVzID0gbnAtPmVzdGF0cy5yeF9ieXRlczsKIAkJZGV2LT5zdGF0cy50eF9ieXRlcyA9IG5wLT5lc3RhdHMudHhfYnl0ZXM7CiAJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSBucC0+ZXN0YXRzLnR4X2ZpZm9fZXJyb3JzOwogCQlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gbnAtPmVzdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKIAkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9jcmNfZXJyb3JzOwogCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9vdmVyX2Vycm9yczsKKwkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfZHJvcF9mcmFtZTsKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMgPSBucC0+ZXN0YXRzLnJ4X2Vycm9yc190b3RhbDsKIAkJZGV2LT5zdGF0cy50eF9lcnJvcnMgPSBucC0+ZXN0YXRzLnR4X2Vycm9yc190b3RhbDsKIAl9CkBAIC0yMDk5LDEwICsyMTAzLDEwIEBACiAKIAkvKiBhZGQgZnJhZ21lbnRzIHRvIGVudHJpZXMgY291bnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKLQkJdTMyIHNpemUgPSBza2JfZnJhZ19zaXplKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldKTsKKwkJdTMyIGZyYWdfc2l6ZSA9IHNrYl9mcmFnX3NpemUoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pOwogCi0JCWVudHJpZXMgKz0gKHNpemUgPj4gTlZfVFgyX1RTT19NQVhfU0hJRlQpICsKLQkJCSAgICgoc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKKwkJZW50cmllcyArPSAoZnJhZ19zaXplID4+IE5WX1RYMl9UU09fTUFYX1NISUZUKSArCisJCQkgICAoKGZyYWdfc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKQEAgLTIxNDEsMTMgKzIxNDUsMTMgQEAKIAkvKiBzZXR1cCB0aGUgZnJhZ21lbnRzICovCiAJZm9yIChpID0gMDsgaSA8IGZyYWdtZW50czsgaSsrKSB7CiAJCWNvbnN0IHNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQkJdTMyIHNpemUgPSBza2JfZnJhZ19zaXplKGZyYWcpOworCQl1MzIgZnJhZ19zaXplID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsKIAkJb2Zmc2V0ID0gMDsKIAogCQlkbyB7CiAJCQlwcmV2X3R4ID0gcHV0X3R4OwogCQkJcHJldl90eF9jdHggPSBucC0+cHV0X3R4X2N0eDsKLQkJCWJjbnQgPSAoc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IHNpemU7CisJCQliY250ID0gKGZyYWdfc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IGZyYWdfc2l6ZTsKIAkJCW5wLT5wdXRfdHhfY3R4LT5kbWEgPSBza2JfZnJhZ19kbWFfbWFwKAogCQkJCQkJCSZucC0+cGNpX2Rldi0+ZGV2LAogCQkJCQkJCWZyYWcsIG9mZnNldCwKQEAgLTIxNTksMTIgKzIxNjMsMTIgQEAKIAkJCXB1dF90eC0+ZmxhZ2xlbiA9IGNwdV90b19sZTMyKChiY250LTEpIHwgdHhfZmxhZ3MpOwogCiAJCQlvZmZzZXQgKz0gYmNudDsKLQkJCXNpemUgLT0gYmNudDsKKwkJCWZyYWdfc2l6ZSAtPSBiY250OwogCQkJaWYgKHVubGlrZWx5KHB1dF90eCsrID09IG5wLT5sYXN0X3R4Lm9yaWcpKQogCQkJCXB1dF90eCA9IG5wLT5maXJzdF90eC5vcmlnOwogCQkJaWYgKHVubGlrZWx5KG5wLT5wdXRfdHhfY3R4KysgPT0gbnAtPmxhc3RfdHhfY3R4KSkKIAkJCQlucC0+cHV0X3R4X2N0eCA9IG5wLT5maXJzdF90eF9jdHg7Ci0JCX0gd2hpbGUgKHNpemUpOworCQl9IHdoaWxlIChmcmFnX3NpemUpOwogCX0KIAogCS8qIHNldCBsYXN0IGZyYWdtZW50IGZsYWcgICovCkBAIC0yMjEzLDEwICsyMjE3LDEwIEBACiAKIAkvKiBhZGQgZnJhZ21lbnRzIHRvIGVudHJpZXMgY291bnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKLQkJdTMyIHNpemUgPSBza2JfZnJhZ19zaXplKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldKTsKKwkJdTMyIGZyYWdfc2l6ZSA9IHNrYl9mcmFnX3NpemUoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pOwogCi0JCWVudHJpZXMgKz0gKHNpemUgPj4gTlZfVFgyX1RTT19NQVhfU0hJRlQpICsKLQkJCSAgICgoc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKKwkJZW50cmllcyArPSAoZnJhZ19zaXplID4+IE5WX1RYMl9UU09fTUFYX1NISUZUKSArCisJCQkgICAoKGZyYWdfc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKQEAgLTIyNTcsMTMgKzIyNjEsMTMgQEAKIAkvKiBzZXR1cCB0aGUgZnJhZ21lbnRzICovCiAJZm9yIChpID0gMDsgaSA8IGZyYWdtZW50czsgaSsrKSB7CiAJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQkJdTMyIHNpemUgPSBza2JfZnJhZ19zaXplKGZyYWcpOworCQl1MzIgZnJhZ19zaXplID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsKIAkJb2Zmc2V0ID0gMDsKIAogCQlkbyB7CiAJCQlwcmV2X3R4ID0gcHV0X3R4OwogCQkJcHJldl90eF9jdHggPSBucC0+cHV0X3R4X2N0eDsKLQkJCWJjbnQgPSAoc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IHNpemU7CisJCQliY250ID0gKGZyYWdfc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IGZyYWdfc2l6ZTsKIAkJCW5wLT5wdXRfdHhfY3R4LT5kbWEgPSBza2JfZnJhZ19kbWFfbWFwKAogCQkJCQkJCSZucC0+cGNpX2Rldi0+ZGV2LAogCQkJCQkJCWZyYWcsIG9mZnNldCwKQEAgLTIyNzYsMTIgKzIyODAsMTIgQEAKIAkJCXB1dF90eC0+ZmxhZ2xlbiA9IGNwdV90b19sZTMyKChiY250LTEpIHwgdHhfZmxhZ3MpOwogCiAJCQlvZmZzZXQgKz0gYmNudDsKLQkJCXNpemUgLT0gYmNudDsKKwkJCWZyYWdfc2l6ZSAtPSBiY250OwogCQkJaWYgKHVubGlrZWx5KHB1dF90eCsrID09IG5wLT5sYXN0X3R4LmV4KSkKIAkJCQlwdXRfdHggPSBucC0+Zmlyc3RfdHguZXg7CiAJCQlpZiAodW5saWtlbHkobnAtPnB1dF90eF9jdHgrKyA9PSBucC0+bGFzdF90eF9jdHgpKQogCQkJCW5wLT5wdXRfdHhfY3R4ID0gbnAtPmZpcnN0X3R4X2N0eDsKLQkJfSB3aGlsZSAoc2l6ZSk7CisJCX0gd2hpbGUgKGZyYWdfc2l6ZSk7CiAJfQogCiAJLyogc2V0IGxhc3QgZnJhZ21lbnQgZmxhZyAgKi8KQEAgLTIzNzQsMTYgKzIzNzgsOCBAQAogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKIAkJCWlmIChmbGFncyAmIE5WX1RYX0xBU1RQQUNLRVQpIHsKIAkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9FUlJPUikgewotCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9VTkRFUkZMT1cpCi0JCQkJCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7Ci0JCQkJCWlmIChmbGFncyAmIE5WX1RYX0NBUlJJRVJMT1NUKQotCQkJCQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwogCQkJCQlpZiAoKGZsYWdzICYgTlZfVFhfUkVUUllFUlJPUikgJiYgIShmbGFncyAmIE5WX1RYX1JFVFJZQ09VTlRfTUFTSykpCiAJCQkJCQludl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChkZXYpOwotCQkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKIAkJCQl9CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkobnAtPmdldF90eF9jdHgtPnNrYik7CiAJCQkJbnAtPmdldF90eF9jdHgtPnNrYiA9IE5VTEw7CkBAIC0yMzkyLDE2ICsyMzg4LDggQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChmbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CiAJCQkJaWYgKGZsYWdzICYgTlZfVFgyX0VSUk9SKSB7Ci0JCQkJCWlmIChmbGFncyAmIE5WX1RYMl9VTkRFUkZMT1cpCi0JCQkJCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7Ci0JCQkJCWlmIChmbGFncyAmIE5WX1RYMl9DQVJSSUVSTE9TVCkKLQkJCQkJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKIAkJCQkJaWYgKChmbGFncyAmIE5WX1RYMl9SRVRSWUVSUk9SKSAmJiAhKGZsYWdzICYgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSykpCiAJCQkJCQludl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChkZXYpOwotCQkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKIAkJCQl9CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkobnAtPmdldF90eF9jdHgtPnNrYik7CiAJCQkJbnAtPmdldF90eF9jdHgtPnNrYiA9IE5VTEw7CkBAIC0yNDM0LDkgKzI0MjIsNyBAQAogCQludl91bm1hcF90eHNrYihucCwgbnAtPmdldF90eF9jdHgpOwogCiAJCWlmIChmbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7Ci0JCQlpZiAoIShmbGFncyAmIE5WX1RYMl9FUlJPUikpCi0JCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQllbHNlIHsKKwkJCWlmIChmbGFncyAmIE5WX1RYMl9FUlJPUikgewogCQkJCWlmICgoZmxhZ3MgJiBOVl9UWDJfUkVUUllFUlJPUikgJiYgIShmbGFncyAmIE5WX1RYMl9SRVRSWUNPVU5UX01BU0spKSB7CiAJCQkJCWlmIChucC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX0dFQVJfTU9ERSkKIAkJCQkJCW52X2dlYXJfYmFja29mZl9yZXNlZWQoZGV2KTsKQEAgLTI2MzYsNyArMjYyMiw2IEBACiAJCQkJCWlmICgoZmxhZ3MgJiBOVl9SWF9FUlJPUl9NQVNLKSA9PSBOVl9SWF9FUlJPUjQpIHsKIAkJCQkJCWxlbiA9IG52X2dldGxlbihkZXYsIHNrYi0+ZGF0YSwgbGVuKTsKIAkJCQkJCWlmIChsZW4gPCAwKSB7Ci0JCQkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQkJCX0KQEAgLTI2NTAsMTEgKzI2MzUsNiBAQAogCQkJCQllbHNlIHsKIAkJCQkJCWlmIChmbGFncyAmIE5WX1JYX01JU1NFREZSQU1FKQogCQkJCQkJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOwotCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfQ1JDRVJSKQotCQkJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfT1ZFUkZMT1cpCi0JCQkJCQkJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwotCQkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQkJCX0KQEAgLTI2NzAsNyArMjY1MCw2IEBACiAJCQkJCWlmICgoZmxhZ3MgJiBOVl9SWDJfRVJST1JfTUFTSykgPT0gTlZfUlgyX0VSUk9SNCkgewogCQkJCQkJbGVuID0gbnZfZ2V0bGVuKGRldiwgc2tiLT5kYXRhLCBsZW4pOwogCQkJCQkJaWYgKGxlbiA8IDApIHsKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCQkJfQpAQCAtMjY4MiwxMSArMjY2MSw2IEBACiAJCQkJCX0KIAkJCQkJLyogdGhlIHJlc3QgYXJlIGhhcmQgZXJyb3JzICovCiAJCQkJCWVsc2UgewotCQkJCQkJaWYgKGZsYWdzICYgTlZfUlgyX0NSQ0VSUikKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9PVkVSRkxPVykKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7Ci0JCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQkJfQpAQCAtMjcwNCw3ICsyNjc4LDYgQEAKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJbmFwaV9ncm9fcmVjZWl2ZSgmbnAtPm5hcGksIHNrYik7CiAJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwotCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIG5leHRfcGt0OgogCQlpZiAodW5saWtlbHkobnAtPmdldF9yeC5vcmlnKysgPT0gbnAtPmxhc3Rfcngub3JpZykpCiAJCQlucC0+Z2V0X3J4Lm9yaWcgPSBucC0+Zmlyc3Rfcngub3JpZzsKQEAgLTI3ODcsOSArMjc2MCw3IEBACiAJCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZpZCk7CiAJCQl9CiAJCQluYXBpX2dyb19yZWNlaXZlKCZucC0+bmFwaSwgc2tiKTsKLQogCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJfSBlbHNlIHsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJfQpAQCAtMjk2MiwxMSArMjkzMywxMSBAQAogCQkJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAKIAkJCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0JCQkJCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSBoYS0+YWRkcjsKKwkJCQkJdW5zaWduZWQgY2hhciAqaHdfYWRkciA9IGhhLT5hZGRyOwogCQkJCQl1MzIgYSwgYjsKIAotCQkJCQlhID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikgYWRkcik7Ci0JCQkJCWIgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAoJmFkZHJbNF0pKTsKKwkJCQkJYSA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopIGh3X2FkZHIpOworCQkJCQliID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikgKCZod19hZGRyWzRdKSk7CiAJCQkJCWFsd2F5c09uWzBdICY9IGE7CiAJCQkJCWFsd2F5c09mZlswXSAmPSB+YTsKIAkJCQkJYWx3YXlzT25bMV0gJj0gYjsKQEAgLTMzOTgsNyArMzM2OSw4IEBACiAKIAlmb3IgKGkgPSAwOzsgaSsrKSB7CiAJCWV2ZW50cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpICYgTlZSRUdfSVJRX1RYX0FMTDsKLQkJd3JpdGVsKE5WUkVHX0lSUV9UWF9BTEwsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCQl3cml0ZWwoZXZlbnRzLCBiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKTsKKwkJbmV0ZGV2X2RiZyhkZXYsICJ0eCBpcnEgZXZlbnRzOiAlMDh4XG4iLCBldmVudHMpOwogCQlpZiAoIShldmVudHMgJiBucC0+aXJxbWFzaykpCiAJCQlicmVhazsKIApAQCAtMzUwOSw3ICszNDgxLDggQEAKIAogCWZvciAoaSA9IDA7OyBpKyspIHsKIAkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnTVNJWElycVN0YXR1cykgJiBOVlJFR19JUlFfUlhfQUxMOwotCQl3cml0ZWwoTlZSRUdfSVJRX1JYX0FMTCwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCXdyaXRlbChldmVudHMsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCQluZXRkZXZfZGJnKGRldiwgInJ4IGlycSBldmVudHM6ICUwOHhcbiIsIGV2ZW50cyk7CiAJCWlmICghKGV2ZW50cyAmIG5wLT5pcnFtYXNrKSkKIAkJCWJyZWFrOwogCkBAIC0zNTUzLDcgKzM1MjYsOCBAQAogCiAJZm9yIChpID0gMDs7IGkrKykgewogCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUV9PVEhFUjsKLQkJd3JpdGVsKE5WUkVHX0lSUV9PVEhFUiwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCXdyaXRlbChldmVudHMsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCQluZXRkZXZfZGJnKGRldiwgImlycSBldmVudHM6ICUwOHhcbiIsIGV2ZW50cyk7CiAJCWlmICghKGV2ZW50cyAmIG5wLT5pcnFtYXNrKSkKIAkJCWJyZWFrOwogCkBAIC0zNjE3LDEwICszNTkxLDEwIEBACiAKIAlpZiAoIShucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkpIHsKIAkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKLQkJd3JpdGVsKE5WUkVHX0lSUV9USU1FUiwgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwkJd3JpdGVsKGV2ZW50cyAmIE5WUkVHX0lSUV9USU1FUiwgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKIAl9IGVsc2UgewogCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKLQkJd3JpdGVsKE5WUkVHX0lSUV9USU1FUiwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7CisJCXdyaXRlbChldmVudHMgJiBOVlJFR19JUlFfVElNRVIsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOwogCX0KIAlwY2lfcHVzaChiYXNlKTsKIAlpZiAoIShldmVudHMgJiBOVlJFR19JUlFfVElNRVIpKQpAQCAtNDU2Niw3ICs0NTQwLDcgQEAKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogdXBkYXRlIHN0YXRzICovCi0JbnZfZG9fc3RhdHNfcG9sbCgodW5zaWduZWQgbG9uZylkZXYpOworCW52X2dldF9od19zdGF0cyhkZXYpOwogCiAJbWVtY3B5KGJ1ZmZlciwgJm5wLT5lc3RhdHMsIG52X2dldF9zc2V0X2NvdW50KGRldiwgRVRIX1NTX1NUQVRTKSpzaXplb2YodTY0KSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCmluZGV4IGJjMWQ5NDYuLjIxMmY0M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29jdGVvbi9vY3Rlb25fbWdtdC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfbWFpbi5jCmluZGV4IGI4OWYzYTYuLjQ4NDA2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX21haW4uYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAicGNoX2diZS5oIgogI2luY2x1ZGUgInBjaF9nYmVfYXBpLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gICAgICIxLjAwIgogY29uc3QgY2hhciBwY2hfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfcGFyYW0uYwppbmRleCA1YjVkOTBhLi45YzA3NWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfcGFyYW0uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfcGFyYW0uYwpAQCAtMTgsNiArMTgsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIGZvciBfX01PRFVMRV9TVFJJTkcgKi8KICNpbmNsdWRlICJwY2hfZ2JlLmgiCiAKICNkZWZpbmUgT1BUSU9OX1VOU0VUICAgLTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvS2NvbmZpZwppbmRleCA4NDA4M2VjLi4wNTc4ODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9LY29uZmlnCkBAIC0xMTUsMTYgKzExNSw0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCByODE2OS4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCiAKLWNvbmZpZyBTQzkyMDMxCi0JdHJpc3RhdGUgIlNpbGFuIFNDOTIwMzEgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IENSQzMyCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEZhc3QgRXRoZXJuZXQgUENJIG5ldHdvcmsgY2FyZHMgYmFzZWQgb24KLQkgIHRoZSBTaWxhbiBTQzkyMDMxIGNoaXAgKHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBSc2x0ZWsgODEzOUQpLiBJZiB5b3UKLQkgIGhhdmUgb25lIG9mIHRoZXNlLCBzYXkgWSBoZXJlLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBzYzkyMDMxLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KLQogZW5kaWYgIyBORVRfVkVORE9SX1JFQUxURUsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL01ha2VmaWxlCmluZGV4IGU0OGNmYjYuLjcxYjFkYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9NYWtlZmlsZQpAQCAtNiw0ICs2LDMgQEAKIG9iai0kKENPTkZJR184MTM5VE9PKSArPSA4MTM5dG9vLm8KIG9iai0kKENPTkZJR19BVFApICs9IGF0cC5vCiBvYmotJChDT05GSUdfUjgxNjkpICs9IHI4MTY5Lm8KLW9iai0kKENPTkZJR19TQzkyMDMxKSArPSBzYzkyMDMxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwppbmRleCBkZTlhZmViLi5kNTczMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCkBAIC0yMjI5LDEzICsyMjI5LDE1IEBACiAKIC8qIFBDSSBkZXZpY2UgSUQgdGFibGUgKi8KIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShlZnhfcGNpX3RhYmxlKSA9IHsKLQl7UENJX0RFVklDRShFRlhfVkVORElEX1NGQywgRkFMQ09OX0FfUF9ERVZJRCksCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkgICAgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBBXzApLAogCSAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJmZhbGNvbl9hMV9uaWNfdHlwZX0sCi0Je1BDSV9ERVZJQ0UoRUZYX1ZFTkRJRF9TRkMsIEZBTENPTl9CX1BfREVWSUQpLAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSwKKwkJICAgIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQiksCiAJIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmZmFsY29uX2IwX25pY190eXBlfSwKLQl7UENJX0RFVklDRShFRlhfVkVORElEX1NGQywgQkVUSFBBR0VfQV9QX0RFVklEKSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsIEJFVEhQQUdFX0FfUF9ERVZJRCksCiAJIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmc2llbmFfYTBfbmljX3R5cGV9LAotCXtQQ0lfREVWSUNFKEVGWF9WRU5ESURfU0ZDLCBTSUVOQV9BX1BfREVWSUQpLAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSwgU0lFTkFfQV9QX0RFVklEKSwKIAkgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZzaWVuYV9hMF9uaWNfdHlwZX0sCiAJezB9CQkJLyogZW5kIG9mIGxpc3QgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKaW5kZXggNDQyZjRkMC4uNDc2NDc5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaApAQCAtMTUsMTAgKzE1LDYgQEAKICNpbmNsdWRlICJmaWx0ZXIuaCIKIAogLyogUENJIElEcyAqLwotI2RlZmluZSBFRlhfVkVORElEX1NGQwkgICAgICAgIDB4MTkyNAotI2RlZmluZSBGQUxDT05fQV9QX0RFVklECTB4MDcwMwotI2RlZmluZSBGQUxDT05fQV9TX0RFVklEICAgICAgICAweDY3MDMKLSNkZWZpbmUgRkFMQ09OX0JfUF9ERVZJRCAgICAgICAgMHgwNzEwCiAjZGVmaW5lIEJFVEhQQUdFX0FfUF9ERVZJRCAgICAgIDB4MDgwMwogI2RlZmluZSBTSUVOQV9BX1BfREVWSUQgICAgICAgICAweDA4MTMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCmluZGV4IDRkZDE3NDguLjk3YjYwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKQEAgLTE0MjYsNyArMTQyNiw4IEBACiAJCX0KIAogCQlkZXYgPSBwY2lfZGV2X2dldChlZngtPnBjaV9kZXYpOwotCQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKEVGWF9WRU5ESURfU0ZDLCBGQUxDT05fQV9TX0RFVklELAorCQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSwKKwkJCQkJICAgICBQQ0lfREVWSUNFX0lEX1NPTEFSRkxBUkVfU0ZDNDAwMEFfMSwKIAkJCQkJICAgICBkZXYpKSkgewogCQkJaWYgKGRldi0+YnVzID09IGVmeC0+cGNpX2Rldi0+YnVzICYmCiAJCQkgICAgZGV2LT5kZXZmbiA9PSBlZngtPnBjaV9kZXYtPmRldmZuICsgMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKaW5kZXggYjljYzg0Ni4uNmNjMTZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jCkBAIC03NjQsNyArNzY0LDggQEAKIAogCWlmIChib2FyZC0+dHlwZSkgewogCQluZXRpZl9pbmZvKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwgImJvYXJkIGlzICVzIHJldiAlYyVkXG4iLAotCQkJIChlZngtPnBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gRUZYX1ZFTkRJRF9TRkMpCisJCQkgKGVmeC0+cGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciA9PQorCQkJICBQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUpCiAJCQkgPyBib2FyZC0+dHlwZS0+cmVmX21vZGVsIDogYm9hcmQtPnR5cGUtPmdlbl90eXBlLAogCQkJICdBJyArIGJvYXJkLT5tYWpvciwgYm9hcmQtPm1pbm9yKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCmluZGV4IGFkYmRhMTguLjc1MmQ1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgIm5ldF9kcml2ZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaWxhbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWNlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaWxhbi9LY29uZmlnCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgU2lsYW4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIE5FVF9WRU5ET1JfU0lMQU4KKwlib29sICJTaWxhbiBkZXZpY2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCisJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBTaWxhbiBkZXZpY2VzLiBJZiB5b3Ugc2F5IFksIHlvdSB3aWxsIGJlIGFza2VkIGZvcgorCSAgeW91ciBzcGVjaWZpYyBjYXJkIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgorCitpZiBORVRfVkVORE9SX1NJTEFOCisKK2NvbmZpZyBTQzkyMDMxCisJdHJpc3RhdGUgIlNpbGFuIFNDOTIwMzEgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEZhc3QgRXRoZXJuZXQgUENJIG5ldHdvcmsgY2FyZHMgYmFzZWQgb24KKwkgIHRoZSBTaWxhbiBTQzkyMDMxIGNoaXAgKHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBSc2x0ZWsgODEzOUQpLiBJZiB5b3UKKwkgIGhhdmUgb25lIG9mIHRoZXNlLCBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzYzkyMDMxLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworZW5kaWYgIyBORVRfVkVORE9SX1NJTEFOCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaWxhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDM1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaWxhbi9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTaWxhbiBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfU0M5MjAzMSkgKz0gc2M5MjAzMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL3NjOTIwMzEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL3NjOTIwMzEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9zYzkyMDMxLmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2V0aGVybmV0L3NpbGFuL3NjOTIwMzEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTQyMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTQyMC5jCmluZGV4IDRmMTU2ODAuLmVkYjI0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzk0MjAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5NDIwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlICJzbXNjOTQyMC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZwppbmRleCBhYzZmMTkwLi4yMjc0NWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKQEAgLTI5LDE1ICsyOSw2IEBACiAJICBCeSBkZWZhdWx0LCB0aGUgRE1BIGFyYml0cmF0aW9uIHNjaGVtZSBpcyBiYXNlZCBvbiBSb3VuZC1yb2JpbgogCSAgKHJ4OnR4IHByaW9yaXR5IGlzIDE6MSkuCiAKLWNvbmZpZyBTVE1NQUNfRFVBTF9NQUMKLQlib29sICJTVE1NQUM6IGR1YWwgbWFjIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVmYXVsdCBuCi0gICAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNUTU1BQ19FVEggJiYgIVNUTU1BQ19USU1FUgotCS0tLWhlbHAtLS0KLQkgIFNvbWUgU1QgU29DcyAoZm9yIGV4YW1wbGUgdGhlIHN0eDcxNDEgYW5kIHN0eDcyMDBjMikgaGF2ZSB0d28KLQkgIEV0aGVybmV0IENvbnRyb2xsZXJzLiBUaGlzIG9wdGlvbiB0dXJucyBvbiB0aGUgc2Vjb25kIEV0aGVybmV0Ci0JICBkZXZpY2Ugb24gdGhpcyBraW5kIG9mIHBsYXRmb3Jtcy4KLQogY29uZmlnIFNUTU1BQ19USU1FUgogCWJvb2wgIlNUTU1BQyBUaW1lciBvcHRpbWlzYXRpb24iCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCmluZGV4IGRkYjMzY2YuLjdiZjFlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCkBAIC0xNjc0LDYgKzE2NzQsOSBAQAogCWludCByZXN1bHQ7CiAKIAlwcl9kZWJ1ZygiJXM6IGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJdWRiZ19zaHV0ZG93bl9wczNnZWxpYygpOworCiAJcmVzdWx0ID0gcHMzX29wZW5faHZfZGV2aWNlKGRldik7CiAKIAlpZiAocmVzdWx0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5oCmluZGV4IGQzZmFkZmIuLmE5M2RmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5oCkBAIC0zNTksNiArMzU5LDEyIEBACiAJcmV0dXJuIHBvcnQtPnByaXY7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1BTM0dFTElDCitleHRlcm4gdm9pZCB1ZGJnX3NodXRkb3duX3BzM2dlbGljKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZGJnX3NodXRkb3duX3BzM2dlbGljKHZvaWQpIHt9CisjZW5kaWYKKwogZXh0ZXJuIGludCBnZWxpY19jYXJkX3NldF9pcnFfbWFzayhzdHJ1Y3QgZ2VsaWNfY2FyZCAqY2FyZCwgdTY0IG1hc2spOwogLyogc2hhcmVkIG5ldGRldiBvcHMgKi8KIGV4dGVybiB2b2lkIGdlbGljX2NhcmRfdXAoc3RydWN0IGdlbGljX2NhcmQgKmNhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMKaW5kZXggNGQxNjU4ZS4uY2FmMzY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jCkBAIC03MTYsOCArNzE2LDggQEAKIAkJY3VyX3AgPSAmbHAtPnR4X2JkX3ZbbHAtPnR4X2JkX3RhaWxdOwogCQljdXJfcC0+cGh5cyA9IGRtYV9tYXBfc2luZ2xlKG5kZXYtPmRldi5wYXJlbnQsCiAJCQkJCSAgICAgc2tiX2ZyYWdfYWRkcmVzcyhmcmFnKSwKLQkJCQkJICAgICBmcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOwotCQljdXJfcC0+bGVuID0gZnJhZ19zaXplKGZyYWcpOworCQkJCQkgICAgIHNrYl9mcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOworCQljdXJfcC0+bGVuID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsKIAkJY3VyX3AtPmFwcDAgPSAwOwogCQlmcmFnKys7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveHNjYWxlL2l4cDR4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hzY2FsZS9peHA0eHhfZXRoLmMKaW5kZXggZWM5NmQ5MS4uZjQ1Yzg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveHNjYWxlL2l4cDR4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94c2NhbGUvaXhwNHh4X2V0aC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHRwX2NsYXNzaWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1hY2gvaXhwNDZ4X3RzLmg+CiAjaW5jbHVkZSA8bWFjaC9ucGUuaD4KICNpbmNsdWRlIDxtYWNoL3FtZ3IuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZwppbmRleCBhNDBmYWI0Li5kNDIzZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCkBAIC0zMTQsNyArMzE0LDcgQEAKIAogY29uZmlnIEFVMTAwMF9GSVIKIAl0cmlzdGF0ZSAiQWxjaGVteSBBdTEwMDAgU0lSL0ZJUiIKLQlkZXBlbmRzIG9uIFNPQ19BVTEwMDAgJiYgSVJEQQorCWRlcGVuZHMgb24gSVJEQSAmJiBNSVBTX0FMQ0hFTVkKIAogY29uZmlnIFNNQ19JUkNDX0ZJUgogCXRyaXN0YXRlICJTTVNDIElyQ0MgKEVYUEVSSU1FTlRBTCkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggYTNjZTNkNC4uNzQxMzQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtMTkyLDYgKzE5MiwxMyBAQAogCQkJICovCiAJCQltYWN2bGFuX2Jyb2FkY2FzdChza2IsIHBvcnQsIHNyYy0+ZGV2LAogCQkJCQkgIE1BQ1ZMQU5fTU9ERV9WRVBBKTsKKwkJZWxzZSB7CisJCQkvKiBmb3J3YXJkIHRvIG9yaWdpbmFsIHBvcnQuICovCisJCQl2bGFuID0gc3JjOworCQkJcmV0ID0gbWFjdmxhbl9icm9hZGNhc3Rfb25lKHNrYiwgdmxhbiwgZXRoLCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJcmV0dXJuIFJYX0hBTkRMRVJfUEFTUzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9yZWFsdGVrLmMgYi9kcml2ZXJzL25ldC9waHkvcmVhbHRlay5jCmluZGV4IGE0ZWFlNzUuLmY0MTRmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9yZWFsdGVrLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3JlYWx0ZWsuYwpAQCAtMTQsNiArMTQsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFJUTDgyMXhfUEhZU1IJCTB4MTEKICNkZWZpbmUgUlRMODIxeF9QSFlTUl9EVVBMRVgJMHgyMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yaW9uZXQuYyBiL2RyaXZlcnMvbmV0L3Jpb25ldC5jCmluZGV4IDNiYjEzMTEuLjcxNDU3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Jpb25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3Jpb25ldC5jCkBAIC04OCw4ICs4OCw4IEBACiAjZGVmaW5lIGRldl9yaW9uZXRfY2FwYWJsZShkZXYpIFwKIAlpc19yaW9uZXRfY2FwYWJsZShkZXYtPnNyY19vcHMsIGRldi0+ZHN0X29wcykKIAotI2RlZmluZSBSSU9ORVRfTUFDX01BVENIKHgpCSgqKHUzMiAqKXggPT0gMHgwMDAxMDAwMSkKLSNkZWZpbmUgUklPTkVUX0dFVF9ERVNUSUQoeCkJKCoodTE2ICopKHggKyA0KSkKKyNkZWZpbmUgUklPTkVUX01BQ19NQVRDSCh4KQkoIW1lbWNtcCgoeCksICJcMDBcMDFcMDBcMDEiLCA0KSkKKyNkZWZpbmUgUklPTkVUX0dFVF9ERVNUSUQoeCkJKCgqKCh1OCAqKXggKyA0KSA8PCA4KSB8ICooKHU4ICopeCArIDUpKQogCiBzdGF0aWMgaW50IHJpb25ldF9yeF9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9sZy12bDYwMC5jIGIvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKaW5kZXggMWU3MjIxOS4uZDQzZGIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIFRoZSBkZXZpY2UgaGFzIGEgQ0RDIEFDTSBwb3J0IGZvciBtb2RlbSBjb250cm9sIChpdCBjbGFpbXMgdG8gYmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwppbmRleCA3ZDYwODIxLi5mYWUwZmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCkBAIC0xMDU3LDcgKzEwNTcsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCWludCByZXR2YWw7CiAKLQlza2JfdHhfdGltZXN0YW1wKHNrYik7CisJaWYgKHNrYikKKwkJc2tiX3R4X3RpbWVzdGFtcChza2IpOwogCiAJLy8gc29tZSBkZXZpY2VzIHdhbnQgZnVua3kgVVNCLWxldmVsIGZyYW1pbmcsIGZvcgogCS8vIHdpbjMyIGRyaXZlciAodXN1YWxseSkgYW5kL29yIGhhcmR3YXJlIHF1aXJrcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IDViMjM3NjcuLmVmODgzZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxsaW51eC92ZXRoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInZldGgiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKaW5kZXggOTEwMzlhYi4uNmVlODQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwpAQCAtOTI1LDEyICs5MjUsMTAgQEAKIHsKIAl1MTYgdjsKIAotCWlmICghdmlydGlvX2hhc19mZWF0dXJlKHZpLT52ZGV2LCBWSVJUSU9fTkVUX0ZfU1RBVFVTKSkKLQkJcmV0dXJuOwotCi0JdmktPnZkZXYtPmNvbmZpZy0+Z2V0KHZpLT52ZGV2LAorCWlmICh2aXJ0aW9fY29uZmlnX3ZhbCh2aS0+dmRldiwgVklSVElPX05FVF9GX1NUQVRVUywKIAkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZywgc3RhdHVzKSwKLQkJCSAgICAgICZ2LCBzaXplb2YodikpOworCQkJICAgICAgJnYpIDwgMCkKKwkJcmV0dXJuOwogCiAJLyogSWdub3JlIHVua25vd24gKGZ1dHVyZSkgc3RhdHVzIGJpdHMgKi8KIAl2ICY9IFZJUlRJT19ORVRfU19MSU5LX1VQOwpAQCAtMTAwNiwxMSArMTAwNCw5IEBACiAJfQogCiAJLyogQ29uZmlndXJhdGlvbiBtYXkgc3BlY2lmeSB3aGF0IE1BQyB0byB1c2UuICBPdGhlcndpc2UgcmFuZG9tLiAqLwotCWlmICh2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX05FVF9GX01BQykpIHsKLQkJdmRldi0+Y29uZmlnLT5nZXQodmRldiwKKwlpZiAodmlydGlvX2NvbmZpZ192YWxfbGVuKHZkZXYsIFZJUlRJT19ORVRfRl9NQUMsCiAJCQkJICBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX25ldF9jb25maWcsIG1hYyksCi0JCQkJICBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKLQl9IGVsc2UKKwkJCQkgIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pIDwgMCkKIAkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CiAKIAkvKiBTZXQgdXAgb3VyIGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCmluZGV4IGI3NzFlYmEuLmQ5NmJmYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgInZteG5ldDNfaW50LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYwppbmRleCA3MjdkNzI4Li4yZmVhMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKQEAgLTc4LDYgKzc4LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogCiAjZGVmaW5lIERfU1VCTU9EVUxFIGNvbnRyb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCmluZGV4IDljNzBiNWYuLjEyOWJhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnZnMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJpMjQwMG0uaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jCmluZGV4IDg1ZGFkZDUuLjdjYmQ3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jCkBAIC0xNTgsNiArMTU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJpMjQwMG0uaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vbmV0ZGV2LmMKaW5kZXggMmVkZDhmZS4uNjRhMTEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYwpAQCAtNzYsNiArNzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaTI0MDBtLmgiCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYwppbmRleCAyZjk0YTg3Li4zN2JlY2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYwpAQCAtMTQ5LDYgKzE0OSw4IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlICJpMjQwMG0uaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8uYwppbmRleCBiZTQyOGNhLi4yMWE5ZWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAjaW5jbHVkZSAiaTI0MDBtLXNkaW8uaCIKICNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEX1NVQk1PRFVMRSBtYWluCiAjaW5jbHVkZSAic2Rpby1kZWJ1Zy1sZXZlbHMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS90eC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKaW5kZXggNGIzMGVkMS4uNGI5ZWNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKQEAgLTI0NSw2ICsyNDUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImkyNDAwbS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYwppbmRleCA5YTY0NGQwLi4yYzFiOGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogCiAjZGVmaW5lIERfU1VCTU9EVUxFIHVzYgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQppbmRleCBjMWMwNjc4Li45OGRiNzYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKQEAgLTQyLDcgKzQyLDcgQEAKIG9iai0kKENPTkZJR19NV0w4SykJKz0gbXdsOGsubwogCiBvYmotJChDT05GSUdfSVdMV0lGSSkJKz0gaXdsd2lmaS8KLW9iai0kKENPTkZJR19JV0xXSUZJX0xFR0FDWSkJKz0gaXdsZWdhY3kvCitvYmotJChDT05GSUdfSVdMRUdBQ1kpCSs9IGl3bGVnYWN5Lwogb2JqLSQoQ09ORklHX1JUMlgwMCkJKz0gcnQyeDAwLwogCiBvYmotJChDT05GSUdfUDU0X0NPTU1PTikJKz0gcDU0LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS5jCmluZGV4IDNiNzUyZDkuLmY1Y2U1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FkbTgyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hZG04MjExLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvZWVwcm9tXzkzY3g2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJhZG04MjExLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCmluZGV4IDM5MzIyZDQuLjQwNDVlNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkJZ290byBleGl0OwogCiAJd2hpbGUgKGxlbi0tKSB7Ci0JCW9idWYgPSBwYWNrX2hleF9ieXRlKG9idWYsICppYnVmKyspOworCQlvYnVmID0gaGV4X2J5dGVfcGFjayhvYnVmLCAqaWJ1ZisrKTsKIAkJKm9idWYrKyA9ICctJzsKIAl9CiAJb2J1Zi0tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZwppbmRleCAwNzM1NDg4Li4wOTYwMjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIG1lbnVjb25maWcgQVRIX0NPTU1PTgogCXRyaXN0YXRlICJBdGhlcm9zIFdpcmVsZXNzIENhcmRzIgotCWRlcGVuZHMgb24gQ0ZHODAyMTEKKwlkZXBlbmRzIG9uIENGRzgwMjExICYmICghVU1MIHx8IEJST0tFTikKIAktLS1oZWxwLS0tCiAJICBUaGlzIHdpbGwgZW5hYmxlIHRoZSBzdXBwb3J0IGZvciB0aGUgQXRoZXJvcyB3aXJlbGVzcyBkcml2ZXJzLgogCSAgYXRoNWssIGF0aDlrLCBhdGg5a19odGMgYW5kIGFyOTE3MCBkcml2ZXJzIHNoYXJlIHNvbWUgY29tbW9uIGNvZGUsIHRoaXMgb3B0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKaW5kZXggZmU0YmY0ZC4uYzFkNjk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGguaApAQCAtMTUyLDYgKzE1Miw3IEBACiAJc3RydWN0IGF0aF9jeWNsZV9jb3VudGVycyBjY19zdXJ2ZXk7CiAKIAlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgcmVndWxhdG9yeTsKKwlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgcmVnX3dvcmxkX2NvcHk7CiAJY29uc3Qgc3RydWN0IGF0aF9vcHMgKm9wczsKIAljb25zdCBzdHJ1Y3QgYXRoX2J1c19vcHMgKmJ1c19vcHM7CiAKQEAgLTE3Myw4ICsxNzQsNyBAQAogdm9pZCBhdGhfaHdfY3ljbGVfY291bnRlcnNfdXBkYXRlKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24pOwogaW50MzJfdCBhdGhfaHdfZ2V0X2xpc3Rlbl90aW1lKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24pOwogCi1leHRlcm4gX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLXZvaWQgYXRoX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpIHZvaWQgYXRoX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIF9hdGhfcHJpbnRrKGxldmVsLCBjb21tb24sIGZtdCwgLi4uKQkJCVwKIGRvIHsJCQkJCQkJCVwKQEAgLTIxNSw2ICsyMTUsMTAgQEAKICAqIEBBVEhfREJHX0hXVElNRVI6IGhhcmR3YXJlIHRpbWVyIGhhbmRsaW5nCiAgKiBAQVRIX0RCR19CVENPRVg6IGJsdWV0b290aCBjb2V4aXN0YW5jZQogICogQEFUSF9EQkdfQlNUVUNLOiBzdHVjayBiZWFjb25zCisgKiBAQVRIX0RCR19NQ0k6IE1lc3NhZ2UgQ29leGlzdGVuY2UgSW50ZXJmYWNlLCBhIHByaXZhdGUgcHJvdG9jb2wKKyAqCXVzZWQgZXhjbHVzaXZlbHkgZm9yIFdMQU4tQlQgY29leGlzdGVuY2Ugc3RhcnRpbmcgZnJvbQorICoJQVI5NDYyLgorICogQEFUSF9EQkdfREZTOiByYWRhciBkYXRlY3Rpb24KICAqIEBBVEhfREJHX0FOWTogZW5hYmxlIGFsbCBkZWJ1Z2dpbmcKICAqCiAgKiBUaGUgZGVidWcgbGV2ZWwgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhbW91bnQgYW5kIHR5cGUgb2YgZGVidWdnaW5nIG91dHB1dApAQCAtMjQxLDYgKzI0NSw3IEBACiAJQVRIX0RCR19XTUkJCT0gMHgwMDAwNDAwMCwKIAlBVEhfREJHX0JTVFVDSwkJPSAweDAwMDA4MDAwLAogCUFUSF9EQkdfTUNJCQk9IDB4MDAwMTAwMDAsCisJQVRIX0RCR19ERlMJCT0gMHgwMDAyMDAwMCwKIAlBVEhfREJHX0FOWQkJPSAweGZmZmZmZmZmCiB9OwogCkBAIC0yNTksNyArMjY0LDcgQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK3N0YXRpYyBpbmxpbmUgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQogdm9pZCBhdGhfZGJnKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGVudW0gQVRIX0RFQlVHIGRiZ19tYXNrLAogCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKaW5kZXggZTViZTdlNzAuLmVlN2VhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKQEAgLTE2Niw3ICsxNjYsOSBAQAogCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwICYmCiAJCSAgICAoYmNmZy0+Y29uZmlnLT5mbGFncyAmIChCRF9XTEFOMCB8IEJEX1dMQU4xKSkgPT0KIAkJICAgICAoQkRfV0xBTjEgfCBCRF9XTEFOMCkpCi0JCQlfX3NldF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpOworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbmVlZHNfMkdIel9vdnIgPSB0cnVlOworCQllbHNlCisJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9uZWVkc18yR0h6X292ciA9IGZhbHNlOwogCX0KIAogCXJldCA9IGF0aDVrX2luaXRfYWgoYWgsICZhdGhfYWhiX2J1c19vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jCmluZGV4IGJlYTkwZTYuLmJmNjc0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmMKQEAgLTI3LDE1ICsyNywyMSBAQAogICogb3IgcmVkdWNpbmcgc2Vuc2l0aXZpdHkgYXMgbmVjZXNzYXJ5LgogICoKICAqIFRoZSBwYXJhbWV0ZXJzIGFyZToKKyAqCiAgKiAgIC0gIm5vaXNlIGltbXVuaXR5IgorICoKICAqICAgLSAic3B1ciBpbW11bml0eSIKKyAqCiAgKiAgIC0gImZpcnN0ZXAgbGV2ZWwiCisgKgogICogICAtICJPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbiIKKyAqCiAgKiAgIC0gIkNDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24iCiAgKgogICogQmFzaWNhbGx5IHdlIGxvb2sgYXQgdGhlIGFtb3VudCBvZiBPREZNIGFuZCBDQ0sgdGltaW5nIGVycm9ycyB3ZSBnZXQgYW5kIHRoZW4KICAqIHJhaXNlIG9yIGxvd2VyIGltbXVuaXR5IGFjY29yZGluZ2x5IGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UKICAqIHBhcmFtZXRlcnMuCisgKgogICogTmV3ZXIgY2hpcHNldHMgaGF2ZSBQSFkgZXJyb3IgY291bnRlcnMgaW4gaGFyZHdhcmUgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIE1JQgogICogaW50ZXJydXB0IHdoZW4gdGhleSBvdmVyZmxvdy4gT2xkZXIgaGFyZHdhcmUgaGFzIHRvbyBlbmFibGUgUEhZIGVycm9yIGZyYW1lcwogICogYnkgc2V0dGluZyBhIFJYIGZsYWcgYW5kIHRoZW4gY291bnQgZXZlcnkgc2luZ2xlIFBIWSBlcnJvci4gV2hlbiBhIHNwZWNpZmllZApAQCAtNDUsMTEgKzUxLDEzIEBACiAgKi8KIAogCi0vKioqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbCgpIC0gU2V0IG5vaXNlIGltbXVuaXR5IGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX05PSVNFX0lNTV9MVkwKICAqLwogdm9pZApAQCAtOTEsMTIgKzk5LDExIEBACiAJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwgIm5ldyBsZXZlbCAlZCIsIGxldmVsKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbCgpIC0gU2V0IHNwdXIgaW1tdW5pdHkgbGV2ZWwKLSAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAbGV2ZWw6IGxldmVsIGJldHdlZW4gMCBhbmQgQG1heF9zcHVyX2xldmVsICh0aGUgbWF4aW11bSBsZXZlbCBpcyBkZXBlbmRlbnQKLSAqCW9uIHRoZSBjaGlwIHJldmlzaW9uKS4KKyAqIG9uIHRoZSBjaGlwIHJldmlzaW9uKS4KICAqLwogdm9pZAogYXRoNWtfYW5pX3NldF9zcHVyX2ltbXVuaXR5X2xldmVsKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBsZXZlbCkKQEAgLTExNywxMCArMTI0LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgogICogYXRoNWtfYW5pX3NldF9maXJzdGVwX2xldmVsKCkgLSBTZXQgImZpcnN0ZXAiIGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX0ZJUlNURVBfTFZMCiAgKi8KIHZvaWQKQEAgLTE0MCwxMSArMTQ2LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gQ29udHJvbCBPRkRNIHdlYWsgc2lnbmFsCi0gKgkJCQkJCWRldGVjdGlvbgotICoKKyAqIGF0aDVrX2FuaV9zZXRfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24oKSAtIFNldCBPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0xODIsMTAgKzE4Niw5IEBACiAJCQkgIG9uID8gIm9uIiA6ICJvZmYiKTsKIH0KIAotCiAvKioKLSAqIGF0aDVrX2FuaV9zZXRfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gY29udHJvbCBDQ0sgd2VhayBzaWduYWwgZGV0ZWN0aW9uCi0gKgorICogYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKCkgLSBTZXQgQ0NLIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0yMDAsMTMgKzIwMywxNiBAQAogfQogCiAKLS8qKiogQU5JIGFsZ29yaXRobSAqKiovCisvKioqKioqKioqKioqKioqXAorKiBBTkkgYWxnb3JpdGhtICoKK1wqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KCkgLSBJbmNyZWFzZSBub2lzZSBpbW11bml0eQotICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKiBAb2ZkbV90cmlnZ2VyOiBJZiB0aGlzIGlzIHRydWUgd2UgYXJlIGNhbGxlZCBiZWNhdXNlIG9mIHRvbyBtYW55IE9GRE0gZXJyb3JzLAotICoJdGhlIGFsZ29yaXRobSB3aWxsIHR1bmUgbW9yZSBwYXJhbWV0ZXJzIHRoZW4uCisgKiB0aGUgYWxnb3JpdGhtIHdpbGwgdHVuZSBtb3JlIHBhcmFtZXRlcnMgdGhlbi4KICAqCiAgKiBUcnkgdG8gcmFpc2Ugbm9pc2UgaW1tdW5pdHkgKD1kZWNyZWFzZSBzZW5zaXRpdml0eSkgaW4gc2V2ZXJhbCBzdGVwcwogICogZGVwZW5kaW5nIG9uIHRoZSBhdmVyYWdlIFJTU0kgb2YgdGhlIGJlYWNvbnMgd2UgcmVjZWl2ZWQuCkBAIC0yOTAsOSArMjk2LDEwIEBACiAJKi8KIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9sb3dlcl9pbW11bml0eSgpIC0gRGVjcmVhc2Ugbm9pc2UgaW1tdW5pdHkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogVHJ5IHRvIGxvd2VyIG5vaXNlIGltbXVuaXR5ICg9aW5jcmVhc2Ugc2Vuc2l0aXZpdHkpIGluIHNldmVyYWwgc3RlcHMKICAqIGRlcGVuZGluZyBvbiB0aGUgYXZlcmFnZSBSU1NJIG9mIHRoZSBiZWFjb25zIHdlIHJlY2VpdmVkLgpAQCAtMzUyLDkgKzM1OSwxMCBAQAogCX0KIH0KIAotCiAvKioKICAqIGF0aDVrX2h3X2FuaV9nZXRfbGlzdGVuX3RpbWUoKSAtIFVwZGF0ZSBjb3VudGVycyBhbmQgcmV0dXJuIGxpc3RlbmluZyB0aW1lCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAYXM6IFRoZSAmc3RydWN0IGF0aDVrX2FuaV9zdGF0ZQogICoKICAqIFJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIHNwZW50ICJsaXN0ZW5pbmciIGluIG1pbGxpc2Vjb25kcyAobXMpCiAgKiBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCkBAIC0zNzksOSArMzg3LDEwIEBACiAJcmV0dXJuIGxpc3RlbjsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zYXZlX2FuZF9jbGVhcl9waHlfZXJyb3JzKCkgLSBDbGVhciBhbmQgc2F2ZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogQ2xlYXIgdGhlIFBIWSBlcnJvciBjb3VudGVycyBhcyBzb29uIGFzIHBvc3NpYmxlLCBzaW5jZSB0aGlzIG1pZ2h0IGJlIGNhbGxlZAogICogZnJvbSBhIE1JQiBpbnRlcnJ1cHQgYW5kIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBpbnRlcnJ1cHRlZCBhZ2Fpbi4KQEAgLTQyOSwxNCArNDM4LDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogLyoqCiAgKiBhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoKSAtIFJlc3RhcnQgQU5JIHBlcmlvZAorICogQGFzOiBUaGUgJnN0cnVjdCBhdGg1a19hbmlfc3RhdGUKICAqCiAgKiBKdXN0IHJlc2V0IGNvdW50ZXJzLCBzbyB0aGV5IGFyZSBjbGVhciBmb3IgdGhlIG5leHQgImFuaSBwZXJpb2QiLgogICovCiBzdGF0aWMgdm9pZAotYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQorYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQogewogCS8qIGtlZXAgbGFzdCB2YWx1ZXMgZm9yIGRlYnVnZ2luZyAqLwogCWFzLT5sYXN0X29mZG1fZXJyb3JzID0gYXMtPm9mZG1fZXJyb3JzOwpAQCAtNDQ4LDkgKzQ1Nyw5IEBACiAJYXMtPmxpc3Rlbl90aW1lID0gMDsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9jYWxpYnJhdGlvbigpIC0gVGhlIG1haW4gQU5JIGNhbGlicmF0aW9uIGZ1bmN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogV2UgY291bnQgT0ZETSBhbmQgQ0NLIGVycm9ycyByZWxhdGl2ZSB0byB0aGUgdGltZSB3aGVyZSB3ZSBkaWQgbm90IHNlbmQgb3IKICAqIHJlY2VpdmUgKCJsaXN0ZW4iIHRpbWUpIGFuZCByYWlzZSBvciBsb3dlciBpbW11bml0eSBhY2NvcmRpbmdseS4KQEAgLTQ5Miw3ICs1MDEsNyBAQAogCQkvKiB0b28gbWFueSBQSFkgZXJyb3JzIC0gd2UgaGF2ZSB0byByYWlzZSBpbW11bml0eSAqLwogCQlib29sIG9mZG1fZmxhZyA9IGFzLT5vZmRtX2Vycm9ycyA+IG9mZG1faGlnaCA/IHRydWUgOiBmYWxzZTsKIAkJYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KGFoLCBhcywgb2ZkbV9mbGFnKTsKLQkJYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KGFoLCBhcyk7CisJCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhcyk7CiAKIAl9IGVsc2UgaWYgKGFzLT5saXN0ZW5fdGltZSA+IDUgKiBBVEg1S19BTklfTElTVEVOX1BFUklPRCkgewogCQkvKiBJZiBtb3JlIHRoYW4gNSAoVE9ETzogd2h5IDU/KSBwZXJpb2RzIGhhdmUgcGFzc2VkIGFuZCB3ZSBnb3QKQEAgLTUwNCwxNSArNTEzLDE4IEBACiAJCWlmIChhcy0+b2ZkbV9lcnJvcnMgPD0gb2ZkbV9sb3cgJiYgYXMtPmNja19lcnJvcnMgPD0gY2NrX2xvdykKIAkJCWF0aDVrX2FuaV9sb3dlcl9pbW11bml0eShhaCwgYXMpOwogCi0JCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhaCwgYXMpOworCQlhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoYXMpOwogCX0KIH0KIAogCi0vKioqIElOVEVSUlVQVCBIQU5ETEVSICoqKi8KKy8qKioqKioqKioqKioqKioqKioqXAorKiBJbnRlcnJ1cHQgaGFuZGxlciAqCitcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCiAgKiBhdGg1a19hbmlfbWliX2ludHIoKSAtIEludGVycnVwdCBoYW5kbGVyIGZvciBBTkkgTUlCIGNvdW50ZXJzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogSnVzdCByZWFkICYgcmVzZXQgdGhlIHJlZ2lzdGVycyBxdWlja2x5LCBzbyB0aGV5IGRvbid0IGdlbmVyYXRlIG1vcmUKICAqIGludGVycnVwdHMsIHNhdmUgdGhlIGNvdW50ZXJzIGFuZCBzY2hlZHVsZSB0aGUgdGFza2xldCB0byBkZWNpZGUgd2hldGhlcgpAQCAtNTQ5LDkgKzU2MSwxMSBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoKSAtIFVzZWQgYnkgb2xkZXIgSFcgdG8gcmVwb3J0IFBIWSBlcnJvcnMKKyAqIGF0aDVrX2FuaV9waHlfZXJyb3JfcmVwb3J0IC0gVXNlZCBieSBvbGRlciBIVyB0byByZXBvcnQgUEhZIGVycm9ycworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBwaHllcnI6IE9uZSBvZiBlbnVtIGF0aDVrX3BoeV9lcnJvcl9jb2RlCiAgKgogICogVGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHdpdGhvdXQgUEhZIGVycm9yIGNvdW50ZXJzIHRvIHJlcG9ydCBQSFkgZXJyb3JzCiAgKiBvbiBhIGZyYW1lLWJ5LWZyYW1lIGJhc2lzLCBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHQuCkBAIC01NzQsMTAgKzU4OCwxMyBAQAogfQogCiAKLS8qKiogSU5JVCAqKiovCisvKioqKioqKioqKioqKioqKlwKKyogSW5pdGlhbGl6YXRpb24gKgorXCoqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfZW5hYmxlX3BoeV9lcnJfY291bnRlcnMoKSAtIEVuYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBFbmFibGUgUEhZIGVycm9yIGNvdW50ZXJzIGZvciBPRkRNIGFuZCBDQ0sgdGltaW5nIGVycm9ycy4KICAqLwpAQCAtNTk2LDkgKzYxMyw5IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2Rpc2FibGVfcGh5X2Vycl9jb3VudGVycygpIC0gRGlzYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBEaXNhYmxlIFBIWSBlcnJvciBjb3VudGVycyBmb3IgT0ZETSBhbmQgQ0NLIHRpbWluZyBlcnJvcnMuCiAgKi8KQEAgLTYxNSwxMCArNjMyLDEwIEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9pbml0KCkgLSBJbml0aWFsaXplIEFOSQotICogQG1vZGU6IFdoaWNoIG1vZGUgdG8gdXNlIChhdXRvLCBtYW51YWwgaGlnaCwgbWFudWFsIGxvdywgb2ZmKQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCiAgKgogICogSW5pdGlhbGl6ZSBBTkkgYWNjb3JkaW5nIHRvIG1vZGUuCiAgKi8KQEAgLTY5NSwxMCArNzEyLDE4IEBACiB9CiAKIAotLyoqKiBERUJVRyAqKiovCisvKioqKioqKioqKioqKipcCisqIERlYnVnIG91dHB1dCAqCitcKioqKioqKioqKioqKiovCiAKICNpZmRlZiBDT05GSUdfQVRINUtfREVCVUcKIAorLyoqCisgKiBhdGg1a19hbmlfcHJpbnRfY291bnRlcnMoKSAtIFByaW50IEFOSSBjb3VudGVycworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFVzZWQgZm9yIGRlYnVnZ2luZyBBTkkKKyAqLwogdm9pZAogYXRoNWtfYW5pX3ByaW50X2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmgKaW5kZXggNzM1OGI2Yy4uMjFhYTM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuaApAQCAtNDAsMTMgKzQwLDEzIEBACiAgKiBlbnVtIGF0aDVrX2FuaV9tb2RlIC0gbW9kZSBmb3IgQU5JIC8gbm9pc2Ugc2Vuc2l0aXZpdHkKICAqCiAgKiBAQVRINUtfQU5JX01PREVfT0ZGOiBUdXJuIEFOSSBvZmYuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBqdXN0IHN0b3AgdGhlIEFOSQotICoJYWxnb3JpdGhtIGFmdGVyIGl0IGhhcyBiZWVuIG9uIGF1dG8gbW9kZS4KLSAqIEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCi0gKgltYXhpbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgotICogQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAotICoJbWluaW1pemluZyBzZW5zaXRpdml0eS4gQU5JIHdpbGwgbm90IHJ1bi4KLSAqIEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQotICoJYW1vdW50IG9mIE9GRE0gYW5kIENDSyBmcmFtZSBlcnJvcnMgKGRlZmF1bHQpLgorICoJCQlhbGdvcml0aG0gYWZ0ZXIgaXQgaGFzIGJlZW4gb24gYXV0byBtb2RlLgorICogQEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCisgKgkJCW1heGltaXppbmcgc2Vuc2l0aXZpdHkuIEFOSSB3aWxsIG5vdCBydW4uCisgKiBAQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAorICoJCQltaW5pbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgorICogQEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQorICoJCQlhbW91bnQgb2YgT0ZETSBhbmQgQ0NLIGZyYW1lIGVycm9ycyAoZGVmYXVsdCkuCiAgKi8KIGVudW0gYXRoNWtfYW5pX21vZGUgewogCUFUSDVLX0FOSV9NT0RFX09GRgkJPSAwLApAQCAtNTgsOCArNTgsMjIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIC0gQU5JIHN0YXRlIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzCi0gKgotICogQG1heF9zcHVyX2xldmVsOiB0aGUgbWF4aW11bSBzcHVyIGxldmVsIGlzIGNoaXAgZGVwZW5kZW50CisgKiBAYW5pX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCisgKiBAbm9pc2VfaW1tX2xldmVsOiBOb2lzZSBpbW11bml0eSBsZXZlbAorICogQHNwdXJfbGV2ZWw6IFNwdXIgaW1tdW5pdHkgbGV2ZWwKKyAqIEBmaXJzdGVwX2xldmVsOiBGSVJzdGVwIGxldmVsCisgKiBAb2ZkbV93ZWFrX3NpZzogT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBjY2tfd2Vha19zaWc6IENDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBtYXhfc3B1cl9sZXZlbDogTWF4IHNwdXIgaW1tdW5pdHkgbGV2ZWwgKGNoaXAgc3BlY2lmaWMpCisgKiBAbGlzdGVuX3RpbWU6IExpc3RlbiB0aW1lCisgKiBAb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50CisgKiBAY2NrX2Vycm9yczogQ0NLIHRpbWluZyBlcnJvciBjb3VudAorICogQGxhc3RfY2M6IFRoZSAmc3RydWN0IGF0aF9jeWNsZV9jb3VudGVycyAoZm9yIHN0YXRzKQorICogQGxhc3RfbGlzdGVuOiBMaXN0ZW4gdGltZSBmcm9tIHByZXZpb3VzIHJ1biAoZm9yIHN0YXRzKQorICogQGxhc3Rfb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50IGZyb20gcHJldmlvdXMgcnVuIChmb3IgdGF0cykKKyAqIEBsYXN0X2Nja19lcnJvcnM6IENDSyB0aW1pbmcgZXJyb3IgY291bnQgZnJvbSBwcmV2aW91cyBydW4gKGZvciBzdGF0cykKKyAqIEBzdW1fb2ZkbV9lcnJvcnM6IFN1bSBvZiBPRkRNIHRpbWluZyBlcnJvcnMgKGZvciBzdGF0cykKKyAqIEBzdW1fY2NrX2Vycm9yczogU3VtIG9mIGFsbCBDQ0sgdGltaW5nIGVycm9ycyAoZm9yIHN0YXRzKQogICovCiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIHsKIAllbnVtIGF0aDVrX2FuaV9tb2RlCWFuaV9tb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAppbmRleCBmZWNiY2Q5Li5lNTY0ZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaApAQCAtMTg3LDEwICsxODcsOSBAQAogI2RlZmluZSBBUjVLX1RVTkVfTUFYX1RYUE9XRVIJCQk2MwogI2RlZmluZSBBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSCQkyNQogI2RlZmluZSBBUjVLX1RVTkVfVFBDX1RYUE9XRVIJCQlmYWxzZQotI2RlZmluZSBBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwgICAgMTAwMDAgICAvKiAxMCBzZWMgKi8KKyNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMICAgIDYwMDAwICAgLyogNjAgc2VjICovCisjZGVmaW5lCUFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQJMTAwMDAJLyogMTAgc2VjICovCiAjZGVmaW5lIEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfQU5JCTEwMDAJLyogMSBzZWMgKi8KLSNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9ORgk2MDAwMAkvKiA2MCBzZWMgKi8KLQogI2RlZmluZSBBVEg1S19UWF9DT01QTEVURV9QT0xMX0lOVAkJMzAwMAkvKiAzIHNlYyAqLwogCiAjZGVmaW5lIEFSNUtfSU5JVF9DQVJSX1NFTlNFX0VOCQkJMQpAQCAtMjYyLDE2ICsyNjEsMzQgQEAKICNkZWZpbmUJQVI1S19BR0NfU0VUVExJTkdfVFVSQk8JCQkzNwogCiAKLS8qIEdFTkVSSUMgQ0hJUFNFVCBERUZJTklUSU9OUyAqLwogCi0vKiBNQUMgQ2hpcHMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogR0VORVJJQyBDSElQU0VUIERFRklOSVRJT05TICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBlbnVtIGF0aDVrX3ZlcnNpb24gLSBNQUMgQ2hpcHMKKyAqIEBBUjVLX0FSNTIxMDogQVI1MjEwIChDcmV0ZSkKKyAqIEBBUjVLX0FSNTIxMTogQVI1MjExIChPYWh1L01hdWkpCisgKiBAQVI1S19BUjUyMTI6IEFSNTIxMiAoVmVuaWNlKSBhbmQgbmV3ZXIKKyAqLwogZW51bSBhdGg1a192ZXJzaW9uIHsKIAlBUjVLX0FSNTIxMAk9IDAsCiAJQVI1S19BUjUyMTEJPSAxLAogCUFSNUtfQVI1MjEyCT0gMiwKIH07CiAKLS8qIFBIWSBDaGlwcyAqLworLyoqCisgKiBlbnVtIGF0aDVrX3JhZGlvIC0gUEhZIENoaXBzCisgKiBAQVI1S19SRjUxMTA6IFJGNTExMCAoRmV6KQorICogQEFSNUtfUkY1MTExOiBSRjUxMTEgKFNvbWJyZXJvKQorICogQEFSNUtfUkY1MTEyOiBSRjIxMTIvNTExMihBKSAoRGVyYnkvRGVyYnkyKQorICogQEFSNUtfUkYyNDEzOiBSRjI0MTMvMjQxNCAoR3JpZmZpbi9HcmlmZmluLUxpdGUpCisgKiBAQVI1S19SRjU0MTM6IFJGNTQxMy81NDE0LzU0MjQgKEVhZ2xlL0NvbmRvcikKKyAqIEBBUjVLX1JGMjMxNjogUkYyMzE1LzIzMTYgKENvYnJhIFNvQykKKyAqIEBBUjVLX1JGMjMxNzogUkYyMzE3IChTcGlkZXIgU29DKQorICogQEFSNUtfUkYyNDI1OiBSRjI0MjUvMjQxNyAoU3dhbi9OYWxsYSkKKyAqLwogZW51bSBhdGg1a19yYWRpbyB7CiAJQVI1S19SRjUxMTAJPSAwLAogCUFSNUtfUkY1MTExCT0gMSwKQEAgLTMwMywxMSArMzIwLDExIEBACiAjZGVmaW5lIEFSNUtfU1JFVl9BUjUyMTNBCTB4NTkgLyogSGFpbmFuICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjI0MTMJMHg3OCAvKiBHcmlmZmluIGxpdGUgKi8KICNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNAkweDcwIC8qIEdyaWZmaW4gKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNiAweDg2IC8qIEFQNTEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNyAweDg3IC8qIEFQNTEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I2CTB4ODYgLyogQVA1MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I3CTB4ODcgLyogQVA1MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MjQJMHg5MCAvKiBDb25kb3IgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMSAweDkwIC8qIEFQNjEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMiAweDkxIC8qIEFQNjEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IxCTB4OTAgLyogQVA2MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IyCTB4OTEgLyogQVA2MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTMJMHhhNCAvKiBFYWdsZSBsaXRlICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTQJMHhhMCAvKiBFYWdsZSAqLwogI2RlZmluZSBBUjVLX1NSRVZfQVIyNDE1CTB4YjAgLyogVGFsb24gKi8KQEAgLTM0NCwzMiArMzYxLDQwIEBACiAKIC8qIFRPRE8gYWRkIHN1cHBvcnQgdG8gbWFjODAyMTEgZm9yIHZlbmRvci1zcGVjaWZpYyByYXRlcyBhbmQgbW9kZXMgKi8KIAotLyoKKy8qKgorICogRE9DOiBBdGhlcm9zIFhSCisgKgogICogU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGJhc2VkIG9uIERvY3VtZW50YXRpb24gZnJvbToKICAqCiAgKiBodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy93aWtpL0NoaXBzZXRGZWF0dXJlcy9TdXBlckFHCiAgKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgZVh0ZW5kZWQgUmFuZ2UgLSByYW5nZSBlbmhhbmNpbmcgZXh0ZW5zaW9uIHRoYXQgaXMKLSAqIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgZGlzdGFuY2UgYW4gQXRoZXJvcyBjbGllbnQgZGV2aWNlIGNhbiBrZWVwIGEKLSAqIGNvbm5lY3Rpb24gd2l0aCBhbiBBdGhlcm9zIGFjY2VzcyBwb2ludC4gVGhpcyBpcyBhY2hpZXZlZCBieSBpbmNyZWFzaW5nCi0gKiB0aGUgcmVjZWl2ZXIgc2Vuc2l0aXZpdHkgdXAgdG8sIC0xMDVkQm0sIHdoaWNoIGlzIGFib3V0IDIwZEIgYWJvdmUgd2hhdAotICogdGhlIDgwMi4xMSBzcGVjaWZpY2F0aW9ucyBkZW1hbmQuIEluIGFkZGl0aW9uLCBuZXcgKHByb3ByaWV0YXJ5KSBkYXRhIHJhdGVzCi0gKiBhcmUgaW50cm9kdWNlZDogMywgMiwgMSwgMC41IGFuZCAwLjI1IE1CaXQvcy4KKyAqIEF0aGVyb3MnIGVYdGVuZGVkIFJhbmdlIC0gcmFuZ2UgZW5oYW5jaW5nIGV4dGVuc2lvbiBpcyBhIG1vZHVsYXRpb24gc2NoZW1lCisgKiB0aGF0IGlzIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgbGluayBkaXN0YW5jZSBiZXR3ZWVuIGFuIEF0aGVyb3MgWFItZW5hYmxlZAorICogY2xpZW50IGRldmljZSB3aXRoIGFuIEF0aGVyb3MgWFItZW5hYmxlZCBhY2Nlc3MgcG9pbnQuIFRoaXMgaXMgYWNoaWV2ZWQKKyAqIGJ5IGluY3JlYXNpbmcgdGhlIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHVwIHRvLCAtMTA1ZEJtLCB3aGljaCBpcyBhYm91dCAyMGRCCisgKiBhYm92ZSB3aGF0IHRoZSA4MDIuMTEgc3BlY2lmaWNhdGlvbnMgZGVtYW5kLiBJbiBhZGRpdGlvbiwgbmV3IChwcm9wcmlldGFyeSkKKyAqIGRhdGEgcmF0ZXMgYXJlIGludHJvZHVjZWQ6IDMsIDIsIDEsIDAuNSBhbmQgMC4yNSBNQml0L3MuCiAgKgogICogUGxlYXNlIG5vdGUgdGhhdCBjYW4geW91IGVpdGhlciB1c2UgWFIgb3IgVFVSQk8gYnV0IHlvdSBjYW5ub3QgdXNlIGJvdGgsCiAgKiB0aGV5IGFyZSBleGNsdXNpdmUuCiAgKgorICogQWxzbyBub3RlIHRoYXQgd2UgZG8gbm90IHBsYW4gdG8gc3VwcG9ydCBYUiBtb2RlIGF0IGxlYXN0IGZvciBub3cuIFlvdSBjYW4KKyAqIGdldCBhIG1vZGUgc2ltaWxhciB0byBYUiBieSB1c2luZyA1TUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1hSCQkweDAwMDAwMjAwCi0vKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgVHVyYm8gRyBhbmQgVHVyYm8gQSwgaXRzIHN1cHBvc2VkIHRvIHByb3ZpZGUgYQotICogdGhyb3VnaHB1dCB0cmFuc21pc3Npb24gc3BlZWQgdXAgdG8gNDBNYml0L3MtNjBNYml0L3MgYXQgYSAxMDhNYml0L3MKLSAqIHNpZ25hbGluZyByYXRlIGFjaGlldmVkIHRocm91Z2ggdGhlIGJvbmRpbmcgb2YgdHdvIDU0TWJpdC9zIDgwMi4xMWcKLSAqIGNoYW5uZWxzLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdXIgQWNjZXNzIFBvaW50IG11c3QgYWxzbyBzdXBwb3J0IGl0LgorCisKKy8qKgorICogRE9DOiBBdGhlcm9zIFN1cGVyQUcKKyAqCisgKiBJbiBhZGRpdGlvbiB0byBYUiB3ZSBoYXZlIGFub3RoZXIgbW9kdWxhdGlvbiBzY2hlbWUgY2FsbGVkIFRVUkJPIG1vZGUKKyAqIHRoYXQgaXMgc3VwcG9zZWQgdG8gcHJvdmlkZSBhIHRocm91Z2hwdXQgdHJhbnNtaXNzaW9uIHNwZWVkIHVwIHRvIDQwTWJpdC9zCisgKiAtNjBNYml0L3MgYXQgYSAxMDhNYml0L3Mgc2lnbmFsaW5nIHJhdGUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYm9uZGluZyBvZiB0d28KKyAqIDU0TWJpdC9zIDgwMi4xMWcgY2hhbm5lbHMuIFRvIHVzZSB0aGlzIGZlYXR1cmUgYm90aCBlbmRzIG11c3Qgc3VwcG9ydCBpdC4KICAqIFRoZXJlIGlzIGFsc28gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuICJzdGF0aWMiIGFuZCAiZHluYW1pYyIgdHVyYm8gbW9kZXM6CiAgKgogICogLSBTdGF0aWM6IGlzIHRoZSBkdW1iIHZlcnNpb246IGRldmljZXMgc2V0IHRvIHRoaXMgbW9kZSBzdGljayB0byBpdCB1bnRpbAogICogICAgIHRoZSBtb2RlIGlzIHR1cm5lZCBvZmYuCisgKgogICogLSBEeW5hbWljOiBpcyB0aGUgaW50ZWxsaWdlbnQgdmVyc2lvbiwgdGhlIG5ldHdvcmsgZGVjaWRlcyBpdHNlbGYgaWYgaXQKICAqICAgICBpcyBvayB0byB1c2UgdHVyYm8uIEFzIHNvb24gYXMgdHJhZmZpYyBpcyBkZXRlY3RlZCBvbiBhZGphY2VudCBjaGFubmVscwogICogICAgICh3aGljaCB3b3VsZCBnZXQgdXNlZCBpbiB0dXJibyBtb2RlKSwgb3Igd2hlbiBhIG5vbi10dXJibyBzdGF0aW9uIGpvaW5zCkBAIC0zODMsMjQgKzQwOCwzOSBAQAogICoKICAqIGh0dHA6Ly93d3cucGN3b3JsZC5jb20vYXJ0aWNsZS9pZCwxMTM0MjgtcGFnZSwxL2FydGljbGUuaHRtbAogICoKLSAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4gSW4gYWRkaXRpb24gdG8KLSAqIGRlY2lkaW5nIHdoYXQgY2hhbm5lbHMgd2lsbCBiZSB1c2VkLCB0aGVzZSAiVHVyYm8iIG1vZGVzIGFyZSBhY2NvbXBsaXNoZWQKLSAqIGJ5IGFsc28gZW5hYmxpbmcgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBUVVJCTyBtb2RlcyB3ZSBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBmb3IgZXZlbgorICogZ3JlYXRlciBzcGVlZC11cDoKICAqCiAgKiAtIEJ1cnN0aW5nOiBhbGxvd3MgbXVsdGlwbGUgZnJhbWVzIHRvIGJlIHNlbnQgYXQgb25jZSwgcmF0aGVyIHRoYW4gcGF1c2luZwogICogICAgIGFmdGVyIGVhY2ggZnJhbWUuIEJ1cnN0aW5nIGlzIGEgc3RhbmRhcmRzLWNvbXBsaWFudCBmZWF0dXJlIHRoYXQgY2FuIGJlCiAgKiAgICAgdXNlZCB3aXRoIGFueSBBY2Nlc3MgUG9pbnQuCisgKgogICogLSBGYXN0IGZyYW1lczogaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgc2VudCBwZXIKICAqICAgICBmcmFtZSwgYWxzbyByZXN1bHRpbmcgaW4gYSByZWR1Y3Rpb24gb2YgdHJhbnNtaXNzaW9uIG92ZXJoZWFkLiBJdCBpcyBhCiAgKiAgICAgcHJvcHJpZXRhcnkgZmVhdHVyZSB0aGF0IG5lZWRzIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgQWNjZXNzIFBvaW50LgorICoKICAqIC0gQ29tcHJlc3Npb246IGRhdGEgZnJhbWVzIGFyZSBjb21wcmVzc2VkIGluIHJlYWwgdGltZSB1c2luZyBhIExlbXBlbCBaaXYKICAqICAgICBhbGdvcml0aG0uIFRoaXMgaXMgZG9uZSB0cmFuc3BhcmVudGx5LiBPbmNlIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLAogICogICAgIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIHRha2VzIHBsYWNlIGluc2lkZSB0aGUgY2hpcHNldCwgd2l0aG91dAogICogICAgIHB1dHRpbmcgYWRkaXRpb25hbCBsb2FkIG9uIHRoZSBob3N0IENQVS4KICAqCisgKiBBcyB3aXRoIFhSIHdlIGFsc28gZG9uJ3QgcGxhbiB0byBzdXBwb3J0IFN1cGVyQUcgZmVhdHVyZXMgZm9yIG5vdy4gWW91IGNhbgorICogZ2V0IGEgbW9kZSBzaW1pbGFyIHRvIFRVUkJPIGJ5IHVzaW5nIDQwTUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1RVUkJPCTB4MDAwMDAwODAKIAorCisvKioKKyAqIGVudW0gYXRoNWtfZHJpdmVyX21vZGUgLSBQSFkgb3BlcmF0aW9uIG1vZGUKKyAqIEBBUjVLX01PREVfMTFBOiA4MDIuMTFhCisgKiBAQVI1S19NT0RFXzExQjogODAyLjExYgorICogQEFSNUtfTU9ERV8xMUc6IDgwMS4xMWcKKyAqIEBBUjVLX01PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBoZXJlLCB3ZSB1c2UgdGhlc2UgYXMKKyAqIGFycmF5IGluZGljZXMgYW5kIGl0IGFsc28gbWFwcyBFRVBST00gc3RydWN0dXJlcy4KKyAqLwogZW51bSBhdGg1a19kcml2ZXJfbW9kZSB7CiAJQVI1S19NT0RFXzExQQkJPQkwLAogCUFSNUtfTU9ERV8xMUIJCT0JMSwKQEAgLTQwOCwzMCArNDQ4LDY0IEBACiAJQVI1S19NT0RFX01BWAkJPQkzCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYW50X21vZGUgLSBBbnRlbm5hIG9wZXJhdGlvbiBtb2RlCisgKiBAQVI1S19BTlRNT0RFX0RFRkFVTFQ6IERlZmF1bHQgYW50ZW5uYSBzZXR1cAorICogQEFSNUtfQU5UTU9ERV9GSVhFRF9BOiBPbmx5IGFudGVubmEgQSBpcyBwcmVzZW50CisgKiBAQVI1S19BTlRNT0RFX0ZJWEVEX0I6IE9ubHkgYW50ZW5uYSBCIGlzIHByZXNlbnQKKyAqIEBBUjVLX0FOVE1PREVfU0lOR0xFX0FQOiBTVEEgbG9ja2VkIG9uIGEgc2luZ2xlIGFwCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9BUDogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEE6IFNUQSB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqIEBBUjVLX0FOVE1PREVfREVCVUc6IERlYnVnIG1vZGUgLUEgLT4gUngsIEItPiBUeC0KKyAqIEBBUjVLX0FOVE1PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBGb3IgbW9yZSBpbmZvcyBvbiBhbnRlbm5hIGNvbnRyb2wgY2hlY2sgb3V0IHBoeS5jCisgKi8KIGVudW0gYXRoNWtfYW50X21vZGUgewotCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwJLyogZGVmYXVsdCBhbnRlbm5hIHNldHVwICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0EJPSAxLAkvKiBvbmx5IGFudGVubmEgQSBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAkvKiBvbmx5IGFudGVubmEgQiBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX1NJTkdMRV9BUAk9IDMsCS8qIHN0YSBsb2NrZWQgb24gYSBzaW5nbGUgYXAgKi8KLQlBUjVLX0FOVE1PREVfU0VDVE9SX0FQCT0gNCwJLyogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEEJPSA1LAkvKiBTVEEgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX0RFQlVHCT0gNiwJLyogRGVidWcgbW9kZSAtQSAtPiBSeCwgQi0+IFR4LSAqLworCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwKKwlBUjVLX0FOVE1PREVfRklYRURfQQk9IDEsCisJQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAorCUFSNUtfQU5UTU9ERV9TSU5HTEVfQVAJPSAzLAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfQVAJPSA0LAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfU1RBCT0gNSwKKwlBUjVLX0FOVE1PREVfREVCVUcJPSA2LAogCUFSNUtfQU5UTU9ERV9NQVgsCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYndfbW9kZSAtIEJhbmR3aWR0aCBvcGVyYXRpb24gbW9kZQorICogQEFSNUtfQldNT0RFX0RFRkFVTFQ6IDIwTUh6LCBkZWZhdWx0IG9wZXJhdGlvbgorICogQEFSNUtfQldNT0RFXzVNSFo6IFF1YXJ0ZXIgcmF0ZQorICogQEFSNUtfQldNT0RFXzEwTUhaOiBIYWxmIHJhdGUKKyAqIEBBUjVLX0JXTU9ERV80ME1IWjogVHVyYm8KKyAqLwogZW51bSBhdGg1a19id19tb2RlIHsKLQlBUjVLX0JXTU9ERV9ERUZBVUxUCT0gMCwJLyogMjBNSHosIGRlZmF1bHQgb3BlcmF0aW9uICovCi0JQVI1S19CV01PREVfNU1IWgk9IDEsCS8qIFF1YXJ0ZXIgcmF0ZSAqLwotCUFSNUtfQldNT0RFXzEwTUhaCT0gMiwJLyogSGFsZiByYXRlICovCi0JQVI1S19CV01PREVfNDBNSFoJPSAzCS8qIFR1cmJvICovCisJQVI1S19CV01PREVfREVGQVVMVAk9IDAsCisJQVI1S19CV01PREVfNU1IWgk9IDEsCisJQVI1S19CV01PREVfMTBNSFoJPSAyLAorCUFSNUtfQldNT0RFXzQwTUhaCT0gMwogfTsKIAorCisKIC8qKioqKioqKioqKioqKioqXAogICBUWCBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBUWCBTdGF0dXMgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzIC0gVFggU3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0c19zZXFudW06IFNlcXVlbmNlIG51bWJlcgorICogQHRzX3RzdGFtcDogVGltZXN0YW1wCisgKiBAdHNfc3RhdHVzOiBTdGF0dXMgY29kZQorICogQHRzX2ZpbmFsX2lkeDogRmluYWwgdHJhbnNtaXNzaW9uIHNlcmllcyBpbmRleAorICogQHRzX2ZpbmFsX3JldHJ5OiBGaW5hbCByZXRyeSBjb3VudAorICogQHRzX3Jzc2k6IFJTU0kgZm9yIHJlY2VpdmVkIEFDSworICogQHRzX3Nob3J0cmV0cnk6IFNob3J0IHJldHJ5IGNvdW50CisgKiBAdHNfdmlydGNvbDogVmlydHVhbCBjb2xsaXNpb24gY291bnQKKyAqIEB0c19hbnRlbm5hOiBBbnRlbm5hIHVzZWQKKyAqCisgKiBUWCBzdGF0dXMgZGVzY3JpcHRvciBnZXRzIGZpbGxlZCBieSB0aGUgaHcKKyAqIG9uIGVhY2ggdHJhbnNtaXNzaW9uIGF0dGVtcHQuCiAgKi8KIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgewogCXUxNgl0c19zZXFudW07CkBAIC00NTQsNyArNTI4LDYgQEAKICAqIGVudW0gYXRoNWtfdHhfcXVldWUgLSBRdWV1ZSB0eXBlcyB1c2VkIHRvIGNsYXNzaWZ5IHR4IHF1ZXVlcy4KICAqIEBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOiBxIGlzIHVudXNlZCAtLSBzZWUgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfREFUQTogQSBub3JtYWwgZGF0YSBxdWV1ZQotICogQEFSNUtfVFhfUVVFVUVfWFJfREFUQTogQW4gWFItZGF0YSBxdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfQkVBQ09OOiBUaGUgYmVhY29uIHF1ZXVlCiAgKiBAQVI1S19UWF9RVUVVRV9DQUI6IFRoZSBhZnRlci1iZWFjb24gcXVldWUKICAqIEBBUjVLX1RYX1FVRVVFX1VBUFNEOiBVbnNjaGVkdWxlZCBBdXRvbWF0aWMgUG93ZXIgU2F2ZSBEZWxpdmVyeSBxdWV1ZQpAQCAtNDYyLDcgKzUzNSw2IEBACiBlbnVtIGF0aDVrX3R4X3F1ZXVlIHsKIAlBUjVLX1RYX1FVRVVFX0lOQUNUSVZFID0gMCwKIAlBUjVLX1RYX1FVRVVFX0RBVEEsCi0JQVI1S19UWF9RVUVVRV9YUl9EQVRBLAogCUFSNUtfVFhfUVVFVUVfQkVBQ09OLAogCUFSNUtfVFhfUVVFVUVfQ0FCLAogCUFSNUtfVFhfUVVFVUVfVUFQU0QsCkBAIC00NzEsMzYgKzU0Myw0NiBAQAogI2RlZmluZQlBUjVLX05VTV9UWF9RVUVVRVMJCTEwCiAjZGVmaW5lCUFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVQkyCiAKLS8qCi0gKiBRdWV1ZSBzeWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzLgorLyoqCisgKiBlbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgLSBRdWV1ZSBzdWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzCisgKiBAQVI1S19XTUVfQUNfQks6IEJhY2tncm91bmQgdHJhZmZpYworICogQEFSNUtfV01FX0FDX0JFOiBCZXN0LWVmZm9ydCAobm9ybWFsKSB0cmFmZmljCisgKiBAQVI1S19XTUVfQUNfVkk6IFZpZGVvIHRyYWZmaWMKKyAqIEBBUjVLX1dNRV9BQ19WTzogVm9pY2UgdHJhZmZpYworICoKICAqIFRoZXNlIGFyZSB0aGUgNCBBY2Nlc3MgQ2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluCiAgKiBXTUUgc3BlYy4gMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IGFuZCA0IGlzIHRoZQogICogaGlnaGVzdC4gTm9ybWFsIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbiBjbGFzc2lmaWVkCiAgKiBnb2VzIHRvIHRoZSBCZXN0IEVmZm9ydCBBQy4KICAqLwogZW51bSBhdGg1a190eF9xdWV1ZV9zdWJ0eXBlIHsKLQlBUjVLX1dNRV9BQ19CSyA9IDAsCS8qQmFja2dyb3VuZCB0cmFmZmljKi8KLQlBUjVLX1dNRV9BQ19CRSwJCS8qQmVzdC1lZmZvcnQgKG5vcm1hbCkgdHJhZmZpYyovCi0JQVI1S19XTUVfQUNfVkksCQkvKlZpZGVvIHRyYWZmaWMqLwotCUFSNUtfV01FX0FDX1ZPLAkJLypWb2ljZSB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19CSyA9IDAsCisJQVI1S19XTUVfQUNfQkUsCisJQVI1S19XTUVfQUNfVkksCisJQVI1S19XTUVfQUNfVk8sCiB9OwogCi0vKgotICogUXVldWUgSUQgbnVtYmVycyBhcyByZXR1cm5lZCBieSB0aGUgaHcgZnVuY3Rpb25zLCBlYWNoIG51bWJlcgotICogcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcwotICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLiBUaGVzZSBtYXRjaAotICogZDgwMjExIGRlZmluaXRpb25zIChuZXQ4MDIxMS9NYWRXaUZpIGRvbid0IHVzZSB0aGVtKS4KKy8qKgorICogZW51bSBhdGg1a190eF9xdWV1ZV9pZCAtIFF1ZXVlIElEIG51bWJlcnMgYXMgcmV0dXJuZWQgYnkgdGhlIGh3IGZ1bmN0aW9ucworICogQEFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfREFUQTogRGF0YSBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9CRUFDT046IEJlYWNvbiBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTjogRGF0YSBxdWV1ZSBtaW4gaW5kZXgKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUFYOiBEYXRhIHF1ZXVlIG1heCBpbmRleAorICogQEFSNUtfVFhfUVVFVUVfSURfQ0FCOiBDb250ZW50IGFmdGVyIGJlYWNvbiBxdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OOiBCZWFjb24gcXVldWUKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX1VBUFNEOiBVcmdlbnQgQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnksCisgKgorICogRWFjaCBudW1iZXIgcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcworICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLgogICovCiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkIHsKIAlBUjVLX1RYX1FVRVVFX0lEX05PUUNVX0RBVEEJPSAwLAogCUFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfQkVBQ09OCT0gMSwKLQlBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOCT0gMCwgLypJRUVFODAyMTFfVFhfUVVFVUVfREFUQTAqLwotCUFSNUtfVFhfUVVFVUVfSURfREFUQV9NQVgJPSAzLCAvKklFRUU4MDIxMV9UWF9RVUVVRV9EQVRBMyovCi0JQVI1S19UWF9RVUVVRV9JRF9EQVRBX1NWUAk9IDUsIC8qSUVFRTgwMjExX1RYX1FVRVVFX1NWUCAtIFNwZWN0cmFsaW5rIFZvaWNlIFByb3RvY29sKi8KLQlBUjVLX1RYX1FVRVVFX0lEX0NBQgkJPSA2LCAvKklFRUU4MDIxMV9UWF9RVUVVRV9BRlRFUl9CRUFDT04qLwotCUFSNUtfVFhfUVVFVUVfSURfQkVBQ09OCQk9IDcsIC8qSUVFRTgwMjExX1RYX1FVRVVFX0JFQUNPTiovCi0JQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA4LAotCUFSNUtfVFhfUVVFVUVfSURfWFJfREFUQQk9IDksCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTgk9IDAsCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWAk9IDMsCisJQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA3LAorCUFSNUtfVFhfUVVFVUVfSURfQ0FCCQk9IDgsCisJQVI1S19UWF9RVUVVRV9JRF9CRUFDT04JCT0gOSwKIH07CiAKIC8qCkBAIC01MjEsNDYgKzYwMyw3MCBAQAogI2RlZmluZSBBUjVLX1RYUV9GTEFHX1BPU1RfRlJfQktPRkZfRElTCQkweDEwMDAJLyogRGlzYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCiAjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfQ09NUFJFU1NJT05fRU5BQkxFCTB4MjAwMAkvKiBFbmFibGUgaHcgY29tcHJlc3Npb24gLW5vdCBpbXBsZW1lbnRlZC0qLwogCi0vKgotICogRGF0YSB0cmFuc21pdCBxdWV1ZSBzdGF0ZS4gIE9uZSBvZiB0aGVzZSBleGlzdHMgZm9yIGVhY2gKLSAqIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlLiAgUGFja2V0cyBzZW50IHRvIHVzIGZyb20gYWJvdmUKLSAqIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuICBOb3QgYWxsCi0gKiBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQgb2YgaGFyZHdhcmUgdHJhbnNtaXQgcXVldWVzLgotICogRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5IHNjX2FjMnEgd2lsbCBtYXAgbXVsdGlwbGUKLSAqIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzICh0eXBpY2FsbHkgYWxsIHRvIG9uZQotICogaGFyZHdhcmUgcXVldWUpLgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhxIC0gVHJhbnNtaXQgcXVldWUgc3RhdGUKKyAqIEBxbnVtOiBIYXJkd2FyZSBxIG51bWJlcgorICogQGxpbms6IExpbmsgcHRyIGluIGxhc3QgVFggZGVzYworICogQHE6IFRyYW5zbWl0IHF1ZXVlICgmc3RydWN0IGxpc3RfaGVhZCkKKyAqIEBsb2NrOiBMb2NrIG9uIHEgYW5kIGxpbmsKKyAqIEBzZXR1cDogSXMgdGhlIHF1ZXVlIGNvbmZpZ3VyZWQKKyAqIEB0eHFfbGVuOk51bWJlciBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9tYXg6IE1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9wb2xsX21hcms6IFVzZWQgdG8gY2hlY2sgaWYgcXVldWUgZ290IHN0dWNrCisgKiBAdHhxX3N0dWNrOiBRdWV1ZSBzdHVjayBjb3VudGVyCisgKgorICogT25lIG9mIHRoZXNlIGV4aXN0cyBmb3IgZWFjaCBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZS4KKyAqIFBhY2tldHMgc2VudCB0byB1cyBmcm9tIGFib3ZlIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQKKyAqIG9uIHRoZWlyIHByaW9yaXR5LiAgTm90IGFsbCBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQKKyAqIG9mIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlcy4gRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5CisgKiBzY19hYzJxIHdpbGwgbWFwIG11bHRpcGxlIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzCisgKiAodHlwaWNhbGx5IGFsbCB0byBvbmUgaGFyZHdhcmUgcXVldWUpLgogICovCiBzdHJ1Y3QgYXRoNWtfdHhxIHsKLQl1bnNpZ25lZCBpbnQJCXFudW07CS8qIGhhcmR3YXJlIHEgbnVtYmVyICovCi0JdTMyCQkJKmxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgVFggZGVzYyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcTsJLyogdHJhbnNtaXQgcXVldWUgKi8KLQlzcGlubG9ja190CQlsb2NrOwkvKiBsb2NrIG9uIHEgYW5kIGxpbmsgKi8KKwl1bnNpZ25lZCBpbnQJCXFudW07CisJdTMyCQkJKmxpbms7CisJc3RydWN0IGxpc3RfaGVhZAlxOworCXNwaW5sb2NrX3QJCWxvY2s7CiAJYm9vbAkJCXNldHVwOwotCWludAkJCXR4cV9sZW47IC8qIG51bWJlciBvZiBxdWV1ZWQgYnVmZmVycyAqLwotCWludAkJCXR4cV9tYXg7IC8qIG1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycyAqLworCWludAkJCXR4cV9sZW47CisJaW50CQkJdHhxX21heDsKIAlib29sCQkJdHhxX3BvbGxfbWFyazsKLQl1bnNpZ25lZCBpbnQJCXR4cV9zdHVjazsJLyogaW5mb3JtYXRpb25hbCBjb3VudGVyICovCisJdW5zaWduZWQgaW50CQl0eHFfc3R1Y2s7CiB9OwogCi0vKgotICogQSBzdHJ1Y3QgdG8gaG9sZCB0eCBxdWV1ZSdzIHBhcmFtZXRlcnMKKy8qKgorICogc3RydWN0IGF0aDVrX3R4cV9pbmZvIC0gQSBzdHJ1Y3QgdG8gaG9sZCBUWCBxdWV1ZSdzIHBhcmFtZXRlcnMKKyAqIEB0cWlfdHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWUKKyAqIEB0cWlfc3VidHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfc3VidHlwZQorICogQHRxaV9mbGFnczogVFggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkKKyAqIEB0cWlfYWlmczogQXJiaXRyYXRlZCBJbnRlci1mcmFtZSBTcGFjZQorICogQHRxaV9jd19taW46IE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cKKyAqIEB0cWlfY3dfbWF4OiBNYXhpbXVtIENvbnRlbnRpb24gV2luZG93CisgKiBAdHFpX2Nicl9wZXJpb2Q6IENvbnN0YW50IGJpdCByYXRlIHBlcmlvZAorICogQHRxaV9yZWFkeV90aW1lOiBUaW1lIHF1ZXVlIHdhaXRzIGFmdGVyIGFuIGV2ZW50IHdoZW4gUkRZVElNRSBpcyBlbmFibGVkCiAgKi8KIHN0cnVjdCBhdGg1a190eHFfaW5mbyB7CiAJZW51bSBhdGg1a190eF9xdWV1ZSB0cWlfdHlwZTsKIAllbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgdHFpX3N1YnR5cGU7Ci0JdTE2CXRxaV9mbGFnczsJLyogVHggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkgKi8KLQl1OAl0cWlfYWlmczsJLyogQXJiaXRyYXRlZCBJbnRlcmZyYW1lIFNwYWNlICovCi0JdTE2CXRxaV9jd19taW47CS8qIE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cgKi8KLQl1MTYJdHFpX2N3X21heDsJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLwotCXUzMgl0cWlfY2JyX3BlcmlvZDsgLyogQ29uc3RhbnQgYml0IHJhdGUgcGVyaW9kICovCisJdTE2CXRxaV9mbGFnczsKKwl1OAl0cWlfYWlmczsKKwl1MTYJdHFpX2N3X21pbjsKKwl1MTYJdHFpX2N3X21heDsKKwl1MzIJdHFpX2Nicl9wZXJpb2Q7CiAJdTMyCXRxaV9jYnJfb3ZlcmZsb3dfbGltaXQ7CiAJdTMyCXRxaV9idXJzdF90aW1lOwotCXUzMgl0cWlfcmVhZHlfdGltZTsgLyogVGltZSBxdWV1ZSB3YWl0cyBhZnRlciBhbiBldmVudCAqLworCXUzMgl0cWlfcmVhZHlfdGltZTsKIH07CiAKLS8qCi0gKiBUcmFuc21pdCBwYWNrZXQgdHlwZXMuCi0gKiB1c2VkIG9uIHR4IGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBlbnVtIGF0aDVrX3BrdF90eXBlIC0gVHJhbnNtaXQgcGFja2V0IHR5cGVzCisgKiBAQVI1S19QS1RfVFlQRV9OT1JNQUw6IE5vcm1hbCBkYXRhCisgKiBAQVI1S19QS1RfVFlQRV9BVElNOiBBVElNCisgKiBAQVI1S19QS1RfVFlQRV9QU1BPTEw6IFBTLVBvbGwKKyAqIEBBUjVLX1BLVF9UWVBFX0JFQUNPTjogQmVhY29uCisgKiBAQVI1S19QS1RfVFlQRV9QUk9CRV9SRVNQOiBQcm9iZSByZXNwb25zZQorICogQEFSNUtfUEtUX1RZUEVfUElGUzogUElGUworICogVXNlZCBvbiB0eCBjb250cm9sIGRlc2NyaXB0b3IKICAqLwogZW51bSBhdGg1a19wa3RfdHlwZSB7CiAJQVI1S19QS1RfVFlQRV9OT1JNQUwJCT0gMCwKQEAgLTU4MywyNyArNjg5LDIzIEBACiAJKGFoLT5haF90eHBvd2VyLnR4cF9yYXRlc19wb3dlcl90YWJsZVsoX3IpXSAmIDB4M2YpIDw8IChfdikJXAogKQogCi0vKgotICogRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCi0gKi8KLWVudW0gYXRoNWtfZG1hc2l6ZSB7Ci0JQVI1S19ETUFTSVpFXzRCCT0gMCwKLQlBUjVLX0RNQVNJWkVfOEIsCi0JQVI1S19ETUFTSVpFXzE2QiwKLQlBUjVLX0RNQVNJWkVfMzJCLAotCUFSNUtfRE1BU0laRV82NEIsCi0JQVI1S19ETUFTSVpFXzEyOEIsCi0JQVI1S19ETUFTSVpFXzI1NkIsCi0JQVI1S19ETUFTSVpFXzUxMkIKLX07CiAKIAogLyoqKioqKioqKioqKioqKipcCiAgIFJYIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFJYIFN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgLSBSWCBTdGF0dXMgZGVzY3JpcHRvcgorICogQHJzX2RhdGFsZW46IERhdGEgbGVuZ3RoCisgKiBAcnNfdHN0YW1wOiBUaW1lc3RhbXAKKyAqIEByc19zdGF0dXM6IFN0YXR1cyBjb2RlCisgKiBAcnNfcGh5ZXJyOiBQSFkgZXJyb3IgbWFzaworICogQHJzX3Jzc2k6IFJTU0kgaW4gMC41ZGJtIHVuaXRzCisgKiBAcnNfa2V5aXg6IEluZGV4IHRvIHRoZSBrZXkgdXNlZCBmb3IgZGVjcnlwdGluZworICogQHJzX3JhdGU6IFJhdGUgdXNlZCB0byBkZWNvZGUgdGhlIGZyYW1lCisgKiBAcnNfYW50ZW5uYTogQW50ZW5uYSB1c2VkIHRvIHJlY2VpdmUgdGhlIGZyYW1lCisgKiBAcnNfbW9yZTogSW5kaWNhdGVzIHRoaXMgaXMgYSBmcmFtZSBmcmFnbWVudCAoRmFzdCBmcmFtZXMpCiAgKi8KIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgewogCXUxNglyc19kYXRhbGVuOwpAQCAtNjQ1LDEwICs3NDcsMTggQEAKICNkZWZpbmUgVFNGX1RPX1RVKF90c2YpICh1MzIpKChfdHNmKSA+PiAxMCkKIAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogICBHQUlOIE9QVElNSVpBVElPTiBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogZW51bSBhdGg1a19yZmdhaW4gLSBSRiBHYWluIG9wdGltaXphdGlvbiBlbmdpbmUgc3RhdGUKKyAqIEBBUjVLX1JGR0FJTl9JTkFDVElWRTogRW5naW5lIGRpc2FibGVkCisgKiBAQVI1S19SRkdBSU5fQUNUSVZFOiBQcm9iZSBhY3RpdmUKKyAqIEBBUjVLX1JGR0FJTl9SRUFEX1JFUVVFU1RFRDogUHJvYmUgcmVxdWVzdGVkCisgKiBAQVI1S19SRkdBSU5fTkVFRF9DSEFOR0U6IEdhaW5fRiBuZWVkcyBjaGFuZ2UKKyAqLwogZW51bSBhdGg1a19yZmdhaW4gewogCUFSNUtfUkZHQUlOX0lOQUNUSVZFID0gMCwKIAlBUjVLX1JGR0FJTl9BQ1RJVkUsCkBAIC02NTYsNiArNzY2LDE2IEBACiAJQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UsCiB9OwogCisvKioKKyAqIHN0cnVjdCBhdGg1a19nYWluIC0gUkYgR2FpbiBvcHRpbWl6YXRpb24gZW5naW5lIHN0YXRlIGRhdGEKKyAqIEBnX3N0ZXBfaWR4OiBDdXJyZW50IHN0ZXAgaW5kZXgKKyAqIEBnX2N1cnJlbnQ6IEN1cnJlbnQgZ2FpbgorICogQGdfdGFyZ2V0OiBUYXJnZXQgZ2FpbgorICogQGdfbG93OiBMb3cgZ2FpbiBib3VuZGFyeQorICogQGdfaGlnaDogSGlnaCBnYWluIGJvdW5kYXJ5CisgKiBAZ19mX2NvcnI6IEdhaW5fRiBjb3JyZWN0aW9uCisgKiBAZ19zdGF0ZTogT25lIG9mIGVudW0gYXRoNWtfcmZnYWluCisgKi8KIHN0cnVjdCBhdGg1a19nYWluIHsKIAl1OAkJCWdfc3RlcF9pZHg7CiAJdTgJCQlnX2N1cnJlbnQ7CkBAIC02NjYsNiArNzg2LDggQEAKIAl1OAkJCWdfc3RhdGU7CiB9OwogCisKKwogLyoqKioqKioqKioqKioqKioqKioqXAogICBDT01NT04gREVGSU5JVElPTlMKIFwqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY3NCw5ICs3OTYsMTQgQEAKICNkZWZpbmUgQVI1S19TTE9UX1RJTUVfMjAJODgwCiAjZGVmaW5lIEFSNUtfU0xPVF9USU1FX01BWAkweGZmZmYKIAotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIDJHSHogY2hhbm5lbHMgdG8KLSAqIDVHSHogQXRoZXJvcyBjaGFubmVscy4KKy8qKgorICogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiAtIDJHSHogdG8gNUdIWiBtYXAgZm9yIFJGNTExMQorICogQGEyX2ZsYWdzOiBDaGFubmVsIGZsYWdzIChpbnRlcm5hbCkKKyAqIEBhMl9hdGhjaGFuOiBIVyBjaGFubmVsIG51bWJlciAoaW50ZXJuYWwpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgMkdIeiBjaGFubmVscyB0bworICogNUdIeiBBdGhlcm9zIGNoYW5uZWxzIG9uIDIxMTEgZnJlcXVlbmN5IGNvbnZlcnRlcgorICogdGhhdCBjb21lcyB0b2dldGhlciB3aXRoIFJGNTExMQogICogVE9ETzogQ2xlYW4gdXAKICAqLwogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiB7CkBAIC02ODQsMzYgKzgxMSw4MCBAQAogCXUxNglhMl9hdGhjaGFuOwogfTsKIAorLyoqCisgKiBlbnVtIGF0aDVrX2RtYXNpemUgLSAgRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCisgKiBAQVI1S19ETUFTSVpFXzRCOiA0Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfOEI6IDhCeXRlcworICogQEFSNUtfRE1BU0laRV8xNkI6IDE2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMzJCOiAzMkJ5dGVzCisgKiBAQVI1S19ETUFTSVpFXzY0QjogNjRCeXRlcyAoRGVmYXVsdCkKKyAqIEBBUjVLX0RNQVNJWkVfMTI4QjogMTI4Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMjU2QjogMjU2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfNTEyQjogNTEyQnl0ZXMKKyAqCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgRE1BIGJ1cnN0IHNpemUgb24gaHcKKyAqCisgKiBOb3RlOiBTb21lIHBsYXRmb3JtcyBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIDRCeXRlcworICogYmUgY2FyZWZ1bCBvbiBlbWJlZGRlZCBib2FyZHMuCisgKi8KK2VudW0gYXRoNWtfZG1hc2l6ZSB7CisJQVI1S19ETUFTSVpFXzRCCT0gMCwKKwlBUjVLX0RNQVNJWkVfOEIsCisJQVI1S19ETUFTSVpFXzE2QiwKKwlBUjVLX0RNQVNJWkVfMzJCLAorCUFSNUtfRE1BU0laRV82NEIsCisJQVI1S19ETUFTSVpFXzEyOEIsCisJQVI1S19ETUFTSVpFXzI1NkIsCisJQVI1S19ETUFTSVpFXzUxMkIKK307CisKKwogCiAvKioqKioqKioqKioqKioqKioqXAogICBSQVRFIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKioqLwogCiAvKioKKyAqIERPQzogUmF0ZSBjb2RlcworICoKICAqIFNlZW1zIHRoZSBhcjV4eHggaGFyZHdhcmUgc3VwcG9ydHMgdXAgdG8gMzIgcmF0ZXMsIGluZGV4ZWQgYnkgMS0zMi4KICAqCiAgKiBUaGUgcmF0ZSBjb2RlIGlzIHVzZWQgdG8gZ2V0IHRoZSBSWCByYXRlIG9yIHNldCB0aGUgVFggcmF0ZSBvbiB0aGUKICAqIGhhcmR3YXJlIGRlc2NyaXB0b3JzLiBJdCBpcyBhbHNvIHVzZWQgZm9yIGludGVybmFsIG1vZHVsYXRpb24gY29udHJvbAogICogYW5kIHNldHRpbmdzLgogICoKLSAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZjoKKyAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZiAoaHRtbCB1bmZyaWVuZGx5KToKICAqCi0gKiByYXRlX2NvZGUgICAweDAxICAgIDB4MDIgICAgMHgwMyAgICAweDA0ICAgIDB4MDUgICAgMHgwNiAgICAweDA3ICAgIDB4MDgKLSAqIHJhdGVfa2JwcyAgIDMwMDAgICAgMTAwMCAgICA/ICAgICAgID8gICAgICAgPyAgICAgICAyMDAwICAgIDUwMCAgICAgNDgwMDAKKyAqIFJhdGUgY29kZQlSYXRlIChLYnBzKQorICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tCisgKiAweDAxCQkgMzAwMCAoWFIpCisgKiAweDAyCQkgMTAwMCAoWFIpCisgKiAweDAzCQkgIDI1MCAoWFIpCisgKiAweDA0IC0gMDUJLVJlc2VydmVkLQorICogMHgwNgkJIDIwMDAgKFhSKQorICogMHgwNwkJICA1MDAgKFhSKQorICogMHgwOAkJNDgwMDAgKE9GRE0pCisgKiAweDA5CQkyNDAwMCAoT0ZETSkKKyAqIDB4MEEJCTEyMDAwIChPRkRNKQorICogMHgwQgkJIDYwMDAgKE9GRE0pCisgKiAweDBDCQk1NDAwMCAoT0ZETSkKKyAqIDB4MEQJCTM2MDAwIChPRkRNKQorICogMHgwRQkJMTgwMDAgKE9GRE0pCisgKiAweDBGCQkgOTAwMCAoT0ZETSkKKyAqIDB4MTAgLSAxNwktUmVzZXJ2ZWQtCisgKiAweDE4CQkxMTAwMEwgKENDSykKKyAqIDB4MTkJCSA1NTAwTCAoQ0NLKQorICogMHgxQQkJIDIwMDBMIChDQ0spCisgKiAweDFCCQkgMTAwMEwgKENDSykKKyAqIDB4MUMJCTExMDAwUyAoQ0NLKQorICogMHgxRAkJIDU1MDBTIChDQ0spCisgKiAweDFFCQkgMjAwMFMgKENDSykKKyAqIDB4MUYJCS1SZXNlcnZlZC0KICAqCi0gKiByYXRlX2NvZGUgICAweDA5ICAgIDB4MEEgICAgMHgwQiAgICAweDBDICAgIDB4MEQgICAgMHgwRSAgICAweDBGICAgIDB4MTAKLSAqIHJhdGVfa2JwcyAgIDI0MDAwICAgMTIwMDAgICA2MDAwICAgIDU0MDAwICAgMzYwMDAgICAxODAwMCAgIDkwMDAgICAgPwotICoKLSAqIHJhdGVfY29kZSAgIDE3ICAgICAgMTggICAgICAxOSAgICAgIDIwICAgICAgMjEgICAgICAyMiAgICAgIDIzICAgICAgMjQKLSAqIHJhdGVfa2JwcyAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgMTEwMDAKLSAqCi0gKiByYXRlX2NvZGUgICAyNSAgICAgIDI2ICAgICAgMjcgICAgICAyOCAgICAgIDI5ICAgICAgMzAgICAgICAzMSAgICAgIDMyCi0gKiByYXRlX2ticHMgICA1NTAwICAgIDIwMDAgICAgMTAwMCAgICAxMTAwMFMgIDU1MDBTICAgMjAwMFMgICA/ICAgICAgID8KLSAqCi0gKiAiUyIgaW5kaWNhdGVzIENDSyByYXRlcyB3aXRoIHNob3J0IHByZWFtYmxlLgorICogIlMiIGluZGljYXRlcyBDQ0sgcmF0ZXMgd2l0aCBzaG9ydCBwcmVhbWJsZSBhbmQgIkwiIHdpdGggbG9uZyBwcmVhbWJsZS4KICAqCiAgKiBBUjUyMTEgaGFzIGRpZmZlcmVudCByYXRlIGNvZGVzIGZvciBDQ0sgKDgwMi4xMUIpIHJhdGVzLiBJdCBvbmx5IHVzZXMgdGhlCi0gKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBiZWxvdyB3aXRoIGEgMHhGIG1hc2suCisgKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBhYm92ZSB3aXRoIGEgMHhGIG1hc2suCiAgKiAoMHhCLCAweEEsIDB4OSBhbmQgMHg4IGZvciAxTSwgMk0sIDUuNU0gYW5kIDExTSkuCiAgKiBXZSBoYW5kbGUgdGhpcyBpbiBhdGg1a19zZXR1cF9iYW5kcygpLgogICovCkBAIC03MzMsMTMgKzkwNCw5IEBACiAjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8zNk0JMHgwRAogI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNDhNCTB4MDgKICNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzU0TQkweDBDCi0vKiBYUiAqLwotI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfNTAwSwkweDA3Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8xTQkweDAyCi0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8yTQkweDA2Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8zTQkweDAxCiAKLS8qIGFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KKy8qIEFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIG9uIEIgcmF0ZXMKKyAqIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KICNkZWZpbmUgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgMHgwNAogCiAvKgpAQCAtNzY5LDQ5ICs5MzYsNjUgQEAKIAogLyoqCiAgKiBlbnVtIGF0aDVrX2ludCAtIEhhcmR3YXJlIGludGVycnVwdCBtYXNrcyBoZWxwZXJzCisgKiBAQVI1S19JTlRfUlhPSzogRnJhbWUgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkCisgKiBAQVI1S19JTlRfUlhERVNDOiBSZXF1ZXN0IFJYIGRlc2NyaXB0b3IvUmVhZCBSWCBkZXNjcmlwdG9yCisgKiBAQVI1S19JTlRfUlhFUlI6IEZyYW1lIHJlY2VwdGlvbiBmYWlsZWQKKyAqIEBBUjVLX0lOVF9SWE5PRlJNOiBObyBmcmFtZSByZWNlaXZlZCB3aXRoaW4gYSBzcGVjaWZpZWQgdGltZSBwZXJpb2QKKyAqIEBBUjVLX0lOVF9SWEVPTDogUmVhY2hlZCAiRW5kIE9mIExpc3QiLCBtZWFucyB3ZSBuZWVkIG1vcmUgUlggZGVzY3JpcHRvcnMKKyAqIEBBUjVLX0lOVF9SWE9STjogSW5kaWNhdGVzIHdlIGdvdCBSWCBGSUZPIG92ZXJydW4uIE5vdGUgdGhhdCBSeCBvdmVycnVuIGlzCisgKgkJbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUgb3BlcmF0aW9uCisgKgkJd2l0aG91dCByZXNldHRpbmcgdGhlIGNhcmQsIHRoYXQncyB3aHkgJUFSNUtfSU5UX0ZBVEFMIGlzIG5vdAorICoJCWNvbW1vbiBmb3IgYWxsIGNoaXBzLgorICogQEFSNUtfSU5UX1JYX0FMTDogTWFzayB0byBpZGVudGlmeSBhbGwgUlggcmVsYXRlZCBpbnRlcnJ1cHRzCiAgKgotICogQEFSNUtfSU5UX1JYOiBtYXNrIHRvIGlkZW50aWZ5IHJlY2VpdmVkIGZyYW1lIGludGVycnVwdHMsIG9mIHR5cGUKLSAqCUFSNUtfSVNSX1JYT0sgb3IgQVI1S19JU1JfUlhFUlIKLSAqIEBBUjVLX0lOVF9SWERFU0M6IFJlcXVlc3QgUlggZGVzY3JpcHRvci9SZWFkIFJYIGRlc2NyaXB0b3IgKD8pCi0gKiBAQVI1S19JTlRfUlhOT0ZSTTogTm8gZnJhbWUgcmVjZWl2ZWQgKD8pCi0gKiBAQVI1S19JTlRfUlhFT0w6IHJlY2VpdmVkIEVuZCBPZiBMaXN0IGZvciBWRU9MIChWaXJ0dWFsIEVuZCBPZiBMaXN0KS4gVGhlCi0gKglRdWV1ZSBDb250cm9sIFVuaXQgKFFDVSkgc2lnbmFscyBhbiBFT0wgaW50ZXJydXB0IG9ubHkgaWYgYSBkZXNjcmlwdG9yJ3MKLSAqCUxpbmtQdHIgaXMgTlVMTC4gRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG86Ci0gKglodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS8yMDAzMDIyNTczOS5odG1sCi0gKiBAQVI1S19JTlRfUlhPUk46IEluZGljYXRlcyB3ZSBnb3QgUlggb3ZlcnJ1biAoZWcuIG5vIG1vcmUgZGVzY3JpcHRvcnMpLgotICoJTm90ZSB0aGF0IFJ4IG92ZXJydW4gaXMgbm90IGFsd2F5cyBmYXRhbCwgb24gc29tZSBjaGlwcyB3ZSBjYW4gY29udGludWUKLSAqCW9wZXJhdGlvbiB3aXRob3V0IHJlc2V0dGluZyB0aGUgY2FyZCwgdGhhdCdzIHdoeSBpbnRfZmF0YWwgaXMgbm90Ci0gKgljb21tb24gZm9yIGFsbCBjaGlwcy4KLSAqIEBBUjVLX0lOVF9UWDogbWFzayB0byBpZGVudGlmeSByZWNlaXZlZCBmcmFtZSBpbnRlcnJ1cHRzLCBvZiB0eXBlCi0gKglBUjVLX0lTUl9UWE9LIG9yIEFSNUtfSVNSX1RYRVJSCi0gKiBAQVI1S19JTlRfVFhERVNDOiBSZXF1ZXN0IFRYIGRlc2NyaXB0b3IvUmVhZCBUWCBzdGF0dXMgZGVzY3JpcHRvciAoPykKLSAqIEBBUjVLX0lOVF9UWFVSTjogcmVjZWl2ZWQgd2hlbiB3ZSBzaG91bGQgaW5jcmVhc2UgdGhlIFRYIHRyaWdnZXIgdGhyZXNob2xkCi0gKglXZSBjdXJyZW50bHkgZG8gaW5jcmVtZW50cyBvbiBpbnRlcnJ1cHQgYnkKLSAqCShBUjVLX1RVTkVfTUFYX1RYX0ZJRk9fVEhSRVMgLSBjdXJyZW50X3RyaWdnZXJfbGV2ZWwpIC8gMgorICogQEFSNUtfSU5UX1RYT0s6IEZyYW1lIHRyYW5zbWlzc2lvbiBzdWNjZXNzCisgKiBAQVI1S19JTlRfVFhERVNDOiBSZXF1ZXN0IFRYIGRlc2NyaXB0b3IvUmVhZCBUWCBzdGF0dXMgZGVzY3JpcHRvcgorICogQEFSNUtfSU5UX1RYRVJSOiBGcmFtZSB0cmFuc21pc3Npb24gZmFpbHVyZQorICogQEFSNUtfSU5UX1RYRU9MOiBSZWNlaXZlZCBFbmQgT2YgTGlzdCBmb3IgVkVPTCAoVmlydHVhbCBFbmQgT2YgTGlzdCkuIFRoZQorICoJCVF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKSBzaWduYWxzIGFuIEVPTCBpbnRlcnJ1cHQgb25seSBpZiBhCisgKgkJZGVzY3JpcHRvcidzIExpbmtQdHIgaXMgTlVMTC4gRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG86CisgKgkJImh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwiCisgKiBAQVI1S19JTlRfVFhOT0ZSTTogTm8gZnJhbWUgd2FzIHRyYW5zbWl0dGVkIHdpdGhpbiBhIHNwZWNpZmllZCB0aW1lIHBlcmlvZAorICogQEFSNUtfSU5UX1RYVVJOOiBJbmRpY2F0ZXMgd2UgZ290IFRYIEZJRk8gdW5kZXJydW4uIEluIHN1Y2ggY2FzZSB3ZSBzaG91bGQKKyAqCQlpbmNyZWFzZSB0aGUgVFggdHJpZ2dlciB0aHJlc2hvbGQuCisgKiBAQVI1S19JTlRfVFhfQUxMOiBNYXNrIHRvIGlkZW50aWZ5IGFsbCBUWCByZWxhdGVkIGludGVycnVwdHMKKyAqCiAgKiBAQVI1S19JTlRfTUlCOiBJbmRpY2F0ZXMgdGhlIGVpdGhlciBNYW5hZ2VtZW50IEluZm9ybWF0aW9uIEJhc2UgY291bnRlcnMgb3IKLSAqCW9uZSBvZiB0aGUgUEhZIGVycm9yIGNvdW50ZXJzIHJlYWNoZWQgdGhlIG1heGltdW0gdmFsdWUgYW5kIHNob3VsZCBiZQotICoJcmVhZCBhbmQgY2xlYXJlZC4KKyAqCQlvbmUgb2YgdGhlIFBIWSBlcnJvciBjb3VudGVycyByZWFjaGVkIHRoZSBtYXhpbXVtIHZhbHVlIGFuZAorICoJCXNob3VsZCBiZSByZWFkIGFuZCBjbGVhcmVkLgorICogQEFSNUtfSU5UX1NXSTogU29mdHdhcmUgdHJpZ2dlcmVkIGludGVycnVwdC4KICAqIEBBUjVLX0lOVF9SWFBIWTogUlggUEhZIEVycm9yCiAgKiBAQVI1S19JTlRfUlhLQ006IFJYIEtleSBjYWNoZSBtaXNzCiAgKiBAQVI1S19JTlRfU1dCQTogU29mdFdhcmUgQmVhY29uIEFsZXJ0IC0gaW5kaWNhdGVzIGl0cyB0aW1lIHRvIHNlbmQgYQotICoJYmVhY29uIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiBUaGUgYWx0ZXJuYXRpdmUgaXMgaWYgeW91Ci0gKgloYXZlIFZFT0wgc3VwcG9ydCwgaW4gdGhhdCBjYXNlIHlvdSBsZXQgdGhlIGhhcmR3YXJlIGRlYWwgd2l0aCB0aGluZ3MuCisgKgkJYmVhY29uIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiBUaGUgYWx0ZXJuYXRpdmUgaXMgaWYKKyAqCQl5b3UgaGF2ZSBWRU9MIHN1cHBvcnQsIGluIHRoYXQgY2FzZSB5b3UgbGV0IHRoZSBoYXJkd2FyZSBkZWFsCisgKgkJd2l0aCB0aGluZ3MuCisgKiBAQVI1S19JTlRfQlJTU0k6IEJlYWNvbiByZWNlaXZlZCB3aXRoIGFuIFJTU0kgdmFsdWUgYmVsb3cgb3VyIHRocmVzaG9sZAogICogQEFSNUtfSU5UX0JNSVNTOiBJZiBpbiBTVEEgbW9kZSB0aGlzIGluZGljYXRlcyB3ZSBoYXZlIHN0b3BwZWQgc2VlaW5nCi0gKgliZWFjb25zIGZyb20gdGhlIEFQIGhhdmUgYXNzb2NpYXRlZCB3aXRoLCB3ZSBzaG91bGQgcHJvYmFibHkgdHJ5IHRvCi0gKglyZWFzc29jaWF0ZS4gV2hlbiBpbiBJQlNTIG1vZGUgdGhpcyBtaWdodCBtZWFuIHdlIGhhdmUgbm90IHJlY2VpdmVkCi0gKglhbnkgYmVhY29ucyBmcm9tIGFueSBsb2NhbCBzdGF0aW9ucy4gTm90ZSB0aGF0IGV2ZXJ5IHN0YXRpb24gaW4gYW4KLSAqCUlCU1Mgc2NoZWR1bGVzIHRvIHNlbmQgYmVhY29ucyBhdCB0aGUgVGFyZ2V0IEJlYWNvbiBUcmFuc21pc3Npb24gVGltZQotICoJKFRCVFQpIHdpdGggYSByYW5kb20gYmFja29mZi4KLSAqIEBBUjVLX0lOVF9CTlI6IEJlYWNvbiBOb3QgUmVhZHkgaW50ZXJydXB0IC0gPz8KLSAqIEBBUjVLX0lOVF9HUElPOiBHUElPIGludGVycnVwdCBpcyB1c2VkIGZvciBSRiBLaWxsLCBkaXNhYmxlZCBmb3Igbm93Ci0gKgl1bnRpbCBwcm9wZXJseSBoYW5kbGVkCi0gKiBAQVI1S19JTlRfRkFUQUw6IEZhdGFsIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLCB0eXBpY2FsbHkgY2F1c2VkIGJ5IERNQQotICoJZXJyb3JzLiBUaGVzZSB0eXBlcyBvZiBlcnJvcnMgd2UgY2FuIGVuYWJsZSBzZWVtIHRvIGJlIG9mIHR5cGUKLSAqCUFSNUtfU0lNUjJfTUNBQlQsIEFSNUtfU0lNUjJfU1NFUlIgYW5kIEFSNUtfU0lNUjJfRFBFUlIuCisgKgkJYmVhY29ucyBmcm9tIHRoZSBBUCBoYXZlIGFzc29jaWF0ZWQgd2l0aCwgd2Ugc2hvdWxkIHByb2JhYmx5CisgKgkJdHJ5IHRvIHJlYXNzb2NpYXRlLiBXaGVuIGluIElCU1MgbW9kZSB0aGlzIG1pZ2h0IG1lYW4gd2UgaGF2ZQorICoJCW5vdCByZWNlaXZlZCBhbnkgYmVhY29ucyBmcm9tIGFueSBsb2NhbCBzdGF0aW9ucy4gTm90ZSB0aGF0CisgKgkJZXZlcnkgc3RhdGlvbiBpbiBhbiBJQlNTIHNjaGVkdWxlcyB0byBzZW5kIGJlYWNvbnMgYXQgdGhlCisgKgkJVGFyZ2V0IEJlYWNvbiBUcmFuc21pc3Npb24gVGltZSAoVEJUVCkgd2l0aCBhIHJhbmRvbSBiYWNrb2ZmLgorICogQEFSNUtfSU5UX0JOUjogQmVhY29uIHF1ZXVlIGdvdCB0cmlnZ2VyZWQgKERNQSBiZWFjb24gYWxlcnQpIHdoaWxlIGVtcHR5LgorICogQEFSNUtfSU5UX1RJTTogQmVhY29uIHdpdGggbG9jYWwgc3RhdGlvbidzIFRJTSBiaXQgc2V0CisgKiBAQVI1S19JTlRfRFRJTTogQmVhY29uIHdpdGggRFRJTSBiaXQgYW5kIHplcm8gRFRJTSBjb3VudCByZWNlaXZlZAorICogQEFSNUtfSU5UX0RUSU1fU1lOQzogRFRJTSBzeW5jIGxvc3QKKyAqIEBBUjVLX0lOVF9HUElPOiBHUElPIGludGVycnVwdCBpcyB1c2VkIGZvciBSRiBLaWxsIHN3aXRjaGVzIGNvbm5lY3RlZCB0bworICoJCW91ciBHUElPIHBpbnMuCisgKiBAQVI1S19JTlRfQkNOX1RJTUVPVVQ6IEJlYWNvbiB0aW1lb3V0LCB3ZSB3YWl0ZWQgYWZ0ZXIgVEJUVCBidXQgZ290IG5vdGluZworICogQEFSNUtfSU5UX0NBQl9USU1FT1VUOiBXZSB3YWl0ZWQgZm9yIENBQiB0cmFmZmljIGFmdGVyIHRoZSBiZWFjb24gYnV0IGdvdAorICoJCW5vdGhpbmcgb3IgYW4gaW5jb21wbGV0ZSBDQUIgZnJhbWUgc2VxdWVuY2UuCisgKiBAQVI1S19JTlRfUUNCUk9STjogQSBxdWV1ZSBnb3QgaXQncyBDQlIgY291bnRlciBleHBpcmVkCisgKiBAQVI1S19JTlRfUUNCUlVSTjogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkIHdpbGUgZW1wdHkKKyAqIEBBUjVLX0lOVF9RVFJJRzogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkCisgKgorICogQEFSNUtfSU5UX0ZBVEFMOiBGYXRhbCBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCwgdHlwaWNhbGx5IGNhdXNlZCBieSBidXMvRE1BCisgKgkJZXJyb3JzLiBJbmRpY2F0ZXMgd2UgbmVlZCB0byByZXNldCB0aGUgY2FyZC4KICAqIEBBUjVLX0lOVF9HTE9CQUw6IFVzZWQgdG8gY2xlYXIgYW5kIHNldCB0aGUgSUVSCi0gKiBAQVI1S19JTlRfTk9DQVJEOiBzaWduYWxzIHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKLSAqIEBBUjVLX0lOVF9DT01NT046IGNvbW1vbiBpbnRlcnJ1cHRzIHNoYXJlZCBhbW9uZyBNQUNzIHdpdGggdGhlIHNhbWUKLSAqCWJpdCB2YWx1ZQorICogQEFSNUtfSU5UX05PQ0FSRDogU2lnbmFscyB0aGUgY2FyZCBoYXMgYmVlbiByZW1vdmVkCisgKiBAQVI1S19JTlRfQ09NTU9OOiBDb21tb24gaW50ZXJydXB0cyBzaGFyZWQgYW1vbmcgTUFDcyB3aXRoIHRoZSBzYW1lCisgKgkJYml0IHZhbHVlCiAgKgogICogVGhlc2UgYXJlIG1hcHBlZCB0byB0YWtlIGFkdmFudGFnZSBvZiBzb21lIGNvbW1vbiBiaXRzCiAgKiBiZXR3ZWVuIHRoZSBNQUNzLCB0byBiZSBhYmxlIHRvIHNldCBpbnRyIHByb3BlcnRpZXMKQEAgLTg0NywxNSArMTAzMCwxNSBAQAogCUFSNUtfSU5UX0dQSU8JPQkweDAxMDAwMDAwLAogCUFSNUtfSU5UX0JDTl9USU1FT1VUID0JMHgwMjAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwogCUFSNUtfSU5UX0NBQl9USU1FT1VUID0JMHgwNDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwotCUFSNUtfSU5UX1JYX0RPUFBMRVIgPQkweDA4MDAwMDAwLCAvKiBOb24gY29tbW9uICovCi0JQVI1S19JTlRfUUNCUk9STiA9CTB4MTAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KLQlBUjVLX0lOVF9RQ0JSVVJOID0JMHgyMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwotCUFSNUtfSU5UX1FUUklHCT0JMHg0MDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX1FDQlJPUk4gPQkweDA4MDAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfUUNCUlVSTiA9CTB4MTAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KKwlBUjVLX0lOVF9RVFJJRwk9CTB4MjAwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KIAlBUjVLX0lOVF9HTE9CQUwgPQkweDgwMDAwMDAwLAogCiAJQVI1S19JTlRfVFhfQUxMID0gQVI1S19JTlRfVFhPSwogCQl8IEFSNUtfSU5UX1RYREVTQwogCQl8IEFSNUtfSU5UX1RYRVJSCisJCXwgQVI1S19JTlRfVFhOT0ZSTQogCQl8IEFSNUtfSU5UX1RYRU9MCiAJCXwgQVI1S19JTlRfVFhVUk4sCiAKQEAgLTg5MSwxNSArMTA3NCwzMiBAQAogCUFSNUtfSU5UX05PQ0FSRAk9IDB4ZmZmZmZmZmYKIH07CiAKLS8qIG1hc2sgd2hpY2ggY2FsaWJyYXRpb24gaXMgYWN0aXZlIGF0IHRoZSBtb21lbnQgKi8KKy8qKgorICogZW51bSBhdGg1a19jYWxpYnJhdGlvbl9tYXNrIC0gTWFzayB3aGljaCBjYWxpYnJhdGlvbiBpcyBhY3RpdmUgYXQgdGhlIG1vbWVudAorICogQEFSNUtfQ0FMSUJSQVRJT05fRlVMTDogRnVsbCBjYWxpYnJhdGlvbiAoQUdDICsgU0hPUlQpCisgKiBAQVI1S19DQUxJQlJBVElPTl9TSE9SVDogU2hvcnQgY2FsaWJyYXRpb24gKE5GICsgSS9RKQorICogQEFSNUtfQ0FMSUJSQVRJT05fTkY6IE5vaXNlIEZsb29yIGNhbGlicmF0aW9uCisgKiBAQVI1S19DQUxJQlJBVElPTl9BTkk6IEFkYXB0aXZlIE5vaXNlIEltbXVuaXR5CisgKi8KIGVudW0gYXRoNWtfY2FsaWJyYXRpb25fbWFzayB7CiAJQVI1S19DQUxJQlJBVElPTl9GVUxMID0gMHgwMSwKIAlBUjVLX0NBTElCUkFUSU9OX1NIT1JUID0gMHgwMiwKLQlBUjVLX0NBTElCUkFUSU9OX0FOSSA9IDB4MDQsCisJQVI1S19DQUxJQlJBVElPTl9ORiA9IDB4MDQsCisJQVI1S19DQUxJQlJBVElPTl9BTkkgPSAweDA4LAogfTsKIAotLyoKLSAqIFBvd2VyIG1hbmFnZW1lbnQKKy8qKgorICogZW51bSBhdGg1a19wb3dlcl9tb2RlIC0gUG93ZXIgbWFuYWdlbWVudCBtb2RlcworICogQEFSNUtfUE1fVU5ERUZJTkVEOiBVbmRlZmluZWQKKyAqIEBBUjVLX1BNX0FVVE86IEFsbG93IGNhcmQgdG8gc2xlZXAgaWYgcG9zc2libGUKKyAqIEBBUjVLX1BNX0FXQUtFOiBGb3JjZSBjYXJkIHRvIHdha2UgdXAKKyAqIEBBUjVLX1BNX0ZVTExfU0xFRVA6IEZvcmNlIGNhcmQgdG8gZnVsbCBzbGVlcCAoREFOR0VST1VTKQorICogQEFSNUtfUE1fTkVUV09SS19TTEVFUDogQWxsb3cgdG8gc2xlZXAgZm9yIGEgc3BlY2lmaWVkIGR1cmF0aW9uCisgKgorICogQ3VycmVudGx5IG9ubHkgUE1fQVdBS0UgaXMgdXNlZCwgRlVMTF9TTEVFUCBhbmQgTkVUV09SS19TTEVFUC9BVVRPCisgKiBhcmUgYWxzbyBrbm93biB0byBoYXZlIHByb2JsZW1zIG9uIHNvbWUgY2FyZHMuIFRoaXMgaXMgbm90IGEgYmlnCisgKiBwcm9ibGVtIHRob3VnaCBiZWNhdXNlIHdlIGNhbiBoYXZlIGFsbW9zdCB0aGUgc2FtZSBlZmZlY3QgYXMKKyAqIEZVTExfU0xFRVAgYnkgcHV0dGluZyBjYXJkIG9uIHdhcm0gcmVzZXQgKGl0J3MgYWxtb3N0IHBvd2VyZWQgZG93bikuCiAgKi8KIGVudW0gYXRoNWtfcG93ZXJfbW9kZSB7CiAJQVI1S19QTV9VTkRFRklORUQgPSAwLApAQCAtOTU3LDYgKzExNTcsOCBAQAogCX0gY2FwX3F1ZXVlczsKIAogCWJvb2wgY2FwX2hhc19waHllcnJfY291bnRlcnM7CisJYm9vbCBjYXBfaGFzX21ycl9zdXBwb3J0OworCWJvb2wgY2FwX25lZWRzXzJHSHpfb3ZyOwogfTsKIAogLyogc2l6ZSBvZiBub2lzZSBmbG9vciBoaXN0b3J5IChrZWVwIGl0IGEgcG93ZXIgb2YgdHdvKSAqLwpAQCAtMTA3MiwxMyArMTI3NCwxMSBAQAogCWRtYV9hZGRyX3QJCWRlc2NfZGFkZHI7CS8qIERNQSAocGh5c2ljYWwpIGFkZHJlc3MgKi8KIAlzaXplX3QJCQlkZXNjX2xlbjsJLyogc2l6ZSBvZiBUWC9SWCBkZXNjcmlwdG9ycyAqLwogCi0JREVDTEFSRV9CSVRNQVAoc3RhdHVzLCA2KTsKKwlERUNMQVJFX0JJVE1BUChzdGF0dXMsIDQpOwogI2RlZmluZSBBVEhfU1RBVF9JTlZBTElECTAJCS8qIGRpc2FibGUgaGFyZHdhcmUgYWNjZXNzZXMgKi8KLSNkZWZpbmUgQVRIX1NUQVRfTVJSRVRSWQkxCQkvKiBtdWx0aS1yYXRlIHJldHJ5IHN1cHBvcnQgKi8KLSNkZWZpbmUgQVRIX1NUQVRfUFJPTUlTQwkyCi0jZGVmaW5lIEFUSF9TVEFUX0xFRFNPRlQJMwkJLyogZW5hYmxlIExFRCBncGlvIHN0YXR1cyAqLwotI2RlZmluZSBBVEhfU1RBVF9TVEFSVEVECTQJCS8qIG9wZW5lZCAmIGlycXMgZW5hYmxlZCAqLwotI2RlZmluZSBBVEhfU1RBVF8yR19ESVNBQkxFRAk1CQkvKiBtdWx0aWJhbmQgcmFkaW8gd2l0aG91dCAyRyAqLworI2RlZmluZSBBVEhfU1RBVF9QUk9NSVNDCTEKKyNkZWZpbmUgQVRIX1NUQVRfTEVEU09GVAkyCQkvKiBlbmFibGUgTEVEIGdwaW8gc3RhdHVzICovCisjZGVmaW5lIEFUSF9TVEFUX1NUQVJURUQJMwkJLyogb3BlbmVkICYgaXJxcyBlbmFibGVkICovCiAKIAl1bnNpZ25lZCBpbnQJCWZpbHRlcl9mbGFnczsJLyogSFcgZmxhZ3MsIEFSNUtfUlhfRklMVEVSXyogKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cmNoYW47CS8qIGN1cnJlbnQgaC93IGNoYW5uZWwgKi8KQEAgLTEwOTcsNiArMTI5Nyw3IEBACiAJCQkJbGVkX29uOwkJLyogcGluIHNldHRpbmcgZm9yIExFRCBvbiAqLwogCiAJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3dvcms7CS8qIGRlZmVycmVkIGNoaXAgcmVzZXQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2FsaWJfd29yazsJLyogZGVmZXJyZWQgcGh5IGNhbGlicmF0aW9uICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJ4YnVmOwkJLyogcmVjZWl2ZSBidWZmZXIgKi8KIAlzcGlubG9ja190CQlyeGJ1ZmxvY2s7CkBAIC0xMTEzLDggKzEzMTQsNiBAQAogCiAJc3RydWN0IGF0aDVrX3Jma2lsbAlyZl9raWxsOwogCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWNhbGliOwkJLyogY2FsaWJyYXRpb24gdGFza2xldCAqLwotCiAJc3BpbmxvY2tfdAkJYmxvY2s7CQkvKiBwcm90ZWN0cyBiZWFjb24gKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJYmVhY29udHE7CS8qIGJlYWNvbiBpbnRyIHRhc2tsZXQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWJjYnVmOwkJLyogYmVhY29uIGJ1ZmZlciAqLwpAQCAtMTE0NCw3ICsxMzQzLDcgQEAKIAllbnVtIGF0aDVrX2ludAkJYWhfaW1yOwogCiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICphaF9jdXJyZW50X2NoYW5uZWw7Ci0JYm9vbAkJCWFoX2NhbGlicmF0aW9uOworCWJvb2wJCQlhaF9pcV9jYWxfbmVlZGVkOwogCWJvb2wJCQlhaF9zaW5nbGVfY2hpcDsKIAogCWVudW0gYXRoNWtfdmVyc2lvbglhaF92ZXJzaW9uOwpAQCAtMTE4Nyw3ICsxMzg2LDEzIEBACiAJdTMyCQkJYWhfdHhxX2ltcl9jYnJ1cm47CiAJdTMyCQkJYWhfdHhxX2ltcl9xdHJpZzsKIAl1MzIJCQlhaF90eHFfaW1yX25vZnJtOwotCXUzMgkJCWFoX3R4cV9pc3I7CisKKwl1MzIJCQlhaF90eHFfaXNyX3R4b2tfYWxsOworCXUzMgkJCWFoX3R4cV9pc3JfdHh1cm47CisJdTMyCQkJYWhfdHhxX2lzcl9xY2Jvcm47CisJdTMyCQkJYWhfdHhxX2lzcl9xY2J1cm47CisJdTMyCQkJYWhfdHhxX2lzcl9xdHJpZzsKKwogCXUzMgkJCSphaF9yZl9iYW5rczsKIAlzaXplX3QJCQlhaF9yZl9iYW5rc19zaXplOwogCXNpemVfdAkJCWFoX3JmX3JlZ3NfY291bnQ7CkBAIC0xMjI4LDggKzE0MzMsOCBAQAogCiAJLyogQ2FsaWJyYXRpb24gdGltZXN0YW1wICovCiAJdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfZnVsbDsKKwl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9zaG9ydDsKIAl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9hbmk7Ci0JdW5zaWduZWQgbG9uZwkJYWhfY2FsX25leHRfbmY7CiAKIAkvKiBDYWxpYnJhdGlvbiBtYXNrICovCiAJdTgJCQlhaF9jYWxfbWFzazsKQEAgLTEzMzgsMTEgKzE1NDMsMTEgQEAKIHU2NCBhdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCk7CiB2b2lkIGF0aDVrX2h3X3NldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgdHNmNjQpOwogdm9pZCBhdGg1a19od19yZXNldF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCk7Ci12b2lkIGF0aDVrX2h3X2luaXRfYmVhY29uKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKTsKK3ZvaWQgYXRoNWtfaHdfaW5pdF9iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwKKwkJCQkJCQl1MzIgaW50ZXJ2YWwpOwogYm9vbCBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBpbnR2YWwpOwogLyogSW5pdCBmdW5jdGlvbiAqLwotdm9pZCBhdGg1a19od19wY3VfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUsCi0JCQkJCQkJCXU4IG1vZGUpOwordm9pZCBhdGg1a19od19wY3VfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUpOwogCiAvKiBRdWV1ZSBDb250cm9sIFVuaXQsIERGUyBDb250cm9sIFVuaXQgRnVuY3Rpb25zICovCiBpbnQgYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jCmluZGV4IDkxNjI3ZGQuLmQ3MTE0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdHRhY2guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMKQEAgLTI3LDggKzI3LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKioKLSAqIGF0aDVrX2h3X3Bvc3QgLSBQb3dlciBPbiBTZWxmIFRlc3QgaGVscGVyIGZ1bmN0aW9uCi0gKgorICogYXRoNWtfaHdfcG9zdCgpIC0gUG93ZXIgT24gU2VsZiBUZXN0IGhlbHBlciBmdW5jdGlvbgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICovCiBzdGF0aWMgaW50IGF0aDVrX2h3X3Bvc3Qoc3RydWN0IGF0aDVrX2h3ICphaCkKQEAgLTkyLDggKzkxLDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19pbml0IC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cwotICoKKyAqIGF0aDVrX2h3X2luaXQoKSAtIENoZWNrIGlmIGh3IGlzIHN1cHBvcnRlZCBhbmQgaW5pdCB0aGUgbmVlZGVkIHN0cnVjdHMKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKICAqCiAgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCwgcGVyZm9ybSBhIFBPU1QgYW5kIGluaXRpYWxpemUgdGhlIG5lZWRlZApAQCAtMjk4LDcgKzI5Niw3IEBACiAKIAkJLyogUmVzZXQgU0VSREVTIHRvIGxvYWQgbmV3IHNldHRpbmdzICovCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMDAwMCwgQVI1S19QQ0lFX1NFUkRFU19SRVNFVCk7Ci0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCX0KIAogCS8qIEdldCBtaXNjIGNhcGFiaWxpdGllcyAqLwpAQCAtMzA4LDExICszMDYsNiBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAodGVzdF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpKSB7Ci0JCV9fY2xlYXJfYml0KEFSNUtfTU9ERV8xMUIsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwotCQlfX2NsZWFyX2JpdChBUjVLX01PREVfMTFHLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9tb2RlKTsKLQl9Ci0KIAkvKiBDcnlwdG8gc2V0dGluZ3MgKi8KIAljb21tb24tPmtleW1heCA9IChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCA/CiAJCQkgIEFSNUtfS0VZVEFCTEVfU0laRV81MjEwIDogQVI1S19LRVlUQUJMRV9TSVpFXzUyMTEpOwpAQCAtMzQ5LDggKzM0Miw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZGVpbml0IC0gRnJlZSB0aGUgYXRoNWtfaHcgc3RydWN0Ci0gKgorICogYXRoNWtfaHdfZGVpbml0KCkgLSBGcmVlIHRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KIHZvaWQgYXRoNWtfaHdfZGVpbml0KHN0cnVjdCBhdGg1a19odyAqYWgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwppbmRleCBiMzQ2ZDA0Li4xNzhhNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKQEAgLTgwLDYgKzgwLDExIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoZmFzdGNoYW5zd2l0Y2gsIG1vZHBhcmFtX2Zhc3RjaGFuc3dpdGNoLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmFzdGNoYW5zd2l0Y2gsICJFbmFibGUgZmFzdCBjaGFubmVsIHN3aXRjaGluZyBmb3IgQVIyNDEzL0FSNTQxMyByYWRpb3MuIik7CiAKK3N0YXRpYyBpbnQgYXRoNWtfbW9kcGFyYW1fbm9faHdfcmZraWxsX3N3aXRjaDsKK21vZHVsZV9wYXJhbV9uYW1lZChub19od19yZmtpbGxfc3dpdGNoLCBhdGg1a19tb2RwYXJhbV9ub19od19yZmtpbGxfc3dpdGNoLAorCQkJCQkJCQlib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9faHdfcmZraWxsX3N3aXRjaCwgIklnbm9yZSB0aGUgR1BJTyBSRktpbGwgc3dpdGNoIHN0YXRlIik7CisKIAogLyogTW9kdWxlIGluZm8gKi8KIE1PRFVMRV9BVVRIT1IoIkppcmkgU2xhYnkiKTsKQEAgLTE4Myw3ICsxODgsNiBAQAogCXsgLmJpdHJhdGUgPSA1NDAsCiAJICAuaHdfdmFsdWUgPSBBVEg1S19SQVRFX0NPREVfNTRNLAogCSAgLmZsYWdzID0gMCB9LAotCS8qIFhSIG1pc3NpbmcgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGF0aDVrX2V4dGVuZF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHJzdGFtcCkKQEAgLTcyMSwyMiArNzI1LDI1IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5tYXA7CiAKLQltZW1zZXQobXJyX3JhdGUsIDAsIHNpemVvZihtcnJfcmF0ZSkpOwotCW1lbXNldChtcnJfdHJpZXMsIDAsIHNpemVvZihtcnJfdHJpZXMpKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGFoLT5odywgaW5mbywgaSk7Ci0JCWlmICghcmF0ZSkKLQkJCWJyZWFrOworCS8qIFNldCB1cCBNUlIgZGVzY3JpcHRvciAqLworCWlmIChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9oYXNfbXJyX3N1cHBvcnQpIHsKKwkJbWVtc2V0KG1ycl9yYXRlLCAwLCBzaXplb2YobXJyX3JhdGUpKTsKKwkJbWVtc2V0KG1ycl90cmllcywgMCwgc2l6ZW9mKG1ycl90cmllcykpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlyYXRlID0gaWVlZTgwMjExX2dldF9hbHRfcmV0cnlfcmF0ZShhaC0+aHcsIGluZm8sIGkpOworCQkJaWYgKCFyYXRlKQorCQkJCWJyZWFrOwogCi0JCW1ycl9yYXRlW2ldID0gcmF0ZS0+aHdfdmFsdWU7Ci0JCW1ycl90cmllc1tpXSA9IGluZm8tPmNvbnRyb2wucmF0ZXNbaSArIDFdLmNvdW50OworCQkJbXJyX3JhdGVbaV0gPSByYXRlLT5od192YWx1ZTsKKwkJCW1ycl90cmllc1tpXSA9IGluZm8tPmNvbnRyb2wucmF0ZXNbaSArIDFdLmNvdW50OworCQl9CisKKwkJYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2MoYWgsIGRzLAorCQkJbXJyX3JhdGVbMF0sIG1ycl90cmllc1swXSwKKwkJCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCisJCQltcnJfcmF0ZVsyXSwgbXJyX3RyaWVzWzJdKTsKIAl9CiAKLQlhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgZHMsCi0JCW1ycl9yYXRlWzBdLCBtcnJfdHJpZXNbMF0sCi0JCW1ycl9yYXRlWzFdLCBtcnJfdHJpZXNbMV0sCi0JCW1ycl9yYXRlWzJdLCBtcnJfdHJpZXNbMl0pOwotCiAJZHMtPmRzX2xpbmsgPSAwOwogCWRzLT5kc19kYXRhID0gYmYtPnNrYmFkZHI7CiAKQEAgLTE2ODksNyArMTY5Niw3IEBACiAJc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUjVLX05VTV9UWF9RVUVVRVM7IGkrKykKLQkJaWYgKGFoLT50eHFzW2ldLnNldHVwICYmIChhaC0+YWhfdHhxX2lzciAmIEJJVChpKSkpCisJCWlmIChhaC0+dHhxc1tpXS5zZXR1cCAmJiAoYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgJiBCSVQoaSkpKQogCQkJYXRoNWtfdHhfcHJvY2Vzc3EoYWgsICZhaC0+dHhxc1tpXSk7CiAKIAlhaC0+dHhfcGVuZGluZyA9IGZhbHNlOwpAQCAtMjAwNSw3ICsyMDEyLDcgQEAKIAlhaC0+bmV4dHRidHQgPSBuZXh0dGJ0dDsKIAogCWludHZhbCB8PSBBUjVLX0JFQUNPTl9FTkE7Ci0JYXRoNWtfaHdfaW5pdF9iZWFjb24oYWgsIG5leHR0YnR0LCBpbnR2YWwpOworCWF0aDVrX2h3X2luaXRfYmVhY29uX3RpbWVycyhhaCwgbmV4dHRidHQsIGludHZhbCk7CiAKIAkvKgogCSAqIGRlYnVnZ2luZyBvdXRwdXQgbGFzdCBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgdGltZSBjcml0aWNhbCBhc3BlY3QKQEAgLTIxMTIsMTYgKzIxMTksMjkgQEAKIGF0aDVrX2ludHJfY2FsaWJyYXRpb25fcG9sbChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9hbmkpICYmCi0JICAgICEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSkgewotCQkvKiBydW4gQU5JIG9ubHkgd2hlbiBmdWxsIGNhbGlicmF0aW9uIGlzIG5vdCBhY3RpdmUgKi8KKwkgICAhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkgJiYKKwkgICAhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fU0hPUlQpKSB7CisKKwkJLyogUnVuIEFOSSBvbmx5IHdoZW4gY2FsaWJyYXRpb24gaXMgbm90IGFjdGl2ZSAqLworCiAJCWFoLT5haF9jYWxfbmV4dF9hbmkgPSBqaWZmaWVzICsKIAkJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9BTkkpOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogCi0JfSBlbHNlIGlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9mdWxsKSkgewotCQlhaC0+YWhfY2FsX25leHRfZnVsbCA9IGppZmZpZXMgKwotCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+Y2FsaWIpOworCX0gZWxzZSBpZiAodGltZV9pc19iZWZvcmVfZXFfamlmZmllcyhhaC0+YWhfY2FsX25leHRfc2hvcnQpICYmCisJCSEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSAmJgorCQkhKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fU0hPUlQpKSB7CisKKwkJLyogUnVuIGNhbGlicmF0aW9uIG9ubHkgd2hlbiBhbm90aGVyIGNhbGlicmF0aW9uCisJCSAqIGlzIG5vdCBydW5uaW5nLgorCQkgKgorCQkgKiBOb3RlOiBUaGlzIGlzIGZvciBib3RoIGZ1bGwvc2hvcnQgY2FsaWJyYXRpb24sCisJCSAqIGlmIGl0J3MgdGltZSBmb3IgYSBmdWxsIG9uZSwgYXRoNWtfY2FsaWJyYXRlX3dvcmsgd2lsbCBkZWFsCisJCSAqIHdpdGggaXQuICovCisKKwkJYWgtPmFoX2NhbF9uZXh0X3Nob3J0ID0gamlmZmllcyArCisJCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQpOworCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+Y2FsaWJfd29yayk7CiAJfQogCS8qIHdlIGNvdWxkIHVzZSBTV0kgdG8gZ2VuZXJhdGUgZW5vdWdoIGludGVycnVwdHMgdG8gbWVldCBvdXIKIAkgKiBjYWxpYnJhdGlvbiBpbnRlcnZhbCByZXF1aXJlbWVudHMsIGlmIG5lY2Vzc2FyeToKQEAgLTIxNDksNjkgKzIxNjksMTEwIEBACiAJZW51bSBhdGg1a19pbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBjb3VudGVyID0gMTAwMDsKIAorCisJLyoKKwkgKiBJZiBodyBpcyBub3QgcmVhZHkgKG9yIGRldGFjaGVkKSBhbmQgd2UgZ2V0IGFuCisJICogaW50ZXJydXB0LCBvciBpZiB3ZSBoYXZlIG5vIGludGVycnVwdHMgcGVuZGluZworCSAqICh0aGF0IG1lYW5zIGl0J3Mgbm90IGZvciB1cykgc2tpcCBpdC4KKwkgKgorCSAqIE5PVEU6IEdyb3VwIDAvMSBQQ0kgaW50ZXJmYWNlIHJlZ2lzdGVycyBhcmUgbm90CisJICogc3VwcG9ydGVkIG9uIFdpU09Dcywgc28gd2UgY2FuJ3QgY2hlY2sgZm9yIHBlbmRpbmcKKwkgKiBpbnRlcnJ1cHRzIChJU1IgYmVsb25ncyB0byBhbm90aGVyIHJlZ2lzdGVyIGdyb3VwCisJICogc28gd2UgYXJlIG9rKS4KKwkgKi8KIAlpZiAodW5saWtlbHkodGVzdF9iaXQoQVRIX1NUQVRfSU5WQUxJRCwgYWgtPnN0YXR1cykgfHwKLQkJKChhdGg1a19nZXRfYnVzX3R5cGUoYWgpICE9IEFUSF9BSEIpICYmCi0JCQkJIWF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkpKSkKKwkJCSgoYXRoNWtfZ2V0X2J1c190eXBlKGFoKSAhPSBBVEhfQUhCKSAmJgorCQkJIWF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkpKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCisJLyoqIE1haW4gbG9vcCAqKi8KIAlkbyB7Ci0JCWF0aDVrX2h3X2dldF9pc3IoYWgsICZzdGF0dXMpOwkJLyogTkI6IGNsZWFycyBJUlEgdG9vICovCisJCWF0aDVrX2h3X2dldF9pc3IoYWgsICZzdGF0dXMpOwkvKiBOQjogY2xlYXJzIElSUSB0b28gKi8KKwogCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0lOVFIsICJzdGF0dXMgMHgleC8weCV4XG4iLAogCQkJCXN0YXR1cywgYWgtPmltYXNrKTsKKworCQkvKgorCQkgKiBGYXRhbCBodyBlcnJvciAtPiBMb2cgYW5kIHJlc2V0CisJCSAqCisJCSAqIEZhdGFsIGVycm9ycyBhcmUgdW5yZWNvdmVyYWJsZSBzbyB3ZSBoYXZlIHRvCisJCSAqIHJlc2V0IHRoZSBjYXJkLiBUaGVzZSBlcnJvcnMgaW5jbHVkZSBidXMgYW5kCisJCSAqIGRtYSBlcnJvcnMuCisJCSAqLwogCQlpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfRkFUQUwpKSB7Ci0JCQkvKgotCQkJICogRmF0YWwgZXJyb3JzIGFyZSB1bnJlY292ZXJhYmxlLgotCQkJICogVHlwaWNhbGx5IHRoZXNlIGFyZSBjYXVzZWQgYnkgRE1BIGVycm9ycy4KLQkJCSAqLworCiAJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAogCQkJCSAgImZhdGFsIGludCwgcmVzZXR0aW5nXG4iKTsKIAkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKKworCQkvKgorCQkgKiBSWCBPdmVycnVuIC0+IENvdW50IGFuZCByZXNldCBpZiBuZWVkZWQKKwkJICoKKwkJICogUmVjZWl2ZSBidWZmZXJzIGFyZSBmdWxsLiBFaXRoZXIgdGhlIGJ1cyBpcyBidXN5IG9yCisJCSAqIHRoZSBDUFUgaXMgbm90IGZhc3QgZW5vdWdoIHRvIHByb2Nlc3MgYWxsIHJlY2VpdmVkCisJCSAqIGZyYW1lcy4KKwkJICovCiAJCX0gZWxzZSBpZiAodW5saWtlbHkoc3RhdHVzICYgQVI1S19JTlRfUlhPUk4pKSB7CisKIAkJCS8qCi0JCQkgKiBSZWNlaXZlIGJ1ZmZlcnMgYXJlIGZ1bGwuIEVpdGhlciB0aGUgYnVzIGlzIGJ1c3kgb3IKLQkJCSAqIHRoZSBDUFUgaXMgbm90IGZhc3QgZW5vdWdoIHRvIHByb2Nlc3MgYWxsIHJlY2VpdmVkCi0JCQkgKiBmcmFtZXMuCiAJCQkgKiBPbGRlciBjaGlwc2V0cyBuZWVkIGEgcmVzZXQgdG8gY29tZSBvdXQgb2YgdGhpcwogCQkJICogY29uZGl0aW9uLCBidXQgd2UgdHJlYXQgaXQgYXMgUlggZm9yIG5ld2VyIGNoaXBzLgotCQkJICogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoaWNoIHZlcnNpb25zIG5lZWQgYSByZXNldCAtCisJCQkgKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hpY2ggdmVyc2lvbnMgbmVlZCBhIHJlc2V0CiAJCQkgKiB0aGlzIGd1ZXNzIGlzIGNvcGllZCBmcm9tIHRoZSBIQUwuCiAJCQkgKi8KIAkJCWFoLT5zdGF0cy5yeG9ybl9pbnRyKys7CisKIAkJCWlmIChhaC0+YWhfbWFjX3NyZXYgPCBBUjVLX1NSRVZfQVI1MjEyKSB7CiAJCQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwKIAkJCQkJICAicnggb3ZlcnJ1biwgcmVzZXR0aW5nXG4iKTsKIAkJCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7CiAJCQl9IGVsc2UKIAkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7CisKIAkJfSBlbHNlIHsKKworCQkJLyogU29mdHdhcmUgQmVhY29uIEFsZXJ0IC0+IFNjaGVkdWxlIGJlYWNvbiB0YXNrbGV0ICovCiAJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfU1dCQSkKIAkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZhaC0+YmVhY29udHEpOwogCi0JCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfUlhFT0wpIHsKLQkJCQkvKgotCQkJCSogTkI6IHRoZSBoYXJkd2FyZSBzaG91bGQgcmUtcmVhZCB0aGUgbGluayB3aGVuCi0JCQkJKiAgICAgUlhFIGJpdCBpcyB3cml0dGVuLCBidXQgaXQgZG9lc24ndCB3b3JrIGF0Ci0JCQkJKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KLQkJCQkqLworCQkJLyoKKwkJCSAqIE5vIG1vcmUgUlggZGVzY3JpcHRvcnMgLT4gSnVzdCBjb3VudAorCQkJICoKKwkJCSAqIE5COiB0aGUgaGFyZHdhcmUgc2hvdWxkIHJlLXJlYWQgdGhlIGxpbmsgd2hlbgorCQkJICogICAgIFJYRSBiaXQgaXMgd3JpdHRlbiwgYnV0IGl0IGRvZXNuJ3Qgd29yayBhdAorCQkJICogICAgIGxlYXN0IG9uIG9sZGVyIGhhcmR3YXJlIHJldnMuCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9SWEVPTCkKIAkJCQlhaC0+c3RhdHMucnhlb2xfaW50cisrOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX1RYVVJOKSB7Ci0JCQkJLyogYnVtcCB0eCB0cmlnZ2VyIGxldmVsICovCisKKworCQkJLyogVFggVW5kZXJydW4gLT4gQnVtcCB0eCB0cmlnZ2VyIGxldmVsICovCisJCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfVFhVUk4pCiAJCQkJYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChhaCwgdHJ1ZSk7Ci0JCQl9CisKKwkJCS8qIFJYIC0+IFNjaGVkdWxlIHJ4IHRhc2tsZXQgKi8KIAkJCWlmIChzdGF0dXMgJiAoQVI1S19JTlRfUlhPSyB8IEFSNUtfSU5UX1JYRVJSKSkKIAkJCQlhdGg1a19zY2hlZHVsZV9yeChhaCk7Ci0JCQlpZiAoc3RhdHVzICYgKEFSNUtfSU5UX1RYT0sgfCBBUjVLX0lOVF9UWERFU0MKLQkJCQkJfCBBUjVLX0lOVF9UWEVSUiB8IEFSNUtfSU5UX1RYRU9MKSkKKworCQkJLyogVFggLT4gU2NoZWR1bGUgdHggdGFza2xldCAqLworCQkJaWYgKHN0YXR1cyAmIChBUjVLX0lOVF9UWE9LCisJCQkJCXwgQVI1S19JTlRfVFhERVNDCisJCQkJCXwgQVI1S19JTlRfVFhFUlIKKwkJCQkJfCBBUjVLX0lOVF9UWEVPTCkpCiAJCQkJYXRoNWtfc2NoZWR1bGVfdHgoYWgpOwotCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX0JNSVNTKSB7Ci0JCQkJLyogVE9ETyAqLwotCQkJfQorCisJCQkvKiBNaXNzZWQgYmVhY29uIC0+IFRPRE8KKwkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9CTUlTUykKKwkJCSovCisKKwkJCS8qIE1JQiBldmVudCAtPiBVcGRhdGUgY291bnRlcnMgYW5kIG5vdGlmeSBBTkkgKi8KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9NSUIpIHsKIAkJCQlhaC0+c3RhdHMubWliX2ludHIrKzsKIAkJCQlhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKGFoKTsKIAkJCQlhdGg1a19hbmlfbWliX2ludHIoYWgpOwogCQkJfQorCisJCQkvKiBHUElPIC0+IE5vdGlmeSBSRktpbGwgbGF5ZXIgKi8KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9HUElPKQogCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5yZl9raWxsLnRvZ2dsZXEpOwogCkBAIC0yMjIyLDEyICsyMjgzLDE5IEBACiAKIAl9IHdoaWxlIChhdGg1a19od19pc19pbnRyX3BlbmRpbmcoYWgpICYmIC0tY291bnRlciA+IDApOwogCisJLyoKKwkgKiBVbnRpbCB3ZSBoYW5kbGUgcngvdHggaW50ZXJydXB0cyBtYXNrIHRoZW0gb24gSU1SCisJICoKKwkgKiBOT1RFOiBhaC0+KHJ4L3R4KV9wZW5kaW5nIGFyZSBzZXQgd2hlbiBzY2hlZHVsaW5nIHRoZSB0YXNrbGV0cworCSAqIGFuZCB1bnNldCBhZnRlciB3ZSAndmUgaGFuZGxlZCB0aGUgaW50ZXJydXB0cy4KKwkgKi8KIAlpZiAoYWgtPnJ4X3BlbmRpbmcgfHwgYWgtPnR4X3BlbmRpbmcpCiAJCWF0aDVrX3NldF9jdXJyZW50X2ltYXNrKGFoKTsKIAogCWlmICh1bmxpa2VseSghY291bnRlcikpCiAJCUFUSDVLX1dBUk4oYWgsICJ0b28gbWFueSBpbnRlcnJ1cHRzLCBnaXZpbmcgdXAgZm9yIG5vd1xuIik7CiAKKwkvKiBGaXJlIHVwIGNhbGlicmF0aW9uIHBvbGwgKi8KIAlhdGg1a19pbnRyX2NhbGlicmF0aW9uX3BvbGwoYWgpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjIzOCw0MSArMjMwNiw1OCBAQAogICogZm9yIHRlbXBlcmF0dXJlL2Vudmlyb25tZW50IGNoYW5nZXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1hdGg1a190YXNrbGV0X2NhbGlicmF0ZSh1bnNpZ25lZCBsb25nIGRhdGEpCithdGg1a19jYWxpYnJhdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0aDVrX2h3ICphaCA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGg1a19odywKKwkJY2FsaWJfd29yayk7CiAKLQkvKiBPbmx5IGZ1bGwgY2FsaWJyYXRpb24gZm9yIG5vdyAqLwotCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisJLyogU2hvdWxkIHdlIHJ1biBhIGZ1bGwgY2FsaWJyYXRpb24gPyAqLworCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9mdWxsKSkgeworCisJCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArCisJCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfRlVMTCk7CisJCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisKKwkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCisJCQkJInJ1bm5pbmcgZnVsbCBjYWxpYnJhdGlvblxuIik7CisKKwkJaWYgKGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShhaCkgPT0gQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UpIHsKKwkJCS8qCisJCQkgKiBSZmdhaW4gaXMgb3V0IG9mIGJvdW5kcywgcmVzZXQgdGhlIGNoaXAKKwkJCSAqIHRvIGxvYWQgbmV3IGdhaW4gdmFsdWVzLgorCQkJICovCisJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAorCQkJCQkiZ290IG5ldyByZmdhaW4sIHJlc2V0dGluZ1xuIik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7CisJCX0KKworCQkvKiBUT0RPOiBPbiBmdWxsIGNhbGlicmF0aW9uIHdlIHNob3VsZCBzdG9wIFRYIGhlcmUsCisJCSAqIHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmUgKG1vc3RseSBkdWUgdG8gZ2Fpbl9mCisJCSAqIGNhbGlicmF0aW9uIHRoYXQgbWVzc2VzIHdpdGggdHggcGFja2V0cyAtc2VlIHBoeS5jKS4KKwkJICoKKwkJICogTk9URTogU3RvcHBpbmcgdGhlIHF1ZXVlcyBmcm9tIGFib3ZlIGlzIG5vdCBlbm91Z2gKKwkJICogdG8gc3RvcCBUWCBidXQgc2F2ZXMgdXMgZnJvbSBkaXNjb25lY3RpbmcgKGF0IGxlYXN0CisJCSAqIHdlIGRvbid0IGxvc2UgcGFja2V0cykuICovCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhhaC0+aHcpOworCX0gZWxzZQorCQlhaC0+YWhfY2FsX21hc2sgfD0gQVI1S19DQUxJQlJBVElPTl9TSE9SVDsKKwogCiAJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsICJjaGFubmVsICV1LyV4XG4iLAogCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoYWgtPmN1cmNoYW4tPmNlbnRlcl9mcmVxKSwKIAkJYWgtPmN1cmNoYW4tPmh3X3ZhbHVlKTsKIAotCWlmIChhdGg1a19od19nYWluZl9jYWxpYnJhdGUoYWgpID09IEFSNUtfUkZHQUlOX05FRURfQ0hBTkdFKSB7Ci0JCS8qCi0JCSAqIFJmZ2FpbiBpcyBvdXQgb2YgYm91bmRzLCByZXNldCB0aGUgY2hpcAotCQkgKiB0byBsb2FkIG5ldyBnYWluIHZhbHVlcy4KLQkJICovCi0JCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsICJjYWxpYnJhdGlvbiwgcmVzZXR0aW5nXG4iKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYWgtPmh3LCAmYWgtPnJlc2V0X3dvcmspOwotCX0KIAlpZiAoYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShhaCwgYWgtPmN1cmNoYW4pKQogCQlBVEg1S19FUlIoYWgsICJjYWxpYnJhdGlvbiBvZiBjaGFubmVsICV1IGZhaWxlZFxuIiwKIAkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKIAkJCQlhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpKTsKIAotCS8qIE5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGludGVycnVwdHMgcngvdHggcGF0aCB3aGlsZSBJL1EgY2FsaWJyYXRpb24KLQkgKiBkb2Vzbid0LgotCSAqIFRPRE86IFdlIHNob3VsZCBzdG9wIFRYIGhlcmUsIHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmUuCi0JICogTm90ZSB0aGF0IHN0b3BwaW5nIHRoZSBxdWV1ZXMgaXMgbm90IGVub3VnaCB0byBzdG9wIFRYISAqLwotCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9uZikpIHsKLQkJYWgtPmFoX2NhbF9uZXh0X25mID0gamlmZmllcyArCi0JCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfTkYpOwotCQlhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3IoYWgpOwotCX0KLQotCWFoLT5haF9jYWxfbWFzayAmPSB+QVI1S19DQUxJQlJBVElPTl9GVUxMOworCS8qIENsZWFyIGNhbGlicmF0aW9uIGZsYWdzICovCisJaWYgKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkgeworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoYWgtPmh3KTsKKwkJYWgtPmFoX2NhbF9tYXNrICY9IH5BUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisJfSBlbHNlIGlmIChhaC0+YWhfY2FsX21hc2sgJiBBUjVLX0NBTElCUkFUSU9OX1NIT1JUKQorCQlhaC0+YWhfY2FsX21hc2sgJj0gfkFSNUtfQ0FMSUJSQVRJT05fU0hPUlQ7CiB9CiAKIApAQCAtMjQwNyw4ICsyNDkyLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9pcnE7CiAKLQkvKiBzZXQgdXAgbXVsdGktcmF0ZSByZXRyeSBjYXBhYmlsaXRpZXMgKi8KLQlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKKwkvKiBTZXQgdXAgbXVsdGktcmF0ZSByZXRyeSBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfaGFzX21ycl9zdXBwb3J0KSB7CiAJCWh3LT5tYXhfcmF0ZXMgPSA0OwogCQlody0+bWF4X3JhdGVfdHJpZXMgPSBtYXgoQVI1S19JTklUX1JFVFJZX1NIT1JULAogCQkJCQkgQVI1S19JTklUX1JFVFJZX0xPTkcpOwpAQCAtMjU0NCwxNSArMjYyOSwyMiBAQAogCSAqIGFuZCB0aGVuIHNldHVwIG9mIHRoZSBpbnRlcnJ1cHQgbWFzay4KIAkgKi8KIAlhaC0+Y3VyY2hhbiA9IGFoLT5ody0+Y29uZi5jaGFubmVsOwotCWFoLT5pbWFzayA9IEFSNUtfSU5UX1JYT0sgfCBBUjVLX0lOVF9SWEVSUiB8IEFSNUtfSU5UX1JYRU9MIHwKLQkJQVI1S19JTlRfUlhPUk4gfCBBUjVLX0lOVF9UWERFU0MgfCBBUjVLX0lOVF9UWEVPTCB8Ci0JCUFSNUtfSU5UX0ZBVEFMIHwgQVI1S19JTlRfR0xPQkFMIHwgQVI1S19JTlRfTUlCOworCWFoLT5pbWFzayA9IEFSNUtfSU5UX1JYT0sKKwkJfCBBUjVLX0lOVF9SWEVSUgorCQl8IEFSNUtfSU5UX1JYRU9MCisJCXwgQVI1S19JTlRfUlhPUk4KKwkJfCBBUjVLX0lOVF9UWERFU0MKKwkJfCBBUjVLX0lOVF9UWEVPTAorCQl8IEFSNUtfSU5UX0ZBVEFMCisJCXwgQVI1S19JTlRfR0xPQkFMCisJCXwgQVI1S19JTlRfTUlCOwogCiAJcmV0ID0gYXRoNWtfcmVzZXQoYWgsIE5VTEwsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKLQlhdGg1a19yZmtpbGxfaHdfc3RhcnQoYWgpOworCWlmICghYXRoNWtfbW9kcGFyYW1fbm9faHdfcmZraWxsX3N3aXRjaCkKKwkJYXRoNWtfcmZraWxsX2h3X3N0YXJ0KGFoKTsKIAogCS8qCiAJICogUmVzZXQgdGhlIGtleSBjYWNoZSBzaW5jZSBzb21lIHBhcnRzIGRvIG5vdCByZXNldCB0aGUKQEAgLTI1ODUsNyArMjY3Nyw2IEBACiAJYWgtPnR4X3BlbmRpbmcgPSBmYWxzZTsKIAl0YXNrbGV0X2tpbGwoJmFoLT5yeHRxKTsKIAl0YXNrbGV0X2tpbGwoJmFoLT50eHRxKTsKLQl0YXNrbGV0X2tpbGwoJmFoLT5jYWxpYik7CiAJdGFza2xldF9raWxsKCZhaC0+YmVhY29udHEpOwogCXRhc2tsZXRfa2lsbCgmYWgtPmFuaV90YXNrbGV0KTsKIH0KQEAgLTI2MzcsNyArMjcyOCw4IEBACiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFoLT50eF9jb21wbGV0ZV93b3JrKTsKIAotCWF0aDVrX3Jma2lsbF9od19zdG9wKGFoKTsKKwlpZiAoIWF0aDVrX21vZHBhcmFtX25vX2h3X3Jma2lsbF9zd2l0Y2gpCisJCWF0aDVrX3Jma2lsbF9od19zdG9wKGFoKTsKIH0KIAogLyoKQEAgLTI2ODksOSArMjc4MSwyNCBAQAogCiAJYXRoNWtfYW5pX2luaXQoYWgsIGFuaV9tb2RlKTsKIAotCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKLQlhaC0+YWhfY2FsX25leHRfYW5pID0gamlmZmllczsKLQlhaC0+YWhfY2FsX25leHRfbmYgPSBqaWZmaWVzOworCS8qCisJICogU2V0IGNhbGlicmF0aW9uIGludGVydmFscworCSAqCisJICogTm90ZTogV2UgZG9uJ3QgbmVlZCB0byBydW4gY2FsaWJyYXRpb24gaW1lZGlhdGVseQorCSAqIHNpbmNlIHNvbWUgaW5pdGlhbCBjYWxpYnJhdGlvbiBpcyBkb25lIG9uIHJlc2V0CisJICogZXZlbiBmb3IgZmFzdCBjaGFubmVsIHN3aXRjaGluZy4gQWxzbyBvbiBzY2FubmluZworCSAqIHRoaXMgd2lsbCBnZXQgc2V0IGFnYWluIGFuZCBhZ2FpbiBhbmQgaXQgd29uJ3QgZ2V0CisJICogZXhlY3V0ZWQgdW5sZXNzIHdlIGNvbm5lY3Qgc29tZXdoZXJlIGFuZCBzcGVuZCBzb21lCisJICogdGltZSBvbiB0aGUgY2hhbm5lbCAodGhhdCdzIHdoYXQgY2FsaWJyYXRpb24gbmVlZHMKKwkgKiBhbnl3YXkgdG8gYmUgYWNjdXJhdGUpLgorCSAqLworCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMKTsKKwlhaC0+YWhfY2FsX25leHRfYW5pID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9BTkkpOworCWFoLT5haF9jYWxfbmV4dF9zaG9ydCA9IGppZmZpZXMgKworCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQpOworCiAJZXdtYV9pbml0KCZhaC0+YWhfYmVhY29uX3Jzc2lfYXZnLCAxMDI0LCA4KTsKIAogCS8qIGNsZWFyIHN1cnZleSBkYXRhIGFuZCBjeWNsZSBjb3VudGVycyAqLwpAQCAtMjc0NSwyMCArMjg1Miw2IEBACiAKIAogCS8qCi0JICogQ2hlY2sgaWYgdGhlIE1BQyBoYXMgbXVsdGktcmF0ZSByZXRyeSBzdXBwb3J0LgotCSAqIFdlIGRvIHRoaXMgYnkgdHJ5aW5nIHRvIHNldHVwIGEgZmFrZSBleHRlbmRlZAotCSAqIGRlc2NyaXB0b3IuICBNQUNzIHRoYXQgZG9uJ3QgaGF2ZSBzdXBwb3J0IHdpbGwKLQkgKiByZXR1cm4gZmFsc2Ugdy9vIGRvaW5nIGFueXRoaW5nLiAgTUFDcyB0aGF0IGRvCi0JICogc3VwcG9ydCBpdCB3aWxsIHJldHVybiB0cnVlIHcvbyBkb2luZyBhbnl0aGluZy4KLQkgKi8KLQlyZXQgPSBhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgTlVMTCwgMCwgMCwgMCwgMCwgMCwgMCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnI7Ci0JaWYgKHJldCA+IDApCi0JCV9fc2V0X2JpdChBVEhfU1RBVF9NUlJFVFJZLCBhaC0+c3RhdHVzKTsKLQotCS8qCiAJICogQ29sbGVjdCB0aGUgY2hhbm5lbCBsaXN0LiAgVGhlIDgwMi4xMSBsYXllcgogCSAqIGlzIHJlc3BvbnNpYmxlIGZvciBmaWx0ZXJpbmcgdGhpcyBsaXN0IGJhc2VkCiAJICogb24gc2V0dGluZ3MgbGlrZSB0aGUgcGh5IG1vZGUgYW5kIHJlZ3VsYXRvcnkKQEAgLTI4NDEsMTEgKzI5MzQsMTEgQEAKIAogCXRhc2tsZXRfaW5pdCgmYWgtPnJ4dHEsIGF0aDVrX3Rhc2tsZXRfcngsICh1bnNpZ25lZCBsb25nKWFoKTsKIAl0YXNrbGV0X2luaXQoJmFoLT50eHRxLCBhdGg1a190YXNrbGV0X3R4LCAodW5zaWduZWQgbG9uZylhaCk7Ci0JdGFza2xldF9pbml0KCZhaC0+Y2FsaWIsIGF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlLCAodW5zaWduZWQgbG9uZylhaCk7CiAJdGFza2xldF9pbml0KCZhaC0+YmVhY29udHEsIGF0aDVrX3Rhc2tsZXRfYmVhY29uLCAodW5zaWduZWQgbG9uZylhaCk7CiAJdGFza2xldF9pbml0KCZhaC0+YW5pX3Rhc2tsZXQsIGF0aDVrX3Rhc2tsZXRfYW5pLCAodW5zaWduZWQgbG9uZylhaCk7CiAKIAlJTklUX1dPUksoJmFoLT5yZXNldF93b3JrLCBhdGg1a19yZXNldF93b3JrKTsKKwlJTklUX1dPUksoJmFoLT5jYWxpYl93b3JrLCBhdGg1a19jYWxpYnJhdGVfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmFoLT50eF9jb21wbGV0ZV93b3JrLCBhdGg1a190eF9jb21wbGV0ZV9wb2xsX3dvcmspOwogCiAJcmV0ID0gYXRoNWtfaHdfY29tbW9uKGFoKS0+YnVzX29wcy0+ZWVwcm9tX3JlYWRfbWFjKGFoLCBtYWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9jYXBzLmMKaW5kZXggODEwZmJhOS4uOTk0MTY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jCkBAIC04NSwxMiArODUsMTkgQEAKIAkJCWNhcHMtPmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21pbiA9IDI0MTI7CiAJCQljYXBzLT5jYXBfcmFuZ2UucmFuZ2VfMmdoel9tYXggPSAyNzMyOwogCi0JCQlpZiAoQVI1S19FRVBST01fSERSXzExQihlZV9oZWFkZXIpKQotCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFCLCBjYXBzLT5jYXBfbW9kZSk7CisJCQkvKiBPdmVycmlkZSAyR0h6IG1vZGVzIG9uIFNvQ3MgdGhhdCBuZWVkIGl0CisJCQkgKiBOT1RFOiBjYXBfbmVlZHNfMkdIel9vdnIgZ2V0cyBzZXQgZnJvbQorCQkJICogYXRoX2FoYl9wcm9iZSAqLworCQkJaWYgKCFjYXBzLT5jYXBfbmVlZHNfMkdIel9vdnIpIHsKKwkJCQlpZiAoQVI1S19FRVBST01fSERSXzExQihlZV9oZWFkZXIpKQorCQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExQiwKKwkJCQkJCQljYXBzLT5jYXBfbW9kZSk7CiAKLQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikgJiYKLQkJCSAgICBhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSkKLQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExRywgY2Fwcy0+Y2FwX21vZGUpOworCQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFHKGVlX2hlYWRlcikgJiYKKwkJCQlhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMSkKKwkJCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUcsCisJCQkJCQkJY2Fwcy0+Y2FwX21vZGUpOworCQkJfQogCQl9CiAJfQogCkBAIC0xMDMsMTIgKzExMCwxOCBAQAogCWVsc2UKIAkJY2Fwcy0+Y2FwX3F1ZXVlcy5xX3R4X251bSA9IEFSNUtfTlVNX1RYX1FVRVVFUzsKIAotCS8qIG5ld2VyIGhhcmR3YXJlIGhhcyBQSFkgZXJyb3IgY291bnRlcnMgKi8KKwkvKiBOZXdlciBoYXJkd2FyZSBoYXMgUEhZIGVycm9yIGNvdW50ZXJzICovCiAJaWYgKGFoLT5haF9tYWNfc3JldiA+PSBBUjVLX1NSRVZfQVI1MjEzQSkKIAkJY2Fwcy0+Y2FwX2hhc19waHllcnJfY291bnRlcnMgPSB0cnVlOwogCWVsc2UKIAkJY2Fwcy0+Y2FwX2hhc19waHllcnJfY291bnRlcnMgPSBmYWxzZTsKIAorCS8qIE1BQ3Mgc2luY2UgQVI1MjEyIGhhdmUgTVJSIHN1cHBvcnQgKi8KKwlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCisJCWNhcHMtPmNhcF9oYXNfbXJyX3N1cHBvcnQgPSB0cnVlOworCWVsc2UKKwkJY2Fwcy0+Y2FwX2hhc19tcnJfc3VwcG9ydCA9IGZhbHNlOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKaW5kZXggZmNlOGM5MC4uOGM1Y2U4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKQEAgLTU3LDggKzU3LDkgQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKICAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKaW5kZXggN2YzN2RmMy4uMGEzZjkxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmgKQEAgLTE0MSwxMCArMTQxLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDMsIDQpIHZvaWQKIEFUSDVLX0RCRyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgbSwgY29uc3QgY2hhciAqZm10LCAuLi4pIHt9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMywgNCkgdm9pZAogQVRINUtfREJHX1VOTElNSVQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IG0sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoge30KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKaW5kZXggN2U4OGRkYS4uZjhiZmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCkBAIC0yNiwyMCArMjYsNjEgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKKy8qKgorICogRE9DOiBIYXJkd2FyZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2UgaGFuZGxlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBsb3ctbGV2ZWwgaHcgZGVzY3JpcHRvcnMKKyAqIHRoYXQgaHcgcmVhZHMgYW5kIHdyaXRlcyB2aWEgRE1BIGZvciBlYWNoIFRYIGFuZCBSWCBhdHRlbXB0ICh0aGF0IG1lYW5zCisgKiB3ZSBjYW4gYWxzbyBoYXZlIGRlc2NyaXB0b3JzIGZvciBmYWlsZWQgVFgvUlggdHJpZXMpLiBXZSBoYXZlIHR3byBraW5kIG9mCisgKiBkZXNjcmlwdG9ycyBmb3IgUlggYW5kIFRYLCBjb250cm9sIGRlc2NyaXB0b3JzIHRlbGwgdGhlIGh3IGhvdyB0byBzZW5kIG9yCisgKiByZWNlaXZlIGEgcGFja2V0IHdoZXJlIHRvIHJlYWQvd3JpdGUgaXQgZnJvbS90byBldGMgYW5kIHN0YXR1cyBkZXNjcmlwdG9ycworICogdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgcGFja2V0IHdhcyBzZW50IG9yIHJlY2VpdmVkIChlcnJvcnMKKyAqIGluY2x1ZGVkKS4KKyAqCisgKiBEZXNjcmlwdG9yIGZvcm1hdCBpcyBub3QgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBNQUMgY2hpcCB2ZXJzaW9uIHNvIHdlCisgKiBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uICZzdHJ1Y3QgYXRoNWtfaHcgd2UgaW5pdGlhbGl6ZSBhdCBydW50aW1lIGJhc2VkIG9uCisgKiB0aGUgY2hpcCB1c2VkLgorICovCisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKlwKICogVFggQ29udHJvbCBkZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgMi13b3JkIHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDItd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSAyLVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTAgYW5kIEFSNTIxMSBNQUNzIGNoaXBzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFsc2UgaW5wdXQKICAqLwogc3RhdGljIGludAotYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKLQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sIGludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKLQl1bnNpZ25lZCBpbnQgdHhfcG93ZXIsIHVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKLQl1bnNpZ25lZCBpbnQga2V5X2luZGV4LCB1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQorYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sCisJCQlpbnQgcGFkc2l6ZSwKKwkJCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKKwkJCXVuc2lnbmVkIGludCB0eF9wb3dlciwKKwkJCXVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKKwkJCXVuc2lnbmVkIGludCBrZXlfaW5kZXgsCisJCQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLAorCQkJdW5zaWduZWQgaW50IGZsYWdzLAorCQkJdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQogewogCXUzMiBmcmFtZV90eXBlOwogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKQEAgLTE3MiwxNyArMjEzLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDQtd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSA0LVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTIgYW5kIGxhdGVyIE1BQ3MgY2hpcHMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBmYWxzZSBpbnB1dAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwKLQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IHBrdF9sZW4sIHVuc2lnbmVkIGludCBoZHJfbGVuLAotCWludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHR4X3Bvd2VyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTAsCi0JdW5zaWduZWQgaW50IHR4X3RyaWVzMCwgdW5zaWduZWQgaW50IGtleV9pbmRleCwKLQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLAotCXVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCitzdGF0aWMgaW50CithdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKKwkJCWludCBwYWRzaXplLAorCQkJZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAorCQkJdW5zaWduZWQgaW50IHR4X3Bvd2VyLAorCQkJdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAorCQkJdW5zaWduZWQgaW50IGtleV9pbmRleCwKKwkJCXVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CkBAIC0yOTIsMTMgKzM1NiwyOSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBhIDQtd29yZCBtdWx0aSByYXRlIHJldHJ5IHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKCkgLSBJbml0aWFsaXplIGFuIE1SUiB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAdHhfcmF0ZTE6IEhXIGlkeCBmb3IgcmF0ZSB1c2VkIG9uIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3RyaWVzMTogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgZm9yIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3JhdGUyOiBIVyBpZHggZm9yIHJhdGUgdXNlZCBvbiB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF90cmllczI6IE1heCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGZvciB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF9yYXRlMzogSFcgaWR4IGZvciByYXRlIHVzZWQgb24gdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKiBAdHhfdHJpZXMzOiBNYXggbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBmb3IgdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKgorICogTXVsdGkgcmF0ZSByZXRyeSAoTVJSKSB0eCBjb250cm9sIGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUgb25seSBvbiBBUjUyMTIKKyAqIE1BQ3MsIHRoZXkgYXJlIHBhcnQgb2YgdGhlIG5vcm1hbCA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIChzZWUgYWJvdmUpCisgKiBidXQgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgYWJzdHJhY3Rpb24uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBpbnZhbGlkIGlucHV0CiAgKi8KIGludAotYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLAotCXVfaW50IHR4X3RyaWVzMiwgdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCithdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1X2ludCB0eF9yYXRlMSwgdV9pbnQgdHhfdHJpZXMxLAorCQkJdV9pbnQgdHhfcmF0ZTIsIHVfaW50IHR4X3RyaWVzMiwKKwkJCXVfaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCkBAIC0zNTAsMTEgKzQzMCwxNiBAQAogKiBUWCBTdGF0dXMgZGVzY3JpcHRvcnMgKgogXCoqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogUHJvY2VzcyB0aGUgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzKCkgLSBQcm9jZXNzIGEgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC8xCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC0zOTksMTEgKzQ4NCwxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyBhIHR4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfcHJvY180d29yZF90eF9zdGF0dXMoKSAtIFByb2Nlc3MgYSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od180d190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC00NjAsMTEgKzU1MCwxNyBAQAogKiBSWCBEZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX3J4X2Rlc2MoKSAtIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHNpemU6IFJYIGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMKKyAqIEBmbGFnczogT25lIG9mIEFSNUtfUlhERVNDXyogZmxhZ3MKICAqLwotaW50IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JCQkgICB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50CithdGg1a19od19zZXR1cF9yeF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bCAqcnhfY3RsOwogCkBAIC00OTEsMTEgKzU4NywyMiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTAvMQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGRlc2M6IFRoZSAmc3RydWN0IGF0aDVrX2Rlc2MKKyAqIEByczogVGhlICZzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBwcm9jZXNzIGFuIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisgKiBvbiBBUjUyMTAvNTIxMSBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTBfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAKQEAgLTU3NCwxMiArNjgxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQcm9jZXNzIHRoZSByeCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcnM6IFRoZSAmc3RydWN0IGF0aDVrX3J4X3N0YXR1cworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gcHJvY2VzcyBhbiBSWCBzdGF0dXMgZGVzY3JpcHRvcgorICogb24gQVI1MjEyIGFuZCBsYXRlciBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAotCQkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJdTMyIHJ4c3RhdDAsIHJ4c3RhdDE7CkBAIC02NDYsMTAgKzc2MywxNiBAQAogKiBBdHRhY2ggKgogXCoqKioqKioqLwogCi0vKgotICogSW5pdCBmdW5jdGlvbiBwb2ludGVycyBpbnNpZGUgYXRoNWtfaHcgc3RydWN0CisvKioKKyAqIGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoKSAtIEluaXQgZnVuY3Rpb24gcG9pbnRlcnMgaW5zaWRlIGFoCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogTWFwcyB0aGUgaW50ZXJuYWwgZGVzY3JpcHRvciBmdW5jdGlvbnMgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uIGFoLCB1c2VkCisgKiBmcm9tIGFib3ZlLiBUaGlzIGlzIHVzZWQgYXMgYW4gYWJzdHJhY3Rpb24gbGF5ZXIgdG8gaGFuZGxlIHRoZSB2YXJpb3VzIGNoaXBzCisgKiB0aGUgc2FtZSB3YXkuCiAgKi8KLWludCBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKIAkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKaW5kZXggY2ZkNTI5YjUuLjhkNmMwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaApAQCAtMjAsMjUgKzIwLDMwIEBACiAgKiBSWC9UWCBkZXNjcmlwdG9yIHN0cnVjdHVyZXMKICAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsIC0gQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorICogQHJ4X2NvbnRyb2xfMDogUlggY29udHJvbCB3b3JkIDAKKyAqIEByeF9jb250cm9sXzE6IFJYIGNvbnRyb2wgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9jdGwgewotCXUzMglyeF9jb250cm9sXzA7IC8qIFJYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXJ4X2NvbnRyb2xfMTsgLyogUlggY29udHJvbCB3b3JkIDEgKi8KKwl1MzIJcnhfY29udHJvbF8wOworCXUzMglyeF9jb250cm9sXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogUlggY29udHJvbCB3b3JkIDEgZmllbGRzL2ZsYWdzICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYgLyogZGF0YSBidWZmZXIgbGVuZ3RoICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0lOVFJFUQkJMHgwMDAwMjAwMCAvKiBSWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgLSBDb21tb24gaGFyZHdhcmUgUlggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEByeF9zdGF0dXNfMDogUlggc3RhdHVzIHdvcmQgMAorICogQHJ4X3N0YXR1c18xOiBSWCBzdGF0dXMgd29yZCAxCisgKgogICogNTIxMCwgNTIxMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmllbGRzIGFuZCBmbGFncyBkZWZpbmVkIGJlbG93CiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgewotCXUzMglyeF9zdGF0dXNfMDsgLyogUlggc3RhdHVzIHdvcmQgMCAqLwotCXUzMglyeF9zdGF0dXNfMTsgLyogUlggc3RhdHVzIHdvcmQgMSAqLworCXUzMglyeF9zdGF0dXNfMDsKKwl1MzIJcnhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogNTIxMC81MjExICovCkBAIC05OCwxNyArMTAzLDM2IEBACiAKIC8qKgogICogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSAtIFBIWSBFcnJvciBjb2RlcworICogQEFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOOiBUcmFuc21pdCB1bmRlcnJ1biwgWzUyMTBdIE5vIGVycm9yCisgKiBAQVI1S19SWF9QSFlfRVJST1JfVElNSU5HOiBUaW1pbmcgZXJyb3IKKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFk6IElsbGVnYWwgcGFyaXR5CisgKiBAQVI1S19SWF9QSFlfRVJST1JfUkFURTogSWxsZWdhbCByYXRlCisgKiBAQVI1S19SWF9QSFlfRVJST1JfTEVOR1RIOiBJbGxlZ2FsIGxlbmd0aAorICogQEFSNUtfUlhfUEhZX0VSUk9SX1JBREFSOiBSYWRhciBkZXRlY3QsIFs1MjEwXSA2NCBRQU0gcmF0ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1NFUlZJQ0U6IElsbGVnYWwgc2VydmljZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1RPUjogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HOiBPRkRNIFRpbWluZyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9TSUdOQUxfUEFSSVRZOiBPRkRNIFNpZ25hbCBwYXJpdHkgZXJyb3IgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMOiBPRkRNIElsbGVnYWwgcmF0ZSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9MRU5HVEhfSUxMRUdBTDogT0ZETSBJbGxlZ2FsIGxlbmd0aCBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9QT1dFUl9EUk9QOiBPRkRNIFBvd2VyIGRyb3AgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0VSVklDRTogT0ZETSBTZXJ2aWNlICg/KSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9SRVNUQVJUOiBPRkRNIFJlc3RhcnQgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfVElNSU5HOiBDQ0sgVGltaW5nIGVycm9yIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfSEVBREVSX0NSQzogSGVhZGVyIENSQyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfQ0NLX1JBVEVfSUxMRUdBTDogSWxsZWdhbCByYXRlIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfU0VSVklDRTogQ0NLIFNlcnZpY2UgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfUkVTVEFSVDogQ0NLIFJlc3RhcnQgKD8pIFs1MjEyK10KICAqLwogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSB7Ci0JQVI1S19SWF9QSFlfRVJST1JfVU5ERVJSVU4JCT0gMCwJLyogVHJhbnNtaXQgdW5kZXJydW4sIFs1MjEwXSBObyBlcnJvciAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RJTUlORwkJPSAxLAkvKiBUaW1pbmcgZXJyb3IgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFkJCT0gMiwJLyogSWxsZWdhbCBwYXJpdHkgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQVRFCQkJPSAzLAkvKiBJbGxlZ2FsIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwJLyogSWxsZWdhbCBsZW5ndGggKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwJLyogUmFkYXIgZGV0ZWN0LCBbNTIxMF0gNjQgUUFNIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCS8qIElsbGVnYWwgc2VydmljZSAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RPUgkJCT0gNywJLyogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZSAqLwotCS8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgNTIxMiAqLworCUFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOCQk9IDAsCisJQVI1S19SWF9QSFlfRVJST1JfVElNSU5HCQk9IDEsCisJQVI1S19SWF9QSFlfRVJST1JfUEFSSVRZCQk9IDIsCisJQVI1S19SWF9QSFlfRVJST1JfUkFURQkJCT0gMywKKwlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwKKwlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwKKwlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCisJQVI1S19SWF9QSFlfRVJST1JfVE9SCQkJPSA3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HCQk9IDE3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0lHTkFMX1BBUklUWQk9IDE4LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMCT0gMTksCkBAIC0xMjMsMTIgKzE0NywxNCBAQAogCUFSNUtfUlhfUEhZX0VSUk9SX0NDS19SRVNUQVJUCQk9IDMxLAogfTsKIAotLyoKLSAqIDUyMTAvNTIxMSBoYXJkd2FyZSAyLXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od18yd190eF9jdGwgIC0gNTIxMC81MjExIGhhcmR3YXJlIDItd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQogICovCiBzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsIHsKLQl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLwotCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKIC8qIFRYIGNvbnRyb2wgd29yZCAwIGZpZWxkcy9mbGFncyAqLwpAQCAtMTc3LDE0ICsyMDMsMTggQEAKICNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlMJNAogI2RlZmluZSBBUjVLX0FSNTIxMV9UWF9ERVNDX0ZSQU1FX1RZUEVfUFJFU1AJNAogCi0vKgotICogNTIxMiBoYXJkd2FyZSA0LXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgLSA1MjEyIGhhcmR3YXJlIDQtd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQorICogQHR4X2NvbnRyb2xfMjogVFggY29udHJvbCB3b3JkIDIKKyAqIEB0eF9jb250cm9sXzM6IFRYIGNvbnRyb2wgd29yZCAzCiAgKi8KIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgewotCXUzMgl0eF9jb250cm9sXzA7IC8qIFRYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXR4X2NvbnRyb2xfMTsgLyogVFggY29udHJvbCB3b3JkIDEgKi8KLQl1MzIJdHhfY29udHJvbF8yOyAvKiBUWCBjb250cm9sIHdvcmQgMiAqLwotCXUzMgl0eF9jb250cm9sXzM7IC8qIFRYIGNvbnRyb2wgd29yZCAzICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOworCXUzMgl0eF9jb250cm9sXzI7CisJdTMyCXR4X2NvbnRyb2xfMzsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCiAvKiBUWCBjb250cm9sIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTIzOCwxMiArMjY4LDE0IEBACiAjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwIC8qIFJUUyBvciBDVFMgcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEVfUwkyMAogCi0vKgotICogQ29tbW9uIFRYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgLSBDb21tb24gVFggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0eF9zdGF0dXNfMDogVFggc3RhdHVzIHdvcmQgMAorICogQHR4X3N0YXR1c18xOiBUWCBzdGF0dXMgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgewotCXUzMgl0eF9zdGF0dXNfMDsgLyogVFggc3RhdHVzIHdvcmQgMCAqLwotCXUzMgl0eF9zdGF0dXNfMTsgLyogVFggc3RhdHVzIHdvcmQgMSAqLworCXUzMgl0eF9zdGF0dXNfMDsKKwl1MzIJdHhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogVFggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTI3NiwzNyArMzA4LDQ3IEBACiAjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0NPTVBfU1VDQ0VTU181MjEyCTB4MDA4MDAwMDAgLyogWzUyMTJdIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkFfNTIxMgkweDAxMDAwMDAwIC8qIFs1MjEyXSB0cmFuc21pdCBhbnRlbm5hICovCiAKLS8qCi0gKiA1MjEwLzUyMTEgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIC0gNTIxMC81MjExIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqIEB0eF9jdGw6IFRoZSAmc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bAorICogQHR4X3N0YXQ6IFRoZSAmc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwogICovCiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsCXR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzCXR4X3N0YXQ7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAotLyoKLSAqIDUyMTIgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjIC0gNTIxMiBoYXJkd2FyZSBUWCBkZXNjcmlwdG9yCisgKiBAdHhfY3RsOiBUaGUgJnN0cnVjdCBhdGg1a19od180d190eF9jdGwKKyAqIEB0eF9zdGF0OiBUaGUgJnN0cnVjdCBhdGg1a19od190eF9zdGF0dXMKICAqLwogc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bAl0eF9jdGw7CiAJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKLS8qCi0gKiBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfYWxsX3J4X2Rlc2MgLSBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorICogQHJ4X2N0bDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCisgKiBAcnhfc3RhdDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzCiAgKi8KIHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bAkJcnhfY3RsOwogCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMJcnhfc3RhdDsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCi0vKgotICogQXRoZXJvcyBoYXJkd2FyZSBETUEgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZGVzYyAtIEF0aGVyb3MgaGFyZHdhcmUgRE1BIGRlc2NyaXB0b3IKKyAqIEBkc19saW5rOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IKKyAqIEBkc19kYXRhOiBQaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpCisgKiBAdWQ6IFVuaW9uIGNvbnRhaW5pbmcgaHdfNXh4eF90eF9kZXNjIHN0cnVjdHMgYW5kIGh3X2FsbF9yeF9kZXNjCisgKgogICogVGhpcyBpcyByZWFkIGFuZCB3cml0dGVuIHRvIGJ5IHRoZSBoYXJkd2FyZQogICovCiBzdHJ1Y3QgYXRoNWtfZGVzYyB7Ci0JdTMyCWRzX2xpbms7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciAqLwotCXUzMglkc19kYXRhOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpICovCisJdTMyCWRzX2xpbms7CisJdTMyCWRzX2RhdGE7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBhdGg1a19od181MjEwX3R4X2Rlc2MJZHNfdHg1MjEwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jCmluZGV4IDI0ODFmOWMuLjVjYzlhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZG1hLmMKQEAgLTIwLDE2ICsyMCwxMyBAQAogKiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIGRtYS5jIC0gRE1BIGFuZCBpbnRlcnJ1cHQgbWFza2luZyBmdW5jdGlvbnMKKy8qKgorICogRE9DOiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucwogICoKICAqIEhlcmUgd2Ugc2V0dXAgZGVzY3JpcHRvciBwb2ludGVycyAocnhkcC90eGRwKSBzdGFydC9zdG9wIGRtYSBlbmdpbmUgYW5kCiAgKiBoYW5kbGUgcXVldWUgc2V0dXAgZm9yIDUyMTAgY2hpcHNldCAocmVzdCBhcmUgaGFuZGxlZCBvbiBxY3UuYykuCiAgKiBBbHNvIHdlIHNldHVwIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIChJTVIpIGFuZCByZWFkIHRoZSB2YXJpb3VzIGludGVycnVwdAogICogc3RhdHVzIHJlZ2lzdGVycyAoSVNSKS4KLSAqCi0gKiBUT0RPOiBIYW5kbGUgU0lTUiBvbiA1MjExKyBhbmQgaW50cm9kdWNlIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBxdWV1ZQotICogbnVtYmVyIHRoYXQgcmVzdWx0ZWQgdGhlIGludGVycnVwdC4KICAqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKQEAgLTQyLDIyICszOSwyMiBAQAogXCoqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zdGFydF9yeF9kbWEgLSBTdGFydCBETUEgcmVjZWl2ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYSgpIC0gU3RhcnQgRE1BIHJlY2VpdmUKICAqIEBhaDoJVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19DUl9SWEUsIEFSNUtfQ1IpOwogCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19zdG9wX3J4X2RtYSAtIFN0b3AgRE1BIHJlY2VpdmUKLSAqCisgKiBhdGg1a19od19zdG9wX3J4X2RtYSgpIC0gU3RvcCBETUEgcmVjZWl2ZQogICogQGFoOglUaGUgJnN0cnVjdCBhdGg1a19odwogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgaW50CithdGg1a19od19zdG9wX3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC03OSwyNCArNzYsMjQgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfcnhkcCAtIEdldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwotICoKKyAqIGF0aDVrX2h3X2dldF9yeGRwKCkgLSBHZXQgUlggRGVzY3JpcHRvcidzIGFkZHJlc3MKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdTMyIGF0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCit1MzIKK2F0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JYRFApOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9yeGRwIC0gU2V0IFJYIERlc2NyaXB0b3IncyBhZGRyZXNzCi0gKgorICogYXRoNWtfaHdfc2V0X3J4ZHAoKSAtIFNldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHBoeXNfYWRkcjogUlggZGVzY3JpcHRvciBhZGRyZXNzCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHJ4IGlzIGFjdGl2ZQogICovCi1pbnQgYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKK2ludAorYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKIHsKIAlpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpICYgQVI1S19DUl9SWEUpIHsKIAkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19ETUEsCkBAIC0xMTQsOCArMTExLDcgQEAKIFwqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSAtIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSgpIC0gU3RhcnQgRE1BIHRyYW5zbWl0IGZvciBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCkBAIC0xMjgsNyArMTI0LDggQEAKICAqIE5PVEU6IE11c3QgYmUgY2FsbGVkIGFmdGVyIHNldHRpbmcgdXAgdHggY29udHJvbCBkZXNjcmlwdG9yIGZvciB0aGF0CiAgKiBxdWV1ZSAoc2VlIGJlbG93KS4KICAqLwotaW50IGF0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJdTMyIHR4X3F1ZXVlOwogCkBAIC0xNzcsMTcgKzE3NCwxNiBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hIC0gU3RvcCBETUEgdHJhbnNtaXQgb24gYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hKCkgLSBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCiAgKiBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIGh3IHF1ZXVlIGFuZCBkcmFpbiBxdWV1ZSBzbyB3ZSBkb24ndAogICogaGF2ZSBhbnkgcGVuZGluZyBmcmFtZXMuIFJldHVybnMgLUVCVVNZIGlmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBmcmFtZXMsCiAgKiAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQgb2YgcmFuZ2Ugb3IgaW5hY3RpdmUuCi0gKgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaSA9IDQwOwogCXUzMiB0eF9xdWV1ZSwgcGVuZGluZzsKQEAgLTMyMCwxNCArMzE2LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUgLSBTdG9wIGJlYWNvbiBxdWV1ZQotICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHF1ZXVlIFRoZSBxdWV1ZSBudW1iZXIKKyAqIGF0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKCkgLSBTdG9wIGJlYWNvbiBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBUaGUgcXVldWUgbnVtYmVyCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHF1ZXVlIGRpZG4ndCBzdG9wCiAgKi8KLWludCBhdGg1a19od19zdG9wX2JlYWNvbl9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAlpbnQgcmV0OwogCXJldCA9IGF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBxdWV1ZSk7CkBAIC0zNDAsOCArMzM2LDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfdHhkcCAtIEdldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X2dldF90eGRwKCkgLSBHZXQgVFggRGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgogICoKQEAgLTM1Miw3ICszNDcsOCBAQAogICoKICAqIFhYWDogSXMgVFhEUCByZWFkIGFuZCBjbGVhciA/CiAgKi8KLXUzMiBhdGg1a19od19nZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCit1MzIKK2F0aDVrX2h3X2dldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1MTYgdHhfcmVnOwogCkBAIC0zODIsMTAgKzM3OCwxMCBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF90eGRwIC0gU2V0IFRYIERlc2NyaXB0b3IncyBhZGRyZXNzIGZvciBhIHNwZWNpZmljIHF1ZXVlCi0gKgorICogYXRoNWtfaHdfc2V0X3R4ZHAoKSAtIFNldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHF1ZXVlOiBUaGUgaHcgcXVldWUgbnVtYmVyCisgKiBAcGh5c19hZGRyOiBUaGUgcGh5c2ljYWwgYWRkcmVzcwogICoKICAqIFNldCBUWCBkZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4gRm9yIDUyMTAgd2UgaWdub3JlCiAgKiB0aGUgcXVldWUgbnVtYmVyIGFuZCB3ZSB1c2UgdHggcXVldWUgdHlwZSBzaW5jZSB3ZSBvbmx5IGhhdmUgMiBxdWV1ZXMKQEAgLTM5NCw3ICszOTAsOCBAQAogICogUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIHR5cGUgaXMgaW52YWxpZCBmb3IgNTIxMCBhbmQgLUVJTyBpZiBxdWV1ZSBpcyBzdGlsbAogICogYWN0aXZlLgogICovCi1pbnQgYXRoNWtfaHdfc2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlLCB1MzIgcGh5c19hZGRyKQoraW50CithdGg1a19od19zZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUsIHUzMiBwaHlzX2FkZHIpCiB7CiAJdTE2IHR4X3JlZzsKIApAQCAtNDM1LDggKzQzMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCAtIFVwZGF0ZSB0eCB0cmlnZ2VyIGxldmVsCi0gKgorICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCgpIC0gVXBkYXRlIHR4IHRyaWdnZXIgbGV2ZWwKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBpbmNyZWFzZTogRmxhZyB0byBmb3JjZSBpbmNyZWFzZSBvZiB0cmlnZ2VyIGxldmVsCiAgKgpAQCAtNDQ0LDE1ICs0NDAsMTUgQEAKICAqIGJ1ZmZlciAoYWthIEZJRk8gdGhyZXNob2xkKSB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiBQQ1UgZmx1c2hlcwogICogdGhlIGJ1ZmZlciBhbmQgdHJhbnNtaXRzIGl0cyBkYXRhLiBMb3dlcmluZyB0aGlzIHJlc3VsdHMgc2VuZGluZyBzbWFsbAogICogZnJhbWVzIG1vcmUgcXVpY2tseSBidXQgY2FuIGxlYWQgdG8gdHggdW5kZXJydW5zLCByYWlzaW5nIGl0IGEgbG90IGNhbgotICogcmVzdWx0IG90aGVyIHByb2JsZW1zIChpIHRoaW5rIGJtaXNzIGlzIHJlbGF0ZWQpLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aAotICogdGhlIGxvd2VzdCBwb3NzaWJsZSAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZwotICogdGhlIGluY3JlYXNlIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgorICogcmVzdWx0IG90aGVyIHByb2JsZW1zLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aCB0aGUgbG93ZXN0IHBvc3NpYmxlCisgKiAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZyB0aGUgaW5jcmVhc2UKKyAqIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgogICoKICAqIFhYWDogTGluayB0aGlzIHdpdGggdHggRE1BIHNpemUgPwotICogWFhYOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KLSAqIFRPRE86IE5lZWRzIHRlc3RpbmcsIGkgdGhpbmsgaXQncyByZWxhdGVkIHRvIGJtaXNzLi4uCisgKiBYWFgyOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KICAqLwotaW50IGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBpbmNyZWFzZSkKK2ludAorYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGluY3JlYXNlKQogewogCXUzMiB0cmlnZ2VyX2xldmVsLCBpbXI7CiAJaW50IHJldCA9IC1FSU87CkBAIC00OTgsMjEgKzQ5NCwyMCBAQAogXCoqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nIC0gQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMKLSAqCisgKiBhdGg1a19od19pc19pbnRyX3BlbmRpbmcoKSAtIENoZWNrIGlmIHdlIGhhdmUgcGVuZGluZyBpbnRlcnJ1cHRzCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMgdG8gcHJvY2Vzcy4gUmV0dXJucyAxIGlmIHdlCiAgKiBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgMCBpZiB3ZSBoYXZlbid0LgogICovCi1ib29sIGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorYm9vbAorYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lOVFBFTkQpID09IDEgPyAxIDogMDsKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfaXNyIC0gR2V0IGludGVycnVwdCBzdGF0dXMKLSAqCisgKiBhdGg1a19od19nZXRfaXNyKCkgLSBHZXQgaW50ZXJydXB0IHN0YXR1cwogICogQGFoOiBUaGUgQHN0cnVjdCBhdGg1a19odwogICogQGludGVycnVwdF9tYXNrOiBEcml2ZXIncyBpbnRlcnJ1cHQgbWFzayB1c2VkIHRvIGZpbHRlciBvdXQKICAqIGludGVycnVwdHMgaW4gc3cuCkBAIC01MjMsNjIgKzUxOCwxNjIgQEAKICAqIGJlaW5nIG1hcHBlZCBvbiBzb21lIHN0YW5kYXJkIG5vbiBody1zcGVjaWZpYyBwb3NpdGlvbnMKICAqIChjaGVjayBvdXQgJmF0aDVrX2ludCkuCiAgKgotICogTk9URTogV2UgdXNlIHJlYWQtYW5kLWNsZWFyIHJlZ2lzdGVyLCBzbyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBJU1IKLSAqIGlzIHplcm9lZC4KKyAqIE5PVEU6IFdlIGRvIHdyaXRlLXRvLWNsZWFyLCBzbyB0aGUgYWN0aXZlIFBJU1IvU0lTUiBiaXRzIGF0IHRoZSB0aW1lIHRoaXMKKyAqIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFyZSBjbGVhcmVkIG9uIHJldHVybi4KICAqLwotaW50IGF0aDVrX2h3X2dldF9pc3Ioc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgKmludGVycnVwdF9tYXNrKQoraW50CithdGg1a19od19nZXRfaXNyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50ICppbnRlcnJ1cHRfbWFzaykKIHsKLQl1MzIgZGF0YTsKKwl1MzIgZGF0YSA9IDA7CiAKIAkvKgotCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyCi0JICogb24gNTIxMAorCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIFByaW1hcnkgSW50ZXJydXB0CisJICogUmVnaXN0ZXIuCisJICoKKwkgKiBOb3RlOiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwCiAJICovCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQl1MzIgaXNyID0gMDsKKwkJaXNyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSVNSKTsKKwkJaWYgKHVubGlrZWx5KGlzciA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7CisJCQkqaW50ZXJydXB0X21hc2sgPSBpc3I7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCX0gZWxzZSB7CisKIAkJLyoKLQkJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gSW50ZXJydXB0Ci0JCSAqIFN0YXR1cyBSZWdpc3RlciBzaGFkb3cgY29weSAoUmVhZCBBbmQgQ2xlYXIpCi0JCSAqCi0JCSAqIE5vdGU6IFBJU1IvU0lTUiBOb3QgYXZhaWxhYmxlIG9uIDUyMTAKKwkJICogRmlsdGVyIG91dCB0aGUgbm9uLWNvbW1vbiBiaXRzIGZyb20gdGhlIGludGVycnVwdAorCQkgKiBzdGF0dXMuCiAJCSAqLwotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1BJU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQkqaW50ZXJydXB0X21hc2sgPSAoaXNyICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisKKwkJLyogSGFubGRlIElOVF9GQVRBTCAqLworCQlpZiAodW5saWtlbHkoaXNyICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKKwkJCQkJCXwgQVI1S19JU1JfRFBFUlIpKSkKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9GQVRBTDsKKworCQkvKgorCQkgKiBYWFg6IEJNSVNTIGludGVycnVwdHMgbWF5IG9jY3VyIGFmdGVyIGFzc29jaWF0aW9uLgorCQkgKiBJIGZvdW5kIHRoaXMgb24gNTIxMCBjb2RlIGJ1dCBpdCBuZWVkcyB0ZXN0aW5nLiBJZiB0aGlzIGlzCisJCSAqIHRydWUgd2Ugc2hvdWxkIGRpc2FibGUgdGhlbSBiZWZvcmUgYXNzb2MgYW5kIHJlLWVuYWJsZSB0aGVtCisJCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBhc3NvYyArIHNvbWUgamlmZmllcy4KKwkJCWludGVycnVwdF9tYXNrICY9IH5BUjVLX0lOVF9CTUlTUzsKKwkJICovCisKKwkJZGF0YSA9IGlzcjsKKwl9IGVsc2UgeworCQl1MzIgcGlzciA9IDA7CisJCXUzMiBwaXNyX2NsZWFyID0gMDsKKwkJdTMyIHNpc3IwID0gMDsKKwkJdTMyIHNpc3IxID0gMDsKKwkJdTMyIHNpc3IyID0gMDsKKwkJdTMyIHNpc3IzID0gMDsKKwkJdTMyIHNpc3I0ID0gMDsKKworCQkvKiBSZWFkIFBJU1IgYW5kIFNJU1JzLi4uICovCisJCXBpc3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKKwkJaWYgKHVubGlrZWx5KHBpc3IgPT0gQVI1S19JTlRfTk9DQVJEKSkgeworCQkJKmludGVycnVwdF9tYXNrID0gcGlzcjsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JfQogCi0JLyoKLQkgKiBHZXQgYWJzdHJhY3QgaW50ZXJydXB0IG1hc2sgKGRyaXZlci1jb21wYXRpYmxlKQotCSAqLwotCSppbnRlcnJ1cHRfbWFzayA9IChkYXRhICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisJCXNpc3IwID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjApOworCQlzaXNyMSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1IxKTsKKwkJc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSVNSMik7CisJCXNpc3IzID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjMpOworCQlzaXNyNCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1I0KTsKIAotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQl1MzIgc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjIpOworCQkvKgorCQkgKiBQSVNSIGhvbGRzIHRoZSBsb2dpY2FsIE9SIG9mIGludGVycnVwdCBiaXRzCisJCSAqIGZyb20gU0lTUiByZWdpc3RlcnM6CisJCSAqCisJCSAqIFRYT0sgYW5kIFRYREVTQyAgLT4gTG9naWNhbCBPUiBvZiBUWE9LIGFuZCBUWERFU0MKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMAorCQkgKgorCQkgKiBUWEVSUiBhbmQgVFhFT0wgLT4gTG9naWNhbCBPUiBvZiBUWEVSUiBhbmQgVFhFT0wKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMQorCQkgKgorCQkgKiBUWFVSTiAtPiBMb2dpY2FsIE9SIG9mIFRYVVJOIHBlci1xdWV1ZSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEhJVUVSUiAtPiBMb2dpY2FsIE9SIG9mIE1DQUJULCBTU0VSUiBhbmQgRFBFUiBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEJDTk1JU0MgLT4gTG9naWNhbCBPUiBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQworCQkgKgkJQkNOX1RJTUVPVVQsIENBQl9USU1FT1VUIGFuZCBEVElNCisJCSAqCQkoYW5kIFRTRk9PUiA/KSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIFFDQlJPUk4gYW5kIFFDQlJVUk4gLT4gTG9naWNhbCBPUiBvZiBRQ0JST1JOIGFuZAorCQkgKgkJCVFDQlJVUk4gcGVyLXF1ZXVlIGJpdHMgb24gU0lTUjMKKwkJICogUVRSSUcgLT4gTG9naWNhbCBPUiBvZiBRVFJJRyBwZXItcXVldWUgYml0cyBvbiBTSVNSNAorCQkgKgorCQkgKiBJZiB3ZSBjbGVhbiB0aGVzZSBiaXRzIG9uIFBJU1Igd2UgJ2xsIGFsc28gY2xlYXIgYWxsCisJCSAqIHJlbGF0ZWQgYml0cyBmcm9tIFNJU1JzLCBlLmcuIGlmIHdlIHdyaXRlIHRoZSBUWE9LIGJpdCBvbgorCQkgKiBQSVNSIHdlICdsbCBjbGVhbiBhbGwgVFhPSyBiaXRzIGZyb20gU0lTUjAgc28gaWYgYSBuZXcgVFhPSworCQkgKiBpbnRlcnJ1cHQgZ290IGZpcmVkIGZvciBhbm90aGVyIHF1ZXVlIHdoaWxlIHdlIHdlcmUgcmVhZGluZworCQkgKiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhbmQgd2Ugd3JpdGUgYmFjayB0aGUgVFhPSyBiaXQgb24KKwkJICogUElTUiB3ZSAnbGwgbG9zZSBpdC4gU28gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgYmFjaworCQkgKiBvbiBQSVNSIGFueSBiaXRzIHRoYXQgY29tZSBmcm9tIFNJU1JzLiBDbGVhcmluZyB0aGVtIGZyb20KKwkJICogU0lTUnMgd2lsbCBhbHNvIGNsZWFyIFBJU1Igc28gbm8gbmVlZCB0byB3b3JyeSBoZXJlLgorCQkgKi8KIAotCQkvKkhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpKi8KLQkJaWYgKHVubGlrZWx5KGRhdGEgJiAoQVI1S19JU1JfSElVRVJSKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCXBpc3JfY2xlYXIgPSBwaXNyICYgfkFSNUtfSVNSX0JJVFNfRlJPTV9TSVNSUzsKIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAodW5saWtlbHkoZGF0YSAmIChBUjVLX0lTUl9CTlIpKSkKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CisJCS8qCisJCSAqIFdyaXRlIHRvIGNsZWFyIHRoZW0uLi4KKwkJICogTm90ZTogVGhpcyBtZWFucyB0aGF0IGVhY2ggYml0IHdlIHdyaXRlIGJhY2sKKwkJICogdG8gdGhlIHJlZ2lzdGVycyB3aWxsIGdldCBjbGVhcmVkLCBsZWF2aW5nIHRoZQorCQkgKiByZXN0IHVuYWZmZWN0ZWQuIFNvIHRoaXMgd29uJ3QgYWZmZWN0IG5ldyBpbnRlcnJ1cHRzCisJCSAqIHdlIGRpZG4ndCBjYXRjaCB3aGlsZSByZWFkaW5nL3Byb2Nlc3NpbmcsIHdlICdsbCBnZXQKKwkJICogdGhlbSBuZXh0IHRpbWUgZ2V0X2lzciBnZXRzIGNhbGxlZC4KKwkJICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjAsIEFSNUtfU0lTUjApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3IxLCBBUjVLX1NJU1IxKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzaXNyMiwgQVI1S19TSVNSMik7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjMsIEFSNUtfU0lTUjMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3I0LCBBUjVLX1NJU1I0KTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaXNyX2NsZWFyLCBBUjVLX1BJU1IpOworCQkvKiBGbHVzaCBwcmV2aW91cyB3cml0ZSAqLworCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKIAotCQlpZiAodW5saWtlbHkoc2lzcjIgJiAoQVI1S19TSVNSMl9TU0VSUiB8Ci0JCQkJCUFSNUtfU0lTUjJfRFBFUlIgfAotCQkJCQlBUjVLX1NJU1IyX01DQUJUKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCS8qCisJCSAqIEZpbHRlciBvdXQgdGhlIG5vbi1jb21tb24gYml0cyBmcm9tIHRoZSBpbnRlcnJ1cHQKKwkJICogc3RhdHVzLgorCQkgKi8KKwkJKmludGVycnVwdF9tYXNrID0gKHBpc3IgJiBBUjVLX0lOVF9DT01NT04pICYgYWgtPmFoX2ltcjsKIAotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RJTSkKKworCQkvKiBXZSB0cmVhdCBUWE9LLFRYREVTQywgVFhFUlIgYW5kIFRYRU9MCisJCSAqIHRoZSBzYW1lIHdheSAoc2NoZWR1bGUgdGhlIHR4IHRhc2tsZXQpCisJCSAqIHNvIHdlIHRyYWNrIHRoZW0gYWxsIHRvZ2V0aGVyIHBlciBxdWV1ZSAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYT0spCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMCwKKwkJCQkJCUFSNUtfU0lTUjBfUUNVX1RYT0spOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhERVNDKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjAsCisJCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhFUlIpCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMSwKKwkJCQkJCUFSNUtfU0lTUjFfUUNVX1RYRVJSKTsKKworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYRU9MKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjEsCisJCQkJCQlBUjVLX1NJU1IxX1FDVV9UWEVPTCk7CisKKwkJLyogQ3VycmVudGx5IHRoaXMgaXMgbm90IG11Y2ggdXNlZnVsbCBzaW5jZSB3ZSB0cmVhdAorCQkgKiBhbGwgcXVldWVzIHRoZSBzYW1lIHdheSBpZiB3ZSBnZXQgYSBUWFVSTiAodXBkYXRlCisJCSAqIHR4IHRyaWdnZXIgbGV2ZWwpIGJ1dCB3ZSBtaWdodCBuZWVkIGl0IGxhdGVyIG9uKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9UWFVSTikKKwkJCWFoLT5haF90eHFfaXNyX3R4dXJuIHw9IEFSNUtfUkVHX01TKHNpc3IyLAorCQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOworCisJCS8qIE1pc2MgQmVhY29uIHJlbGF0ZWQgaW50ZXJydXB0cyAqLworCisJCS8qIEZvciBBUjUyMTEgKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9USU0pCiAJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfVElNOwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfQkNOTUlTQykgeworCQkvKiBGb3IgQVI1MjEyKyAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX0JDTk1JU0MpIHsKIAkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfVElNKQogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9USU07CiAJCQlpZiAoc2lzcjIgJiBBUjVLX1NJU1IyX0RUSU0pCkBAIC01OTEsNjMgKzY4NiwzOSBAQAogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9DQUJfVElNRU9VVDsKIAkJfQogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfUlhET1BQTEVSKQotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1JYX0RPUFBMRVI7Ci0JCWlmIChkYXRhICYgQVI1S19JU1JfUUNCUk9STikgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47Ci0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IzKSwKLQkJCQkJQVI1S19TSVNSM19RQ0JST1JOKTsKLQkJfQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1FDQlJVUk4pIHsKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RQ0JSVVJOOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMyksCi0JCQkJCUFSNUtfU0lTUjNfUUNCUlVSTik7Ci0JCX0KLQkJaWYgKGRhdGEgJiBBUjVLX0lTUl9RVFJJRykgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FUUklHOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSNCksCi0JCQkJCUFSNUtfU0lTUjRfUVRSSUcpOwotCQl9CisJCS8qIEJlbG93IGludGVycnVwdHMgYXJlIHVubGlrZWx5IHRvIGhhcHBlbiAqLwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhPSykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWE9LKTsKLQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYREVTQykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFUlIpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFUlIpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFT0wpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFT0wpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhVUk4pCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IyKSwKLQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOwotCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseShkYXRhICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKLQkJCQl8IEFSNUtfSVNSX0hJVUVSUiB8IEFSNUtfSVNSX0RQRVJSKSkpCisJCS8qIEhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpCisJCSAqIENhbiBiZSBvbmUgb2YgTUNBQlQsIFNTRVJSLCBEUEVSUiBmcm9tIFNJU1IyICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX0hJVUVSUikpKQogCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0ZBVEFMOwogCi0JCS8qCi0JCSAqIFhYWDogQk1JU1MgaW50ZXJydXB0cyBtYXkgb2NjdXIgYWZ0ZXIgYXNzb2NpYXRpb24uCi0JCSAqIEkgZm91bmQgdGhpcyBvbiA1MjEwIGNvZGUgYnV0IGl0IG5lZWRzIHRlc3RpbmcuIElmIHRoaXMgaXMKLQkJICogdHJ1ZSB3ZSBzaG91bGQgZGlzYWJsZSB0aGVtIGJlZm9yZSBhc3NvYyBhbmQgcmUtZW5hYmxlIHRoZW0KLQkJICogYWZ0ZXIgYSBzdWNjZXNzZnVsIGFzc29jICsgc29tZSBqaWZmaWVzLgotCQkJaW50ZXJydXB0X21hc2sgJj0gfkFSNUtfSU5UX0JNSVNTOwotCQkgKi8KKwkJLypCZWFjb24gTm90IFJlYWR5Ki8KKwkJaWYgKHVubGlrZWx5KHBpc3IgJiAoQVI1S19JU1JfQk5SKSkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfQk5SOworCisJCS8qIEEgcXVldWUgZ290IENCUiBvdmVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJPUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2Jvcm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJPUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgQ0JSIHVuZGVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJVUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJVUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2J1cm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJVUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FUUklHKSkpIHsKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RVFJJRzsKKwkJCWFoLT5haF90eHFfaXNyX3F0cmlnIHw9IEFSNUtfUkVHX01TKHNpc3I0LAorCQkJCQkJQVI1S19TSVNSNF9RVFJJRyk7CisJCX0KKworCQlkYXRhID0gcGlzcjsKIAl9CiAKIAkvKgpAQCAtNjYxLDggKzczMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2ltciAtIFNldCBpbnRlcnJ1cHQgbWFzawotICoKKyAqIGF0aDVrX2h3X3NldF9pbXIoKSAtIFNldCBpbnRlcnJ1cHQgbWFzawogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG5ld19tYXNrOiBUaGUgbmV3IGludGVycnVwdCBtYXNrIHRvIGJlIHNldAogICoKQEAgLTY3MCw3ICs3NDAsOCBAQAogICogYXRoNWtfaW50IGJpdHMgdG8gaHctc3BlY2lmaWMgYml0cyB0byByZW1vdmUgYWJzdHJhY3Rpb24gYW5kIHdyaXRpbmcKICAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgogICovCi1lbnVtIGF0aDVrX2ludCBhdGg1a19od19zZXRfaW1yKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50IG5ld19tYXNrKQorZW51bSBhdGg1a19pbnQKK2F0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spCiB7CiAJZW51bSBhdGg1a19pbnQgb2xkX21hc2ssIGludF9tYXNrOwogCkBAIC02OTcsMTYgKzc2OCwxNCBAQAogCQl1MzIgc2ltcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSU1SMikKIAkJCQkmIEFSNUtfU0lNUjJfUUNVX1RYVVJOOwogCisJCS8qIEZhdGFsIGludGVycnVwdCBhYnN0cmFjdGlvbiBmb3IgNTIxMSsgKi8KIAkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfRkFUQUwpIHsKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX0hJVUVSUjsKIAkJCXNpbXIyIHw9IChBUjVLX1NJTVIyX01DQUJUIHwgQVI1S19TSU1SMl9TU0VSUgogCQkJCXwgQVI1S19TSU1SMl9EUEVSUik7CiAJCX0KIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCi0JCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7Ci0KKwkJLyogTWlzYyBiZWFjb24gcmVsYXRlZCBpbnRlcnJ1cHRzICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX1RJTSkKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX1RJTTsKIApAQCAtNzIxLDggKzc5MCw5IEBACiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0NBQl9USU1FT1VUKQogCQkJc2ltcjIgfD0gQVI1S19TSVNSMl9DQUJfVElNRU9VVDsKIAotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9SWF9ET1BQTEVSKQotCQkJaW50X21hc2sgfD0gQVI1S19JTVJfUlhET1BQTEVSOworCQkvKkJlYWNvbiBOb3QgUmVhZHkqLworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCisJCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CiAKIAkJLyogTm90ZTogUGVyIHF1ZXVlIGludGVycnVwdCBtYXNrcwogCQkgKiBhcmUgc2V0IHZpYSBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIChxY3UuYykgKi8KQEAgLTczMCwxMCArODAwLDEyIEBACiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2ltcjIsIEFSNUtfU0lNUjIpOwogCiAJfSBlbHNlIHsKKwkJLyogRmF0YWwgaW50ZXJydXB0IGFic3RyYWN0aW9uIGZvciA1MjEwICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0ZBVEFMKQogCQkJaW50X21hc2sgfD0gKEFSNUtfSU1SX1NTRVJSIHwgQVI1S19JTVJfTUNBQlQKIAkJCQl8IEFSNUtfSU1SX0hJVUVSUiB8IEFSNUtfSU1SX0RQRVJSKTsKIAorCQkvKiBPbmx5IGNvbW1vbiBpbnRlcnJ1cHRzIGxlZnQgZm9yIDUyMTAgKG5vIFNJTVJzKSAqLwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludF9tYXNrLCBBUjVLX0lNUik7CiAJfQogCkBAIC03NjAsOCArODMyLDcgQEAKIFwqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19kbWFfaW5pdCAtIEluaXRpYWxpemUgRE1BIHVuaXQKLSAqCisgKiBhdGg1a19od19kbWFfaW5pdCgpIC0gSW5pdGlhbGl6ZSBETUEgdW5pdAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFNldCBETUEgc2l6ZSBhbmQgcHJlLWVuYWJsZSBpbnRlcnJ1cHRzCkBAIC03NzAsNyArODQxLDggQEAKICAqCiAgKiBYWFg6IFNhdmUvcmVzdG9yZSBSWERQL1RYRFAgcmVnaXN0ZXJzID8KICAqLwotdm9pZCBhdGg1a19od19kbWFfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfZG1hX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKgogCSAqIFNldCBSeC9UeCBETUEgQ29uZmlndXJhdGlvbgpAQCAtNzk5LDggKzg3MSw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZG1hX3N0b3AgLSBzdG9wIERNQSB1bml0Ci0gKgorICogYXRoNWtfaHdfZG1hX3N0b3AoKSAtIHN0b3AgRE1BIHVuaXQKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBTdG9wIHR4L3J4IERNQSBhbmQgaW50ZXJydXB0cy4gUmV0dXJucwpAQCAtODEwLDcgKzg4MSw4IEBACiAgKiBzdHVjayBmcmFtZXMgb24gdHggcXVldWVzLCBvbmx5IGEgcmVzZXQKICAqIGNhbiBmaXggdGhhdC4KICAqLwotaW50IGF0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGksIHFtYXgsIGVycjsKIAllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9ncGlvLmMKaW5kZXggODU5Mjk3OC4uNzNkM2RkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZ3Bpby5jCkBAIC0yNCwxMCArMjQsMzMgQEAKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0vKgotICogU2V0IGxlZCBzdGF0ZQorCisvKioKKyAqIERPQzogR1BJTy9MRUQgZnVuY3Rpb25zCisgKgorICogSGVyZSB3ZSBjb250cm9sIHRoZSA2IGJpZGlyZWN0aW9uYWwgR1BJTyBwaW5zIHByb3ZpZGVkIGJ5IHRoZSBody4KKyAqIFdlIGNhbiBzZXQgYSBHUElPIHBpbiB0byBiZSBhbiBpbnB1dCBvciBhbiBvdXRwdXQgcGluIG9uIEdQSU8gY29udHJvbAorICogcmVnaXN0ZXIgYW5kIHRoZW4gcmVhZCBvciBzZXQgaXRzIHN0YXR1cyBmcm9tIEdQSU8gZGF0YSBpbnB1dC9vdXRwdXQKKyAqIHJlZ2lzdGVycy4KKyAqCisgKiBXZSBhbHNvIGNvbnRyb2wgdGhlIHR3byBMRUQgcGlucyBwcm92aWRlZCBieSB0aGUgaHcsIExFRF8wIGlzIG91cgorICogInBvd2VyIiBMRUQgYW5kIExFRF8xIGlzIG91ciAibmV0d29yayBhY3Rpdml0eSIgTEVEIGJ1dCBtYW55IHNjZW5hcmlvcworICogYXJlIGF2YWlsYWJsZSBmcm9tIGh3LiBWZW5kb3JzIG1pZ2h0IGFsc28gcHJvdmlkZSBMRURzIGNvbm5lY3RlZCB0byB0aGUKKyAqIEdQSU8gcGlucywgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCB0aGUgTEVEIHN1YnN5c3RlbSBvbiBsZWQuYwogICovCi12b2lkIGF0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCisKKworLyoqCisgKiBhdGg1a19od19zZXRfbGVkc3RhdGUoKSAtIFNldCBsZWQgc3RhdGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzdGF0ZTogT25lIG9mIEFSNUtfTEVEXyoKKyAqCisgKiBVc2VkIHRvIHNldCB0aGUgTEVEIGJsaW5raW5nIHN0YXRlLiBUaGlzIG9ubHkKKyAqIHdvcmtzIGZvciB0aGUgTEVEIGNvbm5lY3RlZCB0byB0aGUgTEVEXzAsIExFRF8xIHBpbnMsCisgKiBub3QgdGhlIEdQSU8gYmFzZWQuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJdTMyIGxlZDsKIAkvKjUyMTAgaGFzIGRpZmZlcmVudCBsZWQgbW9kZSBoYW5kbGluZyovCkBAIC03NCwxMCArOTcsMTMgQEAKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBsZWRfNTIxMCk7CiB9CiAKLS8qCi0gKiBTZXQgR1BJTyBpbnB1dHMKKy8qKgorICogYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoKSAtIFNldCBHUElPIGlucHV0cworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IEdQSU8gcGluIHRvIHNldCBhcyBpbnB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCitpbnQKK2F0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQogewogCWlmIChncGlvID49IEFSNUtfTlVNX0dQSU8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODksMTAgKzExNSwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IEdQSU8gb3V0cHV0cworLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoKSAtIFNldCBHUElPIG91dHB1dHMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gc2V0IGFzIG91dHB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQoraW50CithdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCiB7CiAJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDQsMTAgKzEzMywxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogR2V0IEdQSU8gc3RhdGUKKy8qKgorICogYXRoNWtfaHdfZ2V0X2dwaW8oKSAtIEdldCBHUElPIHN0YXRlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZ3BpbzogVGhlIEdQSU8gcGluIHRvIHJlYWQKICAqLwotdTMyIGF0aDVrX2h3X2dldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQordTMyCithdGg1a19od19nZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKIHsKIAlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQogCQlyZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTExNywxMCArMTQ5LDE0IEBACiAJCTB4MTsKIH0KIAotLyoKLSAqIFNldCBHUElPIHN0YXRlCisvKioKKyAqIGF0aDVrX2h3X3NldF9ncGlvKCkgLSBTZXQgR1BJTyBzdGF0ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IFRoZSBHUElPIHBpbiB0byBzZXQKKyAqIEB2YWw6IFZhbHVlIHRvIHNldCAoYm9vbGVhbikKICAqLwotaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQoraW50CithdGg1a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCkKIHsKIAl1MzIgZGF0YTsKIApAQCAtMTM4LDEwICsxNzQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIEdQSU8gaW50ZXJydXB0IChSRktpbGwgc3dpdGNoKQorLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19pbnRyKCkgLSBJbml0aWFsaXplIHRoZSBHUElPIGludGVycnVwdCAoUkZLaWxsIHN3aXRjaCkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gdXNlCisgKiBAaW50ZXJydXB0X2xldmVsOiBUcnVlIHRvIGdlbmVyYXRlIGludGVycnVwdCBvbiBhY3RpdmUgcGluIChoaWdoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdXAgdGhlIEdQSU8gaW50ZXJydXB0IGZvciB0aGUgaHcgUkZLaWxsIHN3aXRjaC4KKyAqIFRoYXQgc3dpdGNoIGlzIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluIGFuZCBpdCdzIG51bWJlciBpcyBzdG9yZWQgb24gRUVQUk9NLgorICogSXQgY2FuIGVpdGhlciBvcGVuIG9yIGNsb3NlIHRoZSBjaXJjdWl0IHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGRpc2FibGUKKyAqIFJGL1dpcmVsZXNzIHRvIHNhdmUgcG93ZXIgKHdlIGFsc28gZ2V0IHRoYXQgZnJvbSBFRVBST00pLgogICovCi12b2lkIGF0aDVrX2h3X3NldF9ncGlvX2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGdwaW8sCit2b2lkCithdGg1a19od19zZXRfZ3Bpb19pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBncGlvLAogCQl1MzIgaW50ZXJydXB0X2xldmVsKQogewogCXUzMiBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2luaXR2YWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwppbmRleCAxZmZlY2MwLi5hMWVhNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwpAQCAtMjMsMjQgKzIzLDI3IEBACiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoKLSAqIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKy8qKgorICogc3RydWN0IGF0aDVrX2luaSAtIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKyAqIEBpbmlfcmVnaXN0ZXI6IFJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBpbmlfdmFsdWU6IERlZmF1bHQgdmFsdWUKKyAqIEBpbmlfbW9kZTogMCB0byB3cml0ZSAxIHRvIHJlYWQgKGFuZCBjbGVhcikKICAqLwotCiBzdHJ1Y3QgYXRoNWtfaW5pIHsKIAl1MTYJaW5pX3JlZ2lzdGVyOwogCXUzMglpbmlfdmFsdWU7CiAKIAllbnVtIHsKIAkJQVI1S19JTklfV1JJVEUgPSAwLAkvKiBEZWZhdWx0ICovCi0JCUFSNUtfSU5JX1JFQUQgPSAxLAkvKiBDbGVhcmVkIG9uIHJlYWQgKi8KKwkJQVI1S19JTklfUkVBRCA9IDEsCiAJfSBpbmlfbW9kZTsKIH07CiAKLS8qCi0gKiBNb2RlIHNwZWNpZmljIGluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzCisvKioKKyAqIHN0cnVjdCBhdGg1a19pbmlfbW9kZSAtIE1vZGUgc3BlY2lmaWMgaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKKyAqIEBtb2RlX3JlZ2lzdGVyOiBSZWdpc3RlciBhZGRyZXNzCisgKiBAbW9kZV92YWx1ZTogU2V0IG9mIHZhbHVlcyBmb3IgZWFjaCBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCiAgKi8KLQogc3RydWN0IGF0aDVrX2luaV9tb2RlIHsKIAl1MTYJbW9kZV9yZWdpc3RlcjsKIAl1MzIJbW9kZV92YWx1ZVszXTsKQEAgLTM4NiwxMSArMzg5LDEwIEBACiAKIC8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjExCiAgKiA1MjExIHN1cHBvcnRzIE9GRE0tb25seSBnIChkcmFmdCBnKSBidXQgd2UKLSAqIG5lZWQgdG8gdGVzdCBpdCAhCi0gKi8KKyAqIG5lZWQgdG8gdGVzdCBpdCAhICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIGFyNTIxMV9pbmlfbW9kZVtdID0gewogCXsgQVI1S19UWENGRywKLQkvKglBL1hSICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KKwkvKglBICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KIAkgICB7IDB4MDAwMDAwMTUsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMTUgfSB9LAogCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDApLAogCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCkBAIC00NjAsNyArNDYyLDcgQEAKIAkgICB7IDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSB9LAogfTsKIAotLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgQVI1MjEyICovCisvKiBJbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzIGZvciBBUjUyMTIgYW5kIG5ld2VyIGNoaXBzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSBhcjUyMTJfaW5pX2NvbW1vbl9zdGFydFtdID0gewogCXsgQVI1S19SWERQLAkJMHgwMDAwMDAwMCB9LAogCXsgQVI1S19SWENGRywJCTB4MDAwMDAwMDUgfSwKQEAgLTcyNCw3ICs3MjYsOCBAQAogCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDEwOCB9IH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIEFSNTIxMiArIFJGNTExMSAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBBUjUyMTIgKyBSRjUxMTEKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTExMV9pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC03NTcsNiArNzYwLDcgQEAKIAkgICB7IDB4MTg4MzgwMGEsIDB4MTg3MzgwMGEsIDB4MTg4MzgwMGEgfSB9LAogfTsKIAorLyogQ29tbW9uIGZvciBhbGwgbW9kZXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmNTExMV9pbmlfY29tbW9uX2VuZFtdID0gewogCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwMDAwIH0sCiAJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwIH0sCkBAIC03NzQsNyArNzc4LDkgQEAKIAl7IDB4YTIzYywJCTB4MTNjODg5YWYgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyCisgKiAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSByZjUxMTJfaW5pX21vZGVfZW5kW10gPSB7CiAJeyBBUjVLX1RYQ0ZHLAogCS8qCUEvWFIgICAgICAgICAgQiAgICAgICAgICAgRyAgICAgICAqLwpAQCAtODI1LDcgKzgzMSw5IEBACiAJeyAweGEyM2MsCQkweDEzYzg4OWFmIH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGNTQxMy81NDE0IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkY1NDEzLzU0MTQKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTQxM19pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC05NjMsNyArOTcxLDggQEAKIAl7IDB4YTM4NCwgMHhmMzMwN2ZmMCB9LAogfTsKIAotLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNCAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNAorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDEzX2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEwODUsNyArMTA5NCw4IEBACiAJeyAweGEzODQsIDB4ZjMzMDdmZjAgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkYyNDI1IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisvKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGMjQyNQorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDI1X2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEzNTcsMTAgKzEzNjcsMTUgQEAKIH07CiAKIAotLyoKLSAqIFdyaXRlIGluaXRpYWwgcmVnaXN0ZXIgZHVtcAorLyoqCisgKiBhdGg1a19od19pbmlfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIGR1bXAgY29tbW9uIGZvciBhbGwgbW9kZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzaXplOiBEdW1wIHNpemUKKyAqIEBpbmlfcmVnczogVGhlIGFycmF5IG9mICZzdHJ1Y3QgYXRoNWtfaW5pCisgKiBAc2tpcF9wY3U6IFNraXAgUENVIHJlZ2lzdGVycwogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfcmVnaXN0ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzaXplLAorc3RhdGljIHZvaWQKK2F0aDVrX2h3X2luaV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNpemUsCiAJCWNvbnN0IHN0cnVjdCBhdGg1a19pbmkgKmluaV9yZWdzLCBib29sIHNraXBfcGN1KQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMTM4OCw3ICsxNDAzLDE1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfaW5pX21vZGVfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIG1vZGUtc3BlY2lmaWMgcmVnaXN0ZXIgZHVtcAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHNpemU6IER1bXAgc2l6ZQorICogQGluaV9tb2RlOiBUaGUgYXJyYXkgb2YgJnN0cnVjdCBhdGg1a19pbmlfbW9kZQorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKi8KK3N0YXRpYyB2b2lkCithdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSAqaW5pX21vZGUsCiAJCXU4IG1vZGUpCiB7CkBAIC0xNDAyLDcgKzE0MjUsMTcgQEAKIAogfQogCi1pbnQgYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbW9kZSwgYm9vbCBza2lwX3BjdSkKKy8qKgorICogYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoKSAtIFdyaXRlIGluaXRpYWwgY2hpcC1zcGVjaWZpYyByZWdpc3RlciBkdW1wCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEBza2lwX3BjdTogU2tpcCBQQ1UgcmVnaXN0ZXJzCisgKgorICogV3JpdGUgaW5pdGlhbCBjaGlwLXNwZWNpZmljIHJlZ2lzdGVyIGR1bXAsIHRvIGdldCB0aGUgY2hpcHNldCBvbiBhCisgKiBjbGVhbiBhbmQgcmVhZHktdG8td29yayBzdGF0ZSBhZnRlciB3YXJtIHJlc2V0LgorICovCitpbnQKK2F0aDVrX2h3X3dyaXRlX2luaXR2YWxzKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IG1vZGUsIGJvb2wgc2tpcF9wY3UpCiB7CiAJLyoKIAkgKiBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKaW5kZXggYzFkZmYyYy4uODQ5ZmEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9hdGguaCIKICNpbmNsdWRlICJhdGg1ay5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC05Nyw3ICs5OCw3IEBACiAJCQkJCTB4ZmZmZik7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQotCQl1ZGVsYXkoMTUpOworCQl1c2xlZXBfcmFuZ2UoMTUsIDIwKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMKaW5kZXggYTdlYWZhMy4uY2ViZmQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYwpAQCAtMzAsMTEgKzMwLDQ3IEBACiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoKKy8qKgorICogRE9DOiBQcm90b2NvbCBDb250cm9sIFVuaXQgKFBDVSkgZnVuY3Rpb25zCisgKgorICogUHJvdG9jb2wgY29udHJvbCB1bml0IGlzIHJlc3BvbnNpYmxlIHRvIG1haW50YWluIHZhcmlvdXMgcHJvdG9jb2wKKyAqIHByb3BlcnRpZXMgYmVmb3JlIGEgZnJhbWUgaXMgc2VuZCBhbmQgYWZ0ZXIgYSBmcmFtZSBpcyByZWNlaXZlZCB0by9mcm9tCisgKiBiYXNlYmFuZC4gVG8gYmUgbW9yZSBzcGVjaWZpYywgUENVIGhhbmRsZXM6CisgKgorICogLSBCdWZmZXJpbmcgb2YgUlggYW5kIFRYIGZyYW1lcyAoYWZ0ZXIgUUNVL0RDVXMpCisgKgorICogLSBFbmNyeXB0aW5nIGFuZCBkZWNyeXB0aW5nICh1c2luZyB0aGUgYnVpbHQtaW4gZW5naW5lKQorICoKKyAqIC0gR2VuZXJhdGluZyBBQ0tzLCBSVFMvQ1RTIGZyYW1lcworICoKKyAqIC0gTWFpbnRhaW5pbmcgVFNGCisgKgorICogLSBGQ1MKKyAqCisgKiAtIFVwZGF0aW5nIGJlYWNvbiBkYXRhICh3aXRoIFRTRiBldGMpCisgKgorICogLSBHZW5lcmF0aW5nIHZpcnR1YWwgQ0NBCisgKgorICogLSBSWC9NdWx0aWNhc3QgZmlsdGVyaW5nCisgKgorICogLSBCU1NJRCBmaWx0ZXJpbmcKKyAqCisgKiAtIFZhcmlvdXMgc3RhdGlzdGljcworICoKKyAqIC1EaWZmZXJlbnQgb3BlcmF0aW5nIG1vZGVzOiBBUCwgU1RBLCBJQlNTCisgKgorICogTm90ZTogTW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIHR3ZWFrZWQvYnlwYXNzZWQgc28geW91IGNhbiBkbworICogdGhlbSBvbiBzdyBhYm92ZSBmb3IgZGVidWdnaW5nIG9yIHJlc2VhcmNoLiBGb3IgbW9yZSBpbmZvcyBjaGVjayBvdXQgUENVCisgKiByZWdpc3RlcnMgb24gcmVnLmguCisgKi8KKworLyoqCisgKiBET0M6IEFDSyByYXRlcworICoKICAqIEFSNTIxMisgY2FuIHVzZSBoaWdoZXIgcmF0ZXMgZm9yIGFjayB0cmFuc21pc3Npb24KICAqIGJhc2VkIG9uIGN1cnJlbnQgdHggcmF0ZSBpbnN0ZWFkIG9mIHRoZSBiYXNlIHJhdGUuCiAgKiBJdCBkb2VzIHRoaXMgdG8gYmV0dGVyIHV0aWxpemUgY2hhbm5lbCB1c2FnZS4KLSAqIFRoaXMgaXMgYSBtYXBwaW5nIGJldHdlZW4gRyByYXRlcyAodGhhdCBjb3ZlciBib3RoCisgKiBUaGVyZSBpcyBhIG1hcHBpbmcgYmV0d2VlbiBHIHJhdGVzICh0aGF0IGNvdmVyIGJvdGgKICAqIENDSyBhbmQgT0ZETSkgYW5kIGFjayByYXRlcyB0aGF0IHdlIHVzZSB3aGVuIHNldHRpbmcKICAqIHJhdGUgLT4gZHVyYXRpb24gdGFibGUuIFRoaXMgbWFwcGluZyBpcyBody1iYXNlZCBzbwogICogZG9uJ3QgY2hhbmdlIGFueXRoaW5nLgpAQCAtNjMsMTcgKzk5LDE4IEBACiBcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24gLSBHZXQgdHggdGltZSBvZiBhIGZyYW1lCi0gKgorICogYXRoNWtfaHdfZ2V0X2ZyYW1lX2R1cmF0aW9uKCkgLSBHZXQgdHggdGltZSBvZiBhIGZyYW1lCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAbGVuOiBGcmFtZSdzIGxlbmd0aCBpbiBieXRlcwogICogQHJhdGU6IFRoZSBAc3RydWN0IGllZWU4MDIxMV9yYXRlCisgKiBAc2hvcnRwcmU6IEluZGljYXRlIHNob3J0IHByZWFtcGxlCiAgKgogICogQ2FsY3VsYXRlIHR4IGR1cmF0aW9uIG9mIGEgZnJhbWUgZ2l2ZW4gaXQncyByYXRlIGFuZCBsZW5ndGgKICAqIEl0IGV4dGVuZHMgaWVlZTgwMjExX2dlbmVyaWNfZnJhbWVfZHVyYXRpb24gZm9yIG5vbiBzdGFuZGFyZAogICogYndtb2Rlcy4KICAqLwotaW50IGF0aDVrX2h3X2dldF9mcmFtZV9kdXJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLAoraW50CithdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJaW50IGxlbiwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlLCBib29sIHNob3J0cHJlKQogewogCWludCBzaWZzLCBwcmVhbWJsZSwgcGxjcF9iaXRzLCBzeW1fdGltZTsKQEAgLTEyOSwxMSArMTY2LDExIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUgLSBHZXQgdGhlIGRlZmF1bHQgc2xvdCB0aW1lIGZvciBjdXJyZW50IG1vZGUKLSAqCisgKiBhdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZSgpIC0gR2V0IHRoZSBkZWZhdWx0IHNsb3QgdGltZSBmb3IgY3VycmVudCBtb2RlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordW5zaWduZWQgaW50CithdGg1a19od19nZXRfZGVmYXVsdF9zbG90dGltZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGFoLT5haF9jdXJyZW50X2NoYW5uZWw7CiAJdW5zaWduZWQgaW50IHNsb3RfdGltZTsKQEAgLTE2MCwxMSArMTk3LDExIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2lmcyAtIEdldCB0aGUgZGVmYXVsdCBTSUZTIGZvciBjdXJyZW50IG1vZGUKLSAqCisgKiBhdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKCkgLSBHZXQgdGhlIGRlZmF1bHQgU0lGUyBmb3IgY3VycmVudCBtb2RlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKHN0cnVjdCBhdGg1a19odyAqYWgpCit1bnNpZ25lZCBpbnQKK2F0aDVrX2h3X2dldF9kZWZhdWx0X3NpZnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwogCXVuc2lnbmVkIGludCBzaWZzOwpAQCAtMTkxLDE3ICsyMjgsMTcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzIC0gVXBkYXRlIE1JQiBjb3VudGVycyAobWFjIGxheWVyIHN0YXRpc3RpY3MpCi0gKgorICogYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycygpIC0gVXBkYXRlIE1JQiBjb3VudGVycyAobWFjIGxheWVyIHN0YXRpc3RpY3MpCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmVhZHMgTUlCIGNvdW50ZXJzIGZyb20gUENVIGFuZCB1cGRhdGVzIHN3IHN0YXRpc3RpY3MuIElzIGNhbGxlZCBhZnRlciBhCiAgKiBNSUIgaW50ZXJydXB0LCBiZWNhdXNlIG9uZSBvZiB0aGVzZSBjb3VudGVycyBtaWdodCBoYXZlIHJlYWNoZWQgdGhlaXIgbWF4aW11bQogICogYW5kIHRyaWdnZXJlZCB0aGUgTUlCIGludGVycnVwdCwgdG8gbGV0IHVzIHJlYWQgYW5kIGNsZWFyIHRoZSBjb3VudGVyLgogICoKLSAqIElzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCEKKyAqIE5PVEU6IElzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCEKICAqLwotdm9pZCBhdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od191cGRhdGVfbWliX2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGF0aDVrX3N0YXRpc3RpY3MgKnN0YXRzID0gJmFoLT5zdGF0czsKIApAQCAtMjE5LDEwICsyNTYsOCBAQAogXCoqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uIC0gZmlsbCByYXRlIGNvZGUgdG8gZHVyYXRpb24gdGFibGUKLSAqCi0gKiBAYWg6IHRoZSAmc3RydWN0IGF0aDVrX2h3Ci0gKiBAbW9kZTogb25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIGF0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oKSAtIEZpbGwgcmF0ZSBjb2RlIHRvIGR1cmF0aW9uIHRhYmxlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogV3JpdGUgdGhlIHJhdGUgY29kZSB0byBkdXJhdGlvbiB0YWJsZSB1cG9uIGh3IHJlc2V0LiBUaGlzIGlzIGEgaGVscGVyIGZvcgogICogYXRoNWtfaHdfcGN1X2luaXQoKS4gSXQgc2VlbXMgYWxsIHRoaXMgaXMgZG9pbmcgaXMgc2V0dGluZyBhbiBBQ0sgdGltZW91dCBvbgpAQCAtMjM2LDcgKzI3MSw4IEBACiAgKiB0aGF0IGluY2x1ZGUgYWxsIE9GRE0gYW5kIENDSyByYXRlcy4KICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0aDVrX2h3X3dyaXRlX3JhdGVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0yODAsMTIgKzMxNiwxMiBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9hY2tfdGltZW91dCAtIFNldCBBQ0sgdGltZW91dCBvbiBQQ1UKLSAqCisgKiBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQoKSAtIFNldCBBQ0sgdGltZW91dCBvbiBQQ1UKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEB0aW1lb3V0OiBUaW1lb3V0IGluIHVzZWMKICAqLwotc3RhdGljIGludCBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50CithdGg1a19od19zZXRfYWNrX3RpbWVvdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHRpbWVvdXQpCiB7CiAJaWYgKGF0aDVrX2h3X2Nsb2NrdG9oKGFoLCBBUjVLX1JFR19NUygweGZmZmZmZmZmLCBBUjVLX1RJTUVfT1VUX0FDSykpCiAJCQk8PSB0aW1lb3V0KQpAQCAtMjk4LDEyICszMzQsMTIgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfY3RzX3RpbWVvdXQgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCi0gKgorICogYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KCkgLSBTZXQgQ1RTIHRpbWVvdXQgb24gUENVCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdGltZW91dDogVGltZW91dCBpbiB1c2VjCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludAorYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewogCWlmIChhdGg1a19od19jbG9ja3RvaChhaCwgQVI1S19SRUdfTVMoMHhmZmZmZmZmZiwgQVI1S19USU1FX09VVF9DVFMpKQogCQkJPD0gdGltZW91dCkKQEAgLTMyMSwxNCArMzU3LDE0IEBACiBcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zZXRfbGxhZGRyIC0gU2V0IHN0YXRpb24gaWQKLSAqCisgKiBhdGg1a19od19zZXRfbGxhZGRyKCkgLSBTZXQgc3RhdGlvbiBpZAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQG1hYzogVGhlIGNhcmQncyBtYWMgYWRkcmVzcworICogQG1hYzogVGhlIGNhcmQncyBtYWMgYWRkcmVzcyAoYXJyYXkgb2Ygb2N0ZXRzKQogICoKICAqIFNldCBzdGF0aW9uIGlkIG9uIGh3IHVzaW5nIHRoZSBwcm92aWRlZCBtYWMgYWRkcmVzcwogICovCi1pbnQgYXRoNWtfaHdfc2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCB1OCAqbWFjKQoraW50CithdGg1a19od19zZXRfbGxhZGRyKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYWMpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJdTMyIGxvd19pZCwgaGlnaF9pZDsKQEAgLTM0OSwxNCArMzg1LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2Jzc2lkIC0gU2V0IGN1cnJlbnQgQlNTSUQgb24gaHcKLSAqCisgKiBhdGg1a19od19zZXRfYnNzaWQoKSAtIFNldCBjdXJyZW50IEJTU0lEIG9uIGh3CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogU2V0cyB0aGUgY3VycmVudCBCU1NJRCBhbmQgQlNTSUQgbWFzayB3ZSBoYXZlIGZyb20gdGhlCiAgKiBjb21tb24gc3RydWN0IGludG8gdGhlIGhhcmR3YXJlCiAgKi8KLXZvaWQgYXRoNWtfaHdfc2V0X2Jzc2lkKHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od19zZXRfYnNzaWQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAl1MTYgdGltX29mZnNldCA9IDA7CkBAIC0zODksNyArNDI1LDIzIEBACiAJYXRoNWtfaHdfZW5hYmxlX3BzcG9sbChhaCwgTlVMTCwgMCk7CiB9CiAKLXZvaWQgYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCisvKioKKyAqIGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKCkgLSBGaWx0ZXIgb3V0IGJzc2lkcyB3ZSBsaXN0ZW4KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYXNrOiBUaGUgQlNTSUQgbWFzayB0byBzZXQgKGFycmF5IG9mIG9jdGV0cykKKyAqCisgKiBCU1NJRCBtYXNraW5nIGlzIGEgbWV0aG9kIHVzZWQgYnkgQVI1MjEyIGFuZCBuZXdlciBoYXJkd2FyZSB0byBpbmZvcm0gUENVCisgKiB3aGljaCBiaXRzIG9mIHRoZSBpbnRlcmZhY2UncyBNQUMgYWRkcmVzcyBzaG91bGQgYmUgbG9va2VkIGF0IHdoZW4gdHJ5aW5nCisgKiB0byBkZWNpZGUgd2hpY2ggcGFja2V0cyB0byBBQ0suIEluIHN0YXRpb24gbW9kZSBhbmQgQVAgbW9kZSB3aXRoIGEgc2luZ2xlCisgKiBCU1MgZXZlcnkgYml0IG1hdHRlcnMgc2luY2Ugd2UgbG9jayB0byBvbmx5IG9uZSBCU1MuIEluIEFQIG1vZGUgd2l0aAorICogbXVsdGlwbGUgQlNTZXMgKHZpcnR1YWwgaW50ZXJmYWNlcykgbm90IGV2ZXJ5IGJpdCBtYXR0ZXJzIGJlY2F1c2UgaHcgbXVzdAorICogYWNjZXB0IGZyYW1lcyBmb3IgYWxsIEJTU2VzIGFuZCBzbyB3ZSB0d2VhayBzb21lIGJpdHMgb2Ygb3VyIG1hYyBhZGRyZXNzCisgKiBpbiBvcmRlciB0byBoYXZlIG11bHRpcGxlIEJTU2VzLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGNoZWNrIG91dCAuLi9ody5jIG9mIHRoZSBjb21tb24gYXRoIG1vZHVsZS4KKyAqLwordm9pZAorYXRoNWtfaHdfc2V0X2Jzc2lkX21hc2soc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hc2spCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAKQEAgLTQwMCwxOCArNDUyLDIxIEBACiAJCWF0aF9od19zZXRic3NpZG1hc2soY29tbW9uKTsKIH0KIAotLyoKLSAqIFNldCBtdWx0aWNhc3QgZmlsdGVyCisvKioKKyAqIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoKSAtIFNldCBtdWx0aWNhc3QgZmlsdGVyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZmlsdGVyMDogTG93ZXIgMzJiaXRzIG9mIG11dGljYXN0IGZpbHRlcgorICogQGZpbHRlcjE6IEhpZ2hlciAxNmJpdHMgb2YgbXVsdGljYXN0IGZpbHRlcgogICovCi12b2lkIGF0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKQordm9pZAorYXRoNWtfaHdfc2V0X21jYXN0X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmlsdGVyMCwgdTMyIGZpbHRlcjEpCiB7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBmaWx0ZXIwLCBBUjVLX01DQVNUX0ZJTFRFUjApOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMSwgQVI1S19NQ0FTVF9GSUxURVIxKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfcnhfZmlsdGVyIC0gR2V0IGN1cnJlbnQgcnggZmlsdGVyCi0gKgorICogYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcigpIC0gR2V0IGN1cnJlbnQgcnggZmlsdGVyCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmV0dXJucyB0aGUgUlggZmlsdGVyIGJ5IHJlYWRpbmcgcnggZmlsdGVyIGFuZApAQCAtNDIwLDcgKzQ3NSw4IEBACiAgKiBhbmQgcGFzcyB0byB0aGUgZHJpdmVyLiBGb3IgYSBsaXN0IG9mIGZyYW1lIHR5cGVzCiAgKiBjaGVjayBvdXQgcmVnLmguCiAgKi8KLXUzMiBhdGg1a19od19nZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpCit1MzIKK2F0aDVrX2h3X2dldF9yeF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgZGF0YSwgZmlsdGVyID0gMDsKIApAQCAtNDQwLDggKzQ5Niw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X3J4X2ZpbHRlciAtIFNldCByeCBmaWx0ZXIKLSAqCisgKiBhdGg1a19od19zZXRfcnhfZmlsdGVyKCkgLSBTZXQgcnggZmlsdGVyCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAZmlsdGVyOiBSWCBmaWx0ZXIgbWFzayAoc2VlIHJlZy5oKQogICoKQEAgLTQ0OSw3ICs1MDQsOCBAQAogICogcmVnaXN0ZXIgb24gNTIxMiBhbmQgbmV3ZXIgY2hpcHMgc28gdGhhdCB3ZSBoYXZlIHByb3BlciBQSFkKICAqIGVycm9yIHJlcG9ydGluZy4KICAqLwotdm9pZCBhdGg1a19od19zZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIpCit2b2lkCithdGg1a19od19zZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIpCiB7CiAJdTMyIGRhdGEgPSAwOwogCkBAIC00OTMsMTMgKzU0OSwxMyBAQAogI2RlZmluZSBBVEg1S19NQVhfVFNGX1JFQUQgMTAKIAogLyoqCi0gKiBhdGg1a19od19nZXRfdHNmNjQgLSBHZXQgdGhlIGZ1bGwgNjRiaXQgVFNGCi0gKgorICogYXRoNWtfaHdfZ2V0X3RzZjY0KCkgLSBHZXQgdGhlIGZ1bGwgNjRiaXQgVFNGCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogUmV0dXJucyB0aGUgY3VycmVudCBUU0YKICAqLwotdTY0IGF0aDVrX2h3X2dldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordTY0CithdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgdHNmX2xvd2VyLCB0c2ZfdXBwZXIxLCB0c2ZfdXBwZXIyOwogCWludCBpOwpAQCAtNTM2LDI4ICs1OTIsMzAgQEAKIAlyZXR1cm4gKCh1NjQpdHNmX3VwcGVyMSA8PCAzMikgfCB0c2ZfbG93ZXI7CiB9CiAKKyN1bmRlZiBBVEg1S19NQVhfVFNGX1JFQUQKKwogLyoqCi0gKiBhdGg1a19od19zZXRfdHNmNjQgLSBTZXQgYSBuZXcgNjRiaXQgVFNGCi0gKgorICogYXRoNWtfaHdfc2V0X3RzZjY0KCkgLSBTZXQgYSBuZXcgNjRiaXQgVFNGCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdHNmNjQ6IFRoZSBuZXcgNjRiaXQgVFNGCiAgKgogICogU2V0cyB0aGUgbmV3IFRTRgogICovCi12b2lkIGF0aDVrX2h3X3NldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1NjQgdHNmNjQpCit2b2lkCithdGg1a19od19zZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTY0IHRzZjY0KQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdHNmNjQgJiAweGZmZmZmZmZmLCBBUjVLX1RTRl9MMzIpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgKHRzZjY0ID4+IDMyKSAmIDB4ZmZmZmZmZmYsIEFSNUtfVFNGX1UzMik7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfcmVzZXRfdHNmIC0gRm9yY2UgYSBUU0YgcmVzZXQKLSAqCisgKiBhdGg1a19od19yZXNldF90c2YoKSAtIEZvcmNlIGEgVFNGIHJlc2V0CiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogRm9yY2VzIGEgVFNGIHJlc2V0IG9uIFBDVQogICovCi12b2lkIGF0aDVrX2h3X3Jlc2V0X3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfcmVzZXRfdHNmKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIHZhbDsKIApAQCAtNTczLDEwICs2MzEsMTcgQEAKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhbCwgQVI1S19CRUFDT04pOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBiZWFjb24gdGltZXJzCisvKioKKyAqIGF0aDVrX2h3X2luaXRfYmVhY29uX3RpbWVycygpIC0gSW5pdGlhbGl6ZSBiZWFjb24gdGltZXJzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbmV4dF9iZWFjb246IE5leHQgVEJUVAorICogQGludGVydmFsOiBDdXJyZW50IGJlYWNvbiBpbnRlcnZhbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIGJlYWNvbiB0aW1lcnMgYmFzZWQgb24gY3VycmVudAorICogb3BlcmF0aW9uIG1vZGUgYW5kIHNldHRpbmdzLgogICovCi12b2lkIGF0aDVrX2h3X2luaXRfYmVhY29uKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKQordm9pZAorYXRoNWtfaHdfaW5pdF9iZWFjb25fdGltZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBuZXh0X2JlYWNvbiwgdTMyIGludGVydmFsKQogewogCXUzMiB0aW1lcjEsIHRpbWVyMiwgdGltZXIzOwogCkBAIC02NTUsOCArNzIwLDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19jaGVja190aW1lcl93aW4gLSBDaGVjayBpZiB0aW1lciBCIGlzIHRpbWVyIEEgKyB3aW5kb3cKLSAqCisgKiBhdGg1a19jaGVja190aW1lcl93aW4oKSAtIENoZWNrIGlmIHRpbWVyIEIgaXMgdGltZXIgQSArIHdpbmRvdwogICogQGE6IHRpbWVyIGEgKGJlZm9yZSBiKQogICogQGI6IHRpbWVyIGIgKGFmdGVyIGEpCiAgKiBAd2luZG93OiBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgYgpAQCAtNjg2LDEyICs3NTAsMTEgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzIC0gQ2hlY2sgaWYgdGhlIGJlYWNvbiB0aW1lcnMgYXJlIGNvcnJlY3QKLSAqCisgKiBhdGg1a19od19jaGVja19iZWFjb25fdGltZXJzKCkgLSBDaGVjayBpZiB0aGUgYmVhY29uIHRpbWVycyBhcmUgY29ycmVjdAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGludHZhbDogYmVhY29uIGludGVydmFsCiAgKgotICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIElCU1MgbW9kZToKKyAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBJQlNTIG1vZGUKICAqCiAgKiBUaGUgbmVlZCBmb3IgdGhpcyBmdW5jdGlvbiBhcmlzZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgNCBzZXBhcmF0ZQogICogSFcgdGltZXIgcmVnaXN0ZXJzIChUSU1FUjAgLSBUSU1FUjMpLCB3aGljaCBhcmUgY2xvc2VseSByZWxhdGVkIHRvIHRoZQpAQCAtNzQ2LDE0ICs4MDksMTQgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3MgLSBTZXQgSUVFRSA4MDIuMTEgY292ZXJhZ2UgY2xhc3MKLSAqCisgKiBhdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3MoKSAtIFNldCBJRUVFIDgwMi4xMSBjb3ZlcmFnZSBjbGFzcwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGNvdmVyYWdlX2NsYXNzOiBJRUVFIDgwMi4xMSBjb3ZlcmFnZSBjbGFzcyBudW1iZXIKICAqCiAgKiBTZXRzIElGUyBpbnRlcnZhbHMgYW5kIEFDSy9DVFMgdGltZW91dHMgZm9yIGdpdmVuIGNvdmVyYWdlIGNsYXNzLgogICovCi12b2lkIGF0aDVrX2h3X3NldF9jb3ZlcmFnZV9jbGFzcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBjb3ZlcmFnZV9jbGFzcykKK3ZvaWQKK2F0aDVrX2h3X3NldF9jb3ZlcmFnZV9jbGFzcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBjb3ZlcmFnZV9jbGFzcykKIHsKIAkvKiBBcyBkZWZpbmVkIGJ5IElFRUUgODAyLjExLTIwMDcgMTcuMy44LjYgKi8KIAlpbnQgc2xvdF90aW1lID0gYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUoYWgpICsgMyAqIGNvdmVyYWdlX2NsYXNzOwpAQCAtNzcyLDggKzgzNSw3IEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdSAtIFN0YXJ0IFJYIGVuZ2luZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X3BjdSgpIC0gU3RhcnQgUlggZW5naW5lCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogU3RhcnRzIFJYIGVuZ2luZSBvbiBQQ1Ugc28gdGhhdCBodyBjYW4gcHJvY2VzcyBSWGVkIGZyYW1lcwpAQCAtNzgxLDMyICs4NDMsMzMgQEAKICAqCiAgKiBOT1RFOiBSWCBETUEgc2hvdWxkIGJlIGFscmVhZHkgZW5hYmxlZCB1c2luZyBhdGg1a19od19zdGFydF9yeF9kbWEKICAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0YXJ0X3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXLCBBUjVLX0RJQUdfU1dfRElTX1JYKTsKIH0KIAogLyoqCi0gKiBhdDVrX2h3X3N0b3BfcnhfcGN1IC0gU3RvcCBSWCBlbmdpbmUKLSAqCisgKiBhdDVrX2h3X3N0b3BfcnhfcGN1KCkgLSBTdG9wIFJYIGVuZ2luZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFN0b3BzIFJYIGVuZ2luZSBvbiBQQ1UKICAqLwotdm9pZCBhdGg1a19od19zdG9wX3J4X3BjdShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfc3RvcF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19ESUFHX1NXLCBBUjVLX0RJQUdfU1dfRElTX1JYKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfb3Btb2RlIC0gU2V0IFBDVSBvcGVyYXRpbmcgbW9kZQotICoKKyAqIGF0aDVrX2h3X3NldF9vcG1vZGUoKSAtIFNldCBQQ1Ugb3BlcmF0aW5nIG1vZGUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqIEBvcF9tb2RlOiAmZW51bSBubDgwMjExX2lmdHlwZSBvcGVyYXRpbmcgbW9kZQorICogQG9wX21vZGU6IE9uZSBvZiBlbnVtIG5sODAyMTFfaWZ0eXBlCiAgKgogICogQ29uZmlndXJlIFBDVSBmb3IgdGhlIHZhcmlvdXMgb3BlcmF0aW5nIG1vZGVzIChBUC9TVEEgZXRjKQogICovCi1pbnQgYXRoNWtfaHdfc2V0X29wbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUpCitpbnQKK2F0aDVrX2h3X3NldF9vcG1vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCXUzMiBwY3VfcmVnLCBiZWFjb25fcmVnLCBsb3dfaWQsIGhpZ2hfaWQ7CkBAIC04NzMsOCArOTM2LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXRoNWtfaHdfcGN1X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlLAotCQkJCQkJCQl1OCBtb2RlKQorLyoqCisgKiBhdGg1a19od19wY3VfaW5pdCgpIC0gSW5pdGlhbGl6ZSBQQ1UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBvcF9tb2RlOiBPbmUgb2YgZW51bSBubDgwMjExX2lmdHlwZQorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgUENVIGJ5IHNldHRpbmcgY3VycmVudAorICogb3BlcmF0aW9uIG1vZGUgYW5kIHZhcmlvdXMgb3RoZXIgc2V0dGluZ3MuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3BjdV9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSkKIHsKIAkvKiBTZXQgYnNzaWQgYW5kIGJzc2lkIG1hc2sgKi8KIAlhdGg1a19od19zZXRfYnNzaWQoYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCmluZGV4IDAxY2I3MmQuLmUxZjg2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogUEhZIGZ1bmN0aW9ucwotICoKICAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IFJleWsgRmxvZXRlciA8cmV5a0BvcGVuYnNkLm9yZz4KICAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA5IE5pY2sgS29zc2lmaWRpcyA8bWlja2ZsZW1tQGdtYWlsLmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CkBAIC0yMCw2ICsxOCwxMCBAQAogICoKICAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIFBIWSByZWxhdGVkIGZ1bmN0aW9ucyAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC0zMSwxNCArMzMsNTMgQEAKICNpbmNsdWRlICIuLi9yZWdkLmgiCiAKIAorLyoqCisgKiBET0M6IFBIWSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2UgaGFuZGxlIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYmFzZWJhbmQKKyAqIGFuZCBhbmFsb2cgZnJvbnRlbmQgKFJGKSBwYXJ0cy4gVGhpcyBpcyBieSBmYXIgdGhlIG1vc3QgY29tcGxleAorICogcGFydCBvZiB0aGUgaHcgY29kZSBzbyBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorICoKKyAqIEhlcmUgaXMgYSBsaXN0IG9mIHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQ6CisgKgorICogLSBDaGFubmVsIHNldHRpbmcvc3dpdGNoaW5nCisgKgorICogLSBBdXRvbWF0aWMgR2FpbiBDb250cm9sIChBR0MpIGNhbGlicmF0aW9uCisgKgorICogLSBOb2lzZSBGbG9vciBjYWxpYnJhdGlvbgorICoKKyAqIC0gSS9RIGltYmFsYW5jZSBjYWxpYnJhdGlvbiAoUUFNIGNvcnJlY3Rpb24pCisgKgorICogLSBDYWxpYnJhdGlvbiBkdWUgdG8gdGhlcm1hbCBjaGFuZ2VzIChnYWluX0YpCisgKgorICogLSBTcHVyIG5vaXNlIG1pdGlnYXRpb24KKyAqCisgKiAtIFJGL1BIWSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHZhcmlvdXMgb3BlcmF0aW5nIG1vZGVzIGFuZCBid21vZGVzCisgKgorICogLSBBbnRlbm5hIGNvbnRyb2wKKyAqCisgKiAtIFRYIHBvd2VyIGNvbnRyb2wgcGVyIGNoYW5uZWwvcmF0ZS9wYWNrZXQgdHlwZQorICoKKyAqIEFsc28gaGF2ZSBpbiBtaW5kIHdlIG5ldmVyIGdvdCBkb2N1bWVudGF0aW9uIGZvciBtb3N0IG9mIHRoZXNlCisgKiBmdW5jdGlvbnMsIHdoYXQgd2UgaGF2ZSBjb21lcyBtb3N0bHkgZnJvbSBBdGhlcm9zJ3MgY29kZSwgcmV2ZXJzZQorICogZW5naW5lZXJpbmcgYW5kIHBhdGVudCBkb2NzL3ByZXNlbnRhdGlvbnMgZXRjLgorICovCisKKwogLyoqKioqKioqKioqKioqKioqKlwKICogSGVscGVyIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogR2V0IHRoZSBQSFkgQ2hpcCByZXZpc2lvbgorLyoqCisgKiBhdGg1a19od19yYWRpb19yZXZpc2lvbigpIC0gR2V0IHRoZSBQSFkgQ2hpcCByZXZpc2lvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGJhbmQ6IE9uZSBvZiBlbnVtIGllZWU4MDIxMV9iYW5kCisgKgorICogUmV0dXJucyB0aGUgcmV2aXNpb24gbnVtYmVyIG9mIGEgMkdIeiwgNUdIeiBvciBzaW5nbGUgY2hpcAorICogcmFkaW8uCiAgKi8KLXUxNiBhdGg1a19od19yYWRpb19yZXZpc2lvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCit1MTYKK2F0aDVrX2h3X3JhZGlvX3JldmlzaW9uKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgc3JldjsKQEAgLTU4LDcgKzk5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbWRlbGF5KDIpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAogCS8qIC4uLndhaXQgdW50aWwgUEhZIGlzIHJlYWR5IGFuZCByZWFkIHRoZSBzZWxlY3RlZCByYWRpbyByZXZpc2lvbiAqLwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMHgwMDAwMWMxNiwgQVI1S19QSFkoMHgzNCkpOwpAQCAtODEsMTAgKzEyMiwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBDaGVjayBpZiBhIGNoYW5uZWwgaXMgc3VwcG9ydGVkCisvKioKKyAqIGF0aDVrX2NoYW5uZWxfb2soKSAtIENoZWNrIGlmIGEgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGh3CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBOb3RlOiBXZSBkb24ndCBkbyBhbnkgcmVndWxhdG9yeSBkb21haW4gY2hlY2tzIGhlcmUsIGl0J3MganVzdAorICogYSBzYW5pdHkgY2hlY2suCiAgKi8KLWJvb2wgYXRoNWtfY2hhbm5lbF9vayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCitib29sCithdGg1a19jaGFubmVsX29rKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1MTYgZnJlcSA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCkBAIC0xMDEsNyArMTQ4LDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIGF0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2Uoc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfY2hhbl9oYXNfc3B1cl9ub2lzZSgpIC0gQ2hlY2sgaWYgY2hhbm5lbCBpcyBzZW5zaXRpdmUgdG8gc3B1ciBub2lzZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKi8KK2Jvb2wKK2F0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2Uoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTggcmVmY2xrX2ZyZXE7CkBAIC0xMjIsMTEgKzE3NSwyMCBAQAogCQlyZXR1cm4gZmFsc2U7CiB9CiAKLS8qCi0gKiBVc2VkIHRvIG1vZGlmeSBSRiBCYW5rcyBiZWZvcmUgd3JpdGluZyB0aGVtIHRvIEFSNUtfUkZfQlVGRkVSCisvKioKKyAqIGF0aDVrX2h3X3JmYl9vcCgpIC0gUGVyZm9ybSBhbiBvcGVyYXRpb24gb24gdGhlIGdpdmVuIFJGIEJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHJmX3JlZ3M6IFRoZSBzdHJ1Y3QgYXRoNWtfcmZfcmVnCisgKiBAdmFsOiBOZXcgdmFsdWUKKyAqIEByZWdfaWQ6IFJGIHJlZ2lzdGVyIElECisgKiBAc2V0OiBJbmRpY2F0ZSB3ZSBuZWVkIHRvIHN3YXAgZGF0YQorICoKKyAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBtb2RpZnkgUkYgQmFua3MgYmVmb3JlCisgKiB3cml0aW5nIHRoZW0gdG8gQVI1S19SRl9CVUZGRVIuIENoZWNrIG91dCByZmJ1ZmZlci5oIGZvciBtb3JlCisgKiBpbmZvcy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhdGg1a19od19yZmJfb3Aoc3RydWN0IGF0aDVrX2h3ICphaCwKLQkJCQkJY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVncywKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2F0aDVrX2h3X3JmYl9vcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzLAogCQkJCQl1MzIgdmFsLCB1OCByZWdfaWQsIGJvb2wgc2V0KQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmcmVnID0gTlVMTDsKQEAgLTIwNCw4ICsyNjYsNyBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyAtIHNldCBPRkRNIHRpbWluZ3Mgb24gQVI1MjEyCi0gKgorICogYXRoNWtfaHdfd3JpdGVfb2ZkbV90aW1pbmdzKCkgLSBzZXQgT0ZETSB0aW1pbmdzIG9uIEFSNTIxMgogICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwogICogQGNoYW5uZWw6IHRoZSBjdXJyZW50bHkgc2V0IGNoYW5uZWwgdXBvbiByZXNldAogICoKQEAgLTIxNiwxMCArMjc3LDExIEBACiAgKiBtYW50aXNzYSBhbmQgcHJvdmlkZSB0aGVzZSB2YWx1ZXMgb24gaHcuCiAgKgogICogRm9yIG1vcmUgaW5mb3MgaSB0aGluayB0aGlzIHBhdGVudCBpcyByZWxhdGVkCi0gKiBodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83MTg0NDk1Lmh0bWwKKyAqICJodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83MTg0NDk1Lmh0bWwiCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyBpbmxpbmUgaW50CithdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJLyogR2V0IGV4cG9uZW50IGFuZCBtYW50aXNzYSBhbmQgc2V0IGl0ICovCiAJdTMyIGNvZWZfc2NhbGVkLCBjb2VmX2V4cCwgY29lZl9tYW4sCkBAIC0yNzgsNiArMzQwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogYXRoNWtfaHdfcGh5X2Rpc2FibGUoKSAtIERpc2FibGUgUEhZCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KIGludCBhdGg1a19od19waHlfZGlzYWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCS8qSnVzdCBhIHRyeSBNLkYuKi8KQEAgLTI4NiwxMCArMzUyLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBXYWl0IGZvciBzeW50aCB0byBzZXR0bGUKKy8qKgorICogYXRoNWtfaHdfd2FpdF9mb3Jfc3ludGgoKSAtIFdhaXQgZm9yIHN5bnRoIHRvIHNldHRsZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3dhaXRfZm9yX3N5bnRoKHN0cnVjdCBhdGg1a19odyAqYWgsCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfd2FpdF9mb3Jfc3ludGgoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAkvKgpAQCAtMzA4LDkgKzM3Nyw5IEBACiAJCQlkZWxheSA9IGRlbGF5IDw8IDI7CiAJCS8qIFhYWDogLzIgb24gdHVyYm8gPyBMZXQncyBiZSBzYWZlCiAJCSAqIGZvciBub3cgKi8KLQkJdWRlbGF5KDEwMCArIGRlbGF5KTsKKwkJdXNsZWVwX3JhbmdlKDEwMCArIGRlbGF5LCAxMDAgKyAoMiAqIGRlbGF5KSk7CiAJfSBlbHNlIHsKLQkJbWRlbGF5KDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAJfQogfQogCkBAIC0zMTksNyArMzg4LDkgQEAKICogUkYgR2FpbiBvcHRpbWl6YXRpb24gKgogXCoqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCisvKioKKyAqIERPQzogUkYgR2FpbiBvcHRpbWl6YXRpb24KKyAqCiAgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBvcHRpbWl6ZSBSRiBnYWluIG9uIGRpZmZlcmVudCBlbnZpcm9ubWVudHMKICAqICh0ZW1wZXJhdHVyZSBtb3N0bHkpIGJhc2VkIG9uIGZlZWRiYWNrIGZyb20gYSBwb3dlciBkZXRlY3Rvci4KICAqCkBAIC0zMjgsMjIgKzM5OSwyMiBAQAogICogbm8gZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyLS4KICAqCiAgKiBGb3IgbW9yZSBpbmZvcyBjaGVjayBvdXQgdGhpcyBwYXRlbnQgZG9jCi0gKiBodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83NDAwNjkxLmh0bWwKKyAqICJodHRwOi8vd3d3LmZyZWVwYXRlbnRzb25saW5lLmNvbS83NDAwNjkxLmh0bWwiCiAgKgogICogVGhpcyBwYXBlciBkZXNjcmliZXMgcG93ZXIgZHJvcHMgYXMgc2VlbiBvbiB0aGUgcmVjZWl2ZXIgZHVlIHRvCiAgKiBwcm9iZSBwYWNrZXRzCi0gKiBodHRwOi8vd3d3LmNucmkuZGl0LmllL3B1YmxpY2F0aW9ucy9JQ1QwOCUyMC0lMjBQcmFjdGljYWwlMjBJc3N1ZXMKLSAqICUyMG9mJTIwUG93ZXIlMjBDb250cm9sLnBkZgorICogImh0dHA6Ly93d3cuY25yaS5kaXQuaWUvcHVibGljYXRpb25zL0lDVDA4JTIwLSUyMFByYWN0aWNhbCUyMElzc3VlcworICogJTIwb2YlMjBQb3dlciUyMENvbnRyb2wucGRmIgogICoKICAqIEFuZCB0aGlzIGlzIHRoZSBNYWRXaUZpIGJ1ZyBlbnRyeSByZWxhdGVkIHRvIHRoZSBhYm92ZQotICogaHR0cDovL21hZHdpZmktcHJvamVjdC5vcmcvdGlja2V0LzE2NTkKKyAqICJodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy90aWNrZXQvMTY1OSIKICAqIHdpdGggdmFyaW91cyBtZWFzdXJlbWVudHMgYW5kIGRpYWdyYW1zCi0gKgotICogVE9ETzogRGVhbCB3aXRoIHBvd2VyIGRyb3BzIGR1ZSB0byBwcm9iZXMgYnkgc2V0dGluZyBhbiBhcHByb3ByaWF0ZQotICogdHggcG93ZXIgb24gdGhlIHByb2JlIHBhY2tldHMgISBNYWtlIHRoaXMgcGFydCBvZiB0aGUgY2FsaWJyYXRpb24gcHJvY2Vzcy4KICAqLwogCi0vKiBJbml0aWFsaXplIGFoX2dhaW4gZHVyaW5nIGF0dGFjaCAqLworLyoqCisgKiBhdGg1a19od19yZmdhaW5fb3B0X2luaXQoKSAtIEluaXRpYWxpemUgYWhfZ2FpbiBkdXJpbmcgYXR0YWNoCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KIGludCBhdGg1a19od19yZmdhaW5fb3B0X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKiBJbml0aWFsaXplIHRoZSBnYWluIG9wdGltaXphdGlvbiB2YWx1ZXMgKi8KQEAgLTM2NywxNyArNDM4LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNjaGVkdWxlIGEgZ2FpbiBwcm9iZSBjaGVjayBvbiB0aGUgbmV4dCB0cmFuc21pdHRlZCBwYWNrZXQuCisvKioKKyAqIGF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKCkgLSBSZXF1ZXN0IGEgUEFQRCBwcm9iZSBwYWNrZXQKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBTY2hlZHVsZXMgYSBnYWluIHByb2JlIGNoZWNrIG9uIHRoZSBuZXh0IHRyYW5zbWl0dGVkIHBhY2tldC4KICAqIFRoYXQgbWVhbnMgb3VyIG5leHQgcGFja2V0IGlzIGdvaW5nIHRvIGJlIHNlbnQgd2l0aCBsb3dlcgogICogdHggcG93ZXIgYW5kIGEgUGVhayB0byBBdmVyYWdlIFBvd2VyIERldGVjdG9yIChQQVBEKSB3aWxsIHRyeQogICogdG8gbWVhc3VyZSB0aGUgZ2Fpbi4KICAqCi0gKiBYWFg6ICBIb3cgYWJvdXQgZm9yY2luZyBhIHR4IHBhY2tldCAoYnlwYXNzaW5nIFBDVSBhcmJpdHJhdG9yIGV0YykKKyAqIFRPRE86IEZvcmNlIGEgdHggcGFja2V0IChieXBhc3NpbmcgUENVIGFyYml0cmF0b3IgZXRjKQogICoganVzdCBhZnRlciB3ZSBlbmFibGUgdGhlIHByb2JlIHNvIHRoYXQgd2UgZG9uJ3QgbWVzcyB3aXRoCi0gKiBzdGFuZGFyZCB0cmFmZmljID8gTWF5YmUgaXQncyB0aW1lIHRvIHVzZSBzdyBpbnRlcnJ1cHRzIGFuZAotICogYSBwcm9iZSB0YXNrbGV0ICEhIQorICogc3RhbmRhcmQgdHJhZmZpYy4KICAqLwotc3RhdGljIHZvaWQgYXRoNWtfaHdfcmVxdWVzdF9yZmdhaW5fcHJvYmUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3N0YXRpYyB2b2lkCithdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCiAJLyogU2tpcCBpZiBnYWluIGNhbGlicmF0aW9uIGlzIGluYWN0aXZlIG9yCkBAIC0zOTUsOSArNDcwLDE1IEBACiAKIH0KIAotLyogQ2FsY3VsYXRlIGdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCi0gKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGVwIGZvciBSRjUxMTIgcmV2LiAyICovCi1zdGF0aWMgdTMyIGF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoc3RydWN0IGF0aDVrX2h3ICphaCkKKy8qKgorICogYXRoNWtfaHdfcmZfZ2FpbmZfY29ycigpIC0gQ2FsY3VsYXRlIEdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogQ2FsY3VsYXRlIEdhaW5fRiBtZWFzdXJlbWVudCBjb3JyZWN0aW9uCisgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGVwIGZvciBSRjUxMTIgcmV2LiAyCisgKi8KK3N0YXRpYyB1MzIKK2F0aDVrX2h3X3JmX2dhaW5mX2NvcnIoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgbWl4LCBzdGVwOwogCXUzMiAqcmY7CkBAIC00NTAsMTEgKzUzMSwxOSBAQAogCXJldHVybiBhaC0+YWhfZ2Fpbi5nX2ZfY29ycjsKIH0KIAotLyogQ2hlY2sgaWYgY3VycmVudCBnYWluX0YgbWVhc3VyZW1lbnQgaXMgaW4gdGhlIHJhbmdlIG9mIG91cgorLyoqCisgKiBhdGg1a19od19yZl9jaGVja19nYWluZl9yZWFkYmFjaygpIC0gVmFsaWRhdGUgR2Fpbl9GIGZlZWRiYWNrIGZyb20gZGV0ZWN0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBDaGVjayBpZiBjdXJyZW50IGdhaW5fRiBtZWFzdXJlbWVudCBpcyBpbiB0aGUgcmFuZ2Ugb2Ygb3VyCiAgKiBwb3dlciBkZXRlY3RvciB3aW5kb3dzLiBJZiB3ZSBnZXQgYSBtZWFzdXJlbWVudCBvdXRzaWRlIHJhbmdlCiAgKiB3ZSBrbm93IGl0J3Mgbm90IGFjY3VyYXRlIChkZXRlY3RvcnMgY2FuJ3QgbWVhc3VyZSBhbnl0aGluZyBvdXRzaWRlCi0gKiB0aGVpciBkZXRlY3Rpb24gd2luZG93KSBzbyB3ZSBtdXN0IGlnbm9yZSBpdCAqLwotc3RhdGljIGJvb2wgYXRoNWtfaHdfcmZfY2hlY2tfZ2FpbmZfcmVhZGJhY2soc3RydWN0IGF0aDVrX2h3ICphaCkKKyAqIHRoZWlyIGRldGVjdGlvbiB3aW5kb3cpIHNvIHdlIG11c3QgaWdub3JlIGl0LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiByZWFkYmFjayB3YXMgTy5LLiBvciBmYWxzZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBib29sCithdGg1a19od19yZl9jaGVja19nYWluZl9yZWFkYmFjayhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmX3JlZ3M7CiAJdTMyIHN0ZXAsIG1peF9vdnIsIGxldmVsWzRdOwpAQCAtNTA2LDkgKzU5NSwxNSBAQAogCQkJYWgtPmFoX2dhaW4uZ19jdXJyZW50IDw9IGxldmVsWzNdKTsKIH0KIAotLyogUGVyZm9ybSBnYWluX0YgYWRqdXN0bWVudCBieSBjaG9vc2luZyB0aGUgcmlnaHQgc2V0Ci0gKiBvZiBwYXJhbWV0ZXJzIGZyb20gUkYgZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyICovCi1zdGF0aWMgczggYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X3JmX2dhaW5mX2FkanVzdCgpIC0gUGVyZm9ybSBHYWluX0YgYWRqdXN0bWVudAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIENob29zZSB0aGUgcmlnaHQgdGFyZ2V0IGdhaW4gYmFzZWQgb24gY3VycmVudCBnYWluCisgKiBhbmQgUkYgZ2FpbiBvcHRpbWl6YXRpb24gbGFkZGVyCisgKi8KK3N0YXRpYyBzOAorYXRoNWtfaHdfcmZfZ2FpbmZfYWRqdXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0ICpnbzsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCAqZ19zdGVwOwpAQCAtNTcyLDEzICs2NjcsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBNYWluIGNhbGxiYWNrIGZvciB0aGVybWFsIFJGIGdhaW4gY2FsaWJyYXRpb24gZW5naW5lCisvKioKKyAqIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZSgpIC0gRG8gYSBnYWluX0YgY2FsaWJyYXRpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBNYWluIGNhbGxiYWNrIGZvciB0aGVybWFsIFJGIGdhaW4gY2FsaWJyYXRpb24gZW5naW5lCiAgKiBDaGVjayBmb3IgYSBuZXcgZ2FpbiByZWFkaW5nIGFuZCBzY2hlZHVsZSBhbiBhZGp1c3RtZW50CiAgKiBpZiBuZWVkZWQuCiAgKgotICogVE9ETzogVXNlIHN3IGludGVycnVwdCB0byBzY2hlZHVsZSByZXNldCBpZiBnYWluX0YgbmVlZHMKLSAqIGFkanVzdG1lbnQgKi8KLWVudW0gYXRoNWtfcmZnYWluIGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorICogUmV0dXJucyBvbmUgb2YgZW51bSBhdGg1a19yZmdhaW4gY29kZXMKKyAqLworZW51bSBhdGg1a19yZmdhaW4KK2F0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXUzMiBkYXRhLCB0eXBlOwogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwpAQCAtNjM4LDEwICs3MzgsMTggQEAKIAlyZXR1cm4gYWgtPmFoX2dhaW4uZ19zdGF0ZTsKIH0KIAotLyogV3JpdGUgaW5pdGlhbCBSRiBnYWluIHRhYmxlIHRvIHNldCB0aGUgUkYgc2Vuc2l0aXZpdHkKLSAqIHRoaXMgb25lIHdvcmtzIG9uIGFsbCBSRiBjaGlwcyBhbmQgaGFzIG5vdGhpbmcgdG8gZG8KLSAqIHdpdGggZ2Fpbl9GIGNhbGlicmF0aW9uICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmZ2Fpbl9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKKy8qKgorICogYXRoNWtfaHdfcmZnYWluX2luaXQoKSAtIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiBzZXR0aW5ncyB0byBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGJhbmQ6IE9uZSBvZiBlbnVtIGllZWU4MDIxMV9iYW5kCisgKgorICogV3JpdGUgaW5pdGlhbCBSRiBnYWluIHRhYmxlIHRvIHNldCB0aGUgUkYgc2Vuc2l0aXZpdHkuCisgKgorICogTk9URTogVGhpcyBvbmUgd29ya3Mgb24gYWxsIFJGIGNoaXBzIGFuZCBoYXMgbm90aGluZyB0byBkbworICogd2l0aCBHYWluX0YgY2FsaWJyYXRpb24KKyAqLworc3RhdGljIGludAorYXRoNWtfaHdfcmZnYWluX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZnYWluICphdGg1a19yZmc7CiAJdW5zaWduZWQgaW50IGksIHNpemUsIGluZGV4OwpAQCAtNjg4LDE2ICs3OTYsMjMgQEAKIH0KIAogCi0KIC8qKioqKioqKioqKioqKioqKioqKlwKICogUkYgUmVnaXN0ZXJzIHNldHVwICoKIFwqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFNldHVwIFJGIHJlZ2lzdGVycyBieSB3cml0aW5nIFJGIGJ1ZmZlciBvbiBodworLyoqCisgKiBhdGg1a19od19yZnJlZ3NfaW5pdCgpIC0gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciBzZXR0aW5ncworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqCisgKiBTZXR1cCBSRiByZWdpc3RlcnMgYnkgd3JpdGluZyBSRiBidWZmZXIgb24gaHcuIEZvcgorICogbW9yZSBpbmZvcyBvbiB0aGlzLCBjaGVjayBvdXQgcmZidWZmZXIuaAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmcmVnc19pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsCi0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmcmVnc19pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQl1bnNpZ25lZCBpbnQgbW9kZSkKIHsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzOwogCWNvbnN0IHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgKmluaV9yZmI7CkBAIC0xMDU1LDE5ICsxMTcwLDE4IEBACiAgIFBIWS9SRiBjaGFubmVsIGZ1bmN0aW9ucwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogQ29udmVyc2lvbiBuZWVkZWQgZm9yIFJGNTExMAorLyoqCisgKiBhdGg1a19od19yZjUxMTBfY2hhbjJhdGhjaGFuKCkgLSBDb252ZXJ0IGNoYW5uZWwgZnJlcSBvbiBSRjUxMTAKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIE1hcCBjaGFubmVsIGZyZXF1ZW5jeSB0byBJRUVFIGNoYW5uZWwgbnVtYmVyIGFuZCBjb252ZXJ0IGl0CisgKiB0byBhbiBpbnRlcm5hbCBjaGFubmVsIHZhbHVlIHVzZWQgYnkgdGhlIFJGNTExMCBjaGlwc2V0LgogICovCi1zdGF0aWMgdTMyIGF0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQorc3RhdGljIHUzMgorYXRoNWtfaHdfcmY1MTEwX2NoYW4yYXRoY2hhbihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIGF0aGNoYW47CiAKLQkvKgotCSAqIENvbnZlcnQgSUVFRSBjaGFubmVsL01IeiB0byBhbiBpbnRlcm5hbCBjaGFubmVsIHZhbHVlIHVzZWQKLQkgKiBieSB0aGUgQVI1MjEwIGNoaXBzZXQuIFRoaXMgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIHdpdGgKLQkgKiBuZXdlciBjaGlwc2V0cyBsaWtlIHRoZSBBUjUyMTJBIHdobyBoYXZlIGEgY29tcGxldGVseQotCSAqIGRpZmZlcmVudCBSRi9QSFkgcGFydC4KLQkgKi8KIAlhdGhjaGFuID0gKGF0aDVrX2h3X2JpdHN3YXAoCiAJCQkoaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAogCQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKSAtIDI0KSAvIDIsIDUpCkBAIC0xMDc1LDEwICsxMTg5LDEzIEBACiAJcmV0dXJuIGF0aGNoYW47CiB9CiAKLS8qCi0gKiBTZXQgY2hhbm5lbCBvbiBSRjUxMTAKKy8qKgorICogYXRoNWtfaHdfcmY1MTEwX2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiBSRjUxMTAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMF9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMTBfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIGRhdGE7CkBAIC0xMDg5LDE1ICsxMjA2LDIzIEBACiAJZGF0YSA9IGF0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oY2hhbm5lbCk7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhLCBBUjVLX1JGX0JVRkZFUik7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX1JGX0JVRkZFUl9DT05UUk9MXzApOwotCW1kZWxheSgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIENvbnZlcnNpb24gbmVlZGVkIGZvciA1MTExCisvKioKKyAqIGF0aDVrX2h3X3JmNTExMV9jaGFuMmF0aGNoYW4oKSAtIEhhbmRsZSAyR0h6IGNoYW5uZWxzIG9uIFJGNTExMS8yMTExCisgKiBAaWVlZTogSUVFRSBjaGFubmVsIG51bWJlcgorICogQGF0aGNoYW46IFRoZSAmc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoegorICoKKyAqIEluIG9yZGVyIHRvIGVuYWJsZSB0aGUgUkYyMTExIGZyZXF1ZW5jeSBjb252ZXJ0ZXIgb24gUkY1MTExLzIxMTEgc2V0dXBzCisgKiB3ZSBuZWVkIHRvIGFkZCBzb21lIG9mZnNldHMgYW5kIGV4dHJhIGZsYWdzIHRvIHRoZSBkYXRhIHZhbHVlcyB3ZSBwYXNzCisgKiBvbiB0byB0aGUgUEhZLiBTbyBmb3IgZXZlcnkgMkdIeiBjaGFubmVsIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKKyAqIHRvIGRvIHRoZSBjb252ZXJzaW9uLgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMV9jaGFuMmF0aGNoYW4odW5zaWduZWQgaW50IGllZWUsCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMTFfY2hhbjJhdGhjaGFuKHVuc2lnbmVkIGludCBpZWVlLAogCQlzdHJ1Y3QgYXRoNWtfYXRoY2hhbl8yZ2h6ICphdGhjaGFuKQogewogCWludCBjaGFubmVsOwpAQCAtMTEyMywxMCArMTI0OCwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IGNoYW5uZWwgb24gNTExMQorLyoqCisgKiBhdGg1a19od19yZjUxMTFfY2hhbm5lbCgpIC0gU2V0IGNoYW5uZWwgZnJlcXVlbmN5IG9uIFJGNTExMS8yMTExCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjUxMTFfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTExX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHogYXRoNWtfY2hhbm5lbF8yZ2h6OwpAQCAtMTE3MSwxMCArMTI5OSwyMCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IGNoYW5uZWwgb24gNTExMiBhbmQgbmV3ZXIKKy8qKgorICogYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiA1MTEyIGFuZCBuZXdlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogT24gUkY1MTEyLzIxMTIgYW5kIG5ld2VyIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IGNvbnZlcnNpb24uCisgKiBXZSBwYXNzIHRoZSBmcmVxdWVuY3kgdmFsdWUgYWZ0ZXIgYSBmZXcgbW9kaWZpY2F0aW9ucyB0byB0aGUKKyAqIGNoaXAgZGlyZWN0bHkuCisgKgorICogTk9URTogTWFrZSBzdXJlIGNoYW5uZWwgZnJlcXVlbmN5IGdpdmVuIGlzIHdpdGhpbiBvdXIgcmFuZ2Ugb3IgZWxzZQorICogd2UgbWlnaHQgZGFtYWdlIHRoZSBjaGlwICEgVXNlIGF0aDVrX2NoYW5uZWxfb2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBvbmUuCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTEyX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmNTExMl9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1MzIgZGF0YSwgZGF0YTAsIGRhdGExLCBkYXRhMjsKQEAgLTExODMsMTcgKzEzMjEsMzcgQEAKIAlkYXRhID0gZGF0YTAgPSBkYXRhMSA9IGRhdGEyID0gMDsKIAljID0gY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CiAKKwkvKiBNeSBndWVzcyBiYXNlZCBvbiBjb2RlOgorCSAqIDJHSHogUkYgaGFzIDIgc3ludGggbW9kZXMsIG9uZSB3aXRoIGEgTG9jYWwgT3NjaWxsYXRvcgorCSAqIGF0IDIyMjRIeiBhbmQgb25lIHdpdGggYSBMTyBhdCAyMTkySHouIElGIGlzIDE1MjBIegorCSAqICgzMDQwLzIpLiBkYXRhMCBpcyB1c2VkIHRvIHNldCB0aGUgUExMIGRpdmlkZXIgYW5kIGRhdGExCisJICogc2VsZWN0cyBzeW50aCBtb2RlLiAqLwogCWlmIChjIDwgNDgwMCkgeworCQkvKiBDaGFubmVsIDE0IGFuZCBhbGwgZnJlcXVlbmNpZXMgd2l0aCAySHogc3BhY2luZworCQkgKiBiZWxvdy9hYm92ZSAobm9uLXN0YW5kYXJkIGNoYW5uZWxzKSAqLwogCQlpZiAoISgoYyAtIDIyMjQpICUgNSkpIHsKKwkJCS8qIFNhbWUgYXMgKGMgLSAyMjI0KSAvIDUgKi8KIAkJCWRhdGEwID0gKCgyICogKGMgLSA3MDQpKSAtIDMwNDApIC8gMTA7CiAJCQlkYXRhMSA9IDE7CisJCS8qIENoYW5uZWwgMSBhbmQgYWxsIGZyZXF1ZW5jaWVzIHdpdGggNUh6IHNwYWNpbmcKKwkJICogYmVsb3cvYWJvdmUgKHN0YW5kYXJkIGNoYW5uZWxzIHdpdGhvdXQgY2hhbm5lbCAxNCkgKi8KIAkJfSBlbHNlIGlmICghKChjIC0gMjE5MikgJSA1KSkgeworCQkJLyogU2FtZSBhcyAoYyAtIDIxOTIpIC8gNSAqLwogCQkJZGF0YTAgPSAoKDIgKiAoYyAtIDY3MikpIC0gMzA0MCkgLyAxMDsKIAkJCWRhdGExID0gMDsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlkYXRhMCA9IGF0aDVrX2h3X2JpdHN3YXAoKGRhdGEwIDw8IDIpICYgMHhmZiwgOCk7CisJLyogVGhpcyBpcyBtb3JlIGNvbXBsZXgsIHdlIGhhdmUgYSBzaW5nbGUgc3ludGhlc2l6ZXIgd2l0aAorCSAqIDQgcmVmZXJlbmNlIGNsb2NrIHNldHRpbmdzICg/KSBiYXNlZCBvbiBmcmVxdWVuY3kgc3BhY2luZworCSAqIGFuZCBzZXQgdXNpbmcgZGF0YTIuIExPIGlzIGF0IDQ4MDBIeiBhbmQgZGF0YTAgaXMgYWdhaW4gdXNlZAorCSAqIHRvIHNldCBzb21lIGRpdmlkZXIuCisJICoKKwkgKiBOT1RFOiBUaGVyZSBpcyBhbiBvbGQgYXRoZXJvcyBwcmVzZW50YXRpb24gYXQgU3RhbmZvcmQKKwkgKiB0aGF0IG1lbnRpb25zIGEgbWV0aG9kIGNhbGxlZCBkdWFsIGRpcmVjdCBjb252ZXJzaW9uCisJICogd2l0aCAxR0h6IHNsaWRpbmcgSUYgZm9yIFJGNTExMC4gTWF5YmUgdGhhdCdzIHdoYXQgd2UKKwkgKiBoYXZlIGhlcmUsIG9yIGFuIHVwZGF0ZWQgdmVyc2lvbi4gKi8KIAl9IGVsc2UgaWYgKChjICUgNSkgIT0gMiB8fCBjID4gNTQzNSkgewogCQlpZiAoIShjICUgMjApICYmIGMgPj0gNTEyMCkgewogCQkJZGF0YTAgPSBhdGg1a19od19iaXRzd2FwKCgoYyAtIDQ4MDApIC8gMjAgPDwgMiksIDgpOwpAQCAtMTIxOSwxMCArMTM3NywxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IHRoZSBjaGFubmVsIG9uIHRoZSBSRjI0MjUKKy8qKgorICogYXRoNWtfaHdfcmYyNDI1X2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiBSRjI0MjUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIEFSMjQyNS8yNDE3IGhhdmUgYSBkaWZmZXJlbnQgMkdIeiBSRiBzbyBjb2RlIGNoYW5nZXMKKyAqIGEgbGl0dGxlIGJpdCBmcm9tIFJGNTExMi4KICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjI0MjVfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmYyNDI1X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXUzMiBkYXRhLCBkYXRhMCwgZGF0YTI7CkBAIC0xMjU4LDEwICsxNDIyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTZXQgYSBjaGFubmVsIG9uIHRoZSByYWRpbyBjaGlwCisvKioKKyAqIGF0aDVrX2h3X2NoYW5uZWwoKSAtIFNldCBhIGNoYW5uZWwgb24gdGhlIHJhZGlvIGNoaXAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gY2FsbGVkIHRvIHNldCBhIGNoYW5uZWwgb24gdGhlCisgKiByYWRpbyBjaGlwIGJhc2VkIG9uIHRoZSByYWRpbyBjaGlwIHZlcnNpb24uCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJaW50IHJldDsKQEAgLTEzMTMsMTEgKzE0ODMsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKipcCiAgIFBIWSBjYWxpYnJhdGlvbgogXCoqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgczMyIGF0aDVrX2h3X3JlYWRfbWVhc3VyZWRfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKKy8qKgorICogRE9DOiBQSFkgQ2FsaWJyYXRpb24gcm91dGluZXMKKyAqCisgKiBOb2lzZSBmbG9vciBjYWxpYnJhdGlvbjogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0bworICogcGVyZm9ybSBhIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uIGJ5IHNldHRpbmcgdGhlCisgKiBBUjVLX1BIWV9BR0NDVExfTkYgYml0IG9uIEFSNUtfUEhZX0FHQ0NUTCwgaXQgd2lsbCBwZXJpb2RpY2FsbHkKKyAqIHNhbXBsZS1hbmQtaG9sZCB0aGUgbWluaW11bSBub2lzZSBsZXZlbCBzZWVuIGF0IHRoZSBhbnRlbm5hcy4KKyAqIFRoaXMgdmFsdWUgaXMgdGhlbiBzdG9yZWQgaW4gYSByaW5nIGJ1ZmZlciBvZiByZWNlbnRseSBtZWFzdXJlZAorICogbm9pc2UgZmxvb3IgdmFsdWVzIHNvIHdlIGhhdmUgYSBtb3Zpbmcgd2luZG93IG9mIHRoZSBsYXN0IGZldworICogc2FtcGxlcy4gVGhlIG1lZGlhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBoaXN0b3J5IGlzIHRoZW4gbG9hZGVkCisgKiBpbnRvIHRoZSBoYXJkd2FyZSBmb3IgaXRzIG93biB1c2UgZm9yIFJTU0kgYW5kIENDQSBtZWFzdXJlbWVudHMuCisgKiBUaGlzIHR5cGUgb2YgY2FsaWJyYXRpb24gZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0cmFmZmljLgorICoKKyAqIEFHQyBjYWxpYnJhdGlvbjogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0byBwZXJmb3JtCisgKiBhbiBBR0MgKEF1dG9tYXRpYyBHYWluIENvbnRyb2wpIGNhbGlicmF0aW9uIGJ5IHNldHRpbmcgdGhlCisgKiBBUjVLX1BIWV9BR0NDVExfQ0FMLCBodyBkaXNjb25uZWN0cyB0aGUgYW50ZW5uYXMgYW5kIGRvZXMKKyAqIGEgY2FsaWJyYXRpb24gb24gdGhlIERDIG9mZnNldHMgb2YgQURDcy4gRHVyaW5nIHRoaXMgcGVyaW9kCisgKiByeC90eCBnZXRzIGRpc2FibGVkIHNvIHdlIGhhdmUgdG8gZGVhbCB3aXRoIGl0IG9uIHRoZSBkcml2ZXIKKyAqIHBhcnQuCisgKgorICogSS9RIGNhbGlicmF0aW9uOiBXaGVuIHdlIHRlbGwgdGhlIGhhcmR3YXJlIHRvIHBlcmZvcm0KKyAqIGFuIEkvUSBjYWxpYnJhdGlvbiwgaXQgdHJpZXMgdG8gY29ycmVjdCBJL1EgaW1iYWxhbmNlIGFuZAorICogZml4IFFBTSBjb25zdGVsbGF0aW9uIGJ5IHNhbXBsaW5nIGRhdGEgZnJvbSByeGVkIGZyYW1lcy4KKyAqIEl0IGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdHJhZmZpYy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcyBvbiBBR0MgYW5kIEkvUSBjYWxpYnJhdGlvbiBjaGVjayBvdXQgcGF0ZW50IGRvYworICogIzAzLzA5NDQ2My4KKyAqLworCisvKioKKyAqIGF0aDVrX2h3X3JlYWRfbWVhc3VyZWRfbm9pc2VfZmxvb3IoKSAtIFJlYWQgbWVhc3VyZWQgTkYgZnJvbSBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCitzdGF0aWMgczMyCithdGg1a19od19yZWFkX21lYXN1cmVkX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJczMyIHZhbDsKIApAQCAtMTMyNSw3ICsxNTMwLDEyIEBACiAJcmV0dXJuIHNpZ25fZXh0ZW5kMzIoQVI1S19SRUdfTVModmFsLCBBUjVLX1BIWV9ORl9NSU5DQ0FfUFdSKSwgOCk7CiB9CiAKLXZvaWQgYXRoNWtfaHdfaW5pdF9uZmNhbF9oaXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X2luaXRfbmZjYWxfaGlzdCgpIC0gSW5pdGlhbGl6ZSBORiBjYWxpYnJhdGlvbiBoaXN0b3J5IGJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCit2b2lkCithdGg1a19od19pbml0X25mY2FsX2hpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlpbnQgaTsKIApAQCAtMTMzNCw2ICsxNTQ0LDExIEBACiAJCWFoLT5haF9uZmNhbF9oaXN0Lm5mdmFsW2ldID0gQVI1S19UVU5FX0NDQV9NQVhfR09PRF9WQUxVRTsKIH0KIAorLyoqCisgKiBhdGg1a19od191cGRhdGVfbmZjYWxfaGlzdCgpIC0gVXBkYXRlIE5GIGNhbGlicmF0aW9uIGhpc3RvcnkgYnVmZmVyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbm9pc2VfZmxvb3I6IFRoZSBORiB3ZSBnb3QgZnJvbSBodworICovCiBzdGF0aWMgdm9pZCBhdGg1a19od191cGRhdGVfbmZjYWxfaGlzdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzMTYgbm9pc2VfZmxvb3IpCiB7CiAJc3RydWN0IGF0aDVrX25mY2FsX2hpc3QgKmhpc3QgPSAmYWgtPmFoX25mY2FsX2hpc3Q7CkBAIC0xMzQxLDcgKzE1NTYsMTIgQEAKIAloaXN0LT5uZnZhbFtoaXN0LT5pbmRleF0gPSBub2lzZV9mbG9vcjsKIH0KIAotc3RhdGljIHMxNiBhdGg1a19od19nZXRfbWVkaWFuX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X2dldF9tZWRpYW5fbm9pc2VfZmxvb3IoKSAtIEdldCBtZWRpYW4gTkYgZnJvbSBoaXN0b3J5IGJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCitzdGF0aWMgczE2CithdGg1a19od19nZXRfbWVkaWFuX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJczE2IHNvcnRbQVRINUtfTkZfQ0FMX0hJU1RfTUFYXTsKIAlzMTYgdG1wOwpAQCAtMTM2NCwxOCArMTU4NCwxNiBAQAogCXJldHVybiBzb3J0WyhBVEg1S19ORl9DQUxfSElTVF9NQVggLSAxKSAvIDJdOwogfQogCi0vKgotICogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0byBwZXJmb3JtIGEgbm9pc2UgZmxvb3IgY2FsaWJyYXRpb24KLSAqIGJ5IHNldHRpbmcgdGhlIEFSNUtfUEhZX0FHQ0NUTF9ORiBiaXQsIGl0IHdpbGwgcGVyaW9kaWNhbGx5Ci0gKiBzYW1wbGUtYW5kLWhvbGQgdGhlIG1pbmltdW0gbm9pc2UgbGV2ZWwgc2VlbiBhdCB0aGUgYW50ZW5uYXMuCi0gKiBUaGlzIHZhbHVlIGlzIHRoZW4gc3RvcmVkIGluIGEgcmluZyBidWZmZXIgb2YgcmVjZW50bHkgbWVhc3VyZWQKLSAqIG5vaXNlIGZsb29yIHZhbHVlcyBzbyB3ZSBoYXZlIGEgbW92aW5nIHdpbmRvdyBvZiB0aGUgbGFzdCBmZXcKLSAqIHNhbXBsZXMuCisvKioKKyAqIGF0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcigpIC0gVXBkYXRlIE5GIG9uIGhhcmR3YXJlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgotICogVGhlIG1lZGlhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBoaXN0b3J5IGlzIHRoZW4gbG9hZGVkIGludG8gdGhlCi0gKiBoYXJkd2FyZSBmb3IgaXRzIG93biB1c2UgZm9yIFJTU0kgYW5kIENDQSBtZWFzdXJlbWVudHMuCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHdlIGNhbGwgdG8gcGVyZm9ybSBhIE5GIGNhbGlicmF0aW9uLAorICogaXQgcmVhZHMgTkYgZnJvbSBoYXJkd2FyZSwgY2FsY3VsYXRlcyB0aGUgbWVkaWFuIGFuZCB1cGRhdGVzCisgKiBORiBvbiBody4KICAqLwotdm9pZCBhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwogCXUzMiB2YWw7CkBAIC0xMzkwLDYgKzE2MDgsOCBAQAogCQlyZXR1cm47CiAJfQogCisJYWgtPmFoX2NhbF9tYXNrIHw9IEFSNUtfQ0FMSUJSQVRJT05fTkY7CisKIAllZV9tb2RlID0gYXRoNWtfZWVwcm9tX21vZGVfZnJvbV9jaGFubmVsKGFoLT5haF9jdXJyZW50X2NoYW5uZWwpOwogCiAJLyogY29tcGxldGVkIE5GIGNhbGlicmF0aW9uLCB0ZXN0IHRocmVzaG9sZCAqLwpAQCAtMTQzNCwyMCArMTY1NCwyOSBAQAogCiAJYWgtPmFoX25vaXNlX2Zsb29yID0gbmY7CiAKKwlhaC0+YWhfY2FsX21hc2sgJj0gfkFSNUtfQ0FMSUJSQVRJT05fTkY7CisKIAlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKIAkJIm5vaXNlIGZsb29yIGNhbGlicmF0ZWQ6ICVkXG4iLCBuZik7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uIG9uIFJGNTExMAotICogLUZpeCBCUFNLL1FBTSBDb25zdGVsbGF0aW9uIChJL1EgY29ycmVjdGlvbikKKy8qKgorICogYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZSgpIC0gUGVyZm9ybSBhIFBIWSBjYWxpYnJhdGlvbiBvbiBSRjUxMTAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIERvIGEgY29tcGxldGUgUEhZIGNhbGlicmF0aW9uIChBR0MgKyBORiArIEkvUSkgb24gUkY1MTEwCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTEwX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIHBoeV9zaWcsIHBoeV9hZ2MsIHBoeV9zYXQsIGJlYWNvbjsKIAlpbnQgcmV0OwogCisJaWYgKCEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSkKKwkJcmV0dXJuIDA7CisKIAkvKgogCSAqIERpc2FibGUgYmVhY29ucyBhbmQgUlgvVFggcXVldWVzLCB3YWl0CiAJICovCkBAIC0xNDU2LDcgKzE2ODUsNyBAQAogCWJlYWNvbiA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0JFQUNPTl81MjEwKTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIGJlYWNvbiAmIH5BUjVLX0JFQUNPTl9FTkFCTEUsIEFSNUtfQkVBQ09OXzUyMTApOwogCi0JbWRlbGF5KDIpOworCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAogCS8qCiAJICogU2V0IHRoZSBjaGFubmVsICh3aXRoIEFHQyB0dXJuZWQgb2ZmKQpAQCAtMTQ2OSw3ICsxNjk4LDcgQEAKIAkgKiBBY3RpdmF0ZSBQSFkgYW5kIHdhaXQKIAkgKi8KIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9FTkFCTEUsIEFSNUtfUEhZX0FDVCk7Ci0JbWRlbGF5KDEpOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CiAKQEAgLTE1MDYsNyArMTczNSw3IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9SRlNUR19ESVNBQkxFLCBBUjVLX1BIWV9SRlNURyk7CiAJQVI1S19SRUdfRElTQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9BR0MsIEFSNUtfUEhZX0FHQ19ESVNBQkxFKTsKIAotCW1kZWxheSgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAKIAkvKgogCSAqIEVuYWJsZSBjYWxpYnJhdGlvbiBhbmQgd2FpdCB1bnRpbCBjb21wbGV0aW9uCkBAIC0xNTM3LDggKzE3NjYsOSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUGVyZm9ybSBJL1EgY2FsaWJyYXRpb24gb24gUkY1MTExLzUxMTIgYW5kIG5ld2VyIGNoaXBzCisvKioKKyAqIGF0aDVrX2h3X3JmNTExeF9pcV9jYWxpYnJhdGUoKSAtIFBlcmZvcm0gSS9RIGNhbGlicmF0aW9uIG9uIFJGNTExMSBhbmQgbmV3ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwogc3RhdGljIGludAogYXRoNWtfaHdfcmY1MTF4X2lxX2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQpAQCAtMTU0NywxMiArMTc3NywxOSBAQAogCXMzMiBpcV9jb3JyLCBpX2NvZmYsIGlfY29mZmQsIHFfY29mZiwgcV9jb2ZmZDsKIAlpbnQgaTsKIAotCWlmICghYWgtPmFoX2NhbGlicmF0aW9uIHx8Ci0JCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUSkgJiBBUjVLX1BIWV9JUV9SVU4pCi0JCXJldHVybiAwOworCS8qIFNraXAgaWYgSS9RIGNhbGlicmF0aW9uIGlzIG5vdCBuZWVkZWQgb3IgaWYgaXQncyBzdGlsbCBydW5uaW5nICovCisJaWYgKCFhaC0+YWhfaXFfY2FsX25lZWRlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRKSAmIEFSNUtfUEhZX0lRX1JVTikgeworCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAorCQkJCSJJL1EgY2FsaWJyYXRpb24gc3RpbGwgcnVubmluZyIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCS8qIENhbGlicmF0aW9uIGhhcyBmaW5pc2hlZCwgZ2V0IHRoZSByZXN1bHRzIGFuZCByZS1ydW4gKi8KLQkvKiB3b3JrIGFyb3VuZCBlbXB0eSByZXN1bHRzIHdoaWNoIGNhbiBhcHBhcmVudGx5IGhhcHBlbiBvbiA1MjEyICovCisKKwkvKiBXb3JrIGFyb3VuZCBmb3IgZW1wdHkgcmVzdWx0cyB3aGljaCBjYW4gYXBwYXJlbnRseSBoYXBwZW4gb24gNTIxMjoKKwkgKiBSZWFkIHJlZ2lzdGVycyB1cCB0byAxMCB0aW1lcyB1bnRpbCB3ZSBnZXQgYm90aCBpX3ByIGFuZCBxX3B3ciAqLwogCWZvciAoaSA9IDA7IGkgPD0gMTA7IGkrKykgewogCQlpcV9jb3JyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9DT1JSKTsKIAkJaV9wd3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVFSRVNfQ0FMX1BXUl9JKTsKQEAgLTE1NzAsOSArMTgwNywxMyBAQAogCWVsc2UKIAkJcV9jb2ZmZCA9IHFfcHdyID4+IDc7CiAKLQkvKiBwcm90ZWN0IGFnYWluc3QgZGl2aWRlIGJ5IDAgYW5kIGxvc3Mgb2Ygc2lnbiBiaXRzICovCisJLyogSW4gY2FzZSBpX2NvZmZkIGJlY2FtZSB6ZXJvLCBjYW5jZWwgY2FsaWJyYXRpb24KKwkgKiBub3Qgb25seSBpdCdzIHRvbyBzbWFsbCwgaXQnbGwgYWxzbyByZXN1bHQgYSBkaXZpZGUKKwkgKiBieSB6ZXJvIGxhdGVyIG9uLiAqLwogCWlmIChpX2NvZmZkID09IDAgfHwgcV9jb2ZmZCA8IDIpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVDQU5DRUxFRDsKKworCS8qIFByb3RlY3QgYWdhaW5zdCBsb3NzIG9mIHNpZ24gYml0cyAqLwogCiAJaV9jb2ZmID0gKC1pcV9jb3JyKSAvIGlfY29mZmQ7CiAJaV9jb2ZmID0gY2xhbXAoaV9jb2ZmLCAtMzIsIDMxKTsgLyogc2lnbmVkIDYgYml0ICovCkBAIC0xNjAxLDEwICsxODQyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uCisvKioKKyAqIGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoKSAtIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFRoZSBtYWluIGZ1bmN0aW9uIHdlIGNhbGwgZnJvbSBhYm92ZSB0byBwZXJmb3JtCisgKiBhIHNob3J0IG9yIGZ1bGwgUEhZIGNhbGlicmF0aW9uIGJhc2VkIG9uIFJGIGNoaXAKKyAqIGFuZCBjdXJyZW50IGNoYW5uZWwKICAqLwotaW50IGF0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKK2ludAorYXRoNWtfaHdfcGh5X2NhbGlicmF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJaW50IHJldDsKQEAgLTE2MTMsMTAgKzE4NjEsNDMgQEAKIAkJcmV0dXJuIGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoYWgsIGNoYW5uZWwpOwogCiAJcmV0ID0gYXRoNWtfaHdfcmY1MTF4X2lxX2NhbGlicmF0ZShhaCk7CisJaWYgKHJldCkgeworCQlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQ0FMSUJSQVRFLAorCQkJIk5vIEkvUSBjb3JyZWN0aW9uIHBlcmZvcm1lZCAoJXVNSHopXG4iLAorCQkJY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOwogCi0JaWYgKChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEgfHwgYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKSAmJgotCSAgICAoY2hhbm5lbC0+aHdfdmFsdWUgIT0gQVI1S19NT0RFXzExQikpCi0JCWF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKGFoKTsKKwkJLyogSGFwcGVucyBhbGwgdGhlIHRpbWUgaWYgdGhlcmUgaXMgbm90IG11Y2gKKwkJICogdHJhZmZpYywgY29uc2lkZXIgaXQgbm9ybWFsIGJlaGF2aW91ci4gKi8KKwkJcmV0ID0gMDsKKwl9CisKKwkvKiBPbiBmdWxsIGNhbGlicmF0aW9uIGRvIGFuIEFHQyBjYWxpYnJhdGlvbiBhbmQKKwkgKiByZXF1ZXN0IGEgUEFQRCBwcm9iZSBmb3IgZ2FpbmYgY2FsaWJyYXRpb24gaWYKKwkgKiBuZWVkZWQgKi8KKwlpZiAoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSB7CisKKwkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQ0NUTCwKKwkJCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCk7CisKKwkJcmV0ID0gYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChhaCwgQVI1S19QSFlfQUdDQ1RMLAorCQkJQVI1S19QSFlfQUdDQ1RMX0NBTCB8IEFSNUtfUEhZX0FHQ0NUTF9ORiwKKwkJCTAsIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJQVRINUtfRVJSKGFoLAorCQkJCSJnYWluIGNhbGlicmF0aW9uIHRpbWVvdXQgKCV1TUh6KVxuIiwKKwkJCQljaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJCX0KKworCQlpZiAoKGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMSB8fAorCQkJYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTEyKQorCQkJJiYgKGNoYW5uZWwtPmh3X3ZhbHVlICE9IEFSNUtfTU9ERV8xMUIpKQorCQkJYXRoNWtfaHdfcmVxdWVzdF9yZmdhaW5fcHJvYmUoYWgpOworCX0KKworCS8qIFVwZGF0ZSBub2lzZSBmbG9vcgorCSAqIFhYWDogT25seSBkbyB0aGlzIGFmdGVyIEFHQyBjYWxpYnJhdGlvbiAqLworCWlmICghKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fTkYpKQorCQlhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3IoYWgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MjYsNiArMTkwNywxNiBAQAogKiBTcHVyIG1pdGlnYXRpb24gZnVuY3Rpb25zICoKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogYXRoNWtfaHdfc2V0X3NwdXJfbWl0aWdhdGlvbl9maWx0ZXIoKSAtIENvbmZpZ3VyZSBTUFVSIGZpbHRlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgUEhZIGluaXRpYWxpemF0aW9uIHRvCisgKiBjb25maWd1cmUgdGhlIHNwdXIgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbC4gU3B1ciBpcyBub2lzZQorICogZ2VuZXJhdGVkIGR1ZSB0byAicmVmbGVjdGlvbiIgZWZmZWN0cywgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcworICogbWV0aG9kIGNoZWNrIG91dCBwYXRlbnQgVVM3NjQzODEwCisgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a19od19zZXRfc3B1cl9taXRpZ2F0aW9uX2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKQEAgLTE4NjUsMTUgKzIxNTYsNzMgQEAKICogQW50ZW5uYSBjb250cm9sICoKIFwqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgLypUT0RPOkJvdW5kYXJ5IGNoZWNrKi8KKy8qKgorICogRE9DOiBBbnRlbm5hIGNvbnRyb2wKKyAqCisgKiBIdyBzdXBwb3J0cyB1cCB0byAxNCBhbnRlbm5hcyAhIEkgaGF2ZW4ndCBmb3VuZCBhbnkgY2FyZCB0aGF0IGltcGxlbWVudHMKKyAqIHRoYXQuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhbnRlbm5hcyBJJ3ZlIHNlZW4gaXMgdXAgdG8gNCAoMiBmb3IgMkdIeiBhbmQgMgorICogZm9yIDVHSHopLiBBbnRlbm5hIDEgKE1BSU4pIHNob3VsZCBiZSBvbW5pZGlyZWN0aW9uYWwsIDIgKEFVWCkKKyAqIG9tbmlkaXJlY3Rpb25hbCBvciBzZWN0b3JpYWwgYW5kIGFudGVubmFzIDMtMTQgc2VjdG9yaWFsIChvciBkaXJlY3Rpb25hbCkuCisgKgorICogV2UgY2FuIGhhdmUgYSBzaW5nbGUgYW50ZW5uYSBmb3IgUlggYW5kIG11bHRpcGxlIGFudGVubmFzIGZvciBUWC4KKyAqIFJYIGFudGVubmEgaXMgb3VyICJkZWZhdWx0IiBhbnRlbm5hICh1c3VhbGx5IGFudGVubmEgMSkgc2V0IG9uCisgKiBERUZBVUxUX0FOVEVOTkEgcmVnaXN0ZXIgYW5kIFRYIGFudGVubmEgaXMgc2V0IG9uIGVhY2ggVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiAoMCBmb3IgYXV0b21hdGljIHNlbGVjdGlvbiwgMSAtIDE0IGFudGVubmEgbnVtYmVyKS4KKyAqCisgKiBXZSBjYW4gbGV0IGh3IGRvIGFsbCB0aGUgd29yayBkb2luZyBmYXN0IGFudGVubmEgZGl2ZXJzaXR5IGZvciBib3RoCisgKiB0eCBhbmQgcnggb3Igd2UgY2FuIGRvIHRoaW5ncyBtYW51YWxseS4gSGVyZSBhcmUgdGhlIG9wdGlvbnMgd2UgaGF2ZQorICogKGFsbCBhcmUgYml0cyBvZiBTVEFfSUQxIHJlZ2lzdGVyKToKKyAqCisgKiBBUjVLX1NUQV9JRDFfREVGQVVMVF9BTlRFTk5BIC0+IFdoZW4gMCBpcyBzZXQgYXMgdGhlIFRYIGFudGVubmEgb24gVFgKKyAqIGNvbnRyb2wgZGVzY3JpcHRvciwgdXNlIHRoZSBkZWZhdWx0IGFudGVubmEgdG8gdHJhbnNtaXQgb3IgZWxzZSB1c2UgdGhlIGxhc3QKKyAqIGFudGVubmEgb24gd2hpY2ggd2UgcmVjZWl2ZWQgYW4gQUNLLgorICoKKyAqIEFSNUtfU1RBX0lEMV9ERVNDX0FOVEVOTkEgLT4gVXBkYXRlIGRlZmF1bHQgYW50ZW5uYSBhZnRlciBlYWNoIFRYIGZyYW1lIHRvCisgKiB0aGUgYW50ZW5uYSBvbiB3aGljaCB3ZSBnb3QgdGhlIEFDSyBmb3IgdGhhdCBmcmFtZS4KKyAqCisgKiBBUjVLX1NUQV9JRDFfUlRTX0RFRl9BTlRFTk5BIC0+IFVzZSBkZWZhdWx0IGFudGVubmEgZm9yIFJUUyBvciBlbHNlIHVzZSB0aGUKKyAqIG9uZSBvbiB0aGUgVFggZGVzY3JpcHRvci4KKyAqCisgKiBBUjVLX1NUQV9JRDFfU0VMRkdFTl9ERUZfQU5UIC0+IFVzZSBkZWZhdWx0IGFudGVubmEgZm9yIHNlbGYgZ2VuZXJhdGVkIGZyYW1lcworICogKEFDS3MgZXRjKSwgb3IgZWxzZSB1c2UgY3VycmVudCBhbnRlbm5hICh0aGUgb25lIHdlIGp1c3QgdXNlZCBmb3IgVFgpLgorICoKKyAqIFVzaW5nIHRoZSBhYm92ZSB3ZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zOgorICoKKyAqIEFSNUtfQU5UTU9ERV9ERUZBVUxUIC0+IEh3IGhhbmRsZXMgYW50ZW5uYSBkaXZlcnNpdHkgZXRjIGF1dG9tYXRpY2FsbHkKKyAqCisgKiBBUjVLX0FOVE1PREVfRklYRURfQQktPiBPbmx5IGFudGVubmEgQSAoTUFJTikgaXMgcHJlc2VudAorICoKKyAqIEFSNUtfQU5UTU9ERV9GSVhFRF9CCS0+IE9ubHkgYW50ZW5uYSBCIChBVVgpIGlzIHByZXNlbnQKKyAqCisgKiBBUjVLX0FOVE1PREVfU0lOR0xFX0FQIC0+IFN0YSBsb2NrZWQgb24gYSBzaW5nbGUgYXAKKyAqCisgKiBBUjVLX0FOVE1PREVfU0VDVE9SX0FQIC0+IEFQIHdpdGggdHggYW50ZW5uYSBzZXQgb24gdHggZGVzYworICoKKyAqIEFSNUtfQU5UTU9ERV9TRUNUT1JfU1RBIC0+IFNUQSB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqCisgKiBBUjVLX0FOVE1PREVfREVCVUcgRGVidWcgbW9kZSAtQSAtPiBSeCwgQi0+IFR4LQorICoKKyAqIEFsc28gbm90ZSB0aGF0IHdoZW4gc2V0dGluZyBhbnRlbm5hIHRvIEYgb24gdHggZGVzY3JpcHRvciBjYXJkIGludmVydHMKKyAqIGN1cnJlbnQgdHggYW50ZW5uYS4KKyAqLworCisvKioKKyAqIGF0aDVrX2h3X3NldF9kZWZfYW50ZW5uYSgpIC0gU2V0IGRlZmF1bHQgcnggYW50ZW5uYSBvbiBBUjUyMTEvNTIxMiBhbmQgbmV3ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhbnQ6IEFudGVubmEgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkCiBhdGg1a19od19zZXRfZGVmX2FudGVubmEoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggYW50KQogewogCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkKIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBhbnQgJiAweDcsIEFSNUtfREVGQVVMVF9BTlRFTk5BKTsKIH0KIAotLyoKLSAqIEVuYWJsZS9kaXNhYmxlIGZhc3QgcnggYW50ZW5uYSBkaXZlcnNpdHkKKy8qKgorICogYXRoNWtfaHdfc2V0X2Zhc3RfZGl2KCkgLSAgRW5hYmxlL2Rpc2FibGUgZmFzdCByeCBhbnRlbm5hIGRpdmVyc2l0eQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAZW5hYmxlOiBUcnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICovCiBzdGF0aWMgdm9pZAogYXRoNWtfaHdfc2V0X2Zhc3RfZGl2KHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGVlX21vZGUsIGJvb2wgZW5hYmxlKQpAQCAtMTkxMyw2ICsyMjYyLDE0IEBACiAJfQogfQogCisvKioKKyAqIGF0aDVrX2h3X3NldF9hbnRlbm5hX3N3aXRjaCgpIC0gU2V0IHVwIGFudGVubmEgc3dpdGNoIHRhYmxlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqCisgKiBTd2l0Y2ggdGFibGUgY29tZXMgZnJvbSBFRVBST00gYW5kIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nCisgKiB0aGUgMiBhbnRlbm5hIFJYIGF0dGVudWF0b3JzCisgKi8KIHZvaWQKIGF0aDVrX2h3X3NldF9hbnRlbm5hX3N3aXRjaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlKQogewpAQCAtMTk0NCw4ICsyMzAxLDEwIEBACiAJCUFSNUtfUEhZX0FOVF9TV0lUQ0hfVEFCTEVfMSk7CiB9CiAKLS8qCi0gKiBTZXQgYW50ZW5uYSBvcGVyYXRpbmcgbW9kZQorLyoqCisgKiBhdGg1a19od19zZXRfYW50ZW5uYV9tb2RlKCkgLSAgU2V0IGFudGVubmEgb3BlcmF0aW5nIG1vZGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhbnRfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfYW50X21vZGUKICAqLwogdm9pZAogYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBhbnRfbW9kZSkKQEAgLTIwNjgsOCArMjQyNywxMyBAQAogICogSGVscGVyIGZ1bmN0aW9ucwogICovCiAKLS8qCi0gKiBEbyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBnaXZlbiAoeCwgeSkgcG9pbnRzCisvKioKKyAqIGF0aDVrX2dldF9pbnRlcnBvbGF0ZWRfdmFsdWUoKSAtIEdldCBpbnRlcnBvbGF0ZWQgWSB2YWwgYmV0d2VlbiB0d28gcG9pbnRzCisgKiBAdGFyZ2V0OiBYIHZhbHVlIG9mIHRoZSBtaWRkbGUgcG9pbnQKKyAqIEB4X2xlZnQ6IFggdmFsdWUgb2YgdGhlIGxlZnQgcG9pbnQKKyAqIEB4X3JpZ2h0OiBYIHZhbHVlIG9mIHRoZSByaWdodCBwb2ludAorICogQHlfbGVmdDogWSB2YWx1ZSBvZiB0aGUgbGVmdCBwb2ludAorICogQHlfcmlnaHQ6IFkgdmFsdWUgb2YgdGhlIHJpZ2h0IHBvaW50CiAgKi8KIHN0YXRpYyBzMTYKIGF0aDVrX2dldF9pbnRlcnBvbGF0ZWRfdmFsdWUoczE2IHRhcmdldCwgczE2IHhfbGVmdCwgczE2IHhfcmlnaHQsCkBAIC0yMDk2LDEzICsyNDYwLDE4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyoKLSAqIEZpbmQgdmVydGljYWwgYm91bmRhcnkgKG1pbiBwd3IpIGZvciB0aGUgbGluZWFyIFBDREFDIGN1cnZlLgorLyoqCisgKiBhdGg1a19nZXRfbGluZWFyX3BjZGFjX21pbigpIC0gRmluZCB2ZXJ0aWNhbCBib3VuZGFyeSAobWluIHB3cikgZm9yIHRoZQorICogbGluZWFyIFBDREFDIGN1cnZlCisgKiBAc3RlcEw6IExlZnQgYXJyYXkgd2l0aCB5IHZhbHVlcyAocGNkYWMgc3RlcHMpCisgKiBAc3RlcFI6IFJpZ2h0IGFycmF5IHdpdGggeSB2YWx1ZXMgKHBjZGFjIHN0ZXBzKQorICogQHB3ckw6IExlZnQgYXJyYXkgd2l0aCB4IHZhbHVlcyAocG93ZXIgc3RlcHMpCisgKiBAcHdyUjogUmlnaHQgYXJyYXkgd2l0aCB4IHZhbHVlcyAocG93ZXIgc3RlcHMpCiAgKgogICogU2luY2Ugd2UgaGF2ZSB0aGUgdG9wIG9mIHRoZSBjdXJ2ZSBhbmQgd2UgZHJhdyB0aGUgbGluZSBiZWxvdwogICogdW50aWwgd2UgcmVhY2ggMSAoMSBwY2RhYyBzdGVwKSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggcG9pbnQKLSAqICh4IHZhbHVlKSB0aGF0IGlzIHNvIHRoYXQgd2UgZG9uJ3QgZ28gYmVsb3cgeSBheGlzIGFuZCBoYXZlIG5lZ2F0aXZlCi0gKiBwY2RhYyB2YWx1ZXMgd2hlbiBjcmVhdGluZyB0aGUgY3VydmUsIG9yIGZpbGwgdGhlIHRhYmxlIHdpdGggemVyb2VzLgorICogKHggdmFsdWUpIHRoYXQgaXMgc28gdGhhdCB3ZSBkb24ndCBnbyBiZWxvdyB4IGF4aXMgYW5kIGhhdmUgbmVnYXRpdmUKKyAqIHBjZGFjIHZhbHVlcyB3aGVuIGNyZWF0aW5nIHRoZSBjdXJ2ZSwgb3IgZmlsbCB0aGUgdGFibGUgd2l0aCB6ZXJvcy4KICAqLwogc3RhdGljIHMxNgogYXRoNWtfZ2V0X2xpbmVhcl9wY2RhY19taW4oY29uc3QgdTggKnN0ZXBMLCBjb25zdCB1OCAqc3RlcFIsCkBAIC0yMTQ4LDcgKzI1MTcsMTYgQEAKIAlyZXR1cm4gbWF4KG1pbl9wd3JMLCBtaW5fcHdyUik7CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2NyZWF0ZV9wb3dlcl9jdXJ2ZSgpIC0gQ3JlYXRlIGEgUG93ZXIgdG8gUERBREMgb3IgUENEQUMgY3VydmUKKyAqIEBwbWluOiBNaW5pbXVtIHBvd2VyIHZhbHVlICh4bWluKQorICogQHBtYXg6IE1heGltdW0gcG93ZXIgdmFsdWUgKHhtYXgpCisgKiBAcHdyOiBBcnJheSBvZiBwb3dlciBzdGVwcyAoeCB2YWx1ZXMpCisgKiBAdnBkOiBBcnJheSBvZiBtYXRjaGluZyBQQ0RBQy9QREFEQyBzdGVwcyAoeSB2YWx1ZXMpCisgKiBAbnVtX3BvaW50czogTnVtYmVyIG9mIHByb3ZpZGVkIHBvaW50cworICogQHZwZF90YWJsZTogQXJyYXkgdG8gZmlsbCB3aXRoIHRoZSBmdWxsIFBDREFDL1BEQURDIHZhbHVlcyAoeSB2YWx1ZXMpCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcG93ZXJ0YWJsZV90eXBlIChlZXByb20uaCkKKyAqCiAgKiBJbnRlcnBvbGF0ZSAocHdyLHZwZCkgcG9pbnRzIHRvIGNyZWF0ZSBhIFBvd2VyIHRvIFBEQURDIG9yIGEKICAqIFBvd2VyIHRvIFBDREFDIGN1cnZlLgogICoKQEAgLTIyMDYsNyArMjU4NCwxNCBAQAogCX0KIH0KIAotLyoKKy8qKgorICogYXRoNWtfZ2V0X2NoYW5fcGNhbF9zdXJyb3VuZGluZ19waWVycygpIC0gR2V0IHN1cnJvdW5kaW5nIGNhbGlicmF0aW9uIHBpZXJzCisgKiBmb3IgYSBnaXZlbiBjaGFubmVsLgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAcGNpbmZvX2w6IFRoZSAmc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvIHRvIHB1dCB0aGUgbGVmdCBjYWwuIHBpZXIKKyAqIEBwY2luZm9fcjogVGhlICZzdHJ1Y3QgYXRoNWtfY2hhbl9wY2FsX2luZm8gdG8gcHV0IHRoZSByaWdodCBjYWwuIHBpZXIKKyAqCiAgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1jaGFubmVsIHBvd2VyIGNhbGlicmF0aW9uIHBpZXJzCiAgKiBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgc28gdGhhdCB3ZSBjYW4gaW50ZXJwb2xhdGUgYmV0d2VlbgogICogdGhlbSBhbmQgY29tZSB1cCB3aXRoIGFuIGFwcHJvcHJpYXRlIGRhdGFzZXQgZm9yIG91ciBjdXJyZW50CkBAIC0yMjg5LDExICsyNjc0LDE3IEBACiAJKnBjaW5mb19yID0gJnBjaW5mb1tpZHhfcl07CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2dldF9yYXRlX3BjYWxfZGF0YSgpIC0gR2V0IHRoZSBpbnRlcnBvbGF0ZWQgcGVyLXJhdGUgcG93ZXIKKyAqIGNhbGlicmF0aW9uIGRhdGEKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAcmF0ZXM6IFRoZSAmc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvIHRvIGZpbGwKKyAqCiAgKiBHZXQgdGhlIHN1cnJvdW5kaW5nIHBlci1yYXRlIHBvd2VyIGNhbGlicmF0aW9uIGRhdGEKICAqIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSBhbmQgaW50ZXJwb2xhdGUgYmV0d2VlbiBwb3dlcgogICogdmFsdWVzIHRvIHNldCBtYXggdGFyZ2V0IHBvd2VyIHN1cHBvcnRlZCBieSBodyBmb3IKLSAqIGVhY2ggcmF0ZS4KKyAqIGVhY2ggcmF0ZSBvbiB0aGlzIGZyZXF1ZW5jeS4KICAqLwogc3RhdGljIHZvaWQKIGF0aDVrX2dldF9yYXRlX3BjYWxfZGF0YShzdHJ1Y3QgYXRoNWtfaHcgKmFoLApAQCAtMjM4MSw3ICsyNzcyLDExIEBACiAJCQkJCXJwaW5mb1tpZHhfcl0udGFyZ2V0X3Bvd2VyXzU0KTsKIH0KIAotLyoKKy8qKgorICogYXRoNWtfZ2V0X21heF9jdGxfcG93ZXIoKSAtIEdldCBtYXggZWRnZSBwb3dlciBmb3IgYSBnaXZlbiBmcmVxdWVuY3kKKyAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKICAqIEdldCB0aGUgbWF4IGVkZ2UgcG93ZXIgZm9yIHRoaXMgY2hhbm5lbCBpZgogICogd2UgaGF2ZSBzdWNoIGRhdGEgZnJvbSBFRVBST00ncyBDb25mb3JtYW5jZSBUZXN0CiAgKiBMaW1pdHMgKENUTCksIGFuZCBsaW1pdCBtYXggcG93ZXIgaWYgbmVlZGVkLgpAQCAtMjQ2MSw4ICsyODU2LDM5IEBACiAgKiBQb3dlciB0byBQQ0RBQyB0YWJsZSBmdW5jdGlvbnMKICAqLwogCi0vKgotICogRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTEKKy8qKgorICogRE9DOiBQb3dlciB0byBQQ0RBQyB0YWJsZSBmdW5jdGlvbnMKKyAqCisgKiBGb3IgUkY1MTExIHdlIGhhdmUgYW4gWFBEIC1lWHRlcm5hbCBQb3dlciBEZXRlY3Rvci0gY3VydmUKKyAqIGZvciBlYWNoIGNhbGlicmF0ZWQgY2hhbm5lbC4gRWFjaCBjdXJ2ZSBoYXMgMCw1ZEIgUG93ZXIgc3RlcHMKKyAqIG9uIHggYXhpcyBhbmQgUENEQUMgc3RlcHMgKG9mZnNldHMpIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhbgorICogZXhwb25lbnRpYWwgZnVuY3Rpb24uIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZSB3ZSByZWFkIDExIHBvaW50cworICogZnJvbSBlZXByb20gKGVlcHJvbS5jKSBhbmQgaW50ZXJwb2xhdGUgaGVyZS4KKyAqCisgKiBGb3IgUkY1MTEyIHdlIGhhdmUgNCBYUEQgLWVYdGVybmFsIFBvd2VyIERldGVjdG9yLSBjdXJ2ZXMKKyAqIGZvciBlYWNoIGNhbGlicmF0ZWQgY2hhbm5lbCBvbiAwLCAtNiwgLTEyIGFuZCAtMThkQm0gYnV0IHdlIG9ubHkKKyAqIHVzZSB0aGUgaGlnaGVyICgzKSBhbmQgdGhlIGxvd2VyICgwKSBjdXJ2ZXMuIEVhY2ggY3VydmUgYWdhaW4gaGFzIDAuNWRCCisgKiBwb3dlciBzdGVwcyBvbiB4IGF4aXMgYW5kIFBDREFDIHN0ZXBzIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhCisgKiBsaW5lYXIgZnVuY3Rpb24uIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZSBhbmQgcGFzcyB0aGUgcG93ZXIgdmFsdWVzCisgKiBvbiBodywgd2UgZ2V0IDQgcG9pbnRzIGZvciB4cGQgMCAobG93ZXIgZ2FpbiAtPiBtYXggcG93ZXIpCisgKiBhbmQgMyBwb2ludHMgZm9yIHhwZCAzIChoaWdoZXIgZ2FpbiAtPiBsb3dlciBwb3dlcikgZnJvbSBlZXByb20gKGVlcHJvbS5jKQorICogYW5kIGludGVycG9sYXRlIGhlcmUuCisgKgorICogRm9yIGEgZ2l2ZW4gY2hhbm5lbCB3ZSBnZXQgdGhlIGNhbGlicmF0ZWQgcG9pbnRzIChwaWVycykgZm9yIGl0IG9yCisgKiAtaWYgd2UgZG9uJ3QgaGF2ZSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0aGlzIHNwZWNpZmljIGNoYW5uZWwtIGZyb20gdGhlCisgKiBhdmFpbGFibGUgc3Vycm91bmRpbmcgY2hhbm5lbHMgd2UgaGF2ZSBjYWxpYnJhdGlvbiBkYXRhIGZvciwgYWZ0ZXIgd2UgZG8gYQorICogbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGVtLiBUaGVuIHNpbmNlIHdlIGhhdmUgb3VyIGNhbGlicmF0ZWQgcG9pbnRzCisgKiBmb3IgdGhpcyBjaGFubmVsLCB3ZSBkbyBhZ2FpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlbSB0byBnZXQgdGhlCisgKiB3aG9sZSBjdXJ2ZS4KKyAqCisgKiBXZSBmaW5hbGx5IHdyaXRlIHRoZSBZIHZhbHVlcyBvZiB0aGUgY3VydmUocykgKHRoZSBQQ0RBQyB2YWx1ZXMpIG9uIGh3CisgKi8KKworLyoqCisgKiBhdGg1a19maWxsX3B3cl90b19wY2RhY190YWJsZSgpIC0gRmlsbCBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTEKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB0YWJsZV9taW46IE1pbmltdW0gcG93ZXIgKHggbWluKQorICogQHRhYmxlX21heDogTWF4aW11bSBwb3dlciAoeCBtYXgpCiAgKgogICogTm8gZnVydGhlciBwcm9jZXNzaW5nIGlzIG5lZWRlZCBmb3IgUkY1MTExLCB0aGUgb25seSB0aGluZyB3ZSBoYXZlIHRvCiAgKiBkbyBpcyBmaWxsIHRoZSB2YWx1ZXMgYmVsb3cgYW5kIGFib3ZlIGNhbGlicmF0aW9uIHJhbmdlIHNpbmNlIGVlcHJvbSBkYXRhCkBAIC0yNTAzLDEwICsyOTI5LDE0IEBACiAKIH0KIAotLyoKLSAqIENvbWJpbmUgYXZhaWxhYmxlIFhQRCBDdXJ2ZXMgYW5kIGZpbGwgTGluZWFyIFBvd2VyIHRvIFBDREFDIHRhYmxlCi0gKiBvbiBSRjUxMTIKKy8qKgorICogYXRoNWtfY29tYmluZV9saW5lYXJfcGNkYWNfY3VydmVzKCkgLSBDb21iaW5lIGF2YWlsYWJsZSBQQ0RBQyBDdXJ2ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB0YWJsZV9taW46IE1pbmltdW0gcG93ZXIgKHggbWluKQorICogQHRhYmxlX21heDogTWF4aW11bSBwb3dlciAoeCBtYXgpCisgKiBAcGRjdXJ2ZXM6IE51bWJlciBvZiBwZCBjdXJ2ZXMKICAqCisgKiBDb21iaW5lIGF2YWlsYWJsZSBYUEQgQ3VydmVzIGFuZCBmaWxsIExpbmVhciBQb3dlciB0byBQQ0RBQyB0YWJsZSBvbiBSRjUxMTIKICAqIFJGWDExMiBjYW4gaGF2ZSB1cCB0byAyIGN1cnZlcyAob25lIGZvciBsb3cgdHhwb3dlciByYW5nZSBhbmQgb25lIGZvcgogICogaGlnaGVyIHR4cG93ZXIgcmFuZ2UpLiBXZSBuZWVkIHRvIHB1dCB0aGVtIGJvdGggb24gcGNkYWNfb3V0IGFuZCBwbGFjZQogICogdGhlbSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbi4gSW4gY2FzZSB3ZSBvbmx5IGhhdmUgb25lIGN1cnZlIGF2YWlsYWJsZQpAQCAtMjYwOCw3ICszMDM4LDEwIEBACiAJfQogfQogCi0vKiBXcml0ZSBQQ0RBQyB2YWx1ZXMgb24gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfcGNkYWNfdGFibGUoKSAtIFdyaXRlIHRoZSBQQ0RBQyB2YWx1ZXMgb24gaHcKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX3BjZGFjX3RhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CkBAIC0yNjMxLDkgKzMwNjQsMzIgQEAKICAqIFBvd2VyIHRvIFBEQURDIHRhYmxlIGZ1bmN0aW9ucwogICovCiAKLS8qCi0gKiBTZXQgdGhlIGdhaW4gYm91bmRhcmllcyBhbmQgY3JlYXRlIGZpbmFsIFBvd2VyIHRvIFBEQURDIHRhYmxlCisvKioKKyAqIERPQzogUG93ZXIgdG8gUERBREMgdGFibGUgZnVuY3Rpb25zCiAgKgorICogRm9yIFJGMjQxMyBhbmQgbGF0ZXIgd2UgaGF2ZSBhIFBvd2VyIHRvIFBEQURDIHRhYmxlIChQb3dlciBEZXRlY3RvcikKKyAqIGluc3RlYWQgb2YgYSBQQ0RBQyAoUG93ZXIgQ29udHJvbCkgYW5kIDQgcGQgZ2FpbiBjdXJ2ZXMgZm9yIGVhY2gKKyAqIGNhbGlicmF0ZWQgY2hhbm5lbC4gRWFjaCBjdXJ2ZSBoYXMgcG93ZXIgb24geCBheGlzIGluIDAuNSBkYiBzdGVwcyBhbmQKKyAqIFBEQURDIHN0ZXBzIG9uIHkgYXhpcyBhbmQgbG9va3MgbGlrZSBhbiBleHBvbmVudGlhbCBmdW5jdGlvbiBsaWtlIHRoZQorICogUkY1MTExIGN1cnZlLgorICoKKyAqIFRvIHJlY3JlYXRlIHRoZSBjdXJ2ZXMgd2UgcmVhZCB0aGUgcG9pbnRzIGZyb20gZWVwcm9tIChlZXByb20uYykKKyAqIGFuZCBpbnRlcnBvbGF0ZSBoZXJlLiBOb3RlIHRoYXQgaW4gbW9zdCBjYXNlcyBvbmx5IDIgKGhpZ2hlciBhbmQgbG93ZXIpCisgKiBjdXJ2ZXMgYXJlIHVzZWQgKGxpa2UgUkY1MTEyKSBidXQgdmVuZG9ycyBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBpbmNsdWRlCisgKiBhbGwgNCBjdXJ2ZXMgb24gZWVwcm9tLiBUaGUgZmluYWwgY3VydmUgKGhpZ2hlciBwb3dlcikgaGFzIGFuIGV4dHJhCisgKiBwb2ludCBmb3IgYmV0dGVyIGFjY3VyYWN5IGxpa2UgUkY1MTEyLgorICoKKyAqIFRoZSBwcm9jZXNzIGlzIHNpbWlsYXIgdG8gd2hhdCB3ZSBkbyBhYm92ZSBmb3IgUkY1MTExLzUxMTIKKyAqLworCisvKioKKyAqIGF0aDVrX2NvbWJpbmVfcHdyX3RvX3BkYWRjX2N1cnZlcygpIC0gQ29tYmluZSB0aGUgdmFyaW91cyBQREFEQyBjdXJ2ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBwd3JfbWluOiBNaW5pbXVtIHBvd2VyICh4IG1pbikKKyAqIEBwd3JfbWF4OiBNYXhpbXVtIHBvd2VyICh4IG1heCkKKyAqIEBwZGN1cnZlczogTnVtYmVyIG9mIGF2YWlsYWJsZSBjdXJ2ZXMKKyAqCisgKiBDb21iaW5lIHRoZSB2YXJpb3VzIHBkIGN1cnZlcyBhbmQgY3JlYXRlIHRoZSBmaW5hbCBQb3dlciB0byBQREFEQyB0YWJsZQogICogV2UgY2FuIGhhdmUgdXAgdG8gNCBwZCBjdXJ2ZXMsIHdlIG5lZWQgdG8gZG8gYSBzaW1pbGFyIHByb2Nlc3MKICAqIGFzIHdlIGRvIGZvciBSRjUxMTIuIFRoaXMgdGltZSB3ZSBkb24ndCBoYXZlIGFuIGVkZ2VfZmxhZyBidXQgd2UKICAqIHNldCB0aGUgZ2FpbiBib3VuZGFyaWVzIG9uIGEgc2VwYXJhdGUgcmVnaXN0ZXIuCkBAIC0yNzU3LDcgKzMyMTMsMTEgQEAKIAogfQogCi0vKiBXcml0ZSBQREFEQyB2YWx1ZXMgb24gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfcHdyX3RvX3BkYWRjX3RhYmxlKCkgLSBXcml0ZSB0aGUgUERBREMgdmFsdWVzIG9uIGh3CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX3B3cl90b19wZGFkY190YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlKQogewpAQCAtMjgxNCw3ICszMjc0LDEzIEBACiAgKiBDb21tb24gY29kZSBmb3IgUENEQUMvUERBREMgdGFibGVzCiAgKi8KIAotLyoKKy8qKgorICogYXRoNWtfc2V0dXBfY2hhbm5lbF9wb3dlcnRhYmxlKCkgLSBTZXQgdXAgcG93ZXIgdGFibGUgZm9yIHRoaXMgY2hhbm5lbAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEB0eXBlOiBPbmUgb2YgZW51bSBhdGg1a19wb3dlcnRhYmxlX3R5cGUgKGVlcHJvbS5oKQorICoKICAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCB1c2VzIGFsbCBvZiB0aGUgYWJvdmUKICAqIHRvIHNldCBQQ0RBQy9QREFEQyB0YWJsZSBvbiBodyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbC4KICAqIFRoaXMgdGFibGUgaXMgdXNlZCBmb3IgdHggcG93ZXIgY2FsaWJyYXRpb24gb24gdGhlIGJhc2ViYW5kLApAQCAtMzAxMiw3ICszNDc4LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIHBvd2VyIHRhYmxlIGZvciBjdXJyZW50IGNoYW5uZWwgdG8gaHcgKi8KKy8qKgorICogYXRoNWtfd3JpdGVfY2hhbm5lbF9wb3dlcnRhYmxlKCkgLSBTZXQgcG93ZXIgdGFibGUgZm9yIGN1cnJlbnQgY2hhbm5lbCBvbiBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcG93ZXJ0YWJsZV90eXBlIChlZXByb20uaCkKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3dyaXRlX2NoYW5uZWxfcG93ZXJ0YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlLCB1OCB0eXBlKQogewpAQCAtMzAyMiwyOCArMzQ5MywzNiBAQAogCQlhdGg1a193cml0ZV9wY2RhY190YWJsZShhaCk7CiB9CiAKLS8qCi0gKiBQZXItcmF0ZSB0eCBwb3dlciBzZXR0aW5nCi0gKgotICogVGhpcyBpcyB0aGUgY29kZSB0aGF0IHNldHMgdGhlIGRlc2lyZWQgdHggcG93ZXIgKGJlbG93Ci0gKiBtYXhpbXVtKSBvbiBodyBmb3IgZWFjaCByYXRlICh3ZSBhbHNvIGhhdmUgVFBDIHRoYXQgc2V0cwotICogcG93ZXIgcGVyIHBhY2tldCkuIFdlIGRvIHRoYXQgYnkgcHJvdmlkaW5nIGFuIGluZGV4IG9uIHRoZQotICogUENEQUMvUERBREMgdGFibGUgd2Ugc2V0IHVwLgotICovCiAKLS8qCi0gKiBTZXQgcmF0ZSBwb3dlciB0YWJsZQorLyoqCisgKiBET0M6IFBlci1yYXRlIHR4IHBvd2VyIHNldHRpbmcKKyAqCisgKiBUaGlzIGlzIHRoZSBjb2RlIHRoYXQgc2V0cyB0aGUgZGVzaXJlZCB0eCBwb3dlciBsaW1pdCAoYmVsb3cKKyAqIG1heGltdW0pIG9uIGh3IGZvciBlYWNoIHJhdGUgKHdlIGFsc28gaGF2ZSBUUEMgdGhhdCBzZXRzCisgKiBwb3dlciBwZXIgcGFja2V0IHR5cGUpLiBXZSBkbyB0aGF0IGJ5IHByb3ZpZGluZyBhbiBpbmRleCBvbiB0aGUKKyAqIFBDREFDL1BEQURDIHRhYmxlIHdlIHNldCB1cCBhYm92ZSwgZm9yIGVhY2ggcmF0ZS4KICAqCiAgKiBGb3Igbm93IHdlIG9ubHkgbGltaXQgdHhwb3dlciBiYXNlZCBvbiBtYXhpbXVtIHR4IHBvd2VyCi0gKiBzdXBwb3J0ZWQgYnkgaHcgKHdoYXQncyBpbnNpZGUgcmF0ZV9pbmZvKS4gV2UgbmVlZCB0byBsaW1pdAotICogdGhpcyBldmVuIG1vcmUsIGJhc2VkIG9uIHJlZ3VsYXRvcnkgZG9tYWluIGV0Yy4KKyAqIHN1cHBvcnRlZCBieSBodyAod2hhdCdzIGluc2lkZSByYXRlX2luZm8pICsgY29uZm9ybWFuY2UgdGVzdAorICogbGltaXRzLiBXZSBuZWVkIHRvIGxpbWl0IHRoaXMgZXZlbiBtb3JlLCBiYXNlZCBvbiByZWd1bGF0b3J5IGRvbWFpbgorICogZXRjIHRvIGJlIHNhZmUuIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSBmcm9tIGFib3ZlIHNvIHdlIGRvbid0IGNhcmUKKyAqIGhlcmUsIGFsbCB3ZSBjYXJlIGlzIHRoYXQgdGhlIHR4IHBvd2VyIHdlIHNldCB3aWxsIGJlIE8uSy4KKyAqIGZvciB0aGUgaHcgKGUuZy4gd29uJ3QgY3JlYXRlIG5vaXNlIG9uIFBBIGV0YykuCiAgKgotICogUmF0ZSBwb3dlciB0YWJsZSBjb250YWlucyBpbmRpY2VzIHRvIFBDREFDL1BEQURDIHRhYmxlICgwLjVkQiBzdGVwcykKLSAqIGFuZCBpcyBpbmRleGVkIGFzIGZvbGxvd3M6CisgKiBSYXRlIHBvd2VyIHRhYmxlIGNvbnRhaW5zIGluZGljZXMgdG8gUENEQUMvUERBREMgdGFibGUgKDAuNWRCIHN0ZXBzIC0KKyAqIHggdmFsdWVzKSBhbmQgaXMgaW5kZXhlZCBhcyBmb2xsb3dzOgogICogcmF0ZXNbMF0gLSByYXRlc1s3XSAtPiBPRkRNIHJhdGVzCiAgKiByYXRlc1s4XSAtIHJhdGVzWzE0XSAtPiBDQ0sgcmF0ZXMKICAqIHJhdGVzWzE1XSAtPiBYUiByYXRlcyAodGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBwb3dlcikKICAqLworCisvKioKKyAqIGF0aDVrX3NldHVwX3JhdGVfcG93ZXJ0YWJsZSgpIC0gU2V0IHVwIHJhdGUgcG93ZXIgdGFibGUgZm9yIGEgZ2l2ZW4gdHggcG93ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtYXhfcHdyOiBUaGUgbWF4aW11bSB0eCBwb3dlciByZXF1ZXN0ZWQgaW4gMC41ZEIgc3RlcHMKKyAqIEByYXRlX2luZm86IFRoZSAmc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvIHRvIGZpbGwKKyAqIEBlZV9tb2RlOiBPbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICovCiBzdGF0aWMgdm9pZAogYXRoNWtfc2V0dXBfcmF0ZV9wb3dlcnRhYmxlKHN0cnVjdCBhdGg1a19odyAqYWgsIHUxNiBtYXhfcHdyLAogCQkJc3RydWN0IGF0aDVrX3JhdGVfcGNhbF9pbmZvICpyYXRlX2luZm8sCkBAIC0zMTE0LDggKzM1OTMsMTQgQEAKIH0KIAogCi0vKgotICogU2V0IHRyYW5zbWlzc2lvbiBwb3dlcgorLyoqCisgKiBhdGg1a19od190eHBvd2VyKCkgLSBTZXQgdHJhbnNtaXNzaW9uIHBvd2VyIGxpbWl0IGZvciBhIGdpdmVuIGNoYW5uZWwKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQHR4cG93ZXI6IFJlcXVlc3RlZCB0eCBwb3dlciBpbiAwLjVkQiBzdGVwcworICoKKyAqIENvbWJpbmVzIGFsbCBvZiB0aGUgYWJvdmUgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgdHggcG93ZXIgbGltaXQKKyAqIG9uIGh3LgogICovCiBzdGF0aWMgaW50CiBhdGg1a19od190eHBvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKQEAgLTMyMzMsNyArMzcxOCwxNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggdHhwb3dlcikKKy8qKgorICogYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoKSAtIFNldCB0eHBvd2VyIGxpbWl0IGZvciB0aGUgY3VycmVudCBjaGFubmVsCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAdHhwb3dlcjogVGhlIHJlcXVlc3RlZCB0eCBwb3dlciBsaW1pdCBpbiAwLjVkQiBzdGVwcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYWNjZXNzIHRvIGF0aDVrX2h3X3R4cG93ZXIgdG8gdGhlIGRyaXZlciBpbgorICogY2FzZSB1c2VyIG9yIGFuIGFwcGxpY2F0aW9uIGNoYW5nZXMgaXQgd2hpbGUgUEhZIGlzIHJ1bm5pbmcuCisgKi8KK2ludAorYXRoNWtfaHdfc2V0X3R4cG93ZXJfbGltaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggdHhwb3dlcikKIHsKIAlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1RYUE9XRVIsCiAJCSJjaGFuZ2luZyB0eHBvd2VyIHRvICVkXG4iLCB0eHBvd2VyKTsKQEAgLTMyNDEsMTEgKzM3MzUsMjYgQEAKIAlyZXR1cm4gYXRoNWtfaHdfdHhwb3dlcihhaCwgYWgtPmFoX2N1cnJlbnRfY2hhbm5lbCwgdHhwb3dlcik7CiB9CiAKKwogLyoqKioqKioqKioqKipcCiAgSW5pdCBmdW5jdGlvbgogXCoqKioqKioqKioqKiovCiAKLWludCBhdGg1a19od19waHlfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisvKioKKyAqIGF0aDVrX2h3X3BoeV9pbml0KCkgLSBJbml0aWFsaXplIFBIWQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSBAc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEBmYXN0OiBUcnkgYSBmYXN0IGNoYW5uZWwgc3dpdGNoIGluc3RlYWQKKyAqCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgZHVyaW5nIHJlc2V0IHRvIGluaXRpYWxpemUgUEhZCisgKiBvciBkbyBhIGZhc3QgY2hhbm5lbCBjaGFuZ2UgaWYgcG9zc2libGUuCisgKgorICogTk9URTogRG8gbm90IGNhbGwgdGhpcyBvbmUgZnJvbSB0aGUgZHJpdmVyLCBpdCBhc3N1bWVzIFBIWSBpcyBpbiBhCisgKiB3YXJtIHJlc2V0IHN0YXRlICEKKyAqLworaW50CithdGg1a19od19waHlfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCSAgICAgIHU4IG1vZGUsIGJvb2wgZmFzdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmN1cnJfY2hhbm5lbDsKQEAgLTMzNTUsNyArMzg2NCw3IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCiAJCS8qCiAJCSAqIFdyaXRlIFJGIGJ1ZmZlcgpAQCAtMzM3NiwxMCArMzg4NSwxMCBAQAogCQl9CiAKIAl9IGVsc2UgaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCQkvKiBEaXNhYmxlIHBoeSBhbmQgd2FpdCAqLwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIEFSNUtfUEhZX0FDVF9ESVNBQkxFLCBBUjVLX1BIWV9BQ1QpOwotCQltZGVsYXkoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAl9CiAKIAkvKiBTZXQgY2hhbm5lbCBvbiBQSFkgKi8KQEAgLTM0MDUsNyArMzkxNCw3IEBACiAJZm9yIChpID0gMDsgaSA8PSAyMDsgaSsrKSB7CiAJCWlmICghKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9BRENfVEVTVCkgJiAweDEwKSkKIAkJCWJyZWFrOwotCQl1ZGVsYXkoMjAwKTsKKwkJdXNsZWVwX3JhbmdlKDIwMCwgMjUwKTsKIAl9CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaHlfdHN0MSwgQVI1S19QSFlfVFNUMSk7CiAKQEAgLTM0MzMsOSArMzk0Miw5IEBACiAKIAkvKiBBdCB0aGUgc2FtZSB0aW1lIHN0YXJ0IEkvUSBjYWxpYnJhdGlvbiBmb3IgUUFNIGNvbnN0ZWxsYXRpb24KIAkgKiAtbm8gbmVlZCBmb3IgQ0NLLSAqLwotCWFoLT5haF9jYWxpYnJhdGlvbiA9IGZhbHNlOworCWFoLT5haF9pcV9jYWxfbmVlZGVkID0gZmFsc2U7CiAJaWYgKCEobW9kZSA9PSBBUjVLX01PREVfMTFCKSkgewotCQlhaC0+YWhfY2FsaWJyYXRpb24gPSB0cnVlOworCQlhaC0+YWhfaXFfY2FsX25lZWRlZCA9IHRydWU7CiAJCUFSNUtfUkVHX1dSSVRFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLAogCQkJCUFSNUtfUEhZX0lRX0NBTF9OVU1fTE9HX01BWCwgMTUpOwogCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19QSFlfSVEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMKaW5kZXggNzc2NjU0Mi4uMzBiNTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYwpAQCAtMTcsMjMgKzE3LDQ4IEBACiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotUXVldWUgQ29udHJvbCBVbml0LCBERlMgQ29udHJvbCBVbml0IEZ1bmN0aW9ucworUXVldWUgQ29udHJvbCBVbml0LCBEQ0YgQ29udHJvbCBVbml0IEZ1bmN0aW9ucwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKworLyoqCisgKiBET0M6IFF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKS9EQ0YgQ29udHJvbCBVbml0IChEQ1UpIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2Ugc2V0dXAgcGFyYW1ldGVycyBmb3IgdGhlIDEyIGF2YWlsYWJsZSBUWCBxdWV1ZXMuIE5vdGUgdGhhdAorICogb24gdGhlIHZhcmlvdXMgcmVnaXN0ZXJzIHdlIGNhbiB1c3VhbGx5IG9ubHkgbWFwIHRoZSBmaXJzdCAxMCBvZiB0aGVtIHNvCisgKiBiYXNpY2FsbHkgd2UgaGF2ZSAxMCBxdWV1ZXMgdG8gcGxheSB3aXRoLiBFYWNoIHF1ZXVlIGhhcyBhIG1hdGNoaW5nCisgKiBRQ1UgdGhhdCBjb250cm9scyB3aGVuIHRoZSBxdWV1ZSB3aWxsIGdldCB0cmlnZ2VyZWQgYW5kIG11bHRpcGxlIFFDVXMKKyAqIGNhbiBiZSBtYXBwZWQgdG8gYSBzaW5nbGUgRENVIHRoYXQgY29udHJvbHMgdGhlIHZhcmlvdXMgREZTIHBhcmFtZXRlcnMKKyAqIGZvciB0aGUgdmFyaW91cyBxdWV1ZXMuIEluIG91ciBzZXR1cCB3ZSBoYXZlIGEgMToxIG1hcHBpbmcgYmV0d2VlbiBRQ1VzCisgKiBhbmQgRENVcyBhbGxvd2luZyB1cyB0byBoYXZlIGRpZmZlcmVudCBERlMgc2V0dGluZ3MgZm9yIGVhY2ggcXVldWUuCisgKgorICogV2hlbiBhIGZyYW1lIGdvZXMgaW50byBhIFRYIHF1ZXVlLCBRQ1UgZGVjaWRlcyB3aGVuIGl0J2xsIHRyaWdnZXIgYQorICogdHJhbnNtaXNzaW9uIGJhc2VkIG9uIHZhcmlvdXMgY3JpdGVyaWEgKHN1Y2ggYXMgaG93IG1hbnkgZGF0YSB3ZSBoYXZlIGluc2lkZQorICogaXQncyBidWZmZXIgb3IgLWlmIGl0J3MgYSBiZWFjb24gcXVldWUtIGlmIGl0J3MgdGltZSB0byBmaXJlIHVwIHRoZSBxdWV1ZQorICogYmFzZWQgb24gVFNGIGV0YyksIERDVSBhZGRzIGJhY2tvZmYsIElGU2VzIGV0YyBhbmQgdGhlbiBhIHNjaGVkdWxlcgorICogKGFyYml0cmF0b3IpIGRlY2lkZXMgdGhlIHByaW9yaXR5IG9mIGVhY2ggUUNVIGJhc2VkIG9uIGl0J3MgY29uZmlndXJhdGlvbgorICogKGUuZy4gYmVhY29ucyBhcmUgYWx3YXlzIHRyYW5zbWl0dGVkIHdoZW4gdGhleSBsZWF2ZSBEQ1UgYnlwYXNzaW5nIGFsbCBvdGhlcgorICogZnJhbWVzIGZyb20gb3RoZXIgcXVldWVzIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQpLiBBZnRlciBhIGZyYW1lIGxlYXZlcworICogdGhlIERDVSBpdCBnb2VzIHRvIFBDVSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGFuZCB0aGVuIHRvIFBIWSBmb3IKKyAqIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uLgorICovCiAKIAogLyoqKioqKioqKioqKioqKioqKlwKICogSGVscGVyIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogR2V0IG51bWJlciBvZiBwZW5kaW5nIGZyYW1lcwotICogZm9yIGEgc3BlY2lmaWMgcXVldWUgWzUyMTErXQorLyoqCisgKiBhdGg1a19od19udW1fdHhfcGVuZGluZygpIC0gR2V0IG51bWJlciBvZiBwZW5kaW5nIGZyYW1lcyBmb3IgYSAgZ2l2ZW4gcXVldWUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKICAqLwotdTMyIGF0aDVrX2h3X251bV90eF9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3UzMgorYXRoNWtfaHdfbnVtX3R4X3BlbmRpbmcoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQogewogCXUzMiBwZW5kaW5nOwogCUFSNUtfQVNTRVJUX0VOVFJZKHF1ZXVlLCBhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9xdWV1ZXMucV90eF9udW0pOwpAQCAtNTgsMTAgKzgzLDEzIEBACiAJcmV0dXJuIHBlbmRpbmc7CiB9CiAKLS8qCi0gKiBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorLyoqCisgKiBhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKCkgLSBTZXQgYSB0cmFuc21pdCBxdWV1ZSBpbmFjdGl2ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAogICovCi12b2lkIGF0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQordm9pZAorYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJaWYgKFdBUk5fT04ocXVldWUgPj0gYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKSkKIAkJcmV0dXJuOwpAQCAtNzIsMzQgKzEwMCw1NiBAQAogCUFSNUtfUV9ESVNBQkxFX0JJVFMoYWgtPmFoX3R4cV9zdGF0dXMsIHF1ZXVlKTsKIH0KIAotLyoKKy8qKgorICogYXRoNWtfY3dfdmFsaWRhdGUoKSAtIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gY3cgaXMgdmFsaWQKKyAqIEBjd19yZXE6IFRoZSBjb250ZW50aW9uIHdpbmRvdyB2YWx1ZSB0byBjaGVjaworICoKICAqIE1ha2Ugc3VyZSBjdyBpcyBhIHBvd2VyIG9mIDIgbWludXMgMSBhbmQgc21hbGxlciB0aGFuIDEwMjQKICAqLwotc3RhdGljIHUxNiBhdGg1a19jd192YWxpZGF0ZSh1MTYgY3dfcmVxKQorc3RhdGljIHUxNgorYXRoNWtfY3dfdmFsaWRhdGUodTE2IGN3X3JlcSkKIHsKLQl1MzIgY3cgPSAxOwogCWN3X3JlcSA9IG1pbihjd19yZXEsICh1MTYpMTAyMyk7CiAKLQl3aGlsZSAoY3cgPCBjd19yZXEpCi0JCWN3ID0gKGN3IDw8IDEpIHwgMTsKKwkvKiBDaGVjayBpZiBjd19yZXEgKyAxIGEgcG93ZXIgb2YgMiAqLworCWlmIChpc19wb3dlcl9vZl8yKGN3X3JlcSArIDEpKQorCQlyZXR1cm4gY3dfcmVxOwogCi0JcmV0dXJuIGN3OworCS8qIENoZWNrIGlmIGN3X3JlcSBpcyBhIHBvd2VyIG9mIDIgKi8KKwlpZiAoaXNfcG93ZXJfb2ZfMihjd19yZXEpKQorCQlyZXR1cm4gY3dfcmVxIC0gMTsKKworCS8qIElmIG5vbmUgb2YgdGhlIGFib3ZlIGlzIGNvcnJlY3QKKwkgKiBmaW5kIHRoZSBjbG9zZXN0IHBvd2VyIG9mIDIgKi8KKwljd19yZXEgPSAodTE2KSByb3VuZHVwX3Bvd19vZl90d28oY3dfcmVxKSAtIDE7CisKKwlyZXR1cm4gY3dfcmVxOwogfQogCi0vKgotICogR2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKy8qKgorICogYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoKSAtIEdldCBwcm9wZXJ0aWVzIGZvciBhIHRyYW5zbWl0IHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCisgKiBAcXVldWVfaW5mbzogVGhlICZzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gdG8gZmlsbAogICovCi1pbnQgYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAoraW50CithdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCiAJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKIHsKIAltZW1jcHkocXVldWVfaW5mbywgJmFoLT5haF90eHFbcXVldWVdLCBzaXplb2Yoc3RydWN0IGF0aDVrX3R4cV9pbmZvKSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTZXQgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZQorLyoqCisgKiBhdGg1a19od19zZXRfdHhfcXVldWVwcm9wcygpIC0gU2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKKyAqIEBxaW5mbzogVGhlICZzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gdG8gdXNlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTyBpZiBxdWV1ZSBpcyBpbmFjdGl2ZQogICovCi1pbnQgYXRoNWtfaHdfc2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAoraW50CithdGg1a19od19zZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCiAJCQkJY29uc3Qgc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxaW5mbykKIHsKIAlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnFpOwpAQCAtMTM5LDEwICsxODksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgYSB0cmFuc21pdCBxdWV1ZQorLyoqCisgKiBhdGg1a19od19zZXR1cF90eF9xdWV1ZSgpIC0gSW5pdGlhbGl6ZSBhIHRyYW5zbWl0IHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWVfdHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWUKKyAqIEBxdWV1ZV9pbmZvOiBUaGUgJnN0cnVjdCBhdGg1a190eHFfaW5mbyB0byB1c2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIGFyZ3VtZW50cwogICovCi1pbnQgYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a190eF9xdWV1ZSBxdWV1ZV90eXBlLAoraW50CithdGg1a19od19zZXR1cF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3R4X3F1ZXVlIHF1ZXVlX3R5cGUsCiAJCXN0cnVjdCBhdGg1a190eHFfaW5mbyAqcXVldWVfaW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgcXVldWU7CkBAIC0yMTcsMTAgKzI3MywxNiBAQAogKiBTaW5nbGUgUUNVL0RDVSBpbml0aWFsaXphdGlvbiAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFNldCB0eCByZXRyeSBsaW1pdHMgb24gRENVCisvKioKKyAqIGF0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoKSAtIFNldCB0eCByZXRyeSBsaW1pdHMgb24gRENVCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGEgcXVldWUsIHRvIHNldAorICogcmV0cnkgbGltaXRzIGJhc2VkIG9uIGFoLT5haF9yZXRyeV8qIGFuZCB0aGUgY2hpcHNldCB1c2VkLgogICovCi12b2lkIGF0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoc3RydWN0IGF0aDVrX2h3ICphaCwKK3ZvaWQKK2F0aDVrX2h3X3NldF90eF9yZXRyeV9saW1pdHMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQkgIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAkvKiBTaW5nbGUgZGF0YSBxdWV1ZSBvbiBBUjUyMTAgKi8KQEAgLTI1NSwxNSArMzE3LDE1IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUgLSBJbml0aWFsaXplIGEgc2luZ2xlIGh3IHF1ZXVlCisgKiBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIC0gSW5pdGlhbGl6ZSBhIHNpbmdsZSBodyBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAogICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHF1ZXVlIFRoZSBodyBxdWV1ZSBudW1iZXIKLSAqCi0gKiBTZXQgREZTIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiB0cmFuc21pdCBxdWV1ZSBvbiBEQ1UKKyAqIFNldCBEQ0YgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIHRyYW5zbWl0IHF1ZXVlIG9uIERDVQogICogYW5kIGNvbmZpZ3VyZXMgYWxsIHF1ZXVlLXNwZWNpZmljIHBhcmFtZXRlcnMuCiAgKi8KLWludCBhdGg1a19od19yZXNldF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnRxID0gJmFoLT5haF90eHFbcXVldWVdOwogCkBAIC00OTEsMTAgKzU1Myw5IEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2lmc19pbnRlcnZhbHMgIC0gU2V0IGdsb2JhbCBpbnRlci1mcmFtZSBzcGFjZXMgb24gRENVCi0gKgotICogQGFoIFRoZSAmc3RydWN0IGF0aDVrX2h3Ci0gKiBAc2xvdF90aW1lIFNsb3QgdGltZSBpbiB1cworICogYXRoNWtfaHdfc2V0X2lmc19pbnRlcnZhbHMoKSAgLSBTZXQgZ2xvYmFsIGludGVyLWZyYW1lIHNwYWNlcyBvbiBEQ1UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzbG90X3RpbWU6IFNsb3QgdGltZSBpbiB1cwogICoKICAqIFNldHMgdGhlIGdsb2JhbCBJRlMgaW50ZXJ2YWxzIG9uIERDVSAoYWxzbyB3b3JrcyBvbiBBUjUyMTApIGZvcgogICogdGhlIGdpdmVuIHNsb3QgdGltZSBhbmQgdGhlIGN1cnJlbnQgYndtb2RlLgpAQCAtNTk3LDcgKzY1OCwxNSBAQAogfQogCiAKLWludCBhdGg1a19od19pbml0X3F1ZXVlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorLyoqCisgKiBhdGg1a19od19pbml0X3F1ZXVlcygpIC0gSW5pdGlhbGl6ZSB0eCBxdWV1ZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBJbml0aWFsaXplcyBhbGwgdHggcXVldWVzIGJhc2VkIG9uIGluZm9ybWF0aW9uIG9uCisgKiBhaC0+YWhfdHhxKiBzZXQgYnkgdGhlIGRyaXZlcgorICovCitpbnQKK2F0aDVrX2h3X2luaXRfcXVldWVzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGksIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oCmluZGV4IGY1YzEwMDAuLjBlYTE2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmgKQEAgLTI4MCw2ICsyODAsMTAgQEAKICAqIDUyMTEvNTIxMiB3ZSBoYXZlIG9uZSBwcmltYXJ5IGFuZCA0IHNlY29uZGFyeSByZWdpc3RlcnMuCiAgKiBTbyB3ZSBoYXZlIEFSNUtfSVNSIGZvciA1MjEwIGFuZCBBUjVLX1BJU1IgL1NJU1J4IGZvciA1MjExLzUyMTIuCiAgKiBNb3N0IG9mIHRoZXNlIGJpdHMgYXJlIGNvbW1vbiBmb3IgYWxsIGNoaXBzZXRzLgorICoKKyAqIE5PVEU6IE9uIDUyMTErIFRYT0ssIFRYREVTQywgVFhFUlIsIFRYRU9MIGFuZCBUWFVSTiBjb250YWluCisgKiB0aGUgbG9naWNhbCBPUiBmcm9tIHBlci1xdWV1ZSBpbnRlcnJ1cHQgYml0cyBmb3VuZCBvbiBTSVNSIHJlZ2lzdGVycworICogKHNlZSBiZWxvdykuCiAgKi8KICNkZWZpbmUgQVI1S19JU1IJCTB4MDAxYwkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfUElTUgkJMHgwMDgwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCkBAIC0yOTIsNyArMjk2LDEwIEBACiAjZGVmaW5lIEFSNUtfSVNSX1RYT0sJCTB4MDAwMDAwNDAJLyogRnJhbWUgc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYREVTQwkJMHgwMDAwMDA4MAkvKiBUWCBkZXNjcmlwdG9yIHJlcXVlc3QgKi8KICNkZWZpbmUgQVI1S19JU1JfVFhFUlIJCTB4MDAwMDAxMDAJLyogVHJhbnNtaXQgZXJyb3IgKi8KLSNkZWZpbmUgQVI1S19JU1JfVFhOT0ZSTQkweDAwMDAwMjAwCS8qIE5vIGZyYW1lIHRyYW5zbWl0dGVkICh0cmFuc21pdCB0aW1lb3V0KSAqLworI2RlZmluZSBBUjVLX0lTUl9UWE5PRlJNCTB4MDAwMDAyMDAJLyogTm8gZnJhbWUgdHJhbnNtaXR0ZWQgKHRyYW5zbWl0IHRpbWVvdXQpCisJCQkJCQkgKiBOT1RFOiBXZSBkb24ndCBoYXZlIHBlci1xdWV1ZSBpbmZvIGZvciB0aGlzCisJCQkJCQkgKiBvbmUsIGJ1dCB3ZSBjYW4gZW5hYmxlIGl0IHBlci1xdWV1ZSB0aHJvdWdoCisJCQkJCQkgKiBUWE5PRlJNX1FDVSBmaWVsZCBvbiBUWE5PRlJNIHJlZ2lzdGVyICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYRU9MCQkweDAwMDAwNDAwCS8qIEVtcHR5IFRYIGRlc2NyaXB0b3IgKi8KICNkZWZpbmUgQVI1S19JU1JfVFhVUk4JCTB4MDAwMDA4MDAJLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAqLwogI2RlZmluZSBBUjVLX0lTUl9NSUIJCTB4MDAwMDEwMDAJLyogVXBkYXRlIE1JQiBjb3VudGVycyAqLwpAQCAtMzAyLDIxICszMDksMjkgQEAKICNkZWZpbmUgQVI1S19JU1JfU1dCQQkJMHgwMDAxMDAwMAkvKiBTb2Z0d2FyZSBiZWFjb24gYWxlcnQgKi8KICNkZWZpbmUgQVI1S19JU1JfQlJTU0kJCTB4MDAwMjAwMDAJLyogQmVhY29uIHJzc2kgYmVsb3cgdGhyZXNob2xkICg/KSAqLwogI2RlZmluZSBBUjVLX0lTUl9CTUlTUwkJMHgwMDA0MDAwMAkvKiBCZWFjb24gbWlzc2VkICovCi0jZGVmaW5lIEFSNUtfSVNSX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfSElVRVJSCQkweDAwMDgwMDAwCS8qIEhvc3QgSW50ZXJmYWNlIFVuaXQgZXJyb3IgWzUyMTErXQorCQkJCQkJICogJ29yJyBvZiBNQ0FCVCwgU1NFUlIsIERQRVJSIGZyb20gU0lTUjIgKi8KICNkZWZpbmUgQVI1S19JU1JfQk5SCQkweDAwMTAwMDAwCS8qIEJlYWNvbiBub3QgcmVhZHkgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0lTUl9NQ0FCVAkJMHgwMDEwMDAwMAkvKiBNYXN0ZXIgQ3ljbGUgQWJvcnQgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYQ0hJUlAJMHgwMDIwMDAwMAkvKiBDSElSUCBSZWNlaXZlZCBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSVNSX1NTRVJSCQkweDAwMjAwMDAwCS8qIFNpZ25hbGVkIFN5c3RlbSBFcnJvciBbNTIxMF0gKi8KLSNkZWZpbmUgQVI1S19JU1JfRFBFUlIJCTB4MDA0MDAwMDAJLyogRGV0IHBhciBFcnJvciAoPykgWzUyMTBdICovCisjZGVmaW5lIEFSNUtfSVNSX0RQRVJSCQkweDAwNDAwMDAwCS8qIEJ1cyBwYXJpdHkgZXJyb3IgWzUyMTBdICovCiAjZGVmaW5lIEFSNUtfSVNSX1JYRE9QUExFUgkweDAwNDAwMDAwCS8qIERvcHBsZXIgY2hpcnAgcmVjZWl2ZWQgWzUyMTIrXSAqLwogI2RlZmluZSBBUjVLX0lTUl9USU0JCTB4MDA4MDAwMDAJLyogWzUyMTErXSAqLwotI2RlZmluZSBBUjVLX0lTUl9CQ05NSVNDCTB4MDA4MDAwMDAJLyogJ29yJyBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQywgQkNOX1RJTUVPVVQsCi0JCQkJCQlDQUJfVElNRU9VVCBhbmQgRFRJTSBiaXRzIGZyb20gU0lTUjIgWzUyMTIrXSAqLworI2RlZmluZSBBUjVLX0lTUl9CQ05NSVNDCTB4MDA4MDAwMDAJLyogTWlzYyBiZWFjb24gcmVsYXRlZCBpbnRlcnJ1cHQKKwkJCQkJCSAqICdvcicgb2YgVElNLCBDQUJfRU5ELCBEVElNX1NZTkMsIEJDTl9USU1FT1VULAorCQkJCQkJICogQ0FCX1RJTUVPVVQgYW5kIERUSU0gYml0cyBmcm9tIFNJU1IyIFs1MjEyK10gKi8KICNkZWZpbmUgQVI1S19JU1JfR1BJTwkJMHgwMTAwMDAwMAkvKiBHUElPIChyZiBraWxsKSAqLwogI2RlZmluZSBBUjVLX0lTUl9RQ0JST1JOCTB4MDIwMDAwMDAJLyogUUNVIENCUiBvdmVycnVuIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfUUNCUlVSTgkweDA0MDAwMDAwCS8qIFFDVSBDQlIgdW5kZXJydW4gWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0lTUl9RVFJJRwkJMHgwODAwMDAwMAkvKiBRQ1Ugc2NoZWR1bGluZyB0cmlnZ2VyIFs1MjExK10gKi8KIAorI2RlZmluZQlBUjVLX0lTUl9CSVRTX0ZST01fU0lTUlMJKEFSNUtfSVNSX1RYT0sgfCBBUjVLX0lTUl9UWERFU0MgfFwKKwkJCQkJQVI1S19JU1JfVFhFUlIgfCBBUjVLX0lTUl9UWEVPTCB8XAorCQkJCQlBUjVLX0lTUl9UWFVSTiB8IEFSNUtfSVNSX0hJVUVSUiB8XAorCQkJCQlBUjVLX0lTUl9CQ05NSVNDIHwgQVI1S19JU1JfUUNCUk9STiB8XAorCQkJCQlBUjVLX0lTUl9RQ0JSVVJOIHwgQVI1S19JU1JfUVRSSUcpCisKIC8qCiAgKiBTZWNvbmRhcnkgc3RhdHVzIHJlZ2lzdGVycyBbNTIxMStdICgwIC0gNCkKICAqCkBAIC0zNDcsNyArMzYyLDcgQEAKICNkZWZpbmUJQVI1S19TSVNSMl9CQ05fVElNRU9VVAkweDA4MDAwMDAwCS8qIEJlYWNvbiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9DQUJfVElNRU9VVAkweDEwMDAwMDAwCS8qIENBQiBUaW1lb3V0IFs1MjEyK10gKi8KICNkZWZpbmUJQVI1S19TSVNSMl9EVElNCQkweDIwMDAwMDAwCS8qIFs1MjEyK10gKi8KLSNkZWZpbmUJQVI1S19TSVNSMl9UU0ZPT1IJMHg4MDAwMDAwMAkvKiBUU0YgT09SICg/KSAqLworI2RlZmluZQlBUjVLX1NJU1IyX1RTRk9PUgkweDgwMDAwMDAwCS8qIFRTRiBPdXQgb2YgcmFuZ2UgKi8KIAogI2RlZmluZSBBUjVLX1NJU1IzCQkweDAwOTAJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19TSVNSM19RQ0JST1JOCTB4MDAwMDAzZmYJLyogTWFzayBmb3IgUUNCUk9STiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwppbmRleCAyYWJhYzI1Li40YWVkM2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYwpAQCAtMTksOSArMTksOSBAQAogICoKICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gIFJlc2V0IGZ1bmN0aW9ucyBhbmQgaGVscGVycwotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIFJlc2V0IGZ1bmN0aW9uIGFuZCBoZWxwZXJzCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMzMsMTQgKzMzLDM2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCisvKioKKyAqIERPQzogUmVzZXQgZnVuY3Rpb24gYW5kIGhlbHBlcnMKKyAqCisgKiBIZXJlIHdlIGltcGxlbWVudCB0aGUgbWFpbiByZXNldCByb3V0aW5lLCB1c2VkIHRvIGJyaW5nIHRoZSBjYXJkCisgKiB0byBhIHdvcmtpbmcgc3RhdGUgYW5kIHJlYWR5IHRvIHJlY2VpdmUuIFdlIGFsc28gaGFuZGxlIHJvdXRpbmVzCisgKiB0aGF0IGRvbid0IGZpdCBvbiBvdGhlciBwbGFjZXMgc3VjaCBhcyBjbG9jaywgc2xlZXAgYW5kIHBvd2VyIGNvbnRyb2wKKyAqLworCisKIC8qKioqKioqKioqKioqKioqKipcCiAqIEhlbHBlciBmdW5jdGlvbnMgKgogXCoqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIENoZWNrIGlmIGEgcmVnaXN0ZXIgd3JpdGUgaGFzIGJlZW4gY29tcGxldGVkCisvKioKKyAqIGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoKSAtIFBvbGwgYSByZWdpc3RlciBmb3IgYSBmbGFnL2ZpZWxkIGNoYW5nZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHJlZzogVGhlIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBmbGFnOiBUaGUgZmxhZy9maWVsZCB0byBjaGVjayBvbiB0aGUgcmVnaXN0ZXIKKyAqIEB2YWw6IFRoZSBmaWVsZCB2YWx1ZSB3ZSBleHBlY3QgKGlmIHdlIGNoZWNrIGEgZmllbGQpCisgKiBAaXNfc2V0OiBJbnN0ZWFkIG9mIGNoZWNraW5nIGlmIHRoZSBmbGFnIGdvdCBjbGVhcmVkLCBjaGVjayBpZiBpdCBnb3Qgc2V0CisgKgorICogU29tZSByZWdpc3RlcnMgY29udGFpbiBmbGFncyB0aGF0IGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGlzCisgKiBydW5uaW5nLiBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBwb2xsIHRoZXNlIHJlZ2lzdGVycyBhbmQgY2hlY2sKKyAqIGlmIHRoZXNlIGZsYWdzIGdldCBjbGVhcmVkLiBXZSBhbHNvIHVzZSBpdCB0byBwb2xsIGEgcmVnaXN0ZXIKKyAqIGZpZWxkIChjb250YWluaW5nIG11bHRpcGxlIGZsYWdzKSB1bnRpbCBpdCBnZXRzIGEgc3BlY2lmaWMgdmFsdWUuCisgKgorICogUmV0dXJucyAtRUFHQUlOIGlmIHdlIGV4Y2VlZGVkIEFSNUtfVFVORV9SRUdJU1RFUl9USU1FT1VUICogMTV1cyBvciAwCiAgKi8KLWludCBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLCB1MzIgdmFsLAoraW50CithdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiByZWcsIHUzMiBmbGFnLCB1MzIgdmFsLAogCQkJICAgICAgYm9vbCBpc19zZXQpCiB7CiAJaW50IGk7CkBAIC02NCwzNSArODYsNDggQEAKIFwqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X2h0b2Nsb2NrIC0gVHJhbnNsYXRlIHVzZWMgdG8gaHcgY2xvY2sgdW5pdHMKLSAqCisgKiBhdGg1a19od19odG9jbG9jaygpIC0gVHJhbnNsYXRlIHVzZWMgdG8gaHcgY2xvY2sgdW5pdHMKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEB1c2VjOiB2YWx1ZSBpbiBtaWNyb3NlY29uZHMKKyAqCisgKiBUcmFuc2xhdGUgdXNlY3MgdG8gaHcgY2xvY2sgdW5pdHMgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAqIGh3IGNsb2NrIHJhdGUuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgY2xvY2sgdW5pdHMKICAqLwotdW5zaWduZWQgaW50IGF0aDVrX2h3X2h0b2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB1c2VjKQordW5zaWduZWQgaW50CithdGg1a19od19odG9jbG9jayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdXNlYykKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAlyZXR1cm4gdXNlYyAqIGNvbW1vbi0+Y2xvY2tyYXRlOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X2Nsb2NrdG9oIC0gVHJhbnNsYXRlIGh3IGNsb2NrIHVuaXRzIHRvIHVzZWMKKyAqIGF0aDVrX2h3X2Nsb2NrdG9oKCkgLSBUcmFuc2xhdGUgaHcgY2xvY2sgdW5pdHMgdG8gdXNlYworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGNsb2NrOiB2YWx1ZSBpbiBodyBjbG9jayB1bml0cworICoKKyAqIFRyYW5zbGF0ZSBodyBjbG9jayB1bml0cyB0byB1c2VjcyBiYXNlZCBvbiB0aGUgY3VycmVudAorICogaHcgY2xvY2sgcmF0ZS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiB1c2VjcwogICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfY2xvY2t0b2goc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGNsb2NrKQordW5zaWduZWQgaW50CithdGg1a19od19jbG9ja3RvaChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgY2xvY2spCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJcmV0dXJuIGNsb2NrIC8gY29tbW9uLT5jbG9ja3JhdGU7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfaW5pdF9jb3JlX2Nsb2NrIC0gSW5pdGlhbGl6ZSBjb3JlIGNsb2NrCisgKiBhdGg1a19od19pbml0X2NvcmVfY2xvY2soKSAtIEluaXRpYWxpemUgY29yZSBjbG9jaworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICoKLSAqIEluaXRpYWxpemUgY29yZSBjbG9jayBwYXJhbWV0ZXJzICh1c2VjLCB1c2VjMzIsIGxhdGVuY2llcyBldGMpLgorICogSW5pdGlhbGl6ZSBjb3JlIGNsb2NrIHBhcmFtZXRlcnMgKHVzZWMsIHVzZWMzMiwgbGF0ZW5jaWVzIGV0YyksCisgKiBiYXNlZCBvbiBjdXJyZW50IGJ3bW9kZSBhbmQgY2hpcHNldCBwcm9wZXJ0aWVzLgogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbml0X2NvcmVfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCkKK3N0YXRpYyB2b2lkCithdGg1a19od19pbml0X2NvcmVfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwpAQCAtMjI3LDE2ICsyNjIsMjEgQEAKIAl9CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2h3X3NldF9zbGVlcF9jbG9jaygpIC0gU2V0dXAgc2xlZXAgY2xvY2sgb3BlcmF0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZW5hYmxlOiBFbmFibGUgc2xlZXAgY2xvY2sgb3BlcmF0aW9uIChmYWxzZSB0byBkaXNhYmxlKQorICoKICAqIElmIHRoZXJlIGlzIGFuIGV4dGVybmFsIDMyS0h6IGNyeXN0YWwgYXZhaWxhYmxlLCB1c2UgaXQKICAqIGFzIHJlZi4gY2xvY2sgaW5zdGVhZCBvZiAzMi80ME1IeiBjbG9jayBhbmQgYmFzZWJhbmQgY2xvY2tzCiAgKiB0byBzYXZlIHBvd2VyIGR1cmluZyBzbGVlcCBvciByZXN0b3JlIG5vcm1hbCAzMi80ME1IegogICogb3BlcmF0aW9uLgogICoKLSAqIFhYWDogV2hlbiBvcGVyYXRpbmcgb24gMzJLSHogY2VydGFpbiBQSFkgcmVnaXN0ZXJzICgyNyAtIDMxLAotICoJMTIzIC0gMTI3KSByZXF1aXJlIGRlbGF5IG9uIGFjY2Vzcy4KKyAqIE5PVEU6IFdoZW4gb3BlcmF0aW5nIG9uIDMyS0h6IGNlcnRhaW4gUEhZIHJlZ2lzdGVycyAoMjcgLSAzMSwKKyAqIDEyMyAtIDEyNykgcmVxdWlyZSBkZWxheSBvbiBhY2Nlc3MuCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3NldF9zbGVlcF9jbG9jayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGVuYWJsZSkKK3N0YXRpYyB2b2lkCithdGg1a19od19zZXRfc2xlZXBfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CiAJdTMyIHNjYWwsIHNwZW5kaW5nLCBzY2xvY2s7CkBAIC0zNDAsMTAgKzM4MCwxOSBAQAogKiBSZXNldC9TbGVlcCBjb250cm9sICoKIFwqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBSZXNldCBjaGlwc2V0CisvKioKKyAqIGF0aDVrX2h3X25pY19yZXNldCgpIC0gUmVzZXQgdGhlIHZhcmlvdXMgY2hpcHNldCB1bml0cworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHZhbDogTWFzayB0byBpbmRpY2F0ZSB3aGF0IHVuaXRzIHRvIHJlc2V0CisgKgorICogVG8gcmVzZXQgdGhlIHZhcmlvdXMgY2hpcHNldCB1bml0cyB3ZSBuZWVkIHRvIHdyaXRlCisgKiB0aGUgbWFzayB0byBBUjVLX1JFU0VUX0NUTCBhbmQgcG9sbCB0aGUgcmVnaXN0ZXIgdW50aWwKKyAqIGFsbCBmbGFncyBhcmUgY2xlYXJlZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgYXJlIE8uSy4gb3IgLUVBR0FJTiAoZnJvbSBhdGhrNV9od19yZWdpc3Rlcl90aW1lb3V0KQogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X25pY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgdmFsKQorc3RhdGljIGludAorYXRoNWtfaHdfbmljX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiB2YWwpCiB7CiAJaW50IHJldDsKIAl1MzIgbWFzayA9IHZhbCA/IHZhbCA6IH4wVTsKQEAgLTM1Nyw3ICs0MDYsNyBAQAogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgdmFsLCBBUjVLX1JFU0VUX0NUTCk7CiAKIAkvKiBXYWl0IGF0IGxlYXN0IDEyOCBQQ0kgY2xvY2tzICovCi0JdWRlbGF5KDE1KTsKKwl1c2xlZXBfcmFuZ2UoMTUsIDIwKTsKIAogCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewogCQl2YWwgJj0gQVI1S19SRVNFVF9DVExfUENVIHwgQVI1S19SRVNFVF9DVExfRE1BCkBAIC0zODIsMTIgKzQzMSwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZXNldCBBSEIgY2hpcHNldAotICogQVI1S19SRVNFVF9DVExfUENVIGZsYWcgcmVzZXRzIFdNQUMKLSAqIEFSNUtfUkVTRVRfQ1RMX0JBU0VCQU5EIGZsYWcgcmVzZXRzIFdCQgorLyoqCisgKiBhdGg1a19od193aXNvY19yZXNldCgpIC0gIFJlc2V0IEFIQiBjaGlwc2V0CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZmxhZ3M6IE1hc2sgdG8gaW5kaWNhdGUgd2hhdCB1bml0cyB0byByZXNldAorICoKKyAqIFNhbWUgYXMgYXRoNWtfaHdfbmljX3Jlc2V0IGJ1dCBmb3IgQUhCIGJhc2VkIGRldmljZXMKKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgYXJlIE8uSy4gb3IgLUVBR0FJTiAoZnJvbSBhdGhrNV9od19yZWdpc3Rlcl90aW1lb3V0KQogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3dpc29jX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmbGFncykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3dpc29jX3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmbGFncykKIHsKIAl1MzIgbWFzayA9IGZsYWdzID8gZmxhZ3MgOiB+MFU7CiAJdTMyIF9faW9tZW0gKnJlZzsKQEAgLTQyMiw3ICs0NzYsNyBAQAogCXJlZ3ZhbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJX19yYXdfd3JpdGVsKHJlZ3ZhbCB8IHZhbCwgcmVnKTsKIAlyZWd2YWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCXVkZWxheSgxMDApOworCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7CiAKIAkvKiBCcmluZyBCQi9NQUMgb3V0IG9mIHJlc2V0ICovCiAJX19yYXdfd3JpdGVsKHJlZ3ZhbCAmIH52YWwsIHJlZyk7CkBAIC00MzksMTEgKzQ5MywyMyBAQAogCXJldHVybiAwOwogfQogCi0KLS8qCi0gKiBTbGVlcCBjb250cm9sCisvKioKKyAqIGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKCkgLSBTZXQgcG93ZXIgbW9kZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX3Bvd2VyX21vZGUKKyAqIEBzZXRfY2hpcDogU2V0IHRvIHRydWUgdG8gd3JpdGUgc2xlZXAgY29udHJvbCByZWdpc3RlcgorICogQHNsZWVwX2R1cmF0aW9uOiBIb3cgbXVjaCB0aW1lIHRoZSBkZXZpY2UgaXMgYWxsb3dlZCB0byBzbGVlcAorICogd2hlbiBzbGVlcCBsb2dpYyBpcyBlbmFibGVkIChpbiAxMjggbWljcm9zZWNvbmQgaW5jcmVtZW50cykuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBzbGVlcCBwb2xpY3kgYW5kIGFsbG93ZWQKKyAqIHNsZWVwIG1vZGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayBvdXQgdGhlIHNsZWVwIGNvbnRyb2wKKyAqIHJlZ2lzdGVyIG9uIHJlZy5oIGFuZCBTVEFfSUQxLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlPIGlmIGNoaXAgZGlkbid0IHdha2UgdXAgb3IgLUVJTlZBTCBpZiBhbiBpbnZhbGlkCisgKiBtb2RlIGlzIHJlcXVlc3RlZC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19zZXRfcG93ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19wb3dlcl9tb2RlIG1vZGUsCitzdGF0aWMgaW50CithdGg1a19od19zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGF0aDVrX3Bvd2VyX21vZGUgbW9kZSwKIAkJCSAgICAgIGJvb2wgc2V0X2NoaXAsIHUxNiBzbGVlcF9kdXJhdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTQ5Myw3ICs1NTksNyBAQAogCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSB8IEFSNUtfU0xFRVBfQ1RMX1NMRV9XQUtFLAogCQkJCQkJCUFSNUtfU0xFRVBfQ1RMKTsKLQkJdWRlbGF5KDE1KTsKKwkJdXNsZWVwX3JhbmdlKDE1LCAyMCk7CiAKIAkJZm9yIChpID0gMjAwOyBpID4gMDsgaS0tKSB7CiAJCQkvKiBDaGVjayBpZiB0aGUgY2hpcCBkaWQgd2FrZSB1cCAqLwpAQCAtNTAyLDcgKzU2OCw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCS8qIFdhaXQgYSBiaXQgYW5kIHJldHJ5ICovCi0JCQl1ZGVsYXkoNTApOworCQkJdXNsZWVwX3JhbmdlKDUwLCA3NSk7CiAJCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEgfCBBUjVLX1NMRUVQX0NUTF9TTEVfV0FLRSwKIAkJCQkJCQlBUjVLX1NMRUVQX0NUTCk7CiAJCX0KQEAgLTUyMywxNyArNTg5LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQdXQgZGV2aWNlIG9uIGhvbGQKKy8qKgorICogYXRoNWtfaHdfb25faG9sZCgpIC0gUHV0IGRldmljZSBvbiBob2xkCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgotICogUHV0IE1BQyBhbmQgQmFzZWJhbmQgb24gd2FybSByZXNldCBhbmQKLSAqIGtlZXAgdGhhdCBzdGF0ZSAoZG9uJ3QgY2xlYW4gc2xlZXAgY29udHJvbAotICogcmVnaXN0ZXIpLiBBZnRlciB0aGlzIE1BQyBhbmQgQmFzZWJhbmQgYXJlCi0gKiBkaXNhYmxlZCBhbmQgYSBmdWxsIHJlc2V0IGlzIG5lZWRlZCB0byBjb21lCi0gKiBiYWNrLiBUaGlzIHdheSB3ZSBzYXZlIGFzIG11Y2ggcG93ZXIgYXMgcG9zc2libGUKKyAqIFB1dCBNQUMgYW5kIEJhc2ViYW5kIG9uIHdhcm0gcmVzZXQgYW5kIGtlZXAgdGhhdCBzdGF0ZQorICogKGRvbid0IGNsZWFuIHNsZWVwIGNvbnRyb2wgcmVnaXN0ZXIpLiBBZnRlciB0aGlzIE1BQworICogYW5kIEJhc2ViYW5kIGFyZSBkaXNhYmxlZCBhbmQgYSBmdWxsIHJlc2V0IGlzIG5lZWRlZAorICogdG8gY29tZSBiYWNrLiBUaGlzIHdheSB3ZSBzYXZlIGFzIG11Y2ggcG93ZXIgYXMgcG9zc2libGUKICAqIHdpdGhvdXQgcHV0dGluZyB0aGUgY2FyZCBvbiBmdWxsIHNsZWVwLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU8gb24gZXJyb3IKICAqLwotaW50IGF0aDVrX2h3X29uX2hvbGQoc3RydWN0IGF0aDVrX2h3ICphaCkKK2ludAorYXRoNWtfaHdfb25faG9sZChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWgtPnBkZXY7CiAJdTMyIGJ1c19mbGFnczsKQEAgLTU0Myw3ICs2MTIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIE1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byB3YWtldXAgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTU2Myw3ICs2MzIsNyBAQAogCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9ETUEgfAogCQkJQVI1S19SRVNFVF9DVExfUEhZIHwgQVI1S19SRVNFVF9DVExfUENJKTsKLQkJCW1kZWxheSgyKTsKKwkJCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAl9IGVsc2UgewogCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCB8IGJ1c19mbGFncyk7CkBAIC01NzUsNyArNjQ0LDcgQEAKIAl9CiAKIAkvKiAuLi53YWtldXAgYWdhaW4hKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byBwdXQgZGV2aWNlIG9uIGhvbGRcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtNTg0LDExICs2NTMsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgorLyoqCisgKiBhdGg1a19od19uaWNfd2FrZXVwKCkgLSBGb3JjZSBjYXJkIG91dCBvZiBzbGVlcAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgogICogQnJpbmcgdXAgTUFDICsgUEhZIENoaXBzIGFuZCBwcm9ncmFtIFBMTAotICogQ2hhbm5lbCBpcyBOVUxMIGZvciB0aGUgaW5pdGlhbCB3YWtldXAuCisgKiBOT1RFOiBDaGFubmVsIGlzIE5VTEwgZm9yIHRoZSBpbml0aWFsIHdha2V1cC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTyBvbiBodyBmYWlsdXJlIG9yIC1FSU5WQUwgZm9yIGZhbHNlIGNoYW5uZWwgaW5mb3MKICAqLwotaW50IGF0aDVrX2h3X25pY193YWtldXAoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQoraW50CithdGg1a19od19uaWNfd2FrZXVwKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5wZGV2OwogCXUzMiB0dXJibywgbW9kZSwgY2xvY2ssIGJ1c19mbGFnczsKQEAgLTYwMCw3ICs2NzYsNyBAQAogCiAJaWYgKChhdGg1a19nZXRfYnVzX3R5cGUoYWgpICE9IEFUSF9BSEIpIHx8IGNoYW5uZWwpIHsKIAkJLyogV2FrZXVwIHRoZSBkZXZpY2UgKi8KLQkJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKKwkJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyX21vZGUoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwogCQlpZiAocmV0KSB7CiAJCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gd2FrZXVwIHRoZSBNQUMgQ2hpcFxuIik7CiAJCQlyZXR1cm4gcmV0OwpAQCAtNjIxLDcgKzY5Nyw3IEBACiAJCXJldCA9IGF0aDVrX2h3X25pY19yZXNldChhaCwgQVI1S19SRVNFVF9DVExfUENVIHwKIAkJCUFSNUtfUkVTRVRfQ1RMX01BQyB8IEFSNUtfUkVTRVRfQ1RMX0RNQSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9QSFkgfCBBUjVLX1JFU0VUX0NUTF9QQ0kpOwotCQkJbWRlbGF5KDIpOworCQkJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOwogCX0gZWxzZSB7CiAJCWlmIChhdGg1a19nZXRfYnVzX3R5cGUoYWgpID09IEFUSF9BSEIpCiAJCQlyZXQgPSBhdGg1a19od193aXNvY19yZXNldChhaCwgQVI1S19SRVNFVF9DVExfUENVIHwKQEAgLTYzNyw3ICs3MTMsNyBAQAogCX0KIAogCS8qIC4uLndha2V1cCBhZ2FpbiEuLi4qLwotCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcihhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CisJcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyX21vZGUoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOwogCWlmIChyZXQpIHsKIAkJQVRINUtfRVJSKGFoLCAiZmFpbGVkIHRvIHJlc3VtZSB0aGUgTUFDIENoaXBcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtNzM5LDcgKzgxNSw3IEBACiAJCS8qIC4uLnVwZGF0ZSBQTEwgaWYgbmVlZGVkICovCiAJCWlmIChhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfUExMKSAhPSBjbG9jaykgewogCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBjbG9jaywgQVI1S19QSFlfUExMKTsKLQkJCXVkZWxheSgzMDApOworCQkJdXNsZWVwX3JhbmdlKDMwMCwgMzUwKTsKIAkJfQogCiAJCS8qIC4uLnNldCB0aGUgUEhZIG9wZXJhdGluZyBtb2RlICovCkBAIC03NTUsOCArODMxLDE5IEBACiAqIFBvc3QtaW5pdHZhbHMgcmVnaXN0ZXIgbW9kaWZpY2F0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFRPRE86IEhhbGYvUXVhcnRlciByYXRlICovCi1zdGF0aWMgdm9pZCBhdGg1a19od190d2Vha19pbml0dmFsX3NldHRpbmdzKHN0cnVjdCBhdGg1a19odyAqYWgsCisvKioKKyAqIGF0aDVrX2h3X3R3ZWFrX2luaXR2YWxfc2V0dGluZ3MoKSAtIFR3ZWFrIGluaXRpYWwgc2V0dGluZ3MKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFNvbWUgc2V0dGluZ3MgYXJlIG5vdCBoYW5kbGVkIG9uIGluaXR2YWxzLCBlLmcuIGJ3bW9kZQorICogc2V0dGluZ3MsIHNvbWUgcGh5IHNldHRpbmdzLCB3b3JrYXJvdW5kcyBldGMgdGhhdCBpbiBnZW5lcmFsCisgKiBkb24ndCBmaXQgYW55d2hlcmUgZWxzZSBvciBhcmUgdG9vIHNtYWxsIHRvIGludHJvZHVjZSBhIHNlcGFyYXRlCisgKiBmdW5jdGlvbiBmb3IgZWFjaCBvbmUuIFNvIHdlIGhhdmUgdGhpcyBmdW5jdGlvbiB0byBoYW5kbGUKKyAqIHRoZW0gYWxsIGR1cmluZyByZXNldCBhbmQgY29tcGxldGUgY2FyZCdzIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfdHdlYWtfaW5pdHZhbF9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIgJiYKQEAgLTg3NSw3ICs5NjIsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDVrX2h3X2NvbW1pdF9lZXByb21fc2V0dGluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncygpIC0gQ29tbWl0IHNldHRpbmdzIGZyb20gRUVQUk9NCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBVc2Ugc2V0dGluZ3Mgc3RvcmVkIG9uIEVFUFJPTSB0byBwcm9wZXJseSBpbml0aWFsaXplIHRoZSBjYXJkCisgKiBiYXNlZCBvbiB2YXJpb3VzIGluZm9zIGFuZCBwZXItbW9kZSBjYWxpYnJhdGlvbiBkYXRhLgorICovCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfY29tbWl0X2VlcHJvbV9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IGF0aDVrX2VlcHJvbV9pbmZvICplZSA9ICZhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9lZXByb207CkBAIC0xMDI5LDcgKzExMjUsMjMgQEAKICogTWFpbiByZXNldCBmdW5jdGlvbiAqCiBcKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgYXRoNWtfaHdfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlLAorLyoqCisgKiBhdGg1a19od19yZXNldCgpIC0gVGhlIG1haW4gcmVzZXQgZnVuY3Rpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBvcF9tb2RlOiBPbmUgb2YgZW51bSBubDgwMjExX2lmdHlwZQorICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKiBAZmFzdDogRW5hYmxlIGZhc3QgY2hhbm5lbCBzd2l0Y2hpbmcKKyAqIEBza2lwX3BjdTogU2tpcCBwY3UgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB3ZSBjYWxsIGVhY2ggdGltZSB3ZSB3YW50IHRvIChyZSlpbml0aWFsaXplIHRoZQorICogY2FyZCBhbmQgcGFzcyBuZXcgc2V0dGluZ3MgdG8gaHcuIFdlIGFsc28gY2FsbCBpdCB3aGVuIGh3IHJ1bnMgaW50bworICogdHJvdWJsZSB0byBtYWtlIGl0IGNvbWUgYmFjayB0byBhIHdvcmtpbmcgc3RhdGUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gZmFsc2Ugb3BfbW9kZSBvciBjaGFubmVsIGluZm9zLCBvciAtRUlPCisgKiBvbiBmYWlsdXJlLgorICovCitpbnQKK2F0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLCBib29sIGZhc3QsIGJvb2wgc2tpcF9wY3UpCiB7CiAJdTMyIHNfc2VxWzEwXSwgc19sZWRbM10sIHRzZl91cCwgdHNmX2xvOwpAQCAtMTI0Miw3ICsxMzU0LDcgQEAKIAkvKgogCSAqIEluaXRpYWxpemUgUENVCiAJICovCi0JYXRoNWtfaHdfcGN1X2luaXQoYWgsIG9wX21vZGUsIG1vZGUpOworCWF0aDVrX2h3X3BjdV9pbml0KGFoLCBvcF9tb2RlKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBQSFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmJ1ZmZlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKaW5kZXggNWQxMWMyMy4uYWVkMzRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmgKQEAgLTE4LDcgKzE4LDkgQEAKICAqLwogCiAKLS8qCisvKioKKyAqIERPQzogUkYgQnVmZmVyIHJlZ2lzdGVycworICoKICAqIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgcmVnaXN0ZXJzIG9uIHRoZSBSRiBjaGlwCiAgKiB0aGF0IGNvbnRyb2wgdmFyaW91cyBvcGVyYXRpb24gc2V0dGluZ3MgcmVsYXRlZCBtb3N0bHkgdG8KICAqIHRoZSBhbmFsb2cgcGFydHMgKGNoYW5uZWwsIGdhaW4gYWRqdXN0bWVudCBldGMpLgpAQCAtNDQsNDAgKzQ2LDYzIEBACiAgKi8KIAogCi0vKgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIC0gSW5pdGlhbCBSRiBCdWZmZXIgc2V0dGluZ3MKKyAqIEByZmJfYmFuazogUkYgQmFuayBudW1iZXIKKyAqIEByZmJfY3RybF9yZWdpc3RlcjogUkYgQnVmZmVyIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEByZmJfbW9kZV9kYXRhOiBSRiBCdWZmZXIgZGF0YSBmb3IgZWFjaCBtb2RlCisgKgogICogU3RydWN0IHRvIGhvbGQgZGVmYXVsdCBtb2RlIHNwZWNpZmljIFJGCi0gKiByZWdpc3RlciB2YWx1ZXMgKFJGIEJhbmtzKQorICogcmVnaXN0ZXIgdmFsdWVzIChSRiBCYW5rcykgZm9yIGVhY2ggY2hpcC4KICAqLwogc3RydWN0IGF0aDVrX2luaV9yZmJ1ZmZlciB7Ci0JdTgJcmZiX2Jhbms7CQkvKiBSRiBCYW5rIG51bWJlciAqLwotCXUxNglyZmJfY3RybF9yZWdpc3RlcjsJLyogUkYgQnVmZmVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1MzIJcmZiX21vZGVfZGF0YVszXTsJLyogUkYgQnVmZmVyIGRhdGEgZm9yIGVhY2ggbW9kZSAqLworCXU4CXJmYl9iYW5rOworCXUxNglyZmJfY3RybF9yZWdpc3RlcjsKKwl1MzIJcmZiX21vZGVfZGF0YVszXTsKIH07CiAKLS8qCisvKioKKyAqIHN0cnVjdCBhdGg1a19yZmJfZmllbGQgLSBBbiBSRiBCdWZmZXIgZmllbGQgKHJlZ2lzdGVyL3ZhbHVlKQorICogQGxlbjogRmllbGQgbGVuZ3RoCisgKiBAcG9zOiBPZmZzZXQgb24gdGhlIHJhdyBwYWNrZXQKKyAqIEBjb2w6IFVzZWQgZm9yIHNoaWZ0aW5nCisgKgogICogU3RydWN0IHRvIGhvbGQgUkYgQnVmZmVyIGZpZWxkCiAgKiBpbmZvcyB1c2VkIHRvIGFjY2VzcyBjZXJ0YWluIFJGCiAgKiBhbmFsb2cgcmVnaXN0ZXJzCiAgKi8KIHN0cnVjdCBhdGg1a19yZmJfZmllbGQgewotCXU4CWxlbjsJLyogRmllbGQgbGVuZ3RoICovCi0JdTE2CXBvczsJLyogT2Zmc2V0IG9uIHRoZSByYXcgcGFja2V0ICovCi0JdTgJY29sOwkvKiBDb2x1bW4gLXVzZWQgZm9yIHNoaWZ0aW5nICovCisJdTgJbGVuOworCXUxNglwb3M7CisJdTgJY29sOwogfTsKIAotLyoKLSAqIFJGIGFuYWxvZyByZWdpc3RlciBkZWZpbml0aW9uCisvKioKKyAqIHN0cnVjdCBhdGg1a19yZl9yZWcgLSBSRiBhbmFsb2cgcmVnaXN0ZXIgZGVmaW5pdGlvbgorICogQGJhbms6IFJGIEJ1ZmZlciBCYW5rIG51bWJlcgorICogQGluZGV4OiBSZWdpc3RlcidzIGluZGV4IG9uIGF0aDVrX3JmX3JlZ3hfaWR4CisgKiBAZmllbGQ6IFRoZSAmc3RydWN0IGF0aDVrX3JmYl9maWVsZAorICoKKyAqIFdlIHVzZSB0aGlzIHN0cnVjdCB0byBkZWZpbmUgdGhlIHNldCBvZiBSRiByZWdpc3RlcnMKKyAqIG9uIGVhY2ggY2hpcCB0aGF0IHdlIHdhbnQgdG8gdHdlYWsuIFNvbWUgUkYgcmVnaXN0ZXJzCisgKiBhcmUgY29tbW9uIGJldHdlZW4gZGlmZmVyZW50IGNoaXAgdmVyc2lvbnMgc28gdGhpcyBzYXZlcworICogdXMgc3BhY2UgYW5kIGNvbXBsZXhpdHkgYmVjYXVzZSB3ZSBjYW4gcmVmZXIgdG8gYW4gcmYKKyAqIHJlZ2lzdGVyIGJ5IGl0J3MgaW5kZXggbm8gbWF0dGVyIHdoYXQgY2hpcCB3ZSB3b3JrIHdpdGgKKyAqIGFzIGxvbmcgYXMgaXQgaGFzIHRoYXQgcmVnaXN0ZXIuCiAgKi8KIHN0cnVjdCBhdGg1a19yZl9yZWcgewotCXU4CQkJYmFuazsJLyogUkYgQnVmZmVyIEJhbmsgbnVtYmVyICovCi0JdTgJCQlpbmRleDsJLyogUmVnaXN0ZXIncyBpbmRleCBvbiByZl9yZWdzX2lkeCAqLwotCXN0cnVjdCBhdGg1a19yZmJfZmllbGQJZmllbGQ7CS8qIFJGIEJ1ZmZlciBmaWVsZCBmb3IgdGhpcyByZWdpc3RlciAqLworCXU4CQkJYmFuazsKKwl1OAkJCWluZGV4OworCXN0cnVjdCBhdGg1a19yZmJfZmllbGQJZmllbGQ7CiB9OwogCi0vKiBNYXAgUkYgcmVnaXN0ZXJzIHRvIGluZGV4ZXMKKy8qKgorICogZW51bSBhdGg1a19yZl9yZWdzX2lkeCAtIE1hcCBSRiByZWdpc3RlcnMgdG8gaW5kZXhlcworICoKICAqIFdlIGRvIHRoaXMgdG8gaGFuZGxlIGNvbW1vbiBiaXRzIGFuZCBtYWtlIG91cgogICogbGlmZSBlYXNpZXIgYnkgdXNpbmcgYW4gaW5kZXggZm9yIGVhY2ggcmVnaXN0ZXIKLSAqIGluc3RlYWQgb2YgYSBmdWxsIHJmYl9maWVsZCAqLworICogaW5zdGVhZCBvZiBhIGZ1bGwgcmZiX2ZpZWxkCisgKi8KIGVudW0gYXRoNWtfcmZfcmVnc19pZHggewogCS8qIEJBTksgMiAqLwogCUFSNUtfUkZfVFVSQk8gPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oCmluZGV4IGViZmFlMDUuLjRkMjFkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmdhaW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZnYWluLmgKQEAgLTE4LDEzICsxOCwxNyBAQAogICoKICAqLwogCi0vKgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiAtIFJGIEdhaW4gdGFibGUKKyAqIEByZmdfcmVnaXN0ZXI6IFJGIEdhaW4gcmVnaXN0ZXIgYWRkcmVzcworICogQHJmZ192YWx1ZTogUmVnaXN0ZXIgdmFsdWUgZm9yIDUgYW5kIDJHSHoKKyAqCiAgKiBNb2RlLXNwZWNpZmljIFJGIEdhaW4gdGFibGUgKDY0Ynl0ZXMpIGZvciBSRjUxMTEvNTExMgogICogKFJGNTExMCBvbmx5IGNvbWVzIHdpdGggQVI1MjEwIGFuZCBvbmx5IHN1cHBvcnRzIGEvdHVyYm8gYSBtb2RlIHNvIGluaXRpYWwKICAqIFJGIEdhaW4gdmFsdWVzIGFyZSBpbmNsdWRlZCBpbiBBUjVLX0FSNTIxMF9JTkkpCiAgKi8KIHN0cnVjdCBhdGg1a19pbmlfcmZnYWluIHsKLQl1MTYJcmZnX3JlZ2lzdGVyOwkvKiBSRiBHYWluIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwl1MTYJcmZnX3JlZ2lzdGVyOwogCXUzMglyZmdfdmFsdWVbMl07CS8qIFtmcmVxIChzZWUgYmVsb3cpXSAqLwogfTsKIApAQCAtNDU1LDE4ICs0NTksMzEgQEAKICNkZWZpbmUgQVI1S19HQUlOX0NIRUNLX0FESlVTVChfZykJCVwKIAkoKF9nKS0+Z19jdXJyZW50IDw9IChfZyktPmdfbG93IHx8IChfZyktPmdfY3VycmVudCA+PSAoX2cpLT5nX2hpZ2gpCiAKKy8qKgorICogc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgLSBBbiBSRiBnYWluIG9wdGltaXphdGlvbiBzdGVwCisgKiBAZ29zX3BhcmFtOiBTZXQgb2YgcGFyYW1ldGVycworICogQGdvc19nYWluOiBHYWluCisgKi8KIHN0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwIHsKIAlzOAkJCQlnb3NfcGFyYW1bQVI1S19HQUlOX0NSTl9NQVhfRklYX0JJVFNdOwogCXM4CQkJCWdvc19nYWluOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHQgLSBSRiBHYWluIG9wdGltaXphdGlvbiBsYWRkZXIKKyAqIEBnb19kZWZhdWx0OiBUaGUgZGVmYXVsdCBzdGVwCisgKiBAZ29fc3RlcHNfY291bnQ6IEhvdyBtYW55IG9wdGltaXphdGlvbiBzdGVwcworICogQGdvX3N0ZXA6IEFycmF5IG9mICZzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcAorICovCiBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHQgewogCXU4CQkJCWdvX2RlZmF1bHQ7CiAJdTgJCQkJZ29fc3RlcHNfY291bnQ7CiAJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAJZ29fc3RlcFtBUjVLX0dBSU5fU1RFUF9DT1VOVF07CiB9OwogCisKIC8qCisgKiBSRjUxMTEKICAqIFBhcmFtZXRlcnMgb24gZ29zX3BhcmFtOgogICogMSkgVHggY2xpcCBQSFkgcmVnaXN0ZXIKICAqIDIpIFBXRCA5MCBSRiByZWdpc3RlcgpAQCAtNDkwLDYgKzUwNyw3IEBACiB9OwogCiAvKgorICogUkY1MTEyCiAgKiBQYXJhbWV0ZXJzIG9uIGdvc19wYXJhbToKICAqIDEpIE1peGdhaW4gb3ZyIFJGIHJlZ2lzdGVyCiAgKiAyKSBQV0QgMTM4IFJGIHJlZ2lzdGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL0tjb25maWcKaW5kZXggM2Q1ZjhiZS4uZDc1NWE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvS2NvbmZpZwpAQCAtMSwxMiArMSwyOSBAQAogY29uZmlnIEFUSDZLTAotCXRyaXN0YXRlICJBdGhlcm9zIGF0aDZrbCBzdXBwb3J0IgorCXRyaXN0YXRlICJBdGhlcm9zIG1vYmlsZSBjaGlwc2V0cyBzdXBwb3J0IgorCitjb25maWcgQVRINktMX1NESU8KKwl0cmlzdGF0ZSAiQXRoZXJvcyBhdGg2a2wgU0RJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVRINktMCiAJZGVwZW5kcyBvbiBNTUMKIAlkZXBlbmRzIG9uIENGRzgwMjExCiAJLS0taGVscC0tLQogCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbgotCSAgQXRoZXJvcyBBUjYwMDMgY2hpcHNldCBydW5uaW5nIG92ZXIgU0RJTy4gSWYgeW91IGNob29zZSB0bwotCSAgYnVpbGQgaXQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0aDZrbC4gUGxzIG5vdGUKLQkgIHRoYXQgQVI2MDAyIGFuZCBBUjYwMDEgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisJICBBdGhlcm9zIEFSNjAwMyBhbmQgQVI2MDA0IGNoaXBzZXRzIHJ1bm5pbmcgb3ZlciBTRElPLiBJZiB5b3UKKwkgIGNob29zZSB0byBidWlsZCBpdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXRoNmtsX3NkaW8uCisJICBQbGVhc2Ugbm90ZSB0aGF0IEFSNjAwMiBhbmQgQVI2MDAxIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKwkgIGRyaXZlci4KKworY29uZmlnIEFUSDZLTF9VU0IKKwl0cmlzdGF0ZSAiQXRoZXJvcyBhdGg2a2wgVVNCIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEg2S0wKKwlkZXBlbmRzIG9uIFVTQgorCWRlcGVuZHMgb24gQ0ZHODAyMTEKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3Igd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24KKwkgIEF0aGVyb3MgQVI2MDA0IGNoaXBzZXQgcnVubmluZyBvdmVyIFVTQi4gVGhpcyBpcyBzdGlsbCB1bmRlcgorCSAgaW1wbGVtZW50YXRpb24gYW5kIGl0IGlzbid0IGZ1bmN0aW9uYWwuIElmIHlvdSBjaG9vc2UgdG8KKwkgIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdGg2a2xfdXNiLgogCiBjb25maWcgQVRINktMX0RFQlVHCiAJYm9vbCAiQXRoZXJvcyBhdGg2a2wgZGVidWdnaW5nIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvTWFrZWZpbGUKaW5kZXggOGY3YTBkMS4uZTE0Y2VmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL01ha2VmaWxlCkBAIC0yMSwxNyArMjEsMzAgQEAKICMgQXV0aG9yKHMpOiA9IkF0aGVyb3MiCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW9iai0kKENPTkZJR19BVEg2S0wpIDo9IGF0aDZrbC5vCi1hdGg2a2wteSArPSBkZWJ1Zy5vCi1hdGg2a2wteSArPSBodGNfaGlmLm8KLWF0aDZrbC15ICs9IGh0Yy5vCi1hdGg2a2wteSArPSBibWkubwotYXRoNmtsLXkgKz0gY2ZnODAyMTEubwotYXRoNmtsLXkgKz0gaW5pdC5vCi1hdGg2a2wteSArPSBtYWluLm8KLWF0aDZrbC15ICs9IHR4cngubwotYXRoNmtsLXkgKz0gd21pLm8KLWF0aDZrbC15ICs9IHNkaW8ubwotYXRoNmtsLSQoQ09ORklHX05MODAyMTFfVEVTVE1PREUpICs9IHRlc3Rtb2RlLm8KK29iai0kKENPTkZJR19BVEg2S0xfU0RJTykgOj0gYXRoNmtsX3NkaW8ubworYXRoNmtsX3NkaW8teSArPSBkZWJ1Zy5vCithdGg2a2xfc2Rpby15ICs9IGhpZi5vCithdGg2a2xfc2Rpby15ICs9IGh0Yy5vCithdGg2a2xfc2Rpby15ICs9IGJtaS5vCithdGg2a2xfc2Rpby15ICs9IGNmZzgwMjExLm8KK2F0aDZrbF9zZGlvLXkgKz0gaW5pdC5vCithdGg2a2xfc2Rpby15ICs9IG1haW4ubworYXRoNmtsX3NkaW8teSArPSB0eHJ4Lm8KK2F0aDZrbF9zZGlvLXkgKz0gd21pLm8KK2F0aDZrbF9zZGlvLXkgKz0gc2Rpby5vCithdGg2a2xfc2Rpby0kKENPTkZJR19OTDgwMjExX1RFU1RNT0RFKSArPSB0ZXN0bW9kZS5vCisKK29iai0kKENPTkZJR19BVEg2S0xfVVNCKSArPSBhdGg2a2xfdXNiLm8KK2F0aDZrbF91c2IteSArPSBkZWJ1Zy5vCithdGg2a2xfdXNiLXkgKz0gaGlmLm8KK2F0aDZrbF91c2IteSArPSBodGMubworYXRoNmtsX3VzYi15ICs9IGJtaS5vCithdGg2a2xfdXNiLXkgKz0gY2ZnODAyMTEubworYXRoNmtsX3VzYi15ICs9IGluaXQubworYXRoNmtsX3VzYi15ICs9IG1haW4ubworYXRoNmtsX3VzYi15ICs9IHR4cngubworYXRoNmtsX3VzYi15ICs9IHdtaS5vCithdGg2a2xfdXNiLXkgKz0gdXNiLm8KK2F0aDZrbF91c2ItJChDT05GSUdfTkw4MDIxMV9URVNUTU9ERSkgKz0gdGVzdG1vZGUubwogCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuYwppbmRleCBjNWQxMWNjLi5hZWYwMGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmMKQEAgLTE5LDE2NSArMTksNiBAQAogI2luY2x1ZGUgInRhcmdldC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXN0YXRpYyBpbnQgYXRoNmtsX2dldF9ibWlfY21kX2NyZWRpdHMoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JdTMyIGFkZHI7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7Ci0KLQlhci0+Ym1pLmNtZF9jcmVkaXRzID0gMDsKLQotCS8qIFJlYWQgdGhlIGNvdW50ZXIgcmVnaXN0ZXIgdG8gZ2V0IHRoZSBjb21tYW5kIGNyZWRpdHMgKi8KLQlhZGRyID0gQ09VTlRfREVDX0FERFJFU1MgKyAoSFRDX01BSUxCT1hfTlVNX01BWCArIEVORFBPSU5UMSkgKiA0OwotCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEJNSV9DT01NVU5JQ0FUSU9OX1RJTUVPVVQpOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhYXItPmJtaS5jbWRfY3JlZGl0cykgewotCi0JCS8qCi0JCSAqIEhpdCB0aGUgY3JlZGl0IGNvdW50ZXIgd2l0aCBhIDQtYnl0ZSBhY2Nlc3MsIHRoZSBmaXJzdCBieXRlCi0JCSAqIHJlYWQgd2lsbCBoaXQgdGhlIGNvdW50ZXIgYW5kIGNhdXNlIGEgZGVjcmVtZW50LCB3aGlsZSB0aGUKLQkJICogcmVtYWluaW5nIDMgYnl0ZXMgaGFzIG5vIGVmZmVjdC4gVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcwotCQkgKiBpcyB0byBtYWtlIGFsbCBISUYgYWNjZXNzZXMgNC1ieXRlIGFsaWduZWQuCi0JCSAqLwotCQlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGFyLCBhZGRyLAotCQkJCQkgKHU4ICopJmFyLT5ibWkuY21kX2NyZWRpdHMsIDQsCi0JCQkJCSBISUZfUkRfU1lOQ19CWVRFX0lOQyk7Ci0JCWlmIChyZXQpIHsKLQkJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byBkZWNyZW1lbnQgdGhlIGNvbW1hbmQgY3JlZGl0IGNvdW50IHJlZ2lzdGVyOiAlZFxuIiwKLQkJCQkgICByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIFRoZSBjb3VudGVyIGlzIG9ubHkgOCBiaXRzLgotCQkgKiBJZ25vcmUgYW55dGhpbmcgaW4gdGhlIHVwcGVyIDMgYnl0ZXMKLQkJICovCi0JCWFyLT5ibWkuY21kX2NyZWRpdHMgJj0gMHhGRjsKLQl9Ci0KLQlpZiAoIWFyLT5ibWkuY21kX2NyZWRpdHMpIHsKLQkJYXRoNmtsX2VycigiYm1pIGNvbW11bmljYXRpb24gdGltZW91dFxuIik7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0aDZrbF9ibWlfZ2V0X3J4X2xrYWhkKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1MzIgcnhfd29yZCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFyeF93b3JkKSB7Ci0JCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIFJYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTLAotCQkJCQkgICh1OCAqKSZyeF93b3JkLCBzaXplb2Yocnhfd29yZCksCi0JCQkJCSAgSElGX1JEX1NZTkNfQllURV9JTkMpOwotCQlpZiAocmV0KSB7Ci0JCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gcmVhZCBSWF9MT09LQUhFQURfVkFMSURcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCSAvKiBhbGwgd2UgcmVhbGx5IHdhbnQgaXMgb25lIGJpdCAqLwotCQlyeF93b3JkICY9ICgxIDw8IEVORFBPSU5UMSk7Ci0JfQotCi0JaWYgKCFyeF93b3JkKSB7Ci0JCWF0aDZrbF9lcnIoImJtaV9yZWN2X2J1ZiBGSUZPIGVtcHR5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xfYm1pX3NlbmRfYnVmKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCByZXQ7Ci0JdTMyIGFkZHI7Ci0KLQlyZXQgPSBhdGg2a2xfZ2V0X2JtaV9jbWRfY3JlZGl0cyhhcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCi0JcmV0ID0gaGlmX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sCi0JCQkJICBISUZfV1JfU1lOQ19CWVRFX0lOQyk7Ci0JaWYgKHJldCkKLQkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNlbmQgdGhlIGJtaSBkYXRhIHRvIHRoZSBkZXZpY2VcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xfYm1pX3JlY3ZfYnVmKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCByZXQ7Ci0JdTMyIGFkZHI7Ci0KLQkvKgotCSAqIER1cmluZyBub3JtYWwgYm9vdHVwLCBzbWFsbCByZWFkcyBtYXkgYmUgcmVxdWlyZWQuCi0JICogUmF0aGVyIHRoYW4gaXNzdWUgYW4gSElGIFJlYWQgYW5kIHRoZW4gd2FpdCBhcyB0aGUgVGFyZ2V0Ci0JICogYWRkcyBzdWNjZXNzaXZlIGJ5dGVzIHRvIHRoZSBGSUZPLCB3ZSB3YWl0IGhlcmUgdW50aWwKLQkgKiB3ZSBrbm93IHRoYXQgcmVzcG9uc2UgZGF0YSBpcyBhdmFpbGFibGUuCi0JICoKLQkgKiBUaGlzIGFsbG93cyB1cyB0byBjbGVhbmx5IHRpbWVvdXQgb24gYW4gdW5leHBlY3RlZAotCSAqIFRhcmdldCBmYWlsdXJlIHJhdGhlciB0aGFuIHJpc2sgcHJvYmxlbXMgYXQgdGhlIEhJRiBsZXZlbC4KLQkgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBTRElPIHRpbWVvdXRzIGFuZCBwb3NzaWJseSBnYXJiYWdlCi0JICogZGF0YSBvbiBzb21lIGhvc3QgY29udHJvbGxlcnMuICBBbmQgb24gYW4gaW50ZXJjb25uZWN0Ci0JICogc3VjaCBhcyBDb21wYWN0IEZsYXNoIChhcyB3ZWxsIGFzIHNvbWUgU0RJTyBtYXN0ZXJzKSB3aGljaAotCSAqIGRvZXMgbm90IHByb3ZpZGUgYW55IGluZGljYXRpb24gb24gZGF0YSB0aW1lb3V0LCBpdCBhdm9pZHMKLQkgKiBhIHBvdGVudGlhbCBoYW5nIG9yIGdhcmJhZ2UgcmVzcG9uc2UuCi0JICoKLQkgKiBTeW5jaHJvbml6YXRpb24gaXMgbW9yZSBkaWZmaWN1bHQgZm9yIHJlYWRzIGxhcmdlciB0aGFuIHRoZQotCSAqIHNpemUgb2YgdGhlIE1CT1ggRklGTyAoMTI4QiksIGJlY2F1c2UgdGhlIFRhcmdldCBpcyB1bmFibGUKLQkgKiB0byBwdXNoIHRoZSAxMjl0aCBieXRlIG9mIGRhdGEgdW50aWwgQUZURVIgdGhlIEhvc3QgcG9zdHMgYW4KLQkgKiBISUYgUmVhZCBhbmQgcmVtb3ZlcyBzb21lIEZJRk8gZGF0YS4gIFNvIGZvciBsYXJnZSByZWFkcyB0aGUKLQkgKiBIb3N0IHByb2NlZWRzIHRvIHBvc3QgYW4gSElGIFJlYWQgQkVGT1JFIGFsbCB0aGUgZGF0YSBpcwotCSAqIGFjdHVhbGx5IGF2YWlsYWJsZSB0byByZWFkLiAgRm9ydHVuYXRlbHksIGxhcmdlIEJNSSByZWFkcyBkbwotCSAqIG5vdCBvY2N1ciBpbiBwcmFjdGljZSAtLSB0aGV5J3JlIHN1cHBvcnRlZCBmb3IgZGVidWcvZGV2ZWxvcG1lbnQuCi0JICoKLQkgKiBTbyBIb3N0L1RhcmdldCBCTUkgc3luY2hyb25pemF0aW9uIGlzIGRpdmlkZWQgaW50byB0aGVzZSBjYXNlczoKLQkgKiAgQ0FTRSAxOiBsZW5ndGggPCA0Ci0JICogICAgICAgIFNob3VsZCBub3QgaGFwcGVuCi0JICoKLQkgKiAgQ0FTRSAyOiA0IDw9IGxlbmd0aCA8PSAxMjgKLQkgKiAgICAgICAgV2FpdCBmb3IgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCi0JICogICAgICAgIElmIENPTlNFUlZBVElWRV9CTUlfUkVBRCBpcyBlbmFibGVkLCBhbHNvIHdhaXQgZm9yCi0JICogICAgICAgIGEgQk1JIGNvbW1hbmQgY3JlZGl0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgRU5USVJFCi0JICogICAgICAgIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgdGhlIEZJRk8KLQkgKgotCSAqICBDQVNFIDM6IGxlbmd0aCA+IDEyOAotCSAqICAgICAgICBXYWl0IGZvciB0aGUgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCi0JICoKLQkgKiBGb3IgbW9zdCB1c2VzLCBhIHNtYWxsIHRpbWVvdXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgYW5kIHdlIHdpbGwKLQkgKiB1c3VhbGx5IHNlZSBhIHJlc3BvbnNlIHF1aWNrbHk7IGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB1bnVzdWFsCi0JICogKGRlYnVnKSBjYXNlcyBvZiBCTUlfRVhFQ1VURSB3aGVyZSB3ZSB3YW50IGFuIGxhcmdlciB0aW1lb3V0LgotCSAqIEZvciBub3csIHdlIHVzZSBhbiB1bmJvdW5kZWQgYnVzeSBsb29wIHdoaWxlIHdhaXRpbmcgZm9yCi0JICogQk1JX0VYRUNVVEUuCi0JICoKLQkgKiBJZiBCTUlfRVhFQ1VURSBldmVyIG5lZWRzIHRvIHN1cHBvcnQgbG9uZ2VyLWxhdGVuY3kgZXhlY3V0aW9uLAotCSAqIGVzcGVjaWFsbHkgaW4gcHJvZHVjdGlvbiwgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIGVuaGFuY2VkIHRvIHNsZWVwCi0JICogYW5kIHlpZWxkLiAgQWxzbyBub3RlIHRoYXQgQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCBpcyBjdXJyZW50bHkKLQkgKiBhIGZ1bmN0aW9uIG9mIEhvc3QgcHJvY2Vzc29yIHNwZWVkLgotCSAqLwotCWlmIChsZW4gPj0gNCkgeyAvKiBOQjogQ3VycmVudGx5LCBhbHdheXMgdHJ1ZSAqLwotCQlyZXQgPSBhdGg2a2xfYm1pX2dldF9yeF9sa2FoZChhcik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIGFkZHIsIGJ1ZiwgbGVuLAotCQkJCSAgSElGX1JEX1NZTkNfQllURV9JTkMpOwotCWlmIChyZXQpIHsKLQkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlYWQgdGhlIGJtaSBkYXRhIGZyb20gdGhlIGRldmljZTogJWRcbiIsCi0JCQkgICByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCiBpbnQgYXRoNmtsX2JtaV9kb25lKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCWludCByZXQ7CkBAIC0xOTAsMTQgKzMxLDEyIEBACiAKIAlhci0+Ym1pLmRvbmVfc2VudCA9IHRydWU7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCAodTggKikmY2lkLCBzaXplb2YoY2lkKSk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsICh1OCAqKSZjaWQsIHNpemVvZihjaWQpKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byBzZW5kIGJtaSBkb25lOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMiwxNCArNTEsMjAgQEAKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0JcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgKHU4ICopJmNpZCwgc2l6ZW9mKGNpZCkpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCAodTggKikmY2lkLCBzaXplb2YoY2lkKSk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gc2VuZCBnZXQgdGFyZ2V0IGluZm86ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsICh1OCAqKSZ0YXJnX2luZm8tPnZlcnNpb24sCi0JCQkJICBzaXplb2YodGFyZ19pbmZvLT52ZXJzaW9uKSk7CisJaWYgKGFyLT5oaWZfdHlwZSA9PSBBVEg2S0xfSElGX1RZUEVfVVNCKSB7CisJCXJldCA9IGF0aDZrbF9oaWZfYm1pX3JlYWQoYXIsICh1OCAqKXRhcmdfaW5mbywKKwkJCQkJICBzaXplb2YoKnRhcmdfaW5mbykpOworCX0gZWxzZSB7CisJCXJldCA9IGF0aDZrbF9oaWZfYm1pX3JlYWQoYXIsICh1OCAqKSZ0YXJnX2luZm8tPnZlcnNpb24sCisJCQkJc2l6ZW9mKHRhcmdfaW5mby0+dmVyc2lvbikpOworCX0KKwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlY3YgdGFyZ2V0IGluZm86ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjI3LDcgKzcyLDcgQEAKIAogCWlmIChsZTMyX3RvX2NwdSh0YXJnX2luZm8tPnZlcnNpb24pID09IFRBUkdFVF9WRVJTSU9OX1NFTlRJTkFMKSB7CiAJCS8qIERldGVybWluZSBob3cgbWFueSBieXRlcyBhcmUgaW4gdGhlIFRhcmdldCdzIHRhcmdfaW5mbyAqLwotCQlyZXQgPSBhdGg2a2xfYm1pX3JlY3ZfYnVmKGFyLAorCQlyZXQgPSBhdGg2a2xfaGlmX2JtaV9yZWFkKGFyLAogCQkJCSAgICh1OCAqKSZ0YXJnX2luZm8tPmJ5dGVfY291bnQsCiAJCQkJICAgc2l6ZW9mKHRhcmdfaW5mby0+Ynl0ZV9jb3VudCkpOwogCQlpZiAocmV0KSB7CkBAIC0yNDYsNyArOTEsNyBAQAogCQl9CiAKIAkJLyogUmVhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0YXJnX2luZm8gKi8KLQkJcmV0ID0gYXRoNmtsX2JtaV9yZWN2X2J1ZihhciwKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfcmVhZChhciwKIAkJCQkgICAoKHU4ICopdGFyZ19pbmZvKSArCiAJCQkJICAgc2l6ZW9mKHRhcmdfaW5mby0+Ynl0ZV9jb3VudCksCiAJCQkJICAgc2l6ZW9mKCp0YXJnX2luZm8pIC0KQEAgLTI3OCw4ICsxMjMsOCBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlzaXplID0gQk1JX0RBVEFTWl9NQVggKyBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyKSArIHNpemVvZihsZW4pOwotCWlmIChzaXplID4gTUFYX0JNSV9DTURCVUZfU1opIHsKKwlzaXplID0gYXItPmJtaS5tYXhfZGF0YV9zaXplICsgc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcikgKyBzaXplb2YobGVuKTsKKwlpZiAoc2l6ZSA+IGFyLT5ibWkubWF4X2NtZF9zaXplKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI5Miw4ICsxMzcsOCBAQAogCWxlbl9yZW1haW4gPSBsZW47CiAKIAl3aGlsZSAobGVuX3JlbWFpbikgewotCQlyeF9sZW4gPSAobGVuX3JlbWFpbiA8IEJNSV9EQVRBU1pfTUFYKSA/Ci0JCQkJCWxlbl9yZW1haW4gOiBCTUlfREFUQVNaX01BWDsKKwkJcnhfbGVuID0gKGxlbl9yZW1haW4gPCBhci0+Ym1pLm1heF9kYXRhX3NpemUpID8KKwkJCQkJbGVuX3JlbWFpbiA6IGFyLT5ibWkubWF4X2RhdGFfc2l6ZTsKIAkJb2Zmc2V0ID0gMDsKIAkJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CiAJCW9mZnNldCArPSBzaXplb2YoY2lkKTsKQEAgLTMwMiwxMyArMTQ3LDEzIEBACiAJCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgJnJ4X2xlbiwgc2l6ZW9mKHJ4X2xlbikpOwogCQlvZmZzZXQgKz0gc2l6ZW9mKGxlbik7CiAKLQkJcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOworCQlyZXQgPSBhdGg2a2xfaGlmX2JtaV93cml0ZShhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOwogCQlpZiAocmV0KSB7CiAJCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gd3JpdGUgdG8gdGhlIGRldmljZTogJWRcbiIsCiAJCQkJICAgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJcmV0ID0gYXRoNmtsX2JtaV9yZWN2X2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCByeF9sZW4pOworCQlyZXQgPSBhdGg2a2xfaGlmX2JtaV9yZWFkKGFyLCBhci0+Ym1pLmNtZF9idWYsIHJ4X2xlbik7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byByZWFkIGZyb20gdGhlIGRldmljZTogJWRcbiIsCiAJCQkJICAgcmV0KTsKQEAgLTMyOCw3ICsxNzMsNyBAQAogCXUzMiBvZmZzZXQ7CiAJdTMyIGxlbl9yZW1haW4sIHR4X2xlbjsKIAljb25zdCB1MzIgaGVhZGVyID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcikgKyBzaXplb2YobGVuKTsKLQl1OCBhbGlnbmVkX2J1ZltCTUlfREFUQVNaX01BWF07CisJdTggYWxpZ25lZF9idWZbNDAwXTsKIAl1OCAqc3JjOwogCiAJaWYgKGFyLT5ibWkuZG9uZV9zZW50KSB7CkBAIC0zMzYsMTIgKzE4MSwxNSBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlpZiAoKEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyKSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJaWYgKChhci0+Ym1pLm1heF9kYXRhX3NpemUgKyBoZWFkZXIpID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWVtc2V0KGFyLT5ibWkuY21kX2J1ZiwgMCwgQk1JX0RBVEFTWl9NQVggKyBoZWFkZXIpOworCWlmIChXQVJOX09OKGFyLT5ibWkubWF4X2RhdGFfc2l6ZSA+IHNpemVvZihhbGlnbmVkX2J1ZikpKQorCQlyZXR1cm4gLUUyQklHOworCisJbWVtc2V0KGFyLT5ibWkuY21kX2J1ZiwgMCwgYXItPmJtaS5tYXhfZGF0YV9zaXplICsgaGVhZGVyKTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19CTUksCiAJCSAgImJtaSB3cml0ZSBtZW1vcnk6IGFkZHI6IDB4JXgsIGxlbjogJWRcbiIsIGFkZHIsIGxlbik7CkBAIC0zNTAsNyArMTk4LDcgQEAKIAl3aGlsZSAobGVuX3JlbWFpbikgewogCQlzcmMgPSAmYnVmW2xlbiAtIGxlbl9yZW1haW5dOwogCi0JCWlmIChsZW5fcmVtYWluIDwgKEJNSV9EQVRBU1pfTUFYIC0gaGVhZGVyKSkgeworCQlpZiAobGVuX3JlbWFpbiA8IChhci0+Ym1pLm1heF9kYXRhX3NpemUgLSBoZWFkZXIpKSB7CiAJCQlpZiAobGVuX3JlbWFpbiAmIDMpIHsKIAkJCQkvKiBhbGlnbiBpdCB3aXRoIDQgYnl0ZXMgKi8KIAkJCQlsZW5fcmVtYWluID0gbGVuX3JlbWFpbiArCkBAIC0zNjAsNyArMjA4LDcgQEAKIAkJCX0KIAkJCXR4X2xlbiA9IGxlbl9yZW1haW47CiAJCX0gZWxzZSB7Ci0JCQl0eF9sZW4gPSAoQk1JX0RBVEFTWl9NQVggLSBoZWFkZXIpOworCQkJdHhfbGVuID0gKGFyLT5ibWkubWF4X2RhdGFfc2l6ZSAtIGhlYWRlcik7CiAJCX0KIAogCQlvZmZzZXQgPSAwOwpAQCAtMzczLDcgKzIyMSw3IEBACiAJCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgc3JjLCB0eF9sZW4pOwogCQlvZmZzZXQgKz0gdHhfbGVuOwogCi0JCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLAogCQkJCSAgIHJldCk7CkBAIC0zOTgsNyArMjQ2LDcgQEAKIAl9CiAKIAlzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcikgKyBzaXplb2YocGFyYW0pOwotCWlmIChzaXplID4gTUFYX0JNSV9DTURCVUZfU1opIHsKKwlpZiAoc2l6ZSA+IGFyLT5ibWkubWF4X2NtZF9zaXplKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQxNSwxMyArMjYzLDEzIEBACiAJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCBwYXJhbSwgc2l6ZW9mKCpwYXJhbSkpOwogCW9mZnNldCArPSBzaXplb2YoKnBhcmFtKTsKIAotCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwlyZXQgPSBhdGg2a2xfaGlmX2JtaV93cml0ZShhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgc2l6ZW9mKCpwYXJhbSkpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3JlYWQoYXIsIGFyLT5ibWkuY21kX2J1Ziwgc2l6ZW9mKCpwYXJhbSkpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTQ0NSw3ICsyOTMsNyBAQAogCX0KIAogCXNpemUgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyKTsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJaWYgKHNpemUgPiBhci0+Ym1pLm1heF9jbWRfc2l6ZSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00NTksNyArMzA3LDcgQEAKIAltZW1jcHkoJihhci0+Ym1pLmNtZF9idWZbb2Zmc2V0XSksICZhZGRyLCBzaXplb2YoYWRkcikpOwogCW9mZnNldCArPSBzaXplb2YoYWRkcik7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTQ4MSw3ICszMjksNyBAQAogCX0KIAogCXNpemUgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyKTsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJaWYgKHNpemUgPiBhci0+Ym1pLm1heF9jbWRfc2l6ZSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00OTUsMTMgKzM0MywxMyBAQAogCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgJmFkZHIsIHNpemVvZihhZGRyKSk7CiAJb2Zmc2V0ICs9IHNpemVvZihhZGRyKTsKIAotCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwlyZXQgPSBhdGg2a2xfaGlmX2JtaV93cml0ZShhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgc2l6ZW9mKCpwYXJhbSkpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3JlYWQoYXIsIGFyLT5ibWkuY21kX2J1Ziwgc2l6ZW9mKCpwYXJhbSkpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlYWQgZnJvbSB0aGUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTUyNCw3ICszNzIsNyBAQAogCX0KIAogCXNpemUgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyKSArIHNpemVvZihwYXJhbSk7Ci0JaWYgKHNpemUgPiBNQVhfQk1JX0NNREJVRl9TWikgeworCWlmIChzaXplID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTQyLDcgKzM5MCw3IEBACiAJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCAmcGFyYW0sIHNpemVvZihwYXJhbSkpOwogCW9mZnNldCArPSBzaXplb2YocGFyYW0pOwogCi0JcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gd3JpdGUgdG8gdGhlIGRldmljZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC01NjUsOCArNDEzLDggQEAKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0Jc2l6ZSA9IEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyOwotCWlmIChzaXplID4gTUFYX0JNSV9DTURCVUZfU1opIHsKKwlzaXplID0gYXItPmJtaS5tYXhfZGF0YV9zaXplICsgaGVhZGVyOworCWlmIChzaXplID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTc3LDggKzQyNSw4IEBACiAKIAlsZW5fcmVtYWluID0gbGVuOwogCXdoaWxlIChsZW5fcmVtYWluKSB7Ci0JCXR4X2xlbiA9IChsZW5fcmVtYWluIDwgKEJNSV9EQVRBU1pfTUFYIC0gaGVhZGVyKSkgPwotCQkJICBsZW5fcmVtYWluIDogKEJNSV9EQVRBU1pfTUFYIC0gaGVhZGVyKTsKKwkJdHhfbGVuID0gKGxlbl9yZW1haW4gPCAoYXItPmJtaS5tYXhfZGF0YV9zaXplIC0gaGVhZGVyKSkgPworCQkJICBsZW5fcmVtYWluIDogKGFyLT5ibWkubWF4X2RhdGFfc2l6ZSAtIGhlYWRlcik7CiAKIAkJb2Zmc2V0ID0gMDsKIAkJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCAmY2lkLCBzaXplb2YoY2lkKSk7CkBAIC01ODksNyArNDM3LDcgQEAKIAkJCXR4X2xlbik7CiAJCW9mZnNldCArPSB0eF9sZW47CiAKLQkJcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOworCQlyZXQgPSBhdGg2a2xfaGlmX2JtaV93cml0ZShhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOwogCQlpZiAocmV0KSB7CiAJCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gd3JpdGUgdG8gdGhlIGRldmljZTogJWRcbiIsCiAJCQkJICAgcmV0KTsKQEAgLTYxNSw3ICs0NjMsNyBAQAogCX0KIAogCXNpemUgPSBzaXplb2YoY2lkKSArIHNpemVvZihhZGRyKTsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJaWYgKHNpemUgPiBhci0+Ym1pLm1heF9jbWRfc2l6ZSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02MzEsNyArNDc5LDcgQEAKIAltZW1jcHkoJihhci0+Ym1pLmNtZF9idWZbb2Zmc2V0XSksICZhZGRyLCBzaXplb2YoYWRkcikpOwogCW9mZnNldCArPSBzaXplb2YoYWRkcik7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byBzdGFydCBMWiBzdHJlYW0gdG8gdGhlIGRldmljZTogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtNjcyLDEwICs1MjAsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIGF0aDZrbF9ibWlfcmVzZXQoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXItPmJtaS5kb25lX3NlbnQgPSBmYWxzZTsKK30KKwogaW50IGF0aDZrbF9ibWlfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlhci0+Ym1pLmNtZF9idWYgPSBremFsbG9jKE1BWF9CTUlfQ01EQlVGX1NaLCBHRlBfQVRPTUlDKTsKKwlpZiAoV0FSTl9PTihhci0+Ym1pLm1heF9kYXRhX3NpemUgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOwogCisJLyogY21kICsgYWRkciArIGxlbiArIGRhdGFfc2l6ZSAqLworCWFyLT5ibWkubWF4X2NtZF9zaXplID0gYXItPmJtaS5tYXhfZGF0YV9zaXplICsgKHNpemVvZih1MzIpICogMyk7CisKKwlhci0+Ym1pLmNtZF9idWYgPSBremFsbG9jKGFyLT5ibWkubWF4X2NtZF9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFyLT5ibWkuY21kX2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5oCmluZGV4IDk2ODUxZDUuLmYxY2E2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuaApAQCAtNDQsMTIgKzQ0LDYgQEAKICAqIEJNSSBoYW5kbGVzIGFsbCByZXF1aXJlZCBUYXJnZXQtc2lkZSBjYWNoZSBmbHVzaGluZy4KICAqLwogCi0jZGVmaW5lIE1BWF9CTUlfQ01EQlVGX1NaIChCTUlfREFUQVNaX01BWCArIFwKLQkJCSAgIChzaXplb2YodTMyKSAqIDMgLyogY21kICsgYWRkciArIGxlbiAqLykpCi0KLS8qIE1heGltdW0gZGF0YSBzaXplIHVzZWQgZm9yIEJNSSB0cmFuc2ZlcnMgKi8KLSNkZWZpbmUgQk1JX0RBVEFTWl9NQVggICAgICAgICAgICAgICAgICAgICAgMjU2Ci0KIC8qIEJNSSBDb21tYW5kcyAqLwogCiAjZGVmaW5lIEJNSV9OT19DT01NQU5EICAgICAgICAgICAgICAgICAgICAgIDAKQEAgLTIzMCw2ICsyMjQsOCBAQAogCiBpbnQgYXRoNmtsX2JtaV9pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKIHZvaWQgYXRoNmtsX2JtaV9jbGVhbnVwKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2JtaV9yZXNldChzdHJ1Y3QgYXRoNmtsICphcik7CisKIGludCBhdGg2a2xfYm1pX2RvbmUoc3RydWN0IGF0aDZrbCAqYXIpOwogaW50IGF0aDZrbF9ibWlfZ2V0X3RhcmdldF9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyLAogCQkJICAgICAgIHN0cnVjdCBhdGg2a2xfYm1pX3RhcmdldF9pbmZvICp0YXJnX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCmluZGV4IGRhZjQ0NGIuLjZjNTlhMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKQEAgLTE0LDYgKzE0LDggQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAiY2ZnODAyMTEuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMTIxLDE3ICsxMjMsNTAgQEAKIAkuYml0cmF0ZXMgPSBhdGg2a2xfYV9yYXRlcywKIH07CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3NldF93cGFfdmVyc2lvbihzdHJ1Y3QgYXRoNmtsICphciwKKyNkZWZpbmUgQ0NLTV9LUktfQ0lQSEVSX1NVSVRFIDB4MDA0MDk2ZmYgLyogdXNlIGZvciBLUksgKi8KKworLyogcmV0dXJucyB0cnVlIGlmIHNjaGVkdWxlZCBzY2FuIHdhcyBzdG9wcGVkICovCitzdGF0aWMgYm9vbCBfX2F0aDZrbF9jZmc4MDIxMV9zc2Nhbl9zdG9wKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCisJaWYgKGFyLT5zdGF0ZSAhPSBBVEg2S0xfU1RBVEVfU0NIRURfU0NBTikKKwkJcmV0dXJuIGZhbHNlOworCisJZGVsX3RpbWVyX3N5bmMoJnZpZi0+c2NoZWRfc2Nhbl90aW1lcik7CisKKwlhdGg2a2xfd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgQVRINktMX0hPU1RfTU9ERV9BV0FLRSk7CisKKwlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfT047CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXRoNmtsX2NmZzgwMjExX3NzY2FuX2Rpc2FibGUoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisJYm9vbCBzdG9wcGVkOworCisJc3RvcHBlZCA9IF9fYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0b3AodmlmKTsKKworCWlmICghc3RvcHBlZCkKKwkJcmV0dXJuOworCisJY2ZnODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkKGFyLT53aXBoeSk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF93cGFfdmVyc2lvbihzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAogCQkJCSAgZW51bSBubDgwMjExX3dwYV92ZXJzaW9ucyB3cGFfdmVyc2lvbikKIHsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogJXVcbiIsIF9fZnVuY19fLCB3cGFfdmVyc2lvbik7CiAKIAlpZiAoIXdwYV92ZXJzaW9uKSB7Ci0JCWFyLT5hdXRoX21vZGUgPSBOT05FX0FVVEg7CisJCXZpZi0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOwogCX0gZWxzZSBpZiAod3BhX3ZlcnNpb24gJiBOTDgwMjExX1dQQV9WRVJTSU9OXzIpIHsKLQkJYXItPmF1dGhfbW9kZSA9IFdQQTJfQVVUSDsKKwkJdmlmLT5hdXRoX21vZGUgPSBXUEEyX0FVVEg7CiAJfSBlbHNlIGlmICh3cGFfdmVyc2lvbiAmIE5MODAyMTFfV1BBX1ZFUlNJT05fMSkgewotCQlhci0+YXV0aF9tb2RlID0gV1BBX0FVVEg7CisJCXZpZi0+YXV0aF9tb2RlID0gV1BBX0FVVEg7CiAJfSBlbHNlIHsKIAkJYXRoNmtsX2VycigiJXM6ICV1IG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCB3cGFfdmVyc2lvbik7CiAJCXJldHVybiAtRU5PVFNVUFA7CkBAIC0xNDAsMjUgKzE3NSwyNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZXRfYXV0aF90eXBlKHN0cnVjdCBhdGg2a2wgKmFyLAorc3RhdGljIGludCBhdGg2a2xfc2V0X2F1dGhfdHlwZShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAogCQkJCWVudW0gbmw4MDIxMV9hdXRoX3R5cGUgYXV0aF90eXBlKQogewotCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IDB4JXhcbiIsIF9fZnVuY19fLCBhdXRoX3R5cGUpOwogCiAJc3dpdGNoIChhdXRoX3R5cGUpIHsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU06Ci0JCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEg7CisJCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWToKLQkJYXItPmRvdDExX2F1dGhfbW9kZSA9IFNIQVJFRF9BVVRIOworCQl2aWYtPmRvdDExX2F1dGhfbW9kZSA9IFNIQVJFRF9BVVRIOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6Ci0JCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBMRUFQX0FVVEg7CisJCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gTEVBUF9BVVRIOwogCQlicmVhazsKIAogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6Ci0JCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEggfCBTSEFSRURfQVVUSDsKKwkJdmlmLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEggfCBTSEFSRURfQVVUSDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTY5LDExICsyMDMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2V0X2NpcGhlcihzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGNpcGhlciwgYm9vbCB1Y2FzdCkKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF9jaXBoZXIoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTMyIGNpcGhlciwgYm9vbCB1Y2FzdCkKIHsKLQl1OCAqYXJfY2lwaGVyID0gdWNhc3QgPyAmYXItPnByd2lzZV9jcnlwdG8gOiAmYXItPmdycF9jcnlwdG87Ci0JdTggKmFyX2NpcGhlcl9sZW4gPSB1Y2FzdCA/ICZhci0+cHJ3aXNlX2NyeXB0b19sZW4gOgotCQkmYXItPmdycF9jcnlwdG9fbGVuOworCXU4ICphcl9jaXBoZXIgPSB1Y2FzdCA/ICZ2aWYtPnByd2lzZV9jcnlwdG8gOiAmdmlmLT5ncnBfY3J5cHRvOworCXU4ICphcl9jaXBoZXJfbGVuID0gdWNhc3QgPyAmdmlmLT5wcndpc2VfY3J5cHRvX2xlbiA6CisJCSZ2aWYtPmdycF9jcnlwdG9fbGVuOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGNpcGhlciAweCV4LCB1Y2FzdCAldVxuIiwKIAkJICAgX19mdW5jX18sIGNpcGhlciwgdWNhc3QpOwpAQCAtMjAwLDYgKzIzNCwxMCBAQAogCQkqYXJfY2lwaGVyID0gQUVTX0NSWVBUOwogCQkqYXJfY2lwaGVyX2xlbiA9IDA7CiAJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfU01TNDoKKwkJKmFyX2NpcGhlciA9IFdBUElfQ1JZUFQ7CisJCSphcl9jaXBoZXJfbGVuID0gMDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYXRoNmtsX2VycigiY2lwaGVyIDB4JXggbm90IHN1cHBvcnRlZFxuIiwgY2lwaGVyKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKQEAgLTIwOCwyOCArMjQ2LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDZrbF9zZXRfa2V5X21nbXQoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBrZXlfbWdtdCkKK3N0YXRpYyB2b2lkIGF0aDZrbF9zZXRfa2V5X21nbXQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTMyIGtleV9tZ210KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiAweCV4XG4iLCBfX2Z1bmNfXywga2V5X21nbXQpOwogCiAJaWYgKGtleV9tZ210ID09IFdMQU5fQUtNX1NVSVRFX1BTSykgewotCQlpZiAoYXItPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKLQkJCWFyLT5hdXRoX21vZGUgPSBXUEFfUFNLX0FVVEg7Ci0JCWVsc2UgaWYgKGFyLT5hdXRoX21vZGUgPT0gV1BBMl9BVVRIKQotCQkJYXItPmF1dGhfbW9kZSA9IFdQQTJfUFNLX0FVVEg7CisJCWlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKKwkJCXZpZi0+YXV0aF9tb2RlID0gV1BBX1BTS19BVVRIOworCQllbHNlIGlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEEyX0FVVEgpCisJCQl2aWYtPmF1dGhfbW9kZSA9IFdQQTJfUFNLX0FVVEg7CisJfSBlbHNlIGlmIChrZXlfbWdtdCA9PSAweDAwNDA5NjAwKSB7CisJCWlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfQVVUSCkKKwkJCXZpZi0+YXV0aF9tb2RlID0gV1BBX0FVVEhfQ0NLTTsKKwkJZWxzZSBpZiAodmlmLT5hdXRoX21vZGUgPT0gV1BBMl9BVVRIKQorCQkJdmlmLT5hdXRoX21vZGUgPSBXUEEyX0FVVEhfQ0NLTTsKIAl9IGVsc2UgaWYgKGtleV9tZ210ICE9IFdMQU5fQUtNX1NVSVRFXzgwMjFYKSB7Ci0JCWFyLT5hdXRoX21vZGUgPSBOT05FX0FVVEg7CisJCXZpZi0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOwogCX0KIH0KIAotc3RhdGljIGJvb2wgYXRoNmtsX2NmZzgwMjExX3JlYWR5KHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIGJvb2wgYXRoNmtsX2NmZzgwMjExX3JlYWR5KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCiAJaWYgKCF0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpIHsKIAkJYXRoNmtsX2Vycigid21pIGlzIG5vdCByZWFkeVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKSkgeworCWlmICghdGVzdF9iaXQoV0xBTl9FTkFCTEVELCAmdmlmLT5mbGFncykpIHsKIAkJYXRoNmtsX2Vycigid2xhbiBkaXNhYmxlZFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0yMzcsMTUgKzI4MiwxNDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgYXRoNmtsX2lzX3dwYV9pZShjb25zdCB1OCAqcG9zKQoreworCXJldHVybiBwb3NbMF0gPT0gV0xBTl9FSURfV1BBICYmIHBvc1sxXSA+PSA0ICYmCisJCXBvc1syXSA9PSAweDAwICYmIHBvc1szXSA9PSAweDUwICYmCisJCXBvc1s0XSA9PSAweGYyICYmIHBvc1s1XSA9PSAweDAxOworfQorCitzdGF0aWMgYm9vbCBhdGg2a2xfaXNfcnNuX2llKGNvbnN0IHU4ICpwb3MpCit7CisJcmV0dXJuIHBvc1swXSA9PSBXTEFOX0VJRF9SU047Cit9CisKK3N0YXRpYyBib29sIGF0aDZrbF9pc193cHNfaWUoY29uc3QgdTggKnBvcykKK3sKKwlyZXR1cm4gKHBvc1swXSA9PSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgJiYKKwkJcG9zWzFdID49IDQgJiYKKwkJcG9zWzJdID09IDB4MDAgJiYgcG9zWzNdID09IDB4NTAgJiYgcG9zWzRdID09IDB4ZjIgJiYKKwkJcG9zWzVdID09IDB4MDQpOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYXNzb2NfcmVxX2llcyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBjb25zdCB1OCAqaWVzLAorCQkJCSAgICBzaXplX3QgaWVzX2xlbikKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisJY29uc3QgdTggKnBvczsKKwl1OCAqYnVmID0gTlVMTDsKKwlzaXplX3QgbGVuID0gMDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDbGVhciBwcmV2aW91c2x5IHNldCBmbGFnCisJICovCisKKwlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICY9IH5DT05ORUNUX1dQU19GTEFHOworCisJLyoKKwkgKiBGaWx0ZXIgb3V0IFJTTi9XUEEgSUUocykKKwkgKi8KKworCWlmIChpZXMgJiYgaWVzX2xlbikgeworCQlidWYgPSBrbWFsbG9jKGllc19sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcG9zID0gaWVzOworCisJCXdoaWxlIChwb3MgKyAxIDwgaWVzICsgaWVzX2xlbikgeworCQkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBpZXMgKyBpZXNfbGVuKQorCQkJCWJyZWFrOworCQkJaWYgKCEoYXRoNmtsX2lzX3dwYV9pZShwb3MpIHx8IGF0aDZrbF9pc19yc25faWUocG9zKSkpIHsKKwkJCQltZW1jcHkoYnVmICsgbGVuLCBwb3MsIDIgKyBwb3NbMV0pOworCQkJCWxlbiArPSAyICsgcG9zWzFdOworCQkJfQorCisJCQlpZiAoYXRoNmtsX2lzX3dwc19pZShwb3MpKQorCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MgfD0gQ09OTkVDVF9XUFNfRkxBRzsKKworCQkJcG9zICs9IDIgKyBwb3NbMV07CisJCX0KKwl9CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCSAgICAgICBXTUlfRlJBTUVfQVNTT0NfUkVRLCBidWYsIGxlbik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9ubGlmdHlwZV90b19kcnZfaWZ0eXBlKGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTggKm53X3R5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQkqbndfdHlwZSA9IElORlJBX05FVFdPUks7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCSpud190eXBlID0gQURIT0NfTkVUV09SSzsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJKm53X3R5cGUgPSBBUF9ORVRXT1JLOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CisJCSpud190eXBlID0gSU5GUkFfTkVUV09SSzsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCSpud190eXBlID0gQVBfTkVUV09SSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXRoNmtsX2VycigiaW52YWxpZCBpbnRlcmZhY2UgdHlwZSAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGF0aDZrbF9pc192YWxpZF9pZnR5cGUoc3RydWN0IGF0aDZrbCAqYXIsIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkgICB1OCAqaWZfaWR4LCB1OCAqbndfdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmIChhdGg2a2xfbmxpZnR5cGVfdG9fZHJ2X2lmdHlwZSh0eXBlLCBud190eXBlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGFyLT5pYnNzX2lmX2FjdGl2ZSB8fCAoKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpICYmCisJICAgIGFyLT5udW1fdmlmKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8IHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFyLT52aWZfbWF4OyBpKyspIHsKKwkJCWlmICgoYXItPmF2YWlsX2lkeF9tYXAgPj4gaSkgJiBCSVQoMCkpIHsKKwkJCQkqaWZfaWR4ID0gaTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQgfHwKKwkgICAgdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfR08pIHsKKwkJZm9yIChpID0gYXItPm1heF9ub3JtX2lmYWNlOyBpIDwgYXItPnZpZl9tYXg7IGkrKykgeworCQkJaWYgKChhci0+YXZhaWxfaWR4X21hcCA+PiBpKSAmIEJJVCgwKSkgeworCQkJCSppZl9pZHggPSBpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CisJdTggbndfc3VidHlwZSA9IChhci0+cDJwKSA/IFNVQlRZUEVfUDJQREVWIDogU1VCVFlQRV9OT05FOwogCi0JYXItPnNtZV9zdGF0ZSA9IFNNRV9DT05ORUNUSU5HOworCWF0aDZrbF9jZmc4MDIxMV9zc2Nhbl9kaXNhYmxlKHZpZik7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJdmlmLT5zbWVfc3RhdGUgPSBTTUVfQ09OTkVDVElORzsKKworCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKHRlc3RfYml0KERFU1RST1lfSU5fUFJPR1JFU1MsICZhci0+ZmxhZykpIHsKQEAgLTI4NSwxMiArNDYxLDIyIEBACiAJCX0KIAl9CiAKLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCi0JICAgIGFyLT5zc2lkX2xlbiA9PSBzbWUtPnNzaWRfbGVuICYmCi0JICAgICFtZW1jbXAoYXItPnNzaWQsIHNtZS0+c3NpZCwgYXItPnNzaWRfbGVuKSkgewotCQlhci0+cmVjb25uZWN0X2ZsYWcgPSB0cnVlOwotCQlzdGF0dXMgPSBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoYXItPndtaSwgYXItPnJlcV9ic3NpZCwKLQkJCQkJCSAgYXItPmNoX2hpbnQpOworCWlmIChzbWUtPmllICYmIChzbWUtPmllX2xlbiA+IDApKSB7CisJCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXNzb2NfcmVxX2llcyh2aWYsIHNtZS0+aWUsIHNtZS0+aWVfbGVuKTsKKwkJaWYgKHN0YXR1cykgeworCQkJdXAoJmFyLT5zZW0pOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0gZWxzZQorCQlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICY9IH5DT05ORUNUX1dQU19GTEFHOworCisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpICYmCisJICAgIHZpZi0+c3NpZF9sZW4gPT0gc21lLT5zc2lkX2xlbiAmJgorCSAgICAhbWVtY21wKHZpZi0+c3NpZCwgc21lLT5zc2lkLCB2aWYtPnNzaWRfbGVuKSkgeworCQl2aWYtPnJlY29ubmVjdF9mbGFnID0gdHJ1ZTsKKwkJc3RhdHVzID0gYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSAgdmlmLT5yZXFfYnNzaWQsCisJCQkJCQkgIHZpZi0+Y2hfaGludCk7CiAKIAkJdXAoJmFyLT5zZW0pOwogCQlpZiAoc3RhdHVzKSB7CkBAIC0yOTgsNDIgKzQ4NCw0MyBAQAogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChhci0+c3NpZF9sZW4gPT0gc21lLT5zc2lkX2xlbiAmJgotCQkgICAhbWVtY21wKGFyLT5zc2lkLCBzbWUtPnNzaWQsIGFyLT5zc2lkX2xlbikpIHsKLQkJYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOworCX0gZWxzZSBpZiAodmlmLT5zc2lkX2xlbiA9PSBzbWUtPnNzaWRfbGVuICYmCisJCSAgICFtZW1jbXAodmlmLT5zc2lkLCBzbWUtPnNzaWQsIHZpZi0+c3NpZF9sZW4pKSB7CisJCWF0aDZrbF9kaXNjb25uZWN0KHZpZik7CiAJfQogCi0JbWVtc2V0KGFyLT5zc2lkLCAwLCBzaXplb2YoYXItPnNzaWQpKTsKLQlhci0+c3NpZF9sZW4gPSBzbWUtPnNzaWRfbGVuOwotCW1lbWNweShhci0+c3NpZCwgc21lLT5zc2lkLCBzbWUtPnNzaWRfbGVuKTsKKwltZW1zZXQodmlmLT5zc2lkLCAwLCBzaXplb2YodmlmLT5zc2lkKSk7CisJdmlmLT5zc2lkX2xlbiA9IHNtZS0+c3NpZF9sZW47CisJbWVtY3B5KHZpZi0+c3NpZCwgc21lLT5zc2lkLCBzbWUtPnNzaWRfbGVuKTsKIAogCWlmIChzbWUtPmNoYW5uZWwpCi0JCWFyLT5jaF9oaW50ID0gc21lLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKKwkJdmlmLT5jaF9oaW50ID0gc21lLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKIAotCW1lbXNldChhci0+cmVxX2Jzc2lkLCAwLCBzaXplb2YoYXItPnJlcV9ic3NpZCkpOworCW1lbXNldCh2aWYtPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CiAJaWYgKHNtZS0+YnNzaWQgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHNtZS0+YnNzaWQpKQotCQltZW1jcHkoYXItPnJlcV9ic3NpZCwgc21lLT5ic3NpZCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwkJbWVtY3B5KHZpZi0+cmVxX2Jzc2lkLCBzbWUtPmJzc2lkLCBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAotCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24oYXIsIHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9ucyk7CisJYXRoNmtsX3NldF93cGFfdmVyc2lvbih2aWYsIHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9ucyk7CiAKLQlzdGF0dXMgPSBhdGg2a2xfc2V0X2F1dGhfdHlwZShhciwgc21lLT5hdXRoX3R5cGUpOworCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXV0aF90eXBlKHZpZiwgc21lLT5hdXRoX3R5cGUpOwogCWlmIChzdGF0dXMpIHsKIAkJdXAoJmFyLT5zZW0pOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCWlmIChzbWUtPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UpCi0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdLCB0cnVlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdLCB0cnVlKTsKIAllbHNlCi0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCAwLCB0cnVlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCAwLCB0cnVlKTsKIAotCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKKwlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCwgZmFsc2UpOwogCiAJaWYgKHNtZS0+Y3J5cHRvLm5fYWttX3N1aXRlcykKLQkJYXRoNmtsX3NldF9rZXlfbWdtdChhciwgc21lLT5jcnlwdG8uYWttX3N1aXRlc1swXSk7CisJCWF0aDZrbF9zZXRfa2V5X21nbXQodmlmLCBzbWUtPmNyeXB0by5ha21fc3VpdGVzWzBdKTsKIAogCWlmICgoc21lLT5rZXlfbGVuKSAmJgotCSAgICAoYXItPmF1dGhfbW9kZSA9PSBOT05FX0FVVEgpICYmIChhci0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpKSB7CisJICAgICh2aWYtPmF1dGhfbW9kZSA9PSBOT05FX0FVVEgpICYmCisJICAgICh2aWYtPnByd2lzZV9jcnlwdG8gPT0gV0VQX0NSWVBUKSkgewogCQlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKIAogCQlpZiAoc21lLT5rZXlfaWR4IDwgV01JX01JTl9LRVlfSU5ERVggfHwKQEAgLTM0NCw1NiArNTMxLDYwIEBACiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQogCi0JCWtleSA9ICZhci0+a2V5c1tzbWUtPmtleV9pZHhdOworCQlrZXkgPSAmdmlmLT5rZXlzW3NtZS0+a2V5X2lkeF07CiAJCWtleS0+a2V5X2xlbiA9IHNtZS0+a2V5X2xlbjsKIAkJbWVtY3B5KGtleS0+a2V5LCBzbWUtPmtleSwga2V5LT5rZXlfbGVuKTsKLQkJa2V5LT5jaXBoZXIgPSBhci0+cHJ3aXNlX2NyeXB0bzsKLQkJYXItPmRlZl90eGtleV9pbmRleCA9IHNtZS0+a2V5X2lkeDsKKwkJa2V5LT5jaXBoZXIgPSB2aWYtPnByd2lzZV9jcnlwdG87CisJCXZpZi0+ZGVmX3R4a2V5X2luZGV4ID0gc21lLT5rZXlfaWR4OwogCi0JCWF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCBzbWUtPmtleV9pZHgsCi0JCQkJICAgICAgYXItPnByd2lzZV9jcnlwdG8sCisJCWF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIHNtZS0+a2V5X2lkeCwKKwkJCQkgICAgICB2aWYtPnByd2lzZV9jcnlwdG8sCiAJCQkJICAgICAgR1JPVVBfVVNBR0UgfCBUWF9VU0FHRSwKIAkJCQkgICAgICBrZXktPmtleV9sZW4sCi0JCQkJICAgICAgTlVMTCwKKwkJCQkgICAgICBOVUxMLCAwLAogCQkJCSAgICAgIGtleS0+a2V5LCBLRVlfT1BfSU5JVF9WQUwsIE5VTEwsCiAJCQkJICAgICAgTk9fU1lOQ19XTUlGTEFHKTsKIAl9CiAKIAlpZiAoIWFyLT51c3JfYnNzX2ZpbHRlcikgewotCQljbGVhcl9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJmFyLT5mbGFnKTsKLQkJaWYgKGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBBTExfQlNTX0ZJTFRFUiwgMCkgIT0gMCkgeworCQljbGVhcl9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpOworCQlpZiAoYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJICAgIEFMTF9CU1NfRklMVEVSLCAwKSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBzZXQgYnNzIGZpbHRlcmluZ1xuIik7CiAJCQl1cCgmYXItPnNlbSk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KIAotCWFyLT5ud190eXBlID0gYXItPm5leHRfbW9kZTsKKwl2aWYtPm53X3R5cGUgPSB2aWYtPm5leHRfbW9kZTsKKworCWlmICh2aWYtPndkZXYuaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpCisJCW53X3N1YnR5cGUgPSBTVUJUWVBFX1AyUENMSUVOVDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBjb25uZWN0IGNhbGxlZCB3aXRoIGF1dGhtb2RlICVkIGRvdDExIGF1dGggJWQiCiAJCSAgICIgUFcgY3J5cHRvICVkIFBXIGNyeXB0byBsZW4gJWQgR1JQIGNyeXB0byAlZCIKIAkJICAgIiBHUlAgY3J5cHRvIGxlbiAlZCBjaGFubmVsIGhpbnQgJXVcbiIsCiAJCSAgIF9fZnVuY19fLAotCQkgICBhci0+YXV0aF9tb2RlLCBhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+cHJ3aXNlX2NyeXB0bywKLQkJICAgYXItPnByd2lzZV9jcnlwdG9fbGVuLCBhci0+Z3JwX2NyeXB0bywKLQkJICAgYXItPmdycF9jcnlwdG9fbGVuLCBhci0+Y2hfaGludCk7CisJCSAgIHZpZi0+YXV0aF9tb2RlLCB2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5wcndpc2VfY3J5cHRvLAorCQkgICB2aWYtPnByd2lzZV9jcnlwdG9fbGVuLCB2aWYtPmdycF9jcnlwdG8sCisJCSAgIHZpZi0+Z3JwX2NyeXB0b19sZW4sIHZpZi0+Y2hfaGludCk7CiAKLQlhci0+cmVjb25uZWN0X2ZsYWcgPSAwOwotCXN0YXR1cyA9IGF0aDZrbF93bWlfY29ubmVjdF9jbWQoYXItPndtaSwgYXItPm53X3R5cGUsCi0JCQkJCWFyLT5kb3QxMV9hdXRoX21vZGUsIGFyLT5hdXRoX21vZGUsCi0JCQkJCWFyLT5wcndpc2VfY3J5cHRvLAotCQkJCQlhci0+cHJ3aXNlX2NyeXB0b19sZW4sCi0JCQkJCWFyLT5ncnBfY3J5cHRvLCBhci0+Z3JwX2NyeXB0b19sZW4sCi0JCQkJCWFyLT5zc2lkX2xlbiwgYXItPnNzaWQsCi0JCQkJCWFyLT5yZXFfYnNzaWQsIGFyLT5jaF9oaW50LAotCQkJCQlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzKTsKKwl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKKwlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgdmlmLT5ud190eXBlLAorCQkJCQl2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5hdXRoX21vZGUsCisJCQkJCXZpZi0+cHJ3aXNlX2NyeXB0bywKKwkJCQkJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiwKKwkJCQkJdmlmLT5ncnBfY3J5cHRvLCB2aWYtPmdycF9jcnlwdG9fbGVuLAorCQkJCQl2aWYtPnNzaWRfbGVuLCB2aWYtPnNzaWQsCisJCQkJCXZpZi0+cmVxX2Jzc2lkLCB2aWYtPmNoX2hpbnQsCisJCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MsIG53X3N1YnR5cGUpOwogCiAJdXAoJmFyLT5zZW0pOwogCiAJaWYgKHN0YXR1cyA9PSAtRUlOVkFMKSB7Ci0JCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JCWFyLT5zc2lkX2xlbiA9IDA7CisJCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwkJdmlmLT5zc2lkX2xlbiA9IDA7CiAJCWF0aDZrbF9lcnIoImludmFsaWQgcmVxdWVzdFxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0gZWxzZSBpZiAoc3RhdHVzKSB7CkBAIC00MDIsMjggKzU5Myw0MCBAQAogCX0KIAogCWlmICgoIShhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICYgQ09OTkVDVF9ET19XUEFfT0ZGTE9BRCkpICYmCi0JICAgICgoYXItPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCi0JICAgICB8fCAoYXItPmF1dGhfbW9kZSA9PSBXUEEyX1BTS19BVVRIKSkpIHsKLQkJbW9kX3RpbWVyKCZhci0+ZGlzY29ubmVjdF90aW1lciwKKwkgICAgKCh2aWYtPmF1dGhfbW9kZSA9PSBXUEFfUFNLX0FVVEgpCisJICAgICB8fCAodmlmLT5hdXRoX21vZGUgPT0gV1BBMl9QU0tfQVVUSCkpKSB7CisJCW1vZF90aW1lcigmdmlmLT5kaXNjb25uZWN0X3RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhESVNDT05fVElNRVJfSU5UVkFMKSk7CiAJfQogCiAJYXItPmNvbm5lY3RfY3RybF9mbGFncyAmPSB+Q09OTkVDVF9ET19XUEFfT0ZGTE9BRDsKLQlzZXRfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX2FkZF9ic3NfaWZfbmVlZGVkKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB1OCAqYnNzaWQsCitzdGF0aWMgaW50IGF0aDZrbF9hZGRfYnNzX2lmX25lZWRlZChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAorCQkJCSAgICBlbnVtIG5ldHdvcmtfdHlwZSBud190eXBlLAorCQkJCSAgICBjb25zdCB1OCAqYnNzaWQsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCQkgICAgY29uc3QgdTggKmJlYWNvbl9pZSwgc2l6ZV90IGJlYWNvbl9pZV9sZW4pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKKwl1MTYgY2FwX21hc2ssIGNhcF92YWw7CiAJdTggKmllOwogCi0JYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyhhci0+d2Rldi0+d2lwaHksIGNoYW4sIGJzc2lkLAotCQkJICAgICAgIGFyLT5zc2lkLCBhci0+c3NpZF9sZW4sIFdMQU5fQ0FQQUJJTElUWV9FU1MsCi0JCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJaWYgKG53X3R5cGUgJiBBREhPQ19ORVRXT1JLKSB7CisJCWNhcF9tYXNrID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CisJCWNhcF92YWwgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwl9IGVsc2UgeworCQljYXBfbWFzayA9IFdMQU5fQ0FQQUJJTElUWV9FU1M7CisJCWNhcF92YWwgPSBXTEFOX0NBUEFCSUxJVFlfRVNTOworCX0KKworCWJzcyA9IGNmZzgwMjExX2dldF9ic3MoYXItPndpcGh5LCBjaGFuLCBic3NpZCwKKwkJCSAgICAgICB2aWYtPnNzaWQsIHZpZi0+c3NpZF9sZW4sCisJCQkgICAgICAgY2FwX21hc2ssIGNhcF92YWwpOwogCWlmIChic3MgPT0gTlVMTCkgewogCQkvKgogCQkgKiBTaW5jZSBjZmc4MDIxMSBtYXkgbm90IHlldCBrbm93IGFib3V0IHRoZSBCU1MsCkBAIC00MzMsMjEgKzYzNiwyMCBAQAogCQkgKiBQcmVwZW5kIFNTSUQgZWxlbWVudCBzaW5jZSBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEJlYWNvbgogCQkgKiBJRXMgZnJvbSB0aGUgdGFyZ2V0LgogCQkgKi8KLQkJaWUgPSBrbWFsbG9jKDIgKyBhci0+c3NpZF9sZW4gKyBiZWFjb25faWVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWUgPSBrbWFsbG9jKDIgKyB2aWYtPnNzaWRfbGVuICsgYmVhY29uX2llX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChpZSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWllWzBdID0gV0xBTl9FSURfU1NJRDsKLQkJaWVbMV0gPSBhci0+c3NpZF9sZW47Ci0JCW1lbWNweShpZSArIDIsIGFyLT5zc2lkLCBhci0+c3NpZF9sZW4pOwotCQltZW1jcHkoaWUgKyAyICsgYXItPnNzaWRfbGVuLCBiZWFjb25faWUsIGJlYWNvbl9pZV9sZW4pOwotCQlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzKGFyLT53ZGV2LT53aXBoeSwgY2hhbiwKLQkJCQkJICBic3NpZCwgMCwgV0xBTl9DQVBBQklMSVRZX0VTUywgMTAwLAotCQkJCQkgIGllLCAyICsgYXItPnNzaWRfbGVuICsgYmVhY29uX2llX2xlbiwKKwkJaWVbMV0gPSB2aWYtPnNzaWRfbGVuOworCQltZW1jcHkoaWUgKyAyLCB2aWYtPnNzaWQsIHZpZi0+c3NpZF9sZW4pOworCQltZW1jcHkoaWUgKyAyICsgdmlmLT5zc2lkX2xlbiwgYmVhY29uX2llLCBiZWFjb25faWVfbGVuKTsKKwkJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhhci0+d2lwaHksIGNoYW4sCisJCQkJCSAgYnNzaWQsIDAsIGNhcF92YWwsIDEwMCwKKwkJCQkJICBpZSwgMiArIHZpZi0+c3NpZF9sZW4gKyBiZWFjb25faWVfbGVuLAogCQkJCQkgIDAsIEdGUF9LRVJORUwpOwogCQlpZiAoYnNzKQotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiYWRkZWQgZHVtbXkgYnNzIGZvciAiCi0JCQkJICAgIiVwTSBwcmlvciB0byBpbmRpY2F0aW5nIGNvbm5lY3Qvcm9hbWVkICIKLQkJCQkgICAiZXZlbnRcbiIsIGJzc2lkKTsKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgImFkZGVkIGJzcyAlcE0gdG8gIgorCQkJCSAgICJjZmc4MDIxMVxuIiwgYnNzaWQpOwogCQlrZnJlZShpZSk7CiAJfSBlbHNlCiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgImNmZzgwMjExIGFscmVhZHkgaGFzIGEgYnNzICIKQEAgLTQ2MSw3ICs2NjMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkJICAgdTggKmJzc2lkLCB1MTYgbGlzdGVuX2ludHZsLAogCQkJCSAgIHUxNiBiZWFjb25faW50dmwsCiAJCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKQEAgLTQ2OSw2ICs2NzEsNyBAQAogCQkJCSAgIHU4IGFzc29jX3Jlc3BfbGVuLCB1OCAqYXNzb2NfaW5mbykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJLyogY2FwaW5mbyArIGxpc3RlbiBpbnRlcnZhbCAqLwogCXU4IGFzc29jX3JlcV9pZV9vZmZzZXQgPSBzaXplb2YodTE2KSArIHNpemVvZih1MTYpOwpAQCAtNDg3LDExICs2OTAsMTEgQEAKIAkgKiBTdG9yZSBCZWFjb24gaW50ZXJ2YWwgaGVyZTsgRFRJTSBwZXJpb2Qgd2lsbCBiZSBhdmFpbGFibGUgb25seSBvbmNlCiAJICogYSBCZWFjb24gZnJhbWUgZnJvbSB0aGUgQVAgaXMgc2Vlbi4KIAkgKi8KLQlhci0+YXNzb2NfYnNzX2JlYWNvbl9pbnQgPSBiZWFjb25faW50dmw7Ci0JY2xlYXJfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmYXItPmZsYWcpOworCXZpZi0+YXNzb2NfYnNzX2JlYWNvbl9pbnQgPSBiZWFjb25faW50dmw7CisJY2xlYXJfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmdmlmLT5mbGFncyk7CiAKIAlpZiAobndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKLQkJaWYgKGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJaWYgKHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBpYnNzIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKQEAgLTQ5OSwzOSArNzAyLDM5IEBACiAJfQogCiAJaWYgKG53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkJICAgIGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgeworCQlpZiAodmlmLT53ZGV2LmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCSAgICB2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBzdGF0aW9uIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndkZXYtPndpcGh5LCAoaW50KSBjaGFubmVsKTsKKwljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53aXBoeSwgKGludCkgY2hhbm5lbCk7CiAKKwlpZiAoYXRoNmtsX2FkZF9ic3NfaWZfbmVlZGVkKHZpZiwgbndfdHlwZSwgYnNzaWQsIGNoYW4sIGFzc29jX2luZm8sCisJCQkJICAgICBiZWFjb25faWVfbGVuKSA8IDApIHsKKwkJYXRoNmtsX2VycigiY291bGQgbm90IGFkZCBjZmc4MDIxMSBic3MgZW50cnlcbiIpOworCQlyZXR1cm47CisJfQogCiAJaWYgKG53X3R5cGUgJiBBREhPQ19ORVRXT1JLKSB7Ci0JCWNmZzgwMjExX2lic3Nfam9pbmVkKGFyLT5uZXRfZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgImFkLWhvYyAlcyBzZWxlY3RlZFxuIiwKKwkJCSAgIG53X3R5cGUgJiBBREhPQ19DUkVBVE9SID8gImNyZWF0b3IiIDogImpvaW5lciIpOworCQljZmc4MDIxMV9pYnNzX2pvaW5lZCh2aWYtPm5kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChhdGg2a2xfYWRkX2Jzc19pZl9uZWVkZWQoYXIsIGJzc2lkLCBjaGFuLCBhc3NvY19pbmZvLAotCQkJCSAgICAgYmVhY29uX2llX2xlbikgPCAwKSB7Ci0JCWF0aDZrbF9lcnIoImNvdWxkIG5vdCBhZGQgY2ZnODAyMTEgYnNzIGVudHJ5IGZvciAiCi0JCQkgICAiY29ubmVjdC9yb2FtZWQgbm90aWZpY2F0aW9uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChhci0+c21lX3N0YXRlID09IFNNRV9DT05ORUNUSU5HKSB7CisJaWYgKHZpZi0+c21lX3N0YXRlID09IFNNRV9DT05ORUNUSU5HKSB7CiAJCS8qIGluZm9ybSBjb25uZWN0IHJlc3VsdCB0byBjZmc4MDIxMSAqLwotCQlhci0+c21lX3N0YXRlID0gU01FX0NPTk5FQ1RFRDsKLQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoYXItPm5ldF9kZXYsIGJzc2lkLAorCQl2aWYtPnNtZV9zdGF0ZSA9IFNNRV9DT05ORUNURUQ7CisJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHZpZi0+bmRldiwgYnNzaWQsCiAJCQkJCWFzc29jX3JlcV9pZSwgYXNzb2NfcmVxX2xlbiwKIAkJCQkJYXNzb2NfcmVzcF9pZSwgYXNzb2NfcmVzcF9sZW4sCiAJCQkJCVdMQU5fU1RBVFVTX1NVQ0NFU1MsIEdGUF9LRVJORUwpOwotCX0gZWxzZSBpZiAoYXItPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVEVEKSB7CisJfSBlbHNlIGlmICh2aWYtPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVEVEKSB7CiAJCS8qIGluZm9ybSByb2FtIGV2ZW50IHRvIGNmZzgwMjExICovCi0JCWNmZzgwMjExX3JvYW1lZChhci0+bmV0X2RldiwgY2hhbiwgYnNzaWQsCisJCWNmZzgwMjExX3JvYW1lZCh2aWYtPm5kZXYsIGNoYW4sIGJzc2lkLAogCQkJCWFzc29jX3JlcV9pZSwgYXNzb2NfcmVxX2xlbiwKIAkJCQlhc3NvY19yZXNwX2llLCBhc3NvY19yZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CiAJfQpAQCAtNTQwLDEyICs3NDMsMTUgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVhc29uX2NvZGUpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHJlYXNvbj0ldVxuIiwgX19mdW5jX18sCiAJCSAgIHJlYXNvbl9jb2RlKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlhdGg2a2xfY2ZnODAyMTFfc3NjYW5fZGlzYWJsZSh2aWYpOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAodGVzdF9iaXQoREVTVFJPWV9JTl9QUk9HUkVTUywgJmFyLT5mbGFnKSkgewpAQCAtNTU4LDQ0ICs3NjQsNDYgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAKLQlhci0+cmVjb25uZWN0X2ZsYWcgPSAwOwotCWF0aDZrbF9kaXNjb25uZWN0KGFyKTsKLQltZW1zZXQoYXItPnNzaWQsIDAsIHNpemVvZihhci0+c3NpZCkpOwotCWFyLT5zc2lkX2xlbiA9IDA7CisJdmlmLT5yZWNvbm5lY3RfZmxhZyA9IDA7CisJYXRoNmtsX2Rpc2Nvbm5lY3QodmlmKTsKKwltZW1zZXQodmlmLT5zc2lkLCAwLCBzaXplb2YodmlmLT5zc2lkKSk7CisJdmlmLT5zc2lkX2xlbiA9IDA7CiAKIAlpZiAoIXRlc3RfYml0KFNLSVBfU0NBTiwgJmFyLT5mbGFnKSkKLQkJbWVtc2V0KGFyLT5yZXFfYnNzaWQsIDAsIHNpemVvZihhci0+cmVxX2Jzc2lkKSk7CisJCW1lbXNldCh2aWYtPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CiAKIAl1cCgmYXItPnNlbSk7CiAKLQlhci0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKKwl2aWYtPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfZGlzY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggcmVhc29uLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfZGlzY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCByZWFzb24sCiAJCQkJICAgICAgdTggKmJzc2lkLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCQkgICAgICB1OCAqYXNzb2NfaW5mbywgdTE2IHByb3RvX3JlYXNvbikKIHsKLQlpZiAoYXItPnNjYW5fcmVxKSB7Ci0JCWNmZzgwMjExX3NjYW5fZG9uZShhci0+c2Nhbl9yZXEsIHRydWUpOwotCQlhci0+c2Nhbl9yZXEgPSBOVUxMOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKworCWlmICh2aWYtPnNjYW5fcmVxKSB7CisJCWNmZzgwMjExX3NjYW5fZG9uZSh2aWYtPnNjYW5fcmVxLCB0cnVlKTsKKwkJdmlmLT5zY2FuX3JlcSA9IE5VTEw7CiAJfQogCi0JaWYgKGFyLT5ud190eXBlICYgQURIT0NfTkVUV09SSykgewotCQlpZiAoYXItPndkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCWlmICh2aWYtPm53X3R5cGUgJiBBREhPQ19ORVRXT1JLKSB7CisJCWlmICh2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCQkJICAgIiVzOiBhdGg2ayBub3QgaW4gaWJzcyBtb2RlXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJbWVtc2V0KGJzc2lkLCAwLCBFVEhfQUxFTik7Ci0JCWNmZzgwMjExX2lic3Nfam9pbmVkKGFyLT5uZXRfZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CisJCWNmZzgwMjExX2lic3Nfam9pbmVkKHZpZi0+bmRldiwgYnNzaWQsIEdGUF9LRVJORUwpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGFyLT5ud190eXBlICYgSU5GUkFfTkVUV09SSykgewotCQlpZiAoYXItPndkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JCSAgICBhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHsKKwlpZiAodmlmLT5ud190eXBlICYgSU5GUkFfTkVUV09SSykgeworCQlpZiAodmlmLT53ZGV2LmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCisJCSAgICB2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBzdGF0aW9uIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKQEAgLTYxMiw0MiArODIwLDQ2IEBACiAJICovCiAKIAlpZiAocmVhc29uICE9IERJU0NPTk5FQ1RfQ01EKSB7Ci0JCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSk7CisJCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KTsKIAkJcmV0dXJuOwogCX0KIAotCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCi0JaWYgKGFyLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RJTkcpIHsKLQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQoYXItPm5ldF9kZXYsCisJaWYgKHZpZi0+c21lX3N0YXRlID09IFNNRV9DT05ORUNUSU5HKSB7CisJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHZpZi0+bmRldiwKIAkJCQlic3NpZCwgTlVMTCwgMCwKIAkJCQlOVUxMLCAwLAogCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JfSBlbHNlIGlmIChhci0+c21lX3N0YXRlID09IFNNRV9DT05ORUNURUQpIHsKLQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKGFyLT5uZXRfZGV2LCByZWFzb24sCisJfSBlbHNlIGlmICh2aWYtPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVEVEKSB7CisJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZCh2aWYtPm5kZXYsIHJlYXNvbiwKIAkJCQlOVUxMLCAwLCBHRlBfS0VSTkVMKTsKIAl9CiAKLQlhci0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKKwl2aWYtPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopYXRoNmtsX3ByaXYobmRldik7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CiAJczggbl9jaGFubmVscyA9IDA7CiAJdTE2ICpjaGFubmVscyA9IE5VTEw7CiAJaW50IHJldCA9IDA7CisJdTMyIGZvcmNlX2ZnX3NjYW4gPSAwOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCisJYXRoNmtsX2NmZzgwMjExX3NzY2FuX2Rpc2FibGUodmlmKTsKKwogCWlmICghYXItPnVzcl9ic3NfZmlsdGVyKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOworCQljbGVhcl9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpOwogCQlyZXQgPSBhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoCi0JCQlhci0+d21pLAotCQkJKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSA/CisJCQlhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgPwogCQkJIEFMTF9CVVRfQlNTX0ZJTFRFUiA6IEFMTF9CU1NfRklMVEVSKSwgMCk7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDZrbF9lcnIoImNvdWxkbid0IHNldCBic3MgZmlsdGVyaW5nXG4iKTsKQEAgLTY2MiwxNCArODc0LDE5IEBACiAJCQlyZXF1ZXN0LT5uX3NzaWRzID0gTUFYX1BST0JFRF9TU0lEX0lOREVYIC0gMTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bl9zc2lkczsgaSsrKQotCQkJYXRoNmtsX3dtaV9wcm9iZWRzc2lkX2NtZChhci0+d21pLCBpICsgMSwKLQkJCQkJCSAgU1BFQ0lGSUNfU1NJRF9GTEFHLAorCQkJYXRoNmtsX3dtaV9wcm9iZWRzc2lkX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgIGkgKyAxLCBTUEVDSUZJQ19TU0lEX0ZMQUcsCiAJCQkJCQkgIHJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuLAogCQkJCQkJICByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkKTsKIAl9CiAKKwkvKgorCSAqIEZJWE1FOiB3ZSBzaG91bGQgY2xlYXIgdGhlIElFIGluIGZ3IGlmIGl0J3Mgbm90IHNldCBzbyBqdXN0CisJICogcmVtb3ZlIHRoZSBjaGVjayBhbHRvZ2V0aGVyCisJICovCiAJaWYgKHJlcXVlc3QtPmllKSB7Ci0JCXJldCA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCBXTUlfRlJBTUVfUFJPQkVfUkVRLAorCQlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICAgV01JX0ZSQU1FX1BST0JFX1JFUSwKIAkJCQkJICAgICAgIHJlcXVlc3QtPmllLCByZXF1ZXN0LT5pZV9sZW4pOwogCQlpZiAocmV0KSB7CiAJCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gc2V0IFByb2JlIFJlcXVlc3QgYXBwaWUgZm9yICIKQEAgLTcwMCw0NCArOTE3LDYzIEBACiAJCQljaGFubmVsc1tpXSA9IHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcTsKIAl9CiAKLQlyZXQgPSBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoYXItPndtaSwgV01JX0xPTkdfU0NBTiwgMCwKLQkJCQkgICAgICAgZmFsc2UsIDAsIDAsIG5fY2hhbm5lbHMsIGNoYW5uZWxzKTsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCisJCWZvcmNlX2ZnX3NjYW4gPSAxOworCisJaWYgKHRlc3RfYml0KEFUSDZLTF9GV19DQVBBQklMSVRZX1NUQV9QMlBERVZfRFVQTEVYLAorCQkgICAgYXItPmZ3X2NhcGFiaWxpdGllcykpIHsKKwkJLyoKKwkJICogSWYgY2FwYWJsZSBvZiBkb2luZyBQMlAgbWdtdCBvcGVyYXRpb25zIHVzaW5nCisJCSAqIHN0YXRpb24gaW50ZXJmYWNlLCBzZW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZQorCQkgKiBzdXBwb3J0ZWQgcmF0ZXMgdG8gYWR2ZXJ0aXNlIGFuZCB4bWl0IHJhdGVzIGZvcgorCQkgKiBwcm9iZSByZXF1ZXN0cworCQkgKi8KKwkJcmV0ID0gYXRoNmtsX3dtaV9iZWdpbnNjYW5fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCVdNSV9MT05HX1NDQU4sIGZvcmNlX2ZnX3NjYW4sCisJCQkJCQlmYWxzZSwgMCwgMCwgbl9jaGFubmVscywKKwkJCQkJCWNoYW5uZWxzLCByZXF1ZXN0LT5ub19jY2ssCisJCQkJCQlyZXF1ZXN0LT5yYXRlcyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCVdNSV9MT05HX1NDQU4sIGZvcmNlX2ZnX3NjYW4sCisJCQkJCQlmYWxzZSwgMCwgMCwgbl9jaGFubmVscywKKwkJCQkJCWNoYW5uZWxzKTsKKwl9CiAJaWYgKHJldCkKIAkJYXRoNmtsX2Vycigid21pX3N0YXJ0c2Nhbl9jbWQgZmFpbGVkXG4iKTsKIAllbHNlCi0JCWFyLT5zY2FuX3JlcSA9IHJlcXVlc3Q7CisJCXZpZi0+c2Nhbl9yZXEgPSByZXF1ZXN0OwogCiAJa2ZyZWUoY2hhbm5lbHMpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgaW50IHN0YXR1cykKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCBhYm9ydGVkKQogeworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlpbnQgaTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBzdGF0dXMlc1xuIiwgX19mdW5jX18sCisJCSAgIGFib3J0ZWQgPyAiIGFib3J0ZWQiIDogIiIpOwogCi0JaWYgKCFhci0+c2Nhbl9yZXEpCisJaWYgKCF2aWYtPnNjYW5fcmVxKQogCQlyZXR1cm47CiAKLQlpZiAoKHN0YXR1cyA9PSAtRUNBTkNFTEVEKSB8fCAoc3RhdHVzID09IC1FQlVTWSkpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7CisJaWYgKGFib3J0ZWQpCiAJCWdvdG8gb3V0OwotCX0KIAotCWNmZzgwMjExX3NjYW5fZG9uZShhci0+c2Nhbl9yZXEsIGZhbHNlKTsKLQotCWlmIChhci0+c2Nhbl9yZXEtPm5fc3NpZHMgJiYgYXItPnNjYW5fcmVxLT5zc2lkc1swXS5zc2lkX2xlbikgewotCQlmb3IgKGkgPSAwOyBpIDwgYXItPnNjYW5fcmVxLT5uX3NzaWRzOyBpKyspIHsKLQkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgaSArIDEsCi0JCQkJCQkgIERJU0FCTEVfU1NJRF9GTEFHLAorCWlmICh2aWYtPnNjYW5fcmVxLT5uX3NzaWRzICYmIHZpZi0+c2Nhbl9yZXEtPnNzaWRzWzBdLnNzaWRfbGVuKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2aWYtPnNjYW5fcmVxLT5uX3NzaWRzOyBpKyspIHsKKwkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICBpICsgMSwgRElTQUJMRV9TU0lEX0ZMQUcsCiAJCQkJCQkgIDAsIE5VTEwpOwogCQl9CiAJfQogCiBvdXQ6Ci0JYXItPnNjYW5fcmVxID0gTlVMTDsKKwljZmc4MDIxMV9zY2FuX2RvbmUodmlmLT5zY2FuX3JlcSwgYWJvcnRlZCk7CisJdmlmLT5zY2FuX3JlcSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCkBAIC03NDUsMTUgKzk4MSwyMiBAQAogCQkJCSAgIGNvbnN0IHU4ICptYWNfYWRkciwKIAkJCQkgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKIAl1OCBrZXlfdXNhZ2U7CiAJdTgga2V5X3R5cGU7Ci0JaW50IHN0YXR1cyA9IDA7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKKwlpZiAocGFyYW1zLT5jaXBoZXIgPT0gQ0NLTV9LUktfQ0lQSEVSX1NVSVRFKSB7CisJCWlmIChwYXJhbXMtPmtleV9sZW4gIT0gV01JX0tSS19MRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGF0aDZrbF93bWlfYWRkX2tya19jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICBwYXJhbXMtPmtleSk7CisJfQorCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCSAgICIlczoga2V5IGluZGV4ICVkIG91dCBvZiBib3VuZHNcbiIsIF9fZnVuY19fLApAQCAtNzYxLDcgKzEwMDQsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlrZXkgPSAmYXItPmtleXNba2V5X2luZGV4XTsKKwlrZXkgPSAmdmlmLT5rZXlzW2tleV9pbmRleF07CiAJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfa2V5KSk7CiAKIAlpZiAocGFpcndpc2UpCkBAIC03NzAsMTMgKzEwMTMsMTkgQEAKIAkJa2V5X3VzYWdlID0gR1JPVVBfVVNBR0U7CiAKIAlpZiAocGFyYW1zKSB7CisJCWludCBzZXFfbGVuID0gcGFyYW1zLT5zZXFfbGVuOworCQlpZiAocGFyYW1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfU01TNCAmJgorCQkgICAgc2VxX2xlbiA+IEFUSDZLTF9LRVlfU0VRX0xFTikgeworCQkJLyogT25seSBmaXJzdCBoYWxmIG9mIHRoZSBXUEkgUE4gaXMgY29uZmlndXJlZCAqLworCQkJc2VxX2xlbiA9IEFUSDZLTF9LRVlfU0VRX0xFTjsKKwkJfQogCQlpZiAocGFyYW1zLT5rZXlfbGVuID4gV0xBTl9NQVhfS0VZX0xFTiB8fAotCQkgICAgcGFyYW1zLT5zZXFfbGVuID4gc2l6ZW9mKGtleS0+c2VxKSkKKwkJICAgIHNlcV9sZW4gPiBzaXplb2Yoa2V5LT5zZXEpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJa2V5LT5rZXlfbGVuID0gcGFyYW1zLT5rZXlfbGVuOwogCQltZW1jcHkoa2V5LT5rZXksIHBhcmFtcy0+a2V5LCBrZXktPmtleV9sZW4pOwotCQlrZXktPnNlcV9sZW4gPSBwYXJhbXMtPnNlcV9sZW47CisJCWtleS0+c2VxX2xlbiA9IHNlcV9sZW47CiAJCW1lbWNweShrZXktPnNlcSwgcGFyYW1zLT5zZXEsIGtleS0+c2VxX2xlbik7CiAJCWtleS0+Y2lwaGVyID0gcGFyYW1zLT5jaXBoZXI7CiAJfQpAQCAtNzk0LDMxICsxMDQzLDMzIEBACiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQlrZXlfdHlwZSA9IEFFU19DUllQVDsKIAkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OgorCQlrZXlfdHlwZSA9IFdBUElfQ1JZUFQ7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAl9CiAKLQlpZiAoKChhci0+YXV0aF9tb2RlID09IFdQQV9QU0tfQVVUSCkKLQkgICAgIHx8IChhci0+YXV0aF9tb2RlID09IFdQQTJfUFNLX0FVVEgpKQorCWlmICgoKHZpZi0+YXV0aF9tb2RlID09IFdQQV9QU0tfQVVUSCkKKwkgICAgIHx8ICh2aWYtPmF1dGhfbW9kZSA9PSBXUEEyX1BTS19BVVRIKSkKIAkgICAgJiYgKGtleV91c2FnZSAmIEdST1VQX1VTQUdFKSkKLQkJZGVsX3RpbWVyKCZhci0+ZGlzY29ubmVjdF90aW1lcik7CisJCWRlbF90aW1lcigmdmlmLT5kaXNjb25uZWN0X3RpbWVyKTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBpbmRleCAlZCwga2V5X2xlbiAlZCwga2V5X3R5cGUgMHgleCwga2V5X3VzYWdlIDB4JXgsIHNlcV9sZW4gJWRcbiIsCiAJCSAgIF9fZnVuY19fLCBrZXlfaW5kZXgsIGtleS0+a2V5X2xlbiwga2V5X3R5cGUsCiAJCSAgIGtleV91c2FnZSwga2V5LT5zZXFfbGVuKTsKIAotCWFyLT5kZWZfdHhrZXlfaW5kZXggPSBrZXlfaW5kZXg7Ci0KLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSyAmJiAhcGFpcndpc2UgJiYKLQkgICAgKGtleV90eXBlID09IFRLSVBfQ1JZUFQgfHwga2V5X3R5cGUgPT0gQUVTX0NSWVBUKSAmJiBwYXJhbXMpIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUksgJiYgIXBhaXJ3aXNlICYmCisJICAgIChrZXlfdHlwZSA9PSBUS0lQX0NSWVBUIHx8IGtleV90eXBlID09IEFFU19DUllQVCB8fAorCSAgICAga2V5X3R5cGUgPT0gV0FQSV9DUllQVCkgJiYgcGFyYW1zKSB7CiAJCWFyLT5hcF9tb2RlX2JrZXkudmFsaWQgPSB0cnVlOwogCQlhci0+YXBfbW9kZV9ia2V5LmtleV9pbmRleCA9IGtleV9pbmRleDsKIAkJYXItPmFwX21vZGVfYmtleS5rZXlfdHlwZSA9IGtleV90eXBlOwogCQlhci0+YXBfbW9kZV9ia2V5LmtleV9sZW4gPSBrZXktPmtleV9sZW47CiAJCW1lbWNweShhci0+YXBfbW9kZV9ia2V5LmtleSwga2V5LT5rZXksIGtleS0+a2V5X2xlbik7Ci0JCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIkRlbGF5IGluaXRpYWwgZ3JvdXAgIgogCQkJCSAgICJrZXkgY29uZmlndXJhdGlvbiB1bnRpbCBBUCBtb2RlIGhhcyBiZWVuICIKIAkJCQkgICAic3RhcnRlZFxuIik7CkBAIC04MzAsOCArMTA4MSw4IEBACiAJCX0KIAl9CiAKLQlpZiAoYXItPm5leHRfbW9kZSA9PSBBUF9ORVRXT1JLICYmIGtleV90eXBlID09IFdFUF9DUllQVCAmJgotCSAgICAhdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKHZpZi0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYga2V5X3R5cGUgPT0gV0VQX0NSWVBUICYmCisJICAgICF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQkvKgogCQkgKiBTdG9yZSB0aGUga2V5IGxvY2FsbHkgc28gdGhhdCBpdCBjYW4gYmUgcmUtY29uZmlndXJlZCBhZnRlcgogCQkgKiB0aGUgQVAgbW9kZSBoYXMgcHJvcGVybHkgc3RhcnRlZApAQCAtODM5LDMxICsxMDkwLDI5IEBACiAJCSAqLwogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJEZWxheSBXRVAga2V5IGNvbmZpZ3VyYXRpb24gIgogCQkJICAgInVudGlsIEFQIG1vZGUgaGFzIGJlZW4gc3RhcnRlZFxuIik7Ci0JCWFyLT53ZXBfa2V5X2xpc3Rba2V5X2luZGV4XS5rZXlfbGVuID0ga2V5LT5rZXlfbGVuOwotCQltZW1jcHkoYXItPndlcF9rZXlfbGlzdFtrZXlfaW5kZXhdLmtleSwga2V5LT5rZXksIGtleS0+a2V5X2xlbik7CisJCXZpZi0+d2VwX2tleV9saXN0W2tleV9pbmRleF0ua2V5X2xlbiA9IGtleS0+a2V5X2xlbjsKKwkJbWVtY3B5KHZpZi0+d2VwX2tleV9saXN0W2tleV9pbmRleF0ua2V5LCBrZXktPmtleSwKKwkJICAgICAgIGtleS0+a2V5X2xlbik7CiAJCXJldHVybiAwOwogCX0KIAotCXN0YXR1cyA9IGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCBhci0+ZGVmX3R4a2V5X2luZGV4LAotCQkJCSAgICAgICBrZXlfdHlwZSwga2V5X3VzYWdlLCBrZXktPmtleV9sZW4sCi0JCQkJICAgICAgIGtleS0+c2VxLCBrZXktPmtleSwgS0VZX09QX0lOSVRfVkFMLAotCQkJCSAgICAgICAodTggKikgbWFjX2FkZHIsIFNZTkNfQk9USF9XTUlGTEFHKTsKLQotCWlmIChzdGF0dXMpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGtleV9pbmRleCwKKwkJCQkgICAgIGtleV90eXBlLCBrZXlfdXNhZ2UsIGtleS0+a2V5X2xlbiwKKwkJCQkgICAgIGtleS0+c2VxLCBrZXktPnNlcV9sZW4sIGtleS0+a2V5LAorCQkJCSAgICAgS0VZX09QX0lOSVRfVkFMLAorCQkJCSAgICAgKHU4ICopIG1hY19hZGRyLCBTWU5DX0JPVEhfV01JRkxBRyk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2RlbF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJICAgdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLAogCQkJCSAgIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopYXRoNmtsX3ByaXYobmRldik7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW5kZXggJWRcbiIsIF9fZnVuY19fLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CkBAIC04NzMsMTUgKzExMjIsMTUgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JaWYgKCFhci0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKKwlpZiAoIXZpZi0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJICAgIiVzOiBpbmRleCAlZCBpcyBlbXB0eVxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAJCXJldHVybiAwOwogCX0KIAotCWFyLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbiA9IDA7CisJdmlmLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbiA9IDA7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKGFyLT53bWksIGtleV9pbmRleCk7CisJcmV0dXJuIGF0aDZrbF93bWlfZGVsZXRla2V5X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGtleV9pbmRleCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCkBAIC04OTAsMTMgKzExMzksMTMgQEAKIAkJCQkgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICpjb29raWUsCiAJCQkJCQkgICAgIHN0cnVjdCBrZXlfcGFyYW1zICopKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGF0aDZrbF9rZXkgKmtleSA9IE5VTEw7CiAJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGluZGV4ICVkXG4iLCBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChrZXlfaW5kZXggPCBXTUlfTUlOX0tFWV9JTkRFWCB8fCBrZXlfaW5kZXggPiBXTUlfTUFYX0tFWV9JTkRFWCkgewpAQCAtOTA2LDcgKzExNTUsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlrZXkgPSAmYXItPmtleXNba2V5X2luZGV4XTsKKwlrZXkgPSAmdmlmLT5rZXlzW2tleV9pbmRleF07CiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAlwYXJhbXMuY2lwaGVyID0ga2V5LT5jaXBoZXI7CiAJcGFyYW1zLmtleV9sZW4gPSBrZXktPmtleV9sZW47CkBAIC05MjQsMTUgKzExNzMsMTUgQEAKIAkJCQkJICAgdTgga2V5X2luZGV4LCBib29sIHVuaWNhc3QsCiAJCQkJCSAgIGJvb2wgbXVsdGljYXN0KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKLQlpbnQgc3RhdHVzID0gMDsKIAl1OCBrZXlfdXNhZ2U7CiAJZW51bSBjcnlwdG9fdHlwZSBrZXlfdHlwZSA9IE5PTkVfQ1JZUFQ7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW5kZXggJWRcbiIsIF9fZnVuY19fLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CkBAIC05NDIsNDMgKzExOTEsNDEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JaWYgKCFhci0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKKwlpZiAoIXZpZi0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGludmFsaWQga2V5IGluZGV4ICVkXG4iLAogCQkJICAgX19mdW5jX18sIGtleV9pbmRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWFyLT5kZWZfdHhrZXlfaW5kZXggPSBrZXlfaW5kZXg7Ci0Ja2V5ID0gJmFyLT5rZXlzW2FyLT5kZWZfdHhrZXlfaW5kZXhdOworCXZpZi0+ZGVmX3R4a2V5X2luZGV4ID0ga2V5X2luZGV4OworCWtleSA9ICZ2aWYtPmtleXNbdmlmLT5kZWZfdHhrZXlfaW5kZXhdOwogCWtleV91c2FnZSA9IEdST1VQX1VTQUdFOwotCWlmIChhci0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpCisJaWYgKHZpZi0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpCiAJCWtleV91c2FnZSB8PSBUWF9VU0FHRTsKIAlpZiAodW5pY2FzdCkKLQkJa2V5X3R5cGUgPSBhci0+cHJ3aXNlX2NyeXB0bzsKKwkJa2V5X3R5cGUgPSB2aWYtPnByd2lzZV9jcnlwdG87CiAJaWYgKG11bHRpY2FzdCkKLQkJa2V5X3R5cGUgPSBhci0+Z3JwX2NyeXB0bzsKKwkJa2V5X3R5cGUgPSB2aWYtPmdycF9jcnlwdG87CiAKLQlpZiAoYXItPm5leHRfbW9kZSA9PSBBUF9ORVRXT1JLICYmICF0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpCisJaWYgKHZpZi0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYgIXRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsgLyogRGVsYXkgdW50aWwgQVAgbW9kZSBoYXMgYmVlbiBzdGFydGVkICovCiAKLQlzdGF0dXMgPSBhdGg2a2xfd21pX2FkZGtleV9jbWQoYXItPndtaSwgYXItPmRlZl90eGtleV9pbmRleCwKLQkJCQkgICAgICAga2V5X3R5cGUsIGtleV91c2FnZSwKLQkJCQkgICAgICAga2V5LT5rZXlfbGVuLCBrZXktPnNlcSwga2V5LT5rZXksCi0JCQkJICAgICAgIEtFWV9PUF9JTklUX1ZBTCwgTlVMTCwKLQkJCQkgICAgICAgU1lOQ19CT1RIX1dNSUZMQUcpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICB2aWYtPmRlZl90eGtleV9pbmRleCwKKwkJCQkgICAgIGtleV90eXBlLCBrZXlfdXNhZ2UsCisJCQkJICAgICBrZXktPmtleV9sZW4sIGtleS0+c2VxLCBrZXktPnNlcV9sZW4sCisJCQkJICAgICBrZXktPmtleSwKKwkJCQkgICAgIEtFWV9PUF9JTklUX1ZBTCwgTlVMTCwKKwkJCQkgICAgIFNZTkNfQk9USF9XTUlGTEFHKTsKIH0KIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsCiAJCQkJICAgICAgIGJvb2wgaXNtY2FzdCkKIHsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCSAgICIlczoga2V5aWQgJWQsIGlzbWNhc3QgJWRcbiIsIF9fZnVuY19fLCBrZXlpZCwgaXNtY2FzdCk7CiAKLQljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKGFyLT5uZXRfZGV2LCBhci0+YnNzaWQsCisJY2ZnODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZSh2aWYtPm5kZXYsIHZpZi0+YnNzaWQsCiAJCQkJICAgICAoaXNtY2FzdCA/IE5MODAyMTFfS0VZVFlQRV9HUk9VUCA6CiAJCQkJICAgICAgTkw4MDIxMV9LRVlUWVBFX1BBSVJXSVNFKSwga2V5aWQsIE5VTEwsCiAJCQkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTk4NywxMiArMTIzNCwxNyBAQAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc2V0X3dpcGh5X3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAlpbnQgcmV0OwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGNoYW5nZWQgMHgleFxuIiwgX19mdW5jX18sCiAJCSAgIGNoYW5nZWQpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SVFNfVEhSRVNIT0xEKSB7CkBAIC0xMDEyLDE1ICsxMjY0LDIxIEBACiAqLwogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc2V0X3R4cG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwKLQkJCQkgICAgICAgaW50IGRibSkKKwkJCQkgICAgICAgaW50IG1ibSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAl1OCBhdGg2a2xfZGJtOworCWludCBkYm0gPSBNQk1fVE9fREJNKG1ibSk7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogdHlwZSAweCV4LCBkYm0gJWRcbiIsIF9fZnVuY19fLAogCQkgICB0eXBlLCBkYm0pOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC0xMDM1LDcgKzEyOTMsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChhci0+d21pLCBhdGg2a2xfZGJtKTsKKwlhdGg2a2xfd21pX3NldF90eF9wd3JfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgYXRoNmtsX2RibSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNDMsMTQgKzEzMDEsMTkgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2dldF90eHBvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksIGludCAqZGJtKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKil3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpIHsKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQlhci0+dHhfcHdyID0gMDsKIAotCQlpZiAoYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChhci0+d21pKSAhPSAwKSB7CisJCWlmIChhdGg2a2xfd21pX2dldF90eF9wd3JfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCkgIT0gMCkgewogCQkJYXRoNmtsX2VycigiYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZCBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTEwNzQsMTEgKzEzMzcsMTIgQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CiAJc3RydWN0IHdtaV9wb3dlcl9tb2RlX2NtZCBtb2RlOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHBtZ210ICVkLCB0aW1lb3V0ICVkXG4iLAogCQkgICBfX2Z1bmNfXywgcG1nbXQsIHRpbWVvdXQpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKHBtZ210KSB7CkBAIC0xMDg5LDcgKzEzNTMsOCBAQAogCQltb2RlLnB3cl9tb2RlID0gTUFYX1BFUkZfUE9XRVI7CiAJfQogCi0JaWYgKGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCBtb2RlLnB3cl9tb2RlKSAhPSAwKSB7CisJaWYgKGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJICAgICBtb2RlLnB3cl9tb2RlKSAhPSAwKSB7CiAJCWF0aDZrbF9lcnIoIndtaV9wb3dlcm1vZGVfY21kIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTEwOTcsNDEgKzEzNjIsODMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICphdGg2a2xfY2ZnODAyMTFfYWRkX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCQkgICAgY2hhciAqbmFtZSwKKwkJCQkJCSAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCisJCQkJCQkgICAgdTMyICpmbGFncywKKwkJCQkJCSAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJdTggaWZfaWR4LCBud190eXBlOworCisJaWYgKGFyLT5udW1fdmlmID09IGFyLT52aWZfbWF4KSB7CisJCWF0aDZrbF9lcnIoIlJlYWNoZWQgbWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHZpZlxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCWlmICghYXRoNmtsX2lzX3ZhbGlkX2lmdHlwZShhciwgdHlwZSwgJmlmX2lkeCwgJm53X3R5cGUpKSB7CisJCWF0aDZrbF9lcnIoIk5vdCBhIHN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCW5kZXYgPSBhdGg2a2xfaW50ZXJmYWNlX2FkZChhciwgbmFtZSwgdHlwZSwgaWZfaWR4LCBud190eXBlKTsKKwlpZiAoIW5kZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYXItPm51bV92aWYrKzsKKworCXJldHVybiBuZGV2OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9kZWxfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gd2lwaHlfcHJpdih3aXBoeSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmdmlmLT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisKKwlhdGg2a2xfY2xlYW51cF92aWYodmlmLCB0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpOworCisJYXRoNmtsX2RlaW5pdF9pZl9kYXRhKHZpZik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfY2hhbmdlX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCiAJCQkJCXN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZGV2KTsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gYXItPndkZXY7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5kZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHR5cGUgJXVcbiIsIF9fZnVuY19fLCB0eXBlKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKLQkJcmV0dXJuIC1FSU87Ci0KIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCWFyLT5uZXh0X21vZGUgPSBJTkZSQV9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IElORlJBX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWFyLT5uZXh0X21vZGUgPSBBREhPQ19ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFESE9DX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCWFyLT5uZXh0X21vZGUgPSBBUF9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQkJYXItPm5leHRfbW9kZSA9IElORlJBX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gSU5GUkFfTkVUV09SSzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JCWFyLT5uZXh0X21vZGUgPSBBUF9ORVRXT1JLOworCQl2aWYtPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWF0aDZrbF9lcnIoImludmFsaWQgaW50ZXJmYWNlIHR5cGUgJXVcbiIsIHR5cGUpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0Jd2Rldi0+aWZ0eXBlID0gdHlwZTsKKwl2aWYtPndkZXYuaWZ0eXBlID0gdHlwZTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE0MSwxNiArMTQ0OCwxNyBAQAogCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICppYnNzX3BhcmFtKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYXItPnNzaWRfbGVuID0gaWJzc19wYXJhbS0+c3NpZF9sZW47Ci0JbWVtY3B5KGFyLT5zc2lkLCBpYnNzX3BhcmFtLT5zc2lkLCBhci0+c3NpZF9sZW4pOworCXZpZi0+c3NpZF9sZW4gPSBpYnNzX3BhcmFtLT5zc2lkX2xlbjsKKwltZW1jcHkodmlmLT5zc2lkLCBpYnNzX3BhcmFtLT5zc2lkLCB2aWYtPnNzaWRfbGVuKTsKIAogCWlmIChpYnNzX3BhcmFtLT5jaGFubmVsKQotCQlhci0+Y2hfaGludCA9IGlic3NfcGFyYW0tPmNoYW5uZWwtPmNlbnRlcl9mcmVxOworCQl2aWYtPmNoX2hpbnQgPSBpYnNzX3BhcmFtLT5jaGFubmVsLT5jZW50ZXJfZnJlcTsKIAogCWlmIChpYnNzX3BhcmFtLT5jaGFubmVsX2ZpeGVkKSB7CiAJCS8qCkBAIC0xMTYyLDQ0ICsxNDcwLDQ1IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwltZW1zZXQodmlmLT5yZXFfYnNzaWQsIDAsIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOwogCWlmIChpYnNzX3BhcmFtLT5ic3NpZCAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaWJzc19wYXJhbS0+YnNzaWQpKQotCQltZW1jcHkoYXItPnJlcV9ic3NpZCwgaWJzc19wYXJhbS0+YnNzaWQsIHNpemVvZihhci0+cmVxX2Jzc2lkKSk7CisJCW1lbWNweSh2aWYtPnJlcV9ic3NpZCwgaWJzc19wYXJhbS0+YnNzaWQsCisJCSAgICAgICBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAotCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24oYXIsIDApOworCWF0aDZrbF9zZXRfd3BhX3ZlcnNpb24odmlmLCAwKTsKIAotCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXV0aF90eXBlKGFyLCBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNKTsKKwlzdGF0dXMgPSBhdGg2a2xfc2V0X2F1dGhfdHlwZSh2aWYsIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKIAlpZiAoaWJzc19wYXJhbS0+cHJpdmFjeSkgewotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIHRydWUpOwotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIGZhbHNlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsIGZhbHNlKTsKIAl9IGVsc2UgewotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgMCwgdHJ1ZSk7Ci0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCAwLCBmYWxzZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgZmFsc2UpOwogCX0KIAotCWFyLT5ud190eXBlID0gYXItPm5leHRfbW9kZTsKKwl2aWYtPm53X3R5cGUgPSB2aWYtPm5leHRfbW9kZTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBjb25uZWN0IGNhbGxlZCB3aXRoIGF1dGhtb2RlICVkIGRvdDExIGF1dGggJWQiCiAJCSAgICIgUFcgY3J5cHRvICVkIFBXIGNyeXB0byBsZW4gJWQgR1JQIGNyeXB0byAlZCIKIAkJICAgIiBHUlAgY3J5cHRvIGxlbiAlZCBjaGFubmVsIGhpbnQgJXVcbiIsCiAJCSAgIF9fZnVuY19fLAotCQkgICBhci0+YXV0aF9tb2RlLCBhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+cHJ3aXNlX2NyeXB0bywKLQkJICAgYXItPnByd2lzZV9jcnlwdG9fbGVuLCBhci0+Z3JwX2NyeXB0bywKLQkJICAgYXItPmdycF9jcnlwdG9fbGVuLCBhci0+Y2hfaGludCk7CisJCSAgIHZpZi0+YXV0aF9tb2RlLCB2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5wcndpc2VfY3J5cHRvLAorCQkgICB2aWYtPnByd2lzZV9jcnlwdG9fbGVuLCB2aWYtPmdycF9jcnlwdG8sCisJCSAgIHZpZi0+Z3JwX2NyeXB0b19sZW4sIHZpZi0+Y2hfaGludCk7CiAKLQlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIGFyLT5ud190eXBlLAotCQkJCQlhci0+ZG90MTFfYXV0aF9tb2RlLCBhci0+YXV0aF9tb2RlLAotCQkJCQlhci0+cHJ3aXNlX2NyeXB0bywKLQkJCQkJYXItPnByd2lzZV9jcnlwdG9fbGVuLAotCQkJCQlhci0+Z3JwX2NyeXB0bywgYXItPmdycF9jcnlwdG9fbGVuLAotCQkJCQlhci0+c3NpZF9sZW4sIGFyLT5zc2lkLAotCQkJCQlhci0+cmVxX2Jzc2lkLCBhci0+Y2hfaGludCwKLQkJCQkJYXItPmNvbm5lY3RfY3RybF9mbGFncyk7Ci0Jc2V0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7CisJc3RhdHVzID0gYXRoNmtsX3dtaV9jb25uZWN0X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIHZpZi0+bndfdHlwZSwKKwkJCQkJdmlmLT5kb3QxMV9hdXRoX21vZGUsIHZpZi0+YXV0aF9tb2RlLAorCQkJCQl2aWYtPnByd2lzZV9jcnlwdG8sCisJCQkJCXZpZi0+cHJ3aXNlX2NyeXB0b19sZW4sCisJCQkJCXZpZi0+Z3JwX2NyeXB0bywgdmlmLT5ncnBfY3J5cHRvX2xlbiwKKwkJCQkJdmlmLT5zc2lkX2xlbiwgdmlmLT5zc2lkLAorCQkJCQl2aWYtPnJlcV9ic3NpZCwgdmlmLT5jaF9oaW50LAorCQkJCQlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzLCBTVUJUWVBFX05PTkUpOworCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMDcsMTQgKzE1MTYsMTQgQEAKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2xlYXZlX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JYXItPnNzaWRfbGVuID0gMDsKKwlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwl2aWYtPnNzaWRfbGVuID0gMDsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyNCw2ICsxNTMzLDggQEAKIAlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQsCiAJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKIAlXTEFOX0NJUEhFUl9TVUlURV9DQ01QLAorCUNDS01fS1JLX0NJUEhFUl9TVUlURSwKKwlXTEFOX0NJUEhFUl9TVUlURV9TTVM0LAogfTsKIAogc3RhdGljIGJvb2wgaXNfcmF0ZV9sZWdhY3koczMyIHJhdGUpCkBAIC0xMjkxLDIxICsxNjAyLDIyIEBACiAJCQkgICAgICB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJbG9uZyBsZWZ0OwogCWJvb2wgc2dpOwogCXMzMiByYXRlOwogCWludCByZXQ7CiAJdTggbWNzOwogCi0JaWYgKG1lbWNtcChtYWMsIGFyLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCisJaWYgKG1lbWNtcChtYWMsIHZpZi0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFyLT5zZW0pKQogCQlyZXR1cm4gLUVCVVNZOwogCi0Jc2V0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoYXItPndtaSk7CisJcmV0ID0gYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJdXAoJmFyLT5zZW0pOwpAQCAtMTMxNCw3ICsxNjI2LDcgQEAKIAogCWxlZnQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhci0+ZXZlbnRfd3EsCiAJCQkJCQkhdGVzdF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsCi0JCQkJCQkJICAmYXItPmZsYWcpLAorCQkJCQkJCSAgJnZpZi0+ZmxhZ3MpLAogCQkJCQkJV01JX1RJTUVPVVQpOwogCiAJdXAoJmFyLT5zZW0pOwpAQCAtMTMyNCwyNCArMTYzNiwyNCBAQAogCWVsc2UgaWYgKGxlZnQgPCAwKQogCQlyZXR1cm4gbGVmdDsKIAotCWlmIChhci0+dGFyZ2V0X3N0YXRzLnJ4X2J5dGUpIHsKLQkJc2luZm8tPnJ4X2J5dGVzID0gYXItPnRhcmdldF9zdGF0cy5yeF9ieXRlOworCWlmICh2aWYtPnRhcmdldF9zdGF0cy5yeF9ieXRlKSB7CisJCXNpbmZvLT5yeF9ieXRlcyA9IHZpZi0+dGFyZ2V0X3N0YXRzLnJ4X2J5dGU7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1JYX0JZVEVTOwotCQlzaW5mby0+cnhfcGFja2V0cyA9IGFyLT50YXJnZXRfc3RhdHMucnhfcGt0OworCQlzaW5mby0+cnhfcGFja2V0cyA9IHZpZi0+dGFyZ2V0X3N0YXRzLnJ4X3BrdDsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fUlhfUEFDS0VUUzsKIAl9CiAKLQlpZiAoYXItPnRhcmdldF9zdGF0cy50eF9ieXRlKSB7Ci0JCXNpbmZvLT50eF9ieXRlcyA9IGFyLT50YXJnZXRfc3RhdHMudHhfYnl0ZTsKKwlpZiAodmlmLT50YXJnZXRfc3RhdHMudHhfYnl0ZSkgeworCQlzaW5mby0+dHhfYnl0ZXMgPSB2aWYtPnRhcmdldF9zdGF0cy50eF9ieXRlOwogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CWVRFUzsKLQkJc2luZm8tPnR4X3BhY2tldHMgPSBhci0+dGFyZ2V0X3N0YXRzLnR4X3BrdDsKKwkJc2luZm8tPnR4X3BhY2tldHMgPSB2aWYtPnRhcmdldF9zdGF0cy50eF9wa3Q7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1RYX1BBQ0tFVFM7CiAJfQogCi0Jc2luZm8tPnNpZ25hbCA9IGFyLT50YXJnZXRfc3RhdHMuY3NfcnNzaTsKKwlzaW5mby0+c2lnbmFsID0gdmlmLT50YXJnZXRfc3RhdHMuY3NfcnNzaTsKIAlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19TSUdOQUw7CiAKLQlyYXRlID0gYXItPnRhcmdldF9zdGF0cy50eF91Y2FzdF9yYXRlOworCXJhdGUgPSB2aWYtPnRhcmdldF9zdGF0cy50eF91Y2FzdF9yYXRlOwogCiAJaWYgKGlzX3JhdGVfbGVnYWN5KHJhdGUpKSB7CiAJCXNpbmZvLT50eHJhdGUubGVnYWN5ID0gcmF0ZSAvIDEwMDsKQEAgLTEzNzMsMTMgKzE2ODUsMTMgQEAKIAogCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1RYX0JJVFJBVEU7CiAKLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCi0JICAgIHRlc3RfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmYXItPmZsYWcpICYmCi0JICAgIGFyLT5ud190eXBlID09IElORlJBX05FVFdPUkspIHsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgJiYKKwkgICAgdGVzdF9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZ2aWYtPmZsYWdzKSAmJgorCSAgICB2aWYtPm53X3R5cGUgPT0gSU5GUkFfTkVUV09SSykgewogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19CU1NfUEFSQU07CiAJCXNpbmZvLT5ic3NfcGFyYW0uZmxhZ3MgPSAwOwotCQlzaW5mby0+YnNzX3BhcmFtLmR0aW1fcGVyaW9kID0gYXItPmFzc29jX2Jzc19kdGltX3BlcmlvZDsKLQkJc2luZm8tPmJzc19wYXJhbS5iZWFjb25faW50ZXJ2YWwgPSBhci0+YXNzb2NfYnNzX2JlYWNvbl9pbnQ7CisJCXNpbmZvLT5ic3NfcGFyYW0uZHRpbV9wZXJpb2QgPSB2aWYtPmFzc29jX2Jzc19kdGltX3BlcmlvZDsKKwkJc2luZm8tPmJzc19wYXJhbS5iZWFjb25faW50ZXJ2YWwgPSB2aWYtPmFzc29jX2Jzc19iZWFjb25faW50OwogCX0KIAogCXJldHVybiAwOwpAQCAtMTM4OSw3ICsxNzAxLDkgQEAKIAkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmV0ZGV2KTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgcG1rc2EtPmJzc2lkLAorCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgcG1rc2EtPmJzc2lkLAogCQkJCSAgICAgICBwbWtzYS0+cG1raWQsIHRydWUpOwogfQogCkBAIC0xMzk3LDI1ICsxNzExLDMwMiBAQAogCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZXRkZXYpOwotCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCBwbWtzYS0+YnNzaWQsCisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBwbWtzYS0+YnNzaWQsCiAJCQkJICAgICAgIHBta3NhLT5wbWtpZCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9mbHVzaF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmV0ZGV2KTsKLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKQotCQlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgYXItPmJzc2lkLCBOVUxMLCBmYWxzZSk7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCisJCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgICB2aWYtPmJzc2lkLCBOVUxMLCBmYWxzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3dvd19zdXNwZW5kKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCit7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKKwlpbnQgcmV0LCBwb3MsIGxlZnQ7CisJdTMyIGZpbHRlciA9IDA7CisJdTE2IGk7CisJdTggbWFza1tXT1dfTUFTS19TSVpFXTsKKworCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCisJCXJldHVybiAtRUlPOworCisJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDbGVhciBleGlzdGluZyBXT1cgcGF0dGVybnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgV09XX01BWF9GSUxURVJTX1BFUl9MSVNUOyBpKyspCisJCWF0aDZrbF93bWlfZGVsX3dvd19wYXR0ZXJuX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgICBXT1dfTElTVF9JRCwgaSk7CisJLyogQ29uZmlndXJlIG5ldyBXT1cgcGF0dGVybnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgd293LT5uX3BhdHRlcm5zOyBpKyspIHsKKworCQkvKgorCQkgKiBDb252ZXJ0IGdpdmVuIG5sODAyMTEgc3BlY2lmaWMgbWFzayB2YWx1ZSB0byBlcXVpdmFsZW50CisJCSAqIGRyaXZlciBzcGVjaWZpYyBtYXNrIHZhbHVlIGFuZCBzZW5kIGl0IHRvIHRoZSBjaGlwIGFsb25nCisJCSAqIHdpdGggcGF0dGVybnMuIEZvciBleGFtcGxlLCBJZiB0aGUgbWFzayB2YWx1ZSBkZWZpbmVkIGluCisJCSAqIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gaXMgMHhBIChlcXVpdmFsZW50IGJpbmFyeSBpcyAxMDEwKSwKKwkJICogdGhlbiBlcXVpdmFsZW50IGRyaXZlciBzcGVjaWZpYyBtYXNrIHZhbHVlIGlzCisJCSAqICIweEZGIDB4MDAgMHhGRiAweDAwIi4KKwkJICovCisJCW1lbXNldCgmbWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKKwkJZm9yIChwb3MgPSAwOyBwb3MgPCB3b3ctPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuOyBwb3MrKykgeworCQkJaWYgKHdvdy0+cGF0dGVybnNbaV0ubWFza1twb3MgLyA4XSAmICgweDEgPDwgKHBvcyAlIDgpKSkKKwkJCQltYXNrW3Bvc10gPSAweEZGOworCQl9CisJCS8qCisJCSAqIE5vdGU6IFBhdHRlcm4ncyBvZmZzZXQgaXMgbm90IHBhc3NlZCBhcyBwYXJ0IG9mIHdvd2xhbgorCQkgKiBwYXJhbWV0ZXIgZnJvbSBDRkcgbGF5ZXIuIFNvIGl0J3MgYWx3YXlzIHBhc3NlZCBhcyBaRVJPCisJCSAqIHRvIHRoZSBmaXJtd2FyZS4gSXQgbWVhbnMsIGdpdmVuIFdPVyBwYXR0ZXJucyBhcmUgYWx3YXlzCisJCSAqIG1hdGNoZWQgZnJvbSB0aGUgZmlyc3QgYnl0ZSBvZiByZWNlaXZlZCBwa3QgaW4gdGhlIGZpcm13YXJlLgorCQkgKi8KKwkJcmV0ID0gYXRoNmtsX3dtaV9hZGRfd293X3BhdHRlcm5fY21kKGFyLT53bWksCisJCQkJCXZpZi0+ZndfdmlmX2lkeCwgV09XX0xJU1RfSUQsCisJCQkJCXdvdy0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4sCisJCQkJCTAgLyogcGF0dGVybiBvZmZzZXQgKi8sCisJCQkJCXdvdy0+cGF0dGVybnNbaV0ucGF0dGVybiwgbWFzayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh3b3ctPmRpc2Nvbm5lY3QpCisJCWZpbHRlciB8PSBXT1dfRklMVEVSX09QVElPTl9OV0tfRElTQVNTT0M7CisKKwlpZiAod293LT5tYWdpY19wa3QpCisJCWZpbHRlciB8PSBXT1dfRklMVEVSX09QVElPTl9NQUdJQ19QQUNLRVQ7CisKKwlpZiAod293LT5ndGtfcmVrZXlfZmFpbHVyZSkKKwkJZmlsdGVyIHw9IFdPV19GSUxURVJfT1BUSU9OX0dUS19FUlJPUjsKKworCWlmICh3b3ctPmVhcF9pZGVudGl0eV9yZXEpCisJCWZpbHRlciB8PSBXT1dfRklMVEVSX09QVElPTl9FQVBfUkVROworCisJaWYgKHdvdy0+Zm91cl93YXlfaGFuZHNoYWtlKQorCQlmaWx0ZXIgfD0gV09XX0ZJTFRFUl9PUFRJT05fODAyMVhfNFdBWUhTOworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfd293X21vZGVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICBBVEg2S0xfV09XX01PREVfRU5BQkxFLAorCQkJCQkgIGZpbHRlciwKKwkJCQkJICBXT1dfSE9TVF9SRVFfREVMQVkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSBBVEg2S0xfSE9TVF9NT0RFX0FTTEVFUCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhci0+dHhfcGVuZGluZ1thci0+Y3RybF9lcF0pIHsKKwkJbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKKwkJCQlhci0+dHhfcGVuZGluZ1thci0+Y3RybF9lcF0gPT0gMCwgV01JX1RJTUVPVVQpOworCQlpZiAobGVmdCA9PSAwKSB7CisJCQlhdGg2a2xfd2FybigiY2xlYXIgd21pIGN0cmwgZGF0YSB0aW1lb3V0XG4iKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCX0gZWxzZSBpZiAobGVmdCA8IDApIHsKKwkJCWF0aDZrbF93YXJuKCJjbGVhciB3bWkgY3RybCBkYXRhIGZhaWxlZDogJWRcbiIsIGxlZnQpOworCQkJcmV0ID0gbGVmdDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3dvd19yZXN1bWUoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKKwlpbnQgcmV0OworCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfaG9zdF9zbGVlcF9tb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgQVRINktMX0hPU1RfTU9ERV9BV0FLRSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKHN0cnVjdCBhdGg2a2wgKmFyLAorCQkJICAgIGVudW0gYXRoNmtsX2NmZ19zdXNwZW5kX21vZGUgbW9kZSwKKwkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQVRINktMX0NGR19TVVNQRU5EX1dPVzoKKworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgIndvdyBtb2RlIHN1c3BlbmRcbiIpOworCisJCS8qIEZsdXNoIGFsbCBub24gY29udHJvbCBwa3RzIGluIFRYIHBhdGggKi8KKwkJYXRoNmtsX3R4X2RhdGFfY2xlYW51cChhcik7CisKKwkJcmV0ID0gYXRoNmtsX3dvd19zdXNwZW5kKGFyLCB3b3cpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJ3b3cgc3VzcGVuZCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfV09XOworCQlicmVhazsKKworCWNhc2UgQVRINktMX0NGR19TVVNQRU5EX0RFRVBTTEVFUDoKKworCQlhdGg2a2xfY2ZnODAyMTFfc3RvcF9hbGwoYXIpOworCisJCS8qIHNhdmUgdGhlIGN1cnJlbnQgcG93ZXIgbW9kZSBiZWZvcmUgZW5hYmxpbmcgcG93ZXIgc2F2ZSAqLworCQlhci0+d21pLT5zYXZlZF9wd3JfbW9kZSA9IGFyLT53bWktPnB3cl9tb2RlOworCisJCXJldCA9IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLCBSRUNfUE9XRVIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2Fybigid21pIHBvd2VybW9kZSBjb21tYW5kIGZhaWxlZCBkdXJpbmcgc3VzcGVuZDogJWRcbiIsCisJCQkJICAgIHJldCk7CisJCX0KKworCQlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfREVFUFNMRUVQOworCisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfQ0ZHX1NVU1BFTkRfQ1VUUE9XRVI6CisKKwkJYXRoNmtsX2NmZzgwMjExX3N0b3BfYWxsKGFyKTsKKworCQlpZiAoYXItPnN0YXRlID09IEFUSDZLTF9TVEFURV9PRkYpIHsKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELAorCQkJCSAgICJzdXNwZW5kIGh3IG9mZiwgbm8gYWN0aW9uIGZvciBjdXRwb3dlclxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAic3VzcGVuZCBjdXR0aW5nIHBvd2VyXG4iKTsKKworCQlyZXQgPSBhdGg2a2xfaW5pdF9od19zdG9wKGFyKTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX3dhcm4oImZhaWxlZCB0byBzdG9wIGh3IGR1cmluZyBzdXNwZW5kOiAlZFxuIiwKKwkJCQkgICAgcmV0KTsKKwkJfQorCisJCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9DVVRQT1dFUjsKKworCQlicmVhazsKKworCWNhc2UgQVRINktMX0NGR19TVVNQRU5EX1NDSEVEX1NDQU46CisJCS8qCisJCSAqIE5vdGhpbmcgbmVlZGVkIGZvciBzY2hlZHVsZSBzY2FuLCBmaXJtd2FyZSBpcyBhbHJlYWR5IGluCisJCSAqIHdvdyBtb2RlIGFuZCBzbGVlcGluZyBtb3N0IG9mIHRoZSB0aW1lLgorCQkgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0aDZrbF9jZmc4MDIxMV9yZXN1bWUoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoYXItPnN0YXRlKSB7CisJY2FzZSAgQVRINktMX1NUQVRFX1dPVzoKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsICJ3b3cgbW9kZSByZXN1bWVcbiIpOworCisJCXJldCA9IGF0aDZrbF93b3dfcmVzdW1lKGFyKTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX3dhcm4oIndvdyBtb2RlIHJlc3VtZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9PTjsKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9ERUVQU0xFRVA6CisJCWlmIChhci0+d21pLT5wd3JfbW9kZSAhPSBhci0+d21pLT5zYXZlZF9wd3JfbW9kZSkgeworCQkJcmV0ID0gYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKGFyLT53bWksIDAsCisJCQkJCQkgICAgICAgYXItPndtaS0+c2F2ZWRfcHdyX21vZGUpOworCQkJaWYgKHJldCkgeworCQkJCWF0aDZrbF93YXJuKCJ3bWkgcG93ZXJtb2RlIGNvbW1hbmQgZmFpbGVkIGR1cmluZyByZXN1bWU6ICVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCX0KKwkJfQorCisJCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9PTjsKKworCQlicmVhazsKKworCWNhc2UgQVRINktMX1NUQVRFX0NVVFBPV0VSOgorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInJlc3VtZSByZXN0b3JpbmcgcG93ZXJcbiIpOworCisJCXJldCA9IGF0aDZrbF9pbml0X2h3X3N0YXJ0KGFyKTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBib290IGh3IGluIHJlc3VtZTogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfU0NIRURfU0NBTjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhcjZrX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKworLyogaGlmIGxheWVyIGRlY2lkZXMgd2hhdCBzdXNwZW5kIG1vZGUgdG8gdXNlICovCitzdGF0aWMgaW50IF9fYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gd2lwaHlfcHJpdih3aXBoeSk7CiAKLQlyZXR1cm4gYXRoNmtsX2hpZl9zdXNwZW5kKGFyKTsKKwlyZXR1cm4gYXRoNmtsX2hpZl9zdXNwZW5kKGFyLCB3b3cpOworfQorCitzdGF0aWMgaW50IF9fYXRoNmtsX2NmZzgwMjExX3Jlc3VtZShzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gd2lwaHlfcHJpdih3aXBoeSk7CisKKwlyZXR1cm4gYXRoNmtsX2hpZl9yZXN1bWUoYXIpOworfQorCisvKgorICogRklYTUU6IFdPVyBzdXNwZW5kIG1vZGUgaXMgc2VsZWN0ZWQgaWYgdGhlIGhvc3Qgc2RpbyBjb250cm9sbGVyIHN1cHBvcnRzCisgKiBib3RoIHNkaW8gaXJxIHdha2UgdXAgYW5kIGtlZXAgcG93ZXIuIFRoZSB0YXJnZXQgcHVsbHMgc2RpbyBkYXRhIGxpbmUgdG8KKyAqIHdha2UgdXAgdGhlIGhvc3Qgd2hlbiBXT1cgcGF0dGVybiBtYXRjaGVzLiBUaGlzIGNhdXNlcyBzZGlvIGlycSBoYW5kbGVyCisgKiBpcyBiZWluZyBjYWxsZWQgaW4gdGhlIGhvc3Qgc2lkZSB3aGljaCBpbnRlcm5hbGx5IGhpdHMgYXRoNmtsJ3MgUlggcGF0aC4KKyAqCisgKiBTaW5jZSBzZGlvIGludGVycnVwdCBpcyBub3QgZGlzYWJsZWQsIFJYIHBhdGggZXhlY3V0ZXMgZXZlbiBiZWZvcmUKKyAqIHRoZSBob3N0IGV4ZWN1dGVzIHRoZSBhY3R1YWwgcmVzdW1lIG9wZXJhdGlvbiBmcm9tIFBNIG1vZHVsZS4KKyAqCisgKiBJbiB0aGUgY3VycmVudCBzY2VuYXJpbywgV09XIHJlc3VtZSBzaG91bGQgaGFwcGVuIGJlZm9yZSBzdGFydCBwcm9jZXNzaW5nCisgKiBhbnkgZGF0YSBmcm9tIHRoZSB0YXJnZXQuIFNvIEl0J3MgcmVxdWlyZWQgdG8gcGVyZm9ybSBXT1cgcmVzdW1lIGluIFJYIHBhdGguCisgKiBJZGVhbGx5IHdlIHNob3VsZCBwZXJmb3JtIFdPVyByZXN1bWUgb25seSBpbiB0aGUgYWN0dWFsIHBsYXRmb3JtCisgKiByZXN1bWUgcGF0aC4gVGhpcyBhcmVhIG5lZWRzIGJpdCByZXdvcmsgdG8gYXZvaWQgV09XIHJlc3VtZSBpbiBSWCBwYXRoLgorICoKKyAqIGF0aDZrbF9jaGVja193b3dfc3RhdHVzKCkgaXMgY2FsbGVkIGZyb20gYXRoNmtsX3J4KCkuCisgKi8KK3ZvaWQgYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJaWYgKGFyLT5zdGF0ZSA9PSBBVEg2S0xfU1RBVEVfV09XKQorCQlhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKGFyKTsKK30KKworI2Vsc2UKKwordm9pZCBhdGg2a2xfY2hlY2tfd293X3N0YXR1cyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKIH0KICNlbmRpZgogCkBAIC0xNDIzLDE0ICsyMDE0LDE0IEBACiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkgICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSkKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogY2VudGVyX2ZyZXE9JXUgaHdfdmFsdWU9JXVcbiIsCiAJCSAgIF9fZnVuY19fLCBjaGFuLT5jZW50ZXJfZnJlcSwgY2hhbi0+aHdfdmFsdWUpOwotCWFyLT5uZXh0X2NoYW4gPSBjaGFuLT5jZW50ZXJfZnJlcTsKKwl2aWYtPm5leHRfY2hhbiA9IGNoYW4tPmNlbnRlcl9mcmVxOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDQyLDkgKzIwMzMsMTAgQEAKIAkJcG9zWzRdID09IDB4OWEgJiYgcG9zWzVdID09IDB4MDk7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3NldF9hcF9wcm9iZV9yZXNwX2llcyhzdHJ1Y3QgYXRoNmtsICphciwgY29uc3QgdTggKmllcywKLQkJCQkJc2l6ZV90IGllc19sZW4pCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYXBfcHJvYmVfcmVzcF9pZXMoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwKKwkJCQkJY29uc3QgdTggKmllcywgc2l6ZV90IGllc19sZW4pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCWNvbnN0IHU4ICpwb3M7CiAJdTggKmJ1ZiA9IE5VTEw7CiAJc2l6ZV90IGxlbiA9IDA7CkBAIC0xNDcxLDggKzIwNjMsOCBAQAogCQl9CiAJfQogCi0JcmV0ID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIFdNSV9GUkFNRV9QUk9CRV9SRVNQLAotCQkJCSAgICAgICBidWYsIGxlbik7CisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgICAgV01JX0ZSQU1FX1BST0JFX1JFU1AsIGJ1ZiwgbGVuKTsKIAlrZnJlZShidWYpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNDgxLDM2ICsyMDczLDM5IEBACiAJCQkgICAgc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzICppbmZvLCBib29sIGFkZCkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXU4ICppZXM7CiAJaW50IGllc19sZW47CiAJc3RydWN0IHdtaV9jb25uZWN0X2NtZCBwOwogCWludCByZXM7Ci0JaW50IGk7CisJaW50IGksIHJldDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBhZGQ9JWRcbiIsIF9fZnVuY19fLCBhZGQpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGFyLT5uZXh0X21vZGUgIT0gQVBfTkVUV09SSykKKwlpZiAodmlmLT5uZXh0X21vZGUgIT0gQVBfTkVUV09SSykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKGluZm8tPmJlYWNvbl9pZXMpIHsKLQkJcmVzID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIFdNSV9GUkFNRV9CRUFDT04sCisJCXJlcyA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgICBXTUlfRlJBTUVfQkVBQ09OLAogCQkJCQkgICAgICAgaW5mby0+YmVhY29uX2llcywKIAkJCQkJICAgICAgIGluZm8tPmJlYWNvbl9pZXNfbGVuKTsKIAkJaWYgKHJlcykKIAkJCXJldHVybiByZXM7CiAJfQogCWlmIChpbmZvLT5wcm9iZXJlc3BfaWVzKSB7Ci0JCXJlcyA9IGF0aDZrbF9zZXRfYXBfcHJvYmVfcmVzcF9pZXMoYXIsIGluZm8tPnByb2JlcmVzcF9pZXMsCisJCXJlcyA9IGF0aDZrbF9zZXRfYXBfcHJvYmVfcmVzcF9pZXModmlmLCBpbmZvLT5wcm9iZXJlc3BfaWVzLAogCQkJCQkJICAgaW5mby0+cHJvYmVyZXNwX2llc19sZW4pOwogCQlpZiAocmVzKQogCQkJcmV0dXJuIHJlczsKIAl9CiAJaWYgKGluZm8tPmFzc29jcmVzcF9pZXMpIHsKLQkJcmVzID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIFdNSV9GUkFNRV9BU1NPQ19SRVNQLAorCQlyZXMgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICAgV01JX0ZSQU1FX0FTU09DX1JFU1AsCiAJCQkJCSAgICAgICBpbmZvLT5hc3NvY3Jlc3BfaWVzLAogCQkJCQkgICAgICAgaW5mby0+YXNzb2NyZXNwX2llc19sZW4pOwogCQlpZiAocmVzKQpAQCAtMTUzNywxMiArMjEzMiwxNCBAQAogCiAJaWYgKGluZm8tPnNzaWQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtY3B5KGFyLT5zc2lkLCBpbmZvLT5zc2lkLCBpbmZvLT5zc2lkX2xlbik7Ci0JYXItPnNzaWRfbGVuID0gaW5mby0+c3NpZF9sZW47CisJbWVtY3B5KHZpZi0+c3NpZCwgaW5mby0+c3NpZCwgaW5mby0+c3NpZF9sZW4pOworCXZpZi0+c3NpZF9sZW4gPSBpbmZvLT5zc2lkX2xlbjsKIAlpZiAoaW5mby0+aGlkZGVuX3NzaWQgIT0gTkw4MDIxMV9ISURERU5fU1NJRF9OT1RfSU5fVVNFKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7IC8qIFRPRE8gKi8KIAotCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEg7CisJcmV0ID0gYXRoNmtsX3NldF9hdXRoX3R5cGUodmlmLCBpbmZvLT5hdXRoX3R5cGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAltZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7CiAKQEAgLTE1NjQsNyArMjE2MSw3IEBACiAJfQogCWlmIChwLmF1dGhfbW9kZSA9PSAwKQogCQlwLmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKLQlhci0+YXV0aF9tb2RlID0gcC5hdXRoX21vZGU7CisJdmlmLT5hdXRoX21vZGUgPSBwLmF1dGhfbW9kZTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5jcnlwdG8ubl9jaXBoZXJzX3BhaXJ3aXNlOyBpKyspIHsKIAkJc3dpdGNoIChpbmZvLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVtpXSkgewpAQCAtMTU3OCwxMyArMjE3NSwxNiBAQAogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCQlwLnByd2lzZV9jcnlwdG9fdHlwZSB8PSBBRVNfQ1JZUFQ7CiAJCQlicmVhazsKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OgorCQkJcC5wcndpc2VfY3J5cHRvX3R5cGUgfD0gV0FQSV9DUllQVDsKKwkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChwLnByd2lzZV9jcnlwdG9fdHlwZSA9PSAwKSB7CiAJCXAucHJ3aXNlX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKLQkJYXRoNmtsX3NldF9jaXBoZXIoYXIsIDAsIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIDAsIHRydWUpOwogCX0gZWxzZSBpZiAoaW5mby0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZSA9PSAxKQotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgaW5mby0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIGluZm8tPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdLCB0cnVlKTsKIAogCXN3aXRjaCAoaW5mby0+Y3J5cHRvLmNpcGhlcl9ncm91cCkgewogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CkBAIC0xNTk3LDIxICsyMTk3LDM0IEBACiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQlwLmdycF9jcnlwdG9fdHlwZSA9IEFFU19DUllQVDsKIAkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OgorCQlwLmdycF9jcnlwdG9fdHlwZSA9IFdBUElfQ1JZUFQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXAuZ3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKIAkJYnJlYWs7CiAJfQotCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBpbmZvLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CisJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBpbmZvLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CiAKIAlwLm53X3R5cGUgPSBBUF9ORVRXT1JLOwotCWFyLT5ud190eXBlID0gYXItPm5leHRfbW9kZTsKKwl2aWYtPm53X3R5cGUgPSB2aWYtPm5leHRfbW9kZTsKIAotCXAuc3NpZF9sZW4gPSBhci0+c3NpZF9sZW47Ci0JbWVtY3B5KHAuc3NpZCwgYXItPnNzaWQsIGFyLT5zc2lkX2xlbik7Ci0JcC5kb3QxMV9hdXRoX21vZGUgPSBhci0+ZG90MTFfYXV0aF9tb2RlOwotCXAuY2ggPSBjcHVfdG9fbGUxNihhci0+bmV4dF9jaGFuKTsKKwlwLnNzaWRfbGVuID0gdmlmLT5zc2lkX2xlbjsKKwltZW1jcHkocC5zc2lkLCB2aWYtPnNzaWQsIHZpZi0+c3NpZF9sZW4pOworCXAuZG90MTFfYXV0aF9tb2RlID0gdmlmLT5kb3QxMV9hdXRoX21vZGU7CisJcC5jaCA9IGNwdV90b19sZTE2KHZpZi0+bmV4dF9jaGFuKTsKIAotCXJlcyA9IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoYXItPndtaSwgJnApOworCWlmICh2aWYtPndkZXYuaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTykgeworCQlwLm53X3N1YnR5cGUgPSBTVUJUWVBFX1AyUEdPOworCX0gZWxzZSB7CisJCS8qCisJCSAqIER1ZSB0byBmaXJtd2FyZSBsaW1pdGF0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8KKwkJICogZG8gUDJQIG1nbXQgb3BlcmF0aW9ucyBpbiBBUCBtb2RlCisJCSAqLworCQlwLm53X3N1YnR5cGUgPSBTVUJUWVBFX05PTkU7CisJfQorCisJcmVzID0gYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsICZwKTsKIAlpZiAocmVzIDwgMCkKIAkJcmV0dXJuIHJlczsKIApAQCAtMTYzMywxNCArMjI0NiwxNSBAQAogc3RhdGljIGludCBhdGg2a2xfZGVsX2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChhci0+bndfdHlwZSAhPSBBUF9ORVRXT1JLKQorCWlmICh2aWYtPm53X3R5cGUgIT0gQVBfTkVUV09SSykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKQorCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCiAJCXJldHVybiAtRU5PVENPTk47CiAKLQlhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKGFyLT53bWkpOwotCWNsZWFyX2JpdChDT05ORUNURUQsICZhci0+ZmxhZyk7CisJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOworCWNsZWFyX2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY0OSw4ICsyMjYzLDkgQEAKIAkJCQkgdTggKm1hYywgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChhci0+bndfdHlwZSAhPSBBUF9ORVRXT1JLKQorCWlmICh2aWYtPm53X3R5cGUgIT0gQVBfTkVUV09SSykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogVXNlIHRoaXMgb25seSBmb3IgYXV0aG9yaXppbmcvdW5hdXRob3JpemluZyBhIHN0YXRpb24gKi8KQEAgLTE2NTgsMTAgKzIyNzMsMTAgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKHBhcmFtcy0+c3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpKQotCQlyZXR1cm4gYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShhci0+d21pLCBXTUlfQVBfTUxNRV9BVVRIT1JJWkUsCi0JCQkJCSAgICAgIG1hYywgMCk7Ci0JcmV0dXJuIGF0aDZrbF93bWlfYXBfc2V0X21sbWUoYXItPndtaSwgV01JX0FQX01MTUVfVU5BVVRIT1JJWkUsIG1hYywKLQkJCQkgICAgICAwKTsKKwkJcmV0dXJuIGF0aDZrbF93bWlfYXBfc2V0X21sbWUoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICBXTUlfQVBfTUxNRV9BVVRIT1JJWkUsIG1hYywgMCk7CisJcmV0dXJuIGF0aDZrbF93bWlfYXBfc2V0X21sbWUoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCSAgICAgIFdNSV9BUF9NTE1FX1VOQVVUSE9SSVpFLCBtYWMsIDApOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtMTY3MiwxMyArMjI4NywyMCBAQAogCQkJCSAgICB1NjQgKmNvb2tpZSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGlkOwogCiAJLyogVE9ETzogaWYgYWxyZWFkeSBwZW5kaW5nIG9yIG9uZ29pbmcgcmVtYWluLW9uLWNoYW5uZWwsCiAJICogcmV0dXJuIC1FQlVTWSAqLwotCSpjb29raWUgPSAxOyAvKiBvbmx5IGEgc2luZ2xlIHBlbmRpbmcgcmVxdWVzdCBpcyBzdXBwb3J0ZWQgKi8KKwlpZCA9ICsrdmlmLT5sYXN0X3JvY19pZDsKKwlpZiAoaWQgPT0gMCkgeworCQkvKiBEbyBub3QgdXNlIDAgYXMgdGhlIGNvb2tpZSB2YWx1ZSAqLworCQlpZCA9ICsrdmlmLT5sYXN0X3JvY19pZDsKKwl9CisJKmNvb2tpZSA9IGlkOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKGFyLT53bWksIGNoYW4tPmNlbnRlcl9mcmVxLAotCQkJCQkgICAgIGR1cmF0aW9uKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgIGNoYW4tPmNlbnRlcl9mcmVxLCBkdXJhdGlvbik7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtMTY4NiwxNiArMjMwOCwyMCBAQAogCQkJCQkgICB1NjQgY29va2llKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChjb29raWUgIT0gMSkKKwlpZiAoY29va2llICE9IHZpZi0+bGFzdF9yb2NfaWQpCiAJCXJldHVybiAtRU5PRU5UOworCXZpZi0+bGFzdF9jYW5jZWxfcm9jX2lkID0gY29va2llOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChhci0+d21pKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3NlbmRfZ29fcHJvYmVfcmVzcChzdHJ1Y3QgYXRoNmtsICphciwgY29uc3QgdTggKmJ1ZiwKLQkJCQkgICAgIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmcmVxKQorc3RhdGljIGludCBhdGg2a2xfc2VuZF9nb19wcm9iZV9yZXNwKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCisJCQkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGZyZXEpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCWNvbnN0IHU4ICpwb3M7CiAJdTggKnAycDsKIAlpbnQgcDJwX2xlbjsKQEAgLTE3MjIsOCArMjM0OCw4IEBACiAJCXBvcyArPSAyICsgcG9zWzFdOwogCX0KIAotCXJldCA9IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoYXItPndtaSwgZnJlcSwgbWdtdC0+ZGEsCi0JCQkJCQkgcDJwLCBwMnBfbGVuKTsKKwlyZXQgPSBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgZnJlcSwKKwkJCQkJCSBtZ210LT5kYSwgcDJwLCBwMnBfbGVuKTsKIAlrZnJlZShwMnApOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNzM2LDQxICsyMzYyLDU3IEBACiAJCQkgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgaWQ7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCiAJbWdtdCA9IChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgYnVmOwogCWlmIChidWYgKyBsZW4gPj0gbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlICYmCi0JICAgIGFyLT5ud190eXBlID09IEFQX05FVFdPUksgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCisJICAgIHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLICYmIHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpICYmCiAJICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSB7CiAJCS8qCiAJCSAqIFNlbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWUgaW4gQVAgbW9kZSB1c2luZyBhIHNlcGFyYXRlIFdNSQogCQkgKiBjb21tYW5kIHRvIGFsbG93IHRoZSB0YXJnZXQgdG8gZmlsbCBpbiB0aGUgZ2VuZXJpYyBJRXMuCiAJCSAqLwogCQkqY29va2llID0gMDsgLyogVFggc3RhdHVzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJcmV0dXJuIGF0aDZrbF9zZW5kX2dvX3Byb2JlX3Jlc3AoYXIsIGJ1ZiwgbGVuLAorCQlyZXR1cm4gYXRoNmtsX3NlbmRfZ29fcHJvYmVfcmVzcCh2aWYsIGJ1ZiwgbGVuLAogCQkJCQkJIGNoYW4tPmNlbnRlcl9mcmVxKTsKIAl9CiAKLQlpZCA9IGFyLT5zZW5kX2FjdGlvbl9pZCsrOworCWlkID0gdmlmLT5zZW5kX2FjdGlvbl9pZCsrOwogCWlmIChpZCA9PSAwKSB7CiAJCS8qCiAJCSAqIDAgaXMgYSByZXNlcnZlZCB2YWx1ZSBpbiB0aGUgV01JIGNvbW1hbmQgYW5kIHNoYWxsIG5vdCBiZQogCQkgKiB1c2VkIGZvciB0aGUgY29tbWFuZC4KIAkJICovCi0JCWlkID0gYXItPnNlbmRfYWN0aW9uX2lkKys7CisJCWlkID0gdmlmLT5zZW5kX2FjdGlvbl9pZCsrOwogCX0KIAogCSpjb29raWUgPSBpZDsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoYXItPndtaSwgaWQsIGNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAotCQkJCQkgIGJ1ZiwgbGVuKTsKKworCWlmICh0ZXN0X2JpdChBVEg2S0xfRldfQ0FQQUJJTElUWV9TVEFfUDJQREVWX0RVUExFWCwKKwkJICAgIGFyLT5md19jYXBhYmlsaXRpZXMpKSB7CisJCS8qCisJCSAqIElmIGNhcGFibGUgb2YgZG9pbmcgUDJQIG1nbXQgb3BlcmF0aW9ucyB1c2luZworCQkgKiBzdGF0aW9uIGludGVyZmFjZSwgc2VuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxpa2UKKwkJICogc3VwcG9ydGVkIHJhdGVzIHRvIGFkdmVydGlzZSBhbmQgeG1pdCByYXRlcyBmb3IKKwkJICogcHJvYmUgcmVxdWVzdHMKKwkJICovCisJCXJldHVybiBhdGg2a2xfd21pX3NlbmRfbWdtdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBpZCwKKwkJCQkJCWNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAorCQkJCQkJYnVmLCBsZW4sIG5vX2Njayk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgaWQsCisJCQkJCQkgIGNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAorCQkJCQkJICBidWYsIGxlbik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhdGg2a2xfbWdtdF9mcmFtZV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICAgICB1MTYgZnJhbWVfdHlwZSwgYm9vbCByZWcpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGZyYW1lX3R5cGU9MHgleCByZWc9JWRcbiIsCiAJCSAgIF9fZnVuY19fLCBmcmFtZV90eXBlLCByZWcpOwpAQCAtMTc4MCwxMCArMjQyMiw5NCBAQAogCQkgKiB3ZSBjYW5ub3Qgc2VuZCBXTUlfUFJPQkVfUkVRX1JFUE9SVF9DTUQgaGVyZS4gSW5zdGVhZCwgd2UKIAkJICogaGFyZGNvZGUgdGFyZ2V0IHRvIHJlcG9ydCBQcm9iZSBSZXF1ZXN0IGZyYW1lcyBhbGwgdGhlIHRpbWUuCiAJCSAqLwotCQlhci0+cHJvYmVfcmVxX3JlcG9ydCA9IHJlZzsKKwkJdmlmLT5wcm9iZV9yZXFfcmVwb3J0ID0gcmVnOwogCX0KIH0KIAorc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc3NjYW5fc3RhcnQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaW50ZXJ2YWw7CisJaW50IHJldDsKKwl1OCBpOworCisJaWYgKGFyLT5zdGF0ZSAhPSBBVEg2S0xfU1RBVEVfT04pCisJCXJldHVybiAtRUlPOworCisJaWYgKHZpZi0+c21lX3N0YXRlICE9IFNNRV9ESVNDT05ORUNURUQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXItPndpcGh5LT5tYXhfc2NoZWRfc2Nhbl9zc2lkczsgaSsrKSB7CisJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgIGksIERJU0FCTEVfU1NJRF9GTEFHLAorCQkJCQkgIDAsIE5VTEwpOworCX0KKworCS8qIGZ3IHVzZXMgc2Vjb25kcywgYWxzbyBtYWtlIHN1cmUgdGhhdCBpdCdzID4wICovCisJaW50ZXJ2YWwgPSBtYXhfdCh1MTYsIDEsIHJlcXVlc3QtPmludGVydmFsIC8gMTAwMCk7CisKKwlhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgIGludGVydmFsLCBpbnRlcnZhbCwKKwkJCQkgIDEwLCAwLCAwLCAwLCAzLCAwLCAwLCAwKTsKKworCWlmIChyZXF1ZXN0LT5uX3NzaWRzICYmIHJlcXVlc3QtPnNzaWRzWzBdLnNzaWRfbGVuKSB7CisJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICBpLCBTUEVDSUZJQ19TU0lEX0ZMQUcsCisJCQkJCQkgIHJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuLAorCQkJCQkJICByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkKTsKKwkJfQorCX0KKworCXJldCA9IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgQVRINktMX1dPV19NT0RFX0VOQUJMRSwKKwkJCQkJICBXT1dfRklMVEVSX1NTSUQsCisJCQkJCSAgV09XX0hPU1RfUkVRX0RFTEFZKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF93YXJuKCJGYWlsZWQgdG8gZW5hYmxlIHdvdyB3aXRoIHNzaWQgZmlsdGVyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB0aGlzIGFsc28gY2xlYXJzIElFIGluIGZ3IGlmIGl0J3Mgbm90IHNldCAqLworCXJldCA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICAgIFdNSV9GUkFNRV9QUk9CRV9SRVEsCisJCQkJICAgICAgIHJlcXVlc3QtPmllLCByZXF1ZXN0LT5pZV9sZW4pOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBzZXQgcHJvYmUgcmVxdWVzdCBJRSBmb3Igc2NoZWR1bGVkIHNjYW46ICVkIiwKKwkJCSAgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJIEFUSDZLTF9IT1NUX01PREVfQVNMRUVQKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF93YXJuKCJGYWlsZWQgdG8gZW5hYmxlIGhvc3Qgc2xlZXAgbW9kZSBmb3Igc2NoZWQgc2NhbjogJWRcbiIsCisJCQkgICAgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfU0NIRURfU0NBTjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0b3Aoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOworCWJvb2wgc3RvcHBlZDsKKworCXN0b3BwZWQgPSBfX2F0aDZrbF9jZmc4MDIxMV9zc2Nhbl9zdG9wKHZpZik7CisKKwlpZiAoIXN0b3BwZWQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cnhfc3R5cGVzCiBhdGg2a2xfbWdtdF9zdHlwZXNbTlVNX05MODAyMTFfSUZUWVBFU10gPSB7CiAJW05MODAyMTFfSUZUWVBFX1NUQVRJT05dID0gewpAQCAtMTgwNyw2ICsyNTMzLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIGF0aDZrbF9jZmc4MDIxMV9vcHMgPSB7CisJLmFkZF92aXJ0dWFsX2ludGYgPSBhdGg2a2xfY2ZnODAyMTFfYWRkX2lmYWNlLAorCS5kZWxfdmlydHVhbF9pbnRmID0gYXRoNmtsX2NmZzgwMjExX2RlbF9pZmFjZSwKIAkuY2hhbmdlX3ZpcnR1YWxfaW50ZiA9IGF0aDZrbF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2UsCiAJLnNjYW4gPSBhdGg2a2xfY2ZnODAyMTFfc2NhbiwKIAkuY29ubmVjdCA9IGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0LApAQCAtMTgyNyw3ICsyNTU1LDggQEAKIAkuZmx1c2hfcG1rc2EgPSBhdGg2a2xfZmx1c2hfcG1rc2EsCiAJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGF0aDZrbF90bV9jbWQpCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBhcjZrX2NmZzgwMjExX3N1c3BlbmQsCisJLnN1c3BlbmQgPSBfX2F0aDZrbF9jZmc4MDIxMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBfX2F0aDZrbF9jZmc4MDIxMV9yZXN1bWUsCiAjZW5kaWYKIAkuc2V0X2NoYW5uZWwgPSBhdGg2a2xfc2V0X2NoYW5uZWwsCiAJLmFkZF9iZWFjb24gPSBhdGg2a2xfYWRkX2JlYWNvbiwKQEAgLTE4MzgsNzggKzI1NjcsMjc3IEBACiAJLmNhbmNlbF9yZW1haW5fb25fY2hhbm5lbCA9IGF0aDZrbF9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCiAJLm1nbXRfdHggPSBhdGg2a2xfbWdtdF90eCwKIAkubWdtdF9mcmFtZV9yZWdpc3RlciA9IGF0aDZrbF9tZ210X2ZyYW1lX3JlZ2lzdGVyLAorCS5zY2hlZF9zY2FuX3N0YXJ0ID0gYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0YXJ0LAorCS5zY2hlZF9zY2FuX3N0b3AgPSBhdGg2a2xfY2ZnODAyMTFfc3NjYW5fc3RvcCwKIH07CiAKLXN0cnVjdCB3aXJlbGVzc19kZXYgKmF0aDZrbF9jZmc4MDIxMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3N0b3Aoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCBhdGg2a2wgKmFyOworCWF0aDZrbF9jZmc4MDIxMV9zc2Nhbl9kaXNhYmxlKHZpZik7CiAKLQl3ZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghd2RldikgewotCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXJlbGVzcyBkZXZpY2VcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKHZpZi0+c21lX3N0YXRlKSB7CisJY2FzZSBTTUVfRElTQ09OTkVDVEVEOgorCQlicmVhazsKKwljYXNlIFNNRV9DT05ORUNUSU5HOgorCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdCh2aWYtPm5kZXYsIHZpZi0+YnNzaWQsIE5VTEwsIDAsCisJCQkJCU5VTEwsIDAsCisJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCisJCQkJCUdGUF9LRVJORUwpOworCQlicmVhazsKKwljYXNlIFNNRV9DT05ORUNURUQ6CisJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZCh2aWYtPm5kZXYsIDAsIE5VTEwsIDAsIEdGUF9LRVJORUwpOworCQlicmVhazsKIAl9CiAKLQkvKiBjcmVhdGUgYSBuZXcgd2lwaHkgZm9yIHVzZSB3aXRoIGNmZzgwMjExICovCi0Jd2Rldi0+d2lwaHkgPSB3aXBoeV9uZXcoJmF0aDZrbF9jZmc4MDIxMV9vcHMsIHNpemVvZihzdHJ1Y3QgYXRoNmtsKSk7Ci0JaWYgKCF3ZGV2LT53aXBoeSkgewotCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXBoeSBkZXZpY2VcbiIpOwotCQlrZnJlZSh3ZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKSkKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZCh2aWYtPmFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiAKLQlhciA9IHdpcGh5X3ByaXYod2Rldi0+d2lwaHkpOwotCWFyLT5wMnAgPSAhIWF0aDZrbF9wMnA7CisJdmlmLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCWNsZWFyX2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQl3ZGV2LT53aXBoeS0+bWdtdF9zdHlwZXMgPSBhdGg2a2xfbWdtdF9zdHlwZXM7CisJLyogZGlzYWJsZSBzY2FubmluZyAqLworCWlmIChhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKHZpZi0+YXItPndtaSwgdmlmLT5md192aWZfaWR4LCAweEZGRkYsCisJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkgIT0gMCkKKwkJYXRoNmtsX3dhcm4oImZhaWxlZCB0byBkaXNhYmxlIHNjYW4gZHVyaW5nIHN0b3BcbiIpOwogCi0Jd2Rldi0+d2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDUwMDA7Ci0KLQkvKiBzZXQgZGV2aWNlIHBvaW50ZXIgZm9yIHdpcGh5ICovCi0Jc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgZGV2KTsKLQotCXdkZXYtPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAotCQlCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwgQklUKE5MODAyMTFfSUZUWVBFX0FQKTsKLQlpZiAoYXItPnAycCkgewotCQl3ZGV2LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKLQkJCUJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKTsKLQl9Ci0JLyogbWF4IG51bSBvZiBzc2lkcyB0aGF0IGNhbiBiZSBwcm9iZWQgZHVyaW5nIHNjYW5uaW5nICovCi0Jd2Rldi0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gTUFYX1BST0JFRF9TU0lEX0lOREVYOwotCXdkZXYtPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSAxMDAwOyAvKiBGSVg6IHdoYXQgaXMgY29ycmVjdCBsaW1pdD8gKi8KLQl3ZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXRoNmtsX2JhbmRfMmdoejsKLQl3ZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmYXRoNmtsX2JhbmRfNWdoejsKLQl3ZGV2LT53aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07Ci0KLQl3ZGV2LT53aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IGNpcGhlcl9zdWl0ZXM7Ci0Jd2Rldi0+d2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUoY2lwaGVyX3N1aXRlcyk7Ci0KLQlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJYXRoNmtsX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlXG4iKTsKLQkJd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7Ci0JCWtmcmVlKHdkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gd2RldjsKKwlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudCh2aWYsIHRydWUpOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kZWluaXQoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9zdG9wX2FsbChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gYXItPndkZXY7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAotCWlmIChhci0+c2Nhbl9yZXEpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7Ci0JCWFyLT5zY2FuX3JlcSA9IE5VTEw7CisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpIHsKKwkJLyogc2F2ZSB0aGUgY3VycmVudCBwb3dlciBtb2RlIGJlZm9yZSBlbmFibGluZyBwb3dlciBzYXZlICovCisJCWFyLT53bWktPnNhdmVkX3B3cl9tb2RlID0gYXItPndtaS0+cHdyX21vZGU7CisKKwkJaWYgKGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLCBSRUNfUE9XRVIpICE9IDApCisJCQlhdGg2a2xfd2FybigiYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlOiAiCisJCQkJICAgICJ3bWlfcG93ZXJtb2RlX2NtZCBmYWlsZWRcbiIpOworCQlyZXR1cm47CiAJfQogCi0JaWYgKCF3ZGV2KQotCQlyZXR1cm47CisJLyoKKwkgKiBGSVhNRTogd2Ugc2hvdWxkIHRha2UgYXItPmxpc3RfbG9jayB0byBwcm90ZWN0IGNoYW5nZXMgaW4gdGhlCisJICogdmlmX2xpc3QsIGJ1dCB0aGF0J3Mgbm90IHRyaXZpYWwgdG8gZG8gYXMgYXRoNmtsX2NmZzgwMjExX3N0b3AoKQorCSAqIHNsZWVwcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkKKwkJYXRoNmtsX2NmZzgwMjExX3N0b3AodmlmKTsKK30KIAotCXdpcGh5X3VucmVnaXN0ZXIod2Rldi0+d2lwaHkpOwotCXdpcGh5X2ZyZWUod2Rldi0+d2lwaHkpOwotCWtmcmVlKHdkZXYpOworc3RydWN0IGF0aDZrbCAqYXRoNmtsX2NvcmVfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2wgKmFyOworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CisJdTggY3RyOworCisJLyogY3JlYXRlIGEgbmV3IHdpcGh5IGZvciB1c2Ugd2l0aCBjZmc4MDIxMSAqLworCXdpcGh5ID0gd2lwaHlfbmV3KCZhdGg2a2xfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IGF0aDZrbCkpOworCisJaWYgKCF3aXBoeSkgeworCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXBoeSBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhciA9IHdpcGh5X3ByaXYod2lwaHkpOworCWFyLT5wMnAgPSAhIWF0aDZrbF9wMnA7CisJYXItPndpcGh5ID0gd2lwaHk7CisJYXItPmRldiA9IGRldjsKKworCWFyLT52aWZfbWF4ID0gMTsKKworCWFyLT5tYXhfbm9ybV9pZmFjZSA9IDE7CisKKwlzcGluX2xvY2tfaW5pdCgmYXItPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhci0+bWNhc3Rwc3FfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFyLT5saXN0X2xvY2spOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPmV2ZW50X3dxKTsKKwlzZW1hX2luaXQoJmFyLT5zZW0sIDEpOworCisJSU5JVF9MSVNUX0hFQUQoJmFyLT5hbXNkdV9yeF9idWZmZXJfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZhci0+dmlmX2xpc3QpOworCisJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWNsZWFyX2JpdChTS0lQX1NDQU4sICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KERFU1RST1lfSU5fUFJPR1JFU1MsICZhci0+ZmxhZyk7CisKKwlhci0+bGlzdGVuX2ludHZsX3QgPSBBX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMOworCWFyLT5saXN0ZW5faW50dmxfYiA9IDA7CisJYXItPnR4X3B3ciA9IDA7CisKKwlhci0+aW50cmFfYnNzID0gMTsKKwlhci0+bHJzc2lfcm9hbV90aHJlc2hvbGQgPSBERUZfTFJTU0lfUk9BTV9USFJFU0hPTEQ7CisKKwlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfT0ZGOworCisJbWVtc2V0KCh1OCAqKWFyLT5zdGFfbGlzdCwgMCwKKwkgICAgICAgQVBfTUFYX05VTV9TVEEgKiBzaXplb2Yoc3RydWN0IGF0aDZrbF9zdGEpKTsKKworCS8qIEluaXQgdGhlIFBTIHF1ZXVlcyAqLworCWZvciAoY3RyID0gMDsgY3RyIDwgQVBfTUFYX05VTV9TVEE7IGN0cisrKSB7CisJCXNwaW5fbG9ja19pbml0KCZhci0+c3RhX2xpc3RbY3RyXS5wc3FfbG9jayk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcSk7CisJfQorCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPm1jYXN0cHNxKTsKKworCW1lbWNweShhci0+YXBfY291bnRyeV9jb2RlLCBERUZfQVBfQ09VTlRSWV9DT0RFLCAzKTsKKworCXJldHVybiBhcjsKK30KKworaW50IGF0aDZrbF9yZWdpc3Rlcl9pZWVlODAyMTFfaHcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGFyLT53aXBoeTsKKwlpbnQgcmV0OworCisJd2lwaHktPm1nbXRfc3R5cGVzID0gYXRoNmtsX21nbXRfc3R5cGVzOworCisJd2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDUwMDA7CisKKwkvKiBzZXQgZGV2aWNlIHBvaW50ZXIgZm9yIHdpcGh5ICovCisJc2V0X3dpcGh5X2Rldih3aXBoeSwgYXItPmRldik7CisKKwl3aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKKwkJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CisJCQkJIEJJVChOTDgwMjExX0lGVFlQRV9BUCk7CisJaWYgKGFyLT5wMnApIHsKKwkJd2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8CisJCQkJCSAgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpOworCX0KKworCS8qIG1heCBudW0gb2Ygc3NpZHMgdGhhdCBjYW4gYmUgcHJvYmVkIGR1cmluZyBzY2FubmluZyAqLworCXdpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IE1BWF9QUk9CRURfU1NJRF9JTkRFWDsKKwl3aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gMTAwMDsgLyogRklYOiB3aGF0IGlzIGNvcnJlY3QgbGltaXQ/ICovCisJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJmF0aDZrbF9iYW5kXzJnaHo7CisJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gJmF0aDZrbF9iYW5kXzVnaHo7CisJd2lwaHktPnNpZ25hbF90eXBlID0gQ0ZHODAyMTFfU0lHTkFMX1RZUEVfTUJNOworCisJd2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBjaXBoZXJfc3VpdGVzOworCXdpcGh5LT5uX2NpcGhlcl9zdWl0ZXMgPSBBUlJBWV9TSVpFKGNpcGhlcl9zdWl0ZXMpOworCisJd2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9NQUdJQ19QS1QgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFICB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRICAgfAorCQkJICAgICAgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFOworCXdpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IFdPV19NQVhfRklMVEVSU19QRVJfTElTVDsKKwl3aXBoeS0+d293bGFuLnBhdHRlcm5fbWluX2xlbiA9IDE7CisJd2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPSBXT1dfUEFUVEVSTl9TSVpFOworCisJd2lwaHktPm1heF9zY2hlZF9zY2FuX3NzaWRzID0gMTA7CisKKwlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3aXBoeSk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRoNmtsX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfaW5pdF9pZl9kYXRhKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCit7CisJdmlmLT5hZ2dyX2NudHh0ID0gYWdncl9pbml0KHZpZi0+bmRldik7CisJaWYgKCF2aWYtPmFnZ3JfY250eHQpIHsKKwkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgYWdnclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNldHVwX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIsIGRpc2Nvbm5lY3RfdGltZXJfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB2aWYtPm5kZXYpOworCXNldHVwX3RpbWVyKCZ2aWYtPnNjaGVkX3NjYW5fdGltZXIsIGF0aDZrbF93bWlfc3NjYW5fdGltZXIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdmlmKTsKKworCXNldF9iaXQoV01NX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKKwlzcGluX2xvY2tfaW5pdCgmdmlmLT5pZl9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGF0aDZrbF9kZWluaXRfaWZfZGF0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKworCWFnZ3JfbW9kdWxlX2Rlc3Ryb3kodmlmLT5hZ2dyX2NudHh0KTsKKworCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVCh2aWYtPmZ3X3ZpZl9pZHgpOworCisJaWYgKHZpZi0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKQorCQlhci0+aWJzc19pZl9hY3RpdmUgPSBmYWxzZTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHZpZi0+bmRldik7CisKKwlhci0+bnVtX3ZpZi0tOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2ludGVyZmFjZV9hZGQoc3RydWN0IGF0aDZrbCAqYXIsIGNoYXIgKm5hbWUsCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTggZndfdmlmX2lkeCwKKwkJCQkJdTggbndfdHlwZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnZpZiksIG5hbWUsIGV0aGVyX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCXJldHVybiBOVUxMOworCisJdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CisJbmRldi0+aWVlZTgwMjExX3B0ciA9ICZ2aWYtPndkZXY7CisJdmlmLT53ZGV2LndpcGh5ID0gYXItPndpcGh5OworCXZpZi0+YXIgPSBhcjsKKwl2aWYtPm5kZXYgPSBuZGV2OworCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih2aWYtPndkZXYud2lwaHkpKTsKKwl2aWYtPndkZXYubmV0ZGV2ID0gbmRldjsKKwl2aWYtPndkZXYuaWZ0eXBlID0gdHlwZTsKKwl2aWYtPmZ3X3ZpZl9pZHggPSBmd192aWZfaWR4OworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlID0gbndfdHlwZTsKKworCW1lbWNweShuZGV2LT5kZXZfYWRkciwgYXItPm1hY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKGZ3X3ZpZl9pZHggIT0gMCkKKwkJbmRldi0+ZGV2X2FkZHJbMF0gPSAobmRldi0+ZGV2X2FkZHJbMF0gXiAoMSA8PCBmd192aWZfaWR4KSkgfAorCQkJCSAgICAgMHgyOworCisJaW5pdF9uZXRkZXYobmRldik7CisKKwlhdGg2a2xfaW5pdF9jb250cm9sX2luZm8odmlmKTsKKworCS8qIFRPRE86IFBhc3MgaW50ZXJmYWNlIHNwZWNpZmljIHBvaW50ZXIgaW5zdGVhZCBvZiBhciAqLworCWlmIChhdGg2a2xfaW5pdF9pZl9kYXRhKHZpZikpCisJCWdvdG8gZXJyOworCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShuZGV2KSkKKwkJZ290byBlcnI7CisKKwlhci0+YXZhaWxfaWR4X21hcCAmPSB+QklUKGZ3X3ZpZl9pZHgpOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKKwlzZXRfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOworCWFyLT53bGFuX3B3cl9zdGF0ZSA9IFdMQU5fUE9XRVJfU1RBVEVfT047CisJc2V0X2JpdChORVRERVZfUkVHSVNURVJFRCwgJnZpZi0+ZmxhZ3MpOworCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCWFyLT5pYnNzX2lmX2FjdGl2ZSA9IHRydWU7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnZpZi0+bGlzdCwgJmFyLT52aWZfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIG5kZXY7CisKK2VycjoKKwlhZ2dyX21vZHVsZV9kZXN0cm95KHZpZi0+YWdncl9jbnR4dCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYXRoNmtsX2RlaW5pdF9pZWVlODAyMTFfaHcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCXdpcGh5X2ZyZWUoYXItPndpcGh5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaAppbmRleCBhODRhZGMyLi44MWYyMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5oCkBAIC0xNywyMyArMTcsNDMgQEAKICNpZm5kZWYgQVRINktMX0NGRzgwMjExX0gKICNkZWZpbmUgQVRINktMX0NGRzgwMjExX0gKIAotc3RydWN0IHdpcmVsZXNzX2RldiAqYXRoNmtsX2NmZzgwMjExX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2RlaW5pdChzdHJ1Y3QgYXRoNmtsICphcik7CitlbnVtIGF0aDZrbF9jZmdfc3VzcGVuZF9tb2RlIHsKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfREVFUFNMRUVQLAorCUFUSDZLTF9DRkdfU1VTUEVORF9DVVRQT1dFUiwKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XLAorCUFUSDZLTF9DRkdfU1VTUEVORF9TQ0hFRF9TQ0FOLAorfTsKIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgaW50IHN0YXR1cyk7CitzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2ludGVyZmFjZV9hZGQoc3RydWN0IGF0aDZrbCAqYXIsIGNoYXIgKm5hbWUsCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkJdTggZndfdmlmX2lkeCwgdTggbndfdHlwZSk7CitpbnQgYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhzdHJ1Y3QgYXRoNmtsICphcik7CitzdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBhdGg2a2xfZGVpbml0X2llZWU4MDIxMV9odyhzdHJ1Y3QgYXRoNmtsICphcik7CiAKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBib29sIGFib3J0ZWQpOworCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUxNiBjaGFubmVsLAogCQkJCSAgIHU4ICpic3NpZCwgdTE2IGxpc3Rlbl9pbnR2bCwKIAkJCQkgICB1MTYgYmVhY29uX2ludHZsLAogCQkJCSAgIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCiAJCQkJICAgdTggYmVhY29uX2llX2xlbiwgdTggYXNzb2NfcmVxX2xlbiwKIAkJCQkgICB1OCBhc3NvY19yZXNwX2xlbiwgdTggKmFzc29jX2luZm8pOwogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCQkgICAgICB1OCAqYnNzaWQsIHU4IGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIHU4ICphc3NvY19pbmZvLCB1MTYgcHJvdG9fcmVhc29uKTsKIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsCiAJCQkJICAgICBib29sIGlzbWNhc3QpOwogCitpbnQgYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkgICAgZW51bSBhdGg2a2xfY2ZnX3N1c3BlbmRfbW9kZSBtb2RlLAorCQkJICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdyk7CisKK2ludCBhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwordm9pZCBhdGg2a2xfY2ZnODAyMTFfc3RvcChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKTsKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3N0b3BfYWxsKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwogI2VuZGlmIC8qIEFUSDZLTF9DRkc4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb21tb24uaAppbmRleCBiOTJmMGU1Li5iZmQ2NTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29tbW9uLmgKQEAgLTIzLDggKzIzLDYgQEAKIAogZXh0ZXJuIGludCBhdGg2a2xfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKLSNkZWZpbmUgQV9DQUNIRV9MSU5FX1BBRCAgICAgICAgICAgIDEyOAotCiAvKgogICogUmVmbGVjdHMgdGhlIHZlcnNpb24gb2YgYmluYXJ5IGludGVyZmFjZSBleHBvc2VkIGJ5IEFUSDZLTCB0YXJnZXQKICAqIGZpcm13YXJlLiBOZWVkcyB0byBiZSBpbmNyZW1lbnRlZCBieSAxIGZvciBhbnkgY2hhbmdlIGluIHRoZSBmaXJtd2FyZQpAQCAtNzMsMjUgKzcxLDE2IEBACiAJV0VQX0NSWVBUICAgICAgICAgICA9IDB4MDIsCiAJVEtJUF9DUllQVCAgICAgICAgICA9IDB4MDQsCiAJQUVTX0NSWVBUICAgICAgICAgICA9IDB4MDgsCisJV0FQSV9DUllQVCAgICAgICAgICA9IDB4MTAsCiB9OwogCiBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0Owogc3RydWN0IGF0aDZrbDsKIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbjsKLXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm87CitzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbzsKIAotaW50IGF0aDZrX3NldHVwX2NyZWRpdF9kaXN0KHZvaWQgKmh0Y19oYW5kbGUsCi0JCQkgICAgc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwZGlzdF9saXN0LAotCQkJICAgICBlbnVtIGh0Y19jcmVkaXRfZGlzdF9yZWFzb24gcmVhc29uKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2luaXQoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9saXN0LAotCQkgICAgICAgaW50IHRvdF9jcmVkaXRzKTsKLXZvaWQgYXRoNmtfc2Vla19jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mLAotCQkJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCk7CiBzdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpzZGV2KTsKIGludCBhdGg2a2xfY29yZV9pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLWludCBhdGg2a2xfdW5hdmFpbF9ldihzdHJ1Y3QgYXRoNmtsICphcik7Cit2b2lkIGF0aDZrbF9jb3JlX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwogc3RydWN0IHNrX2J1ZmYgKmF0aDZrbF9idWZfYWxsb2MoaW50IHNpemUpOwogI2VuZGlmIC8qIENPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCmluZGV4IDZkOGE0ODQuLmM4NjNhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCkBAIC03MCwxMCArNzAsMjAgQEAKIAlBVEg2S0xfRldfSUVfUkVTRVJWRURfUkFNX1NJWkUgPSA1LAogCUFUSDZLTF9GV19JRV9DQVBBQklMSVRJRVMgPSA2LAogCUFUSDZLTF9GV19JRV9QQVRDSF9BRERSID0gNywKKwlBVEg2S0xfRldfSUVfQk9BUkRfQUREUiA9IDgsCisJQVRINktMX0ZXX0lFX1ZJRl9NQVggPSA5LAogfTsKIAogZW51bSBhdGg2a2xfZndfY2FwYWJpbGl0eSB7CiAJQVRINktMX0ZXX0NBUEFCSUxJVFlfSE9TVF9QMlAgPSAwLAorCUFUSDZLTF9GV19DQVBBQklMSVRZX1NDSEVEX1NDQU4gPSAxLAorCisJLyoKKwkgKiBGaXJtd2FyZSBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgUDJQIG1nbXQgb3BlcmF0aW9ucyBvbiBhCisJICogc3RhdGlvbiBpbnRlcmZhY2UuIEFmdGVyIGdyb3VwIGZvcm1hdGlvbiwgdGhlIHN0YXRpb24KKwkgKiBpbnRlcmZhY2Ugd2lsbCBiZWNvbWUgYSBQMlAgY2xpZW50L0dPIGludGVyZmFjZSBhcyB0aGUgY2FzZSBtYXkgYmUKKwkgKi8KKwlBVEg2S0xfRldfQ0FQQUJJTElUWV9TVEFfUDJQREVWX0RVUExFWCwKIAogCS8qIHRoaXMgbmVlZHMgdG8gYmUgbGFzdCAqLwogCUFUSDZLTF9GV19DQVBBQklMSVRZX01BWCwKQEAgLTg4LDM3ICs5OCw0NyBAQAogfTsKIAogLyogQVI2MDAzIDEuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDNfUkVWMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwMmJhCisjZGVmaW5lIEFSNjAwM19IV18xXzBfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgzMDAwMDJiYQogCiAvKiBBUjYwMDMgMi4wIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEFSNjAwM19SRVYyX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MzAwMDAzODQKLSNkZWZpbmUgQVI2MDAzX1JFVjJfUEFUQ0hfRE9XTkxPQURfQUREUkVTUyAgMHg1N2U5MTAKLSNkZWZpbmUgQVI2MDAzX1JFVjJfT1RQX0ZJTEUgICAgICAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMC9vdHAuYmluLno3NyIKLSNkZWZpbmUgQVI2MDAzX1JFVjJfRklSTVdBUkVfRklMRSAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMC9hdGh3bGFuLmJpbi56NzciCi0jZGVmaW5lIEFSNjAwM19SRVYyX1RDTURfRklSTVdBUkVfRklMRSAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjAvYXRodGNtZF9yYW0uYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9QQVRDSF9GSUxFICAgICAgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2RhdGEucGF0Y2guYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2Z3LTIuYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9CT0FSRF9EQVRBX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2JkYXRhLmJpbiIKLSNkZWZpbmUgQVI2MDAzX1JFVjJfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5TRDMxLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwMzg0CisjZGVmaW5lIEFSNjAwM19IV18yXzBfUEFUQ0hfRE9XTkxPQURfQUREUkVTUyAgMHg1N2U5MTAKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9PVFBfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4wL290cC5iaW4uejc3IgorI2RlZmluZSBBUjYwMDNfSFdfMl8wX0ZJUk1XQVJFX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9hdGh3bGFuLmJpbi56NzciCisjZGVmaW5lIEFSNjAwM19IV18yXzBfVENNRF9GSVJNV0FSRV9GSUxFICJhdGg2ay9BUjYwMDMvaHcyLjAvYXRodGNtZF9yYW0uYmluIgorI2RlZmluZSBBUjYwMDNfSFdfMl8wX1BBVENIX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9kYXRhLnBhdGNoLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9GSVJNV0FSRV8yX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9mdy0yLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzBfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUgXAorCQkJImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5TRDMxLmJpbiIKIAogLyogQVI2MDAzIDMuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDNfUkVWM19WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNTgyCi0jZGVmaW5lIEFSNjAwM19SRVYzX09UUF9GSUxFICAgICAgICAgICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9vdHAuYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19GSVJNV0FSRV9GSUxFICAgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYXRod2xhbi5iaW4iCi0jZGVmaW5lIEFSNjAwM19SRVYzX1RDTURfRklSTVdBUkVfRklMRSAgICAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYXRodGNtZF9yYW0uYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19QQVRDSF9GSUxFICAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMS4xL2RhdGEucGF0Y2guYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9mdy0yLmJpbiIKLSNkZWZpbmUgQVI2MDAzX1JFVjNfQk9BUkRfREFUQV9GSUxFICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9iZGF0YS5iaW4iCi0jZGVmaW5lIEFSNjAwM19SRVYzX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFCVwKLQkiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYmRhdGEuU0QzMS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNTgyCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9PVFBfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvb3RwLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMS4xL2F0aHdsYW4uYmluIgorI2RlZmluZSBBUjYwMDNfSFdfMl8xXzFfVENNRF9GSVJNV0FSRV9GSUxFIFwKKwkJCSJhdGg2ay9BUjYwMDMvaHcyLjEuMS9hdGh0Y21kX3JhbS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9QQVRDSF9GSUxFICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9kYXRhLnBhdGNoLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFXzJfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvZnctMi5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMS4xL2JkYXRhLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFCVwKKwkJCSJhdGg2ay9BUjYwMDMvaHcyLjEuMS9iZGF0YS5TRDMxLmJpbiIKIAogLyogQVI2MDA0IDEuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDRfUkVWMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNjIzCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0ZJUk1XQVJFX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDQvaHc2LjEvZncucmFtLmJpbiIKLSNkZWZpbmUgQVI2MDA0X1JFVjFfRklSTVdBUkVfMl9GSUxFICAgICAgICAgImF0aDZrL0FSNjAwNC9odzYuMS9mdy0yLmJpbiIKLSNkZWZpbmUgQVI2MDA0X1JFVjFfQk9BUkRfREFUQV9GSUxFICAgICAgICAgImF0aDZrL0FSNjAwNC9odzYuMS9iZGF0YS5iaW4iCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFICJhdGg2ay9BUjYwMDQvaHc2LjEvYmRhdGEuREIxMzIuYmluIgotI2RlZmluZSBBUjYwMDRfUkVWMV9FUFBJTkdfRklSTVdBUkVfRklMRSAiYXRoNmsvQVI2MDA0L2h3Ni4xL2VuZHBvaW50cGluZy5iaW4iCisjZGVmaW5lIEFSNjAwNF9IV18xXzBfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgzMDAwMDYyMworI2RlZmluZSBBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFXzJfRklMRSAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjAvZnctMi5iaW4iCisjZGVmaW5lIEFSNjAwNF9IV18xXzBfRklSTVdBUkVfRklMRSAgICAgICAgICAgImF0aDZrL0FSNjAwNC9odzEuMC9mdy5yYW0uYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8wX0JPQVJEX0RBVEFfRklMRSAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjAvYmRhdGEuYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFIFwKKwkiYXRoNmsvQVI2MDA0L2h3MS4wL2JkYXRhLkRCMTMyLmJpbiIKKworLyogQVI2MDA0IDEuMSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBBUjYwMDRfSFdfMV8xX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MzAwMDAwMDEKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDA0L2h3MS4xL2Z3LTIuYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8xX0ZJUk1XQVJFX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjEvZncucmFtLmJpbiIKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9CT0FSRF9EQVRBX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDA0L2h3MS4xL2JkYXRhLmJpbiIKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSBcCisJImF0aDZrL0FSNjAwNC9odzEuMS9iZGF0YS5EQjEzMi5iaW4iCiAKIC8qIFBlciBTVEEgZGF0YSwgdXNlZCBpbiBBUCBtb2RlICovCiAjZGVmaW5lIFNUQV9QU19BV0FLRQkJQklUKDApCkBAIC0xNjYsNiArMTg2LDcgQEAKICNkZWZpbmUgQVRINktMX0NPTkZfSUdOT1JFX1BTX0ZBSUxfRVZUX0lOX1NDQU4gIEJJVCgxKQogI2RlZmluZSBBVEg2S0xfQ09ORl9FTkFCTEVfMTFOCQkJQklUKDIpCiAjZGVmaW5lIEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVAkJQklUKDMpCisjZGVmaW5lIEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVIJCUJJVCg0KQogCiBlbnVtIHdsYW5fbG93X3B3cl9zdGF0ZSB7CiAJV0xBTl9QT1dFUl9TVEFURV9PTiwKQEAgLTI3MSw2ICsyOTIsOCBAQAogCXUzMiBjbWRfY3JlZGl0czsKIAlib29sIGRvbmVfc2VudDsKIAl1OCAqY21kX2J1ZjsKKwl1MzIgbWF4X2RhdGFfc2l6ZTsKKwl1MzIgbWF4X2NtZF9zaXplOwogfTsKIAogc3RydWN0IHRhcmdldF9zdGF0cyB7CkBAIC0zODAsNDAgKzQwMyw0MiBAQAogCXU4IGtleV9sZW47CiB9OwogCi0vKiBGbGFnIGluZm8gKi8KLSNkZWZpbmUgV01JX0VOQUJMRUQJMAotI2RlZmluZSBXTUlfUkVBRFkJMQotI2RlZmluZSBDT05ORUNURUQJMgotI2RlZmluZSBTVEFUU19VUERBVEVfUEVORCAzCi0jZGVmaW5lIENPTk5FQ1RfUEVORAkgIDQKLSNkZWZpbmUgV01NX0VOQUJMRUQJICA1Ci0jZGVmaW5lIE5FVFFfU1RPUFBFRAkgIDYKLSNkZWZpbmUgV01JX0NUUkxfRVBfRlVMTCAgNwotI2RlZmluZSBEVElNX0VYUElSRUQJICA4Ci0jZGVmaW5lIERFU1RST1lfSU5fUFJPR1JFU1MgIDkKLSNkZWZpbmUgTkVUREVWX1JFR0lTVEVSRUQgICAgMTAKLSNkZWZpbmUgU0tJUF9TQ0FOCSAgICAgMTEKLSNkZWZpbmUgV0xBTl9FTkFCTEVECSAgICAgMTIKLSNkZWZpbmUgVEVTVE1PREUJICAgICAxMwotI2RlZmluZSBDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OIDE0Ci0jZGVmaW5lIERUSU1fUEVSSU9EX0FWQUlMICAgIDE1CitlbnVtIGF0aDZrbF9oaWZfdHlwZSB7CisJQVRINktMX0hJRl9UWVBFX1NESU8sCisJQVRINktMX0hJRl9UWVBFX1VTQiwKK307CiAKLXN0cnVjdCBhdGg2a2wgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlzdHJ1Y3QgYXRoNmtsX2JtaSBibWk7Ci0JY29uc3Qgc3RydWN0IGF0aDZrbF9oaWZfb3BzICpoaWZfb3BzOwotCXN0cnVjdCB3bWkgKndtaTsKLQlpbnQgdHhfcGVuZGluZ1tFTkRQT0lOVF9NQVhdOwotCWludCB0b3RhbF90eF9kYXRhX3BlbmQ7Ci0Jc3RydWN0IGh0Y190YXJnZXQgKmh0Y190YXJnZXQ7Ci0Jdm9pZCAqaGlmX3ByaXY7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworLyoKKyAqIERyaXZlcidzIG1heGltdW0gbGltaXQsIG5vdGUgdGhhdCBzb21lIGZpcm13YXJlcyBzdXBwb3J0IG9ubHkgb25lIHZpZgorICogYW5kIHRoZSBydW50aW1lIChjdXJyZW50KSBsaW1pdCBtdXN0IGJlIGNoZWNrZWQgZnJvbSBhci0+dmlmX21heC4KKyAqLworI2RlZmluZSBBVEg2S0xfVklGX01BWAkzCisKKy8qIHZpZiBmbGFncyBpbmZvICovCitlbnVtIGF0aDZrbF92aWZfc3RhdGUgeworCUNPTk5FQ1RFRCwKKwlDT05ORUNUX1BFTkQsCisJV01NX0VOQUJMRUQsCisJTkVUUV9TVE9QUEVELAorCURUSU1fRVhQSVJFRCwKKwlORVRERVZfUkVHSVNURVJFRCwKKwlDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLAorCURUSU1fUEVSSU9EX0FWQUlMLAorCVdMQU5fRU5BQkxFRCwKKwlTVEFUU19VUERBVEVfUEVORCwKK307CisKK3N0cnVjdCBhdGg2a2xfdmlmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHdpcmVsZXNzX2RldiB3ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBhdGg2a2wgKmFyOworCS8qIExvY2sgdG8gcHJvdGVjdCB2aWYgc3BlY2lmaWMgbmV0X3N0YXRzIGFuZCBmbGFncyAqLworCXNwaW5sb2NrX3QgaWZfbG9jazsKKwl1OCBmd192aWZfaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNzaWRfbGVuOwogCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07Ci0JdTggbmV4dF9tb2RlOwotCXU4IG53X3R5cGU7CiAJdTggZG90MTFfYXV0aF9tb2RlOwogCXU4IGF1dGhfbW9kZTsKIAl1OCBwcndpc2VfY3J5cHRvOwpAQCAtNDIxLDIxICs0NDYsOTEgQEAKIAl1OCBncnBfY3J5cHRvOwogCXU4IGdycF9jcnlwdG9fbGVuOwogCXU4IGRlZl90eGtleV9pbmRleDsKLQlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJdTggbmV4dF9tb2RlOworCXU4IG53X3R5cGU7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHJlcV9ic3NpZFtFVEhfQUxFTl07CiAJdTE2IGNoX2hpbnQ7CiAJdTE2IGJzc19jaDsKKwlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJc3RydWN0IGF0aDZrbF9rZXkga2V5c1tXTUlfTUFYX0tFWV9JTkRFWCArIDFdOworCXN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfY250eHQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNjb25uZWN0X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHNjaGVkX3NjYW5fdGltZXI7CisKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcTsKKwllbnVtIHNtZV9zdGF0ZSBzbWVfc3RhdGU7CisJaW50IHJlY29ubmVjdF9mbGFnOworCXUzMiBsYXN0X3JvY19pZDsKKwl1MzIgbGFzdF9jYW5jZWxfcm9jX2lkOworCXUzMiBzZW5kX2FjdGlvbl9pZDsKKwlib29sIHByb2JlX3JlcV9yZXBvcnQ7CisJdTE2IG5leHRfY2hhbjsKKwl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7CisJdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3QgdGFyZ2V0X3N0YXRzIHRhcmdldF9zdGF0czsKK307CisKKyNkZWZpbmUgV09XX0xJU1RfSUQJCTAKKyNkZWZpbmUgV09XX0hPU1RfUkVRX0RFTEFZCTUwMCAvKiBtcyAqLworCisjZGVmaW5lIEFUSDZLTF9TQ0hFRF9TQ0FOX1JFU1VMVF9ERUxBWSA1MDAwIC8qIG1zICovCisKKy8qIEZsYWcgaW5mbyAqLworZW51bSBhdGg2a2xfZGV2X3N0YXRlIHsKKwlXTUlfRU5BQkxFRCwKKwlXTUlfUkVBRFksCisJV01JX0NUUkxfRVBfRlVMTCwKKwlURVNUTU9ERSwKKwlERVNUUk9ZX0lOX1BST0dSRVNTLAorCVNLSVBfU0NBTiwKKwlST0FNX1RCTF9QRU5ELAorCUZJUlNUX0JPT1QsCit9OworCitlbnVtIGF0aDZrbF9zdGF0ZSB7CisJQVRINktMX1NUQVRFX09GRiwKKwlBVEg2S0xfU1RBVEVfT04sCisJQVRINktMX1NUQVRFX0RFRVBTTEVFUCwKKwlBVEg2S0xfU1RBVEVfQ1VUUE9XRVIsCisJQVRINktMX1NUQVRFX1dPVywKKwlBVEg2S0xfU1RBVEVfU0NIRURfU0NBTiwKK307CisKK3N0cnVjdCBhdGg2a2wgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCisJZW51bSBhdGg2a2xfc3RhdGUgc3RhdGU7CisKKwlzdHJ1Y3QgYXRoNmtsX2JtaSBibWk7CisJY29uc3Qgc3RydWN0IGF0aDZrbF9oaWZfb3BzICpoaWZfb3BzOworCXN0cnVjdCB3bWkgKndtaTsKKwlpbnQgdHhfcGVuZGluZ1tFTkRQT0lOVF9NQVhdOworCWludCB0b3RhbF90eF9kYXRhX3BlbmQ7CisJc3RydWN0IGh0Y190YXJnZXQgKmh0Y190YXJnZXQ7CisJZW51bSBhdGg2a2xfaGlmX3R5cGUgaGlmX3R5cGU7CisJdm9pZCAqaGlmX3ByaXY7CisJc3RydWN0IGxpc3RfaGVhZCB2aWZfbGlzdDsKKwkvKiBMb2NrIHRvIGF2b2lkIHJhY2UgaW4gdmlmX2xpc3QgZW50cmllcyBhbW9uZyBhZGQvZGVsL3RyYXZlcnNlICovCisJc3BpbmxvY2tfdCBsaXN0X2xvY2s7CisJdTggbnVtX3ZpZjsKKwl1bnNpZ25lZCBpbnQgdmlmX21heDsKKwl1OCBtYXhfbm9ybV9pZmFjZTsKKwl1OCBhdmFpbF9pZHhfbWFwOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIAl1MTYgbGlzdGVuX2ludHZsX2I7CiAJdTE2IGxpc3Rlbl9pbnR2bF90OwogCXU4IGxyc3NpX3JvYW1fdGhyZXNob2xkOwogCXN0cnVjdCBhdGg2a2xfdmVyc2lvbiB2ZXJzaW9uOwogCXUzMiB0YXJnZXRfdHlwZTsKIAl1OCB0eF9wd3I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgdGFyZ2V0X3N0YXRzOwogCXN0cnVjdCBhdGg2a2xfbm9kZV9tYXBwaW5nIG5vZGVfbWFwW01BWF9OT0RFX05VTV07CiAJdTggaWJzc19wc19lbmFibGU7CisJYm9vbCBpYnNzX2lmX2FjdGl2ZTsKIAl1OCBub2RlX251bTsKIAl1OCBuZXh0X2VwX2lkOwogCXN0cnVjdCBhdGg2a2xfY29va2llICpjb29raWVfbGlzdDsKQEAgLTQ0Niw3ICs1NDEsNyBAQAogCXU4IGhpYWNfc3RyZWFtX2FjdGl2ZV9wcmk7CiAJdTggZXAyYWNfbWFwW0VORFBPSU5UX01BWF07CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgY3RybF9lcDsKLQlzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvIGNyZWRpdF9zdGF0ZV9pbmZvOworCXN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvIGNyZWRpdF9zdGF0ZV9pbmZvOwogCXUzMiBjb25uZWN0X2N0cmxfZmxhZ3M7CiAJdTMyIHVzZXJfa2V5X2N0cmw7CiAJdTggdXNyX2Jzc19maWx0ZXI7CkBAIC00NTYsMzAgKzU1MSwzNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgbWNhc3Rwc3E7CiAJc3BpbmxvY2tfdCBtY2FzdHBzcV9sb2NrOwogCXU4IGludHJhX2JzczsKLQlzdHJ1Y3QgYWdncl9pbmZvICphZ2dyX2NudHh0OwogCXN0cnVjdCB3bWlfYXBfbW9kZV9zdGF0IGFwX3N0YXRzOwogCXU4IGFwX2NvdW50cnlfY29kZVszXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFtc2R1X3J4X2J1ZmZlcl9xdWV1ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNjb25uZWN0X3RpbWVyOwogCXU4IHJ4X21ldGFfdmVyOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7Ci0Jc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXE7Ci0Jc3RydWN0IGF0aDZrbF9rZXkga2V5c1tXTUlfTUFYX0tFWV9JTkRFWCArIDFdOwotCWVudW0gc21lX3N0YXRlIHNtZV9zdGF0ZTsKIAllbnVtIHdsYW5fbG93X3B3cl9zdGF0ZSB3bGFuX3B3cl9zdGF0ZTsKLQlzdHJ1Y3Qgd21pX3NjYW5fcGFyYW1zX2NtZCBzY19wYXJhbXM7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogI2RlZmluZSBBUl9NQ0FTVF9GSUxURVJfTUFDX0FERFJfU0laRSAgNAogCXN0cnVjdCB7CiAJCXZvaWQgKnJ4X3JlcG9ydDsKIAkJc2l6ZV90IHJ4X3JlcG9ydF9sZW47CiAJfSB0bTsKIAotCXN0cnVjdCB7CisJc3RydWN0IGF0aDZrbF9odyB7CisJCXUzMiBpZDsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJdTMyIGRhdGFzZXRfcGF0Y2hfYWRkcjsKIAkJdTMyIGFwcF9sb2FkX2FkZHI7CiAJCXUzMiBhcHBfc3RhcnRfb3ZlcnJpZGVfYWRkcjsKIAkJdTMyIGJvYXJkX2V4dF9kYXRhX2FkZHI7CiAJCXUzMiByZXNlcnZlZF9yYW1fc2l6ZTsKKwkJdTMyIGJvYXJkX2FkZHI7CisJCXUzMiByZWZjbGtfaHo7CisJCXUzMiB1YXJ0dHhfcGluOworCisJCWNvbnN0IGNoYXIgKmZ3X290cDsKKwkJY29uc3QgY2hhciAqZnc7CisJCWNvbnN0IGNoYXIgKmZ3X3RjbWQ7CisJCWNvbnN0IGNoYXIgKmZ3X3BhdGNoOworCQljb25zdCBjaGFyICpmd19hcGkyOworCQljb25zdCBjaGFyICpmd19ib2FyZDsKKwkJY29uc3QgY2hhciAqZndfZGVmYXVsdF9ib2FyZDsKIAl9IGh3OwogCiAJdTE2IGNvbmZfZmxhZ3M7CkBAIC00ODcsNyArNTg5LDYgQEAKIAlzdHJ1Y3QgYXRoNmtsX21ib3hfaW5mbyBtYm94X2luZm87CiAKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSBjb29raWVfbWVtW01BWF9DT09LSUVfTlVNXTsKLQlpbnQgcmVjb25uZWN0X2ZsYWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJdTggKmZ3X2JvYXJkOwpAQCAtNTA4LDEzICs2MDksNyBAQAogCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19waHk7CiAKLQl1MzIgc2VuZF9hY3Rpb25faWQ7Ci0JYm9vbCBwcm9iZV9yZXFfcmVwb3J0OwotCXUxNiBuZXh0X2NoYW47Ci0KIAlib29sIHAycDsKLQl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7Ci0JdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOwogCiAjaWZkZWYgQ09ORklHX0FUSDZLTF9ERUJVRwogCXN0cnVjdCB7CkBAIC01MjksMjMgKzYyNCwxOSBAQAogCQlzdHJ1Y3QgewogCQkJdW5zaWduZWQgaW50IGludmFsaWRfcmF0ZTsKIAkJfSB3YXJfc3RhdHM7CisKKwkJdTggKnJvYW1fdGJsOworCQl1bnNpZ25lZCBpbnQgcm9hbV90YmxfbGVuOworCisJCXU4IGtlZXBhbGl2ZTsKKwkJdTggZGlzY190aW1lb3V0OwogCX0gZGVidWc7CiAjZW5kaWYgLyogQ09ORklHX0FUSDZLTF9ERUJVRyAqLwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkICphdGg2a2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRoNmtsICphdGg2a2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9kZXBvc2l0X2NyZWRpdF90b19lcChzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvCi0JCQkJCSAgICAgICAqY3JlZF9pbmZvLAotCQkJCQkgICAgICAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdAotCQkJCQkgICAgICAgKmVwX2Rpc3QsIGludCBjcmVkaXRzKQotewotCWVwX2Rpc3QtPmNyZWRpdHMgKz0gY3JlZGl0czsKLQllcF9kaXN0LT5jcmVkX2Fzc25nZCArPSBjcmVkaXRzOwotCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyAtPSBjcmVkaXRzOworCXJldHVybiAoKHN0cnVjdCBhdGg2a2xfdmlmICopIG5ldGRldl9wcml2KGRldikpLT5hcjsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoc3RydWN0IGF0aDZrbCAqYXIsCkBAIC01NjEsNyArNjUyLDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotdm9pZCBhdGg2a2xfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdW5yZWdpc3Rlcik7CiBpbnQgYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoc3RydWN0IGF0aDZrbCAqYXIpOwogdm9pZCBhdGg2a2xfZGV0ZWN0X2Vycm9yKHVuc2lnbmVkIGxvbmcgcHRyKTsKIHZvaWQgZGlzY29ubmVjdF90aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcHRyKTsKQEAgLTU3OSwxMCArNjY5LDggQEAKIGludCBhdGg2a2xfZGlhZ19yZWFkMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCB1MzIgKnZhbHVlKTsKIGludCBhdGg2a2xfZGlhZ19yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCk7CiBpbnQgYXRoNmtsX3JlYWRfZndsb2dzKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwogdm9pZCBhdGg2a2xfdHhfZGF0YV9jbGVhbnVwKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX3N0b3BfZW5kcG9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBrZWVwX3Byb2ZpbGUsCi0JCQkgIGJvb2wgZ2V0X2RiZ2xvZ3MpOwogCiBzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqYXRoNmtsX2FsbG9jX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9mcmVlX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphciwgc3RydWN0IGF0aDZrbF9jb29raWUgKmNvb2tpZSk7CkBAIC01OTgsNDAgKzY4Niw0OSBAQAogdm9pZCBhZ2dyX21vZHVsZV9kZXN0cm95KHN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfaW5mbyk7CiB2b2lkIGFnZ3JfcmVzZXRfc3RhdGUoc3RydWN0IGFnZ3JfaW5mbyAqYWdncl9pbmZvKTsKIAotc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsICphciwgdTggKiBub2RlX2FkZHIpOworc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqIG5vZGVfYWRkcik7CiBzdHJ1Y3QgYXRoNmtsX3N0YSAqYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChzdHJ1Y3QgYXRoNmtsICphciwgdTggYWlkKTsKIAogdm9pZCBhdGg2a2xfcmVhZHlfZXZlbnQodm9pZCAqZGV2dCwgdTggKiBkYXRhcCwgdTMyIHN3X3ZlciwgdTMyIGFiaV92ZXIpOwogaW50IGF0aDZrbF9jb250cm9sX3R4KHZvaWQgKmRldnQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVpZCk7Ci12b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkgIHU4ICpic3NpZCwgdTE2IGxpc3Rlbl9pbnQsCiAJCQkgIHUxNiBiZWFjb25faW50LCBlbnVtIG5ldHdvcmtfdHlwZSBuZXRfdHlwZSwKIAkJCSAgdTggYmVhY29uX2llX2xlbiwgdTggYXNzb2NfcmVxX2xlbiwKIAkJCSAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBhaWQsIHU4ICptYWNfYWRkciwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwpOwordm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgYWlkLCB1OCAqbWFjX2FkZHIsCiAJCQkJdTgga2V5bWdtdCwgdTggdWNpcGhlciwgdTggYXV0aCwKIAkJCQl1OCBhc3NvY19yZXFfbGVuLCB1OCAqYXNzb2NfaW5mbyk7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCSAgICAgdTggKmJzc2lkLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCSAgICAgdTggKmFzc29jX2luZm8sIHUxNiBwcm90X3JlYXNvbl9zdGF0dXMpOwotdm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLCBib29sIGlzbWNhc3QpOwordm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCk7CiB2b2lkIGF0aDZrbF90eHB3cl9yeF9ldnQodm9pZCAqZGV2dCwgdTggdHhfcHdyKTsKLXZvaWQgYXRoNmtsX3NjYW5fY29tcGxldGVfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgc3RhdHVzKTsKLXZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggKnB0ciwgdTMyIGxlbik7Cit2b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgc3RhdHVzKTsKK3ZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqcHRyLCB1MzIgbGVuKTsKIHZvaWQgYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHZvaWQgKmRldnQsIHU4IHRyYWZmaWNfY2xhc3MsIGJvb2wgYWN0aXZlKTsKIGVudW0gaHRjX2VuZHBvaW50X2lkIGF0aDZrbF9hYzJfZW5kcG9pbnRfaWQodm9pZCAqZGV2dCwgdTggYWMpOwogCi12b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGFpZCk7Cit2b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggYWlkKTsKIAotdm9pZCBhdGg2a2xfZHRpbWV4cGlyeV9ldmVudChzdHJ1Y3QgYXRoNmtsICphcik7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpZCk7Ci12b2lkIGFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCB0aWQsIHUxNiBzZXFfbm8sCit2b2lkIGF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGlzY29ubmVjdChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKTsKK3ZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkKTsKK3ZvaWQgYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkLCB1MTYgc2VxX25vLAogCQkJICAgICB1OCB3aW5fc3opOwogdm9pZCBhdGg2a2xfd2FrZXVwX2V2ZW50KHZvaWQgKmRldik7Ci12b2lkIGF0aDZrbF90YXJnZXRfZmFpbHVyZShzdHJ1Y3QgYXRoNmtsICphcik7CisKK3ZvaWQgYXRoNmtsX3Jlc2V0X2RldmljZShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHRhcmdldF90eXBlLAorCQkJIGJvb2wgd2FpdF9mb3RfY29tcGx0biwgYm9vbCBjb2xkX3Jlc2V0KTsKK3ZvaWQgYXRoNmtsX2luaXRfY29udHJvbF9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGVpbml0X2lmX2RhdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZik7Cit2b2lkIGF0aDZrbF9jb3JlX2ZyZWUoc3RydWN0IGF0aDZrbCAqYXIpOworc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF92aWZfZmlyc3Qoc3RydWN0IGF0aDZrbCAqYXIpOwordm9pZCBhdGg2a2xfY2xlYW51cF92aWYoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCB3bWlfcmVhZHkpOworaW50IGF0aDZrbF9pbml0X2h3X3N0YXJ0KHN0cnVjdCBhdGg2a2wgKmFyKTsKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoc3RydWN0IGF0aDZrbCAqYXIpOwogCiAjZW5kaWYgLyogQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMKaW5kZXggYmEzZjIzZC4uZWI4MDhiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInRhcmdldC5oIgpAQCAtMTQyLDQ5ICsxNDMsNDggQEAKIAogc3RhdGljIHZvaWQgZHVtcF9jcmVkX2Rpc3Qoc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCkKIHsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCiAJCSAgICItLS0gZW5kcG9pbnQ6ICVkICBzdmNfaWQ6IDB4JVggLS0tXG4iLAogCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgZXBfZGlzdC0+c3ZjX2lkKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKIAkJICAgZXBfZGlzdC0+ZGlzdF9mbGFncyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX25vcm0gICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9ub3JtICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9ub3JtKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfbWluICAgICAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX21pbiAgICAgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX21pbik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkaXRzICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZGl0cyAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZGl0cyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX2Fzc25nZCAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9hc3NuZ2QgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9hc3NuZ2QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgc2Vla19jcmVkICAgICAgOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHNlZWtfY3JlZCAgICAgIDogJWRcbiIsCiAJCSAgIGVwX2Rpc3QtPnNlZWtfY3JlZCk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3N6ICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9zeiAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9zeik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3Blcl9tc2cgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9wZXJfbXNnICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfdG9fZGlzdCAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX3RvX2Rpc3QgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX3RvX2Rpc3QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgdHhxX2RlcHRoICAgICAgOiAlZFxuIiwKLQkJICAgZ2V0X3F1ZXVlX2RlcHRoKCYoKHN0cnVjdCBodGNfZW5kcG9pbnQgKikKLQkJCQkgICAgIGVwX2Rpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHR4cV9kZXB0aCAgICAgIDogJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZXBfZGlzdC0+aHRjX2VwLT50eHEpKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAogCQkgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKKy8qIEZJWE1FOiBtb3ZlIHRvIGh0Yy5jICovCiB2b2lkIGR1bXBfY3JlZF9kaXN0X3N0YXRzKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfbGlzdDsKIAotCWlmICghQVJfREJHX0xWTF9DSEVDSyhBVEg2S0xfREJHX1RSQykpCisJaWYgKCFBUl9EQkdfTFZMX0NIRUNLKEFUSDZLTF9EQkdfQ1JFRElUKSkKIAkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlcF9saXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkKIAkJZHVtcF9jcmVkX2Rpc3QoZXBfbGlzdCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjdHh0OiVwIGRpc3Q6JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCBOVUxMKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiY3JlZGl0IGRpc3RyaWJ1dGlvbiwgdG90YWwgOiAlZCwgZnJlZSA6ICVkXG4iLAotCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dC0+dG90YWxfYXZhaWxfY3JlZGl0cywKLQkJICAgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPmN1cl9mcmVlX2NyZWRpdHMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCSAgICJjcmVkaXQgZGlzdHJpYnV0aW9uIHRvdGFsICVkIGZyZWUgJWRcbiIsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPmN1cl9mcmVlX2NyZWRpdHMpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0zOTYsMTMgKzM5NiwyMCBAQAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnRndF9zdGF0cyA9ICZhci0+dGFyZ2V0X3N0YXRzOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJc3RydWN0IHRhcmdldF9zdGF0cyAqdGd0X3N0YXRzOwogCWNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMCwgYnVmX2xlbiA9IDE1MDA7CiAJaW50IGk7CiAJbG9uZyBsZWZ0OwogCXNzaXplX3QgcmV0X2NudDsKIAorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCXRndF9zdGF0cyA9ICZ2aWYtPnRhcmdldF9zdGF0czsKKwogCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDEyLDkgKzQxOSw5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc2V0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlpZiAoYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKGFyLT53bWkpKSB7CisJaWYgKGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChhci0+d21pLCAwKSkgewogCQl1cCgmYXItPnNlbSk7CiAJCWtmcmVlKGJ1Zik7CiAJCXJldHVybiAtRUlPOwpAQCAtNDIyLDcgKzQyOSw3IEBACiAKIAlsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLAogCQkJCQkJIXRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELAotCQkJCQkJJmFyLT5mbGFnKSwgV01JX1RJTUVPVVQpOworCQkJCQkJJnZpZi0+ZmxhZ3MpLCBXTUlfVElNRU9VVCk7CiAKIAl1cCgmYXItPnNlbSk7CiAKQEAgLTU1NCwxMCArNTYxLDEwIEBACiAKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUyNXMlNWRcbiIsCiAJCQkgIlRvdGFsIEF2YWlsIENyZWRpdHM6ICIsCi0JCQkgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPnRvdGFsX2F2YWlsX2NyZWRpdHMpOworCQkJIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTI1cyU1ZFxuIiwKIAkJCSAiRnJlZSBjcmVkaXRzIDoiLAotCQkJIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LT5jdXJfZnJlZV9jcmVkaXRzKTsKKwkJCSB0YXJnZXQtPmNyZWRpdF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzKTsKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAogCQkJICIgRXBpZCAgRmxhZ3MgICAgQ3JlZF9ub3JtICBDcmVkX21pbiAgQ3JlZGl0cyAgQ3JlZF9hc3NuZ2QiCkBAIC01NzYsOCArNTgzLDcgQEAKIAkJcHJpbnRfY3JlZGl0X2luZm8oIiU5ZCIsIGNyZWRfcGVyX21zZyk7CiAJCXByaW50X2NyZWRpdF9pbmZvKCIlMTRkIiwgY3JlZF90b19kaXN0KTsKIAkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMTJkXG4iLAotCQkJCSBnZXRfcXVldWVfZGVwdGgoJigoc3RydWN0IGh0Y19lbmRwb2ludCAqKQotCQkJCQkJIGVwX2xpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7CisJCQkJIGdldF9xdWV1ZV9kZXB0aCgmZXBfbGlzdC0+aHRjX2VwLT50eHEpKTsKIAl9CiAKIAlpZiAobGVuID4gYnVmX2xlbikKQEAgLTU5NSw2ICs2MDEsMTA3IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBwcmludF9lbmRwb2ludF9zdGF0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsIGNoYXIgKmJ1ZiwKKwkJCQkJdW5zaWduZWQgaW50IGJ1Zl9sZW4sIHVuc2lnbmVkIGludCBsZW4sCisJCQkJCWludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cyAqZXBfc3Q7CisJdTMyICpjb3VudGVyOworCisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlczoiLCBuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJZXBfc3QgPSAmdGFyZ2V0LT5lbmRwb2ludFtpXS5lcF9zdDsKKwkJY291bnRlciA9ICgodTMyICopIGVwX3N0KSArIChvZmZzZXQgLyA0KTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIgJXUiLCAqY291bnRlcik7CisJfQorCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9lbmRwb2ludF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0ID0gYXItPmh0Y190YXJnZXQ7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBidWZfbGVuLCBsZW4gPSAwOworCXNzaXplX3QgcmV0X2NudDsKKworCWJ1Zl9sZW4gPSBzaXplb2Yoc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cykgLyBzaXplb2YodTMyKSAqCisJCSgyNSArIEVORFBPSU5UX01BWCAqIDExKTsKKwlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2RlZmluZSBFUFNUQVQobmFtZSkJCQkJCQkJXAorCWxlbiA9IHByaW50X2VuZHBvaW50X3N0YXQodGFyZ2V0LCBidWYsIGJ1Zl9sZW4sIGxlbiwJCVwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBodGNfZW5kcG9pbnRfc3RhdHMsIG5hbWUpLCBcCisJCQkJICAjbmFtZSkKKwlFUFNUQVQoY3JlZF9sb3dfaW5kaWNhdGUpOworCUVQU1RBVCh0eF9pc3N1ZWQpOworCUVQU1RBVCh0eF9wa3RfYnVuZGxlZCk7CisJRVBTVEFUKHR4X2J1bmRsZXMpOworCUVQU1RBVCh0eF9kcm9wcGVkKTsKKwlFUFNUQVQodHhfY3JlZF9ycHQpOworCUVQU1RBVChjcmVkX3JwdF9mcm9tX3J4KTsKKwlFUFNUQVQoY3JlZF9ycHRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfcnB0X2VwMCk7CisJRVBTVEFUKGNyZWRfZnJvbV9yeCk7CisJRVBTVEFUKGNyZWRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfZnJvbV9lcDApOworCUVQU1RBVChjcmVkX2Nvc3VtZCk7CisJRVBTVEFUKGNyZWRfcmV0bmQpOworCUVQU1RBVChyeF9wa3RzKTsKKwlFUFNUQVQocnhfbGthaGRzKTsKKwlFUFNUQVQocnhfYnVuZGwpOworCUVQU1RBVChyeF9idW5kbGVfbGthaGQpOworCUVQU1RBVChyeF9idW5kbGVfZnJvbV9oZHIpOworCUVQU1RBVChyeF9hbGxvY190aHJlc2hfaGl0KTsKKwlFUFNUQVQocnhhbGxvY190aHJlc2hfYnl0ZSk7CisjdW5kZWYgRVBTVEFUCisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCA9IGFyLT5odGNfdGFyZ2V0OworCWludCByZXQsIGk7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X3N0YXRzICplcF9zdDsKKworCXJldCA9IGtzdHJ0b3UzMl9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJCWVwX3N0ID0gJnRhcmdldC0+ZW5kcG9pbnRbaV0uZXBfc3Q7CisJCQltZW1zZXQoZXBfc3QsIDAsIHNpemVvZigqZXBfc3QpKTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19lbmRwb2ludF9zdGF0cyA9IHsKKwkub3BlbiA9IGF0aDZrbF9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXRoNmtsX2dldF9udW1fcmVnKHZvaWQpCiB7CiAJaW50IGk7CkBAIC04NjcsNiArOTc0LDY2MCBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK2ludCBhdGg2a2xfZGVidWdfcm9hbV90YmxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICp0Ymw7CisJdTE2IG51bV9lbnRyaWVzOworCisJaWYgKGxlbiA8IHNpemVvZigqdGJsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YmwgPSAoY29uc3Qgc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKikgYnVmOworCW51bV9lbnRyaWVzID0gbGUxNl90b19jcHUodGJsLT5udW1fZW50cmllcyk7CisJaWYgKHNpemVvZigqdGJsKSArIG51bV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB3bWlfYnNzX3JvYW1faW5mbykgPgorCSAgICBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyLT5kZWJ1Zy5yb2FtX3RibCA9PSBOVUxMIHx8CisJICAgIGFyLT5kZWJ1Zy5yb2FtX3RibF9sZW4gPCAodW5zaWduZWQgaW50KSBsZW4pIHsKKwkJa2ZyZWUoYXItPmRlYnVnLnJvYW1fdGJsKTsKKwkJYXItPmRlYnVnLnJvYW1fdGJsID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoYXItPmRlYnVnLnJvYW1fdGJsLCBidWYsIGxlbik7CisJYXItPmRlYnVnLnJvYW1fdGJsX2xlbiA9IGxlbjsKKworCWlmICh0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpKSB7CisJCWNsZWFyX2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpOworCQl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV90YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwlsb25nIGxlZnQ7CisJc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKnRibDsKKwl1MTYgbnVtX2VudHJpZXMsIGk7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsZW4sIGJ1Zl9sZW47CisJc3NpemVfdCByZXRfY250OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXItPnNlbSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzZXRfYml0KFJPQU1fVEJMX1BFTkQsICZhci0+ZmxhZyk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2dldF9yb2FtX3RibF9jbWQoYXItPndtaSk7CisJaWYgKHJldCkgeworCQl1cCgmYXItPnNlbSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQlhci0+ZXZlbnRfd3EsICF0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpLCBXTUlfVElNRU9VVCk7CisJdXAoJmFyLT5zZW0pOworCisJaWYgKGxlZnQgPD0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGJsID0gKHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICopIGFyLT5kZWJ1Zy5yb2FtX3RibDsKKwludW1fZW50cmllcyA9IGxlMTZfdG9fY3B1KHRibC0+bnVtX2VudHJpZXMpOworCisJYnVmX2xlbiA9IDEwMCArIG51bV9lbnRyaWVzICogMTAwOworCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZW4gPSAwOworCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAorCQkJICJyb2FtX21vZGU9JXVcblxuIgorCQkJICIjIHJvYW1fdXRpbCBic3NpZCByc3NpIHJzc2lkdCBsYXN0X3Jzc2kgdXRpbCBiaWFzXG4iLAorCQkJIGxlMTZfdG9fY3B1KHRibC0+cm9hbV9tb2RlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgd21pX2Jzc19yb2FtX2luZm8gKmluZm8gPSAmdGJsLT5pbmZvW2ldOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJCQkgIiVkICVwTSAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQkgYV9zbGUzMl90b19jcHUoaW5mby0+cm9hbV91dGlsKSwgaW5mby0+YnNzaWQsCisJCQkJIGluZm8tPnJzc2ksIGluZm8tPnJzc2lkdCwgaW5mby0+bGFzdF9yc3NpLAorCQkJCSBpbmZvLT51dGlsLCBpbmZvLT5iaWFzKTsKKwl9CisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldF9jbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV90YWJsZSA9IHsKKwkucmVhZCA9IGF0aDZrbF9yb2FtX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisJY2hhciBidWZbMjBdOworCXNpemVfdCBsZW47CisJdTggYnNzaWRbRVRIX0FMRU5dOworCWludCBpOworCWludCBhZGRyW0VUSF9BTEVOXTsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCisJaWYgKHNzY2FuZihidWYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICZhZGRyWzBdLCAmYWRkclsxXSwgJmFkZHJbMl0sICZhZGRyWzNdLCAmYWRkcls0XSwgJmFkZHJbNV0pCisJICAgICE9IEVUSF9BTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJYnNzaWRbaV0gPSBhZGRyW2ldOworCisJcmV0ID0gYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChhci0+d21pLCBic3NpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19mb3JjZV9yb2FtID0geworCS53cml0ZSA9IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV9tb2RlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzIwXTsKKwlzaXplX3QgbGVuOworCWVudW0gd21pX3JvYW1fbW9kZSBtb2RlOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbiAtIDFdID09ICdcbicpCisJCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RyY2FzZWNtcChidWYsICJkZWZhdWx0IikgPT0gMCkKKwkJbW9kZSA9IFdNSV9ERUZBVUxUX1JPQU1fTU9ERTsKKwllbHNlIGlmIChzdHJjYXNlY21wKGJ1ZiwgImJzc2JpYXMiKSA9PSAwKQorCQltb2RlID0gV01JX0hPU1RfQklBU19ST0FNX01PREU7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChidWYsICJsb2NrIikgPT0gMCkKKwkJbW9kZSA9IFdNSV9MT0NLX0JTU19NT0RFOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKGFyLT53bWksIG1vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV9tb2RlID0geworCS53cml0ZSA9IGF0aDZrbF9yb2FtX21vZGVfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9rZWVwYWxpdmUoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtlZXBhbGl2ZSkKK3sKKwlhci0+ZGVidWcua2VlcGFsaXZlID0ga2VlcGFsaXZlOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfa2VlcGFsaXZlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzE2XTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBhci0+ZGVidWcua2VlcGFsaXZlKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYXRoNmtsX2tlZXBhbGl2ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlyZXQgPSBrc3RydG91OF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfa2VlcGFsaXZlID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9rZWVwYWxpdmVfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfa2VlcGFsaXZlX3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpbWVvdXQpCit7CisJYXItPmRlYnVnLmRpc2NfdGltZW91dCA9IHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxNl07CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldVxuIiwgYXItPmRlYnVnLmRpc2NfdGltZW91dCk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCXJldCA9IGtzdHJ0b3U4X2Zyb21fdXNlcih1c2VyX2J1ZiwgY291bnQsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfZGlzY29ubmVjdF90aW1lb3V0ID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZGlzY29ubmVjdF90aW1lb3V0X3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9jcmVhdGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCWNoYXIgYnVmWzIwMF07CisJc3NpemVfdCBsZW47CisJY2hhciAqc3B0ciwgKnRva2VuOworCXN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kIHBzdHJlYW07CisJdTMyIHZhbDMyOworCXUxNiB2YWwxNjsKKworCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCXNwdHIgPSBidWY7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnVzZXJfcHJpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRyYWZmaWNfZGlyZWMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udHJhZmZpY19jbGFzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmcHN0cmVhbS50cmFmZmljX3R5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udm9pY2VfcHNjX2NhcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5taW5fc2VydmljZV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1heF9zZXJ2aWNlX2ludCA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uaW5hY3Rpdml0eV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnN1c3BlbnNpb25faW50ID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZ2YWwxNikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubm9taW5hbF9tc2R1ID0gY3B1X3RvX2xlMTYodmFsMTYpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJnZhbDE2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfbXNkdSA9IGNwdV90b19sZTE2KHZhbDE2KTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWluX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWVhbl9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnBlYWtfZGF0YV9yYXRlID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfYnVyc3Rfc2l6ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uZGVsYXlfYm91bmQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1pbl9waHlfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uc2JhID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tZWRpdW1fdGltZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgJnBzdHJlYW0pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2NyZWF0ZV9xb3MgPSB7CisJLndyaXRlID0gYXRoNmtsX2NyZWF0ZV9xb3Nfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJY2hhciBidWZbMTAwXTsKKwlzc2l6ZV90IGxlbjsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdTggdHJhZmZpY19jbGFzczsKKwl1OCB0c2lkOworCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJc3B0ciA9IGJ1ZjsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRyYWZmaWNfY2xhc3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgICB0cmFmZmljX2NsYXNzLCB0c2lkKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19kZWxldGVfcW9zID0geworCS53cml0ZSA9IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfYmdzY2FuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTE2IGJnc2Nhbl9pbnQ7CisJY2hhciBidWZbMzJdOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoa3N0cnRvdTE2KGJ1ZiwgMCwgJmJnc2Nhbl9pbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiZ3NjYW5faW50ID09IDApCisJCWJnc2Nhbl9pbnQgPSAweGZmZmY7CisKKwlhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIDAsIDAsIDAsIGJnc2Nhbl9pbnQsIDAsIDAsIDAsIDMsCisJCQkJICAwLCAwLCAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19iZ3NjYW5faW50ID0geworCS53cml0ZSA9IGF0aDZrbF9iZ3NjYW5faW50X3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUxNiBsaXN0ZW5faW50X3QsIGxpc3Rlbl9pbnRfYjsKKwljaGFyIGJ1ZlszMl07CisJY2hhciAqc3B0ciwgKnRva2VuOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlzcHRyID0gYnVmOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmbGlzdGVuX2ludF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHNwdHIsIDAsICZsaXN0ZW5faW50X2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobGlzdGVuX2ludF90IDwgMTUpIHx8IChsaXN0ZW5faW50X3QgPiA1MDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGxpc3Rlbl9pbnRfYiA8IDEpIHx8IChsaXN0ZW5faW50X2IgPiA1MCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYXItPmxpc3Rlbl9pbnR2bF90ID0gbGlzdGVuX2ludF90OworCWFyLT5saXN0ZW5faW50dmxfYiA9IGxpc3Rlbl9pbnRfYjsKKworCWF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKGFyLT53bWksIDAsIGFyLT5saXN0ZW5faW50dmxfdCwKKwkJCQkgICAgICBhci0+bGlzdGVuX2ludHZsX2IpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMzJdOworCWludCBsZW47CisKKwlsZW4gPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1ICV1XG4iLCBhci0+bGlzdGVuX2ludHZsX3QsCisJCQkJCWFyLT5saXN0ZW5faW50dmxfYik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfbGlzdGVuX2ludCA9IHsKKwkucmVhZCA9IGF0aDZrbF9saXN0ZW5faW50X3JlYWQsCisJLndyaXRlID0gYXRoNmtsX2xpc3Rlbl9pbnRfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9wb3dlcl9wYXJhbXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1OCBidWZbMTAwXTsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdTE2IGlkbGVfcGVyaW9kLCBwc19wb2xsX251bSwgZHRpbSwKKwkJdHhfd2FrZXVwLCBudW1fdHg7CisKKwlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5dID0gJ1wwJzsKKwlzcHRyID0gYnVmOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJmlkbGVfcGVyaW9kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmcHNfcG9sbF9udW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZkdGltKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmdHhfd2FrZXVwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmbnVtX3R4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdGg2a2xfd21pX3BtcGFyYW1zX2NtZChhci0+d21pLCAwLCBpZGxlX3BlcmlvZCwgcHNfcG9sbF9udW0sCisJCQkJZHRpbSwgdHhfd2FrZXVwLCBudW1fdHgsIDApOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX3Bvd2VyX3BhcmFtcyA9IHsKKwkud3JpdGUgPSBhdGg2a2xfcG93ZXJfcGFyYW1zX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCiBpbnQgYXRoNmtsX2RlYnVnX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJYXItPmRlYnVnLmZ3bG9nX2J1Zi5idWYgPSB2bWFsbG9jKEFUSDZLTF9GV0xPR19TSVpFKTsKQEAgLTg4OCw3ICsxNjQ5LDcgQEAKIAlhci0+ZGVidWcuZndsb2dfbWFzayA9IDA7CiAKIAlhci0+ZGVidWdmc19waHkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImF0aDZrbCIsCi0JCQkJCSAgICAgYXItPndkZXYtPndpcGh5LT5kZWJ1Z2ZzZGlyKTsKKwkJCQkJICAgICBhci0+d2lwaHktPmRlYnVnZnNkaXIpOwogCWlmICghYXItPmRlYnVnZnNfcGh5KSB7CiAJCXZmcmVlKGFyLT5kZWJ1Zy5md2xvZ19idWYuYnVmKTsKIAkJa2ZyZWUoYXItPmRlYnVnLmZ3bG9nX3RtcCk7CkBAIC05MDEsNiArMTY2Miw5IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgiY3JlZGl0X2Rpc3Rfc3RhdHMiLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX2NyZWRpdF9kaXN0X3N0YXRzKTsKIAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImVuZHBvaW50X3N0YXRzIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkgICAgYXItPmRlYnVnZnNfcGh5LCBhciwgJmZvcHNfZW5kcG9pbnRfc3RhdHMpOworCiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZndsb2ciLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX2Z3bG9nKTsKIApAQCAtOTIyLDYgKzE2ODYsMzMgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ3YXJfc3RhdHMiLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX3dhcl9zdGF0cyk7CiAKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyb2FtX3RhYmxlIiwgU19JUlVTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCSAgICAmZm9wc19yb2FtX3RhYmxlKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZvcmNlX3JvYW0iLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJICAgICZmb3BzX2ZvcmNlX3JvYW0pOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgicm9hbV9tb2RlIiwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCSAgICAmZm9wc19yb2FtX21vZGUpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgia2VlcGFsaXZlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkgICAgJmZvcHNfa2VlcGFsaXZlKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRpc2Nvbm5lY3RfdGltZW91dCIsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJICAgIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsICZmb3BzX2Rpc2Nvbm5lY3RfdGltZW91dCk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjcmVhdGVfcW9zIiwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCQkmZm9wc19jcmVhdGVfcW9zKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRlbGV0ZV9xb3MiLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJCSZmb3BzX2RlbGV0ZV9xb3MpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiYmdzY2FuX2ludGVydmFsIiwgU19JV1VTUiwKKwkJCQlhci0+ZGVidWdmc19waHksIGFyLCAmZm9wc19iZ3NjYW5faW50KTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInBvd2VyX3BhcmFtcyIsIFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkJCQkmZm9wc19wb3dlcl9wYXJhbXMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyOSw2ICsxNzIwLDcgQEAKIHsKIAl2ZnJlZShhci0+ZGVidWcuZndsb2dfYnVmLmJ1Zik7CiAJa2ZyZWUoYXItPmRlYnVnLmZ3bG9nX3RtcCk7CisJa2ZyZWUoYXItPmRlYnVnLnJvYW1fdGJsKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmgKaW5kZXggOTI4OGEzYy4uZTU2OWM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuaApAQCAtMTcsMTkgKzE3LDE5IEBACiAjaWZuZGVmIERFQlVHX0gKICNkZWZpbmUgREVCVUdfSAogCi0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogCiBlbnVtIEFUSDZLX0RFQlVHX01BU0sgewotCUFUSDZLTF9EQkdfV0xBTl9DT05ORUNUID0gQklUKDApLCAgICAgLyogd2xhbiBjb25uZWN0ICovCi0JQVRINktMX0RCR19XTEFOX1NDQU4gICAgPSBCSVQoMSksICAgICAvKiB3bGFuIHNjYW4gKi8KKwlBVEg2S0xfREJHX0NSRURJVAk9IEJJVCgwKSwKKwkvKiBob2xlICovCiAJQVRINktMX0RCR19XTEFOX1RYICAgICAgPSBCSVQoMiksICAgICAvKiB3bGFuIHR4ICovCiAJQVRINktMX0RCR19XTEFOX1JYICAgICAgPSBCSVQoMyksICAgICAvKiB3bGFuIHJ4ICovCiAJQVRINktMX0RCR19CTUkJCT0gQklUKDQpLCAgICAgLyogYm1pIHRyYWNpbmcgKi8KLQlBVEg2S0xfREJHX0hUQ19TRU5EICAgICA9IEJJVCg1KSwgICAgIC8qIGh0YyBzZW5kICovCi0JQVRINktMX0RCR19IVENfUkVDViAgICAgPSBCSVQoNiksICAgICAvKiBodGMgcmVjdiAqLworCUFUSDZLTF9EQkdfSFRDCQk9IEJJVCg1KSwKKwlBVEg2S0xfREJHX0hJRgkJPSBCSVQoNiksCiAJQVRINktMX0RCR19JUlEJCT0gQklUKDcpLCAgICAgLyogaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KLQlBVEg2S0xfREJHX1BNICAgICAgICAgICA9IEJJVCg4KSwgICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlBVEg2S0xfREJHX1dMQU5fTk9ERSAgICA9IEJJVCg5KSwgICAgIC8qIGdlbmVyYWwgd2xhbiBub2RlIHRyYWNpbmcgKi8KKwkvKiBob2xlICovCisJLyogaG9sZSAqLwogCUFUSDZLTF9EQkdfV01JICAgICAgICAgID0gQklUKDEwKSwgICAgLyogd21pIHRyYWNpbmcgKi8KIAlBVEg2S0xfREJHX1RSQwkgICAgICAgID0gQklUKDExKSwgICAgLyogZ2VuZXJpYyBmdW5jIHRyYWNpbmcgKi8KIAlBVEg2S0xfREJHX1NDQVRURVIJPSBCSVQoMTIpLCAgICAvKiBoaWYgc2NhdHRlciB0cmFjaW5nICovCkBAIC00MCwxMiArNDAsMTQgQEAKIAlBVEg2S0xfREJHX1NESU9fRFVNUAk9IEJJVCgxNyksCiAJQVRINktMX0RCR19CT09UCQk9IEJJVCgxOCksICAgIC8qIGRyaXZlciBpbml0IGFuZCBmdyBib290ICovCiAJQVRINktMX0RCR19XTUlfRFVNUAk9IEJJVCgxOSksCisJQVRINktMX0RCR19TVVNQRU5ECT0gQklUKDIwKSwKKwlBVEg2S0xfREJHX1VTQgkJPSBCSVQoMjEpLAogCUFUSDZLTF9EQkdfQU5ZCSAgICAgICAgPSAweGZmZmZmZmZmICAvKiBlbmFibGUgYWxsIGxvZ3MgKi8KIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGVidWdfbWFzazsKLWV4dGVybiBpbnQgYXRoNmtsX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgYXRoNmtsX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIGF0aDZrbF9pbmZvKGZtdCwgLi4uKQkJCQlcCiAJYXRoNmtsX3ByaW50ayhLRVJOX0lORk8sIGZtdCwgIyNfX1ZBX0FSR1NfXykKQEAgLTkwLDYgKzkyLDEwIEBACiB2b2lkIGR1bXBfY3JlZF9kaXN0X3N0YXRzKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpOwogdm9pZCBhdGg2a2xfZGVidWdfZndsb2dfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CiB2b2lkIGF0aDZrbF9kZWJ1Z193YXIoc3RydWN0IGF0aDZrbCAqYXIsIGVudW0gYXRoNmtsX3dhciB3YXIpOworaW50IGF0aDZrbF9kZWJ1Z19yb2FtX3RibF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgY29uc3Qgdm9pZCAqYnVmLAorCQkJCXNpemVfdCBsZW4pOwordm9pZCBhdGg2a2xfZGVidWdfc2V0X2tlZXBhbGl2ZShzdHJ1Y3QgYXRoNmtsICphciwgdTgga2VlcGFsaXZlKTsKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpbWVvdXQpOwogaW50IGF0aDZrbF9kZWJ1Z19pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKIHZvaWQgYXRoNmtsX2RlYnVnX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwogCkBAIC0xMjUsNiArMTMxLDIxIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9kZWJ1Z19yb2FtX3RibF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNmtsX2RlYnVnX3NldF9rZWVwYWxpdmUoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtlZXBhbGl2ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9kZWJ1Z19zZXRfZGlzY29ubmVjdF90aW1lb3V0KHN0cnVjdCBhdGg2a2wgKmFyLAorCQkJCQkJICAgICAgIHU4IHRpbWVvdXQpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9kZWJ1Z19pbml0KHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYtb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaAppbmRleCBkNmM4OThmLi4yZmUxZGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaApAQCAtMTgsMTAgKzE4LDE2IEBACiAjZGVmaW5lIEhJRl9PUFNfSAogCiAjaW5jbHVkZSAiaGlmLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIGlubGluZSBpbnQgaGlmX3JlYWRfd3JpdGVfc3luYyhzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHIsIHU4ICpidWYsCiAJCQkJICAgICAgdTMyIGxlbiwgdTMyIHJlcXVlc3QpCiB7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwKKwkJICAgImhpZiAlcyBzeW5jIGFkZHIgMHgleCBidWYgMHglcCBsZW4gJWQgcmVxdWVzdCAweCV4XG4iLAorCQkgICAocmVxdWVzdCAmIEhJRl9XUklURSkgPyAid3JpdGUiIDogInJlYWQiLAorCQkgICBhZGRyLCBidWYsIGxlbiwgcmVxdWVzdCk7CisKIAlyZXR1cm4gYXItPmhpZl9vcHMtPnJlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sIHJlcXVlc3QpOwogfQogCkBAIC0yOSwxNiArMzUsMjQgQEAKIAkJCQkgIHUzMiBsZW5ndGgsIHUzMiByZXF1ZXN0LAogCQkJCSAgc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCkKIHsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLAorCQkgICAiaGlmIHdyaXRlIGFzeW5jIGFkZHIgMHgleCBidWYgMHglcCBsZW4gJWQgcmVxdWVzdCAweCV4XG4iLAorCQkgICBhZGRyZXNzLCBidWZmZXIsIGxlbmd0aCwgcmVxdWVzdCk7CisKIAlyZXR1cm4gYXItPmhpZl9vcHMtPndyaXRlX2FzeW5jKGFyLCBhZGRyZXNzLCBidWZmZXIsIGxlbmd0aCwKIAkJCQkJcmVxdWVzdCwgcGFja2V0KTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfaGlmX2lycV9lbmFibGUoc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBpcnEgZW5hYmxlXG4iKTsKKwogCXJldHVybiBhci0+aGlmX29wcy0+aXJxX2VuYWJsZShhcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfaGlmX2lycV9kaXNhYmxlKHN0cnVjdCBhdGg2a2wgKmFyKQogeworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgaXJxIGRpc2FibGVcbiIpOworCiAJcmV0dXJuIGFyLT5oaWZfb3BzLT5pcnFfZGlzYWJsZShhcik7CiB9CiAKQEAgLTY5LDkgKzgzLDcwIEBACiAJcmV0dXJuIGFyLT5oaWZfb3BzLT5jbGVhbnVwX3NjYXR0ZXIoYXIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCiB7Ci0JcmV0dXJuIGFyLT5oaWZfb3BzLT5zdXNwZW5kKGFyKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHN1c3BlbmRcbiIpOworCisJcmV0dXJuIGFyLT5oaWZfb3BzLT5zdXNwZW5kKGFyLCB3b3cpOworfQorCisvKgorICogUmVhZCBmcm9tIHRoZSBBVEg2S0wgdGhyb3VnaCBpdHMgZGlhZ25vc3RpYyB3aW5kb3cuIE5vIGNvb3BlcmF0aW9uIGZyb20KKyAqIHRoZSBUYXJnZXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfZGlhZ19yZWFkMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLAorCQkJCQkgdTMyICp2YWx1ZSkKK3sKKwlyZXR1cm4gYXItPmhpZl9vcHMtPmRpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCB2YWx1ZSk7Cit9CisKKy8qCisgKiBXcml0ZSB0byB0aGUgQVRINktMIHRocm91Z2ggaXRzIGRpYWdub3N0aWMgd2luZG93LiBObyBjb29wZXJhdGlvbiBmcm9tCisgKiB0aGUgVGFyZ2V0IGlzIHJlcXVpcmVkIGZvciB0aGlzLgorICovCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX2RpYWdfd3JpdGUzMihzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHJlc3MsCisJCQkJCSAgX19sZTMyIHZhbHVlKQoreworCXJldHVybiBhci0+aGlmX29wcy0+ZGlhZ193cml0ZTMyKGFyLCBhZGRyZXNzLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfYm1pX3JlYWQoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpidWYsIHUzMiBsZW4pCit7CisJcmV0dXJuIGFyLT5oaWZfb3BzLT5ibWlfcmVhZChhciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX2JtaV93cml0ZShzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlyZXR1cm4gYXItPmhpZl9vcHMtPmJtaV93cml0ZShhciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3Jlc3VtZShzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHJlc3VtZVxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnJlc3VtZShhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfcG93ZXJfb24oc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBwb3dlciBvblxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnBvd2VyX29uKGFyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2hpZl9wb3dlcl9vZmYoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBwb3dlciBvZmZcbiIpOworCisJcmV0dXJuIGFyLT5oaWZfb3BzLT5wb3dlcl9vZmYoYXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNmtsX2hpZl9zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgc3RvcFxuIik7CisKKwlhci0+aGlmX29wcy0+c3RvcChhcik7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MmVmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImhpZi5oIgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImhpZi1vcHMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIE1BSUxCT1hfRk9SX0JMT0NLX1NJWkUgICAgICAgICAgMQorCisjZGVmaW5lIEFUSDZLTF9USU1FX1FVQU5UVU0JMTAgIC8qIGluIG1zICovCisKK3N0YXRpYyBpbnQgYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqcmVxLAorCQkJCSAgICAgIGJvb2wgZnJvbV9kbWEpCit7CisJdTggKmJ1ZjsKKwlpbnQgaTsKKworCWJ1ZiA9IHJlcS0+dmlydF9kbWFfYnVmOworCisJZm9yIChpID0gMDsgaSA8IHJlcS0+c2NhdF9lbnRyaWVzOyBpKyspIHsKKworCQlpZiAoZnJvbV9kbWEpCisJCQltZW1jcHkocmVxLT5zY2F0X2xpc3RbaV0uYnVmLCBidWYsCisJCQkgICAgICAgcmVxLT5zY2F0X2xpc3RbaV0ubGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KGJ1ZiwgcmVxLT5zY2F0X2xpc3RbaV0uYnVmLAorCQkJICAgICAgIHJlcS0+c2NhdF9saXN0W2ldLmxlbik7CisKKwkJYnVmICs9IHJlcS0+c2NhdF9saXN0W2ldLmxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCA9IGNvbnRleHQ7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHJ3IGNvbXBsZXRpb24gcGt0IDB4JXAgc3RhdHVzICVkXG4iLAorCQkgICBwYWNrZXQsIHN0YXR1cyk7CisKKwlwYWNrZXQtPnN0YXR1cyA9IHN0YXR1czsKKwlwYWNrZXQtPmNvbXBsZXRpb24ocGFja2V0LT5jb250ZXh0LCBwYWNrZXQpOworCisJcmV0dXJuIDA7Cit9CisjZGVmaW5lIFJFR19EVU1QX0NPVU5UX0FSNjAwMyAgIDYwCisjZGVmaW5lIFJFR0lTVEVSX0RVTVBfTEVOX01BWCAgIDYwCisKK3N0YXRpYyB2b2lkIGF0aDZrbF9oaWZfZHVtcF9md19jcmFzaChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlfX2xlMzIgcmVnZHVtcF92YWxbUkVHSVNURVJfRFVNUF9MRU5fTUFYXTsKKwl1MzIgaSwgYWRkcmVzcywgcmVnZHVtcF9hZGRyID0gMDsKKwlpbnQgcmV0OworCisJaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCisJCXJldHVybjsKKworCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCisJYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKKwlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7CisKKwkvKiByZWFkIFJBTSBsb2NhdGlvbiB0aHJvdWdoIGRpYWdub3N0aWMgd2luZG93ICovCisJcmV0ID0gYXRoNmtsX2RpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCAmcmVnZHVtcF9hZGRyKTsKKworCWlmIChyZXQgfHwgIXJlZ2R1bXBfYWRkcikgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCBwdHIgdG8gcmVnaXN0ZXIgZHVtcCBhcmVhOiAlZFxuIiwKKwkJCSAgICByZXQpOworCQlyZXR1cm47CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgInJlZ2lzdGVyIGR1bXAgZGF0YSBhZGRyZXNzIDB4JXhcbiIsCisJCXJlZ2R1bXBfYWRkcik7CisJcmVnZHVtcF9hZGRyID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgcmVnZHVtcF9hZGRyKTsKKworCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLworCXJldCA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfYWRkciwgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAorCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7CisJaWYgKHJldCkgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWF0aDZrbF9pbmZvKCJjcmFzaCBkdW1wOlxuIik7CisJYXRoNmtsX2luZm8oImh3IDB4JXggZncgJXNcbiIsIGFyLT53aXBoeS0+aHdfdmVyc2lvbiwKKwkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbik7CisKKwlCVUlMRF9CVUdfT04oUkVHX0RVTVBfQ09VTlRfQVI2MDAzICUgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVHX0RVTVBfQ09VTlRfQVI2MDAzIC8gNDsgaSsrKSB7CisJCWF0aDZrbF9pbmZvKCIlZDogMHglOC44eCAweCU4Ljh4IDB4JTguOHggMHglOC44eFxuIiwKKwkJCSAgICA0ICogaSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpXSksCisJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaSArIDFdKSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpICsgMl0pLAorCQkJICAgIGxlMzJfdG9fY3B1KHJlZ2R1bXBfdmFsW2kgKyAzXSkpOworCX0KKworfQorCitzdGF0aWMgaW50IGF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXUzMiBkdW1teTsKKwlpbnQgcmV0OworCisJYXRoNmtsX3dhcm4oImZpcm13YXJlIGNyYXNoZWRcbiIpOworCisJLyoKKwkgKiByZWFkIGNvdW50ZXIgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhlIGRlYnVnIGVycm9yIGludGVycnVwdCBpcworCSAqIGNvdW50ZXIgMC4KKwkgKi8KKwlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIENPVU5UX0RFQ19BRERSRVNTLAorCQkJCSAgICAgKHU4ICopJmR1bW15LCA0LCBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisJaWYgKHJldCkKKwkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBjbGVhciBkZWJ1ZyBpbnRlcnJ1cHQ6ICVkXG4iLCByZXQpOworCisJYXRoNmtsX2hpZl9kdW1wX2Z3X2NyYXNoKGRldi0+YXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogbWFpbGJveCByZWN2IG1lc3NhZ2UgcG9sbGluZyAqLworaW50IGF0aDZrbF9oaWZfcG9sbF9tYm94bXNnX3J4KHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsIHUzMiAqbGtfYWhkLAorCQkJICAgICAgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgKnJnOworCWludCBzdGF0dXMgPSAwLCBpOworCXU4IGh0Y19tYm94ID0gMSA8PCBIVENfTUFJTEJPWDsKKworCWZvciAoaSA9IHRpbWVvdXQgLyBBVEg2S0xfVElNRV9RVUFOVFVNOyBpID4gMDsgaS0tKSB7CisJCS8qIHRoaXMgaXMgdGhlIHN0YW5kYXJkIEhJRiB3YXksIGxvYWQgdGhlIHJlZyB0YWJsZSAqLworCQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEhPU1RfSU5UX1NUQVRVU19BRERSRVNTLAorCQkJCQkgICAgICh1OCAqKSAmZGV2LT5pcnFfcHJvY19yZWcsCisJCQkJCSAgICAgc2l6ZW9mKGRldi0+aXJxX3Byb2NfcmVnKSwKKwkJCQkJICAgICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHJlYWQgcmVnIHRhYmxlXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQkvKiBjaGVjayBmb3IgTUJPWCBkYXRhIGFuZCB2YWxpZCBsb29rYWhlYWQgKi8KKwkJaWYgKGRldi0+aXJxX3Byb2NfcmVnLmhvc3RfaW50X3N0YXR1cyAmIGh0Y19tYm94KSB7CisJCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcucnhfbGthaGRfdmFsaWQgJgorCQkJICAgIGh0Y19tYm94KSB7CisJCQkJLyoKKwkJCQkgKiBNYWlsYm94IGhhcyBhIG1lc3NhZ2UgYW5kIHRoZSBsb29rIGFoZWFkCisJCQkJICogaXMgdmFsaWQuCisJCQkJICovCisJCQkJcmcgPSAmZGV2LT5pcnFfcHJvY19yZWc7CisJCQkJKmxrX2FoZCA9CisJCQkJCWxlMzJfdG9fY3B1KHJnLT5yeF9sa2FoZFtIVENfTUFJTEJPWF0pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogZGVsYXkgYSBsaXR0bGUgICovCisJCW1kZWxheShBVEg2S0xfVElNRV9RVUFOVFVNKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByZXRyeSBtYm94IHBvbGwgdHJ5ICVkXG4iLCBpKTsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCWF0aDZrbF9lcnIoInRpbWVvdXQgd2FpdGluZyBmb3IgcmVjdiBtZXNzYWdlXG4iKTsKKwkJc3RhdHVzID0gLUVUSU1FOworCQkvKiBjaGVjayBpZiB0aGUgdGFyZ2V0IGFzc2VydGVkICovCisJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5jb3VudGVyX2ludF9zdGF0dXMgJgorCQkgICAgQVRINktMX1RBUkdFVF9ERUJVR19JTlRSX01BU0spCisJCQkvKgorCQkJICogVGFyZ2V0IGZhaWx1cmUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBpbiBjYXNlIG9mCisJCQkgKiBhbiBhc3NlcnQuCisJCQkgKi8KKwkJCWF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihkZXYpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKHVzZWQgaW4gY2FzZSB0aGUgaG9zdCBydW5zIG91dCBvZiBidWZmZXJzKQorICogdXNpbmcgdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3QgSS9GCisgKi8KK2ludCBhdGg2a2xfaGlmX3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOworCWludCBzdGF0dXMgPSAwOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByeCAlc1xuIiwKKwkJICAgZW5hYmxlX3J4ID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJLyogdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGludGVycnVwdCBlbmFibGUgc2hhZG93cyAqLworCXNwaW5fbG9ja19iaCgmZGV2LT5sb2NrKTsKKworCWlmIChlbmFibGVfcngpCisJCWRldi0+aXJxX2VuX3JlZy5pbnRfc3RhdHVzX2VuIHw9CisJCQlTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCWVsc2UKKwkJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gJj0KKwkJICAgIH5TTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCisJbWVtY3B5KCZyZWdzLCAmZGV2LT5pcnFfZW5fcmVnLCBzaXplb2YocmVncykpOworCisJc3Bpbl91bmxvY2tfYmgoJmRldi0+bG9jayk7CisKKwlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIElOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJCQkJICAgICAmcmVncy5pbnRfc3RhdHVzX2VuLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcpLAorCQkJCSAgICAgSElGX1dSX1NZTkNfQllURV9JTkMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGF0aDZrbF9oaWZfc3VibWl0X3NjYXRfcmVxKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwgYm9vbCByZWFkKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKHJlYWQpIHsKKwkJc2NhdF9yZXEtPnJlcSA9IEhJRl9SRF9TWU5DX0JMT0NLX0ZJWDsKKwkJc2NhdF9yZXEtPmFkZHIgPSBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisJfSBlbHNlIHsKKwkJc2NhdF9yZXEtPnJlcSA9IEhJRl9XUl9BU1lOQ19CTE9DS19JTkM7CisKKwkJc2NhdF9yZXEtPmFkZHIgPQorCQkJKHNjYXRfcmVxLT5sZW4gPiBISUZfTUJPWF9XSURUSCkgPworCQkJZGV2LT5hci0+bWJveF9pbmZvLmh0Y19leHRfYWRkciA6CisJCQlkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwKKwkJICAgImhpZiBzdWJtaXQgc2NhdHRlciByZXF1ZXN0IGVudHJpZXMgJWQgbGVuICVkIG1ib3ggMHgleCAlcyAlc1xuIiwKKwkJICAgc2NhdF9yZXEtPnNjYXRfZW50cmllcywgc2NhdF9yZXEtPmxlbiwKKwkJICAgc2NhdF9yZXEtPmFkZHIsICFyZWFkID8gImFzeW5jIiA6ICJzeW5jIiwKKwkJICAgKHJlYWQpID8gInJkIiA6ICJ3ciIpOworCisJaWYgKCFyZWFkICYmIHNjYXRfcmVxLT52aXJ0X3NjYXQpIHsKKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc2NhdF9yZXEtPnN0YXR1cyA9IHN0YXR1czsKKwkJCXNjYXRfcmVxLT5jb21wbGV0ZShkZXYtPmFyLT5odGNfdGFyZ2V0LCBzY2F0X3JlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN0YXR1cyA9IGF0aDZrbF9oaWZfc2NhdF9yZXFfcncoZGV2LT5hciwgc2NhdF9yZXEpOworCisJaWYgKHJlYWQpIHsKKwkJLyogaW4gc3luYyBtb2RlLCB3ZSBjYW4gdG91Y2ggdGhlIHNjYXR0ZXIgcmVxdWVzdCAqLworCQlzY2F0X3JlcS0+c3RhdHVzID0gc3RhdHVzOworCQlpZiAoIXN0YXR1cyAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KQorCQkJc2NhdF9yZXEtPnN0YXR1cyA9CisJCQkJYXRoNmtsX2hpZl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIHRydWUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX2hpZl9wcm9jX2NvdW50ZXJfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXU4IGNvdW50ZXJfaW50X3N0YXR1czsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJjb3VudGVyIGludGVycnVwdFxuIik7CisKKwljb3VudGVyX2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5jb3VudGVyX2ludF9zdGF0dXMgJgorCQkJICAgICBkZXYtPmlycV9lbl9yZWcuY250cl9pbnRfc3RhdHVzX2VuOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKKwkJInZhbGlkIGludGVycnVwdCBzb3VyY2UocykgaW4gQ09VTlRFUl9JTlRfU1RBVFVTOiAweCV4XG4iLAorCQljb3VudGVyX2ludF9zdGF0dXMpOworCisJLyoKKwkgKiBOT1RFOiBvdGhlciBtb2R1bGVzIGxpa2UgR01CT1ggbWF5IHVzZSB0aGUgY291bnRlciBpbnRlcnJ1cHQgZm9yCisJICogY3JlZGl0IGZsb3cgY29udHJvbCBvbiBvdGhlciBjb3VudGVycywgd2Ugb25seSBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIHRoZSBkZWJ1ZyBhc3NlcnRpb24gY291bnRlciBpbnRlcnJ1cHQuCisJICovCisJaWYgKGNvdW50ZXJfaW50X3N0YXR1cyAmIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKQorCQlyZXR1cm4gYXRoNmtsX2hpZl9wcm9jX2RiZ19pbnRyKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfZXJyX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGVycm9yX2ludF9zdGF0dXM7CisJdTggcmVnX2J1Zls0XTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJlcnJvciBpbnRlcnJ1cHRcbiIpOworCisJZXJyb3JfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmVycm9yX2ludF9zdGF0dXMgJiAweDBGOworCWlmICghZXJyb3JfaW50X3N0YXR1cykgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBpbiBFUlJPUl9JTlRfU1RBVFVTOiAweCV4XG4iLAorCQkgICBlcnJvcl9pbnRfc3RhdHVzKTsKKworCWlmIChNUyhFUlJPUl9JTlRfU1RBVFVTX1dBS0VVUCwgZXJyb3JfaW50X3N0YXR1cykpCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsICJlcnJvciA6IHdha2V1cFxuIik7CisKKwlpZiAoTVMoRVJST1JfSU5UX1NUQVRVU19SWF9VTkRFUkZMT1csIGVycm9yX2ludF9zdGF0dXMpKQorCQlhdGg2a2xfZXJyKCJyeCB1bmRlcmZsb3dcbiIpOworCisJaWYgKE1TKEVSUk9SX0lOVF9TVEFUVVNfVFhfT1ZFUkZMT1csIGVycm9yX2ludF9zdGF0dXMpKQorCQlhdGg2a2xfZXJyKCJ0eCBvdmVyZmxvd1xuIik7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCisJZGV2LT5pcnFfcHJvY19yZWcuZXJyb3JfaW50X3N0YXR1cyAmPSB+ZXJyb3JfaW50X3N0YXR1czsKKworCS8qIHNldCBXMUMgdmFsdWUgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhpcyBoaXRzIHRoZSByZWdpc3RlciBmaXJzdCAqLworCXJlZ19idWZbMF0gPSBlcnJvcl9pbnRfc3RhdHVzOworCXJlZ19idWZbMV0gPSAwOworCXJlZ19idWZbMl0gPSAwOworCXJlZ19idWZbM10gPSAwOworCisJc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhkZXYtPmFyLCBFUlJPUl9JTlRfU1RBVFVTX0FERFJFU1MsCisJCQkJICAgICByZWdfYnVmLCA0LCBISUZfV1JfU1lOQ19CWVRFX0ZJWCk7CisKKwlpZiAoc3RhdHVzKQorCQlXQVJOX09OKDEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfY3B1X2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGNwdV9pbnRfc3RhdHVzOworCXU4IHJlZ19idWZbNF07CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAiY3B1IGludGVycnVwdFxuIik7CisKKwljcHVfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmNwdV9pbnRfc3RhdHVzICYKKwkJCSBkZXYtPmlycV9lbl9yZWcuY3B1X2ludF9zdGF0dXNfZW47CisJaWYgKCFjcHVfaW50X3N0YXR1cykgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBpbiBDUFVfSU5UX1NUQVRVUzogMHgleFxuIiwKKwkJY3B1X2ludF9zdGF0dXMpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCWRldi0+aXJxX3Byb2NfcmVnLmNwdV9pbnRfc3RhdHVzICY9IH5jcHVfaW50X3N0YXR1czsKKworCS8qCisJICogU2V0IHVwIHRoZSByZWdpc3RlciB0cmFuc2ZlciBidWZmZXIgdG8gaGl0IHRoZSByZWdpc3RlciA0IHRpbWVzICwKKwkgKiB0aGlzIGlzIGRvbmUgdG8gbWFrZSB0aGUgYWNjZXNzIDQtYnl0ZSBhbGlnbmVkIHRvIG1pdGlnYXRlIGlzc3VlcworCSAqIHdpdGggaG9zdCBidXMgaW50ZXJjb25uZWN0cyB0aGF0IHJlc3RyaWN0IGJ1cyB0cmFuc2ZlciBsZW5ndGhzIHRvCisJICogYmUgYSBtdWx0aXBsZSBvZiA0LWJ5dGVzLgorCSAqLworCisJLyogc2V0IFcxQyB2YWx1ZSB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGlzIGhpdHMgdGhlIHJlZ2lzdGVyIGZpcnN0ICovCisJcmVnX2J1ZlswXSA9IGNwdV9pbnRfc3RhdHVzOworCS8qIHRoZSByZW1haW5pbmcgYXJlIHNldCB0byB6ZXJvIHdoaWNoIGhhdmUgbm8tZWZmZWN0ICAqLworCXJlZ19idWZbMV0gPSAwOworCXJlZ19idWZbMl0gPSAwOworCXJlZ19idWZbM10gPSAwOworCisJc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhkZXYtPmFyLCBDUFVfSU5UX1NUQVRVU19BRERSRVNTLAorCQkJCSAgICAgcmVnX2J1ZiwgNCwgSElGX1dSX1NZTkNfQllURV9GSVgpOworCisJaWYgKHN0YXR1cykKKwkJV0FSTl9PTigxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIHByb2Nlc3MgcGVuZGluZyBpbnRlcnJ1cHRzIHN5bmNocm9ub3VzbHkgKi8KK3N0YXRpYyBpbnQgcHJvY19wZW5kaW5nX2lycXMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCAqZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyAqcmc7CisJaW50IHN0YXR1cyA9IDA7CisJdTggaG9zdF9pbnRfc3RhdHVzID0gMDsKKwl1MzIgbGtfYWhkID0gMDsKKwl1OCBodGNfbWJveCA9IDEgPDwgSFRDX01BSUxCT1g7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAicHJvY19wZW5kaW5nX2lycXM6IChkZXY6IDB4JXApXG4iLCBkZXYpOworCisJLyoKKwkgKiBOT1RFOiBISUYgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBjb250ZXh0IG9mIHRoaXMKKwkgKiBjYWxsIGFsbG93cyB1cyB0byBwZXJmb3JtIFNZTkNIUk9OT1VTIEkvTywgdGhhdCBpcyB3ZSBjYW4gYmxvY2ssCisJICogc2xlZXAgb3IgY2FsbCBhbnkgQVBJIHRoYXQgY2FuIGJsb2NrIG9yIHN3aXRjaCB0aHJlYWQvdGFzaworCSAqIGNvbnRleHRzLiBUaGlzIGlzIGEgZnVsbHkgc2NoZWR1bGFibGUgY29udGV4dC4KKwkgKi8KKworCS8qCisJICogUHJvY2VzcyBwZW5kaW5nIGludHIgb25seSB3aGVuIGludF9zdGF0dXNfZW4gaXMgY2xlYXIsIGl0IG1heQorCSAqIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBidXMgdHJhbnNhY3Rpb24gb3RoZXJ3aXNlLiBUYXJnZXQgbWF5IGJlCisJICogdW5yZXNwb25zaXZlIGF0IHRoZSB0aW1lLgorCSAqLworCWlmIChkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbikgeworCQkvKgorCQkgKiBSZWFkIHRoZSBmaXJzdCAyOCBieXRlcyBvZiB0aGUgSFRDIHJlZ2lzdGVyIHRhYmxlLiBUaGlzCisJCSAqIHdpbGwgeWllbGQgdXMgdGhlIHZhbHVlIG9mIGRpZmZlcmVudCBpbnQgc3RhdHVzCisJCSAqIHJlZ2lzdGVycyBhbmQgdGhlIGxvb2thaGVhZCByZWdpc3RlcnMuCisJCSAqCisJCSAqICAgIGxlbmd0aCA9IHNpemVvZihpbnRfc3RhdHVzKSArIHNpemVvZihjcHVfaW50X3N0YXR1cykKKwkJICogICAgICAgICAgICAgKyBzaXplb2YoZXJyb3JfaW50X3N0YXR1cykgKworCQkgKiAgICAgICAgICAgICBzaXplb2YoY291bnRlcl9pbnRfc3RhdHVzKSArCisJCSAqICAgICAgICAgICAgIHNpemVvZihtYm94X2ZyYW1lKSArIHNpemVvZihyeF9sa2FoZF92YWxpZCkKKwkJICogICAgICAgICAgICAgKyBzaXplb2YoaG9sZSkgKyBzaXplb2YocnhfbGthaGQpICsKKwkJICogICAgICAgICAgICAgc2l6ZW9mKGludF9zdGF0dXNfZW4pICsKKwkJICogICAgICAgICAgICAgc2l6ZW9mKGNwdV9pbnRfc3RhdHVzX2VuKSArCisJCSAqICAgICAgICAgICAgIHNpemVvZihlcnJfaW50X3N0YXR1c19lbikgKworCQkgKiAgICAgICAgICAgICBzaXplb2YoY250cl9pbnRfc3RhdHVzX2VuKTsKKwkJICovCisJCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MsCisJCQkJCSAgICAgKHU4ICopICZkZXYtPmlycV9wcm9jX3JlZywKKwkJCQkJICAgICBzaXplb2YoZGV2LT5pcnFfcHJvY19yZWcpLAorCQkJCQkgICAgIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCisJCWlmIChBUl9EQkdfTFZMX0NIRUNLKEFUSDZLTF9EQkdfSVJRKSkKKwkJCWF0aDZrbF9kdW1wX3JlZ2lzdGVycyhkZXYsICZkZXYtPmlycV9wcm9jX3JlZywKKwkJCQkJICZkZXYtPmlycV9lbl9yZWcpOworCisJCS8qIFVwZGF0ZSBvbmx5IHRob3NlIHJlZ2lzdGVycyB0aGF0IGFyZSBlbmFibGVkICovCisJCWhvc3RfaW50X3N0YXR1cyA9IGRldi0+aXJxX3Byb2NfcmVnLmhvc3RfaW50X3N0YXR1cyAmCisJCQkJICBkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbjsKKworCQkvKiBMb29rIGF0IG1ib3ggc3RhdHVzICovCisJCWlmIChob3N0X2ludF9zdGF0dXMgJiBodGNfbWJveCkgeworCQkJLyoKKwkJCSAqIE1hc2sgb3V0IHBlbmRpbmcgbWJveCB2YWx1ZSwgd2UgdXNlICJsb29rQWhlYWQgYXMKKwkJCSAqIHRoZSByZWFsIGZsYWcgZm9yIG1ib3ggcHJvY2Vzc2luZy4KKwkJCSAqLworCQkJaG9zdF9pbnRfc3RhdHVzICY9IH5odGNfbWJveDsKKwkJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5yeF9sa2FoZF92YWxpZCAmCisJCQkgICAgaHRjX21ib3gpIHsKKwkJCQlyZyA9ICZkZXYtPmlycV9wcm9jX3JlZzsKKwkJCQlsa19haGQgPSBsZTMyX3RvX2NwdShyZy0+cnhfbGthaGRbSFRDX01BSUxCT1hdKTsKKwkJCQlpZiAoIWxrX2FoZCkKKwkJCQkJYXRoNmtsX2VycigibG9va0FoZWFkIGlzIHplcm8hXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaG9zdF9pbnRfc3RhdHVzICYmICFsa19haGQpIHsKKwkJKmRvbmUgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGtfYWhkKSB7CisJCWludCBmZXRjaGVkID0gMDsKKworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkJICAgInBlbmRpbmcgbWFpbGJveCBtc2csIGxrX2FoZDogMHglWFxuIiwgbGtfYWhkKTsKKwkJLyoKKwkJICogTWFpbGJveCBJbnRlcnJ1cHQsIHRoZSBIVEMgbGF5ZXIgbWF5IGlzc3VlIGFzeW5jCisJCSAqIHJlcXVlc3RzIHRvIGVtcHR5IHRoZSBtYWlsYm94LiBXaGVuIGVtcHR5aW5nIHRoZSByZWN2CisJCSAqIG1haWxib3ggd2UgdXNlIHRoZSBhc3luYyBoYW5kbGVyIGFib3ZlIGNhbGxlZCBmcm9tIHRoZQorCQkgKiBjb21wbGV0aW9uIHJvdXRpbmUgb2YgdGhlIGNhbGxlcnMgcmVhZCByZXF1ZXN0LiBUaGlzIGNhbgorCQkgKiBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5IHJlZHVjaW5nIGNvbnRleHQgc3dpdGNoaW5nIHdoZW4KKwkJICogd2UgcmFwaWRseSBwdWxsIHBhY2tldHMuCisJCSAqLworCQlzdGF0dXMgPSBhdGg2a2xfaHRjX3J4bXNnX3BlbmRpbmdfaGFuZGxlcihkZXYtPmh0Y19jbnh0LAorCQkJCQkJCSAgbGtfYWhkLCAmZmV0Y2hlZCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKworCQlpZiAoIWZldGNoZWQpCisJCQkvKgorCQkJICogSFRDIGNvdWxkIG5vdCBwdWxsIGFueSBtZXNzYWdlcyBvdXQgZHVlIHRvIGxhY2sKKwkJCSAqIG9mIHJlc291cmNlcy4KKwkJCSAqLworCQkJZGV2LT5odGNfY254dC0+Y2hrX2lycV9zdGF0dXNfY250ID0gMDsKKwl9CisKKwkvKiBub3cgaGFuZGxlIHRoZSByZXN0IG9mIHRoZW0gKi8KKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAidmFsaWQgaW50ZXJydXB0IHNvdXJjZShzKSBmb3Igb3RoZXIgaW50ZXJydXB0czogMHgleFxuIiwKKwkJICAgaG9zdF9pbnRfc3RhdHVzKTsKKworCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ1BVLCBob3N0X2ludF9zdGF0dXMpKSB7CisJCS8qIENQVSBJbnRlcnJ1cHQgKi8KKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9wcm9jX2NwdV9pbnRyKGRldik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoTVMoSE9TVF9JTlRfU1RBVFVTX0VSUk9SLCBob3N0X2ludF9zdGF0dXMpKSB7CisJCS8qIEVycm9yIEludGVycnVwdCAqLworCQlzdGF0dXMgPSBhdGg2a2xfaGlmX3Byb2NfZXJyX2ludHIoZGV2KTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUiwgaG9zdF9pbnRfc3RhdHVzKSkKKwkJLyogQ291bnRlciBJbnRlcnJ1cHQgKi8KKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9wcm9jX2NvdW50ZXJfaW50cihkZXYpOworCitvdXQ6CisJLyoKKwkgKiBBbiBvcHRpbWl6YXRpb24gdG8gYnlwYXNzIHJlYWRpbmcgdGhlIElSUSBzdGF0dXMgcmVnaXN0ZXJzCisJICogdW5lY2Vzc2FyaWx5IHdoaWNoIGNhbiByZS13YWtlIHRoZSB0YXJnZXQsIGlmIHVwcGVyIGxheWVycworCSAqIGRldGVybWluZSB0aGF0IHdlIGFyZSBpbiBhIGxvdy10aHJvdWdocHV0IG1vZGUsIHdlIGNhbiByZWx5IG9uCisJICogdGFraW5nIGFub3RoZXIgaW50ZXJydXB0IHJhdGhlciB0aGFuIHJlLWNoZWNraW5nIHRoZSBzdGF0dXMKKwkgKiByZWdpc3RlcnMgd2hpY2ggY2FuIHJlLXdha2UgdGhlIHRhcmdldC4KKwkgKgorCSAqIE5PVEUgOiBmb3IgaG9zdCBpbnRlcmZhY2VzIHRoYXQgbWFrZXMgdXNlIG9mIGRldGVjdGluZyBwZW5kaW5nCisJICogbWJveCBtZXNzYWdlcyBhdCBoaWYgY2FuIG5vdCB1c2UgdGhpcyBvcHRpbWl6YXRpb24gZHVlIHRvCisJICogcG9zc2libGUgc2lkZSBlZmZlY3RzLCBTUEkgcmVxdWlyZXMgdGhlIGhvc3QgdG8gZHJhaW4gYWxsCisJICogbWVzc2FnZXMgZnJvbSB0aGUgbWFpbGJveCBiZWZvcmUgZXhpdGluZyB0aGUgSVNSIHJvdXRpbmUuCisJICovCisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAorCQkgICAiYnlwYXNzaW5nIGlycSBzdGF0dXMgcmUtY2hlY2ssIGZvcmNpbmcgZG9uZVxuIik7CisKKwlpZiAoIWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCkKKwkJKmRvbmUgPSB0cnVlOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKKwkJICAgInByb2NfcGVuZGluZ19pcnFzOiAoZG9uZTolZCwgc3RhdHVzPSVkXG4iLCAqZG9uZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIGludGVycnVwdCBoYW5kbGVyLCBraWNrcyBvZmYgYWxsIGludGVycnVwdCBwcm9jZXNzaW5nICovCitpbnQgYXRoNmtsX2hpZl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiA9IGFyLT5odGNfdGFyZ2V0LT5kZXY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBzdGF0dXMgPSAwOworCWJvb2wgZG9uZSA9IGZhbHNlOworCisJLyoKKwkgKiBSZXNldCBjb3VudGVyIHVzZWQgdG8gZmxhZyBhIHJlLXNjYW4gb2YgSVJRIHN0YXR1cyByZWdpc3RlcnMgb24KKwkgKiB0aGUgdGFyZ2V0LgorCSAqLworCWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCA9IDA7CisKKwkvKgorCSAqIElSUSBwcm9jZXNzaW5nIGlzIHN5bmNocm9ub3VzLCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycyBjYW4gYmUKKwkgKiByZS1yZWFkLgorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBVEg2S0xfSElGX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFkb25lKSB7CisJCXN0YXR1cyA9IHByb2NfcGVuZGluZ19pcnFzKGRldiwgJmRvbmUpOworCQlpZiAoc3RhdHVzKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfaGlmX2VuYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgcmVnczsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOworCisJLyogRW5hYmxlIGFsbCBidXQgQVRINktMIENQVSBpbnRlcnJ1cHRzICovCisJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gPQorCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfRVJST1IsIDB4MDEpIHwKKwkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX0NQVSwgMHgwMSkgfAorCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUiwgMHgwMSk7CisKKwkvKgorCSAqIE5PVEU6IFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIEhJRiBjYW4gZG8gZGV0ZWN0aW9uIG9mCisJICogcGVuZGluZyBtYm94IG1lc3NhZ2VzIHdoaWNoIGlzIGRpc2FibGVkIG5vdy4KKwkgKi8KKwlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiB8PSBTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOworCisJLyogU2V0IHVwIHRoZSBDUFUgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLworCWRldi0+aXJxX2VuX3JlZy5jcHVfaW50X3N0YXR1c19lbiA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEVycm9yIEludGVycnVwdCBzdGF0dXMgUmVnaXN0ZXIgKi8KKwlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPQorCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPVywgMHgwMSkgfAorCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XLCAweDEpOworCisJLyoKKwkgKiBFbmFibGUgQ291bnRlciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBmYXRhbCBlcnJvcnMgZm9yCisJICogZGVidWdnaW5nLgorCSAqLworCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSBTTShDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVCwKKwkJCQkJCUFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKTsKKwltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7CisKKwlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKKworCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKKwkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sIHNpemVvZihyZWdzKSwKKwkJCQkgICAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKworCWlmIChzdGF0dXMpCisJCWF0aDZrbF9lcnIoImZhaWxlZCB0byB1cGRhdGUgaW50ZXJydXB0IGN0bCByZWcgZXJyOiAlZFxuIiwKKwkJCSAgIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOworCisJc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiA9IDA7CisJZGV2LT5pcnFfZW5fcmVnLmNwdV9pbnRfc3RhdHVzX2VuID0gMDsKKwlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPSAwOworCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSAwOworCW1lbWNweSgmcmVncywgJmRldi0+aXJxX2VuX3JlZywgc2l6ZW9mKHJlZ3MpKTsKKwlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKKworCXJldHVybiBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIElOVF9TVEFUVVNfRU5BQkxFX0FERFJFU1MsCisJCQkJICAgJnJlZ3MuaW50X3N0YXR1c19lbiwgc2l6ZW9mKHJlZ3MpLAorCQkJCSAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKK30KKworLyogZW5hYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCitpbnQgYXRoNmtsX2hpZl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qCisJICogTWFrZSBzdXJlIGludGVycnVwdCBhcmUgZGlzYWJsZWQgYmVmb3JlIHVubWFza2luZyBhdCB0aGUgSElGCisJICogbGF5ZXIuIFRoZSByYXRpb25hbGUgaGVyZSBpcyB0aGF0IGJldHdlZW4gZGV2aWNlIGluc2VydGlvbgorCSAqICh3aGVyZSB3ZSBjbGVhciB0aGUgaW50ZXJydXB0cyB0aGUgZmlyc3QgdGltZSkgYW5kIHdoZW4gSFRDCisJICogaXMgZmluYWxseSByZWFkeSB0byBoYW5kbGUgaW50ZXJydXB0cywgb3RoZXIgc29mdHdhcmUgY2FuIHBlcmZvcm0KKwkgKiB0YXJnZXQgInNvZnQiIHJlc2V0cy4gVGhlIEFUSDZLTCBpbnRlcnJ1cHQgZW5hYmxlcyByZXNldCBiYWNrIHRvIGFuCisJICogImVuYWJsZWQiIHN0YXRlIHdoZW4gdGhpcyBoYXBwZW5zLgorCSAqLworCWF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyhkZXYpOworCisJLyogdW5tYXNrIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJydXB0cyAqLworCWF0aDZrbF9oaWZfaXJxX2VuYWJsZShkZXYtPmFyKTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX2VuYWJsZV9pbnRycyhkZXYpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogZGlzYWJsZSBhbGwgZGV2aWNlIGludGVycnVwdHMgKi8KK2ludCBhdGg2a2xfaGlmX21hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIE1hc2sgdGhlIGludGVycnVwdCBhdCB0aGUgSElGIGxheWVyIHRvIGF2b2lkIGFueSBzdHJheSBpbnRlcnJ1cHQKKwkgKiB0YWtlbiB3aGlsZSB3ZSB6ZXJvIG91dCBvdXIgc2hhZG93IHJlZ2lzdGVycyBpbgorCSAqIGF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycygpLgorCSAqLworCWF0aDZrbF9oaWZfaXJxX2Rpc2FibGUoZGV2LT5hcik7CisKKwlyZXR1cm4gYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKGRldik7Cit9CisKK2ludCBhdGg2a2xfaGlmX3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKKworCS8qCisJICogTk9URTogd2UgYWN0dWFsbHkgZ2V0IHRoZSBibG9jayBzaXplIG9mIGEgbWFpbGJveCBvdGhlciB0aGFuIDAsCisJICogZm9yIFNESU8gdGhlIGJsb2NrIHNpemUgb24gbWFpbGJveCAwIGlzIGFydGlmaWNpYWxseSBzZXQgdG8gMS4KKwkgKiBTbyB3ZSB1c2UgdGhlIGJsb2NrIHNpemUgdGhhdCBpcyBzZXQgZm9yIHRoZSBvdGhlciAzIG1haWxib3hlcy4KKwkgKi8KKwlkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiA9IGRldi0+YXItPm1ib3hfaW5mby5ibG9ja19zaXplOworCisJLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKwlpZiAoKGRldi0+aHRjX2NueHQtPmJsb2NrX3N6ICYgKGRldi0+aHRjX2NueHQtPmJsb2NrX3N6IC0gMSkpICE9IDApIHsKKwkJV0FSTl9PTigxKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX3NldHVwOworCX0KKworCS8qIGFzc2VtYmxlIG1hc2ssIHVzZWQgZm9yIHBhZGRpbmcgdG8gYSBibG9jayAqLworCWRldi0+aHRjX2NueHQtPmJsb2NrX21hc2sgPSBkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAtIDE7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIGJsb2NrIHNpemUgJWQgbWJveCBhZGRyIDB4JXhcbiIsCisJCSAgIGRldi0+aHRjX2NueHQtPmJsb2NrX3N6LCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIpOworCisJLyogdXNiIGRvZXNuJ3Qgc3VwcG9ydCBlbmFibGluZyBpbnRlcnJ1cHRzICovCisJLyogRklYTUU6IHJlbW92ZSBjaGVjayBvbmNlIFVTQiBzdXBwb3J0IGlzIGltcGxlbWVudGVkICovCisJaWYgKGRldi0+YXItPmhpZl90eXBlID09IEFUSDZLTF9ISUZfVFlQRV9VU0IpCisJCXJldHVybiAwOworCisJc3RhdHVzID0gYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKGRldik7CisKK2ZhaWxfc2V0dXA6CisJcmV0dXJuIHN0YXR1czsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmgKaW5kZXggNzk3ZTJkMS4uNjk5YTAzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5oCkBAIC0zNSw2ICszNSw3IEBACiAjZGVmaW5lIE1BWF9TQ0FUVEVSX1JFUV9UUkFOU0ZFUl9TSVpFICAgICgzMiAqIDEwMjQpCiAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFICAgICAgICAweDMwMAorI2RlZmluZSBNQU5VRkFDVFVSRVJfSURfQVI2MDA0X0JBU0UgICAgICAgIDB4NDAwCiAgICAgLyogU0RJTyBtYW51ZmFjdHVyZXIgSUQgYW5kIENvZGVzICovCiAjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRF9BVEg2S0xfQkFTRV9NQVNLICAgICAweEZGMDAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0NPREUgICAgICAgICAgICAgICAgICAweDI3MQkvKiBBdGhlcm9zICovCkBAIC01OSw2ICs2MCwxOCBAQAogLyogbW9kZSB0byBlbmFibGUgc3BlY2lhbCA0LWJpdCBpbnRlcnJ1cHQgYXNzZXJ0aW9uIHdpdGhvdXQgY2xvY2sgKi8KICNkZWZpbmUgU0RJT19JUlFfTU9ERV9BU1lOQ180QklUX0lSUSAgICgxIDw8IDApCiAKKy8qIEhUQyBydW5zIG92ZXIgbWFpbGJveCAwICovCisjZGVmaW5lIEhUQ19NQUlMQk9YCTAKKworI2RlZmluZSBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSyAgICAgMHgwMQorCisvKiBGSVhNRTogYXJlIHRoZXNlIGR1cGxpY2F0ZXMgd2l0aCBNQVhfU0NBVFRFUl8gdmFsdWVzIGluIGhpZi5oPyAqLworI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgICAgICAxNgorI2RlZmluZSBBVEg2S0xfTUFYX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoMTYgKiAxMDI0KQorI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9SRVFTICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgQVRINktMX0hJRl9DT01NVU5JQ0FUSU9OX1RJTUVPVVQJMTAwMAorCiBzdHJ1Y3QgYnVzX3JlcXVlc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIApAQCAtMTg2LDYgKzE5OSwzNCBAQAogCXN0cnVjdCBoaWZfc2NhdHRlcl9pdGVtIHNjYXRfbGlzdFsxXTsKIH07CiAKK3N0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKKwl1OCBob3N0X2ludF9zdGF0dXM7CisJdTggY3B1X2ludF9zdGF0dXM7CisJdTggZXJyb3JfaW50X3N0YXR1czsKKwl1OCBjb3VudGVyX2ludF9zdGF0dXM7CisJdTggbWJveF9mcmFtZTsKKwl1OCByeF9sa2FoZF92YWxpZDsKKwl1OCBob3N0X2ludF9zdGF0dXMyOworCXU4IGdtYm94X3J4X2F2YWlsOworCV9fbGUzMiByeF9sa2FoZFsyXTsKKwlfX2xlMzIgcnhfZ21ib3hfbGthaGRfYWxpYXNbMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHsKKwl1OCBpbnRfc3RhdHVzX2VuOworCXU4IGNwdV9pbnRfc3RhdHVzX2VuOworCXU4IGVycl9pbnRfc3RhdHVzX2VuOworCXU4IGNudHJfaW50X3N0YXR1c19lbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdGg2a2xfZGV2aWNlIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgaXJxX3Byb2NfcmVnOworCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgaXJxX2VuX3JlZzsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqaHRjX2NueHQ7CisJc3RydWN0IGF0aDZrbCAqYXI7Cit9OworCiBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgewogCWludCAoKnJlYWRfd3JpdGVfc3luYykoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyLCB1OCAqYnVmLAogCQkJICAgICAgIHUzMiBsZW4sIHUzMiByZXF1ZXN0KTsKQEAgLTIwMiw3ICsyNDMsMzAgQEAKIAlpbnQgKCpzY2F0X3JlcV9ydykgKHN0cnVjdCBhdGg2a2wgKmFyLAogCQkJICAgIHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxKTsKIAl2b2lkICgqY2xlYW51cF9zY2F0dGVyKShzdHJ1Y3QgYXRoNmtsICphcik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKmRpYWdfcmVhZDMyKShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHJlc3MsIHUzMiAqdmFsdWUpOworCWludCAoKmRpYWdfd3JpdGUzMikoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCBfX2xlMzIgdmFsdWUpOworCWludCAoKmJtaV9yZWFkKShzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbik7CisJaW50ICgqYm1pX3dyaXRlKShzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbik7CisJaW50ICgqcG93ZXJfb24pKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwlpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwl2b2lkICgqc3RvcCkoc3RydWN0IGF0aDZrbCAqYXIpOwogfTsKIAoraW50IGF0aDZrbF9oaWZfc2V0dXAoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7CitpbnQgYXRoNmtsX2hpZl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7CitpbnQgYXRoNmtsX2hpZl9tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOworaW50IGF0aDZrbF9oaWZfcG9sbF9tYm94bXNnX3J4KHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdTMyICpsa19haGQsIGludCB0aW1lb3V0KTsKK2ludCBhdGg2a2xfaGlmX3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpOworaW50IGF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KTsKKworaW50IGF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpOworaW50IGF0aDZrbF9oaWZfaW50cl9iaF9oYW5kbGVyKHN0cnVjdCBhdGg2a2wgKmFyKTsKKworLyogU2NhdHRlciBGdW5jdGlvbiBhbmQgRGVmaW5pdGlvbnMgKi8KK2ludCBhdGg2a2xfaGlmX3N1Ym1pdF9zY2F0X3JlcShzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxLCBib29sIHJlYWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5jCmluZGV4IGY4OGE3YzkuLmIwMTcwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuYwpAQCAtMTUsMTMgKzE1LDMyMSBAQAogICovCiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGlmLW9wcy5oIgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBDQUxDX1RYUlhfUEFEREVEX0xFTihkZXYsIGxlbikgIChfX0FMSUdOX01BU0soKGxlbiksIChkZXYpLT5ibG9ja19tYXNrKSkKIAorLyogRnVuY3Rpb25zIGZvciBUeCBjcmVkaXQgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfZGVwb3NpdChzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgIGludCBjcmVkaXRzKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICJjcmVkaXQgZGVwb3NpdCBlcCAlZCBjcmVkaXRzICVkXG4iLAorCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5jcmVkaXRzICs9IGNyZWRpdHM7CisJZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgKz0gY3JlZGl0czsKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgLT0gY3JlZGl0czsKK30KKworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9pbml0KHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfbGlzdCwKKwkJCSAgICAgICBpbnQgdG90X2NyZWRpdHMpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2VwX2Rpc3Q7CisJaW50IGNvdW50OworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBpbml0IHRvdGFsICVkXG4iLCB0b3RfY3JlZGl0cyk7CisKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKwljcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKKworCQlpZiAodG90X2NyZWRpdHMgPiA0KSB7CisJCQlpZiAoKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKSB8fAorCQkJICAgIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpIHsKKwkJCQlhdGg2a2xfY3JlZGl0X2RlcG9zaXQoY3JlZF9pbmZvLAorCQkJCQkJICAgICAgY3VyX2VwX2Rpc3QsCisJCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJCWN1cl9lcF9kaXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7CisJCQl9CisJCX0KKworCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKKwkJCWF0aDZrbF9jcmVkaXRfZGVwb3NpdChjcmVkX2luZm8sIGN1cl9lcF9kaXN0LAorCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJLyoKKwkJCSAqIENvbnRyb2wgc2VydmljZSBpcyBhbHdheXMgbWFya2VkIGFjdGl2ZSwgaXQKKwkJCSAqIG5ldmVyIGdvZXMgaW5hY3RpdmUgRVZFUi4KKwkJCSAqLworCQkJY3VyX2VwX2Rpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKwkJfSBlbHNlIGlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykKKwkJCS8qIHRoaXMgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBkYXRhIGVuZHBvaW50ICovCisJCQkvKiBGSVhNRTogdGhpcyBsb29rcyBmaXNoeSwgY2hlY2sgKi8KKwkJCWNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QgPSBjdXJfZXBfZGlzdC0+bGlzdDsKKworCQkvKgorCQkgKiBTdHJlYW1zIGhhdmUgdG8gYmUgY3JlYXRlZCAoZXhwbGljaXQgfCBpbXBsaWNpdCkgZm9yIGFsbAorCQkgKiBraW5kcyBvZiB0cmFmZmljLiBCRSBlbmRwb2ludHMgYXJlIGFsc28gaW5hY3RpdmUgaW4gdGhlCisJCSAqIGJlZ2lubmluZy4gV2hlbiBCRSB0cmFmZmljIHN0YXJ0cyBpdCBjcmVhdGVzIGltcGxpY2l0CisJCSAqIHN0cmVhbXMgdGhhdCByZWRpc3RyaWJ1dGVzIGNyZWRpdHMuCisJCSAqCisJCSAqIE5vdGU6IGFsbCBvdGhlciBlbmRwb2ludHMgaGF2ZSBtaW5pbXVtcyBzZXQgYnV0IGFyZQorCQkgKiBpbml0aWFsbHkgZ2l2ZW4gTk8gY3JlZGl0cy4gY3JlZGl0cyB3aWxsIGJlIGRpc3RyaWJ1dGVkCisJCSAqIGFzIHRyYWZmaWMgYWN0aXZpdHkgZGVtYW5kcworCQkgKi8KKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA8PSAwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0NPTlRST0xfU1ZDKQorCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgcmVtYWluaW5nIGRhdGEgZW5kcG9pbnRzLCB3ZSBhc3N1bWUgdGhhdAorCQkJICogZWFjaCBjcmVkX3Blcl9tc2cgYXJlIHRoZSBzYW1lLiBXZSB1c2UgYSBzaW1wbGUKKwkJCSAqIGNhbGN1bGF0aW9uIGhlcmUsIHdlIHRha2UgdGhlIHJlbWFpbmluZyBjcmVkaXRzCisJCQkgKiBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG1heCBtZXNzYWdlcyB0aGlzIGNhbgorCQkJICogY292ZXIgYW5kIHRoZW4gc2V0IGVhY2ggZW5kcG9pbnQncyBub3JtYWwgdmFsdWUKKwkJCSAqIGVxdWFsIHRvIDMvNCB0aGlzIGFtb3VudC4KKwkJCSAqLworCQkJY291bnQgPSAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIC8KKwkJCQkgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZykKKwkJCQkqIGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCQljb3VudCA9IChjb3VudCAqIDMpID4+IDI7CisJCQljb3VudCA9IG1heChjb3VudCwgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZyk7CisJCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY291bnQ7CisKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCQkgICAiY3JlZGl0IGVwICVkIHN2Y19pZCAlZCBjcmVkaXRzICVkIHBlcl9tc2cgJWQgbm9ybSAlZCBtaW4gJWRcbiIsCisJCQkgICBjdXJfZXBfZGlzdC0+ZW5kcG9pbnQsCisJCQkgICBjdXJfZXBfZGlzdC0+c3ZjX2lkLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRpdHMsCisJCQkgICBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSwKKwkJCSAgIGN1cl9lcF9kaXN0LT5jcmVkX21pbik7CisJfQorfQorCisvKiBpbml0aWFsaXplIGFuZCBzZXR1cCBjcmVkaXQgZGlzdHJpYnV0aW9uICovCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbykKK3sKKwl1MTYgc2VydmljZXByaW9yaXR5WzVdOworCisJbWVtc2V0KGNyZWRfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvKSk7CisKKwlzZXJ2aWNlcHJpb3JpdHlbMF0gPSBXTUlfQ09OVFJPTF9TVkM7ICAvKiBoaWdoZXN0ICovCisJc2VydmljZXByaW9yaXR5WzFdID0gV01JX0RBVEFfVk9fU1ZDOworCXNlcnZpY2Vwcmlvcml0eVsyXSA9IFdNSV9EQVRBX1ZJX1NWQzsKKwlzZXJ2aWNlcHJpb3JpdHlbM10gPSBXTUlfREFUQV9CRV9TVkM7CisJc2VydmljZXByaW9yaXR5WzRdID0gV01JX0RBVEFfQktfU1ZDOyAvKiBsb3dlc3QgKi8KKworCS8qIHNldCBwcmlvcml0eSBsaXN0ICovCisJYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3QoaHRjX2hhbmRsZSwgY3JlZF9pbmZvLCBzZXJ2aWNlcHJpb3JpdHksIDUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZHVjZSBhbiBlcCdzIGNyZWRpdHMgYmFjayB0byBhIHNldCBsaW1pdCAqLworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9yZWR1Y2Uoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgaW50IGxpbWl0KQoreworCWludCBjcmVkaXRzOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCByZWR1Y2UgZXAgJWQgbGltaXQgJWRcbiIsCisJCSAgIGVwX2Rpc3QtPmVuZHBvaW50LCBsaW1pdCk7CisKKwllcF9kaXN0LT5jcmVkX2Fzc25nZCA9IGxpbWl0OworCisJaWYgKGVwX2Rpc3QtPmNyZWRpdHMgPD0gbGltaXQpCisJCXJldHVybjsKKworCWNyZWRpdHMgPSBlcF9kaXN0LT5jcmVkaXRzIC0gbGltaXQ7CisJZXBfZGlzdC0+Y3JlZGl0cyAtPSBjcmVkaXRzOworCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyArPSBjcmVkaXRzOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3VwZGF0ZShzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICplcGRpc3RfbGlzdCkKK3sKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJfZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfZGlzdF9saXN0LCBlcGRpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyX2Rpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3QgPiAwKSB7CisJCQljdXJfZGlzdF9saXN0LT5jcmVkaXRzICs9CisJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdDsKKwkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdCA9IDA7CisJCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyA+CisJCQkgICAgY3VyX2Rpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QpCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJY3VyX2Rpc3RfbGlzdCwKKwkJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfYXNzbmdkKTsKKworCQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgPgorCQkJICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSkKKwkJCQlhdGg2a2xfY3JlZGl0X3JlZHVjZShjcmVkX2luZm8sIGN1cl9kaXN0X2xpc3QsCisJCQkJCQkgICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSk7CisKKwkJCWlmICghKGN1cl9kaXN0X2xpc3QtPmRpc3RfZmxhZ3MgJiBIVENfRVBfQUNUSVZFKSkgeworCQkJCWlmIChjdXJfZGlzdF9saXN0LT50eHFfZGVwdGggPT0gMCkKKwkJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJCSAgICAgY3VyX2Rpc3RfbGlzdCwgMCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBIVEMgaGFzIGFuIGVuZHBvaW50IHRoYXQgbmVlZHMgY3JlZGl0cywgZXBfZGlzdCBpcyB0aGUgZW5kcG9pbnQgaW4KKyAqIHF1ZXN0aW9uLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3NlZWsoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICplcF9kaXN0KQoreworCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cmRpc3RfbGlzdDsKKwlpbnQgY3JlZGl0cyA9IDA7CisJaW50IG5lZWQ7CisKKwlpZiAoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykKKwkJZ290byBvdXQ7CisKKwlpZiAoKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9WSV9TVkMpIHx8CisJICAgIChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfVk9fU1ZDKSkKKwkJaWYgKChlcF9kaXN0LT5jcmVkX2Fzc25nZCA+PSBlcF9kaXN0LT5jcmVkX25vcm0pKQorCQkJZ290byBvdXQ7CisKKwkvKgorCSAqIEZvciBhbGwgb3RoZXIgc2VydmljZXMsIHdlIGZvbGxvdyBhIHNpbXBsZSBhbGdvcml0aG0gb2Y6CisJICoKKwkgKiAxLiBjaGVja2luZyB0aGUgZnJlZSBwb29sIGZvciBjcmVkaXRzCisJICogMi4gY2hlY2tpbmcgbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzIGZvciBjcmVkaXRzIHRvIHRha2UKKwkgKi8KKworCWNyZWRpdHMgPSBtaW4oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzLCBlcF9kaXN0LT5zZWVrX2NyZWQpOworCisJaWYgKGNyZWRpdHMgPj0gZXBfZGlzdC0+c2Vla19jcmVkKQorCQlnb3RvIG91dDsKKworCS8qCisJICogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW4gdGhlIGZyZWUgcG9vbCwgdHJ5IHRha2luZyBhd2F5IGZyb20KKwkgKiBsb3dlciBwcmlvcml0eSBzZXJ2aWNlcyBUaGUgcnVsZSBmb3IgdGFraW5nIGF3YXkgY3JlZGl0czoKKwkgKgorCSAqICAgMS4gT25seSB0YWtlIGZyb20gbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzCisJICogICAyLiBPbmx5IHRha2Ugd2hhdCBpcyBhbGxvY2F0ZWQgYWJvdmUgdGhlIG1pbmltdW0gKG5ldmVyCisJICogICAgICBzdGFydmUgYW4gZW5kcG9pbnQgY29tcGxldGVseSkKKwkgKiAgIDMuIE9ubHkgdGFrZSB3aGF0IHlvdSBuZWVkLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGN1cmRpc3RfbGlzdCwKKwkJCQkgICAgJmNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJaWYgKGN1cmRpc3RfbGlzdCA9PSBlcF9kaXN0KQorCQkJYnJlYWs7CisKKwkJbmVlZCA9IGVwX2Rpc3QtPnNlZWtfY3JlZCAtIGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0czsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKSA+PQorCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9taW4pIHsKKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBvbmUgaGFzIGJlZW4gYWxsb2NhdGVkIG1vcmUgdGhhbgorCQkJICogaXQncyBtaW5pbXVtIGFuZCBpdCBoYXMgZW5vdWdoIGNyZWRpdHMgYXNzaWduZWQKKwkJCSAqIGFib3ZlIGl0J3MgbWluaW11bSB0byBmdWxmaWxsIG91ciBuZWVkIHRyeSB0bworCQkJICogdGFrZSBhd2F5IGp1c3QgZW5vdWdoIHRvIGZ1bGZpbGwgb3VyIG5lZWQuCisJCQkgKi8KKwkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGNyZWRfaW5mbywgY3VyZGlzdF9saXN0LAorCQkJCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKTsKKworCQkJaWYgKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+PQorCQkJICAgIGVwX2Rpc3QtPnNlZWtfY3JlZCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjdXJkaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCisJCQlicmVhazsKKwl9CisKKwljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKKworb3V0OgorCS8qIGRpZCB3ZSBmaW5kIHNvbWUgY3JlZGl0cz8gKi8KKwlpZiAoY3JlZGl0cykKKwkJYXRoNmtsX2NyZWRpdF9kZXBvc2l0KGNyZWRfaW5mbywgZXBfZGlzdCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5zZWVrX2NyZWQgPSAwOworfQorCisvKiByZWRpc3RyaWJ1dGUgY3JlZGl0cyBiYXNlZCBvbiBhY3Rpdml0eSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfcmVkaXN0cmlidXRlKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICppbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9kaXN0X2xpc3QpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJkaXN0X2xpc3QsIGVwX2Rpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyZGlzdF9saXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKChjdXJkaXN0X2xpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpICB8fAorCQkgICAgKGN1cmRpc3RfbGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpCisJCQljdXJkaXN0X2xpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+c3ZjX2lkICE9IFdNSV9DT05UUk9MX1NWQykgJiYKKwkJICAgICEoY3VyZGlzdF9saXN0LT5kaXN0X2ZsYWdzICYgSFRDX0VQX0FDVElWRSkpIHsKKwkJCWlmIChjdXJkaXN0X2xpc3QtPnR4cV9kZXB0aCA9PSAwKQorCQkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGluZm8sIGN1cmRpc3RfbGlzdCwgMCk7CisJCQllbHNlCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoaW5mbywKKwkJCQkJCSAgICAgY3VyZGlzdF9saXN0LAorCQkJCQkJICAgICBjdXJkaXN0X2xpc3QtPmNyZWRfbWluKTsKKwkJfQorCX0KK30KKworLyoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbmV2ZXIgZW5kcG9pbnRzIHJlcXVpcmUgY3JlZGl0CisgKiBkaXN0cmlidXRpb25zLiBBIGxvY2sgaXMgaGVsZCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQsIHRoaXMKKyAqIGZ1bmN0aW9uIHNoYWxsIE5PVCBibG9jay4gVGhlIGVwX2Rpc3RfbGlzdCBpcyBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9uCisgKiBzdHJ1Y3R1cmVzIGluIHByaW9yaXRpemVkIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIGNhbGwgdG8gdGhlCisgKiBodGNfc2V0X2NyZWRpdF9kaXN0KCkgYXBpLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCwKKwkJCSAgICAgIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbiByZWFzb24pCit7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEhUQ19DUkVESVRfRElTVF9TRU5EX0NPTVBMRVRFOgorCQlhdGg2a2xfY3JlZGl0X3VwZGF0ZShjcmVkX2luZm8sIGVwX2Rpc3RfbGlzdCk7CisJCWJyZWFrOworCWNhc2UgSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRToKKwkJYXRoNmtsX2NyZWRpdF9yZWRpc3RyaWJ1dGUoY3JlZF9pbmZvLCBlcF9kaXN0X2xpc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+IGNyZWRfaW5mby0+dG90YWxfYXZhaWxfY3JlZGl0cyk7CisJV0FSTl9PTihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPCAwKTsKK30KKwogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y190eF9idWZfYWxpZ24odTggKipidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXU4ICphbGlnbl9hZGRyOwpAQCAtMTAyLDEyICs0MTAsMTIgQEAKIAkJCQlwYWNrZXQtPmluZm8udHguY3JlZF91c2VkOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QudHhxX2RlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKCZlbmRwb2ludC0+dHhxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkgICB0YXJnZXQtPmNyZWRpdF9pbmZvLCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CiAKLQlhdGg2a19jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwKLQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJYXRoNmtsX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZGl0X2luZm8sCisJCQkJICZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAorCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKIH0KQEAgLTExOCw4ICs0MjYsOCBAQAogCWlmIChsaXN0X2VtcHR5KHR4cSkpCiAJCXJldHVybjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJICAgInNlbmQgY29tcGxldGUgZXAgJWQsICglZCBwa3RzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGNvbXBsZXRlIGVwICVkIHBrdHMgJWRcbiIsCiAJCSAgIGVuZHBvaW50LT5laWQsIGdldF9xdWV1ZV9kZXB0aCh0eHEpKTsKIAogCWF0aDZrbF90eF9jb21wbGV0ZShlbmRwb2ludC0+dGFyZ2V0LT5kZXYtPmFyLCB0eHEpOwpAQCAtMTMxLDYgKzQzOSw5IEBACiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQgPSAmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRhaW5lcjsKIAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsICJodGMgdHggY29tcGxldGUgc2Vxbm8gJWRcbiIsCisJCSAgIHBhY2tldC0+aW5mby50eC5zZXFubyk7CisKIAlodGNfdHhfY29tcF91cGRhdGUodGFyZ2V0LCBlbmRwb2ludCwgcGFja2V0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29udGFpbmVyKTsKIAlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZjb250YWluZXIpOwpAQCAtMTQ4LDggKzQ1OSw4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdHhfY29tcHEpOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiaHRjX2FzeW5jX3R4X3NjYXRfY29tcGxldGUgIHRvdGFsIGxlbjogJWQgIGVudHJpZXM6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSJodGMgdHggc2NhdCBjb21wbGV0ZSBsZW4gJWQgZW50cmllcyAlZFxuIiwKIAkJc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKIAlpZiAoc2NhdF9yZXEtPnN0YXR1cykKQEAgLTE5MCwxNiArNTAxLDEzIEBACiAKIAlzZW5kX2xlbiA9IHBhY2tldC0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiJXM6IHRyYW5zbWl0IGxlbiA6ICVkICglcylcbiIsCi0JCSAgIF9fZnVuY19fLCBzZW5kX2xlbiwgc3luYyA/ICJzeW5jIiA6ICJhc3luYyIpOwotCiAJcGFkZGVkX2xlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwgc2VuZF9sZW4pOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiRGV2U2VuZFBhY2tldCwgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKLQkJcGFkZGVkX2xlbiwKLQkJdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCi0JCXN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGlzc3VlIGxlbiAlZCBzZXFubyAlZCBwYWRkZWRfbGVuICVkIG1ib3ggMHglWCAlc1xuIiwKKwkJICAgc2VuZF9sZW4sIHBhY2tldC0+aW5mby50eC5zZXFubywgcGFkZGVkX2xlbiwKKwkJICAgdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCisJCSAgIHN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKIAogCWlmIChzeW5jKSB7CiAJCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmModGFyZ2V0LT5kZXYtPmFyLApAQCAtMjI3LDcgKzUzNSw3IEBACiAJKnJlcV9jcmVkID0gKGxlbiA+IHRhcmdldC0+dGd0X2NyZWRfc3opID8KIAkJICAgICBESVZfUk9VTkRfVVAobGVuLCB0YXJnZXQtPnRndF9jcmVkX3N6KSA6IDE7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjcmVkcyByZXF1aXJlZDolZCBnb3Q6JWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBjaGVjayBuZWVkICVkIGdvdCAlZFxuIiwKIAkJICAgKnJlcV9jcmVkLCBlcC0+Y3JlZF9kaXN0LmNyZWRpdHMpOwogCiAJaWYgKGVwLT5jcmVkX2Rpc3QuY3JlZGl0cyA8ICpyZXFfY3JlZCkgewpAQCAtMjM3LDE2ICs1NDUsMTMgQEAKIAkJLyogU2VlayBtb3JlIGNyZWRpdHMgKi8KIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAqcmVxX2NyZWQgLSBlcC0+Y3JlZF9kaXN0LmNyZWRpdHM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7Ci0KLQkJYXRoNmtfc2Vla19jcmVkaXRzKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7CisJCWF0aDZrbF9jcmVkaXRfc2Vlayh0YXJnZXQtPmNyZWRpdF9pbmZvLCAmZXAtPmNyZWRfZGlzdCk7CiAKIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAwOwogCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCAqcmVxX2NyZWQpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAibm90IGVub3VnaCBjcmVkaXRzIGZvciBlcCAlZCAtIGxlYXZpbmcgcGFja2V0IGluIHF1ZXVlXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCQkgICAiY3JlZGl0IG5vdCBmb3VuZCBmb3IgZXAgJWRcbiIsCiAJCQkJICAgZWlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yNjAsMTcgKzU2NSwxNSBAQAogCQllcC0+Y3JlZF9kaXN0LnNlZWtfY3JlZCA9CiAJCWVwLT5jcmVkX2Rpc3QuY3JlZF9wZXJfbXNnIC0gZXAtPmNyZWRfZGlzdC5jcmVkaXRzOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOwotCi0JCWF0aDZrX3NlZWtfY3JlZGl0cyh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOworCQlhdGg2a2xfY3JlZGl0X3NlZWsodGFyZ2V0LT5jcmVkaXRfaW5mbywgJmVwLT5jcmVkX2Rpc3QpOwogCiAJCS8qIHNlZSBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gZ2V0dGluZyBtb3JlICovCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCBlcC0+Y3JlZF9kaXN0LmNyZWRfcGVyX21zZykgewogCQkJLyogdGVsbCB0aGUgdGFyZ2V0IHdlIG5lZWQgY3JlZGl0cyBBU0FQISAqLwogCQkJKmZsYWdzIHw9IEhUQ19GTEFHU19ORUVEX0NSRURJVF9VUERBVEU7CiAJCQllcC0+ZXBfc3QuY3JlZF9sb3dfaW5kaWNhdGUgKz0gMTsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImhvc3QgbmVlZHMgY3JlZGl0c1xuIik7CisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAorCQkJCSAgICJjcmVkaXQgd2UgbmVlZCBjcmVkaXRzIGFzYXBcbiIpOwogCQl9CiAJfQogCkBAIC0yOTUsOCArNTk4LDggQEAKIAkJcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZW5kcG9pbnQtPnR4cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCSAgbGlzdCk7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJImdvdCBoZWFkIHBrdDoweCVwICwgcXVldWUgZGVwdGg6ICVkXG4iLAorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJImh0YyB0eCBnb3QgcGFja2V0IDB4JXAgcXVldWUgZGVwdGggJWRcbiIsCiAJCQlwYWNrZXQsIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwogCiAJCWxlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwKQEAgLTQwNCw5ICs3MDcsOSBAQAogCiAJCXNjYXRfcmVxLT5sZW4gKz0gbGVuOwogCQlzY2F0X3JlcS0+c2NhdF9lbnRyaWVzKys7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICIlZCwgYWRkaW5nIHBrdCA6IDB4JXAgbGVuOiVkIChyZW1haW5pbmcgc3BhY2U6JWQpXG4iLAotCQkJICAgaSwgcGFja2V0LCBsZW4sIHJlbV9zY2F0KTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggYWRkaW5nICglZCkgcGt0IDB4JXAgc2Vxbm8gJWQgbGVuICVkIHJlbWFpbmluZyAlZFxuIiwKKwkJCSAgIGksIHBhY2tldCwgcGFja2V0LT5pbmZvLnR4LnNlcW5vLCBsZW4sIHJlbV9zY2F0KTsKIAl9CiAKIAkvKiBSb2xsIGJhY2sgc2NhdHRlciBzZXR1cCBpbiBjYXNlIG9mIGFueSBmYWlsdXJlICovCkBAIC00NTUsMTIgKzc1OCwxMiBAQAogCiAJCWlmICghc2NhdF9yZXEpIHsKIAkJCS8qIG5vIHNjYXR0ZXIgcmVzb3VyY2VzICAqLwotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJCSJubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkJImh0YyB0eCBubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAicGt0cyB0byBzY2F0dGVyOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBwa3RzIHRvIHNjYXR0ZXI6ICVkXG4iLAogCQkJICAgbl9zY2F0KTsKIAogCQlzY2F0X3JlcS0+bGVuID0gMDsKQEAgLTQ3OSwxMCArNzgyLDEwIEBACiAJCW5fc2VudF9idW5kbGUrKzsKIAkJdG90X3BrdHNfYnVuZGxlICs9IHNjYXRfcmVxLT5zY2F0X2VudHJpZXM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJICAgInNlbmQgc2NhdHRlciB0b3RhbCBieXRlczogJWQgLCBlbnRyaWVzOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggc2NhdHRlciBieXRlcyAlZCBlbnRyaWVzICVkXG4iLAogCQkJICAgc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7Ci0JCWF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgZmFsc2UpOwogCiAJCWlmIChzdGF0dXMpCiAJCQlicmVhazsKQEAgLTQ5MCw4ICs3OTMsOCBAQAogCiAJKnNlbnRfYnVuZGxlID0gbl9zZW50X2J1bmRsZTsKIAkqbl9idW5kbGVfcGt0cyA9IHRvdF9wa3RzX2J1bmRsZTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIlcyAoc2VudDolZClcbiIsCi0JCSAgIF9fZnVuY19fLCBuX3NlbnRfYnVuZGxlKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHR4IGJ1bmRsZSBzZW50ICVkIHBrdHNcbiIsCisJCSAgIG5fc2VudF9idW5kbGUpOwogCiAJcmV0dXJuOwogfQpAQCAtNTEwLDcgKzgxMyw3IEBACiAJaWYgKGVuZHBvaW50LT50eF9wcm9jX2NudCA+IDEpIHsKIAkJZW5kcG9pbnQtPnR4X3Byb2NfY250LS07CiAJCXNwaW5fdW5sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJodGNfdHJ5X3NlbmQgKGJ1c3kpXG4iKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBidXN5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTg4LDE1ICs4OTEsMTIgQEAKIAkJb3ZlcmZsb3cgPSB0cnVlOwogCiAJaWYgKG92ZXJmbG93KQotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCQkgICAiZXAgJWQsIHR4IHF1ZXVlIHdpbGwgb3ZlcmZsb3cgOiVkICwgdHggZGVwdGg6JWQsIG1heDolZFxuIiwKLQkJCSAgIGVuZHBvaW50LT5laWQsIG92ZXJmbG93LCB0eHFfZGVwdGgsCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkgICAiaHRjIHR4IG92ZXJmbG93IGVwICVkIGRlcHRoICVkIG1heCAlZFxuIiwKKwkJCSAgIGVuZHBvaW50LT5laWQsIHR4cV9kZXB0aCwKIAkJCSAgIGVuZHBvaW50LT5tYXhfdHhxX2RlcHRoKTsKIAogCWlmIChvdmVyZmxvdyAmJiBlcF9jYi50eF9mdWxsKSB7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICJpbmRpY2F0aW5nIG92ZXJmbG93ZWQgdHggcGFja2V0OiAweCVwXG4iLCB0eF9wa3QpOwotCiAJCWlmIChlcF9jYi50eF9mdWxsKGVuZHBvaW50LT50YXJnZXQsIHR4X3BrdCkgPT0KIAkJICAgIEhUQ19TRU5EX0ZVTExfRFJPUCkgewogCQkJZW5kcG9pbnQtPmVwX3N0LnR4X2Ryb3BwZWQgKz0gMTsKQEAgLTYyNSwxMiArOTI1LDEyIEBACiAJICogYXJlIG5vdCBtb2RpZnlpbmcgYW55IHN0YXRlLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JlZF9kaXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkgewotCQllbmRwb2ludCA9IChzdHJ1Y3QgaHRjX2VuZHBvaW50ICopY3JlZF9kaXN0LT5odGNfcnN2ZDsKKwkJZW5kcG9pbnQgPSBjcmVkX2Rpc3QtPmh0Y19lcDsKIAogCQlzcGluX2xvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CiAJCWlmICghbGlzdF9lbXB0eSgmZW5kcG9pbnQtPnR4cSkpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAiZXAgJWQgaGFzICVkIGNyZWRpdHMgYW5kICVkIHBhY2tldHMgaW4gdHggcXVldWVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgY3JlZHMgZXAgJWQgY3JlZGl0cyAlZCBwa3RzICVkXG4iLAogCQkJCSAgIGNyZWRfZGlzdC0+ZW5kcG9pbnQsCiAJCQkJICAgZW5kcG9pbnQtPmNyZWRfZGlzdC5jcmVkaXRzLAogCQkJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwpAQCAtNzA0LDEzICsxMDA0LDEzIEBACiB9CiAKIHZvaWQgYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3Qoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQlzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2Rpc3RfY250eHQsCisJCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRpdF9pbmZvLAogCQkJCXUxNiBzcnZjX3ByaV9vcmRlcltdLCBpbnQgbGlzdF9sZW4pCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQ7CiAJaW50IGksIGVwOwogCi0JdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQgPSBjcmVkX2Rpc3RfY250eHQ7CisJdGFyZ2V0LT5jcmVkaXRfaW5mbyA9IGNyZWRpdF9pbmZvOwogCiAJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5lbmRwb2ludFtFTkRQT0lOVF8wXS5jcmVkX2Rpc3QubGlzdCwKIAkJICAgICAgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwpAQCAtNzM2LDggKzEwMzYsOCBAQAogCXN0cnVjdCBodGNfZW5kcG9pbnQgKmVuZHBvaW50OwogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfdHg6IGVwIGlkOiAlZCwgYnVmOiAweCVwLCBsZW46ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgdHggZXAgaWQgJWQgYnVmIDB4JXAgbGVuICVkXG4iLAogCQkgICBwYWNrZXQtPmVuZHBvaW50LCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCWlmIChwYWNrZXQtPmVuZHBvaW50ID49IEVORFBPSU5UX01BWCkgewpAQCAtNzg3LDggKzEwODcsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHRtcF9wa3QsICZkaXNjYXJkX3EsIGxpc3QpIHsKIAkJcGFja2V0LT5zdGF0dXMgPSAtRUNBTkNFTEVEOwogCQlsaXN0X2RlbCgmcGFja2V0LT5saXN0KTsKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJCSJmbHVzaGluZyB0eCBwa3Q6MHglcCwgbGVuOiVkLCBlcDolZCB0YWc6MHglWFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSJodGMgdHggZmx1c2hpbmcgcGt0IDB4JXAgbGVuICVkICBlcCAlZCB0YWcgMHgleFxuIiwKIAkJCXBhY2tldCwgcGFja2V0LT5hY3RfbGVuLAogCQkJcGFja2V0LT5lbmRwb2ludCwgcGFja2V0LT5pbmZvLnR4LnRhZyk7CiAKQEAgLTg0NCwxMiArMTE0NCwxMyBAQAogCQllbmRwb2ludC0+Y3JlZF9kaXN0LnR4cV9kZXB0aCA9CiAJCQlnZXRfcXVldWVfZGVwdGgoJmVuZHBvaW50LT50eHEpOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJICAgImh0YyB0eCBhY3Rpdml0eSBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkJICAgdGFyZ2V0LT5jcmVkaXRfaW5mbywgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogCi0JCWF0aDZrX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LAotCQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQkJSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKQEAgLTkxOSwxNSArMTIyMCwxNSBAQAogCXBhZGRlZF9sZW4gPSBDQUxDX1RYUlhfUEFEREVEX0xFTih0YXJnZXQsIHJ4X2xlbik7CiAKIAlpZiAocGFkZGVkX2xlbiA+IHBhY2tldC0+YnVmX2xlbikgewotCQlhdGg2a2xfZXJyKCJub3QgZW5vdWdoIHJlY2VpdmUgc3BhY2UgZm9yIHBhY2tldCAtIHBhZGxlbjolZCByZWN2bGVuOiVkIGJ1ZmZlcmxlbjolZFxuIiwKKwkJYXRoNmtsX2Vycigibm90IGVub3VnaCByZWNlaXZlIHNwYWNlIGZvciBwYWNrZXQgLSBwYWRsZW4gJWQgcmVjdmxlbiAlZCBidWZmZXJsZW4gJWRcbiIsCiAJCQkgICBwYWRkZWRfbGVuLCByeF9sZW4sIHBhY2tldC0+YnVmX2xlbik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJICAgImRldl9yeF9wa3QgKDB4JXAgOiBoZHI6MHglWCkgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHJ4IDB4JXAgaGRyIHgleCBsZW4gJWQgbWJveCAweCV4XG4iLAogCQkgICBwYWNrZXQsIHBhY2tldC0+aW5mby5yeC5leHBfaGRyLAotCQkgICBwYWRkZWRfbGVuLCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsICJzeW5jIik7CisJCSAgIHBhZGRlZF9sZW4sIGRldi0+YXItPm1ib3hfaW5mby5odGNfYWRkcik7CiAKIAlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsCiAJCQkJICAgICBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCkBAIC0xMTM3LDggKzE0MzgsOCBAQAogCQkJfQogCiAJCQllbmRwb2ludC0+ZXBfc3QucnhfYnVuZGxlX2Zyb21faGRyICs9IDE7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImh0YyBoZHIgaW5kaWNhdGVzIDolZCBtc2cgY2FuIGJlIGZldGNoZWQgYXMgYSBidW5kbGVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggYnVuZGxlIHBrdHMgJWRcbiIsCiAJCQkJICAgbl9tc2cpOwogCQl9IGVsc2UKIAkJCS8qIEhUQyBoZWFkZXIgb25seSBpbmRpY2F0ZXMgMSBtZXNzYWdlIHRvIGZldGNoICovCkBAIC0xMTkxLDggKzE0OTIsOCBAQAogCQlhdGg2a2xfZXJyKCJodGNfY3RybF9yeCwgZ290IG1lc3NhZ2Ugd2l0aCBsZW46JXp1XG4iLAogCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsCi0JCQkJIlVuZXhwZWN0ZWQgRU5EUE9JTlQgMCBNZXNzYWdlIiwgIiIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywKKwkJCQkiaHRjIHJ4IHVuZXhwZWN0ZWQgZW5kcG9pbnQgMCBtZXNzYWdlIiwgIiIsCiAJCQkJcGFja2V0cy0+YnVmIC0gSFRDX0hEUl9MRU5HVEgsCiAJCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAl9CkBAIC0xMjA5LDkgKzE1MTAsNiBAQAogCWludCB0b3RfY3JlZGl0cyA9IDAsIGk7CiAJYm9vbCBkaXN0ID0gZmFsc2U7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfcHJvY19jcmVkX3JwdCwgY3JlZGl0IHJlcG9ydCBlbnRyaWVzOiVkXG4iLCBuX2VudHJpZXMpOwotCiAJc3Bpbl9sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IG5fZW50cmllczsgaSsrLCBycHQrKykgewpAQCAtMTIyMyw4ICsxNTIxLDkgQEAKIAogCQllbmRwb2ludCA9ICZ0YXJnZXQtPmVuZHBvaW50W3JwdC0+ZWlkXTsKIAotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIgZXAgJWQgZ290ICVkIGNyZWRpdHNcbiIsCi0JCQlycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCSAgICJjcmVkaXQgcmVwb3J0IGVwICVkIGNyZWRpdHMgJWRcbiIsCisJCQkgICBycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKIAogCQllbmRwb2ludC0+ZXBfc3QudHhfY3JlZF9ycHQgKz0gMTsKIAkJZW5kcG9pbnQtPmVwX3N0LmNyZWRfcmV0bmQgKz0gcnB0LT5jcmVkaXRzOwpAQCAtMTI2NCwyMSArMTU2MywxNCBAQAogCQl0b3RfY3JlZGl0cyArPSBycHQtPmNyZWRpdHM7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkgICAicmVwb3J0IGluZGljYXRlZCAlZCBjcmVkaXRzIHRvIGRpc3RyaWJ1dGVcbiIsCi0JCSAgIHRvdF9jcmVkaXRzKTsKLQogCWlmIChkaXN0KSB7CiAJCS8qCiAJCSAqIFRoaXMgd2FzIGEgY3JlZGl0IHJldHVybiBiYXNlZCBvbiBhIGNvbXBsZXRlZCBzZW5kCiAJCSAqIG9wZXJhdGlvbnMgbm90ZSwgdGhpcyBpcyBkb25lIHdpdGggdGhlIGxvY2sgaGVsZAogCQkgKi8KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7Ci0KLQkJYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUodGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQsCi0JCQkJCSZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAotCQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CkBAIC0xMzIwLDE0ICsxNjEyLDE1IEBACiAJCWlmICgobGtfYWhkLT5wcmVfdmFsaWQgPT0gKCh+bGtfYWhkLT5wb3N0X3ZhbGlkKSAmIDB4RkYpKQogCQkgICAgJiYgbmV4dF9sa19haGRzKSB7CiAKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJCQkgICAibGtfYWhkIHJlcG9ydCBmb3VuZCAocHJlIHZhbGlkOjB4JVgsIHBvc3QgdmFsaWQ6MHglWClcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggbGtfYWhkIGZvdW5kIHByZV92YWxpZCAweCV4IHBvc3RfdmFsaWQgMHgleFxuIiwKIAkJCQkgICBsa19haGQtPnByZV92YWxpZCwgbGtfYWhkLT5wb3N0X3ZhbGlkKTsKIAogCQkJLyogbG9vayBhaGVhZCBieXRlcyBhcmUgdmFsaWQsIGNvcHkgdGhlbSBvdmVyICovCiAJCQltZW1jcHkoKHU4ICopJm5leHRfbGtfYWhkc1swXSwgbGtfYWhkLT5sa19haGQsIDQpOwogCi0JCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJOZXh0IExvb2sgQWhlYWQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLAorCQkJCQkiaHRjIHJ4IG5leHQgbG9vayBhaGVhZCIsCiAJCQkJCSIiLCBuZXh0X2xrX2FoZHMsIDQpOwogCiAJCQkqbl9sa19haGRzID0gMTsKQEAgLTEzNDYsNyArMTYzOSw3IEBACiAJCQlidW5kbGVfbGthaGRfcnB0ID0KIAkJCQkoc3RydWN0IGh0Y19idW5kbGVfbGthaGRfcnB0ICopIHJlY29yZF9idWY7CiAKLQkJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkJ1bmRsZSBsa19haGQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJ1bmRsZSBsa19haGQiLAogCQkJCQkiIiwgcmVjb3JkX2J1ZiwgcmVjb3JkLT5sZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEzNzgsMTAgKzE2NzEsOCBAQAogCXU4ICpyZWNvcmRfYnVmOwogCXU4ICpvcmlnX2J1ZjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwgIitodGNfcHJvY190cmFpbGVyIChsZW46JWQpXG4iLCBsZW4pOwotCi0JYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiUmVjdiBUcmFpbGVyIiwgIiIsCi0JCQlidWYsIGxlbik7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyByeCB0cmFpbGVyIGxlbiAlZFxuIiwgbGVuKTsKKwlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19IVEMsIE5VTEwsICIiLCBidWYsIGxlbik7CiAKIAlvcmlnX2J1ZiA9IGJ1ZjsKIAlvcmlnX2xlbiA9IGxlbjsKQEAgLTE0MTgsNyArMTcwOSw3IEBACiAJfQogCiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIFJlY3YgVHJhaWxlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBiYWQgdHJhaWxlciIsCiAJCQkJIiIsIG9yaWdfYnVmLCBvcmlnX2xlbik7CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTQzNiw5ICsxNzI3LDYgQEAKIAlpZiAobl9sa2FoZHMgIT0gTlVMTCkKIAkJKm5fbGthaGRzID0gMDsKIAotCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkhUQyBSZWN2IFBLVCIsICJodGMgIiwKLQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCiAJLyoKIAkgKiBOT1RFOiB3ZSBjYW5ub3QgYXNzdW1lIHRoZSBhbGlnbm1lbnQgb2YgYnVmLCBzbyB3ZSB1c2UgdGhlIHNhZmUKIAkgKiBtYWNyb3MgdG8gcmV0cmlldmUgMTYgYml0IGZpZWxkcy4KQEAgLTE0ODAsOSArMTc2OCw5IEBACiAJaWYgKGxrX2FoZCAhPSBwYWNrZXQtPmluZm8ucnguZXhwX2hkcikgewogCQlhdGg2a2xfZXJyKCIlcygpOiBsa19haGQgbWlzbWF0Y2ghIChwUGt0OjB4JXAgZmxhZ3M6MHglWClcbiIsCiAJCQkgICBfX2Z1bmNfXywgcGFja2V0LCBwYWNrZXQtPmluZm8ucngucnhfZmxhZ3MpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJFeHBlY3RlZCBNZXNzYWdlIGxrX2FoZCIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBleHBlY3RlZCBsa19haGQiLAogCQkJCSIiLCAmcGFja2V0LT5pbmZvLnJ4LmV4cF9oZHIsIDQpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJDdXJyZW50IEZyYW1lIEhlYWRlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBjdXJyZW50IGhlYWRlciIsCiAJCQkJIiIsICh1OCAqKSZsa19haGQsIHNpemVvZihsa19haGQpKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZ290byBmYWlsX3J4OwpAQCAtMTUxOCwxNSArMTgwNiw4IEBACiAKIGZhaWxfcng6CiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIEhUQyBSZWN2IFBLVCIsCi0JCQkJIiIsIHBhY2tldC0+YnVmLAotCQkJCXBhY2tldC0+YWN0X2xlbiA8IDI1NiA/IHBhY2tldC0+YWN0X2xlbiA6IDI1Nik7Ci0JZWxzZSB7Ci0JCWlmIChwYWNrZXQtPmFjdF9sZW4gPiAwKQotCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLAotCQkJCQkiSFRDIC0gQXBwbGljYXRpb24gTXNnIiwgIiIsCi0JCQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCX0KKwkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJhZCBwYWNrZXQiLAorCQkJCSIiLCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTM0LDggKzE4MTUsOCBAQAogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y19yeF9jb21wbGV0ZShzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludCwKIAkJCQkgICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogewotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkgICAiaHRjIGNhbGxpbmcgZXAgJWQgcmVjdiBjYWxsYmFjayBvbiBwYWNrZXQgMHglcFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgcnggY29tcGxldGUgZXAgJWQgcGFja2V0IDB4JXBcbiIsCiAJCQkgICBlbmRwb2ludC0+ZWlkLCBwYWNrZXQpOwogCQllbmRwb2ludC0+ZXBfY2IucngoZW5kcG9pbnQtPnRhcmdldCwgcGFja2V0KTsKIH0KQEAgLTE1NzEsOSArMTg1Miw5IEBACiAKIAlsZW4gPSAwOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkgICAiJXMoKTogKG51bXBhY2tldHM6ICVkICwgYWN0dWFsIDogJWQpXG4iLAotCQkgICBfX2Z1bmNfXywgZ2V0X3F1ZXVlX2RlcHRoKHJ4cSksIG5fc2NhdF9wa3QpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgcnggYnVuZGxlIGRlcHRoICVkIHBrdHMgJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aChyeHEpLCBuX3NjYXRfcGt0KTsKIAogCXNjYXRfcmVxID0gaGlmX3NjYXR0ZXJfcmVxX2dldCh0YXJnZXQtPmRldi0+YXIpOwogCkBAIC0xNjIwLDcgKzE5MDEsNyBAQAogCXNjYXRfcmVxLT5sZW4gPSBsZW47CiAJc2NhdF9yZXEtPnNjYXRfZW50cmllcyA9IGk7CiAKLQlzdGF0dXMgPSBhdGg2a2xkZXZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgdHJ1ZSk7CisJc3RhdHVzID0gYXRoNmtsX2hpZl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCB0cnVlKTsKIAogCWlmICghc3RhdHVzKQogCQkqbl9wa3RfZmV0Y2hlZCA9IGk7CkBAIC0xNjQzLDcgKzE5MjQsNiBAQAogCWludCBzdGF0dXMgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgY29tcF9wa3RxLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQllcCA9ICZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdOwogCiAJCS8qIHByb2Nlc3MgaGVhZGVyIGZvciBlYWNoIG9mIHRoZSByZWN2IHBhY2tldCAqLwpAQCAtMTY1Miw2ICsxOTMyLDggQEAKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CiAKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisKIAkJaWYgKGxpc3RfZW1wdHkoY29tcF9wa3RxKSkgewogCQkJLyoKIAkJCSAqIExhc3QgcGFja2V0J3MgbW9yZSBwYWNrZXQgZmxhZyBpcyBzZXQKQEAgLTE2ODYsMTEgKzE5NjgsMTUgQEAKIAlpbnQgZmV0Y2hlZF9wa3RzOwogCWJvb2wgcGFydF9idW5kbGUgPSBmYWxzZTsKIAlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9yeHE7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCwgKnRtcF9wa3Q7CiAKIAkvKiBub3cgZ28gZmV0Y2ggdGhlIGxpc3Qgb2YgSFRDIHBhY2tldHMgKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkocnhfcGt0cSkpIHsKIAkJZmV0Y2hlZF9wa3RzID0gMDsKIAorCQlJTklUX0xJU1RfSEVBRCgmdG1wX3J4cSk7CisKIAkJaWYgKHRhcmdldC0+cnhfYm5kbF9lbmFibGUgJiYgKGdldF9xdWV1ZV9kZXB0aChyeF9wa3RxKSA+IDEpKSB7CiAJCQkvKgogCQkJICogVGhlcmUgYXJlIGVub3VnaCBwYWNrZXRzIHRvIGF0dGVtcHQgYQpAQCAtMTY5OCwyOCArMTk4NCwyNyBAQAogCQkJICogYWxsb3dlZC4KIAkJCSAqLwogCQkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeF9idW5kbGUodGFyZ2V0LCByeF9wa3RxLAotCQkJCQkJICAgICAgY29tcF9wa3RxLAorCQkJCQkJICAgICAgJnRtcF9yeHEsCiAJCQkJCQkgICAgICAmZmV0Y2hlZF9wa3RzLAogCQkJCQkJICAgICAgcGFydF9idW5kbGUpOwogCQkJaWYgKHN0YXR1cykKLQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCWdvdG8gZmFpbF9yeDsKIAogCQkJaWYgKCFsaXN0X2VtcHR5KHJ4X3BrdHEpKQogCQkJCXBhcnRfYnVuZGxlID0gdHJ1ZTsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAKIAkJaWYgKCFmZXRjaGVkX3BrdHMpIHsKLQkJCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CiAKIAkJCXBhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkocnhfcGt0cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCQkgICBsaXN0KTsKIAotCQkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7Ci0KIAkJCS8qIGZ1bGx5IHN5bmNocm9ub3VzICovCiAJCQlwYWNrZXQtPmNvbXBsZXRpb24gPSBOVUxMOwogCi0JCQlpZiAoIWxpc3RfZW1wdHkocnhfcGt0cSkpCisJCQlpZiAoIWxpc3RfaXNfc2luZ3VsYXIocnhfcGt0cSkpCiAJCQkJLyoKIAkJCQkgKiBsb29rX2FoZWFkcyBpbiBhbGwgcGFja2V0CiAJCQkJICogZXhjZXB0IHRoZSBsYXN0IG9uZSBpbiB0aGUKQEAgLTE3MzEsMTggKzIwMTYsNDIgQEAKIAkJCS8qIGdvIGZldGNoIHRoZSBwYWNrZXQgKi8KIAkJCXN0YXR1cyA9IGF0aDZrbF9odGNfcnhfcGFja2V0KHRhcmdldCwgcGFja2V0LAogCQkJCQkJICAgICAgcGFja2V0LT5hY3RfbGVuKTsKLQkJCWlmIChzdGF0dXMpCi0JCQkJcmV0dXJuIHN0YXR1czsKIAotCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCBjb21wX3BrdHEpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRtcF9yeHEpOworCisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZmFpbF9yeDsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAJfQogCisJcmV0dXJuIDA7CisKK2ZhaWxfcng6CisKKwkvKgorCSAqIENsZWFudXAgYW55IHBhY2tldHMgd2UgYWxsb2NhdGVkIGJ1dCBkaWRuJ3QgdXNlIHRvCisJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCB0bXBfcGt0LCByeF9wa3RxLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOworCQlodGNfcmVjbGFpbV9yeGJ1Zih0YXJnZXQsIHBhY2tldCwKKwkJCQkmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgJnRtcF9yeHEsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0LAorCQkJCSZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdKTsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBpbnQgYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZFtdLCBpbnQgKm51bV9wa3RzKQorCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkLCBpbnQgKm51bV9wa3RzKQogewogCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXRzLCAqdG1wX3BrdDsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludDsKQEAgLTE3NTksNyArMjA2OCw3IEBACiAJICogT24gZmlyc3QgZW50cnkgY29weSB0aGUgbG9va19haGVhZHMgaW50byBvdXIgdGVtcCBhcnJheSBmb3IKIAkgKiBwcm9jZXNzaW5nCiAJICovCi0JbWVtY3B5KGxvb2tfYWhlYWRzLCBtc2dfbG9va19haGVhZCwgc2l6ZW9mKGxvb2tfYWhlYWRzKSk7CisJbG9va19haGVhZHNbMF0gPSBtc2dfbG9va19haGVhZDsKIAogCXdoaWxlICh0cnVlKSB7CiAKQEAgLTE4MjcsMTUgKzIxMzYsNiBAQAogCWlmIChzdGF0dXMpIHsKIAkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBwZW5kaW5nIHJlY3YgbWVzc2FnZXM6ICVkXG4iLAogCQkJICAgc3RhdHVzKTsKLQkJLyoKLQkJICogQ2xlYW51cCBhbnkgcGFja2V0cyB3ZSBhbGxvY2F0ZWQgYnV0IGRpZG4ndCB1c2UgdG8KLQkJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0cywgdG1wX3BrdCwgJnJ4X3BrdHEsIGxpc3QpIHsKLQkJCWxpc3RfZGVsKCZwYWNrZXRzLT5saXN0KTsKLQkJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0cywKLQkJCQkJJnRhcmdldC0+ZW5kcG9pbnRbcGFja2V0cy0+ZW5kcG9pbnRdKTsKLQkJfQogCiAJCS8qIGNsZWFudXAgYW55IHBhY2tldHMgaW4gc3luYyBjb21wbGV0aW9uIHF1ZXVlICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXRzLCB0bXBfcGt0LCAmY29tcF9wa3RxLCBsaXN0KSB7CkBAIC0xODQ2LDcgKzIxNDYsNyBAQAogCiAJCWlmICh0YXJnZXQtPmh0Y19mbGFncyAmIEhUQ19PUF9TVEFURV9TVE9QUElORykgewogCQkJYXRoNmtsX3dhcm4oImhvc3QgaXMgZ29pbmcgdG8gc3RvcCBibG9ja2luZyByZWNlaXZlciBmb3IgaHRjX3N0b3BcbiIpOwotCQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIGZhbHNlKTsKKwkJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCQl9CiAJfQogCkBAIC0xODU2LDcgKzIxNTYsNyBAQAogCSAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWF0aDZrbF93YXJuKCJob3N0IGhhcyBubyByeCBidWZmZXJzIGJsb2NraW5nIHJlY2VpdmVyIHRvIHByZXZlbnQgb3ZlcnJ1blxuIik7Ci0JCWF0aDZrbGRldl9yeF9jb250cm9sKHRhcmdldC0+ZGV2LCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCX0KIAkqbnVtX3BrdHMgPSBuX2ZldGNoZWQ7CiAKQEAgLTE4NzQsMTIgKzIxNzQsMTIgQEAKIAlzdHJ1Y3QgaHRjX2ZyYW1lX2hkciAqaHRjX2hkcjsKIAl1MzIgbG9va19haGVhZDsKIAotCWlmIChhdGg2a2xkZXZfcG9sbF9tYm94bXNnX3J4KHRhcmdldC0+ZGV2LCAmbG9va19haGVhZCwKKwlpZiAoYXRoNmtsX2hpZl9wb2xsX21ib3htc2dfcngodGFyZ2V0LT5kZXYsICZsb29rX2FoZWFkLAogCQkJICAgICAgIEhUQ19UQVJHRVRfUkVTUE9OU0VfVElNRU9VVCkpCiAJCXJldHVybiBOVUxMOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkiaHRjX3dhaXRfZm9yX2N0cmxfbXNnOiBsb29rX2FoZWFkIDogMHglWFxuIiwgbG9va19haGVhZCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJImh0YyByeCB3YWl0IGN0cmwgbG9va19haGVhZCAweCVYXG4iLCBsb29rX2FoZWFkKTsKIAogCWh0Y19oZHIgPSAoc3RydWN0IGh0Y19mcmFtZV9oZHIgKikmbG9va19haGVhZDsKIApAQCAtMTk0Myw4ICsyMjQzLDggQEAKIAogCWRlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKHBrdF9xdWV1ZSk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSJodGNfYWRkX3J4YnVmX211bHRpcGxlOiBlcCBpZDogJWQsIGNudDolZCwgbGVuOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkiaHRjIHJ4IGFkZCBtdWx0aXBsZSBlcCBpZCAlZCBjbnQgJWQgbGVuICVkXG4iLAogCQlmaXJzdF9wa3QtPmVuZHBvaW50LCBkZXB0aCwgZmlyc3RfcGt0LT5idWZfbGVuKTsKIAogCWVuZHBvaW50ID0gJnRhcmdldC0+ZW5kcG9pbnRbZmlyc3RfcGt0LT5lbmRwb2ludF07CkBAIC0xOTY5LDggKzIyNjksOCBAQAogCS8qIGNoZWNrIGlmIHdlIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIGEgbmV3IGJ1ZmZlciAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWlmICh0YXJnZXQtPmVwX3dhaXRpbmcgPT0gZmlyc3RfcGt0LT5lbmRwb2ludCkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkJCSJyZWNlaXZlciB3YXMgYmxvY2tlZCBvbiBlcDolZCwgdW5ibG9ja2luZy5cbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSJodGMgcnggYmxvY2tlZCBvbiBlcCAlZCwgdW5ibG9ja2luZ1xuIiwKIAkJCQl0YXJnZXQtPmVwX3dhaXRpbmcpOwogCQkJdGFyZ2V0LT5yeF9zdF9mbGFncyAmPSB+SFRDX1JFQ1ZfV0FJVF9CVUZGRVJTOwogCQkJdGFyZ2V0LT5lcF93YWl0aW5nID0gRU5EUE9JTlRfTUFYOwpAQCAtMTk4Miw3ICsyMjgyLDcgQEAKIAogCWlmIChyeF91bmJsb2NrICYmICEodGFyZ2V0LT5odGNfZmxhZ3MgJiBIVENfT1BfU1RBVEVfU1RPUFBJTkcpKQogCQkvKiBUT0RPIDogaW1wbGVtZW50IGEgYnVmZmVyIHRocmVzaG9sZCBjb3VudD8gKi8KLQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOworCQlhdGg2a2xfaGlmX3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIwMDQsOCArMjMwNCw4IEBACiAJCQkJCSAmZW5kcG9pbnQtPnJ4X2J1ZnEsIGxpc3QpIHsKIAkJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+cnhfbG9jayk7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImZsdXNoaW5nIHJ4IHBrdDoweCVwLCBsZW46JWQsIGVwOiVkXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCQkgICAiaHRjIHJ4IGZsdXNoIHBrdCAweCVwICBsZW4gJWQgIGVwICVkXG4iLAogCQkJCSAgIHBhY2tldCwgcGFja2V0LT5idWZfbGVuLAogCQkJCSAgIHBhY2tldC0+ZW5kcG9pbnQpOwogCQkJZGV2X2tmcmVlX3NrYihwYWNrZXQtPnBrdF9jbnR4dCk7CkBAIC0yMDI4LDggKzIzMjgsOCBAQAogCXVuc2lnbmVkIGludCBtYXhfbXNnX3N6ID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCSAgICJodGNfY29ubl9zZXJ2aWNlLCB0YXJnZXQ6MHglcCBzZXJ2aWNlIGlkOjB4JVhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJICAgImh0YyBjb25uZWN0IHNlcnZpY2UgdGFyZ2V0IDB4JXAgc2VydmljZSBpZCAweCV4XG4iLAogCQkgICB0YXJnZXQsIGNvbm5fcmVxLT5zdmNfaWQpOwogCiAJaWYgKGNvbm5fcmVxLT5zdmNfaWQgPT0gSFRDX0NUUkxfUlNWRF9TVkMpIHsKQEAgLTIxMTUsNyArMjQxNSw3IEBACiAJZW5kcG9pbnQtPmxlbl9tYXggPSBtYXhfbXNnX3N6OwogCWVuZHBvaW50LT5lcF9jYiA9IGNvbm5fcmVxLT5lcF9jYjsKIAllbmRwb2ludC0+Y3JlZF9kaXN0LnN2Y19pZCA9IGNvbm5fcmVxLT5zdmNfaWQ7Ci0JZW5kcG9pbnQtPmNyZWRfZGlzdC5odGNfcnN2ZCA9IGVuZHBvaW50OworCWVuZHBvaW50LT5jcmVkX2Rpc3QuaHRjX2VwID0gZW5kcG9pbnQ7CiAJZW5kcG9pbnQtPmNyZWRfZGlzdC5lbmRwb2ludCA9IGFzc2lnbmVkX2VwOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QuY3JlZF9zeiA9IHRhcmdldC0+dGd0X2NyZWRfc3o7CiAKQEAgLTIxNzIsNiArMjQ3Miw3IEBACiAJfQogCiAJLyogcmVzZXQgZGlzdHJpYnV0aW9uIGxpc3QgKi8KKwkvKiBGSVhNRTogZnJlZSBleGlzdGluZyBlbnRyaWVzICovCiAJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogfQogCkBAIC0yMjAxLDggKzI1MDIsOCBAQAogCXRhcmdldC0+bXNnX3Blcl9ibmRsX21heCA9IG1pbih0YXJnZXQtPm1heF9zY2F0X2VudHJpZXMsCiAJCQkJICAgICAgIHRhcmdldC0+bXNnX3Blcl9ibmRsX21heCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQuIG1heCBtc2cgcGVyIGh0YyBidW5kbGU6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQgbXNnX3Blcl9ibmRsX21heCAlZFxuIiwKIAkJICAgdGFyZ2V0LT5tc2dfcGVyX2JuZGxfbWF4KTsKIAogCS8qIE1heCByeCBidW5kbGUgc2l6ZSBpcyBsaW1pdGVkIGJ5IHRoZSBtYXggdHggYnVuZGxlIHNpemUgKi8KQEAgLTIyMTEsNyArMjUxMiw3IEBACiAJdGFyZ2V0LT5tYXhfdHhfYm5kbF9zeiA9IG1pbihISUZfTUJPWDBfRVhUX1dJRFRILAogCQkJCSAgICAgdGFyZ2V0LT5tYXhfeGZlcl9zenBlcl9zY2F0cmVxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICJtYXggcmVjdjogJWQgbWF4IHNlbmQ6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiaHRjIG1heF9yeF9ibmRsX3N6ICVkIG1heF90eF9ibmRsX3N6ICVkXG4iLAogCQkgICB0YXJnZXQtPm1heF9yeF9ibmRsX3N6LCB0YXJnZXQtPm1heF90eF9ibmRsX3N6KTsKIAogCWlmICh0YXJnZXQtPm1heF90eF9ibmRsX3N6KQpAQCAtMjI0Miw2ICsyNTQzLDEyIEBACiAJc3RydWN0IGh0Y19zZXJ2aWNlX2Nvbm5lY3RfcmVzcCByZXNwOwogCWludCBzdGF0dXM7CiAKKwkvKiBGSVhNRTogcmVtb3ZlIG9uY2UgVVNCIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQgKi8KKwlpZiAodGFyZ2V0LT5kZXYtPmFyLT5oaWZfdHlwZSA9PSBBVEg2S0xfSElGX1RZUEVfVVNCKSB7CisJCWF0aDZrbF9lcnIoIkhUQyBkb2Vzbid0IHN1cHBvcnQgVVNCIHlldC4gUGF0aWVuY2UhXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwogCS8qIHdlIHNob3VsZCBiZSBnZXR0aW5nIDEgY29udHJvbCBtZXNzYWdlIHRoYXQgdGhlIHRhcmdldCBpcyByZWFkeSAqLwogCXBhY2tldCA9IGh0Y193YWl0X2Zvcl9jdHJsX21zZyh0YXJnZXQpOwogCkBAIC0yMjY1LDggKzI1NzIsOCBAQAogCXRhcmdldC0+dGd0X2NyZWRzID0gbGUxNl90b19jcHUocmR5X21zZy0+dmVyMl8wX2luZm8uY3JlZF9jbnQpOwogCXRhcmdldC0+dGd0X2NyZWRfc3ogPSBsZTE2X3RvX2NwdShyZHlfbXNnLT52ZXIyXzBfaW5mby5jcmVkX3N6KTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJICAgInRhcmdldCByZWFkeTogY3JlZGl0czogJWQgY3JlZGl0IHNpemU6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkgICAiaHRjIHRhcmdldCByZWFkeSBjcmVkaXRzICVkIHNpemUgJWRcbiIsCiAJCSAgIHRhcmdldC0+dGd0X2NyZWRzLCB0YXJnZXQtPnRndF9jcmVkX3N6KTsKIAogCS8qIGNoZWNrIGlmIHRoaXMgaXMgYW4gZXh0ZW5kZWQgcmVhZHkgbWVzc2FnZSAqLwpAQCAtMjI4MCw3ICsyNTg3LDcgQEAKIAkJdGFyZ2V0LT5tc2dfcGVyX2JuZGxfbWF4ID0gMDsKIAl9CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAidXNpbmcgaHRjIHByb3RvY29sIHZlcnNpb24gOiAlcyAoJWQpXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiaHRjIHVzaW5nIHByb3RvY29sICVzICglZClcbiIsCiAJCSAgKHRhcmdldC0+aHRjX3RndF92ZXIgPT0gSFRDX1ZFUlNJT05fMlAwKSA/ICIyLjAiIDogIj49IDIuMSIsCiAJCSAgdGFyZ2V0LT5odGNfdGd0X3Zlcik7CiAKQEAgLTIzMDAsNiArMjYwNywxMCBAQAogCXN0YXR1cyA9IGF0aDZrbF9odGNfY29ubl9zZXJ2aWNlKCh2b2lkICopdGFyZ2V0LCAmY29ubmVjdCwgJnJlc3ApOwogCiAJaWYgKHN0YXR1cykKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgY2FsbCBkb2Vzbid0IG1ha2Ugc2Vuc2UsIHRoZSBjYWxsZXIgc2hvdWxkCisJCSAqIGNhbGwgYXRoNmtsX2h0Y19jbGVhbnVwKCkgd2hlbiBpdCB3YW50cyByZW1vdmUgaHRjCisJCSAqLwogCQlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcih0YXJnZXQtPmRldi0+YXIpOwogCiBmYWlsX3dhaXRfdGFyZ2V0OgpAQCAtMjMyMCw4ICsyNjMxLDExIEBACiAJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldDsKIAlpbnQgc3RhdHVzOwogCisJbWVtc2V0KCZ0YXJnZXQtPmRldi0+aXJxX3Byb2NfcmVnLCAwLAorCSAgICAgICBzaXplb2YodGFyZ2V0LT5kZXYtPmlycV9wcm9jX3JlZykpOworCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBjaGlwIGxldmVsICovCi0JYXRoNmtsZGV2X2Rpc2FibGVfaW50cnModGFyZ2V0LT5kZXYpOworCWF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyh0YXJnZXQtPmRldik7CiAKIAl0YXJnZXQtPmh0Y19mbGFncyA9IDA7CiAJdGFyZ2V0LT5yeF9zdF9mbGFncyA9IDA7CkBAIC0yMzM0LDggKzI2NDgsOCBAQAogCX0KIAogCS8qIE5PVEU6IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZGlzdHJpYnV0aW9uIGxpc3QgaXMgRU5EUE9JTlRfMCAqLwotCWF0aDZrX2NyZWRpdF9pbml0KHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCSAgdGFyZ2V0LT50Z3RfY3JlZHMpOworCWF0aDZrbF9jcmVkaXRfaW5pdCh0YXJnZXQtPmNyZWRpdF9pbmZvLCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKKwkJCSAgIHRhcmdldC0+dGd0X2NyZWRzKTsKIAogCWR1bXBfY3JlZF9kaXN0X3N0YXRzKHRhcmdldCk7CiAKQEAgLTIzNDYsNyArMjY2MCw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAKIAkvKiB1bm1hc2sgaW50ZXJydXB0cyAqLwotCXN0YXR1cyA9IGF0aDZrbGRldl91bm1hc2tfaW50cnModGFyZ2V0LT5kZXYpOworCXN0YXR1cyA9IGF0aDZrbF9oaWZfdW5tYXNrX2ludHJzKHRhcmdldC0+ZGV2KTsKIAogCWlmIChzdGF0dXMpCiAJCWF0aDZrbF9odGNfc3RvcCh0YXJnZXQpOwpAQCAtMjM1NCw2ICsyNjY4LDQ0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBhdGg2a2xfaHRjX3Jlc2V0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpCit7CisJdTMyIGJsb2NrX3NpemUsIGN0cmxfYnVmc3o7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldDsKKwlpbnQgaTsKKworCXJlc2V0X2VwX3N0YXRlKHRhcmdldCk7CisKKwlibG9ja19zaXplID0gdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uYmxvY2tfc2l6ZTsKKworCWN0cmxfYnVmc3ogPSAoYmxvY2tfc2l6ZSA+IEhUQ19NQVhfQ1RSTF9NU0dfTEVOKSA/CisJCSAgICAgIChibG9ja19zaXplICsgSFRDX0hEUl9MRU5HVEgpIDoKKwkJICAgICAgKEhUQ19NQVhfQ1RSTF9NU0dfTEVOICsgSFRDX0hEUl9MRU5HVEgpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT05UUk9MX0JVRkZFUlM7IGkrKykgeworCQlwYWNrZXQgPSBremFsbG9jKHNpemVvZigqcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGFja2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcGFja2V0LT5idWZfc3RhcnQgPSBremFsbG9jKGN0cmxfYnVmc3osIEdGUF9LRVJORUwpOworCQlpZiAoIXBhY2tldC0+YnVmX3N0YXJ0KSB7CisJCQlrZnJlZShwYWNrZXQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlwYWNrZXQtPmJ1Zl9sZW4gPSBjdHJsX2J1ZnN6OworCQlpZiAoaSA8IE5VTV9DT05UUk9MX1JYX0JVRkZFUlMpIHsKKwkJCXBhY2tldC0+YWN0X2xlbiA9IDA7CisJCQlwYWNrZXQtPmJ1ZiA9IHBhY2tldC0+YnVmX3N0YXJ0OworCQkJcGFja2V0LT5lbmRwb2ludCA9IEVORFBPSU5UXzA7CisJCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZ0YXJnZXQtPmZyZWVfY3RybF9yeGJ1Zik7CisJCX0gZWxzZQorCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmdGFyZ2V0LT5mcmVlX2N0cmxfdHhidWYpOworCX0KKworCXJldHVybiAwOworfQorCiAvKiBodGNfc3RvcDogc3RvcCBpbnRlcnJ1cHQgcmVjZXB0aW9uLCBhbmQgZmx1c2ggYWxsIHF1ZXVlZCBidWZmZXJzICovCiB2b2lkIGF0aDZrbF9odGNfc3RvcChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KQogewpAQCAtMjM2NiwyMSArMjcxOCwxOSBAQAogCSAqIGZ1bmN0aW9uIHJldHVybnMgYWxsIHBlbmRpbmcgSElGIEkvTyBoYXMgY29tcGxldGVkLCB3ZSBjYW4KIAkgKiBzYWZlbHkgZmx1c2ggdGhlIHF1ZXVlcy4KIAkgKi8KLQlhdGg2a2xkZXZfbWFza19pbnRycyh0YXJnZXQtPmRldik7CisJYXRoNmtsX2hpZl9tYXNrX2ludHJzKHRhcmdldC0+ZGV2KTsKIAogCWF0aDZrbF9odGNfZmx1c2hfdHhlcF9hbGwodGFyZ2V0KTsKIAogCWF0aDZrbF9odGNfZmx1c2hfcnhfYnVmKHRhcmdldCk7CiAKLQlyZXNldF9lcF9zdGF0ZSh0YXJnZXQpOworCWF0aDZrbF9odGNfcmVzZXQodGFyZ2V0KTsKIH0KIAogdm9pZCAqYXRoNmtsX2h0Y19jcmVhdGUoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCA9IE5VTEw7Ci0Jc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldDsKLQlpbnQgc3RhdHVzID0gMCwgaSA9IDA7Ci0JdTMyIGJsb2NrX3NpemUsIGN0cmxfYnVmc3o7CisJaW50IHN0YXR1cyA9IDA7CiAKIAl0YXJnZXQgPSBremFsbG9jKHNpemVvZigqdGFyZ2V0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0YXJnZXQpIHsKQEAgLTIzOTIsNyArMjc0Miw3IEBACiAJaWYgKCF0YXJnZXQtPmRldikgewogCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBmYWlsX2NyZWF0ZV9odGM7CisJCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwogCX0KIAogCXNwaW5fbG9ja19pbml0KCZ0YXJnZXQtPmh0Y19sb2NrKTsKQEAgLTI0MDcsNDkgKzI3NTcsMjAgQEAKIAl0YXJnZXQtPmRldi0+aHRjX2NueHQgPSB0YXJnZXQ7CiAJdGFyZ2V0LT5lcF93YWl0aW5nID0gRU5EUE9JTlRfTUFYOwogCi0JcmVzZXRfZXBfc3RhdGUodGFyZ2V0KTsKLQotCXN0YXR1cyA9IGF0aDZrbGRldl9zZXR1cCh0YXJnZXQtPmRldik7Ci0KKwlzdGF0dXMgPSBhdGg2a2xfaGlmX3NldHVwKHRhcmdldC0+ZGV2KTsKIAlpZiAoc3RhdHVzKQotCQlnb3RvIGZhaWxfY3JlYXRlX2h0YzsKKwkJZ290byBlcnJfaHRjX2NsZWFudXA7CiAKLQlibG9ja19zaXplID0gYXItPm1ib3hfaW5mby5ibG9ja19zaXplOwotCi0JY3RybF9idWZzeiA9IChibG9ja19zaXplID4gSFRDX01BWF9DVFJMX01TR19MRU4pID8KLQkJICAgICAgKGJsb2NrX3NpemUgKyBIVENfSERSX0xFTkdUSCkgOgotCQkgICAgICAoSFRDX01BWF9DVFJMX01TR19MRU4gKyBIVENfSERSX0xFTkdUSCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPTlRST0xfQlVGRkVSUzsgaSsrKSB7Ci0JCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKCpwYWNrZXQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWNrZXQpCi0JCQlicmVhazsKLQotCQlwYWNrZXQtPmJ1Zl9zdGFydCA9IGt6YWxsb2MoY3RybF9idWZzeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFja2V0LT5idWZfc3RhcnQpIHsKLQkJCWtmcmVlKHBhY2tldCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBhY2tldC0+YnVmX2xlbiA9IGN0cmxfYnVmc3o7Ci0JCWlmIChpIDwgTlVNX0NPTlRST0xfUlhfQlVGRkVSUykgewotCQkJcGFja2V0LT5hY3RfbGVuID0gMDsKLQkJCXBhY2tldC0+YnVmID0gcGFja2V0LT5idWZfc3RhcnQ7Ci0JCQlwYWNrZXQtPmVuZHBvaW50ID0gRU5EUE9JTlRfMDsKLQkJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRhcmdldC0+ZnJlZV9jdHJsX3J4YnVmKTsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZ0YXJnZXQtPmZyZWVfY3RybF90eGJ1Zik7Ci0JfQotCi1mYWlsX2NyZWF0ZV9odGM6Ci0JaWYgKGkgIT0gTlVNX0NPTlRST0xfQlVGRkVSUyB8fCBzdGF0dXMpIHsKLQkJaWYgKHRhcmdldCkgewotCQkJYXRoNmtsX2h0Y19jbGVhbnVwKHRhcmdldCk7Ci0JCQl0YXJnZXQgPSBOVUxMOwotCQl9Ci0JfQorCXN0YXR1cyA9IGF0aDZrbF9odGNfcmVzZXQodGFyZ2V0KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycl9odGNfY2xlYW51cDsKIAogCXJldHVybiB0YXJnZXQ7CisKK2Vycl9odGNfY2xlYW51cDoKKwlhdGg2a2xfaHRjX2NsZWFudXAodGFyZ2V0KTsKKworCXJldHVybiBOVUxMOwogfQogCiAvKiBjbGVhbnVwIHRoZSBIVEMgaW5zdGFuY2UgKi8KQEAgLTI0NTcsNyArMjc3OCw5IEBACiB7CiAJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCwgKnRtcF9wYWNrZXQ7CiAKLQlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcih0YXJnZXQtPmRldi0+YXIpOworCS8qIEZJWE1FOiByZW1vdmUgY2hlY2sgb25jZSBVU0Igc3VwcG9ydCBpcyBpbXBsZW1lbnRlZCAqLworCWlmICh0YXJnZXQtPmRldi0+YXItPmhpZl90eXBlICE9IEFUSDZLTF9ISUZfVFlQRV9VU0IpCisJCWF0aDZrbF9oaWZfY2xlYW51cF9zY2F0dGVyKHRhcmdldC0+ZGV2LT5hcik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCB0bXBfcGFja2V0LAogCQkJJnRhcmdldC0+ZnJlZV9jdHJsX3R4YnVmLCBsaXN0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuaAppbmRleCA4Y2UwYzJjLi41NzY3MmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmgKQEAgLTM5Myw3ICszOTMsNyBAQAogCWludCBjcmVkX3Blcl9tc2c7CiAKIAkvKiByZXNlcnZlZCBmb3IgSFRDIHVzZSAqLwotCXZvaWQgKmh0Y19yc3ZkOworCXN0cnVjdCBodGNfZW5kcG9pbnQgKmh0Y19lcDsKIAogCS8qCiAJICogY3VycmVudCBkZXB0aCBvZiBUWCBxdWV1ZSAsIGkuZS4gbWVzc2FnZXMgd2FpdGluZyBmb3IgY3JlZGl0cwpAQCAtNDE0LDkgKzQxNCwxMSBAQAogCUhUQ19DUkVESVRfRElTVF9TRUVLX0NSRURJVFMsCiB9OwogCi1zdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvIHsKK3N0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvIHsKIAlpbnQgdG90YWxfYXZhaWxfY3JlZGl0czsKIAlpbnQgY3VyX2ZyZWVfY3JlZGl0czsKKworCS8qIGxpc3Qgb2YgbG93ZXN0IHByaW9yaXR5IGVuZHBvaW50cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbG93ZXN0cHJpX2VwX2Rpc3Q7CiB9OwogCkBAIC01MDgsMTAgKzUxMCwxMyBAQAogLyogb3VyIEhUQyB0YXJnZXQgc3RhdGUgKi8KIHN0cnVjdCBodGNfdGFyZ2V0IHsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50IGVuZHBvaW50W0VORFBPSU5UX01BWF07CisKKwkvKiBjb250YWlucyBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjcmVkX2Rpc3RfbGlzdDsKKwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3R4YnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3J4YnVmOwotCXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfZGlzdF9jbnR4dDsKKwlzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZGl0X2luZm87CiAJaW50IHRndF9jcmVkczsKIAl1bnNpZ25lZCBpbnQgdGd0X2NyZWRfc3o7CiAJc3BpbmxvY2tfdCBodGNfbG9jazsKQEAgLTU0Miw3ICs1NDcsNyBAQAogCiB2b2lkICphdGg2a2xfaHRjX2NyZWF0ZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9odGNfc2V0X2NyZWRpdF9kaXN0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCi0JCQkJc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAorCQkJCXN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCiAJCQkJdTE2IHN2Y19wcmlfb3JkZXJbXSwgaW50IGxlbik7CiBpbnQgYXRoNmtsX2h0Y193YWl0X3RhcmdldChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KTsKIGludCBhdGg2a2xfaHRjX3N0YXJ0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpOwpAQCAtNTYzLDcgKzU2OCwxMCBAQAogaW50IGF0aDZrbF9odGNfYWRkX3J4YnVmX211bHRpcGxlKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwa3RxKTsKIGludCBhdGg2a2xfaHRjX3J4bXNnX3BlbmRpbmdfaGFuZGxlcihzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkW10sIGludCAqbl9wa3RzKTsKKwkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZCwgaW50ICpuX3BrdHMpOworCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaHRjX3BrdF9pbmZvKHN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQsIHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19oaWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmIxY2M3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgotICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgotICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiY29yZS5oIgotI2luY2x1ZGUgInRhcmdldC5oIgotI2luY2x1ZGUgImhpZi1vcHMuaCIKLSNpbmNsdWRlICJodGNfaGlmLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2RlZmluZSBNQUlMQk9YX0ZPUl9CTE9DS19TSVpFICAgICAgICAgIDEKLQotI2RlZmluZSBBVEg2S0xfVElNRV9RVUFOVFVNCTEwICAvKiBpbiBtcyAqLwotCi1zdGF0aWMgaW50IGF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqcmVxLCBib29sIGZyb21fZG1hKQotewotCXU4ICpidWY7Ci0JaW50IGk7Ci0KLQlidWYgPSByZXEtPnZpcnRfZG1hX2J1ZjsKLQotCWZvciAoaSA9IDA7IGkgPCByZXEtPnNjYXRfZW50cmllczsgaSsrKSB7Ci0KLQkJaWYgKGZyb21fZG1hKQotCQkJbWVtY3B5KHJlcS0+c2NhdF9saXN0W2ldLmJ1ZiwgYnVmLAotCQkJICAgICAgIHJlcS0+c2NhdF9saXN0W2ldLmxlbik7Ci0JCWVsc2UKLQkJCW1lbWNweShidWYsIHJlcS0+c2NhdF9saXN0W2ldLmJ1ZiwKLQkJCSAgICAgICByZXEtPnNjYXRfbGlzdFtpXS5sZW4pOwotCi0JCWJ1ZiArPSByZXEtPnNjYXRfbGlzdFtpXS5sZW47Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCi17Ci0Jc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCA9IGNvbnRleHQ7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSAgICJhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyIChwa3Q6MHglcCAsIHN0YXR1czogJWRcbiIsCi0JCSAgIHBhY2tldCwgc3RhdHVzKTsKLQotCXBhY2tldC0+c3RhdHVzID0gc3RhdHVzOwotCXBhY2tldC0+Y29tcGxldGlvbihwYWNrZXQtPmNvbnRleHQsIHBhY2tldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19kYmdfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCXUzMiBkdW1teTsKLQlpbnQgc3RhdHVzOwotCi0JYXRoNmtsX2VycigidGFyZ2V0IGRlYnVnIGludGVycnVwdFxuIik7Ci0KLQlhdGg2a2xfdGFyZ2V0X2ZhaWx1cmUoZGV2LT5hcik7Ci0KLQkvKgotCSAqIHJlYWQgY291bnRlciB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGUgZGVidWcgZXJyb3IgaW50ZXJydXB0IGlzCi0JICogY291bnRlciAwLgotCSAqLwotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgQ09VTlRfREVDX0FERFJFU1MsCi0JCQkJICAgICAodTggKikmZHVtbXksIDQsIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKLQlpZiAoc3RhdHVzKQotCQlXQVJOX09OKDEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogbWFpbGJveCByZWN2IG1lc3NhZ2UgcG9sbGluZyAqLwotaW50IGF0aDZrbGRldl9wb2xsX21ib3htc2dfcngoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgdTMyICpsa19haGQsCi0JCQkgICAgICBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyAqcmc7Ci0JaW50IHN0YXR1cyA9IDAsIGk7Ci0JdTggaHRjX21ib3ggPSAxIDw8IEhUQ19NQUlMQk9YOwotCi0JZm9yIChpID0gdGltZW91dCAvIEFUSDZLTF9USU1FX1FVQU5UVU07IGkgPiAwOyBpLS0pIHsKLQkJLyogdGhpcyBpcyB0aGUgc3RhbmRhcmQgSElGIHdheSwgbG9hZCB0aGUgcmVnIHRhYmxlICovCi0JCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSE9TVF9JTlRfU1RBVFVTX0FERFJFU1MsCi0JCQkJCSAgICAgKHU4ICopICZkZXYtPmlycV9wcm9jX3JlZywKLQkJCQkJICAgICBzaXplb2YoZGV2LT5pcnFfcHJvY19yZWcpLAotCQkJCQkgICAgIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gcmVhZCByZWcgdGFibGVcbiIpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciBNQk9YIGRhdGEgYW5kIHZhbGlkIGxvb2thaGVhZCAqLwotCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcuaG9zdF9pbnRfc3RhdHVzICYgaHRjX21ib3gpIHsKLQkJCWlmIChkZXYtPmlycV9wcm9jX3JlZy5yeF9sa2FoZF92YWxpZCAmCi0JCQkgICAgaHRjX21ib3gpIHsKLQkJCQkvKgotCQkJCSAqIE1haWxib3ggaGFzIGEgbWVzc2FnZSBhbmQgdGhlIGxvb2sgYWhlYWQKLQkJCQkgKiBpcyB2YWxpZC4KLQkJCQkgKi8KLQkJCQlyZyA9ICZkZXYtPmlycV9wcm9jX3JlZzsKLQkJCQkqbGtfYWhkID0KLQkJCQkJbGUzMl90b19jcHUocmctPnJ4X2xrYWhkW0hUQ19NQUlMQk9YXSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBkZWxheSBhIGxpdHRsZSAgKi8KLQkJbWRlbGF5KEFUSDZLTF9USU1FX1FVQU5UVU0pOwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsICJyZXRyeSBtYm94IHBvbGwgOiAlZFxuIiwgaSk7Ci0JfQotCi0JaWYgKGkgPT0gMCkgewotCQlhdGg2a2xfZXJyKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJlY3YgbWVzc2FnZVxuIik7Ci0JCXN0YXR1cyA9IC1FVElNRTsKLQkJLyogY2hlY2sgaWYgdGhlIHRhcmdldCBhc3NlcnRlZCAqLwotCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcuY291bnRlcl9pbnRfc3RhdHVzICYKLQkJICAgIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKQotCQkJLyoKLQkJCSAqIFRhcmdldCBmYWlsdXJlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBvZgotCQkJICogYW4gYXNzZXJ0LgotCQkJICovCi0JCQlhdGg2a2xkZXZfcHJvY19kYmdfaW50cihkZXYpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKHVzZWQgaW4gY2FzZSB0aGUgaG9zdCBydW5zIG91dCBvZiBidWZmZXJzKQotICogdXNpbmcgdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3QgSS9GCi0gKi8KLWludCBhdGg2a2xkZXZfcnhfY29udHJvbChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCBib29sIGVuYWJsZV9yeCkKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHJlZ3M7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKiB0YWtlIHRoZSBsb2NrIHRvIHByb3RlY3QgaW50ZXJydXB0IGVuYWJsZSBzaGFkb3dzICovCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JaWYgKGVuYWJsZV9yeCkKLQkJZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gfD0KLQkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQSwgMHgwMSk7Ci0JZWxzZQotCQlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiAmPQotCQkgICAgflNNKElOVF9TVEFUVVNfRU5BQkxFX01CT1hfREFUQSwgMHgwMSk7Ci0KLQltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7Ci0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyksCi0JCQkJICAgICBISUZfV1JfU1lOQ19CWVRFX0lOQyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYXRoNmtsZGV2X3N1Ym1pdF9zY2F0X3JlcShzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc2NhdF9yZXEsIGJvb2wgcmVhZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCWlmIChyZWFkKSB7Ci0JCXNjYXRfcmVxLT5yZXEgPSBISUZfUkRfU1lOQ19CTE9DS19GSVg7Ci0JCXNjYXRfcmVxLT5hZGRyID0gZGV2LT5hci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCX0gZWxzZSB7Ci0JCXNjYXRfcmVxLT5yZXEgPSBISUZfV1JfQVNZTkNfQkxPQ0tfSU5DOwotCi0JCXNjYXRfcmVxLT5hZGRyID0KLQkJCShzY2F0X3JlcS0+bGVuID4gSElGX01CT1hfV0lEVEgpID8KLQkJCWRldi0+YXItPm1ib3hfaW5mby5odGNfZXh0X2FkZHIgOgotCQkJZGV2LT5hci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCX0KLQotCWF0aDZrbF9kYmcoKEFUSDZLTF9EQkdfSFRDX1JFQ1YgfCBBVEg2S0xfREJHX0hUQ19TRU5EKSwKLQkJICAgImF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEsIGVudHJpZXM6ICVkLCB0b3RhbCBsZW46ICVkIG1ib3g6MHglWCAobW9kZTogJXMgOiAlcylcbiIsCi0JCSAgIHNjYXRfcmVxLT5zY2F0X2VudHJpZXMsIHNjYXRfcmVxLT5sZW4sCi0JCSAgIHNjYXRfcmVxLT5hZGRyLCAhcmVhZCA/ICJhc3luYyIgOiAic3luYyIsCi0JCSAgIChyZWFkKSA/ICJyZCIgOiAid3IiKTsKLQotCWlmICghcmVhZCAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KSB7Ci0JCXN0YXR1cyA9IGF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIGZhbHNlKTsKLQkJaWYgKHN0YXR1cykgewotCQkJc2NhdF9yZXEtPnN0YXR1cyA9IHN0YXR1czsKLQkJCXNjYXRfcmVxLT5jb21wbGV0ZShkZXYtPmFyLT5odGNfdGFyZ2V0LCBzY2F0X3JlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXN0YXR1cyA9IGF0aDZrbF9oaWZfc2NhdF9yZXFfcncoZGV2LT5hciwgc2NhdF9yZXEpOwotCi0JaWYgKHJlYWQpIHsKLQkJLyogaW4gc3luYyBtb2RlLCB3ZSBjYW4gdG91Y2ggdGhlIHNjYXR0ZXIgcmVxdWVzdCAqLwotCQlzY2F0X3JlcS0+c3RhdHVzID0gc3RhdHVzOwotCQlpZiAoIXN0YXR1cyAmJiBzY2F0X3JlcS0+dmlydF9zY2F0KQotCQkJc2NhdF9yZXEtPnN0YXR1cyA9Ci0JCQkJYXRoNmtsZGV2X2NwX3NjYXRfZG1hX2J1ZihzY2F0X3JlcSwgdHJ1ZSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19jb3VudGVyX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKLXsKLQl1OCBjb3VudGVyX2ludF9zdGF0dXM7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLCAiY291bnRlciBpbnRlcnJ1cHRcbiIpOwotCi0JY291bnRlcl9pbnRfc3RhdHVzID0gZGV2LT5pcnFfcHJvY19yZWcuY291bnRlcl9pbnRfc3RhdHVzICYKLQkJCSAgICAgZGV2LT5pcnFfZW5fcmVnLmNudHJfaW50X3N0YXR1c19lbjsKLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGluIENPVU5URVJfSU5UX1NUQVRVUzogMHgleFxuIiwKLQkJY291bnRlcl9pbnRfc3RhdHVzKTsKLQotCS8qCi0JICogTk9URTogb3RoZXIgbW9kdWxlcyBsaWtlIEdNQk9YIG1heSB1c2UgdGhlIGNvdW50ZXIgaW50ZXJydXB0IGZvcgotCSAqIGNyZWRpdCBmbG93IGNvbnRyb2wgb24gb3RoZXIgY291bnRlcnMsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBmb3IKLQkgKiB0aGUgZGVidWcgYXNzZXJ0aW9uIGNvdW50ZXIgaW50ZXJydXB0LgotCSAqLwotCWlmIChjb3VudGVyX2ludF9zdGF0dXMgJiBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSykKLQkJcmV0dXJuIGF0aDZrbGRldl9wcm9jX2RiZ19pbnRyKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19lcnJfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCWludCBzdGF0dXM7Ci0JdTggZXJyb3JfaW50X3N0YXR1czsKLQl1OCByZWdfYnVmWzRdOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImVycm9yIGludGVycnVwdFxuIik7Ci0KLQllcnJvcl9pbnRfc3RhdHVzID0gZGV2LT5pcnFfcHJvY19yZWcuZXJyb3JfaW50X3N0YXR1cyAmIDB4MEY7Ci0JaWYgKCFlcnJvcl9pbnRfc3RhdHVzKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGluIEVSUk9SX0lOVF9TVEFUVVM6IDB4JXhcbiIsCi0JCSAgIGVycm9yX2ludF9zdGF0dXMpOwotCi0JaWYgKE1TKEVSUk9SX0lOVF9TVEFUVVNfV0FLRVVQLCBlcnJvcl9pbnRfc3RhdHVzKSkKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImVycm9yIDogd2FrZXVwXG4iKTsKLQotCWlmIChNUyhFUlJPUl9JTlRfU1RBVFVTX1JYX1VOREVSRkxPVywgZXJyb3JfaW50X3N0YXR1cykpCi0JCWF0aDZrbF9lcnIoInJ4IHVuZGVyZmxvd1xuIik7Ci0KLQlpZiAoTVMoRVJST1JfSU5UX1NUQVRVU19UWF9PVkVSRkxPVywgZXJyb3JfaW50X3N0YXR1cykpCi0JCWF0aDZrbF9lcnIoInR4IG92ZXJmbG93XG4iKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQlkZXYtPmlycV9wcm9jX3JlZy5lcnJvcl9pbnRfc3RhdHVzICY9IH5lcnJvcl9pbnRfc3RhdHVzOwotCi0JLyogc2V0IFcxQyB2YWx1ZSB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGlzIGhpdHMgdGhlIHJlZ2lzdGVyIGZpcnN0ICovCi0JcmVnX2J1ZlswXSA9IGVycm9yX2ludF9zdGF0dXM7Ci0JcmVnX2J1ZlsxXSA9IDA7Ci0JcmVnX2J1ZlsyXSA9IDA7Ci0JcmVnX2J1ZlszXSA9IDA7Ci0KLQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEVSUk9SX0lOVF9TVEFUVVNfQUREUkVTUywKLQkJCQkgICAgIHJlZ19idWYsIDQsIEhJRl9XUl9TWU5DX0JZVEVfRklYKTsKLQotCWlmIChzdGF0dXMpCi0JCVdBUk5fT04oMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGF0aDZrbGRldl9wcm9jX2NwdV9pbnRyKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JaW50IHN0YXR1czsKLQl1OCBjcHVfaW50X3N0YXR1czsKLQl1OCByZWdfYnVmWzRdOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgImNwdSBpbnRlcnJ1cHRcbiIpOwotCi0JY3B1X2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5jcHVfaW50X3N0YXR1cyAmCi0JCQkgZGV2LT5pcnFfZW5fcmVnLmNwdV9pbnRfc3RhdHVzX2VuOwotCWlmICghY3B1X2ludF9zdGF0dXMpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKLQkJInZhbGlkIGludGVycnVwdCBzb3VyY2UocykgaW4gQ1BVX0lOVF9TVEFUVVM6IDB4JXhcbiIsCi0JCWNwdV9pbnRfc3RhdHVzKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQlkZXYtPmlycV9wcm9jX3JlZy5jcHVfaW50X3N0YXR1cyAmPSB+Y3B1X2ludF9zdGF0dXM7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgcmVnaXN0ZXIgdHJhbnNmZXIgYnVmZmVyIHRvIGhpdCB0aGUgcmVnaXN0ZXIgNCB0aW1lcyAsCi0JICogdGhpcyBpcyBkb25lIHRvIG1ha2UgdGhlIGFjY2VzcyA0LWJ5dGUgYWxpZ25lZCB0byBtaXRpZ2F0ZSBpc3N1ZXMKLQkgKiB3aXRoIGhvc3QgYnVzIGludGVyY29ubmVjdHMgdGhhdCByZXN0cmljdCBidXMgdHJhbnNmZXIgbGVuZ3RocyB0bwotCSAqIGJlIGEgbXVsdGlwbGUgb2YgNC1ieXRlcy4KLQkgKi8KLQotCS8qIHNldCBXMUMgdmFsdWUgdG8gY2xlYXIgdGhlIGludGVycnVwdCwgdGhpcyBoaXRzIHRoZSByZWdpc3RlciBmaXJzdCAqLwotCXJlZ19idWZbMF0gPSBjcHVfaW50X3N0YXR1czsKLQkvKiB0aGUgcmVtYWluaW5nIGFyZSBzZXQgdG8gemVybyB3aGljaCBoYXZlIG5vLWVmZmVjdCAgKi8KLQlyZWdfYnVmWzFdID0gMDsKLQlyZWdfYnVmWzJdID0gMDsKLQlyZWdfYnVmWzNdID0gMDsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgQ1BVX0lOVF9TVEFUVVNfQUREUkVTUywKLQkJCQkgICAgIHJlZ19idWYsIDQsIEhJRl9XUl9TWU5DX0JZVEVfRklYKTsKLQotCWlmIChzdGF0dXMpCi0JCVdBUk5fT04oMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBwcm9jZXNzIHBlbmRpbmcgaW50ZXJydXB0cyBzeW5jaHJvbm91c2x5ICovCi1zdGF0aWMgaW50IHByb2NfcGVuZGluZ19pcnFzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsIGJvb2wgKmRvbmUpCi17Ci0Jc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgKnJnOwotCWludCBzdGF0dXMgPSAwOwotCXU4IGhvc3RfaW50X3N0YXR1cyA9IDA7Ci0JdTMyIGxrX2FoZCA9IDA7Ci0JdTggaHRjX21ib3ggPSAxIDw8IEhUQ19NQUlMQk9YOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgInByb2NfcGVuZGluZ19pcnFzOiAoZGV2OiAweCVwKVxuIiwgZGV2KTsKLQotCS8qCi0JICogTk9URTogSElGIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCB0aGUgY29udGV4dCBvZiB0aGlzCi0JICogY2FsbCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBTWU5DSFJPTk9VUyBJL08sIHRoYXQgaXMgd2UgY2FuIGJsb2NrLAotCSAqIHNsZWVwIG9yIGNhbGwgYW55IEFQSSB0aGF0IGNhbiBibG9jayBvciBzd2l0Y2ggdGhyZWFkL3Rhc2sKLQkgKiBjb250ZXh0cy4gVGhpcyBpcyBhIGZ1bGx5IHNjaGVkdWxhYmxlIGNvbnRleHQuCi0JICovCi0KLQkvKgotCSAqIFByb2Nlc3MgcGVuZGluZyBpbnRyIG9ubHkgd2hlbiBpbnRfc3RhdHVzX2VuIGlzIGNsZWFyLCBpdCBtYXkKLQkgKiByZXN1bHQgaW4gdW5uZWNlc3NhcnkgYnVzIHRyYW5zYWN0aW9uIG90aGVyd2lzZS4gVGFyZ2V0IG1heSBiZQotCSAqIHVucmVzcG9uc2l2ZSBhdCB0aGUgdGltZS4KLQkgKi8KLQlpZiAoZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4pIHsKLQkJLyoKLQkJICogUmVhZCB0aGUgZmlyc3QgMjggYnl0ZXMgb2YgdGhlIEhUQyByZWdpc3RlciB0YWJsZS4gVGhpcwotCQkgKiB3aWxsIHlpZWxkIHVzIHRoZSB2YWx1ZSBvZiBkaWZmZXJlbnQgaW50IHN0YXR1cwotCQkgKiByZWdpc3RlcnMgYW5kIHRoZSBsb29rYWhlYWQgcmVnaXN0ZXJzLgotCQkgKgotCQkgKiAgICBsZW5ndGggPSBzaXplb2YoaW50X3N0YXR1cykgKyBzaXplb2YoY3B1X2ludF9zdGF0dXMpCi0JCSAqICAgICAgICAgICAgICsgc2l6ZW9mKGVycm9yX2ludF9zdGF0dXMpICsKLQkJICogICAgICAgICAgICAgc2l6ZW9mKGNvdW50ZXJfaW50X3N0YXR1cykgKwotCQkgKiAgICAgICAgICAgICBzaXplb2YobWJveF9mcmFtZSkgKyBzaXplb2YocnhfbGthaGRfdmFsaWQpCi0JCSAqICAgICAgICAgICAgICsgc2l6ZW9mKGhvbGUpICsgc2l6ZW9mKHJ4X2xrYWhkKSArCi0JCSAqICAgICAgICAgICAgIHNpemVvZihpbnRfc3RhdHVzX2VuKSArCi0JCSAqICAgICAgICAgICAgIHNpemVvZihjcHVfaW50X3N0YXR1c19lbikgKwotCQkgKiAgICAgICAgICAgICBzaXplb2YoZXJyX2ludF9zdGF0dXNfZW4pICsKLQkJICogICAgICAgICAgICAgc2l6ZW9mKGNudHJfaW50X3N0YXR1c19lbik7Ci0JCSAqLwotCQlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsIEhPU1RfSU5UX1NUQVRVU19BRERSRVNTLAotCQkJCQkgICAgICh1OCAqKSAmZGV2LT5pcnFfcHJvY19yZWcsCi0JCQkJCSAgICAgc2l6ZW9mKGRldi0+aXJxX3Byb2NfcmVnKSwKLQkJCQkJICAgICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAoQVJfREJHX0xWTF9DSEVDSyhBVEg2S0xfREJHX0lSUSkpCi0JCQlhdGg2a2xfZHVtcF9yZWdpc3RlcnMoZGV2LCAmZGV2LT5pcnFfcHJvY19yZWcsCi0JCQkJCSAmZGV2LT5pcnFfZW5fcmVnKTsKLQotCQkvKiBVcGRhdGUgb25seSB0aG9zZSByZWdpc3RlcnMgdGhhdCBhcmUgZW5hYmxlZCAqLwotCQlob3N0X2ludF9zdGF0dXMgPSBkZXYtPmlycV9wcm9jX3JlZy5ob3N0X2ludF9zdGF0dXMgJgotCQkJCSAgZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW47Ci0KLQkJLyogTG9vayBhdCBtYm94IHN0YXR1cyAqLwotCQlpZiAoaG9zdF9pbnRfc3RhdHVzICYgaHRjX21ib3gpIHsKLQkJCS8qCi0JCQkgKiBNYXNrIG91dCBwZW5kaW5nIG1ib3ggdmFsdWUsIHdlIHVzZSAibG9va0FoZWFkIGFzCi0JCQkgKiB0aGUgcmVhbCBmbGFnIGZvciBtYm94IHByb2Nlc3NpbmcuCi0JCQkgKi8KLQkJCWhvc3RfaW50X3N0YXR1cyAmPSB+aHRjX21ib3g7Ci0JCQlpZiAoZGV2LT5pcnFfcHJvY19yZWcucnhfbGthaGRfdmFsaWQgJgotCQkJICAgIGh0Y19tYm94KSB7Ci0JCQkJcmcgPSAmZGV2LT5pcnFfcHJvY19yZWc7Ci0JCQkJbGtfYWhkID0gbGUzMl90b19jcHUocmctPnJ4X2xrYWhkW0hUQ19NQUlMQk9YXSk7Ci0JCQkJaWYgKCFsa19haGQpCi0JCQkJCWF0aDZrbF9lcnIoImxvb2tBaGVhZCBpcyB6ZXJvIVxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWhvc3RfaW50X3N0YXR1cyAmJiAhbGtfYWhkKSB7Ci0JCSpkb25lID0gdHJ1ZTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGxrX2FoZCkgewotCQlpbnQgZmV0Y2hlZCA9IDA7Ci0KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwKLQkJCSAgICJwZW5kaW5nIG1haWxib3ggbXNnLCBsa19haGQ6IDB4JVhcbiIsIGxrX2FoZCk7Ci0JCS8qCi0JCSAqIE1haWxib3ggSW50ZXJydXB0LCB0aGUgSFRDIGxheWVyIG1heSBpc3N1ZSBhc3luYwotCQkgKiByZXF1ZXN0cyB0byBlbXB0eSB0aGUgbWFpbGJveC4gV2hlbiBlbXB0eWluZyB0aGUgcmVjdgotCQkgKiBtYWlsYm94IHdlIHVzZSB0aGUgYXN5bmMgaGFuZGxlciBhYm92ZSBjYWxsZWQgZnJvbSB0aGUKLQkJICogY29tcGxldGlvbiByb3V0aW5lIG9mIHRoZSBjYWxsZXJzIHJlYWQgcmVxdWVzdC4gVGhpcyBjYW4KLQkJICogaW1wcm92ZSBwZXJmb3JtYW5jZSBieSByZWR1Y2luZyBjb250ZXh0IHN3aXRjaGluZyB3aGVuCi0JCSAqIHdlIHJhcGlkbHkgcHVsbCBwYWNrZXRzLgotCQkgKi8KLQkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoZGV2LT5odGNfY254dCwKLQkJCQkJCQkgICZsa19haGQsICZmZXRjaGVkKTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gb3V0OwotCi0JCWlmICghZmV0Y2hlZCkKLQkJCS8qCi0JCQkgKiBIVEMgY291bGQgbm90IHB1bGwgYW55IG1lc3NhZ2VzIG91dCBkdWUgdG8gbGFjawotCQkJICogb2YgcmVzb3VyY2VzLgotCQkJICovCi0JCQlkZXYtPmh0Y19jbnh0LT5jaGtfaXJxX3N0YXR1c19jbnQgPSAwOwotCX0KLQotCS8qIG5vdyBoYW5kbGUgdGhlIHJlc3Qgb2YgdGhlbSAqLwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJ2YWxpZCBpbnRlcnJ1cHQgc291cmNlKHMpIGZvciBvdGhlciBpbnRlcnJ1cHRzOiAweCV4XG4iLAotCQkgICBob3N0X2ludF9zdGF0dXMpOwotCi0JaWYgKE1TKEhPU1RfSU5UX1NUQVRVU19DUFUsIGhvc3RfaW50X3N0YXR1cykpIHsKLQkJLyogQ1BVIEludGVycnVwdCAqLwotCQlzdGF0dXMgPSBhdGg2a2xkZXZfcHJvY19jcHVfaW50cihkZXYpOwotCQlpZiAoc3RhdHVzKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKE1TKEhPU1RfSU5UX1NUQVRVU19FUlJPUiwgaG9zdF9pbnRfc3RhdHVzKSkgewotCQkvKiBFcnJvciBJbnRlcnJ1cHQgKi8KLQkJc3RhdHVzID0gYXRoNmtsZGV2X3Byb2NfZXJyX2ludHIoZGV2KTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gb3V0OwotCX0KLQotCWlmIChNUyhIT1NUX0lOVF9TVEFUVVNfQ09VTlRFUiwgaG9zdF9pbnRfc3RhdHVzKSkKLQkJLyogQ291bnRlciBJbnRlcnJ1cHQgKi8KLQkJc3RhdHVzID0gYXRoNmtsZGV2X3Byb2NfY291bnRlcl9pbnRyKGRldik7Ci0KLW91dDoKLQkvKgotCSAqIEFuIG9wdGltaXphdGlvbiB0byBieXBhc3MgcmVhZGluZyB0aGUgSVJRIHN0YXR1cyByZWdpc3RlcnMKLQkgKiB1bmVjZXNzYXJpbHkgd2hpY2ggY2FuIHJlLXdha2UgdGhlIHRhcmdldCwgaWYgdXBwZXIgbGF5ZXJzCi0JICogZGV0ZXJtaW5lIHRoYXQgd2UgYXJlIGluIGEgbG93LXRocm91Z2hwdXQgbW9kZSwgd2UgY2FuIHJlbHkgb24KLQkgKiB0YWtpbmcgYW5vdGhlciBpbnRlcnJ1cHQgcmF0aGVyIHRoYW4gcmUtY2hlY2tpbmcgdGhlIHN0YXR1cwotCSAqIHJlZ2lzdGVycyB3aGljaCBjYW4gcmUtd2FrZSB0aGUgdGFyZ2V0LgotCSAqCi0JICogTk9URSA6IGZvciBob3N0IGludGVyZmFjZXMgdGhhdCBtYWtlcyB1c2Ugb2YgZGV0ZWN0aW5nIHBlbmRpbmcKLQkgKiBtYm94IG1lc3NhZ2VzIGF0IGhpZiBjYW4gbm90IHVzZSB0aGlzIG9wdGltaXphdGlvbiBkdWUgdG8KLQkgKiBwb3NzaWJsZSBzaWRlIGVmZmVjdHMsIFNQSSByZXF1aXJlcyB0aGUgaG9zdCB0byBkcmFpbiBhbGwKLQkgKiBtZXNzYWdlcyBmcm9tIHRoZSBtYWlsYm94IGJlZm9yZSBleGl0aW5nIHRoZSBJU1Igcm91dGluZS4KLQkgKi8KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19JUlEsCi0JCSAgICJieXBhc3NpbmcgaXJxIHN0YXR1cyByZS1jaGVjaywgZm9yY2luZyBkb25lXG4iKTsKLQotCWlmICghZGV2LT5odGNfY254dC0+Y2hrX2lycV9zdGF0dXNfY250KQotCQkqZG9uZSA9IHRydWU7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSVJRLAotCQkgICAicHJvY19wZW5kaW5nX2lycXM6IChkb25lOiVkLCBzdGF0dXM9JWRcbiIsICpkb25lLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogaW50ZXJydXB0IGhhbmRsZXIsIGtpY2tzIG9mZiBhbGwgaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KLWludCBhdGg2a2xkZXZfaW50cl9iaF9oYW5kbGVyKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYgPSBhci0+aHRjX3RhcmdldC0+ZGV2OwotCWludCBzdGF0dXMgPSAwOwotCWJvb2wgZG9uZSA9IGZhbHNlOwotCi0JLyoKLQkgKiBSZXNldCBjb3VudGVyIHVzZWQgdG8gZmxhZyBhIHJlLXNjYW4gb2YgSVJRIHN0YXR1cyByZWdpc3RlcnMgb24KLQkgKiB0aGUgdGFyZ2V0LgotCSAqLwotCWRldi0+aHRjX2NueHQtPmNoa19pcnFfc3RhdHVzX2NudCA9IDA7Ci0KLQkvKgotCSAqIElSUSBwcm9jZXNzaW5nIGlzIHN5bmNocm9ub3VzLCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycyBjYW4gYmUKLQkgKiByZS1yZWFkLgotCSAqLwotCXdoaWxlICghZG9uZSkgewotCQlzdGF0dXMgPSBwcm9jX3BlbmRpbmdfaXJxcyhkZXYsICZkb25lKTsKLQkJaWYgKHN0YXR1cykKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgYXRoNmtsZGV2X2VuYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgcmVnczsKLQlpbnQgc3RhdHVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JLyogRW5hYmxlIGFsbCBidXQgQVRINktMIENQVSBpbnRlcnJ1cHRzICovCi0JZGV2LT5pcnFfZW5fcmVnLmludF9zdGF0dXNfZW4gPQotCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfRVJST1IsIDB4MDEpIHwKLQkJCVNNKElOVF9TVEFUVVNfRU5BQkxFX0NQVSwgMHgwMSkgfAotCQkJU00oSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUiwgMHgwMSk7Ci0KLQkvKgotCSAqIE5PVEU6IFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIEhJRiBjYW4gZG8gZGV0ZWN0aW9uIG9mCi0JICogcGVuZGluZyBtYm94IG1lc3NhZ2VzIHdoaWNoIGlzIGRpc2FibGVkIG5vdy4KLQkgKi8KLQlkZXYtPmlycV9lbl9yZWcuaW50X3N0YXR1c19lbiB8PSBTTShJTlRfU1RBVFVTX0VOQUJMRV9NQk9YX0RBVEEsIDB4MDEpOwotCi0JLyogU2V0IHVwIHRoZSBDUFUgSW50ZXJydXB0IHN0YXR1cyBSZWdpc3RlciAqLwotCWRldi0+aXJxX2VuX3JlZy5jcHVfaW50X3N0YXR1c19lbiA9IDA7Ci0KLQkvKiBTZXQgdXAgdGhlIEVycm9yIEludGVycnVwdCBzdGF0dXMgUmVnaXN0ZXIgKi8KLQlkZXYtPmlycV9lbl9yZWcuZXJyX2ludF9zdGF0dXNfZW4gPQotCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1JYX1VOREVSRkxPVywgMHgwMSkgfAotCQlTTShFUlJPUl9TVEFUVVNfRU5BQkxFX1RYX09WRVJGTE9XLCAweDEpOwotCi0JLyoKLQkgKiBFbmFibGUgQ291bnRlciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCBmYXRhbCBlcnJvcnMgZm9yCi0JICogZGVidWdnaW5nLgotCSAqLwotCWRldi0+aXJxX2VuX3JlZy5jbnRyX2ludF9zdGF0dXNfZW4gPSBTTShDT1VOVEVSX0lOVF9TVEFUVVNfRU5BQkxFX0JJVCwKLQkJCQkJCUFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKTsKLQltZW1jcHkoJnJlZ3MsICZkZXYtPmlycV9lbl9yZWcsIHNpemVvZihyZWdzKSk7Ci0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5sb2NrKTsKLQotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAgICZyZWdzLmludF9zdGF0dXNfZW4sIHNpemVvZihyZWdzKSwKLQkJCQkgICAgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKLQotCWlmIChzdGF0dXMpCi0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byB1cGRhdGUgaW50ZXJydXB0IGN0bCByZWcgZXJyOiAlZFxuIiwKLQkJCSAgIHN0YXR1cyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHJlZ3M7Ci0KLQlzcGluX2xvY2tfYmgoJmRldi0+bG9jayk7Ci0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWRldi0+aXJxX2VuX3JlZy5pbnRfc3RhdHVzX2VuID0gMDsKLQlkZXYtPmlycV9lbl9yZWcuY3B1X2ludF9zdGF0dXNfZW4gPSAwOwotCWRldi0+aXJxX2VuX3JlZy5lcnJfaW50X3N0YXR1c19lbiA9IDA7Ci0JZGV2LT5pcnFfZW5fcmVnLmNudHJfaW50X3N0YXR1c19lbiA9IDA7Ci0JbWVtY3B5KCZyZWdzLCAmZGV2LT5pcnFfZW5fcmVnLCBzaXplb2YocmVncykpOwotCXNwaW5fdW5sb2NrX2JoKCZkZXYtPmxvY2spOwotCi0JcmV0dXJuIGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgSU5UX1NUQVRVU19FTkFCTEVfQUREUkVTUywKLQkJCQkgICAmcmVncy5pbnRfc3RhdHVzX2VuLCBzaXplb2YocmVncyksCi0JCQkJICAgSElGX1dSX1NZTkNfQllURV9JTkMpOwotfQotCi0vKiBlbmFibGUgZGV2aWNlIGludGVycnVwdHMgKi8KLWludCBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBpbnRlcnJ1cHQgYXJlIGRpc2FibGVkIGJlZm9yZSB1bm1hc2tpbmcgYXQgdGhlIEhJRgotCSAqIGxheWVyLiBUaGUgcmF0aW9uYWxlIGhlcmUgaXMgdGhhdCBiZXR3ZWVuIGRldmljZSBpbnNlcnRpb24KLQkgKiAod2hlcmUgd2UgY2xlYXIgdGhlIGludGVycnVwdHMgdGhlIGZpcnN0IHRpbWUpIGFuZCB3aGVuIEhUQwotCSAqIGlzIGZpbmFsbHkgcmVhZHkgdG8gaGFuZGxlIGludGVycnVwdHMsIG90aGVyIHNvZnR3YXJlIGNhbiBwZXJmb3JtCi0JICogdGFyZ2V0ICJzb2Z0IiByZXNldHMuIFRoZSBBVEg2S0wgaW50ZXJydXB0IGVuYWJsZXMgcmVzZXQgYmFjayB0byBhbgotCSAqICJlbmFibGVkIiBzdGF0ZSB3aGVuIHRoaXMgaGFwcGVucy4KLQkgKi8KLQlhdGg2a2xkZXZfZGlzYWJsZV9pbnRycyhkZXYpOwotCi0JLyogdW5tYXNrIHRoZSBob3N0IGNvbnRyb2xsZXIgaW50ZXJydXB0cyAqLwotCWF0aDZrbF9oaWZfaXJxX2VuYWJsZShkZXYtPmFyKTsKLQlzdGF0dXMgPSBhdGg2a2xkZXZfZW5hYmxlX2ludHJzKGRldik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyAqLwotaW50IGF0aDZrbGRldl9tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCi17Ci0JLyoKLQkgKiBNYXNrIHRoZSBpbnRlcnJ1cHQgYXQgdGhlIEhJRiBsYXllciB0byBhdm9pZCBhbnkgc3RyYXkgaW50ZXJydXB0Ci0JICogdGFrZW4gd2hpbGUgd2UgemVybyBvdXQgb3VyIHNoYWRvdyByZWdpc3RlcnMgaW4KLQkgKiBhdGg2a2xkZXZfZGlzYWJsZV9pbnRycygpLgotCSAqLwotCWF0aDZrbF9oaWZfaXJxX2Rpc2FibGUoZGV2LT5hcik7Ci0KLQlyZXR1cm4gYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoZGV2KTsKLX0KLQotaW50IGF0aDZrbGRldl9zZXR1cChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQotewotCWludCBzdGF0dXMgPSAwOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7Ci0KLQkvKgotCSAqIE5PVEU6IHdlIGFjdHVhbGx5IGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBhIG1haWxib3ggb3RoZXIgdGhhbiAwLAotCSAqIGZvciBTRElPIHRoZSBibG9jayBzaXplIG9uIG1haWxib3ggMCBpcyBhcnRpZmljaWFsbHkgc2V0IHRvIDEuCi0JICogU28gd2UgdXNlIHRoZSBibG9jayBzaXplIHRoYXQgaXMgc2V0IGZvciB0aGUgb3RoZXIgMyBtYWlsYm94ZXMuCi0JICovCi0JZGV2LT5odGNfY254dC0+YmxvY2tfc3ogPSBkZXYtPmFyLT5tYm94X2luZm8uYmxvY2tfc2l6ZTsKLQotCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCi0JaWYgKChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAmIChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAtIDEpKSAhPSAwKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCWdvdG8gZmFpbF9zZXR1cDsKLQl9Ci0KLQkvKiBhc3NlbWJsZSBtYXNrLCB1c2VkIGZvciBwYWRkaW5nIHRvIGEgYmxvY2sgKi8KLQlkZXYtPmh0Y19jbnh0LT5ibG9ja19tYXNrID0gZGV2LT5odGNfY254dC0+YmxvY2tfc3ogLSAxOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImJsb2NrIHNpemU6ICVkLCBtYm94IGFkZHI6MHglWFxuIiwKLQkJICAgZGV2LT5odGNfY254dC0+YmxvY2tfc3osIGRldi0+YXItPm1ib3hfaW5mby5odGNfYWRkcik7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiaGlmIGludGVycnVwdCBwcm9jZXNzaW5nIGlzIHN5bmMgb25seVxuIik7Ci0KLQlzdGF0dXMgPSBhdGg2a2xkZXZfZGlzYWJsZV9pbnRycyhkZXYpOwotCi1mYWlsX3NldHVwOgotCXJldHVybiBzdGF0dXM7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWFkNjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBIVENfSElGX0gKLSNkZWZpbmUgSFRDX0hJRl9ICi0KLSNpbmNsdWRlICJodGMuaCIKLSNpbmNsdWRlICJoaWYuaCIKLQotI2RlZmluZSBBVEg2S0xfTUFJTEJPWEVTCTQKLQotLyogSFRDIHJ1bnMgb3ZlciBtYWlsYm94IDAgKi8KLSNkZWZpbmUgSFRDX01BSUxCT1gJMAotCi0jZGVmaW5lIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLICAgICAweDAxCi0KLSNkZWZpbmUgT1RIRVJfSU5UU19FTkFCTEVECQkoSU5UX1NUQVRVU19FTkFCTEVfRVJST1JfTUFTSyB8CVwKLQkJCQkJSU5UX1NUQVRVU19FTkFCTEVfQ1BVX01BU0sgICB8CVwKLQkJCQkJSU5UX1NUQVRVU19FTkFCTEVfQ09VTlRFUl9NQVNLKQotCi0jZGVmaW5lIEFUSDZLTF9SRUdfSU9fQlVGRkVSX1NJWkUJCQkzMgotI2RlZmluZSBBVEg2S0xfTUFYX1JFR19JT19CVUZGRVJTCQkJOAotI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgICAgICAxNgotI2RlZmluZSBBVEg2S0xfTUFYX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoMTYgKiAxMDI0KQotI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9SRVFTICAgICAgICAgICAgICAgICAgICAgICA0Ci0KLSNpZm5kZWYgQV9DQUNIRV9MSU5FX1BBRAotI2RlZmluZSBBX0NBQ0hFX0xJTkVfUEFEICAgICAgICAgICAgICAgICAgICAgICAgMTI4Ci0jZW5kaWYKLSNkZWZpbmUgQVRINktMX01JTl9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSAgICAgICAgMgotI2RlZmluZSBBVEg2S0xfTUlOX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoNCAqIDEwMjQpCi0KLXN0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKLQl1OCBob3N0X2ludF9zdGF0dXM7Ci0JdTggY3B1X2ludF9zdGF0dXM7Ci0JdTggZXJyb3JfaW50X3N0YXR1czsKLQl1OCBjb3VudGVyX2ludF9zdGF0dXM7Ci0JdTggbWJveF9mcmFtZTsKLQl1OCByeF9sa2FoZF92YWxpZDsKLQl1OCBob3N0X2ludF9zdGF0dXMyOwotCXU4IGdtYm94X3J4X2F2YWlsOwotCV9fbGUzMiByeF9sa2FoZFsyXTsKLQlfX2xlMzIgcnhfZ21ib3hfbGthaGRfYWxpYXNbMl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHsKLQl1OCBpbnRfc3RhdHVzX2VuOwotCXU4IGNwdV9pbnRfc3RhdHVzX2VuOwotCXU4IGVycl9pbnRfc3RhdHVzX2VuOwotCXU4IGNudHJfaW50X3N0YXR1c19lbjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdGg2a2xfZGV2aWNlIHsKLQlzcGlubG9ja190IGxvY2s7Ci0JdTggcGFkMVtBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyBpcnFfcHJvY19yZWc7Ci0JdTggcGFkMltBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIGlycV9lbl9yZWc7Ci0JdTggcGFkM1tBX0NBQ0hFX0xJTkVfUEFEXTsKLQlzdHJ1Y3QgaHRjX3RhcmdldCAqaHRjX2NueHQ7Ci0Jc3RydWN0IGF0aDZrbCAqYXI7Ci19OwotCi1pbnQgYXRoNmtsZGV2X3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOwotaW50IGF0aDZrbGRldl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci1pbnQgYXRoNmtsZGV2X21hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci1pbnQgYXRoNmtsZGV2X3BvbGxfbWJveG1zZ19yeChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAotCQkJICAgICAgdTMyICpsa19haGQsIGludCB0aW1lb3V0KTsKLWludCBhdGg2a2xkZXZfcnhfY29udHJvbChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCBib29sIGVuYWJsZV9yeCk7Ci1pbnQgYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7Ci0KLWludCBhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpOwotaW50IGF0aDZrbGRldl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpOwotCi0vKiBTY2F0dGVyIEZ1bmN0aW9uIGFuZCBEZWZpbml0aW9ucyAqLwotaW50IGF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpzY2F0X3JlcSwgYm9vbCByZWFkKTsKLQotI2VuZGlmIC8qQVRINktMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCmluZGV4IDgxZTAwMzEuLjM2OGVjYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaW5pdC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KICNpbmNsdWRlICJjb3JlLmgiCkBAIC0yNiw5ICsyNyw4NSBAQAogCiB1bnNpZ25lZCBpbnQgZGVidWdfbWFzazsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdG1vZGU7CitzdGF0aWMgYm9vbCBzdXNwZW5kX2N1dHBvd2VyOwogCiBtb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0odGVzdG1vZGUsIHVpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKHN1c3BlbmRfY3V0cG93ZXIsIGJvb2wsIDA0NDQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDZrbF9odyBod19saXN0W10gPSB7CisJeworCQkuaWQJCQkJPSBBUjYwMDNfSFdfMl8wX1ZFUlNJT04sCisJCS5uYW1lCQkJCT0gImFyNjAwMyBodyAyLjAiLAorCQkuZGF0YXNldF9wYXRjaF9hZGRyCQk9IDB4NTdlODg0LAorCQkuYXBwX2xvYWRfYWRkcgkJCT0gMHg1NDMxODAsCisJCS5ib2FyZF9leHRfZGF0YV9hZGRyCQk9IDB4NTdlNTAwLAorCQkucmVzZXJ2ZWRfcmFtX3NpemUJCT0gNjkxMiwKKwkJLnJlZmNsa19oegkJCT0gMjYwMDAwMDAsCisJCS51YXJ0dHhfcGluCQkJPSA4LAorCisJCS8qIGh3Mi4wIG5lZWRzIG92ZXJyaWRlIGFkZHJlc3MgaGFyZGNvZGVkICovCisJCS5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkcgk9IDB4OTQ0QzAwLAorCisJCS5md19vdHAJCQk9IEFSNjAwM19IV18yXzBfT1RQX0ZJTEUsCisJCS5mdwkJCT0gQVI2MDAzX0hXXzJfMF9GSVJNV0FSRV9GSUxFLAorCQkuZndfdGNtZAkJPSBBUjYwMDNfSFdfMl8wX1RDTURfRklSTVdBUkVfRklMRSwKKwkJLmZ3X3BhdGNoCQk9IEFSNjAwM19IV18yXzBfUEFUQ0hfRklMRSwKKwkJLmZ3X2FwaTIJCT0gQVI2MDAzX0hXXzJfMF9GSVJNV0FSRV8yX0ZJTEUsCisJCS5md19ib2FyZAkJPSBBUjYwMDNfSFdfMl8wX0JPQVJEX0RBVEFfRklMRSwKKwkJLmZ3X2RlZmF1bHRfYm9hcmQJPSBBUjYwMDNfSFdfMl8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFLAorCX0sCisJeworCQkuaWQJCQkJPSBBUjYwMDNfSFdfMl8xXzFfVkVSU0lPTiwKKwkJLm5hbWUJCQkJPSAiYXI2MDAzIGh3IDIuMS4xIiwKKwkJLmRhdGFzZXRfcGF0Y2hfYWRkcgkJPSAweDU3ZmY3NCwKKwkJLmFwcF9sb2FkX2FkZHIJCQk9IDB4MTIzNCwKKwkJLmJvYXJkX2V4dF9kYXRhX2FkZHIJCT0gMHg1NDIzMzAsCisJCS5yZXNlcnZlZF9yYW1fc2l6ZQkJPSA1MTIsCisJCS5yZWZjbGtfaHoJCQk9IDI2MDAwMDAwLAorCQkudWFydHR4X3BpbgkJCT0gOCwKKworCQkuZndfb3RwCQkJPSBBUjYwMDNfSFdfMl8xXzFfT1RQX0ZJTEUsCisJCS5mdwkJCT0gQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFX0ZJTEUsCisJCS5md190Y21kCQk9IEFSNjAwM19IV18yXzFfMV9UQ01EX0ZJUk1XQVJFX0ZJTEUsCisJCS5md19wYXRjaAkJPSBBUjYwMDNfSFdfMl8xXzFfUEFUQ0hfRklMRSwKKwkJLmZ3X2FwaTIJCT0gQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFXzJfRklMRSwKKwkJLmZ3X2JvYXJkCQk9IEFSNjAwM19IV18yXzFfMV9CT0FSRF9EQVRBX0ZJTEUsCisJCS5md19kZWZhdWx0X2JvYXJkCT0gQVI2MDAzX0hXXzJfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFLAorCX0sCisJeworCQkuaWQJCQkJPSBBUjYwMDRfSFdfMV8wX1ZFUlNJT04sCisJCS5uYW1lCQkJCT0gImFyNjAwNCBodyAxLjAiLAorCQkuZGF0YXNldF9wYXRjaF9hZGRyCQk9IDB4NTdlODg0LAorCQkuYXBwX2xvYWRfYWRkcgkJCT0gMHgxMjM0LAorCQkuYm9hcmRfZXh0X2RhdGFfYWRkcgkJPSAweDQzNzAwMCwKKwkJLnJlc2VydmVkX3JhbV9zaXplCQk9IDE5NDU2LAorCQkuYm9hcmRfYWRkcgkJCT0gMHg0MzM5MDAsCisJCS5yZWZjbGtfaHoJCQk9IDI2MDAwMDAwLAorCQkudWFydHR4X3BpbgkJCT0gMTEsCisKKwkJLmZ3CQkJPSBBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFX0ZJTEUsCisJCS5md19hcGkyCQk9IEFSNjAwNF9IV18xXzBfRklSTVdBUkVfMl9GSUxFLAorCQkuZndfYm9hcmQJCT0gQVI2MDA0X0hXXzFfMF9CT0FSRF9EQVRBX0ZJTEUsCisJCS5md19kZWZhdWx0X2JvYXJkCT0gQVI2MDA0X0hXXzFfMF9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSwKKwl9LAorCXsKKwkJLmlkCQkJCT0gQVI2MDA0X0hXXzFfMV9WRVJTSU9OLAorCQkubmFtZQkJCQk9ICJhcjYwMDQgaHcgMS4xIiwKKwkJLmRhdGFzZXRfcGF0Y2hfYWRkcgkJPSAweDU3ZTg4NCwKKwkJLmFwcF9sb2FkX2FkZHIJCQk9IDB4MTIzNCwKKwkJLmJvYXJkX2V4dF9kYXRhX2FkZHIJCT0gMHg0MzcwMDAsCisJCS5yZXNlcnZlZF9yYW1fc2l6ZQkJPSAxMTI2NCwKKwkJLmJvYXJkX2FkZHIJCQk9IDB4NDNkNDAwLAorCQkucmVmY2xrX2h6CQkJPSA0MDAwMDAwMCwKKwkJLnVhcnR0eF9waW4JCQk9IDExLAorCisJCS5mdwkJCT0gQVI2MDA0X0hXXzFfMV9GSVJNV0FSRV9GSUxFLAorCQkuZndfYXBpMgkJPSBBUjYwMDRfSFdfMV8xX0ZJUk1XQVJFXzJfRklMRSwKKwkJLmZ3X2JvYXJkCQk9IEFSNjAwNF9IV18xXzFfQk9BUkRfREFUQV9GSUxFLAorCQkuZndfZGVmYXVsdF9ib2FyZAk9IEFSNjAwNF9IV18xXzFfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUsCisJfSwKK307CiAKIC8qCiAgKiBJbmNsdWRlIGRlZmluaXRpb25zIGhlcmUgdGhhdCBjYW4gYmUgdXNlZCB0byB0dW5lIHRoZSBXTEFOIG1vZHVsZQpAQCAtNTUsNyArMTMyLDYgQEAKICAqLwogI2RlZmluZSBXTEFOX0NPTkZJR19ESVNDT05ORUNUX1RJTUVPVVQgMTAKIAotI2RlZmluZSBDT05GSUdfQVI2MDB4X0RFQlVHX1VBUlRfVFhfUElOIDgKIAogI2RlZmluZSBBVEg2S0xfREFUQV9PRkZTRVQgICAgNjQKIHN0cnVjdCBza19idWZmICphdGg2a2xfYnVmX2FsbG9jKGludCBzaXplKQpAQCAtNzMsMzcgKzE0OSwyMSBAQAogCXJldHVybiBza2I7CiB9CiAKLXZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKQordm9pZCBhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlhci0+c3NpZF9sZW4gPSAwOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7CisJdmlmLT5zc2lkX2xlbiA9IDA7CisJbWVtc2V0KHZpZi0+c3NpZCwgMCwgc2l6ZW9mKHZpZi0+c3NpZCkpOwogCi0JYXItPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKLQlhci0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOwotCWFyLT5wcndpc2VfY3J5cHRvID0gTk9ORV9DUllQVDsKLQlhci0+cHJ3aXNlX2NyeXB0b19sZW4gPSAwOwotCWFyLT5ncnBfY3J5cHRvID0gTk9ORV9DUllQVDsKLQlhci0+Z3JwX2NyeXB0b19sZW4gPSAwOwotCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCW1lbXNldChhci0+cmVxX2Jzc2lkLCAwLCBzaXplb2YoYXItPnJlcV9ic3NpZCkpOwotCW1lbXNldChhci0+YnNzaWQsIDAsIHNpemVvZihhci0+YnNzaWQpKTsKLQlhci0+YnNzX2NoID0gMDsKLQlhci0+bndfdHlwZSA9IGFyLT5uZXh0X21vZGUgPSBJTkZSQV9ORVRXT1JLOwotfQotCi1zdGF0aWMgdTggYXRoNmtsX2dldF9md19pZnR5cGUoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0Jc3dpdGNoIChhci0+bndfdHlwZSkgewotCWNhc2UgSU5GUkFfTkVUV09SSzoKLQkJcmV0dXJuIEhJX09QVElPTl9GV19NT0RFX0JTU19TVEE7Ci0JY2FzZSBBREhPQ19ORVRXT1JLOgotCQlyZXR1cm4gSElfT1BUSU9OX0ZXX01PREVfSUJTUzsKLQljYXNlIEFQX05FVFdPUks6Ci0JCXJldHVybiBISV9PUFRJT05fRldfTU9ERV9BUDsKLQlkZWZhdWx0OgotCQlhdGg2a2xfZXJyKCJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSA6JWRcbiIsIGFyLT5ud190eXBlKTsKLQkJcmV0dXJuIDB4ZmY7Ci0JfQorCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gT1BFTl9BVVRIOworCXZpZi0+YXV0aF9tb2RlID0gTk9ORV9BVVRIOworCXZpZi0+cHJ3aXNlX2NyeXB0byA9IE5PTkVfQ1JZUFQ7CisJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiA9IDA7CisJdmlmLT5ncnBfY3J5cHRvID0gTk9ORV9DUllQVDsKKwl2aWYtPmdycF9jcnlwdG9fbGVuID0gMDsKKwltZW1zZXQodmlmLT53ZXBfa2V5X2xpc3QsIDAsIHNpemVvZih2aWYtPndlcF9rZXlfbGlzdCkpOworCW1lbXNldCh2aWYtPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CisJbWVtc2V0KHZpZi0+YnNzaWQsIDAsIHNpemVvZih2aWYtPmJzc2lkKSk7CisJdmlmLT5ic3NfY2ggPSAwOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShzdHJ1Y3QgYXRoNmtsICphcikKQEAgLTEyMCw3ICsxODAsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWFkZHJlc3MgPSBUQVJHX1ZUT1AoYXItPnRhcmdldF90eXBlLCBkYXRhKTsKLQlob3N0X2FwcF9hcmVhLndtaV9wcm90b2NvbF92ZXIgPSBXTUlfUFJPVE9DT0xfVkVSU0lPTjsKKwlob3N0X2FwcF9hcmVhLndtaV9wcm90b2NvbF92ZXIgPSBjcHVfdG9fbGUzMihXTUlfUFJPVE9DT0xfVkVSU0lPTik7CiAJaWYgKGF0aDZrbF9kaWFnX3dyaXRlKGFyLCBhZGRyZXNzLCAodTggKikgJmhvc3RfYXBwX2FyZWEsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGhvc3RfYXBwX2FyZWEpKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0yNTgsNDAgKzMxOCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdGg2a2xfaW5pdF9jb250cm9sX2luZm8oc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9pbml0X2NvbnRyb2xfaW5mbyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCXU4IGN0cjsKLQotCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oYXIpOwotCWFyLT5kZWZfdHhrZXlfaW5kZXggPSAwOwotCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCWFyLT5jaF9oaW50ID0gMDsKLQlhci0+bGlzdGVuX2ludHZsX3QgPSBBX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMOwotCWFyLT5saXN0ZW5faW50dmxfYiA9IDA7Ci0JYXItPnR4X3B3ciA9IDA7Ci0JY2xlYXJfYml0KFNLSVBfU0NBTiwgJmFyLT5mbGFnKTsKLQlzZXRfYml0KFdNTV9FTkFCTEVELCAmYXItPmZsYWcpOwotCWFyLT5pbnRyYV9ic3MgPSAxOwotCW1lbXNldCgmYXItPnNjX3BhcmFtcywgMCwgc2l6ZW9mKGFyLT5zY19wYXJhbXMpKTsKLQlhci0+c2NfcGFyYW1zLnNob3J0X3NjYW5fcmF0aW8gPSBXTUlfU0hPUlRTQ0FOUkFUSU9fREVGQVVMVDsKLQlhci0+c2NfcGFyYW1zLnNjYW5fY3RybF9mbGFncyA9IERFRkFVTFRfU0NBTl9DVFJMX0ZMQUdTOwotCWFyLT5scnNzaV9yb2FtX3RocmVzaG9sZCA9IERFRl9MUlNTSV9ST0FNX1RIUkVTSE9MRDsKLQotCW1lbXNldCgodTggKilhci0+c3RhX2xpc3QsIDAsCi0JICAgICAgIEFQX01BWF9OVU1fU1RBICogc2l6ZW9mKHN0cnVjdCBhdGg2a2xfc3RhKSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYXItPm1jYXN0cHNxX2xvY2spOwotCi0JLyogSW5pdCB0aGUgUFMgcXVldWVzICovCi0JZm9yIChjdHIgPSAwOyBjdHIgPCBBUF9NQVhfTlVNX1NUQTsgY3RyKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcV9sb2NrKTsKLQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPnN0YV9saXN0W2N0cl0ucHNxKTsKLQl9Ci0KLQlza2JfcXVldWVfaGVhZF9pbml0KCZhci0+bWNhc3Rwc3EpOwotCi0JbWVtY3B5KGFyLT5hcF9jb3VudHJ5X2NvZGUsIERFRl9BUF9DT1VOVFJZX0NPREUsIDMpOworCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyh2aWYpOworCXZpZi0+ZGVmX3R4a2V5X2luZGV4ID0gMDsKKwltZW1zZXQodmlmLT53ZXBfa2V5X2xpc3QsIDAsIHNpemVvZih2aWYtPndlcF9rZXlfbGlzdCkpOworCXZpZi0+Y2hfaGludCA9IDA7CiB9CiAKIC8qCkBAIC0zNDEsNjIgKzM3Myw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotI2RlZmluZSBSRUdfRFVNUF9DT1VOVF9BUjYwMDMgICA2MAotI2RlZmluZSBSRUdJU1RFUl9EVU1QX0xFTl9NQVggICA2MAotCi1zdGF0aWMgdm9pZCBhdGg2a2xfZHVtcF90YXJnZXRfYXNzZXJ0X2luZm8oc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JdTMyIGFkZHJlc3M7Ci0JdTMyIHJlZ2R1bXBfbG9jID0gMDsKLQlpbnQgc3RhdHVzOwotCXUzMiByZWdkdW1wX3ZhbFtSRUdJU1RFUl9EVU1QX0xFTl9NQVhdOwotCXUzMiBpOwotCi0JaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCi0JCXJldHVybjsKLQotCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCi0JYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKLQlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7Ci0KLQkvKiByZWFkIFJBTSBsb2NhdGlvbiB0aHJvdWdoIGRpYWdub3N0aWMgd2luZG93ICovCi0Jc3RhdHVzID0gYXRoNmtsX2RpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCAmcmVnZHVtcF9sb2MpOwotCi0JaWYgKHN0YXR1cyB8fCAhcmVnZHVtcF9sb2MpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBwdHIgdG8gcmVnaXN0ZXIgZHVtcCBhcmVhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICJsb2NhdGlvbiBvZiByZWdpc3RlciBkdW1wIGRhdGE6IDB4JVhcbiIsCi0JCXJlZ2R1bXBfbG9jKTsKLQlyZWdkdW1wX2xvYyA9IFRBUkdfVlRPUChhci0+dGFyZ2V0X3R5cGUsIHJlZ2R1bXBfbG9jKTsKLQotCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLwotCXN0YXR1cyA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfbG9jLCAodTggKikmcmVnZHVtcF92YWxbMF0sCi0JCQkJICBSRUdfRFVNUF9DT1VOVF9BUjYwMDMgKiAoc2l6ZW9mKHUzMikpKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiUmVnaXN0ZXIgRHVtcDpcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IFJFR19EVU1QX0NPVU5UX0FSNjAwMzsgaSsrKQotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiICVkIDogIDB4JTguOFhcbiIsCi0JCQkgICBpLCByZWdkdW1wX3ZhbFtpXSk7Ci0KLX0KLQotdm9pZCBhdGg2a2xfdGFyZ2V0X2ZhaWx1cmUoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JYXRoNmtsX2VycigidGFyZ2V0IGFzc2VydGVkXG4iKTsKLQotCS8qIHRyeSBkdW1waW5nIHRhcmdldCBhc3NlcnRpb24gaW5mb3JtYXRpb24gKGlmIGFueSkgKi8KLQlhdGg2a2xfZHVtcF90YXJnZXRfYXNzZXJ0X2luZm8oYXIpOwotCi19Ci0KLXN0YXRpYyBpbnQgYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgaW50IGF0aDZrbF90YXJnZXRfY29uZmlnX3dsYW5fcGFyYW1zKHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgaWR4KQogewogCWludCBzdGF0dXMgPSAwOwogCWludCByZXQ7CkBAIC00MDYsNDYgKzM4Myw0NiBAQAogCSAqIGRlZmF1bHQgdmFsdWVzLiBSZXF1aXJlZCBpZiBjaGVja3N1bSBvZmZsb2FkIGlzIG5lZWRlZC4gU2V0CiAJICogUnhNZXRhVmVyc2lvbiB0byAyLgogCSAqLwotCWlmIChhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKGFyLT53bWksCisJaWYgKGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoYXItPndtaSwgaWR4LAogCQkJCQkgICAgICAgYXItPnJ4X21ldGFfdmVyLCAwLCAwKSkgewogCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IHRoZSByeCBmcmFtZSBmb3JtYXRcbiIpOwogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAogCWlmIChhci0+Y29uZl9mbGFncyAmIEFUSDZLTF9DT05GX0lHTk9SRV9QU19GQUlMX0VWVF9JTl9TQ0FOKQotCQlpZiAoKGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKGFyLT53bWksIDAsIDEsIDAsIDAsIDEsCisJCWlmICgoYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoYXItPndtaSwgaWR4LCAwLCAxLCAwLCAwLCAxLAogCQkgICAgIElHTk9SRV9QT1dFUl9TQVZFX0ZBSUxfRVZFTlRfRFVSSU5HX1NDQU4pKSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IHBvd2VyIHNhdmUgZmFpbCBldmVudCBwb2xpY3lcbiIpOwogCQkJc3RhdHVzID0gLUVJTzsKIAkJfQogCiAJaWYgKCEoYXItPmNvbmZfZmxhZ3MgJiBBVEg2S0xfQ09ORl9JR05PUkVfRVJQX0JBUktFUikpCi0JCWlmICgoYXRoNmtsX3dtaV9zZXRfbHByZWFtYmxlX2NtZChhci0+d21pLCAwLAorCQlpZiAoKGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoYXItPndtaSwgaWR4LCAwLAogCQkgICAgIFdNSV9ET05PVF9JR05PUkVfQkFSS0VSX0lOX0VSUCkpICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgYmFya2VyIHByZWFtYmxlIHBvbGljeVxuIik7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQl9CiAKLQlpZiAoYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLAorCWlmIChhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKGFyLT53bWksIGlkeCwKIAkJCVdMQU5fQ09ORklHX0tFRVBfQUxJVkVfSU5URVJWQUwpKSB7CiAJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQga2VlcCBhbGl2ZSBpbnRlcnZhbFxuIik7CiAJCXN0YXR1cyA9IC1FSU87CiAJfQogCi0JaWYgKGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKGFyLT53bWksCisJaWYgKGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKGFyLT53bWksIGlkeCwKIAkJCVdMQU5fQ09ORklHX0RJU0NPTk5FQ1RfVElNRU9VVCkpIHsKIAkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNldCBkaXNjb25uZWN0IHRpbWVvdXRcbiIpOwogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAogCWlmICghKGFyLT5jb25mX2ZsYWdzICYgQVRINktMX0NPTkZfRU5BQkxFX1RYX0JVUlNUKSkKLQkJaWYgKGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKGFyLT53bWksIFdNSV9UWE9QX0RJU0FCTEVEKSkgeworCQlpZiAoYXRoNmtsX3dtaV9zZXRfd21tX3R4b3AoYXItPndtaSwgaWR4LCBXTUlfVFhPUF9ESVNBQkxFRCkpIHsKIAkJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdHhvcCBidXJzdGluZ1xuIik7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQl9CiAKLQlpZiAoYXItPnAycCkgewotCQlyZXQgPSBhdGg2a2xfd21pX2luZm9fcmVxX2NtZChhci0+d21pLAorCWlmIChhci0+cDJwICYmIChhci0+dmlmX21heCA9PSAxIHx8IGlkeCkpIHsKKwkJcmV0ID0gYXRoNmtsX3dtaV9pbmZvX3JlcV9jbWQoYXItPndtaSwgaWR4LAogCQkJCQkgICAgICBQMlBfRkxBR19DQVBBQklMSVRJRVNfUkVRIHwKIAkJCQkJICAgICAgUDJQX0ZMQUdfTUFDQUREUl9SRVEgfAogCQkJCQkgICAgICBQMlBfRkxBR19ITU9ERUxfUkVRKTsKQEAgLTQ1Nyw5ICs0MzQsOSBAQAogCQl9CiAJfQogCi0JaWYgKGFyLT5wMnApIHsKKwlpZiAoYXItPnAycCAmJiAoYXItPnZpZl9tYXggPT0gMSB8fCBpZHgpKSB7CiAJCS8qIEVuYWJsZSBQcm9iZSBSZXF1ZXN0IHJlcG9ydGluZyBmb3IgUDJQICovCi0JCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgdHJ1ZSk7CisJCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgaWR4LCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImZhaWxlZCB0byBlbmFibGUgUHJvYmUgIgogCQkJCSAgICJSZXF1ZXN0IHJlcG9ydGluZyAoJWQpXG4iLCByZXQpOwpAQCAtNDcyLDEzICs0NDksNDAgQEAKIGludCBhdGg2a2xfY29uZmlndXJlX3RhcmdldChzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAl1MzIgcGFyYW0sIHJhbV9yZXNlcnZlZF9zaXplOwotCXU4IGZ3X2lmdHlwZTsKKwl1OCBmd19pZnR5cGUsIGZ3X21vZGUgPSAwLCBmd19zdWJtb2RlID0gMDsKKwlpbnQgaSwgc3RhdHVzOwogCi0JZndfaWZ0eXBlID0gYXRoNmtsX2dldF9md19pZnR5cGUoYXIpOwotCWlmIChmd19pZnR5cGUgPT0gMHhmZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBOb3RlOiBFdmVuIHRob3VnaCB0aGUgZmlybXdhcmUgaW50ZXJmYWNlIHR5cGUgaXMKKwkgKiBjaG9zZW4gYXMgQlNTX1NUQSBmb3IgYWxsIHRocmVlIGludGVyZmFjZXMsIGNhbgorCSAqIGJlIGNvbmZpZ3VyZWQgdG8gSUJTUy9BUCBhcyBsb25nIGFzIHRoZSBmdyBzdWJtb2RlCisJICogcmVtYWlucyBub3JtYWwgbW9kZSAoMCAtIEFQLCBTVEEgYW5kIElCU1MpLiBCdXQKKwkgKiBkdWUgdG8gYW4gdGFyZ2V0IGFzc2VydCBpbiBmaXJtd2FyZSBvbmx5IG9uZSBpbnRlcmZhY2UgaXMKKwkgKiBjb25maWd1cmVkIGZvciBub3cuCisJICovCisJZndfaWZ0eXBlID0gSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQTsKIAotCS8qIFRlbGwgdGFyZ2V0IHdoaWNoIEhUQyB2ZXJzaW9uIGl0IGlzIHVzZWQqLworCWZvciAoaSA9IDA7IGkgPCBhci0+dmlmX21heDsgaSsrKQorCQlmd19tb2RlIHw9IGZ3X2lmdHlwZSA8PCAoaSAqIEhJX09QVElPTl9GV19NT0RFX0JJVFMpOworCisJLyoKKwkgKiBCeSBkZWZhdWx0LCBzdWJtb2RlcyA6CisJICoJCXZpZlswXSAtIEFQL1NUQS9JQlNTCisJICoJCXZpZlsxXSAtICJQMlAgZGV2Ii8iUDJQIEdPIi8iUDJQIENsaWVudCIKKwkgKgkJdmlmWzJdIC0gIlAyUCBkZXYiLyJQMlAgR08iLyJQMlAgQ2xpZW50IgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGFyLT5tYXhfbm9ybV9pZmFjZTsgaSsrKQorCQlmd19zdWJtb2RlIHw9IEhJX09QVElPTl9GV19TVUJNT0RFX05PTkUgPDwKKwkJCSAgICAgIChpICogSElfT1BUSU9OX0ZXX1NVQk1PREVfQklUUyk7CisKKwlmb3IgKGkgPSBhci0+bWF4X25vcm1faWZhY2U7IGkgPCBhci0+dmlmX21heDsgaSsrKQorCQlmd19zdWJtb2RlIHw9IEhJX09QVElPTl9GV19TVUJNT0RFX1AyUERFViA8PAorCQkJICAgICAgKGkgKiBISV9PUFRJT05fRldfU1VCTU9ERV9CSVRTKTsKKworCWlmIChhci0+cDJwICYmIGFyLT52aWZfbWF4ID09IDEpCisJCWZ3X3N1Ym1vZGUgPSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVY7CisKIAlwYXJhbSA9IEhUQ19QUk9UT0NPTF9WRVJTSU9OOwogCWlmIChhdGg2a2xfYm1pX3dyaXRlKGFyLAogCQkJICAgICBhdGg2a2xfZ2V0X2hpX2l0ZW1fYWRkcihhciwKQEAgLTQ5OSwxMiArNTAzLDEwIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXBhcmFtIHw9ICgxIDw8IEhJX09QVElPTl9OVU1fREVWX1NISUZUKTsKLQlwYXJhbSB8PSAoZndfaWZ0eXBlIDw8IEhJX09QVElPTl9GV19NT0RFX1NISUZUKTsKLQlpZiAoYXItPnAycCAmJiBmd19pZnR5cGUgPT0gSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQSkgewotCQlwYXJhbSB8PSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVYgPDwKLQkJCUhJX09QVElPTl9GV19TVUJNT0RFX1NISUZUOwotCX0KKwlwYXJhbSB8PSAoYXItPnZpZl9tYXggPDwgSElfT1BUSU9OX05VTV9ERVZfU0hJRlQpOworCXBhcmFtIHw9IGZ3X21vZGUgPDwgSElfT1BUSU9OX0ZXX01PREVfU0hJRlQ7CisJcGFyYW0gfD0gZndfc3VibW9kZSA8PCBISV9PUFRJT05fRldfU1VCTU9ERV9TSElGVDsKKwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0RfU0hJRlQpOwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9GV19CUklER0VfU0hJRlQpOwogCkBAIC01NTAsNzEgKzU1Miw1NSBAQAogCQkvKiB1c2UgZGVmYXVsdCBudW1iZXIgb2YgY29udHJvbCBidWZmZXJzICovCiAJCXJldHVybiAtRUlPOwogCisJLyogQ29uZmlndXJlIEdQSU8gQVI2MDB4IFVBUlQgKi8KKwlwYXJhbSA9IGFyLT5ody51YXJ0dHhfcGluOworCXN0YXR1cyA9IGF0aDZrbF9ibWlfd3JpdGUoYXIsCisJCQkJYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsCisJCQkJSElfSVRFTShoaV9kYmdfdWFydF90eHBpbikpLAorCQkJCSh1OCAqKSZwYXJhbSwgNCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIENvbmZpZ3VyZSB0YXJnZXQgcmVmY2xrX2h6ICovCisJcGFyYW0gPSAgYXItPmh3LnJlZmNsa19oejsKKwlzdGF0dXMgPSBhdGg2a2xfYm1pX3dyaXRlKGFyLAorCQkJCWF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLAorCQkJCUhJX0lURU0oaGlfcmVmY2xrX2h6KSksCisJCQkJKHU4ICopJnBhcmFtLCA0KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBhdGg2a2wgKmF0aDZrbF9jb3JlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnNkZXYpCit2b2lkIGF0aDZrbF9jb3JlX2ZyZWUoc3RydWN0IGF0aDZrbCAqYXIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgYXRoNmtsICphcjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCi0Jd2RldiA9IGF0aDZrbF9jZmc4MDIxMV9pbml0KHNkZXYpOwotCWlmICghd2RldikgewotCQlhdGg2a2xfZXJyKCJhdGg2a2xfY2ZnODAyMTFfaW5pdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlhciA9IHdkZXZfcHJpdih3ZGV2KTsKLQlhci0+ZGV2ID0gc2RldjsKLQlhci0+d2RldiA9IHdkZXY7Ci0Jd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQotCWlmIChhdGg2a2xfZGVidWdfaW5pdChhcikpIHsKLQkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVidWdmc1xuIik7Ci0JCWF0aDZrbF9jZmc4MDIxMV9kZWluaXQoYXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkZXYgPSBhbGxvY19uZXRkZXYoMCwgIndsYW4lZCIsIGV0aGVyX3NldHVwKTsKLQlpZiAoIWRldikgewotCQlhdGg2a2xfZXJyKCJubyBtZW1vcnkgZm9yIG5ldHdvcmsgZGV2aWNlIGluc3RhbmNlXG4iKTsKLQkJYXRoNmtsX2NmZzgwMjExX2RlaW5pdChhcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRldi0+aWVlZTgwMjExX3B0ciA9IHdkZXY7Ci0JU0VUX05FVERFVl9ERVYoZGV2LCB3aXBoeV9kZXYod2Rldi0+d2lwaHkpKTsKLQl3ZGV2LT5uZXRkZXYgPSBkZXY7Ci0JYXItPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7Ci0KLQlpbml0X25ldGRldihkZXYpOwotCi0JYXItPm5ldF9kZXYgPSBkZXY7Ci0Jc2V0X2JpdChXTEFOX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0KLQlhci0+d2xhbl9wd3Jfc3RhdGUgPSBXTEFOX1BPV0VSX1NUQVRFX09OOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFyLT5sb2NrKTsKLQotCWF0aDZrbF9pbml0X2NvbnRyb2xfaW5mbyhhcik7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPmV2ZW50X3dxKTsKLQlzZW1hX2luaXQoJmFyLT5zZW0sIDEpOwotCWNsZWFyX2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFyLT5hbXNkdV9yeF9idWZmZXJfcXVldWUpOwotCi0Jc2V0dXBfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyLCBkaXNjb25uZWN0X3RpbWVyX2hhbmRsZXIsCi0JCSAgICAodW5zaWduZWQgbG9uZykgZGV2KTsKLQotCXJldHVybiBhcjsKKwl3aXBoeV9mcmVlKGFyLT53aXBoeSk7CiB9CiAKLWludCBhdGg2a2xfdW5hdmFpbF9ldihzdHJ1Y3QgYXRoNmtsICphcikKK3ZvaWQgYXRoNmtsX2NvcmVfY2xlYW51cChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlhdGg2a2xfZGVzdHJveShhci0+bmV0X2RldiwgMSk7CisJYXRoNmtsX2hpZl9wb3dlcl9vZmYoYXIpOwogCi0JcmV0dXJuIDA7CisJZGVzdHJveV93b3JrcXVldWUoYXItPmF0aDZrbF93cSk7CisKKwlpZiAoYXItPmh0Y190YXJnZXQpCisJCWF0aDZrbF9odGNfY2xlYW51cChhci0+aHRjX3RhcmdldCk7CisKKwlhdGg2a2xfY29va2llX2NsZWFudXAoYXIpOworCisJYXRoNmtsX2NsZWFudXBfYW1zZHVfcnhidWZzKGFyKTsKKworCWF0aDZrbF9ibWlfY2xlYW51cChhcik7CisKKwlhdGg2a2xfZGVidWdfY2xlYW51cChhcik7CisKKwlrZnJlZShhci0+ZndfYm9hcmQpOworCWtmcmVlKGFyLT5md19vdHApOworCWtmcmVlKGFyLT5mdyk7CisJa2ZyZWUoYXItPmZ3X3BhdGNoKTsKKworCWF0aDZrbF9kZWluaXRfaWVlZTgwMjExX2h3KGFyKTsKIH0KIAogLyogZmlybXdhcmUgdXBsb2FkICovCkBAIC02NDMsMTEgKzYyOSwxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmdldF90YXJnZXRfdmVyX2Rpcihjb25zdCBzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAlzd2l0Y2ggKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpIHsKLQljYXNlIEFSNjAwM19SRVYxX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMV8wX1ZFUlNJT046CiAJCXJldHVybiAiYXRoNmsvQVI2MDAzL2h3MS4wIjsKLQljYXNlIEFSNjAwM19SRVYyX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMl8wX1ZFUlNJT046CiAJCXJldHVybiAiYXRoNmsvQVI2MDAzL2h3Mi4wIjsKLQljYXNlIEFSNjAwM19SRVYzX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMl8xXzFfVkVSU0lPTjoKIAkJcmV0dXJuICJhdGg2ay9BUjYwMDMvaHcyLjEuMSI7CiAJfQogCWF0aDZrbF93YXJuKCIlczogdW5zdXBwb3J0ZWQgdGFyZ2V0IHZlcnNpb24gMHgleC5cbiIsIF9fZnVuY19fLApAQCAtNzA1LDE3ICs2OTEsMTAgQEAKIAlpZiAoYXItPmZ3X2JvYXJkICE9IE5VTEwpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JY2FzZSBBUjYwMDNfUkVWMl9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwM19SRVYyX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JY2FzZSBBUjYwMDRfUkVWMV9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwNF9SRVYxX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19CT0FSRF9EQVRBX0ZJTEU7Ci0JCWJyZWFrOwotCX0KKwlpZiAoV0FSTl9PTihhci0+aHcuZndfYm9hcmQgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZmlsZW5hbWUgPSBhci0+aHcuZndfYm9hcmQ7CiAKIAlyZXQgPSBhdGg2a2xfZ2V0X2Z3KGFyLCBmaWxlbmFtZSwgJmFyLT5md19ib2FyZCwKIAkJCSAgICAmYXItPmZ3X2JvYXJkX2xlbik7CkBAIC03MzMsMTcgKzcxMiw3IEBACiAJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBnZXQgYm9hcmQgZmlsZSAlcyAoJWQpLCB0cnlpbmcgdG8gZmluZCBkZWZhdWx0IGJvYXJkIGZpbGUuXG4iLAogCQkgICAgZmlsZW5hbWUsIHJldCk7CiAKLQlzd2l0Y2ggKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpIHsKLQljYXNlIEFSNjAwM19SRVYyX1ZFUlNJT046Ci0JCWZpbGVuYW1lID0gQVI2MDAzX1JFVjJfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDRfUkVWMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19ERUZBVUxUX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JfQorCWZpbGVuYW1lID0gYXItPmh3LmZ3X2RlZmF1bHRfYm9hcmQ7CiAKIAlyZXQgPSBhdGg2a2xfZ2V0X2Z3KGFyLCBmaWxlbmFtZSwgJmFyLT5md19ib2FyZCwKIAkJCSAgICAmYXItPmZ3X2JvYXJkX2xlbik7CkBAIC03NjcsMTkgKzczNiwxNCBAQAogCWlmIChhci0+Zndfb3RwICE9IE5VTEwpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JY2FzZSBBUjYwMDNfUkVWMl9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwM19SRVYyX09UUF9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICJBUjYwMDQgZG9lc24ndCBuZWVkIE9UUCBmaWxlXG4iKTsKKwlpZiAoYXItPmh3LmZ3X290cCA9PSBOVUxMKSB7CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJICAgIm5vIE9UUCBmaWxlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaHdcbiIpOwogCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19PVFBfRklMRTsKLQkJYnJlYWs7CiAJfQogCisJZmlsZW5hbWUgPSBhci0+aHcuZndfb3RwOworCiAJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+Zndfb3RwLAogCQkJICAgICZhci0+Zndfb3RwX2xlbik7CiAJaWYgKHJldCkgewpAQCAtODAwLDM4ICs3NjQsMjIgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodGVzdG1vZGUpIHsKLQkJc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJCWZpbGVuYW1lID0gQVI2MDAzX1JFVjJfVENNRF9GSVJNV0FSRV9GSUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJCWZpbGVuYW1lID0gQVI2MDAzX1JFVjNfVENNRF9GSVJNV0FSRV9GSUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJCWF0aDZrbF93YXJuKCJ0ZXN0bW9kZSBub3Qgc3VwcG9ydGVkIHdpdGggYXI2MDA0XG4iKTsKKwkJaWYgKGFyLT5ody5md190Y21kID09IE5VTEwpIHsKKwkJCWF0aDZrbF93YXJuKCJ0ZXN0bW9kZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJZGVmYXVsdDoKLQkJCWF0aDZrbF93YXJuKCJ1bmtub3duIHRhcmdldCB2ZXJzaW9uOiAweCV4XG4iLAotCQkJCSAgICAgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyKTsKLQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKKwkJZmlsZW5hbWUgPSBhci0+aHcuZndfdGNtZDsKKwogCQlzZXRfYml0KFRFU1RNT0RFLCAmYXItPmZsYWcpOwogCiAJCWdvdG8gZ2V0X2Z3OwogCX0KIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9GSVJNV0FSRV9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCWZpbGVuYW1lID0gQVI2MDA0X1JFVjFfRklSTVdBUkVfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19GSVJNV0FSRV9GSUxFOwotCQlicmVhazsKLQl9CisJaWYgKFdBUk5fT04oYXItPmh3LmZ3ID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVuYW1lID0gYXItPmh3LmZ3OwogCiBnZXRfZnc6CiAJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+ZncsICZhci0+ZndfbGVuKTsKQEAgLTg0OSwyNyArNzk3LDIwIEBACiAJY29uc3QgY2hhciAqZmlsZW5hbWU7CiAJaW50IHJldDsKIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9QQVRDSF9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCS8qIEZJWE1FOiBpbXBsZW1lbnQgZm9yIEFSNjAwNCAqLworCWlmIChhci0+ZndfcGF0Y2ggIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZpbGVuYW1lID0gQVI2MDAzX1JFVjNfUEFUQ0hfRklMRTsKLQkJYnJlYWs7Ci0JfQogCi0JaWYgKGFyLT5md19wYXRjaCA9PSBOVUxMKSB7Ci0JCXJldCA9IGF0aDZrbF9nZXRfZncoYXIsIGZpbGVuYW1lLCAmYXItPmZ3X3BhdGNoLAotCQkJCSAgICAmYXItPmZ3X3BhdGNoX2xlbik7Ci0JCWlmIChyZXQpIHsKLQkJCWF0aDZrbF9lcnIoIkZhaWxlZCB0byBnZXQgcGF0Y2ggZmlsZSAlczogJWRcbiIsCi0JCQkJICAgZmlsZW5hbWUsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisJaWYgKGFyLT5ody5md19wYXRjaCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZpbGVuYW1lID0gYXItPmh3LmZ3X3BhdGNoOworCisJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+ZndfcGF0Y2gsCisJCQkgICAgJmFyLT5md19wYXRjaF9sZW4pOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGdldCBwYXRjaCBmaWxlICVzOiAlZFxuIiwKKwkJCSAgIGZpbGVuYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtOTA0LDE5ICs4NDUsMTAgQEAKIAlpbnQgcmV0LCBpZV9pZCwgaSwgaW5kZXgsIGJpdDsKIAlfX2xlMzIgKnZhbDsKIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDRfUkVWMV9GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJaWYgKGFyLT5ody5md19hcGkyID09IE5VTEwpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9CisKKwlmaWxlbmFtZSA9IGFyLT5ody5md19hcGkyOwogCiAJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBhci0+ZGV2KTsKIAlpZiAocmV0KQpAQCAtMTAwNiwxMiArOTM4LDE1IEBACiAJCQkJICAgYXItPmh3LnJlc2VydmVkX3JhbV9zaXplKTsKIAkJCWJyZWFrOwogCQljYXNlIEFUSDZLTF9GV19JRV9DQVBBQklMSVRJRVM6CisJCQlpZiAoaWVfbGVuIDwgRElWX1JPVU5EX1VQKEFUSDZLTF9GV19DQVBBQklMSVRZX01BWCwgOCkpCisJCQkJYnJlYWs7CisKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAogCQkJCSAgICJmb3VuZCBmaXJtd2FyZSBjYXBhYmlsaXRpZXMgaWUgKCV6ZCBCKVxuIiwKIAkJCQkgICBpZV9sZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgQVRINktMX0ZXX0NBUEFCSUxJVFlfTUFYOyBpKyspIHsKLQkJCQlpbmRleCA9IEFMSUdOKGksIDgpIC8gODsKKwkJCQlpbmRleCA9IGkgLyA4OwogCQkJCWJpdCA9IGkgJSA4OwogCiAJCQkJaWYgKGRhdGFbaW5kZXhdICYgKDEgPDwgYml0KSkKQEAgLTEwMzAsOSArOTY1LDM0IEBACiAJCQlhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyID0gbGUzMl90b19jcHVwKHZhbCk7CiAKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAotCQkJCSAgICJmb3VuZCBwYXRjaCBhZGRyZXNzIGllIDB4JWRcbiIsCisJCQkJICAgImZvdW5kIHBhdGNoIGFkZHJlc3MgaWUgMHgleFxuIiwKIAkJCQkgICBhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyKTsKIAkJCWJyZWFrOworCQljYXNlIEFUSDZLTF9GV19JRV9CT0FSRF9BRERSOgorCQkJaWYgKGllX2xlbiAhPSBzaXplb2YoKnZhbCkpCisJCQkJYnJlYWs7CisKKwkJCXZhbCA9IChfX2xlMzIgKikgZGF0YTsKKwkJCWFyLT5ody5ib2FyZF9hZGRyID0gbGUzMl90b19jcHVwKHZhbCk7CisKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJCSAgICJmb3VuZCBib2FyZCBhZGRyZXNzIGllIDB4JXhcbiIsCisJCQkJICAgYXItPmh3LmJvYXJkX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgQVRINktMX0ZXX0lFX1ZJRl9NQVg6CisJCQlpZiAoaWVfbGVuICE9IHNpemVvZigqdmFsKSkKKwkJCQlicmVhazsKKworCQkJdmFsID0gKF9fbGUzMiAqKSBkYXRhOworCQkJYXItPnZpZl9tYXggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlMzJfdG9fY3B1cCh2YWwpLAorCQkJCQkgICAgQVRINktMX1ZJRl9NQVgpOworCisJCQlpZiAoYXItPnZpZl9tYXggPiAxICYmICFhci0+cDJwKQorCQkJCWFyLT5tYXhfbm9ybV9pZmFjZSA9IDI7CisKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJCSAgICJmb3VuZCB2aWYgbWF4IGllICVkXG4iLCBhci0+dmlmX21heCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiVW5rbm93biBmdyBpZTogJXVcbiIsCiAJCQkJICAgbGUzMl90b19jcHVwKCZoZHItPmlkKSk7CkBAIC0xMDg3LDggKzEwNDcsOCBAQAogCSAqIEZvciBBUjYwMDQsIGhvc3QgZGV0ZXJtaW5lIFRhcmdldCBSQU0gYWRkcmVzcyBmb3IKIAkgKiB3cml0aW5nIGJvYXJkIGRhdGEuCiAJICovCi0JaWYgKGFyLT50YXJnZXRfdHlwZSA9PSBUQVJHRVRfVFlQRV9BUjYwMDQpIHsKLQkJYm9hcmRfYWRkcmVzcyA9IEFSNjAwNF9SRVYxX0JPQVJEX0RBVEFfQUREUkVTUzsKKwlpZiAoYXItPmh3LmJvYXJkX2FkZHIgIT0gMCkgeworCQlib2FyZF9hZGRyZXNzID0gYXItPmh3LmJvYXJkX2FkZHI7CiAJCWF0aDZrbF9ibWlfd3JpdGUoYXIsCiAJCQkJYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsCiAJCQkJSElfSVRFTShoaV9ib2FyZF9kYXRhKSksCkBAIC0xMTA2LDcgKzEwNjYsOCBAQAogCQkJSElfSVRFTShoaV9ib2FyZF9leHRfZGF0YSkpLAogCQkJKHU4ICopICZib2FyZF9leHRfYWRkcmVzcywgNCk7CiAKLQlpZiAoYm9hcmRfZXh0X2FkZHJlc3MgPT0gMCkgeworCWlmIChhci0+dGFyZ2V0X3R5cGUgPT0gVEFSR0VUX1RZUEVfQVI2MDAzICYmCisJICAgIGJvYXJkX2V4dF9hZGRyZXNzID09IDApIHsKIAkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGdldCBib2FyZCBmaWxlIHRhcmdldCBhZGRyZXNzLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTExMjYsOCArMTA4Nyw4IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChhci0+ZndfYm9hcmRfbGVuID09IChib2FyZF9kYXRhX3NpemUgKwotCQkJCSBib2FyZF9leHRfZGF0YV9zaXplKSkgeworCWlmIChib2FyZF9leHRfYWRkcmVzcyAmJgorCSAgICBhci0+ZndfYm9hcmRfbGVuID09IChib2FyZF9kYXRhX3NpemUgKyBib2FyZF9leHRfZGF0YV9zaXplKSkgewogCiAJCS8qIHdyaXRlIGV4dGVuZGVkIGJvYXJkIGRhdGEgKi8KIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCkBAIC0xMTgyLDEwICsxMTQzLDExIEBACiBzdGF0aWMgaW50IGF0aDZrbF91cGxvYWRfb3RwKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXUzMiBhZGRyZXNzLCBwYXJhbTsKKwlib29sIGZyb21faHcgPSBmYWxzZTsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04oYXItPmZ3X290cCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGFyLT5md19vdHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmFwcF9sb2FkX2FkZHI7CiAKQEAgLTEyMTAsMTUgKzExNzIsMjAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPSBhZGRyZXNzOworCWlmIChhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPT0gMCkgeworCQlhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPSBhZGRyZXNzOworCQlmcm9tX2h3ID0gdHJ1ZTsKKwl9CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImFwcF9zdGFydF9vdmVycmlkZV9hZGRyIDB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJhcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciVzIDB4JXhcbiIsCisJCSAgIGZyb21faHcgPyAiIChmcm9tIGh3KSIgOiAiIiwKIAkJICAgYXItPmh3LmFwcF9zdGFydF9vdmVycmlkZV9hZGRyKTsKIAogCS8qIGV4ZWN1dGUgdGhlIE9UUCBjb2RlICovCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJleGVjdXRpbmcgT1RQIGF0IDB4JXhcbiIsIGFkZHJlc3MpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZXhlY3V0aW5nIE9UUCBhdCAweCV4XG4iLAorCQkgICBhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIpOwogCXBhcmFtID0gMDsKLQlhdGg2a2xfYm1pX2V4ZWN1dGUoYXIsIGFkZHJlc3MsICZwYXJhbSk7CisJYXRoNmtsX2JtaV9leGVjdXRlKGFyLCBhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIsICZwYXJhbSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIyOSw3ICsxMTk2LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKFdBUk5fT04oYXItPmZ3ID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmFwcF9sb2FkX2FkZHI7CiAKQEAgLTEyNTksOCArMTIyNiw4IEBACiAJdTMyIGFkZHJlc3MsIHBhcmFtOwogCWludCByZXQ7CiAKLQlpZiAoV0FSTl9PTihhci0+ZndfcGF0Y2ggPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PRU5UOworCWlmIChhci0+ZndfcGF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkcjsKIApAQCAtMTM0NSw3ICsxMzEyLDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCS8qIFdBUiB0byBhdm9pZCBTRElPIENSQyBlcnIgKi8KLQlpZiAoYXItPnZlcnNpb24udGFyZ2V0X3ZlciA9PSBBUjYwMDNfUkVWMl9WRVJTSU9OKSB7CisJaWYgKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPT0gQVI2MDAzX0hXXzJfMF9WRVJTSU9OKSB7CiAJCWF0aDZrbF9lcnIoInRlbXBvcmFyeSB3YXIgdG8gYXZvaWQgc2RpbyBjcmMgZXJyb3JcbiIpOwogCiAJCXBhcmFtID0gMHgyMDsKQEAgLTE0MDIsNDMgKzEzNjksMjkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JLyogQ29uZmlndXJlIEdQSU8gQVI2MDAzIFVBUlQgKi8KLQlwYXJhbSA9IENPTkZJR19BUjYwMHhfREVCVUdfVUFSVF9UWF9QSU47Ci0Jc3RhdHVzID0gYXRoNmtsX2JtaV93cml0ZShhciwKLQkJCQkgIGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLAotCQkJCSAgSElfSVRFTShoaV9kYmdfdWFydF90eHBpbikpLAotCQkJCSAgKHU4ICopJnBhcmFtLCA0KTsKLQogCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2luaXRfaHdfcGFyYW1zKHN0cnVjdCBhdGg2a2wgKmFyKQogewotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkciA9IEFSNjAwM19SRVYyX0RBVEFTRVRfUEFUQ0hfQUREUkVTUzsKLQkJYXItPmh3LmFwcF9sb2FkX2FkZHIgPSBBUjYwMDNfUkVWMl9BUFBfTE9BRF9BRERSRVNTOwotCQlhci0+aHcuYm9hcmRfZXh0X2RhdGFfYWRkciA9IEFSNjAwM19SRVYyX0JPQVJEX0VYVF9EQVRBX0FERFJFU1M7Ci0JCWFyLT5ody5yZXNlcnZlZF9yYW1fc2l6ZSA9IEFSNjAwM19SRVYyX1JBTV9SRVNFUlZFX1NJWkU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkciA9IEFSNjAwM19SRVYzX0RBVEFTRVRfUEFUQ0hfQUREUkVTUzsKLQkJYXItPmh3LmFwcF9sb2FkX2FkZHIgPSAweDEyMzQ7Ci0JCWFyLT5ody5ib2FyZF9leHRfZGF0YV9hZGRyID0gQVI2MDAzX1JFVjNfQk9BUkRfRVhUX0RBVEFfQUREUkVTUzsKLQkJYXItPmh3LnJlc2VydmVkX3JhbV9zaXplID0gQVI2MDAzX1JFVjNfUkFNX1JFU0VSVkVfU0laRTsKLQkJYnJlYWs7Ci0JY2FzZSBBUjYwMDRfUkVWMV9WRVJTSU9OOgotCQlhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyID0gQVI2MDAzX1JFVjJfREFUQVNFVF9QQVRDSF9BRERSRVNTOwotCQlhci0+aHcuYXBwX2xvYWRfYWRkciA9IEFSNjAwM19SRVYzX0FQUF9MT0FEX0FERFJFU1M7Ci0JCWFyLT5ody5ib2FyZF9leHRfZGF0YV9hZGRyID0gQVI2MDA0X1JFVjFfQk9BUkRfRVhUX0RBVEFfQUREUkVTUzsKLQkJYXItPmh3LnJlc2VydmVkX3JhbV9zaXplID0gQVI2MDA0X1JFVjFfUkFNX1JFU0VSVkVfU0laRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwljb25zdCBzdHJ1Y3QgYXRoNmtsX2h3ICpodzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3X2xpc3QpOyBpKyspIHsKKwkJaHcgPSAmaHdfbGlzdFtpXTsKKworCQlpZiAoaHctPmlkID09IGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGh3X2xpc3QpKSB7CiAJCWF0aDZrbF9lcnIoIlVuc3VwcG9ydGVkIGhhcmR3YXJlIHZlcnNpb246IDB4JXhcbiIsCiAJCQkgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYXItPmh3ID0gKmh3OworCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCiAJCSAgICJ0YXJnZXRfdmVyIDB4JXggdGFyZ2V0X3R5cGUgMHgleCBkYXRhc2V0X3BhdGNoIDB4JXggYXBwX2xvYWRfYWRkciAweCV4XG4iLAogCQkgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyLCBhci0+dGFyZ2V0X3R5cGUsCkBAIC0xNDQ3LDUxICsxNDAwLDI0NiBAQAogCQkgICAiYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgMHgleCBib2FyZF9leHRfZGF0YV9hZGRyIDB4JXggcmVzZXJ2ZWRfcmFtX3NpemUgMHgleCIsCiAJCSAgIGFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciwgYXItPmh3LmJvYXJkX2V4dF9kYXRhX2FkZHIsCiAJCSAgIGFyLT5ody5yZXNlcnZlZF9yYW1fc2l6ZSk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJyZWZjbGtfaHogJWQgdWFydHR4X3BpbiAlZCIsCisJCSAgIGFyLT5ody5yZWZjbGtfaHosIGFyLT5ody51YXJ0dHhfcGluKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgY29uc3QgY2hhciAqYXRoNmtsX2luaXRfZ2V0X2hpZl9uYW1lKGVudW0gYXRoNmtsX2hpZl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwotCWludCBzdGF0dXMgPSAwOwotCXMzMiB0aW1lbGVmdDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFUSDZLTF9ISUZfVFlQRV9TRElPOgorCQlyZXR1cm4gInNkaW8iOworCWNhc2UgQVRINktMX0hJRl9UWVBFX1VTQjoKKwkJcmV0dXJuICJ1c2IiOworCX0KIAotCWlmICghYXIpCi0JCXJldHVybiAtRUlPOworCXJldHVybiBOVUxMOworfQorCitpbnQgYXRoNmtsX2luaXRfaHdfc3RhcnQoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJbG9uZyB0aW1lbGVmdDsKKwlpbnQgcmV0LCBpOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJodyBzdGFydFxuIik7CisKKwlyZXQgPSBhdGg2a2xfaGlmX3Bvd2VyX29uKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCXJldCA9IGF0aDZrbF9pbml0X3VwbG9hZChhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCiAJLyogRG8gd2UgbmVlZCB0byBmaW5pc2ggdGhlIEJNSSBwaGFzZSAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgZnJvbSBhdGg2a2xfYm1pX2RvbmUoKSAqLwogCWlmIChhdGg2a2xfYm1pX2RvbmUoYXIpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYXRoNmtsX2luaXRfZG9uZTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAotCS8qIEluZGljYXRlIHRoYXQgV01JIGlzIGVuYWJsZWQgKGFsdGhvdWdoIG5vdCByZWFkeSB5ZXQpICovCi0Jc2V0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhci0+d21pID0gYXRoNmtsX3dtaV9pbml0KGFyKTsKLQlpZiAoIWFyLT53bWkpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgd21pXG4iKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBhdGg2a2xfaW5pdF9kb25lOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogZ290IHdtaSBAIDB4JXAuXG4iLCBfX2Z1bmNfXywgYXItPndtaSk7Ci0KIAkvKgogCSAqIFRoZSByZWFzb24gd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgdGFyZ2V0IGhlcmUgaXMgdGhhdCB0aGUKIAkgKiBkcml2ZXIgbGF5ZXIgaGFzIHRvIGluaXQgQk1JIGluIG9yZGVyIHRvIHNldCB0aGUgaG9zdCBibG9jawogCSAqIHNpemUuCiAJICovCiAJaWYgKGF0aDZrbF9odGNfd2FpdF90YXJnZXQoYXItPmh0Y190YXJnZXQpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX25vZGVfY2xlYW51cDsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAogCWlmIChhdGg2a2xfaW5pdF9zZXJ2aWNlX2VwKGFyKSkgewotCQlzdGF0dXMgPSAtRUlPOworCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVycl9jbGVhbnVwX3NjYXR0ZXI7CiAJfQogCisJLyogc2V0dXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiAqLworCWF0aDZrbF9jcmVkaXRfc2V0dXAoYXItPmh0Y190YXJnZXQsICZhci0+Y3JlZGl0X3N0YXRlX2luZm8pOworCisJLyogc3RhcnQgSFRDICovCisJcmV0ID0gYXRoNmtsX2h0Y19zdGFydChhci0+aHRjX3RhcmdldCk7CisJaWYgKHJldCkgeworCQkvKiBGSVhNRTogY2FsbCB0aGlzICovCisJCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7CisJCWdvdG8gZXJyX2NsZWFudXBfc2NhdHRlcjsKKwl9CisKKwkvKiBXYWl0IGZvciBXbWkgZXZlbnQgdG8gYmUgcmVhZHkgKi8KKwl0aW1lbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKKwkJCQkJCSAgICB0ZXN0X2JpdChXTUlfUkVBRFksCisJCQkJCQkJICAgICAmYXItPmZsYWcpLAorCQkJCQkJICAgIFdNSV9USU1FT1VUKTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZmlybXdhcmUgYm9vdGVkXG4iKTsKKworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGSVJTVF9CT09ULCAmYXItPmZsYWcpKSB7CisJCWF0aDZrbF9pbmZvKCIlcyAlcyBmdyAlcyVzXG4iLAorCQkJICAgIGFyLT5ody5uYW1lLAorCQkJICAgIGF0aDZrbF9pbml0X2dldF9oaWZfbmFtZShhci0+aGlmX3R5cGUpLAorCQkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbiwKKwkJCSAgICB0ZXN0X2JpdChURVNUTU9ERSwgJmFyLT5mbGFnKSA/ICIgdGVzdG1vZGUiIDogIiIpOworCX0KKworCWlmIChhci0+dmVyc2lvbi5hYmlfdmVyICE9IEFUSDZLTF9BQklfVkVSU0lPTikgeworCQlhdGg2a2xfZXJyKCJhYmkgdmVyc2lvbiBtaXNtYXRjaDogaG9zdCgweCV4KSwgdGFyZ2V0KDB4JXgpXG4iLAorCQkJICAgQVRINktMX0FCSV9WRVJTSU9OLCBhci0+dmVyc2lvbi5hYmlfdmVyKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJaWYgKCF0aW1lbGVmdCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlhdGg2a2xfZXJyKCJ3bWkgaXMgbm90IHJlYWR5IG9yIHdhaXQgd2FzIGludGVycnVwdGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiB3bWkgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKKworCS8qIGNvbW11bmljYXRlIHRoZSB3bWkgcHJvdG9jb2wgdmVyaXNpb24gdG8gdGhlIHRhcmdldCAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgKi8KKwlpZiAoKGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShhcikpICE9IDApCisJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdGhlIGhvc3QgYXBwIGFyZWFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGFyLT52aWZfbWF4OyBpKyspIHsKKwkJcmV0ID0gYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoYXIsIGkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09OOworCisJcmV0dXJuIDA7CisKK2Vycl9odGNfc3RvcDoKKwlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOworZXJyX2NsZWFudXBfc2NhdHRlcjoKKwlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcihhcik7CitlcnJfcG93ZXJfb2ZmOgorCWF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWludCByZXQ7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImh3IHN0b3BcbiIpOworCisJYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKKworCWF0aDZrbF9oaWZfc3RvcChhcik7CisKKwlhdGg2a2xfYm1pX3Jlc2V0KGFyKTsKKworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKwlpZiAocmV0KQorCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIHBvd2VyIG9mZiBoaWY6ICVkXG4iLCByZXQpOworCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09GRjsKKworCXJldHVybiAwOworfQorCitpbnQgYXRoNmtsX2NvcmVfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX2JtaV90YXJnZXRfaW5mbyB0YXJnX2luZm87CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJaW50IHJldCA9IDAsIGk7CisKKwlhci0+YXRoNmtsX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDZrbCIpOworCWlmICghYXItPmF0aDZrbF93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhdGg2a2xfYm1pX2luaXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3dxOworCisJLyoKKwkgKiBUdXJuIG9uIHBvd2VyIHRvIGdldCBoYXJkd2FyZSAodGFyZ2V0KSB2ZXJzaW9uIGFuZCBsZWF2ZSBwb3dlcgorCSAqIG9uIGRlbGlicmF0ZWx5IGFzIHdlIHdpbGwgYm9vdCB0aGUgaGFyZHdhcmUgYW55d2F5IHdpdGhpbiBmZXcKKwkgKiBzZWNvbmRzLgorCSAqLworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb24oYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2JtaV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2JtaV9nZXRfdGFyZ2V0X2luZm8oYXIsICZ0YXJnX2luZm8pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCWFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udmVyc2lvbik7CisJYXItPnRhcmdldF90eXBlID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnR5cGUpOworCWFyLT53aXBoeS0+aHdfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby52ZXJzaW9uKTsKKworCXJldCA9IGF0aDZrbF9pbml0X2h3X3BhcmFtcyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOworCisJYXItPmh0Y190YXJnZXQgPSBhdGg2a2xfaHRjX2NyZWF0ZShhcik7CisKKwlpZiAoIWFyLT5odGNfdGFyZ2V0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhdGg2a2xfZmV0Y2hfZmlybXdhcmVzKGFyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZnJlZSBhbGwgZmlybXdhcmVzIGluIHRoZSBlcnJvciBjYXNlcyBiZWxvdyAqLworCisJLyogSW5kaWNhdGUgdGhhdCBXTUkgaXMgZW5hYmxlZCAoYWx0aG91Z2ggbm90IHJlYWR5IHlldCkgKi8KKwlzZXRfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWFyLT53bWkgPSBhdGg2a2xfd21pX2luaXQoYXIpOworCWlmICghYXItPndtaSkgeworCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB3bWlcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IGdvdCB3bWkgQCAweCVwLlxuIiwgX19mdW5jX18sIGFyLT53bWkpOworCisJcmV0ID0gYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbm9kZV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2RlYnVnX2luaXQoYXIpOworCWlmIChyZXQpIHsKKwkJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCQlnb3RvIGVycl9ub2RlX2NsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFyLT52aWZfbWF4OyBpKyspCisJCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVChpKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogQWRkIGFuIGluaXRpYWwgc3RhdGlvbiBpbnRlcmZhY2UgKi8KKwluZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsICJ3bGFuJWQiLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLCAwLAorCQkJCSAgICBJTkZSQV9ORVRXT1JLKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwlpZiAoIW5kZXYpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgbmV0d29yayBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQl3aXBoeV91bnJlZ2lzdGVyKGFyLT53aXBoeSk7CisJCWdvdG8gZXJyX2RlYnVnX2luaXQ7CisJfQorCisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IG5hbWU9JXMgZGV2PTB4JXAsIGFyPTB4JXBcbiIsCisJCQlfX2Z1bmNfXywgbmRldi0+bmFtZSwgbmRldiwgYXIpOworCiAJLyogc2V0dXAgYWNjZXNzIGNsYXNzIHByaW9yaXR5IG1hcHBpbmdzICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CS10gPSAwOyAvKiBsb3dlc3QgICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CRV0gPSAxOwpAQCAtMTUwNSwxNTcgKzE2NTMsMTAwIEBACiAJLyogYWxsb2NhdGUgc29tZSBidWZmZXJzIHRoYXQgaGFuZGxlIGxhcmdlciBBTVNEVSBmcmFtZXMgKi8KIAlhdGg2a2xfcmVmaWxsX2Ftc2R1X3J4YnVmcyhhciwgQVRINktMX01BWF9BTVNEVV9SWF9CVUZGRVJTKTsKIAotCS8qIHNldHVwIGNyZWRpdCBkaXN0cmlidXRpb24gKi8KLQlhdGg2a19zZXR1cF9jcmVkaXRfZGlzdChhci0+aHRjX3RhcmdldCwgJmFyLT5jcmVkaXRfc3RhdGVfaW5mbyk7Ci0KIAlhdGg2a2xfY29va2llX2luaXQoYXIpOwogCi0JLyogc3RhcnQgSFRDICovCi0Jc3RhdHVzID0gYXRoNmtsX2h0Y19zdGFydChhci0+aHRjX3RhcmdldCk7Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7Ci0JCWdvdG8gZXJyX3J4YnVmX2NsZWFudXA7Ci0JfQotCi0JLyogV2FpdCBmb3IgV21pIGV2ZW50IHRvIGJlIHJlYWR5ICovCi0JdGltZWxlZnQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhci0+ZXZlbnRfd3EsCi0JCQkJCQkgICAgdGVzdF9iaXQoV01JX1JFQURZLAotCQkJCQkJCSAgICAgJmFyLT5mbGFnKSwKLQkJCQkJCSAgICBXTUlfVElNRU9VVCk7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImZpcm13YXJlIGJvb3RlZFxuIik7Ci0KLQlpZiAoYXItPnZlcnNpb24uYWJpX3ZlciAhPSBBVEg2S0xfQUJJX1ZFUlNJT04pIHsKLQkJYXRoNmtsX2VycigiYWJpIHZlcnNpb24gbWlzbWF0Y2g6IGhvc3QoMHgleCksIHRhcmdldCgweCV4KVxuIiwKLQkJCSAgIEFUSDZLTF9BQklfVkVSU0lPTiwgYXItPnZlcnNpb24uYWJpX3Zlcik7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX2h0Y19zdG9wOwotCX0KLQotCWlmICghdGltZWxlZnQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJYXRoNmtsX2Vycigid21pIGlzIG5vdCByZWFkeSBvciB3YWl0IHdhcyBpbnRlcnJ1cHRlZFxuIik7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX2h0Y19zdG9wOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogd21pIGlzIHJlYWR5XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBjb21tdW5pY2F0ZSB0aGUgd21pIHByb3RvY29sIHZlcmlzaW9uIHRvIHRoZSB0YXJnZXQgKi8KLQlpZiAoKGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShhcikpICE9IDApCi0JCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdGhlIGhvc3QgYXBwIGFyZWFcbiIpOwotCiAJYXItPmNvbmZfZmxhZ3MgPSBBVEg2S0xfQ09ORl9JR05PUkVfRVJQX0JBUktFUiB8CiAJCQkgQVRINktMX0NPTkZfRU5BQkxFXzExTiB8IEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVDsKIAotCWFyLT53ZGV2LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19GV19ST0FNIHwKLQkJCQkgIFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUU7CisJaWYgKHN1c3BlbmRfY3V0cG93ZXIpCisJCWFyLT5jb25mX2ZsYWdzIHw9IEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVI7CiAKLQlzdGF0dXMgPSBhdGg2a2xfdGFyZ2V0X2NvbmZpZ193bGFuX3BhcmFtcyhhcik7Ci0JaWYgKCFzdGF0dXMpCi0JCWdvdG8gYXRoNmtsX2luaXRfZG9uZTsKKwlhci0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfRldfUk9BTSB8CisJCQkgICAgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSB8CisJCQkgICAgV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwgfAorCQkJICAgIFdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FEOwogCi1lcnJfaHRjX3N0b3A6Ci0JYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKKwlpZiAodGVzdF9iaXQoQVRINktMX0ZXX0NBUEFCSUxJVFlfU0NIRURfU0NBTiwgYXItPmZ3X2NhcGFiaWxpdGllcykpCisJCWFyLT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19TQ0hFRF9TQ0FOOworCisJYXItPndpcGh5LT5wcm9iZV9yZXNwX29mZmxvYWQgPQorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUyB8CisJCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfV1BTMiB8CisJCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQIHwKKwkJTkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF84MDIxMVU7CisKKwlzZXRfYml0KEZJUlNUX0JPT1QsICZhci0+ZmxhZyk7CisKKwlyZXQgPSBhdGg2a2xfaW5pdF9od19zdGFydChhcik7CisJaWYgKHJldCkgeworCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gc3RhcnQgaGFyZHdhcmU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9yeGJ1Zl9jbGVhbnVwOworCX0KKworCS8qCisJICogU2V0IG1hYyBhZGRyZXNzIHdoaWNoIGlzIHJlY2VpdmVkIGluIHJlYWR5IGV2ZW50CisJICogRklYTUU6IE1vdmUgdG8gYXRoNmtsX2ludGVyZmFjZV9hZGQoKQorCSAqLworCW1lbWNweShuZGV2LT5kZXZfYWRkciwgYXItPm1hY19hZGRyLCBFVEhfQUxFTik7CisKKwlyZXR1cm4gcmV0OworCiBlcnJfcnhidWZfY2xlYW51cDoKIAlhdGg2a2xfaHRjX2ZsdXNoX3J4X2J1Zihhci0+aHRjX3RhcmdldCk7CiAJYXRoNmtsX2NsZWFudXBfYW1zZHVfcnhidWZzKGFyKTsKLWVycl9jbGVhbnVwX3NjYXR0ZXI6Ci0JYXRoNmtsX2hpZl9jbGVhbnVwX3NjYXR0ZXIoYXIpOworCXJ0bmxfbG9jaygpOworCWF0aDZrbF9kZWluaXRfaWZfZGF0YShuZXRkZXZfcHJpdihuZGV2KSk7CisJcnRubF91bmxvY2soKTsKKwl3aXBoeV91bnJlZ2lzdGVyKGFyLT53aXBoeSk7CitlcnJfZGVidWdfaW5pdDoKKwlhdGg2a2xfZGVidWdfY2xlYW51cChhcik7CiBlcnJfbm9kZV9jbGVhbnVwOgogCWF0aDZrbF93bWlfc2h1dGRvd24oYXItPndtaSk7CiAJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOwogCWFyLT53bWkgPSBOVUxMOwotCi1hdGg2a2xfaW5pdF9kb25lOgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhdGg2a2xfY29yZV9pbml0KHN0cnVjdCBhdGg2a2wgKmFyKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhdGg2a2xfYm1pX3RhcmdldF9pbmZvIHRhcmdfaW5mbzsKLQotCWFyLT5hdGg2a2xfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXRoNmtsIik7Ci0JaWYgKCFhci0+YXRoNmtsX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IGF0aDZrbF9ibWlfaW5pdChhcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfd3E7Ci0KLQlyZXQgPSBhdGg2a2xfYm1pX2dldF90YXJnZXRfaW5mbyhhciwgJnRhcmdfaW5mbyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfYm1pX2NsZWFudXA7Ci0KLQlhci0+dmVyc2lvbi50YXJnZXRfdmVyID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnZlcnNpb24pOwotCWFyLT50YXJnZXRfdHlwZSA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby50eXBlKTsKLQlhci0+d2Rldi0+d2lwaHktPmh3X3ZlcnNpb24gPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udmVyc2lvbik7Ci0KLQlyZXQgPSBhdGg2a2xfaW5pdF9od19wYXJhbXMoYXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2JtaV9jbGVhbnVwOwotCi0JcmV0ID0gYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoYXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2JtaV9jbGVhbnVwOwotCi0JYXItPmh0Y190YXJnZXQgPSBhdGg2a2xfaHRjX2NyZWF0ZShhcik7Ci0KLQlpZiAoIWFyLT5odGNfdGFyZ2V0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2JtaV9jbGVhbnVwOwotCX0KLQotCWFyLT5hZ2dyX2NudHh0ID0gYWdncl9pbml0KGFyLT5uZXRfZGV2KTsKLQlpZiAoIWFyLT5hZ2dyX2NudHh0KSB7Ci0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIGFnZ3JcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9odGNfY2xlYW51cDsKLQl9Ci0KLQlyZXQgPSBhdGg2a2xfZmV0Y2hfZmlybXdhcmVzKGFyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9odGNfY2xlYW51cDsKLQotCXJldCA9IGF0aDZrbF9pbml0X3VwbG9hZChhcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfaHRjX2NsZWFudXA7Ci0KLQlyZXQgPSBhdGg2a2xfaW5pdChhci0+bmV0X2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfaHRjX2NsZWFudXA7Ci0KLQkvKiBUaGlzIHJ1bnMgdGhlIGluaXQgZnVuY3Rpb24gaWYgcmVnaXN0ZXJlZCAqLwotCXJldCA9IHJlZ2lzdGVyX25ldGRldihhci0+bmV0X2Rldik7Ci0JaWYgKHJldCkgewotCQlhdGg2a2xfZXJyKCJyZWdpc3Rlcl9uZXRkZXYgZmFpbGVkXG4iKTsKLQkJYXRoNmtsX2Rlc3Ryb3koYXItPm5ldF9kZXYsIDApOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNldF9iaXQoTkVUREVWX1JFR0lTVEVSRUQsICZhci0+ZmxhZyk7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IG5hbWU9JXMgZGV2PTB4JXAsIGFyPTB4JXBcbiIsCi0JCQlfX2Z1bmNfXywgYXItPm5ldF9kZXYtPm5hbWUsIGFyLT5uZXRfZGV2LCBhcik7Ci0KLQlyZXR1cm4gcmV0OwotCiBlcnJfaHRjX2NsZWFudXA6CiAJYXRoNmtsX2h0Y19jbGVhbnVwKGFyLT5odGNfdGFyZ2V0KTsKK2Vycl9wb3dlcl9vZmY6CisJYXRoNmtsX2hpZl9wb3dlcl9vZmYoYXIpOwogZXJyX2JtaV9jbGVhbnVwOgogCWF0aDZrbF9ibWlfY2xlYW51cChhcik7CiBlcnJfd3E6CiAJZGVzdHJveV93b3JrcXVldWUoYXItPmF0aDZrbF93cSk7CisKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkIGF0aDZrbF9jbGVhbnVwX3ZpZihzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBib29sIHdtaV9yZWFkeSkKK3sKKwlzdGF0aWMgdTggYmNhc3RfbWFjW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisJYm9vbCBkaXNjb25faXNzdWVkOworCisJbmV0aWZfc3RvcF9xdWV1ZSh2aWYtPm5kZXYpOworCisJY2xlYXJfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOworCisJaWYgKHdtaV9yZWFkeSkgeworCQlkaXNjb25faXNzdWVkID0gdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgfHwKKwkJCQl0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX2Rpc2Nvbm5lY3QodmlmKTsKKwkJZGVsX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIpOworCisJCWlmIChkaXNjb25faXNzdWVkKQorCQkJYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQodmlmLCBESVNDT05ORUNUX0NNRCwKKwkJCQkJCSh2aWYtPm53X3R5cGUgJiBBUF9ORVRXT1JLKSA/CisJCQkJCQliY2FzdF9tYWMgOiB2aWYtPmJzc2lkLAorCQkJCQkJMCwgTlVMTCwgMCk7CisJfQorCisJaWYgKHZpZi0+c2Nhbl9yZXEpIHsKKwkJY2ZnODAyMTFfc2Nhbl9kb25lKHZpZi0+c2Nhbl9yZXEsIHRydWUpOworCQl2aWYtPnNjYW5fcmVxID0gTlVMTDsKKwl9Cit9CisKIHZvaWQgYXRoNmtsX3N0b3BfdHhyeChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGFyLT5uZXRfZGV2OwotCi0JaWYgKCFuZGV2KQotCQlyZXR1cm47CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgKnRtcF92aWY7CiAKIAlzZXRfYml0KERFU1RST1lfSU5fUFJPR1JFU1MsICZhci0+ZmxhZyk7CiAKQEAgLTE2NjQsNjUgKzE3NTUsNDQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChhci0+d2xhbl9wd3Jfc3RhdGUgIT0gV0xBTl9QT1dFUl9TVEFURV9DVVRfUFdSKQotCQlhdGg2a2xfc3RvcF9lbmRwb2ludChuZGV2LCBmYWxzZSwgdHJ1ZSk7CisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmlmLCB0bXBfdmlmLCAmYXItPnZpZl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ2aWYtPmxpc3QpOworCQlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJCWF0aDZrbF9jbGVhbnVwX3ZpZih2aWYsIHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSk7CisJCXJ0bmxfbG9jaygpOworCQlhdGg2a2xfZGVpbml0X2lmX2RhdGEodmlmKTsKKwkJcnRubF91bmxvY2soKTsKKwkJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJY2xlYXJfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKTsKKworCS8qCisJICogQWZ0ZXIgd21pX3NodWRvd24gYWxsIFdNSSBldmVudHMgd2lsbCBiZSBkcm9wcGVkLiBXZQorCSAqIG5lZWQgdG8gY2xlYW51cCB0aGUgYnVmZmVycyBhbGxvY2F0ZWQgaW4gQVAgbW9kZSBhbmQKKwkgKiBnaXZlIGRpc2Nvbm5lY3Qgbm90aWZpY2F0aW9uIHRvIHN0YWNrLCB3aGljaCB1c3VhbGx5CisJICogaGFwcGVucyBpbiB0aGUgZGlzY29ubmVjdF9ldmVudC4gU2ltdWxhdGUgdGhlIGRpc2Nvbm5lY3QKKwkgKiBldmVudCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBkaXJlY3RseS4gU29tZXRpbWVzCisJICogZGlzY29ubmVjdF9ldmVudCB3aWxsIGJlIHJlY2VpdmVkIHdoZW4gdGhlIGRlYnVnIGxvZ3MKKwkgKiBhcmUgY29sbGVjdGVkLgorCSAqLworCWF0aDZrbF93bWlfc2h1dGRvd24oYXItPndtaSk7CisKKwljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7CisJaWYgKGFyLT5odGNfdGFyZ2V0KSB7CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogc2h1dCBkb3duIGh0Y1xuIiwgX19mdW5jX18pOworCQlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOworCX0KKworCS8qCisJICogVHJ5IHRvIHJlc2V0IHRoZSBkZXZpY2UgaWYgd2UgY2FuLiBUaGUgZHJpdmVyIG1heSBoYXZlIGJlZW4KKwkgKiBjb25maWd1cmUgTk9UIHRvIHJlc2V0IHRoZSB0YXJnZXQgZHVyaW5nIGEgZGVidWcgc2Vzc2lvbi4KKwkgKi8KKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAorCQkJImF0dGVtcHRpbmcgdG8gcmVzZXQgdGFyZ2V0IG9uIGluc3RhbmNlIGRlc3Ryb3lcbiIpOworCWF0aDZrbF9yZXNldF9kZXZpY2UoYXIsIGFyLT50YXJnZXRfdHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAKIAljbGVhcl9iaXQoV0xBTl9FTkFCTEVELCAmYXItPmZsYWcpOwogfQotCi0vKgotICogV2UgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHN1cnByaXNlIGFuZCBwbGFubmVkIHJlbW92YWwgb2YgdGhlCi0gKiBkZXZpY2UgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGNvbnNpZGVyYXRpb246Ci0gKgotICogLSBJbiBjYXNlIG9mIHN1cnByaXNlIHJlbW92YWwsIHRoZSBoY2QgYWxyZWFkeSBmcmVlcyB1cCB0aGUgcGVuZGluZwotICogICBmb3IgdGhlIGRldmljZSBhbmQgaGVuY2UgdGhlcmUgaXMgbm8gbmVlZCB0byB1bnJlZ2lzdGVyIHRoZSBmdW5jdGlvbgotICogICBkcml2ZXIgaW5vcmRlciB0byBnZXQgdGhlc2UgcmVxdWVzdHMuIEZvciBwbGFubmVkIHJlbW92YWwsIHRoZSBmdW5jdGlvbgotICogICBkcml2ZXIgaGFzIHRvIGV4cGxpY2l0bHkgdW5yZWdpc3RlciBpdHNlbGYgdG8gaGF2ZSB0aGUgaGNkIHJldHVybiBhbGwgdGhlCi0gKiAgIHBlbmRpbmcgcmVxdWVzdHMgYmVmb3JlIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBkZXZpY2VzIGFyZSBmcmVlZCB1cC4KLSAqICAgTm90ZSB0aGF0IGFzIHBlciB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGZ1bmN0aW9uIGRyaXZlciB3aWxsCi0gKiAgIGVuZCB1cCByZWxlYXNpbmcgYWxsIHRoZSBkZXZpY2VzIHNpbmNlIHRoZXJlIGlzIG5vIEFQSSB0byBzZWxlY3RpdmVseQotICogICByZWxlYXNlIGEgcGFydGljdWxhciBkZXZpY2UuCi0gKgotICogLSBDZXJ0YWluIGNvbW1hbmRzIGlzc3VlZCB0byB0aGUgdGFyZ2V0IGNhbiBiZSBza2lwcGVkIGZvciBzdXJwcmlzZQotICogICByZW1vdmFsIHNpbmNlIHRoZXkgd2lsbCBhbnl3YXkgbm90IGdvIHRocm91Z2guCi0gKi8KLXZvaWQgYXRoNmtsX2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHVucmVnaXN0ZXIpCi17Ci0Jc3RydWN0IGF0aDZrbCAqYXI7Ci0KLQlpZiAoIWRldiB8fCAhYXRoNmtsX3ByaXYoZGV2KSkgewotCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gZ2V0IGRldmljZSBzdHJ1Y3R1cmVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JYXIgPSBhdGg2a2xfcHJpdihkZXYpOwotCi0JZGVzdHJveV93b3JrcXVldWUoYXItPmF0aDZrbF93cSk7Ci0KLQlpZiAoYXItPmh0Y190YXJnZXQpCi0JCWF0aDZrbF9odGNfY2xlYW51cChhci0+aHRjX3RhcmdldCk7Ci0KLQlhZ2dyX21vZHVsZV9kZXN0cm95KGFyLT5hZ2dyX2NudHh0KTsKLQotCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7Ci0KLQlhdGg2a2xfY2xlYW51cF9hbXNkdV9yeGJ1ZnMoYXIpOwotCi0JYXRoNmtsX2JtaV9jbGVhbnVwKGFyKTsKLQotCWF0aDZrbF9kZWJ1Z19jbGVhbnVwKGFyKTsKLQotCWlmICh1bnJlZ2lzdGVyICYmIHRlc3RfYml0KE5FVERFVl9SRUdJU1RFUkVELCAmYXItPmZsYWcpKSB7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JCWNsZWFyX2JpdChORVRERVZfUkVHSVNURVJFRCwgJmFyLT5mbGFnKTsKLQl9Ci0KLQlmcmVlX25ldGRldihkZXYpOwotCi0Ja2ZyZWUoYXItPmZ3X2JvYXJkKTsKLQlrZnJlZShhci0+Zndfb3RwKTsKLQlrZnJlZShhci0+ZncpOwotCWtmcmVlKGFyLT5md19wYXRjaCk7Ci0KLQlhdGg2a2xfY2ZnODAyMTFfZGVpbml0KGFyKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKaW5kZXggMzBiNWE1My4uZWVhM2M3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKQEAgLTIwLDEyICsyMCwxMyBAQAogI2luY2x1ZGUgInRhcmdldC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXN0cnVjdCBhdGg2a2xfc3RhICphdGg2a2xfZmluZF9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpub2RlX2FkZHIpCitzdHJ1Y3QgYXRoNmtsX3N0YSAqYXRoNmtsX2ZpbmRfc3RhKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4ICpub2RlX2FkZHIpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uID0gTlVMTDsKIAl1OCBpLCBtYXhfY29ubjsKIAotCW1heF9jb25uID0gKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspID8gQVBfTUFYX05VTV9TVEEgOiAwOworCW1heF9jb25uID0gKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSA/IEFQX01BWF9OVU1fU1RBIDogMDsKIAogCWZvciAoaSA9IDA7IGkgPCBtYXhfY29ubjsgaSsrKSB7CiAJCWlmIChtZW1jbXAobm9kZV9hZGRyLCBhci0+c3RhX2xpc3RbaV0ubWFjLCBFVEhfQUxFTikgPT0gMCkgewpAQCAtMTc0LDY0ICsxNzUsNiBAQAogCWFyLT5jb29raWVfY291bnQrKzsKIH0KIAotLyogc2V0IHRoZSB3aW5kb3cgYWRkcmVzcyByZWdpc3RlciAodXNpbmcgNC1ieXRlIHJlZ2lzdGVyIGFjY2VzcyApLiAqLwotc3RhdGljIGludCBhdGg2a2xfc2V0X2FkZHJ3aW5fcmVnKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgcmVnX2FkZHIsIHUzMiBhZGRyKQotewotCWludCBzdGF0dXM7Ci0JczMyIGk7Ci0JX19sZTMyIGFkZHJfdmFsOwotCi0JLyoKLQkgKiBXcml0ZSBieXRlcyAxLDIsMyBvZiB0aGUgcmVnaXN0ZXIgdG8gc2V0IHRoZSB1cHBlciBhZGRyZXNzIGJ5dGVzLAotCSAqIHRoZSBMU0IgaXMgd3JpdHRlbiBsYXN0IHRvIGluaXRpYXRlIHRoZSBhY2Nlc3MgY3ljbGUKLQkgKi8KLQotCWZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7Ci0JCS8qCi0JCSAqIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhZGRyZXNzIGJ5dGUgdmFsdWUgd2Ugd2FudCB0bwotCQkgKiBoaXQgNCB0aW1lcy4gTm8gbmVlZCB0byB3b3JyeSBhYm91dCBlbmRpYW5uZXNzIGFzIHRoZQotCQkgKiBzYW1lIGJ5dGUgaXMgY29waWVkIHRvIGFsbCBmb3VyIGJ5dGVzIG9mIGFkZHJfdmFsIGF0Ci0JCSAqIGFueSB0aW1lLgotCQkgKi8KLQkJbWVtc2V0KCh1OCAqKSZhZGRyX3ZhbCwgKCh1OCAqKSZhZGRyKVtpXSwgNCk7Ci0KLQkJLyoKLQkJICogSGl0IGVhY2ggYnl0ZSBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB3aXRoIGEgNC1ieXRlCi0JCSAqIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgc2FtZSBhZGRyZXNzLCB0aGlzIGlzIGEgaGFybWxlc3MKLQkJICogb3BlcmF0aW9uLgotCQkgKi8KLQkJc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhhciwgcmVnX2FkZHIgKyBpLCAodTggKikmYWRkcl92YWwsCi0JCQkJCSAgICAgNCwgSElGX1dSX1NZTkNfQllURV9GSVgpOwotCQlpZiAoc3RhdHVzKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cykgewotCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBieXRlcyBvZiAweCV4IHRvIHdpbmRvdyByZWc6IDB4JVhcbiIsCi0JCQkgICBhZGRyLCByZWdfYWRkcik7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZSB0aGUgYWRkcmVzcyByZWdpc3RlciBhZ2FpbiwgdGhpcyB0aW1lIHdyaXRlIHRoZSB3aG9sZQotCSAqIDQtYnl0ZSB2YWx1ZS4gVGhlIGVmZmVjdCBoZXJlIGlzIHRoYXQgdGhlIExTQiB3cml0ZSBjYXVzZXMgdGhlCi0JICogY3ljbGUgdG8gc3RhcnQsIHRoZSBleHRyYSAzIGJ5dGUgd3JpdGUgdG8gYnl0ZXMgMSwyLDMgaGFzIG5vCi0JICogZWZmZWN0IHNpbmNlIHdlIGFyZSB3cml0aW5nIHRoZSBzYW1lIHZhbHVlcyBhZ2FpbgotCSAqLwotCWFkZHJfdmFsID0gY3B1X3RvX2xlMzIoYWRkcik7Ci0Jc3RhdHVzID0gaGlmX3JlYWRfd3JpdGVfc3luYyhhciwgcmVnX2FkZHIsCi0JCQkJICAgICAodTggKikmKGFkZHJfdmFsKSwKLQkJCQkgICAgIDQsIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHdyaXRlIDB4JXggdG8gd2luZG93IHJlZzogMHglWFxuIiwKLQkJCSAgIGFkZHIsIHJlZ19hZGRyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIFJlYWQgZnJvbSB0aGUgaGFyZHdhcmUgdGhyb3VnaCBpdHMgZGlhZ25vc3RpYyB3aW5kb3cuIE5vIGNvb3BlcmF0aW9uCiAgKiBmcm9tIHRoZSBmaXJtd2FyZSBpcyByZXF1aXJlZCBmb3IgdGhpcy4KQEAgLTI0MCwxNCArMTgzLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JLyogc2V0IHdpbmRvdyByZWdpc3RlciB0byBzdGFydCByZWFkIGN5Y2xlICovCi0JcmV0ID0gYXRoNmtsX3NldF9hZGRyd2luX3JlZyhhciwgV0lORE9XX1JFQURfQUREUl9BRERSRVNTLCBhZGRyZXNzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogcmVhZCB0aGUgZGF0YSAqLwotCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIFdJTkRPV19EQVRBX0FERFJFU1MsICh1OCAqKSB2YWx1ZSwKLQkJCQkgIHNpemVvZigqdmFsdWUpLCBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisJcmV0ID0gYXRoNmtsX2hpZl9kaWFnX3JlYWQzMihhciwgYWRkcmVzcywgdmFsdWUpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX3dhcm4oImZhaWxlZCB0byByZWFkMzIgdGhyb3VnaCBkaWFnbm9zZSB3aW5kb3c6ICVkXG4iLAogCQkJICAgIHJldCk7CkBAIC0yNjUsMTggKzIwMSwxNSBAQAogewogCWludCByZXQ7CiAKLQkvKiBzZXQgd3JpdGUgZGF0YSAqLwotCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIFdJTkRPV19EQVRBX0FERFJFU1MsICh1OCAqKSAmdmFsdWUsCi0JCQkJICBzaXplb2YodmFsdWUpLCBISUZfV1JfU1lOQ19CWVRFX0lOQyk7CisJcmV0ID0gYXRoNmtsX2hpZl9kaWFnX3dyaXRlMzIoYXIsIGFkZHJlc3MsIHZhbHVlKTsKKwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHdyaXRlIDB4JXggZHVyaW5nIGRpYWdub3NlIHdpbmRvdyB0byAweCVkXG4iLAogCQkJICAgYWRkcmVzcywgdmFsdWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIHNldCB3aW5kb3cgcmVnaXN0ZXIsIHdoaWNoIHN0YXJ0cyB0aGUgd3JpdGUgY3ljbGUgKi8KLQlyZXR1cm4gYXRoNmtsX3NldF9hZGRyd2luX3JlZyhhciwgV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUywKLQkJCQkgICAgICBhZGRyZXNzKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IGF0aDZrbF9kaWFnX3JlYWQoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCB2b2lkICpkYXRhLCB1MzIgbGVuZ3RoKQpAQCAtMzkzLDggKzMyNiw4IEBACiAjZGVmaW5lIEFSNjAwM19SRVNFVF9DT05UUk9MX0FERFJFU1MgMHgwMDAwNDAwMAogI2RlZmluZSBBUjYwMDRfUkVTRVRfQ09OVFJPTF9BRERSRVNTIDB4MDAwMDQwMDAKIAotc3RhdGljIHZvaWQgYXRoNmtsX3Jlc2V0X2RldmljZShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHRhcmdldF90eXBlLAotCQkJCWJvb2wgd2FpdF9mb3RfY29tcGx0biwgYm9vbCBjb2xkX3Jlc2V0KQordm9pZCBhdGg2a2xfcmVzZXRfZGV2aWNlKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgdGFyZ2V0X3R5cGUsCisJCQkgYm9vbCB3YWl0X2ZvdF9jb21wbHRuLCBib29sIGNvbGRfcmVzZXQpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJdTMyIGFkZHJlc3M7CkBAIC00MjUsMTAyICszNTgsMzMgQEAKIAkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHJlc2V0IHRhcmdldFxuIik7CiB9CiAKLXZvaWQgYXRoNmtsX3N0b3BfZW5kcG9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBrZWVwX3Byb2ZpbGUsCi0JCQkgIGJvb2wgZ2V0X2RiZ2xvZ3MpCi17Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwotCXN0YXRpYyB1OCBiY2FzdF9tYWNbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQlib29sIGRpc2Nvbl9pc3N1ZWQ7Ci0KLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLQkvKiBkaXNhYmxlIHRoZSB0YXJnZXQgYW5kIHRoZSBpbnRlcnJ1cHRzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotCWlmICh0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpIHsKLQkJZGlzY29uX2lzc3VlZCA9ICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgfHwKLQkJCQkgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpKTsKLQkJYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOwotCQlpZiAoIWtlZXBfcHJvZmlsZSkKLQkJCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyhhcik7Ci0KLQkJZGVsX3RpbWVyKCZhci0+ZGlzY29ubmVjdF90aW1lcik7Ci0KLQkJY2xlYXJfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKTsKLQkJYXRoNmtsX3dtaV9zaHV0ZG93bihhci0+d21pKTsKLQkJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOwotCQlhci0+d21pID0gTlVMTDsKLQotCQkvKgotCQkgKiBBZnRlciB3bWlfc2h1ZG93biBhbGwgV01JIGV2ZW50cyB3aWxsIGJlIGRyb3BwZWQuIFdlCi0JCSAqIG5lZWQgdG8gY2xlYW51cCB0aGUgYnVmZmVycyBhbGxvY2F0ZWQgaW4gQVAgbW9kZSBhbmQKLQkJICogZ2l2ZSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiB0byBzdGFjaywgd2hpY2ggdXN1YWxseQotCQkgKiBoYXBwZW5zIGluIHRoZSBkaXNjb25uZWN0X2V2ZW50LiBTaW11bGF0ZSB0aGUgZGlzY29ubmVjdAotCQkgKiBldmVudCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiBkaXJlY3RseS4gU29tZXRpbWVzCi0JCSAqIGRpc2Nvbm5lY3RfZXZlbnQgd2lsbCBiZSByZWNlaXZlZCB3aGVuIHRoZSBkZWJ1ZyBsb2dzCi0JCSAqIGFyZSBjb2xsZWN0ZWQuCi0JCSAqLwotCQlpZiAoZGlzY29uX2lzc3VlZCkKLQkJCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KGFyLCBESVNDT05ORUNUX0NNRCwKLQkJCQkJCShhci0+bndfdHlwZSAmIEFQX05FVFdPUkspID8KLQkJCQkJCWJjYXN0X21hYyA6IGFyLT5ic3NpZCwKLQkJCQkJCTAsIE5VTEwsIDApOwotCi0JCWFyLT51c2VyX2tleV9jdHJsID0gMDsKLQotCX0gZWxzZSB7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCQkgICAiJXM6IHdtaSBpcyBub3QgcmVhZHkgMHglcCAweCVwXG4iLAotCQkJICAgX19mdW5jX18sIGFyLCBhci0+d21pKTsKLQotCQkvKiBTaHV0IGRvd24gV01JIGlmIHdlIGhhdmUgc3RhcnRlZCBpdCAqLwotCQlpZiAodGVzdF9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZykpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCQkJICAgIiVzOiBzaHV0IGRvd24gd21pXG4iLCBfX2Z1bmNfXyk7Ci0JCQlhdGg2a2xfd21pX3NodXRkb3duKGFyLT53bWkpOwotCQkJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOwotCQkJYXItPndtaSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlpZiAoYXItPmh0Y190YXJnZXQpIHsKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiBzaHV0IGRvd24gaHRjXG4iLCBfX2Z1bmNfXyk7Ci0JCWF0aDZrbF9odGNfc3RvcChhci0+aHRjX3RhcmdldCk7Ci0JfQotCi0JLyoKLQkgKiBUcnkgdG8gcmVzZXQgdGhlIGRldmljZSBpZiB3ZSBjYW4uIFRoZSBkcml2ZXIgbWF5IGhhdmUgYmVlbgotCSAqIGNvbmZpZ3VyZSBOT1QgdG8gcmVzZXQgdGhlIHRhcmdldCBkdXJpbmcgYSBkZWJ1ZyBzZXNzaW9uLgotCSAqLwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCSAgICJhdHRlbXB0aW5nIHRvIHJlc2V0IHRhcmdldCBvbiBpbnN0YW5jZSBkZXN0cm95XG4iKTsKLQlhdGg2a2xfcmVzZXRfZGV2aWNlKGFyLCBhci0+dGFyZ2V0X3R5cGUsIHRydWUsIHRydWUpOwotfQotCi1zdGF0aWMgdm9pZCBhdGg2a2xfaW5zdGFsbF9zdGF0aWNfd2VwX2tleXMoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgdm9pZCBhdGg2a2xfaW5zdGFsbF9zdGF0aWNfd2VwX2tleXMoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAl1OCBpbmRleDsKIAl1OCBrZXl1c2FnZTsKIAogCWZvciAoaW5kZXggPSBXTUlfTUlOX0tFWV9JTkRFWDsgaW5kZXggPD0gV01JX01BWF9LRVlfSU5ERVg7IGluZGV4KyspIHsKLQkJaWYgKGFyLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleV9sZW4pIHsKKwkJaWYgKHZpZi0+d2VwX2tleV9saXN0W2luZGV4XS5rZXlfbGVuKSB7CiAJCQlrZXl1c2FnZSA9IEdST1VQX1VTQUdFOwotCQkJaWYgKGluZGV4ID09IGFyLT5kZWZfdHhrZXlfaW5kZXgpCisJCQlpZiAoaW5kZXggPT0gdmlmLT5kZWZfdHhrZXlfaW5kZXgpCiAJCQkJa2V5dXNhZ2UgfD0gVFhfVVNBR0U7CiAKLQkJCWF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLAorCQkJYXRoNmtsX3dtaV9hZGRrZXlfY21kKHZpZi0+YXItPndtaSwgdmlmLT5md192aWZfaWR4LAogCQkJCQkgICAgICBpbmRleCwKIAkJCQkJICAgICAgV0VQX0NSWVBULAogCQkJCQkgICAgICBrZXl1c2FnZSwKLQkJCQkJICAgICAgYXItPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5X2xlbiwKLQkJCQkJICAgICAgTlVMTCwKLQkJCQkJICAgICAgYXItPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5LAorCQkJCQkgICAgICB2aWYtPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5X2xlbiwKKwkJCQkJICAgICAgTlVMTCwgMCwKKwkJCQkJICAgICAgdmlmLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleSwKIAkJCQkJICAgICAgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAogCQkJCQkgICAgICBOT19TWU5DX1dNSUZMQUcpOwogCQl9CiAJfQogfQogCi12b2lkIGF0aDZrbF9jb25uZWN0X2FwX21vZGVfYnNzKHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCkKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXN0cnVjdCBhdGg2a2xfcmVxX2tleSAqaWs7CiAJaW50IHJlczsKIAl1OCBrZXlfcnNjW0FUSDZLTF9LRVlfU0VRX0xFTl07CkBAIC01MjksMTEgKzM5MywxMyBAQAogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiQVAgbW9kZSBzdGFydGVkIG9uICV1IE1IelxuIiwgY2hhbm5lbCk7CiAKLQlzd2l0Y2ggKGFyLT5hdXRoX21vZGUpIHsKKwlzd2l0Y2ggKHZpZi0+YXV0aF9tb2RlKSB7CiAJY2FzZSBOT05FX0FVVEg6Ci0JCWlmIChhci0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpCi0JCQlhdGg2a2xfaW5zdGFsbF9zdGF0aWNfd2VwX2tleXMoYXIpOwotCQlicmVhazsKKwkJaWYgKHZpZi0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpCisJCQlhdGg2a2xfaW5zdGFsbF9zdGF0aWNfd2VwX2tleXModmlmKTsKKwkJaWYgKCFpay0+dmFsaWQgfHwgaWstPmtleV90eXBlICE9IFdBUElfQ1JZUFQpCisJCQlicmVhazsKKwkJLyogZm9yIFdBUEksIHdlIG5lZWQgdG8gc2V0IHRoZSBkZWxheWVkIGdyb3VwIGtleSwgY29udGludWU6ICovCiAJY2FzZSBXUEFfUFNLX0FVVEg6CiAJY2FzZSBXUEEyX1BTS19BVVRIOgogCWNhc2UgKFdQQV9QU0tfQVVUSCB8IFdQQTJfUFNLX0FVVEgpOgpAQCAtNTQ0LDggKzQxMCw5IEBACiAJCQkgICAidGhlIGluaXRpYWwgZ3JvdXAga2V5IGZvciBBUCBtb2RlXG4iKTsKIAkJbWVtc2V0KGtleV9yc2MsIDAsIHNpemVvZihrZXlfcnNjKSk7CiAJCXJlcyA9IGF0aDZrbF93bWlfYWRka2V5X2NtZCgKLQkJCWFyLT53bWksIGlrLT5rZXlfaW5kZXgsIGlrLT5rZXlfdHlwZSwKLQkJCUdST1VQX1VTQUdFLCBpay0+a2V5X2xlbiwga2V5X3JzYywgaWstPmtleSwKKwkJCWFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgaWstPmtleV9pbmRleCwgaWstPmtleV90eXBlLAorCQkJR1JPVVBfVVNBR0UsIGlrLT5rZXlfbGVuLCBrZXlfcnNjLCBBVEg2S0xfS0VZX1NFUV9MRU4sCisJCQlpay0+a2V5LAogCQkJS0VZX09QX0lOSVRfVkFMLCBOVUxMLCBTWU5DX0JPVEhfV01JRkxBRyk7CiAJCWlmIChyZXMpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIkRlbGF5ZWQgIgpAQCAtNTU0LDE1ICs0MjEsMTYgQEAKIAkJYnJlYWs7CiAJfQogCi0JYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIE5PTkVfQlNTX0ZJTFRFUiwgMCk7Ci0Jc2V0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZyk7Ci0JbmV0aWZfY2Fycmllcl9vbihhci0+bmV0X2Rldik7CisJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwlzZXRfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOworCW5ldGlmX2NhcnJpZXJfb24odmlmLT5uZGV2KTsKIH0KIAotdm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YShzdHJ1Y3QgYXRoNmtsICphciwgdTE2IGFpZCwgdTggKm1hY19hZGRyLAordm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgYWlkLCB1OCAqbWFjX2FkZHIsCiAJCQkJdTgga2V5bWdtdCwgdTggdWNpcGhlciwgdTggYXV0aCwKIAkJCQl1OCBhc3NvY19yZXFfbGVuLCB1OCAqYXNzb2NfaW5mbykKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJdTggKmllcyA9IE5VTEwsICp3cGFfaWUgPSBOVUxMLCAqcG9zOwogCXNpemVfdCBpZXNfbGVuID0gMDsKIAlzdHJ1Y3Qgc3RhdGlvbl9pbmZvIHNpbmZvOwpAQCAtNjAwLDYgKzQ2OCwxOCBAQAogCQkJCXdwYV9pZSA9IHBvczsgLyogV1BTIElFICovCiAJCQkJYnJlYWs7IC8qIG92ZXJyaWRlcyBXUEEvUlNOIElFICovCiAJCQl9CisJCX0gZWxzZSBpZiAocG9zWzBdID09IDB4NDQgJiYgd3BhX2llID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBOb3RlOiBXQVBJIFBhcmFtZXRlciBTZXQgSUUgcmUtdXNlcyBFbGVtZW50IElEIHRoYXQKKwkJCSAqIHdhcyBvZmZpY2lhbGx5IGFsbG9jYXRlZCBmb3IgQlNTIEFDIEFjY2VzcyBEZWxheS4gQXMKKwkJCSAqIHN1Y2gsIHdlIG5lZWQgdG8gYmUgYSBiaXQgbW9yZSBjYXJlZnVsIG9uIHdoZW4KKwkJCSAqIHBhcnNpbmcgdGhlIGZyYW1lLiBIb3dldmVyLCBCU1MgQUMgQWNjZXNzIERlbGF5CisJCQkgKiBlbGVtZW50IGlzIG5vdCBzdXBwb3NlZCB0byBiZSBpbmNsdWRlZCBpbgorCQkJICogKFJlKUFzc29jaWF0aW9uIFJlcXVlc3QgZnJhbWVzLCBzbyB0aGlzIHNob3VsZCBub3QKKwkJCSAqIGNhdXNlIHByb2JsZW1zLgorCQkJICovCisJCQl3cGFfaWUgPSBwb3M7IC8qIFdBUEkgSUUgKi8KKwkJCWJyZWFrOwogCQl9CiAJCXBvcyArPSAyICsgcG9zWzFdOwogCX0KQEAgLTYxNywzODAgKzQ5Nyw0OSBAQAogCXNpbmZvLmFzc29jX3JlcV9pZXNfbGVuID0gaWVzX2xlbjsKIAlzaW5mby5maWxsZWQgfD0gU1RBVElPTl9JTkZPX0FTU09DX1JFUV9JRVM7CiAKLQljZmc4MDIxMV9uZXdfc3RhKGFyLT5uZXRfZGV2LCBtYWNfYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9uZXdfc3RhKHZpZi0+bmRldiwgbWFjX2FkZHIsICZzaW5mbywgR0ZQX0tFUk5FTCk7CiAKLQluZXRpZl93YWtlX3F1ZXVlKGFyLT5uZXRfZGV2KTsKLX0KLQotLyogRnVuY3Rpb25zIGZvciBUeCBjcmVkaXQgaGFuZGxpbmcgKi8KLXZvaWQgYXRoNmtfY3JlZGl0X2luaXQoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfbGlzdCwKLQkJICAgICAgIGludCB0b3RfY3JlZGl0cykKLXsKLQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJfZXBfZGlzdDsKLQlpbnQgY291bnQ7Ci0KLQljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKLQljcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQotCQkJY29udGludWU7Ci0KLQkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQotCQlpZiAodG90X2NyZWRpdHMgPiA0KQotCQkJaWYgKChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykgfHwKLQkJCSAgICAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CRV9TVkMpKSB7Ci0JCQkJYXRoNmtsX2RlcG9zaXRfY3JlZGl0X3RvX2VwKGNyZWRfaW5mbywKLQkJCQkJCWN1cl9lcF9kaXN0LAotCQkJCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluKTsKLQkJCQljdXJfZXBfZGlzdC0+ZGlzdF9mbGFncyB8PSBIVENfRVBfQUNUSVZFOwotCQkJfQotCi0JCWlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykgewotCQkJYXRoNmtsX2RlcG9zaXRfY3JlZGl0X3RvX2VwKGNyZWRfaW5mbywgY3VyX2VwX2Rpc3QsCi0JCQkJCQkgICAgY3VyX2VwX2Rpc3QtPmNyZWRfbWluKTsKLQkJCS8qCi0JCQkgKiBDb250cm9sIHNlcnZpY2UgaXMgYWx3YXlzIG1hcmtlZCBhY3RpdmUsIGl0Ci0JCQkgKiBuZXZlciBnb2VzIGluYWN0aXZlIEVWRVIuCi0JCQkgKi8KLQkJCWN1cl9lcF9kaXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7Ci0JCX0gZWxzZSBpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpCi0JCQkvKiB0aGlzIGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkgZGF0YSBlbmRwb2ludCAqLwotCQkJY3JlZF9pbmZvLT5sb3dlc3RwcmlfZXBfZGlzdCA9IGN1cl9lcF9kaXN0LT5saXN0OwotCi0JCS8qCi0JCSAqIFN0cmVhbXMgaGF2ZSB0byBiZSBjcmVhdGVkIChleHBsaWNpdCB8IGltcGxpY2l0KSBmb3IgYWxsCi0JCSAqIGtpbmRzIG9mIHRyYWZmaWMuIEJFIGVuZHBvaW50cyBhcmUgYWxzbyBpbmFjdGl2ZSBpbiB0aGUKLQkJICogYmVnaW5uaW5nLiBXaGVuIEJFIHRyYWZmaWMgc3RhcnRzIGl0IGNyZWF0ZXMgaW1wbGljaXQKLQkJICogc3RyZWFtcyB0aGF0IHJlZGlzdHJpYnV0ZXMgY3JlZGl0cy4KLQkJICoKLQkJICogTm90ZTogYWxsIG90aGVyIGVuZHBvaW50cyBoYXZlIG1pbmltdW1zIHNldCBidXQgYXJlCi0JCSAqIGluaXRpYWxseSBnaXZlbiBOTyBjcmVkaXRzLiBjcmVkaXRzIHdpbGwgYmUgZGlzdHJpYnV0ZWQKLQkJICogYXMgdHJhZmZpYyBhY3Rpdml0eSBkZW1hbmRzCi0JCSAqLwotCX0KLQotCVdBUk5fT04oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIDw9IDApOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfZXBfZGlzdCwgZXBfbGlzdCwgbGlzdCkgewotCQlpZiAoY3VyX2VwX2Rpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQljb250aW51ZTsKLQotCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpCi0JCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogRm9yIHRoZSByZW1haW5pbmcgZGF0YSBlbmRwb2ludHMsIHdlIGFzc3VtZSB0aGF0Ci0JCQkgKiBlYWNoIGNyZWRfcGVyX21zZyBhcmUgdGhlIHNhbWUuIFdlIHVzZSBhIHNpbXBsZQotCQkJICogY2FsY3VsYXRpb24gaGVyZSwgd2UgdGFrZSB0aGUgcmVtYWluaW5nIGNyZWRpdHMKLQkJCSAqIGFuZCBkZXRlcm1pbmUgaG93IG1hbnkgbWF4IG1lc3NhZ2VzIHRoaXMgY2FuCi0JCQkgKiBjb3ZlciBhbmQgdGhlbiBzZXQgZWFjaCBlbmRwb2ludCdzIG5vcm1hbCB2YWx1ZQotCQkJICogZXF1YWwgdG8gMy80IHRoaXMgYW1vdW50LgotCQkJICovCi0JCQljb3VudCA9IChjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgLwotCQkJCSBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKQotCQkJCSogY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKLQkJCWNvdW50ID0gKGNvdW50ICogMykgPj4gMjsKLQkJCWNvdW50ID0gbWF4KGNvdW50LCBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKTsKLQkJCWN1cl9lcF9kaXN0LT5jcmVkX25vcm0gPSBjb3VudDsKLQotCQl9Ci0JfQotfQotCi0vKiBpbml0aWFsaXplIGFuZCBzZXR1cCBjcmVkaXQgZGlzdHJpYnV0aW9uICovCi1pbnQgYXRoNmtfc2V0dXBfY3JlZGl0X2Rpc3Qodm9pZCAqaHRjX2hhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8pCi17Ci0JdTE2IHNlcnZpY2Vwcmlvcml0eVs1XTsKLQotCW1lbXNldChjcmVkX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvKSk7Ci0KLQlzZXJ2aWNlcHJpb3JpdHlbMF0gPSBXTUlfQ09OVFJPTF9TVkM7ICAvKiBoaWdoZXN0ICovCi0Jc2VydmljZXByaW9yaXR5WzFdID0gV01JX0RBVEFfVk9fU1ZDOwotCXNlcnZpY2Vwcmlvcml0eVsyXSA9IFdNSV9EQVRBX1ZJX1NWQzsKLQlzZXJ2aWNlcHJpb3JpdHlbM10gPSBXTUlfREFUQV9CRV9TVkM7Ci0Jc2VydmljZXByaW9yaXR5WzRdID0gV01JX0RBVEFfQktfU1ZDOyAvKiBsb3dlc3QgKi8KLQotCS8qIHNldCBwcmlvcml0eSBsaXN0ICovCi0JYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3QoaHRjX2hhbmRsZSwgY3JlZF9pbmZvLCBzZXJ2aWNlcHJpb3JpdHksIDUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHJlZHVjZSBhbiBlcCdzIGNyZWRpdHMgYmFjayB0byBhIHNldCBsaW1pdCAqLwotc3RhdGljIHZvaWQgYXRoNmtfcmVkdWNlX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJCSBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICAqZXBfZGlzdCwKLQkJCQkgaW50IGxpbWl0KQotewotCWludCBjcmVkaXRzOwotCi0JZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgPSBsaW1pdDsKLQotCWlmIChlcF9kaXN0LT5jcmVkaXRzIDw9IGxpbWl0KQotCQlyZXR1cm47Ci0KLQljcmVkaXRzID0gZXBfZGlzdC0+Y3JlZGl0cyAtIGxpbWl0OwotCWVwX2Rpc3QtPmNyZWRpdHMgLT0gY3JlZGl0czsKLQljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgKz0gY3JlZGl0czsKLX0KLQotc3RhdGljIHZvaWQgYXRoNmtfY3JlZGl0X3VwZGF0ZShzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8sCi0JCQkJc3RydWN0IGxpc3RfaGVhZCAqZXBkaXN0X2xpc3QpCi17Ci0Jc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2Rpc3RfbGlzdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2Rpc3RfbGlzdCwgZXBkaXN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cl9kaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQljb250aW51ZTsKLQotCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZF90b19kaXN0ID4gMCkgewotCQkJY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyArPQotCQkJCQljdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3Q7Ci0JCQljdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3QgPSAwOwotCQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgPgotCQkJICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfYXNzbmdkKQotCQkJCWF0aDZrX3JlZHVjZV9jcmVkaXRzKGNyZWRfaW5mbywKLQkJCQkJCWN1cl9kaXN0X2xpc3QsCi0JCQkJCQljdXJfZGlzdF9saXN0LT5jcmVkX2Fzc25nZCk7Ci0KLQkJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkaXRzID4KLQkJCSAgICBjdXJfZGlzdF9saXN0LT5jcmVkX25vcm0pCi0JCQkJYXRoNmtfcmVkdWNlX2NyZWRpdHMoY3JlZF9pbmZvLCBjdXJfZGlzdF9saXN0LAotCQkJCQkJICAgICBjdXJfZGlzdF9saXN0LT5jcmVkX25vcm0pOwotCi0JCQlpZiAoIShjdXJfZGlzdF9saXN0LT5kaXN0X2ZsYWdzICYgSFRDX0VQX0FDVElWRSkpIHsKLQkJCQlpZiAoY3VyX2Rpc3RfbGlzdC0+dHhxX2RlcHRoID09IDApCi0JCQkJCWF0aDZrX3JlZHVjZV9jcmVkaXRzKGNyZWRfaW5mbywKLQkJCQkJCQkgICAgIGN1cl9kaXN0X2xpc3QsIDApOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogSFRDIGhhcyBhbiBlbmRwb2ludCB0aGF0IG5lZWRzIGNyZWRpdHMsIGVwX2Rpc3QgaXMgdGhlIGVuZHBvaW50IGluCi0gKiBxdWVzdGlvbi4KLSAqLwotdm9pZCBhdGg2a19zZWVrX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCkKLXsKLQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJkaXN0X2xpc3Q7Ci0JaW50IGNyZWRpdHMgPSAwOwotCWludCBuZWVkOwotCi0JaWYgKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpCi0JCWdvdG8gb3V0OwotCi0JaWYgKChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfVklfU1ZDKSB8fAotCSAgICAoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX1ZPX1NWQykpCi0JCWlmICgoZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgPj0gZXBfZGlzdC0+Y3JlZF9ub3JtKSkKLQkJCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBGb3IgYWxsIG90aGVyIHNlcnZpY2VzLCB3ZSBmb2xsb3cgYSBzaW1wbGUgYWxnb3JpdGhtIG9mOgotCSAqCi0JICogMS4gY2hlY2tpbmcgdGhlIGZyZWUgcG9vbCBmb3IgY3JlZGl0cwotCSAqIDIuIGNoZWNraW5nIGxvd2VyIHByaW9yaXR5IGVuZHBvaW50cyBmb3IgY3JlZGl0cyB0byB0YWtlCi0JICovCi0KLQljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKLQotCWlmIChjcmVkaXRzID49IGVwX2Rpc3QtPnNlZWtfY3JlZCkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIFdlIGRvbid0IGhhdmUgZW5vdWdoIGluIHRoZSBmcmVlIHBvb2wsIHRyeSB0YWtpbmcgYXdheSBmcm9tCi0JICogbG93ZXIgcHJpb3JpdHkgc2VydmljZXMgVGhlIHJ1bGUgZm9yIHRha2luZyBhd2F5IGNyZWRpdHM6Ci0JICoKLQkgKiAgIDEuIE9ubHkgdGFrZSBmcm9tIGxvd2VyIHByaW9yaXR5IGVuZHBvaW50cwotCSAqICAgMi4gT25seSB0YWtlIHdoYXQgaXMgYWxsb2NhdGVkIGFib3ZlIHRoZSBtaW5pbXVtIChuZXZlcgotCSAqICAgICAgc3RhcnZlIGFuIGVuZHBvaW50IGNvbXBsZXRlbHkpCi0JICogICAzLiBPbmx5IHRha2Ugd2hhdCB5b3UgbmVlZC4KLQkgKi8KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShjdXJkaXN0X2xpc3QsCi0JCQkJICAgICZjcmVkX2luZm8tPmxvd2VzdHByaV9lcF9kaXN0LAotCQkJCSAgICBsaXN0KSB7Ci0JCWlmIChjdXJkaXN0X2xpc3QgPT0gZXBfZGlzdCkKLQkJCWJyZWFrOwotCi0JCW5lZWQgPSBlcF9kaXN0LT5zZWVrX2NyZWQgLSBjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHM7Ci0KLQkJaWYgKChjdXJkaXN0X2xpc3QtPmNyZWRfYXNzbmdkIC0gbmVlZCkgPj0KLQkJICAgICBjdXJkaXN0X2xpc3QtPmNyZWRfbWluKSB7Ci0JCQkvKgotCQkJICogVGhlIGN1cnJlbnQgb25lIGhhcyBiZWVuIGFsbG9jYXRlZCBtb3JlIHRoYW4KLQkJCSAqIGl0J3MgbWluaW11bSBhbmQgaXQgaGFzIGVub3VnaCBjcmVkaXRzIGFzc2lnbmVkCi0JCQkgKiBhYm92ZSBpdCdzIG1pbmltdW0gdG8gZnVsZmlsbCBvdXIgbmVlZCB0cnkgdG8KLQkJCSAqIHRha2UgYXdheSBqdXN0IGVub3VnaCB0byBmdWxmaWxsIG91ciBuZWVkLgotCQkJICovCi0JCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhjcmVkX2luZm8sIGN1cmRpc3RfbGlzdCwKLQkJCQkJY3VyZGlzdF9saXN0LT5jcmVkX2Fzc25nZCAtIG5lZWQpOwotCi0JCQlpZiAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzID49Ci0JCQkgICAgZXBfZGlzdC0+c2Vla19jcmVkKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGN1cmRpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKLQkJCWJyZWFrOwotCX0KLQotCWNyZWRpdHMgPSBtaW4oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzLCBlcF9kaXN0LT5zZWVrX2NyZWQpOwotCi1vdXQ6Ci0JLyogZGlkIHdlIGZpbmQgc29tZSBjcmVkaXRzPyAqLwotCWlmIChjcmVkaXRzKQotCQlhdGg2a2xfZGVwb3NpdF9jcmVkaXRfdG9fZXAoY3JlZF9pbmZvLCBlcF9kaXN0LCBjcmVkaXRzKTsKLQotCWVwX2Rpc3QtPnNlZWtfY3JlZCA9IDA7Ci19Ci0KLS8qIHJlZGlzdHJpYnV0ZSBjcmVkaXRzIGJhc2VkIG9uIGFjdGl2aXR5IGNoYW5nZSAqLwotc3RhdGljIHZvaWQgYXRoNmtfcmVkaXN0cmlidXRlX2NyZWRpdHMoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqaW5mbywKLQkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfZGlzdF9saXN0KQotewotCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cmRpc3RfbGlzdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyZGlzdF9saXN0LCBlcF9kaXN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cmRpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoY3VyZGlzdF9saXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKSAgfHwKLQkJICAgIChjdXJkaXN0X2xpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CRV9TVkMpKQotCQkJY3VyZGlzdF9saXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7Ci0KLQkJaWYgKChjdXJkaXN0X2xpc3QtPnN2Y19pZCAhPSBXTUlfQ09OVFJPTF9TVkMpICYmCi0JCSAgICAhKGN1cmRpc3RfbGlzdC0+ZGlzdF9mbGFncyAmIEhUQ19FUF9BQ1RJVkUpKSB7Ci0JCQlpZiAoY3VyZGlzdF9saXN0LT50eHFfZGVwdGggPT0gMCkKLQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhpbmZvLAotCQkJCQkJY3VyZGlzdF9saXN0LCAwKTsKLQkJCWVsc2UKLQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhpbmZvLAotCQkJCQkJY3VyZGlzdF9saXN0LAotCQkJCQkJY3VyZGlzdF9saXN0LT5jcmVkX21pbik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW5ldmVyIGVuZHBvaW50cyByZXF1aXJlIGNyZWRpdAotICogZGlzdHJpYnV0aW9ucy4gQSBsb2NrIGlzIGhlbGQgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlzCi0gKiBmdW5jdGlvbiBzaGFsbCBOT1QgYmxvY2suIFRoZSBlcF9kaXN0X2xpc3QgaXMgYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbgotICogc3RydWN0dXJlcyBpbiBwcmlvcml0aXplZCBvcmRlciBhcyBkZWZpbmVkIGJ5IHRoZSBjYWxsIHRvIHRoZQotICogaHRjX3NldF9jcmVkaXRfZGlzdCgpIGFwaS4KLSAqLwotdm9pZCBhdGg2a19jcmVkaXRfZGlzdHJpYnV0ZShzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2luZm8sCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCwKLQkJCSAgICAgZW51bSBodGNfY3JlZGl0X2Rpc3RfcmVhc29uIHJlYXNvbikKLXsKLQlzd2l0Y2ggKHJlYXNvbikgewotCWNhc2UgSFRDX0NSRURJVF9ESVNUX1NFTkRfQ09NUExFVEU6Ci0JCWF0aDZrX2NyZWRpdF91cGRhdGUoY3JlZF9pbmZvLCBlcF9kaXN0X2xpc3QpOwotCQlicmVhazsKLQljYXNlIEhUQ19DUkVESVRfRElTVF9BQ1RJVklUWV9DSEFOR0U6Ci0JCWF0aDZrX3JlZGlzdHJpYnV0ZV9jcmVkaXRzKGNyZWRfaW5mbywgZXBfZGlzdF9saXN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JV0FSTl9PTihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPiBjcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMpOwotCVdBUk5fT04oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIDwgMCk7CisJbmV0aWZfd2FrZV9xdWV1ZSh2aWYtPm5kZXYpOwogfQogCiB2b2lkIGRpc2Nvbm5lY3RfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIHB0cikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOwotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyhhcik7Ci0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOworCWF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyh2aWYpOworCWF0aDZrbF9kaXNjb25uZWN0KHZpZik7CiB9CiAKLXZvaWQgYXRoNmtsX2Rpc2Nvbm5lY3Qoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7Ci0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSB8fAotCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZykpIHsKLQkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pKTsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncykpIHsKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZCh2aWYtPmFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiAJCS8qCiAJCSAqIERpc2Nvbm5lY3QgY29tbWFuZCBpcyBpc3N1ZWQsIGNsZWFyIHRoZSBjb25uZWN0IHBlbmRpbmcKIAkJICogZmxhZy4gVGhlIGNvbm5lY3RlZCBmbGFnIHdpbGwgYmUgY2xlYXJlZCBpbgogCQkgKiBkaXNjb25uZWN0IGV2ZW50IG5vdGlmaWNhdGlvbi4KIAkJICovCi0JCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7CisJCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAl9CiB9CiAKLXZvaWQgYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXN3aXRjaCAoYXItPnNtZV9zdGF0ZSkgewotCWNhc2UgU01FX0NPTk5FQ1RJTkc6Ci0JCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KGFyLT5uZXRfZGV2LCBhci0+YnNzaWQsIE5VTEwsIDAsCi0JCQkJCU5VTEwsIDAsCi0JCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCi0JCQkJCUdGUF9LRVJORUwpOwotCQlicmVhazsKLQljYXNlIFNNRV9DT05ORUNURUQ6Ci0JZGVmYXVsdDoKLQkJLyoKLQkJICogRklYTUU6IG9kZGx5IGVub3VnaCBzbWVTdGF0ZSBpcyBpbiBESVNDT05ORUNURUQgZHVyaW5nCi0JCSAqIHN1c3BlbmQsIHdoeT8gTmVlZCB0byBzZW5kIGRpc2Nvbm5lY3RlZCBldmVudCBpbiB0aGF0Ci0JCSAqIHN0YXRlLgotCQkgKi8KLQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKGFyLT5uZXRfZGV2LCAwLCBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSB8fAotCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZykpCi0JCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSk7Ci0KLQlhci0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKLQotCS8qIGRpc2FibGUgc2Nhbm5pbmcgKi8KLQlpZiAoYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChhci0+d21pLCAweEZGRkYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JCQkJICAgICAgMCwgMCkgIT0gMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRoNmtsOiBmYWlsZWQgdG8gZGlzYWJsZSBzY2FuICIKLQkJICAgICAgICJkdXJpbmcgc3VzcGVuZFxuIik7Ci0KLQlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChhciwgLUVDQU5DRUxFRCk7Ci19Ci0KIC8qIFdNSSBFdmVudCBoYW5kbGVycyAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2h3X2lkX3N0cmluZyh1MzIgaWQpCi17Ci0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVI2MDAzX1JFVjFfVkVSU0lPTjoKLQkJcmV0dXJuICIxLjAiOwotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJcmV0dXJuICIyLjAiOwotCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJcmV0dXJuICIyLjEuMSI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJ1bmtub3duIjsKLQl9Ci19Ci0KIHZvaWQgYXRoNmtsX3JlYWR5X2V2ZW50KHZvaWQgKmRldnQsIHU4ICpkYXRhcCwgdTMyIHN3X3ZlciwgdTMyIGFiaV92ZXIpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBkZXZ0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhci0+bmV0X2RldjsKIAotCW1lbWNweShkZXYtPmRldl9hZGRyLCBkYXRhcCwgRVRIX0FMRU4pOworCW1lbWNweShhci0+bWFjX2FkZHIsIGRhdGFwLCBFVEhfQUxFTik7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiBtYWMgYWRkciA9ICVwTVxuIiwKLQkJICAgX19mdW5jX18sIGRldi0+ZGV2X2FkZHIpOworCQkgICBfX2Z1bmNfXywgYXItPm1hY19hZGRyKTsKIAogCWFyLT52ZXJzaW9uLndsYW5fdmVyID0gc3dfdmVyOwogCWFyLT52ZXJzaW9uLmFiaV92ZXIgPSBhYmlfdmVyOwogCi0Jc25wcmludGYoYXItPndkZXYtPndpcGh5LT5md192ZXJzaW9uLAotCQkgc2l6ZW9mKGFyLT53ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiksCisJc25wcmludGYoYXItPndpcGh5LT5md192ZXJzaW9uLAorCQkgc2l6ZW9mKGFyLT53aXBoeS0+ZndfdmVyc2lvbiksCiAJCSAiJXUuJXUuJXUuJXUiLAogCQkgKGFyLT52ZXJzaW9uLndsYW5fdmVyICYgMHhmMDAwMDAwMCkgPj4gMjgsCiAJCSAoYXItPnZlcnNpb24ud2xhbl92ZXIgJiAweDBmMDAwMDAwKSA+PiAyNCwKQEAgLTEwMDAsNzkgKzU0OSw4NSBAQAogCS8qIGluZGljYXRlIHRvIHRoZSB3YWl0aW5nIHRocmVhZCB0aGF0IHRoZSByZWFkeSBldmVudCB3YXMgcmVjZWl2ZWQgKi8KIAlzZXRfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKTsKIAl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOwotCi0JYXRoNmtsX2luZm8oImh3ICVzIGZ3ICVzJXNcbiIsCi0JCSAgICBnZXRfaHdfaWRfc3RyaW5nKGFyLT53ZGV2LT53aXBoeS0+aHdfdmVyc2lvbiksCi0JCSAgICBhci0+d2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24sCi0JCSAgICB0ZXN0X2JpdChURVNUTU9ERSwgJmFyLT5mbGFnKSA/ICIgdGVzdG1vZGUiIDogIiIpOwogfQogCi12b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsICphciwgaW50IHN0YXR1cykKK3ZvaWQgYXRoNmtsX3NjYW5fY29tcGxldGVfZXZ0KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIGludCBzdGF0dXMpCiB7Ci0JYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQoYXIsIHN0YXR1cyk7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCWJvb2wgYWJvcnRlZCA9IGZhbHNlOworCisJaWYgKHN0YXR1cyAhPSBXTUlfU0NBTl9TVEFUVVNfU1VDQ0VTUykKKwkJYWJvcnRlZCA9IHRydWU7CisKKwlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudCh2aWYsIGFib3J0ZWQpOwogCiAJaWYgKCFhci0+dXNyX2Jzc19maWx0ZXIpIHsKLQkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7Ci0JCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBOT05FX0JTU19GSUxURVIsIDApOworCQljbGVhcl9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpOworCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgTk9ORV9CU1NfRklMVEVSLCAwKTsKIAl9CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9TQ0FOLCAic2NhbiBjb21wbGV0ZTogJWRcbiIsIHN0YXR1cyk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAic2NhbiBjb21wbGV0ZTogJWRcbiIsIHN0YXR1cyk7CiB9CiAKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsLCB1OCAqYnNzaWQsCit2b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUxNiBjaGFubmVsLCB1OCAqYnNzaWQsCiAJCQkgIHUxNiBsaXN0ZW5faW50LCB1MTYgYmVhY29uX2ludCwKIAkJCSAgZW51bSBuZXR3b3JrX3R5cGUgbmV0X3R5cGUsIHU4IGJlYWNvbl9pZV9sZW4sCiAJCQkgIHU4IGFzc29jX3JlcV9sZW4sIHU4IGFzc29jX3Jlc3BfbGVuLAogCQkJICB1OCAqYXNzb2NfaW5mbykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAotCWF0aDZrbF9jZmc4MDIxMV9jb25uZWN0X2V2ZW50KGFyLCBjaGFubmVsLCBic3NpZCwKKwlhdGg2a2xfY2ZnODAyMTFfY29ubmVjdF9ldmVudCh2aWYsIGNoYW5uZWwsIGJzc2lkLAogCQkJCSAgICAgIGxpc3Rlbl9pbnQsIGJlYWNvbl9pbnQsCiAJCQkJICAgICAgbmV0X3R5cGUsIGJlYWNvbl9pZV9sZW4sCiAJCQkJICAgICAgYXNzb2NfcmVxX2xlbiwgYXNzb2NfcmVzcF9sZW4sCiAJCQkJICAgICAgYXNzb2NfaW5mbyk7CiAKLQltZW1jcHkoYXItPmJzc2lkLCBic3NpZCwgc2l6ZW9mKGFyLT5ic3NpZCkpOwotCWFyLT5ic3NfY2ggPSBjaGFubmVsOworCW1lbWNweSh2aWYtPmJzc2lkLCBic3NpZCwgc2l6ZW9mKHZpZi0+YnNzaWQpKTsKKwl2aWYtPmJzc19jaCA9IGNoYW5uZWw7CiAKLQlpZiAoKGFyLT5ud190eXBlID09IElORlJBX05FVFdPUkspKQotCQlhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChhci0+d21pLCBhci0+bGlzdGVuX2ludHZsX3QsCisJaWYgKCh2aWYtPm53X3R5cGUgPT0gSU5GUkFfTkVUV09SSykpCisJCWF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgYXItPmxpc3Rlbl9pbnR2bF90LAogCQkJCQkgICAgICBhci0+bGlzdGVuX2ludHZsX2IpOwogCi0JbmV0aWZfd2FrZV9xdWV1ZShhci0+bmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZSh2aWYtPm5kZXYpOwogCiAJLyogVXBkYXRlIGNvbm5lY3QgJiBsaW5rIHN0YXR1cyBhdG9taWNhbGx5ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyLT5sb2NrLCBmbGFncyk7Ci0Jc2V0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZyk7Ci0JY2xlYXJfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKLQluZXRpZl9jYXJyaWVyX29uKGFyLT5uZXRfZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKKwlzZXRfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOworCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKKwluZXRpZl9jYXJyaWVyX29uKHZpZi0+bmRldik7CisJc3Bpbl91bmxvY2tfYmgoJnZpZi0+aWZfbG9jayk7CiAKLQlhZ2dyX3Jlc2V0X3N0YXRlKGFyLT5hZ2dyX2NudHh0KTsKLQlhci0+cmVjb25uZWN0X2ZsYWcgPSAwOworCWFnZ3JfcmVzZXRfc3RhdGUodmlmLT5hZ2dyX2NudHh0KTsKKwl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKIAotCWlmICgoYXItPm53X3R5cGUgPT0gQURIT0NfTkVUV09SSykgJiYgYXItPmlic3NfcHNfZW5hYmxlKSB7CisJaWYgKCh2aWYtPm53X3R5cGUgPT0gQURIT0NfTkVUV09SSykgJiYgYXItPmlic3NfcHNfZW5hYmxlKSB7CiAJCW1lbXNldChhci0+bm9kZV9tYXAsIDAsIHNpemVvZihhci0+bm9kZV9tYXApKTsKIAkJYXItPm5vZGVfbnVtID0gMDsKIAkJYXItPm5leHRfZXBfaWQgPSBFTkRQT0lOVF8yOwogCX0KIAogCWlmICghYXItPnVzcl9ic3NfZmlsdGVyKSB7Ci0JCXNldF9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJmFyLT5mbGFnKTsKLQkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIENVUlJFTlRfQlNTX0ZJTFRFUiwgMCk7CisJCXNldF9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpOworCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgQ1VSUkVOVF9CU1NfRklMVEVSLCAwKTsKIAl9CiB9CiAKLXZvaWQgYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCBrZXlpZCwgYm9vbCBpc21jYXN0KQordm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCkKIHsKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqc3RhOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAl1OCB0c2NbNl07CisKIAkvKgogCSAqIEZvciBBUCBjYXNlLCBrZXlpZCB3aWxsIGhhdmUgYWlkIG9mIFNUQSB3aGljaCBzZW50IHBrdCB3aXRoCiAJICogTUlDIGVycm9yLiBVc2UgdGhpcyBhaWQgdG8gZ2V0IE1BQyAmIHNlbmQgaXQgdG8gaG9zdGFwZC4KIAkgKi8KLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQlzdGEgPSBhdGg2a2xfZmluZF9zdGFfYnlfYWlkKGFyLCAoa2V5aWQgPj4gMikpOwogCQlpZiAoIXN0YSkKIAkJCXJldHVybjsKQEAgLTEwODEsMTkgKzYzNiwyMCBAQAogCQkJICAgImFwIHRraXAgbWljIGVycm9yIHJlY2VpdmVkIGZyb20gYWlkPSVkXG4iLCBrZXlpZCk7CiAKIAkJbWVtc2V0KHRzYywgMCwgc2l6ZW9mKHRzYykpOyAvKiBGSVg6IGdldCBjb3JyZWN0IFRTQyAqLwotCQljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKGFyLT5uZXRfZGV2LCBzdGEtPm1hYywKKwkJY2ZnODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZSh2aWYtPm5kZXYsIHN0YS0+bWFjLAogCQkJCQkgICAgIE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRSwga2V5aWQsCiAJCQkJCSAgICAgdHNjLCBHRlBfS0VSTkVMKTsKIAl9IGVsc2UKLQkJYXRoNmtsX2NmZzgwMjExX3RraXBfbWljZXJyX2V2ZW50KGFyLCBrZXlpZCwgaXNtY2FzdCk7CisJCWF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudCh2aWYsIGtleWlkLCBpc21jYXN0KTsKIAogfQogCi1zdGF0aWMgdm9pZCBhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyhzdHJ1Y3QgYXRoNmtsICphciwgdTggKnB0ciwgdTMyIGxlbikKK3N0YXRpYyB2b2lkIGF0aDZrbF91cGRhdGVfdGFyZ2V0X3N0YXRzKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4ICpwdHIsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHdtaV90YXJnZXRfc3RhdHMgKnRndF9zdGF0cyA9CiAJCShzdHJ1Y3Qgd21pX3RhcmdldF9zdGF0cyAqKSBwdHI7Ci0Jc3RydWN0IHRhcmdldF9zdGF0cyAqc3RhdHMgPSAmYXItPnRhcmdldF9zdGF0czsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisJc3RydWN0IHRhcmdldF9zdGF0cyAqc3RhdHMgPSAmdmlmLT50YXJnZXRfc3RhdHM7CiAJc3RydWN0IHRraXBfY2NtcF9zdGF0cyAqY2NtcF9zdGF0czsKIAl1OCBhYzsKIApAQCAtMTE4OSw4ICs3NDUsOCBAQAogCXN0YXRzLT53b3dfZXZ0X2Rpc2NhcmRlZCArPQogCQlsZTE2X3RvX2NwdSh0Z3Rfc3RhdHMtPndvd19zdGF0cy53b3dfZXZ0X2Rpc2NhcmRlZCk7CiAKLQlpZiAodGVzdF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZhci0+ZmxhZykpIHsKLQkJY2xlYXJfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmYXItPmZsYWcpOworCWlmICh0ZXN0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJnZpZi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChTVEFUU19VUERBVEVfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCQl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOwogCX0KIH0KQEAgLTEyMDAsMTQgKzc1NiwxNSBAQAogCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIGxlMzJfdG9fY3B1KHZhbCkpOwogfQogCi12b2lkIGF0aDZrbF90Z3Rfc3RhdHNfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpwdHIsIHUzMiBsZW4pCit2b2lkIGF0aDZrbF90Z3Rfc3RhdHNfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggKnB0ciwgdTMyIGxlbikKIHsKIAlzdHJ1Y3Qgd21pX2FwX21vZGVfc3RhdCAqcCA9IChzdHJ1Y3Qgd21pX2FwX21vZGVfc3RhdCAqKSBwdHI7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXN0cnVjdCB3bWlfYXBfbW9kZV9zdGF0ICphcCA9ICZhci0+YXBfc3RhdHM7CiAJc3RydWN0IHdtaV9wZXJfc3RhX3N0YXQgKnN0X2FwLCAqc3RfcDsKIAl1OCBhYzsKIAotCWlmIChhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CisJaWYgKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CiAJCWlmIChsZW4gPCBzaXplb2YoKnApKQogCQkJcmV0dXJuOwogCkBAIC0xMjI2LDcgKzc4Myw3IEBACiAJCX0KIAogCX0gZWxzZSB7Ci0JCWF0aDZrbF91cGRhdGVfdGFyZ2V0X3N0YXRzKGFyLCBwdHIsIGxlbik7CisJCWF0aDZrbF91cGRhdGVfdGFyZ2V0X3N0YXRzKHZpZiwgcHRyLCBsZW4pOwogCX0KIH0KIApAQCAtMTI0NSwxMSArODAyLDEyIEBACiAJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKIH0KIAotdm9pZCBhdGg2a2xfcHNwb2xsX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCBhaWQpCit2b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggYWlkKQogewogCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJYm9vbCBwc3FfZW1wdHkgPSBmYWxzZTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKIAljb25uID0gYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChhciwgYWlkKTsKIApAQCAtMTI3Miw3ICs4MzAsNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CiAKIAljb25uLT5zdGFfZmxhZ3MgfD0gU1RBX1BTX1BPTExFRDsKLQlhdGg2a2xfZGF0YV90eChza2IsIGFyLT5uZXRfZGV2KTsKKwlhdGg2a2xfZGF0YV90eChza2IsIHZpZi0+bmRldik7CiAJY29ubi0+c3RhX2ZsYWdzICY9IH5TVEFfUFNfUE9MTEVEOwogCiAJc3Bpbl9sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7CkBAIC0xMjgwLDEzICs4MzgsMTQgQEAKIAlzcGluX3VubG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwogCiAJaWYgKHBzcV9lbXB0eSkKLQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCBjb25uLT5haWQsIDApOworCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgY29ubi0+YWlkLCAwKTsKIH0KIAotdm9pZCBhdGg2a2xfZHRpbWV4cGlyeV9ldmVudChzdHJ1Y3QgYXRoNmtsICphcikKK3ZvaWQgYXRoNmtsX2R0aW1leHBpcnlfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlib29sIG1jYXN0cV9lbXB0eSA9IGZhbHNlOwogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJLyoKIAkgKiBJZiB0aGVyZSBhcmUgbm8gYXNzb2NpYXRlZCBTVEFzLCBpZ25vcmUgdGhlIERUSU0gZXhwaXJ5IGV2ZW50LgpAQCAtMTMwOCwzMSArODY3LDMxIEBACiAJCXJldHVybjsKIAogCS8qIHNldCB0aGUgU1RBIGZsYWcgdG8gZHRpbV9leHBpcmVkIGZvciB0aGUgZnJhbWUgdG8gZ28gb3V0ICovCi0Jc2V0X2JpdChEVElNX0VYUElSRUQsICZhci0+ZmxhZyk7CisJc2V0X2JpdChEVElNX0VYUElSRUQsICZ2aWYtPmZsYWdzKTsKIAogCXNwaW5fbG9ja19iaCgmYXItPm1jYXN0cHNxX2xvY2spOwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFyLT5tY2FzdHBzcSkpICE9IE5VTEwpIHsKIAkJc3Bpbl91bmxvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAotCQlhdGg2a2xfZGF0YV90eChza2IsIGFyLT5uZXRfZGV2KTsKKwkJYXRoNmtsX2RhdGFfdHgoc2tiLCB2aWYtPm5kZXYpOwogCiAJCXNwaW5fbG9ja19iaCgmYXItPm1jYXN0cHNxX2xvY2spOwogCX0KIAlzcGluX3VubG9ja19iaCgmYXItPm1jYXN0cHNxX2xvY2spOwogCi0JY2xlYXJfYml0KERUSU1fRVhQSVJFRCwgJmFyLT5mbGFnKTsKKwljbGVhcl9iaXQoRFRJTV9FWFBJUkVELCAmdmlmLT5mbGFncyk7CiAKIAkvKiBjbGVhciB0aGUgTFNCIG9mIHRoZSBCaXRNYXBDdGwgZmllbGQgb2YgdGhlIFRJTSBJRSAqLwotCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgTUNBU1RfQUlELCAwKTsKKwlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgTUNBU1RfQUlELCAwKTsKIH0KIAotdm9pZCBhdGg2a2xfZGlzY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggcmVhc29uLCB1OCAqYnNzaWQsCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwgdTggKmJzc2lkLAogCQkJICAgICB1OCBhc3NvY19yZXNwX2xlbiwgdTggKmFzc29jX2luZm8sCiAJCQkgICAgIHUxNiBwcm90X3JlYXNvbl9zdGF0dXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQlpZiAoIWF0aDZrbF9yZW1vdmVfc3RhKGFyLCBic3NpZCwgcHJvdF9yZWFzb25fc3RhdHVzKSkKIAkJCXJldHVybjsKIApAQCAtMTM0NCwzMSArOTAzLDMxIEBACiAKIAkJCS8qIGNsZWFyIHRoZSBMU0Igb2YgdGhlIFRJTSBJRSdzIEJpdE1hcEN0bCBmaWVsZCAqLwogCQkJaWYgKHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSkKLQkJCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIE1DQVNUX0FJRCwgMCk7CisJCQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgICAgICAgTUNBU1RfQUlELCAwKTsKIAkJfQogCiAJCWlmICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYnNzaWQpKSB7CiAJCQkvKiBzZW5kIGV2ZW50IHRvIGFwcGxpY2F0aW9uICovCi0JCQljZmc4MDIxMV9kZWxfc3RhKGFyLT5uZXRfZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CisJCQljZmc4MDIxMV9kZWxfc3RhKHZpZi0+bmRldiwgYnNzaWQsIEdGUF9LRVJORUwpOwogCQl9CiAKLQkJaWYgKG1lbWNtcChhci0+bmV0X2Rldi0+ZGV2X2FkZHIsIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkgewotCQkJbWVtc2V0KGFyLT53ZXBfa2V5X2xpc3QsIDAsIHNpemVvZihhci0+d2VwX2tleV9saXN0KSk7Ci0JCQljbGVhcl9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOworCQlpZiAobWVtY21wKHZpZi0+bmRldi0+ZGV2X2FkZHIsIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkgeworCQkJbWVtc2V0KHZpZi0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YodmlmLT53ZXBfa2V5X2xpc3QpKTsKKwkJCWNsZWFyX2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCi0JYXRoNmtsX2NmZzgwMjExX2Rpc2Nvbm5lY3RfZXZlbnQoYXIsIHJlYXNvbiwgYnNzaWQsCisJYXRoNmtsX2NmZzgwMjExX2Rpc2Nvbm5lY3RfZXZlbnQodmlmLCByZWFzb24sIGJzc2lkLAogCQkJCSAgICAgICBhc3NvY19yZXNwX2xlbiwgYXNzb2NfaW5mbywKIAkJCQkgICAgICAgcHJvdF9yZWFzb25fc3RhdHVzKTsKIAotCWFnZ3JfcmVzZXRfc3RhdGUoYXItPmFnZ3JfY250eHQpOworCWFnZ3JfcmVzZXRfc3RhdGUodmlmLT5hZ2dyX2NudHh0KTsKIAotCWRlbF90aW1lcigmYXItPmRpc2Nvbm5lY3RfdGltZXIpOworCWRlbF90aW1lcigmdmlmLT5kaXNjb25uZWN0X3RpbWVyKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NPTk5FQ1QsCi0JCSAgICJkaXNjb25uZWN0IHJlYXNvbiBpcyAlZFxuIiwgcmVhc29uKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJkaXNjb25uZWN0IHJlYXNvbiBpcyAlZFxuIiwgcmVhc29uKTsKIAogCS8qCiAJICogSWYgdGhlIGV2ZW50IGlzIGR1ZSB0byBkaXNjb25uZWN0IGNtZCBmcm9tIHRoZSBob3N0LCBvbmx5IHRoZXkKQEAgLTEzNzcsODMgKzkzNiw4OCBAQAogCSAqLwogCWlmIChyZWFzb24gPT0gRElTQ09OTkVDVF9DTUQpIHsKIAkJaWYgKCFhci0+dXNyX2Jzc19maWx0ZXIgJiYgdGVzdF9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpKQotCQkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CisJCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CiAJfSBlbHNlIHsKLQkJc2V0X2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7CisJCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAJCWlmICgoKHJlYXNvbiA9PSBBU1NPQ19GQUlMRUQpICYmCiAJCSAgICAocHJvdF9yZWFzb25fc3RhdHVzID09IDB4MTEpKSB8fAogCQkgICAgKChyZWFzb24gPT0gQVNTT0NfRkFJTEVEKSAmJiAocHJvdF9yZWFzb25fc3RhdHVzID09IDB4MCkKLQkJICAgICAmJiAoYXItPnJlY29ubmVjdF9mbGFnID09IDEpKSkgewotCQkJc2V0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZyk7CisJCSAgICAgJiYgKHZpZi0+cmVjb25uZWN0X2ZsYWcgPT0gMSkpKSB7CisJCQlzZXRfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCiAJLyogdXBkYXRlIGNvbm5lY3QgJiBsaW5rIHN0YXR1cyBhdG9taWNhbGx5ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyLT5sb2NrLCBmbGFncyk7Ci0JY2xlYXJfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKTsKLQluZXRpZl9jYXJyaWVyX29mZihhci0+bmV0X2Rldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJY2xlYXJfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOworCW5ldGlmX2NhcnJpZXJfb2ZmKHZpZi0+bmRldik7CisJc3Bpbl91bmxvY2tfYmgoJnZpZi0+aWZfbG9jayk7CiAKLQlpZiAoKHJlYXNvbiAhPSBDU0VSVl9ESVNDT05ORUNUKSB8fCAoYXItPnJlY29ubmVjdF9mbGFnICE9IDEpKQotCQlhci0+cmVjb25uZWN0X2ZsYWcgPSAwOworCWlmICgocmVhc29uICE9IENTRVJWX0RJU0NPTk5FQ1QpIHx8ICh2aWYtPnJlY29ubmVjdF9mbGFnICE9IDEpKQorCQl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKIAogCWlmIChyZWFzb24gIT0gQ1NFUlZfRElTQ09OTkVDVCkKIAkJYXItPnVzZXJfa2V5X2N0cmwgPSAwOwogCi0JbmV0aWZfc3RvcF9xdWV1ZShhci0+bmV0X2Rldik7Ci0JbWVtc2V0KGFyLT5ic3NpZCwgMCwgc2l6ZW9mKGFyLT5ic3NpZCkpOwotCWFyLT5ic3NfY2ggPSAwOworCW5ldGlmX3N0b3BfcXVldWUodmlmLT5uZGV2KTsKKwltZW1zZXQodmlmLT5ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+YnNzaWQpKTsKKwl2aWYtPmJzc19jaCA9IDA7CiAKIAlhdGg2a2xfdHhfZGF0YV9jbGVhbnVwKGFyKTsKIH0KIAorc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF92aWZfZmlyc3Qoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKKworCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmFyLT52aWZfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2aWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhci0+dmlmX2xpc3QsIHN0cnVjdCBhdGg2a2xfdmlmLCBsaXN0KTsKKworCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKworCXJldHVybiB2aWY7Cit9CisKIHN0YXRpYyBpbnQgYXRoNmtsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhci0+bG9jaywgZmxhZ3MpOworCXNldF9iaXQoV0xBTl9FTkFCTEVELCAmdmlmLT5mbGFncyk7CiAKLQlzZXRfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpIHsKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpIHsKIAkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJfSBlbHNlCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhci0+bG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCi0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOworCWF0aDZrbF9jZmc4MDIxMV9zdG9wKHZpZik7CiAKLQlpZiAodGVzdF9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpKSB7Ci0JCWlmIChhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIDB4RkZGRiwgMCwgMCwgMCwgMCwgMCwgMCwKLQkJCQkJICAgICAgMCwgMCwgMCkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQljbGVhcl9iaXQoV0xBTl9FTkFCTEVELCAmYXItPmZsYWcpOwotCX0KLQotCWF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KGFyLCAtRUNBTkNFTEVEKTsKKwljbGVhcl9iaXQoV0xBTl9FTkFCTEVELCAmdmlmLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdGg2a2xfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JcmV0dXJuICZhci0+bmV0X3N0YXRzOworCXJldHVybiAmdmlmLT5uZXRfc3RhdHM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXRoNmtsX25ldGRldl9vcHMgPSB7CkBAIC0xNDY2LDYgKzEwMzAsNyBAQAogdm9pZCBpbml0X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWRldi0+bmV0ZGV2X29wcyA9ICZhdGg2a2xfbmV0ZGV2X29wczsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gQVRINktMX1RYX1RJTUVPVVQ7CiAKIAlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IEVUSF9ITEVOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3NkaW8uYwppbmRleCBmMWRjMzExLi4xNWMzZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3NkaW8uYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvbW1jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KQEAgLTIxLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZC5oPgotI2luY2x1ZGUgImh0Y19oaWYuaCIKKyNpbmNsdWRlICJoaWYuaCIKICNpbmNsdWRlICJoaWYtb3BzLmgiCiAjaW5jbHVkZSAidGFyZ2V0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTM5LDEyICs0MCwxOCBAQAogCXN0cnVjdCBidXNfcmVxdWVzdCBidXNfcmVxW0JVU19SRVFVRVNUX01BWF9OVU1dOwogCiAJc3RydWN0IGF0aDZrbCAqYXI7CisKIAl1OCAqZG1hX2J1ZmZlcjsKIAorCS8qIHByb3RlY3RzIGFjY2VzcyB0byBkbWFfYnVmZmVyICovCisJc3RydWN0IG11dGV4IGRtYV9idWZmZXJfbXV0ZXg7CisKIAkvKiBzY2F0dGVyIHJlcXVlc3QgbGlzdCBoZWFkICovCiAJc3RydWN0IGxpc3RfaGVhZCBzY2F0X3JlcTsKIAogCXNwaW5sb2NrX3Qgc2NhdF9sb2NrOworCWJvb2wgc2NhdHRlcl9lbmFibGVkOworCiAJYm9vbCBpc19kaXNhYmxlZDsKIAlhdG9taWNfdCBpcnFfaGFuZGxpbmc7CiAJY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkICppZDsKQEAgLTEzNCw2ICsxNDEsOCBAQAogewogCWludCByZXQgPSAwOwogCisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCiAJaWYgKHJlcXVlc3QgJiBISUZfV1JJVEUpIHsKIAkJLyogRklYTUU6IGxvb2tzIGxpa2UgdWdseSB3b3JrYXJvdW5kIGZvciBzb21ldGhpbmcgKi8KIAkJaWYgKGFkZHIgPj0gSElGX01CT1hfQkFTRV9BRERSICYmCkBAIC0xNTUsNiArMTY0LDggQEAKIAkJCXJldCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhmdW5jLCBidWYsIGFkZHIsIGxlbik7CiAJfQogCisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0RJTywgIiVzIGFkZHIgMHgleCVzIGJ1ZiAweCVwIGxlbiAlZFxuIiwKIAkJICAgcmVxdWVzdCAmIEhJRl9XUklURSA/ICJ3ciIgOiAicmQiLCBhZGRyLAogCQkgICByZXF1ZXN0ICYgSElGX0ZJWEVEX0FERFJFU1MgPyAiIChmaXhlZCkiIDogIiIsIGJ1ZiwgbGVuKTsKQEAgLTE2NiwxMiArMTc3LDExIEBACiBzdGF0aWMgc3RydWN0IGJ1c19yZXF1ZXN0ICphdGg2a2xfc2Rpb19hbGxvY19idXNyZXEoc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvKQogewogCXN0cnVjdCBidXNfcmVxdWVzdCAqYnVzX3JlcTsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+bG9jaywgZmxhZyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIAogCWlmIChsaXN0X2VtcHR5KCZhcl9zZGlvLT5idXNfcmVxX2ZyZWVxKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT5sb2NrLCBmbGFnKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPmxvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE3OSw3ICsxODksNyBAQAogCQkJCSAgIHN0cnVjdCBidXNfcmVxdWVzdCwgbGlzdCk7CiAJbGlzdF9kZWwoJmJ1c19yZXEtPmxpc3QpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+bG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPmxvY2spOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19TQ0FUVEVSLCAiJXM6IGJ1cyByZXF1ZXN0IDB4JXBcbiIsCiAJCSAgIF9fZnVuY19fLCBidXNfcmVxKTsKIApAQCAtMTg5LDE0ICsxOTksMTIgQEAKIHN0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX2ZyZWVfYnVzX3JlcShzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8sCiAJCQkJICAgICBzdHJ1Y3QgYnVzX3JlcXVlc3QgKmJ1c19yZXEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwotCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NDQVRURVIsICIlczogYnVzIHJlcXVlc3QgMHglcFxuIiwKIAkJICAgX19mdW5jX18sIGJ1c19yZXEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+bG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYnVzX3JlcS0+bGlzdCwgJmFyX3NkaW8tPmJ1c19yZXFfZnJlZXEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9fc2V0dXBfc2NhdF9kYXRhKHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxLApAQCAtMjkwLDEwICsyOTgsMTQgQEAKIAltbWNfcmVxLmNtZCA9ICZjbWQ7CiAJbW1jX3JlcS5kYXRhID0gJmRhdGE7CiAKKwlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CisKIAltbWNfc2V0X2RhdGFfdGltZW91dCgmZGF0YSwgYXJfc2Rpby0+ZnVuYy0+Y2FyZCk7CiAJLyogc3luY2hyb25vdXMgY2FsbCB0byBwcm9jZXNzIHJlcXVlc3QgKi8KIAltbWNfd2FpdF9mb3JfcmVxKGFyX3NkaW8tPmZ1bmMtPmNhcmQtPmhvc3QsICZtbWNfcmVxKTsKIAorCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCiAJc3RhdHVzID0gY21kLmVycm9yID8gY21kLmVycm9yIDogZGF0YS5lcnJvcjsKIAogc2NhdF9jb21wbGV0ZToKQEAgLTM4OCwxNyArNDAwLDE5IEBACiAJaWYgKGJ1Zl9uZWVkc19ib3VuY2UoYnVmKSkgewogCQlpZiAoIWFyX3NkaW8tPmRtYV9idWZmZXIpCiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJbXV0ZXhfbG9jaygmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAJCXRidWYgPSBhcl9zZGlvLT5kbWFfYnVmZmVyOwogCQltZW1jcHkodGJ1ZiwgYnVmLCBsZW4pOwogCQlib3VuY2VkID0gdHJ1ZTsKIAl9IGVsc2UKIAkJdGJ1ZiA9IGJ1ZjsKIAotCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAlyZXQgPSBhdGg2a2xfc2Rpb19pbyhhcl9zZGlvLT5mdW5jLCByZXF1ZXN0LCBhZGRyLCB0YnVmLCBsZW4pOwogCWlmICgocmVxdWVzdCAmIEhJRl9SRUFEKSAmJiBib3VuY2VkKQogCQltZW1jcHkoYnVmLCB0YnVmLCBsZW4pOwotCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCisJaWYgKGJvdW5jZWQpCisJCW11dGV4X3VubG9jaygmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDE3LDI5ICs0MzEsMjUgQEAKIAkJCQkJCSAgICAgcmVxLT5yZXF1ZXN0KTsKIAkJY29udGV4dCA9IHJlcS0+cGFja2V0OwogCQlhdGg2a2xfc2Rpb19mcmVlX2J1c19yZXEoYXJfc2RpbywgcmVxKTsKLQkJYXRoNmtsZGV2X3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCBzdGF0dXMpOworCQlhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCBzdGF0dXMpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9fd3JpdGVfYXN5bmNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGJ1c19yZXF1ZXN0ICpyZXEsICp0bXBfcmVxOwogCiAJYXJfc2RpbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoNmtsX3NkaW8sIHdyX2FzeW5jX3dvcmspOwotCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXBfcmVxLCAmYXJfc2Rpby0+d3JfYXN5bmNxLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAkJX19hdGg2a2xfc2Rpb193cml0ZV9hc3luYyhhcl9zZGlvLCByZXEpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7Ci0KLQlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX2lycV9oYW5kbGVyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCkBAIC00NTgsMjAgKzQ2OCwyMyBAQAogCSAqLwogCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOwogCi0Jc3RhdHVzID0gYXRoNmtsZGV2X2ludHJfYmhfaGFuZGxlcihhcl9zZGlvLT5hcik7CisJc3RhdHVzID0gYXRoNmtsX2hpZl9pbnRyX2JoX2hhbmRsZXIoYXJfc2Rpby0+YXIpOwogCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAlhdG9taWNfc2V0KCZhcl9zZGlvLT5pcnFfaGFuZGxpbmcsIDApOwogCVdBUk5fT04oc3RhdHVzICYmIHN0YXR1cyAhPSAtRUNBTkNFTEVEKTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vbihzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8pCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Bvd2VyX29uKHN0cnVjdCBhdGg2a2wgKmFyKQogeworCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBhcl9zZGlvLT5mdW5jOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFhcl9zZGlvLT5pc19kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgInNkaW8gcG93ZXIgb25cbiIpOworCiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCiAJcmV0ID0gc2Rpb19lbmFibGVfZnVuYyhmdW5jKTsKQEAgLTQ5NCwxMyArNTA3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vZmYoc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvKQorc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vZmYoc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CiAJaW50IHJldDsKIAogCWlmIChhcl9zZGlvLT5pc19kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgInNkaW8gcG93ZXIgb2ZmXG4iKTsKKwogCS8qIERpc2FibGUgdGhlIGNhcmQgKi8KIAlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CiAJcmV0ID0gc2Rpb19kaXNhYmxlX2Z1bmMoYXJfc2Rpby0+ZnVuYyk7CkBAIC01MjAsNyArNTM2LDYgQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3QgYnVzX3JlcXVlc3QgKmJ1c19yZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWJ1c19yZXEgPSBhdGg2a2xfc2Rpb19hbGxvY19idXNyZXEoYXJfc2Rpbyk7CiAKQEAgLTUzMyw5ICs1NDgsOSBAQAogCWJ1c19yZXEtPnJlcXVlc3QgPSByZXF1ZXN0OwogCWJ1c19yZXEtPnBhY2tldCA9IHBhY2tldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZidXNfcmVxLT5saXN0LCAmYXJfc2Rpby0+d3JfYXN5bmNxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCXF1ZXVlX3dvcmsoYXItPmF0aDZrbF93cSwgJmFyX3NkaW8tPndyX2FzeW5jX3dvcmspOwogCiAJcmV0dXJuIDA7CkBAIC01ODEsOSArNTk2LDggQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFyX3NkaW8tPnNjYXRfcmVxKSkgewogCQlub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXJfc2Rpby0+c2NhdF9yZXEsCkBAIC01OTEsNyArNjA1LDcgQEAKIAkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKIAlyZXR1cm4gbm9kZTsKIH0KQEAgLTYwMCwxMyArNjE0LDEyIEBACiAJCQkJCXN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNfcmVxKQogewogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogCWxpc3RfYWRkX3RhaWwoJnNfcmVxLT5saXN0LCAmYXJfc2Rpby0+c2NhdF9yZXEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogfQogCkBAIC02MTcsNyArNjMwLDYgQEAKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAl1MzIgcmVxdWVzdCA9IHNjYXRfcmVxLT5yZXE7CiAJaW50IHN0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghc2NhdF9yZXEtPmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MjYsMTQgKzYzOCwxMiBAQAogCQkiaGlmLXNjYXR0ZXI6IHRvdGFsIGxlbjogJWQgc2NhdHRlciBlbnRyaWVzOiAlZFxuIiwKIAkJc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKLQlpZiAocmVxdWVzdCAmIEhJRl9TWU5DSFJPTk9VUykgewotCQlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CisJaWYgKHJlcXVlc3QgJiBISUZfU1lOQ0hST05PVVMpCiAJCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3NjYXRfcncoYXJfc2Rpbywgc2NhdF9yZXEtPmJ1c3JlcXVlc3QpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jaywgZmxhZ3MpOworCWVsc2UgeworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlsaXN0X2FkZF90YWlsKCZzY2F0X3JlcS0+YnVzcmVxdWVzdC0+bGlzdCwgJmFyX3NkaW8tPndyX2FzeW5jcSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlxdWV1ZV93b3JrKGFyLT5hdGg2a2xfd3EsICZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKIAl9CiAKQEAgLTY0NSwyMyArNjU1LDI3IEBACiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CiAJc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc19yZXEsICp0bXBfcmVxOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCS8qIGVtcHR5IHRoZSBmcmVlIGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNfcmVxLCB0bXBfcmVxLCAmYXJfc2Rpby0+c2NhdF9yZXEsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJnNfcmVxLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKKwkJLyoKKwkJICogRklYTUU6IHNob3VsZCB3ZSBhbHNvIGNhbGwgY29tcGxldGlvbiBoYW5kbGVyIHdpdGgKKwkJICogYXRoNmtsX2hpZl9yd19jb21wX2hhbmRsZXIoKSB3aXRoIHN0YXR1cyAtRUNBTkNFTEVEIHNvCisJCSAqIHRoYXQgdGhlIHBhY2tldCBpcyBwcm9wZXJseSBmcmVlZD8KKwkJICovCiAJCWlmIChzX3JlcS0+YnVzcmVxdWVzdCkKIAkJCWF0aDZrbF9zZGlvX2ZyZWVfYnVzX3JlcShhcl9zZGlvLCBzX3JlcS0+YnVzcmVxdWVzdCk7CiAJCWtmcmVlKHNfcmVxLT52aXJ0X2RtYV9idWYpOwogCQlrZnJlZShzX3JlcS0+c2dlbnRyaWVzKTsKIAkJa2ZyZWUoc19yZXEpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiB9CiAKIC8qIHNldHVwIG9mIEhJRiBzY2F0dGVyIHJlc291cmNlcyAqLwpAQCAtNjcyLDYgKzY4NiwxMSBAQAogCWludCByZXQ7CiAJYm9vbCB2aXJ0X3NjYXQgPSBmYWxzZTsKIAorCWlmIChhcl9zZGlvLT5zY2F0dGVyX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJYXJfc2Rpby0+c2NhdHRlcl9lbmFibGVkID0gdHJ1ZTsKKwogCS8qIGNoZWNrIGlmIGhvc3Qgc3VwcG9ydHMgc2NhdHRlciBhbmQgaXQgbWVldHMgb3VyIHJlcXVpcmVtZW50cyAqLwogCWlmIChhcl9zZGlvLT5mdW5jLT5jYXJkLT5ob3N0LT5tYXhfc2VncyA8IE1BWF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSkgewogCQlhdGg2a2xfZXJyKCJob3N0IG9ubHkgc3VwcG9ydHMgc2NhdHRlciBvZiA6JWQgZW50cmllcywgbmVlZDogJWRcbiIsCkBAIC02ODYsOCArNzA1LDggQEAKIAkJCQlNQVhfU0NBVFRFUl9SRVFVRVNUUywgdmlydF9zY2F0KTsKIAogCQlpZiAoIXJldCkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NDQVRURVIsCi0JCQkJICAgImhpZi1zY2F0dGVyIGVuYWJsZWQ6IG1heCBzY2F0dGVyIHJlcSA6ICVkIGVudHJpZXM6ICVkXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCQkJICAgImhpZi1zY2F0dGVyIGVuYWJsZWQgcmVxdWVzdHMgJWQgZW50cmllcyAlZFxuIiwKIAkJCQkgICBNQVhfU0NBVFRFUl9SRVFVRVNUUywKIAkJCQkgICBNQVhfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEpOwogCkBAIC03MTEsOCArNzMwLDggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0NBVFRFUiwKLQkJCSAgICJWaXR1YWwgc2NhdHRlciBlbmFibGVkLCBtYXhfc2NhdF9yZXE6JWQsIGVudHJpZXM6JWRcbiIsCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJICAgInZpcnR1YWwgc2NhdHRlciBlbmFibGVkIHJlcXVlc3RzICVkIGVudHJpZXMgJWRcbiIsCiAJCQkgICBBVEg2S0xfU0NBVFRFUl9SRVFTLCBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEpOwogCiAJCXRhcmdldC0+bWF4X3NjYXRfZW50cmllcyA9IEFUSDZLTF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUTsKQEAgLTcyMyw3ICs3NDIsNDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19zdXNwZW5kKHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIGludCBhdGg2a2xfc2Rpb19jb25maWcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGFyX3NkaW8tPmZ1bmM7CisJaW50IHJldDsKKworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKworCWlmICgoYXJfc2Rpby0+aWQtPmRldmljZSAmIE1BTlVGQUNUVVJFUl9JRF9BVEg2S0xfQkFTRV9NQVNLKSA+PQorCSAgICBNQU5VRkFDVFVSRVJfSURfQVI2MDAzX0JBU0UpIHsKKwkJLyogZW5hYmxlIDQtYml0IEFTWU5DIGludGVycnVwdCBvbiBBUjYwMDMgb3IgbGF0ZXIgKi8KKwkJcmV0ID0gYXRoNmtsX3NkaW9fZnVuYzBfY21kNTJfd3JfYnl0ZShmdW5jLT5jYXJkLAorCQkJCQkJQ0NDUl9TRElPX0lSUV9NT0RFX1JFRywKKwkJCQkJCVNESU9fSVJRX01PREVfQVNZTkNfNEJJVF9JUlEpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIDQtYml0IGFzeW5jIGlycSBtb2RlICVkXG4iLAorCQkJCSAgIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiNC1iaXQgYXN5bmMgaXJxIG1vZGUgZW5hYmxlZFxuIik7CisJfQorCisJLyogZ2l2ZSB1cyBzb21lIHRpbWUgdG8gZW5hYmxlLCBpbiBtcyAqLworCWZ1bmMtPmVuYWJsZV90aW1lb3V0ID0gMTAwOworCisJcmV0ID0gc2Rpb19zZXRfYmxvY2tfc2l6ZShmdW5jLCBISUZfTUJPWF9CTE9DS19TSVpFKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF9lcnIoIlNldCBzZGlvIGJsb2NrIHNpemUgJWQgZmFpbGVkOiAlZClcbiIsCisJCQkgICBISUZfTUJPWF9CTE9DS19TSVpFLCByZXQpOworCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gYXJfc2Rpby0+ZnVuYzsKQEAgLTczMiwxMiArNzkxLDE0IEBACiAKIAlmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKIAotCWlmICghKGZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKQotCQkvKiBhcyBob3N0IGRvZXNuJ3Qgc3VwcG9ydCBrZWVwIHBvd2VyIHdlIG5lZWQgdG8gYmFpbCBvdXQgKi8KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCQkgICAiZnVuYyAlZCBkb2Vzbid0IHN1cHBvcnQgTU1DX1BNX0tFRVBfUE9XRVJcbiIsCi0JCQkgICBmdW5jLT5udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInNkaW8gc3VzcGVuZCBwbV9jYXBzIDB4JXhcbiIsIGZsYWdzKTsKKworCWlmICghKGZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpIHx8CisJICAgIChhci0+Y29uZl9mbGFncyAmIEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVIpKSB7CisJCS8qIGFzIGhvc3QgZG9lc24ndCBzdXBwb3J0IGtlZXAgcG93ZXIgd2UgbmVlZCB0byBjdXQgcG93ZXIgKi8KKwkJcmV0dXJuIGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLCBBVEg2S0xfQ0ZHX1NVU1BFTkRfQ1VUUE9XRVIsCisJCQkJCSAgICAgICBOVUxMKTsKKwl9CiAKIAlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9LRUVQX1BPV0VSKTsKIAlpZiAocmV0KSB7CkBAIC03NDYsMTEgKzgwNywzNjcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGg2a2xfZGVlcF9zbGVlcF9lbmFibGUoYXIpOworCWlmICghKGZsYWdzICYgTU1DX1BNX1dBS0VfU0RJT19JUlEpKQorCQlnb3RvIGRlZXBzbGVlcDsKKworCS8qIHNkaW8gaXJxIHdha2VzIHVwIGhvc3QgKi8KKworCWlmIChhci0+c3RhdGUgPT0gQVRINktMX1NUQVRFX1NDSEVEX1NDQU4pIHsKKwkJcmV0ID0gIGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLAorCQkJCQkgICAgICAgQVRINktMX0NGR19TVVNQRU5EX1NDSEVEX1NDQU4sCisJCQkJCSAgICAgICBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX3dhcm4oIlNjaGVkdWxlIHNjYW4gc3VzcGVuZCBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9XQUtFX1NESU9fSVJRKTsKKwkJaWYgKHJldCkKKwkJCWF0aDZrbF93YXJuKCJzZXQgc2RpbyB3YWtlIGlycSBmbGFnIGZhaWxlZDogJWRcbiIsIHJldCk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAod293KSB7CisJCS8qCisJCSAqIFRoZSBob3N0IHNkaW8gY29udHJvbGxlciBpcyBjYXBhYmxlIG9mIGtlZXAgcG93ZXIgYW5kCisJCSAqIHNkaW8gaXJxIHdha2UgdXAgYXQgdGhpcyBwb2ludC4gSXQncyBmaW5lIHRvIGNvbnRpbnVlCisJCSAqIHdvdyBzdXNwZW5kIG9wZXJhdGlvbi4KKwkJICovCisJCXJldCA9IGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLCBBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XLCB3b3cpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9XQUtFX1NESU9fSVJRKTsKKwkJaWYgKHJldCkKKwkJCWF0aDZrbF9lcnIoInNldCBzZGlvIHdha2UgaXJxIGZsYWcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCQlyZXR1cm4gcmV0OworCX0KKworZGVlcHNsZWVwOgorCXJldHVybiBhdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChhciwgQVRINktMX0NGR19TVVNQRU5EX0RFRVBTTEVFUCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3NkaW9fcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXN3aXRjaCAoYXItPnN0YXRlKSB7CisJY2FzZSBBVEg2S0xfU1RBVEVfT0ZGOgorCWNhc2UgQVRINktMX1NUQVRFX0NVVFBPV0VSOgorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwKKwkJCSAgICJzZGlvIHJlc3VtZSBjb25maWd1cmluZyBzZGlvXG4iKTsKKworCQkvKiBuZWVkIHRvIHNldCBzZGlvIHNldHRpbmdzIGFmdGVyIHBvd2VyIGlzIGN1dCBmcm9tIHNkaW8gKi8KKwkJYXRoNmtsX3NkaW9fY29uZmlnKGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9PTjoKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9ERUVQU0xFRVA6CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfV09XOgorCQlicmVhazsKKwljYXNlIEFUSDZLTF9TVEFURV9TQ0hFRF9TQ0FOOgorCQlicmVhazsKKwl9CisKKwlhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKGFyKTsKIAogCXJldHVybiAwOwogfQogCisvKiBzZXQgdGhlIHdpbmRvdyBhZGRyZXNzIHJlZ2lzdGVyICh1c2luZyA0LWJ5dGUgcmVnaXN0ZXIgYWNjZXNzICkuICovCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYWRkcndpbl9yZWcoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiByZWdfYWRkciwgdTMyIGFkZHIpCit7CisJaW50IHN0YXR1czsKKwl1OCBhZGRyX3ZhbFs0XTsKKwlzMzIgaTsKKworCS8qCisJICogV3JpdGUgYnl0ZXMgMSwyLDMgb2YgdGhlIHJlZ2lzdGVyIHRvIHNldCB0aGUgdXBwZXIgYWRkcmVzcyBieXRlcywKKwkgKiB0aGUgTFNCIGlzIHdyaXR0ZW4gbGFzdCB0byBpbml0aWF0ZSB0aGUgYWNjZXNzIGN5Y2xlCisJICovCisKKwlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQkvKgorCQkgKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYWRkcmVzcyBieXRlIHZhbHVlIHdlIHdhbnQgdG8KKwkJICogaGl0IDQgdGltZXMuCisJCSAqLworCQltZW1zZXQoYWRkcl92YWwsICgodTggKikmYWRkcilbaV0sIDQpOworCisJCS8qCisJCSAqIEhpdCBlYWNoIGJ5dGUgb2YgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgd2l0aCBhIDQtYnl0ZQorCQkgKiB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIHNhbWUgYWRkcmVzcywgdGhpcyBpcyBhIGhhcm1sZXNzCisJCSAqIG9wZXJhdGlvbi4KKwkJICovCisJCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgcmVnX2FkZHIgKyBpLCBhZGRyX3ZhbCwKKwkJCQkJICAgICA0LCBISUZfV1JfU1lOQ19CWVRFX0ZJWCk7CisJCWlmIChzdGF0dXMpCisJCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBieXRlcyBvZiAweCV4ICIKKwkJCSAgICJ0byB3aW5kb3cgcmVnOiAweCVYXG4iLCBfX2Z1bmNfXywKKwkJCSAgIGFkZHIsIHJlZ19hZGRyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGFnYWluLCB0aGlzIHRpbWUgd3JpdGUgdGhlIHdob2xlCisJICogNC1ieXRlIHZhbHVlLiBUaGUgZWZmZWN0IGhlcmUgaXMgdGhhdCB0aGUgTFNCIHdyaXRlIGNhdXNlcyB0aGUKKwkgKiBjeWNsZSB0byBzdGFydCwgdGhlIGV4dHJhIDMgYnl0ZSB3cml0ZSB0byBieXRlcyAxLDIsMyBoYXMgbm8KKwkgKiBlZmZlY3Qgc2luY2Ugd2UgYXJlIHdyaXRpbmcgdGhlIHNhbWUgdmFsdWVzIGFnYWluCisJICovCisJc3RhdHVzID0gYXRoNmtsX3NkaW9fcmVhZF93cml0ZV9zeW5jKGFyLCByZWdfYWRkciwgKHU4ICopKCZhZGRyKSwKKwkJCQkgICAgIDQsIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKworCWlmIChzdGF0dXMpIHsKKwkJYXRoNmtsX2VycigiJXM6IGZhaWxlZCB0byB3cml0ZSAweCV4IHRvIHdpbmRvdyByZWc6IDB4JVhcbiIsCisJCQkgICBfX2Z1bmNfXywgYWRkciwgcmVnX2FkZHIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX2RpYWdfcmVhZDMyKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdTMyICpkYXRhKQoreworCWludCBzdGF0dXM7CisKKwkvKiBzZXQgd2luZG93IHJlZ2lzdGVyIHRvIHN0YXJ0IHJlYWQgY3ljbGUgKi8KKwlzdGF0dXMgPSBhdGg2a2xfc2V0X2FkZHJ3aW5fcmVnKGFyLCBXSU5ET1dfUkVBRF9BRERSX0FERFJFU1MsCisJCQkJCWFkZHJlc3MpOworCisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIHJlYWQgdGhlIGRhdGEgKi8KKwlzdGF0dXMgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMoYXIsIFdJTkRPV19EQVRBX0FERFJFU1MsCisJCQkJKHU4ICopZGF0YSwgc2l6ZW9mKHUzMiksIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gcmVhZCBmcm9tIHdpbmRvdyBkYXRhIGFkZHJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19kaWFnX3dyaXRlMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLAorCQkJCSAgICBfX2xlMzIgZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCXUzMiB2YWwgPSAoX19mb3JjZSB1MzIpIGRhdGE7CisKKwkvKiBzZXQgd3JpdGUgZGF0YSAqLworCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgV0lORE9XX0RBVEFfQUREUkVTUywKKwkJCQkodTggKikgJnZhbCwgc2l6ZW9mKHUzMiksIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gd3JpdGUgMHgleCB0byB3aW5kb3cgZGF0YSBhZGRyXG4iLAorCQkJICAgX19mdW5jX18sIGRhdGEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHNldCB3aW5kb3cgcmVnaXN0ZXIsIHdoaWNoIHN0YXJ0cyB0aGUgd3JpdGUgY3ljbGUgKi8KKwlyZXR1cm4gYXRoNmtsX3NldF9hZGRyd2luX3JlZyhhciwgV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUywKKwkJCQkgICAgICBhZGRyZXNzKTsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19ibWlfY3JlZGl0cyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwl1MzIgYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHJldDsKKworCWFyLT5ibWkuY21kX2NyZWRpdHMgPSAwOworCisJLyogUmVhZCB0aGUgY291bnRlciByZWdpc3RlciB0byBnZXQgdGhlIGNvbW1hbmQgY3JlZGl0cyAqLworCWFkZHIgPSBDT1VOVF9ERUNfQUREUkVTUyArIChIVENfTUFJTEJPWF9OVU1fTUFYICsgRU5EUE9JTlQxKSAqIDQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFhci0+Ym1pLmNtZF9jcmVkaXRzKSB7CisKKwkJLyoKKwkJICogSGl0IHRoZSBjcmVkaXQgY291bnRlciB3aXRoIGEgNC1ieXRlIGFjY2VzcywgdGhlIGZpcnN0IGJ5dGUKKwkJICogcmVhZCB3aWxsIGhpdCB0aGUgY291bnRlciBhbmQgY2F1c2UgYSBkZWNyZW1lbnQsIHdoaWxlIHRoZQorCQkgKiByZW1haW5pbmcgMyBieXRlcyBoYXMgbm8gZWZmZWN0LiBUaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzCisJCSAqIGlzIHRvIG1ha2UgYWxsIEhJRiBhY2Nlc3NlcyA0LWJ5dGUgYWxpZ25lZC4KKwkJICovCisJCXJldCA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwKKwkJCQkJICh1OCAqKSZhci0+Ym1pLmNtZF9jcmVkaXRzLCA0LAorCQkJCQkgSElGX1JEX1NZTkNfQllURV9JTkMpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gZGVjcmVtZW50IHRoZSBjb21tYW5kIGNyZWRpdCAiCisJCQkJCQkiY291bnQgcmVnaXN0ZXI6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIFRoZSBjb3VudGVyIGlzIG9ubHkgOCBiaXRzLgorCQkgKiBJZ25vcmUgYW55dGhpbmcgaW4gdGhlIHVwcGVyIDMgYnl0ZXMKKwkJICovCisJCWFyLT5ibWkuY21kX2NyZWRpdHMgJj0gMHhGRjsKKwl9CisKKwlpZiAoIWFyLT5ibWkuY21kX2NyZWRpdHMpIHsKKwkJYXRoNmtsX2VycigiYm1pIGNvbW11bmljYXRpb24gdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9ibWlfZ2V0X3J4X2xrYWhkKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MzIgcnhfd29yZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKCh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgJiYgIXJ4X3dvcmQpIHsKKwkJcmV0ID0gYXRoNmtsX3NkaW9fcmVhZF93cml0ZV9zeW5jKGFyLAorCQkJCQlSWF9MT09LQUhFQURfVkFMSURfQUREUkVTUywKKwkJCQkJKHU4ICopJnJ4X3dvcmQsIHNpemVvZihyeF93b3JkKSwKKwkJCQkJSElGX1JEX1NZTkNfQllURV9JTkMpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gcmVhZCBSWF9MT09LQUhFQURfVkFMSURcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCSAvKiBhbGwgd2UgcmVhbGx5IHdhbnQgaXMgb25lIGJpdCAqLworCQlyeF93b3JkICY9ICgxIDw8IEVORFBPSU5UMSk7CisJfQorCisJaWYgKCFyeF93b3JkKSB7CisJCWF0aDZrbF9lcnIoImJtaV9yZWN2X2J1ZiBGSUZPIGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19ibWlfd3JpdGUoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpidWYsIHUzMiBsZW4pCit7CisJaW50IHJldDsKKwl1MzIgYWRkcjsKKworCXJldCA9IGF0aDZrbF9zZGlvX2JtaV9jcmVkaXRzKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWRkciA9IGFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisKKwlyZXQgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMoYXIsIGFkZHIsIGJ1ZiwgbGVuLAorCQkJCQkgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKwlpZiAocmV0KQorCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2VuZCB0aGUgYm1pIGRhdGEgdG8gdGhlIGRldmljZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX2JtaV9yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCWludCByZXQ7CisJdTMyIGFkZHI7CisKKwkvKgorCSAqIER1cmluZyBub3JtYWwgYm9vdHVwLCBzbWFsbCByZWFkcyBtYXkgYmUgcmVxdWlyZWQuCisJICogUmF0aGVyIHRoYW4gaXNzdWUgYW4gSElGIFJlYWQgYW5kIHRoZW4gd2FpdCBhcyB0aGUgVGFyZ2V0CisJICogYWRkcyBzdWNjZXNzaXZlIGJ5dGVzIHRvIHRoZSBGSUZPLCB3ZSB3YWl0IGhlcmUgdW50aWwKKwkgKiB3ZSBrbm93IHRoYXQgcmVzcG9uc2UgZGF0YSBpcyBhdmFpbGFibGUuCisJICoKKwkgKiBUaGlzIGFsbG93cyB1cyB0byBjbGVhbmx5IHRpbWVvdXQgb24gYW4gdW5leHBlY3RlZAorCSAqIFRhcmdldCBmYWlsdXJlIHJhdGhlciB0aGFuIHJpc2sgcHJvYmxlbXMgYXQgdGhlIEhJRiBsZXZlbC4KKwkgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBTRElPIHRpbWVvdXRzIGFuZCBwb3NzaWJseSBnYXJiYWdlCisJICogZGF0YSBvbiBzb21lIGhvc3QgY29udHJvbGxlcnMuICBBbmQgb24gYW4gaW50ZXJjb25uZWN0CisJICogc3VjaCBhcyBDb21wYWN0IEZsYXNoIChhcyB3ZWxsIGFzIHNvbWUgU0RJTyBtYXN0ZXJzKSB3aGljaAorCSAqIGRvZXMgbm90IHByb3ZpZGUgYW55IGluZGljYXRpb24gb24gZGF0YSB0aW1lb3V0LCBpdCBhdm9pZHMKKwkgKiBhIHBvdGVudGlhbCBoYW5nIG9yIGdhcmJhZ2UgcmVzcG9uc2UuCisJICoKKwkgKiBTeW5jaHJvbml6YXRpb24gaXMgbW9yZSBkaWZmaWN1bHQgZm9yIHJlYWRzIGxhcmdlciB0aGFuIHRoZQorCSAqIHNpemUgb2YgdGhlIE1CT1ggRklGTyAoMTI4QiksIGJlY2F1c2UgdGhlIFRhcmdldCBpcyB1bmFibGUKKwkgKiB0byBwdXNoIHRoZSAxMjl0aCBieXRlIG9mIGRhdGEgdW50aWwgQUZURVIgdGhlIEhvc3QgcG9zdHMgYW4KKwkgKiBISUYgUmVhZCBhbmQgcmVtb3ZlcyBzb21lIEZJRk8gZGF0YS4gIFNvIGZvciBsYXJnZSByZWFkcyB0aGUKKwkgKiBIb3N0IHByb2NlZWRzIHRvIHBvc3QgYW4gSElGIFJlYWQgQkVGT1JFIGFsbCB0aGUgZGF0YSBpcworCSAqIGFjdHVhbGx5IGF2YWlsYWJsZSB0byByZWFkLiAgRm9ydHVuYXRlbHksIGxhcmdlIEJNSSByZWFkcyBkbworCSAqIG5vdCBvY2N1ciBpbiBwcmFjdGljZSAtLSB0aGV5J3JlIHN1cHBvcnRlZCBmb3IgZGVidWcvZGV2ZWxvcG1lbnQuCisJICoKKwkgKiBTbyBIb3N0L1RhcmdldCBCTUkgc3luY2hyb25pemF0aW9uIGlzIGRpdmlkZWQgaW50byB0aGVzZSBjYXNlczoKKwkgKiAgQ0FTRSAxOiBsZW5ndGggPCA0CisJICogICAgICAgIFNob3VsZCBub3QgaGFwcGVuCisJICoKKwkgKiAgQ0FTRSAyOiA0IDw9IGxlbmd0aCA8PSAxMjgKKwkgKiAgICAgICAgV2FpdCBmb3IgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCisJICogICAgICAgIElmIENPTlNFUlZBVElWRV9CTUlfUkVBRCBpcyBlbmFibGVkLCBhbHNvIHdhaXQgZm9yCisJICogICAgICAgIGEgQk1JIGNvbW1hbmQgY3JlZGl0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgRU5USVJFCisJICogICAgICAgIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgdGhlIEZJRk8KKwkgKgorCSAqICBDQVNFIDM6IGxlbmd0aCA+IDEyOAorCSAqICAgICAgICBXYWl0IGZvciB0aGUgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCisJICoKKwkgKiBGb3IgbW9zdCB1c2VzLCBhIHNtYWxsIHRpbWVvdXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgYW5kIHdlIHdpbGwKKwkgKiB1c3VhbGx5IHNlZSBhIHJlc3BvbnNlIHF1aWNrbHk7IGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB1bnVzdWFsCisJICogKGRlYnVnKSBjYXNlcyBvZiBCTUlfRVhFQ1VURSB3aGVyZSB3ZSB3YW50IGFuIGxhcmdlciB0aW1lb3V0LgorCSAqIEZvciBub3csIHdlIHVzZSBhbiB1bmJvdW5kZWQgYnVzeSBsb29wIHdoaWxlIHdhaXRpbmcgZm9yCisJICogQk1JX0VYRUNVVEUuCisJICoKKwkgKiBJZiBCTUlfRVhFQ1VURSBldmVyIG5lZWRzIHRvIHN1cHBvcnQgbG9uZ2VyLWxhdGVuY3kgZXhlY3V0aW9uLAorCSAqIGVzcGVjaWFsbHkgaW4gcHJvZHVjdGlvbiwgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIGVuaGFuY2VkIHRvIHNsZWVwCisJICogYW5kIHlpZWxkLiAgQWxzbyBub3RlIHRoYXQgQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCBpcyBjdXJyZW50bHkKKwkgKiBhIGZ1bmN0aW9uIG9mIEhvc3QgcHJvY2Vzc29yIHNwZWVkLgorCSAqLworCWlmIChsZW4gPj0gNCkgeyAvKiBOQjogQ3VycmVudGx5LCBhbHdheXMgdHJ1ZSAqLworCQlyZXQgPSBhdGg2a2xfYm1pX2dldF9yeF9sa2FoZChhcik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOworCXJldCA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sCisJCQkJICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisJaWYgKHJldCkgeworCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gcmVhZCB0aGUgYm1pIGRhdGEgZnJvbSB0aGUgZGV2aWNlOiAlZFxuIiwKKwkJCSAgIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX3N0b3Aoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CisJc3RydWN0IGJ1c19yZXF1ZXN0ICpyZXEsICp0bXBfcmVxOworCXZvaWQgKmNvbnRleHQ7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHRoYXQgd3EgaXMgbm90IHF1ZXVlZCBhZ2FpbiAqLworCisJY2FuY2VsX3dvcmtfc3luYygmYXJfc2Rpby0+d3JfYXN5bmNfd29yayk7CisKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wX3JlcSwgJmFyX3NkaW8tPndyX2FzeW5jcSwgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKworCQlpZiAocmVxLT5zY2F0X3JlcSkgeworCQkJLyogdGhpcyBpcyBhIHNjYXR0ZXIgZ2F0aGVyIHJlcXVlc3QgKi8KKwkJCXJlcS0+c2NhdF9yZXEtPnN0YXR1cyA9IC1FQ0FOQ0VMRUQ7CisJCQlyZXEtPnNjYXRfcmVxLT5jb21wbGV0ZShhcl9zZGlvLT5hci0+aHRjX3RhcmdldCwKKwkJCQkJCXJlcS0+c2NhdF9yZXEpOworCQl9IGVsc2UgeworCQkJY29udGV4dCA9IHJlcS0+cGFja2V0OworCQkJYXRoNmtsX3NkaW9fZnJlZV9idXNfcmVxKGFyX3NkaW8sIHJlcSk7CisJCQlhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCAtRUNBTkNFTEVEKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKKworCVdBUk5fT04oZ2V0X3F1ZXVlX2RlcHRoKCZhcl9zZGlvLT5zY2F0X3JlcSkgIT0gNCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgYXRoNmtsX3NkaW9fb3BzID0gewogCS5yZWFkX3dyaXRlX3N5bmMgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMsCiAJLndyaXRlX2FzeW5jID0gYXRoNmtsX3NkaW9fd3JpdGVfYXN5bmMsCkBAIC03NjIsOCArMTE3OSw0NyBAQAogCS5zY2F0X3JlcV9ydyA9IGF0aDZrbF9zZGlvX2FzeW5jX3J3X3NjYXR0ZXIsCiAJLmNsZWFudXBfc2NhdHRlciA9IGF0aDZrbF9zZGlvX2NsZWFudXBfc2NhdHRlciwKIAkuc3VzcGVuZCA9IGF0aDZrbF9zZGlvX3N1c3BlbmQsCisJLnJlc3VtZSA9IGF0aDZrbF9zZGlvX3Jlc3VtZSwKKwkuZGlhZ19yZWFkMzIgPSBhdGg2a2xfc2Rpb19kaWFnX3JlYWQzMiwKKwkuZGlhZ193cml0ZTMyID0gYXRoNmtsX3NkaW9fZGlhZ193cml0ZTMyLAorCS5ibWlfcmVhZCA9IGF0aDZrbF9zZGlvX2JtaV9yZWFkLAorCS5ibWlfd3JpdGUgPSBhdGg2a2xfc2Rpb19ibWlfd3JpdGUsCisJLnBvd2VyX29uID0gYXRoNmtsX3NkaW9fcG93ZXJfb24sCisJLnBvd2VyX29mZiA9IGF0aDZrbF9zZGlvX3Bvd2VyX29mZiwKKwkuc3RvcCA9IGF0aDZrbF9zZGlvX3N0b3AsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKKy8qCisgKiBFbXB0eSBoYW5kbGVycyBzbyB0aGF0IG1tYyBzdWJzeXN0ZW0gZG9lc24ndCByZW1vdmUgdXMgZW50aXJlbHkgZHVyaW5nCisgKiBzdXNwZW5kLiBXZSBpbnN0ZWFkIGZvbGxvdyBjZmc4MDIxMSBzdXNwZW5kL3Jlc3VtZSBoYW5kbGVycy4KKyAqLworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInNkaW8gcG0gc3VzcGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAic2RpbyBwbSByZXN1bWVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhdGg2a2xfc2Rpb19wbV9vcHMsIGF0aDZrbF9zZGlvX3BtX3N1c3BlbmQsCisJCQkgYXRoNmtsX3NkaW9fcG1fcmVzdW1lKTsKKworI2RlZmluZSBBVEg2S0xfU0RJT19QTV9PUFMgKCZhdGg2a2xfc2Rpb19wbV9vcHMpCisKKyNlbHNlCisKKyNkZWZpbmUgQVRINktMX1NESU9fUE1fT1BTIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiBzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCiB7CkBAIC03NzIsOCArMTIyOCw4IEBACiAJc3RydWN0IGF0aDZrbCAqYXI7CiAJaW50IGNvdW50OwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCSAgICJuZXcgZnVuYyAlZCB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBibG9jayAweCV4LzB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJzZGlvIG5ldyBmdW5jICVkIHZlbmRvciAweCV4IGRldmljZSAweCV4IGJsb2NrIDB4JXgvMHgleFxuIiwKIAkJICAgZnVuYy0+bnVtLCBmdW5jLT52ZW5kb3IsIGZ1bmMtPmRldmljZSwKIAkJICAgZnVuYy0+bWF4X2Jsa3NpemUsIGZ1bmMtPmN1cl9ibGtzaXplKTsKIApAQCAtNzk2LDYgKzEyNTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZhcl9zZGlvLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CisJbXV0ZXhfaW5pdCgmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmYXJfc2Rpby0+c2NhdF9yZXEpOwogCUlOSVRfTElTVF9IRUFEKCZhcl9zZGlvLT5idXNfcmVxX2ZyZWVxKTsKQEAgLTgxNCw2MiArMTI3MSwyOSBAQAogCX0KIAogCWFyX3NkaW8tPmFyID0gYXI7CisJYXItPmhpZl90eXBlID0gQVRINktMX0hJRl9UWVBFX1NESU87CiAJYXItPmhpZl9wcml2ID0gYXJfc2RpbzsKIAlhci0+aGlmX29wcyA9ICZhdGg2a2xfc2Rpb19vcHM7CisJYXItPmJtaS5tYXhfZGF0YV9zaXplID0gMjU2OwogCiAJYXRoNmtsX3NkaW9fc2V0X21ib3hfaW5mbyhhcik7CiAKLQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7Ci0KLQlpZiAoKGFyX3NkaW8tPmlkLT5kZXZpY2UgJiBNQU5VRkFDVFVSRVJfSURfQVRINktMX0JBU0VfTUFTSykgPj0KLQkgICAgTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFKSB7Ci0JCS8qIGVuYWJsZSA0LWJpdCBBU1lOQyBpbnRlcnJ1cHQgb24gQVI2MDAzIG9yIGxhdGVyICovCi0JCXJldCA9IGF0aDZrbF9zZGlvX2Z1bmMwX2NtZDUyX3dyX2J5dGUoZnVuYy0+Y2FyZCwKLQkJCQkJCUNDQ1JfU0RJT19JUlFfTU9ERV9SRUcsCi0JCQkJCQlTRElPX0lSUV9NT0RFX0FTWU5DXzRCSVRfSVJRKTsKLQkJaWYgKHJldCkgewotCQkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGVuYWJsZSA0LWJpdCBhc3luYyBpcnEgbW9kZSAlZFxuIiwKLQkJCQkgICByZXQpOwotCQkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0JCQlnb3RvIGVycl9jZmc4MDIxMTsKLQkJfQotCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19TRElPLCAiNC1iaXQgYXN5bmMgaXJxIG1vZGUgZW5hYmxlZFxuIik7Ci0JfQotCi0JLyogZ2l2ZSB1cyBzb21lIHRpbWUgdG8gZW5hYmxlLCBpbiBtcyAqLwotCWZ1bmMtPmVuYWJsZV90aW1lb3V0ID0gMTAwOwotCi0Jc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0KLQlyZXQgPSBhdGg2a2xfc2Rpb19wb3dlcl9vbihhcl9zZGlvKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jZmc4MDIxMTsKLQotCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKLQotCXJldCA9IHNkaW9fc2V0X2Jsb2NrX3NpemUoZnVuYywgSElGX01CT1hfQkxPQ0tfU0laRSk7CisJcmV0ID0gYXRoNmtsX3NkaW9fY29uZmlnKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDZrbF9lcnIoIlNldCBzZGlvIGJsb2NrIHNpemUgJWQgZmFpbGVkOiAlZClcbiIsCi0JCQkgICBISUZfTUJPWF9CTE9DS19TSVpFLCByZXQpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKLQkJZ290byBlcnJfb2ZmOworCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gY29uZmlnIHNkaW86ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jb3JlX2FsbG9jOwogCX0KIAotCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCiAJcmV0ID0gYXRoNmtsX2NvcmVfaW5pdChhcik7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gaW5pdCBhdGg2a2wgY29yZVxuIik7Ci0JCWdvdG8gZXJyX29mZjsKKwkJZ290byBlcnJfY29yZV9hbGxvYzsKIAl9CiAKIAlyZXR1cm4gcmV0OwogCi1lcnJfb2ZmOgotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKLWVycl9jZmc4MDIxMToKLQlhdGg2a2xfY2ZnODAyMTFfZGVpbml0KGFyX3NkaW8tPmFyKTsKK2Vycl9jb3JlX2FsbG9jOgorCWF0aDZrbF9jb3JlX2ZyZWUoYXJfc2Rpby0+YXIpOwogZXJyX2RtYToKIAlrZnJlZShhcl9zZGlvLT5kbWFfYnVmZmVyKTsKIGVycl9oaWY6CkBAIC04ODIsOCArMTMwNiw4IEBACiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCSAgICJyZW1vdmVkIGZ1bmMgJWQgdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJzZGlvIHJlbW92ZWQgZnVuYyAlZCB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleFxuIiwKIAkJICAgZnVuYy0+bnVtLCBmdW5jLT52ZW5kb3IsIGZ1bmMtPmRldmljZSk7CiAKIAlhcl9zZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKQEAgLTg5MSw5ICsxMzE1LDcgQEAKIAlhdGg2a2xfc3RvcF90eHJ4KGFyX3NkaW8tPmFyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKIAotCWF0aDZrbF91bmF2YWlsX2V2KGFyX3NkaW8tPmFyKTsKLQotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKKwlhdGg2a2xfY29yZV9jbGVhbnVwKGFyX3NkaW8tPmFyKTsKIAogCWtmcmVlKGFyX3NkaW8tPmRtYV9idWZmZXIpOwogCWtmcmVlKGFyX3NkaW8pOwpAQCAtOTAyLDYgKzEzMjQsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBhdGg2a2xfc2Rpb19kZXZpY2VzW10gPSB7CiAJe1NESU9fREVWSUNFKE1BTlVGQUNUVVJFUl9DT0RFLCAoTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFIHwgMHgwKSl9LAogCXtTRElPX0RFVklDRShNQU5VRkFDVFVSRVJfQ09ERSwgKE1BTlVGQUNUVVJFUl9JRF9BUjYwMDNfQkFTRSB8IDB4MSkpfSwKKwl7U0RJT19ERVZJQ0UoTUFOVUZBQ1RVUkVSX0NPREUsIChNQU5VRkFDVFVSRVJfSURfQVI2MDA0X0JBU0UgfCAweDApKX0sCisJe1NESU9fREVWSUNFKE1BTlVGQUNUVVJFUl9DT0RFLCAoTUFOVUZBQ1RVUkVSX0lEX0FSNjAwNF9CQVNFIHwgMHgxKSl9LAogCXt9LAogfTsKIApAQCAtOTEyLDYgKzEzMzYsNyBAQAogCS5pZF90YWJsZSA9IGF0aDZrbF9zZGlvX2RldmljZXMsCiAJLnByb2JlID0gYXRoNmtsX3NkaW9fcHJvYmUsCiAJLnJlbW92ZSA9IGF0aDZrbF9zZGlvX3JlbW92ZSwKKwkuZHJ2LnBtID0gQVRINktMX1NESU9fUE1fT1BTLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXRoNmtsX3NkaW9faW5pdCh2b2lkKQpAQCAtOTM3LDEzICsxMzYyLDE5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBzdXBwb3J0IGZvciBBdGhlcm9zIEFSNjAweCBTRElPIGRldmljZXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIAotTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19SRVYyX09UUF9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWMl9GSVJNV0FSRV9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWMl9QQVRDSF9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWMl9CT0FSRF9EQVRBX0ZJTEUpOwotTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19SRVYyX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWM19PVFBfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjNfRklSTVdBUkVfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjNfUEFUQ0hfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjNfQk9BUkRfREFUQV9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWM19ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMF9PVFBfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMF9GSVJNV0FSRV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8wX1BBVENIX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzBfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8xXzFfT1RQX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzFfMV9GSVJNV0FSRV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8xXzFfUEFUQ0hfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMV8xX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwNF9IV18xXzBfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8xX0ZJUk1XQVJFX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwNF9IV18xXzFfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdGFyZ2V0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oCmluZGV4IGM5YTc2MDUuLjEwOGE3MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdGFyZ2V0LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90YXJnZXQuaApAQCAtMjAsNyArMjAsNyBAQAogI2RlZmluZSBBUjYwMDNfQk9BUkRfREFUQV9TWgkJMTAyNAogI2RlZmluZSBBUjYwMDNfQk9BUkRfRVhUX0RBVEFfU1oJNzY4CiAKLSNkZWZpbmUgQVI2MDA0X0JPQVJEX0RBVEFfU1ogICAgIDcxNjgKKyNkZWZpbmUgQVI2MDA0X0JPQVJEX0RBVEFfU1ogICAgIDYxNDQKICNkZWZpbmUgQVI2MDA0X0JPQVJEX0VYVF9EQVRBX1NaIDAKIAogI2RlZmluZSBSRVNFVF9DT05UUk9MX0FERFJFU1MJCTB4MDAwMDAwMDAKQEAgLTMyMCw3ICszMjAsMTAgQEAKIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpCiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogKi8KKyNkZWZpbmUgSElfT1BUSU9OX0ZXX01PREVfQklUUwkgICAgICAgMHgyCiAjZGVmaW5lIEhJX09QVElPTl9GV19NT0RFX1NISUZUICAgICAgICAweEMKKworI2RlZmluZSBISV9PUFRJT05fRldfU1VCTU9ERV9CSVRTICAgICAgMHgyCiAjZGVmaW5lIEhJX09QVElPTl9GV19TVUJNT0RFX1NISUZUICAgICAweDE0CiAKIC8qIENvbnZlcnQgYSBUYXJnZXQgdmlydHVhbCBhZGRyZXNzIGludG8gYSBUYXJnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLwpAQCAtMzMxLDIwICszMzQsNiBAQAogCSgoKHRhcmdldF90eXBlKSA9PSBUQVJHRVRfVFlQRV9BUjYwMDMpID8gQVI2MDAzX1ZUT1AodmFkZHIpIDogXAogCSgoKHRhcmdldF90eXBlKSA9PSBUQVJHRVRfVFlQRV9BUjYwMDQpID8gQVI2MDA0X1ZUT1AodmFkZHIpIDogMCkpCiAKLSNkZWZpbmUgQVI2MDAzX1JFVjJfQVBQX0xPQURfQUREUkVTUyAgICAgICAgICAgIDB4NTQzMTgwCi0jZGVmaW5lIEFSNjAwM19SRVYyX0JPQVJEX0VYVF9EQVRBX0FERFJFU1MgICAgICAweDU3RTUwMAotI2RlZmluZSBBUjYwMDNfUkVWMl9EQVRBU0VUX1BBVENIX0FERFJFU1MgICAgICAgMHg1N2U4ODQKLSNkZWZpbmUgQVI2MDAzX1JFVjJfUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICAgIDY5MTIKLQotI2RlZmluZSBBUjYwMDNfUkVWM19BUFBfTE9BRF9BRERSRVNTICAgICAgICAgICAgMHg1NDUwMDAKLSNkZWZpbmUgQVI2MDAzX1JFVjNfQk9BUkRfRVhUX0RBVEFfQUREUkVTUyAgICAgIDB4NTQyMzMwCi0jZGVmaW5lIEFSNjAwM19SRVYzX0RBVEFTRVRfUEFUQ0hfQUREUkVTUyAgICAgICAweDU3RkY3NAotI2RlZmluZSBBUjYwMDNfUkVWM19SQU1fUkVTRVJWRV9TSVpFICAgICAgICAgICAgNTEyCi0KLSNkZWZpbmUgQVI2MDA0X1JFVjFfQk9BUkRfREFUQV9BRERSRVNTICAgICAgICAgIDB4NDM1NDAwCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0JPQVJEX0VYVF9EQVRBX0FERFJFU1MgICAgICAweDQzNzAwMAotI2RlZmluZSBBUjYwMDRfUkVWMV9SQU1fUkVTRVJWRV9TSVpFICAgICAgICAgICAgMTEyNjQKLQogI2RlZmluZSBBVEg2S0xfRldMT0dfUEFZTE9BRF9TSVpFCQkxNTAwCiAKIHN0cnVjdCBhdGg2a2xfZGJnbG9nX2J1ZiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCmluZGV4IGE3MTE3MDcuLjUwNmEzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdHhyeC5jCkBAIC03NywxMiArNzcsMTMgQEAKIAlyZXR1cm4gYXItPm5vZGVfbWFwW2VwX21hcF0uZXBfaWQ7CiB9CiAKLXN0YXRpYyBib29sIGF0aDZrbF9wb3dlcnNhdmVfYXAoc3RydWN0IGF0aDZrbCAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgYm9vbCBhdGg2a2xfcG93ZXJzYXZlX2FwKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJYm9vbCAqbW9yZV9kYXRhKQogewogCXN0cnVjdCBldGhoZHIgKmRhdGFwID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uID0gTlVMTDsKIAlib29sIHBzX3F1ZXVlZCA9IGZhbHNlLCBpc19wc3FfZW1wdHkgPSBmYWxzZTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGF0YXAtPmhfZGVzdCkpIHsKIAkJdTggY3RyID0gMDsKQEAgLTEwMCw3ICsxMDEsNyBAQAogCQkJICogSWYgdGhpcyB0cmFuc21pdCBpcyBub3QgYmVjYXVzZSBvZiBhIER0aW0gRXhwaXJ5CiAJCQkgKiBxIGl0LgogCQkJICovCi0JCQlpZiAoIXRlc3RfYml0KERUSU1fRVhQSVJFRCwgJmFyLT5mbGFnKSkgeworCQkJaWYgKCF0ZXN0X2JpdChEVElNX0VYUElSRUQsICZ2aWYtPmZsYWdzKSkgewogCQkJCWJvb2wgaXNfbWNhc3RxX2VtcHR5ID0gZmFsc2U7CiAKIAkJCQlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKQEAgLTExNiw2ICsxMTcsNyBAQAogCQkJCSAqLwogCQkJCWlmIChpc19tY2FzdHFfZW1wdHkpCiAJCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwKKwkJCQkJCQkgICAgICAgdmlmLT5md192aWZfaWR4LAogCQkJCQkJCSAgICAgICBNQ0FTVF9BSUQsIDEpOwogCiAJCQkJcHNfcXVldWVkID0gdHJ1ZTsKQEAgLTEzMSw3ICsxMzMsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJY29ubiA9IGF0aDZrbF9maW5kX3N0YShhciwgZGF0YXAtPmhfZGVzdCk7CisJCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEodmlmLCBkYXRhcC0+aF9kZXN0KTsKIAkJaWYgKCFjb25uKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKQEAgLTE1NCw2ICsxNTYsNyBAQAogCQkJCSAqLwogCQkJCWlmIChpc19wc3FfZW1wdHkpCiAJCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwKKwkJCQkJCQkgICAgICAgdmlmLT5md192aWZfaWR4LAogCQkJCQkJCSAgICAgICBjb25uLT5haWQsIDEpOwogCiAJCQkJcHNfcXVldWVkID0gdHJ1ZTsKQEAgLTIzNSw2ICsyMzgsNyBAQAogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqY29va2llID0gTlVMTDsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlaWQgPSBFTkRQT0lOVF9VTlVTRUQ7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIG1hcF9ubyA9IDA7CiAJdTE2IGh0Y190YWcgPSBBVEg2S0xfREFUQV9QS1RfVEFHOwogCXU4IGFjID0gOTkgOyAvKiBpbml0aWFsaXplIHRvIHVubWFwcGVkIGFjICovCkBAIC0yNDYsNyArMjUwLDcgQEAKIAkJICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAogCS8qIElmIHRhcmdldCBpcyBub3QgYXNzb2NpYXRlZCAqLwotCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAwOwogCX0KQEAgLTI1NSwxNSArMjU5LDIxIEBACiAJCWdvdG8gZmFpbF90eDsKIAogCS8qIEFQIG1vZGUgUG93ZXIgc2F2aW5nIHByb2Nlc3NpbmcgKi8KLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewotCQlpZiAoYXRoNmtsX3Bvd2Vyc2F2ZV9hcChhciwgc2tiLCAmbW9yZV9kYXRhKSkKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwkJaWYgKGF0aDZrbF9wb3dlcnNhdmVfYXAodmlmLCBza2IsICZtb3JlX2RhdGEpKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHRlc3RfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpKSB7CiAJCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRldi0+bmVlZGVkX2hlYWRyb29tKSB7Ci0JCQlXQVJOX09OKDEpOwotCQkJZ290byBmYWlsX3R4OworCQkJc3RydWN0IHNrX2J1ZmYgKnRtcF9za2IgPSBza2I7CisKKwkJCXNrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgZGV2LT5uZWVkZWRfaGVhZHJvb20pOworCQkJa2ZyZWVfc2tiKHRtcF9za2IpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJdmlmLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCQkJCXJldHVybiAwOworCQkJfQogCQl9CiAKIAkJaWYgKGF0aDZrbF93bWlfZGl4XzJfZG90Myhhci0+d21pLCBza2IpKSB7CkBAIC0yNzIsMTggKzI4MiwyMCBAQAogCQl9CiAKIAkJaWYgKGF0aDZrbF93bWlfZGF0YV9oZHJfYWRkKGFyLT53bWksIHNrYiwgREFUQV9NU0dUWVBFLAotCQkJCQkgICAgbW9yZV9kYXRhLCAwLCAwLCBOVUxMKSkgeworCQkJCQkgICAgbW9yZV9kYXRhLCAwLCAwLCBOVUxMLAorCQkJCQkgICAgdmlmLT5md192aWZfaWR4KSkgewogCQkJYXRoNmtsX2Vycigid21pX2RhdGFfaGRyX2FkZCBmYWlsZWRcbiIpOwogCQkJZ290byBmYWlsX3R4OwogCQl9CiAKLQkJaWYgKChhci0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKSAmJgotCQkgICAgIGFyLT5pYnNzX3BzX2VuYWJsZSAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpCisJCWlmICgodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmCisJCSAgICAgYXItPmlic3NfcHNfZW5hYmxlICYmIHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQogCQkJY2hrX2FkaG9jX3BzX21hcHBpbmcgPSB0cnVlOwogCQllbHNlIHsKIAkJCS8qIGdldCB0aGUgc3RyZWFtIG1hcHBpbmcgKi8KLQkJCXJldCA9IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oYXItPndtaSwgc2tiLAotCQkJCSAgICAwLCB0ZXN0X2JpdChXTU1fRU5BQkxFRCwgJmFyLT5mbGFnKSwgJmFjKTsKKwkJCXJldCA9IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oYXItPndtaSwKKwkJCQkgICAgdmlmLT5md192aWZfaWR4LCBza2IsCisJCQkJICAgIDAsIHRlc3RfYml0KFdNTV9FTkFCTEVELCAmdmlmLT5mbGFncyksICZhYyk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZmFpbF90eDsKIAkJfQpAQCAtMzU0LDggKzM2Niw4IEBACiBmYWlsX3R4OgogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAotCWFyLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOwotCWFyLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl2aWYtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CisJdmlmLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKIAogCXJldHVybiAwOwogfQpAQCAtNDI2LDcgKzQzOCw5IEBACiAJCQkJCSAgICAgICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gdGFyZ2V0LT5kZXYtPmFyOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZW5kcG9pbnQgPSBwYWNrZXQtPmVuZHBvaW50OworCWVudW0gaHRjX3NlbmRfZnVsbF9hY3Rpb24gYWN0aW9uID0gSFRDX1NFTkRfRlVMTF9LRUVQOwogCiAJaWYgKGVuZHBvaW50ID09IGFyLT5jdHJsX2VwKSB7CiAJCS8qCkBAIC00MzksMTkgKzQ1MywxMSBAQAogCQlzZXRfYml0KFdNSV9DVFJMX0VQX0ZVTEwsICZhci0+ZmxhZyk7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+bG9jayk7CiAJCWF0aDZrbF9lcnIoIndtaSBjdHJsIGVwIGlzIGZ1bGxcbiIpOwotCQlyZXR1cm4gSFRDX1NFTkRfRlVMTF9LRUVQOworCQlyZXR1cm4gYWN0aW9uOwogCX0KIAogCWlmIChwYWNrZXQtPmluZm8udHgudGFnID09IEFUSDZLTF9DT05UUk9MX1BLVF9UQUcpCi0JCXJldHVybiBIVENfU0VORF9GVUxMX0tFRVA7Ci0KLQlpZiAoYXItPm53X3R5cGUgPT0gQURIT0NfTkVUV09SSykKLQkJLyoKLQkJICogSW4gYWRob2MgbW9kZSwgd2UgY2Fubm90IGRpZmZlcmVudGlhdGUgdHJhZmZpYwotCQkgKiBwcmlvcml0aWVzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUsIGhvd2V2ZXIgd2UKLQkJICogc2hvdWxkIHN0b3AgdGhlIG5ldHdvcmsuCi0JCSAqLwotCQlnb3RvIHN0b3BfbmV0X3F1ZXVlczsKKwkJcmV0dXJuIGFjdGlvbjsKIAogCS8qCiAJICogVGhlIGxhc3QgTUFYX0hJX0NPT0tJRV9OVU0gImJhdGNoIiBvZiBjb29raWVzIGFyZSByZXNlcnZlZCBmb3IKQEAgLTQ2NCwyNCArNDcwLDM2IEBACiAJCSAqIEdpdmUgcHJlZmVyZW5jZSB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBzdHJlYW0gYnkKIAkJICogZHJvcHBpbmcgdGhlIHBhY2tldHMgd2hpY2ggb3ZlcmZsb3dlZC4KIAkJICovCi0JCXJldHVybiBIVENfU0VORF9GVUxMX0RST1A7CisJCWFjdGlvbiA9IEhUQ19TRU5EX0ZVTExfRFJPUDsKIAotc3RvcF9uZXRfcXVldWVzOgotCXNwaW5fbG9ja19iaCgmYXItPmxvY2spOwotCXNldF9iaXQoTkVUUV9TVE9QUEVELCAmYXItPmZsYWcpOwotCXNwaW5fdW5sb2NrX2JoKCZhci0+bG9jayk7Ci0JbmV0aWZfc3RvcF9xdWV1ZShhci0+bmV0X2Rldik7CisJLyogRklYTUU6IExvY2tpbmcgKi8KKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodmlmLCAmYXItPnZpZl9saXN0LCBsaXN0KSB7CisJCWlmICh2aWYtPm53X3R5cGUgPT0gQURIT0NfTkVUV09SSyB8fAorCQkgICAgYWN0aW9uICE9IEhUQ19TRU5EX0ZVTExfRFJPUCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOwogCi0JcmV0dXJuIEhUQ19TRU5EX0ZVTExfS0VFUDsKKwkJCXNwaW5fbG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKKwkJCXNldF9iaXQoTkVUUV9TVE9QUEVELCAmdmlmLT5mbGFncyk7CisJCQlzcGluX3VubG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKKwkJCW5ldGlmX3N0b3BfcXVldWUodmlmLT5uZGV2KTsKKworCQkJcmV0dXJuIGFjdGlvbjsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisKKwlyZXR1cm4gYWN0aW9uOwogfQogCiAvKiBUT0RPIHRoaXMgbmVlZHMgdG8gYmUgbG9va2VkIGF0ICovCi1zdGF0aWMgdm9pZCBhdGg2a2xfdHhfY2xlYXJfbm9kZV9tYXAoc3RydWN0IGF0aDZrbCAqYXIsCitzdGF0aWMgdm9pZCBhdGg2a2xfdHhfY2xlYXJfbm9kZV9tYXAoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwKIAkJCQkgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVpZCwgdTMyIG1hcF9ubykKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJdTMyIGk7CiAKLQlpZiAoYXItPm53X3R5cGUgIT0gQURIT0NfTkVUV09SSykKKwlpZiAodmlmLT5ud190eXBlICE9IEFESE9DX05FVFdPUkspCiAJCXJldHVybjsKIAogCWlmICghYXItPmlic3NfcHNfZW5hYmxlKQpAQCAtNTIzLDcgKzU0MSw5IEBACiAJaW50IHN0YXR1czsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlaWQ7CiAJYm9vbCB3YWtlX2V2ZW50ID0gZmFsc2U7Ci0JYm9vbCBmbHVzaGluZyA9IGZhbHNlOworCWJvb2wgZmx1c2hpbmdbQVRINktMX1ZJRl9NQVhdID0ge2ZhbHNlfTsKKwl1OCBpZl9pZHg7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYl9xdWV1ZSk7CiAKQEAgLTU0OSw4ICs1NjksNiBAQAogCQlpZiAoIXNrYiB8fCAhc2tiLT5kYXRhKQogCQkJZ290byBmYXRhbDsKIAotCQlwYWNrZXQtPmJ1ZiA9IHNrYi0+ZGF0YTsKLQogCQlfX3NrYl9xdWV1ZV90YWlsKCZza2JfcXVldWUsIHNrYik7CiAKIAkJaWYgKCFzdGF0dXMgJiYgKHBhY2tldC0+YWN0X2xlbiAhPSBza2ItPmxlbikpCkBAIC01NjksMTUgKzU4NywzMCBAQAogCQkJCXdha2VfZXZlbnQgPSB0cnVlOwogCQl9CiAKKwkJaWYgKGVpZCA9PSBhci0+Y3RybF9lcCkgeworCQkJaWZfaWR4ID0gd21pX2NtZF9oZHJfZ2V0X2lmX2lkeCgKKwkJCQkoc3RydWN0IHdtaV9jbWRfaGRyICopIHBhY2tldC0+YnVmKTsKKwkJfSBlbHNlIHsKKwkJCWlmX2lkeCA9IHdtaV9kYXRhX2hkcl9nZXRfaWZfaWR4KAorCQkJCShzdHJ1Y3Qgd21pX2RhdGFfaGRyICopIHBhY2tldC0+YnVmKTsKKwkJfQorCisJCXZpZiA9IGF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KGFyLCBpZl9pZHgpOworCQlpZiAoIXZpZikgeworCQkJYXRoNmtsX2ZyZWVfY29va2llKGFyLCBhdGg2a2xfY29va2llKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKHN0YXR1cykgewogCQkJaWYgKHN0YXR1cyA9PSAtRUNBTkNFTEVEKQogCQkJCS8qIGEgcGFja2V0IHdhcyBmbHVzaGVkICAqLwotCQkJCWZsdXNoaW5nID0gdHJ1ZTsKKwkJCQlmbHVzaGluZ1tpZl9pZHhdID0gdHJ1ZTsKIAotCQkJYXItPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJCXZpZi0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOwogCi0JCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCi0JCQkJYXRoNmtsX2VycigidHggZXJyb3IsIHN0YXR1czogMHgleFxuIiwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQyAmJiBzdGF0dXMgIT0gLUVDQU5DRUxFRCkKKwkJCQlhdGg2a2xfd2FybigidHggY29tcGxldGUgZXJyb3I6ICVkXG4iLCBzdGF0dXMpOworCiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9UWCwKIAkJCQkgICAiJXM6IHNrYj0weCVwIGRhdGE9MHglcCBsZW49MHgleCBlaWQ9JWQgJXNcbiIsCiAJCQkJICAgX19mdW5jX18sIHNrYiwgcGFja2V0LT5idWYsIHBhY2tldC0+YWN0X2xlbiwKQEAgLTU4OCwyNyArNjIxLDM0IEBACiAJCQkJICAgX19mdW5jX18sIHNrYiwgcGFja2V0LT5idWYsIHBhY2tldC0+YWN0X2xlbiwKIAkJCQkgICBlaWQsICJPSyIpOwogCi0JCQlmbHVzaGluZyA9IGZhbHNlOwotCQkJYXItPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlhci0+bmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJZmx1c2hpbmdbaWZfaWR4XSA9IGZhbHNlOworCQkJdmlmLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJdmlmLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCX0KIAotCQlhdGg2a2xfdHhfY2xlYXJfbm9kZV9tYXAoYXIsIGVpZCwgbWFwX25vKTsKKwkJYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKHZpZiwgZWlkLCBtYXBfbm8pOwogCiAJCWF0aDZrbF9mcmVlX2Nvb2tpZShhciwgYXRoNmtsX2Nvb2tpZSk7CiAKLQkJaWYgKHRlc3RfYml0KE5FVFFfU1RPUFBFRCwgJmFyLT5mbGFnKSkKLQkJCWNsZWFyX2JpdChORVRRX1NUT1BQRUQsICZhci0+ZmxhZyk7CisJCWlmICh0ZXN0X2JpdChORVRRX1NUT1BQRUQsICZ2aWYtPmZsYWdzKSkKKwkJCWNsZWFyX2JpdChORVRRX1NUT1BQRUQsICZ2aWYtPmZsYWdzKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOwogCiAJX19za2JfcXVldWVfcHVyZ2UoJnNrYl9xdWV1ZSk7CiAKLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7Ci0JCWlmICghZmx1c2hpbmcpCi0JCQluZXRpZl93YWtlX3F1ZXVlKGFyLT5uZXRfZGV2KTsKKwkvKiBGSVhNRTogTG9ja2luZyAqLworCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aWYsICZhci0+dmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpICYmCisJCSAgICAhZmx1c2hpbmdbdmlmLT5md192aWZfaWR4XSkgeworCQkJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCQkJbmV0aWZfd2FrZV9xdWV1ZSh2aWYtPm5kZXYpOworCQkJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwkJfQogCX0KKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CiAKIAlpZiAod2FrZV9ldmVudCkKIAkJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKQEAgLTEwNDEsOCArMTA4MSw5IEBACiAJc3RydWN0IGF0aDZrbF9zdGEgKmNvbm4gPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpza2IxID0gTlVMTDsKIAlzdHJ1Y3QgZXRoaGRyICpkYXRhcCA9IE5VTEw7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAl1MTYgc2VxX25vLCBvZmZzZXQ7Ci0JdTggdGlkOworCXU4IHRpZCwgaWZfaWR4OwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fUlgsCiAJCSAgICIlczogYXI9MHglcCBlaWQ9JWQsIHNrYj0weCVwLCBkYXRhPTB4JXAsIGxlbj0weCV4IHN0YXR1czolZCIsCkBAIC0xMDUwLDcgKzEwOTEsMjMgQEAKIAkJICAgcGFja2V0LT5hY3RfbGVuLCBzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyB8fCAhKHNrYi0+ZGF0YSArIEhUQ19IRFJfTEVOR1RIKSkgewotCQlhci0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlza2JfcHV0KHNrYiwgcGFja2V0LT5hY3RfbGVuICsgSFRDX0hEUl9MRU5HVEgpOworCXNrYl9wdWxsKHNrYiwgSFRDX0hEUl9MRU5HVEgpOworCisJaWYgKGVwdCA9PSBhci0+Y3RybF9lcCkgeworCQlpZl9pZHggPQorCQl3bWlfY21kX2hkcl9nZXRfaWZfaWR4KChzdHJ1Y3Qgd21pX2NtZF9oZHIgKikgc2tiLT5kYXRhKTsKKwl9IGVsc2UgeworCQlpZl9pZHggPQorCQl3bWlfZGF0YV9oZHJfZ2V0X2lmX2lkeCgoc3RydWN0IHdtaV9kYXRhX2hkciAqKSBza2ItPmRhdGEpOworCX0KKworCXZpZiA9IGF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KGFyLCBpZl9pZHgpOworCWlmICghdmlmKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEwNTksMjggKzExMTYsMjggQEAKIAkgKiBUYWtlIGxvY2sgdG8gcHJvdGVjdCBidWZmZXIgY291bnRzIGFuZCBhZGFwdGl2ZSBwb3dlciB0aHJvdWdocHV0CiAJICogc3RhdGUuCiAJICovCi0Jc3Bpbl9sb2NrX2JoKCZhci0+bG9jayk7CisJc3Bpbl9sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOwogCi0JYXItPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7Ci0JYXItPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXQtPmFjdF9sZW47CisJdmlmLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCXZpZi0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHBhY2tldC0+YWN0X2xlbjsKIAotCXNwaW5fdW5sb2NrX2JoKCZhci0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnZpZi0+aWZfbG9jayk7CiAKLQlza2JfcHV0KHNrYiwgcGFja2V0LT5hY3RfbGVuICsgSFRDX0hEUl9MRU5HVEgpOwotCXNrYl9wdWxsKHNrYiwgSFRDX0hEUl9MRU5HVEgpOwogCiAJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCBfX2Z1bmNfXywgInJ4ICIsCiAJCQlza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXNrYi0+ZGV2ID0gYXItPm5ldF9kZXY7CisJc2tiLT5kZXYgPSB2aWYtPm5kZXY7CiAKIAlpZiAoIXRlc3RfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpKSB7CiAJCWlmIChFUFBJTkdfQUxJR05NRU5UX1BBRCA+IDApCiAJCQlza2JfcHVsbChza2IsIEVQUElOR19BTElHTk1FTlRfUEFEKTsKLQkJYXRoNmtsX2RlbGl2ZXJfZnJhbWVzX3RvX253X3N0YWNrKGFyLT5uZXRfZGV2LCBza2IpOworCQlhdGg2a2xfZGVsaXZlcl9mcmFtZXNfdG9fbndfc3RhY2sodmlmLT5uZGV2LCBza2IpOwogCQlyZXR1cm47CiAJfQogCisJYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoYXIpOworCiAJaWYgKGVwdCA9PSBhci0+Y3RybF9lcCkgewogCQlhdGg2a2xfd21pX2NvbnRyb2xfcngoYXItPndtaSwgc2tiKTsKIAkJcmV0dXJuOwpAQCAtMTA5NiwxOCArMTE1MywxOCBAQAogCSAqIHRoYXQgZG8gbm90IGhhdmUgTExDIGhkci4gVGhleSBhcmUgMTYgYnl0ZXMgaW4gc2l6ZS4KIAkgKiBBbGxvdyB0aGVzZSBmcmFtZXMgaW4gdGhlIEFQIG1vZGUuCiAJICovCi0JaWYgKGFyLT5ud190eXBlICE9IEFQX05FVFdPUksgJiYKKwlpZiAodmlmLT5ud190eXBlICE9IEFQX05FVFdPUksgJiYKIAkgICAgKChwYWNrZXQtPmFjdF9sZW4gPCBtaW5faGRyX2xlbikgfHwKIAkgICAgIChwYWNrZXQtPmFjdF9sZW4gPiBXTUlfTUFYX0FNU0RVX1JYX0RBVEFfRlJBTUVfTEVOR1RIKSkpIHsKIAkJYXRoNmtsX2luZm8oImZyYW1lIGxlbiBpcyB0b28gc2hvcnQgb3IgdG9vIGxvbmdcbiIpOwotCQlhci0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOwotCQlhci0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJdmlmLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXZpZi0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQogCiAJLyogR2V0IHRoZSBQb3dlciBzYXZlIHN0YXRlIG9mIHRoZSBTVEEgKi8KLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQltZXRhX3R5cGUgPSB3bWlfZGF0YV9oZHJfZ2V0X21ldGEoZGhkcik7CiAKIAkJcHNfc3RhdGUgPSAhISgoZGhkci0+aW5mbyA+PiBXTUlfREFUQV9IRFJfUFNfU0hJRlQpICYKQEAgLTExMjksNyArMTE4Niw3IEBACiAJCX0KIAogCQlkYXRhcCA9IChzdHJ1Y3QgZXRoaGRyICopIChza2ItPmRhdGEgKyBvZmZzZXQpOwotCQljb25uID0gYXRoNmtsX2ZpbmRfc3RhKGFyLCBkYXRhcC0+aF9zb3VyY2UpOworCQljb25uID0gYXRoNmtsX2ZpbmRfc3RhKHZpZiwgZGF0YXAtPmhfc291cmNlKTsKIAogCQlpZiAoIWNvbm4pIHsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTExNjAsMTIgKzEyMTcsMTMgQEAKIAkJCQl3aGlsZSAoKHNrYnVmZiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5wc3EpKQogCQkJCSAgICAgICAhPSBOVUxMKSB7CiAJCQkJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wc3FfbG9jayk7Ci0JCQkJCWF0aDZrbF9kYXRhX3R4KHNrYnVmZiwgYXItPm5ldF9kZXYpOworCQkJCQlhdGg2a2xfZGF0YV90eChza2J1ZmYsIHZpZi0+bmRldik7CiAJCQkJCXNwaW5fbG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwogCQkJCX0KIAkJCQlzcGluX3VubG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwogCQkJCS8qIENsZWFyIHRoZSBQVkIgZm9yIHRoaXMgU1RBICovCi0JCQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCBjb25uLT5haWQsIDApOworCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICAgICAgIGNvbm4tPmFpZCwgMCk7CiAJCQl9CiAJCX0KIApAQCAtMTIxNSwxMiArMTI3MywxMiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCEoYXItPm5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCWlmICghKHZpZi0+bmRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CisJaWYgKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CiAJCWRhdGFwID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOwogCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGF0YXAtPmhfZGVzdCkpCiAJCQkvKgpAQCAtMTIzNSw4ICsxMjkzLDcgQEAKIAkJCSAqIGZyYW1lIHRvIGl0IG9uIHRoZSBhaXIgZWxzZSBzZW5kIHRoZQogCQkJICogZnJhbWUgdXAgdGhlIHN0YWNrLgogCQkJICovCi0JCQlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubiA9IE5VTEw7Ci0JCQljb25uID0gYXRoNmtsX2ZpbmRfc3RhKGFyLCBkYXRhcC0+aF9kZXN0KTsKKwkJCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEodmlmLCBkYXRhcC0+aF9kZXN0KTsKIAogCQkJaWYgKGNvbm4gJiYgYXItPmludHJhX2JzcykgewogCQkJCXNrYjEgPSBza2I7CkBAIC0xMjQ3LDE4ICsxMzA0LDIzIEBACiAJCQl9CiAJCX0KIAkJaWYgKHNrYjEpCi0JCQlhdGg2a2xfZGF0YV90eChza2IxLCBhci0+bmV0X2Rldik7CisJCQlhdGg2a2xfZGF0YV90eChza2IxLCB2aWYtPm5kZXYpOworCisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJLyogbm90aGluZyB0byBkZWxpdmVyIHVwIHRoZSBzdGFjayAqLworCQkJcmV0dXJuOworCQl9CiAJfQogCiAJZGF0YXAgPSAoc3RydWN0IGV0aGhkciAqKSBza2ItPmRhdGE7CiAKIAlpZiAoaXNfdW5pY2FzdF9ldGhlcl9hZGRyKGRhdGFwLT5oX2Rlc3QpICYmCi0JICAgIGFnZ3JfcHJvY2Vzc19yZWN2X2ZybShhci0+YWdncl9jbnR4dCwgdGlkLCBzZXFfbm8sCisJICAgIGFnZ3JfcHJvY2Vzc19yZWN2X2ZybSh2aWYtPmFnZ3JfY250eHQsIHRpZCwgc2VxX25vLAogCQkJCSAgaXNfYW1zZHUsIHNrYikpCiAJCS8qIGFnZ3JlZ2F0aW9uIGNvZGUgd2lsbCBoYW5kbGUgdGhlIHNrYiAqLwogCQlyZXR1cm47CiAKLQlhdGg2a2xfZGVsaXZlcl9mcmFtZXNfdG9fbndfc3RhY2soYXItPm5ldF9kZXYsIHNrYik7CisJYXRoNmtsX2RlbGl2ZXJfZnJhbWVzX3RvX253X3N0YWNrKHZpZi0+bmRldiwgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgYWdncl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtMTMzNiw5ICsxMzk4LDEwIEBACiAJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHJ4dGlkX3N0YXRzKSk7CiB9CiAKLXZvaWQgYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpZCwgdTE2IHNlcV9ubywgdTggd2luX3N6KQordm9pZCBhZ2dyX3JlY3ZfYWRkYmFfcmVxX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCB0aWQsIHUxNiBzZXFfbm8sCisJCQkgICAgIHU4IHdpbl9zeikKIHsKLQlzdHJ1Y3QgYWdncl9pbmZvICpwX2FnZ3IgPSBhci0+YWdncl9jbnR4dDsKKwlzdHJ1Y3QgYWdncl9pbmZvICpwX2FnZ3IgPSB2aWYtPmFnZ3JfY250eHQ7CiAJc3RydWN0IHJ4dGlkICpyeHRpZDsKIAlzdHJ1Y3Qgcnh0aWRfc3RhdHMgKnN0YXRzOwogCXUxNiBob2xkX3Ffc2l6ZTsKQEAgLTE0MDUsOSArMTQ2OCw5IEBACiAJcmV0dXJuIHBfYWdncjsKIH0KIAotdm9pZCBhZ2dyX3JlY3ZfZGVsYmFfcmVxX2V2dChzdHJ1Y3QgYXRoNmtsICphciwgdTggdGlkKQordm9pZCBhZ2dyX3JlY3ZfZGVsYmFfcmVxX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCB0aWQpCiB7Ci0Jc3RydWN0IGFnZ3JfaW5mbyAqcF9hZ2dyID0gYXItPmFnZ3JfY250eHQ7CisJc3RydWN0IGFnZ3JfaW5mbyAqcF9hZ2dyID0gdmlmLT5hZ2dyX2NudHh0OwogCXN0cnVjdCByeHRpZCAqcnh0aWQ7CiAKIAlpZiAoIXBfYWdncikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2YzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3VzYi5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJjb3JlLmgiCisKKy8qIHVzYiBkZXZpY2Ugb2JqZWN0ICovCitzdHJ1Y3QgYXRoNmtsX3VzYiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwl1OCAqZGlhZ19jbWRfYnVmZmVyOworCXU4ICpkaWFnX3Jlc3BfYnVmZmVyOworCXN0cnVjdCBhdGg2a2wgKmFyOworfTsKKworLyogZGlhZ25vc3RpYyBjb21tYW5kIGRlZm5pdGlvbnMgKi8KKyNkZWZpbmUgQVRINktMX1VTQl9DT05UUk9MX1JFUV9TRU5EX0JNSV9DTUQgICAgICAgIDEKKyNkZWZpbmUgQVRINktMX1VTQl9DT05UUk9MX1JFUV9SRUNWX0JNSV9SRVNQICAgICAgIDIKKyNkZWZpbmUgQVRINktMX1VTQl9DT05UUk9MX1JFUV9ESUFHX0NNRCAgICAgICAgICAgIDMKKyNkZWZpbmUgQVRINktMX1VTQl9DT05UUk9MX1JFUV9ESUFHX1JFU1AgICAgICAgICAgIDQKKworI2RlZmluZSBBVEg2S0xfVVNCX0NUUkxfRElBR19DQ19SRUFEICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVEg2S0xfVVNCX0NUUkxfRElBR19DQ19XUklURSAgICAgICAgICAgICAgMQorCitzdHJ1Y3QgYXRoNmtsX3VzYl9jdHJsX2RpYWdfY21kX3dyaXRlIHsKKwlfX2xlMzIgY21kOworCV9fbGUzMiBhZGRyZXNzOworCV9fbGUzMiB2YWx1ZTsKKwlfX2xlMzIgX3BhZFsxXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19jbWRfcmVhZCB7CisJX19sZTMyIGNtZDsKKwlfX2xlMzIgYWRkcmVzczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19yZXNwX3JlYWQgeworCV9fbGUzMiB2YWx1ZTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQVRINktMX1VTQl9NQVhfRElBR19DTUQgKHNpemVvZihzdHJ1Y3QgYXRoNmtsX3VzYl9jdHJsX2RpYWdfY21kX3dyaXRlKSkKKyNkZWZpbmUgQVRINktMX1VTQl9NQVhfRElBR19SRVNQIChzaXplb2Yoc3RydWN0IGF0aDZrbF91c2JfY3RybF9kaWFnX3Jlc3BfcmVhZCkpCisKK3N0YXRpYyB2b2lkIGF0aDZrbF91c2JfZGVzdHJveShzdHJ1Y3QgYXRoNmtsX3VzYiAqYXJfdXNiKQoreworCXVzYl9zZXRfaW50ZmRhdGEoYXJfdXNiLT5pbnRlcmZhY2UsIE5VTEwpOworCisJa2ZyZWUoYXJfdXNiLT5kaWFnX2NtZF9idWZmZXIpOworCWtmcmVlKGFyX3VzYi0+ZGlhZ19yZXNwX2J1ZmZlcik7CisKKwlrZnJlZShhcl91c2IpOworfQorCitzdGF0aWMgc3RydWN0IGF0aDZrbF91c2IgKmF0aDZrbF91c2JfY3JlYXRlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGF0aDZrbF91c2IgKmFyX3VzYiA9IE5VTEw7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWFyX3VzYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGg2a2xfdXNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFyX3VzYiA9PSBOVUxMKQorCQlnb3RvIGZhaWxfYXRoNmtsX3VzYl9jcmVhdGU7CisKKwltZW1zZXQoYXJfdXNiLCAwLCBzaXplb2Yoc3RydWN0IGF0aDZrbF91c2IpKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgYXJfdXNiKTsKKwlhcl91c2ItPnVkZXYgPSBkZXY7CisJYXJfdXNiLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisKKwlhcl91c2ItPmRpYWdfY21kX2J1ZmZlciA9IGt6YWxsb2MoQVRINktMX1VTQl9NQVhfRElBR19DTUQsIEdGUF9LRVJORUwpOworCWlmIChhcl91c2ItPmRpYWdfY21kX2J1ZmZlciA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hdGg2a2xfdXNiX2NyZWF0ZTsKKwl9CisKKwlhcl91c2ItPmRpYWdfcmVzcF9idWZmZXIgPSBremFsbG9jKEFUSDZLTF9VU0JfTUFYX0RJQUdfUkVTUCwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKGFyX3VzYi0+ZGlhZ19yZXNwX2J1ZmZlciA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hdGg2a2xfdXNiX2NyZWF0ZTsKKwl9CisKK2ZhaWxfYXRoNmtsX3VzYl9jcmVhdGU6CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWF0aDZrbF91c2JfZGVzdHJveShhcl91c2IpOworCQlhcl91c2IgPSBOVUxMOworCX0KKwlyZXR1cm4gYXJfdXNiOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfdXNiX2RldmljZV9kZXRhY2hlZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBhdGg2a2xfdXNiICphcl91c2I7CisKKwlhcl91c2IgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaWYgKGFyX3VzYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlhdGg2a2xfc3RvcF90eHJ4KGFyX3VzYi0+YXIpOworCisJYXRoNmtsX2NvcmVfY2xlYW51cChhcl91c2ItPmFyKTsKKworCWF0aDZrbF91c2JfZGVzdHJveShhcl91c2IpOworfQorCitzdGF0aWMgaW50IGF0aDZrbF91c2Jfc3VibWl0X2N0cmxfb3V0KHN0cnVjdCBhdGg2a2xfdXNiICphcl91c2IsCisJCQkJICAgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdm9pZCAqZGF0YSwKKwkJCQkgICB1MzIgc2l6ZSkKK3sKKwl1OCAqYnVmID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKHNpemUgPiAwKSB7CisJCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbWNweShidWYsIGRhdGEsIHNpemUpOworCX0KKworCS8qIG5vdGU6IGlmIHN1Y2Nlc3NmdWwgcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhhcl91c2ItPnVkZXYsCisJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoYXJfdXNiLT51ZGV2LCAwKSwKKwkJCSAgICAgIHJlcSwKKwkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCSAgICAgIFVTQl9SRUNJUF9ERVZJQ0UsIHZhbHVlLCBpbmRleCwgYnVmLAorCQkJICAgICAgc2l6ZSwgMTAwMCk7CisKKwlpZiAocmV0IDwgMCkgeworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVVNCLCAiJXMgZmFpbGVkLHJlc3VsdCA9ICVkXG4iLAorCQkJICAgX19mdW5jX18sIHJldCk7CisJfQorCisJa2ZyZWUoYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF91c2Jfc3VibWl0X2N0cmxfaW4oc3RydWN0IGF0aDZrbF91c2IgKmFyX3VzYiwKKwkJCQkgIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHZvaWQgKmRhdGEsCisJCQkJICB1MzIgc2l6ZSkKK3sKKwl1OCAqYnVmID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKHNpemUgPiAwKSB7CisJCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIG5vdGU6IGlmIHN1Y2Nlc3NmdWwgcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhhcl91c2ItPnVkZXYsCisJCQkJIHVzYl9yY3ZjdHJscGlwZShhcl91c2ItPnVkZXYsIDApLAorCQkJCSByZXEsCisJCQkJIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCSBVU0JfUkVDSVBfREVWSUNFLCB2YWx1ZSwgaW5kZXgsIGJ1ZiwKKwkJCQkgc2l6ZSwgMiAqIEhaKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19VU0IsICIlcyBmYWlsZWQscmVzdWx0ID0gJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwltZW1jcHkoKHU4ICopIGRhdGEsIGJ1Ziwgc2l6ZSk7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3VzYl9jdHJsX21zZ19leGNoYW5nZShzdHJ1Y3QgYXRoNmtsX3VzYiAqYXJfdXNiLAorCQkJCSAgICAgdTggcmVxX3ZhbCwgdTggKnJlcV9idWYsIHUzMiByZXFfbGVuLAorCQkJCSAgICAgdTggcmVzcF92YWwsIHU4ICpyZXNwX2J1ZiwgdTMyICpyZXNwX2xlbikKK3sKKwlpbnQgcmV0OworCisJLyogc2VuZCBjb21tYW5kICovCisJcmV0ID0gYXRoNmtsX3VzYl9zdWJtaXRfY3RybF9vdXQoYXJfdXNiLCByZXFfdmFsLCAwLCAwLAorCQkJCQkgcmVxX2J1ZiwgcmVxX2xlbik7CisKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmVzcF9idWYgPT0gTlVMTCkgeworCQkvKiBubyBleHBlY3RlZCByZXNwb25zZSAqLworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGdldCByZXNwb25zZSAqLworCXJldCA9IGF0aDZrbF91c2Jfc3VibWl0X2N0cmxfaW4oYXJfdXNiLCByZXNwX3ZhbCwgMCwgMCwKKwkJCQkJcmVzcF9idWYsICpyZXNwX2xlbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF91c2JfZGlhZ19yZWFkMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCB1MzIgKmRhdGEpCit7CisJc3RydWN0IGF0aDZrbF91c2IgKmFyX3VzYiA9IGFyLT5oaWZfcHJpdjsKKwlzdHJ1Y3QgYXRoNmtsX3VzYl9jdHJsX2RpYWdfcmVzcF9yZWFkICpyZXNwOworCXN0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19jbWRfcmVhZCAqY21kOworCXUzMiByZXNwX2xlbjsKKwlpbnQgcmV0OworCisJY21kID0gKHN0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19jbWRfcmVhZCAqKSBhcl91c2ItPmRpYWdfY21kX2J1ZmZlcjsKKworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5jbWQgPSBBVEg2S0xfVVNCX0NUUkxfRElBR19DQ19SRUFEOworCWNtZC0+YWRkcmVzcyA9IGNwdV90b19sZTMyKGFkZHJlc3MpOworCXJlc3BfbGVuID0gc2l6ZW9mKCpyZXNwKTsKKworCXJldCA9IGF0aDZrbF91c2JfY3RybF9tc2dfZXhjaGFuZ2UoYXJfdXNiLAorCQkJCUFUSDZLTF9VU0JfQ09OVFJPTF9SRVFfRElBR19DTUQsCisJCQkJKHU4ICopIGNtZCwKKwkJCQlzaXplb2Yoc3RydWN0IGF0aDZrbF91c2JfY3RybF9kaWFnX2NtZF93cml0ZSksCisJCQkJQVRINktMX1VTQl9DT05UUk9MX1JFUV9ESUFHX1JFU1AsCisJCQkJYXJfdXNiLT5kaWFnX3Jlc3BfYnVmZmVyLCAmcmVzcF9sZW4pOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlc3AgPSAoc3RydWN0IGF0aDZrbF91c2JfY3RybF9kaWFnX3Jlc3BfcmVhZCAqKQorCQlhcl91c2ItPmRpYWdfcmVzcF9idWZmZXI7CisKKwkqZGF0YSA9IGxlMzJfdG9fY3B1KHJlc3AtPnZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3VzYl9kaWFnX3dyaXRlMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCBfX2xlMzIgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRoNmtsX3VzYiAqYXJfdXNiID0gYXItPmhpZl9wcml2OworCXN0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19jbWRfd3JpdGUgKmNtZDsKKworCWNtZCA9IChzdHJ1Y3QgYXRoNmtsX3VzYl9jdHJsX2RpYWdfY21kX3dyaXRlICopIGFyX3VzYi0+ZGlhZ19jbWRfYnVmZmVyOworCisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfdXNiX2N0cmxfZGlhZ19jbWRfd3JpdGUpKTsKKwljbWQtPmNtZCA9IGNwdV90b19sZTMyKEFUSDZLTF9VU0JfQ1RSTF9ESUFHX0NDX1dSSVRFKTsKKwljbWQtPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihhZGRyZXNzKTsKKwljbWQtPnZhbHVlID0gZGF0YTsKKworCXJldHVybiBhdGg2a2xfdXNiX2N0cmxfbXNnX2V4Y2hhbmdlKGFyX3VzYiwKKwkJCQkJICAgIEFUSDZLTF9VU0JfQ09OVFJPTF9SRVFfRElBR19DTUQsCisJCQkJCSAgICAodTggKikgY21kLAorCQkJCQkgICAgc2l6ZW9mKCpjbWQpLAorCQkJCQkgICAgMCwgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBhdGg2a2xfdXNiX2JtaV9yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCXN0cnVjdCBhdGg2a2xfdXNiICphcl91c2IgPSBhci0+aGlmX3ByaXY7CisJaW50IHJldDsKKworCS8qIGdldCByZXNwb25zZSAqLworCXJldCA9IGF0aDZrbF91c2Jfc3VibWl0X2N0cmxfaW4oYXJfdXNiLAorCQkJCQlBVEg2S0xfVVNCX0NPTlRST0xfUkVRX1JFQ1ZfQk1JX1JFU1AsCisJCQkJCTAsIDAsIGJ1ZiwgbGVuKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlYWQgdGhlIGJtaSBkYXRhIGZyb20gdGhlIGRldmljZTogJWRcbiIsCisJCQkgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF91c2JfYm1pX3dyaXRlKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCXN0cnVjdCBhdGg2a2xfdXNiICphcl91c2IgPSBhci0+aGlmX3ByaXY7CisJaW50IHJldDsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCXJldCA9IGF0aDZrbF91c2Jfc3VibWl0X2N0cmxfb3V0KGFyX3VzYiwKKwkJCQkJIEFUSDZLTF9VU0JfQ09OVFJPTF9SRVFfU0VORF9CTUlfQ01ELAorCQkJCQkgMCwgMCwgYnVmLCBsZW4pOworCWlmIChyZXQgIT0gMCkgeworCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2VuZCB0aGUgYm1pIGRhdGEgdG8gdGhlIGRldmljZTogJWRcbiIsCisJCQkgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF91c2JfcG93ZXJfb24oc3RydWN0IGF0aDZrbCAqYXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3VzYl9wb3dlcl9vZmYoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgYXRoNmtsX3VzYl9vcHMgPSB7CisJLmRpYWdfcmVhZDMyID0gYXRoNmtsX3VzYl9kaWFnX3JlYWQzMiwKKwkuZGlhZ193cml0ZTMyID0gYXRoNmtsX3VzYl9kaWFnX3dyaXRlMzIsCisJLmJtaV9yZWFkID0gYXRoNmtsX3VzYl9ibWlfcmVhZCwKKwkuYm1pX3dyaXRlID0gYXRoNmtsX3VzYl9ibWlfd3JpdGUsCisJLnBvd2VyX29uID0gYXRoNmtsX3VzYl9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmID0gYXRoNmtsX3VzYl9wb3dlcl9vZmYsCit9OworCisvKiBhdGg2a2wgdXNiIGRyaXZlciByZWdpc3RlcmVkIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBhdGg2a2xfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJc3RydWN0IGF0aDZrbCAqYXI7CisJc3RydWN0IGF0aDZrbF91c2IgKmFyX3VzYiA9IE5VTEw7CisJaW50IHZlbmRvcl9pZCwgcHJvZHVjdF9pZDsKKwlpbnQgcmV0ID0gMDsKKworCXVzYl9nZXRfZGV2KGRldik7CisKKwl2ZW5kb3JfaWQgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCXByb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19VU0IsICJ2ZW5kb3JfaWQgPSAlMDR4XG4iLCB2ZW5kb3JfaWQpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19VU0IsICJwcm9kdWN0X2lkID0gJTA0eFxuIiwgcHJvZHVjdF9pZCk7CisKKwlpZiAoaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZykKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1VTQiwgIlVTQiBJbnRlcmZhY2UgJWRcbiIsCisJCQkgICBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisKKwlpZiAoZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1VTQiwgIlVTQiAyLjAgSG9zdFxuIik7CisJZWxzZQorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVVNCLCAiVVNCIDEuMSBIb3N0XG4iKTsKKworCWFyX3VzYiA9IGF0aDZrbF91c2JfY3JlYXRlKGludGVyZmFjZSk7CisKKwlpZiAoYXJfdXNiID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdXNiX3B1dDsKKwl9CisKKwlhciA9IGF0aDZrbF9jb3JlX2FsbG9jKCZhcl91c2ItPnVkZXYtPmRldik7CisJaWYgKGFyID09IE5VTEwpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGFsbG9jIGF0aDZrbCBjb3JlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdXNiX2Rlc3Ryb3k7CisJfQorCisJYXItPmhpZl9wcml2ID0gYXJfdXNiOworCWFyLT5oaWZfdHlwZSA9IEFUSDZLTF9ISUZfVFlQRV9VU0I7CisJYXItPmhpZl9vcHMgPSAmYXRoNmtsX3VzYl9vcHM7CisJYXItPm1ib3hfaW5mby5ibG9ja19zaXplID0gMTY7CisJYXItPmJtaS5tYXhfZGF0YV9zaXplID0gMjUyOworCisJYXJfdXNiLT5hciA9IGFyOworCisJcmV0ID0gYXRoNmtsX2NvcmVfaW5pdChhcik7CisJaWYgKHJldCkgeworCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gaW5pdCBhdGg2a2wgY29yZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2NvcmVfZnJlZTsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJfY29yZV9mcmVlOgorCWF0aDZrbF9jb3JlX2ZyZWUoYXIpOworZXJyX3VzYl9kZXN0cm95OgorCWF0aDZrbF91c2JfZGVzdHJveShhcl91c2IpOworZXJyX3VzYl9wdXQ6CisJdXNiX3B1dF9kZXYoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDZrbF91c2JfcmVtb3ZlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKwlhdGg2a2xfdXNiX2RldmljZV9kZXRhY2hlZChpbnRlcmZhY2UpOworfQorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRoNmtsX3VzYl9pZHNbXSA9IHsKKwl7VVNCX0RFVklDRSgweDBjZjMsIDB4OTM3NCl9LAorCXsgLyogVGVybWluYXRpbmcgZW50cnkgKi8gfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhdGg2a2xfdXNiX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhdGg2a2xfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJhdGg2a2xfdXNiIiwKKwkucHJvYmUgPSBhdGg2a2xfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gYXRoNmtsX3VzYl9yZW1vdmUsCisJLmlkX3RhYmxlID0gYXRoNmtsX3VzYl9pZHMsCit9OworCitzdGF0aWMgaW50IGF0aDZrbF91c2JfaW5pdCh2b2lkKQoreworCXVzYl9yZWdpc3RlcigmYXRoNmtsX3VzYl9kcml2ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfdXNiX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmYXRoNmtsX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdGg2a2xfdXNiX2luaXQpOworbW9kdWxlX2V4aXQoYXRoNmtsX3VzYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgc3VwcG9ydCBmb3IgQXRoZXJvcyBBUjYwMHggVVNCIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwNF9IV18xXzBfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8xX0ZJUk1XQVJFX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwNF9IV18xXzFfQk9BUkRfREFUQV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCmluZGV4IGE3ZGUyM2MuLmY2ZjJhYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgIi4uL3JlZ2QuaCIKICNpbmNsdWRlICIuLi9yZWdkX2NvbW1vbi5oIgogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc3luY19wb2ludChzdHJ1Y3Qgd21pICp3bWkpOworc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpOwogCiBzdGF0aWMgY29uc3QgczMyIHdtaV9yYXRlX3RibFtdWzJdID0gewogCS8qIHtXL08gU0dJLCB3aXRoIFNHSX0gKi8KQEAgLTgxLDYgKzgxLDI2IEBACiAJcmV0dXJuIHdtaS0+ZXBfaWQ7CiB9CiAKK3N0cnVjdCBhdGg2a2xfdmlmICphdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleChzdHJ1Y3QgYXRoNmtsICphciwgdTggaWZfaWR4KQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYsICpmb3VuZCA9IE5VTEw7CisKKwlpZiAoV0FSTl9PTihpZl9pZHggPiAoYXItPnZpZl9tYXggLSAxKSkpCisJCXJldHVybiBOVUxMOworCisJLyogRklYTUU6IExvY2tpbmcgKi8KKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodmlmLCAmYXItPnZpZl9saXN0LCBsaXN0KSB7CisJCWlmICh2aWYtPmZ3X3ZpZl9pZHggPT0gaWZfaWR4KSB7CisJCQlmb3VuZCA9IHZpZjsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKworCXJldHVybiBmb3VuZDsKK30KKwogLyogIFBlcmZvcm1zIERJWCB0byA4MDIuMyBlbmNhcHN1bGF0aW9uIGZvciB0cmFuc21pdCBwYWNrZXRzLgogICogIEFzc3VtZXMgdGhlIGVudGlyZSBESVggaGVhZGVyIGlzIGNvbnRpZ291cyBhbmQgdGhhdCB0aGVyZSBpcwogICogIGVub3VnaCByb29tIGluIHRoZSBidWZmZXIgZm9yIGEgODAyLjMgbWFjIGhlYWRlciBhbmQgTExDK1NOQVAgaGVhZGVycy4KQEAgLTE2MiwxMiArMTgyLDEyIEBACiBpbnQgYXRoNmtsX3dtaV9kYXRhX2hkcl9hZGQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHU4IG1zZ190eXBlLCBib29sIG1vcmVfZGF0YSwKIAkJCSAgICBlbnVtIHdtaV9kYXRhX2hkcl9kYXRhX3R5cGUgZGF0YV90eXBlLAotCQkJICAgIHU4IG1ldGFfdmVyLCB2b2lkICp0eF9tZXRhX2luZm8pCisJCQkgICAgdTggbWV0YV92ZXIsIHZvaWQgKnR4X21ldGFfaW5mbywgdTggaWZfaWR4KQogewogCXN0cnVjdCB3bWlfZGF0YV9oZHIgKmRhdGFfaGRyOwogCWludCByZXQ7CiAKLQlpZiAoV0FSTl9PTihza2IgPT0gTlVMTCkpCisJaWYgKFdBUk5fT04oc2tiID09IE5VTEwgfHwgKGlmX2lkeCA+IHdtaS0+cGFyZW50X2Rldi0+dmlmX21heCAtIDEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodHhfbWV0YV9pbmZvKSB7CkBAIC0xODksNyArMjA5LDcgQEAKIAkJICAgIFdNSV9EQVRBX0hEUl9NT1JFX01BU0sgPDwgV01JX0RBVEFfSERSX01PUkVfU0hJRlQ7CiAKIAlkYXRhX2hkci0+aW5mbzIgPSBjcHVfdG9fbGUxNihtZXRhX3ZlciA8PCBXTUlfREFUQV9IRFJfTUVUQV9TSElGVCk7Ci0JZGF0YV9oZHItPmluZm8zID0gMDsKKwlkYXRhX2hkci0+aW5mbzMgPSBjcHVfdG9fbGUxNihpZl9pZHggJiBXTUlfREFUQV9IRFJfSUZfSURYX01BU0spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMTYsNyArMjM2LDggQEAKIAkJcmV0dXJuIGlwX3ByaTsKIH0KIAotaW50IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIHUzMiBsYXllcjJfcHJpb3JpdHksIGJvb2wgd21tX2VuYWJsZWQsCiAJCQkJICAgICAgIHU4ICphYykKIHsKQEAgLTI2Miw3ICsyODMsMTIgQEAKIAkJCXVzcl9wcmkgPSBsYXllcjJfcHJpb3JpdHkgJiAweDc7CiAJfQogCi0JLyogd29ya2Fyb3VuZCBmb3IgV01NIFM1ICovCisJLyoKKwkgKiB3b3JrYXJvdW5kIGZvciBXTU0gUzUKKwkgKgorCSAqIEZJWE1FOiB3bWktPnRyYWZmaWNfY2xhc3MgaXMgYWx3YXlzIDEwMCBzbyB0aGlzIHRlc3QgZG9lc24ndAorCSAqIG1ha2Ugc2Vuc2UKKwkgKi8KIAlpZiAoKHdtaS0+dHJhZmZpY19jbGFzcyA9PSBXTU1fQUNfVkkpICYmCiAJICAgICgodXNyX3ByaSA9PSA1KSB8fCAodXNyX3ByaSA9PSA0KSkpCiAJCXVzcl9wcmkgPSAxOwpAQCAtMjg0LDcgKzMxMCw3IEBACiAJCQljcHVfdG9fbGUzMihXTUlfSU1QTElDSVRfUFNUUkVBTV9JTkFDVElWSVRZX0lOVCk7CiAJCS8qIEltcGxpY2l0IHN0cmVhbXMgYXJlIGNyZWF0ZWQgd2l0aCBUU0lEIDB4RkYgKi8KIAkJY21kLnRzaWQgPSBXTUlfSU1QTElDSVRfUFNUUkVBTTsKLQkJYXRoNmtsX3dtaV9jcmVhdGVfcHN0cmVhbV9jbWQod21pLCAmY21kKTsKKwkJYXRoNmtsX3dtaV9jcmVhdGVfcHN0cmVhbV9jbWQod21pLCBpZl9pZHgsICZjbWQpOwogCX0KIAogCSphYyA9IHRyYWZmaWNfY2xhc3M7CkBAIC00MTAsMTMgKzQzNiwxNCBAQAogfQogCiBzdGF0aWMgaW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsCi0JCQkJCSAgICAgIGludCBsZW4pCisJCQkJCSAgICAgIGludCBsZW4sIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9yZW1haW5fb25fY2hubF9ldmVudCAqZXY7CiAJdTMyIGZyZXE7CiAJdTMyIGR1cjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CisJdTMyIGlkOwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyNiwyNiArNDUzLDI5IEBACiAJZHVyID0gbGUzMl90b19jcHUoZXYtPmR1cmF0aW9uKTsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicmVtYWluX29uX2Nobmw6IGZyZXE9JXUgZHVyPSV1XG4iLAogCQkgICBmcmVxLCBkdXIpOwotCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndkZXYtPndpcGh5LCBmcmVxKTsKKwljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53aXBoeSwgZnJlcSk7CiAJaWYgKCFjaGFuKSB7CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJyZW1haW5fb25fY2hubDogVW5rbm93biBjaGFubmVsICIKIAkJCSAgICIoZnJlcT0ldSlcbiIsIGZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JY2ZnODAyMTFfcmVhZHlfb25fY2hhbm5lbChhci0+bmV0X2RldiwgMSwgY2hhbiwgTkw4MDIxMV9DSEFOX05PX0hULAorCWlkID0gdmlmLT5sYXN0X3JvY19pZDsKKwljZmc4MDIxMV9yZWFkeV9vbl9jaGFubmVsKHZpZi0+bmRldiwgaWQsIGNoYW4sIE5MODAyMTFfQ0hBTl9OT19IVCwKIAkJCQkgIGR1ciwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksCi0JCQkJCQkgICAgIHU4ICpkYXRhcCwgaW50IGxlbikKKwkJCQkJCSAgICAgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkJICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2V2ZW50ICpldjsKIAl1MzIgZnJlcTsKIAl1MzIgZHVyOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKKwl1MzIgaWQ7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU1LDIzICs0ODUsMjkgQEAKIAlkdXIgPSBsZTMyX3RvX2NwdShldi0+ZHVyYXRpb24pOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJjYW5jZWxfcmVtYWluX29uX2Nobmw6IGZyZXE9JXUgZHVyPSV1ICIKIAkJICAgInN0YXR1cz0ldVxuIiwgZnJlcSwgZHVyLCBldi0+c3RhdHVzKTsKLQljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53ZGV2LT53aXBoeSwgZnJlcSk7CisJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2lwaHksIGZyZXEpOwogCWlmICghY2hhbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiY2FuY2VsX3JlbWFpbl9vbl9jaG5sOiBVbmtub3duICIKIAkJCSAgICJjaGFubmVsIChmcmVxPSV1KVxuIiwgZnJlcSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQljZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKGFyLT5uZXRfZGV2LCAxLCBjaGFuLAorCWlmICh2aWYtPmxhc3RfY2FuY2VsX3JvY19pZCAmJgorCSAgICB2aWYtPmxhc3RfY2FuY2VsX3JvY19pZCArIDEgPT0gdmlmLT5sYXN0X3JvY19pZCkKKwkJaWQgPSB2aWYtPmxhc3RfY2FuY2VsX3JvY19pZDsgLyogZXZlbnQgZm9yIGNhbmNlbCBjb21tYW5kICovCisJZWxzZQorCQlpZCA9IHZpZi0+bGFzdF9yb2NfaWQ7IC8qIHRpbWVvdXQgb24gdW5jYW5jZWxlZCByLW8tYyAqLworCXZpZi0+bGFzdF9jYW5jZWxfcm9jX2lkID0gMDsKKwljZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKHZpZi0+bmRldiwgaWQsIGNoYW4sCiAJCQkJCSAgIE5MODAyMTFfQ0hBTl9OT19IVCwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3R4X3N0YXR1c19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV90eF9zdGF0dXNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfdHhfc3RhdHVzX2V2ZW50ICpldjsKIAl1MzIgaWQ7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDgxLDcgKzUxNyw3IEBACiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgInR4X3N0YXR1czogaWQ9JXggYWNrX3N0YXR1cz0ldVxuIiwKIAkJICAgaWQsIGV2LT5hY2tfc3RhdHVzKTsKIAlpZiAod21pLT5sYXN0X21nbXRfdHhfZnJhbWUpIHsKLQkJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMoYXItPm5ldF9kZXYsIGlkLAorCQljZmc4MDIxMV9tZ210X3R4X3N0YXR1cyh2aWYtPm5kZXYsIGlkLAogCQkJCQl3bWktPmxhc3RfbWdtdF90eF9mcmFtZSwKIAkJCQkJd21pLT5sYXN0X21nbXRfdHhfZnJhbWVfbGVuLAogCQkJCQkhIWV2LT5hY2tfc3RhdHVzLCBHRlBfQVRPTUlDKTsKQEAgLTQ5MywxMiArNTI5LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9yeF9wcm9iZV9yZXFfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfcnhfcHJvYmVfcmVxX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3AycF9yeF9wcm9iZV9yZXFfZXZlbnQgKmV2OwogCXUzMiBmcmVxOwogCXUxNiBkbGVuOwotCXN0cnVjdCBhdGg2a2wgKmFyID0gd21pLT5wYXJlbnRfZGV2OwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxMywxMCArNTQ5LDEwIEBACiAJfQogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJyeF9wcm9iZV9yZXE6IGxlbj0ldSBmcmVxPSV1ICIKIAkJICAgInByb2JlX3JlcV9yZXBvcnQ9JWRcbiIsCi0JCSAgIGRsZW4sIGZyZXEsIGFyLT5wcm9iZV9yZXFfcmVwb3J0KTsKKwkJICAgZGxlbiwgZnJlcSwgdmlmLT5wcm9iZV9yZXFfcmVwb3J0KTsKIAotCWlmIChhci0+cHJvYmVfcmVxX3JlcG9ydCB8fCBhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKQotCQljZmc4MDIxMV9yeF9tZ210KGFyLT5uZXRfZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKHZpZi0+cHJvYmVfcmVxX3JlcG9ydCB8fCB2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykKKwkJY2ZnODAyMTFfcnhfbWdtdCh2aWYtPm5kZXYsIGZyZXEsIGV2LT5kYXRhLCBkbGVuLCBHRlBfQVRPTUlDKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTM2LDEyICs1NzIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3J4X2FjdGlvbl9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9yeF9hY3Rpb25fZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfcnhfYWN0aW9uX2V2ZW50ICpldjsKIAl1MzIgZnJlcTsKIAl1MTYgZGxlbjsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKIAogCWlmIChsZW4gPCBzaXplb2YoKmV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01NTUsNyArNTkxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJyeF9hY3Rpb246IGxlbj0ldSBmcmVxPSV1XG4iLCBkbGVuLCBmcmVxKTsKLQljZmc4MDIxMV9yeF9tZ210KGFyLT5uZXRfZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CisJY2ZnODAyMTFfcnhfbWdtdCh2aWYtPm5kZXYsIGZyZXEsIGV2LT5kYXRhLCBkbGVuLCBHRlBfQVRPTUlDKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjIwLDcgKzY1Niw4IEBACiB9CiAKIC8qIFNlbmQgYSAic2ltcGxlIiB3bWkgY29tbWFuZCAtLSBvbmUgd2l0aCBubyBhcmd1bWVudHMgKi8KLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9zaW1wbGVfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfY21kX2lkIGNtZF9pZCkKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9zaW1wbGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSBlbnVtIHdtaV9jbWRfaWQgY21kX2lkKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJldDsKQEAgLTYyOSw3ICs2NjYsNyBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIGNtZF9pZCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIGNtZF9pZCwgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02NDEsNyArNjc4LDYgQEAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfcmVhZHlfZXZlbnRfMikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jd21pLT5yZWFkeSA9IHRydWU7CiAJYXRoNmtsX3JlYWR5X2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZXYtPm1hY19hZGRyLAogCQkJICAgbGUzMl90b19jcHUoZXYtPnN3X3ZlcnNpb24pLAogCQkJICAgbGUzMl90b19jcHUoZXYtPmFiaV92ZXJzaW9uKSk7CkBAIC02NzMsMzIgKzcwOSw3MyBAQAogCWNtZC0+aW5mby5wYXJhbXMucm9hbV9yc3NpX2Zsb29yID0gREVGX0xSU1NJX1JPQU1fRkxPT1I7CiAJY21kLT5yb2FtX2N0cmwgPSBXTUlfU0VUX0xSU1NJX1NDQU5fUEFSQU1TOwogCi0JYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9ST0FNX0NUUkxfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1NFVF9ST0FNX0NUUkxfQ01ESUQsCisJCQkgICAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfY29ubmVjdF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK2ludCBhdGg2a2xfd21pX2ZvcmNlX3JvYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgY29uc3QgdTggKmJzc2lkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJvYW1fY3RybF9jbWQgKmNtZDsKKworCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWQgPSAoc3RydWN0IHJvYW1fY3RybF9jbWQgKikgc2tiLT5kYXRhOworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisKKwltZW1jcHkoY21kLT5pbmZvLmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCWNtZC0+cm9hbV9jdHJsID0gV01JX0ZPUkNFX1JPQU07CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiZm9yY2Ugcm9hbSB0byAlcE1cbiIsIGJzc2lkKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1NFVF9ST0FNX0NUUkxfQ01ESUQsCisJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X3JvYW1fbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCBlbnVtIHdtaV9yb2FtX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByb2FtX2N0cmxfY21kICpjbWQ7CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCByb2FtX2N0cmxfY21kICopIHNrYi0+ZGF0YTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJY21kLT5pbmZvLnJvYW1fbW9kZSA9IG1vZGU7CisJY21kLT5yb2FtX2N0cmwgPSBXTUlfU0VUX1JPQU1fTU9ERTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJzZXQgcm9hbSBtb2RlICVkXG4iLCBtb2RlKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1NFVF9ST0FNX0NUUkxfQ01ESUQsCisJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKK30KKworc3RhdGljIGludCBhdGg2a2xfd21pX2Nvbm5lY3RfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9jb25uZWN0X2V2ZW50ICpldjsKIAl1OCAqcGllLCAqcGVpZTsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKIAogCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHdtaV9jb25uZWN0X2V2ZW50KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlldiA9IChzdHJ1Y3Qgd21pX2Nvbm5lY3RfZXZlbnQgKikgZGF0YXA7CiAKLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQkvKiBBUCBtb2RlIHN0YXJ0L1NUQSBjb25uZWN0ZWQgZXZlbnQgKi8KLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyLT5uZXRfZGV2OworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmlmLT5uZGV2OwogCQlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsIGV2LT51LmFwX2Jzcy5ic3NpZCwgRVRIX0FMRU4pID09IDApIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICIlczogZnJlcSAlZCBic3NpZCAlcE0gIgogCQkJCSAgICIoQVAgc3RhcnRlZClcbiIsCiAJCQkJICAgX19mdW5jX18sIGxlMTZfdG9fY3B1KGV2LT51LmFwX2Jzcy5jaCksCiAJCQkJICAgZXYtPnUuYXBfYnNzLmJzc2lkKTsKIAkJCWF0aDZrbF9jb25uZWN0X2FwX21vZGVfYnNzKAotCQkJCWFyLCBsZTE2X3RvX2NwdShldi0+dS5hcF9ic3MuY2gpKTsKKwkJCQl2aWYsIGxlMTZfdG9fY3B1KGV2LT51LmFwX2Jzcy5jaCkpOwogCQl9IGVsc2UgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIiVzOiBhaWQgJXUgbWFjX2FkZHIgJXBNICIKIAkJCQkgICAiYXV0aD0ldSBrZXltZ210PSV1IGNpcGhlcj0ldSBhcHNkX2luZm89JXUgIgpAQCAtNzEwLDcgKzc4Nyw3IEBACiAJCQkJICAgbGUxNl90b19jcHUoZXYtPnUuYXBfc3RhLmNpcGhlciksCiAJCQkJICAgZXYtPnUuYXBfc3RhLmFwc2RfaW5mbyk7CiAJCQlhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YSgKLQkJCQlhciwgZXYtPnUuYXBfc3RhLmFpZCwgZXYtPnUuYXBfc3RhLm1hY19hZGRyLAorCQkJCXZpZiwgZXYtPnUuYXBfc3RhLmFpZCwgZXYtPnUuYXBfc3RhLm1hY19hZGRyLAogCQkJCWV2LT51LmFwX3N0YS5rZXltZ210LAogCQkJCWxlMTZfdG9fY3B1KGV2LT51LmFwX3N0YS5jaXBoZXIpLAogCQkJCWV2LT51LmFwX3N0YS5hdXRoLCBldi0+YXNzb2NfcmVxX2xlbiwKQEAgLTc1NSw3ICs4MzIsNyBAQAogCQlwaWUgKz0gcGllWzFdICsgMjsKIAl9CiAKLQlhdGg2a2xfY29ubmVjdF9ldmVudCh3bWktPnBhcmVudF9kZXYsIGxlMTZfdG9fY3B1KGV2LT51LnN0YS5jaCksCisJYXRoNmtsX2Nvbm5lY3RfZXZlbnQodmlmLCBsZTE2X3RvX2NwdShldi0+dS5zdGEuY2gpLAogCQkJICAgICBldi0+dS5zdGEuYnNzaWQsCiAJCQkgICAgIGxlMTZfdG9fY3B1KGV2LT51LnN0YS5saXN0ZW5faW50dmwpLAogCQkJICAgICBsZTE2X3RvX2NwdShldi0+dS5zdGEuYmVhY29uX2ludHZsKSwKQEAgLTgzNCwxNCArOTExLDE1IEBACiAJCWFscGhhMlswXSA9IGNvdW50cnktPmlzb05hbWVbMF07CiAJCWFscGhhMlsxXSA9IGNvdW50cnktPmlzb05hbWVbMV07CiAKLQkJcmVndWxhdG9yeV9oaW50KHdtaS0+cGFyZW50X2Rldi0+d2Rldi0+d2lwaHksIGFscGhhMik7CisJCXJlZ3VsYXRvcnlfaGludCh3bWktPnBhcmVudF9kZXYtPndpcGh5LCBhbHBoYTIpOwogCiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJDb3VudHJ5IGFscGhhMiBiZWluZyB1c2VkOiAlYyVjXG4iLAogCQkJCWFscGhhMlswXSwgYWxwaGEyWzFdKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX2Rpc2Nvbm5lY3RfZXZlbnQgKmV2OwogCXdtaS0+dHJhZmZpY19jbGFzcyA9IDEwMDsKQEAgLTg1NywxMCArOTM1LDggQEAKIAkJICAgZXYtPmRpc2Nvbm5fcmVhc29uLCBldi0+YXNzb2NfcmVzcF9sZW4pOwogCiAJd21pLT5pc193bW1fZW5hYmxlZCA9IGZhbHNlOwotCXdtaS0+cGFpcl9jcnlwdG9fdHlwZSA9IE5PTkVfQ1JZUFQ7Ci0Jd21pLT5ncnBfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwogCi0JYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQod21pLT5wYXJlbnRfZGV2LCBldi0+ZGlzY29ubl9yZWFzb24sCisJYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQodmlmLCBldi0+ZGlzY29ubl9yZWFzb24sCiAJCQkJZXYtPmJzc2lkLCBldi0+YXNzb2NfcmVzcF9sZW4sIGV2LT5hc3NvY19pbmZvLAogCQkJCWxlMTZfdG9fY3B1KGV2LT5wcm90b19yZWFzb25fc3RhdHVzKSk7CiAKQEAgLTg4Niw3ICs5NjIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfdGtpcF9taWNlcnJfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfdGtpcF9taWNlcnJfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV90a2lwX21pY2Vycl9ldmVudCAqZXY7CiAKQEAgLTg5NSwxMiArOTcyLDIwIEBACiAKIAlldiA9IChzdHJ1Y3Qgd21pX3RraXBfbWljZXJyX2V2ZW50ICopIGRhdGFwOwogCi0JYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZXYtPmtleV9pZCwgZXYtPmlzX21jYXN0KTsKKwlhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQodmlmLCBldi0+a2V5X2lkLCBldi0+aXNfbWNhc3QpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9ic3NpbmZvX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQordm9pZCBhdGg2a2xfd21pX3NzY2FuX3RpbWVyKHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSAoc3RydWN0IGF0aDZrbF92aWYgKikgcHRyOworCisJY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKHZpZi0+YXItPndpcGh5KTsKK30KKworc3RhdGljIGludCBhdGg2a2xfd21pX2Jzc2luZm9fZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9ic3NfaW5mb19oZHIyICpiaWg7CiAJdTggKmJ1ZjsKQEAgLTkyNywyNiArMTAxMiwyNyBAQAogCQlyZXR1cm4gMDsgLyogT25seSB1cGRhdGUgQlNTIHRhYmxlIGZvciBub3cgKi8KIAogCWlmIChiaWgtPmZyYW1lX3R5cGUgPT0gQkVBQ09OX0ZUWVBFICYmCi0JICAgIHRlc3RfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZykpIHsKLQkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7Ci0JCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBOT05FX0JTU19GSUxURVIsIDApOworCSAgICB0ZXN0X2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncykpIHsKKwkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CiAJfQogCi0JY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2Rldi0+d2lwaHksIGxlMTZfdG9fY3B1KGJpaC0+Y2gpKTsKKwljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53aXBoeSwgbGUxNl90b19jcHUoYmloLT5jaCkpOwogCWlmIChjaGFubmVsID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGxlbiA8IDggKyAyICsgMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYmloLT5mcmFtZV90eXBlID09IEJFQUNPTl9GVFlQRSAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgJiYKLQkgICAgbWVtY21wKGJpaC0+YnNzaWQsIGFyLT5ic3NpZCwgRVRIX0FMRU4pID09IDApIHsKKwlpZiAoYmloLT5mcmFtZV90eXBlID09IEJFQUNPTl9GVFlQRSAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKQorCSAgICAmJiBtZW1jbXAoYmloLT5ic3NpZCwgdmlmLT5ic3NpZCwgRVRIX0FMRU4pID09IDApIHsKIAkJY29uc3QgdTggKnRpbTsKIAkJdGltID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9USU0sIGJ1ZiArIDggKyAyICsgMiwKIAkJCQkgICAgICAgbGVuIC0gOCAtIDIgLSAyKTsKIAkJaWYgKHRpbSAmJiB0aW1bMV0gPj0gMikgewotCQkJYXItPmFzc29jX2Jzc19kdGltX3BlcmlvZCA9IHRpbVszXTsKLQkJCXNldF9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZhci0+ZmxhZyk7CisJCQl2aWYtPmFzc29jX2Jzc19kdGltX3BlcmlvZCA9IHRpbVszXTsKKwkJCXNldF9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZ2aWYtPmZsYWdzKTsKIAkJfQogCX0KIApAQCAtOTY2LDcgKzEwNTIsNyBAQAogCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKIAkJbWVtc2V0KG1nbXQtPmRhLCAweGZmLCBFVEhfQUxFTik7CiAJfSBlbHNlIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyLT5uZXRfZGV2OworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmlmLT5uZGV2OwogCiAJCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKQEAgLTk3OSw3ICsxMDY1LDcgQEAKIAogCW1lbWNweSgmbWdtdC0+dS5iZWFjb24sIGJ1ZiwgbGVuKTsKIAotCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUoYXItPndkZXYtPndpcGh5LCBjaGFubmVsLCBtZ210LAorCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUoYXItPndpcGh5LCBjaGFubmVsLCBtZ210LAogCQkJCQkyNCArIGxlbiwgKGJpaC0+c25yIC0gOTUpICogMTAwLAogCQkJCQlHRlBfQVRPTUlDKTsKIAlrZnJlZShtZ210KTsKQEAgLTk4Nyw2ICsxMDczLDIxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAorCS8qCisJICogRmlybXdhcmUgZG9lc24ndCByZXR1cm4gYW55IGV2ZW50IHdoZW4gc2NoZWR1bGVkIHNjYW4gaGFzCisJICogZmluaXNoZWQsIHNvIHdlIG5lZWQgdG8gdXNlIGEgdGltZXIgdG8gZmluZCBvdXQgd2hlbiB0aGVyZSBhcmUKKwkgKiBubyBtb3JlIHJlc3VsdHMuCisJICoKKwkgKiBUaGUgdGltZXIgaXMgc3RhcnRlZCBmcm9tIHRoZSBmaXJzdCBic3MgaW5mbyByZWNlaXZlZCwgb3RoZXJ3aXNlCisJICogdGhlIHRpbWVyIHdvdWxkIG5vdCBldmVyIGZpcmUgaWYgdGhlIHNjYW4gaW50ZXJ2YWwgaXMgc2hvcnQKKwkgKiBlbm91Z2guCisJICovCisJaWYgKGFyLT5zdGF0ZSA9PSBBVEg2S0xfU1RBVEVfU0NIRURfU0NBTiAmJgorCSAgICAhdGltZXJfcGVuZGluZygmdmlmLT5zY2hlZF9zY2FuX3RpbWVyKSkgeworCQltb2RfdGltZXIoJnZpZi0+c2NoZWRfc2Nhbl90aW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoQVRINktMX1NDSEVEX1NDQU5fUkVTVUxUX0RFTEFZKSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTQsMjAgKzExOTUsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3NjYW5fY29tcGxldGVfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc2Nhbl9jb21wbGV0ZV9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkgICAgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3NjYW5fY29tcGxldGVfZXZlbnQgKmV2OwogCiAJZXYgPSAoc3RydWN0IHdtaV9zY2FuX2NvbXBsZXRlX2V2ZW50ICopIGRhdGFwOwogCi0JYXRoNmtsX3NjYW5fY29tcGxldGVfZXZ0KHdtaS0+cGFyZW50X2RldiwgYV9zbGUzMl90b19jcHUoZXYtPnN0YXR1cykpOworCWF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dCh2aWYsIGFfc2xlMzJfdG9fY3B1KGV2LT5zdGF0dXMpKTsKIAl3bWktPmlzX3Byb2JlX3NzaWQgPSBmYWxzZTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF93bWlfbmVpZ2hib3JfcmVwb3J0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLAotCQkJCQkgICAgICAgaW50IGxlbikKKwkJCQkJICAgICAgIGludCBsZW4sIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9uZWlnaGJvcl9yZXBvcnRfZXZlbnQgKmV2OwogCXU4IGk7CkBAIC0xMTI1LDcgKzEyMjcsNyBAQAogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAibmVpZ2hib3IgJWQvJWQgLSAlcE0gMHgleFxuIiwKIAkJCSAgIGkgKyAxLCBldi0+bnVtX25laWdoYm9ycywgZXYtPm5laWdoYm9yW2ldLmJzc2lkLAogCQkJICAgZXYtPm5laWdoYm9yW2ldLmJzc19mbGFncyk7Ci0JCWNmZzgwMjExX3Bta3NhX2NhbmRpZGF0ZV9ub3RpZnkod21pLT5wYXJlbnRfZGV2LT5uZXRfZGV2LCBpLAorCQljZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHZpZi0+bmRldiwgaSwKIAkJCQkJCWV2LT5uZWlnaGJvcltpXS5ic3NpZCwKIAkJCQkJCSEhKGV2LT5uZWlnaGJvcltpXS5ic3NfZmxhZ3MgJgogCQkJCQkJICAgV01JX1BSRUFVVEhfQ0FQQUJMRV9CU1MpLApAQCAtMTE2Niw5ICsxMjY4LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9zdGF0c19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9zdGF0c19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkgICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7Ci0JYXRoNmtsX3RndF9zdGF0c19ldmVudCh3bWktPnBhcmVudF9kZXYsIGRhdGFwLCBsZW4pOworCWF0aDZrbF90Z3Rfc3RhdHNfZXZlbnQodmlmLCBkYXRhcCwgbGVuKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyMiw3ICsxMzI1LDcgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9yc3NpX3RocmVzaG9sZF9wYXJhbXNfY21kICopIHNrYi0+ZGF0YTsKIAltZW1jcHkoY21kLCByc3NpX2NtZCwgc2l6ZW9mKHN0cnVjdCB3bWlfcnNzaV90aHJlc2hvbGRfcGFyYW1zX2NtZCkpOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9SU1NJX1RIUkVTSE9MRF9QQVJBTVNfQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9SU1NJX1RIUkVTSE9MRF9QQVJBTVNfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIApAQCAtMTMyMiw3ICsxNDI1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2NhY19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX2NhY19ldmVudCAqcmVwbHk7CiAJc3RydWN0IGllZWU4MDIxMV90c3BlY19pZSAqdHM7CkBAIC0xMzQzLDcgKzE0NDcsOCBAQAogCQl0c2lkID0gKHRzaW5mbyA+PiBJRUVFODAyMTFfV01NX0lFX1RTUEVDX1RJRF9TSElGVCkgJgogCQkJSUVFRTgwMjExX1dNTV9JRV9UU1BFQ19USURfTUFTSzsKIAotCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHJlcGx5LT5hYywgdHNpZCk7CisJCWF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHdtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICAgICByZXBseS0+YWMsIHRzaWQpOwogCX0gZWxzZSBpZiAocmVwbHktPmNhY19pbmRpY2F0aW9uID09IENBQ19JTkRJQ0FUSU9OX05PX1JFU1ApIHsKIAkJLyoKIAkJICogRm9sbG93aW5nIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBvdXRzdGFuZGluZwpAQCAtMTM1OCw3ICsxNDYzLDggQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaW5kZXggPCAoc2l6ZW9mKGFjdGl2ZV90c2lkcykgKiA4KSkKLQkJCWF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHdtaSwgcmVwbHktPmFjLCBpbmRleCk7CisJCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSAgICAgIHJlcGx5LT5hYywgaW5kZXgpOwogCX0KIAogCS8qCkBAIC0xNDAzLDcgKzE1MDksNyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3Nucl90aHJlc2hvbGRfcGFyYW1zX2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtZCwgc25yX2NtZCwgc2l6ZW9mKHN0cnVjdCB3bWlfc25yX3RocmVzaG9sZF9wYXJhbXNfY21kKSk7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NOUl9USFJFU0hPTERfUEFSQU1TX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfU05SX1RIUkVTSE9MRF9QQVJBTVNfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIApAQCAtMTUyOCwxNCArMTYzNCwxNSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoNmtsX3dtaV9jbWRfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCitpbnQgYXRoNmtsX3dtaV9jbWRfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCWVudW0gd21pX2NtZF9pZCBjbWRfaWQsIGVudW0gd21pX3N5bmNfZmxhZyBzeW5jX2ZsYWcpCiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpjbWRfaGRyOwogCWVudW0gaHRjX2VuZHBvaW50X2lkIGVwX2lkID0gd21pLT5lcF9pZDsKIAlpbnQgcmV0OworCXUxNiBpbmZvMTsKIAotCWlmIChXQVJOX09OKHNrYiA9PSBOVUxMKSkKKwlpZiAoV0FSTl9PTihza2IgPT0gTlVMTCB8fCAoaWZfaWR4ID4gKHdtaS0+cGFyZW50X2Rldi0+dmlmX21heCAtIDEpKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIndtaSB0eCBpZCAlZCBsZW4gJWQgZmxhZyAlZFxuIiwKQEAgLTE1NTQsMTkgKzE2NjEsMjAgQEAKIAkJICogTWFrZSBzdXJlIGFsbCBkYXRhIGN1cnJlbnRseSBxdWV1ZWQgaXMgdHJhbnNtaXR0ZWQgYmVmb3JlCiAJCSAqIHRoZSBjbWQgZXhlY3V0aW9uLiAgRXN0YWJsaXNoIGEgbmV3IHN5bmMgcG9pbnQuCiAJCSAqLwotCQlhdGg2a2xfd21pX3N5bmNfcG9pbnQod21pKTsKKwkJYXRoNmtsX3dtaV9zeW5jX3BvaW50KHdtaSwgaWZfaWR4KTsKIAl9CiAKIAlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd21pX2NtZF9oZHIpKTsKIAogCWNtZF9oZHIgPSAoc3RydWN0IHdtaV9jbWRfaGRyICopIHNrYi0+ZGF0YTsKIAljbWRfaGRyLT5jbWRfaWQgPSBjcHVfdG9fbGUxNihjbWRfaWQpOwotCWNtZF9oZHItPmluZm8xID0gMDsJLyogYWRkZWQgZm9yIHZpcnR1YWwgaW50ZXJmYWNlICovCisJaW5mbzEgPSBpZl9pZHggJiBXTUlfQ01EX0hEUl9JRl9JRF9NQVNLOworCWNtZF9oZHItPmluZm8xID0gY3B1X3RvX2xlMTYoaW5mbzEpOwogCiAJLyogT25seSBmb3IgT1BUX1RYX0NNRCwgdXNlIEJFIGVuZHBvaW50LiAqLwogCWlmIChjbWRfaWQgPT0gV01JX09QVF9UWF9GUkFNRV9DTURJRCkgewogCQlyZXQgPSBhdGg2a2xfd21pX2RhdGFfaGRyX2FkZCh3bWksIHNrYiwgT1BUX01TR1RZUEUsCi0JCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgMCwgTlVMTCk7CisJCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgMCwgTlVMTCwgaWZfaWR4KTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIHJldDsKQEAgLTE1ODIsMjAgKzE2OTAsMjIgQEAKIAkJICogTWFrZSBzdXJlIGFsbCBuZXcgZGF0YSBxdWV1ZWQgd2FpdHMgZm9yIHRoZSBjb21tYW5kIHRvCiAJCSAqIGV4ZWN1dGUuIEVzdGFibGlzaCBhIG5ldyBzeW5jIHBvaW50LgogCQkgKi8KLQkJYXRoNmtsX3dtaV9zeW5jX3BvaW50KHdtaSk7CisJCWF0aDZrbF93bWlfc3luY19wb2ludCh3bWksIGlmX2lkeCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKK2ludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKIAkJCSAgIGVudW0gZG90MTFfYXV0aF9tb2RlIGRvdDExX2F1dGhfbW9kZSwKIAkJCSAgIGVudW0gYXV0aF9tb2RlIGF1dGhfbW9kZSwKIAkJCSAgIGVudW0gY3J5cHRvX3R5cGUgcGFpcndpc2VfY3J5cHRvLAogCQkJICAgdTggcGFpcndpc2VfY3J5cHRvX2xlbiwKIAkJCSAgIGVudW0gY3J5cHRvX3R5cGUgZ3JvdXBfY3J5cHRvLAogCQkJICAgdTggZ3JvdXBfY3J5cHRvX2xlbiwgaW50IHNzaWRfbGVuLCB1OCAqc3NpZCwKLQkJCSAgIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwsIHUzMiBjdHJsX2ZsYWdzKQorCQkJICAgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCwgdTMyIGN0cmxfZmxhZ3MsCisJCQkgICB1OCBud19zdWJ0eXBlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqY2M7CkBAIC0xNjM1LDE5ICsxNzQ1LDE5IEBACiAJY2MtPmdycF9jcnlwdG9fbGVuID0gZ3JvdXBfY3J5cHRvX2xlbjsKIAljYy0+Y2ggPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKIAljYy0+Y3RybF9mbGFncyA9IGNwdV90b19sZTMyKGN0cmxfZmxhZ3MpOworCWNjLT5ud19zdWJ0eXBlID0gbndfc3VidHlwZTsKIAogCWlmIChic3NpZCAhPSBOVUxMKQogCQltZW1jcHkoY2MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwogCi0Jd21pLT5wYWlyX2NyeXB0b190eXBlID0gcGFpcndpc2VfY3J5cHRvOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gZ3JvdXBfY3J5cHRvOwotCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0NPTk5FQ1RfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQ09OTkVDVF9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCkKK2ludCBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4ICpic3NpZCwKKwkJCSAgICAgdTE2IGNoYW5uZWwpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3JlY29ubmVjdF9jbWQgKmNjOwpAQCAtMTY2OCwxMyArMTc3OCwxMyBAQAogCWlmIChic3NpZCAhPSBOVUxMKQogCQltZW1jcHkoY2MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JFQ09OTkVDVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SRUNPTk5FQ1RfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7CiAJaW50IHJldDsKIApAQCAtMTY4MywxMiArMTc5Myw3OSBAQAogCXdtaS0+dHJhZmZpY19jbGFzcyA9IDEwMDsKIAogCS8qIERpc2Nvbm5lY3QgY29tbWFuZCBkb2VzIG5vdCBuZWVkIHRvIGRvIGEgU1lOQyBiZWZvcmUuICovCi0JcmV0ID0gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0RJU0NPTk5FQ1RfQ01ESUQpOworCXJldCA9IGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwgV01JX0RJU0NPTk5FQ1RfQ01ESUQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCitpbnQgYXRoNmtsX3dtaV9iZWdpbnNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgICBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAorCQkJICAgICB1MzIgZm9yY2VfZmdzY2FuLCB1MzIgaXNfbGVnYWN5LAorCQkJICAgICB1MzIgaG9tZV9kd2VsbF90aW1lLCB1MzIgZm9yY2Vfc2Nhbl9pbnRlcnZhbCwKKwkJCSAgICAgczggbnVtX2NoYW4sIHUxNiAqY2hfbGlzdCwgdTMyIG5vX2NjaywgdTMyICpyYXRlcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfYmVnaW5fc2Nhbl9jbWQgKnNjOworCXM4IHNpemU7CisJaW50IGksIGJhbmQsIHJldDsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKKwlpbnQgbnVtX3JhdGVzOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd21pX2JlZ2luX3NjYW5fY21kKTsKKworCWlmICgoc2Nhbl90eXBlICE9IFdNSV9MT05HX1NDQU4pICYmIChzY2FuX3R5cGUgIT0gV01JX1NIT1JUX1NDQU4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChudW1fY2hhbiA+IFdNSV9NQVhfQ0hBTk5FTFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG51bV9jaGFuKQorCQlzaXplICs9IHNpemVvZih1MTYpICogKG51bV9jaGFuIC0gMSk7CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNjID0gKHN0cnVjdCB3bWlfYmVnaW5fc2Nhbl9jbWQgKikgc2tiLT5kYXRhOworCXNjLT5zY2FuX3R5cGUgPSBzY2FuX3R5cGU7CisJc2MtPmZvcmNlX2ZnX3NjYW4gPSBjcHVfdG9fbGUzMihmb3JjZV9mZ3NjYW4pOworCXNjLT5pc19sZWdhY3kgPSBjcHVfdG9fbGUzMihpc19sZWdhY3kpOworCXNjLT5ob21lX2R3ZWxsX3RpbWUgPSBjcHVfdG9fbGUzMihob21lX2R3ZWxsX3RpbWUpOworCXNjLT5mb3JjZV9zY2FuX2ludHZsID0gY3B1X3RvX2xlMzIoZm9yY2Vfc2Nhbl9pbnRlcnZhbCk7CisJc2MtPm5vX2NjayA9IGNwdV90b19sZTMyKG5vX2Njayk7CisJc2MtPm51bV9jaCA9IG51bV9jaGFuOworCisJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9CisJCSAgICBhci0+d2lwaHktPmJhbmRzW2JhbmRdOworCQl1MzIgcmF0ZW1hc2sgPSByYXRlc1tiYW5kXTsKKwkJdTggKnN1cHBfcmF0ZXMgPSBzYy0+c3VwcF9yYXRlc1tiYW5kXS5yYXRlczsKKwkJbnVtX3JhdGVzID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGkrKykgeworCQkJaWYgKChCSVQoaSkgJiByYXRlbWFzaykgPT0gMCkKKwkJCQljb250aW51ZTsgLyogc2tpcCByYXRlICovCisJCQlzdXBwX3JhdGVzW251bV9yYXRlcysrXSA9CisJCQkgICAgKHU4KSAoc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGUgLyA1KTsKKwkJfQorCQlzYy0+c3VwcF9yYXRlc1tiYW5kXS5ucmF0ZXMgPSBudW1fcmF0ZXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFuOyBpKyspCisJCXNjLT5jaF9saXN0W2ldID0gY3B1X3RvX2xlMTYoY2hfbGlzdFtpXSk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9CRUdJTl9TQ0FOX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGF0aDZrbF93bWlfc3RhcnRfc2Nhbl9jbWQgaXMgdG8gYmUgZGVwcmVjYXRlZC4gVXNlCisgKiBhdGg2a2xfd21pX2JlZ2luX3NjYW5fY21kIGluc3RlYWQuIFRoZSBuZXcgZnVuY3Rpb24gc3VwcG9ydHMgUDJQCisgKiBtZ210IG9wZXJhdGlvbnMgdXNpbmcgc3RhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2ludCBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICAgIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCiAJCQkgICAgIHUzMiBmb3JjZV9mZ3NjYW4sIHUzMiBpc19sZWdhY3ksCiAJCQkgICAgIHUzMiBob21lX2R3ZWxsX3RpbWUsIHUzMiBmb3JjZV9zY2FuX2ludGVydmFsLAogCQkJICAgICBzOCBudW1fY2hhbiwgdTE2ICpjaF9saXN0KQpAQCAtMTcyNCwxMyArMTkwMSwxNCBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbjsgaSsrKQogCQlzYy0+Y2hfbGlzdFtpXSA9IGNwdV90b19sZTE2KGNoX2xpc3RbaV0pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NUQVJUX1NDQU5fQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU1RBUlRfU0NBTl9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiBmZ19zdGFydF9zZWMsCitpbnQgYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCSAgICAgIHUxNiBmZ19zdGFydF9zZWMsCiAJCQkgICAgICB1MTYgZmdfZW5kX3NlYywgdTE2IGJnX3NlYywKIAkJCSAgICAgIHUxNiBtaW5hY3RfY2hkd19tc2VjLCB1MTYgbWF4YWN0X2NoZHdfbXNlYywKIAkJCSAgICAgIHUxNiBwYXNfY2hkd19tc2VjLCB1OCBzaG9ydF9zY2FuX3JhdGlvLApAQCAtMTc1NywxMiArMTkzNSwxMiBAQAogCXNjLT5tYXhfZGZzY2hfYWN0X3RpbWUgPSBjcHVfdG9fbGUzMihtYXhfZGZzY2hfYWN0X3RpbWUpOwogCXNjLT5tYXhhY3Rfc2Nhbl9wZXJfc3NpZCA9IGNwdV90b19sZTE2KG1heGFjdF9zY2FuX3Blcl9zc2lkKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfU0NBTl9QQVJBTVNfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1NDQU5fUEFSQU1TX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggZmlsdGVyLCB1MzIgaWVfbWFzaykKK2ludCBhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGZpbHRlciwgdTMyIGllX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2Jzc19maWx0ZXJfY21kICpjbWQ7CkBAIC0xNzc5LDEyICsxOTU3LDEyIEBACiAJY21kLT5ic3NfZmlsdGVyID0gZmlsdGVyOwogCWNtZC0+aWVfbWFzayA9IGNwdV90b19sZTMyKGllX21hc2spOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9CU1NfRklMVEVSX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9CU1NfRklMVEVSX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9wcm9iZWRzc2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGluZGV4LCB1OCBmbGFnLAoraW50IGF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGluZGV4LCB1OCBmbGFnLAogCQkJICAgICAgdTggc3NpZF9sZW4sIHU4ICpzc2lkKQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xODE2LDEyICsxOTk0LDEzIEBACiAJY21kLT5zc2lkX2xlbiA9IHNzaWRfbGVuOwogCW1lbWNweShjbWQtPnNzaWQsIHNzaWQsIHNzaWRfbGVuKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUFJPQkVEX1NTSURfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1BST0JFRF9TU0lEX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgbGlzdGVuX2ludGVydmFsLAoraW50IGF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKIAkJCQkgIHUxNiBsaXN0ZW5fYmVhY29ucykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTgzNiwxMiArMjAxNSwxMiBAQAogCWNtZC0+bGlzdGVuX2ludHZsID0gY3B1X3RvX2xlMTYobGlzdGVuX2ludGVydmFsKTsKIAljbWQtPm51bV9iZWFjb25zID0gY3B1X3RvX2xlMTYobGlzdGVuX2JlYWNvbnMpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9MSVNURU5fSU5UX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9MSVNURU5fSU5UX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcHdyX21vZGUpCitpbnQgYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBwd3JfbW9kZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcG93ZXJfbW9kZV9jbWQgKmNtZDsKQEAgLTE4NTUsMTIgKzIwMzQsMTIgQEAKIAljbWQtPnB3cl9tb2RlID0gcHdyX21vZGU7CiAJd21pLT5wd3JfbW9kZSA9IHB3cl9tb2RlOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9QT1dFUl9NT0RFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9QT1dFUl9NT0RFX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgaWRsZV9wZXJpb2QsCitpbnQgYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUxNiBpZGxlX3BlcmlvZCwKIAkJCSAgICB1MTYgcHNfcG9sbF9udW0sIHUxNiBkdGltX3BvbGljeSwKIAkJCSAgICB1MTYgdHhfd2FrZXVwX3BvbGljeSwgdTE2IG51bV90eF90b193YWtldXAsCiAJCQkgICAgdTE2IHBzX2ZhaWxfZXZlbnRfcG9saWN5KQpAQCAtMTg4MSwxMiArMjA2MCwxMiBAQAogCXBtLT5udW1fdHhfdG9fd2FrZXVwID0gY3B1X3RvX2xlMTYobnVtX3R4X3RvX3dha2V1cCk7CiAJcG0tPnBzX2ZhaWxfZXZlbnRfcG9saWN5ID0gY3B1X3RvX2xlMTYocHNfZmFpbF9ldmVudF9wb2xpY3kpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9QT1dFUl9QQVJBTVNfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1BPV0VSX1BBUkFNU19DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggdGltZW91dCkKK2ludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggdGltZW91dCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfZGlzY190aW1lb3V0X2NtZCAqY21kOwpAQCAtMTg5OSwxNSArMjA3OCwyMCBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX2Rpc2NfdGltZW91dF9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+ZGlzY29uX3RpbWVvdXQgPSB0aW1lb3V0OwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9ESVNDX1RJTUVPVVRfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX0RJU0NfVElNRU9VVF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisKKwlpZiAocmV0ID09IDApCisJCWF0aDZrbF9kZWJ1Z19zZXRfZGlzY29ubmVjdF90aW1lb3V0KHdtaS0+cGFyZW50X2RldiwgdGltZW91dCk7CisKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9hZGRrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2V5X2luZGV4LAoraW50IGF0aDZrbF93bWlfYWRka2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTgga2V5X2luZGV4LAogCQkJICBlbnVtIGNyeXB0b190eXBlIGtleV90eXBlLAogCQkJICB1OCBrZXlfdXNhZ2UsIHU4IGtleV9sZW4sCi0JCQkgIHU4ICprZXlfcnNjLCB1OCAqa2V5X21hdGVyaWFsLAorCQkJICB1OCAqa2V5X3JzYywgdW5zaWduZWQgaW50IGtleV9yc2NfbGVuLAorCQkJICB1OCAqa2V5X21hdGVyaWFsLAogCQkJICB1OCBrZXlfb3BfY3RybCwgdTggKm1hY19hZGRyLAogCQkJICBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKQogewpAQCAtMTkyMCw3ICsyMTA0LDcgQEAKIAkJICAga2V5X2luZGV4LCBrZXlfdHlwZSwga2V5X3VzYWdlLCBrZXlfbGVuLCBrZXlfb3BfY3RybCk7CiAKIAlpZiAoKGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB8fCAoa2V5X2xlbiA+IFdNSV9NQVhfS0VZX0xFTikgfHwKLQkgICAgKGtleV9tYXRlcmlhbCA9PSBOVUxMKSkKKwkgICAgKGtleV9tYXRlcmlhbCA9PSBOVUxMKSB8fCBrZXlfcnNjX2xlbiA+IDgpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChXRVBfQ1JZUFQgIT0ga2V5X3R5cGUpICYmIChOVUxMID09IGtleV9yc2MpKQpAQCAtMTkzOCwyMCArMjEyMiwyMCBAQAogCW1lbWNweShjbWQtPmtleSwga2V5X21hdGVyaWFsLCBrZXlfbGVuKTsKIAogCWlmIChrZXlfcnNjICE9IE5VTEwpCi0JCW1lbWNweShjbWQtPmtleV9yc2MsIGtleV9yc2MsIHNpemVvZihjbWQtPmtleV9yc2MpKTsKKwkJbWVtY3B5KGNtZC0+a2V5X3JzYywga2V5X3JzYywga2V5X3JzY19sZW4pOwogCiAJY21kLT5rZXlfb3BfY3RybCA9IGtleV9vcF9jdHJsOwogCiAJaWYgKG1hY19hZGRyKQogCQltZW1jcHkoY21kLT5rZXlfbWFjX2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfQUREX0NJUEhFUl9LRVlfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQUREX0NJUEhFUl9LRVlfQ01ESUQsCiAJCQkJICBzeW5jX2ZsYWcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfYWRkX2tya19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCAqa3JrKQoraW50IGF0aDZrbF93bWlfYWRkX2tya19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4ICprcmspCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2FkZF9rcmtfY21kICpjbWQ7CkBAIC0xOTY0LDEyICsyMTQ4LDEzIEBACiAJY21kID0gKHN0cnVjdCB3bWlfYWRkX2tya19jbWQgKikgc2tiLT5kYXRhOwogCW1lbWNweShjbWQtPmtyaywga3JrLCBXTUlfS1JLX0xFTik7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfQUREX0tSS19DTURJRCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9BRERfS1JLX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2RlbGV0ZWtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBrZXlfaW5kZXgpCitpbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBrZXlfaW5kZXgpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2RlbGV0ZV9jaXBoZXJfa2V5X2NtZCAqY21kOwpAQCAtMTk4NSwxMyArMjE3MCwxMyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX2RlbGV0ZV9jaXBoZXJfa2V5X2NtZCAqKSBza2ItPmRhdGE7CiAJY21kLT5rZXlfaW5kZXggPSBrZXlfaW5kZXg7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfREVMRVRFX0NJUEhFUl9LRVlfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfREVMRVRFX0NJUEhFUl9LRVlfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0cG1raWRfY21kKHN0cnVjdCB3bWkgKndtaSwgY29uc3QgdTggKmJzc2lkLAoraW50IGF0aDZrbF93bWlfc2V0cG1raWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICAgY29uc3QgdTggKnBta2lkLCBib29sIHNldCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMjAxOCwxNCArMjIwMywxNCBAQAogCQljbWQtPmVuYWJsZSA9IFBNS0lEX0RJU0FCTEU7CiAJfQogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9QTUtJRF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfUE1LSURfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX2RhdGFfc3luY19zZW5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVwX2lkKQorCQkJICAgICAgZW51bSBodGNfZW5kcG9pbnRfaWQgZXBfaWQsIHU4IGlmX2lkeCkKIHsKIAlzdHJ1Y3Qgd21pX2RhdGFfaGRyICpkYXRhX2hkcjsKIAlpbnQgcmV0OwpAQCAtMjAzNywxNCArMjIyMiwxNCBAQAogCiAJZGF0YV9oZHIgPSAoc3RydWN0IHdtaV9kYXRhX2hkciAqKSBza2ItPmRhdGE7CiAJZGF0YV9oZHItPmluZm8gPSBTWU5DX01TR1RZUEUgPDwgV01JX0RBVEFfSERSX01TR19UWVBFX1NISUZUOwotCWRhdGFfaGRyLT5pbmZvMyA9IDA7CisJZGF0YV9oZHItPmluZm8zID0gY3B1X3RvX2xlMTYoaWZfaWR4ICYgV01JX0RBVEFfSERSX0lGX0lEWF9NQVNLKTsKIAogCXJldCA9IGF0aDZrbF9jb250cm9sX3R4KHdtaS0+cGFyZW50X2Rldiwgc2tiLCBlcF9pZCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc3luY19wb2ludChzdHJ1Y3Qgd21pICp3bWkpCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc3luY19wb2ludChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc3luY19jbWQgKmNtZDsKQEAgLTIxMDAsNyArMjI4NSw3IEBACiAJICogU2VuZCBzeW5jIGNtZCBmb2xsb3dlZCBieSBzeW5jIGRhdGEgbWVzc2FnZXMgb24gYWxsCiAJICogZW5kcG9pbnRzIGJlaW5nIHVzZWQKIAkgKi8KLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU1lOQ0hST05JWkVfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU1lOQ0hST05JWkVfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJaWYgKHJldCkKQEAgLTIxMTksNyArMjMwNCw3IEBACiAJCQkJCSAgICAgICB0cmFmZmljX2NsYXNzKTsKIAkJcmV0ID0KIAkJICAgIGF0aDZrbF93bWlfZGF0YV9zeW5jX3NlbmQod21pLCBkYXRhX3N5bmNfYnVmc1tpbmRleF0uc2tiLAotCQkJCQkgICAgICBlcF9pZCk7CisJCQkJCSAgICAgIGVwX2lkLCBpZl9pZHgpOwogCiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTIxNDIsNyArMjMyNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwKK2ludCBhdGg2a2xfd21pX2NyZWF0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKIAkJCQkgIHN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kICpwYXJhbXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTIyMzEsMTIgKzI0MTYsMTMgQEAKIAkJYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHdtaS0+cGFyZW50X2RldiwKIAkJCQkJICAgIHBhcmFtcy0+dHJhZmZpY19jbGFzcywgdHJ1ZSk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfQ1JFQVRFX1BTVFJFQU1fQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQ1JFQVRFX1BTVFJFQU1fQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRyYWZmaWNfY2xhc3MsIHU4IHRzaWQpCitpbnQgYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRyYWZmaWNfY2xhc3MsCisJCQkJICB1OCB0c2lkKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9kZWxldGVfcHN0cmVhbV9jbWQgKmNtZDsKQEAgLTIyNzIsNyArMjQ1OCw3IEBACiAJCSAgICJzZW5kaW5nIGRlbGV0ZV9wc3RyZWFtX2NtZDogdHJhZmZpYyBjbGFzczogJWQgdHNpZD0lZFxuIiwKIAkJICAgdHJhZmZpY19jbGFzcywgdHNpZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfREVMRVRFX1BTVFJFQU1fQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfREVMRVRFX1BTVFJFQU1fQ01ESUQsCiAJCQkJICBTWU5DX0JFRk9SRV9XTUlGTEFHKTsKIAogCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKQEAgLTIzMTEsMTcgKzI0OTcsMTczIEBACiAJY21kID0gKHN0cnVjdCB3bWlfc2V0X2lwX2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtZCwgaXBfY21kLCBzaXplb2Yoc3RydWN0IHdtaV9zZXRfaXBfY21kKSk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX0lQX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfSVBfQ01ESUQsCisJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9nZXRfd293X2xpc3RfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqIGRhdGFwLAotCQkJCQkgICAgaW50IGxlbikKK3N0YXRpYyB2b2lkIGF0aDZrbF93bWlfcmVsaW5xdWlzaF9pbXBsaWNpdF9wc3RyZWFtX2NyZWRpdHMoc3RydWN0IHdtaSAqd21pKQogewotCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IHdtaV9nZXRfd293X2xpc3RfcmVwbHkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwl1MTYgYWN0aXZlX3RzaWRzOworCXU4IHN0cmVhbV9leGlzdDsKKwlpbnQgaTsKIAotCXJldHVybiAwOworCS8qCisJICogUmVsaW5xdWlzaCBjcmVkaXRzIGZyb20gYWxsIGltcGxpY2l0bHkgY3JlYXRlZCBwc3RyZWFtcworCSAqIHNpbmNlIHdoZW4gd2UgZ28gdG8gc2xlZXAuIElmIHVzZXIgY3JlYXRlZCBleHBsaWNpdAorCSAqIHRoaW5zdHJlYW1zIGV4aXN0cyB3aXRoIGluIGEgZmF0cGlwZSBsZWF2ZSB0aGVtIGludGFjdAorCSAqIGZvciB0aGUgdXNlciB0byBkZWxldGUuCisJICovCisJc3Bpbl9sb2NrX2JoKCZ3bWktPmxvY2spOworCXN0cmVhbV9leGlzdCA9IHdtaS0+ZmF0X3BpcGVfZXhpc3Q7CisJc3Bpbl91bmxvY2tfYmgoJndtaS0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV01NX05VTV9BQzsgaSsrKSB7CisJCWlmIChzdHJlYW1fZXhpc3QgJiAoMSA8PCBpKSkgeworCisJCQkvKgorCQkJICogRklYTUU6IElzIHRoaXMgbG9jayAmIHVubG9jayBpbnNpZGUKKwkJCSAqIGZvciBsb29wIGNvcnJlY3Q/IG1heSBuZWVkIHJld29yay4KKwkJCSAqLworCQkJc3Bpbl9sb2NrX2JoKCZ3bWktPmxvY2spOworCQkJYWN0aXZlX3RzaWRzID0gd21pLT5zdHJlYW1fZXhpc3RfZm9yX2FjW2ldOworCQkJc3Bpbl91bmxvY2tfYmgoJndtaS0+bG9jayk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBhcmUgbm8gdXNlciBjcmVhdGVkIHRoaW4gc3RyZWFtcworCQkJICogZGVsZXRlIHRoZSBmYXRwaXBlCisJCQkgKi8KKwkJCWlmICghYWN0aXZlX3RzaWRzKSB7CisJCQkJc3RyZWFtX2V4aXN0ICY9IH4oMSA8PCBpKTsKKwkJCQkvKgorCQkJCSAqIEluZGljYXRlIGluYWN0aXZpdHkgdG8gZHJpdmVyIGxheWVyIGZvcgorCQkJCSAqIHRoaXMgZmF0cGlwZSAocHN0cmVhbSkKKwkJCQkgKi8KKwkJCQlhdGg2a2xfaW5kaWNhdGVfdHhfYWN0aXZpdHkod21pLT5wYXJlbnRfZGV2LAorCQkJCQkJCSAgICBpLCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGSVhNRTogQ2FuIHdlIGRvIHRoaXMgYXNzaWdubWVudCB3aXRob3V0IGxvY2tpbmcgPyAqLworCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKKwl3bWktPmZhdF9waXBlX2V4aXN0ID0gc3RyZWFtX2V4aXN0OworCXNwaW5fdW5sb2NrX2JoKCZ3bWktPmxvY2spOworfQorCitpbnQgYXRoNmtsX3dtaV9zZXRfaG9zdF9zbGVlcF9tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICAgICAgZW51bSBhdGg2a2xfaG9zdF9tb2RlIGhvc3RfbW9kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQgKmNtZDsKKwlpbnQgcmV0OworCisJaWYgKChob3N0X21vZGUgIT0gQVRINktMX0hPU1RfTU9ERV9BU0xFRVApICYmCisJICAgIChob3N0X21vZGUgIT0gQVRINktMX0hPU1RfTU9ERV9BV0FLRSkpIHsKKwkJYXRoNmtsX2VycigiaW52YWxpZCBob3N0IHNsZWVwIG1vZGU6ICVkXG4iLCBob3N0X21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCB3bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQgKikgc2tiLT5kYXRhOworCisJaWYgKGhvc3RfbW9kZSA9PSBBVEg2S0xfSE9TVF9NT0RFX0FTTEVFUCkgeworCQlhdGg2a2xfd21pX3JlbGlucXVpc2hfaW1wbGljaXRfcHN0cmVhbV9jcmVkaXRzKHdtaSk7CisJCWNtZC0+YXNsZWVwID0gY3B1X3RvX2xlMzIoMSk7CisJfSBlbHNlCisJCWNtZC0+YXdha2UgPSBjcHVfdG9fbGUzMigxKTsKKworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwKKwkJCQkgIFdNSV9TRVRfSE9TVF9TTEVFUF9NT0RFX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRoNmtsX3dtaV9zZXRfd293X21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCWVudW0gYXRoNmtsX3dvd19tb2RlIHdvd19tb2RlLAorCQkJCXUzMiBmaWx0ZXIsIHUxNiBob3N0X3JlcV9kZWxheSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfc2V0X3dvd19tb2RlX2NtZCAqY21kOworCWludCByZXQ7CisKKwlpZiAoKHdvd19tb2RlICE9IEFUSDZLTF9XT1dfTU9ERV9FTkFCTEUpICYmCisJICAgICB3b3dfbW9kZSAhPSBBVEg2S0xfV09XX01PREVfRElTQUJMRSkgeworCQlhdGg2a2xfZXJyKCJpbnZhbGlkIHdvdyBtb2RlOiAlZFxuIiwgd293X21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCB3bWlfc2V0X3dvd19tb2RlX2NtZCAqKSBza2ItPmRhdGE7CisJY21kLT5lbmFibGVfd293ID0gY3B1X3RvX2xlMzIod293X21vZGUpOworCWNtZC0+ZmlsdGVyID0gY3B1X3RvX2xlMzIoZmlsdGVyKTsKKwljbWQtPmhvc3RfcmVxX2RlbGF5ID0gY3B1X3RvX2xlMTYoaG9zdF9yZXFfZGVsYXkpOworCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1dPV19NT0RFX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRoNmtsX3dtaV9hZGRfd293X3BhdHRlcm5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgIHU4IGxpc3RfaWQsIHU4IGZpbHRlcl9zaXplLAorCQkJCSAgIHU4IGZpbHRlcl9vZmZzZXQsIHU4ICpmaWx0ZXIsIHU4ICptYXNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHdtaV9hZGRfd293X3BhdHRlcm5fY21kICpjbWQ7CisJdTE2IHNpemU7CisJdTggKmZpbHRlcl9tYXNrOworCWludCByZXQ7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5IGluIHRoZSBidWZmZXIgdG8gaG9sZAorCSAqIGZpbHRlciBhbmQgbWFzayB2YWx1ZSwgd2hpY2ggaXMgdHdpY2Ugb2YgZmlsdGVyX3NpemUuCisJICovCisJc2l6ZSA9IHNpemVvZigqY21kKSArICgyICogZmlsdGVyX3NpemUpOworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWQgPSAoc3RydWN0IHdtaV9hZGRfd293X3BhdHRlcm5fY21kICopIHNrYi0+ZGF0YTsKKwljbWQtPmZpbHRlcl9saXN0X2lkID0gbGlzdF9pZDsKKwljbWQtPmZpbHRlcl9zaXplID0gZmlsdGVyX3NpemU7CisJY21kLT5maWx0ZXJfb2Zmc2V0ID0gZmlsdGVyX29mZnNldDsKKworCW1lbWNweShjbWQtPmZpbHRlciwgZmlsdGVyLCBmaWx0ZXJfc2l6ZSk7CisKKwlmaWx0ZXJfbWFzayA9ICh1OCAqKSAoY21kLT5maWx0ZXIgKyBmaWx0ZXJfc2l6ZSk7CisJbWVtY3B5KGZpbHRlcl9tYXNrLCBtYXNrLCBmaWx0ZXJfc2l6ZSk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9BRERfV09XX1BBVFRFUk5fQ01ESUQsCisJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF93bWlfZGVsX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1MTYgbGlzdF9pZCwgdTE2IGZpbHRlcl9pZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfZGVsX3dvd19wYXR0ZXJuX2NtZCAqY21kOworCWludCByZXQ7CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCB3bWlfZGVsX3dvd19wYXR0ZXJuX2NtZCAqKSBza2ItPmRhdGE7CisJY21kLT5maWx0ZXJfbGlzdF9pZCA9IGNwdV90b19sZTE2KGxpc3RfaWQpOworCWNtZC0+ZmlsdGVyX2lkID0gY3B1X3RvX2xlMTYoZmlsdGVyX2lkKTsKKworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0RFTF9XT1dfUEFUVEVSTl9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX2NtZF9zZW5kX3h0bmQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjMzNiw3ICsyNjc4LDcgQEAKIAljbWRfaGRyID0gKHN0cnVjdCB3bWl4X2NtZF9oZHIgKikgc2tiLT5kYXRhOwogCWNtZF9oZHItPmNtZF9pZCA9IGNwdV90b19sZTMyKGNtZF9pZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfRVhURU5TSU9OX0NNRElELCBzeW5jX2ZsYWcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9FWFRFTlNJT05fQ01ESUQsIHN5bmNfZmxhZyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjM3OSwxMiArMjcyMSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCkKIHsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0dFVF9TVEFUSVNUSUNTX0NNRElEKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgaWZfaWR4LCBXTUlfR0VUX1NUQVRJU1RJQ1NfQ01ESUQpOwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGRiTSkKK2ludCBhdGg2a2xfd21pX3NldF90eF9wd3JfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBkYk0pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF90eF9wd3JfY21kICpjbWQ7CkBAIC0yMzk3LDE4ICsyNzM5LDI0IEBACiAJY21kID0gKHN0cnVjdCB3bWlfc2V0X3R4X3B3cl9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+ZGJNID0gZGJNOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9UWF9QV1JfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1RYX1BXUl9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWkpCitpbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCkKIHsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0dFVF9UWF9QV1JfQ01ESUQpOworCXJldHVybiBhdGg2a2xfd21pX3NpbXBsZV9jbWQod21pLCBpZl9pZHgsIFdNSV9HRVRfVFhfUFdSX0NNRElEKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBzdGF0dXMsIHU4IHByZWFtYmxlX3BvbGljeSkKK2ludCBhdGg2a2xfd21pX2dldF9yb2FtX3RibF9jbWQoc3RydWN0IHdtaSAqd21pKQoreworCXJldHVybiBhdGg2a2xfd21pX3NpbXBsZV9jbWQod21pLCAwLCBXTUlfR0VUX1JPQU1fVEJMX0NNRElEKTsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHN0YXR1cywKKwkJCQkgdTggcHJlYW1ibGVfcG9saWN5KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZXRfbHByZWFtYmxlX2NtZCAqY21kOwpAQCAtMjQyMiw3ICsyNzcwLDcgQEAKIAljbWQtPnN0YXR1cyA9IHN0YXR1czsKIAljbWQtPnByZWFtYmxlX3BvbGljeSA9IHByZWFtYmxlX3BvbGljeTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfTFBSRUFNQkxFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9MUFJFQU1CTEVfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNDQwLDExICsyNzg4LDEyIEBACiAJY21kID0gKHN0cnVjdCB3bWlfc2V0X3J0c19jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+dGhyZXNob2xkID0gY3B1X3RvX2xlMTYodGhyZXNob2xkKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUlRTX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUlRTX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZXRfd21tX3R4b3Aoc3RydWN0IHdtaSAqd21pLCBlbnVtIHdtaV90eG9wX2NmZyBjZmcpCitpbnQgYXRoNmtsX3dtaV9zZXRfd21tX3R4b3Aoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGVudW0gd21pX3R4b3BfY2ZnIGNmZykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc2V0X3dtbV90eG9wX2NtZCAqY21kOwpAQCAtMjQ2MCwxMiArMjgwOSwxMyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF93bW1fdHhvcF9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+dHhvcF9lbmFibGUgPSBjZmc7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1dNTV9UWE9QX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9XTU1fVFhPUF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X2tlZXBhbGl2ZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBrZWVwX2FsaXZlX2ludHZsKQoraW50IGF0aDZrbF93bWlfc2V0X2tlZXBhbGl2ZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJIHU4IGtlZXBfYWxpdmVfaW50dmwpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF9rZWVwYWxpdmVfY21kICpjbWQ7CkBAIC0yNDc3LDEwICsyODI3LDEzIEBACiAKIAljbWQgPSAoc3RydWN0IHdtaV9zZXRfa2VlcGFsaXZlX2NtZCAqKSBza2ItPmRhdGE7CiAJY21kLT5rZWVwX2FsaXZlX2ludHZsID0ga2VlcF9hbGl2ZV9pbnR2bDsKLQl3bWktPmtlZXBfYWxpdmVfaW50dmwgPSBrZWVwX2FsaXZlX2ludHZsOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9LRUVQQUxJVkVfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX0tFRVBBTElWRV9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisKKwlpZiAocmV0ID09IDApCisJCWF0aDZrbF9kZWJ1Z19zZXRfa2VlcGFsaXZlKHdtaS0+cGFyZW50X2Rldiwga2VlcF9hbGl2ZV9pbnR2bCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDk1LDcgKzI4NDgsNyBAQAogCiAJbWVtY3B5KHNrYi0+ZGF0YSwgYnVmLCBsZW4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1RFU1RfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1RFU1RfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjUyOCwyOCArMjg4MSwzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfYWRkYmFfcmVxX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9hZGRiYV9yZXFfZXZlbnQgKmNtZCA9IChzdHJ1Y3Qgd21pX2FkZGJhX3JlcV9ldmVudCAqKSBkYXRhcDsKIAotCWFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHdtaS0+cGFyZW50X2RldiwgY21kLT50aWQsCisJYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQodmlmLCBjbWQtPnRpZCwKIAkJCQlsZTE2X3RvX2NwdShjbWQtPnN0X3NlcV9ubyksIGNtZC0+d2luX3N6KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfZGVsYmFfcmVxX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX2RlbGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9kZWxiYV9ldmVudCAqY21kID0gKHN0cnVjdCB3bWlfZGVsYmFfZXZlbnQgKikgZGF0YXA7CiAKLQlhZ2dyX3JlY3ZfZGVsYmFfcmVxX2V2dCh3bWktPnBhcmVudF9kZXYsIGNtZC0+dGlkKTsKKwlhZ2dyX3JlY3ZfZGVsYmFfcmVxX2V2dCh2aWYsIGNtZC0+dGlkKTsKIAogCXJldHVybiAwOwogfQogCiAvKiAgQVAgbW9kZSBmdW5jdGlvbnMgKi8KIAotaW50IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoc3RydWN0IHdtaSAqd21pcCwgc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqcCkKK2ludCBhdGg2a2xfd21pX2FwX3Byb2ZpbGVfY29tbWl0KHN0cnVjdCB3bWkgKndtaXAsIHU4IGlmX2lkeCwKKwkJCQkgc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqcCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKmNtOwpAQCAtMjU2Miw3ICsyOTE4LDcgQEAKIAljbSA9IChzdHJ1Y3Qgd21pX2Nvbm5lY3RfY21kICopIHNrYi0+ZGF0YTsKIAltZW1jcHkoY20sIHAsIHNpemVvZigqY20pKTsKIAotCXJlcyA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pcCwgc2tiLCBXTUlfQVBfQ09ORklHX0NPTU1JVF9DTURJRCwKKwlyZXMgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIGlmX2lkeCwgc2tiLCBXTUlfQVBfQ09ORklHX0NPTU1JVF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIiVzOiBud190eXBlPSV1IGF1dGhfbW9kZT0ldSBjaD0ldSAiCiAJCSAgICJjdHJsX2ZsYWdzPTB4JXgtPiByZXM9JWRcbiIsCkBAIC0yNTcxLDcgKzI5MjcsOCBAQAogCXJldHVybiByZXM7CiB9CiAKLWludCBhdGg2a2xfd21pX2FwX3NldF9tbG1lKHN0cnVjdCB3bWkgKndtaXAsIHU4IGNtZCwgY29uc3QgdTggKm1hYywgdTE2IHJlYXNvbikKK2ludCBhdGg2a2xfd21pX2FwX3NldF9tbG1lKHN0cnVjdCB3bWkgKndtaXAsIHU4IGlmX2lkeCwgdTggY21kLCBjb25zdCB1OCAqbWFjLAorCQkJICAgdTE2IHJlYXNvbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfYXBfc2V0X21sbWVfY21kICpjbTsKQEAgLTI1ODUsMTEgKzI5NDIsMTIgQEAKIAljbS0+cmVhc29uID0gY3B1X3RvX2xlMTYocmVhc29uKTsKIAljbS0+Y21kID0gY21kOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pcCwgc2tiLCBXTUlfQVBfU0VUX01MTUVfQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pcCwgaWZfaWR4LCBza2IsIFdNSV9BUF9TRVRfTUxNRV9DTURJRCwKIAkJCQkgICBOT19TWU5DX1dNSUZMQUcpOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfcHNwb2xsX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3BzcG9sbF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkgICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfcHNwb2xsX2V2ZW50ICpldjsKIApAQCAtMjU5OCwxOSArMjk1NiwyMSBAQAogCiAJZXYgPSAoc3RydWN0IHdtaV9wc3BvbGxfZXZlbnQgKikgZGF0YXA7CiAKLQlhdGg2a2xfcHNwb2xsX2V2ZW50KHdtaS0+cGFyZW50X2RldiwgbGUxNl90b19jcHUoZXYtPmFpZCkpOworCWF0aDZrbF9wc3BvbGxfZXZlbnQodmlmLCBsZTE2X3RvX2NwdShldi0+YWlkKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfZHRpbWV4cGlyeV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCWF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHdtaS0+cGFyZW50X2Rldik7CisJYXRoNmtsX2R0aW1leHBpcnlfZXZlbnQodmlmKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiBhaWQsIGJvb2wgZmxhZykKK2ludCBhdGg2a2xfd21pX3NldF9wdmJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgYWlkLAorCQkJICAgYm9vbCBmbGFnKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9hcF9zZXRfcHZiX2NtZCAqY21kOwpAQCAtMjYyNSwxMyArMjk4NSwxNCBAQAogCWNtZC0+cnN2ZCA9IGNwdV90b19sZTE2KDApOwogCWNtZC0+ZmxhZyA9IGNwdV90b19sZTMyKGZsYWcpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0FQX1NFVF9QVkJfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQVBfU0VUX1BWQl9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCByeF9tZXRhX3ZlciwKK2ludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICB1OCByeF9tZXRhX3ZlciwKIAkJCQkgICAgICAgYm9vbCByeF9kb3QxMV9oZHIsIGJvb2wgZGVmcmFnX29uX2hvc3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTI2NDgsMTQgKzMwMDksMTQgQEAKIAljbWQtPm1ldGFfdmVyID0gcnhfbWV0YV92ZXI7CiAKIAkvKiBEZWxldGUgdGhlIGxvY2FsIGFnZ3Igc3RhdGUsIG9uIGhvc3QgKi8KLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfUlhfRlJBTUVfRk9STUFUX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1JYX0ZSQU1FX0ZPUk1BVF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggbWdtdF9mcm1fdHlwZSwgY29uc3QgdTggKmllLAotCQkJICAgICB1OCBpZV9sZW4pCitpbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBtZ210X2ZybV90eXBlLAorCQkJICAgICBjb25zdCB1OCAqaWUsIHU4IGllX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc2V0X2FwcGllX2NtZCAqcDsKQEAgLTI2NjksOCArMzAzMCwxMSBAQAogCXAgPSAoc3RydWN0IHdtaV9zZXRfYXBwaWVfY21kICopIHNrYi0+ZGF0YTsKIAlwLT5tZ210X2ZybV90eXBlID0gbWdtdF9mcm1fdHlwZTsKIAlwLT5pZV9sZW4gPSBpZV9sZW47Ci0JbWVtY3B5KHAtPmllX2luZm8sIGllLCBpZV9sZW4pOwotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX0FQUElFX0NNRElELAorCisJaWYgKGllICE9IE5VTEwgJiYgaWVfbGVuID4gMCkKKwkJbWVtY3B5KHAtPmllX2luZm8sIGllLCBpZV9sZW4pOworCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9BUFBJRV9DTURJRCwKIAkJCQkgICBOT19TWU5DX1dNSUZMQUcpOwogfQogCkBAIC0yNjg4LDExICszMDUyLDExIEBACiAJY21kID0gKHN0cnVjdCB3bWlfZGlzYWJsZV8xMWJfcmF0ZXNfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRpc2FibGUgPSBkaXNhYmxlID8gMSA6IDA7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RJU0FCTEVfMTFCX1JBVEVTX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfRElTQUJMRV8xMUJfUkFURVNfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGZyZXEsIHUzMiBkdXIpCitpbnQgYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBmcmVxLCB1MzIgZHVyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9yZW1haW5fb25fY2hubF9jbWQgKnA7CkBAIC0yNzA2LDEyICszMDcwLDE2IEBACiAJcCA9IChzdHJ1Y3Qgd21pX3JlbWFpbl9vbl9jaG5sX2NtZCAqKSBza2ItPmRhdGE7CiAJcC0+ZnJlcSA9IGNwdV90b19sZTMyKGZyZXEpOwogCXAtPmR1cmF0aW9uID0gY3B1X3RvX2xlMzIoZHVyKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JFTUFJTl9PTl9DSE5MX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SRU1BSU5fT05fQ0hOTF9DTURJRCwKIAkJCQkgICBOT19TWU5DX1dNSUZMQUcpOwogfQogCi1pbnQgYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgaWQsIHUzMiBmcmVxLCB1MzIgd2FpdCwKLQkJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQorLyogYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQgaXMgdG8gYmUgZGVwcmVjYXRlZC4gVXNlCisgKiBhdGg2a2xfd21pX3NlbmRfbWdtdF9jbWQgaW5zdGVhZC4gVGhlIG5ldyBmdW5jdGlvbiBzdXBwb3J0cyBQMlAKKyAqIG1nbXQgb3BlcmF0aW9ucyB1c2luZyBzdGF0aW9uIGludGVyZmFjZS4KKyAqLworaW50IGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaWQsIHUzMiBmcmVxLAorCQkJICAgICAgIHUzMiB3YWl0LCBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZW5kX2FjdGlvbl9jbWQgKnA7CkBAIC0yNzMxLDYgKzMwOTksNyBAQAogCX0KIAogCWtmcmVlKHdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lKTsKKwltZW1jcHkoYnVmLCBkYXRhLCBkYXRhX2xlbik7CiAJd21pLT5sYXN0X21nbXRfdHhfZnJhbWUgPSBidWY7CiAJd21pLT5sYXN0X21nbXRfdHhfZnJhbWVfbGVuID0gZGF0YV9sZW47CiAKQEAgLTI3NDIsMTggKzMxMTEsNjEgQEAKIAlwLT53YWl0ID0gY3B1X3RvX2xlMzIod2FpdCk7CiAJcC0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwogCW1lbWNweShwLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRU5EX0FDVElPTl9DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VORF9BQ1RJT05fQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgZnJlcSwKLQkJCQkgICAgICAgY29uc3QgdTggKmRzdCwKLQkJCQkgICAgICAgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbikKK2ludCBhdGg2a2xfd21pX3NlbmRfbWdtdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBpZCwgdTMyIGZyZXEsCisJCQkgICAgICAgdTMyIHdhaXQsIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4sCisJCQkgICAgICAgdTMyIG5vX2NjaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfc2VuZF9tZ210X2NtZCAqcDsKKwl1OCAqYnVmOworCisJaWYgKHdhaXQpCisJCXJldHVybiAtRUlOVkFMOyAvKiBPZmZsb2FkIGZvciB3YWl0IG5vdCBzdXBwb3J0ZWQgKi8KKworCWJ1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoc2l6ZW9mKCpwKSArIGRhdGFfbGVuKTsKKwlpZiAoIXNrYikgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlrZnJlZSh3bWktPmxhc3RfbWdtdF90eF9mcmFtZSk7CisJbWVtY3B5KGJ1ZiwgZGF0YSwgZGF0YV9sZW4pOworCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lID0gYnVmOworCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lX2xlbiA9IGRhdGFfbGVuOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgInNlbmRfYWN0aW9uX2NtZDogaWQ9JXUgZnJlcT0ldSB3YWl0PSV1ICIKKwkJICAgImxlbj0ldVxuIiwgaWQsIGZyZXEsIHdhaXQsIGRhdGFfbGVuKTsKKwlwID0gKHN0cnVjdCB3bWlfc2VuZF9tZ210X2NtZCAqKSBza2ItPmRhdGE7CisJcC0+aWQgPSBjcHVfdG9fbGUzMihpZCk7CisJcC0+ZnJlcSA9IGNwdV90b19sZTMyKGZyZXEpOworCXAtPndhaXQgPSBjcHVfdG9fbGUzMih3YWl0KTsKKwlwLT5ub19jY2sgPSBjcHVfdG9fbGUzMihub19jY2spOworCXAtPmxlbiA9IGNwdV90b19sZTE2KGRhdGFfbGVuKTsKKwltZW1jcHkocC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW4pOworCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRU5EX01HTVRfQ01ESUQsCisJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKK30KKworaW50IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBmcmVxLAorCQkJCSAgICAgICBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqZGF0YSwKKwkJCQkgICAgICAgdTE2IGRhdGFfbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9wMnBfcHJvYmVfcmVzcG9uc2VfY21kICpwOworCXNpemVfdCBjbWRfbGVuID0gc2l6ZW9mKCpwKSArIGRhdGFfbGVuOwogCi0Jc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKnApICsgZGF0YV9sZW4pOworCWlmIChkYXRhX2xlbiA9PSAwKQorCQljbWRfbGVuKys7IC8qIHdvcmsgYXJvdW5kIHRhcmdldCBtaW5pbXVtIGxlbmd0aCByZXF1aXJlbWVudCAqLworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihjbWRfbGVuKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI3NjQsMTEgKzMxNzYsMTIgQEAKIAltZW1jcHkocC0+ZGVzdGluYXRpb25fYWRkciwgZHN0LCBFVEhfQUxFTik7CiAJcC0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwogCW1lbWNweShwLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRU5EX1BST0JFX1JFU1BPTlNFX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsCisJCQkJICAgV01JX1NFTkRfUFJPQkVfUkVTUE9OU0VfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCBib29sIGVuYWJsZSkKK2ludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcHJvYmVfcmVxX3JlcG9ydF9jbWQgKnA7CkBAIC0yNzgxLDExICszMTk0LDExIEBACiAJCSAgIGVuYWJsZSk7CiAJcCA9IChzdHJ1Y3Qgd21pX3Byb2JlX3JlcV9yZXBvcnRfY21kICopIHNrYi0+ZGF0YTsKIAlwLT5lbmFibGUgPSBlbmFibGUgPyAxIDogMDsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1BST0JFX1JFUV9SRVBPUlRfQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1BST0JFX1JFUV9SRVBPUlRfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGluZm9fcmVxX2ZsYWdzKQoraW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaW5mb19yZXFfZmxhZ3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2dldF9wMnBfaW5mbyAqcDsKQEAgLTI3OTgsMTQgKzMyMTEsMTUgQEAKIAkJICAgaW5mb19yZXFfZmxhZ3MpOwogCXAgPSAoc3RydWN0IHdtaV9nZXRfcDJwX2luZm8gKikgc2tiLT5kYXRhOwogCXAtPmluZm9fcmVxX2ZsYWdzID0gY3B1X3RvX2xlMzIoaW5mb19yZXFfZmxhZ3MpOwotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfR0VUX1AyUF9JTkZPX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9HRVRfUDJQX0lORk9fQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWkpCitpbnQgYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJjYW5jZWxfcmVtYWluX29uX2NobmxfY21kXG4iKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgV01JX0NBTkNFTF9SRU1BSU5fT05fQ0hOTF9DTURJRCk7CisJcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwKKwkJCQkgICAgIFdNSV9DQU5DRUxfUkVNQUlOX09OX0NITkxfQ01ESUQpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF93bWlfY29udHJvbF9yeF94dG5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTI4MTgsNyArMzIzMiw2IEBACiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHdtaXhfY21kX2hkcikpIHsKIAkJYXRoNmtsX2VycigiYmFkIHBhY2tldCAxXG4iKTsKLQkJd21pLT5zdGF0LmNtZF9sZW5fZXJyKys7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg0MCw3ICszMjUzLDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYXRoNmtsX3dhcm4oInVua25vd24gY21kIGlkIDB4JXhcbiIsIGlkKTsKLQkJd21pLT5zdGF0LmNtZF9pZF9lcnIrKzsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQpAQCAtMjg0OCwxMiArMzI2MCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9yb2FtX3RibF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3sKKwlyZXR1cm4gYXRoNmtsX2RlYnVnX3JvYW1fdGJsX2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZGF0YXAsIGxlbik7Cit9CisKIC8qIENvbnRyb2wgUGF0aCAqLwogaW50IGF0aDZrbF93bWlfY29udHJvbF9yeChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpjbWQ7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAl1MzIgbGVuOwogCXUxNiBpZDsKKwl1OCBpZl9pZHg7CiAJdTggKmRhdGFwOwogCWludCByZXQgPSAwOwogCkBAIC0yODYzLDEyICszMjgyLDEyIEBACiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfY21kX2hkcikpIHsKIAkJYXRoNmtsX2VycigiYmFkIHBhY2tldCAxXG4iKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwotCQl3bWktPnN0YXQuY21kX2xlbl9lcnIrKzsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY21kID0gKHN0cnVjdCB3bWlfY21kX2hkciAqKSBza2ItPmRhdGE7CiAJaWQgPSBsZTE2X3RvX2NwdShjbWQtPmNtZF9pZCk7CisJaWZfaWR4ID0gbGUxNl90b19jcHUoY21kLT5pbmZvMSkgJiBXTUlfQ01EX0hEUl9JRl9JRF9NQVNLOwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHdtaV9jbWRfaGRyKSk7CiAKQEAgLTI4NzksNiArMzI5OCwxNSBAQAogCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1dNSV9EVU1QLCBOVUxMLCAid21pIHJ4ICIsCiAJCQlkYXRhcCwgbGVuKTsKIAorCXZpZiA9IGF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KHdtaS0+cGFyZW50X2RldiwgaWZfaWR4KTsKKwlpZiAoIXZpZikgeworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLAorCQkJICAgIldtaSBldmVudCBmb3IgdW5hdmFpbGFibGUgdmlmLCB2aWZfaW5kZXg6JWRcbiIsCisJCQkgICAgaWZfaWR4KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBXTUlfR0VUX0JJVFJBVEVfQ01ESUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfR0VUX0JJVFJBVEVfQ01ESURcbiIpOwpAQCAtMjg5OCwxMSArMzMyNiwxMSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9DT05ORUNUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQ09OTkVDVF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9jb25uZWN0X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfY29ubmVjdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0RJU0NPTk5FQ1RfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9ESVNDT05ORUNUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUEVFUl9OT0RFX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUEVFUl9OT0RFX0VWRU5USURcbiIpOwpAQCAtMjkxMCwxMSArMzMzOCwxMSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9US0lQX01JQ0VSUl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1RLSVBfTUlDRVJSX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfdGtpcF9taWNlcnJfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9CU1NJTkZPX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQlNTSU5GT19FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9ic3NpbmZvX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfYnNzaW5mb19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1JFR0RPTUFJTl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JFR0RPTUFJTl9FVkVOVElEXG4iKTsKQEAgLTI5MjYsMTEgKzMzNTQsMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfTkVJR0hCT1JfUkVQT1JUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfTkVJR0hCT1JfUkVQT1JUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sCisJCQkJCQkJICB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfU0NBTl9DT01QTEVURV9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9zY2FuX2NvbXBsZXRlX3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfc2Nhbl9jb21wbGV0ZV9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0NNREVSUk9SX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQ01ERVJST1JfRVZFTlRJRFxuIik7CkBAIC0yOTM4LDcgKzMzNjcsNyBAQAogCQlicmVhazsKIAljYXNlIFdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JFUE9SVF9TVEFUSVNUSUNTX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3N0YXRzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9SU1NJX1RIUkVTSE9MRF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JTU0lfVEhSRVNIT0xEX0VWRU5USURcbiIpOwpAQCAtMjk1Myw2ICszMzgyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVQT1JUX1JPQU1fVEJMX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUkVQT1JUX1JPQU1fVEJMX0VWRU5USURcbiIpOworCQlyZXQgPSBhdGg2a2xfd21pX3JvYW1fdGJsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0VYVEVOU0lPTl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0VYVEVOU0lPTl9FVkVOVElEXG4iKTsKQEAgLTI5NjAsNyArMzM5MCw3IEBACiAJCWJyZWFrOwogCWNhc2UgV01JX0NBQ19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NBQ19FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9DSEFOTkVMX0NIQU5HRV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NIQU5ORUxfQ0hBTkdFX0VWRU5USURcbiIpOwpAQCAtMjk5Niw3ICszNDI2LDYgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfR0VUX1dPV19MSVNUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfR0VUX1dPV19MSVNUX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2dldF93b3dfbGlzdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOwogCQlicmVhazsKIAljYXNlIFdNSV9HRVRfUE1LSURfTElTVF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0dFVF9QTUtJRF9MSVNUX0VWRU5USURcbiIpOwpAQCAtMzAwNCwyNSArMzQzMywyNSBAQAogCQlicmVhazsKIAljYXNlIFdNSV9QU1BPTExfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9QU1BPTExfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfcHNwb2xsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfcHNwb2xsX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfRFRJTUVYUElSWV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0RUSU1FWFBJUllfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfZHRpbWV4cGlyeV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9TRVRfUEFSQU1TX1JFUExZX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfU0VUX1BBUkFNU19SRVBMWV9FVkVOVElEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQUREQkFfUkVRX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQUREQkFfUkVRX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0FEREJBX1JFU1BfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9BRERCQV9SRVNQX0VWRU5USURcbiIpOwogCQlicmVhazsKIAljYXNlIFdNSV9ERUxCQV9SRVFfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9ERUxCQV9SRVFfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfZGVsYmFfcmVxX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfZGVsYmFfcmVxX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVQT1JUX0JUQ09FWF9DT05GSUdfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwKQEAgLTMwMzgsMjEgKzM0NjcsMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVNQUlOX09OX0NITkxfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9SRU1BSU5fT05fQ0hOTF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQ0FOQ0VMX1JFTUFJTl9PTl9DSE5MX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksCiAJCQkgICAiV01JX0NBTkNFTF9SRU1BSU5fT05fQ0hOTF9FVkVOVElEXG4iKTsKIAkJcmV0ID0gYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfZXZlbnRfcngod21pLCBkYXRhcCwKLQkJCQkJCQkJbGVuKTsKKwkJCQkJCQkJbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9UWF9TVEFUVVNfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9UWF9TVEFUVVNfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUlhfUFJPQkVfUkVRX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUlhfUFJPQkVfUkVRX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1AyUF9DQVBBQklMSVRJRVNfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9QMlBfQ0FQQUJJTElUSUVTX0VWRU5USURcbiIpOwpAQCAtMzA2MCw3ICszNDg5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUlhfQUNUSU9OX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUlhfQUNUSU9OX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3J4X2FjdGlvbl9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3J4X2FjdGlvbl9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1AyUF9JTkZPX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUDJQX0lORk9fRVZFTlRJRFxuIik7CkBAIC0zMDY4LDcgKzM0OTcsNiBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAidW5rbm93biBjbWQgaWQgMHgleFxuIiwgaWQpOwotCQl3bWktPnN0YXQuY21kX2lkX2VycisrOwogCQlyZXQgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0zMDc4LDExICszNTA2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhdGg2a2xfd21pX3Fvc19zdGF0ZV9pbml0KHN0cnVjdCB3bWkgKndtaSkKK3ZvaWQgYXRoNmtsX3dtaV9yZXNldChzdHJ1Y3Qgd21pICp3bWkpCiB7Ci0JaWYgKCF3bWkpCi0JCXJldHVybjsKLQogCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKIAogCXdtaS0+ZmF0X3BpcGVfZXhpc3QgPSAwOwpAQCAtMzEwMywxNiArMzUyOCw5IEBACiAKIAl3bWktPnBhcmVudF9kZXYgPSBkZXY7CiAKLQlhdGg2a2xfd21pX3Fvc19zdGF0ZV9pbml0KHdtaSk7Ci0KIAl3bWktPnB3cl9tb2RlID0gUkVDX1BPV0VSOwotCXdtaS0+cGh5X21vZGUgPSBXTUlfMTFHX01PREU7CiAKLQl3bWktPnBhaXJfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKLQotCXdtaS0+aHRfYWxsb3dlZFtBX0JBTkRfMjRHSFpdID0gMTsKLQl3bWktPmh0X2FsbG93ZWRbQV9CQU5EXzVHSFpdID0gMTsKKwlhdGg2a2xfd21pX3Jlc2V0KHdtaSk7CiAKIAlyZXR1cm4gd21pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmgKaW5kZXggZjhlNjQ0ZC4uNDJhYzMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5oCkBAIC05MywxMSArOTMsNiBAQAogCXU4IGxhc3RfcnNzaV9wb2xsX2V2ZW50OwogfTsKIAotc3RydWN0IHdtaV9zdGF0cyB7Ci0JdTMyIGNtZF9sZW5fZXJyOwotCXUzMiBjbWRfaWRfZXJyOwotfTsKLQogc3RydWN0IHdtaV9kYXRhX3N5bmNfYnVmcyB7CiAJdTggdHJhZmZpY19jbGFzczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTExLDMyICsxMDYsMjYgQEAKICNkZWZpbmUgV01NX0FDX1ZPICAgMwkJLyogdm9pY2UgKi8KIAogc3RydWN0IHdtaSB7Ci0JYm9vbCByZWFkeTsKIAl1MTYgc3RyZWFtX2V4aXN0X2Zvcl9hY1tXTU1fTlVNX0FDXTsKIAl1OCBmYXRfcGlwZV9leGlzdDsKIAlzdHJ1Y3QgYXRoNmtsICpwYXJlbnRfZGV2OwotCXN0cnVjdCB3bWlfc3RhdHMgc3RhdDsKIAl1OCBwd3JfbW9kZTsKLQl1OCBwaHlfbW9kZTsKLQl1OCBrZWVwX2FsaXZlX2ludHZsOwogCXNwaW5sb2NrX3QgbG9jazsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZDsKIAlzdHJ1Y3Qgc3FfdGhyZXNob2xkX3BhcmFtcwogCSAgICBzcV90aHJlc2hsZFtTSUdOQUxfUVVBTElUWV9NRVRSSUNTX05VTV9NQVhdOwotCWVudW0gY3J5cHRvX3R5cGUgcGFpcl9jcnlwdG9fdHlwZTsKLQllbnVtIGNyeXB0b190eXBlIGdycF9jcnlwdG9fdHlwZTsKIAlib29sIGlzX3dtbV9lbmFibGVkOwotCXU4IGh0X2FsbG93ZWRbQV9OVU1fQkFORFNdOwogCXU4IHRyYWZmaWNfY2xhc3M7CiAJYm9vbCBpc19wcm9iZV9zc2lkOwogCiAJdTggKmxhc3RfbWdtdF90eF9mcmFtZTsKIAlzaXplX3QgbGFzdF9tZ210X3R4X2ZyYW1lX2xlbjsKKwl1OCBzYXZlZF9wd3JfbW9kZTsKIH07CiAKIHN0cnVjdCBob3N0X2FwcF9hcmVhIHsKLQl1MzIgd21pX3Byb3RvY29sX3ZlcjsKLX07CisJX19sZTMyIHdtaV9wcm90b2NvbF92ZXI7Cit9IF9fcGFja2VkOwogCiBlbnVtIHdtaV9tc2dfdHlwZSB7CiAJREFUQV9NU0dUWVBFID0gMHgwLApAQCAtMTg0LDYgKzE3Myw4IEBACiAjZGVmaW5lIFdNSV9EQVRBX0hEUl9NRVRBX01BU0sgICAgICAweDcKICNkZWZpbmUgV01JX0RBVEFfSERSX01FVEFfU0hJRlQgICAgIDEzCiAKKyNkZWZpbmUgV01JX0RBVEFfSERSX0lGX0lEWF9NQVNLICAgIDB4RgorCiBzdHJ1Y3Qgd21pX2RhdGFfaGRyIHsKIAlzOCByc3NpOwogCkBAIC0yMDgsNiArMTk5LDEyIEBACiAJICogYjE1OmIxMyAgICAgIC0gTUVUQV9EQVRBX1ZFUlNJT04gMCAtIDcKIAkgKi8KIAlfX2xlMTYgaW5mbzI7CisKKwkvKgorCSAqIHVzYWdlIG9mIGluZm8zLCAxNi1iaXQ6CisJICogYjM6YjAJLSBJbnRlcmZhY2UgaW5kZXgKKwkgKiBiMTU6YjQJLSBSZXNlcnZlZAorCSAqLwogCV9fbGUxNiBpbmZvMzsKIH0gX19wYWNrZWQ7CiAKQEAgLTI1MCw2ICsyNDcsMTEgQEAKIAkJCSAgICAgICBXTUlfREFUQV9IRFJfTUVUQV9NQVNLOwogfQogCitzdGF0aWMgaW5saW5lIHU4IHdtaV9kYXRhX2hkcl9nZXRfaWZfaWR4KHN0cnVjdCB3bWlfZGF0YV9oZHIgKmRoZHIpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGRoZHItPmluZm8zKSAmIFdNSV9EQVRBX0hEUl9JRl9JRFhfTUFTSzsKK30KKwogLyogVHggbWV0YSB2ZXJzaW9uIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFdNSV9NQVhfVFhfTUVUQV9TWgkxMgogI2RlZmluZSBXTUlfTUVUQV9WRVJTSU9OXzEJMHgwMQpAQCAtMjk5LDYgKzMwMSw4IEBACiAJdTggY3N1bV9mbGFnczsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgV01JX0NNRF9IRFJfSUZfSURfTUFTSyAweEYKKwogLyogQ29udHJvbCBQYXRoICovCiBzdHJ1Y3Qgd21pX2NtZF9oZHIgewogCV9fbGUxNiBjbWRfaWQ7CkBAIC0zMTIsNiArMzE2LDExIEBACiAJX19sZTE2IHJlc2VydmVkOwogfSBfX3BhY2tlZDsKIAorc3RhdGljIGlubGluZSB1OCB3bWlfY21kX2hkcl9nZXRfaWZfaWR4KHN0cnVjdCB3bWlfY21kX2hkciAqY2hkcikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoY2hkci0+aW5mbzEpICYgV01JX0NNRF9IRFJfSUZfSURfTUFTSzsKK30KKwogLyogTGlzdCBvZiBXTUkgY29tbWFuZHMgKi8KIGVudW0gd21pX2NtZF9pZCB7CiAJV01JX0NPTk5FQ1RfQ01ESUQgPSAweDAwMDEsCkBAIC0zMjAsNiArMzI5LDEwIEBACiAJV01JX1NZTkNIUk9OSVpFX0NNRElELAogCVdNSV9DUkVBVEVfUFNUUkVBTV9DTURJRCwKIAlXTUlfREVMRVRFX1BTVFJFQU1fQ01ESUQsCisJLyogV01JX1NUQVJUX1NDQU5fQ01ESUQgaXMgdG8gYmUgZGVwcmVjYXRlZC4gVXNlCisJICogV01JX0JFR0lOX1NDQU5fQ01ESUQgaW5zdGVhZC4gVGhlIG5ldyBjbWQgc3VwcG9ydHMgUDJQIG1nbXQKKwkgKiBvcGVyYXRpb25zIHVzaW5nIHN0YXRpb24gaW50ZXJmYWNlLgorCSAqLwogCVdNSV9TVEFSVF9TQ0FOX0NNRElELAogCVdNSV9TRVRfU0NBTl9QQVJBTVNfQ01ESUQsCiAJV01JX1NFVF9CU1NfRklMVEVSX0NNRElELApAQCAtNTMzLDEyICs1NDYsNjEgQEAKIAlXTUlfR1RLX09GRkxPQURfT1BfQ01ESUQsCiAJV01JX1JFTUFJTl9PTl9DSE5MX0NNRElELAogCVdNSV9DQU5DRUxfUkVNQUlOX09OX0NITkxfQ01ESUQsCisJLyogV01JX1NFTkRfQUNUSU9OX0NNRElEIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorCSAqIFdNSV9TRU5EX01HTVRfQ01ESUQgaW5zdGVhZC4gVGhlIG5ldyBjbWQgc3VwcG9ydHMgUDJQIG1nbXQKKwkgKiBvcGVyYXRpb25zIHVzaW5nIHN0YXRpb24gaW50ZXJmYWNlLgorCSAqLwogCVdNSV9TRU5EX0FDVElPTl9DTURJRCwKIAlXTUlfUFJPQkVfUkVRX1JFUE9SVF9DTURJRCwKIAlXTUlfRElTQUJMRV8xMUJfUkFURVNfQ01ESUQsCiAJV01JX1NFTkRfUFJPQkVfUkVTUE9OU0VfQ01ESUQsCiAJV01JX0dFVF9QMlBfSU5GT19DTURJRCwKIAlXTUlfQVBfSk9JTl9CU1NfQ01ESUQsCisKKwlXTUlfU01QU19FTkFCTEVfQ01ESUQsCisJV01JX1NNUFNfQ09ORklHX0NNRElELAorCVdNSV9TRVRfUkFURUNUUkxfUEFSTV9DTURJRCwKKwkvKiAgTFBMIHNwZWNpZmljIGNvbW1hbmRzKi8KKwlXTUlfTFBMX0ZPUkNFX0VOQUJMRV9DTURJRCwKKwlXTUlfTFBMX1NFVF9QT0xJQ1lfQ01ESUQsCisJV01JX0xQTF9HRVRfUE9MSUNZX0NNRElELAorCVdNSV9MUExfR0VUX0hXU1RBVEVfQ01ESUQsCisJV01JX0xQTF9TRVRfUEFSQU1TX0NNRElELAorCVdNSV9MUExfR0VUX1BBUkFNU19DTURJRCwKKworCVdNSV9TRVRfQlVORExFX1BBUkFNX0NNRElELAorCisJLypHcmVlblR4IHNwZWNpZmljIGNvbW1hbmRzKi8KKworCVdNSV9HUkVFTlRYX1BBUkFNU19DTURJRCwKKworCVdNSV9SVFRfTUVBU1JFUV9DTURJRCwKKwlXTUlfUlRUX0NBUFJFUV9DTURJRCwKKwlXTUlfUlRUX1NUQVRVU1JFUV9DTURJRCwKKworCS8qIFdQUyBDb21tYW5kcyAqLworCVdNSV9XUFNfU1RBUlRfQ01ESUQsCisJV01JX0dFVF9XUFNfU1RBVFVTX0NNRElELAorCisJLyogTW9yZSBQMlAgY29tbWFuZHMgKi8KKwlXTUlfU0VUX05PQV9DTURJRCwKKwlXTUlfR0VUX05PQV9DTURJRCwKKwlXTUlfU0VUX09QUFBTX0NNRElELAorCVdNSV9HRVRfT1BQUFNfQ01ESUQsCisJV01JX0FERF9QT1JUX0NNRElELAorCVdNSV9ERUxfUE9SVF9DTURJRCwKKworCS8qIDgwMi4xMXcgY21kICovCisJV01JX1NFVF9SU05fQ0FQX0NNRElELAorCVdNSV9HRVRfUlNOX0NBUF9DTURJRCwKKwlXTUlfU0VUX0lHVEtfQ01ESUQsCisKKwlXTUlfUlhfRklMVEVSX0NPQUxFU0NFX0ZJTFRFUl9PUF9DTURJRCwKKwlXTUlfUlhfRklMVEVSX1NFVF9GUkFNRV9URVNUX0xJU1RfQ01ESUQsCisKKwlXTUlfU0VORF9NR01UX0NNRElELAorCVdNSV9CRUdJTl9TQ0FOX0NNRElELAorCiB9OwogCiBlbnVtIHdtaV9tZ210X2ZyYW1lX3R5cGUgewpAQCAtNTU4LDYgKzYyMCwxNCBAQAogCUFQX05FVFdPUksgPSAweDEwLAogfTsKIAorZW51bSBuZXR3b3JrX3N1YnR5cGUgeworCVNVQlRZUEVfTk9ORSwKKwlTVUJUWVBFX0JULAorCVNVQlRZUEVfUDJQREVWLAorCVNVQlRZUEVfUDJQQ0xJRU5ULAorCVNVQlRZUEVfUDJQR08sCit9OworCiBlbnVtIGRvdDExX2F1dGhfbW9kZSB7CiAJT1BFTl9BVVRIID0gMHgwMSwKIAlTSEFSRURfQVVUSCA9IDB4MDIsCkBAIC01NzYsOSArNjQ2LDYgQEAKIAlXUEEyX0FVVEhfQ0NLTSA9IDB4NDAsCiB9OwogCi0jZGVmaW5lIFdNSV9NSU5fQ1JZUFRPX1RZUEUgTk9ORV9DUllQVAotI2RlZmluZSBXTUlfTUFYX0NSWVBUT19UWVBFIChBRVNfQ1JZUFQgKyAxKQotCiAjZGVmaW5lIFdNSV9NSU5fS0VZX0lOREVYICAgMAogI2RlZmluZSBXTUlfTUFYX0tFWV9JTkRFWCAgIDMKIApAQCAtNjE3LDYgKzY4NCw3IEBACiAJQ09OTkVDVF9DU0FfRk9MTE9XX0JTUyA9IDB4MDAyMCwKIAlDT05ORUNUX0RPX1dQQV9PRkZMT0FEID0gMHgwMDQwLAogCUNPTk5FQ1RfRE9fTk9UX0RFQVVUSCA9IDB4MDA4MCwKKwlDT05ORUNUX1dQU19GTEFHID0gMHgwMTAwLAogfTsKIAogc3RydWN0IHdtaV9jb25uZWN0X2NtZCB7CkBAIC02MzIsNiArNzAwLDcgQEAKIAlfX2xlMTYgY2g7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCV9fbGUzMiBjdHJsX2ZsYWdzOworCXU4IG53X3N1YnR5cGU7CiB9IF9fcGFja2VkOwogCiAvKiBXTUlfUkVDT05ORUNUX0NNRElEICovCkBAIC03MTksNiArNzg4LDQzIEBACiAJV01JX1NIT1JUX1NDQU4gPSAxLAogfTsKIAorc3RydWN0IHdtaV9zdXBwX3JhdGVzIHsKKwl1OCBucmF0ZXM7CisJdTggcmF0ZXNbQVRINktMX1JBVEVfTUFYU0laRV07Cit9OworCitzdHJ1Y3Qgd21pX2JlZ2luX3NjYW5fY21kIHsKKwlfX2xlMzIgZm9yY2VfZmdfc2NhbjsKKworCS8qIGZvciBsZWdhY3kgY2lzY28gQVAgY29tcGF0aWJpbGl0eSAqLworCV9fbGUzMiBpc19sZWdhY3k7CisKKwkvKiBtYXggZHVyYXRpb24gaW4gdGhlIGhvbWUgY2hhbm5lbChtc2VjKSAqLworCV9fbGUzMiBob21lX2R3ZWxsX3RpbWU7CisKKwkvKiB0aW1lIGludGVydmFsIGJldHdlZW4gc2NhbnMgKG1zZWMpICovCisJX19sZTMyIGZvcmNlX3NjYW5faW50dmw7CisKKwkvKiBubyBDQ0sgcmF0ZXMgKi8KKwlfX2xlMzIgbm9fY2NrOworCisJLyogZW51bSB3bWlfc2Nhbl90eXBlICovCisJdTggc2Nhbl90eXBlOworCisJLyogU3VwcG9ydGVkIHJhdGVzIHRvIGFkdmVydGlzZSBpbiB0aGUgcHJvYmUgcmVxdWVzdCBmcmFtZXMgKi8KKwlzdHJ1Y3Qgd21pX3N1cHBfcmF0ZXMgc3VwcF9yYXRlc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKKworCS8qIGhvdyBtYW55IGNoYW5uZWxzIGZvbGxvdyAqLworCXU4IG51bV9jaDsKKworCS8qIGNoYW5uZWxzIGluIE1oeiAqLworCV9fbGUxNiBjaF9saXN0WzFdOworfSBfX3BhY2tlZDsKKworLyogd21pX3N0YXJ0X3NjYW5fY21kIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorICogd21pX2JlZ2luX3NjYW5fY21kIGluc3RlYWQuIFRoZSBuZXcgc3RydWN0dXJlIHN1cHBvcnRzIFAyUCBtZ210CisgKiBvcGVyYXRpb25zIHVzaW5nIHN0YXRpb24gaW50ZXJmYWNlLgorICovCiBzdHJ1Y3Qgd21pX3N0YXJ0X3NjYW5fY21kIHsKIAlfX2xlMzIgZm9yY2VfZmdfc2NhbjsKIApAQCAtNzQxLDkgKzg0Nyw2IEBACiAJX19sZTE2IGNoX2xpc3RbMV07CiB9IF9fcGFja2VkOwogCi0vKiBXTUlfU0VUX1NDQU5fUEFSQU1TX0NNRElEICovCi0jZGVmaW5lIFdNSV9TSE9SVFNDQU5SQVRJT19ERUZBVUxUICAgICAgMwotCiAvKgogICogIFdhcm5pbmc6IHNjYW4gY29udHJvbCBmbGFnIHZhbHVlIG9mIDB4RkYgaXMgdXNlZCB0byBkaXNhYmxlCiAgKiAgYWxsIGZsYWdzIGluIFdNSV9TQ0FOX1BBUkFNU19DTUQuIERvIG5vdCBhZGQgYW55IG1vcmUKQEAgLTc3NiwxMyArODc5LDYgQEAKIAlFTkFCTEVfU0NBTl9BQk9SVF9FVkVOVCA9IDB4NDAKIH07CiAKLSNkZWZpbmUgREVGQVVMVF9TQ0FOX0NUUkxfRkxBR1MJCQlcCi0JKENPTk5FQ1RfU0NBTl9DVFJMX0ZMQUdTIHwJCVwKLQkgU0NBTl9DT05ORUNURURfQ1RSTF9GTEFHUyB8CQlcCi0JIEFDVElWRV9TQ0FOX0NUUkxfRkxBR1MgfAkJXAotCSBST0FNX1NDQU5fQ1RSTF9GTEFHUyB8CQkJXAotCSBFTkFCTEVfQVVUT19DVFJMX0ZMQUdTKQotCiBzdHJ1Y3Qgd21pX3NjYW5fcGFyYW1zX2NtZCB7CiAJICAvKiBzZWMgKi8KIAlfX2xlMTYgZmdfc3RhcnRfcGVyaW9kOwpAQCAtMTM2NSwxNCArMTQ2MSwyMCBAQAogCVdNSV9TRVRfTFJTU0lfU0NBTl9QQVJBTVMsCiB9OwogCitlbnVtIHdtaV9yb2FtX21vZGUgeworCVdNSV9ERUZBVUxUX1JPQU1fTU9ERSA9IDEsIC8qIFJTU0kgYmFzZWQgcm9hbSAqLworCVdNSV9IT1NUX0JJQVNfUk9BTV9NT0RFID0gMiwgLyogSG9zdCBiaWFzIGJhc2VkIHJvYW0gKi8KKwlXTUlfTE9DS19CU1NfTU9ERSA9IDMsIC8qIExvY2sgdG8gdGhlIGN1cnJlbnQgQlNTICovCit9OworCiBzdHJ1Y3QgYnNzX2JpYXMgewogCXU4IGJzc2lkW0VUSF9BTEVOXTsKLQl1OCAgYmlhczsKKwlzOCBiaWFzOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGJzc19iaWFzX2luZm8gewogCXU4IG51bV9ic3M7Ci0Jc3RydWN0IGJzc19iaWFzIGJzc19iaWFzWzFdOworCXN0cnVjdCBic3NfYmlhcyBic3NfYmlhc1swXTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBsb3dfcnNzaV9zY2FuX3BhcmFtcyB7CkBAIC0xMzg1LDEwICsxNDg3LDExIEBACiAKIHN0cnVjdCByb2FtX2N0cmxfY21kIHsKIAl1bmlvbiB7Ci0JCXU4IGJzc2lkW0VUSF9BTEVOXTsKLQkJdTggcm9hbV9tb2RlOwotCQlzdHJ1Y3QgYnNzX2JpYXNfaW5mbyBic3M7Ci0JCXN0cnVjdCBsb3dfcnNzaV9zY2FuX3BhcmFtcyBwYXJhbXM7CisJCXU4IGJzc2lkW0VUSF9BTEVOXTsgLyogV01JX0ZPUkNFX1JPQU0gKi8KKwkJdTggcm9hbV9tb2RlOyAvKiBXTUlfU0VUX1JPQU1fTU9ERSAqLworCQlzdHJ1Y3QgYnNzX2JpYXNfaW5mbyBic3M7IC8qIFdNSV9TRVRfSE9TVF9CSUFTICovCisJCXN0cnVjdCBsb3dfcnNzaV9zY2FuX3BhcmFtcyBwYXJhbXM7IC8qIFdNSV9TRVRfTFJTU0lfU0NBTl9QQVJBTVMKKwkJCQkJCSAgICAgKi8KIAl9IF9fcGFja2VkIGluZm87CiAJdTggcm9hbV9jdHJsOwogfSBfX3BhY2tlZDsKQEAgLTE0NTUsNiArMTU1OCwxMCBAQAogCXU4IGlzX21jYXN0OwogfSBfX3BhY2tlZDsKIAorZW51bSB3bWlfc2Nhbl9zdGF0dXMgeworCVdNSV9TQ0FOX1NUQVRVU19TVUNDRVNTID0gMCwKK307CisKIC8qIFdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQgKi8KIHN0cnVjdCB3bWlfc2Nhbl9jb21wbGV0ZV9ldmVudCB7CiAJYV9zbGUzMiBzdGF0dXM7CkBAIC0xNjM1LDYgKzE3NDIsMTIgQEAKIAl1OCByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsIHsKKwlfX2xlMTYgcm9hbV9tb2RlOworCV9fbGUxNiBudW1fZW50cmllczsKKwlzdHJ1Y3Qgd21pX2Jzc19yb2FtX2luZm8gaW5mb1tdOworfSBfX3BhY2tlZDsKKwogLyogV01JX0NBQ19FVkVOVElEICovCiBlbnVtIGNhY19pbmRpY2F0aW9uIHsKIAlDQUNfSU5ESUNBVElPTl9BRE1JU1NJT04gPSAweDAwLApAQCAtMTc3MSw3ICsxODg0LDYgQEAKICNkZWZpbmUgV1NDX1JFR19BQ1RJVkUgICAgIDEKICNkZWZpbmUgV1NDX1JFR19JTkFDVElWRSAgIDAKIAotI2RlZmluZSBXT1dfTUFYX0ZJTFRFUl9MSVNUUwkgMQogI2RlZmluZSBXT1dfTUFYX0ZJTFRFUlNfUEVSX0xJU1QgNAogI2RlZmluZSBXT1dfUEFUVEVSTl9TSVpFCSA2NAogI2RlZmluZSBXT1dfTUFTS19TSVpFCQkgNjQKQEAgLTE3OTQsMTcgKzE5MDYsNTIgQEAKIAlfX2xlMzIgaXBzW01BWF9JUF9BRERSU107CiB9IF9fcGFja2VkOwogCi0vKiBXTUlfR0VUX1dPV19MSVNUX0NNRCByZXBseSAgKi8KLXN0cnVjdCB3bWlfZ2V0X3dvd19saXN0X3JlcGx5IHsKLQkvKiBudW1iZXIgb2YgcGF0dGVybnMgaW4gcmVwbHkgKi8KLQl1OCBudW1fZmlsdGVyczsKK2VudW0gYXRoNmtsX3dvd19maWx0ZXJzIHsKKwlXT1dfRklMVEVSX1NTSUQJCQk9IEJJVCgxKSwKKwlXT1dfRklMVEVSX09QVElPTl9NQUdJQ19QQUNLRVQgID0gQklUKDIpLAorCVdPV19GSUxURVJfT1BUSU9OX0VBUF9SRVEJPSBCSVQoMyksCisJV09XX0ZJTFRFUl9PUFRJT05fUEFUVEVSTlMJPSBCSVQoNCksCisJV09XX0ZJTFRFUl9PUFRJT05fT0ZGTE9BRF9BUlAJPSBCSVQoNSksCisJV09XX0ZJTFRFUl9PUFRJT05fT0ZGTE9BRF9OUwk9IEJJVCg2KSwKKwlXT1dfRklMVEVSX09QVElPTl9PRkZMT0FEX0dUSwk9IEJJVCg3KSwKKwlXT1dfRklMVEVSX09QVElPTl84MDIxWF80V0FZSFMJPSBCSVQoOCksCisJV09XX0ZJTFRFUl9PUFRJT05fTkxPX0RJU0NWUlkJPSBCSVQoOSksCisJV09XX0ZJTFRFUl9PUFRJT05fTldLX0RJU0FTU09DCT0gQklUKDEwKSwKKwlXT1dfRklMVEVSX09QVElPTl9HVEtfRVJST1IJPSBCSVQoMTEpLAorCVdPV19GSUxURVJfT1BUSU9OX1RFU1RfTU9ERQk9IEJJVCgxNSksCit9OwogCi0JLyogdGhpcyBpcyBmaWx0ZXIgIyB4IG9mIHRvdGFsIG51bV9maWx0ZXJzICovCi0JdTggdGhpc19maWx0ZXJfbnVtOworZW51bSBhdGg2a2xfaG9zdF9tb2RlIHsKKwlBVEg2S0xfSE9TVF9NT0RFX0FXQUtFLAorCUFUSDZLTF9IT1NUX01PREVfQVNMRUVQLAorfTsKIAotCXU4IHdvd19tb2RlOwotCXU4IGhvc3RfbW9kZTsKLQlzdHJ1Y3Qgd293X2ZpbHRlciB3b3dfZmlsdGVyc1sxXTsKK3N0cnVjdCB3bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQgeworCV9fbGUzMiBhd2FrZTsKKwlfX2xlMzIgYXNsZWVwOworfSBfX3BhY2tlZDsKKworZW51bSBhdGg2a2xfd293X21vZGUgeworCUFUSDZLTF9XT1dfTU9ERV9ESVNBQkxFLAorCUFUSDZLTF9XT1dfTU9ERV9FTkFCTEUsCit9OworCitzdHJ1Y3Qgd21pX3NldF93b3dfbW9kZV9jbWQgeworCV9fbGUzMiBlbmFibGVfd293OworCV9fbGUzMiBmaWx0ZXI7CisJX19sZTE2IGhvc3RfcmVxX2RlbGF5OworfSBfX3BhY2tlZDsKKworc3RydWN0IHdtaV9hZGRfd293X3BhdHRlcm5fY21kIHsKKwl1OCBmaWx0ZXJfbGlzdF9pZDsKKwl1OCBmaWx0ZXJfc2l6ZTsKKwl1OCBmaWx0ZXJfb2Zmc2V0OworCXU4IGZpbHRlclswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bWlfZGVsX3dvd19wYXR0ZXJuX2NtZCB7CisJX19sZTE2IGZpbHRlcl9saXN0X2lkOworCV9fbGUxNiBmaWx0ZXJfaWQ7CiB9IF9fcGFja2VkOwogCiAvKiBXTUlfU0VUX0FLTVBfUEFSQU1TX0NNRCAqLwpAQCAtMTkwNSw3ICsyMDUyLDcgQEAKICAqICEhISBXYXJuaW5nICEhIQogICogLUNoYW5naW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG5lZWRzIGNvbXBpbGF0aW9uIG9mIGJvdGggZHJpdmVyIGFuZCBmaXJtd2FyZQogICovCi0jZGVmaW5lIEFQX01BWF9OVU1fU1RBICAgICAgICAgIDgKKyNkZWZpbmUgQVBfTUFYX05VTV9TVEEgICAgICAgICAgMTAKIAogLyogU3BsLiBBSUQgdXNlZCB0byBzZXQgRFRJTSBmbGFnIGluIHRoZSBiZWFjb25zICovCiAjZGVmaW5lIE1DQVNUX0FJRCAgICAgICAgICAgICAgIDB4RkYKQEAgLTE5ODgsNiArMjEzNSwxMCBAQAogCV9fbGUzMiBkdXJhdGlvbjsKIH0gX19wYWNrZWQ7CiAKKy8qIHdtaV9zZW5kX2FjdGlvbl9jbWQgaXMgdG8gYmUgZGVwcmVjYXRlZC4gVXNlCisgKiB3bWlfc2VuZF9tZ210X2NtZCBpbnN0ZWFkLiBUaGUgbmV3IHN0cnVjdHVyZSBzdXBwb3J0cyBQMlAgbWdtdAorICogb3BlcmF0aW9ucyB1c2luZyBzdGF0aW9uIGludGVyZmFjZS4KKyAqLwogc3RydWN0IHdtaV9zZW5kX2FjdGlvbl9jbWQgewogCV9fbGUzMiBpZDsKIAlfX2xlMzIgZnJlcTsKQEAgLTE5OTYsNiArMjE0NywxNSBAQAogCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCitzdHJ1Y3Qgd21pX3NlbmRfbWdtdF9jbWQgeworCV9fbGUzMiBpZDsKKwlfX2xlMzIgZnJlcTsKKwlfX2xlMzIgd2FpdDsKKwlfX2xlMzIgbm9fY2NrOworCV9fbGUxNiBsZW47CisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCB3bWlfdHhfc3RhdHVzX2V2ZW50IHsKIAlfX2xlMzIgaWQ7CiAJdTggYWNrX3N0YXR1czsKQEAgLTIxNjMsMTIwICsyMzIzLDE2MiBAQAogaW50IGF0aDZrbF93bWlfZGF0YV9oZHJfYWRkKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICB1OCBtc2dfdHlwZSwgYm9vbCBtb3JlX2RhdGEsCiAJCQkgICAgZW51bSB3bWlfZGF0YV9oZHJfZGF0YV90eXBlIGRhdGFfdHlwZSwKLQkJCSAgICB1OCBtZXRhX3Zlciwgdm9pZCAqdHhfbWV0YV9pbmZvKTsKKwkJCSAgICB1OCBtZXRhX3Zlciwgdm9pZCAqdHhfbWV0YV9pbmZvLCB1OCBpZl9pZHgpOwogCiBpbnQgYXRoNmtsX3dtaV9kb3QxMV9oZHJfcmVtb3ZlKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgYXRoNmtsX3dtaV9kb3QzXzJfZGl4KHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICB1MzIgbGF5ZXIyX3ByaW9yaXR5LCBib29sIHdtbV9lbmFibGVkLAotCQkJCSAgICAgICB1OCAqYWMpOworaW50IGF0aDZrbF93bWlfaW1wbGljaXRfY3JlYXRlX3BzdHJlYW0oc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsYXllcjJfcHJpb3JpdHksCisJCQkJICAgICAgIGJvb2wgd21tX2VuYWJsZWQsIHU4ICphYyk7CiAKIGludCBhdGg2a2xfd21pX2NvbnRyb2xfcngoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotaW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQllbnVtIHdtaV9jbWRfaWQgY21kX2lkLCBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKTsKIAotaW50IGF0aDZrbF93bWlfY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCBlbnVtIG5ldHdvcmtfdHlwZSBud190eXBlLAoraW50IGF0aDZrbF93bWlfY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICBlbnVtIG5ldHdvcmtfdHlwZSBud190eXBlLAogCQkJICAgZW51bSBkb3QxMV9hdXRoX21vZGUgZG90MTFfYXV0aF9tb2RlLAogCQkJICAgZW51bSBhdXRoX21vZGUgYXV0aF9tb2RlLAogCQkJICAgZW51bSBjcnlwdG9fdHlwZSBwYWlyd2lzZV9jcnlwdG8sCiAJCQkgICB1OCBwYWlyd2lzZV9jcnlwdG9fbGVuLAogCQkJICAgZW51bSBjcnlwdG9fdHlwZSBncm91cF9jcnlwdG8sCiAJCQkgICB1OCBncm91cF9jcnlwdG9fbGVuLCBpbnQgc3NpZF9sZW4sIHU4ICpzc2lkLAotCQkJICAgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCwgdTMyIGN0cmxfZmxhZ3MpOworCQkJICAgdTggKmJzc2lkLCB1MTYgY2hhbm5lbCwgdTMyIGN0cmxfZmxhZ3MsCisJCQkgICB1OCBud19zdWJ0eXBlKTsKIAotaW50IGF0aDZrbF93bWlfcmVjb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwpOwotaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pKTsKLWludCBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoc3RydWN0IHdtaSAqd21pLCBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAoraW50IGF0aDZrbF93bWlfcmVjb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggKmJzc2lkLAorCQkJICAgICB1MTYgY2hhbm5lbCk7CitpbnQgYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CitpbnQgYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgICBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAogCQkJICAgICB1MzIgZm9yY2VfZmdzY2FuLCB1MzIgaXNfbGVnYWN5LAogCQkJICAgICB1MzIgaG9tZV9kd2VsbF90aW1lLCB1MzIgZm9yY2Vfc2Nhbl9pbnRlcnZhbCwKIAkJCSAgICAgczggbnVtX2NoYW4sIHUxNiAqY2hfbGlzdCk7Ci1pbnQgYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiBmZ19zdGFydF9zZWMsCisKK2ludCBhdGg2a2xfd21pX2JlZ2luc2Nhbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICAgIGVudW0gd21pX3NjYW5fdHlwZSBzY2FuX3R5cGUsCisJCQkgICAgIHUzMiBmb3JjZV9mZ3NjYW4sIHUzMiBpc19sZWdhY3ksCisJCQkgICAgIHUzMiBob21lX2R3ZWxsX3RpbWUsIHUzMiBmb3JjZV9zY2FuX2ludGVydmFsLAorCQkJICAgICBzOCBudW1fY2hhbiwgdTE2ICpjaF9saXN0LCB1MzIgbm9fY2NrLAorCQkJICAgICB1MzIgKnJhdGVzKTsKKworaW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUxNiBmZ19zdGFydF9zZWMsCiAJCQkgICAgICB1MTYgZmdfZW5kX3NlYywgdTE2IGJnX3NlYywKIAkJCSAgICAgIHUxNiBtaW5hY3RfY2hkd19tc2VjLCB1MTYgbWF4YWN0X2NoZHdfbXNlYywKIAkJCSAgICAgIHUxNiBwYXNfY2hkd19tc2VjLCB1OCBzaG9ydF9zY2FuX3JhdGlvLAogCQkJICAgICAgdTggc2Nhbl9jdHJsX2ZsYWcsIHUzMiBtYXhfZGZzY2hfYWN0X3RpbWUsCiAJCQkgICAgICB1MTYgbWF4YWN0X3NjYW5fcGVyX3NzaWQpOwotaW50IGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGZpbHRlciwgdTMyIGllX21hc2spOwotaW50IGF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpbmRleCwgdTggZmxhZywKK2ludCBhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGZpbHRlciwKKwkJCSAgICAgdTMyIGllX21hc2spOworaW50IGF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGluZGV4LCB1OCBmbGFnLAogCQkJICAgICAgdTggc3NpZF9sZW4sIHU4ICpzc2lkKTsKLWludCBhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiBsaXN0ZW5faW50ZXJ2YWwsCitpbnQgYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICB1MTYgbGlzdGVuX2ludGVydmFsLAogCQkJCSAgdTE2IGxpc3Rlbl9iZWFjb25zKTsKLWludCBhdGg2a2xfd21pX3Bvd2VybW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBwd3JfbW9kZSk7Ci1pbnQgYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgaWRsZV9wZXJpb2QsCitpbnQgYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBwd3JfbW9kZSk7CitpbnQgYXRoNmtsX3dtaV9wbXBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUxNiBpZGxlX3BlcmlvZCwKIAkJCSAgICB1MTYgcHNfcG9sbF9udW0sIHUxNiBkdGltX3BvbGljeSwKIAkJCSAgICB1MTYgdHhfd2FrdXBfcG9saWN5LCB1MTYgbnVtX3R4X3RvX3dha2V1cCwKIAkJCSAgICB1MTYgcHNfZmFpbF9ldmVudF9wb2xpY3kpOwotaW50IGF0aDZrbF93bWlfZGlzY3RpbWVvdXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggdGltZW91dCk7Ci1pbnQgYXRoNmtsX3dtaV9jcmVhdGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLAoraW50IGF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAogCQkJCSAgc3RydWN0IHdtaV9jcmVhdGVfcHN0cmVhbV9jbWQgKnBzdHJlYW0pOwotaW50IGF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggdHJhZmZpY19jbGFzcywgdTggdHNpZCk7CitpbnQgYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRyYWZmaWNfY2xhc3MsCisJCQkJICB1OCB0c2lkKTsKK2ludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggdGltZW91dCk7CiAKIGludCBhdGg2a2xfd21pX3NldF9ydHNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IHRocmVzaG9sZCk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRfbHByZWFtYmxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHN0YXR1cywKK2ludCBhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBzdGF0dXMsCiAJCQkJIHU4IHByZWFtYmxlX3BvbGljeSk7CiAKIGludCBhdGg2a2xfd21pX2dldF9jaGFsbGVuZ2VfcmVzcF9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgY29va2llLCB1MzIgc291cmNlKTsKIGludCBhdGg2a2xfd21pX2NvbmZpZ19kZWJ1Z19tb2R1bGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIHZhbGlkLCB1MzIgY29uZmlnKTsKIAotaW50IGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChzdHJ1Y3Qgd21pICp3bWkpOwotaW50IGF0aDZrbF93bWlfYWRka2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtleV9pbmRleCwKK2ludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpOworaW50IGF0aDZrbF93bWlfYWRka2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTgga2V5X2luZGV4LAogCQkJICBlbnVtIGNyeXB0b190eXBlIGtleV90eXBlLAogCQkJICB1OCBrZXlfdXNhZ2UsIHU4IGtleV9sZW4sCi0JCQkgIHU4ICprZXlfcnNjLCB1OCAqa2V5X21hdGVyaWFsLAorCQkJICB1OCAqa2V5X3JzYywgdW5zaWduZWQgaW50IGtleV9yc2NfbGVuLAorCQkJICB1OCAqa2V5X21hdGVyaWFsLAogCQkJICB1OCBrZXlfb3BfY3RybCwgdTggKm1hY19hZGRyLAogCQkJICBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKTsKLWludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmtyayk7Ci1pbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2V5X2luZGV4KTsKLWludCBhdGg2a2xfd21pX3NldHBta2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCwKK2ludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqa3JrKTsKK2ludCBhdGg2a2xfd21pX2RlbGV0ZWtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCk7CitpbnQgYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGNvbnN0IHU4ICpic3NpZCwKIAkJCSAgICBjb25zdCB1OCAqcG1raWQsIGJvb2wgc2V0KTsKLWludCBhdGg2a2xfd21pX3NldF90eF9wd3JfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggZGJNKTsKLWludCBhdGg2a2xfd21pX2dldF90eF9wd3JfY21kKHN0cnVjdCB3bWkgKndtaSk7CitpbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggZGJNKTsKK2ludCBhdGg2a2xfd21pX2dldF90eF9wd3JfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KTsKK2ludCBhdGg2a2xfd21pX2dldF9yb2FtX3RibF9jbWQoc3RydWN0IHdtaSAqd21pKTsKIAotaW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfdHhvcF9jZmcgY2ZnKTsKLWludCBhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2VlcF9hbGl2ZV9pbnR2bCk7CitpbnQgYXRoNmtsX3dtaV9zZXRfd21tX3R4b3Aoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGVudW0gd21pX3R4b3BfY2ZnIGNmZyk7CitpbnQgYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgdTgga2VlcF9hbGl2ZV9pbnR2bCk7CiBpbnQgYXRoNmtsX3dtaV90ZXN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CiAKIHMzMiBhdGg2a2xfd21pX2dldF9yYXRlKHM4IHJhdGVfaW5kZXgpOwogCiBpbnQgYXRoNmtsX3dtaV9zZXRfaXBfY21kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHdtaV9zZXRfaXBfY21kICppcF9jbWQpOworaW50IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIGVudW0gYXRoNmtsX2hvc3RfbW9kZSBob3N0X21vZGUpOworaW50IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQllbnVtIGF0aDZrbF93b3dfbW9kZSB3b3dfbW9kZSwKKwkJCQl1MzIgZmlsdGVyLCB1MTYgaG9zdF9yZXFfZGVsYXkpOworaW50IGF0aDZrbF93bWlfYWRkX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1OCBsaXN0X2lkLCB1OCBmaWx0ZXJfc2l6ZSwKKwkJCQkgICB1OCBmaWx0ZXJfb2Zmc2V0LCB1OCAqZmlsdGVyLCB1OCAqbWFzayk7CitpbnQgYXRoNmtsX3dtaV9kZWxfd293X3BhdHRlcm5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgIHUxNiBsaXN0X2lkLCB1MTYgZmlsdGVyX2lkKTsKIGludCBhdGg2a2xfd21pX3NldF9yb2FtX2xyc3NpX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGxyc3NpKTsKK2ludCBhdGg2a2xfd21pX2ZvcmNlX3JvYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgY29uc3QgdTggKmJzc2lkKTsKK2ludCBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfcm9hbV9tb2RlIG1vZGUpOwogCiAvKiBBUCBtb2RlICovCi1pbnQgYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChzdHJ1Y3Qgd21pICp3bWlwLCBzdHJ1Y3Qgd21pX2Nvbm5lY3RfY21kICpwKTsKK2ludCBhdGg2a2xfd21pX2FwX3Byb2ZpbGVfY29tbWl0KHN0cnVjdCB3bWkgKndtaXAsIHU4IGlmX2lkeCwKKwkJCQkgc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqcCk7CiAKLWludCBhdGg2a2xfd21pX2FwX3NldF9tbG1lKHN0cnVjdCB3bWkgKndtaXAsIHU4IGNtZCwgY29uc3QgdTggKm1hYywgdTE2IHJlYXNvbik7CitpbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsIHU4IGNtZCwKKwkJCSAgIGNvbnN0IHU4ICptYWMsIHUxNiByZWFzb24pOwogCi1pbnQgYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiBhaWQsIGJvb2wgZmxhZyk7CitpbnQgYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTE2IGFpZCwgYm9vbCBmbGFnKTsKIAotaW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCByeF9tZXRhX3ZlcnNpb24sCitpbnQgYXRoNmtsX3dtaV9zZXRfcnhfZnJhbWVfZm9ybWF0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICAgICAgdTggcnhfbWV0YV92ZXJzaW9uLAogCQkJCSAgICAgICBib29sIHJ4X2RvdDExX2hkciwgYm9vbCBkZWZyYWdfb25faG9zdCk7CiAKLWludCBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBtZ210X2ZybV90eXBlLCBjb25zdCB1OCAqaWUsCi0JCQkgICAgIHU4IGllX2xlbik7CitpbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBtZ210X2ZybV90eXBlLAorCQkJICAgICBjb25zdCB1OCAqaWUsIHU4IGllX2xlbik7CiAKIC8qIFAyUCAqLwogaW50IGF0aDZrbF93bWlfZGlzYWJsZV8xMWJfcmF0ZXNfY21kKHN0cnVjdCB3bWkgKndtaSwgYm9vbCBkaXNhYmxlKTsKIAotaW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGZyZXEsIHUzMiBkdXIpOworaW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgZnJlcSwKKwkJCQkgIHUzMiBkdXIpOwogCi1pbnQgYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgaWQsIHUzMiBmcmVxLCB1MzIgd2FpdCwKLQkJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKTsKK2ludCBhdGg2a2xfd21pX3NlbmRfYWN0aW9uX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGlkLCB1MzIgZnJlcSwKKwkJCSAgICAgICB1MzIgd2FpdCwgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbik7CiAKLWludCBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGZyZXEsCi0JCQkJICAgICAgIGNvbnN0IHU4ICpkc3QsCi0JCQkJICAgICAgIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4pOworaW50IGF0aDZrbF93bWlfc2VuZF9tZ210X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGlkLCB1MzIgZnJlcSwKKwkJCSAgICAgICB1MzIgd2FpdCwgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbiwKKwkJCSAgICAgICB1MzIgbm9fY2NrKTsKIAotaW50IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCBib29sIGVuYWJsZSk7CitpbnQgYXRoNmtsX3dtaV9zZW5kX3Byb2JlX3Jlc3BvbnNlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGZyZXEsCisJCQkJICAgICAgIGNvbnN0IHU4ICpkc3QsIGNvbnN0IHU4ICpkYXRhLAorCQkJCSAgICAgICB1MTYgZGF0YV9sZW4pOwogCi1pbnQgYXRoNmtsX3dtaV9pbmZvX3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCB1MzIgaW5mb19yZXFfZmxhZ3MpOworaW50IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIGJvb2wgZW5hYmxlKTsKIAotaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWkpOworaW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaW5mb19yZXFfZmxhZ3MpOwogCi1pbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggbWdtdF9mcm1fdHlwZSwgY29uc3QgdTggKmllLAotCQkJICAgICB1OCBpZV9sZW4pOworaW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CiAKK2ludCBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IG1nbXRfZnJtX3R5cGUsCisJCQkgICAgIGNvbnN0IHU4ICppZSwgdTggaWVfbGVuKTsKKwordm9pZCBhdGg2a2xfd21pX3NzY2FuX3RpbWVyKHVuc2lnbmVkIGxvbmcgcHRyKTsKKworc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF9nZXRfdmlmX2J5X2luZGV4KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCBpZl9pZHgpOwogdm9pZCAqYXRoNmtsX3dtaV9pbml0KHN0cnVjdCBhdGg2a2wgKmRldnQpOwogdm9pZCBhdGg2a2xfd21pX3NodXRkb3duKHN0cnVjdCB3bWkgKndtaSk7Cit2b2lkIGF0aDZrbF93bWlfcmVzZXQoc3RydWN0IHdtaSAqd21pKTsKIAogI2VuZGlmIC8qIFdNSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCmluZGV4IGQ5YzA4YzYuLjFiNDc4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCkBAIC0yLDYgKzIsOSBAQAogCXRyaXN0YXRlCiBjb25maWcgQVRIOUtfQ09NTU9OCiAJdHJpc3RhdGUKK2NvbmZpZyBBVEg5S19ERlNfREVCVUdGUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIEFUSDlLX0RFQlVHRlMgJiYgQVRIOUtfREZTX0NFUlRJRklFRAogCiBjb25maWcgQVRIOUsKIAl0cmlzdGF0ZSAiQXRoZXJvcyA4MDIuMTFuIHdpcmVsZXNzIGNhcmRzIHN1cHBvcnQiCkBAIC0yNSw2ICsyOCw3IEBACiAKIGNvbmZpZyBBVEg5S19QQ0kKIAlib29sICJBdGhlcm9zIGF0aDlrIFBDSS9QQ0llIGJ1cyBzdXBwb3J0IgorCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gQVRIOUsgJiYgUENJCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgUENJIGJ1cyBzdXBwb3J0IGluIGF0aDlrLgpAQCAtNTAsNiArNTQsMjUgQEAKIAogCSAgQWxzbyByZXF1aXJlZCBmb3IgY2hhbmdpbmcgZGVidWcgbWVzc2FnZSBmbGFncyBhdCBydW4gdGltZS4KIAorY29uZmlnIEFUSDlLX0RGU19DRVJUSUZJRUQKKwlib29sICJBdGhlcm9zIERGUyBzdXBwb3J0IGZvciBjZXJ0aWZpZWQgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gQVRIOUsgJiYgRVhQRVJUCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBERlMgc3VwcG9ydCBmb3IgaW5pdGlhdGluZyByYWRpYXRpb24gb24KKwkgIGF0aDlrLiBUaGVyZSBpcyBubyB3YXkgdG8gZHluYW1pY2FsbHkgZGV0ZWN0IGlmIGEgY2FyZCB3YXMgREZTCisJICBjZXJ0aWZpZWQgYW5kIGFzIHN1Y2ggdGhpcyBpcyBsZWZ0IGFzIGEgYnVpbGQgdGltZSBvcHRpb24uIFRoaXMKKwkgIG9wdGlvbiBzaG91bGQgb25seSBiZSBlbmFibGVkIGJ5IHN5c3RlbSBpbnRlZ3JhdG9ycyB0aGF0IGNhbgorCSAgZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSBwbGF0Zm9ybXMgdGhhdCB0aGVpciBrZXJuZWwgd2lsbCBydW4gb24KKwkgIGhhdmUgb2J0YWluZWQgYXBwcm9wcmlhdGUgcmVndWxhdG9yeSBib2R5IGNlcnRpZmljYXRpb24gZm9yIGEKKwkgIHJlc3BlY3RpdmUgQXRoZXJvcyBjYXJkIGJ5IHVzaW5nIGF0aDlrIG9uIHRoZSB0YXJnZXQgc2hpcHBpbmcKKwkgIHBsYXRmb3Jtcy4KKworCSAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBhIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgREZTIHN1cHBvcnQsCisJICBhcyBERlMgc3VwcG9ydCByZXF1aXJlcyBtb3JlIGNvbXBvbmVudHMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlCisJICBkZXZlbG9wZWQuIEF0IHRoaXMgcG9pbnQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd29uJ3QgZG8gYW55dGhpbmcKKwkgIGV4Y2VwdCBpbmNyZWFzZSBjb2RlIHNpemUuCisKIGNvbmZpZyBBVEg5S19SQVRFX0NPTlRST0wKIAlib29sICJBdGhlcm9zIGF0aDlrIHJhdGUgY29udHJvbCIKIAlkZXBlbmRzIG9uIEFUSDlLCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKaW5kZXggNDlkM2YyNS4uZGEwMjI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQpAQCAtMTAsNiArMTAsOCBAQAogYXRoOWstJChDT05GSUdfQVRIOUtfUENJKSArPSBwY2kubwogYXRoOWstJChDT05GSUdfQVRIOUtfQUhCKSArPSBhaGIubwogYXRoOWstJChDT05GSUdfQVRIOUtfREVCVUdGUykgKz0gZGVidWcubworYXRoOWstJChDT05GSUdfQVRIOUtfREZTX0RFQlVHRlMpICs9IGRmc19kZWJ1Zy5vCithdGg5ay0kKENPTkZJR19BVEg5S19ERlNfQ0VSVElGSUVEKSArPSBkZnMubwogCiBvYmotJChDT05GSUdfQVRIOUspICs9IGF0aDlrLm8KIApAQCAtMzQsNyArMzYsOCBAQAogCQlhcjkwMDJfbWFjLm8gXAogCQlhcjkwMDNfbWFjLm8gXAogCQlhcjkwMDNfZWVwcm9tLm8gXAotCQlhcjkwMDNfcGFwcmQubworCQlhcjkwMDNfcGFwcmQubyBcCisJCWFyOTAwM19tY2kubwogCiBvYmotJChDT05GSUdfQVRIOUtfSFcpICs9IGF0aDlrX2h3Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FoYi5jCmluZGV4IDg1YTU0Y2QuLjVlNDdjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYWhiLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRoOWtfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJhdGg5ay5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBhdGg5a19wbGF0Zm9ybV9pZF90YWJsZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jCmluZGV4IDI3NzZjM2MuLmE2MzliOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCmluZGV4IDg4Mjc5ZTMuLjE1NzMzN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJaSk7CiAKIAkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIk9yaWduYWw6IENobiAlZGlxX2NvcnJfbWVhcyA9IDB4JTA4eFxuIiwKKwkJCSJPcmlnaW5hbDogQ2huICVkIGlxX2NvcnJfbWVhcyA9IDB4JTA4eFxuIiwKIAkJCWksIGFoLT50b3RhbElxQ29yck1lYXNbaV0pOwogCiAJCWlxQ29yck5lZyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMKaW5kZXggNjI2ZDU0Ny4uMTFmMTkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaHcuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlICJody5oIgogI2luY2x1ZGUgImFyNTAwOF9pbml0dmFscy5oIgogI2luY2x1ZGUgImFyOTAwMV9pbml0dmFscy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMKaW5kZXggZjdkOGU1MS4uYjU5MjAxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX21hYy5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNkZWZpbmUgQVJfQnVmTGVuICAgICAgICAgICAweDAwMDAwZmZmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfY2FsaWIuYwppbmRleCAxMmE3MzBkLi4yM2IzYTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19jYWxpYi5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiaHctb3BzLmgiCiAjaW5jbHVkZSAiYXI5MDAzX3BoeS5oIgogI2luY2x1ZGUgImFyOTAwM19ydHQuaCIKKyNpbmNsdWRlICJhcjkwMDNfbWNpLmgiCiAKICNkZWZpbmUgTUFYX01FQVNVUkVNRU5UCU1BWF9JUUNBTF9NRUFTVVJFTUVOVAogI2RlZmluZSBNQVhfTUFHX0RFTFRBCTExCkBAIC0yMjUsNyArMjI2LDcgQEAKIAkJCWkpOwogCiAJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJPcmlnbmFsOiBDaG4gJWRpcV9jb3JyX21lYXMgPSAweCUwOHhcbiIsCisJCQkiT3JpZ2luYWw6IENobiAlZCBpcV9jb3JyX21lYXMgPSAweCUwOHhcbiIsCiAJCQlpLCBhaC0+dG90YWxJcUNvcnJNZWFzW2ldKTsKIAogCQlpcUNvcnJOZWcgPSAwOwpAQCAtODI0LDcgKzgyNSw3IEBACiAJCQkJCQljaGFuX2luZm9fdGFiW2ldICsgb2Zmc2V0KTsKIAogCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCQkJIklRIFJFU1slZF09MHgleCIKKwkJCQkJIklRX1JFU1slZF09MHgleCAiCiAJCQkJCSJJUV9SRVNbJWRdPTB4JXhcbiIsCiAJCQkJCWlkeCwgaXFfcmVzW2lkeF0sIGlkeCArIDEsCiAJCQkJCWlxX3Jlc1tpZHggKyAxXSk7CkBAIC05MzQsMTAgKzkzNSwxMiBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhdGg5a19od19jYWxfZGF0YSAqY2FsZGF0YSA9IGFoLT5jYWxkYXRhOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAlib29sIHR4aXFjYWxfZG9uZSA9IGZhbHNlLCB0eGNsY2FsX2RvbmUgPSBmYWxzZTsKIAlib29sIGlzX3JldXNhYmxlID0gdHJ1ZSwgc3RhdHVzID0gdHJ1ZTsKIAlib29sIHJ1bl9ydHRfY2FsID0gZmFsc2UsIHJ1bl9hZ2NfY2FsOwogCWJvb2wgcnR0ID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SVFQpOworCWJvb2wgbWNpID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpOwogCXUzMiBhZ2NfY3RybCA9IDAsIGFnY19zdXBwX2NhbHMgPSBBUl9QSFlfQUdDX0NPTlRST0xfT0ZGU0VUX0NBTCB8CiAJCQkJCSAgQVJfUEhZX0FHQ19DT05UUk9MX0ZMVFJfQ0FMICAgfAogCQkJCQkgIEFSX1BIWV9BR0NfQ09OVFJPTF9QS0RFVF9DQUw7CkBAIC0xMDA1LDYgKzEwMDgsMzEgQEAKIAl9IGVsc2UgaWYgKGNhbGRhdGEgJiYgIWNhbGRhdGEtPmRvbmVfdHhpcWNhbF9vbmNlKQogCQlydW5fYWdjX2NhbCA9IHRydWU7CiAKKwlpZiAobWNpICYmIElTX0NIQU5fMkdIWihjaGFuKSAmJgorCSAgICAobWNpX2h3LT5idF9zdGF0ZSAgPT0gTUNJX0JUX0FXQUtFKSAmJgorCSAgICBydW5fYWdjX2NhbCAmJgorCSAgICAhKG1jaV9ody0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9NQ0lfQ0FMKSkgeworCisJCXUzMiBwbGRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJLyogc2VuZCBDQUxfUkVRIG9ubHkgd2hlbiBCVCBpcyBBV0FLRS4gKi8KKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHNlbmQgV0xBTl9DQUxfUkVRIDB4JXhcbiIsCisJCQltY2lfaHctPndsYW5fY2FsX3NlcSk7CisJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBsZCwgTUNJX0dQTV9XTEFOX0NBTF9SRVEpOworCQlwbGRbTUNJX0dQTV9XTEFOX0NBTF9XX1NFUVVFTkNFXSA9IG1jaV9ody0+d2xhbl9jYWxfc2VxKys7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwbGQsIDE2LCB0cnVlLCBmYWxzZSk7CisKKwkJLyogV2FpdCBCVF9DQUxfR1JBTlQgZm9yIDUwbXMgKi8KKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHdhaXQgZm9yIEJUX0NBTF9HUkFOVCIpOworCisJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShhaCwgTUNJX0dQTV9CVF9DQUxfR1JBTlQsIDAsIDUwMDAwKSkKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBnb3QgQlRfQ0FMX0dSQU5UIik7CisJCWVsc2UgeworCQkJaXNfcmV1c2FibGUgPSBmYWxzZTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIlxuTUNJIEJUIGlzIG5vdCByZXNwb25kaW5nIik7CisJCX0KKwl9CisKIAl0eGlxY2FsX2RvbmUgPSBhcjkwMDNfaHdfdHhfaXFfY2FsX3J1bihhaCk7CiAJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQUNUSVZFLCBBUl9QSFlfQUNUSVZFX0RJUyk7CiAJdWRlbGF5KDUpOwpAQCAtMTAyMiw2ICsxMDUwLDIxIEBACiAJCQkJICAgICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwsCiAJCQkJICAgICAgIDAsIEFIX1dBSVRfVElNRU9VVCk7CiAJfQorCisJaWYgKG1jaSAmJiBJU19DSEFOXzJHSFooY2hhbikgJiYKKwkgICAgKG1jaV9ody0+YnRfc3RhdGUgID09IE1DSV9CVF9BV0FLRSkJJiYKKwkgICAgcnVuX2FnY19jYWwJJiYKKwkgICAgIShtY2lfaHctPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCkpIHsKKworCQl1MzIgcGxkWzRdID0gezAsIDAsIDAsIDB9OworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIFdMQU5fQ0FMX0RPTkUgMHgleFxuIiwKKwkJCW1jaV9ody0+d2xhbl9jYWxfZG9uZSk7CisJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBsZCwgTUNJX0dQTV9XTEFOX0NBTF9ET05FKTsKKwkJcGxkW01DSV9HUE1fV0xBTl9DQUxfV19TRVFVRU5DRV0gPSBtY2lfaHctPndsYW5fY2FsX2RvbmUrKzsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBsZCwgMTYsIHRydWUsIGZhbHNlKTsKKwl9CisKIAlpZiAocnR0ICYmICFydW5fcnR0X2NhbCkgewogCQlhZ2NfY3RybCB8PSBhZ2Nfc3VwcF9jYWxzOwogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwgYWdjX2N0cmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggM2IyNjJiYTYuLjRiYTZmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwpAQCAtMTIxLDEwICsxMjEsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTE0NCw3ICsxNDIsNyBAQAogCSB9LAogCS5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAl9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCkBAIC0zMjMsMTAgKzMyMSw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7MCwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hDaCBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC02OTgsMTAgKzY5NCw4IEBACiAJCSAqIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4KIAkJICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MSwgMSwgMX0sLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezEsIDEsIDF9LCAvKiAzIGNoYWluICAqLwotCQkuZGJfc3RhZ2UzID0gezAsIDAsIDB9LAotCQkuZGJfc3RhZ2U0ID0gezAsIDAsIDB9LAorCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtNzIxLDcgKzcxNSw3IEBACiAJIH0sCiAJIC5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAkgfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLApAQCAtOTAwLDEwICs4OTQsOCBAQAogCQkuc3B1ckNoYW5zID0ge0ZSRVEyRkJJTig1NTAwLCAwKSwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hDaCBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDB4ZiwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTEyNzYsMTAgKzEyNjgsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTEyOTEsMjAgKzEyODEsMjAgQEAKIAkJLnR4RW5kVG9SeE9uID0gMHgyLAogCQkudHhGcmFtZVRvWHBhT24gPSAweGUsCiAJCS50aHJlc2g2MiA9IDI4LAotCQkucGFwZFJhdGVNYXNrSHQyMCA9IExFMzIoMHg4MGMwODApLAotCQkucGFwZFJhdGVNYXNrSHQ0MCA9IExFMzIoMHg4MGMwODApLAorCQkucGFwZFJhdGVNYXNrSHQyMCA9IExFMzIoMHgwYzgwYzA4MCksCisJCS5wYXBkUmF0ZU1hc2tIdDQwID0gTEUzMigweDAwODBjMDgwKSwKIAkJLmZ1dHVyZU1vZGFsID0gewogCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkJfSwKIAl9LAogCS5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAl9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCiAJCUZSRVEyRkJJTigyNDM3LCAxKSwKLQkJRlJFUTJGQklOKDI0NzIsIDEpLAorCQlGUkVRMkZCSU4oMjQ2MiwgMSksCiAJfSwKIAkvKiBhcjkzMDBfY2FsX2RhdGFfcGVyX2ZyZXFfb3BfbG9vcCAyZyAqLwogCS5jYWxQaWVyRGF0YTJHID0gewpAQCAtMTMxNCw3ICsxMzA0LDcgQEAKIAl9LAogCS5jYWxUYXJnZXRfZnJlcWJpbl9DY2sgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKLQkJRlJFUTJGQklOKDI0ODQsIDEpLAorCQlGUkVRMkZCSU4oMjQ3MiwgMSksCiAJfSwKIAkuY2FsVGFyZ2V0X2ZyZXFiaW5fMkcgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKQEAgLTE0NzgsMTAgKzE0NjgsOCBAQAogCQkuc3B1ckNoYW5zID0gezAsIDAsIDAsIDAsIDB9LAogCQkvKiBub2lzZUZsb29yVGhyZXNoQ2ggQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbiAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMyA9IHszLCAzLCAzfSwgLyogZG9lc24ndCBleGlzdCBmb3IgMkcgKi8KLQkJLmRiX3N0YWdlNCA9IHszLCAzLCAzfSwJIC8qIGRvbid0IGV4aXN0IGZvciAyRyAqLworCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTUxNSw3ICsxNTAzLDcgQEAKIAkJRlJFUTJGQklOKDU1MDAsIDApLAogCQlGUkVRMkZCSU4oNTYwMCwgMCksCiAJCUZSRVEyRkJJTig1NzAwLCAwKSwKLQkJRlJFUTJGQklOKDU4MjUsIDApCisJCUZSRVEyRkJJTig1Nzg1LCAwKQogCX0sCiAJLmNhbFBpZXJEYXRhNUcgPSB7CiAJCXsKQEAgLTE4NTQsMTAgKzE4NDIsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTE4NzcsNyArMTg2Myw3IEBACiAJfSwKIAkuYmFzZV9leHQxID0gewogCQkuYW50X2Rpdl9jb250cm9sID0gMCwKLQkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CiAJfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLApAQCAtMjA1NiwxMCArMjA0Miw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7MCwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hjaCBjaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC0yNDMxLDEwICsyNDE1LDggQEAKIAkJICogaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbgogCQkgKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHsxLCAxLCAxfSwvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MSwgMSwgMX0sIC8qIDMgY2hhaW4gICovCi0JCS5kYl9zdGFnZTMgPSB7MCwgMCwgMH0sCi0JCS5kYl9zdGFnZTQgPSB7MCwgMCwgMH0sCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC0yNDU0LDEyICsyNDM2LDEyIEBACiAJIH0sCiAJIC5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAkgfSwKIAkuY2FsRnJlcVBpZXIyRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLAogCQlGUkVRMkZCSU4oMjQzNywgMSksCi0JCUZSRVEyRkJJTigyNDcyLCAxKSwKKwkJRlJFUTJGQklOKDI0NjIsIDEpLAogCSB9LAogCS8qIGFyOTMwMF9jYWxfZGF0YV9wZXJfZnJlcV9vcF9sb29wIDJnICovCiAJLmNhbFBpZXJEYXRhMkcgPSB7CkBAIC0yNjMzLDEwICsyNjE1LDggQEAKIAkJLnNwdXJDaGFucyA9IHswLCAwLCAwLCAwLCAwfSwKIAkJLyogbm9pc2VGbG9vclRocmVzaENoIENoZWNrIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4gKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTMgPSB7MywgMywgM30sIC8qIGRvZXNuJ3QgZXhpc3QgZm9yIDJHICovCi0JCS5kYl9zdGFnZTQgPSB7MywgMywgM30sCSAvKiBkb24ndCBleGlzdCBmb3IgMkcgKi8KKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTI2NjMsNyArMjY0Myw3IEBACiAJCS54YXR0ZW4xTWFyZ2luSGlnaCA9IHswLCAwLCAwfQogCSB9LAogCS5jYWxGcmVxUGllcjVHID0gewotCQlGUkVRMkZCSU4oNTE4MCwgMCksCisJCUZSRVEyRkJJTig1MTYwLCAwKSwKIAkJRlJFUTJGQklOKDUyMjAsIDApLAogCQlGUkVRMkZCSU4oNTMyMCwgMCksCiAJCUZSRVEyRkJJTig1NDAwLCAwKSwKQEAgLTMwMjMsNiArMzAwMyw4IEBACiAJCXJldHVybiBlZXAtPm1vZGFsSGVhZGVyNUcuYW50ZW5uYUdhaW47CiAJY2FzZSBFRVBfQU5URU5OQV9HQUlOXzJHOgogCQlyZXR1cm4gZWVwLT5tb2RhbEhlYWRlcjJHLmFudGVubmFHYWluOworCWNhc2UgRUVQX1FVSUNLX0RST1A6CisJCXJldHVybiBwQmFzZS0+bWlzY0NvbmZpZ3VyYXRpb24gJiBCSVQoMSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzQyOCwyNSArMzQxMCwxNCBAQAogCVBSX0VFUCgiQ2hhaW4wIE5GIFRocmVzaG9sZCIsIG1vZGFsX2hkci0+bm9pc2VGbG9vclRocmVzaENoWzBdKTsKIAlQUl9FRVAoIkNoYWluMSBORiBUaHJlc2hvbGQiLCBtb2RhbF9oZHItPm5vaXNlRmxvb3JUaHJlc2hDaFsxXSk7CiAJUFJfRUVQKCJDaGFpbjIgTkYgVGhyZXNob2xkIiwgbW9kYWxfaGRyLT5ub2lzZUZsb29yVGhyZXNoQ2hbMl0pOworCVBSX0VFUCgiUXVpY2sgRHJvcCIsIG1vZGFsX2hkci0+cXVpY2tfZHJvcCk7CisJUFJfRUVQKCJ0eEVuZFRvWHBhT2ZmIiwgbW9kYWxfaGRyLT50eEVuZFRvWHBhT2ZmKTsKIAlQUl9FRVAoInhQQSBCaWFzIExldmVsIiwgbW9kYWxfaGRyLT54cGFCaWFzTHZsKTsKIAlQUl9FRVAoInR4RnJhbWVUb0RhdGFTdGFydCIsIG1vZGFsX2hkci0+dHhGcmFtZVRvRGF0YVN0YXJ0KTsKIAlQUl9FRVAoInR4RnJhbWVUb1BhT24iLCBtb2RhbF9oZHItPnR4RnJhbWVUb1BhT24pOwogCVBSX0VFUCgidHhGcmFtZVRvWHBhT24iLCBtb2RhbF9oZHItPnR4RnJhbWVUb1hwYU9uKTsKIAlQUl9FRVAoInR4Q2xpcCIsIG1vZGFsX2hkci0+dHhDbGlwKTsKIAlQUl9FRVAoIkFEQyBEZXNpcmVkIHNpemUiLCBtb2RhbF9oZHItPmFkY0Rlc2lyZWRTaXplKTsKLQlQUl9FRVAoIkNoYWluMCBvYiIsIG1vZGFsX2hkci0+b2JbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIG9iIiwgbW9kYWxfaGRyLT5vYlsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgb2IiLCBtb2RhbF9oZHItPm9iWzJdKTsKLQotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlMiIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UyWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTIiLCBtb2RhbF9oZHItPmRiX3N0YWdlMlsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2UyIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTJbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlMyIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UzWzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTMiLCBtb2RhbF9oZHItPmRiX3N0YWdlM1sxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2UzIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTNbMl0pOwotCVBSX0VFUCgiQ2hhaW4wIGRiX3N0YWdlNCIsIG1vZGFsX2hkci0+ZGJfc3RhZ2U0WzBdKTsKLQlQUl9FRVAoIkNoYWluMSBkYl9zdGFnZTQiLCBtb2RhbF9oZHItPmRiX3N0YWdlNFsxXSk7Ci0JUFJfRUVQKCJDaGFpbjIgZGJfc3RhZ2U0IiwgbW9kYWxfaGRyLT5kYl9zdGFnZTRbMl0pOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTM1MDMsNiArMzQ3NCw3IEBACiAJUFJfRUVQKCJJbnRlcm5hbCByZWd1bGF0b3IiLCAhIShwQmFzZS0+ZmVhdHVyZUVuYWJsZSAmIEJJVCg0KSkpOwogCVBSX0VFUCgiRW5hYmxlIFBhcHJkIiwgISEocEJhc2UtPmZlYXR1cmVFbmFibGUgJiBCSVQoNSkpKTsKIAlQUl9FRVAoIkRyaXZlciBTdHJlbmd0aCIsICEhKHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiAmIEJJVCgwKSkpOworCVBSX0VFUCgiUXVpY2sgRHJvcCIsICEhKHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiAmIEJJVCgxKSkpOwogCVBSX0VFUCgiQ2hhaW4gbWFzayBSZWR1Y2UiLCAocEJhc2UtPm1pc2NDb25maWd1cmF0aW9uID4+IDB4MykgJiAweDEpOwogCVBSX0VFUCgiV3JpdGUgZW5hYmxlIEdwaW8iLCBwQmFzZS0+ZWVwcm9tV3JpdGVFbmFibGVHcGlvKTsKIAlQUl9FRVAoIldMQU4gRGlzYWJsZSBHcGlvIiwgcEJhc2UtPndsYW5EaXNhYmxlR3Bpbyk7CkBAIC0zOTY1LDYgKzM5MzcsNDAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZnJlcSkKK3sKKwlzdHJ1Y3QgYXI5MzAwX2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20uYXI5MzAwX2VlcDsKKwlpbnQgcXVpY2tfZHJvcCA9IGF0aDlrX2h3X2FyOTMwMF9nZXRfZWVwcm9tKGFoLCBFRVBfUVVJQ0tfRFJPUCk7CisJczMyIHRbM10sIGZbM10gPSB7NTE4MCwgNTUwMCwgNTc4NX07CisKKwlpZiAoIXF1aWNrX2Ryb3ApCisJCXJldHVybjsKKworCWlmIChmcmVxIDwgNDAwMCkKKwkJcXVpY2tfZHJvcCA9IGVlcC0+bW9kYWxIZWFkZXIyRy5xdWlja19kcm9wOworCWVsc2UgeworCQl0WzBdID0gZWVwLT5iYXNlX2V4dDEucXVpY2tfZHJvcF9sb3c7CisJCXRbMV0gPSBlZXAtPm1vZGFsSGVhZGVyNUcucXVpY2tfZHJvcDsKKwkJdFsyXSA9IGVlcC0+YmFzZV9leHQxLnF1aWNrX2Ryb3BfaGlnaDsKKwkJcXVpY2tfZHJvcCA9IGFyOTAwM19od19wb3dlcl9pbnRlcnBvbGF0ZShmcmVxLCBmLCB0LCAzKTsKKwl9CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0FHQywgQVJfUEhZX0FHQ19RVUlDS19EUk9QLCBxdWlja19kcm9wKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX2h3X3R4ZW5kX3RvX3hwYV9vZmZfYXBwbHkoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBmcmVxKQoreworCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOworCXUzMiB2YWx1ZTsKKworCXZhbHVlID0gKGZyZXEgPCA0MDAwKSA/IGVlcC0+bW9kYWxIZWFkZXIyRy50eEVuZFRvWHBhT2ZmIDoKKwkJCQllZXAtPm1vZGFsSGVhZGVyNUcudHhFbmRUb1hwYU9mZjsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFCX09GRiwgdmFsdWUpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFBX09GRiwgdmFsdWUpOworfQorCiBzdGF0aWMgdm9pZCBhdGg5a19od19hcjkzMDBfc2V0X2JvYXJkX3ZhbHVlcyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKQEAgLTM5NzIsMTAgKzM5NzgsMTIgQEAKIAlhcjkwMDNfaHdfYW50X2N0cmxfYXBwbHkoYWgsIElTX0NIQU5fMkdIWihjaGFuKSk7CiAJYXI5MDAzX2h3X2RyaXZlX3N0cmVuZ3RoX2FwcGx5KGFoKTsKIAlhcjkwMDNfaHdfYXR0ZW5fYXBwbHkoYWgsIGNoYW4pOworCWFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KGFoLCBjaGFuLT5jaGFubmVsKTsKIAlpZiAoIUFSX1NSRVZfOTMzMChhaCkgJiYgIUFSX1NSRVZfOTM0MChhaCkpCiAJCWFyOTAwM19od19pbnRlcm5hbF9yZWd1bGF0b3JfYXBwbHkoYWgpOwogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkKIAkJYXI5MDAzX2h3X2FwcGx5X3R1bmluZ19jYXBzKGFoKTsKKwlhcjkwMDNfaHdfdHhlbmRfdG9feHBhX29mZl9hcHBseShhaCwgY2hhbi0+Y2hhbm5lbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X2FyOTMwMF9zZXRfYWRkYWMoc3RydWN0IGF0aF9odyAqYWgsCkBAIC00NzcxLDcgKzQ3NzksNyBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhcjkzMDBfZWVwcm9tICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLmFyOTMwMF9lZXA7Ci0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCWludCBpOwogCXUxNiBzY2FsZWRQb3dlciA9IDAsIG1pbkN0bFBvd2VyOwogCXN0YXRpYyBjb25zdCB1MTYgY3RsTW9kZXNGb3IxMWFbXSA9IHsKQEAgLTQ4NzIsNiArNDg4MCw3IEBACiAJCQljdGxOdW0gPSBBUjkzMDBfTlVNX0NUTFNfNUc7CiAJCX0KIAorCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCQlmb3IgKGkgPSAwOyAoaSA8IGN0bE51bSkgJiYgY3RsSW5kZXhbaV07IGkrKykgewogCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVHVUxBVE9SWSwKIAkJCQkiTE9PUC1DdGxpZHggJWQ6IGNmZ0N0bCAweCUyLjJ4IHBDdGxNb2RlIDB4JTIuMnggY3RsSW5kZXggMHglMi4yeCBjaGFuICVkXG4iLApAQCAtNTA1MSw2ICs1MDYwLDggQEAKIAkJCXJlZ3VsYXRvcnktPm1heF9wb3dlcl9sZXZlbCA9IHRhcmdldFBvd2VyVmFsVDJbaV07CiAJfQogCisJYXRoOWtfaHdfdXBkYXRlX3JlZ3VsYXRvcnlfbWF4cG93ZXIoYWgpOworCiAJaWYgKHRlc3QpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmgKaW5kZXggNjMzNWE4Ni4uYmIyMjNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5oCkBAIC0yMTYsMTAgKzIxNiw4IEBACiAJdTggc3B1ckNoYW5zW0FSX0VFUFJPTV9NT0RBTF9TUFVSU107CiAJLyogMyAgQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbiAqLwogCWludDhfdCBub2lzZUZsb29yVGhyZXNoQ2hbQVI5MzAwX01BWF9DSEFJTlNdOwotCXU4IG9iW0FSOTMwMF9NQVhfQ0hBSU5TXTsKLQl1OCBkYl9zdGFnZTJbQVI5MzAwX01BWF9DSEFJTlNdOwotCXU4IGRiX3N0YWdlM1tBUjkzMDBfTUFYX0NIQUlOU107Ci0JdTggZGJfc3RhZ2U0W0FSOTMwMF9NQVhfQ0hBSU5TXTsKKwl1OCByZXNlcnZlZFsxMV07CisJaW50OF90IHF1aWNrX2Ryb3A7CiAJdTggeHBhQmlhc0x2bDsKIAl1OCB0eEZyYW1lVG9EYXRhU3RhcnQ7CiAJdTggdHhGcmFtZVRvUGFPbjsKQEAgLTI2OSw3ICsyNjcsOSBAQAogCiBzdHJ1Y3QgYXI5MzAwX0Jhc2VFeHRlbnNpb25fMSB7CiAJdTggYW50X2Rpdl9jb250cm9sOwotCXU4IGZ1dHVyZVsxM107CisJdTggZnV0dXJlWzExXTsKKwlpbnQ4X3QgcXVpY2tfZHJvcF9sb3c7CisJaW50OF90IHF1aWNrX2Ryb3BfaGlnaDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBhcjkzMDBfQmFzZUV4dGVuc2lvbl8yIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5jCmluZGV4IGIzNjNjYzAuLjYzMWZlNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYwpAQCAtMTMsNiArMTMsNyBAQAogICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJody5oIgogI2luY2x1ZGUgImFyOTAwM19tYWMuaCIKIApAQCAtMTc0LDIwICsxNzUsMjQgQEAKIAl1MzIgaXNyID0gMDsKIAl1MzIgbWFzazIgPSAwOwogCXN0cnVjdCBhdGg5a19od19jYXBhYmlsaXRpZXMgKnBDYXAgPSAmYWgtPmNhcHM7Ci0JdTMyIHN5bmNfY2F1c2UgPSAwOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgc3luY19jYXVzZSA9IDAsIGFzeW5jX2NhdXNlOwogCi0JaWYgKFJFR19SRUFEKGFoLCBBUl9JTlRSX0FTWU5DX0NBVVNFKSAmIEFSX0lOVFJfTUFDX0lSUSkgeworCWFzeW5jX2NhdXNlID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfQVNZTkNfQ0FVU0UpOworCisJaWYgKGFzeW5jX2NhdXNlICYgKEFSX0lOVFJfTUFDX0lSUSB8IEFSX0lOVFJfQVNZTkNfTUFTS19NQ0kpKSB7CiAJCWlmICgoUkVHX1JFQUQoYWgsIEFSX1JUQ19TVEFUVVMpICYgQVJfUlRDX1NUQVRVU19NKQogCQkJCT09IEFSX1JUQ19TVEFUVVNfT04pCiAJCQlpc3IgPSBSRUdfUkVBRChhaCwgQVJfSVNSKTsKIAl9CiAKKwogCXN5bmNfY2F1c2UgPSBSRUdfUkVBRChhaCwgQVJfSU5UUl9TWU5DX0NBVVNFKSAmIEFSX0lOVFJfU1lOQ19ERUZBVUxUOwogCiAJKm1hc2tlZCA9IDA7CiAKLQlpZiAoIWlzciAmJiAhc3luY19jYXVzZSkKKwlpZiAoIWlzciAmJiAhc3luY19jYXVzZSAmJiAhYXN5bmNfY2F1c2UpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChpc3IpIHsKQEAgLTI5Myw2ICsyOTgsMzUgQEAKIAkJCWFyOTAwM19od19iYl93YXRjaGRvZ19yZWFkKGFoKTsKIAl9CiAKKwlpZiAoYXN5bmNfY2F1c2UgJiBBUl9JTlRSX0FTWU5DX01BU0tfTUNJKSB7CisJCXUzMiByYXdfaW50ciwgcnhfbXNnX2ludHI7CisKKwkJcnhfbXNnX2ludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKTsKKwkJcmF3X2ludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcpOworCisJCWlmICgocmF3X2ludHIgPT0gMHhkZWFkYmVlZikgfHwgKHJ4X21zZ19pbnRyID09IDB4ZGVhZGJlZWYpKQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgZ2V0cyAweGRlYWRiZWVmIGR1cmluZyBNQ0kgaW50IHByb2Nlc3NpbmciCisJCQkJIm5ldyByYXdfaW50cj0weCUwOHgsIG5ldyByeF9tc2dfcmF3PTB4JTA4eCwgIgorCQkJCSJyYXdfaW50cj0weCUwOHgsIHJ4X21zZ19yYXc9MHglMDh4XG4iLAorCQkJCXJhd19pbnRyLCByeF9tc2dfaW50ciwgbWNpLT5yYXdfaW50ciwKKwkJCQltY2ktPnJ4X21zZ19pbnRyKTsKKwkJZWxzZSB7CisJCQltY2ktPnJ4X21zZ19pbnRyIHw9IHJ4X21zZ19pbnRyOworCQkJbWNpLT5yYXdfaW50ciB8PSByYXdfaW50cjsKKwkJCSptYXNrZWQgfD0gQVRIOUtfSU5UX01DSTsKKworCQkJaWYgKHJ4X21zZ19pbnRyICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPKQorCQkJCW1jaS0+Y29udF9zdGF0dXMgPQorCQkJCQlSRUdfUkVBRChhaCwgQVJfTUNJX0NPTlRfU1RBVFVTKTsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsIHJ4X21zZ19pbnRyKTsKKwkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsIHJhd19pbnRyKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIkFSX0lOVFJfU1lOQ19NQ0lcbiIpOworCisJCX0KKwl9CisKIAlpZiAoc3luY19jYXVzZSkgewogCQlpZiAoc3luY19jYXVzZSAmIEFSX0lOVFJfU1lOQ19SQURNX0NQTF9USU1FT1VUKSB7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX1JDLCBBUl9SQ19IT1NUSUYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5OTgyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21jaS5jCkBAIC0wLDAgKzEsMTQ2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImFyOTAwM19waHkuaCIKKyNpbmNsdWRlICJhcjkwMDNfbWNpLmgiCisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfcmVzZXRfcmVxX3dha2V1cChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlpZiAoIUFSX1NSRVZfOTQ2Ml8yMChhaCkpCisJCXJldHVybjsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9DT01NQU5EMiwKKwkJICAgICAgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVAsIDEpOworCXVkZWxheSgxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfQ09NTUFORDIsCisJCSAgICAgIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SRVFfV0FLRVVQLCAwKTsKK30KKworc3RhdGljIGludCBhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGFkZHJlc3MsCisJCQkJCXUzMiBiaXRfcG9zaXRpb24sIGludCB0aW1lX291dCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCXdoaWxlICh0aW1lX291dCkgeworCisJCWlmIChSRUdfUkVBRChhaCwgYWRkcmVzcykgJiBiaXRfcG9zaXRpb24pIHsKKworCQkJUkVHX1dSSVRFKGFoLCBhZGRyZXNzLCBiaXRfcG9zaXRpb24pOworCisJCQlpZiAoYWRkcmVzcyA9PSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcpIHsKKworCQkJCWlmIChiaXRfcG9zaXRpb24gJgorCQkJCSAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSkKKwkJCQkJYXI5MDAzX21jaV9yZXNldF9yZXFfd2FrZXVwKGFoKTsKKworCQkJCWlmIChiaXRfcG9zaXRpb24gJgorCQkJCSAgICAoQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HIHwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcpKQorCQkJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUpOworCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSgxMCk7CisJCXRpbWVfb3V0IC09IDEwOworCisJCWlmICh0aW1lX291dCA8IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAodGltZV9vdXQgPD0gMCkgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFdhaXQgZm9yIFJlZyAweCUwOHggPSAweCUwOHggdGltZW91dC5cbiIsCisJCQlhZGRyZXNzLCBiaXRfcG9zaXRpb24pOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIElOVF9SQVcgPSAweCUwOHgsIFJYX01TR19SQVcgPSAweCUwOHgiLAorCQkJUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXKSwKKwkJCVJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcpKTsKKwkJdGltZV9vdXQgPSAwOworCX0KKworCXJldHVybiB0aW1lX291dDsKK30KKwordm9pZCBhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJdTMyIHBheWxvYWRbNF0gPSB7IDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmMDB9OworCisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRU1PVEVfUkVTRVQsIDAsIHBheWxvYWQsIDE2LAorCQkJCXdhaXRfZG9uZSwgZmFsc2UpOworCXVkZWxheSg1KTsKK30KKwordm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwl1MzIgcGF5bG9hZCA9IDB4MDAwMDAwMDA7CisKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0xOQV9UUkFOUywgMCwgJnBheWxvYWQsIDEsCisJCQkJd2FpdF9kb25lLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9yZXFfd2FrZShzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRVFfV0FLRSwgTUNJX0ZMQUdfRElTQUJMRV9USU1FU1RBTVAsCisJCQkJTlVMTCwgMCwgd2FpdF9kb25lLCBmYWxzZSk7CisJdWRlbGF5KDUpOworfQorCit2b2lkIGFyOTAwM19tY2lfc2VuZF9zeXNfd2FraW5nKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1NZU19XQUtJTkcsIE1DSV9GTEFHX0RJU0FCTEVfVElNRVNUQU1QLAorCQkJCU5VTEwsIDAsIHdhaXRfZG9uZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3Rha2Uoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgd2FpdF9kb25lKQoreworCXUzMiBwYXlsb2FkID0gMHg3MDAwMDAwMDsKKworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfTE5BX1RBS0UsIDAsICZwYXlsb2FkLCAxLAorCQkJCXdhaXRfZG9uZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfc3lzX3NsZWVwaW5nKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1NZU19TTEVFUElORywKKwkJCQlNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCwKKwkJCQlOVUxMLCAwLCB3YWl0X2RvbmUsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9xdWVyeShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJICAgICAgIGJvb2wgd2FpdF9kb25lKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKworCWlmICghbWNpLT5idF92ZXJzaW9uX2tub3duICYmCisJCQkobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApKSB7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIENvZXggdmVyc2lvbiBxdWVyeVxuIik7CisJCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWSk7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQl3YWl0X2RvbmUsIHRydWUpOworCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9yZXNwb25zZShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCSAgICAgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIFNlbmQgQ29leCB2ZXJzaW9uIHJlc3BvbnNlXG4iKTsKKwlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLCBNQ0lfR1BNX0NPRVhfQUdFTlQsCisJCQlNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRSk7CisJKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9NQUpPUl9WRVJTSU9OKSA9CisJCW1jaS0+d2xhbl92ZXJfbWFqb3I7CisJKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9NSU5PUl9WRVJTSU9OKSA9CisJCW1jaS0+d2xhbl92ZXJfbWlub3I7CisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LCB3YWl0X2RvbmUsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfY29leF93bGFuX2NoYW5uZWxzKHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCQkJICBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyICpwYXlsb2FkID0gJm1jaS0+d2xhbl9jaGFubmVsc1swXTsKKworCWlmICgobWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9PSB0cnVlKSAmJgorCQkJKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSkgeworCQlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLAorCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9XTEFOX0NIQU5ORUxTKTsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LAorCQkJCQl3YWl0X2RvbmUsIHRydWUpOworCQlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwYXlsb2FkLCAweGZmLCAweGZmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X3N0YXR1c19xdWVyeShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCWJvb2wgd2FpdF9kb25lLCB1OCBxdWVyeV90eXBlKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKwlib29sIHF1ZXJ5X2J0aW5mbyA9ICEhKHF1ZXJ5X3R5cGUgJiAoTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPIHwKKwkJCQkJICAgICBNQ0lfR1BNX0NPRVhfUVVFUllfQlRfVE9QT0xPR1kpKTsKKworCWlmIChtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgU2VuZCBDb2V4IEJUIFN0YXR1cyBRdWVyeSAweCUwMlhcbiIsIHF1ZXJ5X3R5cGUpOworCisJCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZKTsKKworCQkqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0JUX0JJVE1BUCkgPSBxdWVyeV90eXBlOworCQkvKgorCQkgKiBJZiBidF9zdGF0dXNfcXVlcnkgbWVzc2FnZSBpcyAgbm90IHNlbnQgc3VjY2Vzc2Z1bGx5LAorCQkgKiB0aGVuIG5lZWRfZmx1c2hfYnRpbmZvIHNob3VsZCBiZSBzZXQgYWdhaW4uCisJCSAqLworCQlpZiAoIWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJICAgICB3YWl0X2RvbmUsIHRydWUpKSB7CisJCQlpZiAocXVlcnlfYnRpbmZvKSB7CisJCQkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgc2VuZCBidF9zdGF0dXNfcXVlcnkgZmFpbCwgIgorCQkJCQkic2V0IGZsdXNoIGZsYWcgYWdhaW5cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKHF1ZXJ5X2J0aW5mbykKKwkJCW1jaS0+cXVlcnlfYnQgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaGFsdCwKKwkJCQkgICAgICBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgU2VuZCBDb2V4ICVzIEJUIEdQTS5cbiIsCisJCShoYWx0KSA/ICJoYWx0IiA6ICJ1bmhhbHQiKTsKKworCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfSEFMVF9CVF9HUE0pOworCisJaWYgKGhhbHQpIHsKKwkJbWNpLT5xdWVyeV9idCA9IHRydWU7CisJCS8qIFNlbmQgbmV4dCB1bmhhbHQgbm8gbWF0dGVyIGhhbHQgc2VudCBvciBub3QgKi8KKwkJbWNpLT51bmhhbHRfYnRfZ3BtID0gdHJ1ZTsKKwkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPQorCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUOworCX0gZWxzZQorCQkqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUpID0KKwkJCU1DSV9HUE1fQ09FWF9CVF9HUE1fVU5IQUxUOworCisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LCB3YWl0X2RvbmUsIHRydWUpOworfQorCisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfcHJlcF9pbnRlcmZhY2Uoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBzYXZlZF9tY2lfaW50X2VuOworCXUzMiBtY2lfdGltZW91dCA9IDE1MDsKKworCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfU0xFRVA7CisJc2F2ZWRfbWNpX2ludF9lbiA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOKTsKKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgMCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCSAgUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVykpOworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCSAgUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXKSk7CisKKwkvKiBSZW1vdGUgUmVzZXQgKi8KKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgUmVzZXQgc2VxdWVuY2Ugc3RhcnRcbiIpOworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBzZW5kIFJFTU9URV9SRVNFVFxuIik7CisJYXI5MDAzX21jaV9yZW1vdGVfcmVzZXQoYWgsIHRydWUpOworCisJLyoKKwkgKiBUaGlzIGRlbGF5IGlzIHJlcXVpcmVkIGZvciB0aGUgcmVzZXQgZGVsYXkgd29yc3QgY2FzZSB2YWx1ZSAyNTUgaW4KKwkgKiBNQ0lfQ09NTUFORDIgcmVnaXN0ZXIKKwkgKi8KKworCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpKQorCQl1ZGVsYXkoMjUyKTsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIFJFUV9XQUtFIHRvIHJlbW90ZXIoQlQpXG4iKTsKKwlhcjkwMDNfbWNpX3NlbmRfcmVxX3dha2UoYWgsIHRydWUpOworCisJaWYgKGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORywgNTAwKSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIFNZU19XQUtJTkcgZnJvbSByZW1vdGUoQlQpXG4iKTsKKwkJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKworCQlpZiAoQVJfU1JFVl85NDYyXzEwKGFoKSkKKwkJCXVkZWxheSgxMCk7CisJCS8qCisJCSAqIHdlIGRvbid0IG5lZWQgdG8gc2VuZCBtb3JlIHJlbW90ZV9yZXNldCBhdCB0aGlzIG1vbWVudC4KKwkJICogSWYgQlQgcmVjZWl2ZSBmaXJzdCByZW1vdGVfcmVzZXQsIHRoZW4gQlQgSFcgd2lsbAorCQkgKiBiZSBjbGVhbmVkIHVwIGFuZCB3aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSByZXFfd2FrZQorCQkgKiBhbmQgQlQgSFcgd2lsbCByZXNwb25kIHN5c193YWtpbmcuCisJCSAqIEluIHRoaXMgY2FzZSwgV0xBTiB3aWxsIHJlY2VpdmUgQlQncyBIVyBzeXNfd2FraW5nLgorCQkgKiBPdGhlcndpc2UsIGlmIEJUIFNXIG1pc3NlZCBpbml0aWFsIHJlbW90ZV9yZXNldCwKKwkJICogdGhhdCByZW1vdGVfcmVzZXQgd2lsbCBzdGlsbCBjbGVhbiB1cCBCVCBNQ0kgUlgsCisJCSAqIGFuZCB0aGUgcmVxX3dha2Ugd2lsbCB3YWtlIEJUIHVwLAorCQkgKiBhbmQgQlQgU1cgd2lsbCByZXNwb25kIHRoaXMgcmVxX3dha2Ugd2l0aCBhIHJlbW90ZV9yZXNldCBhbmQKKwkJICogc3lzX3dha2luZy4gSW4gdGhpcyBjYXNlLCBXTEFOIHdpbGwgcmVjZWl2ZSBCVCdzIFNXCisJCSAqIHN5c193YWtpbmcuIEluIGVpdGhlciBjYXNlLCBCVCdzIFJYIGlzIGNsZWFuZWQgdXAuIFNvIHdlCisJCSAqIGRvbid0IG5lZWQgdG8gcmVwbHkgQlQncyByZW1vdGVfcmVzZXQgbm93LCBpZiBhbnkuCisJCSAqIFNpbWlsYXJseSwgaWYgaW4gYW55IGNhc2UsIFdMQU4gY2FuIHJlY2VpdmUgQlQncyBzeXNfd2FraW5nLAorCQkgKiB0aGF0IG1lYW5zIFdMQU4ncyBSWCBpcyBhbHNvIGZpbmUuCisJCSAqLworCisJCS8qIFNlbmQgU1lTX1dBS0lORyB0byBCVCAqLworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgc2VuZCBTVyBTWVNfV0FLSU5HIHRvIHJlbW90ZSBCVFxuIik7CisKKwkJYXI5MDAzX21jaV9zZW5kX3N5c193YWtpbmcoYWgsIHRydWUpOworCQl1ZGVsYXkoMTApOworCisJCS8qCisJCSAqIFNldCBCVCBwcmlvcml0eSBpbnRlcnJ1cHQgdmFsdWUgdG8gYmUgMHhmZiB0bworCQkgKiBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgQlQgUFJJT1JJVFkgaW50ZXJydXB0cy4KKwkJICovCisKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQlRfUFJJMCwgMHhGRkZGRkZGRik7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSTEsIDB4RkZGRkZGRkYpOworCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9CVF9QUkkyLCAweEZGRkZGRkZGKTsKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQlRfUFJJMywgMHhGRkZGRkZGRik7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSSwgMFgwMDAwMDBGRik7CisKKwkJLyoKKwkJICogQSBjb250ZW50aW9uIHJlc2V0IHdpbGwgYmUgcmVjZWl2ZWQgYWZ0ZXIgc2VuZCBvdXQKKwkJICogc3lzX3dha2luZy4gQWxzbyBCVCBwcmlvcml0eSBpbnRlcnJ1cHQgYml0cyB3aWxsIGJlIHNldC4KKwkJICogQ2xlYXIgdGhvc2UgYml0cyBiZWZvcmUgdGhlIG5leHQgc3RlcC4KKwkJICovCisKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUKTsKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCSAgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUkkpOworCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpIHx8IG1jaS0+aXNfMmcpIHsKKwkJCS8qIFNlbmQgTE5BX1RSQU5TICovCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBzZW5kIExOQV9UUkFOUyB0byBCVFxuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpIHx8IChtY2ktPmlzXzJnICYmCisJCQkJCSAgICAhbWNpLT51cGRhdGVfMmc1ZykpIHsKKwkJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChhaCwKKwkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk8sCisJCQkJbWNpX3RpbWVvdXQpKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBXTEFOIGhhcyBjb250cm9sIG92ZXIgdGhlIExOQSAmICIKKwkJCQkJIkJUIG9iZXlzIGl0XG4iKTsKKwkJCWVsc2UKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgQlQgZGlkbid0IHJlc3BvbmQgdG8iCisJCQkJCSJMTkFfVFJBTlNcbiIpOworCQl9CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpIHsKKwkJCS8qIFNlbmQgYW5vdGhlciByZW1vdGVfcmVzZXQgdG8gZGVhc3NlcnQgQlQgY2xrX3JlcS4gKi8KKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIGFub3RoZXIgcmVtb3RlX3Jlc2V0IHRvICIKKwkJCQkiZGVhc3NlcnQgY2xrX3JlcVxuIik7CisJCQlhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChhaCwgdHJ1ZSk7CisJCQl1ZGVsYXkoMjUyKTsKKwkJfQorCX0KKworCS8qIENsZWFyIHRoZSBleHRyYSByZWR1bmRhbnQgU1lTX1dBS0lORyBmcm9tIEJUICovCisJaWYgKChtY2ktPmJ0X3N0YXRlID09IE1DSV9CVF9BV0FLRSkgJiYKKwkJKFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORykpICYmCisJCShSRUdfUkVBRF9GSUVMRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXLAorCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORykgPT0gMCkpIHsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HKTsKKwkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUpOworCX0KKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgc2F2ZWRfbWNpX2ludF9lbik7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfRU4sIDApOworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfRU4sIDApOworfQorCit2b2lkIGFyOTAwM19tY2lfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgQVJfTUNJX0lOVEVSUlVQVF9ERUZBVUxUKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOLAorCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0RFRkFVTFQpOworfQorCitib29sIGFyOTAwM19tY2lfY2hlY2tfaW50KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgaW50cykKK3sKKwl1MzIgaW50cjsKKworCWludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKTsKKwlyZXR1cm4gKChpbnRyICYgaW50cykgPT0gaW50cyk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgKnJhd19pbnRyLAorCQkJICAgICAgdTMyICpyeF9tc2dfaW50cikKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJKnJhd19pbnRyID0gbWNpLT5yYXdfaW50cjsKKwkqcnhfbXNnX2ludHIgPSBtY2ktPnJ4X21zZ19pbnRyOworCisJLyogQ2xlYW4gaW50IGJpdHMgYWZ0ZXIgdGhlIHZhbHVlcyBhcmUgcmVhZC4gKi8KKwltY2ktPnJhd19pbnRyID0gMDsKKwltY2ktPnJ4X21zZ19pbnRyID0gMDsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KTsKKwordm9pZCBhcjkwMDNfbWNpXzJnNWdfY2hhbmdlZChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBpc18yZykKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKKwlpZiAoIW1jaS0+dXBkYXRlXzJnNWcgJiYKKwkgICAgKG1jaS0+aXNfMmcgIT0gaXNfMmcpKQorCQltY2ktPnVwZGF0ZV8yZzVnID0gdHJ1ZTsKKworCW1jaS0+aXNfMmcgPSBpc18yZzsKK30KKworc3RhdGljIGJvb2wgYXI5MDAzX21jaV9pc19ncG1fdmFsaWQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBtc2dfaW5kZXgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiAqcGF5bG9hZDsKKwl1MzIgcmVjdl90eXBlLCBvZmZzZXQ7CisKKwlpZiAobXNnX2luZGV4ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJcmV0dXJuIGZhbHNlOworCisJb2Zmc2V0ID0gbXNnX2luZGV4IDw8IDQ7CisKKwlwYXlsb2FkID0gKHUzMiAqKShtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCXJlY3ZfdHlwZSA9IE1DSV9HUE1fVFlQRShwYXlsb2FkKTsKKworCWlmIChyZWN2X3R5cGUgPT0gTUNJX0dQTV9SU1ZEX1BBVFRFUk4pIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIFNraXAgUlNWRCBHUE1cbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfb2JzZXJ2YXRpb25fc2V0X3VwKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwlpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01DSSkgeworCisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDMsCisJCQkJCUFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9EQVRBKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMiwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9XTEFOX0NMSyk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDEsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfREFUQSk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDAsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfQ0xLKTsKKworCX0gZWxzZSBpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX1RYUlgpIHsKKworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAzLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fVFgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAyLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fUlgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAxLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fVFgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAwLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fUlgpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCA1LCBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKKworCX0gZWxzZSBpZiAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUKSB7CisKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMywgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1RYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMiwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1JYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMSwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9EQVRBKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMCwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9DTEspOworCisJfSBlbHNlCisJCXJldHVybjsKKworCVJFR19TRVRfQklUKGFoLCBBUl9HUElPX0lOUFVUX0VOX1ZBTCwgQVJfR1BJT19KVEFHX0RJU0FCTEUpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8yMF9PUl9MQVRFUihhaCkpIHsKKwkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0dMQl9DT05UUk9MLAorCQkJICAgICAgQVJfR0xCX0RTX0pUQUdfRElTQUJMRSwgMSk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICAgIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTiwgMCk7CisJCVJFR19TRVRfQklUKGFoLCBBUl9HTEJfR1BJT19DT05UUk9MLAorCQkJICAgIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfR1BJTyk7CisJfQorCisJUkVHX1JNV19GSUVMRChhaCwgQVJfQlRDT0VYX0NUUkwyLCBBUl9CVENPRVhfQ1RSTDJfR1BJT19PQlNfU0VMLCAwKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9CVENPRVhfQ1RSTDIsIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTCwgMSk7CisJUkVHX1dSSVRFKGFoLCBBUl9PQlMsIDB4NGIpOworCVJFR19STVdfRklFTEQoYWgsIEFSX0RJQUdfU1csIEFSX0RJQUdfT0JTX1BUX1NFTDEsIDB4MDMpOworCVJFR19STVdfRklFTEQoYWgsIEFSX0RJQUdfU1csIEFSX0RJQUdfT0JTX1BUX1NFTDIsIDB4MDEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX01BQ01JU0MsIEFSX01BQ01JU0NfTUlTQ19PQlNfQlVTX0xTQiwgMHgwMik7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfTUFDTUlTQywgQVJfTUFDTUlTQ19NSVNDX09CU19CVVNfTVNCLCAweDAzKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfVEVTVF9DVExfU1RBVFVTLAorCQkgICAgICBBUl9QSFlfVEVTVF9DVExfREVCVUdQT1JUX1NFTCwgMHgwNyk7Cit9CisKK3N0YXRpYyBib29sIGFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X2ZsYWdzKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSwKKwkJCQkJCXU4IG9wY29kZSwgdTMyIGJ0X2ZsYWdzKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBwbGRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwlNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShwbGQsCisJCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1MpOworCisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9CX0JUX0ZMQUdTX09QKSAgPSBvcGNvZGU7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMCkgPSBidF9mbGFncyAmIDB4RkY7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMSkgPSAoYnRfZmxhZ3MgPj4gOCkgJiAweEZGOworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyArIDIpID0gKGJ0X2ZsYWdzID4+IDE2KSAmIDB4RkY7CisJKigoKHU4ICopcGxkKSArIE1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICsgMykgPSAoYnRfZmxhZ3MgPj4gMjQpICYgMHhGRjsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJIk1DSSBCVF9NQ0lfRkxBR1M6IFNlbmQgQ29leCBCVCBVcGRhdGUgRmxhZ3MgJXMgMHglMDh4XG4iLAorCQkob3Bjb2RlID09IE1DSV9HUE1fQ09FWF9CVF9GTEFHU19SRUFEKSA/ICJSRUFEIiA6CisJCSgob3Bjb2RlID09IE1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQpID8gIlNFVCIgOiAiQ0xFQVIiKSwKKwkJCQkJCQkJYnRfZmxhZ3MpOworCisJcmV0dXJuIGFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwbGQsIDE2LAorCQkJCQkJCXdhaXRfZG9uZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBlbl9pbnQsIGJvb2wgaXNfMmcsCisJCSAgICAgIGJvb2wgaXNfZnVsbF9zbGVlcCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHJlZ3ZhbCwgdGhyZXNoOworCisJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGZ1bGxfc2xlZXAgPSAlZCwgaXNfMmcgPSAlZFxuIiwKKwkJaXNfZnVsbF9zbGVlcCwgaXNfMmcpOworCisJLyoKKwkgKiBHUE0gYnVmZmVyIGFuZCBzY2hlZHVsaW5nIG1lc3NhZ2UgYnVmZmVyIGFyZSBub3QgYWxsb2NhdGVkCisJICovCisKKwlpZiAoIW1jaS0+Z3BtX2FkZHIgJiYgIW1jaS0+c2NoZWRfYWRkcikgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEdQTSBhbmQgc2NoZWR1bGUgYnVmZmVycyBhcmUgbm90IGFsbG9jYXRlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKFJFR19SRUFEKGFoLCBBUl9CVENPRVhfQ1RSTCkgPT0gMHhkZWFkYmVlZikgeworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIGl0J3MgZGVhZGJlZWYsIHF1aXQgbWNpX3Jlc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByb2dyYW0gTUNJIERNQSByZWxhdGVkIHJlZ2lzdGVycyAqLworCVJFR19XUklURShhaCwgQVJfTUNJX0dQTV8wLCBtY2ktPmdwbV9hZGRyKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9HUE1fMSwgbWNpLT5ncG1fbGVuKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9TQ0hEX1RBQkxFXzAsIG1jaS0+c2NoZWRfYWRkcik7CisKKwkvKgorCSogVG8gYXZvaWQgTUNJIHN0YXRlIG1hY2hpbmUgYmUgYWZmZWN0ZWQgYnkgaW5jb21pbmcgcmVtb3RlIE1DSSBtc2dzLAorCSogTUNJIG1vZGUgd2lsbCBiZSBlbmFibGVkIGxhdGVyLCByaWdodCBiZWZvcmUgcmVzZXQgdGhlIE1DSSBUWCBhbmQgUlguCisJKi8KKworCXJlZ3ZhbCA9IFNNKDEsIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9QQV9TSEFSRUQpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX0xOQV9TSEFSRUQpIHwKKwkJIFNNKDIsIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BUykgfAorCQkgU00oMywgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSykgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9BQ0spIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQkNOKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOKTsKKworCWlmIChpc18yZyAmJiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgJiYKKwkJIShtY2ktPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfT1NMQSkpIHsKKworCQlyZWd2YWwgfD0gU00oMSwgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTik7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIHNjaGVkIG9uZSBzdGVwIGxvb2sgYWhlYWRcbiIpOworCisJCWlmICghKG1jaS0+Y29uZmlnICYKKwkJICAgICAgQVRIX01DSV9DT05GSUdfRElTQUJMRV9BR0dSX1RIUkVTSCkpIHsKKworCQkJdGhyZXNoID0gTVMobWNpLT5jb25maWcsCisJCQkJICAgIEFUSF9NQ0lfQ09ORklHX0FHR1JfVEhSRVNIKTsKKwkJCXRocmVzaCAmPSA3OworCQkJcmVndmFsIHw9IFNNKDEsCisJCQkJICAgICBBUl9CVENPRVhfQ1RSTF9USU1FX1RPX05FWFRfQlRfVEhSRVNIX0VOKTsKKwkJCXJlZ3ZhbCB8PSBTTSh0aHJlc2gsIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNIKTsKKworCQkJUkVHX1JNV19GSUVMRChhaCwgQVJfTUNJX1NDSERfVEFCTEVfMiwKKwkJCQkgICAgICBBUl9NQ0lfU0NIRF9UQUJMRV8yX0hXX0JBU0VELCAxKTsKKwkJCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9TQ0hEX1RBQkxFXzIsCisJCQkJICAgICAgQVJfTUNJX1NDSERfVEFCTEVfMl9NRU1fQkFTRUQsIDEpOworCisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgc2NoZWQgYWdnciB0aHJlc2g6IG9mZlxuIik7CisJfSBlbHNlCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgU0NIRUQgb25lIHN0ZXAgbG9vayBhaGVhZCBvZmZcbiIpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCXJlZ3ZhbCB8PSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMCk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCByZWd2YWwpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRSk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMywKKwkJCSAgICAgIEFSX0JUQ09FWF9DVFJMM19DT05UX0lORk9fVElNRU9VVCwgMjApOworCX0KKworCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMiwgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hULCAxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKKworCXRocmVzaCA9IE1TKG1jaS0+Y29uZmlnLCBBVEhfTUNJX0NPTkZJR19DTEtfRElWKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfVFhfQ1RSTCwgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJViwgdGhyZXNoKTsKKwlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOKTsKKworCS8qIFJlc2V0dGluZyB0aGUgUnggYW5kIFR4IHBhdGhzIG9mIE1DSSAqLworCXJlZ3ZhbCA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfQ09NTUFORDIpOworCXJlZ3ZhbCB8PSBTTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJdWRlbGF5KDEpOworCisJcmVndmFsICY9IH5TTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJaWYgKGlzX2Z1bGxfc2xlZXApIHsKKwkJYXI5MDAzX21jaV9tdXRlX2J0KGFoKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJcmVndmFsIHw9IFNNKDEsIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09NTUFORDIsIHJlZ3ZhbCk7CisJdWRlbGF5KDEpOworCXJlZ3ZhbCAmPSB+U00oMSwgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT01NQU5EMiwgcmVndmFsKTsKKworCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQsIE5VTEwpOworCVJFR19XUklURShhaCwgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFLAorCQkgIChTTSgweGU4MDEsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUikgfAorCQkgICBTTSgweDAwMDAsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTSkpKTsKKworCVJFR19DTFJfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCUFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURSk7CisKKwlpZiAoQVJfU1JFVl85NDYyXzIwX09SX0xBVEVSKGFoKSkKKwkJYXI5MDAzX21jaV9vYnNlcnZhdGlvbl9zZXRfdXAoYWgpOworCisJbWNpLT5yZWFkeSA9IHRydWU7CisJYXI5MDAzX21jaV9wcmVwX2ludGVyZmFjZShhaCk7CisKKwlpZiAoZW5faW50KQorCQlhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoYWgpOworfQorCit2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCS8qIGRpc2FibGUgYWxsIE1DSSBtZXNzYWdlcyAqLworCVJFR19XUklURShhaCwgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFLCAweGZmZmYwMDAwKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMCwgMHhmZmZmZmZmZik7CisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfV0xfV0VJR0hUUzEsIDB4ZmZmZmZmZmYpOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX1dMX1dFSUdIVFMyLCAweGZmZmZmZmZmKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMywgMHhmZmZmZmZmZik7CisJUkVHX1NFVF9CSVQoYWgsIEFSX01DSV9UWF9DVFJMLCBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCisJLyogd2FpdCBwZW5kaW5nIEhXIG1lc3NhZ2VzIHRvIGZsdXNoIG91dCAqLworCXVkZWxheSgxMCk7CisKKwkvKgorCSAqIFNlbmQgTE5BX1RBS0UgYW5kIFNZU19TTEVFUElORyB3aGVuCisJICogMS4gcmVzZXQgbm90IGFmdGVyIHJlc3VtaW5nIGZyb20gZnVsbCBzbGVlcAorCSAqIDIuIGJlZm9yZSByZXNldCBNQ0kgUlgsIHRvIHF1aWV0IEJUIGFuZCBhdm9pZCBNQ0kgUlggbWlzYWxpZ25tZW50CisJICovCisKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgU2VuZCBMTkEgdGFrZVxuIik7CisJYXI5MDAzX21jaV9zZW5kX2xuYV90YWtlKGFoLCB0cnVlKTsKKworCXVkZWxheSg1KTsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIHN5cyBzbGVlcGluZ1xuIik7CisJYXI5MDAzX21jaV9zZW5kX3N5c19zbGVlcGluZyhhaCwgdHJ1ZSk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zeW5jX2J0X3N0YXRlKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgY3VyX2J0X3N0YXRlOworCisJY3VyX2J0X3N0YXRlID0gYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwgTlVMTCk7CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBjdXJfYnRfc3RhdGUpIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBCVCBzdGF0ZSBtaXNtYXRjaGVzLiBvbGQ6ICVkLCBuZXc6ICVkXG4iLAorCQkJbWNpLT5idF9zdGF0ZSwgY3VyX2J0X3N0YXRlKTsKKwkJbWNpLT5idF9zdGF0ZSA9IGN1cl9idF9zdGF0ZTsKKwl9CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApIHsKKworCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3F1ZXJ5KGFoLCB0cnVlKTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhhaCwgdHJ1ZSk7CisKKwkJaWYgKG1jaS0+dW5oYWx0X2J0X2dwbSA9PSB0cnVlKSB7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgdW5oYWx0IEJUIEdQTSIpOworCQkJYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oYWgsIGZhbHNlLCB0cnVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIG5ld19mbGFncywgdG9fc2V0LCB0b19jbGVhcjsKKworCWlmIChBUl9TUkVWXzk0NjJfMjAoYWgpICYmCisJICAgIG1jaS0+dXBkYXRlXzJnNWcgJiYKKwkgICAgKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSkgeworCisJCWlmIChtY2ktPmlzXzJnKSB7CisJCQluZXdfZmxhZ3MgPSBNQ0lfMkdfRkxBR1M7CisJCQl0b19jbGVhciA9IE1DSV8yR19GTEFHU19DTEVBUl9NQVNLOworCQkJdG9fc2V0ID0gTUNJXzJHX0ZMQUdTX1NFVF9NQVNLOworCQl9IGVsc2UgeworCQkJbmV3X2ZsYWdzID0gTUNJXzVHX0ZMQUdTOworCQkJdG9fY2xlYXIgPSBNQ0lfNUdfRkxBR1NfQ0xFQVJfTUFTSzsKKwkJCXRvX3NldCA9IE1DSV81R19GTEFHU19TRVRfTUFTSzsKKwkJfQorCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgQlRfTUNJX0ZMQUdTOiAlcyAweCUwOHggY2xyPTB4JTA4eCwgc2V0PTB4JTA4eFxuIiwKKwkJbWNpLT5pc18yZyA/ICIyRyIgOiAiNUciLCBuZXdfZmxhZ3MsIHRvX2NsZWFyLCB0b19zZXQpOworCisJCWlmICh0b19jbGVhcikKKwkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X2ZsYWdzKGFoLCB3YWl0X2RvbmUsCisJCQkJCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19DTEVBUiwgdG9fY2xlYXIpOworCisJCWlmICh0b19zZXQpCisJCQlhcjkwMDNfbWNpX3NlbmRfY29leF9idF9mbGFncyhhaCwgd2FpdF9kb25lLAorCQkJCQlNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfU0VULCB0b19zZXQpOworCX0KKworCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpICYmIChtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkpCisJCW1jaS0+dXBkYXRlXzJnNWcgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBoZWFkZXIsCisJCQkJCXUzMiAqcGF5bG9hZCwgYm9vbCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTggdHlwZSwgb3Bjb2RlOworCisJaWYgKHF1ZXVlKSB7CisKKwkJaWYgKHBheWxvYWQpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBFUlJPUjogU2VuZCBmYWlsOiAlMDJ4OiAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQloZWFkZXIsCisJCQkJKigoKHU4ICopcGF5bG9hZCkgKyA0KSwKKwkJCQkqKCgodTggKilwYXlsb2FkKSArIDUpLAorCQkJCSooKCh1OCAqKXBheWxvYWQpICsgNikpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBFUlJPUjogU2VuZCBmYWlsOiAlMDJ4XG4iLCBoZWFkZXIpOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIHRvIGJlIHF1ZXVlZCAqLworCWlmIChoZWFkZXIgIT0gTUNJX0dQTSkKKwkJcmV0dXJuOworCisJdHlwZSA9IE1DSV9HUE1fVFlQRShwYXlsb2FkKTsKKwlvcGNvZGUgPSBNQ0lfR1BNX09QQ09ERShwYXlsb2FkKTsKKworCWlmICh0eXBlICE9IE1DSV9HUE1fQ09FWF9BR0VOVCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1M6CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCQlicmVhazsKKworCQlpZiAoKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9CVF9GTEFHU19PUCkgPT0KKwkJCQlNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfUkVBRCkKKwkJCWJyZWFrOworCisJCW1jaS0+dXBkYXRlXzJnNWcgPSBxdWV1ZTsKKworCQlpZiAocXVldWUpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBCVF9NQ0lfRkxBR1M6IDJHNUcgc3RhdHVzIDxxdWV1ZWQ+ICVzLlxuIiwKKwkJCQltY2ktPmlzXzJnID8gIjJHIiA6ICI1RyIpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBCVF9NQ0lfRkxBR1M6IDJHNUcgc3RhdHVzIDxzZW50PiAlcy5cbiIsCisJCQkJbWNpLT5pc18yZyA/ICIyRyIgOiAiNUciKTsKKworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1dMQU5fQ0hBTk5FTFM6CisKKwkJbWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9IHF1ZXVlOworCQlpZiAocXVldWUpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBXTEFOIGNoYW5uZWwgbWFwIDxxdWV1ZWQ+XG4iKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgV0xBTiBjaGFubmVsIG1hcCA8c2VudD5cbiIpOworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX0hBTFRfQlRfR1BNOgorCisJCWlmICgqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUpID09CisJCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQpIHsKKworCQkJbWNpLT51bmhhbHRfYnRfZ3BtID0gcXVldWU7CisKKwkJCWlmIChxdWV1ZSkKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgVU5IQUxUIEJUIEdQTSA8cXVldWVkPlxuIik7CisJCQllbHNlIHsKKwkJCQltY2ktPmhhbHRlZF9idF9ncG0gPSBmYWxzZTsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgVU5IQUxUIEJUIEdQTSA8c2VudD5cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKCooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPT0KKwkJCQlNQ0lfR1BNX0NPRVhfQlRfR1BNX0hBTFQpIHsKKworCQkJbWNpLT5oYWx0ZWRfYnRfZ3BtID0gIXF1ZXVlOworCisJCQlpZiAocXVldWUpCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIEhBTFQgQlQgR1BNIDxub3Qgc2VudD5cbiIpOworCQkJZWxzZQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBVTkhBTFQgQlQgR1BNIDxzZW50PlxuIik7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX3N3aXRjaChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCisJaWYgKG1jaS0+dXBkYXRlXzJnNWcpIHsKKwkJaWYgKG1jaS0+aXNfMmcpIHsKKworCQkJYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKGFoLCB0cnVlKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIExOQSB0cmFuc1xuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKworCQkJUkVHX0NMUl9CSVQoYWgsIEFSX01DSV9UWF9DVFJMLAorCQkJCSAgICBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCisJCQlpZiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgeworCQkJCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfR0xCX0NPTlRST0wsCisJCQkJCSAgICBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMKTsKKwkJCQlpZiAoIShtY2ktPmNvbmZpZyAmCisJCQkJICAgICAgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBKSkgeworCQkJCQlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsCisJCQkJCUFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZW5kIExOQSB0YWtlXG4iKTsKKwkJCWFyOTAwM19tY2lfc2VuZF9sbmFfdGFrZShhaCwgdHJ1ZSk7CisJCQl1ZGVsYXkoNSk7CisKKwkJCVJFR19TRVRfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCQkgICAgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFKTsKKworCQkJaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKKwkJCQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0dMQl9DT05UUk9MLAorCQkJCQkgICAgQVJfQlRDT0VYX0NUUkxfQlRfT1dOX1NQRFRfQ1RSTCk7CisJCQkJUkVHX0NMUl9CSVQoYWgsIEFSX0JUQ09FWF9DVFJMLAorCQkJCQlBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOKTsKKwkJCX0KKworCQkJYXI5MDAzX21jaV9zZW5kXzJnNWdfc3RhdHVzKGFoLCB0cnVlKTsKKwkJfQorCX0KK30KKworYm9vbCBhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggaGVhZGVyLCB1MzIgZmxhZywKKwkJCSAgICAgdTMyICpwYXlsb2FkLCB1OCBsZW4sIGJvb2wgd2FpdF9kb25lLAorCQkJICAgICBib29sIGNoZWNrX2J0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwlib29sIG1zZ19zZW50ID0gZmFsc2U7CisJdTMyIHJlZ3ZhbDsKKwl1MzIgc2F2ZWRfbWNpX2ludF9lbjsKKwlpbnQgaTsKKworCXNhdmVkX21jaV9pbnRfZW4gPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTik7CisJcmVndmFsID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCWlmICgocmVndmFsID09IDB4ZGVhZGJlZWYpIHx8ICEocmVndmFsICYgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU4pKSB7CisKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBOb3Qgc2VuZGluZyAweCV4LiBNQ0kgaXMgbm90IGVuYWJsZWQuICIKKwkJCSJmdWxsX3NsZWVwID0gJWRcbiIsIGhlYWRlciwKKwkJCShhaC0+cG93ZXJfbW9kZSA9PSBBVEg5S19QTV9GVUxMX1NMRUVQKSA/IDEgOiAwKTsKKworCQlhcjkwMDNfbWNpX3F1ZXVlX3Vuc2VudF9ncG0oYWgsIGhlYWRlciwgcGF5bG9hZCwgdHJ1ZSk7CisJCXJldHVybiBmYWxzZTsKKworCX0gZWxzZSBpZiAoY2hlY2tfYnQgJiYgKG1jaS0+YnRfc3RhdGUgPT0gTUNJX0JUX1NMRUVQKSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJIk1DSSBEb24ndCBzZW5kIG1lc3NhZ2UgMHgleC4gQlQgaXMgaW4gc2xlZXAgc3RhdGVcbiIsIGhlYWRlcik7CisKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIHRydWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHdhaXRfZG9uZSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCAwKTsKKworCS8qIE5lZWQgdG8gY2xlYXIgU1dfTVNHX0RPTkUgcmF3IGJpdCBiZWZvcmUgd2FpdCAqLworCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJICAoQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORSB8CisJCSAgIEFSX01DSV9JTlRFUlJVUFRfTVNHX0ZBSUxfTUFTSykpOworCisJaWYgKHBheWxvYWQpIHsKKwkJZm9yIChpID0gMDsgKGkgKiA0KSA8IGxlbjsgaSsrKQorCQkJUkVHX1dSSVRFKGFoLCAoQVJfTUNJX1RYX1BBWUxPQUQwICsgaSAqIDQpLAorCQkJCSAgKihwYXlsb2FkICsgaSkpOworCX0KKworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQwLAorCQkgIChTTSgoZmxhZyAmIE1DSV9GTEFHX0RJU0FCTEVfVElNRVNUQU1QKSwKKwkJICAgICAgQVJfTUNJX0NPTU1BTkQwX0RJU0FCTEVfVElNRVNUQU1QKSB8CisJCSAgIFNNKGxlbiwgQVJfTUNJX0NPTU1BTkQwX0xFTikgfAorCQkgICBTTShoZWFkZXIsIEFSX01DSV9DT01NQU5EMF9IRUFERVIpKSk7CisKKwlpZiAod2FpdF9kb25lICYmCisJICAgICEoYXI5MDAzX21jaV93YWl0X2Zvcl9pbnRlcnJ1cHQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FLCA1MDApKSkKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIHRydWUpOworCWVsc2UgeworCQlhcjkwMDNfbWNpX3F1ZXVlX3Vuc2VudF9ncG0oYWgsIGhlYWRlciwgcGF5bG9hZCwgZmFsc2UpOworCQltc2dfc2VudCA9IHRydWU7CisJfQorCisJaWYgKHdhaXRfZG9uZSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCBzYXZlZF9tY2lfaW50X2VuKTsKKworCXJldHVybiBtc2dfc2VudDsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UpOworCit2b2lkIGFyOTAwM19tY2lfc2V0dXAoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBncG1fYWRkciwgdm9pZCAqZ3BtX2J1ZiwKKwkJICAgICAgdTE2IGxlbiwgdTMyIHNjaGVkX2FkZHIpCit7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXZvaWQgKnNjaGVkX2J1ZiA9ICh2b2lkICopKChjaGFyICopIGdwbV9idWYgKyAoc2NoZWRfYWRkciAtIGdwbV9hZGRyKSk7CisKKwltY2ktPmdwbV9hZGRyID0gZ3BtX2FkZHI7CisJbWNpLT5ncG1fYnVmID0gZ3BtX2J1ZjsKKwltY2ktPmdwbV9sZW4gPSBsZW47CisJbWNpLT5zY2hlZF9hZGRyID0gc2NoZWRfYWRkcjsKKwltY2ktPnNjaGVkX2J1ZiA9IHNjaGVkX2J1ZjsKKworCWFyOTAwM19tY2lfcmVzZXQoYWgsIHRydWUsIHRydWUsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfbWNpX3NldHVwKTsKKwordm9pZCBhcjkwMDNfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisKKwkvKiBUdXJuIG9mZiBNQ0kgYW5kIEp1cGl0ZXIgbW9kZS4gKi8KKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCAweDAwKTsKKwlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgYXI5MDAzX21jaV9jbGVhbnVwXG4iKTsKKwlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9jbGVhbnVwKTsKKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkJCSB1OCBncG1fb3Bjb2RlLCB1MzIgKnBfZ3BtKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1OCAqcF9kYXRhID0gKHU4ICopIHBfZ3BtOworCisJaWYgKGdwbV90eXBlICE9IE1DSV9HUE1fQ09FWF9BR0VOVCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChncG1fb3Bjb2RlKSB7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUXVlcnlcbiIpOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3Jlc3BvbnNlKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUmVzcG9uc2VcbiIpOworCQltY2ktPmJ0X3Zlcl9tYWpvciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01BSk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3Zlcl9taW5vciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01JTk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3ZlcnNpb25fa25vd24gPSB0cnVlOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEJUIENvZXggdmVyc2lvbjogJWQuJWRcbiIsCisJCQltY2ktPmJ0X3Zlcl9tYWpvciwKKwkJCW1jaS0+YnRfdmVyX21pbm9yKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZOgorCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggU3RhdHVzIFF1ZXJ5ID0gMHglMDJYLlxuIiwKKwkJCSoocF9kYXRhICsgTUNJX0dQTV9DT0VYX0JfV0xBTl9CSVRNQVApKTsKKwkJbWNpLT53bGFuX2NoYW5uZWxzX3VwZGF0ZSA9IHRydWU7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCQlicmVhazsKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9QUk9GSUxFX0lORk86CisJCW1jaS0+cXVlcnlfYnQgPSB0cnVlOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggQlRfUHJvZmlsZV9JbmZvXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURToKKwkJbWNpLT5xdWVyeV9idCA9IHRydWU7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ09FWCBCVF9TdGF0dXNfVXBkYXRlICIKKwkJCSJTRVE9JWQgKGRyb3AmcXVlcnkpXG4iLCAqKHBfZ3BtICsgMykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3UzMiBhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkgICAgdTggZ3BtX29wY29kZSwgaW50IHRpbWVfb3V0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgKnBfZ3BtID0gTlVMTCwgbWlzbWF0Y2ggPSAwLCBtb3JlX2RhdGE7CisJdTMyIG9mZnNldDsKKwl1OCByZWN2X3R5cGUgPSAwLCByZWN2X29wY29kZSA9IDA7CisJYm9vbCBiX2lzX2J0X2NhbF9kb25lID0gKGdwbV90eXBlID09IE1DSV9HUE1fQlRfQ0FMX0RPTkUpOworCisJbW9yZV9kYXRhID0gdGltZV9vdXQgPyBNQ0lfR1BNX05PTU9SRSA6IE1DSV9HUE1fTU9SRTsKKworCXdoaWxlICh0aW1lX291dCA+IDApIHsKKwkJaWYgKHBfZ3BtKSB7CisJCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCQkJcF9ncG0gPSBOVUxMOworCQl9CisKKwkJaWYgKG1vcmVfZGF0YSAhPSBNQ0lfR1BNX01PUkUpCisJCQl0aW1lX291dCA9IGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSwKKwkJCQkJdGltZV9vdXQpOworCisJCWlmICghdGltZV9vdXQpCisJCQlicmVhazsKKworCQlvZmZzZXQgPSBhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsICZtb3JlX2RhdGEpOworCisJCWlmIChvZmZzZXQgPT0gTUNJX0dQTV9JTlZBTElEKQorCQkJY29udGludWU7CisKKwkJcF9ncG0gPSAodTMyICopIChtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCQlyZWN2X3R5cGUgPSBNQ0lfR1BNX1RZUEUocF9ncG0pOworCQlyZWN2X29wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBfZ3BtKTsKKworCQlpZiAoTUNJX0dQTV9JU19DQUxfVFlQRShyZWN2X3R5cGUpKSB7CisKKwkJCWlmIChyZWN2X3R5cGUgPT0gZ3BtX3R5cGUpIHsKKworCQkJCWlmICgoZ3BtX3R5cGUgPT0gTUNJX0dQTV9CVF9DQUxfRE9ORSkgJiYKKwkJCQkgICAgIWJfaXNfYnRfY2FsX2RvbmUpIHsKKwkJCQkJZ3BtX3R5cGUgPSBNQ0lfR1BNX0JUX0NBTF9HUkFOVDsKKwkJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkJIk1DSSBSZWN2IEJUX0NBTF9ET05FIgorCQkJCQkJIndhaXQgQlRfQ0FMX0dSQU5UXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoKHJlY3ZfdHlwZSA9PSBncG1fdHlwZSkgJiYKKwkJCSAgIChyZWN2X29wY29kZSA9PSBncG1fb3Bjb2RlKSkKKwkJCWJyZWFrOworCisJCS8qIG5vdCBleHBlY3RlZCBtZXNzYWdlICovCisKKwkJLyoKKwkJICogY2hlY2sgaWYgaXQncyBjYWxfZ3JhbnQKKwkJICoKKwkJICogV2hlbiB3ZSdyZSB3YWl0aW5nIGZvciBjYWxfZ3JhbnQgaW4gcmVzZXQgcm91dGluZSwKKwkJICogaXQncyBwb3NzaWJsZSB0aGF0IEJUIHNlbmRzIG91dCBjYWxfcmVxdWVzdCBhdCB0aGUKKwkJICogc2FtZSB0aW1lLiBTaW5jZSBCVCdzIGNhbGlicmF0aW9uIGRvZXNuJ3QgaGFwcGVuCisJCSAqIHRoYXQgb2Z0ZW4sIHdlJ2xsIGxldCBCVCBjb21wbGV0ZXMgY2FsaWJyYXRpb24gdGhlbgorCQkgKiB3ZSBjb250aW51ZSB0byB3YWl0IGZvciBjYWxfZ3JhbnQgZnJvbSBCVC4KKwkJICogT3JnaW5hbDogV2FpdCBCVF9DQUxfR1JBTlQuCisJCSAqIE5ldzogUmVjZWl2ZSBCVF9DQUxfUkVRIC0+IHNlbmQgV0xBTl9DQUxfR1JBTlQtPndhaXQKKwkJICogQlRfQ0FMX0RPTkUgLT4gV2FpdCBCVF9DQUxfR1JBTlQuCisJCSAqLworCisJCWlmICgoZ3BtX3R5cGUgPT0gTUNJX0dQTV9CVF9DQUxfR1JBTlQpICYmCisJCSAgICAocmVjdl90eXBlID09IE1DSV9HUE1fQlRfQ0FMX1JFUSkpIHsKKworCQkJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCWdwbV90eXBlID0gTUNJX0dQTV9CVF9DQUxfRE9ORTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIFJjdiBCVF9DQUxfUkVRLCBzZW5kIFdMQU5fQ0FMX0dSQU5UXG4iKTsKKworCQkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwKKwkJCQkJTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCk7CisKKwkJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJCWZhbHNlLCBmYWxzZSk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIG5vdyB3YWl0IGZvciBCVF9DQUxfRE9ORVxuIik7CisKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIEdQTSBzdWJ0eXBlIgorCQkJCQkibm90IG1hdGNoIDB4JXhcbiIsICoocF9ncG0gKyAxKSk7CisJCQltaXNtYXRjaCsrOworCQkJYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShhaCwgcmVjdl90eXBlLAorCQkJCQlyZWN2X29wY29kZSwgcF9ncG0pOworCQl9CisJfQorCWlmIChwX2dwbSkgeworCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCQlwX2dwbSA9IE5VTEw7CisJfQorCisJaWYgKHRpbWVfb3V0IDw9IDApIHsKKwkJdGltZV9vdXQgPSAwOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIEdQTSByZWNlaXZlZCB0aW1lb3V0LCBtaXNtYXRjaCA9ICVkXG4iLCBtaXNtYXRjaCk7CisJfSBlbHNlCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjZWl2ZSBHUE0gdHlwZT0weCV4LCBjb2RlPTB4JXhcbiIsCisJCQlncG1fdHlwZSwgZ3BtX29wY29kZSk7CisKKwl3aGlsZSAobW9yZV9kYXRhID09IE1DSV9HUE1fTU9SRSkgeworCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBkaXNjYXJkIHJlbWFpbmluZyBHUE1cbiIpOworCQlvZmZzZXQgPSBhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VULAorCQkJCQkgICZtb3JlX2RhdGEpOworCisJCWlmIChvZmZzZXQgPT0gTUNJX0dQTV9JTlZBTElEKQorCQkJYnJlYWs7CisKKwkJcF9ncG0gPSAodTMyICopIChtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCQlyZWN2X3R5cGUgPSBNQ0lfR1BNX1RZUEUocF9ncG0pOworCQlyZWN2X29wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBfZ3BtKTsKKworCQlpZiAoIU1DSV9HUE1fSVNfQ0FMX1RZUEUocmVjdl90eXBlKSkKKwkJCWFyOTAwM19tY2lfcHJvY2Vzc19ncG1fZXh0cmEoYWgsIHJlY3ZfdHlwZSwKKwkJCQkJCSAgICAgcmVjdl9vcGNvZGUsIHBfZ3BtKTsKKworCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCX0KKworCXJldHVybiB0aW1lX291dDsKK30KKwordTMyIGFyOTAwM19tY2lfc3RhdGUoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBzdGF0ZV90eXBlLCB1MzIgKnBfZGF0YSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHZhbHVlID0gMCwgbW9yZV9ncG0gPSAwLCBncG1fcHRyOworCXU4IHF1ZXJ5X3R5cGU7CisKKwlzd2l0Y2ggKHN0YXRlX3R5cGUpIHsKKwljYXNlIE1DSV9TVEFURV9FTkFCTEU6CisJCWlmIChtY2ktPnJlYWR5KSB7CisKKwkJCXZhbHVlID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCQkJaWYgKCh2YWx1ZSA9PSAweGRlYWRiZWVmKSB8fCAodmFsdWUgPT0gMHhmZmZmZmZmZikpCisJCQkJdmFsdWUgPSAwOworCQl9CisJCXZhbHVlICY9IEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOOworCQlicmVhazsKKwljYXNlIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQ6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9HUE1fMSksIEFSX01DSV9HUE1fV1JJVEVfUFRSKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBHUE0gaW5pdGlhbCBXUklURV9QVFI9JWRcbiIsIHZhbHVlKTsKKwkJbWNpLT5ncG1faWR4ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTUNJX1NUQVRFX05FWFRfR1BNX09GRlNFVDoKKwljYXNlIE1DSV9TVEFURV9MQVNUX0dQTV9PRkZTRVQ6CisJCS8qCisJCSogVGhpcyBjb3VsZCBiZSB1c2VmdWwgdG8gYXZvaWQgbmV3IEdQTSBtZXNzYWdlIGludGVycnVwdCB3aGljaAorCQkqIG1heSBsZWFkIHRvIHNwdXJpb3VzIGludGVycnVwdCBhZnRlciBwb3dlciBzbGVlcCwgb3IgbXVsdGlwbGUKKwkJKiBlbnRyeSBvZiBhdGhfbWNpX2ludHIoKS4KKwkJKiBBZGRpbmcgZW1wdHkgR1BNIGNoZWNrIGJ5IHJldHVybmluZyBIQUxfTUNJX0dQTV9JTlZBTElEIGNhbgorCQkqIGFsbGV2aWF0ZSB0aGlzIGVmZmVjdCwgYnV0IGNsZWFyaW5nIEdQTSBSWCBpbnRlcnJ1cHQgYml0IGlzCisJCSogc2FmZSwgYmVjYXVzZSB3aGV0aGVyIHRoaXMgaXMgY2FsbGVkIGZyb20gaHcgb3IgZHJpdmVyIGNvZGUKKwkJKiB0aGVyZSBtdXN0IGJlIGFuIGludGVycnVwdCBiaXQgc2V0L3RyaWdnZXJlZCBpbml0aWFsbHkKKwkJKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSk7CisKKwkJZ3BtX3B0ciA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfR1BNXzEpLCBBUl9NQ0lfR1BNX1dSSVRFX1BUUik7CisJCXZhbHVlID0gZ3BtX3B0cjsKKworCQlpZiAodmFsdWUgPT0gMCkKKwkJCXZhbHVlID0gbWNpLT5ncG1fbGVuIC0gMTsKKwkJZWxzZSBpZiAodmFsdWUgPj0gbWNpLT5ncG1fbGVuKSB7CisJCQlpZiAodmFsdWUgIT0gMHhGRkZGKSB7CisJCQkJdmFsdWUgPSAwOworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gb2Zmc2V0IgorCQkJCQkib3V0IG9mIHJhbmdlXG4iKTsKKwkJCX0KKwkJfSBlbHNlCisJCQl2YWx1ZS0tOworCisJCWlmICh2YWx1ZSA9PSAweEZGRkYpIHsKKwkJCXZhbHVlID0gTUNJX0dQTV9JTlZBTElEOworCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gcHRyIGludmFsaWQiCisJCQkJIkBwdHI9JWQsIG9mZnNldD0lZCwgbW9yZT1HUE1fTk9NT1JFXG4iLAorCQkJCWdwbV9wdHIsIHZhbHVlKTsKKwkJfSBlbHNlIGlmIChzdGF0ZV90eXBlID09IE1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQpIHsKKworCQkJaWYgKGdwbV9wdHIgPT0gbWNpLT5ncG1faWR4KSB7CisJCQkJdmFsdWUgPSBNQ0lfR1BNX0lOVkFMSUQ7CisJCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBHUE0gbWVzc2FnZSIKKwkJCQkJIm5vdCBhdmFpbGFibGUgQHB0cj0lZCwgQG9mZnNldD0lZCwiCisJCQkJCSJtb3JlPUdQTV9OT01PUkVcbiIsIGdwbV9wdHIsIHZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yICg7OykgeworCisJCQkJCXUzMiB0ZW1wX2luZGV4OworCisJCQkJCS8qIHNraXAgcmVzZXJ2ZWQgR1BNIGlmIGFueSAqLworCisJCQkJCWlmICh2YWx1ZSAhPSBtY2ktPmdwbV9pZHgpCisJCQkJCQltb3JlX2dwbSA9IE1DSV9HUE1fTU9SRTsKKwkJCQkJZWxzZQorCQkJCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX05PTU9SRTsKKworCQkJCQl0ZW1wX2luZGV4ID0gbWNpLT5ncG1faWR4OworCQkJCQltY2ktPmdwbV9pZHgrKzsKKworCQkJCQlpZiAobWNpLT5ncG1faWR4ID49CisJCQkJCSAgICBtY2ktPmdwbV9sZW4pCisJCQkJCQltY2ktPmdwbV9pZHggPSAwOworCisJCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJCSJNQ0kgR1BNIG1lc3NhZ2UgZ290IHB0cj0lZCwiCisJCQkJCQkiQG9mZnNldD0lZCwgbW9yZT0lZFxuIiwKKwkJCQkJCWdwbV9wdHIsIHRlbXBfaW5kZXgsCisJCQkJCQkobW9yZV9ncG0gPT0gTUNJX0dQTV9NT1JFKSk7CisKKwkJCQkJaWYgKGFyOTAwM19tY2lfaXNfZ3BtX3ZhbGlkKGFoLAorCQkJCQkJCQl0ZW1wX2luZGV4KSkgeworCQkJCQkJdmFsdWUgPSB0ZW1wX2luZGV4OworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAobW9yZV9ncG0gPT0gTUNJX0dQTV9OT01PUkUpIHsKKwkJCQkJCXZhbHVlID0gTUNJX0dQTV9JTlZBTElEOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAocF9kYXRhKQorCQkJCSpwX2RhdGEgPSBtb3JlX2dwbTsKKwkJCX0KKworCQkJaWYgKHZhbHVlICE9IE1DSV9HUE1fSU5WQUxJRCkKKwkJCQl2YWx1ZSA8PD0gNDsKKworCQkJYnJlYWs7CisJY2FzZSBNQ0lfU1RBVEVfTEFTVF9TQ0hEX01TR19PRkZTRVQ6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9SWF9TVEFUVVMpLAorCQkJCSAgICBBUl9NQ0lfUlhfTEFTVF9TQ0hEX01TR19JTkRFWCk7CisJCS8qIE1ha2UgaXQgaW4gYnl0ZXMgKi8KKwkJdmFsdWUgPDw9IDQ7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQOgorCQl2YWx1ZSA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfUlhfU1RBVFVTKSwKKwkJCSAgIEFSX01DSV9SWF9SRU1PVEVfU0xFRVApID8KKwkJCU1DSV9CVF9TTEVFUCA6IE1DSV9CVF9BV0FLRTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9DT05UX1JTU0lfUE9XRVI6CisJCXZhbHVlID0gTVMobWNpLT5jb250X3N0YXR1cywgQVJfTUNJX0NPTlRfUlNTSV9QT1dFUik7CisJCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0NPTlRfUFJJT1JJVFk6CisJCXZhbHVlID0gTVMobWNpLT5jb250X3N0YXR1cywgQVJfTUNJX0NPTlRfUlJJT1JJVFkpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0NPTlRfVFhSWDoKKwkJdmFsdWUgPSBNUyhtY2ktPmNvbnRfc3RhdHVzLCBBUl9NQ0lfQ09OVF9UWFJYKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9CVDoKKwkJdmFsdWUgPSBtY2ktPmJ0X3N0YXRlOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9TTEVFUDoKKwkJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9TTEVFUDsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRVRfQlRfQVdBS0U6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQVdBS0U7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3ZlcnNpb25fcXVlcnkoYWgsIHRydWUpOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF93bGFuX2NoYW5uZWxzKGFoLCB0cnVlKTsKKworCQlpZiAobWNpLT51bmhhbHRfYnRfZ3BtKSB7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIHVuaGFsdCBCVCBHUE1cbiIpOworCQkJYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oYWgsIGZhbHNlLCB0cnVlKTsKKwkJfQorCisJCWFyOTAwM19tY2lfMmc1Z19zd2l0Y2goYWgsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DQUxfU1RBUlQ6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMX1NUQVJUOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DQUw6CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1JFU0VUX1JFUV9XQUtFOgorCQlhcjkwMDNfbWNpX3Jlc2V0X3JlcV93YWtldXAoYWgpOworCQltY2ktPnVwZGF0ZV8yZzVnID0gdHJ1ZTsKKworCQlpZiAoKEFSX1NSRVZfOTQ2Ml8yMF9PUl9MQVRFUihhaCkpICYmCisJCSAgICAobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01BU0spKSB7CisJCQkvKiBDaGVjayBpZiB3ZSBzdGlsbCBoYXZlIGNvbnRyb2wgb2YgdGhlIEdQSU9zICovCisJCQlpZiAoKFJFR19SRUFEKGFoLCBBUl9HTEJfR1BJT19DT05UUk9MKSAmCisJCQkJICAgICAgQVRIX01DSV9DT05GSUdfTUNJX09CU19HUElPKSAhPQorCQkJCQlBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8pIHsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSByZWNvbmZpZ3VyZSBvYnNlcnZhdGlvbiIpOworCQkJCWFyOTAwM19tY2lfb2JzZXJ2YXRpb25fc2V0X3VwKGFoKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFTkRfV0xBTl9DT0VYX1ZFUlNJT046CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3ZlcnNpb25fcmVzcG9uc2UoYWgsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9DT0VYX1ZFUlNJT046CisKKwkJaWYgKCFwX2RhdGEpCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJIk1DSSBTZXQgQlQgQ29leCB2ZXJzaW9uIHdpdGggTlVMTCBkYXRhISFcbiIpOworCQllbHNlIHsKKwkJCW1jaS0+YnRfdmVyX21ham9yID0gKCpwX2RhdGEgPj4gOCkgJiAweGZmOworCQkJbWNpLT5idF92ZXJfbWlub3IgPSAoKnBfZGF0YSkgJiAweGZmOworCQkJbWNpLT5idF92ZXJzaW9uX2tub3duID0gdHJ1ZTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIEJUIHZlcnNpb24gc2V0OiAlZC4lZFxuIiwKKwkJCQltY2ktPmJ0X3Zlcl9tYWpvciwKKwkJCQltY2ktPmJ0X3Zlcl9taW5vcik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1dMQU5fQ0hBTk5FTFM6CisJCWlmIChwX2RhdGEpIHsKKwkJCWlmICgoKG1jaS0+d2xhbl9jaGFubmVsc1sxXSAmIDB4ZmZmZjAwMDApID09CisJCQkgICAgICgqKHBfZGF0YSArIDEpICYgMHhmZmZmMDAwMCkpICYmCisJCQkgICAgKG1jaS0+d2xhbl9jaGFubmVsc1syXSA9PSAqKHBfZGF0YSArIDIpKSAmJgorCQkJICAgIChtY2ktPndsYW5fY2hhbm5lbHNbM10gPT0gKihwX2RhdGEgKyAzKSkpCisJCQkJYnJlYWs7CisKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1swXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1sxXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1syXSA9ICpwX2RhdGErKzsKKwkJCW1jaS0+d2xhbl9jaGFubmVsc1szXSA9ICpwX2RhdGErKzsKKwkJfQorCQltY2ktPndsYW5fY2hhbm5lbHNfdXBkYXRlID0gdHJ1ZTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhhaCwgdHJ1ZSk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfU0VORF9WRVJTSU9OX1FVRVJZOgorCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3F1ZXJ5KGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1NUQVRVU19RVUVSWToKKwkJcXVlcnlfdHlwZSA9IChBUl9TUkVWXzk0NjJfMTAoYWgpKSA/CisJCQkJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPIDoKKwkJCQlNQ0lfR1BNX0NPRVhfUVVFUllfQlRfVE9QT0xPR1k7CisKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfYnRfc3RhdHVzX3F1ZXJ5KGFoLCB0cnVlLCBxdWVyeV90eXBlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9ORUVEX0ZMVVNIX0JUX0lORk86CisJCQkvKgorCQkJICogYnRjb2V4X2h3Lm1jaS51bmhhbHRfYnRfZ3BtIG1lYW5zIHdoZXRoZXIgaXQncworCQkJICogbmVlZGVkIHRvIHNlbmQgVU5IQUxUIG1lc3NhZ2UuIEl0J3Mgc2V0IHdoZW5ldmVyCisJCQkgKiB0aGVyZSdzIGEgcmVxdWVzdCB0byBzZW5kIEhBTFQgbWVzc2FnZS4KKwkJCSAqIG1jaV9oYWx0ZWRfYnRfZ3BtIG1lYW5zIHdoZXRoZXIgSEFMVCBtZXNzYWdlIGlzIHNlbnQKKwkJCSAqIG91dCBzdWNjZXNzZnVsbHkuCisJCQkgKgorCQkJICogQ2hlY2tpbmcgKG1jaV91bmhhbHRfYnRfZ3BtID09IGZhbHNlKSBpbnN0ZWFkIG9mCisJCQkgKiBjaGVja2luZyAoYWgtPm1jaV9oYWx0ZWRfYnRfZ3BtID09IGZhbHNlKSB3aWxsIG1ha2UKKwkJCSAqIHN1cmUgY3VycmVudGx5IGlzIGluIFVOSEFMVC1lZCBtb2RlIGFuZCBCVCBjYW4KKwkJCSAqIHJlc3BvbmQgdG8gc3RhdHVzIHF1ZXJ5LgorCQkJICovCisJCQl2YWx1ZSA9ICghbWNpLT51bmhhbHRfYnRfZ3BtICYmCisJCQkJIG1jaS0+bmVlZF9mbHVzaF9idGluZm8pID8gMSA6IDA7CisJCQlpZiAocF9kYXRhKQorCQkJCW1jaS0+bmVlZF9mbHVzaF9idGluZm8gPQorCQkJCQkoKnBfZGF0YSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKKwkJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfUkVDT1ZFUl9SWDoKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgaHcgUkVDT1ZFUl9SWFxuIik7CisJCWFyOTAwM19tY2lfcHJlcF9pbnRlcmZhY2UoYWgpOworCQltY2ktPnF1ZXJ5X2J0ID0gdHJ1ZTsKKwkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9ORUVEX0ZUUF9TVE9NUDoKKwkJdmFsdWUgPSAhKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9GVFBfU1RPTVApOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX05FRURfVFVOSU5HOgorCQl2YWx1ZSA9ICEobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX1RVTklORyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19tY2lfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEFSOTAwM19NQ0lfSAorI2RlZmluZSBBUjkwMDNfTUNJX0gKKworI2RlZmluZSBNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBEaXNhYmxlIHRpbWUgc3RhbXAgKi8KKworLyogRGVmYXVsdCByZW1vdGUgQlQgZGV2aWNlIE1DSSBDT0VYIHZlcnNpb24gKi8KKyNkZWZpbmUgTUNJX0dQTV9DT0VYX01BSk9SX1ZFUlNJT05fREVGQVVMVCAgMworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUlOT1JfVkVSU0lPTl9ERUZBVUxUICAwCisKKy8qIExvY2FsIFdMQU4gTUNJIENPRVggdmVyc2lvbiAqLworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUFKT1JfVkVSU0lPTl9XTEFOICAgICAzCisjZGVmaW5lIE1DSV9HUE1fQ09FWF9NSU5PUl9WRVJTSU9OX1dMQU4gICAgIDAKKworZW51bSBtY2lfZ3BtX2NvZXhfcXVlcnlfdHlwZSB7CisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPICAgICAgPSBCSVQoMCksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX1RPUE9MT0dZICAgICAgPSBCSVQoMSksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0RFQlVHICAgICAgICAgPSBCSVQoMiksCit9OworCitlbnVtIG1jaV9ncG1fY29leF9oYWx0X2J0X2dwbSB7CisJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQsCisJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUCit9OworCitlbnVtIG1jaV9ncG1fY29leF9idF91cGRhdGVfZmxhZ3Nfb3AgeworCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19SRUFELAorCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQsCisJTUNJX0dQTV9DT0VYX0JUX0ZMQUdTX0NMRUFSCit9OworCisjZGVmaW5lIE1DSV9OVU1fQlRfQ0hBTk5FTFMgICAgIDc5CisKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfQ09SUiAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0hEUiAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9QTEQgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19MTkFfQ1RSTCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfREVCVUcgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1NDSEVEX01TRyAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19DT05UX01TRyAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQ09FWF9HUE0gICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX0NQVV9JTlRfTVNHICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19NQ0lfTU9ERSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQVI5NDYyX01PREUgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX09USEVSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKworI2RlZmluZSBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgICAgICAgICAgICAgIDB4MDAwMTFkZGUKKworI2RlZmluZSBNQ0lfVE9HR0xFX0JUX01DSV9GTEFHUyAgKE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0NPUlIgfCBcCisJCQkJICBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9IRFIgIHwgXAorCQkJCSAgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfUExEICB8IFwKKwkJCQkgIE1DSV9CVF9NQ0lfRkxBR1NfTUNJX01PREUpCisKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTX0NMRUFSX01BU0sgICAweDAwMDAwMDAwCisjZGVmaW5lIE1DSV8yR19GTEFHU19TRVRfTUFTSyAgICAgTUNJX1RPR0dMRV9CVF9NQ0lfRkxBR1MKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTICAgICAgICAgICAgICBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MKKworI2RlZmluZSBNQ0lfNUdfRkxBR1NfQ0xFQVJfTUFTSyAgIE1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTCisjZGVmaW5lIE1DSV81R19GTEFHU19TRVRfTUFTSyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQ0lfNUdfRkxBR1MgICAgICAgICAgICAgIChNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgJiBcCisJCQkJICAgfk1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTKQorCisvKgorICogRGVmYXVsdCB2YWx1ZSBmb3IgQVI5NDYyIGlzIDB4MDAwMDIyMDEKKyAqLworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19DT05DVVJfVFggICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfTUNJICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfTUNJX09CU19UWFJYICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0ZUUF9TVE9NUCAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0FHR1JfVEhSRVNIICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQUdHUl9USFJFU0hfUyAgICAgICAgOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0FHR1JfVEhSRVNIICAweDAwMDAwODAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0NMS19ESVYgICAgICAgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQ0xLX0RJVl9TICAgICAgICAgICAgMTIKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9UVU5JTkcgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfV0VJR0hUX0RCRyAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01BU0sgICAgIChBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01DSSAgfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX1RYUlggfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUKQorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8gICAgIDB4MDAwMDAwMkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMKaW5kZXggMGM0NjJjOS4uYTQ0NTBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGFwcmQuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCmluZGV4IDA0YjA2MGEuLmU0MWQyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCmluZGV4IDQxMTRmZTcuLmVkNjQxMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaApAQCAtMzg5LDYgKzM4OSw4IEBACiAjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19SU1NJX1RIUl9TICAgMTAKIAogI2RlZmluZSBBUl9QSFlfUklGU19JTklUX0RFTEFZICAgICAgICAgMHgzZmYwMDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfUVVJQ0tfRFJPUCAgICAgICAweDAzYzAwMDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfUVVJQ0tfRFJPUF9TICAgICAyMgogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9MT1cgICAgICAgMHgwMDAwN0Y4MAogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9MT1dfUyAgICAgNwogI2RlZmluZSBBUl9QSFlfQUdDX0NPQVJTRV9ISUdIICAgICAgMHgwMDNGODAwMApAQCAtNDg4LDYgKzQ5MCw4IEBACiAjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9UU1RBRENfRU5fUyAgICAgICA4CiAjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9SWF9PQlNfU0VMICAgICAgICAweDNDMDAKICNkZWZpbmUgQVJfUEhZX1RFU1RfQ1RMX1JYX09CU19TRUxfUyAgICAgIDEwCisjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9ERUJVR1BPUlRfU0VMCSAgMHhlMDAwMDAwMAorI2RlZmluZSBBUl9QSFlfVEVTVF9DVExfREVCVUdQT1JUX1NFTF9TCSAgMjkKIAogCiAjZGVmaW5lIEFSX1BIWV9UU1REQUMgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4MTY4KQpAQCAtOTk5LDYgKzEwMDMsNyBAQAogCiAvKiBHTEIgUmVnaXN0ZXJzICovCiAjZGVmaW5lIEFSX0dMQl9CQVNFCTB4MjAwMDAKKyNkZWZpbmUgQVJfR0xCX0dQSU9fQ09OVFJPTAkoQVJfR0xCX0JBU0UpCiAjZGVmaW5lIEFSX1BIWV9HTEJfQ09OVFJPTAkoQVJfR0xCX0JBU0UgKyAweDQ0KQogI2RlZmluZSBBUl9HTEJfU0NSQVRDSChfYWgpCShBUl9HTEJfQkFTRSArIFwKIAkJCQkJKEFSX1NSRVZfOTQ2Ml8yMChfYWgpID8gMHg0YyA6IDB4NTApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk0NjJfMnAwX2luaXR2YWxzLmgKaW5kZXggMjU5YTZmMy4uZGMyMDU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5NDYyXzJwMF9pbml0dmFscy5oCkBAIC00MSwyNCArNDEsMjQgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfMnAwX2Jhc2ViYW5kX3Bvc3RhbWJsZVtdWzVdID0gewogCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAwOTgxMCwgMHhkMDBhODAwNSwgMHhkMDBhODAwNSwgMHhkMDBhODAxMSwgMHhkMDBhODAxMX0sCi0JezB4MDAwMDk4MjAsIDB4MjA2YTAyMmUsIDB4MjA2YTAyMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmV9LAotCXsweDAwMDA5ODI0LCAweDVhYzY0MGRlLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGRlfSwKLQl7MHgwMDAwOTgyOCwgMHgwNzk2YmU4OSwgMHgwNjk2YjA4MSwgMHgwNjk2Yjg4MSwgMHgwNzk2YmU4OX0sCisJezB4MDAwMDk4MTAsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMTEsIDB4ZDAwYTgwMGR9LAorCXsweDAwMDA5ODIwLCAweDIwNmEwMjJlLCAweDIwNmEwMjJlLCAweDIwNmEwMTJlLCAweDIwNmEwMWFlfSwKKwl7MHgwMDAwOTgyNCwgMHg1YWM2NDBkZSwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg2M2M2NDBkYX0sCisJezB4MDAwMDk4MjgsIDB4MDc5NmJlODksIDB4MDY5NmIwODEsIDB4MDY5NmI4ODEsIDB4MDkxNDNlODF9LAogCXsweDAwMDA5ODJjLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0fSwKIAl7MHgwMDAwOTgzMCwgMHgwMDAwMDU5YywgMHgwMDAwMDU5YywgMHgwMDAwMTE5YywgMHgwMDAwMTE5Y30sCiAJezB4MDAwMDljMDAsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzR9LAogCXsweDAwMDA5ZTAwLCAweDAzNzIxMTFhLCAweDAzNzIxMTFhLCAweDAzNzIxNmEwLCAweDAzNzIxNmEwfSwKIAl7MHgwMDAwOWUwNCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMH0sCi0JezB4MDAwMDllMGMsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZTJ9LAotCXsweDAwMDA5ZTEwLCAweDkyYzg4ZDJlLCAweDdlYzg4ZDJlLCAweDdlYzg0ZDJlLCAweDkyYzg0ZDJlfSwKLQl7MHgwMDAwOWUxNCwgMHgzN2I5NWQ1ZSwgMHgzN2I5NjA1ZSwgMHgzMzc5NjA1ZSwgMHgzMzc5NWQ1ZX0sCisJezB4MDAwMDllMGMsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZDh9LAorCXsweDAwMDA5ZTEwLCAweDkyYzg4ZDJlLCAweDdlYzg4ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg2ZDJlfSwKKwl7MHgwMDAwOWUxNCwgMHgzN2I5NWQ1ZSwgMHgzN2I5NjA1ZSwgMHgzMzc2NjA1ZSwgMHgzMzc5NWQ1ZX0sCiAJezB4MDAwMDllMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogCXsweDAwMDA5ZTFjLCAweDAwMDFjZjljLCAweDAwMDFjZjljLCAweDAwMDIxZjljLCAweDAwMDIxZjljfSwKIAl7MHgwMDAwOWUyMCwgMHgwMDAwMDNiNSwgMHgwMDAwMDNiNSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZX0sCiAJezB4MDAwMDllMmMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjF9LAotCXsweDAwMDA5ZTNjLCAweGNmOTQ2MjIwLCAweGNmOTQ2MjIwLCAweGNmZDVjNzgyLCAweGNmZDVjNzgyfSwKLQl7MHgwMDAwOWU0NCwgMHhmZTMyMWUyNywgMHhmZTMyMWUyNywgMHhmZTI5MWUyNywgMHhmZTI5MWUyN30sCisJezB4MDAwMDllM2MsIDB4Y2Y5NDYyMjAsIDB4Y2Y5NDYyMjAsIDB4Y2ZkNWM3ODIsIDB4Y2ZkNWMyODJ9LAorCXsweDAwMDA5ZTQ0LCAweDYyMzIxZTI3LCAweDYyMzIxZTI3LCAweGZlMjkxZTI3LCAweGZlMjkxZTI3fSwKIAl7MHgwMDAwOWU0OCwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxMiwgMHg1MDMwMjAxMn0sCiAJezB4MDAwMDlmYzgsIDB4MDAwM2YwMDAsIDB4MDAwM2YwMDAsIDB4MDAwMWEwMDAsIDB4MDAwMWEwMDB9LAogCXsweDAwMDBhMjA0LCAweDAxMzE4N2MwLCAweDAxMzE4N2M0LCAweDAxMzE4N2M0LCAweDAxMzE4N2MwfSwKQEAgLTgxLDYgKzgxLDE1IEBACiAJezB4MDAwMGEyZDAsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODJ9LAogCXsweDAwMDBhMmQ4LCAweDc5OTlhODNiLCAweDc5OTlhODNiLCAweDc5OTlhODNiLCAweDc5OTlhODNifSwKIAl7MHgwMDAwYTM1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTQsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2E4LCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwYTNhYywgMHhhYWFhYWEwMCwgMHhhYWFhYWEzMCwgMHhhYWFhYWEwMCwgMHhhYWFhYWEwMH0sCisJezB4MDAwMGE0MWMsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDIwLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTQyNCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjgsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDJjLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzMCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZX0sCiAJezB4MDAwMGE4MzAsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAogCXsweDAwMDBhZTA0LCAweDAwMWMwMDAwLCAweDAwMWMwMDAwLCAweDAwMWMwMDAwLCAweDAwMTAwMDAwfSwKIAl7MHgwMDAwYWUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCkBAIC0xMTA3LDExICsxMTE2LDExIEBACiAJezB4MDAwMDllMzAsIDB4MDYzMzZmNzd9LAogCXsweDAwMDA5ZTM0LCAweDZhZjY1MzJmfSwKIAl7MHgwMDAwOWUzOCwgMHgwY2M4MGMwMH0sCi0JezB4MDAwMDllNDAsIDB4MGQyNjE4MjB9LAorCXsweDAwMDA5ZTQwLCAweDE1MjYyODIwfSwKIAl7MHgwMDAwOWU0YywgMHgwMDAwMTAwNH0sCiAJezB4MDAwMDllNTAsIDB4MDBmZjAzZjF9LAotCXsweDAwMDA5ZTU0LCAweGU0YzM1NWM3fSwKLQl7MHgwMDAwOWU1OCwgMHhmZDg5NzczNX0sCisJezB4MDAwMDllNTQsIDB4ZTRjNTU1YzJ9LAorCXsweDAwMDA5ZTU4LCAweGZkODU3NzIyfSwKIAl7MHgwMDAwOWU1YywgMHhlOTE5ODcyNH0sCiAJezB4MDAwMDlmYzAsIDB4ODAzZTQ3ODh9LAogCXsweDAwMDA5ZmM0LCAweDAwMDFlZmI1fSwKQEAgLTExNDIsOSArMTE1MSw2IEBACiAJezB4MDAwMGEzOTgsIDB4MDAxZjBlMGZ9LAogCXsweDAwMDBhMzljLCAweDAwNzUzOTNmfSwKIAl7MHgwMDAwYTNhMCwgMHhiNzlmNjQyN30sCi0JezB4MDAwMGEzYTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhM2E4LCAweGFhYWFhYWFhfSwKLQl7MHgwMDAwYTNhYywgMHgzYzQ2NjQ3OH0sCiAJezB4MDAwMGEzYzAsIDB4MjAyMDIwMjB9LAogCXsweDAwMDBhM2M0LCAweDIyMjIyMjIwfSwKIAl7MHgwMDAwYTNjOCwgMHgyMDIwMDAyMH0sCkBAIC0xMTY3LDEyICsxMTczLDYgQEAKIAl7MHgwMDAwYTQwYywgMHgwMDgyMDgyMH0sCiAJezB4MDAwMGE0MTQsIDB4MWNlNzM5Y2V9LAogCXsweDAwMDBhNDE4LCAweDJkMDAxZGNlfSwKLQl7MHgwMDAwYTQxYywgMHgxY2U3MzljZX0sCi0JezB4MDAwMGE0MjAsIDB4MDAwMDAxY2V9LAotCXsweDAwMDBhNDI0LCAweDFjZTczOWNlfSwKLQl7MHgwMDAwYTQyOCwgMHgwMDAwMDFjZX0sCi0JezB4MDAwMGE0MmMsIDB4MWNlNzM5Y2V9LAotCXsweDAwMDBhNDMwLCAweDFjZTczOWNlfSwKIAl7MHgwMDAwYTQzNCwgMHgwMDAwMDAwMH0sCiAJezB4MDAwMGE0MzgsIDB4MDAwMDE4MDF9LAogCXsweDAwMDBhNDNjLCAweDAwMTAwMDAwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKaW5kZXggOTNiNDViNC4uMTMwZTVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKQEAgLTE1OSw2ICsxNTksOSBAQAogLyogcmV0dXJuIGJsb2NrLWFjayBiaXRtYXAgaW5kZXggZ2l2ZW4gc2VxdWVuY2UgYW5kIHN0YXJ0aW5nIHNlcXVlbmNlICovCiAjZGVmaW5lIEFUSF9CQV9JTkRFWChfc3QsIF9zZXEpICgoKF9zZXEpIC0gKF9zdCkpICYgKElFRUU4MDIxMV9TRVFfTUFYIC0gMSkpCiAKKy8qIHJldHVybiB0aGUgc2Vxbm8gZm9yIF9zdGFydCArIF9vZmZzZXQgKi8KKyNkZWZpbmUgQVRIX0JBX0lOREVYMlNFUShfc2VxLCBfb2Zmc2V0KSAoKChfc2VxKSArIChfb2Zmc2V0KSkgJiAoSUVFRTgwMjExX1NFUV9NQVggLSAxKSkKKwogLyogcmV0dXJucyBkZWxpbWl0ZXIgcGFkZGluZyByZXF1aXJlZCBnaXZlbiB0aGUgcGFja2V0IGxlbmd0aCAqLwogI2RlZmluZSBBVEhfQUdHUl9HRVRfTkRFTElNKF9sZW4pCQkJCQlcCiAgICAgICAgKCgoX2xlbikgPj0gQVRIX0FHR1JfTUlOUExFTikgPyAwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIzOCw2ICsyNDEsNyBAQAogCXN0cnVjdCBhdGhfbm9kZSAqYW47CiAJc3RydWN0IGF0aF9hdHhfYWMgKmFjOwogCXVuc2lnbmVkIGxvbmcgdHhfYnVmW0JJVFNfVE9fTE9OR1MoQVRIX1RJRF9NQVhfQlVGUyldOworCWludCBiYXJfaW5kZXg7CiAJdTE2IHNlcV9zdGFydDsKIAl1MTYgc2VxX25leHQ7CiAJdTE2IGJhd19zaXplOwpAQCAtMjUyLDkgKzI1Niw5IEBACiBzdHJ1Y3QgYXRoX25vZGUgewogI2lmZGVmIENPTkZJR19BVEg5S19ERUJVR0ZTCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBmb3Igc2MtPm5vZGVzICovCisjZW5kaWYKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOyAvKiBzdGF0aW9uIHN0cnVjdCB3ZSdyZSBwYXJ0IG9mICovCiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsgLyogaW50ZXJmYWNlIHdpdGggd2hpY2ggd2UncmUgYXNzb2NpYXRlZCAqLwotI2VuZGlmCiAJc3RydWN0IGF0aF9hdHhfdGlkIHRpZFtXTUVfTlVNX1RJRF07CiAJc3RydWN0IGF0aF9hdHhfYWMgYWNbV01FX05VTV9BQ107CiAJaW50IHBzX2tleTsKQEAgLTI3Niw3ICsyODAsNiBAQAogfTsKIAogI2RlZmluZSBBVEhfVFhfRVJST1IgICAgICAgIDB4MDEKLSNkZWZpbmUgQVRIX1RYX0JBUiAgICAgICAgICAweDAyCiAKIC8qKgogICogQHR4cV9tYXA6ICBJbmRleCBpcyBtYWM4MDIxMSBxdWV1ZSBudW1iZXIuICBUaGlzIGlzCkBAIC00NjIsNyArNDY1LDcgQEAKICNkZWZpbmUgQVRIX0xFRF9QSU5fOTI4NwkJOAogI2RlZmluZSBBVEhfTEVEX1BJTl85MzAwCQkxMAogI2RlZmluZSBBVEhfTEVEX1BJTl85NDg1CQk2Ci0jZGVmaW5lIEFUSF9MRURfUElOXzk0NjIJCTAKKyNkZWZpbmUgQVRIX0xFRF9QSU5fOTQ2MgkJNAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0xFRFMKIHZvaWQgYXRoX2luaXRfbGVkcyhzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7CkBAIC01NDIsNyArNTQ1LDcgQEAKICNkZWZpbmUgREVGQVVMVF9DQUNIRUxJTkUgICAgICAgMzIKICNkZWZpbmUgQVRIX1JFR0NMQVNTSURTX01BWCAgICAgMTAKICNkZWZpbmUgQVRIX0NBQlFfUkVBRFlfVElNRSAgICAgODAgICAgICAvKiAlIG9mIGJlYWNvbiBpbnRlcnZhbCAqLwotI2RlZmluZSBBVEhfTUFYX1NXX1JFVFJJRVMgICAgICAxMAorI2RlZmluZSBBVEhfTUFYX1NXX1JFVFJJRVMgICAgICAzMAogI2RlZmluZSBBVEhfQ0hBTl9NQVggICAgICAgICAgICAyNTUKIAogI2RlZmluZSBBVEhfVFhQT1dFUl9NQVggICAgICAgICAxMDAgICAgIC8qIC41IGRCbSB1bml0cyAqLwpAQCAtNjQ3LDYgKzY1MCw3IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9jb21wbGV0ZV93b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfcGxsX3dvcms7CiAJc3RydWN0IGF0aF9idGNvZXggYnRjb2V4OworCXN0cnVjdCBhdGhfbWNpX2NvZXggbWNpX2NvZXg7CiAKIAlzdHJ1Y3QgYXRoX2Rlc2NkbWEgdHhzZG1hOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMKaW5kZXggNjYzNWMzNy4uYmJiMjA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguYwpAQCAtMTQsMTMgKzE0LDE0IEBACiAgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJody5oIgogCiBlbnVtIGF0aF9idF9tb2RlIHsKIAlBVEhfQlRfQ09FWF9NT0RFX0xFR0FDWSwgICAgICAgIC8qIGxlZ2FjeSByeF9jbGVhciBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9VTlNMT1RURUQsICAgICAvKiB1bnRpbWVkL3Vuc2xvdHRlZCBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9TTE9UVEVELCAgICAgICAvKiBzbG90dGVkIG1vZGUgKi8KLQlBVEhfQlRfQ09FWF9NT0RFX0RJU0FMQkVELCAgICAgIC8qIGNvZXhpc3RlbmNlIGRpc2FibGVkICovCisJQVRIX0JUX0NPRVhfTU9ERV9ESVNBQkxFRCwgICAgICAvKiBjb2V4aXN0ZW5jZSBkaXNhYmxlZCAqLwogfTsKIAogc3RydWN0IGF0aF9idGNvZXhfY29uZmlnIHsKQEAgLTM1LDYgKzM2LDIwIEBACiAJYm9vbCBidF9ob2xkX3J4X2NsZWFyOwogfTsKIAorc3RhdGljIGNvbnN0IHUzMiBhcjkwMDNfd2xhbl93ZWlnaHRzW0FUSF9CVENPRVhfU1RPTVBfTUFYXQorCQkJCSAgICBbQVI5MzAwX05VTV9XTEFOX1dFSUdIVFNdID0geworCXsgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCB9LCAvKiBTVE9NUF9BTEwgKi8KKwl7IDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAgfSwgLyogU1RPTVBfTE9XICovCisJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIFNUT01QX05PTkUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5NDYyX3dsYW5fd2VpZ2h0c1tBVEhfQlRDT0VYX1NUT01QX01BWF0KKwkJCQkgICAgW0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXSA9IHsKKwl7IDB4MDEwMTdkMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxNDEgfSwgLyogU1RPTVBfQUxMICovCisJeyAweDAxMDE3ZDAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjNiIH0sIC8qIFNUT01QX0xPVyAqLworCXsgMHgwMTAxN2QwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSB9LCAvKiBTVE9NUF9OT05FICovCisJeyAweDAxMDE3ZDAxLCAweDAxM2IwMTAxLCAweDNiM2IwMTAxLCAweDNiM2IwMTNiIH0sIC8qIFNUT01QX0xPV19GVFAgKi8KK307CiAKIHZvaWQgYXRoOWtfaHdfaW5pdF9idGNvZXhfaHcoc3RydWN0IGF0aF9odyAqYWgsIGludCBxbnVtKQogewpAQCAtMTUxLDI3ICsxNjYsMjYgQEAKIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4X2h3ID0gJmFoLT5idGNvZXhfaHc7CisJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leCA9ICZhaC0+YnRjb2V4X2h3OwogCXUzMiAgdmFsOworCWludCBpOwogCiAJLyoKIAkgKiBQcm9ncmFtIGNvZXggbW9kZSBhbmQgd2VpZ2h0IHJlZ2lzdGVycyB0bwogCSAqIGVuYWJsZSBjb2V4IDMtd2lyZQogCSAqLwotCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZSk7Ci0JUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZTIpOworCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXgtPmJ0X2NvZXhfbW9kZSk7CisJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXgtPmJ0X2NvZXhfbW9kZTIpOwogCiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dMX1dFSUdIVFMxLCBhaC0+YnRfY29leF93bGFuX3dlaWdodFsxXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCwgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMxLCBhaC0+YnRfY29leF9idF93ZWlnaHRbMV0pOwotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzIsIGFoLT5idF9jb2V4X2J0X3dlaWdodFsyXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMywgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzNdKTsKLQorCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMF0pOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhpKSwKKwkJCQkgIGJ0Y29leC0+YnRfd2VpZ2h0W2ldKTsKIAl9IGVsc2UKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dFSUdIVCwgYnRjb2V4X2h3LT5idF9jb2V4X3dlaWdodHMpOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0VJR0hULCBidGNvZXgtPmJ0X2NvZXhfd2VpZ2h0cyk7CiAKIAogCkBAIC0xODQsMTAgKzE5OCwyMyBAQAogCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKIAotCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLAorCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leC0+d2xhbmFjdGl2ZV9ncGlvLAogCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SWF9DTEVBUl9FWFRFUk5BTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGVfbWNpKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXggPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAorCQkJICBidGNvZXgtPndsYW5fd2VpZ2h0W2ldKTsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKKwlidGNvZXgtPmVuYWJsZWQgPSB0cnVlOworfQorCiB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGUoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OwpAQCAtMjAxLDYgKzIyOCw5IEBACiAJY2FzZSBBVEhfQlRDT0VYX0NGR18zV0lSRToKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShhaCk7CiAJCWJyZWFrOworCWNhc2UgQVRIX0JUQ09FWF9DRkdfTUNJOgorCQlhdGg5a19od19idGNvZXhfZW5hYmxlX21jaShhaCk7CisJCXJldHVybjsKIAl9CiAKIAlSRUdfUk1XKGFoLCBBUl9HUElPX1BEUFUsCkBAIC0yMTQsNyArMjQ0LDE1IEBACiB2b2lkIGF0aDlrX2h3X2J0Y29leF9kaXNhYmxlKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKIAorCWJ0Y29leF9ody0+ZW5hYmxlZCA9IGZhbHNlOworCWlmIChidGNvZXhfaHctPnNjaGVtZSA9PSBBVEhfQlRDT0VYX0NGR19NQ0kpIHsKKwkJYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKGFoLCBBVEhfQlRDT0VYX1NUT01QX05PTkUpOworCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT0VYX1dMX1dFSUdIVFMoaSksCisJCQkJICBidGNvZXhfaHctPndsYW5fd2VpZ2h0W2ldKTsKKwl9CiAJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLCAwKTsKIAogCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLApAQCAtMjI3LDQ5ICsyNjUsMjcgQEAKIAkJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9XTF9XRUlHSFRTMCwgMCk7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEsIDApOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMwLCAwKTsKLQkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMSwgMCk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzIsIDApOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMzLCAwKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhpKSwgMCk7CiAJCX0gZWxzZQogCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dFSUdIVCwgMCk7CiAKIAl9Ci0KLQlhaC0+YnRjb2V4X2h3LmVuYWJsZWQgPSBmYWxzZTsKIH0KIEVYUE9SVF9TWU1CT0woYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUpOwogCiBzdGF0aWMgdm9pZCBhcjkwMDNfYnRjb2V4X2J0X3N0b21wKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJIGVudW0gYXRoX3N0b21wX3R5cGUgc3RvbXBfdHlwZSkKIHsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMF0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMV0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbMl0gPSBBUjkzMDBfQlRfV0dIVDsKLQlhaC0+YnRfY29leF9idF93ZWlnaHRbM10gPSBBUjkzMDBfQlRfV0dIVDsKKwlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4ID0gJmFoLT5idGNvZXhfaHc7CisJY29uc3QgdTMyICp3ZWlnaHQgPSBBUl9TUkVWXzk0NjIoYWgpID8gYXI5MDAzX3dsYW5fd2VpZ2h0c1tzdG9tcF90eXBlXSA6CisJCQkJCSAgICAgICBhcjk0NjJfd2xhbl93ZWlnaHRzW3N0b21wX3R5cGVdOworCWludCBpOwogCi0KLQlzd2l0Y2ggKHN0b21wX3R5cGUpIHsKLQljYXNlIEFUSF9CVENPRVhfU1RPTVBfQUxMOgotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFswXSA9IEFSOTMwMF9TVE9NUF9BTExfV0xBTl9XR0hUMDsKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMV0gPSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDE7Ci0JCWJyZWFrOwotCWNhc2UgQVRIX0JUQ09FWF9TVE9NUF9MT1c6Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdID0gQVI5MzAwX1NUT01QX0xPV19XTEFOX1dHSFQwOwotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFsxXSA9IEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMTsKLQkJYnJlYWs7Ci0JY2FzZSBBVEhfQlRDT0VYX1NUT01QX05PTkU6Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdID0gQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMDsKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMV0gPSBBUjkzMDBfU1RPTVBfTk9ORV9XTEFOX1dHSFQxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19CVENPRVgsCi0JCQkJIkludmFsaWQgU3RvbXB0eXBlXG4iKTsKLQkJYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTOyBpKyspIHsKKwkJYnRjb2V4LT5idF93ZWlnaHRbaV0gPSBBUjkzMDBfQlRfV0dIVDsKKwkJYnRjb2V4LT53bGFuX3dlaWdodFtpXSA9IHdlaWdodFtpXTsKIAl9Ci0KLQlhdGg5a19od19idGNvZXhfZW5hYmxlKGFoKTsKIH0KIAogLyoKQEAgLTMwMSw3ICszMTcsNSBAQAogCQkJCSJJbnZhbGlkIFN0b21wdHlwZVxuIik7CiAJCWJyZWFrOwogCX0KLQotCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od19idGNvZXhfYnRfc3RvbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oCmluZGV4IDIzNGY3NzYuLjI3ODM2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmgKQEAgLTM2LDIyICszNiw1NyBAQAogI2RlZmluZSBBVEhfQlRfQ05UX1RIUkVTSE9MRAkgICAgICAgMwogI2RlZmluZSBBVEhfQlRfQ05UX1NDQU5fVEhSRVNIT0xEICAgICAgMTUKIAorI2RlZmluZSBBUjkzMDBfTlVNX0JUX1dFSUdIVFMgICA0CisjZGVmaW5lIEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTIDQKIC8qIERlZmluZXMgdGhlIEJUIEFSX0JUX0NPRVhfV0dIVCB1c2VkICovCiBlbnVtIGF0aF9zdG9tcF90eXBlIHsKLQlBVEhfQlRDT0VYX05PX1NUT01QLAogCUFUSF9CVENPRVhfU1RPTVBfQUxMLAogCUFUSF9CVENPRVhfU1RPTVBfTE9XLAotCUFUSF9CVENPRVhfU1RPTVBfTk9ORQorCUFUSF9CVENPRVhfU1RPTVBfTk9ORSwKKwlBVEhfQlRDT0VYX1NUT01QX0xPV19GVFAsCisJQVRIX0JUQ09FWF9TVE9NUF9NQVgKIH07CiAKIGVudW0gYXRoX2J0Y29leF9zY2hlbWUgewogCUFUSF9CVENPRVhfQ0ZHX05PTkUsCiAJQVRIX0JUQ09FWF9DRkdfMldJUkUsCiAJQVRIX0JUQ09FWF9DRkdfM1dJUkUsCisJQVRIX0JUQ09FWF9DRkdfTUNJLAorfTsKKworc3RydWN0IGF0aDlrX2h3X21jaSB7CisJdTMyIHJhd19pbnRyOworCXUzMiByeF9tc2dfaW50cjsKKwl1MzIgY29udF9zdGF0dXM7CisJdTMyIGdwbV9hZGRyOworCXUzMiBncG1fbGVuOworCXUzMiBncG1faWR4OworCXUzMiBzY2hlZF9hZGRyOworCXUzMiB3bGFuX2NoYW5uZWxzWzRdOworCXUzMiB3bGFuX2NhbF9zZXE7CisJdTMyIHdsYW5fY2FsX2RvbmU7CisJdTMyIGNvbmZpZzsKKwl1OCAqZ3BtX2J1ZjsKKwl1OCAqc2NoZWRfYnVmOworCWJvb2wgcmVhZHk7CisJYm9vbCB1cGRhdGVfMmc1ZzsKKwlib29sIGlzXzJnOworCWJvb2wgcXVlcnlfYnQ7CisJYm9vbCB1bmhhbHRfYnRfZ3BtOyAvKiBuZWVkIHNlbmQgVU5IQUxUICovCisJYm9vbCBoYWx0ZWRfYnRfZ3BtOyAvKiBIQUxUIHNlbnQgKi8KKwlib29sIG5lZWRfZmx1c2hfYnRpbmZvOworCWJvb2wgYnRfdmVyc2lvbl9rbm93bjsKKwlib29sIHdsYW5fY2hhbm5lbHNfdXBkYXRlOworCXU4IHdsYW5fdmVyX21ham9yOworCXU4IHdsYW5fdmVyX21pbm9yOworCXU4IGJ0X3Zlcl9tYWpvcjsKKwl1OCBidF92ZXJfbWlub3I7CisJdTggYnRfc3RhdGU7CiB9OwogCiBzdHJ1Y3QgYXRoX2J0Y29leF9odyB7CiAJZW51bSBhdGhfYnRjb2V4X3NjaGVtZSBzY2hlbWU7CisJc3RydWN0IGF0aDlrX2h3X21jaSBtY2k7CiAJYm9vbCBlbmFibGVkOwogCXU4IHdsYW5hY3RpdmVfZ3BpbzsKIAl1OCBidGFjdGl2ZV9ncGlvOwpAQCAtNTksNiArOTQsOCBAQAogCXUzMiBidF9jb2V4X21vZGU7IAkvKiBSZWdpc3RlciBzZXR0aW5nIGZvciBBUl9CVF9DT0VYX01PREUgKi8KIAl1MzIgYnRfY29leF93ZWlnaHRzOyAJLyogUmVnaXN0ZXIgc2V0dGluZyBmb3IgQVJfQlRfQ09FWF9XRUlHSFQgKi8KIAl1MzIgYnRfY29leF9tb2RlMjsgCS8qIFJlZ2lzdGVyIHNldHRpbmcgZm9yIEFSX0JUX0NPRVhfTU9ERTIgKi8KKwl1MzIgYnRfd2VpZ2h0W0FSOTMwMF9OVU1fQlRfV0VJR0hUU107CisJdTMyIHdsYW5fd2VpZ2h0W0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXTsKIH07CiAKIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2luaXRfMndpcmUoc3RydWN0IGF0aF9odyAqYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCBlYmFmMzA0Li45OTUzODgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogQ29tbW9uIGNhbGlicmF0aW9uIGNvZGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwppbmRleCA4ZTdlNTdjLi42OGQ5NzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlICJhdGg5ay5oIgpAQCAtODU1LDcgKzg1Niw3IEBACiAJc2MtPmRlYnVnLnN0YXRzLnR4c3RhdHNbcW51bV0udHhfYnl0ZXNfYWxsICs9IGJmLT5iZl9tcGR1LT5sZW47CiAKIAlpZiAoYmZfaXNhbXBkdShiZikpIHsKLQkJaWYgKGZsYWdzICYgQVRIX1RYX0JBUikKKwkJaWYgKGZsYWdzICYgQVRIX1RYX0VSUk9SKQogCQkJVFhfU1RBVF9JTkMocW51bSwgYV94cmV0cmllcyk7CiAJCWVsc2UKIAkJCVRYX1NUQVRfSU5DKHFudW0sIGFfY29tcGxldGVkKTsKQEAgLTE2MjksNiArMTYzMCw5IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCBTX0lSVVNSIHwgU19JV1VTUiwgc2MtPmRlYnVnLmRlYnVnZnNfcGh5LAogCQkJICAgIHNjLCAmZm9wc19kZWJ1Zyk7CiAjZW5kaWYKKworCWF0aDlrX2Rmc19pbml0X2RlYnVnKHNjKTsKKwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRtYSIsIFNfSVJVU1IsIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsCiAJCQkgICAgJmZvcHNfZG1hKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbnRlcnJ1cHQiLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAppbmRleCAzNTYzNTJhLi43NzZhMjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJyYy5oIgorI2luY2x1ZGUgImRmc19kZWJ1Zy5oIgogCiBzdHJ1Y3QgYXRoX3R4cTsKIHN0cnVjdCBhdGhfYnVmOwpAQCAtMTg3LDYgKzE4OCw3IEBACiAJc3RydWN0IGF0aF9pbnRlcnJ1cHRfc3RhdHMgaXN0YXRzOwogCXN0cnVjdCBhdGhfdHhfc3RhdHMgdHhzdGF0c1tBVEg5S19OVU1fVFhfUVVFVUVTXTsKIAlzdHJ1Y3QgYXRoX3J4X3N0YXRzIHJ4c3RhdHM7CisJc3RydWN0IGF0aF9kZnNfc3RhdHMgZGZzX3N0YXRzOwogCXUzMiByZXNldFtfX1JFU0VUX1RZUEVfTUFYXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU4NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTmVyYXRlYyBTb2x1dGlvbnMgQUcKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlICJhdGg5ay5oIgorI2luY2x1ZGUgImRmcy5oIgorI2luY2x1ZGUgImRmc19kZWJ1Zy5oIgorCisvKgorICogVE9ETzogbW92ZSBpbnRvIG9yIHN5bmNocm9uaXplIHRoaXMgd2l0aCBnZW5lcmljIGhlYWRlcgorICoJIGFzIHNvb24gYXMgSUYgaXMgZGVmaW5lZAorICovCitzdHJ1Y3QgZGZzX3JhZGFyX3B1bHNlIHsKKwl1MTYgZnJlcTsKKwl1NjQgdHM7CisJdTMyIHdpZHRoOworCXU4IHJzc2k7Cit9OworCisvKiBpbnRlcm5hbCBzdHJ1Y3QgdG8gcGFzcyByYWRhciBkYXRhICovCitzdHJ1Y3QgYXRoX3JhZGFyX2RhdGEgeworCXU4IHB1bHNlX2J3X2luZm87CisJdTggcnNzaTsKKwl1OCBleHRfcnNzaTsKKwl1OCBwdWxzZV9sZW5ndGhfZXh0OworCXU4IHB1bHNlX2xlbmd0aF9wcmk7Cit9OworCisvKiBjb252ZXJ0IHB1bHNlIGR1cmF0aW9uIHRvIHVzZWNzLCBjb25zaWRlcmluZyBjbG9jayBtb2RlICovCitzdGF0aWMgdTMyIGR1cl90b191c2VjcyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGR1cikKK3sKKwljb25zdCB1MzIgQVI5M1hfTlNFQ1NfUEVSX0RVUiA9IDgwMDsKKwljb25zdCB1MzIgQVI5M1hfTlNFQ1NfUEVSX0RVUl9GQVNUID0gKDgwMDAgLyAxMSk7CisJdTMyIG5zZWNzOworCisJaWYgKElTX0NIQU5fQV9GQVNUX0NMT0NLKGFoLCBhaC0+Y3VyY2hhbikpCisJCW5zZWNzID0gZHVyICogQVI5M1hfTlNFQ1NfUEVSX0RVUl9GQVNUOworCWVsc2UKKwkJbnNlY3MgPSBkdXIgKiBBUjkzWF9OU0VDU19QRVJfRFVSOworCisJcmV0dXJuIChuc2VjcyArIDUwMCkgLyAxMDAwOworfQorCisjZGVmaW5lIFBSSV9DSF9SQURBUl9GT1VORCAweDAxCisjZGVmaW5lIEVYVF9DSF9SQURBUl9GT1VORCAweDAyCitzdGF0aWMgYm9vbAorYXRoOWtfcG9zdHByb2Nlc3NfcmFkYXJfZXZlbnQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkgICAgICBzdHJ1Y3QgYXRoX3JhZGFyX2RhdGEgKmFyZSwKKwkJCSAgICAgIHN0cnVjdCBkZnNfcmFkYXJfcHVsc2UgKmRycCkKK3sKKwl1OCByc3NpOworCXUxNiBkdXI7CisKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBBVEhfREJHX0RGUywKKwkJInB1bHNlX2J3X2luZm89MHgleCwgcHJpLGV4dCBsZW4vcnNzaT0oJXUvJXUsICV1LyV1KVxuIiwKKwkJYXJlLT5wdWxzZV9id19pbmZvLAorCQlhcmUtPnB1bHNlX2xlbmd0aF9wcmksIGFyZS0+cnNzaSwKKwkJYXJlLT5wdWxzZV9sZW5ndGhfZXh0LCBhcmUtPmV4dF9yc3NpKTsKKworCS8qCisJICogT25seSB0aGUgbGFzdCAyIGJpdHMgb2YgdGhlIEJXIGluZm8gYXJlIHJlbGV2YW50LCB0aGV5IGluZGljYXRlCisJICogd2hpY2ggY2hhbm5lbCB0aGUgcmFkYXIgd2FzIGRldGVjdGVkIGluLgorCSAqLworCWFyZS0+cHVsc2VfYndfaW5mbyAmPSAweDAzOworCisJc3dpdGNoIChhcmUtPnB1bHNlX2J3X2luZm8pIHsKKwljYXNlIFBSSV9DSF9SQURBUl9GT1VORDoKKwkJLyogcmFkYXIgaW4gY3RybCBjaGFubmVsICovCisJCWR1ciA9IGFyZS0+cHVsc2VfbGVuZ3RoX3ByaTsKKwkJREZTX1NUQVRfSU5DKHNjLCBwcmlfcGh5X2Vycm9ycyk7CisJCS8qCisJCSAqIGNhbm5vdCB1c2UgY3RybCBjaGFubmVsIFJTU0kKKwkJICogaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgc3Ryb25nZXIKKwkJICovCisJCXJzc2kgPSAoYXJlLT5leHRfcnNzaSA+PSAoYXJlLT5yc3NpICsgMykpID8gMCA6IGFyZS0+cnNzaTsKKwkJYnJlYWs7CisJY2FzZSBFWFRfQ0hfUkFEQVJfRk9VTkQ6CisJCS8qIHJhZGFyIGluIGV4dGVuc2lvbiBjaGFubmVsICovCisJCWR1ciA9IGFyZS0+cHVsc2VfbGVuZ3RoX2V4dDsKKwkJREZTX1NUQVRfSU5DKHNjLCBleHRfcGh5X2Vycm9ycyk7CisJCS8qCisJCSAqIGNhbm5vdCB1c2UgZXh0ZW5zaW9uIGNoYW5uZWwgUlNTSQorCQkgKiBpZiBjb250cm9sIGNoYW5uZWwgaXMgc3Ryb25nZXIKKwkJICovCisJCXJzc2kgPSAoYXJlLT5yc3NpID49IChhcmUtPmV4dF9yc3NpICsgMTIpKSA/IDAgOiBhcmUtPmV4dF9yc3NpOworCQlicmVhazsKKwljYXNlIChQUklfQ0hfUkFEQVJfRk9VTkQgfCBFWFRfQ0hfUkFEQVJfRk9VTkQpOgorCQkvKgorCQkgKiBDb25kdWN0ZWQgdGVzdGluZywgd2hlbiBwdWxzZSBpcyBvbiBEQywgYm90aCBwcmkgYW5kIGV4dAorCQkgKiBkdXJhdGlvbnMgYXJlIHJlcG9ydGVkIHRvIGJlIHNhbWUKKwkJICoKKwkJICogUmFkaWF0ZWQgdGVzdGluZywgd2hlbiBwdWxzZSBpcyBvbiBEQywgZGlmZmVyZW50IHByaSBhbmQKKwkJICogZXh0IGR1cmF0aW9ucyBhcmUgcmVwb3J0ZWQsIHNvIHRha2UgdGhlIGxhcmdlciBvZiB0aGUgdHdvCisJCSAqLworCQlpZiAoYXJlLT5wdWxzZV9sZW5ndGhfZXh0ID49IGFyZS0+cHVsc2VfbGVuZ3RoX3ByaSkKKwkJCWR1ciA9IGFyZS0+cHVsc2VfbGVuZ3RoX2V4dDsKKwkJZWxzZQorCQkJZHVyID0gYXJlLT5wdWxzZV9sZW5ndGhfcHJpOworCQlERlNfU1RBVF9JTkMoc2MsIGRjX3BoeV9lcnJvcnMpOworCisJCS8qIHdoZW4gYm90aCBhcmUgcHJlc2VudCB1c2Ugc3Ryb25nZXIgb25lICovCisJCXJzc2kgPSAoYXJlLT5yc3NpIDwgYXJlLT5leHRfcnNzaSkgPyBhcmUtPmV4dF9yc3NpIDogYXJlLT5yc3NpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBCb2d1cyBiYW5kd2lkdGggaW5mbyB3YXMgcmVjZWl2ZWQgaW4gZGVzY3JpcHRvciwKKwkJICogc28gaWdub3JlIHRoaXMgUEhZIGVycm9yCisJCSAqLworCQlERlNfU1RBVF9JTkMoc2MsIGJ3aW5mb19kaXNjYXJkcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAocnNzaSA9PSAwKSB7CisJCURGU19TVEFUX0lOQyhzYywgcnNzaV9kaXNjYXJkcyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFRPRE86IGNoZWNrIGNoaXJwaW5nIHB1bHNlcworCSAqCSBjaGVja3MgZm9yIGNoaXJwaW5nIGFyZSBkZXBlbmRlbnQgb24gdGhlIERGUyByZWd1bGF0b3J5IGRvbWFpbgorCSAqCSB1c2VkLCB3aGljaCBpcyB5ZXQgVEJECisJICovCisKKwkvKiBjb252ZXJ0IGR1cmF0aW9uIHRvIHVzZWNzICovCisJZHJwLT53aWR0aCA9IGR1cl90b191c2VjcyhzYy0+c2NfYWgsIGR1cik7CisJZHJwLT5yc3NpID0gcnNzaTsKKworCURGU19TVEFUX0lOQyhzYywgcHVsc2VzX2RldGVjdGVkKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKyN1bmRlZiBQUklfQ0hfUkFEQVJfRk9VTkQKKyN1bmRlZiBFWFRfQ0hfUkFEQVJfRk9VTkQKKworLyoKKyAqIERGUzogY2hlY2sgUEhZLWVycm9yIGZvciByYWRhciBwdWxzZSBhbmQgZmVlZCB0aGUgZGV0ZWN0b3IKKyAqLwordm9pZCBhdGg5a19kZnNfcHJvY2Vzc19waHllcnIoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHZvaWQgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMsIHU2NCBtYWN0aW1lKQoreworCXN0cnVjdCBhdGhfcmFkYXJfZGF0YSBhcmQ7CisJdTE2IGRhdGFsZW47CisJY2hhciAqdmRhdGFfZW5kOworCXN0cnVjdCBkZnNfcmFkYXJfcHVsc2UgZHJwOworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCisJaWYgKCghKHJzLT5yc19waHllcnIgIT0gQVRIOUtfUEhZRVJSX1JBREFSKSkgJiYKKwkgICAgKCEocnMtPnJzX3BoeWVyciAhPSBBVEg5S19QSFlFUlJfRkFMU0VfUkFEQVJfRVhUKSkpIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfREZTLAorCQkJIkVycm9yOiByc19waHllcj0weCV4IG5vdCBhIHJhZGFyIGVycm9yXG4iLAorCQkJcnMtPnJzX3BoeWVycik7CisJCXJldHVybjsKKwl9CisKKwlkYXRhbGVuID0gcnMtPnJzX2RhdGFsZW47CisJaWYgKGRhdGFsZW4gPT0gMCkgeworCQlERlNfU1RBVF9JTkMoc2MsIGRhdGFsZW5fZGlzY2FyZHMpOworCQlyZXR1cm47CisJfQorCisJYXJkLnJzc2kgPSBycy0+cnNfcnNzaV9jdGwwOworCWFyZC5leHRfcnNzaSA9IHJzLT5yc19yc3NpX2V4dDA7CisKKwkvKgorCSAqIGhhcmR3YXJlIHN0b3JlcyB0aGlzIGFzIDggYml0IHNpZ25lZCB2YWx1ZS4KKwkgKiB3ZSB3aWxsIGNhcCBpdCBhdCAwIGlmIGl0IGlzIGEgbmVnYXRpdmUgbnVtYmVyCisJICovCisJaWYgKGFyZC5yc3NpICYgMHg4MCkKKwkJYXJkLnJzc2kgPSAwOworCWlmIChhcmQuZXh0X3Jzc2kgJiAweDgwKQorCQlhcmQuZXh0X3Jzc2kgPSAwOworCisJdmRhdGFfZW5kID0gKGNoYXIgKilkYXRhICsgZGF0YWxlbjsKKwlhcmQucHVsc2VfYndfaW5mbyA9IHZkYXRhX2VuZFstMV07CisJYXJkLnB1bHNlX2xlbmd0aF9leHQgPSB2ZGF0YV9lbmRbLTJdOworCWFyZC5wdWxzZV9sZW5ndGhfcHJpID0gdmRhdGFfZW5kWy0zXTsKKworCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0RGUywKKwkJImJ3X2luZm89JWQsIGxlbmd0aF9wcmk9JWQsIGxlbmd0aF9leHQ9JWQsICIKKwkJInJzc2lfcHJpPSVkLCByc3NpX2V4dD0lZFxuIiwKKwkJYXJkLnB1bHNlX2J3X2luZm8sIGFyZC5wdWxzZV9sZW5ndGhfcHJpLCBhcmQucHVsc2VfbGVuZ3RoX2V4dCwKKwkJYXJkLnJzc2ksIGFyZC5leHRfcnNzaSk7CisKKwlkcnAuZnJlcSA9IGFoLT5jdXJjaGFuLT5jaGFubmVsOworCWRycC50cyA9IG1hY3RpbWU7CisJaWYgKGF0aDlrX3Bvc3Rwcm9jZXNzX3JhZGFyX2V2ZW50KHNjLCAmYXJkLCAmZHJwKSkgeworCQlzdGF0aWMgdTY0IGxhc3RfdHM7CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0RGUywKKwkJCSJhdGg5a19kZnNfcHJvY2Vzc19waHllcnI6IGNoYW5uZWw9JWQsIHRzPSVsbHUsICIKKwkJCSJ3aWR0aD0lZCwgcnNzaT0lZCwgZGVsdGFfdHM9JWxsdVxuIiwKKwkJCWRycC5mcmVxLCBkcnAudHMsIGRycC53aWR0aCwgZHJwLnJzc2ksIGRycC50cy1sYXN0X3RzKTsKKwkJbGFzdF90cyA9IGRycC50czsKKwkJLyoKKwkJICogVE9ETzogZm9yd2FyZCBwdWxzZSB0byBwYXR0ZXJuIGRldGVjdG9yCisJCSAqCisJCSAqIGllZWU4MDIxMV9hZGRfcmFkYXJfcHVsc2UoZHJwLmZyZXEsIGRycC50cywKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICBkcnAud2lkdGgsIGRycC5yc3NpKTsKKwkJICovCisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDEyODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDExIE5lcmF0ZWMgU29sdXRpb25zIEFHCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBBVEg5S19ERlNfSAorI2RlZmluZSBBVEg5S19ERlNfSAorCisjaWYgZGVmaW5lZChDT05GSUdfQVRIOUtfREZTX0NFUlRJRklFRCkKKy8qKgorICogYXRoOWtfZGZzX3Byb2Nlc3NfcGh5ZXJyIC0gcHJvY2VzcyByYWRhciBQSFkgZXJyb3IKKyAqIEBzYzogYXRoX3NvZnRjCisgKiBAZGF0YTogUlggcGF5bG9hZCBkYXRhCisgKiBAcnM6IFJYIHN0YXR1cyBhZnRlciBwcm9jZXNzaW5nIGRlc2NyaXB0b3IKKyAqIEBtYWN0aW1lOiByZWNlaXZlIHRpbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgSFcgREZTIG1vZHVsZSBkZXRlY3RzIGEgcmFkYXIKKyAqIHB1bHNlIGFuZCByZXBvcnRzIGl0IGFzIGEgUEhZIGVycm9yLgorICoKKyAqIFRoZSByYWRhciBpbmZvcm1hdGlvbiBwcm92aWRlZCBhcyByYXcgcGF5bG9hZCBkYXRhIGlzIHZhbGlkYXRlZCBhbmQKKyAqIGZpbHRlcmVkIGZvciBmYWxzZSBwdWxzZXMuIEV2ZW50cyBwYXNzaW5nIGFsbCB0ZXN0cyBhcmUgZm9yd2FyZGVkIHRvCisgKiB0aGUgdXBwZXIgbGF5ZXIgZm9yIHBhdHRlcm4gZGV0ZWN0aW9uLgorICovCit2b2lkIGF0aDlrX2Rmc19wcm9jZXNzX3BoeWVycihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdm9pZCAqZGF0YSwKKwkJCSAgICAgIHN0cnVjdCBhdGhfcnhfc3RhdHVzICpycywgdTY0IG1hY3RpbWUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19kZnNfcHJvY2Vzc19waHllcnIoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHZvaWQgKmRhdGEsCisJCQkJCSAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMsIHU2NCBtYWN0aW1lKSB7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogQVRIOUtfREZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnNfZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZkMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmc19kZWJ1Zy5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBOZXJhdGVjIFNvbHV0aW9ucyBBRworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKyNpbmNsdWRlICJhdGg5ay5oIgorI2luY2x1ZGUgImRmc19kZWJ1Zy5oIgorCisjZGVmaW5lIEFUSDlLX0RGU19TVEFUKHMsIHApIFwKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiJTI4cyA6ICUxMHVcbiIsIHMsIFwKKwkJCXNjLT5kZWJ1Zy5zdGF0cy5kZnNfc3RhdHMucCk7CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9kZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGF0aDlrX2h3X3ZlcnNpb24gKmh3X3ZlciA9ICZzYy0+c2NfYWgtPmh3X3ZlcnNpb247CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsZW4gPSAwLCBzaXplID0gODAwMDsKKwlzc2l6ZV90IHJldHZhbCA9IDA7CisKKwlidWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLCAiREZTIHN1cHBvcnQgZm9yICIKKwkJCSJtYWNWZXJzaW9uID0gMHgleCwgbWFjUmV2ID0gMHgleDogJXNcbiIsCisJCQlod192ZXItPm1hY1ZlcnNpb24sIGh3X3Zlci0+bWFjUmV2LAorCQkJKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0RGUykgPworCQkJCQkiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlBVEg5S19ERlNfU1RBVCgiREZTIHB1bHNlcyBkZXRlY3RlZCAgICAgIiwgcHVsc2VzX2RldGVjdGVkKTsKKwlBVEg5S19ERlNfU1RBVCgiRGF0YWxlbiBkaXNjYXJkcyAgICAgICAgIiwgZGF0YWxlbl9kaXNjYXJkcyk7CisJQVRIOUtfREZTX1NUQVQoIlJTU0kgZGlzY2FyZHMgICAgICAgICAgICIsIHJzc2lfZGlzY2FyZHMpOworCUFUSDlLX0RGU19TVEFUKCJCVyBpbmZvIGRpc2NhcmRzICAgICAgICAiLCBid2luZm9fZGlzY2FyZHMpOworCUFUSDlLX0RGU19TVEFUKCJQcmltYXJ5IGNoYW5uZWwgcHVsc2VzICAiLCBwcmlfcGh5X2Vycm9ycyk7CisJQVRIOUtfREZTX1NUQVQoIlNlY29uZGFyeSBjaGFubmVsIHB1bHNlcyIsIGV4dF9waHlfZXJyb3JzKTsKKwlBVEg5S19ERlNfU1RBVCgiRHVhbCBjaGFubmVsIHB1bHNlcyAgICAgIiwgZGNfcGh5X2Vycm9ycyk7CisKKwlpZiAobGVuID4gc2l6ZSkKKwkJbGVuID0gc2l6ZTsKKworCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGF0aDlrX2Rmc19kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2Rmc19zdGF0cyA9IHsKKwkucmVhZCA9IHJlYWRfZmlsZV9kZnMsCisJLm9wZW4gPSBhdGg5a19kZnNfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoOWtfZGZzX2luaXRfZGVidWcoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGZzX3N0YXRzIiwgU19JUlVTUiwKKwkJCSAgICBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLCAmZm9wc19kZnNfc3RhdHMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmc19kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmc19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWUyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzX2RlYnVnLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDExIE5lcmF0ZWMgU29sdXRpb25zIEFHCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIERGU19ERUJVR19ICisjZGVmaW5lIERGU19ERUJVR19ICisKKyNpbmNsdWRlICJody5oIgorCisvKioKKyAqIHN0cnVjdCBhdGhfZGZzX3N0YXRzIC0gREZTIFN0YXRpc3RpY3MKKyAqCisgKiBAcHVsc2VzX2RldGVjdGVkOiAgTm8uIG9mIHB1bHNlcyBkZXRlY3RlZCBzbyBmYXIKKyAqIEBkYXRhbGVuX2Rpc2NhcmRzOiBOby4gb2YgcHVsc2VzIGRpc2NhcmRlZCBkdWUgdG8gaW52YWxpZCBkYXRhbGVuCisgKiBAcnNzaV9kaXNjYXJkczogICAgTm8uIG9mIHB1bHNlcyBkaXNjYXJkZWQgZHVlIHRvIGludmFsaWQgUlNTSQorICogQGJ3aW5mb19kaXNjYXJkczogIE5vLiBvZiBwdWxzZXMgZGlzY2FyZGVkIGR1ZSB0byBpbnZhbGlkIEJXIGluZm8KKyAqIEBwcmlfcGh5X2Vycm9yczogICBOby4gb2YgcHVsc2VzIHJlcG9ydGVkIGZvciBwcmltYXJ5IGNoYW5uZWwKKyAqIEBleHRfcGh5X2Vycm9yczogICBOby4gb2YgcHVsc2VzIHJlcG9ydGVkIGZvciBleHRlbnNpb24gY2hhbm5lbAorICogQGRjX3BoeV9lcnJvcnM6ICAgIE5vLiBvZiBwdWxzZXMgcmVwb3J0ZWQgZm9yIHByaW1hcnkgKyBleHRlbnNpb24gY2hhbm5lbAorICovCitzdHJ1Y3QgYXRoX2Rmc19zdGF0cyB7CisJdTMyIHB1bHNlc19kZXRlY3RlZDsKKwl1MzIgZGF0YWxlbl9kaXNjYXJkczsKKwl1MzIgcnNzaV9kaXNjYXJkczsKKwl1MzIgYndpbmZvX2Rpc2NhcmRzOworCXUzMiBwcmlfcGh5X2Vycm9yczsKKwl1MzIgZXh0X3BoeV9lcnJvcnM7CisJdTMyIGRjX3BoeV9lcnJvcnM7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfQVRIOUtfREZTX0RFQlVHRlMpCisKKyNkZWZpbmUgREZTX1NUQVRfSU5DKHNjLCBjKSAoc2MtPmRlYnVnLnN0YXRzLmRmc19zdGF0cy5jKyspCit2b2lkIGF0aDlrX2Rmc19pbml0X2RlYnVnKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKKworI2Vsc2UKKworI2RlZmluZSBERlNfU1RBVF9JTkMoc2MsIGMpIGRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19kZnNfaW5pdF9kZWJ1ZyhzdHJ1Y3QgYXRoX3NvZnRjICpzYykgeyB9CisKKyNlbmRpZiAvKiBDT05GSUdfQVRIOUtfREZTX0RFQlVHRlMgKi8KKworI2VuZGlmIC8qIERGU19ERUJVR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmgKaW5kZXggNDlhYmQzNC4uNWZmN2FiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uaApAQCAtMjQ5LDcgKzI0OSw4IEBACiAJRUVQX0FOVF9ESVZfQ1RMMSwKIAlFRVBfQ0hBSU5fTUFTS19SRURVQ0UsCiAJRUVQX0FOVEVOTkFfR0FJTl8yRywKLQlFRVBfQU5URU5OQV9HQUlOXzVHCisJRUVQX0FOVEVOTkFfR0FJTl81RywKKwlFRVBfUVVJQ0tfRFJPUAogfTsKIAogZW51bSBhcjU0MTZfcmF0ZXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCmluZGV4IDlhNzUyMGYuLjYxZmNhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCiAJaW50IGk7CiAJdTE2IHR3aWNlTWluRWRnZVBvd2VyOwotCXUxNiB0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCXUxNiB0d2ljZU1heEVkZ2VQb3dlcjsKIAl1MTYgc2NhbGVkUG93ZXIgPSAwLCBtaW5DdGxQb3dlcjsKIAl1MTYgbnVtQ3RsTW9kZXM7CiAJY29uc3QgdTE2ICpwQ3RsTW9kZTsKQEAgLTU0Miw5ICs1NDIsNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCi0JCWlmIChhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpID09IDE0ICYmCi0JCSAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpIDw9IDIpCi0JCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCiAJCWZvciAoaSA9IDA7IChpIDwgQVI1NDE2X0VFUDRLX05VTV9DVExTKSAmJgogCQkJICAgICBwRWVwRGF0YS0+Y3RsSW5kZXhbaV07IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwppbmRleCA0ZjVjNTBhLi4wOTgxYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwpAQCAtNTY5LDcgKzU2OSw3IEBACiAjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVFdPX0NIQUlOICAgICA2CiAjZGVmaW5lIFJFRFVDRV9TQ0FMRURfUE9XRVJfQllfVEhSRUVfQ0hBSU4gICAxMAogCi0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCWludCBpOwogCXN0cnVjdCBjYWxfY3RsX2RhdGFfYXI5Mjg3ICpyZXA7CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbSA9IHswLCB7MCwgMCwgMCwgMH0gfSwKQEAgLTY2OSw2ICs2NjksNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCisJCXR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CiAJCS8qIFdhbGsgdGhyb3VnaCB0aGUgQ1RMIGluZGljZXMgc3RvcmVkIGluIEVFUFJPTSAqLwogCQlmb3IgKGkgPSAwOyAoaSA8IEFSOTI4N19OVU1fQ1RMUykgJiYgcEVlcERhdGEtPmN0bEluZGV4W2ldOyBpKyspIHsKIAkJCXN0cnVjdCBjYWxfY3RsX2VkZ2VzICpwUmRFZGdlc1Bvd2VyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKaW5kZXggODFlNjI5Ni4uNTVhMjFkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogI2RlZmluZSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOICAgOSAvKiAxMCpsb2cxMCgzKSoyICovCiAKIAlzdHJ1Y3QgYXI1NDE2X2VlcHJvbV9kZWYgKnBFZXBEYXRhID0gJmFoLT5lZXByb20uZGVmOwotCXUxNiB0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCXUxNiB0d2ljZU1heEVkZ2VQb3dlcjsKIAlpbnQgaTsKIAlzdHJ1Y3QgY2FsX2N0bF9kYXRhICpyZXA7CiAJc3RydWN0IGNhbF90YXJnZXRfcG93ZXJfbGVnIHRhcmdldFBvd2VyT2ZkbSwgdGFyZ2V0UG93ZXJDY2sgPSB7CkBAIC0xMTIxLDkgKzExMjEsNyBAQAogCQllbHNlCiAJCQlmcmVxID0gY2VudGVycy5jdGxfY2VudGVyOwogCi0JCWlmIChhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpID09IDE0ICYmCi0JCSAgICBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpIDw9IDIpCi0JCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCiAJCWZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9DVExTKSAmJiBwRWVwRGF0YS0+Y3RsSW5kZXhbaV07IGkrKykgewogCQkJaWYgKCgoKGNmZ0N0bCAmIH5DVExfTU9ERV9NKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwppbmRleCAyYzI3OWRjLi5lNGFlMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKQEAgLTE5OCw2ICsxOTgsNyBAQAogCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgaXNfYnRzY2FuID8gQVRIX0JUQ09FWF9TVE9NUF9BTEwgOgogCQkJICAgICAgYnRjb2V4LT5idF9zdG9tcF90eXBlKTsKIAorCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogCXNwaW5fdW5sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKIAogCWlmIChidGNvZXgtPmJ0Y29leF9wZXJpb2QgIT0gYnRjb2V4LT5idGNvZXhfbm9fc3RvbXApIHsKQEAgLTI0MCw2ICsyNDEsNyBAQAogCSBlbHNlIGlmIChidGNvZXgtPmJ0X3N0b21wX3R5cGUgPT0gQVRIX0JUQ09FWF9TVE9NUF9BTEwpCiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9MT1cpOwogCisJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJ0Y29leC0+YnRjb2V4X2xvY2spOwogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZ3Bpby5jCmluZGV4IGUzYTAyZWIuLmNlNjA2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9ncGlvLmMKQEAgLTgwLDYgKzgwLDcgQEAKIAlhdGg5a19od19idGNvZXhfYnRfc3RvbXAocHJpdi0+YWgsIGlzX2J0c2NhbiA/IEFUSF9CVENPRVhfU1RPTVBfQUxMIDoKIAkJCWJ0Y29leC0+YnRfc3RvbXBfdHlwZSk7CiAKKwlhdGg5a19od19idGNvZXhfZW5hYmxlKHByaXYtPmFoKTsKIAl0aW1lcl9wZXJpb2QgPSBpc19idHNjYW4gPyBidGNvZXgtPmJ0c2Nhbl9ub19zdG9tcCA6CiAJCWJ0Y29leC0+YnRjb2V4X25vX3N0b21wOwogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHcsICZwcml2LT5kdXR5X2N5Y2xlX3dvcmssCkBAIC0xMDgsNiArMTA5LDcgQEAKIAkJYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKGFoLCBBVEhfQlRDT0VYX1NUT01QX05PTkUpOwogCWVsc2UgaWYgKGJ0Y29leC0+YnRfc3RvbXBfdHlwZSA9PSBBVEhfQlRDT0VYX1NUT01QX0FMTCkKIAkJYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKGFoLCBBVEhfQlRDT0VYX1NUT01QX0xPVyk7CisJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShwcml2LT5haCk7CiB9CiAKIHZvaWQgYXRoX2h0Y19pbml0X2J0Y29leF93b3JrKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYwppbmRleCAwYjlhMGU4Li5mOGNlNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCkBAIC04MDgsNyArODA4LDggQEAKIAl9CiAKIAkvKiBWZXJpZnkgd2hldGhlciB3ZSBtdXN0IGNoZWNrIEFOSSAqLwotCWlmICgodGltZXN0YW1wIC0gY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIpID49IEFUSF9BTklfUE9MTElOVEVSVkFMKSB7CisJaWYgKGFoLT5jb25maWcuZW5hYmxlX2FuaSAmJgorCSAgICAodGltZXN0YW1wIC0gY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIpID49IEFUSF9BTklfUE9MTElOVEVSVkFMKSB7CiAJCWFuaWZsYWcgPSB0cnVlOwogCQljb21tb24tPmFuaS5jaGVja2FuaV90aW1lciA9IHRpbWVzdGFtcDsKIAl9CkBAIC04MzgsNyArODM5LDcgQEAKIAkqIHNob3J0IGNhbGlicmF0aW9uIGFuZCBsb25nIGNhbGlicmF0aW9uLgogCSovCiAJY2FsX2ludGVydmFsID0gQVRIX0xPTkdfQ0FMSU5URVJWQUw7Ci0JaWYgKHByaXYtPmFoLT5jb25maWcuZW5hYmxlX2FuaSkKKwlpZiAoYWgtPmNvbmZpZy5lbmFibGVfYW5pKQogCQljYWxfaW50ZXJ2YWwgPSBtaW4oY2FsX2ludGVydmFsLCAodTMyKUFUSF9BTklfUE9MTElOVEVSVkFMKTsKIAlpZiAoIWNvbW1vbi0+YW5pLmNhbGRvbmUpCiAJCWNhbF9pbnRlcnZhbCA9IG1pbihjYWxfaW50ZXJ2YWwsICh1MzIpc2hvcnRfY2FsX2ludGVydmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaAppbmRleCBlNzRjMjMzLi5jNGFkMGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oCkBAIC0yMTIsNCArMjEyLDEzIEBACiAJcmV0dXJuIGF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKS0+ZmFzdF9jaGFuX2NoYW5nZShhaCwgY2hhbiwKIAkJCQkJCQkgIGluaV9yZWxvYWRlZCk7CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg5a19od19zZXRfcmFkYXJfcGFyYW1zKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWlmICghYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpLT5zZXRfcmFkYXJfcGFyYW1zKQorCQlyZXR1cm47CisKKwlhdGg5a19od19wcml2YXRlX29wcyhhaCktPnNldF9yYWRhcl9wYXJhbXMoYWgsICZhaC0+cmFkYXJfY29uZik7Cit9CisKICNlbmRpZiAvKiBBVEg5S19IV19PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCAyNzQ3MWY4Li44Y2RhOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAiaHcuaCIKQEAgLTUwMyw3ICs1MDQsNyBAQAogCQlyZXR1cm4gZWNvZGU7CiAJfQogCi0JaWYgKCFBUl9TUkVWXzkxMDAoYWgpICYmICFBUl9TUkVWXzkzNDAoYWgpKSB7CisJaWYgKGFoLT5jb25maWcuZW5hYmxlX2FuaSkgewogCQlhdGg5a19od19hbmlfc2V0dXAoYWgpOwogCQlhdGg5a19od19hbmlfaW5pdChhaCk7CiAJfQpAQCAtNjA5LDYgKzYxMCwxMCBAQAogCWlmICghQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKIAkJYWgtPmFuaV9mdW5jdGlvbiAmPSB+QVRIOUtfQU5JX01SQ19DQ0s7CiAKKwkvKiBkaXNhYmxlIEFOSSBmb3IgOTM0MCAqLworCWlmIChBUl9TUkVWXzkzNDAoYWgpKQorCQlhaC0+Y29uZmlnLmVuYWJsZV9hbmkgPSBmYWxzZTsKKwogCWF0aDlrX2h3X2luaXRfbW9kZV9yZWdzKGFoKTsKIAogCWlmICghYWgtPmlzX3BjaWV4cHJlc3MpCkBAIC0xMzQ5LDYgKzEzNTQsNyBAQAogCiBzdGF0aWMgYm9vbCBhdGg5a19od19zZXRfcmVzZXRfcmVnKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgdHlwZSkKIHsKKwlib29sIHJldCA9IGZhbHNlOwogCiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsKTsKQEAgLTEzNjAsMTMgKzEzNjYsMjAgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQVRIOUtfUkVTRVRfUE9XRVJfT046Ci0JCXJldHVybiBhdGg5a19od19zZXRfcmVzZXRfcG93ZXJfb24oYWgpOworCQlyZXQgPSBhdGg5a19od19zZXRfcmVzZXRfcG93ZXJfb24oYWgpOworCQlicmVhazsKIAljYXNlIEFUSDlLX1JFU0VUX1dBUk06CiAJY2FzZSBBVEg5S19SRVNFVF9DT0xEOgotCQlyZXR1cm4gYXRoOWtfaHdfc2V0X3Jlc2V0KGFoLCB0eXBlKTsKKwkJcmV0ID0gYXRoOWtfaHdfc2V0X3Jlc2V0KGFoLCB0eXBlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKIAl9CisKKwlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpCisJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgYm9vbCBhdGg5a19od19jaGlwX3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoLApAQCAtMTUwNSw2ICsxNTE4LDcgQEAKIAkJICAgc3RydWN0IGF0aDlrX2h3X2NhbF9kYXRhICpjYWxkYXRhLCBib29sIGJDaGFubmVsQ2hhbmdlKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAl1MzIgc2F2ZUxlZFN0YXRlOwogCXN0cnVjdCBhdGg5a19jaGFubmVsICpjdXJjaGFuID0gYWgtPmN1cmNoYW47CiAJdTMyIHNhdmVEZWZBbnRlbm5hOwpAQCAtMTUxMiw2ICsxNTI2LDUzIEBACiAJdTY0IHRzZiA9IDA7CiAJaW50IGksIHI7CiAJYm9vbCBhbGxvd19mYnMgPSBmYWxzZTsKKwlib29sIG1jaSA9ICEhKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKTsKKwlib29sIHNhdmVfZnVsbHNsZWVwID0gYWgtPmNoaXBfZnVsbHNsZWVwOworCisJaWYgKG1jaSkgeworCisJCWFyOTAwM19tY2lfMmc1Z19jaGFuZ2VkKGFoLCBJU19DSEFOXzJHSFooY2hhbikpOworCisJCWlmIChtY2lfaHctPmJ0X3N0YXRlID09IE1DSV9CVF9DQUxfU1RBUlQpIHsKKwkJCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgc3RvcCByeCBmb3IgQlQgQ0FMIik7CisKKwkJCW1jaV9ody0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMOworCisJCQkvKgorCQkJICogTUNJIEZJWDogZGlzYWJsZSBtY2kgaW50ZXJydXB0IGhlcmUuIFRoaXMgaXMgdG8gYXZvaWQKKwkJCSAqIFNXX01TR19ET05FIG9yIFJYX01TRyBiaXRzIHRvIHRyaWdnZXIgTUNJX0lOVCBhbmQKKwkJCSAqIGxlYWQgdG8gbWNpX2ludHIgcmVlbnRyeS4KKwkJCSAqLworCisJCQlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKKworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAic2VuZCBXTEFOX0NBTF9HUkFOVCIpOworCQkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwgTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCk7CisJCQlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0dQTSwgMCwgcGF5bG9hZCwKKwkJCQkJCTE2LCB0cnVlLCBmYWxzZSk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIlxuTUNJIEJUIGlzIGNhbGlicmF0aW5nIik7CisKKwkJCS8qIFdhaXQgQlQgY2FsaWJyYXRpb24gdG8gYmUgY29tcGxldGVkIGZvciAyNW1zICovCisKKwkJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShhaCwgTUNJX0dQTV9CVF9DQUxfRE9ORSwKKwkJCQkJCQkJICAwLCAyNTAwMCkpCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIGdvdCBCVF9DQUxfRE9ORVxuIik7CisJCQllbHNlCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJICMjIyBCVCBjYWwgdGFrZXMgdG8gbG9uZywgZm9yY2UiCisJCQkJCSJidF9zdGF0ZSB0byBiZSBidF9hd2FrZVxuIik7CisJCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX0FXQUtFOworCQkJLyogTUNJIEZJWDogZW5hYmxlIG1jaSBpbnRlcnJ1cHQgaGVyZSAqLworCQkJYXI5MDAzX21jaV9lbmFibGVfaW50ZXJydXB0KGFoKTsKKworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKIAogCWlmICghYXRoOWtfaHdfc2V0cG93ZXIoYWgsIEFUSDlLX1BNX0FXQUtFKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xNTQ5LDEyICsxNjEwLDI5IEBACiAJCWlmIChhdGg5a19od19jaGFubmVsX2NoYW5nZShhaCwgY2hhbikpIHsKIAkJCWF0aDlrX2h3X2xvYWRuZihhaCwgYWgtPmN1cmNoYW4pOwogCQkJYXRoOWtfaHdfc3RhcnRfbmZjYWwoYWgsIHRydWUpOworCQkJaWYgKG1jaSAmJiBtY2lfaHctPnJlYWR5KQorCQkJCWFyOTAwM19tY2lfMmc1Z19zd2l0Y2goYWgsIHRydWUpOworCiAJCQlpZiAoQVJfU1JFVl85MjcxKGFoKSkKIAkJCQlhcjkwMDJfaHdfbG9hZF9hbmlfcmVnKGFoLCBjaGFuKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCisJaWYgKG1jaSkgeworCQlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKKworCQlpZiAobWNpX2h3LT5yZWFkeSAmJiAhc2F2ZV9mdWxsc2xlZXApIHsKKwkJCWFyOTAwM19tY2lfbXV0ZV9idChhaCk7CisJCQl1ZGVsYXkoMjApOworCQkJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfQ1RSTCwgMCk7CisJCX0KKworCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX1NMRUVQOworCQltY2lfaHctPnJlYWR5ID0gZmFsc2U7CisJfQorCisKIAlzYXZlRGVmQW50ZW5uYSA9IFJFR19SRUFEKGFoLCBBUl9ERUZfQU5URU5OQSk7CiAJaWYgKHNhdmVEZWZBbnRlbm5hID09IDApCiAJCXNhdmVEZWZBbnRlbm5hID0gMTsKQEAgLTE2MTAsNiArMTY4OCw5IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKG1jaSkKKwkJYXI5MDAzX21jaV9yZXNldChhaCwgZmFsc2UsIElTX0NIQU5fMkdIWihjaGFuKSwgc2F2ZV9mdWxsc2xlZXApOworCiAJLyoKIAkgKiBTb21lIEFSOTF4eCBTb0MgZGV2aWNlcyBmcmVxdWVudGx5IGZhaWwgdG8gYWNjZXB0IFRTRiB3cml0ZXMKIAkgKiByaWdodCBhZnRlciB0aGUgY2hpcCByZXNldC4gV2hlbiB0aGF0IGhhcHBlbnMsIHdyaXRlIGEgbmV3CkBAIC0xNzI3LDYgKzE4MDgsNTUgQEAKIAlhdGg5a19od19sb2FkbmYoYWgsIGNoYW4pOwogCWF0aDlrX2h3X3N0YXJ0X25mY2FsKGFoLCB0cnVlKTsKIAorCWlmIChtY2kgJiYgbWNpX2h3LT5yZWFkeSkgeworCisJCWlmIChJU19DSEFOXzJHSFooY2hhbikgJiYKKwkJICAgIChtY2lfaHctPmJ0X3N0YXRlID09IE1DSV9CVF9TTEVFUCkpIHsKKworCQkJaWYgKGFyOTAwM19tY2lfY2hlY2tfaW50KGFoLAorCQkJICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCkgfHwKKwkJCSAgICBhcjkwMDNfbWNpX2NoZWNrX2ludChhaCwKKwkJCSAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSkpIHsKKworCQkJCS8qCisJCQkJICogQlQgaXMgc2xlZXBpbmcuIENoZWNrIGlmIEJUIHdha2VzIHVwIGR1cmluZworCQkJCSAqIFdMQU4gY2FsaWJyYXRpb24uIElmIEJUIHdha2VzIHVwIGR1cmluZworCQkJCSAqIFdMQU4gY2FsaWJyYXRpb24sIG5lZWQgdG8gZ28gdGhyb3VnaCBhbGwKKwkJCQkgKiBtZXNzYWdlIGV4Y2hhbmdlcyBhZ2FpbiBhbmQgcmVjYWwuCisJCQkJICovCisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgQlQgd2FrZXMgdXAiCisJCQkJCSJkdXJpbmcgV0xBTiBjYWxpYnJhdGlvblxuIik7CisKKwkJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVywKKwkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVQgfAorCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKTsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgc2VuZCIKKwkJCQkJIlJFTU9URV9SRVNFVFxuIik7CisJCQkJYXI5MDAzX21jaV9yZW1vdGVfcmVzZXQoYWgsIHRydWUpOworCQkJCWFyOTAwM19tY2lfc2VuZF9zeXNfd2FraW5nKGFoLCB0cnVlKTsKKwkJCQl1ZGVsYXkoMSk7CisJCQkJaWYgKElTX0NIQU5fMkdIWihjaGFuKSkKKwkJCQkJYXI5MDAzX21jaV9zZW5kX2xuYV90cmFuc2ZlcihhaCwgdHJ1ZSk7CisKKwkJCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX0FXQUtFOworCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHJlLWNhbFxuIik7CisKKwkJCQlpZiAoY2FsZGF0YSkgeworCQkJCQljYWxkYXRhLT5kb25lX3R4aXFjYWxfb25jZSA9IGZhbHNlOworCQkJCQljYWxkYXRhLT5kb25lX3R4Y2xjYWxfb25jZSA9IGZhbHNlOworCQkJCQljYWxkYXRhLT5ydHRfaGlzdC5udW1fcmVhZGluZ3MgPSAwOworCQkJCX0KKworCQkJCWlmICghYXRoOWtfaHdfaW5pdF9jYWwoYWgsIGNoYW4pKQorCQkJCQlyZXR1cm4gLUVJTzsKKworCQkJfQorCQl9CisJCWFyOTAwM19tY2lfZW5hYmxlX2ludGVycnVwdChhaCk7CisJfQorCiAJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiAKIAlhdGg5a19od19yZXN0b3JlX2NoYWlubWFzayhhaCk7CkBAIC0xNzY5LDYgKzE4OTksMjEgQEAKIAlpZiAoYWgtPmJ0Y29leF9ody5lbmFibGVkKQogCQlhdGg5a19od19idGNvZXhfZW5hYmxlKGFoKTsKIAorCWlmIChtY2kgJiYgbWNpX2h3LT5yZWFkeSkgeworCQkvKgorCQkgKiBjaGVjayBCVCBzdGF0ZSBhZ2FpbiB0byBtYWtlCisJCSAqIHN1cmUgaXQncyBub3QgY2hhbmdlZC4KKwkJICovCisKKwkJYXI5MDAzX21jaV9zeW5jX2J0X3N0YXRlKGFoKTsKKwkJYXI5MDAzX21jaV8yZzVnX3N3aXRjaChhaCwgdHJ1ZSk7CisKKwkJaWYgKChtY2lfaHctPmJ0X3N0YXRlID09IE1DSV9CVF9BV0FLRSkgJiYKKwkJCQkobWNpX2h3LT5xdWVyeV9idCA9PSB0cnVlKSkgeworCQkJbWNpX2h3LT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCX0KKwl9CisKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewogCQlhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfY29uZmlnKGFoKTsKIApAQCAtMTgyNiw3ICsxOTcxLDggQEAKIAl9CiAKIAkvKiBDbGVhciBCaXQgMTQgb2YgQVJfV0EgYWZ0ZXIgcHV0dGluZyBjaGlwIGludG8gRnVsbCBTbGVlcCBtb2RlLiAqLwotCVJFR19XUklURShhaCwgQVJfV0EsIGFoLT5XQVJlZ1ZhbCAmIH5BUl9XQV9EM19MMV9ESVNBQkxFKTsKKwlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9XQSwgYWgtPldBUmVnVmFsICYgfkFSX1dBX0QzX0wxX0RJU0FCTEUpOwogfQogCiAvKgpAQCAtMTkzMiw2ICsyMDc4LDcgQEAKIGJvb2wgYXRoOWtfaHdfc2V0cG93ZXIoc3RydWN0IGF0aF9odyAqYWgsIGVudW0gYXRoOWtfcG93ZXJfbW9kZSBtb2RlKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAlpbnQgc3RhdHVzID0gdHJ1ZSwgc2V0Q2hpcCA9IHRydWU7CiAJc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVzW10gPSB7CiAJCSJBV0FLRSIsCkBAIC0xOTQ5LDEyICsyMDk2LDM1IEBACiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBBVEg5S19QTV9BV0FLRToKIAkJc3RhdHVzID0gYXRoOWtfaHdfc2V0X3Bvd2VyX2F3YWtlKGFoLCBzZXRDaGlwKTsKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpCisJCQlSRUdfV1JJVEUoYWgsIEFSX1JUQ19LRUVQX0FXQUtFLCAweDIpOworCiAJCWJyZWFrOwogCWNhc2UgQVRIOUtfUE1fRlVMTF9TTEVFUDoKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpIHsKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfRU5BQkxFLCBOVUxMKSAmJgorCQkJCShtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkgJiYKKwkJCQkhbWNpLT5oYWx0ZWRfYnRfZ3BtKSB7CisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGhhbHQgQlQgR1BNIgorCQkJCQkJIihmdWxsX3NsZWVwKSIpOworCQkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKGFoLAorCQkJCQkJCQkgdHJ1ZSwgdHJ1ZSk7CisJCQl9CisKKwkJCW1jaS0+cmVhZHkgPSBmYWxzZTsKKwkJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisJCX0KKwogCQlhdGg5a19zZXRfcG93ZXJfc2xlZXAoYWgsIHNldENoaXApOwogCQlhaC0+Y2hpcF9mdWxsc2xlZXAgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIEFUSDlLX1BNX05FVFdPUktfU0xFRVA6CisKKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKQorCQkJUkVHX1dSSVRFKGFoLCBBUl9SVENfS0VFUF9BV0FLRSwgMHgyKTsKKwogCQlhdGg5a19zZXRfcG93ZXJfbmV0d29ya19zbGVlcChhaCwgc2V0Q2hpcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMTA3LDYgKzIyNzcsMzAgQEAKIAkJcmV0dXJuIGNoaXBfY2hhaW5tYXNrOwogfQogCisvKioKKyAqIGF0aDlrX2h3X2Rmc190ZXN0ZWQgLSBjaGVja3MgaWYgREZTIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHVzZWQgY2hpcHNldAorICogQGFoOiB0aGUgYXRoZXJvcyBoYXJkd2FyZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFdlIGVuYWJsZSBERlMgc3VwcG9ydCB1cHN0cmVhbSBvbiBjaGlwc2V0cyB3aGljaCBoYXZlIHBhc3NlZCBhIHNlcmllcworICogb2YgdGVzdHMuIFRoZSB0ZXN0aW5nIHJlcXVpcmVtZW50cyBhcmUgZ29pbmcgdG8gYmUgZG9jdW1lbnRlZC4gRGVzaXJlZAorICogdGVzdCByZXF1aXJlbWVudHMgYXJlIGRvY3VtZW50ZWQgYXQ6CisgKgorICogaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vdXNlcnMvRHJpdmVycy9hdGg5ay9kZnMKKyAqCisgKiBPbmNlIGEgbmV3IGNoaXBzZXQgZ2V0cyBwcm9wZXJseSB0ZXN0ZWQgYW4gaW5kaXZpZHVhbCBjb21taXQgY2FuIGJlIHVzZWQKKyAqIHRvIGRvY3VtZW50IHRoZSB0ZXN0aW5nIGZvciBERlMgZm9yIHRoYXQgY2hpcHNldC4KKyAqLworc3RhdGljIGJvb2wgYXRoOWtfaHdfZGZzX3Rlc3RlZChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKworCXN3aXRjaCAoYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbikgeworCS8qIEFSOTU4MCB3aWxsIGxpa2VseSBiZSBvdXIgZmlyc3QgdGFyZ2V0IHRvIGdldCB0ZXN0aW5nIG9uICovCisJY2FzZSBBUl9TUkVWX1ZFUlNJT05fOTU4MDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiBpbnQgYXRoOWtfaHdfZmlsbF9jYXBfaW5mbyhzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoOWtfaHdfY2FwYWJpbGl0aWVzICpwQ2FwID0gJmFoLT5jYXBzOwpAQCAtMjE0Nyw2ICsyMzQxLDggQEAKIAogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSAxOworCWVsc2UgaWYgKEFSX1NSRVZfOTQ2MihhaCkpCisJCWNoaXBfY2hhaW5tYXNrID0gMzsKIAllbHNlIGlmICghQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSA3OwogCWVsc2UgaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCkBAIC0yMjAzLDEyICsyMzk5LDEwIEBACiAJZWxzZQogCQlwQ2FwLT5udW1fZ3Bpb19waW5zID0gQVJfTlVNX0dQSU87CiAKLQlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzkxMDAoYWgpKSB7Ci0JCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0NTVDsKKwlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzkxMDAoYWgpKQogCQlwQ2FwLT5ydHNfYWdncl9saW1pdCA9IEFUSF9BTVBEVV9MSU1JVF9NQVg7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXBDYXAtPnJ0c19hZ2dyX2xpbWl0ID0gKDggKiAxMDI0KTsKLQl9CiAKICNpZiBkZWZpbmVkKENPTkZJR19SRktJTEwpIHx8IGRlZmluZWQoQ09ORklHX1JGS0lMTF9NT0RVTEUpCiAJYWgtPnJmc2lsZW50ID0gYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9SRl9TSUxFTlQpOwpAQCAtMjIzMiw3ICsyNDI2LDkgQEAKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfNEtCX1NQTElUVFJBTlM7CiAKIAlpZiAoY29tbW9uLT5idGNvZXhfZW5hYmxlZCkgewotCQlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgeworCQlpZiAoQVJfU1JFVl85NDYyKGFoKSkKKwkJCWJ0Y29leF9ody0+c2NoZW1lID0gQVRIX0JUQ09FWF9DRkdfTUNJOworCQllbHNlIGlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCQlidGNvZXhfaHctPnNjaGVtZSA9IEFUSF9CVENPRVhfQ0ZHXzNXSVJFOwogCQkJYnRjb2V4X2h3LT5idGFjdGl2ZV9ncGlvID0gQVRIX0JUQUNUSVZFX0dQSU9fOTMwMDsKIAkJCWJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvID0gQVRIX1dMQU5BQ1RJVkVfR1BJT185MzAwOwpAQCAtMjMxNiw2ICsyNTEyLDkgQEAKIAkJcENhcC0+cGNpZV9sY3Jfb2Zmc2V0ID0gMHg4MDsKIAl9CiAKKwlpZiAoYXRoOWtfaHdfZGZzX3Rlc3RlZChhaCkpCisJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0RGUzsKKwogCXR4X2NoYWlubWFzayA9IHBDYXAtPnR4X2NoYWlubWFzazsKIAlyeF9jaGFpbm1hc2sgPSBwQ2FwLT5yeF9jaGFpbm1hc2s7CiAJd2hpbGUgKHR4X2NoYWlubWFzayB8fCByeF9jaGFpbm1hc2spIHsKQEAgLTIzMzAsNyArMjUyOSw3IEBACiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewogCQlhaC0+ZW5hYmxlZF9jYWxzIHw9IFRYX0lRX0NBTDsKLQkJaWYgKCFBUl9TUkVWXzkzMzAoYWgpKQorCQlpZiAoQVJfU1JFVl85NDg1X09SX0xBVEVSKGFoKSkKIAkJCWFoLT5lbmFibGVkX2NhbHMgfD0gVFhfSVFfT05fQUdDX0NBTDsKIAl9CiAJaWYgKEFSX1NSRVZfOTQ2MihhaCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IDMzZThmMmYuLjYxNWNjODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC01OSw5ICs1OSw2IEBACiAjZGVmaW5lIEFUOTI4NV9DT0VYM1dJUkVfU0FfU1VCU1lTSUQJMHgzMGFhCiAjZGVmaW5lIEFUOTI4NV9DT0VYM1dJUkVfREFfU1VCU1lTSUQJMHgzMGFiCiAKLSNkZWZpbmUgQVI5MzAwX05VTV9CVF9XRUlHSFRTICAgNAotI2RlZmluZSBBUjkzMDBfTlVNX1dMQU5fV0VJR0hUUyA0Ci0KICNkZWZpbmUgQVRIX0FNUERVX0xJTUlUX01BWCAgICAgICAgKDY0ICogMTAyNCAtIDEpCiAKICNkZWZpbmUJQVRIX0RFRkFVTFRfTk9JU0VfRkxPT1IgLTk1CkBAIC0xMjksNiArMTI2LDE2IEBACiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SWF9DTEVBUl9FWFRFUk5BTCAgNAogI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUFDX05FVFdPUktfTEVEICAgIDUKICNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19QT1dFUl9MRUQgICAgICA2CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9EQVRBICAgICAgMHgxNgorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX1dMQU5fQ0xLICAgICAgIDB4MTcKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9EQVRBICAgICAgICAweDE4CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfQ0xLICAgICAgICAgMHgxOQorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fVFggICAgICAgICAgIDB4MTQKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1dMX0lOX1JYICAgICAgICAgICAweDEzCisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19CVF9JTl9UWCAgICAgICAgICAgOQorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fUlggICAgICAgICAgIDgKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1JVQ0tVU19TVFJPQkUgICAgICAweDFkCisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SVUNLVVNfREFUQSAgICAgICAgMHgxZQogCiAjZGVmaW5lIEFSX0dQSU9EX01BU0sgICAgICAgICAgICAgICAweDAwMDAxRkZGCiAjZGVmaW5lIEFSX0dQSU9fQklUKF9ncGlvKSAgICAgICAgICAoMSA8PCAoX2dwaW8pKQpAQCAtMTg5LDIxICsxOTYsMjEgQEAKIGVudW0gYXRoOWtfaHdfY2FwcyB7CiAJQVRIOUtfSFdfQ0FQX0hUICAgICAgICAgICAgICAgICAgICAgICAgID0gQklUKDApLAogCUFUSDlLX0hXX0NBUF9SRlNJTEVOVCAgICAgICAgICAgICAgICAgICA9IEJJVCgxKSwKLQlBVEg5S19IV19DQVBfQ1NUICAgICAgICAgICAgICAgICAgICAgICAgPSBCSVQoMiksCi0JQVRIOUtfSFdfQ0FQX0FVVE9TTEVFUCAgICAgICAgICAgICAgICAgID0gQklUKDQpLAotCUFUSDlLX0hXX0NBUF80S0JfU1BMSVRUUkFOUyAgICAgICAgICAgICA9IEJJVCg1KSwKLQlBVEg5S19IV19DQVBfRURNQQkJCT0gQklUKDYpLAotCUFUSDlLX0hXX0NBUF9SQUNfU1VQUE9SVEVECQk9IEJJVCg3KSwKLQlBVEg5S19IV19DQVBfTERQQwkJCT0gQklUKDgpLAotCUFUSDlLX0hXX0NBUF9GQVNUQ0xPQ0sJCQk9IEJJVCg5KSwKLQlBVEg5S19IV19DQVBfU0dJXzIwCQkJPSBCSVQoMTApLAotCUFUSDlLX0hXX0NBUF9QQVBSRAkJCT0gQklUKDExKSwKLQlBVEg5S19IV19DQVBfQU5UX0RJVl9DT01CCQk9IEJJVCgxMiksCi0JQVRIOUtfSFdfQ0FQXzJHSFoJCQk9IEJJVCgxMyksCi0JQVRIOUtfSFdfQ0FQXzVHSFoJCQk9IEJJVCgxNCksCi0JQVRIOUtfSFdfQ0FQX0FQTQkJCT0gQklUKDE1KSwKLQlBVEg5S19IV19DQVBfUlRUCQkJPSBCSVQoMTYpLAotCUFUSDlLX0hXX0NBUF9NQ0kJCQk9IEJJVCgxNyksCisJQVRIOUtfSFdfQ0FQX0FVVE9TTEVFUCAgICAgICAgICAgICAgICAgID0gQklUKDIpLAorCUFUSDlLX0hXX0NBUF80S0JfU1BMSVRUUkFOUyAgICAgICAgICAgICA9IEJJVCgzKSwKKwlBVEg5S19IV19DQVBfRURNQQkJCT0gQklUKDQpLAorCUFUSDlLX0hXX0NBUF9SQUNfU1VQUE9SVEVECQk9IEJJVCg1KSwKKwlBVEg5S19IV19DQVBfTERQQwkJCT0gQklUKDYpLAorCUFUSDlLX0hXX0NBUF9GQVNUQ0xPQ0sJCQk9IEJJVCg3KSwKKwlBVEg5S19IV19DQVBfU0dJXzIwCQkJPSBCSVQoOCksCisJQVRIOUtfSFdfQ0FQX1BBUFJECQkJPSBCSVQoOSksCisJQVRIOUtfSFdfQ0FQX0FOVF9ESVZfQ09NQgkJPSBCSVQoMTApLAorCUFUSDlLX0hXX0NBUF8yR0haCQkJPSBCSVQoMTEpLAorCUFUSDlLX0hXX0NBUF81R0haCQkJPSBCSVQoMTIpLAorCUFUSDlLX0hXX0NBUF9BUE0JCQk9IEJJVCgxMyksCisJQVRIOUtfSFdfQ0FQX1JUVAkJCT0gQklUKDE0KSwKKwlBVEg5S19IV19DQVBfTUNJCQkJPSBCSVQoMTUpLAorCUFUSDlLX0hXX0NBUF9ERlMJCQk9IEJJVCgxNiksCiB9OwogCiBzdHJ1Y3QgYXRoOWtfaHdfY2FwYWJpbGl0aWVzIHsKQEAgLTI2OSw2ICsyNzYsNyBAQAogCUFUSDlLX0lOVF9UWCA9IDB4MDAwMDAwNDAsCiAJQVRIOUtfSU5UX1RYREVTQyA9IDB4MDAwMDAwODAsCiAJQVRIOUtfSU5UX1RJTV9USU1FUiA9IDB4MDAwMDAxMDAsCisJQVRIOUtfSU5UX01DSSA9IDB4MDAwMDAyMDAsCiAJQVRIOUtfSU5UX0JCX1dBVENIRE9HID0gMHgwMDAwMDQwMCwKIAlBVEg5S19JTlRfVFhVUk4gPSAweDAwMDAwODAwLAogCUFUSDlLX0lOVF9NSUIgPSAweDAwMDAxMDAwLApAQCAtNDIwLDYgKzQyOCwyNSBAQAogCUFUSDlLX1JYX1FVRVVFX01BWCwKIH07CiAKK2VudW0gbWNpX21lc3NhZ2VfaGVhZGVyIHsJCS8qIGxlbmd0aCBvZiBwYXlsb2FkICovCisJTUNJX0xOQV9DVFJMICAgICA9IDB4MTAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX0NPTlRfTkFDSyAgICA9IDB4MjAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX0NPTlRfSU5GTyAgICA9IDB4MzAsICAgICAgICAvKiBsZW4gPSA0ICovCisJTUNJX0NPTlRfUlNUICAgICA9IDB4NDAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX1NDSERfSU5GTyAgICA9IDB4NTAsICAgICAgICAvKiBsZW4gPSAxNiAqLworCU1DSV9DUFVfSU5UICAgICAgPSAweDYwLCAgICAgICAgLyogbGVuID0gNCAqLworCU1DSV9TWVNfV0FLSU5HICAgPSAweDcwLCAgICAgICAgLyogbGVuID0gMCAqLworCU1DSV9HUE0gICAgICAgICAgPSAweDgwLCAgICAgICAgLyogbGVuID0gMTYgKi8KKwlNQ0lfTE5BX0lORk8gICAgID0gMHg5MCwgICAgICAgIC8qIGxlbiA9IDEgKi8KKwlNQ0lfTE5BX1NUQVRFICAgID0gMHg5NCwKKwlNQ0lfTE5BX1RBS0UgICAgID0gMHg5OCwKKwlNQ0lfTE5BX1RSQU5TICAgID0gMHg5YywKKwlNQ0lfU1lTX1NMRUVQSU5HID0gMHhhMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KKwlNQ0lfUkVRX1dBS0UgICAgID0gMHhjMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KKwlNQ0lfREVCVUdfMTYgICAgID0gMHhmZSwgICAgICAgIC8qIGxlbiA9IDIgKi8KKwlNQ0lfUkVNT1RFX1JFU0VUID0gMHhmZiAgICAgICAgIC8qIGxlbiA9IDE2ICovCit9OworCiBlbnVtIGF0aF9tY2lfZ3BtX2NvZXhfcHJvZmlsZV90eXBlIHsKIAlNQ0lfR1BNX0NPRVhfUFJPRklMRV9VTktOT1dOLAogCU1DSV9HUE1fQ09FWF9QUk9GSUxFX1JGQ09NTSwKQEAgLTQzMCw2ICs0NTcsMTMyIEBACiAJTUNJX0dQTV9DT0VYX1BST0ZJTEVfTUFYCiB9OwogCisvKiBNQ0kgR1BNL0NvZXggb3Bjb2RlL3R5cGUgZGVmaW5pdGlvbnMgKi8KK2VudW0geworCU1DSV9HUE1fQ09FWF9XX0dQTV9QQVlMT0FEICAgICAgPSAxLAorCU1DSV9HUE1fQ09FWF9CX0dQTV9UWVBFICAgICAgICAgPSA0LAorCU1DSV9HUE1fQ09FWF9CX0dQTV9PUENPREUgICAgICAgPSA1LAorCS8qIE1DSV9HUE1fV0xBTl9DQUxfUkVRLCBNQ0lfR1BNX1dMQU5fQ0FMX0RPTkUgKi8KKwlNQ0lfR1BNX1dMQU5fQ0FMX1dfU0VRVUVOQ0UgICAgID0gMiwKKworCS8qIE1DSV9HUE1fQ09FWF9WRVJTSU9OX1FVRVJZICovCisJLyogTUNJX0dQTV9DT0VYX1ZFUlNJT05fUkVTUE9OU0UgKi8KKwlNQ0lfR1BNX0NPRVhfQl9NQUpPUl9WRVJTSU9OICAgID0gNiwKKwlNQ0lfR1BNX0NPRVhfQl9NSU5PUl9WRVJTSU9OICAgID0gNywKKwkvKiBNQ0lfR1BNX0NPRVhfU1RBVFVTX1FVRVJZICovCisJTUNJX0dQTV9DT0VYX0JfQlRfQklUTUFQICAgICAgICA9IDYsCisJTUNJX0dQTV9DT0VYX0JfV0xBTl9CSVRNQVAgICAgICA9IDcsCisJLyogTUNJX0dQTV9DT0VYX0hBTFRfQlRfR1BNICovCisJTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSAgICAgICA9IDYsCisJLyogTUNJX0dQTV9DT0VYX1dMQU5fQ0hBTk5FTFMgKi8KKwlNQ0lfR1BNX0NPRVhfQl9DSEFOTkVMX01BUCAgICAgID0gNiwKKwkvKiBNQ0lfR1BNX0NPRVhfQlRfUFJPRklMRV9JTkZPICovCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9UWVBFICAgICA9IDYsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9MSU5LSUQgICA9IDcsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9TVEFURSAgICA9IDgsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9ST0xFICAgICA9IDksCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9SQVRFICAgICA9IDEwLAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfVk9UWVBFICAgPSAxMSwKKwlNQ0lfR1BNX0NPRVhfSF9QUk9GSUxFX1QgICAgICAgID0gMTIsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9XICAgICAgICA9IDE0LAorCU1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfQSAgICAgICAgPSAxNSwKKwkvKiBNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURSAqLworCU1DSV9HUE1fQ09FWF9CX1NUQVRVU19UWVBFICAgICAgPSA2LAorCU1DSV9HUE1fQ09FWF9CX1NUQVRVU19MSU5LSUQgICAgPSA3LAorCU1DSV9HUE1fQ09FWF9CX1NUQVRVU19TVEFURSAgICAgPSA4LAorCS8qIE1DSV9HUE1fQ09FWF9CVF9VUERBVEVfRkxBR1MgKi8KKwlNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyAgICAgICAgID0gNiwKKwlNQ0lfR1BNX0NPRVhfQl9CVF9GTEFHU19PUCAgICAgID0gMTAKK307CisKK2VudW0gbWNpX2dwbV9zdWJ0eXBlIHsKKwlNQ0lfR1BNX0JUX0NBTF9SRVEgICAgICA9IDAsCisJTUNJX0dQTV9CVF9DQUxfR1JBTlQgICAgPSAxLAorCU1DSV9HUE1fQlRfQ0FMX0RPTkUgICAgID0gMiwKKwlNQ0lfR1BNX1dMQU5fQ0FMX1JFUSAgICA9IDMsCisJTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCAgPSA0LAorCU1DSV9HUE1fV0xBTl9DQUxfRE9ORSAgID0gNSwKKwlNQ0lfR1BNX0NPRVhfQUdFTlQgICAgICA9IDB4MGMsCisJTUNJX0dQTV9SU1ZEX1BBVFRFUk4gICAgPSAweGZlLAorCU1DSV9HUE1fUlNWRF9QQVRURVJOMzIgID0gMHhmZWZlZmVmZSwKKwlNQ0lfR1BNX0JUX0RFQlVHICAgICAgICA9IDB4ZmYKK307CisKK2VudW0gbWNpX2J0X3N0YXRlIHsKKwlNQ0lfQlRfU0xFRVAsCisJTUNJX0JUX0FXQUtFLAorCU1DSV9CVF9DQUxfU1RBUlQsCisJTUNJX0JUX0NBTAorfTsKKworLyogVHlwZSBvZiBzdGF0ZSBxdWVyeSAqLworZW51bSBtY2lfc3RhdGVfdHlwZSB7CisJTUNJX1NUQVRFX0VOQUJMRSwKKwlNQ0lfU1RBVEVfSU5JVF9HUE1fT0ZGU0VULAorCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsCisJTUNJX1NUQVRFX0xBU1RfR1BNX09GRlNFVCwKKwlNQ0lfU1RBVEVfQlQsCisJTUNJX1NUQVRFX1NFVF9CVF9TTEVFUCwKKwlNQ0lfU1RBVEVfU0VUX0JUX0FXQUtFLAorCU1DSV9TVEFURV9TRVRfQlRfQ0FMX1NUQVJULAorCU1DSV9TVEFURV9TRVRfQlRfQ0FMLAorCU1DSV9TVEFURV9MQVNUX1NDSERfTVNHX09GRlNFVCwKKwlNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQLAorCU1DSV9TVEFURV9DT05UX1JTU0lfUE9XRVIsCisJTUNJX1NUQVRFX0NPTlRfUFJJT1JJVFksCisJTUNJX1NUQVRFX0NPTlRfVFhSWCwKKwlNQ0lfU1RBVEVfUkVTRVRfUkVRX1dBS0UsCisJTUNJX1NUQVRFX1NFTkRfV0xBTl9DT0VYX1ZFUlNJT04sCisJTUNJX1NUQVRFX1NFVF9CVF9DT0VYX1ZFUlNJT04sCisJTUNJX1NUQVRFX1NFTkRfV0xBTl9DSEFOTkVMUywKKwlNQ0lfU1RBVEVfU0VORF9WRVJTSU9OX1FVRVJZLAorCU1DSV9TVEFURV9TRU5EX1NUQVRVU19RVUVSWSwKKwlNQ0lfU1RBVEVfTkVFRF9GTFVTSF9CVF9JTkZPLAorCU1DSV9TVEFURV9TRVRfQ09OQ1VSX1RYX1BSSSwKKwlNQ0lfU1RBVEVfUkVDT1ZFUl9SWCwKKwlNQ0lfU1RBVEVfTkVFRF9GVFBfU1RPTVAsCisJTUNJX1NUQVRFX05FRURfVFVOSU5HLAorCU1DSV9TVEFURV9ERUJVRywKKwlNQ0lfU1RBVEVfTUFYCit9OworCitlbnVtIG1jaV9ncG1fY29leF9vcGNvZGUgeworCU1DSV9HUE1fQ09FWF9WRVJTSU9OX1FVRVJZLAorCU1DSV9HUE1fQ09FWF9WRVJTSU9OX1JFU1BPTlNFLAorCU1DSV9HUE1fQ09FWF9TVEFUVVNfUVVFUlksCisJTUNJX0dQTV9DT0VYX0hBTFRfQlRfR1BNLAorCU1DSV9HUE1fQ09FWF9XTEFOX0NIQU5ORUxTLAorCU1DSV9HUE1fQ09FWF9CVF9QUk9GSUxFX0lORk8sCisJTUNJX0dQTV9DT0VYX0JUX1NUQVRVU19VUERBVEUsCisJTUNJX0dQTV9DT0VYX0JUX1VQREFURV9GTEFHUworfTsKKworI2RlZmluZSBNQ0lfR1BNX05PTU9SRSAgMAorI2RlZmluZSBNQ0lfR1BNX01PUkUgICAgMQorI2RlZmluZSBNQ0lfR1BNX0lOVkFMSUQgMHhmZmZmZmZmZgorCisjZGVmaW5lIE1DSV9HUE1fUkVDWUNMRShfcF9ncG0pCWRvIHsJCQkgIFwKKwkqKCgodTMyICopX3BfZ3BtKSArIE1DSV9HUE1fQ09FWF9XX0dQTV9QQVlMT0FEKSA9IFwKKwkJCQlNQ0lfR1BNX1JTVkRfUEFUVEVSTjMyOyAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUNJX0dQTV9UWVBFKF9wX2dwbSkJXAorCSgqKCgodTggKikoX3BfZ3BtKSkgKyBNQ0lfR1BNX0NPRVhfQl9HUE1fVFlQRSkgJiAweGZmKQorCisjZGVmaW5lIE1DSV9HUE1fT1BDT0RFKF9wX2dwbSkJXAorCSgqKCgodTggKikoX3BfZ3BtKSkgKyBNQ0lfR1BNX0NPRVhfQl9HUE1fT1BDT0RFKSAmIDB4ZmYpCisKKyNkZWZpbmUgTUNJX0dQTV9TRVRfQ0FMX1RZUEUoX3BfZ3BtLCBfY2FsX3R5cGUpCWRvIHsJCQkgICBcCisJKigoKHU4ICopKF9wX2dwbSkpICsgTUNJX0dQTV9DT0VYX0JfR1BNX1RZUEUpID0gKF9jYWxfdHlwZSkgJiAweGZmO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUNJX0dQTV9TRVRfVFlQRV9PUENPREUoX3BfZ3BtLCBfdHlwZSwgX29wY29kZSkgZG8gewkJICAgXAorCSooKCh1OCAqKShfcF9ncG0pKSArIE1DSV9HUE1fQ09FWF9CX0dQTV9UWVBFKSA9IChfdHlwZSkgJiAweGZmOwkgICBcCisJKigoKHU4ICopKF9wX2dwbSkpICsgTUNJX0dQTV9DT0VYX0JfR1BNX09QQ09ERSkgPSAoX29wY29kZSkgJiAweGZmO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUNJX0dQTV9JU19DQUxfVFlQRShfdHlwZSkgKChfdHlwZSkgPD0gTUNJX0dQTV9XTEFOX0NBTF9ET05FKQorCiBzdHJ1Y3QgYXRoOWtfYmVhY29uX3N0YXRlIHsKIAl1MzIgYnNfbmV4dHRidHQ7CiAJdTMyIGJzX25leHRkdGltOwpAQCAtODAyLDggKzk1NSw2IEBACiAKIAkvKiBCbHVldG9vdGggY29leGlzdGFuY2UgKi8KIAlzdHJ1Y3QgYXRoX2J0Y29leF9odyBidGNvZXhfaHc7Ci0JdTMyIGJ0X2NvZXhfYnRfd2VpZ2h0W0FSOTMwMF9OVU1fQlRfV0VJR0hUU107Ci0JdTMyIGJ0X2NvZXhfd2xhbl93ZWlnaHRbQVI5MzAwX05VTV9XTEFOX1dFSUdIVFNdOwogCiAJdTMyIGludHJfdHhxczsKIAl1OCB0eGNoYWlubWFzazsKQEAgLTk1OSw3ICsxMTEwLDYgQEAKIHZvaWQgYXRoOWtfaHdfc2V0X3R4cG93ZXJsaW1pdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGxpbWl0LCBib29sIHRlc3QpOwogdm9pZCBhdGg5a19od19zZXRvcG1vZGUoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19zZXRtY2FzdGZpbHRlcihzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKTsKLXZvaWQgYXRoOWtfaHdfc2V0YnNzaWRtYXNrKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB1MzIgYXRoOWtfaHdfZ2V0dHNmMzIoc3RydWN0IGF0aF9odyAqYWgpOwogdTY0IGF0aDlrX2h3X2dldHRzZjY0KHN0cnVjdCBhdGhfaHcgKmFoKTsKQEAgLTEwNTIsNiArMTIwMiwzMiBAQAogdm9pZCBhdGg5a19od19wcm9jX21pYl9ldmVudChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGF0aDlrX2h3X2FuaV9tb25pdG9yKHN0cnVjdCBhdGhfaHcgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbik7CiAKK2Jvb2wgYXI5MDAzX21jaV9zZW5kX21lc3NhZ2Uoc3RydWN0IGF0aF9odyAqYWgsIHU4IGhlYWRlciwgdTMyIGZsYWcsCisJCQkgICAgIHUzMiAqcGF5bG9hZCwgdTggbGVuLCBib29sIHdhaXRfZG9uZSwKKwkJCSAgICAgYm9vbCBjaGVja19idCk7Cit2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit1MzIgYXI5MDAzX21jaV9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHN0YXRlX3R5cGUsIHUzMiAqcF9kYXRhKTsKK3ZvaWQgYXI5MDAzX21jaV9zZXR1cChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGdwbV9hZGRyLCB2b2lkICpncG1fYnVmLAorCQkgICAgICB1MTYgbGVuLCB1MzIgc2NoZWRfYWRkcik7Cit2b2lkIGFyOTAwM19tY2lfY2xlYW51cChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3YWl0X2RvbmUpOwordTMyIGFyOTAwM19tY2lfd2FpdF9mb3JfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBncG1fdHlwZSwKKwkJCSAgICB1OCBncG1fb3Bjb2RlLCBpbnQgdGltZV9vdXQpOwordm9pZCBhcjkwMDNfbWNpXzJnNWdfY2hhbmdlZChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBpc18yZyk7Cit2b2lkIGFyOTAwM19tY2lfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSk7Cit2b2lkIGFyOTAwM19tY2lfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgZW5faW50LCBib29sIGlzXzJnLAorCQkgICAgICBib29sIGlzX2Z1bGxfc2xlZXApOworYm9vbCBhcjkwMDNfbWNpX2NoZWNrX2ludChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGludHMpOwordm9pZCBhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3NlbmRfc3lzX3dha2luZyhzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSk7Cit2b2lkIGFyOTAwM19tY2lfc3luY19idF9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19tY2lfZ2V0X2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyICpyYXdfaW50ciwKKwkJCSAgICAgIHUzMiAqcnhfbXNnX2ludHIpOworCiAjZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfQ0NLCQkyMgogI2RlZmluZSBBVEg5S19DTE9DS19SQVRFXzVHSFpfT0ZETQk0MAogI2RlZmluZSBBVEg5S19DTE9DS19SQVRFXzJHSFpfT0ZETQk0NApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKaW5kZXggNWNiMDU5OS4uYzVkZjk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYXRoOWtfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImF0aDlrLmgiCiAKQEAgLTI1Nyw2ICsyNTgsOCBAQAogCiAJaWYgKEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85NDg1KGFoKSkKIAkJbWF4X3N0cmVhbXMgPSAxOworCWVsc2UgaWYgKEFSX1NSRVZfOTQ2MihhaCkpCisJCW1heF9zdHJlYW1zID0gMjsKIAllbHNlIGlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQogCQltYXhfc3RyZWFtcyA9IDM7CiAJZWxzZQpAQCAtMjk0LDkgKzI5NywyMiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gd2lwaHlfdG9faWVlZTgwMjExX2h3KHdpcGh5KTsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwotCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVnID0gYXRoOWtfaHdfcmVndWxhdG9yeShzYy0+c2NfYWgpOworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVnID0gYXRoOWtfaHdfcmVndWxhdG9yeShhaCk7CisJaW50IHJldDsKIAotCXJldHVybiBhdGhfcmVnX25vdGlmaWVyX2FwcGx5KHdpcGh5LCByZXF1ZXN0LCByZWcpOworCXJldCA9IGF0aF9yZWdfbm90aWZpZXJfYXBwbHkod2lwaHksIHJlcXVlc3QsIHJlZyk7CisKKwkvKiBTZXQgdHggcG93ZXIgKi8KKwlpZiAoYWgtPmN1cmNoYW4pIHsKKwkJc2MtPmNvbmZpZy50eHBvd2xpbWl0ID0gMiAqIGFoLT5jdXJjaGFuLT5jaGFuLT5tYXhfcG93ZXI7CisJCWF0aDlrX3BzX3dha2V1cChzYyk7CisJCWF0aDlrX2h3X3NldF90eHBvd2VybGltaXQoYWgsIHNjLT5jb25maWcudHhwb3dsaW1pdCwgZmFsc2UpOworCQlzYy0+Y3VydHhwb3cgPSBhdGg5a19od19yZWd1bGF0b3J5KGFoKS0+cG93ZXJfbGltaXQ7CisJCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC00MDcsNiArNDIzLDcgQEAKIHN0YXRpYyBpbnQgYXRoOWtfaW5pdF9idGNvZXgoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAJc3RydWN0IGF0aF90eHEgKnR4cTsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAlpbnQgcjsKIAogCXN3aXRjaCAoc2MtPnNjX2FoLT5idGNvZXhfaHcuc2NoZW1lKSB7CkBAIC00MjMsOCArNDQwLDM3IEBACiAJCXR4cSA9IHNjLT50eC50eHFfbWFwW1dNRV9BQ19CRV07CiAJCWF0aDlrX2h3X2luaXRfYnRjb2V4X2h3KHNjLT5zY19haCwgdHhxLT5heHFfcW51bSk7CiAJCXNjLT5idGNvZXguYnRfc3RvbXBfdHlwZSA9IEFUSF9CVENPRVhfU1RPTVBfTE9XOworCQlicmVhazsKKwljYXNlIEFUSF9CVENPRVhfQ0ZHX01DSToKKwkJc2MtPmJ0Y29leC5idF9zdG9tcF90eXBlID0gQVRIX0JUQ09FWF9TVE9NUF9MT1c7CiAJCXNjLT5idGNvZXguZHV0eV9jeWNsZSA9IEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEU7CiAJCUlOSVRfTElTVF9IRUFEKCZzYy0+YnRjb2V4Lm1jaS5pbmZvKTsKKworCQlyID0gYXRoX21jaV9zZXR1cChzYyk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkgeworCQkJYWgtPmJ0Y29leF9ody5tY2kucmVhZHkgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3N0YXRlID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3Zlcl9tYWpvciA9IDM7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5idF92ZXJfbWlub3IgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuYnRfdmVyc2lvbl9rbm93biA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudXBkYXRlXzJnNWcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kuaXNfMmcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc191cGRhdGUgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbMF0gPSAweDAwMDAwMDAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc1sxXSA9IDB4ZmZmZmZmZmY7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS53bGFuX2NoYW5uZWxzWzJdID0gMHhmZmZmZmZmZjsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbM10gPSAweDdmZmZmZmZmOworCQkJYWgtPmJ0Y29leF9ody5tY2kucXVlcnlfYnQgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudW5oYWx0X2J0X2dwbSA9IHRydWU7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5oYWx0ZWRfYnRfZ3BtID0gZmFsc2U7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5uZWVkX2ZsdXNoX2J0aW5mbyA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jYWxfc2VxID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2FsX2RvbmUgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuY29uZmlnID0gMHgyMjAxOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CkBAIC04MzgsNiArODg0LDkgQEAKIAkgICAgc2MtPnNjX2FoLT5idGNvZXhfaHcuc2NoZW1lID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKQogCQlhdGhfZ2VuX3RpbWVyX2ZyZWUoc2MtPnNjX2FoLCBzYy0+YnRjb2V4Lm5vX3N0b21wX3RpbWVyKTsKIAorCWlmIChzYy0+c2NfYWgtPmJ0Y29leF9ody5zY2hlbWUgPT0gQVRIX0JUQ09FWF9DRkdfTUNJKQorCQlhdGhfbWNpX2NsZWFudXAoc2MpOworCiAJZm9yIChpID0gMDsgaSA8IEFUSDlLX05VTV9UWF9RVUVVRVM7IGkrKykKIAkJaWYgKEFUSF9UWFFfU0VUVVAoc2MsIGkpKQogCQkJYXRoX3R4X2NsZWFudXBxKHNjLCAmc2MtPnR4LnR4cVtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKaW5kZXggNmE4ZmRmMy4uMGU0ZmJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0X3R4cV9pbnRlcnJ1cHRzKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJCQlzdHJ1Y3QgYXRoOWtfdHhfcXVldWVfaW5mbyAqcWkpCkBAIC03NTksNyArNzYwLDEwIEBACiAJCXJldHVybiB0cnVlOwogCiAJaG9zdF9pc3IgPSBSRUdfUkVBRChhaCwgQVJfSU5UUl9BU1lOQ19DQVVTRSk7Ci0JaWYgKChob3N0X2lzciAmIEFSX0lOVFJfTUFDX0lSUSkgJiYgKGhvc3RfaXNyICE9IEFSX0lOVFJfU1BVUklPVVMpKQorCisJaWYgKCgoaG9zdF9pc3IgJiBBUl9JTlRSX01BQ19JUlEpIHx8CisJICAgICAoaG9zdF9pc3IgJiBBUl9JTlRSX0FTWU5DX01BU0tfTUNJKSkgJiYKKwkgICAgKGhvc3RfaXNyICE9IEFSX0lOVFJfU1BVUklPVVMpKQogCQlyZXR1cm4gdHJ1ZTsKIAogCWhvc3RfaXNyID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfU1lOQ19DQVVTRSk7CkBAIC03OTcsNiArODAxLDcgQEAKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAl1MzIgc3luY19kZWZhdWx0ID0gQVJfSU5UUl9TWU5DX0RFRkFVTFQ7CisJdTMyIGFzeW5jX21hc2s7CiAKIAlpZiAoIShhaC0+aW1hc2sgJiBBVEg5S19JTlRfR0xPQkFMKSkKIAkJcmV0dXJuOwpAQCAtODExLDEzICs4MTYsMTYgQEAKIAlpZiAoQVJfU1JFVl85MzQwKGFoKSkKIAkJc3luY19kZWZhdWx0ICY9IH5BUl9JTlRSX1NZTkNfSE9TVDFfRkFUQUw7CiAKKwlhc3luY19tYXNrID0gQVJfSU5UUl9NQUNfSVJROworCisJaWYgKGFoLT5pbWFzayAmIEFUSDlLX0lOVF9NQ0kpCisJCWFzeW5jX21hc2sgfD0gQVJfSU5UUl9BU1lOQ19NQVNLX01DSTsKKwogCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwgImVuYWJsZSBJRVJcbiIpOwogCVJFR19XUklURShhaCwgQVJfSUVSLCBBUl9JRVJfRU5BQkxFKTsKIAlpZiAoIUFSX1NSRVZfOTEwMChhaCkpIHsKLQkJUkVHX1dSSVRFKGFoLCBBUl9JTlRSX0FTWU5DX0VOQUJMRSwKLQkJCSAgQVJfSU5UUl9NQUNfSVJRKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9JTlRSX0FTWU5DX01BU0ssIEFSX0lOVFJfTUFDX0lSUSk7Ci0KKwkJUkVHX1dSSVRFKGFoLCBBUl9JTlRSX0FTWU5DX0VOQUJMRSwgYXN5bmNfbWFzayk7CisJCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19NQVNLLCBhc3luY19tYXNrKTsKIAogCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfU1lOQ19FTkFCTEUsIHN5bmNfZGVmYXVsdCk7CiAJCVJFR19XUklURShhaCwgQVJfSU5UUl9TWU5DX01BU0ssIHN5bmNfZGVmYXVsdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwppbmRleCBlNDNjNDFjLi43ZmJjNGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCWlmICgtLXNjLT5wc191c2Vjb3VudCAhPSAwKQogCQlnb3RvIHVubG9jazsKIAotCWlmIChzYy0+cHNfaWRsZSkKKwlpZiAoc2MtPnBzX2lkbGUgJiYgKHNjLT5wc19mbGFncyAmIFBTX1dBSVRfRk9SX1RYX0FDSykpCiAJCW1vZGUgPSBBVEg5S19QTV9GVUxMX1NMRUVQOwogCWVsc2UgaWYgKHNjLT5wc19lbmFibGVkICYmCiAJCSAhKHNjLT5wc19mbGFncyAmIChQU19XQUlUX0ZPUl9CRUFDT04gfApAQCAtMjg2LDcgKzI4Niw3IEBACiAJCQlhdGhfc3RhcnRfYW5pKGNvbW1vbik7CiAJfQogCi0JaWYgKGF0aDlrX2h3X29wcyhhaCktPmFudGRpdl9jb21iX2NvbmZfZ2V0ICYmIHNjLT5hbnRfcnggIT0gMykgeworCWlmICgoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9BTlRfRElWX0NPTUIpICYmIHNjLT5hbnRfcnggIT0gMykgewogCQlzdHJ1Y3QgYXRoX2h3X2FudGNvbWJfY29uZiBkaXZfYW50X2NvbmY7CiAJCXU4IGxuYV9jb25mOwogCkBAIC0zMzIsNyArMzMyLDggQEAKIAkJaGNoYW4gPSBhaC0+Y3VyY2hhbjsKIAl9CiAKLQlpZiAoZmFzdGNjICYmICFhdGg5a19od19jaGVja19hbGl2ZShhaCkpCisJaWYgKGZhc3RjYyAmJiAoYWgtPmNoaXBfZnVsbHNsZWVwIHx8CisJICAgICFhdGg5a19od19jaGVja19hbGl2ZShhaCkpKQogCQlmYXN0Y2MgPSBmYWxzZTsKIAogCWlmICghYXRoX3ByZXBhcmVfcmVzZXQoc2MsIHJldHJ5X3R4LCBmbHVzaCkpCkBAIC01NjEsNyArNTYyLDYgQEAKIAkvKiBMb25nIGNhbGlicmF0aW9uIHJ1bnMgaW5kZXBlbmRlbnRseSBvZiBzaG9ydCBjYWxpYnJhdGlvbi4gKi8KIAlpZiAoKHRpbWVzdGFtcCAtIGNvbW1vbi0+YW5pLmxvbmdjYWxfdGltZXIpID49IGxvbmdfY2FsX2ludGVydmFsKSB7CiAJCWxvbmdjYWwgPSB0cnVlOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJsb25nY2FsIEAlbHVcbiIsIGppZmZpZXMpOwogCQljb21tb24tPmFuaS5sb25nY2FsX3RpbWVyID0gdGltZXN0YW1wOwogCX0KIApAQCAtNTY5LDggKzU2OSw2IEBACiAJaWYgKCFjb21tb24tPmFuaS5jYWxkb25lKSB7CiAJCWlmICgodGltZXN0YW1wIC0gY29tbW9uLT5hbmkuc2hvcnRjYWxfdGltZXIpID49IHNob3J0X2NhbF9pbnRlcnZhbCkgewogCQkJc2hvcnRjYWwgPSB0cnVlOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkJCSJzaG9ydGNhbCBAJWx1XG4iLCBqaWZmaWVzKTsKIAkJCWNvbW1vbi0+YW5pLnNob3J0Y2FsX3RpbWVyID0gdGltZXN0YW1wOwogCQkJY29tbW9uLT5hbmkucmVzZXRjYWxfdGltZXIgPSB0aW1lc3RhbXA7CiAJCX0KQEAgLTU4NCw4ICs1ODIsOSBAQAogCX0KIAogCS8qIFZlcmlmeSB3aGV0aGVyIHdlIG11c3QgY2hlY2sgQU5JICovCi0JaWYgKCh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5jaGVja2FuaV90aW1lcikgPj0KLQkgICAgIGFoLT5jb25maWcuYW5pX3BvbGxfaW50ZXJ2YWwpIHsKKwlpZiAoc2MtPnNjX2FoLT5jb25maWcuZW5hYmxlX2FuaQorCSAgICAmJiAodGltZXN0YW1wIC0gY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIpID49CisJICAgIGFoLT5jb25maWcuYW5pX3BvbGxfaW50ZXJ2YWwpIHsKIAkJYW5pZmxhZyA9IHRydWU7CiAJCWNvbW1vbi0+YW5pLmNoZWNrYW5pX3RpbWVyID0gdGltZXN0YW1wOwogCX0KQEAgLTYwNSw2ICs2MDQsMTEgQEAKIAkJCQkJCWFoLT5yeGNoYWlubWFzaywgbG9uZ2NhbCk7CiAJfQogCisJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCQkiQ2FsaWJyYXRpb24gQCVsdSBmaW5pc2hlZDogJXMgJXMgJXMsIGNhbGRvbmU6ICVzXG4iLCBqaWZmaWVzLAorCQlsb25nY2FsID8gImxvbmciIDogIiIsIHNob3J0Y2FsID8gInNob3J0IiA6ICIiLAorCQlhbmlmbGFnID8gImFuaSIgOiAiIiwgY29tbW9uLT5hbmkuY2FsZG9uZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAKIHNldF90aW1lcjoKQEAgLTY0MCw5ICs2NDQsOSBAQAogCXNwaW5fbG9jaygmc2MtPm5vZGVzX2xvY2spOwogCWxpc3RfYWRkKCZhbi0+bGlzdCwgJnNjLT5ub2Rlcyk7CiAJc3Bpbl91bmxvY2soJnNjLT5ub2Rlc19sb2NrKTsKKyNlbmRpZgogCWFuLT5zdGEgPSBzdGE7CiAJYW4tPnZpZiA9IHZpZjsKLSNlbmRpZgogCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpIHsKIAkJYXRoX3R4X25vZGVfaW5pdChzYywgYW4pOwogCQlhbi0+bWF4YW1wZHUgPSAxIDw8IChJRUVFODAyMTFfSFRfTUFYX0FNUERVX0ZBQ1RPUiArCkBAIC03NDIsNiArNzQ2LDkgQEAKIAkJaWYgKHN0YXR1cyAmIEFUSDlLX0lOVF9HRU5USU1FUikKIAkJCWF0aF9nZW5fdGltZXJfaXNyKHNjLT5zY19haCk7CiAKKwlpZiAoc3RhdHVzICYgQVRIOUtfSU5UX01DSSkKKwkJYXRoX21jaV9pbnRyKHNjKTsKKwogb3V0OgogCS8qIHJlLWVuYWJsZSBoYXJkd2FyZSBpbnRlcnJ1cHQgKi8KIAlhdGg5a19od19lbmFibGVfaW50ZXJydXB0cyhhaCk7CkBAIC03NjQsNyArNzcxLDggQEAKIAkJQVRIOUtfSU5UX0JNSVNTIHwJCVwKIAkJQVRIOUtfSU5UX0NTVCB8CQkJXAogCQlBVEg5S19JTlRfVFNGT09SIHwJCVwKLQkJQVRIOUtfSU5UX0dFTlRJTUVSKQorCQlBVEg5S19JTlRfR0VOVElNRVIgfAkJXAorCQlBVEg5S19JTlRfTUNJKQogCiAJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBkZXY7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CkBAIC04ODIsODIgKzg5MCw2IEBACiAjdW5kZWYgU0NIRURfSU5UUgogfQogCi1zdGF0aWMgdm9pZCBhdGhfcmFkaW9fZW5hYmxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBody0+Y29uZi5jaGFubmVsOwotCWludCByOwotCi0JYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0JYXRvbWljX3NldCgmYWgtPmludHJfcmVmX2NudCwgLTEpOwotCi0JYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCBmYWxzZSk7Ci0KLQlpZiAoIWFoLT5jdXJjaGFuKQotCQlhaC0+Y3VyY2hhbiA9IGF0aDlrX2Ntbl9nZXRfY3VyY2hhbm5lbChzYy0+aHcsIGFoKTsKLQotCXIgPSBhdGg5a19od19yZXNldChhaCwgYWgtPmN1cmNoYW4sIGFoLT5jYWxkYXRhLCBmYWxzZSk7Ci0JaWYgKHIpIHsKLQkJYXRoX2Vycihjb21tb24sCi0JCQkiVW5hYmxlIHRvIHJlc2V0IGNoYW5uZWwgKCV1IE1IeiksIHJlc2V0IHN0YXR1cyAlZFxuIiwKLQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxLCByKTsKLQl9Ci0KLQlhdGhfY29tcGxldGVfcmVzZXQoc2MsIHRydWUpOwotCi0JLyogRW5hYmxlIExFRCAqLwotCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGFoLT5sZWRfcGluLAotCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOwotCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgMCk7Ci0KLQlzcGluX3VubG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKLQotCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwotfQotCi12b2lkIGF0aF9yYWRpb19kaXNhYmxlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBody0+Y29uZi5jaGFubmVsOwotCWludCByOwotCi0JYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQotCWF0aF9jYW5jZWxfd29yayhzYyk7Ci0KLQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0KLQkvKgotCSAqIEtlZXAgdGhlIExFRCBvbiB3aGVuIHRoZSByYWRpbyBpcyBkaXNhYmxlZAotCSAqIGR1cmluZyBpZGxlIHVuYXNzb2NpYXRlZCBzdGF0ZS4KLQkgKi8KLQlpZiAoIXNjLT5wc19pZGxlKSB7Ci0JCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgMSk7Ci0JCWF0aDlrX2h3X2NmZ19ncGlvX2lucHV0KGFoLCBhaC0+bGVkX3Bpbik7Ci0JfQotCi0JYXRoX3ByZXBhcmVfcmVzZXQoc2MsIGZhbHNlLCB0cnVlKTsKLQotCWlmICghYWgtPmN1cmNoYW4pCi0JCWFoLT5jdXJjaGFuID0gYXRoOWtfY21uX2dldF9jdXJjaGFubmVsKGh3LCBhaCk7Ci0KLQlyID0gYXRoOWtfaHdfcmVzZXQoYWgsIGFoLT5jdXJjaGFuLCBhaC0+Y2FsZGF0YSwgZmFsc2UpOwotCWlmIChyKSB7Ci0JCWF0aF9lcnIoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksCi0JCQkiVW5hYmxlIHRvIHJlc2V0IGNoYW5uZWwgKCV1IE1IeiksIHJlc2V0IHN0YXR1cyAlZFxuIiwKLQkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxLCByKTsKLQl9Ci0KLQlhdGg5a19od19waHlfZGlzYWJsZShhaCk7Ci0KLQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIHRydWUpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0JYXRoOWtfcHNfcmVzdG9yZShzYyk7Ci19Ci0KIHN0YXRpYyBpbnQgYXRoX3Jlc2V0KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBib29sIHJldHJ5X3R4KQogewogCWludCByOwpAQCAtMTA5Myw2ICsxMDI1LDkgQEAKIAkgKiBhbmQgdGhlbiBzZXR1cCBvZiB0aGUgaW50ZXJydXB0IG1hc2suCiAJICovCiAJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCisJYXRvbWljX3NldCgmYWgtPmludHJfcmVmX2NudCwgLTEpOworCiAJciA9IGF0aDlrX2h3X3Jlc2V0KGFoLCBpbml0X2NoYW5uZWwsIGFoLT5jYWxkYXRhLCBmYWxzZSk7CiAJaWYgKHIpIHsKIAkJYXRoX2Vycihjb21tb24sCkBAIC0xMTE5LDYgKzEwNTQsOSBAQAogCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0hUKQogCQlhaC0+aW1hc2sgfD0gQVRIOUtfSU5UX0NTVDsKIAorCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkKKwkJYWgtPmltYXNrIHw9IEFUSDlLX0lOVF9NQ0k7CisKIAlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX0lOVkFMSUQ7CiAJc2MtPnNjX2FoLT5pc19tb25pdG9yaW5nID0gZmFsc2U7CiAKQEAgLTExMzEsNiArMTA2OSwxOCBAQAogCQlnb3RvIG11dGV4X3VubG9jazsKIAl9CiAKKwlpZiAoYWgtPmxlZF9waW4gPj0gMCkgeworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCBhaC0+bGVkX3BpbiwKKwkJCQkgICAgQVJfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCk7CisJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgMCk7CisJfQorCisJLyoKKwkgKiBSZXNldCBrZXkgY2FjaGUgdG8gc2FuZSBkZWZhdWx0cyAoYWxsIGVudHJpZXMgY2xlYXJlZCkgaW5zdGVhZCBvZgorCSAqIHNlbWktcmFuZG9tIHZhbHVlcyBhZnRlciBzdXNwZW5kL3Jlc3VtZS4KKwkgKi8KKwlhdGg5a19jbW5faW5pdF9jcnlwdG8oc2MtPnNjX2FoKTsKKwogCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwogCiAJaWYgKChhaC0+YnRjb2V4X2h3LnNjaGVtZSAhPSBBVEhfQlRDT0VYX0NGR19OT05FKSAmJgpAQCAtMTE3Niw2ICsxMTI2LDEzIEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIENhbm5vdCB0eCB3aGlsZSB0aGUgaGFyZHdhcmUgaXMgaW4gZnVsbCBzbGVlcCwgaXQgZmlyc3QgbmVlZHMgYSBmdWxsCisJICogY2hpcCByZXNldCB0byByZWNvdmVyIGZyb20gdGhhdAorCSAqLworCWlmICh1bmxpa2VseShzYy0+c2NfYWgtPnBvd2VyX21vZGUgPT0gQVRIOUtfUE1fRlVMTF9TTEVFUCkpCisJCWdvdG8gZXhpdDsKKwogCWlmICh1bmxpa2VseShzYy0+c2NfYWgtPnBvd2VyX21vZGUgIT0gQVRIOUtfUE1fQVdBS0UpKSB7CiAJCS8qCiAJCSAqIFdlIGFyZSB1c2luZyBQUy1Qb2xsIGFuZCBtYWM4MDIxMSBjYW4gcmVxdWVzdCBUWCB3aGlsZSBpbgpAQCAtMTIyMiw2ICsxMTc5LDcgQEAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCWJvb2wgcHJldl9pZGxlOwogCiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIApAQCAtMTI1MiwyMSArMTIxMCw2IEBACiAJICogYmVmb3JlIHNldHRpbmcgdGhlIGludmFsaWQgZmxhZy4gKi8KIAlhdGg5a19od19kaXNhYmxlX2ludGVycnVwdHMoYWgpOwogCi0JaWYgKCEoc2MtPnNjX2ZsYWdzICYgU0NfT1BfSU5WQUxJRCkpIHsKLQkJYXRoX2RyYWluX2FsbF90eHEoc2MsIGZhbHNlKTsKLQkJYXRoX3N0b3ByZWN2KHNjKTsKLQkJYXRoOWtfaHdfcGh5X2Rpc2FibGUoYWgpOwotCX0gZWxzZQotCQlzYy0+cngucnhsaW5rID0gTlVMTDsKLQotCWlmIChzYy0+cnguZnJhZykgewotCQlkZXZfa2ZyZWVfc2tiX2FueShzYy0+cnguZnJhZyk7Ci0JCXNjLT5yeC5mcmFnID0gTlVMTDsKLQl9Ci0KLQkvKiBkaXNhYmxlIEhBTCBhbmQgcHV0IGgvdyB0byBzbGVlcCAqLwotCWF0aDlrX2h3X2Rpc2FibGUoYWgpOwotCiAJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAKIAkvKiB3ZSBjYW4gbm93IHN5bmMgaXJxIGFuZCBraWxsIGFueSBydW5uaW5nIHRhc2tsZXRzLCBzaW5jZSB3ZSBhbHJlYWR5CkBAIC0xMjc1LDEyICsxMjE4LDM3IEBACiAJdGFza2xldF9raWxsKCZzYy0+aW50cl90cSk7CiAJdGFza2xldF9raWxsKCZzYy0+YmNvbl90YXNrbGV0KTsKIAorCXByZXZfaWRsZSA9IHNjLT5wc19pZGxlOworCXNjLT5wc19pZGxlID0gdHJ1ZTsKKworCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKworCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CisJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgMSk7CisJCWF0aDlrX2h3X2NmZ19ncGlvX2lucHV0KGFoLCBhaC0+bGVkX3Bpbik7CisJfQorCisJYXRoX3ByZXBhcmVfcmVzZXQoc2MsIGZhbHNlLCB0cnVlKTsKKworCWlmIChzYy0+cnguZnJhZykgeworCQlkZXZfa2ZyZWVfc2tiX2FueShzYy0+cnguZnJhZyk7CisJCXNjLT5yeC5mcmFnID0gTlVMTDsKKwl9CisKKwlpZiAoIWFoLT5jdXJjaGFuKQorCQlhaC0+Y3VyY2hhbiA9IGF0aDlrX2Ntbl9nZXRfY3VyY2hhbm5lbChodywgYWgpOworCisJYXRoOWtfaHdfcmVzZXQoYWgsIGFoLT5jdXJjaGFuLCBhaC0+Y2FsZGF0YSwgZmFsc2UpOworCWF0aDlrX2h3X3BoeV9kaXNhYmxlKGFoKTsKKworCWF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShhaCwgdHJ1ZSk7CisKKwlzcGluX3VubG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKwogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogCi0Jc2MtPnBzX2lkbGUgPSB0cnVlOwotCWF0aF9yYWRpb19kaXNhYmxlKHNjLCBodyk7Ci0KIAlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfSU5WQUxJRDsKKwlzYy0+cHNfaWRsZSA9IHByZXZfaWRsZTsKIAogCW11dGV4X3VubG9jaygmc2MtPm11dGV4KTsKIApAQCAtMTYyMCw4ICsxNTg4LDggQEAKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0JYm9vbCBkaXNhYmxlX3JhZGlvID0gZmFsc2U7CiAKKwlhdGg5a19wc193YWtldXAoc2MpOwogCW11dGV4X2xvY2soJnNjLT5tdXRleCk7CiAKIAkvKgpAQCAtMTYzMiwxMyArMTYwMCw4IEBACiAJICovCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkgewogCQlzYy0+cHNfaWRsZSA9ICEhKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSk7Ci0JCWlmICghc2MtPnBzX2lkbGUpIHsKLQkJCWF0aF9yYWRpb19lbmFibGUoc2MsIGh3KTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCQkibm90LWlkbGU6IGVuYWJsaW5nIHJhZGlvXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWRpc2FibGVfcmFkaW8gPSB0cnVlOwotCQl9CisJCWlmIChzYy0+cHNfaWRsZSkKKwkJCWF0aF9jYW5jZWxfd29yayhzYyk7CiAJfQogCiAJLyoKQEAgLTE3NDUsMTggKzE3MDgsMTIgQEAKIAkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAogCQkJIlNldCBwb3dlcjogJWRcbiIsIGNvbmYtPnBvd2VyX2xldmVsKTsKIAkJc2MtPmNvbmZpZy50eHBvd2xpbWl0ID0gMiAqIGNvbmYtPnBvd2VyX2xldmVsOwotCQlhdGg5a19wc193YWtldXAoc2MpOwogCQlhdGg5a19jbW5fdXBkYXRlX3R4cG93KGFoLCBzYy0+Y3VydHhwb3csCiAJCQkJICAgICAgIHNjLT5jb25maWcudHhwb3dsaW1pdCwgJnNjLT5jdXJ0eHBvdyk7Ci0JCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwotCX0KLQotCWlmIChkaXNhYmxlX3JhZGlvKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywgImlkbGU6IGRpc2FibGluZyByYWRpb1xuIik7Ci0JCWF0aF9yYWRpb19kaXNhYmxlKHNjLCBodyk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOworCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTE2LDcgKzE4NzMsOCBAQAogCWlmIChhdGg5a19tb2RwYXJhbV9ub2h3Y3J5cHQpCiAJCXJldHVybiAtRU5PU1BDOwogCi0JaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgorCWlmICgodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8CisJICAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkgJiYKIAkgICAgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAgfHwKIAkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApICYmCiAJICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpIHsKQEAgLTIzMjQsOSArMjI4Miw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZHJvcCkKLQkJdGltZW91dCA9IDE7Ci0KIAlmb3IgKGogPSAwOyBqIDwgdGltZW91dDsgaisrKSB7CiAJCWJvb2wgbnBlbmQgPSBmYWxzZTsKIApAQCAtMjM0NCwyMSArMjI5OSwyMiBAQAogCQl9CiAKIAkJaWYgKCFucGVuZCkKLQkJICAgIGdvdG8gb3V0OworCQkgICAgYnJlYWs7CiAJfQogCi0JYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0JZHJhaW5fdHhxID0gYXRoX2RyYWluX2FsbF90eHEoc2MsIGZhbHNlKTsKLQlzcGluX3VubG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKwlpZiAoZHJvcCkgeworCQlhdGg5a19wc193YWtldXAoc2MpOworCQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CisJCWRyYWluX3R4cSA9IGF0aF9kcmFpbl9hbGxfdHhxKHNjLCBmYWxzZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwogCi0JaWYgKCFkcmFpbl90eHEpCi0JCWF0aF9yZXNldChzYywgZmFsc2UpOworCQlpZiAoIWRyYWluX3R4cSkKKwkJCWF0aF9yZXNldChzYywgZmFsc2UpOwogCi0JYXRoOWtfcHNfcmVzdG9yZShzYyk7Ci0JaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKKwkJYXRoOWtfcHNfcmVzdG9yZShzYyk7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisJfQogCi1vdXQ6CiAJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayhodywgJnNjLT50eF9jb21wbGV0ZV93b3JrLCAwKTsKIAltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmMKaW5kZXggMGZiYjE0MS4uNjkxYmY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuYwpAQCAtMTQsNiArMTQsOSBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKICNpbmNsdWRlICJhdGg5ay5oIgogI2luY2x1ZGUgIm1jaS5oIgogCkBAIC0xODEsOCArMTg0LDU4IEBACiAJYXRoOWtfYnRjb2V4X3RpbWVyX3Jlc3VtZShzYyk7CiB9CiAKLXZvaWQgYXRoX21jaV9wcm9jZXNzX3Byb2ZpbGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCi0JCQkgICAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbykKKworc3RhdGljIHZvaWQgYXRoX21jaV9jYWxfbXNnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1OCBvcGNvZGUsIHU4ICpyeF9wYXlsb2FkKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX1JFUToKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgcmVjZWl2ZWQgQlRfQ0FMX1JFUVxuIik7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX0FXQUtFKSB7CisJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfU0VUX0JUX0NBTF9TVEFSVCwgTlVMTCk7CisJCQlpZWVlODAyMTFfcXVldWVfd29yayhzYy0+aHcsICZzYy0+aHdfcmVzZXRfd29yayk7CisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCSJNQ0kgU3RhdGUgbWlzbWF0Y2hlczogJWRcbiIsCisJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX0RPTkU6CisKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIHJlY2VpdmVkIEJUX0NBTF9ET05FXG4iKTsKKworCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSA9PSBNQ0lfQlRfQ0FMKQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGVycm9yIGlsbGVnYWwhXG4iKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIEJUIG5vdCBpbiBDQUwgc3RhdGVcbiIpOworCisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0JUX0NBTF9HUkFOVDoKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgcmVjZWl2ZWQgQlRfQ0FMX0dSQU5UXG4iKTsKKworCQkvKiBTZW5kIFdMQU5fQ0FMX0RPTkUgZm9yIG5vdyAqLworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgc2VuZCBXTEFOX0NBTF9ET05FXG4iKTsKKwkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwgTUNJX0dQTV9XTEFOX0NBTF9ET05FKTsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2Uoc2MtPnNjX2FoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLAorCQkJCQkxNiwgZmFsc2UsIHRydWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBVbmtub3duIEdQTSBDQUwgbWVzc2FnZVxuIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9wcm9jZXNzX3Byb2ZpbGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkJICAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZzYy0+YnRjb2V4OwpAQCAtMjA4LDggKzI2MSw4IEBACiAJYXRoX21jaV91cGRhdGVfc2NoZW1lKHNjKTsKIH0KIAotdm9pZCBhdGhfbWNpX3Byb2Nlc3Nfc3RhdHVzKHN0cnVjdCBhdGhfc29mdGMgKnNjLAotCQkJICAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzICpzdGF0dXMpCitzdGF0aWMgdm9pZCBhdGhfbWNpX3Byb2Nlc3Nfc3RhdHVzKHN0cnVjdCBhdGhfc29mdGMgKnNjLAorCQkJCSAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzICpzdGF0dXMpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwogCXN0cnVjdCBhdGhfYnRjb2V4ICpidGNvZXggPSAmc2MtPmJ0Y29leDsKQEAgLTI1MiwzICszMDUsMzY5IEBACiAJaWYgKG9sZF9udW1fbWdtdCAhPSBtY2ktPm51bV9tZ210KQogCQlhdGhfbWNpX3VwZGF0ZV9zY2hlbWUoc2MpOwogfQorCitzdGF0aWMgdm9pZCBhdGhfbWNpX21zZyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTggb3Bjb2RlLCB1OCAqcnhfcGF5bG9hZCkKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gcHJvZmlsZV9pbmZvOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzIHByb2ZpbGVfc3RhdHVzOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwl1MzIgdmVyc2lvbjsKKwl1OCBtYWpvcjsKKwl1OCBtaW5vcjsKKwl1MzIgc2VxX251bTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9WRVJTSU9OX1FVRVJZOgorCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggVmVyc2lvbiBRdWVyeS5cbiIpOworCQl2ZXJzaW9uID0gYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQlNQ0lfU1RBVEVfU0VORF9XTEFOX0NPRVhfVkVSU0lPTiwgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUmVzcG9uc2UuXG4iKTsKKwkJbWFqb3IgPSAqKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9NQUpPUl9WRVJTSU9OKTsKKwkJbWlub3IgPSAqKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9NSU5PUl9WRVJTSU9OKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBCVCBDb2V4IHZlcnNpb246ICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOworCQl2ZXJzaW9uID0gKG1ham9yIDw8IDgpICsgbWlub3I7CisJCXZlcnNpb24gPSBhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJICBNQ0lfU1RBVEVfU0VUX0JUX0NPRVhfVkVSU0lPTiwgJnZlcnNpb24pOworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1NUQVRVU19RVUVSWToKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIFN0YXR1cyBRdWVyeSA9IDB4JTAyeC5cbiIsCisJCQkqKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9XTEFOX0JJVE1BUCkpOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQlNQ0lfU1RBVEVfU0VORF9XTEFOX0NIQU5ORUxTLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9QUk9GSUxFX0lORk86CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ29leCBCVCBwcm9maWxlIGluZm9cbiIpOworCQltZW1jcHkoJnByb2ZpbGVfaW5mbywKKwkJICAgICAgIChyeF9wYXlsb2FkICsgTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9UWVBFKSwgMTApOworCisJCWlmICgocHJvZmlsZV9pbmZvLnR5cGUgPT0gTUNJX0dQTV9DT0VYX1BST0ZJTEVfVU5LTk9XTikKKwkJICAgIHx8IChwcm9maWxlX2luZm8udHlwZSA+PQorCQkJCQkgICAgTUNJX0dQTV9DT0VYX1BST0ZJTEVfTUFYKSkgeworCisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJImlsbGVnYWwgcHJvZmlsZSB0eXBlID0gJWQsIgorCQkJCSJzdGF0ZSA9ICVkXG4iLCBwcm9maWxlX2luZm8udHlwZSwKKwkJCQlwcm9maWxlX2luZm8uc3RhcnQpOworCQkJYnJlYWs7CisJCX0KKworCQlhdGhfbWNpX3Byb2Nlc3NfcHJvZmlsZShzYywgJnByb2ZpbGVfaW5mbyk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURToKKwkJcHJvZmlsZV9zdGF0dXMuaXNfbGluayA9ICoocnhfcGF5bG9hZCArCisJCQkJCSAgIE1DSV9HUE1fQ09FWF9CX1NUQVRVU19UWVBFKTsKKwkJcHJvZmlsZV9zdGF0dXMuY29ubl9oYW5kbGUgPSAqKHJ4X3BheWxvYWQgKworCQkJCQkgICAgICAgTUNJX0dQTV9DT0VYX0JfU1RBVFVTX0xJTktJRCk7CisJCXByb2ZpbGVfc3RhdHVzLmlzX2NyaXRpY2FsID0gKihyeF9wYXlsb2FkICsKKwkJCQkJICAgICAgIE1DSV9HUE1fQ09FWF9CX1NUQVRVU19TVEFURSk7CisKKwkJc2VxX251bSA9ICooKHUzMiAqKShyeF9wYXlsb2FkICsgMTIpKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJIk1DSSBSZWN2IEdQTSBDT0VYIEJUX1N0YXR1c19VcGRhdGU6ICIKKwkJCSJpc19saW5rPSVkLCBsaW5rSWQ9JWQsIHN0YXRlPSVkLCBTRVE9JWRcbiIsCisJCQlwcm9maWxlX3N0YXR1cy5pc19saW5rLCBwcm9maWxlX3N0YXR1cy5jb25uX2hhbmRsZSwKKwkJCXByb2ZpbGVfc3RhdHVzLmlzX2NyaXRpY2FsLCBzZXFfbnVtKTsKKworCQlhdGhfbWNpX3Byb2Nlc3Nfc3RhdHVzKHNjLCAmcHJvZmlsZV9zdGF0dXMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJIk1DSSBVbmtub3duIEdQTSBDT0VYIG1lc3NhZ2UgPSAweCUwMnhcbiIsIG9wY29kZSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhdGhfbWNpX2J1Zl9hbGxvYyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9tY2lfYnVmICpidWYpCit7CisJaW50IGVycm9yID0gMDsKKworCWJ1Zi0+YmZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChzYy0+ZGV2LCBidWYtPmJmX2xlbiwKKwkJCQkJICAmYnVmLT5iZl9wYWRkciwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYnVmLT5iZl9hZGRyID09IE5VTEwpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGF0aF9tY2lfYnVmX2ZyZWUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfbWNpX2J1ZiAqYnVmKQoreworCWlmIChidWYtPmJmX2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoc2MtPmRldiwgYnVmLT5iZl9sZW4sIGJ1Zi0+YmZfYWRkciwKKwkJCQkJCQlidWYtPmJmX3BhZGRyKTsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwl9Cit9CisKK2ludCBhdGhfbWNpX3NldHVwKHN0cnVjdCBhdGhfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwlzdHJ1Y3QgYXRoX21jaV9jb2V4ICptY2kgPSAmc2MtPm1jaV9jb2V4OworCWludCBlcnJvciA9IDA7CisKKwltY2ktPnNjaGVkX2J1Zi5iZl9sZW4gPSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFICsgQVRIX01DSV9HUE1fQlVGX1NJWkU7CisKKwlpZiAoYXRoX21jaV9idWZfYWxsb2Moc2MsICZtY2ktPnNjaGVkX2J1ZikpIHsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRkFUQUwsICJNQ0kgYnVmZmVyIGFsbG9jIGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW1jaS0+c2NoZWRfYnVmLmJmX2xlbiA9IEFUSF9NQ0lfU0NIRURfQlVGX1NJWkU7CisKKwltZW1zZXQobWNpLT5zY2hlZF9idWYuYmZfYWRkciwgTUNJX0dQTV9SU1ZEX1BBVFRFUk4sCisJCQkJCQltY2ktPnNjaGVkX2J1Zi5iZl9sZW4pOworCisJbWNpLT5ncG1fYnVmLmJmX2xlbiA9IEFUSF9NQ0lfR1BNX0JVRl9TSVpFOworCW1jaS0+Z3BtX2J1Zi5iZl9hZGRyID0gKHU4ICopbWNpLT5zY2hlZF9idWYuYmZfYWRkciArCisJCQkJCQkJbWNpLT5zY2hlZF9idWYuYmZfbGVuOworCW1jaS0+Z3BtX2J1Zi5iZl9wYWRkciA9IG1jaS0+c2NoZWRfYnVmLmJmX3BhZGRyICsgbWNpLT5zY2hlZF9idWYuYmZfbGVuOworCisJLyogaW5pdGlhbGl6ZSB0aGUgYnVmZmVyICovCisJbWVtc2V0KG1jaS0+Z3BtX2J1Zi5iZl9hZGRyLCBNQ0lfR1BNX1JTVkRfUEFUVEVSTiwgbWNpLT5ncG1fYnVmLmJmX2xlbik7CisKKwlhcjkwMDNfbWNpX3NldHVwKHNjLT5zY19haCwgbWNpLT5ncG1fYnVmLmJmX3BhZGRyLAorCQkJIG1jaS0+Z3BtX2J1Zi5iZl9hZGRyLCAobWNpLT5ncG1fYnVmLmJmX2xlbiA+PiA0KSwKKwkJCSBtY2ktPnNjaGVkX2J1Zi5iZl9wYWRkcik7CitmYWlsOgorCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBhdGhfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CisJc3RydWN0IGF0aF9tY2lfY29leCAqbWNpID0gJnNjLT5tY2lfY29leDsKKworCS8qCisJICogYm90aCBzY2hlZHVsZSBhbmQgZ3BtIGJ1ZmZlcnMgd2lsbCBiZSByZWxlYXNlZAorCSAqLworCWF0aF9tY2lfYnVmX2ZyZWUoc2MsICZtY2ktPnNjaGVkX2J1Zik7CisJYXI5MDAzX21jaV9jbGVhbnVwKGFoKTsKK30KKwordm9pZCBhdGhfbWNpX2ludHIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9tY2lfY29leCAqbWNpID0gJnNjLT5tY2lfY29leDsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwl1MzIgbWNpX2ludCwgbWNpX2ludF9yeG1zZzsKKwl1MzIgb2Zmc2V0LCBzdWJ0eXBlLCBvcGNvZGU7CisJdTMyICpwZ3BtOworCXUzMiBtb3JlX2RhdGEgPSBNQ0lfR1BNX01PUkU7CisJYm9vbCBza2lwX2dwbSA9IGZhbHNlOworCisJYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KHNjLT5zY19haCwgJm1jaV9pbnQsICZtY2lfaW50X3J4bXNnKTsKKworCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfRU5BQkxFLCBOVUxMKSA9PSAwKSB7CisKKwkJYXI5MDAzX21jaV9zdGF0ZShzYy0+c2NfYWgsIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQsIE5VTEwpOworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIGludGVycnVwdCBidXQgTUNJIGRpc2FibGVkXG4iKTsKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkiTUNJIGludGVycnVwdDogaW50ciA9IDB4JXgsIGludHJfcnhtc2cgPSAweCV4XG4iLAorCQkJbWNpX2ludCwgbWNpX2ludF9yeG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKSB7CisJCXUzMiBwYXlsb2FkWzRdID0geyAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCQkJCSAgIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmMDB9OworCisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgUkVNT1RFX1JFU0VUIGFuZCBTWVNfV0FLSU5HIHVzZWQgdG8gc2VudAorCQkgKiBvbmx5IHdoZW4gQlQgd2FrZSB1cC4gTm93IHRoZXkgYXJlIGFsd2F5cyBzZW50LCBhcyBhCisJCSAqIHJlY292ZXJ5IG1ldGhvZCB0byByZXNldCBCVCBNQ0kncyBSWCBhbGlnbm1lbnQuCisJCSAqLworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgaW50ZXJydXB0IHNlbmQgUkVNT1RFX1JFU0VUXG4iKTsKKworCQlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1JFTU9URV9SRVNFVCwgMCwKKwkJCQkJcGF5bG9hZCwgMTYsIHRydWUsIGZhbHNlKTsKKwkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIGludGVycnVwdCBzZW5kIFNZU19XQUtJTkdcbiIpOworCQlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX1NZU19XQUtJTkcsIDAsCisJCQkJCU5VTEwsIDAsIHRydWUsIGZhbHNlKTsKKworCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRTsKKwkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFU0VUX1JFUV9XQUtFLCBOVUxMKTsKKworCQkvKgorCQkgKiBhbHdheXMgZG8gdGhpcyBmb3IgcmVjb3ZlcnkgYW5kIDJHLzVHIHRvZ2dsaW5nIGFuZCBMTkFfVFJBTlMKKwkJICovCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwgIk1DSSBTZXQgQlQgc3RhdGUgdG8gQVdBS0UuXG4iKTsKKwkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1NFVF9CVF9BV0FLRSwgTlVMTCk7CisJfQorCisJLyogUHJvY2Vzc2luZyBTWVNfV0FLSU5HL1NZU19TTEVFUElORyAqLworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORykgeworCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HOworCisJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfQlQsIE5VTEwpID09IE1DSV9CVF9TTEVFUCkgeworCisJCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwgTlVMTCkKKwkJCQkJPT0gTUNJX0JUX1NMRUVQKQorCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBCVCBzdGF5cyBpbiBzbGVlcCBtb2RlXG4iKTsKKwkJCWVsc2UgeworCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkJIk1DSSBTZXQgQlQgc3RhdGUgdG8gQVdBS0UuXG4iKTsKKwkJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCQkJIE1DSV9TVEFURV9TRVRfQlRfQVdBS0UsIE5VTEwpOworCQkJfQorCQl9IGVsc2UKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIEJUIHN0YXlzIGluIEFXQUtFIG1vZGUuXG4iKTsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORykgeworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORzsKKworCQlpZiAoYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSA9PSBNQ0lfQlRfQVdBS0UpIHsKKworCQkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9SRU1PVEVfU0xFRVAsIE5VTEwpCisJCQkJCT09IE1DSV9CVF9BV0FLRSkKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgQlQgc3RheXMgaW4gQVdBS0UgbW9kZS5cbiIpOworCQkJZWxzZSB7CisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIFNldEJUIHN0YXRlIHRvIFNMRUVQXG4iKTsKKwkJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfU0VUX0JUX1NMRUVQLAorCQkJCQkJIE5VTEwpOworCQkJfQorCQl9IGVsc2UKKwkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCQkiTUNJIEJUIHN0YXlzIGluIFNMRUVQIG1vZGVcbiIpOworCX0KKworCWlmICgobWNpX2ludCAmIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIpIHx8CisJICAgIChtY2lfaW50ICYgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCkpIHsKKworCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgUlggYnJva2VuLCBza2lwIEdQTSBtc2dzXG4iKTsKKwkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFQ09WRVJfUlgsIE5VTEwpOworCQlza2lwX2dwbSA9IHRydWU7CisJfQorCisJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8pIHsKKworCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk87CisJCW9mZnNldCA9IGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9MQVNUX1NDSERfTVNHX09GRlNFVCwKKwkJCQkJICBOVUxMKTsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSkgeworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTTsKKworCQl3aGlsZSAobW9yZV9kYXRhID09IE1DSV9HUE1fTU9SRSkgeworCisJCQlwZ3BtID0gbWNpLT5ncG1fYnVmLmJmX2FkZHI7CisJCQlvZmZzZXQgPSBhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCQlNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VULCAmbW9yZV9kYXRhKTsKKworCQkJaWYgKG9mZnNldCA9PSBNQ0lfR1BNX0lOVkFMSUQpCisJCQkJYnJlYWs7CisKKwkJCXBncG0gKz0gKG9mZnNldCA+PiAyKTsKKworCQkJLyoKKwkJCSAqIFRoZSBmaXJzdCBkd29yZCBpcyB0aW1lci4KKwkJCSAqIFRoZSByZWFsIGRhdGEgc3RhcnRzIGZyb20gMm5kIGR3b3JkLgorCQkJICovCisKKwkJCXN1YnR5cGUgPSBNQ0lfR1BNX1RZUEUocGdwbSk7CisJCQlvcGNvZGUgPSBNQ0lfR1BNX09QQ09ERShwZ3BtKTsKKworCQkJaWYgKCFza2lwX2dwbSkgeworCisJCQkJaWYgKE1DSV9HUE1fSVNfQ0FMX1RZUEUoc3VidHlwZSkpCisJCQkJCWF0aF9tY2lfY2FsX21zZyhzYywgc3VidHlwZSwKKwkJCQkJCQkodTggKikgcGdwbSk7CisJCQkJZWxzZSB7CisJCQkJCXN3aXRjaCAoc3VidHlwZSkgeworCQkJCQljYXNlIE1DSV9HUE1fQ09FWF9BR0VOVDoKKwkJCQkJCWF0aF9tY2lfbXNnKHNjLCBvcGNvZGUsCisJCQkJCQkJICAgICh1OCAqKSBwZ3BtKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlNQ0lfR1BNX1JFQ1lDTEUocGdwbSk7CisJCX0KKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX01BU0spIHsKKworCQlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MKQorCQkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0w7CisKKwkJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTykgeworCQkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk87CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgTE5BX0lORk9cbiIpOworCQl9CisKKwkJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8pIHsKKworCQkJaW50IHZhbHVlX2RibSA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCU1DSV9TVEFURV9DT05UX1JTU0lfUE9XRVIsIE5VTEwpOworCisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk87CisKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfQ09OVF9UWFJYLCBOVUxMKSkKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksCisJCQkJCSJNQ0kgQ09OVF9JTkZPOiAiCisJCQkJCSIodHgpIHByaSA9ICVkLCBwd3IgPSAlZCBkQm1cbiIsCisJCQkJCWFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCQlNQ0lfU1RBVEVfQ09OVF9QUklPUklUWSwgTlVMTCksCisJCQkJCXZhbHVlX2RibSk7CisJCQllbHNlCisJCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLAorCQkJCQkiTUNJIENPTlRfSU5GTzoiCisJCQkJCSIocngpIHByaSA9ICVkLHB3ciA9ICVkIGRCbVxuIiwKKwkJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQkJCU1DSV9TVEFURV9DT05UX1BSSU9SSVRZLCBOVUxMKSwKKwkJCQkJdmFsdWVfZGJtKTsKKwkJfQorCisJCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLKSB7CisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0s7CisJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19NQ0ksICJNQ0kgQ09OVF9OQUNLXG4iKTsKKwkJfQorCisJCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1QpIHsKKwkJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUOworCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfTUNJLCAiTUNJIENPTlRfUlNUXG4iKTsKKwkJfQorCX0KKworCWlmICgobWNpX2ludCAmIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIpIHx8CisJICAgIChtY2lfaW50ICYgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCkpCisJCW1jaV9pbnQgJj0gfihBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSIHwKKwkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCk7CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIDB4ZmZmZmZmZmUpCisJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX01DSSwKKwkJCSJNQ0kgbm90IHByb2Nlc3NlZCBtY2lfaW50X3J4bXNnID0gMHgleFxuIiwKKwkJCW1jaV9pbnRfcnhtc2cpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5oCmluZGV4IDk1OTBjNjEuLjI5ZTNlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmgKQEAgLTE3LDYgKzE3LDkgQEAKICNpZm5kZWYgTUNJX0gKICNkZWZpbmUgTUNJX0gKIAorI2RlZmluZSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFCQkoMTYgKiAxNikgLyogMTYgZW50cmllcywgNCBkd29yZCBlYWNoICovCisjZGVmaW5lIEFUSF9NQ0lfR1BNX01BWF9FTlRSWQkJMTYKKyNkZWZpbmUgQVRIX01DSV9HUE1fQlVGX1NJWkUJCShBVEhfTUNJX0dQTV9NQVhfRU5UUlkgKiAxNikKICNkZWZpbmUgQVRIX01DSV9ERUZfQlRfUEVSSU9ECQk0MAogI2RlZmluZSBBVEhfTUNJX0JEUl9EVVRZX0NZQ0xFCQkyMAogI2RlZmluZSBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFCQk5MApAQCAtMTEwLDkgKzExMywyMiBAQAogCXU4IG51bV9iZHI7CiB9OwogCisKK3N0cnVjdCBhdGhfbWNpX2J1ZiB7CisJdm9pZCAqYmZfYWRkcjsJCS8qIHZpcnR1YWwgYWRkciBvZiBkZXNjICovCisJZG1hX2FkZHJfdCBiZl9wYWRkcjsgICAgLyogcGh5c2ljYWwgYWRkciBvZiBidWZmZXIgKi8KKwl1MzIgYmZfbGVuOwkJLyogbGVuIG9mIGRhdGEgKi8KK307CisKK3N0cnVjdCBhdGhfbWNpX2NvZXggeworCWF0b21pY190IG1jaV9jYWxfZmxhZzsKKwlzdHJ1Y3QgYXRoX21jaV9idWYgc2NoZWRfYnVmOworCXN0cnVjdCBhdGhfbWNpX2J1ZiBncG1fYnVmOworCXUzMiBidF9jYWxfc3RhcnQ7Cit9OworCiB2b2lkIGF0aF9tY2lfZmx1c2hfcHJvZmlsZShzdHJ1Y3QgYXRoX21jaV9wcm9maWxlICptY2kpOwotdm9pZCBhdGhfbWNpX3Byb2Nlc3NfcHJvZmlsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJCSAgICAgc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvKTsKLXZvaWQgYXRoX21jaV9wcm9jZXNzX3N0YXR1cyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywKLQkJCSAgICBzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX3N0YXR1cyAqc3RhdHVzKTsKK2ludCBhdGhfbWNpX3NldHVwKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKK3ZvaWQgYXRoX21jaV9jbGVhbnVwKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKK3ZvaWQgYXRoX21jaV9pbnRyKHN0cnVjdCBhdGhfc29mdGMgKnNjKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCmluZGV4IGVkYjBiNGIuLmE0MzllZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0aDlrX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiYXRoOWsuaCIKIAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGF0aF9wY2lfaWRfdGFibGUpID0gewpAQCAtMzA2LDEyICszMDcsMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IGh3LT5wcml2OwogCi0JYXRoOWtfaHdfc2V0X2dwaW8oc2MtPnNjX2FoLCBzYy0+c2NfYWgtPmxlZF9waW4sIDEpOwotCiAJLyogVGhlIGRldmljZSBoYXMgdG8gYmUgbW92ZWQgdG8gRlVMTFNMRUVQIGZvcmNpYmx5LgogCSAqIE90aGVyd2lzZSB0aGUgY2hpcCBuZXZlciBtb3ZlZCB0byBmdWxsIHNsZWVwLAogCSAqIHdoZW4gbm8gaW50ZXJmYWNlIGlzIHVwLgogCSAqLworCWF0aDlrX2h3X2Rpc2FibGUoc2MtPnNjX2FoKTsKIAlhdGg5a19od19zZXRwb3dlcihzYy0+c2NfYWgsIEFUSDlLX1BNX0ZVTExfU0xFRVApOwogCiAJcmV0dXJuIDA7CkBAIC0zMjAsOCArMzIwLDYgQEAKIHN0YXRpYyBpbnQgYXRoX3BjaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAJdTMyIHZhbDsKIAogCS8qCkBAIC0zMzMsMjIgKzMzMSw2IEBACiAJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwogCi0JYXRoOWtfcHNfd2FrZXVwKHNjKTsKLQkvKiBFbmFibGUgTEVEICovCi0JYXRoOWtfaHdfY2ZnX291dHB1dChzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwKLQkJCSAgICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKLQlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwgMCk7Ci0KLQkgIC8qCi0JICAgKiBSZXNldCBrZXkgY2FjaGUgdG8gc2FuZSBkZWZhdWx0cyAoYWxsIGVudHJpZXMgY2xlYXJlZCkgaW5zdGVhZCBvZgotCSAgICogc2VtaS1yYW5kb20gdmFsdWVzIGFmdGVyIHN1c3BlbmQvcmVzdW1lLgotCSAgICovCi0JYXRoOWtfY21uX2luaXRfY3J5cHRvKHNjLT5zY19haCk7Ci0JYXRoOWtfcHNfcmVzdG9yZShzYyk7Ci0KLQlzYy0+cHNfaWRsZSA9IHRydWU7Ci0JYXRoX3JhZGlvX2Rpc2FibGUoc2MsIGh3KTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCmluZGV4IDg0NDgyODEuLjUyOGQ1ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImF0aDlrLmgiCiAKQEAgLTEyNzAsNyArMTI3MSw5IEBACiAKIAlhdGhfcmNfcHJpdi0+bWF4X3ZhbGlkX3JhdGUgPSBrOwogCWF0aF9yY19zb3J0X3ZhbGlkcmF0ZXMocmF0ZV90YWJsZSwgYXRoX3JjX3ByaXYpOwotCWF0aF9yY19wcml2LT5yYXRlX21heF9waHkgPSBhdGhfcmNfcHJpdi0+dmFsaWRfcmF0ZV9pbmRleFtrLTRdOworCWF0aF9yY19wcml2LT5yYXRlX21heF9waHkgPSAoayA+IDQpID8KKwkJCQkJYXRoX3JjX3ByaXYtPnZhbGlkX3JhdGVfaW5kZXhbay00XSA6CisJCQkJCWF0aF9yY19wcml2LT52YWxpZF9yYXRlX2luZGV4W2stMV07CiAJYXRoX3JjX3ByaXYtPnJhdGVfdGFibGUgPSByYXRlX3RhYmxlOwogCiAJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKaW5kZXggNjdiODYyYy4uYWQ1MTc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCkBAIC00NzUsNyArNDc1LDYgQEAKIAogCXJldHVybiByZmlsdDsKIAotI3VuZGVmIFJYX0ZJTFRFUl9QUkVTRVJWRQogfQogCiBpbnQgYXRoX3N0YXJ0cmVjdihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTE4MjQsNiArMTgyMyw3IEBACiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSAoaGRyX3NrYi0+ZGF0YSArIHJ4X3N0YXR1c19sZW4pOwogCQlyeHMgPSBJRUVFODAyMTFfU0tCX1JYQ0IoaGRyX3NrYik7CiAJCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkJICAgICFpc196ZXJvX2V0aGVyX2FkZHIoY29tbW9uLT5jdXJic3NpZCkgJiYKIAkJICAgICFjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMywgY29tbW9uLT5jdXJic3NpZCkpCiAJCQlycy5pc19teWJlYWNvbiA9IHRydWU7CiAJCWVsc2UKQEAgLTE4MzgsMTEgKzE4MzgsNiBAQAogCQlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUlhGTFVTSCkKIAkJCWdvdG8gcmVxdWV1ZV9kcm9wX2ZyYWc7CiAKLQkJcmV0dmFsID0gYXRoOWtfcnhfc2tiX3ByZXByb2Nlc3MoY29tbW9uLCBodywgaGRyLCAmcnMsCi0JCQkJCQkgcnhzLCAmZGVjcnlwdF9lcnJvcik7Ci0JCWlmIChyZXR2YWwpCi0JCQlnb3RvIHJlcXVldWVfZHJvcF9mcmFnOwotCiAJCXJ4cy0+bWFjdGltZSA9ICh0c2YgJiB+MHhmZmZmZmZmZlVMTCkgfCBycy5yc190c3RhbXA7CiAJCWlmIChycy5yc190c3RhbXAgPiB0c2ZfbG93ZXIgJiYKIAkJICAgIHVubGlrZWx5KHJzLnJzX3RzdGFtcCAtIHRzZl9sb3dlciA+IDB4MTAwMDAwMDApKQpAQCAtMTg1Miw2ICsxODQ3LDExIEBACiAJCSAgICB1bmxpa2VseSh0c2ZfbG93ZXIgLSBycy5yc190c3RhbXAgPiAweDEwMDAwMDAwKSkKIAkJCXJ4cy0+bWFjdGltZSArPSAweDEwMDAwMDAwMFVMTDsKIAorCQlyZXR2YWwgPSBhdGg5a19yeF9za2JfcHJlcHJvY2Vzcyhjb21tb24sIGh3LCBoZHIsICZycywKKwkJCQkJCSByeHMsICZkZWNyeXB0X2Vycm9yKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gcmVxdWV1ZV9kcm9wX2ZyYWc7CisKIAkJLyogRW5zdXJlIHdlIGFsd2F5cyBoYXZlIGFuIHNrYiB0byByZXF1ZXVlIG9uY2Ugd2UgYXJlIGRvbmUKIAkJICogcHJvY2Vzc2luZyB0aGUgY3VycmVudCBidWZmZXIncyBza2IgKi8KIAkJcmVxdWV1ZV9za2IgPSBhdGhfcnhidWZfYWxsb2MoY29tbW9uLCBjb21tb24tPnJ4X2J1ZnNpemUsIEdGUF9BVE9NSUMpOwpAQCAtMTkyMywxNSArMTkyMywyMCBAQAogCQkJc2tiID0gaGRyX3NrYjsKIAkJfQogCi0JCS8qCi0JCSAqIGNoYW5nZSB0aGUgZGVmYXVsdCByeCBhbnRlbm5hIGlmIHJ4IGRpdmVyc2l0eSBjaG9vc2VzIHRoZQotCQkgKiBvdGhlciBhbnRlbm5hIDMgdGltZXMgaW4gYSByb3cuCi0JCSAqLwotCQlpZiAoc2MtPnJ4LmRlZmFudCAhPSBycy5yc19hbnRlbm5hKSB7Ci0JCQlpZiAoKytzYy0+cngucnhvdGhlcmFudCA+PSAzKQotCQkJCWF0aF9zZXRkZWZhbnRlbm5hKHNjLCBycy5yc19hbnRlbm5hKTsKLQkJfSBlbHNlIHsKLQkJCXNjLT5yeC5yeG90aGVyYW50ID0gMDsKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9BTlRfRElWX0NPTUIpIHsKKworCQkJLyoKKwkJCSAqIGNoYW5nZSB0aGUgZGVmYXVsdCByeCBhbnRlbm5hIGlmIHJ4IGRpdmVyc2l0eQorCQkJICogY2hvb3NlcyB0aGUgb3RoZXIgYW50ZW5uYSAzIHRpbWVzIGluIGEgcm93LgorCQkJICovCisJCQlpZiAoc2MtPnJ4LmRlZmFudCAhPSBycy5yc19hbnRlbm5hKSB7CisJCQkJaWYgKCsrc2MtPnJ4LnJ4b3RoZXJhbnQgPj0gMykKKwkJCQkJYXRoX3NldGRlZmFudGVubmEoc2MsIHJzLnJzX2FudGVubmEpOworCQkJfSBlbHNlIHsKKwkJCQlzYy0+cngucnhvdGhlcmFudCA9IDA7CisJCQl9CisKIAkJfQogCiAJCWlmIChyeHMtPmZsYWcgJiBSWF9GTEFHX01NSUNfU1RSSVBQRUQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKaW5kZXggOGZjYjdlOS4uNmUyZjE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaApAQCAtMTAwNiw2ICsxMDA2LDggQEAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAxOCA6IDB4NDAzMCkKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLX0dQSU8gICAgICAgICAgICAgICAgICAweEZGRkMwMDAwCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19HUElPX1MgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLX01DSSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19NQ0lfUyAgICAgICAgICAgICAgICAgNwogCiAjZGVmaW5lIEFSX0lOVFJfU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMWMgOiAweDQwMzQpCiAjZGVmaW5lIEFSX0lOVFJfU1lOQ19NQVNLX0dQSU8gICAgICAgICAgICAgICAgICAgMHhGRkZDMDAwMApAQCAtMTAxMyw2ICsxMDE1LDE0IEBACiAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRV9DTFIgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyMCA6IDB4NDAzOCkKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRSAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyMCA6IDB4NDAzOCkKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRV9NQ0kJCQkgMHgwMDAwMDA4MAorI2RlZmluZSBBUl9JTlRSX0FTWU5DX1VTRUQJCQkgKEFSX0lOVFJfTUFDX0lSUSB8IFwKKwkJCQkJCSAgQVJfSU5UUl9BU1lOQ19DQVVTRV9NQ0kpCisKKy8qIEFzeW5jaHJvbm91cyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfRU5BQkxFX01DSSAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEVfTUNJX1MgICAgICAgNworCiAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyNCA6IDB4NDAzYykKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEVfR1BJTyAgICAgICAgICAgICAgICAweEZGRkMwMDAwCkBAIC0xMjY5LDYgKzEyNzksOCBAQAogI2RlZmluZSBBUl9SVENfSU5UUl9NQVNLIFwKIAkoKEFSX1NSRVZfOTEwMChhaCkpID8gKEFSX1JUQ19CQVNFICsgMHgwMDU4KSA6IDB4NzA1OCkKIAorI2RlZmluZSBBUl9SVENfS0VFUF9BV0FLRQkweDcwMzQKKwogLyogUlRDX0RFUklWRURfKiAtIG9ubHkgZm9yIEFSOTEwMCAqLwogCiAjZGVmaW5lIEFSX1JUQ19ERVJJVkVEX0NMSyBcCkBAIC0xNTU1LDYgKzE1NjcsOCBAQAogI2RlZmluZSBBUl9ESUFHX0ZSQU1FX05WMCAgICAgICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSBBUl9ESUFHX09CU19QVF9TRUwxICAgICAgICAgMHgwMDBDMDAwMAogI2RlZmluZSBBUl9ESUFHX09CU19QVF9TRUwxX1MgICAgICAgMTgKKyNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMiAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMl9TICAgICAgIDI3CiAjZGVmaW5lIEFSX0RJQUdfRk9SQ0VfUlhfQ0xFQVIgICAgICAweDAwMTAwMDAwIC8qIGZvcmNlIHJ4X2NsZWFyIGhpZ2ggKi8KICNkZWZpbmUgQVJfRElBR19JR05PUkVfVklSVF9DUyAgICAgIDB4MDAyMDAwMDAKICNkZWZpbmUgQVJfRElBR19GT1JDRV9DSF9JRExFX0hJR0ggIDB4MDA0MDAwMDAKQEAgLTE3NTIsMTkgKzE3NjYsMTAgQEAKIAogI2RlZmluZSBBUl9CVF9DT0VYX1dMX1dFSUdIVFMwICAgICAweDgxNzQKICNkZWZpbmUgQVJfQlRfQ09FWF9XTF9XRUlHSFRTMSAgICAgMHg4MWM0CisjZGVmaW5lIEFSX01DSV9DT0VYX1dMX1dFSUdIVFMoX2kpICgweDE4YjAgKyAoX2kgPDwgMikpCisjZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhfaSkgICgweDgzYWMgKyAoX2kgPDwgMikpCiAKLSNkZWZpbmUgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCAgICAgMHg4M2FjCi0jZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzEgICAgIDB4ODNiMAotI2RlZmluZSBBUl9CVF9DT0VYX0JUX1dFSUdIVFMyICAgICAweDgzYjQKLSNkZWZpbmUgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMyAgICAgMHg4M2I4Ci0KLSNkZWZpbmUgQVI5MzAwX0JUX1dHSFQgICAgICAgICAgICAgICAgICAgICAweGNjY2M0NDQ0Ci0jZGVmaW5lIEFSOTMwMF9TVE9NUF9BTExfV0xBTl9XR0hUMCAgICAgICAgMHhmZmZmZmZmMAotI2RlZmluZSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDEgICAgICAgIDB4ZmZmZmZmZjAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX0xPV19XTEFOX1dHSFQwICAgICAgICAweDg4ODg4ODgwCi0jZGVmaW5lIEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMSAgICAgICAgMHg4ODg4ODg4MAotI2RlZmluZSBBUjkzMDBfU1RPTVBfTk9ORV9XTEFOX1dHSFQwICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSOTMwMF9CVF9XR0hUICAgICAgICAgICAgIDB4Y2NjYzQ0NDQKIAogI2RlZmluZSBBUl9CVF9DT0VYX01PREUyICAgICAgICAgICAweDgxN2MKICNkZWZpbmUgQVJfQlRfQkNOX01JU1NfVEhSRVNIICAgICAgMHgwMDAwMDBmZgpAQCAtMTkzOCwzNyArMTk0MywyNzcgQEAKICNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MX1lDT0tfTUFYX1MJCTYKIAogLyogTUNJIFJlZ2lzdGVycyAqLwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19FTgkJMHgxODNjCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVF9TICAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MX1MgICAxCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDS19TICAgICAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTyAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GT19TICAgICAzCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUX1MgICAgICA0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GT19TICAgICA1Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlQgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlRfUyAgICAgICA2Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTV9TICAgICAgICAgICA4Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPX1MgICAgICA5Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORyAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR19TICAxMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HX1MgICAgMTEKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0VfUyAgICAgIDEyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX01BU0sJKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgfCBcCisKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwCQkJCTB4MTgwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfSEVBREVSCQkJMHhGRgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfSEVBREVSX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0xFTgkJCTB4MWYwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfTEVOX1MJCQk4CisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9ESVNBQkxFX1RJTUVTVEFNUAkweDIwMDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0RJU0FCTEVfVElNRVNUQU1QX1MJMTMKKworI2RlZmluZSBBUl9NQ0lfQ09NTUFORDEJCQkJMHgxODA0CisKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyCQkJCTB4MTgwOAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgJCTB4MDEKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1RYX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYCQkweDAyCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9TCQkxCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9OVU1fQ1lDTEVTICAgICAweDNGQworI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlhfTlVNX0NZQ0xFU19TICAgMgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUkVRX1dBS0VVUCAgICAgICAgMHg0MDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVBfUyAgICAgIDEwCisKKyNkZWZpbmUgQVJfTUNJX1JYX0NUUkwJCQkJMHgxODBjCisKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkwJCQkJMHgxODEwCisvKiAwID0gbm8gZGl2aXNpb24sIDEgPSBkaXZpZGUgYnkgMiwgMiA9IGRpdmlkZSBieSA0LCAzID0gZGl2aWRlIGJ5IDggKi8KKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJVgkJCTB4MDMKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJVl9TCQkwCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURQkweDA0CisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURV9TCTIKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfRlJFUQkJMHhGRkZGRjgKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfRlJFUV9TCTMKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfTlVNCQkweEYwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfTlVNX1MJMjQKKworI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEUJCQkweDE4MTQKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0NIRUNLU1VNCQkweEZGRkYKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0NIRUNLU1VNX1MJCTAKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0lOVkFMSURfSERSCQkweEZGRkYwMDAwCisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUl9TCTE2CisKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMAkJCQkweDE4MTgKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMQkJCQkweDE4MWMKKyNkZWZpbmUgQVJfTUNJX0dQTV8wCQkJCQkweDE4MjAKKyNkZWZpbmUgQVJfTUNJX0dQTV8xCQkJCQkweDE4MjQKKyNkZWZpbmUgQVJfTUNJX0dQTV9XUklURV9QVFIJCQkJMHhGRkZGMDAwMAorI2RlZmluZSBBUl9NQ0lfR1BNX1dSSVRFX1BUUl9TCQkJCTE2CisjZGVmaW5lIEFSX01DSV9HUE1fQlVGX0xFTgkJCQkweDAwMDBGRkZGCisjZGVmaW5lIEFSX01DSV9HUE1fQlVGX0xFTl9TCQkJCTAKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JBVwkJCQkweDE4MjgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9FTgkJCQkweDE4MmMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORV9TCQkJMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NQVV9JTlRfTVNHCQkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NQVV9JTlRfTVNHX1MJCQkxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfQ0tTVU1fRkFJTAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9DS1NVTV9GQUlMX1MJCTIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUl9TCQkzCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwJCQkweDAwMDAwMDEwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUxfUwkJNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMX1MJCTUKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTF9TCQk3CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwJCQkweDAwMDAwMTAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUxfUwkJOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRwkJCQkweDAwMDAwMjAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1MJCQk5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURQkJMHgwMDAwMDQwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEVfUwkJMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUkkJCQkJMHgwN2ZmZjgwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSV9TCQkJMTEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUklfVEhSRVNICQkJMHgwODAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSV9USFJFU0hfUwkJMjcKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9GUkVRCQkJMHgxMDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX0ZSRVFfUwkJCTI4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfU1RPTVAJCQkweDIwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfU1RPTVBfUwkJCTI5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQkJfQUlDX0lSUQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CQl9BSUNfSVJRX1MJCQkzMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUCQkweDgwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ09OVF9JTkZPX1RJTUVPVVRfUwkJMzEKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0RFRkFVTFQgICAgKEFSX01DSV9JTlRFUlJVUFRfU1dfTVNHX0RPTkUJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHCQkgIHwgXAorCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFIHwgXAorCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCkKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX01TR19GQUlMX01BU0sgKEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwpCisKKyNkZWZpbmUgQVJfTUNJX1JFTU9URV9DUFVfSU5UCQkJCTB4MTgzMAorI2RlZmluZSBBUl9NQ0lfUkVNT1RFX0NQVV9JTlRfRU4JCQkweDE4MzQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXCQkJMHgxODM4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOCQkJMHgxODNjCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVAkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVRfUwkJMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTAkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTF9TCQkxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSwkJMHgwMDAwMDAwNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0tfUwkJMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8JCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPX1MJCTMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1QJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1RfUwkJNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8JCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPX1MJCTUKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ1BVX0lOVAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ1BVX0lOVF9TCQk2CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNX1MJCQk4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPCQkweDAwMDAwMjAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPX1MJCTkKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HCQkweDAwMDAwNDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR19TCQkxMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HCQkweDAwMDAwODAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkdfUwkJMTEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0VfUwkJMTIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfTUFTSwkgKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0x8IFwKIAkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTyAgIHwgXAogCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPICB8IFwKIAkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCkKIAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19ERUZBVUxUIChBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE0JIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVNT1RFX1JFU0VUfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR3wgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTCB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUICAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UpCisKKyNkZWZpbmUgQVJfTUNJX0NQVV9JTlQJCQkJCTB4MTg0MAorCisjZGVmaW5lIEFSX01DSV9SWF9TVEFUVVMJCQkweDE4NDQKKyNkZWZpbmUgQVJfTUNJX1JYX0xBU1RfU0NIRF9NU0dfSU5ERVgJCTB4MDAwMDBGMDAKKyNkZWZpbmUgQVJfTUNJX1JYX0xBU1RfU0NIRF9NU0dfSU5ERVhfUwkJOAorI2RlZmluZSBBUl9NQ0lfUlhfUkVNT1RFX1NMRUVQCQkJMHgwMDAwMTAwMAorI2RlZmluZSBBUl9NQ0lfUlhfUkVNT1RFX1NMRUVQX1MJCTEyCisjZGVmaW5lIEFSX01DSV9SWF9NQ0lfQ0xLX1JFUQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgQVJfTUNJX1JYX01DSV9DTEtfUkVRX1MJCQkxMworCisjZGVmaW5lIEFSX01DSV9DT05UX1NUQVRVUwkJCTB4MTg0OAorI2RlZmluZSBBUl9NQ0lfQ09OVF9SU1NJX1BPV0VSCQkJMHgwMDAwMDBGRgorI2RlZmluZSBBUl9NQ0lfQ09OVF9SU1NJX1BPV0VSX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTlRfUlJJT1JJVFkJCQkweDAwMDBGRjAwCisjZGVmaW5lIEFSX01DSV9DT05UX1JSSU9SSVRZX1MJCQk4CisjZGVmaW5lIEFSX01DSV9DT05UX1RYUlgJCQkweDAwMDEwMDAwCisjZGVmaW5lIEFSX01DSV9DT05UX1RYUlhfUwkJCTE2CisKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTAJCQkJMHgxODRjCisjZGVmaW5lIEFSX01DSV9CVF9QUkkxCQkJCTB4MTg1MAorI2RlZmluZSBBUl9NQ0lfQlRfUFJJMgkJCQkweDE4NTQKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTMJCQkJMHgxODU4CisjZGVmaW5lIEFSX01DSV9CVF9QUkkJCQkJMHgxODVjCisjZGVmaW5lIEFSX01DSV9XTF9GUkVRMAkJCQkweDE4NjAKKyNkZWZpbmUgQVJfTUNJX1dMX0ZSRVExCQkJCTB4MTg2NAorI2RlZmluZSBBUl9NQ0lfV0xfRlJFUTIJCQkJMHgxODY4CisjZGVmaW5lIEFSX01DSV9HQUlOCQkJCTB4MTg2YworI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjEJCQkJMHgxODcwCisjZGVmaW5lIEFSX01DSV9XQlRJTUVSMgkJCQkweDE4NzQKKyNkZWZpbmUgQVJfTUNJX1dCVElNRVIzCQkJCTB4MTg3OAorI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjQJCQkJMHgxODdjCisjZGVmaW5lIEFSX01DSV9NQVhHQUlOCQkJCTB4MTg4MAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfQ1RMCQkJMHgxODg0CisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMAkJCTB4MTg4OAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDEJCQkweDE4OGMKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QyCQkJMHgxODkwCisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMwkJCTB4MTg5NAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDAJCQkweDE4OTgKKyNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQxCQkJMHgxODljCisjZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMgkJCTB4MThhMAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDMJCQkweDE4YTQKKyNkZWZpbmUgQVJfQlRDT0VYX1dCVElNRVIJCQkweDE4YTgKKworI2RlZmluZSBBUl9CVENPRVhfQ1RSTAkJCQkJMHgxOGFjCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BUjk0NjJfTU9ERV9TCQkJMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOX1MJCQkxCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOCQkJMHgwMDAwMDAwNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9NQ0lfTU9ERV9FTl9TCQkJMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVECQkJMHgwMDAwMDAwOAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVEX1MJCQkzCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUEFfU0hBUkVEX1MJCQk0CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4JCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTl9TCQk1CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1RJTUVfVE9fTkVYVF9CVF9USFJFU0hfRU4JMHgwMDAwMDA0MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9USU1FX1RPX05FWFRfQlRfVEhSRVNIX0VOX1MJNgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMJCQkweDAwMDAwMTgwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BU19TCQkJNworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLCQkJMHgwMDAwMEUwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLX1MJCQk5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNICQkJMHgwMDAwNzAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BR0dSX1RIUkVTSF9TCQkJMTIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04JCQkweDAwMDgwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQkNOX1MJCQkxOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSwkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9BQ0tfUwkJCTIwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dBSVRfQkFfTUFSR0lOCQkJMHgxRkUwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQUlUX0JBX01BUkdJTl9TCQkJMjgKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUkVEVUNFX1RYUFdSCQkJMHgyMDAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SRURVQ0VfVFhQV1JfUwkJCTI5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFXzEwCQkJMHg0MDAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMF9TCQkJMzAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9QT0xBUklUWQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9QT0xBUklUWV9TCQkJMzEKKworI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzAJCQkJMHgxOGIwCisjZGVmaW5lIEFSX0JUQ09FWF9XTF9XRUlHSFRTMQkJCQkweDE4YjQKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX1dFSUdIVFMyCQkJCTB4MThiOAorI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzMJCQkJMHgxOGJjCisjZGVmaW5lIEFSX0JUQ09FWF9NQVhfVFhQV1IoX3gpCQkJCSgweDE4YzAgKyAoKF94KSA8PCAyKSkKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX0xOQQkJCQkweDE5NDAKKyNkZWZpbmUgQVJfQlRDT0VYX1JGR0FJTl9DVFJMCQkJCTB4MTk0NAorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMgkJCQkJMHgxOTQ4CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0gJCQkweDAwMDdGODAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0hfUwkJCTExCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWF9DSEFJTl9NQVNLCQkJMHgwMDM4MDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTS19TCQkJMTkKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hUCQkJMHgwMDQwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfUlhfREVXRUlHSFRfUwkJCTIyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUwJCQkweDAwODAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUxfUwkJCTIzCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTAkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX01BQ19CQl9PQlNfU0VMX1MJCTI0CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9ERVNDX0JBU0VEX1RYUFdSX0VOQUJMRQkJMHgwMjAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfREVTQ19CQVNFRF9UWFBXUl9FTkFCTEVfUwkyNQorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEVfUyAgICAgICAgMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0JUX09XTl9TUERUX0NUUkxfUyAgIDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVVNFX0xBVENIRURfQlRfQU5UICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9VU0VfTEFUQ0hFRF9CVF9BTlRfUyAyCisjZGVmaW5lIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTiAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVJfR0xCX1dMQU5fVUFSVF9JTlRGX0VOX1MgICAgICAgICAgMTcKKyNkZWZpbmUgQVJfR0xCX0RTX0pUQUdfRElTQUJMRSAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBBUl9HTEJfRFNfSlRBR19ESVNBQkxFX1MgICAgICAgICAgICAxOAorCisjZGVmaW5lIEFSX0JUQ09FWF9SQyAgICAgICAgICAgICAgICAgICAgMHgxOTRjCisjZGVmaW5lIEFSX0JUQ09FWF9NQVhfUkZHQUlOKF94KSAgICAgICAgKDB4MTk1MCArICgoX3gpIDw8IDIpKQorI2RlZmluZSBBUl9CVENPRVhfREJHICAgICAgICAgICAgICAgICAgIDB4MWE1MAorI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfSERSICAgICAgICAgIDB4MWE1NAorI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfQkRZICAgICAgICAgIDB4MWE1OAorCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzIgICAgICAgICAgICAgMHgxYTVjCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfTUVNX0JBU0VEICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX01FTV9CQVNFRF9TIDAKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9IV19CQVNFRCAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfSFdfQkFTRURfUyAgMQorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMyAgICAgICAgICAgICAgIDB4MWE2MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVQJMHgwMDAwMGZmZgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVRfUwkwCisKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwppbmRleCA1NWQwNzdlLi4yM2U4MGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCSAgICBpbnQgdHhfZmxhZ3MsIHN0cnVjdCBhdGhfdHhxICp0eHEpOwogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX2J1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCXN0cnVjdCBhdGhfdHhxICp0eHEsIHN0cnVjdCBsaXN0X2hlYWQgKmJmX3EsCi0JCQkJc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBpbnQgdHhvaywgaW50IHNlbmRiYXIpOworCQkJCXN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgaW50IHR4b2spOwogc3RhdGljIHZvaWQgYXRoX3R4X3R4cWFkZGJ1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBpbnRlcm5hbCk7CiBzdGF0aWMgdm9pZCBhdGhfdHhfcmNfc3RhdHVzKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCkBAIC0xNTAsNiArMTUwLDEyIEBACiAJcmV0dXJuIChzdHJ1Y3QgYXRoX2ZyYW1lX2luZm8gKikgJnR4X2luZm8tPnJhdGVfZHJpdmVyX2RhdGFbMF07CiB9CiAKK3N0YXRpYyB2b2lkIGF0aF9zZW5kX2JhcihzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwgdTE2IHNlcW5vKQoreworCWllZWU4MDIxMV9zZW5kX2Jhcih0aWQtPmFuLT52aWYsIHRpZC0+YW4tPnN0YS0+YWRkciwgdGlkLT50aWRubywKKwkJCSAgIHNlcW5vIDw8IElFRUU4MDIxMV9TRVFfU0VRX1NISUZUKTsKK30KKwogc3RhdGljIHZvaWQgYXRoX3R4X2ZsdXNoX3RpZChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQpCiB7CiAJc3RydWN0IGF0aF90eHEgKnR4cSA9IHRpZC0+YWMtPnR4cTsKQEAgLTE1OCwyOCArMTY0LDMzIEBACiAJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOwogCXN0cnVjdCBhdGhfdHhfc3RhdHVzIHRzOwogCXN0cnVjdCBhdGhfZnJhbWVfaW5mbyAqZmk7CisJYm9vbCBzZW5kYmFyID0gZmFsc2U7CiAKIAlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CiAKIAltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKLQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0aWQtPmJ1Zl9xKSkpIHsKIAkJZmkgPSBnZXRfZnJhbWVfaW5mbyhza2IpOwogCQliZiA9IGZpLT5iZjsKIAotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJCWlmIChiZiAmJiBmaS0+cmV0cmllcykgewogCQkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKIAkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIGJmLT5iZl9zdGF0ZS5zZXFubyk7Ci0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwLCAxKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOworCQkJc2VuZGJhciA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlhdGhfdHhfc2VuZF9ub3JtYWwoc2MsIHR4cSwgTlVMTCwgc2tiKTsKIAkJfQotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlpZiAodGlkLT5iYXdfaGVhZCA9PSB0aWQtPmJhd190YWlsKSB7CisJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQUREQkFfQ09NUExFVEU7CisJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQ0xFQU5VUDsKKwl9CisKKwlpZiAoc2VuZGJhcikKKwkJYXRoX3NlbmRfYmFyKHRpZCwgdGlkLT5zZXFfc3RhcnQpOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfdXBkYXRlX2JhdyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQsCkBAIC0xOTUsNiArMjA2LDggQEAKIAl3aGlsZSAodGlkLT5iYXdfaGVhZCAhPSB0aWQtPmJhd190YWlsICYmICF0ZXN0X2JpdCh0aWQtPmJhd19oZWFkLCB0aWQtPnR4X2J1ZikpIHsKIAkJSU5DUih0aWQtPnNlcV9zdGFydCwgSUVFRTgwMjExX1NFUV9NQVgpOwogCQlJTkNSKHRpZC0+YmF3X2hlYWQsIEFUSF9USURfTUFYX0JVRlMpOworCQlpZiAodGlkLT5iYXJfaW5kZXggPj0gMCkKKwkJCXRpZC0+YmFyX2luZGV4LS07CiAJfQogfQogCkBAIC0yMzgsOSArMjUxLDcgQEAKIAkJYmYgPSBmaS0+YmY7CiAKIAkJaWYgKCFiZikgewotCQkJc3Bpbl91bmxvY2soJnR4cS0+YXhxX2xvY2spOwogCQkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIEFUSF9UWF9FUlJPUiwgdHhxKTsKLQkJCXNwaW5fbG9jaygmdHhxLT5heHFfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yNDksMjQgKzI2MCwyNiBAQAogCQlpZiAoZmktPnJldHJpZXMpCiAJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBiZi0+YmZfc3RhdGUuc2Vxbm8pOwogCi0JCXNwaW5fdW5sb2NrKCZ0eHEtPmF4cV9sb2NrKTsKLQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCwgMCk7Ci0JCXNwaW5fbG9jaygmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOwogCX0KIAogCXRpZC0+c2VxX25leHQgPSB0aWQtPnNlcV9zdGFydDsKIAl0aWQtPmJhd190YWlsID0gdGlkLT5iYXdfaGVhZDsKKwl0aWQtPmJhcl9pbmRleCA9IC0xOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfc2V0X3JldHJ5KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAotCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGF0aF9mcmFtZV9pbmZvICpmaSA9IGdldF9mcmFtZV9pbmZvKHNrYik7CiAJc3RydWN0IGF0aF9idWYgKmJmID0gZmktPmJmOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJaW50IHByZXYgPSBmaS0+cmV0cmllczsKIAogCVRYX1NUQVRfSU5DKHR4cS0+YXhxX3FudW0sIGFfcmV0cmllcyk7Ci0JaWYgKGZpLT5yZXRyaWVzKysgPiAwKQorCWZpLT5yZXRyaWVzICs9IGNvdW50OworCisJaWYgKHByZXYgPiAwKQogCQlyZXR1cm47CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zNjUsNyArMzc4LDcgQEAKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmZfbmV4dCwgKmJmX2xhc3QgPSBiZi0+YmZfbGFzdGJmOwogCXN0cnVjdCBsaXN0X2hlYWQgYmZfaGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGJmX3BlbmRpbmc7Ci0JdTE2IHNlcV9zdCA9IDAsIGFja2VkX2NudCA9IDAsIHR4ZmFpbF9jbnQgPSAwOworCXUxNiBzZXFfc3QgPSAwLCBhY2tlZF9jbnQgPSAwLCB0eGZhaWxfY250ID0gMCwgc2VxX2ZpcnN0OwogCXUzMiBiYVtXTUVfQkFfQk1QX1NJWkUgPj4gNV07CiAJaW50IGlzYWdnciwgdHhmYWlsLCB0eHBlbmRpbmcsIHNlbmRiYXIgPSAwLCBuZWVkcmVzZXQgPSAwLCBuYmFkID0gMDsKIAlib29sIHJjX3VwZGF0ZSA9IHRydWU7CkBAIC0zNzQsNiArMzg3LDggQEAKIAlpbnQgbmZyYW1lczsKIAl1OCB0aWRubzsKIAlib29sIGZsdXNoID0gISEodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYX0ZMVVNIKTsKKwlpbnQgaSwgcmV0cmllczsKKwlpbnQgYmFyX2luZGV4ID0gLTE7CiAKIAlza2IgPSBiZi0+YmZfbXBkdTsKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zODIsNiArMzk3LDEwIEBACiAKIAltZW1jcHkocmF0ZXMsIHR4X2luZm8tPmNvbnRyb2wucmF0ZXMsIHNpemVvZihyYXRlcykpOwogCisJcmV0cmllcyA9IHRzLT50c19sb25ncmV0cnkgKyAxOworCWZvciAoaSA9IDA7IGkgPCB0cy0+dHNfcmF0ZWluZGV4OyBpKyspCisJCXJldHJpZXMgKz0gcmF0ZXNbaV0uY291bnQ7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGFfYnlfaWZhZGRyKGh3LCBoZHItPmFkZHIxLCBoZHItPmFkZHIyKTsKQEAgLTM5NSw4ICs0MTQsNyBAQAogCQkJaWYgKCFiZi0+YmZfc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQogCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsCi0JCQkJMCwgMCk7CisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsIDApOwogCiAJCQliZiA9IGJmX25leHQ7CiAJCX0KQEAgLTQwNiw2ICs0MjQsNyBAQAogCWFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKXN0YS0+ZHJ2X3ByaXY7CiAJdGlkbm8gPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKVswXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCXRpZCA9IEFUSF9BTl8yX1RJRChhbiwgdGlkbm8pOworCXNlcV9maXJzdCA9IHRpZC0+c2VxX3N0YXJ0OwogCiAJLyoKIAkgKiBUaGUgaGFyZHdhcmUgb2NjYXNpb25hbGx5IHNlbmRzIGEgdHggc3RhdHVzIGZvciB0aGUgd3JvbmcgVElELgpAQCAtNDU1LDI1ICs0NzQsMjUgQEAKIAkJfSBlbHNlIGlmICghaXNhZ2dyICYmIHR4b2spIHsKIAkJCS8qIHRyYW5zbWl0IGNvbXBsZXRpb24gKi8KIAkJCWFja2VkX2NudCsrOwotCQl9IGVsc2UgewotCQkJaWYgKCh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKSB8fCAhcmV0cnkpIHsKLQkJCQkvKgotCQkJCSAqIGNsZWFudXAgaW4gcHJvZ3Jlc3MsIGp1c3QgZmFpbAotCQkJCSAqIHRoZSB1bi1hY2tlZCBzdWItZnJhbWVzCi0JCQkJICovCi0JCQkJdHhmYWlsID0gMTsKLQkJCX0gZWxzZSBpZiAoZmx1c2gpIHsKLQkJCQl0eHBlbmRpbmcgPSAxOwotCQkJfSBlbHNlIGlmIChmaS0+cmV0cmllcyA8IEFUSF9NQVhfU1dfUkVUUklFUykgewotCQkJCWlmICh0eG9rIHx8ICFhbi0+c2xlZXBpbmcpCi0JCQkJCWF0aF90eF9zZXRfcmV0cnkoc2MsIHR4cSwgYmYtPmJmX21wZHUpOworCQl9IGVsc2UgaWYgKCh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKSB8fCAhcmV0cnkpIHsKKwkJCS8qCisJCQkgKiBjbGVhbnVwIGluIHByb2dyZXNzLCBqdXN0IGZhaWwKKwkJCSAqIHRoZSB1bi1hY2tlZCBzdWItZnJhbWVzCisJCQkgKi8KKwkJCXR4ZmFpbCA9IDE7CisJCX0gZWxzZSBpZiAoZmx1c2gpIHsKKwkJCXR4cGVuZGluZyA9IDE7CisJCX0gZWxzZSBpZiAoZmktPnJldHJpZXMgPCBBVEhfTUFYX1NXX1JFVFJJRVMpIHsKKwkJCWlmICh0eG9rIHx8ICFhbi0+c2xlZXBpbmcpCisJCQkJYXRoX3R4X3NldF9yZXRyeShzYywgdHhxLCBiZi0+YmZfbXBkdSwKKwkJCQkJCSByZXRyaWVzKTsKIAotCQkJCXR4cGVuZGluZyA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXR4ZmFpbCA9IDE7Ci0JCQkJc2VuZGJhciA9IDE7Ci0JCQkJdHhmYWlsX2NudCsrOwotCQkJfQorCQkJdHhwZW5kaW5nID0gMTsKKwkJfSBlbHNlIHsKKwkJCXR4ZmFpbCA9IDE7CisJCQl0eGZhaWxfY250Kys7CisJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKKwkJCQlBVEhfQkFfSU5ERVgoc2VxX2ZpcnN0LCBzZXFubykpOwogCQl9CiAKIAkJLyoKQEAgLTQ5MCw5ICs1MDksNyBAQAogCQkJICogY29tcGxldGUgdGhlIGFja2VkLW9uZXMveHJldHJpZWQgb25lczsgdXBkYXRlCiAJCQkgKiBibG9jay1hY2sgd2luZG93CiAJCQkgKi8KLQkJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBzZXFubyk7Ci0JCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAKIAkJCWlmIChyY191cGRhdGUgJiYgKGFja2VkX2NudCA9PSAxIHx8IHR4ZmFpbF9jbnQgPT0gMSkpIHsKIAkJCQltZW1jcHkodHhfaW5mby0+Y29udHJvbC5yYXRlcywgcmF0ZXMsIHNpemVvZihyYXRlcykpOwpAQCAtNTAxLDMzICs1MTgsMzAgQEAKIAkJCX0KIAogCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIHRzLAotCQkJCSF0eGZhaWwsIHNlbmRiYXIpOworCQkJCSF0eGZhaWwpOwogCQl9IGVsc2UgewogCQkJLyogcmV0cnkgdGhlIHVuLWFja2VkIG9uZXMgKi8KLQkJCWlmICghKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpKSB7Ci0JCQkJaWYgKGJmLT5iZl9uZXh0ID09IE5VTEwgJiYgYmZfbGFzdC0+YmZfc3RhbGUpIHsKLQkJCQkJc3RydWN0IGF0aF9idWYgKnRiZjsKKwkJCWlmICghKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpICYmCisJCQkgICAgYmYtPmJmX25leHQgPT0gTlVMTCAmJiBiZl9sYXN0LT5iZl9zdGFsZSkgeworCQkJCXN0cnVjdCBhdGhfYnVmICp0YmY7CiAKLQkJCQkJdGJmID0gYXRoX2Nsb25lX3R4YnVmKHNjLCBiZl9sYXN0KTsKLQkJCQkJLyoKLQkJCQkJICogVXBkYXRlIHR4IGJhdyBhbmQgY29tcGxldGUgdGhlCi0JCQkJCSAqIGZyYW1lIHdpdGggZmFpbGVkIHN0YXR1cyBpZiB3ZQotCQkJCQkgKiBydW4gb3V0IG9mIHR4IGJ1Zi4KLQkJCQkJICovCi0JCQkJCWlmICghdGJmKSB7Ci0JCQkJCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCQkJCQkJYXRoX3R4X3VwZGF0ZV9iYXcoc2MsIHRpZCwgc2Vxbm8pOwotCQkJCQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCQkJCXRiZiA9IGF0aF9jbG9uZV90eGJ1ZihzYywgYmZfbGFzdCk7CisJCQkJLyoKKwkJCQkgKiBVcGRhdGUgdHggYmF3IGFuZCBjb21wbGV0ZSB0aGUKKwkJCQkgKiBmcmFtZSB3aXRoIGZhaWxlZCBzdGF0dXMgaWYgd2UKKwkJCQkgKiBydW4gb3V0IG9mIHR4IGJ1Zi4KKwkJCQkgKi8KKwkJCQlpZiAoIXRiZikgeworCQkJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBzZXFubyk7CiAKLQkJCQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsCi0JCQkJCQkJCSAgICAmYmZfaGVhZCwKLQkJCQkJCQkJICAgIHRzLCAwLAotCQkJCQkJCQkgICAgIWZsdXNoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJZmktPmJmID0gdGJmOworCQkJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLAorCQkJCQkJCSAgICAmYmZfaGVhZCwgdHMsIDApOworCQkJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKKwkJCQkJCUFUSF9CQV9JTkRFWChzZXFfZmlyc3QsIHNlcW5vKSk7CisJCQkJCWJyZWFrOwogCQkJCX0KKworCQkJCWZpLT5iZiA9IHRiZjsKIAkJCX0KIAogCQkJLyoKQEAgLTU0MCwxMiArNTU0LDE4IEBACiAJCWJmID0gYmZfbmV4dDsKIAl9CiAKKwlpZiAoYmFyX2luZGV4ID49IDApIHsKKwkJdTE2IGJhcl9zZXEgPSBBVEhfQkFfSU5ERVgyU0VRKHNlcV9maXJzdCwgYmFyX2luZGV4KTsKKwkJYXRoX3NlbmRfYmFyKHRpZCwgQVRIX0JBX0lOREVYMlNFUShzZXFfZmlyc3QsIGJhcl9pbmRleCArIDEpKTsKKwkJaWYgKEJBV19XSVRISU4odGlkLT5zZXFfc3RhcnQsIHRpZC0+YmF3X3NpemUsIGJhcl9zZXEpKQorCQkJdGlkLT5iYXJfaW5kZXggPSBBVEhfQkFfSU5ERVgodGlkLT5zZXFfc3RhcnQsIGJhcl9zZXEpOworCX0KKwogCS8qIHByZXBlbmQgdW4tYWNrZWQgZnJhbWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBlbmRpbmcgZnJhbWUgcXVldWUgKi8KIAlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYmZfcGVuZGluZykpIHsKIAkJaWYgKGFuLT5zbGVlcGluZykKIAkJCWllZWU4MDIxMV9zdGFfc2V0X2J1ZmZlcmVkKHN0YSwgdGlkLT50aWRubywgdHJ1ZSk7CiAKLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAkJc2tiX3F1ZXVlX3NwbGljZSgmYmZfcGVuZGluZywgJnRpZC0+YnVmX3EpOwogCQlpZiAoIWFuLT5zbGVlcGluZykgewogCQkJYXRoX3R4X3F1ZXVlX3RpZCh0eHEsIHRpZCk7CkBAIC01NTMsMTggKzU3MywxMSBAQAogCQkJaWYgKHRzLT50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9GSUxUKQogCQkJCXRpZC0+YWMtPmNsZWFyX3BzX2ZpbHRlciA9IHRydWU7CiAJCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIAotCWlmICh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKSB7CisJaWYgKHRpZC0+c3RhdGUgJiBBR0dSX0NMRUFOVVApCiAJCWF0aF90eF9mbHVzaF90aWQoc2MsIHRpZCk7CiAKLQkJaWYgKHRpZC0+YmF3X2hlYWQgPT0gdGlkLT5iYXdfdGFpbCkgewotCQkJdGlkLT5zdGF0ZSAmPSB+QUdHUl9BRERCQV9DT01QTEVURTsKLQkJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQ0xFQU5VUDsKLQkJfQotCX0KLQogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKG5lZWRyZXNldCkgewpAQCAtNjE4LDI0ICs2MzEsMjYgQEAKIAltYXhfNG1zX2ZyYW1lbGVuID0gQVRIX0FNUERVX0xJTUlUX01BWDsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHJhdGVzW2ldLmNvdW50KSB7Ci0JCQlpbnQgbW9kZWlkeDsKLQkJCWlmICghKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHsKLQkJCQlsZWdhY3kgPSAxOwotCQkJCWJyZWFrOwotCQkJfQorCQlpbnQgbW9kZWlkeDsKIAotCQkJaWYgKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkKLQkJCQltb2RlaWR4ID0gTUNTX0hUNDA7Ci0JCQllbHNlCi0JCQkJbW9kZWlkeCA9IE1DU19IVDIwOworCQlpZiAoIXJhdGVzW2ldLmNvdW50KQorCQkJY29udGludWU7CiAKLQkJCWlmIChyYXRlc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkKLQkJCQltb2RlaWR4Kys7Ci0KLQkJCWZybWxlbiA9IGF0aF9tYXhfNG1zX2ZyYW1lbGVuW21vZGVpZHhdW3JhdGVzW2ldLmlkeF07Ci0JCQltYXhfNG1zX2ZyYW1lbGVuID0gbWluKG1heF80bXNfZnJhbWVsZW4sIGZybWxlbik7CisJCWlmICghKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHsKKwkJCWxlZ2FjeSA9IDE7CisJCQlicmVhazsKIAkJfQorCisJCWlmIChyYXRlc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCisJCQltb2RlaWR4ID0gTUNTX0hUNDA7CisJCWVsc2UKKwkJCW1vZGVpZHggPSBNQ1NfSFQyMDsKKworCQlpZiAocmF0ZXNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpCisJCQltb2RlaWR4Kys7CisKKwkJZnJtbGVuID0gYXRoX21heF80bXNfZnJhbWVsZW5bbW9kZWlkeF1bcmF0ZXNbaV0uaWR4XTsKKwkJbWF4XzRtc19mcmFtZWxlbiA9IG1pbihtYXhfNG1zX2ZyYW1lbGVuLCBmcm1sZW4pOwogCX0KIAogCS8qCkBAIC03NzEsOCArNzg2LDYgQEAKIAogCQliZi0+YmZfc3RhdGUuYmZfdHlwZSA9IEJVRl9BTVBEVSB8IEJVRl9BR0dSOwogCQlzZXFubyA9IGJmLT5iZl9zdGF0ZS5zZXFubzsKLQkJaWYgKCFiZl9maXJzdCkKLQkJCWJmX2ZpcnN0ID0gYmY7CiAKIAkJLyogZG8gbm90IHN0ZXAgb3ZlciBibG9jay1hY2sgd2luZG93ICovCiAJCWlmICghQkFXX1dJVEhJTih0aWQtPnNlcV9zdGFydCwgdGlkLT5iYXdfc2l6ZSwgc2Vxbm8pKSB7CkBAIC03ODAsNiArNzkzLDIxIEBACiAJCQlicmVhazsKIAkJfQogCisJCWlmICh0aWQtPmJhcl9pbmRleCA+IEFUSF9CQV9JTkRFWCh0aWQtPnNlcV9zdGFydCwgc2Vxbm8pKSB7CisJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0cyA9IHt9OworCQkJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOworCisJCQlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CisJCQlsaXN0X2FkZCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKKwkJCV9fc2tiX3VubGluayhza2IsICZ0aWQtPmJ1Zl9xKTsKKwkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIHNlcW5vKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWJmX2ZpcnN0KQorCQkJYmZfZmlyc3QgPSBiZjsKKwogCQlpZiAoIXJsKSB7CiAJCQlhZ2dyX2xpbWl0ID0gYXRoX2xvb2t1cF9yYXRlKHNjLCBiZiwgdGlkKTsKIAkJCXJsID0gMTsKQEAgLTExMjIsNiArMTE1MCw3IEBACiAJdHh0aWQtPnN0YXRlIHw9IEFHR1JfQUREQkFfUFJPR1JFU1M7CiAJdHh0aWQtPnBhdXNlZCA9IHRydWU7CiAJKnNzbiA9IHR4dGlkLT5zZXFfc3RhcnQgPSB0eHRpZC0+c2VxX25leHQ7CisJdHh0aWQtPmJhcl9pbmRleCA9IC0xOwogCiAJbWVtc2V0KHR4dGlkLT50eF9idWYsIDAsIHNpemVvZih0eHRpZC0+dHhfYnVmKSk7CiAJdHh0aWQtPmJhd19oZWFkID0gdHh0aWQtPmJhd190YWlsID0gMDsKQEAgLTExNTYsOSArMTE4NSw5IEBACiAJCXR4dGlkLT5zdGF0ZSB8PSBBR0dSX0NMRUFOVVA7CiAJZWxzZQogCQl0eHRpZC0+c3RhdGUgJj0gfkFHR1JfQUREQkFfQ09NUExFVEU7Ci0Jc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJYXRoX3R4X2ZsdXNoX3RpZChzYywgdHh0aWQpOworCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIH0KIAogdm9pZCBhdGhfdHhfYWdncl9zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBzdHJ1Y3QgYXRoX3NvZnRjICpzYywKQEAgLTE0MDAsOCArMTQyOSw2IEBACiAKIHN0YXRpYyB2b2lkIGF0aF9kcmFpbl90eHFfbGlzdChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBib29sIHJldHJ5X3R4KQotCV9fcmVsZWFzZXModHhxLT5heHFfbG9jaykKLQlfX2FjcXVpcmVzKHR4cS0+YXhxX2xvY2spCiB7CiAJc3RydWN0IGF0aF9idWYgKmJmLCAqbGFzdGJmOwogCXN0cnVjdCBsaXN0X2hlYWQgYmZfaGVhZDsKQEAgLTE0MjgsMTMgKzE0NTUsMTEgQEAKIAkJaWYgKGJmX2lzX2FtcGR1X25vdF9wcm9iaW5nKGJmKSkKIAkJCXR4cS0+YXhxX2FtcGR1X2RlcHRoLS07CiAKLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCQlpZiAoYmZfaXNhbXBkdShiZikpCiAJCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgJmJmX2hlYWQsICZ0cywgMCwKIAkJCQkJICAgICByZXRyeV90eCk7CiAJCWVsc2UKLQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDAsIDApOwotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCk7CiAJfQogfQogCkBAIC0xNTYxLDExICsxNTg2LDkgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmICghbGlzdF9lbXB0eSgmYWMtPnRpZF9xKSkgewotCQkJaWYgKCFhYy0+c2NoZWQpIHsKLQkJCQlhYy0+c2NoZWQgPSB0cnVlOwotCQkJCWxpc3RfYWRkX3RhaWwoJmFjLT5saXN0LCAmdHhxLT5heHFfYWNxKTsKLQkJCX0KKwkJaWYgKCFsaXN0X2VtcHR5KCZhYy0+dGlkX3EpICYmICFhYy0+c2NoZWQpIHsKKwkJCWFjLT5zY2hlZCA9IHRydWU7CisJCQlsaXN0X2FkZF90YWlsKCZhYy0+bGlzdCwgJnR4cS0+YXhxX2FjcSk7CiAJCX0KIAogCQlpZiAoYWMgPT0gbGFzdF9hYyB8fApAQCAtMTcwOCwxMCArMTczMSw2IEBACiAJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKIAliZi0+YmZfc3RhdGUuYmZfdHlwZSA9IDA7CiAKLQkvKiB1cGRhdGUgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGZvciBzdWJzZXF1ZW50IEFEREJBIHJlcXVlc3QgKi8KLQlpZiAodGlkKQotCQlJTkNSKHRpZC0+c2VxX3N0YXJ0LCBJRUVFODAyMTFfU0VRX01BWCk7Ci0KIAliZi0+YmZfbGFzdGJmID0gYmY7CiAJYXRoX3R4X2ZpbGxfZGVzYyhzYywgYmYsIHR4cSwgZmktPmZyYW1lbGVuKTsKIAlhdGhfdHhfdHhxYWRkYnVmKHNjLCB0eHEsICZiZl9oZWFkLCBmYWxzZSk7CkBAIC0xODE5LDcgKzE4MzgsNiBAQAogCXN0cnVjdCBhdGhfYnVmICpiZjsKIAl1OCB0aWRubzsKIAotCXNwaW5fbG9ja19iaCgmdHhjdGwtPnR4cS0+YXhxX2xvY2spOwogCWlmICgoc2MtPnNjX2ZsYWdzICYgU0NfT1BfVFhBR0dSKSAmJiB0eGN0bC0+YW4gJiYKIAkJaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJdGlkbm8gPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKVswXSAmCkBAIC0xODM4LDcgKzE4NTYsNyBAQAogCX0gZWxzZSB7CiAJCWJmID0gYXRoX3R4X3NldHVwX2J1ZmZlcihzYywgdHhjdGwtPnR4cSwgdGlkLCBza2IpOwogCQlpZiAoIWJmKQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm47CiAKIAkJYmYtPmJmX3N0YXRlLmJmc19wYXByZCA9IHR4Y3RsLT5wYXByZDsKIApAQCAtMTg0Nyw5ICsxODY1LDYgQEAKIAogCQlhdGhfdHhfc2VuZF9ub3JtYWwoc2MsIHR4Y3RsLT50eHEsIHRpZCwgc2tiKTsKIAl9Ci0KLW91dDoKLQlzcGluX3VubG9ja19iaCgmdHhjdGwtPnR4cS0+YXhxX2xvY2spOwogfQogCiAvKiBVcG9uIGZhaWx1cmUgY2FsbGVyIHNob3VsZCBmcmVlIHNrYiAqLwpAQCAtMTkxNiw5ICsxOTMxLDExIEBACiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHNjLT5odywgcSk7CiAJCXR4cS0+c3RvcHBlZCA9IDE7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAogCWF0aF90eF9zdGFydF9kbWEoc2MsIHNrYiwgdHhjdGwpOworCisJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MzcsOSArMTk1NCw2IEBACiAKIAlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19YTUlULCAiVFggY29tcGxldGU6IHNrYjogJXBcbiIsIHNrYik7CiAKLQlpZiAodHhfZmxhZ3MgJiBBVEhfVFhfQkFSKQotCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVV9OT19CQUNLOwotCiAJaWYgKCEodHhfZmxhZ3MgJiBBVEhfVFhfRVJST1IpKQogCQkvKiBGcmFtZSB3YXMgQUNLZWQgKi8KIAkJdHhfaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwpAQCAtMTk1NSw3ICsxOTY5LDcgQEAKIAkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKIAl9CiAKLQlpZiAoc2MtPnBzX2ZsYWdzICYgUFNfV0FJVF9GT1JfVFhfQUNLKSB7CisJaWYgKChzYy0+cHNfZmxhZ3MgJiBQU19XQUlUX0ZPUl9UWF9BQ0spICYmICF0eHEtPmF4cV9kZXB0aCkgewogCQlzYy0+cHNfZmxhZ3MgJj0gflBTX1dBSVRfRk9SX1RYX0FDSzsKIAkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUFMsCiAJCQkiR29pbmcgYmFjayB0byBzbGVlcCBhZnRlciBoYXZpbmcgcmVjZWl2ZWQgVFggc3RhdHVzICgweCVseClcbiIsCkBAIC0xOTY3LDcgKzE5ODEsNiBAQAogCiAJcSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCWlmICh0eHEgPT0gc2MtPnR4LnR4cV9tYXBbcV0pIHsKLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAkJaWYgKFdBUk5fT04oLS10eHEtPnBlbmRpbmdfZnJhbWVzIDwgMCkpCiAJCQl0eHEtPnBlbmRpbmdfZnJhbWVzID0gMDsKIApAQCAtMTk3NSw3ICsxOTg4LDYgQEAKIAkJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHNjLT5odywgcSk7CiAJCQl0eHEtPnN0b3BwZWQgPSAwOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAl9CiAKIAlpZWVlODAyMTFfdHhfc3RhdHVzKGh3LCBza2IpOwpAQCAtMTk4MywxNiArMTk5NSwxMyBAQAogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKLQkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rLCBpbnQgc2VuZGJhcikKKwkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBiZi0+YmZfbXBkdTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdHhfZmxhZ3MgPSAwOwogCi0JaWYgKHNlbmRiYXIpCi0JCXR4X2ZsYWdzID0gQVRIX1RYX0JBUjsKLQogCWlmICghdHhvaykKIAkJdHhfZmxhZ3MgfD0gQVRIX1RYX0VSUk9SOwogCkBAIC0yMDg0LDggKzIwOTMsNiBAQAogc3RhdGljIHZvaWQgYXRoX3R4X3Byb2Nlc3NfYnVmZmVyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAogCQkJCSAgc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpiZl9oZWFkKQotCV9fcmVsZWFzZXModHhxLT5heHFfbG9jaykKLQlfX2FjcXVpcmVzKHR4cS0+YXhxX2xvY2spCiB7CiAJaW50IHR4b2s7CiAKQEAgLTIwOTUsMTYgKzIxMDIsMTIgQEAKIAlpZiAoYmZfaXNfYW1wZHVfbm90X3Byb2JpbmcoYmYpKQogCQl0eHEtPmF4cV9hbXBkdV9kZXB0aC0tOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCiAJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewogCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgdHMsIDEsIHR4b2sgPyAwIDogMSwgdHhvayk7Ci0JCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsIGJmX2hlYWQsIHRzLCB0eG9rLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgYmZfaGVhZCwgdHMsIHR4b2spOwogCX0gZWxzZQogCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgdHMsIHR4b2ssIHRydWUpOwogCi0Jc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQogCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpCiAJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCmluZGV4IGY0Y2FlMWMuLmNiYTlkMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImNhcmw5MTcwLmgiCiAjaW5jbHVkZSAiZndjbWQuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCmluZGV4IDU5NDcyZTEuLmQxOWE5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jCkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJCSAqICAgIGZlZWRiYWNrIGVpdGhlciBbQ1RMX1JFUV9UWF9TVEFUVVMgbm90IHNldF0KIAkJCSAqLwogCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJaWVlZTgwMjExX2ZyZWVfdHhza2IoYXItPmh3LCBza2IpOwogCQkJcmV0dXJuOwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTE0MzIsNyArMTQzMiw3IEBACiAKIGVycl9mcmVlOgogCWFyLT50eF9kcm9wcGVkKys7Ci0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7CiB9CiAKIHZvaWQgY2FybDkxNzBfdHhfc2NoZWR1bGVyKHN0cnVjdCBhcjkxNzAgKmFyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYwppbmRleCA1MzY3YjEwLi41MDhlY2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGVidWcuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiYXRoLmgiCiAKIGNvbnN0IGNoYXIgKmF0aF9vcG1vZGVfdG9fc3RyaW5nKGVudW0gbmw4MDIxMV9pZnR5cGUgb3Btb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYwppbmRleCAzZjUwOGU1Li4xOWJlZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvaHcuYwpAQCAtMTQsNiArMTQsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAiYXRoLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMKaW5kZXggMTdiMGVmZC4uNGNmN2M1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2tleS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYwpAQCAtMTUsNiArMTUsNyBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvcmVnZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3JlZ2QuYwppbmRleCBmMWJlNTdmLi4xMGRlYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvcmVnZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9yZWdkLmMKQEAgLTE1LDExICsxNSwxNCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJyZWdkLmgiCiAjaW5jbHVkZSAicmVnZF9jb21tb24uaCIKIAorc3RhdGljIGludCBfX2F0aF9yZWdkX2luaXQoc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcpOworCiAvKgogICogVGhpcyBpcyBhIHNldCBvZiBjb21tb24gcnVsZXMgdXNlZCBieSBvdXIgd29ybGQgcmVndWxhdG9yeSBkb21haW5zLgogICogV2UgaGF2ZSAxMiB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbnMuIFRvIHNhdmUgc3BhY2Ugd2UgY29uc29saWRhdGUKQEAgLTM0NiwxMCArMzQ5LDI2IEBACiAJfQogfQogCitzdGF0aWMgdTE2IGF0aF9yZWdkX2ZpbmRfY291bnRyeV9ieV9uYW1lKGNoYXIgKmFscGhhMikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsbENvdW50cmllcyk7IGkrKykgeworCQlpZiAoIW1lbWNtcChhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSwgYWxwaGEyLCAyKSkKKwkJCXJldHVybiBhbGxDb3VudHJpZXNbaV0uY291bnRyeUNvZGU7CisJfQorCisJcmV0dXJuIC0xOworfQorCiBpbnQgYXRoX3JlZ19ub3RpZmllcl9hcHBseShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJICAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCwKIAkJCSAgIHN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVnKQogeworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBjb250YWluZXJfb2YocmVnLCBzdHJ1Y3QgYXRoX2NvbW1vbiwKKwkJCQkJCSByZWd1bGF0b3J5KTsKKwl1MTYgY291bnRyeV9jb2RlOworCiAJLyogV2UgYWx3YXlzIGFwcGx5IHRoaXMgKi8KIAlhdGhfcmVnX2FwcGx5X3JhZGFyX2ZsYWdzKHdpcGh5KTsKIApAQCAtMzYyLDE0ICszODEsMzcgQEAKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHJlcXVlc3QtPmluaXRpYXRvcikgewotCWNhc2UgTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUjoKIAljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFOgorCQkvKgorCQkgKiBJZiBjb21tb24tPnJlZ193b3JsZF9jb3B5IGlzIHdvcmxkIHJvYW1pbmcgaXQgbWVhbnMgd2UgKndlcmUqCisJCSAqIHdvcmxkIHJvYW1pbmcuLi4gc28gd2Ugbm93IGhhdmUgdG8gcmVzdG9yZSB0aGF0IGRhdGEuCisJCSAqLworCQlpZiAoIWF0aF9pc193b3JsZF9yZWdkKCZjb21tb24tPnJlZ193b3JsZF9jb3B5KSkKKwkJCWJyZWFrOworCisJCW1lbWNweShyZWcsICZjb21tb24tPnJlZ193b3JsZF9jb3B5LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdGhfcmVndWxhdG9yeSkpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVI6CiAJY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUjoKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09VTlRSWV9JRToKLQkJaWYgKGF0aF9pc193b3JsZF9yZWdkKHJlZykpCi0JCQlhdGhfcmVnX2FwcGx5X3dvcmxkX2ZsYWdzKHdpcGh5LCByZXF1ZXN0LT5pbml0aWF0b3IsCi0JCQkJCQkgIHJlZyk7CisJCWlmICghYXRoX2lzX3dvcmxkX3JlZ2QocmVnKSkKKwkJCWJyZWFrOworCisJCWNvdW50cnlfY29kZSA9IGF0aF9yZWdkX2ZpbmRfY291bnRyeV9ieV9uYW1lKHJlcXVlc3QtPmFscGhhMik7CisJCWlmIChjb3VudHJ5X2NvZGUgPT0gKHUxNikgLTEpCisJCQlicmVhazsKKworCQlyZWctPmN1cnJlbnRfcmQgPSBDT1VOVFJZX0VSRF9GTEFHOworCQlyZWctPmN1cnJlbnRfcmQgfD0gY291bnRyeV9jb2RlOworCisJCXByaW50ayhLRVJOX0RFQlVHICJhdGg6IHJlZ2RvbWFpbiAweCUweCB1cGRhdGVkIGJ5IENvdW50cnlJRVxuIiwKKwkJCXJlZy0+Y3VycmVudF9yZCk7CisJCV9fYXRoX3JlZ2RfaW5pdChyZWcpOworCisJCWF0aF9yZWdfYXBwbHlfd29ybGRfZmxhZ3Mod2lwaHksIHJlcXVlc3QtPmluaXRpYXRvciwgcmVnKTsKKwogCQlicmVhazsKIAl9CiAKQEAgLTUwNywxMSArNTQ5LDcgQEAKIAlyZWctPmN1cnJlbnRfcmQgPSAweDY0OwogfQogCi1pbnQKLWF0aF9yZWdkX2luaXQoc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcsCi0JICAgICAgc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkgICAgICBpbnQgKCpyZWdfbm90aWZpZXIpKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0KSkKK3N0YXRpYyBpbnQgX19hdGhfcmVnZF9pbml0KHN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVnKQogewogCXN0cnVjdCBjb3VudHJ5X2NvZGVfdG9fZW51bV9yZCAqY291bnRyeSA9IE5VTEw7CiAJdTE2IHJlZ2RtbjsKQEAgLTU4Miw3ICs2MjAsMjkgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiYXRoOiBSZWdwYWlyIHVzZWQ6IDB4JTB4XG4iLAogCQlyZWctPnJlZ3BhaXItPnJlZ0RtbkVudW0pOwogCisJcmV0dXJuIDA7Cit9CisKK2ludAorYXRoX3JlZ2RfaW5pdChzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZywKKwkgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCSAgICAgIGludCAoKnJlZ19ub3RpZmllcikoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3QpKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBjb250YWluZXJfb2YocmVnLCBzdHJ1Y3QgYXRoX2NvbW1vbiwKKwkJCQkJCSByZWd1bGF0b3J5KTsKKwlpbnQgcjsKKworCXIgPSBfX2F0aF9yZWdkX2luaXQocmVnKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoYXRoX2lzX3dvcmxkX3JlZ2QocmVnKSkKKwkJbWVtY3B5KCZjb21tb24tPnJlZ193b3JsZF9jb3B5LCByZWcsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGF0aF9yZWd1bGF0b3J5KSk7CisKIAlhdGhfcmVnZF9pbml0X3dpcGh5KHJlZywgd2lwaHksIHJlZ19ub3RpZmllcik7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woYXRoX3JlZ2RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKaW5kZXggNDQ3YTIzMC4uMzcxMTBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaApAQCAtMTAxMSwxNCArMTAxMSwxMCBAQAogfQogCiAvKiBNZXNzYWdlIHByaW50aW5nICovCi12b2lkIGI0M2luZm8oc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwotdm9pZCBiNDNlcnIoc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwotdm9pZCBiNDN3YXJuKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQgYjQzZGJnKHN0cnVjdCBiNDNfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgYjQzaW5mbyhzdHJ1Y3QgYjQzX3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoMiwgMykgdm9pZCBiNDNlcnIoc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgYjQzd2FybihzdHJ1Y3QgYjQzX3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoMiwgMykgdm9pZCBiNDNkYmcoc3RydWN0IGI0M193bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogCiAvKiBBIFdBUk5fT04gdmFyaWFudCB0aGF0IHZhbmlzaGVzIHdoZW4gYjQzIGRlYnVnZ2luZyBpcyBkaXNhYmxlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDdjZjQxMjUuLjU2MzRkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtMzQsNyArMzQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGNtY2lhLmMKaW5kZXggMTJiNmI0MC4uNzE0Y2FkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9wY21jaWEuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwppbmRleCBiMTdkOWI2Li5mMjQzNWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwpAQCAtMjI4LDEwICsyMjgsOTggQEAKIHN0YXRpYyB2b2lkIGI0M19yYWRpb18yMDU2X3NldHVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCQljb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzICplKQogeworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpOworCXUxNiBvZmZzZXQ7CisJdTggaTsKKwl1MTYgYmlhcywgY2JpYXMsIHBhZ19ib29zdCwgcGdhZ19ib29zdCwgbWl4Z19ib29zdCwgcGFkZ19ib29zdDsKKwogCUI0M19XQVJOX09OKGRldi0+cGh5LnJldiA8IDMpOwogCiAJYjQzX2NoYW50YWJfcmFkaW9fMjA1Nl91cGxvYWQoZGV2LCBlKTsKLQkvKiBUT0RPICovCisJYjIwNTZfdXBsb2FkX3N5bl9wbGxfY3AyKGRldiwgYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKTsKKworCWlmIChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiBCNDNfQkZMMl9HUExMX1dBUiAmJgorCSAgICBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMSwgMHgxRik7CisJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjIsIDB4MUYpOworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0NzE2KSB7CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0LCAweDE0KTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfQ1AyLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQsIDB4MEIpOworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9DUDIsIDB4MTQpOworCQl9CisJfQorCWlmIChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiBCNDNfQkZMMl9BUExMX1dBUiAmJgorCSAgICBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMSwgMHgxRik7CisJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjIsIDB4MUYpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0LCAweDA1KTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9DUDIsIDB4MEMpOworCX0KKworCWlmIChkZXYtPnBoeS5uLT5pcGEyZ19vbiAmJiBiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJb2Zmc2V0ID0gaSA/IEIyMDU2X1RYMSA6IEIyMDU2X1RYMDsKKwkJCWlmIChkZXYtPnBoeS5yZXYgPj0gNSkgeworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX1BBREdfSURBQywgMHhjYyk7CisKKwkJCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0NzE2KSB7CisJCQkJCWJpYXMgPSAweDQwOworCQkJCQljYmlhcyA9IDB4NDU7CisJCQkJCXBhZ19ib29zdCA9IDB4NTsKKwkJCQkJcGdhZ19ib29zdCA9IDB4MzM7CisJCQkJCW1peGdfYm9vc3QgPSAweDU1OworCQkJCX0gZWxzZSB7CisJCQkJCWJpYXMgPSAweDI1OworCQkJCQljYmlhcyA9IDB4MjA7CisJCQkJCXBhZ19ib29zdCA9IDB4NDsKKwkJCQkJcGdhZ19ib29zdCA9IDB4MDM7CisJCQkJCW1peGdfYm9vc3QgPSAweDY1OworCQkJCX0KKwkJCQlwYWRnX2Jvb3N0ID0gMHg3NzsKKworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19JTUFJTl9TVEFULAorCQkJCQliaWFzKTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUdfSUFVWF9TVEFULAorCQkJCQliaWFzKTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUdfQ0FTQ0JJQVMsCisJCQkJCWNiaWFzKTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUdfQk9PU1RfVFVORSwKKwkJCQkJcGFnX2Jvb3N0KTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9QR0FHX0JPT1NUX1RVTkUsCisJCQkJCXBnYWdfYm9vc3QpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX1BBREdfQk9PU1RfVFVORSwKKwkJCQkJcGFkZ19ib29zdCk7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfTUlYR19CT09TVF9UVU5FLAorCQkJCQltaXhnX2Jvb3N0KTsKKwkJCX0gZWxzZSB7CisJCQkJYmlhcyA9IGRldi0+cGh5LmlzXzQwbWh6ID8gMHg0MCA6IDB4MjA7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfSU5UUEFHX0lNQUlOX1NUQVQsCisJCQkJCWJpYXMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19JQVVYX1NUQVQsCisJCQkJCWJpYXMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19DQVNDQklBUywKKwkJCQkJMHgzMCk7CisJCQl9CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBvZmZzZXQgfCBCMjA1Nl9UWF9QQV9TUEFSRTEsIDB4ZWUpOworCQl9CisJfSBlbHNlIGlmIChkZXYtPnBoeS5uLT5pcGE1Z19vbiAmJiBiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJLyogVE9ETyAqLworCX0KKwogCXVkZWxheSg1MCk7CiAJLyogVkNPIGNhbGlicmF0aW9uICovCiAJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9WQ09DQUwxMiwgMHgwMCk7CkBAIC0zODcsNyArNDc1LDkgQEAKIAlpZiAobnBoeS0+aGFuZ19hdm9pZCkKIAkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDEpOwogCi0JaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJaWYgKGRldi0+cGh5LnJldiA+PSA3KSB7CisJCXR4cGlbMF0gPSB0eHBpWzFdID0gMzA7CisJfSBlbHNlIGlmIChkZXYtPnBoeS5yZXYgPj0gMykgewogCQl0eHBpWzBdID0gNDA7CiAJCXR4cGlbMV0gPSA0MDsKIAl9IGVsc2UgaWYgKHNwcm9tLT5yZXZpc2lvbiA8IDQpIHsKQEAgLTQxMSw2ICs1MDEsOSBAQAogCQkJdHhwaVsxXSA9IDkxOwogCQl9CiAJfQorCWlmIChkZXYtPnBoeS5yZXYgPCA3ICYmCisJICAgICh0eHBpWzBdIDwgNDAgfHwgdHhwaVswXSA+IDEwMCB8fCB0eHBpWzFdIDwgNDAgfHwgdHhwaVsxXSA+IDEwKSkKKwkJdHhwaVswXSA9IHR4cGlbMV0gPSA5MTsKIAogCS8qCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpAQCAtNDIxLDE1ICs1MTQsMzEgQEAKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7Ci0JCQkvKiBGSVhNRTogc3VwcG9ydCA1R0h6ICovCi0JCQl0eGdhaW4gPSBiNDNfbnRhYl90eF9nYWluX3JldjNwbHVzXzJnaHpbdHhwaVtpXV07CisJCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKKwkJCQl0eGdhaW4gPSAqKGI0M19ucGh5X2dldF9pcGFfZ2Fpbl90YWJsZShkZXYpICsKKwkJCQkJCXR4cGlbaV0pOworCQkJfSBlbHNlIGlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09CisJCQkJICAgSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQkJCS8qIEZJWE1FOiB1c2UgNUdIeiB0YWJsZXMgKi8KKwkJCQl0eGdhaW4gPQorCQkJCQliNDNfbnRhYl90eF9nYWluX3JldjNwbHVzXzJnaHpbdHhwaVtpXV07CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXYtPnBoeS5yZXYgPj0gNSAmJgorCQkJCSAgICBzcHJvbS0+ZmVtLmdoejUuZXh0cGFfZ2FpbiA9PSAzKQorCQkJCQk7IC8qIEZJWE1FOiA1R0h6X3R4Z2Fpbl9IaVB3ckVQQSAqLworCQkJCXR4Z2FpbiA9CisJCQkJCWI0M19udGFiX3R4X2dhaW5fcmV2M3BsdXNfMmdoelt0eHBpW2ldXTsKKwkJCX0KIAkJCXJhZGlvX2dhaW4gPSAodHhnYWluID4+IDE2KSAmIDB4MUZGRkY7CiAJCX0gZWxzZSB7CiAJCQl0eGdhaW4gPSBiNDNfbnRhYl90eF9nYWluX3JldjBfMV8yW3R4cGlbaV1dOwogCQkJcmFkaW9fZ2FpbiA9ICh0eGdhaW4gPj4gMTYpICYgMHgxRkZGOwogCQl9CiAKLQkJZGFjX2dhaW4gPSAodHhnYWluID4+IDgpICYgMHgzRjsKKwkJaWYgKGRldi0+cGh5LnJldiA+PSA3KQorCQkJZGFjX2dhaW4gPSAodHhnYWluID4+IDgpICYgMHg3OworCQllbHNlCisJCQlkYWNfZ2FpbiA9ICh0eGdhaW4gPj4gOCkgJiAweDNGOwogCQliYm11bHQgPSB0eGdhaW4gJiAweEZGOwogCiAJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewpAQCAtNDU5LDcgKzU2OCw4IEBACiAJCQl1MzIgdG1wMzI7CiAJCQl1MTYgcmVnID0gKGkgPT0gMCkgPwogCQkJCUI0M19OUEhZX1BBUERfRU4wIDogQjQzX05QSFlfUEFQRF9FTjE7Ci0JCQl0bXAzMiA9IGI0M19udGFiX3JlYWQoZGV2LCBCNDNfTlRBQjMyKDI2ICsgaSwgdHhwaVtpXSkpOworCQkJdG1wMzIgPSBiNDNfbnRhYl9yZWFkKGRldiwgQjQzX05UQUIzMigyNiArIGksCisJCQkJCQkJICAgICAgNTc2ICsgdHhwaVtpXSkpOwogCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgcmVnLCAweEUwMEYsICh1MzIpIHRtcDMyIDw8IDQpOwogCQkJYjQzX3BoeV9zZXQoZGV2LCByZWcsIDB4NCk7CiAJCX0KQEAgLTE0OTMsOCArMTYwMyw4IEBACiAJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwogCiAJLyogVFggdG8gUlggKi8KLQl1OCB0eDJyeF9ldmVudHNbOV0gPSB7IDB4NCwgMHgzLCAweDYsIDB4NSwgMHgyLCAweDEsIDB4OCwgMHgxRiB9OwotCXU4IHR4MnJ4X2RlbGF5c1s5XSA9IHsgOCwgNCwgMiwgMiwgNCwgNCwgNiwgMSB9OworCXU4IHR4MnJ4X2V2ZW50c1s4XSA9IHsgMHg0LCAweDMsIDB4NiwgMHg1LCAweDIsIDB4MSwgMHg4LCAweDFGIH07CisJdTggdHgycnhfZGVsYXlzWzhdID0geyA4LCA0LCAyLCAyLCA0LCA0LCA2LCAxIH07CiAJLyogUlggdG8gVFggKi8KIAl1OCByeDJ0eF9ldmVudHNfaXBhWzldID0geyAweDAsIDB4MSwgMHgyLCAweDgsIDB4NSwgMHg2LCAweEYsIDB4MywKIAkJCQkJMHgxRiB9OwpAQCAtMTUwNSw2ICsxNjE1LDkgQEAKIAl1MTYgdG1wMTY7CiAJdTMyIHRtcDMyOwogCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjNmLCAweDFmOCk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjQwLCAweDFmOCk7CisKIAl0bXAzMiA9IGI0M19udGFiX3JlYWQoZGV2LCBCNDNfTlRBQjMyKDMwLCAwKSk7CiAJdG1wMzIgJj0gMHhmZmZmZmY7CiAJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDMwLCAwKSwgdG1wMzIpOwpAQCAtMTUyMCwxMiArMTYzMywxMyBAQAogCWI0M19waHlfd3JpdGUoZGV2LCAweDJBRSwgMHgwMDBDKTsKIAogCS8qIFRYIHRvIFJYICovCi0JYjQzX25waHlfc2V0X3JmX3NlcXVlbmNlKGRldiwgMSwgdHgycnhfZXZlbnRzLCB0eDJyeF9kZWxheXMsIDkpOworCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIHR4MnJ4X2V2ZW50cywgdHgycnhfZGVsYXlzLAorCQkJCSBBUlJBWV9TSVpFKHR4MnJ4X2V2ZW50cykpOwogCiAJLyogUlggdG8gVFggKi8KIAlpZiAoYjQzX25waHlfaXBhKGRldikpCi0JCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIHJ4MnR4X2V2ZW50c19pcGEsCi0JCQkJCSByeDJ0eF9kZWxheXNfaXBhLCA5KTsKKwkJYjQzX25waHlfc2V0X3JmX3NlcXVlbmNlKGRldiwgMCwgcngydHhfZXZlbnRzX2lwYSwKKwkJCQlyeDJ0eF9kZWxheXNfaXBhLCBBUlJBWV9TSVpFKHJ4MnR4X2V2ZW50c19pcGEpKTsKIAlpZiAobnBoeS0+aHdfcGh5cnhjaGFpbiAhPSAzICYmCiAJICAgIG5waHktPmh3X3BoeXJ4Y2hhaW4gIT0gbnBoeS0+aHdfcGh5dHhjaGFpbikgewogCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKQEAgLTE1MzMsNyArMTY0Nyw4IEBACiAJCQlyeDJ0eF9kZWxheXNbNl0gPSAxOwogCQkJcngydHhfZXZlbnRzWzddID0gMHgxRjsKIAkJfQotCQliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCAxLCByeDJ0eF9ldmVudHMsIHJ4MnR4X2RlbGF5cywgOSk7CisJCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIHJ4MnR4X2V2ZW50cywgcngydHhfZGVsYXlzLAorCQkJCQkgQVJSQVlfU0laRShyeDJ0eF9ldmVudHMpKTsKIAl9CiAKIAl0bXAxNiA9IChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8KQEAgLTE1NDcsOCArMTY2Miw4IEBACiAKIAliNDNfbnBoeV9nYWluX2N0cmxfd29ya2Fyb3VuZHMoZGV2KTsKIAotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMig4LCAwKSwgMik7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDgsIDE2KSwgMik7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDApLCAyKTsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMTYpLCAyKTsKIAogCS8qIFRPRE8gKi8KIApAQCAtMTU2MCw2ICsxNjc1LDggQEAKIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhBX0JJQVNfQVVYLCAweDA3KTsKIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0xPQl9CSUFTLCAweDg4KTsKIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhBX0xPQl9CSUFTLCAweDg4KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0NNRkJfSURBQywgMHgwMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTUlYQV9DTUZCX0lEQUMsIDB4MDApOwogCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEdfQ01GQl9JREFDLCAweDAwKTsKIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhHX0NNRkJfSURBQywgMHgwMCk7CiAKQEAgLTE1ODQsMTggKzE3MDEsMTggQEAKIAkJCQkweDcwKTsKIAl9CiAKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjQsIDB4MDM5Qyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjI1LCAweDAzNTcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyNiwgMHgwMzE3KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjcsIDB4MDJENyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjI4LCAweDAzOUMpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyOSwgMHgwMzU3KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMkEsIDB4MDMxNyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjJCLCAweDAyRDcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyQywgMHgwMzlDKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMkQsIDB4MDM1Nyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjJFLCAweDAzMTcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyRiwgMHgwMkQ3KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjQsIDB4MDNlYik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjI1LCAweDAzZWIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyNiwgMHgwMzQxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjcsIDB4MDM0MSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjI4LCAweDA0MmIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyOSwgMHgwNDJiKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMmEsIDB4MDM4MSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjJiLCAweDAzODEpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyYywgMHgwNDJiKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMmQsIDB4MDQyYik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjJlLCAweDAzODEpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyZiwgMHgwMzgxKTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX25waHlfd29ya2Fyb3VuZHNfcmV2MV8yKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKQEAgLTM5MjgsNiArNDA0NSw3NiBAQAogCXJldHVybiAwOwogfQogCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BtdVNwdXJBdm9pZCAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcG11X3NwdXJfYXZvaWQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGF2b2lkKQoreworCXN0cnVjdCBiY21hX2Rydl9jYyBfX21heWJlX3VudXNlZCAqY2M7CisJdTMyIF9fbWF5YmVfdW51c2VkIHBtdV9jdGw7CisKKwlzd2l0Y2ggKGRldi0+ZGV2LT5idXNfdHlwZSkgeworI2lmZGVmIENPTkZJR19CNDNfQkNNQQorCWNhc2UgQjQzX0JVU19CQ01BOgorCQljYyA9ICZkZXYtPmRldi0+YmRldi0+YnVzLT5kcnZfY2M7CisJCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSA0MzIyNCB8fCBkZXYtPmRldi0+Y2hpcF9pZCA9PSA0MzIyNSkgeworCQkJaWYgKGF2b2lkKSB7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDAsIDB4MTE1MDAwMTApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgxLCAweDAwMEMwQzA2KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MiwgMHgwRjYwMGEwOCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDMsIDB4MDAwMDAwMDApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg0LCAweDIwMDFFOTIwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NSwgMHg4ODg4ODgxNSk7CisJCQl9IGVsc2UgeworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgwLCAweDExMTAwMDEwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MSwgMHgwMDBjMGMwNik7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDIsIDB4MDMwMDBhMDgpOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgzLCAweDAwMDAwMDAwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NCwgMHgyMDAwMDVjMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDUsIDB4ODg4ODg4MTUpOworCQkJfQorCQkJcG11X2N0bCA9IEJDTUFfQ0NfUE1VX0NUTF9QTExfVVBEOworCQl9IGVsc2UgaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDcxNikgeworCQkJaWYgKGF2b2lkKSB7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDAsIDB4MTE1MDAwNjApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgxLCAweDA4MEMwQzA2KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MiwgMHgwRjYwMDAwMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDMsIDB4MDAwMDAwMDApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg0LCAweDIwMDFFOTI0KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NSwgMHg4ODg4ODgxNSk7CisJCQl9IGVsc2UgeworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgwLCAweDExMTAwMDYwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MSwgMHgwODBjMGMwNik7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDIsIDB4MDMwMDAwMDApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgzLCAweDAwMDAwMDAwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NCwgMHgyMDAwMDVjMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDUsIDB4ODg4ODg4MTUpOworCQkJfQorCQkJcG11X2N0bCA9IEJDTUFfQ0NfUE1VX0NUTF9QTExfVVBEIHwKKwkJCQkgIEJDTUFfQ0NfUE1VX0NUTF9OT0lMUE9OVzsKKwkJfSBlbHNlIGlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQzMjIgfHwKKwkJCSAgIGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDM0MCB8fAorCQkJICAgZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzQxKSB7CisJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MCwgMHgxMTEwMDA3MCk7CisJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MSwgMHgxMDE0MTQwYSk7CisJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NSwgMHg4ODg4ODg1NCk7CisJCQlpZiAoYXZvaWQpCisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDIsIDB4MDUyMDE4MjgpOworCQkJZWxzZQorCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgyLCAweDA1MDAxODI4KTsKKwkJCXBtdV9jdGwgPSBCQ01BX0NDX1BNVV9DVExfUExMX1VQRDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCQliY21hX2NjX3NldDMyKGNjLCBCQ01BX0NDX1BNVV9DVEwsIHBtdV9jdGwpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CNDNfU1NCCisJY2FzZSBCNDNfQlVTX1NTQjoKKwkJLyogRklYTUUgKi8KKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQ2hhbnNwZWNTZXR1cCAqLwogc3RhdGljIHZvaWQgYjQzX25waHlfY2hhbm5lbF9zZXR1cChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCiAJCQkJY29uc3Qgc3RydWN0IGI0M19waHlfbl9zZm9fY2ZnICplLApAQCAtMzkzNSw2ICs0MTIyLDcgQEAKIHsKIAlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwogCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOworCWludCBjaCA9IG5ld19jaGFubmVsLT5od192YWx1ZTsKIAogCXUxNiBvbGRfYmFuZF81Z2h6OwogCXUzMiB0bXAzMjsKQEAgLTM5NzQsOCArNDE2Miw0MSBAQAogCiAJYjQzX25waHlfdHhfbHBfZmJ3KGRldik7CiAKLQlpZiAoZGV2LT5waHkucmV2ID49IDMgJiYgMCkgewotCQkvKiBUT0RPICovCisJaWYgKGRldi0+cGh5LnJldiA+PSAzICYmCisJICAgIGRldi0+cGh5Lm4tPnNwdXJfYXZvaWQgIT0gQjQzX1NQVVJfQVZPSURfRElTQUJMRSkgeworCQlib29sIGF2b2lkID0gZmFsc2U7CisJCWlmIChkZXYtPnBoeS5uLT5zcHVyX2F2b2lkID09IEI0M19TUFVSX0FWT0lEX0ZPUkNFKSB7CisJCQlhdm9pZCA9IHRydWU7CisJCX0gZWxzZSBpZiAoIWI0M19jaGFubmVsX3R5cGVfaXNfNDBtaHoocGh5LT5jaGFubmVsX3R5cGUpKSB7CisJCQlpZiAoKGNoID49IDUgJiYgY2ggPD0gOCkgfHwgY2ggPT0gMTMgfHwgY2ggPT0gMTQpCisJCQkJYXZvaWQgPSB0cnVlOworCQl9IGVsc2UgeyAvKiA0ME1IeiAqLworCQkJaWYgKG5waHktPmFiYW5kX3NwdXJ3YXJfZW4gJiYKKwkJCSAgICAoY2ggPT0gMzggfHwgY2ggPT0gMTAyIHx8IGNoID09IDExOCkpCisJCQkJYXZvaWQgPSBkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQ3MTY7CisJCX0KKworCQliNDNfbnBoeV9wbXVfc3B1cl9hdm9pZChkZXYsIGF2b2lkKTsKKworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjIgfHwgZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjQgfHwKKwkJICAgIGRldi0+ZGV2LT5jaGlwX2lkID09IDQzMjI1KSB7CisJCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX1RTRl9DTEtfRlJBQ19MT1csCisJCQkJICAgIGF2b2lkID8gMHg1MzQxIDogMHg4ODg5KTsKKwkJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fVFNGX0NMS19GUkFDX0hJR0gsIDB4OCk7CisJCX0KKworCQlpZiAoZGV2LT5waHkucmV2ID09IDMgfHwgZGV2LT5waHkucmV2ID09IDQpCisJCQk7IC8qIFRPRE86IHJlc2V0IFBMTCAqLworCisJCWlmIChhdm9pZCkKKwkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQkJDRkcsIEI0M19OUEhZX0JCQ0ZHX1JTVFJYKTsKKwkJZWxzZQorCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQkJDRkcsCisJCQkJICAgICB+QjQzX05QSFlfQkJDRkdfUlNUUlggJiAweEZGRkYpOworCisJCWI0M19ucGh5X3Jlc2V0X2NjYShkZXYpOworCisJCS8qIHdsIHNldHMgdXNlbGVzcyBwaHlfaXNzcHVyYXZvaWQgaGVyZSAqLwogCX0KIAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9OREFUQVRfRFVQNDAsIDB4MzgzMCk7CkBAIC00MDU1LDEwICs0Mjc2LDEzIEBACiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gcGh5LT5uOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAogCW1lbXNldChucGh5LCAwLCBzaXplb2YoKm5waHkpKTsKIAogCW5waHktPmhhbmdfYXZvaWQgPSAocGh5LT5yZXYgPT0gMyB8fCBwaHktPnJldiA9PSA0KTsKKwlucGh5LT5zcHVyX2F2b2lkID0gKHBoeS0+cmV2ID49IDMpID8KKwkJCQlCNDNfU1BVUl9BVk9JRF9BVVRPIDogQjQzX1NQVVJfQVZPSURfRElTQUJMRTsKIAlucGh5LT5nYWluX2Jvb3N0ID0gdHJ1ZTsgLyogdGhpcyB3YXkgd2UgZm9sbG93IHdsLCBhc3N1bWUgaXQgaXMgdHJ1ZSAqLwogCW5waHktPnR4cnhfY2hhaW4gPSAyOyAvKiBzdGggZGlmZmVyZW50IHRoYW4gMCBhbmQgMSBmb3Igbm93ICovCiAJbnBoeS0+cGh5cnhjaGFpbiA9IDM7IC8qIHRvIGF2b2lkIGI0M19ucGh5X3NldF9yeF9jb3JlX3N0YXRlIGxpa2Ugd2wgKi8KQEAgLTQwNjcsNiArNDI5MSwzOCBAQAogCSAqIDB4N2YgPT0gMTI3IGFuZCB3ZSBjaGVjayBmb3IgMTI4IHdoZW4gcmVzdG9yaW5nIFRYIHB3ciBjdGwuICovCiAJbnBoeS0+dHhfcHdyX2lkeFswXSA9IDEyODsKIAlucGh5LT50eF9wd3JfaWR4WzFdID0gMTI4OworCisJLyogSGFyZHdhcmUgVFggcG93ZXIgY29udHJvbCBhbmQgNUdIeiBwb3dlciBnYWluICovCisJbnBoeS0+dHhwd3JjdHJsID0gZmFsc2U7CisJbnBoeS0+cHdnX2dhaW5fNWdoeiA9IGZhbHNlOworCWlmIChkZXYtPnBoeS5yZXYgPj0gMyB8fAorCSAgICAoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFICYmCisJICAgICAoZGV2LT5kZXYtPmNvcmVfcmV2ID09IDExIHx8IGRldi0+ZGV2LT5jb3JlX3JldiA9PSAxMikpKSB7CisJCW5waHktPnR4cHdyY3RybCA9IHRydWU7CisJCW5waHktPnB3Z19nYWluXzVnaHogPSB0cnVlOworCX0gZWxzZSBpZiAoc3Byb20tPnJldmlzaW9uID49IDQpIHsKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAyICYmCisJCSAgICAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfVFhQV1JDVFJMX0VOKSkgeworCQkJbnBoeS0+dHhwd3JjdHJsID0gdHJ1ZTsKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCQkJaWYgKGRldi0+ZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX1NTQiAmJgorCQkJICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENJKSB7CisJCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPQorCQkJCQlkZXYtPmRldi0+c2Rldi0+YnVzLT5ob3N0X3BjaTsKKwkJCQlpZiAocGRldi0+ZGV2aWNlID09IDB4NDMyOCB8fAorCQkJCSAgICBwZGV2LT5kZXZpY2UgPT0gMHg0MzJhKQorCQkJCQlucGh5LT5wd2dfZ2Fpbl81Z2h6ID0gdHJ1ZTsKKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UgaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyXzVHX1BXUkdBSU4pIHsKKwkJCW5waHktPnB3Z19nYWluXzVnaHogPSB0cnVlOworCQl9CisJfQorCisJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCW5waHktPmlwYTJnX29uID0gc3Byb20tPmZlbS5naHoyLmV4dHBhX2dhaW4gPT0gMjsKKwkJbnBoeS0+aXBhNWdfb24gPSBzcHJvbS0+ZmVtLmdoejUuZXh0cGFfZ2FpbiA9PSAyOworCX0KIH0KIAogc3RhdGljIHZvaWQgYjQzX25waHlfb3BfZnJlZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCmluZGV4IGZiZjUyMDIuLjU2ZWY5N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCkBAIC03MTYsNiArNzE2LDEyIEBACiAKIHN0cnVjdCBiNDNfd2xkZXY7CiAKK2VudW0gYjQzX25waHlfc3B1cl9hdm9pZCB7CisJQjQzX1NQVVJfQVZPSURfRElTQUJMRSwKKwlCNDNfU1BVUl9BVk9JRF9BVVRPLAorCUI0M19TUFVSX0FWT0lEX0ZPUkNFLAorfTsKKwogc3RydWN0IGI0M19jaGFuc3BlYyB7CiAJdTE2IGNlbnRlcl9mcmVxOwogCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwpAQCAtNzg1LDYgKzc5MSw3IEBACiAJdTE2IG1waGFzZV90eGNhbF9iZXN0Y29lZmZzWzExXTsKIAogCWJvb2wgdHhwd3JjdHJsOworCWJvb2wgcHdnX2dhaW5fNWdoejsKIAl1OCB0eF9wd3JfaWR4WzJdOwogCXUxNiBhZGpfcHdyX3RibFs4NF07CiAJdTE2IHR4Y2FsX2JibXVsdDsKQEAgLTgwMyw2ICs4MTAsNyBAQAogCXUxNiBjbGFzc2lmaWVyX3N0YXRlOwogCXUxNiBjbGlwX3N0YXRlWzJdOwogCisJZW51bSBiNDNfbnBoeV9zcHVyX2F2b2lkIHNwdXJfYXZvaWQ7CiAJYm9vbCBhYmFuZF9zcHVyd2FyX2VuOwogCWJvb2wgZ2JhbmRfc3B1cndhcl9lbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmMKaW5kZXggYTAxZjc3Ni4uY2UwMzdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5jCkBAIC0xNTcyLDE0ICsxNTcyLDE0IEBACiAJW0IyMDU2X1NZTl9QTExfWFRBTDVdCQk9IHsgLmdoejUgPSAweDAwNzcsIC5naHoyID0gMHgwMDc3LCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9YVEFMNl0JCT0geyAuZ2h6NSA9IDB4MDAwNywgLmdoejIgPSAweDAwMDcsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUExMX1JFRkRJVl0JCT0geyAuZ2h6NSA9IDB4MDAwMSwgLmdoejIgPSAweDAwMDEsIE5PVVBMT0FELCB9LAotCVtCMjA1Nl9TWU5fUExMX1BGRF0JCT0geyAuZ2h6NSA9IDB4MDAwNCwgLmdoejIgPSAweDAwMDQsIE5PVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX1BGRF0JCT0geyAuZ2h6NSA9IDB4MDAwNiwgLmdoejIgPSAweDAwMDYsIFVQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9DUDFdCQk9IHsgLmdoejUgPSAweDAwMGYsIC5naHoyID0gMHgwMDBmLCBOT1VQTE9BRCwgfSwKLQlbQjIwNTZfU1lOX1BMTF9DUDJdCQk9IHsgLmdoejUgPSAweDAwMzAsIC5naHoyID0gMHgwMDMwLCBOT1VQTE9BRCwgfSwKKwlbQjIwNTZfU1lOX1BMTF9DUDJdCQk9IHsgLmdoejUgPSAweDAwM2YsIC5naHoyID0gMHgwMDNmLCBVUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9QTExfQ1AzXQkJPSB7IC5naHo1ID0gMHgwMDMyLCAuZ2h6MiA9IDB4MDAzMiwgTk9VUExPQUQsIH0sCi0JW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjFdCT0geyAuZ2h6NSA9IDB4MDAwZCwgLmdoejIgPSAweDAwMGQsIE5PVVBMT0FELCB9LAotCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyXQk9IHsgLmdoejUgPSAweDAwMGQsIC5naHoyID0gMHgwMDBkLCBOT1VQTE9BRCwgfSwKKwlbQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMV0JPSB7IC5naHo1ID0gMHgwMDA2LCAuZ2h6MiA9IDB4MDAwNiwgVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyXQk9IHsgLmdoejUgPSAweDAwMDYsIC5naHoyID0gMHgwMDA2LCBVUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjNdCT0geyAuZ2h6NSA9IDB4MDAwNCwgLmdoejIgPSAweDAwMDQsIE5PVVBMT0FELCB9LAotCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0XQk9IHsgLmdoejUgPSAweDAwMDYsIC5naHoyID0gMHgwMDA2LCBOT1VQTE9BRCwgfSwKKwlbQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSNF0JPSB7IC5naHo1ID0gMHgwMDJiLCAuZ2h6MiA9IDB4MDAyYiwgVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI1XQk9IHsgLmdoejUgPSAweDAwMDEsIC5naHoyID0gMHgwMDAxLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9NTUQxXQkJPSB7IC5naHo1ID0gMHgwMDFjLCAuZ2h6MiA9IDB4MDAxYywgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9QTExfTU1EMl0JCT0geyAuZ2h6NSA9IDB4MDAwMiwgLmdoejIgPSAweDAwMDIsIE5PVVBMT0FELCB9LApAQCAtOTA1NSw2ICs5MDU1LDIxIEBACiAJCQkJQjIwNTZfUlgxLCBwdHMtPnJ4LCBwdHMtPnJ4X2xlbmd0aCk7CiB9CiAKK3ZvaWQgYjIwNTZfdXBsb2FkX3N5bl9wbGxfY3AyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBnaHo1KQoreworCXN0cnVjdCBiMjA1Nl9pbml0dGFic19wdHMgKnB0czsKKwljb25zdCBzdHJ1Y3QgYjIwNTZfaW5pdHRhYl9lbnRyeSAqZTsKKworCWlmIChkZXYtPnBoeS5yZXYgPj0gQVJSQVlfU0laRShiMjA1Nl9pbml0dGFicykpIHsKKwkJQjQzX1dBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJcHRzID0gJmIyMDU2X2luaXR0YWJzW2Rldi0+cGh5LnJldl07CisJZSA9ICZwdHMtPnN5bltCMjA1Nl9TWU5fUExMX0NQMl07CisKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0NQMiwgZ2h6NSA/IGUtPmdoejUgOiBlLT5naHoyKTsKK30KKwogY29uc3Qgc3RydWN0IGI0M19ucGh5X2NoYW5uZWx0YWJfZW50cnlfcmV2MyAqCiBiNDNfbnBoeV9nZXRfY2hhbnRhYmVudF9yZXYzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IGZyZXEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuaAppbmRleCBhNzE1OWQ4Li41Yjg2NjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmgKQEAgLTEwOTAsNiArMTA5MCw3IEBACiAKIHZvaWQgYjIwNTZfdXBsb2FkX2luaXR0YWJzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCSAgIGJvb2wgZ2h6NSwgYm9vbCBpZ25vcmVfdXBsb2FkZmxhZyk7Cit2b2lkIGIyMDU2X3VwbG9hZF9zeW5fcGxsX2NwMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgZ2h6NSk7CiAKIC8qIEdldCB0aGUgTlBIWSBDaGFubmVsIFN3aXRjaCBUYWJsZSBlbnRyeSBmb3IgYSBjaGFubmVsLgogICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgdG8gZmluZCBhbiBlbnRyeS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKaW5kZXggN2IzMjZmMi4uMzI1MjU2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKQEAgLTIxNzEsNiArMjE3MSw0OCBAQAogCTB4MDAwMCwgMHgwMDAwLAogfTsKIAorLyogdm9sYXRpbGUgIHRhYmxlcywgUEhZIHJldmlzaW9uID49IDMgKi8KKworLyogaW5kZXhlZCBieSBhbnRzd2N0bDJnICovCitzdGF0aWMgY29uc3QgdTE2IGI0M19udGFiX2FudHN3Y3RsMmdfcjNbNF1bMzJdID0geworCXsKKwkJMHgwMDgyLCAweDAwODIsIDB4MDIxMSwgMHgwMjIyLCAweDAzMjgsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDE0NCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMTg4LCAweDAwMDAsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwODIsIDB4MDA4MiwgMHgwMjExLCAweDAyMjIsCisJCTB4MDMyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMTQ0LAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAxODgsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwMDAsCisJfSwKKwl7CisJCTB4MDAyMiwgMHgwMDIyLCAweDAwMTEsIDB4MDAyMiwgMHgwMDIyLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMTEsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAyMiwgMHgwMDAwLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDIyLCAweDAwMjIsIDB4MDAxMSwgMHgwMDIyLAorCQkweDAwMjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAxMSwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIyLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLAorCX0sCisJeworCQkweDAwODgsIDB4MDA4OCwgMHgwMDQ0LCAweDAwODgsIDB4MDA4OCwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDQ0LCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwODgsIDB4MDAwMCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDA4OCwgMHgwMDg4LCAweDAwNDQsIDB4MDA4OCwKKwkJMHgwMDg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNDQsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA4OCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwKKwl9LAorCXsKKwkJMHgwMDIyLCAweDAwMjIsIDB4MDAxMSwgMHgwMDIyLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAxMSwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDIyLCAweDAwMDAsIDB4MDAwMCwKKwkJMHgwM2NjLCAweDAwMjIsIDB4MDAyMiwgMHgwMDExLCAweDAwMjIsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDExLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjIsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAzY2MsCisJfQorfTsKKwogLyogVFggZ2FpbiB0YWJsZXMgKi8KIGNvbnN0IHUzMiBiNDNfbnRhYl90eF9nYWluX3JldjBfMV8yW10gPSB7CiAJMHgwM2NjMmI0NCwgMHgwM2NjMmI0MiwgMHgwM2NjMmE0NCwgMHgwM2NjMmE0MiwKQEAgLTI2NTIsNyArMjY5NCw3IEBACiBjb25zdCBzMTYgdGJsX3R4X2ZpbHRlcl9jb2VmX3JldjRbN11bMTVdID0gewogCXsgIC0zNzcsICAgMTM3LCAgLTQwNywgICAyMDgsIC0xNTI3LAogCSAgICA5NTYsICAgIDkzLCAgIDE4NiwgICAgOTMsICAgMjMwLAotCSAgICAtNDQsICAgMjMwLCAgICAyMCwgIC0xOTEsICAgMjAxIH0sCisJICAgIC00NCwgICAyMzAsICAgMjAxLCAgLTE5MSwgICAyMDEgfSwKIAl7ICAgLTc3LCAgICAyMCwgICAtOTgsICAgIDQ5LCAgIC05MywKIAkgICAgIDYwLCAgICA1NiwgICAxMTEsICAgIDU2LCAgICAyNiwKIAkgICAgIC01LCAgICAyNiwgICAgMzQsICAgLTMyLCAgICAzNCB9LApAQCAtMjgzOCw5ICsyODgwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBCNDNfTlRBQl8zMkJJVDoKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCk7Ci0JCXZhbHVlID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUhJKTsKLQkJdmFsdWUgPDw9IDE2OwotCQl2YWx1ZSB8PSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQl2YWx1ZSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCXZhbHVlIHw9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSkgPDwgMTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUI0M19XQVJOX09OKDEpOwpAQCAtMjg2NCw2ICsyOTA1LDEyIEBACiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZWxlbWVudHM7IGkrKykgeworCQkvKiBBdXRvIGluY3JlbWVudCBicm9rZW4gKyBjYWNoaW5nIGlzc3VlIG9uIEJDTTQzMjI0PyAqLworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjQgJiYgZGV2LT5kZXYtPmNoaXBfcmV2ID09IDEpIHsKKwkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgb2Zmc2V0ICsgaSk7CisJCX0KKwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBCNDNfTlRBQl84QklUOgogCQkJKmRhdGEgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pICYgMHhGRjsKQEAgLTI4NzQsOSArMjkyMSwxMCBAQAogCQkJZGF0YSArPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgQjQzX05UQUJfMzJCSVQ6Ci0JCQkqKCh1MzIgKilkYXRhKSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSk7Ci0JCQkqKCh1MzIgKilkYXRhKSA8PD0gMTY7Ci0JCQkqKCh1MzIgKilkYXRhKSB8PSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQkJKigodTMyICopZGF0YSkgPQorCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCQkqKCh1MzIgKilkYXRhKSB8PQorCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSkgPDwgMTY7CiAJCQlkYXRhICs9IDQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTI5MzIsNiArMjk4MCwxMyBAQAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCBvZmZzZXQpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2VsZW1lbnRzOyBpKyspIHsKKwkJLyogQXV0byBpbmNyZW1lbnQgYnJva2VuICsgY2FjaGluZyBpc3N1ZSBvbiBCQ000MzIyND8gKi8KKwkJaWYgKChvZmZzZXQgPj4gMTApID09IDkgJiYgZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjQgJiYKKwkJICAgIGRldi0+ZGV2LT5jaGlwX3JldiA9PSAxKSB7CisJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCArIGkpOworCQl9CisKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQjQzX05UQUJfOEJJVDoKIAkJCXZhbHVlID0gKmRhdGE7CkBAIC0yOTk5LDYgKzMwNTQsOCBAQAogCX0gd2hpbGUgKDApCiB2b2lkIGI0M19ucGh5X3JldjNwbHVzX3RhYmxlc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CisKIAkvKiBTdGF0aWMgdGFibGVzICovCiAJbnRhYl91cGxvYWRfcjMoZGV2LCBCNDNfTlRBQl9GUkFNRVNUUlVDVF9SMywgYjQzX250YWJfZnJhbWVzdHJ1Y3RfcjMpOwogCW50YWJfdXBsb2FkX3IzKGRldiwgQjQzX05UQUJfUElMT1RfUjMsIGI0M19udGFiX3BpbG90X3IzKTsKQEAgLTMwMjksNyArMzA4NiwxMSBAQAogCW50YWJfdXBsb2FkX3IzKGRldiwgQjQzX05UQUJfQzFfTE9GRUVEVEhfUjMsIGI0M19udGFiX2xvZnRsdDFfcjMpOwogCiAJLyogVm9sYXRpbGUgdGFibGVzICovCi0JLyogVE9ETyAqLworCWlmIChzcHJvbS0+ZmVtLmdoejIuYW50c3dsdXQgPCBBUlJBWV9TSVpFKGI0M19udGFiX2FudHN3Y3RsMmdfcjMpKQorCQludGFiX3VwbG9hZF9yMyhkZXYsIEI0M19OVEFCX0FOVF9TV19DVExfUjMsCisJCQkgICAgICAgYjQzX250YWJfYW50c3djdGwyZ19yM1tzcHJvbS0+ZmVtLmdoejIuYW50c3dsdXRdKTsKKwllbHNlCisJCUI0M19XQVJOX09OKDEpOwogfQogCiBzdHJ1Y3QgbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kX2VudHJ5ICpiNDNfbnBoeV9nZXRfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnQoCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCmluZGV4IGE4MTY5NmIuLjk3MDM4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My90YWJsZXNfbnBoeS5oCkBAIC0xMjYsMjYgKzEyNiwyOSBAQAogI2RlZmluZSBCNDNfTlRBQl9DMV9MT0ZFRURUSAkJQjQzX05UQUIxNigweDFCLCAweDFDMCkgLyogTG9jYWwgT3NjaWxsYXRvciBGZWVkIFRocm91Z2ggTG9va3VwIFRhYmxlIENvcmUgMSAqLwogI2RlZmluZSBCNDNfTlRBQl9DMV9MT0ZFRURUSF9TSVpFCTEyOAogCisvKiBWb2xhdGlsZSBOLVBIWSB0YWJsZXMsIFBIWSByZXZpc2lvbiA+PSAzICovCisjZGVmaW5lIEI0M19OVEFCX0FOVF9TV19DVExfUjMJCUI0M19OVEFCMTYoIDksICAgMCkgLyogYW50ZW5uYSBzb2Z0d2FyZSBjb250cm9sICovCisKIC8qIFN0YXRpYyBOLVBIWSB0YWJsZXMsIFBIWSByZXZpc2lvbiA+PSAzICovCi0jZGVmaW5lIEI0M19OVEFCX0ZSQU1FU1RSVUNUX1IzCQlCNDNfTlRBQjMyKDEwLCAwMDApIC8qIGZyYW1lIHN0cnVjdCAgKi8KLSNkZWZpbmUgQjQzX05UQUJfUElMT1RfUjMJCUI0M19OVEFCMTYoMTEsIDAwMCkgLyogcGlsb3QgICovCi0jZGVmaW5lIEI0M19OVEFCX1RNQVBfUjMJCUI0M19OVEFCMzIoMTIsIDAwMCkgLyogVE0gQVAgICovCi0jZGVmaW5lIEI0M19OVEFCX0lOVExFVkVMX1IzCQlCNDNfTlRBQjMyKDEzLCAwMDApIC8qIElOVCBMViAgKi8KLSNkZWZpbmUgQjQzX05UQUJfVERUUk5fUjMJCUI0M19OVEFCMzIoMTQsIDAwMCkgLyogVEQgVFJOICAqLwotI2RlZmluZSBCNDNfTlRBQl9OT0lTRVZBUjBfUjMJCUI0M19OVEFCMzIoMTYsIDAwMCkgLyogbm9pc2UgdmFyaWFuY2UgMCAgKi8KKyNkZWZpbmUgQjQzX05UQUJfRlJBTUVTVFJVQ1RfUjMJCUI0M19OVEFCMzIoMTAsICAgMCkgLyogZnJhbWUgc3RydWN0ICAqLworI2RlZmluZSBCNDNfTlRBQl9QSUxPVF9SMwkJQjQzX05UQUIxNigxMSwgICAwKSAvKiBwaWxvdCAgKi8KKyNkZWZpbmUgQjQzX05UQUJfVE1BUF9SMwkJQjQzX05UQUIzMigxMiwgICAwKSAvKiBUTSBBUCAgKi8KKyNkZWZpbmUgQjQzX05UQUJfSU5UTEVWRUxfUjMJCUI0M19OVEFCMzIoMTMsICAgMCkgLyogSU5UIExWICAqLworI2RlZmluZSBCNDNfTlRBQl9URFRSTl9SMwkJQjQzX05UQUIzMigxNCwgICAwKSAvKiBURCBUUk4gICovCisjZGVmaW5lIEI0M19OVEFCX05PSVNFVkFSMF9SMwkJQjQzX05UQUIzMigxNiwgICAwKSAvKiBub2lzZSB2YXJpYW5jZSAwICAqLwogI2RlZmluZSBCNDNfTlRBQl9OT0lTRVZBUjFfUjMJCUI0M19OVEFCMzIoMTYsIDEyOCkgLyogbm9pc2UgdmFyaWFuY2UgMSAgKi8KLSNkZWZpbmUgQjQzX05UQUJfTUNTX1IzCQkJQjQzX05UQUIxNigxOCwgMDAwKSAvKiBNQ1MgICovCisjZGVmaW5lIEI0M19OVEFCX01DU19SMwkJCUI0M19OVEFCMTYoMTgsICAgMCkgLyogTUNTICAqLwogI2RlZmluZSBCNDNfTlRBQl9UREkyMEEwX1IzCQlCNDNfTlRBQjMyKDE5LCAxMjgpIC8qIFRESSAyMC8wICAqLwogI2RlZmluZSBCNDNfTlRBQl9UREkyMEExX1IzCQlCNDNfTlRBQjMyKDE5LCAyNTYpIC8qIFRESSAyMC8xICAqLwogI2RlZmluZSBCNDNfTlRBQl9UREk0MEEwX1IzCQlCNDNfTlRBQjMyKDE5LCA2NDApIC8qIFRESSA0MC8wICAqLwogI2RlZmluZSBCNDNfTlRBQl9UREk0MEExX1IzCQlCNDNfTlRBQjMyKDE5LCA3NjgpIC8qIFRESSA0MC8xICAqLwotI2RlZmluZSBCNDNfTlRBQl9QSUxPVExUX1IzCQlCNDNfTlRBQjMyKDIwLCAwMDApIC8qIFBMVCBsb29rdXAgICovCi0jZGVmaW5lIEI0M19OVEFCX0NIQU5FU1RfUjMJCUI0M19OVEFCMzIoMjIsIDAwMCkgLyogY2hhbm5lbCBlc3RpbWF0ZSAgKi8KLSNkZWZpbmUgQjQzX05UQUJfRlJBTUVMVF9SMwkJQjQzX05UQUI4ICgyNCwgMDAwKSAvKiBmcmFtZSBsb29rdXAgICovCi0jZGVmaW5lIEI0M19OVEFCX0MwX0VTVFBMVF9SMwkJQjQzX05UQUI4ICgyNiwgMDAwKSAvKiBlc3RpbWF0ZWQgcG93ZXIgbG9va3VwIDAgICovCi0jZGVmaW5lIEI0M19OVEFCX0MxX0VTVFBMVF9SMwkJQjQzX05UQUI4ICgyNywgMDAwKSAvKiBlc3RpbWF0ZWQgcG93ZXIgbG9va3VwIDEgICovCi0jZGVmaW5lIEI0M19OVEFCX0MwX0FESlBMVF9SMwkJQjQzX05UQUI4ICgyNiwgMDY0KSAvKiBhZGp1c3RlZCBwb3dlciBsb29rdXAgMCAgKi8KLSNkZWZpbmUgQjQzX05UQUJfQzFfQURKUExUX1IzCQlCNDNfTlRBQjggKDI3LCAwNjQpIC8qIGFkanVzdGVkIHBvd2VyIGxvb2t1cCAxICAqLworI2RlZmluZSBCNDNfTlRBQl9QSUxPVExUX1IzCQlCNDNfTlRBQjMyKDIwLCAgIDApIC8qIFBMVCBsb29rdXAgICovCisjZGVmaW5lIEI0M19OVEFCX0NIQU5FU1RfUjMJCUI0M19OVEFCMzIoMjIsICAgMCkgLyogY2hhbm5lbCBlc3RpbWF0ZSAgKi8KKyNkZWZpbmUgQjQzX05UQUJfRlJBTUVMVF9SMwkJIEI0M19OVEFCOCgyNCwgICAwKSAvKiBmcmFtZSBsb29rdXAgICovCisjZGVmaW5lIEI0M19OVEFCX0MwX0VTVFBMVF9SMwkJIEI0M19OVEFCOCgyNiwgICAwKSAvKiBlc3RpbWF0ZWQgcG93ZXIgbG9va3VwIDAgICovCisjZGVmaW5lIEI0M19OVEFCX0MxX0VTVFBMVF9SMwkJIEI0M19OVEFCOCgyNywgICAwKSAvKiBlc3RpbWF0ZWQgcG93ZXIgbG9va3VwIDEgICovCisjZGVmaW5lIEI0M19OVEFCX0MwX0FESlBMVF9SMwkJIEI0M19OVEFCOCgyNiwgIDY0KSAvKiBhZGp1c3RlZCBwb3dlciBsb29rdXAgMCAgKi8KKyNkZWZpbmUgQjQzX05UQUJfQzFfQURKUExUX1IzCQkgQjQzX05UQUI4KDI3LCAgNjQpIC8qIGFkanVzdGVkIHBvd2VyIGxvb2t1cCAxICAqLwogI2RlZmluZSBCNDNfTlRBQl9DMF9HQUlOQ1RMX1IzCQlCNDNfTlRBQjMyKDI2LCAxOTIpIC8qIGdhaW4gY29udHJvbCBsb29rdXAgMCAgKi8KICNkZWZpbmUgQjQzX05UQUJfQzFfR0FJTkNUTF9SMwkJQjQzX05UQUIzMigyNywgMTkyKSAvKiBnYWluIGNvbnRyb2wgbG9va3VwIDEgICovCiAjZGVmaW5lIEI0M19OVEFCX0MwX0lRTFRfUjMJCUI0M19OVEFCMzIoMjYsIDMyMCkgLyogSS9RIGxvb2t1cCAwICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oCmluZGV4IDEyYjUxODIuLjFkNGZjOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmgKQEAgLTgxMCwxNSArODEwLDE1IEBACiAKIAogLyogTWVzc2FnZSBwcmludGluZyAqLwotdm9pZCBiNDNsZWdhY3lpbmZvKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQgYjQzbGVnYWN5ZXJyKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKLXZvaWQgYjQzbGVnYWN5d2FybihzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitfX3ByaW50ZigyLCAzKQordm9pZCBiNDNsZWdhY3lpbmZvKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX3ByaW50ZigyLCAzKQordm9pZCBiNDNsZWdhY3llcnIoc3RydWN0IGI0M2xlZ2FjeV93bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpCit2b2lkIGI0M2xlZ2FjeXdhcm4oc3RydWN0IGI0M2xlZ2FjeV93bCAqd2wsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNpZiBCNDNsZWdhY3lfREVCVUcKLXZvaWQgYjQzbGVnYWN5ZGJnKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpCit2b2lkIGI0M2xlZ2FjeWRiZyhzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UgLyogREVCVUcgKi8KICMgZGVmaW5lIGI0M2xlZ2FjeWRiZyh3bCwgZm10Li4uKSBkbyB7IC8qIG5vdGhpbmcgKi8gfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKaW5kZXggYTNiNzJjZC4uMjBmMDI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCkBAIC0zMSw3ICszMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL0tjb25maWcKaW5kZXggMjA2OWZjOC4uOGY1NGMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL0tjb25maWcKQEAgLTMsOSArMyw4IEBACiAKIGNvbmZpZyBCUkNNU01BQwogCXRyaXN0YXRlICJCcm9hZGNvbSBJRUVFODAyLjExbiBQQ0llIFNvZnRNQUMgV0xBTiBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIE1BQzgwMjExCi0JZGVwZW5kcyBvbiBCQ01BPW4KKwlkZXBlbmRzIG9uIEJDTUEKIAlzZWxlY3QgQlJDTVVUSUwKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IENSQ19DQ0lUVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbWNoaXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21jaGlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2I1ZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbWNoaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9iY21jaGlwX2hfCi0jZGVmaW5lIF9iY21jaGlwX2hfCi0KLS8qIGJjbTQzMjkgKi8KLS8qIGZpcm13YXJlIG5hbWUgKi8KLSNkZWZpbmUgQkNNNDMyOV9GV19OQU1FCQkJImJyY20vYmNtNDMyOS1mdWxsbWFjLTQuYmluIgotI2RlZmluZSBCQ000MzI5X05WX05BTUUJCQkiYnJjbS9iY200MzI5LWZ1bGxtYWMtNC50eHQiCi0KLSNlbmRpZgkJCQkvKiBfYmNtY2hpcF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCmluZGV4IGJmZjlkY2QuLjZjODVkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0yMjEsMTkgKzIyMiwxMiBAQAogCXJldHVybiBzZGlvZGV2LT5yZWdmYWlsOwogfQogCi1pbnQKLWJyY21mX3NkY2FyZF9yZWN2X2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLAotCQkgICAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKK3N0YXRpYyBpbnQgYnJjbWZfc2RjYXJkX3JlY3ZfcHJlcGFyZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgZm4sCisJCQkJICAgICB1aW50IGZsYWdzLCB1aW50IHdpZHRoLCB1MzIgKmFkZHIpCiB7Ci0JaW50IHN0YXR1czsKLQl1aW50IGluY3JfZml4OwotCXVpbnQgd2lkdGg7Ci0JdWludCBiYXIwID0gYWRkciAmIH5TQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKKwl1aW50IGJhcjAgPSAqYWRkciAmIH5TQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKIAlpbnQgZXJyID0gMDsKIAotCWJyY21mX2RiZyhJTkZPLCAiZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsIGZuLCBhZGRyLCBuYnl0ZXMpOwotCiAJLyogQXN5bmMgbm90IGltcGxlbWVudGVkIHlldCAqLwogCWlmIChmbGFncyAmIFNESU9fUkVRX0FTWU5DKQogCQlyZXR1cm4gLUVOT1RTVVBQOwpAQCAtMjQ2LDI5ICsyNDAsMTE0IEBACiAJCXNkaW9kZXYtPnNid2FkID0gYmFyMDsKIAl9CiAKLQlhZGRyICY9IFNCU0RJT19TQl9PRlRfQUREUl9NQVNLOworCSphZGRyICY9IFNCU0RJT19TQl9PRlRfQUREUl9NQVNLOworCisJaWYgKHdpZHRoID09IDQpCisJCSphZGRyIHw9IFNCU0RJT19TQl9BQ0NFU1NfMl80Ql9GTEFHOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBza19idWZmICpteXBrdDsKKwlpbnQgZXJyOworCisJbXlwa3QgPSBicmNtdV9wa3RfYnVmX2dldF9za2IobmJ5dGVzKTsKKwlpZiAoIW15cGt0KSB7CisJCWJyY21mX2RiZyhFUlJPUiwgImJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKKwkJCSAgbmJ5dGVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gYnJjbWZfc2RjYXJkX3JlY3ZfcGt0KHNkaW9kZXYsIGFkZHIsIGZuLCBmbGFncywgbXlwa3QpOworCWlmICghZXJyKQorCQltZW1jcHkoYnVmLCBteXBrdC0+ZGF0YSwgbmJ5dGVzKTsKKworCWJyY211X3BrdF9idWZfZnJlZV9za2IobXlwa3QpOworCXJldHVybiBlcnI7Cit9CisKK2ludAorYnJjbWZfc2RjYXJkX3JlY3ZfcGt0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCSAgICAgIHVpbnQgZmxhZ3MsIHN0cnVjdCBza19idWZmICpwa3QpCit7CisJdWludCBpbmNyX2ZpeDsKKwl1aW50IHdpZHRoOworCWludCBlcnIgPSAwOworCisJYnJjbWZfZGJnKElORk8sICJmdW4gPSAlZCwgYWRkciA9IDB4JXgsIHNpemUgPSAlZFxuIiwKKwkJICBmbiwgYWRkciwgcGt0LT5sZW4pOworCisJd2lkdGggPSAoZmxhZ3MgJiBTRElPX1JFUV80QllURSkgPyA0IDogMjsKKwllcnIgPSBicmNtZl9zZGNhcmRfcmVjdl9wcmVwYXJlKHNkaW9kZXYsIGZuLCBmbGFncywgd2lkdGgsICZhZGRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaW5jcl9maXggPSAoZmxhZ3MgJiBTRElPX1JFUV9GSVhFRCkgPyBTRElPSF9EQVRBX0ZJWCA6IFNESU9IX0RBVEFfSU5DOworCWVyciA9IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9kZXYsIGluY3JfZml4LCBTRElPSF9SRUFELAorCQkJCQkgZm4sIGFkZHIsIHBrdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYnJjbWZfc2RjYXJkX3JlY3ZfY2hhaW4oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJCSAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKQoreworCXVpbnQgaW5jcl9maXg7CisJdWludCB3aWR0aDsKKwlpbnQgZXJyID0gMDsKKworCWJyY21mX2RiZyhJTkZPLCAiZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsCisJCSAgZm4sIGFkZHIsIHBrdHEtPnFsZW4pOworCiAJd2lkdGggPSAoZmxhZ3MgJiBTRElPX1JFUV80QllURSkgPyA0IDogMjsKLQlpZiAod2lkdGggPT0gNCkKLQkJYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKKwllcnIgPSBicmNtZl9zZGNhcmRfcmVjdl9wcmVwYXJlKHNkaW9kZXYsIGZuLCBmbGFncywgd2lkdGgsICZhZGRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0Jc3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2RldiwgaW5jcl9maXgsIFNESU9IX1JFQUQsCi0JCQkJCSAgICBmbiwgYWRkciwgd2lkdGgsIG5ieXRlcywgYnVmLCBwa3QpOworCWluY3JfZml4ID0gKGZsYWdzICYgU0RJT19SRVFfRklYRUQpID8gU0RJT0hfREFUQV9GSVggOiBTRElPSF9EQVRBX0lOQzsKKwllcnIgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X2NoYWluKHNkaW9kZXYsIGluY3JfZml4LCBTRElPSF9SRUFELCBmbiwgYWRkciwKKwkJCQkJcGt0cSk7CiAKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBlcnI7CiB9CiAKIGludAogYnJjbWZfc2RjYXJkX3NlbmRfYnVmKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3Q7CisJaW50IGVycjsKKworCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKG5ieXRlcyk7CisJaWYgKCFteXBrdCkgeworCQlicmNtZl9kYmcoRVJST1IsICJicmNtdV9wa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWRcbiIsCisJCQkgIG5ieXRlcyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbWNweShteXBrdC0+ZGF0YSwgYnVmLCBuYnl0ZXMpOworCWVyciA9IGJyY21mX3NkY2FyZF9zZW5kX3BrdChzZGlvZGV2LCBhZGRyLCBmbiwgZmxhZ3MsIG15cGt0KTsKKworCWJyY211X3BrdF9idWZfZnJlZV9za2IobXlwa3QpOworCXJldHVybiBlcnI7CisKK30KKworaW50CiticmNtZl9zZGNhcmRfc2VuZF9wa3Qoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJICAgICAgdWludCBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKIHsKIAl1aW50IGluY3JfZml4OwogCXVpbnQgd2lkdGg7CiAJdWludCBiYXIwID0gYWRkciAmIH5TQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKIAlpbnQgZXJyID0gMDsKIAotCWJyY21mX2RiZyhJTkZPLCAiZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsIGZuLCBhZGRyLCBuYnl0ZXMpOworCWJyY21mX2RiZyhJTkZPLCAiZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsCisJCSAgZm4sIGFkZHIsIHBrdC0+bGVuKTsKIAogCS8qIEFzeW5jIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KIAlpZiAoZmxhZ3MgJiBTRElPX1JFUV9BU1lOQykKQEAgLTI5MCwxOCArMzY5LDM5IEBACiAJCWFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7CiAKIAlyZXR1cm4gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2RldiwgaW5jcl9maXgsIFNESU9IX1dSSVRFLCBmbiwKLQkJCQkJICBhZGRyLCB3aWR0aCwgbmJ5dGVzLCBidWYsIHBrdCk7CisJCQkJCSAgYWRkciwgcGt0KTsKIH0KIAogaW50IGJyY21mX3NkY2FyZF9yd2RhdGEoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IHJ3LCB1MzIgYWRkciwKIAkJCXU4ICpidWYsIHVpbnQgbmJ5dGVzKQogeworCXN0cnVjdCBza19idWZmICpteXBrdDsKKwlib29sIHdyaXRlID0gcncgPyBTRElPSF9XUklURSA6IFNESU9IX1JFQUQ7CisJaW50IGVycjsKKwogCWFkZHIgJj0gU0JTRElPX1NCX09GVF9BRERSX01BU0s7CiAJYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKIAotCXJldHVybiBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzZGlvZGV2LCBTRElPSF9EQVRBX0lOQywKLQkJKHJ3ID8gU0RJT0hfV1JJVEUgOiBTRElPSF9SRUFEKSwgU0RJT19GVU5DXzEsCi0JCWFkZHIsIDQsIG5ieXRlcywgYnVmLCBOVUxMKTsKKwlteXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihuYnl0ZXMpOworCWlmICghbXlwa3QpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAorCQkJICBuYnl0ZXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLworCWlmICh3cml0ZSkKKwkJbWVtY3B5KG15cGt0LT5kYXRhLCBidWYsIG5ieXRlcyk7CisKKwllcnIgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzZGlvZGV2LCBTRElPSF9EQVRBX0lOQywgd3JpdGUsCisJCQkJCSBTRElPX0ZVTkNfMSwgYWRkciwgbXlwa3QpOworCisJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLworCWlmICghZXJyICYmICF3cml0ZSkKKwkJbWVtY3B5KGJ1ZiwgbXlwa3QtPmRhdGEsIG5ieXRlcyk7CisKKwlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKG15cGt0KTsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgYnJjbWZfc2RjYXJkX2Fib3J0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCBmbikKQEAgLTMzMiw3ICs0MzIsNyBAQAogCXNkaW9kZXYtPnNid2FkID0gU0lfRU5VTV9CQVNFOwogCiAJLyogdHJ5IHRvIGF0dGFjaCB0byB0aGUgdGFyZ2V0IGRldmljZSAqLwotCXNkaW9kZXYtPmJ1cyA9IGJyY21mX3NkYnJjbV9wcm9iZSgwLCAwLCAwLCAwLCByZWdzLCBzZGlvZGV2KTsKKwlzZGlvZGV2LT5idXMgPSBicmNtZl9zZGJyY21fcHJvYmUocmVncywgc2Rpb2Rldik7CiAJaWYgKCFzZGlvZGV2LT5idXMpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiZGV2aWNlIGF0dGFjaCBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCmluZGV4IGJiYWViMmQuLmI4OTVmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNkZWZpbmUgRE1BX0FMSUdOX01BU0sJMHgwMwogCiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjkJMHg0MzI5CisjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzAJMHg0MzMwCiAKICNkZWZpbmUgU0RJT19GVU5DMV9CTE9DS1NJWkUJCTY0CiAjZGVmaW5lIFNESU9fRlVOQzJfQkxPQ0tTSVpFCQk1MTIKQEAgLTQ3LDYgKzQ4LDcgQEAKIC8qIGRldmljZXMgd2Ugc3VwcG9ydCwgbnVsbCB0ZXJtaW5hdGVkICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIGJyY21mX3NkbW1jX2lkc1tdID0gewogCXtTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9CUk9BRENPTSwgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMyOSl9LAorCXtTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9CUk9BRENPTSwgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzMCl9LAogCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShzZGlvLCBicmNtZl9zZG1tY19pZHMpOwpAQCAtMjA0LDYyICsyMDYsNzUgQEAKIAlyZXR1cm4gZXJyX3JldDsKIH0KIAorLyogcHJlY29uZGl0aW9uOiBob3N0IGNvbnRyb2xsZXIgaXMgY2xhaW1lZCAqLwogc3RhdGljIGludAotYnJjbWZfc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZpeF9pbmMsCi0JCQkgICB1aW50IHdyaXRlLCB1aW50IGZ1bmMsIHVpbnQgYWRkciwKLQkJCSAgIHN0cnVjdCBza19idWZmICpwa3QpCiticmNtZl9zZGlvaF9yZXF1ZXN0X2RhdGEoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IHdyaXRlLCBib29sIGZpZm8sCisJCQkgdWludCBmdW5jLCB1aW50IGFkZHIsIHN0cnVjdCBza19idWZmICpwa3QsIHVpbnQgcGt0bGVuKQoreworCWludCBlcnJfcmV0ID0gMDsKKworCWlmICgod3JpdGUpICYmICghZmlmbykpIHsKKwkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwgYWRkciwKKwkJCQkJICAgKCh1OCAqKSAocGt0LT5kYXRhKSksIHBrdGxlbik7CisJfSBlbHNlIGlmICh3cml0ZSkgeworCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAorCQkJCQkgICAoKHU4ICopIChwa3QtPmRhdGEpKSwgcGt0bGVuKTsKKwl9IGVsc2UgaWYgKGZpZm8pIHsKKwkJZXJyX3JldCA9IHNkaW9fcmVhZHNiKHNkaW9kZXYtPmZ1bmNbZnVuY10sCisJCQkJICAgICAgKCh1OCAqKSAocGt0LT5kYXRhKSksIGFkZHIsIHBrdGxlbik7CisJfSBlbHNlIHsKKwkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLAorCQkJCQkgICAgICgodTggKikgKHBrdC0+ZGF0YSkpLAorCQkJCQkgICAgIGFkZHIsIHBrdGxlbik7CisJfQorCisJcmV0dXJuIGVycl9yZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcXVldWUgb2YgcGFja2V0cy4gVGhlIHBhY2tldHMgb24gdGhlIHF1ZXVlCisgKiBhcmUgYXNzdW1lZCB0byBiZSBwcm9wZXJseSBhbGlnbmVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2ludAorYnJjbWZfc2Rpb2hfcmVxdWVzdF9jaGFpbihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgZml4X2luYywKKwkJCSAgdWludCB3cml0ZSwgdWludCBmdW5jLCB1aW50IGFkZHIsCisJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnBrdHEpCiB7CiAJYm9vbCBmaWZvID0gKGZpeF9pbmMgPT0gU0RJT0hfREFUQV9GSVgpOwogCXUzMiBTR0NvdW50ID0gMDsKIAlpbnQgZXJyX3JldCA9IDA7CiAKLQlzdHJ1Y3Qgc2tfYnVmZiAqcG5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAotCWJyY21mX3BtX3Jlc3VtZV93YWl0KHNkaW9kZXYsICZzZGlvZGV2LT5yZXF1ZXN0X3BhY2tldF93YWl0KTsKKwlicmNtZl9wbV9yZXN1bWVfd2FpdChzZGlvZGV2LCAmc2Rpb2Rldi0+cmVxdWVzdF9jaGFpbl93YWl0KTsKIAlpZiAoYnJjbWZfcG1fcmVzdW1lX2Vycm9yKHNkaW9kZXYpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLwogCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKLQlmb3IgKHBuZXh0ID0gcGt0OyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgewotCQl1aW50IHBrdF9sZW4gPSBwbmV4dC0+bGVuOworCisJc2tiX3F1ZXVlX3dhbGsocGt0cSwgcGt0KSB7CisJCXVpbnQgcGt0X2xlbiA9IHBrdC0+bGVuOwogCQlwa3RfbGVuICs9IDM7CiAJCXBrdF9sZW4gJj0gMHhGRkZGRkZGQzsKIAotCQlpZiAoKHdyaXRlKSAmJiAoIWZpZm8pKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgIHBrdF9sZW4pOwotCQl9IGVsc2UgaWYgKHdyaXRlKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhzZGlvZGV2LT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgIHBrdF9sZW4pOwotCQl9IGVsc2UgaWYgKGZpZm8pIHsKLQkJCWVycl9yZXQgPSBzZGlvX3JlYWRzYihzZGlvZGV2LT5mdW5jW2Z1bmNdLAotCQkJCQkgICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAotCQkJCQkgICAgICBhZGRyLCBwa3RfbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwKLQkJCQkJCSAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJCSAgICAgYWRkciwgcGt0X2xlbik7Ci0JCX0KLQorCQllcnJfcmV0ID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9kYXRhKHNkaW9kZXYsIHdyaXRlLCBmaWZvLCBmdW5jLAorCQkJCQkJICAgYWRkciwgcGt0LCBwa3RfbGVuKTsKIAkJaWYgKGVycl9yZXQpIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgIiVzIEZBSUxFRCAlcFslZF0sIGFkZHI9MHglMDV4LCBwa3RfbGVuPSVkLCBFUlI9MHglMDh4XG4iLAotCQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcG5leHQsIFNHQ291bnQsIGFkZHIsCisJCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QsIFNHQ291bnQsIGFkZHIsCiAJCQkJICBwa3RfbGVuLCBlcnJfcmV0KTsKIAkJfSBlbHNlIHsKIAkJCWJyY21mX2RiZyhUUkFDRSwgIiVzIHhmcidkICVwWyVkXSwgYWRkcj0weCUwNXgsIGxlbj0lZFxuIiwKLQkJCQkgIHdyaXRlID8gIlRYIiA6ICJSWCIsIHBuZXh0LCBTR0NvdW50LCBhZGRyLAorCQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBTR0NvdW50LCBhZGRyLAogCQkJCSAgcGt0X2xlbik7CiAJCX0KLQogCQlpZiAoIWZpZm8pCiAJCQlhZGRyICs9IHBrdF9sZW47Ci0JCVNHQ291bnQrKzsKIAorCQlTR0NvdW50Kys7CiAJfQogCiAJLyogUmVsZWFzZSBob3N0IGNvbnRyb2xsZXIgKi8KQEAgLTI3MCw5MSArMjg1LDQ1IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgYnVmZmVyIG9yIHBhY2tldCwgYW5kIGZpeGVzIGV2ZXJ5dGhpbmcgdXAKLSAqIHNvIHRoYXQgaW4gdGhlIGVuZCwgYSBETUEtYWJsZSBwYWNrZXQgaXMgY3JlYXRlZC4KLSAqCi0gKiBBIGJ1ZmZlciBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgcGFja2V0IHBvaW50ZXIsCi0gKiBhbmQgbWF5IG9yIG1heSBub3QgYmUgYWxpZ25lZC4KLSAqIEEgcGFja2V0IG1heSBjb25zaXN0IG9mIGEgc2luZ2xlIHBhY2tldCwgb3IgYSBwYWNrZXQgY2hhaW4uCi0gKiBJZiBpdCBpcyBhIHBhY2tldCBjaGFpbiwgdGhlbiBhbGwgdGhlIHBhY2tldHMgaW4gdGhlIGNoYWluCi0gKiBtdXN0IGJlIHByb3Blcmx5IGFsaWduZWQuCi0gKgotICogSWYgdGhlIHBhY2tldCBkYXRhIGlzIG5vdCBhbGlnbmVkLCB0aGVuIHRoZXJlIG1heSBvbmx5IGJlCi0gKiBvbmUgcGFja2V0LCBhbmQgaW4gdGhpcyBjYXNlLCAgaXQgaXMgY29waWVkIHRvIGEgbmV3Ci0gKiBhbGlnbmVkIHBhY2tldC4KLSAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIERNQS1hYmxlIHBhY2tldC4KICAqLwogaW50IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKIAkJCSAgICAgICB1aW50IGZpeF9pbmMsIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLAotCQkJICAgICAgIHVpbnQgcmVnX3dpZHRoLCB1aW50IGJ1Zmxlbl91LCB1OCAqYnVmZmVyLAogCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwa3QpCiB7Ci0JaW50IFN0YXR1czsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3QgPSBOVUxMOworCWludCBzdGF0dXM7CisJdWludCBwa3RfbGVuID0gcGt0LT5sZW47CisJYm9vbCBmaWZvID0gKGZpeF9pbmMgPT0gU0RJT0hfREFUQV9GSVgpOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCisJaWYgKHBrdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWJyY21mX3BtX3Jlc3VtZV93YWl0KHNkaW9kZXYsICZzZGlvZGV2LT5yZXF1ZXN0X2J1ZmZlcl93YWl0KTsKIAlpZiAoYnJjbWZfcG1fcmVzdW1lX2Vycm9yKHNkaW9kZXYpKQogCQlyZXR1cm4gLUVJTzsKLQkvKiBDYXNlIDE6IHdlIGRvbid0IGhhdmUgYSBwYWNrZXQuICovCi0JaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCWJyY21mX2RiZyhEQVRBLCAiQ3JlYXRpbmcgbmV3ICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBidWZsZW5fdSk7Ci0JCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKGJ1Zmxlbl91KTsKLQkJaWYgKCFteXBrdCkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCSAgYnVmbGVuX3UpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KIAotCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwotCQlpZiAod3JpdGUpCi0JCQltZW1jcHkobXlwa3QtPmRhdGEsIGJ1ZmZlciwgYnVmbGVuX3UpOworCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLworCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKIAotCQlTdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3BhY2tldChzZGlvZGV2LCBmaXhfaW5jLCB3cml0ZSwKLQkJCQkJCSAgICBmdW5jLCBhZGRyLCBteXBrdCk7CisJcGt0X2xlbiArPSAzOworCXBrdF9sZW4gJj0gKHVpbnQpfjM7CiAKLQkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwotCQlpZiAoIXdyaXRlKQotCQkJbWVtY3B5KGJ1ZmZlciwgbXlwa3QtPmRhdGEsIGJ1Zmxlbl91KTsKLQotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKG15cGt0KTsKLQl9IGVsc2UgaWYgKCgodWxvbmcpIChwa3QtPmRhdGEpICYgRE1BX0FMSUdOX01BU0spICE9IDApIHsKLQkJLyoKLQkJICogQ2FzZSAyOiBXZSBoYXZlIGEgcGFja2V0LCBidXQgaXQgaXMgdW5hbGlnbmVkLgotCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdCBoYXZlIGEgY2hhaW4gKHBrdC0+bmV4dCA9PSBOVUxMKQotCQkgKi8KLQkJYnJjbWZfZGJnKERBVEEsICJDcmVhdGluZyBhbGlnbmVkICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QtPmxlbik7Ci0JCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKHBrdC0+bGVuKTsKLQkJaWYgKCFteXBrdCkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCSAgcGt0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwotCQlpZiAod3JpdGUpCi0JCQltZW1jcHkobXlwa3QtPmRhdGEsIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOwotCi0JCVN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHNkaW9kZXYsIGZpeF9pbmMsIHdyaXRlLAotCQkJCQkJICAgIGZ1bmMsIGFkZHIsIG15cGt0KTsKLQotCQkvKiBGb3IgYSByZWFkLCBjb3B5IHRoZSBwYWNrZXQgZGF0YSBiYWNrIHRvIHRoZSBidWZmZXIuICovCi0JCWlmICghd3JpdGUpCi0JCQltZW1jcHkocGt0LT5kYXRhLCBteXBrdC0+ZGF0YSwgbXlwa3QtPmxlbik7Ci0KLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7Ci0JfSBlbHNlIHsJCS8qIGNhc2UgMzogV2UgaGF2ZSBhIHBhY2tldCBhbmQKLQkJCQkgaXQgaXMgYWxpZ25lZC4gKi8KLQkJYnJjbWZfZGJnKERBVEEsICJBbGlnbmVkICVzIFBhY2tldCwgZGlyZWN0IERNQVxuIiwKLQkJCSAgd3JpdGUgPyAiVHgiIDogIlJ4Iik7Ci0JCVN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHNkaW9kZXYsIGZpeF9pbmMsIHdyaXRlLAotCQkJCQkJICAgIGZ1bmMsIGFkZHIsIHBrdCk7CisJc3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9kYXRhKHNkaW9kZXYsIHdyaXRlLCBmaWZvLCBmdW5jLAorCQkJCQkgICBhZGRyLCBwa3QsIHBrdF9sZW4pOworCWlmIChzdGF0dXMpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiJXMgRkFJTEVEICVwLCBhZGRyPTB4JTA1eCwgcGt0X2xlbj0lZCwgRVJSPTB4JTA4eFxuIiwKKwkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBhZGRyLCBwa3RfbGVuLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCWJyY21mX2RiZyhUUkFDRSwgIiVzIHhmcidkICVwLCBhZGRyPTB4JTA1eCwgbGVuPSVkXG4iLAorCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QsIGFkZHIsIHBrdF9sZW4pOwogCX0KIAotCXJldHVybiBTdGF0dXM7CisJLyogUmVsZWFzZSBob3N0IGNvbnRyb2xsZXIgKi8KKwlzZGlvX3JlbGVhc2VfaG9zdChzZGlvZGV2LT5mdW5jW2Z1bmNdKTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFJlYWQgY2xpZW50IGNhcmQgcmVnICovCkBAIC00OTQsNiArNDYzLDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmOwogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAlicmNtZl9kYmcoVFJBQ0UsICJmdW5jLT5jbGFzcz0leFxuIiwgZnVuYy0+Y2xhc3MpOwogCWJyY21mX2RiZyhUUkFDRSwgInNkaW9fdmVuZG9yOiAweCUwNHhcbiIsIGZ1bmMtPnZlbmRvcik7CkBAIC01MDUsMTcgKzQ3NSwyNSBAQAogCQkJYnJjbWZfZGJnKEVSUk9SLCAiY2FyZCBwcml2YXRlIGRydmRhdGEgb2NjdXBpZWRcbiIpOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQotCQlzZGlvZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX3NkaW9fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2Rpb2RldikKKwkJYnVzX2lmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2J1cyksIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1c19pZikKIAkJCXJldHVybiAtRU5PTUVNOworCQlzZGlvZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX3NkaW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2Rpb2RldikgeworCQkJa2ZyZWUoYnVzX2lmKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCXNkaW9kZXYtPmZ1bmNbMF0gPSBmdW5jLT5jYXJkLT5zZGlvX2Z1bmNbMF07CiAJCXNkaW9kZXYtPmZ1bmNbMV0gPSBmdW5jOworCQlzZGlvZGV2LT5idXNfaWYgPSBidXNfaWY7CisJCWJ1c19pZi0+YnVzX3ByaXYgPSBzZGlvZGV2OworCQlidXNfaWYtPnR5cGUgPSBTRElPX0JVUzsKIAkJZGV2X3NldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYsIHNkaW9kZXYpOwogCiAJCWF0b21pY19zZXQoJnNkaW9kZXYtPnN1c3BlbmQsIGZhbHNlKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2Rpb2Rldi0+cmVxdWVzdF9ieXRlX3dhaXQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZGlvZGV2LT5yZXF1ZXN0X3dvcmRfd2FpdCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3RfcGFja2V0X3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZGlvZGV2LT5yZXF1ZXN0X2NoYWluX3dhaXQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZGlvZGV2LT5yZXF1ZXN0X2J1ZmZlcl93YWl0KTsKIAl9CiAKQEAgLTUyNSw2ICs1MDMsMTAgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQlzZGlvZGV2LT5mdW5jWzJdID0gZnVuYzsKIAorCQlidXNfaWYgPSBzZGlvZGV2LT5idXNfaWY7CisJCXNkaW9kZXYtPmRldiA9ICZmdW5jLT5kZXY7CisJCWRldl9zZXRfZHJ2ZGF0YSgmZnVuYy0+ZGV2LCBidXNfaWYpOworCiAJCWJyY21mX2RiZyhUUkFDRSwgIkYyIGZvdW5kLCBjYWxsaW5nIGJyY21mX3NkaW9fcHJvYmUuLi5cbiIpOwogCQlyZXQgPSBicmNtZl9zZGlvX3Byb2JlKHNkaW9kZXYpOwogCX0KQEAgLTUzNCw2ICs1MTYsNyBAQAogCiBzdGF0aWMgdm9pZCBicmNtZl9vcHNfc2Rpb19yZW1vdmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWY7CiAJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OwogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAlicmNtZl9kYmcoSU5GTywgImZ1bmMtPmNsYXNzPSV4XG4iLCBmdW5jLT5jbGFzcyk7CkBAIC01NDIsMTAgKzUyNSwxMyBAQAogCWJyY21mX2RiZyhJTkZPLCAiRnVuY3Rpb24jOiAweCUwNHhcbiIsIGZ1bmMtPm51bSk7CiAKIAlpZiAoZnVuYy0+bnVtID09IDIpIHsKLQkJc2Rpb2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKKwkJYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5kZXYpOworCQlzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKIAkJYnJjbWZfZGJnKFRSQUNFLCAiRjIgZm91bmQsIGNhbGxpbmcgYnJjbWZfc2Rpb19yZW1vdmUuLi5cbiIpOwogCQlicmNtZl9zZGlvX3JlbW92ZShzZGlvZGV2KTsKIAkJZGV2X3NldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYsIE5VTEwpOworCQlkZXZfc2V0X2RydmRhdGEoJmZ1bmMtPmRldiwgTlVMTCk7CisJCWtmcmVlKGJ1c19pZik7CiAJCWtmcmVlKHNkaW9kZXYpOwogCX0KIH0KQEAgLTU1NCwxNCArNTQwLDEyIEBACiBzdGF0aWMgaW50IGJyY21mX3NkaW9fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJbW1jX3BtX2ZsYWdfdCBzZGlvX2ZsYWdzOwotCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldjsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAogCWJyY21mX2RiZyhUUkFDRSwgIlxuIik7CiAKLQlzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOwotCiAJYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgdHJ1ZSk7CiAKIAlzZGlvX2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKHNkaW9kZXYtPmZ1bmNbMV0pOwpAQCAtNTgzLDEwICs1NjcsOSBAQAogCiBzdGF0aWMgaW50IGJyY21mX3NkaW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7CiAKLQlzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOwogCWJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKHNkaW9kZXYsIHRydWUpOwogCWF0b21pY19zZXQoJnNkaW9kZXYtPnN1c3BlbmQsIGZhbHNlKTsKIAlyZXR1cm4gMDsKQEAgLTYxMCwxNyArNTkzLDI2IEBACiAjZW5kaWYJLyogQ09ORklHX1BNX1NMRUVQICovCiB9OwogCi0vKiBidXMgcmVnaXN0ZXIgaW50ZXJmYWNlICovCi1pbnQgYnJjbWZfYnVzX3JlZ2lzdGVyKHZvaWQpCi17Ci0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwotCi0JcmV0dXJuIHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZicmNtZl9zZG1tY19kcml2ZXIpOwotfQotCi12b2lkIGJyY21mX2J1c191bnJlZ2lzdGVyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYnJjbWZfc2Rpb19leGl0KHZvaWQpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJc2Rpb191bnJlZ2lzdGVyX2RyaXZlcigmYnJjbWZfc2RtbWNfZHJpdmVyKTsKIH0KKworc3RhdGljIGludCBfX2luaXQgYnJjbWZfc2Rpb19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKKworCXJldCA9IHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZicmNtZl9zZG1tY19kcml2ZXIpOworCisJaWYgKHJldCkKKwkJYnJjbWZfZGJnKEVSUk9SLCAic2Rpb19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KGJyY21mX3NkaW9faW5pdCk7Cittb2R1bGVfZXhpdChicmNtZl9zZGlvX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCmluZGV4IDZkYTUxOWUuLmVkNjBmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKQEAgLTg3LDcgKzg3LDcgQEAKICNkZWZpbmUgVE9FX1RYX0NTVU1fT0wJCTB4MDAwMDAwMDEKICNkZWZpbmUgVE9FX1JYX0NTVU1fT0wJCTB4MDAwMDAwMDIKIAotI2RlZmluZQlCUkNNRl9CU1NfSU5GT19WRVJTSU9OCTEwOCAvKiBjdXJyIHZlciBvZiBicmNtZl9ic3NfaW5mb19sZSBzdHJ1Y3QgKi8KKyNkZWZpbmUJQlJDTUZfQlNTX0lORk9fVkVSU0lPTgkxMDkgLyogY3VyciB2ZXIgb2YgYnJjbWZfYnNzX2luZm9fbGUgc3RydWN0ICovCiAKIC8qIHNpemUgb2YgYnJjbWZfc2Nhbl9wYXJhbXMgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KICNkZWZpbmUgQlJDTUZfU0NBTl9QQVJBTVNfRklYRURfU0laRSA2NApAQCAtNTcxLDggKzU3MSwxNCBAQAogCXVpbnQgbmVlZGVkOwkJLyogYnl0ZXMgbmVlZGVkIChvcHRpb25hbCkgKi8KIH07CiAKK3N0cnVjdCBicmNtZl9idXMgeworCXU4IHR5cGU7CQkvKiBidXMgdHlwZSAqLworCXZvaWQgKmJ1c19wcml2OwkJLyogcG9pbnRlciB0byBidXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwllbnVtIGJyY21mX2J1c19zdGF0ZSBzdGF0ZTsKK307CisKIC8qIEZvcndhcmQgZGVjbHMgZm9yIHN0cnVjdCBicmNtZl9wdWIgKHNlZSBiZWxvdykgKi8KLXN0cnVjdCBicmNtZl9idXM7CQkvKiBkZXZpY2UgYnVzIGluZm8gKi8KK3N0cnVjdCBicmNtZl9zZGlvOwkJLyogZGV2aWNlIGJ1cyBpbmZvICovCiBzdHJ1Y3QgYnJjbWZfcHJvdG87CS8qIGRldmljZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGluZm8gKi8KIHN0cnVjdCBicmNtZl9pbmZvOwkvKiBkZXZpY2UgZHJpdmVyIGluZm8gKi8KIHN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXY7IC8qIGNmZzgwMjExIGRldmljZSBpbmZvICovCkBAIC01ODAsMTUgKzU4NiwxNiBAQAogLyogQ29tbW9uIHN0cnVjdHVyZSBmb3IgbW9kdWxlIGFuZCBpbnN0YW5jZSBsaW5rYWdlICovCiBzdHJ1Y3QgYnJjbWZfcHViIHsKIAkvKiBMaW5rYWdlIHBvbnRlcnMgKi8KLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1czsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWY7CiAJc3RydWN0IGJyY21mX3Byb3RvICpwcm90OwogCXN0cnVjdCBicmNtZl9pbmZvICppbmZvOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXYgKmNvbmZpZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBmdWxsbWFjIGRvbmdsZSBkZXZpY2UgcG9pbnRlciAqLwogCiAJLyogSW50ZXJuYWwgYnJjbWYgaXRlbXMgKi8KIAlib29sIHVwOwkJLyogRHJpdmVyIHVwL2Rvd24gKHRvIE9TKSAqLwogCWJvb2wgdHhvZmY7CQkvKiBUcmFuc21pdCBmbG93LWNvbnRyb2xsZWQgKi8KLQllbnVtIGJyY21mX2J1c19zdGF0ZSBidXNzdGF0ZTsKIAl1aW50IGhkcmxlbjsJCS8qIFRvdGFsIEJSQ01GIGhlYWRlciBsZW5ndGggKHByb3RvICsgYnVzKSAqLwogCXVpbnQgbWF4Y3RsOwkJLyogTWF4IHNpemUgcnhjdGwgcmVxdWVzdCBmcm9tIHByb3RvIHRvIGJ1cyAqLwogCXVpbnQgcnhzejsJCS8qIFJ4IGJ1ZmZlciBzaXplIGJ1cyBtb2R1bGUgc2hvdWxkIHVzZSAqLwpAQCAtNjU2LDcgKzY2Myw2IEBACiAKIAl1OCBjb3VudHJ5X2NvZGVbQlJDTV9DTlRSWV9CVUZfU1pdOwogCWNoYXIgZXZlbnRtYXNrW0JSQ01GX0VWRU5USU5HX01BU0tfTEVOXTsKLQogfTsKIAogc3RydWN0IGJyY21mX2lmX2V2ZW50IHsKQEAgLTY4MSw4ICs2ODcsOCBAQAogICogUmV0dXJuZWQgc3RydWN0dXJlIHNob3VsZCBoYXZlIGJ1cyBhbmQgcHJvdCBwb2ludGVycyBmaWxsZWQgaW4uCiAgKiBidXNfaGRybGVuIHNwZWNpZmllcyByZXF1aXJlZCBoZWFkcm9vbSBmb3IgYnVzIG1vZHVsZSBoZWFkZXIuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgYnJjbWZfcHViICpicmNtZl9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLAotCQkJCSAgICAgIHVpbnQgYnVzX2hkcmxlbik7CitleHRlcm4gc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvICpidXMsCisJCQkJICAgICAgdWludCBidXNfaGRybGVuLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBicmNtZl9uZXRfYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZHgpOwogZXh0ZXJuIGludCBicmNtZl9uZXRkZXZfd2FpdF9wZW5kODAyMXgoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwogCkBAIC02OTksNyArNzA1LDE2IEBACiAKIC8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KIGV4dGVybiB2b2lkIGJyY21mX3J4X2ZyYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKKwkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnJ4bGlzdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYnJjbWZfcnhfcGFja2V0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQoreworCXN0cnVjdCBza19idWZmX2hlYWQgcTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEpOworCXNrYl9xdWV1ZV90YWlsKCZxLCBwa3QpOworCWJyY21mX3J4X2ZyYW1lKGRydnIsIGlmaWR4LCAmcSk7Cit9CiAKIC8qIFJldHVybiBwb2ludGVyIHRvIGludGVyZmFjZSBuYW1lICovCiBleHRlcm4gY2hhciAqYnJjbWZfaWZuYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZHgpOwpAQCAtNzI0LDggKzczOSw2IEBACiAJCQkgICAgICB2b2lkICpwa3RkYXRhLCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICosCiAJCQkgICAgICB2b2lkICoqZGF0YV9wdHIpOwogCi1leHRlcm4gdm9pZCBicmNtZl9jX2luaXQodm9pZCk7Ci0KIGV4dGVybiBpbnQgYnJjbWZfYWRkX2lmKHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwKIAkJCWNoYXIgKm5hbWUsIHU4ICptYWNfYWRkcik7CiBleHRlcm4gdm9pZCBicmNtZl9kZWxfaWYoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCmluZGV4IGEyNDk0MDcuLjE4NDFmOTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKQEAgLTI3LDMxICsyNywyNCBAQAogICogRXhwb3J0ZWQgZnJvbSBicmNtZiBidXMgbW9kdWxlIChicmNtZl91c2IsIGJyY21mX3NkaW8pCiAgKi8KIAotLyogSW5kaWNhdGUgKGRpcylpbnRlcmVzdCBpbiBmaW5kaW5nIGRvbmdsZXMuICovCi1leHRlcm4gaW50IGJyY21mX2J1c19yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiB2b2lkIGJyY21mX2J1c191bnJlZ2lzdGVyKHZvaWQpOwotCi0vKiBvYnRhaW4gbGludXggZGV2aWNlIG9iamVjdCBwcm92aWRpbmcgYnVzIGZ1bmN0aW9uICovCi1leHRlcm4gc3RydWN0IGRldmljZSAqYnJjbWZfYnVzX2dldF9kZXZpY2Uoc3RydWN0IGJyY21mX2J1cyAqYnVzKTsKLQogLyogU3RvcCBidXMgbW9kdWxlOiBjbGVhciBwZW5kaW5nIGZyYW1lcywgZGlzYWJsZSBkYXRhIGZsb3cgKi8KLWV4dGVybiB2b2lkIGJyY21mX3NkYnJjbV9idXNfc3RvcChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIC8qIEluaXRpYWxpemUgYnVzIG1vZHVsZTogcHJlcGFyZSBmb3IgY29tbXVuaWNhdGlvbiB3L2RvbmdsZSAqLwotZXh0ZXJuIGludCBicmNtZl9zZGJyY21fYnVzX2luaXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7CitleHRlcm4gaW50IGJyY21mX3NkYnJjbV9idXNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAvKiBTZW5kIGEgZGF0YSBmcmFtZSB0byB0aGUgZG9uZ2xlLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHR4cC4gKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwKTsKK2V4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwKTsKIAogLyogU2VuZC9yZWNlaXZlIGEgY29udHJvbCBtZXNzYWdlIHRvL2Zyb20gdGhlIGRvbmdsZS4KICAqIEV4cGVjdHMgY2FsbGVyIHRvIGVuZm9yY2UgYSBzaW5nbGUgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uCiAgKi8KIGV4dGVybiBpbnQKLWJyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKTsKK2JyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKTsKIAogZXh0ZXJuIGludAotYnJjbWZfc2RicmNtX2J1c19yeGN0bChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pOworYnJjbWZfc2RicmNtX2J1c19yeGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pOwogCi1leHRlcm4gdm9pZCBicmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHdkdGljayk7CitleHRlcm4gdm9pZCBicmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCB3ZHRpY2spOwogCiAjZW5kaWYJCQkJLyogX0JSQ01GX0JVU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKaW5kZXggZTM0YzVjMy4uZWJkNTNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jCkBAIC01OCw3ICs1OCw3IEBACiAgKiBVc2VkIG9uIGRhdGEgcGFja2V0cyB0byBjb252ZXkgcHJpb3JpdHkgYWNyb3NzIFVTQi4KICAqLwogI2RlZmluZQlCRENfSEVBREVSX0xFTgkJNAotI2RlZmluZSBCRENfUFJPVE9fVkVSCQkxCS8qIFByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUgQkRDX1BST1RPX1ZFUgkJMgkvKiBQcm90b2NvbCB2ZXJzaW9uICovCiAjZGVmaW5lIEJEQ19GTEFHX1ZFUl9NQVNLCTB4ZjAJLyogUHJvdG9jb2wgdmVyc2lvbiBtYXNrICovCiAjZGVmaW5lIEJEQ19GTEFHX1ZFUl9TSElGVAk0CS8qIFByb3RvY29sIHZlcnNpb24gc2hpZnQgKi8KICNkZWZpbmUgQkRDX0ZMQUdfU1VNX0dPT0QJMHgwNAkvKiBHb29kIFJYIGNoZWNrc3VtcyAqLwpAQCAtNzcsNyArNzcsNyBAQAogCXU4IGZsYWdzOwogCXU4IHByaW9yaXR5OwkvKiA4MDIuMWQgUHJpb3JpdHksIDQ6NyBmbG93IGNvbnRyb2wgaW5mbyBmb3IgdXNiICovCiAJdTggZmxhZ3MyOwotCXU4IHJzc2k7CisJdTggZGF0YV9vZmZzZXQ7CiB9OwogCiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCQlsZW4gPSBDRENfTUFYX01TR19TSVpFOwogCiAJLyogU2VuZCByZXF1ZXN0ICovCi0JcmV0dXJuIGJyY21mX3NkYnJjbV9idXNfdHhjdGwoZHJ2ci0+YnVzLCAodW5zaWduZWQgY2hhciAqKSZwcm90LT5tc2csCisJcmV0dXJuIGJyY21mX3NkYnJjbV9idXNfdHhjdGwoZHJ2ci0+ZGV2LCAodW5zaWduZWQgY2hhciAqKSZwcm90LT5tc2csCiAJCQkJICAgICAgbGVuKTsKIH0KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJZG8gewotCQlyZXQgPSBicmNtZl9zZGJyY21fYnVzX3J4Y3RsKGRydnItPmJ1cywKKwkJcmV0ID0gYnJjbWZfc2RicmNtX2J1c19yeGN0bChkcnZyLT5kZXYsCiAJCQkJKHVuc2lnbmVkIGNoYXIgKikmcHJvdC0+bXNnLAogCQkJCWxlbiArIHNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2RjbWQpKTsKIAkJaWYgKHJldCA8IDApCkBAIC0yODAsNyArMjgwLDcgQEAKIAlzdHJ1Y3QgYnJjbWZfcHJvdG8gKnByb3QgPSBkcnZyLT5wcm90OwogCWludCByZXQgPSAtMTsKIAotCWlmIChkcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgeworCWlmIChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJ1cyBpcyBkb3duLiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0zNzIsNyArMzcyLDcgQEAKIAogCWgtPnByaW9yaXR5ID0gKHBrdGJ1Zi0+cHJpb3JpdHkgJiBCRENfUFJJT1JJVFlfTUFTSyk7CiAJaC0+ZmxhZ3MyID0gMDsKLQloLT5yc3NpID0gMDsKKwloLT5kYXRhX29mZnNldCA9IDA7CiAJQkRDX1NFVF9JRl9JRFgoaCwgaWZpZHgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwppbmRleCA0MDkyOGU1Li42OWYzMzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKQEAgLTMyLDggKzMyLDYgQEAKICNkZWZpbmUgUEtURklMVEVSX0JVRl9TSVpFCQkyMDQ4CiAjZGVmaW5lIEJSQ01GX0FSUE9MX01PREUJCTB4YgkvKiBhZ2VudHxzbm9vcHxwZWVyX2F1dG9yZXBseSAqLwogCi1pbnQgYnJjbWZfbXNnX2xldmVsOwotCiAjZGVmaW5lIE1TR1RSQUNFX1ZFUlNJT04JMQogCiAjZGVmaW5lIEJSQ01GX1BLVF9GSUxURVJfRklYRURfTEVOCW9mZnNldG9mKHN0cnVjdCBicmNtZl9wa3RfZmlsdGVyX2xlLCB1KQpAQCAtODUsMTkgKzgzLDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi12b2lkIGJyY21mX2NfaW5pdCh2b2lkKQotewotCS8qIEluaXQgZ2xvYmFsIHZhcmlhYmxlcyBhdCBydW4tdGltZSwgbm90IGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBpbml0L2RlLWluaXQgb2YgdGhlIGRyaXZlci4KLQkgKiBJbml0aWFsaXphdGlvbgotCSAqIG9mIGdsb2JhbHMgYXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gcmVzdWx0cyBpbiBub24tZGV0ZXJtaW5pc3RpYwotCSAqIGJlaGF2aW91ciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX21zZ19sZXZlbCA9IEJSQ01GX0VSUk9SX1ZBTDsKLX0KLQogYm9vbCBicmNtZl9jX3ByZWNfZW5xKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBwa3RxICpxLAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwppbmRleCA3MTlmZDkzLi41OGQ5MmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSAiZGhkX3Byb3RvLmgiCiAjaW5jbHVkZSAiZGhkX2RiZy5oIgogI2luY2x1ZGUgIndsX2NmZzgwMjExLmgiCi0jaW5jbHVkZSAiYmNtY2hpcC5oIgogCiBNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA4MDIuMTFuIHdpcmVsZXNzIExBTiBmdWxsbWFjIGRyaXZlci4iKTsKQEAgLTc3LDYgKzc2LDcgQEAKIH07CiAKIC8qIEVycm9yIGJpdHMgKi8KK2ludCBicmNtZl9tc2dfbGV2ZWwgPSBCUkNNRl9FUlJPUl9WQUw7CiBtb2R1bGVfcGFyYW0oYnJjbWZfbXNnX2xldmVsLCBpbnQsIDApOwogCiBpbnQgYnJjbWZfaWZuYW1lMmlkeChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBjaGFyICpuYW1lKQpAQCAtMjkyLDcgKzI5Miw3IEBACiAJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87CiAKIAkvKiBSZWplY3QgaWYgZG93biAqLwotCWlmICghZHJ2ci0+dXAgfHwgKGRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSkKKwlpZiAoIWRydnItPnVwIHx8IChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBVcGRhdGUgbXVsdGljYXN0IHN0YXRpc3RpYyAqLwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJYnJjbWZfcHJvdG9faGRycHVzaChkcnZyLCBpZmlkeCwgcGt0YnVmKTsKIAogCS8qIFVzZSBidXMgbW9kdWxlIHRvIHNlbmQgZGF0YSBmcmFtZSAqLwotCXJldHVybiBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShkcnZyLT5idXMsIHBrdGJ1Zik7CisJcmV0dXJuIGJyY21mX3NkYnJjbV9idXNfdHhkYXRhKGRydnItPmRldiwgcGt0YnVmKTsKIH0KIAogc3RhdGljIGludCBicmNtZl9uZXRkZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTMyMiw5ICszMjIsMTEgQEAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAkvKiBSZWplY3QgaWYgZG93biAqLwotCWlmICghZHJ2cl9wcml2LT5wdWIudXAgfHwgKGRydnJfcHJpdi0+cHViLmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSkgewotCQlicmNtZl9kYmcoRVJST1IsICJ4bWl0IHJlamVjdGVkIHB1Yi51cD0lZCBidXNzdGF0ZT0lZFxuIiwKLQkJCSAgZHJ2cl9wcml2LT5wdWIudXAsIGRydnJfcHJpdi0+cHViLmJ1c3N0YXRlKTsKKwlpZiAoIWRydnJfcHJpdi0+cHViLnVwIHx8CisJICAgIChkcnZyX3ByaXYtPnB1Yi5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSkgeworCQlicmNtZl9kYmcoRVJST1IsICJ4bWl0IHJlamVjdGVkIHB1Yi51cD0lZCBzdGF0ZT0lZFxuIiwKKwkJCSAgZHJ2cl9wcml2LT5wdWIudXAsCisJCQkgIGRydnJfcHJpdi0+cHViLmJ1c19pZi0+c3RhdGUpOwogCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0zOTcsMjYgKzM5OSwyMSBAQAogCXJldHVybiBiY21lcnJvcjsKIH0KIAotdm9pZCBicmNtZl9yeF9mcmFtZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgaW50IG51bXBrdCkKK3ZvaWQgYnJjbWZfcnhfZnJhbWUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LAorCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2tiX2xpc3QpCiB7CiAJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87CiAJdW5zaWduZWQgY2hhciAqZXRoOwogCXVpbnQgbGVuOwogCXZvaWQgKmRhdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBuZXh0LCAqc2F2ZV9wa3RidWY7Ci0JaW50IGk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnBuZXh0OwogCXN0cnVjdCBicmNtZl9pZiAqaWZwOwogCXN0cnVjdCBicmNtZl9ldmVudF9tc2cgZXZlbnQ7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQlzYXZlX3BrdGJ1ZiA9IHNrYjsKLQotCWZvciAoaSA9IDA7IHNrYiAmJiBpIDwgbnVtcGt0OyBpKyssIHNrYiA9IHBuZXh0KSB7Ci0KLQkJcG5leHQgPSBza2ItPm5leHQ7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7CisJc2tiX3F1ZXVlX3dhbGtfc2FmZShza2JfbGlzdCwgc2tiLCBwbmV4dCkgeworCQlza2JfdW5saW5rKHNrYiwgc2tiX2xpc3QpOwogCiAJCS8qIEdldCB0aGUgcHJvdG9jb2wsIG1haW50YWluIHNrYiBhcm91bmQgZXRoX3R5cGVfdHJhbnMoKQogCQkgKiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgaGFjayBpcyBmb3IgdGhlIGxpbWl0YXRpb24gb2YKQEAgLTQzNyw2ICs0MzQsMTIgQEAKIAkJaWYgKGlmcCA9PSBOVUxMKQogCQkJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbMF07CiAKKwkJaWYgKCFpZnAgfHwgIWlmcC0+bmRldiB8fAorCQkgICAgaWZwLT5uZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpIHsKKwkJCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJc2tiLT5kZXYgPSBpZnAtPm5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKIApAQCAtNjA1LDkgKzYwOCw3IEBACiAKIAlzcHJpbnRmKGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUpOwogCXNwcmludGYoaW5mby0+dmVyc2lvbiwgIiVsdSIsIGRydnJfcHJpdi0+cHViLmRydl92ZXJzaW9uKTsKLQlzcHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sICIlcyIsIEJDTTQzMjlfRldfTkFNRSk7Ci0Jc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIiVzIiwKLQkJZGV2X25hbWUoYnJjbWZfYnVzX2dldF9kZXZpY2UoZHJ2cl9wcml2LT5wdWIuYnVzKSkpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyIsIGRldl9uYW1lKGRydnJfcHJpdi0+cHViLmRldikpOwogfQogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJyY21mX2V0aHRvb2xfb3BzID0gewpAQCAtNzYxLDcgKzc2Miw3IEBACiAJCWJ1ZmxlbiA9IG1pbl90KHVpbnQsIGRjbWQubGVuLCBCUkNNRl9EQ01EX01BWExFTik7CiAKIAkvKiBzZW5kIHRvIGRvbmdsZSAobXVzdCBiZSB1cCwgYW5kIHdsKSAqLwotCWlmICgoZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpKSB7CisJaWYgKChkcnZyX3ByaXYtPnB1Yi5idXNfaWYtPnN0YXRlICE9IEJSQ01GX0JVU19EQVRBKSkgewogCQlicmNtZl9kYmcoRVJST1IsICJET05HTEVfRE9XTlxuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZG9uZTsKQEAgLTk0MCw3ICs5NDEsOCBAQAogCX0KIH0KIAotc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCBidXNfaGRybGVuKQorc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgYnVzX2hkcmxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IE5VTEw7CiAKQEAgLTk1OSw2ICs5NjEsOCBAQAogCS8qIExpbmsgdG8gYnVzIG1vZHVsZSAqLwogCWRydnJfcHJpdi0+cHViLmJ1cyA9IGJ1czsKIAlkcnZyX3ByaXYtPnB1Yi5oZHJsZW4gPSBidXNfaGRybGVuOworCWRydnJfcHJpdi0+cHViLmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWRydnJfcHJpdi0+cHViLmRldiA9IGRldjsKIAogCS8qIEF0dGFjaCBhbmQgbGluayBpbiB0aGUgcHJvdG9jb2wgKi8KIAlpZiAoYnJjbWZfcHJvdG9fYXR0YWNoKCZkcnZyX3ByaXYtPnB1YikgIT0gMCkgewpAQCAtOTg4LDE0ICs5OTIsMTQgQEAKIAlicmNtZl9kYmcoVFJBQ0UsICJcbiIpOwogCiAJLyogQnJpbmcgdXAgdGhlIGJ1cyAqLwotCXJldCA9IGJyY21mX3NkYnJjbV9idXNfaW5pdCgmZHJ2cl9wcml2LT5wdWIpOworCXJldCA9IGJyY21mX3NkYnJjbV9idXNfaW5pdChkcnZyX3ByaXYtPnB1Yi5kZXYpOwogCWlmIChyZXQgIT0gMCkgewogCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9zZGJyY21fYnVzX2luaXQgZmFpbGVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIElmIGJ1cyBpcyBub3QgcmVhZHksIGNhbid0IGNvbWUgdXAgKi8KLQlpZiAoZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpIHsKKwlpZiAoZHJ2cl9wcml2LT5wdWIuYnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkgewogCQlicmNtZl9kYmcoRVJST1IsICJmYWlsZWQgYnVzIGlzIG5vdCByZWFkeVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTEwNzcsMTAgKzEwODEsNyBAQAogCiAJLyogYXR0YWNoIHRvIGNmZzgwMjExIGZvciBwcmltYXJ5IGludGVyZmFjZSAqLwogCWlmICghaWZpZHgpIHsKLQkJZHJ2ci0+Y29uZmlnID0KLQkJCWJyY21mX2NmZzgwMjExX2F0dGFjaChuZGV2LAotCQkJCQkgICAgICBicmNtZl9idXNfZ2V0X2RldmljZShkcnZyLT5idXMpLAotCQkJCQkgICAgICBkcnZyKTsKKwkJZHJ2ci0+Y29uZmlnID0gYnJjbWZfY2ZnODAyMTFfYXR0YWNoKG5kZXYsIGRydnItPmRldiwgZHJ2cik7CiAJCWlmIChkcnZyLT5jb25maWcgPT0gTlVMTCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAid2xfY2ZnODAyMTFfYXR0YWNoIGZhaWxlZFxuIik7CiAJCQlnb3RvIGZhaWw7CkBAIC0xMTE0LDcgKzExMTUsNyBAQAogCQkJYnJjbWZfcHJvdG9fc3RvcCgmZHJ2cl9wcml2LT5wdWIpOwogCiAJCQkvKiBTdG9wIHRoZSBidXMgbW9kdWxlICovCi0JCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoZHJ2cl9wcml2LT5wdWIuYnVzKTsKKwkJCWJyY21mX3NkYnJjbV9idXNfc3RvcChkcnZyX3ByaXYtPnB1Yi5kZXYpOwogCQl9CiAJfQogfQpAQCAtMTE0OCwzNCArMTE0OSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnJjbWZfbW9kdWxlX2NsZWFudXAodm9pZCkKLXsKLQlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7Ci0KLQlicmNtZl9idXNfdW5yZWdpc3RlcigpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBicmNtZl9tb2R1bGVfaW5pdCh2b2lkKQotewotCWludCBlcnJvcjsKLQotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWVycm9yID0gYnJjbWZfYnVzX3JlZ2lzdGVyKCk7Ci0KLQlpZiAoZXJyb3IpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbWZfYnVzX3JlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlyZXR1cm4gMDsKLQotZmFpbGVkOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1tb2R1bGVfaW5pdChicmNtZl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChicmNtZl9tb2R1bGVfY2xlYW51cCk7Ci0KIGludCBicmNtZl9vc19wcm90b19ibG9jayhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQogewogCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwppbmRleCA0M2I0NDk2Li40M2JhMGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwpAQCAtOTEsNyArOTEsNiBAQAogI2luY2x1ZGUgImRoZF9idXMuaCIKICNpbmNsdWRlICJkaGRfcHJvdG8uaCIKICNpbmNsdWRlICJkaGRfZGJnLmgiCi0jaW5jbHVkZSA8YmNtY2hpcC5oPgogCiAjZGVmaW5lIFRYUUxFTgkJMjA0OAkvKiBidWxrIHR4IHF1ZXVlIGxlbmd0aCAqLwogI2RlZmluZSBUWEhJCQkoVFhRTEVOIC0gMjU2KQkvKiB0dXJuIG9uIGZsb3cgY29udHJvbCBhYm92ZSBUWEhJICovCkBAIC0zMTAsNiArMzA5LDExIEBACiAvKiBGbGFncyBmb3IgU0RIIGNhbGxzICovCiAjZGVmaW5lIEYyU1lOQwkoU0RJT19SRVFfNEJZVEUgfCBTRElPX1JFUV9GSVhFRCkKIAorI2RlZmluZSBCUkNNRk1BQ19GV19OQU1FCSJicmNtL2JyY21mbWFjLmJpbiIKKyNkZWZpbmUgQlJDTUZNQUNfTlZfTkFNRQkiYnJjbS9icmNtZm1hYy50eHQiCitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfRldfTkFNRSk7CitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfTlZfTkFNRSk7CisKIC8qCiAgKiBDb252ZXJzaW9uIG9mIDgwMi4xRCBwcmlvcml0eSB0byBwcmVjZWRlbmNlIGxldmVsCiAgKi8KQEAgLTQ0NSw3ICs0NDksNyBAQAogCiAvKiBtaXNjIGNoaXAgaW5mbyBuZWVkZWQgYnkgc29tZSBvZiB0aGUgcm91dGluZXMgKi8KIC8qIFByaXZhdGUgZGF0YSBmb3IgU0RJTyBidXMgaW50ZXJhY3Rpb24gKi8KLXN0cnVjdCBicmNtZl9idXMgeworc3RydWN0IGJyY21mX3NkaW8gewogCXN0cnVjdCBicmNtZl9wdWIgKmRydnI7CiAKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CS8qIHNkaW8gZGV2aWNlIGhhbmRsZXIgKi8KQEAgLTU2Miw5ICs1NjYsNyBAQAogCiAJc3RydWN0IHNlbWFwaG9yZSBzZHNlbTsKIAotCWNvbnN0IGNoYXIgKmZ3X25hbWU7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKLQljb25zdCBjaGFyICpudl9uYW1lOwogCXUzMiBmd19wdHI7CiB9OwogCkBAIC02MDIsNyArNjA0LDcgQEAKIH0KIAogLyogVG8gY2hlY2sgaWYgdGhlcmUncyB3aW5kb3cgb2ZmZXJlZCAqLwotc3RhdGljIGJvb2wgZGF0YV9vayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgYm9vbCBkYXRhX29rKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJcmV0dXJuICh1OCkoYnVzLT50eF9tYXggLSBidXMtPnR4X3NlcSkgIT0gMCAmJgogCSAgICAgICAoKHU4KShidXMtPnR4X21heCAtIGJ1cy0+dHhfc2VxKSAmIDB4ODApID09IDA7CkBAIC02MTMsNyArNjE1LDcgQEAKICAqIGFkcmVzc2VzIG9uIHRoZSAzMiBiaXQgYmFja3BsYW5lIGJ1cy4KICAqLwogc3RhdGljIHZvaWQKLXJfc2RyZWczMihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiAqcmVndmFyLCB1MzIgcmVnX29mZnNldCwgdTMyICpyZXRyeXZhcikKK3Jfc2RyZWczMihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MzIgKnJlZ3ZhciwgdTMyIHJlZ19vZmZzZXQsIHUzMiAqcmV0cnl2YXIpCiB7CiAJdTggaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChidXMtPmNpLCBCQ01BX0NPUkVfU0RJT19ERVYpOwogCSpyZXRyeXZhciA9IDA7CkBAIC02MzMsNyArNjM1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdfc2RyZWczMihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiByZWd2YWwsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQord19zZHJlZzMyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHUzMiByZWd2YWwsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQogewogCXU4IGlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoYnVzLT5jaSwgQkNNQV9DT1JFX1NESU9fREVWKTsKIAkqcmV0cnl2YXIgPSAwOwpAQCAtNjU4LDE0ICs2NjAsMTQgQEAKIC8qIFBhY2tldCBmcmVlIGFwcGxpY2FibGUgdW5jb25kaXRpb25hbGx5IGZvciBzZGlvIGFuZCBzZHNwaS4KICAqIENvbmRpdGlvbmFsIGlmIGJ1ZnBvb2wgd2FzIHByZXNlbnQgZm9yIGdzcGkgYnVzLgogICovCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcGt0ZnJlZTIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3BrdGZyZWUyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJaWYgKGJ1cy0+dXNlYnVmcG9vbCkKIAkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwogfQogCiAvKiBUdXJuIGJhY2twbGFuZSBjbG9jayBvbiBvciBvZmYgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2h0Y2xrKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBvbiwgYm9vbCBwZW5kb2spCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9odGNsayhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sIG9uLCBib29sIHBlbmRvaykKIHsKIAlpbnQgZXJyOwogCXU4IGNsa2N0bCwgY2xrcmVxLCBkZXZjdGw7CkBAIC02ODcsMTQgKzY4OSw2IEBACiAJCQlyZXR1cm4gLUVCQURFOwogCQl9CiAKLQkJaWYgKHBlbmRvayAmJiAoKGJ1cy0+Y2ktPmNfaW5mWzFdLmlkID09IFBDTUNJQV9DT1JFX0lEKQotCQkJICAgICAgICYmIChidXMtPmNpLT5jX2luZlsxXS5yZXYgPT0gOSkpKSB7Ci0JCQl1MzIgZHVtbXksIHJldHJpZXM7Ci0JCQlyX3NkcmVnMzIoYnVzLCAmZHVtbXksCi0JCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGNsb2NrY3Rsc3RhdHVzKSwKLQkJCQkgICZyZXRyaWVzKTsKLQkJfQotCiAJCS8qIENoZWNrIGN1cnJlbnQgc3RhdHVzICovCiAJCWNsa2N0bCA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAogCQkJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsICZlcnIpOwpAQCAtNzk0LDcgKzc4OCw3IEBACiB9CiAKIC8qIENoYW5nZSBpZGxlL2FjdGl2ZSBTRCBzdGF0ZSAqLwotc3RhdGljIGludCBicmNtZl9zZGJyY21fc2RjbGsoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIG9uKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fc2RjbGsoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBvbikKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTgwNyw3ICs4MDEsNyBAQAogfQogCiAvKiBUcmFuc2l0aW9uIFNEIGFuZCBiYWNrcGxhbmUgY2xvY2sgcmVhZGluZXNzICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jbGtjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHRhcmdldCwgYm9vbCBwZW5kb2spCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jbGtjdGwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCB0YXJnZXQsIGJvb2wgcGVuZG9rKQogewogI2lmZGVmIEJDTURCRwogCXVpbnQgb2xkc3RhdGUgPSBidXMtPmNsa3N0YXRlOwpAQCAtODYzLDcgKzg1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2J1c3NsZWVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBzbGVlcCkKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2J1c3NsZWVwKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgc2xlZXApCiB7CiAJdWludCByZXRyaWVzID0gMDsKIApAQCAtOTExLDEzICs5MDUsNiBAQAogCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCiAJCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgMCwgTlVMTCk7CiAKLQkJLyogRm9yY2UgcGFkIGlzb2xhdGlvbiBvZmYgaWYgcG9zc2libGUKLQkJCSAoaW4gY2FzZSBwb3dlciBuZXZlciB0b2dnbGVkKSAqLwotCQlpZiAoKGJ1cy0+Y2ktPmNfaW5mWzFdLmlkID09IFBDTUNJQV9DT1JFX0lEKQotCQkgICAgJiYgKGJ1cy0+Y2ktPmNfaW5mWzFdLnJldiA+PSAxMCkpCi0JCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkJU0JTRElPX0RFVklDRV9DVEwsIDAsIE5VTEwpOwotCiAJCS8qIE1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBoYXMgdGhlIGJ1cyB1cCAqLwogCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7CiAKQEAgLTk0MiwxMyArOTI5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJ1c193YWtlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIGJ1c193YWtlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaWYgKGJ1cy0+c2xlZXBpbmcpCiAJCWJyY21mX3NkYnJjbV9idXNzbGVlcChidXMsIGZhbHNlKTsKIH0KIAotc3RhdGljIHUzMiBicmNtZl9zZGJyY21faG9zdG1haWwoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHUzMiBicmNtZl9zZGJyY21faG9zdG1haWwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAl1MzIgaW50c3RhdHVzID0gMDsKIAl1MzIgaG1iX2RhdGE7CkBAIC0xMDI0LDcgKzEwMTEsNyBAQAogCXJldHVybiBpbnRzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yeGZhaWwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIGFib3J0LCBib29sIHJ0eCkKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yeGZhaWwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBhYm9ydCwgYm9vbCBydHgpCiB7CiAJdWludCByZXRyaWVzID0gMDsKIAl1MTYgbGFzdHJiYzsKQEAgLTEwODEsMTEgKzEwNjgsMTEgQEAKIAogCS8qIElmIHdlIGNhbid0IHJlYWNoIHRoZSBkZXZpY2UsIHNpZ25hbCBmYWlsdXJlICovCiAJaWYgKGVyciB8fCBicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPnNkaW9kZXYpKQotCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogfQogCiAvKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCi1zdGF0aWMgdWludCBicmNtZl9zZGJyY21fZ2xvbV9mcm9tX2J1ZihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbGVuKQorc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX2dsb21fZnJvbV9idWYoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCBsZW4pCiB7CiAJdWludCBuLCByZXQgPSAwOwogCXN0cnVjdCBza19idWZmICpwOwpAQCAtMTEwNywxMyArMTA5NCwzNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1OCBicmNtZl9zZGJyY21fcnhnbG9tKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTggcnhzZXEpCisvKiByZXR1cm4gdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlciBjaGFpbiAqLworc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX2dsb21fbGVuKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJdWludCB0b3RhbDsKKworCXRvdGFsID0gMDsKKwlza2JfcXVldWVfd2FsaygmYnVzLT5nbG9tLCBwKQorCQl0b3RhbCArPSBwLT5sZW47CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fZnJlZV9nbG9tKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKmN1ciwgKm5leHQ7CisKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZidXMtPmdsb20sIGN1ciwgbmV4dCkgeworCQlza2JfdW5saW5rKGN1ciwgJmJ1cy0+Z2xvbSk7CisJCWJyY211X3BrdF9idWZfZnJlZV9za2IoY3VyKTsKKwl9Cit9CisKK3N0YXRpYyB1OCBicmNtZl9zZGJyY21fcnhnbG9tKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4IHJ4c2VxKQogewogCXUxNiBkbGVuLCB0b3RsZW47CiAJdTggKmRwdHIsIG51bSA9IDA7CiAKIAl1MTYgc3VibGVuLCBjaGVjazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGZpcnN0LCAqcGxhc3QsICpwbmV4dCwgKnNhdmVfcGZpcnN0OworCXN0cnVjdCBza19idWZmICpwZmlyc3QsICpwbmV4dDsKIAogCWludCBlcnJjb2RlOwogCXU4IGNoYW4sIHNlcSwgZG9mZiwgc2Zkb2ZmOwpAQCAtMTEzMCw3ICsxMTM5LDcgQEAKIAogCS8qIElmIHRoZXJlJ3MgYSBkZXNjcmlwdG9yLCBnZW5lcmF0ZSB0aGUgcGFja2V0IGNoYWluICovCiAJaWYgKGJ1cy0+Z2xvbWQpIHsKLQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dCA9IE5VTEw7CisJCXBmaXJzdCA9IHBuZXh0ID0gTlVMTDsKIAkJZGxlbiA9ICh1MTYpIChidXMtPmdsb21kLT5sZW4pOwogCQlkcHRyID0gYnVzLT5nbG9tZC0+ZGF0YTsKIAkJaWYgKCFkbGVuIHx8IChkbGVuICYgMSkpIHsKQEAgLTExOTEsMTEgKzEyMDAsNyBAQAogCQkJfQogCQkJcGZpcnN0ID0gcG5leHQgPSBOVUxMOwogCQl9IGVsc2UgewotCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmJ1cy0+Z2xvbSkpCi0JCQkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmYnVzLT5nbG9tLCBwZmlyc3QsIHBuZXh0KSB7Ci0JCQkJCXNrYl91bmxpbmsocGZpcnN0LCAmYnVzLT5nbG9tKTsKLQkJCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwZmlyc3QpOwotCQkJCX0KKwkJCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAkJCW51bSA9IDA7CiAJCX0KIApAQCAtMTIxOCwyNCArMTIyMywyMSBAQAogCQl9CiAKIAkJcGZpcnN0ID0gc2tiX3BlZWsoJmJ1cy0+Z2xvbSk7Ci0JCWRsZW4gPSAodTE2KSBicmNtdV9wa3R0b3RsZW4ocGZpcnN0KTsKKwkJZGxlbiA9ICh1MTYpIGJyY21mX3NkYnJjbV9nbG9tX2xlbihidXMpOwogCiAJCS8qIERvIGFuIFNESU8gcmVhZCBmb3IgdGhlIHN1cGVyZnJhbWUuICBDb25maWd1cmFibGUgaW92YXIgdG8KIAkJICogcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBjaGFpbmVkIHBhY2tldCwgb3IgYWxsb2NhdGUgYSBsYXJnZQogCQkgKiBwYWNrZXQgYW5kIGFuZCBjb3B5IGludG8gdGhlIGNoYWluLgogCQkgKi8KIAkJaWYgKHVzZWNoYWluKSB7Ci0JCQllcnJjb2RlID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGJ1cy0+c2Rpb2RldiwKKwkJCWVycmNvZGUgPSBicmNtZl9zZGNhcmRfcmVjdl9jaGFpbihidXMtPnNkaW9kZXYsCiAJCQkJCWJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJCVNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsICh1OCAqKSBwZmlyc3QtPmRhdGEsIGRsZW4sCi0JCQkJCXBmaXJzdCk7CisJCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICZidXMtPmdsb20pOwogCQl9IGVsc2UgaWYgKGJ1cy0+ZGF0YXB0cikgewogCQkJZXJyY29kZSA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsCiAJCQkJCWJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJCVNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsIGJ1cy0+ZGF0YXB0ciwgZGxlbiwKLQkJCQkJTlVMTCk7CisJCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsCisJCQkJCWJ1cy0+ZGF0YXB0ciwgZGxlbik7CiAJCQlzdWJsZW4gPSAodTE2KSBicmNtZl9zZGJyY21fZ2xvbV9mcm9tX2J1ZihidXMsIGRsZW4pOwogCQkJaWYgKHN1YmxlbiAhPSBkbGVuKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAiRkFJTEVEIFRPIENPUFksIGRsZW4gJWQgc3VibGVuICVkXG4iLApAQCAtMTI2MiwxMCArMTI2NCw3IEBACiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgZmFsc2UpOwogCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwotCQkJCXNrYl9xdWV1ZV93YWxrX3NhZmUoJmJ1cy0+Z2xvbSwgcGZpcnN0LCBwbmV4dCkgewotCQkJCQlza2JfdW5saW5rKHBmaXJzdCwgJmJ1cy0+Z2xvbSk7Ci0JCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQl9CisJCQkJYnJjbWZfc2RicmNtX2ZyZWVfZ2xvbShidXMpOwogCQkJfQogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEzMzgsMTAgKzEzMzcsMTQgQEAKIAkJLyogUmVtb3ZlIHN1cGVyZnJhbWUgaGVhZGVyLCByZW1lbWJlciBvZmZzZXQgKi8KIAkJc2tiX3B1bGwocGZpcnN0LCBkb2ZmKTsKIAkJc2Zkb2ZmID0gZG9mZjsKKwkJbnVtID0gMDsKIAogCQkvKiBWYWxpZGF0ZSBhbGwgdGhlIHN1YmZyYW1lIGhlYWRlcnMgKi8KLQkJZm9yIChudW0gPSAwLCBwbmV4dCA9IHBmaXJzdDsgcG5leHQgJiYgIWVycmNvZGU7Ci0JCSAgICAgbnVtKyssIHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJc2tiX3F1ZXVlX3dhbGsoJmJ1cy0+Z2xvbSwgcG5leHQpIHsKKwkJCS8qIGxlYXZlIHdoZW4gaW52YWxpZCBzdWJmcmFtZSBpcyBmb3VuZCAqLworCQkJaWYgKGVycmNvZGUpCisJCQkJYnJlYWs7CisKIAkJCWRwdHIgPSAodTggKikgKHBuZXh0LT5kYXRhKTsKIAkJCWRsZW4gPSAodTE2KSAocG5leHQtPmxlbik7CiAJCQlzdWJsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0cik7CkBAIC0xMzc0LDYgKzEzNzcsOCBAQAogCQkJCQkgIG51bSwgZG9mZiwgc3VibGVuLCBTRFBDTV9IRFJMRU4pOwogCQkJCWVycmNvZGUgPSAtMTsKIAkJCX0KKwkJCS8qIGluY3JlYXNlIHRoZSBzdWJmcmFtZSBjb3VudCAqLworCQkJbnVtKys7CiAJCX0KIAogCQlpZiAoZXJyY29kZSkgewpAQCAtMTM4NywyMyArMTM5MiwxNSBAQAogCQkJCWJ1cy0+Z2xvbWVyciA9IDA7CiAJCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsIGZhbHNlKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKLQkJCQlza2JfcXVldWVfd2Fsa19zYWZlKCZidXMtPmdsb20sIHBmaXJzdCwgcG5leHQpIHsKLQkJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwotCQkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBmaXJzdCk7Ci0JCQkJfQorCQkJCWJyY21mX3NkYnJjbV9mcmVlX2dsb20oYnVzKTsKIAkJCX0KIAkJCWJ1cy0+bmV4dGxlbiA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCS8qIEJhc2ljIFNEIGZyYW1pbmcgbG9va3Mgb2sgLSBwcm9jZXNzIGVhY2ggcGFja2V0IChoZWFkZXIpICovCi0JCXNhdmVfcGZpcnN0ID0gcGZpcnN0OwotCQlwbGFzdCA9IE5VTEw7CiAKLQkJZm9yIChudW0gPSAwOyBwZmlyc3Q7IHJ4c2VxKyssIHBmaXJzdCA9IHBuZXh0KSB7Ci0JCQlwbmV4dCA9IHBmaXJzdC0+bmV4dDsKLQkJCXBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0KKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmYnVzLT5nbG9tLCBwZmlyc3QsIHBuZXh0KSB7CiAJCQlkcHRyID0gKHU4ICopIChwZmlyc3QtPmRhdGEpOwogCQkJc3VibGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRwdHIpOwogCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwpAQCAtMTQyMyw2ICsxNDIwLDggQEAKIAkJCQlidXMtPnJ4X2JhZHNlcSsrOwogCQkJCXJ4c2VxID0gc2VxOwogCQkJfQorCQkJcnhzZXErKzsKKwogI2lmZGVmIEJDTURCRwogCQkJaWYgKEJSQ01GX0JZVEVTX09OKCkgJiYgQlJDTUZfREFUQV9PTigpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ4IFN1YmZyYW1lIERhdGE6XG4iKTsKQEAgLTE0MzUsMzYgKzE0MzQsMjIgQEAKIAkJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAKIAkJCWlmIChwZmlyc3QtPmxlbiA9PSAwKSB7CisJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpCi0JCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJZWxzZQotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCiAJCQkJY29udGludWU7CiAJCQl9IGVsc2UgaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoYnVzLT5kcnZyLCAmaWZpZHgsCiAJCQkJCQkgICAgICAgcGZpcnN0KSAhPSAwKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAicnggcHJvdG9jb2wgZXJyb3JcbiIpOwogCQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpCi0JCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJZWxzZQotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qIHRoaXMgcGFja2V0IHdpbGwgZ28gdXAsIGxpbmsgYmFjayBpbnRvCi0JCQkJIGNoYWluIGFuZCBjb3VudCBpdCAqLwotCQkJcGZpcnN0LT5uZXh0ID0gcG5leHQ7Ci0JCQlwbGFzdCA9IHBmaXJzdDsKLQkJCW51bSsrOwotCiAjaWZkZWYgQkNNREJHCiAJCQlpZiAoQlJDTUZfR0xPTV9PTigpKSB7CiAJCQkJYnJjbWZfZGJnKEdMT00sICJzdWJmcmFtZSAlZCB0byBzdGFjaywgJXAgKCVwLyVkKSBueHQvbG5rICVwLyVwXG4iLAotCQkJCQkgIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCisJCQkJCSAgYnVzLT5nbG9tLnFsZW4sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAogCQkJCQkgIHBmaXJzdC0+bGVuLCBwZmlyc3QtPm5leHQsCiAJCQkJCSAgcGZpcnN0LT5wcmV2KTsKIAkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULApAQCAtMTQ3MywxOSArMTQ1OCwyMCBAQAogCQkJfQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCQl9Ci0JCWlmIChudW0pIHsKKwkJLyogc2VudCBhbnkgcmVtYWluaW5nIHBhY2tldHMgdXAgKi8KKwkJaWYgKGJ1cy0+Z2xvbS5xbGVuKSB7CiAJCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCQlicmNtZl9yeF9mcmFtZShidXMtPmRydnIsIGlmaWR4LCBzYXZlX3BmaXJzdCwgbnVtKTsKKwkJCWJyY21mX3J4X2ZyYW1lKGJ1cy0+ZHJ2ciwgaWZpZHgsICZidXMtPmdsb20pOwogCQkJZG93bigmYnVzLT5zZHNlbSk7CiAJCX0KIAogCQlidXMtPnJ4Z2xvbWZyYW1lcysrOwotCQlidXMtPnJ4Z2xvbXBrdHMgKz0gbnVtOworCQlidXMtPnJ4Z2xvbXBrdHMgKz0gYnVzLT5nbG9tLnFsZW47CiAJfQogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2RjbWRfcmVzcF93YWl0KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCAqY29uZGl0aW9uLAorc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dhaXQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCAqY29uZGl0aW9uLAogCQkJCQlib29sICpwZW5kaW5nKQogewogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtMTUwNyw3ICsxNDkzLDcgQEAKIAlyZXR1cm4gdGltZW91dDsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dha2Uoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dha2Uoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmYnVzLT5kY21kX3Jlc3Bfd2FpdCkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVzLT5kY21kX3Jlc3Bfd2FpdCk7CkBAIC0xNTE1LDcgKzE1MDEsNyBAQAogCXJldHVybiAwOwogfQogc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9yZWFkX2NvbnRyb2woc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqaGRyLCB1aW50IGxlbiwgdWludCBkb2ZmKQorYnJjbWZfc2RicmNtX3JlYWRfY29udHJvbChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1OCAqaGRyLCB1aW50IGxlbiwgdWludCBkb2ZmKQogewogCXVpbnQgcmRsZW4sIHBhZDsKIApAQCAtMTU3Myw4ICsxNTU5LDcgQEAKIAlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsCiAJCQkJYnVzLT5zZGlvZGV2LT5zYndhZCwKIAkJCQlTRElPX0ZVTkNfMiwKLQkJCQlGMlNZTkMsIChidXMtPnJ4Y3RsICsgQlJDTUZfRklSU1RSRUFEKSwgcmRsZW4sCi0JCQkJTlVMTCk7CisJCQkJRjJTWU5DLCAoYnVzLT5yeGN0bCArIEJSQ01GX0ZJUlNUUkVBRCksIHJkbGVuKTsKIAlidXMtPmYycnhkYXRhKys7CiAKIAkvKiBDb250cm9sIGZyYW1lIGZhaWx1cmVzIG5lZWQgcmV0cmFuc21pc3Npb24gKi8KQEAgLTE2MDUsNyArMTU5MCw3IEBACiB9CiAKIC8qIFBhZCByZWFkIHRvIGJsb2Nrc2l6ZSBmb3IgZWZmaWNpZW5jeSAqLwotc3RhdGljIHZvaWQgYnJjbWZfcGFkKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTE2ICpwYWQsIHUxNiAqcmRsZW4pCitzdGF0aWMgdm9pZCBicmNtZl9wYWQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdTE2ICpwYWQsIHUxNiAqcmRsZW4pCiB7CiAJaWYgKGJ1cy0+cm91bmR1cCAmJiBidXMtPmJsb2Nrc2l6ZSAmJiAqcmRsZW4gPiBidXMtPmJsb2Nrc2l6ZSkgewogCQkqcGFkID0gYnVzLT5ibG9ja3NpemUgLSAoKnJkbGVuICUgYnVzLT5ibG9ja3NpemUpOwpAQCAtMTYxOCw3ICsxNjAzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJyY21mX2FsbG9jX3BrdF9hbmRfcmVhZChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUxNiByZGxlbiwKK2JyY21mX2FsbG9jX3BrdF9hbmRfcmVhZChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MTYgcmRsZW4sCiAJCQkgc3RydWN0IHNrX2J1ZmYgKipwa3QsIHU4ICoqcnhidWYpCiB7CiAJaW50IHNkcmV0OwkJLyogUmV0dXJuIGNvZGUgZnJvbSBjYWxscyAqLwpAQCAtMTYzMCw5ICsxNjE1LDggQEAKIAlwa3RfYWxpZ24oKnBrdCwgcmRsZW4sIEJSQ01GX1NEQUxJR04pOwogCSpyeGJ1ZiA9ICh1OCAqKSAoKCpwa3QpLT5kYXRhKTsKIAkvKiBSZWFkIHRoZSBlbnRpcmUgZnJhbWUgKi8KLQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJICAgICAgU0RJT19GVU5DXzIsIEYyU1lOQywKLQkJCQkgICAgICAqcnhidWYsIHJkbGVuLCAqcGt0KTsKKwlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJICAgICAgU0RJT19GVU5DXzIsIEYyU1lOQywgKnBrdCk7CiAJYnVzLT5mMnJ4ZGF0YSsrOwogCiAJaWYgKHNkcmV0IDwgMCkgewpAQCAtMTY1MSw3ICsxNjM1LDcgQEAKIAogLyogQ2hlY2tzIHRoZSBoZWFkZXIgKi8KIHN0YXRpYyBpbnQKLWJyY21mX2NoZWNrX3J4YnVmKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAorYnJjbWZfY2hlY2tfcnhidWYoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAogCQkgIHU4IHJ4c2VxLCB1MTYgbmV4dGxlbiwgdTE2ICpsZW4pCiB7CiAJdTE2IGNoZWNrOwpAQCAtMTcwNyw3ICsxNjkxLDcgQEAKIAogLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IGJlIG1vcmUgZnJhbWVzIHRvIHJlYWQgKi8KIHN0YXRpYyB1aW50Ci1icmNtZl9zZGJyY21fcmVhZGZyYW1lcyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKK2JyY21mX3NkYnJjbV9yZWFkZnJhbWVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKIHsKIAl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KIAl1OCBjaGFuLCBzZXEsIGRvZmY7CS8qIEV4dHJhY3RlZCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCkBAIC0xNzMwLDcgKzE3MTQsOCBAQAogCSpmaW5pc2hlZCA9IGZhbHNlOwogCiAJZm9yIChyeHNlcSA9IGJ1cy0+cnhfc2VxLCByeGxlZnQgPSBtYXhmcmFtZXM7Ci0JICAgICAhYnVzLT5yeHNraXAgJiYgcnhsZWZ0ICYmIGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RPV047CisJICAgICAhYnVzLT5yeHNraXAgJiYgcnhsZWZ0ICYmCisJICAgICBidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgIT0gQlJDTUZfQlVTX0RPV047CiAJICAgICByeHNlcSsrLCByeGxlZnQtLSkgewogCiAJCS8qIEhhbmRsZSBnbG9tbWluZyBzZXBhcmF0ZWx5ICovCkBAIC0xODYwLDcgKzE4NDUsNyBAQAogCQkvKiBSZWFkIGZyYW1lIGhlYWRlciAoaGFyZHdhcmUgYW5kIHNvZnR3YXJlKSAqLwogCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCiAJCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIGJ1cy0+cnhoZHIsCi0JCQkJCSAgICAgIEJSQ01GX0ZJUlNUUkVBRCwgTlVMTCk7CisJCQkJCSAgICAgIEJSQ01GX0ZJUlNUUkVBRCk7CiAJCWJ1cy0+ZjJyeGhkcnMrKzsKIAogCQlpZiAoc2RyZXQgPCAwKSB7CkBAIC0yMDA5LDkgKzE5OTQsOCBAQAogCQlwa3RfYWxpZ24ocGt0LCByZGxlbiwgQlJDTUZfU0RBTElHTik7CiAKIAkJLyogUmVhZCB0aGUgcmVtYWluaW5nIGZyYW1lIGRhdGEgKi8KLQkJc2RyZXQgPSBicmNtZl9zZGNhcmRfcmVjdl9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICgodTggKikgKHBrdC0+ZGF0YSkpLAotCQkJCXJkbGVuLCBwa3QpOworCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIHBrdCk7CiAJCWJ1cy0+ZjJyeGRhdGErKzsKIAogCQlpZiAoc2RyZXQgPCAwKSB7CkBAIC0yMDc4LDcgKzIwNjIsNyBAQAogCiAJCS8qIFVubG9jayBkdXJpbmcgcnggY2FsbCAqLwogCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCWJyY21mX3J4X2ZyYW1lKGJ1cy0+ZHJ2ciwgaWZpZHgsIHBrdCwgMSk7CisJCWJyY21mX3J4X3BhY2tldChidXMtPmRydnIsIGlmaWR4LCBwa3QpOwogCQlkb3duKCZidXMtPnNkc2VtKTsKIAl9CiAJcnhjb3VudCA9IG1heGZyYW1lcyAtIHJ4bGVmdDsKQEAgLTIwOTgsMTYgKzIwODIsOCBAQAogCXJldHVybiByeGNvdW50OwogfQogCi1zdGF0aWMgaW50Ci1icmNtZl9zZGJyY21fc2VuZF9idWYoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCXJldHVybiBicmNtZl9zZGNhcmRfc2VuZF9idWYKLQkJKGJ1cy0+c2Rpb2RldiwgYWRkciwgZm4sIGZsYWdzLCBidWYsIG5ieXRlcywgcGt0KTsKLX0KLQogc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV93YWl0X2Zvcl9ldmVudChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgKmxvY2t2YXIpCiticmNtZl9zZGJyY21fd2FpdF9mb3JfZXZlbnQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCAqbG9ja3ZhcikKIHsKIAl1cCgmYnVzLT5zZHNlbSk7CiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYnVzLT5jdHJsX3dhaXQsCkBAIC0yMTE3LDcgKzIwOTMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3dhaXRfZXZlbnRfd2FrZXVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK2JyY21mX3NkYnJjbV93YWl0X2V2ZW50X3dha2V1cChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZidXMtPmN0cmxfd2FpdCkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVzLT5jdHJsX3dhaXQpOwpAQCAtMjEyNiw3ICsyMTAyLDcgQEAKIAogLyogV3JpdGVzIGEgSFcvU1cgaGVhZGVyIGludG8gdGhlIHBhY2tldCBhbmQgc2VuZHMgaXQuICovCiAvKiBBc3N1bWVzOiAoYSkgaGVhZGVyIHNwYWNlIGFscmVhZHkgdGhlcmUsIChiKSBjYWxsZXIgaG9sZHMgbG9jayAqLwotc3RhdGljIGludCBicmNtZl9zZGJyY21fdHhwa3Qoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAorc3RhdGljIGludCBicmNtZl9zZGJyY21fdHhwa3Qoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJCSAgICAgIHVpbnQgY2hhbiwgYm9vbCBmcmVlX3BrdCkKIHsKIAlpbnQgcmV0OwpAQCAtMjIxNSw5ICsyMTkxLDggQEAKIAlpZiAobGVuICYgKEFMSUdOTUVOVCAtIDEpKQogCQkJbGVuID0gcm91bmR1cChsZW4sIEFMSUdOTUVOVCk7CiAKLQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwKLQkJCQkgICAgbGVuLCBwa3QpOworCXJldCA9IGJyY21mX3NkY2FyZF9zZW5kX3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIHBrdCk7CiAJYnVzLT5mMnR4ZGF0YSsrOwogCiAJaWYgKHJldCA8IDApIHsKQEAgLTIyNjQsNyArMjIzOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX3NlbmRmcm9tcShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzKQorc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX3NlbmRmcm9tcShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IG1heGZyYW1lcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXUzMiBpbnRzdGF0dXMgPSAwOwpAQCAtMjMxMiwxNCArMjI4NywxNCBAQAogCX0KIAogCS8qIERlZmxvdy1jb250cm9sIHN0YWNrIGlmIG5lZWRlZCAqLwotCWlmIChkcnZyLT51cCAmJiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEpICYmCisJaWYgKGRydnItPnVwICYmIChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19EQVRBKSAmJgogCSAgICBkcnZyLT50eG9mZiAmJiAocGt0cV9sZW4oJmJ1cy0+dHhxKSA8IFRYTE9XKSkKIAkJYnJjbWZfdHhmbG93Y29udHJvbChkcnZyLCAwLCBPRkYpOwogCiAJcmV0dXJuIGNudDsKIH0KIAotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2RwYyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fZHBjKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJdTMyIGludHN0YXR1cywgbmV3c3RhdHVzID0gMDsKIAl1aW50IHJldHJpZXMgPSAwOwpAQCAtMjM0Nyw3ICsyMzIyLDcgQEAKIAkJCQkJICAgICAgIFNCU0RJT19ERVZJQ0VfQ1RMLCAmZXJyKTsKIAkJaWYgKGVycikgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBERVZDVEw6ICVkXG4iLCBlcnIpOwotCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCQkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCX0KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIApAQCAtMjM1Nyw3ICsyMzMyLDcgQEAKIAkJaWYgKGVycikgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBDU1I6ICVkXG4iLAogCQkJCSAgZXJyKTsKLQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQl9CiAKIAkJYnJjbWZfZGJnKElORk8sICJEUEM6IFBFTkRJTkcsIGRldmN0bCAweCUwMnggY2xrY3RsIDB4JTAyeFxuIiwKQEAgLTIzNzAsNyArMjM0NSw3IEBACiAJCQlpZiAoZXJyKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3IgcmVhZGluZyBERVZDVEw6ICVkXG4iLAogCQkJCQkgIGVycik7Ci0JCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCQkJCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQkJfQogCQkJZGV2Y3RsICY9IH5TQlNESU9fREVWQ1RMX0NBX0lOVF9PTkxZOwogCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLApAQCAtMjM3OCw3ICsyMzUzLDcgQEAKIAkJCWlmIChlcnIpIHsKIAkJCQlicmNtZl9kYmcoRVJST1IsICJlcnJvciB3cml0aW5nIERFVkNUTDogJWRcbiIsCiAJCQkJCSAgZXJyKTsKLQkJCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCQkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCQl9CiAJCQlidXMtPmNsa3N0YXRlID0gQ0xLX0FWQUlMOwogCQl9IGVsc2UgewpAQCAtMjQ4MCw5ICsyNDU1LDkgQEAKIAkJKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKSkgewogCQlpbnQgcmV0LCBpOwogCi0JCXJldCA9IGJyY21mX3NkYnJjbV9zZW5kX2J1ZihidXMsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCXJldCA9IGJyY21mX3NkY2FyZF9zZW5kX2J1ZihidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCiAJCQlTRElPX0ZVTkNfMiwgRjJTWU5DLCAodTggKikgYnVzLT5jdHJsX2ZyYW1lX2J1ZiwKLQkJCSh1MzIpIGJ1cy0+Y3RybF9mcmFtZV9sZW4sIE5VTEwpOworCQkJKHUzMikgYnVzLT5jdHJsX2ZyYW1lX2xlbik7CiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZApAQCAtMjUzNCwxMSArMjUwOSwxMSBAQAogCQkgZWxzZSBhd2FpdCBuZXh0IGludGVycnVwdCAqLwogCS8qIE9uIGZhaWxlZCByZWdpc3RlciBhY2Nlc3MsIGFsbCBiZXRzIGFyZSBvZmY6CiAJCSBubyByZXNjaGVkIG9yIGludGVycnVwdHMgKi8KLQlpZiAoKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHx8CisJaWYgKChidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHx8CiAJICAgIGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+c2Rpb2RldikpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiZmFpbGVkIGJhY2twbGFuZSBhY2Nlc3Mgb3ZlciBTRElPLCBoYWx0aW5nIG9wZXJhdGlvbiAlZFxuIiwKIAkJCSAgYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5zZGlvZGV2KSk7Ci0JCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJCWJ1cy0+aW50c3RhdHVzID0gMDsKIAl9IGVsc2UgaWYgKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX1BFTkRJTkcpIHsKIAkJYnJjbWZfZGJnKElORk8sICJyZXNjaGVkdWxlZCBkdWUgdG8gQ0xLX1BFTkRJTkcgYXdhaXRpbmcgSV9DSElQQUNUSVZFIGludGVycnVwdFxuIik7CkBAIC0yNTY1LDcgKzI1NDAsNyBAQAogCiBzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kcGNfdGhyZWFkKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKikgZGF0YTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopIGRhdGE7CiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJLyogUnVuIHVudGlsIHNpZ25hbCByZWNlaXZlZCAqLwpAQCAtMjU3NSwxMiArMjU1MCwxMiBAQAogCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmYnVzLT5kcGNfd2FpdCkpIHsKIAkJCS8qIENhbGwgYnVzIGRwYyB1bmxlc3MgaXQgaW5kaWNhdGVkIGRvd24KIAkJCSh0aGVuIGNsZWFuIHN0b3ApICovCi0JCQlpZiAoYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTikgeworCQkJaWYgKGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTikgewogCQkJCWlmIChicmNtZl9zZGJyY21fZHBjKGJ1cykpCiAJCQkJCWNvbXBsZXRlKCZidXMtPmRwY193YWl0KTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogYWZ0ZXIgc3RvcHBpbmcgdGhlIGJ1cywgZXhpdCB0aHJlYWQgKi8KLQkJCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzKTsKKwkJCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzLT5zZGlvZGV2LT5kZXYpOwogCQkJCWJ1cy0+ZHBjX3RzayA9IE5VTEw7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yNTkwLDEwICsyNTY1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCitpbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWludCByZXQgPSAtRUJBREU7CiAJdWludCBkYXRhbGVuLCBwcmVjOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMjY0MSw3ICsyNjE5LDcgQEAKIH0KIAogc3RhdGljIGludAotYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCB3cml0ZSwgdTMyIGFkZHJlc3MsIHU4ICpkYXRhLAorYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgd3JpdGUsIHUzMiBhZGRyZXNzLCB1OCAqZGF0YSwKIAkJIHVpbnQgc2l6ZSkKIHsKIAlpbnQgYmNtZXJyb3IgPSAwOwpAQCAtMjcwMiw3ICsyNjgwLDcgQEAKICNpZmRlZiBCQ01EQkcKICNkZWZpbmUgQ09OU09MRV9MSU5FX01BWAkxOTIKIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlzdHJ1Y3QgYnJjbWZfY29uc29sZSAqYyA9ICZidXMtPmNvbnNvbGU7CiAJdTggbGluZVtDT05TT0xFX0xJTkVfTUFYXSwgY2g7CkBAIC0yNzc5LDE0ICsyNzU3LDE0IEBACiB9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLXN0YXRpYyBpbnQgYnJjbWZfdHhfZnJhbWUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqZnJhbWUsIHUxNiBsZW4pCitzdGF0aWMgaW50IGJyY21mX3R4X2ZyYW1lKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4ICpmcmFtZSwgdTE2IGxlbikKIHsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCiAJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKLQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuLCBOVUxMKTsKKwlyZXQgPSBicmNtZl9zZGNhcmRfc2VuZF9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAorCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuKTsKIAogCWlmIChyZXQgPCAwKSB7CiAJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZCB0ZXJtaW5hdGUgdGhlIGZyYW1lICovCkBAIC0yODIyLDcgKzI4MDAsNyBAQAogfQogCiBpbnQKLWJyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQorYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCiB7CiAJdTggKmZyYW1lOwogCXUxNiBsZW47CkBAIC0yODMwLDYgKzI4MDgsOSBAQAogCXVpbnQgcmV0cmllcyA9IDA7CiAJdTggZG9mZiA9IDA7CiAJaW50IHJldCA9IC0xOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMjkzNywxMSArMjkxOCwxNCBAQAogfQogCiBpbnQKLWJyY21mX3NkYnJjbV9idXNfcnhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQorYnJjbWZfc2RicmNtX2J1c19yeGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCiB7CiAJaW50IHRpbWVsZWZ0OwogCXVpbnQgcnhsZW4gPSAwOwogCWJvb2wgcGVuZGluZzsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTI5NzQsNyArMjk1OCw3IEBACiAJcmV0dXJuIHJ4bGVuID8gKGludClyeGxlbiA6IC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkdmFycyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHZvaWQgKmFyZywgaW50IGxlbikKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkdmFycyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB2b2lkICphcmcsIGludCBsZW4pCiB7CiAJaW50IGJjbWVycm9yID0gMDsKIApAQCAtMzAwNyw3ICsyOTkxLDcgQEAKIAlyZXR1cm4gYmNtZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3dyaXRlX3ZhcnMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fd3JpdGVfdmFycyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWludCBiY21lcnJvciA9IDA7CiAJdTMyIHZhcnNpemU7CkBAIC0zMDk0LDExICszMDc4LDEwIEBACiAJcmV0dXJuIGJjbWVycm9yOwogfQogCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9zdGF0ZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgZW50ZXIpCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9zdGF0ZShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sIGVudGVyKQogewogCXVpbnQgcmV0cmllczsKIAlpbnQgYmNtZXJyb3IgPSAwOwotCXU4IGlkeDsKIAlzdHJ1Y3QgY2hpcF9pbmZvICpjaSA9IGJ1cy0+Y2k7CiAKIAkvKiBUbyBlbnRlciBkb3dubG9hZCBzdGF0ZSwgZGlzYWJsZSBBUk0gYW5kIHJlc2V0IFNPQ1JBTS4KQEAgLTMxMDcsMTEgKzMwOTAsOSBAQAogCWlmIChlbnRlcikgewogCQlidXMtPmFscF9vbmx5ID0gdHJ1ZTsKIAotCQlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7Ci0JCWJyY21mX3NkaW9fY2hpcF9jb3JlZGlzYWJsZShidXMtPnNkaW9kZXYsIGNpLT5jX2luZltpZHhdLmJhc2UpOworCQljaS0+Y29yZWRpc2FibGUoYnVzLT5zZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0FSTV9DTTMpOwogCi0JCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIEJDTUFfQ09SRV9JTlRFUk5BTF9NRU0pOwotCQlicmNtZl9zZGlvX2NoaXBfcmVzZXRjb3JlKGJ1cy0+c2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0uYmFzZSk7CisJCWNpLT5yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSk7CiAKIAkJLyogQ2xlYXIgdGhlIHRvcCBiaXQgb2YgbWVtb3J5ICovCiAJCWlmIChidXMtPnJhbXNpemUpIHsKQEAgLTMxMjAsOSArMzEwMSw3IEBACiAJCQkJCSAodTggKikmemVyb3MsIDQpOwogCQl9CiAJfSBlbHNlIHsKLQkJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSk7Ci0JCWlmICghYnJjbWZfc2Rpb19jaGlwX2lzY29yZXVwKGJ1cy0+c2Rpb2RldiwKLQkJCQkJICAgICAgY2ktPmNfaW5mW2lkeF0uYmFzZSkpIHsKKwkJaWYgKCFjaS0+aXNjb3JldXAoYnVzLT5zZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSkpIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgIlNPQ1JBTSBjb3JlIGlzIGRvd24gYWZ0ZXIgcmVzZXQ/XG4iKTsKIAkJCWJjbWVycm9yID0gLUVCQURFOwogCQkJZ290byBmYWlsOwpAQCAtMzEzNywxOSArMzExNiwxOCBAQAogCQl3X3NkcmVnMzIoYnVzLCAweEZGRkZGRkZGLAogCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGludHN0YXR1cyksICZyZXRyaWVzKTsKIAotCQlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7Ci0JCWJyY21mX3NkaW9fY2hpcF9yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBjaS0+Y19pbmZbaWR4XS5iYXNlKTsKKwkJY2ktPnJlc2V0Y29yZShidXMtPnNkaW9kZXYsIGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7CiAKIAkJLyogQWxsb3cgSFQgQ2xvY2sgbm93IHRoYXQgdGhlIEFSTSBpcyBydW5uaW5nLiAqLwogCQlidXMtPmFscF9vbmx5ID0gZmFsc2U7CiAKLQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19MT0FEOworCQlidXMtPmRydnItPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfTE9BRDsKIAl9CiBmYWlsOgogCXJldHVybiBiY21lcnJvcjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAoYnVzLT5maXJtd2FyZS0+c2l6ZSA8IGJ1cy0+ZndfcHRyICsgbGVuKQogCQlsZW4gPSBidXMtPmZpcm13YXJlLT5zaXplIC0gYnVzLT5md19wdHI7CkBAIC0zMTU5LDEwICszMTM3LDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1NT0RVTEVfRklSTVdBUkUoQkNNNDMyOV9GV19OQU1FKTsKLU1PRFVMRV9GSVJNV0FSRShCQ000MzI5X05WX05BTUUpOwotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9jb2RlX2ZpbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfY29kZV9maWxlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaW50IG9mZnNldCA9IDA7CiAJdWludCBsZW47CkBAIC0zMTcxLDggKzMxNDYsNyBAQAogCiAJYnJjbWZfZGJnKElORk8sICJFbnRlclxuIik7CiAKLQlidXMtPmZ3X25hbWUgPSBCQ000MzI5X0ZXX05BTUU7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmYnVzLT5maXJtd2FyZSwgYnVzLT5md19uYW1lLAorCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIEJSQ01GTUFDX0ZXX05BTUUsCiAJCQkgICAgICAgJmJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+ZGV2KTsKIAlpZiAocmV0KSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIkZhaWwgdG8gcmVxdWVzdCBmaXJtd2FyZSAlZFxuIiwgcmV0KTsKQEAgLTMyNjIsMTUgKzMyMzYsMTQgQEAKIAlyZXR1cm4gYnVmX2xlbjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAl1aW50IGxlbjsKIAljaGFyICptZW1ibG9jayA9IE5VTEw7CiAJY2hhciAqYnVmcDsKIAlpbnQgcmV0OwogCi0JYnVzLT5udl9uYW1lID0gQkNNNDMyOV9OVl9OQU1FOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIGJ1cy0+bnZfbmFtZSwKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZidXMtPmZpcm13YXJlLCBCUkNNRk1BQ19OVl9OQU1FLAogCQkJICAgICAgICZidXMtPnNkaW9kZXYtPmZ1bmNbMl0tPmRldik7CiAJaWYgKHJldCkgewogCQlicmNtZl9kYmcoRVJST1IsICJGYWlsIHRvIHJlcXVlc3QgbnZyYW0gJWRcbiIsIHJldCk7CkBAIC0zMzEwLDcgKzMyODMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX2JyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgaW50IF9icmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpbnQgYmNtZXJyb3IgPSAtMTsKIApAQCAtMzM0Myw3ICszMzE2LDcgQEAKIH0KIAogc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCiticmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlib29sIHJldDsKIApAQCAtMzM1NywxNCArMzMzMCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3ZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAl1MzIgbG9jYWxfaG9zdGludG1hc2s7CiAJdTggc2F2ZWNsazsKIAl1aW50IHJldHJpZXM7CiAJaW50IGVycjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqY3VyOwotCXN0cnVjdCBza19idWZmICpuZXh0OworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGJ1c19pZi0+YnVzX3ByaXY7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IHNkaW9kZXYtPmJ1czsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzM5Myw3ICszMzY3LDcgQEAKIAlidXMtPmhvc3RpbnRtYXNrID0gMDsKIAogCS8qIENoYW5nZSBvdXIgaWRlYSBvZiBidXMgc3RhdGUgKi8KLQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJYnVzLT5kcnZyLT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAKIAkvKiBGb3JjZSBjbG9ja3Mgb24gYmFja3BsYW5lIHRvIGJlIHN1cmUgRjIgaW50ZXJydXB0IHByb3BhZ2F0ZXMgKi8KIAlzYXZlY2xrID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCkBAIC0zNDI0LDExICszMzk4LDcgQEAKIAkvKiBDbGVhciBhbnkgaGVsZCBnbG9tbWluZyBzdHVmZiAqLwogCWlmIChidXMtPmdsb21kKQogCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+Z2xvbWQpOwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZidXMtPmdsb20pKQotCQlza2JfcXVldWVfd2Fsa19zYWZlKCZidXMtPmdsb20sIGN1ciwgbmV4dCkgewotCQkJc2tiX3VubGluayhjdXIsICZidXMtPmdsb20pOwotCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihjdXIpOwotCQl9CisJYnJjbWZfc2RicmNtX2ZyZWVfZ2xvbShidXMpOwogCiAJLyogQ2xlYXIgcnggY29udHJvbCBhbmQgd2FrZSBhbnkgd2FpdGVycyAqLwogCWJ1cy0+cnhsZW4gPSAwOwpAQCAtMzQ0MSw5ICszNDExLDExIEBACiAJdXAoJmJ1cy0+c2RzZW0pOwogfQogCi1pbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCitpbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSBkcnZyLT5idXM7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gc2Rpb2Rldi0+YnVzOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAl1aW50IHJldHJpZXMgPSAwOwogCXU4IHJlYWR5LCBlbmFibGU7CkBAIC0zNDUzLDcgKzM0MjUsNyBAQAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAogCS8qIHRyeSB0byBkb3dubG9hZCBpbWFnZSBhbmQgbnZyYW0gdG8gdGhlIGRvbmdsZSAqLwotCWlmIChkcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgeworCWlmIChidXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7CiAJCWlmICghKGJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShidXMpKSkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0zNTE5LDcgKzM0OTEsNyBAQAogCQkJCSAgICAgICBTQlNESU9fV0FURVJNQVJLLCA4LCAmZXJyKTsKIAogCQkvKiBTZXQgYnVzIHN0YXRlIGFjY29yZGluZyB0byBlbmFibGUgcmVzdWx0ICovCi0JCWRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RBVEE7CisJCWJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfREFUQTsKIAl9CiAKIAllbHNlIHsKQEAgLTM1MzQsNyArMzUwNiw3IEBACiAJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIHNhdmVjbGssICZlcnIpOwogCiAJLyogSWYgd2UgZGlkbid0IGNvbWUgdXAsIHR1cm4gb2ZmIGJhY2twbGFuZSBjbG9jayAqLwotCWlmIChkcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkKKwlpZiAoYnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkKIAkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19OT05FLCBmYWxzZSk7CiAKIGV4aXQ6CkBAIC0zNTQ1LDcgKzM1MTcsNyBAQAogCiB2b2lkIGJyY21mX3NkYnJjbV9pc3Iodm9pZCAqYXJnKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopIGFyZzsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopIGFyZzsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzU1NCw3ICszNTI2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChidXMtPmRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7CisJaWYgKGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgewogCQlicmNtZl9kYmcoRVJST1IsICJidXMgaXMgZG93bi4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM1NzcsMTQgKzM1NDksMTQgQEAKIAkJY29tcGxldGUoJmJ1cy0+ZHBjX3dhaXQpOwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fYnVzX3dhdGNoZG9nKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCitzdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fYnVzX3dhdGNoZG9nKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzOworI2lmZGVmIEJDTURCRworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShidXMtPnNkaW9kZXYtPmRldik7CisjZW5kaWYJLyogQkNNREJHICovCiAKIAlicmNtZl9kYmcoVElNRVIsICJFbnRlclxuIik7CiAKLQlidXMgPSBkcnZyLT5idXM7Ci0KIAkvKiBJZ25vcmUgdGhlIHRpbWVyIGlmIHNpbXVsYXRpbmcgYnVzIGRvd24gKi8KIAlpZiAoYnVzLT5zbGVlcGluZykKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMzYyOCw3ICszNjAwLDggQEAKIAl9CiAjaWZkZWYgQkNNREJHCiAJLyogUG9sbCBmb3IgY29uc29sZSBvdXRwdXQgcGVyaW9kaWNhbGx5ICovCi0JaWYgKGRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19EQVRBICYmIGJ1cy0+Y29uc29sZV9pbnRlcnZhbCAhPSAwKSB7CisJaWYgKGJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEgJiYKKwkgICAgYnVzLT5jb25zb2xlX2ludGVydmFsICE9IDApIHsKIAkJYnVzLT5jb25zb2xlLmNvdW50ICs9IEJSQ01GX1dEX1BPTExfTVM7CiAJCWlmIChidXMtPmNvbnNvbGUuY291bnQgPj0gYnVzLT5jb25zb2xlX2ludGVydmFsKSB7CiAJCQlidXMtPmNvbnNvbGUuY291bnQgLT0gYnVzLT5jb25zb2xlX2ludGVydmFsOwpAQCAtMzY2MywxMCArMzYzNiwxMiBAQAogewogCWlmIChjaGlwaWQgPT0gQkNNNDMyOV9DSElQX0lEKQogCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoY2hpcGlkID09IEJDTTQzMzBfQ0hJUF9JRCkKKwkJcmV0dXJuIHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9tYWxsb2Moc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfbWFsbG9jKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0zNjc4LDcgKzM2NTMsNyBAQAogCWJ1cy0+ZGF0YWJ1ZiA9IE5VTEw7CiB9CiAKLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9tYWxsb2Moc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX3Byb2JlX21hbGxvYyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzcxNCw3ICszNjg5LDcgQEAKIH0KIAogc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9wcm9iZV9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgcmVnc3ZhKQorYnJjbWZfc2RicmNtX3Byb2JlX2F0dGFjaChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MzIgcmVnc3ZhKQogewogCXU4IGNsa2N0bCA9IDA7CiAJaW50IGVyciA9IDA7CkBAIC0zNzk5LDcgKzM3NzQsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX3Byb2JlX2luaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX3Byb2JlX2luaXQoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTM4MDcsNyArMzc4Miw3IEBACiAJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18wLCBTRElPX0NDQ1JfSU9FeCwKIAkJCSAgICAgICBTRElPX0ZVTkNfRU5BQkxFXzEsIE5VTEwpOwogCi0JYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCWJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCWJ1cy0+c2xlZXBpbmcgPSBmYWxzZTsKIAlidXMtPnJ4ZmxvdyA9IGZhbHNlOwogCkBAIC0zODM0LDcgKzM4MDksNyBAQAogc3RhdGljIGludAogYnJjbWZfc2RicmNtX3dhdGNoZG9nX3RocmVhZCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopZGF0YTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopZGF0YTsKIAogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKIAkvKiBSdW4gdW50aWwgc2lnbmFsIHJlY2VpdmVkICovCkBAIC0zODQyLDcgKzM4MTcsNyBAQAogCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJYnJlYWs7CiAJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZidXMtPndhdGNoZG9nX3dhaXQpKSB7Ci0JCQlicmNtZl9zZGJyY21fYnVzX3dhdGNoZG9nKGJ1cy0+ZHJ2cik7CisJCQlicmNtZl9zZGJyY21fYnVzX3dhdGNoZG9nKGJ1cyk7CiAJCQkvKiBDb3VudCB0aGUgdGljayBmb3IgcmVmZXJlbmNlICovCiAJCQlidXMtPmRydnItPnRpY2tjbnQrKzsKIAkJfSBlbHNlCkBAIC0zODU0LDcgKzM4MjksNyBAQAogc3RhdGljIHZvaWQKIGJyY21mX3NkYnJjbV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKilkYXRhOworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSAoc3RydWN0IGJyY21mX3NkaW8gKilkYXRhOwogCiAJaWYgKGJ1cy0+d2F0Y2hkb2dfdHNrKSB7CiAJCWNvbXBsZXRlKCZidXMtPndhdGNoZG9nX3dhaXQpOwpAQCAtMzg2NSw3ICszODQwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlX2RvbmdsZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9kb25nbGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTM4ODIsNyArMzg1Nyw3IEBACiB9CiAKIC8qIERldGFjaCBhbmQgZnJlZSBldmVyeXRoaW5nICovCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzkwNCwyMSArMzg3OSwxMCBAQAogCWJyY21mX2RiZyhUUkFDRSwgIkRpc2Nvbm5lY3RlZFxuIik7CiB9CiAKLXZvaWQgKmJyY21mX3NkYnJjbV9wcm9iZSh1MTYgYnVzX25vLCB1MTYgc2xvdCwgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwKLQkJCSB1MzIgcmVnc3ZhLCBzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCit2b2lkICpicmNtZl9zZGJyY21fcHJvYmUodTMyIHJlZ3N2YSwgc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQogewogCWludCByZXQ7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzOwotCi0JLyogSW5pdCBnbG9iYWwgdmFyaWFibGVzIGF0IHJ1bi10aW1lLCBub3QgYXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24uCi0JICogVGhpcyBpcyByZXF1aXJlZCB0byBzdXBwb3J0IGluaXQvZGUtaW5pdCBvZiB0aGUgZHJpdmVyLgotCSAqIEluaXRpYWxpemF0aW9uCi0JICogb2YgZ2xvYmFscyBhcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiByZXN1bHRzIGluIG5vbi1kZXRlcm1pbmlzdGljCi0JICogYmVoYXZpb3Igc2luY2UgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWxzIG1heSBiZSBkaWZmZXJlbnQgb24gdGhlCi0JICogZmlyc3QgdGltZSB0aGF0IHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdnMgc3Vic2VxdWVudAotCSAqIGluaXRpYWxpemF0aW9ucy4KLQkgKi8KLQlicmNtZl9jX2luaXQoKTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0zOTI2LDcgKzM4OTAsNyBAQAogCSAqIHJlZ3N2YSA9PSBTSV9FTlVNX0JBU0UqLwogCiAJLyogQWxsb2NhdGUgcHJpdmF0ZSBidXMgaW50ZXJmYWNlIHN0YXRlICovCi0JYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2J1cyksIEdGUF9BVE9NSUMpOworCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9zZGlvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidXMpCiAJCWdvdG8gZmFpbDsKIApAQCAtMzk3OCw3ICszOTQyLDcgQEAKIAl9CiAKIAkvKiBBdHRhY2ggdG8gdGhlIGJyY21mL09TL25ldHdvcmsgaW50ZXJmYWNlICovCi0JYnVzLT5kcnZyID0gYnJjbWZfYXR0YWNoKGJ1cywgU0RQQ01fUkVTRVJWRSk7CisJYnVzLT5kcnZyID0gYnJjbWZfYXR0YWNoKGJ1cywgU0RQQ01fUkVTRVJWRSwgYnVzLT5zZGlvZGV2LT5kZXYpOwogCWlmICghYnVzLT5kcnZyKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX2F0dGFjaCBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC00MDMwLDcgKzM5OTQsNyBAQAogCiB2b2lkIGJyY21mX3NkYnJjbV9kaXNjb25uZWN0KHZvaWQgKnB0cikKIHsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKXB0cjsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopcHRyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00MDQwLDEzICs0MDA0LDggQEAKIAlicmNtZl9kYmcoVFJBQ0UsICJEaXNjb25uZWN0ZWRcbiIpOwogfQogCi1zdHJ1Y3QgZGV2aWNlICpicmNtZl9idXNfZ2V0X2RldmljZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JcmV0dXJuICZidXMtPnNkaW9kZXYtPmZ1bmNbMl0tPmRldjsKLX0KLQogdm9pZAotYnJjbWZfc2RicmNtX3dkX3RpbWVyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCB3ZHRpY2spCiticmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCB3ZHRpY2spCiB7CiAJLyogVG90YWxseSBzdG9wIHRoZSB0aW1lciAqLwogCWlmICghd2R0aWNrICYmIGJ1cy0+d2RfdGltZXJfdmFsaWQgPT0gdHJ1ZSkgewpAQCAtNDA1Nyw3ICs0MDE2LDcgQEAKIAl9CiAKIAkvKiBkb24ndCBzdGFydCB0aGUgd2QgdW50aWwgZncgaXMgbG9hZGVkICovCi0JaWYgKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pCisJaWYgKGJ1cy0+ZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikKIAkJcmV0dXJuOwogCiAJaWYgKHdkdGljaykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5jCmluZGV4IDk5ZDAwZGQuLmE2MDQ4ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmMKQEAgLTQ1LDQzICs0NSwzMSBAQAogCSgoKChzYmlkaCkgJiBTU0JfSURISUdIX1JDSEkpID4+IFNTQl9JREhJR0hfUkNISV9TSElGVCkgfCBcCiAJICAoKHNiaWRoKSAmIFNTQl9JREhJR0hfUkNMTykpCiAKKy8qIFNPQyBJbnRlcmNvbm5lY3QgdHlwZXMgKGFrYSBjaGlwIHR5cGVzKSAqLworI2RlZmluZSBTT0NJX1NCCQkwCisjZGVmaW5lIFNPQ0lfQUkJCTEKKworLyogRVJPTSBDb21wSWRlbnRCICovCisjZGVmaW5lIENJQl9SRVZfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBDSUJfUkVWX1NISUZUCQkyNAorCiAjZGVmaW5lIFNESU9EX0RSVlNUUl9LRVkoY2hpcCwgcG11KSAgICAgKCgoY2hpcCkgPDwgMTYpIHwgKHBtdSkpCiAvKiBTRElPIFBhZCBkcml2ZSBzdHJlbmd0aCB0byBzZWxlY3QgdmFsdWUgbWFwcGluZ3MgKi8KIHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgewogCXU4IHN0cmVuZ3RoOwkvKiBQYWQgRHJpdmUgU3RyZW5ndGggaW4gbUEgKi8KIAl1OCBzZWw7CQkvKiBDaGlwLXNwZWNpZmljIHNlbGVjdCB2YWx1ZSAqLwogfTsKLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjFbXSA9IHsKLQl7Ci0JNCwgMHgyfSwgewotCTIsIDB4M30sIHsKLQkxLCAweDB9LCB7Ci0JMCwgMHgwfQotCX07Ci0vKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiAyLCAzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9kX2RyaXZlX3N0ciBzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIyW10gPSB7Ci0JewotCTEyLCAweDd9LCB7Ci0JMTAsIDB4Nn0sIHsKLQk4LCAweDV9LCB7Ci0JNiwgMHg0fSwgewotCTQsIDB4Mn0sIHsKLQkyLCAweDF9LCB7Ci0JMCwgMHgwfQotCX07Ci0vKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiA4ICgxLjhWKSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiM1tdID0gewotCXsKLQkzMiwgMHg3fSwgewotCTI2LCAweDZ9LCB7Ci0JMjIsIDB4NX0sIHsKLQkxNiwgMHg0fSwgewotCTEyLCAweDN9LCB7Ci0JOCwgMHgyfSwgewotCTQsIDB4MX0sIHsKLQkwLCAweDB9Ci0JfTsKKy8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDExICgxLjhWKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJ2c3RyX3RhYjFfMXY4W10gPSB7CisJezMyLCAweDZ9LAorCXsyNiwgMHg3fSwKKwl7MjIsIDB4NH0sCisJezE2LCAweDV9LAorCXsxMiwgMHgyfSwKKwl7OCwgMHgzfSwKKwl7NCwgMHgwfSwKKwl7MCwgMHgxfQorfTsKIAogdTgKIGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCkBAIC05NiwxNDggKzg0LDI2MyBAQAogfQogCiBzdGF0aWMgdTMyCi1icmNtZl9zZGlvX2NoaXBfY29yZXJldihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQl1MzIgY29yZWJhc2UpCiticmNtZl9zZGlvX3NiX2NvcmVyZXYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKIHsKIAl1MzIgcmVnZGF0YTsKKwl1OCBpZHg7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOwogCiAJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpZGhpZ2gpLCA0KTsKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpZGhpZ2gpLCA0KTsKIAlyZXR1cm4gU0JDT1JFUkVWKHJlZ2RhdGEpOwogfQogCi1ib29sCi1icmNtZl9zZGlvX2NoaXBfaXNjb3JldXAoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAotCQkJIHUzMiBjb3JlYmFzZSkKK3N0YXRpYyB1MzIKK2JyY21mX3NkaW9fYWlfY29yZXJldihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCSAgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXU4IGlkeDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwlyZXR1cm4gKGNpLT5jX2luZltpZHhdLmNpYiAmIENJQl9SRVZfTUFTSykgPj4gQ0lCX1JFVl9TSElGVDsKK30KKworc3RhdGljIGJvb2wKK2JyY21mX3NkaW9fc2JfaXNjb3JldXAoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCiB7CiAJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKIAogCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKIAlyZWdkYXRhICY9IChTU0JfVE1TTE9XX1JFU0VUIHwgU1NCX1RNU0xPV19SRUpFQ1QgfAogCQkgICAgU1NCX0lNU1RBVEVfUkVKRUNUIHwgU1NCX1RNU0xPV19DTE9DSyk7CiAJcmV0dXJuIChTU0JfVE1TTE9XX0NMT0NLID09IHJlZ2RhdGEpOwogfQogCi12b2lkCi1icmNtZl9zZGlvX2NoaXBfY29yZWRpc2FibGUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgY29yZWJhc2UpCitzdGF0aWMgYm9vbAorYnJjbWZfc2Rpb19haV9pc2NvcmV1cChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCSAgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKIHsKIAl1MzIgcmVnZGF0YTsKKwl1OCBpZHg7CisJYm9vbCByZXQ7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOwogCiAJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwkJCQkJY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwgNCk7CisJcmV0ID0gKHJlZ2RhdGEgJiAoQkNNQV9JT0NUTF9GR0MgfCBCQ01BX0lPQ1RMX0NMSykpID09IEJDTUFfSU9DVExfQ0xLOworCisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX1JFU0VUX0NUTCwKKwkJCQkJNCk7CisJcmV0ID0gcmV0ICYmICgocmVnZGF0YSAmIEJDTUFfUkVTRVRfQ1RMX1JFU0VUKSA9PSAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtZl9zZGlvX3NiX2NvcmVkaXNhYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCSAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKIAlpZiAocmVnZGF0YSAmIFNTQl9UTVNMT1dfUkVTRVQpCiAJCXJldHVybjsKIAogCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CiAJaWYgKChyZWdkYXRhICYgU1NCX1RNU0xPV19DTE9DSykgIT0gMCkgewogCQkvKgogCQkgKiBzZXQgdGFyZ2V0IHJlamVjdCBhbmQgc3BpbiB1bnRpbCBidXN5IGlzIGNsZWFyCiAJCSAqIChwcmVzZXJ2ZSBjb3JlLXNwZWNpZmljIGJpdHMpCiAJCSAqLwogCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKLQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLAotCQkJCSAgICAgICA0LCByZWdkYXRhIHwgU1NCX1RNU0xPV19SRUpFQ1QpOworCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwKKwkJCQk0LCByZWdkYXRhIHwgU1NCX1RNU0xPV19SRUpFQ1QpOwogCiAJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKIAkJdWRlbGF5KDEpOwogCQlTUElOV0FJVCgoYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCkgJgorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCkgJgogCQkJU1NCX1RNU0hJR0hfQlVTWSksIDEwMDAwMCk7CiAKIAkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOworCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCk7CiAJCWlmIChyZWdkYXRhICYgU1NCX1RNU0hJR0hfQlVTWSkKIAkJCWJyY21mX2RiZyhFUlJPUiwgImNvcmUgc3RhdGUgc3RpbGwgYnVzeVxuIik7CiAKIAkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpZGxvdyksIDQpOworCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmlkbG93KSwgNCk7CiAJCWlmIChyZWdkYXRhICYgU1NCX0lETE9XX0lOSVRJQVRPUikgewogCQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpIHwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQpIHwKIAkJCQlTU0JfSU1TVEFURV9SRUpFQ1Q7CiAJCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQsCiAJCQkJcmVnZGF0YSk7CiAJCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCk7CisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KTsKIAkJCXVkZWxheSgxKTsKIAkJCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KSAmCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KSAmCiAJCQkJU1NCX0lNU1RBVEVfQlVTWSksIDEwMDAwMCk7CiAJCX0KIAogCQkvKiBzZXQgcmVzZXQgYW5kIHJlamVjdCB3aGlsZSBlbmFibGluZyB0aGUgY2xvY2tzICovCiAJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCiAJCQkoU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLIHwKIAkJCVNTQl9UTVNMT1dfUkVKRUNUIHwgU1NCX1RNU0xPV19SRVNFVCkpOwogCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CiAJCXVkZWxheSgxMCk7CiAKIAkJLyogY2xlYXIgdGhlIGluaXRpYXRvciByZWplY3QgYml0ICovCiAJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaWRsb3cpLCA0KTsKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpZGxvdyksIDQpOwogCQlpZiAocmVnZGF0YSAmIFNTQl9JRExPV19JTklUSUFUT1IpIHsKIAkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KSAmCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KSAmCiAJCQkJflNTQl9JTVNUQVRFX1JFSkVDVDsKIAkJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCwKIAkJCQlyZWdkYXRhKTsKIAkJfQogCX0KIAogCS8qIGxlYXZlIHJlc2V0IGFuZCByZWplY3QgYXNzZXJ0ZWQgKi8KLQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIENPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCiAJCShTU0JfVE1TTE9XX1JFSkVDVCB8IFNTQl9UTVNMT1dfUkVTRVQpKTsKIAl1ZGVsYXkoMSk7CiB9CiAKLXZvaWQKLWJyY21mX3NkaW9fY2hpcF9yZXNldGNvcmUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgY29yZWJhc2UpCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19haV9jb3JlZGlzYWJsZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXU4IGlkeDsKKwl1MzIgcmVnZGF0YTsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwkvKiBpZiBjb3JlIGlzIGFscmVhZHkgaW4gcmVzZXQsIGp1c3QgcmV0dXJuICovCisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX1JFU0VUX0NUTCwKKwkJCQkJNCk7CisJaWYgKChyZWdkYXRhICYgQkNNQV9SRVNFVF9DVExfUkVTRVQpICE9IDApCisJCXJldHVybjsKKworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwKKwkJCSAgICAgICA0LCAwKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOworCXVkZWxheSgxMCk7CisKKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIGNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfUkVTRVRfQ1RMLAorCQkJICAgICAgIDQsIEJDTUFfUkVTRVRfQ1RMX1JFU0VUKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtZl9zZGlvX3NiX3Jlc2V0Y29yZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQlzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKIHsKIAl1MzIgcmVnZGF0YTsKKwl1OCBpZHg7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOwogCiAJLyoKIAkgKiBNdXN0IGRvIHRoZSBkaXNhYmxlIHNlcXVlbmNlIGZpcnN0IHRvIHdvcmsgZm9yCiAJICogYXJiaXRyYXJ5IGN1cnJlbnQgY29yZSBzdGF0ZS4KIAkgKi8KLQlicmNtZl9zZGlvX2NoaXBfY29yZWRpc2FibGUoc2Rpb2RldiwgY29yZWJhc2UpOworCWJyY21mX3NkaW9fc2JfY29yZWRpc2FibGUoc2Rpb2RldiwgY2ksIGNvcmVpZCk7CiAKIAkvKgogCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCiAJICogc2V0IHJlc2V0IHdoaWxlIGVuYWJsaW5nIHRoZSBjbG9jayBhbmQKIAkgKiBmb3JjaW5nIHRoZW0gb24gdGhyb3VnaG91dCB0aGUgY29yZQogCSAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLIHwgU1NCX1RNU0xPV19SRVNFVCk7CisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAorCQkJU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLIHwgU1NCX1RNU0xPV19SRVNFVCk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CiAJdWRlbGF5KDEpOwogCisJLyogY2xlYXIgYW55IHNlcnJvciAqLwogCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOworCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOwogCWlmIChyZWdkYXRhICYgU1NCX1RNU0hJR0hfU0VSUikKIAkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAotCQkJCSAgICAgICBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCwgMCk7CisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0LCAwKTsKIAogCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCk7CisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KTsKIAlpZiAocmVnZGF0YSAmIChTU0JfSU1TVEFURV9JQkUgfCBTU0JfSU1TVEFURV9UTykpCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKKwkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0LAogCQkJcmVnZGF0YSAmIH4oU1NCX0lNU1RBVEVfSUJFIHwgU1NCX0lNU1RBVEVfVE8pKTsKIAogCS8qIGNsZWFyIHJlc2V0IGFuZCBhbGxvdyBpdCB0byBwcm9wYWdhdGUgdGhyb3VnaG91dCB0aGUgY29yZSAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKIAkJU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKIAl1ZGVsYXkoMSk7CiAKIAkvKiBsZWF2ZSBjbG9jayBlbmFibGVkICovCi0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLAorCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCSAgICAgICBDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksCiAJCQkgICAgICAgNCwgU1NCX1RNU0xPV19DTE9DSyk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19haV9yZXNldGNvcmUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTggaWR4OworCXUzMiByZWdkYXRhOworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCS8qIG11c3QgZGlzYWJsZSBmaXJzdCB0byB3b3JrIGZvciBhcmJpdHJhcnkgY3VycmVudCBjb3JlIHN0YXRlICovCisJYnJjbWZfc2Rpb19haV9jb3JlZGlzYWJsZShzZGlvZGV2LCBjaSwgY29yZWlkKTsKKworCS8qIG5vdyBkbyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSAqLworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwKKwkJCSAgICAgICA0LCBCQ01BX0lPQ1RMX0ZHQyB8IEJDTUFfSU9DVExfQ0xLKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9SRVNFVF9DVEwsCisJCQkgICAgICAgNCwgMCk7CisJdWRlbGF5KDEpOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBjaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLAorCQkJICAgICAgIDQsIEJDTUFfSU9DVExfQ0xLKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOwogCXVkZWxheSgxKTsKIH0KIApAQCAtMjU4LDYgKzM2MSw3IEBACiAJCQlDT1JFX0NDX1JFRyhjaS0+Y19pbmZbMF0uYmFzZSwgY2hpcGlkKSwgNCk7CiAJY2ktPmNoaXAgPSByZWdkYXRhICYgQ0lEX0lEX01BU0s7CiAJY2ktPmNoaXByZXYgPSAocmVnZGF0YSAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKKwljaS0+c29jaXR5cGUgPSAocmVnZGF0YSAmIENJRF9UWVBFX01BU0spID4+IENJRF9UWVBFX1NISUZUOwogCiAJYnJjbWZfZGJnKElORk8sICJjaGlwaWQ9MHgleCBjaGlwcmV2PSVkXG4iLCBjaS0+Y2hpcCwgY2ktPmNoaXByZXYpOwogCkBAIC0yNzIsMTEgKzM3Niw0NiBAQAogCQljaS0+Y19pbmZbM10uYmFzZSA9IEJDTTQzMjlfQ09SRV9BUk1fQkFTRTsKIAkJY2ktPnJhbXNpemUgPSBCQ000MzI5X1JBTVNJWkU7CiAJCWJyZWFrOworCWNhc2UgQkNNNDMzMF9DSElQX0lEOgorCQljaS0+Y19pbmZbMF0ud3JhcGJhc2UgPSAweDE4MTAwMDAwOworCQljaS0+Y19pbmZbMF0uY2liID0gMHgyNzAwNDIxMTsKKwkJY2ktPmNfaW5mWzFdLmlkID0gQkNNQV9DT1JFX1NESU9fREVWOworCQljaS0+Y19pbmZbMV0uYmFzZSA9IDB4MTgwMDIwMDA7CisJCWNpLT5jX2luZlsxXS53cmFwYmFzZSA9IDB4MTgxMDIwMDA7CisJCWNpLT5jX2luZlsxXS5jaWIgPSAweDA3MDA0MjExOworCQljaS0+Y19pbmZbMl0uaWQgPSBCQ01BX0NPUkVfSU5URVJOQUxfTUVNOworCQljaS0+Y19pbmZbMl0uYmFzZSA9IDB4MTgwMDQwMDA7CisJCWNpLT5jX2luZlsyXS53cmFwYmFzZSA9IDB4MTgxMDQwMDA7CisJCWNpLT5jX2luZlsyXS5jaWIgPSAweDBkMDgwNDAxOworCQljaS0+Y19pbmZbM10uaWQgPSBCQ01BX0NPUkVfQVJNX0NNMzsKKwkJY2ktPmNfaW5mWzNdLmJhc2UgPSAweDE4MDAzMDAwOworCQljaS0+Y19pbmZbM10ud3JhcGJhc2UgPSAweDE4MTAzMDAwOworCQljaS0+Y19pbmZbM10uY2liID0gMHgwMzAwNDIxMTsKKwkJY2ktPnJhbXNpemUgPSAweDQ4MDAwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmNtZl9kYmcoRVJST1IsICJjaGlwaWQgMHgleCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBjaS0+Y2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCXN3aXRjaCAoY2ktPnNvY2l0eXBlKSB7CisJY2FzZSBTT0NJX1NCOgorCQljaS0+aXNjb3JldXAgPSBicmNtZl9zZGlvX3NiX2lzY29yZXVwOworCQljaS0+Y29yZXJldiA9IGJyY21mX3NkaW9fc2JfY29yZXJldjsKKwkJY2ktPmNvcmVkaXNhYmxlID0gYnJjbWZfc2Rpb19zYl9jb3JlZGlzYWJsZTsKKwkJY2ktPnJlc2V0Y29yZSA9IGJyY21mX3NkaW9fc2JfcmVzZXRjb3JlOworCQlicmVhazsKKwljYXNlIFNPQ0lfQUk6CisJCWNpLT5pc2NvcmV1cCA9IGJyY21mX3NkaW9fYWlfaXNjb3JldXA7CisJCWNpLT5jb3JlcmV2ID0gYnJjbWZfc2Rpb19haV9jb3JlcmV2OworCQljaS0+Y29yZWRpc2FibGUgPSBicmNtZl9zZGlvX2FpX2NvcmVkaXNhYmxlOworCQljaS0+cmVzZXRjb3JlID0gYnJjbWZfc2Rpb19haV9yZXNldGNvcmU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyY21mX2RiZyhFUlJPUiwgInNvY2l0eXBlICV1IG5vdCBzdXBwb3J0ZWRcbiIsIGNpLT5zb2NpdHlwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMzIsMTIgKzQ3MSw4IEBACiBicmNtZl9zZGlvX2NoaXBfYnVzY29yZXNldHVwKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKIAkJCSAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2kpCiB7Ci0JdTMyIHJlZ2RhdGE7Ci0JdTggaWR4OwotCiAJLyogZ2V0IGNoaXBjb21tb24gcmV2ICovCi0JY2ktPmNfaW5mWzBdLnJldiA9Ci0JCWJyY21mX3NkaW9fY2hpcF9jb3JlcmV2KHNkaW9kZXYsIGNpLT5jX2luZlswXS5iYXNlKTsKKwljaS0+Y19pbmZbMF0ucmV2ID0gY2ktPmNvcmVyZXYoc2Rpb2RldiwgY2ksIGNpLT5jX2luZlswXS5pZCk7CiAKIAkvKiBnZXQgY2hpcGNvbW1vbiBjYXBhYmlsaXRlcyAqLwogCWNpLT5jX2luZlswXS5jYXBzID0KQEAgLTM1MSwxMCArNDg2LDcgQEAKIAkJY2ktPnBtdXJldiA9IGNpLT5wbXVjYXBzICYgUENBUF9SRVZfTUFTSzsKIAl9CiAKLQljaS0+Y19pbmZbMV0ucmV2ID0gYnJjbWZfc2Rpb19jaGlwX2NvcmVyZXYoc2Rpb2RldiwgY2ktPmNfaW5mWzFdLmJhc2UpOwotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNpLT5jX2luZlsxXS5iYXNlLCBzYmlkaGlnaCksIDQpOwotCWNpLT5jX2luZlsxXS5pZCA9IChyZWdkYXRhICYgU1NCX0lESElHSF9DQykgPj4gU1NCX0lESElHSF9DQ19TSElGVDsKKwljaS0+Y19pbmZbMV0ucmV2ID0gY2ktPmNvcmVyZXYoc2Rpb2RldiwgY2ksIGNpLT5jX2luZlsxXS5pZCk7CiAKIAlicmNtZl9kYmcoSU5GTywgImNjcmV2PSVkLCBwbXVyZXY9JWQsIGJ1c2NvcmUgcmV2L3R5cGU9JWQvMHgleFxuIiwKIAkJICBjaS0+Y19pbmZbMF0ucmV2LCBjaS0+cG11cmV2LApAQCAtMzY0LDggKzQ5Niw3IEBACiAJICogTWFrZSBzdXJlIGFueSBvbi1jaGlwIEFSTSBpcyBvZmYgKGluIGNhc2Ugc3RyYXBwaW5nIGlzIHdyb25nKSwKIAkgKiBvciBkb3dubG9hZGVkIGNvZGUgd2FzIGFscmVhZHkgcnVubmluZy4KIAkgKi8KLQlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7Ci0JYnJjbWZfc2Rpb19jaGlwX2NvcmVkaXNhYmxlKHNkaW9kZXYsIGNpLT5jX2luZltpZHhdLmJhc2UpOworCWNpLT5jb3JlZGlzYWJsZShzZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0FSTV9DTTMpOwogfQogCiBpbnQgYnJjbWZfc2Rpb19jaGlwX2F0dGFjaChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCkBAIC00MzUsMTkgKzU2Niw4IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAoU0RJT0RfRFJWU1RSX0tFWShjaS0+Y2hpcCwgY2ktPnBtdXJldikpIHsKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAxKToKLQkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjE7Ci0JCXN0cl9tYXNrID0gMHgzMDAwMDAwMDsKLQkJc3RyX3NoaWZ0ID0gMjg7Ci0JCWJyZWFrOwotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDIpOgotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzI1X0NISVBfSUQsIDMpOgotCQlzdHJfdGFiID0gKHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKikmc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMjsKLQkJc3RyX21hc2sgPSAweDAwMDAzODAwOwotCQlzdHJfc2hpZnQgPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSBTRElPRF9EUlZTVFJfS0VZKEJDTTQzMzZfQ0hJUF9JRCwgOCk6Ci0JCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIzOworCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzMwX0NISVBfSUQsIDEyKToKKwkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RydnN0cl90YWIxXzF2ODsKIAkJc3RyX21hc2sgPSAweDAwMDAzODAwOwogCQlzdHJfc2hpZnQgPSAxMTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmgKaW5kZXggMGVlMzdhZS4uY2U5NzRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuaApAQCAtNjAsMTcgKzYwLDI4IEBACiAJdTMyIGJhc2U7CiAJdTMyIHdyYXBiYXNlOwogCXUzMiBjYXBzOworCXUzMiBjaWI7CiB9OwogCiBzdHJ1Y3QgY2hpcF9pbmZvIHsKIAl1MzIgY2hpcDsKIAl1MzIgY2hpcHJldjsKKwl1MzIgc29jaXR5cGU7CiAJLyogY29yZSBpbmZvICovCiAJLyogYWx3YXlzIHB1dCBjaGlwY29tbW9uIGNvcmUgYXQgMCwgYnVzIGNvcmUgYXQgMSAqLwogCXN0cnVjdCBjaGlwX2NvcmVfaW5mbyBjX2luZltCUkNNRl9NQVhfQ09SRU5VTV07CiAJdTMyIHBtdXJldjsKIAl1MzIgcG11Y2FwczsKIAl1MzIgcmFtc2l6ZTsKKworCWJvb2wgKCppc2NvcmV1cCkoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwKKwkJCSB1MTYgY29yZWlkKTsKKwl1MzIgKCpjb3JlcmV2KShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHN0cnVjdCBjaGlwX2luZm8gKmNpLAorCQkJIHUxNiBjb3JlaWQpOworCXZvaWQgKCpjb3JlZGlzYWJsZSkoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpOworCXZvaWQgKCpyZXNldGNvcmUpKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCXN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKTsKIH07CiAKIHN0cnVjdCBzYmNvbmZpZyB7CkBAIC0xMTMsMTIgKzEyNCw2IEBACiAJdTMyIHNiaWRoaWdoOwkvKiBpZGVudGlmaWNhdGlvbiAqLwogfTsKIAotZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb19jaGlwX3Jlc2V0Y29yZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQkJICAgICAgdTMyIGNvcmViYXNlKTsKLWV4dGVybiBib29sIGJyY21mX3NkaW9fY2hpcF9pc2NvcmV1cChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQkJICAgICB1MzIgY29yZWJhc2UpOwotZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb19jaGlwX2NvcmVkaXNhYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKLQkJCQkJdTMyIGNvcmViYXNlKTsKIGV4dGVybiBpbnQgYnJjbWZfc2Rpb19jaGlwX2F0dGFjaChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCiAJCQkJICBzdHJ1Y3QgY2hpcF9pbmZvICoqY2lfcHRyLCB1MzIgcmVncyk7CiBleHRlcm4gdm9pZCBicmNtZl9zZGlvX2NoaXBfZGV0YWNoKHN0cnVjdCBjaGlwX2luZm8gKipjaV9wdHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oCmluZGV4IDcyNmZhODkuLmQzNmEyYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2hvc3QuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmgKQEAgLTEzMiw5ICsxMzIsMTAgQEAKIAlhdG9taWNfdCBzdXNwZW5kOwkJLyogc3VzcGVuZCBmbGFnICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF9ieXRlX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF93b3JkX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF9wYWNrZXRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X2NoYWluX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF9idWZmZXJfd2FpdDsKLQorCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWY7CiB9OwogCiAvKiBSZWdpc3Rlci9kZXJlZ2lzdGVyIGRldmljZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KQEAgLTE4MiwxMSArMTgzLDIxIEBACiAgKiBOT1RFOiBBc3luYyBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCiAgKi8KIGV4dGVybiBpbnQKK2JyY21mX3NkY2FyZF9zZW5kX3BrdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKK2V4dGVybiBpbnQKIGJyY21mX3NkY2FyZF9zZW5kX2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CisJCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzKTsKKworZXh0ZXJuIGludAorYnJjbWZfc2RjYXJkX3JlY3ZfcGt0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCSAgICAgIHVpbnQgZmxhZ3MsIHN0cnVjdCBza19idWZmICpwa3QpOwogZXh0ZXJuIGludAogYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKKwkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMpOworZXh0ZXJuIGludAorYnJjbWZfc2RjYXJkX3JlY3ZfY2hhaW4oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJCXVpbnQgZmxhZ3MsIHN0cnVjdCBza19idWZmX2hlYWQgKnBrdHEpOwogCiAvKiBGbGFncyBiaXRzICovCiAKQEAgLTIzNywxNiArMjQ4LDE4IEBACiAvKiByZWFkIG9yIHdyaXRlIGFueSBidWZmZXIgdXNpbmcgY21kNTMgKi8KIGV4dGVybiBpbnQKIGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKLQkJCSAgIHVpbnQgZml4X2luYywgdWludCBydywgdWludCBmbmNfbnVtLAotCQkJICAgdTMyIGFkZHIsIHVpbnQgcmVnd2lkdGgsCi0JCQkgICB1MzIgYnVmbGVuLCB1OCAqYnVmZmVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKKwkJCSAgIHVpbnQgZml4X2luYywgdWludCBydywgdWludCBmbmNfbnVtLCB1MzIgYWRkciwKKwkJCSAgIHN0cnVjdCBza19idWZmICpwa3QpOworZXh0ZXJuIGludAorYnJjbWZfc2Rpb2hfcmVxdWVzdF9jaGFpbihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgZml4X2luYywKKwkJCSAgdWludCB3cml0ZSwgdWludCBmdW5jLCB1aW50IGFkZHIsCisJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnBrdHEpOwogCiAvKiBXYXRjaGRvZyB0aW1lciBpbnRlcmZhY2UgZm9yIHBtIG9wcyAqLwogZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb193ZHRtcl9lbmFibGUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAogCQkJCSAgICBib29sIGVuYWJsZSk7CiAKLWV4dGVybiB2b2lkICpicmNtZl9zZGJyY21fcHJvYmUodTE2IGJ1c19ubywgdTE2IHNsb3QsIHUxNiBmdW5jLCB1aW50IGJ1c3R5cGUsCi0JCQkJdTMyIHJlZ3N2YSwgc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KTsKK2V4dGVybiB2b2lkICpicmNtZl9zZGJyY21fcHJvYmUodTMyIHJlZ3N2YSwgc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KTsKIGV4dGVybiB2b2lkIGJyY21mX3NkYnJjbV9kaXNjb25uZWN0KHZvaWQgKnB0cik7CiBleHRlcm4gdm9pZCBicmNtZl9zZGJyY21faXNyKHZvaWQgKmFyZyk7CiAjZW5kaWYJCQkJLyogX0JSQ01fU0RIX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCmluZGV4IDczYmUyYzguLmYyM2IwYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCkBAIC0xNDI5LDcgKzE0MjksNyBAQAogCiBzdGF0aWMgczMyCiBicmNtZl9jZmc4MDIxMV9zZXRfdHhfcG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCSBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBzMzIgZGJtKQorCQkJICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsIHMzMiBtYm0pCiB7CiAKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYgPSB3aXBoeV90b19jZmcod2lwaHkpOwpAQCAtMTQzNyw2ICsxNDM3LDcgQEAKIAl1MTYgdHhwd3JtdzsKIAlzMzIgZXJyID0gMDsKIAlzMzIgZGlzYWJsZSA9IDA7CisJczMyIGRibSA9IE1CTV9UT19EQk0obWJtKTsKIAogCVdMX1RSQUNFKCJFbnRlclxuIik7CiAJaWYgKCFjaGVja19zeXNfdXAod2lwaHkpKQpAQCAtMTQ0NiwxMiArMTQ0Nyw2IEBACiAJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0FVVE9NQVRJQzoKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0xJTUlURUQ6Ci0JCWlmIChkYm0gPCAwKSB7Ci0JCQlXTF9FUlIoIlRYX1BPV0VSX0xJTUlURUQgLSBkYm0gaXMgbmVnYXRpdmVcbiIpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlicmVhazsKIAljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6CiAJCWlmIChkYm0gPCAwKSB7CiAJCQlXTF9FUlIoIlRYX1BPV0VSX0ZJWEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKQEAgLTIwNDksMTAgKzIwNDQsMTAgQEAKIAkJbm90aWZ5X3RpbWVzdGFtcCwgbm90aWZ5X2NhcGFiaWxpdHksIG5vdGlmeV9pbnRlcnZhbCwgbm90aWZ5X2llLAogCQlub3RpZnlfaWVsZW4sIG5vdGlmeV9zaWduYWwsIEdGUF9LRVJORUwpOwogCi0JaWYgKCFic3MpIHsKLQkJV0xfRVJSKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmICghYnNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yMDk2LDYgKzIwOTEsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqbm90aWZ5X2NoYW5uZWw7CiAJc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlICpiaSA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZDsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJdTggKmJ1ZiA9IE5VTEw7CiAJczMyIGVyciA9IDA7CiAJdTE2IGNoYW5uZWw7CkBAIC0yMTQ5LDEwICsyMTQ1LDE3IEBACiAJV0xfQ09OTigic2lnbmFsOiAlZFxuIiwgbm90aWZ5X3NpZ25hbCk7CiAJV0xfQ09OTigibm90aWZ5X3RpbWVzdGFtcDogJSMwMThsbHhcbiIsIG5vdGlmeV90aW1lc3RhbXApOwogCi0JY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgbm90aWZ5X2NoYW5uZWwsIGJzc2lkLAorCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIG5vdGlmeV9jaGFubmVsLCBic3NpZCwKIAkJbm90aWZ5X3RpbWVzdGFtcCwgbm90aWZ5X2NhcGFiaWxpdHksIG5vdGlmeV9pbnRlcnZhbCwKIAkJbm90aWZ5X2llLCBub3RpZnlfaWVsZW4sIG5vdGlmeV9zaWduYWwsIEdGUF9LRVJORUwpOwogCisJaWYgKCFic3MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBDbGVhblVwOworCX0KKworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKKwogQ2xlYW5VcDoKIAogCWtmcmVlKGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYwppbmRleCAwMjVmYTBlLi5hYjliYjExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBGaWxlIGNvbnRlbnRzOiBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgUENJL1BDSWUKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCkBAIC0zMTYsNTEgKzMxOCwyNCBAQAogCiAjZGVmaW5lCUJBRElEWAkJKFNJX01BWENPUkVTICsgMSkKIAotLyogTmV3ZXIgY2hpcHMgY2FuIGFjY2VzcyBQQ0kvUENJRSBhbmQgQ0MgY29yZSB3aXRob3V0IHJlcXVpcmluZyB0byBjaGFuZ2UKLSAqIFBDSSBCQVIwIFdJTgotICovCi0jZGVmaW5lIFNJX0ZBU1Qoc2kpICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgfHwJXAotCQkgICAgICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKSAmJiBcCi0JCSAgICAgIChzaSktPnB1Yi5idXNjb3JlcmV2ID49IDEzKSkKLQotI2RlZmluZSBDQ1JFR1NfRkFTVChzaSkgKCgoY2hhciBfX2lvbWVtICopKChzaSktPmN1cm1hcCkgKyBcCi0JCQkgIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUKSkKLQogI2RlZmluZQlJU19TSU0oY2hpcHBrZykJXAogCSgoY2hpcHBrZyA9PSBIRExTSU1fUEtHX0lEKSB8fCAoY2hpcHBrZyA9PSBIV1NJTV9QS0dfSUQpKQogCi0vKgotICogTWFjcm9zIHRvIGRpc2FibGUvcmVzdG9yZSBmdW5jdGlvbiBjb3JlKEQxMSwgRU5FVCwgSUxJTkUyMCwgZXRjKSBpbnRlcnJ1cHRzCi0gKiBiZWZvcmUgYWZ0ZXIgY29yZSBzd2l0Y2hpbmcgdG8gYXZvaWQgaW52YWxpZCByZWdpc3RlciBhY2Nlc3NzIGluc2lkZSBJU1IuCi0gKi8KLSNkZWZpbmUgSU5UUl9PRkYoc2ksIGludHJfdmFsKSBcCi0JaWYgKChzaSktPmludHJzb2ZmX2ZuICYmIFwKLQkgICAgKHNpKS0+Y29yZWlkWyhzaSktPmN1cmlkeF0gPT0gKHNpKS0+ZGV2X2NvcmVpZCkgXAotCQlpbnRyX3ZhbCA9ICgqKHNpKS0+aW50cnNvZmZfZm4pKChzaSktPmludHJfYXJnKQorI2RlZmluZSBQQ0koc2loKQkoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgPT0gUENJX0NPUkVfSUQpCisjZGVmaW5lIFBDSUUoc2loKQkoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgPT0gUENJRV9DT1JFX0lEKQogCi0jZGVmaW5lIElOVFJfUkVTVE9SRShzaSwgaW50cl92YWwpIFwKLQlpZiAoKHNpKS0+aW50cnNyZXN0b3JlX2ZuICYmIFwKLQkgICAgKHNpKS0+Y29yZWlkWyhzaSktPmN1cmlkeF0gPT0gKHNpKS0+ZGV2X2NvcmVpZCkgXAotCQkoKihzaSktPmludHJzcmVzdG9yZV9mbikoKHNpKS0+aW50cl9hcmcsIGludHJfdmFsKQotCi0jZGVmaW5lIFBDSShzaSkJCSgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJX0NPUkVfSUQpCi0jZGVmaW5lIFBDSUUoc2kpCSgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKQotCi0jZGVmaW5lIFBDSV9GT1JDRUhUKHNpKQkoUENJRShzaSkgJiYgKHNpLT5wdWIuY2hpcCA9PSBCQ000NzE2X0NISVBfSUQpKQorI2RlZmluZSBQQ0lfRk9SQ0VIVChzaWgpIChQQ0lFKHNpaCkgJiYgKGFpX2dldF9jaGlwX2lkKHNpaCkgPT0gQkNNNDcxNl9DSElQX0lEKSkKIAogI2lmZGVmIEJDTURCRwotI2RlZmluZQlTSV9NU0coYXJncykJcHJpbnRrIGFyZ3MKKyNkZWZpbmUJU0lfTVNHKGZtdCwgLi4uKQlwcl9kZWJ1ZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQotI2RlZmluZQlTSV9NU0coYXJncykKKyNkZWZpbmUJU0lfTVNHKGZtdCwgLi4uKQlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCiAjZGVmaW5lCUdPT0RDT1JFQUREUih4LCBiKSBcCiAJKCgoeCkgPj0gKGIpKSAmJiAoKHgpIDwgKChiKSArIFNJX01BWENPUkVTICogU0lfQ09SRV9TSVpFKSkgJiYgXAogCQlJU19BTElHTkVEKCh4KSwgU0lfQ09SRV9TSVpFKSkKIAotI2RlZmluZSBQQ0lFUkVHUyhzaSkgKChfX2lvbWVtIGNoYXIgKikoKHNpKS0+Y3VybWFwKSArIFwKLQkJCVBDSV8xNktCMF9QQ0lSRUdTX09GRlNFVCkKLQogc3RydWN0IGFpZG1wIHsKIAl1MzIgb29ic2VsaW5hMzA7CS8qIDB4MDAwICovCiAJdTMyIG9vYnNlbGluYTc0OwkvKiAweDAwNCAqLwpAQCAtNDc5LDQwNiArNDU0LDEzIEBACiAJdTMyIGNvbXBvbmVudGlkMzsJLyogMHhmZmMgKi8KIH07CiAKLS8qIEVST00gcGFyc2luZyAqLwotCi1zdGF0aWMgdTMyCi1nZXRfZXJvbV9lbnQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgX19pb21lbSAqKmVyb21wdHIsIHUzMiBtYXNrLCB1MzIgbWF0Y2gpCi17Ci0JdTMyIGVudDsKLQl1aW50IGludiA9IDAsIG5vbSA9IDA7Ci0KLQl3aGlsZSAodHJ1ZSkgewotCQllbnQgPSBSX1JFRygqZXJvbXB0cik7Ci0JCSgqZXJvbXB0cikrKzsKLQotCQlpZiAobWFzayA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKChlbnQgJiBFUl9WQUxJRCkgPT0gMCkgewotCQkJaW52Kys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChlbnQgPT0gKEVSX0VORCB8IEVSX1ZBTElEKSkKLQkJCWJyZWFrOwotCi0JCWlmICgoZW50ICYgbWFzaykgPT0gbWF0Y2gpCi0JCQlicmVhazsKLQotCQlub20rKzsKLQl9Ci0KLQlyZXR1cm4gZW50OwotfQotCi1zdGF0aWMgdTMyCi1nZXRfYXNkKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIF9faW9tZW0gKiplcm9tcHRyLCB1aW50IHNwLCB1aW50IGFkLCB1aW50IHN0LAotCXUzMiAqYWRkcmwsIHUzMiAqYWRkcmgsIHUzMiAqc2l6ZWwsIHUzMiAqc2l6ZWgpCi17Ci0JdTMyIGFzZCwgc3osIHN6ZDsKLQotCWFzZCA9IGdldF9lcm9tX2VudChzaWgsIGVyb21wdHIsIEVSX1ZBTElELCBFUl9WQUxJRCk7Ci0JaWYgKCgoYXNkICYgRVJfVEFHMSkgIT0gRVJfQUREKSB8fAotCSAgICAoKChhc2QgJiBBRF9TUF9NQVNLKSA+PiBBRF9TUF9TSElGVCkgIT0gc3ApIHx8Ci0JICAgICgoYXNkICYgQURfU1RfTUFTSykgIT0gc3QpKSB7Ci0JCS8qIFRoaXMgaXMgbm90IHdoYXQgd2Ugd2FudCwgInB1c2giIGl0IGJhY2sgKi8KLQkJKCplcm9tcHRyKS0tOwotCQlyZXR1cm4gMDsKLQl9Ci0JKmFkZHJsID0gYXNkICYgQURfQUREUl9NQVNLOwotCWlmIChhc2QgJiBBRF9BRzMyKQotCQkqYWRkcmggPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQllbHNlCi0JCSphZGRyaCA9IDA7Ci0JKnNpemVoID0gMDsKLQlzeiA9IGFzZCAmIEFEX1NaX01BU0s7Ci0JaWYgKHN6ID09IEFEX1NaX1NaRCkgewotCQlzemQgPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQkJKnNpemVsID0gc3pkICYgU0RfU1pfTUFTSzsKLQkJaWYgKHN6ZCAmIFNEX1NHMzIpCi0JCQkqc2l6ZWggPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQl9IGVsc2UKLQkJKnNpemVsID0gQURfU1pfQkFTRSA8PCAoc3ogPj4gQURfU1pfU0hJRlQpOwotCi0JcmV0dXJuIGFzZDsKLX0KLQotc3RhdGljIHZvaWQgYWlfaHdmaXh1cChzdHJ1Y3Qgc2lfaW5mbyAqc2lpKQotewotfQotCi0vKiBwYXJzZSB0aGUgZW51bWVyYXRpb24gcm9tIHRvIGlkZW50aWZ5IGFsbCBjb3JlcyAqLwotc3RhdGljIHZvaWQgYWlfc2NhbihzdHJ1Y3Qgc2lfcHViICpzaWgsIHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2MpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQotCXUzMiBlcm9tYmFzZTsKLQl1MzIgX19pb21lbSAqZXJvbXB0ciwgKmVyb21saW07Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gY2M7Ci0KLQllcm9tYmFzZSA9IFJfUkVHKCZjYy0+ZXJvbXB0cik7Ci0KLQkvKiBTZXQgd3JhcHBlcnMgYWRkcmVzcyAqLwotCXNpaS0+Y3Vyd3JhcCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWNjICsgU0lfQ09SRV9TSVpFKTsKLQotCS8qIE5vdyBwb2ludCB0aGUgd2luZG93IGF0IHRoZSBlcm9tICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgZXJvbWJhc2UpOwotCWVyb21wdHIgPSByZWdzOwotCWVyb21saW0gPSBlcm9tcHRyICsgKEVSX1JFTUFQQ09OVFJPTCAvIHNpemVvZih1MzIpKTsKLQotCXdoaWxlIChlcm9tcHRyIDwgZXJvbWxpbSkgewotCQl1MzIgY2lhLCBjaWIsIGNpZCwgbWZnLCBjcmV2LCBubXcsIG5zdywgbm1wLCBuc3A7Ci0JCXUzMiBtcGQsIGFzZCwgYWRkcmwsIGFkZHJoLCBzaXplbCwgc2l6ZWg7Ci0JCXUzMiBfX2lvbWVtICpiYXNlOwotCQl1aW50IGksIGosIGlkeDsKLQkJYm9vbCBicjsKLQotCQliciA9IGZhbHNlOwotCi0JCS8qIEdyb2sgYSBjb21wb25lbnQgKi8KLQkJY2lhID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIEVSX1RBRywgRVJfQ0kpOwotCQlpZiAoY2lhID09IChFUl9FTkQgfCBFUl9WQUxJRCkpIHsKLQkJCS8qICBGb3VuZCBFTkQgb2YgZXJvbSAqLwotCQkJYWlfaHdmaXh1cChzaWkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJhc2UgPSBlcm9tcHRyIC0gMTsKLQkJY2liID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIDAsIDApOwotCi0JCWlmICgoY2liICYgRVJfVEFHKSAhPSBFUl9DSSkgewotCQkJLyogQ0lBIG5vdCBmb2xsb3dlZCBieSBDSUIgKi8KLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQljaWQgPSAoY2lhICYgQ0lBX0NJRF9NQVNLKSA+PiBDSUFfQ0lEX1NISUZUOwotCQltZmcgPSAoY2lhICYgQ0lBX01GR19NQVNLKSA+PiBDSUFfTUZHX1NISUZUOwotCQljcmV2ID0gKGNpYiAmIENJQl9SRVZfTUFTSykgPj4gQ0lCX1JFVl9TSElGVDsKLQkJbm13ID0gKGNpYiAmIENJQl9OTVdfTUFTSykgPj4gQ0lCX05NV19TSElGVDsKLQkJbnN3ID0gKGNpYiAmIENJQl9OU1dfTUFTSykgPj4gQ0lCX05TV19TSElGVDsKLQkJbm1wID0gKGNpYiAmIENJQl9OTVBfTUFTSykgPj4gQ0lCX05NUF9TSElGVDsKLQkJbnNwID0gKGNpYiAmIENJQl9OU1BfTUFTSykgPj4gQ0lCX05TUF9TSElGVDsKLQotCQlpZiAoKChtZmcgPT0gTUZHSURfQVJNKSAmJiAoY2lkID09IERFRl9BSV9DT01QKSkgfHwgKG5zcCA9PSAwKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKG5tdyArIG5zdyA9PSAwKSkgewotCQkJLyogQSBjb21wb25lbnQgd2hpY2ggaXMgbm90IGEgY29yZSAqLwotCQkJaWYgKGNpZCA9PSBPT0JfUk9VVEVSX0NPUkVfSUQpIHsKLQkJCQlhc2QgPSBnZXRfYXNkKHNpaCwgJmVyb21wdHIsIDAsIDAsIEFEX1NUX1NMQVZFLAotCQkJCQkgICAgICAmYWRkcmwsICZhZGRyaCwgJnNpemVsLCAmc2l6ZWgpOwotCQkJCWlmIChhc2QgIT0gMCkKLQkJCQkJc2lpLT5vb2Jfcm91dGVyID0gYWRkcmw7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlkeCA9IHNpaS0+bnVtY29yZXM7Ci0vKgkJc2lpLT5lcm9tcHRyW2lkeF0gPSBiYXNlOyAqLwotCQlzaWktPmNpYVtpZHhdID0gY2lhOwotCQlzaWktPmNpYltpZHhdID0gY2liOwotCQlzaWktPmNvcmVpZFtpZHhdID0gY2lkOwotCi0JCWZvciAoaSA9IDA7IGkgPCBubXA7IGkrKykgewotCQkJbXBkID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIEVSX1ZBTElELCBFUl9WQUxJRCk7Ci0JCQlpZiAoKG1wZCAmIEVSX1RBRykgIT0gRVJfTVApIHsKLQkJCQkvKiBOb3QgZW5vdWdoIE1QIGVudHJpZXMgZm9yIGNvbXBvbmVudCAqLwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaXJzdCBTbGF2ZSBBZGRyZXNzIERlc2NyaXB0b3Igc2hvdWxkIGJlIHBvcnQgMDoKLQkJICogdGhlIG1haW4gcmVnaXN0ZXIgc3BhY2UgZm9yIHRoZSBjb3JlCi0JCSAqLwotCQlhc2QgPQotCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCAwLCAwLCBBRF9TVF9TTEFWRSwgJmFkZHJsLCAmYWRkcmgsCi0JCQkgICAgJnNpemVsLCAmc2l6ZWgpOwotCQlpZiAoYXNkID09IDApIHsKLQkJCS8qIFRyeSBhZ2FpbiB0byBzZWUgaWYgaXQgaXMgYSBicmlkZ2UgKi8KLQkJCWFzZCA9Ci0JCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCAwLCAwLCBBRF9TVF9CUklER0UsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoYXNkICE9IDApCi0JCQkJYnIgPSB0cnVlOwotCQkJZWxzZSBpZiAoKGFkZHJoICE9IDApIHx8IChzaXplaCAhPSAwKQotCQkJCSB8fCAoc2l6ZWwgIT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCS8qIEZpcnN0IFNsYXZlIEFTRCBmb3IgY29yZSBtYWxmb3JtZWQgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0JCXNpaS0+Y29yZXNiYVtpZHhdID0gYWRkcmw7Ci0JCXNpaS0+Y29yZXNiYV9zaXplW2lkeF0gPSBzaXplbDsKLQkJLyogR2V0IGFueSBtb3JlIEFTRHMgaW4gcG9ydCAwICovCi0JCWogPSAxOwotCQlkbyB7Ci0JCQlhc2QgPQotCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgMCwgaiwgQURfU1RfU0xBVkUsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoKGFzZCAhPSAwKSAmJiAoaiA9PSAxKSAmJiAoc2l6ZWwgPT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCXNpaS0+Y29yZXNiYTJbaWR4XSA9IGFkZHJsOwotCQkJCXNpaS0+Y29yZXNiYTJfc2l6ZVtpZHhdID0gc2l6ZWw7Ci0JCQl9Ci0JCQlqKys7Ci0JCX0gd2hpbGUgKGFzZCAhPSAwKTsKLQotCQkvKiBHbyB0aHJvdWdoIHRoZSBBU0RzIGZvciBvdGhlciBzbGF2ZSBwb3J0cyAqLwotCQlmb3IgKGkgPSAxOyBpIDwgbnNwOyBpKyspIHsKLQkJCWogPSAwOwotCQkJZG8gewotCQkJCWFzZCA9Ci0JCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgaSwgaisrLCBBRF9TVF9TTEFWRSwKLQkJCQkJICAgICZhZGRybCwgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQl9IHdoaWxlIChhc2QgIT0gMCk7Ci0JCQlpZiAoaiA9PSAwKSB7Ci0JCQkJLyogU1AgaGFzIG5vIGFkZHJlc3MgZGVzY3JpcHRvcnMgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0KLQkJLyogTm93IGdldCBtYXN0ZXIgd3JhcHBlcnMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5tdzsgaSsrKSB7Ci0JCQlhc2QgPQotCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgaSwgMCwgQURfU1RfTVdSQVAsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoYXNkID09IDApIHsKLQkJCQkvKiBNaXNzaW5nIGRlc2NyaXB0b3IgZm9yIE1XICovCi0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICgoc2l6ZWggIT0gMCkgfHwgKHNpemVsICE9IFNJX0NPUkVfU0laRSkpIHsKLQkJCQkvKiBNYXN0ZXIgd3JhcHBlciAlZCBpcyBub3QgNEtCICovCi0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChpID09IDApCi0JCQkJc2lpLT53cmFwYmFbaWR4XSA9IGFkZHJsOwotCQl9Ci0KLQkJLyogQW5kIGZpbmFsbHkgc2xhdmUgd3JhcHBlcnMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5zdzsgaSsrKSB7Ci0JCQl1aW50IGZ3cCA9IChuc3AgPT0gMSkgPyAwIDogMTsKLQkJCWFzZCA9Ci0JCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCBmd3AgKyBpLCAwLCBBRF9TVF9TV1JBUCwKLQkJCQkgICAgJmFkZHJsLCAmYWRkcmgsICZzaXplbCwgJnNpemVoKTsKLQkJCWlmIChhc2QgPT0gMCkgewotCQkJCS8qIE1pc3NpbmcgZGVzY3JpcHRvciBmb3IgU1cgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKChzaXplaCAhPSAwKSB8fCAoc2l6ZWwgIT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCS8qIFNsYXZlIHdyYXBwZXIgaXMgbm90IDRLQiAqLwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoKG5tdyA9PSAwKSAmJiAoaSA9PSAwKSkKLQkJCQlzaWktPndyYXBiYVtpZHhdID0gYWRkcmw7Ci0JCX0KLQotCQkvKiBEb24ndCByZWNvcmQgYnJpZGdlcyAqLwotCQlpZiAoYnIpCi0JCQljb250aW51ZTsKLQotCQkvKiBEb25lIHdpdGggY29yZSAqLwotCQlzaWktPm51bWNvcmVzKys7Ci0JfQotCi0gZXJyb3I6Ci0JLyogUmVhY2hlZCBlbmQgb2YgZXJvbSB3aXRob3V0IGZpbmRpbmcgRU5EICovCi0Jc2lpLT5udW1jb3JlcyA9IDA7Ci0JcmV0dXJuOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBsb2dpY2FsICJmb2N1cyIgdG8gdGhlIGluZGljYXRlZCBjb3JlLgotICogUmV0dXJuIHRoZSBjdXJyZW50IGNvcmUncyB2aXJ0dWFsIGFkZHJlc3MuIFNpbmNlIGVhY2ggY29yZSBzdGFydHMgd2l0aCB0aGUKLSAqIHNhbWUgc2V0IG9mIHJlZ2lzdGVycyAoQklTVCwgY2xvY2sgY29udHJvbCwgZXRjKSwgdGhlIHJldHVybmVkIGFkZHJlc3MKLSAqIGNvbnRhaW5zIHRoZSBmaXJzdCByZWdpc3RlciBvZiB0aGlzICdjb21tb24nIHJlZ2lzdGVyIGJsb2NrIChub3QgdG8gYmUKLSAqIGNvbmZ1c2VkIHdpdGggJ2NvbW1vbiBjb3JlJykuCi0gKi8KLXZvaWQgX19pb21lbSAqYWlfc2V0Y29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXUzMiBhZGRyID0gc2lpLT5jb3Jlc2JhW2NvcmVpZHhdOwotCXUzMiB3cmFwID0gc2lpLT53cmFwYmFbY29yZWlkeF07Ci0KLQlpZiAoY29yZWlkeCA+PSBzaWktPm51bWNvcmVzKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHBvaW50IGJhcjAgd2luZG93ICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgYWRkcik7Ci0JLyogcG9pbnQgYmFyMCAybmQgNEtCIHdpbmRvdyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfQkFSMF9XSU4yLCB3cmFwKTsKLQlzaWktPmN1cmlkeCA9IGNvcmVpZHg7Ci0KLQlyZXR1cm4gc2lpLT5jdXJtYXA7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGFkZHJlc3Mgc3BhY2VzIGluIGN1cnJlbnQgY29yZSAqLwotaW50IGFpX251bWFkZHJzcGFjZXMoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXJldHVybiAyOwotfQotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBhZGRyZXNzIHNwYWNlIGluIHRoZSBjdXJyZW50IGNvcmUgKi8KLXUzMiBhaV9hZGRyc3BhY2Uoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGFzaWR4KQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBjaWR4OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpZHggPSBzaWktPmN1cmlkeDsKLQotCWlmIChhc2lkeCA9PSAwKQotCQlyZXR1cm4gc2lpLT5jb3Jlc2JhW2NpZHhdOwotCWVsc2UgaWYgKGFzaWR4ID09IDEpCi0JCXJldHVybiBzaWktPmNvcmVzYmEyW2NpZHhdOwotCWVsc2UgewotCQkvKiBOZWVkIHRvIHBhcnNlIHRoZSBlcm9tIGFnYWluIHRvIGZpbmQgYWRkciBzcGFjZSAqLwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbnRoIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGN1cnJlbnQgY29yZSAqLwotdTMyIGFpX2FkZHJzcGFjZXNpemUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGFzaWR4KQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBjaWR4OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpZHggPSBzaWktPmN1cmlkeDsKLQotCWlmIChhc2lkeCA9PSAwKQotCQlyZXR1cm4gc2lpLT5jb3Jlc2JhX3NpemVbY2lkeF07Ci0JZWxzZSBpZiAoYXNpZHggPT0gMSkKLQkJcmV0dXJuIHNpaS0+Y29yZXNiYTJfc2l6ZVtjaWR4XTsKLQllbHNlIHsKLQkJLyogTmVlZCB0byBwYXJzZSB0aGUgZXJvbSBhZ2FpbiB0byBmaW5kIGFkZHIgKi8KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi11aW50IGFpX2ZsYWcoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCXJldHVybiBSX1JFRygmYWktPm9vYnNlbG91dGEzMCkgJiAweDFmOwotfQotCi12b2lkIGFpX3NldGludChzdHJ1Y3Qgc2lfcHViICpzaWgsIGludCBzaWZsYWcpCi17Ci19Ci0KLXVpbnQgYWlfY29yZXZlbmRvcihzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1MzIgY2lhOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpYSA9IHNpaS0+Y2lhW3NpaS0+Y3VyaWR4XTsKLQlyZXR1cm4gKGNpYSAmIENJQV9NRkdfTUFTSykgPj4gQ0lBX01GR19TSElGVDsKLX0KLQotdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXUzMiBjaWI7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JY2liID0gc2lpLT5jaWJbc2lpLT5jdXJpZHhdOwotCXJldHVybiAoY2liICYgQ0lCX1JFVl9NQVNLKSA+PiBDSUJfUkVWX1NISUZUOwotfQotCi1ib29sIGFpX2lzY29yZXVwKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXN0cnVjdCBhaWRtcCAqYWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQlyZXR1cm4gKCgoUl9SRUcoJmFpLT5pb2N0cmwpICYgKFNJQ0ZfRkdDIHwgU0lDRl9DTE9DS19FTikpID09Ci0JCSBTSUNGX0NMT0NLX0VOKQotCQkmJiAoKFJfUkVHKCZhaS0+cmVzZXRjdHJsKSAmIEFJUkNfUkVTRVQpID09IDApKTsKLX0KLQotdm9pZCBhaV9jb3JlX2NmbGFnc193byhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JaWYgKG1hc2sgfHwgdmFsKSB7Ci0JCXcgPSAoKFJfUkVHKCZhaS0+aW9jdHJsKSAmIH5tYXNrKSB8IHZhbCk7Ci0JCVdfUkVHKCZhaS0+aW9jdHJsLCB3KTsKLQl9Ci19Ci0KLXUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKChSX1JFRygmYWktPmlvY3RybCkgJiB+bWFzaykgfCB2YWwpOwotCQlXX1JFRygmYWktPmlvY3RybCwgdyk7Ci0JfQotCi0JcmV0dXJuIFJfUkVHKCZhaS0+aW9jdHJsKTsKLX0KLQogLyogcmV0dXJuIHRydWUgaWYgUENJRSBjYXBhYmlsaXR5IGV4aXN0cyBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSAqLwogc3RhdGljIGJvb2wgYWlfaXNwY2llKHN0cnVjdCBzaV9pbmZvICpzaWkpCiB7CiAJdTggY2FwX3B0cjsKIAogCWNhcF9wdHIgPQotCSAgICBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkoc2lpLT5wYnVzLCBQQ0lfQ0FQX0lEX0VYUCwgTlVMTCwKKwkgICAgcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHNpaS0+cGNpYnVzLCBQQ0lfQ0FQX0lEX0VYUCwgTlVMTCwKIAkJCQkJTlVMTCk7CiAJaWYgKCFjYXBfcHRyKQogCQlyZXR1cm4gZmFsc2U7CkBAIC04OTQsMTE3ICs0NzYsNjkgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdTMyIGFpX2NvcmVfc2ZsYWdzKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCXUzMiB3OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JaWYgKG1hc2sgfHwgdmFsKSB7Ci0JCXcgPSAoKFJfUkVHKCZhaS0+aW9zdGF0dXMpICYgfm1hc2spIHwgdmFsKTsKLQkJV19SRUcoJmFpLT5pb3N0YXR1cywgdyk7Ci0JfQotCi0JcmV0dXJuIFJfUkVHKCZhaS0+aW9zdGF0dXMpOwotfQotCiBzdGF0aWMgYm9vbAotYWlfYnVzY29yZV9zZXR1cChzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB1MzIgc2F2ZXdpbiwgdWludCAqb3JpZ2lkeCkKK2FpX2J1c2NvcmVfc2V0dXAoc3RydWN0IHNpX2luZm8gKnNpaSwgc3RydWN0IGJjbWFfZGV2aWNlICpjYykKIHsKLQlib29sIHBjaSwgcGNpZTsKLQl1aW50IGk7Ci0JdWludCBwY2lpZHgsIHBjaWVpZHgsIHBjaXJldiwgcGNpZXJldjsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOworCXN0cnVjdCBiY21hX2RldmljZSAqcGNpID0gTlVMTDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBjaWUgPSBOVUxMOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAotCWNjID0gYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIFNJX0NDX0lEWCk7CisKKwkvKiBubyBjb3JlcyBmb3VuZCwgYmFpbCBvdXQgKi8KKwlpZiAoY2MtPmJ1cy0+bnJfY29yZXMgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogZ2V0IGNoaXBjb21tb24gcmV2ICovCi0Jc2lpLT5wdWIuY2NyZXYgPSAoaW50KWFpX2NvcmVyZXYoJnNpaS0+cHViKTsKKwlzaWktPnB1Yi5jY3JldiA9IGNjLT5pZC5yZXY7CiAKIAkvKiBnZXQgY2hpcGNvbW1vbiBjaGlwc3RhdHVzICovCi0JaWYgKHNpaS0+cHViLmNjcmV2ID49IDExKQotCQlzaWktPnB1Yi5jaGlwc3QgPSBSX1JFRygmY2MtPmNoaXBzdGF0dXMpOworCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA+PSAxMSkKKwkJc2lpLT5jaGlwc3QgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNoaXBzdGF0dXMpKTsKIAogCS8qIGdldCBjaGlwY29tbW9uIGNhcGFiaWxpdGVzICovCi0Jc2lpLT5wdWIuY2NjYXBzID0gUl9SRUcoJmNjLT5jYXBhYmlsaXRpZXMpOwotCS8qIGdldCBjaGlwY29tbW9uIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLwotCi0JaWYgKHNpaS0+cHViLmNjcmV2ID49IDM1KQotCQlzaWktPnB1Yi5jY2NhcHNfZXh0ID0gUl9SRUcoJmNjLT5jYXBhYmlsaXRpZXNfZXh0KTsKKwlzaWktPnB1Yi5jY2NhcHMgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNhcGFiaWxpdGllcykpOwogCiAJLyogZ2V0IHBtdSByZXYgYW5kIGNhcHMgKi8KLQlpZiAoc2lpLT5wdWIuY2NjYXBzICYgQ0NfQ0FQX1BNVSkgewotCQlzaWktPnB1Yi5wbXVjYXBzID0gUl9SRUcoJmNjLT5wbXVjYXBhYmlsaXRpZXMpOworCWlmIChhaV9nZXRfY2NjYXBzKCZzaWktPnB1YikgJiBDQ19DQVBfUE1VKSB7CisJCXNpaS0+cHViLnBtdWNhcHMgPSBiY21hX3JlYWQzMihjYywKKwkJCQkJICAgICAgIENISVBDUkVHT0ZGUyhwbXVjYXBhYmlsaXRpZXMpKTsKIAkJc2lpLT5wdWIucG11cmV2ID0gc2lpLT5wdWIucG11Y2FwcyAmIFBDQVBfUkVWX01BU0s7CiAJfQogCi0JLyogZmlndXJlIG91dCBidXMvb3JpZ25hbCBjb3JlIGlkeCAqLwotCXNpaS0+cHViLmJ1c2NvcmV0eXBlID0gTk9ERVZfQ09SRV9JRDsKLQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gTk9SRVY7Ci0Jc2lpLT5wdWIuYnVzY29yZWlkeCA9IEJBRElEWDsKLQotCXBjaSA9IHBjaWUgPSBmYWxzZTsKLQlwY2lyZXYgPSBwY2llcmV2ID0gTk9SRVY7Ci0JcGNpaWR4ID0gcGNpZWlkeCA9IEJBRElEWDsKLQotCWZvciAoaSA9IDA7IGkgPCBzaWktPm51bWNvcmVzOyBpKyspIHsKKwkvKiBmaWd1cmUgb3V0IGJ1c2NvcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvcmUsICZjYy0+YnVzLT5jb3JlcywgbGlzdCkgewogCQl1aW50IGNpZCwgY3JldjsKIAotCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1YiwgaSk7Ci0JCWNpZCA9IGFpX2NvcmVpZCgmc2lpLT5wdWIpOwotCQljcmV2ID0gYWlfY29yZXJldigmc2lpLT5wdWIpOworCQljaWQgPSBjb3JlLT5pZC5pZDsKKwkJY3JldiA9IGNvcmUtPmlkLnJldjsKIAogCQlpZiAoY2lkID09IFBDSV9DT1JFX0lEKSB7Ci0JCQlwY2lpZHggPSBpOwotCQkJcGNpcmV2ID0gY3JldjsKLQkJCXBjaSA9IHRydWU7CisJCQlwY2kgPSBjb3JlOwogCQl9IGVsc2UgaWYgKGNpZCA9PSBQQ0lFX0NPUkVfSUQpIHsKLQkJCXBjaWVpZHggPSBpOwotCQkJcGNpZXJldiA9IGNyZXY7Ci0JCQlwY2llID0gdHJ1ZTsKKwkJCXBjaWUgPSBjb3JlOwogCQl9Ci0KLQkJLyogZmluZCB0aGUgY29yZSBpZHggYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuYy4gKi8KLQkJaWYgKChzYXZld2luICYmIChzYXZld2luID09IHNpaS0+Y29yZXNiYVtpXSkpIHx8Ci0JCSAgICAoY2MgPT0gc2lpLT5yZWdzW2ldKSkKLQkJCSpvcmlnaWR4ID0gaTsKIAl9CiAKIAlpZiAocGNpICYmIHBjaWUpIHsKIAkJaWYgKGFpX2lzcGNpZShzaWkpKQotCQkJcGNpID0gZmFsc2U7CisJCQlwY2kgPSBOVUxMOwogCQllbHNlCi0JCQlwY2llID0gZmFsc2U7CisJCQlwY2llID0gTlVMTDsKIAl9CiAJaWYgKHBjaSkgewotCQlzaWktPnB1Yi5idXNjb3JldHlwZSA9IFBDSV9DT1JFX0lEOwotCQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gcGNpcmV2OwotCQlzaWktPnB1Yi5idXNjb3JlaWR4ID0gcGNpaWR4OworCQlzaWktPmJ1c2NvcmUgPSBwY2k7CiAJfSBlbHNlIGlmIChwY2llKSB7Ci0JCXNpaS0+cHViLmJ1c2NvcmV0eXBlID0gUENJRV9DT1JFX0lEOwotCQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gcGNpZXJldjsKLQkJc2lpLT5wdWIuYnVzY29yZWlkeCA9IHBjaWVpZHg7CisJCXNpaS0+YnVzY29yZSA9IHBjaWU7CiAJfQogCiAJLyogZml4dXAgbmVjZXNzYXJ5IGNoaXAvY29yZSBjb25maWd1cmF0aW9ucyAqLwotCWlmIChTSV9GQVNUKHNpaSkpIHsKLQkJaWYgKCFzaWktPnBjaCkgewotCQkJc2lpLT5wY2ggPSBwY2ljb3JlX2luaXQoJnNpaS0+cHViLCBzaWktPnBidXMsCi0JCQkJCQkoX19pb21lbSB2b2lkICopUENJRVJFR1Moc2lpKSk7Ci0JCQlpZiAoc2lpLT5wY2ggPT0gTlVMTCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKwlpZiAoIXNpaS0+cGNoKSB7CisJCXNpaS0+cGNoID0gcGNpY29yZV9pbml0KCZzaWktPnB1Yiwgc2lpLT5pY2J1cy0+ZHJ2X3BjaS5jb3JlKTsKKwkJaWYgKHNpaS0+cGNoID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQotCWlmIChhaV9wY2lfZml4Y2ZnKCZzaWktPnB1YikpIHsKLQkJLyogc2lfZG9hdHRhY2g6IHNpX3BjaV9maXhjZmcgZmFpbGVkICovCisJaWYgKGFpX3BjaV9maXhjZmcoJnNpaS0+cHViKSkKIAkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIHJldHVybiB0byB0aGUgb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoJnNpaS0+cHViLCAqb3JpZ2lkeCk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwMTcsMzkgKzU1MSwyNyBAQAogCXVpbnQgdyA9IDA7CiAKIAkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJncpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ3KTsKIAogCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gdyAmIDB4ZmZmZjsKIAlzaWktPnB1Yi5ib2FyZHR5cGUgPSAodyA+PiAxNikgJiAweGZmZmY7Ci0Jc2lpLT5wdWIuYm9hcmRmbGFncyA9IGdldGludHZhcigmc2lpLT5wdWIsIEJSQ01TX1NST01fQk9BUkRGTEFHUyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2lfaW5mbyAqYWlfZG9hdHRhY2goc3RydWN0IHNpX2luZm8gKnNpaSwKLQkJCQkgICB2b2lkIF9faW9tZW0gKnJlZ3MsIHN0cnVjdCBwY2lfZGV2ICpwYnVzKQorCQkJCSAgIHN0cnVjdCBiY21hX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3Qgc2lfcHViICpzaWggPSAmc2lpLT5wdWI7CiAJdTMyIHcsIHNhdmV3aW47Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCXVpbnQgc29jaXR5cGU7Ci0JdWludCBvcmlnaWR4OwotCi0JbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopIHNpaSwgMCwgc2l6ZW9mKHN0cnVjdCBzaV9pbmZvKSk7CiAKIAlzYXZld2luID0gMDsKIAotCXNpaC0+YnVzY29yZWlkeCA9IEJBRElEWDsKKwlzaWktPmljYnVzID0gcGJ1czsKKwlzaWktPnBjaWJ1cyA9IHBidXMtPmhvc3RfcGNpOwogCi0Jc2lpLT5jdXJtYXAgPSByZWdzOwotCXNpaS0+cGJ1cyA9IHBidXM7Ci0KLQkvKiBmaW5kIENoaXBjb21tb24gYWRkcmVzcyAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgJnNhdmV3aW4pOwotCWlmICghR09PRENPUkVBRERSKHNhdmV3aW4sIFNJX0VOVU1fQkFTRSkpCi0JCXNhdmV3aW4gPSBTSV9FTlVNX0JBU0U7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0JBUjBfV0lOLAotCQkJICAgICAgIFNJX0VOVU1fQkFTRSk7Ci0JY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIHJlZ3M7CisJLyogc3dpdGNoIHRvIENoaXBjb21tb24gY29yZSAqLworCWNjID0gcGJ1cy0+ZHJ2X2NjLmNvcmU7CiAKIAkvKiBidXMvY29yZS9jbGsgc2V0dXAgZm9yIHJlZ2lzdGVyIGFjY2VzcyAqLwogCWlmICghYWlfYnVzY29yZV9wcmVwKHNpaSkpCkBAIC0xMDYyLDk0ICs1ODQsNzQgQEAKIAkgKiAgIGhvc3RzIHcvbyBjaGlwY29tbW9uKSwgc29tZSB3YXkgb2YgcmVjb2duaXppbmcgdGhlbSBuZWVkcyB0bwogCSAqICAgYmUgYWRkZWQgaGVyZS4KIAkgKi8KLQl3ID0gUl9SRUcoJmNjLT5jaGlwaWQpOworCXcgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNoaXBpZCkpOwogCXNvY2l0eXBlID0gKHcgJiBDSURfVFlQRV9NQVNLKSA+PiBDSURfVFlQRV9TSElGVDsKIAkvKiBNaWdodCBhcyB3bGwgZmlsbCBpbiBjaGlwIGlkIHJldiAmIHBrZyAqLwogCXNpaC0+Y2hpcCA9IHcgJiBDSURfSURfTUFTSzsKIAlzaWgtPmNoaXByZXYgPSAodyAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKIAlzaWgtPmNoaXBwa2cgPSAodyAmIENJRF9QS0dfTUFTSykgPj4gQ0lEX1BLR19TSElGVDsKIAotCXNpaC0+aXNzaW0gPSBmYWxzZTsKLQogCS8qIHNjYW4gZm9yIGNvcmVzICovCi0JaWYgKHNvY2l0eXBlID09IFNPQ0lfQUkpIHsKLQkJU0lfTVNHKCgiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KSk7Ci0JCS8qIHBhc3MgY2hpcGMgYWRkcmVzcyBpbnN0ZWFkIG9mIG9yaWdpbmFsIGNvcmUgYmFzZSAqLwotCQlhaV9zY2FuKCZzaWktPnB1YiwgY2MpOwotCX0gZWxzZSB7Ci0JCS8qIEZvdW5kIGNoaXAgb2YgdW5rbm93biB0eXBlICovCi0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBubyBjb3JlcyBmb3VuZCwgYmFpbCBvdXQgKi8KLQlpZiAoc2lpLT5udW1jb3JlcyA9PSAwKQorCWlmIChzb2NpdHlwZSAhPSBTT0NJX0FJKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCAqLwotCW9yaWdpZHggPSBTSV9DQ19JRFg7Ci0JaWYgKCFhaV9idXNjb3JlX3NldHVwKHNpaSwgc2F2ZXdpbiwgJm9yaWdpZHgpKQorCVNJX01TRygiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KTsKKwlpZiAoIWFpX2J1c2NvcmVfc2V0dXAoc2lpLCBjYykpCiAJCWdvdG8gZXhpdDsKIAogCS8qIEluaXQgbnZyYW0gZnJvbSBzcHJvbS9vdHAgaWYgdGhleSBleGlzdCAqLwotCWlmIChzcm9tX3Zhcl9pbml0KCZzaWktPnB1YiwgY2MpKQorCWlmIChzcm9tX3Zhcl9pbml0KCZzaWktPnB1YikpCiAJCWdvdG8gZXhpdDsKIAogCWFpX252cmFtX3Byb2Nlc3Moc2lpKTsKIAogCS8qID09PSBOVlJBTSwgY2xvY2sgaXMgcmVhZHkgPT09ICovCi0JY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIGFpX3NldGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKLQlXX1JFRygmY2MtPmdwaW9wdWxsdXAsIDApOwotCVdfUkVHKCZjYy0+Z3Bpb3B1bGxkb3duLCAwKTsKLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJYmNtYV93cml0ZTMyKGNjLCBDSElQQ1JFR09GRlMoZ3Bpb3B1bGx1cCksIDApOworCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKGdwaW9wdWxsZG93biksIDApOwogCiAJLyogUE1VIHNwZWNpZmljIGluaXRpYWxpemF0aW9ucyAqLwotCWlmIChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKLQkJdTMyIHh0YWxmcmVxOworCWlmIChhaV9nZXRfY2NjYXBzKHNpaCkgJiBDQ19DQVBfUE1VKSB7CiAJCXNpX3BtdV9pbml0KHNpaCk7Ci0JCXNpX3BtdV9jaGlwX2luaXQoc2loKTsKLQotCQl4dGFsZnJlcSA9IHNpX3BtdV9tZWFzdXJlX2FscGNsayhzaWgpOwotCQlzaV9wbXVfcGxsX2luaXQoc2loLCB4dGFsZnJlcSk7CisJCSh2b2lkKXNpX3BtdV9tZWFzdXJlX2FscGNsayhzaWgpOwogCQlzaV9wbXVfcmVzX2luaXQoc2loKTsKLQkJc2lfcG11X3N3cmVnX2luaXQoc2loKTsKIAl9CiAKIAkvKiBzZXR1cCB0aGUgR1BJTyBiYXNlZCBMRUQgcG93ZXJzYXZlIHJlZ2lzdGVyICovCiAJdyA9IGdldGludHZhcihzaWgsIEJSQ01TX1NST01fTEVEREMpOwogCWlmICh3ID09IDApCiAJCXcgPSBERUZBVUxUX0dQSU9USU1FUlZBTDsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvdGltZXJ2YWwpLAotCQkgICB+MCwgdyk7CisJYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb3RpbWVydmFsKSwKKwkJICB+MCwgdyk7CiAKLQlpZiAoUENJRShzaWkpKQorCWlmIChQQ0lFKHNpaCkpCiAJCXBjaWNvcmVfYXR0YWNoKHNpaS0+cGNoLCBTSV9ET0FUVEFDSCk7CiAKLQlpZiAoc2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHsKKwlpZiAoYWlfZ2V0X2NoaXBfaWQoc2loKSA9PSBCQ000MzIyNF9DSElQX0lEKSB7CiAJCS8qCiAJCSAqIGVuYWJsZSAxMiBtQSBkcml2ZSBzdHJlbnRoIGZvciA0MzIyNCBhbmQKIAkJICogc2V0IGNoaXBDb250cm9sIHJlZ2lzdGVyIGJpdCAxNQogCQkgKi8KLQkJaWYgKHNpaC0+Y2hpcHJldiA9PSAwKSB7Ci0JCQlTSV9NU0coKCJBcHBseWluZyA0MzIyNEEwIFdBUnNcbiIpKTsKLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2wpLAotCQkJCSAgIENDVFJMNDMyMjRfR1BJT19UT0dHTEUsCi0JCQkJICAgQ0NUUkw0MzIyNF9HUElPX1RPR0dMRSk7CisJCWlmIChhaV9nZXRfY2hpcHJldihzaWgpID09IDApIHsKKwkJCVNJX01TRygiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKTsKKwkJCWFpX2NjX3JlZyhzaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKKwkJCQkgIENDVFJMNDMyMjRfR1BJT19UT0dHTEUsCisJCQkJICBDQ1RSTDQzMjI0X0dQSU9fVE9HR0xFKTsKIAkJCXNpX3BtdV9jaGlwY29udHJvbChzaWgsIDAsIENDVFJMXzQzMjI0QTBfMTJNQV9MRURfRFJJVkUsCiAJCQkJCSAgIENDVFJMXzQzMjI0QTBfMTJNQV9MRURfRFJJVkUpOwogCQl9Ci0JCWlmIChzaWgtPmNoaXByZXYgPj0gMSkgewotCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRCMCsgV0FSc1xuIikpOworCQlpZiAoYWlfZ2V0X2NoaXByZXYoc2loKSA+PSAxKSB7CisJCQlTSV9NU0coIkFwcGx5aW5nIDQzMjI0QjArIFdBUnNcbiIpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAl9CiAKLQlpZiAoc2loLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkgeworCWlmIChhaV9nZXRfY2hpcF9pZChzaWgpID09IEJDTTQzMTNfQ0hJUF9JRCkgewogCQkvKgogCQkgKiBlbmFibGUgMTIgbUEgZHJpdmUgc3RyZW50aCBmb3IgNDMxMyBhbmQKIAkJICogc2V0IGNoaXBDb250cm9sIHJlZ2lzdGVyIGJpdCAxCiAJCSAqLwotCQlTSV9NU0coKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpKTsKKwkJU0lfTVNHKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpOwogCQlzaV9wbXVfY2hpcGNvbnRyb2woc2loLCAwLCBDQ1RSTF80MzEzXzEyTUFfTEVEX0RSSVZFLAogCQkJCSAgIENDVFJMXzQzMTNfMTJNQV9MRURfRFJJVkUpOwogCX0KQEAgLTExNjUsMjIgKzY2NywxOSBAQAogfQogCiAvKgotICogQWxsb2NhdGUgYSBzaSBoYW5kbGUuCi0gKiBkZXZpZCAtIHBjaSBkZXZpY2UgaWQgKHVzZWQgdG8gZGV0ZXJtaW5lIGNoaXAjKQotICogb3NoIC0gb3BhcXVlIE9TIGhhbmRsZQotICogcmVncyAtIHZpcnR1YWwgYWRkcmVzcyBvZiBpbml0aWFsIGNvcmUgcmVnaXN0ZXJzCisgKiBBbGxvY2F0ZSBhIHNpIGhhbmRsZSBhbmQgZG8gdGhlIGF0dGFjaC4KICAqLwogc3RydWN0IHNpX3B1YiAqCi1haV9hdHRhY2godm9pZCBfX2lvbWVtICpyZWdzLCBzdHJ1Y3QgcGNpX2RldiAqc2RoKQorYWlfYXR0YWNoKHN0cnVjdCBiY21hX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwogCiAJLyogYWxsb2Mgc3RydWN0IHNpX2luZm8gKi8KLQlzaWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2lfaW5mbyksIEdGUF9BVE9NSUMpOworCXNpaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaV9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNpaSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChhaV9kb2F0dGFjaChzaWksIHJlZ3MsIHNkaCkgPT0gTlVMTCkgeworCWlmIChhaV9kb2F0dGFjaChzaWksIHBidXMpID09IE5VTEwpIHsKIAkJa2ZyZWUoc2lpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTIwOSwyOTIgKzcwOCw2NiBAQAogCWtmcmVlKHNpaSk7CiB9CiAKLS8qIHJlZ2lzdGVyIGRyaXZlciBpbnRlcnJ1cHQgZGlzYWJsaW5nIGFuZCByZXN0b3JpbmcgY2FsbGJhY2sgZnVuY3Rpb25zICovCi12b2lkCi1haV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCAqaW50cnNvZmZfZm4sCi0JCQkgIHZvaWQgKmludHJzcmVzdG9yZV9mbiwKLQkJCSAgdm9pZCAqaW50cnNlbmFibGVkX2ZuLCB2b2lkICppbnRyX2FyZykKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXNpaS0+aW50cl9hcmcgPSBpbnRyX2FyZzsKLQlzaWktPmludHJzb2ZmX2ZuID0gKHUzMiAoKikodm9pZCAqKSkgaW50cnNvZmZfZm47Ci0Jc2lpLT5pbnRyc3Jlc3RvcmVfZm4gPSAodm9pZCAoKikgKHZvaWQgKiwgdTMyKSkgaW50cnNyZXN0b3JlX2ZuOwotCXNpaS0+aW50cnNlbmFibGVkX2ZuID0gKGJvb2wgKCopKHZvaWQgKikpIGludHJzZW5hYmxlZF9mbjsKLQkvKiBzYXZlIGN1cnJlbnQgY29yZSBpZC4gIHdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQsIHRoZSBjdXJyZW50IGNvcmUKLQkgKiBtdXN0IGJlIHRoZSBjb3JlIHdoaWNoIHByb3ZpZGVzIGRyaXZlciBmdW5jdGlvbnMoaWwsIGV0LCB3bCwgZXRjLikKLQkgKi8KLQlzaWktPmRldl9jb3JlaWQgPSBzaWktPmNvcmVpZFtzaWktPmN1cmlkeF07Ci19Ci0KLXZvaWQgYWlfZGVyZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXNpaS0+aW50cnNvZmZfZm4gPSBOVUxMOwotfQotCi11aW50IGFpX2NvcmVpZChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlyZXR1cm4gc2lpLT5jb3JlaWRbc2lpLT5jdXJpZHhdOwotfQotCi11aW50IGFpX2NvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JcmV0dXJuIHNpaS0+Y3VyaWR4OwotfQotCi1ib29sIGFpX2JhY2twbGFuZTY0KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlyZXR1cm4gKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX0JLUExONjQpICE9IDA7Ci19Ci0KIC8qIHJldHVybiBpbmRleCBvZiBjb3JlaWQgb3IgQkFESURYIGlmIG5vdCBmb3VuZCAqLwotdWludCBhaV9maW5kY29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KQorc3RydWN0IGJjbWFfZGV2aWNlICphaV9maW5kY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUxNiBjb3JlaWQsIHUxNiBjb3JldW5pdCkKIHsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAJc3RydWN0IHNpX2luZm8gKnNpaTsKIAl1aW50IGZvdW5kOwotCXVpbnQgaTsKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAogCWZvdW5kID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBzaWktPm51bWNvcmVzOyBpKyspCi0JCWlmIChzaWktPmNvcmVpZFtpXSA9PSBjb3JlaWQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvcmUsICZzaWktPmljYnVzLT5jb3JlcywgbGlzdCkKKwkJaWYgKGNvcmUtPmlkLmlkID09IGNvcmVpZCkgewogCQkJaWYgKGZvdW5kID09IGNvcmV1bml0KQotCQkJCXJldHVybiBpOworCQkJCXJldHVybiBjb3JlOwogCQkJZm91bmQrKzsKIAkJfQogCi0JcmV0dXJuIEJBRElEWDsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBsb2dpY2FsICJmb2N1cyIgdG8gdGhlIGluZGljYXRlZCBjb3JlOwotICogbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KLSAqIE1vcmVvdmVyLCBjYWxsZXJzIHNob3VsZCBrZWVwIGludGVycnVwdHMgb2ZmIGR1cmluZyBzd2l0Y2hpbmcKLSAqIG91dCBvZiBhbmQgYmFjayB0byBkMTEgY29yZS4KKyAqIHJlYWQvbW9kaWZ5IGNoaXBjb21tb24gY29yZSByZWdpc3Rlci4KICAqLwotdm9pZCBfX2lvbWVtICphaV9zZXRjb3JlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWQsIHVpbnQgY29yZXVuaXQpCit1aW50IGFpX2NjX3JlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnb2ZmLCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKLQl1aW50IGlkeDsKLQotCWlkeCA9IGFpX2ZpbmRjb3JlaWR4KHNpaCwgY29yZWlkLCBjb3JldW5pdCk7Ci0JaWYgKGlkeCA+PSBTSV9NQVhDT1JFUykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGlkeCk7Ci19Ci0KLS8qIFR1cm4gb2ZmIGludGVycnVwdCBhcyByZXF1aXJlZCBieSBhaV9zZXRjb3JlLCBiZWZvcmUgc3dpdGNoIGNvcmUgKi8KLXZvaWQgX19pb21lbSAqYWlfc3dpdGNoX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCAqb3JpZ2lkeCwKLQkJCSAgICAgdWludCAqaW50cl92YWwpCi17Ci0Jdm9pZCBfX2lvbWVtICpjYzsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOworCXUzMiB3OwogCXN0cnVjdCBzaV9pbmZvICpzaWk7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0KLQlpZiAoU0lfRkFTVChzaWkpKSB7Ci0JCS8qIE92ZXJsb2FkaW5nIHRoZSBvcmlnaWR4IHZhcmlhYmxlIHRvIHJlbWVtYmVyIHRoZSBjb3JlaWQsCi0JCSAqIHRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY29yZSBpZHMgY2Fubm90IGJlIGNvbmZ1c2VkIHdpdGgKLQkJICogY29yZSBpbmRpY2VzLgotCQkgKi8KLQkJKm9yaWdpZHggPSBjb3JlaWQ7Ci0JCWlmIChjb3JlaWQgPT0gQ0NfQ09SRV9JRCkKLQkJCXJldHVybiBDQ1JFR1NfRkFTVChzaWkpOwotCQllbHNlIGlmIChjb3JlaWQgPT0gc2loLT5idXNjb3JldHlwZSkKLQkJCXJldHVybiBQQ0lFUkVHUyhzaWkpOwotCX0KLQlJTlRSX09GRihzaWksICppbnRyX3ZhbCk7Ci0JKm9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQljYyA9IGFpX3NldGNvcmUoc2loLCBjb3JlaWQsIDApOwotCXJldHVybiBjYzsKLX0KLQotLyogcmVzdG9yZSBjb3JlaWR4IGFuZCByZXN0b3JlIGludGVycnVwdCAqLwotdm9pZCBhaV9yZXN0b3JlX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBpbnRyX3ZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWlmIChTSV9GQVNUKHNpaSkKLQkgICAgJiYgKChjb3JlaWQgPT0gQ0NfQ09SRV9JRCkgfHwgKGNvcmVpZCA9PSBzaWgtPmJ1c2NvcmV0eXBlKSkpCi0JCXJldHVybjsKLQotCWFpX3NldGNvcmVpZHgoc2loLCBjb3JlaWQpOwotCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLX0KLQotdm9pZCBhaV93cml0ZV93cmFwcGVycmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXUzMiAqdyA9ICh1MzIgKikgc2lpLT5jdXJ3cmFwOwotCVdfUkVHKHcgKyAob2Zmc2V0IC8gNCksIHZhbCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogU3dpdGNoIHRvICdjb3JlaWR4JywgaXNzdWUgYSBzaW5nbGUgYXJiaXRyYXJ5IDMyYml0IHJlZ2lzdGVyIG1hc2smc2V0Ci0gKiBvcGVyYXRpb24sIHN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb3JlLCBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0gKgotICogV2hlbiB1c2luZyB0aGUgc2lsaWNvbiBiYWNrcGxhbmUsIG5vIGZpZGRsaW5nIHdpdGggaW50ZXJydXB0cyBvciBjb3JlCi0gKiBzd2l0Y2hlcyBpcyBuZWVkZWQuCi0gKgotICogQWxzbywgd2hlbiB1c2luZyBwY2kvcGNpZSwgd2UgY2FuIG9wdGltaXplIGF3YXkgdGhlIGNvcmUgc3dpdGNoaW5nIGZvciBwY2kKLSAqIHJlZ2lzdGVycyBhbmQgKG9uIG5ld2VyIHBjaSBjb3JlcykgY2hpcGNvbW1vbiByZWdpc3RlcnMuCi0gKi8KLXVpbnQgYWlfY29yZXJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKLQkJdWludCB2YWwpCi17Ci0JdWludCBvcmlnaWR4ID0gMDsKLQl1MzIgX19pb21lbSAqciA9IE5VTEw7Ci0JdWludCB3OwotCXVpbnQgaW50cl92YWwgPSAwOwotCWJvb2wgZmFzdCA9IGZhbHNlOwotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0KLQlpZiAoY29yZWlkeCA+PSBTSV9NQVhDT1JFUykKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIElmIHBjaS9wY2llLCB3ZSBjYW4gZ2V0IGF0IHBjaS9wY2llIHJlZ3MKLQkgKiBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMKLQkgKi8KLQlpZiAoKHNpaS0+Y29yZWlkW2NvcmVpZHhdID09IENDX0NPUkVfSUQpICYmIFNJX0ZBU1Qoc2lpKSkgewotCQkvKiBDaGlwYyByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAxMktCICovCi0JCWZhc3QgPSB0cnVlOwotCQlyID0gKHUzMiBfX2lvbWVtICopKChfX2lvbWVtIGNoYXIgKilzaWktPmN1cm1hcCArCi0JCQkJICAgIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUICsgcmVnb2ZmKTsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmJ1c2NvcmVpZHggPT0gY29yZWlkeCkgewotCQkvKgotCQkgKiBwY2kgcmVnaXN0ZXJzIGFyZSBhdCBlaXRoZXIgaW4gdGhlIGxhc3QgMktCIG9mCi0JCSAqIGFuIDhLQiB3aW5kb3cgb3IsIGluIHBjaWUgYW5kIHBjaSByZXYgMTMgYXQgOEtCCi0JCSAqLwotCQlmYXN0ID0gdHJ1ZTsKLQkJaWYgKFNJX0ZBU1Qoc2lpKSkKLQkJCXIgPSAodTMyIF9faW9tZW0gKikoKF9faW9tZW0gY2hhciAqKXNpaS0+Y3VybWFwICsKLQkJCQkgICAgUENJXzE2S0IwX1BDSVJFR1NfT0ZGU0VUICsgcmVnb2ZmKTsKLQkJZWxzZQotCQkJciA9ICh1MzIgX19pb21lbSAqKSgoX19pb21lbSBjaGFyICopc2lpLT5jdXJtYXAgKwotCQkJCSAgICAoKHJlZ29mZiA+PSBTQkNPTkZJR09GRikgPwotCQkJCSAgICAgIFBDSV9CQVIwX1BDSVNCUl9PRkZTRVQgOgotCQkJCSAgICAgIFBDSV9CQVIwX1BDSVJFR1NfT0ZGU0VUKSArIHJlZ29mZik7Ci0JfQotCi0JaWYgKCFmYXN0KSB7Ci0JCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwotCi0JCS8qIHNhdmUgY3VycmVudCBjb3JlIGluZGV4ICovCi0JCW9yaWdpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0KLQkJLyogc3dpdGNoIGNvcmUgKi8KLQkJciA9ICh1MzIgX19pb21lbSAqKSAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKQotCQkJYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIGNvcmVpZHgpICsgcmVnb2ZmKTsKLQl9CisJY2MgPSBzaWktPmljYnVzLT5kcnZfY2MuY29yZTsKIAogCS8qIG1hc2sgYW5kIHNldCAqLwogCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKFJfUkVHKHIpICYgfm1hc2spIHwgdmFsOwotCQlXX1JFRyhyLCB3KTsKKwkJYmNtYV9tYXNrc2V0MzIoY2MsIHJlZ29mZiwgfm1hc2ssIHZhbCk7CiAJfQogCiAJLyogcmVhZGJhY2sgKi8KLQl3ID0gUl9SRUcocik7Ci0KLQlpZiAoIWZhc3QpIHsKLQkJLyogcmVzdG9yZSBjb3JlIGluZGV4ICovCi0JCWlmIChvcmlnaWR4ICE9IGNvcmVpZHgpCi0JCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgb3JpZ2lkeCk7Ci0KLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOwotCX0KKwl3ID0gYmNtYV9yZWFkMzIoY2MsIHJlZ29mZik7CiAKIAlyZXR1cm4gdzsKIH0KIAotdm9pZCBhaV9jb3JlX2Rpc2FibGUoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cykKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXUzMiBkdW1teTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCi0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQkvKiBpZiBjb3JlIGlzIGFscmVhZHkgaW4gcmVzZXQsIGp1c3QgcmV0dXJuICovCi0JaWYgKFJfUkVHKCZhaS0+cmVzZXRjdHJsKSAmIEFJUkNfUkVTRVQpCi0JCXJldHVybjsKLQotCVdfUkVHKCZhaS0+aW9jdHJsLCBiaXRzKTsKLQlkdW1teSA9IFJfUkVHKCZhaS0+aW9jdHJsKTsKLQl1ZGVsYXkoMTApOwotCi0JV19SRUcoJmFpLT5yZXNldGN0cmwsIEFJUkNfUkVTRVQpOwotCXVkZWxheSgxKTsKLX0KLQotLyogcmVzZXQgYW5kIHJlLWVuYWJsZSBhIGNvcmUKLSAqIGlucHV0czoKLSAqIGJpdHMgLSBjb3JlIHNwZWNpZmljIGJpdHMgdGhhdCBhcmUgc2V0IGR1cmluZyBhbmQgYWZ0ZXIgcmVzZXQgc2VxdWVuY2UKLSAqIHJlc2V0Yml0cyAtIGNvcmUgc3BlY2lmaWMgYml0cyB0aGF0IGFyZSBzZXQgb25seSBkdXJpbmcgcmVzZXQgc2VxdWVuY2UKLSAqLwotdm9pZCBhaV9jb3JlX3Jlc2V0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMsIHUzMiByZXNldGJpdHMpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCXUzMiBkdW1teTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCS8qCi0JICogTXVzdCBkbyB0aGUgZGlzYWJsZSBzZXF1ZW5jZSBmaXJzdCB0byB3b3JrCi0JICogZm9yIGFyYml0cmFyeSBjdXJyZW50IGNvcmUgc3RhdGUuCi0JICovCi0JYWlfY29yZV9kaXNhYmxlKHNpaCwgKGJpdHMgfCByZXNldGJpdHMpKTsKLQotCS8qCi0JICogTm93IGRvIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KLQkgKi8KLQlXX1JFRygmYWktPmlvY3RybCwgKGJpdHMgfCBTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pKTsKLQlkdW1teSA9IFJfUkVHKCZhaS0+aW9jdHJsKTsKLQlXX1JFRygmYWktPnJlc2V0Y3RybCwgMCk7Ci0JdWRlbGF5KDEpOwotCi0JV19SRUcoJmFpLT5pb2N0cmwsIChiaXRzIHwgU0lDRl9DTE9DS19FTikpOwotCWR1bW15ID0gUl9SRUcoJmFpLT5pb2N0cmwpOwotCXVkZWxheSgxKTsKLX0KLQogLyogcmV0dXJuIHRoZSBzbG93IGNsb2NrIHNvdXJjZSAtIExQTywgWFRBTCwgb3IgUENJICovCi1zdGF0aWMgdWludCBhaV9zbG93Y2xrX3NyYyhzdHJ1Y3Qgc2lfaW5mbyAqc2lpKQorc3RhdGljIHVpbnQgYWlfc2xvd2Nsa19zcmMoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjKQogewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IHNpX2luZm8gKnNpaTsKIAl1MzIgdmFsOwogCi0JaWYgKHNpaS0+cHViLmNjcmV2IDwgNikgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfR1BJT19PVVQsCisJc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOworCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDYpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLCBQQ0lfR1BJT19PVVQsCiAJCQkJICAgICAgJnZhbCk7CiAJCWlmICh2YWwgJiBQQ0lfQ0ZHX0dQSU9fU0NTKQogCQkJcmV0dXJuIFNDQ19TU19QQ0k7CiAJCXJldHVybiBTQ0NfU1NfWFRBTDsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopCi0JCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgc2lpLT5jdXJpZHgpOwotCQlyZXR1cm4gUl9SRUcoJmNjLT5zbG93X2Nsa19jdGwpICYgU0NDX1NTX01BU0s7CisJfSBlbHNlIGlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDEwKSB7CisJCXJldHVybiBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCkpICYKKwkJICAgICAgIFNDQ19TU19NQVNLOwogCX0gZWxzZQkJCS8qIEluc3RhLWNsb2NrICovCiAJCXJldHVybiBTQ0NfU1NfWFRBTDsKIH0KQEAgLTE1MDMsMjQgKzc3NiwyNCBAQAogKiByZXR1cm4gdGhlIElMUCAoc2xvd2Nsb2NrKSBtaW4gb3IgbWF4IGZyZXF1ZW5jeQogKiBwcmVjb25kaXRpb246IHdlJ3ZlIGVzdGFibGlzaGVkIHRoZSBjaGlwIGhhcyBkeW5hbWljIGNsayBjb250cm9sCiAqLwotc3RhdGljIHVpbnQgYWlfc2xvd2Nsa19mcmVxKHN0cnVjdCBzaV9pbmZvICpzaWksIGJvb2wgbWF4X2ZyZXEsCi0JCQkgICAgc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYykKK3N0YXRpYyB1aW50IGFpX3Nsb3djbGtfZnJlcShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgbWF4X2ZyZXEsCisJCQkgICAgc3RydWN0IGJjbWFfZGV2aWNlICpjYykKIHsKIAl1MzIgc2xvd2NsazsKIAl1aW50IGRpdjsKIAotCXNsb3djbGsgPSBhaV9zbG93Y2xrX3NyYyhzaWkpOwotCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKKwlzbG93Y2xrID0gYWlfc2xvd2Nsa19zcmMoc2loLCBjYyk7CisJaWYgKGFpX2dldF9jY3JldihzaWgpIDwgNikgewogCQlpZiAoc2xvd2NsayA9PSBTQ0NfU1NfUENJKQogCQkJcmV0dXJuIG1heF9mcmVxID8gKFBDSU1BWEZSRVEgLyA2NCkKIAkJCQk6IChQQ0lNSU5GUkVRIC8gNjQpOwogCQllbHNlCiAJCQlyZXR1cm4gbWF4X2ZyZXEgPyAoWFRBTE1BWEZSRVEgLyAzMikKIAkJCQk6IChYVEFMTUlORlJFUSAvIDMyKTsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKKwl9IGVsc2UgaWYgKGFpX2dldF9jY3JldihzaWgpIDwgMTApIHsKIAkJZGl2ID0gNCAqCi0JCSAgICAoKChSX1JFRygmY2MtPnNsb3dfY2xrX2N0bCkgJiBTQ0NfQ0RfTUFTSykgPj4KLQkJICAgICAgU0NDX0NEX1NISUZUKSArIDEpOworCQkgICAgKCgoYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhzbG93X2Nsa19jdGwpKSAmCisJCSAgICAgIFNDQ19DRF9NQVNLKSA+PiBTQ0NfQ0RfU0hJRlQpICsgMSk7CiAJCWlmIChzbG93Y2xrID09IFNDQ19TU19MUE8pCiAJCQlyZXR1cm4gbWF4X2ZyZXEgPyBMUE9NQVhGUkVRIDogTFBPTUlORlJFUTsKIAkJZWxzZSBpZiAoc2xvd2NsayA9PSBTQ0NfU1NfWFRBTCkKQEAgLTE1MzEsMTUgKzgwNCwxNSBAQAogCQkJCTogKFBDSU1JTkZSRVEgLyBkaXYpOwogCX0gZWxzZSB7CiAJCS8qIENoaXBjIHJldiAxMCBpcyBJbnN0YUNsb2NrICovCi0JCWRpdiA9IFJfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwpID4+IFNZQ0NfQ0RfU0hJRlQ7Ci0JCWRpdiA9IDQgKiAoZGl2ICsgMSk7CisJCWRpdiA9IGJjbWFfcmVhZDMyKGNjLCBDSElQQ1JFR09GRlMoc3lzdGVtX2Nsa19jdGwpKTsKKwkJZGl2ID0gNCAqICgoZGl2ID4+IFNZQ0NfQ0RfU0hJRlQpICsgMSk7CiAJCXJldHVybiBtYXhfZnJlcSA/IFhUQUxNQVhGUkVRIDogKFhUQUxNSU5GUkVRIC8gZGl2KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCi1haV9jbGtjdGxfc2V0ZGVsYXkoc3RydWN0IHNpX2luZm8gKnNpaSwgc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYykKK2FpX2Nsa2N0bF9zZXRkZWxheShzdHJ1Y3Qgc2lfcHViICpzaWgsIHN0cnVjdCBiY21hX2RldmljZSAqY2MpCiB7CiAJdWludCBzbG93bWF4ZnJlcSwgcGxsX2RlbGF5LCBzbG93Y2xrOwogCXVpbnQgcGxsX29uX2RlbGF5LCBmcmVmX3NlbF9kZWxheTsKQEAgLTE1NTIsNTUgKzgyNSw0MCBAQAogCSAqIHBvd2VyZWQgZG93biBieSBkeW5hbWljIGNsayBjb250cm9sIGxvZ2ljLgogCSAqLwogCi0Jc2xvd2NsayA9IGFpX3Nsb3djbGtfc3JjKHNpaSk7CisJc2xvd2NsayA9IGFpX3Nsb3djbGtfc3JjKHNpaCwgY2MpOwogCWlmIChzbG93Y2xrICE9IFNDQ19TU19YVEFMKQogCQlwbGxfZGVsYXkgKz0gWFRBTF9PTl9ERUxBWTsKIAogCS8qIFN0YXJ0aW5nIHdpdGggNDMxOCBpdCBpcyBJTFAgdGhhdCBpcyB1c2VkIGZvciB0aGUgZGVsYXlzICovCiAJc2xvd21heGZyZXEgPQotCSAgICBhaV9zbG93Y2xrX2ZyZXEoc2lpLCAoc2lpLT5wdWIuY2NyZXYgPj0gMTApID8gZmFsc2UgOiB0cnVlLCBjYyk7CisJICAgIGFpX3Nsb3djbGtfZnJlcShzaWgsCisJCQkgICAgKGFpX2dldF9jY3JldihzaWgpID49IDEwKSA/IGZhbHNlIDogdHJ1ZSwgY2MpOwogCiAJcGxsX29uX2RlbGF5ID0gKChzbG93bWF4ZnJlcSAqIHBsbF9kZWxheSkgKyA5OTk5OTkpIC8gMTAwMDAwMDsKIAlmcmVmX3NlbF9kZWxheSA9ICgoc2xvd21heGZyZXEgKiBGUkVGX0RFTEFZKSArIDk5OTk5OSkgLyAxMDAwMDAwOwogCi0JV19SRUcoJmNjLT5wbGxfb25fZGVsYXksIHBsbF9vbl9kZWxheSk7Ci0JV19SRUcoJmNjLT5mcmVmX3NlbF9kZWxheSwgZnJlZl9zZWxfZGVsYXkpOworCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKHBsbF9vbl9kZWxheSksIHBsbF9vbl9kZWxheSk7CisJYmNtYV93cml0ZTMyKGNjLCBDSElQQ1JFR09GRlMoZnJlZl9zZWxfZGVsYXkpLCBmcmVmX3NlbF9kZWxheSk7CiB9CiAKIC8qIGluaXRpYWxpemUgcG93ZXIgY29udHJvbCBkZWxheSByZWdpc3RlcnMgKi8KIHZvaWQgYWlfY2xrY3RsX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBvcmlnaWR4ID0gMDsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCWJvb2wgZmFzdDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCi0JaWYgKCEoc2loLT5jY2NhcHMgJiBDQ19DQVBfUFdSX0NUTCkpCisJaWYgKCEoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX1BXUl9DVEwpKQogCQlyZXR1cm47CiAKLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKLQlpZiAoIWZhc3QpIHsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQljYyA9IChzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKikKLQkJCWFpX3NldGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKLQkJaWYgKGNjID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIENDUkVHU19GQVNUKHNpaSk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KKwljYyA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOworCWlmIChjYyA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAkvKiBzZXQgYWxsIEluc3RhY2xrIGNoaXAgSUxQIHRvIDEgTUh6ICovCi0JaWYgKHNpaC0+Y2NyZXYgPj0gMTApCi0JCVNFVF9SRUcoJmNjLT5zeXN0ZW1fY2xrX2N0bCwgU1lDQ19DRF9NQVNLLAotCQkJKElMUF9ESVZfMU1IWiA8PCBTWUNDX0NEX1NISUZUKSk7CisJaWYgKGFpX2dldF9jY3JldihzaWgpID49IDEwKQorCQliY21hX21hc2tzZXQzMihjYywgQ0hJUENSRUdPRkZTKHN5c3RlbV9jbGtfY3RsKSwgU1lDQ19DRF9NQVNLLAorCQkJICAgICAgIChJTFBfRElWXzFNSFogPDwgU1lDQ19DRF9TSElGVCkpOwogCi0JYWlfY2xrY3RsX3NldGRlbGF5KHNpaSwgY2MpOwotCi0JaWYgKCFmYXN0KQotCQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJYWlfY2xrY3RsX3NldGRlbGF5KHNpaCwgY2MpOwogfQogCiAvKgpAQCAtMTYxMCw0NyArODY4LDI1IEBACiB1MTYgYWlfY2xrY3RsX2Zhc3RfcHdydXBfZGVsYXkoc3RydWN0IHNpX3B1YiAqc2loKQogewogCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBvcmlnaWR4ID0gMDsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOworCXN0cnVjdCBiY21hX2RldmljZSAqY2M7CiAJdWludCBzbG93bWluZnJlcTsKIAl1MTYgZnBkZWxheTsKLQl1aW50IGludHJfdmFsID0gMDsKLQlib29sIGZhc3Q7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JaWYgKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkgewotCQlJTlRSX09GRihzaWksIGludHJfdmFsKTsKKwlpZiAoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX1BNVSkgewogCQlmcGRlbGF5ID0gc2lfcG11X2Zhc3RfcHdydXBfZGVsYXkoc2loKTsKLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOwogCQlyZXR1cm4gZnBkZWxheTsKIAl9CiAKLQlpZiAoIShzaWgtPmNjY2FwcyAmIENDX0NBUF9QV1JfQ1RMKSkKKwlpZiAoIShhaV9nZXRfY2NjYXBzKHNpaCkgJiBDQ19DQVBfUFdSX0NUTCkpCiAJCXJldHVybiAwOwogCi0JZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKIAlmcGRlbGF5ID0gMDsKLQlpZiAoIWZhc3QpIHsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQlJTlRSX09GRihzaWksIGludHJfdmFsKTsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopCi0JCQlhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0gZWxzZSB7Ci0JCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKSBDQ1JFR1NfRkFTVChzaWkpOwotCQlpZiAoY2MgPT0gTlVMTCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbG93bWluZnJlcSA9IGFpX3Nsb3djbGtfZnJlcShzaWksIGZhbHNlLCBjYyk7Ci0JZnBkZWxheSA9ICgoKFJfUkVHKCZjYy0+cGxsX29uX2RlbGF5KSArIDIpICogMTAwMDAwMCkgKwotCQkgICAoc2xvd21pbmZyZXEgLSAxKSkgLyBzbG93bWluZnJlcTsKLQotIGRvbmU6Ci0JaWYgKCFmYXN0KSB7Ci0JCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOworCWNjID0gYWlfZmluZGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKKwlpZiAoY2MpIHsKKwkJc2xvd21pbmZyZXEgPSBhaV9zbG93Y2xrX2ZyZXEoc2loLCBmYWxzZSwgY2MpOworCQlmcGRlbGF5ID0gKCgoYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhwbGxfb25fZGVsYXkpKSArIDIpCisJCQkgICAgKiAxMDAwMDAwKSArIChzbG93bWluZnJlcSAtIDEpKSAvIHNsb3dtaW5mcmVxOwogCX0KIAlyZXR1cm4gZnBkZWxheTsKIH0KQEAgLTE2NjQsMTIgKzkwMCwxMiBAQAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAogCS8qIHBjaWUgY29yZSBkb2Vzbid0IGhhdmUgYW55IG1hcHBpbmcgdG8gY29udHJvbCB0aGUgeHRhbCBwdSAqLwotCWlmIChQQ0lFKHNpaSkpCisJaWYgKFBDSUUoc2loKSkKIAkJcmV0dXJuIC0xOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fSU4sICZpbik7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fT1VULCAmb3V0KTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfR1BJT19PVVRFTiwgJm91dGVuKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9HUElPX0lOLCAmaW4pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX0dQSU9fT1VULCAmb3V0KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9HUElPX09VVEVOLCAmb3V0ZW4pOwogCiAJLyoKIAkgKiBBdm9pZCBnbGl0Y2hpbmcgdGhlIGNsb2NrIGlmIEdQUlMgaXMgYWxyZWFkeSB1c2luZyBpdC4KQEAgLTE2OTAsOSArOTI2LDkgQEAKIAkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fWFRBTDsKIAkJCWlmICh3aGF0ICYgUExMKQogCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAkJCXVkZWxheShYVEFMX09OX0RFTEFZKTsKIAkJfQpAQCAtMTcwMCw3ICs5MzYsNyBAQAogCQkvKiB0dXJuIHBsbCBvbiAqLwogCQlpZiAod2hhdCAmIFBMTCkgewogCQkJb3V0ICY9IH5QQ0lfQ0ZHX0dQSU9fUExMOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwogCQkJbWRlbGF5KDIpOwogCQl9CkBAIC0xNzA5LDkgKzk0NSw5IEBACiAJCQlvdXQgJj0gflBDSV9DRkdfR1BJT19YVEFMOwogCQlpZiAod2hhdCAmIFBMTCkKIAkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywKIAkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywKIAkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAl9CiAKQEAgLTE3MjEsNjMgKzk1Nyw1MiBAQAogLyogY2xrIGNvbnRyb2wgbWVjaGFuaXNtIHRocm91Z2ggY2hpcGNvbW1vbiwgbm8gcG9saWN5IGNoZWNraW5nICovCiBzdGF0aWMgYm9vbCBfYWlfY2xrY3RsX2NjKHN0cnVjdCBzaV9pbmZvICpzaWksIHVpbnQgbW9kZSkKIHsKLQl1aW50IG9yaWdpZHggPSAwOwotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjYzsKIAl1MzIgc2NjOwotCXVpbnQgaW50cl92YWwgPSAwOwotCWJvb2wgZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKIAogCS8qIGNoaXBjb21tb24gY29yZXMgcHJpb3IgdG8gcmV2NiBkb24ndCBzdXBwb3J0IGR5bmFtaWMgY2xvY2sgY29udHJvbCAqLwotCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpCisJaWYgKGFpX2dldF9jY3Jldigmc2lpLT5wdWIpIDwgNikKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKCFmYXN0KSB7Ci0JCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwotCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7Ci0JCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKQotCQkJCQlhaV9zZXRjb3JlKCZzaWktPnB1YiwgQ0NfQ09SRV9JRCwgMCk7Ci0JfSBlbHNlIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIENDUkVHU19GQVNUKHNpaSk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0KKwljYyA9IGFpX2ZpbmRjb3JlKCZzaWktPnB1YiwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOwogCi0JaWYgKCEoc2lpLT5wdWIuY2NjYXBzICYgQ0NfQ0FQX1BXUl9DVEwpICYmIChzaWktPnB1Yi5jY3JldiA8IDIwKSkKLQkJZ290byBkb25lOworCWlmICghKGFpX2dldF9jY2NhcHMoJnNpaS0+cHViKSAmIENDX0NBUF9QV1JfQ1RMKSAmJgorCSAgICAoYWlfZ2V0X2NjcmV2KCZzaWktPnB1YikgPCAyMCkpCisJCXJldHVybiBtb2RlID09IENMS19GQVNUOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTEtfRkFTVDoJCS8qIEZPUkNFSFQsIGZhc3QgKHBsbCkgY2xvY2sgKi8KLQkJaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKKwkJaWYgKGFpX2dldF9jY3Jldigmc2lpLT5wdWIpIDwgMTApIHsKIAkJCS8qCiAJCQkgKiBkb24ndCBmb3JnZXQgdG8gZm9yY2UgeHRhbCBiYWNrCiAJCQkgKiBvbiBiZWZvcmUgd2UgY2xlYXIgU0NDX0RZTl9YVEFMLi4KIAkJCSAqLwogCQkJYWlfY2xrY3RsX3h0YWwoJnNpaS0+cHViLCBYVEFMLCBPTik7Ci0JCQlTRVRfUkVHKCZjYy0+c2xvd19jbGtfY3RsLAotCQkJCShTQ0NfWEMgfCBTQ0NfRlMgfCBTQ0NfSVApLCBTQ0NfSVApOwotCQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMjApIHsKLQkJCU9SX1JFRygmY2MtPnN5c3RlbV9jbGtfY3RsLCBTWUNDX0hSKTsKKwkJCWJjbWFfbWFza3NldDMyKGNjLCBDSElQQ1JFR09GRlMoc2xvd19jbGtfY3RsKSwKKwkJCQkgICAgICAgKFNDQ19YQyB8IFNDQ19GUyB8IFNDQ19JUCksIFNDQ19JUCk7CisJCX0gZWxzZSBpZiAoYWlfZ2V0X2NjcmV2KCZzaWktPnB1YikgPCAyMCkgeworCQkJYmNtYV9zZXQzMihjYywgQ0hJUENSRUdPRkZTKHN5c3RlbV9jbGtfY3RsKSwgU1lDQ19IUik7CiAJCX0gZWxzZSB7Ci0JCQlPUl9SRUcoJmNjLT5jbGtfY3RsX3N0LCBDQ1NfRk9SQ0VIVCk7CisJCQliY21hX3NldDMyKGNjLCBDSElQQ1JFR09GRlMoY2xrX2N0bF9zdCksIENDU19GT1JDRUhUKTsKIAkJfQogCiAJCS8qIHdhaXQgZm9yIHRoZSBQTEwgKi8KLQkJaWYgKHNpaS0+cHViLmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKKwkJaWYgKGFpX2dldF9jY2NhcHMoJnNpaS0+cHViKSAmIENDX0NBUF9QTVUpIHsKIAkJCXUzMiBodGF2YWlsID0gQ0NTX0hUQVZBSUw7Ci0JCQlTUElOV0FJVCgoKFJfUkVHKCZjYy0+Y2xrX2N0bF9zdCkgJiBodGF2YWlsKQotCQkJCSAgPT0gMCksIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOworCQkJU1BJTldBSVQoKChiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNsa19jdGxfc3QpKSAmCisJCQkJICAgaHRhdmFpbCkgPT0gMCksIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOwogCQl9IGVsc2UgewogCQkJdWRlbGF5KFBMTF9ERUxBWSk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIENMS19EWU5BTUlDOgkvKiBlbmFibGUgZHluYW1pYyBjbG9jayBjb250cm9sICovCi0JCWlmIChzaWktPnB1Yi5jY3JldiA8IDEwKSB7Ci0JCQlzY2MgPSBSX1JFRygmY2MtPnNsb3dfY2xrX2N0bCk7CisJCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDEwKSB7CisJCQlzY2MgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCkpOwogCQkJc2NjICY9IH4oU0NDX0ZTIHwgU0NDX0lQIHwgU0NDX1hDKTsKIAkJCWlmICgoc2NjICYgU0NDX1NTX01BU0spICE9IFNDQ19TU19YVEFMKQogCQkJCXNjYyB8PSBTQ0NfWEM7Ci0JCQlXX1JFRygmY2MtPnNsb3dfY2xrX2N0bCwgc2NjKTsKKwkJCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCksIHNjYyk7CiAKIAkJCS8qCiAJCQkgKiBmb3IgZHluYW1pYyBjb250cm9sLCB3ZSBoYXZlIHRvCkBAIC0xNzg1LDExICsxMDEwLDExIEBACiAJCQkgKi8KIAkJCWlmIChzY2MgJiBTQ0NfWEMpCiAJCQkJYWlfY2xrY3RsX3h0YWwoJnNpaS0+cHViLCBYVEFMLCBPRkYpOwotCQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMjApIHsKKwkJfSBlbHNlIGlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDIwKSB7CiAJCQkvKiBJbnN0YWNsb2NrICovCi0JCQlBTkRfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwsIH5TWUNDX0hSKTsKKwkJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoc3lzdGVtX2Nsa19jdGwpLCB+U1lDQ19IUik7CiAJCX0gZWxzZSB7Ci0JCQlBTkRfUkVHKCZjYy0+Y2xrX2N0bF9zdCwgfkNDU19GT1JDRUhUKTsKKwkJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoY2xrX2N0bF9zdCksIH5DQ1NfRk9SQ0VIVCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE3OTcsMTEgKzEwMjIsNiBAQAogCQlicmVhazsKIAl9CiAKLSBkb25lOgotCWlmICghZmFzdCkgewotCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgb3JpZ2lkeCk7Ci0JCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLQl9CiAJcmV0dXJuIG1vZGUgPT0gQ0xLX0ZBU1Q7CiB9CiAKQEAgLTE4MjAsNDYgKzEwNDAsMjUgQEAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7CiAKIAkvKiBjaGlwY29tbW9uIGNvcmVzIHByaW9yIHRvIHJldjYgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIGNsb2NrIGNvbnRyb2wgKi8KLQlpZiAoc2loLT5jY3JldiA8IDYpCisJaWYgKGFpX2dldF9jY3JldihzaWgpIDwgNikKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKFBDSV9GT1JDRUhUKHNpaSkpCisJaWYgKFBDSV9GT1JDRUhUKHNpaCkpCiAJCXJldHVybiBtb2RlID09IENMS19GQVNUOwogCiAJcmV0dXJuIF9haV9jbGtjdGxfY2Moc2lpLCBtb2RlKTsKIH0KIAotLyogQnVpbGQgZGV2aWNlIHBhdGggKi8KLWludCBhaV9kZXZwYXRoKHN0cnVjdCBzaV9wdWIgKnNpaCwgY2hhciAqcGF0aCwgaW50IHNpemUpCi17Ci0JaW50IHNsZW47Ci0KLQlpZiAoIXBhdGggfHwgc2l6ZSA8PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlzbGVuID0gc25wcmludGYocGF0aCwgKHNpemVfdCkgc2l6ZSwgInBjaS8ldS8ldS8iLAotCQkoKHN0cnVjdCBzaV9pbmZvICopc2loKS0+cGJ1cy0+YnVzLT5udW1iZXIsCi0JCVBDSV9TTE9UKCgoc3RydWN0IHBjaV9kZXYgKikKLQkJCQkoKChzdHJ1Y3Qgc2lfaW5mbyAqKShzaWgpKS0+cGJ1cykpLT5kZXZmbikpOwotCi0JaWYgKHNsZW4gPCAwIHx8IHNsZW4gPj0gc2l6ZSkgewotCQlwYXRoWzBdID0gJ1wwJzsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCiB2b2lkIGFpX3BjaV91cChzdHJ1Y3Qgc2lfcHViICpzaWgpCiB7CiAJc3RydWN0IHNpX2luZm8gKnNpaTsKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAotCWlmIChQQ0lfRk9SQ0VIVChzaWkpKQorCWlmIChQQ0lfRk9SQ0VIVChzaWgpKQogCQlfYWlfY2xrY3RsX2NjKHNpaSwgQ0xLX0ZBU1QpOwogCi0JaWYgKFBDSUUoc2lpKSkKKwlpZiAoUENJRShzaWgpKQogCQlwY2ljb3JlX3VwKHNpaS0+cGNoLCBTSV9QQ0lVUCk7CiAKIH0KQEAgLTE4ODIsNyArMTA4MSw3IEBACiAJc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwogCiAJLyogcmVsZWFzZSBGT1JDRUhUIHNpbmNlIGNoaXAgaXMgZ29pbmcgdG8gImRvd24iIHN0YXRlICovCi0JaWYgKFBDSV9GT1JDRUhUKHNpaSkpCisJaWYgKFBDSV9GT1JDRUhUKHNpaCkpCiAJCV9haV9jbGtjdGxfY2Moc2lpLCBDTEtfRFlOQU1JQyk7CiAKIAlwY2ljb3JlX2Rvd24oc2lpLT5wY2gsIFNJX1BDSURPV04pOwpAQCAtMTg5NSw0MiArMTA5NCwyMyBAQAogdm9pZCBhaV9wY2lfc2V0dXAoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVtYXNrKQogewogCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IHNicGNpcmVncyBfX2lvbWVtICpyZWdzID0gTlVMTDsKLQl1MzIgc2lmbGFnID0gMCwgdzsKLQl1aW50IGlkeCA9IDA7CisJdTMyIHc7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7CiAKLQlpZiAoUENJKHNpaSkpIHsKLQkJLyogZ2V0IGN1cnJlbnQgY29yZSBpbmRleCAqLwotCQlpZHggPSBzaWktPmN1cmlkeDsKLQotCQkvKiB3ZSBpbnRlcnJ1cHQgb24gdGhpcyBiYWNrcGxhbmUgZmxhZyBudW1iZXIgKi8KLQkJc2lmbGFnID0gYWlfZmxhZyhzaWgpOwotCi0JCS8qIHN3aXRjaCBvdmVyIHRvIHBjaSBjb3JlICovCi0JCXJlZ3MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgc2lpLT5wdWIuYnVzY29yZWlkeCk7Ci0JfQotCiAJLyoKIAkgKiBFbmFibGUgc2ItPnBjaSBpbnRlcnJ1cHRzLiAgQXNzdW1lCiAJICogUENJIHJldiAyLjMgc3VwcG9ydCB3YXMgYWRkZWQgaW4gcGNpIGNvcmUgcmV2IDYgYW5kIHRoaW5ncyBjaGFuZ2VkLi4KIAkgKi8KLQlpZiAoUENJRShzaWkpIHx8IChQQ0koc2lpKSAmJiAoKHNpaS0+cHViLmJ1c2NvcmVyZXYpID49IDYpKSkgeworCWlmIChQQ0lFKHNpaCkgfHwgKFBDSShzaWgpICYmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID49IDYpKSkgewogCQkvKiBwY2kgY29uZmlnIHdyaXRlIHRvIHNldCB0aGlzIGNvcmUgYml0IGluIFBDSUludE1hc2sgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0lOVF9NQVNLLCAmdyk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX0lOVF9NQVNLLCAmdyk7CiAJCXcgfD0gKGNvcmVtYXNrIDw8IFBDSV9TQklNX1NISUZUKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9JTlRfTUFTSywgdyk7Ci0JfSBlbHNlIHsKLQkJLyogc2V0IHNiaW50dmVjIGJpdCBmb3Igb3VyIGZsYWcgbnVtYmVyICovCi0JCWFpX3NldGludChzaWgsIHNpZmxhZyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9JTlRfTUFTSywgdyk7CiAJfQogCi0JaWYgKFBDSShzaWkpKSB7Ci0JCXBjaWNvcmVfcGNpX3NldHVwKHNpaS0+cGNoLCByZWdzKTsKLQotCQkvKiBzd2l0Y2ggYmFjayB0byBwcmV2aW91cyBjb3JlICovCi0JCWFpX3NldGNvcmVpZHgoc2loLCBpZHgpOworCWlmIChQQ0koc2loKSkgeworCQlwY2ljb3JlX3BjaV9zZXR1cChzaWktPnBjaCk7CiAJfQogfQogCkBAIC0xOTQwLDI1ICsxMTIwLDExIEBACiAgKi8KIGludCBhaV9wY2lfZml4Y2ZnKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQl1aW50IG9yaWdpZHg7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gTlVMTDsKIAlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwogCiAJLyogRml4dXAgUEkgaW4gU1JPTSBzaGFkb3cgYXJlYSB0byBlbmFibGUgdGhlIGNvcnJlY3QgUENJIGNvcmUgYWNjZXNzICovCi0JLyogc2F2ZSB0aGUgY3VycmVudCBpbmRleCAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0KIAkvKiBjaGVjayAncGknIGlzIGNvcnJlY3QgYW5kIGZpeCBpdCBpZiBub3QgKi8KLQlyZWdzID0gYWlfc2V0Y29yZSgmc2lpLT5wdWIsIHNpaS0+cHViLmJ1c2NvcmV0eXBlLCAwKTsKLQlpZiAoc2lpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKQotCQlwY2ljb3JlX2ZpeGNmZ19wY2llKHNpaS0+cGNoLAotCQkJCSAgICAoc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqKXJlZ3MpOwotCWVsc2UgaWYgKHNpaS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKQotCQlwY2ljb3JlX2ZpeGNmZ19wY2koc2lpLT5wY2gsIChzdHJ1Y3Qgc2JwY2lyZWdzIF9faW9tZW0gKilyZWdzKTsKLQotCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGluZGV4ICovCi0JYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIG9yaWdpZHgpOwotCisJcGNpY29yZV9maXhjZmcoc2lpLT5wY2gpOwogCXBjaWNvcmVfaHd1cChzaWktPnBjaCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTY5LDU4ICsxMTM1LDQyIEBACiAJdWludCByZWdvZmY7CiAKIAlyZWdvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvY29udHJvbCk7Ci0JcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIHJlZ29mZiwgbWFzaywgdmFsKTsKKwlyZXR1cm4gYWlfY2NfcmVnKHNpaCwgcmVnb2ZmLCBtYXNrLCB2YWwpOwogfQogCiB2b2lkIGFpX2NoaXBjb250cmxfZXBhNDMzMShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgb24pCiB7Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCXUzMiB2YWw7CiAKLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQotCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0KLQl2YWwgPSBSX1JFRygmY2MtPmNoaXBjb250cm9sKTsKKwljYyA9IGFpX2ZpbmRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7CiAKIAlpZiAob24pIHsKLQkJaWYgKHNpaC0+Y2hpcHBrZyA9PSA5IHx8IHNpaC0+Y2hpcHBrZyA9PSAweGIpCisJCWlmIChhaV9nZXRfY2hpcHBrZyhzaWgpID09IDkgfHwgYWlfZ2V0X2NoaXBwa2coc2loKSA9PSAweGIpCiAJCQkvKiBFeHQgUEEgQ29udHJvbHMgZm9yIDQzMzEgMTJ4OSBQYWNrYWdlICovCi0JCQlXX1JFRygmY2MtPmNoaXBjb250cm9sLCB2YWwgfAotCQkJICAgICAgQ0NUUkw0MzMxX0VYVFBBX0VOIHwKLQkJCSAgICAgIENDVFJMNDMzMV9FWFRQQV9PTl9HUElPMl81KTsKKwkJCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhjaGlwY29udHJvbCksCisJCQkJICAgQ0NUUkw0MzMxX0VYVFBBX0VOIHwKKwkJCQkgICBDQ1RSTDQzMzFfRVhUUEFfT05fR1BJTzJfNSk7CiAJCWVsc2UKIAkJCS8qIEV4dCBQQSBDb250cm9scyBmb3IgNDMzMSAxMngxMiBQYWNrYWdlICovCi0JCQlXX1JFRygmY2MtPmNoaXBjb250cm9sLAotCQkJICAgICAgdmFsIHwgQ0NUUkw0MzMxX0VYVFBBX0VOKTsKKwkJCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhjaGlwY29udHJvbCksCisJCQkJICAgQ0NUUkw0MzMxX0VYVFBBX0VOKTsKIAl9IGVsc2UgewogCQl2YWwgJj0gfihDQ1RSTDQzMzFfRVhUUEFfRU4gfCBDQ1RSTDQzMzFfRVhUUEFfT05fR1BJTzJfNSk7Ci0JCVdfUkVHKCZjYy0+Y2hpcGNvbnRyb2wsIHZhbCk7CisJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoY2hpcGNvbnRyb2wpLAorCQkJICAgIH4oQ0NUUkw0MzMxX0VYVFBBX0VOIHwgQ0NUUkw0MzMxX0VYVFBBX09OX0dQSU8yXzUpKTsKIAl9Ci0KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKIC8qIEVuYWJsZSBCVC1DT0VYICYgRXgtUEEgZm9yIDQzMTMgKi8KIHZvaWQgYWlfZXBhXzQzMTN3YXIoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKLQl1aW50IG9yaWdpZHg7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjYzsKIAotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCi0JY2MgPSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7CisJY2MgPSBhaV9maW5kY29yZShzaWgsIENDX0NPUkVfSUQsIDApOwogCiAJLyogRVBBIEZpeCAqLwotCVdfUkVHKCZjYy0+Z3Bpb2NvbnRyb2wsCi0JICAgICAgUl9SRUcoJmNjLT5ncGlvY29udHJvbCkgfCBHUElPX0NUUkxfRVBBX0VOX01BU0spOwotCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOworCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhncGlvY29udHJvbCksIEdQSU9fQ1RSTF9FUEFfRU5fTUFTSyk7CiB9CiAKIC8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCAqLwpAQCAtMjAzMSw3ICsxMTgxLDcgQEAKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9WRU5ET1JfSUQsICZ3KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9WRU5ET1JfSUQsICZ3KTsKIAlpZiAoKHcgJiAweEZGRkYpICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pCiAJCXJldHVybiB0cnVlOwogCkBAIC0yMDQwLDI2ICsxMTkwLDIzIEBACiAKIGJvb2wgYWlfaXNfc3Byb21fYXZhaWxhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlpZiAoc2loLT5jY3JldiA+PSAzMSkgewotCQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCQl1aW50IG9yaWdpZHg7Ci0JCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKworCWlmIChhaV9nZXRfY2NyZXYoc2loKSA+PSAzMSkgeworCQlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCQl1MzIgc3JvbWN0cmw7CiAKLQkJaWYgKChzaWgtPmNjY2FwcyAmIENDX0NBUF9TUk9NKSA9PSAwKQorCQlpZiAoKGFpX2dldF9jY2NhcHMoc2loKSAmIENDX0NBUF9TUk9NKSA9PSAwKQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCQlzcm9tY3RybCA9IFJfUkVHKCZjYy0+c3JvbWNvbnRyb2wpOwotCQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJCWNjID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfQ0hJUENPTU1PTiwgMCk7CisJCXNyb21jdHJsID0gYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhzcm9tY29udHJvbCkpOwogCQlyZXR1cm4gc3JvbWN0cmwgJiBTUkNfUFJFU0VOVDsKIAl9CiAKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMxM19DSElQX0lEOgotCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMxM19TUFJPTV9QUkVTRU5UKSAhPSAwOworCQlyZXR1cm4gKHNpaS0+Y2hpcHN0ICYgQ1NUNDMxM19TUFJPTV9QUkVTRU5UKSAhPSAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTIwNjcsOSArMTIxNCwxMSBAQAogCiBib29sIGFpX2lzX290cF9kaXNhYmxlZChzdHJ1Y3Qgc2lfcHViICpzaWgpCiB7Ci0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOworCisJc3dpdGNoIChhaV9nZXRfY2hpcF9pZChzaWgpKSB7CiAJY2FzZSBCQ000MzEzX0NISVBfSUQ6Ci0JCXJldHVybiAoc2loLT5jaGlwc3QgJiBDU1Q0MzEzX09UUF9QUkVTRU5UKSA9PSAwOworCQlyZXR1cm4gKHNpaS0+Y2hpcHN0ICYgQ1NUNDMxM19PVFBfUFJFU0VOVCkgPT0gMDsKIAkJLyogVGhlc2UgY2hpcHMgYWx3YXlzIGhhdmUgdGhlaXIgT1RQIG9uICovCiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKQEAgLTIwNzcsMyArMTIyNiwxNSBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogfQorCit1aW50IGFpX2dldF9idXNjb3JldHlwZShzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKwlyZXR1cm4gc2lpLT5idXNjb3JlLT5pZC5pZDsKK30KKwordWludCBhaV9nZXRfYnVzY29yZXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKwlyZXR1cm4gc2lpLT5idXNjb3JlLT5pZC5yZXY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaAppbmRleCBiNTFkMWU0Li5mODRjNmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYJX0JSQ01fQUlVVElMU19IXwogI2RlZmluZQlfQlJDTV9BSVVUSUxTX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKwogI2luY2x1ZGUgInR5cGVzLmgiCiAKIC8qCkBAIC0xNDQsMjYgKzE0NiwxNSBAQAogICogICBwdWJsaWMgKHJlYWQtb25seSkgcG9ydGlvbiBvZiBhaXV0aWxzIGhhbmRsZSByZXR1cm5lZCBieSBzaV9hdHRhY2goKQogICovCiBzdHJ1Y3Qgc2lfcHViIHsKLQl1aW50IGJ1c2NvcmV0eXBlOwkvKiBQQ0lfQ09SRV9JRCwgUENJRV9DT1JFX0lELCBQQ01DSUFfQ09SRV9JRCAqLwotCXVpbnQgYnVzY29yZXJldjsJLyogYnVzY29yZSByZXYgKi8KLQl1aW50IGJ1c2NvcmVpZHg7CS8qIGJ1c2NvcmUgaW5kZXggKi8KIAlpbnQgY2NyZXY7CQkvKiBjaGlwIGNvbW1vbiBjb3JlIHJldiAqLwogCXUzMiBjY2NhcHM7CQkvKiBjaGlwIGNvbW1vbiBjYXBhYmlsaXRpZXMgKi8KLQl1MzIgY2NjYXBzX2V4dDsJLyogY2hpcCBjb21tb24gY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiAqLwogCWludCBwbXVyZXY7CQkvKiBwbXUgY29yZSByZXYgKi8KIAl1MzIgcG11Y2FwczsJCS8qIHBtdSBjYXBhYmlsaXRpZXMgKi8KIAl1aW50IGJvYXJkdHlwZTsJCS8qIGJvYXJkIHR5cGUgKi8KIAl1aW50IGJvYXJkdmVuZG9yOwkvKiBib2FyZCB2ZW5kb3IgKi8KLQl1aW50IGJvYXJkZmxhZ3M7CS8qIGJvYXJkIGZsYWdzICovCi0JdWludCBib2FyZGZsYWdzMjsJLyogYm9hcmQgZmxhZ3MyICovCiAJdWludCBjaGlwOwkJLyogY2hpcCBudW1iZXIgKi8KIAl1aW50IGNoaXByZXY7CQkvKiBjaGlwIHJldmlzaW9uICovCiAJdWludCBjaGlwcGtnOwkJLyogY2hpcCBwYWNrYWdlIG9wdGlvbiAqLwotCXUzMiBjaGlwc3Q7CQkvKiBjaGlwIHN0YXR1cyAqLwotCWJvb2wgaXNzaW07CQkvKiBjaGlwIGlzIGluIHNpbXVsYXRpb24gb3IgZW11bGF0aW9uICovCi0JdWludCBzb2NpcmV2OwkJLyogU09DIGludGVyY29ubmVjdCByZXYgKi8KLQlib29sIHBjaV9wcjMyNDE0OwotCiB9OwogCiBzdHJ1Y3QgcGNpX2RldjsKQEAgLTE3OSwzOCArMTcwLDEzIEBACiAvKiBtaXNjIHNpIGluZm8gbmVlZGVkIGJ5IHNvbWUgb2YgdGhlIHJvdXRpbmVzICovCiBzdHJ1Y3Qgc2lfaW5mbyB7CiAJc3RydWN0IHNpX3B1YiBwdWI7CS8qIGJhY2sgcGxhbmUgcHVibGljIHN0YXRlIChtdXN0IGJlIGZpcnN0KSAqLwotCXN0cnVjdCBwY2lfZGV2ICpwYnVzOwkvKiBoYW5kbGUgdG8gcGNpIGJ1cyAqLwotCXVpbnQgZGV2X2NvcmVpZDsJLyogdGhlIGNvcmUgcHJvdmlkZXMgZHJpdmVyIGZ1bmN0aW9ucyAqLwotCXZvaWQgKmludHJfYXJnOwkJLyogaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGFyZyAqLwotCXUzMiAoKmludHJzb2ZmX2ZuKSAodm9pZCAqaW50cl9hcmcpOyAvKiB0dXJucyBjaGlwIGludGVycnVwdHMgb2ZmICovCi0JLyogcmVzdG9yZSBjaGlwIGludGVycnVwdHMgKi8KLQl2b2lkICgqaW50cnNyZXN0b3JlX2ZuKSAodm9pZCAqaW50cl9hcmcsIHUzMiBhcmcpOwotCS8qIGNoZWNrIGlmIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKi8KLQlib29sICgqaW50cnNlbmFibGVkX2ZuKSAodm9pZCAqaW50cl9hcmcpOwotCisJc3RydWN0IGJjbWFfYnVzICppY2J1czsJLyogaGFuZGxlIHRvIHNvYyBpbnRlcmNvbm5lY3QgYnVzICovCisJc3RydWN0IHBjaV9kZXYgKnBjaWJ1czsJLyogaGFuZGxlIHRvIHBjaSBidXMgKi8KIAlzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2g7IC8qIFBDSS9FIGNvcmUgaGFuZGxlICovCi0KKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmJ1c2NvcmU7CiAJc3RydWN0IGxpc3RfaGVhZCB2YXJfbGlzdDsgLyogbGlzdCBvZiBzcm9tIHZhcmlhYmxlcyAqLwogCi0Jdm9pZCBfX2lvbWVtICpjdXJtYXA7CQkJLyogY3VycmVudCByZWdzIHZhICovCi0Jdm9pZCBfX2lvbWVtICpyZWdzW1NJX01BWENPUkVTXTsJLyogb3RoZXIgcmVncyB2YSAqLwotCi0JdWludCBjdXJpZHg7CQkvKiBjdXJyZW50IGNvcmUgaW5kZXggKi8KLQl1aW50IG51bWNvcmVzOwkJLyogIyBkaXNjb3ZlcmVkIGNvcmVzICovCi0JdWludCBjb3JlaWRbU0lfTUFYQ09SRVNdOyAvKiBpZCBvZiBlYWNoIGNvcmUgKi8KLQl1MzIgY29yZXNiYVtTSV9NQVhDT1JFU107IC8qIGJhY2twbGFuZSBhZGRyZXNzIG9mIGVhY2ggY29yZSAqLwotCXZvaWQgKnJlZ3MyW1NJX01BWENPUkVTXTsgLyogMm5kIHZpcnR1YWwgYWRkcmVzcyBwZXIgY29yZSAodXNiaDIwKSAqLwotCXUzMiBjb3Jlc2JhMltTSV9NQVhDT1JFU107IC8qIDJuZCBwaHlzIGFkZHJlc3MgcGVyIGNvcmUgKHVzYmgyMCkgKi8KLQl1MzIgY29yZXNiYV9zaXplW1NJX01BWENPUkVTXTsgLyogYmFja3BsYW5lIGFkZHJlc3Mgc3BhY2Ugc2l6ZSAqLwotCXUzMiBjb3Jlc2JhMl9zaXplW1NJX01BWENPUkVTXTsJLyogc2Vjb25kIGFkZHJlc3Mgc3BhY2Ugc2l6ZSAqLwotCi0Jdm9pZCAqY3Vyd3JhcDsJCS8qIGN1cnJlbnQgd3JhcHBlciB2YSAqLwotCXZvaWQgKndyYXBwZXJzW1NJX01BWENPUkVTXTsJLyogb3RoZXIgY29yZXMgd3JhcHBlciB2YSAqLwotCXUzMiB3cmFwYmFbU0lfTUFYQ09SRVNdOwkvKiBhZGRyZXNzIG9mIGNvbnRyb2xsaW5nIHdyYXBwZXIgKi8KLQotCXUzMiBjaWFbU0lfTUFYQ09SRVNdOwkvKiBlcm9tIGNpYSBlbnRyeSBmb3IgZWFjaCBjb3JlICovCi0JdTMyIGNpYltTSV9NQVhDT1JFU107CS8qIGVyb20gY2lhIGVudHJ5IGZvciBlYWNoIGNvcmUgKi8KLQl1MzIgb29iX3JvdXRlcjsJLyogb29iIHJvdXRlciByZWdpc3RlcnMgZm9yIGF4aSAqLworCXUzMiBjaGlwc3Q7CQkvKiBjaGlwIHN0YXR1cyAqLwogfTsKIAogLyoKQEAgLTIyMyw1MiArMTg5LDE1IEBACiAKIAogLyogQU1CQSBJbnRlcmNvbm5lY3QgZXhwb3J0ZWQgZXh0ZXJucyAqLwotZXh0ZXJuIHVpbnQgYWlfZmxhZyhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgYWlfc2V0aW50KHN0cnVjdCBzaV9wdWIgKnNpaCwgaW50IHNpZmxhZyk7Ci1leHRlcm4gdWludCBhaV9jb3JlaWR4KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JldmVuZG9yKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gYm9vbCBhaV9pc2NvcmV1cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB2b2lkIGFpX2NvcmVfY2ZsYWdzX3dvKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX3NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1aW50IGFpX2NvcmVyZWcoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssCi0JCSAgICAgICB1aW50IHZhbCk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX3Jlc2V0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMsIHUzMiByZXNldGJpdHMpOwotZXh0ZXJuIHZvaWQgYWlfY29yZV9kaXNhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMpOwotZXh0ZXJuIGludCBhaV9udW1hZGRyc3BhY2VzKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdTMyIGFpX2FkZHJzcGFjZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgYXNpZHgpOwotZXh0ZXJuIHUzMiBhaV9hZGRyc3BhY2VzaXplKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBhc2lkeCk7Ci1leHRlcm4gdm9pZCBhaV93cml0ZV93cmFwX3JlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpOworZXh0ZXJuIHN0cnVjdCBiY21hX2RldmljZSAqYWlfZmluZGNvcmUoc3RydWN0IHNpX3B1YiAqc2loLAorCQkJCSAgICAgICB1MTYgY29yZWlkLCB1MTYgY29yZXVuaXQpOworZXh0ZXJuIHUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIAogLyogPT09IGV4cG9ydGVkIGZ1bmN0aW9ucyA9PT0gKi8KLWV4dGVybiBzdHJ1Y3Qgc2lfcHViICphaV9hdHRhY2godm9pZCBfX2lvbWVtICpyZWdzLCBzdHJ1Y3QgcGNpX2RldiAqc2RoKTsKK2V4dGVybiBzdHJ1Y3Qgc2lfcHViICphaV9hdHRhY2goc3RydWN0IGJjbWFfYnVzICpwYnVzKTsKIGV4dGVybiB2b2lkIGFpX2RldGFjaChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZWlkKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JlcmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWR4LCB1aW50IHJlZ29mZiwgdWludCBtYXNrLAotCQl1aW50IHZhbCk7Ci1leHRlcm4gdm9pZCBhaV93cml0ZV93cmFwcGVycmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG9mZnNldCwgdTMyIHZhbCk7Ci1leHRlcm4gdTMyIGFpX2NvcmVfY2ZsYWdzKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX3NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiBib29sIGFpX2lzY29yZXVwKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9maW5kY29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KTsKLWV4dGVybiB2b2lkIF9faW9tZW0gKmFpX3NldGNvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZHgpOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqYWlfc2V0Y29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KTsKLWV4dGVybiB2b2lkIF9faW9tZW0gKmFpX3N3aXRjaF9jb3JlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWQsCi0JCQkJICAgIHVpbnQgKm9yaWdpZHgsIHVpbnQgKmludHJfdmFsKTsKLWV4dGVybiB2b2lkIGFpX3Jlc3RvcmVfY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGludHJfdmFsKTsKLWV4dGVybiB2b2lkIGFpX2NvcmVfcmVzZXQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cywgdTMyIHJlc2V0Yml0cyk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX2Rpc2FibGUoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cyk7Ci1leHRlcm4gdTMyIGFpX2FscF9jbG9jayhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHUzMiBhaV9pbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKTsKK2V4dGVybiB1aW50IGFpX2NjX3JlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnb2ZmLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdm9pZCBhaV9wY2lfc2V0dXAoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVtYXNrKTsKLWV4dGVybiB2b2lkIGFpX3NldGludChzdHJ1Y3Qgc2lfcHViICpzaWgsIGludCBzaWZsYWcpOwotZXh0ZXJuIGJvb2wgYWlfYmFja3BsYW5lNjQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIGFpX3JlZ2lzdGVyX2ludHJfY2FsbGJhY2soc3RydWN0IHNpX3B1YiAqc2loLCB2b2lkICppbnRyc29mZl9mbiwKLQkJCQkgICAgICB2b2lkICppbnRyc3Jlc3RvcmVfZm4sCi0JCQkJICAgICAgdm9pZCAqaW50cnNlbmFibGVkX2ZuLCB2b2lkICppbnRyX2FyZyk7Ci1leHRlcm4gdm9pZCBhaV9kZXJlZ2lzdGVyX2ludHJfY2FsbGJhY2soc3RydWN0IHNpX3B1YiAqc2loKTsKIGV4dGVybiB2b2lkIGFpX2Nsa2N0bF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCk7CiBleHRlcm4gdTE2IGFpX2Nsa2N0bF9mYXN0X3B3cnVwX2RlbGF5KHN0cnVjdCBzaV9wdWIgKnNpaCk7CiBleHRlcm4gYm9vbCBhaV9jbGtjdGxfY2Moc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IG1vZGUpOwpAQCAtMjgzLDEzICsyMTIsNiBAQAogLyogU1BST00gYXZhaWxhYmlsaXR5ICovCiBleHRlcm4gYm9vbCBhaV9pc19zcHJvbV9hdmFpbGFibGUoc3RydWN0IHNpX3B1YiAqc2loKTsKIAotLyoKLSAqIEJ1aWxkIGRldmljZSBwYXRoLiBQYXRoIHNpemUgbXVzdCBiZSA+PSBTSV9ERVZQQVRIX0JVRlNaLgotICogVGhlIHJldHVybmVkIHBhdGggaXMgTlVMTCB0ZXJtaW5hdGVkIGFuZCBoYXMgdHJhaWxpbmcgJy8nLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvdGhlcndpc2UuCi0gKi8KLWV4dGVybiBpbnQgYWlfZGV2cGF0aChzdHJ1Y3Qgc2lfcHViICpzaWgsIGNoYXIgKnBhdGgsIGludCBzaXplKTsKLQogZXh0ZXJuIHZvaWQgYWlfcGNpX3NsZWVwKHN0cnVjdCBzaV9wdWIgKnNpaCk7CiBleHRlcm4gdm9pZCBhaV9wY2lfZG93bihzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHZvaWQgYWlfcGNpX3VwKHN0cnVjdCBzaV9wdWIgKnNpaCk7CkBAIC0yOTksNCArMjIxLDUyIEBACiAvKiBFbmFibGUgRXgtUEEgZm9yIDQzMTMgKi8KIGV4dGVybiB2b2lkIGFpX2VwYV80MzEzd2FyKHN0cnVjdCBzaV9wdWIgKnNpaCk7CiAKK2V4dGVybiB1aW50IGFpX2dldF9idXNjb3JldHlwZShzdHJ1Y3Qgc2lfcHViICpzaWgpOworZXh0ZXJuIHVpbnQgYWlfZ2V0X2J1c2NvcmVyZXYoc3RydWN0IHNpX3B1YiAqc2loKTsKKworc3RhdGljIGlubGluZSBpbnQgYWlfZ2V0X2NjcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5jY3JldjsKK30KKworc3RhdGljIGlubGluZSB1MzIgYWlfZ2V0X2NjY2FwcyhzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Y2NjYXBzOworfQorCitzdGF0aWMgaW5saW5lIGludCBhaV9nZXRfcG11cmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5wbXVyZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFpX2dldF9wbXVjYXBzKHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5wbXVjYXBzOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQgYWlfZ2V0X2JvYXJkdHlwZShzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Ym9hcmR0eXBlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQgYWlfZ2V0X2JvYXJkdmVuZG9yKHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5ib2FyZHZlbmRvcjsKK30KKworc3RhdGljIGlubGluZSB1aW50IGFpX2dldF9jaGlwX2lkKHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5jaGlwOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQgYWlfZ2V0X2NoaXByZXYoc3RydWN0IHNpX3B1YiAqc2loKQoreworCXJldHVybiBzaWgtPmNoaXByZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludCBhaV9nZXRfY2hpcHBrZyhzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Y2hpcHBrZzsKK30KKwogI2VuZGlmCQkJCS8qIF9CUkNNX0FJVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9hbXBkdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMKaW5kZXggN2YyN2RiZC4uOTA5MTFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMKQEAgLTY0OSw3ICs2NDksNyBAQAogCQlsZW4gPSByb3VuZHVwKGxlbiwgNCk7CiAJCWFtcGR1X2xlbiArPSAobGVuICsgKG5kZWxpbSArIDEpICogQU1QRFVfREVMSU1JVEVSX0xFTik7CiAKLQkJZG1hX2xlbiArPSAodTE2KSBicmNtdV9wa3R0b3RsZW4ocCk7CisJCWRtYV9sZW4gKz0gKHUxNikgcC0+bGVuOwogCiAJCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogYW1wZHVfbGVuICVkIgogCQkJIiBzZWdfY250ICVkIG51bGwgZGVsaW0gJWRcbiIsCkBAIC03NDEsOSArNzQxLDcgQEAKIAkJaWYgKHApIHsKIAkJCWlmICgodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgogCQkJICAgICgodTgpIChwLT5wcmlvcml0eSkgPT0gdGlkKSkgewotCi0JCQkJcGxlbiA9IGJyY211X3BrdHRvdGxlbihwKSArCi0JCQkJICAgICAgIEFNUERVX01BWF9NUERVX09WRVJIRUFEOworCQkJCXBsZW4gPSBwLT5sZW4gKyBBTVBEVV9NQVhfTVBEVV9PVkVSSEVBRDsKIAkJCQlwbGVuID0gbWF4KHNjYl9hbXBkdS0+bWluX2xlbiwgcGxlbik7CiAKIAkJCQlpZiAoKHBsZW4gKyBhbXBkdV9sZW4pID4gbWF4X2FtcGR1X2J5dGVzKSB7CkBAIC0xMTIwLDE0ICsxMTE4LDE3IEBACiAJCXU4IHN0YXR1c19kZWxheSA9IDA7CiAKIAkJLyogd2FpdCB0aWxsIHRoZSBuZXh0IDggYnl0ZXMgb2YgdHhzdGF0dXMgaXMgYXZhaWxhYmxlICovCi0JCXdoaWxlICgoKHMxID0gUl9SRUcoJndsYy0+cmVncy0+ZnJtdHhzdGF0dXMpKSAmIFRYU19WKSA9PSAwKSB7CisJCXMxID0gYmNtYV9yZWFkMzIod2xjLT5ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhmcm10eHN0YXR1cykpOworCQl3aGlsZSAoKHMxICYgVFhTX1YpID09IDApIHsKIAkJCXVkZWxheSgxKTsKIAkJCXN0YXR1c19kZWxheSsrOwogCQkJaWYgKHN0YXR1c19kZWxheSA+IDEwKQogCQkJCXJldHVybjsgLyogZXJyb3IgY29uZGl0aW9uICovCisJCQlzMSA9IGJjbWFfcmVhZDMyKHdsYy0+aHctPmQxMWNvcmUsCisJCQkJCSBEMTFSRUdPRkZTKGZybXR4c3RhdHVzKSk7CiAJCX0KIAotCQlzMiA9IFJfUkVHKCZ3bGMtPnJlZ3MtPmZybXR4c3RhdHVzMik7CisJCXMyID0gYmNtYV9yZWFkMzIod2xjLT5ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhmcm10eHN0YXR1czIpKTsKIAl9CiAKIAlpZiAoc2NiKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvY2hhbm5lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuYwppbmRleCA4OWFkMWI3Li41NWU5ZjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMKQEAgLTExNTMsMTIxICsxMTUzLDYgQEAKIAkJCSAgICAgICZ0eHB3cik7CiB9CiAKLSNpZmRlZiBQT1dFUl9EQkcKLXN0YXRpYyB2b2lkIHdsY19waHlfdHhwb3dlcl9saW1pdHNfZHVtcChzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKLXsKLQlpbnQgaTsKLQljaGFyIGJ1Zls4MF07Ci0JY2hhciBmcmFjdGlvbls0XVs0XSA9IHsgIiAgICIsICIuMjUiLCAiLjUgIiwgIi43NSIgfTsKLQotCXNwcmludGYoYnVmLCAiQ0NLICAgICAgICAgICAgICAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfQ0NLOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+Y2NrW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPmNja1tpXSAlIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE9GRE0gU0lTTyAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+b2ZkbVtpXSAlIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE9GRE0gQ0REICAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1fY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1fY2RkW2ldICUgQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogT0ZETSBTSVNPICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+b2ZkbV80MF9zaXNvW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1fNDBfc2lzb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogT0ZETSBDREQgICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+b2ZkbV80MF9jZGRbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+b2ZkbV80MF9jZGRbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzAtNyBTSVNPICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzIwX3Npc29baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzIwX3Npc29baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzAtNyBDREQgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzIwX2NkZFtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfY2RkW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBNQ1MwLTcgU1RCQyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9zdGJjW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc18yMF9zdGJjW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBNQ1M4LTE1IFNETSAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9taW1vW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc18yMF9taW1vW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1MwLTcgU0lTTyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc180MF9zaXNvW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc180MF9zaXNvW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1MwLTcgQ0REICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc180MF9jZGRbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX2NkZFtpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogTUNTMC03IFNUQkMgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfc3RiY1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfNDBfc3RiY1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogTUNTOC0xNSBTRE0gIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfbWltb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfNDBfbWltb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJNQ1MzMiAgICAgICAgICAgICAgICUyZCVzXG4iLAotCSAgICAgICB0eHB3ci0+bWNzMzIgLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JICAgICAgIGZyYWN0aW9uW3R4cHdyLT5tY3MzMiAlIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotfQotI2VuZGlmCQkJCS8qIFBPV0VSX0RCRyAqLwotCiB2b2lkCiBicmNtc19jX2NoYW5uZWxfcmVnX2xpbWl0cyhzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCB1MTYgY2hhbnNwZWMsCiAJCSAgICAgICBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKQEAgLTE0NzgsOSArMTM2Myw2IEBACiAJCQl0eHB3ci0+bWNzXzQwX3N0YmNbaV0gPSB0eHB3ci0+bWNzXzQwX2NkZFtpXTsKIAl9CiAKLSNpZmRlZiBQT1dFUl9EQkcKLQl3bGNfcGh5X3R4cG93ZXJfbGltaXRzX2R1bXAodHhwd3IpOwotI2VuZGlmCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZDExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZDExLmgKaW5kZXggZWQ1MTYxNi4uMTk0OGNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2QxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kMTEuaApAQCAtNDMwLDYgKzQzMCw5IEBACiAJdTE2IFBBRFsweDM4MF07CS8qIDB4ODAwIC0gMHhFRkUgKi8KIH07CiAKKy8qIGQxMSByZWdpc3RlciBmaWVsZCBvZmZzZXQgKi8KKyNkZWZpbmUgRDExUkVHT0ZGUyhmaWVsZCkJb2Zmc2V0b2Yoc3RydWN0IGQxMXJlZ3MsIGZpZWxkKQorCiAjZGVmaW5lCVBJSFJfQkFTRQkweDA0MDAJLyogYnl0ZSBhZGRyZXNzIG9mIHBhY2tlZCBJSFIgcmVnaW9uICovCiAKIC8qIGJpc3RzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuYwppbmRleCBlMjg2ZmI0Li5iNGNmNjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5jCkBAIC0xMyw2ICsxMyw5IEBACiAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMjQsNiArMjcsMTMgQEAKICNpbmNsdWRlICJzb2MuaCIKIAogLyoKKyAqIGRtYSByZWdpc3RlciBmaWVsZCBvZmZzZXQgY2FsY3VsYXRpb24KKyAqLworI2RlZmluZSBETUE2NFJFR09GRlMoZmllbGQpCQlvZmZzZXRvZihzdHJ1Y3QgZG1hNjRyZWdzLCBmaWVsZCkKKyNkZWZpbmUgRE1BNjRUWFJFR09GRlMoZGksIGZpZWxkKQkoZGktPmQ2NHR4cmVnYmFzZSArIERNQTY0UkVHT0ZGUyhmaWVsZCkpCisjZGVmaW5lIERNQTY0UlhSRUdPRkZTKGRpLCBmaWVsZCkJKGRpLT5kNjRyeHJlZ2Jhc2UgKyBETUE2NFJFR09GRlMoZmllbGQpKQorCisvKgogICogRE1BIGhhcmR3YXJlIHJlcXVpcmVzIGVhY2ggZGVzY3JpcHRvciByaW5nIHRvIGJlIDhrQiBhbGlnbmVkLCBhbmQgZml0IHdpdGhpbgogICogYSBjb250aWd1b3VzIDhrQiBwaHlzaWNhbCBhZGRyZXNzLgogICovCkBAIC0xNjgsMjYgKzE3OCwyNSBAQAogCiAvKiBkZWJ1Zy90cmFjZSAqLwogI2lmZGVmIEJDTURCRwotI2RlZmluZQlETUFfRVJST1IoYXJncykgXAotCWRvIHsgXAotCQlpZiAoISgqZGktPm1zZ19sZXZlbCAmIDEpKSBcCi0JCQk7IFwKLQkJZWxzZSBcCi0JCQlwcmludGsgYXJnczsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lCURNQV9UUkFDRShhcmdzKSBcCi0JZG8geyBcCi0JCWlmICghKCpkaS0+bXNnX2xldmVsICYgMikpIFwKLQkJCTsgXAotCQllbHNlIFwKLQkJCXByaW50ayBhcmdzOyBcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUJRE1BX0VSUk9SKGZtdCwgLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICgqZGktPm1zZ19sZXZlbCAmIDEpCQkJCQlcCisJCXByX2RlYnVnKCIlczogIiBmbXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUJRE1BX1RSQUNFKGZtdCwgLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICgqZGktPm1zZ19sZXZlbCAmIDIpCQkJCQlcCisJCXByX2RlYnVnKCIlczogIiBmbXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKTsJXAorfSB3aGlsZSAoMCkKICNlbHNlCi0jZGVmaW5lCURNQV9FUlJPUihhcmdzKQotI2RlZmluZQlETUFfVFJBQ0UoYXJncykKKyNkZWZpbmUJRE1BX0VSUk9SKGZtdCwgLi4uKQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZQlETUFfVFJBQ0UoZm10LCAuLi4pCQkJXAorCW5vX3ByaW50ayhmbXQsICMjX19WQV9BUkdTX18pCiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLSNkZWZpbmUJRE1BX05PTkUoYXJncykKKyNkZWZpbmUJRE1BX05PTkUoZm10LCAuLi4pCQkJXAorCW5vX3ByaW50ayhmbXQsICMjX19WQV9BUkdTX18pCiAKICNkZWZpbmUJTUFYTkFNRUwJOAkvKiA4IGNoYXIgbmFtZXMgKi8KIApAQCAtMjE4LDE1ICsyMjcsMTYgQEAKIAl1aW50ICptc2dfbGV2ZWw7CS8qIG1lc3NhZ2UgbGV2ZWwgcG9pbnRlciAqLwogCWNoYXIgbmFtZVtNQVhOQU1FTF07CS8qIGNhbGxlcnMgbmFtZSBmb3IgZGlhZyBtc2dzICovCiAKLQlzdHJ1Y3QgcGNpX2RldiAqcGJ1czsJCS8qIGJ1cyBoYW5kbGUgKi8KKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CisJc3RydWN0IGRldmljZSAqZG1hZGV2OwogCiAJYm9vbCBkbWE2NDsJLyogdGhpcyBkbWEgZW5naW5lIGlzIG9wZXJhdGluZyBpbiA2NC1iaXQgbW9kZSAqLwogCWJvb2wgYWRkcmV4dDsJLyogdGhpcyBkbWEgZW5naW5lIHN1cHBvcnRzIERtYUV4dGVuZGVkQWRkckNoYW5nZXMgKi8KIAogCS8qIDY0LWJpdCBkbWEgdHggZW5naW5lIHJlZ2lzdGVycyAqLwotCXN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqZDY0dHhyZWdzOworCXVpbnQgZDY0dHhyZWdiYXNlOwogCS8qIDY0LWJpdCBkbWEgcnggZW5naW5lIHJlZ2lzdGVycyAqLwotCXN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqZDY0cnhyZWdzOworCXVpbnQgZDY0cnhyZWdiYXNlOwogCS8qIHBvaW50ZXIgdG8gZG1hNjQgdHggZGVzY3JpcHRvciByaW5nICovCiAJc3RydWN0IGRtYTY0ZGVzYyAqdHhkNjQ7CiAJLyogcG9pbnRlciB0byBkbWE2NCByeCBkZXNjcmlwdG9yIHJpbmcgKi8KQEAgLTM2MSw3ICszNzEsNyBAQAogCXVpbnQgZG1hY3RybGZsYWdzOwogCiAJaWYgKGRpID09IE5VTEwpIHsKLQkJRE1BX0VSUk9SKCgiX2RtYV9jdHJsZmxhZ3M6IE5VTEwgZG1hIGhhbmRsZVxuIikpOworCQlETUFfRVJST1IoIk5VTEwgZG1hIGhhbmRsZVxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzczLDE1ICszODMsMTYgQEAKIAlpZiAoZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSB7CiAJCXUzMiBjb250cm9sOwogCi0JCWNvbnRyb2wgPSBSX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCk7Ci0JCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLAorCQljb250cm9sID0gYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSk7CisJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLAogCQkgICAgICBjb250cm9sIHwgRDY0X1hDX1BEKTsKLQkJaWYgKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sKSAmIEQ2NF9YQ19QRCkKKwkJaWYgKGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCkpICYKKwkJICAgIEQ2NF9YQ19QRCkKIAkJCS8qIFdlICpjYW4qIGRpc2FibGUgaXQgc28gaXQgaXMgc3VwcG9ydGVkLAogCQkJICogcmVzdG9yZSBjb250cm9sIHJlZ2lzdGVyCiAJCQkgKi8KLQkJCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLAotCQkJY29udHJvbCk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSwKKwkJCQkgICAgIGNvbnRyb2wpOwogCQllbHNlCiAJCQkvKiBOb3Qgc3VwcG9ydGVkLCBkb24ndCBhbGxvdyBpdCB0byBiZSBlbmFibGVkICovCiAJCQlkbWFjdHJsZmxhZ3MgJj0gfkRNQV9DVFJMX1BFTjsKQEAgLTM5MiwxMiArNDAzLDEyIEBACiAJcmV0dXJuIGRtYWN0cmxmbGFnczsKIH0KIAotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQoc3RydWN0IGRtYTY0cmVncyBfX2lvbWVtICpkbWE2NHJlZ3MpCitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1aW50IGN0cmxfb2Zmc2V0KQogewogCXUzMiB3OwotCU9SX1JFRygmZG1hNjRyZWdzLT5jb250cm9sLCBENjRfWENfQUUpOwotCXcgPSBSX1JFRygmZG1hNjRyZWdzLT5jb250cm9sKTsKLQlBTkRfUkVHKCZkbWE2NHJlZ3MtPmNvbnRyb2wsIH5ENjRfWENfQUUpOworCWJjbWFfc2V0MzIoZGktPmNvcmUsIGN0cmxfb2Zmc2V0LCBENjRfWENfQUUpOworCXcgPSBiY21hX3JlYWQzMihkaS0+Y29yZSwgY3RybF9vZmZzZXQpOworCWJjbWFfbWFzazMyKGRpLT5jb3JlLCBjdHJsX29mZnNldCwgfkQ2NF9YQ19BRSk7CiAJcmV0dXJuICh3ICYgRDY0X1hDX0FFKSA9PSBENjRfWENfQUU7CiB9CiAKQEAgLTQxMCwxNSArNDIxLDE1IEBACiAJLyogRE1BNjQgc3VwcG9ydHMgZnVsbCAzMi0gb3IgNjQtYml0IG9wZXJhdGlvbi4gQUUgaXMgYWx3YXlzIHZhbGlkICovCiAKIAkvKiBub3QgYWxsIHR4IG9yIHJ4IGNoYW5uZWwgYXJlIGF2YWlsYWJsZSAqLwotCWlmIChkaS0+ZDY0dHhyZWdzICE9IE5VTEwpIHsKLQkJaWYgKCFfZG1hNjRfYWRkcmV4dChkaS0+ZDY0dHhyZWdzKSkKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgdHggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOworCWlmIChkaS0+ZDY0dHhyZWdiYXNlICE9IDApIHsKKwkJaWYgKCFfZG1hNjRfYWRkcmV4dChkaSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpKSkKKwkJCURNQV9FUlJPUigiJXM6IERNQTY0IHR4IGRvZXNuJ3QgaGF2ZSBBRSBzZXRcbiIsCisJCQkJICBkaS0+bmFtZSk7CiAJCXJldHVybiB0cnVlOwotCX0gZWxzZSBpZiAoZGktPmQ2NHJ4cmVncyAhPSBOVUxMKSB7Ci0JCWlmICghX2RtYTY0X2FkZHJleHQoZGktPmQ2NHJ4cmVncykpCi0JCQlETUFfRVJST1IoKCIlczogX2RtYV9pc2FkZHJleHQ6IERNQTY0IHJ4IGRvZXNuJ3QgaGF2ZSAiCi0JCQkJICAgIkFFIHNldFxuIiwgZGktPm5hbWUpKTsKKwl9IGVsc2UgaWYgKGRpLT5kNjRyeHJlZ2Jhc2UgIT0gMCkgeworCQlpZiAoIV9kbWE2NF9hZGRyZXh0KGRpLCBETUE2NFJYUkVHT0ZGUyhkaSwgY29udHJvbCkpKQorCQkJRE1BX0VSUk9SKCIlczogRE1BNjQgcnggZG9lc24ndCBoYXZlIEFFIHNldFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC00MzAsMTQgKzQ0MSwxNCBAQAogCXUzMiBhZGRybDsKIAogCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZGVzY3JpcHRvcnMgbmVlZCB0byBiZSBhbGlnbmVkIG9uIDRLLzhLIG9yIG5vdCAqLwotCWlmIChkaS0+ZDY0dHhyZWdzICE9IE5VTEwpIHsKLQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJsb3csIDB4ZmYwKTsKLQkJYWRkcmwgPSBSX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdyk7CisJaWYgKGRpLT5kNjR0eHJlZ2Jhc2UgIT0gMCkgeworCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBhZGRybG93KSwgMHhmZjApOworCQlhZGRybCA9IGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgYWRkcmxvdykpOwogCQlpZiAoYWRkcmwgIT0gMCkKIAkJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKGRpLT5kNjRyeHJlZ3MgIT0gTlVMTCkgewotCQlXX1JFRygmZGktPmQ2NHJ4cmVncy0+YWRkcmxvdywgMHhmZjApOwotCQlhZGRybCA9IFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRybG93KTsKKwl9IGVsc2UgaWYgKGRpLT5kNjRyeHJlZ2Jhc2UgIT0gMCkgeworCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBhZGRybG93KSwgMHhmZjApOworCQlhZGRybCA9IGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgYWRkcmxvdykpOwogCQlpZiAoYWRkcmwgIT0gMCkKIAkJCXJldHVybiBmYWxzZTsKIAl9CkBAIC00NDgsNyArNDU5LDcgQEAKICAqIERlc2NyaXB0b3IgdGFibGUgbXVzdCBzdGFydCBhdCB0aGUgRE1BIGhhcmR3YXJlIGRpY3RhdGVkIGFsaWdubWVudCwgc28KICAqIGFsbG9jYXRlZCBtZW1vcnkgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gc3VwcG9ydCB0aGlzIHJlcXVpcmVtZW50LgogICovCi1zdGF0aWMgdm9pZCAqZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQgc2l6ZSwKK3N0YXRpYyB2b2lkICpkbWFfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1aW50IHNpemUsCiAJCQkJICB1MTYgYWxpZ25fYml0cywgdWludCAqYWxsb2NlZCwKIAkJCQkgIGRtYV9hZGRyX3QgKnBhcCkKIHsKQEAgLTQ1OCw3ICs0NjksNyBAQAogCQkJc2l6ZSArPSBhbGlnbjsKIAkJKmFsbG9jZWQgPSBzaXplOwogCX0KLQlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgcGFwKTsKKwlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRpLT5kbWFkZXYsIHNpemUsIHBhcCwgR0ZQX0FUT01JQyk7CiB9CiAKIHN0YXRpYwpAQCAtNDg0LDcgKzQ5NSw3IEBACiAJdTMyIGRlc2Nfc3RydGFkZHI7CiAJdTMyIGFsaWduYnl0ZXMgPSAxIDw8ICphbGlnbmJpdHM7CiAKLQl2YSA9IGRtYV9hbGxvY19jb25zaXN0ZW50KGRpLT5wYnVzLCBzaXplLCAqYWxpZ25iaXRzLCBhbGxvY2VkLCBkZXNjcGEpOworCXZhID0gZG1hX2FsbG9jX2NvbnNpc3RlbnQoZGksIHNpemUsICphbGlnbmJpdHMsIGFsbG9jZWQsIGRlc2NwYSk7CiAKIAlpZiAoTlVMTCA9PSB2YSkKIAkJcmV0dXJuIE5VTEw7CkBAIC00OTMsOCArNTA0LDggQEAKIAlpZiAoKChkZXNjX3N0cnRhZGRyICsgc2l6ZSAtIDEpICYgYm91bmRhcnkpICE9IChkZXNjX3N0cnRhZGRyCiAJCQkJCQkJJiBib3VuZGFyeSkpIHsKIAkJKmFsaWduYml0cyA9IGRtYV9hbGlnbl9zaXpldG9iaXRzKHNpemUpOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRpLT5wYnVzLCBzaXplLCB2YSwgKmRlc2NwYSk7Ci0JCXZhID0gZG1hX2FsbG9jX2NvbnNpc3RlbnQoZGktPnBidXMsIHNpemUsICphbGlnbmJpdHMsCisJCWRtYV9mcmVlX2NvaGVyZW50KGRpLT5kbWFkZXYsIHNpemUsIHZhLCAqZGVzY3BhKTsKKwkJdmEgPSBkbWFfYWxsb2NfY29uc2lzdGVudChkaSwgc2l6ZSwgKmFsaWduYml0cywKIAkJCWFsbG9jZWQsIGRlc2NwYSk7CiAJfQogCXJldHVybiB2YTsKQEAgLTUxOSw4ICs1MzAsOCBAQAogCQl2YSA9IGRtYV9yaW5nYWxsb2MoZGksIEQ2NFJJTkdBTElHTiwgc2l6ZSwgJmFsaWduX2JpdHMsCiAJCQkmYWxsb2NlZCwgJmRpLT50eGRwYW9yaWcpOwogCQlpZiAodmEgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYTY0X2FsbG9jOiBETUFfQUxMT0NfQ09OU0lTVEVOVChudHhkKSIKLQkJCQkgICAiIGZhaWxlZFxuIiwgZGktPm5hbWUpKTsKKwkJCURNQV9FUlJPUigiJXM6IERNQV9BTExPQ19DT05TSVNURU5UKG50eGQpIGZhaWxlZFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwpAQCAtNTMzLDggKzU0NCw4IEBACiAJCXZhID0gZG1hX3JpbmdhbGxvYyhkaSwgRDY0UklOR0FMSUdOLCBzaXplLCAmYWxpZ25fYml0cywKIAkJCSZhbGxvY2VkLCAmZGktPnJ4ZHBhb3JpZyk7CiAJCWlmICh2YSA9PSBOVUxMKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hNjRfYWxsb2M6IERNQV9BTExPQ19DT05TSVNURU5UKG5yeGQpIgotCQkJCSAgICIgZmFpbGVkXG4iLCBkaS0+bmFtZSkpOworCQkJRE1BX0VSUk9SKCIlczogRE1BX0FMTE9DX0NPTlNJU1RFTlQobnJ4ZCkgZmFpbGVkXG4iLAorCQkJCSAgZGktPm5hbWUpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWFsaWduID0gKDEgPDwgYWxpZ25fYml0cyk7CkBAIC01NTQsMTIgKzU2NSwxMyBAQAogfQogCiBzdHJ1Y3QgZG1hX3B1YiAqZG1hX2F0dGFjaChjaGFyICpuYW1lLCBzdHJ1Y3Qgc2lfcHViICpzaWgsCi0JCSAgICAgdm9pZCBfX2lvbWVtICpkbWFyZWdzdHgsIHZvaWQgX19pb21lbSAqZG1hcmVnc3J4LAotCQkgICAgIHVpbnQgbnR4ZCwgdWludCBucnhkLAotCQkgICAgIHVpbnQgcnhidWZzaXplLCBpbnQgcnhleHRoZWFkcm9vbSwKLQkJICAgICB1aW50IG5yeHBvc3QsIHVpbnQgcnhvZmZzZXQsIHVpbnQgKm1zZ19sZXZlbCkKKwkJCSAgIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwKKwkJCSAgIHVpbnQgdHhyZWdiYXNlLCB1aW50IHJ4cmVnYmFzZSwgdWludCBudHhkLCB1aW50IG5yeGQsCisJCQkgICB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCisJCQkgICB1aW50IG5yeHBvc3QsIHVpbnQgcnhvZmZzZXQsIHVpbnQgKm1zZ19sZXZlbCkKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpOworCXU4IHJldiA9IGNvcmUtPmlkLnJldjsKIAl1aW50IHNpemU7CiAKIAkvKiBhbGxvY2F0ZSBwcml2YXRlIGluZm8gc3RydWN0dXJlICovCkBAIC01NzAsMTEgKzU4MiwxMyBAQAogCWRpLT5tc2dfbGV2ZWwgPSBtc2dfbGV2ZWwgPyBtc2dfbGV2ZWwgOiAmZG1hX21zZ19sZXZlbDsKIAogCi0JZGktPmRtYTY0ID0gKChhaV9jb3JlX3NmbGFncyhzaWgsIDAsIDApICYgU0lTRl9ETUE2NCkgPT0gU0lTRl9ETUE2NCk7CisJZGktPmRtYTY0ID0KKwkJKChiY21hX2FyZWFkMzIoY29yZSwgQkNNQV9JT1NUKSAmIFNJU0ZfRE1BNjQpID09IFNJU0ZfRE1BNjQpOwogCi0JLyogaW5pdCBkbWEgcmVnIHBvaW50ZXIgKi8KLQlkaS0+ZDY0dHhyZWdzID0gKHN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqKSBkbWFyZWdzdHg7Ci0JZGktPmQ2NHJ4cmVncyA9IChzdHJ1Y3QgZG1hNjRyZWdzIF9faW9tZW0gKikgZG1hcmVnc3J4OworCS8qIGluaXQgZG1hIHJlZyBpbmZvICovCisJZGktPmNvcmUgPSBjb3JlOworCWRpLT5kNjR0eHJlZ2Jhc2UgPSB0eHJlZ2Jhc2U7CisJZGktPmQ2NHJ4cmVnYmFzZSA9IHJ4cmVnYmFzZTsKIAogCS8qCiAJICogRGVmYXVsdCBmbGFncyAod2hpY2ggY2FuIGJlIGNoYW5nZWQgYnkgdGhlIGRyaXZlciBjYWxsaW5nCkBAIC01ODMsMTcgKzU5NywxNyBAQAogCSAqLwogCV9kbWFfY3RybGZsYWdzKGRpLCBETUFfQ1RSTF9ST0MgfCBETUFfQ1RSTF9QRU4sIDApOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9hdHRhY2g6ICVzIGZsYWdzIDB4JXggbnR4ZCAlZCBucnhkICVkICIKLQkJICAgInJ4YnVmc2l6ZSAlZCByeGV4dGhlYWRyb29tICVkIG5yeHBvc3QgJWQgcnhvZmZzZXQgJWQgIgotCQkgICAiZG1hcmVnc3R4ICVwIGRtYXJlZ3NyeCAlcFxuIiwgbmFtZSwgIkRNQTY0IiwKLQkJICAgZGktPmRtYS5kbWFjdHJsZmxhZ3MsIG50eGQsIG5yeGQsIHJ4YnVmc2l6ZSwKLQkJICAgcnhleHRoZWFkcm9vbSwgbnJ4cG9zdCwgcnhvZmZzZXQsIGRtYXJlZ3N0eCwgZG1hcmVnc3J4KSk7CisJRE1BX1RSQUNFKCIlczogJXMgZmxhZ3MgMHgleCBudHhkICVkIG5yeGQgJWQgIgorCQkgICJyeGJ1ZnNpemUgJWQgcnhleHRoZWFkcm9vbSAlZCBucnhwb3N0ICVkIHJ4b2Zmc2V0ICVkICIKKwkJICAidHhyZWdiYXNlICV1IHJ4cmVnYmFzZSAldVxuIiwgbmFtZSwgIkRNQTY0IiwKKwkJICBkaS0+ZG1hLmRtYWN0cmxmbGFncywgbnR4ZCwgbnJ4ZCwgcnhidWZzaXplLAorCQkgIHJ4ZXh0aGVhZHJvb20sIG5yeHBvc3QsIHJ4b2Zmc2V0LCB0eHJlZ2Jhc2UsIHJ4cmVnYmFzZSk7CiAKIAkvKiBtYWtlIGEgcHJpdmF0ZSBjb3B5IG9mIG91ciBjYWxsZXJzIG5hbWUgKi8KIAlzdHJuY3B5KGRpLT5uYW1lLCBuYW1lLCBNQVhOQU1FTCk7CiAJZGktPm5hbWVbTUFYTkFNRUwgLSAxXSA9ICdcMCc7CiAKLQlkaS0+cGJ1cyA9ICgoc3RydWN0IHNpX2luZm8gKilzaWgpLT5wYnVzOworCWRpLT5kbWFkZXYgPSBjb3JlLT5kbWFfZGV2OwogCiAJLyogc2F2ZSB0dW5hYmxlcyAqLwogCWRpLT5udHhkID0gKHUxNikgbnR4ZDsKQEAgLTYyNSwxMSArNjM5LDExIEBACiAJZGktPmRhdGFvZmZzZXRsb3cgPSBkaS0+ZGRvZmZzZXRsb3c7CiAJZGktPmRhdGFvZmZzZXRoaWdoID0gZGktPmRkb2Zmc2V0aGlnaDsKIAkvKiBXQVI2NDQ1MCA6IERNQUN0bC5BZGRyIGV4dCBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gU0RJT0QgY29yZS4gKi8KLQlpZiAoKGFpX2NvcmVpZChzaWgpID09IFNESU9EX0NPUkVfSUQpCi0JICAgICYmICgoYWlfY29yZXJldihzaWgpID4gMCkgJiYgKGFpX2NvcmVyZXYoc2loKSA8PSAyKSkpCisJaWYgKChjb3JlLT5pZC5pZCA9PSBTRElPRF9DT1JFX0lEKQorCSAgICAmJiAoKHJldiA+IDApICYmIChyZXYgPD0gMikpKQogCQlkaS0+YWRkcmV4dCA9IDA7Ci0JZWxzZSBpZiAoKGFpX2NvcmVpZChzaWgpID09IEkyU19DT1JFX0lEKSAmJgotCQkgKChhaV9jb3JlcmV2KHNpaCkgPT0gMCkgfHwgKGFpX2NvcmVyZXYoc2loKSA9PSAxKSkpCisJZWxzZSBpZiAoKGNvcmUtPmlkLmlkID09IEkyU19DT1JFX0lEKSAmJgorCQkgKChyZXYgPT0gMCkgfHwgKHJldiA9PSAxKSkpCiAJCWRpLT5hZGRyZXh0ID0gMDsKIAllbHNlCiAJCWRpLT5hZGRyZXh0ID0gX2RtYV9pc2FkZHJleHQoZGkpOwpAQCAtNjQ1LDggKzY1OSw4IEBACiAJCWRpLT5kbWFkZXNjX2FsaWduID0gNDsJLyogMTYgYnl0ZSBhbGlnbm1lbnQgKi8KIAl9CiAKLQlETUFfTk9ORSgoIkRNQSBkZXNjcmlwdG9yIGFsaWduX25lZWRlZCAlZCwgYWxpZ24gJWRcbiIsCi0JCSAgZGktPmFsaWduZGVzY180aywgZGktPmRtYWRlc2NfYWxpZ24pKTsKKwlETUFfTk9ORSgiRE1BIGRlc2NyaXB0b3IgYWxpZ25fbmVlZGVkICVkLCBhbGlnbiAlZFxuIiwKKwkJIGRpLT5hbGlnbmRlc2NfNGssIGRpLT5kbWFkZXNjX2FsaWduKTsKIAogCS8qIGFsbG9jYXRlIHR4IHBhY2tldCBwb2ludGVyIHZlY3RvciAqLwogCWlmIChudHhkKSB7CkBAIC02ODQsMjEgKzY5OCwyMSBAQAogCiAJaWYgKChkaS0+ZGRvZmZzZXRsb3cgIT0gMCkgJiYgIWRpLT5hZGRyZXh0KSB7CiAJCWlmIChkaS0+dHhkcGEgPiBTSV9QQ0lfRE1BX1NaKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hX2F0dGFjaDogdHhkcGEgMHgleDogYWRkcmV4dCBub3QgIgotCQkJCSAgICJzdXBwb3J0ZWRcbiIsIGRpLT5uYW1lLCAodTMyKWRpLT50eGRwYSkpOworCQkJRE1BX0VSUk9SKCIlczogdHhkcGEgMHgleDogYWRkcmV4dCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCSAgZGktPm5hbWUsICh1MzIpZGktPnR4ZHBhKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQlpZiAoZGktPnJ4ZHBhID4gU0lfUENJX0RNQV9TWikgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9hdHRhY2g6IHJ4ZHBhIDB4JXg6IGFkZHJleHQgbm90ICIKLQkJCQkgICAic3VwcG9ydGVkXG4iLCBkaS0+bmFtZSwgKHUzMilkaS0+cnhkcGEpKTsKKwkJCURNQV9FUlJPUigiJXM6IHJ4ZHBhIDB4JXg6IGFkZHJleHQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkgIGRpLT5uYW1lLCAodTMyKWRpLT5yeGRwYSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAl9CiAKLQlETUFfVFJBQ0UoKCJkZG9mZnNldGxvdyAweCV4IGRkb2Zmc2V0aGlnaCAweCV4IGRhdGFvZmZzZXRsb3cgMHgleCAiCi0JCSAgICJkYXRhb2Zmc2V0aGlnaCAiICIweCV4IGFkZHJleHQgJWRcbiIsIGRpLT5kZG9mZnNldGxvdywKLQkJICAgZGktPmRkb2Zmc2V0aGlnaCwgZGktPmRhdGFvZmZzZXRsb3csIGRpLT5kYXRhb2Zmc2V0aGlnaCwKLQkJICAgZGktPmFkZHJleHQpKTsKKwlETUFfVFJBQ0UoImRkb2Zmc2V0bG93IDB4JXggZGRvZmZzZXRoaWdoIDB4JXggZGF0YW9mZnNldGxvdyAweCV4IGRhdGFvZmZzZXRoaWdoIDB4JXggYWRkcmV4dCAlZFxuIiwKKwkJICBkaS0+ZGRvZmZzZXRsb3csIGRpLT5kZG9mZnNldGhpZ2gsCisJCSAgZGktPmRhdGFvZmZzZXRsb3csIGRpLT5kYXRhb2Zmc2V0aGlnaCwKKwkJICBkaS0+YWRkcmV4dCk7CiAKIAlyZXR1cm4gKHN0cnVjdCBkbWFfcHViICopIGRpOwogCkBAIC03NDQsMTcgKzc1OCwxNyBAQAogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9kZXRhY2hcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCS8qIGZyZWUgZG1hIGRlc2NyaXB0b3IgcmluZ3MgKi8KIAlpZiAoZGktPnR4ZDY0KQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRpLT5wYnVzLCBkaS0+dHhkYWxsb2MsCi0JCQkJICAgICgoczggKilkaS0+dHhkNjQgLSBkaS0+dHhkYWxpZ24pLAotCQkJCSAgICAoZGktPnR4ZHBhb3JpZykpOworCQlkbWFfZnJlZV9jb2hlcmVudChkaS0+ZG1hZGV2LCBkaS0+dHhkYWxsb2MsCisJCQkJICAoKHM4ICopZGktPnR4ZDY0IC0gZGktPnR4ZGFsaWduKSwKKwkJCQkgIChkaS0+dHhkcGFvcmlnKSk7CiAJaWYgKGRpLT5yeGQ2NCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkaS0+cGJ1cywgZGktPnJ4ZGFsbG9jLAotCQkJCSAgICAoKHM4ICopZGktPnJ4ZDY0IC0gZGktPnJ4ZGFsaWduKSwKLQkJCQkgICAgKGRpLT5yeGRwYW9yaWcpKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGktPmRtYWRldiwgZGktPnJ4ZGFsbG9jLAorCQkJCSAgKChzOCAqKWRpLT5yeGQ2NCAtIGRpLT5yeGRhbGlnbiksCisJCQkJICAoZGktPnJ4ZHBhb3JpZykpOwogCiAJLyogZnJlZSBwYWNrZXQgcG9pbnRlciB2ZWN0b3JzICovCiAJa2ZyZWUoZGktPnR4cCk7CkBAIC03NzksMTEgKzc5MywxNSBAQAogCWlmICgoZGktPmRkb2Zmc2V0bG93ID09IDApCiAJICAgIHx8ICEocGEgJiBQQ0kzMkFERFJfSElHSCkpIHsKIAkJaWYgKGRpcmVjdGlvbiA9PSBETUFfVFgpIHsKLQkJCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5hZGRybG93LCBwYSArIGRpLT5kZG9mZnNldGxvdyk7Ci0JCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmhpZ2gsIGRpLT5kZG9mZnNldGhpZ2gpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgYWRkcmxvdyksCisJCQkJICAgICBwYSArIGRpLT5kZG9mZnNldGxvdyk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBhZGRyaGlnaCksCisJCQkJICAgICBkaS0+ZGRvZmZzZXRoaWdoKTsKIAkJfSBlbHNlIHsKLQkJCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRybG93LCBwYSArIGRpLT5kZG9mZnNldGxvdyk7Ci0JCQlXX1JFRygmZGktPmQ2NHJ4cmVncy0+YWRkcmhpZ2gsIGRpLT5kZG9mZnNldGhpZ2gpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgYWRkcmxvdyksCisJCQkJICAgICBwYSArIGRpLT5kZG9mZnNldGxvdyk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBhZGRyaGlnaCksCisJCQkJICAgICBkaS0+ZGRvZmZzZXRoaWdoKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIERNQTY0IDMyYml0cyBhZGRyZXNzIGV4dGVuc2lvbiAqLwpAQCAtNzk0LDE1ICs4MTIsMTkgQEAKIAkJcGEgJj0gflBDSTMyQUREUl9ISUdIOwogCiAJCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKSB7Ci0JCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdywgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJoaWdoLCBkaS0+ZGRvZmZzZXRoaWdoKTsKLQkJCVNFVF9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsCi0JCQkJRDY0X1hDX0FFLCAoYWUgPDwgRDY0X1hDX0FFX1NISUZUKSk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBhZGRybG93KSwKKwkJCQkgICAgIHBhICsgZGktPmRkb2Zmc2V0bG93KTsKKwkJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGFkZHJoaWdoKSwKKwkJCQkgICAgIGRpLT5kZG9mZnNldGhpZ2gpOworCQkJYmNtYV9tYXNrc2V0MzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSwKKwkJCQkgICAgICAgRDY0X1hDX0FFLCAoYWUgPDwgRDY0X1hDX0FFX1NISUZUKSk7CiAJCX0gZWxzZSB7Ci0JCQlXX1JFRygmZGktPmQ2NHJ4cmVncy0+YWRkcmxvdywgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOwotCQkJV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJoaWdoLCBkaS0+ZGRvZmZzZXRoaWdoKTsKLQkJCVNFVF9SRUcoJmRpLT5kNjRyeHJlZ3MtPmNvbnRyb2wsCi0JCQkJRDY0X1JDX0FFLCAoYWUgPDwgRDY0X1JDX0FFX1NISUZUKSk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBhZGRybG93KSwKKwkJCQkgICAgIHBhICsgZGktPmRkb2Zmc2V0bG93KTsKKwkJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIGFkZHJoaWdoKSwKKwkJCQkgICAgIGRpLT5kZG9mZnNldGhpZ2gpOworCQkJYmNtYV9tYXNrc2V0MzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBjb250cm9sKSwKKwkJCQkgICAgICAgRDY0X1JDX0FFLCAoYWUgPDwgRDY0X1JDX0FFX1NISUZUKSk7CiAJCX0KIAl9CiB9CkBAIC04MTIsMTEgKzgzNCwxMSBAQAogCXVpbnQgZG1hY3RybGZsYWdzID0gZGktPmRtYS5kbWFjdHJsZmxhZ3M7CiAJdTMyIGNvbnRyb2w7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4ZW5hYmxlXG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKLQljb250cm9sID0KLQkgICAgKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sKSAmIEQ2NF9SQ19BRSkgfAotCSAgICBENjRfUkNfUkU7CisJY29udHJvbCA9IEQ2NF9SQ19SRSB8IChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCQkJICAgRE1BNjRSWFJFR09GRlMoZGksIGNvbnRyb2wpKSAmCisJCQkgICAgICAgRDY0X1JDX0FFKTsKIAogCWlmICgoZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSA9PSAwKQogCQljb250cm9sIHw9IEQ2NF9SQ19QRDsKQEAgLTgyNCw3ICs4NDYsNyBAQAogCWlmIChkbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9ST0MpCiAJCWNvbnRyb2wgfD0gRDY0X1JDX09DOwogCi0JV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmNvbnRyb2wsCisJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgY29udHJvbCksCiAJCSgoZGktPnJ4b2Zmc2V0IDw8IEQ2NF9SQ19ST19TSElGVCkgfCBjb250cm9sKSk7CiB9CiAKQEAgLTgzMiw3ICs4NTQsNyBAQAogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGluaXRcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnJ4ZCA9PSAwKQogCQlyZXR1cm47CkBAIC04NjcsNyArODg5LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljdXJyID0KLQkgICAgQjJJKCgoUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnN0YXR1czApICYgRDY0X1JTMF9DRF9NQVNLKSAtCisJICAgIEIySSgoKGJjbWFfcmVhZDMyKGRpLT5jb3JlLAorCQkJICAgICAgRE1BNjRSWFJFR09GRlMoZGksIHN0YXR1czApKSAmIEQ2NF9SUzBfQ0RfTUFTSykgLQogCQkgZGktPnJjdnB0cmJhc2UpICYgRDY0X1JTMF9DRF9NQVNLLCBzdHJ1Y3QgZG1hNjRkZXNjKTsKIAogCS8qIGlnbm9yZSBjdXJyIGlmIGZvcmNlYWxsICovCkBAIC04ODEsNyArOTA0LDcgQEAKIAlwYSA9IGxlMzJfdG9fY3B1KGRpLT5yeGQ2NFtpXS5hZGRybG93KSAtIGRpLT5kYXRhb2Zmc2V0bG93OwogCiAJLyogY2xlYXIgdGhpcyBwYWNrZXQgZnJvbSB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JcGNpX3VubWFwX3NpbmdsZShkaS0+cGJ1cywgcGEsIGRpLT5yeGJ1ZnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZG1hX3VubWFwX3NpbmdsZShkaS0+ZG1hZGV2LCBwYSwgZGktPnJ4YnVmc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAogCWRpLT5yeGQ2NFtpXS5hZGRybG93ID0gY3B1X3RvX2xlMzIoMHhkZWFkYmVlZik7CiAJZGktPnJ4ZDY0W2ldLmFkZHJoaWdoID0gY3B1X3RvX2xlMzIoMHhkZWFkYmVlZik7CkBAIC05MjYsNyArOTQ5LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlsZW4gPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAocC0+ZGF0YSkpOwotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnggbGVuICVkXG4iLCBkaS0+bmFtZSwgbGVuKSk7CisJRE1BX1RSQUNFKCIlczogZG1hX3J4IGxlbiAlZFxuIiwgZGktPm5hbWUsIGxlbik7CiAJZG1hX3NwaW5fZm9yX2xlbihsZW4sIHApOwogCiAJLyogc2V0IGFjdHVhbCBsZW5ndGggKi8KQEAgLTk0OSwxOCArOTcyLDE4IEBACiAJCWlmIChyZXNpZCA+IDApIHsKIAkJCXVpbnQgY3VyOwogCQkJY3VyID0KLQkJCSAgICBCMkkoKChSX1JFRygmZGktPmQ2NHJ4cmVncy0+c3RhdHVzMCkgJgotCQkJCSAgRDY0X1JTMF9DRF9NQVNLKSAtCi0JCQkJIGRpLT5yY3ZwdHJiYXNlKSAmIEQ2NF9SUzBfQ0RfTUFTSywKLQkJCQlzdHJ1Y3QgZG1hNjRkZXNjKTsKLQkJCURNQV9FUlJPUigoImRtYV9yeCwgcnhpbiAlZCByeG91dCAlZCwgaHdfY3VyciAlZFxuIiwKLQkJCQkgICBkaS0+cnhpbiwgZGktPnJ4b3V0LCBjdXIpKTsKKwkJCSAgICBCMkkoKChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCQkJICAgICAgRE1BNjRSWFJFR09GRlMoZGksIHN0YXR1czApKSAmCisJCQkJICBENjRfUlMwX0NEX01BU0spIC0gZGktPnJjdnB0cmJhc2UpICYKKwkJCQlENjRfUlMwX0NEX01BU0ssIHN0cnVjdCBkbWE2NGRlc2MpOworCQkJRE1BX0VSUk9SKCJyeGluICVkIHJ4b3V0ICVkLCBod19jdXJyICVkXG4iLAorCQkJCSAgIGRpLT5yeGluLCBkaS0+cnhvdXQsIGN1cik7CiAJCX0KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAogCQlpZiAoKGRpLT5kbWEuZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUlhNVUxUSSkgPT0gMCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9yeDogYmFkIGZyYW1lIGxlbmd0aCAoJWQpXG4iLAotCQkJCSAgIGRpLT5uYW1lLCBsZW4pKTsKKwkJCURNQV9FUlJPUigiJXM6IGJhZCBmcmFtZSBsZW5ndGggKCVkKVxuIiwKKwkJCQkgIGRpLT5uYW1lLCBsZW4pOwogCQkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmZG1hX2ZyYW1lcywgcCwgbmV4dCkgewogCQkJCXNrYl91bmxpbmsocCwgJmRtYV9mcmFtZXMpOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7CkBAIC05NzcsMTMgKzEwMDAsMTUgQEAKIAogc3RhdGljIGJvb2wgZG1hNjRfcnhpZGxlKHN0cnVjdCBkbWFfaW5mbyAqZGkpCiB7Ci0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGlkbGVcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnJ4ZCA9PSAwKQogCQlyZXR1cm4gdHJ1ZTsKIAotCXJldHVybiAoKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9SUzBfQ0RfTUFTSykgPT0KLQkJKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5wdHIpICYgRDY0X1JTMF9DRF9NQVNLKSk7CisJcmV0dXJuICgoYmNtYV9yZWFkMzIoZGktPmNvcmUsCisJCQkgICAgIERNQTY0UlhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJiBENjRfUlMwX0NEX01BU0spID09CisJCShiY21hX3JlYWQzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIHB0cikpICYKKwkJIEQ2NF9SUzBfQ0RfTUFTSykpOwogfQogCiAvKgpAQCAtMTAxNyw3ICsxMDQyLDcgQEAKIAogCW4gPSBkaS0+bnJ4cG9zdCAtIG5yeGRhY3RpdmUoZGksIHJ4aW4sIHJ4b3V0KTsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhmaWxsOiBwb3N0ICVkXG4iLCBkaS0+bmFtZSwgbikpOworCURNQV9UUkFDRSgiJXM6IHBvc3QgJWRcbiIsIGRpLT5uYW1lLCBuKTsKIAogCWlmIChkaS0+cnhidWZzaXplID4gQkNNRVhUUkFIRFJPT00pCiAJCWV4dHJhX29mZnNldCA9IGRpLT5yeGV4dHJhaGRycm9vbTsKQEAgLTEwMzAsMTEgKzEwNTUsOSBAQAogCQlwID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKGRpLT5yeGJ1ZnNpemUgKyBleHRyYV9vZmZzZXQpOwogCiAJCWlmIChwID09IE5VTEwpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfcnhmaWxsOiBvdXQgb2YgcnhidWZzXG4iLAotCQkJCSAgIGRpLT5uYW1lKSk7CisJCQlETUFfRVJST1IoIiVzOiBvdXQgb2YgcnhidWZzXG4iLCBkaS0+bmFtZSk7CiAJCQlpZiAoaSA9PSAwICYmIGRtYTY0X3J4aWRsZShkaSkpIHsKLQkJCQlETUFfRVJST1IoKCIlczogcnhmaWxsNjQ6IHJpbmcgaXMgZW1wdHkgIVxuIiwKLQkJCQkJICAgZGktPm5hbWUpKTsKKwkJCQlETUFfRVJST1IoIiVzOiByaW5nIGlzIGVtcHR5ICFcbiIsIGRpLT5uYW1lKTsKIAkJCQlyaW5nX2VtcHR5ID0gdHJ1ZTsKIAkJCX0KIAkJCWRpLT5kbWEucnhub2J1ZisrOwpAQCAtMTA0OSw4ICsxMDcyLDggQEAKIAkJICovCiAJCSoodTMyICopIChwLT5kYXRhKSA9IDA7CiAKLQkJcGEgPSBwY2lfbWFwX3NpbmdsZShkaS0+cGJ1cywgcC0+ZGF0YSwKLQkJCWRpLT5yeGJ1ZnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXBhID0gZG1hX21hcF9zaW5nbGUoZGktPmRtYWRldiwgcC0+ZGF0YSwgZGktPnJ4YnVmc2l6ZSwKKwkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKIAogCQkvKiBzYXZlIHRoZSBmcmVlIHBhY2tldCBwb2ludGVyICovCiAJCWRpLT5yeHBbcnhvdXRdID0gcDsKQEAgLTEwNjgsNyArMTA5MSw3IEBACiAJZGktPnJ4b3V0ID0gcnhvdXQ7CiAKIAkvKiB1cGRhdGUgdGhlIGNoaXAgbGFzdGRzY3IgcG9pbnRlciAqLwotCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5wdHIsCisJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgcHRyKSwKIAkgICAgICBkaS0+cmN2cHRyYmFzZSArIEkyQihyeG91dCwgc3RydWN0IGRtYTY0ZGVzYykpOwogCiAJcmV0dXJuIHJpbmdfZW1wdHk7CkBAIC0xMDc5LDcgKzExMDIsNyBAQAogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCXN0cnVjdCBza19idWZmICpwOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeHJlY2xhaW1cbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCXdoaWxlICgocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgdHJ1ZSkpKQogCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOwpAQCAtMTExMCw3ICsxMTMzLDcgQEAKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAl1MzIgY29udHJvbCA9IEQ2NF9YQ19YRTsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhpbml0XG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMTEyOSw3ICsxMTUyLDcgQEAKIAogCWlmICgoZGktPmRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9QRU4pID09IDApCiAJCWNvbnRyb2wgfD0gRDY0X1hDX1BEOwotCU9SX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCwgY29udHJvbCk7CisJYmNtYV9zZXQzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLCBjb250cm9sKTsKIAogCS8qIERNQSBlbmdpbmUgd2l0aCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCiAJICogYmVmb3JlIGVuYWJsaW5nIHRoZSBlbmdpbmUKQEAgLTExNDIsMjQgKzExNjUsMjQgQEAKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhzdXNwZW5kXG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuOwogCi0JT1JfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCBENjRfWENfU0UpOworCWJjbWFfc2V0MzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSwgRDY0X1hDX1NFKTsKIH0KIAogdm9pZCBkbWFfdHhyZXN1bWUoc3RydWN0IGRtYV9wdWIgKnB1YikKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhyZXN1bWVcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnR4ZCA9PSAwKQogCQlyZXR1cm47CiAKLQlBTkRfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCB+RDY0X1hDX1NFKTsKKwliY21hX21hc2szMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLCB+RDY0X1hDX1NFKTsKIH0KIAogYm9vbCBkbWFfdHhzdXNwZW5kZWQoc3RydWN0IGRtYV9wdWIgKnB1YikKQEAgLTExNjcsOCArMTE5MCw5IEBACiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7CiAKIAlyZXR1cm4gKGRpLT5udHhkID09IDApIHx8Ci0JICAgICgoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wpICYgRDY0X1hDX1NFKSA9PQotCSAgICAgRDY0X1hDX1NFKTsKKwkgICAgICAgKChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCSAgICAgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpKSAmIEQ2NF9YQ19TRSkgPT0KKwkJRDY0X1hDX1NFKTsKIH0KIAogdm9pZCBkbWFfdHhyZWNsYWltKHN0cnVjdCBkbWFfcHViICpwdWIsIGVudW0gdHhkX3JhbmdlIHJhbmdlKQpAQCAtMTE3NiwxMSArMTIwMCwxMSBAQAogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCXN0cnVjdCBza19idWZmICpwOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eHJlY2xhaW0gJXNcbiIsIGRpLT5uYW1lLAotCQkgICAocmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCkgPyAiYWxsIiA6Ci0JCSAgICgocmFuZ2UgPT0KLQkJICAgICBETUFfUkFOR0VfVFJBTlNNSVRURUQpID8gInRyYW5zbWl0dGVkIiA6Ci0JCSAgICAidHJhbnNmZXJyZWQiKSkpOworCURNQV9UUkFDRSgiJXM6ICVzXG4iLAorCQkgIGRpLT5uYW1lLAorCQkgIHJhbmdlID09IERNQV9SQU5HRV9BTEwgPyAiYWxsIiA6CisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX1RSQU5TTUlUVEVEID8gInRyYW5zbWl0dGVkIiA6CisJCSAgInRyYW5zZmVycmVkIik7CiAKIAlpZiAoZGktPnR4aW4gPT0gZGktPnR4b3V0KQogCQlyZXR1cm47CkBAIC0xMjAxLDE2ICsxMjI1LDE3IEBACiAJCXJldHVybiB0cnVlOwogCiAJLyogc3VzcGVuZCB0eCBETUEgZmlyc3QgKi8KLQlXX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCwgRDY0X1hDX1NFKTsKKwliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSwgRDY0X1hDX1NFKTsKIAlTUElOV0FJVCgoKHN0YXR1cyA9Ci0JCSAgIChSX1JFRygmZGktPmQ2NHR4cmVncy0+c3RhdHVzMCkgJiBENjRfWFMwX1hTX01BU0spKQotCQkgICE9IEQ2NF9YUzBfWFNfRElTQUJMRUQpICYmIChzdGF0dXMgIT0gRDY0X1hTMF9YU19JRExFKQotCQkgJiYgKHN0YXR1cyAhPSBENjRfWFMwX1hTX1NUT1BQRUQpLCAxMDAwMCk7CisJCSAgIChiY21hX3JlYWQzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIHN0YXR1czApKSAmCisJCSAgICBENjRfWFMwX1hTX01BU0spKSAhPSBENjRfWFMwX1hTX0RJU0FCTEVEKSAmJgorCQkgIChzdGF0dXMgIT0gRDY0X1hTMF9YU19JRExFKSAmJiAoc3RhdHVzICE9IEQ2NF9YUzBfWFNfU1RPUFBFRCksCisJCSAxMDAwMCk7CiAKLQlXX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCwgMCk7CisJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCksIDApOwogCVNQSU5XQUlUKCgoc3RhdHVzID0KLQkJICAgKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9YUzBfWFNfTUFTSykpCi0JCSAgIT0gRDY0X1hTMF9YU19ESVNBQkxFRCksIDEwMDAwKTsKKwkJICAgKGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgc3RhdHVzMCkpICYKKwkJICAgIEQ2NF9YUzBfWFNfTUFTSykpICE9IEQ2NF9YUzBfWFNfRElTQUJMRUQpLCAxMDAwMCk7CiAKIAkvKiB3YWl0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZSAqLwogCXVkZWxheSgzMDApOwpAQCAtMTIyNiwxMCArMTI1MSwxMCBAQAogCWlmIChkaS0+bnJ4ZCA9PSAwKQogCQlyZXR1cm4gdHJ1ZTsKIAotCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sLCAwKTsKKwliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBjb250cm9sKSwgMCk7CiAJU1BJTldBSVQoKChzdGF0dXMgPQotCQkgICAoUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnN0YXR1czApICYgRDY0X1JTMF9SU19NQVNLKSkKLQkJICAhPSBENjRfUlMwX1JTX0RJU0FCTEVEKSwgMTAwMDApOworCQkgICAoYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJgorCQkgICAgRDY0X1JTMF9SU19NQVNLKSkgIT0gRDY0X1JTMF9SU19ESVNBQkxFRCksIDEwMDAwKTsKIAogCXJldHVybiBzdGF0dXMgPT0gRDY0X1JTMF9SU19ESVNBQkxFRDsKIH0KQEAgLTEyNDAsNzIgKzEyNjUsNTggQEAKICAqICAgdGhlIGVycm9yKHRvc3MgZnJhbWVzKSBjb3VsZCBiZSBmYXRhbCBhbmQgY2F1c2UgbWFueSBzdWJzZXF1ZW50IGhhcmQKICAqICAgdG8gZGVidWcgcHJvYmxlbXMKICAqLwotaW50IGRtYV90eGZhc3Qoc3RydWN0IGRtYV9wdWIgKnB1Yiwgc3RydWN0IHNrX2J1ZmYgKnAwLCBib29sIGNvbW1pdCkKK2ludCBkbWFfdHhmYXN0KHN0cnVjdCBkbWFfcHViICpwdWIsIHN0cnVjdCBza19idWZmICpwLCBib29sIGNvbW1pdCkKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKm5leHQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAl1aW50IGxlbjsKIAl1MTYgdHhvdXQ7CiAJdTMyIGZsYWdzID0gMDsKIAlkbWFfYWRkcl90IHBhOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eGZhc3RcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCXR4b3V0ID0gZGktPnR4b3V0OwogCiAJLyoKLQkgKiBXYWxrIHRoZSBjaGFpbiBvZiBwYWNrZXQgYnVmZmVycwotCSAqIGFsbG9jYXRpbmcgYW5kIGluaXRpYWxpemluZyB0cmFuc21pdCBkZXNjcmlwdG9yIGVudHJpZXMuCisJICogb2J0YWluIGFuZCBpbml0aWFsaXplIHRyYW5zbWl0IGRlc2NyaXB0b3IgZW50cnkuCiAJICovCi0JZm9yIChwID0gcDA7IHA7IHAgPSBuZXh0KSB7Ci0JCWRhdGEgPSBwLT5kYXRhOwotCQlsZW4gPSBwLT5sZW47Ci0JCW5leHQgPSBwLT5uZXh0OworCWRhdGEgPSBwLT5kYXRhOworCWxlbiA9IHAtPmxlbjsKIAotCQkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KLQkJaWYgKG5leHR0eGQoZGksIHR4b3V0KSA9PSBkaS0+dHhpbikKLQkJCWdvdG8gb3V0b2Z0eGQ7CisJLyogbm8gdXNlIHRvIHRyYW5zbWl0IGEgemVybyBsZW5ndGggcGFja2V0ICovCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKIAotCQlpZiAobGVuID09IDApCi0JCQljb250aW51ZTsKKwkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KKwlpZiAobmV4dHR4ZChkaSwgdHhvdXQpID09IGRpLT50eGluKQorCQlnb3RvIG91dG9mdHhkOwogCi0JCS8qIGdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlciBzdGFydCAqLwotCQlwYSA9IHBjaV9tYXBfc2luZ2xlKGRpLT5wYnVzLCBkYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCS8qIGdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlciBzdGFydCAqLworCXBhID0gZG1hX21hcF9zaW5nbGUoZGktPmRtYWRldiwgZGF0YSwgbGVuLCBETUFfVE9fREVWSUNFKTsKIAotCQlmbGFncyA9IDA7Ci0JCWlmIChwID09IHAwKQotCQkJZmxhZ3MgfD0gRDY0X0NUUkwxX1NPRjsKKwkvKiBXaXRoIGEgRE1BIHNlZ21lbnQgbGlzdCwgRGVzY3JpcHRvciB0YWJsZSBpcyBmaWxsZWQKKwkgKiB1c2luZyB0aGUgc2VnbWVudCBsaXN0IGluc3RlYWQgb2YgbG9vcGluZyBvdmVyCisJICogYnVmZmVycyBpbiBtdWx0aS1jaGFpbiBETUEuIFRoZXJlZm9yZSwgRU9GIGZvciBTR0xJU1QKKwkgKiBpcyB3aGVuIGVuZCBvZiBzZWdtZW50IGxpc3QgaXMgcmVhY2hlZC4KKwkgKi8KKwlmbGFncyA9IEQ2NF9DVFJMMV9TT0YgfCBENjRfQ1RSTDFfSU9DIHwgRDY0X0NUUkwxX0VPRjsKKwlpZiAodHhvdXQgPT0gKGRpLT5udHhkIC0gMSkpCisJCWZsYWdzIHw9IEQ2NF9DVFJMMV9FT1Q7CiAKLQkJLyogV2l0aCBhIERNQSBzZWdtZW50IGxpc3QsIERlc2NyaXB0b3IgdGFibGUgaXMgZmlsbGVkCi0JCSAqIHVzaW5nIHRoZSBzZWdtZW50IGxpc3QgaW5zdGVhZCBvZiBsb29waW5nIG92ZXIKLQkJICogYnVmZmVycyBpbiBtdWx0aS1jaGFpbiBETUEuIFRoZXJlZm9yZSwgRU9GIGZvciBTR0xJU1QKLQkJICogaXMgd2hlbiBlbmQgb2Ygc2VnbWVudCBsaXN0IGlzIHJlYWNoZWQuCi0JCSAqLwotCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJZmxhZ3MgfD0gKEQ2NF9DVFJMMV9JT0MgfCBENjRfQ1RSTDFfRU9GKTsKLQkJaWYgKHR4b3V0ID09IChkaS0+bnR4ZCAtIDEpKQotCQkJZmxhZ3MgfD0gRDY0X0NUUkwxX0VPVDsKKwlkbWE2NF9kZF91cGQoZGksIGRpLT50eGQ2NCwgcGEsIHR4b3V0LCAmZmxhZ3MsIGxlbik7CiAKLQkJZG1hNjRfZGRfdXBkKGRpLCBkaS0+dHhkNjQsIHBhLCB0eG91dCwgJmZsYWdzLCBsZW4pOwotCi0JCXR4b3V0ID0gbmV4dHR4ZChkaSwgdHhvdXQpOwotCX0KLQotCS8qIGlmIGxhc3QgdHhkIGVvZiBub3Qgc2V0LCBmaXggaXQgKi8KLQlpZiAoIShmbGFncyAmIEQ2NF9DVFJMMV9FT0YpKQotCQlkaS0+dHhkNjRbcHJldnR4ZChkaSwgdHhvdXQpXS5jdHJsMSA9Ci0JCSAgICAgY3B1X3RvX2xlMzIoZmxhZ3MgfCBENjRfQ1RSTDFfSU9DIHwgRDY0X0NUUkwxX0VPRik7CisJdHhvdXQgPSBuZXh0dHhkKGRpLCB0eG91dCk7CiAKIAkvKiBzYXZlIHRoZSBwYWNrZXQgKi8KLQlkaS0+dHhwW3ByZXZ0eGQoZGksIHR4b3V0KV0gPSBwMDsKKwlkaS0+dHhwW3ByZXZ0eGQoZGksIHR4b3V0KV0gPSBwOwogCiAJLyogYnVtcCB0aGUgdHggZGVzY3JpcHRvciBpbmRleCAqLwogCWRpLT50eG91dCA9IHR4b3V0OwogCiAJLyoga2ljayB0aGUgY2hpcCAqLwogCWlmIChjb21taXQpCi0JCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5wdHIsCisJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIHB0ciksCiAJCSAgICAgIGRpLT54bXRwdHJiYXNlICsgSTJCKHR4b3V0LCBzdHJ1Y3QgZG1hNjRkZXNjKSk7CiAKIAkvKiB0eCBmbG93IGNvbnRyb2wgKi8KQEAgLTEzMTQsOCArMTMyNSw4IEBACiAJcmV0dXJuIDA7CiAKICBvdXRvZnR4ZDoKLQlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHMgISEhXG4iLCBkaS0+bmFtZSkpOwotCWJyY211X3BrdF9idWZfZnJlZV9za2IocDApOworCURNQV9FUlJPUigiJXM6IG91dCBvZiB0eGRzICEhIVxuIiwgZGktPm5hbWUpOworCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7CiAJZGktPmRtYS50eGF2YWlsID0gMDsKIAlkaS0+ZG1hLnR4bm9idWYrKzsKIAlyZXR1cm4gLTE7CkBAIC0xMzM4LDExICsxMzQ5LDExIEBACiAJdTE2IGFjdGl2ZV9kZXNjOwogCXN0cnVjdCBza19idWZmICp0eHA7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX2dldG5leHR0eHAgJXNcbiIsIGRpLT5uYW1lLAotCQkgICAocmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCkgPyAiYWxsIiA6Ci0JCSAgICgocmFuZ2UgPT0KLQkJICAgICBETUFfUkFOR0VfVFJBTlNNSVRURUQpID8gInRyYW5zbWl0dGVkIiA6Ci0JCSAgICAidHJhbnNmZXJyZWQiKSkpOworCURNQV9UUkFDRSgiJXM6ICVzXG4iLAorCQkgIGRpLT5uYW1lLAorCQkgIHJhbmdlID09IERNQV9SQU5HRV9BTEwgPyAiYWxsIiA6CisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX1RSQU5TTUlUVEVEID8gInRyYW5zbWl0dGVkIiA6CisJCSAgInRyYW5zZmVycmVkIik7CiAKIAlpZiAoZGktPm50eGQgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzUzLDE2ICsxMzY0LDE1IEBACiAJaWYgKHJhbmdlID09IERNQV9SQU5HRV9BTEwpCiAJCWVuZCA9IGRpLT50eG91dDsKIAllbHNlIHsKLQkJc3RydWN0IGRtYTY0cmVncyBfX2lvbWVtICpkcmVncyA9IGRpLT5kNjR0eHJlZ3M7Ci0KLQkJZW5kID0gKHUxNikgKEIySSgoKFJfUkVHKCZkcmVncy0+c3RhdHVzMCkgJgotCQkJCSBENjRfWFMwX0NEX01BU0spIC0KLQkJCQkgZGktPnhtdHB0cmJhc2UpICYgRDY0X1hTMF9DRF9NQVNLLAotCQkJCSBzdHJ1Y3QgZG1hNjRkZXNjKSk7CisJCWVuZCA9ICh1MTYpIChCMkkoKChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCQkJICAgICAgIERNQTY0VFhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJgorCQkJCSAgIEQ2NF9YUzBfQ0RfTUFTSykgLSBkaS0+eG10cHRyYmFzZSkgJgorCQkJCSBENjRfWFMwX0NEX01BU0ssIHN0cnVjdCBkbWE2NGRlc2MpKTsKIAogCQlpZiAocmFuZ2UgPT0gRE1BX1JBTkdFX1RSQU5TRkVSRUQpIHsKIAkJCWFjdGl2ZV9kZXNjID0KLQkJCSAgICAodTE2KSAoUl9SRUcoJmRyZWdzLT5zdGF0dXMxKSAmCisJCQkJKHUxNikoYmNtYV9yZWFkMzIoZGktPmNvcmUsCisJCQkJCQkgIERNQTY0VFhSRUdPRkZTKGRpLCBzdGF0dXMxKSkgJgogCQkJCSAgICAgIEQ2NF9YUzFfQURfTUFTSyk7CiAJCQlhY3RpdmVfZGVzYyA9CiAJCQkgICAgKGFjdGl2ZV9kZXNjIC0gZGktPnhtdHB0cmJhc2UpICYgRDY0X1hTMF9DRF9NQVNLOwpAQCAtMTM5MSw3ICsxNDAxLDcgQEAKIAkJdHhwID0gZGktPnR4cFtpXTsKIAkJZGktPnR4cFtpXSA9IE5VTEw7CiAKLQkJcGNpX3VubWFwX3NpbmdsZShkaS0+cGJ1cywgcGEsIHNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKGRpLT5kbWFkZXYsIHBhLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIAl9CiAKIAlkaS0+dHhpbiA9IGk7CkBAIC0xNDAyLDggKzE0MTIsOCBAQAogCXJldHVybiB0eHA7CiAKICBib2d1czoKLQlETUFfTk9ORSgoImRtYV9nZXRuZXh0dHhwOiBib2d1cyBjdXJyOiBzdGFydCAlZCBlbmQgJWQgdHhvdXQgJWQgIgotCQkgICJmb3JjZSAlZFxuIiwgc3RhcnQsIGVuZCwgZGktPnR4b3V0LCBmb3JjZWFsbCkpOworCURNQV9OT05FKCJib2d1cyBjdXJyOiBzdGFydCAlZCBlbmQgJWQgdHhvdXQgJWRcbiIsCisJCSBzdGFydCwgZW5kLCBkaS0+dHhvdXQpOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmgKaW5kZXggZDMxN2M3Yy4uY2MyNjllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuaApAQCAtNzUsMTAgKzc1LDExIEBACiB9OwogCiBleHRlcm4gc3RydWN0IGRtYV9wdWIgKmRtYV9hdHRhY2goY2hhciAqbmFtZSwgc3RydWN0IHNpX3B1YiAqc2loLAotCQkJICAgIHZvaWQgX19pb21lbSAqZG1hcmVnc3R4LCB2b2lkIF9faW9tZW0gKmRtYXJlZ3NyeCwKLQkJCSAgICB1aW50IG50eGQsIHVpbnQgbnJ4ZCwKLQkJCSAgICB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCi0JCQkgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpOworCQkJCSAgc3RydWN0IGJjbWFfZGV2aWNlICpkMTFjb3JlLAorCQkJCSAgdWludCB0eHJlZ2Jhc2UsIHVpbnQgcnhyZWdiYXNlLAorCQkJCSAgdWludCBudHhkLCB1aW50IG5yeGQsCisJCQkJICB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCisJCQkJICB1aW50IG5yeHBvc3QsIHVpbnQgcnhvZmZzZXQsIHVpbnQgKm1zZ19sZXZlbCk7CiAKIHZvaWQgZG1hX3J4aW5pdChzdHJ1Y3QgZG1hX3B1YiAqcHViKTsKIGludCBkbWFfcngoc3RydWN0IGRtYV9wdWIgKnB1Yiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2tiX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuYwppbmRleCA4ZTM1YzYyLi43N2ZkYzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuYwpAQCAtMTcsMTAgKzE3LDExIEBACiAjZGVmaW5lIF9fVU5ERUZfTk9fVkVSU0lPTl9fCiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxkZWZzLmg+CiAjaW5jbHVkZSAibmljcGNpLmgiCkBAIC0zOSwxMCArNDAsMTAgQEAKICNkZWZpbmUgTUFDX0ZJTFRFUlMgKEZJRl9QUk9NSVNDX0lOX0JTUyB8IFwKIAlGSUZfQUxMTVVMVEkgfCBcCiAJRklGX0ZDU0ZBSUwgfCBcCi0JRklGX1BMQ1BGQUlMIHwgXAogCUZJRl9DT05UUk9MIHwgXAogCUZJRl9PVEhFUl9CU1MgfCBcCi0JRklGX0JDTl9QUkJSRVNQX1BST01JU0MpCisJRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBcCisJRklGX1BTUE9MTCkKIAogI2RlZmluZSBDSEFOMkdIWihjaGFubmVsLCBmcmVxZW5jeSwgY2hmbGFncykgIHsgXAogCS5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgXApAQCAtODYsMTYgKzg3LDE0IEBACiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQnJvYWRjb20gODAyLjExbiBXTEFOIGNhcmRzIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CiAKLS8qIHJlY29nbml6ZWQgUENJIElEcyAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJyY21zX3BjaV9pZF90YWJsZSkgPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1NykgfSwgLyogNDMyMjUgMkcgKi8KLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzUzKSB9LCAvKiA0MzIyNCBEVUFMICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDcyNykgfSwgLyogNDMxMyBEVUFMICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDU3NikgfSwgLyogNDMyMjQgVmVuICovCi0JezB9Ci19OwogCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYnJjbXNfcGNpX2lkX3RhYmxlKTsKKy8qIHJlY29nbml6ZWQgQkNNQSBDb3JlIElEcyAqLworc3RhdGljIHN0cnVjdCBiY21hX2RldmljZV9pZCBicmNtc19jb3JlaWRfdGFibGVbXSA9IHsKKwlCQ01BX0NPUkUoQkNNQV9NQU5VRl9CQ00sIEJDTUFfQ09SRV84MDIxMSwgMjMsIEJDTUFfQU5ZX0NMQVNTKSwKKwlCQ01BX0NPUkUoQkNNQV9NQU5VRl9CQ00sIEJDTUFfQ09SRV84MDIxMSwgMjQsIEJDTUFfQU5ZX0NMQVNTKSwKKwlCQ01BX0NPUkVUQUJMRV9FTkQKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGJjbWEsIGJyY21zX2NvcmVpZF90YWJsZSk7CiAKICNpZmRlZiBCQ01EQkcKIHN0YXRpYyBpbnQgbXNnbGV2ZWwgPSAweGRlYWRiZWVmOwpAQCAtMzcyLDcgKzM3MSw3IEBACiAJCQkJCQkgICBjb25mLT5saXN0ZW5faW50ZXJ2YWwpOwogCX0KIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9NT05JVE9SKQotCQl3aXBoeV9lcnIod2lwaHksICIlczogY2hhbmdlIG1vbml0b3IgbW9kZTogJXMgKGltcGxlbWVudClcbiIsCisJCXdpcGh5X2RiZyh3aXBoeSwgIiVzOiBjaGFuZ2UgbW9uaXRvciBtb2RlOiAlc1xuIiwKIAkJCSAgX19mdW5jX18sIGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfTU9OSVRPUiA/CiAJCQkgICJ0cnVlIiA6ICJmYWxzZSIpOwogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKQpAQCAtNTQ5LDI5ICs1NDgsMjUgQEAKIAogCWNoYW5nZWRfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CiAJKnRvdGFsX2ZsYWdzICY9IE1BQ19GSUxURVJTOworCiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9QUk9NSVNDX0lOX0JTU1xuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9QUk9NSVNDX0lOX0JTU1xuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfQUxMTVVMVEkpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9BTExNVUxUSVxuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9BTExNVUxUSVxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfRkNTRkFJTCkKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX0ZDU0ZBSUxcbiIpOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BMQ1BGQUlMKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfUExDUEZBSUxcbiIpOworCQl3aXBoeV9kYmcod2lwaHksICJGSUZfRkNTRkFJTFxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfQ09OVFJPTCkKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX0NPTlRST0xcbiIpOworCQl3aXBoeV9kYmcod2lwaHksICJGSUZfQ09OVFJPTFxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfT1RIRVJfQlNTKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfT1RIRVJfQlNTXG4iKTsKLQlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSB7Ci0JCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOwotCQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlIHw9IE1BQzgwMjExX1BST01JU0NfQkNOUzsKLQkJCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZSh3bC0+d2xjLCAxKTsKLQkJfSBlbHNlIHsKLQkJCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZSh3bC0+d2xjLCAwKTsKLQkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlICY9IH5NQUM4MDIxMV9QUk9NSVNDX0JDTlM7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKLQl9CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9PVEhFUl9CU1NcbiIpOworCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BTUE9MTCkKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX1BTUE9MTFxuIik7CisJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX0JDTl9QUkJSRVNQX1BST01JU0NcbiIpOworCisJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7CisJYnJjbXNfY19tYWNfcHJvbWlzYyh3bC0+d2xjLCAqdG90YWxfZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZ3bC0+bG9jayk7CiAJcmV0dXJuOwogfQogCkBAIC02MTksMTMgKzYxNCw2IEBACiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1LT5zY2IgPSBzY2I7CiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1LT5tYXhfcGR1ID0gMTY7CiAKLQlzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQgPSB0cnVlOwotCXN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOwotCXN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZOwotCXN0YS0+aHRfY2FwLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCB8Ci0JICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQXzQwTUhaX0lOVE9MRVJBTlQ7Ci0KIAkvKgogCSAqIG1pbnN0cmVsX2h0IGluaXRpYXRlcyBhZGRCQSBvbiBvdXIgYmVoYWxmIGJ5IGNhbGxpbmcKIAkgKiBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbigpCkBAIC03MzQsNyArNzIyLDcgQEAKIH07CiAKIC8qCi0gKiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCisgKiBpcyBjYWxsZWQgaW4gYnJjbXNfYmNtYV9wcm9iZSgpIGNvbnRleHQsIHRoZXJlZm9yZSBubyBsb2NraW5nIHJlcXVpcmVkLgogICovCiBzdGF0aWMgaW50IGJyY21zX3NldF9oaW50KHN0cnVjdCBicmNtc19pbmZvICp3bCwgY2hhciAqYWJicmV2KQogewpAQCAtODc0LDI1ICs4NjIsMTUgQEAKICNlbmRpZgogCQlrZnJlZSh0KTsKIAl9Ci0KLQkvKgotCSAqIHVucmVnaXN0ZXJfbmV0ZGV2KCkgY2FsbHMgZ2V0X3N0YXRzKCkgd2hpY2ggbWF5IHJlYWQgY2hpcAotCSAqIHJlZ2lzdGVycyBzbyB3ZSBjYW5ub3QgdW5tYXAgdGhlIGNoaXAgcmVnaXN0ZXJzIHVudGlsCi0JICogYWZ0ZXIgY2FsbGluZyB1bnJlZ2lzdGVyX25ldGRldigpIC4KLQkgKi8KLQlpZiAod2wtPnJlZ3N2YSkKLQkJaW91bm1hcCh3bC0+cmVnc3ZhKTsKLQotCXdsLT5yZWdzdmEgPSBOVUxMOwogfQogCiAvKgogKiBjYWxsZWQgZnJvbSBib3RoIGtlcm5lbCBhcyBmcm9tIHRoaXMga2VybmVsIG1vZHVsZSAoZXJyb3IgZmxvdyBvbiBhdHRhY2gpCiAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaXMgbm90IGFjcXVpcmVkLgogKi8KLXN0YXRpYyB2b2lkIGJyY21zX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIGJyY21zX3JlbW92ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBiY21hX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwogCiAJaWYgKHdsLT53bGMpIHsKQEAgLTkwMCwxMSArODc4LDEwIEBACiAJCXdpcGh5X3Jma2lsbF9zdG9wX3BvbGxpbmcod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHkpOwogCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhodyk7CiAJfQotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCWJyY21zX2ZyZWUod2wpOwogCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWJjbWFfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOwogfQogCkBAIC0xMDEyLDExICs5ODksOSBAQAogICogaXQgYXMgc3RhdGljLgogICoKICAqCi0gKiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCisgKiBpcyBjYWxsZWQgaW4gYnJjbXNfYmNtYV9wcm9iZSgpIGNvbnRleHQsIHRoZXJlZm9yZSBubyBsb2NraW5nIHJlcXVpcmVkLgogICovCi1zdGF0aWMgc3RydWN0IGJyY21zX2luZm8gKmJyY21zX2F0dGFjaCh1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAotCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QgcmVncywKLQkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKmJ0cGFyYW0sIHVpbnQgaXJxKQorc3RhdGljIHN0cnVjdCBicmNtc19pbmZvICpicmNtc19hdHRhY2goc3RydWN0IGJjbWFfZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IE5VTEw7CiAJaW50IHVuaXQsIGVycjsKQEAgLTEwMzAsNyArMTAwNSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJLyogYWxsb2NhdGUgcHJpdmF0ZSBpbmZvICovCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEoYnRwYXJhbSk7CS8qIGJ0cGFyYW0gPT0gcGRldiAqLworCWh3ID0gYmNtYV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpZiAoaHcgIT0gTlVMTCkKIAkJd2wgPSBody0+cHJpdjsKIAlpZiAoV0FSTl9PTihodyA9PSBOVUxMKSB8fCBXQVJOX09OKHdsID09IE5VTEwpKQpAQCAtMTA0MiwyNiArMTAxNywyMCBAQAogCS8qIHNldHVwIHRoZSBib3R0b20gaGFsZiBoYW5kbGVyICovCiAJdGFza2xldF9pbml0KCZ3bC0+dGFza2xldCwgYnJjbXNfZHBjLCAodW5zaWduZWQgbG9uZykgd2wpOwogCi0Jd2wtPnJlZ3N2YSA9IGlvcmVtYXBfbm9jYWNoZShyZWdzLCBQQ0lfQkFSMF9XSU5TWik7Ci0JaWYgKHdsLT5yZWdzdmEgPT0gTlVMTCkgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2wlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgdW5pdCk7Ci0JCWdvdG8gZmFpbDsKLQl9CiAJc3Bpbl9sb2NrX2luaXQoJndsLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmd2wtPmlzcl9sb2NrKTsKIAogCS8qIHByZXBhcmUgdWNvZGUgKi8KLQlpZiAoYnJjbXNfcmVxdWVzdF9mdyh3bCwgYnRwYXJhbSkgPCAwKSB7CisJaWYgKGJyY21zX3JlcXVlc3RfZncod2wsIHBkZXYtPmJ1cy0+aG9zdF9wY2kpIDwgMCkgewogCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IEZhaWxlZCB0byBmaW5kIGZpcm13YXJlIHVzdWFsbHkgaW4gIgogCQkJICAiJXNcbiIsIEtCVUlMRF9NT0ROQU1FLCAiL2xpYi9maXJtd2FyZS9icmNtIik7CiAJCWJyY21zX3JlbGVhc2VfZncod2wpOwotCQlicmNtc19yZW1vdmUoYnRwYXJhbSk7CisJCWJyY21zX3JlbW92ZShwZGV2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogY29tbW9uIGxvYWQtdGltZSBpbml0aWFsaXphdGlvbiAqLwotCXdsLT53bGMgPSBicmNtc19jX2F0dGFjaCh3bCwgdmVuZG9yLCBkZXZpY2UsIHVuaXQsIGZhbHNlLAotCQkJCSB3bC0+cmVnc3ZhLCBidHBhcmFtLCAmZXJyKTsKKwl3bC0+d2xjID0gYnJjbXNfY19hdHRhY2goKHZvaWQgKil3bCwgcGRldiwgdW5pdCwgZmFsc2UsICZlcnIpOwogCWJyY21zX3JlbGVhc2VfZncod2wpOwogCWlmICghd2wtPndsYykgewogCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IGF0dGFjaCgpIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCkBAIC0xMDczLDExICsxMDQyLDEyIEBACiAJd2wtPnB1Yi0+aWVlZV9odyA9IGh3OwogCiAJLyogcmVnaXN0ZXIgb3VyIGludGVycnVwdCBoYW5kbGVyICovCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgYnJjbXNfaXNyLCBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIHdsKSkgeworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5idXMtPmhvc3RfcGNpLT5pcnEsIGJyY21zX2lzciwKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgd2wpKSB7CiAJCXdpcGh5X2Vycih3bC0+d2lwaHksICJ3bCVkOiByZXF1ZXN0X2lycSgpIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9Ci0Jd2wtPmlycSA9IGlycTsKKwl3bC0+aXJxID0gcGRldi0+YnVzLT5ob3N0X3BjaS0+aXJxOwogCiAJLyogcmVnaXN0ZXIgbW9kdWxlICovCiAJYnJjbXNfY19tb2R1bGVfcmVnaXN0ZXIod2wtPnB1YiwgImxpbnV4Iiwgd2wsIE5VTEwpOwpAQCAtMTEyNCwzOCArMTA5NCwxOSBAQAogICoKICAqIFBlcmltZXRlciBsb2NrIGlzIGluaXRpYWxpemVkIGluIHRoZSBjb3Vyc2Ugb2YgdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQKLWJyY21zX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJyY21zX2JjbWFfcHJvYmUoc3RydWN0IGJjbWFfZGV2aWNlICpwZGV2KQogewotCWludCByYzsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0JdTMyIHZhbDsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwKLQkgICAgICAgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKLQkgICAgICAgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJtZmcgJXggY29yZSAleCByZXYgJWQgY2xhc3MgJWQgaXJxICVkXG4iLAorCQkgcGRldi0+aWQubWFudWYsIHBkZXYtPmlkLmlkLCBwZGV2LT5pZC5yZXYsIHBkZXYtPmlkLmNsYXNzLAorCQkgcGRldi0+YnVzLT5ob3N0X3BjaS0+aXJxKTsKIAotCWlmICgocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pIHx8Ci0JICAgICgocGRldi0+ZGV2aWNlICE9IDB4MDU3NikgJiYKLQkgICAgICgocGRldi0+ZGV2aWNlICYgMHhmZjAwKSAhPSAweDQzMDApICYmCi0JICAgICAoKHBkZXYtPmRldmljZSAmIDB4ZmYwMCkgIT0gMHg0NzAwKSAmJgotCSAgICAgKChwZGV2LT5kZXZpY2UgPCA0MzAwMCkgfHwgKHBkZXYtPmRldmljZSA+IDQzOTk5KSkpKQorCWlmICgocGRldi0+aWQubWFudWYgIT0gQkNNQV9NQU5VRl9CQ00pIHx8CisJICAgIChwZGV2LT5pZC5pZCAhPSBCQ01BX0NPUkVfODAyMTEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IENhbm5vdCBlbmFibGUgZGV2aWNlICVkLSVkXyVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCSAgICAgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7Ci0JaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwotCiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBicmNtc19pbmZvKSwgJmJyY21zX29wcyk7CiAJaWYgKCFodykgewogCQlwcl9lcnIoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMTY0LDE0ICsxMTE1LDExIEBACiAKIAlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOworCWJjbWFfc2V0X2RydmRhdGEocGRldiwgaHcpOwogCiAJbWVtc2V0KGh3LT5wcml2LCAwLCBzaXplb2YoKndsKSk7CiAKLQl3bCA9IGJyY21zX2F0dGFjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKLQkJCSAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwZGV2LAotCQkJICBwZGV2LT5pcnEpOwotCisJd2wgPSBicmNtc19hdHRhY2gocGRldik7CiAJaWYgKCF3bCkgewogCQlwcl9lcnIoIiVzOiAlczogYnJjbXNfYXR0YWNoIGZhaWxlZCFcbiIsIEtCVUlMRF9NT0ROQU1FLAogCQkgICAgICAgX19mdW5jX18pOwpAQCAtMTE4MCwxNiArMTEyOCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJyY21zX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgYnJjbXNfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7Cit9CisKK3N0YXRpYyBpbnQgYnJjbXNfc3VzcGVuZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAKLQlodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlodyA9IGJjbWFfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBody0+cHJpdjsKIAlpZiAoIXdsKSB7CiAJCXdpcGh5X2Vycih3bC0+d2lwaHksCi0JCQkgICJicmNtc19zdXNwZW5kOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKKwkJCSAgImJyY21zX3N1c3BlbmQ6IGJjbWFfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTk4LDI1ICsxMTUzLDE0IEBACiAJd2wtPnB1Yi0+aHdfdXAgPSBmYWxzZTsKIAlzcGluX3VubG9ja19iaCgmd2wtPmxvY2spOwogCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJLyogdGVtcG9yYXJpbHkgZG8gc3VzcGVuZCBvdXJzZWx2ZXMgKi8KKwlyZXR1cm4gYnJjbXNfcGNpX3N1c3BlbmQocGRldi0+YnVzLT5ob3N0X3BjaSk7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbXNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBicmNtc19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBicmNtc19pbmZvICp3bDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlpbnQgZXJyID0gMDsKLQl1MzIgdmFsOwotCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jd2wgPSBody0+cHJpdjsKLQlpZiAoIXdsKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksCi0JCQkgICJ3bDogYnJjbXNfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXVpbnQgdmFsOwogCiAJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCWlmIChlcnIpCkBAIC0xMjM0LDI0ICsxMTc4LDI4IEBACiAJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwogCi0JLyoKLQkqICBkb25lLiBkcml2ZXIgd2lsbCBiZSBwdXQgaW4gdXAgc3RhdGUKLQkqICBpbiBicmNtc19vcHNfYWRkX2ludGVyZmFjZSgpIGNhbGwuCi0JKi8KLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnJjbXNfcGNpX2RyaXZlciA9IHsKK3N0YXRpYyBpbnQgYnJjbXNfcmVzdW1lKHN0cnVjdCBiY21hX2RldmljZSAqcGRldikKK3sKKwkvKgorCSogIGp1c3QgZG8gcGNpIHJlc3VtZSBmb3Igbm93IHVudGlsIGJjbWEgc3VwcG9ydHMgaXQuCisJKi8KKwlyZXR1cm4gYnJjbXNfcGNpX3Jlc3VtZShwZGV2LT5idXMtPmhvc3RfcGNpKTsKK30KKworc3RhdGljIHN0cnVjdCBiY21hX2RyaXZlciBicmNtc19iY21hX2RyaXZlciA9IHsKIAkubmFtZSAgICAgPSBLQlVJTERfTU9ETkFNRSwKLQkucHJvYmUgICAgPSBicmNtc19wY2lfcHJvYmUsCisJLnByb2JlICAgID0gYnJjbXNfYmNtYV9wcm9iZSwKIAkuc3VzcGVuZCAgPSBicmNtc19zdXNwZW5kLAogCS5yZXN1bWUgICA9IGJyY21zX3Jlc3VtZSwKIAkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChicmNtc19yZW1vdmUpLAotCS5pZF90YWJsZSA9IGJyY21zX3BjaV9pZF90YWJsZSwKKwkuaWRfdGFibGUgPSBicmNtc19jb3JlaWRfdGFibGUsCiB9OwogCiAvKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBXTCBkcml2ZXIuCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYnJjbXNtYWMgZHJpdmVyLgogICoKICAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBhIGRldmljZSBwb2ludGVkIHRvIGJ5IHBkZXYgaXMgYSBXTCBkZXZpY2UsCiAgKiBhbmQgaWYgc28sIHBlcmZvcm1zIGEgYnJjbXNfYXR0YWNoKCkgb24gaXQuCkBAIC0xMjY2LDI2ICsxMjE0LDI0IEBACiAJCWJyY21fbXNnX2xldmVsID0gbXNnbGV2ZWw7CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLQllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJyY21zX3BjaV9kcml2ZXIpOworCWVycm9yID0gYmNtYV9kcml2ZXJfcmVnaXN0ZXIoJmJyY21zX2JjbWFfZHJpdmVyKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3RlciByZXR1cm5lZCAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKIAlpZiAoIWVycm9yKQogCQlyZXR1cm4gMDsKIAotCi0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBXTCBkcml2ZXIgZnJvbSB0aGUgc3lzdGVtLgorICogVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBicmNtc21hYyBkcml2ZXIgZnJvbSB0aGUgc3lzdGVtLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5IHVubG9hZHMgdGhlIFdMIGRyaXZlciBtb2R1bGUgZnJvbSB0aGUKKyAqIFRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5IHVubG9hZHMgdGhlIGJyY21zbWFjIGRyaXZlciBtb2R1bGUgZnJvbSB0aGUKICAqIHN5c3RlbS4KICAqCiAgKi8KIHN0YXRpYyB2b2lkIF9fZXhpdCBicmNtc19tb2R1bGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYnJjbXNfcGNpX2RyaXZlcik7Ci0KKwliY21hX2RyaXZlcl91bnJlZ2lzdGVyKCZicmNtc19iY21hX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGJyY21zX21vZHVsZV9pbml0KTsKQEAgLTE1NTYsMTEgKzE1MDIsMTAgQEAKIAkJCWlmIChsZTMyX3RvX2NwdShoZHItPmlkeCkgPT0gaWR4KSB7CiAJCQkJcGRhdGEgPSB3bC0+ZncuZndfYmluW2ldLT5kYXRhICsKIAkJCQkJbGUzMl90b19jcHUoaGRyLT5vZmZzZXQpOwotCQkJCSpwYnVmID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQkJCSpwYnVmID0ga21lbWR1cChwZGF0YSwgbGVuLCBHRlBfQVRPTUlDKTsKIAkJCQlpZiAoKnBidWYgPT0gTlVMTCkKIAkJCQkJZ290byBmYWlsOwogCi0JCQkJbWVtY3B5KCpwYnVmLCBwZGF0YSwgbGVuKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMTU3Myw3ICsxNTE4LDcgQEAKIH0KIAogLyoKLSAqIFByZWNvbmRpdGlvbjogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwKKyAqIFByZWNvbmRpdGlvbjogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnJjbXNfYmNtYV9wcm9iZSgpIGNvbnRleHQsCiAgKiBubyBsb2NraW5nIGlzIHJlcXVpcmVkLgogICovCiBpbnQgYnJjbXNfdWNvZGVfaW5pdF91aW50KHN0cnVjdCBicmNtc19pbmZvICp3bCwgc2l6ZV90ICpuX2J5dGVzLCB1MzIgaWR4KQpAQCAtMTYxMyw3ICsxNTU4LDcgQEAKIC8qCiAgKiBjaGVja3MgdmFsaWRpdHkgb2YgYWxsIGZpcm13YXJlIGltYWdlcyBsb2FkZWQgZnJvbSB1c2VyIHNwYWNlCiAgKgotICogUHJlY29uZGl0aW9uOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBicmNtc19wY2lfcHJvYmUoKSBjb250ZXh0LAorICogUHJlY29uZGl0aW9uOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBicmNtc19iY21hX3Byb2JlKCkgY29udGV4dCwKICAqIG5vIGxvY2tpbmcgaXMgcmVxdWlyZWQuCiAgKi8KIGludCBicmNtc19jaGVja19maXJtd2FyZXMoc3RydWN0IGJyY21zX2luZm8gKndsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuaAppbmRleCA2MjQyZjE4Li44ZjYwNDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuaApAQCAtNjgsOCArNjgsNiBAQAogCXNwaW5sb2NrX3QgbG9jazsJLyogcGVyLWRldmljZSBwZXJpbWV0ZXIgbG9jayAqLwogCXNwaW5sb2NrX3QgaXNyX2xvY2s7CS8qIHBlci1kZXZpY2UgSVNSIHN5bmNocm9uaXphdGlvbiBsb2NrICovCiAKLQkvKiByZWdzdmEgZm9yIHVubWFwIGluIGJyY21zX2ZyZWUoKSAqLwotCXZvaWQgX19pb21lbSAqcmVnc3ZhOwkvKiBvcGFxdWUgY2hpcCByZWdpc3RlcnMgdmlydHVhbCBhZGRyZXNzICovCiAKIAkvKiB0aW1lciByZWxhdGVkIGZpZWxkcyAqLwogCWF0b21pY190IGNhbGxiYWNrczsJLyogIyBvdXRzdGFuZGluZyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCmluZGV4IGYxOTNmYWIuLmY3ZWQzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYwpAQCAtMTA5LDExICsxMDksNiBAQAogI2RlZmluZSBCUEhZX1BMQ1BfVElNRQkJCTE5MgogI2RlZmluZSBSSUZTXzExTl9USU1FCQkJMgogCi0jZGVmaW5lIEFDX0JFCQkJCTAKLSNkZWZpbmUgQUNfQksJCQkJMQotI2RlZmluZSBBQ19WSQkJCQkyCi0jZGVmaW5lIEFDX1ZPCQkJCTMKLQogLyogbGVuZ3RoIG9mIHRoZSBCQ04gdGVtcGxhdGUgYXJlYSAqLwogI2RlZmluZSBCQ05fVE1QTF9MRU4JCQk1MTIKIApAQCAtMzA1LDEwICszMDAsMjIgQEAKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAogLyogVFggRklGTyBudW1iZXIgdG8gV01FLzgwMi4xRSBBY2Nlc3MgQ2F0ZWdvcnkgKi8KLXN0YXRpYyBjb25zdCB1OCB3bWVfZmlmbzJhY1tdID0geyBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTywgQUNfQkUsIEFDX0JFIH07CitzdGF0aWMgY29uc3QgdTggd21lX2ZpZm8yYWNbXSA9IHsKKwlJRUVFODAyMTFfQUNfQkssCisJSUVFRTgwMjExX0FDX0JFLAorCUlFRUU4MDIxMV9BQ19WSSwKKwlJRUVFODAyMTFfQUNfVk8sCisJSUVFRTgwMjExX0FDX0JFLAorCUlFRUU4MDIxMV9BQ19CRQorfTsKIAotLyogV01FLzgwMi4xRSBBY2Nlc3MgQ2F0ZWdvcnkgdG8gVFggRklGTyBudW1iZXIgKi8KLXN0YXRpYyBjb25zdCB1OCB3bWVfYWMyZmlmb1tdID0geyAxLCAwLCAyLCAzIH07CisvKiBpZWVlODAyMTEgQWNjZXNzIENhdGVnb3J5IHRvIFRYIEZJRk8gbnVtYmVyICovCitzdGF0aWMgY29uc3QgdTggd21lX2FjMmZpZm9bXSA9IHsKKwlUWF9BQ19WT19GSUZPLAorCVRYX0FDX1ZJX0ZJRk8sCisJVFhfQUNfQkVfRklGTywKKwlUWF9BQ19CS19GSUZPCit9OwogCiAvKiA4MDIuMUQgUHJpb3JpdHkgdG8gcHJlY2VkZW5jZSBxdWV1ZSBtYXBwaW5nICovCiBjb25zdCB1OCB3bGNfcHJpbzJwcmVjX21hcFtdID0gewpAQCAtMzgxLDEwICszODgsMTMgQEAKICAqLwogc3RhdGljIGJvb2wgYnJjbXNfZGV2aWNlcmVtb3ZlZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCiB7CisJdTMyIG1hY2N0cmw7CisKIAlpZiAoIXdsYy0+aHctPmNsaykKIAkJcmV0dXJuIGFpX2RldmljZXJlbW92ZWQod2xjLT5ody0+c2loKTsKLQlyZXR1cm4gKFJfUkVHKCZ3bGMtPmh3LT5yZWdzLT5tYWNjb250cm9sKSAmCi0JCShNQ1RMX1BTTV9KTVBfMCB8IE1DVExfSUhSX0VOKSkgIT0gTUNUTF9JSFJfRU47CisJbWFjY3RybCA9IGJjbWFfcmVhZDMyKHdsYy0+aHctPmQxMWNvcmUsCisJCQkgICAgICBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKKwlyZXR1cm4gKG1hY2N0cmwgJiAoTUNUTF9QU01fSk1QXzAgfCBNQ1RMX0lIUl9FTikpICE9IE1DVExfSUhSX0VOOwogfQogCiAvKiBzdW0gdGhlIGluZGl2aWR1YWwgZmlmbyB0eCBwZW5kaW5nIHBhY2tldCBjb3VudHMgKi8KQEAgLTU3NSwxNyArNTg1LDE1IEBACiBzdGF0aWMgdm9pZCBicmNtc19iX3VwZGF0ZV9zbG90X3RpbWluZyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKIAkJCQkJYm9vbCBzaG9ydHNsb3QpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCiAJaWYgKHNob3J0c2xvdCkgewogCQkvKiAxMWcgc2hvcnQgc2xvdDogMTFhIHRpbWluZyAqLwotCQlXX1JFRygmcmVncy0+aWZzX3Nsb3QsIDB4MDIwNyk7CS8qIEFQSFlfU0xPVF9USU1FICovCisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKGlmc19zbG90KSwgMHgwMjA3KTsKIAkJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX0RPVDExX1NMT1QsIEFQSFlfU0xPVF9USU1FKTsKIAl9IGVsc2UgewogCQkvKiAxMWcgbG9uZyBzbG90OiAxMWIgdGltaW5nICovCi0JCVdfUkVHKCZyZWdzLT5pZnNfc2xvdCwgMHgwMjEyKTsJLyogQlBIWV9TTE9UX1RJTUUgKi8KKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoaWZzX3Nsb3QpLCAweDAyMTIpOwogCQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRE9UMTFfU0xPVCwgQlBIWV9TTE9UX1RJTUUpOwogCX0KIH0KQEAgLTY2NSwyNCArNjczLDIyIEBACiBzdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX2luaXRzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAogCQkJCWNvbnN0IHN0cnVjdCBkMTFpbml0ICppbml0cykKIHsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJaW50IGk7Ci0JdTggX19pb21lbSAqYmFzZTsKLQl1OCBfX2lvbWVtICphZGRyOworCXVpbnQgb2Zmc2V0OwogCXUxNiBzaXplOwogCXUzMiB2YWx1ZTsKIAogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCi0JYmFzZSA9ICh1OCBfX2lvbWVtICopd2xjX2h3LT5yZWdzOwotCiAJZm9yIChpID0gMDsgaW5pdHNbaV0uYWRkciAhPSBjcHVfdG9fbGUxNigweGZmZmYpOyBpKyspIHsKIAkJc2l6ZSA9IGxlMTZfdG9fY3B1KGluaXRzW2ldLnNpemUpOwotCQlhZGRyID0gYmFzZSArIGxlMTZfdG9fY3B1KGluaXRzW2ldLmFkZHIpOworCQlvZmZzZXQgPSBsZTE2X3RvX2NwdShpbml0c1tpXS5hZGRyKTsKIAkJdmFsdWUgPSBsZTMyX3RvX2NwdShpbml0c1tpXS52YWx1ZSk7CiAJCWlmIChzaXplID09IDIpCi0JCQlXX1JFRygodTE2IF9faW9tZW0gKilhZGRyLCB2YWx1ZSk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgb2Zmc2V0LCB2YWx1ZSk7CiAJCWVsc2UgaWYgKHNpemUgPT0gNCkKLQkJCVdfUkVHKCh1MzIgX19pb21lbSAqKWFkZHIsIHZhbHVlKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIAkJZWxzZQogCQkJYnJlYWs7CiAJfQpAQCAtNzMyLDYgKzczOCwxNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlX2lvY3RsKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MzIgbSwgdTMyIHYpCit7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOworCXUzMiBpb2N0bCA9IGJjbWFfYXJlYWQzMihjb3JlLCBCQ01BX0lPQ1RMKSAmIH5tOworCisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX0lPQ1RMLCBpb2N0bCB8IHYpOworfQorCiBzdGF0aWMgdm9pZCBicmNtc19iX2NvcmVfcGh5X2NsayhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspCiB7CiAJQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWQ6IGNsayAlZFxuIiwgd2xjX2h3LT51bml0LCBjbGspOwpAQCAtNzQwLDE3ICs3NTQsMTcgQEAKIAogCWlmIChPRkYgPT0gY2xrKSB7CS8qIGNsZWFyIGdtb2RlIGJpdCwgcHV0IHBoeSBpbnRvIHJlc2V0ICovCiAKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyB8IFNJQ0ZfR01PREUpLAotCQkJICAgICAgIChTSUNGX1BSU1QgfCBTSUNGX0ZHQykpOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LCAoU0lDRl9QUlNUIHwgU0lDRl9GR0MgfCBTSUNGX0dNT0RFKSwKKwkJCQkgICAoU0lDRl9QUlNUIHwgU0lDRl9GR0MpKTsKIAkJdWRlbGF5KDEpOwotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgKFNJQ0ZfUFJTVCB8IFNJQ0ZfRkdDKSwgU0lDRl9QUlNUKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgKFNJQ0ZfUFJTVCB8IFNJQ0ZfRkdDKSwgU0lDRl9QUlNUKTsKIAkJdWRlbGF5KDEpOwogCiAJfSBlbHNlIHsJCS8qIHRha2UgcGh5IG91dCBvZiByZXNldCAqLwogCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9GR0MpLCBTSUNGX0ZHQyk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyksIFNJQ0ZfRkdDKTsKIAkJdWRlbGF5KDEpOwotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgKFNJQ0ZfRkdDKSwgMCk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfRkdDLCAwKTsKIAkJdWRlbGF5KDEpOwogCiAJfQpAQCAtNzcxLDkgKzc4NSwxNCBAQAogCXdsY19ody0+d2xjLT5iYW5kID0gd2xjX2h3LT53bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF07CiAKIAkvKiBzZXQgZ21vZGUgY29yZSBmbGFnICovCi0JaWYgKHdsY19ody0+c2JjbGsgJiYgIXdsY19ody0+bm9yZXNldCkKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfR01PREUsCi0JCQkgICAgICAgKChiYW5kdW5pdCA9PSAwKSA/IFNJQ0ZfR01PREUgOiAwKSk7CisJaWYgKHdsY19ody0+c2JjbGsgJiYgIXdsY19ody0+bm9yZXNldCkgeworCQl1MzIgZ21vZGUgPSAwOworCisJCWlmIChiYW5kdW5pdCA9PSAwKQorCQkJZ21vZGUgPSBTSUNGX0dNT0RFOworCisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfR01PREUsIGdtb2RlKTsKKwl9CiB9CiAKIC8qIHN3aXRjaCB0byBuZXcgYmFuZCBidXQgbGVhdmUgaXQgaW5hY3RpdmUgKi8KQEAgLTc4MSwxMCArODAwLDEyIEBACiB7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwogCXUzMiBtYWNpbnRtYXNrOworCXUzMiBtYWNjdHJsOwogCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwotCi0JV0FSTl9PTigoUl9SRUcoJndsY19ody0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykgIT0gMCk7CisJbWFjY3RybCA9IGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCSAgICAgIEQxMVJFR09GRlMobWFjY29udHJvbCkpOworCVdBUk5fT04oKG1hY2N0cmwgJiBNQ1RMX0VOX01BQykgIT0gMCk7CiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KIAltYWNpbnRtYXNrID0gYnJjbXNfaW50cnNvZmYod2xjLT53bCk7CkBAIC04OTMsNyArOTE0LDcgQEAKIAkJICAgIGxmYmwsCS8qIExvbmcgRnJhbWUgUmF0ZSBGYWxsYmFjayBMaW1pdCAqLwogCQkgICAgZmJsOwogCi0JCWlmIChxdWV1ZSA8IEFDX0NPVU5UKSB7CisJCWlmIChxdWV1ZSA8IElFRUU4MDIxMV9OVU1fQUNTKSB7CiAJCQlzZmJsID0gR0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbd21lX2ZpZm8yYWNbcXVldWVdXSwKIAkJCQkgICAgICBFRENGX1NGQik7CiAJCQlsZmJsID0gR0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbd21lX2ZpZm8yYWNbcXVldWVdXSwKQEAgLTk0MiwxNCArOTYzLDEyIEBACiAJCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CiAJfQogCi0JdG90bGVuID0gYnJjbXVfcGt0dG90bGVuKHApOworCXRvdGxlbiA9IHAtPmxlbjsKIAlmcmVlX3BkdSA9IHRydWU7CiAKIAlicmNtc19jX3R4Zmlmb19jb21wbGV0ZSh3bGMsIHF1ZXVlLCAxKTsKIAogCWlmIChsYXN0ZnJhbWUpIHsKLQkJcC0+bmV4dCA9IE5VTEw7Ci0JCXAtPnByZXYgPSBOVUxMOwogCQkvKiByZW1vdmUgUExDUCAmIEJyb2FkY29tIHR4IGRlc2NyaXB0b3IgaGVhZGVyICovCiAJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7CiAJCXNrYl9wdWxsKHAsIEQxMV9UWEhfTEVOKTsKQEAgLTk3Nyw3ICs5OTYsNyBAQAogewogCWJvb2wgbW9yZXBlbmRpbmcgPSBmYWxzZTsKIAlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAlzdHJ1Y3QgdHhfc3RhdHVzIHR4c3RhdHVzLCAqdHhzOwogCXUzMiBzMSwgczI7CiAJdWludCBuID0gMDsKQEAgLTk5MCwxOCArMTAwOSwxOCBAQAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAogCXR4cyA9ICZ0eHN0YXR1czsKLQlyZWdzID0gd2xjX2h3LT5yZWdzOworCWNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJKmZhdGFsID0gZmFsc2U7CisJczEgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGZybXR4c3RhdHVzKSk7CiAJd2hpbGUgKCEoKmZhdGFsKQotCSAgICAgICAmJiAoczEgPSBSX1JFRygmcmVncy0+ZnJtdHhzdGF0dXMpKSAmIFRYU19WKSB7CisJICAgICAgICYmIChzMSAmIFRYU19WKSkgewogCiAJCWlmIChzMSA9PSAweGZmZmZmZmZmKSB7CiAJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsCiAJCQkJd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gbW9yZXBlbmRpbmc7CiAJCX0KLQotCQlzMiA9IFJfUkVHKCZyZWdzLT5mcm10eHN0YXR1czIpOworCQlzMiA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMyKSk7CiAKIAkJdHhzLT5zdGF0dXMgPSBzMSAmIFRYU19TVEFUVVNfTUFTSzsKIAkJdHhzLT5mcmFtZWlkID0gKHMxICYgVFhTX0ZJRF9NQVNLKSA+PiBUWFNfRklEX1NISUZUOwpAQCAtMTAxNCw2ICsxMDMzLDcgQEAKIAkJLyogIWdpdmUgb3RoZXJzIHNvbWUgdGltZSB0byBydW4hICovCiAJCWlmICgrK24gPj0gbWF4X3R4X251bSkKIAkJCWJyZWFrOworCQlzMSA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMpKTsKIAl9CiAKIAlpZiAoKmZhdGFsKQpAQCAtMTA1OCwxMiArMTA3OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqCi1kbWFyZWcoc3RydWN0IGJyY21zX2hhcmR3YXJlICpodywgdWludCBkaXJlY3Rpb24sIHVpbnQgZmlmb251bSkKK3N0YXRpYyB1aW50CitkbWFyZWcodWludCBkaXJlY3Rpb24sIHVpbnQgZmlmb251bSkKIHsKIAlpZiAoZGlyZWN0aW9uID09IERNQV9UWCkKLQkJcmV0dXJuICYoaHctPnJlZ3MtPmZpZm82NHJlZ3NbZmlmb251bV0uZG1heG10KTsKLQlyZXR1cm4gJihody0+cmVncy0+ZmlmbzY0cmVnc1tmaWZvbnVtXS5kbWFyY3YpOworCQlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGQxMXJlZ3MsIGZpZm82NHJlZ3NbZmlmb251bV0uZG1heG10KTsKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGQxMXJlZ3MsIGZpZm82NHJlZ3NbZmlmb251bV0uZG1hcmN2KTsKIH0KIAogc3RhdGljIGJvb2wgYnJjbXNfYl9hdHRhY2hfZG1hcGlvKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBqLCBib29sIHdtZSkKQEAgLTEwODksOSArMTEwOSw5IEBACiAJCSAqIFRYOiBUWF9BQ19CS19GSUZPIChUWCBBQyBCYWNrZ3JvdW5kIGRhdGEgcGFja2V0cykKIAkJICogUlg6IFJYX0ZJRk8gKFJYIGRhdGEgcGFja2V0cykKIAkJICovCi0JCXdsY19ody0+ZGlbMF0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLAotCQkJCQkgICAod21lID8gZG1hcmVnKHdsY19odywgRE1BX1RYLCAwKSA6Ci0JCQkJCSAgICBOVUxMKSwgZG1hcmVnKHdsY19odywgRE1BX1JYLCAwKSwKKwkJd2xjX2h3LT5kaVswXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsIHdsY19ody0+ZDExY29yZSwKKwkJCQkJICAgKHdtZSA/IGRtYXJlZyhETUFfVFgsIDApIDogMCksCisJCQkJCSAgIGRtYXJlZyhETUFfUlgsIDApLAogCQkJCQkgICAod21lID8gTlRYRCA6IDApLCBOUlhELAogCQkJCQkgICBSWEJVRlNaLCAtMSwgTlJYQlVGUE9TVCwKIAkJCQkJICAgQlJDTVNfSFdSWE9GRiwgJmJyY21fbXNnX2xldmVsKTsKQEAgLTExMDMsOCArMTEyMyw4IEBACiAJCSAqICAgKGxlZ2FjeSkgVFhfREFUQV9GSUZPIChUWCBkYXRhIHBhY2tldHMpCiAJCSAqIFJYOiBVTlVTRUQKIAkJICovCi0JCXdsY19ody0+ZGlbMV0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLAotCQkJCQkgICBkbWFyZWcod2xjX2h3LCBETUFfVFgsIDEpLCBOVUxMLAorCQl3bGNfaHctPmRpWzFdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwgd2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBkbWFyZWcoRE1BX1RYLCAxKSwgMCwKIAkJCQkJICAgTlRYRCwgMCwgMCwgLTEsIDAsIDAsCiAJCQkJCSAgICZicmNtX21zZ19sZXZlbCk7CiAJCWRtYV9hdHRhY2hfZXJyIHw9IChOVUxMID09IHdsY19ody0+ZGlbMV0pOwpAQCAtMTExNCw4ICsxMTM0LDggQEAKIAkJICogVFg6IFRYX0FDX1ZJX0ZJRk8gKFRYIEFDIFZpZGVvIGRhdGEgcGFja2V0cykKIAkJICogUlg6IFVOVVNFRAogCQkgKi8KLQkJd2xjX2h3LT5kaVsyXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIGRtYXJlZyh3bGNfaHcsIERNQV9UWCwgMiksIE5VTEwsCisJCXdsY19ody0+ZGlbMl0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLCB3bGNfaHctPmQxMWNvcmUsCisJCQkJCSAgIGRtYXJlZyhETUFfVFgsIDIpLCAwLAogCQkJCQkgICBOVFhELCAwLCAwLCAtMSwgMCwgMCwKIAkJCQkJICAgJmJyY21fbXNnX2xldmVsKTsKIAkJZG1hX2F0dGFjaF9lcnIgfD0gKE5VTEwgPT0gd2xjX2h3LT5kaVsyXSk7CkBAIC0xMTI0LDkgKzExNDQsOSBAQAogCQkgKiBUWDogVFhfQUNfVk9fRklGTyAoVFggQUMgVm9pY2UgZGF0YSBwYWNrZXRzKQogCQkgKiAgIChsZWdhY3kpIFRYX0NUTF9GSUZPIChUWCBjb250cm9sICYgbWdtdCBwYWNrZXRzKQogCQkgKi8KLQkJd2xjX2h3LT5kaVszXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIGRtYXJlZyh3bGNfaHcsIERNQV9UWCwgMyksCi0JCQkJCSAgIE5VTEwsIE5UWEQsIDAsIDAsIC0xLAorCQl3bGNfaHctPmRpWzNdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwgd2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBkbWFyZWcoRE1BX1RYLCAzKSwKKwkJCQkJICAgMCwgTlRYRCwgMCwgMCwgLTEsCiAJCQkJCSAgIDAsIDAsICZicmNtX21zZ19sZXZlbCk7CiAJCWRtYV9hdHRhY2hfZXJyIHw9IChOVUxMID09IHdsY19ody0+ZGlbM10pOwogLyogQ2xlYW5lciB0byBsZWF2ZSB0aGlzIGFzIGlmIHdpdGggQVAgZGVmaW5lZCAqLwpAQCAtMTIwMCw3ICsxMjIwLDcgQEAKIC8qIGNvbnRyb2wgY2hpcCBjbG9jayB0byBzYXZlIHBvd2VyLCBlbmFibGUgZHluYW1pYyBjbG9jayBvciBmb3JjZSBmYXN0IGNsb2NrICovCiBzdGF0aWMgdm9pZCBicmNtc19iX2Nsa2N0bF9jbGsoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgbW9kZSkKIHsKLQlpZiAod2xjX2h3LT5zaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKKwlpZiAoYWlfZ2V0X2NjY2Fwcyh3bGNfaHctPnNpaCkgJiBDQ19DQVBfUE1VKSB7CiAJCS8qIG5ldyBjaGlwcyB3aXRoIFBNVSwgQ0NTX0ZPUkNFSFQgd2lsbCBkaXN0cmlidXRlIHRoZSBIVCBjbG9jawogCQkgKiBvbiBiYWNrcGxhbmUsIGJ1dCBtYWMgY29yZSB3aWxsIHN0aWxsIHJ1biBvbiBBTFAobm90IEhUKSB3aGVuCiAJCSAqIGl0IGVudGVycyBwb3dlcnNhdmUgbW9kZSwgd2hpY2ggbWVhbnMgdGhlIEZDQSBiaXQgbWF5IG5vdCBiZQpAQCAtMTIwOSwyOSArMTIyOSwzMyBAQAogCiAJCWlmICh3bGNfaHctPmNsaykgewogCQkJaWYgKG1vZGUgPT0gQ0xLX0ZBU1QpIHsKLQkJCQlPUl9SRUcoJndsY19ody0+cmVncy0+Y2xrX2N0bF9zdCwKLQkJCQkgICAgICAgQ0NTX0ZPUkNFSFQpOworCQkJCWJjbWFfc2V0MzIod2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAorCQkJCQkgICBDQ1NfRk9SQ0VIVCk7CiAKIAkJCQl1ZGVsYXkoNjQpOwogCi0JCQkJU1BJTldBSVQoKChSX1JFRwotCQkJCQkgICAoJndsY19ody0+cmVncy0+Ci0JCQkJCSAgICBjbGtfY3RsX3N0KSAmIENDU19IVEFWQUlMKSA9PSAwKSwKLQkJCQkJIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOwotCQkJCVdBUk5fT04oIShSX1JFRwotCQkJCQkgICgmd2xjX2h3LT5yZWdzLT4KLQkJCQkJICAgY2xrX2N0bF9zdCkgJiBDQ1NfSFRBVkFJTCkpOworCQkJCVNQSU5XQUlUKAorCQkJCSAgICAoKGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCQkgICAgICBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKSAmCisJCQkJICAgICAgQ0NTX0hUQVZBSUwpID09IDApLAorCQkJCSAgICAgIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOworCQkJCVdBUk5fT04oIShiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsCisJCQkJCUQxMVJFR09GRlMoY2xrX2N0bF9zdCkpICYKKwkJCQkJQ0NTX0hUQVZBSUwpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKCh3bGNfaHctPnNpaC0+cG11cmV2ID09IDApICYmCi0JCQkJICAgIChSX1JFRwotCQkJCSAgICAgKCZ3bGNfaHctPnJlZ3MtPgotCQkJCSAgICAgIGNsa19jdGxfc3QpICYgKENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpKQotCQkJCQlTUElOV0FJVCgoKFJfUkVHCi0JCQkJCQkgICAoJndsY19ody0+cmVncy0+Ci0JCQkJCQkgICAgY2xrX2N0bF9zdCkgJiBDQ1NfSFRBVkFJTCkKLQkJCQkJCSAgPT0gMCksCi0JCQkJCQkgUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7Ci0JCQkJQU5EX1JFRygmd2xjX2h3LT5yZWdzLT5jbGtfY3RsX3N0LAorCQkJCWlmICgoYWlfZ2V0X3BtdXJldih3bGNfaHctPnNpaCkgPT0gMCkgJiYKKwkJCQkgICAgKGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCQkJRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSkgJgorCQkJCQkoQ0NTX0ZPUkNFSFQgfCBDQ1NfSFRBUkVRKSkpCisJCQkJCVNQSU5XQUlUKAorCQkJCQkgICAgKChiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsCisJCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBkMTFyZWdzLAorCQkJCQkJICAgICAgIGNsa19jdGxfc3QpKSAmCisJCQkJCSAgICAgIENDU19IVEFWQUlMKSA9PSAwKSwKKwkJCQkJICAgICAgUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7CisJCQkJYmNtYV9tYXNrMzIod2xjX2h3LT5kMTFjb3JlLAorCQkJCQlEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAogCQkJCQl+Q0NTX0ZPUkNFSFQpOwogCQkJfQogCQl9CkBAIC0xMjQ2LDcgKzEyNzAsNyBAQAogCiAJCS8qIGNoZWNrIGZhc3QgY2xvY2sgaXMgYXZhaWxhYmxlIChpZiBjb3JlIGlzIG5vdCBpbiByZXNldCkgKi8KIAkJaWYgKHdsY19ody0+Zm9yY2VmYXN0Y2xrICYmIHdsY19ody0+Y2xrKQotCQkJV0FSTl9PTighKGFpX2NvcmVfc2ZsYWdzKHdsY19ody0+c2loLCAwLCAwKSAmCisJCQlXQVJOX09OKCEoYmNtYV9hcmVhZDMyKHdsY19ody0+ZDExY29yZSwgQkNNQV9JT1NUKSAmCiAJCQkJICBTSVNGX0ZDTEtBKSk7CiAKIAkJLyoKQEAgLTEzNjMsNyArMTM4Nyw4IEBACiAJCW1hY2NvbnRyb2wgfD0gTUNUTF9JTkZSQTsKIAl9CiAKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sLCBtYWNjb250cm9sKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpLAorCQkgICAgIG1hY2NvbnRyb2wpOwogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzICovCkBAIC0xNDU3LDcgKzE0ODIsNyBAQAogYnJjbXNfYl9zZXRfYWRkcm1hdGNoKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBpbnQgbWF0Y2hfcmVnX29mZnNldCwKIAkJICAgICAgIGNvbnN0IHU4ICphZGRyKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXUxNiBtYWNfbDsKIAl1MTYgbWFjX207CiAJdTE2IG1hY19oOwpAQCAtMTQ2NSwzOCArMTQ5MCwzNiBAQAogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkOiBicmNtc19iX3NldF9hZGRybWF0Y2hcbiIsCiAJCSB3bGNfaHctPnVuaXQpOwogCi0JcmVncyA9IHdsY19ody0+cmVnczsKIAltYWNfbCA9IGFkZHJbMF0gfCAoYWRkclsxXSA8PCA4KTsKIAltYWNfbSA9IGFkZHJbMl0gfCAoYWRkclszXSA8PCA4KTsKIAltYWNfaCA9IGFkZHJbNF0gfCAoYWRkcls1XSA8PCA4KTsKIAogCS8qIGVudGVyIHRoZSBNQUMgYWRkciBpbnRvIHRoZSBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCi0JV19SRUcoJnJlZ3MtPnJjbV9jdGwsIFJDTV9JTkNfREFUQSB8IG1hdGNoX3JlZ19vZmZzZXQpOwotCVdfUkVHKCZyZWdzLT5yY21fbWF0X2RhdGEsIG1hY19sKTsKLQlXX1JFRygmcmVncy0+cmNtX21hdF9kYXRhLCBtYWNfbSk7Ci0JV19SRUcoJnJlZ3MtPnJjbV9tYXRfZGF0YSwgbWFjX2gpOwotCisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMocmNtX2N0bCksCisJCSAgICAgUkNNX0lOQ19EQVRBIHwgbWF0Y2hfcmVnX29mZnNldCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMocmNtX21hdF9kYXRhKSwgbWFjX2wpOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHJjbV9tYXRfZGF0YSksIG1hY19tKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyhyY21fbWF0X2RhdGEpLCBtYWNfaCk7CiB9CiAKIHZvaWQKIGJyY21zX2Jfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAogCQkJICAgIHZvaWQgKmJ1ZikKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgd29yZDsKIAlfX2xlMzIgd29yZF9sZTsKIAlfX2JlMzIgd29yZF9iZTsKIAlib29sIGJlX2JpdDsKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JV19SRUcoJnJlZ3MtPnRwbGF0ZXdycHRyLCBvZmZzZXQpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdycHRyKSwgb2Zmc2V0KTsKIAogCS8qIGlmIE1DVExfQklHRU5EIGJpdCBzZXQgaW4gbWFjIGNvbnRyb2wgcmVnaXN0ZXIsCiAJICogdGhlIGNoaXAgc3dhcHMgZGF0YSBpbiBmaWZvLCBhcyB3ZWxsIGFzIGRhdGEgaW4KIAkgKiB0ZW1wbGF0ZSByYW0KIAkgKi8KLQliZV9iaXQgPSAoUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9CSUdFTkQpICE9IDA7CisJYmVfYml0ID0gKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYgTUNUTF9CSUdFTkQpICE9IDA7CiAKIAl3aGlsZSAobGVuID4gMCkgewogCQltZW1jcHkoJndvcmQsIGJ1Ziwgc2l6ZW9mKHUzMikpOwpAQCAtMTUwOSw3ICsxNTMyLDcgQEAKIAkJCXdvcmQgPSAqKHUzMiAqKSZ3b3JkX2xlOwogCQl9CiAKLQkJV19SRUcoJnJlZ3MtPnRwbGF0ZXdyZGF0YSwgd29yZCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdyZGF0YSksIHdvcmQpOwogCiAJCWJ1ZiA9ICh1OCAqKSBidWYgKyBzaXplb2YodTMyKTsKIAkJbGVuIC09IHNpemVvZih1MzIpOwpAQCAtMTUyMCwxOCArMTU0MywyMCBAQAogewogCXdsY19ody0+YmFuZC0+Q1dtaW4gPSBuZXdtaW47CiAKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyLCBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX0NXTUlOKTsKLQkodm9pZClSX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyKTsKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmpkYXRhLCBuZXdtaW4pOworCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01JTik7CisJKHZvaWQpYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCBuZXdtaW4pOwogfQogCiBzdGF0aWMgdm9pZCBicmNtc19iX3NldF9jd21heChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IG5ld21heCkKIHsKIAl3bGNfaHctPmJhbmQtPkNXbWF4ID0gbmV3bWF4OwogCi0JV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01BWCk7Ci0JKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWF4KTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLAorCQkgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfQ1dNQVgpOworCSh2b2lkKWJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJYmNtYV93cml0ZTMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgbmV3bWF4KTsKIH0KIAogdm9pZCBicmNtc19iX2J3X3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGJ3KQpAQCAtMTY5NywxNyArMTcyMiwxNyBAQAogewogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCi0JYWlfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAotCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwgfjAsIDApOworCWFpX2NjX3JlZyh3bGNfaHctPnNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfYWRkciksCisJCSAgfjAsIDApOwogCXVkZWxheSgxKTsKLQlhaV9jb3JlcmVnKHdsY19ody0+c2loLCBTSV9DQ19JRFgsCi0JCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLCAweDQsIDApOworCWFpX2NjX3JlZyh3bGNfaHctPnNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksCisJCSAgMHg0LCAwKTsKIAl1ZGVsYXkoMSk7Ci0JYWlfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAotCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwgMHg0LCA0KTsKKwlhaV9jY19yZWcod2xjX2h3LT5zaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAorCQkgIDB4NCwgNCk7CiAJdWRlbGF5KDEpOwotCWFpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKLQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksIDB4NCwgMCk7CisJYWlfY2NfcmVnKHdsY19ody0+c2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKKwkJICAweDQsIDApOwogCXVkZWxheSgxKTsKIH0KIApAQCAtMTcyMSwxOCArMTc0NiwxOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoT04gPT0gY2xrKQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9GR0MsIFNJQ0ZfRkdDKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgU0lDRl9GR0MsIFNJQ0ZfRkdDKTsKIAllbHNlCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCBTSUNGX0ZHQywgMCk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfRkdDLCAwKTsKIAogfQogCiB2b2lkIGJyY21zX2JfbWFjcGh5Y2xrX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspCiB7CiAJaWYgKE9OID09IGNsaykKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CiAJZWxzZQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9NUENMS0UsIDApOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LCBTSUNGX01QQ0xLRSwgMCk7CiB9CiAKIHZvaWQgYnJjbXNfYl9waHlfcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCkBAIC0xNzUyLDcgKzE3NzcsNyBAQAogCWlmIChCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSAmJiBOUkVWX0dFKHdsY19ody0+YmFuZC0+cGh5cmV2LCAzKSAmJgogCSAgICBOUkVWX0xFKHdsY19ody0+YmFuZC0+cGh5cmV2LCA0KSkgewogCQkvKiBTZXQgdGhlIFBIWSBiYW5kd2lkdGggKi8KLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfQldNQVNLLCBwaHlfYndfY2xrYml0cyk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfQldNQVNLLCBwaHlfYndfY2xrYml0cyk7CiAKIAkJdWRlbGF5KDEpOwogCkBAIC0xNzYwLDEzICsxNzg1LDEzIEBACiAJCWJyY21zX2JfY29yZV9waHlwbGxfcmVzZXQod2xjX2h3KTsKIAogCQkvKiByZXNldCB0aGUgUEhZICovCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9QQ0xLRSksCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UpKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UpLAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFKSk7CiAJCXBoeV9pbl9yZXNldCA9IHRydWU7CiAJfSBlbHNlIHsKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UgfCBTSUNGX0JXTUFTSyksCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UgfCBwaHlfYndfY2xrYml0cykpOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgU0lDRl9CV01BU0spLAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgcGh5X2J3X2Nsa2JpdHMpKTsKIAl9CiAKIAl1ZGVsYXkoMik7CkBAIC0xNzgzLDggKzE4MDgsOCBAQAogCXUzMiBtYWNpbnRtYXNrOwogCiAJLyogRW5hYmxlIHRoZSBkMTEgY29yZSBiZWZvcmUgYWNjZXNzaW5nIGl0ICovCi0JaWYgKCFhaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpIHsKLQkJYWlfY29yZV9yZXNldCh3bGNfaHctPnNpaCwgMCwgMCk7CisJaWYgKCFiY21hX2NvcmVfaXNfZW5hYmxlZCh3bGNfaHctPmQxMWNvcmUpKSB7CisJCWJjbWFfY29yZV9lbmFibGUod2xjX2h3LT5kMTFjb3JlLCAwKTsKIAkJYnJjbXNfY19tY3RybF9yZXNldCh3bGNfaHcpOwogCX0KIApAQCAtMTgxMCw3ICsxODM1LDggQEAKIAlicmNtc19pbnRyc3Jlc3RvcmUod2xjLT53bCwgbWFjaW50bWFzayk7CiAKIAkvKiB1Y29kZSBzaG91bGQgc3RpbGwgYmUgc3VzcGVuZGVkLi4gKi8KLQlXQVJOX09OKChSX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSAhPSAwKTsKKwlXQVJOX09OKChiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJIE1DVExfRU5fTUFDKSAhPSAwKTsKIH0KIAogc3RhdGljIGJvb2wgYnJjbXNfY19pc2dvb2RjaGlwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQpAQCAtMTgzOCw3ICsxODY0LDcgQEAKIAl1aW50IGIyID0gYm9hcmRyZXYgJiAweGY7CiAKIAkvKiB2b2FyZHMgZnJvbSBvdGhlciB2ZW5kb3JzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB2YWxpZCAqLwotCWlmICh3bGNfaHctPnNpaC0+Ym9hcmR2ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkKKwlpZiAoYWlfZ2V0X2JvYXJkdmVuZG9yKHdsY19ody0+c2loKSAhPSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NKQogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qIGRvIHNvbWUgYm9hcmRyZXYgc2FuaXR5IGNoZWNrcyB3aGVuIGJvYXJkdmVuZG9yIGlzIEJyb2FkY29tICovCkBAIC0xOTEwLDcgKzE5MzYsNyBAQAogc3RhdGljIGJvb2wgYnJjbXNfYl9yYWRpb19yZWFkX2h3ZGlzYWJsZWQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCiB7CiAJYm9vbCB2LCBjbGssIHh0YWw7Ci0JdTMyIHJlc2V0Yml0cyA9IDAsIGZsYWdzID0gMDsKKwl1MzIgZmxhZ3MgPSAwOwogCiAJeHRhbCA9IHdsY19ody0+c2JjbGs7CiAJaWYgKCF4dGFsKQpAQCAtMTkyNywyMiArMTk1MywyMiBAQAogCQlmbGFncyB8PSBTSUNGX1BDTEtFOwogCiAJCS8qCisJCSAqIFRPRE86IHRlc3Qgc3VzcGVuZC9yZXN1bWUKKwkJICoKIAkJICogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24KIAkJICogaGliZXJuYXRpb24vcmVzdW1lLCBuZWVkIHN3IGZpeHVwCiAJCSAqLwotCQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpCi0JCQl3bGNfaHctPnJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCQlhaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwgMCk7Ci0JCWFpX2NvcmVfcmVzZXQod2xjX2h3LT5zaWgsIGZsYWdzLCByZXNldGJpdHMpOworCisJCWJjbWFfY29yZV9lbmFibGUod2xjX2h3LT5kMTFjb3JlLCBmbGFncyk7CiAJCWJyY21zX2NfbWN0cmxfcmVzZXQod2xjX2h3KTsKIAl9CiAKLQl2ID0gKChSX1JFRygmd2xjX2h3LT5yZWdzLT5waHlkZWJ1ZykgJiBQREJHX1JGRCkgIT0gMCk7CisJdiA9ICgoYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLAorCQkJICBEMTFSRUdPRkZTKHBoeWRlYnVnKSkgJiBQREJHX1JGRCkgIT0gMCk7CiAKIAkvKiBwdXQgY29yZSBiYWNrIGludG8gcmVzZXQgKi8KIAlpZiAoIWNsaykKLQkJYWlfY29yZV9kaXNhYmxlKHdsY19ody0+c2loLCAwKTsKKwkJYmNtYV9jb3JlX2Rpc2FibGUod2xjX2h3LT5kMTFjb3JlLCAwKTsKIAogCWlmICgheHRhbCkKIAkJYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKQEAgLTE5NjYsMjUgKzE5OTIsMjEgQEAKICAqLwogdm9pZCBicmNtc19iX2NvcmVyZXNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTMyIGZsYWdzKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CiAJdWludCBpOwogCWJvb2wgZmFzdGNsazsKLQl1MzIgcmVzZXRiaXRzID0gMDsKIAogCWlmIChmbGFncyA9PSBCUkNNU19VU0VfQ09SRUZMQUdTKQogCQlmbGFncyA9ICh3bGNfaHctPmJhbmQtPnBpID8gd2xjX2h3LT5iYW5kLT5jb3JlX2ZsYWdzIDogMCk7CiAKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KIAkvKiByZXF1ZXN0IEZBU1QgY2xvY2sgaWYgbm90IG9uICAqLwogCWZhc3RjbGsgPSB3bGNfaHctPmZvcmNlZmFzdGNsazsKIAlpZiAoIWZhc3RjbGspCiAJCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKIAogCS8qIHJlc2V0IHRoZSBkbWEgZW5naW5lcyBleGNlcHQgZmlyc3QgdGltZSB0aHJ1ICovCi0JaWYgKGFpX2lzY29yZXVwKHdsY19ody0+c2loKSkgeworCWlmIChiY21hX2NvcmVfaXNfZW5hYmxlZCh3bGNfaHctPmQxMWNvcmUpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQogCQkJaWYgKCh3bGNfaHctPmRpW2ldKSAmJiAoIWRtYV90eHJlc2V0KHdsY19ody0+ZGlbaV0pKSkKIAkJCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogJXM6ICIKQEAgLTIwMjIsMTQgKzIwNDQsMTQgQEAKIAkgKiB0aGV5IG1heSB0b3VjaCBjaGlwY29tbW9uIGFzIHdlbGwuCiAJICovCiAJd2xjX2h3LT5jbGsgPSBmYWxzZTsKLQlhaV9jb3JlX3Jlc2V0KHdsY19ody0+c2loLCBmbGFncywgcmVzZXRiaXRzKTsKKwliY21hX2NvcmVfZW5hYmxlKHdsY19ody0+ZDExY29yZSwgZmxhZ3MpOwogCXdsY19ody0+Y2xrID0gdHJ1ZTsKIAlpZiAod2xjX2h3LT5iYW5kICYmIHdsY19ody0+YmFuZC0+cGkpCiAJCXdsY19waHlfaHdfY2xrX3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCB0cnVlKTsKIAogCWJyY21zX2NfbWN0cmxfcmVzZXQod2xjX2h3KTsKIAotCWlmICh3bGNfaHctPnNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkKKwlpZiAoYWlfZ2V0X2NjY2Fwcyh3bGNfaHctPnNpaCkgJiBDQ19DQVBfUE1VKQogCQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7CiAKIAlicmNtc19iX3BoeV9yZXNldCh3bGNfaHcpOwpAQCAtMjA1MCw3ICsyMDcyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlcmV2X2ZpZm9maXh1cChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MTYgZmlmb19udTsKIAl1MTYgdHhmaWZvX3N0YXJ0YmxrID0gVFhGSUZPX1NUQVJUX0JMSywgdHhmaWZvX2VuZGJsazsKIAl1MTYgdHhmaWZvX2RlZiwgdHhmaWZvX2RlZjE7CkBAIC0yMDcxLDExICsyMDkzLDExIEBACiAJCXR4Zmlmb19jbWQgPQogCQkgICAgVFhGSUZPQ01EX1JFU0VUX01BU0sgfCAoZmlmb19udSA8PCBUWEZJRk9DTURfRklGT1NFTF9TSElGVCk7CiAKLQkJV19SRUcoJnJlZ3MtPnhtdGZpZm9jbWQsIHR4Zmlmb19jbWQpOwotCQlXX1JFRygmcmVncy0+eG10Zmlmb2RlZiwgdHhmaWZvX2RlZik7Ci0JCVdfUkVHKCZyZWdzLT54bXRmaWZvZGVmMSwgdHhmaWZvX2RlZjEpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh4bXRmaWZvY21kKSwgdHhmaWZvX2NtZCk7CisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdGZpZm9kZWYpLCB0eGZpZm9fZGVmKTsKKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10Zmlmb2RlZjEpLCB0eGZpZm9fZGVmMSk7CiAKLQkJV19SRUcoJnJlZ3MtPnhtdGZpZm9jbWQsIHR4Zmlmb19jbWQpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh4bXRmaWZvY21kKSwgdHhmaWZvX2NtZCk7CiAKIAkJdHhmaWZvX3N0YXJ0YmxrICs9IHdsY19ody0+eG10Zmlmb19zeltmaWZvX251XTsKIAl9CkBAIC0yMTEwLDI3ICsyMTMyLDI3IEBACiAKIHZvaWQgYnJjbXNfYl9zd2l0Y2hfbWFjZnJlcShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTggc3B1cm1vZGUpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAKLQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgeworCWlmICgoYWlfZ2V0X2NoaXBfaWQod2xjX2h3LT5zaWgpID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJICAgIChhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKIAkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjIpIHsJLyogMTI2TWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4MjA4Mik7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfbCksIDB4MjA4Mik7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfaCksIDB4OCk7CiAJCX0gZWxzZSBpZiAoc3B1cm1vZGUgPT0gV0xfU1BVUkFWT0lEX09OMSkgewkvKiAxMjNNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg1MzQxKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHg4KTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHg1MzQxKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHg4KTsKIAkJfSBlbHNlIHsJLyogMTIwTWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4ODg4OSk7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfbCksIDB4ODg4OSk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfaCksIDB4OCk7CiAJCX0KIAl9IGVsc2UgaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjEpIHsJLyogODJNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg3Q0UwKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHg3Q0UwKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHhDKTsKIAkJfSBlbHNlIHsJLyogODBNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHhDQ0NEKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHhDQ0NEKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHhDKTsKIAkJfQogCX0KIH0KQEAgLTIxMzksMTEgKzIxNjEsOCBAQAogc3RhdGljIHZvaWQgYnJjbXNfY19ncGlvX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOwogCXUzMiBnYywgZ207CiAKLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCiAJLyogdXNlIEdQSU8gc2VsZWN0IDAgdG8gZ2V0IGFsbCBncGlvIHNpZ25hbHMgZnJvbSB0aGUgZ3BpbyBvdXQgcmVnICovCiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsIE1DVExfR1BPVVRfU0VMX01BU0ssIDApOwogCkBAIC0yMTc0LDEwICsyMTkzLDEwIEBACiAJCSAqIFRoZSBib2FyZCBpdHNlbGYgaXMgcG93ZXJlZCBieSB0aGVzZSBHUElPcwogCQkgKiAod2hlbiBub3Qgc2VuZGluZyBwYXR0ZXJuKSBzbyBzZXQgdGhlbSBoaWdoCiAJCSAqLwotCQlPUl9SRUcoJnJlZ3MtPnBzbV9ncGlvX29lLAotCQkgICAgICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7Ci0JCU9SX1JFRygmcmVncy0+cHNtX2dwaW9fb3V0LAotCQkgICAgICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7CisJCWJjbWFfc2V0MTYod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9ncGlvX29lKSwKKwkJCSAgIChCT0FSRF9HUElPXzEyIHwgQk9BUkRfR1BJT18xMykpOworCQliY21hX3NldDE2KHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fZ3Bpb19vdXQpLAorCQkJICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7CiAKIAkJLyogRW5hYmxlIGFudGVubmEgZGl2ZXJzaXR5LCB1c2UgMng0IG1vZGUgKi8KIAkJYnJjbXNfYl9taGYod2xjX2h3LCBNSEYzLCBNSEYzX0FOVFNFTF9FTiwKQEAgLTIyMDQsNyArMjIyMyw3IEBACiBzdGF0aWMgdm9pZCBicmNtc191Y29kZV93cml0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKIAkJCSAgICAgIGNvbnN0IF9fbGUzMiB1Y29kZVtdLCBjb25zdCBzaXplX3QgbmJ5dGVzKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXVpbnQgaTsKIAl1aW50IGNvdW50OwogCkBAIC0yMjEyLDEwICsyMjMxLDExIEBACiAKIAljb3VudCA9IChuYnl0ZXMgLyBzaXplb2YodTMyKSk7CiAKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgKE9CSkFERFJfQVVUT19JTkMgfCBPQkpBRERSX1VDTV9TRUwpKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9BVVRPX0lOQyB8IE9CSkFERFJfVUNNX1NFTCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCBsZTMyX3RvX2NwdSh1Y29kZVtpXSkpOworCQliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgbGUzMl90b19jcHUodWNvZGVbaV0pKTsKIAogfQogCkBAIC0yMjgxLDcgKzIzMDEsNyBAQAogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAl1aW50IHVuaXQ7CiAJdWludCBpbnRzdGF0dXMsIGlkeDsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjX2h3LT53bGMtPndpcGh5OwogCiAJdW5pdCA9IHdsY19ody0+dW5pdDsKQEAgLTIyODksNyArMjMwOSw5IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCBORklGTzsgaWR4KyspIHsKIAkJLyogcmVhZCBpbnRzdGF0dXMgcmVnaXN0ZXIgYW5kIGlnbm9yZSBhbnkgbm9uLWVycm9yIGJpdHMgKi8KIAkJaW50c3RhdHVzID0KLQkJICAgIFJfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cykgJiBJX0VSUk9SUzsKKwkJCWJjbWFfcmVhZDMyKGNvcmUsCisJCQkJICAgIEQxMVJFR09GRlMoaW50Y3RybHJlZ3NbaWR4XS5pbnRzdGF0dXMpKSAmCisJCQlJX0VSUk9SUzsKIAkJaWYgKCFpbnRzdGF0dXMpCiAJCQljb250aW51ZTsKIApAQCAtMjMzNCw4ICsyMzU2LDkgQEAKIAkJCWJyY21zX2ZhdGFsX2Vycm9yKHdsY19ody0+d2xjLT53bCk7IC8qIGJpZyBoYW1tZXIgKi8KIAkJCWJyZWFrOwogCQl9IGVsc2UKLQkJCVdfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cywKLQkJCSAgICAgIGludHN0YXR1cyk7CisJCQliY21hX3dyaXRlMzIoY29yZSwKKwkJCQkgICAgIEQxMVJFR09GRlMoaW50Y3RybHJlZ3NbaWR4XS5pbnRzdGF0dXMpLAorCQkJCSAgICAgaW50c3RhdHVzKTsKIAl9CiB9CiAKQEAgLTIzNDMsMjggKzIzNjYsNyBAQAogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKIAl3bGMtPm1hY2ludG1hc2sgPSB3bGMtPmRlZm1hY2ludG1hc2s7Ci0JV19SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgd2xjLT5tYWNpbnRtYXNrKTsKLX0KLQotLyoKLSAqIGNhbGxiYWNrIGZvciBzaXV0aWxzLmMsIHdoaWNoIGhhcyBvbmx5IHdsYyBoYW5kbGVyLCBubyB3bCB0aGV5IGJvdGggY2hlY2sKLSAqIHVwLCBub3Qgb25seSBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gb2ZmL3Jlc3RvcmUgZDExIGludGVycnVwdCBidXQgYWxzbwotICogYmVjYXVzZSBwZXItcG9ydCBjb2RlIG1heSByZXF1aXJlIHN5bmMgd2l0aCB2YWxpZCBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyB1MzIgYnJjbXNfY193bGludHJzb2ZmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAoIXdsYy0+aHctPnVwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBicmNtc19pbnRyc29mZih3bGMtPndsKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY193bGludHJzcmVzdG9yZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUzMiBtYWNpbnRtYXNrKQotewotCWlmICghd2xjLT5ody0+dXApCi0JCXJldHVybjsKLQotCWJyY21zX2ludHJzcmVzdG9yZSh3bGMtPndsLCBtYWNpbnRtYXNrKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spLCB3bGMtPm1hY2ludG1hc2spOwogfQogCiB1MzIgYnJjbXNfY19pbnRyc29mZihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCkBAIC0yMzc3LDggKzIzNzksOCBAQAogCiAJbWFjaW50bWFzayA9IHdsYy0+bWFjaW50bWFzazsJLyogaXNyIGNhbiBzdGlsbCBoYXBwZW4gKi8KIAotCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2ssIDApOwotCSh2b2lkKVJfUkVHKCZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2spOwkvKiBzeW5jIHJlYWRiYWNrICovCisJYmNtYV93cml0ZTMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRtYXNrKSwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spKTsKIAl1ZGVsYXkoMSk7CQkvKiBlbnN1cmUgaW50IGxpbmUgaXMgbm8gbG9uZ2VyIGRyaXZlbiAqLwogCXdsYy0+bWFjaW50bWFzayA9IDA7CiAKQEAgLTIzOTMsNyArMjM5NSw3IEBACiAJCXJldHVybjsKIAogCXdsYy0+bWFjaW50bWFzayA9IG1hY2ludG1hc2s7Ci0JV19SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgd2xjLT5tYWNpbnRtYXNrKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spLCB3bGMtPm1hY2ludG1hc2spOwogfQogCiAvKiBhc3N1bWVzIHRoYXQgdGhlIGQxMSBNQUMgaXMgZW5hYmxlZCAqLwpAQCAtMjUwNSwxMSArMjUwNywxMSBAQAogc3RhdGljIGlubGluZSB1MzIgd2xjX2ludHN0YXR1cyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgaW5faXNyKQogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgbWFjaW50c3RhdHVzOwogCiAJLyogbWFjaW50c3RhdHVzIGluY2x1ZGVzIGEgRE1BIGludGVycnVwdCBzdW1tYXJ5IGJpdCAqLwotCW1hY2ludHN0YXR1cyA9IFJfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMpOworCW1hY2ludHN0YXR1cyA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjaW50c3RhdHVzKSk7CiAKIAlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IG1hY2ludHN0YXR1czogMHgleFxuIiwgd2xjX2h3LT51bml0LAogCQkgbWFjaW50c3RhdHVzKTsKQEAgLTI1MzYsMTIgKzI1MzgsMTIgQEAKIAkgKiBjb25zZXF1ZW5jZXMKIAkgKi8KIAkvKiB0dXJuIG9mZiB0aGUgaW50ZXJydXB0cyAqLwotCVdfUkVHKCZyZWdzLT5tYWNpbnRtYXNrLCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+bWFjaW50bWFzayk7CS8qIHN5bmMgcmVhZGJhY2sgKi8KKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRtYXNrKSwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRtYXNrKSk7CiAJd2xjLT5tYWNpbnRtYXNrID0gMDsKIAogCS8qIGNsZWFyIGRldmljZSBpbnRlcnJ1cHRzICovCi0JV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgbWFjaW50c3RhdHVzKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpLCBtYWNpbnRzdGF0dXMpOwogCiAJLyogTUlfRE1BSU5UIGlzIGluZGljYXRpb24gb2Ygbm9uLXplcm8gaW50c3RhdHVzICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0RNQUlOVCkKQEAgLTI1NTAsOCArMjU1Miw4IEBACiAJCSAqIFJYX0ZJRk8uIElmIE1JX0RNQUlOVCBpcyBzZXQsIGFzc3VtZSBpdAogCQkgKiBpcyBzZXQgYW5kIGNsZWFyIHRoZSBpbnRlcnJ1cHQuCiAJCSAqLwotCQlXX1JFRygmcmVncy0+aW50Y3RybHJlZ3NbUlhfRklGT10uaW50c3RhdHVzLAotCQkgICAgICBERUZfUlhJTlRNQVNLKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMoaW50Y3RybHJlZ3NbUlhfRklGT10uaW50c3RhdHVzKSwKKwkJCSAgICAgREVGX1JYSU5UTUFTSyk7CiAKIAlyZXR1cm4gbWFjaW50c3RhdHVzOwogfQpAQCAtMjYxNCw3ICsyNjE2LDcgQEAKIHZvaWQgYnJjbXNfY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCiB7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXUzMiBtYywgbWk7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdsYy0+d2lwaHk7CiAKQEAgLTI2MzEsNyArMjYzMyw3IEBACiAJLyogZm9yY2UgdGhlIGNvcmUgYXdha2UgKi8KIAlicmNtc19jX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfc2V0KHdsY19odywgQlJDTVNfV0FLRV9PVkVSUklERV9NQUNTVVNQRU5EKTsKIAotCW1jID0gUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpOworCW1jID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSk7CiAKIAlpZiAobWMgPT0gMHhmZmZmZmZmZikgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsCkBAIC0yNjQzLDcgKzI2NDUsNyBAQAogCVdBUk5fT04oIShtYyAmIE1DVExfUFNNX1JVTikpOwogCVdBUk5fT04oIShtYyAmIE1DVExfRU5fTUFDKSk7CiAKLQltaSA9IFJfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMpOworCW1pID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKTsKIAlpZiAobWkgPT0gMHhmZmZmZmZmZikgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsCiAJCQkgIF9fZnVuY19fKTsKQEAgLTI2NTQsMjEgKzI2NTYsMjEgQEAKIAogCWJyY21zX2JfbWN0cmwod2xjX2h3LCBNQ1RMX0VOX01BQywgMCk7CiAKLQlTUElOV0FJVCghKFJfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMpICYgTUlfTUFDU1NQTkREKSwKKwlTUElOV0FJVCghKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjaW50c3RhdHVzKSkgJiBNSV9NQUNTU1BOREQpLAogCQkgQlJDTVNfTUFYX01BQ19TVVNQRU5EKTsKIAotCWlmICghKFJfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMpICYgTUlfTUFDU1NQTkREKSkgeworCWlmICghKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjaW50c3RhdHVzKSkgJiBNSV9NQUNTU1BOREQpKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHdsY19zdXNwZW5kX21hY19hbmRfd2FpdDogd2FpdGVkICVkIHVTIgogCQkJICAiIGFuZCBNSV9NQUNTU1BOREQgaXMgc3RpbGwgbm90IG9uLlxuIiwKIAkJCSAgd2xjX2h3LT51bml0LCBCUkNNU19NQVhfTUFDX1NVU1BFTkQpOwogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBwc21kZWJ1ZyAweCUwOHgsIHBoeWRlYnVnIDB4JTA4eCwgIgogCQkJICAicHNtX2JyYyAweCUwNHhcbiIsIHdsY19ody0+dW5pdCwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBzbWRlYnVnKSwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBoeWRlYnVnKSwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBzbV9icmMpKTsKKwkJCSAgYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhwc21kZWJ1ZykpLAorCQkJICBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHBoeWRlYnVnKSksCisJCQkgIGJjbWFfcmVhZDE2KGNvcmUsIEQxMVJFR09GRlMocHNtX2JyYykpKTsKIAl9CiAKLQltYyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKKwltYyA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwKIAkJCSAgX19mdW5jX18pOwpAQCAtMjY4Myw3ICsyNjg1LDcgQEAKIHZvaWQgYnJjbXNfY19lbmFibGVfbWFjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJdTMyIG1jLCBtaTsKIAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogYmFuZHVuaXQgJWRcbiIsIHdsY19ody0+dW5pdCwKQEAgLTI2OTYsMjAgKzI2OTgsMjAgQEAKIAlpZiAod2xjX2h3LT5tYWNfc3VzcGVuZF9kZXB0aCA+IDApCiAJCXJldHVybjsKIAotCW1jID0gUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpOworCW1jID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSk7CiAJV0FSTl9PTihtYyAmIE1DVExfUFNNX0pNUF8wKTsKIAlXQVJOX09OKG1jICYgTUNUTF9FTl9NQUMpOwogCVdBUk5fT04oIShtYyAmIE1DVExfUFNNX1JVTikpOwogCiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsIE1DVExfRU5fTUFDLCBNQ1RMX0VOX01BQyk7Ci0JV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgTUlfTUFDU1NQTkREKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpLCBNSV9NQUNTU1BOREQpOwogCi0JbWMgPSBSX1JFRygmcmVncy0+bWFjY29udHJvbCk7CisJbWMgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAlXQVJOX09OKG1jICYgTUNUTF9QU01fSk1QXzApOwogCVdBUk5fT04oIShtYyAmIE1DVExfRU5fTUFDKSk7CiAJV0FSTl9PTighKG1jICYgTUNUTF9QU01fUlVOKSk7CiAKLQltaSA9IFJfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMpOworCW1pID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKTsKIAlXQVJOX09OKG1pICYgTUlfTUFDU1NQTkREKTsKIAogCWJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHcsCkBAIC0yNzI2LDU1ICsyNzI4LDUzIEBACiAKIHN0YXRpYyBib29sIGJyY21zX2JfdmFsaWRhdGVfY2hpcF9hY2Nlc3Moc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJdTMyIHcsIHZhbDsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjX2h3LT53bGMtPndpcGh5OwogCiAJQkNNTVNHKHdpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KIAkvKiBWYWxpZGF0ZSBkY2hpcCByZWdpc3RlciBhY2Nlc3MgKi8KIAotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JdyA9IFJfUkVHKCZyZWdzLT5vYmpkYXRhKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgT0JKQUREUl9TSE1fU0VMIHwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJdyA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSkpOwogCiAJLyogQ2FuIHdlIHdyaXRlIGFuZCByZWFkIGJhY2sgYSAzMmJpdCByZWdpc3Rlcj8gKi8KLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TSE1fU0VMIHwgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCAodTMyKSAweGFhNTU1NWFhKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgT0JKQUREUl9TSE1fU0VMIHwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSksICh1MzIpIDB4YWE1NTU1YWEpOwogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQl2YWwgPSBSX1JFRygmcmVncy0+b2JqZGF0YSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksIE9CSkFERFJfU0hNX1NFTCB8IDApOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCXZhbCA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSkpOwogCWlmICh2YWwgIT0gKHUzMikgMHhhYTU1NTVhYSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogU0hNID0gMHgleCwgIgogCQkJICAiZXhwZWN0ZWQgMHhhYTU1NTVhYVxuIiwgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQlXX1JFRygmcmVncy0+b2JqZGF0YSwgKHUzMikgMHg1NWFhYWE1NSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksIE9CSkFERFJfU0hNX1NFTCB8IDApOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCAodTMyKSAweDU1YWFhYTU1KTsKIAotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JdmFsID0gUl9SRUcoJnJlZ3MtPm9iamRhdGEpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwl2YWwgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpKTsKIAlpZiAodmFsICE9ICh1MzIpIDB4NTVhYWFhNTUpIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsICIKIAkJCSAgImV4cGVjdGVkIDB4NTVhYWFhNTVcbiIsIHdsY19ody0+dW5pdCwgdmFsKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJnJlZ3MtPm9iamRhdGEsIHcpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgdyk7CiAKIAkvKiBjbGVhciBDRlBTdGFydCAqLwotCVdfUkVHKCZyZWdzLT50c2ZfY2Zwc3RhcnQsIDApOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jZnBzdGFydCksIDApOwogCi0JdyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKKwl3ID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSk7CiAJaWYgKCh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSkpICYmCiAJICAgICh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogbWFjY29udHJvbCA9ICIKQEAgLTI3OTEsMzggKzI3OTEsMzggQEAKIAogdm9pZCBicmNtc19iX2NvcmVfcGh5cGxsX2N0bChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBvbikKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgdG1wOwogCiAJQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAl0bXAgPSAwOwotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAKIAlpZiAob24pIHsKLQkJaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7Ci0JCQlPUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QsCi0JCQkgICAgICAgKENDU19FUlNSQ19SRVFfSFQgfCBDQ1NfRVJTUkNfUkVRX0QxMVBMTCB8Ci0JCQkJQ0NTX0VSU1JDX1JFUV9QSFlQTEwpKTsKLQkJCVNQSU5XQUlUKChSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCkgJgotCQkJCSAgKENDU19FUlNSQ19BVkFJTF9IVCkpICE9IChDQ1NfRVJTUkNfQVZBSUxfSFQpLAorCQlpZiAoKGFpX2dldF9jaGlwX2lkKHdsY19ody0+c2loKSA9PSBCQ000MzEzX0NISVBfSUQpKSB7CisJCQliY21hX3NldDMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCksCisJCQkJICAgQ0NTX0VSU1JDX1JFUV9IVCB8CisJCQkJICAgQ0NTX0VSU1JDX1JFUV9EMTFQTEwgfAorCQkJCSAgIENDU19FUlNSQ19SRVFfUEhZUExMKTsKKwkJCVNQSU5XQUlUKChiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKSAmCisJCQkJICBDQ1NfRVJTUkNfQVZBSUxfSFQpICE9IENDU19FUlNSQ19BVkFJTF9IVCwKIAkJCQkgUEhZUExMX1dBSVRfVVMpOwogCi0JCQl0bXAgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7Ci0JCQlpZiAoKHRtcCAmIChDQ1NfRVJTUkNfQVZBSUxfSFQpKSAhPQotCQkJICAgIChDQ1NfRVJTUkNfQVZBSUxfSFQpKQorCQkJdG1wID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSk7CisJCQlpZiAoKHRtcCAmIENDU19FUlNSQ19BVkFJTF9IVCkgIT0gQ0NTX0VSU1JDX0FWQUlMX0hUKQogCQkJCXdpcGh5X2Vycih3bGNfaHctPndsYy0+d2lwaHksICIlczogdHVybiBvbiBQSFkiCiAJCQkJCSAgIiBQTEwgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7Ci0JCQlPUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QsCi0JCQkgICAgICAgKENDU19FUlNSQ19SRVFfRDExUExMIHwgQ0NTX0VSU1JDX1JFUV9QSFlQTEwpKTsKLQkJCVNQSU5XQUlUKChSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCkgJgorCQkJYmNtYV9zZXQzMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAorCQkJCSAgIHRtcCB8IENDU19FUlNSQ19SRVFfRDExUExMIHwKKwkJCQkgICBDQ1NfRVJTUkNfUkVRX1BIWVBMTCk7CisJCQlTUElOV0FJVCgoYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSkgJgogCQkJCSAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfAogCQkJCSAgIENDU19FUlNSQ19BVkFJTF9QSFlQTEwpKSAhPQogCQkJCSAoQ0NTX0VSU1JDX0FWQUlMX0QxMVBMTCB8CiAJCQkJICBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSwgUEhZUExMX1dBSVRfVVMpOwogCi0JCQl0bXAgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7CisJCQl0bXAgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKTsKIAkJCWlmICgodG1wICYKIAkJCSAgICAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfCBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkKIAkJCSAgICAhPQpAQCAtMjgzNiw4ICsyODM2LDkgQEAKIAkJICogYmUgcmVxdWVzdGluZyBpdDsgc28gd2UnbGwgZGVhc3NlcnQgdGhlIHJlcXVlc3QgYnV0CiAJCSAqIG5vdCB3YWl0IGZvciBzdGF0dXMgdG8gY29tcGx5LgogCQkgKi8KLQkJQU5EX1JFRygmcmVncy0+Y2xrX2N0bF9zdCwgfkNDU19FUlNSQ19SRVFfUEhZUExMKTsKLQkJdG1wID0gUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QpOworCQliY21hX21hc2szMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAorCQkJICAgIH5DQ1NfRVJTUkNfUkVRX1BIWVBMTCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCkpOwogCX0KIH0KIApAQCAtMjg2NSw3ICsyODY2LDcgQEAKIAlicmNtc19iX2NvcmVfcGh5cGxsX2N0bCh3bGNfaHcsIGZhbHNlKTsKIAogCXdsY19ody0+Y2xrID0gZmFsc2U7Ci0JYWlfY29yZV9kaXNhYmxlKHdsY19ody0+c2loLCAwKTsKKwliY21hX2NvcmVfZGlzYWJsZSh3bGNfaHctPmQxMWNvcmUsIDApOwogCXdsY19waHlfaHdfY2xrX3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCBmYWxzZSk7CiB9CiAKQEAgLTI4ODksMzUgKzI4OTAsMzEgQEAKIHN0YXRpYyB1MTYKIGJyY21zX2JfcmVhZF9vYmptZW0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MzIgc2VsKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JdTE2IF9faW9tZW0gKm9iamRhdGFfbG8gPSAodTE2IF9faW9tZW0gKikmcmVncy0+b2JqZGF0YTsKLQl1MTYgX19pb21lbSAqb2JqZGF0YV9oaSA9IG9iamRhdGFfbG8gKyAxOwotCXUxNiB2OworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKKwl1MTYgb2Jqb2ZmID0gRDExUkVHT0ZGUyhvYmpkYXRhKTsKIAotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBzZWwgfCAob2Zmc2V0ID4+IDIpKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksIHNlbCB8IChvZmZzZXQgPj4gMikpOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOwogCWlmIChvZmZzZXQgJiAyKQotCQl2ID0gUl9SRUcob2JqZGF0YV9oaSk7Ci0JZWxzZQotCQl2ID0gUl9SRUcob2JqZGF0YV9sbyk7CisJCW9iam9mZiArPSAyOwogCi0JcmV0dXJuIHY7CisJcmV0dXJuIGJjbWFfcmVhZDE2KGNvcmUsIG9iam9mZik7Cis7CiB9CiAKIHN0YXRpYyB2b2lkCiBicmNtc19iX3dyaXRlX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LAogCQkgICAgIHUzMiBzZWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKLQl1MTYgX19pb21lbSAqb2JqZGF0YV9sbyA9ICh1MTYgX19pb21lbSAqKSZyZWdzLT5vYmpkYXRhOwotCXUxNiBfX2lvbWVtICpvYmpkYXRhX2hpID0gb2JqZGF0YV9sbyArIDE7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOworCXUxNiBvYmpvZmYgPSBEMTFSRUdPRkZTKG9iamRhdGEpOwogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIHNlbCB8IChvZmZzZXQgPj4gMikpOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgc2VsIHwgKG9mZnNldCA+PiAyKSk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CiAJaWYgKG9mZnNldCAmIDIpCi0JCVdfUkVHKG9iamRhdGFfaGksIHYpOwotCWVsc2UKLQkJV19SRUcob2JqZGF0YV9sbywgdik7CisJCW9iam9mZiArPSAyOworCisJYmNtYV93cml0ZTE2KGNvcmUsIG9iam9mZiwgdik7CiB9CiAKIC8qCkBAIC0zMDAzLDE0ICszMDAwLDE0IEBACiAKIAkvKiB3cml0ZSByZXRyeSBsaW1pdCB0byBTQ1IsIHNob3VsZG4ndCBuZWVkIHRvIHN1c3BlbmQgKi8KIAlpZiAod2xjX2h3LT51cCkgewotCQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyLAotCQkgICAgICBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX1NSQ19MTVQpOwotCQkodm9pZClSX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyKTsKLQkJV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgd2xjX2h3LT5TUkwpOwotCQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyLAotCQkgICAgICBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX0xSQ19MTVQpOwotCQkodm9pZClSX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyKTsKLQkJV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgd2xjX2h3LT5MUkwpOworCQliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLAorCQkJICAgICBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX1NSQ19MTVQpOworCQkodm9pZCliY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCQliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCB3bGNfaHctPlNSTCk7CisJCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCQkgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfTFJDX0xNVCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSksIHdsY19ody0+TFJMKTsKIAl9CiB9CiAKQEAgLTMwNTcsNyArMzA1NCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCS8qIGRpc2FsbG93IFBTIHdoZW4gb25lIG9mIHRoZXNlIG1lZXRzIHdoZW4gbm90IHNjYW5uaW5nICovCi0JaWYgKHdsYy0+bW9uaXRvcikKKwlpZiAod2xjLT5maWx0ZXJfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChjZmctPmFzc29jaWF0ZWQpIHsKQEAgLTMxOTIsOSArMzE4OSw5IEBACiBzdGF0aWMgdm9pZCBicmNtc19iX2NvcmVpbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJdTMyIHNmbGFnczsKLQl1aW50IGJjbmludF91czsKKwl1MzIgYmNuaW50X3VzOwogCXVpbnQgaSA9IDA7CiAJYm9vbCBmaWZvc3pfZml4dXAgPSBmYWxzZTsKIAlpbnQgZXJyID0gMDsKQEAgLTMyMDIsOCArMzE5OSw2IEBACiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdsYy0+d2lwaHk7CiAJc3RydWN0IGJyY21zX3Vjb2RlICp1Y29kZSA9ICZ3bGNfaHctPndsYy0+d2wtPnVjb2RlOwogCi0JcmVncyA9IHdsY19ody0+cmVnczsKLQogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAogCS8qIHJlc2V0IFBTTSAqLwpAQCAtMzIxNiwyMCArMzIxMSwyMCBAQAogCWZpZm9zel9maXh1cCA9IHRydWU7CiAKIAkvKiBsZXQgdGhlIFBTTSBydW4gdG8gdGhlIHN1c3BlbmRlZCBzdGF0ZSwgc2V0IG1vZGUgdG8gQlNTIFNUQSAqLwotCVdfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMsIC0xKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpLCAtMSk7CiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsIH4wLAogCQkgICAgICAgKE1DVExfSUhSX0VOIHwgTUNUTF9JTkZSQSB8IE1DVExfUFNNX1JVTiB8IE1DVExfV0FLRSkpOwogCiAJLyogd2FpdCBmb3IgdWNvZGUgdG8gc2VsZi1zdXNwZW5kIGFmdGVyIGF1dG8taW5pdCAqLwotCVNQSU5XQUlUKCgoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApLAotCQkgMTAwMCAqIDEwMDApOwotCWlmICgoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApCisJU1BJTldBSVQoKChiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cykpICYKKwkJICAgTUlfTUFDU1NQTkREKSA9PSAwKSwgMTAwMCAqIDEwMDApOworCWlmICgoYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCkKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogd2xjX2NvcmVpbml0OiB1Y29kZSBkaWQgbm90IHNlbGYtIgogCQkJICAic3VzcGVuZCFcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlicmNtc19jX2dwaW9faW5pdCh3bGMpOwogCi0Jc2ZsYWdzID0gYWlfY29yZV9zZmxhZ3Mod2xjX2h3LT5zaWgsIDAsIDApOworCXNmbGFncyA9IGJjbWFfYXJlYWQzMihjb3JlLCBCQ01BX0lPU1QpOwogCiAJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDIzKSkgewogCQlpZiAoQlJDTVNfSVNOUEhZKHdsY19ody0+YmFuZCkpCkBAIC0zMjkzLDcgKzMyODgsNyBAQAogCQkJICB3bGNfaHctPnhtdGZpZm9fc3pbaV0sIGkpOwogCiAJLyogbWFrZSBzdXJlIHdlIGNhbiBzdGlsbCB0YWxrIHRvIHRoZSBtYWMgKi8KLQlXQVJOX09OKFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKSA9PSAweGZmZmZmZmZmKTsKKwlXQVJOX09OKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpID09IDB4ZmZmZmZmZmYpOwogCiAJLyogYmFuZC1zcGVjaWZpYyBpbml0cyBkb25lIGJ5IHdsY19ic2luaXQoKSAqLwogCkBAIC0zMzAyLDcgKzMyOTcsNyBAQAogCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9NQVhfQU5UQ05ULCBBTlRDTlQpOwogCiAJLyogZW5hYmxlIG9uZSByeCBpbnRlcnJ1cHQgcGVyIHJlY2VpdmVkIGZyYW1lICovCi0JV19SRUcoJnJlZ3MtPmludHJjdmxhenlbMF0sICgxIDw8IElSTF9GQ19TSElGVCkpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKGludHJjdmxhenlbMF0pLCAoMSA8PCBJUkxfRkNfU0hJRlQpKTsKIAogCS8qIHNldCB0aGUgc3RhdGlvbiBtb2RlIChCU1MgU1RBKSAqLwogCWJyY21zX2JfbWN0cmwod2xjX2h3LApAQCAtMzMxMSwxOSArMzMwNiwyMSBAQAogCiAJLyogc2V0IHVwIEJlYWNvbiBpbnRlcnZhbCAqLwogCWJjbmludF91cyA9IDB4ODAwMCA8PCAxMDsKLQlXX1JFRygmcmVncy0+dHNmX2NmcHJlcCwgKGJjbmludF91cyA8PCBDRlBSRVBfQ0JJX1NISUZUKSk7Ci0JV19SRUcoJnJlZ3MtPnRzZl9jZnBzdGFydCwgYmNuaW50X3VzKTsKLQlXX1JFRygmcmVncy0+bWFjaW50c3RhdHVzLCBNSV9HUDEpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jZnByZXApLAorCQkgICAgIChiY25pbnRfdXMgPDwgQ0ZQUkVQX0NCSV9TSElGVCkpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jZnBzdGFydCksIGJjbmludF91cyk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMobWFjaW50c3RhdHVzKSwgTUlfR1AxKTsKIAogCS8qIHdyaXRlIGludGVycnVwdCBtYXNrICovCi0JV19SRUcoJnJlZ3MtPmludGN0cmxyZWdzW1JYX0ZJRk9dLmludG1hc2ssIERFRl9SWElOVE1BU0spOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKGludGN0cmxyZWdzW1JYX0ZJRk9dLmludG1hc2spLAorCQkgICAgIERFRl9SWElOVE1BU0spOwogCiAJLyogYWxsb3cgdGhlIE1BQyB0byBjb250cm9sIHRoZSBQSFkgY2xvY2sgKGR5bmFtaWMgb24vb2ZmKSAqLwogCWJyY21zX2JfbWFjcGh5Y2xrX3NldCh3bGNfaHcsIE9OKTsKIAogCS8qIHByb2dyYW0gZHluYW1pYyBjbG9jayBjb250cm9sIGZhc3QgcG93ZXJ1cCBkZWxheSByZWdpc3RlciAqLwogCXdsYy0+ZmFzdHB3cnVwX2RseSA9IGFpX2Nsa2N0bF9mYXN0X3B3cnVwX2RlbGF5KHdsY19ody0+c2loKTsKLQlXX1JFRygmcmVncy0+c2NjX2Zhc3Rwd3J1cF9kbHksIHdsYy0+ZmFzdHB3cnVwX2RseSk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoc2NjX2Zhc3Rwd3J1cF9kbHkpLCB3bGMtPmZhc3Rwd3J1cF9kbHkpOwogCiAJLyogdGVsbCB0aGUgdWNvZGUgdGhlIGNvcmVyZXYgKi8KIAlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fTUFDSFdfVkVSLCAodTE2KSB3bGNfaHctPmNvcmVyZXYpOwpAQCAtMzMzNiwxOSArMzMzMywyMSBAQAogCQkJCSAgICAgIG1hY2h3Y2FwID4+IDE2KSAmIDB4ZmZmZikpOwogCiAJLyogd3JpdGUgcmV0cnkgbGltaXRzIHRvIFNDUiwgdGhpcyBkb25lIGFmdGVyIFBTTSBpbml0ICovCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfU1JDX0xNVCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCB3bGNfaHctPlNSTCk7Ci0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfTFJDX0xNVCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCB3bGNfaHctPkxSTCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9TUkNfTE1UKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgd2xjX2h3LT5TUkwpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLAorCQkgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfTFJDX0xNVCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSksIHdsY19ody0+TFJMKTsKIAogCS8qIHdyaXRlIHJhdGUgZmFsbGJhY2sgcmV0cnkgbGltaXRzICovCiAJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX1NGUk1UWENOVEZCUlRIU0QsIHdsY19ody0+U0ZCTCk7CiAJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX0xGUk1UWENOVEZCUlRIU0QsIHdsY19ody0+TEZCTCk7CiAKLQlBTkRfUkVHKCZyZWdzLT5pZnNfY3RsLCAweDBGRkYpOwotCVdfUkVHKCZyZWdzLT5pZnNfYWlmc24sIEVEQ0ZfQUlGU05fTUlOKTsKKwliY21hX21hc2sxNihjb3JlLCBEMTFSRUdPRkZTKGlmc19jdGwpLCAweDBGRkYpOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKGlmc19haWZzbiksIEVEQ0ZfQUlGU05fTUlOKTsKIAogCS8qIGluaXQgdGhlIHR4IGRtYSBlbmdpbmVzICovCiAJZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspIHsKQEAgLTM1NzYsNDIgKzM1NzUsMzIgQEAKIAlicmNtc19jX3NldF9waHlfY2hhbnNwZWMod2xjLCBjaGFuc3BlYyk7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAod2xjLT5iY25taXNjX21vbml0b3IpCi0JCWJyY21zX2JfbWN0cmwod2xjLT5odywgTUNUTF9CQ05TX1BST01JU0MsIE1DVExfQkNOU19QUk9NSVNDKTsKLQllbHNlCi0JCWJyY21zX2JfbWN0cmwod2xjLT5odywgTUNUTF9CQ05TX1BST01JU0MsIDApOwotfQotCi12b2lkIGJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgcHJvbWlzYykKLXsKLQl3bGMtPmJjbm1pc2NfbW9uaXRvciA9IHByb21pc2M7Ci0JYnJjbXNfY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKLX0KLQotLyogc2V0IG9yIGNsZWFyIG1hY2NvbnRyb2wgYml0cyBNQ1RMX1BST01JU0MgYW5kIE1DVExfS0VFUENPTlRST0wgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfbWFjX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQorLyoKKyAqIFNldCBvciBjbGVhciBmaWx0ZXJpbmcgcmVsYXRlZCBtYWNjb250cm9sIGJpdHMgYmFzZWQgb24KKyAqIHNwZWNpZmllZCBmaWx0ZXIgZmxhZ3MKKyAqLwordm9pZCBicmNtc19jX21hY19wcm9taXNjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBmaWx0ZXJfZmxhZ3MpCiB7CiAJdTMyIHByb21pc2NfYml0cyA9IDA7CiAKLQkvKgotCSAqIHByb21pc2N1b3VzIG1vZGUganVzdCBzZXRzIE1DVExfUFJPTUlTQwotCSAqIE5vdGU6IEFQcyBnZXQgYWxsIEJTUyB0cmFmZmljIHdpdGhvdXQgdGhlIG5lZWQgdG8gc2V0Ci0JICogdGhlIE1DVExfUFJPTUlTQyBiaXQgc2luY2UgYWxsIEJTUyBkYXRhIHRyYWZmaWMgaXMKLQkgKiBkaXJlY3RlZCBhdCB0aGUgQVAKLQkgKi8KLQlpZiAod2xjLT5wdWItPnByb21pc2MpCisJd2xjLT5maWx0ZXJfZmxhZ3MgPSBmaWx0ZXJfZmxhZ3M7CisKKwlpZiAoZmlsdGVyX2ZsYWdzICYgKEZJRl9QUk9NSVNDX0lOX0JTUyB8IEZJRl9PVEhFUl9CU1MpKQogCQlwcm9taXNjX2JpdHMgfD0gTUNUTF9QUk9NSVNDOwogCi0JLyogbW9uaXRvciBtb2RlIG5lZWRzIGJvdGggTUNUTF9QUk9NSVNDIGFuZCBNQ1RMX0tFRVBDT05UUk9MCi0JICogTm90ZTogbW9uaXRvciBtb2RlIGFsc28gbmVlZHMgTUNUTF9CQ05TX1BST01JU0MsIGJ1dCB0aGF0IGlzCi0JICogaGFuZGxlZCBpbiBicmNtc19jX21hY19iY25fcHJvbWlzYygpCi0JICovCi0JaWYgKHdsYy0+bW9uaXRvcikKLQkJcHJvbWlzY19iaXRzIHw9IE1DVExfUFJPTUlTQyB8IE1DVExfS0VFUENPTlRST0w7CisJaWYgKGZpbHRlcl9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCQlwcm9taXNjX2JpdHMgfD0gTUNUTF9CQ05TX1BST01JU0M7CiAKLQlicmNtc19iX21jdHJsKHdsYy0+aHcsIE1DVExfUFJPTUlTQyB8IE1DVExfS0VFUENPTlRST0wsIHByb21pc2NfYml0cyk7CisJaWYgKGZpbHRlcl9mbGFncyAmIEZJRl9GQ1NGQUlMKQorCQlwcm9taXNjX2JpdHMgfD0gTUNUTF9LRUVQQkFERkNTOworCisJaWYgKGZpbHRlcl9mbGFncyAmIChGSUZfQ09OVFJPTCB8IEZJRl9QU1BPTEwpKQorCQlwcm9taXNjX2JpdHMgfD0gTUNUTF9LRUVQQ09OVFJPTDsKKworCWJyY21zX2JfbWN0cmwod2xjLT5odywKKwkJTUNUTF9QUk9NSVNDIHwgTUNUTF9CQ05TX1BST01JU0MgfAorCQlNQ1RMX0tFRVBDT05UUk9MIHwgTUNUTF9LRUVQQkFERkNTLAorCQlwcm9taXNjX2JpdHMpOwogfQogCiAvKgpAQCAtMzY0MSwxMCArMzYzMCw2IEBACiAJfSBlbHNlIHsKIAkJLyogZGlzYWJsZSBhbiBhY3RpdmUgSUJTUyBpZiB3ZSBhcmUgbm90IG9uIHRoZSBob21lIGNoYW5uZWwgKi8KIAl9Ci0KLQkvKiB1cGRhdGUgdGhlIHZhcmlvdXMgcHJvbWlzYyBiaXRzICovCi0JYnJjbXNfY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKLQlicmNtc19jX21hY19wcm9taXNjKHdsYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJyY21zX2Nfd3JpdGVfcmF0ZV9zaG0oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1OCByYXRlLApAQCAtMzgxOSw3ICszODA0LDcgQEAKIAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogaHBzICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgaHBzKTsKIAotCXYxID0gUl9SRUcoJndsYy0+cmVncy0+bWFjY29udHJvbCk7CisJdjEgPSBiY21hX3JlYWQzMih3bGMtPmh3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAl2MiA9IE1DVExfV0FLRTsKIAlpZiAoaHBzKQogCQl2MiB8PSBNQ1RMX0hQUzsKQEAgLTQxMjUsNyArNDExMCw3IEBACiAJICAgIEVEQ0ZfVFhPUDJVU0VDKGFjcF9zaG0udHhvcCk7CiAJYWNwX3NobS5haWZzID0gKHBhcmFtcy0+YWlmcyAmIEVEQ0ZfQUlGU05fTUFTSyk7CiAKLQlpZiAoYWNpID09IEFDX1ZJICYmIGFjcF9zaG0udHhvcCA9PSAwCisJaWYgKGFjaSA9PSBJRUVFODAyMTFfQUNfVkkgJiYgYWNwX3NobS50eG9wID09IDAKIAkgICAgJiYgYWNwX3NobS5haWZzIDwgRURDRl9BSUZTTl9NQVgpCiAJCWFjcF9zaG0uYWlmcysrOwogCkBAIC00MTM4LDcgKzQxMjMsOCBAQAogCQlhY3Bfc2htLmN3bWF4ID0gcGFyYW1zLT5jd19tYXg7CiAJCWFjcF9zaG0uY3djdXIgPSBhY3Bfc2htLmN3bWluOwogCQlhY3Bfc2htLmJzbG90cyA9Ci0JCSAgICBSX1JFRygmd2xjLT5yZWdzLT50c2ZfcmFuZG9tKSAmIGFjcF9zaG0uY3djdXI7CisJCQliY21hX3JlYWQxNih3bGMtPmh3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKHRzZl9yYW5kb20pKSAmCisJCQlhY3Bfc2htLmN3Y3VyOwogCQlhY3Bfc2htLnJlZ2dhcCA9IGFjcF9zaG0uYnNsb3RzICsgYWNwX3NobS5haWZzOwogCQkvKiBJbmRpY2F0ZSB0aGUgbmV3IHBhcmFtcyB0byB0aGUgdWNvZGUgKi8KIAkJYWNwX3NobS5zdGF0dXMgPSBicmNtc19iX3JlYWRfc2htKHdsYy0+aHcsIChNX0VEQ0ZfUUlORk8gKwpAQCAtNDE3NSw3ICs0MTYxLDcgQEAKIAl9OyAvKiB1Y29kZSBuZWVkcyB0aGVzZSBwYXJhbWV0ZXJzIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24gKi8KIAljb25zdCBzdHJ1Y3QgZWRjZl9hY3BhcmFtICplZGNmX2FjcCA9ICZkZWZhdWx0X2VkY2ZfYWNwYXJhbXNbMF07CiAKLQlmb3IgKGlfYWMgPSAwOyBpX2FjIDwgQUNfQ09VTlQ7IGlfYWMrKywgZWRjZl9hY3ArKykgeworCWZvciAoaV9hYyA9IDA7IGlfYWMgPCBJRUVFODAyMTFfTlVNX0FDUzsgaV9hYysrLCBlZGNmX2FjcCsrKSB7CiAJCS8qIGZpbmQgb3V0IHdoaWNoIGFjIHRoaXMgc2V0IG9mIHBhcmFtcyBhcHBsaWVzIHRvICovCiAJCWFjaSA9IChlZGNmX2FjcC0+QUNJICYgRURDRl9BQ0lfTUFTSykgPj4gRURDRl9BQ0lfU0hJRlQ7CiAKQEAgLTQ0NDYsMjEgKzQ0MzIsMjEgQEAKICAqICAgIGluaXRpYWxpemUgc29mdHdhcmUgc3RhdGUgZm9yIGVhY2ggY29yZSBhbmQgYmFuZAogICogICAgcHV0IHRoZSB3aG9sZSBjaGlwIGluIHJlc2V0KGRyaXZlciBkb3duIHN0YXRlKSwgbm8gY2xvY2sKICAqLwotc3RhdGljIGludCBicmNtc19iX2F0dGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsCi0JCQkgIHVpbnQgdW5pdCwgYm9vbCBwaW9tb2RlLCB2b2lkIF9faW9tZW0gKnJlZ3N2YSwKLQkJCSAgc3RydWN0IHBjaV9kZXYgKmJ0cGFyYW0pCitzdGF0aWMgaW50IGJyY21zX2JfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLAorCQkJICB1aW50IHVuaXQsIGJvb2wgcGlvbW9kZSkKIHsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOwogCWNoYXIgKm1hY2FkZHIgPSBOVUxMOwogCXVpbnQgZXJyID0gMDsKIAl1aW50IGo7CiAJYm9vbCB3bWUgPSBmYWxzZTsKIAlzdHJ1Y3Qgc2hhcmVkX3BoeV9wYXJhbXMgc2hhX3BhcmFtczsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29yZS0+YnVzLT5ob3N0X3BjaTsKIAotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIHZlbmRvciwKLQkJZGV2aWNlKTsKKwlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHZlbmRvciAweCV4IGRldmljZSAweCV4XG4iLCB1bml0LAorCSAgICAgICBwY2lkZXYtPnZlbmRvciwKKwkgICAgICAgcGNpZGV2LT5kZXZpY2UpOwogCiAJd21lID0gdHJ1ZTsKIApAQCAtNDQ3Nyw3ICs0NDYzLDcgQEAKIAkgKiBEbyB0aGUgaGFyZHdhcmUgcG9ydGlvbiBvZiB0aGUgYXR0YWNoLiBBbHNvIGluaXRpYWxpemUgc29mdHdhcmUKIAkgKiBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIHBhcnRpY3VsYXIgaGFyZHdhcmUgd2UgYXJlIHJ1bm5pbmcuCiAJICovCi0Jd2xjX2h3LT5zaWggPSBhaV9hdHRhY2gocmVnc3ZhLCBidHBhcmFtKTsKKwl3bGNfaHctPnNpaCA9IGFpX2F0dGFjaChjb3JlLT5idXMpOwogCWlmICh3bGNfaHctPnNpaCA9PSBOVUxMKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBzaV9hdHRhY2ggZmFpbGVkXG4iLAogCQkJICB1bml0KTsKQEAgLTQ0ODYsMjUgKzQ0NzIsMTkgQEAKIAl9CiAKIAkvKiB2ZXJpZnkgYWdhaW4gdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKi8KLQlpZiAoIWJyY21zX2NfY2hpcG1hdGNoKHZlbmRvciwgZGV2aWNlKSkgeworCWlmICghYnJjbXNfY19jaGlwbWF0Y2gocGNpZGV2LT52ZW5kb3IsIHBjaWRldi0+ZGV2aWNlKSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogVW5zdXBwb3J0ZWQgIgogCQkJInZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsCi0JCQkgdW5pdCwgdmVuZG9yLCBkZXZpY2UpOworCQkJIHVuaXQsIHBjaWRldi0+dmVuZG9yLCBwY2lkZXYtPmRldmljZSk7CiAJCWVyciA9IDEyOwogCQlnb3RvIGZhaWw7CiAJfQogCi0Jd2xjX2h3LT52ZW5kb3JpZCA9IHZlbmRvcjsKLQl3bGNfaHctPmRldmljZWlkID0gZGV2aWNlOworCXdsY19ody0+dmVuZG9yaWQgPSBwY2lkZXYtPnZlbmRvcjsKKwl3bGNfaHctPmRldmljZWlkID0gcGNpZGV2LT5kZXZpY2U7CiAKLQkvKiBzZXQgYmFyMCB3aW5kb3cgdG8gcG9pbnQgYXQgRDExIGNvcmUgKi8KLQl3bGNfaHctPnJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCWFpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELCAwKTsKLQl3bGNfaHctPmNvcmVyZXYgPSBhaV9jb3JlcmV2KHdsY19ody0+c2loKTsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQl3bGMtPnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJd2xjX2h3LT5kMTFjb3JlID0gY29yZTsKKwl3bGNfaHctPmNvcmVyZXYgPSBjb3JlLT5pZC5yZXY7CiAKIAkvKiB2YWxpZGF0ZSBjaGlwLCBjaGlwcmV2IGFuZCBjb3JlcmV2ICovCiAJaWYgKCFicmNtc19jX2lzZ29vZGNoaXAod2xjX2h3KSkgewpAQCAtNDUzOSw4ICs0NTE5LDkgQEAKIAl3bGNfaHctPmJvYXJkcmV2ID0gKHUxNikgajsKIAlpZiAoIWJyY21zX2NfdmFsaWRib2FyZHR5cGUod2xjX2h3KSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogVW5zdXBwb3J0ZWQgQnJvYWRjb20gIgotCQkJImJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKLQkJCSB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KTsKKwkJCSAgImJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKKwkJCSAgdW5pdCwgYWlfZ2V0X2JvYXJkdHlwZSh3bGNfaHctPnNpaCksCisJCQkgIHdsY19ody0+Ym9hcmRyZXYpOwogCQllcnIgPSAxNTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTQ1NjEsNyArNDU0Miw3IEBACiAJZWxzZQogCQl3bGNfaHctPl9uYmFuZHMgPSAxOwogCi0JaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkKKwlpZiAoKGFpX2dldF9jaGlwX2lkKHdsY19ody0+c2loKSA9PSBCQ000MzIyNV9DSElQX0lEKSkKIAkJd2xjX2h3LT5fbmJhbmRzID0gMTsKIAogCS8qIEJNQUNfTk9URTogcmVtb3ZlIGluaXQgb2YgcHViIHZhbHVlcyB3aGVuIGJyY21zX2NfYXR0YWNoKCkKQEAgLTQ1OTMsMTYgKzQ1NzQsMTQgQEAKIAlzaGFfcGFyYW1zLmNvcmVyZXYgPSB3bGNfaHctPmNvcmVyZXY7CiAJc2hhX3BhcmFtcy52aWQgPSB3bGNfaHctPnZlbmRvcmlkOwogCXNoYV9wYXJhbXMuZGlkID0gd2xjX2h3LT5kZXZpY2VpZDsKLQlzaGFfcGFyYW1zLmNoaXAgPSB3bGNfaHctPnNpaC0+Y2hpcDsKLQlzaGFfcGFyYW1zLmNoaXByZXYgPSB3bGNfaHctPnNpaC0+Y2hpcHJldjsKLQlzaGFfcGFyYW1zLmNoaXBwa2cgPSB3bGNfaHctPnNpaC0+Y2hpcHBrZzsKKwlzaGFfcGFyYW1zLmNoaXAgPSBhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCk7CisJc2hhX3BhcmFtcy5jaGlwcmV2ID0gYWlfZ2V0X2NoaXByZXYod2xjX2h3LT5zaWgpOworCXNoYV9wYXJhbXMuY2hpcHBrZyA9IGFpX2dldF9jaGlwcGtnKHdsY19ody0+c2loKTsKIAlzaGFfcGFyYW1zLnNyb21yZXYgPSB3bGNfaHctPnNyb21yZXY7Ci0Jc2hhX3BhcmFtcy5ib2FyZHR5cGUgPSB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlOworCXNoYV9wYXJhbXMuYm9hcmR0eXBlID0gYWlfZ2V0X2JvYXJkdHlwZSh3bGNfaHctPnNpaCk7CiAJc2hhX3BhcmFtcy5ib2FyZHJldiA9IHdsY19ody0+Ym9hcmRyZXY7Ci0Jc2hhX3BhcmFtcy5ib2FyZHZlbmRvciA9IHdsY19ody0+c2loLT5ib2FyZHZlbmRvcjsKIAlzaGFfcGFyYW1zLmJvYXJkZmxhZ3MgPSB3bGNfaHctPmJvYXJkZmxhZ3M7CiAJc2hhX3BhcmFtcy5ib2FyZGZsYWdzMiA9IHdsY19ody0+Ym9hcmRmbGFnczI7Ci0Jc2hhX3BhcmFtcy5idXNjb3JlcmV2ID0gd2xjX2h3LT5zaWgtPmJ1c2NvcmVyZXY7CiAKIAkvKiBhbGxvYyBhbmQgc2F2ZSBwb2ludGVyIHRvIHNoYXJlZCBwaHkgc3RhdGUgYXJlYSAqLwogCXdsY19ody0+cGh5X3NoID0gd2xjX3BoeV9zaGFyZWRfYXR0YWNoKCZzaGFfcGFyYW1zKTsKQEAgLTQ2MjQsOSArNDYwMyw5IEBACiAJCXdsY19ody0+YmFuZC0+YmFuZHR5cGUgPSBqID8gQlJDTV9CQU5EXzVHIDogQlJDTV9CQU5EXzJHOwogCQl3bGMtPmJhbmQtPmJhbmR1bml0ID0gajsKIAkJd2xjLT5iYW5kLT5iYW5kdHlwZSA9IGogPyBCUkNNX0JBTkRfNUcgOiBCUkNNX0JBTkRfMkc7Ci0JCXdsYy0+Y29yZS0+Y29yZWlkeCA9IGFpX2NvcmVpZHgod2xjX2h3LT5zaWgpOworCQl3bGMtPmNvcmUtPmNvcmVpZHggPSBjb3JlLT5jb3JlX2luZGV4OwogCi0JCXdsY19ody0+bWFjaHdjYXAgPSBSX1JFRygmcmVncy0+bWFjaHdjYXApOworCQl3bGNfaHctPm1hY2h3Y2FwID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNod2NhcCkpOwogCQl3bGNfaHctPm1hY2h3Y2FwX2JhY2t1cCA9IHdsY19ody0+bWFjaHdjYXA7CiAKIAkJLyogaW5pdCB0eCBmaWZvIHNpemUgKi8KQEAgLTQ2MzUsNyArNDYxNCw3IEBACiAKIAkJLyogR2V0IGEgcGh5IGZvciB0aGlzIGJhbmQgKi8KIAkJd2xjX2h3LT5iYW5kLT5waSA9Ci0JCQl3bGNfcGh5X2F0dGFjaCh3bGNfaHctPnBoeV9zaCwgcmVncywKKwkJCXdsY19waHlfYXR0YWNoKHdsY19ody0+cGh5X3NoLCBjb3JlLAogCQkJCSAgICAgICB3bGNfaHctPmJhbmQtPmJhbmR0eXBlLAogCQkJCSAgICAgICB3bGMtPndpcGh5KTsKIAkJaWYgKHdsY19ody0+YmFuZC0+cGkgPT0gTlVMTCkgewpAQCAtNDcwOSwxMCArNDY4OCw2IEBACiAJLyogTWF0Y2ggZHJpdmVyICJkb3duIiBzdGF0ZSAqLwogCWFpX3BjaV9kb3duKHdsY19ody0+c2loKTsKIAotCS8qIHJlZ2lzdGVyIHNiIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQlhaV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHdsY19ody0+c2loLCAodm9pZCAqKWJyY21zX2Nfd2xpbnRyc29mZiwKLQkJCQkgICh2b2lkICopYnJjbXNfY193bGludHJzcmVzdG9yZSwgTlVMTCwgd2xjKTsKLQogCS8qIHR1cm4gb2ZmIHBsbCBhbmQgeHRhbCB0byBtYXRjaCBkcml2ZXIgImRvd24iIHN0YXRlICovCiAJYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKIApAQCAtNDc0MywxMCArNDcxOCw5IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlCQ01NU0cod2xjLT53aXBoeSwKLQkJICJkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAotCQkgd2xjX2h3LT5kZXZpY2VpZCwgd2xjX2h3LT5fbmJhbmRzLAotCQkgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcik7CisJQkNNTVNHKHdsYy0+d2lwaHksICJkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAorCSAgICAgICB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsIGFpX2dldF9ib2FyZHR5cGUod2xjX2h3LT5zaWgpLAorCSAgICAgICBtYWNhZGRyKTsKIAogCXJldHVybiBlcnI7CiAKQEAgLTQ5ODQsNyArNDk1OCw2IEBACiAJCSAqIGFuZCBwZXItcG9ydCBpbnRlcnJ1cHQgb2JqZWN0IG1heSBoYXMgYmVlbiBmcmVlZC4gdGhpcyBtdXN0CiAJCSAqIGJlIGRvbmUgYmVmb3JlIHNiIGNvcmUgc3dpdGNoCiAJCSAqLwotCQlhaV9kZXJlZ2lzdGVyX2ludHJfY2FsbGJhY2sod2xjX2h3LT5zaWgpOwogCQlhaV9wY2lfc2xlZXAod2xjX2h3LT5zaWgpOwogCX0KIApAQCAtNTA3OSwxMyArNTA1MiwxMSBAQAogCWFpX3BjaV9maXhjZmcod2xjX2h3LT5zaWgpOwogCiAJLyoKKwkgKiBUT0RPOiB0ZXN0IHN1c3BlbmQvcmVzdW1lCisJICoKIAkgKiBBSSBjaGlwIGRvZXNuJ3QgcmVzdG9yZSBiYXIwd2luMiBvbgogCSAqIGhpYmVybmF0aW9uL3Jlc3VtZSwgbmVlZCBzdyBmaXh1cAogCSAqLwotCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKQotCQl3bGNfaHctPnJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCWFpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELCAwKTsKIAogCS8qCiAJICogSW5mb3JtIHBoeSB0aGF0IGEgUE9SIHJlc2V0IGhhcyBvY2N1cnJlZCBzbwpAQCAtNTA5Nyw3ICs1MDY4LDcgQEAKIAl3bGNfaHctPndsYy0+cHViLT5od191cCA9IHRydWU7CiAKIAlpZiAoKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CisJICAgICYmIChhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCkgPT0gQkNNNDMxM19DSElQX0lEKSkgewogCQlpZiAoIQogCQkgICAgKHdsY19ody0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAgJiYgKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpKSkKQEAgLTUxNzIsNyArNTE0Myw3IEBACiAJaWYgKCF3bGMtPmNsaykKIAkJcmV0dXJuOwogCi0JZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspCisJZm9yIChhYyA9IDA7IGFjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGFjKyspCiAJCWJyY21zX2Jfd3JpdGVfc2htKHdsYy0+aHcsIE1fQUNfVFhMTVRfQUREUihhYyksCiAJCQkJICB3bGMtPndtZV9yZXRyaWVzW2FjXSk7CiB9CkBAIC01MTkyLDcgKzUxNjMsNyBAQAogCX0KIAogCWlmICgod2xjLT5wdWItPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKQotCSAgICAmJiAod2xjLT5wdWItPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CisJICAgICYmIChhaV9nZXRfY2hpcF9pZCh3bGMtPmh3LT5zaWgpID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKIAkJaWYgKHdsYy0+cHViLT5ib2FyZHJldiA+PSAweDEyNTAKIAkJICAgICYmICh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpKQogCQkJYnJjbXNfYl9taGYod2xjLT5odywgTUhGNSwgTUhGNV80MzEzX0dQSU9DVFJMLApAQCAtNTMyOSw5ICs1MzAwLDkgQEAKIAl9IGVsc2UgewogCiAJCS8qIFJlc2V0IGFuZCBkaXNhYmxlIHRoZSBjb3JlICovCi0JCWlmIChhaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpIHsKLQkJCWlmIChSX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sKSAmCi0JCQkgICAgTUNUTF9FTl9NQUMpCisJCWlmIChiY21hX2NvcmVfaXNfZW5hYmxlZCh3bGNfaHctPmQxMWNvcmUpKSB7CisJCQlpZiAoYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLAorCQkJCQlEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmIE1DVExfRU5fTUFDKQogCQkJCWJyY21zX2Nfc3VzcGVuZF9tYWNfYW5kX3dhaXQod2xjX2h3LT53bGMpOwogCQkJY2FsbGJhY2tzICs9IGJyY21zX3Jlc2V0KHdsY19ody0+d2xjLT53bCk7CiAJCQlicmNtc19jX2NvcmVkaXNhYmxlKHdsY19odyk7CkBAIC01NjQ3LDcgKzU2MTgsNyBAQAogCiAJYnJjbXNfYl9yZXRyeWxpbWl0X3VwZCh3bGMtPmh3LCB3bGMtPlNSTCwgd2xjLT5MUkwpOwogCi0JZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspIHsKKwlmb3IgKGFjID0gMDsgYWMgPCBJRUVFODAyMTFfTlVNX0FDUzsgYWMrKykgewogCQl3bGMtPndtZV9yZXRyaWVzW2FjXSA9CVNGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwKIAkJCQkJICAgICAgIEVEQ0ZfU0hPUlQsICB3bGMtPlNSTCk7CiAJCXdsYy0+d21lX3JldHJpZXNbYWNdID0JU0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbYWNdLApAQCAtNjcwOSw3ICs2NjgwLDcgQEAKIAlxb3MgPSBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaC0+ZnJhbWVfY29udHJvbCk7CiAKIAkvKiBjb21wdXRlIGxlbmd0aCBvZiBmcmFtZSBpbiBieXRlcyBmb3IgdXNlIGluIFBMQ1AgY29tcHV0YXRpb25zICovCi0JbGVuID0gYnJjbXVfcGt0dG90bGVuKHApOworCWxlbiA9IHAtPmxlbjsKIAlwaHlsZW4gPSBsZW4gKyBGQ1NfTEVOOwogCiAJLyogR2V0IHR4X2luZm8gKi8KQEAgLTc0ODgsMTEgKzc0NTksMTEgQEAKIGJyY21zX2JfcmVhZF90c2Yoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAogCQkgIHUzMiAqdHNmX2hfcHRyKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCiAJLyogcmVhZCB0aGUgdHNmIHRpbWVyIGxvdywgdGhlbiBoaWdoIHRvIGdldCBhbiBhdG9taWMgcmVhZCAqLwotCSp0c2ZfbF9wdHIgPSBSX1JFRygmcmVncy0+dHNmX3RpbWVybG93KTsKLQkqdHNmX2hfcHRyID0gUl9SRUcoJnJlZ3MtPnRzZl90aW1lcmhpZ2gpOworCSp0c2ZfbF9wdHIgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl90aW1lcmxvdykpOworCSp0c2ZfaF9wdHIgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl90aW1lcmhpZ2gpKTsKIH0KIAogLyoKQEAgLTgwODAsMTQgKzgwNTEsOCBAQAogCWxlbiA9IHAtPmxlbjsKIAogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19GQ1NFUlIpIHsKLQkJaWYgKHdsYy0+cHViLT5tYWM4MDIxMV9zdGF0ZSAmIE1BQzgwMjExX1BST01JU0NfQkNOUykgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJGQ1NFUlIgd2hpbGUgc2Nhbm5pbmcqKioqKioqIC0iCi0JCQkJICAiIHRvc3NpbmdcbiIpOworCQlpZiAoISh3bGMtPmZpbHRlcl9mbGFncyAmIEZJRl9GQ1NGQUlMKSkKIAkJCWdvdG8gdG9zczsKLQkJfSBlbHNlIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiUkNTRVJSISEhXG4iKTsKLQkJCWdvdG8gdG9zczsKLQkJfQogCX0KIAogCS8qIGNoZWNrIHJlY2VpdmVkIHBrdCBoYXMgYXQgbGVhc3QgZnJhbWUgY29udHJvbCBmaWVsZCAqLwpAQCAtODE3MSw3ICs4MTM2LDcgQEAKIHsKIAl1MzIgbWFjaW50c3RhdHVzOwogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKIAogCWlmIChicmNtc19kZXZpY2VyZW1vdmVkKHdsYykpIHsKQEAgLTgyMDcsNyArODE3Miw3IEBACiAJLyogQVRJTSB3aW5kb3cgZW5kICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0FUSU1XSU5FTkQpIHsKIAkJQkNNTVNHKHdsYy0+d2lwaHksICJlbmQgb2YgQVRJTSB3aW5kb3dcbiIpOwotCQlPUl9SRUcoJnJlZ3MtPm1hY2NvbW1hbmQsIHdsYy0+cXZhbGlkKTsKKwkJYmNtYV9zZXQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLCB3bGMtPnF2YWxpZCk7CiAJCXdsYy0+cXZhbGlkID0gMDsKIAl9CiAKQEAgLTgyMjUsMTcgKzgxOTAsMTcgQEAKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogUFNNIG1pY3JvY29kZSB3YXRjaGRvZyBmaXJlZCBhdCAlZCAiCi0JCQkiKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLCB3bGNfaHctPnVuaXQsIHdsY19ody0+bm93KTsKKwkJCSAgIihzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdyk7CiAKIAkJcHJpbnRrX29uY2UoIiVzIDogUFNNIFdhdGNoZG9nLCBjaGlwaWQgMHgleCwgY2hpcHJldiAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgd2xjX2h3LT5zaWgtPmNoaXAsCi0JCQkJCXdsY19ody0+c2loLT5jaGlwcmV2KTsKKwkJCSAgICBfX2Z1bmNfXywgYWlfZ2V0X2NoaXBfaWQod2xjX2h3LT5zaWgpLAorCQkJICAgIGFpX2dldF9jaGlwcmV2KHdsY19ody0+c2loKSk7CiAJCWJyY21zX2ZhdGFsX2Vycm9yKHdsY19ody0+d2xjLT53bCk7CiAJfQogCiAJLyogZ3B0aW1lciB0aW1lb3V0ICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX1RPKQotCQlXX1JFRygmcmVncy0+Z3B0aW1lciwgMCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKGdwdGltZXIpLCAwKTsKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9SRkRJU0FCTEUpIHsKIAkJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiBCTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSIKQEAgLTgyNTcsMTMgKzgyMjIsMTEgQEAKIAogdm9pZCBicmNtc19jX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIG11dGVfdHgpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGMtPmh3LT5kMTFjb3JlOwogCXUxNiBjaGFuc3BlYzsKIAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCi0JcmVncyA9IHdsYy0+cmVnczsKLQogCS8qCiAJICogVGhpcyB3aWxsIGhhcHBlbiBpZiBhIGJpZy1oYW1tZXIgd2FzIGV4ZWN1dGVkLiBJbgogCSAqIHRoYXQgY2FzZSwgd2Ugd2FudCB0byBnbyBiYWNrIHRvIHRoZSBjaGFubmVsIHRoYXQKQEAgLTgyOTMsOCArODI1Niw4IEBACiAJCSAqIHVwZGF0ZSBzaW5jZSBpbml0IHBhdGggd291bGQgcmVzZXQKIAkJICogdG8gZGVmYXVsdCB2YWx1ZQogCQkgKi8KLQkJV19SRUcoJnJlZ3MtPnRzZl9jZnByZXAsCi0JCSAgICAgIChiaSA8PCBDRlBSRVBfQ0JJX1NISUZUKSk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jZnByZXApLAorCQkJICAgICBiaSA8PCBDRlBSRVBfQ0JJX1NISUZUKTsKIAogCQkvKiBVcGRhdGUgbWFjY29udHJvbCBQTSByZWxhdGVkIGJpdHMgKi8KIAkJYnJjbXNfY19zZXRfcHNfY3RybCh3bGMpOwpAQCAtODMyNCw3ICs4Mjg3LDcgQEAKIAlicmNtc19jX2JzaW5pdCh3bGMpOwogCiAJLyogRW5hYmxlIEVEQ0YgbW9kZSAod2hpbGUgdGhlIE1BQyBpcyBzdXNwZW5kZWQpICovCi0JT1JfUkVHKCZyZWdzLT5pZnNfY3RsLCBJRlNfVVNFRURDRik7CisJYmNtYV9zZXQxNihjb3JlLCBEMTFSRUdPRkZTKGlmc19jdGwpLCBJRlNfVVNFRURDRik7CiAJYnJjbXNfY19lZGNmX3NldHBhcmFtcyh3bGMsIGZhbHNlKTsKIAogCS8qIEluaXQgcHJlY2VkZW5jZSBtYXBzIGZvciBlbXB0eSBGSUZPcyAqLwpAQCAtODM0OCw3ICs4MzExLDcgQEAKIAlicmNtc19jX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjKTsKIAogCS8qIGVuYWJsZSB0aGUgUkYgRGlzYWJsZSBEZWxheSB0aW1lciAqLwotCVdfUkVHKCZ3bGMtPnJlZ3MtPnJmZGlzYWJsZWRseSwgUkZESVNBQkxFX0RFRkFVTFQpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHJmZGlzYWJsZWRseSksIFJGRElTQUJMRV9ERUZBVUxUKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBXTUUgcGFyYW1ldGVyczsgaWYgdGhleSBoYXZlbid0IGJlZW4gc2V0IGJ5IHNvbWUgb3RoZXIKQEAgLTgzNTgsNyArODMyMSw3IEBACiAJCS8qIFVuaW5pdGlhbGl6ZWQ7IHJlYWQgZnJvbSBIVyAqLwogCQlpbnQgYWM7CiAKLQkJZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspCisJCWZvciAoYWMgPSAwOyBhYyA8IElFRUU4MDIxMV9OVU1fQUNTOyBhYysrKQogCQkJd2xjLT53bWVfcmV0cmllc1thY10gPQogCQkJICAgIGJyY21zX2JfcmVhZF9zaG0od2xjLT5odywgTV9BQ19UWExNVF9BRERSKGFjKSk7CiAJfQpAQCAtODM2OCw5ICs4MzMxLDggQEAKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwogc3RydWN0IGJyY21zX2NfaW5mbyAqCi1icmNtc19jX2F0dGFjaChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkgICAgICAgYm9vbCBwaW9tb2RlLCB2b2lkIF9faW9tZW0gKnJlZ3N2YSwgc3RydWN0IHBjaV9kZXYgKmJ0cGFyYW0sCi0JICAgICAgIHVpbnQgKnBlcnIpCiticmNtc19jX2F0dGFjaChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdWludCB1bml0LAorCSAgICAgICBib29sIHBpb21vZGUsIHVpbnQgKnBlcnIpCiB7CiAJc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwogCXVpbnQgZXJyID0gMDsKQEAgLTgzNzgsNyArODM0MCw3IEBACiAJc3RydWN0IGJyY21zX3B1YiAqcHViOwogCiAJLyogYWxsb2NhdGUgc3RydWN0IGJyY21zX2NfaW5mbyBzdGF0ZSBhbmQgaXRzIHN1YnN0cnVjdHVyZXMgKi8KLQl3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBicmNtc19jX2F0dGFjaF9tYWxsb2ModW5pdCwgJmVyciwgZGV2aWNlKTsKKwl3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBicmNtc19jX2F0dGFjaF9tYWxsb2ModW5pdCwgJmVyciwgMCk7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJd2xjLT53aXBoeSA9IHdsLT53aXBoeTsKQEAgLTg0MDUsOCArODM2Nyw3IEBACiAJICogbG93IGxldmVsIGF0dGFjaCBzdGVwcyhhbGwgaHcgYWNjZXNzZXMgZ28KIAkgKiBpbnNpZGUsIG5vIG1vcmUgaW4gcmVzdCBvZiB0aGUgYXR0YWNoKQogCSAqLwotCWVyciA9IGJyY21zX2JfYXR0YWNoKHdsYywgdmVuZG9yLCBkZXZpY2UsIHVuaXQsIHBpb21vZGUsIHJlZ3N2YSwKLQkJCSAgICAgYnRwYXJhbSk7CisJZXJyID0gYnJjbXNfYl9hdHRhY2god2xjLCBjb3JlLCB1bml0LCBwaW9tb2RlKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oCmluZGV4IDlhNzUzNWQuLmFkYjEzNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uaApAQCAtNDQsOCArNDQsNiBAQAogLyogdHJhbnNtaXQgYnVmZmVyIG1heCBoZWFkcm9vbSBmb3IgcHJvdG9jb2wgaGVhZGVycyAqLwogI2RlZmluZSBUWE9GRiAoRDExX1RYSF9MRU4gKyBEMTFfUEhZX0hEUl9MRU4pCiAKLSNkZWZpbmUgQUNfQ09VTlQJCTQKLQogLyogTWFjcm9zIGZvciBkb2luZyBkZWZpbml0aW9uIGFuZCBnZXQvc2V0IG9mIGJpdGZpZWxkcwogICogVXNhZ2UgZXhhbXBsZSwgZS5nLiBhIHRocmVlLWJpdCBmaWVsZCAoYml0cyA0LTYpOgogICogICAgI2RlZmluZSA8TkFNRT5fTQlCSVRGSUVMRF9NQVNLKDMpCkBAIC0zMzYsNyArMzM0LDcgQEAKIAl1MzIgbWFjaHdjYXBfYmFja3VwOwkvKiBiYWNrdXAgb2YgbWFjaHdjYXAgKi8KIAogCXN0cnVjdCBzaV9wdWIgKnNpaDsJLyogU0kgaGFuZGxlIChjb29raWUgZm9yIHNpdXRpbHMgY2FsbHMpICovCi0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsJLyogcG9pbnRlciB0byBkZXZpY2UgcmVnaXN0ZXJzICovCisJc3RydWN0IGJjbWFfZGV2aWNlICpkMTFjb3JlOwkvKiBwb2ludGVyIHRvIDgwMi4xMSBjb3JlICovCiAJc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW07IC8qIHBoeSBzaGltIGxheWVyIGhhbmRsZXIgKi8KIAlzdHJ1Y3Qgc2hhcmVkX3BoeSAqcGh5X3NoOwkvKiBwb2ludGVyIHRvIHNoYXJlZCBwaHkgc3RhdGUgKi8KIAlzdHJ1Y3QgYnJjbXNfaHdfYmFuZCAqYmFuZDsvKiBwb2ludGVyIHRvIGFjdGl2ZSBwZXItYmFuZCBzdGF0ZSAqLwpAQCAtNDAyLDcgKzQwMCw2IEBACiAgKgogICogcHViOiBwb2ludGVyIHRvIGRyaXZlciBwdWJsaWMgc3RhdGUuCiAgKiB3bDogcG9pbnRlciB0byBzcGVjaWZpYyBwcml2YXRlIHN0YXRlLgotICogcmVnczogcG9pbnRlciB0byBkZXZpY2UgcmVnaXN0ZXJzLgogICogaHc6IEhXIHJlbGF0ZWQgc3RhdGUuCiAgKiBjbGtyZXFfb3ZlcnJpZGU6IHNldHRpbmcgZm9yIGNsa3JlcSBmb3IgUENJRSA6IEF1dG8sIDAsIDEuCiAgKiBmYXN0cHdydXBfZGx5OiB0aW1lIGluIHVzIG5lZWRlZCB0byBicmluZyB1cCBkMTEgZmFzdCBjbG9jay4KQEAgLTQzNiw3ICs0MzMsNyBAQAogICogYmNuX2xpX2R0aW06IGJlYWNvbiBsaXN0ZW4gaW50ZXJ2YWwgaW4gIyBkdGltcy4KICAqIFdEYXJtZWQ6IHdhdGNoZG9nIHRpbWVyIGlzIGFybWVkLgogICogV0RsYXN0OiBsYXN0IHRpbWUgd2xjX3dhdGNoZG9nKCkgd2FzIGNhbGxlZC4KLSAqIGVkY2ZfdHhvcFtBQ19DT1VOVF06IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KKyAqIGVkY2ZfdHhvcFtJRUVFODAyMTFfTlVNX0FDU106IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KICAqIHdtZV9yZXRyaWVzOiBwZXItQUMgcmV0cnkgbGltaXRzLgogICogdHhfcHJlY19tYXA6IFByZWNlZGVuY2UgbWFwIGJhc2VkIG9uIEhXIEZJRk8gc3BhY2UuCiAgKiBmaWZvMnByZWNfbWFwW05GSUZPXTogcG9pbnRlciB0byBmaWZvMl9wcmVjIG1hcCBiYXNlZCBvbiBXTUUuCkBAIC00NzksNyArNDc2LDYgQEAKIHN0cnVjdCBicmNtc19jX2luZm8gewogCXN0cnVjdCBicmNtc19wdWIgKnB1YjsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKmh3OwogCiAJLyogY2xvY2sgKi8KQEAgLTUyMSw4ICs1MTcsNyBAQAogCXN0cnVjdCBicmNtc190aW1lciAqcmFkaW9fdGltZXI7CiAKIAkvKiBwcm9taXNjdW91cyAqLwotCWJvb2wgbW9uaXRvcjsKLQlib29sIGJjbm1pc2NfbW9uaXRvcjsKKwl1aW50IGZpbHRlcl9mbGFnczsKIAogCS8qIGRyaXZlciBmZWF0dXJlICovCiAJYm9vbCBfcmlmczsKQEAgLTUzNSw5ICs1MzAsOSBAQAogCXUzMiBXRGxhc3Q7CiAKIAkvKiBXTUUgKi8KLQl1MTYgZWRjZl90eG9wW0FDX0NPVU5UXTsKKwl1MTYgZWRjZl90eG9wW0lFRUU4MDIxMV9OVU1fQUNTXTsKIAotCXUxNiB3bWVfcmV0cmllc1tBQ19DT1VOVF07CisJdTE2IHdtZV9yZXRyaWVzW0lFRUU4MDIxMV9OVU1fQUNTXTsKIAl1MTYgdHhfcHJlY19tYXA7CiAJdTE2IGZpZm8ycHJlY19tYXBbTkZJRk9dOwogCkBAIC02NjAsOCArNjU1LDcgQEAKICNlbmRpZgogCiBleHRlcm4gaW50IGJyY21zX2Nfc2V0X2dtb2RlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggZ21vZGUsIGJvb2wgY29uZmlnKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJCSAgIGJvb2wgcHJvbWlzYyk7CitleHRlcm4gdm9pZCBicmNtc19jX21hY19wcm9taXNjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBmaWx0ZXJfZmxhZ3MpOwogZXh0ZXJuIHZvaWQgYnJjbXNfY19zZW5kX3Eoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKIGV4dGVybiBpbnQgYnJjbXNfY19wcmVwX3BkdShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwZHUsCiAJCQkgICAgdWludCAqZmlmbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmMKaW5kZXggMGJjYjI2Ny4uN2ZhZDZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuYwpAQCAtMTM5LDYgKzEzOSw5IEBACiAjZGVmaW5lIFNSU0hfUElfTUFTSwkweGYwMDAJLyogYml0IDE1OjEyICovCiAjZGVmaW5lIFNSU0hfUElfU0hJRlQJMTIJLyogYml0IDE1OjEyICovCiAKKyNkZWZpbmUgUENJUkVHT0ZGUyhmaWVsZCkJb2Zmc2V0b2Yoc3RydWN0IHNicGNpcmVncywgZmllbGQpCisjZGVmaW5lIFBDSUVSRUdPRkZTKGZpZWxkKQlvZmZzZXRvZihzdHJ1Y3Qgc2JwY2llcmVncywgZmllbGQpCisKIC8qIFNvbmljcyBzaWRlOiBQQ0kgY29yZSBhbmQgaG9zdCBjb250cm9sIHJlZ2lzdGVycyAqLwogc3RydWN0IHNicGNpcmVncyB7CiAJdTMyIGNvbnRyb2w7CQkvKiBQQ0kgY29udHJvbCAqLwpAQCAtMjA1LDExICsyMDgsNyBAQAogfTsKIAogc3RydWN0IHBjaWNvcmVfaW5mbyB7Ci0JdW5pb24gewotCQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVnczsKLQkJc3RydWN0IHNicGNpcmVncyBfX2lvbWVtICpwY2lyZWdzOwotCX0gcmVnczsJCQkvKiBNZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIHRvIHRoZSBjb3JlICovCi0KKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAJc3RydWN0IHNpX3B1YiAqc2loOwkvKiBTeXN0ZW0gaW50ZXJjb25uZWN0IGhhbmRsZSAqLwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJdTggcGNpZWNhcF9sY3JlZ19vZmZzZXQ7LyogUENJRSBjYXBhYmlsaXR5IExDcmVnIG9mZnNldApAQCAtMjI0LDkgKzIyMyw5IEBACiB9OwogCiAjZGVmaW5lIFBDSUVfQVNQTShzaWgpCQkJCQkJCVwKLQkoKChzaWgpLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpICYmCQkJXAotCSAoKChzaWgpLT5idXNjb3JlcmV2ID49IDMpICYmCQkJCQlcCi0JICAoKHNpaCktPmJ1c2NvcmVyZXYgPD0gNSkpKQorCSgoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgPT0gUENJRV9DT1JFX0lEKSAmJgkJCVwKKwkgKChhaV9nZXRfYnVzY29yZXJldihzaWgpID49IDMpICYmCQkJCVwKKwkgIChhaV9nZXRfYnVzY29yZXJldihzaWgpIDw9IDUpKSkKIAogCiAvKiBkZWxheSBuZWVkZWQgYmV0d2VlbiB0aGUgbWRpbyBjb250cm9sLyBtZGlvZGF0YSByZWdpc3RlciBkYXRhIGFjY2VzcyAqLwpAQCAtMjM4LDggKzIzNyw3IEBACiAvKiBJbml0aWFsaXplIHRoZSBQQ0kgY29yZS4KICAqIEl0J3MgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBkb25lIG9ubHkgb25jZQogICovCi1zdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2ljb3JlX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgIHZvaWQgX19pb21lbSAqcmVncykKK3N0cnVjdCBwY2ljb3JlX2luZm8gKnBjaWNvcmVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKIHsKIAlzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaTsKIApAQCAtMjQ5LDE3ICsyNDcsMTUgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwaS0+c2loID0gc2loOwotCXBpLT5kZXYgPSBwZGV2OworCXBpLT5kZXYgPSBjb3JlLT5idXMtPmhvc3RfcGNpOworCXBpLT5jb3JlID0gY29yZTsKIAotCWlmIChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgeworCWlmIChjb3JlLT5pZC5pZCA9PSBQQ0lFX0NPUkVfSUQpIHsKIAkJdTggY2FwX3B0cjsKLQkJcGktPnJlZ3MucGNpZXJlZ3MgPSByZWdzOwogCQljYXBfcHRyID0gcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHBpLT5kZXYsIFBDSV9DQVBfSURfRVhQLAogCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAJCXBpLT5wY2llY2FwX2xjcmVnX29mZnNldCA9IGNhcF9wdHIgKyBQQ0lFX0NBUF9MSU5LQ1RSTF9PRkZTRVQ7Ci0JfSBlbHNlCi0JCXBpLT5yZWdzLnBjaXJlZ3MgPSByZWdzOwotCisJfQogCXJldHVybiBwaTsKIH0KIApAQCAtMzM0LDM3ICszMzAsMzcgQEAKIAogLyogKioqKiogUmVnaXN0ZXIgQWNjZXNzIEFQSSAqLwogc3RhdGljIHVpbnQKLXBjaWVfcmVhZHJlZyhzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncywgdWludCBhZGRydHlwZSwgdWludCBvZmZzZXQpCitwY2llX3JlYWRyZWcoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCkKIHsKIAl1aW50IHJldHZhbCA9IDB4RkZGRkZGRkY7CiAKIAlzd2l0Y2ggKGFkZHJ0eXBlKSB7CiAJY2FzZSBQQ0lFX0NPTkZJR1JFR1M6Ci0JCVdfUkVHKCZwY2llcmVncy0+Y29uZmlnYWRkciwgb2Zmc2V0KTsKLQkJKHZvaWQpUl9SRUcoKCZwY2llcmVncy0+Y29uZmlnYWRkcikpOwotCQlyZXR2YWwgPSBSX1JFRygmcGNpZXJlZ3MtPmNvbmZpZ2RhdGEpOworCQliY21hX3dyaXRlMzIoY29yZSwgUENJRVJFR09GRlMoY29uZmlnYWRkciksIG9mZnNldCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIFBDSUVSRUdPRkZTKGNvbmZpZ2FkZHIpKTsKKwkJcmV0dmFsID0gYmNtYV9yZWFkMzIoY29yZSwgUENJRVJFR09GRlMoY29uZmlnZGF0YSkpOwogCQlicmVhazsKIAljYXNlIFBDSUVfUENJRVJFR1M6Ci0JCVdfUkVHKCZwY2llcmVncy0+cGNpZWluZGFkZHIsIG9mZnNldCk7Ci0JCSh2b2lkKVJfUkVHKCZwY2llcmVncy0+cGNpZWluZGFkZHIpOwotCQlyZXR2YWwgPSBSX1JFRygmcGNpZXJlZ3MtPnBjaWVpbmRkYXRhKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIFBDSUVSRUdPRkZTKHBjaWVpbmRhZGRyKSwgb2Zmc2V0KTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgUENJRVJFR09GRlMocGNpZWluZGFkZHIpKTsKKwkJcmV0dmFsID0gYmNtYV9yZWFkMzIoY29yZSwgUENJRVJFR09GRlMocGNpZWluZGRhdGEpKTsKIAkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHVpbnQgcGNpZV93cml0ZXJlZyhzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncywgdWludCBhZGRydHlwZSwKK3N0YXRpYyB1aW50IHBjaWVfd3JpdGVyZWcoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1aW50IGFkZHJ0eXBlLAogCQkJICB1aW50IG9mZnNldCwgdWludCB2YWwpCiB7CiAJc3dpdGNoIChhZGRydHlwZSkgewogCWNhc2UgUENJRV9DT05GSUdSRUdTOgotCQlXX1JFRygoJnBjaWVyZWdzLT5jb25maWdhZGRyKSwgb2Zmc2V0KTsKLQkJV19SRUcoKCZwY2llcmVncy0+Y29uZmlnZGF0YSksIHZhbCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBQQ0lFUkVHT0ZGUyhjb25maWdhZGRyKSwgb2Zmc2V0KTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIFBDSUVSRUdPRkZTKGNvbmZpZ2RhdGEpLCB2YWwpOwogCQlicmVhazsKIAljYXNlIFBDSUVfUENJRVJFR1M6Ci0JCVdfUkVHKCgmcGNpZXJlZ3MtPnBjaWVpbmRhZGRyKSwgb2Zmc2V0KTsKLQkJV19SRUcoKCZwY2llcmVncy0+cGNpZWluZGRhdGEpLCB2YWwpOworCQliY21hX3dyaXRlMzIoY29yZSwgUENJRVJFR09GRlMocGNpZWluZGFkZHIpLCBvZmZzZXQpOworCQliY21hX3dyaXRlMzIoY29yZSwgUENJRVJFR09GRlMocGNpZWluZGRhdGEpLCB2YWwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTM3NCw3ICszNzAsNiBAQAogCiBzdGF0aWMgYm9vbCBwY2llX21kaW9zZXRibG9jayhzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgdWludCBibGspCiB7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKIAl1aW50IG1kaW9kYXRhLCBpID0gMDsKIAl1aW50IHBjaWVfc2VyZGVzX3NwaW53YWl0ID0gMjAwOwogCkBAIC0zODIsMTIgKzM3NywxMyBAQAogCQkgICAgKE1ESU9EQVRBX0RFVl9BRERSIDw8IE1ESU9EQVRBX0RFVkFERFJfU0hGKSB8CiAJCSAgICAoTURJT0RBVEFfQkxLX0FERFIgPDwgTURJT0RBVEFfUkVHQUREUl9TSEYpIHwKIAkJICAgIChibGsgPDwgNCkpOwotCVdfUkVHKCZwY2llcmVncy0+bWRpb2RhdGEsIG1kaW9kYXRhKTsKKwliY21hX3dyaXRlMzIocGktPmNvcmUsIFBDSUVSRUdPRkZTKG1kaW9kYXRhKSwgbWRpb2RhdGEpOwogCiAJcHIyODgyOV9kZWxheSgpOwogCS8qIHJldHJ5IHRpbGwgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlICovCiAJd2hpbGUgKGkgPCBwY2llX3NlcmRlc19zcGlud2FpdCkgewotCQlpZiAoUl9SRUcoJnBjaWVyZWdzLT5tZGlvY29udHJvbCkgJiBNRElPQ1RMX0FDQ0VTU19ET05FKQorCQlpZiAoYmNtYV9yZWFkMzIocGktPmNvcmUsIFBDSUVSRUdPRkZTKG1kaW9jb250cm9sKSkgJgorCQkgICAgTURJT0NUTF9BQ0NFU1NfRE9ORSkKIAkJCWJyZWFrOwogCiAJCXVkZWxheSgxMDAwKTsKQEAgLTQwNCwxNSArNDAwLDE1IEBACiBwY2llX21kaW9vcChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgdWludCBwaHlzbWVkaWEsIHVpbnQgcmVnYWRkciwgYm9vbCB3cml0ZSwKIAkgICAgdWludCAqdmFsKQogewotCXN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAJdWludCBtZGlvZGF0YTsKIAl1aW50IGkgPSAwOwogCXVpbnQgcGNpZV9zZXJkZXNfc3BpbndhaXQgPSAxMDsKIAogCS8qIGVuYWJsZSBtZGlvIGFjY2VzcyB0byBTRVJERVMgKi8KLQlXX1JFRygmcGNpZXJlZ3MtPm1kaW9jb250cm9sLCBNRElPQ1RMX1BSRUFNX0VOIHwgTURJT0NUTF9ESVZJU09SX1ZBTCk7CisJYmNtYV93cml0ZTMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvY29udHJvbCksCisJCSAgICAgTURJT0NUTF9QUkVBTV9FTiB8IE1ESU9DVExfRElWSVNPUl9WQUwpOwogCi0JaWYgKHBpLT5zaWgtPmJ1c2NvcmVyZXYgPj0gMTApIHsKKwlpZiAoYWlfZ2V0X2J1c2NvcmVyZXYocGktPnNpaCkgPj0gMTApIHsKIAkJLyogbmV3IHNlcmRlcyBpcyBzbG93ZXIgaW4gcncsCiAJCSAqIHVzaW5nIHR3byBsYXllcnMgb2YgcmVnIGFkZHJlc3MgbWFwcGluZwogCQkgKi8KQEAgLTQzMiwyMCArNDI4LDIyIEBACiAJCW1kaW9kYXRhIHw9IChNRElPREFUQV9TVEFSVCB8IE1ESU9EQVRBX1dSSVRFIHwgTURJT0RBVEFfVEEgfAogCQkJICAgICAqdmFsKTsKIAotCVdfUkVHKCZwY2llcmVncy0+bWRpb2RhdGEsIG1kaW9kYXRhKTsKKwliY21hX3dyaXRlMzIocGktPmNvcmUsIFBDSUVSRUdPRkZTKG1kaW9kYXRhKSwgbWRpb2RhdGEpOwogCiAJcHIyODgyOV9kZWxheSgpOwogCiAJLyogcmV0cnkgdGlsbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUgKi8KIAl3aGlsZSAoaSA8IHBjaWVfc2VyZGVzX3NwaW53YWl0KSB7Ci0JCWlmIChSX1JFRygmcGNpZXJlZ3MtPm1kaW9jb250cm9sKSAmIE1ESU9DVExfQUNDRVNTX0RPTkUpIHsKKwkJaWYgKGJjbWFfcmVhZDMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvY29udHJvbCkpICYKKwkJICAgIE1ESU9DVExfQUNDRVNTX0RPTkUpIHsKIAkJCWlmICghd3JpdGUpIHsKIAkJCQlwcjI4ODI5X2RlbGF5KCk7Ci0JCQkJKnZhbCA9IChSX1JFRygmcGNpZXJlZ3MtPm1kaW9kYXRhKSAmCisJCQkJKnZhbCA9IChiY21hX3JlYWQzMihwaS0+Y29yZSwKKwkJCQkJCSAgICBQQ0lFUkVHT0ZGUyhtZGlvZGF0YSkpICYKIAkJCQkJTURJT0RBVEFfTUFTSyk7CiAJCQl9CiAJCQkvKiBEaXNhYmxlIG1kaW8gYWNjZXNzIHRvIFNFUkRFUyAqLwotCQkJV19SRUcoJnBjaWVyZWdzLT5tZGlvY29udHJvbCwgMCk7CisJCQliY21hX3dyaXRlMzIocGktPmNvcmUsIFBDSUVSRUdPRkZTKG1kaW9jb250cm9sKSwgMCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQl1ZGVsYXkoMTAwMCk7CkBAIC00NTMsNyArNDUxLDcgQEAKIAl9CiAKIAkvKiBUaW1lZCBvdXQuIERpc2FibGUgbWRpbyBhY2Nlc3MgdG8gU0VSREVTLiAqLwotCVdfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wsIDApOworCWJjbWFfd3JpdGUzMihwaS0+Y29yZSwgUENJRVJFR09GRlMobWRpb2NvbnRyb2wpLCAwKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNTAyLDE4ICs1MDAsMTggQEAKIHsKIAl1MzIgdzsKIAlzdHJ1Y3Qgc2lfcHViICpzaWggPSBwaS0+c2loOwotCXN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAKLQlpZiAoc2loLT5idXNjb3JldHlwZSAhPSBQQ0lFX0NPUkVfSUQgfHwgc2loLT5idXNjb3JlcmV2IDwgNykKKwlpZiAoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgIT0gUENJRV9DT1JFX0lEIHx8CisJICAgIGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPCA3KQogCQlyZXR1cm47CiAKLQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfUE1USFJFU0hSRUcpOworCXcgPSBwY2llX3JlYWRyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9QTVRIUkVTSFJFRyk7CiAJaWYgKGV4dGVuZCkKIAkJdyB8PSBQQ0lFX0FTUE1USU1FUl9FWFRFTkQ7CiAJZWxzZQogCQl3ICY9IH5QQ0lFX0FTUE1USU1FUl9FWFRFTkQ7Ci0JcGNpZV93cml0ZXJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX1BNVEhSRVNIUkVHLCB3KTsKLQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfUE1USFJFU0hSRUcpOworCXBjaWVfd3JpdGVyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9QTVRIUkVTSFJFRywgdyk7CisJdyA9IHBjaWVfcmVhZHJlZyhwaS0+Y29yZSwgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX1BNVEhSRVNIUkVHKTsKIH0KIAogLyogY2VudHJhbGl6ZWQgY2xrcmVxIGNvbnRyb2wgcG9saWN5ICovCkBAIC01MjcsMjUgKzUyNSwyNyBAQAogCQkJcGNpZV9jbGtyZXEocGksIDEsIDApOwogCQlicmVhazsKIAljYXNlIFNJX1BDSURPV046Ci0JCWlmIChzaWgtPmJ1c2NvcmVyZXYgPT0gNikgewkvKiB0dXJuIG9uIHNlcmRlcyBQTEwgZG93biAqLwotCQkJYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwKLQkJCQkgICB+MCwgMCk7Ci0JCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAotCQkJCSAgIH4weDQwLCAwKTsKKwkJLyogdHVybiBvbiBzZXJkZXMgUExMIGRvd24gKi8KKwkJaWYgKGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPT0gNikgeworCQkJYWlfY2NfcmVnKHNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2FkZHIpLAorCQkJCSAgfjAsIDApOworCQkJYWlfY2NfcmVnKHNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAorCQkJCSAgfjB4NDAsIDApOwogCQl9IGVsc2UgaWYgKHBpLT5wY2llX3ByNDI3NjcpIHsKIAkJCXBjaWVfY2xrcmVxKHBpLCAxLCAxKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNJX1BDSVVQOgotCQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDYpIHsJLyogdHVybiBvZmYgc2VyZGVzIFBMTCBkb3duICovCi0JCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2FkZHIpLAotCQkJCSAgIH4wLCAwKTsKLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksCi0JCQkJICAgfjB4NDAsIDB4NDApOworCQkvKiB0dXJuIG9mZiBzZXJkZXMgUExMIGRvd24gKi8KKwkJaWYgKGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPT0gNikgeworCQkJYWlfY2NfcmVnKHNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2FkZHIpLAorCQkJCSAgfjAsIDApOworCQkJYWlfY2NfcmVnKHNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAorCQkJCSAgfjB4NDAsIDB4NDApOwogCQl9IGVsc2UgaWYgKFBDSUVfQVNQTShzaWgpKSB7CS8qIGRpc2FibGUgY2xrcmVxICovCiAJCQlwY2llX2Nsa3JlcShwaSwgMSwgMCk7CiAJCX0KQEAgLTU2Miw3ICs1NjIsNyBAQAogCWlmIChwaS0+cGNpZV9wb2xhcml0eSAhPSAwKQogCQlyZXR1cm47CiAKLQl3ID0gcGNpZV9yZWFkcmVnKHBpLT5yZWdzLnBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX1BMUF9TVEFUVVNSRUcpOworCXcgPSBwY2llX3JlYWRyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsIFBDSUVfUExQX1NUQVRVU1JFRyk7CiAKIAkvKiBEZXRlY3QgdGhlIGN1cnJlbnQgcG9sYXJpdHkgYXQgYXR0YWNoIGFuZCBmb3JjZSB0aGF0IHBvbGFyaXR5IGFuZAogCSAqIGRpc2FibGUgY2hhbmdpbmcgdGhlIHBvbGFyaXR5CkBAIC01ODEsMTggKzU4MSwxNSBAQAogICovCiBzdGF0aWMgdm9pZCBwY2llX3dhcl9hc3BtX2Nsa3JlcShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKIHsKLQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXN0cnVjdCBzaV9wdWIgKnNpaCA9IHBpLT5zaWg7CiAJdTE2IHZhbDE2OwotCXUxNiBfX2lvbWVtICpyZWcxNjsKIAl1MzIgdzsKIAogCWlmICghUENJRV9BU1BNKHNpaCkpCiAJCXJldHVybjsKIAogCS8qIGJ5cGFzcyB0aGlzIG9uIFFUIG9yIFZTSU0gKi8KLQlyZWcxNiA9ICZwY2llcmVncy0+c3Byb21bU1JTSF9BU1BNX09GRlNFVF07Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7CisJdmFsMTYgPSBiY21hX3JlYWQxNihwaS0+Y29yZSwgUENJRVJFR09GRlMoc3Byb21bU1JTSF9BU1BNX09GRlNFVF0pKTsKIAogCXZhbDE2ICY9IH5TUlNIX0FTUE1fRU5COwogCWlmIChwaS0+cGNpZV93YXJfYXNwbV9vdnIgPT0gUENJRV9BU1BNX0VOQUIpCkBAIC02MDIsMTUgKzU5OSwxNSBAQAogCWVsc2UgaWYgKHBpLT5wY2llX3dhcl9hc3BtX292ciA9PSBQQ0lFX0FTUE1fTDBzX0VOQUIpCiAJCXZhbDE2IHw9IFNSU0hfQVNQTV9MMHNfRU5COwogCi0JV19SRUcocmVnMTYsIHZhbDE2KTsKKwliY21hX3dyaXRlMTYocGktPmNvcmUsIFBDSUVSRUdPRkZTKHNwcm9tW1NSU0hfQVNQTV9PRkZTRVRdKSwgdmFsMTYpOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5kZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwgJncpOwogCXcgJj0gflBDSUVfQVNQTV9FTkFCOwogCXcgfD0gcGktPnBjaWVfd2FyX2FzcG1fb3ZyOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGktPmRldiwgcGktPnBjaWVjYXBfbGNyZWdfb2Zmc2V0LCB3KTsKIAotCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV07Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7CisJdmFsMTYgPSBiY21hX3JlYWQxNihwaS0+Y29yZSwKKwkJCSAgICBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV0pKTsKIAogCWlmIChwaS0+cGNpZV93YXJfYXNwbV9vdnIgIT0gUENJRV9BU1BNX0RJU0FCKSB7CiAJCXZhbDE2IHw9IFNSU0hfQ0xLUkVRX0VOQjsKQEAgLTYxOCw3ICs2MTUsOCBAQAogCX0gZWxzZQogCQl2YWwxNiAmPSB+U1JTSF9DTEtSRVFfRU5COwogCi0JV19SRUcocmVnMTYsIHZhbDE2KTsKKwliY21hX3dyaXRlMTYocGktPmNvcmUsIFBDSUVSRUdPRkZTKHNwcm9tW1NSU0hfQ0xLUkVRX09GRlNFVF9SRVY1XSksCisJCSAgICAgdmFsMTYpOwogfQogCiAvKiBBcHBseSB0aGUgcG9sYXJpdHkgZGV0ZXJtaW5lZCBhdCB0aGUgc3RhcnQgKi8KQEAgLTY0MiwxNiArNjQwLDE1IEBACiAvKiBOZWVkcyB0byBoYXBwZW4gd2hlbiBjb21pbmcgb3V0IG9mICdzdGFuZGJ5Jy8naGliZXJuYXRlJyAqLwogc3RhdGljIHZvaWQgcGNpZV9taXNjX2NvbmZpZ19maXh1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKIHsKLQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXUxNiB2YWwxNjsKLQl1MTYgX19pb21lbSAqcmVnMTY7CiAKLQlyZWcxNiA9ICZwY2llcmVncy0+c3Byb21bU1JTSF9QQ0lFX01JU0NfQ09ORklHXTsKLQl2YWwxNiA9IFJfUkVHKHJlZzE2KTsKKwl2YWwxNiA9IGJjbWFfcmVhZDE2KHBpLT5jb3JlLAorCQkJICAgIFBDSUVSRUdPRkZTKHNwcm9tW1NSU0hfUENJRV9NSVNDX0NPTkZJR10pKTsKIAogCWlmICgodmFsMTYgJiBTUlNIX0wyM1JFQURZX0VYSVRfTk9QRVJTVCkgPT0gMCkgewogCQl2YWwxNiB8PSBTUlNIX0wyM1JFQURZX0VYSVRfTk9QRVJTVDsKLQkJV19SRUcocmVnMTYsIHZhbDE2KTsKKwkJYmNtYV93cml0ZTE2KHBpLT5jb3JlLAorCQkJICAgICBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX1BDSUVfTUlTQ19DT05GSUddKSwgdmFsMTYpOwogCX0KIH0KIApAQCAtNjU5LDYyICs2NTYsNTcgQEAKIC8qIE5lZWRzIHRvIGhhcHBlbiB3aGVuIGNvbWluZyBvdXQgb2YgJ3N0YW5kYnknLydoaWJlcm5hdGUnICovCiBzdGF0aWMgdm9pZCBwY2llX3dhcl9ub3BsbGRvd24oc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQl1MTYgX19pb21lbSAqcmVnMTY7Ci0KIAkvKiB0dXJuIG9mZiBzZXJkZXMgUExMIGRvd24gKi8KLQlhaV9jb3JlcmVnKHBpLT5zaWgsIFNJX0NDX0lEWCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2wpLAotCQkgICBDSElQQ1RSTF80MzIxX1BMTF9ET1dOLCBDSElQQ1RSTF80MzIxX1BMTF9ET1dOKTsKKwlhaV9jY19yZWcocGktPnNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2wpLAorCQkgIENISVBDVFJMXzQzMjFfUExMX0RPV04sIENISVBDVFJMXzQzMjFfUExMX0RPV04pOwogCiAJLyogY2xlYXIgc3JvbSBzaGFkb3cgYmFja2Rvb3IgKi8KLQlyZWcxNiA9ICZwY2llcmVncy0+c3Byb21bU1JTSF9CRF9PRkZTRVRdOwotCVdfUkVHKHJlZzE2LCAwKTsKKwliY21hX3dyaXRlMTYocGktPmNvcmUsIFBDSUVSRUdPRkZTKHNwcm9tW1NSU0hfQkRfT0ZGU0VUXSksIDApOwogfQogCiAvKiBOZWVkcyB0byBoYXBwZW4gd2hlbiBjb21pbmcgb3V0IG9mICdzdGFuZGJ5Jy8naGliZXJuYXRlJyAqLwogc3RhdGljIHZvaWQgcGNpZV93YXJfcGNpX3NldHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQogewogCXN0cnVjdCBzaV9wdWIgKnNpaCA9IHBpLT5zaWg7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKIAl1MzIgdzsKIAotCWlmIChzaWgtPmJ1c2NvcmVyZXYgPT0gMCB8fCBzaWgtPmJ1c2NvcmVyZXYgPT0gMSkgewotCQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLAorCWlmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID09IDAgfHwgYWlfZ2V0X2J1c2NvcmVyZXYoc2loKSA9PSAxKSB7CisJCXcgPSBwY2llX3JlYWRyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsCiAJCQkJIFBDSUVfVExQX1dPUktBUk9VTkRTUkVHKTsKIAkJdyB8PSAweDg7Ci0JCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsCisJCXBjaWVfd3JpdGVyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsCiAJCQkgICAgICBQQ0lFX1RMUF9XT1JLQVJPVU5EU1JFRywgdyk7CiAJfQogCi0JaWYgKHNpaC0+YnVzY29yZXJldiA9PSAxKSB7Ci0JCXcgPSBwY2llX3JlYWRyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9MQ1JFRyk7CisJaWYgKGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPT0gMSkgeworCQl3ID0gcGNpZV9yZWFkcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfTENSRUcpOwogCQl3IHw9IDB4NDA7Ci0JCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9MQ1JFRywgdyk7CisJCXBjaWVfd3JpdGVyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9MQ1JFRywgdyk7CiAJfQogCi0JaWYgKHNpaC0+YnVzY29yZXJldiA9PSAwKSB7CisJaWYgKGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPT0gMCkgewogCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfVElNRVIxLCAweDgxMjgpOwogCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfQ0RSLCAweDAxMDApOwogCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfQ0RSQlcsIDB4MTQ2Nik7CiAJfSBlbHNlIGlmIChQQ0lFX0FTUE0oc2loKSkgewogCQkvKiBDaGFuZ2UgdGhlIEwxIHRocmVzaG9sZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCi0JCXcgPSBwY2llX3JlYWRyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsCisJCXcgPSBwY2llX3JlYWRyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsCiAJCQkJIFBDSUVfRExMUF9QTVRIUkVTSFJFRyk7CiAJCXcgJj0gflBDSUVfTDFUSFJFU0hPTERUSU1FX01BU0s7CiAJCXcgfD0gUENJRV9MMVRIUkVTSE9MRF9XQVJWQUwgPDwgUENJRV9MMVRIUkVTSE9MRFRJTUVfU0hJRlQ7Ci0JCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsCisJCXBjaWVfd3JpdGVyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsCiAJCQkgICAgICBQQ0lFX0RMTFBfUE1USFJFU0hSRUcsIHcpOwogCiAJCXBjaWVfd2FyX3NlcmRlcyhwaSk7CiAKIAkJcGNpZV93YXJfYXNwbV9jbGtyZXEocGkpOwotCX0gZWxzZSBpZiAocGktPnNpaC0+YnVzY29yZXJldiA9PSA3KQorCX0gZWxzZSBpZiAoYWlfZ2V0X2J1c2NvcmVyZXYocGktPnNpaCkgPT0gNykKIAkJcGNpZV93YXJfbm9wbGxkb3duKHBpKTsKIAogCS8qIE5vdGUgdGhhdCB0aGUgZml4IGlzIGFjdHVhbGx5IGluIHRoZSBTUk9NLAogCSAqIHRoYXQncyB3aHkgdGhpcyBpcyBvcGVuLWVuZGVkCiAJICovCi0JaWYgKHBpLT5zaWgtPmJ1c2NvcmVyZXYgPj0gNikKKwlpZiAoYWlfZ2V0X2J1c2NvcmVyZXYocGktPnNpaCkgPj0gNikKIAkJcGNpZV9taXNjX2NvbmZpZ19maXh1cChwaSk7CiB9CiAKQEAgLTc0NSw3ICs3MzcsNyBAQAogCiB2b2lkIHBjaWNvcmVfaHd1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKIHsKLQlpZiAoIXBpIHx8IHBpLT5zaWgtPmJ1c2NvcmV0eXBlICE9IFBDSUVfQ09SRV9JRCkKKwlpZiAoIXBpIHx8IGFpX2dldF9idXNjb3JldHlwZShwaS0+c2loKSAhPSBQQ0lFX0NPUkVfSUQpCiAJCXJldHVybjsKIAogCXBjaWVfd2FyX3BjaV9zZXR1cChwaSk7CkBAIC03NTMsNyArNzQ1LDcgQEAKIAogdm9pZCBwY2ljb3JlX3VwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLCBpbnQgc3RhdGUpCiB7Ci0JaWYgKCFwaSB8fCBwaS0+c2loLT5idXNjb3JldHlwZSAhPSBQQ0lFX0NPUkVfSUQpCisJaWYgKCFwaSB8fCBhaV9nZXRfYnVzY29yZXR5cGUocGktPnNpaCkgIT0gUENJRV9DT1JFX0lEKQogCQlyZXR1cm47CiAKIAkvKiBSZXN0b3JlIEwxIHRpbWVyIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KQEAgLTc4MSw3ICs3NzMsNyBAQAogCiB2b2lkIHBjaWNvcmVfZG93bihzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgaW50IHN0YXRlKQogewotCWlmICghcGkgfHwgcGktPnNpaC0+YnVzY29yZXR5cGUgIT0gUENJRV9DT1JFX0lEKQorCWlmICghcGkgfHwgYWlfZ2V0X2J1c2NvcmV0eXBlKHBpLT5zaWgpICE9IFBDSUVfQ09SRV9JRCkKIAkJcmV0dXJuOwogCiAJcGNpZV9jbGtyZXFfdXBkKHBpLCBzdGF0ZSk7CkBAIC03OTAsNDYgKzc4Miw0NSBAQAogCXBjaWVfZXh0ZW5kTDF0aW1lcihwaSwgZmFsc2UpOwogfQogCi0vKiBwcmVjb25kaXRpb246IGN1cnJlbnQgY29yZSBpcyBzaWktPmJ1c2NvcmV0eXBlICovCi1zdGF0aWMgdm9pZCBwY2ljb3JlX2ZpeGNmZyhzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgdTE2IF9faW9tZW0gKnJlZzE2KQordm9pZCBwY2ljb3JlX2ZpeGNmZyhzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKIHsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopKHBpLT5zaWgpOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHBpLT5jb3JlOwogCXUxNiB2YWwxNjsKLQl1aW50IHBjaWlkeDsKKwl1aW50IHJlZ29mZjsKIAotCXBjaWlkeCA9IGFpX2NvcmVpZHgoJnNpaS0+cHViKTsKLQl2YWwxNiA9IFJfUkVHKHJlZzE2KTsKLQlpZiAoKCh2YWwxNiAmIFNSU0hfUElfTUFTSykgPj4gU1JTSF9QSV9TSElGVCkgIT0gKHUxNilwY2lpZHgpIHsKLQkJdmFsMTYgPSAodTE2KShwY2lpZHggPDwgU1JTSF9QSV9TSElGVCkgfAotCQkJKHZhbDE2ICYgflNSU0hfUElfTUFTSyk7Ci0JCVdfUkVHKHJlZzE2LCB2YWwxNik7CisJc3dpdGNoIChwaS0+Y29yZS0+aWQuaWQpIHsKKwljYXNlIEJDTUFfQ09SRV9QQ0k6CisJCXJlZ29mZiA9IFBDSVJFR09GRlMoc3Byb21bU1JTSF9QSV9PRkZTRVRdKTsKKwkJYnJlYWs7CisKKwljYXNlIEJDTUFfQ09SRV9QQ0lFOgorCQlyZWdvZmYgPSBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX1BJX09GRlNFVF0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKIAl9Ci19CiAKLXZvaWQKLXBjaWNvcmVfZml4Y2ZnX3BjaShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgc3RydWN0IHNicGNpcmVncyBfX2lvbWVtICpwY2lyZWdzKQotewotCXBjaWNvcmVfZml4Y2ZnKHBpLCAmcGNpcmVncy0+c3Byb21bU1JTSF9QSV9PRkZTRVRdKTsKLX0KLQotdm9pZCBwY2ljb3JlX2ZpeGNmZ19wY2llKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLAotCQkJIHN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzKQotewotCXBjaWNvcmVfZml4Y2ZnKHBpLCAmcGNpZXJlZ3MtPnNwcm9tW1NSU0hfUElfT0ZGU0VUXSk7CisJdmFsMTYgPSBiY21hX3JlYWQxNihwaS0+Y29yZSwgcmVnb2ZmKTsKKwlpZiAoKCh2YWwxNiAmIFNSU0hfUElfTUFTSykgPj4gU1JTSF9QSV9TSElGVCkgIT0KKwkgICAgKHUxNiljb3JlLT5jb3JlX2luZGV4KSB7CisJCXZhbDE2ID0gKCh1MTYpY29yZS0+Y29yZV9pbmRleCA8PCBTUlNIX1BJX1NISUZUKSB8CisJCQkodmFsMTYgJiB+U1JTSF9QSV9NQVNLKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5jb3JlLCByZWdvZmYsIHZhbDE2KTsKKwl9CiB9CiAKIC8qIHByZWNvbmRpdGlvbjogY3VycmVudCBjb3JlIGlzIHBjaSBjb3JlICovCiB2b2lkCi1wY2ljb3JlX3BjaV9zZXR1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgc3RydWN0IHNicGNpcmVncyBfX2lvbWVtICpwY2lyZWdzKQorcGNpY29yZV9wY2lfc2V0dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0JdTMyIHc7CisJYmNtYV9zZXQzMihwaS0+Y29yZSwgUENJUkVHT0ZGUyhzYnRvcGNpMiksCisJCSAgIFNCVE9QQ0lfUFJFRiB8IFNCVE9QQ0lfQlVSU1QpOwogCi0JT1JfUkVHKCZwY2lyZWdzLT5zYnRvcGNpMiwgU0JUT1BDSV9QUkVGIHwgU0JUT1BDSV9CVVJTVCk7Ci0KLQlpZiAoKChzdHJ1Y3Qgc2lfaW5mbyAqKShwaS0+c2loKSktPnB1Yi5idXNjb3JlcmV2ID49IDExKSB7Ci0JCU9SX1JFRygmcGNpcmVncy0+c2J0b3BjaTIsIFNCVE9QQ0lfUkNfUkVBRE1VTFRJKTsKLQkJdyA9IFJfUkVHKCZwY2lyZWdzLT5jbGtydW4pOwotCQlXX1JFRygmcGNpcmVncy0+Y2xrcnVuLCB3IHwgUENJX0NMS1JVTl9EU0JMKTsKLQkJdyA9IFJfUkVHKCZwY2lyZWdzLT5jbGtydW4pOworCWlmIChwaS0+Y29yZS0+aWQucmV2ID49IDExKSB7CisJCWJjbWFfc2V0MzIocGktPmNvcmUsIFBDSVJFR09GRlMoc2J0b3BjaTIpLAorCQkJICAgU0JUT1BDSV9SQ19SRUFETVVMVEkpOworCQliY21hX3NldDMyKHBpLT5jb3JlLCBQQ0lSRUdPRkZTKGNsa3J1biksIFBDSV9DTEtSVU5fRFNCTCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHBpLT5jb3JlLCBQQ0lSRUdPRkZTKGNsa3J1bikpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuaAppbmRleCA1OGFhODBkLi45ZmMzZWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5oCkBAIC02Miw4ICs2Miw3IEBACiBzdHJ1Y3Qgc2JwY2llcmVnczsKIAogZXh0ZXJuIHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaWNvcmVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsCi0JCQkJCSBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJIHZvaWQgX19pb21lbSAqcmVncyk7CisJCQkJCSBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9kZWluaXQoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfYXR0YWNoKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCwgaW50IHN0YXRlKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfaHd1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gpOwpAQCAtNzIsMTEgKzcxLDcgQEAKIGV4dGVybiB2b2lkIHBjaWNvcmVfZG93bihzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gsIGludCBzdGF0ZSk7CiBleHRlcm4gdTggcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHJlcV9jYXBfaWQsCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCB1MzIgKmJ1Zmxlbik7Ci1leHRlcm4gdm9pZCBwY2ljb3JlX2ZpeGNmZ19wY2koc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoLAotCQkJICAgICAgIHN0cnVjdCBzYnBjaXJlZ3MgX19pb21lbSAqcGNpcmVncyk7Ci1leHRlcm4gdm9pZCBwY2ljb3JlX2ZpeGNmZ19wY2llKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCwKLQkJCQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2lyZWdzKTsKLWV4dGVybiB2b2lkIHBjaWNvcmVfcGNpX3NldHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCwKLQkJCSAgICAgIHN0cnVjdCBzYnBjaXJlZ3MgX19pb21lbSAqcGNpcmVncyk7CitleHRlcm4gdm9pZCBwY2ljb3JlX2ZpeGNmZyhzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gpOworZXh0ZXJuIHZvaWQgcGNpY29yZV9wY2lfc2V0dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoKTsKIAogI2VuZGlmIC8qIF9CUkNNX05JQ1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL290cC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL290cC5jCmluZGV4IGVkZjU1MTUuLmYxY2ExMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9vdHAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvb3RwLmMKQEAgLTc3LDcgKzc3LDcgQEAKIH07CiAKIHN0cnVjdCBvdHBpbmZvIHsKLQl1aW50IGNjcmV2OwkJLyogY2hpcGMgcmV2aXNpb24gKi8KKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7IC8qIGNoaXBjIGNvcmUgKi8KIAljb25zdCBzdHJ1Y3Qgb3RwX2ZuX3MgKmZuOwkvKiBPVFAgZnVuY3Rpb25zICovCiAJc3RydWN0IHNpX3B1YiAqc2loOwkJLyogU2F2ZWQgc2IgaGFuZGxlICovCiAKQEAgLTEzMyw5ICsxMzMsMTAgQEAKICNkZWZpbmUgT1RQX1NaX0ZVXzE0NAkJKDE0NC84KQkvKiAxNDQgYml0cyAqLwogCiBzdGF0aWMgdTE2Ci1pcHhvdHBfb3RwcihzdHJ1Y3Qgb3RwaW5mbyAqb2ksIHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2MsIHVpbnQgd24pCitpcHhvdHBfb3RwcihzdHJ1Y3Qgb3RwaW5mbyAqb2ksIHVpbnQgd24pCiB7Ci0JcmV0dXJuIFJfUkVHKCZjYy0+c3JvbW90cFt3bl0pOworCXJldHVybiBiY21hX3JlYWQxNihvaS0+Y29yZSwKKwkJCSAgIENISVBDUkVHT0ZGUyhzcm9tb3RwW3duXSkpOwogfQogCiAvKgpAQCAtMTQ2LDcgKzE0Nyw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJCXJldCA9IG9zaXpldyAqIDIgLSBPVFBfU1pfRlVfNzIgLSBPVFBfU1pfQ0hFQ0tTVU07CkBAIC0xNjEsMTkgKzE2MiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9pcHhvdHBfaW5pdChzdHJ1Y3Qgb3RwaW5mbyAqb2ksIHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2MpCitzdGF0aWMgdm9pZCBfaXB4b3RwX2luaXQoc3RydWN0IG90cGluZm8gKm9pKQogewogCXVpbnQgazsKIAl1MzIgb3RwcCwgc3Q7CisJaW50IGNjcmV2ID0gYWlfZ2V0X2NjcmV2KG9pLT5zaWgpOworCiAKIAkvKgogCSAqIHJlY29yZCB3b3JkIG9mZnNldCBvZiBHZW5lcmFsIFVzZSBSZWdpb24KIAkgKiBmb3IgdmFyaW91cyBjaGlwY29tbW9uIHJldnMKIAkgKi8KLQlpZiAob2ktPnNpaC0+Y2NyZXYgPT0gMjEgfHwgb2ktPnNpaC0+Y2NyZXYgPT0gMjQKLQkgICAgfHwgb2ktPnNpaC0+Y2NyZXYgPT0gMjcpIHsKKwlpZiAoY2NyZXYgPT0gMjEgfHwgY2NyZXYgPT0gMjQKKwkgICAgfHwgY2NyZXYgPT0gMjcpIHsKIAkJb2ktPm90cGd1X2Jhc2UgPSBSRVZBNF9PVFBHVV9CQVNFOwotCX0gZWxzZSBpZiAob2ktPnNpaC0+Y2NyZXYgPT0gMzYpIHsKKwl9IGVsc2UgaWYgKGNjcmV2ID09IDM2KSB7CiAJCS8qCiAJCSAqIE9UUCBzaXplIGdyZWF0ZXIgdGhhbiBlcXVhbCB0byAyS0IgKDEyOCB3b3JkcyksCiAJCSAqIG90cGd1X2Jhc2UgaXMgc2ltaWxhciB0byByZXYyMwpAQCAtMTgyLDcgKzE4NSw3IEBACiAJCQlvaS0+b3RwZ3VfYmFzZSA9IFJFVkI4X09UUEdVX0JBU0U7CiAJCWVsc2UKIAkJCW9pLT5vdHBndV9iYXNlID0gUkVWMzZfT1RQR1VfQkFTRTsKLQl9IGVsc2UgaWYgKG9pLT5zaWgtPmNjcmV2ID09IDIzIHx8IG9pLT5zaWgtPmNjcmV2ID49IDI1KSB7CisJfSBlbHNlIGlmIChjY3JldiA9PSAyMyB8fCBjY3JldiA+PSAyNSkgewogCQlvaS0+b3RwZ3VfYmFzZSA9IFJFVkI4X09UUEdVX0JBU0U7CiAJfQogCkBAIC0xOTAsMjQgKzE5MywyMSBAQAogCW90cHAgPQogCSAgICBPVFBQX1NUQVJUX0JVU1kgfCAoKE9UUFBPQ19JTklUIDw8IE9UUFBfT0NfU0hJRlQpICYgT1RQUF9PQ19NQVNLKTsKIAotCVdfUkVHKCZjYy0+b3RwcHJvZywgb3RwcCk7Ci0JZm9yIChrID0gMDsKLQkgICAgICgoc3QgPSBSX1JFRygmY2MtPm90cHByb2cpKSAmIE9UUFBfU1RBUlRfQlVTWSkKLQkgICAgICYmIChrIDwgT1RQUF9UUklFUyk7IGsrKykKLQkJOworCWJjbWFfd3JpdGUzMihvaS0+Y29yZSwgQ0hJUENSRUdPRkZTKG90cHByb2cpLCBvdHBwKTsKKwlzdCA9IGJjbWFfcmVhZDMyKG9pLT5jb3JlLCBDSElQQ1JFR09GRlMob3RwcHJvZykpOworCWZvciAoayA9IDA7IChzdCAmIE9UUFBfU1RBUlRfQlVTWSkgJiYgKGsgPCBPVFBQX1RSSUVTKTsgaysrKQorCQlzdCA9IGJjbWFfcmVhZDMyKG9pLT5jb3JlLCBDSElQQ1JFR09GRlMob3RwcHJvZykpOwogCWlmIChrID49IE9UUFBfVFJJRVMpCiAJCXJldHVybjsKIAogCS8qIFJlYWQgT1RQIGxvY2sgYml0cyBhbmQgc3VicmVnaW9uIHByb2dyYW1tZWQgaW5kaWNhdGlvbiBiaXRzICovCi0Jb2ktPnN0YXR1cyA9IFJfUkVHKCZjYy0+b3Rwc3RhdHVzKTsKKwlvaS0+c3RhdHVzID0gYmNtYV9yZWFkMzIob2ktPmNvcmUsIENISVBDUkVHT0ZGUyhvdHBzdGF0dXMpKTsKIAotCWlmICgob2ktPnNpaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKQotCSAgICB8fCAob2ktPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgeworCWlmICgoYWlfZ2V0X2NoaXBfaWQob2ktPnNpaCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkKKwkgICAgfHwgKGFpX2dldF9jaGlwX2lkKG9pLT5zaWgpID09IEJDTTQzMjI1X0NISVBfSUQpKSB7CiAJCXUzMiBwX2JpdHM7Ci0JCXBfYml0cyA9Ci0JCSAgICAoaXB4b3RwX290cHIob2ksIGNjLCBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX1BfT0ZGKSAmCi0JCSAgICAgT1RQR1VfUF9NU0spCi0JCSAgICA+PiBPVFBHVV9QX1NISUZUOworCQlwX2JpdHMgPSAoaXB4b3RwX290cHIob2ksIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfUF9PRkYpICYKKwkJCSAgT1RQR1VfUF9NU0spID4+IE9UUEdVX1BfU0hJRlQ7CiAJCW9pLT5zdGF0dXMgfD0gKHBfYml0cyA8PCBPVFBTX0dVUF9TSElGVCk7CiAJfQogCkBAIC0yMjAsNyArMjIwLDcgQEAKIAlvaS0+aHdsaW0gPSBvaS0+d3NpemU7CiAJaWYgKG9pLT5zdGF0dXMgJiBPVFBTX0dVUF9IVykgewogCQlvaS0+aHdsaW0gPQotCQkgICAgaXB4b3RwX290cHIob2ksIGNjLCBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX0hTQl9PRkYpIC8gMTY7CisJCSAgICBpcHhvdHBfb3RwcihvaSwgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9IU0JfT0ZGKSAvIDE2OwogCQlvaS0+c3diYXNlID0gb2ktPmh3bGltOwogCX0gZWxzZQogCQlvaS0+c3diYXNlID0gb2ktPmh3YmFzZTsKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiAJaWYgKG9pLT5zdGF0dXMgJiBPVFBTX0dVUF9TVykgewogCQlvaS0+c3dsaW0gPQotCQkgICAgaXB4b3RwX290cHIob2ksIGNjLCBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX1NGQl9PRkYpIC8gMTY7CisJCSAgICBpcHhvdHBfb3RwcihvaSwgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9TRkJfT0ZGKSAvIDE2OwogCQlvaS0+ZmJhc2UgPSBvaS0+c3dsaW07CiAJfSBlbHNlCiAJCW9pLT5mYmFzZSA9IG9pLT5zd2Jhc2U7CkBAIC0yNDAsMTEgKzI0MCw4IEBACiAKIHN0YXRpYyBpbnQgaXB4b3RwX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3Qgb3RwaW5mbyAqb2kpCiB7Ci0JdWludCBpZHg7Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKLQogCS8qIE1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIElQWCBPVFAgKi8KLQlpZiAoIU9UUFRZUEVfSVBYKHNpaC0+Y2NyZXYpKQorCWlmICghT1RQVFlQRV9JUFgoYWlfZ2V0X2NjcmV2KHNpaCkpKQogCQlyZXR1cm4gLUVCQURFOwogCiAJLyogTWFrZSBzdXJlIE9UUCBpcyBub3QgZGlzYWJsZWQgKi8KQEAgLTI1Miw3ICsyNDksNyBAQAogCQlyZXR1cm4gLUVCQURFOwogCiAJLyogQ2hlY2sgZm9yIG90cCBzaXplICovCi0Jc3dpdGNoICgoc2loLT5jY2NhcHMgJiBDQ19DQVBfT1RQU0laRSkgPj4gQ0NfQ0FQX09UUFNJWkVfU0hJRlQpIHsKKwlzd2l0Y2ggKChhaV9nZXRfY2NjYXBzKHNpaCkgJiBDQ19DQVBfT1RQU0laRSkgPj4gQ0NfQ0FQX09UUFNJWkVfU0hJRlQpIHsKIAljYXNlIDA6CiAJCS8qIE5vdGhpbmcgdGhlcmUgKi8KIAkJcmV0dXJuIC1FQkFERTsKQEAgLTI4MiwyMSArMjc5LDEzIEBACiAJfQogCiAJLyogUmV0cmlldmUgT1RQIHJlZ2lvbiBpbmZvICovCi0JaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0KLQlfaXB4b3RwX2luaXQob2ksIGNjKTsKLQotCWFpX3NldGNvcmVpZHgoc2loLCBpZHgpOwotCisJX2lweG90cF9pbml0KG9pKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaXB4b3RwX3JlYWRfcmVnaW9uKHN0cnVjdCBvdHBpbmZvICpvaSwgaW50IHJlZ2lvbiwgdTE2ICpkYXRhLCB1aW50ICp3bGVuKQogewotCXVpbnQgaWR4OwotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CiAJdWludCBiYXNlLCBpLCBzejsKIAogCS8qIFZhbGlkYXRlIHJlZ2lvbiBzZWxlY3Rpb24gKi8KQEAgLTM2NSwxNCArMzU0LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlkeCA9IGFpX2NvcmVpZHgob2ktPnNpaCk7Ci0JY2MgPSBhaV9zZXRjb3JlaWR4KG9pLT5zaWgsIFNJX0NDX0lEWCk7Ci0KIAkvKiBSZWFkIHRoZSBkYXRhICovCiAJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCi0JCWRhdGFbaV0gPSBpcHhvdHBfb3RwcihvaSwgY2MsIGJhc2UgKyBpKTsKKwkJZGF0YVtpXSA9IGlweG90cF9vdHByKG9pLCBiYXNlICsgaSk7CiAKLQlhaV9zZXRjb3JlaWR4KG9pLT5zaWgsIGlkeCk7CiAJKndsZW4gPSBzejsKIAlyZXR1cm4gMDsKIH0KQEAgLTM4NCwxNCArMzY5LDEzIEBACiAKIHN0YXRpYyBpbnQgb3RwX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3Qgb3RwaW5mbyAqb2kpCiB7Ci0KIAlpbnQgcmV0OwogCiAJbWVtc2V0KG9pLCAwLCBzaXplb2Yoc3RydWN0IG90cGluZm8pKTsKIAotCW9pLT5jY3JldiA9IHNpaC0+Y2NyZXY7CisJb2ktPmNvcmUgPSBhaV9maW5kY29yZShzaWgsIEJDTUFfQ09SRV9DSElQQ09NTU9OLCAwKTsKIAotCWlmIChPVFBUWVBFX0lQWChvaS0+Y2NyZXYpKQorCWlmIChPVFBUWVBFX0lQWChhaV9nZXRfY2NyZXYoc2loKSkpCiAJCW9pLT5mbiA9ICZpcHhvdHBfZm47CiAKIAlpZiAob2ktPmZuID09IE5VTEwpCkBAIC0zOTksNyArMzgzLDcgQEAKIAogCW9pLT5zaWggPSBzaWg7CiAKLQlyZXQgPSAob2ktPmZuLT5pbml0KSAoc2loLCBvaSk7CisJcmV0ID0gKG9pLT5mbi0+aW5pdCkoc2loLCBvaSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9jbW4uYwppbmRleCAyZmFlYTUwLi4yNjRmOGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9jbW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9jbW4uYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJezIwNCwgNTAyMH0sCiAJezIwOCwgNTA0MH0sCiAJezIxMiwgNTA2MH0sCi0JezIxNiwgNTA4MDB9CisJezIxNiwgNTA4MH0KIH07CiAKIHN0YXRpYyBjb25zdCB1OCBvZmRtX3JhdGVfbG9va3VwW10gPSB7CkBAIC0xNDksOSArMTQ5LDggQEAKIHZvaWQgd2xjX3JhZGlvcmVnX2V4aXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKIHsKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQl1MTYgZHVtbXk7CiAKLQlkdW1teSA9IFJfUkVHKCZwaS0+cmVncy0+cGh5dmVyc2lvbik7CisJKHZvaWQpYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5dmVyc2lvbikpOwogCXBpLT5waHlfd3JlZyA9IDA7CiAJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfTE9DS19SQURJTywgMCk7CiB9CkBAIC0xODYsMTkgKzE4NSwxMSBAQAogCWlmICgoRDExUkVWX0dFKHBpLT5zaC0+Y29yZXJldiwgMjQpKSB8fAogCSAgICAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMjIpCiAJICAgICAmJiAocGktPnB1YnBpLnBoeV90eXBlICE9IFBIWV9UWVBFX1NTTikpKSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cmFkaW9yZWdhZGRyLCBhZGRyKTsKLQkJZGF0YSA9IFJfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhKTsKKwkJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhyYWRpb3JlZ2FkZHIpLCBhZGRyKTsKKwkJZGF0YSA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOwogCX0gZWxzZSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cGh5NHdhZGRyLCBhZGRyKTsKLQotI2lmZGVmIF9fQVJNX0FSQ0hfNFRfXwotCQlfX2FzbV9fKCIgLmFsaWduIDQgIik7Ci0JCV9fYXNtX18oIiBub3AgIik7Ci0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbHNlCi0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbmRpZgotCisJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdhZGRyKSwgYWRkcik7CisJCWRhdGEgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHk0d2RhdGFsbykpOwogCX0KIAlwaS0+cGh5X3dyZWcgPSAwOwogCkBAIC0yMTEsMTUgKzIwMiwxNSBAQAogCSAgICAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMjIpCiAJICAgICAmJiAocGktPnB1YnBpLnBoeV90eXBlICE9IFBIWV9UWVBFX1NTTikpKSB7CiAKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIGFkZHIpOwotCQlXX1JFRygmcGktPnJlZ3MtPnJhZGlvcmVnZGF0YSwgdmFsKTsKKwkJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhyYWRpb3JlZ2FkZHIpLCBhZGRyKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSksIHZhbCk7CiAJfSBlbHNlIHsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5waHk0d2FkZHIsIGFkZHIpOwotCQlXX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvLCB2YWwpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeTR3YWRkciksIGFkZHIpOworCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdkYXRhbG8pLCB2YWwpOwogCX0KIAogCWlmICgrK3BpLT5waHlfd3JlZyA+PSBwaS0+cGh5X3dyZWdfbGltaXQpIHsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCQlwaS0+cGh5X3dyZWcgPSAwOwogCX0KIH0KQEAgLTIzMSwxOSArMjIyLDIwIEBACiAJaWYgKEQxMVJFVl9HRShwaS0+c2gtPmNvcmVyZXYsIDI0KSkgewogCQl1MzIgYjAsIGIxLCBiMjsKIAotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMCk7Ci0JCWIwID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOwotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMSk7Ci0JCWIxID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOwotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMik7Ci0JCWIyID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDApOworCQliMCA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDEpOworCQliMSA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDIpOworCQliMiA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOwogCiAJCWlkID0gKChiMCAmIDB4ZikgPDwgMjgpIHwgKCgoYjIgPDwgOCkgfCBiMSkgPDwgMTIpIHwgKChiMCA+PiA0KQogCQkJCQkJCQkgICAgICAmIDB4Zik7CiAJfSBlbHNlIHsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5waHk0d2FkZHIsIFJBRElPX0lEQ09ERSk7Ci0JCWlkID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5waHk0d2RhdGFsbyk7Ci0JCWlkIHw9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cGh5NHdkYXRhaGkpIDw8IDE2OworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeTR3YWRkciksIFJBRElPX0lEQ09ERSk7CisJCWlkID0gKHUzMikgYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdkYXRhbG8pKTsKKwkJaWQgfD0gKHUzMikgYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsCisJCQkJCUQxMVJFR09GRlMocGh5NHdkYXRhaGkpKSA8PCAxNjsKIAl9CiAJcGktPnBoeV93cmVnID0gMDsKIAlyZXR1cm4gaWQ7CkBAIC0yODMsNzUgKzI3NSw1MiBAQAogCiB2b2lkIHdyaXRlX3BoeV9jaGFubmVsX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCB2YWwpCiB7Ci0JV19SRUcoJnBpLT5yZWdzLT5waHljaGFubmVsLCB2YWwpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHljaGFubmVsKSwgdmFsKTsKIH0KIAogdTE2IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKKwliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyKTsKIAogCXBpLT5waHlfd3JlZyA9IDA7Ci0JcmV0dXJuIFJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKTsKKwlyZXR1cm4gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSkpOwogfQogCiB2b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7Ci0KLQlyZWdzID0gcGktPnJlZ3M7Ci0KICNpZmRlZiBDT05GSUdfQkNNNDdYWAotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQlXX1JFRygmcmVncy0+cGh5cmVnZGF0YSwgdmFsKTsKKwliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIHZhbCk7CiAJaWYgKGFkZHIgPT0gMHg3MikKLQkJKHZvaWQpUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpOworCQkodm9pZCliY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHl2ZXJzaW9uKSk7CiAjZWxzZQotCVdfUkVHKCh1MzIgX19pb21lbSAqKSgmcmVncy0+cGh5cmVnYWRkciksIGFkZHIgfCAodmFsIDw8IDE2KSk7CisJYmNtYV93cml0ZTMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyIHwgKHZhbCA8PCAxNikpOwogCWlmICgrK3BpLT5waHlfd3JlZyA+PSBwaS0+cGh5X3dyZWdfbGltaXQpIHsKIAkJcGktPnBoeV93cmVnID0gMDsKLQkJKHZvaWQpUl9SRUcoJnJlZ3MtPnBoeXZlcnNpb24pOworCQkodm9pZCliY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHl2ZXJzaW9uKSk7CiAJfQogI2VuZGlmCiB9CiAKIHZvaWQgYW5kX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7Ci0KLQlyZWdzID0gcGktPnJlZ3M7Ci0KLQlXX1JFR19GTFVTSCgmcmVncy0+cGh5cmVnYWRkciwgYWRkcik7Ci0KLQlXX1JFRygmcmVncy0+cGh5cmVnZGF0YSwgKFJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKSAmIHZhbCkpOworCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksIGFkZHIpOworCWJjbWFfbWFzazE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2RhdGEpLCB2YWwpOwogCXBpLT5waHlfd3JlZyA9IDA7CiB9CiAKIHZvaWQgb3JfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQotCVdfUkVHKCZyZWdzLT5waHlyZWdkYXRhLCAoUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpIHwgdmFsKSk7CisJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdhZGRyKSwgYWRkcik7CisJYmNtYV9zZXQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdkYXRhKSwgdmFsKTsKIAlwaS0+cGh5X3dyZWcgPSAwOwogfQogCiB2b2lkIG1vZF9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IG1hc2ssIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQotCVdfUkVHKCZyZWdzLT5waHlyZWdkYXRhLAotCSAgICAgICgoUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKSk7CisJdmFsICY9IG1hc2s7CisJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdhZGRyKSwgYWRkcik7CisJYmNtYV9tYXNrc2V0MTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIH5tYXNrLCB2YWwpOwogCXBpLT5waHlfd3JlZyA9IDA7CiB9CiAKQEAgLTQxMiwxMCArMzgxLDggQEAKIAlzaC0+c3JvbXJldiA9IHNocC0+c3JvbXJldjsKIAlzaC0+Ym9hcmR0eXBlID0gc2hwLT5ib2FyZHR5cGU7CiAJc2gtPmJvYXJkcmV2ID0gc2hwLT5ib2FyZHJldjsKLQlzaC0+Ym9hcmR2ZW5kb3IgPSBzaHAtPmJvYXJkdmVuZG9yOwogCXNoLT5ib2FyZGZsYWdzID0gc2hwLT5ib2FyZGZsYWdzOwogCXNoLT5ib2FyZGZsYWdzMiA9IHNocC0+Ym9hcmRmbGFnczI7Ci0Jc2gtPmJ1c2NvcmVyZXYgPSBzaHAtPmJ1c2NvcmVyZXY7CiAKIAlzaC0+ZmFzdF90aW1lciA9IFBIWV9TV19USU1FUl9GQVNUOwogCXNoLT5zbG93X3RpbWVyID0gUEhZX1NXX1RJTUVSX1NMT1c7CkBAIC00NTgsNyArNDI1LDcgQEAKIH0KIAogc3RydWN0IGJyY21zX3BoeV9wdWIgKgotd2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLCBzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzLAord2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmQxMWNvcmUsCiAJICAgICAgIGludCBiYW5kdHlwZSwgc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaTsKQEAgLTQ3MCw3ICs0MzcsNyBAQAogCWlmIChEMTFSRVZfSVMoc2gtPmNvcmVyZXYsIDQpKQogCQlzZmxhZ3MgPSBTSVNGXzJHX1BIWSB8IFNJU0ZfNUdfUEhZOwogCWVsc2UKLQkJc2ZsYWdzID0gYWlfY29yZV9zZmxhZ3Moc2gtPnNpaCwgMCwgMCk7CisJCXNmbGFncyA9IGJjbWFfYXJlYWQzMihkMTFjb3JlLCBCQ01BX0lPU1QpOwogCiAJaWYgKGJhbmR0eXBlID09IEJSQ01fQkFORF81RykgewogCQlpZiAoKHNmbGFncyAmIChTSVNGXzVHX1BIWSB8IFNJU0ZfREJfUEhZKSkgPT0gMCkKQEAgLTQ4OCw3ICs0NTUsNyBAQAogCWlmIChwaSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwaS0+d2lwaHkgPSB3aXBoeTsKLQlwaS0+cmVncyA9IHJlZ3M7CisJcGktPmQxMWNvcmUgPSBkMTFjb3JlOwogCXBpLT5zaCA9IHNoOwogCXBpLT5waHlfaW5pdF9wb3IgPSB0cnVlOwogCXBpLT5waHlfd3JlZ19saW1pdCA9IFBIWV9XUkVHX0xJTUlUOwpAQCAtNTAzLDcgKzQ3MCw3IEBACiAJCXBpLT5wdWJwaS5jb3JlZmxhZ3MgPSBTSUNGX0dNT0RFOwogCiAJd2xhcGlfYm1hY19jb3JlcmVzZXQocGktPnNoLT5waHlzaGltLCBwaS0+cHVicGkuY29yZWZsYWdzKTsKLQlwaHl2ZXJzaW9uID0gUl9SRUcoJnBpLT5yZWdzLT5waHl2ZXJzaW9uKTsKKwlwaHl2ZXJzaW9uID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5dmVyc2lvbikpOwogCiAJcGktPnB1YnBpLnBoeV90eXBlID0gUEhZX1RZUEUocGh5dmVyc2lvbik7CiAJcGktPnB1YnBpLnBoeV9yZXYgPSBwaHl2ZXJzaW9uICYgUFZfUFZfTUFTSzsKQEAgLTUxNSw4ICs0ODIsOCBAQAogCXBpLT5wdWJwaS5waHlfY29yZW51bSA9IFBIWV9DT1JFX05VTV8yOwogCXBpLT5wdWJwaS5hbmFfcmV2ID0gKHBoeXZlcnNpb24gJiBQVl9BVl9NQVNLKSA+PiBQVl9BVl9TSElGVDsKIAotCWlmICghcGktPnB1YnBpLnBoeV90eXBlID09IFBIWV9UWVBFX04gJiYKLQkgICAgIXBpLT5wdWJwaS5waHlfdHlwZSA9PSBQSFlfVFlQRV9MQ04pCisJaWYgKHBpLT5wdWJwaS5waHlfdHlwZSAhPSBQSFlfVFlQRV9OICYmCisJICAgIHBpLT5wdWJwaS5waHlfdHlwZSAhPSBQSFlfVFlQRV9MQ04pCiAJCWdvdG8gZXJyOwogCiAJaWYgKGJhbmR0eXBlID09IEJSQ01fQkFORF81RykgewpAQCAtNzg3LDE0ICs3NTQsMTQgQEAKIAogCXBpLT5yYWRpb19jaGFuc3BlYyA9IGNoYW5zcGVjOwogCi0JbWMgPSBSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOworCW1jID0gYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCWlmIChXQVJOKG1jICYgTUNUTF9FTl9NQUMsICJIVyBlcnJvciBNQUMgcnVubmluZyBvbiBpbml0IikpCiAJCXJldHVybjsKIAogCWlmICghKHBpLT5tZWFzdXJlX2hvbGQgJiBQSFlfSE9MRF9GT1JfU0NBTikpCiAJCXBpLT5tZWFzdXJlX2hvbGQgfD0gUEhZX0hPTERfRk9SX05PVF9BU1NPQzsKIAotCWlmIChXQVJOKCEoYWlfY29yZV9zZmxhZ3MocGktPnNoLT5zaWgsIDAsIDApICYgU0lTRl9GQ0xLQSksCisJaWYgKFdBUk4oIShiY21hX2FyZWFkMzIocGktPmQxMWNvcmUsIEJDTUFfSU9TVCkgJiBTSVNGX0ZDTEtBKSwKIAkJICJIVyBlcnJvciBTSVNGX0ZDTEtBXG4iKSkKIAkJcmV0dXJuOwogCkBAIC04MzMsOCArODAwLDggQEAKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKIAl2b2lkICgqY2FsX2luaXQpKHN0cnVjdCBicmNtc19waHkgKikgPSBOVUxMOwogCi0JaWYgKFdBUk4oKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykgIT0gMCwKLQkJICJIVyBlcnJvcjogTUFDIGVuYWJsZWQgZHVyaW5nIHBoeSBjYWxcbiIpKQorCWlmIChXQVJOKChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkgIE1DVExfRU5fTUFDKSAhPSAwLCAiSFcgZXJyb3I6IE1BQyBlbmFibGVkIGR1cmluZyBwaHkgY2FsXG4iKSkKIAkJcmV0dXJuOwogCiAJaWYgKCFwaS0+aW5pdGlhbGl6ZWQpIHsKQEAgLTEwMjUsNyArOTkyLDcgQEAKIHZvaWQgd2xjX3BoeV9kb19kdW1teV90eChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBvZmRtLCBib29sIHBhX29uKQogewogI2RlZmluZSBEVU1NWV9QS1RfTEVOICAgMjAKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gcGktPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gcGktPmQxMWNvcmU7CiAJaW50IGksIGNvdW50OwogCXU4IG9mZG1wa3RbRFVNTVlfUEtUX0xFTl0gPSB7CiAJCTB4Y2MsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDQsIDB4MDAsIDB4MDAsIDB4MDAsCkBAIC0xMDQxLDI2ICsxMDA4LDI4IEBACiAJd2xhcGlfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0ocGktPnNoLT5waHlzaGltLCAwLCBEVU1NWV9QS1RfTEVOLAogCQkJCSAgICAgIGR1bW15cGt0KTsKIAotCVdfUkVHKCZyZWdzLT54bXRzZWwsIDApOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdHNlbCksIDApOwogCiAJaWYgKEQxMVJFVl9HRShwaS0+c2gtPmNvcmVyZXYsIDExKSkKLQkJV19SRUcoJnJlZ3MtPndlcGN0bCwgMHgxMDApOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh3ZXBjdGwpLCAweDEwMCk7CiAJZWxzZQotCQlXX1JFRygmcmVncy0+d2VwY3RsLCAwKTsKKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMod2VwY3RsKSwgMCk7CiAKLQlXX1JFRygmcmVncy0+dHhlX3BoeWN0bCwgKG9mZG0gPyAxIDogMCkgfCBQSFlfVFhDX0FOVF8wKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfcGh5Y3RsKSwKKwkJICAgICAob2ZkbSA/IDEgOiAwKSB8IFBIWV9UWENfQU5UXzApOwogCWlmIChJU05QSFkocGkpIHx8IElTTENOUEhZKHBpKSkKLQkJV19SRUcoJnJlZ3MtPnR4ZV9waHljdGwxLCAweDFBMDIpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfcGh5Y3RsMSksIDB4MUEwMik7CiAKLQlXX1JFRygmcmVncy0+dHhlX3dtXzAsIDApOwotCVdfUkVHKCZyZWdzLT50eGVfd21fMSwgMCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlModHhlX3dtXzApLCAwKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfd21fMSksIDApOwogCi0JV19SRUcoJnJlZ3MtPnhtdHRwbGF0ZXR4cHRyLCAwKTsKLQlXX1JFRygmcmVncy0+eG10dHhjbnQsIERVTU1ZX1BLVF9MRU4pOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdHRwbGF0ZXR4cHRyKSwgMCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10dHhjbnQpLCBEVU1NWV9QS1RfTEVOKTsKIAotCVdfUkVHKCZyZWdzLT54bXRzZWwsICgoOCA8PCA4KSB8ICgxIDw8IDUpIHwgKDEgPDwgMikgfCAyKSk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10c2VsKSwKKwkJICAgICAoKDggPDwgOCkgfCAoMSA8PCA1KSB8ICgxIDw8IDIpIHwgMikpOwogCi0JV19SRUcoJnJlZ3MtPnR4ZV9jdGwsIDApOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9jdGwpLCAwKTsKIAogCWlmICghcGFfb24pIHsKIAkJaWYgKElTTlBIWShwaSkpCkBAIC0xMDY4LDI3ICsxMDM3LDI4IEBACiAJfQogCiAJaWYgKElTTlBIWShwaSkgfHwgSVNMQ05QSFkocGkpKQotCQlXX1JFRygmcmVncy0+dHhlX2F1eCwgMHhEMCk7CisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9hdXgpLCAweEQwKTsKIAllbHNlCi0JCVdfUkVHKCZyZWdzLT50eGVfYXV4LCAoKDEgPDwgNSkgfCAoMSA8PCA0KSkpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfYXV4KSwgKCgxIDw8IDUpIHwgKDEgPDwgNCkpKTsKIAotCSh2b2lkKVJfUkVHKCZyZWdzLT50eGVfYXV4KTsKKwkodm9pZCliY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9hdXgpKTsKIAogCWkgPSAwOwogCWNvdW50ID0gb2ZkbSA/IDMwIDogMjUwOwogCXdoaWxlICgoaSsrIDwgY291bnQpCi0JICAgICAgICYmIChSX1JFRygmcmVncy0+dHhlX3N0YXR1cykgJiAoMSA8PCA3KSkpCisJICAgICAgICYmIChiY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9zdGF0dXMpKSAmICgxIDw8IDcpKSkKIAkJdWRlbGF5KDEwKTsKIAogCWkgPSAwOwogCi0Jd2hpbGUgKChpKysgPCAxMCkKLQkgICAgICAgJiYgKChSX1JFRygmcmVncy0+dHhlX3N0YXR1cykgJiAoMSA8PCAxMCkpID09IDApKQorCXdoaWxlICgoaSsrIDwgMTApICYmCisJICAgICAgICgoYmNtYV9yZWFkMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfc3RhdHVzKSkgJiAoMSA8PCAxMCkpID09IDApKQogCQl1ZGVsYXkoMTApOwogCiAJaSA9IDA7CiAKLQl3aGlsZSAoKGkrKyA8IDEwKSAmJiAoKFJfUkVHKCZyZWdzLT5pZnNzdGF0KSAmICgxIDw8IDgpKSkpCisJd2hpbGUgKChpKysgPCAxMCkgJiYKKwkgICAgICAgKChiY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKGlmc3N0YXQpKSAmICgxIDw8IDgpKSkpCiAJCXVkZWxheSgxMCk7CiAKIAlpZiAoIXBhX29uKSB7CkBAIC0xMTQ1LDcgKzExMTUsNyBAQAogdm9pZCB3bGNfcGh5X3N3aXRjaF9yYWRpbyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBib29sIG9uKQogewogCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCk7CisJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCiAJaWYgKElTTlBIWShwaSkpIHsKIAkJd2xjX3BoeV9zd2l0Y2hfcmFkaW9fbnBoeShwaSwgb24pOwpAQCAtMTM4NSw3ICsxMzU1LDcgQEAKIAltZW1jcHkoJnBpLT50eF91c2VyX3RhcmdldFtUWFBfRklSU1RfTUNTXzQwX1NETV0sCiAJICAgICAgICZ0eHB3ci0+bWNzXzQwX21pbW9bMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0pOwogCi0JaWYgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykKKwlpZiAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYgTUNUTF9FTl9NQUMpCiAJCW1hY19lbmFibGVkID0gdHJ1ZTsKIAogCWlmIChtYWNfZW5hYmxlZCkKQEAgLTE0MTUsNyArMTM4NSw4IEBACiAJCWlmICghU0NBTl9JTlBST0dfUEhZKHBpKSkgewogCQkJYm9vbCBzdXNwZW5kOwogCi0JCQlzdXNwZW5kID0gKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJgorCQkJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwKKwkJCQkJCSAgICAgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgogCQkJCQkgTUNUTF9FTl9NQUMpKTsKIAogCQkJaWYgKCFzdXNwZW5kKQpAQCAtMTg2OCwxOCArMTgzOSwxNyBAQAogCiAJCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAzKQogCQkgICAgfHwgTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnYWRkciwgMHhhMCk7Ci0JCQkodm9pZClSX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2FkZHIpOwotCQkJcnhjID0gUl9SRUcoJnBpLT5yZWdzLT5waHlyZWdkYXRhKTsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnZGF0YSwKLQkJCSAgICAgICgweDEgPDwgMTUpIHwgcnhjKTsKKwkJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksCisJCQkJICAgICAgMHhhMCk7CisJCQliY21hX3NldDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2RhdGEpLAorCQkJCSAgIDB4MSA8PCAxNSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykKIAkJICAgIHx8IE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDQpKSB7Ci0JCQlXX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2FkZHIsIDB4YTApOwotCQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5waHlyZWdhZGRyKTsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnZGF0YSwgcnhjKTsKKwkJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksCisJCQkJICAgICAgMHhhMCk7CisJCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIHJ4Yyk7CiAJCX0KIAogCQl3bGNfcGh5X3Bvcl9pbmZvcm0ocHBpKTsKQEAgLTE5OTksNyArMTk2OSw5IEBACiAJcGktPnR4cHdyY3RybCA9IGh3cHdyY3RybDsKIAogCWlmIChJU05QSFkocGkpKSB7Ci0JCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsCisJCQkJCSAgICAgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJCSBNQ1RMX0VOX01BQykpOwogCQlpZiAoIXN1c3BlbmQpCiAJCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yMjAxLDcgKzIxNzMsOCBAQAogCWlmICghcGktPnNoLT5jbGspCiAJCXJldHVybjsKIAotCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yNDE5LDggKzIzOTIsOCBAQAogCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAyLCAwKTsKIAkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMywgMCk7CiAKLQkJCU9SX1JFRygmcGktPnJlZ3MtPm1hY2NvbW1hbmQsCi0JCQkgICAgICAgTUNNRF9CR19OT0lTRSk7CisJCQliY21hX3NldDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLAorCQkJCSAgIE1DTURfQkdfTk9JU0UpOwogCQl9IGVsc2UgewogCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIAkJCXdsY19sY25waHlfZGVhZl9tb2RlKHBpLCAoYm9vbCkgMCk7CkBAIC0yNDM4LDggKzI0MTEsOCBAQAogCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAyLCAwKTsKIAkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMywgMCk7CiAKLQkJCU9SX1JFRygmcGktPnJlZ3MtPm1hY2NvbW1hbmQsCi0JCQkgICAgICAgTUNNRF9CR19OT0lTRSk7CisJCQliY21hX3NldDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLAorCQkJCSAgIE1DTURfQkdfTk9JU0UpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07CiAJCQl1MzIgY21wbHhfcHdyW1BIWV9DT1JFX01BWF07CkBAIC0yOTMyLDI5ICsyOTA1LDI5IEBACiAJCQkJbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7CiAKIAkJCX0KLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvY29udHJvbCksCi0JCQkJICAgfjB4MCwgMHgwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0KSwgMHg0MCwKLQkJCQkgICAweDQwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLCAweDQwLAotCQkJCSAgIDB4NDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAorCQkJCSAgfjB4MCwgMHgwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGdwaW9vdXQpLAorCQkJCSAgMHg0MCwgMHg0MCk7CisJCQlhaV9jY19yZWcocGktPnNoLT5zaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLAorCQkJCSAgMHg0MCwgMHg0MCk7CiAJCX0gZWxzZSB7CiAJCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMiksICgwKSA8PCAyKTsKIAogCQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDIpLCAoMCkgPDwgMik7CiAKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0KSwgMHg0MCwKLQkJCQkgICAweDAwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLCAweDQwLAotCQkJCSAgIDB4MCk7Ci0JCQlhaV9jb3JlcmVnKHBpLT5zaC0+c2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAotCQkJCSAgIH4weDAsIDB4NDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb291dCksCisJCQkJICAweDQwLCAweDAwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGdwaW9vdXRlbiksCisJCQkJICAweDQwLCAweDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAorCQkJCSAgfjB4MCwgMHg0MCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9oYWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCmluZGV4IDk2ZTE1MTYuLmUzNGE3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCkBAIC0xNjYsNyArMTY2LDYgQEAKIAlzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbTsKIAl1aW50IHVuaXQ7CiAJdWludCBjb3JlcmV2OwotCXVpbnQgYnVzY29yZXJldjsKIAl1MTYgdmlkOwogCXUxNiBkaWQ7CiAJdWludCBjaGlwOwpAQCAtMTc1LDcgKzE3NCw2IEBACiAJdWludCBzcm9tcmV2OwogCXVpbnQgYm9hcmR0eXBlOwogCXVpbnQgYm9hcmRyZXY7Ci0JdWludCBib2FyZHZlbmRvcjsKIAl1MzIgYm9hcmRmbGFnczsKIAl1MzIgYm9hcmRmbGFnczI7CiB9OwpAQCAtMTgzLDcgKzE4MSw3IEBACiAKIGV4dGVybiBzdHJ1Y3Qgc2hhcmVkX3BoeSAqd2xjX3BoeV9zaGFyZWRfYXR0YWNoKHN0cnVjdCBzaGFyZWRfcGh5X3BhcmFtcyAqc2hwKTsKIGV4dGVybiBzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqd2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLAotCQkJCQkgICAgc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncywKKwkJCQkJICAgIHN0cnVjdCBiY21hX2RldmljZSAqZDExY29yZSwKIAkJCQkJICAgIGludCBiYW5kdHlwZSwgc3RydWN0IHdpcGh5ICp3aXBoeSk7CiBleHRlcm4gdm9pZCB3bGNfcGh5X2RldGFjaChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfaW50LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAppbmRleCA1Zjk0NzhiLi5hZjAwZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaApAQCAtNTAzLDEwICs1MDMsOCBAQAogCXVpbnQgc3JvbXJldjsKIAl1aW50IGJvYXJkdHlwZTsKIAl1aW50IGJvYXJkcmV2OwotCXVpbnQgYm9hcmR2ZW5kb3I7CiAJdTMyIGJvYXJkZmxhZ3M7CiAJdTMyIGJvYXJkZmxhZ3MyOwotCXVpbnQgYnVzY29yZXJldjsKIAl1aW50IGZhc3RfdGltZXI7CiAJdWludCBzbG93X3RpbWVyOwogCXVpbnQgZ2xhY2lhbF90aW1lcjsKQEAgLTU1OSw3ICs1NTcsNyBAQAogCX0gdTsKIAlib29sIHVzZXJfdHhwd3JfYXRfcmZwb3J0OwogCi0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmQxMWNvcmU7CiAJc3RydWN0IGJyY21zX3BoeSAqbmV4dDsKIAlzdHJ1Y3QgYnJjbXNfcGh5X3B1YiBwdWJwaTsKIApAQCAtMTA5MCw3ICsxMDg4LDcgQEAKIAogI2RlZmluZSBCUkNNU19QSFlfV0FSX1BSNTE1NzEocGkpIFwKIAlpZiAoTlJFVl9MVCgocGkpLT5wdWJwaS5waHlfcmV2LCAzKSkgXAotCQkodm9pZClSX1JFRygmKHBpKS0+cmVncy0+bWFjY29udHJvbCkKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpCiAKIGV4dGVybiB2b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbnBoeV9ydW4oc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IGNhbHR5cGUpOwogZXh0ZXJuIHZvaWQgd2xjX3BoeV9hY2lfcmVzZXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9sY24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jCmluZGV4IGE2M2FhOTkuLmVmYTAxNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jCkBAIC0yODEzLDEwICsyODEzLDggQEAKIAl1MTYgU0FWRV9qdGFnX2F1eHBnYSA9IHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzBGRikgJiAweDEwOwogCXUxNiBTQVZFX2lxYWRjX2F1eF9lbiA9IHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExRikgJiA0OwogCWlkbGVUc3NpID0gcmVhZF9waHlfcmVnKHBpLCAweDRhYik7Ci0Jc3VzcGVuZCA9Ci0JCSgwID09Ci0JCSAoUl9SRUcoJigoc3RydWN0IGJyY21zX3BoeSAqKSBwaSktPnJlZ3MtPm1hY2NvbnRyb2wpICYKLQkJICBNQ1RMX0VOX01BQykpOworCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCSBNQ1RMX0VOX01BQykpOwogCWlmICghc3VzcGVuZCkKIAkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIAl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgTENOUEhZX1RYX1BXUl9DVFJMX09GRik7CkBAIC0yODkwLDcgKzI4ODgsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCiAJCXZhbHVlc190b19zYXZlW2ldID0gcmVhZF9waHlfcmVnKHBpLCB0ZW1wc2Vuc2VfcGh5X3JlZ3NbaV0pOwotCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCXNhdmVfdHhwd3JDdHJsRW4gPSByZWFkX3JhZGlvX3JlZyhwaSwgMHg0YTQpOwpAQCAtMzAxNiw4ICszMDE1LDggQEAKIAlib29sIHN1c3BlbmQ7CiAJc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7CiAKLQlzdXNwZW5kID0KLQkJKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOworCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCSBNQ1RMX0VOX01BQykpOwogCWlmICghc3VzcGVuZCkKIAkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIApAQCAtMzUzNSwxNSArMzUzNCwxNyBAQAogCXRpbWVyID0gMDsKIAlvbGRfc3NscG5DYWxpYkNsa0VuQ3RybCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg2ZGEpOwogCi0JY3VydmFsMSA9IFJfUkVHKCZwaS0+cmVncy0+cHNtX2NvcmVjdGxzdHMpOworCWN1cnZhbDEgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fY29yZWN0bHN0cykpOwogCXB0clsxMzBdID0gMDsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9jb3JlY3Rsc3RzLCAoKDEgPDwgNikgfCBjdXJ2YWwxKSk7CisJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9jb3JlY3Rsc3RzKSwKKwkJICAgICAoKDEgPDwgNikgfCBjdXJ2YWwxKSk7CiAKLQlXX1JFRygmcGktPnJlZ3MtPnNtcGxfY2xjdF9zdHJwdHIsIDB4N0UwMCk7Ci0JV19SRUcoJnBpLT5yZWdzLT5zbXBsX2NsY3Rfc3RwcHRyLCAweDgwMDApOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhzbXBsX2NsY3Rfc3RycHRyKSwgMHg3RTAwKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMoc21wbF9jbGN0X3N0cHB0ciksIDB4ODAwMCk7CiAJdWRlbGF5KDIwKTsKLQljdXJ2YWwyID0gUl9SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSk7Ci0JV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgY3VydmFsMiB8IDB4MzApOworCWN1cnZhbDIgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fcGh5X2hkcl9wYXJhbSkpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fcGh5X2hkcl9wYXJhbSksCisJCSAgICAgY3VydmFsMiB8IDB4MzApOwogCiAJd3JpdGVfcGh5X3JlZyhwaSwgMHg1NTUsIDB4MCk7CiAJd3JpdGVfcGh5X3JlZyhwaSwgMHg1YTYsIDB4NSk7CkBAIC0zNTYwLDE5ICszNTYxLDE5IEBACiAKIAlzc2xwbkNhbGliQ2xrRW5DdHJsID0gcmVhZF9waHlfcmVnKHBpLCAweDZkYSk7CiAJd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGEsICh1MzIpIChzc2xwbkNhbGliQ2xrRW5DdHJsIHwgMHgyMDA4KSk7Ci0Jc3RwcHRyID0gUl9SRUcoJnBpLT5yZWdzLT5zbXBsX2NsY3Rfc3RwcHRyKTsKLQljdXJwdHIgPSBSX1JFRygmcGktPnJlZ3MtPnNtcGxfY2xjdF9jdXJwdHIpOworCXN0cHB0ciA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHNtcGxfY2xjdF9zdHBwdHIpKTsKKwljdXJwdHIgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhzbXBsX2NsY3RfY3VycHRyKSk7CiAJZG8gewogCQl1ZGVsYXkoMTApOwotCQljdXJwdHIgPSBSX1JFRygmcGktPnJlZ3MtPnNtcGxfY2xjdF9jdXJwdHIpOworCQljdXJwdHIgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhzbXBsX2NsY3RfY3VycHRyKSk7CiAJCXRpbWVyKys7CiAJfSB3aGlsZSAoKGN1cnB0ciAhPSBzdHBwdHIpICYmICh0aW1lciA8IDUwMCkpOwogCi0JV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgMHgyKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pLCAweDIpOwogCXN0cnB0ciA9IDB4N0UwMDsKLQlXX1JFRygmcGktPnJlZ3MtPnRwbGF0ZXdycHRyLCBzdHJwdHIpOworCWJjbWFfd3JpdGUzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyh0cGxhdGV3cnB0ciksIHN0cnB0cik7CiAJd2hpbGUgKHN0cnB0ciA8IDB4ODAwMCkgewotCQl2YWwgPSBSX1JFRygmcGktPnJlZ3MtPnRwbGF0ZXdyZGF0YSk7CisJCXZhbCA9IGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdyZGF0YSkpOwogCQlpbWFnID0gKCh2YWwgPj4gMTYpICYgMHgzZmYpOwogCQlyZWFsID0gKCh2YWwpICYgMHgzZmYpOwogCQlpZiAoaW1hZyA+IDUxMSkKQEAgLTM1OTcsOCArMzU5OCw4IEBACiAJfQogCiAJd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGEsIG9sZF9zc2xwbkNhbGliQ2xrRW5DdHJsKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCBjdXJ2YWwyKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9jb3JlY3Rsc3RzLCBjdXJ2YWwxKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pLCBjdXJ2YWwyKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX2NvcmVjdGxzdHMpLCBjdXJ2YWwxKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM5NjgsOSArMzk2OSw5IEBACiAJYm9vbCBzdXNwZW5kID0gMDsKIAogCWlmIChtb2RlID09IDEpIHsKLQkJc3VzcGVuZCA9Ci0JCQkoMCA9PQotCQkJIChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwkJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwKKwkJCQkJICAgICBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkJIE1DVExfRU5fTUFDKSk7CiAJCWlmICghc3VzcGVuZCkKIAkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAJCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBURU1QU0VOU0UpOwpAQCAtNDAxMiw5ICs0MDEzLDkgQEAKIAlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwogCiAJaWYgKG1vZGUgPT0gMSkgewotCQlzdXNwZW5kID0KLQkJCSgwID09Ci0JCQkgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOworCQlzdXNwZW5kID0gKDAgPT0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCQkgTUNUTF9FTl9NQUMpKTsKIAkJaWYgKCFzdXNwZW5kKQogCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIAkJd2xjX2xjbnBoeV92YmF0X3RlbXBfc2Vuc2Vfc2V0dXAocGksIFRFTVBTRU5TRSk7CkBAIC00MDc4LDkgKzQwNzksOSBAQAogCWJvb2wgc3VzcGVuZCA9IDA7CiAKIAlpZiAobW9kZSA9PSAxKSB7Ci0JCXN1c3BlbmQgPQotCQkJKDAgPT0KLQkJCSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsCisJCQkJCSAgICAgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJCSBNQ1RMX0VOX01BQykpOwogCQlpZiAoIXN1c3BlbmQpCiAJCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCQl3bGNfbGNucGh5X3ZiYXRfdGVtcF9zZW5zZV9zZXR1cChwaSwgVkJBVFNFTlNFKTsKQEAgLTQxMjcsOCArNDEyOCw4IEBACiAJczggaW5kZXg7CiAJdTE2IFNBVkVfcHdyY3RybCA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKIAlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCXN1c3BlbmQgPQotCQkoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCXdsY19sY25waHlfZGVhZl9tb2RlKHBpLCB0cnVlKTsKQEAgLTQxNjYsOCArNDE2Nyw4IEBACiAJcGlfbGNuLT5sY25waHlfZnVsbF9jYWxfY2hhbm5lbCA9IENIU1BFQ19DSEFOTkVMKHBpLT5yYWRpb19jaGFuc3BlYyk7CiAJaW5kZXggPSBwaV9sY24tPmxjbnBoeV9jdXJyZW50X2luZGV4OwogCi0Jc3VzcGVuZCA9Ci0JCSgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwlzdXNwZW5kID0gKDAgPT0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkgTUNUTF9FTl9NQUMpKTsKIAlpZiAoIXN1c3BlbmQpIHsKIAkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0NUU19EVVJBVElPTiwgMTAwMDApOwogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jCmluZGV4IGVjOWI1NjYuLmExNmYxYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9uLmMKQEAgLTE3ODAyLDcgKzE3ODAyLDcgQEAKIAogCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMSkgfHwgRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTIpKSB7CiAJCXdsYXBpX2JtYWNfbWN0cmwocGktPnNoLT5waHlzaGltLCBNQ1RMX1BIWUxPQ0ssIE1DVExfUEhZTE9DSyk7Ci0JCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAkJdWRlbGF5KDEpOwogCX0KIApAQCAtMTc5NTMsNyArMTc5NTMsNyBAQAogCiAJaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDExKSB8fCBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMikpIHsKIAkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgTUNUTF9QSFlMT0NLKTsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCQl1ZGVsYXkoMSk7CiAJfQogCkBAIC0xOTQ0Nyw4ICsxOTQ0Nyw2IEBACiAJdTggdHhfcHdyX2N0cmxfc3RhdGU7CiAJYm9vbCBkb19ucGh5X2NhbCA9IGZhbHNlOwogCXVpbnQgY29yZTsKLQl1aW50IG9yaWdpZHgsIGludHJfdmFsOwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CiAJdTMyIGQxMV9jbGtfY3RsX3N0OwogCWJvb2wgZG9fcnNzaV9jYWwgPSBmYWxzZTsKIApAQCAtMTk0NjIsMjUgKzE5NDYwLDIxIEBACiAJICAgICAocGktPnNoLT5jaGlwcGtnID09IEJDTTQ3MThfUEtHX0lEKSkpIHsKIAkJaWYgKChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRVhUTE5BKSAmJgogCQkgICAgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpKQotCQkJYWlfY29yZXJlZyhwaS0+c2gtPnNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKLQkJCQkgICAweDQwLCAweDQwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKKwkJCQkgIDB4NDAsIDB4NDApOwogCX0KIAogCWlmICgocGktPm5waHlfZ2JhbmRfc3B1cndhcjJfZW4pICYmIENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykgJiYKIAkgICAgQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewogCi0JCXJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCWFpX3N3aXRjaF9jb3JlKHBpLT5zaC0+c2loLAotCQkJCQkgICAgICAgRDExX0NPUkVfSUQsICZvcmlnaWR4LAotCQkJCQkgICAgICAgJmludHJfdmFsKTsKLQkJZDExX2Nsa19jdGxfc3QgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7Ci0JCUFORF9SRUcoJnJlZ3MtPmNsa19jdGxfc3QsCi0JCQl+KENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpOworCQlkMTFfY2xrX2N0bF9zdCA9IGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlMoY2xrX2N0bF9zdCkpOworCQliY21hX21hc2szMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSwKKwkJCSAgICB+KENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpOwogCi0JCVdfUkVHKCZyZWdzLT5jbGtfY3RsX3N0LCBkMTFfY2xrX2N0bF9zdCk7Ci0KLQkJYWlfcmVzdG9yZV9jb3JlKHBpLT5zaC0+c2loLCBvcmlnaWR4LCBpbnRyX3ZhbCk7CisJCWJjbWFfd3JpdGUzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSwKKwkJCSAgICAgZDExX2Nsa19jdGxfc3QpOwogCX0KIAogCXBpLT51c2VfaW50X3R4X2lxbG9fY2FsX25waHkgPQpAQCAtMTk4ODUsNyArMTk4NzksOCBAQAogCWlmICghcGktPnNoLT5jbGspCiAJCXJldHVybjsKIAotCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yMTI2MywyOCArMjEyNTgsMjggQEAKIAl2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4MDkpICYgTlBIWV9CYW5kQ29udHJvbF9jdXJyZW50QmFuZDsKIAlpZiAoQ0hTUEVDX0lTNUcoY2hhbnNwZWMpICYmICF2YWwpIHsKIAotCQl2YWwgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwKKwkJdmFsID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwKIAkJICAgICAgKHZhbCB8IE1BQ19QSFlfRk9SQ0VfQ0xLKSk7CiAKIAkJb3JfcGh5X3JlZyhwaSwgKE5QSFlfVE9fQlBIWV9PRkYgKyBCUEhZX0JCX0NPTkZJRyksCiAJCQkgICAoQkJDRkdfUkVTRVRDQ0EgfCBCQkNGR19SRVNFVFJYKSk7CiAKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgdmFsKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwgdmFsKTsKIAogCQlvcl9waHlfcmVnKHBpLCAweDA5LCBOUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kKTsKIAl9IGVsc2UgaWYgKCFDSFNQRUNfSVM1RyhjaGFuc3BlYykgJiYgdmFsKSB7CiAKIAkJYW5kX3BoeV9yZWcocGksIDB4MDksIH5OUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kKTsKIAotCQl2YWwgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwKKwkJdmFsID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwKIAkJICAgICAgKHZhbCB8IE1BQ19QSFlfRk9SQ0VfQ0xLKSk7CiAKIAkJYW5kX3BoeV9yZWcocGksIChOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9CQl9DT05GSUcpLAogCQkJICAgICh1MTYpICh+KEJCQ0ZHX1JFU0VUQ0NBIHwgQkJDRkdfUkVTRVRSWCkpKTsKIAotCQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCB2YWwpOworCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pLCB2YWwpOwogCX0KIAogCXdyaXRlX3BoeV9yZWcocGksIDB4MWNlLCBjaS0+UEhZX0JXMWEpOwpAQCAtMjEzNDIsMjQgKzIxMzM3LDIzIEBACiAJCQlzcHVyYXZvaWQgPSAxOwogCiAJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgZmFsc2UpOwotCQlzaV9wbXVfc3B1cmF2b2lkKHBpLT5zaC0+c2loLCBzcHVyYXZvaWQpOworCQlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShwaS0+c2gtPnNpaCwgc3B1cmF2b2lkKTsKIAkJd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9jdGwocGktPnNoLT5waHlzaGltLCB0cnVlKTsKIAogCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAogCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgewotCiAJCQlpZiAoc3B1cmF2b2lkID09IDEpIHsKLQotCQkJCVdfUkVHKCZwaS0+cmVncy0+dHNmX2Nsa19mcmFjX2wsCi0JCQkJICAgICAgMHg1MzQxKTsKLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19oLAotCQkJCSAgICAgIDB4OCk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2wpLAorCQkJCQkgICAgIDB4NTM0MSk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2gpLCAweDgpOwogCQkJfSBlbHNlIHsKLQotCQkJCVdfUkVHKCZwaS0+cmVncy0+dHNmX2Nsa19mcmFjX2wsCi0JCQkJICAgICAgMHg4ODg5KTsKLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19oLAotCQkJCSAgICAgIDB4OCk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2wpLAorCQkJCQkgICAgIDB4ODg4OSk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2gpLCAweDgpOwogCQkJfQogCQl9CiAKQEAgLTIxNDk5LDEzICsyMTQ5MywxMyBAQAogCiAJCWFpX2dwaW9jb250cm9sKHBpLT5zaC0+c2loLCBtYXNrLCBtYXNrLCBHUElPX0RSVl9QUklPUklUWSk7CiAKLQkJbWMgPSBSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOworCQltYyA9IGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAkJbWMgJj0gfk1DVExfR1BPVVRfU0VMX01BU0s7Ci0JCVdfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCwgbWMpOworCQliY21hX3dyaXRlMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCksIG1jKTsKIAotCQlPUl9SRUcoJnBpLT5yZWdzLT5wc21fZ3Bpb19vZSwgbWFzayk7CisJCWJjbWFfc2V0MTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX2dwaW9fb2UpLCBtYXNrKTsKIAotCQlBTkRfUkVHKCZwaS0+cmVncy0+cHNtX2dwaW9fb3V0LCB+bWFzayk7CisJCWJjbWFfbWFzazE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9ncGlvX291dCksIH5tYXNrKTsKIAogCQlpZiAobHV0X2luaXQpIHsKIAkJCXdyaXRlX3BoeV9yZWcocGksIDB4ZjgsIDB4MDJkOCk7CkBAIC0yMTUyMiw5ICsyMTUxNiw4IEBACiAJYm9vbCBzdXNwZW5kZWQgPSBmYWxzZTsKIAogCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxNikpIHsKLQkJc3VzcGVuZGVkID0KLQkJCShSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpID8KLQkJCWZhbHNlIDogdHJ1ZTsKKwkJc3VzcGVuZGVkID0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkgICAgIE1DVExfRU5fTUFDKSA/IGZhbHNlIDogdHJ1ZTsKIAkJaWYgKCFzdXNwZW5kZWQpCiAJCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCX0KQEAgLTI1MzgzLDcgKzI1Mzc2LDggQEAKIAlpZiAocGktPm5waHlfcGFwZF9za2lwID09IDEpCiAJCXJldHVybjsKIAotCXBoeV9iMyA9ICgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwlwaHlfYjMgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCU1DVExfRU5fTUFDKSk7CiAJaWYgKCFwaHlfYjMpCiAJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAKQEAgLTI4MzU3LDcgKzI4MzUxLDcgQEAKIAogCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMSkgfHwgRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTIpKSB7CiAJCXdsYXBpX2JtYWNfbWN0cmwocGktPnNoLT5waHlzaGltLCBNQ1RMX1BIWUxPQ0ssIE1DVExfUEhZTE9DSyk7Ci0JCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAkJdWRlbGF5KDEpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5jCmluZGV4IDEyYmE1NzUuLjQ5MzFkMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wbXUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMKQEAgLTExNSwxMCArMTE1LDEwIEBACiAJdWludCByc3JjczsKIAogCS8qICMgcmVzb3VyY2VzICovCi0JcnNyY3MgPSAoc2loLT5wbXVjYXBzICYgUENBUF9SQ19NQVNLKSA+PiBQQ0FQX1JDX1NISUZUOworCXJzcmNzID0gKGFpX2dldF9wbXVjYXBzKHNpaCkgJiBQQ0FQX1JDX01BU0spID4+IFBDQVBfUkNfU0hJRlQ7CiAKIAkvKiBkZXRlcm1pbmUgbWluL21heCByc3JjIG1hc2tzICovCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwlzd2l0Y2ggKGFpX2dldF9jaGlwX2lkKHNpaCkpIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCQkvKiA/Pz8gKi8KQEAgLTEzOSw3NSArMTM5LDg0IEBACiAJKnBtYXggPSBtYXhfbWFzazsKIH0KIAotc3RhdGljIHZvaWQKLXNpX3BtdV9zcHVyYXZvaWRfcGxsdXBkYXRlKHN0cnVjdCBzaV9wdWIgKnNpaCwgc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYywKLQkJCSAgIHU4IHNwdXJhdm9pZCkKK3ZvaWQgc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc3RydWN0IHNpX3B1YiAqc2loLCB1OCBzcHVyYXZvaWQpCiB7CiAJdTMyIHRtcCA9IDA7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOwogCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwkvKiBzd2l0Y2ggdG8gY2hpcGMgKi8KKwljb3JlID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfQ0hJUENPTU1PTiwgMCk7CisKKwlzd2l0Y2ggKGFpX2dldF9jaGlwX2lkKHNpaCkpIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCQlpZiAoc3B1cmF2b2lkID09IDEpIHsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgxMTUwMDAxMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDAwQzBDMDYpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwyKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDBGNjAwYTA4KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMyk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMDAwMDAwMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDQpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MjAwMUU5MjApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw1KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDg4ODg4ODE1KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwwKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MTE1MDAwMTApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDEpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgwMDBDMEMwNik7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMMik7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDBGNjAwYTA4KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwzKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MDAwMDAwMDApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDQpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgyMDAxRTkyMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMNSk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDg4ODg4ODE1KTsKIAkJfSBlbHNlIHsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgxMTEwMDAxMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDAwYzBjMDYpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwyKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAzMDAwYTA4KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMyk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMDAwMDAwMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDQpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MjAwMDA1YzApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw1KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDg4ODg4ODE1KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwwKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MTExMDAwMTApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDEpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgwMDBjMGMwNik7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMMik7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDAzMDAwYTA4KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwzKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MDAwMDAwMDApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDQpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgyMDAwMDVjMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMNSk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDg4ODg4ODE1KTsKIAkJfQogCQl0bXAgPSAxIDw8IDEwOwogCQlicmVhazsKIAotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDApOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgxMTEwMDAwOCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMSk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDBjMDAwYzA2KTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwyKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDMwMDBhMDgpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDMpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMDAwMDAwMCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDIwMDAwNWMwKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw1KTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4ODg4ODg4NTUpOwotCi0JCXRtcCA9IDEgPDwgMTA7Ci0JCWJyZWFrOwotCiAJZGVmYXVsdDoKIAkJLyogYmFpbCBvdXQgKi8KIAkJcmV0dXJuOwogCX0KIAotCXRtcCB8PSBSX1JFRygmY2MtPnBtdWNvbnRyb2wpOwotCVdfUkVHKCZjYy0+cG11Y29udHJvbCwgdG1wKTsKKwliY21hX3NldDMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbXVjb250cm9sKSwgdG1wKTsKIH0KIAogdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKIAl1aW50IGRlbGF5ID0gUE1VX01BWF9UUkFOU0lUSU9OX0RMWTsKIAotCXN3aXRjaCAoc2loLT5jaGlwKSB7CisJc3dpdGNoIChhaV9nZXRfY2hpcF9pZChzaWgpKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKQEAgLTIyMCw1NCArMjI5LDM1IEBACiAJcmV0dXJuICh1MTYpIGRlbGF5OwogfQogCi12b2lkIHNpX3BtdV9zcHJvbV9lbmFibGUoc3RydWN0IHNpX3B1YiAqc2loLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKLQotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgYmVmb3JlIHN3aXRjaCB0byBjaGlwYyAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0JY2MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKLQotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotfQotCiAvKiBSZWFkL3dyaXRlIGEgY2hpcGNvbnRyb2wgcmVnICovCiB1MzIgc2lfcG11X2NoaXBjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2FkZHIpLAotCQkgICB+MCwgcmVnKTsKLQlyZXR1cm4gYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksIG1hc2ssCi0JCQkgIHZhbCk7CisJYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfYWRkciksIH4wLCByZWcpOworCXJldHVybiBhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKKwkJCSBtYXNrLCB2YWwpOwogfQogCiAvKiBSZWFkL3dyaXRlIGEgcmVnY29udHJvbCByZWcgKi8KIHUzMiBzaV9wbXVfcmVnY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCByZWdjb250cm9sX2FkZHIpLAotCQkgICB+MCwgcmVnKTsKLQlyZXR1cm4gYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgcmVnY29udHJvbF9kYXRhKSwgbWFzaywKLQkJCSAgdmFsKTsKKwlhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCByZWdjb250cm9sX2FkZHIpLCB+MCwgcmVnKTsKKwlyZXR1cm4gYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgcmVnY29udHJvbF9kYXRhKSwKKwkJCSBtYXNrLCB2YWwpOwogfQogCiAvKiBSZWFkL3dyaXRlIGEgcGxsY29udHJvbCByZWcgKi8KIHUzMiBzaV9wbXVfcGxsY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbGxjb250cm9sX2FkZHIpLAotCQkgICB+MCwgcmVnKTsKLQlyZXR1cm4gYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgcGxsY29udHJvbF9kYXRhKSwgbWFzaywKLQkJCSAgdmFsKTsKKwlhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbGxjb250cm9sX2FkZHIpLCB+MCwgcmVnKTsKKwlyZXR1cm4gYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgcGxsY29udHJvbF9kYXRhKSwKKwkJCSBtYXNrLCB2YWwpOwogfQogCiAvKiBQTVUgUExMIHVwZGF0ZSAqLwogdm9pZCBzaV9wbXVfcGxsdXBkKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbXVjb250cm9sKSwKLQkJICAgUENUTF9QTExfUExMQ1RMX1VQRCwgUENUTF9QTExfUExMQ1RMX1VQRCk7CisJYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgcG11Y29udHJvbCksCisJCSAgUENUTF9QTExfUExMQ1RMX1VQRCwgUENUTF9QTExfUExMQ1RMX1VQRCk7CiB9CiAKIC8qIHF1ZXJ5IGFscC94dGFsIGNsb2NrIGZyZXF1ZW5jeSAqLwpAQCAtMjc2LDEwICsyNjYsMTAgQEAKIAl1MzIgY2xvY2sgPSBBTFBfQ0xPQ0s7CiAKIAkvKiBiYWlsIG91dCB3aXRoIGRlZmF1bHQgKi8KLQlpZiAoIShzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpKQorCWlmICghKGFpX2dldF9jY2NhcHMoc2loKSAmIENDX0NBUF9QTVUpKQogCQlyZXR1cm4gY2xvY2s7CiAKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzEzX0NISVBfSUQ6CkBAIC0yOTMsOTUgKzI4MywyOSBAQAogCXJldHVybiBjbG9jazsKIH0KIAotdm9pZCBzaV9wbXVfc3B1cmF2b2lkKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTggc3B1cmF2b2lkKQotewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4LCBpbnRyX3ZhbDsKLQotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgYmVmb3JlIHN3aXRjaCB0byBjaGlwYyAqLwotCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKQotCQkJYWlfc3dpdGNoX2NvcmUoc2loLCBDQ19DT1JFX0lELCAmb3JpZ2lkeCwgJmludHJfdmFsKTsKLQotCS8qIHVwZGF0ZSB0aGUgcGxsIGNoYW5nZXMgKi8KLQlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaWgsIGNjLCBzcHVyYXZvaWQpOwotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9yZXN0b3JlX2NvcmUoc2loLCBvcmlnaWR4LCBpbnRyX3ZhbCk7Ci19Ci0KIC8qIGluaXRpYWxpemUgUE1VICovCiB2b2lkIHNpX3BtdV9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAKLQkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlIGJlZm9yZSBzd2l0Y2ggdG8gY2hpcGMgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CisJLyogc2VsZWN0IGNoaXBjICovCisJY29yZSA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOwogCi0JaWYgKHNpaC0+cG11cmV2ID09IDEpCi0JCUFORF9SRUcoJmNjLT5wbXVjb250cm9sLCB+UENUTF9OT0lMUF9PTl9XQUlUKTsKLQllbHNlIGlmIChzaWgtPnBtdXJldiA+PSAyKQotCQlPUl9SRUcoJmNjLT5wbXVjb250cm9sLCBQQ1RMX05PSUxQX09OX1dBSVQpOwotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci19Ci0KLS8qIGluaXRpYWxpemUgUE1VIGNoaXAgY29udHJvbHMgYW5kIG90aGVyIGNoaXAgbGV2ZWwgc3R1ZmYgKi8KLXZvaWQgc2lfcG11X2NoaXBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JdWludCBvcmlnaWR4OwotCi0JLyogR2F0ZSBvZmYgU1BST00gY2xvY2sgYW5kIGNoaXAgc2VsZWN0IHNpZ25hbHMgKi8KLQlzaV9wbXVfc3Byb21fZW5hYmxlKHNpaCwgZmFsc2UpOwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLX0KLQotLyogaW5pdGlhbGl6ZSBQTVUgc3dpdGNoL3JlZ3VsYXRvcnMgKi8KLXZvaWQgc2lfcG11X3N3cmVnX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQotewotfQotCi0vKiBpbml0aWFsaXplIFBMTCAqLwotdm9pZCBzaV9wbXVfcGxsX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IHh0YWxmcmVxKQotewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4OwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKLQljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKLQljYXNlIEJDTTQzMjI0X0NISVBfSUQ6Ci0JY2FzZSBCQ000MzIyNV9DSElQX0lEOgotCQkvKiA/Pz8gKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJaWYgKGFpX2dldF9wbXVyZXYoc2loKSA9PSAxKQorCQliY21hX21hc2szMihjb3JlLCBDSElQQ1JFR09GRlMocG11Y29udHJvbCksCisJCQkgICAgflBDVExfTk9JTFBfT05fV0FJVCk7CisJZWxzZSBpZiAoYWlfZ2V0X3BtdXJldihzaWgpID49IDIpCisJCWJjbWFfc2V0MzIoY29yZSwgQ0hJUENSRUdPRkZTKHBtdWNvbnRyb2wpLCBQQ1RMX05PSUxQX09OX1dBSVQpOwogfQogCiAvKiBpbml0aWFsaXplIFBNVSByZXNvdXJjZXMgKi8KIHZvaWQgc2lfcG11X3Jlc19pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAJdTMyIG1pbl9tYXNrID0gMCwgbWF4X21hc2sgPSAwOwogCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOworCS8qIHNlbGVjdCB0byBjaGlwYyAqLworCWNvcmUgPSBhaV9maW5kY29yZShzaWgsIEJDTUFfQ09SRV9DSElQQ09NTU9OLCAwKTsKIAogCS8qIERldGVybWluZSBtaW4vbWF4IHJzcmMgbWFza3MgKi8KIAlzaV9wbXVfcmVzX21hc2tzKHNpaCwgJm1pbl9tYXNrLCAmbWF4X21hc2spOwpAQCAtMzkxLDU1ICszMTUsNTAgQEAKIAkvKiBQcm9ncmFtIG1heCByZXNvdXJjZSBtYXNrICovCiAKIAlpZiAobWF4X21hc2spCi0JCVdfUkVHKCZjYy0+bWF4X3Jlc19tYXNrLCBtYXhfbWFzayk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMobWF4X3Jlc19tYXNrKSwgbWF4X21hc2spOwogCiAJLyogUHJvZ3JhbSBtaW4gcmVzb3VyY2UgbWFzayAqLwogCiAJaWYgKG1pbl9tYXNrKQotCQlXX1JFRygmY2MtPm1pbl9yZXNfbWFzaywgbWluX21hc2spOworCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKG1pbl9yZXNfbWFzayksIG1pbl9tYXNrKTsKIAogCS8qIEFkZCBzb21lIGRlbGF5OyBhbGxvdyByZXNvdXJjZXMgdG8gY29tZSB1cCBhbmQgc2V0dGxlLiAqLwogCW1kZWxheSgyKTsKLQotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCiB1MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAJdTMyIGFscF9raHo7CiAKLQlpZiAoc2loLT5wbXVyZXYgPCAxMCkKKwlpZiAoYWlfZ2V0X3BtdXJldihzaWgpIDwgMTApCiAJCXJldHVybiAwOwogCiAJLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOworCWNvcmUgPSBhaV9maW5kY29yZShzaWgsIEJDTUFfQ09SRV9DSElQQ09NTU9OLCAwKTsKIAotCWlmIChSX1JFRygmY2MtPnBtdXN0YXR1cykgJiBQU1RfRVhUTFBPQVZBSUwpIHsKKwlpZiAoYmNtYV9yZWFkMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBtdXN0YXR1cykpICYgUFNUX0VYVExQT0FWQUlMKSB7CiAJCXUzMiBpbHBfY3RyLCBhbHBfaHo7CiAKIAkJLyoKIAkJICogRW5hYmxlIHRoZSByZWcgdG8gbWVhc3VyZSB0aGUgZnJlcSwKIAkJICogaW4gY2FzZSBpdCB3YXMgZGlzYWJsZWQgYmVmb3JlCiAJCSAqLwotCQlXX1JFRygmY2MtPnBtdV94dGFsZnJlcSwKLQkJICAgICAgMVUgPDwgUE1VX1hUQUxGUkVRX1JFR19NRUFTVVJFX1NISUZUKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbXVfeHRhbGZyZXEpLAorCQkJICAgIDFVIDw8IFBNVV9YVEFMRlJFUV9SRUdfTUVBU1VSRV9TSElGVCk7CiAKIAkJLyogRGVsYXkgZm9yIHdlbGwgb3ZlciA0IElMUCBjbG9ja3MgKi8KIAkJdWRlbGF5KDEwMDApOwogCiAJCS8qIFJlYWQgdGhlIGxhdGNoZWQgbnVtYmVyIG9mIEFMUCB0aWNrcyBwZXIgNCBJTFAgdGlja3MgKi8KLQkJaWxwX2N0ciA9Ci0JCSAgICBSX1JFRygmY2MtPnBtdV94dGFsZnJlcSkgJiBQTVVfWFRBTEZSRVFfUkVHX0lMUENUUl9NQVNLOworCQlpbHBfY3RyID0gYmNtYV9yZWFkMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBtdV94dGFsZnJlcSkpICYKKwkJCSAgUE1VX1hUQUxGUkVRX1JFR19JTFBDVFJfTUFTSzsKIAogCQkvKgogCQkgKiBUdXJuIG9mZiB0aGUgUE1VX1hUQUxGUkVRX1JFR19NRUFTVVJFX1NISUZUCiAJCSAqIGJpdCB0byBzYXZlIHBvd2VyCiAJCSAqLwotCQlXX1JFRygmY2MtPnBtdV94dGFsZnJlcSwgMCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocG11X3h0YWxmcmVxKSwgMCk7CiAKIAkJLyogQ2FsY3VsYXRlIEFMUCBmcmVxdWVuY3kgKi8KIAkJYWxwX2h6ID0gKGlscF9jdHIgKiBFWFRfSUxQX0haKSAvIDQ7CkBAIC00NTIsOCArMzcxLDUgQEAKIAl9IGVsc2UKIAkJYWxwX2toeiA9IDA7CiAKLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLQogCXJldHVybiBhbHBfa2h6OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5oCmluZGV4IDNhMDhjNjIuLjNlMzljNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wbXUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmgKQEAgLTI2LDEzICsyNiwxMCBAQAogZXh0ZXJuIHUzMiBzaV9wbXVfcmVnY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdTMyIHNpX3BtdV9hbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKTsKIGV4dGVybiB2b2lkIHNpX3BtdV9wbGx1cGQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc3RydWN0IHNpX3B1YiAqc2loLCB1OCBzcHVyYXZvaWQpOworZXh0ZXJuIHZvaWQgc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc3RydWN0IHNpX3B1YiAqc2loLCB1OCBzcHVyYXZvaWQpOwogZXh0ZXJuIHUzMiBzaV9wbXVfcGxsY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdm9pZCBzaV9wbXVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X2NoaXBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3BsbF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIHh0YWxmcmVxKTsKIGV4dGVybiB2b2lkIHNpX3BtdV9yZXNfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3N3cmVnX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKTsKIGV4dGVybiB1MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHN0cnVjdCBzaV9wdWIgKnNpaCk7CiAKICNlbmRpZiAvKiBfQlJDTV9QTVVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wdWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wdWIuaAppbmRleCAwMjI1MjNhLi5mMDAzOGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcHViLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIF9CUkNNX1BVQl9IXwogI2RlZmluZSBfQlJDTV9QVUJfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KICNpbmNsdWRlICJ0eXBlcy5oIgogI2luY2x1ZGUgImRlZnMuaCIKQEAgLTI0OCw3ICsyNDksNiBAQAogfTsKIAogI2RlZmluZQlCUkNNU19OVU1SQVRFUwkxNgkvKiBtYXggIyBvZiByYXRlcyBpbiBhIHJhdGVzZXQgKi8KLSNkZWZpbmUJRDExX1BIWV9IRFJfTEVOCTYJLyogUGh5IGhlYWRlciBsZW5ndGggLSA2IGJ5dGVzICovCiAKIC8qIHBoeSB0eXBlcyAqLwogI2RlZmluZQlQSFlfVFlQRV9BCTAJLyogUGh5IHR5cGUgQSAqLwpAQCAtMzgyLDcgKzM4Miw2IEBACiAJdWludCBfbmJhbmRzOwkJLyogIyBiYW5kcyBzdXBwb3J0ZWQgKi8KIAl1aW50IG5vdzsJCS8qICMgZWxhcHNlZCBzZWNvbmRzICovCiAKLQlib29sIHByb21pc2M7CQkvKiBwcm9taXNjdW91cyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCiAJYm9vbCBkZWxheWVkX2Rvd247CS8qIGRvd24gZGVsYXllZCAqLwogCWJvb2wgYXNzb2NpYXRlZDsJLyogdHJ1ZTpwYXJ0IG9mIFtJXUJTUywgZmFsc2U6IG5vdCAqLwogCS8qICh1bmlvbiBvZiBzdGFzX2Fzc29jaWF0ZWQsIGFwc19hc3NvY2lhdGVkKSAqLwpAQCAtNTMyLDkgKzUzMSw4IEBACiAKIC8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHBvcnQgKi8KIGV4dGVybiBzdHJ1Y3QgYnJjbXNfY19pbmZvICoKLWJyY21zX2NfYXR0YWNoKHN0cnVjdCBicmNtc19pbmZvICp3bCwgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LAotCSAgICAgICBib29sIHBpb21vZGUsIHZvaWQgX19pb21lbSAqcmVnc3ZhLCBzdHJ1Y3QgcGNpX2RldiAqYnRwYXJhbSwKLQkgICAgICAgdWludCAqcGVycik7CiticmNtc19jX2F0dGFjaChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdWludCB1bml0LAorCSAgICAgICBib29sIHBpb21vZGUsIHVpbnQgKnBlcnIpOwogZXh0ZXJuIHVpbnQgYnJjbXNfY19kZXRhY2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKIGV4dGVybiBpbnQgYnJjbXNfY191cChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwogZXh0ZXJuIHVpbnQgYnJjbXNfY19kb3duKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uYwppbmRleCAwNTM5YTZhLi42MTA5MjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMKQEAgLTU4NiwxNyArNTg2LDYgQEAKICAqIHNoYXJlZCBiZXR3ZWVuIGRldmljZXMuICovCiBzdGF0aWMgdTggYnJjbXNfc3JvbV9jcmM4X3RhYmxlW0NSQzhfVEFCTEVfU0laRV07CiAKLXN0YXRpYyB1OCBfX2lvbWVtICoKLXNyb21fd2luZG93X2FkZHJlc3Moc3RydWN0IHNpX3B1YiAqc2loLCB1OCBfX2lvbWVtICpjdXJtYXApCi17Ci0JaWYgKHNpaC0+Y2NyZXYgPCAzMikKLQkJcmV0dXJuIGN1cm1hcCArIFBDSV9CQVIwX1NQUk9NX09GRlNFVDsKLQlpZiAoc2loLT5jY2NhcHMgJiBDQ19DQVBfU1JPTSkKLQkJcmV0dXJuIGN1cm1hcCArIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUICsgQ0NfU1JPTV9PVFA7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHVpbnQgbWFza19zaGlmdCh1MTYgbWFzaykKIHsKIAl1aW50IGk7CkBAIC02MzgsNyArNjI3LDcgQEAKIAlzdHJ1Y3QgYnJjbXNfc3JvbV9saXN0X2hlYWQgKmVudHJ5OwogCWVudW0gYnJjbXNfc3JvbV9pZCBpZDsKIAl1MTYgdzsKLQl1MzIgdmFsOworCXUzMiB2YWwgPSAwOwogCWNvbnN0IHN0cnVjdCBicmNtc19zcm9tdmFyICpzcnY7CiAJdWludCB3aWR0aDsKIAl1aW50IGZsYWdzOwpAQCAtNzc5LDE3ICs3NjgsMjcgQEAKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLXNwcm9tX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTggX19pb21lbSAqc3Byb20sIHVpbnQgd29yZG9mZiwKLQkgICAgICAgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYykKK3Nwcm9tX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYykKIHsKIAlpbnQgZXJyID0gMDsKIAl1aW50IGk7CiAJdTggKmJidWYgPSAodTggKilidWY7IC8qIGJ5dGUgYnVmZmVyICovCiAJdWludCBuYnl0ZXMgPSBud29yZHMgPDwgMTsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CisJdWludCBzcHJvbV9vZmZzZXQ7CisKKwkvKiBkZXRlcm1pbmUgY29yZSB0byByZWFkICovCisJaWYgKGFpX2dldF9jY3JldihzaWgpIDwgMzIpIHsKKwkJY29yZSA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFXzgwMjExLCAwKTsKKwkJc3Byb21fb2Zmc2V0ID0gUENJX0JBUjBfU1BST01fT0ZGU0VUOworCX0gZWxzZSB7CisJCWNvcmUgPSBhaV9maW5kY29yZShzaWgsIEJDTUFfQ09SRV9DSElQQ09NTU9OLCAwKTsKKwkJc3Byb21fb2Zmc2V0ID0gQ0hJUENSRUdPRkZTKHNyb21vdHApOworCX0KIAogCS8qIHJlYWQgdGhlIHNwcm9tIGluIGJ5dGVzICovCiAJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKQotCQliYnVmW2ldID0gcmVhZGIoc3Byb20raSk7CisJCWJidWZbaV0gPSBiY21hX3JlYWQ4KGNvcmUsIHNwcm9tX29mZnNldCtpKTsKIAogCWlmIChidWZbMF0gPT0gMHhmZmZmKQogCQkvKgpAQCAtODM1LDYgKzgzNCw4IEBACiAJCSAqLwogCQlyZXR1cm4gLUVOT0RBVEE7CiAKKwkvKiBmaXh1cCB0aGUgZW5kaWFubmVzcyBzbyBjcmM4IHdpbGwgcGFzcyAqLworCWNwdV90b19sZTE2X2J1ZihidWYsIHN6KTsKIAlpZiAoY3JjOChicmNtc19zcm9tX2NyYzhfdGFibGUsICh1OCAqKSBidWYsIHN6ICogMiwKIAkJIENSQzhfSU5JVF9WQUxVRSkgIT0gQ1JDOF9HT09EX1ZBTFVFKGJyY21zX3Nyb21fY3JjOF90YWJsZSkpCiAJCWVyciA9IC1FSU87CkBAIC04NDksMTAgKzg1MCw5IEBACiAgKiBJbml0aWFsaXplIG5vbnZvbGF0aWxlIHZhcmlhYmxlIHRhYmxlIGZyb20gc3Byb20uCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBub256ZXJvIG9uIGVycm9yLgogICovCi1zdGF0aWMgaW50IGluaXR2YXJzX3Nyb21fcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCBfX2lvbWVtICpjdXJtYXApCitpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCiB7CiAJdTE2ICpzcm9tOwotCXU4IF9faW9tZW0gKnNyb213aW5kb3c7CiAJdTggc3JvbXJldiA9IDA7CiAJdTMyIHNyOwogCWludCBlcnIgPSAwOwpAQCAtODY0LDEyICs4NjQsOSBAQAogCWlmICghc3JvbSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcm9td2luZG93ID0gc3JvbV93aW5kb3dfYWRkcmVzcyhzaWgsIGN1cm1hcCk7Ci0KIAljcmM4X3BvcHVsYXRlX2xzYihicmNtc19zcm9tX2NyYzhfdGFibGUsIFNST01fQ1JDOF9QT0xZKTsKIAlpZiAoYWlfaXNfc3Byb21fYXZhaWxhYmxlKHNpaCkpIHsKLQkJZXJyID0gc3Byb21fcmVhZF9wY2koc2loLCBzcm9td2luZG93LCAwLCBzcm9tLAotCQkJCSAgICAgU1JPTTRfV09SRFMsIHRydWUpOworCQllcnIgPSBzcHJvbV9yZWFkX3BjaShzaWgsIHNyb20sIFNST000X1dPUkRTLCB0cnVlKTsKIAogCQlpZiAoZXJyID09IDApCiAJCQkvKiBzcm9tIHJlYWQgYW5kIHBhc3NlZCBjcmMgKi8KQEAgLTkxOSwyMSArOTE2LDYgQEAKIAkJa2ZyZWUoZW50cnkpOwogCX0KIH0KLS8qCi0gKiBJbml0aWFsaXplIGxvY2FsIHZhcnMgZnJvbSB0aGUgcmlnaHQgc291cmNlIGZvciB0aGlzIHBsYXRmb3JtLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KLSAqLwotaW50IHNyb21fdmFyX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCB2b2lkIF9faW9tZW0gKmN1cm1hcCkKLXsKLQl1aW50IGxlbjsKLQotCWxlbiA9IDA7Ci0KLQlpZiAoY3VybWFwICE9IE5VTEwpCi0JCXJldHVybiBpbml0dmFyc19zcm9tX3BjaShzaWgsIGN1cm1hcCk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KIAogLyoKICAqIFNlYXJjaCB0aGUgbmFtZT12YWx1ZSB2YXJzIGZvciBhIHNwZWNpZmljIG9uZSBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5oCmluZGV4IGM4MWRmOTcuLmYyYTU4ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgInR5cGVzLmgiCiAKIC8qIFByb3RvdHlwZXMgKi8KLWV4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgX19pb21lbSAqY3VybWFwKTsKK2V4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHZvaWQgc3JvbV9mcmVlX3ZhcnMoc3RydWN0IHNpX3B1YiAqc2loKTsKIAogZXh0ZXJuIGludCBzcm9tX3JlYWQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3R5cGVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvdHlwZXMuaAppbmRleCAyN2E4MTRiLi5lMTFhZTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvdHlwZXMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvdHlwZXMuaApAQCAtMjUwLDY2ICsyNTAsMTggQEAKIAkJd2lwaHlfZXJyKGRldiwgIiVzOiAiIGZtdCwgX19mdW5jX18sICMjYXJncyk7CVwKIH0gd2hpbGUgKDApCiAKLS8qCi0gKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zLgotICoKLSAqIFRoZXNlIG1hY3JvJ3MgdGFrZSBhIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3MgdG8gcmVhZCBhcyBvbmUgb2YgdGhlaXIKLSAqIGFyZ3VtZW50cy4gVGhlIG1hY3JvIGl0c2VsZiBkZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBJTyB0cmFuc2FjdGlvbiAodTgsIHUxNgotICogb3IgdTMyKS4gQWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaW4gY29tYmluYXRpb24gd2l0aCB1c2luZyBhIHN0cnVjdCB0bwotICogZGVmaW5lIHRoZSByZWdpc3RlcnMgaW4gYSByZWdpc3RlciBibG9jaywgaXMgdGhhdCBhY2Nlc3Mgc2l6ZSBhbmQgYWNjZXNzCi0gKiBsb2NhdGlvbiBhcmUgZGVmaW5lZCBpbiBvbmx5IG9uZSBzcG90LiBUaGlzIHJlZHVjZXMgdGhlIHJpc2sgb2YgdGhlCi0gKiBwcm9ncmFtbWVyIHRyeWluZyB0byB1c2UgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gc2l6ZSBvbiBhIHJlZ2lzdGVyLgotICoKLSAqLwotCi0jZGVmaW5lIFJfUkVHKHIpIFwKLQkoeyBcCi0JCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQljYXNlIHNpemVvZih1OCk6IFwKLQkJCV9fb3NsX3YgPSByZWFkYigodTggX19pb21lbSAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCV9fb3NsX3YgPSByZWFkdygodTE2IF9faW9tZW0gKikocikpOyBcCi0JCQlicmVhazsgXAotCQljYXNlIHNpemVvZih1MzIpOiBcCi0JCQlfX29zbF92ID0gcmVhZGwoKHUzMiBfX2lvbWVtICopKHIpKTsgXAotCQkJYnJlYWs7IFwKLQkJfSBcCi0JCV9fb3NsX3Y7IFwKLQl9KQotCi0jZGVmaW5lIFdfUkVHKHIsIHYpIGRvIHsgXAotCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCWNhc2Ugc2l6ZW9mKHU4KToJXAotCQkJd3JpdGViKCh1OCkoKHYpICYgMHhGRiksICh1OCBfX2lvbWVtICopKHIpKTsgXAotCQkJYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTE2KToJXAotCQkJd3JpdGV3KCh1MTYpKCh2KSAmIDB4RkZGRiksICh1MTYgX19pb21lbSAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUzMik6CVwKLQkJCXdyaXRlbCgodTMyKSh2KSwgKHUzMiBfX2lvbWVtICopKHIpKTsgXAotCQkJYnJlYWs7IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQogI2lmZGVmIENPTkZJR19CQ000N1hYCiAvKgogICogYmNtNDcxNiAod2hpY2ggaW5jbHVkZXMgNDcxNyAmIDQ3MTgpLCBwbHVzIDQ3MDYgb24gUENJZSBjYW4gcmVvcmRlcgogICogdHJhbnNhY3Rpb25zLiBBcyBhIGZpeCwgYSByZWFkIGFmdGVyIHdyaXRlIGlzIHBlcmZvcm1lZCBvbiBjZXJ0YWluIHBsYWNlcwogICogaW4gdGhlIGNvZGUuIE9sZGVyIGNoaXBzIGFuZCB0aGUgbmV3ZXIgNTM1NyBmYW1pbHkgZG9uJ3QgcmVxdWlyZSB0aGlzIGZpeC4KICAqLwotI2RlZmluZSBXX1JFR19GTFVTSChyLCB2KQkoeyBXX1JFRygociksICh2KSk7ICh2b2lkKVJfUkVHKHIpOyB9KQorI2RlZmluZSBiY21hX3dmbHVzaDE2KGMsIG8sIHYpIFwKKwkoeyBiY21hX3dyaXRlMTYoYywgbywgdik7ICh2b2lkKWJjbWFfcmVhZDE2KGMsIG8pOyB9KQogI2Vsc2UKLSNkZWZpbmUgV19SRUdfRkxVU0gociwgdikJV19SRUcoKHIpLCAodikpCisjZGVmaW5lIGJjbWFfd2ZsdXNoMTYoYywgbywgdikJYmNtYV93cml0ZTE2KGMsIG8sIHYpCiAjZW5kaWYJCQkJLyogQ09ORklHX0JDTTQ3WFggKi8KIAotI2RlZmluZSBBTkRfUkVHKHIsIHYpCVdfUkVHKChyKSwgUl9SRUcocikgJiAodikpCi0jZGVmaW5lIE9SX1JFRyhyLCB2KQlXX1JFRygociksIFJfUkVHKHIpIHwgKHYpKQotCi0jZGVmaW5lIFNFVF9SRUcociwgbWFzaywgdmFsKSBcCi0JCVdfUkVHKChyKSwgKChSX1JFRyhyKSAmIH4obWFzaykpIHwgKHZhbCkpKQotCiAvKiBtdWx0aS1ib29sIGRhdGEgdHlwZTogc2V0IG9mIGJvb2xzLCBtYm9vbCBpcyB0cnVlIGlmIGFueSBpcyBzZXQgKi8KIAogLyogc2V0IG9uZSBib29sICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtdXRpbC91dGlscy5jCmluZGV4IDEyYjc5NWYuLmI3NTM3ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtdXRpbC91dGlscy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtdXRpbC91dGlscy5jCkBAIC00MSw0NCArNDEsMjAgQEAKIC8qIEZyZWUgdGhlIGRyaXZlciBwYWNrZXQuIEZyZWUgdGhlIHRhZyBpZiBwcmVzZW50ICovCiB2b2lkIGJyY211X3BrdF9idWZfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQlpbnQgbmVzdCA9IDA7Ci0KLQkvKiBwZXJ2ZXJzaW9uOiB3ZSB1c2Ugc2tiLT5uZXh0IHRvIGNoYWluIG11bHRpLXNrYiBwYWNrZXRzICovCi0Jd2hpbGUgKHNrYikgewotCQluc2tiID0gc2tiLT5uZXh0OwotCQlza2ItPm5leHQgPSBOVUxMOwotCi0JCWlmIChza2ItPmRlc3RydWN0b3IpCi0JCQkvKiBjYW5ub3Qga2ZyZWVfc2tiKCkgb24gaGFyZCBJUlEgKG5ldC9jb3JlL3NrYnVmZi5jKSBpZgotCQkJICogZGVzdHJ1Y3RvciBleGlzdHMKLQkJCSAqLwotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJZWxzZQotCQkJLyogY2FuIGZyZWUgaW1tZWRpYXRlbHkgKGV2ZW4gaW5faXJxKCkpIGlmIGRlc3RydWN0b3IKLQkJCSAqIGRvZXMgbm90IGV4aXN0Ci0JCQkgKi8KLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotCQluZXN0Kys7Ci0JCXNrYiA9IG5za2I7Ci0JfQorCVdBUk5fT04oc2tiLT5uZXh0KTsKKwlpZiAoc2tiLT5kZXN0cnVjdG9yKQorCQkvKiBjYW5ub3Qga2ZyZWVfc2tiKCkgb24gaGFyZCBJUlEgKG5ldC9jb3JlL3NrYnVmZi5jKSBpZgorCQkgKiBkZXN0cnVjdG9yIGV4aXN0cworCQkgKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwllbHNlCisJCS8qIGNhbiBmcmVlIGltbWVkaWF0ZWx5IChldmVuIGluX2lycSgpKSBpZiBkZXN0cnVjdG9yCisJCSAqIGRvZXMgbm90IGV4aXN0CisJCSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdF9idWZfZnJlZV9za2IpOwogCi0KLS8qIHJldHVybiB0b3RhbCBsZW5ndGggb2YgYnVmZmVyIGNoYWluICovCi11aW50IGJyY211X3BrdHRvdGxlbihzdHJ1Y3Qgc2tfYnVmZiAqcCkKLXsKLQl1aW50IHRvdGFsOwotCi0JdG90YWwgPSAwOwotCWZvciAoOyBwOyBwID0gcC0+bmV4dCkKLQkJdG90YWwgKz0gcC0+bGVuOwotCXJldHVybiB0b3RhbDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0dG90bGVuKTsKLQogLyoKICAqIG9zbCBtdWx0aXBsZS1wcmVjZWRlbmNlIHBhY2tldCBxdWV1ZQogICogaGlfcHJlYyBpcyBhbHdheXMgPj0gdGhlIG51bWJlciBvZiB0aGUgaGlnaGVzdCBub24tZW1wdHkgcHJlY2VkZW5jZQpAQCAtODYsMjEgKzYyLDEzIEBACiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnApCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCiAJaWYgKHBrdHFfZnVsbChwcSkgfHwgcGt0cV9wZnVsbChwcSwgcHJlYykpCiAJCXJldHVybiBOVUxMOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCWlmIChxLT5oZWFkKQotCQlxLT50YWlsLT5wcmV2ID0gcDsKLQllbHNlCi0JCXEtPmhlYWQgPSBwOwotCi0JcS0+dGFpbCA9IHA7Ci0JcS0+bGVuKys7Ci0KKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJc2tiX3F1ZXVlX3RhaWwocSwgcCk7CiAJcHEtPmxlbisrOwogCiAJaWYgKHBxLT5oaV9wcmVjIDwgcHJlYykKQEAgLTExMywyMCArODEsMTMgQEAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CiAKIAlpZiAocGt0cV9mdWxsKHBxKSB8fCBwa3RxX3BmdWxsKHBxLCBwcmVjKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IHA7Ci0KLQlwLT5wcmV2ID0gcS0+aGVhZDsKLQlxLT5oZWFkID0gcDsKLQlxLT5sZW4rKzsKLQorCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlza2JfcXVldWVfaGVhZChxLCBwKTsKIAlwcS0+bGVuKys7CiAKIAlpZiAocHEtPmhpX3ByZWMgPCBwcmVjKQpAQCAtMTM4LDUzICs5OSwzMCBAQAogCiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCXN0cnVjdCBza19idWZmICpwOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCXAgPSBxLT5oZWFkOworCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlwID0gc2tiX2RlcXVldWUocSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gcC0+cHJldjsKLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gTlVMTDsKLQotCXEtPmxlbi0tOwotCiAJcHEtPmxlbi0tOwotCi0JcC0+cHJldiA9IE5VTEw7Ci0KIAlyZXR1cm4gcDsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxKTsKIAogc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGRlcV90YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlwID0gcS0+aGVhZDsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJcCA9IHNrYl9kZXF1ZXVlX3RhaWwocSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKHByZXYgPSBOVUxMOyBwICE9IHEtPnRhaWw7IHAgPSBwLT5wcmV2KQotCQlwcmV2ID0gcDsKLQotCWlmIChwcmV2KQotCQlwcmV2LT5wcmV2ID0gTlVMTDsKLQllbHNlCi0JCXEtPmhlYWQgPSBOVUxMOwotCi0JcS0+dGFpbCA9IHByZXY7Ci0JcS0+bGVuLS07Ci0KIAlwcS0+bGVuLS07Ci0KIAlyZXR1cm4gcDsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxX3RhaWwpOwpAQCAtMTkzLDMxICsxMzEsMTcgQEAKIGJyY211X3BrdHFfcGZsdXNoKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIGJvb2wgZGlyLAogCQkgIGJvb2wgKCpmbikoc3RydWN0IHNrX2J1ZmYgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0JcCA9IHEtPmhlYWQ7Ci0Jd2hpbGUgKHApIHsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJc2tiX3F1ZXVlX3dhbGtfc2FmZShxLCBwLCBuZXh0KSB7CiAJCWlmIChmbiA9PSBOVUxMIHx8ICgqZm4pIChwLCBhcmcpKSB7Ci0JCQlib29sIGhlYWQgPSAocCA9PSBxLT5oZWFkKTsKLQkJCWlmIChoZWFkKQotCQkJCXEtPmhlYWQgPSBwLT5wcmV2OwotCQkJZWxzZQotCQkJCXByZXYtPnByZXYgPSBwLT5wcmV2OwotCQkJcC0+cHJldiA9IE5VTEw7CisJCQlza2JfdW5saW5rKHAsIHEpOwogCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwKTsKLQkJCXEtPmxlbi0tOwogCQkJcHEtPmxlbi0tOwotCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IHByZXYtPnByZXYpOwotCQl9IGVsc2UgewotCQkJcHJldiA9IHA7Ci0JCQlwID0gcC0+cHJldjsKIAkJfQogCX0KLQotCWlmIChxLT5oZWFkID09IE5VTEwpCi0JCXEtPnRhaWwgPSBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX3BmbHVzaCk7CiAKQEAgLTI0Miw4ICsxNjYsMTAgQEAKIAogCXBxLT5tYXggPSAodTE2KSBtYXhfbGVuOwogCi0JZm9yIChwcmVjID0gMDsgcHJlYyA8IG51bV9wcmVjOyBwcmVjKyspCisJZm9yIChwcmVjID0gMDsgcHJlYyA8IG51bV9wcmVjOyBwcmVjKyspIHsKIAkJcHEtPnFbcHJlY10ubWF4ID0gcHEtPm1heDsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHEtPnFbcHJlY10uc2tibGlzdCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX2luaXQpOwogCkBAIC0yNTUsMTMgKzE4MSwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+aGlfcHJlYzsgcHJlYysrKQotCQlpZiAocHEtPnFbcHJlY10uaGVhZCkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnBxLT5xW3ByZWNdLnNrYmxpc3QpKQogCQkJYnJlYWs7CiAKIAlpZiAocHJlY19vdXQpCiAJCSpwcmVjX291dCA9IHByZWM7CiAKLQlyZXR1cm4gcHEtPnFbcHJlY10udGFpbDsKKwlyZXR1cm4gc2tiX3BlZWtfdGFpbCgmcHEtPnFbcHJlY10uc2tibGlzdCk7CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfcGVla190YWlsKTsKIApAQCAtMjc0LDcgKzIwMCw3IEBACiAKIAlmb3IgKHByZWMgPSAwOyBwcmVjIDw9IHBxLT5oaV9wcmVjOyBwcmVjKyspCiAJCWlmIChwcmVjX2JtcCAmICgxIDw8IHByZWMpKQotCQkJbGVuICs9IHBxLT5xW3ByZWNdLmxlbjsKKwkJCWxlbiArPSBwcS0+cVtwcmVjXS5za2JsaXN0LnFsZW47CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtMjg0LDM5ICsyMTAsMzIgQEAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX21kZXEoc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wLAogCQkJCSAgICAgIGludCAqcHJlY19vdXQpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOwogCXN0cnVjdCBza19idWZmICpwOwogCWludCBwcmVjOwogCiAJaWYgKHBxLT5sZW4gPT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoKHByZWMgPSBwcS0+aGlfcHJlYykgPiAwICYmIHBxLT5xW3ByZWNdLmhlYWQgPT0gTlVMTCkKKwl3aGlsZSAoKHByZWMgPSBwcS0+aGlfcHJlYykgPiAwICYmCisJICAgICAgIHNrYl9xdWV1ZV9lbXB0eSgmcHEtPnFbcHJlY10uc2tibGlzdCkpCiAJCXBxLT5oaV9wcmVjLS07CiAKLQl3aGlsZSAoKHByZWNfYm1wICYgKDEgPDwgcHJlYykpID09IDAgfHwgcHEtPnFbcHJlY10uaGVhZCA9PSBOVUxMKQorCXdoaWxlICgocHJlY19ibXAgJiAoMSA8PCBwcmVjKSkgPT0gMCB8fAorCSAgICAgICBza2JfcXVldWVfZW1wdHkoJnBxLT5xW3ByZWNdLnNrYmxpc3QpKQogCQlpZiAocHJlYy0tID09IDApCiAJCQlyZXR1cm4gTlVMTDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlwID0gcS0+aGVhZDsKKwlxID0gJnBxLT5xW3ByZWNdLnNrYmxpc3Q7CisJcCA9IHNrYl9kZXF1ZXVlKHEpOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JcS0+aGVhZCA9IHAtPnByZXY7Ci0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IE5VTEw7Ci0KLQlxLT5sZW4tLTsKKwlwcS0+bGVuLS07CiAKIAlpZiAocHJlY19vdXQpCiAJCSpwcmVjX291dCA9IHByZWM7CiAKLQlwcS0+bGVuLS07Ci0KLQlwLT5wcmV2ID0gTlVMTDsKLQogCXJldHVybiBwOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX21kZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3V0aWxzLmgKaW5kZXggY2NmNjAxNS4uYWQyNDlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV91dGlscy5oCkBAIC02NSw5ICs2NSw3IEBACiAjZGVmaW5lIEVUSEVSX0FERFJfU1RSX0xFTgkxOAogCiBzdHJ1Y3QgcGt0cV9wcmVjIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsJLyogZmlyc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbDsJLyogbGFzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLwotCXUxNiBsZW47CQkvKiBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYmxpc3Q7CiAJdTE2IG1heDsJCS8qIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCiB9OwogCkBAIC04OCwzMiArODYsMzIgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcGt0cV9wbGVuKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLmxlbjsKKwlyZXR1cm4gcHEtPnFbcHJlY10uc2tibGlzdC5xbGVuOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwa3RxX3BhdmFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS5tYXggLSBwcS0+cVtwcmVjXS5sZW47CisJcmV0dXJuIHBxLT5xW3ByZWNdLm1heCAtIHBxLT5xW3ByZWNdLnNrYmxpc3QucWxlbjsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHBrdHFfcGZ1bGwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10ubGVuID49IHBxLT5xW3ByZWNdLm1heDsKKwlyZXR1cm4gcHEtPnFbcHJlY10uc2tibGlzdC5xbGVuID49IHBxLT5xW3ByZWNdLm1heDsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHBrdHFfcGVtcHR5KHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLmxlbiA9PSAwOworCXJldHVybiBza2JfcXVldWVfZW1wdHkoJnBxLT5xW3ByZWNdLnNrYmxpc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpwa3RxX3BwZWVrKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLmhlYWQ7CisJcmV0dXJuIHNrYl9wZWVrKCZwcS0+cVtwcmVjXS5za2JsaXN0KTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wcGVla190YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLnRhaWw7CisJcmV0dXJuIHNrYl9wZWVrX3RhaWwoJnBxLT5xW3ByZWNdLnNrYmxpc3QpOwogfQogCiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLApAQCAtMTcyLDkgKzE3MCw2IEBACiAJCWJvb2wgKCpmbikoc3RydWN0IHNrX2J1ZmYgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKTsKIAogLyogZXh0ZXJucyAqLwotLyogcGFja2V0ICovCi1leHRlcm4gdWludCBicmNtdV9wa3R0b3RsZW4oc3RydWN0IHNrX2J1ZmYgKnApOwotCiAvKiBpcCBhZGRyZXNzICovCiBzdHJ1Y3QgaXB2NF9hZGRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9jaGlwY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9jaGlwY29tbW9uLmgKaW5kZXggZmVmYWJjMy4uZjk2ODM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvY2hpcGNvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSAiZGVmcy5oIgkJLyogZm9yIFBBRCBtYWNybyAqLwogCisjZGVmaW5lIENISVBDUkVHT0ZGUyhmaWVsZCkJb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZmllbGQpCisKIHN0cnVjdCBjaGlwY3JlZ3MgewogCXUzMiBjaGlwaWQ7CQkvKiAweDAgKi8KIAl1MzIgY2FwYWJpbGl0aWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCmluZGV4IGUwYjNlOGQuLmRmNzA1MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2xpYjgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYwppbmRleCBjMzRhM2I3Li4zNDRhOTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImhvc3RhcF84MDIxMS5oIgogI2luY2x1ZGUgImhvc3RhcF9jb21tb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYwppbmRleCAzZDA1ZGMxLi5lMWY0MTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgogI2luY2x1ZGUgImhvc3RhcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCmluZGV4IDU0NDFhZDEuLjg5ZTlkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKQEAgLTY1Niw2ICs2NTYsOSBAQAogCQkiQWRkdHJvbiIsICJBV1AtMTAwIFdpcmVsZXNzIFBDTUNJQSIsICJWZXJzaW9uIDAxLjAyIiwKIAkJMHhlNmVjNTJjZSwgMHgwODY0OWFmMiwgMHg0Yjc0YmFhMCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKAorCQkiQ2Fub24iLCAiV2lyZWxlc3MgTEFOIENGIENhcmQgSzMwMjI1IiwgIlZlcnNpb24gMDEuMDAiLAorCQkweDk2ZWY2ZmUyLCAweDI2M2ZjYmFiLCAweGE1N2FkYjhjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCiAJCSJEIiwgIkxpbmsgRFdMLTY1MCAxMU1icHMgV0xBTiBDYXJkIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweDcxYjE4NTg5LCAweGI2ZjFiMGFiLCAweDRiNzRiYWEwKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jCmluZGV4IGQ3MzcwOTEuLjQ3OTMyYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCiAjaW5jbHVkZSAiaG9zdGFwLmgiCiAjaW5jbHVkZSAiaG9zdGFwX2FwLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKaW5kZXggMTJkZTQ2NC4uMTgwNTRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbGliODAyMTEuaD4KIAogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCkBAIC0zODcxLDggKzM4NzIsOCBAQAogCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKIAotCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCAiaG9zdGFwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikgLSAxLAorCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiaG9zdGFwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwKIAkJICIlZC4lZC4lZCIsIChsb2NhbC0+c3RhX2Z3X3ZlciA+PiAxNikgJiAweGZmLAogCQkgKGxvY2FsLT5zdGFfZndfdmVyID4+IDgpICYgMHhmZiwKIAkJIGxvY2FsLT5zdGFfZndfdmVyICYgMHhmZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3Byb2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCmluZGV4IDAwNWZmMjUuLjc1ZWY4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcHJvYy5jCkBAIC0yLDYgKzIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2xpYjgwMjExLmg+CiAKICNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCAxMjdlOWM2Li5hMGU1YzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtNTk4MSw4ICs1OTgxLDggQEAKIAlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gbGliaXB3X3ByaXYoZGV2KTsKIAljaGFyIGZ3X3Zlcls2NF0sIHVjb2RlX3Zlcls2NF07CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCiAJaXB3MjEwMF9nZXRfZnd2ZXJzaW9uKHByaXYsIGZ3X3Zlciwgc2l6ZW9mKGZ3X3ZlcikpOwogCWlwdzIxMDBfZ2V0X3Vjb2RldmVyc2lvbihwcml2LCB1Y29kZV92ZXIsIHNpemVvZih1Y29kZV92ZXIpKTsKQEAgLTU5OTAsNyArNTk5MCw4IEBACiAJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLCAiJXM6JWQ6JXMiLAogCQkgZndfdmVyLCBwcml2LT5lZXByb21fdmVyc2lvbiwgdWNvZGVfdmVyKTsKIAotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdi0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHByaXYtPnBjaV9kZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHUzMiBpcHcyMTAwX2V0aHRvb2xfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKaW5kZXggOTlhNzEwZC4uMDE4YThkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMKQEAgLTEzMSw2ICsxMzEsMTQgQEAKICNkZWZpbmUgaXB3MjIwMF9iZ19yYXRlcwkoaXB3MjIwMF9yYXRlcyArIDApCiAjZGVmaW5lIGlwdzIyMDBfbnVtX2JnX3JhdGVzCTEyCiAKKy8qIFVnbHkgbWFjcm8gdG8gY29udmVydCBsaXRlcmFsIGNoYW5uZWwgbnVtYmVycyBpbnRvIHRoZWlyIG1oeiBlcXVpdmFsZW50cworICogVGhlcmUgYXJlIGNlcnRpYW5seSBzb21lIGNvbmRpdGlvbnMgdGhhdCB3aWxsIGJyZWFrIHRoaXMgKGxpa2UgZmVlZGluZyBpdCAnMzAnKQorICogYnV0IHRoZXkgc2hvdWxkbid0IGFyaXNlIHNpbmNlIG5vdGhpbmcgdGFsa3Mgb24gY2hhbm5lbCAzMC4gKi8KKyNkZWZpbmUgaWVlZTgwMjExY2hhbjJtaHooeCkgXAorCSgoKHgpIDw9IDE0KSA/IFwKKwkoKCh4KSA9PSAxNCkgPyAyNDg0IDogKCh4KSAqIDUpICsgMjQwNykgOiBcCisJKCh4KSArIDEwMDApICogNSkKKwogI2lmZGVmIENPTkZJR19JUFcyMjAwX1FPUwogc3RhdGljIGludCBxb3NfZW5hYmxlID0gMDsKIHN0YXRpYyBpbnQgcW9zX2J1cnN0X2VuYWJsZSA9IDA7CkBAIC0xMDU0MCw4ICsxMDU0OCw4IEBACiAJY2hhciBkYXRlWzMyXTsKIAl1MzIgbGVuOwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIAogCWxlbiA9IHNpemVvZih2ZXJzKTsKIAlpcHdfZ2V0X29yZGluYWwocCwgSVBXX09SRF9TVEFUX0ZXX1ZFUlNJT04sIHZlcnMsICZsZW4pOwpAQCAtMTA1NTAsNyArMTA1NTgsOCBAQAogCiAJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLCAiJXMgKCVzKSIsCiAJCSB2ZXJzLCBkYXRlKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwLT5wY2lfZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJaW5mby0+ZWVkdW1wX2xlbiA9IElQV19FRVBST01fSU1BR0VfU0laRTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWExOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LWRlYnVnLmMKQEAgLTAsMCArMSw1MDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICIzOTQ1LmgiCisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zdGF0c19mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJaW50IHAgPSAwOworCisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGlsLT5fMzk0NS5zdGF0cy5mbGFnKSk7CisJaWYgKGxlMzJfdG9fY3B1KGlsLT5fMzk0NS5zdGF0cy5mbGFnKSAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykKKwkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAorCQkJICAgICAgICJcdFN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0T3BlcmF0aW9uYWwgRnJlcXVlbmN5OiAlc1xuIiwKKwkJICAgICAgIChsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykgJgorCQkJVUNPREVfU1RBVFNfRlJFUVVFTkNZX01TSykgPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKKwkJICAgICAgIChsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykgJgorCQkJVUNPREVfU1RBVFNfTkFSUk9XX0JBTkRfTVNLKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCXJldHVybiBwOworfQorCitzc2l6ZV90CitpbDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPQorCSAgICBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSkgKiA0MCArCisJICAgIHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfbm9uX3BoeSkgKiA0MCArIDQwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5ICpvZmRtLCAqYWNjdW1fb2ZkbSwgKmRlbHRhX29mZG0sICptYXhfb2ZkbTsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOworCXN0cnVjdCBpd2wzOV9zdGF0c19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfbm9uX3BoeSAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJb2ZkbSA9ICZpbC0+XzM5NDUuc3RhdHMucngub2ZkbTsKKwljY2sgPSAmaWwtPl8zOTQ1LnN0YXRzLnJ4LmNjazsKKwlnZW5lcmFsID0gJmlsLT5fMzk0NS5zdGF0cy5yeC5nZW5lcmFsOworCWFjY3VtX29mZG0gPSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLnJ4Lm9mZG07CisJYWNjdW1fY2NrID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5yeC5jY2s7CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMucnguZ2VuZXJhbDsKKwlkZWx0YV9vZmRtID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5yeC5vZmRtOworCWRlbHRhX2NjayA9ICZpbC0+XzM5NDUuZGVsdGFfc3RhdHMucnguY2NrOworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLnJ4LmdlbmVyYWw7CisJbWF4X29mZG0gPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5vZmRtOworCW1heF9jY2sgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5jY2s7CisJbWF4X2dlbmVyYWwgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOworCisJcG9zICs9IGlsMzk0NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIlLTMycyAgICAgY3VycmVudCIKKwkJICAgICAgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIE9GRE06Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5pbmFfY250KSwgYWNjdW1fb2ZkbS0+aW5hX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+aW5hX2NudCwgbWF4X29mZG0tPmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfY250KSwgYWNjdW1fb2ZkbS0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInBsY3BfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKSwgYWNjdW1fb2ZkbS0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2VyciwgbWF4X29mZG0tPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9vZmRtLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+b3ZlcnJ1bl9lcnIsIG1heF9vZmRtLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIsCisJCSAgICAgIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZ29vZCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+Y3JjMzJfZ29vZCwgbWF4X29mZG0tPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQsCisJCSAgICAgIG1heF9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2ZkX3RpbWVvdXQpLCBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsIG1heF9vZmRtLT5zZmRfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksIGFjY3VtX29mZG0tPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV90aW1lb3V0LCBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJ1bnJlc3BvbmRlZF9ydHM6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+dW5yZXNwb25kZWRfcnRzLCBkZWx0YV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCisJCSAgICAgIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKKwkJICAgICAgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAorCQkgICAgICBhY2N1bV9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksIGFjY3VtX29mZG0tPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9hY2tfY250LCBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzZW50X2N0c19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2VudF9jdHNfY250KSwgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5zZW50X2N0c19jbnQsIG1heF9vZmRtLT5zZW50X2N0c19jbnQpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBDQ0s6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmluYV9jbnQpLCBhY2N1bV9jY2stPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5maW5hX2NudCksIGFjY3VtX2Njay0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+ZmluYV9jbnQsIG1heF9jY2stPmZpbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKSwgYWNjdW1fY2NrLT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5wbGNwX2VyciwgbWF4X2Njay0+cGxjcF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2VyciksIGFjY3VtX2Njay0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJvdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPm92ZXJydW5fZXJyKSwgYWNjdW1fY2NrLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5vdmVycnVuX2VyciwgbWF4X2Njay0+b3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmVhcmx5X292ZXJydW5fZXJyLCBtYXhfY2NrLT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2dvb2QpLCBhY2N1bV9jY2stPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmFsc2VfYWxhcm1fY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX2Njay0+ZmFsc2VfYWxhcm1fY250LAorCQkgICAgICBtYXhfY2NrLT5mYWxzZV9hbGFybV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfc3luY19lcnJfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9zeW5jX2Vycl9jbnQpLAorCQkgICAgICBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfc3luY19lcnJfY250LCBtYXhfY2NrLT5maW5hX3N5bmNfZXJyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZmRfdGltZW91dCksIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsIG1heF9jY2stPnNmZF90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmaW5hX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5maW5hX3RpbWVvdXQpLCBhY2N1bV9jY2stPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX3RpbWVvdXQsIG1heF9jY2stPmZpbmFfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidW5yZXNwb25kZWRfcnRzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKKwkJICAgICAgYWNjdW1fY2NrLT51bnJlc3BvbmRlZF9ydHMsIGRlbHRhX2Njay0+dW5yZXNwb25kZWRfcnRzLAorCQkgICAgICBtYXhfY2NrLT51bnJlc3BvbmRlZF9ydHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKKwkJICAgICAgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCisJCSAgICAgIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzZW50X2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZW50X2Fja19jbnQpLCBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5zZW50X2Fja19jbnQsIG1heF9jY2stPnNlbnRfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9jdHNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9jdHNfY250KSwgYWNjdW1fY2NrLT5zZW50X2N0c19jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+c2VudF9jdHNfY250LCBtYXhfY2NrLT5zZW50X2N0c19jbnQpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBHRU5FUkFMOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImJvZ3VzX2N0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLCBhY2N1bV9nZW5lcmFsLT5ib2d1c19jdHMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2N0cywgbWF4X2dlbmVyYWwtPmJvZ3VzX2N0cyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYm9ndXNfYWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2FjayksIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJub25fYnNzaWRfZnJhbWVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmlsdGVyZWRfZnJhbWVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCisJCSAgICAgICJub25fY2hhbm5lbF9iZWFjb25zOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK2lsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IChzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX3R4KSAqIDQ4KSArIDI1MDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfdHggKnR4LCAqYWNjdW1fdHgsICpkZWx0YV90eCwgKm1heF90eDsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCXR4ID0gJmlsLT5fMzk0NS5zdGF0cy50eDsKKwlhY2N1bV90eCA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMudHg7CisJZGVsdGFfdHggPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLnR4OworCW1heF90eCA9ICZpbC0+XzM5NDUubWF4X2RlbHRhLnR4OworCXBvcyArPSBpbDM5NDVfc3RhdHNfZmxhZyhpbCwgYnVmLCBidWZzeik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfVHg6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicHJlYW1ibGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksIGFjY3VtX3R4LT5wcmVhbWJsZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJyeF9kZXRlY3RlZF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnJ4X2RldGVjdGVkX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5yeF9kZXRlY3RlZF9jbnQsIGRlbHRhX3R4LT5yeF9kZXRlY3RlZF9jbnQsCisJCSAgICAgIG1heF90eC0+cnhfZGV0ZWN0ZWRfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJidF9wcmlvX2RlZmVyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19kZWZlcl9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsIGRlbHRhX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2RlZmVyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnRfcHJpb19raWxsX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19raWxsX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LCBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2tpbGxfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmZXdfYnl0ZXNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5mZXdfYnl0ZXNfY250KSwgYWNjdW1fdHgtPmZld19ieXRlc19jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5mZXdfYnl0ZXNfY250LCBtYXhfdHgtPmZld19ieXRlc19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImN0c190aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dCksIGFjY3VtX3R4LT5jdHNfdGltZW91dCwKKwkJICAgICAgZGVsdGFfdHgtPmN0c190aW1lb3V0LCBtYXhfdHgtPmN0c190aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJhY2tfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWNrX3RpbWVvdXQpLCBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZXhwZWN0ZWRfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZXhwZWN0ZWRfYWNrX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5leHBlY3RlZF9hY2tfY250LCBkZWx0YV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKKwkJICAgICAgbWF4X3R4LT5leHBlY3RlZF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJhY3R1YWxfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWN0dWFsX2Fja19jbnQpLCBhY2N1bV90eC0+YWN0dWFsX2Fja19jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwgbWF4X3R4LT5hY3R1YWxfYWNrX2NudCk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK2lsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCkgKiAxMCArIDMwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IGl3bDM5X3N0YXRzX2dlbmVyYWwgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfZGJnICpkYmcsICphY2N1bV9kYmcsICpkZWx0YV9kYmcsICptYXhfZGJnOworCXN0cnVjdCBpd2wzOV9zdGF0c19kaXYgKmRpdiwgKmFjY3VtX2RpdiwgKmRlbHRhX2RpdiwgKm1heF9kaXY7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBUaGUgc3RhdGlzdGljIGluZm9ybWF0aW9uIGRpc3BsYXkgaGVyZSBpcyBiYXNlZCBvbgorCSAqIHRoZSBsYXN0IHN0YXRzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCisJICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKKwkgKi8KKwlnZW5lcmFsID0gJmlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsOworCWRiZyA9ICZpbC0+XzM5NDUuc3RhdHMuZ2VuZXJhbC5kYmc7CisJZGl2ID0gJmlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsLmRpdjsKKwlhY2N1bV9nZW5lcmFsID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsOworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLmdlbmVyYWw7CisJbWF4X2dlbmVyYWwgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsOworCWFjY3VtX2RiZyA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5kYmc7CisJZGVsdGFfZGJnID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5nZW5lcmFsLmRiZzsKKwltYXhfZGJnID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbC5kYmc7CisJYWNjdW1fZGl2ID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsLmRpdjsKKwlkZWx0YV9kaXYgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLmdlbmVyYWwuZGl2OworCW1heF9kaXYgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsLmRpdjsKKwlwb3MgKz0gaWwzOTQ1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiUtMzJzICAgICBjdXJyZW50IgorCQkgICAgICAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCisJCSAgICAgICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnVyc3RfY2hlY2s6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jaGVjayksIGFjY3VtX2RiZy0+YnVyc3RfY2hlY2ssCisJCSAgICAgIGRlbHRhX2RiZy0+YnVyc3RfY2hlY2ssIG1heF9kYmctPmJ1cnN0X2NoZWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJidXJzdF9jb3VudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NvdW50KSwgYWNjdW1fZGJnLT5idXJzdF9jb3VudCwKKwkJICAgICAgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNsZWVwX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xlZXBfdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnNsZWVwX3RpbWUsIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzbG90c19vdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfb3V0LAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNsb3RzX2lkbGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfaWRsZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsIGRlbHRhX2dlbmVyYWwtPnNsb3RzX2lkbGUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5zbG90c19pZGxlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ0dGxfdGltZXN0YW1wOlx0XHRcdCV1XG4iLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidHhfb25fYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidHhfb25fYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYiwgbWF4X2Rpdi0+dHhfb25fYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZXhlY190aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+ZXhlY190aW1lKSwgYWNjdW1fZGl2LT5leGVjX3RpbWUsCisJCSAgICAgIGRlbHRhX2Rpdi0+ZXhlY190aW1lLCBtYXhfZGl2LT5leGVjX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInByb2JlX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWY2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LW1hYy5jCkBAIC0wLDAgKzEsMzk3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCisgKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUJIml3bDM5NDUiCisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKyNpbmNsdWRlICJpd2wtc3BlY3RydW0uaCIKKworLyoKKyAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KKyAqLworCisjZGVmaW5lIERSVl9ERVNDUklQVElPTglcCisiSW50ZWwoUikgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uIGRyaXZlciBmb3IgTGludXgiCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKyNkZWZpbmUgVkQgImQiCisjZWxzZQorI2RlZmluZSBWRAorI2VuZGlmCisKKy8qCisgKiBhZGQgInMiIHRvIGluZGljYXRlIHNwZWN0cnVtIG1lYXN1cmVtZW50IGluY2x1ZGVkLgorICogd2UgYWRkIGl0IGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIGluIHdoaWNoCisgKiB0aGlzIHdhcyBjb25maWd1cmFibGUuCisgKi8KKyNkZWZpbmUgRFJWX1ZFUlNJT04gIElXTFdJRklfVkVSU0lPTiBWRCAicyIKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisgLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBpbF9tb2RfcGFyYW1zIGlsMzk0NV9tb2RfcGFyYW1zID0geworCS5zd19jcnlwdG8gPSAxLAorCS5yZXN0YXJ0X2Z3ID0gMSwKKwkuZGlzYWJsZV9od19zY2FuID0gMSwKKwkvKiB0aGUgcmVzdCBhcmUgMCBieSBkZWZhdWx0ICovCit9OworCisvKioKKyAqIGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyAtIEdldCBhbnRlbm5hIGZsYWdzIGZvciBSWE9OIGNvbW1hbmQKKyAqIEBpbDogZWVwcm9tIGFuZCBhbnRlbm5hIGZpZWxkcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgYW50ZW5uYSBmbGFncworICoKKyAqIGlsLT5lZXByb20zOSAgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW50ZW5uYSBBVVgvTUFJTiBhcmUgcmV2ZXJzZWQKKyAqIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEgc3BlY2lmaWVzIHRoZSBhbnRlbm5hIGRpdmVyc2l0eSBtb2RlOgorICoKKyAqIElMX0FOVEVOTkFfRElWRVJTSVRZIC0gTklDIHNlbGVjdHMgYmVzdCBhbnRlbm5hIGJ5IGl0c2VsZgorICogSUxfQU5URU5OQV9NQUlOICAgICAgLSBGb3JjZSBNQUlOIGFudGVubmEKKyAqIElMX0FOVEVOTkFfQVVYICAgICAgIC0gRm9yY2UgQVVYIGFudGVubmEKKyAqLworX19sZTMyCitpbDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCisJc3dpdGNoIChpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKSB7CisJY2FzZSBJTF9BTlRFTk5BX0RJVkVSU0lUWToKKwkJcmV0dXJuIDA7CisKKwljYXNlIElMX0FOVEVOTkFfTUFJTjoKKwkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKKwkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKKwkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0FfTVNLOworCisJY2FzZSBJTF9BTlRFTk5BX0FVWDoKKwkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKKwkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSzsKKwkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0JfTVNLOworCX0KKworCS8qIGJhZCBhbnRlbm5hIHNlbGVjdG9yIHZhbHVlICovCisJSUxfRVJSKCJCYWQgYW50ZW5uYSBzZWxlY3RvciB2YWx1ZSAoMHgleClcbiIsCisJICAgICAgIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOworCisJcmV0dXJuIDA7CQkvKiAiZGl2ZXJzaXR5IiBpcyBkZWZhdWx0IGlmIGVycm9yICovCit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTE2IGtleV9mbGFncyA9IDA7CisJaW50IHJldDsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfQ0NNUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisKKwlpZiAoc3RhX2lkID09IGlsLT5jdHguYmNhc3Rfc3RhX2lkKQorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOworCisJa2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBrZXljb25mLT5rZXlpZHg7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJbWVtY3B5KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkuCisJICAgICBrZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykgPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQorCQkgICAgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChpbCk7CisJLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KKwkgKiBpbiB1Q29kZS4gKi8KKworCVdBUk4oaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKKwkgICAgICJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisKKwlEX0lORk8oImh3Y3J5cHRvOiBtb2RpZnkgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7CisKKwlyZXQgPSBpbF9zZW5kX2FkZF9zdGEoaWwsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfdGtpcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X2NsZWFyX3N0YV9rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJbWVtc2V0KCZpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGlsX2h3X2tleSkpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleSwgMCwgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfa2V5aW5mbykpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0gU1RBX0tFWV9GTEdfTk9fRU5DOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJRF9JTkZPKCJod2NyeXB0bzogY2xlYXIgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7CisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NldF9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCSAgICAgICB1OCBzdGFfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RZTkFNSUM7CisKKwlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJcmV0ID0gaWwzOTQ1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwkJcmV0ID0gaWwzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisJCXJldCA9IGlsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBhbGc6ICVzIGFsZz0leFxuIiwgX19mdW5jX18sIGtleWNvbmYtPmNpcGhlcik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJRF9XRVAoIlNldCBkeW5hbWljIGtleTogYWxnPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVkIHJldD0lZFxuIiwKKwkgICAgICBrZXljb25mLT5jaXBoZXIsIGtleWNvbmYtPmtleWxlbiwga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfc3RhdGljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJTF9FUlIoIlN0YXRpYyBrZXkgaW52YWxpZDogY2lwaGVyICV4XG4iLCBrZXktPmNpcGhlcik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisKKwlEX0lORk8oIiVkIGZyYW1lcyBvbiBwcmUtYWxsb2NhdGVkIGhlYXAgb24gY2xlYXIuXG4iLCBpbC0+ZnJhbWVzX2NvdW50KTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmaWwtPmZyZWVfZnJhbWVzKSkgeworCQllbGVtZW50ID0gaWwtPmZyZWVfZnJhbWVzLm5leHQ7CisJCWxpc3RfZGVsKGVsZW1lbnQpOworCQlrZnJlZShsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbDM5NDVfZnJhbWUsIGxpc3QpKTsKKwkJaWwtPmZyYW1lc19jb3VudC0tOworCX0KKworCWlmIChpbC0+ZnJhbWVzX2NvdW50KSB7CisJCUlMX1dBUk4oIiVkIGZyYW1lcyBzdGlsbCBpbiB1c2UuICBEaWQgd2UgbG9zZSBvbmU/XG4iLAorCQkJaWwtPmZyYW1lc19jb3VudCk7CisJCWlsLT5mcmFtZXNfY291bnQgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbDM5NDVfZnJhbWUgKgoraWwzOTQ1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCWlmIChsaXN0X2VtcHR5KCZpbC0+ZnJlZV9mcmFtZXMpKSB7CisJCWZyYW1lID0ga3phbGxvYyhzaXplb2YoKmZyYW1lKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZnJhbWUpIHsKKwkJCUlMX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlsLT5mcmFtZXNfY291bnQrKzsKKwkJcmV0dXJuIGZyYW1lOworCX0KKworCWVsZW1lbnQgPSBpbC0+ZnJlZV9mcmFtZXMubmV4dDsKKwlsaXN0X2RlbChlbGVtZW50KTsKKwlyZXR1cm4gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lLCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWUpCit7CisJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7CisJbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmaWwtPmZyZWVfZnJhbWVzKTsKK30KKwordW5zaWduZWQgaW50CitpbDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJIGludCBsZWZ0KQoreworCisJaWYgKCFpbF9pc19hc3NvY2lhdGVkKGlsKSB8fCAhaWwtPmJlYWNvbl9za2IpCisJCXJldHVybiAwOworCisJaWYgKGlsLT5iZWFjb25fc2tiLT5sZW4gPiBsZWZ0KQorCQlyZXR1cm4gMDsKKworCW1lbWNweShoZHIsIGlsLT5iZWFjb25fc2tiLT5kYXRhLCBpbC0+YmVhY29uX3NrYi0+bGVuKTsKKworCXJldHVybiBpbC0+YmVhY29uX3NrYi0+bGVuOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgcmM7CisJdTggcmF0ZTsKKworCWZyYW1lID0gaWwzOTQ1X2dldF9mcmVlX2ZyYW1lKGlsKTsKKworCWlmICghZnJhbWUpIHsKKwkJSUxfRVJSKCJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgorCQkgICAgICAgImNvbW1hbmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmF0ZSA9IGlsX2dldF9sb3dlc3RfcGxjcChpbCwgJmlsLT5jdHgpOworCisJZnJhbWVfc2l6ZSA9IGlsMzk0NV9od19nZXRfYmVhY29uX2NtZChpbCwgZnJhbWUsIHJhdGUpOworCisJcmMgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfVFhfQkVBQ09OLCBmcmFtZV9zaXplLCAmZnJhbWUtPnUuY21kWzBdKTsKKworCWlsMzk0NV9mcmVlX2ZyYW1lKGlsLCBmcmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfdW5zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPl8zOTQ1LnNoYXJlZF92aXJ0KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCksCisJCQkJICBpbC0+XzM5NDUuc2hhcmVkX3ZpcnQsIGlsLT5fMzk0NS5zaGFyZWRfcGh5cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYnVpbGRfdHhfY21kX2h3Y3J5cHRvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICAgICBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWcsIGludCBzdGFfaWQpCit7CisJc3RydWN0IGlsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisJc3RydWN0IGlsX2h3X2tleSAqa2V5aW5mbyA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvOworCisJdHhfY21kLT5zZWNfY3RsID0gMDsKKworCXN3aXRjaCAoa2V5aW5mby0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKKwkJbWVtY3B5KHR4X2NtZC0+a2V5LCBrZXlpbmZvLT5rZXksIGtleWluZm8tPmtleWxlbik7CisJCURfVFgoInR4X2NtZCB3aXRoIEFFUyBod2NyeXB0b1xuIik7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlicmVhazsKKworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19LRVkxMjg7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJCXR4X2NtZC0+c2VjX2N0bCB8PQorCQkgICAgVFhfQ01EX1NFQ19XRVAgfCAoaW5mby0+Y29udHJvbC5od19rZXktPgorCQkJCSAgICAgIGh3X2tleV9pZHggJiBUWF9DTURfU0VDX01TSykgPDwKKwkJICAgIFRYX0NNRF9TRUNfU0hJRlQ7CisKKwkJbWVtY3B5KCZ0eF9jbWQtPmtleVszXSwga2V5aW5mby0+a2V5LCBrZXlpbmZvLT5rZXlsZW4pOworCisJCURfVFgoIkNvbmZpZ3VyaW5nIHBhY2tldCBmb3IgV0VQIGVuY3J5cHRpb24gIiAid2l0aCBrZXkgJWRcbiIsCisJCSAgICAgaW5mby0+Y29udHJvbC5od19rZXktPmh3X2tleV9pZHgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBlbmNvZGUgY2lwaGVyICV4XG4iLCBrZXlpbmZvLT5jaXBoZXIpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBoYW5kbGUgYnVpbGQgQ19UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHU4IHN0ZF9pZCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqdHhfY21kID0gKHN0cnVjdCBpbDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKKwlfX2xlMzIgdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOworCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgorCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCisJCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOworCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOworCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9IGVsc2UgeworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCWlsX3R4X2NtZF9wcm90ZWN0aW9uKGlsLCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKKworCXR4X2ZsYWdzICY9IH4oVFhfQ01EX0ZMR19BTlRfU0VMX01TSyk7CisJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgeworCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykgfHwgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMyk7CisJCWVsc2UKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMik7CisJfSBlbHNlIHsKKwkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSAwOworCX0KKworCXR4X2NtZC0+ZHJpdmVyX3R4b3AgPSAwOworCXR4X2NtZC0+dHhfZmxhZ3MgPSB0eF9mbGFnczsKKwl0eF9jbWQtPm5leHRfZnJhbWVfbGVuID0gMDsKK30KKworLyoKKyAqIHN0YXJ0IENfVFggY29tbWFuZCBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV90eF9za2Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpbDM5NDVfdHhfY21kICp0eF9jbWQ7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9IE5VTEw7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKm91dF9jbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICpvdXRfbWV0YTsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwlkbWFfYWRkcl90IHR4Y21kX3BoeXM7CisJaW50IHR4cV9pZCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXUxNiBsZW4sIGlkeCwgaGRyX2xlbjsKKwl1OCBpZDsKKwl1OCB1bmljYXN0OworCXU4IHN0YV9pZDsKKwl1OCB0aWQgPSAwOworCV9fbGUxNiBmYzsKKwl1OCB3YWl0X3dyaXRlX3B0ciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlmIChpbF9pc19yZmtpbGwoaWwpKSB7CisJCURfRFJPUCgiRHJvcHBpbmcgLSBSRiBLSUxMXG4iKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAoKGllZWU4MDIxMV9nZXRfdHhfcmF0ZShpbC0+aHcsIGluZm8pLT5od192YWx1ZSAmIDB4RkYpID09CisJICAgIElMX0lOVkFMSURfUkFURSkgeworCQlJTF9FUlIoIkVSUk9SOiBObyBUWCByYXRlIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCXVuaWNhc3QgPSAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CisJaWQgPSAwOworCisJZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQorCQlEX1RYKCJTZW5kaW5nIEFVVEggZnJhbWVcbiIpOworCWVsc2UgaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpKQorCQlEX1RYKCJTZW5kaW5nIEFTU09DIGZyYW1lXG4iKTsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfcmVhc3NvY19yZXEoZmMpKQorCQlEX1RYKCJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOworCisJLyogRmluZCBpZHggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCisJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgJmlsLT5jdHgsIGluZm8tPmNvbnRyb2wuc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlEX0RST1AoIkRyb3BwaW5nIC0gSU5WQUxJRCBTVEFUSU9OOiAlcE1cbiIsIGhkci0+YWRkcjEpOworCQlnb3RvIGRyb3A7CisJfQorCisJRF9SQVRFKCJzdGF0aW9uIElkICVkXG4iLCBzdGFfaWQpOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CisJCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCQlnb3RvIGRyb3A7CisJfQorCisJLyogRGVzY3JpcHRvciBmb3IgY2hvc2VuIFR4IHF1ZXVlICovCisJdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlxID0gJnR4cS0+cTsKKworCWlmICgoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKQorCQlnb3RvIGRyb3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlkeCA9IGlsX2dldF9jbWRfaWR4KHEsIHEtPndyaXRlX3B0ciwgMCk7CisKKwkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCisJbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaWxfdHhfaW5mbykpOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gJmlsLT5jdHg7CisKKwkvKiBJbml0IGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KKwlvdXRfY21kID0gdHhxLT5jbWRbaWR4XTsKKwlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbaWR4XTsKKwl0eF9jbWQgPSAoc3RydWN0IGlsMzk0NV90eF9jbWQgKilvdXRfY21kLT5jbWQucGF5bG9hZDsKKwltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOworCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZigqdHhfY21kKSk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgVHgtY29tbWFuZCAobm90IE1BQyEpIGhlYWRlci4KKwkgKiBTdG9yZSB0aGUgY2hvc2VuIFR4IHF1ZXVlIGFuZCBURkQgaWR4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7CisJICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCisJICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCisJICovCisJb3V0X2NtZC0+aGRyLmNtZCA9IENfVFg7CisJb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikKKwkJCShRVUVVRV9UT19TRVEodHhxX2lkKSB8IElEWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOworCisJLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KKwltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7CisKKwlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCisJCWlsMzk0NV9idWlsZF90eF9jbWRfaHdjcnlwdG8oaWwsIGluZm8sIG91dF9jbWQsIHNrYiwgc3RhX2lkKTsKKworCS8qIFRPRE8gbmVlZCB0aGlzIGZvciBidXJzdCBtb2RlIGxhdGVyIG9uICovCisJaWwzOTQ1X2J1aWxkX3R4X2NtZF9iYXNpYyhpbCwgb3V0X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQpOworCisJLyogc2V0IGlzX2hjY2EgdG8gMDsgaXQgcHJvYmFibHkgd2lsbCBuZXZlciBiZSBpbXBsZW1lbnRlZCAqLworCWlsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZShpbCwgb3V0X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQsIDApOworCisJLyogVG90YWwgIyBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLworCWxlbiA9ICh1MTYpIHNrYi0+bGVuOworCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKworCWlsX2RiZ19sb2dfdHhfZGF0YV9mcmFtZShpbCwgbGVuLCBoZHIpOworCWlsX3VwZGF0ZV9zdGF0cyhpbCwgdHJ1ZSwgZmMsIGxlbik7CisJdHhfY21kLT50eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19BTlRfQV9NU0s7CisJdHhfY21kLT50eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19BTlRfQl9NU0s7CisKKwlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJfSBlbHNlIHsKKwkJd2FpdF93cml0ZV9wdHIgPSAxOworCQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKKwl9CisKKwlEX1RYKCJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSkpOworCURfVFgoInR4X2ZsYWdzID0gMFgleFxuIiwgbGUzMl90b19jcHUodHhfY21kLT50eF9mbGFncykpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9UWCwgdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9UWCwgKHU4ICopIHR4X2NtZC0+aGRyLAorCQkJICBpZWVlODAyMTFfaGRybGVuKGZjKSk7CisKKwkvKgorCSAqIFVzZSB0aGUgZmlyc3QgZW1wdHkgZW50cnkgaW4gdGhpcyBxdWV1ZSdzIGNvbW1hbmQgYnVmZmVyIGFycmF5CisJICogdG8gY29udGFpbiB0aGUgVHggY29tbWFuZCBhbmQgTUFDIGhlYWRlciBjb25jYXRlbmF0ZWQgdG9nZXRoZXIKKwkgKiAocGF5bG9hZCBkYXRhIHdpbGwgYmUgaW4gYW5vdGhlciBidWZmZXIpLgorCSAqIFNpemUgb2YgdGhpcyB2YXJpZXMsIGR1ZSB0byB2YXJ5aW5nIE1BQyBoZWFkZXIgbGVuZ3RoLgorCSAqIElmIGVuZCBpcyBub3QgZHdvcmQgYWxpZ25lZCwgd2UnbGwgaGF2ZSAyIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKKwkgKiBvZiB0aGUgTUFDIGhlYWRlciAoZGV2aWNlIHJlYWRzIG9uIGR3b3JkIGJvdW5kYXJpZXMpLgorCSAqIFdlJ2xsIHRlbGwgZGV2aWNlIGFib3V0IHRoaXMgcGFkZGluZyBsYXRlci4KKwkgKi8KKwlsZW4gPQorCSAgICBzaXplb2Yoc3RydWN0IGlsMzk0NV90eF9jbWQpICsgc2l6ZW9mKHN0cnVjdCBpbF9jbWRfaGVhZGVyKSArCisJICAgIGhkcl9sZW47CisJbGVuID0gKGxlbiArIDMpICYgfjM7CisKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKKwkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCisJdHhjbWRfcGh5cyA9CisJICAgIHBjaV9tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCAmb3V0X2NtZC0+aGRyLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCS8qIHdlIGRvIG5vdCBtYXAgbWV0YSBkYXRhIC4uLiBzbyB3ZSBjYW4gc2FmZWx5IGFjY2VzcyBhZGRyZXNzIHRvCisJICogcHJvdmlkZSB0byB1bm1hcCBjb21tYW5kKi8KKwlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOworCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGxlbik7CisKKwkvKiBBZGQgYnVmZmVyIGNvbnRhaW5pbmcgVHggY29tbWFuZCBhbmQgTUFDKCEpIGhlYWRlciB0byBURkQncworCSAqIGZpcnN0IGVudHJ5ICovCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCB0eGNtZF9waHlzLCBsZW4sIDEsCisJCQkJCQkgMCk7CisKKwkvKiBTZXQgdXAgVEZEJ3MgMm5kIGVudHJ5IHRvIHBvaW50IGRpcmVjdGx5IHRvIHJlbWFpbmRlciBvZiBza2IsCisJICogaWYgYW55ICg4MDIuMTEgbnVsbCBmcmFtZXMgaGF2ZSBubyBwYXlsb2FkKS4gKi8KKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJaWYgKGxlbikgeworCQlwaHlzX2FkZHIgPQorCQkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sIGxlbiwKKwkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCBwaHlzX2FkZHIsCisJCQkJCQkJIGxlbiwgMCwgVTMyX1BBRChsZW4pKTsKKwl9CisKKwkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaWR4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KKwlxLT53cml0ZV9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmsgJiYgaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOworCQkJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHR4cSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJaWxfc3RvcF9xdWV1ZShpbCwgdHhxKTsKKwl9CisKKwlyZXR1cm4gMDsKKworZHJvcF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKK2Ryb3A6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfZ2V0X21lYXN1cmVtZW50KHN0cnVjdCBpbF9wcml2ICppbCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zICpwYXJhbXMsIHU4IHR5cGUpCit7CisJc3RydWN0IGlsX3NwZWN0cnVtX2NtZCBzcGVjdHJ1bTsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCwKKwkJLmRhdGEgPSAodm9pZCAqKSZzcGVjdHJ1bSwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCX07CisJdTMyIGFkZF90aW1lID0gbGU2NF90b19jcHUocGFyYW1zLT5zdGFydF90aW1lKTsKKwlpbnQgcmM7CisJaW50IHNwZWN0cnVtX3Jlc3Bfc3RhdHVzOworCWludCBkdXJhdGlvbiA9IGxlMTZfdG9fY3B1KHBhcmFtcy0+ZHVyYXRpb24pOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpKQorCQlhZGRfdGltZSA9CisJCSAgICBpbF91c2Vjc190b19iZWFjb25zKGlsLAorCQkJCQlsZTY0X3RvX2NwdShwYXJhbXMtPnN0YXJ0X3RpbWUpIC0KKwkJCQkJaWwtPl8zOTQ1Lmxhc3RfdHNmLAorCQkJCQlsZTE2X3RvX2NwdShjdHgtPnRpbWluZy4KKwkJCQkJCSAgICBiZWFjb25faW50ZXJ2YWwpKTsKKworCW1lbXNldCgmc3BlY3RydW0sIDAsIHNpemVvZihzcGVjdHJ1bSkpOworCisJc3BlY3RydW0uY2hhbm5lbF9jb3VudCA9IGNwdV90b19sZTE2KDEpOworCXNwZWN0cnVtLmZsYWdzID0KKwkgICAgUlhPTl9GTEdfVFNGMkhPU1RfTVNLIHwgUlhPTl9GTEdfQU5UX0FfTVNLIHwgUlhPTl9GTEdfRElTX0RJVl9NU0s7CisJc3BlY3RydW0uZmlsdGVyX2ZsYWdzID0gTUVBU1VSRU1FTlRfRklMVEVSX0ZMQUc7CisJY21kLmxlbiA9IHNpemVvZihzcGVjdHJ1bSk7CisJc3BlY3RydW0ubGVuID0gY3B1X3RvX2xlMTYoY21kLmxlbiAtIHNpemVvZihzcGVjdHJ1bS5sZW4pKTsKKworCWlmIChpbF9pc19hc3NvY2lhdGVkKGlsKSkKKwkJc3BlY3RydW0uc3RhcnRfdGltZSA9CisJCSAgICBpbF9hZGRfYmVhY29uX3RpbWUoaWwsIGlsLT5fMzk0NS5sYXN0X2JlYWNvbl90aW1lLCBhZGRfdGltZSwKKwkJCQkgICAgICAgbGUxNl90b19jcHUoY3R4LT50aW1pbmcuCisJCQkJCQkgICBiZWFjb25faW50ZXJ2YWwpKTsKKwllbHNlCisJCXNwZWN0cnVtLnN0YXJ0X3RpbWUgPSAwOworCisJc3BlY3RydW0uY2hhbm5lbHNbMF0uZHVyYXRpb24gPSBjcHVfdG9fbGUzMihkdXJhdGlvbiAqIFRJTUVfVU5JVCk7CisJc3BlY3RydW0uY2hhbm5lbHNbMF0uY2hhbm5lbCA9IHBhcmFtcy0+Y2hhbm5lbDsKKwlzcGVjdHJ1bS5jaGFubmVsc1swXS50eXBlID0gdHlwZTsKKwlpZiAoY3R4LT5hY3RpdmUuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spCisJCXNwZWN0cnVtLmZsYWdzIHw9CisJCSAgICBSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgfAorCQkgICAgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOworCisJcmMgPSBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSUxfQ01EX0ZBSUxFRF9NU0spIHsKKwkJSUxfRVJSKCJCYWQgcmV0dXJuIGZyb20gTl9SWF9PTl9BU1NPQyBjb21tYW5kXG4iKTsKKwkJcmMgPSAtRUlPOworCX0KKworCXNwZWN0cnVtX3Jlc3Bfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT51LnNwZWN0cnVtLnN0YXR1cyk7CisJc3dpdGNoIChzcGVjdHJ1bV9yZXNwX3N0YXR1cykgeworCWNhc2UgMDoJCS8qIENvbW1hbmQgd2lsbCBiZSBoYW5kbGVkICovCisJCWlmIChwa3QtPnUuc3BlY3RydW0uaWQgIT0gMHhmZikgeworCQkJRF9JTkZPKCJSZXBsYWNlZCBleGlzdGluZyBtZWFzdXJlbWVudDogJWRcbiIsCisJCQkgICAgICAgcGt0LT51LnNwZWN0cnVtLmlkKTsKKwkJCWlsLT5tZWFzdXJlbWVudF9zdGF0dXMgJj0gfk1FQVNVUkVNRU5UX1JFQURZOworCQl9CisJCWlsLT5tZWFzdXJlbWVudF9zdGF0dXMgfD0gTUVBU1VSRU1FTlRfQUNUSVZFOworCQlyYyA9IDA7CisJCWJyZWFrOworCisJY2FzZSAxOgkJLyogQ29tbWFuZCB3aWxsIG5vdCBiZSBoYW5kbGVkICovCisJCXJjID0gLUVBR0FJTjsKKwkJYnJlYWs7CisJfQorCisJaWxfZnJlZV9wYWdlcyhpbCwgY21kLnJlcGx5X3BhZ2UpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2hkbF9hbGl2ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9hbGl2ZV9yZXNwICpwYWxpdmU7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqcHdvcms7CisKKwlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOworCisJRF9JTkZPKCJBbGl2ZSB1Y29kZSBzdGF0dXMgMHglMDhYIHJldmlzaW9uICIgIjB4JTAxWCAweCUwMVhcbiIsCisJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsIHBhbGl2ZS0+dmVyX3N1YnR5cGUpOworCisJaWYgKHBhbGl2ZS0+dmVyX3N1YnR5cGUgPT0gSU5JVElBTElaRV9TVUJUWVBFKSB7CisJCURfSU5GTygiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwkJbWVtY3B5KCZpbC0+Y2FyZF9hbGl2ZV9pbml0LCAmcGt0LT51LmFsaXZlX2ZyYW1lLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hbGl2ZV9yZXNwKSk7CisJCXB3b3JrID0gJmlsLT5pbml0X2FsaXZlX3N0YXJ0OworCX0gZWxzZSB7CisJCURfSU5GTygiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOworCQltZW1jcHkoJmlsLT5jYXJkX2FsaXZlLCAmcGt0LT51LmFsaXZlX2ZyYW1lLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hbGl2ZV9yZXNwKSk7CisJCXB3b3JrID0gJmlsLT5hbGl2ZV9zdGFydDsKKwkJaWwzOTQ1X2Rpc2FibGVfZXZlbnRzKGlsKTsKKwl9CisKKwkvKiBXZSBkZWxheSB0aGUgQUxJVkUgcmVzcG9uc2UgYnkgNW1zIHRvCisJICogZ2l2ZSB0aGUgSFcgUkYgS2lsbCB0aW1lIHRvIGFjdGl2YXRlLi4uICovCisJaWYgKHBhbGl2ZS0+aXNfdmFsaWQgPT0gVUNPREVfVkFMSURfT0spCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbC0+d29ya3F1ZXVlLCBwd29yaywgbXNlY3NfdG9famlmZmllcyg1KSk7CisJZWxzZQorCQlJTF9XQVJOKCJ1Q29kZSBkaWQgbm90IHJlc3BvbmQgT0suXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfYWRkX3N0YShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworI2VuZGlmCisKKwlEX1JYKCJSZWNlaXZlZCBDX0FERF9TVEE6IDB4JTAyWFxuIiwgcGt0LT51LnN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX2JlYWNvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbDM5NDVfYmVhY29uX25vdGlmICpiZWFjb24gPSAmKHBrdC0+dS5iZWFjb25fc3RhdHVzKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1OCByYXRlID0gYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlOworCisJRF9SWCgiYmVhY29uIHN0YXR1cyAleCByZXRyaWVzICVkIGlzcyAlZCAiICJ0c2YgJWQgJWQgcmF0ZSAlZFxuIiwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuc3RhdHVzKSAmIFRYX1NUQVRVU19NU0ssCisJICAgICBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmhpZ2hfdHNmKSwgbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7CisjZW5kaWYKKworCWlsLT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7CisKK30KKworLyogSGFuZGxlIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlIHRoYXQgY2FyZCdzIHBvd2VyIHN0YXRlIGlzIGNoYW5naW5nCisgKiBkdWUgdG8gc29mdHdhcmUsIGhhcmR3YXJlLCBvciBjcml0aWNhbCB0ZW1wZXJhdHVyZSBSRktJTEwgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX2NhcmRfc3RhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MzIgZmxhZ3MgPSBsZTMyX3RvX2NwdShwa3QtPnUuY2FyZF9zdGF0ZV9ub3RpZi5mbGFncyk7CisJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSBpbC0+c3RhdHVzOworCisJSUxfV0FSTigiQ2FyZCBzdGF0ZSByZWNlaXZlZDogSFc6JXMgU1c6JXNcbiIsCisJCShmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKKwkJKGZsYWdzICYgU1dfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iKTsKKworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULCBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOworCisJaWYgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCWlsX3NjYW5fY2FuY2VsKGlsKTsKKworCWlmICgodGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmc3RhdHVzKSAhPQorCSAgICAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpKQorCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksCisJCQkJCSAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpOworCWVsc2UKKwkJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7Cit9CisKKy8qKgorICogaWwzOTQ1X3NldHVwX2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcworICoKKyAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQorICogdG8gdGhlIGhvc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKKyAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3NldHVwX2hhbmRsZXJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbC0+aGFuZGxlcnNbTl9BTElWRV0gPSBpbDM5NDVfaGRsX2FsaXZlOworCWlsLT5oYW5kbGVyc1tDX0FERF9TVEFdID0gaWwzOTQ1X2hkbF9hZGRfc3RhOworCWlsLT5oYW5kbGVyc1tOX0VSUk9SXSA9IGlsX2hkbF9lcnJvcjsKKwlpbC0+aGFuZGxlcnNbTl9DSEFOTkVMX1NXSVRDSF0gPSBpbF9oZGxfY3NhOworCWlsLT5oYW5kbGVyc1tOX1NQRUNUUlVNX01FQVNVUkVNRU5UXSA9IGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudDsKKwlpbC0+aGFuZGxlcnNbTl9QTV9TTEVFUF0gPSBpbF9oZGxfcG1fc2xlZXA7CisJaWwtPmhhbmRsZXJzW05fUE1fREVCVUdfU1RBVFNdID0gaWxfaGRsX3BtX2RlYnVnX3N0YXRzOworCWlsLT5oYW5kbGVyc1tOX0JFQUNPTl0gPSBpbDM5NDVfaGRsX2JlYWNvbjsKKworCS8qCisJICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCisJICogc3RhdHMgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYworCSAqIHN0YXRzIG5vdGlmaWNhdGlvbnMgKGFmdGVyIHJlY2VpdmVkIGJlYWNvbnMpIGZyb20gdGhlIHVDb2RlLgorCSAqLworCWlsLT5oYW5kbGVyc1tDX1NUQVRTXSA9IGlsMzk0NV9oZGxfY19zdGF0czsKKwlpbC0+aGFuZGxlcnNbTl9TVEFUU10gPSBpbDM5NDVfaGRsX3N0YXRzOworCisJaWxfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhpbCk7CisJaWwtPmhhbmRsZXJzW05fQ0FSRF9TVEFURV0gPSBpbDM5NDVfaGRsX2NhcmRfc3RhdGU7CisKKwkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KKwlpbDM5NDVfaHdfaGFuZGxlcl9zZXR1cChpbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSWC1GVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSeCB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICogVGhlIGhvc3QgYWxsb2NhdGVzIDMyIERNQSB0YXJnZXQgYWRkcmVzc2VzIGFuZCBwYXNzZXMgdGhlIGhvc3QgYWRkcmVzcworICogdG8gdGhlIGZpcm13YXJlIGF0IHJlZ2lzdGVyIElMX1JGRFNfVEJMX0xPV0VSICsgTiAqIFJGRF9TSVpFIHdoZXJlIE4gaXMKKyAqIDAgdG8gMzEKKyAqCisgKiBSeCBRdWV1ZSBJbmRleGVzCisgKiBUaGUgaG9zdC9maXJtd2FyZSBzaGFyZSB0d28gaWR4IHJlZ2lzdGVycyBmb3IgbWFuYWdpbmcgdGhlIFJ4IGJ1ZmZlcnMuCisgKgorICogVGhlIFJFQUQgaWR4IG1hcHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHRoYXQgdGhlIGZpcm13YXJlIG1heSBiZSB3cml0aW5nCisgKiB0byAtLSB0aGUgZHJpdmVyIGNhbiByZWFkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhpcyBwb3NpdGlvbiBhbmQgZ2V0CisgKiBnb29kIGRhdGEuCisgKiBUaGUgUkVBRCBpZHggaXMgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUgb25jZSB0aGUgY2FyZCBpcyBlbmFibGVkLgorICoKKyAqIFRoZSBXUklURSBpZHggbWFwcyB0byB0aGUgbGFzdCBwb3NpdGlvbiB0aGUgZHJpdmVyIGhhcyByZWFkIGZyb20gLS0gdGhlCisgKiBwb3NpdGlvbiBwcmVjZWRpbmcgV1JJVEUgaXMgdGhlIGxhc3Qgc2xvdCB0aGUgZmlybXdhcmUgY2FuIHBsYWNlIGEgcGFja2V0LgorICoKKyAqIFRoZSBxdWV1ZSBpcyBlbXB0eSAobm8gZ29vZCBkYXRhKSBpZiBXUklURSA9IFJFQUQgLSAxLCBhbmQgaXMgZnVsbCBpZgorICogV1JJVEUgPSBSRUFELgorICoKKyAqIER1cmluZyBpbml0aWFsaXphdGlvbiwgdGhlIGhvc3Qgc2V0cyB1cCB0aGUgUkVBRCBxdWV1ZSBwb3NpdGlvbiB0byB0aGUgZmlyc3QKKyAqIElEWCBwb3NpdGlvbiwgYW5kIFdSSVRFIHRvIHRoZSBsYXN0IChSRUFEIC0gMSB3cmFwcGVkKQorICoKKyAqIFdoZW4gdGhlIGZpcm13YXJlIHBsYWNlcyBhIHBhY2tldCBpbiBhIGJ1ZmZlciwgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGlkeAorICogYW5kIGZpcmUgdGhlIFJYIGludGVycnVwdC4gIFRoZSBkcml2ZXIgY2FuIHRoZW4gcXVlcnkgdGhlIFJFQUQgaWR4IGFuZAorICogcHJvY2VzcyBhcyBtYW55IHBhY2tldHMgYXMgcG9zc2libGUsIG1vdmluZyB0aGUgV1JJVEUgaWR4IGZvcndhcmQgYXMgaXQKKyAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCisgKgorICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgorICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpd2wtPnJ4cS0+cnhfZnJlZS4gIFdoZW4KKyAqICAgaXdsLT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKKyAqICAgdG8gcmVwbGVuaXNoIHRoZSBpd2wtPnJ4cS0+cnhfZnJlZS4KKyAqICsgSW4gaWwzOTQ1X3J4X3JlcGxlbmlzaCAoc2NoZWR1bGVkKSBpZiAncHJvY2Vzc2VkJyAhPSAncmVhZCcgdGhlbiB0aGUKKyAqICAgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYW5kIHRoZSBSRUFEIElEWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKKyAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaWR4ZXMgYXMgd2VsbCkKKyAqICsgQSByZWNlaXZlZCBwYWNrZXQgaXMgcHJvY2Vzc2VkIGFuZCBoYW5kZWQgdG8gdGhlIGtlcm5lbCBuZXR3b3JrIHN0YWNrLAorICogICBkZXRhY2hlZCBmcm9tIHRoZSBpd2wtPnJ4cS4gIFRoZSBkcml2ZXIgJ3Byb2Nlc3NlZCcgaWR4IGlzIHVwZGF0ZWQuCisgKiArIFRoZSBIb3N0L0Zpcm13YXJlIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGF0IHRhc2tsZXQgdGltZSBmcm9tIHRoZSByeF9mcmVlCisgKiAgIGxpc3QuIElmIHRoZXJlIGFyZSBubyBhbGxvY2F0ZWQgYnVmZmVycyBpbiBpd2wtPnJ4cS0+cnhfZnJlZSwgdGhlIFJFQUQKKyAqICAgSURYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXdsLT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKKyAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgorICoKKyAqCisgKiBEcml2ZXIgc2VxdWVuY2U6CisgKgorICogaWwzOTQ1X3J4X3JlcGxlbmlzaCgpICAgICBSZXBsZW5pc2hlcyByeF9mcmVlIGxpc3QgZnJvbSByeF91c2VkLCBhbmQgY2FsbHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrCisgKiBpbDM5NDVfcnhfcXVldWVfcmVzdG9jaygpIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpZHguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaWwzOTQ1X3J4X3JlcGxlbmlzaAorICoKKyAqIC0tIGVuYWJsZSBpbnRlcnJ1cHRzIC0tCisgKiBJU1IgLSBpbDM5NDVfcngoKSAgICAgICAgIERldGFjaCBpbF9yeF9idWZzIGZyb20gcG9vbCB1cCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQgSURYLCBkZXRhY2hpbmcgdGhlIFNLQiBmcm9tIHRoZSBwb29sLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZXMgdGhlIHBhY2tldCBidWZmZXIgZnJvbSBxdWV1ZSB0byByeF91c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbHMgaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sgdG8gcmVmaWxsIGFueSBlbXB0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMuCisgKiAuLi4KKyAqCisgKi8KKworLyoqCisgKiBpbDM5NDVfZG1hX2FkZHIycmJkX3B0ciAtIGNvbnZlcnQgYSBETUEgYWRkcmVzcyB0byBhIHVDb2RlIHJlYWQgYnVmZmVyIHB0cgorICovCitzdGF0aWMgaW5saW5lIF9fbGUzMgoraWwzOTQ1X2RtYV9hZGRyMnJiZF9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBjcHVfdG9fbGUzMigodTMyKSBkbWFfYWRkcik7Cit9CisKKy8qKgorICogaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sgLSByZWZpbGwgUlggcXVldWUgZnJvbSBwcmUtYWxsb2NhdGVkIHBvb2wKKyAqCisgKiBJZiB0aGVyZSBhcmUgc2xvdHMgaW4gdGhlIFJYIHF1ZXVlIHRoYXQgbmVlZCB0byBiZSByZXN0b2NrZWQsCisgKiBhbmQgd2UgaGF2ZSBmcmVlIHByZS1hbGxvY2F0ZWQgYnVmZmVycywgZmlsbCB0aGUgcmFua3MgYXMgbXVjaAorICogYXMgd2UgY2FuLCBwdWxsaW5nIGZyb20gcnhfZnJlZS4KKyAqCisgKiBUaGlzIG1vdmVzIHRoZSAnd3JpdGUnIGlkeCBmb3J3YXJkIHRvIGNhdGNoIHVwIHdpdGggJ3Byb2Nlc3NlZCcsIGFuZAorICogYWxzbyB1cGRhdGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBpbiB0aGUgZmlybXdhcmUgdG8gcmVmZXJlbmNlIHRoZSBuZXcKKyAqIHRhcmdldCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3cml0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZSA9IHJ4cS0+d3JpdGUgJiB+MHg3OworCXdoaWxlIChpbF9yeF9xdWV1ZV9zcGFjZShyeHEpID4gMCAmJiByeHEtPmZyZWVfY291bnQpIHsKKwkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLworCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7CisJCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsX3J4X2J1ZiwgbGlzdCk7CisJCWxpc3RfZGVsKGVsZW1lbnQpOworCisJCS8qIFBvaW50IHRvIFJ4IGJ1ZmZlciB2aWEgbmV4dCBSQkQgaW4gY2lyY3VsYXIgYnVmZmVyICovCisJCXJ4cS0+YmRbcnhxLT53cml0ZV0gPQorCQkgICAgaWwzOTQ1X2RtYV9hZGRyMnJiZF9wdHIoaWwsIHJ4Yi0+cGFnZV9kbWEpOworCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOworCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7CisJCXJ4cS0+ZnJlZV9jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCisJICogcmVmaWxsIGl0ICovCisJaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQorCQlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cnhfcmVwbGVuaXNoKTsKKworCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgorCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLworCWlmIChyeHEtPndyaXRlX2FjdHVhbCAhPSAocnhxLT53cml0ZSAmIH4weDcpIHx8CisJICAgIGFicyhyeHEtPndyaXRlIC0gcnhxLT5yZWFkKSA+IDcpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHJ4cSk7CisJfQorfQorCisvKioKKyAqIGlsMzk0NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQorICoKKyAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCisgKgorICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2suCisgKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3J4X2FsbG9jYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgZ2ZwX3QgcHJpb3JpdHkpCit7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWdmcF90IGdmcF9tYXNrID0gcHJpb3JpdHk7CisKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOworCisJCWlmIChpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPiAwKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfQ09NUDsKKworCQkvKiBBbGxvYyBhIG5ldyByZWNlaXZlIGJ1ZmZlciAqLworCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlEX0lORk8oIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyLlxuIik7CisJCQlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUksgJiYKKwkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCisJCQkJSUxfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgU0tCIGJ1ZmZlciB3aXRoICUweC4iCisJCQkJICAgICAgICJPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAorCQkJCSAgICAgICBwcmlvcml0eSwgcnhxLT5mcmVlX2NvdW50KTsKKwkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCisJCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKKwkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJCV9fZnJlZV9wYWdlcyhwYWdlLCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCQkJcmV0dXJuOworCQl9CisJCWVsZW1lbnQgPSByeHEtPnJ4X3VzZWQubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCXJ4Yi0+cGFnZSA9IHBhZ2U7CisJCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIFJCL1NLQiAqLworCQlyeGItPnBhZ2VfZG1hID0KKwkJICAgIHBjaV9tYXBfcGFnZShpbC0+cGNpX2RldiwgcGFnZSwgMCwKKwkJCQkgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF9mcmVlKTsKKwkJcnhxLT5mcmVlX2NvdW50Kys7CisJCWlsLT5hbGxvY19yeGJfcGFnZSsrOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCX0KK30KKwordm9pZAoraWwzOTQ1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisJLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykgeworCQkvKiBJbiB0aGUgcmVzZXQgZnVuY3Rpb24sIHRoZXNlIGJ1ZmZlcnMgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKwkJICogdG8gYW4gU0tCLCBzbyB3ZSBuZWVkIHRvIHVubWFwIGFuZCBmcmVlIHBvdGVudGlhbCBzdG9yYWdlICovCisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJX19pbF9mcmVlX3BhZ2VzKGlsLCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmcnhxLT5wb29sW2ldLmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCX0KKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKKwlyeHEtPmZyZWVfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkCitpbDM5NDVfcnhfcmVwbGVuaXNoKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWwzOTQ1X3J4X2FsbG9jYXRlKGlsLCBHRlBfS0VSTkVMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsMzk0NV9yeF9hbGxvY2F0ZShpbCwgR0ZQX0FUT01JQyk7CisKKwlpbDM5NDVfcnhfcXVldWVfcmVzdG9jayhpbCk7Cit9CisKKy8qIEFzc3VtZXMgdGhhdCB0aGUgc2tiIGZpZWxkIG9mIHRoZSBidWZmZXJzIGluICdwb29sJyBpcyBrZXB0IGFjY3VyYXRlLgorICogSWYgYW4gU0tCIGhhcyBiZWVuIGRldGFjaGVkLCB0aGUgUE9PTCBuZWVkcyB0byBoYXZlIGl0cyBTS0Igc2V0IHRvIE5VTEwKKyAqIFRoaXMgZnJlZSByb3V0aW5lIHdhbGtzIHRoZSBsaXN0IG9mIFBPT0wgZW50cmllcyBhbmQgaWYgU0tCIGlzIHNldCB0bworICogbm9uIE5VTEwgaXQgaXMgdW5tYXBwZWQgYW5kIGZyZWVkCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGlsLT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCisJCQkJICAgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlfX2lsX2ZyZWVfcGFnZXMoaWwsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKKwkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKKwkJfQorCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKKwkJCSAgcnhxLT5iZF9kbWEpOworCWRtYV9mcmVlX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlsX3JiX3N0YXR1cyksCisJCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7CisJcnhxLT5iZCA9IE5VTEw7CisJcnhxLT5yYl9zdHRzID0gTlVMTDsKK30KKworLyogQ29udmVydCBsaW5lYXIgc2lnbmFsLXRvLW5vaXNlIHJhdGlvIGludG8gZEIgKi8KK3N0YXRpYyB1OCByYXRpbzJkQlsxMDBdID0geworLyoJIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgKi8KKwkwLCAwLCA2LCAxMCwgMTIsIDE0LCAxNiwgMTcsIDE4LCAxOSwJLyogMDAgLSAwOSAqLworCTIwLCAyMSwgMjIsIDIyLCAyMywgMjMsIDI0LCAyNSwgMjYsIDI2LAkvKiAxMCAtIDE5ICovCisJMjYsIDI2LCAyNiwgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOSwgMjksCS8qIDIwIC0gMjkgKi8KKwkyOSwgMzAsIDMwLCAzMCwgMzEsIDMxLCAzMSwgMzEsIDMyLCAzMiwJLyogMzAgLSAzOSAqLworCTMyLCAzMiwgMzIsIDMzLCAzMywgMzMsIDMzLCAzMywgMzQsIDM0LAkvKiA0MCAtIDQ5ICovCisJMzQsIDM0LCAzNCwgMzQsIDM1LCAzNSwgMzUsIDM1LCAzNSwgMzUsCS8qIDUwIC0gNTkgKi8KKwkzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzcsIDM3LCAzNywJLyogNjAgLSA2OSAqLworCTM3LCAzNywgMzcsIDM3LCAzNywgMzgsIDM4LCAzOCwgMzgsIDM4LAkvKiA3MCAtIDc5ICovCisJMzgsIDM4LCAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCAzOSwgMzksCS8qIDgwIC0gODkgKi8KKwkzOSwgMzksIDM5LCAzOSwgMzksIDQwLCA0MCwgNDAsIDQwLCA0MAkvKiA5MCAtIDk5ICovCit9OworCisvKiBDYWxjdWxhdGVzIGEgcmVsYXRpdmUgZEIgdmFsdWUgZnJvbSBhIHJhdGlvIG9mIGxpbmVhcgorICogICAoaS5lLiBub3QgZEIpIHNpZ25hbCBsZXZlbHMuCisgKiBDb252ZXJzaW9uIGFzc3VtZXMgdGhhdCBsZXZlbHMgYXJlIHZvbHRhZ2VzICgyMCpsb2cpLCBub3QgcG93ZXJzICgxMCpsb2cpLiAqLworaW50CitpbDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pCit7CisJLyogMTAwMDoxIG9yIGhpZ2hlciBqdXN0IHJlcG9ydCBhcyA2MCBkQiAqLworCWlmIChzaWdfcmF0aW8gPj0gMTAwMCkKKwkJcmV0dXJuIDYwOworCisJLyogMTAwOjEgb3IgaGlnaGVyLCBkaXZpZGUgYnkgMTAgYW5kIHVzZSB0YWJsZSwKKwkgKiAgIGFkZCAyMCBkQiB0byBtYWtlIHVwIGZvciBkaXZpZGUgYnkgMTAgKi8KKwlpZiAoc2lnX3JhdGlvID49IDEwMCkKKwkJcmV0dXJuIDIwICsgKGludClyYXRpbzJkQltzaWdfcmF0aW8gLyAxMF07CisKKwkvKiBXZSBzaG91bGRuJ3Qgc2VlIHRoaXMgKi8KKwlpZiAoc2lnX3JhdGlvIDwgMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBVc2UgdGFibGUgZm9yIHJhdGlvcyAxOjEgLSA5OToxICovCisJcmV0dXJuIChpbnQpcmF0aW8yZEJbc2lnX3JhdGlvXTsKK30KKworLyoqCisgKiBpbDM5NDVfcnhfaGFuZGxlIC0gTWFpbiBlbnRyeSBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIHJlc3BvbnNlcyBmcm9tIHVDb2RlCisgKgorICogVXNlcyB0aGUgaWwtPmhhbmRsZXJzIGNhbGxiYWNrIGZ1bmN0aW9uIGFycmF5IHRvIGludm9rZQorICogdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXJzLCBpbmNsdWRpbmcgY29tbWFuZCByZXNwb25zZXMsCisgKiBmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb25zLCBhbmQgb3RoZXIgbm90aWZpY2F0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yeF9oYW5kbGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwl1MzIgciwgaTsKKwlpbnQgcmVjbGFpbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGZpbGxfcnggPSAwOworCXUzMiBjb3VudCA9IDg7CisJaW50IHRvdGFsX2VtcHR5ID0gMDsKKworCS8qIHVDb2RlJ3MgcmVhZCBpZHggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4CisJICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KKwlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmIDB4MEZGRjsKKwlpID0gcnhxLT5yZWFkOworCisJLyogY2FsY3VsYXRlIHRvdGFsIGZyYW1lcyBuZWVkIHRvIGJlIHJlc3RvY2sgYWZ0ZXIgaGFuZGxpbmcgUlggKi8KKwl0b3RhbF9lbXB0eSA9IHIgLSByeHEtPndyaXRlX2FjdHVhbDsKKwlpZiAodG90YWxfZW1wdHkgPCAwKQorCQl0b3RhbF9lbXB0eSArPSBSWF9RVUVVRV9TSVpFOworCisJaWYgKHRvdGFsX2VtcHR5ID4gKFJYX1FVRVVFX1NJWkUgLyAyKSkKKwkJZmlsbF9yeCA9IDE7CisJLyogUnggaW50ZXJydXB0LCBidXQgbm90aGluZyBzZW50IGZyb20gdUNvZGUgKi8KKwlpZiAoaSA9PSByKQorCQlEX1JYKCJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7CisKKwl3aGlsZSAoaSAhPSByKSB7CisJCWludCBsZW47CisKKwkJcnhiID0gcnhxLT5xdWV1ZVtpXTsKKworCQkvKiBJZiBhbiBSWEIgZG9lc24ndCBoYXZlIGEgUnggcXVldWUgc2xvdCBhc3NvY2lhdGVkIHdpdGggaXQsCisJCSAqIHRoZW4gYSBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB0aGUgcXVldWUgcmVmaWxsaW5nCisJCSAqIHJvdXRpbmVzIC0tIGNhdGNoIGl0IGhlcmUgKi8KKwkJQlVHX09OKHJ4YiA9PSBOVUxMKTsKKworCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKKworCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhiLT5wYWdlX2RtYSwKKwkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisKKwkJbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBJTF9SWF9GUkFNRV9TSVpFX01TSzsKKwkJbGVuICs9IHNpemVvZih1MzIpOwkvKiBhY2NvdW50IGZvciBzdGF0dXMgd29yZCAqLworCisJCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKKwkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KKwkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAorCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCisJCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAorCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KKwkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCisJCSAgICBwa3QtPmhkci5jbWQgIT0gTl9TVEFUUyAmJiBwa3QtPmhkci5jbWQgIT0gQ19UWDsKKworCQkvKiBCYXNlZCBvbiB0eXBlIG9mIGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uLAorCQkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCisJCSAqICAgaGFuZGxlcnMgdGFibGUuICBTZWUgaWwzOTQ1X3NldHVwX2hhbmRsZXJzKCkgKi8KKwkJaWYgKGlsLT5oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7CisJCQlEX1JYKCJyID0gJWQsIGkgPSAlZCwgJXMsIDB4JTAyeFxuIiwgciwgaSwKKwkJCSAgICAgaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKKwkJCWlsLT5pc3Jfc3RhdHMuaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOworCQkJaWwtPmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKGlsLCByeGIpOworCQl9IGVsc2UgeworCQkJLyogTm8gaGFuZGxpbmcgbmVlZGVkICovCisJCQlEX1JYKCJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsIHIsCisJCQkgICAgIGksIGlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7CisJCX0KKworCQkvKgorCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCisJCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKKwkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgaGFuZGxlciBtaWdodCBoYXZlCisJCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgorCQkgKi8KKworCQlpZiAocmVjbGFpbSkgeworCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAorCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nIGlsX3NlbmRfY21kKCkKKwkJCSAqIGFzIHdlIHJlY2xhaW0gdGhlIGRyaXZlciBjb21tYW5kIHF1ZXVlICovCisJCQlpZiAocnhiLT5wYWdlKQorCQkJCWlsX3R4X2NtZF9jb21wbGV0ZShpbCwgcnhiKTsKKwkJCWVsc2UKKwkJCQlJTF9XQVJOKCJDbGFpbSBudWxsIHJ4Yj9cbiIpOworCQl9CisKKwkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKKwkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCisJCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7CisJCQlyeGItPnBhZ2VfZG1hID0KKwkJCSAgICBwY2lfbWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwgMCwKKwkJCQkJIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLgorCQkJCQkgcnhfcGFnZV9vcmRlciwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJfSBlbHNlCisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCisJCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbid0IGFzc2VydC4gKi8KKwkJaWYgKGZpbGxfcngpIHsKKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPj0gOCkgeworCQkJCXJ4cS0+cmVhZCA9IGk7CisJCQkJaWwzOTQ1X3J4X3JlcGxlbmlzaF9ub3coaWwpOworCQkJCWNvdW50ID0gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KKwlyeHEtPnJlYWQgPSBpOworCWlmIChmaWxsX3J4KQorCQlpbDM5NDVfcnhfcmVwbGVuaXNoX25vdyhpbCk7CisJZWxzZQorCQlpbDM5NDVfcnhfcXVldWVfcmVzdG9jayhpbCk7Cit9CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraWwzOTQ1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0ICovCisJc3luY2hyb25pemVfaXJxKGlsLT5wY2lfZGV2LT5pcnEpOworCXRhc2tsZXRfa2lsbCgmaWwtPmlycV90YXNrbGV0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraWwzOTQ1X2Rlc2NfbG9va3VwKGludCBpKQoreworCXN3aXRjaCAoaSkgeworCWNhc2UgMToKKwkJcmV0dXJuICJGQUlMIjsKKwljYXNlIDI6CisJCXJldHVybiAiQkFEX1BBUkFNIjsKKwljYXNlIDM6CisJCXJldHVybiAiQkFEX0NIRUNLU1VNIjsKKwljYXNlIDQ6CisJCXJldHVybiAiTk1JX0lOVEVSUlVQVCI7CisJY2FzZSA1OgorCQlyZXR1cm4gIlNZU0FTU0VSVCI7CisJY2FzZSA2OgorCQlyZXR1cm4gIkZBVEFMX0VSUk9SIjsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorCisjZGVmaW5lIEVSUk9SX1NUQVJUX09GRlNFVCAgKDEgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgRVJST1JfRUxFTV9TSVpFICAgICAoNyAqIHNpemVvZih1MzIpKQorCit2b2lkCitpbDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgaTsKKwl1MzIgZGVzYywgdGltZSwgY291bnQsIGJhc2UsIGRhdGExOworCXUzMiBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazI7CisKKwliYXNlID0gbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmUuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKKworCWlmICghaWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKKwkJSUxfRVJSKCJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYXG4iLCBiYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWNvdW50ID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSk7CisKKwlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7CisJCUlMX0VSUigiU3RhcnQgSVdMIEVycm9yIExvZyBEdW1wOlxuIik7CisJCUlMX0VSUigiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsIGlsLT5zdGF0dXMsIGNvdW50KTsKKwl9CisKKwlJTF9FUlIoIkRlc2MgICAgICAgVGltZSAgICAgICBhc3J0UEMgIGJsaW5rMiAiCisJICAgICAgICJpbGluazEgIG5taVBDICAgTGluZVxuIik7CisJZm9yIChpID0gRVJST1JfU1RBUlRfT0ZGU0VUOworCSAgICAgaSA8IChjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgKyBFUlJPUl9TVEFSVF9PRkZTRVQ7CisJICAgICBpICs9IEVSUk9SX0VMRU1fU0laRSkgeworCQlkZXNjID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkpOworCQl0aW1lID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyAxICogc2l6ZW9mKHUzMikpOworCQlibGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDIgKiBzaXplb2YodTMyKSk7CisJCWJsaW5rMiA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgMyAqIHNpemVvZih1MzIpKTsKKwkJaWxpbmsxID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyA0ICogc2l6ZW9mKHUzMikpOworCQlpbGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDUgKiBzaXplb2YodTMyKSk7CisJCWRhdGExID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyA2ICogc2l6ZW9mKHUzMikpOworCisJCUlMX0VSUigiJS0xM3MgKDB4JVgpICUwMTB1IDB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAldVxuXG4iLAorCQkgICAgICAgaWwzOTQ1X2Rlc2NfbG9va3VwKGRlc2MpLCBkZXNjLCB0aW1lLCBibGluazEsIGJsaW5rMiwKKwkJICAgICAgIGlsaW5rMSwgaWxpbmsyLCBkYXRhMSk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2lycV90YXNrbGV0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgaW50YSwgaGFuZGxlZCA9IDA7CisJdTMyIGludGFfZmg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1MzIgaW50YV9tYXNrOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCisJICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCisJICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCisJaW50YSA9IF9pbF9yZChpbCwgQ1NSX0lOVCk7CisJX2lsX3dyKGlsLCBDU1JfSU5ULCBpbnRhKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIGZsb3ctaGFuZGxlciAoRE1BKSBpbnRlcnJ1cHRzLgorCSAqIEFueSBuZXcgaW50ZXJydXB0cyB0aGF0IGhhcHBlbiBhZnRlciB0aGlzLCBlaXRoZXIgd2hpbGUgd2UncmUKKwkgKiBpbiB0aGlzIHRhc2tsZXQsIG9yIGxhdGVyLCB3aWxsIHNob3cgdXAgaW4gbmV4dCBJU1IvdGFza2xldC4gKi8KKwlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisJX2lsX3dyKGlsLCBDU1JfRkhfSU5UX1NUQVRVUywgaW50YV9maCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIElMX0RMX0lTUikgeworCQkvKiBqdXN0IGZvciBkZWJ1ZyAqLworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCURfSVNSKCJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwgaW50YSwKKwkJICAgICAgaW50YV9tYXNrLCBpbnRhX2ZoKTsKKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKKwkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0CisJICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCisJICogcmVhZGluZyBDU1JfSU5ULiAqLworCWlmIChpbnRhX2ZoICYgQ1NSMzlfRkhfSU5UX1JYX01BU0spCisJCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7CisJaWYgKGludGFfZmggJiBDU1IzOV9GSF9JTlRfVFhfTUFTSykKKwkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKworCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7CisJCUlMX0VSUigiSGFyZHdhcmUgZXJyb3IgZGV0ZWN0ZWQuICBSZXN0YXJ0aW5nLlxuIik7CisKKwkJLyogVGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisKKwkJaWwtPmlzcl9zdGF0cy5odysrOworCQlpbF9pcnFfaGFuZGxlX2Vycm9yKGlsKTsKKworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0hXX0VSUjsKKworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgKElMX0RMX0lTUikpIHsKKwkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgeworCQkJRF9JU1IoIlNjaGVkdWxlciBmaW5pc2hlZCB0byB0cmFuc21pdCAiCisJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOworCQkJaWwtPmlzcl9zdGF0cy5zY2grKzsKKwkJfQorCisJCS8qIEFsaXZlIG5vdGlmaWNhdGlvbiB2aWEgUnggaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlYWwgd29yayAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0FMSVZFKSB7CisJCQlEX0lTUigiQWxpdmUgaW50ZXJydXB0XG4iKTsKKwkJCWlsLT5pc3Jfc3RhdHMuYWxpdmUrKzsKKwkJfQorCX0KKyNlbmRpZgorCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCisJaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKKworCS8qIEVycm9yIGRldGVjdGVkIGJ5IHVDb2RlICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TV19FUlIpIHsKKwkJSUxfRVJSKCJNaWNyb2NvZGUgU1cgZXJyb3IgZGV0ZWN0ZWQuICIgIlJlc3RhcnRpbmcgMHglWC5cbiIsCisJCSAgICAgICBpbnRhKTsKKwkJaWwtPmlzcl9zdGF0cy5zdysrOworCQlpbF9pcnFfaGFuZGxlX2Vycm9yKGlsKTsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9TV19FUlI7CisJfQorCisJLyogdUNvZGUgd2FrZXMgdXAgYWZ0ZXIgcG93ZXItZG93biBzbGVlcCAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfV0FLRVVQKSB7CisJCURfSVNSKCJXYWtldXAgaW50ZXJydXB0XG4iKTsKKwkJaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT5yeHEpOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbMF0pOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbMV0pOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbMl0pOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbM10pOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbNF0pOworCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgJmlsLT50eHFbNV0pOworCisJCWlsLT5pc3Jfc3RhdHMud2FrZXVwKys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOworCX0KKworCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAorCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKKwkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLworCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7CisJCWlsMzk0NV9yeF9oYW5kbGUoaWwpOworCQlpbC0+aXNyX3N0YXRzLnJ4Kys7CisJCWhhbmRsZWQgfD0gKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpOworCX0KKworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfRkhfVFgpIHsKKwkJRF9JU1IoIlR4IGludGVycnVwdFxuIik7CisJCWlsLT5pc3Jfc3RhdHMudHgrKzsKKworCQlfaWxfd3IoaWwsIENTUl9GSF9JTlRfU1RBVFVTLCAoMSA8PCA2KSk7CisJCWlsX3dyKGlsLCBGSDM5X1RDU1JfQ1JFRElUKEZIMzlfU1JWQ19DSE5MKSwgMHgwKTsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKwl9CisKKwlpZiAoaW50YSAmIH5oYW5kbGVkKSB7CisJCUlMX0VSUigiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsIGludGEgJiB+aGFuZGxlZCk7CisJCWlsLT5pc3Jfc3RhdHMudW5oYW5kbGVkKys7CisJfQorCisJaWYgKGludGEgJiB+aWwtPmludGFfbWFzaykgeworCQlJTF9XQVJOKCJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKKwkJCWludGEgJiB+aWwtPmludGFfbWFzayk7CisJCUlMX1dBUk4oIiAgIHdpdGggaW50YV9maCA9IDB4JTA4eFxuIiwgaW50YV9maCk7CisJfQorCisJLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCisJaWYgKHRlc3RfYml0KFNfSU5UX0VOQUJMRUQsICZpbC0+c3RhdHVzKSkKKwkJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGlsX2dldF9kZWJ1Z19sZXZlbChpbCkgJiAoSUxfRExfSVNSKSkgeworCQlpbnRhID0gX2lsX3JkKGlsLCBDU1JfSU5UKTsKKwkJaW50YV9tYXNrID0gX2lsX3JkKGlsLCBDU1JfSU5UX01BU0spOworCQlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisJCURfSVNSKCJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKKwkJICAgICAgImZsYWdzIDB4JTA4bHhcbiIsIGludGEsIGludGFfbWFzaywgaW50YV9maCwgZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitpbDM5NDVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgICB1OCBpc19hY3RpdmUsIHU4IG5fcHJvYmVzLAorCQkJICAgICBzdHJ1Y3QgaWwzOTQ1X3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7CisJdTE2IGFjdGl2ZV9kd2VsbCA9IDA7CisJaW50IGFkZGVkLCBpOworCisJc2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgYmFuZCk7CisJaWYgKCFzYmFuZCkKKwkJcmV0dXJuIDA7CisKKwlhY3RpdmVfZHdlbGwgPSBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoaWwsIGJhbmQsIG5fcHJvYmVzKTsKKwlwYXNzaXZlX2R3ZWxsID0gaWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShpbCwgYmFuZCwgdmlmKTsKKworCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKKwkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7CisKKwlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbiA9IGlsLT5zY2FuX3JlcXVlc3QtPmNoYW5uZWxzW2ldOworCisJCWlmIChjaGFuLT5iYW5kICE9IGJhbmQpCisJCQljb250aW51ZTsKKworCQlzY2FuX2NoLT5jaGFubmVsID0gY2hhbi0+aHdfdmFsdWU7CisKKwkJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGJhbmQsIHNjYW5fY2gtPmNoYW5uZWwpOworCQlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKKwkJCURfU0NBTigiQ2hhbm5lbCAlZCBpcyBJTlZBTElEIGZvciB0aGlzIGJhbmQuXG4iLAorCQkJICAgICAgIHNjYW5fY2gtPmNoYW5uZWwpOworCQkJY29udGludWU7CisJCX0KKworCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihhY3RpdmVfZHdlbGwpOworCQlzY2FuX2NoLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCk7CisJCS8qIElmIHBhc3NpdmUgLCBzZXQgdXAgZm9yIGF1dG8tc3dpdGNoCisJCSAqICBhbmQgdXNlIGxvbmcgYWN0aXZlX2R3ZWxsIHRpbWUuCisJCSAqLworCQlpZiAoIWlzX2FjdGl2ZSB8fCBpbF9pc19jaGFubmVsX3Bhc3NpdmUoY2hfaW5mbykgfHwKKwkJICAgIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikpIHsKKwkJCXNjYW5fY2gtPnR5cGUgPSAwOwkvKiBwYXNzaXZlICovCisJCQlpZiAoSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpID09IDEpCisJCQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0KKwkJCQkgICAgY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCAtIDEpOworCQl9IGVsc2UgeworCQkJc2Nhbl9jaC0+dHlwZSA9IDE7CS8qIGFjdGl2ZSAqLworCQl9CisKKwkJLyogU2V0IGRpcmVjdCBwcm9iZSBiaXRzLiBUaGVzZSBtYXkgYmUgdXNlZCBib3RoIGZvciBhY3RpdmUKKwkJICogc2NhbiBjaGFubmVscyAocHJvYmVzIGdldHMgc2VudCByaWdodCBhd2F5KSwKKwkJICogb3IgZm9yIHBhc3NpdmUgY2hhbm5lbHMgKHByb2JlcyBnZXQgc2Ugc2VudCBvbmx5IGFmdGVyCisJCSAqIGhlYXJpbmcgY2xlYXIgUnggcGFja2V0KS4qLworCQlpZiAoSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpID49IDIpIHsKKwkJCWlmIChuX3Byb2JlcykKKwkJCQlzY2FuX2NoLT50eXBlIHw9IElMMzlfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHVDb2RlIHYxIGRvZXMgbm90IGFsbG93IHNldHRpbmcgZGlyZWN0IHByb2JlIGJpdHMgb24KKwkJCSAqIHBhc3NpdmUgY2hhbm5lbC4gKi8KKwkJCWlmICgoc2Nhbl9jaC0+dHlwZSAmIDEpICYmIG5fcHJvYmVzKQorCQkJCXNjYW5fY2gtPnR5cGUgfD0gSUwzOV9TQ0FOX1BST0JFX01BU0sobl9wcm9iZXMpOworCQl9CisKKwkJLyogU2V0IHR4cG93ZXIgbGV2ZWxzIHRvIGRlZmF1bHRzICovCisJCXNjYW5fY2gtPnRwYy5kc3BfYXR0ZW4gPSAxMTA7CisJCS8qIHNjYW5fcHdyX2luZm8tPnRwYy5kc3BfYXR0ZW47ICovCisKKwkJLypzY2FuX3B3cl9pbmZvLT50cGMudHhfZ2FpbjsgKi8KKwkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCXNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDMgPDwgMykpIHwgMzsKKwkJZWxzZSB7CisJCQlzY2FuX2NoLT50cGMudHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICg1IDw8IDMpKTsKKwkJCS8qIE5PVEU6IGlmIHdlIHdlcmUgZG9pbmcgNk1iIE9GRE0gZm9yIHNjYW5zIHdlJ2QgdXNlCisJCQkgKiBwb3dlciBsZXZlbDoKKwkJCSAqIHNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDIgPDwgMykpIHwgMzsKKwkJCSAqLworCQl9CisKKwkJRF9TQ0FOKCJTY2FubmluZyAlZCBbJXMgJWRdXG4iLCBzY2FuX2NoLT5jaGFubmVsLAorCQkgICAgICAgKHNjYW5fY2gtPnR5cGUgJiAxKSA/ICJBQ1RJVkUiIDogIlBBU1NJVkUiLAorCQkgICAgICAgKHNjYW5fY2gtPnR5cGUgJiAxKSA/IGFjdGl2ZV9kd2VsbCA6IHBhc3NpdmVfZHdlbGwpOworCisJCXNjYW5fY2grKzsKKwkJYWRkZWQrKzsKKwl9CisKKwlEX1NDQU4oInRvdGFsIGNoYW5uZWxzIHRvIHNjYW4gJWRcbiIsIGFkZGVkKTsKKwlyZXR1cm4gYWRkZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaW5pdF9od19yYXRlcyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVF9MRUdBQ1k7IGkrKykgeworCQlyYXRlc1tpXS5iaXRyYXRlID0gaWwzOTQ1X3JhdGVzW2ldLmllZWUgKiA1OworCQlyYXRlc1tpXS5od192YWx1ZSA9IGk7CS8qIFJhdGUgc2NhbGluZyB3aWxsIHdvcmsgb24gaWR4ZXMgKi8KKwkJcmF0ZXNbaV0uaHdfdmFsdWVfc2hvcnQgPSBpOworCQlyYXRlc1tpXS5mbGFncyA9IDA7CisJCWlmIChpID4gSUwzOV9MQVNUX09GRE1fUkFURSB8fCBpIDwgSUxfRklSU1RfT0ZETV9SQVRFKSB7CisJCQkvKgorCQkJICogSWYgQ0NLICE9IDFNIHRoZW4gc2V0IHNob3J0IHByZWFtYmxlIHJhdGUgZmxhZy4KKwkJCSAqLworCQkJcmF0ZXNbaV0uZmxhZ3MgfD0KKwkJCSAgICAoaWwzOTQ1X3JhdGVzW2ldLnBsY3AgPT0KKwkJCSAgICAgMTApID8gMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2NvZGUpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YV9iYWNrdXApOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0KTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfaW5pdF9kYXRhKTsKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfYm9vdCk7Cit9CisKKy8qKgorICogaWwzOTQ1X3ZlcmlmeV9pbnN0X2Z1bGwgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAorICogICAgIGxvb2tpbmcgYXQgYWxsIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpbF9wcml2ICppbCwgX19sZTMyICogaW1hZ2UsIHUzMiBsZW4pCit7CisJdTMyIHZhbDsKKwl1MzIgc2F2ZV9sZW4gPSBsZW47CisJaW50IHJjID0gMDsKKwl1MzIgZXJyY250OworCisJRF9JTkZPKCJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisKKwlpbF93cihpbCwgSEJVU19UQVJHX01FTV9SQUREUiwgSUwzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisKKwllcnJjbnQgPSAwOworCWZvciAoOyBsZW4gPiAwOyBsZW4gLT0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZworCQkgKiBpZiBJTF9ETF9JTyBpcyBzZXQgKi8KKwkJdmFsID0gX2lsX3JkKGlsLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKwkJCUlMX0VSUigidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgorCQkJICAgICAgICJvZmZzZXQgMHgleCwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCisJCQkgICAgICAgc2F2ZV9sZW4gLSBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQlyYyA9IC1FSU87CisJCQllcnJjbnQrKzsKKwkJCWlmIChlcnJjbnQgPj0gMjApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycmNudCkKKwkJRF9JTkZPKCJ1Y29kZSBpbWFnZSBpbiBJTlNUUlVDVElPTiBtZW1vcnkgaXMgZ29vZFxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaWwzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZSAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCisgKiAgIHVzaW5nIHNhbXBsZSBkYXRhIDEwMCBieXRlcyBhcGFydC4gIElmIHRoZXNlIHNhbXBsZSBwb2ludHMgYXJlIGdvb2QsCisgKiAgIGl0J3MgYSBwcmV0dHkgZ29vZCBiZXQgdGhhdCBldmVyeXRoaW5nIGJldHdlZW4gdGhlbSBpcyBnb29kLCB0b28uCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGlsX3ByaXYgKmlsLCBfX2xlMzIgKiBpbWFnZSwgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCWludCByYyA9IDA7CisJdTMyIGVycmNudCA9IDA7CisJdTMyIGk7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAgLyBzaXplb2YodTMyKSkgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElMX0RMX0lPIGlzIHNldCAqLworCQlpbF93cihpbCwgSEJVU19UQVJHX01FTV9SQUREUiwgaSArIElMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCQl2YWwgPSBfaWxfcmQoaWwsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworI2lmIDAJCQkJLyogRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2VlIGRldGFpbHMgKi8KKwkJCUlMX0VSUigidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgorCQkJICAgICAgICJvZmZzZXQgMHgleCwgaXMgMHgleCwgcy9iIDB4JXhcbiIsIGksIHZhbCwKKwkJCSAgICAgICAqaW1hZ2UpOworI2VuZGlmCisJCQlyYyA9IC1FSU87CisJCQllcnJjbnQrKzsKKwkJCWlmIChlcnJjbnQgPj0gMykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpbDM5NDVfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCisgKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cworICovCitzdGF0aWMgaW50CitpbDM5NDVfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMzIgKmltYWdlOworCXUzMiBsZW47CisJaW50IHJjID0gMDsKKworCS8qIFRyeSBib290c3RyYXAgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlyYyA9IGlsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UoaWwsIGltYWdlLCBsZW4pOworCWlmIChyYyA9PSAwKSB7CisJCURfSU5GTygiQm9vdHN0cmFwIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IGluaXRpYWxpemUgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2luaXQudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9pbml0LmxlbjsKKwlyYyA9IGlsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UoaWwsIGltYWdlLCBsZW4pOworCWlmIChyYyA9PSAwKSB7CisJCURfSU5GTygiSW5pdGlhbGl6ZSB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSBydW50aW1lL3Byb3RvY29sICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9jb2RlLnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfY29kZS5sZW47CisJcmMgPSBpbDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCQlEX0lORk8oIlJ1bnRpbWUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJTF9FUlIoIk5PIFZBTElEIFVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0hIVxuIik7CisKKwkvKiBTaW5jZSBub3RoaW5nIHNlZW1zIHRvIG1hdGNoLCBzaG93IGZpcnN0IHNldmVyYWwgZGF0YSBlbnRyaWVzIGluCisJICogaW5zdHJ1Y3Rpb24gU1JBTSwgc28gbWF5YmUgdmlzdWFsIGluc3BlY3Rpb24gd2lsbCBnaXZlIGEgY2x1ZS4KKwkgKiBTZWxlY3Rpb24gb2YgYm9vdHN0cmFwIGltYWdlICh2cy4gb3RoZXIgaW1hZ2VzKSBpcyBhcmJpdHJhcnkuICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJcmMgPSBpbDM5NDVfdmVyaWZ5X2luc3RfZnVsbChpbCwgaW1hZ2UsIGxlbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfbmljX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCAwKTsKK30KKworI2RlZmluZSBJTDM5NDVfVUNPREVfR0VUKGl0ZW0pCQkJCQkJXAorc3RhdGljIHUzMiBpbDM5NDVfdWNvZGVfZ2V0XyMjaXRlbShjb25zdCBzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyICp1Y29kZSlcCit7CQkJCQkJCQkJXAorCXJldHVybiBsZTMyX3RvX2NwdSh1Y29kZS0+djEuaXRlbSk7CQkJCVwKK30KKworc3RhdGljIHUzMgoraWwzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZSh1MzIgYXBpX3ZlcikKK3sKKwlyZXR1cm4gMjQ7Cit9CisKK3N0YXRpYyB1OCAqCitpbDM5NDVfdWNvZGVfZ2V0X2RhdGEoY29uc3Qgc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGUpCit7CisJcmV0dXJuICh1OCAqKSB1Y29kZS0+djEuZGF0YTsKK30KKworSUwzOTQ1X1VDT0RFX0dFVChpbnN0X3NpemUpOworSUwzOTQ1X1VDT0RFX0dFVChkYXRhX3NpemUpOworSUwzOTQ1X1VDT0RFX0dFVChpbml0X3NpemUpOworSUwzOTQ1X1VDT0RFX0dFVChpbml0X2RhdGFfc2l6ZSk7CitJTDM5NDVfVUNPREVfR0VUKGJvb3Rfc2l6ZSk7CisKKy8qKgorICogaWwzOTQ1X3JlYWRfdWNvZGUgLSBSZWFkIHVDb2RlIGltYWdlcyBmcm9tIGRpc2sgZmlsZS4KKyAqCisgKiBDb3B5IGludG8gYnVmZmVycyBmb3IgY2FyZCB0byBmZXRjaCB2aWEgYnVzLW1hc3RlcmluZworICovCitzdGF0aWMgaW50CitpbDM5NDVfcmVhZF91Y29kZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJY29uc3Qgc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGU7CisJaW50IHJldCA9IC1FSU5WQUwsIGlkeDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdzsKKwkvKiBmaXJtd2FyZSBmaWxlIG5hbWUgY29udGFpbnMgdUNvZGUvZHJpdmVyIGNvbXBhdGliaWxpdHkgdmVyc2lvbiAqLworCWNvbnN0IGNoYXIgKm5hbWVfcHJlID0gaWwtPmNmZy0+ZndfbmFtZV9wcmU7CisJY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gaWwtPmNmZy0+dWNvZGVfYXBpX21pbjsKKwljaGFyIGJ1ZlsyNV07CisJdTggKnNyYzsKKwlzaXplX3QgbGVuOworCXUzMiBhcGlfdmVyLCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOworCisJLyogQXNrIGtlcm5lbCBmaXJtd2FyZV9jbGFzcyBtb2R1bGUgdG8gZ2V0IHRoZSBib290IGZpcm13YXJlIG9mZiBkaXNrLgorCSAqIHJlcXVlc3RfZmlybXdhcmUoKSBpcyBzeW5jaHJvbm91cywgZmlsZSBpcyBpbiBtZW1vcnkgb24gcmV0dXJuLiAqLworCWZvciAoaWR4ID0gYXBpX21heDsgaWR4ID49IGFwaV9taW47IGlkeC0tKSB7CisJCXNwcmludGYoYnVmLCAiJXMldSVzIiwgbmFtZV9wcmUsIGlkeCwgIi51Y29kZSIpOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZ1Y29kZV9yYXcsIGJ1ZiwgJmlsLT5wY2lfZGV2LT5kZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJSUxfRVJSKCIlcyBmaXJtd2FyZSBmaWxlIHJlcSBmYWlsZWQ6ICVkXG4iLCBidWYsIHJldCk7CisJCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCWlmIChpZHggPCBhcGlfbWF4KQorCQkJCUlMX0VSUigiTG9hZGVkIGZpcm13YXJlICVzLCAiCisJCQkJICAgICAgICJ3aGljaCBpcyBkZXByZWNhdGVkLiAiCisJCQkJICAgICAgICIgUGxlYXNlIHVzZSBBUEkgdiV1IGluc3RlYWQuXG4iLCBidWYsCisJCQkJICAgICAgIGFwaV9tYXgpOworCQkJRF9JTkZPKCJHb3QgZmlybXdhcmUgJyVzJyBmaWxlICIKKwkJCSAgICAgICAiKCV6ZCBieXRlcykgZnJvbSBkaXNrXG4iLCBidWYsIHVjb2RlX3Jhdy0+c2l6ZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgZ290IGF0IGxlYXN0IG91ciBoZWFkZXIhICovCisJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IGlsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUoMSkpIHsKKwkJSUxfRVJSKCJGaWxlIHNpemUgd2F5IHRvbyBzbWFsbCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKworCS8qIERhdGEgZnJvbSB1Y29kZSBmaWxlOiAgaGVhZGVyIGZvbGxvd2VkIGJ5IHVDb2RlIGltYWdlcyAqLworCXVjb2RlID0gKHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7CisKKwlpbC0+dWNvZGVfdmVyID0gbGUzMl90b19jcHUodWNvZGUtPnZlcik7CisJYXBpX3ZlciA9IElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKTsKKwlpbnN0X3NpemUgPSBpbDM5NDVfdWNvZGVfZ2V0X2luc3Rfc2l6ZSh1Y29kZSk7CisJZGF0YV9zaXplID0gaWwzOTQ1X3Vjb2RlX2dldF9kYXRhX3NpemUodWNvZGUpOworCWluaXRfc2l6ZSA9IGlsMzk0NV91Y29kZV9nZXRfaW5pdF9zaXplKHVjb2RlKTsKKwlpbml0X2RhdGFfc2l6ZSA9IGlsMzk0NV91Y29kZV9nZXRfaW5pdF9kYXRhX3NpemUodWNvZGUpOworCWJvb3Rfc2l6ZSA9IGlsMzk0NV91Y29kZV9nZXRfYm9vdF9zaXplKHVjb2RlKTsKKwlzcmMgPSBpbDM5NDVfdWNvZGVfZ2V0X2RhdGEodWNvZGUpOworCisJLyogYXBpX3ZlciBzaG91bGQgbWF0Y2ggdGhlIGFwaSB2ZXJzaW9uIGZvcm1pbmcgcGFydCBvZiB0aGUKKwkgKiBmaXJtd2FyZSBmaWxlbmFtZSAuLi4gYnV0IHdlIGRvbid0IGNoZWNrIGZvciB0aGF0IGFuZCBvbmx5IHJlbHkKKwkgKiBvbiB0aGUgQVBJIHZlcnNpb24gcmVhZCBmcm9tIGZpcm13YXJlIGhlYWRlciBmcm9tIGhlcmUgb24gZm9yd2FyZCAqLworCisJaWYgKGFwaV92ZXIgPCBhcGlfbWluIHx8IGFwaV92ZXIgPiBhcGlfbWF4KSB7CisJCUlMX0VSUigiRHJpdmVyIHVuYWJsZSB0byBzdXBwb3J0IHlvdXIgZmlybXdhcmUgQVBJLiAiCisJCSAgICAgICAiRHJpdmVyIHN1cHBvcnRzIHYldSwgZmlybXdhcmUgaXMgdiV1LlxuIiwgYXBpX21heCwKKwkJICAgICAgIGFwaV92ZXIpOworCQlpbC0+dWNvZGVfdmVyID0gMDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisJaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKKwkJSUxfRVJSKCJGaXJtd2FyZSBoYXMgb2xkIEFQSSB2ZXJzaW9uLiBFeHBlY3RlZCAldSwgIgorCQkgICAgICAgImdvdCAldS4gTmV3IGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCAiCisJCSAgICAgICAiZnJvbSBodHRwOi8vd3d3LmludGVsbGludXh3aXJlbGVzcy5vcmcuXG4iLCBhcGlfbWF4LAorCQkgICAgICAgYXBpX3Zlcik7CisKKwlJTF9JTkZPKCJsb2FkZWQgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldS4ldVxuIiwKKwkJSUxfVUNPREVfTUFKT1IoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX01JTk9SKGlsLT51Y29kZV92ZXIpLAorCQlJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX1NFUklBTChpbC0+dWNvZGVfdmVyKSk7CisKKwlzbnByaW50ZihpbC0+aHctPndpcGh5LT5md192ZXJzaW9uLCBzaXplb2YoaWwtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiksCisJCSAiJXUuJXUuJXUuJXUiLCBJTF9VQ09ERV9NQUpPUihpbC0+dWNvZGVfdmVyKSwKKwkJIElMX1VDT0RFX01JTk9SKGlsLT51Y29kZV92ZXIpLCBJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlciksCisJCSBJTF9VQ09ERV9TRVJJQUwoaWwtPnVjb2RlX3ZlcikpOworCisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgdWNvZGUgdmVyc2lvbiByYXcgPSAweCV4XG4iLCBpbC0+dWNvZGVfdmVyKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGluc3Qgc2l6ZSA9ICV1XG4iLCBpbnN0X3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgZGF0YSBzaXplID0gJXVcbiIsIGRhdGFfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAldVxuIiwgaW5pdF9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBpbml0IGRhdGEgc2l6ZSA9ICV1XG4iLCBpbml0X2RhdGFfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgYm9vdCBpbnN0IHNpemUgPSAldVxuIiwgYm9vdF9zaXplKTsKKworCS8qIFZlcmlmeSBzaXplIG9mIGZpbGUgdnMuIGltYWdlIHNpemUgaW5mbyBpbiBmaWxlJ3MgaGVhZGVyICovCisJaWYgKHVjb2RlX3Jhdy0+c2l6ZSAhPQorCSAgICBpbDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKGFwaV92ZXIpICsgaW5zdF9zaXplICsgZGF0YV9zaXplICsKKwkgICAgaW5pdF9zaXplICsgaW5pdF9kYXRhX3NpemUgKyBib290X3NpemUpIHsKKworCQlEX0lORk8oInVDb2RlIGZpbGUgc2l6ZSAlemQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZVxuIiwKKwkJICAgICAgIHVjb2RlX3Jhdy0+c2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJLyogVmVyaWZ5IHRoYXQgdUNvZGUgaW1hZ2VzIHdpbGwgZml0IGluIGNhcmQncyBTUkFNICovCisJaWYgKGluc3Rfc2l6ZSA+IElMMzlfTUFYX0lOU1RfU0laRSkgeworCQlEX0lORk8oInVDb2RlIGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLCBpbnN0X3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKworCWlmIChkYXRhX3NpemUgPiBJTDM5X01BWF9EQVRBX1NJWkUpIHsKKwkJRF9JTkZPKCJ1Q29kZSBkYXRhIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLCBkYXRhX3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKwlpZiAoaW5pdF9zaXplID4gSUwzOV9NQVhfSU5TVF9TSVpFKSB7CisJCURfSU5GTygidUNvZGUgaW5pdCBpbnN0ciBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIGluaXRfc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCWlmIChpbml0X2RhdGFfc2l6ZSA+IElMMzlfTUFYX0RBVEFfU0laRSkgeworCQlEX0lORk8oInVDb2RlIGluaXQgZGF0YSBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIGluaXRfZGF0YV9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisJaWYgKGJvb3Rfc2l6ZSA+IElMMzlfTUFYX0JTTV9TSVpFKSB7CisJCURfSU5GTygidUNvZGUgYm9vdCBpbnN0ciBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIGJvb3Rfc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KKworCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgorCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCisJICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCisJaWwtPnVjb2RlX2NvZGUubGVuID0gaW5zdF9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisKKwlpbC0+dWNvZGVfZGF0YS5sZW4gPSBkYXRhX3NpemU7CisJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhKTsKKworCWlsLT51Y29kZV9kYXRhX2JhY2t1cC5sZW4gPSBkYXRhX3NpemU7CisJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhX2JhY2t1cCk7CisKKwlpZiAoIWlsLT51Y29kZV9jb2RlLnZfYWRkciB8fCAhaWwtPnVjb2RlX2RhdGEudl9hZGRyIHx8CisJICAgICFpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQorCQlnb3RvIGVycl9wY2lfYWxsb2M7CisKKwkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KKwlpZiAoaW5pdF9zaXplICYmIGluaXRfZGF0YV9zaXplKSB7CisJCWlsLT51Y29kZV9pbml0LmxlbiA9IGluaXRfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0KTsKKworCQlpbC0+dWNvZGVfaW5pdF9kYXRhLmxlbiA9IGluaXRfZGF0YV9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXRfZGF0YSk7CisKKwkJaWYgKCFpbC0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIWlsLT51Y29kZV9pbml0X2RhdGEudl9hZGRyKQorCQkJZ290byBlcnJfcGNpX2FsbG9jOworCX0KKworCS8qIEJvb3RzdHJhcCAoaW5zdHJ1Y3Rpb25zIG9ubHksIG5vIGRhdGEpICovCisJaWYgKGJvb3Rfc2l6ZSkgeworCQlpbC0+dWNvZGVfYm9vdC5sZW4gPSBib290X3NpemU7CisJCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfYm9vdCk7CisKKwkJaWYgKCFpbC0+dWNvZGVfYm9vdC52X2FkZHIpCisJCQlnb3RvIGVycl9wY2lfYWxsb2M7CisJfQorCisJLyogQ29weSBpbWFnZXMgaW50byBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciByZWFkcyAuLi4gKi8KKworCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIChmaXJzdCBibG9jayBvZiBkYXRhIGluIGZpbGUpICovCisJbGVuID0gaW5zdF9zaXplOworCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSB1Q29kZSBpbnN0ciBsZW4gJXpkXG4iLCBsZW4pOworCW1lbWNweShpbC0+dWNvZGVfY29kZS52X2FkZHIsIHNyYywgbGVuKTsKKwlzcmMgKz0gbGVuOworCisJRF9JTkZPKCJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKKwkgICAgICAgaWwtPnVjb2RlX2NvZGUudl9hZGRyLCAodTMyKSBpbC0+dWNvZGVfY29kZS5wX2FkZHIpOworCisJLyogUnVudGltZSBkYXRhICgybmQgYmxvY2spCisJICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpbDM5NDVfdXAoKSAgKi8KKwlsZW4gPSBkYXRhX3NpemU7CisJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICV6ZFxuIiwgbGVuKTsKKwltZW1jcHkoaWwtPnVjb2RlX2RhdGEudl9hZGRyLCBzcmMsIGxlbik7CisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHNyYywgbGVuKTsKKwlzcmMgKz0gbGVuOworCisJLyogSW5pdGlhbGl6YXRpb24gaW5zdHJ1Y3Rpb25zICgzcmQgYmxvY2spICovCisJaWYgKGluaXRfc2l6ZSkgeworCQlsZW4gPSBpbml0X3NpemU7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGluc3RyIGxlbiAlemRcbiIsIGxlbik7CisJCW1lbWNweShpbC0+dWNvZGVfaW5pdC52X2FkZHIsIHNyYywgbGVuKTsKKwkJc3JjICs9IGxlbjsKKwl9CisKKwkvKiBJbml0aWFsaXphdGlvbiBkYXRhICg0dGggYmxvY2spICovCisJaWYgKGluaXRfZGF0YV9zaXplKSB7CisJCWxlbiA9IGluaXRfZGF0YV9zaXplOworCQlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBkYXRhIGxlbiAlemRcbiIsIGxlbik7CisJCW1lbWNweShpbC0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkciwgc3JjLCBsZW4pOworCQlzcmMgKz0gbGVuOworCX0KKworCS8qIEJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKDV0aCBibG9jaykgKi8KKwlsZW4gPSBib290X3NpemU7CisJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGJvb3QgaW5zdHIgbGVuICV6ZFxuIiwgbGVuKTsKKwltZW1jcHkoaWwtPnVjb2RlX2Jvb3Qudl9hZGRyLCBzcmMsIGxlbik7CisKKwkvKiBXZSBoYXZlIG91ciBjb3BpZXMgbm93LCBhbGxvdyBPUyByZWxlYXNlIGl0cyBjb3BpZXMgKi8KKwlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7CisJcmV0dXJuIDA7CisKK2Vycl9wY2lfYWxsb2M6CisJSUxfRVJSKCJmYWlsZWQgdG8gYWxsb2NhdGUgcGNpIG1lbW9yeVxuIik7CisJcmV0ID0gLUVOT01FTTsKKwlpbDM5NDVfZGVhbGxvY191Y29kZV9wY2koaWwpOworCitlcnJfcmVsZWFzZToKKwlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWwzOTQ1X3NldF91Y29kZV9wdHJzIC0gU2V0IHVDb2RlIGFkZHJlc3MgbG9jYXRpb24KKyAqCisgKiBUZWxsIGluaXRpYWxpemF0aW9uIHVDb2RlIHdoZXJlIHRvIGZpbmQgcnVudGltZSB1Q29kZS4KKyAqCisgKiBCU00gcmVnaXN0ZXJzIGluaXRpYWxseSBjb250YWluIHBvaW50ZXJzIHRvIGluaXRpYWxpemF0aW9uIHVDb2RlLgorICogV2UgbmVlZCB0byByZXBsYWNlIHRoZW0gdG8gbG9hZCBydW50aW1lIHVDb2RlIGluc3QgYW5kIGRhdGEsCisgKiBhbmQgdG8gc2F2ZSBydW50aW1lIGRhdGEgd2hlbiBwb3dlcmluZyBkb3duLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfc2V0X3Vjb2RlX3B0cnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWRtYV9hZGRyX3QgcGluc3Q7CisJZG1hX2FkZHJfdCBwZGF0YTsKKworCS8qIGJpdHMgMzE6MCBmb3IgMzk0NSAqLworCXBpbnN0ID0gaWwtPnVjb2RlX2NvZGUucF9hZGRyOworCXBkYXRhID0gaWwtPnVjb2RlX2RhdGFfYmFja3VwLnBfYWRkcjsKKworCS8qIFRlbGwgYm9vdHN0cmFwIHVDb2RlIHdoZXJlIHRvIGZpbmQgaW1hZ2UgdG8gbG9hZCAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfQllURUNPVU5UX1JFRywgaWwtPnVjb2RlX2RhdGEubGVuKTsKKworCS8qIEluc3QgYnl0ZSBjb3VudCBtdXN0IGJlIGxhc3QgdG8gc2V0IHVwLCBiaXQgMzEgc2lnbmFscyB1Q29kZQorCSAqICAgdGhhdCBhbGwgbmV3IHB0ci9zaXplIGluZm8gaXMgaW4gcGxhY2UgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsCisJCSAgIGlsLT51Y29kZV9jb2RlLmxlbiB8IEJTTV9EUkFNX0lOU1RfTE9BRCk7CisKKwlEX0lORk8oIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWwzOTQ1X2luaXRfYWxpdmVfc3RhcnQgLSBDYWxsZWQgYWZ0ZXIgTl9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQKKyAqCisgKiBDYWxsZWQgYWZ0ZXIgTl9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSAiaW5pdGlhbGl6ZSIgdUNvZGUuCisgKgorICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogQ2hlY2sgYWxpdmUgcmVzcG9uc2UgZm9yICJ2YWxpZCIgc2lnbiBmcm9tIHVDb2RlICovCisJaWYgKGlsLT5jYXJkX2FsaXZlX2luaXQuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKKwkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAorCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkluaXRpYWxpemUgQWxpdmUgZmFpbGVkLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KKwkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQorCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KKwlpZiAoaWwzOTQ1X3ZlcmlmeV91Y29kZShpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJCYWQgXCJpbml0aWFsaXplXCIgdUNvZGUgbG9hZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAorCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCisJICogbm90aWZpY2F0aW9uLiAqLworCURfSU5GTygiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwlpZiAoaWwzOTQ1X3NldF91Y29kZV9wdHJzKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd29uJ3QgaGFwcGVuOworCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQ291bGRuJ3Qgc2V0IHVwIHVDb2RlIHBvaW50ZXJzLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJcmV0dXJuOworCityZXN0YXJ0OgorCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKK30KKworLyoqCisgKiBpbDM5NDVfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgTl9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyb20gcHJvdG9jb2wvcnVudGltZSB1Q29kZSAoaW5pdGlhbGl6YXRpb24gdUNvZGUncworICogICAgICAgICAgICAgICAgICAgQWxpdmUgZ2V0cyBoYW5kbGVkIGJ5IGlsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KCkpLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2FsaXZlX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdGhlcm1hbF9zcGluID0gMDsKKwl1MzIgcmZraWxsOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJRF9JTkZPKCJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7CisKKwlpZiAoaWwtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKKwkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAorCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkFsaXZlIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB1Q29kZSBoYXMgbG9hZGVkIFJ1bnRpbWUgdUNvZGUgLi4uIHZlcmlmeSBpbnN0IGltYWdlLgorCSAqIFRoaXMgaXMgYSBwYXJhbm9pZCBjaGVjaywgYmVjYXVzZSB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gdGhlCisJICogInJ1bnRpbWUiIGFsaXZlIGlmIGNvZGUgd2VyZW4ndCBwcm9wZXJseSBsb2FkZWQuICAqLworCWlmIChpbDM5NDVfdmVyaWZ5X3Vjb2RlKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd2FzIGJhZDsKKwkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkJhZCBydW50aW1lIHVDb2RlIGxvYWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCXJma2lsbCA9IGlsX3JkX3BycGgoaWwsIEFQTUdfUkZLSUxMX1JFRyk7CisJRF9JTkZPKCJSRktJTEwgc3RhdHVzOiAweCV4XG4iLCByZmtpbGwpOworCisJaWYgKHJma2lsbCAmIDB4MSkgeworCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCS8qIGlmIFJGS0lMTCBpcyBub3Qgb24sIHRoZW4gd2FpdCBmb3IgdGhlcm1hbAorCQkgKiBzZW5zb3IgaW4gYWRhcHRlciB0byBraWNrIGluICovCisJCXdoaWxlIChpbDM5NDVfaHdfZ2V0X3RlbXBlcmF0dXJlKGlsKSA9PSAwKSB7CisJCQl0aGVybWFsX3NwaW4rKzsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAodGhlcm1hbF9zcGluKQorCQkJRF9JTkZPKCJUaGVybWFsIGNhbGlicmF0aW9uIHRvb2sgJWR1c1xuIiwKKwkJCSAgICAgICB0aGVybWFsX3NwaW4gKiAxMCk7CisJfSBlbHNlCisJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBBZnRlciB0aGUgQUxJVkUgcmVzcG9uc2UsIHdlIGNhbiBzZW5kIGNvbW1hbmRzIHRvIDM5NDUgdUNvZGUgKi8KKwlzZXRfYml0KFNfQUxJVkUsICZpbC0+c3RhdHVzKTsKKworCS8qIEVuYWJsZSB3YXRjaGRvZyB0byBtb25pdG9yIHRoZSBkcml2ZXIgdHggcXVldWVzICovCisJaWxfc2V0dXBfd2F0Y2hkb2coaWwpOworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpCisJCXJldHVybjsKKworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhpbC0+aHcpOworCisJaWwtPmFjdGl2ZV9yYXRlID0gUkFURVNfTUFTS18zOTQ1OworCisJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIHRydWUpOworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpKSB7CisJCXN0cnVjdCBpbDM5NDVfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0KKwkJICAgIChzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kICopKCZjdHgtPmFjdGl2ZSk7CisKKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwl9IGVsc2UgeworCQkvKiBJbml0aWFsaXplIG91ciByeF9jb25maWcgZGF0YSAqLworCQlpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKGlsLCBjdHgpOworCX0KKworCS8qIENvbmZpZ3VyZSBCbHVldG9vdGggZGV2aWNlIGNvZXhpc3RlbmNlIHN1cHBvcnQgKi8KKwlpbF9zZW5kX2J0X2NvbmZpZyhpbCk7CisKKwlzZXRfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLworCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCWlsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhpbCk7CisKKwlEX0lORk8oIkFMSVZFIHByb2Nlc3NpbmcgY29tcGxldGUuXG4iKTsKKwl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCXJldHVybjsKKworcmVzdGFydDoKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitzdGF0aWMgdm9pZAorX19pbDM5NDVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXhpdF9wZW5kaW5nOworCisJRF9JTkZPKERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJZXhpdF9wZW5kaW5nID0gdGVzdF9hbmRfc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogU3RvcCBUWCBxdWV1ZXMgd2F0Y2hkb2cuIFdlIG5lZWQgdG8gaGF2ZSBTX0VYSVRfUEVORElORyBiaXQgc2V0CisJICogdG8gcHJldmVudCByZWFybSB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZpbC0+d2F0Y2hkb2cpOworCisJLyogU3RhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIG5vdyBiZSBjbGVhcmVkIGluIGRldmljZSAqLworCWlsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKGlsLCBOVUxMKTsKKwlpbF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKGlsKTsKKwlpbF9jbGVhcl9kcml2ZXJfc3RhdGlvbnMoaWwpOworCisJLyogVW5ibG9jayBhbnkgd2FpdGluZyBjYWxscyAqLworCXdha2VfdXBfYWxsKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCS8qIFdpcGUgb3V0IHRoZSBFWElUX1BFTkRJTkcgc3RhdHVzIGJpdCBpZiB3ZSBhcmUgbm90IGFjdHVhbGx5CisJICogZXhpdGluZyB0aGUgbW9kdWxlICovCisJaWYgKCFleGl0X3BlbmRpbmcpCisJCWNsZWFyX2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciAqLworCV9pbF93cihpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7CisKKwkvKiB0ZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWwzOTQ1X3N5bmNocm9uaXplX2lycShpbCk7CisKKwlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhpbC0+aHcpOworCisJLyogSWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSBjYWxsZWQgaWwzOTQ1X2luaXQoKSB0aGVuCisJICogY2xlYXIgYWxsIGJpdHMgYnV0IHRoZSBSRiBLaWxsIGJpdHMgYW5kIHJldHVybiAqLworCWlmICghaWxfaXNfaW5pdChpbCkpIHsKKwkJaWwtPnN0YXR1cyA9CisJCSAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwKKwkJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19HRU9fQ09ORklHVVJFRCB8CisJCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogLi4ub3RoZXJ3aXNlIGNsZWFyIG91dCBhbGwgdGhlIHN0YXR1cyBiaXRzIGJ1dCB0aGUgUkYgS2lsbAorCSAqIGJpdCBhbmQgY29udGludWUgdGFraW5nIHRoZSBOSUMgZG93bi4gKi8KKwlpbC0+c3RhdHVzICY9CisJICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywKKwkJICAgICAmaWwtPnN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwgdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwKKwkJCQkJCQkgICAgICZpbC0+CisJCQkJCQkJICAgICBzdGF0dXMpIDw8CisJICAgIFNfR0VPX0NPTkZJR1VSRUQgfCB0ZXN0X2JpdChTX0ZXX0VSUk9SLAorCQkJCQkmaWwtPgorCQkJCQlzdGF0dXMpIDw8IFNfRldfRVJST1IgfAorCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCisJaWwzOTQ1X2h3X3R4cV9jdHhfc3RvcChpbCk7CisJaWwzOTQ1X2h3X3J4cV9zdG9wKGlsKTsKKworCS8qIFBvd2VyLWRvd24gZGV2aWNlJ3MgYnVzbWFzdGVyIERNQSBjbG9ja3MgKi8KKwlpbF93cl9wcnBoKGlsLCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOworCXVkZWxheSg1KTsKKworCS8qIFN0b3AgdGhlIGRldmljZSwgYW5kIHB1dCBpdCBpbiBsb3cgcG93ZXIgc3RhdGUgKi8KKwlpbF9hcG1fc3RvcChpbCk7CisKK2V4aXQ6CisJbWVtc2V0KCZpbC0+Y2FyZF9hbGl2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9hbGl2ZV9yZXNwKSk7CisKKwlpZiAoaWwtPmJlYWNvbl9za2IpCisJCWRldl9rZnJlZV9za2IoaWwtPmJlYWNvbl9za2IpOworCWlsLT5iZWFjb25fc2tiID0gTlVMTDsKKworCS8qIGNsZWFyIG91dCBhbnkgZnJlZSBmcmFtZXMgKi8KKwlpbDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMoaWwpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2Rvd24oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJX19pbDM5NDVfZG93bihpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJaWwzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKGlsKTsKK30KKworI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQorCitzdGF0aWMgaW50CitpbDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJc3RhX2lkID0gaWxfcHJlcF9zdGF0aW9uKGlsLCBjdHgsIGlsX2JjYXN0X2FkZHIsIGZhbHNlLCBOVUxMKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBwcmVwYXJlIGJyb2FkY2FzdCBzdGF0aW9uXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9CQ0FTVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfX2lsMzk0NV91cChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjLCBpOworCisJcmMgPSBpbDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihpbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlJTF9XQVJOKCJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIWlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIgfHwgIWlsLT51Y29kZV9kYXRhLnZfYWRkcikgeworCQlJTF9FUlIoInVjb2RlIG5vdCBhdmFpbGFibGUgZm9yIGRldmljZSBicmluZyB1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCisJaWYgKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQorCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJZWxzZSB7CisJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCUlMX1dBUk4oIlJhZGlvIGRpc2FibGVkIGJ5IEhXIFJGIEtpbGwgc3dpdGNoXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKworCXJjID0gaWwzOTQ1X2h3X25pY19pbml0KGlsKTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gaW50IG5pY1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKKworCS8qIGNsZWFyIChhZ2FpbiksIHRoZW4gZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLworCV9pbF93cihpbCwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7CisJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCisJLyogcmVhbGx5IG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisKKwkvKiBDb3B5IG9yaWdpbmFsIHVjb2RlIGRhdGEgaW1hZ2UgZnJvbSBkaXNrIGludG8gYmFja3VwIGNhY2hlLgorCSAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG9uLWJvYXJkIHByb2Nlc3NvcidzCisJICogZGF0YSBTUkFNIGZvciBhIGNsZWFuIHN0YXJ0IHdoZW4gdGhlIHJ1bnRpbWUgcHJvZ3JhbSBmaXJzdCBsb2Fkcy4gKi8KKwltZW1jcHkoaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgaWwtPnVjb2RlX2RhdGEudl9hZGRyLAorCSAgICAgICBpbC0+dWNvZGVfZGF0YS5sZW4pOworCisJLyogV2UgcmV0dXJuIHN1Y2Nlc3Mgd2hlbiB3ZSByZXN1bWUgZnJvbSBzdXNwZW5kIGFuZCByZl9raWxsIGlzIG9uLiAqLworCWlmICh0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXX1JFU1RBUlRTOyBpKyspIHsKKworCQkvKiBsb2FkIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lLAorCQkgKiBsb2FkIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gcHJvY2Vzc29yJ3MgbWVtb3J5LAorCQkgKiBwcmVwYXJlIHRvIGxvYWQgdGhlICJpbml0aWFsaXplIiB1Q29kZSAqLworCQlyYyA9IGlsLT5jZmctPm9wcy0+bGliLT5sb2FkX3Vjb2RlKGlsKTsKKworCQlpZiAocmMpIHsKKwkJCUlMX0VSUigiVW5hYmxlIHRvIHNldCB1cCBib290c3RyYXAgdUNvZGU6ICVkXG4iLCByYyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHN0YXJ0IGNhcmQ7ICJpbml0aWFsaXplIiB3aWxsIGxvYWQgcnVudGltZSB1Y29kZSAqLworCQlpbDM5NDVfbmljX3N0YXJ0KGlsKTsKKworCQlEX0lORk8oRFJWX05BTUUgIiBpcyBjb21pbmcgdXBcbiIpOworCisJCXJldHVybiAwOworCX0KKworCXNldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKwlfX2lsMzk0NV9kb3duKGlsKTsKKwljbGVhcl9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCS8qIHRyaWVkIHRvIHJlc3RhcnQgYW5kIGNvbmZpZyB0aGUgZGV2aWNlIGZvciBhcyBsb25nIGFzIG91cgorCSAqIHBhdGllbmNlIGNvdWxkIHdpdGhzdGFuZCAqLworCUlMX0VSUigiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlIGFmdGVyICVkIGF0dGVtcHRzLlxuIiwgaSk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdvcmtxdWV1ZSBjYWxsYmFja3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBpbml0X2FsaXZlX3N0YXJ0LndvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpbDM5NDVfaW5pdF9hbGl2ZV9zdGFydChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2JnX2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwlpbDM5NDVfYWxpdmVfc3RhcnQoaWwpOworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworLyoKKyAqIDM5NDUgY2Fubm90IGludGVycnVwdCBkcml2ZXIgd2hlbiBoYXJkd2FyZSByZiBraWxsIHN3aXRjaCB0b2dnbGVzOworICogZHJpdmVyIG11c3QgcG9sbCBDU1JfR1BfQ05UUkxfUkVHIHJlZ2lzdGVyIGZvciBjaGFuZ2UuICBUaGlzIHJlZ2lzdGVyCisgKiAqaXMqIHJlYWRhYmxlIGV2ZW4gd2hlbiBkZXZpY2UgaGFzIGJlZW4gU1dfUkVTRVQgaW50byBsb3cgcG93ZXIgbW9kZQorICogKGUuZy4gZHVyaW5nIFJGIEtJTEwpLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3Jma2lsbF9wb2xsKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIF8zOTQ1LnJma2lsbF9wb2xsLndvcmspOworCWJvb2wgb2xkX3Jma2lsbCA9IHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWJvb2wgbmV3X3Jma2lsbCA9CisJICAgICEoX2lsX3JkKGlsLCBDU1JfR1BfQ05UUkwpICYgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpOworCisJaWYgKG5ld19yZmtpbGwgIT0gb2xkX3Jma2lsbCkgeworCQlpZiAobmV3X3Jma2lsbCkKKwkJCXNldF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksIG5ld19yZmtpbGwpOworCisJCURfUkZfS0lMTCgiUkZfS0lMTCBiaXQgdG9nZ2xlZCB0byAlcy5cbiIsCisJCQkgIG5ld19yZmtpbGwgPyAiZGlzYWJsZSByYWRpbyIgOiAiZW5hYmxlIHJhZGlvIik7CisJfQorCisJLyogS2VlcCB0aGlzIHJ1bm5pbmcsIGV2ZW4gaWYgcmFkaW8gbm93IGVuYWJsZWQuICBUaGlzIHdpbGwgYmUKKwkgKiBjYW5jZWxsZWQgaW4gbWFjX3N0YXJ0KCkgaWYgc3lzdGVtIGRlY2lkZXMgdG8gc3RhcnQgYWdhaW4gKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCwKKwkJCSAgIHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoMiAqIEhaKSk7CisKK30KKworaW50CitpbDM5NDVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1NDQU4sCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsMzk0NV9zY2FuX2NtZCksCisJCS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCisJfTsKKwlzdHJ1Y3QgaWwzOTQ1X3NjYW5fY21kICpzY2FuOworCXU4IG5fcHJvYmVzID0gMDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJYm9vbCBpc19hY3RpdmUgPSBmYWxzZTsKKwlpbnQgcmV0OworCXUxNiBsZW47CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+c2Nhbl9jbWQpIHsKKwkJaWwtPnNjYW5fY21kID0KKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2Nhbl9jbWQpICsgSUxfTUFYX1NDQU5fU0laRSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbC0+c2Nhbl9jbWQpIHsKKwkJCURfU0NBTigiRmFpbCB0byBhbGxvY2F0ZSBzY2FuIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlzY2FuID0gaWwtPnNjYW5fY21kOworCW1lbXNldChzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGlsMzk0NV9zY2FuX2NtZCkgKyBJTF9NQVhfU0NBTl9TSVpFKTsKKworCXNjYW4tPnF1aWV0X3BsY3BfdGggPSBJTF9QTENQX1FVSUVUX1RIUkVTSDsKKwlzY2FuLT5xdWlldF90aW1lID0gSUxfQUNUSVZFX1FVSUVUX1RJTUU7CisKKwlpZiAoaWxfaXNfYXNzb2NpYXRlZChpbCkpIHsKKwkJdTE2IGludGVydmFsOworCQl1MzIgZXh0cmE7CisJCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7CisJCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKKworCQlEX0lORk8oIlNjYW5uaW5nIHdoaWxlIGFzc29jaWF0ZWQuLi5cbiIpOworCisJCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OworCisJCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7CisJCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOworCQlpZiAoIWludGVydmFsKQorCQkJaW50ZXJ2YWwgPSBzdXNwZW5kX3RpbWU7CisJCS8qCisJCSAqIHN1c3BlbmQgdGltZSBmb3JtYXQ6CisJCSAqICAwLTE5OiBiZWFjb24gaW50ZXJ2YWwgaW4gdXNlYyAodGltZSBiZWZvcmUgZXhlYy4pCisJCSAqIDIwLTIzOiAwCisJCSAqIDI0LTMxOiBudW1iZXIgb2YgYmVhY29ucyAoc3VzcGVuZCBiZXR3ZWVuIGNoYW5uZWxzKQorCQkgKi8KKworCQlleHRyYSA9IChzdXNwZW5kX3RpbWUgLyBpbnRlcnZhbCkgPDwgMjQ7CisJCXNjYW5fc3VzcGVuZF90aW1lID0KKwkJICAgIDB4RkYwRkZGRkYgJiAoZXh0cmEgfCAoKHN1c3BlbmRfdGltZSAlIGludGVydmFsKSAqIDEwMjQpKTsKKworCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3N1c3BlbmRfdGltZSk7CisJCURfU0NBTigic3VzcGVuZF90aW1lIDB4JVggYmVhY29uIGludGVydmFsICVkXG4iLAorCQkgICAgICAgc2Nhbl9zdXNwZW5kX3RpbWUsIGludGVydmFsKTsKKwl9CisKKwlpZiAoaWwtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgeworCQlpbnQgaSwgcCA9IDA7CisJCURfU0NBTigiS2lja2luZyBvZmYgYWN0aXZlIHNjYW5cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgaWwtPnNjYW5fcmVxdWVzdC0+bl9zc2lkczsgaSsrKSB7CisJCQkvKiBhbHdheXMgZG9lcyB3aWxkY2FyZCBhbnl3YXkgKi8KKwkJCWlmICghaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pCisJCQkJY29udGludWU7CisJCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5pZCA9IFdMQU5fRUlEX1NTSUQ7CisJCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5sZW4gPQorCQkJICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuOworCQkJbWVtY3B5KHNjYW4tPmRpcmVjdF9zY2FuW3BdLnNzaWQsCisJCQkgICAgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwKKwkJCSAgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7CisJCQluX3Byb2JlcysrOworCQkJcCsrOworCQl9CisJCWlzX2FjdGl2ZSA9IHRydWU7CisJfSBlbHNlCisJCURfU0NBTigiS2lja2luZyBvZmYgcGFzc2l2ZSBzY2FuLlxuIik7CisKKwkvKiBXZSBkb24ndCBidWlsZCBhIGRpcmVjdCBzY2FuIHByb2JlIHJlcXVlc3Q7IHRoZSB1Q29kZSB3aWxsIGRvCisJICogdGhhdCBiYXNlZCBvbiB0aGUgZGlyZWN0X21hc2sgYWRkZWQgdG8gZWFjaCBjaGFubmVsIGVudHJ5ICovCisJc2Nhbi0+dHhfY21kLnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwlzY2FuLT50eF9jbWQuc3RhX2lkID0gaWwtPmN0eC5iY2FzdF9zdGFfaWQ7CisJc2Nhbi0+dHhfY21kLnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOworCisJLyogZmxhZ3MgKyByYXRlIHNlbGVjdGlvbiAqLworCisJc3dpdGNoIChpbC0+c2Nhbl9iYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKKwkJc2Nhbi0+dHhfY21kLnJhdGUgPSBSQVRFXzFNX1BMQ1A7CisJCWJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCXNjYW4tPnR4X2NtZC5yYXRlID0gUkFURV82TV9QTENQOworCQliYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfV0FSTigiSW52YWxpZCBzY2FuIGJhbmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIElmIGFjdGl2ZSBzY2FuaW5nIGlzIHJlcXVlc3RlZCBidXQgYSBjZXJ0YWluIGNoYW5uZWwKKwkgKiBpcyBtYXJrZWQgcGFzc2l2ZSwgd2UgY2FuIGRvIGFjdGl2ZSBzY2FubmluZyBpZiB3ZQorCSAqIGRldGVjdCB0cmFuc21pc3Npb25zLgorCSAqLworCXNjYW4tPmdvb2RfQ1JDX3RoID0KKwkgICAgaXNfYWN0aXZlID8gSUxfR09PRF9DUkNfVEhfREVGQVVMVCA6IElMX0dPT0RfQ1JDX1RIX0RJU0FCTEVEOworCisJbGVuID0KKwkgICAgaWxfZmlsbF9wcm9iZV9yZXEoaWwsIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAorCQkJICAgICAgdmlmLT5hZGRyLCBpbC0+c2Nhbl9yZXF1ZXN0LT5pZSwKKwkJCSAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKKwkJCSAgICAgIElMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKKwlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKworCS8qIHNlbGVjdCBSeCBhbnRlbm5hcyAqLworCXNjYW4tPmZsYWdzIHw9IGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhpbCk7CisKKwlzY2FuLT5jaGFubmVsX2NvdW50ID0KKwkgICAgaWwzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihpbCwgYmFuZCwgaXNfYWN0aXZlLCBuX3Byb2JlcywKKwkJCQkJICh2b2lkICopJnNjYW4tPmRhdGFbbGVuXSwgdmlmKTsKKwlpZiAoc2Nhbi0+Y2hhbm5lbF9jb3VudCA9PSAwKSB7CisJCURfU0NBTigiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNtZC5sZW4gKz0KKwkgICAgbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKworCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2Nhbl9jaGFubmVsKTsKKwljbWQuZGF0YSA9IHNjYW47CisJc2Nhbi0+bGVuID0gY3B1X3RvX2xlMTYoY21kLmxlbik7CisKKwlzZXRfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpOworCXJldCA9IGlsX3NlbmRfY21kX3N5bmMoaWwsICZjbWQpOworCWlmIChyZXQpCisJCWNsZWFyX2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbDM5NDVfcG9zdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCS8qCisJICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCisJICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAorCSAqLworCWlmIChtZW1jbXAoJmN0eC0+c3RhZ2luZywgJmN0eC0+YWN0aXZlLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCisJCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHJlc3RhcnQpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpKSB7CisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlsLT5jdHgudmlmID0gTlVMTDsKKwkJaWwtPmlzX29wZW4gPSAwOworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCWlsMzk0NV9kb3duKGlsKTsKKwkJaWVlZTgwMjExX3Jlc3RhcnRfaHcoaWwtPmh3KTsKKwl9IGVsc2UgeworCQlpbDM5NDVfZG93bihpbCk7CisKKwkJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwkJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCV9faWwzOTQ1X3VwKGlsKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19yeF9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgcnhfcmVwbGVuaXNoKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWwzOTQ1X3J4X3JlcGxlbmlzaChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCit2b2lkCitpbDM5NDVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gTlVMTDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmICghY3R4LT52aWYgfHwgIWlsLT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlEX0FTU09DKCJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsIGN0eC0+dmlmLT5ic3NfY29uZi5haWQsCisJCWN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDIwMCk7CisKKwljb25mID0gJmlsLT5ody0+Y29uZjsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlyYyA9IGlsX3NlbmRfcnhvbl90aW1pbmcoaWwsIGN0eCk7CisJaWYgKHJjKQorCQlJTF9XQVJOKCJDX1JYT05fVElNSU5HIGZhaWxlZCAtICIgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCisJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gY3B1X3RvX2xlMTYoY3R4LT52aWYtPmJzc19jb25mLmFpZCk7CisKKwlEX0FTU09DKCJhc3NvYyBpZCAlZCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsIGN0eC0+dmlmLT5ic3NfY29uZi5haWQsCisJCWN0eC0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKKworCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCWVsc2UKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7CisJCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfQorCisJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWwzOTQ1X3JhdGVfc2NhbGVfaW5pdChpbC0+aHcsIElMX0FQX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaWwzOTQ1X3NlbmRfYmVhY29uX2NtZChpbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiJXMgU2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gJWQgbW9kZVxuIiwgX19mdW5jX18sCisJCSAgICAgICBjdHgtPnZpZi0+dHlwZSk7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFVDT0RFX1JFQURZX1RJTUVPVVQJKDIgKiBIWikKKworc3RhdGljIGludAoraWwzOTQ1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwkvKiBmZXRjaCB1Y29kZSBmaWxlIGZyb20gZGlzaywgYWxsb2MgYW5kIGNvcHkgdG8gYnVzLW1hc3RlciBidWZmZXJzIC4uLgorCSAqIHVjb2RlIGZpbGVuYW1lIGFuZCBtYXggc2l6ZXMgYXJlIGNhcmQtc3BlY2lmaWMuICovCisKKwlpZiAoIWlsLT51Y29kZV9jb2RlLmxlbikgeworCQlyZXQgPSBpbDM5NDVfcmVhZF91Y29kZShpbCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiQ291bGQgbm90IHJlYWQgbWljcm9jb2RlOiAlZFxuIiwgcmV0KTsKKwkJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfaXJxOworCQl9CisJfQorCisJcmV0ID0gX19pbDM5NDVfdXAoaWwpOworCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVsZWFzZV9pcnE7CisKKwlEX0lORk8oIlN0YXJ0IFVQIHdvcmsuXG4iKTsKKworCS8qIFdhaXQgZm9yIFNUQVJUX0FMSVZFIGZyb20gdWNvZGUuIE90aGVyd2lzZSBjYWxsYmFja3MgZnJvbQorCSAqIG1hYzgwMjExIHdpbGwgbm90IGJlIHJ1biBzdWNjZXNzZnVsbHkuICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGlsLT53YWl0X2NvbW1hbmRfcXVldWUsCisJCQkJIHRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSwKKwkJCQkgVUNPREVfUkVBRFlfVElNRU9VVCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykpIHsKKwkJCUlMX0VSUigiV2FpdCBmb3IgU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKKwkJCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKKwkJfQorCX0KKworCS8qIHVjb2RlIGlzIHJ1bm5pbmcgYW5kIHdpbGwgc2VuZCByZmtpbGwgbm90aWZpY2F0aW9ucywKKwkgKiBubyBuZWVkIHRvIHBvbGwgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYW55bW9yZSAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCk7CisKKwlpbC0+aXNfb3BlbiA9IDE7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiAwOworCitvdXRfcmVsZWFzZV9pcnE6CisJaWwtPmlzX29wZW4gPSAwOworCURfTUFDODAyMTEoImxlYXZlIC0gZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKCFpbC0+aXNfb3BlbikgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIHNraXBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWwtPmlzX29wZW4gPSAwOworCisJaWwzOTQ1X2Rvd24oaWwpOworCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogc3RhcnQgcG9sbGluZyB0aGUga2lsbHN3aXRjaCBzdGF0ZSBhZ2FpbiAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPl8zOTQ1LnJma2lsbF9wb2xsLAorCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlEX1RYKCJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKKwkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7CisKKwlpZiAoaWwzOTQ1X3R4X3NrYihpbCwgc2tiKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWwzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCByYyA9IDA7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBvbmx5IGF0IEFQIGJyaW5nIHVwICovCisJaWYgKCEoaWxfaXNfYXNzb2NpYXRlZChpbCkpKSB7CisKKwkJLyogUlhPTiAtIHVuYXNzb2MgKHRvIHNldCB0aW1pbmcgY29tbWFuZCkgKi8KKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwkJLyogUlhPTiBUaW1pbmcgKi8KKwkJcmMgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCQlpZiAocmMpCisJCQlJTF9XQVJOKCJDX1JYT05fVElNSU5HIGZhaWxlZCAtICIKKwkJCQkiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCisJCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7CisKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwkJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQkJZWxzZQorCQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCX0KKwkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisJfQorCWlsMzk0NV9zZW5kX2JlYWNvbl9jbWQoaWwpOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldCA9IDA7CisJdTggc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCXU4IHN0YXRpY19rZXk7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAoaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJLyoKKwkgKiBUbyBzdXBwb3J0IElCU1MgUlNOLCBkb24ndCBwcm9ncmFtIGdyb3VwIGtleXMgaW4gSUJTUywgdGhlCisJICogaGFyZHdhcmUgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGZyYW1lcy4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN0YXRpY19rZXkgPSAhaWxfaXNfYXNzb2NpYXRlZChpbCk7CisKKwlpZiAoIXN0YXRpY19rZXkpIHsKKwkJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgJmlsLT5jdHgsIHN0YSk7CisJCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFVF9LRVk6CisJCWlmIChzdGF0aWNfa2V5KQorCQkJcmV0ID0gaWwzOTQ1X3NldF9zdGF0aWNfa2V5KGlsLCBrZXkpOworCQllbHNlCisJCQlyZXQgPSBpbDM5NDVfc2V0X2R5bmFtaWNfa2V5KGlsLCBrZXksIHN0YV9pZCk7CisJCURfTUFDODAyMTEoImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlpZiAoc3RhdGljX2tleSkKKwkJCXJldCA9IGlsMzk0NV9yZW1vdmVfc3RhdGljX2tleShpbCk7CisJCWVsc2UKKwkJCXJldCA9IGlsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oaWwsIHN0YV9pZCk7CisJCURfTUFDODAyMTEoImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X21hY19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWludCByZXQ7CisJYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCXU4IHN0YV9pZDsKKworCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJcmV0ID0KKwkgICAgaWxfYWRkX3N0YXRpb25fY29tbW9uKGlsLCAmaWwtPmN0eCwgc3RhLT5hZGRyLCBpc19hcCwgc3RhLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTSAoJWQpXG4iLCBzdGEtPmFkZHIsIHJldCk7CisJCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RhX3ByaXYtPmNvbW1vbi5zdGFfaWQgPSBzdGFfaWQ7CisKKwkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLworCURfSU5GTygiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJaWwzOTQ1X3JzX3JhdGVfaW5pdChpbCwgc3RhLCBzdGFfaWQpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisjZGVmaW5lIENISyh0ZXN0LCBmbGFnKQlkbyB7IFwKKwlpZiAoKnRvdGFsX2ZsYWdzICYgKHRlc3QpKQkJXAorCQlmaWx0ZXJfb3IgfD0gKGZsYWcpOwkJXAorCWVsc2UJCQkJCVwKKwkJZmlsdGVyX25hbmQgfD0gKGZsYWcpOwkJXAorCX0gd2hpbGUgKDApCisKKwlEX01BQzgwMjExKCJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsIGNoYW5nZWRfZmxhZ3MsCisJCSAgICp0b3RhbF9mbGFncyk7CisKKwlDSEsoRklGX09USEVSX0JTUyB8IEZJRl9QUk9NSVNDX0lOX0JTUywgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLKTsKKwlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworI3VuZGVmIENISworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gfmZpbHRlcl9uYW5kOworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOworCisJLyoKKwkgKiBOb3QgY29tbWl0dGluZyBkaXJlY3RseSBiZWNhdXNlIGhhcmR3YXJlIGNhbiBwZXJmb3JtIGEgc2NhbiwKKwkgKiBidXQgZXZlbiBpZiBodyBpcyByZWFkeSwgY29tbWl0dGluZyBoZXJlIGJyZWFrcyBmb3Igc29tZSByZWFzb24sCisJICogd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgorCSAqLworCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJLyoKKwkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCisJICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKCkKKwkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgbXVsdGljYXN0CisJICogZmlsdGVycyBpbnRvIHRoZSBkZXZpY2UuCisJICovCisJKnRvdGFsX2ZsYWdzICY9CisJICAgIEZJRl9PVEhFUl9CU1MgfCBGSUZfQUxMTVVMVEkgfCBGSUZfUFJPTUlTQ19JTl9CU1MgfAorCSAgICBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzeXNmcyBhdHRyaWJ1dGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbgorICogb2YgdGhpcyBkZXZpY2UgZHJpdmVyIChpLmUuIGEgbmV3IGZpbGUgaW4gL3N5cy9idXMvcGNpL2RyaXZlcnMvaXdsLykKKyAqIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBkZWJ1ZyBsZXZlbC4KKyAqCisgKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGl3bCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGUgZGVidWdfbGV2ZWwgYmVpbmcgbWFuYWdlZCB1c2luZyBzeXNmcyBiZWxvdyBpcyBhIHBlciBkZXZpY2UgZGVidWcKKyAqIGxldmVsIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgaWYgaXQgKHRoZSBwZXIKKyAqIGRldmljZSBkZWJ1ZyBsZXZlbCkgaXMgc2V0LgorICovCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4WFxuIiwgaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCUlMX0lORk8oIiVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlIHsKKwkJaWwtPmRlYnVnX2xldmVsID0gdmFsOworCQlpZiAoaWxfYWxsb2NfdHJhZmZpY19tZW0oaWwpKQorCQkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisJfQorCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZGVidWdfbGV2ZWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd19kZWJ1Z19sZXZlbCwKKwkJICAgaWwzOTQ1X3N0b3JlX2RlYnVnX2xldmVsKTsKKworI2VuZGlmIC8qIENPTkZJR19JV0xFR0FDWV9ERUJVRyAqLworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoaWwpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBpbDM5NDVfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc2hvd190eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10KTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWYpCisJCUlMX0lORk8oIjogJXMgaXMgbm90IGluIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZQorCQlpbDM5NDVfaHdfcmVnX3NldF90eHBvd2VyKGlsLCB2YWwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd190eF9wb3dlciwKKwkJICAgaWwzOTQ1X3N0b3JlX3R4X3Bvd2VyKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBjdHgtPmFjdGl2ZS5mbGFncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwl1MzIgZmxhZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAobGUzMl90b19jcHUoY3R4LT5zdGFnaW5nLmZsYWdzKSAhPSBmbGFncykgeworCQkvKiBDYW5jZWwgYW55IGN1cnJlbnRseSBydW5uaW5nIHNjYW5zLi4uICovCisJCWlmIChpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApKQorCQkJSUxfV0FSTigiQ291bGQgbm90IGNhbmNlbCBzY2FuLlxuIik7CisJCWVsc2UgeworCQkJRF9JTkZPKCJDb21taXR0aW5nIHJ4b24uZmxhZ3MgPSAweCUwNFhcbiIsIGZsYWdzKTsKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKKwkJCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihmbGFncywgU19JV1VTUiB8IFNfSVJVR08sIGlsMzk0NV9zaG93X2ZsYWdzLAorCQkgICBpbDM5NDVfc3RvcmVfZmxhZ3MpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfZmlsdGVyX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGxlMzJfdG9fY3B1KGN0eC0+YWN0aXZlLmZpbHRlcl9mbGFncykpOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUzMiBmaWx0ZXJfZmxhZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAobGUzMl90b19jcHUoY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncykgIT0gZmlsdGVyX2ZsYWdzKSB7CisJCS8qIENhbmNlbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgc2NhbnMuLi4gKi8KKwkJaWYgKGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDEwMCkpCisJCQlJTF9XQVJOKCJDb3VsZCBub3QgY2FuY2VsIHNjYW4uXG4iKTsKKwkJZWxzZSB7CisJCQlEX0lORk8oIkNvbW1pdHRpbmcgcnhvbi5maWx0ZXJfZmxhZ3MgPSAiICIweCUwNFhcbiIsCisJCQkgICAgICAgZmlsdGVyX2ZsYWdzKTsKKwkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPSBjcHVfdG9fbGUzMihmaWx0ZXJfZmxhZ3MpOworCQkJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGZpbHRlcl9mbGFncywgU19JV1VTUiB8IFNfSVJVR08sIGlsMzk0NV9zaG93X2ZpbHRlcl9mbGFncywKKwkJICAgaWwzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc2hvd19tZWFzdXJlbWVudChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiBtZWFzdXJlX3JlcG9ydDsKKwl1MzIgc2l6ZSA9IHNpemVvZihtZWFzdXJlX3JlcG9ydCksIGxlbiA9IDAsIG9mcyA9IDA7CisJdTggKmRhdGEgPSAodTggKikgJm1lYXN1cmVfcmVwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShpbC0+bWVhc3VyZW1lbnRfc3RhdHVzICYgTUVBU1VSRU1FTlRfUkVBRFkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoJm1lYXN1cmVfcmVwb3J0LCAmaWwtPm1lYXN1cmVfcmVwb3J0LCBzaXplKTsKKwlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHNpemUgJiYgUEFHRV9TSVpFIC0gbGVuKSB7CisJCWhleF9kdW1wX3RvX2J1ZmZlcihkYXRhICsgb2ZzLCBzaXplLCAxNiwgMSwgYnVmICsgbGVuLAorCQkJCSAgIFBBR0VfU0laRSAtIGxlbiwgMSk7CisJCWxlbiA9IHN0cmxlbihidWYpOworCQlpZiAoUEFHRV9TSVpFIC0gbGVuKQorCQkJYnVmW2xlbisrXSA9ICdcbic7CisKKwkJb2ZzICs9IDE2OworCQlzaXplIC09IG1pbihzaXplLCAxNlUpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmNoYW5uZWwgPSBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKKwkJLnN0YXJ0X3RpbWUgPSBjcHVfdG9fbGU2NChpbC0+XzM5NDUubGFzdF90c2YpLAorCQkuZHVyYXRpb24gPSBjcHVfdG9fbGUxNigxKSwKKwl9OworCXU4IHR5cGUgPSBJTF9NRUFTVVJFX0JBU0lDOworCXU4IGJ1ZmZlclszMl07CisJdTggY2hhbm5lbDsKKworCWlmIChjb3VudCkgeworCQljaGFyICpwID0gYnVmZmVyOworCQlzdHJuY3B5KGJ1ZmZlciwgYnVmLCBtaW4oc2l6ZW9mKGJ1ZmZlciksIGNvdW50KSk7CisJCWNoYW5uZWwgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKKwkJaWYgKGNoYW5uZWwpCisJCQlwYXJhbXMuY2hhbm5lbCA9IGNoYW5uZWw7CisKKwkJcCA9IGJ1ZmZlcjsKKwkJd2hpbGUgKCpwICYmICpwICE9ICcgJykKKwkJCXArKzsKKwkJaWYgKCpwKQorCQkJdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKTsKKwl9CisKKwlEX0lORk8oIkludm9raW5nIG1lYXN1cmVtZW50IG9mIHR5cGUgJWQgb24gIiAiY2hhbm5lbCAlZCAoZm9yICclcycpXG4iLAorCSAgICAgICB0eXBlLCBwYXJhbXMuY2hhbm5lbCwgYnVmKTsKKwlpbDM5NDVfZ2V0X21lYXN1cmVtZW50KGlsLCAmcGFyYW1zLCB0eXBlKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG1lYXN1cmVtZW50LCBTX0lSVVNSIHwgU19JV1VTUiwgaWwzOTQ1X3Nob3dfbWVhc3VyZW1lbnQsCisJCSAgIGlsMzk0NV9zdG9yZV9tZWFzdXJlbWVudCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfcmV0cnlfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlsLT5yZXRyeV9yYXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlpZiAoaWwtPnJldHJ5X3JhdGUgPD0gMCkKKwkJaWwtPnJldHJ5X3JhdGUgPSAxOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfcmV0cnlfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBpbC0+cmV0cnlfcmF0ZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXRyeV9yYXRlLCBTX0lXVVNSIHwgU19JUlVTUiwgaWwzOTQ1X3Nob3dfcmV0cnlfcmF0ZSwKKwkJICAgaWwzOTQ1X3N0b3JlX3JldHJ5X3JhdGUpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwkvKiBhbGwgdGhpcyBzaGl0IGRvZXNuJ3QgYmVsb25nIGludG8gc3lzZnMgYW55d2F5ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFubmVscywgU19JUlVTUiwgaWwzOTQ1X3Nob3dfY2hhbm5lbHMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfYW50ZW5uYShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdG9yZV9hbnRlbm5hKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpbnQgYW50OworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKHNzY2FuZihidWYsICIlMWkiLCAmYW50KSAhPSAxKSB7CisJCURfSU5GTygibm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCWlmIChhbnQgPj0gMCAmJiBhbnQgPD0gMikgeworCQlEX0lORk8oIlNldHRpbmcgYW50ZW5uYSBzZWxlY3QgdG8gJWQuXG4iLCBhbnQpOworCQlpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hID0gKGVudW0gaWwzOTQ1X2FudGVubmEpYW50OworCX0gZWxzZQorCQlEX0lORk8oIkJhZCBhbnRlbm5hIHNlbGVjdCB2YWx1ZSAlZC5cbiIsIGFudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbnRlbm5hLCBTX0lXVVNSIHwgU19JUlVHTywgaWwzOTQ1X3Nob3dfYW50ZW5uYSwKKwkJICAgaWwzOTQ1X3N0b3JlX2FudGVubmEpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXMsIFNfSVJVR08sIGlsMzk0NV9zaG93X3N0YXR1cywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfZHVtcF9lcnJvcl9sb2coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisKKwlpZiAocFswXSA9PSAnMScpCisJCWlsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coaWwpOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkdW1wX2Vycm9ycywgU19JV1VTUiwgTlVMTCwgaWwzOTQ1X2R1bXBfZXJyb3JfbG9nKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyIGRvd24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKERSVl9OQU1FKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJSU5JVF9XT1JLKCZpbC0+cmVzdGFydCwgaWwzOTQ1X2JnX3Jlc3RhcnQpOworCUlOSVRfV09SSygmaWwtPnJ4X3JlcGxlbmlzaCwgaWwzOTQ1X2JnX3J4X3JlcGxlbmlzaCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5pbml0X2FsaXZlX3N0YXJ0LCBpbDM5NDVfYmdfaW5pdF9hbGl2ZV9zdGFydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5hbGl2ZV9zdGFydCwgaWwzOTQ1X2JnX2FsaXZlX3N0YXJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPl8zOTQ1LnJma2lsbF9wb2xsLCBpbDM5NDVfcmZraWxsX3BvbGwpOworCisJaWxfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKGlsKTsKKworCWlsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKGlsKTsKKworCWluaXRfdGltZXIoJmlsLT53YXRjaGRvZyk7CisJaWwtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbDsKKwlpbC0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpbF9iZ193YXRjaGRvZzsKKworCXRhc2tsZXRfaW5pdCgmaWwtPmlycV90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlpbDM5NDVfaXJxX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpaWwpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbC0+aW5pdF9hbGl2ZV9zdGFydCk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPmFsaXZlX3N0YXJ0KTsKKworCWlsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoaWwpOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWwzOTQ1X3N5c2ZzX2VudHJpZXNbXSA9IHsKKwkmZGV2X2F0dHJfYW50ZW5uYS5hdHRyLAorCSZkZXZfYXR0cl9jaGFubmVscy5hdHRyLAorCSZkZXZfYXR0cl9kdW1wX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9mbGFncy5hdHRyLAorCSZkZXZfYXR0cl9maWx0ZXJfZmxhZ3MuYXR0ciwKKwkmZGV2X2F0dHJfbWVhc3VyZW1lbnQuYXR0ciwKKwkmZGV2X2F0dHJfcmV0cnlfcmF0ZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcGVyYXR1cmUuYXR0ciwKKwkmZGV2X2F0dHJfdHhfcG93ZXIuYXR0ciwKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkmZGV2X2F0dHJfZGVidWdfbGV2ZWwuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlsMzk0NV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBOVUxMLAkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KKwkuYXR0cnMgPSBpbDM5NDVfc3lzZnNfZW50cmllcywKK307CisKK3N0cnVjdCBpZWVlODAyMTFfb3BzIGlsMzk0NV9od19vcHMgPSB7CisJLnR4ID0gaWwzOTQ1X21hY190eCwKKwkuc3RhcnQgPSBpbDM5NDVfbWFjX3N0YXJ0LAorCS5zdG9wID0gaWwzOTQ1X21hY19zdG9wLAorCS5hZGRfaW50ZXJmYWNlID0gaWxfbWFjX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UgPSBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY2hhbmdlX2ludGVyZmFjZSA9IGlsX21hY19jaGFuZ2VfaW50ZXJmYWNlLAorCS5jb25maWcgPSBpbF9tYWNfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyID0gaWwzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF9rZXkgPSBpbDM5NDVfbWFjX3NldF9rZXksCisJLmNvbmZfdHggPSBpbF9tYWNfY29uZl90eCwKKwkucmVzZXRfdHNmID0gaWxfbWFjX3Jlc2V0X3RzZiwKKwkuYnNzX2luZm9fY2hhbmdlZCA9IGlsX21hY19ic3NfaW5mb19jaGFuZ2VkLAorCS5od19zY2FuID0gaWxfbWFjX2h3X3NjYW4sCisJLnN0YV9hZGQgPSBpbDM5NDVfbWFjX3N0YV9hZGQsCisJLnN0YV9yZW1vdmUgPSBpbF9tYWNfc3RhX3JlbW92ZSwKKwkudHhfbGFzdF9iZWFjb24gPSBpbF9tYWNfdHhfbGFzdF9iZWFjb24sCit9OworCitzdGF0aWMgaW50CitpbDM5NDVfaW5pdF9kcnYoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisKKwlpbC0+cmV0cnlfcmF0ZSA9IDE7CisJaWwtPmJlYWNvbl9za2IgPSBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5oY21kX2xvY2spOworCisJSU5JVF9MSVNUX0hFQUQoJmlsLT5mcmVlX2ZyYW1lcyk7CisKKwltdXRleF9pbml0KCZpbC0+bXV0ZXgpOworCisJaWwtPmllZWVfY2hhbm5lbHMgPSBOVUxMOworCWlsLT5pZWVlX3JhdGVzID0gTlVMTDsKKwlpbC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisKKwlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOworCisJLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLworCWlsLT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOworCisJaWYgKGVlcHJvbS0+dmVyc2lvbiA8IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OKSB7CisJCUlMX1dBUk4oIlVuc3VwcG9ydGVkIEVFUFJPTSB2ZXJzaW9uOiAweCUwNFhcbiIsCisJCQllZXByb20tPnZlcnNpb24pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gaWxfaW5pdF9jaGFubmVsX21hcChpbCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoImluaXRpYWxpemluZyByZWd1bGF0b3J5IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB1cCB0eHBvd2VyIHNldHRpbmdzIGluIGRyaXZlciBmb3IgYWxsIGNoYW5uZWxzICovCisJaWYgKGlsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbShpbCkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKKwl9CisKKwlyZXQgPSBpbF9pbml0X2dlb3MoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOworCX0KKwlpbDM5NDVfaW5pdF9od19yYXRlcyhpbCwgaWwtPmllZWVfcmF0ZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NoYW5uZWxfbWFwOgorCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSUwzOTQ1X01BWF9QUk9CRV9SRVFVRVNUCTIwMAorCitzdGF0aWMgaW50CitpbDM5NDVfc2V0dXBfbWFjKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gaWwtPmh3OworCisJaHctPnJhdGVfY29udHJvbF9hbGdvcml0aG0gPSAiaXdsLTM5NDUtcnMiOworCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc3RhX3ByaXYpOworCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbF92aWZfcHJpdik7CisKKwkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KKwlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8IElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UOworCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBpbC0+Y3R4LmludGVyZmFjZV9tb2RlczsKKworCWh3LT53aXBoeS0+ZmxhZ3MgfD0KKwkgICAgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8IFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAorCSAgICBXSVBIWV9GTEFHX0lCU1NfUlNOOworCisJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVhfMzk0NTsKKwkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGEgemVyby1sZW5ndGggU1NJRCBlbGVtZW50ICovCisJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJTDM5NDVfTUFYX1BST0JFX1JFUVVFU1QgLSAyNCAtIDI7CisKKwkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KKwlody0+cXVldWVzID0gNDsKKworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscykKKwkJaWwtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQorCQkgICAgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKKworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscykKKwkJaWwtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkgICAgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKKworCWlsX2xlZHNfaW5pdChpbCk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmcgPSAoc3RydWN0IGlsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKKwkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIGlsYXRlIHN0cnVjdHVyZSAqLworCWh3ID0gaWxfYWxsb2NfYWxsKGNmZyk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlsID0gaHctPnByaXY7CisJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOworCisJaWwtPmNtZF9xdWV1ZSA9IElMMzlfQ01EX1FVRVVFX05VTTsKKworCWlsLT5jdHguY3R4aWQgPSAwOworCisJaWwtPmN0eC5yeG9uX2NtZCA9IENfUlhPTjsKKwlpbC0+Y3R4LnJ4b25fdGltaW5nX2NtZCA9IENfUlhPTl9USU1JTkc7CisJaWwtPmN0eC5yeG9uX2Fzc29jX2NtZCA9IENfUlhPTl9BU1NPQzsKKwlpbC0+Y3R4LnFvc19jbWQgPSBDX1FPU19QQVJBTTsKKwlpbC0+Y3R4LmFwX3N0YV9pZCA9IElMX0FQX0lEOworCWlsLT5jdHgud2VwX2tleV9jbWQgPSBDX1dFUEtFWTsKKwlpbC0+Y3R4LmludGVyZmFjZV9tb2RlcyA9CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8IEJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisJaWwtPmN0eC5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7CisJaWwtPmN0eC5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKKwlpbC0+Y3R4LnVudXNlZF9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisKKwkvKgorCSAqIERpc2FibGluZyBoYXJkd2FyZSBzY2FuIG1lYW5zIHRoYXQgbWFjODAyMTEgd2lsbCBwZXJmb3JtIHNjYW5zCisJICogInRoZSBoYXJkIHdheSIsIHJhdGhlciB0aGFuIHVzaW5nIGRldmljZSdzIHNjYW4uCisJICovCisJaWYgKGlsMzk0NV9tb2RfcGFyYW1zLmRpc2FibGVfaHdfc2NhbikgeworCQlEX0lORk8oIkRpc2FibGluZyBod19zY2FuXG4iKTsKKwkJaWwzOTQ1X2h3X29wcy5od19zY2FuID0gTlVMTDsKKwl9CisKKwlEX0lORk8oIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOworCWlsLT5jZmcgPSBjZmc7CisJaWwtPnBjaV9kZXYgPSBwZGV2OworCWlsLT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOworCisJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqLworCXBjaV9kaXNhYmxlX2xpbmtfc3RhdGUocGRldiwKKwkJCSAgICAgICBQQ0lFX0xJTktfU1RBVEVfTDBTIHwgUENJRV9MSU5LX1NUQVRFX0wxIHwKKwkJCSAgICAgICBQQ0lFX0xJTktfU1RBVEVfQ0xLUE0pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2llZWU4MDIxMV9mcmVlX2h3OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpIHsKKwkJSUxfV0FSTigiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlsKTsKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAzLiBSZWFkIFJFViBSZWdpc3RlcgorCSAqICoqKioqKioqKioqKioqKioqKioqLworCWlsLT5od19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghaWwtPmh3X2Jhc2UpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIGlsLT5od19iYXNlKTsKKworCS8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKKwkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsIDB4MDApOworCisJLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCisJICogd2Ugc2hvdWxkIGluaXQgbm93CisJICovCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5sb2NrKTsKKworCS8qCisJICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQorCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCisJICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCisJICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDQuIFJlYWQgRUVQUk9NCisJICogKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBSZWFkIHRoZSBFRVBST00gKi8KKwllcnIgPSBpbF9lZXByb21faW5pdChpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCS8qIE1BQyBBZGRyZXNzIGxvY2F0aW9uIGluIEVFUFJPTSBzYW1lIGZvciAzOTQ1LzQ5NjUgKi8KKwllZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCURfSU5GTygiTUFDIGFkZHJlc3M6ICVwTVxuIiwgZWVwcm9tLT5tYWNfYWRkcmVzcyk7CisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaWwtPmh3LCBlZXByb20tPm1hY19hZGRyZXNzKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDUuIFNldHVwIEhXIENvbnN0YW50cworCSAqICoqKioqKioqKioqKioqKioqKioqLworCS8qIERldmljZS1zcGVjaWZpYyBzZXR1cCAqLworCWlmIChpbDM5NDVfaHdfc2V0X2h3X3BhcmFtcyhpbCkpIHsKKwkJSUxfRVJSKCJmYWlsZWQgdG8gc2V0IGh3IHNldHRpbmdzXG4iKTsKKwkJZ290byBvdXRfZWVwcm9tX2ZyZWU7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogNi4gU2V0dXAgaWwKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKworCWVyciA9IGlsMzk0NV9pbml0X2RydihpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImluaXRpYWxpemluZyBkcml2ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfdW5zZXRfaHdfcGFyYW1zOworCX0KKworCUlMX0lORk8oIkRldGVjdGVkIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayAlc1xuIiwgaWwtPmNmZy0+bmFtZSk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA3LiBTZXR1cCBTZXJ2aWNlcworCSAqICoqKioqKioqKioqKioqKioqKioqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcGNpX2VuYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCisJZXJyID0gcmVxdWVzdF9pcnEoaWwtPnBjaV9kZXYtPmlycSwgaWxfaXNyLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGlsKTsKKwlpZiAoZXJyKSB7CisJCUlMX0VSUigiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIGlsLT5wY2lfZGV2LT5pcnEpOworCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKKwl9CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaWwzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKKwl9CisKKwlpbF9zZXRfcnhvbl9jaGFubmVsKGlsLCAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmNoYW5uZWxzWzVdLAorCQkJICAgICZpbC0+Y3R4KTsKKwlpbDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhpbCk7CisJaWwzOTQ1X3NldHVwX2hhbmRsZXJzKGlsKTsKKwlpbF9wb3dlcl9pbml0aWFsaXplKGlsKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA4LiBTZXR1cCBhbmQgUmVnaXN0ZXIgbWFjODAyMTEKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCisJZXJyID0gaWwzOTQ1X3NldHVwX21hYyhpbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVtb3ZlX3N5c2ZzOworCisJZXJyID0gaWxfZGJnZnNfcmVnaXN0ZXIoaWwsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlcy4gSWdub3JpbmcgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgZXJyKTsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGtpbGxzd2l0Y2ggKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCwgMiAqIEhaKTsKKworCXJldHVybiAwOworCitvdXRfcmVtb3ZlX3N5c2ZzOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbDM5NDVfYXR0cmlidXRlX2dyb3VwKTsKK291dF9yZWxlYXNlX2lycToKKwlmcmVlX2lycShpbC0+cGNpX2Rldi0+aXJxLCBpbCk7CitvdXRfZGlzYWJsZV9tc2k6CisJcGNpX2Rpc2FibGVfbXNpKGlsLT5wY2lfZGV2KTsKKwlpbF9mcmVlX2dlb3MoaWwpOworCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworb3V0X3Vuc2V0X2h3X3BhcmFtczoKKwlpbDM5NDVfdW5zZXRfaHdfcGFyYW1zKGlsKTsKK291dF9lZXByb21fZnJlZToKKwlpbF9lZXByb21fZnJlZShpbCk7CitvdXRfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpbC0+aHdfYmFzZSk7CitvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X3BjaV9kaXNhYmxlX2RldmljZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2llZWU4MDIxMV9mcmVlX2h3OgorCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitpbDM5NDVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWwpCisJCXJldHVybjsKKworCURfSU5GTygiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKKworCWlsX2RiZ2ZzX3VucmVnaXN0ZXIoaWwpOworCisJc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJaWxfbGVkc19leGl0KGlsKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgeworCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhpbC0+aHcpOworCQlpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7CisJfSBlbHNlIHsKKwkJaWwzOTQ1X2Rvd24oaWwpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGRldmljZSBpcyByZXNldCB0byBsb3cgcG93ZXIgYmVmb3JlIHVubG9hZGluZyBkcml2ZXIuCisJICogVGhpcyBtYXkgYmUgcmVkdW5kYW50IHdpdGggaWxfZG93bigpLCBidXQgdGhlcmUgYXJlIHBhdGhzIHRvCisJICogcnVuIGlsX2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKKwkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGlsX2Rvd24oKSBhdCBhbGwgYmVmb3JlIGxlYXZpbmcgZHJpdmVyLgorCSAqIFRoaXMgKGluZXhwZW5zaXZlKSBjYWxsICptYWtlcyBzdXJlKiBkZXZpY2UgaXMgcmVzZXQuCisJICovCisJaWxfYXBtX3N0b3AoaWwpOworCisJLyogbWFrZSBzdXJlIHdlIGZsdXNoIGFueSBwZW5kaW5nIGlycSBvcgorCSAqIHRhc2tsZXQgZm9yIHRoZSBkcml2ZXIKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbDM5NDVfc3luY2hyb25pemVfaXJxKGlsKTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbDM5NDVfYXR0cmlidXRlX2dyb3VwKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPl8zOTQ1LnJma2lsbF9wb2xsKTsKKworCWlsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShpbCk7CisKKwlpZiAoaWwtPnJ4cS5iZCkKKwkJaWwzOTQ1X3J4X3F1ZXVlX2ZyZWUoaWwsICZpbC0+cnhxKTsKKwlpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKKworCWlsMzk0NV91bnNldF9od19wYXJhbXMoaWwpOworCisJLypuZXRpZl9zdG9wX3F1ZXVlKGRldik7ICovCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbHMgaWwzOTQ1X21hY19zdG9wLCB3aGljaCBmbHVzaGVzCisJICogaWwtPndvcmtxdWV1ZS4uLiBzbyB3ZSBjYW4ndCB0YWtlIGRvd24gdGhlIHdvcmtxdWV1ZQorCSAqIHVudGlsIG5vdy4uLiAqLworCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBpbCk7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgaWwtPmh3X2Jhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworCWlsX2ZyZWVfZ2VvcyhpbCk7CisJa2ZyZWUoaWwtPnNjYW5fY21kKTsKKwlpZiAoaWwtPmJlYWNvbl9za2IpCisJCWRldl9rZnJlZV9za2IoaWwtPmJlYWNvbl9za2IpOworCisJaWVlZTgwMjExX2ZyZWVfaHcoaWwtPmh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIGFuZCBtb2R1bGUgZW50cnkgcG9pbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbDM5NDVfZHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gaWwzOTQ1X2h3X2NhcmRfaWRzLAorCS5wcm9iZSA9IGlsMzk0NV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGlsMzk0NV9wY2lfcmVtb3ZlKSwKKwkuZHJpdmVyLnBtID0gSUxfTEVHQUNZX1BNX09QUywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitpbDM5NDVfaW5pdCh2b2lkKQoreworCisJaW50IHJldDsKKwlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOworCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKKworCXJldCA9IGlsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHJhdGUgY29udHJvbCBhbGdvcml0aG06ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlsMzk0NV9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKwkJZ290byBlcnJvcl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9yZWdpc3RlcjoKKwlpbDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2lsMzk0NV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpbDM5NDVfZHJpdmVyKTsKKwlpbDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKK30KKworTU9EVUxFX0ZJUk1XQVJFKElMMzk0NV9NT0RVTEVfRklSTVdBUkUoSUwzOTQ1X1VDT0RFX0FQSV9NQVgpKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFudGVubmEsIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGFudGVubmEsICJzZWxlY3QgYW50ZW5uYSAoMT1NYWluLCAyPUF1eCwgZGVmYXVsdCAwIFtib3RoXSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIHNvZnR3YXJlIGNyeXB0byAoZGVmYXVsdCAxIFtzb2Z0d2FyZV0pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9od19zY2FuLCBpbDM5NDVfbW9kX3BhcmFtcy5kaXNhYmxlX2h3X3NjYW4sIGludCwKKwkJICAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaHdfc2NhbiwgImRpc2FibGUgaGFyZHdhcmUgc2Nhbm5pbmcgKGRlZmF1bHQgMSkiKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaWxfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCittb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaWwzOTQ1X21vZF9wYXJhbXMucmVzdGFydF9mdywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZndfcmVzdGFydCwgInJlc3RhcnQgZmlybXdhcmUgaW4gY2FzZSBvZiBlcnJvciIpOworCittb2R1bGVfZXhpdChpbDM5NDVfZXhpdCk7Cittb2R1bGVfaW5pdChpbDM5NDVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZDQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtcnMuYwpAQCAtMCwwICsxLDk5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKworI2RlZmluZSBSU19OQU1FICJpd2wtMzk0NS1ycyIKKworc3RhdGljIHMzMiBpbDM5NDVfZXhwZWN0ZWRfdHB0X2dbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCA3NiwgMTA0LCAxMzAsIDE2OCwgMTkxLCAyMDIKK307CisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3RbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCAwLCA4MCwgOTMsIDExMywgMTIzLCAxMjUKK307CisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9hW1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJMCwgMCwgMCwgMCwgNDAsIDU3LCA3MiwgOTgsIDEyMSwgMTU0LCAxNzcsIDE4NgorfTsKKworc3RhdGljIHMzMiBpbDM5NDVfZXhwZWN0ZWRfdHB0X2JbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSB7CisJczggbWluX3Jzc2k7CisJdTggaWR4OworfTsKKworc3RhdGljIHN0cnVjdCBpbDM5NDVfdHB0X2VudHJ5IGlsMzk0NV90cHRfdGFibGVfYVtdID0geworCXstNjAsIFJBVEVfNTRNX0lEWH0sCisJey02NCwgUkFURV80OE1fSURYfSwKKwl7LTcyLCBSQVRFXzM2TV9JRFh9LAorCXstODAsIFJBVEVfMjRNX0lEWH0sCisJey04NCwgUkFURV8xOE1fSURYfSwKKwl7LTg1LCBSQVRFXzEyTV9JRFh9LAorCXstODcsIFJBVEVfOU1fSURYfSwKKwl7LTg5LCBSQVRFXzZNX0lEWH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSBpbDM5NDVfdHB0X3RhYmxlX2dbXSA9IHsKKwl7LTYwLCBSQVRFXzU0TV9JRFh9LAorCXstNjQsIFJBVEVfNDhNX0lEWH0sCisJey02OCwgUkFURV8zNk1fSURYfSwKKwl7LTgwLCBSQVRFXzI0TV9JRFh9LAorCXstODQsIFJBVEVfMThNX0lEWH0sCisJey04NSwgUkFURV8xMk1fSURYfSwKKwl7LTg2LCBSQVRFXzExTV9JRFh9LAorCXstODgsIFJBVEVfNU1fSURYfSwKKwl7LTkwLCBSQVRFXzJNX0lEWH0sCisJey05MiwgUkFURV8xTV9JRFh9Cit9OworCisjZGVmaW5lIFJBVEVfTUFYX1dJTkRPVyAgICAgICAgICA2MgorI2RlZmluZSBSQVRFX0ZMVVNICQkoMypIWikKKyNkZWZpbmUgUkFURV9XSU5fRkxVU0ggICAgICAgKEhaLzIpCisjZGVmaW5lIElMMzlfUkFURV9ISUdIX1RIICAgICAgICAgIDExNTIwCisjZGVmaW5lIElMX1NVQ0NFU1NfVVBfVEgJICAgODk2MAorI2RlZmluZSBJTF9TVUNDRVNTX0RPV05fVEgJICAxMDg4MAorI2RlZmluZSBSQVRFX01JTl9GQUlMVVJFX1RIICAgICAgIDYKKyNkZWZpbmUgUkFURV9NSU5fU1VDQ0VTU19USCAgICAgICA4CisjZGVmaW5lIFJBVEVfREVDUkVBU0VfVEggICAgICAgMTkyMAorI2RlZmluZSBSQVRFX1JFVFJZX1RICSAgICAgMTUKKworc3RhdGljIHU4CitpbDM5NDVfZ2V0X3JhdGVfaWR4X2J5X3Jzc2koczMyIHJzc2ksIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwl1MzIgaWR4ID0gMDsKKwl1MzIgdGFibGVfc2l6ZSA9IDA7CisJc3RydWN0IGlsMzk0NV90cHRfZW50cnkgKnRwdF90YWJsZSA9IE5VTEw7CisKKwlpZiAocnNzaSA8IElMX01JTl9SU1NJX1ZBTCB8fCByc3NpID4gSUxfTUFYX1JTU0lfVkFMKQorCQlyc3NpID0gSUxfTUlOX1JTU0lfVkFMOworCisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQl0cHRfdGFibGUgPSBpbDM5NDVfdHB0X3RhYmxlX2c7CisJCXRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGlsMzk0NV90cHRfdGFibGVfZyk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQl0cHRfdGFibGUgPSBpbDM5NDVfdHB0X3RhYmxlX2E7CisJCXRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGlsMzk0NV90cHRfdGFibGVfYSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXdoaWxlIChpZHggPCB0YWJsZV9zaXplICYmIHJzc2kgPCB0cHRfdGFibGVbaWR4XS5taW5fcnNzaSkKKwkJaWR4Kys7CisKKwlpZHggPSBtaW4oaWR4LCAodGFibGVfc2l6ZSAtIDEpKTsKKworCXJldHVybiB0cHRfdGFibGVbaWR4XS5pZHg7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfY2xlYXJfd2luKHN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW4pCit7CisJd2luLT5kYXRhID0gMDsKKwl3aW4tPnN1Y2Nlc3NfY291bnRlciA9IDA7CisJd2luLT5zdWNjZXNzX3JhdGlvID0gLTE7CisJd2luLT5jb3VudGVyID0gMDsKKwl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl3aW4tPnN0YW1wID0gMDsKK30KKworLyoqCisgKiBpbDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5zIC0gZmx1c2ggb3V0IHRoZSByYXRlIHNjYWxlIHdpbnMKKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2lucyB0aGF0IGhhdmUgZ2F0aGVyZWQgZGF0YSBidXQgd2VyZQorICogbm90IGZsdXNoZWQuICBJZiB0aGVyZSB3ZXJlIGFueSB0aGF0IHdlcmUgbm90IGZsdXNoZWQsIHRoZW4KKyAqIHJlc2NoZWR1bGUgdGhlIHJhdGUgZmx1c2hpbmcgcm91dGluZS4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X3JhdGVfc2NhbGVfZmx1c2hfd2lucyhzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhKQoreworCWludCB1bmZsdXNoZWQgPSAwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5pbDsKKworCS8qCisJICogRm9yIGVhY2ggcmF0ZSwgaWYgd2UgaGF2ZSBjb2xsZWN0ZWQgZGF0YSBvbiB0aGF0IHJhdGUKKwkgKiBhbmQgaXQgaGFzIGJlZW4gbW9yZSB0aGFuIFJBVEVfV0lOX0ZMVVNICisJICogc2luY2Ugd2UgZmx1c2hlZCwgY2xlYXIgb3V0IHRoZSBnYXRoZXJlZCBzdGF0cworCSAqLworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UXzM5NDU7IGkrKykgeworCQlpZiAoIXJzX3N0YS0+d2luW2ldLmNvdW50ZXIpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJzX3N0YS0+d2luW2ldLnN0YW1wICsgUkFURV9XSU5fRkxVU0gpKSB7CisJCQlEX1JBVEUoImZsdXNoaW5nICVkIHNhbXBsZXMgb2YgcmF0ZSAiICJpZHggJWRcbiIsCisJCQkgICAgICAgcnNfc3RhLT53aW5baV0uY291bnRlciwgaSk7CisJCQlpbDM5NDVfY2xlYXJfd2luKCZyc19zdGEtPndpbltpXSk7CisJCX0gZWxzZQorCQkJdW5mbHVzaGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiB1bmZsdXNoZWQ7Cit9CisKKyNkZWZpbmUgUkFURV9GTFVTSF9NQVggICAgICAgICAgICAgIDUwMDAJLyogbXNlYyAqLworI2RlZmluZSBSQVRFX0ZMVVNIX01JTiAgICAgICAgICAgICAgNTAJLyogbXNlYyAqLworI2RlZmluZSBJTF9BVkVSQUdFX1BBQ0tFVFMgICAgICAgICAgICAgMTUwMAorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2JnX3JhdGVfc2NhbGVfZmx1c2godW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5pbDsKKwlpbnQgdW5mbHVzaGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBwYWNrZXRfY291bnQsIGR1cmF0aW9uLCBwcHM7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKworCXVuZmx1c2hlZCA9IGlsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbnMocnNfc3RhKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qIE51bWJlciBvZiBwYWNrZXRzIFJ4J2Qgc2luY2UgbGFzdCB0aW1lIHRoaXMgdGltZXIgcmFuICovCisJcGFja2V0X2NvdW50ID0gKHJzX3N0YS0+dHhfcGFja2V0cyAtIHJzX3N0YS0+bGFzdF90eF9wYWNrZXRzKSArIDE7CisKKwlyc19zdGEtPmxhc3RfdHhfcGFja2V0cyA9IHJzX3N0YS0+dHhfcGFja2V0cyArIDE7CisKKwlpZiAodW5mbHVzaGVkKSB7CisJCWR1cmF0aW9uID0KKwkJICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoKTsKKworCQlEX1JBVEUoIlR4J2QgJWQgcGFja2V0cyBpbiAlZG1zXG4iLCBwYWNrZXRfY291bnQsIGR1cmF0aW9uKTsKKworCQkvKiBEZXRlcm1pbmUgcGFja2V0cyBwZXIgc2Vjb25kICovCisJCWlmIChkdXJhdGlvbikKKwkJCXBwcyA9IChwYWNrZXRfY291bnQgKiAxMDAwKSAvIGR1cmF0aW9uOworCQllbHNlCisJCQlwcHMgPSAwOworCisJCWlmIChwcHMpIHsKKwkJCWR1cmF0aW9uID0gKElMX0FWRVJBR0VfUEFDS0VUUyAqIDEwMDApIC8gcHBzOworCQkJaWYgKGR1cmF0aW9uIDwgUkFURV9GTFVTSF9NSU4pCisJCQkJZHVyYXRpb24gPSBSQVRFX0ZMVVNIX01JTjsKKwkJCWVsc2UgaWYgKGR1cmF0aW9uID4gUkFURV9GTFVTSF9NQVgpCisJCQkJZHVyYXRpb24gPSBSQVRFX0ZMVVNIX01BWDsKKwkJfSBlbHNlCisJCQlkdXJhdGlvbiA9IFJBVEVfRkxVU0hfTUFYOworCisJCXJzX3N0YS0+Zmx1c2hfdGltZSA9IG1zZWNzX3RvX2ppZmZpZXMoZHVyYXRpb24pOworCisJCURfUkFURSgibmV3IGZsdXNoIHBlcmlvZDogJWQgbXNlYyBhdmUgJWRcbiIsIGR1cmF0aW9uLAorCQkgICAgICAgcGFja2V0X2NvdW50KTsKKworCQltb2RfdGltZXIoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCwKKwkJCSAgamlmZmllcyArIHJzX3N0YS0+Zmx1c2hfdGltZSk7CisKKwkJcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOworCX0gZWxzZSB7CisJCXJzX3N0YS0+Zmx1c2hfdGltZSA9IFJBVEVfRkxVU0g7CisJCXJzX3N0YS0+Zmx1c2hfcGVuZGluZyA9IDA7CisJfQorCS8qIElmIHRoZXJlIHdlcmVuJ3QgYW55IHVuZmx1c2hlZCBlbnRyaWVzLCB3ZSBkb24ndCBzY2hlZHVsZSB0aGUgdGltZXIKKwkgKiB0byBydW4gYWdhaW4gKi8KKworCXJzX3N0YS0+bGFzdF9mbHVzaCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCURfUkFURSgibGVhdmVcbiIpOworfQorCisvKioKKyAqIGlsMzk0NV9jb2xsZWN0X3R4X2RhdGEgLSBVcGRhdGUgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBzbGlkaW5nIHdpbgorICoKKyAqIFdlIGtlZXAgYSBzbGlkaW5nIHdpbiBvZiB0aGUgbGFzdCA2NCBwYWNrZXRzIHRyYW5zbWl0dGVkCisgKiBhdCB0aGlzIHJhdGUuICB3aW4tPmRhdGEgY29udGFpbnMgdGhlIGJpdG1hc2sgb2Ygc3VjY2Vzc2Z1bAorICogcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9jb2xsZWN0X3R4X2RhdGEoc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSwKKwkJICAgICAgIHN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW4sIGludCBzdWNjZXNzLAorCQkgICAgICAgaW50IHJldHJpZXMsIGludCBpZHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzMzIgZmFpbF9jb3VudDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSByc19zdGEtPmlsOworCisJaWYgKCFyZXRyaWVzKSB7CisJCURfUkFURSgibGVhdmU6IHJldHJpZXMgPT0gMCAtLSBzaG91bGQgYmUgYXQgbGVhc3QgMVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2Ygb25seSB0aGUgbGF0ZXN0IDYyIHR4IGZyYW1lIGF0dGVtcHRzIGluIHRoaXMgcmF0ZSdzCisJICogaGlzdG9yeSB3aW47IGFueXRoaW5nIG9sZGVyIGlzbid0IHJlYWxseSByZWxldmFudCBhbnkgbW9yZS4KKwkgKiBJZiB3ZSBoYXZlIGZpbGxlZCB1cCB0aGUgc2xpZGluZyB3aW4sIGRyb3AgdGhlIG9sZGVzdCBhdHRlbXB0OworCSAqIGlmIHRoZSBvbGRlc3QgYXR0ZW1wdCAoaGlnaGVzdCBiaXQgaW4gYml0bWFwKSBzaG93cyAic3VjY2VzcyIsCisJICogc3VidHJhY3QgIjEiIGZyb20gdGhlIHN1Y2Nlc3MgY291bnRlciAodGhpcyBpcyB0aGUgbWFpbiByZWFzb24KKwkgKiB3ZSBrZWVwIHRoZXNlIGJpdG1hcHMhKS4KKwkgKiAqLworCXdoaWxlIChyZXRyaWVzID4gMCkgeworCQlpZiAod2luLT5jb3VudGVyID49IFJBVEVfTUFYX1dJTkRPVykgeworCisJCQkvKiByZW1vdmUgZWFybGllc3QgKi8KKwkJCXdpbi0+Y291bnRlciA9IFJBVEVfTUFYX1dJTkRPVyAtIDE7CisKKwkJCWlmICh3aW4tPmRhdGEgJiAoMVVMTCA8PCAoUkFURV9NQVhfV0lORE9XIC0gMSkpKSB7CisJCQkJd2luLT5kYXRhICY9IH4oMVVMTCA8PCAoUkFURV9NQVhfV0lORE9XIC0gMSkpOworCQkJCXdpbi0+c3VjY2Vzc19jb3VudGVyLS07CisJCQl9CisJCX0KKworCQkvKiBJbmNyZW1lbnQgZnJhbWVzLWF0dGVtcHRlZCBjb3VudGVyICovCisJCXdpbi0+Y291bnRlcisrOworCisJCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgKHRocm93IGF3YXkgb2xkZXN0IGhpc3RvcnkpLAorCQkgKiBPUiBpbiAiMSIsIGFuZCBpbmNyZW1lbnQgInN1Y2Nlc3MiIGlmIHRoaXMKKwkJICogZnJhbWUgd2FzIHN1Y2Nlc3NmdWwuICovCisJCXdpbi0+ZGF0YSA8PD0gMTsKKwkJaWYgKHN1Y2Nlc3MgPiAwKSB7CisJCQl3aW4tPnN1Y2Nlc3NfY291bnRlcisrOworCQkJd2luLT5kYXRhIHw9IDB4MTsKKwkJCXN1Y2Nlc3MtLTsKKwkJfQorCisJCXJldHJpZXMtLTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgY3VycmVudCBzdWNjZXNzIHJhdGlvLCBhdm9pZCBkaXZpZGUtYnktMCEgKi8KKwlpZiAod2luLT5jb3VudGVyID4gMCkKKwkJd2luLT5zdWNjZXNzX3JhdGlvID0KKwkJICAgIDEyOCAqICgxMDAgKiB3aW4tPnN1Y2Nlc3NfY291bnRlcikgLyB3aW4tPmNvdW50ZXI7CisJZWxzZQorCQl3aW4tPnN1Y2Nlc3NfcmF0aW8gPSBJTF9JTlZBTElEX1ZBTFVFOworCisJZmFpbF9jb3VudCA9IHdpbi0+Y291bnRlciAtIHdpbi0+c3VjY2Vzc19jb3VudGVyOworCisJLyogQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhyb3VnaHB1dCwgaWYgd2UgaGF2ZSBlbm91Z2ggaGlzdG9yeS4gKi8KKwlpZiAoZmFpbF9jb3VudCA+PSBSQVRFX01JTl9GQUlMVVJFX1RIIHx8CisJICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyID49IFJBVEVfTUlOX1NVQ0NFU1NfVEgpCisJCXdpbi0+YXZlcmFnZV90cHQgPQorCQkgICAgKCh3aW4tPnN1Y2Nlc3NfcmF0aW8gKiByc19zdGEtPmV4cGVjdGVkX3RwdFtpZHhdICsKKwkJICAgICAgNjQpIC8gMTI4KTsKKwllbHNlCisJCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCisJLyogVGFnIHRoaXMgd2luIGFzIGhhdmluZyBiZWVuIHVwZGF0ZWQgKi8KKwl3aW4tPnN0YW1wID0gamlmZmllczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgbmV3IHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcKKyAqLwordm9pZAoraWwzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaWwtPmh3LT5jb25mOworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnBzdGE7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlpbnQgaTsKKworCURfSU5GTygiZW50ZXJcbiIpOworCWlmIChzdGFfaWQgPT0gaWwtPmN0eC5iY2FzdF9zdGFfaWQpCisJCWdvdG8gb3V0OworCisJcHN0YSA9IChzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICopc3RhLT5kcnZfcHJpdjsKKwlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOworCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKKworCXJzX3N0YS0+aWwgPSBpbDsKKworCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IFJBVEVfSU5WQUxJRDsKKworCS8qIGRlZmF1bHQgdG8ganVzdCA4MDIuMTFiICovCisJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2I7CisKKwlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7CisJcnNfc3RhLT5sYXN0X2ZsdXNoID0gamlmZmllczsKKwlyc19zdGEtPmZsdXNoX3RpbWUgPSBSQVRFX0ZMVVNIOworCXJzX3N0YS0+bGFzdF90eF9wYWNrZXRzID0gMDsKKworCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcnNfc3RhOworCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5mdW5jdGlvbiA9IGlsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlRfMzk0NTsgaSsrKQorCQlpbDM5NDVfY2xlYXJfd2luKCZyc19zdGEtPndpbltpXSk7CisKKwkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90CisJICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCisJICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQorCSAqIGFmdGVyIGFzc29jLi4gKi8KKworCWZvciAoaSA9IHNiYW5kLT5uX2JpdHJhdGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0gJiAoMSA8PCBpKSkgeworCQkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOworCS8qIEZvciA1IEdIeiBiYW5kIGl0IHN0YXJ0IGF0IElMX0ZJUlNUX09GRE1fUkFURSAqLworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJaWwtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzID0KKwkJICAgIGlsLT5fMzk0NS5zdGFfc3VwcF9yYXRlcyA8PCBJTF9GSVJTVF9PRkRNX1JBVEU7CisJfQorCitvdXQ6CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisKKwlEX0lORk8oImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQgKgoraWwzOTQ1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXJldHVybiBody0+cHJpdjsKK30KKworLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX2ZyZWUodm9pZCAqaWwpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAqCitpbDM5NDVfcnNfYWxsb2Nfc3RhKHZvaWQgKmlsX3ByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhOworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnBzdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gaWxfcHJpdjsKKworCURfUkFURSgiZW50ZXJcbiIpOworCisJcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKKworCXNwaW5fbG9ja19pbml0KCZyc19zdGEtPmxvY2spOworCWluaXRfdGltZXIoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCk7CisKKwlEX1JBVEUoImxlYXZlXG4iKTsKKworCXJldHVybiByc19zdGE7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfcnNfZnJlZV9zdGEodm9pZCAqaWxfcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhKQoreworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEgPSBpbF9zdGE7CisKKwkvKgorCSAqIEJlIGNhcmVmdWwgbm90IHRvIHVzZSBhbnkgbWVtYmVycyBvZiBpbDM5NDVfcnNfc3RhIChsaWtlIHRyeWluZworCSAqIHRvIHVzZSBpbF9wcml2IHRvIHByaW50IG91dCBkZWJ1Z2dpbmcpIHNpbmNlIGl0IG1heSBub3QgYmUgZnVsbHkKKwkgKiBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LgorCSAqLworCWRlbF90aW1lcl9zeW5jKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gpOworfQorCisvKioKKyAqIGlsMzk0NV9yc190eF9zdGF0dXMgLSBVcGRhdGUgcmF0ZSBjb250cm9sIHZhbHVlcyBiYXNlZCBvbiBUeCByZXN1bHRzCisgKgorICogTk9URTogVXNlcyBpbF9wcml2LT5yZXRyeV9yYXRlIGZvciB0aGUgIyBvZiByZXRyaWVzIGF0dGVtcHRlZCBieQorICogdGhlIGhhcmR3YXJlIGZvciBlYWNoIHJhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnNfdHhfc3RhdHVzKHZvaWQgKmlsX3JhdGUsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhLAorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzOCByZXRyaWVzID0gMCwgY3VycmVudF9jb3VudDsKKwlpbnQgc2NhbGVfcmF0ZV9pZHgsIGZpcnN0X2lkeCwgbGFzdF9pZHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yYXRlOworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEgPSBpbF9zdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCisJRF9SQVRFKCJlbnRlclxuIik7CisKKwlyZXRyaWVzID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50OworCS8qIFNhbml0eSBDaGVjayBmb3IgcmV0cmllcyAqLworCWlmIChyZXRyaWVzID4gUkFURV9SRVRSWV9USCkKKwkJcmV0cmllcyA9IFJBVEVfUkVUUllfVEg7CisKKwlmaXJzdF9pZHggPSBzYmFuZC0+Yml0cmF0ZXNbaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeF0uaHdfdmFsdWU7CisJaWYgKGZpcnN0X2lkeCA8IDAgfHwgZmlyc3RfaWR4ID49IFJBVEVfQ09VTlRfMzk0NSkgeworCQlEX1JBVEUoImxlYXZlOiBSYXRlIG91dCBvZiBib3VuZHM6ICVkXG4iLCBmaXJzdF9pZHgpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpbF9zdGEpIHsKKwkJRF9SQVRFKCJsZWF2ZTogTm8gU1RBIGlsIGRhdGEgdG8gdXBkYXRlIVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLworCWlmICghcnNfc3RhLT5pbCkgeworCQlEX1JBVEUoImxlYXZlOiBTVEEgaWwgZGF0YSB1bmluaXRpYWxpemVkIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlyc19zdGEtPnR4X3BhY2tldHMrKzsKKworCXNjYWxlX3JhdGVfaWR4ID0gZmlyc3RfaWR4OworCWxhc3RfaWR4ID0gZmlyc3RfaWR4OworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHdpbiBmb3IgZWFjaCByYXRlLiAgV2UgZGV0ZXJtaW5lIHdoaWNoIHJhdGVzCisJICogd2VyZSBUeCdkIGJhc2VkIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgcmV0cmllcyB2cy4gdGhlIG51bWJlcgorCSAqIG9mIHJldHJpZXMgY29uZmlndXJlZCBmb3IgZWFjaCByYXRlIC0tIGN1cnJlbnRseSBzZXQgdG8gdGhlCisJICogaWwgdmFsdWUgJ3JldHJ5X3JhdGUnIHZzLiByYXRlIHNwZWNpZmljCisJICoKKwkgKiBPbiBleGl0IGZyb20gdGhpcyB3aGlsZSBsb29wIGxhc3RfaWR4IGluZGljYXRlcyB0aGUgcmF0ZQorCSAqIGF0IHdoaWNoIHRoZSBmcmFtZSB3YXMgZmluYWxseSB0cmFuc21pdHRlZCAob3IgZmFpbGVkIGlmIG5vCisJICogQUNLKQorCSAqLworCXdoaWxlIChyZXRyaWVzID4gMSkgeworCQlpZiAoKHJldHJpZXMgLSAxKSA8IGlsLT5yZXRyeV9yYXRlKSB7CisJCQljdXJyZW50X2NvdW50ID0gKHJldHJpZXMgLSAxKTsKKwkJCWxhc3RfaWR4ID0gc2NhbGVfcmF0ZV9pZHg7CisJCX0gZWxzZSB7CisJCQljdXJyZW50X2NvdW50ID0gaWwtPnJldHJ5X3JhdGU7CisJCQlsYXN0X2lkeCA9IGlsMzk0NV9yc19uZXh0X3JhdGUoaWwsIHNjYWxlX3JhdGVfaWR4KTsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGlzIHJhdGUgYWNjb3VudGluZyBmb3IgYXMgbWFueSByZXRyaWVzCisJCSAqIGFzIHdhcyB1c2VkIGZvciBpdCAocGVyIGN1cnJlbnRfY291bnQpICovCisJCWlsMzk0NV9jb2xsZWN0X3R4X2RhdGEocnNfc3RhLCAmcnNfc3RhLT53aW5bc2NhbGVfcmF0ZV9pZHhdLCAwLAorCQkJCSAgICAgICBjdXJyZW50X2NvdW50LCBzY2FsZV9yYXRlX2lkeCk7CisJCURfUkFURSgiVXBkYXRlIHJhdGUgJWQgZm9yICVkIHJldHJpZXMuXG4iLCBzY2FsZV9yYXRlX2lkeCwKKwkJICAgICAgIGN1cnJlbnRfY291bnQpOworCisJCXJldHJpZXMgLT0gY3VycmVudF9jb3VudDsKKworCQlzY2FsZV9yYXRlX2lkeCA9IGxhc3RfaWR4OworCX0KKworCS8qIFVwZGF0ZSB0aGUgbGFzdCBpZHggd2luIHdpdGggc3VjY2Vzcy9mYWlsdXJlIGJhc2VkIG9uIEFDSyAqLworCURfUkFURSgiVXBkYXRlIHJhdGUgJWQgd2l0aCAlcy5cbiIsIGxhc3RfaWR4LAorCSAgICAgICAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKKwlpbDM5NDVfY29sbGVjdF90eF9kYXRhKHJzX3N0YSwgJnJzX3N0YS0+d2luW2xhc3RfaWR4XSwKKwkJCSAgICAgICBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSywgMSwKKwkJCSAgICAgICBsYXN0X2lkeCk7CisKKwkvKiBXZSB1cGRhdGVkIHRoZSByYXRlIHNjYWxlIHdpbiAtLSBpZiBpdHMgYmVlbiBtb3JlIHRoYW4KKwkgKiBmbHVzaF90aW1lIHNpbmNlIHRoZSBsYXN0IHJ1biwgc2NoZWR1bGUgdGhlIGZsdXNoCisJICogYWdhaW4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXJzX3N0YS0+Zmx1c2hfcGVuZGluZyAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHJzX3N0YS0+bGFzdF9mbHVzaCArIHJzX3N0YS0+Zmx1c2hfdGltZSkpIHsKKworCQlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7CisJCXJzX3N0YS0+Zmx1c2hfcGVuZGluZyA9IDE7CisJCW1vZF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLAorCQkJICBqaWZmaWVzICsgcnNfc3RhLT5mbHVzaF90aW1lKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCURfUkFURSgibGVhdmVcbiIpOworfQorCitzdGF0aWMgdTE2CitpbDM5NDVfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSwgdTggaWR4LCB1MTYgcmF0ZV9tYXNrLAorCQkJIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwl1OCBoaWdoID0gUkFURV9JTlZBTElEOworCXU4IGxvdyA9IFJBVEVfSU5WQUxJRDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSByc19zdGEtPmlsOworCisJLyogODAyLjExQSB3YWxrcyB0byB0aGUgbmV4dCBsaXRlcmFsIGFkamFjZW50IHJhdGUgaW4KKwkgKiB0aGUgcmF0ZSB0YWJsZSAqLworCWlmICh1bmxpa2VseShiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopKSB7CisJCWludCBpOworCQl1MzIgbWFzazsKKworCQkvKiBGaW5kIHRoZSBwcmV2aW91cyByYXRlIHRoYXQgaXMgaW4gdGhlIHJhdGUgbWFzayAqLworCQlpID0gaWR4IC0gMTsKKwkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7CisJCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgeworCQkJCWxvdyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCisJCWkgPSBpZHggKyAxOworCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA8IFJBVEVfQ09VTlRfMzk0NTsgaSsrLCBtYXNrIDw8PSAxKSB7CisJCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgeworCQkJCWhpZ2ggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworCX0KKworCWxvdyA9IGlkeDsKKwl3aGlsZSAobG93ICE9IFJBVEVfSU5WQUxJRCkgeworCQlpZiAocnNfc3RhLT50Z2cpCisJCQlsb3cgPSBpbDM5NDVfcmF0ZXNbbG93XS5wcmV2X3JzX3RnZzsKKwkJZWxzZQorCQkJbG93ID0gaWwzOTQ1X3JhdGVzW2xvd10ucHJldl9yczsKKwkJaWYgKGxvdyA9PSBSQVRFX0lOVkFMSUQpCisJCQlicmVhazsKKwkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGxvdykpCisJCQlicmVhazsKKwkJRF9SQVRFKCJTa2lwcGluZyBtYXNrZWQgbG93ZXIgcmF0ZTogJWRcbiIsIGxvdyk7CisJfQorCisJaGlnaCA9IGlkeDsKKwl3aGlsZSAoaGlnaCAhPSBSQVRFX0lOVkFMSUQpIHsKKwkJaWYgKHJzX3N0YS0+dGdnKQorCQkJaGlnaCA9IGlsMzk0NV9yYXRlc1toaWdoXS5uZXh0X3JzX3RnZzsKKwkJZWxzZQorCQkJaGlnaCA9IGlsMzk0NV9yYXRlc1toaWdoXS5uZXh0X3JzOworCQlpZiAoaGlnaCA9PSBSQVRFX0lOVkFMSUQpCisJCQlicmVhazsKKwkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGhpZ2gpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGhpZ2hlciByYXRlOiAlZFxuIiwgaGlnaCk7CisJfQorCisJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworfQorCisvKioKKyAqIGlsMzk0NV9yc19nZXRfcmF0ZSAtIGZpbmQgdGhlIHJhdGUgZm9yIHRoZSByZXF1ZXN0ZWQgcGFja2V0CisgKgorICogUmV0dXJucyB0aGUgaWVlZTgwMjExX3JhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyLgorICoKKyAqIFRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIGhhcyBubyBpbnRlcm5hbCBtYXBwaW5nIGJldHdlZW4gaHdfbW9kZSdzCisgKiByYXRlIG9yZGVyaW5nIGFuZCB0aGUgcmF0ZSBvcmRlcmluZyB1c2VkIGJ5IHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLgorICoKKyAqIFRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIHVzZXMgYSBzaW5nbGUgdGFibGUgb2YgcmF0ZXMgdGhhdCBnb2VzIGFjcm9zcworICogdGhlIGVudGlyZSBBL0IvRyBzcGVjdHJ1bSB2cy4gYmVpbmcgbGltaXRlZCB0byBqdXN0IG9uZSBwYXJ0aWN1bGFyCisgKiBod19tb2RlLgorICoKKyAqIEFzIHN1Y2gsIHdlIGNhbid0IGNvbnZlcnQgdGhlIGlkeCBvYnRhaW5lZCBiZWxvdyBpbnRvIHRoZSBod19tb2RlJ3MKKyAqIHJhdGUgdGFibGUgYW5kIG11c3QgcmVmZXJlbmNlIHRoZSBkcml2ZXIgYWxsb2NhdGVkIHJhdGUgdGFibGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnNfZ2V0X3JhdGUodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9IHR4cmMtPnNiYW5kOworCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7CisJdTggbG93ID0gUkFURV9JTlZBTElEOworCXU4IGhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisJdTE2IGhpZ2hfbG93OworCWludCBpZHg7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSA9IGlsX3N0YTsKKwlzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGVfZGF0YSAqd2luID0gTlVMTDsKKwlpbnQgY3VycmVudF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCWludCBsb3dfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwlpbnQgaGlnaF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXUzMiBmYWlsX2NvdW50OworCXM4IHNjYWxlX2FjdGlvbiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmF0ZV9tYXNrOworCXM4IG1heF9yYXRlX2lkeCA9IC0xOworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWlsX3I7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCisJRF9SQVRFKCJlbnRlclxuIik7CisKKwkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLworCWlmIChyc19zdGEgJiYgIXJzX3N0YS0+aWwpIHsKKwkJRF9SQVRFKCJSYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gbm90IGluaXRpYWxpemVkIHlldC5cbiIpOworCQlpbF9zdGEgPSBOVUxMOworCX0KKworCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBpbF9zdGEsIHR4cmMpKQorCQlyZXR1cm47CisKKwlyYXRlX21hc2sgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOworCisJLyogZ2V0IHVzZXIgbWF4IHJhdGUgaWYgc2V0ICovCisJbWF4X3JhdGVfaWR4ID0gdHhyYy0+bWF4X3JhdGVfaWR4OworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haICYmIG1heF9yYXRlX2lkeCAhPSAtMSkKKwkJbWF4X3JhdGVfaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwlpZiAobWF4X3JhdGVfaWR4IDwgMCB8fCBtYXhfcmF0ZV9pZHggPj0gUkFURV9DT1VOVCkKKwkJbWF4X3JhdGVfaWR4ID0gLTE7CisKKwlpZHggPSBtaW4ocnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggJiAweGZmZmYsIFJBVEVfQ09VTlRfMzk0NSAtIDEpOworCisJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXJhdGVfbWFzayA9IHJhdGVfbWFzayA8PCBJTF9GSVJTVF9PRkRNX1JBVEU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwkvKiBmb3IgcmVjZW50IGFzc29jLCBjaG9vc2UgYmVzdCByYXRlIHJlZ2FyZGluZworCSAqIHRvIHJzc2kgdmFsdWUKKwkgKi8KKwlpZiAocnNfc3RhLT5zdGFydF9yYXRlICE9IFJBVEVfSU5WQUxJRCkgeworCQlpZiAocnNfc3RhLT5zdGFydF9yYXRlIDwgaWR4ICYmCisJCSAgICAocmF0ZV9tYXNrICYgKDEgPDwgcnNfc3RhLT5zdGFydF9yYXRlKSkpCisJCQlpZHggPSByc19zdGEtPnN0YXJ0X3JhdGU7CisJCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IFJBVEVfSU5WQUxJRDsKKwl9CisKKwkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCisJaWYgKG1heF9yYXRlX2lkeCAhPSAtMSAmJiBtYXhfcmF0ZV9pZHggPCBpZHgpIHsKKwkJaWYgKHJhdGVfbWFzayAmICgxIDw8IG1heF9yYXRlX2lkeCkpCisJCQlpZHggPSBtYXhfcmF0ZV9pZHg7CisJfQorCisJd2luID0gJihyc19zdGEtPndpbltpZHhdKTsKKworCWZhaWxfY291bnQgPSB3aW4tPmNvdW50ZXIgLSB3aW4tPnN1Y2Nlc3NfY291bnRlcjsKKworCWlmIChmYWlsX2NvdW50IDwgUkFURV9NSU5fRkFJTFVSRV9USCAmJgorCSAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciA8IFJBVEVfTUlOX1NVQ0NFU1NfVEgpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwkJRF9SQVRFKCJJbnZhbGlkIGF2ZXJhZ2VfdHB0IG9uIHJhdGUgJWQ6ICIKKwkJICAgICAgICJjb3VudGVyOiAlZCwgc3VjY2Vzc19jb3VudGVyOiAlZCwgIgorCQkgICAgICAgImV4cGVjdGVkX3RwdCBpcyAlc05VTExcbiIsIGlkeCwgd2luLT5jb3VudGVyLAorCQkgICAgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIsCisJCSAgICAgICByc19zdGEtPmV4cGVjdGVkX3RwdCA/ICJub3QgIiA6ICIiKTsKKworCQkvKiBDYW4ndCBjYWxjdWxhdGUgdGhpcyB5ZXQ7IG5vdCBlbm91Z2ggaGlzdG9yeSAqLworCQl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwkJZ290byBvdXQ7CisKKwl9CisKKwljdXJyZW50X3RwdCA9IHdpbi0+YXZlcmFnZV90cHQ7CisKKwloaWdoX2xvdyA9CisJICAgIGlsMzk0NV9nZXRfYWRqYWNlbnRfcmF0ZShyc19zdGEsIGlkeCwgcmF0ZV9tYXNrLCBzYmFuZC0+YmFuZCk7CisJbG93ID0gaGlnaF9sb3cgJiAweGZmOworCWhpZ2ggPSAoaGlnaF9sb3cgPj4gOCkgJiAweGZmOworCisJLyogSWYgdXNlciBzZXQgbWF4IHJhdGUsIGRvbnQgYWxsb3cgaGlnaGVyIHRoYW4gdXNlciBjb25zdHJhaW4gKi8KKwlpZiAobWF4X3JhdGVfaWR4ICE9IC0xICYmIG1heF9yYXRlX2lkeCA8IGhpZ2gpCisJCWhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisKKwkvKiBDb2xsZWN0IE1lYXN1cmVkIHRocm91Z2hwdXRzIG9mIGFkamFjZW50IHJhdGVzICovCisJaWYgKGxvdyAhPSBSQVRFX0lOVkFMSUQpCisJCWxvd190cHQgPSByc19zdGEtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OworCisJaWYgKGhpZ2ggIT0gUkFURV9JTlZBTElEKQorCQloaWdoX3RwdCA9IHJzX3N0YS0+d2luW2hpZ2hdLmF2ZXJhZ2VfdHB0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisKKwlzY2FsZV9hY3Rpb24gPSAwOworCisJLyogTG93IHN1Y2Nlc3MgcmF0aW8gLCBuZWVkIHRvIGRyb3AgdGhlIHJhdGUgKi8KKwlpZiAod2luLT5zdWNjZXNzX3JhdGlvIDwgUkFURV9ERUNSRUFTRV9USCB8fCAhY3VycmVudF90cHQpIHsKKwkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOworCQlzY2FsZV9hY3Rpb24gPSAtMTsKKwkJLyogTm8gdGhyb3VnaHB1dCBtZWFzdXJlZCB5ZXQgZm9yIGFkamFjZW50IHJhdGVzLAorCQkgKiB0cnkgaW5jcmVhc2UgKi8KKwl9IGVsc2UgaWYgKGxvd190cHQgPT0gSUxfSU5WQUxJRF9WQUxVRSAmJiBoaWdoX3RwdCA9PSBJTF9JTlZBTElEX1ZBTFVFKSB7CisKKwkJaWYgKGhpZ2ggIT0gUkFURV9JTlZBTElEICYmCisJCSAgICB3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gUkFURV9JTkNSRUFTRV9USCkKKwkJCXNjYWxlX2FjdGlvbiA9IDE7CisJCWVsc2UgaWYgKGxvdyAhPSBSQVRFX0lOVkFMSUQpCisJCQlzY2FsZV9hY3Rpb24gPSAwOworCisJCS8qIEJvdGggYWRqYWNlbnQgdGhyb3VnaHB1dHMgYXJlIG1lYXN1cmVkLCBidXQgbmVpdGhlciBvbmUgaGFzCisJCSAqIGJldHRlciB0aHJvdWdocHV0OyB3ZSdyZSB1c2luZyB0aGUgYmVzdCByYXRlLCBkb24ndCBjaGFuZ2UKKwkJICogaXQhICovCisJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUgJiYgaGlnaF90cHQgIT0gSUxfSU5WQUxJRF9WQUxVRQorCQkgICAmJiBsb3dfdHB0IDwgY3VycmVudF90cHQgJiYgaGlnaF90cHQgPCBjdXJyZW50X3RwdCkgeworCisJCURfUkFURSgiTm8gYWN0aW9uIC0tIGxvdyBbJWRdICYgaGlnaCBbJWRdIDwgIgorCQkgICAgICAgImN1cnJlbnRfdHB0IFslZF1cbiIsIGxvd190cHQsIGhpZ2hfdHB0LCBjdXJyZW50X3RwdCk7CisJCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkJLyogQXQgbGVhc3Qgb25lIG9mIHRoZSByYXRlcyBoYXMgYmV0dGVyIHRocm91Z2hwdXQgKi8KKwl9IGVsc2UgeworCQlpZiAoaGlnaF90cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCisJCQkvKiBIaWdoIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0LCBJbmNyZWFzZQorCQkJICogcmF0ZSAqLworCQkJaWYgKGhpZ2hfdHB0ID4gY3VycmVudF90cHQgJiYKKwkJCSAgICB3aW4tPnN1Y2Nlc3NfcmF0aW8gPj0gUkFURV9JTkNSRUFTRV9USCkKKwkJCQlzY2FsZV9hY3Rpb24gPSAxOworCQkJZWxzZSB7CisJCQkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgaGlnaCB0cHRcbiIpOworCQkJCXNjYWxlX2FjdGlvbiA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAobG93X3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFKSB7CisJCQlpZiAobG93X3RwdCA+IGN1cnJlbnRfdHB0KSB7CisJCQkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7CisJCQkJc2NhbGVfYWN0aW9uID0gLTE7CisJCQl9IGVsc2UgaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBSQVRFX0lOQ1JFQVNFX1RIKSB7CisJCQkJLyogTG93ZXIgcmF0ZSBoYXMgYmV0dGVyCisJCQkJICogdGhyb3VnaHB1dCxkZWNyZWFzZSByYXRlICovCisJCQkJc2NhbGVfYWN0aW9uID0gMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKKwkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLworCWlmIChzY2FsZV9hY3Rpb24gPT0gLTEgJiYgbG93ICE9IFJBVEVfSU5WQUxJRCAmJgorCSAgICAod2luLT5zdWNjZXNzX3JhdGlvID4gUkFURV9ISUdIX1RIIHx8CisJICAgICBjdXJyZW50X3RwdCA+IDEwMCAqIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2xvd10pKQorCQlzY2FsZV9hY3Rpb24gPSAwOworCisJc3dpdGNoIChzY2FsZV9hY3Rpb24pIHsKKwljYXNlIC0xOgorCisJCS8qIERlY3Jlc2UgcmF0ZSAqLworCQlpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJCWlkeCA9IGxvdzsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCS8qIEluY3JlYXNlIHJhdGUgKi8KKwkJaWYgKGhpZ2ggIT0gUkFURV9JTlZBTElEKQorCQkJaWR4ID0gaGlnaDsKKworCQlicmVhazsKKworCWNhc2UgMDoKKwlkZWZhdWx0OgorCQkvKiBObyBjaGFuZ2UgKi8KKwkJYnJlYWs7CisJfQorCisJRF9SQVRFKCJTZWxlY3RlZCAlZCAoYWN0aW9uICVkKSAtIGxvdyAlZCBoaWdoICVkXG4iLCBpZHgsIHNjYWxlX2FjdGlvbiwKKwkgICAgICAgbG93LCBoaWdoKTsKKworb3V0OgorCisJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJaWYgKFdBUk5fT05fT05DRShpZHggPCBJTF9GSVJTVF9PRkRNX1JBVEUpKQorCQkJaWR4ID0gSUxfRklSU1RfT0ZETV9SQVRFOworCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGlkeDsKKwkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggPSBpZHggLSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJfSBlbHNlIHsKKwkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpZHg7CisJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CisJfQorCisJRF9SQVRFKCJsZWF2ZTogJWRcbiIsIGlkeCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworc3RhdGljIGludAoraWwzOTQ1X29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZmY7CisJaW50IGRlc2MgPSAwOworCWludCBqOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlidWZmID0ga21hbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkgICAgInR4IHBhY2tldHM9JWQgbGFzdCByYXRlIGlkeD0lZFxuIgorCQkgICAgInJhdGU9MHglWCBmbHVzaCB0aW1lICVkXG4iLCBscV9zdGEtPnR4X3BhY2tldHMsCisJCSAgICBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCwgbHFfc3RhLT5zdGFydF9yYXRlLAorCQkgICAgamlmZmllc190b19tc2VjcyhscV9zdGEtPmZsdXNoX3RpbWUpKTsKKwlmb3IgKGogPSAwOyBqIDwgUkFURV9DT1VOVF8zOTQ1OyBqKyspIHsKKwkJZGVzYyArPQorCQkgICAgc3ByaW50ZihidWZmICsgZGVzYywgImNvdW50ZXI9JWQgc3VjY2Vzcz0lZCAlJT0lZFxuIiwKKwkJCSAgICBscV9zdGEtPndpbltqXS5jb3VudGVyLAorCQkJICAgIGxxX3N0YS0+d2luW2pdLnN1Y2Nlc3NfY291bnRlciwKKwkJCSAgICBscV9zdGEtPndpbltqXS5zdWNjZXNzX3JhdGlvKTsKKwl9CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKKwlrZnJlZShidWZmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzID0geworCS5yZWFkID0gaWwzOTQ1X3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkLAorCS5vcGVuID0gaWwzOTQ1X29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYWRkX2RlYnVnZnModm9pZCAqaWwsIHZvaWQgKmlsX3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKQoreworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpscV9zdGEgPSBpbF9zdGE7CisKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIDA2MDAsIGRpciwgbHFfc3RhLAorCQkJCSZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKKworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JlbW92ZV9kZWJ1Z2ZzKHZvaWQgKmlsLCB2b2lkICppbF9zdGEpCit7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKmxxX3N0YSA9IGlsX3N0YTsKKwlkZWJ1Z2ZzX3JlbW92ZShscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlKTsKK30KKyNlbmRpZgorCisvKgorICogSW5pdGlhbGl6YXRpb24gb2YgcmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIGlzIGRvbmUgYnkgZHJpdmVyIGFmdGVyCisgKiB0aGUgc3RhdGlvbiBpcyBhZGRlZC4gU2luY2UgbWFjODAyMTEgY2FsbHMgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYQorICogc3RhdGlvbiBpcyBhZGRlZCB3ZSBpZ25vcmUgaXQuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnNfcmF0ZV9pbml0X3N0dWIodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhKQoreworfQorCitzdGF0aWMgc3RydWN0IHJhdGVfY29udHJvbF9vcHMgcnNfb3BzID0geworCS5tb2R1bGUgPSBOVUxMLAorCS5uYW1lID0gUlNfTkFNRSwKKwkudHhfc3RhdHVzID0gaWwzOTQ1X3JzX3R4X3N0YXR1cywKKwkuZ2V0X3JhdGUgPSBpbDM5NDVfcnNfZ2V0X3JhdGUsCisJLnJhdGVfaW5pdCA9IGlsMzk0NV9yc19yYXRlX2luaXRfc3R1YiwKKwkuYWxsb2MgPSBpbDM5NDVfcnNfYWxsb2MsCisJLmZyZWUgPSBpbDM5NDVfcnNfZnJlZSwKKwkuYWxsb2Nfc3RhID0gaWwzOTQ1X3JzX2FsbG9jX3N0YSwKKwkuZnJlZV9zdGEgPSBpbDM5NDVfcnNfZnJlZV9zdGEsCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKKwkuYWRkX3N0YV9kZWJ1Z2ZzID0gaWwzOTQ1X2FkZF9kZWJ1Z2ZzLAorCS5yZW1vdmVfc3RhX2RlYnVnZnMgPSBpbDM5NDVfcmVtb3ZlX2RlYnVnZnMsCisjZW5kaWYKKworfTsKKwordm9pZAoraWwzOTQ1X3JhdGVfc2NhbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgczMyIHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzMzIgcnNzaSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGlsMzk0NV9zdGFfcHJpdiAqcHN0YTsKKworCURfUkFURSgiZW50ZXJcbiIpOworCisJcmN1X3JlYWRfbG9jaygpOworCisJc3RhID0KKwkgICAgaWVlZTgwMjExX2ZpbmRfc3RhKGlsLT5jdHgudmlmLCBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCWlmICghc3RhKSB7CisJCURfUkFURSgiVW5hYmxlIHRvIGZpbmQgc3RhdGlvbiB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZy5cbiIpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCXBzdGEgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCXJzX3N0YS0+dGdnID0gMDsKKwlzd2l0Y2ggKGlsLT5iYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQkvKiBUT0RPOiB0aGlzIGFsd2F5cyBkb2VzIEcsIG5vdCBhIHJlZ3Jlc3Npb24gKi8KKwkJaWYgKGlsLT5jdHguYWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSB7CisJCQlyc19zdGEtPnRnZyA9IDE7CisJCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGlsMzk0NV9leHBlY3RlZF90cHRfZ19wcm90OworCQl9IGVsc2UKKwkJCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID0gaWwzOTQ1X2V4cGVjdGVkX3RwdF9nOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2E7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX05VTV9CQU5EUzoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJcnNzaSA9IGlsLT5fMzk0NS5sYXN0X3J4X3Jzc2k7CisJaWYgKHJzc2kgPT0gMCkKKwkJcnNzaSA9IElMX01JTl9SU1NJX1ZBTDsKKworCURfUkFURSgiTmV0d29yayBSU1NJOiAlZFxuIiwgcnNzaSk7CisKKwlyc19zdGEtPnN0YXJ0X3JhdGUgPSBpbDM5NDVfZ2V0X3JhdGVfaWR4X2J5X3Jzc2kocnNzaSwgaWwtPmJhbmQpOworCisJRF9SQVRFKCJsZWF2ZTogcnNzaSAlZCBhc3NpZ24gcmF0ZSBpZHg6ICIgIiVkIChwbGNwIDB4JXgpXG4iLCByc3NpLAorCSAgICAgICByc19zdGEtPnN0YXJ0X3JhdGUsIGlsMzk0NV9yYXRlc1tyc19zdGEtPnN0YXJ0X3JhdGVdLnBsY3ApOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitpbnQKK2lsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcigmcnNfb3BzKTsKK30KKwordm9pZAoraWwzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpCit7CisJaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZyc19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzY2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmMKQEAgLTAsMCArMSwyNzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKworLyogU2VuZCBsZWQgY29tbWFuZCAqLworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfbGVkX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9sZWRfY21kICpsZWRfY21kKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfTEVEUywKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGVkX2NtZCksCisJCS5kYXRhID0gbGVkX2NtZCwKKwkJLmZsYWdzID0gQ01EX0FTWU5DLAorCQkuY2FsbGJhY2sgPSBOVUxMLAorCX07CisKKwlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworfQorCitjb25zdCBzdHJ1Y3QgaWxfbGVkX29wcyBpbDM5NDVfbGVkX29wcyA9IHsKKwkuY21kID0gaWwzOTQ1X3NlbmRfbGVkX2NtZCwKK307CisKKyNkZWZpbmUgSUxfREVDTEFSRV9SQVRFX0lORk8ociwgaXAsIGluLCBycCwgcm4sIHBwLCBucCkgICAgXAorCVtSQVRFXyMjciMjTV9JRFhdID0geyBSQVRFXyMjciMjTV9QTENQLCAgIFwKKwkJCQkgICAgUkFURV8jI3IjI01fSUVFRSwgICBcCisJCQkJICAgIFJBVEVfIyNpcCMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI2luIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjcnAjI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNybiMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI3BwIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjbnAjI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNyIyNNX0lEWF9UQkwsIFwKKwkJCQkgICAgUkFURV8jI2lwIyNNX0lEWF9UQkwgfQorCisvKgorICogUGFyYW1ldGVyIG9yZGVyOgorICogICByYXRlLCBwcmV2IHJhdGUsIG5leHQgcmF0ZSwgcHJldiB0Z2cgcmF0ZSwgbmV4dCB0Z2cgcmF0ZQorICoKKyAqIElmIHRoZXJlIGlzbid0IGEgdmFsaWQgbmV4dCBvciBwcmV2aW91cyByYXRlIHRoZW4gSU5WIGlzIHVzZWQgd2hpY2gKKyAqIG1hcHMgdG8gUkFURV9JTlZBTElECisgKgorICovCitjb25zdCBzdHJ1Y3QgaWwzOTQ1X3JhdGVfaW5mbyBpbDM5NDVfcmF0ZXNbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxLCBJTlYsIDIsIElOViwgMiwgSU5WLCAyKSwJLyogIDFtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oMiwgMSwgNSwgMSwgNSwgMSwgNSksCS8qICAybWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDUsIDIsIDYsIDIsIDExLCAyLCAxMSksCS8qNS41bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCA5LCAxMiwgNSwgMTIsIDUsIDE4KSwJLyogMTFtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNiwgNSwgOSwgNSwgMTEsIDUsIDExKSwJLyogIDZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oOSwgNiwgMTEsIDUsIDExLCA1LCAxMSksCS8qICA5bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwJLyogMTJtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oMTgsIDEyLCAyNCwgMTIsIDI0LCAxMSwgMjQpLAkvKiAxOG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygyNCwgMTgsIDM2LCAxOCwgMzYsIDE4LCAzNiksCS8qIDI0bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwJLyogMzZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNDgsIDM2LCA1NCwgMzYsIDU0LCAzNiwgNTQpLAkvKiA0OG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1NCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksCS8qIDU0bWJwcyAqLworfTsKKworc3RhdGljIGlubGluZSB1OAoraWwzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZSh1OCByYXRlX2lkeCkKK3sKKwl1OCByYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wcmV2X2llZWU7CisKKwlpZiAocmF0ZSA9PSBSQVRFX0lOVkFMSUQpCisJCXJhdGUgPSByYXRlX2lkeDsKKwlyZXR1cm4gcmF0ZTsKK30KKworLyogMSA9IGVuYWJsZSB0aGUgaWwzOTQ1X2Rpc2FibGVfZXZlbnRzKCkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgSUxfRVZUX0RJU0FCTEUgKDApCisjZGVmaW5lIElMX0VWVF9ESVNBQkxFX1NJWkUgKDE1MzIvMzIpCisKKy8qKgorICogaWwzOTQ1X2Rpc2FibGVfZXZlbnRzIC0gRGlzYWJsZSBzZWxlY3RlZCBldmVudHMgaW4gdUNvZGUgZXZlbnQgbG9nCisgKgorICogRGlzYWJsZSBhbiBldmVudCBieSB3cml0aW5nICIxInMgaW50byAiZGlzYWJsZSIKKyAqICAgYml0bWFwIGluIFNSQU0uICBCaXQgcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gRXZlbnQgIyAoaWQvdHlwZSkuCisgKiAgIERlZmF1bHQgdmFsdWVzIG9mIDAgZW5hYmxlIHVDb2RlIGV2ZW50cyB0byBiZSBsb2dnZWQuCisgKiBVc2UgZm9yIG9ubHkgc3BlY2lhbCBkZWJ1Z2dpbmcuICBUaGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhcy1pcywKKyAqICAgeW91J2xsIG5lZWQgdG8gcHJvdmlkZSB0aGUgc3BlY2lhbCBiaXRzISAuLi4KKyAqICAgLi4uIGFuZCBzZXQgSUxfRVZUX0RJU0FCTEUgdG8gMS4gKi8KK3ZvaWQKK2lsMzk0NV9kaXNhYmxlX2V2ZW50cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisJdTMyIGJhc2U7CQkvKiBTUkFNIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLworCXUzMiBkaXNhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIG9mIGV2ZW50LWRpc2FibGUgYml0bWFwIGFycmF5ICovCisJdTMyIGFycmF5X3NpemU7CQkvKiAjIG9mIHUzMiBlbnRyaWVzIGluIGFycmF5ICovCisJc3RhdGljIGNvbnN0IHUzMiBldnRfZGlzYWJsZVtJTF9FVlRfRElTQUJMRV9TSVpFXSA9IHsKKwkJMHgwMDAwMDAwMCwJLyogICAzMSAtICAgIDAgIEV2ZW50IGlkIG51bWJlcnMgKi8KKwkJMHgwMDAwMDAwMCwJLyogICA2MyAtICAgMzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogICA5NSAtICAgNjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDEyNyAtICAgOTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDE1OSAtICAxMjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDE5MSAtICAxNjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDIyMyAtICAxOTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDI1NSAtICAyMjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDI4NyAtICAyNTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDMxOSAtICAyODggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDM1MSAtICAzMjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDM4MyAtICAzNTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQxNSAtICAzODQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQ0NyAtICA0MTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQ3OSAtICA0NDggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDUxMSAtICA0ODAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDU0MyAtICA1MTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDU3NSAtICA1NDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDYwNyAtICA1NzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDYzOSAtICA2MDggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDY3MSAtICA2NDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDcwMyAtICA2NzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDczNSAtICA3MDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDc2NyAtICA3MzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDc5OSAtICA3NjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDgzMSAtICA4MDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDg2MyAtICA4MzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDg5NSAtICA4NjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDkyNyAtICA4OTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDk1OSAtICA5MjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDk5MSAtICA5NjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTAyMyAtICA5OTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTA1NSAtIDEwMjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTA4NyAtIDEwNTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTExOSAtIDEwODggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTE1MSAtIDExMjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTE4MyAtIDExNTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTIxNSAtIDExODQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTI0NyAtIDEyMTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTI3OSAtIDEyNDggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTMxMSAtIDEyODAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTM0MyAtIDEzMTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTM3NSAtIDEzNDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQwNyAtIDEzNzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQzOSAtIDE0MDggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQ3MSAtIDE0NDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTUwMyAtIDE0NzIgKi8KKwl9OworCisJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOworCWlmICghaWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlkaXNhYmxlX3B0ciA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAoNCAqIHNpemVvZih1MzIpKSk7CisJYXJyYXlfc2l6ZSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAoNSAqIHNpemVvZih1MzIpKSk7CisKKwlpZiAoSUxfRVZUX0RJU0FCTEUgJiYgYXJyYXlfc2l6ZSA9PSBJTF9FVlRfRElTQUJMRV9TSVpFKSB7CisJCURfSU5GTygiRGlzYWJsaW5nIHNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgYXQgMHgleFxuIiwKKwkJICAgICAgIGRpc2FibGVfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IElMX0VWVF9ESVNBQkxFX1NJWkU7IGkrKykKKwkJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBkaXNhYmxlX3B0ciArIChpICogc2l6ZW9mKHUzMikpLAorCQkJCQkgIGV2dF9kaXNhYmxlW2ldKTsKKworCX0gZWxzZSB7CisJCURfSU5GTygiU2VsZWN0ZWQgdUNvZGUgbG9nIGV2ZW50cyBtYXkgYmUgZGlzYWJsZWRcbiIpOworCQlEX0lORk8oIiAgYnkgd3JpdGluZyBcIjFcInMgaW50byBkaXNhYmxlIGJpdG1hcFxuIik7CisJCURfSU5GTygiICBpbiBTUkFNIGF0IDB4JXgsIHNpemUgJWQgdTMyc1xuIiwgZGlzYWJsZV9wdHIsCisJCSAgICAgICBhcnJheV9zaXplKTsKKwl9CisKK30KKworc3RhdGljIGludAoraWwzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeCh1OCBwbGNwKQoreworCWludCBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFJBVEVfQ09VTlRfMzk0NTsgaWR4KyspCisJCWlmIChpbDM5NDVfcmF0ZXNbaWR4XS5wbGNwID09IHBsY3ApCisJCQlyZXR1cm4gaWR4OworCXJldHVybiAtMTsKK30KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworI2RlZmluZSBUWF9TVEFUVVNfRU5UUlkoeCkgY2FzZSBUWF8zOTQ1X1NUQVRVU19GQUlMXyAjIyB4OiByZXR1cm4gI3gKKworc3RhdGljIGNvbnN0IGNoYXIgKgoraWwzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQoreworCXN3aXRjaCAoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgeworCWNhc2UgVFhfMzk0NV9TVEFUVVNfU1VDQ0VTUzoKKwkJcmV0dXJuICJTVUNDRVNTIjsKKwkJVFhfU1RBVFVTX0VOVFJZKFNIT1JUX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0VOVFJZKExPTkdfTElNSVQpOworCQlUWF9TVEFUVVNfRU5UUlkoRklGT19VTkRFUlJVTik7CisJCVRYX1NUQVRVU19FTlRSWShNR01OVF9BQk9SVCk7CisJCVRYX1NUQVRVU19FTlRSWShORVhUX0ZSQUcpOworCQlUWF9TVEFUVVNfRU5UUlkoTElGRV9FWFBJUkUpOworCQlUWF9TVEFUVVNfRU5UUlkoREVTVF9QUyk7CisJCVRYX1NUQVRVU19FTlRSWShBQk9SVEVEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKEJUX1JFVFJZKTsKKwkJVFhfU1RBVFVTX0VOVFJZKFNUQV9JTlZBTElEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKEZSQUdfRFJPUFBFRCk7CisJCVRYX1NUQVRVU19FTlRSWShUSURfRElTQUJMRSk7CisJCVRYX1NUQVRVU19FTlRSWShGUkFNRV9GTFVTSEVEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKKwkJVFhfU1RBVFVTX0VOVFJZKFRYX0xPQ0tFRCk7CisJCVRYX1NUQVRVU19FTlRSWShOT19CRUFDT05fT05fUkFEQVIpOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2lsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKwlyZXR1cm4gIiI7Cit9CisjZW5kaWYKKworLyoKKyAqIGdldCBpZWVlIHByZXYgcmF0ZSBmcm9tIHJhdGUgc2NhbGUgdGFibGUuCisgKiBmb3IgQSBhbmQgQiBtb2RlIHdlIG5lZWQgdG8gb3ZlcnJpZ2h0IHByZXYKKyAqIHZhbHVlCisgKi8KK2ludAoraWwzOTQ1X3JzX25leHRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCByYXRlKQoreworCWludCBuZXh0X3JhdGUgPSBpbDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKHJhdGUpOworCisJc3dpdGNoIChpbC0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJaWYgKHJhdGUgPT0gUkFURV8xMk1fSURYKQorCQkJbmV4dF9yYXRlID0gUkFURV85TV9JRFg7CisJCWVsc2UgaWYgKHJhdGUgPT0gUkFURV82TV9JRFgpCisJCQluZXh0X3JhdGUgPSBSQVRFXzZNX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlpZiAoIShpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgJiBJTF9PRkRNX1JBVEVTX01BU0spICYmCisJCSAgICBpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCQkJaWYgKHJhdGUgPT0gUkFURV8xMU1fSURYKQorCQkJCW5leHRfcmF0ZSA9IFJBVEVfNU1fSURYOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5leHRfcmF0ZTsKK30KKworLyoqCisgKiBpbDM5NDVfdHhfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVHggcXVldWUgZW50cmllcyBhbHJlYWR5IFR4J2QKKyAqCisgKiBXaGVuIEZXIGFkdmFuY2VzICdSJyBpZHgsIGFsbCBlbnRyaWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgJ1InIGlkeAorICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiBJZiB0aGVyZSBpcworICogZW5vdWdoIGZyZWUgc3BhY2UgKD4gbG93IG1hcmspLCB3YWtlIHRoZSBzdGFjayB0aGF0IGZlZWRzIHVzLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvOworCisJQlVHX09OKHR4cV9pZCA9PSBJTDM5X0NNRF9RVUVVRV9OVU0pOworCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKKwkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKGlsLT5odywgdHhfaW5mby0+c2tiKTsKKwkJdHhfaW5mby0+c2tiID0gTlVMTDsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChpbCwgdHhxKTsKKwl9CisKKwlpZiAoaWxfcXVldWVfc3BhY2UocSkgPiBxLT5sb3dfbWFyayAmJiB0eHFfaWQgPj0gMCAmJgorCSAgICB0eHFfaWQgIT0gSUwzOV9DTURfUVVFVUVfTlVNICYmIGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKQorCQlpbF93YWtlX3F1ZXVlKGlsLCB0eHEpOworfQorCisvKioKKyAqIGlsMzk0NV9oZGxfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfdHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CisJaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7CisJaW50IGlkeCA9IFNFUV9UT19JRFgoc2VxdWVuY2UpOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGlsMzk0NV90eF9yZXNwICp0eF9yZXNwID0gKHZvaWQgKikmcGt0LT51LnJhd1swXTsKKwl1MzIgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+c3RhdHVzKTsKKwlpbnQgcmF0ZV9pZHg7CisJaW50IGZhaWw7CisKKwlpZiAoaWR4ID49IHR4cS0+cS5uX2JkIHx8IGlsX3F1ZXVlX3VzZWQoJnR4cS0+cSwgaWR4KSA9PSAwKSB7CisJCUlMX0VSUigiUmVhZCBpZHggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpZHggJWQgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIHR4cV9pZCwgaWR4LAorCQkgICAgICAgdHhxLT5xLm5fYmQsIHR4cS0+cS53cml0ZV9wdHIsIHR4cS0+cS5yZWFkX3B0cik7CisJCXJldHVybjsKKwl9CisKKwl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKKwlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXMoaW5mbyk7CisKKwkvKiBGaWxsIHRoZSBNUlIgY2hhaW4gd2l0aCBzb21lIGluZm8gYWJvdXQgb24tY2hpcCByZXRyYW5zbWlzc2lvbnMgKi8KKwlyYXRlX2lkeCA9IGlsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgodHhfcmVzcC0+cmF0ZSk7CisJaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJZmFpbCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWU7CisKKwlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7CisJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50ID0gZmFpbCArIDE7CS8qIGFkZCBmaW5hbCBhdHRlbXB0ICovCisKKwkvKiB0eF9zdGF0dXMtPnJ0c19yZXRyeV9jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfcnRzOyAqLworCWluZm8tPmZsYWdzIHw9CisJICAgICgoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgPT0KKwkgICAgIFRYX1NUQVRVU19TVUNDRVNTKSA/IElFRUU4MDIxMV9UWF9TVEFUX0FDSyA6IDA7CisKKwlEX1RYKCJUeCBxdWV1ZSAlZCBTdGF0dXMgJXMgKDB4JTA4eCkgcGxjcCByYXRlICVkIHJldHJpZXMgJWRcbiIsIHR4cV9pZCwKKwkgICAgIGlsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24oc3RhdHVzKSwgc3RhdHVzLCB0eF9yZXNwLT5yYXRlLAorCSAgICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisKKwlEX1RYX1JFUExZKCJUeCBxdWV1ZSByZWNsYWltICVkXG4iLCBpZHgpOworCWlsMzk0NV90eF9xdWV1ZV9yZWNsYWltKGlsLCB0eHFfaWQsIGlkeCk7CisKKwlpZiAoc3RhdHVzICYgVFhfQUJPUlRfUkVRVUlSRURfTVNLKQorCQlJTF9FUlIoIlRPRE86ICBJbXBsZW1lbnQgVHggQUJPUlQgUkVRVUlSRUQhISFcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnRlbCBQUk8vV2lyZWxlc3MgMzk0NUFCRy9CRyBOZXR3b3JrIENvbm5lY3Rpb24KKyAqCisgKiAgUlggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKK3N0YXRpYyB2b2lkCitpbDM5NDVfYWNjdW11bGF0aXZlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgX19sZTMyICogc3RhdHMpCit7CisJaW50IGk7CisJX19sZTMyICpwcmV2X3N0YXRzOworCXUzMiAqYWNjdW1fc3RhdHM7CisJdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKKworCXByZXZfc3RhdHMgPSAoX19sZTMyICopICZpbC0+XzM5NDUuc3RhdHM7CisJYWNjdW1fc3RhdHMgPSAodTMyICopICZpbC0+XzM5NDUuYWNjdW1fc3RhdHM7CisJZGVsdGEgPSAodTMyICopICZpbC0+XzM5NDUuZGVsdGFfc3RhdHM7CisJbWF4X2RlbHRhID0gKHUzMiAqKSAmaWwtPl8zOTQ1Lm1heF9kZWx0YTsKKworCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMpOworCSAgICAgaSArPQorCSAgICAgc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywgbWF4X2RlbHRhKyssCisJICAgICBhY2N1bV9zdGF0cysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7CisJCQkqZGVsdGEgPQorCQkJICAgIChsZTMyX3RvX2NwdSgqc3RhdHMpIC0gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKKwkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7CisJCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKKwkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOworCQl9CisJfQorCisJLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0cyAqLworCWlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsLnRlbXBlcmF0dXJlID0KKwkgICAgaWwtPl8zOTQ1LnN0YXRzLmdlbmVyYWwudGVtcGVyYXR1cmU7CisJaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLmdlbmVyYWwudHRsX3RpbWVzdGFtcCA9CisJICAgIGlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsLnR0bF90aW1lc3RhbXA7Cit9CisjZW5kaWYKKwordm9pZAoraWwzOTQ1X2hkbF9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCisJRF9SWCgiU3RhdGlzdGljcyBub3RpZmljYXRpb24gcmVjZWl2ZWQgKCVkIHZzICVkKS5cbiIsCisJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSwKKwkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0spOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJaWwzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0cyhpbCwgKF9fbGUzMiAqKSAmcGt0LT51LnJhdyk7CisjZW5kaWYKKworCW1lbWNweSgmaWwtPl8zOTQ1LnN0YXRzLCBwa3QtPnUucmF3LCBzaXplb2YoaWwtPl8zOTQ1LnN0YXRzKSk7Cit9CisKK3ZvaWQKK2lsMzk0NV9oZGxfY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCV9fbGUzMiAqZmxhZyA9IChfX2xlMzIgKikgJnBrdC0+dS5yYXc7CisKKwlpZiAobGUzMl90b19jcHUoKmZsYWcpICYgVUNPREVfU1RBVFNfQ0xFQVJfTVNLKSB7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJbWVtc2V0KCZpbC0+XzM5NDUuYWNjdW1fc3RhdHMsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cykpOworCQltZW1zZXQoJmlsLT5fMzk0NS5kZWx0YV9zdGF0cywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSk7CisJCW1lbXNldCgmaWwtPl8zOTQ1Lm1heF9kZWx0YSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSk7CisjZW5kaWYKKwkJRF9SWCgiU3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7CisJfQorCWlsMzk0NV9oZGxfc3RhdHMoaWwsIHJ4Yik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNaXNjLiBpbnRlcm5hbCBzdGF0ZSBhbmQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgZm9yIGEgbnVtYmVyIG9mIHN0YXRzLCBzZWUgdGhlIGNhbGxlci4gKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9pc19uZXR3b3JrX3BhY2tldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7CisJLyogRmlsdGVyIGluY29taW5nIHBhY2tldHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRhcmdldGVkIHRvd2FyZAorCSAqIHRoaXMgbmV0d29yaywgZGlzY2FyZGluZyBwYWNrZXRzIGNvbWluZyBmcm9tIG91cnNlbHZlcyAqLworCXN3aXRjaCAoaWwtPml3X21vZGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgkvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KKwkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKwkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMywgaWwtPmJzc2lkKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CS8qIEhlYWRlcjogRGVzdC4gfCBBUHtCU1NJRH0gfCBTb3VyY2UgKi8KKwkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKwkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMiwgaWwtPmJzc2lkKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKUlMX1JYX0RBVEEocGt0KTsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSUxfUlhfSERSKHBrdCk7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgKnJ4X2VuZCA9IElMX1JYX0VORChwa3QpOworCXUxNiBsZW4gPSBsZTE2X3RvX2NwdShyeF9oZHItPmxlbik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKwkvKiBXZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIEhXLCBzbyBzdG9wIHRoZSB3YXRjaGRvZyAqLworCWlmICh1bmxpa2VseQorCSAgICAobGVuICsgSUwzOV9SWF9GUkFNRV9TSVpFID4KKwkgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpKSB7CisJCURfRFJPUCgiQ29ycnVwdGlvbiBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KKwlpZiAodW5saWtlbHkoIWlsLT5pc19vcGVuKSkgeworCQlEX0RST1AoIkRyb3BwaW5nIHBhY2tldCB3aGlsZSBpbnRlcmZhY2UgaXMgbm90IG9wZW4uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikgeworCQlJTF9FUlIoImRldl9hbGxvY19za2IgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKQorCQlpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoaWwsIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXJ4Yl9hZGRyKHJ4YiksCisJCQkJICAgICAgbGUzMl90b19jcHUocnhfZW5kLT5zdGF0dXMpLCBzdGF0cyk7CisKKwlza2JfYWRkX3J4X2ZyYWcoc2tiLCAwLCByeGItPnBhZ2UsCisJCQkodm9pZCAqKXJ4X2hkci0+cGF5bG9hZCAtICh2b2lkICopcGt0LCBsZW4pOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCBmYWxzZSwgZmMsIGxlbik7CisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOworCisJaWVlZTgwMjExX3J4KGlsLT5odywgc2tiKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKKwlyeGItPnBhZ2UgPSBOVUxMOworfQorCisjZGVmaW5lIElMX0RFTEFZX05FWFRfU0NBTl9BRlRFUl9BU1NPQyAoSFoqNikKKworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX3N0YXRzICpyeF9zdGF0cyA9IElMX1JYX1NUQVRTKHBrdCk7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgKnJ4X2hkciA9IElMX1JYX0hEUihwa3QpOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kICpyeF9lbmQgPSBJTF9SWF9FTkQocGt0KTsKKwl1MTYgcnhfc3RhdHNfc2lnX2F2ZyBfX21heWJlX3VudXNlZCA9IGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5zaWdfYXZnKTsKKwl1MTYgcnhfc3RhdHNfbm9pc2VfZGlmZiBfX21heWJlX3VudXNlZCA9CisJICAgIGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5ub2lzZV9kaWZmKTsKKwl1OCBuZXR3b3JrX3BhY2tldDsKKworCXJ4X3N0YXR1cy5mbGFnID0gMDsKKwlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKKwlyeF9zdGF0dXMuYmFuZCA9CisJICAgIChyeF9oZHItPgorCSAgICAgcGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPyBJRUVFODAyMTFfQkFORF8yR0haIDoKKwkgICAgSUVFRTgwMjExX0JBTkRfNUdIWjsKKwlyeF9zdGF0dXMuZnJlcSA9CisJICAgIGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAorCQkJCQkgICByeF9zdGF0dXMuYmFuZCk7CisKKwlyeF9zdGF0dXMucmF0ZV9pZHggPSBpbDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHJ4X2hkci0+cmF0ZSk7CisJaWYgKHJ4X3N0YXR1cy5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXJ4X3N0YXR1cy5yYXRlX2lkeCAtPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisKKwlyeF9zdGF0dXMuYW50ZW5uYSA9CisJICAgIChsZTE2X3RvX2NwdShyeF9oZHItPnBoeV9mbGFncykgJiBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLKSA+PgorCSAgICA0OworCisJLyogc2V0IHRoZSBwcmVhbWJsZSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHJ4X2hkci0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CisKKwlpZiAoKHVubGlrZWx5KHJ4X3N0YXRzLT5waHlfY291bnQgPiAyMCkpKSB7CisJCURfRFJPUCgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogJWQvbiIsCisJCSAgICAgICByeF9zdGF0cy0+cGh5X2NvdW50KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKHJ4X2VuZC0+c3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19DUkMzMl9FUlJPUikgfHwKKwkgICAgIShyeF9lbmQtPnN0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XKSkgeworCQlEX1JYKCJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsIHJ4X2VuZC0+c3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbnZlcnQgMzk0NSdzIHJzc2kgaW5kaWNhdG9yIHRvIGRCbSAqLworCXJ4X3N0YXR1cy5zaWduYWwgPSByeF9zdGF0cy0+cnNzaSAtIElMMzlfUlNTSV9PRkZTRVQ7CisKKwlEX1NUQVRTKCJSc3NpICVkIHNpZ19hdmcgJWQgbm9pc2VfZGlmZiAlZFxuIiwgcnhfc3RhdHVzLnNpZ25hbCwKKwkJcnhfc3RhdHNfc2lnX2F2Zywgcnhfc3RhdHNfbm9pc2VfZGlmZik7CisKKwloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilJTF9SWF9EQVRBKHBrdCk7CisKKwluZXR3b3JrX3BhY2tldCA9IGlsMzk0NV9pc19uZXR3b3JrX3BhY2tldChpbCwgaGVhZGVyKTsKKworCURfU1RBVFMoIlslY10gJWQgUlNTSTolZCBTaWduYWw6JXUsIFJhdGU6JXVcbiIsCisJCW5ldHdvcmtfcGFja2V0ID8gJyonIDogJyAnLCBsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAorCQlyeF9zdGF0dXMuc2lnbmFsLCByeF9zdGF0dXMuc2lnbmFsLCByeF9zdGF0dXMucmF0ZV9pZHgpOworCisJaWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKGlsLCBsZTE2X3RvX2NwdShyeF9oZHItPmxlbiksIGhlYWRlcik7CisKKwlpZiAobmV0d29ya19wYWNrZXQpIHsKKwkJaWwtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUgPQorCQkgICAgbGUzMl90b19jcHUocnhfZW5kLT5iZWFjb25fdGltZXN0YW1wKTsKKwkJaWwtPl8zOTQ1Lmxhc3RfdHNmID0gbGU2NF90b19jcHUocnhfZW5kLT50aW1lc3RhbXApOworCQlpbC0+XzM5NDUubGFzdF9yeF9yc3NpID0gcnhfc3RhdHVzLnNpZ25hbDsKKwl9CisKKwlpbDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoaWwsIHJ4YiwgJnJ4X3N0YXR1cyk7Cit9CisKK2ludAoraWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCWRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCkKK3sKKwlpbnQgY291bnQ7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCXN0cnVjdCBpbDM5NDVfdGZkICp0ZmQsICp0ZmRfdG1wOworCisJcSA9ICZ0eHEtPnE7CisJdGZkX3RtcCA9IChzdHJ1Y3QgaWwzOTQ1X3RmZCAqKXR4cS0+dGZkczsKKwl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOworCisJaWYgKHJlc2V0KQorCQltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOworCisJY291bnQgPSBURkRfQ1RMX0NPVU5UX0dFVChsZTMyX3RvX2NwdSh0ZmQtPmNvbnRyb2xfZmxhZ3MpKTsKKworCWlmIChjb3VudCA+PSBOVU1fVEZEX0NIVU5LUyB8fCBjb3VudCA8IDApIHsKKwkJSUxfRVJSKCJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKKwkJICAgICAgIE5VTV9URkRfQ0hVTktTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGZkLT50YnNbY291bnRdLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwl0ZmQtPnRic1tjb3VudF0ubGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKworCWNvdW50Kys7CisKKwl0ZmQtPmNvbnRyb2xfZmxhZ3MgPQorCSAgICBjcHVfdG9fbGUzMihURkRfQ1RMX0NPVU5UX1NFVChjb3VudCkgfCBURkRfQ1RMX1BBRF9TRVQocGFkKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfdHhxX2ZyZWVfdGZkIC0gRnJlZSBvbmUgVEZELCB0aG9zZSBhdCBpZHggW3R4cS0+cS5yZWFkX3B0cl0KKyAqCisgKiBEb2VzIE5PVCBhZHZhbmNlIGFueSBpZHhlcworICovCit2b2lkCitpbDM5NDVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJc3RydWN0IGlsMzk0NV90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGlsMzk0NV90ZmQgKil0eHEtPnRmZHM7CisJaW50IGlkeCA9IHR4cS0+cS5yZWFkX3B0cjsKKwlzdHJ1Y3QgaWwzOTQ1X3RmZCAqdGZkID0gJnRmZF90bXBbaWR4XTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaWwtPnBjaV9kZXY7CisJaW50IGk7CisJaW50IGNvdW50ZXI7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwljb3VudGVyID0gVEZEX0NUTF9DT1VOVF9HRVQobGUzMl90b19jcHUodGZkLT5jb250cm9sX2ZsYWdzKSk7CisJaWYgKGNvdW50ZXIgPiBOVU1fVEZEX0NIVU5LUykgeworCQlJTF9FUlIoIlRvbyBtYW55IGNodW5rczogJWlcbiIsIGNvdW50ZXIpOworCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFVubWFwIHR4X2NtZCAqLworCWlmIChjb3VudGVyKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpZHhdLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2lkeF0sIGxlbiksCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJLyogdW5tYXAgY2h1bmtzIGlmIGFueSAqLworCisJZm9yIChpID0gMTsgaSA8IGNvdW50ZXI7IGkrKykKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmFkZHIpLAorCQkJCSBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5sZW4pLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIGZyZWUgU0tCICovCisJaWYgKHR4cS0+dHhiKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2I7CisKKwkJLyogY2FuIGJlIGNhbGxlZCBmcm9tIGlycXMtZGlzYWJsZWQgY29udGV4dCAqLworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOworCQl9CisJfQorfQorCisvKioKKyAqIGlsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZSAtIEFkZCByYXRlIHBvcnRpb24gdG8gVFhfQ01EOgorICoKKyovCit2b2lkCitpbDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQgc3RhX2lkLCBpbnQgdHhfaWQpCit7CisJdTE2IGh3X3ZhbHVlID0gaWVlZTgwMjExX2dldF90eF9yYXRlKGlsLT5odywgaW5mbyktPmh3X3ZhbHVlOworCXUxNiByYXRlX2lkeCA9IG1pbihod192YWx1ZSAmIDB4ZmZmZiwgUkFURV9DT1VOVF8zOTQ1KTsKKwl1MTYgcmF0ZV9tYXNrOworCWludCByYXRlOworCXU4IHJ0c19yZXRyeV9saW1pdDsKKwl1OCBkYXRhX3JldHJ5X2xpbWl0OworCV9fbGUzMiB0eF9mbGFnczsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisJc3RydWN0IGlsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisKKwlyYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOworCXR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKKworCS8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZ2V0IHRoZSBzdGEtPnN1cHBfcmF0ZXMgd2hpbGUKKwkgKiBpbiB0aGlzIHJ1bm5pbmcgY29udGV4dCAqLworCXJhdGVfbWFzayA9IFJBVEVTX01BU0tfMzk0NTsKKworCS8qIFNldCByZXRyeSBsaW1pdCBvbiBEQVRBIHBhY2tldHMgYW5kIFByb2JlIFJlc3BvbnNlcyAqLworCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCisJCWRhdGFfcmV0cnlfbGltaXQgPSAzOworCWVsc2UKKwkJZGF0YV9yZXRyeV9saW1pdCA9IElMX0RFRkFVTFRfVFhfUkVUUlk7CisJdHhfY21kLT5kYXRhX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKKworCWlmICh0eF9pZCA+PSBJTDM5X0NNRF9RVUVVRV9OVU0pCisJCXJ0c19yZXRyeV9saW1pdCA9IDM7CisJZWxzZQorCQlydHNfcmV0cnlfbGltaXQgPSA3OworCisJaWYgKGRhdGFfcmV0cnlfbGltaXQgPCBydHNfcmV0cnlfbGltaXQpCisJCXJ0c19yZXRyeV9saW1pdCA9IGRhdGFfcmV0cnlfbGltaXQ7CisJdHhfY21kLT5ydHNfcmV0cnlfbGltaXQgPSBydHNfcmV0cnlfbGltaXQ7CisKKwl0eF9jbWQtPnJhdGUgPSByYXRlOworCXR4X2NtZC0+dHhfZmxhZ3MgPSB0eF9mbGFnczsKKworCS8qIE9GRE0gKi8KKwl0eF9jbWQtPnN1cHBfcmF0ZXNbMF0gPQorCSAgICAoKHJhdGVfbWFzayAmIElMX09GRE1fUkFURVNfTUFTSykgPj4gSUxfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7CisKKwkvKiBDQ0sgKi8KKwl0eF9jbWQtPnN1cHBfcmF0ZXNbMV0gPSAocmF0ZV9tYXNrICYgMHhGKTsKKworCURfUkFURSgiVHggc3RhIGlkOiAlZCwgcmF0ZTogJWQgKHBsY3ApLCBmbGFnczogMHglNFggIgorCSAgICAgICAiY2NrL29mZG0gbWFzazogMHgleC8weCV4XG4iLCBzdGFfaWQsIHR4X2NtZC0+cmF0ZSwKKwkgICAgICAgbGUzMl90b19jcHUodHhfY21kLT50eF9mbGFncyksIHR4X2NtZC0+c3VwcF9yYXRlc1sxXSwKKwkgICAgICAgdHhfY21kLT5zdXBwX3JhdGVzWzBdKTsKK30KKworc3RhdGljIHU4CitpbDM5NDVfc3luY19zdGEoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCB1MTYgdHhfcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJc3RydWN0IGlsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CisKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKKwkJcmV0dXJuIElMX0lOVkFMSURfU1RBVElPTjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCXN0YXRpb24gPSAmaWwtPnN0YXRpb25zW3N0YV9pZF07CisKKwlzdGF0aW9uLT5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9UWF9SQVRFX01TSzsKKwlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYodHhfcmF0ZSk7CisJc3RhdGlvbi0+c3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCWlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YXRpb24tPnN0YSwgQ01EX0FTWU5DKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCisJRF9SQVRFKCJTQ0FMRSBzeW5jIHN0YXRpb24gJWQgdG8gcmF0ZSAlZFxuIiwgc3RhX2lkLCB0eF9yYXRlKTsKKwlyZXR1cm4gc3RhX2lkOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X3NldF9wd3Jfdm1haW4oc3RydWN0IGlsX3ByaXYgKmlsKQoreworLyoKKyAqIChmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcykKKyAqIHRvIHNldCBwb3dlciB0byBWX0FVWCwgZG8KKworCQlpZiAocGNpX3BtZV9jYXBhYmxlKGlsLT5wY2lfZGV2LCBQQ0lfRDNjb2xkKSkgeworCQkJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJCQlBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVkFVWCwKKwkJCQkJfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7CisKKwkJCV9pbF9wb2xsX2JpdChpbCwgQ1NSX0dQSU9fSU4sCisJCQkJICAgICBDU1JfR1BJT19JTl9WQUxfVkFVWF9QV1JfU1JDLAorCQkJCSAgICAgQ1NSX0dQSU9fSU5fQklUX0FVWF9QT1dFUiwgNTAwMCk7CisJCX0KKyAqLworCisJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAorCQkJICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7CisKKwlfaWxfcG9sbF9iaXQoaWwsIENTUl9HUElPX0lOLCBDU1JfR1BJT19JTl9WQUxfVk1BSU5fUFdSX1NSQywKKwkJICAgICBDU1JfR1BJT19JTl9CSVRfQVVYX1BPV0VSLCA1MDAwKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3J4X2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwlpbF93cihpbCwgRkgzOV9SQ1NSX1JCRF9CQVNFKDApLCByeHEtPmJkX2RtYSk7CisJaWxfd3IoaWwsIEZIMzlfUkNTUl9SUFRSX0FERFIoMCksIHJ4cS0+cmJfc3R0c19kbWEpOworCWlsX3dyKGlsLCBGSDM5X1JDU1JfV1BUUigwKSwgMCk7CisJaWxfd3IoaWwsIEZIMzlfUkNTUl9DT05GSUcoMCksCisJICAgICAgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOX0VOQUJMRSB8CisJICAgICAgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JEUkJEX0VOX0VOQUJMRSB8CisJICAgICAgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfQklUX1dSX1NUVFNfRU4gfAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOCB8IChSWF9RVUVVRV9TSVpFX0xPRworCQkJCQkJCSAgICAgICA8PAorCQkJCQkJCSAgICAgICBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfUkJEQ19TSVpFKQorCSAgICAgIHwgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0lSUV9ERVNUX0lOVF9IT1NUIHwgKDEgPDwKKwkJCQkJCQkJIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1BPU19JUlFfUkJUSCkKKwkgICAgICB8IEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9GSCk7CisKKwkvKiBmYWtlIHJlYWQgdG8gZmx1c2ggYWxsIHByZXYgSS9PICovCisJaWxfcmQoaWwsIEZIMzlfUlNTUl9DVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfdHhfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCisJLyogYnlwYXNzIG1vZGUgKi8KKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX01PREVfUkVHLCAweDIpOworCisJLyogUkEgMCBpcyBhY3RpdmUgKi8KKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX0FSQVNUQVRfUkVHLCAweDAxKTsKKworCS8qIGFsbCA2IGZpZm8gYXJlIGFjdGl2ZSAqLworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMHgzZik7CisKKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX1NCWVBfTU9ERV8xX1JFRywgMHgwMTAwMDApOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfU0JZUF9NT0RFXzJfUkVHLCAweDAzMDAwMik7CisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9UWEY0TUZfUkVHLCAweDAwMDAwNCk7CisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9UWEY1TUZfUkVHLCAweDAwMDAwNSk7CisKKwlpbF93cihpbCwgRkgzOV9UU1NSX0NCQl9CQVNFLCBpbC0+XzM5NDUuc2hhcmVkX3BoeXMpOworCisJaWxfd3IoaWwsIEZIMzlfVFNTUl9NU0dfQ09ORklHLAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVFhQRF9PTiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OIHwKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX01BWF9GUkFHX1NJWkVfMTI4QiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9URkRfT04gfAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfQ0JCX09OIHwKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JTUF9XQUlUX1RIIHwKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1JTUF9XQUlUX1RIKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsMzk0NV90eHFfY3R4X3Jlc2V0IC0gUmVzZXQgVFggcXVldWUgY29udGV4dAorICoKKyAqIERlc3Ryb3lzIGFsbCBETUEgc3RydWN0dXJlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtIGFnYWluCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmM7CisJaW50IHR4cV9pZCwgc2xvdHNfbnVtOworCisJaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwkvKiBhbGxvY2F0ZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KKwlyYyA9IGlsX2FsbG9jX3R4cV9tZW0oaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVHggQ01EIHF1ZXVlICovCisJcmMgPSBpbDM5NDVfdHhfcmVzZXQoaWwpOworCWlmIChyYykKKwkJZ290byBlcnJvcjsKKworCS8qIFR4IHF1ZXVlKHMpICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgeworCQlzbG90c19udW0gPQorCQkgICAgKHR4cV9pZCA9PQorCQkgICAgIElMMzlfQ01EX1FVRVVFX05VTSkgPyBURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKKwkJcmMgPSBpbF90eF9xdWV1ZV9pbml0KGlsLCAmaWwtPnR4cVt0eHFfaWRdLCBzbG90c19udW0sIHR4cV9pZCk7CisJCWlmIChyYykgeworCQkJSUxfRVJSKCJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7CisKK2Vycm9yOgorCWlsMzk0NV9od190eHFfY3R4X2ZyZWUoaWwpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFN0YXJ0IHVwIDM5NDUncyBiYXNpYyBmdW5jdGlvbmFsaXR5IGFmdGVyIGl0IGhhcyBiZWVuIHJlc2V0CisgKiAoZS5nLiBhZnRlciBwbGF0Zm9ybSBib290LCBvciBzaHV0ZG93biB2aWEgaWxfYXBtX3N0b3AoKSkKKyAqIE5PVEU6ICBUaGlzIGRvZXMgbm90IGxvYWQgdUNvZGUgbm9yIHN0YXJ0IHRoZSBlbWJlZGRlZCBwcm9jZXNzb3IKKyAqLworc3RhdGljIGludAoraWwzOTQ1X2FwbV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gaWxfYXBtX2luaXQoaWwpOworCisJLyogQ2xlYXIgQVBNRyAoTklDJ3MgaW50ZXJuYWwgcG93ZXIgbWFuYWdlbWVudCkgaW50ZXJydXB0cyAqLworCWlsX3dyX3BycGgoaWwsIEFQTUdfUlRDX0lOVF9NU0tfUkVHLCAweDApOworCWlsX3dyX3BycGgoaWwsIEFQTUdfUlRDX0lOVF9TVFRfUkVHLCAweEZGRkZGRkZGKTsKKworCS8qIFJlc2V0IHJhZGlvIGNoaXAgKi8KKwlpbF9zZXRfYml0c19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLCBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7CisJdWRlbGF5KDUpOworCWlsX2NsZWFyX2JpdHNfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywgQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9uaWNfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHJldl9pZCA9IGlsLT5wY2lfZGV2LT5yZXZpc2lvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogRGV0ZXJtaW5lIEhXIHR5cGUgKi8KKwlEX0lORk8oIkhXIFJldmlzaW9uIElEID0gMHglWFxuIiwgcmV2X2lkKTsKKworCWlmIChyZXZfaWQgJiBQQ0lfQ0ZHX1JFVl9JRF9CSVRfUlRQKQorCQlEX0lORk8oIlJUUCB0eXBlXG4iKTsKKwllbHNlIGlmIChyZXZfaWQgJiBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVKSB7CisJCURfSU5GTygiMzk0NSBSQURJTy1NQiB0eXBlXG4iKTsKKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF8zOTQ1X01CKTsKKwl9IGVsc2UgeworCQlEX0lORk8oIjM5NDUgUkFESU8tTU0gdHlwZVxuIik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NTSk7CisJfQorCisJaWYgKEVFUFJPTV9TS1VfQ0FQX09QX01PREVfTVJDID09IGVlcHJvbS0+c2t1X2NhcCkgeworCQlEX0lORk8oIlNLVSBPUCBtb2RlIGlzIG1yY1xuIik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfU0tVX01SQyk7CisJfSBlbHNlCisJCURfSU5GTygiU0tVIE9QIG1vZGUgaXMgYmFzaWNcbiIpOworCisJaWYgKChlZXByb20tPmJvYXJkX3JldmlzaW9uICYgMHhGMCkgPT0gMHhEMCkgeworCQlEX0lORk8oIjM5NDVBQkcgcmV2aXNpb24gaXMgMHglWFxuIiwgZWVwcm9tLT5ib2FyZF9yZXZpc2lvbik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfQk9BUkRfVFlQRSk7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCIzOTQ1QUJHIHJldmlzaW9uIGlzIDB4JVhcbiIsIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOworCQlpbF9jbGVhcl9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFKTsKKwl9CisKKwlpZiAoZWVwcm9tLT5hbG1nb3JfbV92ZXJzaW9uIDw9IDEpIHsKKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0EpOworCQlEX0lORk8oIkNhcmQgTSB0eXBlIEEgdmVyc2lvbiBpcyAweCVYXG4iLAorCQkgICAgICAgZWVwcm9tLT5hbG1nb3JfbV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlEX0lORk8oIkNhcmQgTSB0eXBlIEIgdmVyc2lvbiBpcyAweCVYXG4iLAorCQkgICAgICAgZWVwcm9tLT5hbG1nb3JfbV92ZXJzaW9uKTsKKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0IpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGVlcHJvbS0+c2t1X2NhcCAmIEVFUFJPTV9TS1VfQ0FQX1NXX1JGX0tJTExfRU5BQkxFKQorCQlEX1JGX0tJTEwoIlNXIFJGIEtJTEwgc3VwcG9ydGVkIGluIEVFUFJPTS5cbiIpOworCisJaWYgKGVlcHJvbS0+c2t1X2NhcCAmIEVFUFJPTV9TS1VfQ0FQX0hXX1JGX0tJTExfRU5BQkxFKQorCQlEX1JGX0tJTEwoIkhXIFJGIEtJTEwgc3VwcG9ydGVkIGluIEVFUFJPTS5cbiIpOworfQorCitpbnQKK2lsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsLT5jZmctPm9wcy0+bGliLT5hcG1fb3BzLmluaXQoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbDM5NDVfc2V0X3B3cl92bWFpbihpbCk7CisKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5jb25maWcoaWwpOworCisJLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCWlmICghcnhxLT5iZCkgeworCQlyYyA9IGlsX3J4X3F1ZXVlX2FsbG9jKGlsKTsKKwkJaWYgKHJjKSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIFJ4IHF1ZXVlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlCisJCWlsMzk0NV9yeF9xdWV1ZV9yZXNldChpbCwgcnhxKTsKKworCWlsMzk0NV9yeF9yZXBsZW5pc2goaWwpOworCisJaWwzOTQ1X3J4X2luaXQoaWwsIHJ4cSk7CisKKwkvKiBMb29rIGF0IHVzaW5nIHRoaXMgaW5zdGVhZDoKKwkgICByeHEtPm5lZWRfdXBkYXRlID0gMTsKKwkgICBpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKGlsLCByeHEpOworCSAqLworCisJaWxfd3IoaWwsIEZIMzlfUkNTUl9XUFRSKDApLCByeHEtPndyaXRlICYgfjcpOworCisJcmMgPSBpbDM5NDVfdHhxX2N0eF9yZXNldChpbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzZXRfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZSAtIEZyZWUgVFhRIENvbnRleHQKKyAqCisgKiBEZXN0cm95IGFsbCBUWCBETUEgcXVldWVzIGFuZCBzdHJ1Y3R1cmVzCisgKi8KK3ZvaWQKK2lsMzk0NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0eHFfaWQ7CisKKwkvKiBUeCBxdWV1ZXMgKi8KKwlpZiAoaWwtPnR4cSkKKwkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKKwkJCWlmICh0eHFfaWQgPT0gSUwzOV9DTURfUVVFVUVfTlVNKQorCQkJCWlsX2NtZF9xdWV1ZV9mcmVlKGlsKTsKKwkJCWVsc2UKKwkJCQlpbF90eF9xdWV1ZV9mcmVlKGlsLCB0eHFfaWQpOworCisJLyogZnJlZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KKwlpbF90eHFfbWVtKGlsKTsKK30KKwordm9pZAoraWwzOTQ1X2h3X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHR4cV9pZDsKKworCS8qIHN0b3AgU0NEICovCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9NT0RFX1JFRywgMCk7CisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9UWEZBQ1RfUkVHLCAwKTsKKworCS8qIHJlc2V0IFRGRCBxdWV1ZXMgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7CisJCWlsX3dyKGlsLCBGSDM5X1RDU1JfQ09ORklHKHR4cV9pZCksIDB4MCk7CisJCWlsX3BvbGxfYml0KGlsLCBGSDM5X1RTU1JfVFhfU1RBVFVTLAorCQkJICAgIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUodHhxX2lkKSwKKwkJCSAgICAxMDAwKTsKKwl9CisKKwlpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wCisgKiByZXR1cm4gaWR4IGRlbHRhIGludG8gcG93ZXIgZ2FpbiBzZXR0aW5ncyB0YWJsZQorKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9od19yZWdfYWRqdXN0X3Bvd2VyX2J5X3RlbXAoaW50IG5ld19yZWFkaW5nLCBpbnQgb2xkX3JlYWRpbmcpCit7CisJcmV0dXJuIChuZXdfcmVhZGluZyAtIG9sZF9yZWFkaW5nKSAqICgtMTEpIC8gMTAwOworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UgLSBLZWVwIHRlbXBlcmF0dXJlIGluIHNhbmUgcmFuZ2UKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UoaW50IHRlbXBlcmF0dXJlKQoreworCXJldHVybiAodGVtcGVyYXR1cmUgPCAtMjYwIHx8IHRlbXBlcmF0dXJlID4gMjUpID8gMSA6IDA7Cit9CisKK2ludAoraWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIF9pbF9yZChpbCwgQ1NSX1VDT0RFX0RSVl9HUDIpOworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUKKyAqIGdldCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBieSByZWFkaW5nIGZyb20gTklDCisqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisJaW50IHRlbXBlcmF0dXJlOworCisJdGVtcGVyYXR1cmUgPSBpbDM5NDVfaHdfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKworCS8qIGRyaXZlcidzIG9rYXkgcmFuZ2UgaXMgLTI2MCB0byArMjUuCisJICogICBodW1hbiByZWFkYWJsZSBva2F5IHJhbmdlIGlzIDAgdG8gKzI4NSAqLworCURfSU5GTygiVGVtcGVyYXR1cmU6ICVkXG4iLCB0ZW1wZXJhdHVyZSArIElMX1RFTVBfQ09OVkVSVCk7CisKKwkvKiBoYW5kbGUgaW5zYW5lIHRlbXAgcmVhZGluZyAqLworCWlmIChpbDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlKHRlbXBlcmF0dXJlKSkgeworCQlJTF9FUlIoIkVycm9yIGJhZCB0ZW1wZXJhdHVyZSB2YWx1ZSAgJWRcbiIsIHRlbXBlcmF0dXJlKTsKKworCQkvKiBpZiByZWFsbHkgcmVhbGx5IGhvdCg/KSwKKwkJICogICBzdWJzdGl0dXRlIHRoZSAzcmQgYmFuZC9ncm91cCdzIHRlbXAgbWVhc3VyZWQgYXQgZmFjdG9yeSAqLworCQlpZiAoaWwtPmxhc3RfdGVtcGVyYXR1cmUgPiAxMDApCisJCQl0ZW1wZXJhdHVyZSA9IGVlcHJvbS0+Z3JvdXBzWzJdLnRlbXBlcmF0dXJlOworCQllbHNlCQkvKiBlbHNlIHVzZSBtb3N0IHJlY2VudCAic2FuZSIgdmFsdWUgZnJvbSBkcml2ZXIgKi8KKwkJCXRlbXBlcmF0dXJlID0gaWwtPmxhc3RfdGVtcGVyYXR1cmU7CisJfQorCisJcmV0dXJuIHRlbXBlcmF0dXJlOwkvKiByYXcsIG5vdCAiaHVtYW4gcmVhZGFibGUiICovCit9CisKKy8qIEFkanVzdCBUeHBvd2VyIG9ubHkgaWYgdGVtcGVyYXR1cmUgdmFyaWFuY2UgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyAqCisgKiBCb3RoIGFyZSBsb3dlciB0aGFuIG9sZGVyIHZlcnNpb25zJyA5IGRlZ3JlZXMgKi8KKyNkZWZpbmUgSUxfVEVNUEVSQVRVUkVfTElNSVRfVElNRVIgICA2CisKKy8qKgorICogaWwzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkIC0gZGV0ZXJtaW5lcyBpZiBuZXcgY2FsaWJyYXRpb24gaXMgbmVlZGVkCisgKgorICogcmVjb3JkcyBuZXcgdGVtcGVyYXR1cmUgaW4gdHhfbWdyLT50ZW1wZXJhdHVyZS4KKyAqIHJlcGxhY2VzIHR4X21nci0+bGFzdF90ZW1wZXJhdHVyZSAqb25seSogaWYgY2FsaWIgbmVlZGVkCisgKiAgICAoYXNzdW1lcyBjYWxsZXIgd2lsbCBhY3R1YWxseSBkbyB0aGUgY2FsaWJyYXRpb24hKS4gKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHRlbXBfZGlmZjsKKworCWlsLT50ZW1wZXJhdHVyZSA9IGlsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUoaWwpOworCXRlbXBfZGlmZiA9IGlsLT50ZW1wZXJhdHVyZSAtIGlsLT5sYXN0X3RlbXBlcmF0dXJlOworCisJLyogZ2V0IGFic29sdXRlIHZhbHVlICovCisJaWYgKHRlbXBfZGlmZiA8IDApIHsKKwkJRF9QT1dFUigiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkLFxuIiwgdGVtcF9kaWZmKTsKKwkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKKwl9IGVsc2UgaWYgKHRlbXBfZGlmZiA9PSAwKQorCQlEX1BPV0VSKCJTYW1lIHRlbXAsXG4iKTsKKwllbHNlCisJCURfUE9XRVIoIkdldHRpbmcgd2FybWVyLCBkZWx0YSAlZCxcbiIsIHRlbXBfZGlmZik7CisKKwkvKiBpZiB3ZSBkb24ndCBuZWVkIGNhbGlicmF0aW9uLCAqZG9uJ3QqIHVwZGF0ZSBsYXN0X3RlbXBlcmF0dXJlICovCisJaWYgKHRlbXBfZGlmZiA8IElMX1RFTVBFUkFUVVJFX0xJTUlUX1RJTUVSKSB7CisJCURfUE9XRVIoIlRpbWVkIHRoZXJtYWwgY2FsaWIgbm90IG5lZWRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCURfUE9XRVIoIlRpbWVkIHRoZXJtYWwgY2FsaWIgbmVlZGVkXG4iKTsKKworCS8qIGFzc3VtZSB0aGF0IGNhbGxlciB3aWxsIGFjdHVhbGx5IGRvIGNhbGliIC4uLgorCSAqICAgdXBkYXRlIHRoZSAibGFzdCB0ZW1wZXJhdHVyZSIgdmFsdWUgKi8KKwlpbC0+bGFzdF90ZW1wZXJhdHVyZSA9IGlsLT50ZW1wZXJhdHVyZTsKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBJTF9NQVhfR0FJTl9FTlRSSUVTIDc4CisjZGVmaW5lIElMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRiAgLTUKKyNkZWZpbmUgSUxfQ0NLX0ZST01fT0ZETV9JRFhfRElGRiAoMTApCisKKy8qIHJhZGlvIGFuZCBEU1AgcG93ZXIgdGFibGUsIGVhY2ggc3RlcCBpcyAxLzIgZEIuCisgKiAxc3QgbnVtYmVyIGlzIGZvciBSRiBhbmFsb2cgZ2FpbiwgMm5kIG51bWJlciBpcyBmb3IgRFNQIHByZS1EQUMgZ2Fpbi4gKi8KK3N0YXRpYyBzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyIHBvd2VyX2dhaW5fdGFibGVbMl1bSUxfTUFYX0dBSU5fRU5UUklFU10gPSB7CisJeworCSB7MjUxLCAxMjd9LAkJLyogMi40IEdIeiwgaGlnaGVzdCBwb3dlciAqLworCSB7MjUxLCAxMjd9LAorCSB7MjUxLCAxMjd9LAorCSB7MjUxLCAxMjd9LAorCSB7MjUxLCAxMjV9LAorCSB7MjUxLCAxMTB9LAorCSB7MjUxLCAxMDV9LAorCSB7MjUxLCA5OH0sCisJIHsxODcsIDEyNX0sCisJIHsxODcsIDExNX0sCisJIHsxODcsIDEwOH0sCisJIHsxODcsIDk5fSwKKwkgezI0MywgMTE5fSwKKwkgezI0MywgMTExfSwKKwkgezI0MywgMTA1fSwKKwkgezI0MywgOTd9LAorCSB7MjQzLCA5Mn0sCisJIHsyMTEsIDEwNn0sCisJIHsyMTEsIDEwMH0sCisJIHsxNzksIDEyMH0sCisJIHsxNzksIDExM30sCisJIHsxNzksIDEwN30sCisJIHsxNDcsIDEyNX0sCisJIHsxNDcsIDExOX0sCisJIHsxNDcsIDExMn0sCisJIHsxNDcsIDEwNn0sCisJIHsxNDcsIDEwMX0sCisJIHsxNDcsIDk3fSwKKwkgezE0NywgOTF9LAorCSB7MTE1LCAxMDd9LAorCSB7MjM1LCAxMjF9LAorCSB7MjM1LCAxMTV9LAorCSB7MjM1LCAxMDl9LAorCSB7MjAzLCAxMjd9LAorCSB7MjAzLCAxMjF9LAorCSB7MjAzLCAxMTV9LAorCSB7MjAzLCAxMDh9LAorCSB7MjAzLCAxMDJ9LAorCSB7MjAzLCA5Nn0sCisJIHsyMDMsIDkyfSwKKwkgezE3MSwgMTEwfSwKKwkgezE3MSwgMTA0fSwKKwkgezE3MSwgOTh9LAorCSB7MTM5LCAxMTZ9LAorCSB7MjI3LCAxMjV9LAorCSB7MjI3LCAxMTl9LAorCSB7MjI3LCAxMTN9LAorCSB7MjI3LCAxMDd9LAorCSB7MjI3LCAxMDF9LAorCSB7MjI3LCA5Nn0sCisJIHsxOTUsIDExM30sCisJIHsxOTUsIDEwNn0sCisJIHsxOTUsIDEwMn0sCisJIHsxOTUsIDk1fSwKKwkgezE2MywgMTEzfSwKKwkgezE2MywgMTA2fSwKKwkgezE2MywgMTAyfSwKKwkgezE2MywgOTV9LAorCSB7MTMxLCAxMTN9LAorCSB7MTMxLCAxMDZ9LAorCSB7MTMxLCAxMDJ9LAorCSB7MTMxLCA5NX0sCisJIHs5OSwgMTEzfSwKKwkgezk5LCAxMDZ9LAorCSB7OTksIDEwMn0sCisJIHs5OSwgOTV9LAorCSB7NjcsIDExM30sCisJIHs2NywgMTA2fSwKKwkgezY3LCAxMDJ9LAorCSB7NjcsIDk1fSwKKwkgezM1LCAxMTN9LAorCSB7MzUsIDEwNn0sCisJIHszNSwgMTAyfSwKKwkgezM1LCA5NX0sCisJIHszLCAxMTN9LAorCSB7MywgMTA2fSwKKwkgezMsIDEwMn0sCisJIHszLCA5NX0JCS8qIDIuNCBHSHosIGxvd2VzdCBwb3dlciAqLworCX0sCisJeworCSB7MjUxLCAxMjd9LAkJLyogNS54IEdIeiwgaGlnaGVzdCBwb3dlciAqLworCSB7MjUxLCAxMjB9LAorCSB7MjUxLCAxMTR9LAorCSB7MjE5LCAxMTl9LAorCSB7MjE5LCAxMDF9LAorCSB7MTg3LCAxMTN9LAorCSB7MTg3LCAxMDJ9LAorCSB7MTU1LCAxMTR9LAorCSB7MTU1LCAxMDN9LAorCSB7MTIzLCAxMTd9LAorCSB7MTIzLCAxMDd9LAorCSB7MTIzLCA5OX0sCisJIHsxMjMsIDkyfSwKKwkgezkxLCAxMDh9LAorCSB7NTksIDEyNX0sCisJIHs1OSwgMTE4fSwKKwkgezU5LCAxMDl9LAorCSB7NTksIDEwMn0sCisJIHs1OSwgOTZ9LAorCSB7NTksIDkwfSwKKwkgezI3LCAxMDR9LAorCSB7MjcsIDk4fSwKKwkgezI3LCA5Mn0sCisJIHsxMTUsIDExOH0sCisJIHsxMTUsIDExMX0sCisJIHsxMTUsIDEwNH0sCisJIHs4MywgMTI2fSwKKwkgezgzLCAxMjF9LAorCSB7ODMsIDExM30sCisJIHs4MywgMTA1fSwKKwkgezgzLCA5OX0sCisJIHs1MSwgMTE4fSwKKwkgezUxLCAxMTF9LAorCSB7NTEsIDEwNH0sCisJIHs1MSwgOTh9LAorCSB7MTksIDExNn0sCisJIHsxOSwgMTA5fSwKKwkgezE5LCAxMDJ9LAorCSB7MTksIDk4fSwKKwkgezE5LCA5M30sCisJIHsxNzEsIDExM30sCisJIHsxNzEsIDEwN30sCisJIHsxNzEsIDk5fSwKKwkgezEzOSwgMTIwfSwKKwkgezEzOSwgMTEzfSwKKwkgezEzOSwgMTA3fSwKKwkgezEzOSwgOTl9LAorCSB7MTA3LCAxMjB9LAorCSB7MTA3LCAxMTN9LAorCSB7MTA3LCAxMDd9LAorCSB7MTA3LCA5OX0sCisJIHs3NSwgMTIwfSwKKwkgezc1LCAxMTN9LAorCSB7NzUsIDEwN30sCisJIHs3NSwgOTl9LAorCSB7NDMsIDEyMH0sCisJIHs0MywgMTEzfSwKKwkgezQzLCAxMDd9LAorCSB7NDMsIDk5fSwKKwkgezExLCAxMjB9LAorCSB7MTEsIDExM30sCisJIHsxMSwgMTA3fSwKKwkgezExLCA5OX0sCisJIHsxMzEsIDEwN30sCisJIHsxMzEsIDk5fSwKKwkgezk5LCAxMjB9LAorCSB7OTksIDExM30sCisJIHs5OSwgMTA3fSwKKwkgezk5LCA5OX0sCisJIHs2NywgMTIwfSwKKwkgezY3LCAxMTN9LAorCSB7NjcsIDEwN30sCisJIHs2NywgOTl9LAorCSB7MzUsIDEyMH0sCisJIHszNSwgMTEzfSwKKwkgezM1LCAxMDd9LAorCSB7MzUsIDk5fSwKKwkgezMsIDEyMH0JCS8qIDUueCBHSHosIGxvd2VzdCBwb3dlciAqLworCX0KK307CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsMzk0NV9od19yZWdfZml4X3Bvd2VyX2lkeChpbnQgaWR4KQoreworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAoaWR4ID49IElMX01BWF9HQUlOX0VOVFJJRVMpCisJCXJldHVybiBJTF9NQVhfR0FJTl9FTlRSSUVTIC0gMTsKKwlyZXR1cm4gKHU4KSBpZHg7Cit9CisKKy8qIEtpY2sgb2ZmIHRoZXJtYWwgcmVjYWxpYnJhdGlvbiBjaGVjayBldmVyeSA2MCBzZWNvbmRzICovCisjZGVmaW5lIFJFR19SRUNBTElCX1BFUklPRCAoNjApCisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlciAtIFNldCBUeCBwb3dlciBmb3Igc2NhbiBwcm9iZSByZXF1ZXN0cworICoKKyAqIFNldCAoaW4gb3VyIGNoYW5uZWwgaW5mbyBkYXRhYmFzZSkgdGhlIGRpcmVjdCBzY2FuIFR4IHBvd2VyIGZvciAxIE1iaXQgKENDSykKKyAqIG9yIDYgTWJpdCAoT0ZETSkgcmF0ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHNjYW5fdGJsX2lkeCwgczMyIHJhdGVfaWR4LAorCQkJICAgICBjb25zdCBzOCAqY2xpcF9wd3JzLAorCQkJICAgICBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvLCBpbnQgYmFuZF9pZHgpCit7CisJc3RydWN0IGlsMzk0NV9zY2FuX3Bvd2VyX2luZm8gKnNjYW5fcG93ZXJfaW5mbzsKKwlzOCBwb3dlcjsKKwl1OCBwb3dlcl9pZHg7CisKKwlzY2FuX3Bvd2VyX2luZm8gPSAmY2hfaW5mby0+c2Nhbl9wd3JfaW5mb1tzY2FuX3RibF9pZHhdOworCisJLyogdXNlIHRoaXMgY2hhbm5lbCBncm91cCdzIDZNYml0IGNsaXBwaW5nL3NhdHVyYXRpb24gcHdyLAorCSAqICAgYnV0IGNhcCBhdCByZWd1bGF0b3J5IHNjYW4gcG93ZXIgcmVzdHJpY3Rpb24gKHNldCBkdXJpbmcgaW5pdAorCSAqICAgYmFzZWQgb24gZWVwcm9tIGNoYW5uZWwgZGF0YSkgZm9yIHRoaXMgY2hhbm5lbC4gICovCisJcG93ZXIgPSBtaW4oY2hfaW5mby0+c2Nhbl9wb3dlciwgY2xpcF9wd3JzW1JBVEVfNk1fSURYX1RCTF0pOworCisJcG93ZXIgPSBtaW4ocG93ZXIsIGlsLT50eF9wb3dlcl91c2VyX2xtdCk7CisJc2Nhbl9wb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKKworCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG5ldyBzY2FuICpwb3dlciogYW5kIGN1cnJlbnQgIm5vcm1hbCIKKwkgKiAgIFR4ICpwb3dlciogZm9yIDZNYi4gIFVzZSB0aGlzIGRpZmZlcmVuY2UgKHgyKSB0byBhZGp1c3QgdGhlCisJICogICBjdXJyZW50ICJub3JtYWwiIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIFR4IHBvd2VyICppZHgqIGZvcgorCSAqICAgdGhpcyByYXRlICgxTWIgb3IgNk1iKSB0byB5aWVsZCBuZXcgdGVtcC1jb21wZW5zYXRlZCBzY2FuIHBvd2VyCisJICogICAqaWR4Ki4gKi8KKwlwb3dlcl9pZHggPQorCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaWR4XS5wb3dlcl90YWJsZV9pZHggLSAocG93ZXIgLQorCQkJCQkJCSAgICAgY2hfaW5mby0+CisJCQkJCQkJICAgICBwb3dlcl9pbmZvCisJCQkJCQkJICAgICBbUkFURV82TV9JRFhfVEJMXS4KKwkJCQkJCQkgICAgIHJlcXVlc3RlZF9wb3dlcikgKgorCSAgICAyOworCisJLyogc3RvcmUgcmVmZXJlbmNlIGlkeCB0aGF0IHdlIHVzZSB3aGVuIGFkanVzdGluZyAqYWxsKiBzY2FuCisJICogICBwb3dlcnMuICBTbyB3ZSBjYW4gYWNjb21tb2RhdGUgdXNlciAoYWxsIGNoYW5uZWwpIG9yIHNwZWN0cnVtCisJICogICBtYW5hZ2VtZW50IChzaW5nbGUgY2hhbm5lbCkgcG93ZXIgY2hhbmdlcyAiYmV0d2VlbiIgdGVtcGVyYXR1cmUKKwkgKiAgIGZlZWRiYWNrIGNvbXBlbnNhdGlvbiBwcm9jZWR1cmVzLgorCSAqIGRvbid0IGZvcmNlIGZpdCB0aGlzIHJlZmVyZW5jZSBpZHggaW50byBnYWluIHRhYmxlOyBpdCBtYXkgYmUgYQorCSAqICAgbmVnYXRpdmUgbnVtYmVyLiAgVGhpcyB3aWxsIGhlbHAgYXZvaWQgZXJyb3JzIHdoZW4gd2UncmUgYXQKKwkgKiAgIHRoZSBsb3dlciBib3VuZHMgKGhpZ2hlc3QgZ2FpbnMsIGZvciB3YXJtZXN0IHRlbXBlcmF0dXJlcykKKwkgKiAgIG9mIHRoZSB0YWJsZS4gKi8KKworCS8qIGRvbid0IGV4Y2VlZCB0YWJsZSBib3VuZHMgZm9yICJyZWFsIiBzZXR0aW5nICovCisJcG93ZXJfaWR4ID0gaWwzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaWR4KHBvd2VyX2lkeCk7CisKKwlzY2FuX3Bvd2VyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCA9IHBvd2VyX2lkeDsKKwlzY2FuX3Bvd2VyX2luZm8tPnRwYy50eF9nYWluID0KKwkgICAgcG93ZXJfZ2Fpbl90YWJsZVtiYW5kX2lkeF1bcG93ZXJfaWR4XS50eF9nYWluOworCXNjYW5fcG93ZXJfaW5mby0+dHBjLmRzcF9hdHRlbiA9CisJICAgIHBvd2VyX2dhaW5fdGFibGVbYmFuZF9pZHhdW3Bvd2VyX2lkeF0uZHNwX2F0dGVuOworfQorCisvKioKKyAqIGlsMzk0NV9zZW5kX3R4X3Bvd2VyIC0gZmlsbCBpbiBUeCBQb3dlciBjb21tYW5kIHdpdGggZ2FpbiBzZXR0aW5ncworICoKKyAqIENvbmZpZ3VyZXMgcG93ZXIgc2V0dGluZ3MgZm9yIGFsbCByYXRlcyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbCwKKyAqIHVzaW5nIHZhbHVlcyBmcm9tIGNoYW5uZWwgaW5mbyBzdHJ1Y3QsIGFuZCBzZW5kIHRvIE5JQworICovCitzdGF0aWMgaW50CitpbDM5NDVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJhdGVfaWR4LCBpOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBpbDM5NDVfdHhwb3dlcnRhYmxlX2NtZCB0eHBvd2VyID0geworCQkuY2hhbm5lbCA9IGlsLT5jdHguYWN0aXZlLmNoYW5uZWwsCisJfTsKKwl1MTYgY2hhbjsKKworCWlmIChXQVJOX09OQ0UKKwkgICAgKHRlc3RfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpLAorCSAgICAgIlRYIFBvd2VyIHJlcXVlc3RlZCB3aGlsZSBzY2FubmluZyFcbiIpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWNoYW4gPSBsZTE2X3RvX2NwdShpbC0+Y3R4LmFjdGl2ZS5jaGFubmVsKTsKKworCXR4cG93ZXIuYmFuZCA9IChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/IDAgOiAxOworCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBpbC0+YmFuZCwgY2hhbik7CisJaWYgKCFjaF9pbmZvKSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIGdldCBjaGFubmVsIGluZm8gZm9yIGNoYW5uZWwgJWQgWyVkXVxuIiwgY2hhbiwKKwkJICAgICAgIGlsLT5iYW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCURfUE9XRVIoIk5vdCBjYWxsaW5nIFRYX1BXUl9UQkxfQ01EIG9uICIgIm5vbi1UeCBjaGFubmVsLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpbGwgY21kIHdpdGggcG93ZXIgc2V0dGluZ3MgZm9yIGFsbCByYXRlcyBmb3IgY3VycmVudCBjaGFubmVsICovCisJLyogRmlsbCBPRkRNIHJhdGUgKi8KKwlmb3IgKHJhdGVfaWR4ID0gSUxfRklSU1RfT0ZETV9SQVRFLCBpID0gMDsKKwkgICAgIHJhdGVfaWR4IDw9IElMMzlfTEFTVF9PRkRNX1JBVEU7IHJhdGVfaWR4KyssIGkrKykgeworCisJCXR4cG93ZXIucG93ZXJbaV0udHBjID0gY2hfaW5mby0+cG93ZXJfaW5mb1tpXS50cGM7CisJCXR4cG93ZXIucG93ZXJbaV0ucmF0ZSA9IGlsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKKworCQlEX1BPV0VSKCJjaCAlZDolZCByZiAlZCBkc3AgJTNkIHJhdGUgY29kZSAweCUwMnhcbiIsCisJCQlsZTE2X3RvX2NwdSh0eHBvd2VyLmNoYW5uZWwpLCB0eHBvd2VyLmJhbmQsCisJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy50eF9nYWluLAorCQkJdHhwb3dlci5wb3dlcltpXS50cGMuZHNwX2F0dGVuLCB0eHBvd2VyLnBvd2VyW2ldLnJhdGUpOworCX0KKwkvKiBGaWxsIENDSyByYXRlcyAqLworCWZvciAocmF0ZV9pZHggPSBJTF9GSVJTVF9DQ0tfUkFURTsgcmF0ZV9pZHggPD0gSUxfTEFTVF9DQ0tfUkFURTsKKwkgICAgIHJhdGVfaWR4KyssIGkrKykgeworCQl0eHBvd2VyLnBvd2VyW2ldLnRwYyA9IGNoX2luZm8tPnBvd2VyX2luZm9baV0udHBjOworCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUgPSBpbDM5NDVfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7CisKKwkJRF9QT1dFUigiY2ggJWQ6JWQgcmYgJWQgZHNwICUzZCByYXRlIGNvZGUgMHglMDJ4XG4iLAorCQkJbGUxNl90b19jcHUodHhwb3dlci5jaGFubmVsKSwgdHhwb3dlci5iYW5kLAorCQkJdHhwb3dlci5wb3dlcltpXS50cGMudHhfZ2FpbiwKKwkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwgdHhwb3dlci5wb3dlcltpXS5yYXRlKTsKKwl9CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1RYX1BXUl9UQkwsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdHhwb3dlcnRhYmxlX2NtZCksCisJCQkgICAgICAgJnR4cG93ZXIpOworCit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyIC0gQ29uZmlndXJlcyBwb3dlciB0YWJsZXMgYXQgbmV3IGxldmVscworICogQGNoX2luZm86IENoYW5uZWwgdG8gdXBkYXRlLiAgVXNlcyBwb3dlcl9pbmZvLnJlcXVlc3RlZF9wb3dlci4KKyAqCisgKiBSZXBsYWNlIHJlcXVlc3RlZF9wb3dlciBhbmQgYmFzZV9wb3dlcl9pZHggY2hfaW5mbyBmaWVsZHMgZm9yCisgKiBvbmUgY2hhbm5lbC4KKyAqCisgKiBDYWxsZWQgaWYgdXNlciBvciBzcGVjdHJ1bSBtYW5hZ2VtZW50IGNoYW5nZXMgcG93ZXIgcHJlZmVyZW5jZXMuCisgKiBUYWtlcyBpbnRvIGFjY291bnQgaC93IGFuZCBtb2R1bGF0aW9uIGxpbWl0YXRpb25zIChjbGlwIHBvd2VyKS4KKyAqCisgKiBUaGlzIGRvZXMgKm5vdCogc2VuZCBhbnl0aGluZyB0byBOSUMsIGp1c3Qgc2V0cyB1cCBjaF9pbmZvIGZvciBvbmUgY2hhbm5lbC4KKyAqCisgKiBOT1RFOiByZWdfY29tcGVuc2F0ZV9mb3JfdGVtcGVyYXR1cmVfZGlmKCkgKm11c3QqIGJlIHJ1biBhZnRlciB0aGlzIHRvCisgKgkgcHJvcGVybHkgZmlsbCBvdXQgdGhlIHNjYW4gcG93ZXJzLCBhbmQgYWN0dWFsIGgvdyBnYWluIHNldHRpbmdzLAorICoJIGFuZCBzZW5kIGNoYW5nZXMgdG8gTklDCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9od19yZWdfc2V0X25ld19wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8pCit7CisJc3RydWN0IGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gKnBvd2VyX2luZm87CisJaW50IHBvd2VyX2NoYW5nZWQgPSAwOworCWludCBpOworCWNvbnN0IHM4ICpjbGlwX3B3cnM7CisJaW50IHBvd2VyOworCisJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtdG8tbWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCisJY2xpcF9wd3JzID0gaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0uY2xpcF9wb3dlcnM7CisKKwkvKiBHZXQgdGhpcyBjaGFubmVsJ3MgcmF0ZS10by1jdXJyZW50LXBvd2VyIHNldHRpbmdzIHRhYmxlICovCisJcG93ZXJfaW5mbyA9IGNoX2luZm8tPnBvd2VyX2luZm87CisKKwkvKiB1cGRhdGUgT0ZETSBUeHBvd2VyIHNldHRpbmdzICovCisJZm9yIChpID0gUkFURV82TV9JRFhfVEJMOyBpIDw9IFJBVEVfNTRNX0lEWF9UQkw7IGkrKywgKytwb3dlcl9pbmZvKSB7CisJCWludCBkZWx0YV9pZHg7CisKKwkJLyogbGltaXQgbmV3IHBvd2VyIHRvIGJlIG5vIG1vcmUgdGhhbiBoL3cgY2FwYWJpbGl0eSAqLworCQlwb3dlciA9IG1pbihjaF9pbmZvLT5jdXJyX3R4cG93LCBjbGlwX3B3cnNbaV0pOworCQlpZiAocG93ZXIgPT0gcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIGFuZCBuZXcgcmVxdWVzdGVkIHBvd2VycywKKwkJICogICAgdXBkYXRlIGJhc2UgKG5vbi10ZW1wLWNvbXBlbnNhdGVkKSBwb3dlciBpZHggKi8KKwkJZGVsdGFfaWR4ID0gKHBvd2VyIC0gcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyKSAqIDI7CisJCXBvd2VyX2luZm8tPmJhc2VfcG93ZXJfaWR4IC09IGRlbHRhX2lkeDsKKworCQkvKiBzYXZlIG5ldyByZXF1ZXN0ZWQgcG93ZXIgdmFsdWUgKi8KKwkJcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7CisKKwkJcG93ZXJfY2hhbmdlZCA9IDE7CisJfQorCisJLyogdXBkYXRlIENDSyBUeHBvd2VyIHNldHRpbmdzLCBiYXNlZCBvbiBPRkRNIDEyTSBzZXR0aW5nIC4uLgorCSAqICAgIC4uLiBhbGwgQ0NLIHBvd2VyIHNldHRpbmdzIGZvciBhIGdpdmVuIGNoYW5uZWwgYXJlIHRoZSAqc2FtZSouICovCisJaWYgKHBvd2VyX2NoYW5nZWQpIHsKKwkJcG93ZXIgPQorCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tSQVRFXzEyTV9JRFhfVEJMXS5yZXF1ZXN0ZWRfcG93ZXIgKworCQkgICAgSUxfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOworCisJCS8qIGRvIGFsbCBDQ0sgcmF0ZXMnIGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0dXJlcyAqLworCQlmb3IgKGkgPSBSQVRFXzFNX0lEWF9UQkw7IGkgPD0gUkFURV8xMU1fSURYX1RCTDsgaSsrKSB7CisJCQlwb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKKwkJCXBvd2VyX2luZm8tPmJhc2VfcG93ZXJfaWR4ID0KKwkJCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW1JBVEVfMTJNX0lEWF9UQkxdLgorCQkJICAgIGJhc2VfcG93ZXJfaWR4ICsgSUxfQ0NLX0ZST01fT0ZETV9JRFhfRElGRjsKKwkJCSsrcG93ZXJfaW5mbzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfZ2V0X2NoX3R4cG93ZXJfbGltaXQgLSByZXR1cm5zIG5ldyBwb3dlciBsaW1pdCBmb3IgY2hhbm5lbAorICoKKyAqIE5PVEU6IFJldHVybmVkIHBvd2VyIGxpbWl0IG1heSBiZSBsZXNzIChidXQgbm90IG1vcmUpIHRoYW4gcmVxdWVzdGVkLAorICoJIGJhc2VkIHN0cmljdGx5IG9uIHJlZ3VsYXRvcnkgKGVlcHJvbSBhbmQgc3BlY3RydW0gbWd0KSBsaW1pdGF0aW9ucworICoJIChubyBjb25zaWRlcmF0aW9uIGZvciBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMpLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0KHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8pCit7CisJczggbWF4X3Bvd2VyOworCisjaWYgMAorCS8qIGlmIHdlJ3JlIHVzaW5nIFRHZCBsaW1pdHMsIHVzZSBsb3dlciBvZiBUR2Qgb3IgRUVQUk9NICovCisJaWYgKGNoX2luZm8tPnRnZF9kYXRhLm1heF9wb3dlciAhPSAwKQorCQltYXhfcG93ZXIgPQorCQkgICAgbWluKGNoX2luZm8tPnRnZF9kYXRhLm1heF9wb3dlciwKKwkJCWNoX2luZm8tPmVlcHJvbS5tYXhfcG93ZXJfYXZnKTsKKworCS8qIGVsc2UganVzdCB1c2UgRUVQUk9NIGxpbWl0cyAqLworCWVsc2UKKyNlbmRpZgorCQltYXhfcG93ZXIgPSBjaF9pbmZvLT5lZXByb20ubWF4X3Bvd2VyX2F2ZzsKKworCXJldHVybiBtaW4obWF4X3Bvd2VyLCBjaF9pbmZvLT5tYXhfcG93ZXJfYXZnKTsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wIC0gQ29tcGVuc2F0ZSBmb3IgdGVtcGVyYXR1cmUKKyAqCisgKiBDb21wZW5zYXRlIHR4cG93ZXIgc2V0dGluZ3Mgb2YgKmFsbCogY2hhbm5lbHMgZm9yIHRlbXBlcmF0dXJlLgorICogVGhpcyBvbmx5IGFjY291bnRzIGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGVtcGVyYXR1cmUKKyAqICAgYW5kIHRoZSBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlcywgYW5kIGJhc2VzIHRoZSBuZXcgc2V0dGluZ3MKKyAqICAgb24gdGhlIGNoYW5uZWwncyBiYXNlX3Bvd2VyX2lkeC4KKyAqCisgKiBJZiBSeE9uIGlzICJhc3NvY2lhdGVkIiwgdGhpcyBzZW5kcyB0aGUgbmV3IFR4cG93ZXIgdG8gTklDIQorICovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlpbnQgZGVsdGFfaWR4OworCWNvbnN0IHM4ICpjbGlwX3B3cnM7CS8qIGFycmF5IG9mIGgvdyBtYXggcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUgKi8KKwl1OCBhX2JhbmQ7CisJdTggcmF0ZV9pZHg7CisJdTggc2Nhbl90YmxfaWR4OworCXU4IGk7CisJaW50IHJlZl90ZW1wOworCWludCB0ZW1wZXJhdHVyZSA9IGlsLT50ZW1wZXJhdHVyZTsKKworCWlmIChpbC0+ZGlzYWJsZV90eF9wb3dlcl9jYWwgfHwgdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCS8qIGRvIG5vdCBwZXJmb3JtIHR4IHBvd2VyIGNhbGlicmF0aW9uICovCisJCXJldHVybiAwOworCX0KKwkvKiBzZXQgdXAgbmV3IFR4IHBvd2VyIGluZm8gZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCisJZm9yIChpID0gMDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJY2hfaW5mbyA9ICZpbC0+Y2hhbm5lbF9pbmZvW2ldOworCQlhX2JhbmQgPSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKKworCQkvKiBHZXQgdGhpcyBjaG5sZ3JwJ3MgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSAqLworCQlyZWZfdGVtcCA9IChzMTYpIGVlcHJvbS0+Z3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0udGVtcGVyYXR1cmU7CisKKwkJLyogZ2V0IHBvd2VyIGlkeCBhZGp1c3RtZW50IGJhc2VkIG9uIGN1cnJlbnQgYW5kIGZhY3RvcnkKKwkJICogdGVtcHMgKi8KKwkJZGVsdGFfaWR4ID0KKwkJICAgIGlsMzk0NV9od19yZWdfYWRqdXN0X3Bvd2VyX2J5X3RlbXAodGVtcGVyYXR1cmUsIHJlZl90ZW1wKTsKKworCQkvKiBzZXQgdHggcG93ZXIgdmFsdWUgZm9yIGFsbCByYXRlcywgT0ZETSBhbmQgQ0NLICovCisJCWZvciAocmF0ZV9pZHggPSAwOyByYXRlX2lkeCA8IFJBVEVfQ09VTlRfMzk0NTsgcmF0ZV9pZHgrKykgeworCQkJaW50IHBvd2VyX2lkeCA9CisJCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF0uYmFzZV9wb3dlcl9pZHg7CisKKwkJCS8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGUgKi8KKwkJCXBvd2VyX2lkeCArPSBkZWx0YV9pZHg7CisKKwkJCS8qIHN0YXkgd2l0aGluIHRhYmxlIHJhbmdlICovCisJCQlwb3dlcl9pZHggPSBpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgocG93ZXJfaWR4KTsKKwkJCWNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHhdLnBvd2VyX3RhYmxlX2lkeCA9CisJCQkgICAgKHU4KSBwb3dlcl9pZHg7CisJCQljaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaWR4XS50cGMgPQorCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdOworCQl9CisKKwkJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtdG8tbWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCisJCWNsaXBfcHdycyA9CisJCSAgICBpbC0+XzM5NDUuY2xpcF9ncm91cHNbY2hfaW5mby0+Z3JvdXBfaWR4XS5jbGlwX3Bvd2VyczsKKworCQkvKiBzZXQgc2NhbiB0eCBwb3dlciwgMU1iaXQgZm9yIENDSywgNk1iaXQgZm9yIE9GRE0gKi8KKwkJZm9yIChzY2FuX3RibF9pZHggPSAwOyBzY2FuX3RibF9pZHggPCBJTF9OVU1fU0NBTl9SQVRFUzsKKwkJICAgICBzY2FuX3RibF9pZHgrKykgeworCQkJczMyIGFjdHVhbF9pZHggPQorCQkJICAgIChzY2FuX3RibF9pZHggPT0KKwkJCSAgICAgMCkgPyBSQVRFXzFNX0lEWF9UQkwgOiBSQVRFXzZNX0lEWF9UQkw7CisJCQlpbDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyKGlsLCBzY2FuX3RibF9pZHgsCisJCQkJCQkgICAgIGFjdHVhbF9pZHgsIGNsaXBfcHdycywKKwkJCQkJCSAgICAgY2hfaW5mbywgYV9iYW5kKTsKKwkJfQorCX0KKworCS8qIHNlbmQgVHhwb3dlciBjb21tYW5kIGZvciBjdXJyZW50IGNoYW5uZWwgdG8gdWNvZGUgKi8KKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIoaWwpOworfQorCitpbnQKK2lsMzk0NV9od19yZWdfc2V0X3R4cG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzOCBwb3dlcikKK3sKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXM4IG1heF9wb3dlcjsKKwl1OCBhX2JhbmQ7CisJdTggaTsKKworCWlmIChpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPT0gcG93ZXIpIHsKKwkJRF9QT1dFUigiUmVxdWVzdGVkIFR4IHBvd2VyIHNhbWUgYXMgY3VycmVudCAiICJsaW1pdDogJWRkQm0uXG4iLAorCQkJcG93ZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX1BPV0VSKCJTZXR0aW5nIHVwcGVyIGxpbWl0IGNsYW1wIHRvICVkZEJtLlxuIiwgcG93ZXIpOworCWlsLT50eF9wb3dlcl91c2VyX2xtdCA9IHBvd2VyOworCisJLyogc2V0IHVwIG5ldyBUeCBwb3dlcnMgZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmNoYW5uZWxfY291bnQ7IGkrKykgeworCQljaF9pbmZvID0gJmlsLT5jaGFubmVsX2luZm9baV07CisJCWFfYmFuZCA9IGlsX2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOworCisJCS8qIGZpbmQgbWluaW11bSBwb3dlciBvZiBhbGwgdXNlciBhbmQgcmVndWxhdG9yeSBjb25zdHJhaW50cworCQkgKiAgICAoZG9lcyBub3QgY29uc2lkZXIgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKSAqLworCQltYXhfcG93ZXIgPSBpbDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0KGNoX2luZm8pOworCQltYXhfcG93ZXIgPSBtaW4ocG93ZXIsIG1heF9wb3dlcik7CisJCWlmIChtYXhfcG93ZXIgIT0gY2hfaW5mby0+Y3Vycl90eHBvdykgeworCQkJY2hfaW5mby0+Y3Vycl90eHBvdyA9IG1heF9wb3dlcjsKKworCQkJLyogdGhpcyBjb25zaWRlcnMgdGhlIGgvdyBjbGlwcGluZyBsaW1pdGF0aW9ucyAqLworCQkJaWwzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyKGlsLCBjaF9pbmZvKTsKKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0eHBvd2VyIHNldHRpbmdzIGZvciBhbGwgY2hhbm5lbHMsCisJICogICBzZW5kIHRvIE5JQyBpZiBhc3NvY2lhdGVkLiAqLworCWlsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZChpbCk7CisJaWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChpbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdDsKKwlzdHJ1Y3QgaWwzOTQ1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19SWE9OX0FTU09DLAorCQkubGVuID0gc2l6ZW9mKHJ4b25fYXNzb2MpLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCisJCS5kYXRhID0gJnJ4b25fYXNzb2MsCisJfTsKKwljb25zdCBzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24xID0gJmN0eC0+c3RhZ2luZzsKKwljb25zdCBzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24yID0gJmN0eC0+YWN0aXZlOworCisJaWYgKHJ4b24xLT5mbGFncyA9PSByeG9uMi0+ZmxhZ3MgJiYKKwkgICAgcnhvbjEtPmZpbHRlcl9mbGFncyA9PSByeG9uMi0+ZmlsdGVyX2ZsYWdzICYmCisJICAgIHJ4b24xLT5jY2tfYmFzaWNfcmF0ZXMgPT0gcnhvbjItPmNja19iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+b2ZkbV9iYXNpY19yYXRlcyA9PSByeG9uMi0+b2ZkbV9iYXNpY19yYXRlcykgeworCQlEX0lORk8oIlVzaW5nIGN1cnJlbnQgUlhPTl9BU1NPQy4gIE5vdCByZXNlbmRpbmcuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcnhvbl9hc3NvYy5mbGFncyA9IGN0eC0+c3RhZ2luZy5mbGFnczsKKwlyeG9uX2Fzc29jLmZpbHRlcl9mbGFncyA9IGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3M7CisJcnhvbl9hc3NvYy5vZmRtX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLm9mZG1fYmFzaWNfcmF0ZXM7CisJcnhvbl9hc3NvYy5jY2tfYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MucmVzZXJ2ZWQgPSAwOworCisJcmMgPSBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSUxfQ01EX0ZBSUxFRF9NU0spIHsKKwkJSUxfRVJSKCJCYWQgcmV0dXJuIGZyb20gQ19SWE9OX0FTU09DIGNvbW1hbmRcbiIpOworCQlyYyA9IC1FSU87CisJfQorCisJaWxfZnJlZV9wYWdlcyhpbCwgY21kLnJlcGx5X3BhZ2UpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlsMzk0NV9jb21taXRfcnhvbiAtIGNvbW1pdCBzdGFnaW5nX3J4b24gdG8gaGFyZHdhcmUKKyAqCisgKiBUaGUgUlhPTiBjb21tYW5kIGluIHN0YWdpbmdfcnhvbiBpcyBjb21taXR0ZWQgdG8gdGhlIGhhcmR3YXJlIGFuZAorICogdGhlIGFjdGl2ZV9yeG9uIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBkYXRhLiAgVGhpcworICogZnVuY3Rpb24gY29ycmVjdGx5IHRyYW5zaXRpb25zIG91dCBvZiB0aGUgUlhPTl9BU1NPQ19NU0sgc3RhdGUgaWYKKyAqIGEgSFcgdHVuZSBpcyByZXF1aXJlZCBiYXNlZCBvbiB0aGUgUlhPTiBzdHJ1Y3R1cmUgY2hhbmdlcy4KKyAqLworaW50CitpbDM5NDVfY29tbWl0X3J4b24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJLyogY2FzdCBhd2F5IHRoZSBjb25zdCBmb3IgYWN0aXZlX3J4b24gaW4gdGhpcyBmdW5jdGlvbiAqLworCXN0cnVjdCBpbDM5NDVfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7CisJc3RydWN0IGlsMzk0NV9yeG9uX2NtZCAqc3RhZ2luZ19yeG9uID0gKHZvaWQgKikmY3R4LT5zdGFnaW5nOworCWludCByYyA9IDA7CisJYm9vbCBuZXdfYXNzb2MgPSAhIShzdGFnaW5nX3J4b24tPmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSyk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC0xOworCisJLyogYWx3YXlzIGdldCB0aW1lc3RhbXAgd2l0aCBSeCBmcmFtZSAqLworCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfVFNGMkhPU1RfTVNLOworCisJLyogc2VsZWN0IGFudGVubmEgKi8KKwlzdGFnaW5nX3J4b24tPmZsYWdzICY9IH4oUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfU0VMX01TSyk7CisJc3RhZ2luZ19yeG9uLT5mbGFncyB8PSBpbDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MoaWwpOworCisJcmMgPSBpbF9jaGVja19yeG9uX2NtZChpbCwgY3R4KTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIFJYT04gY29uZmlndXJhdGlvbi4gIE5vdCBjb21taXR0aW5nLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gc2VuZCBhIGZ1bGwgUlhPTiwgd2UgY2FuIHVzZQorCSAqIGlsMzk0NV9yeG9uX2Fzc29jX2NtZCB3aGljaCBpcyB1c2VkIHRvIHJlY29uZmlndXJlIGZpbHRlcgorCSAqIGFuZCBvdGhlciBmbGFncyBmb3IgdGhlIGN1cnJlbnQgcmFkaW8gY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIWlsX2Z1bGxfcnhvbl9yZXF1aXJlZChpbCwgJmlsLT5jdHgpKSB7CisJCXJjID0gaWxfc2VuZF9yeG9uX2Fzc29jKGlsLCAmaWwtPmN0eCk7CisJCWlmIChyYykgeworCQkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIFJYT05fQVNTT0MgIgorCQkJICAgICAgICJjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQltZW1jcHkoYWN0aXZlX3J4b24sIHN0YWdpbmdfcnhvbiwgc2l6ZW9mKCphY3RpdmVfcnhvbikpOworCQkvKgorCQkgKiBXZSBkbyBub3QgY29tbWl0IHR4IHBvd2VyIHNldHRpbmdzIHdoaWxlIGNoYW5uZWwgY2hhbmdpbmcsCisJCSAqIGRvIGl0IG5vdyBpZiB0eCBwb3dlciBjaGFuZ2VkLgorCQkgKi8KKwkJaWxfc2V0X3R4X3Bvd2VyKGlsLCBpbC0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IGFzc29jaWF0ZWQgYW5kIHRoZSBuZXcgY29uZmlnIHJlcXVpcmVzCisJICogYW4gUlhPTl9BU1NPQyBhbmQgdGhlIG5ldyBjb25maWcgd2FudHMgdGhlIGFzc29jaWF0ZWQgbWFzayBlbmFibGVkLAorCSAqIHdlIG11c3QgY2xlYXIgdGhlIGFzc29jaWF0ZWQgZnJvbSB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24KKwkgKiBiZWZvcmUgd2UgYXBwbHkgdGhlIG5ldyBjb25maWcgKi8KKwlpZiAoaWxfaXNfYXNzb2NpYXRlZChpbCkgJiYgbmV3X2Fzc29jKSB7CisJCURfSU5GTygiVG9nZ2xpbmcgYXNzb2NpYXRlZCBiaXQgb24gY3VycmVudCBSWE9OXG4iKTsKKwkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCisJCS8qCisJCSAqIHJlc2VydmVkNCBhbmQgNSBjb3VsZCBoYXZlIGJlZW4gZmlsbGVkIGJ5IHRoZSBpd2xjb3JlIGNvZGUuCisJCSAqIExldCdzIGNsZWFyIHRoZW0gYmVmb3JlIHB1c2hpbmcgdG8gdGhlIDM5NDUuCisJCSAqLworCQlhY3RpdmVfcnhvbi0+cmVzZXJ2ZWQ0ID0gMDsKKwkJYWN0aXZlX3J4b24tPnJlc2VydmVkNSA9IDA7CisJCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JYT04sIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kKSwKKwkJCQkgICAgICZpbC0+Y3R4LmFjdGl2ZSk7CisKKwkJLyogSWYgdGhlIG1hc2sgY2xlYXJpbmcgZmFpbGVkIHRoZW4gd2Ugc2V0CisJCSAqIGFjdGl2ZV9yeG9uIGJhY2sgdG8gd2hhdCBpdCB3YXMgcHJldmlvdXNseSAqLworCQlpZiAocmMpIHsKKwkJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQkJSUxfRVJSKCJFcnJvciBjbGVhcmluZyBBU1NPQ19NU0sgb24gY3VycmVudCAiCisJCQkgICAgICAgImNvbmZpZ3VyYXRpb24gKCVkKS5cbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhpbCwgJmlsLT5jdHgpOworCQlpbF9yZXN0b3JlX3N0YXRpb25zKGlsLCAmaWwtPmN0eCk7CisJfQorCisJRF9JTkZPKCJTZW5kaW5nIFJYT05cbiIgIiogd2l0aCVzIFJYT05fRklMVEVSX0FTU09DX01TS1xuIgorCSAgICAgICAiKiBjaGFubmVsID0gJWRcbiIgIiogYnNzaWQgPSAlcE1cbiIsIChuZXdfYXNzb2MgPyAiIiA6ICJvdXQiKSwKKwkgICAgICAgbGUxNl90b19jcHUoc3RhZ2luZ19yeG9uLT5jaGFubmVsKSwgc3RhZ2luZ19yeG9uLT5ic3NpZF9hZGRyKTsKKworCS8qCisJICogcmVzZXJ2ZWQ0IGFuZCA1IGNvdWxkIGhhdmUgYmVlbiBmaWxsZWQgYnkgdGhlIGl3bGNvcmUgY29kZS4KKwkgKiBMZXQncyBjbGVhciB0aGVtIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSAzOTQ1LgorCSAqLworCXN0YWdpbmdfcnhvbi0+cmVzZXJ2ZWQ0ID0gMDsKKwlzdGFnaW5nX3J4b24tPnJlc2VydmVkNSA9IDA7CisKKwlpbF9zZXRfcnhvbl9od2NyeXB0byhpbCwgY3R4LCAhaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKTsKKworCS8qIEFwcGx5IHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLworCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JYT04sIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kKSwKKwkJCSAgICAgc3RhZ2luZ19yeG9uKTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIG5ldyBjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwltZW1jcHkoYWN0aXZlX3J4b24sIHN0YWdpbmdfcnhvbiwgc2l6ZW9mKCphY3RpdmVfcnhvbikpOworCisJaWYgKCFuZXdfYXNzb2MpIHsKKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsICZpbC0+Y3R4KTsKKwkJaWxfcmVzdG9yZV9zdGF0aW9ucyhpbCwgJmlsLT5jdHgpOworCX0KKworCS8qIElmIHdlIGlzc3VlIGEgbmV3IFJYT04gY29tbWFuZCB3aGljaCByZXF1aXJlZCBhIHR1bmUgdGhlbiB3ZSBtdXN0CisJICogc2VuZCBhIG5ldyBUWFBPV0VSIGNvbW1hbmQgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBUeCBhbnkgZnJhbWVzICovCisJcmMgPSBpbF9zZXRfdHhfcG93ZXIoaWwsIGlsLT50eF9wb3dlcl9uZXh0LCB0cnVlKTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIFR4IHBvd2VyICglZCkuXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBJbml0IHRoZSBoYXJkd2FyZSdzIHJhdGUgZmFsbGJhY2sgb3JkZXIgYmFzZWQgb24gdGhlIGJhbmQgKi8KKwlyYyA9IGlsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoaWwpOworCWlmIChyYykgeworCQlJTF9FUlIoIkVycm9yIHNldHRpbmcgSFcgcmF0ZSB0YWJsZTogJTAyWFxuIiwgcmMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMgLSAgY2FsbGVkIHdoZW4gdGltZSB0byBjaGVjayBvdXIgdGVtcGVyYXR1cmUuCisgKgorICogLS0gcmVzZXQgcGVyaW9kaWMgdGltZXIKKyAqIC0tIHNlZSBpZiB0ZW1wIGhhcyBjaGFuZ2VkIGVub3VnaCB0byB3YXJyYW50IHJlLWNhbGlicmF0aW9uIC4uLiBpZiBzbzoKKyAqICAgICAtLSBjb3JyZWN0IGNvZWZmcyBmb3IgdGVtcCAoY2FuIHJlc2V0IHRlbXAgdGltZXIpCisgKiAgICAgLS0gc2F2ZSB0aGlzIHRlbXAgYXMgImxhc3QiLAorICogICAgIC0tIHNlbmQgbmV3IHNldCBvZiBnYWluIHNldHRpbmdzIHRvIE5JQworICogTk9URTogIFRoaXMgc2hvdWxkIGNvbnRpbnVlIHdvcmtpbmcsIGV2ZW4gd2hlbiB3ZSdyZSBub3QgYXNzb2NpYXRlZCwKKyAqICAgc28gd2UgY2FuIGtlZXAgb3VyIGludGVybmFsIHRhYmxlIG9mIHNjYW4gcG93ZXJzIGN1cnJlbnQuICovCit2b2lkCitpbDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIFRoaXMgd2lsbCBraWNrIGluIHRoZSAiYnJ1dGUgZm9yY2UiCisJICogaWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcCgpIGJlbG93ICovCisJaWYgKCFpbDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoaWwpKQorCQlnb3RvIHJlc2NoZWR1bGU7CisKKwkvKiBTZXQgdXAgYSBuZXcgc2V0IG9mIHRlbXAtYWRqdXN0ZWQgVHhQb3dlcnMsIHNlbmQgdG8gTklDLgorCSAqIFRoaXMgaXMgYmFzZWQgKm9ubHkqIG9uIGN1cnJlbnQgdGVtcGVyYXR1cmUsCisJICogaWdub3JpbmcgYW55IHByZXZpb3VzIHBvd2VyIG1lYXN1cmVtZW50cyAqLworCWlsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoaWwpOworCityZXNjaGVkdWxlOgorCXF1ZXVlX2RlbGF5ZWRfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsCisJCQkgICBSRUdfUkVDQUxJQl9QRVJJT0QgKiBIWik7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwKKwkJCQkJICBfMzk0NS50aGVybWFsX3BlcmlvZGljLndvcmspOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2lkeCAtIGZpbmQgdGhlIGNoYW5uZWwtZ3JvdXAgaWR4ICgwLTQpIGZvciBjaGFubmVsLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGluaXRpYWxpemluZyBjaGFubmVsLWluZm8gc3RydWN0cy4KKyAqCisgKiBOT1RFOiBUaGVzZSBjaGFubmVsIGdyb3VwcyBkbyAqTk9UKiBtYXRjaCB0aGUgYmFuZHMgYWJvdmUhCisgKgkgVGhlc2UgY2hhbm5lbCBncm91cHMgYXJlIGJhc2VkIG9uIGZhY3RvcnktdGVzdGVkIGNoYW5uZWxzOworICoJIG9uIEEtYmFuZCwgRUVQUk9NJ3MgImdyb3VwIGZyZXF1ZW5jeSIgZW50cmllcyByZXByZXNlbnQgdGhlIHRvcAorICoJIGNoYW5uZWwgaW4gZWFjaCBncm91cCAxLTQuICBHcm91cCA1IEFsbCBCL0cgY2hhbm5lbHMgYXJlIGluIGdyb3VwIDAuCisgKi8KK3N0YXRpYyB1MTYKK2lsMzk0NV9od19yZWdfZ2V0X2NoX2dycF9pZHgoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCXN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmNoX2dycCA9ICZlZXByb20tPmdyb3Vwc1swXTsKKwl1OCBncm91cDsKKwl1MTYgZ3JvdXBfaWR4ID0gMDsJLyogYmFzZWQgb24gZmFjdG9yeSBjYWxpYiBmcmVxdWVuY2llcyAqLworCXU4IGdycF9jaGFubmVsOworCisJLyogRmluZCB0aGUgZ3JvdXAgaWR4IGZvciB0aGUgY2hhbm5lbCAuLi4gZG9uJ3QgdXNlIGlkeCAxKD8pICovCisJaWYgKGlsX2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pKSB7CisJCWZvciAoZ3JvdXAgPSAxOyBncm91cCA8IDU7IGdyb3VwKyspIHsKKwkJCWdycF9jaGFubmVsID0gY2hfZ3JwW2dyb3VwXS5ncm91cF9jaGFubmVsOworCQkJaWYgKGNoX2luZm8tPmNoYW5uZWwgPD0gZ3JwX2NoYW5uZWwpIHsKKwkJCQlncm91cF9pZHggPSBncm91cDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBncm91cCA0IGhhcyBhIGZldyBjaGFubmVscyAqYWJvdmUqIGl0cyBmYWN0b3J5IGNhbCBmcmVxICovCisJCWlmIChncm91cCA9PSA1KQorCQkJZ3JvdXBfaWR4ID0gNDsKKwl9IGVsc2UKKwkJZ3JvdXBfaWR4ID0gMDsJLyogMi40IEdIeiwgZ3JvdXAgMCAqLworCisJRF9QT1dFUigiQ2hubCAlZCBtYXBwZWQgdG8gZ3JwICVkXG4iLCBjaF9pbmZvLT5jaGFubmVsLCBncm91cF9pZHgpOworCXJldHVybiBncm91cF9pZHg7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19nZXRfbWF0Y2hlZF9wb3dlcl9pZHggLSBJbnRlcnBvbGF0ZSB0byBnZXQgbm9taW5hbCBpZHgKKyAqCisgKiBJbnRlcnBvbGF0ZSB0byBnZXQgbm9taW5hbCAoaS5lLiBhdCBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlKSBpZHgKKyAqICAgaW50byByYWRpby9EU1AgZ2FpbiBzZXR0aW5ncyB0YWJsZSBmb3IgcmVxdWVzdGVkIHBvd2VyLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX2dldF9tYXRjaGVkX3Bvd2VyX2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHJlcXVlc3RlZF9wb3dlciwKKwkJCQkgICAgczMyIHNldHRpbmdfaWR4LCBzMzIgKm5ld19pZHgpCit7CisJY29uc3Qgc3RydWN0IGlsMzk0NV9lZXByb21fdHhwb3dlcl9ncm91cCAqY2hubF9ncnAgPSBOVUxMOworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCXMzMiBpZHgwLCBpZHgxOworCXMzMiBwb3dlciA9IDIgKiByZXF1ZXN0ZWRfcG93ZXI7CisJczMyIGk7CisJY29uc3Qgc3RydWN0IGlsMzk0NV9lZXByb21fdHhwb3dlcl9zYW1wbGUgKnNhbXBsZXM7CisJczMyIGdhaW5zMCwgZ2FpbnMxOworCXMzMiByZXM7CisJczMyIGRlbm9taW5hdG9yOworCisJY2hubF9ncnAgPSAmZWVwcm9tLT5ncm91cHNbc2V0dGluZ19pZHhdOworCXNhbXBsZXMgPSBjaG5sX2dycC0+c2FtcGxlczsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChwb3dlciA9PSBzYW1wbGVzW2ldLnBvd2VyKSB7CisJCQkqbmV3X2lkeCA9IHNhbXBsZXNbaV0uZ2Fpbl9pZHg7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChwb3dlciA+IHNhbXBsZXNbMV0ucG93ZXIpIHsKKwkJaWR4MCA9IDA7CisJCWlkeDEgPSAxOworCX0gZWxzZSBpZiAocG93ZXIgPiBzYW1wbGVzWzJdLnBvd2VyKSB7CisJCWlkeDAgPSAxOworCQlpZHgxID0gMjsKKwl9IGVsc2UgaWYgKHBvd2VyID4gc2FtcGxlc1szXS5wb3dlcikgeworCQlpZHgwID0gMjsKKwkJaWR4MSA9IDM7CisJfSBlbHNlIHsKKwkJaWR4MCA9IDM7CisJCWlkeDEgPSA0OworCX0KKworCWRlbm9taW5hdG9yID0gKHMzMikgc2FtcGxlc1tpZHgxXS5wb3dlciAtIChzMzIpIHNhbXBsZXNbaWR4MF0ucG93ZXI7CisJaWYgKGRlbm9taW5hdG9yID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWdhaW5zMCA9IChzMzIpIHNhbXBsZXNbaWR4MF0uZ2Fpbl9pZHggKiAoMSA8PCAxOSk7CisJZ2FpbnMxID0gKHMzMikgc2FtcGxlc1tpZHgxXS5nYWluX2lkeCAqICgxIDw8IDE5KTsKKwlyZXMgPQorCSAgICBnYWluczAgKyAoZ2FpbnMxIC0gZ2FpbnMwKSAqICgoczMyKSBwb3dlciAtCisJCQkJCSAgKHMzMikgc2FtcGxlc1tpZHgwXS5wb3dlcikgLworCSAgICBkZW5vbWluYXRvciArICgxIDw8IDE4KTsKKwkqbmV3X2lkeCA9IHJlcyA+PiAxOTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9od19yZWdfaW5pdF9jaGFubmVsX2dyb3VwcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGk7CisJczMyIHJhdGVfaWR4OworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCWNvbnN0IHN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmdyb3VwOworCisJRF9QT1dFUigiSW5pdGlhbGl6aW5nIGZhY3RvcnkgY2FsaWIgaW5mbyBmcm9tIEVFUFJPTVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUxfTlVNX1RYX0NBTElCX0dST1VQUzsgaSsrKSB7CisJCXM4ICpjbGlwX3B3cnM7CS8qIHRhYmxlIG9mIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCisJCXM4IHNhdHVyX3B3cjsJLyogc2F0dXJhdGlvbiBwb3dlciBmb3IgZWFjaCBjaG5sIGdyb3VwICovCisJCWdyb3VwID0gJmVlcHJvbS0+Z3JvdXBzW2ldOworCisJCS8qIHNhbml0eSBjaGVjayBvbiBmYWN0b3J5IHNhdHVyYXRpb24gcG93ZXIgdmFsdWUgKi8KKwkJaWYgKGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyIDwgNDApIHsKKwkJCUlMX1dBUk4oIkVycm9yOiBzYXR1cmF0aW9uIHBvd2VyIGlzICVkLCAiCisJCQkJImxlc3MgdGhhbiBtaW5pbXVtIGV4cGVjdGVkIDQwXG4iLAorCQkJCWdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIERlcml2ZSByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUsIGJhc2VkIG9uCisJCSAqICAgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIChzYXR1cmF0aW9uIHBvd2VyIGZvciBiYW5kKS4KKwkJICogQmFzaWMgdmFsdWUgaXMgM2RCIGRvd24gZnJvbSBzYXR1cmF0aW9uLCB3aXRoIGZ1cnRoZXIKKwkJICogICBwb3dlciByZWR1Y3Rpb25zIGZvciBoaWdoZXN0IDMgZGF0YSByYXRlcy4gIFRoZXNlCisJCSAqICAgYmFja29mZnMgcHJvdmlkZSBoZWFkcm9vbSBmb3IgaGlnaCByYXRlIG1vZHVsYXRpb24KKwkJICogICBwb3dlciBwZWFrcywgd2l0aG91dCB0b28gbXVjaCBkaXN0b3J0aW9uIChjbGlwcGluZykuCisJCSAqLworCQkvKiB3ZSdsbCBmaWxsIGluIHRoaXMgYXJyYXkgd2l0aCBoL3cgbWF4IHBvd2VyIGxldmVscyAqLworCQljbGlwX3B3cnMgPSAoczggKikgaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2ldLmNsaXBfcG93ZXJzOworCisJCS8qIGRpdmlkZSBmYWN0b3J5IHNhdHVyYXRpb24gcG93ZXIgYnkgMiB0byBmaW5kIC0zZEIgbGV2ZWwgKi8KKwkJc2F0dXJfcHdyID0gKHM4KSAoZ3JvdXAtPnNhdHVyYXRpb25fcG93ZXIgPj4gMSk7CisKKwkJLyogZmlsbCBpbiBjaGFubmVsIGdyb3VwJ3Mgbm9taW5hbCBwb3dlcnMgZm9yIGVhY2ggcmF0ZSAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBSQVRFX0NPVU5UXzM5NDU7CisJCSAgICAgcmF0ZV9pZHgrKywgY2xpcF9wd3JzKyspIHsKKwkJCXN3aXRjaCAocmF0ZV9pZHgpIHsKKwkJCWNhc2UgUkFURV8zNk1fSURYX1RCTDoKKwkJCQlpZiAoaSA9PSAwKQkvKiBCL0cgKi8KKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3cjsKKwkJCQllbHNlCS8qIEEgKi8KKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBVEVfNDhNX0lEWF9UQkw6CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDc7CisJCQkJZWxzZQorCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gMTA7CisJCQkJYnJlYWs7CisJCQljYXNlIFJBVEVfNTRNX0lEWF9UQkw6CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDk7CisJCQkJZWxzZQorCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gMTI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogaWwzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tIC0gU2V0IGNoYW5uZWwgcG93ZXIgaW5mbyBiYXNlZCBvbiBFRVBST00KKyAqCisgKiBTZWNvbmQgcGFzcyAoZHVyaW5nIGluaXQpIHRvIHNldCB1cCBpbC0+Y2hhbm5lbF9pbmZvCisgKgorICogU2V0IHVwIFR4LXBvd2VyIHNldHRpbmdzIGluIG91ciBjaGFubmVsIGluZm8gZGF0YWJhc2UgZm9yIGVhY2ggVkFMSUQKKyAqIChmb3IgdGhpcyBnZW8vU0tVKSBjaGFubmVsLCBhdCBhbGwgVHggZGF0YSByYXRlcywgYmFzZWQgb24gZWVwcm9tIHZhbHVlcworICogYW5kIGN1cnJlbnQgdGVtcGVyYXR1cmUuCisgKgorICogU2luY2UgdGhpcyBpcyBiYXNlZCBvbiBjdXJyZW50IHRlbXBlcmF0dXJlIChhdCBpbml0IHRpbWUpLCB0aGVzZSB2YWx1ZXMgbWF5CisgKiBub3QgYmUgdmFsaWQgZm9yIHZlcnkgbG9uZywgYnV0IGl0IGdpdmVzIHVzIGEgc3RhcnRpbmcvZGVmYXVsdCBwb2ludCwKKyAqIGFuZCBhbGxvd3MgdXMgdG8gYWN0aXZlIChpLmUuIHVzaW5nIFR4KSBzY2FuLgorICoKKyAqIFRoaXMgZG9lcyAqbm90KiB3cml0ZSB2YWx1ZXMgdG8gTklDLCBqdXN0IHNldHMgdXAgb3VyIGludGVybmFsIHRhYmxlLgorICovCitpbnQKK2lsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7CisJc3RydWN0IGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gKnB3cl9pbmZvOworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCWludCBkZWx0YV9pZHg7CisJdTggcmF0ZV9pZHg7CisJdTggc2Nhbl90YmxfaWR4OworCWNvbnN0IHM4ICpjbGlwX3B3cnM7CS8qIGFycmF5IG9mIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCisJdTggZ2FpbiwgZHNwX2F0dGVuOworCXM4IHBvd2VyOworCXU4IHB3cl9pZHgsIGJhc2VfcHdyX2lkeCwgYV9iYW5kOworCXU4IGk7CisJaW50IHRlbXBlcmF0dXJlOworCisJLyogc2F2ZSB0ZW1wZXJhdHVyZSByZWZlcmVuY2UsCisJICogICBzbyB3ZSBjYW4gZGV0ZXJtaW5lIG5leHQgdGltZSB0byBjYWxpYnJhdGUgKi8KKwl0ZW1wZXJhdHVyZSA9IGlsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUoaWwpOworCWlsLT5sYXN0X3RlbXBlcmF0dXJlID0gdGVtcGVyYXR1cmU7CisKKwlpbDM5NDVfaHdfcmVnX2luaXRfY2hhbm5lbF9ncm91cHMoaWwpOworCisJLyogaW5pdGlhbGl6ZSBUeCBwb3dlciBpbmZvIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLworCWZvciAoaSA9IDAsIGNoX2luZm8gPSBpbC0+Y2hhbm5lbF9pbmZvOyBpIDwgaWwtPmNoYW5uZWxfY291bnQ7CisJICAgICBpKyssIGNoX2luZm8rKykgeworCQlhX2JhbmQgPSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKKwkJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCB0aGlzIGNoYW5uZWwncyBjaGFubmVsIGdyb3VwICgqbm90KiAiYmFuZCIpIGlkeCAqLworCQljaF9pbmZvLT5ncm91cF9pZHggPSBpbDM5NDVfaHdfcmVnX2dldF9jaF9ncnBfaWR4KGlsLCBjaF9pbmZvKTsKKworCQkvKiBHZXQgdGhpcyBjaG5sZ3JwJ3MgcmF0ZS0+bWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCisJCWNsaXBfcHdycyA9CisJCSAgICBpbC0+XzM5NDUuY2xpcF9ncm91cHNbY2hfaW5mby0+Z3JvdXBfaWR4XS5jbGlwX3Bvd2VyczsKKworCQkvKiBjYWxjdWxhdGUgcG93ZXIgaWR4ICphZGp1c3RtZW50KiB2YWx1ZSBhY2NvcmRpbmcgdG8KKwkJICogIGRpZmYgYmV0d2VlbiBjdXJyZW50IHRlbXBlcmF0dXJlIGFuZCBmYWN0b3J5IHRlbXBlcmF0dXJlICovCisJCWRlbHRhX2lkeCA9CisJCSAgICBpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLAorCQkJCQkJICAgICAgIGVlcHJvbS0+Z3JvdXBzW2NoX2luZm8tPgorCQkJCQkJCQkgICAgICBncm91cF9pZHhdLgorCQkJCQkJICAgICAgIHRlbXBlcmF0dXJlKTsKKworCQlEX1BPV0VSKCJEZWx0YSBpZHggZm9yIGNoYW5uZWwgJWQ6ICVkIFslZF1cbiIsIGNoX2luZm8tPmNoYW5uZWwsCisJCQlkZWx0YV9pZHgsIHRlbXBlcmF0dXJlICsgSUxfVEVNUF9DT05WRVJUKTsKKworCQkvKiBzZXQgdHggcG93ZXIgdmFsdWUgZm9yIGFsbCBPRkRNIHJhdGVzICovCisJCWZvciAocmF0ZV9pZHggPSAwOyByYXRlX2lkeCA8IElMX09GRE1fUkFURVM7IHJhdGVfaWR4KyspIHsKKwkJCXMzMiB1bmluaXRpYWxpemVkX3Zhcihwb3dlcl9pZHgpOworCQkJaW50IHJjOworCisJCQkvKiB1c2UgY2hhbm5lbCBncm91cCdzIGNsaXAtcG93ZXIgdGFibGUsCisJCQkgKiAgIGJ1dCBkb24ndCBleGNlZWQgY2hhbm5lbCdzIG1heCBwb3dlciAqLworCQkJczggcHdyID0gbWluKGNoX2luZm8tPm1heF9wb3dlcl9hdmcsCisJCQkJICAgICBjbGlwX3B3cnNbcmF0ZV9pZHhdKTsKKworCQkJcHdyX2luZm8gPSAmY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF07CisKKwkJCS8qIGdldCBiYXNlIChpLmUuIGF0IGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmUpCisJCQkgKiAgICBwb3dlciB0YWJsZSBpZHggZm9yIHRoaXMgcmF0ZSdzIHBvd2VyICovCisJCQlyYyA9IGlsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaWR4KGlsLCBwd3IsCisJCQkJCQkJCSBjaF9pbmZvLT4KKwkJCQkJCQkJIGdyb3VwX2lkeCwKKwkJCQkJCQkJICZwb3dlcl9pZHgpOworCQkJaWYgKHJjKSB7CisJCQkJSUxfRVJSKCJJbnZhbGlkIHBvd2VyIGlkeFxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJcHdyX2luZm8tPmJhc2VfcG93ZXJfaWR4ID0gKHU4KSBwb3dlcl9pZHg7CisKKwkJCS8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGUgKi8KKwkJCXBvd2VyX2lkeCArPSBkZWx0YV9pZHg7CisKKwkJCS8qIHN0YXkgd2l0aGluIHJhbmdlIG9mIGdhaW4gdGFibGUgKi8KKwkJCXBvd2VyX2lkeCA9IGlsMzk0NV9od19yZWdfZml4X3Bvd2VyX2lkeChwb3dlcl9pZHgpOworCisJCQkvKiBmaWxsIDEgT0ZETSByYXRlJ3MgaWwzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBzdHJ1Y3QgKi8KKwkJCXB3cl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwd3I7CisJCQlwd3JfaW5mby0+cG93ZXJfdGFibGVfaWR4ID0gKHU4KSBwb3dlcl9pZHg7CisJCQlwd3JfaW5mby0+dHBjLnR4X2dhaW4gPQorCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLnR4X2dhaW47CisJCQlwd3JfaW5mby0+dHBjLmRzcF9hdHRlbiA9CisJCQkgICAgcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3Bvd2VyX2lkeF0uZHNwX2F0dGVuOworCQl9CisKKwkJLyogc2V0IHR4IHBvd2VyIGZvciBDQ0sgcmF0ZXMsIGJhc2VkIG9uIE9GRE0gMTIgTWJpdCBzZXR0aW5ncyAqLworCQlwd3JfaW5mbyA9ICZjaF9pbmZvLT5wb3dlcl9pbmZvW1JBVEVfMTJNX0lEWF9UQkxdOworCQlwb3dlciA9IHB3cl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgKyBJTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkY7CisJCXB3cl9pZHggPSBwd3JfaW5mby0+cG93ZXJfdGFibGVfaWR4ICsgSUxfQ0NLX0ZST01fT0ZETV9JRFhfRElGRjsKKwkJYmFzZV9wd3JfaWR4ID0KKwkJICAgIHB3cl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCArIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkY7CisKKwkJLyogc3RheSB3aXRoaW4gdGFibGUgcmFuZ2UgKi8KKwkJcHdyX2lkeCA9IGlsMzk0NV9od19yZWdfZml4X3Bvd2VyX2lkeChwd3JfaWR4KTsKKwkJZ2FpbiA9IHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwd3JfaWR4XS50eF9nYWluOworCQlkc3BfYXR0ZW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2lkeF0uZHNwX2F0dGVuOworCisJCS8qIGZpbGwgZWFjaCBDQ0sgcmF0ZSdzIGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0dXJlCisJCSAqIE5PVEU6ICBBbGwgQ0NLLXJhdGUgVHhwd3JzIGFyZSB0aGUgc2FtZSBmb3IgYSBnaXZlbiBjaG5sIQorCQkgKiBOT1RFOiAgQ0NLIHJhdGVzIHN0YXJ0IGF0IGVuZCBvZiBPRkRNIHJhdGVzISAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBJTF9DQ0tfUkFURVM7IHJhdGVfaWR4KyspIHsKKwkJCXB3cl9pbmZvID0KKwkJCSAgICAmY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeCArIElMX09GRE1fUkFURVNdOworCQkJcHdyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOworCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCA9IHB3cl9pZHg7CisJCQlwd3JfaW5mby0+YmFzZV9wb3dlcl9pZHggPSBiYXNlX3B3cl9pZHg7CisJCQlwd3JfaW5mby0+dHBjLnR4X2dhaW4gPSBnYWluOworCQkJcHdyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPSBkc3BfYXR0ZW47CisJCX0KKworCQkvKiBzZXQgc2NhbiB0eCBwb3dlciwgMU1iaXQgZm9yIENDSywgNk1iaXQgZm9yIE9GRE0gKi8KKwkJZm9yIChzY2FuX3RibF9pZHggPSAwOyBzY2FuX3RibF9pZHggPCBJTF9OVU1fU0NBTl9SQVRFUzsKKwkJICAgICBzY2FuX3RibF9pZHgrKykgeworCQkJczMyIGFjdHVhbF9pZHggPQorCQkJICAgIChzY2FuX3RibF9pZHggPT0KKwkJCSAgICAgMCkgPyBSQVRFXzFNX0lEWF9UQkwgOiBSQVRFXzZNX0lEWF9UQkw7CisJCQlpbDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyKGlsLCBzY2FuX3RibF9pZHgsCisJCQkJCQkgICAgIGFjdHVhbF9pZHgsIGNsaXBfcHdycywKKwkJCQkJCSAgICAgY2hfaW5mbywgYV9iYW5kKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQKK2lsMzk0NV9od19yeHFfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjOworCisJaWxfd3IoaWwsIEZIMzlfUkNTUl9DT05GSUcoMCksIDApOworCXJjID0gaWxfcG9sbF9iaXQoaWwsIEZIMzlfUlNTUl9TVEFUVVMsCisJCQkgRkgzOV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUsIDEwMDApOworCWlmIChyYyA8IDApCisJCUlMX0VSUigiQ2FuJ3Qgc3RvcCBSeCBETUEuXG4iKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsMzk0NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCXN0cnVjdCBpbDM5NDVfc2hhcmVkICpzaGFyZWRfZGF0YSA9IGlsLT5fMzk0NS5zaGFyZWRfdmlydDsKKworCXNoYXJlZF9kYXRhLT50eF9iYXNlX3B0clt0eHFfaWRdID0gY3B1X3RvX2xlMzIoKHUzMikgdHhxLT5xLmRtYV9hZGRyKTsKKworCWlsX3dyKGlsLCBGSDM5X0NCQ0NfQ1RSTCh0eHFfaWQpLCAwKTsKKwlpbF93cihpbCwgRkgzOV9DQkNDX0JBU0UodHhxX2lkKSwgMCk7CisKKwlpbF93cihpbCwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVCB8CisJICAgICAgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRiB8CisJICAgICAgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRCB8CisJICAgICAgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFX1ZBTCB8CisJICAgICAgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRSk7CisKKwkvKiBmYWtlIHJlYWQgdG8gZmx1c2ggYWxsIHByZXYuIHdyaXRlcyAqLworCV9pbF9yZChpbCwgRkgzOV9UU1NSX0NCQl9CQVNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSENNRCB1dGlscworICovCitzdGF0aWMgdTE2CitpbDM5NDVfZ2V0X2hjbWRfc2l6ZSh1OCBjbWRfaWQsIHUxNiBsZW4pCit7CisJc3dpdGNoIChjbWRfaWQpIHsKKwljYXNlIENfUlhPTjoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kKTsKKwljYXNlIENfUE9XRVJfVEJMOgorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfcG93ZXJ0YWJsZV9jbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiBsZW47CisJfQorfQorCitzdGF0aWMgdTE2CitpbDM5NDVfYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGlsX2FkZHN0YV9jbWQgKmNtZCwgdTggKiBkYXRhKQoreworCXN0cnVjdCBpbDM5NDVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpbDM5NDVfYWRkc3RhX2NtZCAqKWRhdGE7CisJYWRkc3RhLT5tb2RlID0gY21kLT5tb2RlOworCW1lbWNweSgmYWRkc3RhLT5zdGEsICZjbWQtPnN0YSwgc2l6ZW9mKHN0cnVjdCBzdGFfaWRfbW9kaWZ5KSk7CisJbWVtY3B5KCZhZGRzdGEtPmtleSwgJmNtZC0+a2V5LCBzaXplb2Yoc3RydWN0IGlsNDk2NV9rZXlpbmZvKSk7CisJYWRkc3RhLT5zdGF0aW9uX2ZsYWdzID0gY21kLT5zdGF0aW9uX2ZsYWdzOworCWFkZHN0YS0+c3RhdGlvbl9mbGFnc19tc2sgPSBjbWQtPnN0YXRpb25fZmxhZ3NfbXNrOworCWFkZHN0YS0+dGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNigwKTsKKwlhZGRzdGEtPnJhdGVfbl9mbGFncyA9IGNtZC0+cmF0ZV9uX2ZsYWdzOworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfc3NuOworCisJcmV0dXJuICh1MTYpIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQpOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCAqIGFkZHIsIHU4ICogc3RhX2lkX3IpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzdGFfaWRfcikKKwkJKnN0YV9pZF9yID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJcmV0ID0gaWxfYWRkX3N0YXRpb25fY29tbW9uKGlsLCBjdHgsIGFkZHIsIDAsIE5VTEwsICZzdGFfaWQpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBhZGRyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoc3RhX2lkX3IpCisJCSpzdGFfaWRfciA9IHN0YV9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9MT0NBTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBib29sIGFkZCkKK3sKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCWludCByZXQ7CisKKwlpZiAoYWRkKSB7CisJCXJldCA9CisJCSAgICBpbDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24oaWwsIHZpZi0+YnNzX2NvbmYuYnNzaWQsCisJCQkJCSAgICAgJnZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlsMzk0NV9zeW5jX3N0YShpbCwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAorCQkJCShpbC0+YmFuZCA9PQorCQkJCSBJRUVFODAyMTFfQkFORF81R0haKSA/IFJBVEVfNk1fUExDUCA6CisJCQkJUkFURV8xTV9QTENQKTsKKwkJaWwzOTQ1X3JhdGVfc2NhbGVfaW5pdChpbC0+aHcsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGlsX3JlbW92ZV9zdGF0aW9uKGlsLCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCisJCQkJIHZpZi0+YnNzX2NvbmYuYnNzaWQpOworfQorCisvKioKKyAqIGlsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUgLSBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSByYXRlIGZhbGxiYWNrIHRhYmxlCisgKi8KK2ludAoraWwzOTQ1X2luaXRfaHdfcmF0ZV90YWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjLCBpLCBpZHgsIHByZXZfaWR4OworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCByYXRlX2NtZCA9IHsKKwkJLnJlc2VydmVkID0gezAsIDAsIDB9LAorCX07CisJc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyAqdGFibGUgPSByYXRlX2NtZC50YWJsZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlsMzk0NV9yYXRlcyk7IGkrKykgeworCQlpZHggPSBpbDM5NDVfcmF0ZXNbaV0udGFibGVfcnNfaWR4OworCisJCXRhYmxlW2lkeF0ucmF0ZV9uX2ZsYWdzID0KKwkJICAgIGlsMzk0NV9od19zZXRfcmF0ZV9uX2ZsYWdzKGlsMzk0NV9yYXRlc1tpXS5wbGNwLCAwKTsKKwkJdGFibGVbaWR4XS50cnlfY250ID0gaWwtPnJldHJ5X3JhdGU7CisJCXByZXZfaWR4ID0gaWwzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShpKTsKKwkJdGFibGVbaWR4XS5uZXh0X3JhdGVfaWR4ID0gaWwzOTQ1X3JhdGVzW3ByZXZfaWR4XS50YWJsZV9yc19pZHg7CisJfQorCisJc3dpdGNoIChpbC0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJRF9SQVRFKCJTZWxlY3QgQSBtb2RlIHJhdGUgc2NhbGVcbiIpOworCQkvKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBDQ0sgcmF0ZXMgaXMgdXNlZCwKKwkJICogaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlIDZNIE9GRE0gcmF0ZSAqLworCQlmb3IgKGkgPSBSQVRFXzFNX0lEWF9UQkw7IGkgPD0gUkFURV8xMU1fSURYX1RCTDsgaSsrKQorCQkJdGFibGVbaV0ubmV4dF9yYXRlX2lkeCA9CisJCQkgICAgaWwzOTQ1X3JhdGVzW0lMX0ZJUlNUX09GRE1fUkFURV0udGFibGVfcnNfaWR4OworCisJCS8qIERvbid0IGZhbGwgYmFjayB0byBDQ0sgcmF0ZXMgKi8KKwkJdGFibGVbUkFURV8xMk1fSURYX1RCTF0ubmV4dF9yYXRlX2lkeCA9IFJBVEVfOU1fSURYX1RCTDsKKworCQkvKiBEb24ndCBkcm9wIG91dCBvZiBPRkRNIHJhdGVzICovCisJCXRhYmxlW1JBVEVfNk1fSURYX1RCTF0ubmV4dF9yYXRlX2lkeCA9CisJCSAgICBpbDM5NDVfcmF0ZXNbSUxfRklSU1RfT0ZETV9SQVRFXS50YWJsZV9yc19pZHg7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlEX1JBVEUoIlNlbGVjdCBCL0cgbW9kZSByYXRlIHNjYWxlXG4iKTsKKwkJLyogSWYgYW4gT0ZETSByYXRlIGlzIHVzZWQsIGhhdmUgaXQgZmFsbCBiYWNrIHRvIHRoZQorCQkgKiAxTSBDQ0sgcmF0ZXMgKi8KKworCQlpZiAoIShpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgJiBJTF9PRkRNX1JBVEVTX01BU0spICYmCisJCSAgICBpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCisJCQlpZHggPSBJTF9GSVJTVF9DQ0tfUkFURTsKKwkJCWZvciAoaSA9IFJBVEVfNk1fSURYX1RCTDsgaSA8PSBSQVRFXzU0TV9JRFhfVEJMOyBpKyspCisJCQkJdGFibGVbaV0ubmV4dF9yYXRlX2lkeCA9CisJCQkJICAgIGlsMzk0NV9yYXRlc1tpZHhdLnRhYmxlX3JzX2lkeDsKKworCQkJaWR4ID0gUkFURV8xMU1fSURYX1RCTDsKKwkJCS8qIENDSyBzaG91bGRuJ3QgZmFsbCBiYWNrIHRvIE9GRE0uLi4gKi8KKwkJCXRhYmxlW2lkeF0ubmV4dF9yYXRlX2lkeCA9IFJBVEVfNU1fSURYX1RCTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCX0KKworCS8qIFVwZGF0ZSB0aGUgcmF0ZSBzY2FsaW5nIGZvciBjb250cm9sIGZyYW1lIFR4ICovCisJcmF0ZV9jbWQudGFibGVfaWQgPSAwOworCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksICZyYXRlX2NtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgZGF0YSBmcmFtZSBUeCAqLworCXJhdGVfY21kLnRhYmxlX2lkID0gMTsKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksICZyYXRlX2NtZCk7Cit9CisKKy8qIENhbGxlZCB3aGVuIGluaXRpYWxpemluZyBkcml2ZXIgKi8KK2ludAoraWwzOTQ1X2h3X3NldF9od19wYXJhbXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW1lbXNldCgodm9pZCAqKSZpbC0+aHdfcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IGlsX2h3X3BhcmFtcykpOworCisJaWwtPl8zOTQ1LnNoYXJlZF92aXJ0ID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlsMzk0NV9zaGFyZWQpLAorCQkJICAgICAgICZpbC0+XzM5NDUuc2hhcmVkX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghaWwtPl8zOTQ1LnNoYXJlZF92aXJ0KSB7CisJCUlMX0VSUigiZmFpbGVkIHRvIGFsbG9jYXRlIHBjaSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBc3NpZ24gbnVtYmVyIG9mIFVzYWJsZSBUWCBxdWV1ZXMgKi8KKwlpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisKKwlpbC0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdGZkKTsKKwlpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPSBnZXRfb3JkZXIoSUxfUlhfQlVGX1NJWkVfM0spOworCWlsLT5od19wYXJhbXMubWF4X3J4cV9zaXplID0gUlhfUVVFVUVfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7CisJaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJTDM5NDVfU1RBVElPTl9DT1VOVDsKKwlpbC0+Y3R4LmJjYXN0X3N0YV9pZCA9IElMMzk0NV9CUk9BRENBU1RfSUQ7CisKKwlpbC0+c3RhX2tleV9tYXhfbnVtID0gU1RBX0tFWV9NQVhfTlVNOworCisJaWwtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIMzlfUlNDU1JfQ0hOTDBfV1BUUjsKKwlpbC0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7CisJaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludAoraWwzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWUsCisJCQkgdTggcmF0ZSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisKKwl0eF9iZWFjb25fY21kID0gKHN0cnVjdCBpbDM5NDVfdHhfYmVhY29uX2NtZCAqKSZmcmFtZS0+dTsKKwltZW1zZXQodHhfYmVhY29uX2NtZCwgMCwgc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7CisKKwl0eF9iZWFjb25fY21kLT50eC5zdGFfaWQgPSBpbC0+Y3R4LmJjYXN0X3N0YV9pZDsKKwl0eF9iZWFjb25fY21kLT50eC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKworCWZyYW1lX3NpemUgPQorCSAgICBpbDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoaWwsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAorCQkJCSAgICAgc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCisJQlVHX09OKGZyYW1lX3NpemUgPiBNQVhfTVBEVV9TSVpFKTsKKwl0eF9iZWFjb25fY21kLT50eC5sZW4gPSBjcHVfdG9fbGUxNigodTE2KSBmcmFtZV9zaXplKTsKKworCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGUgPSByYXRlOworCXR4X2JlYWNvbl9jbWQtPnR4LnR4X2ZsYWdzID0KKwkgICAgKFRYX0NNRF9GTEdfU0VRX0NUTF9NU0sgfCBUWF9DTURfRkxHX1RTRl9NU0spOworCisJLyogc3VwcF9yYXRlc1swXSA9PSBPRkRNIHN0YXJ0IGF0IElMX0ZJUlNUX09GRE1fUkFURSAqLworCXR4X2JlYWNvbl9jbWQtPnR4LnN1cHBfcmF0ZXNbMF0gPQorCSAgICAoSUxfT0ZETV9CQVNJQ19SQVRFU19NQVNLID4+IElMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOworCisJdHhfYmVhY29uX2NtZC0+dHguc3VwcF9yYXRlc1sxXSA9IChJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAmIDB4Rik7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdHhfYmVhY29uX2NtZCkgKyBmcmFtZV9zaXplOworfQorCit2b2lkCitpbDM5NDVfaHdfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmhhbmRsZXJzW0NfVFhdID0gaWwzOTQ1X2hkbF90eDsKKwlpbC0+aGFuZGxlcnNbTl8zOTQ1X1JYXSA9IGlsMzk0NV9oZGxfcng7Cit9CisKK3ZvaWQKK2lsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsCisJCQkgIGlsMzk0NV9iZ19yZWdfdHhwb3dlcl9wZXJpb2RpYyk7Cit9CisKK3ZvaWQKK2lsMzk0NV9od19jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMpOworfQorCisvKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCitzdGF0aWMgaW50CitpbDM5NDVfdmVyaWZ5X2JzbShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZSA9IGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwl1MzIgbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXUzMiByZWc7CisJdTMyIHZhbDsKKworCURfSU5GTygiQmVnaW4gdmVyaWZ5IGJzbVxuIik7CisKKwkvKiB2ZXJpZnkgQlNNIFNSQU0gY29udGVudHMgKi8KKwl2YWwgPSBpbF9yZF9wcnBoKGlsLCBCU01fV1JfRFdDT1VOVF9SRUcpOworCWZvciAocmVnID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7IHJlZyA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCXZhbCA9IGlsX3JkX3BycGgoaWwsIHJlZyk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCisJCQkgICAgICAgImFkZHIgMHglMDhYKyV1IChvZiAldSksIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCByZWcgLSBCU01fU1JBTV9MT1dFUl9CT1VORCwKKwkJCSAgICAgICBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCURfSU5GTygiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDbGVhciB0aGUgT1dORVJfTVNLLCB0byBlc3RhYmxpc2ggZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlIHJ1bm5pbmcgb24KKyAqIGVtYmVkZGVkIGNvbnRyb2xsZXIpIGFzIEVFUFJPTSByZWFkZXI7IGVhY2ggcmVhZCBpcyBhIHNlcmllcyBvZiBwdWxzZXMKKyAqIHRvL2Zyb20gdGhlIEVFUFJPTSBjaGlwLCBub3QgYSBzaW5nbGUgZXZlbnQsIHNvIGV2ZW4gcmVhZHMgY291bGQgY29uZmxpY3QKKyAqIGlmIHRoZXkgd2VyZW4ndCBhcmJpdHJhdGVkIGJ5IHNvbWUgb3duZXJzaGlwIG1lY2hhbmlzbS4gIEhlcmUsIHRoZSBkcml2ZXIKKyAqIHNpbXBseSBjbGFpbXMgb3duZXJzaGlwLCB3aGljaCBzaG91bGQgYmUgc2FmZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiAoaS5lLiBiZWZvcmUgbG9hZGluZyB1Q29kZSEpLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfY2xlYXJfYml0KGlsLCBDU1JfRUVQUk9NX0dQLCBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm47Cit9CisKKyAvKioKKyAgKiBpbDM5NDVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKKyAgKgorICAqIEJTTSBvcGVyYXRpb246CisgICoKKyAgKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KKyAgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIGR1cmluZyBSRktJTEwuICBXaGVuIHBvd2VyaW5nIGJhY2sKKyAgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcworICAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCisgICoKKyAgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKKyAgKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQorICAqIEJTTV9EUkFNXyogcmVnaXN0ZXJzLiAgT25jZSB0aGUgbmV3IHByb2dyYW0gaXMgbG9hZGVkLCBpdCBzdGFydHMKKyAgKiBhdXRvbWF0aWNhbGx5LgorICAqCisgICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIHBvaW50cyB0aGUgQlNNIHRvIHRoZQorICAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KKyAgKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KKyAgKgorICAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCisgICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgorICAqIChmaWxsZWQgaW5pdGlhbGx5IHdpdGggc3RhcnRpbmcgZGF0YSB2YWx1ZXMgZm9yIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IpLAorICAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCisgICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCisgICoKKyAgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bworICAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KKyAgKgorICAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKKyAgKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCisgICogYW5kIHJlLWxhdW5jaGVzIHRoZSBydW50aW1lIHVDb2RlIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuCisgICovCitzdGF0aWMgaW50CitpbDM5NDVfbG9hZF9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisJdTMyIGluc3RfbGVuOworCXUzMiBkYXRhX2xlbjsKKwlpbnQgcmM7CisJaW50IGk7CisJdTMyIGRvbmU7CisJdTMyIHJlZ19vZmZzZXQ7CisKKwlEX0lORk8oIkJlZ2luIGxvYWQgYnNtXG4iKTsKKworCS8qIG1ha2Ugc3VyZSBib290c3RyYXAgcHJvZ3JhbSBpcyBubyBsYXJnZXIgdGhhbiBCU00ncyBTUkFNIHNpemUgKi8KKwlpZiAobGVuID4gSUwzOV9NQVhfQlNNX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCisJICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzE6MCBmb3IgMzk0NS4KKwkgKiBOT1RFOiAgaWwzOTQ1X2luaXRpYWxpemVfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAorCSAqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCisJICogICAgICAgIHJ1bnRpbWUvcHJvdG9jb2wgaW5zdHJ1Y3Rpb25zIGFuZCBiYWNrdXAgZGF0YSBjYWNoZS4gKi8KKwlwaW5zdCA9IGlsLT51Y29kZV9pbml0LnBfYWRkcjsKKwlwZGF0YSA9IGlsLT51Y29kZV9pbml0X2RhdGEucF9hZGRyOworCWluc3RfbGVuID0gaWwtPnVjb2RlX2luaXQubGVuOworCWRhdGFfbGVuID0gaWwtPnVjb2RlX2luaXRfZGF0YS5sZW47CisKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGRhdGFfbGVuKTsKKworCS8qIEZpbGwgQlNNIG1lbW9yeSB3aXRoIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKi8KKwlmb3IgKHJlZ19vZmZzZXQgPSBCU01fU1JBTV9MT1dFUl9CT1VORDsKKwkgICAgIHJlZ19vZmZzZXQgPCBCU01fU1JBTV9MT1dFUl9CT1VORCArIGxlbjsKKwkgICAgIHJlZ19vZmZzZXQgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspCisJCV9pbF93cl9wcnBoKGlsLCByZWdfb2Zmc2V0LCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKKworCXJjID0gaWwzOTQ1X3ZlcmlmeV9ic20oaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVGVsbCBCU00gdG8gY29weSBmcm9tIEJTTSBTUkFNIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSwgd2hlbiBhc2tlZCAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfTUVNX0RTVF9SRUcsIElMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9EV0NPVU5UX1JFRywgbGVuIC8gc2l6ZW9mKHUzMikpOworCisJLyogTG9hZCBib290c3RyYXAgY29kZSBpbnRvIGluc3RydWN0aW9uIFNSQU0gbm93LAorCSAqICAgdG8gcHJlcGFyZSB0byBsb2FkICJpbml0aWFsaXplIiB1Q29kZSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCk7CisKKwkvKiBXYWl0IGZvciBsb2FkIG9mIGJvb3RzdHJhcCB1Q29kZSB0byBmaW5pc2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJZG9uZSA9IGlsX3JkX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRyk7CisJCWlmICghKGRvbmUgJiBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA8IDEwMCkKKwkJRF9JTkZPKCJCU00gd3JpdGUgY29tcGxldGUsIHBvbGwgJWQgaXRlcmF0aW9uc1xuIiwgaSk7CisJZWxzZSB7CisJCUlMX0VSUigiQlNNIHdyaXRlIGRpZCBub3QgY29tcGxldGUhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCB0cmlnZ2VycyBpdAorCSAqICAgKGUuZy4gd2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHBvd2VyLXNhdmUgc2h1dGRvd24pICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUX0VOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfb3BzIGlsMzk0NV9oY21kID0geworCS5yeG9uX2Fzc29jID0gaWwzOTQ1X3NlbmRfcnhvbl9hc3NvYywKKwkuY29tbWl0X3J4b24gPSBpbDM5NDVfY29tbWl0X3J4b24sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2xpYl9vcHMgaWwzOTQ1X2xpYiA9IHsKKwkudHhxX2F0dGFjaF9idWZfdG9fdGZkID0gaWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKKwkudHhxX2ZyZWVfdGZkID0gaWwzOTQ1X2h3X3R4cV9mcmVlX3RmZCwKKwkudHhxX2luaXQgPSBpbDM5NDVfaHdfdHhfcXVldWVfaW5pdCwKKwkubG9hZF91Y29kZSA9IGlsMzk0NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaWwzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZywKKwkuYXBtX29wcyA9IHsKKwkJICAgIC5pbml0ID0gaWwzOTQ1X2FwbV9pbml0LAorCQkgICAgLmNvbmZpZyA9IGlsMzk0NV9uaWNfY29uZmlnLAorCQkgICAgfSwKKwkuZWVwcm9tX29wcyA9IHsKKwkJICAgICAgIC5yZWd1bGF0b3J5X2JhbmRzID0geworCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAorCQkJCQkgICAgfSwKKwkJICAgICAgIC5hY3F1aXJlX3NlbWFwaG9yZSA9IGlsMzk0NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCisJCSAgICAgICAucmVsZWFzZV9zZW1hcGhvcmUgPSBpbDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAorCQkgICAgICAgfSwKKwkuc2VuZF90eF9wb3dlciA9IGlsMzk0NV9zZW5kX3R4X3Bvd2VyLAorCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCS5kZWJ1Z2ZzX29wcyA9IHsKKwkJCS5yeF9zdGF0c19yZWFkID0gaWwzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCisJCQkudHhfc3RhdHNfcmVhZCA9IGlsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkLAorCQkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGlsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCisJCQl9LAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlsX2xlZ2FjeV9vcHMgaWwzOTQ1X2xlZ2FjeV9vcHMgPSB7CisJLnBvc3RfYXNzb2NpYXRlID0gaWwzOTQ1X3Bvc3RfYXNzb2NpYXRlLAorCS5jb25maWdfYXAgPSBpbDM5NDVfY29uZmlnX2FwLAorCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaWwzOTQ1X21hbmFnZV9pYnNzX3N0YXRpb24sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfdXRpbHNfb3BzIGlsMzk0NV9oY21kX3V0aWxzID0geworCS5nZXRfaGNtZF9zaXplID0gaWwzOTQ1X2dldF9oY21kX3NpemUsCisJLmJ1aWxkX2FkZHN0YV9oY21kID0gaWwzOTQ1X2J1aWxkX2FkZHN0YV9oY21kLAorCS5yZXF1ZXN0X3NjYW4gPSBpbDM5NDVfcmVxdWVzdF9zY2FuLAorCS5wb3N0X3NjYW4gPSBpbDM5NDVfcG9zdF9zY2FuLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9vcHMgaWwzOTQ1X29wcyA9IHsKKwkubGliID0gJmlsMzk0NV9saWIsCisJLmhjbWQgPSAmaWwzOTQ1X2hjbWQsCisJLnV0aWxzID0gJmlsMzk0NV9oY21kX3V0aWxzLAorCS5sZWQgPSAmaWwzOTQ1X2xlZF9vcHMsCisJLmxlZ2FjeSA9ICZpbDM5NDVfbGVnYWN5X29wcywKKwkuaWVlZTgwMjExX29wcyA9ICZpbDM5NDVfaHdfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9iYXNlX3BhcmFtcyBpbDM5NDVfYmFzZV9wYXJhbXMgPSB7CisJLmVlcHJvbV9zaXplID0gSUwzOTQ1X0VFUFJPTV9JTUdfU0laRSwKKwkubnVtX29mX3F1ZXVlcyA9IElMMzlfTlVNX1FVRVVFUywKKwkucGxsX2NmZ192YWwgPSBDU1IzOV9BTkFfUExMX0NGR19WQUwsCisJLnNldF9sMHMgPSBmYWxzZSwKKwkudXNlX2JzbSA9IHRydWUsCisJLmxlZF9jb21wZW5zYXRpb24gPSA2NCwKKwkud2RfdGltZW91dCA9IElMX0RFRl9XRF9USU1FT1VULAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2JnX2NmZyA9IHsKKwkubmFtZSA9ICIzOTQ1QkciLAorCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMMzk0NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfRywKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OLAorCS5vcHMgPSAmaWwzOTQ1X29wcywKKwkubW9kX3BhcmFtcyA9ICZpbDM5NDVfbW9kX3BhcmFtcywKKwkuYmFzZV9wYXJhbXMgPSAmaWwzOTQ1X2Jhc2VfcGFyYW1zLAorCS5sZWRfbW9kZSA9IElMX0xFRF9CTElOSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9hYmdfY2ZnID0geworCS5uYW1lID0gIjM5NDVBQkciLAorCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMMzk0NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfQSB8IElMX1NLVV9HLAorCS5lZXByb21fdmVyID0gRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04sCisJLm9wcyA9ICZpbDM5NDVfb3BzLAorCS5tb2RfcGFyYW1zID0gJmlsMzk0NV9tb2RfcGFyYW1zLAorCS5iYXNlX3BhcmFtcyA9ICZpbDM5NDVfYmFzZV9wYXJhbXMsCisJLmxlZF9tb2RlID0gSUxfTEVEX0JMSU5LLAorfTsKKworREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaWwzOTQ1X2h3X2NhcmRfaWRzKSA9IHsKKwl7SUxfUENJX0RFVklDRSgweDQyMjIsIDB4MTAwNSwgaWwzOTQ1X2JnX2NmZyl9LAorCXtJTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDM0LCBpbDM5NDVfYmdfY2ZnKX0sCisJe0lMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwNDQsIGlsMzk0NV9iZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjcsIDB4MTAxNCwgaWwzOTQ1X2JnX2NmZyl9LAorCXtJTF9QQ0lfREVWSUNFKDB4NDIyMiwgUENJX0FOWV9JRCwgaWwzOTQ1X2FiZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjcsIFBDSV9BTllfSUQsIGlsMzk0NV9hYmdfY2ZnKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWwzOTQ1X2h3X2NhcmRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI4OTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5oCkBAIC0wLDAgKzEsNjI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX2lsXzM5NDVfaF9fCisjZGVmaW5lIF9faWxfMzk0NV9oX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorCisvKiBIYXJkd2FyZSBzcGVjaWZpYyBmaWxlIGRlZmluZXMgdGhlIFBDSSBJRHMgdGFibGUgZm9yIHRoYXQgaGFyZHdhcmUgbW9kdWxlICovCitleHRlcm4gY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWwzOTQ1X2h3X2NhcmRfaWRzW107CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUwzOTQ1X1VDT0RFX0FQSV9NQVggMgorCisvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMMzk0NV9VQ09ERV9BUElfTUlOIDEKKworI2RlZmluZSBJTDM5NDVfRldfUFJFCSJpd2x3aWZpLTM5NDUtIgorI2RlZmluZSBfSUwzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIElMMzk0NV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lMMzk0NV9NT0RVTEVfRklSTVdBUkUoYXBpKQorCisvKiBEZWZhdWx0IG5vaXNlIGxldmVsIHRvIHJlcG9ydCB3aGVuIG5vaXNlIG1lYXN1cmVtZW50IGlzIG5vdCBhdmFpbGFibGUuCisgKiAgIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UncmU6CisgKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAoNDk2NSwgbm8gYmVhY29uIHN0YXRzIGJlaW5nIHNlbnQgdG8gZHJpdmVyKQorICogICAyKSAgU2Nhbm5pbmcgKG5vaXNlIG1lYXN1cmVtZW50IGRvZXMgbm90IGFwcGx5IHRvIGFzc29jaWF0ZWQgY2hhbm5lbCkKKyAqICAgMykgIFJlY2VpdmluZyBDQ0sgKDM5NDUgZGVsaXZlcnMgbm9pc2UgaW5mbyBvbmx5IGZvciBPRkRNIGZyYW1lcykKKyAqIFVzZSBkZWZhdWx0IG5vaXNlIHZhbHVlIG9mIC0xMjcgLi4uIHRoaXMgaXMgYmVsb3cgdGhlIHJhbmdlIG9mIG1lYXN1cmFibGUKKyAqICAgUnggZEJtIGZvciBlaXRoZXIgMzk0NSBvciA0OTY1LCBzbyBpdCBjYW4gaW5kaWNhdGUgInVubWVhc3VyYWJsZSIgdG8gdXNlci4KKyAqICAgQWxzbywgLTEyNyB3b3JrcyBiZXR0ZXIgdGhhbiAwIHdoZW4gYXZlcmFnaW5nIGZyYW1lcyB3aXRoL3dpdGhvdXQKKyAqICAgbm9pc2UgaW5mbyAoZS5nLiBhdmVyYWdpbmcgbWlnaHQgYmUgZG9uZSBpbiBhcHApOyBtZWFzdXJlZCBkQm0gdmFsdWVzIGFyZQorICogICBhbHdheXMgbmVnYXRpdmUgLi4uIHVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRlZmF1bHQga2VlcHMgYWxsCisgKiAgIGF2ZXJhZ2VzIHdpdGhpbiBhbiBzOCdzICh1c2VkIGluIHNvbWUgYXBwcykgcmFuZ2Ugb2YgbmVnYXRpdmUgdmFsdWVzLiAqLworI2RlZmluZSBJTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEUgKC0xMjcpCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzIGFjY2Vzc2libGUgZnJvbSBpd2wtKi5jICovCitleHRlcm4gc3RydWN0IGlsX21vZF9wYXJhbXMgaWwzOTQ1X21vZF9wYXJhbXM7CisKK3N0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHsKKwl1NjQgZGF0YTsKKwlzMzIgc3VjY2Vzc19jb3VudGVyOworCXMzMiBzdWNjZXNzX3JhdGlvOworCXMzMiBjb3VudGVyOworCXMzMiBhdmVyYWdlX3RwdDsKKwl1bnNpZ25lZCBsb25nIHN0YW1wOworfTsKKworc3RydWN0IGlsMzk0NV9yc19zdGEgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJczMyICpleHBlY3RlZF90cHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3BhcnRpYWxfZmx1c2g7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ZsdXNoOworCXUzMiBmbHVzaF90aW1lOworCXUzMiBsYXN0X3R4X3BhY2tldHM7CisJdTMyIHR4X3BhY2tldHM7CisJdTggdGdnOworCXU4IGZsdXNoX3BlbmRpbmc7CisJdTggc3RhcnRfcmF0ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByYXRlX3NjYWxlX2ZsdXNoOworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHdpbltSQVRFX0NPVU5UXzM5NDVdOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGU7CisjZW5kaWYKKworCS8qIHVzZWQgdG8gYmUgaW4gc3RhX2luZm8gKi8KKwlpbnQgbGFzdF90eHJhdGVfaWR4OworfTsKKworLyoKKyAqIFRoZSBjb21tb24gc3RydWN0IE1VU1QgYmUgZmlyc3QgYmVjYXVzZSBpdCBpcyBzaGFyZWQgYmV0d2VlbgorICogMzk0NSBhbmQgNDk2NSEKKyAqLworc3RydWN0IGlsMzk0NV9zdGFfcHJpdiB7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOworCXN0cnVjdCBpbDM5NDVfcnNfc3RhIHJzX3N0YTsKK307CisKK2VudW0gaWwzOTQ1X2FudGVubmEgeworCUlMX0FOVEVOTkFfRElWRVJTSVRZLAorCUlMX0FOVEVOTkFfTUFJTiwKKwlJTF9BTlRFTk5BX0FVWAorfTsKKworLyoKKyAqIFJUUyB0aHJlc2hvbGQgaGVyZSBpcyB0b3RhbCBzaXplIFsyMzQ3XSBtaW51cyA0IEZDUyBieXRlcworICogUGVyIHNwZWM6CisgKiAgIGEgdmFsdWUgb2YgMCBtZWFucyBSVFMgb24gYWxsIGRhdGEvbWFuYWdlbWVudCBwYWNrZXRzCisgKiAgIGEgdmFsdWUgPiBtYXggTVNEVSBzaXplIG1lYW5zIG5vIFJUUworICogZWxzZSBSVFMgZm9yIGRhdGEvbWFuYWdlbWVudCBmcmFtZXMgd2hlcmUgTVBEVSBpcyBsYXJnZXIKKyAqICAgdGhhbiBSVFMgdmFsdWUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAyMzQ3VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgIDBVCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgMjM0N1UKKyNkZWZpbmUgTUFYX01TRFVfU0laRQkJICAyMzA0VQorI2RlZmluZSBNQVhfTVBEVV9TSVpFCQkgIDIzNDZVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMICAgMTAwVQorI2RlZmluZQlERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUIDdVCisjZGVmaW5lCURFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCAgNFUKKworI2RlZmluZSBJTF9UWF9GSUZPX0FDMAkwCisjZGVmaW5lIElMX1RYX0ZJRk9fQUMxCTEKKyNkZWZpbmUgSUxfVFhfRklGT19BQzIJMgorI2RlZmluZSBJTF9UWF9GSUZPX0FDMwkzCisjZGVmaW5lIElMX1RYX0ZJRk9fSENDQV8xCTUKKyNkZWZpbmUgSUxfVFhfRklGT19IQ0NBXzIJNgorI2RlZmluZSBJTF9UWF9GSUZPX05PTkUJNworCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorCitzdHJ1Y3QgaWwzOTQ1X2ZyYW1lIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOworCQlzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgYmVhY29uOworCQl1OCByYXdbSUVFRTgwMjExX0ZSQU1FX0xFTl07CisJCXU4IGNtZFszNjBdOworCX0gdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIFNFUV9UT19TTihzZXEpICgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisjZGVmaW5lIFNOX1RPX1NFUShzc24pICgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisjZGVmaW5lIE1BWF9TTiAoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAorI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAorI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKKworI2RlZmluZSBJTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAorCisjZGVmaW5lIFNDQU5fSU5URVJWQUwgMTAwCisKKyNkZWZpbmUgTUFYX1RJRF9DT1VOVCAgICAgICAgOQorCisjZGVmaW5lIElMX0lOVkFMSURfUkFURSAgICAgMHhGRgorI2RlZmluZSBJTF9JTlZBTElEX1ZBTFVFICAgIC0xCisKKyNkZWZpbmUgU1RBX1BTX1NUQVRVU19XQUtFICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBX1BTX1NUQVRVU19TTEVFUCAgICAgICAgICAgIDEKKworc3RydWN0IGlsMzk0NV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bTsKKwl1MTYgZnJhZ19udW07CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIElMX1JYX0hEUih4KSAoKHN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfaGRyICopKFwKKwkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGF5bG9hZCArIFwKKwkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGh5X2NvdW50KSkKKyNkZWZpbmUgSUxfUlhfRU5EKHgpICgoc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgKikoXAorCQkgICAgICAgSUxfUlhfSERSKHgpLT5wYXlsb2FkICsgXAorCQkgICAgICAgbGUxNl90b19jcHUoSUxfUlhfSERSKHgpLT5sZW4pKSkKKyNkZWZpbmUgSUxfUlhfU1RBVFMoeCkgKCZ4LT51LnJ4X2ZyYW1lLnN0YXRzKQorI2RlZmluZSBJTF9SWF9EQVRBKHgpIChJTF9SWF9IRFIoeCktPnBheWxvYWQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gaXdsMzk0NS1iYXNlLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQorICogZm9yIHVzZSBieSBpd2wtKi5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIGludCBpbDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pOworZXh0ZXJuIHZvaWQgaWwzOTQ1X3J4X3JlcGxlbmlzaCh2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaWwzOTQ1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCQkgICAgIGludCBsZWZ0KTsKK2V4dGVybiBpbnQgaWwzOTQ1X2R1bXBfbmljX2V2ZW50X2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZnVsbF9sb2csCisJCQkJICAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGl3bC1bMzRdKi5jIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsMzk0NS1iYXNlLmMKKyAqCisgKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaGFyZHdhcmUgc3BlY2lmaWMKKyAqIHdoaWNoIGlzIHdoeSB0aGV5IGFyZSBpbiB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgKHZzLiBpd2wtYmFzZS5jKQorICoKKyAqIE5hbWluZyBjb252ZW50aW9uIC0tCisgKiBpbDM5NDVfICAgICAgICAgPC0tIEl0cyBwYXJ0IG9mIGl3bHdpZmkgKHNob3VsZCBiZSBjaGFuZ2VkIHRvIGlsMzk0NV8pCisgKiBpbDM5NDVfaHdfICAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGJ5IGFsbCBIVykKKyAqIGl3bFhYWFhfICAgICA8LS0gSGFyZHdhcmUgc3BlY2lmaWMgKGltcGxlbWVudGVkIGluIGl3bC1YWFhYLmMgZm9yIFhYWFgpCisgKiBpbDM5NDVfYmdfICAgICAgPC0tIENhbGxlZCBmcm9tIHdvcmsgcXVldWUgY29udGV4dAorICogaWwzOTQ1X21hY18gICAgIDwtLSBtYWM4MDIxMSBjYWxsYmFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X2hhbmRsZXJfc2V0dXAoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3J4cV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfbmljX3N0b3BfbWFzdGVyKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19uaWNfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSAgIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCQkgICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0LAorCQkJCQkgICB1OCBwYWQpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaWwzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJICAgICBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZSwKKwkJCQkJICAgICB1OCByYXRlKTsKK3ZvaWQgaWwzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQgc3RhX2lkLAorCQkJCSBpbnQgdHhfaWQpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfcmVnX3NlbmRfdHhwb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfcmVnX3NldF90eHBvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgczggcG93ZXIpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2hkbF9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsMzk0NV9oZGxfY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7CitleHRlcm4gdm9pZCBpbDM5NDVfZGlzYWJsZV9ldmVudHMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWw0OTY1X2dldF90ZW1wZXJhdHVyZShjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfY29uZmlnX2FwKHN0cnVjdCBpbF9wcml2ICppbCk7CisKK2V4dGVybiBpbnQgaWwzOTQ1X2NvbW1pdF9yeG9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKKworLyoqCisgKiBpbDM5NDVfaHdfZmluZF9zdGF0aW9uIC0gRmluZCBzdGF0aW9uIGlkIGZvciBhIGdpdmVuIEJTU0lECisgKiBAYnNzaWQ6IE1BQyBhZGRyZXNzIG9mIHN0YXRpb24gSUQgdG8gZmluZAorICoKKyAqIE5PVEU6ICBUaGlzIHNob3VsZCBub3QgYmUgaGFyZHdhcmUgc3BlY2lmaWMgYnV0IHRoZSBjb2RlIGhhcworICogbm90IHlldCBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGNvbW1vbiBsYXllciBmb3IgbWFuYWdpbmcgdGhlCisgKiBzdGF0aW9uIHRhYmxlcy4KKyAqLworZXh0ZXJuIHU4IGlsMzk0NV9od19maW5kX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCAqIGJzc2lkKTsKKworZXh0ZXJuIHN0cnVjdCBpZWVlODAyMTFfb3BzIGlsMzk0NV9od19vcHM7CisKK2V4dGVybiBfX2xlMzIgaWwzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfdHhwb3dlcl9zZXRfZnJvbV9lZXByb20oc3RydWN0IGlsX3ByaXYgKmlsKTsKKworZXh0ZXJuIGludCBpbDM5NDVfcnNfbmV4dF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHJhdGUpOworCisvKiBzY2FubmluZyAqLworaW50IGlsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK3ZvaWQgaWwzOTQ1X3Bvc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiByYXRlcyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbDM5NDVfcmF0ZV9pbmZvIGlsMzk0NV9yYXRlc1tSQVRFX0NPVU5UXzM5NDVdOworCisvKiBSU1NJIHRvIGRCbSAqLworI2RlZmluZSBJTDM5X1JTU0lfT0ZGU0VUCTk1CisKKy8qCisgKiBFRVBST00gcmVsYXRlZCBjb25zdGFudHMsIGVudW1zLCBhbmQgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZSBFRVBST01fU0tVX0NBUF9PUF9NT0RFX01SQyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQorCisvKgorICogTWFwcGluZyBvZiBhIFR4IHBvd2VyIGxldmVsLCBhdCBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlLAorICogICB0byBhIHJhZGlvL0RTUCBnYWluIHRhYmxlIGlkeC4KKyAqIE9uZSBmb3IgZWFjaCBvZiA1ICJzYW1wbGUiIHBvd2VyIGxldmVscyBpbiBlYWNoIGJhbmQuCisgKiB2X2RldCBpcyBtZWFzdXJlZCBhdCB0aGUgZmFjdG9yeSwgdXNpbmcgdGhlIDM5NDUncyBidWlsdC1pbiBwb3dlciBhbXBsaWZpZXIKKyAqICAgKFBBKSBvdXRwdXQgdm9sdGFnZSBkZXRlY3Rvci4gIFRoaXMgc2FtZSBkZXRlY3RvciBpcyB1c2VkIGR1cmluZyBUeCBvZgorICogICBsb25nIHBhY2tldHMgaW4gbm9ybWFsIG9wZXJhdGlvbiB0byBwcm92aWRlIGZlZWRiYWNrIGFzIHRvIHByb3BlciBvdXRwdXQKKyAqICAgbGV2ZWwuCisgKiBEYXRhIGNvcGllZCBmcm9tIEVFUFJPTS4KKyAqIERPIE5PVCBBTFRFUiBUSElTIFNUUlVDVFVSRSEhIQorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSB7CisJdTggZ2Fpbl9pZHg7CQkvKiBpZHggaW50byBwb3dlciAoZ2Fpbikgc2V0dXAgdGFibGUgLi4uICovCisJczggcG93ZXI7CQkvKiAuLi4gZm9yIHRoaXMgcHdyIGxldmVsIGZvciB0aGlzIGNobmwgZ3JvdXAgKi8KKwl1MTYgdl9kZXQ7CQkvKiBQQSBvdXRwdXQgdm9sdGFnZSAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIE1hcHBpbmdzIG9mIFR4IHBvd2VyIGxldmVscyAtPiBub21pbmFsIHJhZGlvL0RTUCBnYWluIHRhYmxlIGlkeGVzLgorICogT25lIGZvciBlYWNoIGNoYW5uZWwgZ3JvdXAgKGEuay5hLiAiYmFuZCIpICgxIGZvciBCRywgNCBmb3IgQSkuCisgKiBUeCBwb3dlciBzZXR1cCBjb2RlIGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSA1ICJzYW1wbGUiIHBvd2VyIGxldmVscworICogICAgdG8gZGV0ZXJtaW5lIHRoZSBub21pbmFsIHNldHVwIGZvciBhIHJlcXVlc3RlZCBwb3dlciBsZXZlbC4KKyAqIERhdGEgY29waWVkIGZyb20gRUVQUk9NLgorICogRE8gTk9UIEFMVEVSIFRISVMgU1RSVUNUVVJFISEhCisgKi8KK3N0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgeworCXN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfc2FtcGxlIHNhbXBsZXNbNV07CS8qIDUgcG93ZXIgbGV2ZWxzICovCisJczMyIGEsIGIsIGMsIGQsIGU7CS8qIGNvZWZmaWNpZW50cyBmb3Igdm9sdGFnZS0+cG93ZXIKKwkJCQkgKiBmb3JtdWxhIChzaWduZWQpICovCisJczMyIEZhLCBGYiwgRmMsIEZkLCBGZTsJLyogdGhlc2UgbW9kaWZ5IGNvZWZmcyBiYXNlZCBvbgorCQkJCSAqIGZyZXF1ZW5jeSAoc2lnbmVkKSAqLworCXM4IHNhdHVyYXRpb25fcG93ZXI7CS8qIGhpZ2hlc3QgcG93ZXIgcG9zc2libGUgYnkgaC93IGluIHRoaXMKKwkJCQkgKiBiYW5kICovCisJdTggZ3JvdXBfY2hhbm5lbDsJLyogInJlcHJlc2VudGF0aXZlIiBjaGFubmVsICMgaW4gdGhpcyBiYW5kICovCisJczE2IHRlbXBlcmF0dXJlOwkvKiBoL3cgdGVtcGVyYXR1cmUgYXQgZmFjdG9yeSBjYWxpYiB0aGlzIGJhbmQKKwkJCQkgKiAoc2lnbmVkKSAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIFRlbXBlcmF0dXJlLWJhc2VkIFR4LXBvd2VyIGNvbXBlbnNhdGlvbiBkYXRhLCBub3QgYmFuZC1zcGVjaWZpYy4KKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBhcmUgdXNlIHRvIG1vZGlmeSBhL2IvYy9kL2UgY29lZmZzIGJhc2VkIG9uCisgKiAgIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHRlbXBlcmF0dXJlIGFuZCBmYWN0b3J5IGNhbGliIHRlbXBlcmF0dXJlLgorICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCisgKi8KK3N0cnVjdCBpbDM5NDVfZWVwcm9tX3RlbXBlcmF0dXJlX2NvcnIgeworCXUzMiBUYTsKKwl1MzIgVGI7CisJdTMyIFRjOworCXUzMiBUZDsKKwl1MzIgVGU7Cit9IF9fcGFja2VkOworCisvKgorICogRUVQUk9NIG1hcAorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSB7CisJdTggcmVzZXJ2ZWQwWzE2XTsKKwl1MTYgZGV2aWNlX2lkOwkJLyogYWJzLm9mczogMTYgKi8KKwl1OCByZXNlcnZlZDFbMl07CisJdTE2IHBtYzsJCS8qIGFicy5vZnM6IDIwICovCisJdTggcmVzZXJ2ZWQyWzIwXTsKKwl1OCBtYWNfYWRkcmVzc1s2XTsJLyogYWJzLm9mczogNDIgKi8KKwl1OCByZXNlcnZlZDNbNThdOworCXUxNiBib2FyZF9yZXZpc2lvbjsJLyogYWJzLm9mczogMTA2ICovCisJdTggcmVzZXJ2ZWQ0WzExXTsKKwl1OCBib2FyZF9wYmFfbnVtYmVyWzldOwkvKiBhYnMub2ZzOiAxMTkgKi8KKwl1OCByZXNlcnZlZDVbOF07CisJdTE2IHZlcnNpb247CQkvKiBhYnMub2ZzOiAxMzYgKi8KKwl1OCBza3VfY2FwOwkJLyogYWJzLm9mczogMTM4ICovCisJdTggbGVkc19tb2RlOwkJLyogYWJzLm9mczogMTM5ICovCisJdTE2IG9lbV9tb2RlOworCXUxNiB3b3dsYW5fbW9kZTsJLyogYWJzLm9mczogMTQyICovCisJdTE2IGxlZHNfdGltZV9pbnRlcnZhbDsJLyogYWJzLm9mczogMTQ0ICovCisJdTggbGVkc19vZmZfdGltZTsJLyogYWJzLm9mczogMTQ2ICovCisJdTggbGVkc19vbl90aW1lOwkvKiBhYnMub2ZzOiAxNDcgKi8KKwl1OCBhbG1nb3JfbV92ZXJzaW9uOwkvKiBhYnMub2ZzOiAxNDggKi8KKwl1OCBhbnRlbm5hX3N3aXRjaF90eXBlOwkvKiBhYnMub2ZzOiAxNDkgKi8KKwl1OCByZXNlcnZlZDZbNDJdOworCXU4IHNrdV9pZFs0XTsJCS8qIGFicy5vZnM6IDE5MiAqLworCisvKgorICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgorICoKKyAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IDM5NDUgaGFzIGEgZml4ZWQgbG9jYXRpb24KKyAqIGluIEVFUFJPTSBjb250YWluaW5nIEVFUFJPTV9DSEFOTkVMXyogdXNhZ2UgZmxhZ3MgKExTQikgYW5kIG1heCByZWd1bGF0b3J5CisgKiB0eHBvd2VyIChNU0IpLgorICoKKyAqIEVudHJpZXMgaW1tZWRpYXRlbHkgYmVsb3cgYXJlIGZvciAyMCBNSHogY2hhbm5lbCB3aWR0aC4KKyAqCisgKiAyLjQgR0h6IGNoYW5uZWxzIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorICovCisJdTE2IGJhbmRfMV9jb3VudDsJLyogYWJzLm9mczogMTk2ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfMV9jaGFubmVsc1sxNF07CS8qIGFicy5vZnM6IDE5OCAqLworCisvKgorICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKKyAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgorICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCisgKi8KKwl1MTYgYmFuZF8yX2NvdW50OwkvKiBhYnMub2ZzOiAyMjYgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgYmFuZF8yX2NoYW5uZWxzWzEzXTsJLyogYWJzLm9mczogMjI4ICovCisKKy8qCisgKiA1LjIgR0h6IGNoYW5uZWxzIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQKKyAqICg1MTcwLTUzMjBNSHopCisgKi8KKwl1MTYgYmFuZF8zX2NvdW50OwkvKiBhYnMub2ZzOiAyNTQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgYmFuZF8zX2NoYW5uZWxzWzEyXTsJLyogYWJzLm9mczogMjU2ICovCisKKy8qCisgKiA1LjUgR0h6IGNoYW5uZWxzIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCisgKiAoNTUwMC01NzAwTUh6KQorICovCisJdTE2IGJhbmRfNF9jb3VudDsJLyogYWJzLm9mczogMjgwICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfNF9jaGFubmVsc1sxMV07CS8qIGFicy5vZnM6IDI4MiAqLworCisvKgorICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisgKiAoNTcyNS01ODI1TUh6KQorICovCisJdTE2IGJhbmRfNV9jb3VudDsJLyogYWJzLm9mczogMzA0ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfNV9jaGFubmVsc1s2XTsJLyogYWJzLm9mczogMzA2ICovCisKKwl1OCByZXNlcnZlZDlbMTk0XTsKKworLyoKKyAqIDM5NDUgVHhwb3dlciBjYWxpYnJhdGlvbiBkYXRhLgorICovCisjZGVmaW5lIElMX05VTV9UWF9DQUxJQl9HUk9VUFMgNQorCXN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgZ3JvdXBzW0lMX05VTV9UWF9DQUxJQl9HUk9VUFNdOworLyogYWJzLm9mczogNTEyICovCisJc3RydWN0IGlsMzk0NV9lZXByb21fdGVtcGVyYXR1cmVfY29yciBjb3JyZWN0aW9uczsJLyogYWJzLm9mczogODMyICovCisJdTggcmVzZXJ2ZWQxNlsxNzJdOwkvKiBmaWxsIG91dCB0byBmdWxsIDEwMjQgYnl0ZSBibG9jayAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJTDM5NDVfRUVQUk9NX0lNR19TSVpFIDEwMjQKKworLyogRW5kIG9mIEVFUFJPTSAqLworCisjZGVmaW5lIFBDSV9DRkdfUkVWX0lEX0JJVF9CQVNJQ19TS1UgICAgICAgICAgICAgICAgKDB4NDApCS8qIGJpdCA2ICAgICovCisjZGVmaW5lIFBDSV9DRkdfUkVWX0lEX0JJVF9SVFAgICAgICAgICAgICAgICAgICAgICAgKDB4ODApCS8qIGJpdCA3ICAgICovCisKKy8qIDQgREFUQSArIDEgQ01ELiBUaGVyZSBhcmUgMiBIQ0NBIHF1ZXVlcyB0aGF0IGFyZSBub3QgdXNlZC4gKi8KKyNkZWZpbmUgSUwzOV9OVU1fUVVFVUVTICAgICAgICA1CisjZGVmaW5lIElMMzlfQ01EX1FVRVVFX05VTQk0CisKKyNkZWZpbmUgSUxfREVGQVVMVF9UWF9SRVRSWSAgMTUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSRkRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX1RGRF9DSFVOS1MgICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgVEZEX0NUTF9DT1VOVF9TRVQobikgICAgICAgKG4gPDwgMjQpCisjZGVmaW5lIFRGRF9DVExfQ09VTlRfR0VUKGN0bCkgICAgICgoY3RsID4+IDI0KSAmIDcpCisjZGVmaW5lIFRGRF9DVExfUEFEX1NFVChuKSAgICAgICAgIChuIDw8IDI4KQorI2RlZmluZSBURkRfQ1RMX1BBRF9HRVQoY3RsKSAgICAgICAoY3RsID4+IDI4KQorCisvKiBTaXplcyBhbmQgYWRkcmVzc2VzIGZvciBpbnN0cnVjdGlvbiBhbmQgZGF0YSBtZW1vcnkgKFNSQU0pIGluCisgKiAzOTQ1J3MgZW1iZWRkZWQgcHJvY2Vzc29yLiAgRHJpdmVyIGFjY2VzcyBpcyB2aWEgSEJVU19UQVJHX01FTV8qIHJlZ3MuICovCisjZGVmaW5lIElMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKKyNkZWZpbmUgSUwzOV9SVENfSU5TVF9VUFBFUl9CT1VORAkJKDB4MDE0MDAwKQorCisjZGVmaW5lIElMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQJCSgweDgwMDAwMCkKKyNkZWZpbmUgSUwzOV9SVENfREFUQV9VUFBFUl9CT1VORAkJKDB4ODA4MDAwKQorCisjZGVmaW5lIElMMzlfUlRDX0lOU1RfU0laRSAoSUwzOV9SVENfSU5TVF9VUFBFUl9CT1VORCAtIFwKKwkJCQlJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQorI2RlZmluZSBJTDM5X1JUQ19EQVRBX1NJWkUgKElMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCisJCQkJSUwzOV9SVENfREFUQV9MT1dFUl9CT1VORCkKKworI2RlZmluZSBJTDM5X01BWF9JTlNUX1NJWkUgSUwzOV9SVENfSU5TVF9TSVpFCisjZGVmaW5lIElMMzlfTUFYX0RBVEFfU0laRSBJTDM5X1JUQ19EQVRBX1NJWkUKKworLyogU2l6ZSBvZiB1Q29kZSBpbnN0cnVjdGlvbiBtZW1vcnkgaW4gYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgSUwzOV9NQVhfQlNNX1NJWkUgSUwzOV9SVENfSU5TVF9TSVpFCisKK3N0YXRpYyBpbmxpbmUgaW50CitpbDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcikKK3sKKwlyZXR1cm4gKGFkZHIgPj0gSUwzOV9SVENfREFUQV9MT1dFUl9CT1VORCAmJgorCQlhZGRyIDwgSUwzOV9SVENfREFUQV9VUFBFUl9CT1VORCk7Cit9CisKKy8qIEJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiBpbDM5NDVfc2hhcmVkIGlzIHByb3ZpZGVkIHRvIEZIMzlfVFNTUl9DQkJfQkFTRQorICogYW5kICZpbDM5NDVfc2hhcmVkLnJ4X3JlYWRfcHRyWzBdIGlzIHByb3ZpZGVkIHRvIEZIMzlfUkNTUl9SUFRSX0FERFIoMCkgKi8KK3N0cnVjdCBpbDM5NDVfc2hhcmVkIHsKKwlfX2xlMzIgdHhfYmFzZV9wdHJbOF07Cit9IF9fcGFja2VkOworCitzdGF0aWMgaW5saW5lIHU4CitpbDM5NDVfaHdfZ2V0X3JhdGUoX19sZTE2IHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUocmF0ZV9uX2ZsYWdzKSAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitpbDM5NDVfaHdfZ2V0X3JhdGVfbl9mbGFncyhfX2xlMTYgcmF0ZV9uX2ZsYWdzKQoreworCXJldHVybiBsZTE2X3RvX2NwdShyYXRlX25fZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIF9fbGUxNgoraWwzOTQ1X2h3X3NldF9yYXRlX25fZmxhZ3ModTggcmF0ZSwgdTE2IGZsYWdzKQoreworCXJldHVybiBjcHVfdG9fbGUxNigodTE2KSByYXRlIHwgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaXdsMzk0NSBGbG93IEhhbmRsZXIgRGVmaW5pdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGhpcyBJL08gYXJlYSBpcyBkaXJlY3RseSByZWFkL3dyaXRhYmxlIGJ5IGRyaXZlciAoZS5nLiBMaW51eCB1c2VzIHdyaXRlbCgpKQorICogQWRkcmVzc2VzIGFyZSBvZmZzZXRzIGZyb20gZGV2aWNlJ3MgUENJIGhhcmR3YXJlIGJhc2UgYWRkcmVzcy4KKyAqLworI2RlZmluZSBGSDM5X01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgwODAwKQorI2RlZmluZSBGSDM5X01FTV9VUFBFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQorCisjZGVmaW5lIEZIMzlfQ0JDQ19UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4MTQwKQorI2RlZmluZSBGSDM5X1RGREJfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE4MCkKKyNkZWZpbmUgRkgzOV9SQ1NSX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg0MDApCisjZGVmaW5lIEZIMzlfUlNTUl9UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4NGMwKQorI2RlZmluZSBGSDM5X1RDU1JfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDUwMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg2ODApCisKKy8qIFRGREIgKFRyYW5zbWl0IEZyYW1lIEJ1ZmZlciBEZXNjcmlwdG9yKSAqLworI2RlZmluZSBGSDM5X1RGREIoX2NoLCBidWYpCQkJKEZIMzlfVEZEQl9UQkwgKyBcCisJCQkJCQkgKChfY2gpICogMiArIChidWYpKSAqIDB4MjgpCisjZGVmaW5lIEZIMzlfVEZEQl9DSE5MX0JVRl9DVFJMX1JFRyhfY2gpCShGSDM5X1RGREJfVEJMICsgMHg1MCAqIChfY2gpKQorCisvKiBDQkNDIGNoYW5uZWwgaXMgWzAsMl0gKi8KKyNkZWZpbmUgRkgzOV9DQkNDKF9jaCkJCShGSDM5X0NCQ0NfVEJMICsgKF9jaCkgKiAweDgpCisjZGVmaW5lIEZIMzlfQ0JDQ19DVFJMKF9jaCkJKEZIMzlfQ0JDQyhfY2gpICsgMHgwMCkKKyNkZWZpbmUgRkgzOV9DQkNDX0JBU0UoX2NoKQkoRkgzOV9DQkNDKF9jaCkgKyAweDA0KQorCisvKiBSQ1NSIGNoYW5uZWwgaXMgWzAsMl0gKi8KKyNkZWZpbmUgRkgzOV9SQ1NSKF9jaCkJCQkoRkgzOV9SQ1NSX1RCTCArIChfY2gpICogMHg0MCkKKyNkZWZpbmUgRkgzOV9SQ1NSX0NPTkZJRyhfY2gpCQkoRkgzOV9SQ1NSKF9jaCkgKyAweDAwKQorI2RlZmluZSBGSDM5X1JDU1JfUkJEX0JBU0UoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgwNCkKKyNkZWZpbmUgRkgzOV9SQ1NSX1dQVFIoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgyMCkKKyNkZWZpbmUgRkgzOV9SQ1NSX1JQVFJfQUREUihfY2gpCShGSDM5X1JDU1IoX2NoKSArIDB4MjQpCisKKyNkZWZpbmUgRkgzOV9SU0NTUl9DSE5MMF9XUFRSCQkoRkgzOV9SQ1NSX1dQVFIoMCkpCisKKy8qIFJTU1IgKi8KKyNkZWZpbmUgRkgzOV9SU1NSX0NUUkwJCQkoRkgzOV9SU1NSX1RCTCArIDB4MDAwKQorI2RlZmluZSBGSDM5X1JTU1JfU1RBVFVTCQkoRkgzOV9SU1NSX1RCTCArIDB4MDA0KQorCisvKiBUQ1NSICovCisjZGVmaW5lIEZIMzlfVENTUihfY2gpCQkJKEZIMzlfVENTUl9UQkwgKyAoX2NoKSAqIDB4MjApCisjZGVmaW5lIEZIMzlfVENTUl9DT05GSUcoX2NoKQkJKEZIMzlfVENTUihfY2gpICsgMHgwMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX0NSRURJVChfY2gpCQkoRkgzOV9UQ1NSKF9jaCkgKyAweDA0KQorI2RlZmluZSBGSDM5X1RDU1JfQlVGRl9TVFRTKF9jaCkJKEZIMzlfVENTUihfY2gpICsgMHgwOCkKKworLyogVFNTUiAqLworI2RlZmluZSBGSDM5X1RTU1JfQ0JCX0JBU0UgICAgICAgIChGSDM5X1RTU1JfVEJMICsgMHgwMDApCisjZGVmaW5lIEZIMzlfVFNTUl9NU0dfQ09ORklHICAgICAgKEZIMzlfVFNTUl9UQkwgKyAweDAwOCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVUyAgICAgICAoRkgzOV9UU1NSX1RCTCArIDB4MDEwKQorCisvKiBEQk0gKi8KKworI2RlZmluZSBGSDM5X1NSVkNfQ0hOTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNikKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfUkJEQ19TSVpFICAgICAoMjApCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1BPU19JUlFfUkJUSCAgICAgICg0KQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOICAgICgweDA4MDAwMDAwKQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SRFJCRF9FTl9FTkFCTEUgICAgICAgICAgICgweDIwMDAwMDAwKQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOAkJKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0lSUV9ERVNUX0lOVF9IT1NUCQkoMHgwMDAwMTAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRkgJCQkoMHgwMDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSSVZFUgkJKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRV9WQUwJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwJKDB4MDAwMDAwMDgpCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRAkJKDB4MDAyMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UCQkoMHgwMDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UJCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCQkoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkJKDB4MDAwMDQwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfQklUX1RGREJfV1BUUgkJKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9UWFBEX09OCSgweEZGMDAwMDAwKQorI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX1RYUERfT04JKDB4MDBGRjAwMDApCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIJKDB4MDAwMDA0MDApCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9URkRfT04JCSgweDAwMDAwMTAwKQorI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTgkJKDB4MDAwMDAwODApCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USAkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9SU1BfV0FJVF9USAkJKDB4MDAwMDAwMDUpCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKQkoQklUKF9jaCkgPDwgMjQpCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9OT19QRU5EX1JFUShfY2gpCShCSVQoX2NoKSA8PCAxNikKKworI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaCkgXAorCShGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfQlVGU19FTVBUWShfY2gpIHwgXAorCSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKSkKKworI2RlZmluZSBGSDM5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRQkJCSgweDAxMDAwMDAwKQorCitzdHJ1Y3QgaWwzOTQ1X3RmZF90YiB7CisJX19sZTMyIGFkZHI7CisJX19sZTMyIGxlbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDM5NDVfdGZkIHsKKwlfX2xlMzIgY29udHJvbF9mbGFnczsKKwlzdHJ1Y3QgaWwzOTQ1X3RmZF90YiB0YnNbNF07CisJdTggX19wYWRbMjhdOworfSBfX3BhY2tlZDsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzc2l6ZV90IGlsMzk0NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBpbDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgaWwzOTQ1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJCWxvZmZfdCAqcHBvcyk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWNhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWNhbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNDhlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtY2FsaWIuYwpAQCAtMCwwICsxLDk0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjQ5NjUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUIGNhbGlicmF0aW9ucyBmcmFtZXdvcmsKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHN0YXRzX2dlbmVyYWxfZGF0YSB7CisJdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYTsKKwl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9iOworCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2M7CisJdTMyIGJlYWNvbl9lbmVyZ3lfYTsKKwl1MzIgYmVhY29uX2VuZXJneV9iOworCXUzMiBiZWFjb25fZW5lcmd5X2M7Cit9OworCit2b2lkCitpbDQ5NjVfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJTF9DQUxJQl9NQVg7IGkrKykgeworCQlrZnJlZShpbC0+Y2FsaWJfcmVzdWx0c1tpXS5idWYpOworCQlpbC0+Y2FsaWJfcmVzdWx0c1tpXS5idWYgPSBOVUxMOworCQlpbC0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuID0gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUlVOVElNRSBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICJmYWxzZSBhbGFybXMiIGFyZSBzaWduYWxzIHRoYXQgb3VyIERTUCB0cmllcyB0byBsb2NrIG9udG8sCisgKiAgIGJ1dCB0aGVuIGRldGVybWluZXMgdGhhdCB0aGV5IGFyZSBlaXRoZXIgbm9pc2UsIG9yIHRyYW5zbWlzc2lvbnMKKyAqICAgZnJvbSBhIGRpc3RhbnQgd2lyZWxlc3MgbmV0d29yayAoYWxzbyAibm9pc2UiLCByZWFsbHkpIHRoYXQgZ2V0CisgKiAgICJzdGVwcGVkIG9uIiBieSBzdHJvbmdlciB0cmFuc21pc3Npb25zIHdpdGhpbiBvdXIgb3duIG5ldHdvcmsuCisgKiBUaGlzIGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZXQgYSBzZW5zaXRpdml0eSBsZXZlbCB0aGF0IGlzIGhpZ2gKKyAqICAgZW5vdWdoIHRvIHJlY2VpdmUgYWxsIG9mIG91ciBvd24gbmV0d29yayB0cmFmZmljLCBidXQgbm90IHNvCisgKiAgIGhpZ2ggdGhhdCBvdXIgRFNQIGdldHMgdG9vIGJ1c3kgdHJ5aW5nIHRvIGxvY2sgb250byBub24tbmV0d29yaworICogICBhY3Rpdml0eS9ub2lzZS4gKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5zX2VuZXJneV9jY2soc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbm9ybV9mYSwgdTMyIHJ4X2VuYWJsZV90aW1lLAorCQkgICAgICAgc3RydWN0IHN0YXRzX2dlbmVyYWxfZGF0YSAqcnhfaW5mbykKK3sKKwl1MzIgbWF4X25yZ19jY2sgPSAwOworCWludCBpID0gMDsKKwl1OCBtYXhfc2lsZW5jZV9yc3NpID0gMDsKKwl1MzIgc2lsZW5jZV9yZWYgPSAwOworCXU4IHNpbGVuY2VfcnNzaV9hID0gMDsKKwl1OCBzaWxlbmNlX3Jzc2lfYiA9IDA7CisJdTggc2lsZW5jZV9yc3NpX2MgPSAwOworCXUzMiB2YWw7CisKKwkvKiAiZmFsc2VfYWxhcm1zIiB2YWx1ZXMgYmVsb3cgYXJlIGNyb3NzLW11bHRpcGxpY2F0aW9ucyB0byBhc3Nlc3MgdGhlCisJICogICBudW1iZXJzIG9mIGZhbHNlIGFsYXJtcyB3aXRoaW4gdGhlIG1lYXN1cmVkIHBlcmlvZCBvZiBhY3R1YWwgUngKKwkgKiAgIChSeCBpcyBvZmYgd2hlbiB3ZSdyZSB0eGluZyksIHZzIHRoZSBtaW4vbWF4IGV4cGVjdGVkIGZhbHNlIGFsYXJtcworCSAqICAgKHNvbWUgc2hvdWxkIGJlIGV4cGVjdGVkIGlmIHJ4IGlzIHNlbnNpdGl2ZSBlbm91Z2gpIGluIGEKKwkgKiAgIGh5cG90aGV0aWNhbCBsaXN0ZW5pbmcgcGVyaW9kIG9mIDIwMCB0aW1lIHVuaXRzIChUVSksIDIwNC44IG1zZWM6CisJICoKKwkgKiBNSU5fRkEvZml4ZWQtdGltZSA8IGZhbHNlX2FsYXJtcy9hY3R1YWwtcngtdGltZSA8IE1BWF9GQS9iZWFjb24tdGltZQorCSAqCisJICogKi8KKwl1MzIgZmFsc2VfYWxhcm1zID0gbm9ybV9mYSAqIDIwMCAqIDEwMjQ7CisJdTMyIG1heF9mYWxzZV9hbGFybXMgPSBNQVhfRkFfQ0NLICogcnhfZW5hYmxlX3RpbWU7CisJdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfQ0NLICogcnhfZW5hYmxlX3RpbWU7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IGlsLT5od19wYXJhbXMuc2VuczsKKworCWRhdGEgPSAmKGlsLT5zZW5zaXRpdml0eV9kYXRhKTsKKworCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0gMDsKKworCS8qIEZpbmQgbWF4IHNpbGVuY2UgcnNzaSBhbW9uZyBhbGwgMyByZWNlaXZlcnMuCisJICogVGhpcyBpcyBiYWNrZ3JvdW5kIG5vaXNlLCB3aGljaCBtYXkgaW5jbHVkZSB0cmFuc21pc3Npb25zIGZyb20gb3RoZXIKKwkgKiAgICBuZXR3b3JrcywgbWVhc3VyZWQgZHVyaW5nIHNpbGVuY2UgYmVmb3JlIG91ciBuZXR3b3JrJ3MgYmVhY29uICovCisJc2lsZW5jZV9yc3NpX2EgPQorCSAgICAodTgpICgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hICYgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKKwlzaWxlbmNlX3Jzc2lfYiA9CisJICAgICh1OCkgKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IgJiBBTExfQkFORF9GSUxURVIpID4+IDgpOworCXNpbGVuY2VfcnNzaV9jID0KKwkgICAgKHU4KSAoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyAmIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7CisKKwl2YWwgPSBtYXgoc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jKTsKKwltYXhfc2lsZW5jZV9yc3NpID0gbWF4KHNpbGVuY2VfcnNzaV9hLCAodTgpIHZhbCk7CisKKwkvKiBTdG9yZSBzaWxlbmNlIHJzc2kgaW4gMjAtYmVhY29uIGhpc3RvcnkgdGFibGUgKi8KKwlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2RhdGEtPm5yZ19zaWxlbmNlX2lkeF0gPSBtYXhfc2lsZW5jZV9yc3NpOworCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCsrOworCWlmIChkYXRhLT5ucmdfc2lsZW5jZV9pZHggPj0gTlJHX05VTV9QUkVWX1NUQVRfTCkKKwkJZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKKworCS8qIEZpbmQgbWF4IHNpbGVuY2UgcnNzaSBhY3Jvc3MgMjAgYmVhY29uIGhpc3RvcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgaSsrKSB7CisJCXZhbCA9IGRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV07CisJCXNpbGVuY2VfcmVmID0gbWF4KHNpbGVuY2VfcmVmLCB2YWwpOworCX0KKwlEX0NBTElCKCJzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIDIwLWJjbiBtYXggJXVcbiIsIHNpbGVuY2VfcnNzaV9hLAorCQlzaWxlbmNlX3Jzc2lfYiwgc2lsZW5jZV9yc3NpX2MsIHNpbGVuY2VfcmVmKTsKKworCS8qIEZpbmQgbWF4IHJ4IGVuZXJneSAobWluIHZhbHVlISkgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLAorCSAqICAgbWVhc3VyZWQgZHVyaW5nIGJlYWNvbiBmcmFtZS4KKwkgKiBTYXZlIGl0IGluIDEwLWJlYWNvbiBoaXN0b3J5IHRhYmxlLiAqLworCWkgPSBkYXRhLT5ucmdfZW5lcmd5X2lkeDsKKwl2YWwgPSBtaW4ocnhfaW5mby0+YmVhY29uX2VuZXJneV9iLCByeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MpOworCWRhdGEtPm5yZ192YWx1ZVtpXSA9IG1pbihyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EsIHZhbCk7CisKKwlkYXRhLT5ucmdfZW5lcmd5X2lkeCsrOworCWlmIChkYXRhLT5ucmdfZW5lcmd5X2lkeCA+PSAxMCkKKwkJZGF0YS0+bnJnX2VuZXJneV9pZHggPSAwOworCisJLyogRmluZCBtaW4gcnggZW5lcmd5IChtYXggdmFsdWUpIGFjcm9zcyAxMCBiZWFjb24gaGlzdG9yeS4KKwkgKiBUaGlzIGlzIHRoZSBtaW5pbXVtIHNpZ25hbCBsZXZlbCB0aGF0IHdlIHdhbnQgdG8gcmVjZWl2ZSB3ZWxsLgorCSAqIEFkZCBiYWNrb2ZmIChtYXJnaW4gc28gd2UgZG9uJ3QgbWlzcyBzbGlnaHRseSBsb3dlciBlbmVyZ3kgZnJhbWVzKS4KKwkgKiBUaGlzIGVzdGFibGlzaGVzIGFuIHVwcGVyIGJvdW5kIChtaW4gdmFsdWUpIGZvciBlbmVyZ3kgdGhyZXNob2xkLiAqLworCW1heF9ucmdfY2NrID0gZGF0YS0+bnJnX3ZhbHVlWzBdOworCWZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKQorCQltYXhfbnJnX2NjayA9ICh1MzIpIG1heChtYXhfbnJnX2NjaywgKGRhdGEtPm5yZ192YWx1ZVtpXSkpOworCW1heF9ucmdfY2NrICs9IDY7CisKKwlEX0NBTElCKCJyeCBlbmVyZ3kgYSAldSwgYiAldSwgYyAldSwgMTAtYmNuIG1heC9taW4gJXVcbiIsCisJCXJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSwgcnhfaW5mby0+YmVhY29uX2VuZXJneV9iLAorCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MsIG1heF9ucmdfY2NrIC0gNik7CisKKwkvKiBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmVhY29ucyB3aXRoIGZld2VyLXRoYW4tZGVzaXJlZAorCSAqICAgZmFsc2UgYWxhcm1zLiAqLworCWlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKQorCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKys7CisJZWxzZQorCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKKwlEX0NBTElCKCJjb25zZWN1dGl2ZSBiY25zIHdpdGggZmV3IGZhbHNlIGFsYXJtcyA9ICV1XG4iLAorCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKKworCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KKwlpZiAoZmFsc2VfYWxhcm1zID4gbWF4X2ZhbHNlX2FsYXJtcyAmJgorCSAgICBkYXRhLT5hdXRvX2NvcnJfY2NrID4gQVVUT19DT1JSX01BWF9USF9DQ0spIHsKKwkJRF9DQUxJQigibm9ybSBGQSAldSA+IG1heCBGQSAldVxuIiwgZmFsc2VfYWxhcm1zLAorCQkJbWF4X2ZhbHNlX2FsYXJtcyk7CisJCURfQ0FMSUIoIi4uLiByZWR1Y2luZyBzZW5zaXRpdml0eVxuIik7CisJCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSUxfRkFfVE9PX01BTlk7CisJCS8qIFN0b3JlIGZvciAiZmV3ZXIgdGhhbiBkZXNpcmVkIiBvbiBsYXRlciBiZWFjb24gKi8KKwkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gc2lsZW5jZV9yZWY7CisKKwkJLyogaW5jcmVhc2UgZW5lcmd5IHRocmVzaG9sZCAocmVkdWNlIG5yZyB2YWx1ZSkKKwkJICogICB0byBkZWNyZWFzZSBzZW5zaXRpdml0eSAqLworCQlkYXRhLT5ucmdfdGhfY2NrID0gZGF0YS0+bnJnX3RoX2NjayAtIE5SR19TVEVQX0NDSzsKKwkJLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCX0gZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgeworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX1RPT19GRVc7CisKKwkJLyogQ29tcGFyZSBzaWxlbmNlIGxldmVsIHdpdGggc2lsZW5jZSBsZXZlbCBmb3IgbW9zdCByZWNlbnQKKwkJICogICBoZWFsdGh5IG51bWJlciBvciB0b28gbWFueSBmYWxzZSBhbGFybXMgKi8KKwkJZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPQorCQkgICAgKHMzMikgZGF0YS0+bnJnX3NpbGVuY2VfcmVmIC0gKHMzMikgc2lsZW5jZV9yZWY7CisKKwkJRF9DQUxJQigibm9ybSBGQSAldSA8IG1pbiBGQSAldSwgc2lsZW5jZSBkaWZmICVkXG4iLAorCQkJZmFsc2VfYWxhcm1zLCBtaW5fZmFsc2VfYWxhcm1zLAorCQkJZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOworCisJCS8qIEluY3JlYXNlIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5LCBidXQgb25seSBpZjoKKwkJICogMWEpIHByZXZpb3VzIGJlYWNvbiBkaWQgKm5vdCogaGF2ZSAqdG9vIG1hbnkqIGZhbHNlIGFsYXJtcworCQkgKiAxYikgQU5EIHRoZXJlJ3MgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIFJ4IGxldmVscworCQkgKiAgICAgIGZyb20gYSBwcmV2aW91cyBiZWFjb24gd2l0aCB0b28gbWFueSwgb3IgaGVhbHRoeSAjIEZBcworCQkgKiBPUiAyKSBXZSd2ZSBzZWVuIGEgbG90IG9mIGJlYWNvbnMgKDEwMCkgd2l0aCB0b28gZmV3CisJCSAqICAgICAgIGZhbHNlIGFsYXJtcyAqLworCQlpZiAoZGF0YS0+bnJnX3ByZXZfc3RhdGUgIT0gSUxfRkFfVE9PX01BTlkgJiYKKwkJICAgIChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGIHx8CisJCSAgICAgZGF0YS0+bnVtX2luX2Nja19ub19mYSA+IE1BWF9OVU1CRVJfQ0NLX05PX0ZBKSkgeworCisJCQlEX0NBTElCKCIuLi4gaW5jcmVhc2luZyBzZW5zaXRpdml0eVxuIik7CisJCQkvKiBJbmNyZWFzZSBucmcgdmFsdWUgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkJCXZhbCA9IGRhdGEtPm5yZ190aF9jY2sgKyBOUkdfU1RFUF9DQ0s7CisJCQlkYXRhLT5ucmdfdGhfY2NrID0gbWluKCh1MzIpIHJhbmdlcy0+bWluX25yZ19jY2ssIHZhbCk7CisJCX0gZWxzZSB7CisJCQlEX0NBTElCKCIuLi4gYnV0IG5vdCBjaGFuZ2luZyBzZW5zaXRpdml0eVxuIik7CisJCX0KKworCQkvKiBFbHNlIHdlIGdvdCBhIGhlYWx0aHkgbnVtYmVyIG9mIGZhbHNlIGFsYXJtcywga2VlcCBzdGF0dXMgcXVvICovCisJfSBlbHNlIHsKKwkJRF9DQUxJQigiIEZBIGluIHNhZmUgem9uZVxuIik7CisJCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSUxfRkFfR09PRF9SQU5HRTsKKworCQkvKiBTdG9yZSBmb3IgdXNlIGluICJmZXdlciB0aGFuIGRlc2lyZWQiIHdpdGggbGF0ZXIgYmVhY29uICovCisJCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOworCisJCS8qIElmIHByZXZpb3VzIGJlYWNvbiBoYWQgdG9vIG1hbnkgZmFsc2UgYWxhcm1zLAorCQkgKiAgIGdpdmUgaXQgc29tZSBleHRyYSBtYXJnaW4gYnkgcmVkdWNpbmcgc2Vuc2l0aXZpdHkgYWdhaW4KKwkJICogICAoYnV0IGRvbid0IGdvIGJlbG93IG1lYXN1cmVkIGVuZXJneSBvZiBkZXNpcmVkIFJ4KSAqLworCQlpZiAoSUxfRkFfVE9PX01BTlkgPT0gZGF0YS0+bnJnX3ByZXZfc3RhdGUpIHsKKwkJCURfQ0FMSUIoIi4uLiBpbmNyZWFzaW5nIG1hcmdpblxuIik7CisJCQlpZiAoZGF0YS0+bnJnX3RoX2NjayA+IChtYXhfbnJnX2NjayArIE5SR19NQVJHSU4pKQorCQkJCWRhdGEtPm5yZ190aF9jY2sgLT0gTlJHX01BUkdJTjsKKwkJCWVsc2UKKwkJCQlkYXRhLT5ucmdfdGhfY2NrID0gbWF4X25yZ19jY2s7CisJCX0KKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIGVuZXJneSB0aHJlc2hvbGQgZG9lcyBub3QgZ28gYWJvdmUgdGhlIG1lYXN1cmVkCisJICogZW5lcmd5IG9mIHRoZSBkZXNpcmVkIFJ4IHNpZ25hbHMgKHJlZHVjZWQgYnkgYmFja29mZiBtYXJnaW4pLAorCSAqIG9yIGVsc2Ugd2UgbWlnaHQgc3RhcnQgbWlzc2luZyBSeCBmcmFtZXMuCisJICogTG93ZXIgdmFsdWUgaXMgaGlnaGVyIGVuZXJneSwgc28gd2UgdXNlIG1heCgpIQorCSAqLworCWRhdGEtPm5yZ190aF9jY2sgPSBtYXgobWF4X25yZ19jY2ssIGRhdGEtPm5yZ190aF9jY2spOworCURfQ0FMSUIoIm5ldyBucmdfdGhfY2NrICV1XG4iLCBkYXRhLT5ucmdfdGhfY2NrKTsKKworCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gZGF0YS0+bnJnX2N1cnJfc3RhdGU7CisKKwkvKiBBdXRvLWNvcnJlbGF0aW9uIENDSyBhbGdvcml0aG0gKi8KKwlpZiAoZmFsc2VfYWxhcm1zID4gbWluX2ZhbHNlX2FsYXJtcykgeworCisJCS8qIGluY3JlYXNlIGF1dG9fY29yciB2YWx1ZXMgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkKKwkJICogc28gdGhlIERTUCB3b24ndCBiZSBkaXN0dXJiZWQgYnkgdGhlIG5vaXNlCisJCSAqLworCQlpZiAoZGF0YS0+YXV0b19jb3JyX2NjayA8IEFVVE9fQ09SUl9NQVhfVEhfQ0NLKQorCQkJZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9NQVhfVEhfQ0NLICsgMTsKKwkJZWxzZSB7CisJCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrICsgQVVUT19DT1JSX1NURVBfQ0NLOworCQkJZGF0YS0+YXV0b19jb3JyX2NjayA9CisJCQkgICAgbWluKCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21heF9jY2ssIHZhbCk7CisJCX0KKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgKyBBVVRPX0NPUlJfU1RFUF9DQ0s7CisJCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfY2NrX21yYywgdmFsKTsKKwl9IGVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMgJiYKKwkJICAgKGRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID4gTlJHX0RJRkYgfHwKKwkJICAgIGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpIHsKKworCQkvKiBEZWNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2sgLSBBVVRPX0NPUlJfU1RFUF9DQ0s7CisJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBtYXgoKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2NjaywgdmFsKTsKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgLSBBVVRPX0NPUlJfU1RFUF9DQ0s7CisJCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KKwkJICAgIG1heCgodTMyKSByYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYywgdmFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWw0OTY1X3NlbnNfYXV0b19jb3JyX29mZG0oc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbm9ybV9mYSwgdTMyIHJ4X2VuYWJsZV90aW1lKQoreworCXUzMiB2YWw7CisJdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OworCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX09GRE0gKiByeF9lbmFibGVfdGltZTsKKwl1MzIgbWluX2ZhbHNlX2FsYXJtcyA9IE1JTl9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IGlsLT5od19wYXJhbXMuc2VuczsKKworCWRhdGEgPSAmKGlsLT5zZW5zaXRpdml0eV9kYXRhKTsKKworCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KKwlpZiAoZmFsc2VfYWxhcm1zID4gbWF4X2ZhbHNlX2FsYXJtcykgeworCisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPiBtYXggRkEgJXUpXG4iLCBmYWxzZV9hbGFybXMsCisJCQltYXhfZmFsc2VfYWxhcm1zKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSArIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQorCQkgICAgbWluKCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yYywgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSArIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV94MSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQorCQkgICAgbWluKCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yY194MSwgdmFsKTsKKwl9CisKKwkvKiBFbHNlIGlmIHdlIGdvdCBmZXdlciB0aGFuIGRlc2lyZWQsIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCisJZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgeworCisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXVcbiIsIGZhbHNlX2FsYXJtcywKKwkJCW1pbl9mYWxzZV9hbGFybXMpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG0gPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtLCB2YWwpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9CisJCSAgICBtYXgoKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjLCB2YWwpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxLCB2YWwpOworCisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9CisJCSAgICBtYXgoKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxLCB2YWwpOworCX0gZWxzZSB7CisJCURfQ0FMSUIoIm1pbiBGQSAldSA8IG5vcm0gRkEgJXUgPCBtYXggRkEgJXUgT0tcbiIsCisJCQltaW5fZmFsc2VfYWxhcm1zLCBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90Ymwoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhLAorCQkJCSAgICAgIF9fbGUxNiAqdGJsKQoreworCXRibFtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSk7CisJdGJsW0hEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fTVJDX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMpOworCXRibFtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSk7CisJdGJsW0hEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fTVJDX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEpOworCisJdGJsW0hEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSURYXSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPmF1dG9fY29ycl9jY2spOworCXRibFtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX2Nja19tcmMpOworCisJdGJsW0hEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFhdID0gY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+bnJnX3RoX2Njayk7CisJdGJsW0hEX01JTl9FTkVSR1lfT0ZETV9ERVRfSURYXSA9IGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPm5yZ190aF9vZmRtKTsKKworCXRibFtIRF9CQVJLRVJfQ09SUl9USF9BRERfTUlOX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNihkYXRhLT5iYXJrZXJfY29ycl90aF9taW4pOworCXRibFtIRF9CQVJLRVJfQ09SUl9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluX21yYyk7CisJdGJsW0hEX09GRE1fRU5FUkdZX1RIX0lOX0lEWF0gPSBjcHVfdG9fbGUxNihkYXRhLT5ucmdfdGhfY2NhKTsKKworCURfQ0FMSUIoIm9mZG06IGFjICV1IG1yYyAldSB4MSAldSBtcmNfeDEgJXUgdGhyZXNoICV1XG4iLAorCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSwgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjLAorCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSwgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxLAorCQlkYXRhLT5ucmdfdGhfb2ZkbSk7CisKKwlEX0NBTElCKCJjY2s6IGFjICV1IG1yYyAldSB0aHJlc2ggJXVcbiIsIGRhdGEtPmF1dG9fY29ycl9jY2ssCisJCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjLCBkYXRhLT5ucmdfdGhfY2NrKTsKK30KKworLyogUHJlcGFyZSBhIENfU0VOU0lUSVZJVFksIHNlbmQgdG8gdUNvZGUgaWYgdmFsdWVzIGhhdmUgY2hhbmdlZCAqLworc3RhdGljIGludAoraWw0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfY21kIGNtZDsKKwlzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZF9vdXQgPSB7CisJCS5pZCA9IENfU0VOU0lUSVZJVFksCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCksCisJCS5mbGFncyA9IENNRF9BU1lOQywKKwkJLmRhdGEgPSAmY21kLAorCX07CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCisJaWw0OTY1X3ByZXBhcmVfbGVnYWN5X3NlbnNpdGl2aXR5X3RibChpbCwgZGF0YSwgJmNtZC50YWJsZVswXSk7CisKKwkvKiBVcGRhdGUgdUNvZGUncyAid29yayIgdGFibGUsIGFuZCBjb3B5IGl0IHRvIERTUCAqLworCWNtZC5jb250cm9sID0gQ19TRU5TSVRJVklUWV9DT05UUk9MX1dPUktfVEJMOworCisJLyogRG9uJ3Qgc2VuZCBjb21tYW5kIHRvIHVDb2RlIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KKwlpZiAoIW1lbWNtcAorCSAgICAoJmNtZC50YWJsZVswXSwgJihpbC0+c2Vuc2l0aXZpdHlfdGJsWzBdKSwKKwkgICAgIHNpemVvZih1MTYpICogSERfVEJMX1NJWkUpKSB7CisJCURfQ0FMSUIoIk5vIGNoYW5nZSBpbiBDX1NFTlNJVElWSVRZXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ29weSB0YWJsZSBmb3IgY29tcGFyaXNvbiBuZXh0IHRpbWUgKi8KKwltZW1jcHkoJihpbC0+c2Vuc2l0aXZpdHlfdGJsWzBdKSwgJihjbWQudGFibGVbMF0pLAorCSAgICAgICBzaXplb2YodTE2KSAqIEhEX1RCTF9TSVpFKTsKKworCXJldHVybiBpbF9zZW5kX2NtZChpbCwgJmNtZF9vdXQpOworfQorCit2b2lkCitpbDQ5NjVfaW5pdF9zZW5zaXRpdml0eShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IGlsLT5od19wYXJhbXMuc2VuczsKKworCWlmIChpbC0+ZGlzYWJsZV9zZW5zX2NhbCkKKwkJcmV0dXJuOworCisJRF9DQUxJQigiU3RhcnQgaWw0OTY1X2luaXRfc2Vuc2l0aXZpdHlcbiIpOworCisJLyogQ2xlYXIgZHJpdmVyJ3Mgc2Vuc2l0aXZpdHkgYWxnbyBkYXRhICovCisJZGF0YSA9ICYoaWwtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJaWYgKHJhbmdlcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhKSk7CisKKwlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKKwlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX1RPT19NQU5ZOworCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gSUxfRkFfVE9PX01BTlk7CisJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gMDsKKwlkYXRhLT5ucmdfc2lsZW5jZV9pZHggPSAwOworCWRhdGEtPm5yZ19lbmVyZ3lfaWR4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlkYXRhLT5ucmdfdmFsdWVbaV0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykKKwkJZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtpXSA9IDA7CisKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtOworCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYzsKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxOworCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKKwlkYXRhLT5hdXRvX2NvcnJfY2NrID0gQVVUT19DT1JSX0NDS19NSU5fVkFMX0RFRjsKKwlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2tfbXJjOworCWRhdGEtPm5yZ190aF9jY2sgPSByYW5nZXMtPm5yZ190aF9jY2s7CisJZGF0YS0+bnJnX3RoX29mZG0gPSByYW5nZXMtPm5yZ190aF9vZmRtOworCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbiA9IHJhbmdlcy0+YmFya2VyX2NvcnJfdGhfbWluOworCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMgPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmM7CisJZGF0YS0+bnJnX3RoX2NjYSA9IHJhbmdlcy0+bnJnX3RoX2NjYTsKKworCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSAwOworCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSAwOworCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IDA7CisJZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gMDsKKworCXJldCB8PSBpbDQ5NjVfc2Vuc2l0aXZpdHlfd3JpdGUoaWwpOworCURfQ0FMSUIoIjw8cmV0dXJuIDB4JVhcbiIsIHJldCk7Cit9CisKK3ZvaWQKK2lsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHZvaWQgKnJlc3ApCit7CisJdTMyIHJ4X2VuYWJsZV90aW1lOworCXUzMiBmYV9jY2s7CisJdTMyIGZhX29mZG07CisJdTMyIGJhZF9wbGNwX2NjazsKKwl1MzIgYmFkX3BsY3Bfb2ZkbTsKKwl1MzIgbm9ybV9mYV9vZmRtOworCXUzMiBub3JtX2ZhX2NjazsKKwlzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7CisJc3RydWN0IHN0YXRzX3J4X25vbl9waHkgKnJ4X2luZm87CisJc3RydWN0IHN0YXRzX3J4X3BoeSAqb2ZkbSwgKmNjazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzdGF0c19nZW5lcmFsX2RhdGEgc3RhdGlzOworCisJaWYgKGlsLT5kaXNhYmxlX3NlbnNfY2FsKQorCQlyZXR1cm47CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwlpZiAoIWlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQlEX0NBTElCKCI8PCAtIG5vdCBhc3NvY2lhdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilyZXNwKS0+cnguZ2VuZXJhbCk7CisJb2ZkbSA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilyZXNwKS0+cngub2ZkbSk7CisJY2NrID0gJigoKHN0cnVjdCBpbF9ub3RpZl9zdGF0cyAqKXJlc3ApLT5yeC5jY2spOworCisJaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7CisJCURfQ0FMSUIoIjw8IGludmFsaWQgZGF0YS5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogRXh0cmFjdCBTdGF0aXN0aWNzOiAqLworCXJ4X2VuYWJsZV90aW1lID0gbGUzMl90b19jcHUocnhfaW5mby0+Y2hhbm5lbF9sb2FkKTsKKwlmYV9jY2sgPSBsZTMyX3RvX2NwdShjY2stPmZhbHNlX2FsYXJtX2NudCk7CisJZmFfb2ZkbSA9IGxlMzJfdG9fY3B1KG9mZG0tPmZhbHNlX2FsYXJtX2NudCk7CisJYmFkX3BsY3BfY2NrID0gbGUzMl90b19jcHUoY2NrLT5wbGNwX2Vycik7CisJYmFkX3BsY3Bfb2ZkbSA9IGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKTsKKworCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2EgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpOworCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2IgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOworCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2MgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpOworCXN0YXRpcy5iZWFjb25fZW5lcmd5X2EgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EpOworCXN0YXRpcy5iZWFjb25fZW5lcmd5X2IgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IpOworCXN0YXRpcy5iZWFjb25fZW5lcmd5X2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCURfQ0FMSUIoInJ4X2VuYWJsZV90aW1lID0gJXUgdXNlY3NcbiIsIHJ4X2VuYWJsZV90aW1lKTsKKworCWlmICghcnhfZW5hYmxlX3RpbWUpIHsKKwkJRF9DQUxJQigiPDwgUlggRW5hYmxlIFRpbWUgPT0gMCFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogVGhlc2Ugc3RhdHMgaW5jcmVhc2UgbW9ub3RvbmljYWxseSwgYW5kIGRvIG5vdCByZXNldAorCSAqICAgYXQgZWFjaCBiZWFjb24uICBDYWxjdWxhdGUgZGlmZmVyZW5jZSBmcm9tIGxhc3QgdmFsdWUsIG9yIGp1c3QKKwkgKiAgIHVzZSB0aGUgbmV3IHN0YXRzIHZhbHVlIGlmIGl0IGhhcyByZXNldCBvciB3cmFwcGVkIGFyb3VuZC4gKi8KKwlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrID4gYmFkX3BsY3BfY2NrKQorCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSBiYWRfcGxjcF9jY2s7CisJZWxzZSB7CisJCWJhZF9wbGNwX2NjayAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2s7CisJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayArPSBiYWRfcGxjcF9jY2s7CisJfQorCisJaWYgKGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPiBiYWRfcGxjcF9vZmRtKQorCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gYmFkX3BsY3Bfb2ZkbTsKKwllbHNlIHsKKwkJYmFkX3BsY3Bfb2ZkbSAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtOworCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtICs9IGJhZF9wbGNwX29mZG07CisJfQorCisJaWYgKGRhdGEtPmxhc3RfZmFfY250X29mZG0gPiBmYV9vZmRtKQorCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gZmFfb2ZkbTsKKwllbHNlIHsKKwkJZmFfb2ZkbSAtPSBkYXRhLT5sYXN0X2ZhX2NudF9vZmRtOworCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtICs9IGZhX29mZG07CisJfQorCisJaWYgKGRhdGEtPmxhc3RfZmFfY250X2NjayA+IGZhX2NjaykKKwkJZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gZmFfY2NrOworCWVsc2UgeworCQlmYV9jY2sgLT0gZGF0YS0+bGFzdF9mYV9jbnRfY2NrOworCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgKz0gZmFfY2NrOworCX0KKworCS8qIFRvdGFsIGFib3J0ZWQgc2lnbmFsIGxvY2tzICovCisJbm9ybV9mYV9vZmRtID0gZmFfb2ZkbSArIGJhZF9wbGNwX29mZG07CisJbm9ybV9mYV9jY2sgPSBmYV9jY2sgKyBiYWRfcGxjcF9jY2s7CisKKwlEX0NBTElCKCJjY2s6IGZhICV1IGJhZHAgJXUgIG9mZG06IGZhICV1IGJhZHAgJXVcbiIsIGZhX2NjaywKKwkJYmFkX3BsY3BfY2NrLCBmYV9vZmRtLCBiYWRfcGxjcF9vZmRtKTsKKworCWlsNDk2NV9zZW5zX2F1dG9fY29ycl9vZmRtKGlsLCBub3JtX2ZhX29mZG0sIHJ4X2VuYWJsZV90aW1lKTsKKwlpbDQ5NjVfc2Vuc19lbmVyZ3lfY2NrKGlsLCBub3JtX2ZhX2NjaywgcnhfZW5hYmxlX3RpbWUsICZzdGF0aXMpOworCisJaWw0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKGlsKTsKK30KKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X2ZpbmRfZmlyc3RfY2hhaW4odTggbWFzaykKK3sKKwlpZiAobWFzayAmIEFOVF9BKQorCQlyZXR1cm4gQ0hBSU5fQTsKKwlpZiAobWFzayAmIEFOVF9CKQorCQlyZXR1cm4gQ0hBSU5fQjsKKwlyZXR1cm4gQ0hBSU5fQzsKK30KKworLyoqCisgKiBSdW4gZGlzY29ubmVjdGVkIGFudGVubmEgYWxnb3JpdGhtIHRvIGZpbmQgb3V0IHdoaWNoIGFudGVubmFzIGFyZQorICogZGlzY29ubmVjdGVkLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2ZpbmRfZGlzY29ubl9hbnRlbm5hKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyICogYXZlcmFnZV9zaWcsCisJCQkgICAgc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEpCit7CisJdTMyIGFjdGl2ZV9jaGFpbnMgPSAwOworCXUzMiBtYXhfYXZlcmFnZV9zaWc7CisJdTE2IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2k7CisJdTggbnVtX3R4X2NoYWluczsKKwl1OCBmaXJzdF9jaGFpbjsKKwl1MTYgaSA9IDA7CisKKwlhdmVyYWdlX3NpZ1swXSA9CisJICAgIGRhdGEtPmNoYWluX3NpZ25hbF9hIC8KKwkgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfc2lnWzFdID0KKwkgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2IgLworCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7CisJYXZlcmFnZV9zaWdbMl0gPQorCSAgICBkYXRhLT5jaGFpbl9zaWduYWxfYyAvCisJICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKworCWlmIChhdmVyYWdlX3NpZ1swXSA+PSBhdmVyYWdlX3NpZ1sxXSkgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1swXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDA7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9IGVsc2UgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1sxXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDE7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9CisKKwlpZiAoYXZlcmFnZV9zaWdbMl0gPj0gbWF4X2F2ZXJhZ2Vfc2lnKSB7CisJCW1heF9hdmVyYWdlX3NpZyA9IGF2ZXJhZ2Vfc2lnWzJdOworCQltYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pID0gMjsKKwkJYWN0aXZlX2NoYWlucyA9ICgxIDw8IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOworCX0KKworCURfQ0FMSUIoImF2ZXJhZ2Vfc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwgYXZlcmFnZV9zaWdbMF0sIGF2ZXJhZ2Vfc2lnWzFdLAorCQlhdmVyYWdlX3NpZ1syXSk7CisJRF9DQUxJQigibWF4X2F2ZXJhZ2Vfc2lnID0gJWQsIGFudGVubmEgJWRcbiIsIG1heF9hdmVyYWdlX3NpZywKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7CisKKwkvKiBDb21wYXJlIHNpZ25hbCBzdHJlbmd0aHMgZm9yIGFsbCAzIHJlY2VpdmVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7CisJCWlmIChpICE9IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpIHsKKwkJCXMzMiByc3NpX2RlbHRhID0gKG1heF9hdmVyYWdlX3NpZyAtIGF2ZXJhZ2Vfc2lnW2ldKTsKKworCQkJLyogSWYgc2lnbmFsIGlzIHZlcnkgd2VhaywgY29tcGFyZWQgd2l0aAorCQkJICogc3Ryb25nZXN0LCBtYXJrIGl0IGFzIGRpc2Nvbm5lY3RlZC4gKi8KKwkJCWlmIChyc3NpX2RlbHRhID4gTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTKQorCQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPSAxOworCQkJZWxzZQorCQkJCWFjdGl2ZV9jaGFpbnMgfD0gKDEgPDwgaSk7CisJCQlEX0NBTElCKCJpID0gJWQgIHJzc2lEZWx0YSA9ICVkICAiCisJCQkJImRpc2Nvbm5fYXJyYXlbaV0gPSAlZFxuIiwgaSwgcnNzaV9kZWx0YSwKKwkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2ldKTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGFib3ZlIGFsZ29yaXRobSBzb21ldGltZXMgZmFpbHMgd2hlbiB0aGUgdWNvZGUKKwkgKiByZXBvcnRzIDAgZm9yIGFsbCBjaGFpbnMuIEl0J3Mgbm90IGNsZWFyIHdoeSB0aGF0CisJICogaGFwcGVucyB0byBzdGFydCB3aXRoLCBidXQgaXQgaXMgdGhlbiBjYXVzaW5nIHRyb3VibGUKKwkgKiBiZWNhdXNlIHRoaXMgY2FuIG1ha2UgdXMgZW5hYmxlIG1vcmUgY2hhaW5zIHRoYW4gdGhlCisJICogaGFyZHdhcmUgcmVhbGx5IGhhcy4KKwkgKgorCSAqIFRvIGJlIHNhZmUsIHNpbXBseSBtYXNrIG91dCBhbnkgY2hhaW5zIHRoYXQgd2Uga25vdworCSAqIGFyZSBub3Qgb24gdGhlIGRldmljZS4KKwkgKi8KKwlhY3RpdmVfY2hhaW5zICY9IGlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50OworCisJbnVtX3R4X2NoYWlucyA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgeworCQkvKiBsb29wcyBvbiBhbGwgdGhlIGJpdHMgb2YKKwkJICogaWwtPmh3X3NldHRpbmcudmFsaWRfdHhfYW50ICovCisJCXU4IGFudF9tc2sgPSAoMSA8PCBpKTsKKwkJaWYgKCEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBhbnRfbXNrKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV90eF9jaGFpbnMrKzsKKwkJaWYgKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPT0gMCkKKwkJCS8qIHRoZXJlIGlzIGEgVHggYW50ZW5uYSBjb25uZWN0ZWQgKi8KKwkJCWJyZWFrOworCQlpZiAobnVtX3R4X2NoYWlucyA9PSBpbC0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gJiYKKwkJICAgIGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pIHsKKwkJCS8qCisJCQkgKiBJZiBhbGwgY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQKKwkJCSAqIGNvbm5lY3QgdGhlIGZpcnN0IHZhbGlkIHR4IGNoYWluCisJCQkgKi8KKwkJCWZpcnN0X2NoYWluID0KKwkJCSAgICBpbDQ5NjVfZmluZF9maXJzdF9jaGFpbihpbC0+Y2ZnLT52YWxpZF90eF9hbnQpOworCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtmaXJzdF9jaGFpbl0gPSAwOworCQkJYWN0aXZlX2NoYWlucyB8PSBCSVQoZmlyc3RfY2hhaW4pOworCQkJRF9DQUxJQigiQWxsIFR4IGNoYWlucyBhcmUgZGlzY29ubmVjdGVkIgorCQkJCSItIGRlY2xhcmUgJWQgYXMgY29ubmVjdGVkXG4iLCBmaXJzdF9jaGFpbik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChhY3RpdmVfY2hhaW5zICE9IGlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50ICYmCisJICAgIGFjdGl2ZV9jaGFpbnMgIT0gaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKKwkJRF9DQUxJQigiRGV0ZWN0ZWQgdGhhdCBub3QgYWxsIGFudGVubmFzIGFyZSBjb25uZWN0ZWQhICIKKwkJCSJDb25uZWN0ZWQ6ICUjeCwgdmFsaWQ6ICUjeC5cbiIsIGFjdGl2ZV9jaGFpbnMsCisJCQlpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCk7CisKKwkvKiBTYXZlIGZvciB1c2Ugd2l0aGluIFJYT04sIFRYLCBTQ0FOIGNvbW1hbmRzLCBldGMuICovCisJZGF0YS0+YWN0aXZlX2NoYWlucyA9IGFjdGl2ZV9jaGFpbnM7CisJRF9DQUxJQigiYWN0aXZlX2NoYWlucyAoYml0d2lzZSkgPSAweCV4XG4iLCBhY3RpdmVfY2hhaW5zKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9nYWluX2NvbXB1dGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyICogYXZlcmFnZV9ub2lzZSwKKwkJCXUxNiBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksIHUzMiBtaW5fYXZlcmFnZV9ub2lzZSwKKwkJCXU4IGRlZmF1bHRfY2hhaW4pCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICZpbC0+Y2hhaW5fbm9pc2VfZGF0YTsKKworCWRhdGEtPmRlbHRhX2dhaW5fY29kZVttaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ldID0gMDsKKworCWZvciAoaSA9IGRlZmF1bHRfY2hhaW47IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJczMyIGRlbHRhX2cgPSAwOworCisJCWlmICghZGF0YS0+ZGlzY29ubl9hcnJheVtpXSAmJgorCQkgICAgZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID09CisJCSAgICBDSEFJTl9OT0lTRV9ERUxUQV9HQUlOX0lOSVRfVkFMKSB7CisJCQlkZWx0YV9nID0gYXZlcmFnZV9ub2lzZVtpXSAtIG1pbl9hdmVyYWdlX25vaXNlOworCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0gKHU4KSAoKGRlbHRhX2cgKiAxMCkgLyAxNSk7CisJCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPQorCQkJICAgIG1pbihkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0sCisJCQkJKHU4KSBDSEFJTl9OT0lTRV9NQVhfREVMVEFfR0FJTl9DT0RFKTsKKworCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KKwkJCSAgICAoZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldIHwgKDEgPDwgMikpOworCQl9IGVsc2UgeworCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0gMDsKKwkJfQorCX0KKwlEX0NBTElCKCJkZWx0YV9nYWluX2NvZGVzOiBhICVkIGIgJWQgYyAlZFxuIiwgZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzBdLAorCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbMV0sIGRhdGEtPmRlbHRhX2dhaW5fY29kZVsyXSk7CisKKwkvKiBEaWZmZXJlbnRpYWwgZ2FpbiBnZXRzIHNlbnQgdG8gdUNvZGUgb25seSBvbmNlICovCisJaWYgKCFkYXRhLT5yYWRpb193cml0ZSkgeworCQlzdHJ1Y3QgaWxfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7CisJCWRhdGEtPnJhZGlvX3dyaXRlID0gMTsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuaGRyLm9wX2NvZGUgPSBJTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQ7CisJCWNtZC5kaWZmX2dhaW5fYSA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVswXTsKKwkJY21kLmRpZmZfZ2Fpbl9iID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdOworCQljbWQuZGlmZl9nYWluX2MgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMl07CisJCXJldCA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19QSFlfQ0FMSUJSQVRJT04sIHNpemVvZihjbWQpLCAmY21kKTsKKwkJaWYgKHJldCkKKwkJCURfQ0FMSUIoImZhaWwgc2VuZGluZyBjbWQgIiAiQ19QSFlfQ0FMSUJSQVRJT05cbiIpOworCisJCS8qIFRPRE8gd2UgbWlnaHQgd2FudCByZWNhbGN1bGF0ZQorCQkgKiByeF9jaGFpbiBpbiByeG9uIGNtZCAqLworCisJCS8qIE1hcmsgc28gd2UgcnVuIHRoaXMgYWxnbyBvbmx5IG9uY2UhICovCisJCWRhdGEtPnN0YXRlID0gSUxfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRDsKKwl9Cit9CisKKy8qCisgKiBBY2N1bXVsYXRlIDE2IGJlYWNvbnMgb2Ygc2lnbmFsIGFuZCBub2lzZSBzdGF0cyBmb3IgZWFjaCBvZgorICogICAzIHJlY2VpdmVycy9hbnRlbm5hcy9yeC1jaGFpbnMsIHRoZW4gZmlndXJlIG91dDoKKyAqIDEpICBXaGljaCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgorICogMikgIERpZmZlcmVudGlhbCByeCBnYWluIHNldHRpbmdzIHRvIGJhbGFuY2UgdGhlIDMgcmVjZWl2ZXJzLgorICovCit2b2lkCitpbDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB2b2lkICpzdGF0X3Jlc3ApCit7CisJc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEgPSBOVUxMOworCisJdTMyIGNoYWluX25vaXNlX2E7CisJdTMyIGNoYWluX25vaXNlX2I7CisJdTMyIGNoYWluX25vaXNlX2M7CisJdTMyIGNoYWluX3NpZ19hOworCXUzMiBjaGFpbl9zaWdfYjsKKwl1MzIgY2hhaW5fc2lnX2M7CisJdTMyIGF2ZXJhZ2Vfc2lnW05VTV9SWF9DSEFJTlNdID0geyBJTklUSUFMSVpBVElPTl9WQUxVRSB9OworCXUzMiBhdmVyYWdlX25vaXNlW05VTV9SWF9DSEFJTlNdID0geyBJTklUSUFMSVpBVElPTl9WQUxVRSB9OworCXUzMiBtaW5fYXZlcmFnZV9ub2lzZSA9IE1JTl9BVkVSQUdFX05PSVNFX01BWF9WQUxVRTsKKwl1MTYgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pID0gSU5JVElBTElaQVRJT05fVkFMVUU7CisJdTE2IGkgPSAwOworCXUxNiByeG9uX2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7CisJdTE2IHN0YXRfY2hudW0gPSBJTklUSUFMSVpBVElPTl9WQUxVRTsKKwl1OCByeG9uX2JhbmQyNDsKKwl1OCBzdGF0X2JhbmQyNDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpyeF9pbmZvOworCisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoaWwtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKQorCQlyZXR1cm47CisKKwlkYXRhID0gJihpbC0+Y2hhaW5fbm9pc2VfZGF0YSk7CisKKwkvKgorCSAqIEFjY3VtdWxhdGUganVzdCB0aGUgZmlyc3QgImNoYWluX25vaXNlX251bV9iZWFjb25zIiBhZnRlcgorCSAqIHRoZSBmaXJzdCBhc3NvY2lhdGlvbiwgdGhlbiB3ZSdyZSBkb25lIGZvcmV2ZXIuCisJICovCisJaWYgKGRhdGEtPnN0YXRlICE9IElMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEUpIHsKKwkJaWYgKGRhdGEtPnN0YXRlID09IElMX0NIQUlOX05PSVNFX0FMSVZFKQorCQkJRF9DQUxJQigiV2FpdCBmb3Igbm9pc2UgY2FsaWIgcmVzZXRcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyeF9pbmZvID0gJigoKHN0cnVjdCBpbF9ub3RpZl9zdGF0cyAqKXN0YXRfcmVzcCktPnJ4LmdlbmVyYWwpOworCisJaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7CisJCURfQ0FMSUIoIiA8PCBJbnRlcmZlcmVuY2UgZGF0YSB1bmF2YWlsYWJsZVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlyeG9uX2JhbmQyNCA9ICEhKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSyk7CisJcnhvbl9jaG51bSA9IGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKTsKKworCXN0YXRfYmFuZDI0ID0KKwkgICAgISEoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilzdGF0X3Jlc3ApLT4KKwkgICAgICAgZmxhZyAmIFNUQVRTX1JFUExZX0ZMR19CQU5EXzI0R19NU0spOworCXN0YXRfY2hudW0gPQorCSAgICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBpbF9ub3RpZl9zdGF0cyAqKXN0YXRfcmVzcCktPmZsYWcpID4+IDE2OworCisJLyogTWFrZSBzdXJlIHdlIGFjY3VtdWxhdGUgZGF0YSBmb3IganVzdCB0aGUgYXNzb2NpYXRlZCBjaGFubmVsCisJICogICAoZXZlbiBpZiBzY2FubmluZykuICovCisJaWYgKHJ4b25fY2hudW0gIT0gc3RhdF9jaG51bSB8fCByeG9uX2JhbmQyNCAhPSBzdGF0X2JhbmQyNCkgeworCQlEX0NBTElCKCJTdGF0cyBub3QgZnJvbSBjaGFuPSVkLCBiYW5kMjQ9JWRcbiIsIHJ4b25fY2hudW0sCisJCQlyeG9uX2JhbmQyNCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqICBBY2N1bXVsYXRlIGJlYWNvbiBzdGF0cyB2YWx1ZXMgYWNyb3NzCisJICogImNoYWluX25vaXNlX251bV9iZWFjb25zIgorCSAqLworCWNoYWluX25vaXNlX2EgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fbm9pc2VfYiA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYikgJiBJTl9CQU5EX0ZJTFRFUjsKKwljaGFpbl9ub2lzZV9jID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOworCisJY2hhaW5fc2lnX2EgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9hKSAmIElOX0JBTkRfRklMVEVSOworCWNoYWluX3NpZ19iID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYikgJiBJTl9CQU5EX0ZJTFRFUjsKKwljaGFpbl9zaWdfYyA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJZGF0YS0+YmVhY29uX2NvdW50Kys7CisKKwlkYXRhLT5jaGFpbl9ub2lzZV9hID0gKGNoYWluX25vaXNlX2EgKyBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKKwlkYXRhLT5jaGFpbl9ub2lzZV9iID0gKGNoYWluX25vaXNlX2IgKyBkYXRhLT5jaGFpbl9ub2lzZV9iKTsKKwlkYXRhLT5jaGFpbl9ub2lzZV9jID0gKGNoYWluX25vaXNlX2MgKyBkYXRhLT5jaGFpbl9ub2lzZV9jKTsKKworCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gKGNoYWluX3NpZ19hICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOworCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gKGNoYWluX3NpZ19iICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOworCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gKGNoYWluX3NpZ19jICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOworCisJRF9DQUxJQigiY2hhbj0lZCwgYmFuZDI0PSVkLCBiZWFjb249JWRcbiIsIHJ4b25fY2hudW0sIHJ4b25fYmFuZDI0LAorCQlkYXRhLT5iZWFjb25fY291bnQpOworCURfQ0FMSUIoImNoYWluX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsIGNoYWluX3NpZ19hLCBjaGFpbl9zaWdfYiwKKwkJY2hhaW5fc2lnX2MpOworCURfQ0FMSUIoImNoYWluX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwgY2hhaW5fbm9pc2VfYSwgY2hhaW5fbm9pc2VfYiwKKwkJY2hhaW5fbm9pc2VfYyk7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiLCBkZXRlcm1pbmU6CisJICogMSkgIERpc2Nvbm5lY3RlZCBhbnRlbm5hcyAodXNpbmcgc2lnbmFsIHN0cmVuZ3RocykKKwkgKiAyKSAgRGlmZmVyZW50aWFsIGdhaW4gKHVzaW5nIHNpbGVuY2Ugbm9pc2UpIHRvIGJhbGFuY2UgcmVjZWl2ZXJzICovCisJaWYgKGRhdGEtPmJlYWNvbl9jb3VudCAhPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMpCisJCXJldHVybjsKKworCS8qIEFuYWx5emUgc2lnbmFsIGZvciBkaXNjb25uZWN0ZWQgYW50ZW5uYSAqLworCWlsNDk2NV9maW5kX2Rpc2Nvbm5fYW50ZW5uYShpbCwgYXZlcmFnZV9zaWcsIGRhdGEpOworCisJLyogQW5hbHl6ZSBub2lzZSBmb3IgcnggYmFsYW5jZSAqLworCWF2ZXJhZ2Vfbm9pc2VbMF0gPQorCSAgICBkYXRhLT5jaGFpbl9ub2lzZV9hIC8gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfbm9pc2VbMV0gPQorCSAgICBkYXRhLT5jaGFpbl9ub2lzZV9iIC8gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfbm9pc2VbMl0gPQorCSAgICBkYXRhLT5jaGFpbl9ub2lzZV9jIC8gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgeworCQlpZiAoIWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gJiYKKwkJICAgIGF2ZXJhZ2Vfbm9pc2VbaV0gPD0gbWluX2F2ZXJhZ2Vfbm9pc2UpIHsKKwkJCS8qIFRoaXMgbWVhbnMgdGhhdCBjaGFpbiBpIGlzIGFjdGl2ZSBhbmQgaGFzCisJCQkgKiBsb3dlciBub2lzZSB2YWx1ZXMgc28gZmFyOiAqLworCQkJbWluX2F2ZXJhZ2Vfbm9pc2UgPSBhdmVyYWdlX25vaXNlW2ldOworCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pID0gaTsKKwkJfQorCX0KKworCURfQ0FMSUIoImF2ZXJhZ2Vfbm9pc2U6IGEgJWQgYiAlZCBjICVkXG4iLCBhdmVyYWdlX25vaXNlWzBdLAorCQlhdmVyYWdlX25vaXNlWzFdLCBhdmVyYWdlX25vaXNlWzJdKTsKKworCURfQ0FMSUIoIm1pbl9hdmVyYWdlX25vaXNlID0gJWQsIGFudGVubmEgJWRcbiIsIG1pbl9hdmVyYWdlX25vaXNlLAorCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kpOworCisJaWw0OTY1X2dhaW5fY29tcHV0YXRpb24oaWwsIGF2ZXJhZ2Vfbm9pc2UsIG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSwKKwkJCQltaW5fYXZlcmFnZV9ub2lzZSwKKwkJCQlpbDQ5NjVfZmluZF9maXJzdF9jaGFpbihpbC0+Y2ZnLT52YWxpZF9yeF9hbnQpKTsKKworCS8qIFNvbWUgcG93ZXIgY2hhbmdlcyBtYXkgaGF2ZSBiZWVuIG1hZGUgZHVyaW5nIHRoZSBjYWxpYnJhdGlvbi4KKwkgKiBVcGRhdGUgYW5kIGNvbW1pdCB0aGUgUlhPTgorCSAqLworCWlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQorCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKGlsKTsKKworCWRhdGEtPnN0YXRlID0gSUxfQ0hBSU5fTk9JU0VfRE9ORTsKKwlpbF9wb3dlcl91cGRhdGVfbW9kZShpbCwgZmFsc2UpOworfQorCit2b2lkCitpbDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBpOworCW1lbXNldCgmKGlsLT5zZW5zaXRpdml0eV9kYXRhKSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhKSk7CisJbWVtc2V0KCYoaWwtPmNoYWluX25vaXNlX2RhdGEpLCAwLCBzaXplb2Yoc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKQorCQlpbC0+Y2hhaW5fbm9pc2VfZGF0YS5kZWx0YV9nYWluX2NvZGVbaV0gPQorCQkgICAgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTDsKKworCS8qIEFzayBmb3Igc3RhdHMgbm93LCB0aGUgdUNvZGUgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbgorCSAqIHBlcmlvZGljYWxseSBhZnRlciBhc3NvY2lhdGlvbiAqLworCWlsX3NlbmRfc3RhdHNfcmVxdWVzdChpbCwgQ01EX0FTWU5DLCB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGVjMzlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1kZWJ1Zy5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyoKKyogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyogVVNBCisqCisqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyoKKyogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfdmFsdWUgPSAiICAlLTMwcyAlMTB1XG4iOworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF90YWJsZSA9ICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiI7CitzdGF0aWMgY29uc3QgY2hhciAqZm10X2hlYWRlciA9CisgICAgIiUtMzJzICAgIGN1cnJlbnQgIGN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiI7CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zdGF0c19mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJaW50IHAgPSAwOworCXUzMiBmbGFnOworCisJZmxhZyA9IGxlMzJfdG9fY3B1KGlsLT5fNDk2NS5zdGF0cy5mbGFnKTsKKworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsIGZsYWcpOworCWlmIChmbGFnICYgVUNPREVfU1RBVFNfQ0xFQVJfTVNLKQorCQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsCisJCQkgICAgICAgIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7CisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAorCQkgICAgICAgKGZsYWcgJiBVQ09ERV9TVEFUU19GUkVRVUVOQ1lfTVNLKSA/ICIyLjQgR0h6IiA6CisJCSAgICAgICAiNS4yIEdIeiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKKwkJICAgICAgIChmbGFnICYgVUNPREVfU1RBVFNfTkFSUk9XX0JBTkRfTVNLKSA/ICJlbmFibGVkIiA6CisJCSAgICAgICAiZGlzYWJsZWQiKTsKKworCXJldHVybiBwOworfQorCitzc2l6ZV90CitpbDQ5NjVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPQorCSAgICBzaXplb2Yoc3RydWN0IHN0YXRzX3J4X3BoeSkgKiA0MCArCisJICAgIHNpemVvZihzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSkgKiA0MCArCisJICAgIHNpemVvZihzdHJ1Y3Qgc3RhdHNfcnhfaHRfcGh5KSAqIDQwICsgNDAwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdGF0c19yeF9waHkgKm9mZG0sICphY2N1bV9vZmRtLCAqZGVsdGFfb2ZkbSwgKm1heF9vZmRtOworCXN0cnVjdCBzdGF0c19yeF9waHkgKmNjaywgKmFjY3VtX2NjaywgKmRlbHRhX2NjaywgKm1heF9jY2s7CisJc3RydWN0IHN0YXRzX3J4X25vbl9waHkgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX3J4X2h0X3BoeSAqaHQsICphY2N1bV9odCwgKmRlbHRhX2h0LCAqbWF4X2h0OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJb2ZkbSA9ICZpbC0+XzQ5NjUuc3RhdHMucngub2ZkbTsKKwljY2sgPSAmaWwtPl80OTY1LnN0YXRzLnJ4LmNjazsKKwlnZW5lcmFsID0gJmlsLT5fNDk2NS5zdGF0cy5yeC5nZW5lcmFsOworCWh0ID0gJmlsLT5fNDk2NS5zdGF0cy5yeC5vZmRtX2h0OworCWFjY3VtX29mZG0gPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnJ4Lm9mZG07CisJYWNjdW1fY2NrID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5yeC5jY2s7CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMucnguZ2VuZXJhbDsKKwlhY2N1bV9odCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMucngub2ZkbV9odDsKKwlkZWx0YV9vZmRtID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5yeC5vZmRtOworCWRlbHRhX2NjayA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMucnguY2NrOworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnJ4LmdlbmVyYWw7CisJZGVsdGFfaHQgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnJ4Lm9mZG1faHQ7CisJbWF4X29mZG0gPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5yeC5vZmRtOworCW1heF9jY2sgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5yeC5jY2s7CisJbWF4X2dlbmVyYWwgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOworCW1heF9odCA9ICZpbC0+XzQ5NjUubWF4X2RlbHRhLnJ4Lm9mZG1faHQ7CisKKwlwb3MgKz0gaWw0OTY1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X2hlYWRlciwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBPRkRNOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5pbmFfY250KSwgYWNjdW1fb2ZkbS0+aW5hX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+aW5hX2NudCwgbWF4X29mZG0tPmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9jbnQpLCBhY2N1bV9vZmRtLT5maW5hX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV9jbnQsIG1heF9vZmRtLT5maW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5wbGNwX2VyciwgbWF4X29mZG0tPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2VyciwgbWF4X29mZG0tPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJvdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksIGFjY3VtX29mZG0tPm92ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5vdmVycnVuX2VyciwgbWF4X29mZG0tPm92ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmVhcmx5X292ZXJydW5fZXJyKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBtYXhfb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZ29vZCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+Y3JjMzJfZ29vZCwgbWF4X29mZG0tPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmFsc2VfYWxhcm1fY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZhbHNlX2FsYXJtX2NudCksCisJCSAgICAgIGFjY3VtX29mZG0tPmZhbHNlX2FsYXJtX2NudCwgZGVsdGFfb2ZkbS0+ZmFsc2VfYWxhcm1fY250LAorCQkgICAgICBtYXhfb2ZkbS0+ZmFsc2VfYWxhcm1fY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfc3luY19lcnJfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2ZkX3RpbWVvdXQpLCBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsIG1heF9vZmRtLT5zZmRfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZmluYV90aW1lb3V0KSwgYWNjdW1fb2ZkbS0+ZmluYV90aW1lb3V0LAorCQkgICAgICBkZWx0YV9vZmRtLT5maW5hX3RpbWVvdXQsIG1heF9vZmRtLT5maW5hX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidW5yZXNwb25kZWRfcnRzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnVucmVzcG9uZGVkX3J0cyksCisJCSAgICAgIGFjY3VtX29mZG0tPnVucmVzcG9uZGVkX3J0cywgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAorCQkgICAgICBtYXhfb2ZkbS0+dW5yZXNwb25kZWRfcnRzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAorCQkgICAgICBhY2N1bV9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzZW50X2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2VudF9hY2tfY250KSwgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5zZW50X2Fja19jbnQsIG1heF9vZmRtLT5zZW50X2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9jdHNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksIGFjY3VtX29mZG0tPnNlbnRfY3RzX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9jdHNfY250LCBtYXhfb2ZkbS0+c2VudF9jdHNfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5zZW50X2JhX3JzcF9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5zZW50X2JhX3JzcF9jbnQsIGRlbHRhX29mZG0tPnNlbnRfYmFfcnNwX2NudCwKKwkJICAgICAgbWF4X29mZG0tPnNlbnRfYmFfcnNwX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJkc3Bfc2VsZl9raWxsOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmRzcF9zZWxmX2tpbGwpLAorCQkgICAgICBhY2N1bV9vZmRtLT5kc3Bfc2VsZl9raWxsLCBkZWx0YV9vZmRtLT5kc3Bfc2VsZl9raWxsLAorCQkgICAgICBtYXhfb2ZkbS0+ZHNwX3NlbGZfa2lsbCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJtaF9mb3JtYXRfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPm1oX2Zvcm1hdF9lcnIpLAorCQkgICAgICBhY2N1bV9vZmRtLT5taF9mb3JtYXRfZXJyLCBkZWx0YV9vZmRtLT5taF9mb3JtYXRfZXJyLAorCQkgICAgICBtYXhfb2ZkbS0+bWhfZm9ybWF0X2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSksCisJCSAgICAgIGFjY3VtX29mZG0tPnJlX2FjcV9tYWluX3Jzc2lfc3VtLAorCQkgICAgICBkZWx0YV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgbWF4X29mZG0tPnJlX2FjcV9tYWluX3Jzc2lfc3VtKTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X2hlYWRlciwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBDQ0s6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+aW5hX2NudCksIGFjY3VtX2Njay0+aW5hX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5pbmFfY250LCBtYXhfY2NrLT5pbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9jbnQpLCBhY2N1bV9jY2stPmZpbmFfY250LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfY250LCBtYXhfY2NrLT5maW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKSwgYWNjdW1fY2NrLT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5wbGNwX2VyciwgbWF4X2Njay0+cGxjcF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZXJyKSwgYWNjdW1fY2NrLT5jcmMzMl9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+Y3JjMzJfZXJyLCBtYXhfY2NrLT5jcmMzMl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5vdmVycnVuX2VyciksIGFjY3VtX2Njay0+b3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+b3ZlcnJ1bl9lcnIsIG1heF9jY2stPm92ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmVhcmx5X292ZXJydW5fZXJyLCBtYXhfY2NrLT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZ29vZCksIGFjY3VtX2Njay0+Y3JjMzJfZ29vZCwKKwkJICAgICAgZGVsdGFfY2NrLT5jcmMzMl9nb29kLCBtYXhfY2NrLT5jcmMzMl9nb29kKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZhbHNlX2FsYXJtX2NudCksCisJCSAgICAgIGFjY3VtX2Njay0+ZmFsc2VfYWxhcm1fY250LCBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfc3luY19lcnJfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9zeW5jX2Vycl9jbnQpLAorCQkgICAgICBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfc3luY19lcnJfY250LCBtYXhfY2NrLT5maW5hX3N5bmNfZXJyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNmZF90aW1lb3V0KSwgYWNjdW1fY2NrLT5zZmRfdGltZW91dCwKKwkJICAgICAgZGVsdGFfY2NrLT5zZmRfdGltZW91dCwgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV90aW1lb3V0KSwgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LCBtYXhfY2NrLT5maW5hX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidW5yZXNwb25kZWRfcnRzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKKwkJICAgICAgYWNjdW1fY2NrLT51bnJlc3BvbmRlZF9ydHMsIGRlbHRhX2Njay0+dW5yZXNwb25kZWRfcnRzLAorCQkgICAgICBtYXhfY2NrLT51bnJlc3BvbmRlZF9ydHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKSwKKwkJICAgICAgYWNjdW1fY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKKwkJICAgICAgZGVsdGFfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKKwkJICAgICAgbWF4X2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwgYWNjdW1fY2NrLT5zZW50X2Fja19jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+c2VudF9hY2tfY250LCBtYXhfY2NrLT5zZW50X2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9jdHNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9jdHNfY250KSwgYWNjdW1fY2NrLT5zZW50X2N0c19jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+c2VudF9jdHNfY250LCBtYXhfY2NrLT5zZW50X2N0c19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9iYV9yc3BfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9iYV9yc3BfY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5zZW50X2JhX3JzcF9jbnQsIGRlbHRhX2Njay0+c2VudF9iYV9yc3BfY250LAorCQkgICAgICBtYXhfY2NrLT5zZW50X2JhX3JzcF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmRzcF9zZWxmX2tpbGwpLCBhY2N1bV9jY2stPmRzcF9zZWxmX2tpbGwsCisJCSAgICAgIGRlbHRhX2Njay0+ZHNwX3NlbGZfa2lsbCwgbWF4X2Njay0+ZHNwX3NlbGZfa2lsbCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJtaF9mb3JtYXRfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+bWhfZm9ybWF0X2VyciksIGFjY3VtX2Njay0+bWhfZm9ybWF0X2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5taF9mb3JtYXRfZXJyLCBtYXhfY2NrLT5taF9mb3JtYXRfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgInJlX2FjcV9tYWluX3Jzc2lfc3VtOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAorCQkgICAgICBhY2N1bV9jY2stPnJlX2FjcV9tYWluX3Jzc2lfc3VtLAorCQkgICAgICBkZWx0YV9jY2stPnJlX2FjcV9tYWluX3Jzc2lfc3VtLAorCQkgICAgICBtYXhfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gR0VORVJBTDoiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImJvZ3VzX2N0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLCBhY2N1bV9nZW5lcmFsLT5ib2d1c19jdHMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2N0cywgbWF4X2dlbmVyYWwtPmJvZ3VzX2N0cyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJib2d1c19hY2s6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfYWNrKSwgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfYWNrLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ib2d1c19hY2ssIG1heF9nZW5lcmFsLT5ib2d1c19hY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibm9uX2Jzc2lkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmlsdGVyZWRfZnJhbWVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm5vbl9jaGFubmVsX2JlYWNvbnM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMsCisJCSAgICAgIG1heF9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNoYW5uZWxfYmVhY29uczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmNoYW5uZWxfYmVhY29ucywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmNoYW5uZWxfYmVhY29ucyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJudW1fbWlzc2VkX2Jjb246IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24sCisJCSAgICAgIG1heF9nZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYWRjX3J4X3NhdHVyYXRpb25fdGltZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YWRjX3J4X3NhdHVyYXRpb25fdGltZSwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YWRjX3J4X3NhdHVyYXRpb25fdGltZSwKKwkJICAgICAgbWF4X2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiaW5hX2RldGVjdF9zZWFyY2hfdG06IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5pbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSwKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJiZWFjb25fc2lsZW5jZV9yc3NpX2I6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYmVhY29uX3NpbGVuY2VfcnNzaV9jOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9jLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImludGVyZmVyZW5jZV9kYXRhX2ZsYWc6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+aW50ZXJmZXJlbmNlX2RhdGFfZmxhZyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcsCisJCSAgICAgIG1heF9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNoYW5uZWxfbG9hZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5jaGFubmVsX2xvYWQpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsIGRlbHRhX2dlbmVyYWwtPmNoYW5uZWxfbG9hZCwKKwkJICAgICAgbWF4X2dlbmVyYWwtPmNoYW5uZWxfbG9hZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJkc3BfZmFsc2VfYWxhcm1zOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+ZHNwX2ZhbHNlX2FsYXJtcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9hOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2EpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9hLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9hLCBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2IpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9iLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9iLCBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9jOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2MpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9jLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9jLCBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2E6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYzoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYyk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gT0ZETV9IVDoiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInBsY3BfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5wbGNwX2VyciksIGFjY3VtX2h0LT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfaHQtPnBsY3BfZXJyLCBtYXhfaHQtPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm92ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5vdmVycnVuX2VyciksIGFjY3VtX2h0LT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfaHQtPm92ZXJydW5fZXJyLCBtYXhfaHQtPm92ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5lYXJseV9vdmVycnVuX2VyciksCisJCSAgICAgIGFjY3VtX2h0LT5lYXJseV9vdmVycnVuX2VyciwgZGVsdGFfaHQtPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBtYXhfaHQtPmVhcmx5X292ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmNyYzMyX2dvb2QpLCBhY2N1bV9odC0+Y3JjMzJfZ29vZCwKKwkJICAgICAgZGVsdGFfaHQtPmNyYzMyX2dvb2QsIG1heF9odC0+Y3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmNyYzMyX2VyciksIGFjY3VtX2h0LT5jcmMzMl9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5jcmMzMl9lcnIsIG1heF9odC0+Y3JjMzJfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPm1oX2Zvcm1hdF9lcnIpLCBhY2N1bV9odC0+bWhfZm9ybWF0X2VyciwKKwkJICAgICAgZGVsdGFfaHQtPm1oX2Zvcm1hdF9lcnIsIG1heF9odC0+bWhfZm9ybWF0X2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2dfY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+YWdnX2NyYzMyX2dvb2QpLCBhY2N1bV9odC0+YWdnX2NyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2h0LT5hZ2dfY3JjMzJfZ29vZCwgbWF4X2h0LT5hZ2dfY3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2dfbXBkdV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmFnZ19tcGR1X2NudCksIGFjY3VtX2h0LT5hZ2dfbXBkdV9jbnQsCisJCSAgICAgIGRlbHRhX2h0LT5hZ2dfbXBkdV9jbnQsIG1heF9odC0+YWdnX21wZHVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZ19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmFnZ19jbnQpLCBhY2N1bV9odC0+YWdnX2NudCwKKwkJICAgICAgZGVsdGFfaHQtPmFnZ19jbnQsIG1heF9odC0+YWdnX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJ1bnN1cHBvcnRfbWNzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT51bnN1cHBvcnRfbWNzKSwgYWNjdW1faHQtPnVuc3VwcG9ydF9tY3MsCisJCSAgICAgIGRlbHRhX2h0LT51bnN1cHBvcnRfbWNzLCBtYXhfaHQtPnVuc3VwcG9ydF9tY3MpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90CitpbDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGF0c190eCkgKiA0OCkgKyAyNTA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHN0YXRzX3R4ICp0eCwgKmFjY3VtX3R4LCAqZGVsdGFfdHgsICptYXhfdHg7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJdHggPSAmaWwtPl80OTY1LnN0YXRzLnR4OworCWFjY3VtX3R4ID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy50eDsKKwlkZWx0YV90eCA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMudHg7CisJbWF4X3R4ID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEudHg7CisKKwlwb3MgKz0gaWw0OTY1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfVHg6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJwcmVhbWJsZToiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+cHJlYW1ibGVfY250KSwgYWNjdW1fdHgtPnByZWFtYmxlX2NudCwKKwkJICAgICAgZGVsdGFfdHgtPnByZWFtYmxlX2NudCwgbWF4X3R4LT5wcmVhbWJsZV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicnhfZGV0ZWN0ZWRfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5yeF9kZXRlY3RlZF9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+cnhfZGV0ZWN0ZWRfY250LCBkZWx0YV90eC0+cnhfZGV0ZWN0ZWRfY250LAorCQkgICAgICBtYXhfdHgtPnJ4X2RldGVjdGVkX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJidF9wcmlvX2RlZmVyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19kZWZlcl9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsIGRlbHRhX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2RlZmVyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJidF9wcmlvX2tpbGxfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5idF9wcmlvX2tpbGxfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmJ0X3ByaW9fa2lsbF9jbnQsIGRlbHRhX3R4LT5idF9wcmlvX2tpbGxfY250LAorCQkgICAgICBtYXhfdHgtPmJ0X3ByaW9fa2lsbF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmV3X2J5dGVzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZmV3X2J5dGVzX2NudCksIGFjY3VtX3R4LT5mZXdfYnl0ZXNfY250LAorCQkgICAgICBkZWx0YV90eC0+ZmV3X2J5dGVzX2NudCwgbWF4X3R4LT5mZXdfYnl0ZXNfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImN0c190aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dCksIGFjY3VtX3R4LT5jdHNfdGltZW91dCwKKwkJICAgICAgZGVsdGFfdHgtPmN0c190aW1lb3V0LCBtYXhfdHgtPmN0c190aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFja190aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hY2tfdGltZW91dCksIGFjY3VtX3R4LT5hY2tfdGltZW91dCwKKwkJICAgICAgZGVsdGFfdHgtPmFja190aW1lb3V0LCBtYXhfdHgtPmFja190aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImV4cGVjdGVkX2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmV4cGVjdGVkX2Fja19jbnQpLAorCQkgICAgICBhY2N1bV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwgZGVsdGFfdHgtPmV4cGVjdGVkX2Fja19jbnQsCisJCSAgICAgIG1heF90eC0+ZXhwZWN0ZWRfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhY3R1YWxfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWN0dWFsX2Fja19jbnQpLCBhY2N1bV90eC0+YWN0dWFsX2Fja19jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwgbWF4X3R4LT5hY3R1YWxfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJkdW1wX21zZHVfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5kdW1wX21zZHVfY250KSwgYWNjdW1fdHgtPmR1bXBfbXNkdV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5kdW1wX21zZHVfY250LCBtYXhfdHgtPmR1bXBfbXNkdV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYWJvcnRfbnh0X2ZyYW1lX21pc21hdGNoOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKKwkJICAgICAgZGVsdGFfdHgtPmJ1cnN0X2Fib3J0X25leHRfZnJhbWVfbWlzbWF0Y2hfY250LAorCQkgICAgICBtYXhfdHgtPmJ1cnN0X2Fib3J0X25leHRfZnJhbWVfbWlzbWF0Y2hfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFib3J0X21pc3Npbmdfbnh0X2ZyYW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAorCQkgICAgICBtYXhfdHgtPmJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiY3RzX3RpbWVvdXRfY29sbGlzaW9uOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pLAorCQkgICAgICBhY2N1bV90eC0+Y3RzX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBkZWx0YV90eC0+Y3RzX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBtYXhfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhY2tfYmFfdGltZW91dF9jb2xsaXNpb246IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbiksCisJCSAgICAgIGFjY3VtX3R4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24sCisJCSAgICAgIGRlbHRhX3R4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24sCisJCSAgICAgIG1heF90eC0+YWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyBiYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuYmFfdGltZW91dCksIGFjY3VtX3R4LT5hZ2cuYmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfdHgtPmFnZy5iYV90aW1lb3V0LCBtYXhfdHgtPmFnZy5iYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFnZyBiYV9yZXNjaGVkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5iYV9yZXNjaGVkdWxlX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfdHgtPmFnZy5iYV9yZXNjaGVkdWxlX2ZyYW1lcywKKwkJICAgICAgbWF4X3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYWdnIHNjZF9xdWVyeV9hZ2dfZnJhbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQsCisJCSAgICAgIG1heF90eC0+YWdnLnNjZF9xdWVyeV9hZ2dfZnJhbWVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFnZyBzY2RfcXVlcnlfbm9fYWdnOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZyksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZywKKwkJICAgICAgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnLAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyBzY2RfcXVlcnlfYWdnOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfYWdnLAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFnZyBzY2RfcXVlcnlfbWlzbWF0Y2g6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKKwkJICAgICAgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gsCisJCSAgICAgIG1heF90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgZnJhbWVfbm90X3JlYWR5OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuZnJhbWVfbm90X3JlYWR5KSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5mcmFtZV9ub3RfcmVhZHksCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAorCQkgICAgICBtYXhfdHgtPmFnZy5mcmFtZV9ub3RfcmVhZHkpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIHVuZGVycnVuOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cudW5kZXJydW4pLCBhY2N1bV90eC0+YWdnLnVuZGVycnVuLAorCQkgICAgICBkZWx0YV90eC0+YWdnLnVuZGVycnVuLCBtYXhfdHgtPmFnZy51bmRlcnJ1bik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgYnRfcHJpb19raWxsOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuYnRfcHJpb19raWxsKSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5idF9wcmlvX2tpbGwsIGRlbHRhX3R4LT5hZ2cuYnRfcHJpb19raWxsLAorCQkgICAgICBtYXhfdHgtPmFnZy5idF9wcmlvX2tpbGwpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIHJ4X2JhX3JzcF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFnZy5yeF9iYV9yc3BfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5yeF9iYV9yc3BfY250LCBkZWx0YV90eC0+YWdnLnJ4X2JhX3JzcF9jbnQsCisJCSAgICAgIG1heF90eC0+YWdnLnJ4X2JhX3JzcF9jbnQpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90CitpbDQ5NjVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IHN0YXRzX2dlbmVyYWwpICogMTAgKyAzMDA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9jb21tb24gKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfZGJnICpkYmcsICphY2N1bV9kYmcsICpkZWx0YV9kYmcsICptYXhfZGJnOworCXN0cnVjdCBzdGF0c19kaXYgKmRpdiwgKmFjY3VtX2RpdiwgKmRlbHRhX2RpdiwgKm1heF9kaXY7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb247CisJZGJnID0gJmlsLT5fNDk2NS5zdGF0cy5nZW5lcmFsLmNvbW1vbi5kYmc7CisJZGl2ID0gJmlsLT5fNDk2NS5zdGF0cy5nZW5lcmFsLmNvbW1vbi5kaXY7CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb247CisJYWNjdW1fZGJnID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5nZW5lcmFsLmNvbW1vbi5kYmc7CisJYWNjdW1fZGl2ID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5nZW5lcmFsLmNvbW1vbi5kaXY7CisJZGVsdGFfZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMuZ2VuZXJhbC5jb21tb247CisJbWF4X2dlbmVyYWwgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbjsKKwlkZWx0YV9kYmcgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLmdlbmVyYWwuY29tbW9uLmRiZzsKKwltYXhfZGJnID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb24uZGJnOworCWRlbHRhX2RpdiA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMuZ2VuZXJhbC5jb21tb24uZGl2OworCW1heF9kaXYgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbi5kaXY7CisKKwlwb3MgKz0gaWw0OTY1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X2hlYWRlciwKKwkJICAgICAgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF92YWx1ZSwgInRlbXBlcmF0dXJlOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnRlbXBlcmF0dXJlKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdmFsdWUsICJ0dGxfdGltZXN0YW1wOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnR0bF90aW1lc3RhbXApKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImJ1cnN0X2NoZWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY2hlY2spLCBhY2N1bV9kYmctPmJ1cnN0X2NoZWNrLAorCQkgICAgICBkZWx0YV9kYmctPmJ1cnN0X2NoZWNrLCBtYXhfZGJnLT5idXJzdF9jaGVjayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJidXJzdF9jb3VudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NvdW50KSwgYWNjdW1fZGJnLT5idXJzdF9jb3VudCwKKwkJICAgICAgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAid2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NvdW50OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCksCisJCSAgICAgIGFjY3VtX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKKwkJICAgICAgZGVsdGFfZGJnLT53YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY250LAorCQkgICAgICBtYXhfZGJnLT53YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNsZWVwX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xlZXBfdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnNsZWVwX3RpbWUsIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNsb3RzX291dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbG90c19vdXQpLCBhY2N1bV9nZW5lcmFsLT5zbG90c19vdXQsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPnNsb3RzX291dCwgbWF4X2dlbmVyYWwtPnNsb3RzX291dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzbG90c19pZGxlOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5zbG90c19pZGxlLCBkZWx0YV9nZW5lcmFsLT5zbG90c19pZGxlLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+c2xvdHNfaWRsZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJ0eF9vbl9hOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+dHhfb25fYSksIGFjY3VtX2Rpdi0+dHhfb25fYSwKKwkJICAgICAgZGVsdGFfZGl2LT50eF9vbl9hLCBtYXhfZGl2LT50eF9vbl9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInR4X29uX2I6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT50eF9vbl9iKSwgYWNjdW1fZGl2LT50eF9vbl9iLAorCQkgICAgICBkZWx0YV9kaXYtPnR4X29uX2IsIG1heF9kaXYtPnR4X29uX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZXhlY190aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+ZXhlY190aW1lKSwgYWNjdW1fZGl2LT5leGVjX3RpbWUsCisJCSAgICAgIGRlbHRhX2Rpdi0+ZXhlY190aW1lLCBtYXhfZGl2LT5leGVjX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicHJvYmVfdGltZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnByb2JlX3RpbWUpLCBhY2N1bV9kaXYtPnByb2JlX3RpbWUsCisJCSAgICAgIGRlbHRhX2Rpdi0+cHJvYmVfdGltZSwgbWF4X2Rpdi0+cHJvYmVfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJyeF9lbmFibGVfY291bnRlcjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnJ4X2VuYWJsZV9jb3VudGVyLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKKwkJICAgICAgbWF4X2dlbmVyYWwtPnJ4X2VuYWJsZV9jb3VudGVyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm51bV9vZl9zb3Nfc3RhdGVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+bnVtX29mX3Nvc19zdGF0ZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bnVtX29mX3Nvc19zdGF0ZXMpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWVmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LW1hYy5jCkBAIC0wLDAgKzEsNjUzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCisgKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2RlZmluZSBEUlZfTkFNRSAgICAgICAgIml3bDQ5NjUiCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtb2R1bGUgYm9pbGVyIHBsYXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KKyAqLworI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkludGVsKFIpIFdpcmVsZXNzIFdpRmkgNDk2NSBkcml2ZXIgZm9yIExpbnV4IgorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisjZGVmaW5lIFZEICJkIgorI2Vsc2UKKyNkZWZpbmUgVkQKKyNlbmRpZgorCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICBJV0xXSUZJX1ZFUlNJT04gVkQKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpd2w0OTY1Iik7CisKK3ZvaWQKK2lsNDk2NV9jaGVja19hYm9ydF9zdGF0dXMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBmcmFtZV9jb3VudCwgdTMyIHN0YXR1cykKK3sKKwlpZiAoZnJhbWVfY291bnQgPT0gMSAmJiBzdGF0dXMgPT0gVFhfU1RBVFVTX0ZBSUxfUkZLSUxMX0ZMVVNIKSB7CisJCUlMX0VSUigiVHggZmx1c2ggY29tbWFuZCB0byBmbHVzaCBvdXQgYWxsIGZyYW1lc1xuIik7CisJCWlmICghdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT50eF9mbHVzaCk7CisJfQorfQorCisvKgorICogRUVQUk9NCisgKi8KK3N0cnVjdCBpbF9tb2RfcGFyYW1zIGlsNDk2NV9tb2RfcGFyYW1zID0geworCS5hbXNkdV9zaXplXzhLID0gMSwKKwkucmVzdGFydF9mdyA9IDEsCisJLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLworfTsKKwordm9pZAoraWw0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisJLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykgeworCQkvKiBJbiB0aGUgcmVzZXQgZnVuY3Rpb24sIHRoZXNlIGJ1ZmZlcnMgbWF5IGhhdmUgYmVlbiBhbGxvY2F0ZWQKKwkJICogdG8gYW4gU0tCLCBzbyB3ZSBuZWVkIHRvIHVubWFwIGFuZCBmcmVlIHBvdGVudGlhbCBzdG9yYWdlICovCisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJX19pbF9mcmVlX3BhZ2VzKGlsLCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmcnhxLT5wb29sW2ldLmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFOyBpKyspCisJCXJ4cS0+cXVldWVbaV0gPSBOVUxMOworCisJLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCisJICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCisJcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7CisJcnhxLT53cml0ZV9hY3R1YWwgPSAwOworCXJ4cS0+ZnJlZV9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludAoraWw0OTY1X3J4X2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwl1MzIgcmJfc2l6ZTsKKwljb25zdCB1MzIgcmZkbmxvZyA9IFJYX1FVRVVFX1NJWkVfTE9HOwkvKiAyNTYgUkJEcyAqLworCXUzMiByYl90aW1lb3V0ID0gMDsKKworCWlmIChpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5hbXNkdV9zaXplXzhLKQorCQlyYl9zaXplID0gRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfOEs7CisJZWxzZQorCQlyYl9zaXplID0gRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEs7CisKKwkvKiBTdG9wIFJ4IERNQSAqLworCWlsX3dyKGlsLCBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsIDApOworCisJLyogUmVzZXQgZHJpdmVyJ3MgUnggcXVldWUgd3JpdGUgaWR4ICovCisJaWxfd3IoaWwsIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcsIDApOworCisJLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KKwlpbF93cihpbCwgRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRywgKHUzMikgKHJ4cS0+YmRfZG1hID4+IDgpKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIGluIERSQU0gdG8gdXBkYXRlIGl0cyBSeCBzdGF0dXMgKi8KKwlpbF93cihpbCwgRkg0OV9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHLCByeHEtPnJiX3N0dHNfZG1hID4+IDQpOworCisJLyogRW5hYmxlIFJ4IERNQQorCSAqIERpcmVjdCByeCBpbnRlcnJ1cHRzIHRvIGhvc3RzCisJICogUnggYnVmZmVyIHNpemUgNCBvciA4aworCSAqIFJCIHRpbWVvdXQgMHgxMAorCSAqIDI1NiBSQkRzCisJICovCisJaWxfd3IoaWwsIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywKKwkgICAgICBGSDQ5X1JDU1JfUlhfQ09ORklHX0NITkxfRU5fRU5BQkxFX1ZBTCB8CisJICAgICAgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9JTlRfSE9TVF9WQUwgfAorCSAgICAgIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfU0lOR0xFX0ZSQU1FX01TSyB8CisJICAgICAgcmJfc2l6ZSB8CisJICAgICAgKHJiX3RpbWVvdXQgPDwgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfSVJRX1JCVEhfUE9TKSB8CisJICAgICAgKHJmZG5sb2cgPDwgRkg0OV9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX1BPUykpOworCisJLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIHRvIGRlZmF1bHQgKDIwNDggdXNlY3MpICovCisJaWxfd3JpdGU4KGlsLCBDU1JfSU5UX0NPQUxFU0NJTkcsIElMX0hPU1RfSU5UX1RJTUVPVVRfREVGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldF9wd3Jfdm1haW4oc3RydWN0IGlsX3ByaXYgKmlsKQoreworLyoKKyAqIChmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcykKKyAqIHRvIHNldCBwb3dlciB0byBWX0FVWCwgZG86CisKKwkJaWYgKHBjaV9wbWVfY2FwYWJsZShpbC0+cGNpX2RldiwgUENJX0QzY29sZCkpCisJCQlpbF9zZXRfYml0c19tYXNrX3BycGgoaWwsIEFQTUdfUFNfQ1RSTF9SRUcsCisJCQkJCSAgICAgICBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVkFVWCwKKwkJCQkJICAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOworICovCisKKwlpbF9zZXRfYml0c19tYXNrX3BycGgoaWwsIEFQTUdfUFNfQ1RSTF9SRUcsCisJCQkgICAgICBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4sCisJCQkgICAgICB+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKK30KKworaW50CitpbDQ5NjVfaHdfbmljX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwlpbnQgcmV0OworCisJLyogbmljX2luaXQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KGlsKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyBjYWxpYnJhdGlvbiB0aW1lciB0byBkZWZhdWx0ICg1MTIgdXNlY3MpICovCisJaWxfd3JpdGU4KGlsLCBDU1JfSU5UX0NPQUxFU0NJTkcsIElMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbDQ5NjVfc2V0X3B3cl92bWFpbihpbCk7CisKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5jb25maWcoaWwpOworCisJLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCWlmICghcnhxLT5iZCkgeworCQlyZXQgPSBpbF9yeF9xdWV1ZV9hbGxvYyhpbCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiVW5hYmxlIHRvIGluaXRpYWxpemUgUnggcXVldWVcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UKKwkJaWw0OTY1X3J4X3F1ZXVlX3Jlc2V0KGlsLCByeHEpOworCisJaWw0OTY1X3J4X3JlcGxlbmlzaChpbCk7CisKKwlpbDQ5NjVfcnhfaW5pdChpbCwgcnhxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgcnhxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBBbGxvY2F0ZSBvciByZXNldCBhbmQgaW5pdCBhbGwgVHggYW5kIENvbW1hbmQgcXVldWVzICovCisJaWYgKCFpbC0+dHhxKSB7CisJCXJldCA9IGlsNDk2NV90eHFfY3R4X2FsbG9jKGlsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCWlsNDk2NV90eHFfY3R4X3Jlc2V0KGlsKTsKKworCXNldF9iaXQoU19JTklULCAmaWwtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfZG1hX2FkZHIycmJkX3B0ciAtIGNvbnZlcnQgYSBETUEgYWRkcmVzcyB0byBhIHVDb2RlIHJlYWQgYnVmZmVyIHB0cgorICovCitzdGF0aWMgaW5saW5lIF9fbGUzMgoraWw0OTY1X2RtYV9hZGRyMnJiZF9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBjcHVfdG9fbGUzMigodTMyKSAoZG1hX2FkZHIgPj4gOCkpOworfQorCisvKioKKyAqIGlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrIC0gcmVmaWxsIFJYIHF1ZXVlIGZyb20gcHJlLWFsbG9jYXRlZCBwb29sCisgKgorICogSWYgdGhlcmUgYXJlIHNsb3RzIGluIHRoZSBSWCBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUgcmVzdG9ja2VkLAorICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKKyAqIGFzIHdlIGNhbiwgcHVsbGluZyBmcm9tIHJ4X2ZyZWUuCisgKgorICogVGhpcyBtb3ZlcyB0aGUgJ3dyaXRlJyBpZHggZm9yd2FyZCB0byBjYXRjaCB1cCB3aXRoICdwcm9jZXNzZWQnLCBhbmQKKyAqIGFsc28gdXBkYXRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgaW4gdGhlIGZpcm13YXJlIHRvIHJlZmVyZW5jZSB0aGUgbmV3CisgKiB0YXJnZXQgYnVmZmVyLgorICovCit2b2lkCitpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCXdoaWxlIChpbF9yeF9xdWV1ZV9zcGFjZShyeHEpID4gMCAmJiByeHEtPmZyZWVfY291bnQpIHsKKwkJLyogVGhlIG92ZXJ3cml0dGVuIHJ4YiBtdXN0IGJlIGEgdXNlZCBvbmUgKi8KKwkJcnhiID0gcnhxLT5xdWV1ZVtyeHEtPndyaXRlXTsKKwkJQlVHX09OKHJ4YiAmJiByeGItPnBhZ2UpOworCisJCS8qIEdldCBuZXh0IGZyZWUgUnggYnVmZmVyLCByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KKwkJZWxlbWVudCA9IHJ4cS0+cnhfZnJlZS5uZXh0OworCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9yeF9idWYsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQkvKiBQb2ludCB0byBSeCBidWZmZXIgdmlhIG5leHQgUkJEIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworCQlyeHEtPmJkW3J4cS0+d3JpdGVdID0KKwkJICAgIGlsNDk2NV9kbWFfYWRkcjJyYmRfcHRyKGlsLCByeGItPnBhZ2VfZG1hKTsKKwkJcnhxLT5xdWV1ZVtyeHEtPndyaXRlXSA9IHJ4YjsKKwkJcnhxLT53cml0ZSA9IChyeHEtPndyaXRlICsgMSkgJiBSWF9RVUVVRV9NQVNLOworCQlyeHEtPmZyZWVfY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJLyogSWYgdGhlIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHBvb2wgaXMgZHJvcHBpbmcgbG93LCBzY2hlZHVsZSB0bworCSAqIHJlZmlsbCBpdCAqLworCWlmIChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykKKwkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJ4X3JlcGxlbmlzaCk7CisKKwkvKiBJZiB3ZSd2ZSBhZGRlZCBtb3JlIHNwYWNlIGZvciB0aGUgZmlybXdhcmUgdG8gcGxhY2UgZGF0YSwgdGVsbCBpdC4KKwkgKiBJbmNyZW1lbnQgZGV2aWNlJ3Mgd3JpdGUgcG9pbnRlciBpbiBtdWx0aXBsZXMgb2YgOC4gKi8KKwlpZiAocnhxLT53cml0ZV9hY3R1YWwgIT0gKHJ4cS0+d3JpdGUgJiB+MHg3KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCXJ4cS0+bmVlZF91cGRhdGUgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgcnhxKTsKKwl9Cit9CisKKy8qKgorICogaWw0OTY1X3J4X3JlcGxlbmlzaCAtIE1vdmUgYWxsIHVzZWQgcGFja2V0IGZyb20gcnhfdXNlZCB0byByeF9mcmVlCisgKgorICogV2hlbiBtb3ZpbmcgdG8gcnhfZnJlZSBhbiBTS0IgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2xvdC4KKyAqCisgKiBBbHNvIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHZpYSBpbF9yeF9xdWV1ZV9yZXN0b2NrLgorICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbml0aWFsaXphdGlvbikKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yeF9hbGxvY2F0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGdmcF90IHByaW9yaXR5KQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlnZnBfdCBnZnBfbWFzayA9IHByaW9yaXR5OworCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA+IFJYX0xPV19XQVRFUk1BUkspCisJCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47CisKKwkJaWYgKGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCisJCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOworCisJCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCisJCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCURfSU5GTygiYWxsb2NfcGFnZXMgZmFpbGVkLCAiICJvcmRlcjogJWRcbiIsCisJCQkJICAgICAgIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisKKwkJCWlmIChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSyAmJgorCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKKwkJCQlJTF9FUlIoIkZhaWxlZCB0byBhbGxvY19wYWdlcyB3aXRoICVzLiAiCisJCQkJICAgICAgICJPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAorCQkJCSAgICAgICBwcmlvcml0eSA9PQorCQkJCSAgICAgICBHRlBfQVRPTUlDID8gIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAorCQkJCSAgICAgICByeHEtPmZyZWVfY291bnQpOworCQkJLyogV2UgZG9uJ3QgcmVzY2hlZHVsZSByZXBsZW5pc2ggd29yayBoZXJlIC0tIHdlIHdpbGwKKwkJCSAqIGNhbGwgdGhlIHJlc3RvY2sgbWV0aG9kIGFuZCBpZiBpdCBzdGlsbCBuZWVkcworCQkJICogbW9yZSBidWZmZXJzIGl0IHdpbGwgc2NoZWR1bGUgcmVwbGVuaXNoICovCisJCQlyZXR1cm47CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCQlyZXR1cm47CisJCX0KKwkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OworCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9yeF9idWYsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlCVUdfT04ocnhiLT5wYWdlKTsKKwkJcnhiLT5wYWdlID0gcGFnZTsKKwkJLyogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFJCICovCisJCXJ4Yi0+cGFnZV9kbWEgPQorCQkgICAgcGNpX21hcF9wYWdlKGlsLT5wY2lfZGV2LCBwYWdlLCAwLAorCQkJCSBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkvKiBkbWEgYWRkcmVzcyBtdXN0IGJlIG5vIG1vcmUgdGhhbiAzNiBiaXRzICovCisJCUJVR19PTihyeGItPnBhZ2VfZG1hICYgfkRNQV9CSVRfTUFTSygzNikpOworCQkvKiBhbmQgYWxzbyAyNTYgYnl0ZSBhbGlnbmVkISAqLworCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIERNQV9CSVRfTUFTSyg4KSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCXJ4cS0+ZnJlZV9jb3VudCsrOworCQlpbC0+YWxsb2NfcnhiX3BhZ2UrKzsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQKK2lsNDk2NV9yeF9yZXBsZW5pc2goc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbDQ5NjVfcnhfYWxsb2NhdGUoaWwsIEdGUF9LRVJORUwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWw0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQKK2lsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbDQ5NjVfcnhfYWxsb2NhdGUoaWwsIEdGUF9BVE9NSUMpOworCisJaWw0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soaWwpOworfQorCisvKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KKyAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCisgKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KKyAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAorICovCit2b2lkCitpbDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKKwkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGlsLT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCisJCQkJICAgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlfX2lsX2ZyZWVfcGFnZXMoaWwsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKKwkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKKwkJfQorCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKKwkJCSAgcnhxLT5iZF9kbWEpOworCWRtYV9mcmVlX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlsX3JiX3N0YXR1cyksCisJCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7CisJcnhxLT5iZCA9IE5VTEw7CisJcnhxLT5yYl9zdHRzID0gTlVMTDsKK30KKworaW50CitpbDQ5NjVfcnhxX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCisJLyogc3RvcCBSeCBETUEgKi8KKwlpbF93cihpbCwgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKKwlpbF9wb2xsX2JpdChpbCwgRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHLAorCQkgICAgRkg0OV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUsIDEwMDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgodTMyIHJhdGVfbl9mbGFncywgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCWludCBpZHggPSAwOworCWludCBiYW5kX29mZnNldCA9IDA7CisKKwkvKiBIVCByYXRlIGZvcm1hdDogbWFjODAyMTEgd2FudHMgYW4gTUNTIG51bWJlciwgd2hpY2ggaXMganVzdCBMU0IgKi8KKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSB7CisJCWlkeCA9IChyYXRlX25fZmxhZ3MgJiAweGZmKTsKKwkJcmV0dXJuIGlkeDsKKwkJLyogTGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCisJfSBlbHNlIHsKKwkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJCWJhbmRfb2Zmc2V0ID0gSUxfRklSU1RfT0ZETV9SQVRFOworCQlmb3IgKGlkeCA9IGJhbmRfb2Zmc2V0OyBpZHggPCBSQVRFX0NPVU5UX0xFR0FDWTsgaWR4KyspCisJCQlpZiAoaWxfcmF0ZXNbaWR4XS5wbGNwID09IChyYXRlX25fZmxhZ3MgJiAweEZGKSkKKwkJCQlyZXR1cm4gaWR4IC0gYmFuZF9vZmZzZXQ7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfY2FsY19yc3NpKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3BoeV9yZXMgKnJ4X3Jlc3ApCit7CisJLyogZGF0YSBmcm9tIFBIWS9EU1AgcmVnYXJkaW5nIHNpZ25hbCBzdHJlbmd0aCwgZXRjLiwKKwkgKiAgIGNvbnRlbnRzIGFyZSBhbHdheXMgdGhlcmUsIG5vdCBjb25maWd1cmFibGUgYnkgaG9zdC4gICovCisJc3RydWN0IGlsNDk2NV9yeF9ub25fY2ZnX3BoeSAqbmNwaHkgPQorCSAgICAoc3RydWN0IGlsNDk2NV9yeF9ub25fY2ZnX3BoeSAqKXJ4X3Jlc3AtPm5vbl9jZmdfcGh5X2J1ZjsKKwl1MzIgYWdjID0KKwkgICAgKGxlMTZfdG9fY3B1KG5jcGh5LT5hZ2NfaW5mbykgJiBJTDQ5X0FHQ19EQl9NQVNLKSA+PgorCSAgICBJTDQ5X0FHQ19EQl9QT1M7CisKKwl1MzIgdmFsaWRfYW50ZW5uYWUgPQorCSAgICAobGUxNl90b19jcHUocnhfcmVzcC0+cGh5X2ZsYWdzKSAmIElMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0spCisJICAgID4+IElMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX09GRlNFVDsKKwl1OCBtYXhfcnNzaSA9IDA7CisJdTMyIGk7CisKKwkvKiBGaW5kIG1heCByc3NpIGFtb25nIDMgcG9zc2libGUgcmVjZWl2ZXJzLgorCSAqIFRoZXNlIHZhbHVlcyBhcmUgbWVhc3VyZWQgYnkgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKS4KKwkgKiBUaGV5IHNob3VsZCBzdGF5IGZhaXJseSBjb25zdGFudCBldmVuIGFzIHRoZSBzaWduYWwgc3RyZW5ndGggdmFyaWVzLAorCSAqICAgaWYgdGhlIHJhZGlvJ3MgYXV0b21hdGljIGdhaW4gY29udHJvbCAoQUdDKSBpcyB3b3JraW5nIHJpZ2h0LgorCSAqIEFHQyB2YWx1ZSAoc2VlIGJlbG93KSB3aWxsIHByb3ZpZGUgdGhlICJpbnRlcmVzdGluZyIgaW5mby4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpZiAodmFsaWRfYW50ZW5uYWUgJiAoMSA8PCBpKSkKKwkJCW1heF9yc3NpID0gbWF4KG5jcGh5LT5yc3NpX2luZm9baSA8PCAxXSwgbWF4X3Jzc2kpOworCisJRF9TVEFUUygiUnNzaSBJbiBBICVkIEIgJWQgQyAlZCBNYXggJWQgQUdDIGRCICVkXG4iLAorCQluY3BoeS0+cnNzaV9pbmZvWzBdLCBuY3BoeS0+cnNzaV9pbmZvWzJdLCBuY3BoeS0+cnNzaV9pbmZvWzRdLAorCQltYXhfcnNzaSwgYWdjKTsKKworCS8qIGRCbSA9IG1heF9yc3NpIGRCIC0gYWdjIGRCIC0gY29uc3RhbnQuCisJICogSGlnaGVyIEFHQyAoaGlnaGVyIHJhZGlvIGdhaW4pIG1lYW5zIGxvd2VyIHNpZ25hbC4gKi8KKwlyZXR1cm4gbWF4X3Jzc2kgLSBhZ2MgLSBJTDQ5NjVfUlNTSV9PRkZTRVQ7Cit9CisKK3N0YXRpYyB1MzIKK2lsNDk2NV90cmFuc2xhdGVfcnhfc3RhdHVzKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGRlY3J5cHRfaW4pCit7CisJdTMyIGRlY3J5cHRfb3V0ID0gMDsKKworCWlmICgoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkgPT0KKwkgICAgUlhfUkVTX1NUQVRVU19TVEFUSU9OX0ZPVU5EKQorCQlkZWNyeXB0X291dCB8PQorCQkgICAgKFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCB8CisJCSAgICAgUlhfUkVTX1NUQVRVU19OT19TVEFUSU9OX0lORk9fTUlTTUFUQ0gpOworCisJZGVjcnlwdF9vdXQgfD0gKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSyk7CisKKwkvKiBwYWNrZXQgd2FzIG5vdCBlbmNyeXB0ZWQgKi8KKwlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgPT0KKwkgICAgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FKQorCQlyZXR1cm4gZGVjcnlwdF9vdXQ7CisKKwkvKiBwYWNrZXQgd2FzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gYWxnICovCisJaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09CisJICAgIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfRVJSKQorCQlyZXR1cm4gZGVjcnlwdF9vdXQ7CisKKwkvKiBkZWNyeXB0aW9uIHdhcyBub3QgZG9uZSBpbiBIVyAqLworCWlmICgoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spICE9CisJICAgIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spCisJCXJldHVybiBkZWNyeXB0X291dDsKKworCXN3aXRjaCAoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7CisKKwljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKKwkJLyogYWxnIGlzIENDTTogY2hlY2sgTUlDIG9ubHkgKi8KKwkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0spKQorCQkJLyogQmFkIE1JQyAqLworCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKKwkJZWxzZQorCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOworCisJCWJyZWFrOworCisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6CisJCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfVFRBS19PSykpIHsKKwkJCS8qIEJhZCBUVEFLICovCisJCQlkZWNyeXB0X291dCB8PSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSzsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCBpZiBUVEFLIE9LICovCisJZGVmYXVsdDoKKwkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0spKQorCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKKwkJZWxzZQorCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOworCQlicmVhazsKKwl9CisKKwlEX1JYKCJkZWNyeXB0X2luOjB4JXggIGRlY3J5cHRfb3V0ID0gMHgleFxuIiwgZGVjcnlwdF9pbiwgZGVjcnlwdF9vdXQpOworCisJcmV0dXJuIGRlY3J5cHRfb3V0OworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgICB1MTYgbGVuLCB1MzIgYW1wZHVfc3RhdHVzLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisJLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KKwlpZiAodW5saWtlbHkoIWlsLT5pc19vcGVuKSkgeworCQlEX0RST1AoIkRyb3BwaW5nIHBhY2tldCB3aGlsZSBpbnRlcmZhY2UgaXMgbm90IG9wZW4uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluIGNhc2Ugb2YgSFcgYWNjZWxlcmF0ZWQgY3J5cHRvIGFuZCBiYWQgZGVjcnlwdGlvbiwgZHJvcCAqLworCWlmICghaWwtPmNmZy0+bW9kX3BhcmFtcy0+c3dfY3J5cHRvICYmCisJICAgIGlsX3NldF9kZWNyeXB0ZWRfZmxhZyhpbCwgaGRyLCBhbXBkdV9zdGF0dXMsIHN0YXRzKSkKKwkJcmV0dXJuOworCisJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOworCWlmICghc2tiKSB7CisJCUlMX0VSUigiZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLCAodm9pZCAqKWhkciAtIHJ4Yl9hZGRyKHJ4YiksIGxlbik7CisKKwlpbF91cGRhdGVfc3RhdHMoaWwsIGZhbHNlLCBmYywgbGVuKTsKKwltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksIHN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisKKwlpZWVlODAyMTFfcngoaWwtPmh3LCBza2IpOworCWlsLT5hbGxvY19yeGJfcGFnZS0tOworCXJ4Yi0+cGFnZSA9IE5VTEw7Cit9CisKKy8qIENhbGxlZCBmb3IgTl9SWCAobGVnYWN5IEFCRyBmcmFtZXMpLCBvcgorICogTl9SWF9NUERVIChIVCBoaWdoLXRocm91Z2hwdXQgTiBmcmFtZXMpLiAqLwordm9pZAoraWw0OTY1X2hkbF9yeChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1czsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9yeF9waHlfcmVzICpwaHlfcmVzOworCV9fbGUzMiByeF9wa3Rfc3RhdHVzOworCXN0cnVjdCBpbF9yeF9tcGR1X3Jlc19zdGFydCAqYW1zZHU7CisJdTMyIGxlbjsKKwl1MzIgYW1wZHVfc3RhdHVzOworCXUzMiByYXRlX25fZmxhZ3M7CisKKwkvKioKKwkgKiBOX1JYIGFuZCBOX1JYX01QRFUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisJICoJTl9SWDogcGh5c2ljYWwgbGF5ZXIgaW5mbyBpcyBpbiB0aGlzIGJ1ZmZlcgorCSAqCU5fUlhfTVBEVTogcGh5c2ljYWwgbGF5ZXIgaW5mbyB3YXMgc2VudCBpbiBzZXBhcmF0ZQorCSAqCQljb21tYW5kIGFuZCBjYWNoZWQgaW4gaWwtPmxhc3RfcGh5X3JlcworCSAqCisJICogSGVyZSB3ZSBzZXQgdXAgbG9jYWwgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB3aGljaCBjb21tYW5kIGlzCisJICogcmVjZWl2ZWQuCisJICovCisJaWYgKHBrdC0+aGRyLmNtZCA9PSBOX1JYKSB7CisJCXBoeV9yZXMgPSAoc3RydWN0IGlsX3J4X3BoeV9yZXMgKilwa3QtPnUucmF3OworCQloZWFkZXIgPQorCQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKnBoeV9yZXMpICsKKwkJCQkJICAgICBwaHlfcmVzLT5jZmdfcGh5X2NudCk7CisKKwkJbGVuID0gbGUxNl90b19jcHUocGh5X3Jlcy0+Ynl0ZV9jb3VudCk7CisJCXJ4X3BrdF9zdGF0dXMgPQorCQkgICAgKihfX2xlMzIgKikgKHBrdC0+dS5yYXcgKyBzaXplb2YoKnBoeV9yZXMpICsKKwkJCQkgcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQgKyBsZW4pOworCQlhbXBkdV9zdGF0dXMgPSBsZTMyX3RvX2NwdShyeF9wa3Rfc3RhdHVzKTsKKwl9IGVsc2UgeworCQlpZiAoIWlsLT5fNDk2NS5sYXN0X3BoeV9yZXNfdmFsaWQpIHsKKwkJCUlMX0VSUigiTVBEVSBmcmFtZSB3aXRob3V0IGNhY2hlZCBQSFkgZGF0YVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJcGh5X3JlcyA9ICZpbC0+XzQ5NjUubGFzdF9waHlfcmVzOworCQlhbXNkdSA9IChzdHJ1Y3QgaWxfcnhfbXBkdV9yZXNfc3RhcnQgKilwa3QtPnUucmF3OworCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocGt0LT51LnJhdyArIHNpemVvZigqYW1zZHUpKTsKKwkJbGVuID0gbGUxNl90b19jcHUoYW1zZHUtPmJ5dGVfY291bnQpOworCQlyeF9wa3Rfc3RhdHVzID0gKihfX2xlMzIgKikgKHBrdC0+dS5yYXcgKyBzaXplb2YoKmFtc2R1KSArIGxlbik7CisJCWFtcGR1X3N0YXR1cyA9CisJCSAgICBpbDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhpbCwgbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cykpOworCX0KKworCWlmICgodW5saWtlbHkocGh5X3Jlcy0+Y2ZnX3BoeV9jbnQgPiAyMCkpKSB7CisJCURfRFJPUCgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogJWQvbiIsCisJCSAgICAgICBwaHlfcmVzLT5jZmdfcGh5X2NudCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShyeF9wa3Rfc3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19DUkMzMl9FUlJPUikgfHwKKwkgICAgIShyeF9wa3Rfc3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19SWEVfT1ZFUkZMT1cpKSB7CisJCURfUlgoIkJhZCBDUkMgb3IgRklGTzogMHglMDhYLlxuIiwgbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cykpOworCQlyZXR1cm47CisJfQorCisJLyogVGhpcyB3aWxsIGJlIHVzZWQgaW4gc2V2ZXJhbCBwbGFjZXMgbGF0ZXIgKi8KKwlyYXRlX25fZmxhZ3MgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5yYXRlX25fZmxhZ3MpOworCisJLyogcnhfc3RhdHVzIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCB0byBtYWM4MDIxMSAqLworCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKTsKKwlyeF9zdGF0dXMuYmFuZCA9CisJICAgIChwaHlfcmVzLT4KKwkgICAgIHBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0spID8gSUVFRTgwMjExX0JBTkRfMkdIWiA6CisJICAgIElFRUU4MDIxMV9CQU5EXzVHSFo7CisJcnhfc3RhdHVzLmZyZXEgPQorCSAgICBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCksCisJCQkJCSAgIHJ4X3N0YXR1cy5iYW5kKTsKKwlyeF9zdGF0dXMucmF0ZV9pZHggPQorCSAgICBpbDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsIHJ4X3N0YXR1cy5iYW5kKTsKKwlyeF9zdGF0dXMuZmxhZyA9IDA7CisKKwkvKiBUU0YgaXNuJ3QgcmVsaWFibGUuIEluIG9yZGVyIHRvIGFsbG93IHNtb290aCB1c2VyIGV4cGVyaWVuY2UsCisJICogdGhpcyBXL0EgZG9lc24ndCBwcm9wYWdhdGUgaXQgdG8gdGhlIG1hYzgwMjExICovCisJLypyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfTVBEVTsgKi8KKworCWlsLT51Y29kZV9iZWFjb25fdGltZSA9IGxlMzJfdG9fY3B1KHBoeV9yZXMtPmJlYWNvbl90aW1lX3N0YW1wKTsKKworCS8qIEZpbmQgbWF4IHNpZ25hbCBzdHJlbmd0aCAoZEJtKSBhbW9uZyAzIGFudGVubmEvcmVjZWl2ZXIgY2hhaW5zICovCisJcnhfc3RhdHVzLnNpZ25hbCA9IGlsNDk2NV9jYWxjX3Jzc2koaWwsIHBoeV9yZXMpOworCisJaWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKGlsLCBsZW4sIGhlYWRlcik7CisJRF9TVEFUUygiUnNzaSAlZCwgVFNGICVsbHVcbiIsIHJ4X3N0YXR1cy5zaWduYWwsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcnhfc3RhdHVzLm1hY3RpbWUpOworCisJLyoKKwkgKiAiYW50ZW5uYSBudW1iZXIiCisJICoKKwkgKiBJdCBzZWVtcyB0aGF0IHRoZSBhbnRlbm5hIGZpZWxkIGluIHRoZSBwaHkgZmxhZ3MgdmFsdWUKKwkgKiBpcyBhY3R1YWxseSBhIGJpdCBmaWVsZC4gVGhpcyBpcyB1bmRlZmluZWQgYnkgcmFkaW90YXAsCisJICogaXQgd2FudHMgYW4gYWN0dWFsIGFudGVubmEgbnVtYmVyIGJ1dCBJIGFsd2F5cyBnZXQgIjciCisJICogZm9yIG1vc3QgbGVnYWN5IGZyYW1lcyBJIHJlY2VpdmUgaW5kaWNhdGluZyB0aGF0IHRoZQorCSAqIHNhbWUgZnJhbWUgd2FzIHJlY2VpdmVkIG9uIGFsbCB0aHJlZSBSWCBjaGFpbnMuCisJICoKKwkgKiBJIHRoaW5rIHRoaXMgZmllbGQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgYQorCSAqIG5ldyA4MDIuMTFuIHJhZGlvdGFwIGZpZWxkICJSWCBjaGFpbnMiIHRoYXQgaXMgZGVmaW5lZAorCSAqIGFzIGEgYml0bWFzay4KKwkgKi8KKwlyeF9zdGF0dXMuYW50ZW5uYSA9CisJICAgIChsZTE2X3RvX2NwdShwaHlfcmVzLT5waHlfZmxhZ3MpICYgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX01TSykgPj4KKwkgICAgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX1BPUzsKKworCS8qIHNldCB0aGUgcHJlYW1ibGUgZmxhZyBpZiBhcHByb3ByaWF0ZSAqLworCWlmIChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSykKKwkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKKworCS8qIFNldCB1cCB0aGUgSFQgcGh5IGZsYWdzICovCisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykKKwkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19IVDsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfNDBNSFo7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX1NHSV9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRfR0k7CisKKwlpbDQ5NjVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoaWwsIGhlYWRlciwgbGVuLCBhbXBkdV9zdGF0dXMsIHJ4YiwKKwkJCQkgICAgICAgJnJ4X3N0YXR1cyk7Cit9CisKKy8qIENhY2hlIHBoeSBkYXRhIChSeCBzaWduYWwgc3RyZW5ndGgsIGV0YykgZm9yIEhUIGZyYW1lIChOX1JYX1BIWSkuCisgKiBUaGlzIHdpbGwgYmUgdXNlZCBsYXRlciBpbiBpbF9oZGxfcngoKSBmb3IgTl9SWF9NUERVLiAqLwordm9pZAoraWw0OTY1X2hkbF9yeF9waHkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlpbC0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkID0gdHJ1ZTsKKwltZW1jcHkoJmlsLT5fNDk2NS5sYXN0X3BoeV9yZXMsIHBrdC0+dS5yYXcsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfcnhfcGh5X3JlcykpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1OCBpc19hY3RpdmUsCisJCQkgICAgIHU4IG5fcHJvYmVzLCBzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsICpzY2FuX2NoKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXUxNiBwYXNzaXZlX2R3ZWxsID0gMDsKKwl1MTYgYWN0aXZlX2R3ZWxsID0gMDsKKwlpbnQgYWRkZWQsIGk7CisJdTE2IGNoYW5uZWw7CisKKwlzYmFuZCA9IGlsX2dldF9od19tb2RlKGlsLCBiYW5kKTsKKwlpZiAoIXNiYW5kKQorCQlyZXR1cm4gMDsKKworCWFjdGl2ZV9kd2VsbCA9IGlsX2dldF9hY3RpdmVfZHdlbGxfdGltZShpbCwgYmFuZCwgbl9wcm9iZXMpOworCXBhc3NpdmVfZHdlbGwgPSBpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKGlsLCBiYW5kLCB2aWYpOworCisJaWYgKHBhc3NpdmVfZHdlbGwgPD0gYWN0aXZlX2R3ZWxsKQorCQlwYXNzaXZlX2R3ZWxsID0gYWN0aXZlX2R3ZWxsICsgMTsKKworCWZvciAoaSA9IDAsIGFkZGVkID0gMDsgaSA8IGlsLT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gaWwtPnNjYW5fcmVxdWVzdC0+Y2hhbm5lbHNbaV07CisKKwkJaWYgKGNoYW4tPmJhbmQgIT0gYmFuZCkKKwkJCWNvbnRpbnVlOworCisJCWNoYW5uZWwgPSBjaGFuLT5od192YWx1ZTsKKwkJc2Nhbl9jaC0+Y2hhbm5lbCA9IGNwdV90b19sZTE2KGNoYW5uZWwpOworCisJCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBiYW5kLCBjaGFubmVsKTsKKwkJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCQlEX1NDQU4oIkNoYW5uZWwgJWQgaXMgSU5WQUxJRCBmb3IgdGhpcyBiYW5kLlxuIiwKKwkJCSAgICAgICBjaGFubmVsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFpc19hY3RpdmUgfHwgaWxfaXNfY2hhbm5lbF9wYXNzaXZlKGNoX2luZm8pIHx8CisJCSAgICAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pKQorCQkJc2Nhbl9jaC0+dHlwZSA9IFNDQU5fQ0hBTk5FTF9UWVBFX1BBU1NJVkU7CisJCWVsc2UKKwkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9BQ1RJVkU7CisKKwkJaWYgKG5fcHJvYmVzKQorCQkJc2Nhbl9jaC0+dHlwZSB8PSBJTF9TQ0FOX1BST0JFX01BU0sobl9wcm9iZXMpOworCisJCXNjYW5fY2gtPmFjdGl2ZV9kd2VsbCA9IGNwdV90b19sZTE2KGFjdGl2ZV9kd2VsbCk7CisJCXNjYW5fY2gtPnBhc3NpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihwYXNzaXZlX2R3ZWxsKTsKKworCQkvKiBTZXQgdHhwb3dlciBsZXZlbHMgdG8gZGVmYXVsdHMgKi8KKwkJc2Nhbl9jaC0+ZHNwX2F0dGVuID0gMTEwOworCisJCS8qIE5PVEU6IGlmIHdlIHdlcmUgZG9pbmcgNk1iIE9GRE0gZm9yIHNjYW5zIHdlJ2QgdXNlCisJCSAqIHBvd2VyIGxldmVsOgorCQkgKiBzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDIgPDwgMykpIHwgMzsKKwkJICovCisJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDMgPDwgMykpIHwgMzsKKwkJZWxzZQorCQkJc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICg1IDw8IDMpKTsKKworCQlEX1NDQU4oIlNjYW5uaW5nIGNoPSVkIHByb2I9MHglWCBbJXMgJWRdXG4iLCBjaGFubmVsLAorCQkgICAgICAgbGUzMl90b19jcHUoc2Nhbl9jaC0+dHlwZSksCisJCSAgICAgICAoc2Nhbl9jaC0+CisJCQl0eXBlICYgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFKSA/ICJBQ1RJVkUiIDogIlBBU1NJVkUiLAorCQkgICAgICAgKHNjYW5fY2gtPgorCQkJdHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPyBhY3RpdmVfZHdlbGwgOgorCQkgICAgICAgcGFzc2l2ZV9kd2VsbCk7CisKKwkJc2Nhbl9jaCsrOworCQlhZGRlZCsrOworCX0KKworCURfU0NBTigidG90YWwgY2hhbm5lbHMgdG8gc2NhbiAlZFxuIiwgYWRkZWQpOworCXJldHVybiBhZGRlZDsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2lsNDk2NV9hbnRfaWR4X3RvX2ZsYWdzKHU4IGFudF9pZHgpCit7CisJcmV0dXJuIEJJVChhbnRfaWR4KSA8PCBSQVRFX01DU19BTlRfUE9TOworfQorCitpbnQKK2lsNDk2NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfU0NBTiwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfc2Nhbl9jbWQpLAorCQkuZmxhZ3MgPSBDTURfU0laRV9IVUdFLAorCX07CisJc3RydWN0IGlsX3NjYW5fY21kICpzY2FuOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUzMiByYXRlX2ZsYWdzID0gMDsKKwl1MTYgY21kX2xlbjsKKwl1MTYgcnhfY2hhaW4gPSAwOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwl1OCBuX3Byb2JlcyA9IDA7CisJdTggcnhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7CisJdTggcmF0ZTsKKwlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOworCWludCBjaGFuX21vZDsKKwl1OCBhY3RpdmVfY2hhaW5zOworCXU4IHNjYW5fdHhfYW50ZW5uYXMgPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlpZiAoIWlsLT5zY2FuX2NtZCkgeworCQlpbC0+c2Nhbl9jbWQgPQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGlsX3NjYW5fY21kKSArIElMX01BWF9TQ0FOX1NJWkUsCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaWwtPnNjYW5fY21kKSB7CisJCQlEX1NDQU4oImZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzY2FuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXNjYW4gPSBpbC0+c2Nhbl9jbWQ7CisJbWVtc2V0KHNjYW4sIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2Nhbl9jbWQpICsgSUxfTUFYX1NDQU5fU0laRSk7CisKKwlzY2FuLT5xdWlldF9wbGNwX3RoID0gSUxfUExDUF9RVUlFVF9USFJFU0g7CisJc2Nhbi0+cXVpZXRfdGltZSA9IElMX0FDVElWRV9RVUlFVF9USU1FOworCisJaWYgKGlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQl1MTYgaW50ZXJ2YWw7CisJCXUzMiBleHRyYTsKKwkJdTMyIHN1c3BlbmRfdGltZSA9IDEwMDsKKwkJdTMyIHNjYW5fc3VzcGVuZF90aW1lID0gMTAwOworCisJCURfSU5GTygiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7CisJCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OworCisJCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7CisJCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOworCQlpZiAoIWludGVydmFsKQorCQkJaW50ZXJ2YWwgPSBzdXNwZW5kX3RpbWU7CisKKwkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDIyOworCQlzY2FuX3N1c3BlbmRfdGltZSA9CisJCSAgICAoZXh0cmEgfCAoKHN1c3BlbmRfdGltZSAlIGludGVydmFsKSAqIDEwMjQpKTsKKwkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOworCQlEX1NDQU4oInN1c3BlbmRfdGltZSAweCVYIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKKwkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7CisJfQorCisJaWYgKGlsLT5zY2FuX3JlcXVlc3QtPm5fc3NpZHMpIHsKKwkJaW50IGksIHAgPSAwOworCQlEX1NDQU4oIktpY2tpbmcgb2ZmIGFjdGl2ZSBzY2FuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IGlsLT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgeworCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCisJCQlpZiAoIWlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKQorCQkJCWNvbnRpbnVlOworCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uaWQgPSBXTEFOX0VJRF9TU0lEOworCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0ubGVuID0KKwkJCSAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbjsKKwkJCW1lbWNweShzY2FuLT5kaXJlY3Rfc2NhbltwXS5zc2lkLAorCQkJICAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCisJCQkgICAgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOworCQkJbl9wcm9iZXMrKzsKKwkJCXArKzsKKwkJfQorCQlpc19hY3RpdmUgPSB0cnVlOworCX0gZWxzZQorCQlEX1NDQU4oIlN0YXJ0IHBhc3NpdmUgc2Nhbi5cbiIpOworCisJc2Nhbi0+dHhfY21kLnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwlzY2FuLT50eF9jbWQuc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7CisJc2Nhbi0+dHhfY21kLnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOworCisJc3dpdGNoIChpbC0+c2Nhbl9iYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKKwkJY2hhbl9tb2QgPQorCQkgICAgbGUzMl90b19jcHUoaWwtPmN0eC5hY3RpdmUuCisJCQkJZmxhZ3MgJiBSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKSA+PgorCQkgICAgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUzsKKwkJaWYgKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwKSB7CisJCQlyYXRlID0gUkFURV82TV9QTENQOworCQl9IGVsc2UgeworCQkJcmF0ZSA9IFJBVEVfMU1fUExDUDsKKwkJCXJhdGVfZmxhZ3MgPSBSQVRFX01DU19DQ0tfTVNLOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJcmF0ZSA9IFJBVEVfNk1fUExDUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfV0FSTigiSW52YWxpZCBzY2FuIGJhbmRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIElmIGFjdGl2ZSBzY2FubmluZyBpcyByZXF1ZXN0ZWQgYnV0IGEgY2VydGFpbiBjaGFubmVsIGlzCisJICogbWFya2VkIHBhc3NpdmUsIHdlIGNhbiBkbyBhY3RpdmUgc2Nhbm5pbmcgaWYgd2UgZGV0ZWN0CisJICogdHJhbnNtaXNzaW9ucy4KKwkgKgorCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggc29tZSBmaXJtd2FyZSB2ZXJzaW9ucyB0aGF0IHRyaWdnZXJzCisJICogYSBzeXNhc3NlcnQgb24gYSAiZ29vZCBDUkMgdGhyZXNob2xkIiBvZiB6ZXJvICg9PSBkaXNhYmxlZCksCisJICogb24gYSByYWRhciBjaGFubmVsIGV2ZW4gdGhvdWdoIHRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgTk9UCisJICogc2VuZCBwcm9iZXMuCisJICoKKwkgKiBUaGUgImdvb2QgQ1JDIHRocmVzaG9sZCIgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZQorCSAqIG5lZWQgdG8gcmVjZWl2ZSBkdXJpbmcgb3VyIGR3ZWxsIHRpbWUgb24gYSBjaGFubmVsIGJlZm9yZQorCSAqIHNlbmRpbmcgb3V0IHByb2JlcyAtLSBzZXR0aW5nIHRoaXMgdG8gYSBodWdlIHZhbHVlIHdpbGwKKwkgKiBtZWFuIHdlIG5ldmVyIHJlYWNoIGl0LCBidXQgYXQgdGhlIHNhbWUgdGltZSB3b3JrIGFyb3VuZAorCSAqIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZS4gVGh1cyB1c2UgSUxfR09PRF9DUkNfVEhfTkVWRVIKKwkgKiBoZXJlIGluc3RlYWQgb2YgSUxfR09PRF9DUkNfVEhfRElTQUJMRUQuCisJICovCisJc2Nhbi0+Z29vZF9DUkNfdGggPQorCSAgICBpc19hY3RpdmUgPyBJTF9HT09EX0NSQ19USF9ERUZBVUxUIDogSUxfR09PRF9DUkNfVEhfTkVWRVI7CisKKwliYW5kID0gaWwtPnNjYW5fYmFuZDsKKworCWlmIChpbC0+Y2ZnLT5zY2FuX3J4X2FudGVubmFzW2JhbmRdKQorCQlyeF9hbnQgPSBpbC0+Y2ZnLT5zY2FuX3J4X2FudGVubmFzW2JhbmRdOworCisJaWwtPnNjYW5fdHhfYW50W2JhbmRdID0KKwkgICAgaWw0OTY1X3RvZ2dsZV90eF9hbnQoaWwsIGlsLT5zY2FuX3R4X2FudFtiYW5kXSwgc2Nhbl90eF9hbnRlbm5hcyk7CisJcmF0ZV9mbGFncyB8PSBpbDQ5NjVfYW50X2lkeF90b19mbGFncyhpbC0+c2Nhbl90eF9hbnRbYmFuZF0pOworCXNjYW4tPnR4X2NtZC5yYXRlX25fZmxhZ3MgPQorCSAgICBpbDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKKworCS8qIEluIHBvd2VyIHNhdmUgbW9kZSB1c2Ugb25lIGNoYWluLCBvdGhlcndpc2UgdXNlIGFsbCBjaGFpbnMgKi8KKwlpZiAodGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKSkgeworCQkvKiByeF9hbnQgaGFzIGJlZW4gc2V0IHRvIGFsbCB2YWxpZCBjaGFpbnMgcHJldmlvdXNseSAqLworCQlhY3RpdmVfY2hhaW5zID0KKwkJICAgIHJ4X2FudCAmICgodTgpIChpbC0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKSk7CisJCWlmICghYWN0aXZlX2NoYWlucykKKwkJCWFjdGl2ZV9jaGFpbnMgPSByeF9hbnQ7CisKKwkJRF9TQ0FOKCJjaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnM6ICV1XG4iLAorCQkgICAgICAgaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyk7CisKKwkJcnhfYW50ID0gaWw0OTY1X2ZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7CisJfQorCisJLyogTUlNTyBpcyBub3QgdXNlZCBoZXJlLCBidXQgdmFsdWUgaXMgcmVxdWlyZWQgKi8KKwlyeF9jaGFpbiB8PSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCA8PCBSWE9OX1JYX0NIQUlOX1ZBTElEX1BPUzsKKwlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9NSU1PX1NFTF9QT1M7CisJcnhfY2hhaW4gfD0gcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fRk9SQ0VfU0VMX1BPUzsKKwlyeF9jaGFpbiB8PSAweDEgPDwgUlhPTl9SWF9DSEFJTl9EUklWRVJfRk9SQ0VfUE9TOworCXNjYW4tPnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOworCisJY21kX2xlbiA9CisJICAgIGlsX2ZpbGxfcHJvYmVfcmVxKGlsLCAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKKwkJCSAgICAgIHZpZi0+YWRkciwgaWwtPnNjYW5fcmVxdWVzdC0+aWUsCisJCQkgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5pZV9sZW4sCisJCQkgICAgICBJTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7CisJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGNtZF9sZW4pOworCisJc2Nhbi0+ZmlsdGVyX2ZsYWdzIHw9CisJICAgIChSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSyB8IFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworCXNjYW4tPmNoYW5uZWxfY291bnQgPQorCSAgICBpbDQ5NjVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKGlsLCB2aWYsIGJhbmQsIGlzX2FjdGl2ZSwgbl9wcm9iZXMsCisJCQkJCSAodm9pZCAqKSZzY2FuLT5kYXRhW2NtZF9sZW5dKTsKKwlpZiAoc2Nhbi0+Y2hhbm5lbF9jb3VudCA9PSAwKSB7CisJCURfU0NBTigiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNtZC5sZW4gKz0KKwkgICAgbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKworCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpbF9zY2FuX2NoYW5uZWwpOworCWNtZC5kYXRhID0gc2NhbjsKKwlzY2FuLT5sZW4gPSBjcHVfdG9fbGUxNihjbWQubGVuKTsKKworCXNldF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlyZXQgPSBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKKwlpZiAocmV0KQorCQljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgIGJvb2wgYWRkKQoreworCXN0cnVjdCBpbF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisKKwlpZiAoYWRkKQorCQlyZXR1cm4gaWw0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKGlsLCB2aWZfcHJpdi0+Y3R4LAorCQkJCQkJdmlmLT5ic3NfY29uZi5ic3NpZCwKKwkJCQkJCSZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCXJldHVybiBpbF9yZW1vdmVfc3RhdGlvbihpbCwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAorCQkJCSB2aWYtPmJzc19jb25mLmJzc2lkKTsKK30KKwordm9pZAoraWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQsIGludCBmcmVlZCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+c3RhX2xvY2spOworCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgLT0gZnJlZWQ7CisJZWxzZSB7CisJCURfVFgoImZyZWUgbW9yZSB0aGFuIHRmZHNfaW5fcXVldWUgKCV1OiVkKVxuIiwKKwkJICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlLCBmcmVlZCk7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPSAwOworCX0KK30KKworI2RlZmluZSBJTF9UWF9RVUVVRV9NU0sJMHhmZmZmZgorCitzdGF0aWMgYm9vbAoraWw0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9PSBJRUVFODAyMTFfU01QU19TVEFUSUMgfHwKKwkgICAgaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OworfQorCisjZGVmaW5lIElMX05VTV9SWF9DSEFJTlNfTVVMVElQTEUJMworI2RlZmluZSBJTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRQkyCisjZGVmaW5lIElMX05VTV9JRExFX0NIQUlOU19EVUFMCTIKKyNkZWZpbmUgSUxfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRQkxCisKKy8qCisgKiBEZXRlcm1pbmUgaG93IG1hbnkgcmVjZWl2ZXIvYW50ZW5uYSBjaGFpbnMgdG8gdXNlLgorICoKKyAqIE1vcmUgcHJvdmlkZXMgYmV0dGVyIHJlY2VwdGlvbiB2aWEgZGl2ZXJzaXR5LiAgRmV3ZXIgc2F2ZXMgcG93ZXIKKyAqIGF0IHRoZSBleHBlbnNlIG9mIHRocm91Z2hwdXQsIGJ1dCBvbmx5IHdoZW4gbm90IGluIHBvd2Vyc2F2ZSB0bworICogc3RhcnQgd2l0aC4KKyAqCisgKiBNSU1PIChkdWFsIHN0cmVhbSkgcmVxdWlyZXMgYXQgbGVhc3QgMiwgYnV0IHdvcmtzIGJldHRlciB3aXRoIDMuCisgKiBUaGlzIGRvZXMgbm90IGRldGVybWluZSAqd2hpY2gqIGNoYWlucyB0byB1c2UsIGp1c3QgaG93IG1hbnkuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9nZXRfYWN0aXZlX3J4X2NoYWluX2NvdW50KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiAjIG9mIFJ4IGNoYWlucyB0byB1c2Ugd2hlbiBleHBlY3RpbmcgTUlNTy4gKi8KKwlpZiAoaWw0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oaWwpKQorCQlyZXR1cm4gSUxfTlVNX1JYX0NIQUlOU19TSU5HTEU7CisJZWxzZQorCQlyZXR1cm4gSUxfTlVNX1JYX0NIQUlOU19NVUxUSVBMRTsKK30KKworLyoKKyAqIFdoZW4gd2UgYXJlIGluIHBvd2VyIHNhdmluZyBtb2RlLCB1bmxlc3MgZGV2aWNlIHN1cHBvcnQgc3BhdGlhbAorICogbXVsdGlwbGV4aW5nIHBvd2VyIHNhdmUsIHVzZSB0aGUgYWN0aXZlIGNvdW50IGZvciByeCBjaGFpbiBjb3VudC4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2dldF9pZGxlX3J4X2NoYWluX2NvdW50KHN0cnVjdCBpbF9wcml2ICppbCwgaW50IGFjdGl2ZV9jbnQpCit7CisJLyogIyBSeCBjaGFpbnMgd2hlbiBpZGxpbmcsIGRlcGVuZGluZyBvbiBTTVBTIG1vZGUgKi8KKwlzd2l0Y2ggKGlsLT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzKSB7CisJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6CisJY2FzZSBJRUVFODAyMTFfU01QU19EWU5BTUlDOgorCQlyZXR1cm4gSUxfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRTsKKwljYXNlIElFRUU4MDIxMV9TTVBTX09GRjoKKwkJcmV0dXJuIGFjdGl2ZV9jbnQ7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiaW52YWxpZCBTTVBTIG1vZGUgJWQiLCBpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyk7CisJCXJldHVybiBhY3RpdmVfY250OworCX0KK30KKworLyogdXAgdG8gNCBjaGFpbnMgKi8KK3N0YXRpYyB1OAoraWw0OTY1X2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQoreworCXU4IHJlczsKKwlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDMpKSA+PiAzOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogaWw0OTY1X3NldF9yeG9uX2NoYWluIC0gU2V0IHVwIFJ4IGNoYWluIHVzYWdlIGluICJzdGFnaW5nIiBSWE9OIGltYWdlCisgKgorICogU2VsZWN0cyBob3cgbWFueSBhbmQgd2hpY2ggUnggcmVjZWl2ZXJzL2FudGVubmFzL2NoYWlucyB0byB1c2UuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igc2NhbiBjb21tYW5kIC4uLiBpdCBwdXRzIGRhdGEgaW4gd3JvbmcgcGxhY2UuCisgKi8KK3ZvaWQKK2lsNDk2NV9zZXRfcnhvbl9jaGFpbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlib29sIGlzX3NpbmdsZSA9IGlsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKGlsKTsKKwlib29sIGlzX2NhbSA9ICF0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpOworCXU4IGlkbGVfcnhfY250LCBhY3RpdmVfcnhfY250LCB2YWxpZF9yeF9jbnQ7CisJdTMyIGFjdGl2ZV9jaGFpbnM7CisJdTE2IHJ4X2NoYWluOworCisJLyogVGVsbCB1Q29kZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLgorCSAqIEJlZm9yZSBmaXJzdCBhc3NvY2lhdGlvbiwgd2UgYXNzdW1lIGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgorCSAqIEp1c3QgYWZ0ZXIgZmlyc3QgYXNzb2NpYXRpb24sIGlsNDk2NV9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbigpCisJICogICAgY2hlY2tzIHdoaWNoIGFudGVubmFzIGFjdHVhbGx5ICphcmUqIGNvbm5lY3RlZC4gKi8KKwlpZiAoaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKKwkJYWN0aXZlX2NoYWlucyA9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnM7CisJZWxzZQorCQlhY3RpdmVfY2hhaW5zID0gaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7CisKKwlyeF9jaGFpbiA9IGFjdGl2ZV9jaGFpbnMgPDwgUlhPTl9SWF9DSEFJTl9WQUxJRF9QT1M7CisKKwkvKiBIb3cgbWFueSByZWNlaXZlcnMgc2hvdWxkIHdlIHVzZT8gKi8KKwlhY3RpdmVfcnhfY250ID0gaWw0OTY1X2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoaWwpOworCWlkbGVfcnhfY250ID0gaWw0OTY1X2dldF9pZGxlX3J4X2NoYWluX2NvdW50KGlsLCBhY3RpdmVfcnhfY250KTsKKworCS8qIGNvcnJlY3QgcnggY2hhaW4gY291bnQgYWNjb3JkaW5nIGh3IHNldHRpbmdzCisJICogYW5kIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uCisJICovCisJdmFsaWRfcnhfY250ID0gaWw0OTY1X2NvdW50X2NoYWluX2JpdG1hcChhY3RpdmVfY2hhaW5zKTsKKwlpZiAodmFsaWRfcnhfY250IDwgYWN0aXZlX3J4X2NudCkKKwkJYWN0aXZlX3J4X2NudCA9IHZhbGlkX3J4X2NudDsKKworCWlmICh2YWxpZF9yeF9jbnQgPCBpZGxlX3J4X2NudCkKKwkJaWRsZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7CisKKwlyeF9jaGFpbiB8PSBhY3RpdmVfcnhfY250IDw8IFJYT05fUlhfQ0hBSU5fTUlNT19DTlRfUE9TOworCXJ4X2NoYWluIHw9IGlkbGVfcnhfY250IDw8IFJYT05fUlhfQ0hBSU5fQ05UX1BPUzsKKworCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiA9IGNwdV90b19sZTE2KHJ4X2NoYWluKTsKKworCWlmICghaXNfc2luZ2xlICYmIGFjdGl2ZV9yeF9jbnQgPj0gSUxfTlVNX1JYX0NIQUlOU19TSU5HTEUgJiYgaXNfY2FtKQorCQljdHgtPnN0YWdpbmcucnhfY2hhaW4gfD0gUlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiAmPSB+UlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKKworCURfQVNTT0MoInJ4X2NoYWluPTB4JVggYWN0aXZlPSVkIGlkbGU9JWRcbiIsIGN0eC0+c3RhZ2luZy5yeF9jaGFpbiwKKwkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOworCisJV0FSTl9PTihhY3RpdmVfcnhfY250ID09IDAgfHwgaWRsZV9yeF9jbnQgPT0gMCB8fAorCQlhY3RpdmVfcnhfY250IDwgaWRsZV9yeF9jbnQpOworfQorCit1OAoraWw0OTY1X3RvZ2dsZV90eF9hbnQoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBhbnQsIHU4IHZhbGlkKQoreworCWludCBpOworCXU4IGluZCA9IGFudDsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0FOVF9OVU0gLSAxOyBpKyspIHsKKwkJaW5kID0gKGluZCArIDEpIDwgUkFURV9BTlRfTlVNID8gaW5kICsgMSA6IDA7CisJCWlmICh2YWxpZCAmIEJJVChpbmQpKQorCQkJcmV0dXJuIGluZDsKKwl9CisJcmV0dXJuIGFudDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraWw0OTY1X2dldF9maF9zdHJpbmcoaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCQlJTF9DTUQoRkg0OV9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHKTsKKwkJSUxfQ01EKEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcpOworCQlJTF9DTUQoRkg0OV9SU0NTUl9DSE5MMF9XUFRSKTsKKwkJSUxfQ01EKEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyk7CisJCUlMX0NNRChGSDQ5X01FTV9SU1NSX1NIQVJFRF9DVFJMX1JFRyk7CisJCUlMX0NNRChGSDQ5X01FTV9SU1NSX1JYX1NUQVRVU19SRUcpOworCQlJTF9DTUQoRkg0OV9NRU1fUlNTUl9SWF9FTkFCTEVfRVJSX0lSUTJEUlYpOworCQlJTF9DTUQoRkg0OV9UU1NSX1RYX1NUQVRVU19SRUcpOworCQlJTF9DTUQoRkg0OV9UU1NSX1RYX0VSUk9SX1JFRyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwl9Cit9CisKK2ludAoraWw0OTY1X2R1bXBfZmgoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCit7CisJaW50IGk7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaW50IHBvcyA9IDA7CisJc2l6ZV90IGJ1ZnN6ID0gMDsKKyNlbmRpZgorCXN0YXRpYyBjb25zdCB1MzIgZmhfdGJsW10gPSB7CisJCUZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKKwkJRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRywKKwkJRkg0OV9SU0NTUl9DSE5MMF9XUFRSLAorCQlGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCisJCUZINDlfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHLAorCQlGSDQ5X01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCisJCUZINDlfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWLAorCQlGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRywKKwkJRkg0OV9UU1NSX1RYX0VSUk9SX1JFRworCX07CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGRpc3BsYXkpIHsKKwkJYnVmc3ogPSBBUlJBWV9TSVpFKGZoX3RibCkgKiA0OCArIDQwOworCQkqYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKmJ1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkZIIHJlZ2lzdGVyIHZhbHVlczpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaF90YmwpOyBpKyspIHsKKwkJCXBvcyArPQorCQkJICAgIHNjbnByaW50ZigqYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkgICAgICAiICAlMzRzOiAwWCUwOHhcbiIsCisJCQkJICAgICAgaWw0OTY1X2dldF9maF9zdHJpbmcoZmhfdGJsW2ldKSwKKwkJCQkgICAgICBpbF9yZChpbCwgZmhfdGJsW2ldKSk7CisJCX0KKwkJcmV0dXJuIHBvczsKKwl9CisjZW5kaWYKKwlJTF9FUlIoIkZIIHJlZ2lzdGVyIHZhbHVlczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZoX3RibCk7IGkrKykgeworCQlJTF9FUlIoIiAgJTM0czogMFglMDh4XG4iLCBpbDQ5NjVfZ2V0X2ZoX3N0cmluZyhmaF90YmxbaV0pLAorCQkgICAgICAgaWxfcmQoaWwsIGZoX3RibFtpXSkpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAoraWw0OTY1X2hkbF9taXNzZWRfYmVhY29uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX21pc3NlZF9iZWFjb25fbm90aWYgKm1pc3NlZF9iZWFjb247CisKKwltaXNzZWRfYmVhY29uID0gJnBrdC0+dS5taXNzZWRfYmVhY29uOworCWlmIChsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucykgPgorCSAgICBpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQpIHsKKwkJRF9DQUxJQigibWlzc2VkIGJjbiBjbnNxICVkIHRvdGwgJWQgcmNkICVkIGV4cGN0ZCAlZFxuIiwKKwkJCWxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPmNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zKSwKKwkJCWxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPnRvdGFsX21pc3NlZF9iZWNvbnMpLAorCQkJbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+bnVtX3JlY3ZkX2JlYWNvbnMpLAorCQkJbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+bnVtX2V4cGVjdGVkX2JlYWNvbnMpKTsKKwkJaWYgKCF0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpCisJCQlpbDQ5NjVfaW5pdF9zZW5zaXRpdml0eShpbCk7CisJfQorfQorCisvKiBDYWxjdWxhdGUgbm9pc2UgbGV2ZWwsIGJhc2VkIG9uIG1lYXN1cmVtZW50cyBkdXJpbmcgbmV0d29yayBzaWxlbmNlIGp1c3QKKyAqICAgYmVmb3JlIGFycml2aW5nIGJlYWNvbi4gIFRoaXMgbWVhc3VyZW1lbnQgY2FuIGJlIGRvbmUgb25seSBpZiB3ZSBrbm93CisgKiAgIGV4YWN0bHkgd2hlbiB0byBleHBlY3QgYmVhY29ucywgdGhlcmVmb3JlIG9ubHkgd2hlbiB3ZSdyZSBhc3NvY2lhdGVkLiAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yeF9jYWxjX25vaXNlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSAqcnhfaW5mbzsKKwlpbnQgbnVtX2FjdGl2ZV9yeCA9IDA7CisJaW50IHRvdGFsX3NpbGVuY2UgPSAwOworCWludCBiY25fc2lsZW5jZV9hLCBiY25fc2lsZW5jZV9iLCBiY25fc2lsZW5jZV9jOworCWludCBsYXN0X3J4X25vaXNlOworCisJcnhfaW5mbyA9ICYoaWwtPl80OTY1LnN0YXRzLnJ4LmdlbmVyYWwpOworCWJjbl9zaWxlbmNlX2EgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpICYgSU5fQkFORF9GSUxURVI7CisJYmNuX3NpbGVuY2VfYiA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYikgJiBJTl9CQU5EX0ZJTFRFUjsKKwliY25fc2lsZW5jZV9jID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOworCisJaWYgKGJjbl9zaWxlbmNlX2EpIHsKKwkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9hOworCQludW1fYWN0aXZlX3J4Kys7CisJfQorCWlmIChiY25fc2lsZW5jZV9iKSB7CisJCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYjsKKwkJbnVtX2FjdGl2ZV9yeCsrOworCX0KKwlpZiAoYmNuX3NpbGVuY2VfYykgeworCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2M7CisJCW51bV9hY3RpdmVfcngrKzsKKwl9CisKKwkvKiBBdmVyYWdlIGFtb25nIGFjdGl2ZSBhbnRlbm5hcyAqLworCWlmIChudW1fYWN0aXZlX3J4KQorCQlsYXN0X3J4X25vaXNlID0gKHRvdGFsX3NpbGVuY2UgLyBudW1fYWN0aXZlX3J4KSAtIDEwNzsKKwllbHNlCisJCWxhc3Rfcnhfbm9pc2UgPSBJTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEU7CisKKwlEX0NBTElCKCJpbmJhbmQgc2lsZW5jZSBhICV1LCBiICV1LCBjICV1LCBkQm0gJWRcbiIsIGJjbl9zaWxlbmNlX2EsCisJCWJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2MsIGxhc3Rfcnhfbm9pc2UpOworfQorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKy8qCisgKiAgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gb2YgYWxsIHN0YXRzIGNvdW50ZXIgYXJlIGluIERXT1JECisgKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aAorICogIHRoZSBjYXNlIG9mIGNvdW50ZXJzIHJvbGwtb3Zlci4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBfX2xlMzIgKiBzdGF0cykKK3sKKwlpbnQgaSwgc2l6ZTsKKwlfX2xlMzIgKnByZXZfc3RhdHM7CisJdTMyICphY2N1bV9zdGF0czsKKwl1MzIgKmRlbHRhLCAqbWF4X2RlbHRhOworCXN0cnVjdCBzdGF0c19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX3R4ICp0eCwgKmFjY3VtX3R4OworCisJcHJldl9zdGF0cyA9IChfX2xlMzIgKikgJmlsLT5fNDk2NS5zdGF0czsKKwlhY2N1bV9zdGF0cyA9ICh1MzIgKikgJmlsLT5fNDk2NS5hY2N1bV9zdGF0czsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpbF9ub3RpZl9zdGF0cyk7CisJZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb247CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb247CisJdHggPSAmaWwtPl80OTY1LnN0YXRzLnR4OworCWFjY3VtX3R4ID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy50eDsKKwlkZWx0YSA9ICh1MzIgKikgJmlsLT5fNDk2NS5kZWx0YV9zdGF0czsKKwltYXhfZGVsdGEgPSAodTMyICopICZpbC0+XzQ5NjUubWF4X2RlbHRhOworCisJZm9yIChpID0gc2l6ZW9mKF9fbGUzMik7IGkgPCBzaXplOworCSAgICAgaSArPQorCSAgICAgc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywgbWF4X2RlbHRhKyssCisJICAgICBhY2N1bV9zdGF0cysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7CisJCQkqZGVsdGEgPQorCQkJICAgIChsZTMyX3RvX2NwdSgqc3RhdHMpIC0gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKKwkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7CisJCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKKwkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOworCQl9CisJfQorCisJLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0cyAqLworCWFjY3VtX2dlbmVyYWwtPnRlbXBlcmF0dXJlID0gZ2VuZXJhbC0+dGVtcGVyYXR1cmU7CisJYWNjdW1fZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCA9IGdlbmVyYWwtPnR0bF90aW1lc3RhbXA7Cit9CisjZW5kaWYKKworI2RlZmluZSBSRUdfUkVDQUxJQl9QRVJJT0QgKDYwKQorCit2b2lkCitpbDQ5NjVfaGRsX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCWludCBjaGFuZ2U7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCURfUlgoIlN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIHJlY2VpdmVkICglZCB2cyAlZCkuXG4iLAorCSAgICAgKGludClzaXplb2Yoc3RydWN0IGlsX25vdGlmX3N0YXRzKSwKKwkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0spOworCisJY2hhbmdlID0KKwkgICAgKChpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KKwkgICAgICBwa3QtPnUuc3RhdHMuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpIHx8CisJICAgICAoKGlsLT5fNDk2NS5zdGF0cy5mbGFnICYgU1RBVFNfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spICE9CisJICAgICAgKHBrdC0+dS5zdGF0cy5mbGFnICYgU1RBVFNfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSk7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwlpbDQ5NjVfYWNjdW11bGF0aXZlX3N0YXRzKGlsLCAoX19sZTMyICopICZwa3QtPnUuc3RhdHMpOworI2VuZGlmCisKKwkvKiBUT0RPOiByZWFkaW5nIHNvbWUgb2Ygc3RhdHMgaXMgdW5uZWVkZWQgKi8KKwltZW1jcHkoJmlsLT5fNDk2NS5zdGF0cywgJnBrdC0+dS5zdGF0cywgc2l6ZW9mKGlsLT5fNDk2NS5zdGF0cykpOworCisJc2V0X2JpdChTX1NUQVRTLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBSZXNjaGVkdWxlIHRoZSBzdGF0cyB0aW1lciB0byBvY2N1ciBpbgorCSAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHRvIGVuc3VyZSB3ZSBnZXQgYQorCSAqIHRoZXJtYWwgdXBkYXRlIGV2ZW4gaWYgdGhlIHVDb2RlIGRvZXNuJ3QgZ2l2ZQorCSAqIHVzIG9uZSAqLworCW1vZF90aW1lcigmaWwtPnN0YXRzX3BlcmlvZGljLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFR19SRUNBTElCX1BFUklPRCAqIDEwMDApKTsKKworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSAmJgorCSAgICAocGt0LT5oZHIuY21kID09IE5fU1RBVFMpKSB7CisJCWlsNDk2NV9yeF9jYWxjX25vaXNlKGlsKTsKKwkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJ1bl90aW1lX2NhbGliX3dvcmspOworCX0KKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlICYmIGNoYW5nZSkKKwkJaWwtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlKGlsKTsKK30KKwordm9pZAoraWw0OTY1X2hkbF9jX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisKKwlpZiAobGUzMl90b19jcHUocGt0LT51LnN0YXRzLmZsYWcpICYgVUNPREVfU1RBVFNfQ0xFQVJfTVNLKSB7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJbWVtc2V0KCZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX25vdGlmX3N0YXRzKSk7CisJCW1lbXNldCgmaWwtPl80OTY1LmRlbHRhX3N0YXRzLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9ub3RpZl9zdGF0cykpOworCQltZW1zZXQoJmlsLT5fNDk2NS5tYXhfZGVsdGEsIDAsIHNpemVvZihzdHJ1Y3QgaWxfbm90aWZfc3RhdHMpKTsKKyNlbmRpZgorCQlEX1JYKCJTdGF0aXN0aWNzIGhhdmUgYmVlbiBjbGVhcmVkXG4iKTsKKwl9CisJaWw0OTY1X2hkbF9zdGF0cyhpbCwgcnhiKTsKK30KKworCisvKgorICogbWFjODAyMTEgcXVldWVzLCBBQ3MsIGhhcmR3YXJlIHF1ZXVlcywgRklGT3MuCisgKgorICogQ2YuIGh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvRG9jdW1lbnRhdGlvbi9tYWM4MDIxMS9xdWV1ZXMKKyAqCisgKiBNYWM4MDIxMSB1c2VzIHRoZSBmb2xsb3dpbmcgbnVtYmVycywgd2hpY2ggd2UgZ2V0IGFzIGZyb20gaXQKKyAqIGJ5IHdheSBvZiBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKToKKyAqCisgKiAgICAgVk8gICAgICAwCisgKiAgICAgVkkgICAgICAxCisgKiAgICAgQkUgICAgICAyCisgKiAgICAgQksgICAgICAzCisgKgorICoKKyAqIFJlZ3VsYXIgKG5vdCBBLU1QRFUpIGZyYW1lcyBhcmUgcHV0IGludG8gaGFyZHdhcmUgcXVldWVzIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBGSUZPcywgc2VlIGNvbW1lbnRzIGluIGl3bC1wcnBoLmguIEFnZ3JlZ2F0ZWQgZnJhbWVzIGdldCB0aGVpcgorICogb3duIHF1ZXVlIHBlciBhZ2dyZWdhdGlvbiBzZXNzaW9uIChSQS9USUQgY29tYmluYXRpb24pLCBzdWNoIHF1ZXVlcyBhcmUKKyAqIHNldCB1cCB0byBtYXAgaW50byBGSUZPcyB0b28sIGZvciB3aGljaCB3ZSBuZWVkIGFuIEFDLT5GSUZPIG1hcHBpbmcuIEluCisgKiBvcmRlciB0byBtYXAgZnJhbWVzIHRvIHRoZSByaWdodCBxdWV1ZSwgd2UgYWxzbyBuZWVkIGFuIEFDLT5odyBxdWV1ZQorICogbWFwcGluZy4gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlLgorICoKKyAqIER1ZSB0byB0aGUgd2F5IGh3IHF1ZXVlcyBhcmUgc2V0IHVwIChieSB0aGUgaHcgc3BlY2lmaWMgbW9kdWxlcyBsaWtlCisgKiA0OTY1LmMpLCB0aGUgQUMtPmh3IHF1ZXVlIG1hcHBpbmcgaXMgdGhlIGlkZW50aXR5CisgKiBtYXBwaW5nLgorICovCisKK3N0YXRpYyBjb25zdCB1OCB0aWRfdG9fYWNbXSA9IHsKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX0JLLAorCUlFRUU4MDIxMV9BQ19CSywKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX1ZJLAorCUlFRUU4MDIxMV9BQ19WSSwKKwlJRUVFODAyMTFfQUNfVk8sCisJSUVFRTgwMjExX0FDX1ZPCit9OworCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2dldF9hY19mcm9tX3RpZCh1MTYgdGlkKQoreworCWlmIChsaWtlbHkodGlkIDwgQVJSQVlfU0laRSh0aWRfdG9fYWMpKSkKKwkJcmV0dXJuIHRpZF90b19hY1t0aWRdOworCisJLyogbm8gc3VwcG9ydCBmb3IgVElEcyA4LTE1IHlldCAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwgdTE2IHRpZCkKK3sKKwlpZiAobGlrZWx5KHRpZCA8IEFSUkFZX1NJWkUodGlkX3RvX2FjKSkpCisJCXJldHVybiBjdHgtPmFjX3RvX2ZpZm9bdGlkX3RvX2FjW3RpZF1dOworCisJLyogbm8gc3VwcG9ydCBmb3IgVElEcyA4LTE1IHlldCAqLworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogaGFuZGxlIGJ1aWxkIENfVFggY29tbWFuZCBub3RpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfdHhfY21kX2J1aWxkX2Jhc2ljKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHU4IHN0ZF9pZCkKK3sKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisJX19sZTMyIHR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKKworCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOworCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgorCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCisJCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfYmFja19yZXEoZmMpKQorCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0sgfCBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSzsKKworCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOworCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOworCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9IGVsc2UgeworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCWlsX3R4X2NtZF9wcm90ZWN0aW9uKGlsLCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKKworCXR4X2ZsYWdzICY9IH4oVFhfQ01EX0ZMR19BTlRfU0VMX01TSyk7CisJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgeworCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykgfHwgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMyk7CisJCWVsc2UKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMik7CisJfSBlbHNlIHsKKwkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSAwOworCX0KKworCXR4X2NtZC0+ZHJpdmVyX3R4b3AgPSAwOworCXR4X2NtZC0+dHhfZmxhZ3MgPSB0eF9mbGFnczsKKwl0eF9jbWQtPm5leHRfZnJhbWVfbGVuID0gMDsKK30KKworI2RlZmluZSBSVFNfREZBVUxUX1JFVFJZX0xJTUlUCQk2MAorCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X2NtZF9idWlsZF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywgX19sZTE2IGZjKQoreworCXUzMiByYXRlX2ZsYWdzOworCWludCByYXRlX2lkeDsKKwl1OCBydHNfcmV0cnlfbGltaXQ7CisJdTggZGF0YV9yZXRyeV9saW1pdDsKKwl1OCByYXRlX3BsY3A7CisKKwkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMgKi8KKwlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKQorCQlkYXRhX3JldHJ5X2xpbWl0ID0gMzsKKwllbHNlCisJCWRhdGFfcmV0cnlfbGltaXQgPSBJTDQ5NjVfREVGQVVMVF9UWF9SRVRSWTsKKwl0eF9jbWQtPmRhdGFfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OworCisJLyogU2V0IHJldHJ5IGxpbWl0IG9uIFJUUyBwYWNrZXRzICovCisJcnRzX3JldHJ5X2xpbWl0ID0gUlRTX0RGQVVMVF9SRVRSWV9MSU1JVDsKKwlpZiAoZGF0YV9yZXRyeV9saW1pdCA8IHJ0c19yZXRyeV9saW1pdCkKKwkJcnRzX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKKwl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IHJ0c19yZXRyeV9saW1pdDsKKworCS8qIERBVEEgcGFja2V0cyB3aWxsIHVzZSB0aGUgdUNvZGUgc3RhdGlvbiB0YWJsZSBmb3IgcmF0ZS9hbnRlbm5hCisJICogc2VsZWN0aW9uICovCisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQl0eF9jbWQtPmluaXRpYWxfcmF0ZV9pZHggPSAwOworCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogSWYgdGhlIGN1cnJlbnQgVFggcmF0ZSBzdG9yZWQgaW4gbWFjODAyMTEgaGFzIHRoZSBNQ1MgYml0IHNldCwgaXQncworCSAqIG5vdCByZWFsbHkgYSBUWCByYXRlLiAgVGh1cywgd2UgdXNlIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIHJhdGUgZm9yCisJICogdGhpcyBiYW5kLiAgQWxzbyB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgcmF0ZSBpZiB0aGUgc3RvcmVkIHJhdGUKKwkgKiBpZHggaXMgaW52YWxpZC4KKwkgKi8KKwlyYXRlX2lkeCA9IGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4OworCWlmICgoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHx8IHJhdGVfaWR4IDwgMAorCSAgICB8fCByYXRlX2lkeCA+IFJBVEVfQ09VTlRfTEVHQUNZKQorCQlyYXRlX2lkeCA9CisJCSAgICByYXRlX2xvd2VzdF9pbmRleCgmaWwtPmJhbmRzW2luZm8tPmJhbmRdLAorCQkJCSAgICAgIGluZm8tPmNvbnRyb2wuc3RhKTsKKwkvKiBGb3IgNSBHSFogYmFuZCwgcmVtYXAgbWFjODAyMTEgcmF0ZSBpbmRpY2VzIGludG8gZHJpdmVyIGluZGljZXMgKi8KKwlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJLyogR2V0IFBMQ1AgcmF0ZSBmb3IgdHhfY21kLT5yYXRlX25fZmxhZ3MgKi8KKwlyYXRlX3BsY3AgPSBpbF9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKKwkvKiBaZXJvIG91dCBmbGFncyBmb3IgdGhpcyBwYWNrZXQgKi8KKwlyYXRlX2ZsYWdzID0gMDsKKworCS8qIFNldCBDQ0sgZmxhZyBhcyBuZWVkZWQgKi8KKwlpZiAocmF0ZV9pZHggPj0gSUxfRklSU1RfQ0NLX1JBVEUgJiYgcmF0ZV9pZHggPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJLyogU2V0IHVwIGFudGVubmFzICovCisJaWwtPm1nbXRfdHhfYW50ID0KKwkgICAgaWw0OTY1X3RvZ2dsZV90eF9hbnQoaWwsIGlsLT5tZ210X3R4X2FudCwKKwkJCQkgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCisJcmF0ZV9mbGFncyB8PSBpbDQ5NjVfYW50X2lkeF90b19mbGFncyhpbC0+bWdtdF90eF9hbnQpOworCisJLyogU2V0IHRoZSByYXRlIGluIHRoZSBUWCBjbWQgKi8KKwl0eF9jbWQtPnJhdGVfbl9mbGFncyA9CisJICAgIGlsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHJhdGVfcGxjcCwgcmF0ZV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfdHhfY21kX2J1aWxkX2h3Y3J5cHRvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICAgICBzdHJ1Y3QgaWxfdHhfY21kICp0eF9jbWQsIHN0cnVjdCBza19idWZmICpza2JfZnJhZywKKwkJCSAgICAgaW50IHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mID0gaW5mby0+Y29udHJvbC5od19rZXk7CisKKwlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJdHhfY21kLT5zZWNfY3RsID0gVFhfQ01EX1NFQ19DQ007CisJCW1lbWNweSh0eF9jbWQtPmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQorCQkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX0FHR19DQ01QX01TSzsKKwkJRF9UWCgidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfVEtJUDsKKwkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOworCQlEX1RYKCJ0eF9jbWQgd2l0aCB0a2lwIGh3Y3J5cHRvXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfS0VZMTI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQl0eF9jbWQtPnNlY19jdGwgfD0KKwkJICAgIChUWF9DTURfU0VDX1dFUCB8IChrZXljb25mLT5rZXlpZHggJiBUWF9DTURfU0VDX01TSykgPDwKKwkJICAgICBUWF9DTURfU0VDX1NISUZUKTsKKworCQltZW1jcHkoJnR4X2NtZC0+a2V5WzNdLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisKKwkJRF9UWCgiQ29uZmlndXJpbmcgcGFja2V0IGZvciBXRVAgZW5jcnlwdGlvbiAiICJ3aXRoIGtleSAlZFxuIiwKKwkJICAgICBrZXljb25mLT5rZXlpZHgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBlbmNvZGUgY2lwaGVyICV4XG4iLCBrZXljb25mLT5jaXBoZXIpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBzdGFydCBDX1RYIGNvbW1hbmQgcHJvY2VzcworICovCitpbnQKK2lsNDk2NV90eF9za2Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBpbmZvLT5jb250cm9sLnN0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHE7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpvdXRfY21kOworCXN0cnVjdCBpbF9jbWRfbWV0YSAqb3V0X21ldGE7CisJc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCB0eHFfaWQ7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJZG1hX2FkZHJfdCB0eGNtZF9waHlzOworCWRtYV9hZGRyX3Qgc2NyYXRjaF9waHlzOworCXUxNiBsZW4sIGZpcnN0bGVuLCBzZWNvbmRsZW47CisJdTE2IHNlcV9udW1iZXIgPSAwOworCV9fbGUxNiBmYzsKKwl1OCBoZHJfbGVuOworCXU4IHN0YV9pZDsKKwl1OCB3YWl0X3dyaXRlX3B0ciA9IDA7CisJdTggdGlkID0gMDsKKwl1OCAqcWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBpc19hZ2cgPSBmYWxzZTsKKworCWlmIChpbmZvLT5jb250cm9sLnZpZikKKwkJY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYoaW5mby0+Y29udHJvbC52aWYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJRF9EUk9QKCJEcm9wcGluZyAtIFJGIEtJTExcbiIpOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGllZWU4MDIxMV9pc19hdXRoKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBVVRIIGZyYW1lXG4iKTsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7CisJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBSRUFTU09DIGZyYW1lXG4iKTsKKyNlbmRpZgorCisJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOworCisJLyogRm9yIG1hbmFnZW1lbnQgZnJhbWVzIHVzZSBicm9hZGNhc3QgaWQgdG8gZG8gbm90IGJyZWFrIGFnZ3JlZ2F0aW9uICovCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShmYykpCisJCXN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCWVsc2UgeworCQkvKiBGaW5kIGlkeCBpbnRvIHN0YXRpb24gdGFibGUgZm9yIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KKwkJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgY3R4LCBpbmZvLT5jb250cm9sLnN0YSk7CisKKwkJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJCURfRFJPUCgiRHJvcHBpbmcgLSBJTlZBTElEIFNUQVRJT046ICVwTVxuIiwgaGRyLT5hZGRyMSk7CisJCQlnb3RvIGRyb3BfdW5sb2NrOworCQl9CisJfQorCisJRF9UWCgic3RhdGlvbiBJZCAlZFxuIiwgc3RhX2lkKTsKKworCWlmIChzdGEpCisJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCisJaWYgKHN0YV9wcml2ICYmIHN0YV9wcml2LT5hc2xlZXAgJiYKKwkgICAgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9QT0xMX1JFU1BPTlNFKSkgeworCQkvKgorCQkgKiBUaGlzIHNlbmRzIGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIHRvIHRoZSBkZXZpY2UsCisJCSAqIGJ1dCB3ZSBjYW4gcmVseSBvbiBpdCBiZWluZyBwcm9jZXNzZWQgYmVmb3JlIHRoZQorCQkgKiBuZXh0IGZyYW1lIGlzIHByb2Nlc3NlZCAtLSBhbmQgdGhlIG5leHQgZnJhbWUgdG8KKwkJICogdGhpcyBzdGF0aW9uIGlzIHRoZSBvbmUgdGhhdCB3aWxsIGNvbnN1bWUgdGhpcworCQkgKiBjb3VudGVyLgorCQkgKiBGb3Igbm93IHNldCB0aGUgY291bnRlciB0byBqdXN0IDEgc2luY2Ugd2UgZG8gbm90CisJCSAqIHN1cHBvcnQgdUFQU0QgeWV0LgorCQkgKi8KKwkJaWw0OTY1X3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoaWwsIHN0YV9pZCwgMSk7CisJfQorCisJLyoKKwkgKiBTZW5kIHRoaXMgZnJhbWUgYWZ0ZXIgRFRJTSAtLSB0aGVyZSdzIGEgc3BlY2lhbCBxdWV1ZQorCSAqIHJlc2VydmVkIGZvciB0aGlzIGZvciBjb250ZXh0cyB0aGF0IHN1cHBvcnQgQVAgbW9kZS4KKwkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1NFTkRfQUZURVJfRFRJTSkgeworCQl0eHFfaWQgPSBjdHgtPm1jYXN0X3F1ZXVlOworCQkvKgorCQkgKiBUaGUgbWljcm9jb2RlIHdpbGwgY2xlYXIgdGhlIG1vcmUgZGF0YQorCQkgKiBiaXQgaW4gdGhlIGxhc3QgZnJhbWUgaXQgdHJhbnNtaXRzLgorCQkgKi8KKwkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKKwl9IGVsc2UKKwkJdHhxX2lkID0gY3R4LT5hY190b19xdWV1ZVtza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CisKKwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQvc2F2ZWQgYWJvdmUgd2hlbiBsb2NraW5nIGlsLT5sb2NrICovCisJc3Bpbl9sb2NrKCZpbC0+c3RhX2xvY2spOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKKwkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbC0+c3RhX2xvY2spOworCQkJZ290byBkcm9wX3VubG9jazsKKwkJfQorCQlzZXFfbnVtYmVyID0gaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlcjsKKwkJc2VxX251bWJlciAmPSBJRUVFODAyMTFfU0NUTF9TRVE7CisJCWhkci0+c2VxX2N0cmwgPQorCQkgICAgaGRyLT5zZXFfY3RybCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOworCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNlcV9udW1iZXIpOworCQlzZXFfbnVtYmVyICs9IDB4MTA7CisJCS8qIGFnZ3JlZ2F0aW9uIGlzIG9uIGZvciB0aGlzIDxzdGEsdGlkPiAqLworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVICYmCisJCSAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPT0gSUxfQUdHX09OKSB7CisJCQl0eHFfaWQgPSBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cudHhxX2lkOworCQkJaXNfYWdnID0gdHJ1ZTsKKwkJfQorCX0KKworCXR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJcSA9ICZ0eHEtPnE7CisKKwlpZiAodW5saWtlbHkoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKSB7CisJCXNwaW5fdW5sb2NrKCZpbC0+c3RhX2xvY2spOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUrKzsKKwkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5zZXFfbnVtYmVyID0gc2VxX251bWJlcjsKKwl9CisKKwlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKworCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KKwltZW1zZXQoJih0eHEtPnR4YltxLT53cml0ZV9wdHJdKSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF90eF9pbmZvKSk7CisJdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5za2IgPSBza2I7CisJdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5jdHggPSBjdHg7CisKKwkvKiBTZXQgdXAgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLworCW91dF9jbWQgPSB0eHEtPmNtZFtxLT53cml0ZV9wdHJdOworCW91dF9tZXRhID0gJnR4cS0+bWV0YVtxLT53cml0ZV9wdHJdOworCXR4X2NtZCA9ICZvdXRfY21kLT5jbWQudHg7CisJbWVtc2V0KCZvdXRfY21kLT5oZHIsIDAsIHNpemVvZihvdXRfY21kLT5oZHIpKTsKKwltZW1zZXQodHhfY21kLCAwLCBzaXplb2Yoc3RydWN0IGlsX3R4X2NtZCkpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCisJICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGlkeCB3aXRoaW4gdGhlIHNlcXVlbmNlIGZpZWxkOworCSAqIGFmdGVyIFR4LCB1Q29kZSdzIFR4IHJlc3BvbnNlIHdpbGwgcmV0dXJuIHRoaXMgdmFsdWUgc28gZHJpdmVyIGNhbgorCSAqIGxvY2F0ZSB0aGUgZnJhbWUgd2l0aGluIHRoZSB0eCBxdWV1ZSBhbmQgZG8gcG9zdC10eCBwcm9jZXNzaW5nLgorCSAqLworCW91dF9jbWQtPmhkci5jbWQgPSBDX1RYOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpCisJCQkoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfCBJRFhfVE9fU0VRKHEtPndyaXRlX3B0cikpKTsKKworCS8qIENvcHkgTUFDIGhlYWRlciBmcm9tIHNrYiBpbnRvIGNvbW1hbmQgYnVmZmVyICovCisJbWVtY3B5KHR4X2NtZC0+aGRyLCBoZHIsIGhkcl9sZW4pOworCisJLyogVG90YWwgIyBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLworCWxlbiA9ICh1MTYpIHNrYi0+bGVuOworCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKworCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKKwkJaWw0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhpbCwgaW5mbywgdHhfY21kLCBza2IsIHN0YV9pZCk7CisKKwkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLworCWlsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoaWwsIHNrYiwgdHhfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7CisJaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKGlsLCBsZW4sIGhkcik7CisKKwlpbDQ5NjVfdHhfY21kX2J1aWxkX3JhdGUoaWwsIHR4X2NtZCwgaW5mbywgZmMpOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCB0cnVlLCBmYywgbGVuKTsKKwkvKgorCSAqIFVzZSB0aGUgZmlyc3QgZW1wdHkgZW50cnkgaW4gdGhpcyBxdWV1ZSdzIGNvbW1hbmQgYnVmZmVyIGFycmF5CisJICogdG8gY29udGFpbiB0aGUgVHggY29tbWFuZCBhbmQgTUFDIGhlYWRlciBjb25jYXRlbmF0ZWQgdG9nZXRoZXIKKwkgKiAocGF5bG9hZCBkYXRhIHdpbGwgYmUgaW4gYW5vdGhlciBidWZmZXIpLgorCSAqIFNpemUgb2YgdGhpcyB2YXJpZXMsIGR1ZSB0byB2YXJ5aW5nIE1BQyBoZWFkZXIgbGVuZ3RoLgorCSAqIElmIGVuZCBpcyBub3QgZHdvcmQgYWxpZ25lZCwgd2UnbGwgaGF2ZSAyIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKKwkgKiBvZiB0aGUgTUFDIGhlYWRlciAoZGV2aWNlIHJlYWRzIG9uIGR3b3JkIGJvdW5kYXJpZXMpLgorCSAqIFdlJ2xsIHRlbGwgZGV2aWNlIGFib3V0IHRoaXMgcGFkZGluZyBsYXRlci4KKwkgKi8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGlsX3R4X2NtZCkgKyBzaXplb2Yoc3RydWN0IGlsX2NtZF9oZWFkZXIpICsgaGRyX2xlbjsKKwlmaXJzdGxlbiA9IChsZW4gKyAzKSAmIH4zOworCisJLyogVGVsbCBOSUMgYWJvdXQgYW55IDItYnl0ZSBwYWRkaW5nIGFmdGVyIE1BQyBoZWFkZXIgKi8KKwlpZiAoZmlyc3RsZW4gIT0gbGVuKQorCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTUhfUEFEX01TSzsKKworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBUeCBjb21tYW5kJ3MgaGVhZGVyIChub3QgTUFDIGhlYWRlciEpLAorCSAqIHdpdGhpbiBjb21tYW5kIGJ1ZmZlciBhcnJheS4gKi8KKwl0eGNtZF9waHlzID0KKwkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsIGZpcnN0bGVuLAorCQkJICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOworCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGZpcnN0bGVuKTsKKwkvKiBBZGQgYnVmZmVyIGNvbnRhaW5pbmcgVHggY29tbWFuZCBhbmQgTUFDKCEpIGhlYWRlciB0byBURkQncworCSAqIGZpcnN0IGVudHJ5ICovCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCB0eGNtZF9waHlzLCBmaXJzdGxlbiwKKwkJCQkJCSAxLCAwKTsKKworCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwl9IGVsc2UgeworCQl3YWl0X3dyaXRlX3B0ciA9IDE7CisJCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCX0KKworCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKKwkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLworCXNlY29uZGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlpZiAoc2Vjb25kbGVuID4gMCkgeworCQlwaHlzX2FkZHIgPQorCQkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNlY29uZGxlbiwKKwkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCBwaHlzX2FkZHIsCisJCQkJCQkJIHNlY29uZGxlbiwgMCwgMCk7CisJfQorCisJc2NyYXRjaF9waHlzID0KKwkgICAgdHhjbWRfcGh5cyArIHNpemVvZihzdHJ1Y3QgaWxfY21kX2hlYWRlcikgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgaWxfdHhfY21kLCBzY3JhdGNoKTsKKworCS8qIHRha2UgYmFjayBvd25lcnNoaXAgb2YgRE1BIGJ1ZmZlciB0byBlbmFibGUgdXBkYXRlICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGlsLT5wY2lfZGV2LCB0eGNtZF9waHlzLCBmaXJzdGxlbiwKKwkJCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwl0eF9jbWQtPmRyYW1fbHNiX3B0ciA9IGNwdV90b19sZTMyKHNjcmF0Y2hfcGh5cyk7CisJdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpbF9nZXRfZG1hX2hpX2FkZHIoc2NyYXRjaF9waHlzKTsKKworCURfVFgoInNlcXVlbmNlIG5yID0gMFgleFxuIiwgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7CisJRF9UWCgidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1RYLCAodTggKikgdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9UWCwgKHU4ICopIHR4X2NtZC0+aGRyLCBoZHJfbGVuKTsKKworCS8qIFNldCB1cCBlbnRyeSBmb3IgdGhpcyBURkQgaW4gVHggYnl0ZS1jb3VudCBhcnJheSAqLworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibChpbCwgdHhxLAorCQkJCQkJCSAgIGxlMTZfdG9fY3B1KHR4X2NtZC0+CisJCQkJCQkJCSAgICAgICBsZW4pKTsKKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShpbC0+cGNpX2RldiwgdHhjbWRfcGh5cywgZmlyc3RsZW4sCisJCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaWR4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KKwlxLT53cml0ZV9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzICJ0cmFuc21pdHRlZCIgc3VjY2Vzc2Z1bGx5CisJICogYW5kIHdlIHdpbGwgZ2V0IGEgVFggc3RhdHVzIG5vdGlmaWNhdGlvbiBldmVudHVhbGx5LAorCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHJldC4gInJldCIgb25seSBpbmRpY2F0ZXMKKwkgKiB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyLgorCSAqLworCisJLyoKKwkgKiBBdm9pZCBhdG9taWMgb3BzIGlmIGl0IGlzbid0IGFuIGFzc29jaWF0ZWQgY2xpZW50LgorCSAqIEFsc28sIGlmIHRoaXMgaXMgYSBwYWNrZXQgZm9yIGFnZ3JlZ2F0aW9uLCBkb24ndAorCSAqIGluY3JlYXNlIHRoZSBjb3VudGVyIGJlY2F1c2UgdGhlIHVjb2RlIHdpbGwgc3RvcAorCSAqIGFnZ3JlZ2F0aW9uIHF1ZXVlcyB3aGVuIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGlvbgorCSAqIGdvZXMgdG8gc2xlZXAuCisJICovCisJaWYgKHN0YV9wcml2ICYmIHN0YV9wcml2LT5jbGllbnQgJiYgIWlzX2FnZykKKwkJYXRvbWljX2luYygmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzKTsKKworCWlmIChpbF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyayAmJiBpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgeworCQlpZiAod2FpdF93cml0ZV9wdHIpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlpbF9zdG9wX3F1ZXVlKGlsLCB0eHEpOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Ryb3BfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2FsbG9jX2RtYV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZG1hX3B0ciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlwdHItPmFkZHIgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIHNpemUsICZwdHItPmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHItPmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCXB0ci0+c2l6ZSA9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWw0OTY1X2ZyZWVfZG1hX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kbWFfcHRyICpwdHIpCit7CisJaWYgKHVubGlrZWx5KCFwdHItPmFkZHIpKQorCQlyZXR1cm47CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgcHRyLT5zaXplLCBwdHItPmFkZHIsIHB0ci0+ZG1hKTsKKwltZW1zZXQocHRyLCAwLCBzaXplb2YoKnB0cikpOworfQorCisvKioKKyAqIGlsNDk2NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0CisgKgorICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcworICovCit2b2lkCitpbDQ5NjVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkOworCisJLyogVHggcXVldWVzICovCisJaWYgKGlsLT50eHEpIHsKKwkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKKwkJCWlmICh0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJCQlpbF9jbWRfcXVldWVfZnJlZShpbCk7CisJCQllbHNlCisJCQkJaWxfdHhfcXVldWVfZnJlZShpbCwgdHhxX2lkKTsKKwl9CisJaWw0OTY1X2ZyZWVfZG1hX3B0cihpbCwgJmlsLT5rdyk7CisKKwlpbDQ5NjVfZnJlZV9kbWFfcHRyKGlsLCAmaWwtPnNjZF9iY190YmxzKTsKKworCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCisJaWxfdHhxX21lbShpbCk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4cV9jdHhfYWxsb2MgLSBhbGxvY2F0ZSBUWCBxdWV1ZSBjb250ZXh0CisgKiBBbGxvY2F0ZSBhbGwgVHggRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpemUgdGhlbQorICoKKyAqIEBwYXJhbSBpbAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2ludAoraWw0OTY1X3R4cV9jdHhfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJaW50IHR4cV9pZCwgc2xvdHNfbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBGcmVlIGFsbCB0eC9jbWQgcXVldWVzIGFuZCBrZWVwLXdhcm0gYnVmZmVyICovCisJaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwlyZXQgPQorCSAgICBpbDQ5NjVfYWxsb2NfZG1hX3B0cihpbCwgJmlsLT5zY2RfYmNfdGJscywKKwkJCQkgaWwtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiU2NoZWR1bGVyIEJDIFRhYmxlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9iY190YmxzOworCX0KKwkvKiBBbGxvYyBrZWVwLXdhcm0gYnVmZmVyICovCisJcmV0ID0gaWw0OTY1X2FsbG9jX2RtYV9wdHIoaWwsICZpbC0+a3csIElMX0tXX1NJWkUpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJLZWVwIFdhcm0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2t3OworCX0KKworCS8qIGFsbG9jYXRlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLworCXJldCA9IGlsX2FsbG9jX3R4cV9tZW0oaWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgMCk7CisKKwkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KKwlpbF93cihpbCwgRkg0OV9LV19NRU1fQUREUl9SRUcsIGlsLT5rdy5kbWEgPj4gNCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7CisJCXNsb3RzX251bSA9CisJCSAgICAodHhxX2lkID09CisJCSAgICAgaWwtPmNtZF9xdWV1ZSkgPyBURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKKwkJcmV0ID0gaWxfdHhfcXVldWVfaW5pdChpbCwgJmlsLT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlR4ICVkIHF1ZXVlIGluaXQgZmFpbGVkXG4iLCB0eHFfaWQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yOgorCWlsNDk2NV9od190eHFfY3R4X2ZyZWUoaWwpOworCWlsNDk2NV9mcmVlX2RtYV9wdHIoaWwsICZpbC0+a3cpOworZXJyb3Jfa3c6CisJaWw0OTY1X2ZyZWVfZG1hX3B0cihpbCwgJmlsLT5zY2RfYmNfdGJscyk7CitlcnJvcl9iY190YmxzOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lsNDk2NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkLCBzbG90c19udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLworCWlsNDk2NV90eHFfc2V0X3NjaGVkKGlsLCAwKTsKKworCS8qIFRlbGwgTklDIHdoZXJlIHRvIGZpbmQgdGhlICJrZWVwIHdhcm0iIGJ1ZmZlciAqLworCWlsX3dyKGlsLCBGSDQ5X0tXX01FTV9BRERSX1JFRywgaWwtPmt3LmRtYSA+PiA0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBBbGxvYyBhbmQgaW5pdCBhbGwgVHggcXVldWVzLCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUgKCM0KSAqLworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKKwkJc2xvdHNfbnVtID0KKwkJICAgIHR4cV9pZCA9PSBpbC0+Y21kX3F1ZXVlID8gVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCWlsX3R4X3F1ZXVlX3Jlc2V0KGlsLCAmaWwtPnR4cVt0eHFfaWRdLCBzbG90c19udW0sIHR4cV9pZCk7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV90eHFfY3R4X3N0b3AgLSBTdG9wIGFsbCBUeCBETUEgY2hhbm5lbHMKKyAqLwordm9pZAoraWw0OTY1X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGNoLCB0eHFfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlsNDk2NV90eHFfc2V0X3NjaGVkKGlsLCAwKTsKKworCS8qIFN0b3AgZWFjaCBUeCBETUEgY2hhbm5lbCwgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGlkbGUgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBpbC0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgeworCQlpbF93cihpbCwgRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaCksIDB4MCk7CisJCWlmIChpbF9wb2xsX2JpdAorCQkgICAgKGlsLCBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRywKKwkJICAgICBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKGNoKSwgMTAwMCkpCisJCQlJTF9FUlIoIkZhaWxpbmcgb24gdGltZW91dCB3aGlsZSBzdG9wcGluZyIKKwkJCSAgICAgICAiIERNQSBjaGFubmVsICVkIFsweCUwOHhdIiwgY2gsCisJCQkgICAgICAgaWxfcmQoaWwsIEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlsLT50eHEpCisJCXJldHVybjsKKworCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKKwkJaWYgKHR4cV9pZCA9PSBpbC0+Y21kX3F1ZXVlKQorCQkJaWxfY21kX3F1ZXVlX3VubWFwKGlsKTsKKwkJZWxzZQorCQkJaWxfdHhfcXVldWVfdW5tYXAoaWwsIHR4cV9pZCk7Cit9CisKKy8qCisgKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSAobG93ZXN0IHVudXNlZCkgVHggUXVldWUsIG1hcmsgaXQgImFjdGl2ZSIuCisgKiBDYWxsZWQgb25seSB3aGVuIGZpbmRpbmcgcXVldWUgZm9yIGFnZ3JlZ2F0aW9uLgorICogU2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDcsIGJlY2F1c2UgdGhleSBzaG91bGQgYWxyZWFkeQorICogYmUgaW4gdXNlIGFzIEVEQ0EgQUMgKDAtMyksIENvbW1hbmQgKDQpLCByZXNlcnZlZCAoNSwgNikKKyAqLworc3RhdGljIGludAoraWw0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHR4cV9pZDsKKworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eHFfaWQsICZpbC0+dHhxX2N0eF9hY3RpdmVfbXNrKSkKKwkJCXJldHVybiB0eHFfaWQ7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGlsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlciAtIFN0b3AgcXVldWUsIGJ1dCBrZWVwIGNvbmZpZ3VyYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiB0eHFfaWQpCit7CisJLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOworCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLworCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHR4cV9pZCksCisJCSAgICgwIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpIHwKKwkJICAgKDEgPDwgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQgLSBNYXAgdW5pcXVlIHJlY2VpdmVyL3RpZCBjb21iaW5hdGlvbiB0byBhIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eF9xdWV1ZV9zZXRfcTJyYXRpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiByYV90aWQsIHUxNiB0eHFfaWQpCit7CisJdTMyIHRibF9kd19hZGRyOworCXUzMiB0YmxfZHc7CisJdTE2IHNjZF9xMnJhdGlkOworCisJc2NkX3EycmF0aWQgPSByYV90aWQgJiBJTF9TQ0RfUVVFVUVfUkFfVElEX01BUF9SQVRJRF9NU0s7CisKKwl0YmxfZHdfYWRkciA9CisJICAgIGlsLT5zY2RfYmFzZV9hZGRyICsgSUw0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKKworCXRibF9kdyA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIHRibF9kd19hZGRyKTsKKworCWlmICh0eHFfaWQgJiAweDEpCisJCXRibF9kdyA9IChzY2RfcTJyYXRpZCA8PCAxNikgfCAodGJsX2R3ICYgMHgwMDAwRkZGRik7CisJZWxzZQorCQl0YmxfZHcgPSBzY2RfcTJyYXRpZCB8ICh0YmxfZHcgJiAweEZGRkYwMDAwKTsKKworCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCB0YmxfZHdfYWRkciwgdGJsX2R3KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV90eF9xdWV1ZV9hZ2dfZW5hYmxlIC0gU2V0IHVwICYgZW5hYmxlIGFnZ3JlZ2F0aW9uIGZvciBzZWxlY3RlZCBxdWV1ZQorICoKKyAqIE5PVEU6ICB0eHFfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSwKKyAqICAgICAgICBpLmUuIGl0IG11c3QgYmUgb25lIG9mIHRoZSBoaWdoZXIgcXVldWVzIHVzZWQgZm9yIGFnZ3JlZ2F0aW9uCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eHFfYWdnX2VuYWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQsIGludCB0eF9maWZvLCBpbnQgc3RhX2lkLAorCQkgICAgICBpbnQgdGlkLCB1MTYgc3NuX2lkeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiByYV90aWQ7CisJaW50IHJldDsKKworCWlmICgoSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKKwkgICAgKElMNDlfRklSU1RfQU1QRFVfUVVFVUUgKworCSAgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9hbXBkdV9xdWV1ZXMgPD0gdHhxX2lkKSkgeworCQlJTF9XQVJOKCJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKKwkJCXR4cV9pZCwgSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSwKKwkJCUlMNDlfRklSU1RfQU1QRFVfUVVFVUUgKworCQkJaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9hbXBkdV9xdWV1ZXMgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmFfdGlkID0gQlVJTERfUkF4VElEKHN0YV9pZCwgdGlkKTsKKworCS8qIE1vZGlmeSBkZXZpY2UncyBzdGF0aW9uIHRhYmxlIHRvIFR4IHRoaXMgVElEICovCisJcmV0ID0gaWw0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChpbCwgc3RhX2lkLCB0aWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgdGhpcyBUeCBxdWV1ZSBiZWZvcmUgY29uZmlndXJpbmcgaXQgKi8KKwlpbDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIoaWwsIHR4cV9pZCk7CisKKwkvKiBNYXAgcmVjZWl2ZXItYWRkcmVzcyAvIHRyYWZmaWMtSUQgdG8gdGhpcyBxdWV1ZSAqLworCWlsNDk2NV90eF9xdWV1ZV9zZXRfcTJyYXRpZChpbCwgcmFfdGlkLCB0eHFfaWQpOworCisJLyogU2V0IHRoaXMgcXVldWUgYXMgYSBjaGFpbi1idWlsZGluZyBxdWV1ZSAqLworCWlsX3NldF9iaXRzX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKKworCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpZHggY29ycmVzcG9uZGluZyB0byBzdGFydCBzZXF1ZW5jZSBudW1iZXIuCisJICogQXNzdW1lcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLworCWlsLT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKKwlpbC0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCWlsNDk2NV9zZXRfd3JfcHRycyhpbCwgdHhxX2lkLCBzc25faWR4KTsKKworCS8qIFNldCB1cCBUeCB3aW4gc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KKwlpbF93cml0ZV90YXJnX21lbShpbCwKKwkJCSAgaWwtPnNjZF9iYXNlX2FkZHIgKworCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh0eHFfaWQpLAorCQkJICAoU0NEX1dJTl9TSVpFIDw8IElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX1BPUykKKwkJCSAgJiBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOworCisJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkgIGlsLT5zY2RfYmFzZV9hZGRyICsKKwkJCSAgSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSArIHNpemVvZih1MzIpLAorCQkJICAoU0NEX0ZSQU1FX0xJTUlUIDw8CisJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCSAgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLKTsKKworCWlsX3NldF9iaXRzX3BycGgoaWwsIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLCAoMSA8PCB0eHFfaWQpKTsKKworCS8qIFNldCB1cCBTdGF0dXMgYXJlYSBpbiBTUkFNLCBtYXAgdG8gVHggRE1BL0ZJRk8sIGFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCWlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKGlsLCAmaWwtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqIHNzbikKK3sKKwlpbnQgc3RhX2lkOworCWludCB0eF9maWZvOworCWludCB0eHFfaWQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF90aWRfZGF0YSAqdGlkX2RhdGE7CisKKwl0eF9maWZvID0gaWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7CisJaWYgKHVubGlrZWx5KHR4X2ZpZm8gPCAwKSkKKwkJcmV0dXJuIHR4X2ZpZm87CisKKwlEX0hUKCIlcyBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwgX19mdW5jX18sIHN0YS0+YWRkciwgdGlkKTsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiU3RhcnQgQUdHIG9uIGludmFsaWQgc3RhdGlvblxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSAhPSBJTF9BR0dfT0ZGKSB7CisJCUlMX0VSUigiU3RhcnQgQUdHIHdoZW4gc3RhdGUgaXMgbm90IElMX0FHR19PRkYgIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJdHhxX2lkID0gaWw0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShpbCk7CisJaWYgKHR4cV9pZCA9PSAtMSkgeworCQlJTF9FUlIoIk5vIGZyZWUgYWdncmVnYXRpb24gcXVldWUgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CisJKnNzbiA9IFNFUV9UT19TTih0aWRfZGF0YS0+c2VxX251bWJlcik7CisJdGlkX2RhdGEtPmFnZy50eHFfaWQgPSB0eHFfaWQ7CisJaWxfc2V0X3N3cV9pZCgmaWwtPnR4cVt0eHFfaWRdLCBpbDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBpbDQ5NjVfdHhxX2FnZ19lbmFibGUoaWwsIHR4cV9pZCwgdHhfZmlmbywgc3RhX2lkLCB0aWQsICpzc24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CisJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKKwkJRF9IVCgiSFcgcXVldWUgaXMgZW1wdHlcbiIpOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSUxfQUdHX09OOworCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKKwl9IGVsc2UgeworCQlEX0hUKCJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFcgcXVldWVcbiIsCisJCSAgICAgdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUpOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSUxfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdHhxX2lkIG11c3QgYmUgZ3JlYXRlciB0aGFuIElMNDlfRklSU1RfQU1QRFVfUVVFVUUKKyAqIGlsLT5sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eHFfYWdnX2Rpc2FibGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgdHhxX2lkLCB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKK3sKKwlpZiAoKElMNDlfRklSU1RfQU1QRFVfUVVFVUUgPiB0eHFfaWQpIHx8CisJICAgIChJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkgICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKKwkJSUxfV0FSTigicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCisJCQl0eHFfaWQsIElMNDlfRklSU1RfQU1QRFVfUVVFVUUsCisJCQlJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkJCWlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihpbCwgdHhxX2lkKTsKKworCWlsX2NsZWFyX2JpdHNfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsICgxIDw8IHR4cV9pZCkpOworCisJaWwtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCWlsLT50eHFbdHhxX2lkXS5xLndyaXRlX3B0ciA9IChzc25faWR4ICYgMHhmZik7CisJLyogc3VwcG9zZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KKwlpbDQ5NjVfc2V0X3dyX3B0cnMoaWwsIHR4cV9pZCwgc3NuX2lkeCk7CisKKwlpbF9jbGVhcl9iaXRzX3BycGgoaWwsIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLCAoMSA8PCB0eHFfaWQpKTsKKwlpbF90eHFfY3R4X2RlYWN0aXZhdGUoaWwsIHR4cV9pZCk7CisJaWw0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMoaWwsICZpbC0+dHhxW3R4cV9pZF0sIHR4X2ZpZm8sIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK3sKKwlpbnQgdHhfZmlmb19pZCwgdHhxX2lkLCBzdGFfaWQsIHNzbjsKKwlzdHJ1Y3QgaWxfdGlkX2RhdGEgKnRpZF9kYXRhOworCWludCB3cml0ZV9wdHIsIHJlYWRfcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0eF9maWZvX2lkID0gaWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7CisJaWYgKHVubGlrZWx5KHR4X2ZpZm9faWQgPCAwKSkKKwkJcmV0dXJuIHR4X2ZpZm9faWQ7CisKKwlzdGFfaWQgPSBpbF9zdGFfaWQoc3RhKTsKKworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiSW52YWxpZCBzdGF0aW9uIGZvciBBR0cgdGlkICVkXG4iLCB0aWQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXRpZF9kYXRhID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdOworCXNzbiA9ICh0aWRfZGF0YS0+c2VxX251bWJlciAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNDsKKwl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKKworCXN3aXRjaCAoaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlKSB7CisJY2FzZSBJTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQToKKwkJLyoKKwkJICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBwZWVyIHN0b3BzIGFnZ3JlZ2F0aW9uCisJCSAqIGFnYWluIGJlZm9yZSB3ZSd2ZSBoYWQgYSBjaGFuY2UgdG8gZHJhaW4gdGhlCisJCSAqIHF1ZXVlIHdlIHNlbGVjdGVkIHByZXZpb3VzbHksIGkuZS4gYmVmb3JlIHRoZQorCQkgKiBzZXNzaW9uIHdhcyByZWFsbHkgc3RhcnRlZCBjb21wbGV0ZWx5LgorCQkgKi8KKwkJRF9IVCgiQUdHIHN0b3AgYmVmb3JlIHNldHVwIGRvbmVcbiIpOworCQlnb3RvIHR1cm5fb2ZmOworCWNhc2UgSUxfQUdHX09OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9XQVJOKCJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OIG9yIHN0YXJ0aW5nXG4iKTsKKwl9CisKKwl3cml0ZV9wdHIgPSBpbC0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHI7CisJcmVhZF9wdHIgPSBpbC0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0cjsKKworCS8qIFRoZSBxdWV1ZSBpcyBub3QgZW1wdHkgKi8KKwlpZiAod3JpdGVfcHRyICE9IHJlYWRfcHRyKSB7CisJCURfSFQoIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9CisJCSAgICBJTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCURfSFQoIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKK3R1cm5fb2ZmOgorCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9IElMX0FHR19PRkY7CisKKwkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KKwlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2soJmlsLT5sb2NrKTsKKworCS8qCisJICogdGhlIG9ubHkgcmVhc29uIHRoaXMgY2FsbCBjYW4gZmFpbCBpcyBxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlLAorCSAqIHdoaWNoIGNhbiBoYXBwZW4gaWYgdUNvZGUgaXMgcmVsb2FkZWQgYW5kIGFsbCB0aGUgc3RhdGlvbgorCSAqIGluZm9ybWF0aW9uIGFyZSBsb3N0LiBpZiBpdCBpcyBvdXRzaWRlIHRoZSByYW5nZSwgdGhlcmUgaXMgbm8gbmVlZAorCSAqIHRvIGRlYWN0aXZhdGUgdGhlIHVDb2RlIHF1ZXVlLCBqdXN0IHJldHVybiAic3VjY2VzcyIgdG8gYWxsb3cKKwkgKiAgbWFjODAyMTEgdG8gY2xlYW4gdXAgaXQgb3duIGRhdGEuCisJICovCisJaWw0OTY1X3R4cV9hZ2dfZGlzYWJsZShpbCwgdHhxX2lkLCBzc24sIHR4X2ZpZm9faWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmaWwtPnR4cVt0eHFfaWRdLnE7CisJdTggKmFkZHIgPSBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7CisJc3RydWN0IGlsX3RpZF9kYXRhICp0aWRfZGF0YSA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisKKwljdHggPSAmaWwtPmN0eDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5zdGFfbG9jayk7CisKKwlzd2l0Y2ggKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgeworCWNhc2UgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE6CisJCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgKi8KKwkJLyogYWdncmVnYXRlZCBIVyBxdWV1ZSAqLworCQlpZiAodHhxX2lkID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkICYmCisJCSAgICBxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpIHsKKwkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCQkJaW50IHR4X2ZpZm8gPSBpbDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoY3R4LCB0aWQpOworCQkJRF9IVCgiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIERFTEJBIGZsb3dcbiIpOworCQkJaWw0OTY1X3R4cV9hZ2dfZGlzYWJsZShpbCwgdHhxX2lkLCBzc24sIHR4X2ZpZm8pOworCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElMX0FHR19PRkY7CisJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUxfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6CisJCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcXVldWUgKi8KKwkJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKKwkJCURfSFQoIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBBRERCQSBmbG93XG4iKTsKKwkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJTF9BR0dfT047CisJCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBjb25zdCB1OCAqYWRkcjEpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEoY3R4LT52aWYsIGFkZHIxKTsKKwlpZiAoc3RhKSB7CisJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCQkvKiBhdm9pZCBhdG9taWMgb3BzIGlmIHRoaXMgaXNuJ3QgYSBjbGllbnQgKi8KKwkJaWYgKHN0YV9wcml2LT5jbGllbnQgJiYKKwkJICAgIGF0b21pY19kZWNfcmV0dXJuKCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMpID09IDApCisJCQlpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKGlsLT5odywgc3RhLCBmYWxzZSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvLCBib29sIGlzX2FnZykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOworCisJaWYgKCFpc19hZ2cpCisJCWlsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhpbCwgdHhfaW5mby0+Y3R4LCBoZHItPmFkZHIxKTsKKworCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShpbC0+aHcsIHR4X2luZm8tPnNrYik7Cit9CisKK2ludAoraWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvOworCWludCBuZnJlZWQgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwlpZiAoaWR4ID49IHEtPm5fYmQgfHwgaWxfcXVldWVfdXNlZChxLCBpZHgpID09IDApIHsKKwkJSUxfRVJSKCJSZWFkIGlkeCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpZHggJWQsICIKKwkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLCBpZHgsIHEtPm5fYmQsCisJCSAgICAgICBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKKworCQlpZiAoV0FSTl9PTl9PTkNFKHR4X2luZm8tPnNrYiA9PSBOVUxMKSkKKwkJCWNvbnRpbnVlOworCisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKKwkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQorCQkJbmZyZWVkKys7CisKKwkJaWw0OTY1X3R4X3N0YXR1cyhpbCwgdHhfaW5mbywKKwkJCQkgdHhxX2lkID49IElMNDk2NV9GSVJTVF9BTVBEVV9RVUVVRSk7CisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CisKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChpbCwgdHhxKTsKKwl9CisJcmV0dXJuIG5mcmVlZDsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEgLSBVcGRhdGUgdHggc3RhdHVzIGZyb20gYmxvY2stYWNrCisgKgorICogR28gdGhyb3VnaCBibG9jay1hY2sncyBiaXRtYXAgb2YgQUNLJ2QgZnJhbWVzLCB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mCisgKiBBQ0sgdnMuIG5vdC4gIFRoaXMgZ2V0cyBzZW50IHRvIG1hYzgwMjExLCB0aGVuIHRvIHJhdGUgc2NhbGluZyBhbGdvLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfYWdnICphZ2csCisJCQkJICAgICBzdHJ1Y3QgaWxfY29tcHJlc3NlZF9iYV9yZXNwICpiYV9yZXNwKQoreworCWludCBpLCBzaCwgYWNrOworCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7CisJdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOworCWludCBzdWNjZXNzZXMgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwl1NjQgYml0bWFwLCBzZW50X2JpdG1hcDsKKworCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpIHsKKwkJaWYgKHVubGlrZWx5KGJhX3Jlc3AtPmJpdG1hcCkpCisJCQlJTF9FUlIoIlJlY2VpdmVkIEJBIHdoZW4gbm90IGV4cGVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWFyayB0aGF0IHRoZSBleHBlY3RlZCBibG9jay1hY2sgcmVzcG9uc2UgYXJyaXZlZCAqLworCWFnZy0+d2FpdF9mb3JfYmEgPSAwOworCURfVFhfUkVQTFkoIkJBICVkICVkXG4iLCBhZ2ctPnN0YXJ0X2lkeCwgYmFfcmVzcC0+c2VxX2N0bCk7CisKKwkvKiBDYWxjdWxhdGUgc2hpZnQgdG8gYWxpZ24gYmxvY2stYWNrIGJpdHMgd2l0aCBvdXIgVHggd2luIGJpdHMgKi8KKwlzaCA9IGFnZy0+c3RhcnRfaWR4IC0gU0VRX1RPX0lEWChzZXFfY3RsID4+IDQpOworCWlmIChzaCA8IDApCQkvKiB0Yncgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggaW5kaWNlcyAqLworCQlzaCArPSAweDEwMDsKKworCWlmIChhZ2ctPmZyYW1lX2NvdW50ID4gKDY0IC0gc2gpKSB7CisJCURfVFhfUkVQTFkoIm1vcmUgZnJhbWVzIHRoYW4gYml0bWFwIHNpemUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvbid0IHVzZSA2NC1iaXQgdmFsdWVzIGZvciBub3cgKi8KKwliaXRtYXAgPSBsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApID4+IHNoOworCisJLyogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY2NvcmRpbmcgdG8gdGhlCisJICogdHJhbnNtaXR0ZWQgYml0bWFwIGFuZCBibG9jay1hY2sgYml0bWFwICovCisJc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKKworCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKKwkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLworCWkgPSAwOworCXdoaWxlIChzZW50X2JpdG1hcCkgeworCQlhY2sgPSBzZW50X2JpdG1hcCAmIDFVTEw7CisJCXN1Y2Nlc3NlcyArPSBhY2s7CisJCURfVFhfUkVQTFkoIiVzIE9OIGk9JWQgaWR4PSVkIHJhdz0lZFxuIiwgYWNrID8gIkFDSyIgOiAiTkFDSyIsCisJCQkgICBpLCAoYWdnLT5zdGFydF9pZHggKyBpKSAmIDB4ZmYsIGFnZy0+c3RhcnRfaWR4ICsgaSk7CisJCXNlbnRfYml0bWFwID4+PSAxOworCQkrK2k7CisJfQorCisJRF9UWF9SRVBMWSgiQml0bWFwICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwKTsKKworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGlsLT50eHFbc2NkX2Zsb3ddLnR4YlthZ2ctPnN0YXJ0X2lkeF0uc2tiKTsKKwltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKwlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKKwlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IHN1Y2Nlc3NlczsKKwlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gYWdnLT5mcmFtZV9jb3VudDsKKwlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsIGFnZy0+cmF0ZV9uX2ZsYWdzLCBpbmZvKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRyYW5zbGF0ZSB1Y29kZSByZXNwb25zZSB0byBtYWM4MDIxMSB0eCBzdGF0dXMgY29udHJvbCB2YWx1ZXMKKyAqLwordm9pZAoraWw0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJhdGVfbl9mbGFncywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyID0gJmluZm8tPmNvbnRyb2wucmF0ZXNbMF07CisKKwlpbmZvLT5hbnRlbm5hX3NlbF90eCA9CisJICAgICgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+IFJBVEVfTUNTX0FOVF9QT1MpOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCisJCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0dGX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7CisJci0+aWR4ID0gaWw0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgocmF0ZV9uX2ZsYWdzLCBpbmZvLT5iYW5kKTsKK30KKworLyoqCisgKiBpbDQ5NjVfaGRsX2NvbXByZXNzZWRfYmEgLSBIYW5kbGVyIGZvciBOX0NPTVBSRVNTRURfQkEKKyAqCisgKiBIYW5kbGVzIGJsb2NrLWFja25vd2xlZGdlIG5vdGlmaWNhdGlvbiBmcm9tIGRldmljZSwgd2hpY2ggcmVwb3J0cyBzdWNjZXNzCisgKiBvZiBmcmFtZXMgc2VudCB2aWEgYWdncmVnYXRpb24uCisgKi8KK3ZvaWQKK2lsNDk2NV9oZGxfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9jb21wcmVzc2VkX2JhX3Jlc3AgKmJhX3Jlc3AgPSAmcGt0LT51LmNvbXByZXNzZWRfYmE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOworCXN0cnVjdCBpbF9odF9hZ2cgKmFnZzsKKwlpbnQgaWR4OworCWludCBzdGFfaWQ7CisJaW50IHRpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCisJdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOworCisJLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbiwgY29ycmVzcG9uZHMgdG8gaWR4CisJICogKGluIFR4IHF1ZXVlJ3MgY2lyY3VsYXIgYnVmZmVyKSBvZiBmaXJzdCBURkQvZnJhbWUgaW4gd2luICovCisJdTE2IGJhX3Jlc3Bfc2NkX3NzbiA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNjZF9zc24pOworCisJaWYgKHNjZF9mbG93ID49IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW0pIHsKKwkJSUxfRVJSKCJCVUdfT04gc2NkX2Zsb3cgaXMgYmlnZ2VyIHRoYW4gbnVtYmVyIG9mIHF1ZXVlc1xuIik7CisJCXJldHVybjsKKwl9CisKKwl0eHEgPSAmaWwtPnR4cVtzY2RfZmxvd107CisJc3RhX2lkID0gYmFfcmVzcC0+c3RhX2lkOworCXRpZCA9IGJhX3Jlc3AtPnRpZDsKKwlhZ2cgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOworCWlmICh1bmxpa2VseShhZ2ctPnR4cV9pZCAhPSBzY2RfZmxvdykpIHsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgaXMgYSB1Q29kZSBidWcgd2hpY2ggbmVlZCB0byBiZSBhZGRyZXNzZWQsCisJCSAqIGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIHJldHVybiBmb3Igbm93IQorCQkgKiBzaW5jZSBpdCBpcyBwb3NzaWJsZSBoYXBwZW4gdmVyeSBvZnRlbiBhbmQgaW4gb3JkZXIKKwkJICogbm90IHRvIGZpbGwgdGhlIHN5c2xvZywgZG9uJ3QgZW5hYmxlIHRoZSBsb2dnaW5nIGJ5IGRlZmF1bHQKKwkJICovCisJCURfVFhfUkVQTFkoIkJBIHNjZF9mbG93ICVkIGRvZXMgbm90IG1hdGNoIHR4cV9pZCAlZFxuIiwKKwkJCSAgIHNjZF9mbG93LCBhZ2ctPnR4cV9pZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5kIGlkeCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luICovCisJaWR4ID0gaWxfcXVldWVfZGVjX3dyYXAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZiwgdHhxLT5xLm5fYmQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJRF9UWF9SRVBMWSgiTl9DT01QUkVTU0VEX0JBIFslZF0gUmVjZWl2ZWQgZnJvbSAlcE0sICIgInN0YV9pZCA9ICVkXG4iLAorCQkgICBhZ2ctPndhaXRfZm9yX2JhLCAodTggKikgJmJhX3Jlc3AtPnN0YV9hZGRyX2xvMzIsCisJCSAgIGJhX3Jlc3AtPnN0YV9pZCk7CisJRF9UWF9SRVBMWSgiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIiAic2NkX2Zsb3cgPSAiCisJCSAgICIlZCwgc2NkX3NzbiA9ICVkXG4iLCBiYV9yZXNwLT50aWQsIGJhX3Jlc3AtPnNlcV9jdGwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfcmVzcC0+Yml0bWFwKSwKKwkJICAgYmFfcmVzcC0+c2NkX2Zsb3csIGJhX3Jlc3AtPnNjZF9zc24pOworCURfVFhfUkVQTFkoIkRBVCBzdGFydF9pZHggPSAlZCwgYml0bWFwID0gMHglbGx4XG4iLCBhZ2ctPnN0YXJ0X2lkeCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZ2ctPmJpdG1hcCk7CisKKwkvKiBVcGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIEFDSyB2cy4gbm90IGZvciBlYWNoIGZyYW1lIGluIHdpbiAqLworCWlsNDk2NV90eF9zdGF0dXNfcmVwbHlfY29tcHJlc3NlZF9iYShpbCwgYWdnLCBiYV9yZXNwKTsKKworCS8qIFJlbGVhc2UgYWxsIFRGRHMgYmVmb3JlIHRoZSBTU04sIGkuZS4gYWxsIFRGRHMgaW4gZnJvbnQgb2YKKwkgKiBibG9jay1hY2sgd2luICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5CisJICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLiAqLworCWlmICh0eHEtPnEucmVhZF9wdHIgIT0gKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYpKSB7CisJCS8qIGNhbGN1bGF0ZSBtYWM4MDIxMSBhbXBkdSBzdyBxdWV1ZSB0byB3YWtlICovCisJCWludCBmcmVlZCA9IGlsNDk2NV90eF9xdWV1ZV9yZWNsYWltKGlsLCBzY2RfZmxvdywgaWR4KTsKKwkJaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShpbCwgc3RhX2lkLCB0aWQsIGZyZWVkKTsKKworCQlpZiAoaWxfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwkJICAgIGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkICYmCisJCSAgICBhZ2ctPnN0YXRlICE9IElMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKQorCQkJaWxfd2FrZV9xdWV1ZShpbCwgdHhxKTsKKworCQlpbDQ5NjVfdHhxX2NoZWNrX2VtcHR5KGlsLCBzdGFfaWQsIHRpZCwgc2NkX2Zsb3cpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitjb25zdCBjaGFyICoKK2lsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKyNkZWZpbmUgVFhfU1RBVFVTX0ZBSUwoeCkgY2FzZSBUWF9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4CisjZGVmaW5lIFRYX1NUQVRVU19QT1NUUE9ORSh4KSBjYXNlIFRYX1NUQVRVU19QT1NUUE9ORV8gIyMgeDogcmV0dXJuICN4CisKKwlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKKwljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgorCQlyZXR1cm4gIlNVQ0NFU1MiOworCQlUWF9TVEFUVVNfUE9TVFBPTkUoREVMQVkpOworCQlUWF9TVEFUVVNfUE9TVFBPTkUoRkVXX0JZVEVTKTsKKwkJVFhfU1RBVFVTX1BPU1RQT05FKFFVSUVUX1BFUklPRCk7CisJCVRYX1NUQVRVU19QT1NUUE9ORShDQUxDX1RUQUspOworCQlUWF9TVEFUVVNfRkFJTChJTlRFUk5BTF9DUk9TU0VEX1JFVFJZKTsKKwkJVFhfU1RBVFVTX0ZBSUwoU0hPUlRfTElNSVQpOworCQlUWF9TVEFUVVNfRkFJTChMT05HX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0ZBSUwoRklGT19VTkRFUlJVTik7CisJCVRYX1NUQVRVU19GQUlMKERSQUlOX0ZMT1cpOworCQlUWF9TVEFUVVNfRkFJTChSRktJTExfRkxVU0gpOworCQlUWF9TVEFUVVNfRkFJTChMSUZFX0VYUElSRSk7CisJCVRYX1NUQVRVU19GQUlMKERFU1RfUFMpOworCQlUWF9TVEFUVVNfRkFJTChIT1NUX0FCT1JURUQpOworCQlUWF9TVEFUVVNfRkFJTChCVF9SRVRSWSk7CisJCVRYX1NUQVRVU19GQUlMKFNUQV9JTlZBTElEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoRlJBR19EUk9QUEVEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoVElEX0RJU0FCTEUpOworCQlUWF9TVEFUVVNfRkFJTChGSUZPX0ZMVVNIRUQpOworCQlUWF9TVEFUVVNfRkFJTChJTlNVRkZJQ0lFTlRfQ0ZfUE9MTCk7CisJCVRYX1NUQVRVU19GQUlMKFBBU1NJVkVfTk9fUlgpOworCQlUWF9TVEFUVVNfRkFJTChOT19CRUFDT05fT05fUkFEQVIpOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7CisKKyN1bmRlZiBUWF9TVEFUVVNfRkFJTAorI3VuZGVmIFRYX1NUQVRVU19QT1NUUE9ORQorfQorI2VuZGlmIC8qIENPTkZJR19JV0xFR0FDWV9ERUJVRyAqLworCitzdGF0aWMgc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKgoraWw0OTY1X3N0YV9hbGxvY19scShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKK3sKKwlpbnQgaSwgcjsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdTMyIHJhdGVfZmxhZ3MgPSAwOworCV9fbGUzMiByYXRlX25fZmxhZ3M7CisKKwlsaW5rX2NtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rX2NtZCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIExRIGNtZC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCisJICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCisJaWYgKGlsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXIgPSBSQVRFXzZNX0lEWDsKKwllbHNlCisJCXIgPSBSQVRFXzFNX0lEWDsKKworCWlmIChyID49IElMX0ZJUlNUX0NDS19SQVRFICYmIHIgPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJcmF0ZV9mbGFncyB8PQorCSAgICBpbDQ5NjVfZmlyc3RfYW50ZW5uYShpbC0+aHdfcGFyYW1zLgorCQkJCSB2YWxpZF90eF9hbnQpIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisJcmF0ZV9uX2ZsYWdzID0gaWw0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MoaWxfcmF0ZXNbcl0ucGxjcCwgcmF0ZV9mbGFncyk7CisJZm9yIChpID0gMDsgaSA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNOyBpKyspCisJCWxpbmtfY21kLT5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MgPSByYXRlX25fZmxhZ3M7CisKKwlsaW5rX2NtZC0+Z2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KKwkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCisJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQorCSAgICBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIH5pbDQ5NjVfZmlyc3RfYW50ZW5uYShpbC0+aHdfcGFyYW1zLgorCQkJCQkJCSAgICAgICB2YWxpZF90eF9hbnQpOworCWlmICghbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spIHsKKwkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPSBBTlRfQUI7CisJfSBlbHNlIGlmIChpbDQ5NjVfbnVtX29mX2FudChpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCkgPT0gMikgeworCQlsaW5rX2NtZC0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9CisJCSAgICBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKKwl9CisKKwlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfZGlzX3N0YXJ0X3RoID0gTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX0RFRjsKKwlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCA9CisJICAgIGNwdV90b19sZTE2KExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYpOworCisJbGlua19jbWQtPnN0YV9pZCA9IHN0YV9pZDsKKworCXJldHVybiBsaW5rX2NtZDsKK30KKworLyoKKyAqIGlsNDk2NV9hZGRfYnNzaWRfc3RhdGlvbiAtIEFkZCB0aGUgc3BlY2lhbCBJQlNTIEJTU0lEIHN0YXRpb24KKyAqCisgKiBGdW5jdGlvbiBzbGVlcHMuCisgKi8KK2ludAoraWw0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJIGNvbnN0IHU4ICphZGRyLCB1OCAqc3RhX2lkX3IpCit7CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3RhX2lkX3IpCisJCSpzdGFfaWRfciA9IElMX0lOVkFMSURfU1RBVElPTjsKKworCXJldCA9IGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgY3R4LCBhZGRyLCAwLCBOVUxMLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgYWRkcik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHN0YV9pZF9yKQorCQkqc3RhX2lkX3IgPSBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfTE9DQUw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwkvKiBTZXQgdXAgZGVmYXVsdCByYXRlIHNjYWxpbmcgdGFibGUgaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLworCWxpbmtfY21kID0gaWw0OTY1X3N0YV9hbGxvY19scShpbCwgc3RhX2lkKTsKKwlpZiAoIWxpbmtfY21kKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTS5cbiIsCisJCSAgICAgICBhZGRyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgbGlua19jbWQsIENNRF9TWU5DLCB0cnVlKTsKKwlpZiAocmV0KQorCQlJTF9FUlIoIkxpbmsgcXVhbGl0eSBjb21tYW5kIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gbGlua19jbWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWw0OTY1X3N0YXRpY193ZXBrZXlfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJIGJvb2wgc2VuZF9pZl9lbXB0eSkKK3sKKwlpbnQgaSwgbm90X2VtcHR5ID0gMDsKKwl1OCBidWZmW3NpemVvZihzdHJ1Y3QgaWxfd2VwX2NtZCkgKworCQlzaXplb2Yoc3RydWN0IGlsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYXTsKKwlzdHJ1Y3QgaWxfd2VwX2NtZCAqd2VwX2NtZCA9IChzdHJ1Y3QgaWxfd2VwX2NtZCAqKWJ1ZmY7CisJc2l6ZV90IGNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbF93ZXBfY21kKTsKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBjdHgtPndlcF9rZXlfY21kLAorCQkuZGF0YSA9IHdlcF9jbWQsCisJCS5mbGFncyA9IENNRF9TWU5DLAorCX07CisKKwltaWdodF9zbGVlcCgpOworCisJbWVtc2V0KHdlcF9jbWQsIDAsCisJICAgICAgIGNtZF9zaXplICsgKHNpemVvZihzdHJ1Y3QgaWxfd2VwX2tleSkgKiBXRVBfS0VZU19NQVgpKTsKKworCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZU19NQVg7IGkrKykgeworCQl3ZXBfY21kLT5rZXlbaV0ua2V5X2lkeCA9IGk7CisJCWlmIChjdHgtPndlcF9rZXlzW2ldLmtleV9zaXplKSB7CisJCQl3ZXBfY21kLT5rZXlbaV0ua2V5X29mZnNldCA9IGk7CisJCQlub3RfZW1wdHkgPSAxOworCQl9IGVsc2UgeworCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBXRVBfSU5WQUxJRF9PRkZTRVQ7CisJCX0KKworCQl3ZXBfY21kLT5rZXlbaV0ua2V5X3NpemUgPSBjdHgtPndlcF9rZXlzW2ldLmtleV9zaXplOworCQltZW1jcHkoJndlcF9jbWQtPmtleVtpXS5rZXlbM10sIGN0eC0+d2VwX2tleXNbaV0ua2V5LAorCQkgICAgICAgY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSk7CisJfQorCisJd2VwX2NtZC0+Z2xvYmFsX2tleV90eXBlID0gV0VQX0tFWV9XRVBfVFlQRTsKKwl3ZXBfY21kLT5udW1fa2V5cyA9IFdFUF9LRVlTX01BWDsKKworCWNtZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgaWxfd2VwX2tleSkgKiBXRVBfS0VZU19NQVg7CisKKwljbWQubGVuID0gY21kX3NpemU7CisKKwlpZiAobm90X2VtcHR5IHx8IHNlbmRfaWZfZW1wdHkpCisJCXJldHVybiBpbF9zZW5kX2NtZChpbCwgJmNtZCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworaW50CitpbDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gaWw0OTY1X3N0YXRpY193ZXBrZXlfY21kKGlsLCBjdHgsIGZhbHNlKTsKK30KKworaW50CitpbDQ5NjVfcmVtb3ZlX2RlZmF1bHRfd2VwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYpCit7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlEX1dFUCgiUmVtb3ZpbmcgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWRcbiIsIGtleWNvbmYtPmtleWlkeCk7CisKKwltZW1zZXQoJmN0eC0+d2VwX2tleXNba2V5Y29uZi0+a2V5aWR4XSwgMCwgc2l6ZW9mKGN0eC0+d2VwX2tleXNbMF0pKTsKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkgeworCQlEX1dFUCgiTm90IHNlbmRpbmcgQ19XRVBLRVkgY29tbWFuZCBkdWUgdG8gUkZLSUxMLlxuIik7CisJCS8qIGJ1dCBrZXlzIGluIGRldmljZSBhcmUgY2xlYXIgYW55d2F5IHNvIHJldHVybiBzdWNjZXNzICovCisJCXJldHVybiAwOworCX0KKwlyZXQgPSBpbDQ5NjVfc3RhdGljX3dlcGtleV9jbWQoaWwsIGN0eCwgMSk7CisJRF9XRVAoIlJlbW92ZSBkZWZhdWx0IFdFUCBrZXk6IGlkeD0lZCByZXQ9JWRcbiIsIGtleWNvbmYtPmtleWlkeCwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAoraWw0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl8xMjggJiYKKwkgICAga2V5Y29uZi0+a2V5bGVuICE9IFdFUF9LRVlfTEVOXzY0KSB7CisJCURfV0VQKCJCYWQgV0VQIGtleSBsZW5ndGggJWRcbiIsIGtleWNvbmYtPmtleWxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWtleWNvbmYtPmZsYWdzICY9IH5JRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisJa2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9ERUZBVUxUOworCWlsLT5zdGF0aW9uc1tjdHgtPmFwX3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisKKwljdHgtPndlcF9rZXlzW2tleWNvbmYtPmtleWlkeF0ua2V5X3NpemUgPSBrZXljb25mLT5rZXlsZW47CisJbWVtY3B5KCZjdHgtPndlcF9rZXlzW2tleWNvbmYtPmtleWlkeF0ua2V5LCAma2V5Y29uZi0+a2V5LAorCSAgICAgICBrZXljb25mLT5rZXlsZW4pOworCisJcmV0ID0gaWw0OTY1X3N0YXRpY193ZXBrZXlfY21kKGlsLCBjdHgsIGZhbHNlKTsKKwlEX1dFUCgiU2V0IGRlZmF1bHQgV0VQIGtleTogbGVuPSVkIGlkeD0lZCByZXQ9JWRcbiIsIGtleWNvbmYtPmtleWxlbiwKKwkgICAgICBrZXljb25mLT5rZXlpZHgsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJa2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfV0VQIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOworCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKKwlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7CisKKwlpZiAoa2V5Y29uZi0+a2V5bGVuID09IFdFUF9LRVlfTEVOXzEyOCkKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSzsKKworCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCisJCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWlkeCA9IGtleWNvbmYtPmtleWlkeDsKKworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJbWVtY3B5KCZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleVszXSwga2V5Y29uZi0+a2V5LAorCSAgICAgICBrZXljb25mLT5rZXlsZW4pOworCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LgorCSAgICAga2V5X2ZsYWdzICYgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0spID09IFNUQV9LRVlfRkxHX05PX0VOQykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0KKwkJICAgIGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgoaWwpOworCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCisJICogaW4gdUNvZGUuICovCisKKwlXQVJOKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCisJICAgICAibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2xlMTYga2V5X2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfQ0NNUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKKworCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKKworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJbWVtY3B5KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkuCisJICAgICBrZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykgPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQorCQkgICAgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChpbCk7CisJLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KKwkgKiBpbiB1Q29kZS4gKi8KKworCVdBUk4oaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKKwkgICAgICJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworc3RhdGljIGludAoraWw0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOworCisJa2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19US0lQIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOworCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKKwlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7CisKKwlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOworCisJa2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSAxNjsKKworCWlmICgoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS4KKwkgICAgIGtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKSA9PSBTVEFfS0VZX0ZMR19OT19FTkMpCisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9CisJCSAgICBpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KGlsKTsKKwkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQorCSAqIGluIHVDb2RlLiAqLworCisJV0FSTihpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VULAorCSAgICAgIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOworCisJLyogVGhpcyBjb3B5IGlzIGFjdXRhbGx5IG5vdCBuZWVkZWQ6IHdlIGdldCB0aGUga2V5IHdpdGggZWFjaCBUWCAqLworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCAxNik7CisKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXksIGtleWNvbmYtPmtleSwgMTYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbDQ5NjVfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBpdjMyLCB1MTYgKiBwaGFzZTFrZXkpCit7CisJdTggc3RhX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZiAoaWxfc2Nhbl9jYW5jZWwoaWwpKSB7CisJCS8qIGNhbmNlbCBzY2FuIGZhaWxlZCwganVzdCBsaXZlIHcvIGJhZCBrZXkgYW5kIHJlbHkKKwkJICAgYnJpZWZseSBvbiBTVyBkZWNyeXB0aW9uICovCisJCXJldHVybjsKKwl9CisKKwlzdGFfaWQgPSBpbF9zdGFfaWRfb3JfYnJvYWRjYXN0KGlsLCBjdHgsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkudGtpcF9yeF90c2NfYnl0ZTIgPSAodTgpIGl2MzI7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHRha1tpXSA9CisJCSAgICBjcHVfdG9fbGUxNihwaGFzZTFrZXlbaV0pOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCisJaWxfc2VuZF9hZGRfc3RhKGlsLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKK30KKworaW50CitpbDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYga2V5X2ZsYWdzOworCXU4IGtleWlkeDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWN0eC0+a2V5X21hcHBpbmdfa2V5cy0tOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWtleV9mbGFncyA9IGxlMTZfdG9fY3B1KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzKTsKKwlrZXlpZHggPSAoa2V5X2ZsYWdzID4+IFNUQV9LRVlfRkxHX0tFWUlEX1BPUykgJiAweDM7CisKKwlEX1dFUCgiUmVtb3ZlIGR5bmFtaWMga2V5OiBpZHg9JWQgc3RhPSVkXG4iLCBrZXljb25mLT5rZXlpZHgsIHN0YV9pZCk7CisKKwlpZiAoa2V5Y29uZi0+a2V5aWR4ICE9IGtleWlkeCkgeworCQkvKiBXZSBuZWVkIHRvIHJlbW92ZSBhIGtleSB3aXRoIGlkeCBkaWZmZXJlbnQgdGhhdCB0aGUgb25lCisJCSAqIGluIHRoZSB1Q29kZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBrZXkgd2UgbmVlZCB0byByZW1vdmUgaGFzCisJCSAqIGJlZW4gcmVwbGFjZWQgYnkgYW5vdGhlciBvbmUgd2l0aCBkaWZmZXJlbnQgaWR4LgorCQkgKiBEb24ndCBkbyBhbnl0aGluZyBhbmQgcmV0dXJuIG9rCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpIHsKKwkJSUxfV0FSTigiUmVtb3Zpbmcgd3Jvbmcga2V5ICVkIDB4JXhcbiIsIGtleWNvbmYtPmtleWlkeCwKKwkJCWtleV9mbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdAorCSAgICAoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0LCAmaWwtPnVjb2RlX2tleV90YWJsZSkpCisJCUlMX0VSUigiaWR4ICVkIG5vdCB1c2VkIGluIHVDb2RlIGtleSB0YWJsZS5cbiIsCisJCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpbF9od19rZXkpKTsKKwltZW1zZXQoJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsIHNpemVvZihzdHJ1Y3QgaWw0OTY1X2tleWluZm8pKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9CisJICAgIFNUQV9LRVlfRkxHX05PX0VOQyB8IFNUQV9LRVlfRkxHX0lOVkFMSUQ7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKworCWlmIChpbF9pc19yZmtpbGwoaWwpKSB7CisJCURfV0VQCisJCSAgICAoIk5vdCBzZW5kaW5nIENfQUREX1NUQSBjb21tYW5kIGJlY2F1c2UgUkZLSUxMIGVuYWJsZWQuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworaW50CitpbDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJY3R4LT5rZXlfbWFwcGluZ19rZXlzKys7CisJa2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9EWU5BTUlDOworCisJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCXJldCA9CisJCSAgICBpbDQ5NjVfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhpbCwgY3R4LCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCXJldCA9CisJCSAgICBpbDQ5NjVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhpbCwgY3R4LCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQlyZXQgPSBpbDQ5NjVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKGlsLCBjdHgsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBhbGc6ICVzIGNpcGhlciA9ICV4XG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGtleWNvbmYtPmNpcGhlcik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJRF9XRVAoIlNldCBkeW5hbWljIGtleTogY2lwaGVyPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVkIHJldD0lZFxuIiwKKwkgICAgICBrZXljb25mLT5jaXBoZXIsIGtleWNvbmYtPmtleWxlbiwga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uIC0gYWRkIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gZHJpdmVyJ3Mgc3RhdGlvbiB0YWJsZS4KKyAqCisgKiBUaGlzIGFkZHMgdGhlIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gdGhlIGRyaXZlcidzIHN0YXRpb24gdGFibGUKKyAqIGFuZCBtYXJrcyBpdCBkcml2ZXIgYWN0aXZlLCBzbyB0aGF0IGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhlCisgKiBkZXZpY2UgYXQgdGhlIG5leHQgYmVzdCB0aW1lLgorICovCitpbnQKK2lsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpsaW5rX2NtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHN0YV9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgaWxfYmNhc3RfYWRkciwgZmFsc2UsIE5VTEwpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIHByZXBhcmUgYnJvYWRjYXN0IHN0YXRpb25cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9EUklWRVJfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX0JDQVNUOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJbGlua19jbWQgPSBpbDQ5NjVfc3RhX2FsbG9jX2xxKGlsLCBzdGFfaWQpOworCWlmICghbGlua19jbWQpIHsKKwkJSUxfRVJSCisJCSAgICAoIlVuYWJsZSB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZyBmb3IgYmNhc3Qgc3RhdGlvbi5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbiAtIHVwZGF0ZSBicm9hZGNhc3Qgc3RhdGlvbidzIExRIGNvbW1hbmQKKyAqCisgKiBPbmx5IHVzZWQgYnkgaXdsNDk2NS4gUGxhY2VkIGhlcmUgdG8gaGF2ZSBhbGwgYmNhc3Qgc3RhdGlvbiBtYW5hZ2VtZW50CisgKiBjb2RlIHRvZ2V0aGVyLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdTggc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7CisKKwlsaW5rX2NtZCA9IGlsNDk2NV9zdGFfYWxsb2NfbHEoaWwsIHN0YV9pZCk7CisJaWYgKCFsaW5rX2NtZCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZyBmb3IgYmNhc3Qgc3RhLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpZiAoaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEpCisJCWtmcmVlKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKKwllbHNlCisJCURfSU5GTygiQmNhc3Qgc3RhIHJhdGUgc2NhbGluZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXG4iKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIGlsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihpbCwgJmlsLT5jdHgpOworfQorCisvKioKKyAqIGlsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQgLSBFbmFibGUgVHggZm9yIHRoaXMgVElEIGluIHN0YXRpb24gdGFibGUKKyAqLworaW50CitpbDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgaW50IHRpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJLyogUmVtb3ZlICJkaXNhYmxlIiBmbGFnLCB0byBlbmFibGUgVHggZm9yIHRoaXMgVElEICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX1RJRF9ESVNBQkxFX1RYOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS50aWRfZGlzYWJsZV90eCAmPSBjcHVfdG9fbGUxNih+KDEgPDwgdGlkKSk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworfQorCitpbnQKK2lsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IHRpZCwKKwkJCXUxNiBzc24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhX2lkOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJc3RhX2lkID0gaWxfc3RhX2lkKHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9BRERCQV9USURfTVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5hZGRfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCkgdGlkOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNwdV90b19sZTE2KHNzbik7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworfQorCitpbnQKK2lsNDk2NV9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBpbnQgdGlkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YV9pZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiSW52YWxpZCBzdGF0aW9uIGZvciBBR0cgdGlkICVkXG4iLCB0aWQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSAwOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkID0gKHU4KSB0aWQ7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworfQorCit2b2lkCitpbDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCBjbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFncyB8PSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0KKwkgICAgU1RBX01PRElGWV9TTEVFUF9UWF9DT1VOVF9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnNsZWVwX3R4X2NvdW50ID0gY3B1X3RvX2xlMTYoY250KTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJaWxfc2VuZF9hZGRfc3RhKGlsLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQKK2lsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKSB7CisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsICZpbC0+Y3R4KTsKKwkJaWYgKGlsLT5jdHguYWN0aXZlLnJ4X2NoYWluICE9IGlsLT5jdHguc3RhZ2luZy5yeF9jaGFpbikKKwkJCWlsX2NvbW1pdF9yeG9uKGlsLCAmaWwtPmN0eCk7CisJfQorfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2NsZWFyX2ZyZWVfZnJhbWVzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCisJRF9JTkZPKCIlZCBmcmFtZXMgb24gcHJlLWFsbG9jYXRlZCBoZWFwIG9uIGNsZWFyLlxuIiwgaWwtPmZyYW1lc19jb3VudCk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlsLT5mcmVlX2ZyYW1lcykpIHsKKwkJZWxlbWVudCA9IGlsLT5mcmVlX2ZyYW1lcy5uZXh0OworCQlsaXN0X2RlbChlbGVtZW50KTsKKwkJa2ZyZWUobGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfZnJhbWUsIGxpc3QpKTsKKwkJaWwtPmZyYW1lc19jb3VudC0tOworCX0KKworCWlmIChpbC0+ZnJhbWVzX2NvdW50KSB7CisJCUlMX1dBUk4oIiVkIGZyYW1lcyBzdGlsbCBpbiB1c2UuICBEaWQgd2UgbG9zZSBvbmU/XG4iLAorCQkJaWwtPmZyYW1lc19jb3VudCk7CisJCWlsLT5mcmFtZXNfY291bnQgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbF9mcmFtZSAqCitpbDQ5NjVfZ2V0X2ZyZWVfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9mcmFtZSAqZnJhbWU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlpZiAobGlzdF9lbXB0eSgmaWwtPmZyZWVfZnJhbWVzKSkgeworCQlmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKCpmcmFtZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWZyYW1lKSB7CisJCQlJTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSFcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpbC0+ZnJhbWVzX2NvdW50Kys7CisJCXJldHVybiBmcmFtZTsKKwl9CisKKwllbGVtZW50ID0gaWwtPmZyZWVfZnJhbWVzLm5leHQ7CisJbGlzdF9kZWwoZWxlbWVudCk7CisJcmV0dXJuIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsX2ZyYW1lLCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2ZyYW1lICpmcmFtZSkKK3sKKwltZW1zZXQoZnJhbWUsIDAsIHNpemVvZigqZnJhbWUpKTsKKwlsaXN0X2FkZCgmZnJhbWUtPmxpc3QsICZpbC0+ZnJlZV9mcmFtZXMpOworfQorCitzdGF0aWMgdTMyCitpbDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJIGludCBsZWZ0KQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsLT5iZWFjb25fc2tiKQorCQlyZXR1cm4gMDsKKworCWlmIChpbC0+YmVhY29uX3NrYi0+bGVuID4gbGVmdCkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoaGRyLCBpbC0+YmVhY29uX3NrYi0+ZGF0YSwgaWwtPmJlYWNvbl9za2ItPmxlbik7CisKKwlyZXR1cm4gaWwtPmJlYWNvbl9za2ItPmxlbjsKK30KKworLyogUGFyc2UgdGhlIGJlYWNvbiBmcmFtZSB0byBmaW5kIHRoZSBUSU0gZWxlbWVudCBhbmQgc2V0IHRpbV9pZHggJiB0aW1fc2l6ZSAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9zZXRfYmVhY29uX3RpbShzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCSAgICAgIHN0cnVjdCBpbF90eF9iZWFjb25fY21kICp0eF9iZWFjb25fY21kLCB1OCAqIGJlYWNvbiwKKwkJICAgICAgdTMyIGZyYW1lX3NpemUpCit7CisJdTE2IHRpbV9pZHg7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJlYWNvbjsKKworCS8qCisJICogVGhlIGlkeCBpcyByZWxhdGl2ZSB0byBmcmFtZSBzdGFydCBidXQgd2Ugc3RhcnQgbG9va2luZyBhdCB0aGUKKwkgKiB2YXJpYWJsZS1sZW5ndGggcGFydCBvZiB0aGUgYmVhY29uLgorCSAqLworCXRpbV9pZHggPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZSAtIGJlYWNvbjsKKworCS8qIFBhcnNlIHZhcmlhYmxlLWxlbmd0aCBlbGVtZW50cyBvZiBiZWFjb24gdG8gZmluZCBXTEFOX0VJRF9USU0gKi8KKwl3aGlsZSAoKHRpbV9pZHggPCAoZnJhbWVfc2l6ZSAtIDIpKSAmJgorCSAgICAgICAoYmVhY29uW3RpbV9pZHhdICE9IFdMQU5fRUlEX1RJTSkpCisJCXRpbV9pZHggKz0gYmVhY29uW3RpbV9pZHggKyAxXSArIDI7CisKKwkvKiBJZiBUSU0gZmllbGQgd2FzIGZvdW5kLCBzZXQgdmFyaWFibGVzICovCisJaWYgKCh0aW1faWR4IDwgKGZyYW1lX3NpemUgLSAxKSkgJiYgKGJlYWNvblt0aW1faWR4XSA9PSBXTEFOX0VJRF9USU0pKSB7CisJCXR4X2JlYWNvbl9jbWQtPnRpbV9pZHggPSBjcHVfdG9fbGUxNih0aW1faWR4KTsKKwkJdHhfYmVhY29uX2NtZC0+dGltX3NpemUgPSBiZWFjb25bdGltX2lkeCArIDFdOworCX0gZWxzZQorCQlJTF9XQVJOKCJVbmFibGUgdG8gZmluZCBUSU0gRWxlbWVudCBpbiBiZWFjb25cbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitpbDQ5NjVfaHdfZ2V0X2JlYWNvbl9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZnJhbWUgKmZyYW1lKQoreworCXN0cnVjdCBpbF90eF9iZWFjb25fY21kICp0eF9iZWFjb25fY21kOworCXUzMiBmcmFtZV9zaXplOworCXUzMiByYXRlX2ZsYWdzOworCXUzMiByYXRlOworCS8qCisJICogV2UgaGF2ZSB0byBzZXQgdXAgdGhlIFRYIGNvbW1hbmQsIHRoZSBUWCBCZWFjb24gY29tbWFuZCwgYW5kIHRoZQorCSAqIGJlYWNvbiBjb250ZW50cy4KKwkgKi8KKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsLT5iZWFjb25fY3R4KSB7CisJCUlMX0VSUigidHJ5aW5nIHRvIGJ1aWxkIGJlYWNvbiB3L28gYmVhY29uIGNvbnRleHQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSW5pdGlhbGl6ZSBtZW1vcnkgKi8KKwl0eF9iZWFjb25fY21kID0gJmZyYW1lLT51LmJlYWNvbjsKKwltZW1zZXQodHhfYmVhY29uX2NtZCwgMCwgc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7CisKKwkvKiBTZXQgdXAgVFggYmVhY29uIGNvbnRlbnRzICovCisJZnJhbWVfc2l6ZSA9CisJICAgIGlsNDk2NV9maWxsX2JlYWNvbl9mcmFtZShpbCwgdHhfYmVhY29uX2NtZC0+ZnJhbWUsCisJCQkJICAgICBzaXplb2YoZnJhbWUtPnUpIC0gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7CisJaWYgKFdBUk5fT05fT05DRShmcmFtZV9zaXplID4gTUFYX01QRFVfU0laRSkpCisJCXJldHVybiAwOworCWlmICghZnJhbWVfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZXQgdXAgVFggY29tbWFuZCBmaWVsZHMgKi8KKwl0eF9iZWFjb25fY21kLT50eC5sZW4gPSBjcHVfdG9fbGUxNigodTE2KSBmcmFtZV9zaXplKTsKKwl0eF9iZWFjb25fY21kLT50eC5zdGFfaWQgPSBpbC0+YmVhY29uX2N0eC0+YmNhc3Rfc3RhX2lkOworCXR4X2JlYWNvbl9jbWQtPnR4LnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOworCXR4X2JlYWNvbl9jbWQtPnR4LnR4X2ZsYWdzID0KKwkgICAgVFhfQ01EX0ZMR19TRVFfQ1RMX01TSyB8IFRYX0NNRF9GTEdfVFNGX01TSyB8CisJICAgIFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOworCisJLyogU2V0IHVwIFRYIGJlYWNvbiBjb21tYW5kIGZpZWxkcyAqLworCWlsNDk2NV9zZXRfYmVhY29uX3RpbShpbCwgdHhfYmVhY29uX2NtZCwgKHU4ICopIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAorCQkJICAgICAgZnJhbWVfc2l6ZSk7CisKKwkvKiBTZXQgdXAgcGFja2V0IHJhdGUgYW5kIGZsYWdzICovCisJcmF0ZSA9IGlsX2dldF9sb3dlc3RfcGxjcChpbCwgaWwtPmJlYWNvbl9jdHgpOworCWlsLT5tZ210X3R4X2FudCA9CisJICAgIGlsNDk2NV90b2dnbGVfdHhfYW50KGlsLCBpbC0+bWdtdF90eF9hbnQsCisJCQkJIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKwlyYXRlX2ZsYWdzID0gaWw0OTY1X2FudF9pZHhfdG9fZmxhZ3MoaWwtPm1nbXRfdHhfYW50KTsKKwlpZiAoKHJhdGUgPj0gSUxfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlIDw9IElMX0xBU1RfQ0NLX1JBVEUpKQorCQlyYXRlX2ZsYWdzIHw9IFJBVEVfTUNTX0NDS19NU0s7CisJdHhfYmVhY29uX2NtZC0+dHgucmF0ZV9uX2ZsYWdzID0KKwkgICAgaWw0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MocmF0ZSwgcmF0ZV9mbGFncyk7CisKKwlyZXR1cm4gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSArIGZyYW1lX3NpemU7Cit9CisKK2ludAoraWw0OTY1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgcmM7CisKKwlmcmFtZSA9IGlsNDk2NV9nZXRfZnJlZV9mcmFtZShpbCk7CisJaWYgKCFmcmFtZSkgeworCQlJTF9FUlIoIkNvdWxkIG5vdCBvYnRhaW4gZnJlZSBmcmFtZSBidWZmZXIgZm9yIGJlYWNvbiAiCisJCSAgICAgICAiY29tbWFuZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmcmFtZV9zaXplID0gaWw0OTY1X2h3X2dldF9iZWFjb25fY21kKGlsLCBmcmFtZSk7CisJaWYgKCFmcmFtZV9zaXplKSB7CisJCUlMX0VSUigiRXJyb3IgY29uZmlndXJpbmcgdGhlIGJlYWNvbiBjb21tYW5kXG4iKTsKKwkJaWw0OTY1X2ZyZWVfZnJhbWUoaWwsIGZyYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfVFhfQkVBQ09OLCBmcmFtZV9zaXplLCAmZnJhbWUtPnUuY21kWzBdKTsKKworCWlsNDk2NV9mcmVlX2ZyYW1lKGlsLCBmcmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAoraWw0OTY1X3RmZF90Yl9nZXRfYWRkcihzdHJ1Y3QgaWxfdGZkICp0ZmQsIHU4IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKKwkJYWRkciB8PQorCQkgICAgKChkbWFfYWRkcl90KSAobGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RikgPDwgMTYpIDw8CisJCSAgICAxNjsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHUxNgoraWw0OTY1X3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpbF90ZmQgKnRmZCwgdTggaWR4KQoreworCXN0cnVjdCBpbF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CisKKwlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsNDk2NV90ZmRfc2V0X3RiKHN0cnVjdCBpbF90ZmQgKnRmZCwgdTggaWR4LCBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4pCit7CisJc3RydWN0IGlsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKwl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKKworCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCisJdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOworCisJdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKK30KKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X3RmZF9nZXRfbnVtX3RicyhzdHJ1Y3QgaWxfdGZkICp0ZmQpCit7CisJcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X3R4cV9mcmVlX3RmZCAtIEZyZWUgYWxsIGNodW5rcyByZWZlcmVuY2VkIGJ5IFRGRCBbdHhxLT5xLnJlYWRfcHRyXQorICogQGlsIC0gZHJpdmVyIGlsYXRlIGRhdGEKKyAqIEB0eHEgLSB0eCBxdWV1ZQorICoKKyAqIERvZXMgTk9UIGFkdmFuY2UgYW55IFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpZHhlcworICogRG9lcyBOT1QgZnJlZSB0aGUgVEZEIGl0c2VsZiAod2hpY2ggaXMgd2l0aGluIGNpcmN1bGFyIGJ1ZmZlcikKKyAqLwordm9pZAoraWw0OTY1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXN0cnVjdCBpbF90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGlsX3RmZCAqKXR4cS0+dGZkczsKKwlzdHJ1Y3QgaWxfdGZkICp0ZmQ7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGlsLT5wY2lfZGV2OworCWludCBpZHggPSB0eHEtPnEucmVhZF9wdHI7CisJaW50IGk7CisJaW50IG51bV90YnM7CisKKwl0ZmQgPSAmdGZkX3RtcFtpZHhdOworCisJLyogU2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBjaHVua3MgKi8KKwludW1fdGJzID0gaWw0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCisJaWYgKG51bV90YnMgPj0gSUxfTlVNX09GX1RCUykgeworCQlJTF9FUlIoIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOworCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFVubWFwIHR4X2NtZCAqLworCWlmIChudW1fdGJzKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpZHhdLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2lkeF0sIGxlbiksCisJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBVbm1hcCBjaHVua3MsIGlmIGFueS4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgbnVtX3RiczsgaSsrKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgaWw0OTY1X3RmZF90Yl9nZXRfYWRkcih0ZmQsIGkpLAorCQkJCSBpbDQ5NjVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkvKiBmcmVlIFNLQiAqLworCWlmICh0eHEtPnR4YikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiOworCisJCS8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpcnFzLWRpc2FibGVkIGNvbnRleHQgKi8KKwkJaWYgKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKKwkJfQorCX0KK30KKworaW50CitpbDQ5NjVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKQoreworCXN0cnVjdCBpbF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgaWxfdGZkICp0ZmQsICp0ZmRfdG1wOworCXUzMiBudW1fdGJzOworCisJcSA9ICZ0eHEtPnE7CisJdGZkX3RtcCA9IChzdHJ1Y3QgaWxfdGZkICopdHhxLT50ZmRzOworCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07CisKKwlpZiAocmVzZXQpCisJCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7CisKKwludW1fdGJzID0gaWw0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCisJLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSAyMCBUeCBidWZmZXJzICovCisJaWYgKG51bV90YnMgPj0gSUxfTlVNX09GX1RCUykgeworCQlJTF9FUlIoIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAorCQkgICAgICAgSUxfTlVNX09GX1RCUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUJVR19PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpOworCWlmICh1bmxpa2VseShhZGRyICYgfklMX1RYX0RNQV9NQVNLKSkKKwkJSUxfRVJSKCJVbmFsaWduZWQgYWRkcmVzcyA9ICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcik7CisKKwlpbDQ5NjVfdGZkX3NldF90Yih0ZmQsIG51bV90YnMsIGFkZHIsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRlbGwgbmljIHdoZXJlIHRvIGZpbmQgY2lyY3VsYXIgYnVmZmVyIG9mIFR4IEZyYW1lIERlc2NyaXB0b3JzIGZvcgorICogZ2l2ZW4gVHggcXVldWUsIGFuZCBlbmFibGUgdGhlIERNQSBjaGFubmVsIHVzZWQgZm9yIHRoYXQgcXVldWUuCisgKgorICogNDk2NSBzdXBwb3J0cyB1cCB0byAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwgbWFwcGVkIHRvIHVwIHRvIDggVHggRE1BCisgKiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuCisgKi8KK2ludAoraWw0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSkKK3sKKwlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCisJLyogQ2lyY3VsYXIgYnVmZmVyIChURkQgcXVldWUgaW4gRFJBTSkgcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCisJaWxfd3IoaWwsIEZINDlfTUVNX0NCQkNfUVVFVUUodHhxX2lkKSwgdHhxLT5xLmRtYV9hZGRyID4+IDgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmljIFJYIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfaGRsX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKKworCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7CisKKwlEX0lORk8oIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIiAiMHglMDFYIDB4JTAxWFxuIiwKKwkgICAgICAgcGFsaXZlLT5pc192YWxpZCwgcGFsaXZlLT52ZXJfdHlwZSwgcGFsaXZlLT52ZXJfc3VidHlwZSk7CisKKwlpZiAocGFsaXZlLT52ZXJfc3VidHlwZSA9PSBJTklUSUFMSVpFX1NVQlRZUEUpIHsKKwkJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCQltZW1jcHkoJmlsLT5jYXJkX2FsaXZlX2luaXQsICZwa3QtPnUuYWxpdmVfZnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2luaXRfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+aW5pdF9hbGl2ZV9zdGFydDsKKwl9IGVsc2UgeworCQlEX0lORk8oIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwkJbWVtY3B5KCZpbC0+Y2FyZF9hbGl2ZSwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+YWxpdmVfc3RhcnQ7CisJfQorCisJLyogV2UgZGVsYXkgdGhlIEFMSVZFIHJlc3BvbnNlIGJ5IDVtcyB0bworCSAqIGdpdmUgdGhlIEhXIFJGIEtpbGwgdGltZSB0byBhY3RpdmF0ZS4uLiAqLworCWlmIChwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgcHdvcmssIG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCWVsc2UKKwkJSUxfV0FSTigidUNvZGUgZGlkIG5vdCByZXNwb25kIE9LLlxuIik7Cit9CisKKy8qKgorICogaWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljIC0gVGltZXIgY2FsbGJhY2sgdG8gcXVldWUgc3RhdHMKKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGluIG9yZGVyIHRvIHNlbmQgYSBzdGF0cyByZXF1ZXN0LgorICoKKyAqIFRoaXMgdGltZXIgZnVuY3Rpb24gaXMgY29udGludWFsbHkgcmVzZXQgdG8gZXhlY3V0ZSB3aXRoaW4KKyAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IE5fU1RBVFMKKyAqIHdhcyByZWNlaXZlZC4gIFdlIG5lZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUgdGhlIHN0YXRzIGluIG9yZGVyCisgKiB0byB1cGRhdGUgdGhlIHRlbXBlcmF0dXJlIHVzZWQgZm9yIGNhbGlicmF0aW5nIHRoZSBUWFBPV0VSLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilkYXRhOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCS8qIGRvbnQgc2VuZCBob3N0IGNvbW1hbmQgaWYgcmYta2lsbCBpcyBvbiAqLworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm47CisKKwlpbF9zZW5kX3N0YXRzX3JlcXVlc3QoaWwsIENNRF9BU1lOQywgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiAqYmVhY29uID0KKwkgICAgKHN0cnVjdCBpbDQ5NjVfYmVhY29uX25vdGlmICopcGt0LT51LnJhdzsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1OCByYXRlID0gaWw0OTY1X2h3X2dldF9yYXRlKGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZV9uX2ZsYWdzKTsKKworCURfUlgoImJlYWNvbiBzdGF0dXMgJXggcmV0cmllcyAlZCBpc3MgJWQgIiAidHNmICVkICVkIHJhdGUgJWRcbiIsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnUuc3RhdHVzKSAmIFRYX1NUQVRVU19NU0ssCisJICAgICBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCisJICAgICBsZTMyX3RvX2NwdShiZWFjb24tPmhpZ2hfdHNmKSwgbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7CisjZW5kaWYKKworCWlsLT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEX1BPV0VSKCJTdG9wIGFsbCBxdWV1ZXNcbiIpOworCisJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaWwtPmh3KTsKKworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAorCSAgICAgICBDU1JfVUNPREVfRFJWX0dQMV9SRUdfQklUX0NUX0tJTExfRVhJVCk7CisJX2lsX3JkKGlsLCBDU1JfVUNPREVfRFJWX0dQMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKKy8qIEhhbmRsZSBub3RpZmljYXRpb24gZnJvbSB1Q29kZSB0aGF0IGNhcmQncyBwb3dlciBzdGF0ZSBpcyBjaGFuZ2luZworICogZHVlIHRvIHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgY3JpdGljYWwgdGVtcGVyYXR1cmUgUkZLSUxMICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9jYXJkX3N0YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaWwtPnN0YXR1czsKKworCURfUkZfS0lMTCgiQ2FyZCBzdGF0ZSByZWNlaXZlZDogSFc6JXMgU1c6JXMgQ1Q6JXNcbiIsCisJCSAgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAorCQkgIChmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKKwkJICAoZmxhZ3MgJiBDVF9DQVJEX0RJU0FCTEVEKSA/ICJSZWFjaGVkIiA6ICJOb3QgcmVhY2hlZCIpOworCisJaWYgKGZsYWdzICYgKFNXX0NBUkRfRElTQUJMRUQgfCBIV19DQVJEX0RJU0FCTEVEIHwgQ1RfQ0FSRF9ESVNBQkxFRCkpIHsKKworCQlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKKwkJICAgICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwkJaWxfd3IoaWwsIEhCVVNfVEFSR19NQlhfQywgSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOworCisJCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkgeworCQkJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCisJCQkgICAgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKKwkJCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUJYX0MsCisJCQkgICAgICBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCk7CisJCX0KKwl9CisKKwlpZiAoZmxhZ3MgJiBDVF9DQVJEX0RJU0FCTEVEKQorCQlpbDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soaWwpOworCisJaWYgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkKKwkJaWxfc2Nhbl9jYW5jZWwoaWwpOworCisJaWYgKCh0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9CisJICAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSkpCisJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwKKwkJCQkJICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSk7CisJZWxzZQorCQl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKK30KKworLyoqCisgKiBpbDQ5NjVfc2V0dXBfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCisgKgorICogU2V0dXAgdGhlIFJYIGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZSByZXBseSB0eXBlcyBzZW50IGZyb20gdGhlIHVDb2RlCisgKiB0byB0aGUgaG9zdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYWlucyBpbnRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyBmb3IgdGhlbSB0byBzZXR1cAorICogYW55IGhhcmR3YXJlIHNwZWNpZmljIGhhbmRsZXJzIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfc2V0dXBfaGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5oYW5kbGVyc1tOX0FMSVZFXSA9IGlsNDk2NV9oZGxfYWxpdmU7CisJaWwtPmhhbmRsZXJzW05fRVJST1JdID0gaWxfaGRsX2Vycm9yOworCWlsLT5oYW5kbGVyc1tOX0NIQU5ORUxfU1dJVENIXSA9IGlsX2hkbF9jc2E7CisJaWwtPmhhbmRsZXJzW05fU1BFQ1RSVU1fTUVBU1VSRU1FTlRdID0gaWxfaGRsX3NwZWN0cnVtX21lYXN1cmVtZW50OworCWlsLT5oYW5kbGVyc1tOX1BNX1NMRUVQXSA9IGlsX2hkbF9wbV9zbGVlcDsKKwlpbC0+aGFuZGxlcnNbTl9QTV9ERUJVR19TVEFUU10gPSBpbF9oZGxfcG1fZGVidWdfc3RhdHM7CisJaWwtPmhhbmRsZXJzW05fQkVBQ09OXSA9IGlsNDk2NV9oZGxfYmVhY29uOworCisJLyoKKwkgKiBUaGUgc2FtZSBoYW5kbGVyIGlzIHVzZWQgZm9yIGJvdGggdGhlIFJFUExZIHRvIGEgZGlzY3JldGUKKwkgKiBzdGF0cyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCisJICogc3RhdHMgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCisJICovCisJaWwtPmhhbmRsZXJzW0NfU1RBVFNdID0gaWw0OTY1X2hkbF9jX3N0YXRzOworCWlsLT5oYW5kbGVyc1tOX1NUQVRTXSA9IGlsNDk2NV9oZGxfc3RhdHM7CisKKwlpbF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKGlsKTsKKworCS8qIHN0YXR1cyBjaGFuZ2UgaGFuZGxlciAqLworCWlsLT5oYW5kbGVyc1tOX0NBUkRfU1RBVEVdID0gaWw0OTY1X2hkbF9jYXJkX3N0YXRlOworCisJaWwtPmhhbmRsZXJzW05fTUlTU0VEX0JFQUNPTlNdID0gaWw0OTY1X2hkbF9taXNzZWRfYmVhY29uOworCS8qIFJ4IGhhbmRsZXJzICovCisJaWwtPmhhbmRsZXJzW05fUlhfUEhZXSA9IGlsNDk2NV9oZGxfcnhfcGh5OworCWlsLT5oYW5kbGVyc1tOX1JYX01QRFVdID0gaWw0OTY1X2hkbF9yeDsKKwkvKiBibG9jayBhY2sgKi8KKwlpbC0+aGFuZGxlcnNbTl9DT01QUkVTU0VEX0JBXSA9IGlsNDk2NV9oZGxfY29tcHJlc3NlZF9iYTsKKwkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+aGFuZGxlcl9zZXR1cChpbCk7Cit9CisKKy8qKgorICogaWw0OTY1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQorICoKKyAqIFVzZXMgdGhlIGlsLT5oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKKyAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAorICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCisgKi8KK3ZvaWQKK2lsNDk2NV9yeF9oYW5kbGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwl1MzIgciwgaTsKKwlpbnQgcmVjbGFpbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGZpbGxfcnggPSAwOworCXUzMiBjb3VudCA9IDg7CisJaW50IHRvdGFsX2VtcHR5OworCisJLyogdUNvZGUncyByZWFkIGlkeCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKKwkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLworCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgMHgwRkZGOworCWkgPSByeHEtPnJlYWQ7CisKKwkvKiBSeCBpbnRlcnJ1cHQsIGJ1dCBub3RoaW5nIHNlbnQgZnJvbSB1Q29kZSAqLworCWlmIChpID09IHIpCisJCURfUlgoInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKKworCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCisJdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7CisJaWYgKHRvdGFsX2VtcHR5IDwgMCkKKwkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKKworCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCisJCWZpbGxfcnggPSAxOworCisJd2hpbGUgKGkgIT0gcikgeworCQlpbnQgbGVuOworCisJCXJ4YiA9IHJ4cS0+cXVldWVbaV07CisKKwkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LAorCQkgKiB0aGVuIGEgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHF1ZXVlIHJlZmlsbGluZworCQkgKiByb3V0aW5lcyAtLSBjYXRjaCBpdCBoZXJlICovCisJCUJVR19PTihyeGIgPT0gTlVMTCk7CisKKwkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7CisKKwkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCisJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwa3QgPSByeGJfYWRkcihyeGIpOworCisJCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0s7CisJCWxlbiArPSBzaXplb2YodTMyKTsJLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KKworCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCisJCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCisJCSAqIElmIHRoZSBwYWNrZXQgKGUuZy4gUnggZnJhbWUpIG9yaWdpbmF0ZWQgZnJvbSB1Q29kZSwKKwkJICogICB0aGVyZSBpcyBubyBjb21tYW5kIGJ1ZmZlciB0byByZWNsYWltLgorCQkgKiBVY29kZSBzaG91bGQgc2V0IFNFUV9SWF9GUkFNRSBiaXQgaWYgdWNvZGUtb3JpZ2luYXRlZCwKKwkJICogICBidXQgYXBwYXJlbnRseSBhIGZldyBkb24ndCBnZXQgc2V0OyBjYXRjaCB0aGVtIGhlcmUuICovCisJCXJlY2xhaW0gPSAhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX1JYX0ZSQU1FKSAmJgorCQkgICAgKHBrdC0+aGRyLmNtZCAhPSBOX1JYX1BIWSkgJiYgKHBrdC0+aGRyLmNtZCAhPSBOX1JYKSAmJgorCQkgICAgKHBrdC0+aGRyLmNtZCAhPSBOX1JYX01QRFUpICYmCisJCSAgICAocGt0LT5oZHIuY21kICE9IE5fQ09NUFJFU1NFRF9CQSkgJiYKKwkJICAgIChwa3QtPmhkci5jbWQgIT0gTl9TVEFUUykgJiYgKHBrdC0+aGRyLmNtZCAhPSBDX1RYKTsKKworCQkvKiBCYXNlZCBvbiB0eXBlIG9mIGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uLAorCQkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCisJCSAqICAgaGFuZGxlcnMgdGFibGUuICBTZWUgaWw0OTY1X3NldHVwX2hhbmRsZXJzKCkgKi8KKwkJaWYgKGlsLT5oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7CisJCQlEX1JYKCJyID0gJWQsIGkgPSAlZCwgJXMsIDB4JTAyeFxuIiwgciwgaSwKKwkJCSAgICAgaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKKwkJCWlsLT5pc3Jfc3RhdHMuaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOworCQkJaWwtPmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKGlsLCByeGIpOworCQl9IGVsc2UgeworCQkJLyogTm8gaGFuZGxpbmcgbmVlZGVkICovCisJCQlEX1JYKCJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsIHIsCisJCQkgICAgIGksIGlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7CisJCX0KKworCQkvKgorCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCisJCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKKwkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgaGFuZGxlciBtaWdodCBoYXZlCisJCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgorCQkgKi8KKworCQlpZiAocmVjbGFpbSkgeworCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAorCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nIGlsX3NlbmRfY21kKCkKKwkJCSAqIGFzIHdlIHJlY2xhaW0gdGhlIGRyaXZlciBjb21tYW5kIHF1ZXVlICovCisJCQlpZiAocnhiLT5wYWdlKQorCQkJCWlsX3R4X2NtZF9jb21wbGV0ZShpbCwgcnhiKTsKKwkJCWVsc2UKKwkJCQlJTF9XQVJOKCJDbGFpbSBudWxsIHJ4Yj9cbiIpOworCQl9CisKKwkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKKwkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCisJCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7CisJCQlyeGItPnBhZ2VfZG1hID0KKwkJCSAgICBwY2lfbWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwgMCwKKwkJCQkJIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLgorCQkJCQkgcnhfcGFnZV9vcmRlciwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJfSBlbHNlCisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCisJCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbnQgYXNzZXJ0LiAqLworCQlpZiAoZmlsbF9yeCkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+PSA4KSB7CisJCQkJcnhxLT5yZWFkID0gaTsKKwkJCQlpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhpbCk7CisJCQkJY291bnQgPSAwOworCQkJfQorCQl9CisJfQorCisJLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLworCXJ4cS0+cmVhZCA9IGk7CisJaWYgKGZpbGxfcngpCisJCWlsNDk2NV9yeF9yZXBsZW5pc2hfbm93KGlsKTsKKwllbHNlCisJCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZsdXNoIGFueSBzY2hlZHVsZWQgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkCitpbDQ5NjVfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBmbHVzaCBwZW5kaW5nIHRhc2tsZXQgKi8KKwlzeW5jaHJvbml6ZV9pcnEoaWwtPnBjaV9kZXYtPmlycSk7CisJdGFza2xldF9raWxsKCZpbC0+aXJxX3Rhc2tsZXQpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2lycV90YXNrbGV0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgaW50YSwgaGFuZGxlZCA9IDA7CisJdTMyIGludGFfZmg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1MzIgaW50YV9tYXNrOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCisJICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCisJICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCisJaW50YSA9IF9pbF9yZChpbCwgQ1NSX0lOVCk7CisJX2lsX3dyKGlsLCBDU1JfSU5ULCBpbnRhKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIGZsb3ctaGFuZGxlciAoRE1BKSBpbnRlcnJ1cHRzLgorCSAqIEFueSBuZXcgaW50ZXJydXB0cyB0aGF0IGhhcHBlbiBhZnRlciB0aGlzLCBlaXRoZXIgd2hpbGUgd2UncmUKKwkgKiBpbiB0aGlzIHRhc2tsZXQsIG9yIGxhdGVyLCB3aWxsIHNob3cgdXAgaW4gbmV4dCBJU1IvdGFza2xldC4gKi8KKwlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisJX2lsX3dyKGlsLCBDU1JfRkhfSU5UX1NUQVRVUywgaW50YV9maCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIElMX0RMX0lTUikgeworCQkvKiBqdXN0IGZvciBkZWJ1ZyAqLworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCURfSVNSKCJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwgaW50YSwKKwkJICAgICAgaW50YV9tYXNrLCBpbnRhX2ZoKTsKKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKKwkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0CisJICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCisJICogcmVhZGluZyBDU1JfSU5ULiAqLworCWlmIChpbnRhX2ZoICYgQ1NSNDlfRkhfSU5UX1JYX01BU0spCisJCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7CisJaWYgKGludGFfZmggJiBDU1I0OV9GSF9JTlRfVFhfTUFTSykKKwkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKworCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7CisJCUlMX0VSUigiSGFyZHdhcmUgZXJyb3IgZGV0ZWN0ZWQuICBSZXN0YXJ0aW5nLlxuIik7CisKKwkJLyogVGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisKKwkJaWwtPmlzcl9zdGF0cy5odysrOworCQlpbF9pcnFfaGFuZGxlX2Vycm9yKGlsKTsKKworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0hXX0VSUjsKKworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgKElMX0RMX0lTUikpIHsKKwkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgeworCQkJRF9JU1IoIlNjaGVkdWxlciBmaW5pc2hlZCB0byB0cmFuc21pdCAiCisJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOworCQkJaWwtPmlzcl9zdGF0cy5zY2grKzsKKwkJfQorCisJCS8qIEFsaXZlIG5vdGlmaWNhdGlvbiB2aWEgUnggaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlYWwgd29yayAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0FMSVZFKSB7CisJCQlEX0lTUigiQWxpdmUgaW50ZXJydXB0XG4iKTsKKwkJCWlsLT5pc3Jfc3RhdHMuYWxpdmUrKzsKKwkJfQorCX0KKyNlbmRpZgorCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCisJaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKKworCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKKwkJaW50IGh3X3JmX2tpbGwgPSAwOworCQlpZiAoIQorCQkgICAgKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmCisJCSAgICAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQorCQkJaHdfcmZfa2lsbCA9IDE7CisKKwkJSUxfV0FSTigiUkZfS0lMTCBiaXQgdG9nZ2xlZCB0byAlcy5cbiIsCisJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOworCisJCWlsLT5pc3Jfc3RhdHMucmZraWxsKys7CisKKwkJLyogZHJpdmVyIG9ubHkgbG9hZHMgdWNvZGUgb25jZSBzZXR0aW5nIHRoZSBpbnRlcmZhY2UgdXAuCisJCSAqIHRoZSBkcml2ZXIgYWxsb3dzIGxvYWRpbmcgdGhlIHVjb2RlIGV2ZW4gaWYgdGhlIHJhZGlvCisJCSAqIGlzIGtpbGxlZC4gSGVuY2UgdXBkYXRlIHRoZSBraWxsc3dpdGNoIHN0YXRlIGhlcmUuIFRoZQorCQkgKiByZmtpbGwgaGFuZGxlciB3aWxsIGNhcmUgYWJvdXQgcmVzdGFydGluZyBpZiBuZWVkZWQuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KFNfQUxJVkUsICZpbC0+c3RhdHVzKSkgeworCQkJaWYgKGh3X3JmX2tpbGwpCisJCQkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwkJCWVsc2UKKwkJCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksIGh3X3JmX2tpbGwpOworCQl9CisKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9SRl9LSUxMOworCX0KKworCS8qIENoaXAgZ290IHRvbyBob3QgYW5kIHN0b3BwZWQgaXRzZWxmICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9DVF9LSUxMKSB7CisJCUlMX0VSUigiTWljcm9jb2RlIENUIGtpbGwgZXJyb3IgZGV0ZWN0ZWQuXG4iKTsKKwkJaWwtPmlzcl9zdGF0cy5jdGtpbGwrKzsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9DVF9LSUxMOworCX0KKworCS8qIEVycm9yIGRldGVjdGVkIGJ5IHVDb2RlICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TV19FUlIpIHsKKwkJSUxfRVJSKCJNaWNyb2NvZGUgU1cgZXJyb3IgZGV0ZWN0ZWQuICIgIiBSZXN0YXJ0aW5nIDB4JVguXG4iLAorCQkgICAgICAgaW50YSk7CisJCWlsLT5pc3Jfc3RhdHMuc3crKzsKKwkJaWxfaXJxX2hhbmRsZV9lcnJvcihpbCk7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfU1dfRVJSOworCX0KKworCS8qCisJICogdUNvZGUgd2FrZXMgdXAgYWZ0ZXIgcG93ZXItZG93biBzbGVlcC4KKwkgKiBUZWxsIGRldmljZSBhYm91dCBhbnkgbmV3IHR4IG9yIGhvc3QgY29tbWFuZHMgZW5xdWV1ZWQsCisJICogYW5kIGFib3V0IGFueSBSeCBidWZmZXJzIG1hZGUgYXZhaWxhYmxlIHdoaWxlIGFzbGVlcC4KKwkgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1dBS0VVUCkgeworCQlEX0lTUigiV2FrZXVwIGludGVycnVwdFxuIik7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+cnhxKTsKKwkJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykKKwkJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVtpXSk7CisJCWlsLT5pc3Jfc3RhdHMud2FrZXVwKys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOworCX0KKworCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAorCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKKwkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLworCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7CisJCWlsNDk2NV9yeF9oYW5kbGUoaWwpOworCQlpbC0+aXNyX3N0YXRzLnJ4Kys7CisJCWhhbmRsZWQgfD0gKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpOworCX0KKworCS8qIFRoaXMgIlR4IiBETUEgY2hhbm5lbCBpcyB1c2VkIG9ubHkgZm9yIGxvYWRpbmcgdUNvZGUgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0ZIX1RYKSB7CisJCURfSVNSKCJ1Q29kZSBsb2FkIGludGVycnVwdFxuIik7CisJCWlsLT5pc3Jfc3RhdHMudHgrKzsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKwkJLyogV2FrZSB1cCB1Q29kZSBsb2FkIHJvdXRpbmUsIG5vdyB0aGF0IGxvYWQgaXMgY29tcGxldGUgKi8KKwkJaWwtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKKwkJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJfQorCisJaWYgKGludGEgJiB+aGFuZGxlZCkgeworCQlJTF9FUlIoIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOworCQlpbC0+aXNyX3N0YXRzLnVuaGFuZGxlZCsrOworCX0KKworCWlmIChpbnRhICYgfihpbC0+aW50YV9tYXNrKSkgeworCQlJTF9XQVJOKCJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKKwkJCWludGEgJiB+aWwtPmludGFfbWFzayk7CisJCUlMX1dBUk4oIiAgIHdpdGggRkg0OV9JTlQgPSAweCUwOHhcbiIsIGludGFfZmgpOworCX0KKworCS8qIFJlLWVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLworCWlmICh0ZXN0X2JpdChTX0lOVF9FTkFCTEVELCAmaWwtPnN0YXR1cykpCisJCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwkvKiBSZS1lbmFibGUgUkZfS0lMTCBpZiBpdCBvY2N1cnJlZCAqLworCWVsc2UgaWYgKGhhbmRsZWQgJiBDU1JfSU5UX0JJVF9SRl9LSUxMKQorCQlpbF9lbmFibGVfcmZraWxsX2ludChpbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIChJTF9ETF9JU1IpKSB7CisJCWludGEgPSBfaWxfcmQoaWwsIENTUl9JTlQpOworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCWludGFfZmggPSBfaWxfcmQoaWwsIENTUl9GSF9JTlRfU1RBVFVTKTsKKwkJRF9JU1IoIkVuZCBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eCwgIgorCQkgICAgICAiZmxhZ3MgMHglMDhseFxuIiwgaW50YSwgaW50YV9tYXNrLCBpbnRhX2ZoLCBmbGFncyk7CisJfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gdGhlIHN5c2ZzIHJlcHJlc2VudGF0aW9uCisgKiBvZiB0aGlzIGRldmljZSBkcml2ZXIgKGkuZS4gYSBuZXcgZmlsZSBpbiAvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvKQorICogdXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIGRlYnVnIGxldmVsLgorICoKKyAqIFNlZSB0aGUgbGV2ZWwgZGVmaW5pdGlvbnMgaW4gaXdsIGZvciBkZXRhaWxzLgorICoKKyAqIFRoZSBkZWJ1Z19sZXZlbCBiZWluZyBtYW5hZ2VkIHVzaW5nIHN5c2ZzIGJlbG93IGlzIGEgcGVyIGRldmljZSBkZWJ1ZworICogbGV2ZWwgdGhhdCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCBpZiBpdCAodGhlIHBlcgorICogZGV2aWNlIGRlYnVnIGxldmVsKSBpcyBzZXQuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc2hvd19kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpbF9nZXRfZGVidWdfbGV2ZWwoaWwpKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJSUxfRVJSKCIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZSB7CisJCWlsLT5kZWJ1Z19sZXZlbCA9IHZhbDsKKwkJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOworCX0KKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywgaWw0OTY1X3Nob3dfZGVidWdfbGV2ZWwsCisJCSAgIGlsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbCk7CisKKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbC0+dGVtcGVyYXR1cmUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcGVyYXR1cmUsIFNfSVJVR08sIGlsNDk2NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9mZlxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10KTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlJTF9JTkZPKCIlcyBpcyBub3QgaW4gZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlIHsKKwkJcmV0ID0gaWxfc2V0X3R4X3Bvd2VyKGlsLCB2YWwsIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCUlMX0VSUigiZmFpbGVkIHNldHRpbmcgdHggcG93ZXIgKDB4JWQpLlxuIiwgcmV0KTsKKwkJZWxzZQorCQkJcmV0ID0gY291bnQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eF9wb3dlciwgU19JV1VTUiB8IFNfSVJVR08sIGlsNDk2NV9zaG93X3R4X3Bvd2VyLAorCQkgICBpbDQ5NjVfc3RvcmVfdHhfcG93ZXIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWxfc3lzZnNfZW50cmllc1tdID0geworCSZkZXZfYXR0cl90ZW1wZXJhdHVyZS5hdHRyLAorCSZkZXZfYXR0cl90eF9wb3dlci5hdHRyLAorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCSZkZXZfYXR0cl9kZWJ1Z19sZXZlbC5hdHRyLAorI2VuZGlmCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWxfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCisJLmF0dHJzID0gaWxfc3lzZnNfZW50cmllcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraWw0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhX2JhY2t1cCk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0X2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9uaWNfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIDApOworfQorCitzdGF0aWMgdm9pZCBpbDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsCisJCQkJICB2b2lkICpjb250ZXh0KTsKK3N0YXRpYyBpbnQgaWw0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBtYXhfcHJvYmVfbGVuZ3RoKTsKKworc3RhdGljIGludCBfX211c3RfY2hlY2sKK2lsNDk2NV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBmaXJzdCkKK3sKKwljb25zdCBjaGFyICpuYW1lX3ByZSA9IGlsLT5jZmctPmZ3X25hbWVfcHJlOworCWNoYXIgdGFnWzhdOworCisJaWYgKGZpcnN0KSB7CisJCWlsLT5md19pZHggPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCQlzcHJpbnRmKHRhZywgIiVkIiwgaWwtPmZ3X2lkeCk7CisJfSBlbHNlIHsKKwkJaWwtPmZ3X2lkeC0tOworCQlzcHJpbnRmKHRhZywgIiVkIiwgaWwtPmZ3X2lkeCk7CisJfQorCisJaWYgKGlsLT5md19pZHggPCBpbC0+Y2ZnLT51Y29kZV9hcGlfbWluKSB7CisJCUlMX0VSUigibm8gc3VpdGFibGUgZmlybXdhcmUgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc3ByaW50ZihpbC0+ZmlybXdhcmVfbmFtZSwgIiVzJXMlcyIsIG5hbWVfcHJlLCB0YWcsICIudWNvZGUiKTsKKworCURfSU5GTygiYXR0ZW1wdGluZyB0byBsb2FkIGZpcm13YXJlICclcydcbiIsIGlsLT5maXJtd2FyZV9uYW1lKTsKKworCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgaWwtPmZpcm13YXJlX25hbWUsCisJCQkJICAgICAgICZpbC0+cGNpX2Rldi0+ZGV2LCBHRlBfS0VSTkVMLCBpbCwKKwkJCQkgICAgICAgaWw0OTY1X3Vjb2RlX2NhbGxiYWNrKTsKK30KKworc3RydWN0IGlsNDk2NV9maXJtd2FyZV9waWVjZXMgeworCWNvbnN0IHZvaWQgKmluc3QsICpkYXRhLCAqaW5pdCwgKmluaXRfZGF0YSwgKmJvb3Q7CisJc2l6ZV90IGluc3Rfc2l6ZSwgZGF0YV9zaXplLCBpbml0X3NpemUsIGluaXRfZGF0YV9zaXplLCBib290X3NpemU7Cit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfbG9hZF9maXJtd2FyZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LAorCQkgICAgIHN0cnVjdCBpbDQ5NjVfZmlybXdhcmVfcGllY2VzICpwaWVjZXMpCit7CisJc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGUgPSAodm9pZCAqKXVjb2RlX3Jhdy0+ZGF0YTsKKwl1MzIgYXBpX3ZlciwgaGRyX3NpemU7CisJY29uc3QgdTggKnNyYzsKKworCWlsLT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKKwlhcGlfdmVyID0gSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpOworCisJc3dpdGNoIChhcGlfdmVyKSB7CisJZGVmYXVsdDoKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJaGRyX3NpemUgPSAyNDsKKwkJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IGhkcl9zaXplKSB7CisJCQlJTF9FUlIoIkZpbGUgc2l6ZSB0b28gc21hbGwhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBpZWNlcy0+aW5zdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluc3Rfc2l6ZSk7CisJCXBpZWNlcy0+ZGF0YV9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmRhdGFfc2l6ZSk7CisJCXBpZWNlcy0+aW5pdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluaXRfc2l6ZSk7CisJCXBpZWNlcy0+aW5pdF9kYXRhX3NpemUgPSBsZTMyX3RvX2NwdSh1Y29kZS0+djEuaW5pdF9kYXRhX3NpemUpOworCQlwaWVjZXMtPmJvb3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5ib290X3NpemUpOworCQlzcmMgPSB1Y29kZS0+djEuZGF0YTsKKwkJYnJlYWs7CisJfQorCisJLyogVmVyaWZ5IHNpemUgb2YgZmlsZSB2cy4gaW1hZ2Ugc2l6ZSBpbmZvIGluIGZpbGUncyBoZWFkZXIgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplICE9CisJICAgIGhkcl9zaXplICsgcGllY2VzLT5pbnN0X3NpemUgKyBwaWVjZXMtPmRhdGFfc2l6ZSArCisJICAgIHBpZWNlcy0+aW5pdF9zaXplICsgcGllY2VzLT5pbml0X2RhdGFfc2l6ZSArIHBpZWNlcy0+Ym9vdF9zaXplKSB7CisKKwkJSUxfRVJSKCJ1Q29kZSBmaWxlIHNpemUgJWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZVxuIiwKKwkJICAgICAgIChpbnQpdWNvZGVfcmF3LT5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGllY2VzLT5pbnN0ID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmluc3Rfc2l6ZTsKKwlwaWVjZXMtPmRhdGEgPSBzcmM7CisJc3JjICs9IHBpZWNlcy0+ZGF0YV9zaXplOworCXBpZWNlcy0+aW5pdCA9IHNyYzsKKwlzcmMgKz0gcGllY2VzLT5pbml0X3NpemU7CisJcGllY2VzLT5pbml0X2RhdGEgPSBzcmM7CisJc3JjICs9IHBpZWNlcy0+aW5pdF9kYXRhX3NpemU7CisJcGllY2VzLT5ib290ID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmJvb3Rfc2l6ZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV91Y29kZV9jYWxsYmFjayAtIGNhbGxiYWNrIHdoZW4gZmlybXdhcmUgd2FzIGxvYWRlZAorICoKKyAqIElmIGxvYWRlZCBzdWNjZXNzZnVsbHksIGNvcGllcyB0aGUgZmlybXdhcmUgaW50byBidWZmZXJzCisgKiBmb3IgdGhlIGNhcmQgdG8gZmV0Y2ggKHZpYSBETUEpLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3Vjb2RlX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRleHQ7CisJc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGU7CisJaW50IGVycjsKKwlzdHJ1Y3QgaWw0OTY1X2Zpcm13YXJlX3BpZWNlcyBwaWVjZXM7CisJY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gaWwtPmNmZy0+dWNvZGVfYXBpX21pbjsKKwl1MzIgYXBpX3ZlcjsKKworCXUzMiBtYXhfcHJvYmVfbGVuZ3RoID0gMjAwOworCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSA9CisJICAgIElMX0RFRkFVTFRfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRTsKKworCW1lbXNldCgmcGllY2VzLCAwLCBzaXplb2YocGllY2VzKSk7CisKKwlpZiAoIXVjb2RlX3JhdykgeworCQlpZiAoaWwtPmZ3X2lkeCA8PSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4KQorCQkJSUxfRVJSKCJyZXF1ZXN0IGZvciBmaXJtd2FyZSBmaWxlICclcycgZmFpbGVkLlxuIiwKKwkJCSAgICAgICBpbC0+ZmlybXdhcmVfbmFtZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCURfSU5GTygiTG9hZGVkIGZpcm13YXJlIGZpbGUgJyVzJyAoJXpkIGJ5dGVzKS5cbiIsIGlsLT5maXJtd2FyZV9uYW1lLAorCSAgICAgICB1Y29kZV9yYXctPnNpemUpOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgZ290IGF0IGxlYXN0IHRoZSBBUEkgdmVyc2lvbiBudW1iZXIgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplIDwgNCkgeworCQlJTF9FUlIoIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCS8qIERhdGEgZnJvbSB1Y29kZSBmaWxlOiAgaGVhZGVyIGZvbGxvd2VkIGJ5IHVDb2RlIGltYWdlcyAqLworCXVjb2RlID0gKHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7CisKKwllcnIgPSBpbDQ5NjVfbG9hZF9maXJtd2FyZShpbCwgdWNvZGVfcmF3LCAmcGllY2VzKTsKKworCWlmIChlcnIpCisJCWdvdG8gdHJ5X2FnYWluOworCisJYXBpX3ZlciA9IElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKTsKKworCS8qCisJICogYXBpX3ZlciBzaG91bGQgbWF0Y2ggdGhlIGFwaSB2ZXJzaW9uIGZvcm1pbmcgcGFydCBvZiB0aGUKKwkgKiBmaXJtd2FyZSBmaWxlbmFtZSAuLi4gYnV0IHdlIGRvbid0IGNoZWNrIGZvciB0aGF0IGFuZCBvbmx5IHJlbHkKKwkgKiBvbiB0aGUgQVBJIHZlcnNpb24gcmVhZCBmcm9tIGZpcm13YXJlIGhlYWRlciBmcm9tIGhlcmUgb24gZm9yd2FyZAorCSAqLworCWlmIChhcGlfdmVyIDwgYXBpX21pbiB8fCBhcGlfdmVyID4gYXBpX21heCkgeworCQlJTF9FUlIoIkRyaXZlciB1bmFibGUgdG8gc3VwcG9ydCB5b3VyIGZpcm13YXJlIEFQSS4gIgorCQkgICAgICAgIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKKwkJSUxfRVJSKCJGaXJtd2FyZSBoYXMgb2xkIEFQSSB2ZXJzaW9uLiBFeHBlY3RlZCB2JXUsICIKKwkJICAgICAgICJnb3QgdiV1LiBOZXcgZmlybXdhcmUgY2FuIGJlIG9idGFpbmVkICIKKwkJICAgICAgICJmcm9tIGh0dHA6Ly93d3cuaW50ZWxsaW51eHdpcmVsZXNzLm9yZy5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKworCUlMX0lORk8oImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAorCQlJTF9VQ09ERV9NQUpPUihpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksCisJCUlMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfU0VSSUFMKGlsLT51Y29kZV92ZXIpKTsKKworCXNucHJpbnRmKGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24sIHNpemVvZihpbC0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKKwkJICIldS4ldS4ldS4ldSIsIElMX1VDT0RFX01BSk9SKGlsLT51Y29kZV92ZXIpLAorCQkgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwKKwkJIElMX1VDT0RFX1NFUklBTChpbC0+dWNvZGVfdmVyKSk7CisKKwkvKgorCSAqIEZvciBhbnkgb2YgdGhlIGZhaWx1cmVzIGJlbG93IChiZWZvcmUgYWxsb2NhdGluZyBwY2kgbWVtb3J5KQorCSAqIHdlIHdpbGwgdHJ5IHRvIGxvYWQgYSB2ZXJzaW9uIHdpdGggYSBzbWFsbGVyIEFQSSAtLSBtYXliZSB0aGUKKwkgKiB1c2VyIGp1c3QgZ290IGEgY29ycnVwdGVkIHZlcnNpb24gb2YgdGhlIGxhdGVzdCBBUEkuCisJICovCisKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsIGlsLT51Y29kZV92ZXIpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgaW5zdCBzaXplID0gJVpkXG4iLCBwaWVjZXMuaW5zdF9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICVaZFxuIiwgcGllY2VzLmRhdGFfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAlWmRcbiIsIHBpZWNlcy5pbml0X3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGluaXQgZGF0YSBzaXplID0gJVpkXG4iLCBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJVpkXG4iLCBwaWVjZXMuYm9vdF9zaXplKTsKKworCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTSAqLworCWlmIChwaWVjZXMuaW5zdF9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgaW5zdHIgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChwaWVjZXMuZGF0YV9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBwaWVjZXMuZGF0YV9zaXplKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKHBpZWNlcy5pbml0X3NpemUgPiBpbC0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUpIHsKKwkJSUxfRVJSKCJ1Q29kZSBpbml0IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgaW5pdCBkYXRhIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChwaWVjZXMuYm9vdF9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUpIHsKKwkJSUxfRVJSKCJ1Q29kZSBib290IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5ib290X3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB1Y29kZSBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciBsb2FkaW5nIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgYW5kIDIgY29waWVzIG9mIGRhdGE6CisJICogMSkgdW5tb2RpZmllZCBmcm9tIGRpc2sKKwkgKiAyKSBiYWNrdXAgY2FjaGUgZm9yIHNhdmUvcmVzdG9yZSBkdXJpbmcgcG93ZXItZG93bnMgKi8KKwlpbC0+dWNvZGVfY29kZS5sZW4gPSBwaWVjZXMuaW5zdF9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisKKwlpbC0+dWNvZGVfZGF0YS5sZW4gPSBwaWVjZXMuZGF0YV9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YSk7CisKKwlpbC0+dWNvZGVfZGF0YV9iYWNrdXAubGVuID0gcGllY2VzLmRhdGFfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGFfYmFja3VwKTsKKworCWlmICghaWwtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFpbC0+dWNvZGVfZGF0YS52X2FkZHIgfHwKKwkgICAgIWlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIpCisJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLworCWlmIChwaWVjZXMuaW5pdF9zaXplICYmIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgeworCQlpbC0+dWNvZGVfaW5pdC5sZW4gPSBwaWVjZXMuaW5pdF9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCisJCWlsLT51Y29kZV9pbml0X2RhdGEubGVuID0gcGllY2VzLmluaXRfZGF0YV9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXRfZGF0YSk7CisKKwkJaWYgKCFpbC0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIWlsLT51Y29kZV9pbml0X2RhdGEudl9hZGRyKQorCQkJZ290byBlcnJfcGNpX2FsbG9jOworCX0KKworCS8qIEJvb3RzdHJhcCAoaW5zdHJ1Y3Rpb25zIG9ubHksIG5vIGRhdGEpICovCisJaWYgKHBpZWNlcy5ib290X3NpemUpIHsKKwkJaWwtPnVjb2RlX2Jvb3QubGVuID0gcGllY2VzLmJvb3Rfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKKworCQlpZiAoIWlsLT51Y29kZV9ib290LnZfYWRkcikKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKKwkvKiBOb3cgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwsIGNvcHkgaW5mb3JtYXRpb24gKi8KKworCWlsLT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07CisKKwkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgaW5zdHIgbGVuICVaZFxuIiwKKwkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7CisJbWVtY3B5KGlsLT51Y29kZV9jb2RlLnZfYWRkciwgcGllY2VzLmluc3QsIHBpZWNlcy5pbnN0X3NpemUpOworCisJRF9JTkZPKCJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKKwkgICAgICAgaWwtPnVjb2RlX2NvZGUudl9hZGRyLCAodTMyKSBpbC0+dWNvZGVfY29kZS5wX2FkZHIpOworCisJLyoKKwkgKiBSdW50aW1lIGRhdGEKKwkgKiBOT1RFOiAgQ29weSBpbnRvIGJhY2t1cCBidWZmZXIgd2lsbCBiZSBkb25lIGluIGlsX3VwKCkKKwkgKi8KKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgZGF0YSBsZW4gJVpkXG4iLAorCSAgICAgICBwaWVjZXMuZGF0YV9zaXplKTsKKwltZW1jcHkoaWwtPnVjb2RlX2RhdGEudl9hZGRyLCBwaWVjZXMuZGF0YSwgcGllY2VzLmRhdGFfc2l6ZSk7CisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHBpZWNlcy5kYXRhLCBwaWVjZXMuZGF0YV9zaXplKTsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAqLworCWlmIChwaWVjZXMuaW5pdF9zaXplKSB7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGluc3RyIGxlbiAlWmRcbiIsCisJCSAgICAgICBwaWVjZXMuaW5pdF9zaXplKTsKKwkJbWVtY3B5KGlsLT51Y29kZV9pbml0LnZfYWRkciwgcGllY2VzLmluaXQsIHBpZWNlcy5pbml0X3NpemUpOworCX0KKworCS8qIEluaXRpYWxpemF0aW9uIGRhdGEgKi8KKwlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplKSB7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGRhdGEgbGVuICVaZFxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJCW1lbWNweShpbC0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkciwgcGllY2VzLmluaXRfZGF0YSwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJfQorCisJLyogQm9vdHN0cmFwIGluc3RydWN0aW9ucyAqLworCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlWmRcbiIsCisJICAgICAgIHBpZWNlcy5ib290X3NpemUpOworCW1lbWNweShpbC0+dWNvZGVfYm9vdC52X2FkZHIsIHBpZWNlcy5ib290LCBwaWVjZXMuYm9vdF9zaXplKTsKKworCS8qCisJICogZmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzCisJICogYmFzZSBvbiB0aGUgc2l6ZSBvZiBzdGFuZGFyZCBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMgdGFibGUgc2l6ZQorCSAqLworCWlsLT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KKwkgICAgc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemU7CisJaWwtPl80OTY1LnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZCA9CisJICAgIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplICsgMTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRoaXMgaXMgc3RpbGwgcGFydCBvZiBwcm9iZSgpIGluIGEgc2Vuc2UuLi4KKwkgKgorCSAqIDkuIFNldHVwIGFuZCByZWdpc3RlciB3aXRoIG1hYzgwMjExIGFuZCBkZWJ1Z2ZzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWVyciA9IGlsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIoaWwsIG1heF9wcm9iZV9sZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VuYmluZDsKKworCWVyciA9IGlsX2RiZ2ZzX3JlZ2lzdGVyKGlsLCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJSUxfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZmlsZXMuIElnbm9yaW5nIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIGVycik7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlsLT5wY2lfZGV2LT5kZXYua29iaiwgJmlsX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIG91dF91bmJpbmQ7CisJfQorCisJLyogV2UgaGF2ZSBvdXIgY29waWVzIG5vdywgYWxsb3cgT1MgcmVsZWFzZSBpdHMgY29waWVzICovCisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCWNvbXBsZXRlKCZpbC0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CisJcmV0dXJuOworCit0cnlfYWdhaW46CisJLyogdHJ5IG5leHQsIGlmIGFueSAqLworCWlmIChpbDQ5NjVfcmVxdWVzdF9maXJtd2FyZShpbCwgZmFsc2UpKQorCQlnb3RvIG91dF91bmJpbmQ7CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCXJldHVybjsKKworZXJyX3BjaV9hbGxvYzoKKwlJTF9FUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKKwlpbDQ5NjVfZGVhbGxvY191Y29kZV9wY2koaWwpOworb3V0X3VuYmluZDoKKwljb21wbGV0ZSgmaWwtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCWRldmljZV9yZWxlYXNlX2RyaXZlcigmaWwtPnBjaV9kZXYtPmRldik7CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGVzY19sb29rdXBfdGV4dFtdID0geworCSJPSyIsCisJIkZBSUwiLAorCSJCQURfUEFSQU0iLAorCSJCQURfQ0hFQ0tTVU0iLAorCSJOTUlfSU5URVJSVVBUX1dERyIsCisJIlNZU0FTU0VSVCIsCisJIkZBVEFMX0VSUk9SIiwKKwkiQkFEX0NPTU1BTkQiLAorCSJIV19FUlJPUl9UVU5FX0xPQ0siLAorCSJIV19FUlJPUl9URU1QRVJBVFVSRSIsCisJIklMTEVHQUxfQ0hBTl9GUkVRIiwKKwkiVkNDX05PVF9TVEJMIiwKKwkiRkg0OV9FUlJPUiIsCisJIk5NSV9JTlRFUlJVUFRfSE9TVCIsCisJIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwKKwkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwKKwkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsCisJIkhXX0VSUk9SX0FCU19MT0NLIiwKKwkiSFdfRVJST1JfQ0FMX0xPQ0tfRkFJTCIsCisJIk5NSV9JTlRFUlJVUFRfSU5TVF9BQ1RJT05fUFQiLAorCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKKwkiTk1JX1RSTV9IV19FUiIsCisJIk5NSV9JTlRFUlJVUFRfVFJNIiwKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCisJIkRFQlVHXzAiLAorCSJERUJVR18xIiwKKwkiREVCVUdfMiIsCisJIkRFQlVHXzMiLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwl1OCBudW07Cit9IGFkdmFuY2VkX2xvb2t1cFtdID0geworCXsKKwkiTk1JX0lOVEVSUlVQVF9XREciLCAweDM0fSwgeworCSJTWVNBU1NFUlQiLCAweDM1fSwgeworCSJVQ09ERV9WRVJTSU9OX01JU01BVENIIiwgMHgzN30sIHsKKwkiQkFEX0NPTU1BTkQiLCAweDM4fSwgeworCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwgMHgzQ30sIHsKKwkiRkFUQUxfRVJST1IiLCAweDNEfSwgeworCSJOTUlfVFJNX0hXX0VSUiIsIDB4NDZ9LCB7CisJIk5NSV9JTlRFUlJVUFRfVFJNIiwgMHg0Q30sIHsKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsIDB4NTR9LCB7CisJIk5NSV9JTlRFUlJVUFRfV0RHX1JYRl9GVUxMIiwgMHg1Q30sIHsKKwkiTk1JX0lOVEVSUlVQVF9XREdfTk9fUkJEX1JYRl9GVUxMIiwgMHg2NH0sIHsKKwkiTk1JX0lOVEVSUlVQVF9IT1NUIiwgMHg2Nn0sIHsKKwkiTk1JX0lOVEVSUlVQVF9BQ1RJT05fUFQiLCAweDdDfSwgeworCSJOTUlfSU5URVJSVVBUX1VOS05PV04iLCAweDg0fSwgeworCSJOTUlfSU5URVJSVVBUX0lOU1RfQUNUSU9OX1BUIiwgMHg4Nn0sIHsKKyJBRFZBTkNFRF9TWVNBU1NFUlQiLCAwfSx9OworCitzdGF0aWMgY29uc3QgY2hhciAqCitpbDQ5NjVfZGVzY19sb29rdXAodTMyIG51bSkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4ID0gQVJSQVlfU0laRShkZXNjX2xvb2t1cF90ZXh0KTsKKworCWlmIChudW0gPCBtYXgpCisJCXJldHVybiBkZXNjX2xvb2t1cF90ZXh0W251bV07CisKKwltYXggPSBBUlJBWV9TSVpFKGFkdmFuY2VkX2xvb2t1cCkgLSAxOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlpZiAoYWR2YW5jZWRfbG9va3VwW2ldLm51bSA9PSBudW0pCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGFkdmFuY2VkX2xvb2t1cFtpXS5uYW1lOworfQorCisjZGVmaW5lIEVSUk9SX1NUQVJUX09GRlNFVCAgKDEgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgRVJST1JfRUxFTV9TSVpFICAgICAoNyAqIHNpemVvZih1MzIpKQorCit2b2lkCitpbDQ5NjVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgZGF0YTIsIGxpbmU7CisJdTMyIGRlc2MsIHRpbWUsIGNvdW50LCBiYXNlLCBkYXRhMTsKKwl1MzIgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyOworCXUzMiBwYywgaGNtZDsKKworCWlmIChpbC0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQorCQliYXNlID0gbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCWVsc2UKKwkJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisKKwlpZiAoIWlsLT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCUlMX0VSUigiTm90IHZhbGlkIGVycm9yIGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCisJCSAgICAgICBiYXNlLCAoaWwtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgPyAiSW5pdCIgOiAiUlQiKTsKKwkJcmV0dXJuOworCX0KKworCWNvdW50ID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSk7CisKKwlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7CisJCUlMX0VSUigiU3RhcnQgSVdMIEVycm9yIExvZyBEdW1wOlxuIik7CisJCUlMX0VSUigiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsIGlsLT5zdGF0dXMsIGNvdW50KTsKKwl9CisKKwlkZXNjID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDEgKiBzaXplb2YodTMyKSk7CisJaWwtPmlzcl9zdGF0cy5lcnJfY29kZSA9IGRlc2M7CisJcGMgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMiAqIHNpemVvZih1MzIpKTsKKwlibGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMyAqIHNpemVvZih1MzIpKTsKKwlibGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNCAqIHNpemVvZih1MzIpKTsKKwlpbGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNSAqIHNpemVvZih1MzIpKTsKKwlpbGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNiAqIHNpemVvZih1MzIpKTsKKwlkYXRhMSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyA3ICogc2l6ZW9mKHUzMikpOworCWRhdGEyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDggKiBzaXplb2YodTMyKSk7CisJbGluZSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyA5ICogc2l6ZW9mKHUzMikpOworCXRpbWUgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMTEgKiBzaXplb2YodTMyKSk7CisJaGNtZCA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAyMiAqIHNpemVvZih1MzIpKTsKKworCUlMX0VSUigiRGVzYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICIKKwkgICAgICAgImRhdGExICAgICAgZGF0YTIgICAgICBsaW5lXG4iKTsKKwlJTF9FUlIoIiUtMjhzICgweCUwNFgpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCisJICAgICAgIGlsNDk2NV9kZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lKTsKKwlJTF9FUlIoInBjICAgICAgYmxpbmsxICBibGluazIgIGlsaW5rMSAgaWxpbmsyICBoY21kXG4iKTsKKwlJTF9FUlIoIjB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYXG4iLCBwYywgYmxpbmsxLAorCSAgICAgICBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBoY21kKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2N0X2tpbGxfY29uZmlnIGNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCisJICAgICAgIENTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJY21kLmNyaXRpY2FsX3RlbXBlcmF0dXJlX1IgPQorCSAgICBjcHVfdG9fbGUzMihpbC0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkKTsKKworCXJldCA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19DVF9LSUxMX0NPTkZJRywgc2l6ZW9mKGNtZCksICZjbWQpOworCWlmIChyZXQpCisJCUlMX0VSUigiQ19DVF9LSUxMX0NPTkZJRyBmYWlsZWRcbiIpOworCWVsc2UKKwkJRF9JTkZPKCJDX0NUX0tJTExfQ09ORklHICIgInN1Y2NlZWRlZCwgIgorCQkgICAgICAgImNyaXRpY2FsIHRlbXBlcmF0dXJlIGlzICVkXG4iLAorCQkgICAgICAgaWwtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzOCBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKKwlJTF9UWF9GSUZPX1ZPLAorCUlMX1RYX0ZJRk9fVkksCisJSUxfVFhfRklGT19CRSwKKwlJTF9UWF9GSUZPX0JLLAorCUlMNDlfQ01EX0ZJRk9fTlVNLAorCUlMX1RYX0ZJRk9fVU5VU0VELAorCUlMX1RYX0ZJRk9fVU5VU0VELAorfTsKKworI2RlZmluZSBJTF9NQVNLKGxvLCBoaSkgKCgxIDw8IChoaSkpIHwgKCgxIDw8IChoaSkpIC0gKDEgPDwgKGxvKSkpKQorCitzdGF0aWMgaW50CitpbDQ5NjVfYWxpdmVfbm90aWZ5KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBjaGFuOworCXUzMiByZWdfdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDbGVhciA0OTY1J3MgaW50ZXJuYWwgVHggU2NoZWR1bGVyIGRhdGEgYmFzZSAqLworCWlsLT5zY2RfYmFzZV9hZGRyID0gaWxfcmRfcHJwaChpbCwgSUw0OV9TQ0RfU1JBTV9CQVNFX0FERFIpOworCWEgPSBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQ7CisJZm9yICg7IGEgPCBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVDsgYSArPSA0KQorCQlpbF93cml0ZV90YXJnX21lbShpbCwgYSwgMCk7CisJZm9yICg7IGEgPCBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUOyBhICs9IDQpCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBhLCAwKTsKKwlmb3IgKDsKKwkgICAgIGEgPAorCSAgICAgaWwtPnNjZF9iYXNlX2FkZHIgKworCSAgICAgSUw0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUoaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bSk7CisJICAgICBhICs9IDQpCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBhLCAwKTsKKworCS8qIFRlbCA0OTY1IHdoZXJlIHRvIGZpbmQgVHggYnl0ZSBjb3VudCB0YWJsZXMgKi8KKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9EUkFNX0JBU0VfQUREUiwgaWwtPnNjZF9iY190YmxzLmRtYSA+PiAxMCk7CisKKwkvKiBFbmFibGUgRE1BIGNoYW5uZWwgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgRkg0OV9UQ1NSX0NITkxfTlVNOyBjaGFuKyspCisJCWlsX3dyKGlsLCBGSDQ5X1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAorCQkgICAgICBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKKwkJICAgICAgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKKworCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KKwlyZWdfdmFsID0gaWxfcmQoaWwsIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1JFRyk7CisJaWxfd3IoaWwsIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1JFRywKKwkgICAgICByZWdfdmFsIHwgRkg0OV9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4pOworCisJLyogRGlzYWJsZSBjaGFpbiBtb2RlIGZvciBhbGwgcXVldWVzICovCisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsIDApOworCisJLyogSW5pdGlhbGl6ZSBlYWNoIFR4IHF1ZXVlIChpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUpICovCisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykgeworCisJCS8qIFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpZHhlcyAqLworCQlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9SRFBUUihpKSwgMCk7CisJCWlsX3dyKGlsLCBIQlVTX1RBUkdfV1JQVFIsIDAgfCAoaSA8PCA4KSk7CisKKwkJLyogTWF4IFR4IFdpbmRvdyBzaXplIGZvciBTY2hlZHVsZXItQUNLIG1vZGUgKi8KKwkJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkJICBpbC0+c2NkX2Jhc2VfYWRkciArCisJCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSwKKwkJCQkgIChTQ0RfV0lOX1NJWkUgPDwKKwkJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MpICYKKwkJCQkgIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX01TSyk7CisKKwkJLyogRnJhbWUgbGltaXQgKi8KKwkJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkJICBpbC0+c2NkX2Jhc2VfYWRkciArCisJCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSArCisJCQkJICBzaXplb2YodTMyKSwKKwkJCQkgIChTQ0RfRlJBTUVfTElNSVQgPDwKKwkJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCQkgIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSyk7CisKKwl9CisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfSU5URVJSVVBUX01BU0ssCisJCSAgICgxIDw8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW0pIC0gMSk7CisKKwkvKiBBY3RpdmF0ZSBhbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMgKi8KKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgSUxfTUFTSygwLCA2KSk7CisKKwlpbDQ5NjVfc2V0X3dyX3B0cnMoaWwsIElMX0RFRkFVTFRfQ01EX1FVRVVFX05VTSwgMCk7CisKKwkvKiBtYWtlIHN1cmUgYWxsIHF1ZXVlIGFyZSBub3Qgc3RvcHBlZCAqLworCW1lbXNldCgmaWwtPnF1ZXVlX3N0b3BwZWRbMF0sIDAsIHNpemVvZihpbC0+cXVldWVfc3RvcHBlZCkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWF0b21pY19zZXQoJmlsLT5xdWV1ZV9zdG9wX2NvdW50W2ldLCAwKTsKKworCS8qIHJlc2V0IHRvIDAgdG8gZW5hYmxlIGFsbCB0aGUgcXVldWUgZmlyc3QgKi8KKwlpbC0+dHhxX2N0eF9hY3RpdmVfbXNrID0gMDsKKwkvKiBNYXAgZWFjaCBUeC9jbWQgcXVldWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgZmlmbyAqLworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbykgIT0gNyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pOyBpKyspIHsKKwkJaW50IGFjID0gZGVmYXVsdF9xdWV1ZV90b190eF9maWZvW2ldOworCisJCWlsX3R4cV9jdHhfYWN0aXZhdGUoaWwsIGkpOworCisJCWlmIChhYyA9PSBJTF9UWF9GSUZPX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCWlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKGlsLCAmaWwtPnR4cVtpXSwgYWMsIDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgTl9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyb20gcHJvdG9jb2wvcnVudGltZSB1Q29kZSAoaW5pdGlhbGl6YXRpb24gdUNvZGUncworICogICAgICAgICAgICAgICAgICAgQWxpdmUgZ2V0cyBoYW5kbGVkIGJ5IGlsX2luaXRfYWxpdmVfc3RhcnQoKSkuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfYWxpdmVfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJRF9JTkZPKCJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7CisKKwlpZiAoaWwtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKKwkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAorCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkFsaXZlIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB1Q29kZSBoYXMgbG9hZGVkIFJ1bnRpbWUgdUNvZGUgLi4uIHZlcmlmeSBpbnN0IGltYWdlLgorCSAqIFRoaXMgaXMgYSBwYXJhbm9pZCBjaGVjaywgYmVjYXVzZSB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gdGhlCisJICogInJ1bnRpbWUiIGFsaXZlIGlmIGNvZGUgd2VyZW4ndCBwcm9wZXJseSBsb2FkZWQuICAqLworCWlmIChpbDQ5NjVfdmVyaWZ5X3Vjb2RlKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd2FzIGJhZDsKKwkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkJhZCBydW50aW1lIHVDb2RlIGxvYWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCXJldCA9IGlsNDk2NV9hbGl2ZV9ub3RpZnkoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfV0FSTigiQ291bGQgbm90IGNvbXBsZXRlIEFMSVZFIHRyYW5zaXRpb24gW250Zl06ICVkXG4iLCByZXQpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQWZ0ZXIgdGhlIEFMSVZFIHJlc3BvbnNlLCB3ZSBjYW4gc2VuZCBob3N0IGNvbW1hbmRzIHRvIHRoZSB1Q29kZSAqLworCXNldF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworCisJLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KKwlpbF9zZXR1cF93YXRjaGRvZyhpbCk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuOworCisJaWVlZTgwMjExX3dha2VfcXVldWVzKGlsLT5odyk7CisKKwlpbC0+YWN0aXZlX3JhdGUgPSBSQVRFU19NQVNLOworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKwkJc3RydWN0IGlsX3J4b25fY21kICphY3RpdmVfcnhvbiA9CisJCSAgICAoc3RydWN0IGlsX3J4b25fY21kICopJmN0eC0+YWN0aXZlOworCQkvKiBhcHBseSBhbnkgY2hhbmdlcyBpbiBzdGFnaW5nICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJfSBlbHNlIHsKKwkJLyogSW5pdGlhbGl6ZSBvdXIgcnhfY29uZmlnIGRhdGEgKi8KKwkJaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhpbCwgJmlsLT5jdHgpOworCisJCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgY3R4KTsKKwl9CisKKwkvKiBDb25maWd1cmUgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIGVuYWJsZWQgKi8KKwlpbF9zZW5kX2J0X2NvbmZpZyhpbCk7CisKKwlpbDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoaWwpOworCisJc2V0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBDb25maWd1cmUgdGhlIGFkYXB0ZXIgZm9yIHVuYXNzb2NpYXRlZCBvcGVyYXRpb24gKi8KKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBOSUMgaXMgaW5pdGlhbGl6ZWQgYW5kIG9wZXJhdGlvbmFsICovCisJaWw0OTY1X3JmX2tpbGxfY3RfY29uZmlnKGlsKTsKKworCURfSU5GTygiQUxJVkUgcHJvY2Vzc2luZyBjb21wbGV0ZS5cbiIpOworCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIHRydWUpOworCURfSU5GTygiVXBkYXRlZCBwb3dlciBtb2RlXG4iKTsKKworCXJldHVybjsKKworcmVzdGFydDoKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitzdGF0aWMgdm9pZAorX19pbDQ5NjVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXhpdF9wZW5kaW5nOworCisJRF9JTkZPKERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJZXhpdF9wZW5kaW5nID0gdGVzdF9hbmRfc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogU3RvcCBUWCBxdWV1ZXMgd2F0Y2hkb2cuIFdlIG5lZWQgdG8gaGF2ZSBTX0VYSVRfUEVORElORyBiaXQgc2V0CisJICogdG8gcHJldmVudCByZWFybSB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZpbC0+d2F0Y2hkb2cpOworCisJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIE5VTEwpOworCWlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoaWwpOworCWlsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhpbCk7CisKKwkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCisJd2FrZV91cF9hbGwoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJLyogV2lwZSBvdXQgdGhlIEVYSVRfUEVORElORyBzdGF0dXMgYml0IGlmIHdlIGFyZSBub3QgYWN0dWFsbHkKKwkgKiBleGl0aW5nIHRoZSBtb2R1bGUgKi8KKwlpZiAoIWV4aXRfcGVuZGluZykKKwkJY2xlYXJfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbDQ5NjVfc3luY2hyb25pemVfaXJxKGlsKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGlsLT5odyk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IGNhbGxlZCBpbF9pbml0KCkgdGhlbgorCSAqIGNsZWFyIGFsbCBiaXRzIGJ1dCB0aGUgUkYgS2lsbCBiaXQgYW5kIHJldHVybiAqLworCWlmICghaWxfaXNfaW5pdChpbCkpIHsKKwkJaWwtPnN0YXR1cyA9CisJCSAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwKKwkJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19HRU9fQ09ORklHVVJFRCB8CisJCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogLi4ub3RoZXJ3aXNlIGNsZWFyIG91dCBhbGwgdGhlIHN0YXR1cyBiaXRzIGJ1dCB0aGUgUkYgS2lsbAorCSAqIGJpdCBhbmQgY29udGludWUgdGFraW5nIHRoZSBOSUMgZG93bi4gKi8KKwlpbC0+c3RhdHVzICY9CisJICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywKKwkJICAgICAmaWwtPnN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwgdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwKKwkJCQkJCQkgICAgICZpbC0+CisJCQkJCQkJICAgICBzdGF0dXMpIDw8CisJICAgIFNfR0VPX0NPTkZJR1VSRUQgfCB0ZXN0X2JpdChTX0ZXX0VSUk9SLAorCQkJCQkmaWwtPgorCQkJCQlzdGF0dXMpIDw8IFNfRldfRVJST1IgfAorCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCisJaWw0OTY1X3R4cV9jdHhfc3RvcChpbCk7CisJaWw0OTY1X3J4cV9zdG9wKGlsKTsKKworCS8qIFBvd2VyLWRvd24gZGV2aWNlJ3MgYnVzbWFzdGVyIERNQSBjbG9ja3MgKi8KKwlpbF93cl9wcnBoKGlsLCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOworCXVkZWxheSg1KTsKKworCS8qIE1ha2Ugc3VyZSAocmVkdW5kYW50KSB3ZSd2ZSByZWxlYXNlZCBvdXIgcmVxdWVzdCB0byBzdGF5IGF3YWtlICovCisJaWxfY2xlYXJfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisKKwkvKiBTdG9wIHRoZSBkZXZpY2UsIGFuZCBwdXQgaXQgaW4gbG93IHBvd2VyIHN0YXRlICovCisJaWxfYXBtX3N0b3AoaWwpOworCitleGl0OgorCW1lbXNldCgmaWwtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCisJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisJaWwtPmJlYWNvbl9za2IgPSBOVUxMOworCisJLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLworCWlsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhpbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlfX2lsNDk2NV9kb3duKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworfQorCisjZGVmaW5lIEhXX1JFQURZX1RJTUVPVVQgKDUwKQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2h3X3JlYWR5KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZKTsKKworCS8qIFNlZSBpZiB3ZSBnb3QgaXQgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCisJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSwgSFdfUkVBRFlfVElNRU9VVCk7CisJaWYgKHJldCAhPSAtRVRJTUVET1VUKQorCQlpbC0+aHdfcmVhZHkgPSB0cnVlOworCWVsc2UKKwkJaWwtPmh3X3JlYWR5ID0gZmFsc2U7CisKKwlEX0lORk8oImhhcmR3YXJlICVzXG4iLCAoaWwtPmh3X3JlYWR5ID09IDEpID8gInJlYWR5IiA6ICJub3QgcmVhZHkiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCURfSU5GTygiaWw0OTY1X3ByZXBhcmVfY2FyZF9odyBlbnRlclxuIik7CisKKwlyZXQgPSBpbDQ5NjVfc2V0X2h3X3JlYWR5KGlsKTsKKwlpZiAoaWwtPmh3X3JlYWR5KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgSFcgaXMgbm90IHJlYWR5LCBwcmVwYXJlIHRoZSBjb25kaXRpb25zIHRvIGNoZWNrIGFnYWluICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUpOworCisJcmV0ID0KKwkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSB+Q1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsCisJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsIDE1MDAwMCk7CisKKwkvKiBIVyBzaG91bGQgYmUgcmVhZHkgYnkgbm93LCBjaGVjayBhZ2Fpbi4gKi8KKwlpZiAocmV0ICE9IC1FVElNRURPVVQpCisJCWlsNDk2NV9zZXRfaHdfcmVhZHkoaWwpOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQorCitzdGF0aWMgaW50CitfX2lsNDk2NV91cChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX1dBUk4oIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhaWwtPnVjb2RlX2RhdGEudl9hZGRyKSB7CisJCUlMX0VSUigidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5ndXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihpbCwgJmlsLT5jdHgpOworCWlmIChyZXQpIHsKKwkJaWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhpbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWw0OTY1X3ByZXBhcmVfY2FyZF9odyhpbCk7CisKKwlpZiAoIWlsLT5od19yZWFkeSkgeworCQlJTF9XQVJOKCJFeGl0IEhXIG5vdCByZWFkeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCisJaWYgKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQorCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJZWxzZQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCB0cnVlKTsKKworCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisJCUlMX1dBUk4oIlJhZGlvIGRpc2FibGVkIGJ5IEhXIFJGIEtpbGwgc3dpdGNoXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKworCS8qIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGlsX2h3X25pY19pbml0ICovCisJaWwtPmNtZF9xdWV1ZSA9IElMX0RFRkFVTFRfQ01EX1FVRVVFX05VTTsKKworCXJldCA9IGlsNDk2NV9od19uaWNfaW5pdChpbCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0IG5pY1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworCS8qIHJlYWxseSBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCisJLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KKwkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncworCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIGlsLT51Y29kZV9kYXRhLnZfYWRkciwKKwkgICAgICAgaWwtPnVjb2RlX2RhdGEubGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgeworCisJCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCisJCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCisJCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCisJCXJldCA9IGlsLT5jZmctPm9wcy0+bGliLT5sb2FkX3Vjb2RlKGlsKTsKKworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBzZXQgdXAgYm9vdHN0cmFwIHVDb2RlOiAlZFxuIiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc3RhcnQgY2FyZDsgImluaXRpYWxpemUiIHdpbGwgbG9hZCBydW50aW1lIHVjb2RlICovCisJCWlsNDk2NV9uaWNfc3RhcnQoaWwpOworCisJCURfSU5GTyhEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCV9faWw0OTY1X2Rvd24oaWwpOworCWNsZWFyX2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCisJICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCisJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV29ya3F1ZXVlIGNhbGxiYWNrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ19pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsLT5jZmctPm9wcy0+bGliLT5pbml0X2FsaXZlX3N0YXJ0KGlsKTsKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsNDk2NV9hbGl2ZV9zdGFydChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwKKwkJCQkJICBydW5fdGltZV9jYWxpYl93b3JrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlsLT5zdGFydF9jYWxpYikgeworCQlpbDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oaWwsICh2b2lkICopJmlsLT5fNDk2NS5zdGF0cyk7CisJCWlsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihpbCwgKHZvaWQgKikmaWwtPl80OTY1LnN0YXRzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCByZXN0YXJ0KTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKSkgeworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpbC0+Y3R4LnZpZiA9IE5VTEw7CisJCWlsLT5pc19vcGVuID0gMDsKKworCQlfX2lsNDk2NV9kb3duKGlsKTsKKworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCWlsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhpbCk7CisJCWllZWU4MDIxMV9yZXN0YXJ0X2h3KGlsLT5odyk7CisJfSBlbHNlIHsKKwkJaWw0OTY1X2Rvd24oaWwpOworCisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKworCQlfX2lsNDk2NV91cChpbCk7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfcnhfcmVwbGVuaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbDQ5NjVfcnhfcmVwbGVuaXNoKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBVQ09ERV9SRUFEWV9USU1FT1VUCSg0ICogSFopCisKKy8qCisgKiBOb3QgYSBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbiwgYnV0IGl0IGZpdHMgaW4gd2l0aCBhbGwgdGhlCisgKiBvdGhlciBtYWM4MDIxMSBmdW5jdGlvbnMgZ3JvdXBlZCBoZXJlLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG1heF9wcm9iZV9sZW5ndGgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC00OTY1LXJzIjsKKworCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLworCWh3LT5mbGFncyA9CisJICAgIElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKKwkgICAgSUVFRTgwMjExX0hXX05FRURfRFRJTV9QRVJJT0QgfCBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8CisJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7CisKKwlpZiAoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pCisJCWh3LT5mbGFncyB8PQorCQkgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8CisJCSAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7CisKKwlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2KTsKKwlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfdmlmX3ByaXYpOworCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXM7CisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCisJaHctPndpcGh5LT5mbGFncyB8PQorCSAgICBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZIHwgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUzsKKworCS8qCisJICogRm9yIG5vdywgZGlzYWJsZSBQUyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgYWZmZWN0cworCSAqIFJYIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCisJICovCisJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCisJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7CisJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLworCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gbWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKKworCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLworCWh3LT5xdWV1ZXMgPSA0OworCisJaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUw7CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCisJCWlsLT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KKwkJICAgICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQorCQlpbC0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9CisJCSAgICAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCisJaWxfbGVkc19pbml0KGlsKTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhpbC0+aHcpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgaHcgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJcmV0ID0gX19pbDQ5NjVfdXAoaWwpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJZ290byBvdXQ7CisKKwlEX0lORk8oIlN0YXJ0IFVQIHdvcmsgZG9uZS5cbiIpOworCisJLyogV2FpdCBmb3IgU1RBUlRfQUxJVkUgZnJvbSBSdW4gVGltZSB1Y29kZS4gT3RoZXJ3aXNlIGNhbGxiYWNrcyBmcm9tCisJICogbWFjODAyMTEgd2lsbCBub3QgYmUgcnVuIHN1Y2Nlc3NmdWxseS4gKi8KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaWwtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCQkgdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpLAorCQkJCSBVQ09ERV9SRUFEWV9USU1FT1VUKTsKKwlpZiAoIXJldCkgeworCQlpZiAoIXRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSkgeworCQkJSUxfRVJSKCJTVEFSVF9BTElWRSB0aW1lb3V0IGFmdGVyICVkbXMuXG4iLAorCQkJCWppZmZpZXNfdG9fbXNlY3MoVUNPREVfUkVBRFlfVElNRU9VVCkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlpbDQ5NjVfbGVkX2VuYWJsZShpbCk7CisKK291dDoKKwlpbC0+aXNfb3BlbiA9IDE7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiAwOworfQorCit2b2lkCitpbDQ5NjVfbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAoIWlsLT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlpbC0+aXNfb3BlbiA9IDA7CisKKwlpbDQ5NjVfZG93bihpbCk7CisKKwlmbHVzaF93b3JrcXVldWUoaWwtPndvcmtxdWV1ZSk7CisKKwkvKiBVc2VyIHNwYWNlIHNvZnR3YXJlIG1heSBleHBlY3QgZ2V0dGluZyByZmtpbGwgY2hhbmdlcworCSAqIGV2ZW4gaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWlsX2VuYWJsZV9yZmtpbGxfaW50KGlsKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKworCURfTUFDRFVNUCgiZW50ZXJcbiIpOworCisJRF9UWCgiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCisJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOworCisJaWYgKGlsNDk2NV90eF9za2IoaWwsIHNrYikpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlEX01BQ0RVTVAoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGl2MzIsIHUxNiAqIHBoYXNlMWtleSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWw0OTY1X3VwZGF0ZV90a2lwX2tleShpbCwgdmlmX3ByaXYtPmN0eCwga2V5Y29uZiwgc3RhLCBpdjMyLAorCQkJICAgICAgIHBoYXNlMWtleSk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK2ludAoraWw0OTY1X21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwlpbnQgcmV0OworCXU4IHN0YV9pZDsKKwlib29sIGlzX2RlZmF1bHRfd2VwX2tleSA9IGZhbHNlOworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0bykgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXN0YV9pZCA9IGlsX3N0YV9pZF9vcl9icm9hZGNhc3QoaWwsIHZpZl9wcml2LT5jdHgsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKKwkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQorCSAqIGluIDFYIG1vZGUuCisJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgorCSAqLworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYgIXN0YSkgeworCQlpZiAoY21kID09IFNFVF9LRVkpCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOworCQllbHNlCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPQorCQkJICAgIChrZXktPmh3X2tleV9pZHggPT0gSFdfS0VZX0RFRkFVTFQpOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVRfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQorCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfc2V0X2RlZmF1bHRfd2VwX2tleShpbCwgdmlmX3ByaXYtPmN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfc2V0X2R5bmFtaWNfa2V5KGlsLCB2aWZfcHJpdi0+Y3R4LCBrZXksCisJCQkJCQkgICBzdGFfaWQpOworCisJCURfTUFDODAyMTEoImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQorCQkJcmV0ID0gaWw0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoaWwsIGN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0gaWw0OTY1X3JlbW92ZV9keW5hbWljX2tleShpbCwgY3R4LCBrZXksIHN0YV9pZCk7CisKKwkJRF9NQUM4MDIxMSgiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYWNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuLAorCQkJdTggYnVmX3NpemUpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlEX0hUKCJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwgc3RhLT5hZGRyLCB0aWQpOworCisJaWYgKCEoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgorCQlEX0hUKCJzdGFydCBSeFxuIik7CisJCXJldCA9IGlsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KGlsLCBzdGEsIHRpZCwgKnNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CisJCURfSFQoInN0b3AgUnhcbiIpOworCQlyZXQgPSBpbDQ5NjVfc3RhX3J4X2FnZ19zdG9wKGlsLCBzdGEsIHRpZCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJCURfSFQoInN0YXJ0IFR4XG4iKTsKKwkJcmV0ID0gaWw0OTY1X3R4X2FnZ19zdGFydChpbCwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKKwkJRF9IVCgic3RvcCBUeFxuIik7CisJCXJldCA9IGlsNDk2NV90eF9hZ2dfc3RvcChpbCwgdmlmLCBzdGEsIHRpZCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCWJvb2wgaXNfYXAgPSB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwlpbnQgcmV0OworCXU4IHN0YV9pZDsKKworCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJYXRvbWljX3NldCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzLCAwKTsKKworCXJldCA9CisJICAgIGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLCBpc19hcCwgc3RhLAorCQkJCSAgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwgc3RhLT5hZGRyLCByZXQpOworCQkvKiBTaG91bGQgd2UgcmV0dXJuIHN1Y2Nlc3MgaWYgcmV0dXJuIGNvZGUgaXMgRUVYSVNUID8gKi8KKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOworCisJLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KKwlEX0lORk8oIkluaXRpYWxpemluZyByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCWlsNDk2NV9yc19yYXRlX2luaXQoaWwsIHN0YSwgc3RhX2lkKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraWw0OTY1X21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mID0gJmlsLT5jdXJyZW50X2h0X2NvbmZpZzsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUxNiBjaDsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWYgKCFpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQorCQlnb3RvIG91dDsKKworCWlmICghaWwtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaCkKKwkJZ290byBvdXQ7CisKKwljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOworCWlmIChsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSA9PSBjaCkKKwkJZ290byBvdXQ7CisKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgY2hhbm5lbC0+YmFuZCwgY2gpOworCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQlEX01BQzgwMjExKCJpbnZhbGlkIGNoYW5uZWxcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZpbC0+bG9jayk7CisKKwlpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IGNvbmYtPnNtcHNfbW9kZTsKKworCS8qIENvbmZpZ3VyZSBIVDQwIGNoYW5uZWxzICovCisJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKKwlpZiAoY3R4LT5odC5lbmFibGVkKSB7CisJCWlmIChjb25mX2lzX2h0NDBfbWludXMoY29uZikpIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7CisJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCQl9CisJfSBlbHNlCisJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKworCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpICE9IGNoKSkKKwkJY3R4LT5zdGFnaW5nLmZsYWdzID0gMDsKKworCWlsX3NldF9yeG9uX2NoYW5uZWwoaWwsIGNoYW5uZWwsIGN0eCk7CisJaWxfc2V0X3J4b25faHQoaWwsIGh0X2NvbmYpOworCWlsX3NldF9mbGFnc19mb3JfYmFuZChpbCwgY3R4LCBjaGFubmVsLT5iYW5kLCBjdHgtPnZpZik7CisKKwlzcGluX3VubG9ja19pcnEoJmlsLT5sb2NrKTsKKworCWlsX3NldF9yYXRlKGlsKTsKKwkvKgorCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCisJICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKKwkgKi8KKwlzZXRfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpOworCWlsLT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChpbCwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisJCWlsLT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCisjZGVmaW5lIENISyh0ZXN0LCBmbGFnKQlkbyB7IFwKKwlpZiAoKnRvdGFsX2ZsYWdzICYgKHRlc3QpKQkJXAorCQlmaWx0ZXJfb3IgfD0gKGZsYWcpOwkJXAorCWVsc2UJCQkJCVwKKwkJZmlsdGVyX25hbmQgfD0gKGZsYWcpOwkJXAorCX0gd2hpbGUgKDApCisKKwlEX01BQzgwMjExKCJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsIGNoYW5nZWRfZmxhZ3MsCisJCSAgICp0b3RhbF9mbGFncyk7CisKKwlDSEsoRklGX09USEVSX0JTUyB8IEZJRl9QUk9NSVNDX0lOX0JTUywgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCS8qIFNldHRpbmcgX2p1c3RfIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyBjYXVzZXMgRkggZXJyb3JzICovCisJQ0hLKEZJRl9DT05UUk9MLCBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgfCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7CisJQ0hLKEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7CisKKyN1bmRlZiBDSEsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpbC0+Y3R4LnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKKwlpbC0+Y3R4LnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IGZpbHRlcl9vcjsKKworCS8qCisJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCisJICogYnV0IHdlJ2xsIGV2ZW50dWFsbHkgY29tbWl0IHRoZSBmaWx0ZXIgZmxhZ3MgY2hhbmdlIGFueXdheS4KKwkgKi8KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCS8qCisJICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQorCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCisJICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAorCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgorCSAqLworCSp0b3RhbF9mbGFncyAmPQorCSAgICBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKKwkgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ190eHBvd2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwKKwkJCQkJICB0eHBvd2VyX3dvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCS8qIElmIGEgc2NhbiBoYXBwZW5lZCB0byBzdGFydCBiZWZvcmUgd2UgZ290IGhlcmUKKwkgKiB0aGVuIGp1c3QgcmV0dXJuOyB0aGUgc3RhdHMgbm90aWZpY2F0aW9uIHdpbGwKKwkgKiBraWNrIG9mZiBhbm90aGVyIHNjaGVkdWxlZCB3b3JrIHRvIGNvbXBlbnNhdGUgZm9yCisJICogYW55IHRlbXBlcmF0dXJlIGRlbHRhIHdlIG1pc3NlZCBoZXJlLiAqLworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwkvKiBSZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSBhc3NvY2lhdGVkLCB3ZSBtdXN0IHJlY29uZmlndXJlIHRoZQorCSAqIFRYIHBvd2VyIHNpbmNlIGZyYW1lcyBjYW4gYmUgc2VudCBvbiBub24tcmFkYXIgY2hhbm5lbHMgd2hpbGUKKwkgKiBub3QgYXNzb2NpYXRlZCAqLworCWlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKKworCS8qIFVwZGF0ZSBsYXN0X3RlbXBlcmF0dXJlIHRvIGtlZXAgaXNfY2FsaWJfbmVlZGVkIGZyb20gcnVubmluZworCSAqIHdoZW4gaXQgaXNuJ3QgbmVlZGVkLi4uICovCisJaWwtPmxhc3RfdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCUlOSVRfV09SSygmaWwtPnJlc3RhcnQsIGlsNDk2NV9iZ19yZXN0YXJ0KTsKKwlJTklUX1dPUksoJmlsLT5yeF9yZXBsZW5pc2gsIGlsNDk2NV9iZ19yeF9yZXBsZW5pc2gpOworCUlOSVRfV09SSygmaWwtPnJ1bl90aW1lX2NhbGliX3dvcmssIGlsNDk2NV9iZ19ydW5fdGltZV9jYWxpYl93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPmluaXRfYWxpdmVfc3RhcnQsIGlsNDk2NV9iZ19pbml0X2FsaXZlX3N0YXJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPmFsaXZlX3N0YXJ0LCBpbDQ5NjVfYmdfYWxpdmVfc3RhcnQpOworCisJaWxfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKGlsKTsKKworCUlOSVRfV09SSygmaWwtPnR4cG93ZXJfd29yaywgaWw0OTY1X2JnX3R4cG93ZXJfd29yayk7CisKKwlpbml0X3RpbWVyKCZpbC0+c3RhdHNfcGVyaW9kaWMpOworCWlsLT5zdGF0c19wZXJpb2RpYy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWw7CisJaWwtPnN0YXRzX3BlcmlvZGljLmZ1bmN0aW9uID0gaWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljOworCisJaW5pdF90aW1lcigmaWwtPndhdGNoZG9nKTsKKwlpbC0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlsOworCWlsLT53YXRjaGRvZy5mdW5jdGlvbiA9IGlsX2JnX3dhdGNoZG9nOworCisJdGFza2xldF9pbml0KCZpbC0+aXJxX3Rhc2tsZXQsCisJCSAgICAgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWlsNDk2NV9pcnFfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylpbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNhbmNlbF93b3JrX3N5bmMoJmlsLT50eHBvd2VyX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPmluaXRfYWxpdmVfc3RhcnQpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5hbGl2ZV9zdGFydCk7CisJY2FuY2VsX3dvcmtfc3luYygmaWwtPnJ1bl90aW1lX2NhbGliX3dvcmspOworCisJaWxfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhpbCk7CisKKwlkZWxfdGltZXJfc3luYygmaWwtPnN0YXRzX3BlcmlvZGljKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UX0xFR0FDWTsgaSsrKSB7CisJCXJhdGVzW2ldLmJpdHJhdGUgPSBpbF9yYXRlc1tpXS5pZWVlICogNTsKKwkJcmF0ZXNbaV0uaHdfdmFsdWUgPSBpOwkvKiBSYXRlIHNjYWxpbmcgd2lsbCB3b3JrIG9uIGlkeGVzICovCisJCXJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0ID0gaTsKKwkJcmF0ZXNbaV0uZmxhZ3MgPSAwOworCQlpZiAoKGkgPj0gSUxfRklSU1RfQ0NLX1JBVEUpICYmIChpIDw9IElMX0xBU1RfQ0NLX1JBVEUpKSB7CisJCQkvKgorCQkJICogSWYgQ0NLICE9IDFNIHRoZW4gc2V0IHNob3J0IHByZWFtYmxlIHJhdGUgZmxhZy4KKwkJCSAqLworCQkJcmF0ZXNbaV0uZmxhZ3MgfD0KKwkJCSAgICAoaWxfcmF0ZXNbaV0ucGxjcCA9PQorCQkJICAgICBSQVRFXzFNX1BMQ1ApID8gMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOworCQl9CisJfQorfQorCisvKgorICogQWNxdWlyZSBpbC0+bG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKKyAqLwordm9pZAoraWw0OTY1X3NldF93cl9wdHJzKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgdTMyIGlkeCkKK3sKKwlpbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCAoaWR4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9SRFBUUih0eHFfaWQpLCBpZHgpOworfQorCit2b2lkCitpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJICAgaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpCit7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCS8qIEZpbmQgb3V0IHdoZXRoZXIgdG8gYWN0aXZhdGUgVHggcXVldWUgKi8KKwlpbnQgYWN0aXZlID0gdGVzdF9iaXQodHhxX2lkLCAmaWwtPnR4cV9jdHhfYWN0aXZlX21zaykgPyAxIDogMDsKKworCS8qIFNldCB1cCBhbmQgYWN0aXZhdGUgKi8KKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAorCQkgICAoYWN0aXZlIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpIHwKKwkJICAgKHR4X2ZpZm9faWQgPDwgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRikgfAorCQkgICAoc2NkX3JldHJ5IDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19XU0wpIHwKKwkJICAgKHNjZF9yZXRyeSA8PCBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDSykgfAorCQkgICBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19NU0spOworCisJdHhxLT5zY2hlZF9yZXRyeSA9IHNjZF9yZXRyeTsKKworCURfSU5GTygiJXMgJXMgUXVldWUgJWQgb24gQUMgJWRcbiIsIGFjdGl2ZSA/ICJBY3RpdmF0ZSIgOiAiRGVhY3RpdmF0ZSIsCisJICAgICAgIHNjZF9yZXRyeSA/ICJCQSIgOiAiQUMiLCB0eHFfaWQsIHR4X2ZpZm9faWQpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfaW5pdF9kcnYoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmaWwtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWwtPmhjbWRfbG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWwtPmZyZWVfZnJhbWVzKTsKKworCW11dGV4X2luaXQoJmlsLT5tdXRleCk7CisKKwlpbC0+aWVlZV9jaGFubmVscyA9IE5VTEw7CisJaWwtPmllZWVfcmF0ZXMgPSBOVUxMOworCWlsLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCWlsLT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwlpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IElFRUU4MDIxMV9TTVBTX1NUQVRJQzsKKwlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7CisKKwkvKiBpbml0aWFsaXplIGZvcmNlIHJlc2V0ICovCisJaWwtPmZvcmNlX3Jlc2V0LnJlc2V0X2R1cmF0aW9uID0gSUxfREVMQVlfTkVYVF9GT1JDRV9GV19SRUxPQUQ7CisKKwkvKiBDaG9vc2Ugd2hpY2ggcmVjZWl2ZXJzL2FudGVubmFzIHRvIHVzZSAqLworCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisKKwlpbF9pbml0X3NjYW5fcGFyYW1zKGlsKTsKKworCXJldCA9IGlsX2luaXRfY2hhbm5lbF9tYXAoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBpbF9pbml0X2dlb3MoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOworCX0KKwlpbDQ5NjVfaW5pdF9od19yYXRlcyhpbCwgaWwtPmllZWVfcmF0ZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NoYW5uZWxfbWFwOgorCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfdW5pbml0X2RydihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWw0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhpbCk7CisJaWxfZnJlZV9nZW9zKGlsKTsKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKKwlrZnJlZShpbC0+c2Nhbl9jbWQpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2h3X2RldGVjdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmh3X3JldiA9IF9pbF9yZChpbCwgQ1NSX0hXX1JFVik7CisJaWwtPmh3X3dhX3JldiA9IF9pbF9yZChpbCwgQ1NSX0hXX1JFVl9XQV9SRUcpOworCWlsLT5yZXZfaWQgPSBpbC0+cGNpX2Rldi0+cmV2aXNpb247CisJRF9JTkZPKCJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIGlsLT5yZXZfaWQpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmh3X3BhcmFtcy5tYXhfcnhxX3NpemUgPSBSWF9RVUVVRV9TSVpFOworCWlsLT5od19wYXJhbXMubWF4X3J4cV9sb2cgPSBSWF9RVUVVRV9TSVpFX0xPRzsKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElMX1JYX0JVRl9TSVpFXzhLKTsKKwllbHNlCisJCWlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJTF9SWF9CVUZfU0laRV80Syk7CisKKwlpbC0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJTF9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMOworCisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPmRpc2FibGVfMTFuKQorCQlpbC0+Y2ZnLT5za3UgJj0gfklMX1NLVV9OOworCisJLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5zZXRfaHdfcGFyYW1zKGlsKTsKK30KKworc3RhdGljIGNvbnN0IHU4IGlsNDk2NV9ic3NfYWNfdG9fZmlmb1tdID0geworCUlMX1RYX0ZJRk9fVk8sCisJSUxfVFhfRklGT19WSSwKKwlJTF9UWF9GSUZPX0JFLAorCUlMX1RYX0ZJRk9fQkssCit9OworCitzdGF0aWMgY29uc3QgdTggaWw0OTY1X2Jzc19hY190b19xdWV1ZVtdID0geworCTAsIDEsIDIsIDMsCit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmcgPSAoc3RydWN0IGlsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBwY2lfY21kOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQorCSAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlodyA9IGlsX2FsbG9jX2FsbChjZmcpOworCWlmICghaHcpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlsID0gaHctPnByaXY7CisJLyogQXQgdGhpcyBwb2ludCBib3RoIGh3IGFuZCBpbCBhcmUgYWxsb2NhdGVkLiAqLworCisJaWwtPmN0eC5jdHhpZCA9IDA7CisKKwlpbC0+Y3R4LmFsd2F5c19hY3RpdmUgPSB0cnVlOworCWlsLT5jdHguaXNfYWN0aXZlID0gdHJ1ZTsKKwlpbC0+Y3R4LnJ4b25fY21kID0gQ19SWE9OOworCWlsLT5jdHgucnhvbl90aW1pbmdfY21kID0gQ19SWE9OX1RJTUlORzsKKwlpbC0+Y3R4LnJ4b25fYXNzb2NfY21kID0gQ19SWE9OX0FTU09DOworCWlsLT5jdHgucW9zX2NtZCA9IENfUU9TX1BBUkFNOworCWlsLT5jdHguYXBfc3RhX2lkID0gSUxfQVBfSUQ7CisJaWwtPmN0eC53ZXBfa2V5X2NtZCA9IENfV0VQS0VZOworCWlsLT5jdHguYWNfdG9fZmlmbyA9IGlsNDk2NV9ic3NfYWNfdG9fZmlmbzsKKwlpbC0+Y3R4LmFjX3RvX3F1ZXVlID0gaWw0OTY1X2Jzc19hY190b19xdWV1ZTsKKwlpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOworCWlsLT5jdHguaW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOworCWlsLT5jdHguYXBfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfQVA7CisJaWwtPmN0eC5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7CisJaWwtPmN0eC5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKKwlpbC0+Y3R4LnVudXNlZF9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisKKwlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CisKKwlEX0lORk8oIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOworCWlsLT5jZmcgPSBjZmc7CisJaWwtPnBjaV9kZXYgPSBwZGV2OworCWlsLT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOworCisJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAyLiBJbml0aWFsaXppbmcgUENJIGJ1cworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsCisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSB8CisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0NMS1BNKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9pZWVlODAyMTFfZnJlZV9odzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzYpKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmICghZXJyKQorCQkJZXJyID0KKwkJCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCS8qIGJvdGggYXR0ZW1wdHMgZmFpbGVkOiAqLworCQlpZiAoZXJyKSB7CisJCQlJTF9XQVJOKCJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaWwpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogMy4gUmVhZCBSRVYgcmVnaXN0ZXIKKwkgKioqKioqKioqKioqKioqKioqKioqKiovCisJaWwtPmh3X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFpbC0+aHdfYmFzZSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOworCX0KKworCURfSU5GTygicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4bGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCURfSU5GTygicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgaWwtPmh3X2Jhc2UpOworCisJLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCisJICogd2Ugc2hvdWxkIGluaXQgbm93CisJICovCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5sb2NrKTsKKworCS8qCisJICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQorCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCisJICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCisJICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCWlsNDk2NV9od19kZXRlY3QoaWwpOworCUlMX0lORk8oIkRldGVjdGVkICVzLCBSRVY9MHglWFxuIiwgaWwtPmNmZy0+bmFtZSwgaWwtPmh3X3Jldik7CisKKwkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCisJICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQsIDB4MDApOworCisJaWw0OTY1X3ByZXBhcmVfY2FyZF9odyhpbCk7CisJaWYgKCFpbC0+aHdfcmVhZHkpIHsKKwkJSUxfV0FSTigiRmFpbGVkLCBIVyBub3QgcmVhZHlcbiIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qKioqKioqKioqKioqKioqKgorCSAqIDQuIFJlYWQgRUVQUk9NCisJICoqKioqKioqKioqKioqKioqLworCS8qIFJlYWQgdGhlIEVFUFJPTSAqLworCWVyciA9IGlsX2VlcHJvbV9pbml0KGlsKTsKKwlpZiAoZXJyKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisJZXJyID0gaWw0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKGlsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOworCisJLyogZXh0cmFjdCBNQUMgQWRkcmVzcyAqLworCWlsNDk2NV9lZXByb21fZ2V0X21hYyhpbCwgaWwtPmFkZHJlc3Nlc1swXS5hZGRyKTsKKwlEX0lORk8oIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGlsLT5hZGRyZXNzZXNbMF0uYWRkcik7CisJaWwtPmh3LT53aXBoeS0+YWRkcmVzc2VzID0gaWwtPmFkZHJlc3NlczsKKwlpbC0+aHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDE7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqCisJICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCisJICoqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoaWw0OTY1X3NldF9od19wYXJhbXMoaWwpKSB7CisJCUlMX0VSUigiZmFpbGVkIHRvIHNldCBodyBwYXJhbWV0ZXJzXG4iKTsKKwkJZ290byBvdXRfZnJlZV9lZXByb207CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioKKwkgKiA2LiBTZXR1cCBpbAorCSAqKioqKioqKioqKioqKioqKioqLworCisJZXJyID0gaWw0OTY1X2luaXRfZHJ2KGlsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKKwkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIGlsIGFyZSBpbml0aWFsaXplZC4gKi8KKworCS8qKioqKioqKioqKioqKioqKioqKgorCSAqIDcuIFNldHVwIHNlcnZpY2VzCisJICoqKioqKioqKioqKioqKioqKioqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXBjaV9lbmFibGVfbXNpKGlsLT5wY2lfZGV2KTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsX2lzciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBpbC0+cGNpX2Rldi0+aXJxKTsKKwkJZ290byBvdXRfZGlzYWJsZV9tc2k7CisJfQorCisJaWw0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsoaWwpOworCWlsNDk2NV9zZXR1cF9oYW5kbGVycyhpbCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogOC4gRW5hYmxlIGludGVycnVwdHMgYW5kIHJlYWQgUkZLSUxMIHN0YXRlCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIGVuYWJsZSByZmtpbGwgaW50ZXJydXB0OiBodyBidWcgdy9hICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWwtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJaWYgKHBjaV9jbWQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaWwtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKwl9CisKKwlpbF9lbmFibGVfcmZraWxsX2ludChpbCk7CisKKwkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLworCWlmIChfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwKKwkJCQkgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKTsKKworCWlsX3Bvd2VyX2luaXRpYWxpemUoaWwpOworCisJaW5pdF9jb21wbGV0aW9uKCZpbC0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CisKKwllcnIgPSBpbDQ5NjVfcmVxdWVzdF9maXJtd2FyZShpbCwgdHJ1ZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCWZyZWVfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsKTsKK291dF9kaXNhYmxlX21zaToKKwlwY2lfZGlzYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCWlsNDk2NV91bmluaXRfZHJ2KGlsKTsKK291dF9mcmVlX2VlcHJvbToKKwlpbF9lZXByb21fZnJlZShpbCk7CitvdXRfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpbC0+aHdfYmFzZSk7CitvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2llZWU4MDIxMV9mcmVlX2h3OgorCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitpbDQ5NjVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWwpCisJCXJldHVybjsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlsLT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKKworCURfSU5GTygiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKKworCWlsX2RiZ2ZzX3VucmVnaXN0ZXIoaWwpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbF9hdHRyaWJ1dGVfZ3JvdXApOworCisJLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbCB3aWwgY2F1c2UgaWxfbWFjX3N0b3AgdG8KKwkgKiB0byBiZSBjYWxsZWQgYW5kIGlsNDk2NV9kb3duIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZGV2aWNlCisJICogd2UgbmVlZCB0byBzZXQgU19FWElUX1BFTkRJTkcgYml0LgorCSAqLworCXNldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCWlsX2xlZHNfZXhpdChpbCk7CisKKwlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwkJaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOworCX0gZWxzZSB7CisJCWlsNDk2NV9kb3duKGlsKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcmVzZXQgdG8gbG93IHBvd2VyIGJlZm9yZSB1bmxvYWRpbmcgZHJpdmVyLgorCSAqIFRoaXMgbWF5IGJlIHJlZHVuZGFudCB3aXRoIGlsNDk2NV9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KKwkgKiBydW4gaWw0OTY1X2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKKwkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGlsNDk2NV9kb3duKCkgYXQgYWxsIGJlZm9yZSBsZWF2aW5nIGRyaXZlci4KKwkgKiBUaGlzIChpbmV4cGVuc2l2ZSkgY2FsbCAqbWFrZXMgc3VyZSogZGV2aWNlIGlzIHJlc2V0LgorCSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKKwkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWw0OTY1X3N5bmNocm9uaXplX2lycShpbCk7CisKKwlpbDQ5NjVfZGVhbGxvY191Y29kZV9wY2koaWwpOworCisJaWYgKGlsLT5yeHEuYmQpCisJCWlsNDk2NV9yeF9xdWV1ZV9mcmVlKGlsLCAmaWwtPnJ4cSk7CisJaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwlpbF9lZXByb21fZnJlZShpbCk7CisKKwkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KKwlmbHVzaF93b3JrcXVldWUoaWwtPndvcmtxdWV1ZSk7CisKKwkvKiBpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyBjYWxscyBpbF9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcworCSAqIGlsLT53b3JrcXVldWUuLi4gc28gd2UgY2FuJ3QgdGFrZSBkb3duIHRoZSB3b3JrcXVldWUKKwkgKiB1bnRpbCBub3cuLi4gKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKwlpbC0+d29ya3F1ZXVlID0gTlVMTDsKKwlpbF9mcmVlX3RyYWZmaWNfbWVtKGlsKTsKKworCWZyZWVfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsKTsKKwlwY2lfZGlzYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIGlsLT5od19iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpbDQ5NjVfdW5pbml0X2RydihpbCk7CisKKwlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7Cit9CisKKy8qCisgKiBBY3RpdmF0ZS9EZWFjdGl2YXRlIFR4IERNQS9GSUZPIGNoYW5uZWxzIGFjY29yZGluZyB0eCBmaWZvcyBtYXNrCisgKiBtdXN0IGJlIGNhbGxlZCB1bmRlciBpbC0+bG9jayBhbmQgbWFjIGFjY2VzcworICovCit2b2lkCitpbDQ5NjVfdHhxX3NldF9zY2hlZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBtYXNrKQoreworCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX1RYRkFDVCwgbWFzayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRyaXZlciBhbmQgbW9kdWxlIGVudHJ5IHBvaW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIYXJkd2FyZSBzcGVjaWZpYyBmaWxlIGRlZmluZXMgdGhlIFBDSSBJRHMgdGFibGUgZm9yIHRoYXQgaGFyZHdhcmUgbW9kdWxlICovCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaWw0OTY1X2h3X2NhcmRfaWRzKSA9IHsKKwl7SUxfUENJX0RFVklDRSgweDQyMjksIFBDSV9BTllfSUQsIGlsNDk2NV9jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMzAsIFBDSV9BTllfSUQsIGlsNDk2NV9jZmcpfSwKKwl7MH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWw0OTY1X2h3X2NhcmRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlsNDk2NV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBpbDQ5NjVfaHdfY2FyZF9pZHMsCisJLnByb2JlID0gaWw0OTY1X3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaWw0OTY1X3BjaV9yZW1vdmUpLAorCS5kcml2ZXIucG0gPSBJTF9MRUdBQ1lfUE1fT1BTLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2lsNDk2NV9pbml0KHZvaWQpCit7CisKKwlpbnQgcmV0OworCXByX2luZm8oRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CisJcHJfaW5mbyhEUlZfQ09QWVJJR0hUICJcbiIpOworCisJcmV0ID0gaWw0OTY1X3JhdGVfY29udHJvbF9yZWdpc3RlcigpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaWw0OTY1X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIFBDSSBtb2R1bGVcbiIpOworCQlnb3RvIGVycm9yX3JlZ2lzdGVyOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yX3JlZ2lzdGVyOgorCWlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraWw0OTY1X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlsNDk2NV9kcml2ZXIpOworCWlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworfQorCittb2R1bGVfZXhpdChpbDQ5NjVfZXhpdCk7Cittb2R1bGVfaW5pdChpbDQ5NjVfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaWxfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaWw0OTY1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIGNyeXB0byBpbiBzb2Z0d2FyZSAoZGVmYXVsdCAwIFtoYXJkd2FyZV0pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocXVldWVzX251bSwgaWw0OTY1X21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocXVldWVzX251bSwgIm51bWJlciBvZiBodyBxdWV1ZXMuIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoMTFuX2Rpc2FibGUsIGlsNDk2NV9tb2RfcGFyYW1zLmRpc2FibGVfMTFuLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwgImRpc2FibGUgMTFuIGZ1bmN0aW9uYWxpdHkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChhbXNkdV9zaXplXzhLLCBpbDQ5NjVfbW9kX3BhcmFtcy5hbXNkdV9zaXplXzhLLCBpbnQsCisJCSAgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbXNkdV9zaXplXzhLLCAiZW5hYmxlIDhLIGFtc2R1IHNpemUiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChmd19yZXN0YXJ0LCBpbDQ5NjVfbW9kX3BhcmFtcy5yZXN0YXJ0X2Z3LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhmd19yZXN0YXJ0LCAicmVzdGFydCBmaXJtd2FyZSBpbiBjYXNlIG9mIGVycm9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3ZDBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtcnMuYwpAQCAtMCwwICsxLDI4NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjQ5NjUuaCIKKworI2RlZmluZSBJTDQ5NjVfUlNfTkFNRSAiaXdsLTQ5NjUtcnMiCisKKyNkZWZpbmUgTlVNX1RSWV9CRUZPUkVfQU5UX1RPR0dMRSAxCisjZGVmaW5lIElMX05VTUJFUl9UUlkgICAgICAxCisjZGVmaW5lIElMX0hUX05VTUJFUl9UUlkgICAzCisKKyNkZWZpbmUgUkFURV9NQVhfV0lORE9XCQk2MgkvKiAjIHR4IGluIGhpc3Rvcnkgd2luICovCisjZGVmaW5lIFJBVEVfTUlOX0ZBSUxVUkVfVEgJCTYJLyogbWluIGZhaWx1cmVzIHRvIGNhbGMgdHB0ICovCisjZGVmaW5lIFJBVEVfTUlOX1NVQ0NFU1NfVEgJCTgJLyogbWluIHN1Y2Nlc3NlcyB0byBjYWxjIHRwdCAqLworCisvKiBtYXggYWxsb3dlZCByYXRlIG1pc3MgYmVmb3JlIHN5bmMgTFEgY21kICovCisjZGVmaW5lIElMX01JU1NFRF9SQVRFX01BWAkJMTUKKy8qIG1heCB0aW1lIHRvIGFjY3VtIGhpc3RvcnkgMiBzZWNvbmRzICovCisjZGVmaW5lIFJBVEVfU0NBTEVfRkxVU0hfSU5UVkwgICAoMypIWikKKworc3RhdGljIHU4IHJzX2h0X3RvX2xlZ2FjeVtdID0geworCVJBVEVfNk1fSURYLCBSQVRFXzZNX0lEWCwKKwlSQVRFXzZNX0lEWCwgUkFURV82TV9JRFgsCisJUkFURV82TV9JRFgsCisJUkFURV82TV9JRFgsIFJBVEVfOU1fSURYLAorCVJBVEVfMTJNX0lEWCwgUkFURV8xOE1fSURYLAorCVJBVEVfMjRNX0lEWCwgUkFURV8zNk1fSURYLAorCVJBVEVfNDhNX0lEWCwgUkFURV81NE1fSURYCit9OworCitzdGF0aWMgY29uc3QgdTggYW50X3RvZ2dsZV9sb29rdXBbXSA9IHsKKwkvKkFOVF9OT05FIC0+ICovIEFOVF9OT05FLAorCS8qQU5UX0EgICAgLT4gKi8gQU5UX0IsCisJLypBTlRfQiAgICAtPiAqLyBBTlRfQywKKwkvKkFOVF9BQiAgIC0+ICovIEFOVF9CQywKKwkvKkFOVF9DICAgIC0+ICovIEFOVF9BLAorCS8qQU5UX0FDICAgLT4gKi8gQU5UX0FCLAorCS8qQU5UX0JDICAgLT4gKi8gQU5UX0FDLAorCS8qQU5UX0FCQyAgLT4gKi8gQU5UX0FCQywKK307CisKKyNkZWZpbmUgSUxfREVDTEFSRV9SQVRFX0lORk8ociwgcywgaXAsIGluLCBycCwgcm4sIHBwLCBucCkgICAgXAorCVtSQVRFXyMjciMjTV9JRFhdID0geyBSQVRFXyMjciMjTV9QTENQLCAgICAgIFwKKwkJCQkgICAgUkFURV9TSVNPXyMjcyMjTV9QTENQLCBcCisJCQkJICAgIFJBVEVfTUlNTzJfIyNzIyNNX1BMQ1AsXAorCQkJCSAgICBSQVRFXyMjciMjTV9JRUVFLCAgICAgIFwKKwkJCQkgICAgUkFURV8jI2lwIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjaW4jI01fSURYLCAgICBcCisJCQkJICAgIFJBVEVfIyNycCMjTV9JRFgsICAgIFwKKwkJCQkgICAgUkFURV8jI3JuIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjcHAjI01fSURYLCAgICBcCisJCQkJICAgIFJBVEVfIyNucCMjTV9JRFggfQorCisvKgorICogUGFyYW1ldGVyIG9yZGVyOgorICogICByYXRlLCBodCByYXRlLCBwcmV2IHJhdGUsIG5leHQgcmF0ZSwgcHJldiB0Z2cgcmF0ZSwgbmV4dCB0Z2cgcmF0ZQorICoKKyAqIElmIHRoZXJlIGlzbid0IGEgdmFsaWQgbmV4dCBvciBwcmV2aW91cyByYXRlIHRoZW4gSU5WIGlzIHVzZWQgd2hpY2gKKyAqIG1hcHMgdG8gUkFURV9JTlZBTElECisgKgorICovCitjb25zdCBzdHJ1Y3QgaWxfcmF0ZV9pbmZvIGlsX3JhdGVzW1JBVEVfQ09VTlRdID0geworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksCS8qICAxbWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDIsIElOViwgMSwgNSwgMSwgNSwgMSwgNSksCQkvKiAgMm1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1LCBJTlYsIDIsIDYsIDIsIDExLCAyLCAxMSksCS8qNS41bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCBJTlYsIDksIDEyLCA5LCAxMiwgNSwgMTgpLAkvKiAxMW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLAkJLyogIDZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oOSwgNiwgNiwgMTEsIDYsIDExLCA1LCAxMSksCS8qICA5bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEyLCAxMiwgMTEsIDE4LCAxMSwgMTgsIDExLCAxOCksCS8qIDEybWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDE4LCAxOCwgMTIsIDI0LCAxMiwgMjQsIDExLCAyNCksCS8qIDE4bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDI0LCAyNCwgMTgsIDM2LCAxOCwgMzYsIDE4LCAzNiksCS8qIDI0bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDM2LCAzNiwgMjQsIDQ4LCAyNCwgNDgsIDI0LCA0OCksCS8qIDM2bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDQ4LCA0OCwgMzYsIDU0LCAzNiwgNTQsIDM2LCA1NCksCS8qIDQ4bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDU0LCA1NCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksLyogNTRtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNjAsIDYwLCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA2MG1icHMgKi8KK307CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodTMyIHJhdGVfbl9mbGFncykKK3sKKwlpbnQgaWR4ID0gMDsKKworCS8qIEhUIHJhdGUgZm9ybWF0ICovCisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgeworCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7CisKKwkJaWYgKGlkeCA+PSBSQVRFX01JTU8yXzZNX1BMQ1ApCisJCQlpZHggPSBpZHggLSBSQVRFX01JTU8yXzZNX1BMQ1A7CisKKwkJaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJLyogc2tpcCA5TSBub3Qgc3VwcG9ydGVkIGluIGh0ICovCisJCWlmIChpZHggPj0gUkFURV85TV9JRFgpCisJCQlpZHggKz0gMTsKKwkJaWYgKGlkeCA+PSBJTF9GSVJTVF9PRkRNX1JBVEUgJiYgaWR4IDw9IElMX0xBU1RfT0ZETV9SQVRFKQorCQkJcmV0dXJuIGlkeDsKKworCQkvKiBsZWdhY3kgcmF0ZSBmb3JtYXQsIHNlYXJjaCBmb3IgbWF0Y2ggaW4gdGFibGUgKi8KKwl9IGVsc2UgeworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoaWxfcmF0ZXMpOyBpZHgrKykKKwkJCWlmIChpbF9yYXRlc1tpZHhdLnBsY3AgPT0gKHJhdGVfbl9mbGFncyAmIDB4RkYpKQorCQkJCXJldHVybiBpZHg7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQkgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKTsKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19maWxsX2xpbmtfY21kKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLCB1MzIgcmF0ZV9uX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCQkgICAgYm9vbCBmb3JjZV9zZWFyY2gpOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCQkgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpZHgpOworI2Vsc2UKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsIHUzMiAqIHJhdGVfbl9mbGFncywgaW50IGlkeCkKK3sKK30KKyNlbmRpZgorCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGVzIGNvbnRhaW4gdGhlIGV4cGVjdGVkIHRocm91Z2hwdXQgbWV0cmljcyBmb3IgYWxsIHJhdGVzCisgKgorICoJMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCwgNjAgTUJpdHMKKyAqCisgKiB3aGVyZSBpbnZhbGlkIGVudHJpZXMgYXJlIHplcm9zLgorICoKKyAqIENDSyByYXRlcyBhcmUgb25seSB2YWxpZCBpbiBsZWdhY3kgdGFibGUgYW5kIHdpbGwgb25seSBiZSB1c2VkIGluIEcKKyAqICgyLjQgR0h6KSBiYW5kLgorICovCisKK3N0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X2xlZ2FjeVtSQVRFX0NPVU5UXSA9IHsKKwk3LCAxMywgMzUsIDU4LCA0MCwgNTcsIDcyLCA5OCwgMTIxLCAxNTQsIDE3NywgMTg2LCAwCit9OworCitzdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9zaXNvMjBNSHpbNF1bUkFURV9DT1VOVF0gPSB7CisJezAsIDAsIDAsIDAsIDQyLCAwLCA3NiwgMTAyLCAxMjQsIDE1OCwgMTgzLCAxOTMsIDIwMn0sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgNDYsIDAsIDgyLCAxMTAsIDEzMiwgMTY3LCAxOTIsIDIwMiwgMjEwfSwJLyogU0dJICovCisJezAsIDAsIDAsIDAsIDQ4LCAwLCA5MywgMTM1LCAxNzYsIDI1MSwgMzE5LCAzNTEsIDM4MX0sCS8qIEFHRyAqLworCXswLCAwLCAwLCAwLCA1MywgMCwgMTAyLCAxNDksIDE5MywgMjc1LCAzNDgsIDM4MSwgNDEzfSwJLyogQUdHK1NHSSAqLworfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfc2lzbzQwTUh6WzRdW1JBVEVfQ09VTlRdID0geworCXswLCAwLCAwLCAwLCA3NywgMCwgMTI3LCAxNjAsIDE4NCwgMjIwLCAyNDIsIDI1MCwgMjU3fSwJLyogTm9ybSAqLworCXswLCAwLCAwLCAwLCA4MywgMCwgMTM1LCAxNjksIDE5MywgMjI5LCAyNTAsIDI1NywgMjY0fSwJLyogU0dJICovCisJezAsIDAsIDAsIDAsIDk2LCAwLCAxODIsIDI1OSwgMzI4LCA0NTEsIDU1MywgNTk4LCA2NDB9LAkvKiBBR0cgKi8KKwl7MCwgMCwgMCwgMCwgMTA2LCAwLCAxOTksIDI4MiwgMzU3LCA0ODcsIDU5MywgNjQwLCA2ODN9LAkvKiBBR0crU0dJICovCit9OworCitzdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9taW1vMl8yME1Iels0XVtSQVRFX0NPVU5UXSA9IHsKKwl7MCwgMCwgMCwgMCwgNzQsIDAsIDEyMywgMTU1LCAxNzksIDIxMywgMjM1LCAyNDMsIDI1MH0sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgODEsIDAsIDEzMSwgMTY0LCAxODcsIDIyMSwgMjQyLCAyNTAsIDI1Nn0sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCA5MiwgMCwgMTc1LCAyNTAsIDMxNywgNDM2LCA1MzQsIDU3OCwgNjE5fSwJLyogQUdHICovCisJezAsIDAsIDAsIDAsIDEwMiwgMCwgMTkyLCAyNzMsIDM0NCwgNDcwLCA1NzMsIDYxOSwgNjYwfSwJLyogQUdHK1NHSSAqLworfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbWltbzJfNDBNSHpbNF1bUkFURV9DT1VOVF0gPSB7CisJezAsIDAsIDAsIDAsIDEyMywgMCwgMTgyLCAyMTQsIDIzNSwgMjY0LCAyNzksIDI4NSwgMjg5fSwJLyogTm9ybSAqLworCXswLCAwLCAwLCAwLCAxMzEsIDAsIDE5MSwgMjIyLCAyNDIsIDI3MCwgMjg0LCAyODksIDI5M30sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCAxODAsIDAsIDMyNywgNDQ2LCA1NDUsIDcwOCwgODI4LCA4NzgsIDkyMn0sCS8qIEFHRyAqLworCXswLCAwLCAwLCAwLCAxOTcsIDAsIDM1NSwgNDgxLCA1ODQsIDc1MiwgODcyLCA5MjIsIDk2Nn0sCS8qIEFHRytTR0kgKi8KK307CisKKy8qIG1icHMsIG1jcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9yYXRlX21jc19pbmZvIGlsX3JhdGVfbWNzW1JBVEVfQ09VTlRdID0geworCXsiMSIsICJCUFNLIERTU1MifSwKKwl7IjIiLCAiUVBTSyBEU1NTIn0sCisJeyI1LjUiLCAiQlBTSyBDQ0sifSwKKwl7IjExIiwgIlFQU0sgQ0NLIn0sCisJeyI2IiwgIkJQU0sgMS8yIn0sCisJeyI5IiwgIkJQU0sgMS8yIn0sCisJeyIxMiIsICJRUFNLIDEvMiJ9LAorCXsiMTgiLCAiUVBTSyAzLzQifSwKKwl7IjI0IiwgIjE2UUFNIDEvMiJ9LAorCXsiMzYiLCAiMTZRQU0gMy80In0sCisJeyI0OCIsICI2NFFBTSAyLzMifSwKKwl7IjU0IiwgIjY0UUFNIDMvNCJ9LAorCXsiNjAiLCAiNjRRQU0gNS82In0sCit9OworCisjZGVmaW5lIE1DU19JRFhfUEVSX1NUUkVBTQkoOCkKKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X3JzX2V4dHJhY3RfcmF0ZSh1MzIgcmF0ZV9uX2ZsYWdzKQoreworCXJldHVybiAodTgpIChyYXRlX25fZmxhZ3MgJiAweEZGKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhICp3aW4pCit7CisJd2luLT5kYXRhID0gMDsKKwl3aW4tPnN1Y2Nlc3NfY291bnRlciA9IDA7CisJd2luLT5zdWNjZXNzX3JhdGlvID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl3aW4tPmNvdW50ZXIgPSAwOworCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXdpbi0+c3RhbXAgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHU4CitpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHU4IHZhbGlkX2FudGVubmEsIHU4IGFudF90eXBlKQoreworCXJldHVybiAoYW50X3R5cGUgJiB2YWxpZF9hbnRlbm5hKSA9PSBhbnRfdHlwZTsKK30KKworLyoKKyAqCXJlbW92ZXMgdGhlIG9sZCBkYXRhIGZyb20gdGhlIHN0YXRzLiBBbGwgZGF0YSB0aGF0IGlzIG9sZGVyIHRoYW4KKyAqCVRJRF9NQVhfVElNRV9ESUZGLCB3aWxsIGJlIGRlbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHN0cnVjdCBpbF90cmFmZmljX2xvYWQgKnRsLCB1MzIgY3Vycl90aW1lKQoreworCS8qIFRoZSBvbGRlc3QgYWdlIHdlIHdhbnQgdG8ga2VlcCAqLworCXUzMiBvbGRlc3RfdGltZSA9IGN1cnJfdGltZSAtIFRJRF9NQVhfVElNRV9ESUZGOworCisJd2hpbGUgKHRsLT5xdWV1ZV9jb3VudCAmJiB0bC0+dGltZV9zdGFtcCA8IG9sZGVzdF90aW1lKSB7CisJCXRsLT50b3RhbCAtPSB0bC0+cGFja2V0X2NvdW50W3RsLT5oZWFkXTsKKwkJdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF0gPSAwOworCQl0bC0+dGltZV9zdGFtcCArPSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOworCQl0bC0+cXVldWVfY291bnQtLTsKKwkJdGwtPmhlYWQrKzsKKwkJaWYgKHRsLT5oZWFkID49IFRJRF9RVUVVRV9NQVhfU0laRSkKKwkJCXRsLT5oZWFkID0gMDsKKwl9Cit9CisKKy8qCisgKglpbmNyZW1lbnQgdHJhZmZpYyBsb2FkIHZhbHVlIGZvciB0aWQgYW5kIGFsc28gcmVtb3ZlCisgKglhbnkgb2xkIHZhbHVlcyBpZiBwYXNzZWQgdGhlIGNlcnRhaW4gdGltZSBwZXJpb2QKKyAqLworc3RhdGljIHU4CitpbDQ5NjVfcnNfdGxfYWRkX3BhY2tldChzdHJ1Y3QgaWxfbHFfc3RhICpscV9kYXRhLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXUzMiBjdXJyX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOworCXUzMiB0aW1lX2RpZmY7CisJczMyIGlkeDsKKwlzdHJ1Y3QgaWxfdHJhZmZpY19sb2FkICp0bCA9IE5VTEw7CisJdTggdGlkOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwl9IGVsc2UKKwkJcmV0dXJuIE1BWF9USURfQ09VTlQ7CisKKwlpZiAodW5saWtlbHkodGlkID49IFRJRF9NQVhfTE9BRF9DT1VOVCkpCisJCXJldHVybiBNQVhfVElEX0NPVU5UOworCisJdGwgPSAmbHFfZGF0YS0+bG9hZFt0aWRdOworCisJY3Vycl90aW1lIC09IGN1cnJfdGltZSAlIFRJRF9ST1VORF9WQUxVRTsKKworCS8qIEhhcHBlbnMgb25seSBmb3IgdGhlIGZpcnN0IHBhY2tldC4gSW5pdGlhbGl6ZSB0aGUgZGF0YSAqLworCWlmICghKHRsLT5xdWV1ZV9jb3VudCkpIHsKKwkJdGwtPnRvdGFsID0gMTsKKwkJdGwtPnRpbWVfc3RhbXAgPSBjdXJyX3RpbWU7CisJCXRsLT5xdWV1ZV9jb3VudCA9IDE7CisJCXRsLT5oZWFkID0gMDsKKwkJdGwtPnBhY2tldF9jb3VudFswXSA9IDE7CisJCXJldHVybiBNQVhfVElEX0NPVU5UOworCX0KKworCXRpbWVfZGlmZiA9IFRJTUVfV1JBUF9BUk9VTkQodGwtPnRpbWVfc3RhbXAsIGN1cnJfdGltZSk7CisJaWR4ID0gdGltZV9kaWZmIC8gVElEX1FVRVVFX0NFTExfU1BBQ0lORzsKKworCS8qIFRoZSBoaXN0b3J5IGlzIHRvbyBsb25nOiByZW1vdmUgZGF0YSB0aGF0IGlzIG9sZGVyIHRoYW4gKi8KKwkvKiBUSURfTUFYX1RJTUVfRElGRiAqLworCWlmIChpZHggPj0gVElEX1FVRVVFX01BWF9TSVpFKQorCQlpbDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHRsLCBjdXJyX3RpbWUpOworCisJaWR4ID0gKHRsLT5oZWFkICsgaWR4KSAlIFRJRF9RVUVVRV9NQVhfU0laRTsKKwl0bC0+cGFja2V0X2NvdW50W2lkeF0gPSB0bC0+cGFja2V0X2NvdW50W2lkeF0gKyAxOworCXRsLT50b3RhbCA9IHRsLT50b3RhbCArIDE7CisKKwlpZiAoKGlkeCArIDEpID4gdGwtPnF1ZXVlX2NvdW50KQorCQl0bC0+cXVldWVfY291bnQgPSBpZHggKyAxOworCisJcmV0dXJuIHRpZDsKK30KKworLyoKKwlnZXQgdGhlIHRyYWZmaWMgbG9hZCB2YWx1ZSBmb3IgdGlkCisqLworc3RhdGljIHUzMgoraWw0OTY1X3JzX3RsX2dldF9sb2FkKHN0cnVjdCBpbF9scV9zdGEgKmxxX2RhdGEsIHU4IHRpZCkKK3sKKwl1MzIgY3Vycl90aW1lID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKKwl1MzIgdGltZV9kaWZmOworCXMzMiBpZHg7CisJc3RydWN0IGlsX3RyYWZmaWNfbG9hZCAqdGwgPSBOVUxMOworCisJaWYgKHRpZCA+PSBUSURfTUFYX0xPQURfQ09VTlQpCisJCXJldHVybiAwOworCisJdGwgPSAmKGxxX2RhdGEtPmxvYWRbdGlkXSk7CisKKwljdXJyX3RpbWUgLT0gY3Vycl90aW1lICUgVElEX1JPVU5EX1ZBTFVFOworCisJaWYgKCEodGwtPnF1ZXVlX2NvdW50KSkKKwkJcmV0dXJuIDA7CisKKwl0aW1lX2RpZmYgPSBUSU1FX1dSQVBfQVJPVU5EKHRsLT50aW1lX3N0YW1wLCBjdXJyX3RpbWUpOworCWlkeCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7CisKKwkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCisJLyogVElEX01BWF9USU1FX0RJRkYgKi8KKwlpZiAoaWR4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKKwkJaWw0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKKworCXJldHVybiB0bC0+dG90YWw7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9yc190bF90dXJuX29uX2FnZ19mb3JfdGlkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfZGF0YSwKKwkJCQkgdTggdGlkLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWludCByZXQgPSAtRUFHQUlOOworCXUzMiBsb2FkOworCisJbG9hZCA9IGlsNDk2NV9yc190bF9nZXRfbG9hZChscV9kYXRhLCB0aWQpOworCisJaWYgKGxvYWQgPiBJTF9BR0dfTE9BRF9USFJFU0hPTEQpIHsKKwkJRF9IVCgiU3RhcnRpbmcgVHggYWdnOiBTVEE6ICVwTSB0aWQ6ICVkXG4iLCBzdGEtPmFkZHIsIHRpZCk7CisJCXJldCA9IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCA1MDAwKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkvKgorCQkJICogZHJpdmVyIGFuZCBtYWM4MDIxMSBpcyBvdXQgb2Ygc3luYworCQkJICogdGhpcyBtaWdodCBiZSBjYXVzZSBieSByZWxvYWRpbmcgZmlybXdhcmUKKwkJCSAqIHN0b3AgdGhlIHR4IGJhIHNlc3Npb24gaGVyZQorCQkJICovCisJCQlJTF9FUlIoIkZhaWwgc3RhcnQgVHggYWdnIG9uIHRpZDogJWRcbiIsIHRpZCk7CisJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKKwkJfQorCX0gZWxzZQorCQlEX0hUKCJBZ2dyZWdhdGlvbiBub3QgZW5hYmxlZCBmb3IgdGlkICVkIGJlY2F1c2UgbG9hZCA9ICV1XG4iLAorCQkgICAgIHRpZCwgbG9hZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnKHN0cnVjdCBpbF9wcml2ICppbCwgdTggdGlkLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9kYXRhLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaWYgKHRpZCA8IFRJRF9NQVhfTE9BRF9DT1VOVCkKKwkJaWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnX2Zvcl90aWQoaWwsIGxxX2RhdGEsIHRpZCwgc3RhKTsKKwllbHNlCisJCUlMX0VSUigidGlkIGV4Y2VlZHMgbWF4IGxvYWQgY291bnQ6ICVkLyVkXG4iLCB0aWQsCisJCSAgICAgICBUSURfTUFYX0xPQURfQ09VTlQpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2dldF9pbDQ5NjVfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FfTVNLKSArCisJICAgICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9CX01TSykgKworCSAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQ19NU0spOworfQorCisvKgorICogU3RhdGljIGZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBmcm9tIGFuIGlsX3NjYWxlX3RibF9pbmZvCisgKiB0aGF0IHdyYXBzIGEgTlVMTCBwb2ludGVyIGNoZWNrCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9nZXRfZXhwZWN0ZWRfdHB0KHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgcnNfaWR4KQoreworCWlmICh0YmwtPmV4cGVjdGVkX3RwdCkKKwkJcmV0dXJuIHRibC0+ZXhwZWN0ZWRfdHB0W3JzX2lkeF07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X3JzX2NvbGxlY3RfdHhfZGF0YSAtIFVwZGF0ZSB0aGUgc3VjY2Vzcy9mYWlsdXJlIHNsaWRpbmcgd2luCisgKgorICogV2Uga2VlcCBhIHNsaWRpbmcgd2luIG9mIHRoZSBsYXN0IDYyIHBhY2tldHMgdHJhbnNtaXR0ZWQKKyAqIGF0IHRoaXMgcmF0ZS4gIHdpbi0+ZGF0YSBjb250YWlucyB0aGUgYml0bWFzayBvZiBzdWNjZXNzZnVsCisgKiBwYWNrZXRzLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgc2NhbGVfaWR4LAorCQkJICBpbnQgYXR0ZW1wdHMsIGludCBzdWNjZXNzZXMpCit7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgdTY0IG1hc2sgPSAoKCh1NjQpIDEpIDw8IChSQVRFX01BWF9XSU5ET1cgLSAxKSk7CisJczMyIGZhaWxfY291bnQsIHRwdDsKKworCWlmIChzY2FsZV9pZHggPCAwIHx8IHNjYWxlX2lkeCA+PSBSQVRFX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNlbGVjdCB3aW4gZm9yIGN1cnJlbnQgdHggYml0IHJhdGUgKi8KKwl3aW4gPSAmKHRibC0+d2luW3NjYWxlX2lkeF0pOworCisJLyogR2V0IGV4cGVjdGVkIHRocm91Z2hwdXQgKi8KKwl0cHQgPSBpbDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdCh0YmwsIHNjYWxlX2lkeCk7CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2Ygb25seSB0aGUgbGF0ZXN0IDYyIHR4IGZyYW1lIGF0dGVtcHRzIGluIHRoaXMgcmF0ZSdzCisJICogaGlzdG9yeSB3aW47IGFueXRoaW5nIG9sZGVyIGlzbid0IHJlYWxseSByZWxldmFudCBhbnkgbW9yZS4KKwkgKiBJZiB3ZSBoYXZlIGZpbGxlZCB1cCB0aGUgc2xpZGluZyB3aW4sIGRyb3AgdGhlIG9sZGVzdCBhdHRlbXB0OworCSAqIGlmIHRoZSBvbGRlc3QgYXR0ZW1wdCAoaGlnaGVzdCBiaXQgaW4gYml0bWFwKSBzaG93cyAic3VjY2VzcyIsCisJICogc3VidHJhY3QgIjEiIGZyb20gdGhlIHN1Y2Nlc3MgY291bnRlciAodGhpcyBpcyB0aGUgbWFpbiByZWFzb24KKwkgKiB3ZSBrZWVwIHRoZXNlIGJpdG1hcHMhKS4KKwkgKi8KKwl3aGlsZSAoYXR0ZW1wdHMgPiAwKSB7CisJCWlmICh3aW4tPmNvdW50ZXIgPj0gUkFURV9NQVhfV0lORE9XKSB7CisKKwkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLworCQkJd2luLT5jb3VudGVyID0gUkFURV9NQVhfV0lORE9XIC0gMTsKKworCQkJaWYgKHdpbi0+ZGF0YSAmIG1hc2spIHsKKwkJCQl3aW4tPmRhdGEgJj0gfm1hc2s7CisJCQkJd2luLT5zdWNjZXNzX2NvdW50ZXItLTsKKwkJCX0KKwkJfQorCisJCS8qIEluY3JlbWVudCBmcmFtZXMtYXR0ZW1wdGVkIGNvdW50ZXIgKi8KKwkJd2luLT5jb3VudGVyKys7CisKKwkJLyogU2hpZnQgYml0bWFwIGJ5IG9uZSBmcmFtZSB0byB0aHJvdyBhd2F5IG9sZGVzdCBoaXN0b3J5ICovCisJCXdpbi0+ZGF0YSA8PD0gMTsKKworCQkvKiBNYXJrIHRoZSBtb3N0IHJlY2VudCAjc3VjY2Vzc2VzIGF0dGVtcHRzIGFzIHN1Y2Nlc3NmdWwgKi8KKwkJaWYgKHN1Y2Nlc3NlcyA+IDApIHsKKwkJCXdpbi0+c3VjY2Vzc19jb3VudGVyKys7CisJCQl3aW4tPmRhdGEgfD0gMHgxOworCQkJc3VjY2Vzc2VzLS07CisJCX0KKworCQlhdHRlbXB0cy0tOworCX0KKworCS8qIENhbGN1bGF0ZSBjdXJyZW50IHN1Y2Nlc3MgcmF0aW8sIGF2b2lkIGRpdmlkZS1ieS0wISAqLworCWlmICh3aW4tPmNvdW50ZXIgPiAwKQorCQl3aW4tPnN1Y2Nlc3NfcmF0aW8gPQorCQkgICAgMTI4ICogKDEwMCAqIHdpbi0+c3VjY2Vzc19jb3VudGVyKSAvIHdpbi0+Y291bnRlcjsKKwllbHNlCisJCXdpbi0+c3VjY2Vzc19yYXRpbyA9IElMX0lOVkFMSURfVkFMVUU7CisKKwlmYWlsX2NvdW50ID0gd2luLT5jb3VudGVyIC0gd2luLT5zdWNjZXNzX2NvdW50ZXI7CisKKwkvKiBDYWxjdWxhdGUgYXZlcmFnZSB0aHJvdWdocHV0LCBpZiB3ZSBoYXZlIGVub3VnaCBoaXN0b3J5LiAqLworCWlmIChmYWlsX2NvdW50ID49IFJBVEVfTUlOX0ZBSUxVUkVfVEggfHwKKwkgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIgPj0gUkFURV9NSU5fU1VDQ0VTU19USCkKKwkJd2luLT5hdmVyYWdlX3RwdCA9ICh3aW4tPnN1Y2Nlc3NfcmF0aW8gKiB0cHQgKyA2NCkgLyAxMjg7CisJZWxzZQorCQl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKworCS8qIFRhZyB0aGlzIHdpbiBhcyBoYXZpbmcgYmVlbiB1cGRhdGVkICovCisJd2luLT5zdGFtcCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbGwgdUNvZGUgQVBJIHJhdGVfbl9mbGFncyBmaWVsZCwgYmFzZWQgb24gInNlYXJjaCIgb3IgImFjdGl2ZSIgdGFibGUuCisgKi8KK3N0YXRpYyB1MzIKK2lsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90Ymwoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwKKwkJCSAgICAgaW50IGlkeCwgdTggdXNlX2dyZWVuKQoreworCXUzMiByYXRlX25fZmxhZ3MgPSAwOworCisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKSB7CisJCXJhdGVfbl9mbGFncyA9IGlsX3JhdGVzW2lkeF0ucGxjcDsKKwkJaWYgKGlkeCA+PSBJTF9GSVJTVF9DQ0tfUkFURSAmJiBpZHggPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJfSBlbHNlIGlmIChpc19IdCh0YmwtPmxxX3R5cGUpKSB7CisJCWlmIChpZHggPiBJTF9MQVNUX09GRE1fUkFURSkgeworCQkJSUxfRVJSKCJJbnZhbGlkIEhUIHJhdGUgaWR4ICVkXG4iLCBpZHgpOworCQkJaWR4ID0gSUxfTEFTVF9PRkRNX1JBVEU7CisJCX0KKwkJcmF0ZV9uX2ZsYWdzID0gUkFURV9NQ1NfSFRfTVNLOworCisJCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCisJCQlyYXRlX25fZmxhZ3MgfD0gaWxfcmF0ZXNbaWR4XS5wbGNwX3Npc287CisJCWVsc2UKKwkJCXJhdGVfbl9mbGFncyB8PSBpbF9yYXRlc1tpZHhdLnBsY3BfbWltbzI7CisJfSBlbHNlIHsKKwkJSUxfRVJSKCJJbnZhbGlkIHRibC0+bHFfdHlwZSAlZFxuIiwgdGJsLT5scV90eXBlKTsKKwl9CisKKwlyYXRlX25fZmxhZ3MgfD0KKwkgICAgKCh0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1MpICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spOworCisJaWYgKGlzX0h0KHRibC0+bHFfdHlwZSkpIHsKKwkJaWYgKHRibC0+aXNfaHQ0MCkgeworCQkJaWYgKHRibC0+aXNfZHVwKQorCQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19EVVBfTVNLOworCQkJZWxzZQorCQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19IVDQwX01TSzsKKwkJfQorCQlpZiAodGJsLT5pc19TR0kpCisJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfU0dJX01TSzsKKworCQlpZiAodXNlX2dyZWVuKSB7CisJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfR0ZfTVNLOworCQkJaWYgKGlzX3Npc28odGJsLT5scV90eXBlKSAmJiB0YmwtPmlzX1NHSSkgeworCQkJCXJhdGVfbl9mbGFncyAmPSB+UkFURV9NQ1NfU0dJX01TSzsKKwkJCQlJTF9FUlIoIkdGIHdhcyBzZXQgd2l0aCBTR0k6U0lTT1xuIik7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJhdGVfbl9mbGFnczsKK30KKworLyoKKyAqIEludGVycHJldCB1Q29kZSBBUEkncyByYXRlX25fZmxhZ3MgZm9ybWF0LAorICogZmlsbCAic2VhcmNoIiBvciAiYWN0aXZlIiB0eCBtb2RlIHRhYmxlLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKGNvbnN0IHUzMiByYXRlX25fZmxhZ3MsCisJCQkJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgKnJhdGVfaWR4KQoreworCXUzMiBhbnRfbXNrID0gKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKKwl1OCBpbDQ5NjVfbnVtX29mX2FudCA9CisJICAgIGlsNDk2NV9nZXRfaWw0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHJhdGVfbl9mbGFncyk7CisJdTggbWNzOworCisJbWVtc2V0KHRibCwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykpOworCSpyYXRlX2lkeCA9IGlsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgocmF0ZV9uX2ZsYWdzKTsKKworCWlmICgqcmF0ZV9pZHggPT0gUkFURV9JTlZBTElEKSB7CisJCSpyYXRlX2lkeCA9IC0xOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGJsLT5pc19TR0kgPSAwOwkvKiBkZWZhdWx0IGxlZ2FjeSBzZXR1cCAqLworCXRibC0+aXNfaHQ0MCA9IDA7CisJdGJsLT5pc19kdXAgPSAwOworCXRibC0+YW50X3R5cGUgPSAoYW50X21zayA+PiBSQVRFX01DU19BTlRfUE9TKTsKKwl0YmwtPmxxX3R5cGUgPSBMUV9OT05FOworCXRibC0+bWF4X3NlYXJjaCA9IElMX01BWF9TRUFSQ0g7CisKKwkvKiBsZWdhY3kgcmF0ZSBmb3JtYXQgKi8KKwlpZiAoIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spKSB7CisJCWlmIChpbDQ5NjVfbnVtX29mX2FudCA9PSAxKSB7CisJCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJCXRibC0+bHFfdHlwZSA9IExRX0E7CisJCQllbHNlCisJCQkJdGJsLT5scV90eXBlID0gTFFfRzsKKwkJfQorCQkvKiBIVCByYXRlIGZvcm1hdCAqLworCX0gZWxzZSB7CisJCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQkJdGJsLT5pc19TR0kgPSAxOworCisJCWlmICgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spIHx8CisJCSAgICAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykpCisJCQl0YmwtPmlzX2h0NDAgPSAxOworCisJCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19EVVBfTVNLKQorCQkJdGJsLT5pc19kdXAgPSAxOworCisJCW1jcyA9IGlsNDk2NV9yc19leHRyYWN0X3JhdGUocmF0ZV9uX2ZsYWdzKTsKKworCQkvKiBTSVNPICovCisJCWlmIChtY3MgPD0gUkFURV9TSVNPXzYwTV9QTENQKSB7CisJCQlpZiAoaWw0OTY1X251bV9vZl9hbnQgPT0gMSkKKwkJCQl0YmwtPmxxX3R5cGUgPSBMUV9TSVNPOwkvKmVsc2UgTk9ORSAqLworCQkJLyogTUlNTzIgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChpbDQ5NjVfbnVtX29mX2FudCA9PSAyKQorCQkJCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBzd2l0Y2ggdG8gYW5vdGhlciBhbnRlbm5hL2FudGVubmFzIGFuZCByZXR1cm4gMSAqLworLyogaWYgbm8gb3RoZXIgdmFsaWQgYW50ZW5uYSBmb3VuZCwgcmV0dXJuIDAgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh1MzIgdmFsaWRfYW50LCB1MzIgKnJhdGVfbl9mbGFncywKKwkJCSBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCkKK3sKKwl1OCBuZXdfYW50X3R5cGU7CisKKwlpZiAoIXRibC0+YW50X3R5cGUgfHwgdGJsLT5hbnRfdHlwZSA+IEFOVF9BQkMpCisJCXJldHVybiAwOworCisJaWYgKCFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgdGJsLT5hbnRfdHlwZSkpCisJCXJldHVybiAwOworCisJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbdGJsLT5hbnRfdHlwZV07CisKKwl3aGlsZSAobmV3X2FudF90eXBlICE9IHRibC0+YW50X3R5cGUgJiYKKwkgICAgICAgIWlsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfYW50LCBuZXdfYW50X3R5cGUpKQorCQluZXdfYW50X3R5cGUgPSBhbnRfdG9nZ2xlX2xvb2t1cFtuZXdfYW50X3R5cGVdOworCisJaWYgKG5ld19hbnRfdHlwZSA9PSB0YmwtPmFudF90eXBlKQorCQlyZXR1cm4gMDsKKworCXRibC0+YW50X3R5cGUgPSBuZXdfYW50X3R5cGU7CisJKnJhdGVfbl9mbGFncyAmPSB+UkFURV9NQ1NfQU5UX0FCQ19NU0s7CisJKnJhdGVfbl9mbGFncyB8PSBuZXdfYW50X3R5cGUgPDwgUkFURV9NQ1NfQU5UX1BPUzsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBHcmVlbi1maWVsZCBtb2RlIGlzIHZhbGlkIGlmIHRoZSBzdGF0aW9uIHN1cHBvcnRzIGl0IGFuZAorICogdGhlcmUgYXJlIG5vIG5vbi1HRiBzdGF0aW9ucyBwcmVzZW50IGluIHRoZSBCU1MuCisgKi8KK3N0YXRpYyBib29sCitpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlyZXR1cm4gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgJiYKKwkgICAgIShjdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCk7Cit9CisKKy8qKgorICogaWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMgLSBnZXQgdGhlIGF2YWlsYWJsZSByYXRlcworICoKKyAqIGlmIG1hbmFnZW1lbnQgZnJhbWUgb3IgYnJvYWRjYXN0IGZyYW1lIG9ubHkgcmV0dXJuCisgKiBiYXNpYyBhdmFpbGFibGUgcmF0ZXMuCisgKgorICovCitzdGF0aWMgdTE2CitpbDQ5NjVfcnNfZ2V0X3N1cHBvcnRlZF9yYXRlcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICAgZW51bSBpbF90YWJsZV90eXBlIHJhdGVfdHlwZSkKK3sKKwlpZiAoaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKKwkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlOworCX0gZWxzZSB7CisJCWlmIChpc19zaXNvKHJhdGVfdHlwZSkpCisJCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOworCQllbHNlCisJCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKKwl9Cit9CisKK3N0YXRpYyB1MTYKK2lsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkeCwgdTE2IHJhdGVfbWFzaywKKwkJCSAgICBpbnQgcmF0ZV90eXBlKQoreworCXU4IGhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisJdTggbG93ID0gUkFURV9JTlZBTElEOworCisJLyogODAyLjExQSBvciBodCB3YWxrcyB0byB0aGUgbmV4dCBsaXRlcmFsIGFkamFjZW50IHJhdGUgaW4KKwkgKiB0aGUgcmF0ZSB0YWJsZSAqLworCWlmIChpc19hX2JhbmQocmF0ZV90eXBlKSB8fCAhaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKKwkJaW50IGk7CisJCXUzMiBtYXNrOworCisJCS8qIEZpbmQgdGhlIHByZXZpb3VzIHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCisJCWkgPSBpZHggLSAxOworCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA+PSAwOyBpLS0sIG1hc2sgPj49IDEpIHsKKwkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7CisJCQkJbG93ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIEZpbmQgdGhlIG5leHQgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KKwkJaSA9IGlkeCArIDE7CisJCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgUkFURV9DT1VOVDsgaSsrLCBtYXNrIDw8PSAxKSB7CisJCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgeworCQkJCWhpZ2ggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworCX0KKworCWxvdyA9IGlkeDsKKwl3aGlsZSAobG93ICE9IFJBVEVfSU5WQUxJRCkgeworCQlsb3cgPSBpbF9yYXRlc1tsb3ddLnByZXZfcnM7CisJCWlmIChsb3cgPT0gUkFURV9JTlZBTElEKQorCQkJYnJlYWs7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBsb3cpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGxvd2VyIHJhdGU6ICVkXG4iLCBsb3cpOworCX0KKworCWhpZ2ggPSBpZHg7CisJd2hpbGUgKGhpZ2ggIT0gUkFURV9JTlZBTElEKSB7CisJCWhpZ2ggPSBpbF9yYXRlc1toaWdoXS5uZXh0X3JzOworCQlpZiAoaGlnaCA9PSBSQVRFX0lOVkFMSUQpCisJCQlicmVhazsKKwkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGhpZ2gpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGhpZ2hlciByYXRlOiAlZFxuIiwgaGlnaCk7CisJfQorCisJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworfQorCitzdGF0aWMgdTMyCitpbDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUoc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCB1OCBzY2FsZV9pZHgsCisJCQkgdTggaHRfcG9zc2libGUpCit7CisJczMyIGxvdzsKKwl1MTYgcmF0ZV9tYXNrOworCXUxNiBoaWdoX2xvdzsKKwl1OCBzd2l0Y2hfdG9fbGVnYWN5ID0gMDsKKwl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CisJc3RydWN0IGlsX3ByaXYgKmlsID0gbHFfc3RhLT5kcnY7CisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHN3aXRjaCBmcm9tIEhUIHRvIGxlZ2FjeSByYXRlcy4KKwkgKiBhc3N1bXB0aW9uIGlzIHRoYXQgbWFuZGF0b3J5IHJhdGVzICgxTWJwcyBvciA2TWJwcykKKwkgKiBhcmUgYWx3YXlzIHN1cHBvcnRlZCAoc3BlYyBkZW1hbmQpICovCisJaWYgKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAoIWh0X3Bvc3NpYmxlIHx8ICFzY2FsZV9pZHgpKSB7CisJCXN3aXRjaF90b19sZWdhY3kgPSAxOworCQlzY2FsZV9pZHggPSByc19odF90b19sZWdhY3lbc2NhbGVfaWR4XTsKKwkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJdGJsLT5scV90eXBlID0gTFFfQTsKKwkJZWxzZQorCQkJdGJsLT5scV90eXBlID0gTFFfRzsKKworCQlpZiAoaWw0OTY1X251bV9vZl9hbnQodGJsLT5hbnRfdHlwZSkgPiAxKQorCQkJdGJsLT5hbnRfdHlwZSA9CisJCQkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCisJCXRibC0+aXNfaHQ0MCA9IDA7CisJCXRibC0+aXNfU0dJID0gMDsKKwkJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwl9CisKKwlyYXRlX21hc2sgPSBpbDQ5NjVfcnNfZ2V0X3N1cHBvcnRlZF9yYXRlcyhscV9zdGEsIE5VTEwsIHRibC0+bHFfdHlwZSk7CisKKwkvKiBNYXNrIHdpdGggc3RhdGlvbiByYXRlIHJlc3RyaWN0aW9uICovCisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKSB7CisJCS8qIHN1cHBfcmF0ZXMgaGFzIG5vIENDSyBiaXRzIGluIEEgbW9kZSAqLworCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQlyYXRlX21hc2sgPQorCQkJICAgICh1MTYpIChyYXRlX21hc2sgJgorCQkJCSAgIChscV9zdGEtPnN1cHBfcmF0ZXMgPDwgSUxfRklSU1RfT0ZETV9SQVRFKSk7CisJCWVsc2UKKwkJCXJhdGVfbWFzayA9ICh1MTYpIChyYXRlX21hc2sgJiBscV9zdGEtPnN1cHBfcmF0ZXMpOworCX0KKworCS8qIElmIHdlIHN3aXRjaGVkIGZyb20gSFQgdG8gbGVnYWN5LCBjaGVjayBjdXJyZW50IHJhdGUgKi8KKwlpZiAoc3dpdGNoX3RvX2xlZ2FjeSAmJiAocmF0ZV9tYXNrICYgKDEgPDwgc2NhbGVfaWR4KSkpIHsKKwkJbG93ID0gc2NhbGVfaWR4OworCQlnb3RvIG91dDsKKwl9CisKKwloaWdoX2xvdyA9CisJICAgIGlsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShscV9zdGEtPmRydiwgc2NhbGVfaWR4LCByYXRlX21hc2ssCisJCQkJCXRibC0+bHFfdHlwZSk7CisJbG93ID0gaGlnaF9sb3cgJiAweGZmOworCisJaWYgKGxvdyA9PSBSQVRFX0lOVkFMSUQpCisJCWxvdyA9IHNjYWxlX2lkeDsKKworb3V0OgorCXJldHVybiBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGxxX3N0YS0+ZHJ2LCB0YmwsIGxvdywgaXNfZ3JlZW4pOworfQorCisvKgorICogU2ltcGxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHJhdGUgc2NhbGUgdGFibGUgdHlwZXMKKyAqLworc3RhdGljIGJvb2wKK2lsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICphLAorCQkJICBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKmIpCit7CisJcmV0dXJuIChhLT5scV90eXBlID09IGItPmxxX3R5cGUgJiYgYS0+YW50X3R5cGUgPT0gYi0+YW50X3R5cGUgJiYKKwkJYS0+aXNfU0dJID09IGItPmlzX1NHSSk7Cit9CisKKy8qCisgKiBtYWM4MDIxMSBzZW5kcyB1cyBUeCBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc190eF9zdGF0dXModm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBsZWdhY3lfc3VjY2VzczsKKwlpbnQgcmV0cmllczsKKwlpbnQgcnNfaWR4LCBtYWNfaWR4LCBpOworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGlsX3N0YTsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqdGFibGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwllbnVtIG1hYzgwMjExX3JhdGVfY29udHJvbF9mbGFncyBtYWNfZmxhZ3M7CisJdTMyIHR4X3JhdGU7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqY3Vycl90YmwsICpvdGhlcl90YmwsICp0bXBfdGJsOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJRF9SQVRFKCJnZXQgZnJhbWUgYWNrIHJlc3BvbnNlLCB1cGRhdGUgcmF0ZSBzY2FsZSB3aW5cbiIpOworCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAoIWxxX3N0YSkgeworCQlEX1JBVEUoIlN0YXRpb24gcmF0ZSBzY2FsaW5nIG5vdCBjcmVhdGVkIHlldC5cbiIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICghbHFfc3RhLT5kcnYpIHsKKwkJRF9SQVRFKCJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpIHx8CisJICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBwYWNrZXQgd2FzIGFnZ3JlZ2F0ZWQgYnV0IGRvZXNuJ3QgY2Fycnkgc3RhdHVzIGluZm8gKi8KKwlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKKwkgICAgIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZ25vcmUgdGhpcyBUeCBmcmFtZSByZXNwb25zZSBpZiBpdHMgaW5pdGlhbCByYXRlIGRvZXNuJ3QgbWF0Y2gKKwkgKiB0aGF0IG9mIGxhdGVzdCBMaW5rIFF1YWxpdHkgY29tbWFuZC4gIFRoZXJlIG1heSBiZSBzdHJhZ2dsZXJzCisJICogZnJvbSBhIHByZXZpb3VzIExpbmsgUXVhbGl0eSBjb21tYW5kLCBidXQgd2UncmUgbm8gbG9uZ2VyIGludGVyZXN0ZWQKKwkgKiBpbiB0aG9zZTsgdGhleSdyZSBlaXRoZXIgZnJvbSB0aGUgImFjdGl2ZSIgbW9kZSB3aGlsZSB3ZSdyZSB0cnlpbmcKKwkgKiB0byBjaGVjayAic2VhcmNoIiBtb2RlLCBvciBhIHByaW9yICJzZWFyY2giIG1vZGUgYWZ0ZXIgd2UndmUgbW92ZWQKKwkgKiB0byBhIG5ldyAic2VhcmNoIiBtb2RlICh3aGljaCBtaWdodCBiZWNvbWUgdGhlIG5ldyAiYWN0aXZlIiBtb2RlKS4KKwkgKi8KKwl0YWJsZSA9ICZscV9zdGEtPmxxOworCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzKTsKKwlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIGlsLT5iYW5kLCAmdGJsX3R5cGUsICZyc19pZHgpOworCWlmIChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyc19pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCW1hY19mbGFncyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5mbGFnczsKKwltYWNfaWR4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKKwkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCisJaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKKwkJbWFjX2lkeCAmPSBSQVRFX01DU19DT0RFX01TSzsJLyogUmVtb3ZlICMgb2Ygc3RyZWFtcyAqLworCQlpZiAobWFjX2lkeCA+PSAoUkFURV85TV9JRFggLSBJTF9GSVJTVF9PRkRNX1JBVEUpKQorCQkJbWFjX2lkeCsrOworCQkvKgorCQkgKiBtYWM4MDIxMSBIVCBpZHggaXMgYWx3YXlzIHplcm8taWR4ZWQ7IHdlIG5lZWQgdG8gbW92ZQorCQkgKiBIVCBPRkRNIHJhdGVzIGFmdGVyIENDSyByYXRlcyBpbiAyLjQgR0h6IGJhbmQKKwkJICovCisJCWlmIChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQkJbWFjX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJfQorCS8qIEhlcmUgd2UgYWN0dWFsbHkgY29tcGFyZSB0aGlzIHJhdGUgdG8gdGhlIGxhdGVzdCBMUSBjb21tYW5kICovCisJaWYgKG1hY19pZHggPCAwIHx8CisJICAgIHRibF90eXBlLmlzX1NHSSAhPSAhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpIHx8CisJICAgIHRibF90eXBlLmlzX2h0NDAgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkgfHwKKwkgICAgdGJsX3R5cGUuaXNfZHVwICE9ICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19EVVBfREFUQSkgfHwKKwkgICAgdGJsX3R5cGUuYW50X3R5cGUgIT0gaW5mby0+YW50ZW5uYV9zZWxfdHggfHwKKwkgICAgISEodHhfcmF0ZSAmIFJBVEVfTUNTX0hUX01TSykgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykKKwkgICAgfHwgISEodHhfcmF0ZSAmIFJBVEVfTUNTX0dGX01TSykgIT0KKwkgICAgISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSB8fCByc19pZHggIT0gbWFjX2lkeCkgeworCQlEX1JBVEUoImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsIG1hY19pZHgsCisJCSAgICAgICByc19pZHgsIHR4X3JhdGUpOworCQkvKgorCQkgKiBTaW5jZSByYXRlcyBtaXMtbWF0Y2gsIHRoZSBsYXN0IExRIGNvbW1hbmQgbWF5IGhhdmUgZmFpbGVkLgorCQkgKiBBZnRlciBJTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aAorCQkgKiAuLi4gZHJpdmVyLgorCQkgKi8KKwkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyKys7CisJCWlmIChscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPiBJTF9NSVNTRURfUkFURV9NQVgpIHsKKwkJCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7CisJCQlpbF9zZW5kX2xxX2NtZChpbCwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisJCX0KKwkJLyogUmVnYXJkbGVzcywgaWdub3JlIHRoaXMgc3RhdHVzIGluZm8gZm9yIG91dGRhdGVkIHJhdGUgKi8KKwkJcmV0dXJuOworCX0gZWxzZQorCQkvKiBSYXRlIGRpZCBtYXRjaCwgc28gcmVzZXQgdGhlIG1pc3NlZF9yYXRlX2NvdW50ZXIgKi8KKwkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyID0gMDsKKworCS8qIEZpZ3VyZSBvdXQgaWYgcmF0ZSBzY2FsZSBhbGdvcml0aG0gaXMgaW4gYWN0aXZlIG9yIHNlYXJjaCB0YWJsZSAqLworCWlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJICAgICgmdGJsX3R5cGUsICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pKSkgeworCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJfSBlbHNlCisJICAgIGlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJCSgmdGJsX3R5cGUsICZscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pKSB7CisJCWN1cnJfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOworCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwl9IGVsc2UgeworCQlEX1JBVEUoIk5laXRoZXIgYWN0aXZlIG5vciBzZWFyY2ggbWF0Y2hlcyB0eCByYXRlXG4iKTsKKwkJdG1wX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCQlEX1JBVEUoImFjdGl2ZS0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLCB0bXBfdGJsLT5scV90eXBlLAorCQkgICAgICAgdG1wX3RibC0+YW50X3R5cGUsIHRtcF90YmwtPmlzX1NHSSk7CisJCXRtcF90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJCURfUkFURSgic2VhcmNoLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsIHRtcF90YmwtPmxxX3R5cGUsCisJCSAgICAgICB0bXBfdGJsLT5hbnRfdHlwZSwgdG1wX3RibC0+aXNfU0dJKTsKKwkJRF9SQVRFKCJhY3R1YWwtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwgdGJsX3R5cGUubHFfdHlwZSwKKwkJICAgICAgIHRibF90eXBlLmFudF90eXBlLCB0YmxfdHlwZS5pc19TR0kpOworCQkvKgorCQkgKiBubyBtYXRjaGluZyB0YWJsZSBmb3VuZCwgbGV0J3MgYnktcGFzcyB0aGUgZGF0YSBjb2xsZWN0aW9uCisJCSAqIGFuZCBjb250aW51ZSB0byBwZXJmb3JtIHJhdGUgc2NhbGUgdG8gZmluZCB0aGUgcmF0ZSB0YWJsZQorCQkgKi8KKwkJaWw0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCB0cnVlKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogVXBkYXRpbmcgdGhlIGZyYW1lIGhpc3RvcnkgZGVwZW5kcyBvbiB3aGV0aGVyIHBhY2tldHMgd2VyZQorCSAqIGFnZ3JlZ2F0ZWQuCisJICoKKwkgKiBGb3IgYWdncmVnYXRpb24sIGFsbCBwYWNrZXRzIHdlcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUgcmF0ZSwgdGhlCisJICogZmlyc3QgaWR4IGludG8gcmF0ZSBzY2FsZSB0YWJsZS4KKwkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkgeworCQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7CisJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgaWwtPmJhbmQsICZ0YmxfdHlwZSwKKwkJCQkJCSZyc19pZHgpOworCQlpbDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByc19pZHgsCisJCQkJCSAgaW5mby0+c3RhdHVzLmFtcGR1X2xlbiwKKwkJCQkJICBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7CisKKwkJLyogVXBkYXRlIHN1Y2Nlc3MvZmFpbCBjb3VudHMgaWYgbm90IHNlYXJjaGluZyBmb3IgbmV3IG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+c3RheV9pbl90YmwpIHsKKwkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyArPSBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbjsKKwkJCWxxX3N0YS0+dG90YWxfZmFpbGVkICs9CisJCQkgICAgKGluZm8tPnN0YXR1cy5hbXBkdV9sZW4gLQorCQkJICAgICBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgbGVnYWN5LCB1cGRhdGUgZnJhbWUgaGlzdG9yeSB3aXRoIGZvciBlYWNoIFR4IHJldHJ5LgorCQkgKi8KKwkJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCAtIDE7CisJCS8qIEhXIGRvZXNuJ3Qgc2VuZCBtb3JlIHRoYW4gMTUgcmV0cmllcyAqLworCQlyZXRyaWVzID0gbWluKHJldHJpZXMsIDE1KTsKKworCQkvKiBUaGUgbGFzdCB0cmFuc21pc3Npb24gbWF5IGhhdmUgYmVlbiBzdWNjZXNzZnVsICovCisJCWxlZ2FjeV9zdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOworCQkvKiBDb2xsZWN0IGRhdGEgZm9yIGVhY2ggcmF0ZSB1c2VkIGR1cmluZyBmYWlsZWQgVFggYXR0ZW1wdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8PSByZXRyaWVzOyArK2kpIHsKKwkJCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKTsKKwkJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgaWwtPmJhbmQsCisJCQkJCQkJJnRibF90eXBlLCAmcnNfaWR4KTsKKwkJCS8qCisJCQkgKiBPbmx5IGNvbGxlY3Qgc3RhdHMgaWYgcmV0cmllZCByYXRlIGlzIGluIHRoZSBzYW1lIFJTCisJCQkgKiB0YWJsZSBhcyBhY3RpdmUvc2VhcmNoLgorCQkJICovCisJCQlpZiAoaWw0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcygmdGJsX3R5cGUsIGN1cnJfdGJsKSkKKwkJCQl0bXBfdGJsID0gY3Vycl90Ymw7CisJCQllbHNlIGlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJCQkJICgmdGJsX3R5cGUsIG90aGVyX3RibCkpCisJCQkJdG1wX3RibCA9IG90aGVyX3RibDsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJCWlsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEodG1wX3RibCwgcnNfaWR4LCAxLAorCQkJCQkJICBpIDwKKwkJCQkJCSAgcmV0cmllcyA/IDAgOiBsZWdhY3lfc3VjY2Vzcyk7CisJCX0KKworCQkvKiBVcGRhdGUgc3VjY2Vzcy9mYWlsIGNvdW50cyBpZiBub3Qgc2VhcmNoaW5nIGZvciBuZXcgbW9kZSAqLworCQlpZiAobHFfc3RhLT5zdGF5X2luX3RibCkgeworCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzICs9IGxlZ2FjeV9zdWNjZXNzOworCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgKz0gcmV0cmllcyArICgxIC0gbGVnYWN5X3N1Y2Nlc3MpOworCQl9CisJfQorCS8qIFRoZSBsYXN0IFRYIHJhdGUgaXMgY2FjaGVkIGluIGxxX3N0YTsgaXQncyBzZXQgaW4gaWYvZWxzZSBhYm92ZSAqLworCWxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgPSB0eF9yYXRlOworZG9uZToKKwkvKiBTZWUgaWYgdGhlcmUncyBhIGJldHRlciByYXRlIG9yIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuICovCisJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCisJCWlsNDk2NV9yc19yYXRlX3NjYWxlX3BlcmZvcm0oaWwsIHNrYiwgc3RhLCBscV9zdGEpOworfQorCisvKgorICogQmVnaW4gYSBwZXJpb2Qgb2Ygc3RheWluZyB3aXRoIGEgc2VsZWN0ZWQgbW9kdWxhdGlvbiBtb2RlLgorICogU2V0ICJzdGF5X2luX3RibCIgZmxhZyB0byBwcmV2ZW50IGFueSBtb2RlIHN3aXRjaGVzLgorICogU2V0IGZyYW1lIHR4IHN1Y2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBsZWdhY3kgdnMuIGhpZ2gtdGhyb3VnaHB1dCwKKyAqIGFuZCByZXNldCBvdmVyYWxsIChzcGFubmluZyBhbGwgcmF0ZXMpIHR4IHN1Y2Nlc3MgaGlzdG9yeSBzdGF0cy4KKyAqIFRoZXNlIGNvbnRyb2wgaG93IGxvbmcgd2Ugc3RheSB1c2luZyBzYW1lIG1vZHVsYXRpb24gbW9kZSBiZWZvcmUKKyAqIHNlYXJjaGluZyBmb3IgYSBuZXcgbW9kZS4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlzX2xlZ2FjeSwKKwkJCSAgICBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEpCit7CisJRF9SQVRFKCJ3ZSBhcmUgc3RheWluZyBpbiB0aGUgc2FtZSB0YWJsZVxuIik7CisJbHFfc3RhLT5zdGF5X2luX3RibCA9IDE7CS8qIG9ubHkgcGxhY2UgdGhpcyBnZXRzIHNldCAqLworCWlmIChpc19sZWdhY3kpIHsKKwkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElMX0xFR0FDWV9UQkxfQ09VTlQ7CisJCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJTF9MRUdBQ1lfRkFJTFVSRV9MSU1JVDsKKwkJbHFfc3RhLT5tYXhfc3VjY2Vzc19saW1pdCA9IElMX0xFR0FDWV9TVUNDRVNTX0xJTUlUOworCX0gZWxzZSB7CisJCWxxX3N0YS0+dGFibGVfY291bnRfbGltaXQgPSBJTF9OT05FX0xFR0FDWV9UQkxfQ09VTlQ7CisJCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJTF9OT05FX0xFR0FDWV9GQUlMVVJFX0xJTUlUOworCQlscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0ID0gSUxfTk9ORV9MRUdBQ1lfU1VDQ0VTU19MSU1JVDsKKwl9CisJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7CisJbHFfc3RhLT50b3RhbF9mYWlsZWQgPSAwOworCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7CisJbHFfc3RhLT5mbHVzaF90aW1lciA9IGppZmZpZXM7CisJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7Cit9CisKKy8qCisgKiBGaW5kIGNvcnJlY3QgdGhyb3VnaHB1dCB0YWJsZSBmb3IgZ2l2ZW4gbW9kZSBvZiBtb2R1bGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkJIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsKQoreworCS8qIFVzZWQgdG8gY2hvb3NlIGFtb25nIEhUIHRhYmxlcyAqLworCXMzMigqaHRfdGJsX3BvaW50ZXIpW1JBVEVfQ09VTlRdOworCisJLyogQ2hlY2sgZm9yIGludmFsaWQgTFEgdHlwZSAqLworCWlmIChXQVJOX09OX09OQ0UoIWlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpICYmICFpc19IdCh0YmwtPmxxX3R5cGUpKSkgeworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGV4cGVjdGVkX3RwdF9sZWdhY3k7CisJCXJldHVybjsKKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgaGF2ZSBvbmx5IG9uZSB0YWJsZSAqLworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGV4cGVjdGVkX3RwdF9sZWdhY3k7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaG9vc2UgYW1vbmcgbWFueSBIVCB0YWJsZXMgZGVwZW5kaW5nIG9uIG51bWJlciBvZiBzdHJlYW1zCisJICogKFNJU08vTUlNTzIpLCBjaGFubmVsIHdpZHRoICgyMC80MCksIFNHSSwgYW5kIGFnZ3JlZ2F0aW9uCisJICogc3RhdHVzICovCisJaWYgKGlzX3Npc28odGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X3Npc28yME1IejsKKwllbHNlIGlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X3Npc280ME1IejsKKwllbHNlIGlmIChpc19taW1vMih0YmwtPmxxX3R5cGUpICYmICghdGJsLT5pc19odDQwIHx8IGxxX3N0YS0+aXNfZHVwKSkKKwkJaHRfdGJsX3BvaW50ZXIgPSBleHBlY3RlZF90cHRfbWltbzJfMjBNSHo7CisJZWxzZQkJCS8qIGlmIChpc19taW1vMih0YmwtPmxxX3R5cGUpKSA8LS0gbXVzdCBiZSB0cnVlICovCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzQwTUh6OworCisJaWYgKCF0YmwtPmlzX1NHSSAmJiAhbHFfc3RhLT5pc19hZ2cpCS8qIE5vcm1hbCAqLworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzBdOworCWVsc2UgaWYgKHRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJLyogU0dJICovCisJCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMV07CisJZWxzZSBpZiAoIXRibC0+aXNfU0dJICYmIGxxX3N0YS0+aXNfYWdnKQkvKiBBR0cgKi8KKwkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclsyXTsKKwllbHNlCQkJLyogQUdHK1NHSSAqLworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzNdOworfQorCisvKgorICogRmluZCBzdGFydGluZyByYXRlIGZvciBuZXcgInNlYXJjaCIgaGlnaC10aHJvdWdocHV0IG1vZGUgb2YgbW9kdWxhdGlvbi4KKyAqIEdvYWwgaXMgdG8gZmluZCBsb3dlc3QgZXhwZWN0ZWQgcmF0ZSAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSB0aGF0IGlzCisgKiBhYm92ZSB0aGUgY3VycmVudCBtZWFzdXJlZCB0aHJvdWdocHV0IG9mICJhY3RpdmUiIG1vZGUsIHRvIGdpdmUgbmV3IG1vZGUKKyAqIGEgZmFpciBjaGFuY2UgdG8gcHJvdmUgaXRzZWxmIHdpdGhvdXQgdG9vIG1hbnkgY2hhbGxlbmdlcy4KKyAqCisgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyB0byBtb3JlIGFnZ3Jlc3NpdmUgbW9kdWxhdGlvbgorICogKGkuZS4gbGVnYWN5IHRvIFNJU08gb3IgTUlNTywgb3IgU0lTTyB0byBNSU1PKSwgYXMgd2VsbCBhcyBsZXNzIGFnZ3Jlc3NpdmUKKyAqIChpLmUuIE1JTU8gdG8gU0lTTykuICBXaGVuIG1vdmluZyB0byBNSU1PLCBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkCisgKiB0byBkZWNyZWFzZSB0byBtYXRjaCAiYWN0aXZlIiB0aHJvdWdocHV0LiAgV2hlbiBtb3ZpbmcgZnJvbSBNSU1PIHRvIFNJU08sCisgKiBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkIHRvIGluY3JlYXNlLCBidXQgbm90IGlmIHBlcmZvcm1hbmNlIHdhcyBiYWQuCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsCS8qICJzZWFyY2giICovCisJCQl1MTYgcmF0ZV9tYXNrLCBzOCBpZHgpCit7CisJLyogImFjdGl2ZSIgdmFsdWVzICovCisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICphY3RpdmVfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJczMyIGFjdGl2ZV9zciA9IGFjdGl2ZV90YmwtPndpbltpZHhdLnN1Y2Nlc3NfcmF0aW87CisJczMyIGFjdGl2ZV90cHQgPSBhY3RpdmVfdGJsLT5leHBlY3RlZF90cHRbaWR4XTsKKworCS8qIGV4cGVjdGVkICJzZWFyY2giIHRocm91Z2hwdXQgKi8KKwlzMzIgKnRwdF90YmwgPSB0YmwtPmV4cGVjdGVkX3RwdDsKKworCXMzMiBuZXdfcmF0ZSwgaGlnaCwgbG93LCBzdGFydF9oaTsKKwl1MTYgaGlnaF9sb3c7CisJczggcmF0ZSA9IGlkeDsKKworCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gUkFURV9JTlZBTElEOworCisJZm9yICg7OykgeworCQloaWdoX2xvdyA9CisJCSAgICBpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoaWwsIHJhdGUsIHJhdGVfbWFzaywKKwkJCQkJCXRibC0+bHFfdHlwZSk7CisKKwkJbG93ID0gaGlnaF9sb3cgJiAweGZmOworCQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKKworCQkvKgorCQkgKiBMb3dlciB0aGUgInNlYXJjaCIgYml0IHJhdGUsIHRvIGdpdmUgbmV3ICJzZWFyY2giIG1vZGUKKwkJICogYXBwcm94aW1hdGVseSB0aGUgc2FtZSB0aHJvdWdocHV0IGFzICJhY3RpdmUiIGlmOgorCQkgKgorCQkgKiAxKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgbW9kZXN0bHkgd2VsbCAoYnV0IG5vdAorCQkgKiAgICBncmVhdCksIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0CisJCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIHRoZSBhY3R1YWwKKwkJICogICAgbWVhc3VyZWQgImFjdGl2ZSIgdGhyb3VnaHB1dCAoYnV0IGxlc3MgdGhhbiBleHBlY3RlZAorCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0IHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCisJCSAqIE9SCisJCSAqIDIpICJBY3RpdmUiIG1vZGUgaGFzIGJlZW4gd29ya2luZyBwZXJmZWN0bHkgb3IgdmVyeSB3ZWxsCisJCSAqICAgIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0CisJCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIGV4cGVjdGVkCisJCSAqICAgICJhY3RpdmUiIHRocm91Z2hwdXQgKHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCisJCSAqLworCQlpZiAoKDEwMCAqIHRwdF90YmxbcmF0ZV0gPiBscV9zdGEtPmxhc3RfdHB0ICYmCisJCSAgICAgKGFjdGl2ZV9zciA+IFJBVEVfREVDUkVBU0VfVEggJiYgYWN0aXZlX3NyIDw9IFJBVEVfSElHSF9USAorCQkgICAgICAmJiB0cHRfdGJsW3JhdGVdIDw9IGFjdGl2ZV90cHQpKSB8fAorCQkgICAgKGFjdGl2ZV9zciA+PSBSQVRFX1NDQUxFX1NXSVRDSCAmJgorCQkgICAgIHRwdF90YmxbcmF0ZV0gPiBhY3RpdmVfdHB0KSkgeworCisJCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCisJCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCisJCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLworCQkJaWYgKHN0YXJ0X2hpICE9IFJBVEVfSU5WQUxJRCkgeworCQkJCW5ld19yYXRlID0gc3RhcnRfaGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5ld19yYXRlID0gcmF0ZTsKKworCQkJLyogTG9vcCBhZ2FpbiB3aXRoIGxvd2VyIHJhdGUgKi8KKwkJCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQkJCXJhdGUgPSBsb3c7CisKKwkJCS8qIExvd2VyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLworCQkJZWxzZQorCQkJCWJyZWFrOworCisJCQkvKiBFbHNlIHRyeSB0byByYWlzZSB0aGUgInNlYXJjaCIgcmF0ZSB0byBtYXRjaCAiYWN0aXZlIiAqLworCQl9IGVsc2UgeworCQkJLyogKDJuZCBvciBsYXRlciBwYXNzKQorCQkJICogSWYgd2UndmUgYWxyZWFkeSB0cmllZCB0byBsb3dlciB0aGUgcmF0ZSwgYW5kIGFyZQorCQkJICogbm93IHRyeWluZyB0byByYWlzZSBpdCwgdXNlIHRoZSBsb3dlciByYXRlLiAqLworCQkJaWYgKG5ld19yYXRlICE9IFJBVEVfSU5WQUxJRCkKKwkJCQlicmVhazsKKworCQkJLyogTG9vcCBhZ2FpbiB3aXRoIGhpZ2hlciByYXRlICovCisJCQllbHNlIGlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQkJCXN0YXJ0X2hpID0gaGlnaDsKKwkJCQlyYXRlID0gaGlnaDsKKworCQkJCS8qIEhpZ2hlciByYXRlIG5vdCBhdmFpbGFibGUsIHVzZSB0aGUgb3JpZ2luYWwgKi8KKwkJCX0gZWxzZSB7CisJCQkJbmV3X3JhdGUgPSByYXRlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG5ld19yYXRlOworfQorCisvKgorICogU2V0IHVwIHNlYXJjaCB0YWJsZSBmb3IgTUlNTzIKKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX3N3aXRjaF90b19taW1vMihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50IGlkeCkKK3sKKwl1MTYgcmF0ZV9tYXNrOworCXMzMiByYXRlOworCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKKworCWlmICghY29uZl9pc19odChjb25mKSB8fCAhc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyKSA9PQorCSAgICBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCisJCXJldHVybiAtMTsKKworCS8qIE5lZWQgYm90aCBUeCBjaGFpbnMvYW50ZW5uYXMgdG8gc3VwcG9ydCBNSU1PICovCisJaWYgKGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bSA8IDIpCisJCXJldHVybiAtMTsKKworCURfUkFURSgiTFE6IHRyeSB0byBzd2l0Y2ggdG8gTUlNTzJcbiIpOworCisJdGJsLT5scV90eXBlID0gTFFfTUlNTzI7CisJdGJsLT5pc19kdXAgPSBscV9zdGEtPmlzX2R1cDsKKwl0YmwtPmFjdGlvbiA9IDA7CisJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwlyYXRlX21hc2sgPSBscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlOworCisJaWYgKGlsX2lzX2h0NDBfdHhfYWxsb3dlZChpbCwgY3R4LCAmc3RhLT5odF9jYXApKQorCQl0YmwtPmlzX2h0NDAgPSAxOworCWVsc2UKKwkJdGJsLT5pc19odDQwID0gMDsKKworCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKKworCXJhdGUgPSBpbDQ5NjVfcnNfZ2V0X2Jlc3RfcmF0ZShpbCwgbHFfc3RhLCB0YmwsIHJhdGVfbWFzaywgaWR4KTsKKworCURfUkFURSgiTFE6IE1JTU8yIGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOworCWlmIChyYXRlID09IFJBVEVfSU5WQUxJRCB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgeworCQlEX1JBVEUoIkNhbid0IHN3aXRjaCB3aXRoIGlkeCAlZCByYXRlIG1hc2sgJXhcbiIsIHJhdGUsCisJCSAgICAgICByYXRlX21hc2spOworCQlyZXR1cm4gLTE7CisJfQorCXRibC0+Y3VycmVudF9yYXRlID0KKwkgICAgaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChpbCwgdGJsLCByYXRlLCBpc19ncmVlbik7CisKKwlEX1JBVEUoIkxROiBTd2l0Y2ggdG8gbmV3IG1jcyAlWCBpZHggaXMgZ3JlZW4gJVhcbiIsIHRibC0+Y3VycmVudF9yYXRlLAorCSAgICAgICBpc19ncmVlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBTSVNPCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpZHgpCit7CisJdTE2IHJhdGVfbWFzazsKKwl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CisJczMyIHJhdGU7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlpZiAoIWNvbmZfaXNfaHQoY29uZikgfHwgIXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIC0xOworCisJRF9SQVRFKCJMUTogdHJ5IHRvIHN3aXRjaCB0byBTSVNPXG4iKTsKKworCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7CisJdGJsLT5scV90eXBlID0gTFFfU0lTTzsKKwl0YmwtPmFjdGlvbiA9IDA7CisJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwlyYXRlX21hc2sgPSBscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGU7CisKKwlpZiAoaWxfaXNfaHQ0MF90eF9hbGxvd2VkKGlsLCBjdHgsICZzdGEtPmh0X2NhcCkpCisJCXRibC0+aXNfaHQ0MCA9IDE7CisJZWxzZQorCQl0YmwtPmlzX2h0NDAgPSAwOworCisJaWYgKGlzX2dyZWVuKQorCQl0YmwtPmlzX1NHSSA9IDA7CS8qMTFuIHNwZWM6IG5vIFNHSSBpbiBTSVNPK0dyZWVuZmllbGQgKi8KKworCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKKwlyYXRlID0gaWw0OTY1X3JzX2dldF9iZXN0X3JhdGUoaWwsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGlkeCk7CisKKwlEX1JBVEUoIkxROiBnZXQgYmVzdCByYXRlICVkIG1hc2sgJVhcbiIsIHJhdGUsIHJhdGVfbWFzayk7CisJaWYgKHJhdGUgPT0gUkFURV9JTlZBTElEIHx8ICEoKDEgPDwgcmF0ZSkgJiByYXRlX21hc2spKSB7CisJCURfUkFURSgiY2FuIG5vdCBzd2l0Y2ggd2l0aCBpZHggJWQgcmF0ZSBtYXNrICV4XG4iLCByYXRlLAorCQkgICAgICAgcmF0ZV9tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0YmwtPmN1cnJlbnRfcmF0ZSA9CisJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgcmF0ZSwgaXNfZ3JlZW4pOworCURfUkFURSgiTFE6IFN3aXRjaCB0byBuZXcgbWNzICVYIGlkeCBpcyBncmVlbiAlWFxuIiwgdGJsLT5jdXJyZW50X3JhdGUsCisJICAgICAgIGlzX2dyZWVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIGxlZ2FjeQorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnNlYXJjaF90YmwgPQorCSAgICAmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKKwlzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhICp3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCXUzMiBzeiA9CisJICAgIChzaXplb2Yoc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvKSAtCisJICAgICAoc2l6ZW9mKHN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEpICogUkFURV9DT1VOVCkpOworCXU4IHN0YXJ0X2FjdGlvbjsKKwl1OCB2YWxpZF90eF9hbnQgPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKKwl1OCB0eF9jaGFpbnNfbnVtID0gaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOworCWludCByZXQgPSAwOworCXU4IHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAwOworCisJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX1NJU087CisKKwlzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKwlmb3IgKDs7KSB7CisJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKKwkJc3dpdGNoICh0YmwtPmFjdGlvbikgeworCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE6CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMjoKKwkJCURfUkFURSgiTFE6IExlZ2FjeSB0b2dnbGUgQW50ZW5uYVxuIik7CisKKwkJCWlmICgodGJsLT5hY3Rpb24gPT0gSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMSAmJgorCQkJICAgICB0eF9jaGFpbnNfbnVtIDw9IDEpIHx8CisJCQkgICAgKHRibC0+YWN0aW9uID09IElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTIgJiYKKwkJCSAgICAgdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKworCQkJLyogRG9uJ3QgY2hhbmdlIGFudGVubmEgaWYgc3VjY2VzcyBoYXMgYmVlbiBncmVhdCAqLworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBvdGhlciBhbnRlbm5hICovCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisKKwkJCWlmIChpbDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEKKwkJCSAgICAodmFsaWRfdHhfYW50LCAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLAorCQkJICAgICBzZWFyY2hfdGJsKSkgeworCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOworCQkJCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwKKwkJCQkJCQkJIHNlYXJjaF90YmwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9TSVNPOgorCQkJRF9SQVRFKCJMUTogTGVnYWN5IHN3aXRjaCB0byBTSVNPXG4iKTsKKworCQkJLyogU2V0IHVwIHNlYXJjaCB0YWJsZSB0byB0cnkgU0lTTyAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gMDsKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3JzX3N3aXRjaF90b19zaXNvKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgc2VhcmNoX3RibCwgaWR4KTsKKwkJCWlmICghcmV0KSB7CisJCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUI6CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQzoKKwkJY2FzZSBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDOgorCQkJRF9SQVRFKCJMUTogTGVnYWN5IHN3aXRjaCB0byBNSU1PMlxuIik7CisKKwkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IE1JTU8gKi8KKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKwkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7CisKKwkJCWlmICh0YmwtPmFjdGlvbiA9PSBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCKQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FCOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQykKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQzsKKwkJCWVsc2UKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9CQzsKKworCQkJaWYgKCFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50CisJCQkgICAgKHZhbGlkX3R4X2FudCwgc2VhcmNoX3RibC0+YW50X3R5cGUpKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIoaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICAgc2VhcmNoX3RibCwgaWR4KTsKKwkJCWlmICghcmV0KSB7CisJCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl0YmwtPmFjdGlvbisrOworCQlpZiAodGJsLT5hY3Rpb24gPiBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDKQorCQkJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCisJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCisJCQlicmVhazsKKworCX0KKwlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOworCXRibC0+YWN0aW9uKys7CisJaWYgKHRibC0+YWN0aW9uID4gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKKwkJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQorCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKwlyZXR1cm4gMDsKKworfQorCisvKgorICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gU0lTTworICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9zaXNvX3RvX290aGVyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gJih0YmwtPndpbltpZHhdKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwl1MzIgc3ogPQorCSAgICAoc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykgLQorCSAgICAgKHNpemVvZihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhKSAqIFJBVEVfQ09VTlQpKTsKKwl1OCBzdGFydF9hY3Rpb247CisJdTggdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKwl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKKwlpbnQgcmV0OworCisJc3RhcnRfYWN0aW9uID0gdGJsLT5hY3Rpb247CisKKwlmb3IgKDs7KSB7CisJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKKwkJc3dpdGNoICh0YmwtPmFjdGlvbikgeworCQljYXNlIElMX1NJU09fU1dJVENIX0FOVEVOTkExOgorCQljYXNlIElMX1NJU09fU1dJVENIX0FOVEVOTkEyOgorCQkJRF9SQVRFKCJMUTogU0lTTyB0b2dnbGUgQW50ZW5uYVxuIik7CisJCQlpZiAoKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX0FOVEVOTkExICYmCisJCQkgICAgIHR4X2NoYWluc19udW0gPD0gMSkgfHwKKwkJCSAgICAodGJsLT5hY3Rpb24gPT0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTIgJiYKKwkJCSAgICAgdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hCisJCQkgICAgKHZhbGlkX3R4X2FudCwgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwKKwkJCSAgICAgc2VhcmNoX3RibCkpIHsKKwkJCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0FCOgorCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0FDOgorCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0JDOgorCQkJRF9SQVRFKCJMUTogU0lTTyBzd2l0Y2ggdG8gTUlNTzJcbiIpOworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gMDsKKworCQkJaWYgKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX01JTU8yX0FCKQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FCOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7CisJCQllbHNlCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7CisKKwkJCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudAorCQkJICAgICh2YWxpZF90eF9hbnQsIHNlYXJjaF90YmwtPmFudF90eXBlKSkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgIHNlYXJjaF90YmwsIGlkeCk7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIElMX1NJU09fU1dJVENIX0dJOgorCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKQorCQkJCWJyZWFrOworCQkJaWYgKHRibC0+aXNfaHQ0MCAmJgorCQkJICAgICEoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCQkJYnJlYWs7CisKKwkJCURfUkFURSgiTFE6IFNJU08gdG9nZ2xlIFNHSS9OR0lcbiIpOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaXNfZ3JlZW4pIHsKKwkJCQlpZiAoIXRibC0+aXNfU0dJKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJCUlMX0VSUigiU0dJIHdhcyBzZXQgaW4gR0YrU0lTT1xuIik7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7CisJCQlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOworCQkJaWYgKHRibC0+aXNfU0dJKSB7CisJCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7CisJCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaWR4XSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQorCQkJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHNlYXJjaF90YmwsIGlkeCwKKwkJCQkJCQkgaXNfZ3JlZW4pOworCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0YmwtPmFjdGlvbisrOworCQlpZiAodGJsLT5hY3Rpb24gPiBJTF9TSVNPX1NXSVRDSF9HSSkKKwkJCXRibC0+YWN0aW9uID0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTE7CisKKwkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKKwkJCWJyZWFrOworCX0KKwlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOworCXRibC0+YWN0aW9uKys7CisJaWYgKHRibC0+YWN0aW9uID4gSUxfU0lTT19TV0lUQ0hfR0kpCisJCXRibC0+YWN0aW9uID0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTE7CisJaWYgKHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIpCisJCXNlYXJjaF90YmwtPmFjdGlvbiA9IHRibC0+YWN0aW9uOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcnkgdG8gc3dpdGNoIHRvIG5ldyBtb2R1bGF0aW9uIG1vZGUgZnJvbSBNSU1PMgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9taW1vMl90b19vdGhlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJczggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gJih0YmwtPndpbltpZHhdKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwl1MzIgc3ogPQorCSAgICAoc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykgLQorCSAgICAgKHNpemVvZihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhKSAqIFJBVEVfQ09VTlQpKTsKKwl1OCBzdGFydF9hY3Rpb247CisJdTggdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKwl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKKwlpbnQgcmV0OworCisJc3RhcnRfYWN0aW9uID0gdGJsLT5hY3Rpb247CisJZm9yICg7OykgeworCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CisJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKKwkJY2FzZSBJTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE6CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX0FOVEVOTkEyOgorCQkJRF9SQVRFKCJMUTogTUlNTzIgdG9nZ2xlIEFudGVubmFzXG4iKTsKKworCQkJaWYgKHR4X2NoYWluc19udW0gPD0gMikKKwkJCQlicmVhazsKKworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hCisJCQkgICAgKHZhbGlkX3R4X2FudCwgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwKKwkJCSAgICAgc2VhcmNoX3RibCkpIHsKKwkJCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMX01JTU8yX1NXSVRDSF9TSVNPX0E6CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX1NJU09fQjoKKwkJY2FzZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19DOgorCQkJRF9SQVRFKCJMUTogTUlNTzIgc3dpdGNoIHRvIFNJU09cbiIpOworCisJCQkvKiBTZXQgdXAgbmV3IHNlYXJjaCB0YWJsZSBmb3IgU0lTTyAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCisJCQlpZiAodGJsLT5hY3Rpb24gPT0gSUxfTUlNTzJfU1dJVENIX1NJU09fQSkKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfTUlNTzJfU1dJVENIX1NJU09fQikKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9COworCQkJZWxzZQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0M7CisKKwkJCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudAorCQkJICAgICh2YWxpZF90eF9hbnQsIHNlYXJjaF90YmwtPmFudF90eXBlKSkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfcnNfc3dpdGNoX3RvX3Npc28oaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICBzZWFyY2hfdGJsLCBpZHgpOworCQkJaWYgKCFyZXQpCisJCQkJZ290byBvdXQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX0dJOgorCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKQorCQkJCWJyZWFrOworCQkJaWYgKHRibC0+aXNfaHQ0MCAmJgorCQkJICAgICEoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCQkJYnJlYWs7CisKKwkJCURfUkFURSgiTFE6IE1JTU8yIHRvZ2dsZSBTR0kvTkdJXG4iKTsKKworCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIE1JTU8yICovCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7CisJCQlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOworCQkJLyoKKwkJCSAqIElmIGFjdGl2ZSB0YWJsZSBhbHJlYWR5IHVzZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUKKwkJCSAqIG1vZHVsYXRpb24gKGR1YWwgc3RyZWFtIHdpdGggc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLAorCQkJICogYW5kIGl0J3Mgd29ya2luZyB3ZWxsLCB0aGVyZSdzIG5vIG5lZWQgdG8gbG9vaworCQkJICogZm9yIGEgYmV0dGVyIHR5cGUgb2YgbW9kdWxhdGlvbiEKKwkJCSAqLworCQkJaWYgKHRibC0+aXNfU0dJKSB7CisJCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7CisJCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaWR4XSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQorCQkJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHNlYXJjaF90YmwsIGlkeCwKKwkJCQkJCQkgaXNfZ3JlZW4pOworCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQlnb3RvIG91dDsKKworCQl9CisJCXRibC0+YWN0aW9uKys7CisJCWlmICh0YmwtPmFjdGlvbiA+IElMX01JTU8yX1NXSVRDSF9HSSkKKwkJCXRibC0+YWN0aW9uID0gSUxfTUlNTzJfU1dJVENIX0FOVEVOTkExOworCisJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCisJCQlicmVhazsKKwl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CisJcmV0dXJuIDA7CitvdXQ6CisJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CisJdGJsLT5hY3Rpb24rKzsKKwlpZiAodGJsLT5hY3Rpb24gPiBJTF9NSU1PMl9TV0lUQ0hfR0kpCisJCXRibC0+YWN0aW9uID0gSUxfTUlNTzJfU1dJVENIX0FOVEVOTkExOworCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQorCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKworCXJldHVybiAwOworCit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBjb250aW51ZSB1c2luZyBzYW1lIG1vZHVsYXRpb24gbW9kZSwgb3IKKyAqIGJlZ2luIHNlYXJjaCBmb3IgYSBuZXcgbW9kZSwgYmFzZWQgb246CisgKiAxKSAjIHR4IHN1Y2Nlc3NlcyBvciBmYWlsdXJlcyB3aGlsZSB1c2luZyB0aGlzIG1vZGUKKyAqIDIpICMgdGltZXMgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiAzKSBlbGFwc2VkIHRpbWUgaW4gdGhpcyBtb2RlIChub3QgdXNlZCwgZm9yIG5vdykKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwgYm9vbCBmb3JjZV9zZWFyY2gpCit7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0Ymw7CisJaW50IGk7CisJaW50IGFjdGl2ZV90Ymw7CisJaW50IGZsdXNoX2ludGVydmFsX3Bhc3NlZCA9IDA7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCisJaWwgPSBscV9zdGEtPmRydjsKKwlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCisJdGJsID0gJihscV9zdGEtPmxxX2luZm9bYWN0aXZlX3RibF0pOworCisJLyogSWYgd2UndmUgYmVlbiBkaXNhbGxvd2luZyBzZWFyY2gsIHNlZSBpZiB3ZSBzaG91bGQgbm93IGFsbG93IGl0ICovCisJaWYgKGxxX3N0YS0+c3RheV9pbl90YmwpIHsKKworCQkvKiBFbGFwc2VkIHRpbWUgdXNpbmcgY3VycmVudCBtb2R1bGF0aW9uIG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+Zmx1c2hfdGltZXIpCisJCQlmbHVzaF9pbnRlcnZhbF9wYXNzZWQgPQorCQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKGxxX3N0YS0+Zmx1c2hfdGltZXIgKworCQkJCQkJICAgICAgIFJBVEVfU0NBTEVfRkxVU0hfSU5UVkwpKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB3ZSBzaG91bGQgYWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kdWxhdGlvbiBtb2RlLgorCQkgKiBJZiBtYW55IGZyYW1lcyBoYXZlIGZhaWxlZCBvciBzdWNjZWVkZWQsIG9yIHdlJ3ZlIHVzZWQKKwkJICogdGhpcyBzYW1lIG1vZHVsYXRpb24gZm9yIGEgbG9uZyB0aW1lLCBhbGxvdyBzZWFyY2gsIGFuZAorCQkgKiByZXNldCBoaXN0b3J5IHN0YXRzIHRoYXQga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIHNob3VsZAorCQkgKiBhbGxvdyBhIG5ldyBzZWFyY2guICBBbHNvIChiZWxvdykgcmVzZXQgYWxsIGJpdG1hcHMgYW5kCisJCSAqIHN0YXRzIGluIGFjdGl2ZSBoaXN0b3J5LgorCQkgKi8KKwkJaWYgKGZvcmNlX3NlYXJjaCB8fAorCQkgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQgPiBscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0IHx8CisJCSAgICBscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPiBscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0IHx8CisJCSAgICAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgJiYgbHFfc3RhLT5mbHVzaF90aW1lciAmJgorCQkgICAgIGZsdXNoX2ludGVydmFsX3Bhc3NlZCkpIHsKKwkJCURfUkFURSgiTFE6IHN0YXkgaXMgZXhwaXJlZCAlZCAlZCAlZFxuOiIsCisJCQkgICAgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQsIGxxX3N0YS0+dG90YWxfc3VjY2VzcywKKwkJCSAgICAgICBmbHVzaF9pbnRlcnZhbF9wYXNzZWQpOworCisJCQkvKiBBbGxvdyBzZWFyY2ggZm9yIG5ldyBtb2RlICovCisJCQlscV9zdGEtPnN0YXlfaW5fdGJsID0gMDsJLyogb25seSBwbGFjZSByZXNldCAqLworCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgPSAwOworCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzID0gMDsKKwkJCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSAwOworCisJCQkvKgorCQkJICogRWxzZSBpZiB3ZSd2ZSB1c2VkIHRoaXMgbW9kdWxhdGlvbiBtb2RlIGVub3VnaCByZXBldGl0aW9ucworCQkJICogKHJlZ2FyZGxlc3Mgb2YgZWxhcHNlZCB0aW1lIG9yIHN1Y2Nlc3MvZmFpbHVyZSksIHJlc2V0CisJCQkgKiBoaXN0b3J5IGJpdG1hcHMgYW5kIHJhdGUtc3BlY2lmaWMgc3RhdHMgZm9yIGFsbCByYXRlcyBpbgorCQkJICogYWN0aXZlIHRhYmxlLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlscV9zdGEtPnRhYmxlX2NvdW50Kys7CisJCQlpZiAobHFfc3RhLT50YWJsZV9jb3VudCA+PSBscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0KSB7CisJCQkJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7CisKKwkJCQlEX1JBVEUoIkxROiBzdGF5IGluIHRhYmxlIGNsZWFyIHdpblxuIik7CisJCQkJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQ7IGkrKykKKwkJCQkJaWw0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luKCYKKwkJCQkJCQkJICAgICAgICh0YmwtPgorCQkJCQkJCQkJd2luCisJCQkJCQkJCQlbaV0pKTsKKwkJCX0KKwkJfQorCisJCS8qIElmIHRyYW5zaXRpb25pbmcgdG8gYWxsb3cgInNlYXJjaCIsIHJlc2V0IGFsbCBoaXN0b3J5CisJCSAqIGJpdG1hcHMgYW5kIHN0YXRzIGluIGFjdGl2ZSB0YWJsZSAodGhpcyB3aWxsIGJlY29tZSB0aGUgbmV3CisJCSAqICJzZWFyY2giIHRhYmxlKS4gKi8KKwkJaWYgKCFscV9zdGEtPnN0YXlfaW5fdGJsKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVDsgaSsrKQorCQkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmKHRibC0+d2luW2ldKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBzZXR1cCByYXRlIHRhYmxlIGluIHVDb2RlCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfdXBkYXRlX3JhdGVfdGJsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaWR4LCB1OCBpc19ncmVlbikKK3sKKwl1MzIgcmF0ZTsKKworCS8qIFVwZGF0ZSB1Q29kZSdzIHJhdGUgdGFibGUuICovCisJcmF0ZSA9IGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgaWR4LCBpc19ncmVlbik7CisJaWw0OTY1X3JzX2ZpbGxfbGlua19jbWQoaWwsIGxxX3N0YSwgcmF0ZSk7CisJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywgZmFsc2UpOworfQorCisvKgorICogRG8gcmF0ZSBzY2FsaW5nIGFuZCBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gaWwtPmh3OworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlpbnQgbG93ID0gUkFURV9JTlZBTElEOworCWludCBoaWdoID0gUkFURV9JTlZBTElEOworCWludCBpZHg7CisJaW50IGk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gTlVMTDsKKwlpbnQgY3VycmVudF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCWludCBsb3dfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwlpbnQgaGlnaF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXUzMiBmYWlsX2NvdW50OworCXM4IHNjYWxlX2FjdGlvbiA9IDA7CisJdTE2IHJhdGVfbWFzazsKKwl1OCB1cGRhdGVfbHEgPSAwOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCAqdGJsMTsKKwl1MTYgcmF0ZV9zY2FsZV9pZHhfbXNrID0gMDsKKwl1OCBpc19ncmVlbiA9IDA7CisJdTggYWN0aXZlX3RibCA9IDA7CisJdTggZG9uZV9zZWFyY2ggPSAwOworCXUxNiBoaWdoX2xvdzsKKwlzMzIgc3I7CisJdTggdGlkID0gTUFYX1RJRF9DT1VOVDsKKwlzdHJ1Y3QgaWxfdGlkX2RhdGEgKnRpZF9kYXRhOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJRF9SQVRFKCJyYXRlIHNjYWxlIGNhbGN1bGF0ZSBuZXcgcmF0ZSBmb3Igc2tiXG4iKTsKKworCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLworCS8qIFRPRE86IHRoaXMgY291bGQgcHJvYmFibHkgYmUgaW1wcm92ZWQuLiAqLworCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpCisJCXJldHVybjsKKworCWxxX3N0YS0+c3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tscV9zdGEtPmJhbmRdOworCisJdGlkID0gaWw0OTY1X3JzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOworCWlmICh0aWQgIT0gTUFYX1RJRF9DT1VOVCAmJiAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkpIHsKKwkJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW2xxX3N0YS0+bHEuc3RhX2lkXS50aWRbdGlkXTsKKwkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSUxfQUdHX09GRikKKwkJCWxxX3N0YS0+aXNfYWdnID0gMDsKKwkJZWxzZQorCQkJbHFfc3RhLT5pc19hZ2cgPSAxOworCX0gZWxzZQorCQlscV9zdGEtPmlzX2FnZyA9IDA7CisKKwkvKgorCSAqIFNlbGVjdCByYXRlLXNjYWxlIC8gbW9kdWxhdGlvbi1tb2RlIHRhYmxlIHRvIHdvcmsgd2l0aCBpbgorCSAqIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb246ICAic2VhcmNoIiBpZiBzZWFyY2hpbmcgZm9yIGJldHRlcgorCSAqIG1vZHVsYXRpb24gbW9kZSwgb3IgImFjdGl2ZSIgaWYgZG9pbmcgcmF0ZSBzY2FsaW5nIHdpdGhpbiBhIG1vZGUuCisJICovCisJaWYgKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKQorCQlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCWVsc2UKKwkJYWN0aXZlX3RibCA9IDEgLSBscV9zdGEtPmFjdGl2ZV90Ymw7CisKKwl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7CisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKQorCQlscV9zdGEtPmlzX2dyZWVuID0gMDsKKwllbHNlCisJCWxxX3N0YS0+aXNfZ3JlZW4gPSBpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7CisJaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCisJLyogY3VycmVudCB0eCByYXRlICovCisJaWR4ID0gbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CisKKwlEX1JBVEUoIlJhdGUgc2NhbGUgaWR4ICVkIGZvciB0eXBlICVkXG4iLCBpZHgsIHRibC0+bHFfdHlwZSk7CisKKwkvKiByYXRlcyBhdmFpbGFibGUgZm9yIHRoaXMgYXNzb2NpYXRpb24sIGFuZCBmb3IgbW9kdWxhdGlvbiBtb2RlICovCisJcmF0ZV9tYXNrID0gaWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBoZHIsIHRibC0+bHFfdHlwZSk7CisKKwlEX1JBVEUoIm1hc2sgMHglMDRYXG4iLCByYXRlX21hc2spOworCisJLyogbWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KKwkJCXJhdGVfc2NhbGVfaWR4X21zayA9CisJCQkgICAgKHUxNikgKHJhdGVfbWFzayAmCisJCQkJICAgKGxxX3N0YS0+c3VwcF9yYXRlcyA8PCBJTF9GSVJTVF9PRkRNX1JBVEUpKTsKKwkJZWxzZQorCQkJcmF0ZV9zY2FsZV9pZHhfbXNrID0KKwkJCSAgICAodTE2KSAocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKKworCX0gZWxzZQorCQlyYXRlX3NjYWxlX2lkeF9tc2sgPSByYXRlX21hc2s7CisKKwlpZiAoIXJhdGVfc2NhbGVfaWR4X21zaykKKwkJcmF0ZV9zY2FsZV9pZHhfbXNrID0gcmF0ZV9tYXNrOworCisJaWYgKCEoKDEgPDwgaWR4KSAmIHJhdGVfc2NhbGVfaWR4X21zaykpIHsKKwkJSUxfRVJSKCJDdXJyZW50IFJhdGUgaXMgbm90IHZhbGlkXG4iKTsKKwkJaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKKwkJCS8qIHJldmVydCB0byBhY3RpdmUgdGFibGUgaWYgc2VhcmNoIHRhYmxlIGlzIG5vdCB2YWxpZCAqLworCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOworCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJCQkvKiBnZXQgImFjdGl2ZSIgcmF0ZSBpbmZvICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKwkJCWlsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwoaWwsIGN0eCwgbHFfc3RhLCB0YmwsIGlkeCwKKwkJCQkJCSAgICAgIGlzX2dyZWVuKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogR2V0IGV4cGVjdGVkIHRocm91Z2hwdXQgdGFibGUgYW5kIGhpc3Rvcnkgd2luIGZvciBjdXJyZW50IHJhdGUgKi8KKwlpZiAoIXRibC0+ZXhwZWN0ZWRfdHB0KSB7CisJCUlMX0VSUigidGJsLT5leHBlY3RlZF90cHQgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCisJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xICYmIGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaWR4KSB7CisJCWlkeCA9IGxxX3N0YS0+bWF4X3JhdGVfaWR4OworCQl1cGRhdGVfbHEgPSAxOworCQl3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCQlnb3RvIGxxX3VwZGF0ZTsKKwl9CisKKwl3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGFjdHVhbCBhdmVyYWdlCisJICogdGhyb3VnaHB1dCwga2VlcCBhbmFseXppbmcgcmVzdWx0cyBvZiBtb3JlIHR4IGZyYW1lcywgd2l0aG91dAorCSAqIGNoYW5naW5nIHJhdGUgb3IgbW9kZSAoYnlwYXNzIG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbikuCisJICogU2V0IHVwIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlIG9ubHkgaWYgb2xkIHJhdGUgaXMgbm90IHN1cHBvcnRlZAorCSAqIGluIGN1cnJlbnQgYXNzb2NpYXRpb24gKHVzZSBuZXcgcmF0ZSBmb3VuZCBhYm92ZSkuCisJICovCisJZmFpbF9jb3VudCA9IHdpbi0+Y291bnRlciAtIHdpbi0+c3VjY2Vzc19jb3VudGVyOworCWlmIChmYWlsX2NvdW50IDwgUkFURV9NSU5fRkFJTFVSRV9USCAmJgorCSAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciA8IFJBVEVfTUlOX1NVQ0NFU1NfVEgpIHsKKwkJRF9SQVRFKCJMUTogc3RpbGwgYmVsb3cgVEguIHN1Y2M9JWQgdG90YWw9JWQgIiAiZm9yIGlkeCAlZFxuIiwKKwkJICAgICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyLCB3aW4tPmNvdW50ZXIsIGlkeCk7CisKKwkJLyogQ2FuJ3QgY2FsY3VsYXRlIHRoaXMgeWV0OyBub3QgZW5vdWdoIGhpc3RvcnkgKi8KKwkJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisKKwkJLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKKwkJICogb3Igc2VhcmNoIGZvciBhIG5ldyBvbmU/ICovCisJCWlsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOworCisJCWdvdG8gb3V0OworCX0KKwkvKiBFbHNlIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXM7IGNhbGN1bGF0ZSBlc3RpbWF0ZSBvZgorCSAqIGFjdHVhbCBhdmVyYWdlIHRocm91Z2hwdXQgKi8KKwlpZiAod2luLT5hdmVyYWdlX3RwdCAhPQorCSAgICAoKHdpbi0+c3VjY2Vzc19yYXRpbyAqIHRibC0+ZXhwZWN0ZWRfdHB0W2lkeF0gKyA2NCkgLyAxMjgpKSB7CisJCUlMX0VSUigiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBieSBub3dcbiIpOworCQl3aW4tPmF2ZXJhZ2VfdHB0ID0KKwkJICAgICgod2luLT5zdWNjZXNzX3JhdGlvICogdGJsLT5leHBlY3RlZF90cHRbaWR4XSArIDY0KSAvIDEyOCk7CisJfQorCisJLyogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgY2hlY2sgc3VjY2Vzcy4gKi8KKwlpZiAobHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkgeworCQkvKiBJZiBnb29kIHN1Y2Nlc3MsIGNvbnRpbnVlIHVzaW5nIHRoZSAic2VhcmNoIiBtb2RlOworCQkgKiBubyBuZWVkIHRvIHNlbmQgbmV3IGxpbmsgcXVhbGl0eSBjb21tYW5kLCBzaW5jZSB3ZSdyZQorCQkgKiBjb250aW51aW5nIHRvIHVzZSB0aGUgc2V0dXAgdGhhdCB3ZSd2ZSBiZWVuIHRyeWluZy4gKi8KKwkJaWYgKHdpbi0+YXZlcmFnZV90cHQgPiBscV9zdGEtPmxhc3RfdHB0KSB7CisKKwkJCURfUkFURSgiTFE6IFNXSVRDSElORyBUTyBORVcgVEJMICIKKwkJCSAgICAgICAic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKKwkJCSAgICAgICB3aW4tPnN1Y2Nlc3NfcmF0aW8sIHdpbi0+YXZlcmFnZV90cHQsCisJCQkgICAgICAgbHFfc3RhLT5sYXN0X3RwdCk7CisKKwkJCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpCisJCQkJbHFfc3RhLT5lbmFibGVfY291bnRlciA9IDE7CisKKwkJCS8qIFN3YXAgdGFibGVzOyAic2VhcmNoIiBiZWNvbWVzICJhY3RpdmUiICovCisJCQlscV9zdGEtPmFjdGl2ZV90YmwgPSBhY3RpdmVfdGJsOworCQkJY3VycmVudF90cHQgPSB3aW4tPmF2ZXJhZ2VfdHB0OworCisJCQkvKiBFbHNlIHBvb3Igc3VjY2VzczsgZ28gYmFjayB0byBtb2RlIGluICJhY3RpdmUiIHRhYmxlICovCisJCX0gZWxzZSB7CisKKwkJCURfUkFURSgiTFE6IEdPSU5HIEJBQ0sgVE8gVEhFIE9MRCBUQkwgIgorCQkJICAgICAgICJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAorCQkJICAgICAgIHdpbi0+c3VjY2Vzc19yYXRpbywgd2luLT5hdmVyYWdlX3RwdCwKKwkJCSAgICAgICBscV9zdGEtPmxhc3RfdHB0KTsKKworCQkJLyogTnVsbGlmeSAic2VhcmNoIiB0YWJsZSAqLworCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKworCQkJLyogUmV2ZXJ0IHRvICJhY3RpdmUiIHRhYmxlICovCisJCQlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bYWN0aXZlX3RibF0pOworCisJCQkvKiBSZXZlcnQgdG8gImFjdGl2ZSIgcmF0ZSBhbmQgdGhyb3VnaHB1dCBpbmZvICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKwkJCWN1cnJlbnRfdHB0ID0gbHFfc3RhLT5sYXN0X3RwdDsKKworCQkJLyogTmVlZCB0byBzZXQgdXAgYSBuZXcgcmF0ZSB0YWJsZSBpbiB1Q29kZSAqLworCQkJdXBkYXRlX2xxID0gMTsKKwkJfQorCisJCS8qIEVpdGhlciB3YXksIHdlJ3ZlIG1hZGUgYSBkZWNpc2lvbjsgbW9kdWxhdGlvbiBtb2RlCisJCSAqIHNlYXJjaCBpcyBkb25lLCBhbGxvdyByYXRlIGFkanVzdG1lbnQgbmV4dCB0aW1lLiAqLworCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMDsKKwkJZG9uZV9zZWFyY2ggPSAxOwkvKiBEb24ndCBzd2l0Y2ggbW9kZXMgYmVsb3chICovCisJCWdvdG8gbHFfdXBkYXRlOworCX0KKworCS8qIChFbHNlKSBub3QgaW4gc2VhcmNoIG9mIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIHRyeSBmb3IgYmV0dGVyCisJICogc3RhcnRpbmcgcmF0ZSwgd2hpbGUgc3RheWluZyBpbiB0aGlzIG1vZGUuICovCisJaGlnaF9sb3cgPQorCSAgICBpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoaWwsIGlkeCwgcmF0ZV9zY2FsZV9pZHhfbXNrLAorCQkJCQl0YmwtPmxxX3R5cGUpOworCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKKwloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKKworCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCisJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xICYmIGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaGlnaCkKKwkJaGlnaCA9IFJBVEVfSU5WQUxJRDsKKworCXNyID0gd2luLT5zdWNjZXNzX3JhdGlvOworCisJLyogQ29sbGVjdCBtZWFzdXJlZCB0aHJvdWdocHV0cyBmb3IgY3VycmVudCBhbmQgYWRqYWNlbnQgcmF0ZXMgKi8KKwljdXJyZW50X3RwdCA9IHdpbi0+YXZlcmFnZV90cHQ7CisJaWYgKGxvdyAhPSBSQVRFX0lOVkFMSUQpCisJCWxvd190cHQgPSB0YmwtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OworCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkKKwkJaGlnaF90cHQgPSB0YmwtPndpbltoaWdoXS5hdmVyYWdlX3RwdDsKKworCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkvKiBUb28gbWFueSBmYWlsdXJlcywgZGVjcmVhc2UgcmF0ZSAqLworCWlmIChzciA8PSBSQVRFX0RFQ1JFQVNFX1RIIHx8IGN1cnJlbnRfdHB0ID09IDApIHsKKwkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOworCQlzY2FsZV9hY3Rpb24gPSAtMTsKKworCQkvKiBObyB0aHJvdWdocHV0IG1lYXN1cmVkIHlldCBmb3IgYWRqYWNlbnQgcmF0ZXM7IHRyeSBpbmNyZWFzZS4gKi8KKwl9IGVsc2UgaWYgKGxvd190cHQgPT0gSUxfSU5WQUxJRF9WQUxVRSAmJiBoaWdoX3RwdCA9PSBJTF9JTlZBTElEX1ZBTFVFKSB7CisKKwkJaWYgKGhpZ2ggIT0gUkFURV9JTlZBTElEICYmIHNyID49IFJBVEVfSU5DUkVBU0VfVEgpCisJCQlzY2FsZV9hY3Rpb24gPSAxOworCQllbHNlIGlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQkJc2NhbGVfYWN0aW9uID0gMDsKKwl9CisKKwkvKiBCb3RoIGFkamFjZW50IHRocm91Z2hwdXRzIGFyZSBtZWFzdXJlZCwgYnV0IG5laXRoZXIgb25lIGhhcyBiZXR0ZXIKKwkgKiB0aHJvdWdocHV0OyB3ZSdyZSB1c2luZyB0aGUgYmVzdCByYXRlLCBkb24ndCBjaGFuZ2UgaXQhICovCisJZWxzZSBpZiAobG93X3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFICYmIGhpZ2hfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUgJiYKKwkJIGxvd190cHQgPCBjdXJyZW50X3RwdCAmJiBoaWdoX3RwdCA8IGN1cnJlbnRfdHB0KQorCQlzY2FsZV9hY3Rpb24gPSAwOworCisJLyogQXQgbGVhc3Qgb25lIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkLAorCSAqIGFuZCBtYXkgaGF2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuICovCisJZWxzZSB7CisJCS8qIEhpZ2hlciBhZGphY2VudCByYXRlJ3MgdGhyb3VnaHB1dCBpcyBtZWFzdXJlZCAqLworCQlpZiAoaGlnaF90cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCQkJLyogSGlnaGVyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCisJCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJiBzciA+PSBSQVRFX0lOQ1JFQVNFX1RIKQorCQkJCXNjYWxlX2FjdGlvbiA9IDE7CisJCQllbHNlCisJCQkJc2NhbGVfYWN0aW9uID0gMDsKKworCQkJLyogTG93ZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KKwkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUpIHsKKwkJCS8qIExvd2VyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCisJCQlpZiAobG93X3RwdCA+IGN1cnJlbnRfdHB0KSB7CisJCQkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7CisJCQkJc2NhbGVfYWN0aW9uID0gLTE7CisJCQl9IGVsc2UgaWYgKHNyID49IFJBVEVfSU5DUkVBU0VfVEgpIHsKKwkJCQlzY2FsZV9hY3Rpb24gPSAxOworCQkJfQorCQl9CisJfQorCisJLyogU2FuaXR5IGNoZWNrOyBhc2tlZCBmb3IgZGVjcmVhc2UsIGJ1dCBzdWNjZXNzIHJhdGUgb3IgdGhyb3VnaHB1dAorCSAqIGhhcyBiZWVuIGdvb2QgYXQgb2xkIHJhdGUuICBEb24ndCBjaGFuZ2UgaXQuICovCisJaWYgKHNjYWxlX2FjdGlvbiA9PSAtMSAmJiBsb3cgIT0gUkFURV9JTlZBTElEICYmCisJICAgIChzciA+IFJBVEVfSElHSF9USCB8fCBjdXJyZW50X3RwdCA+IDEwMCAqIHRibC0+ZXhwZWN0ZWRfdHB0W2xvd10pKQorCQlzY2FsZV9hY3Rpb24gPSAwOworCisJc3dpdGNoIChzY2FsZV9hY3Rpb24pIHsKKwljYXNlIC0xOgorCQkvKiBEZWNyZWFzZSBzdGFydGluZyByYXRlLCB1cGRhdGUgdUNvZGUncyByYXRlIHRhYmxlICovCisJCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKSB7CisJCQl1cGRhdGVfbHEgPSAxOworCQkJaWR4ID0gbG93OworCQl9CisKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBJbmNyZWFzZSBzdGFydGluZyByYXRlLCB1cGRhdGUgdUNvZGUncyByYXRlIHRhYmxlICovCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQkJdXBkYXRlX2xxID0gMTsKKwkJCWlkeCA9IGhpZ2g7CisJCX0KKworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIE5vIGNoYW5nZSAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURfUkFURSgiY2hvb3NlIHJhdGUgc2NhbGUgaWR4ICVkIGFjdGlvbiAlZCBsb3cgJWQgIiAiaGlnaCAlZCB0eXBlICVkXG4iLAorCSAgICAgICBpZHgsIHNjYWxlX2FjdGlvbiwgbG93LCBoaWdoLCB0YmwtPmxxX3R5cGUpOworCitscV91cGRhdGU6CisJLyogUmVwbGFjZSB1Q29kZSdzIHJhdGUgdGFibGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdGF0aW9uLiAqLworCWlmICh1cGRhdGVfbHEpCisJCWlsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwoaWwsIGN0eCwgbHFfc3RhLCB0YmwsIGlkeCwKKwkJCQkJICAgICAgaXNfZ3JlZW4pOworCisJLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKKwkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KKwlpbDQ5NjVfcnNfc3RheV9pbl90YWJsZShscV9zdGEsIGZhbHNlKTsKKworCS8qCisJICogU2VhcmNoIGZvciBuZXcgbW9kdWxhdGlvbiBtb2RlIGlmIHdlJ3JlOgorCSAqIDEpICBOb3QgY2hhbmdpbmcgcmF0ZXMgcmlnaHQgbm93CisJICogMikgIE5vdCBqdXN0IGZpbmlzaGluZyB1cCBhIHNlYXJjaAorCSAqIDMpICBBbGxvd2luZyBhIG5ldyBzZWFyY2gKKwkgKi8KKwlpZiAoIXVwZGF0ZV9scSAmJiAhZG9uZV9zZWFyY2ggJiYgIWxxX3N0YS0+c3RheV9pbl90YmwgJiYgd2luLT5jb3VudGVyKSB7CisJCS8qIFNhdmUgY3VycmVudCB0aHJvdWdocHV0IHRvIGNvbXBhcmUgd2l0aCAic2VhcmNoIiB0aHJvdWdocHV0ICovCisJCWxxX3N0YS0+bGFzdF90cHQgPSBjdXJyZW50X3RwdDsKKworCQkvKiBTZWxlY3QgYSBuZXcgInNlYXJjaCIgbW9kdWxhdGlvbiBtb2RlIHRvIHRyeS4KKwkJICogSWYgb25lIGlzIGZvdW5kLCBzZXQgdXAgdGhlIG5ldyAic2VhcmNoIiB0YWJsZS4gKi8KKwkJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKQorCQkJaWw0OTY1X3JzX21vdmVfbGVnYWN5X290aGVyKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwgaWR4KTsKKwkJZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQorCQkJaWw0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihpbCwgbHFfc3RhLCBjb25mLCBzdGEsCisJCQkJCQkgICAgIGlkeCk7CisJCWVsc2UJCS8qIChpc19taW1vMih0YmwtPmxxX3R5cGUpKSAqLworCQkJaWw0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICAgaWR4KTsKKworCQkvKiBJZiBuZXcgInNlYXJjaCIgbW9kZSB3YXMgc2VsZWN0ZWQsIHNldCB1cCBpbiB1Q29kZSB0YWJsZSAqLworCQlpZiAobHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkgeworCQkJLyogQWNjZXNzIHRoZSAic2VhcmNoIiB0YWJsZSwgY2xlYXIgaXRzIGhpc3RvcnkuICovCisJCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQkJaWw0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luKCYodGJsLT53aW5baV0pKTsKKworCQkJLyogVXNlIG5ldyAic2VhcmNoIiBzdGFydCByYXRlICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKworCQkJRF9SQVRFKCJTd2l0Y2ggY3VycmVudCAgbWNzOiAlWCBpZHg6ICVkXG4iLAorCQkJICAgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpZHgpOworCQkJaWw0OTY1X3JzX2ZpbGxfbGlua19jbWQoaWwsIGxxX3N0YSwgdGJsLT5jdXJyZW50X3JhdGUpOworCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywgZmFsc2UpOworCQl9IGVsc2UKKwkJCWRvbmVfc2VhcmNoID0gMTsKKwl9CisKKwlpZiAoZG9uZV9zZWFyY2ggJiYgIWxxX3N0YS0+c3RheV9pbl90YmwpIHsKKwkJLyogSWYgdGhlICJhY3RpdmUiIChub24tc2VhcmNoKSBtb2RlIHdhcyBsZWdhY3ksCisJCSAqIGFuZCB3ZSd2ZSB0cmllZCBzd2l0Y2hpbmcgYW50ZW5uYXMsCisJCSAqIGJ1dCB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byB0cnkgSFQgbW9kZXMgKG5vdCBhdmFpbGFibGUpLAorCQkgKiBzdGF5IHdpdGggYmVzdCBhbnRlbm5hIGxlZ2FjeSBtb2R1bGF0aW9uIGZvciBhIHdoaWxlCisJCSAqIGJlZm9yZSBuZXh0IHJvdW5kIG9mIG1vZGUgY29tcGFyaXNvbnMuICovCisJCXRibDEgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwkJaWYgKGlzX2xlZ2FjeSh0YmwxLT5scV90eXBlKSAmJiAhY29uZl9pc19odChjb25mKSAmJgorCQkgICAgbHFfc3RhLT5hY3Rpb25fY291bnRlciA+IHRibDEtPm1heF9zZWFyY2gpIHsKKwkJCURfUkFURSgiTFE6IFNUQVkgaW4gbGVnYWN5IHRhYmxlXG4iKTsKKwkJCWlsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShpbCwgMSwgbHFfc3RhKTsKKwkJfQorCisJCS8qIElmIHdlJ3JlIGluIGFuIEhUIG1vZGUsIGFuZCBhbGwgMyBtb2RlIHN3aXRjaCBhY3Rpb25zCisJCSAqIGhhdmUgYmVlbiB0cmllZCBhbmQgY29tcGFyZWQsIHN0YXkgaW4gdGhpcyBiZXN0IG1vZHVsYXRpb24KKwkJICogbW9kZSBmb3IgYSB3aGlsZSBiZWZvcmUgbmV4dCByb3VuZCBvZiBtb2RlIGNvbXBhcmlzb25zLiAqLworCQlpZiAobHFfc3RhLT5lbmFibGVfY291bnRlciAmJgorCQkgICAgbHFfc3RhLT5hY3Rpb25fY291bnRlciA+PSB0YmwxLT5tYXhfc2VhcmNoKSB7CisJCQlpZiAobHFfc3RhLT5sYXN0X3RwdCA+IElMX0FHR19UUFRfVEhSRUhPTEQgJiYKKwkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKKwkJCSAgICB0aWQgIT0gTUFYX1RJRF9DT1VOVCkgeworCQkJCXRpZF9kYXRhID0KKwkJCQkgICAgJmlsLT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07CisJCQkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSUxfQUdHX09GRikgeworCQkJCQlEX1JBVEUoInRyeSB0byBhZ2dyZWdhdGUgdGlkICVkXG4iLAorCQkJCQkgICAgICAgdGlkKTsKKwkJCQkJaWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnKGlsLCB0aWQsCisJCQkJCQkJCSBscV9zdGEsIHN0YSk7CisJCQkJfQorCQkJfQorCQkJaWw0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKGlsLCAwLCBscV9zdGEpOworCQl9CisJfQorCitvdXQ6CisJdGJsLT5jdXJyZW50X3JhdGUgPQorCSAgICBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCB0YmwsIGlkeCwgaXNfZ3JlZW4pOworCWkgPSBpZHg7CisJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOworfQorCisvKioKKyAqIGlsNDk2NV9yc19pbml0aWFsaXplX2xxIC0gSW5pdGlhbGl6ZSBhIHN0YXRpb24ncyBoYXJkd2FyZSByYXRlIHRhYmxlCisgKgorICogVGhlIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSBjb250YWlucyBhIHRhYmxlIG9mIGZhbGxiYWNrIHJhdGVzCisgKiBmb3IgYXV0b21hdGljIGZhbGxiYWNrIGR1cmluZyB0cmFuc21pc3Npb24uCisgKgorICogTk9URTogVGhpcyBzZXRzIHVwIGEgZGVmYXVsdCBzZXQgb2YgdmFsdWVzLiAgVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBsYXRlcgorICogICAgICAgaWYgdGhlIGRyaXZlcidzIGl3bC00OTY1LXJzIHJhdGUgc2NhbGluZyBhbGdvcml0aG0gaXMgdXNlZCwgaW5zdGVhZCBvZgorICogICAgICAgcmM4MDIxMV9zaW1wbGUuCisgKgorICogTk9URTogUnVuIENfQUREX1NUQSBjb21tYW5kIHRvIHNldCB1cCBzdGF0aW9uIHRhYmxlIGVudHJ5LCBiZWZvcmUKKyAqICAgICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAod2hpY2ggcnVucyBDX1RYX0xJTktfUVVBTElUWV9DTUQsCisgKiAgICAgICB3aGljaCByZXF1aXJlcyBzdGF0aW9uIHRhYmxlIGVudHJ5IHRvIGV4aXN0KS4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19pbml0aWFsaXplX2xxKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsOworCWludCByYXRlX2lkeDsKKwlpbnQgaTsKKwl1MzIgcmF0ZTsKKwl1OCB1c2VfZ3JlZW4gPSBpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7CisJdTggYWN0aXZlX3RibCA9IDA7CisJdTggdmFsaWRfdHhfYW50OworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eDsKKworCWlmICghc3RhIHx8ICFscV9zdGEpCisJCXJldHVybjsKKworCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJaSA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCisJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisKKwlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCisJCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7CisJZWxzZQorCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKKworCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKKworCWlmIChpIDwgMCB8fCBpID49IFJBVEVfQ09VTlQpCisJCWkgPSAwOworCisJcmF0ZSA9IGlsX3JhdGVzW2ldLnBsY3A7CisJdGJsLT5hbnRfdHlwZSA9IGlsNDk2NV9maXJzdF9hbnRlbm5hKHZhbGlkX3R4X2FudCk7CisJcmF0ZSB8PSB0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisKKwlpZiAoaSA+PSBJTF9GSVJTVF9DQ0tfUkFURSAmJiBpIDw9IElMX0xBU1RfQ0NLX1JBVEUpCisJCXJhdGUgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKworCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MocmF0ZSwgaWwtPmJhbmQsIHRibCwgJnJhdGVfaWR4KTsKKwlpZiAoIWlsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCB0YmwtPmFudF90eXBlKSkKKwkJaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hKHZhbGlkX3R4X2FudCwgJnJhdGUsIHRibCk7CisKKwlyYXRlID0gaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChpbCwgdGJsLCByYXRlX2lkeCwgdXNlX2dyZWVuKTsKKwl0YmwtPmN1cnJlbnRfcmF0ZSA9IHJhdGU7CisJaWw0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCB0YmwpOworCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgcmF0ZSk7CisJaWwtPnN0YXRpb25zW2xxX3N0YS0+bHEuc3RhX2lkXS5scSA9ICZscV9zdGEtPmxxOworCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZ2V0X3JhdGUodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKK3sKKworCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJaW50IHJhdGVfaWR4OworCisJRF9SQVRFKCJyYXRlIHNjYWxlIGNhbGN1bGF0ZSBuZXcgcmF0ZSBmb3Igc2tiXG4iKTsKKworCS8qIEdldCBtYXggcmF0ZSBpZiB1c2VyIHNldCBtYXggcmF0ZSAqLworCWlmIChscV9zdGEpIHsKKwkJbHFfc3RhLT5tYXhfcmF0ZV9pZHggPSB0eHJjLT5tYXhfcmF0ZV9pZHg7CisJCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haICYmCisJCSAgICBscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkKKwkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgMCB8fAorCQkgICAgbHFfc3RhLT5tYXhfcmF0ZV9pZHggPj0gUkFURV9DT1VOVCkKKwkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gLTE7CisJfQorCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAobHFfc3RhICYmICFscV9zdGEtPmRydikgeworCQlEX1JBVEUoIlJhdGUgc2NhbGluZyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7CisJCWlsX3N0YSA9IE5VTEw7CisJfQorCisJLyogU2VuZCBtYW5hZ2VtZW50IGZyYW1lcyBhbmQgTk9fQUNLIGRhdGEgdXNpbmcgbG93ZXN0IHJhdGUuICovCisJaWYgKHJhdGVfY29udHJvbF9zZW5kX2xvdyhzdGEsIGlsX3N0YSwgdHhyYykpCisJCXJldHVybjsKKworCWlmICghbHFfc3RhKQorCQlyZXR1cm47CisKKwlyYXRlX2lkeCA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCisJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spIHsKKwkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCQkvKiA2TSBhbmQgOU0gc2hhcmVkIHNhbWUgTUNTIGlkeCAqLworCQlyYXRlX2lkeCA9IChyYXRlX2lkeCA+IDApID8gKHJhdGVfaWR4IC0gMSkgOiAwOworCQlpZiAoaWw0OTY1X3JzX2V4dHJhY3RfcmF0ZShscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzKSA+PQorCQkgICAgUkFURV9NSU1PMl82TV9QTENQKQorCQkJcmF0ZV9pZHggPSByYXRlX2lkeCArIE1DU19JRFhfUEVSX1NUUkVBTTsKKwkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IElFRUU4MDIxMV9UWF9SQ19NQ1M7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKKwkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KKwkJCSAgICBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKKwkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KKwkJCSAgICBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEE7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKKwkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOworCX0gZWxzZSB7CisJCS8qIENoZWNrIGZvciBpbnZhbGlkIHJhdGVzICovCisJCWlmIChyYXRlX2lkeCA8IDAgfHwgcmF0ZV9pZHggPj0gUkFURV9DT1VOVF9MRUdBQ1kgfHwKKwkJICAgIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haICYmCisJCSAgICAgcmF0ZV9pZHggPCBJTF9GSVJTVF9PRkRNX1JBVEUpKQorCQkJcmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKKwkJLyogT24gdmFsaWQgNSBHSHogcmF0ZSwgYWRqdXN0IGlkeCAqLworCQllbHNlIGlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzID0gMDsKKwl9CisJaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggPSByYXRlX2lkeDsKKworfQorCitzdGF0aWMgdm9pZCAqCitpbDQ5NjVfcnNfYWxsb2Nfc3RhKHZvaWQgKmlsX3JhdGUsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9CisJICAgIChzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisKKwlpbCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWlsX3JhdGU7CisJRF9SQVRFKCJjcmVhdGUgc3RhdGlvbiByYXRlIHNjYWxlIHdpblxuIik7CisKKwlyZXR1cm4gJnN0YV9wcml2LT5scV9zdGE7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgbmV3IHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcKKyAqLwordm9pZAoraWw0OTY1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaWwtPmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCXN0YV9wcml2ID0gKHN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKilzdGEtPmRydl9wcml2OworCWxxX3N0YSA9ICZzdGFfcHJpdi0+bHFfc3RhOworCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKKworCWxxX3N0YS0+bHEuc3RhX2lkID0gc3RhX2lkOworCisJZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKKwkJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQ7IGkrKykKKwkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmbHFfc3RhLT5scV9pbmZvW2pdLgorCQkJCQkJICAgICAgIHdpbltpXSk7CisKKwlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKKwlscV9zdGEtPnN1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOworCWZvciAoaiA9IDA7IGogPCBMUV9TSVpFOyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQlpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW4oJmxxX3N0YS0+bHFfaW5mb1tqXS4KKwkJCQkJCSAgICAgICB3aW5baV0pOworCisJRF9SQVRFKCJMUToiICIqKiogcmF0ZSBzY2FsZSBzdGF0aW9uIGdsb2JhbCBpbml0IGZvciBzdGF0aW9uICVkICoqKlxuIiwKKwkgICAgICAgc3RhX2lkKTsKKwkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90CisJICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCisJICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQorCSAqIGFmdGVyIGFzc29jLi4gKi8KKworCWxxX3N0YS0+aXNfZHVwID0gMDsKKwlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOworCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IElMX01JU1NFRF9SQVRFX01BWDsKKwlscV9zdGEtPmlzX2dyZWVuID0gaWw0OTY1X3JzX3VzZV9ncmVlbihzdGEpOworCWxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlID0gaWwtPmFjdGl2ZV9yYXRlICYgfigweDEwMDApOworCWxxX3N0YS0+YmFuZCA9IGlsLT5iYW5kOworCS8qCisJICogYWN0aXZlX3Npc29fcmF0ZSBtYXNrIGluY2x1ZGVzIDkgTUJpdHMgKGJpdCA1KSwgYW5kIENDSyAoYml0cyAwLTMpLAorCSAqIHN1cHBfcmF0ZXNbXSBkb2VzIG5vdDsgc2hpZnQgdG8gY29udmVydCBmb3JtYXQsIGZvcmNlIDkgTUJpdHMgb2ZmLgorCSAqLworCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPDwgMTsKKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgfD0gaHRfY2FwLT5tY3MucnhfbWFza1swXSAmIDB4MTsKKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgJj0gfigodTE2KSAweDIpOworCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA8PD0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJLyogU2FtZSBoZXJlICovCisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPDwgMTsKKwlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gJiAweDE7CisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAmPSB+KCh1MTYpIDB4Mik7CisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA8PD0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciAqLworCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KKwkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9CisJICAgIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgfmlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMuCisJCQkJCQkJICAgICAgIHZhbGlkX3R4X2FudCk7CisJaWYgKCFscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spIHsKKwkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOworCX0gZWxzZSBpZiAoaWw0OTY1X251bV9vZl9hbnQoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKKwkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0KKwkJICAgIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCX0KKworCS8qIGFzIGRlZmF1bHQgYWxsb3cgYWdncmVnYXRpb24gZm9yIGFsbCB0aWRzICovCisJbHFfc3RhLT50eF9hZ2dfdGlkX2VuID0gSUxfQUdHX0FMTF9USUQ7CisJbHFfc3RhLT5kcnYgPSBpbDsKKworCS8qIFNldCBsYXN0X3R4cmF0ZV9pZHggdG8gbG93ZXN0IHJhdGUgKi8KKwlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJbHFfc3RhLT5pc19hZ2cgPSAwOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKKwlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gMDsKKyNlbmRpZgorCisJaWw0OTY1X3JzX2luaXRpYWxpemVfbHEoaWwsIGNvbmYsIHN0YSwgbHFfc3RhKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19maWxsX2xpbmtfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJdTMyIG5ld19yYXRlKQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyB0YmxfdHlwZTsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgcmF0ZV9pZHg7CisJaW50IHJlcGVhdF9yYXRlID0gMDsKKwl1OCBhbnRfdG9nZ2xlX2NudCA9IDA7CisJdTggdXNlX2h0X3Bvc3NpYmxlID0gMTsKKwl1OCB2YWxpZF90eF9hbnQgPSAwOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscV9jbWQgPSAmbHFfc3RhLT5scTsKKworCS8qIE92ZXJyaWRlIHN0YXJ0aW5nIHJhdGUgKGlkeCAwKSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCisJaWw0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGlkeCk7CisKKwkvKiBJbnRlcnByZXQgbmV3X3JhdGUgKHJhdGVfbl9mbGFncykgKi8KKwlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLCBscV9zdGEtPmJhbmQsICZ0YmxfdHlwZSwKKwkJCQkJJnJhdGVfaWR4KTsKKworCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIGluaXRpYWwgcmF0ZT8gKi8KKwlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7CisJCWFudF90b2dnbGVfY250ID0gMTsKKwkJcmVwZWF0X3JhdGUgPSBJTF9OVU1CRVJfVFJZOworCX0gZWxzZSB7CisJCXJlcGVhdF9yYXRlID0gSUxfSFRfTlVNQkVSX1RSWTsKKwl9CisKKwlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0KKwkgICAgaXNfbWltbyh0YmxfdHlwZS5scV90eXBlKSA/IDEgOiAwOworCisJLyogRmlsbCAxc3QgdGFibGUgZW50cnkgKGlkeCAwKSAqLworCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUzMihuZXdfcmF0ZSk7CisKKwlpZiAoaWw0OTY1X251bV9vZl9hbnQodGJsX3R5cGUuYW50X3R5cGUpID09IDEpIHsKKwkJbHFfY21kLT5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2sgPQorCQkgICAgdGJsX3R5cGUuYW50X3R5cGU7CisJfSBlbHNlIGlmIChpbDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMikgeworCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPSB0YmxfdHlwZS5hbnRfdHlwZTsKKwl9CisJLyogb3RoZXJ3aXNlIHdlIGRvbid0IG1vZGlmeSB0aGUgZXhpc3RpbmcgdmFsdWUgKi8KKwlpZHgrKzsKKwlyZXBlYXRfcmF0ZS0tOworCWlmIChpbCkKKwkJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisKKwkvKiBGaWxsIHJlc3Qgb2YgcmF0ZSB0YWJsZSAqLworCXdoaWxlIChpZHggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgeworCQkvKiBSZXBlYXQgaW5pdGlhbC9uZXh0IHJhdGUuCisJCSAqIEZvciBsZWdhY3kgSUxfTlVNQkVSX1RSWSA9PSAxLCB0aGlzIGxvb3Agd2lsbCBub3QgZXhlY3V0ZS4KKwkJICogRm9yIEhUIElMX0hUX05VTUJFUl9UUlkgPT0gMywgdGhpcyBleGVjdXRlcyB0d2ljZS4gKi8KKwkJd2hpbGUgKHJlcGVhdF9yYXRlID4gMCAmJiBpZHggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgeworCQkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgeworCQkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCisJCQkJCWFudF90b2dnbGVfY250Kys7CisJCQkJZWxzZSBpZiAoaWwgJiYKKwkJCQkJIGlsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCisJCQkJCQkJCSAgJm5ld19yYXRlLAorCQkJCQkJCQkgICZ0YmxfdHlwZSkpCisJCQkJCWFudF90b2dnbGVfY250ID0gMTsKKwkJCX0KKworCQkJLyogT3ZlcnJpZGUgbmV4dCByYXRlIGlmIG5lZWRlZCBmb3IgZGVidWcgcHVycG9zZXMgKi8KKwkJCWlsNDk2NV9yc19kYmdmc19zZXRfbWNzKGxxX3N0YSwgJm5ld19yYXRlLCBpZHgpOworCisJCQkvKiBGaWxsIG5leHQgdGFibGUgZW50cnkgKi8KKwkJCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPQorCQkJICAgIGNwdV90b19sZTMyKG5ld19yYXRlKTsKKwkJCXJlcGVhdF9yYXRlLS07CisJCQlpZHgrKzsKKwkJfQorCisJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MobmV3X3JhdGUsIGxxX3N0YS0+YmFuZCwKKwkJCQkJCSZ0YmxfdHlwZSwgJnJhdGVfaWR4KTsKKworCQkvKiBJbmRpY2F0ZSB0byB1Q29kZSB3aGljaCBlbnRyaWVzIG1pZ2h0IGJlIE1JTU8uCisJCSAqIElmIGluaXRpYWwgcmF0ZSB3YXMgTUlNTywgdGhpcyB3aWxsIGZpbmFsbHkgZW5kIHVwCisJCSAqIGFzIChJTF9IVF9OVU1CRVJfVFJZICogMiksIGFmdGVyIDJuZCBwYXNzLCBvdGhlcndpc2UgMC4gKi8KKwkJaWYgKGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkpCisJCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0gaWR4OworCisJCS8qIEdldCBuZXh0IHJhdGUgKi8KKwkJbmV3X3JhdGUgPQorCQkgICAgaWw0OTY1X3JzX2dldF9sb3dlcl9yYXRlKGxxX3N0YSwgJnRibF90eXBlLCByYXRlX2lkeCwKKwkJCQkJICAgICB1c2VfaHRfcG9zc2libGUpOworCisJCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIG5leHQgcmF0ZT8gKi8KKwkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgeworCQkJaWYgKGFudF90b2dnbGVfY250IDwgTlVNX1RSWV9CRUZPUkVfQU5UX1RPR0dMRSkKKwkJCQlhbnRfdG9nZ2xlX2NudCsrOworCQkJZWxzZSBpZiAoaWwgJiYKKwkJCQkgaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hKHZhbGlkX3R4X2FudCwKKwkJCQkJCQkgICZuZXdfcmF0ZSwgJnRibF90eXBlKSkKKwkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7CisKKwkJCXJlcGVhdF9yYXRlID0gSUxfTlVNQkVSX1RSWTsKKwkJfSBlbHNlIHsKKwkJCXJlcGVhdF9yYXRlID0gSUxfSFRfTlVNQkVSX1RSWTsKKwkJfQorCisJCS8qIERvbid0IGFsbG93IEhUIHJhdGVzIGFmdGVyIG5leHQgcGFzcy4KKwkJICogaWw0OTY1X3JzX2dldF9sb3dlcl9yYXRlKCkgd2lsbCBjaGFuZ2UgdHlwZSB0byBMUV9BIG9yIExRX0cuICovCisJCXVzZV9odF9wb3NzaWJsZSA9IDA7CisKKwkJLyogT3ZlcnJpZGUgbmV4dCByYXRlIGlmIG5lZWRlZCBmb3IgZGVidWcgcHVycG9zZXMgKi8KKwkJaWw0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGlkeCk7CisKKwkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCisJCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUzMihuZXdfcmF0ZSk7CisKKwkJaWR4Kys7CisJCXJlcGVhdF9yYXRlLS07CisJfQorCisJbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKKwlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7CisKKwlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQorCSAgICBjcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKK30KKworc3RhdGljIHZvaWQgKgoraWw0OTY1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXJldHVybiBody0+cHJpdjsKK30KKworLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX2ZyZWUodm9pZCAqaWxfcmF0ZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZnJlZV9zdGEodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IGlsX3I7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKwlEX1JBVEUoImxlYXZlXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCitzdGF0aWMgaW50CitpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwgdTMyICogcmF0ZV9uX2ZsYWdzLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF9wcml2ICppbDsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggYW50X3NlbF90eDsKKworCWlsID0gbHFfc3RhLT5kcnY7CisJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJaWYgKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpIHsKKwkJYW50X3NlbF90eCA9CisJCSAgICAoKGxxX3N0YS0+CisJCSAgICAgIGRiZ19maXhlZF9yYXRlICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+CisJCSAgICAgUkFURV9NQ1NfQU5UX1BPUyk7CisJCWlmICgodmFsaWRfdHhfYW50ICYgYW50X3NlbF90eCkgPT0gYW50X3NlbF90eCkgeworCQkJKnJhdGVfbl9mbGFncyA9IGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGU7CisJCQlEX1JBVEUoIkZpeGVkIHJhdGUgT05cbiIpOworCQl9IGVsc2UgeworCQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7CisJCQlJTF9FUlIKKwkJCSAgICAoIkludmFsaWQgYW50ZW5uYSBzZWxlY3Rpb24gMHglWCwgVmFsaWQgaXMgMHglWFxuIiwKKwkJCSAgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKKwkJCURfUkFURSgiRml4ZWQgcmF0ZSBPRkZcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJRF9SQVRFKCJGaXhlZCByYXRlIE9GRlxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdAoraWw0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwljaGFyIGJ1Zls2NF07CisJc2l6ZV90IGJ1Zl9zaXplOworCXUzMiBwYXJzZWRfcmF0ZTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9CisJICAgIGNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpbF9zdGF0aW9uX3ByaXYsIGxxX3N0YSk7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlpbCA9IGxxX3N0YS0+ZHJ2OworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmcGFyc2VkX3JhdGUpID09IDEpCisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSBwYXJzZWRfcmF0ZTsKKwllbHNlCisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOworCisJbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUgPSAweDBGRkY7CS8qIDEgLSA1NCBNQml0cywgaW5jbHVkZXMgQ0NLICovCisJbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlID0gMHgxRkQwOwkvKiA2IC0gNjAgTUJpdHMsIG5vIDksIG5vIENDSyAqLworCWxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGUgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCisKKwlEX1JBVEUoInN0YV9pZCAlZCByYXRlIDB4JVhcbiIsIGxxX3N0YS0+bHEuc3RhX2lkLAorCSAgICAgICBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKKworCWlmIChscV9zdGEtPmRiZ19maXhlZF9yYXRlKSB7CisJCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7CisJCWlsX3NlbmRfbHFfY21kKGxxX3N0YS0+ZHJ2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZmY7CisJaW50IGRlc2MgPSAwOworCWludCBpID0gMDsKKwlpbnQgaWR4ID0gMDsKKwlzc2l6ZV90IHJldDsKKworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKworCWlsID0gbHFfc3RhLT5kcnY7CisJYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgInN0YV9pZCAlZFxuIiwgbHFfc3RhLT5scS5zdGFfaWQpOworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgImZhaWxlZD0lZCBzdWNjZXNzPSVkIHJhdGU9MCVYXG4iLAorCQkgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQsIGxxX3N0YS0+dG90YWxfc3VjY2VzcywKKwkJICAgIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJmaXhlZCByYXRlIDB4JVhcbiIsIGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpOworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgInZhbGlkX3R4X2FudCAlcyVzJXNcbiIsCisJCSAgICAoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQSkgPyAiQU5UX0EsIiA6ICIiLAorCQkgICAgKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0IpID8gIkFOVF9CLCIgOiAiIiwKKwkJICAgIChpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9DKSA/ICJBTlRfQyIgOiAiIik7CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAibHEgdHlwZSAlc1xuIiwKKwkJICAgIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgPyAibGVnYWN5IiA6ICJIVCIpOworCWlmIChpc19IdCh0YmwtPmxxX3R5cGUpKSB7CisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAorCQkJICAgIChpc19zaXNvKHRibC0+bHFfdHlwZSkpID8gIlNJU08iIDogIk1JTU8yIik7CisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAorCQkJICAgICh0YmwtPmlzX2h0NDApID8gIjQwTUh6IiA6ICIyME1IeiIpOworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiICVzICVzICVzXG4iLAorCQkJICAgICh0YmwtPmlzX1NHSSkgPyAiU0dJIiA6ICIiLAorCQkJICAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAorCQkJICAgIChscV9zdGEtPmlzX2FnZykgPyAiQUdHIG9uIiA6ICIiKTsKKwl9CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAibGFzdCB0eCByYXRlPTB4JVhcbiIsCisJCSAgICBscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCSAgICAiZ2VuZXJhbDoiICJmbGFncz0weCVYIG1pbW8tZD0lZCBzLWFudDB4JXggZC1hbnQ9MHgleFxuIiwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MsCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2ssCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOworCisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkgICAgImFnZzoiCisJCSAgICAidGltZV9saW1pdD0lZCBkaXN0X3N0YXJ0X3RoPSVkIGZyYW1lX2NudF9saW1pdD0lZFxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCksCisJCSAgICBscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCwKKwkJICAgIGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0KTsKKworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywKKwkJICAgICJTdGFydCBpZHggWzBdPTB4JXggWzFdPTB4JXggWzJdPTB4JXggWzNdPTB4JXhcbiIsCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnN0YXJ0X3JhdGVfaWR4WzBdLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2lkeFsxXSwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc3RhcnRfcmF0ZV9pZHhbMl0sCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnN0YXJ0X3JhdGVfaWR4WzNdKTsKKworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CisJCWlkeCA9CisJCSAgICBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KGxlMzJfdG9fY3B1CisJCQkJCSAgICAgIChscV9zdGEtPmxxLnJzX3RhYmxlW2ldLgorCQkJCQkgICAgICAgcmF0ZV9uX2ZsYWdzKSk7CisJCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHNcbiIsIGksCisJCQkJICAgIGxlMzJfdG9fY3B1KGxxX3N0YS0+bHEucnNfdGFibGVbaV0uCisJCQkJCQlyYXRlX25fZmxhZ3MpLAorCQkJCSAgICBpbF9yYXRlX21jc1tpZHhdLm1icHMpOworCQl9IGVsc2UgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHMgKCVzKVxuIiwKKwkJCQkgICAgaSwKKwkJCQkgICAgbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS4KKwkJCQkJCXJhdGVfbl9mbGFncyksCisJCQkJICAgIGlsX3JhdGVfbWNzW2lkeF0ubWJwcywKKwkJCQkgICAgaWxfcmF0ZV9tY3NbaWR4XS5tY3MpOworCQl9CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKKwlrZnJlZShidWZmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzID0geworCS53cml0ZSA9IGlsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUsCisJLnJlYWQgPSBpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqYnVmZjsKKwlpbnQgZGVzYyA9IDA7CisJaW50IGksIGo7CisJc3NpemVfdCByZXQ7CisKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlidWZmID0ga21hbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IExRX1NJWkU7IGkrKykgeworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkJICAgICIlcyB0eXBlPSVkIFNHST0lZCBIVDQwPSVkIERVUD0lZCBHRj0lZFxuIgorCQkJICAgICJyYXRlPTB4JVhcbiIsIGxxX3N0YS0+YWN0aXZlX3RibCA9PSBpID8gIioiIDogIngiLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5scV90eXBlLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5pc19TR0ksCisJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLmlzX2h0NDAsCisJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLmlzX2R1cCwgbHFfc3RhLT5pc19ncmVlbiwKKwkJCSAgICBscV9zdGEtPmxxX2luZm9baV0uY3VycmVudF9yYXRlKTsKKwkJZm9yIChqID0gMDsgaiA8IFJBVEVfQ09VTlQ7IGorKykgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCQkJICAgICJjb3VudGVyPSVkIHN1Y2Nlc3M9JWQgJSU9JWRcbiIsCisJCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uY291bnRlciwKKwkJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLndpbltqXS5zdWNjZXNzX2NvdW50ZXIsCisJCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uc3VjY2Vzc19yYXRpbyk7CisJCX0KKwl9CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKKwlrZnJlZShidWZmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzID0geworCS5yZWFkID0gaWw0OTY1X3JzX3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkLAorCS5vcGVuID0gaWw0OTY1X29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZmWzEyMF07CisJaW50IGRlc2MgPSAwOworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCA9ICZscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXTsKKworCWlmIChpc19IdCh0YmwtPmxxX3R5cGUpKQorCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiQml0IFJhdGU9ICVkIE1iL3NcbiIsCisJCQkgICAgdGJsLT5leHBlY3RlZF90cHRbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdKTsKKwllbHNlCisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJCaXQgUmF0ZT0gJWQgTWIvc1xuIiwKKwkJCSAgICBpbF9yYXRlc1tscV9zdGEtPmxhc3RfdHhyYXRlX2lkeF0uaWVlZSA+PiAxKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyA9IHsKKwkucmVhZCA9IGlsNDk2NV9yc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX3JlYWQsCisJLm9wZW4gPSBpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19hZGRfZGVidWdmcyh2b2lkICppbCwgdm9pZCAqaWxfc3RhLCBzdHJ1Y3QgZGVudHJ5ICpkaXIpCit7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUgPQorCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX3RhYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKKwkJCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzKTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIFNfSVJVU1IsIGRpciwgbHFfc3RhLAorCQkJCSZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZSA9CisJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGVfc2NhbGVfZGF0YSIsIFNfSVJVU1IsIGRpciwgbHFfc3RhLAorCQkJCSZyc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyk7CisJbHFfc3RhLT5yc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfdTgoInR4X2FnZ190aWRfZW5hYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKKwkJCSAgICAgICZscV9zdGEtPnR4X2FnZ190aWRfZW4pOworCit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnModm9pZCAqaWwsIHZvaWQgKmlsX3N0YSkKK3sKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSk7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBpcyBkb25lIGJ5IGRyaXZlciBhZnRlcgorICogdGhlIHN0YXRpb24gaXMgYWRkZWQuIFNpbmNlIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEKKyAqIHN0YXRpb24gaXMgYWRkZWQgd2UgaWdub3JlIGl0LgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3JhdGVfaW5pdF9zdHViKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSkKK3sKK30KKworc3RhdGljIHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHJzXzQ5NjVfb3BzID0geworCS5tb2R1bGUgPSBOVUxMLAorCS5uYW1lID0gSUw0OTY1X1JTX05BTUUsCisJLnR4X3N0YXR1cyA9IGlsNDk2NV9yc190eF9zdGF0dXMsCisJLmdldF9yYXRlID0gaWw0OTY1X3JzX2dldF9yYXRlLAorCS5yYXRlX2luaXQgPSBpbDQ5NjVfcnNfcmF0ZV9pbml0X3N0dWIsCisJLmFsbG9jID0gaWw0OTY1X3JzX2FsbG9jLAorCS5mcmVlID0gaWw0OTY1X3JzX2ZyZWUsCisJLmFsbG9jX3N0YSA9IGlsNDk2NV9yc19hbGxvY19zdGEsCisJLmZyZWVfc3RhID0gaWw0OTY1X3JzX2ZyZWVfc3RhLAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJLmFkZF9zdGFfZGVidWdmcyA9IGlsNDk2NV9yc19hZGRfZGVidWdmcywKKwkucmVtb3ZlX3N0YV9kZWJ1Z2ZzID0gaWw0OTY1X3JzX3JlbW92ZV9kZWJ1Z2ZzLAorI2VuZGlmCit9OworCitpbnQKK2lsNDk2NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcigmcnNfNDk2NV9vcHMpOworfQorCit2b2lkCitpbDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpZWVlODAyMTFfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoJnJzXzQ5NjVfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM1NGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS5jCkBAIC0wLDAgKzEsMjQyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKy8qKgorICogaWxfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKKyAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJaW50IHJldCA9IDA7CisJdTMyIGVycmNudCA9IDA7CisJdTMyIGk7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAgLyBzaXplb2YodTMyKSkgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElMX0RMX0lPIGlzIHNldCAqLworCQlpbF93cihpbCwgSEJVU19UQVJHX01FTV9SQUREUiwgaSArIElMNDk2NV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZXJyY250Kys7CisJCQlpZiAoZXJyY250ID49IDMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdmVyaWZ5X2luc3RfZnVsbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJdTMyIHNhdmVfbGVuID0gbGVuOworCWludCByZXQgPSAwOworCXUzMiBlcnJjbnQ7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUVNX1JBRERSLCBJTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCisJZXJyY250ID0gMDsKKwlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKKwkJICogaWYgSUxfRExfSU8gaXMgc2V0ICovCisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlJTF9FUlIoInVDb2RlIElOU1Qgc2VjdGlvbiBpcyBpbnZhbGlkIGF0ICIKKwkJCSAgICAgICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmV0ID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAyMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZXJyY250KQorCQlEX0lORk8oInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWw0OTY1X3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAorICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKKyAqLworaW50CitpbDQ5NjVfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMzIgKmltYWdlOworCXUzMiBsZW47CisJaW50IHJldDsKKworCS8qIFRyeSBib290c3RyYXAgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlyZXQgPSBpbDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAoIXJldCkgeworCQlEX0lORk8oIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSBpbml0aWFsaXplICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9pbml0LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfaW5pdC5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKCFyZXQpIHsKKwkJRF9JTkZPKCJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2NvZGUudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9jb2RlLmxlbjsKKwlyZXQgPSBpbDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAoIXJldCkgeworCQlEX0lORk8oIlJ1bnRpbWUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJTF9FUlIoIk5PIFZBTElEIFVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0hIVxuIik7CisKKwkvKiBTaW5jZSBub3RoaW5nIHNlZW1zIHRvIG1hdGNoLCBzaG93IGZpcnN0IHNldmVyYWwgZGF0YSBlbnRyaWVzIGluCisJICogaW5zdHJ1Y3Rpb24gU1JBTSwgc28gbWF5YmUgdmlzdWFsIGluc3BlY3Rpb24gd2lsbCBnaXZlIGEgY2x1ZS4KKwkgKiBTZWxlY3Rpb24gb2YgYm9vdHN0cmFwIGltYWdlICh2cy4gb3RoZXIgaW1hZ2VzKSBpcyBhcmJpdHJhcnkuICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwoaWwsIGltYWdlLCBsZW4pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBkZXZpY2UncyBFRVBST00gc2VtYXBob3JlIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIGRyaXZlciBhbmQgdUNvZGUKKyAqIHdoZW4gYWNjZXNzaW5nIHRoZSBFRVBST007IGVhY2ggYWNjZXNzIGlzIGEgc2VyaWVzIG9mIHB1bHNlcyB0by9mcm9tIHRoZQorICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5CisgKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KKyAqLworaW50CitpbDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MTYgY291bnQ7CisJaW50IHJldDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVFUFJPTV9TRU1fUkVUUllfTElNSVQ7IGNvdW50KyspIHsKKwkJLyogUmVxdWVzdCBzZW1hcGhvcmUgKi8KKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOworCisJCS8qIFNlZSBpZiB3ZSBnb3QgaXQgKi8KKwkJcmV0ID0KKwkJICAgIF9pbF9wb2xsX2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKKwkJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAorCQkJCSBFRVBST01fU0VNX1RJTUVPVVQpOworCQlpZiAocmV0ID49IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCSAgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKKworfQorCitpbnQKK2lsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTE2IGVlcHJvbV92ZXI7CisJdTE2IGNhbGliX3ZlcjsKKworCWVlcHJvbV92ZXIgPSBpbF9lZXByb21fcXVlcnkxNihpbCwgRUVQUk9NX1ZFUlNJT04pOworCWNhbGliX3ZlciA9IGlsX2VlcHJvbV9xdWVyeTE2KGlsLCBFRVBST01fNDk2NV9DQUxJQl9WRVJTSU9OX09GRlNFVCk7CisKKwlpZiAoZWVwcm9tX3ZlciA8IGlsLT5jZmctPmVlcHJvbV92ZXIgfHwKKwkgICAgY2FsaWJfdmVyIDwgaWwtPmNmZy0+ZWVwcm9tX2NhbGliX3ZlcikKKwkJZ290byBlcnI7CisKKwlJTF9JTkZPKCJkZXZpY2UgRUVQUk9NIFZFUj0weCV4LCBDQUxJQj0weCV4XG4iLCBlZXByb21fdmVyLCBjYWxpYl92ZXIpOworCisJcmV0dXJuIDA7CitlcnI6CisJSUxfRVJSKCJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCisJICAgICAgICJDQUxJQj0weCV4IDwgMHgleFxuIiwgZWVwcm9tX3ZlciwgaWwtPmNmZy0+ZWVwcm9tX3ZlciwKKwkgICAgICAgY2FsaWJfdmVyLCBpbC0+Y2ZnLT5lZXByb21fY2FsaWJfdmVyKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworfQorCit2b2lkCitpbDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCB1OCAqIG1hYykKK3sKKwljb25zdCB1OCAqYWRkciA9IGlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkgICAgICBFRVBST01fTUFDX0FERFJFU1MpOworCW1lbWNweShtYWMsIGFkZHIsIEVUSF9BTEVOKTsKK30KKworLyogU2VuZCBsZWQgY29tbWFuZCAqLworc3RhdGljIGludAoraWw0OTY1X3NlbmRfbGVkX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9sZWRfY21kICpsZWRfY21kKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfTEVEUywKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGVkX2NtZCksCisJCS5kYXRhID0gbGVkX2NtZCwKKwkJLmZsYWdzID0gQ01EX0FTWU5DLAorCQkuY2FsbGJhY2sgPSBOVUxMLAorCX07CisJdTMyIHJlZzsKKworCXJlZyA9IF9pbF9yZChpbCwgQ1NSX0xFRF9SRUcpOworCWlmIChyZWcgIT0gKHJlZyAmIENTUl9MRURfQlNNX0NUUkxfTVNLKSkKKwkJX2lsX3dyKGlsLCBDU1JfTEVEX1JFRywgcmVnICYgQ1NSX0xFRF9CU01fQ1RSTF9NU0spOworCisJcmV0dXJuIGlsX3NlbmRfY21kKGlsLCAmY21kKTsKK30KKworLyogU2V0IGxlZCByZWdpc3RlciBvZmYgKi8KK3ZvaWQKK2lsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfd3IoaWwsIENTUl9MRURfUkVHLCBDU1JfTEVEX1JFR19UUlVOX09OKTsKK30KKworY29uc3Qgc3RydWN0IGlsX2xlZF9vcHMgaWw0OTY1X2xlZF9vcHMgPSB7CisJLmNtZCA9IGlsNDk2NV9zZW5kX2xlZF9jbWQsCit9OworCitzdGF0aWMgaW50IGlsNDk2NV9zZW5kX3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCk7CitzdGF0aWMgaW50IGlsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUw0OTY1X1VDT0RFX0FQSV9NQVggMgorCisvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMNDk2NV9VQ09ERV9BUElfTUlOIDIKKworI2RlZmluZSBJTDQ5NjVfRldfUFJFICJpd2x3aWZpLTQ5NjUtIgorI2RlZmluZSBfSUw0OTY1X01PRFVMRV9GSVJNV0FSRShhcGkpIElMNDk2NV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKQorCisvKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCitzdGF0aWMgaW50CitpbDQ5NjVfdmVyaWZ5X2JzbShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZSA9IGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwl1MzIgbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXUzMiByZWc7CisJdTMyIHZhbDsKKworCURfSU5GTygiQmVnaW4gdmVyaWZ5IGJzbVxuIik7CisKKwkvKiB2ZXJpZnkgQlNNIFNSQU0gY29udGVudHMgKi8KKwl2YWwgPSBpbF9yZF9wcnBoKGlsLCBCU01fV1JfRFdDT1VOVF9SRUcpOworCWZvciAocmVnID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7IHJlZyA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCXZhbCA9IGlsX3JkX3BycGgoaWwsIHJlZyk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCisJCQkgICAgICAgImFkZHIgMHglMDhYKyV1IChvZiAldSksIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCByZWcgLSBCU01fU1JBTV9MT1dFUl9CT1VORCwKKwkJCSAgICAgICBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCURfSU5GTygiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKKyAqCisgKiBCU00gb3BlcmF0aW9uOgorICoKKyAqIFRoZSBCb290c3RyYXAgU3RhdGUgTWFjaGluZSAoQlNNKSBzdG9yZXMgYSBzaG9ydCBib290c3RyYXAgdUNvZGUgcHJvZ3JhbQorICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biBkdXJpbmcgUkZLSUxMLiAgV2hlbiBwb3dlcmluZyBiYWNrCisgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcworICogdGhlIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gdGhlIG9uLWJvYXJkIHByb2Nlc3NvciwgYW5kIHN0YXJ0cyBpdC4KKyAqCisgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKKyAqIHByb2dyYW0gZnJvbSBob3N0IERSQU0gbG9jYXRpb25zIGluZGljYXRlZCBieSB0aGUgaG9zdCBkcml2ZXIgaW4gdGhlCisgKiBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIG5ldyBwcm9ncmFtIGlzIGxvYWRlZCwgaXQgc3RhcnRzCisgKiBhdXRvbWF0aWNhbGx5LgorICoKKyAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBOSUMsIHRoZSBob3N0IGRyaXZlciBwb2ludHMgdGhlIEJTTSB0byB0aGUKKyAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KKyAqIG5vdGlmaWVzIGhvc3QgdmlhICJpbml0aWFsaXplIGFsaXZlIiB0aGF0IGl0IGlzIGNvbXBsZXRlLgorICoKKyAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCisgKiBub3JtYWwgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIGEgYmFja3VwIHVDb2RlIGRhdGEgY2FjaGUgYnVmZmVyCisgKiAoZmlsbGVkIGluaXRpYWxseSB3aXRoIHN0YXJ0aW5nIGRhdGEgdmFsdWVzIGZvciB0aGUgb24tYm9hcmQgcHJvY2Vzc29yKSwKKyAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCisgKiB3aGljaCBiZWdpbnMgbm9ybWFsIG9wZXJhdGlvbi4KKyAqCisgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bworICogdGhlIGJhY2t1cCBkYXRhIGNhY2hlIGluIERSQU0gYmVmb3JlIFNSQU0gaXMgcG93ZXJlZCBkb3duLgorICoKKyAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKKyAqIHRoZSBydW50aW1lIHVDb2RlIGluc3RydWN0aW9ucyBhbmQgdGhlIGJhY2t1cCBkYXRhIGNhY2hlIGludG8gU1JBTSwKKyAqIGFuZCByZS1sYXVuY2hlcyB0aGUgcnVudGltZSB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfbG9hZF9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisJdTMyIGluc3RfbGVuOworCXUzMiBkYXRhX2xlbjsKKwlpbnQgaTsKKwl1MzIgZG9uZTsKKwl1MzIgcmVnX29mZnNldDsKKwlpbnQgcmV0OworCisJRF9JTkZPKCJCZWdpbiBsb2FkIGJzbVxuIik7CisKKwlpbC0+dWNvZGVfdHlwZSA9IFVDT0RFX1JUOworCisJLyogbWFrZSBzdXJlIGJvb3RzdHJhcCBwcm9ncmFtIGlzIG5vIGxhcmdlciB0aGFuIEJTTSdzIFNSQU0gc2l6ZSAqLworCWlmIChsZW4gPiBJTDQ5X01BWF9CU01fU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIHRoZSAiSW5pdGlhbGl6ZSIgdUNvZGUKKwkgKiAgIGluIGhvc3QgRFJBTSAuLi4gaG9zdCBEUkFNIHBoeXNpY2FsIGFkZHJlc3MgYml0cyAzNTo0IGZvciA0OTY1LgorCSAqIE5PVEU6ICBpbF9pbml0X2FsaXZlX3N0YXJ0KCkgd2lsbCByZXBsYWNlIHRoZXNlIHZhbHVlcywKKwkgKiAgICAgICAgYWZ0ZXIgdGhlICJpbml0aWFsaXplIiB1Q29kZSBoYXMgcnVuLCB0byBwb2ludCB0bworCSAqICAgICAgICBydW50aW1lL3Byb3RvY29sIGluc3RydWN0aW9ucyBhbmQgYmFja3VwIGRhdGEgY2FjaGUuCisJICovCisJcGluc3QgPSBpbC0+dWNvZGVfaW5pdC5wX2FkZHIgPj4gNDsKKwlwZGF0YSA9IGlsLT51Y29kZV9pbml0X2RhdGEucF9hZGRyID4+IDQ7CisJaW5zdF9sZW4gPSBpbC0+dWNvZGVfaW5pdC5sZW47CisJZGF0YV9sZW4gPSBpbC0+dWNvZGVfaW5pdF9kYXRhLmxlbjsKKworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywgaW5zdF9sZW4pOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfQllURUNPVU5UX1JFRywgZGF0YV9sZW4pOworCisJLyogRmlsbCBCU00gbWVtb3J5IHdpdGggYm9vdHN0cmFwIGluc3RydWN0aW9ucyAqLworCWZvciAocmVnX29mZnNldCA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOworCSAgICAgcmVnX29mZnNldCA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnX29mZnNldCArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykKKwkJX2lsX3dyX3BycGgoaWwsIHJlZ19vZmZzZXQsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9ic20oaWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX01FTV9TUkNfUkVHLCAweDApOworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9NRU1fRFNUX1JFRywgSUw0OV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0RXQ09VTlRfUkVHLCBsZW4gLyBzaXplb2YodTMyKSk7CisKKwkvKiBMb2FkIGJvb3RzdHJhcCBjb2RlIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSBub3csCisJICogICB0byBwcmVwYXJlIHRvIGxvYWQgImluaXRpYWxpemUiIHVDb2RlICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKTsKKworCS8qIFdhaXQgZm9yIGxvYWQgb2YgYm9vdHN0cmFwIHVDb2RlIHRvIGZpbmlzaCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlkb25lID0gaWxfcmRfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHKTsKKwkJaWYgKCEoZG9uZSAmIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpIDwgMTAwKQorCQlEX0lORk8oIkJTTSB3cml0ZSBjb21wbGV0ZSwgcG9sbCAlZCBpdGVyYXRpb25zXG4iLCBpKTsKKwllbHNlIHsKKwkJSUxfRVJSKCJCU00gd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbmFibGUgZnV0dXJlIGJvb3QgbG9hZHMgd2hlbmV2ZXIgcG93ZXIgbWFuYWdlbWVudCB1bml0IHRyaWdnZXJzIGl0CisJICogICAoZS5nLiB3aGVuIHBvd2VyaW5nIGJhY2sgdXAgYWZ0ZXIgcG93ZXItc2F2ZSBzaHV0ZG93bikgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfQ1RSTF9SRUcsIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X3NldF91Y29kZV9wdHJzIC0gU2V0IHVDb2RlIGFkZHJlc3MgbG9jYXRpb24KKyAqCisgKiBUZWxsIGluaXRpYWxpemF0aW9uIHVDb2RlIHdoZXJlIHRvIGZpbmQgcnVudGltZSB1Q29kZS4KKyAqCisgKiBCU00gcmVnaXN0ZXJzIGluaXRpYWxseSBjb250YWluIHBvaW50ZXJzIHRvIGluaXRpYWxpemF0aW9uIHVDb2RlLgorICogV2UgbmVlZCB0byByZXBsYWNlIHRoZW0gdG8gbG9hZCBydW50aW1lIHVDb2RlIGluc3QgYW5kIGRhdGEsCisgKiBhbmQgdG8gc2F2ZSBydW50aW1lIGRhdGEgd2hlbiBwb3dlcmluZyBkb3duLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X3Vjb2RlX3B0cnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWRtYV9hZGRyX3QgcGluc3Q7CisJZG1hX2FkZHJfdCBwZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGJpdHMgMzU6NCBmb3IgNDk2NSAqLworCXBpbnN0ID0gaWwtPnVjb2RlX2NvZGUucF9hZGRyID4+IDQ7CisJcGRhdGEgPSBpbC0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyID4+IDQ7CisKKwkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGlsLT51Y29kZV9kYXRhLmxlbik7CisKKwkvKiBJbnN0IGJ5dGUgY291bnQgbXVzdCBiZSBsYXN0IHRvIHNldCB1cCwgYml0IDMxIHNpZ25hbHMgdUNvZGUKKwkgKiAgIHRoYXQgYWxsIG5ldyBwdHIvc2l6ZSBpbmZvIGlzIGluIHBsYWNlICovCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAorCQkgICBpbC0+dWNvZGVfY29kZS5sZW4gfCBCU01fRFJBTV9JTlNUX0xPQUQpOworCURfSU5GTygiUnVudGltZSB1Q29kZSBwb2ludGVycyBhcmUgc2V0LlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV9pbml0X2FsaXZlX3N0YXJ0IC0gQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCisgKgorICogQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gImluaXRpYWxpemUiIHVDb2RlLgorICoKKyAqIFRoZSA0OTY1ICJpbml0aWFsaXplIiBBTElWRSByZXBseSBjb250YWlucyBjYWxpYnJhdGlvbiBkYXRhIGZvcjoKKyAqICAgVm9sdGFnZSwgdGVtcGVyYXR1cmUsIGFuZCBNSU1PIHR4IGdhaW4gY29ycmVjdGlvbiwgbm93IHN0b3JlZCBpbiBpbAorICogICAoMzk0NSBkb2VzIG5vdCBjb250YWluIHRoaXMgZGF0YSkuCisgKgorICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCisqLworc3RhdGljIHZvaWQKK2lsNDk2NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KKwkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQorCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KKwlpZiAoaWw0OTY1X3ZlcmlmeV91Y29kZShpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJCYWQgXCJpbml0aWFsaXplXCIgdUNvZGUgbG9hZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlICovCisJaWwtPnRlbXBlcmF0dXJlID0gaWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShpbCk7CisKKwkvKiBTZW5kIHBvaW50ZXJzIHRvIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgaW1hZ2UgLi4uIGluaXQgY29kZSB3aWxsCisJICogbG9hZCBhbmQgbGF1bmNoIHJ1bnRpbWUgdUNvZGUsIHdoaWNoIHdpbGwgc2VuZCB1cyBhbm90aGVyICJBbGl2ZSIKKwkgKiBub3RpZmljYXRpb24uICovCisJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCWlmIChpbDQ5NjVfc2V0X3Vjb2RlX3B0cnMoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJDb3VsZG4ndCBzZXQgdXAgdUNvZGUgcG9pbnRlcnMuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlyZXR1cm47CisKK3Jlc3RhcnQ6CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworfQorCitzdGF0aWMgYm9vbAoraXc0OTY1X2lzX2h0NDBfY2hhbm5lbChfX2xlMzIgcnhvbl9mbGFncykKK3sKKwlpbnQgY2hhbl9tb2QgPQorCSAgICBsZTMyX3RvX2NwdShyeG9uX2ZsYWdzICYgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSykgPj4KKwkgICAgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUzsKKwlyZXR1cm4gKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwIHx8CisJCWNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9NSVhFRCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfbmljX2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmFkaW9fY2ZnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyYWRpb19jZmcgPSBpbF9lZXByb21fcXVlcnkxNihpbCwgRUVQUk9NX1JBRElPX0NPTkZJRyk7CisKKwkvKiB3cml0ZSByYWRpbyBjb25maWcgdmFsdWVzIHRvIHJlZ2lzdGVyICovCisJaWYgKEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSA9PSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVgpCisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpIHwKKwkJCSAgIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSB8CisJCQkgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOworCisJLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX1JBRElPX1NJIHwKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7CisKKwlpbC0+Y2FsaWJfaW5mbyA9CisJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8gKikKKwkgICAgaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsIEVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFJlc2V0IGRpZmZlcmVudGlhbCBSeCBnYWlucyBpbiBOSUMgdG8gcHJlcGFyZSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24uCisgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgYXNzb2NpYXRpb24sIGJ1dCB0aGlzIHJ1bnMgb25seSBvbmNlIQorICogIC4uLiBvbmNlIGNoYWluIG5vaXNlIGlzIGNhbGlicmF0ZWQgdGhlIGZpcnN0IHRpbWUsIGl0J3MgZ29vZCBmb3JldmVyLiAgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfY2hhaW5fbm9pc2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJihpbC0+Y2hhaW5fbm9pc2VfZGF0YSk7CisKKwlpZiAoZGF0YS0+c3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfQUxJVkUgJiYgaWxfaXNfYW55X2Fzc29jaWF0ZWQoaWwpKSB7CisJCXN0cnVjdCBpbF9jYWxpYl9kaWZmX2dhaW5fY21kIGNtZDsKKworCQkvKiBjbGVhciBkYXRhIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBhbGdvcml0aG0gKi8KKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IDA7CisJCWRhdGEtPmNoYWluX25vaXNlX2IgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9jID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2EgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gMDsKKwkJZGF0YS0+YmVhY29uX2NvdW50ID0gMDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuaGRyLm9wX2NvZGUgPSBJTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQ7CisJCWNtZC5kaWZmX2dhaW5fYSA9IDA7CisJCWNtZC5kaWZmX2dhaW5fYiA9IDA7CisJCWNtZC5kaWZmX2dhaW5fYyA9IDA7CisJCWlmIChpbF9zZW5kX2NtZF9wZHUoaWwsIENfUEhZX0NBTElCUkFUSU9OLCBzaXplb2YoY21kKSwgJmNtZCkpCisJCQlJTF9FUlIoIkNvdWxkIG5vdCBzZW5kIENfUEhZX0NBTElCUkFUSU9OXG4iKTsKKwkJZGF0YS0+c3RhdGUgPSBJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFOworCQlEX0NBTElCKCJSdW4gY2hhaW5fbm9pc2VfY2FsaWJyYXRlXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzIGlsNDk2NV9zZW5zaXRpdml0eSA9IHsKKwkubWluX25yZ19jY2sgPSA5NywKKwkubWF4X25yZ19jY2sgPSAwLAkvKiBub3QgdXNlZCwgc2V0IHRvIDAgKi8KKworCS5hdXRvX2NvcnJfbWluX29mZG0gPSA4NSwKKwkuYXV0b19jb3JyX21pbl9vZmRtX21yYyA9IDE3MCwKKwkuYXV0b19jb3JyX21pbl9vZmRtX3gxID0gMTA1LAorCS5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxID0gMjIwLAorCisJLmF1dG9fY29ycl9tYXhfb2ZkbSA9IDEyMCwKKwkuYXV0b19jb3JyX21heF9vZmRtX21yYyA9IDIxMCwKKwkuYXV0b19jb3JyX21heF9vZmRtX3gxID0gMTQwLAorCS5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxID0gMjcwLAorCisJLmF1dG9fY29ycl9taW5fY2NrID0gMTI1LAorCS5hdXRvX2NvcnJfbWF4X2NjayA9IDIwMCwKKwkuYXV0b19jb3JyX21pbl9jY2tfbXJjID0gMjAwLAorCS5hdXRvX2NvcnJfbWF4X2Nja19tcmMgPSA0MDAsCisKKwkubnJnX3RoX2NjayA9IDEwMCwKKwkubnJnX3RoX29mZG0gPSAxMDAsCisKKwkuYmFya2VyX2NvcnJfdGhfbWluID0gMTkwLAorCS5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gMzkwLAorCS5ucmdfdGhfY2NhID0gNjIsCit9OworCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIHdhbnQgS2VsdmluICovCisJaWwtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCA9CisJICAgIENFTFNJVVNfVE9fS0VMVklOKENUX0tJTExfVEhSRVNIT0xEX0xFR0FDWSk7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X3NldF9od19wYXJhbXMKKyAqCisgKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA+PSBJTF9NSU5fTlVNX1FVRVVFUyAmJgorCSAgICBpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5udW1fb2ZfcXVldWVzIDw9IElMNDlfTlVNX1FVRVVFUykKKwkJaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQorCQkgICAgaWwtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKworCWlsLT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlpbC0+aHdfcGFyYW1zLmRtYV9jaG5sX251bSA9IEZINDlfVENTUl9DSE5MX05VTTsKKwlpbC0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQorCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCisJICAgIHNpemVvZihzdHJ1Y3QgaWw0OTY1X3NjZF9iY190YmwpOworCWlsLT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGlsX3RmZCk7CisJaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJTDQ5NjVfU1RBVElPTl9DT1VOVDsKKwlpbC0+Y3R4LmJjYXN0X3N0YV9pZCA9IElMNDk2NV9CUk9BRENBU1RfSUQ7CisJaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSUw0OV9SVENfREFUQV9TSVpFOworCWlsLT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElMNDlfUlRDX0lOU1RfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSA9IEJTTV9TUkFNX1NJWkU7CisJaWwtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgPSBCSVQoSUVFRTgwMjExX0JBTkRfNUdIWik7CisKKwlpbC0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnID0gRkg0OV9SU0NTUl9DSE5MMF9XUFRSOworCisJaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtID0gaWw0OTY1X251bV9vZl9hbnQoaWwtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwlpbC0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBpbDQ5NjVfbnVtX29mX2FudChpbC0+Y2ZnLT52YWxpZF9yeF9hbnQpOworCWlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ID0gaWwtPmNmZy0+dmFsaWRfdHhfYW50OworCWlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50ID0gaWwtPmNmZy0+dmFsaWRfcnhfYW50OworCisJaWw0OTY1X3NldF9jdF90aHJlc2hvbGQoaWwpOworCisJaWwtPmh3X3BhcmFtcy5zZW5zID0gJmlsNDk2NV9zZW5zaXRpdml0eTsKKwlpbC0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSUw0OTY1X0VYVF9CRUFDT05fVElNRV9QT1M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMgoraWw0OTY1X21hdGhfZGl2X3JvdW5kKHMzMiBudW0sIHMzMiBkZW5vbSwgczMyICogcmVzKQoreworCXMzMiBzaWduID0gMTsKKworCWlmIChudW0gPCAwKSB7CisJCXNpZ24gPSAtc2lnbjsKKwkJbnVtID0gLW51bTsKKwl9CisJaWYgKGRlbm9tIDwgMCkgeworCQlzaWduID0gLXNpZ247CisJCWRlbm9tID0gLWRlbm9tOworCX0KKwkqcmVzID0gMTsKKwkqcmVzID0gKChudW0gKiAyICsgZGVub20pIC8gKGRlbm9tICogMikpICogc2lnbjsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIGlsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24gLSBQb3dlciBzdXBwbHkgdm9sdGFnZSBjb21wIGZvciB0eHBvd2VyCisgKgorICogRGV0ZXJtaW5lcyBwb3dlciBzdXBwbHkgdm9sdGFnZSBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgY2FsY3VsYXRpb25zLgorICogUmV0dXJucyBudW1iZXIgb2YgMS8yLWRCIHN0ZXBzIHRvIHN1YnRyYWN0IGZyb20gZ2FpbiB0YWJsZSBpZHgsCisgKiB0byBjb21wZW5zYXRlIGZvciBkaWZmZXJlbmNlIGJldHdlZW4gcG93ZXIgc3VwcGx5IHZvbHRhZ2UgZHVyaW5nCisgKiBmYWN0b3J5IG1lYXN1cmVtZW50cywgdnMuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UuCisgKgorICogVm9sdGFnZSBpbmRpY2F0aW9uIGlzIGhpZ2hlciBmb3IgbG93ZXIgdm9sdGFnZS4KKyAqIExvd2VyIHZvbHRhZ2UgcmVxdWlyZXMgbW9yZSBnYWluIChsb3dlciBnYWluIHRhYmxlIGlkeCkuCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24oczMyIGVlcHJvbV92b2x0YWdlLCBzMzIgY3VycmVudF92b2x0YWdlKQoreworCXMzMiBjb21wID0gMDsKKworCWlmIChUWF9QT1dFUl9JTF9JTExFR0FMX1ZPTFRBR0UgPT0gZWVwcm9tX3ZvbHRhZ2UgfHwKKwkgICAgVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFID09IGN1cnJlbnRfdm9sdGFnZSkKKwkJcmV0dXJuIDA7CisKKwlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoY3VycmVudF92b2x0YWdlIC0gZWVwcm9tX3ZvbHRhZ2UsCisJCQkgICAgICBUWF9QT1dFUl9JTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YsICZjb21wKTsKKworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiBlZXByb21fdm9sdGFnZSkKKwkJY29tcCAqPSAyOworCWlmICgoY29tcCA8IC0yKSB8fCAoY29tcCA+IDIpKQorCQljb21wID0gMDsKKworCXJldHVybiBjb21wOworfQorCitzdGF0aWMgczMyCitpbDQ5NjVfZ2V0X3R4X2F0dGVuX2dycCh1MTYgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjVfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1I1X0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzU7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjFfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IxX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzE7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjJfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IyX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzI7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjNfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IzX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzM7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjRfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1I0X0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzQ7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHUzMgoraWw0OTY1X2dldF9zdWJfYmFuZChjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBjaGFubmVsKQoreworCXMzMiBiID0gLTE7CisKKwlmb3IgKGIgPSAwOyBiIDwgRUVQUk9NX1RYX1BPV0VSX0JBTkRTOyBiKyspIHsKKwkJaWYgKGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGNoYW5uZWwgPj0gaWwtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tiXS5jaF9mcm9tICYmCisJCSAgICBjaGFubmVsIDw9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfdG8pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHMzMgoraWw0OTY1X2ludGVycG9sYXRlX3ZhbHVlKHMzMiB4LCBzMzIgeDEsIHMzMiB5MSwgczMyIHgyLCBzMzIgeTIpCit7CisJczMyIHZhbDsKKworCWlmICh4MiA9PSB4MSkKKwkJcmV0dXJuIHkxOworCWVsc2UgeworCQlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoKHgyIC0geCkgKiAoeTEgLSB5MiksICh4MiAtIHgxKSwgJnZhbCk7CisJCXJldHVybiB2YWwgKyB5MjsKKwl9Cit9CisKKy8qKgorICogaWw0OTY1X2ludGVycG9sYXRlX2NoYW4gLSBJbnRlcnBvbGF0ZSBmYWN0b3J5IG1lYXN1cmVtZW50cyBmb3Igb25lIGNoYW5uZWwKKyAqCisgKiBJbnRlcnBvbGF0ZXMgZmFjdG9yeSBtZWFzdXJlbWVudHMgZnJvbSB0aGUgdHdvIHNhbXBsZSBjaGFubmVscyB3aXRoaW4gYQorICogc3ViLWJhbmQsIHRvIGFwcGx5IHRvIGNoYW5uZWwgb2YgaW50ZXJlc3QuICBJbnRlcnBvbGF0aW9uIGlzIHByb3BvcnRpb25hbCB0bworICogZGlmZmVyZW5jZXMgaW4gY2hhbm5lbCBmcmVxdWVuY2llcywgd2hpY2ggaXMgcHJvcG9ydGlvbmFsIHRvIGRpZmZlcmVuY2VzCisgKiBpbiBjaGFubmVsIG51bWJlci4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2ludGVycG9sYXRlX2NoYW4oc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgY2hhbm5lbCwKKwkJCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyAqY2hhbl9pbmZvKQoreworCXMzMiBzID0gLTE7CisJdTMyIGM7CisJdTMyIG07CisJY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMTsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX21lYXN1cmUgKm0yOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfbWVhc3VyZSAqb21lYXM7CisJdTMyIGNoX2kxOworCXUzMiBjaF9pMjsKKworCXMgPSBpbDQ5NjVfZ2V0X3N1Yl9iYW5kKGlsLCBjaGFubmVsKTsKKwlpZiAocyA+PSBFRVBST01fVFhfUE9XRVJfQkFORFMpIHsKKwkJSUxfRVJSKCJUeCBQb3dlciBjYW4gbm90IGZpbmQgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwljaF9pMSA9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLmNoX251bTsKKwljaF9pMiA9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gyLmNoX251bTsKKwljaGFuX2luZm8tPmNoX251bSA9ICh1OCkgY2hhbm5lbDsKKworCURfVFhQT1dFUigiY2hhbm5lbCAlZCBzdWJiYW5kICVkIGZhY3RvcnkgY2FsIGNoICVkICYgJWRcbiIsIGNoYW5uZWwsIHMsCisJCSAgY2hfaTEsIGNoX2kyKTsKKworCWZvciAoYyA9IDA7IGMgPCBFRVBST01fVFhfUE9XRVJfVFhfQ0hBSU5TOyBjKyspIHsKKwkJZm9yIChtID0gMDsgbSA8IEVFUFJPTV9UWF9QT1dFUl9NRUFTVVJFTUVOVFM7IG0rKykgeworCQkJbTEgPSAmKGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLgorCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7CisJCQltMiA9ICYoaWwtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tzXS5jaDIuCisJCQkgICAgICAgbWVhc3VyZW1lbnRzW2NdW21dKTsKKwkJCW9tZWFzID0gJihjaGFuX2luZm8tPm1lYXN1cmVtZW50c1tjXVttXSk7CisKKwkJCW9tZWFzLT5hY3R1YWxfcG93ID0KKwkJCSAgICAodTgpIGlsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKKwkJCQkJCQkgIG0xLT5hY3R1YWxfcG93LCBjaF9pMiwKKwkJCQkJCQkgIG0yLT5hY3R1YWxfcG93KTsKKwkJCW9tZWFzLT5nYWluX2lkeCA9CisJCQkgICAgKHU4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+Z2Fpbl9pZHgsIGNoX2kyLAorCQkJCQkJCSAgbTItPmdhaW5faWR4KTsKKwkJCW9tZWFzLT50ZW1wZXJhdHVyZSA9CisJCQkgICAgKHU4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+dGVtcGVyYXR1cmUsCisJCQkJCQkJICBjaF9pMiwKKwkJCQkJCQkgIG0yLT50ZW1wZXJhdHVyZSk7CisJCQlvbWVhcy0+cGFfZGV0ID0KKwkJCSAgICAoczgpIGlsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKKwkJCQkJCQkgIG0xLT5wYV9kZXQsIGNoX2kyLAorCQkJCQkJCSAgbTItPnBhX2RldCk7CisKKwkJCURfVFhQT1dFUigiY2hhaW4gJWQgbWVhcyAlZCBBUDE9JWQgQVAyPSVkIEFQPSVkXG4iLCBjLAorCQkJCSAgbSwgbTEtPmFjdHVhbF9wb3csIG0yLT5hY3R1YWxfcG93LAorCQkJCSAgb21lYXMtPmFjdHVhbF9wb3cpOworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtZWFzICVkIE5JMT0lZCBOSTI9JWQgTkk9JWRcbiIsIGMsCisJCQkJICBtLCBtMS0+Z2Fpbl9pZHgsIG0yLT5nYWluX2lkeCwKKwkJCQkgIG9tZWFzLT5nYWluX2lkeCk7CisJCQlEX1RYUE9XRVIoImNoYWluICVkIG1lYXMgJWQgUEExPSVkIFBBMj0lZCBQQT0lZFxuIiwgYywKKwkJCQkgIG0sIG0xLT5wYV9kZXQsIG0yLT5wYV9kZXQsIG9tZWFzLT5wYV9kZXQpOworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtZWFzICVkICBUMT0lZCAgVDI9JWQgIFQ9JWRcbiIsIGMsCisJCQkJICBtLCBtMS0+dGVtcGVyYXR1cmUsIG0yLT50ZW1wZXJhdHVyZSwKKwkJCQkgIG9tZWFzLT50ZW1wZXJhdHVyZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYml0LXJhdGUtZGVwZW5kZW50IHRhYmxlIHRvIHByZXZlbnQgVHggZGlzdG9ydGlvbiwgaW4gaGFsZi1kQiB1bml0cywKKyAqIGZvciBPRkRNIDYsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXQsIGFuZCBDQ0sgYWxsIHJhdGVzLiAqLworc3RhdGljIHMzMiBiYWNrX29mZl90YWJsZVtdID0geworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDIwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDIwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDQwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDQwIE1IeiAqLworCTEwCQkJLyogQ0NLICovCit9OworCisvKiBUaGVybWFsIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHR4cG93ZXIgZm9yIHZhcmlvdXMgZnJlcXVlbmN5IHJhbmdlcyAuLi4KKyAqICAgcmF0aW9zIGZyb20gMzoxIHRvIDQuNToxIG9mIGRlZ3JlZXMgKENlbHNpdXMpIHBlciBoYWxmLWRCIGdhaW4gYWRqdXN0ICovCitzdGF0aWMgc3RydWN0IGlsNDk2NV90eHBvd2VyX2NvbXBfZW50cnkgeworCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2E7CisJczMyIGRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKK30gdHhfcG93ZXJfY21wX3RibGVbQ0FMSUJfQ0hfR1JPVVBfTUFYXSA9IHsKKwl7CisJOSwgMn0sCQkJLyogZ3JvdXAgMCA1LjIsIGNoICAzNC00MyAqLworCXsKKwk0LCAxfSwJCQkvKiBncm91cCAxIDUuMiwgY2ggIDQ0LTcwICovCisJeworCTQsIDF9LAkJCS8qIGdyb3VwIDIgNS4yLCBjaCAgNzEtMTI0ICovCisJeworCTQsIDF9LAkJCS8qIGdyb3VwIDMgNS4yLCBjaCAxMjUtMjAwICovCisJeworCTMsIDF9CQkJLyogZ3JvdXAgNCAyLjQsIGNoICAgYWxsICovCit9OworCitzdGF0aWMgczMyCitnZXRfbWluX3Bvd2VyX2lkeChzMzIgcmF0ZV9wb3dlcl9pZHgsIHUzMiBiYW5kKQoreworCWlmICghYmFuZCkgeworCQlpZiAoKHJhdGVfcG93ZXJfaWR4ICYgNykgPD0gNCkKKwkJCXJldHVybiBNSU5fVFhfR0FJTl9JRFhfNTJHSFpfRVhUOworCX0KKwlyZXR1cm4gTUlOX1RYX0dBSU5fSURYOworfQorCitzdHJ1Y3QgZ2Fpbl9lbnRyeSB7CisJdTggZHNwOworCXU4IHJhZGlvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYWluX2VudHJ5IGdhaW5fdGFibGVbMl1bMTA4XSA9IHsKKwkvKiA1LjJHSHogcG93ZXIgZ2FpbiBpZHggdGFibGUgKi8KKwl7CisJIHsxMjMsIDB4M0Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCisJIHsxMTcsIDB4M0Z9LAorCSB7MTEwLCAweDNGfSwKKwkgezEwNCwgMHgzRn0sCisJIHs5OCwgMHgzRn0sCisJIHsxMTAsIDB4M0V9LAorCSB7MTA0LCAweDNFfSwKKwkgezk4LCAweDNFfSwKKwkgezExMCwgMHgzRH0sCisJIHsxMDQsIDB4M0R9LAorCSB7OTgsIDB4M0R9LAorCSB7MTEwLCAweDNDfSwKKwkgezEwNCwgMHgzQ30sCisJIHs5OCwgMHgzQ30sCisJIHsxMTAsIDB4M0J9LAorCSB7MTA0LCAweDNCfSwKKwkgezk4LCAweDNCfSwKKwkgezExMCwgMHgzQX0sCisJIHsxMDQsIDB4M0F9LAorCSB7OTgsIDB4M0F9LAorCSB7MTEwLCAweDM5fSwKKwkgezEwNCwgMHgzOX0sCisJIHs5OCwgMHgzOX0sCisJIHsxMTAsIDB4Mzh9LAorCSB7MTA0LCAweDM4fSwKKwkgezk4LCAweDM4fSwKKwkgezExMCwgMHgzN30sCisJIHsxMDQsIDB4Mzd9LAorCSB7OTgsIDB4Mzd9LAorCSB7MTEwLCAweDM2fSwKKwkgezEwNCwgMHgzNn0sCisJIHs5OCwgMHgzNn0sCisJIHsxMTAsIDB4MzV9LAorCSB7MTA0LCAweDM1fSwKKwkgezk4LCAweDM1fSwKKwkgezExMCwgMHgzNH0sCisJIHsxMDQsIDB4MzR9LAorCSB7OTgsIDB4MzR9LAorCSB7MTEwLCAweDMzfSwKKwkgezEwNCwgMHgzM30sCisJIHs5OCwgMHgzM30sCisJIHsxMTAsIDB4MzJ9LAorCSB7MTA0LCAweDMyfSwKKwkgezk4LCAweDMyfSwKKwkgezExMCwgMHgzMX0sCisJIHsxMDQsIDB4MzF9LAorCSB7OTgsIDB4MzF9LAorCSB7MTEwLCAweDMwfSwKKwkgezEwNCwgMHgzMH0sCisJIHs5OCwgMHgzMH0sCisJIHsxMTAsIDB4MjV9LAorCSB7MTA0LCAweDI1fSwKKwkgezk4LCAweDI1fSwKKwkgezExMCwgMHgyNH0sCisJIHsxMDQsIDB4MjR9LAorCSB7OTgsIDB4MjR9LAorCSB7MTEwLCAweDIzfSwKKwkgezEwNCwgMHgyM30sCisJIHs5OCwgMHgyM30sCisJIHsxMTAsIDB4MjJ9LAorCSB7MTA0LCAweDE4fSwKKwkgezk4LCAweDE4fSwKKwkgezExMCwgMHgxN30sCisJIHsxMDQsIDB4MTd9LAorCSB7OTgsIDB4MTd9LAorCSB7MTEwLCAweDE2fSwKKwkgezEwNCwgMHgxNn0sCisJIHs5OCwgMHgxNn0sCisJIHsxMTAsIDB4MTV9LAorCSB7MTA0LCAweDE1fSwKKwkgezk4LCAweDE1fSwKKwkgezExMCwgMHgxNH0sCisJIHsxMDQsIDB4MTR9LAorCSB7OTgsIDB4MTR9LAorCSB7MTEwLCAweDEzfSwKKwkgezEwNCwgMHgxM30sCisJIHs5OCwgMHgxM30sCisJIHsxMTAsIDB4MTJ9LAorCSB7MTA0LCAweDA4fSwKKwkgezk4LCAweDA4fSwKKwkgezExMCwgMHgwN30sCisJIHsxMDQsIDB4MDd9LAorCSB7OTgsIDB4MDd9LAorCSB7MTEwLCAweDA2fSwKKwkgezEwNCwgMHgwNn0sCisJIHs5OCwgMHgwNn0sCisJIHsxMTAsIDB4MDV9LAorCSB7MTA0LCAweDA1fSwKKwkgezk4LCAweDA1fSwKKwkgezExMCwgMHgwNH0sCisJIHsxMDQsIDB4MDR9LAorCSB7OTgsIDB4MDR9LAorCSB7MTEwLCAweDAzfSwKKwkgezEwNCwgMHgwM30sCisJIHs5OCwgMHgwM30sCisJIHsxMTAsIDB4MDJ9LAorCSB7MTA0LCAweDAyfSwKKwkgezk4LCAweDAyfSwKKwkgezExMCwgMHgwMX0sCisJIHsxMDQsIDB4MDF9LAorCSB7OTgsIDB4MDF9LAorCSB7MTEwLCAweDAwfSwKKwkgezEwNCwgMHgwMH0sCisJIHs5OCwgMHgwMH0sCisJIHs5MywgMHgwMH0sCisJIHs4OCwgMHgwMH0sCisJIHs4MywgMHgwMH0sCisJIHs3OCwgMHgwMH0sCisJIH0sCisJLyogMi40R0h6IHBvd2VyIGdhaW4gaWR4IHRhYmxlICovCisJeworCSB7MTEwLCAweDNmfSwJCS8qIGhpZ2hlc3QgdHhwb3dlciAqLworCSB7MTA0LCAweDNmfSwKKwkgezk4LCAweDNmfSwKKwkgezExMCwgMHgzZX0sCisJIHsxMDQsIDB4M2V9LAorCSB7OTgsIDB4M2V9LAorCSB7MTEwLCAweDNkfSwKKwkgezEwNCwgMHgzZH0sCisJIHs5OCwgMHgzZH0sCisJIHsxMTAsIDB4M2N9LAorCSB7MTA0LCAweDNjfSwKKwkgezk4LCAweDNjfSwKKwkgezExMCwgMHgzYn0sCisJIHsxMDQsIDB4M2J9LAorCSB7OTgsIDB4M2J9LAorCSB7MTEwLCAweDNhfSwKKwkgezEwNCwgMHgzYX0sCisJIHs5OCwgMHgzYX0sCisJIHsxMTAsIDB4Mzl9LAorCSB7MTA0LCAweDM5fSwKKwkgezk4LCAweDM5fSwKKwkgezExMCwgMHgzOH0sCisJIHsxMDQsIDB4Mzh9LAorCSB7OTgsIDB4Mzh9LAorCSB7MTEwLCAweDM3fSwKKwkgezEwNCwgMHgzN30sCisJIHs5OCwgMHgzN30sCisJIHsxMTAsIDB4MzZ9LAorCSB7MTA0LCAweDM2fSwKKwkgezk4LCAweDM2fSwKKwkgezExMCwgMHgzNX0sCisJIHsxMDQsIDB4MzV9LAorCSB7OTgsIDB4MzV9LAorCSB7MTEwLCAweDM0fSwKKwkgezEwNCwgMHgzNH0sCisJIHs5OCwgMHgzNH0sCisJIHsxMTAsIDB4MzN9LAorCSB7MTA0LCAweDMzfSwKKwkgezk4LCAweDMzfSwKKwkgezExMCwgMHgzMn0sCisJIHsxMDQsIDB4MzJ9LAorCSB7OTgsIDB4MzJ9LAorCSB7MTEwLCAweDMxfSwKKwkgezEwNCwgMHgzMX0sCisJIHs5OCwgMHgzMX0sCisJIHsxMTAsIDB4MzB9LAorCSB7MTA0LCAweDMwfSwKKwkgezk4LCAweDMwfSwKKwkgezExMCwgMHg2fSwKKwkgezEwNCwgMHg2fSwKKwkgezk4LCAweDZ9LAorCSB7MTEwLCAweDV9LAorCSB7MTA0LCAweDV9LAorCSB7OTgsIDB4NX0sCisJIHsxMTAsIDB4NH0sCisJIHsxMDQsIDB4NH0sCisJIHs5OCwgMHg0fSwKKwkgezExMCwgMHgzfSwKKwkgezEwNCwgMHgzfSwKKwkgezk4LCAweDN9LAorCSB7MTEwLCAweDJ9LAorCSB7MTA0LCAweDJ9LAorCSB7OTgsIDB4Mn0sCisJIHsxMTAsIDB4MX0sCisJIHsxMDQsIDB4MX0sCisJIHs5OCwgMHgxfSwKKwkgezExMCwgMHgwfSwKKwkgezEwNCwgMHgwfSwKKwkgezk4LCAweDB9LAorCSB7OTcsIDB9LAorCSB7OTYsIDB9LAorCSB7OTUsIDB9LAorCSB7OTQsIDB9LAorCSB7OTMsIDB9LAorCSB7OTIsIDB9LAorCSB7OTEsIDB9LAorCSB7OTAsIDB9LAorCSB7ODksIDB9LAorCSB7ODgsIDB9LAorCSB7ODcsIDB9LAorCSB7ODYsIDB9LAorCSB7ODUsIDB9LAorCSB7ODQsIDB9LAorCSB7ODMsIDB9LAorCSB7ODIsIDB9LAorCSB7ODEsIDB9LAorCSB7ODAsIDB9LAorCSB7NzksIDB9LAorCSB7NzgsIDB9LAorCSB7NzcsIDB9LAorCSB7NzYsIDB9LAorCSB7NzUsIDB9LAorCSB7NzQsIDB9LAorCSB7NzMsIDB9LAorCSB7NzIsIDB9LAorCSB7NzEsIDB9LAorCSB7NzAsIDB9LAorCSB7NjksIDB9LAorCSB7NjgsIDB9LAorCSB7NjcsIDB9LAorCSB7NjYsIDB9LAorCSB7NjUsIDB9LAorCSB7NjQsIDB9LAorCSB7NjMsIDB9LAorCSB7NjIsIDB9LAorCSB7NjEsIDB9LAorCSB7NjAsIDB9LAorCSB7NTksIDB9LAorCSB9Cit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfZmlsbF90eHBvd2VyX3RibChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGJhbmQsIHUxNiBjaGFubmVsLCB1OCBpc19odDQwLAorCQkJdTggY3RybF9jaGFuX2hpZ2gsCisJCQlzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiICp0eF9wb3dlcl90YmwpCit7CisJdTggc2F0dXJhdGlvbl9wb3dlcjsKKwlzMzIgdGFyZ2V0X3Bvd2VyOworCXMzMiB1c2VyX3RhcmdldF9wb3dlcjsKKwlzMzIgcG93ZXJfbGltaXQ7CisJczMyIGN1cnJlbnRfdGVtcDsKKwlzMzIgcmVnX2xpbWl0OworCXMzMiBjdXJyZW50X3JlZ3VsYXRvcnk7CisJczMyIHR4YXR0ZW5fZ3JwID0gQ0FMSUJfQ0hfR1JPVVBfTUFYOworCWludCBpOworCWludCBjOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaF9lZXByb21faW5mbzsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX21lYXN1cmUgKm1lYXN1cmVtZW50OworCXMxNiB2b2x0YWdlOworCXMzMiBpbml0X3ZvbHRhZ2U7CisJczMyIHZvbHRhZ2VfY29tcGVuc2F0aW9uOworCXMzMiBkZWdyZWVzX3Blcl8wNWRiX251bTsKKwlzMzIgZGVncmVlc19wZXJfMDVkYl9kZW5vbTsKKwlzMzIgZmFjdG9yeV90ZW1wOworCXMzMiB0ZW1wZXJhdHVyZV9jb21wWzJdOworCXMzMiBmYWN0b3J5X2dhaW5faWR4WzJdOworCXMzMiBmYWN0b3J5X2FjdHVhbF9wd3JbMl07CisJczMyIHBvd2VyX2lkeDsKKworCS8qIHR4X3Bvd2VyX3VzZXJfbG10IGlzIGluIGRCbSwgY29udmVydCB0byBoYWxmLWRCbSAoaGFsZi1kQiB1bml0cworCSAqICAgYXJlIHVzZWQgZm9yIGlkeGluZyBpbnRvIHR4cG93ZXIgdGFibGUpICovCisJdXNlcl90YXJnZXRfcG93ZXIgPSAyICogaWwtPnR4X3Bvd2VyX3VzZXJfbG10OworCisJLyogR2V0IGN1cnJlbnQgKFJYT04pIGNoYW5uZWwsIGJhbmQsIHdpZHRoICovCisJRF9UWFBPV0VSKCJjaGFuICVkIGJhbmQgJWQgaXNfaHQ0MCAlZFxuIiwgY2hhbm5lbCwgYmFuZCwgaXNfaHQ0MCk7CisKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgaWwtPmJhbmQsIGNoYW5uZWwpOworCisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGdldCB0eGF0dGVuIGdyb3VwLCB1c2VkIHRvIHNlbGVjdCAxKSB0aGVybWFsIHR4cG93ZXIgYWRqdXN0bWVudAorCSAqICAgYW5kIDIpIG1pbW8gdHhwb3dlciBiYWxhbmNlIGJldHdlZW4gVHggY2hhaW5zLiAqLworCXR4YXR0ZW5fZ3JwID0gaWw0OTY1X2dldF90eF9hdHRlbl9ncnAoY2hhbm5lbCk7CisJaWYgKHR4YXR0ZW5fZ3JwIDwgMCkgeworCQlJTF9FUlIoIkNhbid0IGZpbmQgdHhhdHRlbiBncm91cCBmb3IgY2hhbm5lbCAlZC5cbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gdHhhdHRlbl9ncnA7CisJfQorCisJRF9UWFBPV0VSKCJjaGFubmVsICVkIGJlbG9uZ3MgdG8gdHhhdHRlbiBncm91cCAlZFxuIiwgY2hhbm5lbCwKKwkJICB0eGF0dGVuX2dycCk7CisKKwlpZiAoaXNfaHQ0MCkgeworCQlpZiAoY3RybF9jaGFuX2hpZ2gpCisJCQljaGFubmVsIC09IDI7CisJCWVsc2UKKwkJCWNoYW5uZWwgKz0gMjsKKwl9CisKKwkvKiBoYXJkd2FyZSB0eHBvd2VyIGxpbWl0cyAuLi4KKwkgKiBzYXR1cmF0aW9uIChjbGlwcGluZyBkaXN0b3J0aW9uKSB0eHBvd2VycyBhcmUgaW4gaGFsZi1kQm0gKi8KKwlpZiAoYmFuZCkKKwkJc2F0dXJhdGlvbl9wb3dlciA9IGlsLT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyMjQ7CisJZWxzZQorCQlzYXR1cmF0aW9uX3Bvd2VyID0gaWwtPmNhbGliX2luZm8tPnNhdHVyYXRpb25fcG93ZXI1MjsKKworCWlmIChzYXR1cmF0aW9uX3Bvd2VyIDwgSUxfVFhfUE9XRVJfU0FUVVJBVElPTl9NSU4gfHwKKwkgICAgc2F0dXJhdGlvbl9wb3dlciA+IElMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYKSB7CisJCWlmIChiYW5kKQorCQkJc2F0dXJhdGlvbl9wb3dlciA9IElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl8yNDsKKwkJZWxzZQorCQkJc2F0dXJhdGlvbl9wb3dlciA9IElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl81MjsKKwl9CisKKwkvKiByZWd1bGF0b3J5IHR4cG93ZXIgbGltaXRzIC4uLiByZWdfbGltaXQgdmFsdWVzIGFyZSBpbiBoYWxmLWRCbSwKKwkgKiAgIG1heF9wb3dlcl9hdmcgdmFsdWVzIGFyZSBpbiBkQm0sIGNvbnZlcnQgKiAyICovCisJaWYgKGlzX2h0NDApCisJCXJlZ19saW1pdCA9IGNoX2luZm8tPmh0NDBfbWF4X3Bvd2VyX2F2ZyAqIDI7CisJZWxzZQorCQlyZWdfbGltaXQgPSBjaF9pbmZvLT5tYXhfcG93ZXJfYXZnICogMjsKKworCWlmICgocmVnX2xpbWl0IDwgSUxfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4pIHx8CisJICAgIChyZWdfbGltaXQgPiBJTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01BWCkpIHsKKwkJaWYgKGJhbmQpCisJCQlyZWdfbGltaXQgPSBJTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQ7CisJCWVsc2UKKwkJCXJlZ19saW1pdCA9IElMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MjsKKwl9CisKKwkvKiBJbnRlcnBvbGF0ZSB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdGhpcyBjaGFubmVsLAorCSAqICAgYmFzZWQgb24gZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZXN0cyBvbiBzcGFjZWQgY2hhbm5lbHMuICovCisJaWw0OTY1X2ludGVycG9sYXRlX2NoYW4oaWwsIGNoYW5uZWwsICZjaF9lZXByb21faW5mbyk7CisKKwkvKiBjYWxjdWxhdGUgdHggZ2FpbiBhZGp1c3RtZW50IGJhc2VkIG9uIHBvd2VyIHN1cHBseSB2b2x0YWdlICovCisJdm9sdGFnZSA9IGxlMTZfdG9fY3B1KGlsLT5jYWxpYl9pbmZvLT52b2x0YWdlKTsKKwlpbml0X3ZvbHRhZ2UgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnZvbHRhZ2UpOworCXZvbHRhZ2VfY29tcGVuc2F0aW9uID0KKwkgICAgaWw0OTY1X2dldF92b2x0YWdlX2NvbXBlbnNhdGlvbih2b2x0YWdlLCBpbml0X3ZvbHRhZ2UpOworCisJRF9UWFBPV0VSKCJjdXJyIHZvbHQgJWQgZWVwcm9tIHZvbHQgJWQgdm9sdCBjb21wICVkXG4iLCBpbml0X3ZvbHRhZ2UsCisJCSAgdm9sdGFnZSwgdm9sdGFnZV9jb21wZW5zYXRpb24pOworCisJLyogZ2V0IGN1cnJlbnQgdGVtcGVyYXR1cmUgKENlbHNpdXMpICovCisJY3VycmVudF90ZW1wID0gbWF4KGlsLT50ZW1wZXJhdHVyZSwgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOKTsKKwljdXJyZW50X3RlbXAgPSBtaW4oaWwtPnRlbXBlcmF0dXJlLCBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NQVgpOworCWN1cnJlbnRfdGVtcCA9IEtFTFZJTl9UT19DRUxTSVVTKGN1cnJlbnRfdGVtcCk7CisKKwkvKiBzZWxlY3QgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQgcGFyYW1zLCBiYXNlZCBvbiBjaGFubmVsIGdyb3VwCisJICogICAoc2FtZSBmcmVxdWVuY3kgZ3JvdXAgdXNlZCBmb3IgbWltbyB0eGF0dGVuIGFkanVzdG1lbnQpICovCisJZGVncmVlc19wZXJfMDVkYl9udW0gPQorCSAgICB0eF9wb3dlcl9jbXBfdGJsZVt0eGF0dGVuX2dycF0uZGVncmVlc19wZXJfMDVkYl9hOworCWRlZ3JlZXNfcGVyXzA1ZGJfZGVub20gPQorCSAgICB0eF9wb3dlcl9jbXBfdGJsZVt0eGF0dGVuX2dycF0uZGVncmVlc19wZXJfMDVkYl9hX2Rlbm9tOworCisJLyogZ2V0IHBlci1jaGFpbiB0eHBvd2VyIHZhbHVlcyBmcm9tIGZhY3RvcnkgbWVhc3VyZW1lbnRzICovCisJZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworCQltZWFzdXJlbWVudCA9ICZjaF9lZXByb21faW5mby5tZWFzdXJlbWVudHNbY11bMV07CisKKwkJLyogdHhnYWluIGFkanVzdG1lbnQgKGluIGhhbGYtZEIgc3RlcHMpIGJhc2VkIG9uIGRpZmZlcmVuY2UKKwkJICogICBiZXR3ZWVuIGZhY3RvcnkgYW5kIGN1cnJlbnQgdGVtcGVyYXR1cmUgKi8KKwkJZmFjdG9yeV90ZW1wID0gbWVhc3VyZW1lbnQtPnRlbXBlcmF0dXJlOworCQlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoKGN1cnJlbnRfdGVtcCAtCisJCQkJICAgICAgIGZhY3RvcnlfdGVtcCkgKiBkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tLAorCQkJCSAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfbnVtLAorCQkJCSAgICAgICZ0ZW1wZXJhdHVyZV9jb21wW2NdKTsKKworCQlmYWN0b3J5X2dhaW5faWR4W2NdID0gbWVhc3VyZW1lbnQtPmdhaW5faWR4OworCQlmYWN0b3J5X2FjdHVhbF9wd3JbY10gPSBtZWFzdXJlbWVudC0+YWN0dWFsX3BvdzsKKworCQlEX1RYUE9XRVIoImNoYWluID0gJWRcbiIsIGMpOworCQlEX1RYUE9XRVIoImZjdHJ5IHRtcCAlZCwgIiAiY3VyciB0bXAgJWQsIGNvbXAgJWQgc3RlcHNcbiIsCisJCQkgIGZhY3RvcnlfdGVtcCwgY3VycmVudF90ZW1wLCB0ZW1wZXJhdHVyZV9jb21wW2NdKTsKKworCQlEX1RYUE9XRVIoImZjdHJ5IGlkeCAlZCwgZmN0cnkgcHdyICVkXG4iLCBmYWN0b3J5X2dhaW5faWR4W2NdLAorCQkJICBmYWN0b3J5X2FjdHVhbF9wd3JbY10pOworCX0KKworCS8qIGZvciBlYWNoIG9mIDMzIGJpdC1yYXRlcyAoaW5jbHVkaW5nIDEgZm9yIENDSykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9XRVJfVEJMX05VTV9FTlRSSUVTOyBpKyspIHsKKwkJdTggaXNfbWltb19yYXRlOworCQl1bmlvbiBpbDQ5NjVfdHhfcG93ZXJfZHVhbF9zdHJlYW0gdHhfcG93ZXI7CisKKwkJLyogZm9yIG1pbW8sIHJlZHVjZSBlYWNoIGNoYWluJ3MgdHhwb3dlciBieSBoYWxmCisJCSAqICgzZEIsIDYgc3RlcHMpLCBzbyB0b3RhbCBvdXRwdXQgcG93ZXIgaXMgcmVndWxhdG9yeQorCQkgKiBjb21wbGlhbnQuICovCisJCWlmIChpICYgMHg4KSB7CisJCQljdXJyZW50X3JlZ3VsYXRvcnkgPQorCQkJICAgIHJlZ19saW1pdCAtCisJCQkgICAgSUxfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTjsKKwkJCWlzX21pbW9fcmF0ZSA9IDE7CisJCX0gZWxzZSB7CisJCQljdXJyZW50X3JlZ3VsYXRvcnkgPSByZWdfbGltaXQ7CisJCQlpc19taW1vX3JhdGUgPSAwOworCQl9CisKKwkJLyogZmluZCB0eHBvd2VyIGxpbWl0LCBlaXRoZXIgaGFyZHdhcmUgb3IgcmVndWxhdG9yeSAqLworCQlwb3dlcl9saW1pdCA9IHNhdHVyYXRpb25fcG93ZXIgLSBiYWNrX29mZl90YWJsZVtpXTsKKwkJaWYgKHBvd2VyX2xpbWl0ID4gY3VycmVudF9yZWd1bGF0b3J5KQorCQkJcG93ZXJfbGltaXQgPSBjdXJyZW50X3JlZ3VsYXRvcnk7CisKKwkJLyogcmVkdWNlIHVzZXIncyB0eHBvd2VyIHJlcXVlc3QgaWYgbmVjZXNzYXJ5CisJCSAqIGZvciB0aGlzIHJhdGUgb24gdGhpcyBjaGFubmVsICovCisJCXRhcmdldF9wb3dlciA9IHVzZXJfdGFyZ2V0X3Bvd2VyOworCQlpZiAodGFyZ2V0X3Bvd2VyID4gcG93ZXJfbGltaXQpCisJCQl0YXJnZXRfcG93ZXIgPSBwb3dlcl9saW1pdDsKKworCQlEX1RYUE9XRVIoInJhdGUgJWQgc2F0ICVkIHJlZyAlZCB1c3IgJWQgdGd0ICVkXG4iLCBpLAorCQkJICBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV0sCisJCQkgIGN1cnJlbnRfcmVndWxhdG9yeSwgdXNlcl90YXJnZXRfcG93ZXIsIHRhcmdldF9wb3dlcik7CisKKwkJLyogZm9yIGVhY2ggb2YgMiBUeCBjaGFpbnMgKHJhZGlvIHRyYW5zbWl0dGVycykgKi8KKwkJZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworCQkJczMyIGF0dGVuX3ZhbHVlOworCisJCQlpZiAoaXNfbWltb19yYXRlKQorCQkJCWF0dGVuX3ZhbHVlID0KKwkJCQkgICAgKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC4KKwkJCQkJCSAgICAgIHR4X2F0dGVuW3R4YXR0ZW5fZ3JwXVtjXSk7CisJCQllbHNlCisJCQkJYXR0ZW5fdmFsdWUgPSAwOworCisJCQkvKiBjYWxjdWxhdGUgaWR4OyBoaWdoZXIgaWR4IG1lYW5zIGxvd2VyIHR4cG93ZXIgKi8KKwkJCXBvd2VyX2lkeCA9CisJCQkgICAgKHU4KSAoZmFjdG9yeV9nYWluX2lkeFtjXSAtCisJCQkJICAodGFyZ2V0X3Bvd2VyIC0gZmFjdG9yeV9hY3R1YWxfcHdyW2NdKSAtCisJCQkJICB0ZW1wZXJhdHVyZV9jb21wW2NdIC0gdm9sdGFnZV9jb21wZW5zYXRpb24gKworCQkJCSAgYXR0ZW5fdmFsdWUpOworCisvKgkJCURfVFhQT1dFUigiY2FsY3VsYXRlZCB0eHBvd2VyIGlkeCAlZFxuIiwKKwkJCQkJCXBvd2VyX2lkeCk7ICovCisKKwkJCWlmIChwb3dlcl9pZHggPCBnZXRfbWluX3Bvd2VyX2lkeChpLCBiYW5kKSkKKwkJCQlwb3dlcl9pZHggPSBnZXRfbWluX3Bvd2VyX2lkeChpLCBiYW5kKTsKKworCQkJLyogYWRqdXN0IDUgR0h6IGlkeCB0byBzdXBwb3J0IG5lZ2F0aXZlIGlkeGVzICovCisJCQlpZiAoIWJhbmQpCisJCQkJcG93ZXJfaWR4ICs9IDk7CisKKwkJCS8qIENDSywgcmF0ZSAzMiwgcmVkdWNlIHR4cG93ZXIgZm9yIENDSyAqLworCQkJaWYgKGkgPT0gUE9XRVJfVEJMX0NDS19FTlRSWSkKKwkJCQlwb3dlcl9pZHggKz0KKwkJCQkgICAgSUxfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVA7CisKKwkJCS8qIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEgKi8KKwkJCWlmIChwb3dlcl9pZHggPiAxMDcpIHsKKwkJCQlJTF9XQVJOKCJ0eHBvd2VyIGlkeCAlZCA+IDEwN1xuIiwgcG93ZXJfaWR4KTsKKwkJCQlwb3dlcl9pZHggPSAxMDc7CisJCQl9CisJCQlpZiAocG93ZXJfaWR4IDwgMCkgeworCQkJCUlMX1dBUk4oInR4cG93ZXIgaWR4ICVkIDwgMFxuIiwgcG93ZXJfaWR4KTsKKwkJCQlwb3dlcl9pZHggPSAwOworCQkJfQorCisJCQkvKiBmaWxsIHR4cG93ZXIgY29tbWFuZCBmb3IgdGhpcyByYXRlL2NoYWluICovCisJCQl0eF9wb3dlci5zLnJhZGlvX3R4X2dhaW5bY10gPQorCQkJICAgIGdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaWR4XS5yYWRpbzsKKwkJCXR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSA9CisJCQkgICAgZ2Fpbl90YWJsZVtiYW5kXVtwb3dlcl9pZHhdLmRzcDsKKworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtaW1vICVkIGlkeCAlZCAiCisJCQkJICAiZ2FpbiAweCUwMnggZHNwICVkXG4iLCBjLCBhdHRlbl92YWx1ZSwKKwkJCQkgIHBvd2VyX2lkeCwgdHhfcG93ZXIucy5yYWRpb190eF9nYWluW2NdLAorCQkJCSAgdHhfcG93ZXIucy5kc3BfcHJlZGlzX2F0dGVuW2NdKTsKKwkJfQkJLyogZm9yIGVhY2ggY2hhaW4gKi8KKworCQl0eF9wb3dlcl90YmwtPnBvd2VyX3RibFtpXS5kdyA9IGNwdV90b19sZTMyKHR4X3Bvd2VyLmR3KTsKKworCX0JCQkvKiBmb3IgZWFjaCByYXRlICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfc2VuZF90eF9wb3dlciAtIENvbmZpZ3VyZSB0aGUgVFhQT1dFUiBsZXZlbCB1c2VyIGxpbWl0CisgKgorICogVXNlcyB0aGUgYWN0aXZlIFJYT04gZm9yIGNoYW5uZWwsIGJhbmQsIGFuZCBjaGFyYWN0ZXJpc3RpY3MgKGh0NDAsIGhpZ2gpCisgKiBUaGUgcG93ZXIgbGltaXQgaXMgdGFrZW4gZnJvbSBpbC0+dHhfcG93ZXJfdXNlcl9sbXQuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5kX3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWw0OTY1X3R4cG93ZXJ0YWJsZV9jbWQgY21kID0geyAwIH07CisJaW50IHJldDsKKwl1OCBiYW5kID0gMDsKKwlib29sIGlzX2h0NDAgPSBmYWxzZTsKKwl1OCBjdHJsX2NoYW5faGlnaCA9IDA7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoV0FSTl9PTkNFCisJICAgICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSwKKwkgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwliYW5kID0gaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCWlzX2h0NDAgPSBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKGN0eC0+YWN0aXZlLmZsYWdzKTsKKworCWlmIChpc19odDQwICYmIChjdHgtPmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKSkKKwkJY3RybF9jaGFuX2hpZ2ggPSAxOworCisJY21kLmJhbmQgPSBiYW5kOworCWNtZC5jaGFubmVsID0gY3R4LT5hY3RpdmUuY2hhbm5lbDsKKworCXJldCA9CisJICAgIGlsNDk2NV9maWxsX3R4cG93ZXJfdGJsKGlsLCBiYW5kLCBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKKwkJCQkgICAgaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1RYX1BXUl9UQkwsIHNpemVvZihjbWQpLCAmY21kKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlsNDk2NV9yeG9uX2Fzc29jX2NtZCByeG9uX2Fzc29jOworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbjEgPSAmY3R4LT5zdGFnaW5nOworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbjIgPSAmY3R4LT5hY3RpdmU7CisKKwlpZiAocnhvbjEtPmZsYWdzID09IHJ4b24yLT5mbGFncyAmJgorCSAgICByeG9uMS0+ZmlsdGVyX2ZsYWdzID09IHJ4b24yLT5maWx0ZXJfZmxhZ3MgJiYKKwkgICAgcnhvbjEtPmNja19iYXNpY19yYXRlcyA9PSByeG9uMi0+Y2NrX2Jhc2ljX3JhdGVzICYmCisJICAgIHJ4b24xLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KKwkgICAgcnhvbjItPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9PQorCSAgICByeG9uMi0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+cnhfY2hhaW4gPT0gcnhvbjItPnJ4X2NoYWluICYmCisJICAgIHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSB7CisJCURfSU5GTygiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOworCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKKwlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7CisJcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7CisJcnhvbl9hc3NvYy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPQorCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2Mub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9CisJICAgIGN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MucnhfY2hhaW5fc2VsZWN0X2ZsYWdzID0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluOworCisJcmV0ID0KKwkgICAgaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBDX1JYT05fQVNTT0MsIHNpemVvZihyeG9uX2Fzc29jKSwKKwkJCQkgICZyeG9uX2Fzc29jLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9jb21taXRfcnhvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwkvKiBjYXN0IGF3YXkgdGhlIGNvbnN0IGZvciBhY3RpdmVfcnhvbiBpbiB0aGlzIGZ1bmN0aW9uICovCisJc3RydWN0IGlsX3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCWludCByZXQ7CisJYm9vbCBuZXdfYXNzb2MgPSAhIShjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFjdHgtPmlzX2FjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCisJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKKworCXJldCA9IGlsX2NoZWNrX3J4b25fY21kKGlsLCBjdHgpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIFJYT04gY29uZmlndXJhdGlvbi4gIE5vdCBjb21taXR0aW5nLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CisJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKKwkgKi8KKwlpZiAodGVzdF9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgJiYKKwkgICAgaWwtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSB7CisJCURfMTFIKCJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKKwkJICAgICAgbGUxNl90b19jcHUoaWwtPnN3aXRjaF9jaGFubmVsKSk7CisJCWlsX2Noc3dpdGNoX2RvbmUoaWwsIGZhbHNlKTsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKKwkgKiBpbF9yeG9uX2Fzc29jX2NtZCB3aGljaCBpcyB1c2VkIHRvIHJlY29uZmlndXJlIGZpbHRlcgorCSAqIGFuZCBvdGhlciBmbGFncyBmb3IgdGhlIGN1cnJlbnQgcmFkaW8gY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIWlsX2Z1bGxfcnhvbl9yZXF1aXJlZChpbCwgY3R4KSkgeworCQlyZXQgPSBpbF9zZW5kX3J4b25fYXNzb2MoaWwsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBSWE9OX0FTU09DICglZClcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7CisJCWlsX3ByaW50X3J4X2NvbmZpZ19jbWQoaWwsIGN0eCk7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBjb21taXQgdHggcG93ZXIgc2V0dGluZ3Mgd2hpbGUgY2hhbm5lbCBjaGFuZ2luZywKKwkJICogZG8gaXQgbm93IGlmIHR4IHBvd2VyIGNoYW5nZWQuCisJCSAqLworCQlpbF9zZXRfdHhfcG93ZXIoaWwsIGlsLT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKKwkgKiBhbiBSWE9OX0FTU09DIGFuZCB0aGUgbmV3IGNvbmZpZyB3YW50cyB0aGUgYXNzb2NpYXRlZCBtYXNrIGVuYWJsZWQsCisJICogd2UgbXVzdCBjbGVhciB0aGUgYXNzb2NpYXRlZCBmcm9tIHRoZSBhY3RpdmUgY29uZmlndXJhdGlvbgorCSAqIGJlZm9yZSB3ZSBhcHBseSB0aGUgbmV3IGNvbmZpZyAqLworCWlmIChpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpICYmIG5ld19hc3NvYykgeworCQlEX0lORk8oIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7CisJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKworCQlyZXQgPQorCQkgICAgaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fY21kLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlsX3J4b25fY21kKSwgYWN0aXZlX3J4b24pOworCisJCS8qIElmIHRoZSBtYXNrIGNsZWFyaW5nIGZhaWxlZCB0aGVuIHdlIHNldAorCQkgKiBhY3RpdmVfcnhvbiBiYWNrIHRvIHdoYXQgaXQgd2FzIHByZXZpb3VzbHkgKi8KKwkJaWYgKHJldCkgeworCQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCQlJTF9FUlIoIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhpbCwgY3R4KTsKKwkJaWxfcmVzdG9yZV9zdGF0aW9ucyhpbCwgY3R4KTsKKwkJcmV0ID0gaWw0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhpbCwgY3R4KTsKKwkJaWYgKHJldCkgeworCQkJSUxfRVJSKCJGYWlsZWQgdG8gcmVzdG9yZSBXRVAga2V5cyAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCURfSU5GTygiU2VuZGluZyBSWE9OXG4iICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKKwkgICAgICAgIiogY2hhbm5lbCA9ICVkXG4iICIqIGJzc2lkID0gJXBNXG4iLCAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCisJICAgICAgIGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSwgY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIpOworCisJaWxfc2V0X3J4b25faHdjcnlwdG8oaWwsIGN0eCwgIWlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byk7CisKKwkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKwkgKiBSWE9OIHVuYXNzb2MgY2xlYXJzIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlIHNvIHJlc3RvcmF0aW9uIG9mCisJICogc3RhdGlvbnMgaXMgbmVlZGVkIGFmdGVyIGl0ICh0aGUgUlhPTiBjb21tYW5kKSBjb21wbGV0ZXMKKwkgKi8KKwlpZiAoIW5ld19hc3NvYykgeworCQlyZXQgPQorCQkgICAgaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fY21kLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlsX3J4b25fY21kKSwgJmN0eC0+c3RhZ2luZyk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBuZXcgUlhPTiAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEX0lORk8oIlJldHVybiBmcm9tICFuZXdfYXNzb2MgUlhPTi5cbiIpOworCQltZW1jcHkoYWN0aXZlX3J4b24sICZjdHgtPnN0YWdpbmcsIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCWlsX3Jlc3RvcmVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCXJldCA9IGlsNDk2NV9yZXN0b3JlX2RlZmF1bHRfd2VwX2tleXMoaWwsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRmFpbGVkIHRvIHJlc3RvcmUgV0VQIGtleXMgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKG5ld19hc3NvYykgeworCQlpbC0+c3RhcnRfY2FsaWIgPSAwOworCQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKwkJICogUlhPTiBhc3NvYyBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAorCQkgKi8KKwkJcmV0ID0KKwkJICAgIGlsX3NlbmRfY21kX3BkdShpbCwgY3R4LT5yeG9uX2NtZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkVycm9yIHNldHRpbmcgbmV3IFJYT04gKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7CisJfQorCWlsX3ByaW50X3J4X2NvbmZpZ19jbWQoaWwsIGN0eCk7CisKKwlpbDQ5NjVfaW5pdF9zZW5zaXRpdml0eShpbCk7CisKKwkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAorCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLworCXJldCA9IGlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIHRydWUpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJFcnJvciBzZW5kaW5nIFRYIHBvd2VyICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCByYzsKKwl1OCBiYW5kID0gMDsKKwlib29sIGlzX2h0NDAgPSBmYWxzZTsKKwl1OCBjdHJsX2NoYW5faGlnaCA9IDA7CisJc3RydWN0IGlsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgY21kOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOworCXUxNiBjaDsKKwl1MzIgdHNmX2xvdzsKKwl1OCBzd2l0Y2hfY291bnQ7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWJhbmQgPSBpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOworCisJaXNfaHQ0MCA9IGl3NDk2NV9pc19odDQwX2NoYW5uZWwoY3R4LT5zdGFnaW5nLmZsYWdzKTsKKworCWlmIChpc19odDQwICYmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSykpCisJCWN0cmxfY2hhbl9oaWdoID0gMTsKKworCWNtZC5iYW5kID0gYmFuZDsKKwljbWQuZXhwZWN0X2JlYWNvbiA9IDA7CisJY2ggPSBjaF9zd2l0Y2gtPmNoYW5uZWwtPmh3X3ZhbHVlOworCWNtZC5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOworCWNtZC5yeG9uX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOworCWNtZC5yeG9uX2ZpbHRlcl9mbGFncyA9IGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3M7CisJc3dpdGNoX2NvdW50ID0gY2hfc3dpdGNoLT5jb3VudDsKKwl0c2ZfbG93ID0gY2hfc3dpdGNoLT50aW1lc3RhbXAgJiAweDBmZmZmZmZmZjsKKwkvKgorCSAqIGNhbGN1bGF0ZSB0aGUgdWNvZGUgY2hhbm5lbCBzd2l0Y2ggdGltZQorCSAqIGFkZGluZyBUU0YgYXMgb25lIG9mIHRoZSBmYWN0b3IgZm9yIHdoZW4gdG8gc3dpdGNoCisJICovCisJaWYgKGlsLT51Y29kZV9iZWFjb25fdGltZSA+IHRzZl9sb3cgJiYgYmVhY29uX2ludGVydmFsKSB7CisJCWlmIChzd2l0Y2hfY291bnQgPgorCQkgICAgKChpbC0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbCkpIHsKKwkJCXN3aXRjaF9jb3VudCAtPQorCQkJICAgIChpbC0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbDsKKwkJfSBlbHNlCisJCQlzd2l0Y2hfY291bnQgPSAwOworCX0KKwlpZiAoc3dpdGNoX2NvdW50IDw9IDEpCisJCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKGlsLT51Y29kZV9iZWFjb25fdGltZSk7CisJZWxzZSB7CisJCXN3aXRjaF90aW1lX2luX3VzZWMgPQorCQkgICAgdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOworCQl1Y29kZV9zd2l0Y2hfdGltZSA9CisJCSAgICBpbF91c2Vjc190b19iZWFjb25zKGlsLCBzd2l0Y2hfdGltZV9pbl91c2VjLAorCQkJCQliZWFjb25faW50ZXJ2YWwpOworCQljbWQuc3dpdGNoX3RpbWUgPQorCQkgICAgaWxfYWRkX2JlYWNvbl90aW1lKGlsLCBpbC0+dWNvZGVfYmVhY29uX3RpbWUsCisJCQkJICAgICAgIHVjb2RlX3N3aXRjaF90aW1lLCBiZWFjb25faW50ZXJ2YWwpOworCX0KKwlEXzExSCgidUNvZGUgdGltZSBmb3IgdGhlIHN3aXRjaCBpcyAweCV4XG4iLCBjbWQuc3dpdGNoX3RpbWUpOworCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBpbC0+YmFuZCwgY2gpOworCWlmIChjaF9pbmZvKQorCQljbWQuZXhwZWN0X2JlYWNvbiA9IGlsX2lzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7CisJZWxzZSB7CisJCUlMX0VSUigiaW52YWxpZCBjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAorCQkgICAgICAgY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlsNDk2NV9maWxsX3R4cG93ZXJfdGJsKGlsLCBiYW5kLCBjaCwgaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsCisJCQkJICAgICAmY21kLnR4X3Bvd2VyKTsKKwlpZiAocmMpIHsKKwkJRF8xMUgoImVycm9yOiVkICBmaWxsIHR4cG93ZXJfdGJsXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX0NIQU5ORUxfU1dJVENILCBzaXplb2YoY21kKSwgJmNtZCk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJICAgICAgIHUxNiBieXRlX2NudCkKK3sKKwlzdHJ1Y3QgaWw0OTY1X3NjZF9iY190YmwgKnNjZF9iY190YmwgPSBpbC0+c2NkX2JjX3RibHMuYWRkcjsKKwlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCWludCB3cml0ZV9wdHIgPSB0eHEtPnEud3JpdGVfcHRyOworCWludCBsZW4gPSBieXRlX2NudCArIElMX1RYX0NSQ19TSVpFICsgSUxfVFhfREVMSU1JVEVSX1NJWkU7CisJX19sZTE2IGJjX2VudDsKKworCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7CisKKwliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gJiAweEZGRik7CisJLyogU2V0IHVwIGJ5dGUgY291bnQgd2l0aGluIGZpcnN0IDI1NiBlbnRyaWVzICovCisJc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbd3JpdGVfcHRyXSA9IGJjX2VudDsKKworCS8qIElmIHdpdGhpbiBmaXJzdCA2NCBlbnRyaWVzLCBkdXBsaWNhdGUgYXQgZW5kICovCisJaWYgKHdyaXRlX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKKwkJc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbVEZEX1FVRVVFX1NJWkVfTUFYICsgd3JpdGVfcHRyXSA9CisJCSAgICBiY19lbnQ7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZSAtIHJldHVybiB0aGUgY2FsaWJyYXRlZCB0ZW1wZXJhdHVyZSAoaW4gS2VsdmluKQorICogQHN0YXRzOiBQcm92aWRlcyB0aGUgdGVtcGVyYXR1cmUgcmVhZGluZyBmcm9tIHRoZSB1Q29kZQorICoKKyAqIEEgcmV0dXJuIG9mIDwwIGluZGljYXRlcyBib2d1cyBkYXRhIGluIHRoZSBzdGF0cworICovCitzdGF0aWMgaW50CitpbDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzMzIgdGVtcGVyYXR1cmU7CisJczMyIHZ0OworCXMzMiBSMSwgUjIsIFIzOworCXUzMiBSNDsKKworCWlmICh0ZXN0X2JpdChTX1RFTVBFUkFUVVJFLCAmaWwtPnN0YXR1cykgJiYKKwkgICAgKGlsLT5fNDk2NS5zdGF0cy5mbGFnICYgU1RBVFNfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSB7CisJCURfVEVNUCgiUnVubmluZyBIVDQwIHRlbXBlcmF0dXJlIGNhbGlicmF0aW9uXG4iKTsKKwkJUjEgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IxWzFdKTsKKwkJUjIgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzFdKTsKKwkJUjMgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IzWzFdKTsKKwkJUjQgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzFdKTsKKwl9IGVsc2UgeworCQlEX1RFTVAoIlJ1bm5pbmcgdGVtcGVyYXR1cmUgY2FsaWJyYXRpb25cbiIpOworCQlSMSA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMF0pOworCQlSMiA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjJbMF0pOworCQlSMyA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjNbMF0pOworCQlSNCA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjRbMF0pOworCX0KKworCS8qCisJICogVGVtcGVyYXR1cmUgaXMgb25seSAyMyBiaXRzLCBzbyBzaWduIGV4dGVuZCBvdXQgdG8gMzIuCisJICoKKwkgKiBOT1RFIElmIHdlIGhhdmVuJ3QgcmVjZWl2ZWQgYSBzdGF0cyBub3RpZmljYXRpb24geWV0CisJICogd2l0aCBhbiB1cGRhdGVkIHRlbXBlcmF0dXJlLCB1c2UgUjQgcHJvdmlkZWQgdG8gdXMgaW4gdGhlCisJICogImluaXRpYWxpemUiIEFMSVZFIHJlc3BvbnNlLgorCSAqLworCWlmICghdGVzdF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpKQorCQl2dCA9IHNpZ25fZXh0ZW5kMzIoUjQsIDIzKTsKKwllbHNlCisJCXZ0ID0gc2lnbl9leHRlbmQzMihsZTMyX3RvX2NwdQorCQkJCSAgIChpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpLAorCQkJCSAgIDIzKTsKKworCURfVEVNUCgiQ2FsaWIgdmFsdWVzIFJbMS0zXTogJWQgJWQgJWQgUjQ6ICVkXG4iLCBSMSwgUjIsIFIzLCB2dCk7CisKKwlpZiAoUjMgPT0gUjEpIHsKKwkJSUxfRVJSKCJDYWxpYnJhdGlvbiBjb25mbGljdCBSMSA9PSBSM1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBLZWx2aW4sIGFkanVzdCBieSA5NyUuCisJICogQWRkIG9mZnNldCB0byBjZW50ZXIgdGhlIGFkanVzdG1lbnQgYXJvdW5kIDAgZGVncmVlcyBDZW50aWdyYWRlLiAqLworCXRlbXBlcmF0dXJlID0gVEVNUEVSQVRVUkVfQ0FMSUJfQV9WQUwgKiAodnQgLSBSMik7CisJdGVtcGVyYXR1cmUgLz0gKFIzIC0gUjEpOworCXRlbXBlcmF0dXJlID0KKwkgICAgKHRlbXBlcmF0dXJlICogOTcpIC8gMTAwICsgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVDsKKworCURfVEVNUCgiQ2FsaWJyYXRlZCB0ZW1wZXJhdHVyZTogJWRLLCAlZENcbiIsIHRlbXBlcmF0dXJlLAorCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ZW1wZXJhdHVyZSkpOworCisJcmV0dXJuIHRlbXBlcmF0dXJlOworfQorCisvKiBBZGp1c3QgVHhwb3dlciBvbmx5IGlmIHRlbXBlcmF0dXJlIHZhcmlhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuICovCisjZGVmaW5lIElMX1RFTVBFUkFUVVJFX1RIUkVTSE9MRCAgIDMKKworLyoqCisgKiBpbDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKKyAqCisgKiBJZiB0aGUgdGVtcGVyYXR1cmUgY2hhbmdlZCBoYXMgY2hhbmdlZCBzdWZmaWNpZW50bHksIHRoZW4gYSByZWNhbGlicmF0aW9uCisgKiBpcyBuZWVkZWQuCisgKgorICogQXNzdW1lcyBjYWxsZXIgd2lsbCByZXBsYWNlIGlsLT5sYXN0X3RlbXBlcmF0dXJlIG9uY2UgY2FsaWJyYXRpb24KKyAqIGV4ZWN1dGVkLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0ZW1wX2RpZmY7CisKKwlpZiAoIXRlc3RfYml0KFNfU1RBVFMsICZpbC0+c3RhdHVzKSkgeworCQlEX1RFTVAoIlRlbXBlcmF0dXJlIG5vdCB1cGRhdGVkIC0tIG5vIHN0YXRzLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXRlbXBfZGlmZiA9IGlsLT50ZW1wZXJhdHVyZSAtIGlsLT5sYXN0X3RlbXBlcmF0dXJlOworCisJLyogZ2V0IGFic29sdXRlIHZhbHVlICovCisJaWYgKHRlbXBfZGlmZiA8IDApIHsKKwkJRF9QT1dFUigiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOworCQl0ZW1wX2RpZmYgPSAtdGVtcF9kaWZmOworCX0gZWxzZSBpZiAodGVtcF9kaWZmID09IDApCisJCURfUE9XRVIoIlRlbXBlcmF0dXJlIHVuY2hhbmdlZFxuIik7CisJZWxzZQorCQlEX1BPV0VSKCJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWRcbiIsIHRlbXBfZGlmZik7CisKKwlpZiAodGVtcF9kaWZmIDwgSUxfVEVNUEVSQVRVUkVfVEhSRVNIT0xEKSB7CisJCURfUE9XRVIoIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbm90IG5lZWRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCURfUE9XRVIoIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbmVlZGVkXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3RlbXBlcmF0dXJlX2NhbGliKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzMzIgdGVtcDsKKworCXRlbXAgPSBpbDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwlpZiAoSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfT1VUX09GX1JBTkdFKHRlbXApKQorCQlyZXR1cm47CisKKwlpZiAoaWwtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKKwkJaWYgKGlsLT50ZW1wZXJhdHVyZSkKKwkJCURfVEVNUCgiVGVtcGVyYXR1cmUgY2hhbmdlZCAiICJmcm9tICVkQyB0byAlZENcbiIsCisJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVMoaWwtPnRlbXBlcmF0dXJlKSwKKwkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ZW1wKSk7CisJCWVsc2UKKwkJCURfVEVNUCgiVGVtcGVyYXR1cmUgIiAiaW5pdGlhbGl6ZWQgdG8gJWRDXG4iLAorCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHRlbXApKTsKKwl9CisKKwlpbC0+dGVtcGVyYXR1cmUgPSB0ZW1wOworCXNldF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpOworCisJaWYgKCFpbC0+ZGlzYWJsZV90eF9wb3dlcl9jYWwgJiYKKwkgICAgdW5saWtlbHkoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgJiYKKwkgICAgaWw0OTY1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKGlsKSkKKwkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnR4cG93ZXJfd29yayk7Cit9CisKK3N0YXRpYyB1MTYKK2lsNDk2NV9nZXRfaGNtZF9zaXplKHU4IGNtZF9pZCwgdTE2IGxlbikKK3sKKwlzd2l0Y2ggKGNtZF9pZCkgeworCWNhc2UgQ19SWE9OOgorCQlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfcnhvbl9jbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiBsZW47CisJfQorfQorCitzdGF0aWMgdTE2CitpbDQ5NjVfYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGlsX2FkZHN0YV9jbWQgKmNtZCwgdTggKiBkYXRhKQoreworCXN0cnVjdCBpbDQ5NjVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpbDQ5NjVfYWRkc3RhX2NtZCAqKWRhdGE7CisJYWRkc3RhLT5tb2RlID0gY21kLT5tb2RlOworCW1lbWNweSgmYWRkc3RhLT5zdGEsICZjbWQtPnN0YSwgc2l6ZW9mKHN0cnVjdCBzdGFfaWRfbW9kaWZ5KSk7CisJbWVtY3B5KCZhZGRzdGEtPmtleSwgJmNtZC0+a2V5LCBzaXplb2Yoc3RydWN0IGlsNDk2NV9rZXlpbmZvKSk7CisJYWRkc3RhLT5zdGF0aW9uX2ZsYWdzID0gY21kLT5zdGF0aW9uX2ZsYWdzOworCWFkZHN0YS0+c3RhdGlvbl9mbGFnc19tc2sgPSBjbWQtPnN0YXRpb25fZmxhZ3NfbXNrOworCWFkZHN0YS0+dGlkX2Rpc2FibGVfdHggPSBjbWQtPnRpZF9kaXNhYmxlX3R4OworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfc3NuOworCWFkZHN0YS0+c2xlZXBfdHhfY291bnQgPSBjbWQtPnNsZWVwX3R4X2NvdW50OworCWFkZHN0YS0+cmVzZXJ2ZWQxID0gY3B1X3RvX2xlMTYoMCk7CisJYWRkc3RhLT5yZXNlcnZlZDIgPSBjcHVfdG9fbGUxNigwKTsKKworCXJldHVybiAodTE2KSBzaXplb2Yoc3RydWN0IGlsNDk2NV9hZGRzdGFfY21kKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2lsNDk2NV9nZXRfc2NkX3NzbihzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgKnR4X3Jlc3ApCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1cCgmdHhfcmVzcC0+dS5zdGF0dXMgKyB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiBNQVhfU047Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHUzMiBzdGF0dXMpCit7CisJc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgVFhfU1RBVFVTX1NVQ0NFU1M6CisJY2FzZSBUWF9TVEFUVVNfRElSRUNUX0RPTkU6CisJCXJldHVybiBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJY2FzZSBUWF9TVEFUVVNfRkFJTF9ERVNUX1BTOgorCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2lsNDk2NV9pc190eF9zdWNjZXNzKHUzMiBzdGF0dXMpCit7CisJc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7CisJcmV0dXJuIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MgfHwgc3RhdHVzID09IFRYX1NUQVRVU19ESVJFQ1RfRE9ORSk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4X3N0YXR1c19yZXBseV90eCAtIEhhbmRsZSBUeCByZXNwb25zZSBmb3IgZnJhbWVzIGluIGFnZ3JlZ2F0aW9uIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfYWdnICphZ2csCisJCQkgIHN0cnVjdCBpbDQ5NjVfdHhfcmVzcCAqdHhfcmVzcCwgaW50IHR4cV9pZCwKKwkJCSAgdTE2IHN0YXJ0X2lkeCkKK3sKKwl1MTYgc3RhdHVzOworCXN0cnVjdCBhZ2dfdHhfc3RhdHVzICpmcmFtZV9zdGF0dXMgPSB0eF9yZXNwLT51LmFnZ19zdGF0dXM7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gTlVMTDsKKwl1MzIgcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKTsKKwlpbnQgaSwgc2gsIGlkeDsKKwl1MTYgc2VxOworCWlmIChhZ2ctPndhaXRfZm9yX2JhKQorCQlEX1RYX1JFUExZKCJnb3QgdHggcmVzcG9uc2Ugdy9vIGJsb2NrLWFja1xuIik7CisKKwlhZ2ctPmZyYW1lX2NvdW50ID0gdHhfcmVzcC0+ZnJhbWVfY291bnQ7CisJYWdnLT5zdGFydF9pZHggPSBzdGFydF9pZHg7CisJYWdnLT5yYXRlX25fZmxhZ3MgPSByYXRlX25fZmxhZ3M7CisJYWdnLT5iaXRtYXAgPSAwOworCisJLyogbnVtIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZCAqLworCWlmIChhZ2ctPmZyYW1lX2NvdW50ID09IDEpIHsKKwkJLyogT25seSBvbmUgZnJhbWUgd2FzIGF0dGVtcHRlZDsgbm8gYmxvY2stYWNrIHdpbGwgYXJyaXZlICovCisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGZyYW1lX3N0YXR1c1swXS5zdGF0dXMpOworCQlpZHggPSBzdGFydF9pZHg7CisKKwkJRF9UWF9SRVBMWSgiRnJhbWVDbnQgPSAlZCwgU3RhcnRJZHg9JWQgaWR4PSVkXG4iLAorCQkJICAgYWdnLT5mcmFtZV9jb3VudCwgYWdnLT5zdGFydF9pZHgsIGlkeCk7CisKKwkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoaWwtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYik7CisJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUgKyAxOworCQlpbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwkJaW5mby0+ZmxhZ3MgfD0gaWw0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOworCQlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsIHJhdGVfbl9mbGFncywgaW5mbyk7CisKKwkJRF9UWF9SRVBMWSgiMSBGcmFtZSAweCV4IGZhaWx1cmUgOiVkXG4iLCBzdGF0dXMgJiAweGZmLAorCQkJICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisJCURfVFhfUkVQTFkoIlJhdGUgSW5mbyByYXRlX25fZmxhZ3M9JXhcbiIsIHJhdGVfbl9mbGFncyk7CisKKwkJYWdnLT53YWl0X2Zvcl9iYSA9IDA7CisJfSBlbHNlIHsKKwkJLyogVHdvIG9yIG1vcmUgZnJhbWVzIHdlcmUgYXR0ZW1wdGVkOyBleHBlY3QgYmxvY2stYWNrICovCisJCXU2NCBiaXRtYXAgPSAwOworCQlpbnQgc3RhcnQgPSBhZ2ctPnN0YXJ0X2lkeDsKKworCQkvKiBDb25zdHJ1Y3QgYml0LW1hcCBvZiBwZW5kaW5nIGZyYW1lcyB3aXRoaW4gVHggd2luICovCisJCWZvciAoaSA9IDA7IGkgPCBhZ2ctPmZyYW1lX2NvdW50OyBpKyspIHsKKwkJCXUxNiBzYzsKKwkJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGZyYW1lX3N0YXR1c1tpXS5zdGF0dXMpOworCQkJc2VxID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnNlcXVlbmNlKTsKKwkJCWlkeCA9IFNFUV9UT19JRFgoc2VxKTsKKwkJCXR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXEpOworCisJCQlpZiAoc3RhdHVzICYKKwkJCSAgICAoQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0sgfAorCQkJICAgICBBR0dfVFhfU1RBVEVfQUJPUlRfTVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJRF9UWF9SRVBMWSgiRnJhbWVDbnQgPSAlZCwgdHhxX2lkPSVkIGlkeD0lZFxuIiwKKwkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCB0eHFfaWQsIGlkeCk7CisKKwkJCWhkciA9IGlsX3R4X3F1ZXVlX2dldF9oZHIoaWwsIHR4cV9pZCwgaWR4KTsKKwkJCWlmICghaGRyKSB7CisJCQkJSUxfRVJSKCJCVUdfT04gaWR4IGRvZXNuJ3QgcG9pbnQgdG8gdmFsaWQgc2tiIgorCQkJCSAgICAgICAiIGlkeD0lZCwgdHhxX2lkPSVkXG4iLCBpZHgsIHR4cV9pZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpOworCQkJaWYgKGlkeCAhPSAoU0VRX1RPX1NOKHNjKSAmIDB4ZmYpKSB7CisJCQkJSUxfRVJSKCJCVUdfT04gaWR4IGRvZXNuJ3QgbWF0Y2ggc2VxIGNvbnRyb2wiCisJCQkJICAgICAgICIgaWR4PSVkLCBzZXFfaWR4PSVkLCBzZXE9JWRcbiIsIGlkeCwKKwkJCQkgICAgICAgU0VRX1RPX1NOKHNjKSwgaGRyLT5zZXFfY3RybCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlEX1RYX1JFUExZKCJBR0cgRnJhbWUgaT0lZCBpZHggJWQgc2VxPSVkXG4iLCBpLCBpZHgsCisJCQkJICAgU0VRX1RPX1NOKHNjKSk7CisKKwkJCXNoID0gaWR4IC0gc3RhcnQ7CisJCQlpZiAoc2ggPiA2NCkgeworCQkJCXNoID0gKHN0YXJ0IC0gaWR4KSArIDB4ZmY7CisJCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOworCQkJCXNoID0gMDsKKwkJCQlzdGFydCA9IGlkeDsKKwkJCX0gZWxzZSBpZiAoc2ggPCAtNjQpCisJCQkJc2ggPSAweGZmIC0gKHN0YXJ0IC0gaWR4KTsKKwkJCWVsc2UgaWYgKHNoIDwgMCkgeworCQkJCXNoID0gc3RhcnQgLSBpZHg7CisJCQkJc3RhcnQgPSBpZHg7CisJCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOworCQkJCXNoID0gMDsKKwkJCX0KKwkJCWJpdG1hcCB8PSAxVUxMIDw8IHNoOworCQkJRF9UWF9SRVBMWSgic3RhcnQ9JWQgYml0bWFwPTB4JWxseFxuIiwgc3RhcnQsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOworCQl9CisKKwkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7CisJCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7CisJCURfVFhfUkVQTFkoIkZyYW1lcyAlZCBzdGFydF9pZHg9JWQgYml0bWFwPTB4JWxseFxuIiwKKwkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZ2ctPmJpdG1hcCk7CisKKwkJaWYgKGJpdG1hcCkKKwkJCWFnZy0+d2FpdF9mb3JfYmEgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4CitpbDQ5NjVfZmluZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyKQoreworCWludCBpOworCWludCBzdGFydCA9IDA7CisJaW50IHJldCA9IElMX0lOVkFMSURfU1RBVElPTjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChpbC0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpCisJCXN0YXJ0ID0gSUxfU1RBX0lEOworCisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm4gaWwtPmN0eC5iY2FzdF9zdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gc3RhcnQ7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKQorCQlpZiAoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiYKKwkJICAgICghY29tcGFyZV9ldGhlcl9hZGRyKGlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIsIGFkZHIpKSkgeworCQkJcmV0ID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlEX0FTU09DKCJjYW4gbm90IGZpbmQgU1RBICVwTSB0b3RhbCAlZFxuIiwgYWRkciwgaWwtPm51bV9zdGF0aW9ucyk7CisKK291dDoKKwkvKgorCSAqIEl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IG1vcmUgY29tbWFuZHMgaW50ZXJhY3Rpbmcgd2l0aCBzdGF0aW9ucworCSAqIGFycml2ZSBiZWZvcmUgd2UgY29tcGxldGVkIHByb2Nlc3NpbmcgdGhlIGFkZGluZyBvZgorCSAqIHN0YXRpb24KKwkgKi8KKwlpZiAocmV0ICE9IElMX0lOVkFMSURfU1RBVElPTiAmJgorCSAgICAoIShpbC0+c3RhdGlvbnNbcmV0XS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgfHwKKwkgICAgICgoaWwtPnN0YXRpb25zW3JldF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCisJICAgICAgKGlsLT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpKSkgeworCQlJTF9FUlIoIlJlcXVlc3RlZCBzdGF0aW9uIGluZm8gZm9yIHN0YSAlZCBiZWZvcmUgcmVhZHkuXG4iLAorCQkgICAgICAgcmV0KTsKKwkJcmV0ID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfZ2V0X3JhX3N0YV9pZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJaWYgKGlsLT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJcmV0dXJuIElMX0FQX0lEOworCX0gZWxzZSB7CisJCXU4ICpkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKKwkJcmV0dXJuIGlsNDk2NV9maW5kX3N0YXRpb24oaWwsIGRhKTsKKwl9Cit9CisKKy8qKgorICogaWw0OTY1X2hkbF90eCAtIEhhbmRsZSBzdGFuZGFyZCAobm9uLWFnZ3JlZ2F0aW9uKSBUeCByZXNwb25zZQorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF90eChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKKwlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKKwlpbnQgaWR4ID0gU0VRX1RPX0lEWChzZXF1ZW5jZSk7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpbDQ5NjVfdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07CisJdTMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHR4X3Jlc3AtPnUuc3RhdHVzKTsKKwlpbnQgdW5pbml0aWFsaXplZF92YXIodGlkKTsKKwlpbnQgc3RhX2lkOworCWludCBmcmVlZDsKKwl1OCAqcWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWR4ID49IHR4cS0+cS5uX2JkIHx8IGlsX3F1ZXVlX3VzZWQoJnR4cS0+cSwgaWR4KSA9PSAwKSB7CisJCUlMX0VSUigiUmVhZCBpZHggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpZHggJWQgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIHR4cV9pZCwgaWR4LAorCQkgICAgICAgdHhxLT5xLm5fYmQsIHR4cS0+cS53cml0ZV9wdHIsIHR4cS0+cS5yZWFkX3B0cik7CisJCXJldHVybjsKKwl9CisKKwl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKKwltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOworCisJaGRyID0gaWxfdHhfcXVldWVfZ2V0X2hkcihpbCwgdHhxX2lkLCBpZHgpOworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwl9CisKKwlzdGFfaWQgPSBpbDQ5NjVfZ2V0X3JhX3N0YV9pZChpbCwgaGRyKTsKKwlpZiAodHhxLT5zY2hlZF9yZXRyeSAmJiB1bmxpa2VseShzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkgeworCQlJTF9FUlIoIlN0YXRpb24gbm90IGtub3duXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpZiAodHhxLT5zY2hlZF9yZXRyeSkgeworCQljb25zdCB1MzIgc2NkX3NzbiA9IGlsNDk2NV9nZXRfc2NkX3Nzbih0eF9yZXNwKTsKKwkJc3RydWN0IGlsX2h0X2FnZyAqYWdnID0gTlVMTDsKKwkJV0FSTl9PTighcWMpOworCisJCWFnZyA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2c7CisKKwkJaWw0OTY1X3R4X3N0YXR1c19yZXBseV90eChpbCwgYWdnLCB0eF9yZXNwLCB0eHFfaWQsIGlkeCk7CisKKwkJLyogY2hlY2sgaWYgQkFSIGlzIG5lZWRlZCAqLworCQlpZiAoKHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEpICYmCisJCSAgICAhaWw0OTY1X2lzX3R4X3N1Y2Nlc3Moc3RhdHVzKSkKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7CisKKwkJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoc2NkX3NzbiAmIDB4ZmYpKSB7CisJCQlpZHggPSBpbF9xdWV1ZV9kZWNfd3JhcChzY2Rfc3NuICYgMHhmZiwgdHhxLT5xLm5fYmQpOworCQkJRF9UWF9SRVBMWSgiUmV0cnkgc2NoZWR1bGVyIHJlY2xhaW0gc2NkX3NzbiAiCisJCQkJICAgIiVkIGlkeCAlZFxuIiwgc2NkX3NzbiwgaWR4KTsKKwkJCWZyZWVkID0gaWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oaWwsIHR4cV9pZCwgaWR4KTsKKwkJCWlmIChxYykKKwkJCQlpbDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKGlsLCBzdGFfaWQsIHRpZCwKKwkJCQkJCQkgIGZyZWVkKTsKKworCQkJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkICYmCisJCQkgICAgaWxfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwkJCSAgICBhZ2ctPnN0YXRlICE9IElMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKQorCQkJCWlsX3dha2VfcXVldWUoaWwsIHR4cSk7CisJCX0KKwl9IGVsc2UgeworCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKKwkJaW5mby0+ZmxhZ3MgfD0gaWw0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOworCQlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsCisJCQkJCSAgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAorCQkJCQkgICAgaW5mbyk7CisKKwkJRF9UWF9SRVBMWSgiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCisJCQkgICAicmF0ZV9uX2ZsYWdzIDB4JXggcmV0cmllcyAlZFxuIiwgdHhxX2lkLAorCQkJICAgaWw0OTY1X2dldF90eF9mYWlsX3JlYXNvbihzdGF0dXMpLCBzdGF0dXMsCisJCQkgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAorCQkJICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisKKwkJZnJlZWQgPSBpbDQ5NjVfdHhfcXVldWVfcmVjbGFpbShpbCwgdHhxX2lkLCBpZHgpOworCQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJTF9JTlZBTElEX1NUQVRJT04pKQorCQkJaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShpbCwgc3RhX2lkLCB0aWQsIGZyZWVkKTsKKwkJZWxzZSBpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKKwkJCURfVFhfUkVQTFkoIlN0YXRpb24gbm90IGtub3duXG4iKTsKKworCQlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKKwkJICAgIGlsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKQorCQkJaWxfd2FrZV9xdWV1ZShpbCwgdHhxKTsKKwl9CisJaWYgKHFjICYmIGxpa2VseShzdGFfaWQgIT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJaWw0OTY1X3R4cV9jaGVja19lbXB0eShpbCwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7CisKKwlpbDQ5NjVfY2hlY2tfYWJvcnRfc3RhdHVzKGlsLCB0eF9yZXNwLT5mcmFtZV9jb3VudCwgc3RhdHVzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiAqYmVhY29uID0gKHZvaWQgKilwa3QtPnUucmF3OworCXU4IHJhdGUgX19tYXliZV91bnVzZWQgPQorCSAgICBpbDQ5NjVfaHdfZ2V0X3JhdGUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlX25fZmxhZ3MpOworCisJRF9SWCgiYmVhY29uIHN0YXR1cyAlI3gsIHJldHJpZXM6JWQgaWJzc21ncjolZCAiCisJICAgICAidHNmOjB4JS44eCUuOHggcmF0ZTolZFxuIiwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIudS5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKKwkgICAgIGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuZmFpbHVyZV9mcmFtZSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLCBsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKKworCWlsLT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Cit9CisKKy8qIFNldCB1cCA0OTY1LXNwZWNpZmljIFJ4IGZyYW1lIHJlcGx5IGhhbmRsZXJzICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hhbmRsZXJfc2V0dXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIExlZ2FjeSBSeCBmcmFtZXMgKi8KKwlpbC0+aGFuZGxlcnNbTl9SWF0gPSBpbDQ5NjVfaGRsX3J4OworCS8qIFR4IHJlc3BvbnNlICovCisJaWwtPmhhbmRsZXJzW0NfVFhdID0gaWw0OTY1X2hkbF90eDsKKwlpbC0+aGFuZGxlcnNbTl9CRUFDT05dID0gaWw0OTY1X2hkbF9iZWFjb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfaGNtZF9vcHMgaWw0OTY1X2hjbWQgPSB7CisJLnJ4b25fYXNzb2MgPSBpbDQ5NjVfc2VuZF9yeG9uX2Fzc29jLAorCS5jb21taXRfcnhvbiA9IGlsNDk2NV9jb21taXRfcnhvbiwKKwkuc2V0X3J4b25fY2hhaW4gPSBpbDQ5NjVfc2V0X3J4b25fY2hhaW4sCit9OworCitzdGF0aWMgdm9pZAoraWw0OTY1X3Bvc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwkvKgorCSAqIFNpbmNlIHNldHRpbmcgdGhlIFJYT04gbWF5IGhhdmUgYmVlbiBkZWZlcnJlZCB3aGlsZQorCSAqIHBlcmZvcm1pbmcgdGhlIHNjYW4sIGZpcmUgb25lIG9mZiBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobWVtY21wKCZjdHgtPnN0YWdpbmcsICZjdHgtPmFjdGl2ZSwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQorCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXZpZiB8fCAhaWwtPmlzX29wZW4pCisJCXJldHVybjsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJY29uZiA9ICZpbC0+aHctPmNvbmY7CisKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlyZXQgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCWlmIChyZXQpCisJCUlMX1dBUk4oIlJYT04gdGltaW5nIC0gIiAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCisJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisKKwlpbF9zZXRfcnhvbl9odChpbCwgJmlsLT5jdXJyZW50X2h0X2NvbmZpZyk7CisKKwlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgY3R4KTsKKworCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KHZpZi0+YnNzX2NvbmYuYWlkKTsKKworCURfQVNTT0MoImFzc29jIGlkICVkIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwgdmlmLT5ic3NfY29uZi5haWQsCisJCXZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7CisKKwlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJZWxzZQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKworCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfQorCisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlEX0FTU09DKCJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsIHZpZi0+YnNzX2NvbmYuYWlkLAorCQljdHgtPmFjdGl2ZS5ic3NpZF9hZGRyKTsKKworCXN3aXRjaCAodmlmLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQlpbDQ5NjVfc2VuZF9iZWFjb25fY21kKGlsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfRVJSKCIlcyBTaG91bGQgbm90IGJlIGNhbGxlZCBpbiAlZCBtb2RlXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHZpZi0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCS8qIHRoZSBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiB3aWxsIGVuYWJsZWQgUE0gdXBvbiBjb21wbGV0aW9uCisJICogSWYgY2hhaW4gbm9pc2UgaGFzIGFscmVhZHkgYmVlbiBydW4sIHRoZW4gd2UgbmVlZCB0byBlbmFibGUKKwkgKiBwb3dlciBtYW5hZ2VtZW50IGhlcmUgKi8KKwlpZiAoaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfRE9ORSkKKwkJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIGZhbHNlKTsKKworCS8qIEVuYWJsZSBSeCBkaWZmZXJlbnRpYWwgZ2FpbiBhbmQgc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb25zICovCisJaWw0OTY1X2NoYWluX25vaXNlX3Jlc2V0KGlsKTsKKwlpbC0+c3RhcnRfY2FsaWIgPSAxOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCByZXQgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KKwlpZiAoIWlsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKworCQkvKiBSWE9OIC0gdW5hc3NvYyAodG8gc2V0IHRpbWluZyBjb21tYW5kKSAqLworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCWlsX2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJCS8qIFJYT04gVGltaW5nICovCisJCXJldCA9IGlsX3NlbmRfcnhvbl90aW1pbmcoaWwsIGN0eCk7CisJCWlmIChyZXQpCisJCQlJTF9XQVJOKCJSWE9OIHRpbWluZyBmYWlsZWQgLSAiCisJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCQkvKiBBUCBoYXMgYWxsIGFudGVubmFzICovCisJCWlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMgPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKKwkJaWxfc2V0X3J4b25faHQoaWwsICZpbC0+Y3VycmVudF9odF9jb25maWcpOworCQlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwkJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKKworCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKworCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7CisJCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKKwkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCQllbHNlCisJCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKKwkJfQorCQkvKiBuZWVkIHRvIHNlbmQgYmVhY29uIGNtZCBiZWZvcmUgY29tbWl0dGluZyBhc3NvYyBSWE9OISAqLworCQlpbDQ5NjVfc2VuZF9iZWFjb25fY21kKGlsKTsKKwkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKwl9CisJaWw0OTY1X3NlbmRfYmVhY29uX2NtZChpbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgaWw0OTY1X2hjbWRfdXRpbHMgPSB7CisJLmdldF9oY21kX3NpemUgPSBpbDQ5NjVfZ2V0X2hjbWRfc2l6ZSwKKwkuYnVpbGRfYWRkc3RhX2hjbWQgPSBpbDQ5NjVfYnVpbGRfYWRkc3RhX2hjbWQsCisJLnJlcXVlc3Rfc2NhbiA9IGlsNDk2NV9yZXF1ZXN0X3NjYW4sCisJLnBvc3Rfc2NhbiA9IGlsNDk2NV9wb3N0X3NjYW4sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2xpYl9vcHMgaWw0OTY1X2xpYiA9IHsKKwkuc2V0X2h3X3BhcmFtcyA9IGlsNDk2NV9od19zZXRfaHdfcGFyYW1zLAorCS50eHFfdXBkYXRlX2J5dGVfY250X3RibCA9IGlsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibCwKKwkudHhxX2F0dGFjaF9idWZfdG9fdGZkID0gaWw0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKKwkudHhxX2ZyZWVfdGZkID0gaWw0OTY1X2h3X3R4cV9mcmVlX3RmZCwKKwkudHhxX2luaXQgPSBpbDQ5NjVfaHdfdHhfcXVldWVfaW5pdCwKKwkuaGFuZGxlcl9zZXR1cCA9IGlsNDk2NV9oYW5kbGVyX3NldHVwLAorCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaWw0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCisJLmluaXRfYWxpdmVfc3RhcnQgPSBpbDQ5NjVfaW5pdF9hbGl2ZV9zdGFydCwKKwkubG9hZF91Y29kZSA9IGlsNDk2NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaWw0OTY1X2R1bXBfbmljX2Vycm9yX2xvZywKKwkuZHVtcF9maCA9IGlsNDk2NV9kdW1wX2ZoLAorCS5zZXRfY2hhbm5lbF9zd2l0Y2ggPSBpbDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCisJLmFwbV9vcHMgPSB7CisJCSAgICAuaW5pdCA9IGlsX2FwbV9pbml0LAorCQkgICAgLmNvbmZpZyA9IGlsNDk2NV9uaWNfY29uZmlnLAorCQkgICAgfSwKKwkuZWVwcm9tX29wcyA9IHsKKwkJICAgICAgIC5yZWd1bGF0b3J5X2JhbmRzID0geworCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzI0X0hUNDBfQ0hBTk5FTFMsCisJCQkJCSAgICBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMU30sCisJCSAgICAgICAuYWNxdWlyZV9zZW1hcGhvcmUgPSBpbDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlLAorCQkgICAgICAgLnJlbGVhc2Vfc2VtYXBob3JlID0gaWw0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZSwKKwkJICAgICAgIH0sCisJLnNlbmRfdHhfcG93ZXIgPSBpbDQ5NjVfc2VuZF90eF9wb3dlciwKKwkudXBkYXRlX2NoYWluX2ZsYWdzID0gaWw0OTY1X3VwZGF0ZV9jaGFpbl9mbGFncywKKwkudGVtcF9vcHMgPSB7CisJCSAgICAgLnRlbXBlcmF0dXJlID0gaWw0OTY1X3RlbXBlcmF0dXJlX2NhbGliLAorCQkgICAgIH0sCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkuZGVidWdmc19vcHMgPSB7CisJCQkucnhfc3RhdHNfcmVhZCA9IGlsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkLAorCQkJLnR4X3N0YXRzX3JlYWQgPSBpbDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZCwKKwkJCS5nZW5lcmFsX3N0YXRzX3JlYWQgPSBpbDQ5NjVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkLAorCQkJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9sZWdhY3lfb3BzIGlsNDk2NV9sZWdhY3lfb3BzID0geworCS5wb3N0X2Fzc29jaWF0ZSA9IGlsNDk2NV9wb3N0X2Fzc29jaWF0ZSwKKwkuY29uZmlnX2FwID0gaWw0OTY1X2NvbmZpZ19hcCwKKwkubWFuYWdlX2lic3Nfc3RhdGlvbiA9IGlsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAorCS51cGRhdGVfYmNhc3Rfc3RhdGlvbnMgPSBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zLAorfTsKKworc3RydWN0IGllZWU4MDIxMV9vcHMgaWw0OTY1X2h3X29wcyA9IHsKKwkudHggPSBpbDQ5NjVfbWFjX3R4LAorCS5zdGFydCA9IGlsNDk2NV9tYWNfc3RhcnQsCisJLnN0b3AgPSBpbDQ5NjVfbWFjX3N0b3AsCisJLmFkZF9pbnRlcmZhY2UgPSBpbF9tYWNfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGlsX21hY19yZW1vdmVfaW50ZXJmYWNlLAorCS5jaGFuZ2VfaW50ZXJmYWNlID0gaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2UsCisJLmNvbmZpZyA9IGlsX21hY19jb25maWcsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBpbDQ5NjVfY29uZmlndXJlX2ZpbHRlciwKKwkuc2V0X2tleSA9IGlsNDk2NV9tYWNfc2V0X2tleSwKKwkudXBkYXRlX3RraXBfa2V5ID0gaWw0OTY1X21hY191cGRhdGVfdGtpcF9rZXksCisJLmNvbmZfdHggPSBpbF9tYWNfY29uZl90eCwKKwkucmVzZXRfdHNmID0gaWxfbWFjX3Jlc2V0X3RzZiwKKwkuYnNzX2luZm9fY2hhbmdlZCA9IGlsX21hY19ic3NfaW5mb19jaGFuZ2VkLAorCS5hbXBkdV9hY3Rpb24gPSBpbDQ5NjVfbWFjX2FtcGR1X2FjdGlvbiwKKwkuaHdfc2NhbiA9IGlsX21hY19od19zY2FuLAorCS5zdGFfYWRkID0gaWw0OTY1X21hY19zdGFfYWRkLAorCS5zdGFfcmVtb3ZlID0gaWxfbWFjX3N0YV9yZW1vdmUsCisJLmNoYW5uZWxfc3dpdGNoID0gaWw0OTY1X21hY19jaGFubmVsX3N3aXRjaCwKKwkudHhfbGFzdF9iZWFjb24gPSBpbF9tYWNfdHhfbGFzdF9iZWFjb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlsX29wcyBpbDQ5NjVfb3BzID0geworCS5saWIgPSAmaWw0OTY1X2xpYiwKKwkuaGNtZCA9ICZpbDQ5NjVfaGNtZCwKKwkudXRpbHMgPSAmaWw0OTY1X2hjbWRfdXRpbHMsCisJLmxlZCA9ICZpbDQ5NjVfbGVkX29wcywKKwkubGVnYWN5ID0gJmlsNDk2NV9sZWdhY3lfb3BzLAorCS5pZWVlODAyMTFfb3BzID0gJmlsNDk2NV9od19vcHMsCit9OworCitzdGF0aWMgc3RydWN0IGlsX2Jhc2VfcGFyYW1zIGlsNDk2NV9iYXNlX3BhcmFtcyA9IHsKKwkuZWVwcm9tX3NpemUgPSBJTDQ5NjVfRUVQUk9NX0lNR19TSVpFLAorCS5udW1fb2ZfcXVldWVzID0gSUw0OV9OVU1fUVVFVUVTLAorCS5udW1fb2ZfYW1wZHVfcXVldWVzID0gSUw0OV9OVU1fQU1QRFVfUVVFVUVTLAorCS5wbGxfY2ZnX3ZhbCA9IDAsCisJLnNldF9sMHMgPSB0cnVlLAorCS51c2VfYnNtID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDYxLAorCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElMNDk2NV9DQUxfTlVNX0JFQUNPTlMsCisJLndkX3RpbWVvdXQgPSBJTF9ERUZfV0RfVElNRU9VVCwKKwkudGVtcGVyYXR1cmVfa2VsdmluID0gdHJ1ZSwKKwkudWNvZGVfdHJhY2luZyA9IHRydWUsCisJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCit9OworCitzdHJ1Y3QgaWxfY2ZnIGlsNDk2NV9jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSBMaW5rIDQ5NjVBR04iLAorCS5md19uYW1lX3ByZSA9IElMNDk2NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDQ5NjVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMNDk2NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfQSB8IElMX1NLVV9HIHwgSUxfU0tVX04sCisJLnZhbGlkX3R4X2FudCA9IEFOVF9BQiwKKwkudmFsaWRfcnhfYW50ID0gQU5UX0FCQywKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV80OTY1X0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzQ5NjVfVFhfUE9XRVJfVkVSU0lPTiwKKwkub3BzID0gJmlsNDk2NV9vcHMsCisJLm1vZF9wYXJhbXMgPSAmaWw0OTY1X21vZF9wYXJhbXMsCisJLmJhc2VfcGFyYW1zID0gJmlsNDk2NV9iYXNlX3BhcmFtcywKKwkubGVkX21vZGUgPSBJTF9MRURfQkxJTkssCisJLyoKKwkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAorCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCisJICovCisJLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCit9OworCisvKiBNb2R1bGUgZmlybXdhcmUgKi8KK01PRFVMRV9GSVJNV0FSRShJTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKElMNDk2NV9VQ09ERV9BUElfTUFYKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0NzIzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuaApAQCAtMCwwICsxLDEzMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9faWxfNDk2NV9oX18KKyNkZWZpbmUgX19pbF80OTY1X2hfXworCitzdHJ1Y3QgaWxfcnhfcXVldWU7CitzdHJ1Y3QgaWxfcnhfYnVmOworc3RydWN0IGlsX3J4X3BrdDsKK3N0cnVjdCBpbF90eF9xdWV1ZTsKK3N0cnVjdCBpbF9yeG9uX2NvbnRleHQ7CisKKy8qIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBfNDk2NSBkZXZpY2VzICovCitleHRlcm4gc3RydWN0IGlsX2NmZyBpbDQ5NjVfY2ZnOworCitleHRlcm4gc3RydWN0IGlsX21vZF9wYXJhbXMgaWw0OTY1X21vZF9wYXJhbXM7CisKK2V4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpbDQ5NjVfaHdfb3BzOworCisvKiB0eCBxdWV1ZSAqLwordm9pZCBpbDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgZnJlZWQpOworCisvKiBSWE9OICovCit2b2lkIGlsNDk2NV9zZXRfcnhvbl9jaGFpbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qIHVDb2RlICovCitpbnQgaWw0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiBsaWIgKi8KK3ZvaWQgaWw0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGZyYW1lX2NvdW50LCB1MzIgc3RhdHVzKTsKKwordm9pZCBpbDQ5NjVfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSk7CitpbnQgaWw0OTY1X3J4X2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSk7CitpbnQgaWw0OTY1X2h3X25pY19pbml0KHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWw0OTY1X2R1bXBfZmgoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworCisvKiByeCAqLwordm9pZCBpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpOworaW50IGlsNDk2NV9yeHFfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7Cit2b2lkIGlsNDk2NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDQ5NjVfaGRsX3J4X3BoeShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsNDk2NV9yeF9oYW5kbGUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogdHggKi8KK3ZvaWQgaWw0OTY1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2ludCBpbDQ5NjVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCk7CitpbnQgaWw0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7Cit2b2lkIGlsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByYXRlX25fZmxhZ3MsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyk7CitpbnQgaWw0OTY1X3R4X3NrYihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGlsNDk2NV90eF9hZ2dfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuKTsKK2ludCBpbDQ5NjVfdHhfYWdnX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCk7CitpbnQgaWw0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCk7Cit2b2lkIGlsNDk2NV9oZGxfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7CitpbnQgaWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KTsKK3ZvaWQgaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV90eHFfY3R4X3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbWFzayk7CisKKy8qCisgKiBBY3F1aXJlIGlsLT5sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gIQorICovCit2b2lkIGlsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQsIHUzMiBpZHgpOworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyAtIChvcHRpb25hbGx5KSBzdGFydCBUeC9DbWQgcXVldWUKKyAqIEB0eF9maWZvX2lkOiBUeCBETUEvRklGTyBjaGFubmVsIChyYW5nZSAwLTcpIHRoYXQgdGhlIHF1ZXVlIHdpbGwgZmVlZAorICogQHNjZF9yZXRyeTogKDEpIEluZGljYXRlcyBxdWV1ZSB3aWxsIGJlIHVzZWQgaW4gYWdncmVnYXRpb24gbW9kZQorICoKKyAqIE5PVEU6ICBBY3F1aXJlIGlsLT5sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gIQorICovCit2b2lkIGlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpOworCit1OCBpbDQ5NjVfdG9nZ2xlX3R4X2FudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGFudF9pZHgsIHU4IHZhbGlkKTsKKworLyogcnggKi8KK3ZvaWQgaWw0OTY1X2hkbF9taXNzZWRfYmVhY29uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKK2Jvb2wgaWw0OTY1X2dvb2RfcGxjcF9oZWFsdGgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpOwordm9pZCBpbDQ5NjVfaGRsX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKK3ZvaWQgaWw0OTY1X2hkbF9jX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworLyogc2NhbiAqLworaW50IGlsNDk2NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKworLyogc3RhdGlvbiBtZ210ICovCitpbnQgaWw0OTY1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgIGJvb2wgYWRkKTsKKworLyogaGNtZCAqLworaW50IGlsNDk2NV9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworY29uc3QgY2hhciAqaWw0OTY1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgoraWw0OTY1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQoreworCXJldHVybiAiIjsKK30KKyNlbmRpZgorCisvKiBzdGF0aW9uIG1hbmFnZW1lbnQgKi8KK2ludCBpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CitpbnQgaWw0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKTsKK2ludCBpbDQ5NjVfcmVtb3ZlX2RlZmF1bHRfd2VwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpOworaW50IGlsNDk2NV9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7CitpbnQgaWw0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJICAgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CitpbnQgaWw0OTY1X3NldF9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKK2ludCBpbDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LCB1OCBzdGFfaWQpOwordm9pZCBpbDQ5NjVfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGl2MzIsCisJCQkgICAgdTE2ICpwaGFzZTFrZXkpOworaW50IGlsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKK2ludCBpbDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgaW50IHRpZCwgdTE2IHNzbik7CitpbnQgaWw0OTY1X3N0YV9yeF9hZ2dfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICBpbnQgdGlkKTsKK3ZvaWQgaWw0OTY1X3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCBpbnQgY250KTsKK2ludCBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIHJhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV9od19nZXRfcmF0ZShfX2xlMzIgcmF0ZV9uX2ZsYWdzKQoreworCXJldHVybiBsZTMyX3RvX2NwdShyYXRlX25fZmxhZ3MpICYgMHhGRjsKK30KKworc3RhdGljIGlubGluZSBfX2xlMzIKK2lsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUzMiBmbGFncykKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzIoZmxhZ3MgfCAodTMyKSByYXRlKTsKK30KKworLyogZWVwcm9tICovCit2b2lkIGlsNDk2NV9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4ICogbWFjKTsKK2ludCBpbDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2ludCBpbDQ5NjVfZWVwcm9tX2NoZWNrX3ZlcnNpb24oc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogbWFjODAyMTEgaGFuZGxlcnMgKGZvciA0OTY1KSAqLwordm9pZCBpbDQ5NjVfbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBpbDQ5NjVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgaWw0OTY1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKK3ZvaWQgaWw0OTY1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLCB1NjQgbXVsdGljYXN0KTsKK2ludCBpbDQ5NjVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7Cit2b2lkIGlsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwKKwkJCQl1MTYgKnBoYXNlMWtleSk7CitpbnQgaWw0OTY1X21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqIHNzbiwKKwkJCSAgICB1OCBidWZfc2l6ZSk7CitpbnQgaWw0OTY1X21hY19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Cit2b2lkIGlsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKKwordm9pZCBpbDQ5NjVfbGVkX2VuYWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiBFRVBST00gKi8KKyNkZWZpbmUgSUw0OTY1X0VFUFJPTV9JTUdfU0laRQkJCTEwMjQKKworLyoKKyAqIHVDb2RlIHF1ZXVlIG1hbmFnZW1lbnQgZGVmaW5pdGlvbnMgLi4uCisgKiBUaGUgZmlyc3QgcXVldWUgdXNlZCBmb3IgYmxvY2stYWNrIGFnZ3JlZ2F0aW9uIGlzICM3ICg0OTY1IG9ubHkpLgorICogQWxsIGJsb2NrLWFjayBhZ2dyZWdhdGlvbiBxdWV1ZXMgc2hvdWxkIG1hcCB0byBUeCBETUEvRklGTyBjaGFubmVsIDcuCisgKi8KKyNkZWZpbmUgSUw0OV9GSVJTVF9BTVBEVV9RVUVVRQk3CisKKy8qIFNpemVzIGFuZCBhZGRyZXNzZXMgZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhIG1lbW9yeSAoU1JBTSkgaW4KKyAqIDQ5NjUncyBlbWJlZGRlZCBwcm9jZXNzb3IuICBEcml2ZXIgYWNjZXNzIGlzIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVncy4gKi8KKyNkZWZpbmUgSUw0OV9SVENfSU5TVF9MT1dFUl9CT1VORAkJKDB4MDAwMDAwKQorI2RlZmluZSBJTDQ5X1JUQ19JTlNUX1VQUEVSX0JPVU5ECQkoMHgwMTgwMDApCisKKyNkZWZpbmUgSUw0OV9SVENfREFUQV9MT1dFUl9CT1VORAkJKDB4ODAwMDAwKQorI2RlZmluZSBJTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5ECQkoMHg4MEEwMDApCisKKyNkZWZpbmUgSUw0OV9SVENfSU5TVF9TSVpFICAoSUw0OV9SVENfSU5TVF9VUFBFUl9CT1VORCAtIFwKKwkJCQlJTDQ5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQorI2RlZmluZSBJTDQ5X1JUQ19EQVRBX1NJWkUgIChJTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5EIC0gXAorCQkJCUlMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCisKKyNkZWZpbmUgSUw0OV9NQVhfSU5TVF9TSVpFIElMNDlfUlRDX0lOU1RfU0laRQorI2RlZmluZSBJTDQ5X01BWF9EQVRBX1NJWkUgSUw0OV9SVENfREFUQV9TSVpFCisKKy8qIFNpemUgb2YgdUNvZGUgaW5zdHJ1Y3Rpb24gbWVtb3J5IGluIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIElMNDlfTUFYX0JTTV9TSVpFIEJTTV9TUkFNX1NJWkUKKworc3RhdGljIGlubGluZSBpbnQKK2lsNDk2NV9od192YWxpZF9ydGNfZGF0YV9hZGRyKHUzMiBhZGRyKQoreworCXJldHVybiAoYWRkciA+PSBJTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5EICYmCisJCWFkZHIgPCBJTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBURU1QRVJBVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIDQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24uCisgKgorICogVGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgZGV2aWNlIHRlbXBlcmF0dXJlIGJlZm9yZSBjYWxjdWxhdGluZworICogYSB0eHBvd2VyIHNldHRpbmcgKGFtcGxpZmllciBnYWluIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCkuICBUaGUKKyAqIGNhbGN1bGF0aW9uIHVzZXMgNCBtZWFzdXJlbWVudHMsIDMgb2Ygd2hpY2ggKFIxLCBSMiwgUjMpIGFyZSBjYWxpYnJhdGlvbgorICogdmFsdWVzIHVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkcml2ZXIsIGFuZCBvbmUgb2Ygd2hpY2ggKFI0KSBpcyB0aGUKKyAqIHJlYWwtdGltZSB0ZW1wZXJhdHVyZSBpbmRpY2F0b3IuCisgKgorICogdUNvZGUgcHJvdmlkZXMgYWxsIDQgdmFsdWVzIHRvIHRoZSBkcml2ZXIgdmlhIHRoZSAiaW5pdGlhbGl6ZSBhbGl2ZSIKKyAqIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpbDQ5NjVfaW5pdF9hbGl2ZV9yZXNwKS4gIEFmdGVyIHRoZSBydW50aW1lIHVDb2RlCisgKiBpbWFnZSBsb2FkcywgdUNvZGUgdXBkYXRlcyB0aGUgUjQgdmFsdWUgdmlhIHN0YXRzIG5vdGlmaWNhdGlvbnMKKyAqIChzZWUgTl9TVEFUUyksIHdoaWNoIG9jY3VyIGFmdGVyIGVhY2ggcmVjZWl2ZWQgYmVhY29uCisgKiB3aGVuIGFzc29jaWF0ZWQsIG9yIGNhbiBiZSByZXF1ZXN0ZWQgdmlhIENfU1RBVFMuCisgKgorICogTk9URTogIHVDb2RlIHByb3ZpZGVzIHRoZSBSNCB2YWx1ZSBhcyBhIDIzLWJpdCBzaWduZWQgdmFsdWUuICBEcml2ZXIKKyAqICAgICAgICBtdXN0IHNpZ24tZXh0ZW5kIHRvIDMyIGJpdHMgYmVmb3JlIGFwcGx5aW5nIGZvcm11bGEgYmVsb3cuCisgKgorICogRm9ybXVsYToKKyAqCisgKiBkZWdyZWVzIEtlbHZpbiA9ICgoOTcgKiAyNTkgKiAoUjQgLSBSMikgLyAoUjMgLSBSMSkpIC8gMTAwKSArIDgKKyAqCisgKiBOT1RFOiAgVGhlIGJhc2ljIGZvcm11bGEgaXMgMjU5ICogKFI0LVIyKSAvIChSMy1SMSkuICBUaGUgOTcvMTAwIGlzCisgKiBhbiBhZGRpdGlvbmFsIGNvcnJlY3Rpb24sIHdoaWNoIHNob3VsZCBiZSBjZW50ZXJlZCBhcm91bmQgMCBkZWdyZWVzCisgKiBDZWxzaXVzICgyNzMgZGVncmVlcyBLZWx2aW4pLiAgVGhlIDggKDMgcGVyY2VudCBvZiAyNzMpIGNvbXBlbnNhdGVzIGZvcgorICogY2VudGVyaW5nIHRoZSA5Ny8xMDAgY29ycmVjdGlvbiBhcm91bmQgMCBkZWdyZWVzIEsuCisgKgorICogQWRkIDI3MyB0byBLZWx2aW4gdmFsdWUgdG8gZmluZCBkZWdyZWVzIENlbHNpdXMsIGZvciBjb21wYXJpbmcgY3VycmVudAorICogdGVtcGVyYXR1cmUgd2l0aCBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlcyB3aGVuIGNhbGN1bGF0aW5nIHR4cG93ZXIKKyAqIHNldHRpbmdzLgorICovCisjZGVmaW5lIFRFTVBFUkFUVVJFX0NBTElCX0tFTFZJTl9PRkZTRVQgOAorI2RlZmluZSBURU1QRVJBVFVSRV9DQUxJQl9BX1ZBTCAyNTkKKworLyogTGltaXQgcmFuZ2Ugb2YgY2FsY3VsYXRlZCB0ZW1wZXJhdHVyZSB0byBiZSBiZXR3ZWVuIHRoZXNlIEtlbHZpbiB2YWx1ZXMgKi8KKyNkZWZpbmUgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOICAoMjYzKQorI2RlZmluZSBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NQVggICg0MTApCisKKyNkZWZpbmUgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfT1VUX09GX1JBTkdFKHQpIFwKKwkoKHQpIDwgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOIHx8IFwKKwkgKHQpID4gSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYKQorCisvKioqKioqKioqKioqKioqKioqKioqIEVORCBURU1QRVJBVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKiogU1RBUlQgVFhQT1dFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiA0OTY1IHR4cG93ZXIgY2FsY3VsYXRpb25zIHJlbHkgb24gaW5mb3JtYXRpb24gZnJvbSB0aHJlZSBzb3VyY2VzOgorICoKKyAqICAgICAxKSBFRVBST00KKyAqICAgICAyKSAiaW5pdGlhbGl6ZSIgYWxpdmUgbm90aWZpY2F0aW9uCisgKiAgICAgMykgc3RhdHMgbm90aWZpY2F0aW9ucworICoKKyAqIEVFUFJPTSBkYXRhIGNvbnNpc3RzIG9mOgorICoKKyAqIDEpICBSZWd1bGF0b3J5IGluZm9ybWF0aW9uIChtYXggdHhwb3dlciBhbmQgY2hhbm5lbCB1c2FnZSBmbGFncykgaXMgcHJvdmlkZWQKKyAqICAgICBzZXBhcmF0ZWx5IGZvciBlYWNoIGNoYW5uZWwgdGhhdCBjYW4gcG9zc2libHkgc3VwcG9ydGVkIGJ5IDQ5NjUuCisgKiAgICAgNDAgTUh6IHdpZGUgKC4xMW4gSFQ0MCkgY2hhbm5lbHMgYXJlIGxpc3RlZCBzZXBhcmF0ZWx5IGZyb20gMjAgTUh6CisgKiAgICAgKGxlZ2FjeSkgY2hhbm5lbHMuCisgKgorICogICAgIFNlZSBzdHJ1Y3QgaWw0OTY1X2VlcHJvbV9jaGFubmVsIGZvciBmb3JtYXQsIGFuZCBzdHJ1Y3QgaWw0OTY1X2VlcHJvbQorICogICAgIGZvciBsb2NhdGlvbnMgaW4gRUVQUk9NLgorICoKKyAqIDIpICBGYWN0b3J5IHR4cG93ZXIgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmb3IKKyAqICAgICBzdWItYmFuZHMgb2YgY29udGlndW91cyBjaGFubmVscy4gIDIuNEdIeiBoYXMganVzdCBvbmUgc3ViLWJhbmQsCisgKiAgICAgYnV0IDUgR0h6IGhhcyBzZXZlcmFsIHN1Yi1iYW5kcy4KKyAqCisgKiAgICAgSW4gYWRkaXRpb24sIHBlci1iYW5kICgyLjQgYW5kIDUgR2h6KSBzYXR1cmF0aW9uIHR4cG93ZXJzIGFyZSBwcm92aWRlZC4KKyAqCisgKiAgICAgU2VlIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NhbGliX2luZm8gKGFuZCB0aGUgdHJlZSBvZiBzdHJ1Y3R1cmVzCisgKiAgICAgY29udGFpbmVkIHdpdGhpbiBpdCkgZm9yIGZvcm1hdCwgYW5kIHN0cnVjdCBpbDQ5NjVfZWVwcm9tIGZvcgorICogICAgIGxvY2F0aW9ucyBpbiBFRVBST00uCisgKgorICogIkluaXRpYWxpemF0aW9uIGFsaXZlIiBub3RpZmljYXRpb24gKHNlZSBzdHJ1Y3QgaWw0OTY1X2luaXRfYWxpdmVfcmVzcCkKKyAqIGNvbnNpc3RzIG9mOgorICoKKyAqIDEpICBUZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzLgorICoKKyAqIDIpICBQb3dlciBzdXBwbHkgdm9sdGFnZSBtZWFzdXJlbWVudC4KKyAqCisgKiAzKSAgVHggZ2FpbiBjb21wZW5zYXRpb24gdG8gYmFsYW5jZSAyIHRyYW5zbWl0dGVycyBmb3IgTUlNTyB1c2UuCisgKgorICogU3RhdGlzdGljcyBub3RpZmljYXRpb25zIGRlbGl2ZXI6CisgKgorICogMSkgIEN1cnJlbnQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZSBwYXJhbSBSNC4KKyAqLworCisvKioKKyAqIFRvIGNhbGN1bGF0ZSBhIHR4cG93ZXIgc2V0dGluZyBmb3IgYSBnaXZlbiBkZXNpcmVkIHRhcmdldCB0eHBvd2VyLCBjaGFubmVsLAorICogbW9kdWxhdGlvbiBiaXQgcmF0ZSwgYW5kIHRyYW5zbWl0dGVyIGNoYWluICg0OTY1IGhhcyAyIHRyYW5zbWl0dGVycyB0bworICogc3VwcG9ydCBNSU1PIGFuZCB0cmFuc21pdCBkaXZlcnNpdHkpLCBkcml2ZXIgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgorICoKKyAqIDEpICBDb21wYXJlIGRlc2lyZWQgdHhwb3dlciB2cy4gKEVFUFJPTSkgcmVndWxhdG9yeSBsaW1pdCBmb3IgdGhpcyBjaGFubmVsLgorICogICAgIERvIG5vdCBleGNlZWQgcmVndWxhdG9yeSBsaW1pdDsgcmVkdWNlIHRhcmdldCB0eHBvd2VyIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiAgICAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpZHhlcyA4LTE1LCAyNC0zMSksCisgKiAgICAgMiB0cmFuc21pdHRlcnMgd2lsbCBiZSB1c2VkIHNpbXVsdGFuZW91c2x5OyBkcml2ZXIgbXVzdCByZWR1Y2UgdGhlCisgKiAgICAgcmVndWxhdG9yeSBsaW1pdCBieSAzIGRCIChoYWxmLXBvd2VyKSBmb3IgZWFjaCB0cmFuc21pdHRlciwgc28gdGhlCisgKiAgICAgY29tYmluZWQgdG90YWwgb3V0cHV0IG9mIHRoZSAyIHRyYW5zbWl0dGVycyBpcyB3aXRoaW4gcmVndWxhdG9yeSBsaW1pdHMuCisgKgorICoKKyAqIDIpICBDb21wYXJlIHRhcmdldCB0eHBvd2VyIHZzLiAoRUVQUk9NKSBzYXR1cmF0aW9uIHR4cG93ZXIgKnJlZHVjZWQgYnkKKyAqICAgICBiYWNrb2ZmIGZvciB0aGlzIGJpdCByYXRlKi4gIERvIG5vdCBleGNlZWQgKHNhdHVyYXRpb24gLSBiYWNrb2ZmW3JhdGVdKTsKKyAqICAgICByZWR1Y2UgdGFyZ2V0IHR4cG93ZXIgaWYgbmVjZXNzYXJ5LgorICoKKyAqICAgICBCYWNrb2ZmIHZhbHVlcyBiZWxvdyBhcmUgaW4gMS8yIGRCIHVuaXRzIChlcXVpdmFsZW50IHRvIHN0ZXBzIGluCisgKiAgICAgdHhwb3dlciBnYWluIHRhYmxlcyk6CisgKgorICogICAgIE9GRE0gNiAtIDM2IE1CaXQ6ICAxMCBzdGVwcyAoNSBkQikKKyAqICAgICBPRkRNIDQ4IE1CaXQ6ICAgICAgMTUgc3RlcHMgKDcuNSBkQikKKyAqICAgICBPRkRNIDU0IE1CaXQ6ICAgICAgMTcgc3RlcHMgKDguNSBkQikKKyAqICAgICBPRkRNIDYwIE1CaXQ6ICAgICAgMjAgc3RlcHMgKDEwIGRCKQorICogICAgIENDSyBhbGwgcmF0ZXM6ICAgICAxMCBzdGVwcyAoNSBkQikKKyAqCisgKiAgICAgQmFja29mZiB2YWx1ZXMgYXBwbHkgdG8gc2F0dXJhdGlvbiB0eHBvd2VyIG9uIGEgcGVyLXRyYW5zbWl0dGVyIGJhc2lzOworICogICAgIHdoZW4gdXNpbmcgTUlNTyAoMiB0cmFuc21pdHRlcnMpLCBlYWNoIHRyYW5zbWl0dGVyIHVzZXMgdGhlIHNhbWUKKyAqICAgICBzYXR1cmF0aW9uIGxldmVsIHByb3ZpZGVkIGluIEVFUFJPTSwgYW5kIHRoZSBzYW1lIGJhY2tvZmYgdmFsdWVzOworICogICAgIG5vIHJlZHVjdGlvbiAoc3VjaCBhcyB3aXRoIHJlZ3VsYXRvcnkgdHhwb3dlciBsaW1pdHMpIGlzIHJlcXVpcmVkLgorICoKKyAqICAgICBTYXR1cmF0aW9uIGFuZCBCYWNrb2ZmIHZhbHVlcyBhcHBseSBlcXVhbGx5IHRvIDIwIE1oeiAobGVnYWN5KSBjaGFubmVsCisgKiAgICAgd2lkdGhzIGFuZCA0MCBNaHogKC4xMW4gSFQ0MCkgY2hhbm5lbCB3aWR0aHM7IHRoZXJlIGlzIG5vIHNlcGFyYXRlCisgKiAgICAgZmFjdG9yeSBtZWFzdXJlbWVudCBmb3IgaHQ0MCBjaGFubmVscy4KKyAqCisgKiAgICAgVGhlIHJlc3VsdCBvZiB0aGlzIHN0ZXAgaXMgdGhlIGZpbmFsIHRhcmdldCB0eHBvd2VyLiAgVGhlIHJlc3Qgb2YKKyAqICAgICB0aGUgc3RlcHMgZmlndXJlIG91dCB0aGUgcHJvcGVyIHNldHRpbmdzIGZvciB0aGUgZGV2aWNlIHRvIGFjaGlldmUKKyAqICAgICB0aGF0IHRhcmdldCB0eHBvd2VyLgorICoKKyAqCisgKiAzKSAgRGV0ZXJtaW5lIChFRVBST00pIGNhbGlicmF0aW9uIHN1YiBiYW5kIGZvciB0aGUgdGFyZ2V0IGNoYW5uZWwsIGJ5CisgKiAgICAgY29tcGFyaW5nIGFnYWluc3QgZmlyc3QgYW5kIGxhc3QgY2hhbm5lbHMgaW4gZWFjaCBzdWIgYmFuZAorICogICAgIChzZWUgc3RydWN0IGlsNDk2NV9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvKS4KKyAqCisgKgorICogNCkgIExpbmVhcmx5IGludGVycG9sYXRlIChFRVBST00pIGZhY3RvcnkgY2FsaWJyYXRpb24gbWVhc3VyZW1lbnQgc2V0cywKKyAqICAgICByZWZlcmVuY2luZyB0aGUgMiBmYWN0b3J5LW1lYXN1cmVkIChzYW1wbGUpIGNoYW5uZWxzIHdpdGhpbiB0aGUgc3ViIGJhbmQuCisgKgorICogICAgIEludGVycG9sYXRpb24gaXMgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFubmVsJ3MgZnJlcXVlbmN5CisgKiAgICAgYW5kIHRoZSBzYW1wbGUgY2hhbm5lbHMnIGZyZXF1ZW5jaWVzLiAgU2luY2UgY2hhbm5lbCBudW1iZXJzIGFyZSBiYXNlZAorICogICAgIG9uIGZyZXF1ZW5jeSAoNSBNSHogYmV0d2VlbiBlYWNoIGNoYW5uZWwgbnVtYmVyKSwgdGhpcyBpcyBlcXVpdmFsZW50CisgKiAgICAgdG8gaW50ZXJwb2xhdGluZyBiYXNlZCBvbiBjaGFubmVsIG51bWJlciBkaWZmZXJlbmNlcy4KKyAqCisgKiAgICAgTm90ZSB0aGF0IHRoZSBzYW1wbGUgY2hhbm5lbHMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNoYW5uZWxzIGF0IHRoZQorICogICAgIGVkZ2VzIG9mIHRoZSBzdWIgYmFuZC4gIFRoZSB0YXJnZXQgY2hhbm5lbCBtYXkgYmUgIm91dHNpZGUiIG9mIHRoZQorICogICAgIHNwYW4gb2YgdGhlIHNhbXBsZWQgY2hhbm5lbHMuCisgKgorICogICAgIERyaXZlciBtYXkgY2hvb3NlIHRoZSBwYWlyIChmb3IgMiBUeCBjaGFpbnMpIG9mIG1lYXN1cmVtZW50cyAoc2VlCisgKiAgICAgc3RydWN0IGlsNDk2NV9lZXByb21fY2FsaWJfY2hfaW5mbykgZm9yIHdoaWNoIHRoZSBhY3R1YWwgbWVhc3VyZWQKKyAqICAgICB0eHBvd2VyIGNvbWVzIGNsb3Nlc3QgdG8gdGhlIGRlc2lyZWQgdHhwb3dlci4gIFVzdWFsbHksIHRob3VnaCwKKyAqICAgICB0aGUgbWlkZGxlIHNldCBvZiBtZWFzdXJlbWVudHMgaXMgY2xvc2VzdCB0byB0aGUgcmVndWxhdG9yeSBsaW1pdHMsCisgKiAgICAgYW5kIGlzIHRoZXJlZm9yZSBhIGdvb2QgY2hvaWNlIGZvciBhbGwgdHhwb3dlciBjYWxjdWxhdGlvbnMgKHRoaXMKKyAqICAgICBhc3N1bWVzIHRoYXQgaGlnaCBhY2N1cmFjeSBpcyBuZWVkZWQgZm9yIG1heGltaXppbmcgbGVnYWwgdHhwb3dlciwKKyAqICAgICB3aGlsZSBsb3dlciB0eHBvd2VyIGNvbmZpZ3VyYXRpb25zIGRvIG5vdCBuZWVkIGFzIG11Y2ggYWNjdXJhY3kpLgorICoKKyAqICAgICBEcml2ZXIgc2hvdWxkIGludGVycG9sYXRlIGJvdGggbWVtYmVycyBvZiB0aGUgY2hvc2VuIG1lYXN1cmVtZW50IHBhaXIsCisgKiAgICAgaS5lLiBmb3IgYm90aCBUeCBjaGFpbnMgKHJhZGlvIHRyYW5zbWl0dGVycyksIHVubGVzcyB0aGUgZHJpdmVyIGtub3dzCisgKiAgICAgdGhhdCBvbmx5IG9uZSBvZiB0aGUgY2hhaW5zIHdpbGwgYmUgdXNlZCAoZS5nLiBvbmx5IG9uZSB0eCBhbnRlbm5hCisgKiAgICAgY29ubmVjdGVkLCBidXQgdGhpcyBzaG91bGQgYmUgdW51c3VhbCkuICBUaGUgcmF0ZSBzY2FsaW5nIGFsZ29yaXRobQorICogICAgIHN3aXRjaGVzIGFudGVubmFzIHRvIGZpbmQgYmVzdCBwZXJmb3JtYW5jZSwgc28gYm90aCBUeCBjaGFpbnMgd2lsbAorICogICAgIGJlIHVzZWQgKGFsdGhvdWdoIG9ubHkgb25lIGF0IGEgdGltZSkgZXZlbiBmb3Igbm9uLU1JTU8gdHJhbnNtaXNzaW9ucy4KKyAqCisgKiAgICAgRHJpdmVyIHNob3VsZCBpbnRlcnBvbGF0ZSBmYWN0b3J5IHZhbHVlcyBmb3IgdGVtcGVyYXR1cmUsIGdhaW4gdGFibGUKKyAqICAgICBpZHgsIGFuZCBhY3R1YWwgcG93ZXIuICBUaGUgcG93ZXIgYW1wbGlmaWVyIGRldGVjdG9yIHZhbHVlcyBhcmUKKyAqICAgICBub3QgdXNlZCBieSB0aGUgZHJpdmVyLgorICoKKyAqICAgICBTYW5pdHkgY2hlY2s6ICBJZiB0aGUgdGFyZ2V0IGNoYW5uZWwgaGFwcGVucyB0byBiZSBvbmUgb2YgdGhlIHNhbXBsZQorICogICAgIGNoYW5uZWxzLCB0aGUgcmVzdWx0cyBzaG91bGQgYWdyZWUgd2l0aCB0aGUgc2FtcGxlIGNoYW5uZWwncworICogICAgIG1lYXN1cmVtZW50cyEKKyAqCisgKgorICogNSkgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlc2lyZWQgdHhwb3dlciBhbmQgKGludGVycG9sYXRlZCkKKyAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHR4cG93ZXIuICBVc2luZyAoaW50ZXJwb2xhdGVkKSBmYWN0b3J5IGdhaW4gdGFibGUgaWR4CisgKiAgICAgKHNob3duIGVsc2V3aGVyZSkgYXMgYSBzdGFydGluZyBwb2ludCwgYWRqdXN0IHRoaXMgaWR4IGxvd2VyIHRvCisgKiAgICAgaW5jcmVhc2UgdHhwb3dlciwgb3IgaGlnaGVyIHRvIGRlY3JlYXNlIHR4cG93ZXIsIHVudGlsIHRoZSB0YXJnZXQKKyAqICAgICB0eHBvd2VyIGlzIHJlYWNoZWQuICBFYWNoIHN0ZXAgaW4gdGhlIGdhaW4gdGFibGUgaXMgMS8yIGRCLgorICoKKyAqICAgICBGb3IgZXhhbXBsZSwgaWYgZmFjdG9yeSBtZWFzdXJlZCB0eHBvd2VyIGlzIDE2IGRCbSwgYW5kIHRhcmdldCB0eHBvd2VyCisgKiAgICAgaXMgMTMgZEJtLCBhZGQgNiBzdGVwcyB0byB0aGUgZmFjdG9yeSBnYWluIGlkeCB0byByZWR1Y2UgdHhwb3dlcgorICogICAgIGJ5IDMgZEIuCisgKgorICoKKyAqIDYpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGRldmljZSB0ZW1wZXJhdHVyZSBhbmQgKGludGVycG9sYXRlZCkKKyAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlIGZvciBzdWItYmFuZC4gIEZhY3RvcnkgdmFsdWVzIGFyZSBpbgorICogICAgIGRlZ3JlZXMgQ2Vsc2l1cy4gIFRvIGNhbGN1bGF0ZSBjdXJyZW50IHRlbXBlcmF0dXJlLCBzZWUgY29tbWVudHMgZm9yCisgKiAgICAgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iLgorICoKKyAqICAgICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGhpZ2hlciB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0CisgKiAgICAgaW5jcmVhc2UgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpZHgpLCBhbmQgdmljZSB2ZXJzZS4KKyAqCisgKiAgICAgVGVtcGVyYXR1cmUgYWZmZWN0cyBnYWluIGRpZmZlcmVudGx5IGZvciBkaWZmZXJlbnQgY2hhbm5lbHM6CisgKgorICogICAgIDIuNCBHSHogYWxsIGNoYW5uZWxzOiAgMy41IGRlZ3JlZXMgcGVyIGhhbGYtZEIgc3RlcAorICogICAgIDUgR0h6IGNoYW5uZWxzIDM0LTQzOiAgNC41IGRlZ3JlZXMgcGVyIGhhbGYtZEIgc3RlcAorICogICAgIDUgR0h6IGNoYW5uZWxzID49IDQ0OiAgNC4wIGRlZ3JlZXMgcGVyIGhhbGYtZEIgc3RlcAorICoKKyAqICAgICBOT1RFOiAgVGVtcGVyYXR1cmUgY2FuIGluY3JlYXNlIHJhcGlkbHkgd2hlbiB0cmFuc21pdHRpbmcsIGVzcGVjaWFsbHkKKyAqICAgICAgICAgICAgd2l0aCBoZWF2eSB0cmFmZmljIGF0IGhpZ2ggdHhwb3dlcnMuICBEcml2ZXIgc2hvdWxkIHVwZGF0ZQorICogICAgICAgICAgICB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbnMgb2Z0ZW4gdW5kZXIgdGhlc2UgY29uZGl0aW9ucyB0bworICogICAgICAgICAgICBtYWludGFpbiBzdHJvbmcgdHhwb3dlciBpbiB0aGUgZmFjZSBvZiByaXNpbmcgdGVtcGVyYXR1cmUuCisgKgorICoKKyAqIDcpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHBvd2VyIHN1cHBseSB2b2x0YWdlIGluZGljYXRvcgorICogICAgIChmcm9tICJpbml0aWFsaXplIGFsaXZlIikgYW5kIGZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UKKyAqICAgICBpbmRpY2F0b3IgKEVFUFJPTSkuCisgKgorICogICAgIElmIHRoZSBjdXJyZW50IHZvbHRhZ2UgaXMgaGlnaGVyIChpbmRpY2F0b3IgaXMgbG93ZXIpIHRoYW4gZmFjdG9yeQorICogICAgIHZvbHRhZ2UsIGdhaW4gc2hvdWxkIGJlIHJlZHVjZWQgKGdhaW4gdGFibGUgaWR4IGluY3JlYXNlZCkgYnk6CisgKgorICogICAgIChlZXByb20gLSBjdXJyZW50KSAvIDcKKyAqCisgKiAgICAgSWYgdGhlIGN1cnJlbnQgdm9sdGFnZSBpcyBsb3dlciAoaW5kaWNhdG9yIGlzIGhpZ2hlcikgdGhhbiBmYWN0b3J5CisgKiAgICAgdm9sdGFnZSwgZ2FpbiBzaG91bGQgYmUgaW5jcmVhc2VkIChnYWluIHRhYmxlIGlkeCBkZWNyZWFzZWQpIGJ5OgorICoKKyAqICAgICAyICogKGN1cnJlbnQgLSBlZXByb20pIC8gNworICoKKyAqICAgICBJZiBudW1iZXIgb2YgaWR4IHN0ZXBzIGluIGVpdGhlciBkaXJlY3Rpb24gdHVybnMgb3V0IHRvIGJlID4gMiwKKyAqICAgICBzb21ldGhpbmcgaXMgd3JvbmcgLi4uIGp1c3QgdXNlIDAuCisgKgorICogICAgIE5PVEU6ICBWb2x0YWdlIGNvbXBlbnNhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBiYW5kL2NoYW5uZWwuCisgKgorICogICAgIE5PVEU6ICAiSW5pdGlhbGl6ZSIgdUNvZGUgbWVhc3VyZXMgY3VycmVudCB2b2x0YWdlLCB3aGljaCBpcyBhc3N1bWVkCisgKiAgICAgICAgICAgIHRvIGJlIGNvbnN0YW50IGFmdGVyIHRoaXMgaW5pdGlhbCBtZWFzdXJlbWVudC4gIFZvbHRhZ2UKKyAqICAgICAgICAgICAgY29tcGVuc2F0aW9uIGZvciB0eHBvd2VyIChudW1iZXIgb2Ygc3RlcHMgaW4gZ2FpbiB0YWJsZSkKKyAqICAgICAgICAgICAgbWF5IGJlIGNhbGN1bGF0ZWQgb25jZSBhbmQgdXNlZCB1bnRpbCB0aGUgbmV4dCB1Q29kZSBib290bG9hZC4KKyAqCisgKgorICogOCkgIElmIHNldHRpbmcgdXAgdHhwb3dlcnMgZm9yIE1JTU8gcmF0ZXMgKHJhdGUgaWR4ZXMgOC0xNSwgMjQtMzEpLAorICogICAgIGFkanVzdCB0eHBvd2VyIGZvciBlYWNoIHRyYW5zbWl0dGVyIGNoYWluLCBzbyB0eHBvd2VyIGlzIGJhbGFuY2VkCisgKiAgICAgYmV0d2VlbiB0aGUgdHdvIGNoYWlucy4gIFRoZXJlIGFyZSA1IHBhaXJzIG9mIHR4X2F0dGVuW2dyb3VwXVtjaGFpbl0KKyAqICAgICB2YWx1ZXMgaW4gImluaXRpYWxpemUgYWxpdmUiLCBvbmUgcGFpciBmb3IgZWFjaCBvZiA1IGNoYW5uZWwgcmFuZ2VzOgorICoKKyAqICAgICBHcm91cCAwOiAgNSBHSHogY2hhbm5lbCAzNC00MworICogICAgIEdyb3VwIDE6ICA1IEdIeiBjaGFubmVsIDQ0LTcwCisgKiAgICAgR3JvdXAgMjogIDUgR0h6IGNoYW5uZWwgNzEtMTI0CisgKiAgICAgR3JvdXAgMzogIDUgR0h6IGNoYW5uZWwgMTI1LTIwMAorICogICAgIEdyb3VwIDQ6ICAyLjQgR0h6IGFsbCBjaGFubmVscworICoKKyAqICAgICBBZGQgdGhlIHR4X2F0dGVuW2dyb3VwXVtjaGFpbl0gdmFsdWUgdG8gdGhlIGlkeCBmb3IgdGhlIHRhcmdldCBjaGFpbi4KKyAqICAgICBUaGUgdmFsdWVzIGFyZSBzaWduZWQsIGJ1dCBhcmUgaW4gcGFpcnMgb2YgMCBhbmQgYSBub24tbmVnYXRpdmUgbnVtYmVyLAorICogICAgIHNvIGFzIHRvIHJlZHVjZSBnYWluIChpZiBuZWNlc3NhcnkpIG9mIHRoZSAiaG90dGVyIiBjaGFubmVsLiAgVGhpcworICogICAgIGF2b2lkcyBhbnkgbmVlZCB0byBkb3VibGUtY2hlY2sgZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBhZnRlcgorICogICAgIHRoaXMgc3RlcC4KKyAqCisgKgorICogOSkgIElmIHNldHRpbmcgdXAgZm9yIGEgQ0NLIHJhdGUsIGxvd2VyIHRoZSBnYWluIGJ5IGFkZGluZyBhIENDSyBjb21wZW5zYXRpb24KKyAqICAgICB2YWx1ZSB0byB0aGUgaWR4OgorICoKKyAqICAgICBIYXJkd2FyZSByZXYgQjogIDkgc3RlcHMgKDQuNSBkQikKKyAqICAgICBIYXJkd2FyZSByZXYgQzogIDUgc3RlcHMgKDIuNSBkQikKKyAqCisgKiAgICAgSGFyZHdhcmUgcmV2IGZvciA0OTY1IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgQ1NSX0hXX1JFVl9XQV9SRUcsCisgKiAgICAgYml0cyBbMzoyXSwgMSA9IEIsIDIgPSBDLgorICoKKyAqICAgICBOT1RFOiAgVGhpcyBjb21wZW5zYXRpb24gaXMgaW4gYWRkaXRpb24gdG8gYW55IHNhdHVyYXRpb24gYmFja29mZiB0aGF0CisgKiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBhcHBsaWVkIGluIGFuIGVhcmxpZXIgc3RlcC4KKyAqCisgKgorICogMTApIFNlbGVjdCB0aGUgZ2FpbiB0YWJsZSwgYmFzZWQgb24gYmFuZCAoMi40IHZzIDUgR0h6KS4KKyAqCisgKiAgICAgTGltaXQgdGhlIGFkanVzdGVkIGlkeCB0byBzdGF5IHdpdGhpbiB0aGUgdGFibGUhCisgKgorICoKKyAqIDExKSBSZWFkIGdhaW4gdGFibGUgZW50cmllcyBmb3IgRFNQIGFuZCByYWRpbyBnYWluLCBwbGFjZSBpbnRvIGFwcHJvcHJpYXRlCisgKiAgICAgbG9jYXRpb24ocykgaW4gY29tbWFuZCAoc3RydWN0IGlsNDk2NV90eHBvd2VydGFibGVfY21kKS4KKyAqLworCisvKioKKyAqIFdoZW4gTUlNTyBpcyB1c2VkICgyIHRyYW5zbWl0dGVycyBvcGVyYXRpbmcgc2ltdWx0YW5lb3VzbHkpLCBkcml2ZXIgc2hvdWxkCisgKiBsaW1pdCBlYWNoIHRyYW5zbWl0dGVyIHRvIGRlbGl2ZXIgYSBtYXggb2YgMyBkQiBiZWxvdyB0aGUgcmVndWxhdG9yeSBsaW1pdAorICogZm9yIHRoZSBkZXZpY2UuICBUaGF0IGlzLCB1c2UgaGFsZiBwb3dlciBmb3IgZWFjaCB0cmFuc21pdHRlciwgc28gdG90YWwKKyAqIHR4cG93ZXIgaXMgd2l0aGluIHJlZ3VsYXRvcnkgbGltaXRzLgorICoKKyAqIFRoZSB2YWx1ZSAiNiIgcmVwcmVzZW50cyBudW1iZXIgb2Ygc3RlcHMgaW4gZ2FpbiB0YWJsZSB0byByZWR1Y2UgcG93ZXIgMyBkQi4KKyAqIEVhY2ggc3RlcCBpcyAxLzIgZEIuCisgKi8KKyNkZWZpbmUgSUxfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTiAoNikKKworLyoqCisgKiBDQ0sgZ2FpbiBjb21wZW5zYXRpb24uCisgKgorICogV2hlbiBjYWxjdWxhdGluZyB0eHBvd2VycyBmb3IgQ0NLLCBhZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZSB0YXJnZXQgcG93ZXIKKyAqIGlzIHdpdGhpbiByZWd1bGF0b3J5IGFuZCBzYXR1cmF0aW9uIGxpbWl0cywgZHJpdmVyIG11c3QgYWRkaXRpb25hbGx5CisgKiBiYWNrIG9mZiBnYWluIGJ5IGFkZGluZyB0aGVzZSB2YWx1ZXMgdG8gdGhlIGdhaW4gdGFibGUgaWR4LgorICoKKyAqIEhhcmR3YXJlIHJldiBmb3IgNDk2NSBjYW4gYmUgZGV0ZXJtaW5lZCBieSByZWFkaW5nIENTUl9IV19SRVZfV0FfUkVHLAorICogYml0cyBbMzoyXSwgMSA9IEIsIDIgPSBDLgorICovCisjZGVmaW5lIElMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQl9TVEVQICg5KQorI2RlZmluZSBJTF9UWF9QT1dFUl9DQ0tfQ09NUEVOU0FUSU9OX0NfU1RFUCAoNSkKKworLyoKKyAqIDQ5NjUgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgY29tcGVuc2F0aW9uIGZvciB0eHBvd2VyCisgKi8KKyNkZWZpbmUgVFhfUE9XRVJfSUxfVk9MVEFHRV9DT0RFU19QRVJfMDNWICAgKDcpCisKKy8qKgorICogR2FpbiB0YWJsZXMuCisgKgorICogVGhlIGZvbGxvd2luZyB0YWJsZXMgY29udGFpbiBwYWlyIG9mIHZhbHVlcyBmb3Igc2V0dGluZyB0eHBvd2VyLCBpLmUuCisgKiBnYWluIHNldHRpbmdzIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBkZXZpY2UncyBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IgKERTUCksCisgKiBhbmQgZm9yIHRoZSBhbmFsb2cgZ2FpbiBzdHJ1Y3R1cmUgb2YgdGhlIHRyYW5zbWl0dGVyLgorICoKKyAqIEVhY2ggZW50cnkgaW4gdGhlIGdhaW4gdGFibGVzIHJlcHJlc2VudHMgYSBzdGVwIG9mIDEvMiBkQi4gIE5vdGUgdGhhdCB0aGVzZQorICogYXJlICpyZWxhdGl2ZSogc3RlcHMsIG5vdCBpbmRpY2F0aW9ucyBvZiBhYnNvbHV0ZSBvdXRwdXQgcG93ZXIuICBPdXRwdXQKKyAqIHBvd2VyIHZhcmllcyB3aXRoIHRlbXBlcmF0dXJlLCB2b2x0YWdlLCBhbmQgY2hhbm5lbCBmcmVxdWVuY3ksIGFuZCBhbHNvCisgKiByZXF1aXJlcyBjb25zaWRlcmF0aW9uIG9mIGF2ZXJhZ2UgcG93ZXIgKHRvIHNhdGlzZnkgcmVndWxhdG9yeSBjb25zdHJhaW50cyksCisgKiBhbmQgcGVhayBwb3dlciAodG8gYXZvaWQgZGlzdG9ydGlvbiBvZiB0aGUgb3V0cHV0IHNpZ25hbCkuCisgKgorICogRWFjaCBlbnRyeSBjb250YWlucyB0d28gdmFsdWVzOgorICogMSkgIERTUCBnYWluIChvciBzb21ldGltZXMgY2FsbGVkIERTUCBhdHRlbnVhdGlvbikuICBUaGlzIGlzIGEgZmluZS1ncmFpbmVkCisgKiAgICAgbGluZWFyIHZhbHVlIHRoYXQgbXVsdGlwbGllcyB0aGUgb3V0cHV0IG9mIHRoZSBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IsCisgKiAgICAgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlIGFuYWxvZyByYWRpby4KKyAqIDIpICBSYWRpbyBnYWluLiAgVGhpcyBzZXRzIHRoZSBhbmFsb2cgZ2FpbiBvZiB0aGUgcmFkaW8gVHggcGF0aC4KKyAqICAgICBJdCBpcyBhIGNvYXJzZXIgc2V0dGluZywgYW5kIGJlaGF2ZXMgaW4gYSBsb2dhcml0aG1pYyAoZEIpIGZhc2hpb24uCisgKgorICogRUVQUk9NIGNvbnRhaW5zIGZhY3RvcnkgY2FsaWJyYXRpb24gZGF0YSBmb3IgdHhwb3dlci4gIFRoaXMgbWFwcyBhY3R1YWwKKyAqIG1lYXN1cmVkIHR4cG93ZXIgbGV2ZWxzIHRvIGdhaW4gc2V0dGluZ3MgaW4gdGhlICJ3ZWxsIGtub3duIiB0YWJsZXMKKyAqIGJlbG93ICgid2VsbC1rbm93biIgbWVhbnMgaGVyZSB0aGF0IGJvdGggZmFjdG9yeSBjYWxpYnJhdGlvbiAqYW5kKiB0aGUKKyAqIGRyaXZlciB3b3JrIHdpdGggdGhlIHNhbWUgdGFibGUpLgorICoKKyAqIFRoZXJlIGFyZSBzZXBhcmF0ZSB0YWJsZXMgZm9yIDIuNCBHSHogYW5kIDUgR0h6IGJhbmRzLiAgVGhlIDUgR0h6IHRhYmxlCisgKiBoYXMgYW4gZXh0ZW5zaW9uIChpbnRvIG5lZ2F0aXZlIGlkeGVzKSwgaW4gY2FzZSB0aGUgZHJpdmVyIG5lZWRzIHRvCisgKiBib29zdCBwb3dlciBzZXR0aW5nIGZvciBoaWdoIGRldmljZSB0ZW1wZXJhdHVyZXMgKGhpZ2hlciB0aGFuIHdvdWxkIGJlCisgKiBwcmVzZW50IGR1cmluZyBmYWN0b3J5IGNhbGlicmF0aW9uKS4gIEEgNSBHaHogRUVQUk9NIGlkeCBvZiAiNDAiCisgKiBjb3JyZXNwb25kcyB0byB0aGUgNDl0aCBlbnRyeSBpbiB0aGUgdGFibGUgdXNlZCBieSB0aGUgZHJpdmVyLgorICovCisjZGVmaW5lIE1JTl9UWF9HQUlOX0lEWAkJKDApCS8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgMi40ICovCisjZGVmaW5lIE1JTl9UWF9HQUlOX0lEWF81MkdIWl9FWFQJKC05KQkvKiBoaWdoZXN0IGdhaW4sIGxvd2VzdCBpZHgsIDUgKi8KKworLyoqCisgKiAyLjQgR0h6IGdhaW4gdGFibGUKKyAqCisgKiBJbmRleCAgICBEc3AgZ2FpbiAgIFJhZGlvIGdhaW4KKyAqICAgMCAgICAgICAgMTEwICAgICAgICAgMHgzZiAgICAgIChoaWdoZXN0IGdhaW4pCisgKiAgIDEgICAgICAgIDEwNCAgICAgICAgIDB4M2YKKyAqICAgMiAgICAgICAgIDk4ICAgICAgICAgMHgzZgorICogICAzICAgICAgICAxMTAgICAgICAgICAweDNlCisgKiAgIDQgICAgICAgIDEwNCAgICAgICAgIDB4M2UKKyAqICAgNSAgICAgICAgIDk4ICAgICAgICAgMHgzZQorICogICA2ICAgICAgICAxMTAgICAgICAgICAweDNkCisgKiAgIDcgICAgICAgIDEwNCAgICAgICAgIDB4M2QKKyAqICAgOCAgICAgICAgIDk4ICAgICAgICAgMHgzZAorICogICA5ICAgICAgICAxMTAgICAgICAgICAweDNjCisgKiAgMTAgICAgICAgIDEwNCAgICAgICAgIDB4M2MKKyAqICAxMSAgICAgICAgIDk4ICAgICAgICAgMHgzYworICogIDEyICAgICAgICAxMTAgICAgICAgICAweDNiCisgKiAgMTMgICAgICAgIDEwNCAgICAgICAgIDB4M2IKKyAqICAxNCAgICAgICAgIDk4ICAgICAgICAgMHgzYgorICogIDE1ICAgICAgICAxMTAgICAgICAgICAweDNhCisgKiAgMTYgICAgICAgIDEwNCAgICAgICAgIDB4M2EKKyAqICAxNyAgICAgICAgIDk4ICAgICAgICAgMHgzYQorICogIDE4ICAgICAgICAxMTAgICAgICAgICAweDM5CisgKiAgMTkgICAgICAgIDEwNCAgICAgICAgIDB4MzkKKyAqICAyMCAgICAgICAgIDk4ICAgICAgICAgMHgzOQorICogIDIxICAgICAgICAxMTAgICAgICAgICAweDM4CisgKiAgMjIgICAgICAgIDEwNCAgICAgICAgIDB4MzgKKyAqICAyMyAgICAgICAgIDk4ICAgICAgICAgMHgzOAorICogIDI0ICAgICAgICAxMTAgICAgICAgICAweDM3CisgKiAgMjUgICAgICAgIDEwNCAgICAgICAgIDB4MzcKKyAqICAyNiAgICAgICAgIDk4ICAgICAgICAgMHgzNworICogIDI3ICAgICAgICAxMTAgICAgICAgICAweDM2CisgKiAgMjggICAgICAgIDEwNCAgICAgICAgIDB4MzYKKyAqICAyOSAgICAgICAgIDk4ICAgICAgICAgMHgzNgorICogIDMwICAgICAgICAxMTAgICAgICAgICAweDM1CisgKiAgMzEgICAgICAgIDEwNCAgICAgICAgIDB4MzUKKyAqICAzMiAgICAgICAgIDk4ICAgICAgICAgMHgzNQorICogIDMzICAgICAgICAxMTAgICAgICAgICAweDM0CisgKiAgMzQgICAgICAgIDEwNCAgICAgICAgIDB4MzQKKyAqICAzNSAgICAgICAgIDk4ICAgICAgICAgMHgzNAorICogIDM2ICAgICAgICAxMTAgICAgICAgICAweDMzCisgKiAgMzcgICAgICAgIDEwNCAgICAgICAgIDB4MzMKKyAqICAzOCAgICAgICAgIDk4ICAgICAgICAgMHgzMworICogIDM5ICAgICAgICAxMTAgICAgICAgICAweDMyCisgKiAgNDAgICAgICAgIDEwNCAgICAgICAgIDB4MzIKKyAqICA0MSAgICAgICAgIDk4ICAgICAgICAgMHgzMgorICogIDQyICAgICAgICAxMTAgICAgICAgICAweDMxCisgKiAgNDMgICAgICAgIDEwNCAgICAgICAgIDB4MzEKKyAqICA0NCAgICAgICAgIDk4ICAgICAgICAgMHgzMQorICogIDQ1ICAgICAgICAxMTAgICAgICAgICAweDMwCisgKiAgNDYgICAgICAgIDEwNCAgICAgICAgIDB4MzAKKyAqICA0NyAgICAgICAgIDk4ICAgICAgICAgMHgzMAorICogIDQ4ICAgICAgICAxMTAgICAgICAgICAgMHg2CisgKiAgNDkgICAgICAgIDEwNCAgICAgICAgICAweDYKKyAqICA1MCAgICAgICAgIDk4ICAgICAgICAgIDB4NgorICogIDUxICAgICAgICAxMTAgICAgICAgICAgMHg1CisgKiAgNTIgICAgICAgIDEwNCAgICAgICAgICAweDUKKyAqICA1MyAgICAgICAgIDk4ICAgICAgICAgIDB4NQorICogIDU0ICAgICAgICAxMTAgICAgICAgICAgMHg0CisgKiAgNTUgICAgICAgIDEwNCAgICAgICAgICAweDQKKyAqICA1NiAgICAgICAgIDk4ICAgICAgICAgIDB4NAorICogIDU3ICAgICAgICAxMTAgICAgICAgICAgMHgzCisgKiAgNTggICAgICAgIDEwNCAgICAgICAgICAweDMKKyAqICA1OSAgICAgICAgIDk4ICAgICAgICAgIDB4MworICogIDYwICAgICAgICAxMTAgICAgICAgICAgMHgyCisgKiAgNjEgICAgICAgIDEwNCAgICAgICAgICAweDIKKyAqICA2MiAgICAgICAgIDk4ICAgICAgICAgIDB4MgorICogIDYzICAgICAgICAxMTAgICAgICAgICAgMHgxCisgKiAgNjQgICAgICAgIDEwNCAgICAgICAgICAweDEKKyAqICA2NSAgICAgICAgIDk4ICAgICAgICAgIDB4MQorICogIDY2ICAgICAgICAxMTAgICAgICAgICAgMHgwCisgKiAgNjcgICAgICAgIDEwNCAgICAgICAgICAweDAKKyAqICA2OCAgICAgICAgIDk4ICAgICAgICAgIDB4MAorICogIDY5ICAgICAgICAgOTcgICAgICAgICAgICAwCisgKiAgNzAgICAgICAgICA5NiAgICAgICAgICAgIDAKKyAqICA3MSAgICAgICAgIDk1ICAgICAgICAgICAgMAorICogIDcyICAgICAgICAgOTQgICAgICAgICAgICAwCisgKiAgNzMgICAgICAgICA5MyAgICAgICAgICAgIDAKKyAqICA3NCAgICAgICAgIDkyICAgICAgICAgICAgMAorICogIDc1ICAgICAgICAgOTEgICAgICAgICAgICAwCisgKiAgNzYgICAgICAgICA5MCAgICAgICAgICAgIDAKKyAqICA3NyAgICAgICAgIDg5ICAgICAgICAgICAgMAorICogIDc4ICAgICAgICAgODggICAgICAgICAgICAwCisgKiAgNzkgICAgICAgICA4NyAgICAgICAgICAgIDAKKyAqICA4MCAgICAgICAgIDg2ICAgICAgICAgICAgMAorICogIDgxICAgICAgICAgODUgICAgICAgICAgICAwCisgKiAgODIgICAgICAgICA4NCAgICAgICAgICAgIDAKKyAqICA4MyAgICAgICAgIDgzICAgICAgICAgICAgMAorICogIDg0ICAgICAgICAgODIgICAgICAgICAgICAwCisgKiAgODUgICAgICAgICA4MSAgICAgICAgICAgIDAKKyAqICA4NiAgICAgICAgIDgwICAgICAgICAgICAgMAorICogIDg3ICAgICAgICAgNzkgICAgICAgICAgICAwCisgKiAgODggICAgICAgICA3OCAgICAgICAgICAgIDAKKyAqICA4OSAgICAgICAgIDc3ICAgICAgICAgICAgMAorICogIDkwICAgICAgICAgNzYgICAgICAgICAgICAwCisgKiAgOTEgICAgICAgICA3NSAgICAgICAgICAgIDAKKyAqICA5MiAgICAgICAgIDc0ICAgICAgICAgICAgMAorICogIDkzICAgICAgICAgNzMgICAgICAgICAgICAwCisgKiAgOTQgICAgICAgICA3MiAgICAgICAgICAgIDAKKyAqICA5NSAgICAgICAgIDcxICAgICAgICAgICAgMAorICogIDk2ICAgICAgICAgNzAgICAgICAgICAgICAwCisgKiAgOTcgICAgICAgICA2OSAgICAgICAgICAgIDAKKyAqICA5OCAgICAgICAgIDY4ICAgICAgICAgICAgMAorICovCisKKy8qKgorICogNSBHSHogZ2FpbiB0YWJsZQorICoKKyAqIEluZGV4ICAgIERzcCBnYWluICAgUmFkaW8gZ2FpbgorICogIC05IAkgICAgICAxMjMgICAgICAgICAweDNGICAgICAgKGhpZ2hlc3QgZ2FpbikKKyAqICAtOCAJICAgICAgMTE3ICAgICAgICAgMHgzRgorICogIC03ICAgICAgICAxMTAgICAgICAgICAweDNGCisgKiAgLTYgICAgICAgIDEwNCAgICAgICAgIDB4M0YKKyAqICAtNSAgICAgICAgIDk4ICAgICAgICAgMHgzRgorICogIC00ICAgICAgICAxMTAgICAgICAgICAweDNFCisgKiAgLTMgICAgICAgIDEwNCAgICAgICAgIDB4M0UKKyAqICAtMiAgICAgICAgIDk4ICAgICAgICAgMHgzRQorICogIC0xICAgICAgICAxMTAgICAgICAgICAweDNECisgKiAgIDAgICAgICAgIDEwNCAgICAgICAgIDB4M0QKKyAqICAgMSAgICAgICAgIDk4ICAgICAgICAgMHgzRAorICogICAyICAgICAgICAxMTAgICAgICAgICAweDNDCisgKiAgIDMgICAgICAgIDEwNCAgICAgICAgIDB4M0MKKyAqICAgNCAgICAgICAgIDk4ICAgICAgICAgMHgzQworICogICA1ICAgICAgICAxMTAgICAgICAgICAweDNCCisgKiAgIDYgICAgICAgIDEwNCAgICAgICAgIDB4M0IKKyAqICAgNyAgICAgICAgIDk4ICAgICAgICAgMHgzQgorICogICA4ICAgICAgICAxMTAgICAgICAgICAweDNBCisgKiAgIDkgICAgICAgIDEwNCAgICAgICAgIDB4M0EKKyAqICAxMCAgICAgICAgIDk4ICAgICAgICAgMHgzQQorICogIDExICAgICAgICAxMTAgICAgICAgICAweDM5CisgKiAgMTIgICAgICAgIDEwNCAgICAgICAgIDB4MzkKKyAqICAxMyAgICAgICAgIDk4ICAgICAgICAgMHgzOQorICogIDE0ICAgICAgICAxMTAgICAgICAgICAweDM4CisgKiAgMTUgICAgICAgIDEwNCAgICAgICAgIDB4MzgKKyAqICAxNiAgICAgICAgIDk4ICAgICAgICAgMHgzOAorICogIDE3ICAgICAgICAxMTAgICAgICAgICAweDM3CisgKiAgMTggICAgICAgIDEwNCAgICAgICAgIDB4MzcKKyAqICAxOSAgICAgICAgIDk4ICAgICAgICAgMHgzNworICogIDIwICAgICAgICAxMTAgICAgICAgICAweDM2CisgKiAgMjEgICAgICAgIDEwNCAgICAgICAgIDB4MzYKKyAqICAyMiAgICAgICAgIDk4ICAgICAgICAgMHgzNgorICogIDIzICAgICAgICAxMTAgICAgICAgICAweDM1CisgKiAgMjQgICAgICAgIDEwNCAgICAgICAgIDB4MzUKKyAqICAyNSAgICAgICAgIDk4ICAgICAgICAgMHgzNQorICogIDI2ICAgICAgICAxMTAgICAgICAgICAweDM0CisgKiAgMjcgICAgICAgIDEwNCAgICAgICAgIDB4MzQKKyAqICAyOCAgICAgICAgIDk4ICAgICAgICAgMHgzNAorICogIDI5ICAgICAgICAxMTAgICAgICAgICAweDMzCisgKiAgMzAgICAgICAgIDEwNCAgICAgICAgIDB4MzMKKyAqICAzMSAgICAgICAgIDk4ICAgICAgICAgMHgzMworICogIDMyICAgICAgICAxMTAgICAgICAgICAweDMyCisgKiAgMzMgICAgICAgIDEwNCAgICAgICAgIDB4MzIKKyAqICAzNCAgICAgICAgIDk4ICAgICAgICAgMHgzMgorICogIDM1ICAgICAgICAxMTAgICAgICAgICAweDMxCisgKiAgMzYgICAgICAgIDEwNCAgICAgICAgIDB4MzEKKyAqICAzNyAgICAgICAgIDk4ICAgICAgICAgMHgzMQorICogIDM4ICAgICAgICAxMTAgICAgICAgICAweDMwCisgKiAgMzkgICAgICAgIDEwNCAgICAgICAgIDB4MzAKKyAqICA0MCAgICAgICAgIDk4ICAgICAgICAgMHgzMAorICogIDQxICAgICAgICAxMTAgICAgICAgICAweDI1CisgKiAgNDIgICAgICAgIDEwNCAgICAgICAgIDB4MjUKKyAqICA0MyAgICAgICAgIDk4ICAgICAgICAgMHgyNQorICogIDQ0ICAgICAgICAxMTAgICAgICAgICAweDI0CisgKiAgNDUgICAgICAgIDEwNCAgICAgICAgIDB4MjQKKyAqICA0NiAgICAgICAgIDk4ICAgICAgICAgMHgyNAorICogIDQ3ICAgICAgICAxMTAgICAgICAgICAweDIzCisgKiAgNDggICAgICAgIDEwNCAgICAgICAgIDB4MjMKKyAqICA0OSAgICAgICAgIDk4ICAgICAgICAgMHgyMworICogIDUwICAgICAgICAxMTAgICAgICAgICAweDIyCisgKiAgNTEgICAgICAgIDEwNCAgICAgICAgIDB4MTgKKyAqICA1MiAgICAgICAgIDk4ICAgICAgICAgMHgxOAorICogIDUzICAgICAgICAxMTAgICAgICAgICAweDE3CisgKiAgNTQgICAgICAgIDEwNCAgICAgICAgIDB4MTcKKyAqICA1NSAgICAgICAgIDk4ICAgICAgICAgMHgxNworICogIDU2ICAgICAgICAxMTAgICAgICAgICAweDE2CisgKiAgNTcgICAgICAgIDEwNCAgICAgICAgIDB4MTYKKyAqICA1OCAgICAgICAgIDk4ICAgICAgICAgMHgxNgorICogIDU5ICAgICAgICAxMTAgICAgICAgICAweDE1CisgKiAgNjAgICAgICAgIDEwNCAgICAgICAgIDB4MTUKKyAqICA2MSAgICAgICAgIDk4ICAgICAgICAgMHgxNQorICogIDYyICAgICAgICAxMTAgICAgICAgICAweDE0CisgKiAgNjMgICAgICAgIDEwNCAgICAgICAgIDB4MTQKKyAqICA2NCAgICAgICAgIDk4ICAgICAgICAgMHgxNAorICogIDY1ICAgICAgICAxMTAgICAgICAgICAweDEzCisgKiAgNjYgICAgICAgIDEwNCAgICAgICAgIDB4MTMKKyAqICA2NyAgICAgICAgIDk4ICAgICAgICAgMHgxMworICogIDY4ICAgICAgICAxMTAgICAgICAgICAweDEyCisgKiAgNjkgICAgICAgIDEwNCAgICAgICAgIDB4MDgKKyAqICA3MCAgICAgICAgIDk4ICAgICAgICAgMHgwOAorICogIDcxICAgICAgICAxMTAgICAgICAgICAweDA3CisgKiAgNzIgICAgICAgIDEwNCAgICAgICAgIDB4MDcKKyAqICA3MyAgICAgICAgIDk4ICAgICAgICAgMHgwNworICogIDc0ICAgICAgICAxMTAgICAgICAgICAweDA2CisgKiAgNzUgICAgICAgIDEwNCAgICAgICAgIDB4MDYKKyAqICA3NiAgICAgICAgIDk4ICAgICAgICAgMHgwNgorICogIDc3ICAgICAgICAxMTAgICAgICAgICAweDA1CisgKiAgNzggICAgICAgIDEwNCAgICAgICAgIDB4MDUKKyAqICA3OSAgICAgICAgIDk4ICAgICAgICAgMHgwNQorICogIDgwICAgICAgICAxMTAgICAgICAgICAweDA0CisgKiAgODEgICAgICAgIDEwNCAgICAgICAgIDB4MDQKKyAqICA4MiAgICAgICAgIDk4ICAgICAgICAgMHgwNAorICogIDgzICAgICAgICAxMTAgICAgICAgICAweDAzCisgKiAgODQgICAgICAgIDEwNCAgICAgICAgIDB4MDMKKyAqICA4NSAgICAgICAgIDk4ICAgICAgICAgMHgwMworICogIDg2ICAgICAgICAxMTAgICAgICAgICAweDAyCisgKiAgODcgICAgICAgIDEwNCAgICAgICAgIDB4MDIKKyAqICA4OCAgICAgICAgIDk4ICAgICAgICAgMHgwMgorICogIDg5ICAgICAgICAxMTAgICAgICAgICAweDAxCisgKiAgOTAgICAgICAgIDEwNCAgICAgICAgIDB4MDEKKyAqICA5MSAgICAgICAgIDk4ICAgICAgICAgMHgwMQorICogIDkyICAgICAgICAxMTAgICAgICAgICAweDAwCisgKiAgOTMgICAgICAgIDEwNCAgICAgICAgIDB4MDAKKyAqICA5NCAgICAgICAgIDk4ICAgICAgICAgMHgwMAorICogIDk1ICAgICAgICAgOTMgICAgICAgICAweDAwCisgKiAgOTYgICAgICAgICA4OCAgICAgICAgIDB4MDAKKyAqICA5NyAgICAgICAgIDgzICAgICAgICAgMHgwMAorICogIDk4ICAgICAgICAgNzggICAgICAgICAweDAwCisgKi8KKworLyoqCisgKiBTYW5pdHkgY2hlY2tzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgRUVQUk9NIHJlZ3VsYXRvcnkgbGV2ZWxzLgorICogSWYgRUVQUk9NIHZhbHVlcyBmYWxsIG91dHNpZGUgTUlOL01BWCByYW5nZSwgdXNlIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIFJlZ3VsYXRvcnkgbGltaXRzIHJlZmVyIHRvIHRoZSBtYXhpbXVtIGF2ZXJhZ2UgdHhwb3dlciBhbGxvd2VkIGJ5CisgKiByZWd1bGF0b3J5IGFnZW5jaWVzIGluIHRoZSBnZW9ncmFwaGllcyBpbiB3aGljaCB0aGUgZGV2aWNlIGlzIG1lYW50CisgKiB0byBiZSBvcGVyYXRlZC4gIFRoZXNlIGxpbWl0cyBhcmUgU0tVLXNwZWNpZmljIChpLmUuIGdlb2dyYXBoeS1zcGVjaWZpYyksCisgKiBhbmQgY2hhbm5lbC1zcGVjaWZpYzsgZWFjaCBjaGFubmVsIGhhcyBhbiBpbmRpdmlkdWFsIHJlZ3VsYXRvcnkgbGltaXQKKyAqIGxpc3RlZCBpbiB0aGUgRUVQUk9NLgorICoKKyAqIFVuaXRzIGFyZSBpbiBoYWxmLWRCbSAoaS5lLiAiMzQiIG1lYW5zIDE3IGRCbSkuCisgKi8KKyNkZWZpbmUgSUxfVFhfUE9XRVJfREVGQVVMVF9SRUdVTEFUT1JZXzI0ICAgKDM0KQorI2RlZmluZSBJTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfNTIgICAoMzQpCisjZGVmaW5lIElMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUlOICAgICAgICAgICgwKQorI2RlZmluZSBJTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01BWCAgICAgICAgICAoMzQpCisKKy8qKgorICogU2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEVFUFJPTSBzYXR1cmF0aW9uIGxldmVscy4KKyAqIElmIEVFUFJPTSB2YWx1ZXMgZmFsbCBvdXRzaWRlIE1JTi9NQVggcmFuZ2UsIHVzZSBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBTYXR1cmF0aW9uIGlzIHRoZSBoaWdoZXN0IGxldmVsIHRoYXQgdGhlIG91dHB1dCBwb3dlciBhbXBsaWZpZXIgY2FuIHByb2R1Y2UKKyAqIHdpdGhvdXQgc2lnbmlmaWNhbnQgY2xpcHBpbmcgZGlzdG9ydGlvbi4gIFRoaXMgaXMgYSAicGVhayIgcG93ZXIgbGV2ZWwuCisgKiBEaWZmZXJlbnQgdHlwZXMgb2YgbW9kdWxhdGlvbiAoaS5lLiB2YXJpb3VzICJyYXRlcyIsIGFuZCBPRkRNIHZzLiBDQ0spCisgKiByZXF1aXJlIGRpZmZlcmluZyBhbW91bnRzIG9mIGJhY2tvZmYsIHJlbGF0aXZlIHRvIHRoZWlyIGF2ZXJhZ2UgcG93ZXIgb3V0cHV0LAorICogaW4gb3JkZXIgdG8gYXZvaWQgY2xpcHBpbmcgZGlzdG9ydGlvbi4KKyAqCisgKiBEcml2ZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBpdCBpcyB2aW9sYXRpbmcgbmVpdGhlciB0aGUgc2F0dXJhdGlvbiBsaW1pdCwKKyAqIG5vciB0aGUgcmVndWxhdG9yeSBsaW1pdCwgd2hlbiBjYWxjdWxhdGluZyBUeCBwb3dlciBzZXR0aW5ncyBmb3IgdmFyaW91cworICogcmF0ZXMuCisgKgorICogVW5pdHMgYXJlIGluIGhhbGYtZEJtIChpLmUuICIzOCIgbWVhbnMgMTkgZEJtKS4KKyAqLworI2RlZmluZSBJTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQgICAoMzgpCisjZGVmaW5lIElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl81MiAgICgzOCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfU0FUVVJBVElPTl9NSU4gICAgICAgICAgKDIwKQorI2RlZmluZSBJTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01BWCAgICAgICAgICAoNTApCisKKy8qKgorICogQ2hhbm5lbCBncm91cHMgdXNlZCBmb3IgVHggQXR0ZW51YXRpb24gY2FsaWJyYXRpb24gKE1JTU8gdHggY2hhbm5lbCBiYWxhbmNlKQorICogYW5kIHRoZXJtYWwgVHhwb3dlciBjYWxpYnJhdGlvbi4KKyAqCisgKiBXaGVuIGNhbGN1bGF0aW5nIHR4cG93ZXIsIGRyaXZlciBtdXN0IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgZGV2aWNlCisgKiB0ZW1wZXJhdHVyZTsgaGlnaGVyIHRlbXBlcmF0dXJlIHJlcXVpcmVzIGhpZ2hlciBnYWluLiAgRHJpdmVyIG11c3QgY2FsY3VsYXRlCisgKiBjdXJyZW50IHRlbXBlcmF0dXJlIChzZWUgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iKSwgdGhlbiBjb21wYXJlIHZzLgorICogZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSBpbiBFRVBST007IGlmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgaGlnaGVyCisgKiB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0ICppbmNyZWFzZSogZ2FpbiBieSBwcm9wb3J0aW9ucyBzaG93bgorICogaW4gdGFibGUgYmVsb3cuICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGxvd2VyIHRoYW4gZmFjdG9yeSwgZHJpdmVyIG11c3QKKyAqICpkZWNyZWFzZSogZ2Fpbi4KKyAqCisgKiBEaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcyByZXF1aXJlIGRpZmZlcmVudCBjb21wZW5zYXRpb24sIGFzIHNob3duIGJlbG93LgorICovCisvKiBHcm91cCAwLCA1LjIgR0h6IGNoIDM0LTQzOiAgNC41IGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IxX0ZDSCAzNAorI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjFfTENIIDQzCisKKy8qIEdyb3VwIDEsIDUuMyBHSHogY2ggNDQtNzA6ICA0LjAgZGVncmVlcyBwZXIgMS8yIGRCLiAqLworI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjJfRkNIIDQ0CisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSMl9MQ0ggNzAKKworLyogR3JvdXAgMiwgNS41IEdIeiBjaCA3MS0xMjQ6ICA0LjAgZGVncmVlcyBwZXIgMS8yIGRCLiAqLworI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjNfRkNIIDcxCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSM19MQ0ggMTI0CisKKy8qIEdyb3VwIDMsIDUuNyBHSHogY2ggMTI1LTIwMDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSNF9GQ0ggMTI1CisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSNF9MQ0ggMjAwCisKKy8qIEdyb3VwIDQsIDIuNCBHSHogYWxsIGNoYW5uZWxzOiAgMy41IGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1I1X0ZDSCAxCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSNV9MQ0ggMjAKKworZW51bSB7CisJQ0FMSUJfQ0hfR1JPVVBfMSA9IDAsCisJQ0FMSUJfQ0hfR1JPVVBfMiA9IDEsCisJQ0FMSUJfQ0hfR1JPVVBfMyA9IDIsCisJQ0FMSUJfQ0hfR1JPVVBfNCA9IDMsCisJQ0FMSUJfQ0hfR1JPVVBfNSA9IDQsCisJQ0FMSUJfQ0hfR1JPVVBfTUFYCit9OworCisvKioqKioqKioqKioqKioqKioqKioqIEVORCBUWFBPV0VSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFR4L1J4IFF1ZXVlcworICoKKyAqIE1vc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBpcyB2aWEgcXVldWVzIG9mIGRhdGEgYnVmZmVycy4KKyAqIEZvciBleGFtcGxlLCBhbGwgY29tbWFuZHMgdGhhdCB0aGUgZHJpdmVyIGlzc3VlcyB0byBkZXZpY2UncyBlbWJlZGRlZAorICogY29udHJvbGxlciAodUNvZGUpIGFyZSB2aWEgdGhlIGNvbW1hbmQgcXVldWUgKG9uZSBvZiB0aGUgVHggcXVldWVzKS4gIEFsbAorICogdUNvZGUgY29tbWFuZCByZXNwb25zZXMvcmVwbGllcy9ub3RpZmljYXRpb25zLCBpbmNsdWRpbmcgUnggZnJhbWVzLCBhcmUKKyAqIGNvbnZleWVkIGZyb20gdUNvZGUgdG8gZHJpdmVyIHZpYSB0aGUgUnggcXVldWUuCisgKgorICogTW9zdCBzdXBwb3J0IGZvciB0aGVzZSBxdWV1ZXMsIGluY2x1ZGluZyBoYW5kc2hha2Ugc3VwcG9ydCwgcmVzaWRlcyBpbgorICogc3RydWN0dXJlcyBpbiBob3N0IERSQU0sIHNoYXJlZCBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuICBXaGVuCisgKiBhbGxvY2F0aW5nIHRoaXMgbWVtb3J5LCB0aGUgZHJpdmVyIG11c3QgbWFrZSBzdXJlIHRoYXQgZGF0YSB3cml0dGVuIGJ5CisgKiB0aGUgaG9zdCBDUFUgdXBkYXRlcyBEUkFNIGltbWVkaWF0ZWx5IChhbmQgZG9lcyBub3QgZ2V0ICJzdHVjayIgaW4gQ1BVJ3MKKyAqIGNhY2hlIG1lbW9yeSksIHNvIERSQU0gYW5kIGNhY2hlIGFyZSBjb25zaXN0ZW50LCBhbmQgdGhlIGRldmljZSBjYW4KKyAqIGltbWVkaWF0ZWx5IHNlZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIGRyaXZlci4KKyAqCisgKiA0OTY1IHN1cHBvcnRzIHVwIHRvIDE2IERSQU0tYmFzZWQgVHggcXVldWVzLCBhbmQgc2VydmljZXMgdGhlc2UgcXVldWVzIHZpYQorICogdXAgdG8gNyBETUEgY2hhbm5lbHMgKEZJRk9zKS4gIEVhY2ggVHggcXVldWUgaXMgc3VwcG9ydGVkIGJ5IGEgY2lyY3VsYXIgYXJyYXkKKyAqIGluIERSQU0gY29udGFpbmluZyAyNTYgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpLgorICovCisjZGVmaW5lIElMNDlfTlVNX0ZJRk9TCTcKKyNkZWZpbmUgSUw0OV9DTURfRklGT19OVU0JNAorI2RlZmluZSBJTDQ5X05VTV9RVUVVRVMJMTYKKyNkZWZpbmUgSUw0OV9OVU1fQU1QRFVfUVVFVUVTCTgKKworLyoqCisgKiBzdHJ1Y3QgaWw0OTY1X3NjaGVkcV9iY190YmwKKyAqCisgKiBCeXRlIENvdW50IHRhYmxlCisgKgorICogRWFjaCBUeCBxdWV1ZSB1c2VzIGEgYnl0ZS1jb3VudCB0YWJsZSBjb250YWluaW5nIDMyMCBlbnRyaWVzOgorICogb25lIDE2LWJpdCBlbnRyeSBmb3IgZWFjaCBvZiAyNTYgVEZEcywgcGx1cyBhbiBhZGRpdGlvbmFsIDY0IGVudHJpZXMgdGhhdAorICogZHVwbGljYXRlIHRoZSBmaXJzdCA2NCBlbnRyaWVzICh0byBhdm9pZCB3cmFwLWFyb3VuZCB3aXRoaW4gYSBUeCB3aW47CisgKiBtYXggVHggd2luIGlzIDY0IFRGRHMpLgorICoKKyAqIFdoZW4gZHJpdmVyIHNldHMgdXAgYSBuZXcgVEZELCBpdCBtdXN0IGFsc28gZW50ZXIgdGhlIHRvdGFsIGJ5dGUgY291bnQKKyAqIG9mIHRoZSBmcmFtZSB0byBiZSB0cmFuc21pdHRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBieXRlCisgKiBjb3VudCB0YWJsZSBmb3IgdGhlIGNob3NlbiBUeCBxdWV1ZS4gIElmIHRoZSBURkQgaWR4IGlzIDAtNjMsIHRoZSBkcml2ZXIKKyAqIG11c3QgZHVwbGljYXRlIHRoZSBieXRlIGNvdW50IGVudHJ5IGluIGNvcnJlc3BvbmRpbmcgaWR4IDI1Ni0zMTkuCisgKgorICogcGFkZGluZyBwdXRzIGVhY2ggYnl0ZSBjb3VudCB0YWJsZSBvbiBhIDEwMjQtYnl0ZSBib3VuZGFyeTsKKyAqIDQ5NjUgYXNzdW1lcyB0YWJsZXMgYXJlIHNlcGFyYXRlZCBieSAxMDI0IGJ5dGVzLgorICovCitzdHJ1Y3QgaWw0OTY1X3NjZF9iY190YmwgeworCV9fbGUxNiB0ZmRfb2Zmc2V0W1RGRF9RVUVVRV9CQ19TSVpFXTsKKwl1OCBwYWRbMTAyNCAtIChURkRfUVVFVUVfQkNfU0laRSkgKiBzaXplb2YoX19sZTE2KV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIElMNDk2NV9SVENfSU5TVF9MT1dFUl9CT1VORAkJKDB4MDAwMDAwKQorCisvKiBSU1NJIHRvIGRCbSAqLworI2RlZmluZSBJTDQ5NjVfUlNTSV9PRkZTRVQJNDQKKworLyogUENJIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQJMHgwNDEKKworLyogUENJIHJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOCTB4MDEKKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOCTB4MDIKKworI2RlZmluZSBJTDQ5NjVfREVGQVVMVF9UWF9SRVRSWSAgMTUKKworLyogRUVQUk9NICovCisjZGVmaW5lIElMNDk2NV9GSVJTVF9BTVBEVV9RVUVVRQkxMAorCisvKiBDYWxpYnJhdGlvbiAqLwordm9pZCBpbDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB2b2lkICpzdGF0X3Jlc3ApOwordm9pZCBpbDQ5NjVfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB2b2lkICpyZXNwKTsKK3ZvaWQgaWw0OTY1X2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogRGVidWcgKi8KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworc3NpemVfdCBpbDQ5NjVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgaWw0OTY1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGlsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQlsb2ZmX3QgKnBwb3MpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmxvdyBIYW5kbGVyIERlZmluaXRpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBUaGlzIEkvTyBhcmVhIGlzIGRpcmVjdGx5IHJlYWQvd3JpdGFibGUgYnkgZHJpdmVyIChlLmcuIExpbnV4IHVzZXMgd3JpdGVsKCkpCisgKiBBZGRyZXNzZXMgYXJlIG9mZnNldHMgZnJvbSBkZXZpY2UncyBQQ0kgaGFyZHdhcmUgYmFzZSBhZGRyZXNzLgorICovCisjZGVmaW5lIEZINDlfTUVNX0xPV0VSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDEwMDApCisjZGVmaW5lIEZINDlfTUVNX1VQUEVSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDIwMDApCisKKy8qKgorICogS2VlcC1XYXJtIChLVykgYnVmZmVyIGJhc2UgYWRkcmVzcy4KKyAqCisgKiBEcml2ZXIgbXVzdCBhbGxvY2F0ZSBhIDRLQnl0ZSBidWZmZXIgdGhhdCBpcyB1c2VkIGJ5IDQ5NjUgZm9yIGtlZXBpbmcgdGhlCisgKiBob3N0IERSQU0gcG93ZXJlZCBvbiAodmlhIGR1bW15IGFjY2Vzc2VzIHRvIERSQU0pIHRvIG1haW50YWluIGxvdy1sYXRlbmN5CisgKiBEUkFNIGFjY2VzcyB3aGVuIDQ5NjUgaXMgVHhpbmcgb3IgUnhpbmcuICBUaGUgZHVtbXkgYWNjZXNzZXMgcHJldmVudCBob3N0CisgKiBmcm9tIGdvaW5nIGludG8gYSBwb3dlci1zYXZpbmdzIG1vZGUgdGhhdCB3b3VsZCBjYXVzZSBoaWdoZXIgRFJBTSBsYXRlbmN5LAorICogYW5kIHBvc3NpYmxlIGRhdGEgb3Zlci91bmRlci1ydW5zLCBiZWZvcmUgYWxsIFR4L1J4IGlzIGNvbXBsZXRlLgorICoKKyAqIERyaXZlciBsb2FkcyBGSDQ5X0tXX01FTV9BRERSX1JFRyB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDM1OjQpCisgKiBvZiB0aGUgYnVmZmVyLCB3aGljaCBtdXN0IGJlIDRLIGFsaWduZWQuICBPbmNlIHRoaXMgaXMgc2V0IHVwLCB0aGUgNDk2NQorICogYXV0b21hdGljYWxseSBpbnZva2VzIGtlZXAtd2FybSBhY2Nlc3NlcyB3aGVuIG5vcm1hbCBhY2Nlc3NlcyBtaWdodCBub3QKKyAqIGJlIHN1ZmZpY2llbnQgdG8gbWFpbnRhaW4gZmFzdCBEUkFNIHJlc3BvbnNlLgorICoKKyAqIEJpdCBmaWVsZHM6CisgKiAgMzEtMDogIEtlZXAtd2FybSBidWZmZXIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo0XSwgbXVzdCBiZSA0SyBhbGlnbmVkCisgKi8KKyNkZWZpbmUgRkg0OV9LV19NRU1fQUREUl9SRUcJCSAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5N0MpCisKKy8qKgorICogVEZEIENpcmN1bGFyIEJ1ZmZlcnMgQmFzZSAoQ0JCQykgYWRkcmVzc2VzCisgKgorICogNDk2NSBoYXMgMTYgYmFzZSBwb2ludGVyIHJlZ2lzdGVycywgb25lIGZvciBlYWNoIG9mIDE2IGhvc3QtRFJBTS1yZXNpZGVudAorICogY2lyY3VsYXIgYnVmZmVycyAoQ0JzL3F1ZXVlcykgY29udGFpbmluZyBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9ycyAoVEZEcykKKyAqIChzZWUgc3RydWN0IGlsX3RmZF9mcmFtZSkuICBUaGVzZSAxNiBwb2ludGVyIHJlZ2lzdGVycyBhcmUgb2Zmc2V0IGJ5IDB4MDQKKyAqIGJ5dGVzIGZyb20gb25lIGFub3RoZXIuICBFYWNoIFRGRCBjaXJjdWxhciBidWZmZXIgaW4gRFJBTSBtdXN0IGJlIDI1Ni1ieXRlCisgKiBhbGlnbmVkIChhZGRyZXNzIGJpdHMgMC03IG11c3QgYmUgMCkuCisgKgorICogQml0IGZpZWxkcyBpbiBlYWNoIHBvaW50ZXIgcmVnaXN0ZXI6CisgKiAgMjctMDogVEZEIENCIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6OF0sIG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZAorICovCisjZGVmaW5lIEZINDlfTUVNX0NCQkNfTE9XRVJfQk9VTkQgICAgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5RDApCisjZGVmaW5lIEZINDlfTUVNX0NCQkNfVVBQRVJfQk9VTkQgICAgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhBMTApCisKKy8qIEZpbmQgVEZEIENCIGJhc2UgcG9pbnRlciBmb3IgZ2l2ZW4gcXVldWUgKHJhbmdlIDAtMTUpLiAqLworI2RlZmluZSBGSDQ5X01FTV9DQkJDX1FVRVVFKHgpICAoRkg0OV9NRU1fQ0JCQ19MT1dFUl9CT1VORCArICh4KSAqIDB4NCkKKworLyoqCisgKiBSeCBTUkFNIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKFJTQ1NSKQorICoKKyAqIFRoZXNlIHJlZ2lzdGVycyBwcm92aWRlIGhhbmRzaGFrZSBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBmb3IgdGhlIFJ4IHF1ZXVlCisgKiAodGhpcyBxdWV1ZSBoYW5kbGVzICphbGwqIGNvbW1hbmQgcmVzcG9uc2VzLCBub3RpZmljYXRpb25zLCBSeCBkYXRhLCBldGMuCisgKiBzZW50IGZyb20gNDk2NSB1Q29kZSB0byBob3N0IGRyaXZlcikuICBVbmxpa2UgVHgsIHRoZXJlIGlzIG9ubHkgb25lIFJ4CisgKiBxdWV1ZSwgYW5kIG9ubHkgb25lIFJ4IERNQS9GSUZPIGNoYW5uZWwuICBBbHNvIHVubGlrZSBUeCwgd2hpY2ggY2FuCisgKiBjb25jYXRlbmF0ZSB1cCB0byAyMCBEUkFNIGJ1ZmZlcnMgdG8gZm9ybSBhIFR4IGZyYW1lLCBlYWNoIFJlY2VpdmUgQnVmZmVyCisgKiBEZXNjcmlwdG9yIChSQkQpIHBvaW50cyB0byBvbmx5IG9uZSBSeCBCdWZmZXIgKFJCKTsgdGhlcmUgaXMgYSAxOjEKKyAqIG1hcHBpbmcgYmV0d2VlbiBSQkRzIGFuZCBSQnMuCisgKgorICogRHJpdmVyIG11c3QgYWxsb2NhdGUgaG9zdCBEUkFNIG1lbW9yeSBmb3IgdGhlIGZvbGxvd2luZywgYW5kIHNldCB0aGUKKyAqIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWFjaCBpbnRvIDQ5NjUgcmVnaXN0ZXJzOgorICoKKyAqIDEpICBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpIGNpcmN1bGFyIGJ1ZmZlciAoQ0IpLCB0eXBpY2FsbHkgd2l0aCAyNTYKKyAqICAgICBlbnRyaWVzIChhbHRob3VnaCBhbnkgcG93ZXIgb2YgMiwgdXAgdG8gNDA5NiwgaXMgc2VsZWN0YWJsZSBieSBkcml2ZXIpLgorICogICAgIEVhY2ggZW50cnkgKDEgZHdvcmQpIHBvaW50cyB0byBhIHJlY2VpdmUgYnVmZmVyIChSQikgb2YgY29uc2lzdGVudCBzaXplCisgKiAgICAgKHR5cGljYWxseSA0SywgYWx0aG91Z2ggOEsgb3IgMTZLIGFyZSBhbHNvIHNlbGVjdGFibGUgYnkgZHJpdmVyKS4KKyAqICAgICBEcml2ZXIgc2V0cyB1cCBSQiBzaXplIGFuZCBudW1iZXIgb2YgUkJEcyBpbiB0aGUgQ0IgdmlhIFJ4IGNvbmZpZworICogICAgIHJlZ2lzdGVyIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRy4KKyAqCisgKiAgICAgQml0IGZpZWxkcyB3aXRoaW4gb25lIFJCRDoKKyAqICAgICAyNy0wOiAgUmVjZWl2ZSBCdWZmZXIgcGh5c2ljYWwgYWRkcmVzcyBiaXRzIFszNTo4XSwgMjU2LWJ5dGUgYWxpZ25lZAorICoKKyAqICAgICBEcml2ZXIgc2V0cyBwaHlzaWNhbCBhZGRyZXNzIFszNTo4XSBvZiBiYXNlIG9mIFJCRCBjaXJjdWxhciBidWZmZXIKKyAqICAgICBpbnRvIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcgWzI3OjBdLgorICoKKyAqIDIpICBSeCBzdGF0dXMgYnVmZmVyLCA4IGJ5dGVzLCBpbiB3aGljaCA0OTY1IGluZGljYXRlcyB3aGljaCBSeCBCdWZmZXJzCisgKiAgICAgKFJCcykgaGF2ZSBiZWVuIGZpbGxlZCwgdmlhIGEgIndyaXRlIHBvaW50ZXIiLCBhY3R1YWxseSB0aGUgaWR4IG9mCisgKiAgICAgdGhlIFJCJ3MgY29ycmVzcG9uZGluZyBSQkQgd2l0aGluIHRoZSBjaXJjdWxhciBidWZmZXIuICBEcml2ZXIgc2V0cworICogICAgIHBoeXNpY2FsIGFkZHJlc3MgWzM1OjRdIGludG8gRkg0OV9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHIFszMTowXS4KKyAqCisgKiAgICAgQml0IGZpZWxkcyBpbiBsb3dlciBkd29yZCBvZiBSeCBzdGF0dXMgYnVmZmVyICh1cHBlciBkd29yZCBub3QgdXNlZAorICogICAgIGJ5IGRyaXZlcjsgc2VlIHN0cnVjdCBpbDQ5NjVfc2hhcmVkLCB2YWwwKToKKyAqICAgICAzMS0xMjogIE5vdCB1c2VkIGJ5IGRyaXZlcgorICogICAgIDExLSAwOiAgSW5kZXggb2YgbGFzdCBmaWxsZWQgUnggYnVmZmVyIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICg0OTY1IHdyaXRlcywgZHJpdmVyIHJlYWRzIHRoaXMgdmFsdWUpCisgKgorICogQXMgdGhlIGRyaXZlciBwcmVwYXJlcyBSZWNlaXZlIEJ1ZmZlcnMgKFJCcykgZm9yIDQ5NjUgdG8gZmlsbCwgZHJpdmVyIG11c3QKKyAqIGVudGVyIHBvaW50ZXJzIHRvIHRoZXNlIFJCcyBpbnRvIGNvbnRpZ3VvdXMgUkJEIGNpcmN1bGFyIGJ1ZmZlciBlbnRyaWVzLAorICogYW5kIHVwZGF0ZSB0aGUgNDk2NSdzICJ3cml0ZSIgaWR4IHJlZ2lzdGVyLAorICogRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRy4KKyAqCisgKiBUaGlzICJ3cml0ZSIgaWR4IGNvcnJlc3BvbmRzIHRvIHRoZSAqbmV4dCogUkJEIHRoYXQgdGhlIGRyaXZlciB3aWxsIG1ha2UKKyAqIGF2YWlsYWJsZSwgaS5lLiBvbmUgUkJEIHBhc3QgdGhlIHRhaWwgb2YgdGhlIHJlYWR5LXRvLWZpbGwgUkJEcyB3aXRoaW4KKyAqIHRoZSBjaXJjdWxhciBidWZmZXIuICBUaGlzIHZhbHVlIHNob3VsZCBpbml0aWFsbHkgYmUgMCAoYmVmb3JlIHByZXBhcmluZyBhbnkKKyAqIFJCcyksIHNob3VsZCBiZSA4IGFmdGVyIHByZXBhcmluZyB0aGUgZmlyc3QgOCBSQnMgKGZvciBleGFtcGxlKSwgYW5kIG11c3QKKyAqIHdyYXAgYmFjayB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAoYnV0IGRvbid0IHdyYXAgYmVmb3JlCisgKiAicmVhZCIgaWR4IGhhcyBhZHZhbmNlZCBwYXN0IDEhICBTZWUgYmVsb3cpLgorICogTk9URTogIDQ5NjUgRVhQRUNUUyBUSEUgV1JJVEUgSURYIFRPIEJFIElOQ1JFTUVOVEVEIElOIE1VTFRJUExFUyBPRiA4LgorICoKKyAqIEFzIHRoZSA0OTY1IGZpbGxzIFJCcyAocmVmZXJlbmNlZCBmcm9tIGNvbnRpZ3VvdXMgUkJEcyB3aXRoaW4gdGhlIGNpcmN1bGFyCisgKiBidWZmZXIpLCBpdCB1cGRhdGVzIHRoZSBSeCBzdGF0dXMgYnVmZmVyIGluIGhvc3QgRFJBTSwgMikgZGVzY3JpYmVkIGFib3ZlLAorICogdG8gdGVsbCB0aGUgZHJpdmVyIHRoZSBpZHggb2YgdGhlIGxhdGVzdCBmaWxsZWQgUkJELiAgVGhlIGRyaXZlciBtdXN0CisgKiByZWFkIHRoaXMgInJlYWQiIGlkeCBmcm9tIERSQU0gYWZ0ZXIgcmVjZWl2aW5nIGFuIFJ4IGludGVycnVwdCBmcm9tIDQ5NjUuCisgKgorICogVGhlIGRyaXZlciBtdXN0IGFsc28gaW50ZXJuYWxseSBrZWVwIHRyYWNrIG9mIGEgdGhpcmQgaWR4LCB3aGljaCBpcyB0aGUKKyAqIG5leHQgUkJEIHRvIHByb2Nlc3MuICBXaGVuIHJlY2VpdmluZyBhbiBSeCBpbnRlcnJ1cHQsIGRyaXZlciBzaG91bGQgcHJvY2VzcworICogYWxsIGZpbGxlZCBidXQgdW5wcm9jZXNzZWQgUkJzIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIFJCCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAicmVhZCIgaWR4LiAgRm9yIGV4YW1wbGUsIGlmICJyZWFkIiBpZHggYmVjb21lcyAiMSIsCisgKiBkcml2ZXIgbWF5IHByb2Nlc3MgdGhlIFJCIHBvaW50ZWQgdG8gYnkgUkJEIDAuICBEZXBlbmRpbmcgb24gdm9sdW1lIG9mCisgKiB0cmFmZmljLCB0aGVyZSBtYXkgYmUgbWFueSBSQnMgdG8gcHJvY2Vzcy4KKyAqCisgKiBJZiByZWFkIGlkeCA9PSB3cml0ZSBpZHgsIDQ5NjUgdGhpbmtzIHRoZXJlIGlzIG5vIHJvb20gdG8gcHV0IG5ldyBkYXRhLgorICogRHVlIHRvIHRoaXMsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxsZWQgUkJzIGlzIDI1NSwgaW5zdGVhZCBvZiAyNTYuICBUbworICogYmUgc2FmZSwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSBnYXAgb2YgYXQgbGVhc3QgMiBSQkRzIGJldHdlZW4gIndyaXRlIgorICogYW5kICJyZWFkIiBpZHhlczsgdGhhdCBpcywgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyNTQKKyAqIGJ1ZmZlcnMgd2FpdGluZyB0byBiZSBmaWxsZWQuCisgKi8KKyNkZWZpbmUgRkg0OV9NRU1fUlNDU1JfTE9XRVJfQk9VTkQJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhCQzApCisjZGVmaW5lIEZINDlfTUVNX1JTQ1NSX1VQUEVSX0JPVU5ECShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4QzAwKQorI2RlZmluZSBGSDQ5X01FTV9SU0NTUl9DSE5MMAkJKEZINDlfTUVNX1JTQ1NSX0xPV0VSX0JPVU5EKQorCisvKioKKyAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiA4LWJ5dGUgUnggU3RhdHVzIGJ1ZmZlci4KKyAqIEJpdCBmaWVsZHM6CisgKiAgMzEtMDogUnggc3RhdHVzIGJ1ZmZlciBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjRdLCBtdXN0IDE2LWJ5dGUgYWxpZ25lZC4KKyAqLworI2RlZmluZSBGSDQ5X1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcJKEZINDlfTUVNX1JTQ1NSX0NITkwwKQorCisvKioKKyAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBSeCBCdWZmZXIgRGVzY3JpcHRvciBDaXJjdWxhciBCdWZmZXIuCisgKiBCaXQgZmllbGRzOgorICogIDI3LTA6ICBSQkQgQ0QgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo4XSwgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkLgorICovCisjZGVmaW5lIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcJKEZINDlfTUVNX1JTQ1NSX0NITkwwICsgMHgwMDQpCisKKy8qKgorICogUnggd3JpdGUgcG9pbnRlciAoaWR4LCByZWFsbHkhKS4KKyAqIEJpdCBmaWVsZHM6CisgKiAgMTEtMDogIEluZGV4IG9mIGRyaXZlcidzIG1vc3QgcmVjZW50IHByZXBhcmVkLXRvLWJlLWZpbGxlZCBSQkQsICsgMS4KKyAqICAgICAgICAgTk9URTogIEZvciAyNTYtZW50cnkgY2lyY3VsYXIgYnVmZmVyLCB1c2Ugb25seSBiaXRzIFs3OjBdLgorICovCisjZGVmaW5lIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcJKEZINDlfTUVNX1JTQ1NSX0NITkwwICsgMHgwMDgpCisjZGVmaW5lIEZINDlfUlNDU1JfQ0hOTDBfV1BUUiAgICAgICAgKEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcpCisKKy8qKgorICogUnggQ29uZmlnL1N0YXR1cyBSZWdpc3RlcnMgKFJDU1IpCisgKiBSeCBDb25maWcgUmVnIGZvciBjaGFubmVsIDAgKG9ubHkgY2hhbm5lbCB1c2VkKQorICoKKyAqIERyaXZlciBtdXN0IGluaXRpYWxpemUgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHIGFzIGZvbGxvd3MgZm9yCisgKiBub3JtYWwgb3BlcmF0aW9uIChzZWUgYml0IGZpZWxkcykuCisgKgorICogQ2xlYXJpbmcgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHIHRvIDAgdHVybnMgb2ZmIFJ4IERNQS4KKyAqIERyaXZlciBzaG91bGQgcG9sbCBGSDQ5X01FTV9SU1NSX1JYX1NUQVRVU19SRUcJZm9yCisgKiBGSDQ5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRSAoYml0IDI0KSBiZWZvcmUgY29udGludWluZy4KKyAqCisgKiBCaXQgZmllbGRzOgorICogMzEtMzA6IFJ4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAorICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQorICogMjktMjQ6IHJlc2VydmVkCisgKiAyMy0yMDogIyBSQkRzIGluIGNpcmN1bGFyIGJ1ZmZlciA9IDJedmFsdWU7IHVzZSAiOCIgZm9yIDI1NiBSQkRzIChub3JtYWwpLAorICogICAgICAgIG1pbiAiNSIgZm9yIDMyIFJCRHMsIG1heCAiMTIiIGZvciA0MDk2IFJCRHMuCisgKiAxOS0xODogcmVzZXJ2ZWQKKyAqIDE3LTE2OiBzaXplIG9mIGVhY2ggcmVjZWl2ZSBidWZmZXI7ICcwMCcgNEsgKG5vcm1hbCksICcwMScgOEssCisgKiAgICAgICAgJzEwJyAxMkssICcxMScgMTZLLgorICogMTUtMTQ6IHJlc2VydmVkCisgKiAxMy0xMjogSVJRIGRlc3RpbmF0aW9uOyAnMDAnIG5vbmUsICcwMScgaG9zdCBkcml2ZXIgKG5vcm1hbCBvcGVyYXRpb24pCisgKiAxMS0gNDogdGltZW91dCBmb3IgY2xvc2luZyBSeCBidWZmZXIgYW5kIGludGVycnVwdGluZyBob3N0ICh1bml0cyAzMiB1c2VjKQorICogICAgICAgIHR5cGljYWwgdmFsdWUgMHgxMCAoYWJvdXQgMS8yIG1zZWMpCisgKiAgMy0gMDogcmVzZXJ2ZWQKKyAqLworI2RlZmluZSBGSDQ5X01FTV9SQ1NSX0xPV0VSX0JPVU5EICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhDMDApCisjZGVmaW5lIEZINDlfTUVNX1JDU1JfVVBQRVJfQk9VTkQgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweENDMCkKKyNkZWZpbmUgRkg0OV9NRU1fUkNTUl9DSE5MMCAgICAgICAgICAgIChGSDQ5X01FTV9SQ1NSX0xPV0VSX0JPVU5EKQorCisjZGVmaW5lIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRwkoRkg0OV9NRU1fUkNTUl9DSE5MMCkKKworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1RJTUVPVVRfTVNLICgweDAwMDAwRkYwKQkvKiBiaXRzIDQtMTEgKi8KKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9NU0sgICAoMHgwMDAwMTAwMCkJLyogYml0cyAxMiAqLworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgKDB4MDAwMDgwMDApCS8qIGJpdCAxNSAqLworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1NJWkVfTVNLICAgKDB4MDAwMzAwMDApCS8qIGJpdHMgMTYtMTcgKi8KKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19SQkRCQ19TSVpFX01TSyAoMHgwMEYwMDAwMCkJLyogYml0cyAyMC0yMyAqLworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX0RNQV9DSE5MX0VOX01TSyAoMHhDMDAwMDAwMCkJLyogYml0cyAzMC0zMSAqLworCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MJKDIwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MJKDQpCisjZGVmaW5lIFJYX1JCX1RJTUVPVVQJKDB4MTApCisKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX1BBVVNFX1ZBTCAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX0NITkxfRU5fUEFVU0VfRU9GX1ZBTCAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9FTkFCTEVfVkFMICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV80SyAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfOEsgICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzEySyAgICgweDAwMDIwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV8xNksgICAoMHgwMDAzMDAwMCkKKworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfSUdOT1JFX1JYRl9FTVBUWSAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTk9fSU5UX1ZBTCAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9JTlRfSE9TVF9WQUwgICgweDAwMDAxMDAwKQorCisvKioKKyAqIFJ4IFNoYXJlZCBTdGF0dXMgUmVnaXN0ZXJzIChSU1NSKQorICoKKyAqIEFmdGVyIHN0b3BwaW5nIFJ4IERNQSBjaGFubmVsICh3cml0aW5nIDAgdG8KKyAqIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyksIGRyaXZlciBtdXN0IHBvbGwKKyAqIEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRyB1bnRpbCBSeCBjaGFubmVsIGlzIGlkbGUuCisgKgorICogQml0IGZpZWxkczoKKyAqICAyNDogIDEgPSBDaGFubmVsIDAgaXMgaWRsZQorICoKKyAqIEZINDlfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHIGFuZCBGSDQ5X01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSVgorICogY29udGFpbiBkZWZhdWx0IHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYmUgYWx0ZXJlZCBieSB0aGUgZHJpdmVyLgorICovCisjZGVmaW5lIEZINDlfTUVNX1JTU1JfTE9XRVJfQk9VTkQgICAgICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4QzQwKQorI2RlZmluZSBGSDQ5X01FTV9SU1NSX1VQUEVSX0JPVU5EICAgICAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEQwMCkKKworI2RlZmluZSBGSDQ5X01FTV9SU1NSX1NIQVJFRF9DVFJMX1JFRyAgICAgICAoRkg0OV9NRU1fUlNTUl9MT1dFUl9CT1VORCkKKyNkZWZpbmUgRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHCShGSDQ5X01FTV9SU1NSX0xPV0VSX0JPVU5EICsgMHgwMDQpCisjZGVmaW5lIEZINDlfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWXAorCQkJCQkoRkg0OV9NRU1fUlNTUl9MT1dFUl9CT1VORCArIDB4MDA4KQorCisjZGVmaW5lIEZINDlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFCSgweDAxMDAwMDAwKQorCisjZGVmaW5lIEZINDlfTUVNX1RGRElCX1JFRzFfQUREUl9CSVRTSElGVAkyOAorCisvKiBURkRCICBBcmVhIC0gVEZEcyBidWZmZXIgdGFibGUgKi8KKyNkZWZpbmUgRkg0OV9NRU1fVEZESUJfRFJBTV9BRERSX0xTQl9NU0sgICAgICAoMHhGRkZGRkZGRikKKyNkZWZpbmUgRkg0OV9URkRJQl9MT1dFUl9CT1VORCAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDkwMCkKKyNkZWZpbmUgRkg0OV9URkRJQl9VUFBFUl9CT1VORCAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDk1OCkKKyNkZWZpbmUgRkg0OV9URkRJQl9DVFJMMF9SRUcoX2NobmwpICAoRkg0OV9URkRJQl9MT1dFUl9CT1VORCArIDB4OCAqIChfY2hubCkpCisjZGVmaW5lIEZINDlfVEZESUJfQ1RSTDFfUkVHKF9jaG5sKSAgKEZINDlfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpICsgMHg0KQorCisvKioKKyAqIFRyYW5zbWl0IERNQSBDaGFubmVsIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVycyAoVENTUikKKyAqCisgKiA0OTY1IGhhcyBvbmUgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3IgZWFjaCBvZiA4IFR4IERNQS9GSUZPIGNoYW5uZWxzCisgKiBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgKGRvbid0IGNvbmZ1c2UgdGhlc2Ugd2l0aCB0aGUgMTYgVHggcXVldWVzIGluIERSQU0sCisgKiB3aGljaCBmZWVkIHRoZSBETUEvRklGTyBjaGFubmVscyk7IGNvbmZpZyByZWdzIGFyZSBzZXBhcmF0ZWQgYnkgMHgyMCBieXRlcy4KKyAqCisgKiBUbyB1c2UgYSBUeCBETUEgY2hhbm5lbCwgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBpdHMKKyAqIEZINDlfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2hubCkgd2l0aDoKKyAqCisgKiBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKKyAqIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwKKyAqCisgKiBBbGwgb3RoZXIgYml0cyBzaG91bGQgYmUgMC4KKyAqCisgKiBCaXQgZmllbGRzOgorICogMzEtMzA6IFR4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAorICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQorICogMjktIDQ6IFJlc2VydmVkLCBzZXQgdG8gIjAiCisgKiAgICAgMzogRW5hYmxlIGludGVybmFsIERNQSByZXF1ZXN0cyAoMSwgbm9ybWFsIG9wZXJhdGlvbiksIGRpc2FibGUgKDApCisgKiAgMi0gMDogUmVzZXJ2ZWQsIHNldCB0byAiMCIKKyAqLworI2RlZmluZSBGSDQ5X1RDU1JfTE9XRVJfQk9VTkQgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVVBQRVJfQk9VTkQgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RTYwKQorCisvKiBGaW5kIENvbnRyb2wvU3RhdHVzIHJlZyBmb3IgZ2l2ZW4gVHggRE1BL0ZJRk8gY2hhbm5lbCAqLworI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIEZINTBfVENTUl9DSE5MX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKKworLyogVENTUjogdHhfY29uZmlnIHJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKF9jaG5sKQlcCisJCShGSDQ5X1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSkKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQ1JFRElUX1JFRyhfY2hubCkJXAorCQkoRkg0OV9UQ1NSX0xPV0VSX0JPVU5EICsgMHgyMCAqIChfY2hubCkgKyAweDQpCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKF9jaG5sKQlcCisJCShGSDQ5X1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSArIDB4OCkKKworI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSVgkJKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFCSgweDAwMDAwMDA4KQorCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfTk9JTlQJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfRU5EVEZECSgweDAwMTAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0lGVEZECSgweDAwMjAwMDAwKQorCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX0VORFRGRAkoMHgwMDQwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX0lGVEZECSgweDAwODAwMDAwKQorCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFX0VPRgkoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRQkoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9FTVBUWQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfV0FJVAkoMHgwMDAwMjAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfVkFMSUQJKDB4MDAwMDAwMDMpCisKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX05VTQkJKDIwKQorI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfSURYCQkoMTIpCisKKy8qKgorICogVHggU2hhcmVkIFN0YXR1cyBSZWdpc3RlcnMgKFRTU1IpCisgKgorICogQWZ0ZXIgc3RvcHBpbmcgVHggRE1BIGNoYW5uZWwgKHdyaXRpbmcgMCB0bworICogRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaG5sKSksIGRyaXZlciBtdXN0IHBvbGwKKyAqIEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHIHVudGlsIHNlbGVjdGVkIFR4IGNoYW5uZWwgaXMgaWRsZQorICogKGNoYW5uZWwncyBidWZmZXJzIGVtcHR5IHwgbm8gcGVuZGluZyByZXF1ZXN0cykuCisgKgorICogQml0IGZpZWxkczoKKyAqIDMxLTI0OiAgMSA9IENoYW5uZWwgYnVmZmVycyBlbXB0eSAoY2hhbm5lbCA3OjApCisgKiAyMy0xNjogIDEgPSBObyBwZW5kaW5nIHJlcXVlc3RzIChjaGFubmVsIDc6MCkKKyAqLworI2RlZmluZSBGSDQ5X1RTU1JfTE9XRVJfQk9VTkQJCShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RUEwKQorI2RlZmluZSBGSDQ5X1RTU1JfVVBQRVJfQk9VTkQJCShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RUMwKQorCisjZGVmaW5lIEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHCQkoRkg0OV9UU1NSX0xPV0VSX0JPVU5EICsgMHgwMTApCisKKy8qKgorICogQml0IGZpZWxkcyBmb3IgVFNTUihUeCBTaGFyZWQgU3RhdHVzICYgQ29udHJvbCkgZXJyb3Igc3RhdHVzIHJlZ2lzdGVyOgorICogMzE6ICBJbmRpY2F0ZXMgYW4gYWRkcmVzcyBlcnJvciB3aGVuIGFjY2Vzc2VkIHRvIGludGVybmFsIG1lbW9yeQorICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZworICogMzA6ICBJbmRpY2F0ZXMgdGhhdCBIb3N0IGRpZCBub3Qgc2VuZCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGR3b3JkcyB0byBGSAorICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZworICogMTYtOTpFYWNoIHN0YXR1cyBiaXQgaXMgZm9yIG9uZSBjaGFubmVsLiBJbmRpY2F0ZXMgdGhhdCBhbiAoRXJyb3IpIEFjdERNQQorICoJY29tbWFuZCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2NoZWR1bGVyIHdoaWxlIHRoZSBUUkIgd2FzIGFscmVhZHkgZnVsbAorICoJd2l0aCBwcmV2aW91cyBjb21tYW5kCisgKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCisgKiA3LTA6IEVhY2ggc3RhdHVzIGJpdCBpbmRpY2F0ZXMgYSBjaGFubmVsJ3MgVHhDcmVkaXQgZXJyb3IuIFdoZW4gYW4gZXJyb3IKKyAqCWJpdCBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBGSCBoYXMgcmVjZWl2ZWQgYSBmdWxsIGluZGljYXRpb24KKyAqCWZyb20gdGhlIFJUQyBUeEZJRk8gYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBUeENyZWRpdCBjb3VudGVyIHdhcworICoJbm90IGVxdWFsIHRvIHplcm8uIFRoaXMgbWVhbiB0aGF0IHRoZSBjcmVkaXQgbWVjaGFuaXNtIHdhcyBub3QKKyAqCXN5bmNocm9uaXplZCB0byB0aGUgVHhGSUZPIHN0YXR1cworICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZworICovCisjZGVmaW5lIEZINDlfVFNTUl9UWF9FUlJPUl9SRUcJCShGSDQ5X1RTU1JfTE9XRVJfQk9VTkQgKyAweDAxOCkKKworI2RlZmluZSBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaG5sKSAoKDEgPDwgKF9jaG5sKSkgPDwgMTYpCisKKy8qIFR4IHNlcnZpY2UgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRkg0OV9TUlZDX0NITkwJCSg5KQorI2RlZmluZSBGSDQ5X1NSVkNfTE9XRVJfQk9VTkQJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHg5QzgpCisjZGVmaW5lIEZINDlfU1JWQ19VUFBFUl9CT1VORAkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDlEMCkKKyNkZWZpbmUgRkg0OV9TUlZDX0NITkxfU1JBTV9BRERSX1JFRyhfY2hubCkgXAorCQkoRkg0OV9TUlZDX0xPV0VSX0JPVU5EICsgKChfY2hubCkgLSA5KSAqIDB4NCkKKworI2RlZmluZSBGSDQ5X1RYX0NISUNLRU5fQklUU19SRUcJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhFOTgpCisvKiBJbnN0cnVjdCBGSCB0byBpbmNyZW1lbnQgdGhlIHJldHJ5IGNvdW50IG9mIGEgcGFja2V0IHdoZW4KKyAqIGl0IGlzIGJyb3VnaHQgZnJvbSB0aGUgbWVtb3J5IHRvIFRYLUZJRk8KKyAqLworI2RlZmluZSBGSDQ5X1RYX0NISUNLRU5fQklUU19TQ0RfQVVUT19SRVRSWV9FTgkoMHgwMDAwMDAwMikKKworLyogS2VlcCBXYXJtIFNpemUgKi8KKyNkZWZpbmUgSUxfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KKworI2VuZGlmIC8qIF9faWxfNDk2NV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9LY29uZmlnCmluZGV4IGFlZjY1Y2QuLjA1YmQzNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvS2NvbmZpZwpAQCAtMSw0ICsxLDQgQEAKLWNvbmZpZyBJV0xXSUZJX0xFR0FDWQorY29uZmlnIElXTEVHQUNZCiAJdHJpc3RhdGUKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IE5FV19MRURTCkBAIC03LDEzICs3LDEzIEBACiAJc2VsZWN0IE1BQzgwMjExX0xFRFMKIAogbWVudSAiRGVidWdnaW5nIE9wdGlvbnMiCi0JZGVwZW5kcyBvbiBJV0xXSUZJX0xFR0FDWQorCWRlcGVuZHMgb24gSVdMRUdBQ1kKIAotY29uZmlnIElXTFdJRklfTEVHQUNZX0RFQlVHCi0JYm9vbCAiRW5hYmxlIGZ1bGwgZGVidWdnaW5nIG91dHB1dCBpbiA0OTY1IGFuZCAzOTQ1IGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBJV0xXSUZJX0xFR0FDWQorY29uZmlnIElXTEVHQUNZX0RFQlVHCisJYm9vbCAiRW5hYmxlIGZ1bGwgZGVidWdnaW5nIG91dHB1dCBpbiBpd2xlZ2FjeSAoaXdsIDM5NDUvNDk2NSkgZHJpdmVycyIKKwlkZXBlbmRzIG9uIElXTEVHQUNZCiAJLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgZGVidWcgdHJhY2luZyBvdXRwdXQgZm9yIHRoZSBpd2x3aWZpbGVnYWN5CisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBkZWJ1ZyB0cmFjaW5nIG91dHB1dCBmb3IgdGhlIGl3bGVnYWN5CiAJICBkcml2ZXJzLgogCiAJICBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSBrZXJuZWwgbW9kdWxlIGJlaW5nIH4xMDBrIGxhcmdlci4gIFlvdSBjYW4KQEAgLTI5LDQzICsyOSwyNiBAQAogCQkgICUgZWNobyAweDQzZmZmID4gL3N5cy9jbGFzcy9uZXQvd2xhbjAvZGV2aWNlL2RlYnVnX2xldmVsCiAKIAkgIFlvdSBjYW4gZmluZCB0aGUgbGlzdCBvZiBkZWJ1ZyBtYXNrIHZhbHVlcyBpbjoKLQkJICBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpbGVnYWN5L2l3bC1kZWJ1Zy5oCisJCSAgZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmgKIAogCSAgSWYgdGhpcyBpcyB5b3VyIGZpcnN0IHRpbWUgdXNpbmcgdGhpcyBkcml2ZXIsIHlvdSBzaG91bGQgc2F5IFkgaGVyZQogCSAgYXMgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGNhbiBhc3Npc3Qgb3RoZXJzIGluIGhlbHBpbmcgeW91IHJlc29sdmUKIAkgIGFueSBwcm9ibGVtcyB5b3UgbWF5IGVuY291bnRlci4KIAotY29uZmlnIElXTFdJRklfTEVHQUNZX0RFQlVHRlMKLSAgICAgICAgYm9vbCAiNDk2NSBhbmQgMzk0NSBkZWJ1Z2ZzIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gSVdMV0lGSV9MRUdBQ1kgJiYgTUFDODAyMTFfREVCVUdGUworY29uZmlnIElXTEVHQUNZX0RFQlVHRlMKKyAgICAgICAgYm9vbCAiaXdsZWdhY3kgKGl3bCAzOTQ1LzQ5NjUpIGRlYnVnZnMgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBJV0xFR0FDWSAmJiBNQUM4MDIxMV9ERUJVR0ZTCiAgICAgICAgIC0tLWhlbHAtLS0KLQkgIEVuYWJsZSBjcmVhdGlvbiBvZiBkZWJ1Z2ZzIGZpbGVzIGZvciB0aGUgaXdsd2lmaWxlZ2FjeSBkcml2ZXJzLiBUaGlzCisJICBFbmFibGUgY3JlYXRpb24gb2YgZGVidWdmcyBmaWxlcyBmb3IgdGhlIGl3bGVnYWN5IGRyaXZlcnMuIFRoaXMKIAkgIGlzIGEgbG93LWltcGFjdCBvcHRpb24gdGhhdCBhbGxvd3MgZ2V0dGluZyBpbnNpZ2h0IGludG8gdGhlCiAJICBkcml2ZXIncyBzdGF0ZSBhdCBydW50aW1lLgogCi1jb25maWcgSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNJTkcKLQlib29sICJpd2x3aWZpbGVnYWN5IGxlZ2FjeSBkZXZpY2UgYWNjZXNzIHRyYWNpbmciCi0JZGVwZW5kcyBvbiBJV0xXSUZJX0xFR0FDWQotCWRlcGVuZHMgb24gRVZFTlRfVFJBQ0lORwotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gdHJhY2UgYWxsIGNvbW1hbmRzLCBpbmNsdWRpbmcgVFggZnJhbWVzIGFuZCBJTwotCSAgYWNjZXNzZXMsIHNlbnQgdG8gdGhlIGRldmljZS4gSWYgeW91IHNheSB5ZXMsIGl3bHdpZmlsZWdhY3kgd2lsbAotCSAgcmVnaXN0ZXIgd2l0aCB0aGUgZnRyYWNlIGZyYW1ld29yayBmb3IgZXZlbnQgdHJhY2luZyBhbmQgZHVtcAotCSAgYWxsIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIHJpbmdidWZmZXIsIHlvdSBtYXkgbmVlZCB0bwotCSAgaW5jcmVhc2UgdGhlIHJpbmdidWZmZXIgc2l6ZS4gU2VlIHRoZSBmdHJhY2UgZG9jdW1lbnRhdGlvbgotCSAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLQkgIFdoZW4gdHJhY2luZyBpcyBub3QgZW5hYmxlZCwgdGhpcyBvcHRpb24gc3RpbGwgaGFzIHNvbWUKLQkgICh0aG91Z2ggcmF0aGVyIHNtYWxsKSBvdmVyaGVhZC4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWSBzbyB3ZSBjYW4gaGVscCB5b3UgYmV0dGVyIHdoZW4gcHJvYmxlbXMKLQkgIG9jY3VyLgogZW5kbWVudQogCiBjb25maWcgSVdMNDk2NQogCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaUZpIDQ5NjVBR04gKGl3bDQ5NjUpIgogCWRlcGVuZHMgb24gUENJICYmIE1BQzgwMjExCi0Jc2VsZWN0IElXTFdJRklfTEVHQUNZCisJc2VsZWN0IElXTEVHQUNZCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvcgogCkBAIC05Myw3ICs3Niw3IEBACiBjb25maWcgSVdMMzk0NQogCXRyaXN0YXRlICJJbnRlbCBQUk8vV2lyZWxlc3MgMzk0NUFCRy9CRyBOZXR3b3JrIENvbm5lY3Rpb24gKGl3bDM5NDUpIgogCWRlcGVuZHMgb24gUENJICYmIE1BQzgwMjExCi0Jc2VsZWN0IElXTFdJRklfTEVHQUNZCisJc2VsZWN0IElXTEVHQUNZCiAJLS0taGVscC0tLQogCSAgU2VsZWN0IHRvIGJ1aWxkIHRoZSBkcml2ZXIgc3VwcG9ydGluZyB0aGU6CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvTWFrZWZpbGUKaW5kZXggZDU2YWViMy4uYzk4NWEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvTWFrZWZpbGUKQEAgLTEsMjUgKzEsMTcgQEAKLW9iai0kKENPTkZJR19JV0xXSUZJX0xFR0FDWSkJKz0gaXdsLWxlZ2FjeS5vCi1pd2wtbGVnYWN5LW9ianMgCQk6PSBpd2wtY29yZS5vIGl3bC1lZXByb20ubyBpd2wtaGNtZC5vIGl3bC1wb3dlci5vCi1pd2wtbGVnYWN5LW9ianMgCQkrPSBpd2wtcngubyBpd2wtdHgubyBpd2wtc3RhLm8KLWl3bC1sZWdhY3ktb2JqcyAJCSs9IGl3bC1zY2FuLm8gaXdsLWxlZC5vCi1pd2wtbGVnYWN5LSQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMpICs9IGl3bC1kZWJ1Z2ZzLm8KLWl3bC1sZWdhY3ktJChDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNJTkcpICs9IGl3bC1kZXZ0cmFjZS5vCitvYmotJChDT05GSUdfSVdMRUdBQ1kpCSs9IGl3bGVnYWN5Lm8KK2l3bGVnYWN5LW9ianMgCQk6PSBjb21tb24ubworaXdsZWdhY3ktJChDT05GSUdfSVdMRUdBQ1lfREVCVUdGUykgKz0gZGVidWcubwogCi1pd2wtbGVnYWN5LW9ianMgKz0gJChpd2wtbGVnYWN5LW0pCi0KLUNGTEFHU19pd2wtZGV2dHJhY2UubyA6PSAtSSQoc3JjKQoraXdsZWdhY3ktb2JqcyArPSAkKGl3bGVnYWN5LW0pCiAKICMgNDk2NQogb2JqLSQoQ09ORklHX0lXTDQ5NjUpCSs9IGl3bDQ5NjUubwotaXdsNDk2NS1vYmpzCQk6PSBpd2wtNDk2NS5vIGl3bDQ5NjUtYmFzZS5vIGl3bC00OTY1LXJzLm8gaXdsLTQ5NjUtbGVkLm8KLWl3bDQ5NjUtb2JqcwkJKz0gaXdsLTQ5NjUtdWNvZGUubyBpd2wtNDk2NS10eC5vCi1pd2w0OTY1LW9ianMJCSs9IGl3bC00OTY1LWxpYi5vIGl3bC00OTY1LXJ4Lm8gaXdsLTQ5NjUtY2FsaWIubwotaXdsNDk2NS1vYmpzCQkrPSBpd2wtNDk2NS1zdGEubyBpd2wtNDk2NS1lZXByb20ubwotaXdsNDk2NS0kKENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTKSArPSBpd2wtNDk2NS1kZWJ1Z2ZzLm8KK2l3bDQ5NjUtb2JqcwkJOj0gNDk2NS5vIDQ5NjUtbWFjLm8gNDk2NS1ycy5vIDQ5NjUtY2FsaWIubworaXdsNDk2NS0kKENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTKSArPSA0OTY1LWRlYnVnLm8KIAogIyAzOTQ1CiBvYmotJChDT05GSUdfSVdMMzk0NSkJKz0gaXdsMzk0NS5vCi1pd2wzOTQ1LW9ianMJCTo9IGl3bDM5NDUtYmFzZS5vIGl3bC0zOTQ1Lm8gaXdsLTM5NDUtcnMubyBpd2wtMzk0NS1sZWQubwotaXdsMzk0NS0kKENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTKSArPSBpd2wtMzk0NS1kZWJ1Z2ZzLm8KK2l3bDM5NDUtb2JqcwkJOj0gMzk0NS1tYWMubyAzOTQ1Lm8gMzk0NS1ycy5vCitpd2wzOTQ1LSQoQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMpICs9IDM5NDUtZGVidWcubwogCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tYW5kcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbWFuZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRkN2QyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbWFuZHMuaApAQCAtMCwwICsxLDMzNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9faWxfY29tbWFuZHNfaF9fCisjZGVmaW5lIF9faWxfY29tbWFuZHNfaF9fCisKKyNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKworc3RydWN0IGlsX3ByaXY7CisKKy8qIHVDb2RlIHZlcnNpb24gY29udGFpbnMgNCB2YWx1ZXM6IE1ham9yL01pbm9yL0FQSS9TZXJpYWwgKi8KKyNkZWZpbmUgSUxfVUNPREVfTUFKT1IodmVyKQkoKCh2ZXIpICYgMHhGRjAwMDAwMCkgPj4gMjQpCisjZGVmaW5lIElMX1VDT0RFX01JTk9SKHZlcikJKCgodmVyKSAmIDB4MDBGRjAwMDApID4+IDE2KQorI2RlZmluZSBJTF9VQ09ERV9BUEkodmVyKQkoKCh2ZXIpICYgMHgwMDAwRkYwMCkgPj4gOCkKKyNkZWZpbmUgSUxfVUNPREVfU0VSSUFMKHZlcikJKCh2ZXIpICYgMHgwMDAwMDBGRikKKworLyogVHggcmF0ZXMgKi8KKyNkZWZpbmUgSUxfQ0NLX1JBVEVTCTQKKyNkZWZpbmUgSUxfT0ZETV9SQVRFUwk4CisjZGVmaW5lIElMX01BWF9SQVRFUwkoSUxfQ0NLX1JBVEVTICsgSUxfT0ZETV9SQVRFUykKKworZW51bSB7CisJTl9BTElWRSA9IDB4MSwKKwlOX0VSUk9SID0gMHgyLAorCisJLyogUlhPTiBhbmQgUU9TIGNvbW1hbmRzICovCisJQ19SWE9OID0gMHgxMCwKKwlDX1JYT05fQVNTT0MgPSAweDExLAorCUNfUU9TX1BBUkFNID0gMHgxMywKKwlDX1JYT05fVElNSU5HID0gMHgxNCwKKworCS8qIE11bHRpLVN0YXRpb24gc3VwcG9ydCAqLworCUNfQUREX1NUQSA9IDB4MTgsCisJQ19SRU1fU1RBID0gMHgxOSwKKworCS8qIFNlY3VyaXR5ICovCisJQ19XRVBLRVkgPSAweDIwLAorCisJLyogUlgsIFRYLCBMRURzICovCisJTl8zOTQ1X1JYID0gMHgxYiwJLyogMzk0NSBvbmx5ICovCisJQ19UWCA9IDB4MWMsCisJQ19SQVRFX1NDQUxFID0gMHg0NywJLyogMzk0NSBvbmx5ICovCisJQ19MRURTID0gMHg0OCwKKwlDX1RYX0xJTktfUVVBTElUWV9DTUQgPSAweDRlLAkvKiBmb3IgNDk2NSAqLworCisJLyogODAyLjExaCByZWxhdGVkICovCisJQ19DSEFOTkVMX1NXSVRDSCA9IDB4NzIsCisJTl9DSEFOTkVMX1NXSVRDSCA9IDB4NzMsCisJQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzQsCisJTl9TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzUsCisKKwkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisJQ19QT1dFUl9UQkwgPSAweDc3LAorCU5fUE1fU0xFRVAgPSAweDdBLAorCU5fUE1fREVCVUdfU1RBVFMgPSAweDdCLAorCisJLyogU2NhbiBjb21tYW5kcyBhbmQgbm90aWZpY2F0aW9ucyAqLworCUNfU0NBTiA9IDB4ODAsCisJQ19TQ0FOX0FCT1JUID0gMHg4MSwKKwlOX1NDQU5fU1RBUlQgPSAweDgyLAorCU5fU0NBTl9SRVNVTFRTID0gMHg4MywKKwlOX1NDQU5fQ09NUExFVEUgPSAweDg0LAorCisJLyogSUJTUy9BUCBjb21tYW5kcyAqLworCU5fQkVBQ09OID0gMHg5MCwKKwlDX1RYX0JFQUNPTiA9IDB4OTEsCisKKwkvKiBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzICovCisJQ19UWF9QV1JfVEJMID0gMHg5NywKKworCS8qIEJsdWV0b290aCBkZXZpY2UgY29leGlzdGVuY2UgY29uZmlnIGNvbW1hbmQgKi8KKwlDX0JUX0NPTkZJRyA9IDB4OWIsCisKKwkvKiBTdGF0aXN0aWNzICovCisJQ19TVEFUUyA9IDB4OWMsCisJTl9TVEFUUyA9IDB4OWQsCisKKwkvKiBSRi1LSUxMIGNvbW1hbmRzIGFuZCBub3RpZmljYXRpb25zICovCisJTl9DQVJEX1NUQVRFID0gMHhhMSwKKworCS8qIE1pc3NlZCBiZWFjb25zIG5vdGlmaWNhdGlvbiAqLworCU5fTUlTU0VEX0JFQUNPTlMgPSAweGEyLAorCisJQ19DVF9LSUxMX0NPTkZJRyA9IDB4YTQsCisJQ19TRU5TSVRJVklUWSA9IDB4YTgsCisJQ19QSFlfQ0FMSUJSQVRJT04gPSAweGIwLAorCU5fUlhfUEhZID0gMHhjMCwKKwlOX1JYX01QRFUgPSAweGMxLAorCU5fUlggPSAweGMzLAorCU5fQ09NUFJFU1NFRF9CQSA9IDB4YzUsCisKKwlJTF9DTl9NQVggPSAweGZmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMCkKKyAqIENvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnM6CisgKiBDb21tYW5kIGhlYWRlciwgcmF0ZV9uX2ZsYWdzLCB0eHBvd2VyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbF9jbWRfaGVhZGVyIGZsYWdzIHZhbHVlICovCisjZGVmaW5lIElMX0NNRF9GQUlMRURfTVNLIDB4NDAKKworI2RlZmluZSBTRVFfVE9fUVVFVUUocykJKCgocykgPj4gOCkgJiAweDFmKQorI2RlZmluZSBRVUVVRV9UT19TRVEocSkJKCgocSkgJiAweDFmKSA8PCA4KQorI2RlZmluZSBTRVFfVE9fSURYKHMpCSgocykgJiAweGZmKQorI2RlZmluZSBJRFhfVE9fU0VRKGkpCSgoaSkgJiAweGZmKQorI2RlZmluZSBTRVFfSFVHRV9GUkFNRQljcHVfdG9fbGUxNigweDQwMDApCisjZGVmaW5lIFNFUV9SWF9GUkFNRQljcHVfdG9fbGUxNigweDgwMDApCisKKy8qKgorICogc3RydWN0IGlsX2NtZF9oZWFkZXIKKyAqCisgKiBUaGlzIGhlYWRlciBmb3JtYXQgYXBwZWFycyBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY29tbWFuZCBzZW50IGZyb20gdGhlCisgKiBkcml2ZXIsIGFuZCBlYWNoIHJlc3BvbnNlL25vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tIHVDb2RlLgorICovCitzdHJ1Y3QgaWxfY21kX2hlYWRlciB7CisJdTggY21kOwkJCS8qIENvbW1hbmQgSUQ6ICBDX1JYT04sIGV0Yy4gKi8KKwl1OCBmbGFnczsJCS8qIDA6NSByZXNlcnZlZCwgNiBhYm9ydCwgNyBpbnRlcm5hbCAqLworCS8qCisJICogVGhlIGRyaXZlciBzZXRzIHVwIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gdmFsdWVzIG9mIGl0cyBjaG9vc2luZy4KKwkgKiB1Q29kZSBkb2VzIG5vdCB1c2UgdGhpcyB2YWx1ZSwgYnV0IHBhc3NlcyBpdCBiYWNrIHRvIHRoZSBkcml2ZXIKKwkgKiB3aGVuIHNlbmRpbmcgdGhlIHJlc3BvbnNlIHRvIGVhY2ggZHJpdmVyLW9yaWdpbmF0ZWQgY29tbWFuZCwgc28KKwkgKiB0aGUgZHJpdmVyIGNhbiBtYXRjaCB0aGUgcmVzcG9uc2UgdG8gdGhlIGNvbW1hbmQuICBTaW5jZSB0aGUgdmFsdWVzCisJICogZG9uJ3QgZ2V0IHVzZWQgYnkgdUNvZGUsIHRoZSBkcml2ZXIgbWF5IHNldCB1cCBhbiBhcmJpdHJhcnkgZm9ybWF0LgorCSAqCisJICogVGhlcmUgaXMgb25lIGV4Y2VwdGlvbjogIHVDb2RlIHNldHMgYml0IDE1IHdoZW4gaXQgb3JpZ2luYXRlcworCSAqIHRoZSByZXNwb25zZS9ub3RpZmljYXRpb24sIGkuZS4gd2hlbiB0aGUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uCisJICogaXMgbm90IGEgZGlyZWN0IHJlc3BvbnNlIHRvIGEgY29tbWFuZCBzZW50IGJ5IHRoZSBkcml2ZXIuICBGb3IKKwkgKiBleGFtcGxlLCB1Q29kZSBpc3N1ZXMgTl8zOTQ1X1JYIHdoZW4gaXQgc2VuZHMgYSByZWNlaXZlZCBmcmFtZQorCSAqIHRvIHRoZSBkcml2ZXI7IGl0IGlzIG5vdCBhIGRpcmVjdCByZXNwb25zZSB0byBhbnkgZHJpdmVyIGNvbW1hbmQuCisJICoKKwkgKiBUaGUgTGludXggZHJpdmVyIHVzZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisJICoKKwkgKiAgMDo3ICAgICAgICAgdGZkIGlkeCAtIHBvc2l0aW9uIHdpdGhpbiBUWCBxdWV1ZQorCSAqICA4OjEyICAgICAgICBUWCBxdWV1ZSBpZAorCSAqICAxMyAgICAgICAgICByZXNlcnZlZAorCSAqICAxNCAgICAgICAgICBodWdlIC0gZHJpdmVyIHNldHMgdGhpcyB0byBpbmRpY2F0ZSBjb21tYW5kIGlzIGluIHRoZQorCSAqICAgICAgICAgICAgICAnaHVnZScgc3RvcmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcnMKKwkgKiAgMTUgICAgICAgICAgdW5zb2xpY2l0ZWQgUlggb3IgdUNvZGUtb3JpZ2luYXRlZCBub3RpZmljYXRpb24KKwkgKi8KKwlfX2xlMTYgc2VxdWVuY2U7CisKKwkvKiBjb21tYW5kIG9yIHJlc3BvbnNlL25vdGlmaWNhdGlvbiBkYXRhIGZvbGxvd3MgaW1tZWRpYXRlbHkgKi8KKwl1OCBkYXRhWzBdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyCisgKgorICogVXNlZCBpbiBDX1RYX1BXUl9UQkwsIENfU0NBTiwgQ19DSEFOTkVMX1NXSVRDSAorICoKKyAqIEVhY2ggZW50cnkgY29udGFpbnMgdHdvIHZhbHVlczoKKyAqIDEpICBEU1AgZ2FpbiAob3Igc29tZXRpbWVzIGNhbGxlZCBEU1AgYXR0ZW51YXRpb24pLiAgVGhpcyBpcyBhIGZpbmUtZ3JhaW5lZAorICogICAgIGxpbmVhciB2YWx1ZSB0aGF0IG11bHRpcGxpZXMgdGhlIG91dHB1dCBvZiB0aGUgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yLAorICogICAgIGJlZm9yZSBiZWluZyBzZW50IHRvIHRoZSBhbmFsb2cgcmFkaW8uCisgKiAyKSAgUmFkaW8gZ2Fpbi4gIFRoaXMgc2V0cyB0aGUgYW5hbG9nIGdhaW4gb2YgdGhlIHJhZGlvIFR4IHBhdGguCisgKiAgICAgSXQgaXMgYSBjb2Fyc2VyIHNldHRpbmcsIGFuZCBiZWhhdmVzIGluIGEgbG9nYXJpdGhtaWMgKGRCKSBmYXNoaW9uLgorICoKKyAqIERyaXZlciBvYnRhaW5zIHZhbHVlcyBmcm9tIHN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgcG93ZXJfZ2Fpbl90YWJsZVtdW10uCisgKi8KK3N0cnVjdCBpbDM5NDVfdHhfcG93ZXIgeworCXU4IHR4X2dhaW47CQkvKiBnYWluIGZvciBhbmFsb2cgcmFkaW8gKi8KKwl1OCBkc3BfYXR0ZW47CQkvKiBnYWluIGZvciBEU1AgKi8KK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGlsMzk0NV9wb3dlcl9wZXJfcmF0ZQorICoKKyAqIFVzZWQgaW4gQ19UWF9QV1JfVEJMLCBDX0NIQU5ORUxfU1dJVENICisgKi8KK3N0cnVjdCBpbDM5NDVfcG93ZXJfcGVyX3JhdGUgeworCXU4IHJhdGU7CQkvKiBwbGNwICovCisJc3RydWN0IGlsMzk0NV90eF9wb3dlciB0cGM7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKioKKyAqIGl3bDQ5NjUgcmF0ZV9uX2ZsYWdzIGJpdCBmaWVsZHMKKyAqCisgKiByYXRlX25fZmxhZ3MgZm9ybWF0IGlzIHVzZWQgaW4gZm9sbG93aW5nIGl3bDQ5NjUgY29tbWFuZHM6CisgKiAgTl9SWCAocmVzcG9uc2Ugb25seSkKKyAqICBOX1JYX01QRFUgKHJlc3BvbnNlIG9ubHkpCisgKiAgQ19UWCAoYm90aCBjb21tYW5kIGFuZCByZXNwb25zZSkKKyAqICBDX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqCisgKiBIaWdoLXRocm91Z2hwdXQgKEhUKSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjEiKToKKyAqICAyLTA6ICAwKSAgIDYgTWJwcworICogICAgICAgIDEpICAxMiBNYnBzCisgKiAgICAgICAgMikgIDE4IE1icHMKKyAqICAgICAgICAzKSAgMjQgTWJwcworICogICAgICAgIDQpICAzNiBNYnBzCisgKiAgICAgICAgNSkgIDQ4IE1icHMKKyAqICAgICAgICA2KSAgNTQgTWJwcworICogICAgICAgIDcpICA2MCBNYnBzCisgKgorICogIDQtMzogIDApICBTaW5nbGUgc3RyZWFtIChTSVNPKQorICogICAgICAgIDEpICBEdWFsIHN0cmVhbSAoTUlNTykKKyAqICAgICAgICAyKSAgVHJpcGxlIHN0cmVhbSAoTUlNTykKKyAqCisgKiAgICA1OiAgVmFsdWUgb2YgMHgyMCBpbiBiaXRzIDc6MCBpbmRpY2F0ZXMgNiBNYnBzIEhUNDAgZHVwbGljYXRlIGRhdGEKKyAqCisgKiBMZWdhY3kgT0ZETSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMCIpOgorICogIDMtMDogIDB4RCkgICA2IE1icHMKKyAqICAgICAgICAweEYpICAgOSBNYnBzCisgKiAgICAgICAgMHg1KSAgMTIgTWJwcworICogICAgICAgIDB4NykgIDE4IE1icHMKKyAqICAgICAgICAweDkpICAyNCBNYnBzCisgKiAgICAgICAgMHhCKSAgMzYgTWJwcworICogICAgICAgIDB4MSkgIDQ4IE1icHMKKyAqICAgICAgICAweDMpICA1NCBNYnBzCisgKgorICogTGVnYWN5IENDSyByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMSIpOgorICogIDYtMDogICAxMCkgIDEgTWJwcworICogICAgICAgICAyMCkgIDIgTWJwcworICogICAgICAgICA1NSkgIDUuNSBNYnBzCisgKiAgICAgICAgMTEwKSAgMTEgTWJwcworICovCisjZGVmaW5lIFJBVEVfTUNTX0NPREVfTVNLIDB4NworI2RlZmluZSBSQVRFX01DU19TUEFUSUFMX1BPUyAzCisjZGVmaW5lIFJBVEVfTUNTX1NQQVRJQUxfTVNLIDB4MTgKKyNkZWZpbmUgUkFURV9NQ1NfSFRfRFVQX1BPUyA1CisjZGVmaW5lIFJBVEVfTUNTX0hUX0RVUF9NU0sgMHgyMAorCisvKiBCaXQgODogKDEpIEhUIGZvcm1hdCwgKDApIGxlZ2FjeSBmb3JtYXQgaW4gYml0cyA3OjAgKi8KKyNkZWZpbmUgUkFURV9NQ1NfRkxBR1NfUE9TIDgKKyNkZWZpbmUgUkFURV9NQ1NfSFRfUE9TIDgKKyNkZWZpbmUgUkFURV9NQ1NfSFRfTVNLIDB4MTAwCisKKy8qIEJpdCA5OiAoMSkgQ0NLLCAoMCkgT0ZETS4gIEhUIChiaXQgOCkgbXVzdCBiZSAiMCIgZm9yIHRoaXMgYml0IHRvIGJlIHZhbGlkICovCisjZGVmaW5lIFJBVEVfTUNTX0NDS19QT1MgOQorI2RlZmluZSBSQVRFX01DU19DQ0tfTVNLIDB4MjAwCisKKy8qIEJpdCAxMDogKDEpIFVzZSBHcmVlbiBGaWVsZCBwcmVhbWJsZSAqLworI2RlZmluZSBSQVRFX01DU19HRl9QT1MgMTAKKyNkZWZpbmUgUkFURV9NQ1NfR0ZfTVNLIDB4NDAwCisKKy8qIEJpdCAxMTogKDEpIFVzZSA0ME1oeiBIVDQwIGNobmwgd2lkdGgsICgwKSB1c2UgMjAgTUh6IGxlZ2FjeSBjaG5sIHdpZHRoICovCisjZGVmaW5lIFJBVEVfTUNTX0hUNDBfUE9TIDExCisjZGVmaW5lIFJBVEVfTUNTX0hUNDBfTVNLIDB4ODAwCisKKy8qIEJpdCAxMjogKDEpIER1cGxpY2F0ZSBkYXRhIG9uIGJvdGggMjBNSHogY2hubHMuIEhUNDAgKGJpdCAxMSkgbXVzdCBiZSBzZXQuICovCisjZGVmaW5lIFJBVEVfTUNTX0RVUF9QT1MgMTIKKyNkZWZpbmUgUkFURV9NQ1NfRFVQX01TSyAweDEwMDAKKworLyogQml0IDEzOiAoMSkgU2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKDAuNCB1c2VjKSwgKDApIG5vcm1hbCBHSSAoMC44IHVzZWMpICovCisjZGVmaW5lIFJBVEVfTUNTX1NHSV9QT1MgMTMKKyNkZWZpbmUgUkFURV9NQ1NfU0dJX01TSyAweDIwMDAKKworLyoqCisgKiByYXRlX25fZmxhZ3MgVHggYW50ZW5uYSBtYXNrcworICogNDk2NSBoYXMgMiB0cmFuc21pdHRlcnMKKyAqIGJpdDE0OjE2CisgKi8KKyNkZWZpbmUgUkFURV9NQ1NfQU5UX1BPUwkxNAorI2RlZmluZSBSQVRFX01DU19BTlRfQV9NU0sJMHgwNDAwMAorI2RlZmluZSBSQVRFX01DU19BTlRfQl9NU0sJMHgwODAwMAorI2RlZmluZSBSQVRFX01DU19BTlRfQ19NU0sJMHgxMDAwMAorI2RlZmluZSBSQVRFX01DU19BTlRfQUJfTVNLCShSQVRFX01DU19BTlRfQV9NU0sgfCBSQVRFX01DU19BTlRfQl9NU0spCisjZGVmaW5lIFJBVEVfTUNTX0FOVF9BQkNfTVNLCShSQVRFX01DU19BTlRfQUJfTVNLIHwgUkFURV9NQ1NfQU5UX0NfTVNLKQorI2RlZmluZSBSQVRFX0FOVF9OVU0gMworCisjZGVmaW5lIFBPV0VSX1RCTF9OVU1fRU5UUklFUwkJCTMzCisjZGVmaW5lIFBPV0VSX1RCTF9OVU1fSFRfT0ZETV9FTlRSSUVTCQkzMgorI2RlZmluZSBQT1dFUl9UQkxfQ0NLX0VOVFJZCQkJMzIKKworI2RlZmluZSBJTF9QV1JfTlVNX0hUX09GRE1fRU5UUklFUwkJMjQKKyNkZWZpbmUgSUxfUFdSX0NDS19FTlRSSUVTCQkJMgorCisvKioKKyAqIHVuaW9uIGlsNDk2NV90eF9wb3dlcl9kdWFsX3N0cmVhbQorICoKKyAqIEhvc3QgZm9ybWF0IHVzZWQgZm9yIENfVFhfUFdSX1RCTCwgQ19DSEFOTkVMX1NXSVRDSAorICogVXNlIF9fbGUzMiB2ZXJzaW9uIChzdHJ1Y3QgdHhfcG93ZXJfZHVhbF9zdHJlYW0pIHdoZW4gYnVpbGRpbmcgY29tbWFuZC4KKyAqCisgKiBEcml2ZXIgcHJvdmlkZXMgcmFkaW8gZ2FpbiBhbmQgRFNQIGF0dGVudWF0aW9uIHNldHRpbmdzIHRvIGRldmljZSBpbiBwYWlycywKKyAqIG9uZSB2YWx1ZSBmb3IgZWFjaCB0cmFuc21pdHRlciBjaGFpbi4gIFRoZSBmaXJzdCB2YWx1ZSBpcyBmb3IgdHJhbnNtaXR0ZXIgQSwKKyAqIHNlY29uZCBmb3IgdHJhbnNtaXR0ZXIgQi4KKyAqCisgKiBGb3IgU0lTTyBiaXQgcmF0ZXMsIGJvdGggdmFsdWVzIGluIGEgcGFpciBzaG91bGQgYmUgaWRlbnRpY2FsLgorICogRm9yIE1JTU8gcmF0ZXMsIG9uZSB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyLAorICogaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGUgVHggb3V0cHV0IGJldHdlZW4gdGhlIHR3byB0cmFuc21pdHRlcnMuCisgKgorICogU2VlIG1vcmUgZGV0YWlscyBpbiBkb2MgZm9yIFRYUE9XRVIgaW4gNDk2NS5oLgorICovCit1bmlvbiBpbDQ5NjVfdHhfcG93ZXJfZHVhbF9zdHJlYW0geworCXN0cnVjdCB7CisJCXU4IHJhZGlvX3R4X2dhaW5bMl07CisJCXU4IGRzcF9wcmVkaXNfYXR0ZW5bMl07CisJfSBzOworCXUzMiBkdzsKK307CisKKy8qKgorICogc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtCisgKgorICogVGFibGUgZW50cmllcyBpbiBDX1RYX1BXUl9UQkwsIENfQ0hBTk5FTF9TV0lUQ0gKKyAqCisgKiBTYW1lIGZvcm1hdCBhcyBpbF90eF9wb3dlcl9kdWFsX3N0cmVhbSwgYnV0IF9fbGUzMgorICovCitzdHJ1Y3QgdHhfcG93ZXJfZHVhbF9zdHJlYW0geworCV9fbGUzMiBkdzsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYgorICoKKyAqIEVudGlyZSB0YWJsZSB3aXRoaW4gQ19UWF9QV1JfVEJMLCBDX0NIQU5ORUxfU1dJVENICisgKi8KK3N0cnVjdCBpbDQ5NjVfdHhfcG93ZXJfZGIgeworCXN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbSBwb3dlcl90YmxbUE9XRVJfVEJMX05VTV9FTlRSSUVTXTsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgwYSkKKyAqIEFsaXZlIGFuZCBFcnJvciBDb21tYW5kcyAmIFJlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVUNPREVfVkFMSURfT0sJY3B1X3RvX2xlMzIoMHgxKQorI2RlZmluZSBJTklUSUFMSVpFX1NVQlRZUEUgICAgKDkpCisKKy8qCisgKiAoIkluaXRpYWxpemUiKSBOX0FMSVZFID0gMHgxIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICoKKyAqIHVDb2RlIGlzc3VlcyB0aGlzICJpbml0aWFsaXplIGFsaXZlIiBub3RpZmljYXRpb24gb25jZSB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIHVDb2RlIGltYWdlIGhhcyBjb21wbGV0ZWQgaXRzIHdvcmssIGFuZCBpcyByZWFkeSB0byBsb2FkIHRoZSBydW50aW1lIGltYWdlLgorICogVGhpcyBpcyB0aGUgKmZpcnN0KiAiYWxpdmUiIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCByZWNlaXZlIGFmdGVyCisgKiByZWJvb3RpbmcgdUNvZGU7IHRoZSAiaW5pdGlhbGl6ZSIgYWxpdmUgaXMgaW5kaWNhdGVkIGJ5IHN1YnR5cGUgZmllbGQgPT0gOS4KKyAqCisgKiBTZWUgY29tbWVudHMgZG9jdW1lbnRpbmcgIkJTTSIgKGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lKS4KKyAqCisgKiBGb3IgNDk2NSwgdGhpcyBub3RpZmljYXRpb24gY29udGFpbnMgaW1wb3J0YW50IGNhbGlicmF0aW9uIGRhdGEgZm9yCisgKiBjYWxjdWxhdGluZyB0eHBvd2VyIHNldHRpbmdzOgorICoKKyAqIDEpICBQb3dlciBzdXBwbHkgdm9sdGFnZSBpbmRpY2F0aW9uLiAgVGhlIHZvbHRhZ2Ugc2Vuc29yIG91dHB1dHMgaGlnaGVyCisgKiAgICAgdmFsdWVzIGZvciBsb3dlciB2b2x0YWdlLCBhbmQgdmljZSB2ZXJzZS4KKyAqCisgKiAyKSAgVGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgcGFyYW1ldGVycywgZm9yIGVhY2ggb2YgdHdvIGNoYW5uZWwgd2lkdGhzCisgKiAgICAgKDIwIE1IeiBhbmQgNDAgTUh6KSBzdXBwb3J0ZWQgYnkgdGhlIHJhZGlvcy4gIFRlbXBlcmF0dXJlIHNlbnNpbmcKKyAqICAgICBpcyBkb25lIHZpYSBvbmUgb2YgdGhlIHJlY2VpdmVyIGNoYWlucywgYW5kIGNoYW5uZWwgd2lkdGggaW5mbHVlbmNlcworICogICAgIHRoZSByZXN1bHRzLgorICoKKyAqIDMpICBUeCBnYWluIGNvbXBlbnNhdGlvbiB0byBiYWxhbmNlIDQ5NjUncyAyIFR4IGNoYWlucyBmb3IgTUlNTyBvcGVyYXRpb24sCisgKiAgICAgZm9yIGVhY2ggb2YgNSBmcmVxdWVuY3kgcmFuZ2VzLgorICovCitzdHJ1Y3QgaWxfaW5pdF9hbGl2ZV9yZXNwIHsKKwl1OCB1Y29kZV9taW5vcjsKKwl1OCB1Y29kZV9tYWpvcjsKKwlfX2xlMTYgcmVzZXJ2ZWQxOworCXU4IHN3X3Jldls4XTsKKwl1OCB2ZXJfdHlwZTsKKwl1OCB2ZXJfc3VidHlwZTsJCS8qICI5IiBmb3IgaW5pdGlhbGl6ZSBhbGl2ZSAqLworCV9fbGUxNiByZXNlcnZlZDI7CisJX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7CisJX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsKKwlfX2xlMzIgdGltZXN0YW1wOworCV9fbGUzMiBpc192YWxpZDsKKworCS8qIGNhbGlicmF0aW9uIHZhbHVlcyBmcm9tICJpbml0aWFsaXplIiB1Q29kZSAqLworCV9fbGUzMiB2b2x0YWdlOwkJLyogc2lnbmVkLCBoaWdoZXIgdmFsdWUgaXMgbG93ZXIgdm9sdGFnZSAqLworCV9fbGUzMiB0aGVybV9yMVsyXTsJLyogc2lnbmVkLCAxc3QgZm9yIG5vcm1hbCwgMm5kIGZvciBIVDQwICovCisJX19sZTMyIHRoZXJtX3IyWzJdOwkvKiBzaWduZWQgKi8KKwlfX2xlMzIgdGhlcm1fcjNbMl07CS8qIHNpZ25lZCAqLworCV9fbGUzMiB0aGVybV9yNFsyXTsJLyogc2lnbmVkICovCisJX19sZTMyIHR4X2F0dGVuWzVdWzJdOwkvKiBzaWduZWQgTUlNTyBnYWluIGNvbXAsIDUgZnJlcSBncm91cHMsCisJCQkJICogMiBUeCBjaGFpbnMgKi8KK30gX19wYWNrZWQ7CisKKy8qKgorICogTl9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKKyAqCisgKiB1Q29kZSBpc3N1ZXMgdGhpcyAiYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBydW50aW1lIGltYWdlIGlzIHJlYWR5CisgKiB0byByZWNlaXZlIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlci4gIFRoaXMgaXMgdGhlICpzZWNvbmQqICJhbGl2ZSIKKyAqIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCByZWNlaXZlIGFmdGVyIHJlYm9vdGluZyB1Q29kZTsKKyAqIHRoaXMgImFsaXZlIiBpcyBpbmRpY2F0ZWQgYnkgc3VidHlwZSBmaWVsZCAhPSA5LgorICoKKyAqIFNlZSBjb21tZW50cyBkb2N1bWVudGluZyAiQlNNIiAoYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUpLgorICoKKyAqIFRoaXMgcmVzcG9uc2UgaW5jbHVkZXMgdHdvIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgd2l0aGluIHRoZSBkZXZpY2UncworICogZGF0YSBTUkFNIChhY2Nlc3MgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzKSB0aGF0IGFyZSB1c2VmdWwgZm9yIGRlYnVnZ2luZzoKKyAqCisgKiAxKSAgbG9nX2V2ZW50X3RhYmxlX3B0ciBpbmRpY2F0ZXMgYmFzZSBvZiB0aGUgZXZlbnQgbG9nLiAgVGhpcyB0cmFjZXMKKyAqICAgICBhIDI1Ni1lbnRyeSBoaXN0b3J5IG9mIHVDb2RlIGV4ZWN1dGlvbiB3aXRoaW4gYSBjaXJjdWxhciBidWZmZXIuCisgKiAgICAgSXRzIGhlYWRlciBmb3JtYXQgaXM6CisgKgorICoJX19sZTMyIGxvZ19zaXplOyAgICAgbG9nIGNhcGFjaXR5IChpbiBudW1iZXIgb2YgZW50cmllcykKKyAqCV9fbGUzMiB0eXBlOyAgICAgICAgICgxKSB0aW1lc3RhbXAgd2l0aCBlYWNoIGVudHJ5LCAoMCkgbm8gdGltZXN0YW1wCisgKglfX2xlMzIgd3JhcHM7ICAgICAgICAjIHRpbWVzIHVDb2RlIGhhcyB3cmFwcGVkIHRvIHRvcCBvZiBjaXJjdWxhciBidWZmZXIKKyAqICAgICAgX19sZTMyIHdyaXRlX2lkeDsgIG5leHQgY2lyY3VsYXIgYnVmZmVyIGVudHJ5IHRoYXQgdUNvZGUgd291bGQgZmlsbAorICoKKyAqICAgICBUaGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IHRoZSBjaXJjdWxhciBidWZmZXIgb2YgbG9nIGVudHJpZXMuICBFbnRyaWVzCisgKiAgICAgd2l0aCB0aW1lc3RhbXBzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICoJX19sZTMyIGV2ZW50X2lkOyAgICAgcmFuZ2UgMCAtIDE1MDAKKyAqCV9fbGUzMiB0aW1lc3RhbXA7ICAgIGxvdyAzMiBiaXRzIG9mIFRTRiAob2YgbmV0d29yaywgaWYgYXNzb2NpYXRlZCkKKyAqCV9fbGUzMiBkYXRhOyAgICAgICAgIGV2ZW50X2lkLXNwZWNpZmljIGRhdGEgdmFsdWUKKyAqCisgKiAgICAgRW50cmllcyB3aXRob3V0IHRpbWVzdGFtcHMgY29udGFpbiBvbmx5IGV2ZW50X2lkIGFuZCBkYXRhLgorICoKKyAqCisgKiAyKSAgZXJyb3JfZXZlbnRfdGFibGVfcHRyIGluZGljYXRlcyBiYXNlIG9mIHRoZSBlcnJvciBsb2cuICBUaGlzIGNvbnRhaW5zCisgKiAgICAgaW5mb3JtYXRpb24gYWJvdXQgYW55IHVDb2RlIGVycm9yIHRoYXQgb2NjdXJzLiAgRm9yIDQ5NjUsIHRoZSBmb3JtYXQKKyAqICAgICBvZiB0aGUgZXJyb3IgbG9nIGlzOgorICoKKyAqCV9fbGUzMiB2YWxpZDsgICAgICAgIChub256ZXJvKSB2YWxpZCwgKDApIGxvZyBpcyBlbXB0eQorICoJX19sZTMyIGVycm9yX2lkOyAgICAgdHlwZSBvZiBlcnJvcgorICoJX19sZTMyIHBjOyAgICAgICAgICAgcHJvZ3JhbSBjb3VudGVyCisgKglfX2xlMzIgYmxpbmsxOyAgICAgICBicmFuY2ggbGluaworICoJX19sZTMyIGJsaW5rMjsgICAgICAgYnJhbmNoIGxpbmsKKyAqCV9fbGUzMiBpbGluazE7ICAgICAgIGludGVycnVwdCBsaW5rCisgKglfX2xlMzIgaWxpbmsyOyAgICAgICBpbnRlcnJ1cHQgbGluaworICoJX19sZTMyIGRhdGExOyAgICAgICAgZXJyb3Itc3BlY2lmaWMgZGF0YQorICoJX19sZTMyIGRhdGEyOyAgICAgICAgZXJyb3Itc3BlY2lmaWMgZGF0YQorICoJX19sZTMyIGxpbmU7ICAgICAgICAgc291cmNlIGNvZGUgbGluZSBvZiBlcnJvcgorICoJX19sZTMyIGJjb25fdGltZTsgICAgYmVhY29uIHRpbWVyCisgKglfX2xlMzIgdHNmX2xvdzsgICAgICBuZXR3b3JrIHRpbWVzdGFtcCBmdW5jdGlvbiB0aW1lcgorICoJX19sZTMyIHRzZl9oaTsgICAgICAgbmV0d29yayB0aW1lc3RhbXAgZnVuY3Rpb24gdGltZXIKKyAqCV9fbGUzMiBncDE7ICAgICAgICAgIEdQMSB0aW1lciByZWdpc3RlcgorICoJX19sZTMyIGdwMjsgICAgICAgICAgR1AyIHRpbWVyIHJlZ2lzdGVyCisgKglfX2xlMzIgZ3AzOyAgICAgICAgICBHUDMgdGltZXIgcmVnaXN0ZXIKKyAqCV9fbGUzMiB1Y29kZV92ZXI7ICAgIHVDb2RlIHZlcnNpb24KKyAqCV9fbGUzMiBod192ZXI7ICAgICAgIEhXIFNpbGljb24gdmVyc2lvbgorICoJX19sZTMyIGJyZF92ZXI7ICAgICAgSFcgYm9hcmQgdmVyc2lvbgorICoJX19sZTMyIGxvZ19wYzsgICAgICAgbG9nIHByb2dyYW0gY291bnRlcgorICoJX19sZTMyIGZyYW1lX3B0cjsgICAgZnJhbWUgcG9pbnRlcgorICoJX19sZTMyIHN0YWNrX3B0cjsgICAgc3RhY2sgcG9pbnRlcgorICoJX19sZTMyIGhjbWQ7ICAgICAgICAgbGFzdCBob3N0IGNvbW1hbmQKKyAqCV9fbGUzMiBpc3IwOyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMDogcnh0eF9mbGFnCisgKglfX2xlMzIgaXNyMTsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjE6IGhvc3RfZmxhZworICoJX19sZTMyIGlzcjI7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IyOiBlbmNfZmxhZworICoJX19sZTMyIGlzcjM7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IzOiB0aW1lX2ZsYWcKKyAqCV9fbGUzMiBpc3I0OyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSNDogd2ljbyBpbnRlcnJ1cHQKKyAqCV9fbGUzMiBpc3JfcHJlZjsgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfUFJFRl9TVEFUCisgKglfX2xlMzIgd2FpdF9ldmVudDsgICB3YWl0IGV2ZW50KCkgY2FsbGVyIGFkZHJlc3MKKyAqCV9fbGUzMiBsMnBfY29udHJvbDsgIEwycENvbnRyb2xGaWVsZAorICoJX19sZTMyIGwycF9kdXJhdGlvbjsgTDJwRHVyYXRpb25GaWVsZAorICoJX19sZTMyIGwycF9taHZhbGlkOyAgTDJwTWhWYWxpZEJpdHMKKyAqCV9fbGUzMiBsMnBfYWRkcl9tYXRjaDsgTDJwQWRkck1hdGNoU3RhdAorICoJX19sZTMyIGxtcG1fcG1nX3NlbDsgaW5kaWNhdGUgd2hpY2ggY2xvY2tzIGFyZSB0dXJuZWQgb24gKExNUE1fUE1HX1NFTCkKKyAqCV9fbGUzMiB1X3RpbWVzdGFtcDsgIGluZGljYXRlIHdoZW4gdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGNvbXBpbGF0aW9uCisgKglfX2xlMzIgcmVzZXJ2ZWQ7CisgKgorICogVGhlIExpbnV4IGRyaXZlciBjYW4gcHJpbnQgYm90aCBsb2dzIHRvIHRoZSBzeXN0ZW0gbG9nIHdoZW4gYSB1Q29kZSBlcnJvcgorICogb2NjdXJzLgorICovCitzdHJ1Y3QgaWxfYWxpdmVfcmVzcCB7CisJdTggdWNvZGVfbWlub3I7CisJdTggdWNvZGVfbWFqb3I7CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCBzd19yZXZbOF07CisJdTggdmVyX3R5cGU7CisJdTggdmVyX3N1YnR5cGU7CQkvKiBub3QgIjkiIGZvciBydW50aW1lIGFsaXZlICovCisJX19sZTE2IHJlc2VydmVkMjsKKwlfX2xlMzIgbG9nX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBldmVudCBsb2cgKi8KKwlfX2xlMzIgZXJyb3JfZXZlbnRfdGFibGVfcHRyOwkvKiBTUkFNIGFkZHJlc3MgZm9yIGVycm9yIGxvZyAqLworCV9fbGUzMiB0aW1lc3RhbXA7CisJX19sZTMyIGlzX3ZhbGlkOworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fRVJST1IgPSAweDIgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9lcnJvcl9yZXNwIHsKKwlfX2xlMzIgZXJyb3JfdHlwZTsKKwl1OCBjbWRfaWQ7CisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiBiYWRfY21kX3NlcV9udW07CisJX19sZTMyIGVycm9yX2luZm87CisJX19sZTY0IHRpbWVzdGFtcDsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgxKQorICogUlhPTiBDb21tYW5kcyAmIFJlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSeCBjb25maWcgZGVmaW5lcyAmIHN0cnVjdHVyZQorICovCisvKiByeF9jb25maWcgZGV2aWNlIHR5cGVzICAqLworZW51bSB7CisJUlhPTl9ERVZfVFlQRV9BUCA9IDEsCisJUlhPTl9ERVZfVFlQRV9FU1MgPSAzLAorCVJYT05fREVWX1RZUEVfSUJTUyA9IDQsCisJUlhPTl9ERVZfVFlQRV9TTklGRkVSID0gNiwKK307CisKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9EUklWRVJfRk9SQ0VfTVNLCQljcHVfdG9fbGUxNigweDEgPDwgMCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9EUklWRVJfRk9SQ0VfUE9TCQkoMCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9WQUxJRF9NU0sJCQljcHVfdG9fbGUxNigweDcgPDwgMSkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9WQUxJRF9QT1MJCQkoMSkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfTVNLCQljcHVfdG9fbGUxNigweDcgPDwgNCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TCQkoNCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9GT1JDRV9NSU1PX1NFTF9NU0sJY3B1X3RvX2xlMTYoMHg3IDw8IDcpCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRk9SQ0VfTUlNT19TRUxfUE9TCSg3KQorI2RlZmluZSBSWE9OX1JYX0NIQUlOX0NOVF9NU0sJCQljcHVfdG9fbGUxNigweDMgPDwgMTApCisjZGVmaW5lIFJYT05fUlhfQ0hBSU5fQ05UX1BPUwkJCSgxMCkKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9NSU1PX0NOVF9NU0sJCWNwdV90b19sZTE2KDB4MyA8PCAxMikKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9NSU1PX0NOVF9QT1MJCSgxMikKKyNkZWZpbmUgUlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSwkJY3B1X3RvX2xlMTYoMHgxIDw8IDE0KQorI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfUE9TCQkoMTQpCisKKy8qIHJ4X2NvbmZpZyBmbGFncyAqLworLyogYmFuZCAmIG1vZHVsYXRpb24gc2VsZWN0aW9uICovCisjZGVmaW5lIFJYT05fRkxHX0JBTkRfMjRHX01TSyAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAwKQorI2RlZmluZSBSWE9OX0ZMR19DQ0tfTVNLICAgICAgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMSkKKy8qIGF1dG8gZGV0ZWN0aW9uIGVuYWJsZSAqLworI2RlZmluZSBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMikKKy8qIFRHZyBwcm90ZWN0aW9uIHdoZW4gdHggKi8KKyNkZWZpbmUgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDMpCisvKiBjY2sgc2hvcnQgc2xvdCAmIHByZWFtYmxlICovCisjZGVmaW5lIFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgNCkKKyNkZWZpbmUgUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLICAgICBjcHVfdG9fbGUzMigxIDw8IDUpCisvKiBhbnRlbm5hIHNlbGVjdGlvbiAqLworI2RlZmluZSBSWE9OX0ZMR19ESVNfRElWX01TSyAgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgNykKKyNkZWZpbmUgUlhPTl9GTEdfQU5UX1NFTF9NU0sgICAgICAgICAgICBjcHVfdG9fbGUzMigweDBmMDApCisjZGVmaW5lIFJYT05fRkxHX0FOVF9BX01TSyAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA4KQorI2RlZmluZSBSWE9OX0ZMR19BTlRfQl9NU0sgICAgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgOSkKKy8qIHJhZGFyIGRldGVjdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgUlhPTl9GTEdfUkFEQVJfREVURUNUX01TSyAgICAgICBjcHVfdG9fbGUzMigxIDw8IDEyKQorI2RlZmluZSBSWE9OX0ZMR19UR0pfTkFSUk9XX0JBTkRfTVNLICAgIGNwdV90b19sZTMyKDEgPDwgMTMpCisvKiByeCByZXNwb25zZSB0byBob3N0IHdpdGggOC1ieXRlIFRTRgorKiAoYWNjb3JkaW5nIHRvIE9OX0FJUiBkZWFzc2VydGlvbikgKi8KKyNkZWZpbmUgUlhPTl9GTEdfVFNGMkhPU1RfTVNLICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDE1KQorCisvKiBIVCBmbGFncyAqLworI2RlZmluZSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX1BPUwkJKDIyKQorI2RlZmluZSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSwljcHVfdG9fbGUzMigweDEgPDwgMjIpCisKKyNkZWZpbmUgUlhPTl9GTEdfSFRfT1BFUkFUSU5HX01PREVfUE9TCQkoMjMpCisKKyNkZWZpbmUgUlhPTl9GTEdfSFRfUFJPVF9NU0sJCQljcHVfdG9fbGUzMigweDEgPDwgMjMpCisjZGVmaW5lIFJYT05fRkxHX0hUNDBfUFJPVF9NU0sJCQljcHVfdG9fbGUzMigweDIgPDwgMjMpCisKKyNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUwkJKDI1KQorI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLCQljcHVfdG9fbGUzMigweDMgPDwgMjUpCisKKy8qIGNoYW5uZWwgbW9kZSAqLworZW51bSB7CisJQ0hBTk5FTF9NT0RFX0xFR0FDWSA9IDAsCisJQ0hBTk5FTF9NT0RFX1BVUkVfNDAgPSAxLAorCUNIQU5ORUxfTU9ERV9NSVhFRCA9IDIsCisJQ0hBTk5FTF9NT0RFX1JFU0VSVkVEID0gMywKK307CisjZGVmaW5lIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1kJCQlcCisJY3B1X3RvX2xlMzIoQ0hBTk5FTF9NT0RFX0xFR0FDWSA8PCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TKQorI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfUFVSRV80MAkJCVwKKwljcHVfdG9fbGUzMihDSEFOTkVMX01PREVfUFVSRV80MCA8PCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TKQorI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQJCQlcCisJY3B1X3RvX2xlMzIoQ0hBTk5FTF9NT0RFX01JWEVEIDw8IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1MpCisKKy8qIENUUyB0byBzZWxmIChpZiBzcGVjIGFsbG93cykgZmxhZyAqLworI2RlZmluZSBSWE9OX0ZMR19TRUxGX0NUU19FTgkJCWNwdV90b19sZTMyKDB4MTw8MzApCisKKy8qIHJ4X2NvbmZpZyBmaWx0ZXIgZmxhZ3MgKi8KKy8qIGFjY2VwdCBhbGwgZGF0YSBmcmFtZXMgKi8KKyNkZWZpbmUgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDApCisvKiBwYXNzIGNvbnRyb2wgJiBtYW5hZ2VtZW50IHRvIGhvc3QgKi8KKyNkZWZpbmUgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDEpCisvKiBhY2NlcHQgbXVsdGktY2FzdCAqLworI2RlZmluZSBSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSyAgICAgIGNwdV90b19sZTMyKDEgPDwgMikKKy8qIGRvbid0IGRlY3J5cHQgdW5pLWNhc3QgZnJhbWVzICovCisjZGVmaW5lIFJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSyAgICAgY3B1X3RvX2xlMzIoMSA8PCAzKQorLyogZG9uJ3QgZGVjcnlwdCBtdWx0aS1jYXN0IGZyYW1lcyAqLworI2RlZmluZSBSWE9OX0ZJTFRFUl9ESVNfR1JQX0RFQ1JZUFRfTVNLIGNwdV90b19sZTMyKDEgPDwgNCkKKy8qIFNUQSBpcyBhc3NvY2lhdGVkICovCisjZGVmaW5lIFJYT05fRklMVEVSX0FTU09DX01TSyAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA1KQorLyogdHJhbnNmZXIgdG8gaG9zdCBub24gYnNzaWQgYmVhY29ucyBpbiBhc3NvY2lhdGVkIHN0YXRlICovCisjZGVmaW5lIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLICAgICAgY3B1X3RvX2xlMzIoMSA8PCA2KQorCisvKioKKyAqIENfUlhPTiA9IDB4MTAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBSWE9OIHR1bmVzIHRoZSByYWRpbyB0dW5lciB0byBhIHNlcnZpY2UgY2hhbm5lbCwgYW5kIHNldHMgdXAgYSBudW1iZXIKKyAqIG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCBwcmltYXJpbHkgZm9yIFJ4LCBidXQgYWxzbyBmb3IgVHggb3BlcmF0aW9ucy4KKyAqCisgKiBOT1RFOiAgV2hlbiB0dW5pbmcgdG8gYSBuZXcgY2hhbm5lbCwgZHJpdmVyIG11c3Qgc2V0IHRoZQorICogICAgICAgIFJYT05fRklMVEVSX0FTU09DX01TSyB0byAwLiAgVGhpcyB3aWxsIGNsZWFyIHN0YXRpb24tZGVwZW5kZW50CisgKiAgICAgICAgaW5mbyB3aXRoaW4gdGhlIGRldmljZSwgaW5jbHVkaW5nIHRoZSBzdGF0aW9uIHRhYmxlcywgdHggcmV0cnkKKyAqICAgICAgICByYXRlIHRhYmxlcywgYW5kIHR4cG93ZXIgdGFibGVzLiAgRHJpdmVyIG11c3QgYnVpbGQgYSBuZXcgc3RhdGlvbgorICogICAgICAgIHRhYmxlIGFuZCB0eHBvd2VyIHRhYmxlIGJlZm9yZSB0cmFuc21pdHRpbmcgYW55dGhpbmcgb24gdGhlIFJYT04KKyAqICAgICAgICBjaGFubmVsLgorICoKKyAqIE5PVEU6ICBBbGwgUlhPTnMgd2lwZSBjbGVhbiB0aGUgaW50ZXJuYWwgdHhwb3dlciB0YWJsZS4gIERyaXZlciBtdXN0CisgKiAgICAgICAgaXNzdWUgYSBuZXcgQ19UWF9QV1JfVEJMIGFmdGVyIGVhY2ggQ19SWE9OICgweDEwKSwKKyAqICAgICAgICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgUlhPTl9GSUxURVJfQVNTT0NfTVNLIGlzIHNldC4KKyAqLworCitzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kIHsKKwl1OCBub2RlX2FkZHJbNl07CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCBic3NpZF9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDI7CisJdTggd2xhcF9ic3NpZF9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDM7CisJdTggZGV2X3R5cGU7CisJdTggYWlyX3Byb3BhZ2F0aW9uOworCV9fbGUxNiByZXNlcnZlZDQ7CisJdTggb2ZkbV9iYXNpY19yYXRlczsKKwl1OCBjY2tfYmFzaWNfcmF0ZXM7CisJX19sZTE2IGFzc29jX2lkOworCV9fbGUzMiBmbGFnczsKKwlfX2xlMzIgZmlsdGVyX2ZsYWdzOworCV9fbGUxNiBjaGFubmVsOworCV9fbGUxNiByZXNlcnZlZDU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X3J4b25fY21kIHsKKwl1OCBub2RlX2FkZHJbNl07CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCBic3NpZF9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDI7CisJdTggd2xhcF9ic3NpZF9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDM7CisJdTggZGV2X3R5cGU7CisJdTggYWlyX3Byb3BhZ2F0aW9uOworCV9fbGUxNiByeF9jaGFpbjsKKwl1OCBvZmRtX2Jhc2ljX3JhdGVzOworCXU4IGNja19iYXNpY19yYXRlczsKKwlfX2xlMTYgYXNzb2NfaWQ7CisJX19sZTMyIGZsYWdzOworCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CisJX19sZTE2IGNoYW5uZWw7CisJdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Cit9IF9fcGFja2VkOworCisvKiBDcmVhdGUgYSBjb21tb24gcnhvbiBjbWQgd2hpY2ggd2lsbCBiZSB0eXBlY2FzdCBpbnRvIHRoZSAzOTQ1IG9yIDQ5NjUKKyAqIHNwZWNpZmljIHJ4b24gY21kLCBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXMgY2FsbGVkIGZyb20uCisgKi8KK3N0cnVjdCBpbF9yeG9uX2NtZCB7CisJdTggbm9kZV9hZGRyWzZdOworCV9fbGUxNiByZXNlcnZlZDE7CisJdTggYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQyOworCXU4IHdsYXBfYnNzaWRfYWRkcls2XTsKKwlfX2xlMTYgcmVzZXJ2ZWQzOworCXU4IGRldl90eXBlOworCXU4IGFpcl9wcm9wYWdhdGlvbjsKKwlfX2xlMTYgcnhfY2hhaW47CisJdTggb2ZkbV9iYXNpY19yYXRlczsKKwl1OCBjY2tfYmFzaWNfcmF0ZXM7CisJX19sZTE2IGFzc29jX2lkOworCV9fbGUzMiBmbGFnczsKKwlfX2xlMzIgZmlsdGVyX2ZsYWdzOworCV9fbGUxNiBjaGFubmVsOworCXU4IG9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlczsKKwl1OCBvZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXU4IHJlc2VydmVkNDsKKwl1OCByZXNlcnZlZDU7Cit9IF9fcGFja2VkOworCisvKgorICogQ19SWE9OX0FTU09DID0gMHgxMSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWwzOTQ1X3J4b25fYXNzb2NfY21kIHsKKwlfX2xlMzIgZmxhZ3M7CisJX19sZTMyIGZpbHRlcl9mbGFnczsKKwl1OCBvZmRtX2Jhc2ljX3JhdGVzOworCXU4IGNja19iYXNpY19yYXRlczsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X3J4b25fYXNzb2NfY21kIHsKKwlfX2xlMzIgZmxhZ3M7CisJX19sZTMyIGZpbHRlcl9mbGFnczsKKwl1OCBvZmRtX2Jhc2ljX3JhdGVzOworCXU4IGNja19iYXNpY19yYXRlczsKKwl1OCBvZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXM7CisJdTggb2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlczsKKwlfX2xlMTYgcnhfY2hhaW5fc2VsZWN0X2ZsYWdzOworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUxfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMCTEwCisjZGVmaW5lIElMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJNAkvKiA0MDk2ICovCisjZGVmaW5lIElMMzlfTUFYX1VDT0RFX0JFQUNPTl9JTlRFUlZBTAkxCS8qIDEwMjQgKi8KKworLyoKKyAqIENfUlhPTl9USU1JTkcgPSAweDE0IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKi8KK3N0cnVjdCBpbF9yeG9uX3RpbWVfY21kIHsKKwlfX2xlNjQgdGltZXN0YW1wOworCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7CisJX19sZTE2IGF0aW1fd2luOworCV9fbGUzMiBiZWFjb25faW5pdF92YWw7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1OCBkdGltX3BlcmlvZDsKKwl1OCBkZWx0YV9jcF9ic3NfdGJ0dHM7Cit9IF9fcGFja2VkOworCisvKgorICogQ19DSEFOTkVMX1NXSVRDSCA9IDB4NzIgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqLworc3RydWN0IGlsMzk0NV9jaGFubmVsX3N3aXRjaF9jbWQgeworCXU4IGJhbmQ7CisJdTggZXhwZWN0X2JlYWNvbjsKKwlfX2xlMTYgY2hhbm5lbDsKKwlfX2xlMzIgcnhvbl9mbGFnczsKKwlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7CisJX19sZTMyIHN3aXRjaF90aW1lOworCXN0cnVjdCBpbDM5NDVfcG93ZXJfcGVyX3JhdGUgcG93ZXJbSUxfTUFYX1JBVEVTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDQ5NjVfY2hhbm5lbF9zd2l0Y2hfY21kIHsKKwl1OCBiYW5kOworCXU4IGV4cGVjdF9iZWFjb247CisJX19sZTE2IGNoYW5uZWw7CisJX19sZTMyIHJ4b25fZmxhZ3M7CisJX19sZTMyIHJ4b25fZmlsdGVyX2ZsYWdzOworCV9fbGUzMiBzd2l0Y2hfdGltZTsKKwlzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fQ0hBTk5FTF9TV0lUQ0ggPSAweDczIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX2NzYV9ub3RpZmljYXRpb24geworCV9fbGUxNiBiYW5kOworCV9fbGUxNiBjaGFubmVsOworCV9fbGUzMiBzdGF0dXM7CQkvKiAwIC0gT0ssIDEgLSBmYWlsICovCit9IF9fcGFja2VkOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAoMikKKyAqIFF1YWxpdHktb2YtU2VydmljZSAoUU9TKSBDb21tYW5kcyAmIFJlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogc3RydWN0IGlsX2FjX3FvcyAtLSBRT1MgdGltaW5nIHBhcmFtcyBmb3IgQ19RT1NfUEFSQU0KKyAqIE9uZSBmb3IgZWFjaCBvZiA0IEVEQ0EgYWNjZXNzIGNhdGVnb3JpZXMgaW4gc3RydWN0IGlsX3Fvc3BhcmFtX2NtZAorICoKKyAqIEBjd19taW46IENvbnRlbnRpb24gd2luLCBzdGFydCB2YWx1ZSBpbiBudW1iZXJzIG9mIHNsb3RzLgorICogICAgICAgICAgU2hvdWxkIGJlIGEgcG93ZXItb2YtMiwgbWludXMgMS4gIERldmljZSdzIGRlZmF1bHQgaXMgMHgwZi4KKyAqIEBjd19tYXg6IENvbnRlbnRpb24gd2luLCBtYXggdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KKyAqICAgICAgICAgIFNob3VsZCBiZSBhIHBvd2VyLW9mLTIsIG1pbnVzIDEuICBEZXZpY2UncyBkZWZhdWx0IGlzIDB4M2YuCisgKiBAYWlmc246ICBOdW1iZXIgb2Ygc2xvdHMgaW4gQXJiaXRyYXRpb24gSW50ZXJmcmFtZSBTcGFjZSAoYmVmb3JlCisgKiAgICAgICAgICBwZXJmb3JtaW5nIHJhbmRvbSBiYWNrb2ZmIHRpbWluZyBwcmlvciB0byBUeCkuICBEZXZpY2UgZGVmYXVsdCAxLgorICogQGVkY2FfdHhvcDogIExlbmd0aCBvZiBUeCBvcHBvcnR1bml0eSwgaW4gdVNlY3MuICBEZXZpY2UgZGVmYXVsdCBpcyAwLgorICoKKyAqIERldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgY29udGVudGlvbiB3aW4gYnkgKDIqQ1cpICsgMSBmb3IgZWFjaAorICogdHJhbnNtaXNzaW9uIHJldHJ5LiAgRGV2aWNlIHVzZXMgY3dfbWF4IGFzIGEgYml0IG1hc2ssIEFORGVkIHdpdGggbmV3IENXCisgKiB2YWx1ZSwgdG8gY2FwIHRoZSBDVyB2YWx1ZS4KKyAqLworc3RydWN0IGlsX2FjX3FvcyB7CisJX19sZTE2IGN3X21pbjsKKwlfX2xlMTYgY3dfbWF4OworCXU4IGFpZnNuOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgZWRjYV90eG9wOworfSBfX3BhY2tlZDsKKworLyogUW9TIGZsYWdzIGRlZmluZXMgKi8KKyNkZWZpbmUgUU9TX1BBUkFNX0ZMR19VUERBVEVfRURDQV9NU0sJY3B1X3RvX2xlMzIoMHgwMSkKKyNkZWZpbmUgUU9TX1BBUkFNX0ZMR19UR05fTVNLCQljcHVfdG9fbGUzMigweDAyKQorI2RlZmluZSBRT1NfUEFSQU1fRkxHX1RYT1BfVFlQRV9NU0sJY3B1X3RvX2xlMzIoMHgxMCkKKworLyogTnVtYmVyIG9mIEFjY2VzcyBDYXRlZ29yaWVzIChBQykgKEVEQ0EpLCBxdWV1ZXMgMC4uMyAqLworI2RlZmluZSBBQ19OVU0gICAgICAgICAgICAgICAgNAorCisvKgorICogQ19RT1NfUEFSQU0gPSAweDEzIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogVGhpcyBjb21tYW5kIHNldHMgdXAgdGltaW5ncyBmb3IgZWFjaCBvZiB0aGUgNCBwcmlvcml0aXplZCBFRENBIFR4IEZJRk9zCisgKiAwOiBCYWNrZ3JvdW5kLCAxOiBCZXN0IEVmZm9ydCwgMjogVmlkZW8sIDM6IFZvaWNlLgorICovCitzdHJ1Y3QgaWxfcW9zcGFyYW1fY21kIHsKKwlfX2xlMzIgcW9zX2ZsYWdzOworCXN0cnVjdCBpbF9hY19xb3MgYWNbQUNfTlVNXTsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgzKQorICogQWRkL01vZGlmeSBTdGF0aW9ucyBDb21tYW5kcyAmIFJlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogTXVsdGkgc3RhdGlvbiBzdXBwb3J0CisgKi8KKworLyogU3BlY2lhbCwgZGVkaWNhdGVkIGxvY2F0aW9ucyB3aXRoaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLworI2RlZmluZQlJTF9BUF9JRAkJMAorI2RlZmluZQlJTF9TVEFfSUQJCTIKKyNkZWZpbmUJSUwzOTQ1X0JST0FEQ0FTVF9JRAkyNAorI2RlZmluZSBJTDM5NDVfU1RBVElPTl9DT1VOVAkyNQorI2RlZmluZSBJTDQ5NjVfQlJPQURDQVNUX0lECTMxCisjZGVmaW5lCUlMNDk2NV9TVEFUSU9OX0NPVU5UCTMyCisKKyNkZWZpbmUJSUxfU1RBVElPTl9DT1VOVAkzMgkvKiBNQVgoMzk0NSw0OTY1KSAqLworI2RlZmluZQlJTF9JTlZBTElEX1NUQVRJT04JMjU1CisKKyNkZWZpbmUgU1RBX0ZMR19UWF9SQVRFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyKQorI2RlZmluZSBTVEFfRkxHX1BXUl9TQVZFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCA4KQorI2RlZmluZSBTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLCWNwdV90b19sZTMyKDEgPDwgMTcpCisjZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfOFVTX01TSwljcHVfdG9fbGUzMigxIDw8IDE4KQorI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9QT1MJKDE5KQorI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9NU0sJY3B1X3RvX2xlMzIoMyA8PCAxOSkKKyNkZWZpbmUgU1RBX0ZMR19IVDQwX0VOX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyMSkKKyNkZWZpbmUgU1RBX0ZMR19NSU1PX0RJU19NU0sJCWNwdV90b19sZTMyKDEgPDwgMjIpCisjZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfREVOU0lUWV9QT1MJKDIzKQorI2RlZmluZSBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfTVNLCWNwdV90b19sZTMyKDcgPDwgMjMpCisKKy8qIFVzZSBpbiBtb2RlIGZpZWxkLiAgMTogbW9kaWZ5IGV4aXN0aW5nIGVudHJ5LCAwOiBhZGQgbmV3IHN0YXRpb24gZW50cnkgKi8KKyNkZWZpbmUgU1RBX0NPTlRST0xfTU9ESUZZX01TSwkJMHgwMQorCisvKiBrZXkgZmxhZ3MgX19sZTE2Ki8KKyNkZWZpbmUgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0sJY3B1X3RvX2xlMTYoMHgwMDA3KQorI2RlZmluZSBTVEFfS0VZX0ZMR19OT19FTkMJY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBTVEFfS0VZX0ZMR19XRVAJCWNwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgU1RBX0tFWV9GTEdfQ0NNUAljcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFNUQV9LRVlfRkxHX1RLSVAJY3B1X3RvX2xlMTYoMHgwMDAzKQorCisjZGVmaW5lIFNUQV9LRVlfRkxHX0tFWUlEX1BPUwk4CisjZGVmaW5lIFNUQV9LRVlfRkxHX0lOVkFMSUQJY3B1X3RvX2xlMTYoMHgwODAwKQorLyogd2VwIGtleSBpcyBlaXRoZXIgZnJvbSBnbG9iYWwga2V5ICgwKSBvciBmcm9tIHN0YXRpb24gaW5mbyBhcnJheSAoMSkgKi8KKyNkZWZpbmUgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0sJY3B1X3RvX2xlMTYoMHgwMDA4KQorCisvKiB3ZXAga2V5IGluIFNUQTogNS1ieXRlcyAoMCkgb3IgMTMtYnl0ZXMgKDEpICovCisjZGVmaW5lIFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSwljcHVfdG9fbGUxNigweDEwMDApCisjZGVmaW5lIFNUQV9LRVlfTVVMVElDQVNUX01TSwkJY3B1X3RvX2xlMTYoMHg0MDAwKQorI2RlZmluZSBTVEFfS0VZX01BWF9OVU0JCTgKKworLyogRmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0byBtb2RpZnkgdnMuIGRvbid0IGNoYW5nZSB2YXJpb3VzIHN0YXRpb24gcGFyYW1zICovCisjZGVmaW5lCVNUQV9NT0RJRllfS0VZX01BU0sJCTB4MDEKKyNkZWZpbmUJU1RBX01PRElGWV9USURfRElTQUJMRV9UWAkweDAyCisjZGVmaW5lCVNUQV9NT0RJRllfVFhfUkFURV9NU0sJCTB4MDQKKyNkZWZpbmUgU1RBX01PRElGWV9BRERCQV9USURfTVNLCTB4MDgKKyNkZWZpbmUgU1RBX01PRElGWV9ERUxCQV9USURfTVNLCTB4MTAKKyNkZWZpbmUgU1RBX01PRElGWV9TTEVFUF9UWF9DT1VOVF9NU0sJMHgyMAorCisvKiBSZWNlaXZlciBhZGRyZXNzIChhY3R1YWxseSwgUnggc3RhdGlvbidzIGlkeCBpbnRvIHN0YXRpb24gdGFibGUpLAorICogY29tYmluZWQgd2l0aCBUcmFmZmljIElEIChRT1MgcHJpb3JpdHkpLCBpbiBmb3JtYXQgdXNlZCBieSBUeCBTY2hlZHVsZXIgKi8KKyNkZWZpbmUgQlVJTERfUkF4VElEKHN0YV9pZCwgdGlkKQkoKChzdGFfaWQpIDw8IDQpICsgKHRpZCkpCisKK3N0cnVjdCBpbDQ5NjVfa2V5aW5mbyB7CisJX19sZTE2IGtleV9mbGFnczsKKwl1OCB0a2lwX3J4X3RzY19ieXRlMjsJLyogVFNDWzJdIGZvciBrZXkgbWl4IHBoMSBkZXRlY3Rpb24gKi8KKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IHRraXBfcnhfdHRha1s1XTsJLyogMTAtYnl0ZSB1bmljYXN0IFRLSVAgVFRBSyAqLworCXU4IGtleV9vZmZzZXQ7CisJdTggcmVzZXJ2ZWQyOworCXU4IGtleVsxNl07CQkvKiAxNi1ieXRlIHVuaWNhc3QgZGVjcnlwdGlvbiBrZXkgKi8KK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IHN0YV9pZF9tb2RpZnkKKyAqIEBhZGRyW0VUSF9BTEVOXTogc3RhdGlvbidzIE1BQyBhZGRyZXNzCisgKiBAc3RhX2lkOiBpZHggb2Ygc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUKKyAqIEBtb2RpZnlfbWFzazogU1RBX01PRElGWV8qLCAxOiBtb2RpZnksIDA6IGRvbid0IGNoYW5nZQorICoKKyAqIERyaXZlciBzZWxlY3RzIHVudXNlZCB0YWJsZSBpZHggd2hlbiBhZGRpbmcgbmV3IHN0YXRpb24sCisgKiBvciB0aGUgaWR4IHRvIGEgcHJlLWV4aXN0aW5nIHN0YXRpb24gZW50cnkgd2hlbiBtb2RpZnlpbmcgdGhhdCBzdGF0aW9uLgorICogU29tZSBpZHhlcyBoYXZlIHNwZWNpYWwgcHVycG9zZXMgKElMX0FQX0lELCBpZHggMCwgaXMgZm9yIEFQKS4KKyAqCisgKiBtb2RpZnlfbWFzayBmbGFncyBzZWxlY3Qgd2hpY2ggcGFyYW1ldGVycyB0byBtb2RpZnkgdnMuIGxlYXZlIGFsb25lLgorICovCitzdHJ1Y3Qgc3RhX2lkX21vZGlmeSB7CisJdTggYWRkcltFVEhfQUxFTl07CisJX19sZTE2IHJlc2VydmVkMTsKKwl1OCBzdGFfaWQ7CisJdTggbW9kaWZ5X21hc2s7CisJX19sZTE2IHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDX0FERF9TVEEgPSAweDE4IChjb21tYW5kKQorICoKKyAqIFRoZSBkZXZpY2UgY29udGFpbnMgYW4gaW50ZXJuYWwgdGFibGUgb2YgcGVyLXN0YXRpb24gaW5mb3JtYXRpb24sCisgKiB3aXRoIGluZm8gb24gc2VjdXJpdHkga2V5cywgYWdncmVnYXRpb24gcGFyYW1ldGVycywgYW5kIFR4IHJhdGVzIGZvcgorICogaW5pdGlhbCBUeCBhdHRlbXB0IGFuZCBhbnkgcmV0cmllcyAoNDk2NSBkZXZpY2VzIHVzZXMKKyAqIENfVFhfTElOS19RVUFMSVRZX0NNRCwKKyAqIDM5NDUgdXNlcyBDX1JBVEVfU0NBTEUgdG8gc2V0IHVwIHJhdGUgdGFibGVzKS4KKyAqCisgKiBDX0FERF9TVEEgc2V0cyB1cCB0aGUgdGFibGUgZW50cnkgZm9yIG9uZSBzdGF0aW9uLCBlaXRoZXIgY3JlYXRpbmcKKyAqIGEgbmV3IGVudHJ5LCBvciBtb2RpZnlpbmcgYSBwcmUtZXhpc3Rpbmcgb25lLgorICoKKyAqIE5PVEU6ICBSWE9OIGNvbW1hbmQgKHdpdGhvdXQgImFzc29jaWF0ZWQiIGJpdCBzZXQpIHdpcGVzIHRoZSBzdGF0aW9uIHRhYmxlCisgKiAgICAgICAgY2xlYW4uICBNb3ZpbmcgaW50byBSRl9LSUxMIHN0YXRlIGRvZXMgdGhpcyBhbHNvLiAgRHJpdmVyIG11c3Qgc2V0IHVwCisgKiAgICAgICAgbmV3IHN0YXRpb24gdGFibGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbnl0aGluZyBvbiB0aGUgUlhPTiBjaGFubmVsCisgKiAgICAgICAgKGV4Y2VwdCBhY3RpdmUgc2NhbnMgb3IgYWN0aXZlIG1lYXN1cmVtZW50czsgdGhvc2UgY29tbWFuZHMgY2FycnkKKyAqICAgICAgICB0aGVpciBvd24gdHhwb3dlci9yYXRlIHNldHVwIGRhdGEpLgorICoKKyAqICAgICAgICBXaGVuIGdldHRpbmcgc3RhcnRlZCBvbiBhIG5ldyBjaGFubmVsLCBkcml2ZXIgbXVzdCBzZXQgdXAgdGhlCisgKiAgICAgICAgSUxfQlJPQURDQVNUX0lEIGVudHJ5IChsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSkuICBGb3IgYSBjbGllbnQKKyAqICAgICAgICBzdGF0aW9uIGluIGEgQlNTLCBvbmNlIGFuIEFQIGlzIHNlbGVjdGVkLCBkcml2ZXIgc2V0cyB1cCB0aGUgQVAgU1RBCisgKiAgICAgICAgaW4gdGhlIElMX0FQX0lEIGVudHJ5ICgxc3QgZW50cnkgaW4gdGhlIHRhYmxlKS4gIEJST0FEQ0FTVCBhbmQgQVAKKyAqICAgICAgICBhcmUgYWxsIHRoYXQgYXJlIG5lZWRlZCBmb3IgYSBCU1MgY2xpZW50IHN0YXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiAgICAgICAgdXNlZCBhcyBBUCwgb3IgaW4gYW4gSUJTUyBuZXR3b3JrLCBkcml2ZXIgbXVzdCBzZXQgdXAgc3RhdGlvbiB0YWJsZQorICogICAgICAgIGVudHJpZXMgZm9yIGFsbCBTVEFzIGluIG5ldHdvcmssIHN0YXJ0aW5nIHdpdGggaWR4IElMX1NUQV9JRC4KKyAqLworCitzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQgeworCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLworCXU4IHJlc2VydmVkWzNdOworCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKKwlzdHJ1Y3QgaWw0OTY1X2tleWluZm8ga2V5OworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkvKiBTVEFfRkxHXyogKi8KKwlfX2xlMzIgc3RhdGlvbl9mbGFnc19tc2s7CS8qIFNUQV9GTEdfKiAqLworCisJLyogYml0IGZpZWxkIHRvIGRpc2FibGUgKDEpIG9yIGVuYWJsZSAoMCkgVHggZm9yIFRyYWZmaWMgSUQgKFRJRCkKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGJpdCAoZS5nLiBiaXQgNSBjb250cm9scyBUSUQgNSkuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX1RJRF9ESVNBQkxFX1RYIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCV9fbGUxNiB0aWRfZGlzYWJsZV90eDsKKworCV9fbGUxNiByYXRlX25fZmxhZ3M7CisKKwkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKKworCS8qIFRJRCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGJsb2NrLWFjayBzdXBwb3J0LgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9ERUxCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCXU4IHJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCisJLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWw0OTY1X2FkZHN0YV9jbWQgeworCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLworCXU4IHJlc2VydmVkWzNdOworCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKKwlzdHJ1Y3QgaWw0OTY1X2tleWluZm8ga2V5OworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkvKiBTVEFfRkxHXyogKi8KKwlfX2xlMzIgc3RhdGlvbl9mbGFnc19tc2s7CS8qIFNUQV9GTEdfKiAqLworCisJLyogYml0IGZpZWxkIHRvIGRpc2FibGUgKDEpIG9yIGVuYWJsZSAoMCkgVHggZm9yIFRyYWZmaWMgSUQgKFRJRCkKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGJpdCAoZS5nLiBiaXQgNSBjb250cm9scyBUSUQgNSkuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX1RJRF9ESVNBQkxFX1RYIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCV9fbGUxNiB0aWRfZGlzYWJsZV90eDsKKworCV9fbGUxNiByZXNlcnZlZDE7CisKKwkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKKworCS8qIFRJRCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGJsb2NrLWFjayBzdXBwb3J0LgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9ERUxCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCXU4IHJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCisJLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KKwkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247CisKKwkvKgorCSAqIE51bWJlciBvZiBwYWNrZXRzIE9LIHRvIHRyYW5zbWl0IHRvIHN0YXRpb24gZXZlbiB0aG91Z2gKKwkgKiBpdCBpcyBhc2xlZXAgLS0gdXNlZCB0byBzeW5jaHJvbmlzZSBQUy1wb2xsIGFuZCB1LUFQU0QKKwkgKiByZXNwb25zZXMgd2hpbGUgdWNvZGUga2VlcHMgdHJhY2sgb2YgU1RBIHNsZWVwIHN0YXRlLgorCSAqLworCV9fbGUxNiBzbGVlcF90eF9jb3VudDsKKworCV9fbGUxNiByZXNlcnZlZDI7Cit9IF9fcGFja2VkOworCisvKiBXcmFwcGVyIHN0cnVjdCBmb3IgMzk0NSBhbmQgNDk2NSBhZGRzdGFfY21kIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpbF9hZGRzdGFfY21kIHsKKwl1OCBtb2RlOwkJLyogMTogbW9kaWZ5IGV4aXN0aW5nLCAwOiBhZGQgbmV3IHN0YXRpb24gKi8KKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3Qgc3RhX2lkX21vZGlmeSBzdGE7CisJc3RydWN0IGlsNDk2NV9rZXlpbmZvIGtleTsKKwlfX2xlMzIgc3RhdGlvbl9mbGFnczsJLyogU1RBX0ZMR18qICovCisJX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KKworCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCisJICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KKwlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7CisKKwlfX2xlMTYgcmF0ZV9uX2ZsYWdzOwkvKiAzOTQ1IG9ubHkgKi8KKworCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCXU4IGFkZF9pbW1lZGlhdGVfYmFfdGlkOworCisJLyogVElEIGZvciB3aGljaCB0byByZW1vdmUgYmxvY2stYWNrIHN1cHBvcnQuCisJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCisJdTggcmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7CisKKwkvKiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZm9yIGFkZGVkIGJsb2NrLWFjayBzdXBwb3J0LgorCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLworCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKKworCS8qCisJICogTnVtYmVyIG9mIHBhY2tldHMgT0sgdG8gdHJhbnNtaXQgdG8gc3RhdGlvbiBldmVuIHRob3VnaAorCSAqIGl0IGlzIGFzbGVlcCAtLSB1c2VkIHRvIHN5bmNocm9uaXNlIFBTLXBvbGwgYW5kIHUtQVBTRAorCSAqIHJlc3BvbnNlcyB3aGlsZSB1Y29kZSBrZWVwcyB0cmFjayBvZiBTVEEgc2xlZXAgc3RhdGUuCisJICovCisJX19sZTE2IHNsZWVwX3R4X2NvdW50OworCisJX19sZTE2IHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgQUREX1NUQV9TVUNDRVNTX01TSwkJMHgxCisjZGVmaW5lIEFERF9TVEFfTk9fUk9PTV9JTl9UQkwJMHgyCisjZGVmaW5lIEFERF9TVEFfTk9fQkxPQ0tfQUNLX1JFU09VUkNFCTB4NAorI2RlZmluZSBBRERfU1RBX01PRElGWV9OT05fRVhJU1RfU1RBCTB4OAorLyoKKyAqIENfQUREX1NUQSA9IDB4MTggKHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWxfYWRkX3N0YV9yZXNwIHsKKwl1OCBzdGF0dXM7CQkvKiBBRERfU1RBXyogKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUkVNX1NUQV9TVUNDRVNTX01TSyAgICAgICAgICAgICAgMHgxCisvKgorICogIENfUkVNX1NUQSA9IDB4MTkgKHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWxfcmVtX3N0YV9yZXNwIHsKKwl1OCBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKgorICogIENfUkVNX1NUQSA9IDB4MTkgKGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9yZW1fc3RhX2NtZCB7CisJdTggbnVtX3N0YTsJCS8qIG51bWJlciBvZiByZW1vdmVkIHN0YXRpb25zICovCisJdTggcmVzZXJ2ZWRbM107CisJdTggYWRkcltFVEhfQUxFTl07CS8qIE1BQyBhZGRyIG9mIHRoZSBmaXJzdCBzdGF0aW9uICovCisJdTggcmVzZXJ2ZWQyWzJdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJTF9UWF9GSUZPX0JLX01TSwkJY3B1X3RvX2xlMzIoQklUKDApKQorI2RlZmluZSBJTF9UWF9GSUZPX0JFX01TSwkJY3B1X3RvX2xlMzIoQklUKDEpKQorI2RlZmluZSBJTF9UWF9GSUZPX1ZJX01TSwkJY3B1X3RvX2xlMzIoQklUKDIpKQorI2RlZmluZSBJTF9UWF9GSUZPX1ZPX01TSwkJY3B1X3RvX2xlMzIoQklUKDMpKQorI2RlZmluZSBJTF9BR0dfVFhfUVVFVUVfTVNLCQljcHVfdG9fbGUzMigweGZmYzAwKQorCisjZGVmaW5lIElMX0RST1BfU0lOR0xFCQkwCisjZGVmaW5lIElMX0RST1BfU0VMRUNURUQJMQorI2RlZmluZSBJTF9EUk9QX0FMTAkJMgorCisvKgorICogUkVQTFlfV0VQX0tFWSA9IDB4MjAKKyAqLworc3RydWN0IGlsX3dlcF9rZXkgeworCXU4IGtleV9pZHg7CisJdTgga2V5X29mZnNldDsKKwl1OCByZXNlcnZlZDFbMl07CisJdTgga2V5X3NpemU7CisJdTggcmVzZXJ2ZWQyWzNdOworCXU4IGtleVsxNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWxfd2VwX2NtZCB7CisJdTggbnVtX2tleXM7CisJdTggZ2xvYmFsX2tleV90eXBlOworCXU4IGZsYWdzOworCXU4IHJlc2VydmVkOworCXN0cnVjdCBpbF93ZXBfa2V5IGtleVswXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgV0VQX0tFWV9XRVBfVFlQRSAxCisjZGVmaW5lIFdFUF9LRVlTX01BWCA0CisjZGVmaW5lIFdFUF9JTlZBTElEX09GRlNFVCAweGZmCisjZGVmaW5lIFdFUF9LRVlfTEVOXzY0IDUKKyNkZWZpbmUgV0VQX0tFWV9MRU5fMTI4IDEzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg0KQorICogUnggUmVzcG9uc2VzOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SCWNwdV90b19sZTMyKDEgPDwgMCkKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19OT19SWEVfT1ZFUkZMT1cJY3B1X3RvX2xlMzIoMSA8PCAxKQorCisjZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0sJY3B1X3RvX2xlMTYoMSA8PCAwKQorI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX01PRF9DQ0tfTVNLCQljcHVfdG9fbGUxNigxIDw8IDEpCisjZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfU0hPUlRfUFJFQU1CTEVfTVNLCWNwdV90b19sZTE2KDEgPDwgMikKKyNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19OQVJST1dfQkFORF9NU0sJY3B1X3RvX2xlMTYoMSA8PCAzKQorI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLCQkweGYwCisjZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1MJCTQKKworI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSwkoMHg3IDw8IDgpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTk9ORQkoMHgwIDw8IDgpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfV0VQCSgweDEgPDwgOCkKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9DQ01QCSgweDIgPDwgOCkKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9US0lQCSgweDMgPDwgOCkKKyNkZWZpbmUJUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9FUlIJKDB4NyA8PCA4KQorCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORAkoMTw8NikKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19OT19TVEFUSU9OX0lORk9fTUlTTUFUQ0gJKDE8PDcpCisKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLCSgweDMgPDwgMTEpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfTk9UX0RFQ1JZUFQJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LCSgweDMgPDwgMTEpCisjZGVmaW5lIFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUMJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlhfUkVTX1NUQVRVU19CQURfS0VZX1RUQUsJKDB4MiA8PCAxMSkKKworI2RlZmluZSBSWF9NUERVX1JFU19TVEFUVVNfSUNWX09LCSgweDIwKQorI2RlZmluZSBSWF9NUERVX1JFU19TVEFUVVNfTUlDX09LCSgweDQwKQorI2RlZmluZSBSWF9NUERVX1JFU19TVEFUVVNfVFRBS19PSwkoMSA8PCA3KQorI2RlZmluZSBSWF9NUERVX1JFU19TVEFUVVNfREVDX0RPTkVfTVNLCSgweDgwMCkKKworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9zdGF0cyB7CisJdTggcGh5X2NvdW50OworCXU4IGlkOworCXU4IHJzc2k7CisJdTggYWdjOworCV9fbGUxNiBzaWdfYXZnOworCV9fbGUxNiBub2lzZV9kaWZmOworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2hkciB7CisJX19sZTE2IGNoYW5uZWw7CisJX19sZTE2IHBoeV9mbGFnczsKKwl1OCByZXNlcnZlZDE7CisJdTggcmF0ZTsKKwlfX2xlMTYgbGVuOworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2VuZCB7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlNjQgdGltZXN0YW1wOworCV9fbGUzMiBiZWFjb25fdGltZXN0YW1wOworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fMzk0NV9SWCA9IDB4MWIgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKgorICogTk9URTogIERPIE5PVCBkZXJlZmVyZW5jZSBmcm9tIGNhc3RzIHRvIHRoaXMgc3RydWN0dXJlCisgKiBJdCBpcyBwcm92aWRlZCBvbmx5IGZvciBjYWxjdWxhdGluZyBtaW5pbXVtIGRhdGEgc2V0IHNpemUuCisgKiBUaGUgYWN0dWFsIG9mZnNldHMgb2YgdGhlIGhkciBhbmQgZW5kIGFyZSBkeW5hbWljIGJhc2VkIG9uCisgKiBzdGF0cy5waHlfY291bnQKKyAqLworc3RydWN0IGlsMzk0NV9yeF9mcmFtZSB7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2hkciBoZHI7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgZW5kOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBJTDM5X1JYX0ZSQU1FX1NJWkUJKDQgKyBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeF9mcmFtZSkpCisKKy8qIEZpeGVkIChub24tY29uZmlndXJhYmxlKSByeCBkYXRhIGZyb20gcGh5ICovCisKKyNkZWZpbmUgSUw0OV9SWF9SRVNfUEhZX0NOVCAxNAorI2RlZmluZSBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9PRkZTRVQJKDQpCisjZGVmaW5lIElMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0sJKDB4NzApCisjZGVmaW5lIElMNDlfQUdDX0RCX01BU0sJCQkoMHgzZjgwKQkvKiBNQVNLKDcsMTMpICovCisjZGVmaW5lIElMNDlfQUdDX0RCX1BPUwkJCSg3KQorc3RydWN0IGlsNDk2NV9yeF9ub25fY2ZnX3BoeSB7CisJX19sZTE2IGFudF9zZWxlY3Rpb247CS8qIGFudCBBIGJpdCA0LCBhbnQgQiBiaXQgNSwgYW50IEMgYml0IDYgKi8KKwlfX2xlMTYgYWdjX2luZm87CS8qIGFnYyBjb2RlIDA6NiwgYWdjIGRCIDc6MTMsIHJlc2VydmVkIDE0OjE1ICovCisJdTggcnNzaV9pbmZvWzZdOwkvKiB3ZSB1c2UgZXZlbiBlbnRyaWVzLCAwLzIvNCBmb3IgQS9CL0MgcnNzaSAqLworCXU4IHBhZFswXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX1JYID0gMHhjMyAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKKyAqIFVzZWQgb25seSBmb3IgbGVnYWN5IChub24gMTFuKSBmcmFtZXMuCisgKi8KK3N0cnVjdCBpbF9yeF9waHlfcmVzIHsKKwl1OCBub25fY2ZnX3BoeV9jbnQ7CS8qIG5vbiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIGJ5dGUgY291bnQgKi8KKwl1OCBjZmdfcGh5X2NudDsJCS8qIGNvbmZpZ3VyYWJsZSBEU1AgcGh5IGRhdGEgYnl0ZSBjb3VudCAqLworCXU4IHN0YXRfaWQ7CQkvKiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIHNldCBJRCAqLworCXU4IHJlc2VydmVkMTsKKwlfX2xlNjQgdGltZXN0YW1wOwkvKiBUU0YgYXQgb24gYWlyIHJpc2UgKi8KKwlfX2xlMzIgYmVhY29uX3RpbWVfc3RhbXA7CS8qIGJlYWNvbiBhdCBvbi1haXIgcmlzZSAqLworCV9fbGUxNiBwaHlfZmxhZ3M7CS8qIGdlbmVyYWwgcGh5IGZsYWdzOiBiYW5kLCBtb2R1bGF0aW9uLCAuLi4gKi8KKwlfX2xlMTYgY2hhbm5lbDsJCS8qIGNoYW5uZWwgbnVtYmVyICovCisJdTggbm9uX2NmZ19waHlfYnVmWzMyXTsJLyogZm9yIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIG9mIG5vbl9jZmdfcGh5ICovCisJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiAqLworCV9fbGUxNiBieXRlX2NvdW50OwkvKiBmcmFtZSdzIGJ5dGUtY291bnQgKi8KKwlfX2xlMTYgZnJhbWVfdGltZTsJLyogZnJhbWUncyB0aW1lIG9uIHRoZSBhaXIgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbF9yeF9tcGR1X3Jlc19zdGFydCB7CisJX19sZTE2IGJ5dGVfY291bnQ7CisJX19sZTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDUpCisgKiBUeCBDb21tYW5kcyAmIFJlc3BvbnNlczoKKyAqCisgKiBEcml2ZXIgbXVzdCBwbGFjZSBlYWNoIENfVFggY29tbWFuZCBpbnRvIG9uZSBvZiB0aGUgcHJpb3JpdGl6ZWQgVHgKKyAqIHF1ZXVlcyBpbiBob3N0IERSQU0sIHNoYXJlZCBiZXR3ZWVuIGRyaXZlciBhbmQgZGV2aWNlIChzZWUgY29tbWVudHMgZm9yCisgKiBTQ0QgcmVnaXN0ZXJzIGFuZCBUeC9SeCBRdWV1ZXMpLiAgV2hlbiB0aGUgZGV2aWNlJ3MgVHggc2NoZWR1bGVyIGFuZCB1Q29kZQorICogYXJlIHByZXBhcmluZyB0byB0cmFuc21pdCwgdGhlIGRldmljZSBwdWxscyB0aGUgVHggY29tbWFuZCBvdmVyIHRoZSBQQ0kKKyAqIGJ1cyB2aWEgb25lIG9mIHRoZSBkZXZpY2UncyBUeCBETUEgY2hhbm5lbHMsIHRvIGZpbGwgYW4gaW50ZXJuYWwgRklGTworICogZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgdHJhbnNtaXR0ZWQuCisgKgorICogdUNvZGUgaGFuZGxlcyBhbGwgdGltaW5nIGFuZCBwcm90b2NvbCByZWxhdGVkIHRvIGNvbnRyb2wgZnJhbWVzCisgKiAoUlRTL0NUUy9BQ0spLCBiYXNlZCBvbiBmbGFncyBpbiB0aGUgVHggY29tbWFuZC4gIHVDb2RlIGFuZCBUeCBzY2hlZHVsZXIKKyAqIGhhbmRsZSByZWNlcHRpb24gb2YgYmxvY2stYWNrczsgdUNvZGUgdXBkYXRlcyB0aGUgaG9zdCBkcml2ZXIgdmlhCisgKiBOX0NPTVBSRVNTRURfQkEuCisgKgorICogdUNvZGUgaGFuZGxlcyByZXRyeWluZyBUeCB3aGVuIGFuIEFDSyBpcyBleHBlY3RlZCBidXQgbm90IHJlY2VpdmVkLgorICogVGhpcyBpbmNsdWRlcyB0cnlpbmcgbG93ZXIgZGF0YSByYXRlcyB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluIHRoZSBUeAorICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBDX1JBVEVfU0NBTEUgKGZvciAzOTQ1KSBvcgorICogQ19UWF9MSU5LX1FVQUxJVFlfQ01EICg0OTY1KS4KKyAqCisgKiBEcml2ZXIgc2V0cyB1cCB0cmFuc21pdCBwb3dlciBmb3IgdmFyaW91cyByYXRlcyB2aWEgQ19UWF9QV1JfVEJMLgorICogVGhpcyBjb21tYW5kIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXZlcnkgUlhPTiBjb21tYW5kLCBiZWZvcmUgVHggY2FuIG9jY3VyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDX1RYIFR4IGZsYWdzIGZpZWxkICovCisKKy8qCisgKiAxOiBVc2UgUmVxdWVzdC1Uby1TZW5kIHByb3RvY29sIGJlZm9yZSB0aGlzIGZyYW1lLgorICogTXV0dWFsbHkgZXhjbHVzaXZlIHZzLiBUWF9DTURfRkxHX0NUU19NU0suCisgKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19SVFNfTVNLIGNwdV90b19sZTMyKDEgPDwgMSkKKworLyoKKyAqIDE6IFRyYW5zbWl0IENsZWFyLVRvLVNlbmQgdG8gc2VsZiBiZWZvcmUgdGhpcyBmcmFtZS4KKyAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgZm9yIEFVVEgvREVBVVRIL0FTU09DLVJFUS9SRUFTU09DIG1nbW50IGZyYW1lcy4KKyAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19SVFNfTVNLLgorICovCisjZGVmaW5lIFRYX0NNRF9GTEdfQ1RTX01TSyBjcHVfdG9fbGUzMigxIDw8IDIpCisKKy8qIDE6IEV4cGVjdCBBQ0sgZnJvbSByZWNlaXZpbmcgc3RhdGlvbgorICogMDogRG9uJ3QgZXhwZWN0IEFDSyAoTUFDIGhlYWRlcidzIGR1cmF0aW9uIGZpZWxkIHMvYiAwKQorICogU2V0IHRoaXMgZm9yIHVuaWNhc3QgZnJhbWVzLCBidXQgbm90IGJyb2FkY2FzdC9tdWx0aWNhc3QuICovCisjZGVmaW5lIFRYX0NNRF9GTEdfQUNLX01TSyBjcHVfdG9fbGUzMigxIDw8IDMpCisKKy8qIEZvciA0OTY1IGRldmljZXM6CisgKiAxOiBVc2UgcmF0ZSBzY2FsZSB0YWJsZSAoc2VlIENfVFhfTElOS19RVUFMSVRZX0NNRCkuCisgKiAgICBUeCBjb21tYW5kJ3MgaW5pdGlhbF9yYXRlX2lkeCBpbmRpY2F0ZXMgZmlyc3QgcmF0ZSB0byB0cnk7CisgKiAgICB1Q29kZSB3YWxrcyB0aHJvdWdoIHRhYmxlIGZvciBhZGRpdGlvbmFsIFR4IGF0dGVtcHRzLgorICogMDogVXNlIFR4IHJhdGUvTUNTIGZyb20gVHggY29tbWFuZCdzIHJhdGVfbl9mbGFncyBmaWVsZC4KKyAqICAgIFRoaXMgcmF0ZSB3aWxsIGJlIHVzZWQgZm9yIGFsbCBUeCBhdHRlbXB0czsgaXQgd2lsbCBub3QgYmUgc2NhbGVkLiAqLworI2RlZmluZSBUWF9DTURfRkxHX1NUQV9SQVRFX01TSyBjcHVfdG9fbGUzMigxIDw8IDQpCisKKy8qIDE6IEV4cGVjdCBpbW1lZGlhdGUgYmxvY2stYWNrLgorICogU2V0IHdoZW4gVHhpbmcgYSBibG9jay1hY2sgcmVxdWVzdCBmcmFtZS4gIEFsc28gc2V0IFRYX0NNRF9GTEdfQUNLX01TSy4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19JTU1fQkFfUlNQX01BU0sgIGNwdV90b19sZTMyKDEgPDwgNikKKworLyoKKyAqIDE6IEZyYW1lIHJlcXVpcmVzIGZ1bGwgVHgtT3AgcHJvdGVjdGlvbi4KKyAqIFNldCB0aGlzIGlmIGVpdGhlciBSVFMgb3IgQ1RTIFR4IEZsYWcgZ2V0cyBzZXQuCisgKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0sgY3B1X3RvX2xlMzIoMSA8PCA3KQorCisvKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZDsgdXNlZCBvbmx5IGZvciAzOTQ1LCByZXNlcnZlZCAoMCkgZm9yIDQ5NjUgZGV2aWNlcy4KKyAqIFNldCBmaWVsZCB0byAiMCIgdG8gYWxsb3cgMzk0NSB1Q29kZSB0byBzZWxlY3QgYW50ZW5uYSAobm9ybWFsIHVzYWdlKS4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfU0VMX01TSyBjcHVfdG9fbGUzMigweGYwMCkKKyNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQV9NU0sgY3B1X3RvX2xlMzIoMSA8PCA4KQorI2RlZmluZSBUWF9DTURfRkxHX0FOVF9CX01TSyBjcHVfdG9fbGUzMigxIDw8IDkpCisKKy8qIDE6IHVDb2RlIG92ZXJyaWRlcyBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGluIE1BQyBoZWFkZXIuCisgKiAwOiBEcml2ZXIgcHJvdmlkZXMgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpbiBNQUMgaGVhZGVyLgorICogU2V0IHRoaXMgZm9yIG1hbmFnZW1lbnQgZnJhbWVzLCBub24tUU9TIGRhdGEgZnJhbWVzLCBub24tdW5pY2FzdCBmcmFtZXMsCisgKiBhbmQgYWxzbyBpbiBUeCBjb21tYW5kIGVtYmVkZGVkIGluIENfU0NBTiBmb3IgYWN0aXZlIHNjYW5zLiAqLworI2RlZmluZSBUWF9DTURfRkxHX1NFUV9DVExfTVNLIGNwdV90b19sZTMyKDEgPDwgMTMpCisKKy8qIDE6IFRoaXMgZnJhbWUgaXMgbm9uLWxhc3QgTVBEVTsgbW9yZSBmcmFnbWVudHMgYXJlIGNvbWluZy4KKyAqIDA6IExhc3QgZnJhZ21lbnQsIG9yIG5vdCB1c2luZyBmcmFnbWVudGF0aW9uLiAqLworI2RlZmluZSBUWF9DTURfRkxHX01PUkVfRlJBR19NU0sgY3B1X3RvX2xlMzIoMSA8PCAxNCkKKworLyogMTogdUNvZGUgY2FsY3VsYXRlcyBhbmQgaW5zZXJ0cyBUaW1lc3RhbXAgRnVuY3Rpb24gKFRTRikgaW4gb3V0Z29pbmcgZnJhbWUuCisgKiAwOiBObyBUU0YgcmVxdWlyZWQgaW4gb3V0Z29pbmcgZnJhbWUuCisgKiBTZXQgdGhpcyBmb3IgdHJhbnNtaXR0aW5nIGJlYWNvbnMgYW5kIHByb2JlIHJlc3BvbnNlcy4gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19UU0ZfTVNLIGNwdV90b19sZTMyKDEgPDwgMTYpCisKKy8qIDE6IERyaXZlciBpbnNlcnRlZCAyIGJ5dGVzIHBhZCBhZnRlciB0aGUgTUFDIGhlYWRlciwgZm9yIChyZXF1aXJlZCkgZHdvcmQKKyAqICAgIGFsaWdubWVudCBvZiBmcmFtZSdzIHBheWxvYWQgZGF0YSBmaWVsZC4KKyAqIDA6IE5vIHBhZAorICogU2V0IHRoaXMgZm9yIE1BQyBoZWFkZXJzIHdpdGggMjYgb3IgMzAgYnl0ZXMsIGkuZS4gdGhvc2Ugd2l0aCBRT1Mgb3IgQUREUjQKKyAqIGZpZWxkIChidXQgbm90IGJvdGgpLiAgRHJpdmVyIG11c3QgYWxpZ24gZnJhbWUgZGF0YSAoaS5lLiBkYXRhIGZvbGxvd2luZworICogTUFDIGhlYWRlcikgdG8gRFdPUkQgYm91bmRhcnkuICovCisjZGVmaW5lIFRYX0NNRF9GTEdfTUhfUEFEX01TSyBjcHVfdG9fbGUzMigxIDw8IDIwKQorCisvKiBhY2NlbGVyYXRlIGFnZ3JlZ2F0aW9uIHN1cHBvcnQKKyAqIDAgLSBubyBDQ01QIGVuY3J5cHRpb247IDEgLSBDQ01QIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyMikKKworLyogSENDQS1BUCAtIGRpc2FibGUgZHVyYXRpb24gb3ZlcndyaXRpbmcuICovCisjZGVmaW5lIFRYX0NNRF9GTEdfRFVSX01TSyBjcHVfdG9fbGUzMigxIDw8IDI1KQorCisvKgorICogVFggY29tbWFuZCBzZWN1cml0eSBjb250cm9sCisgKi8KKyNkZWZpbmUgVFhfQ01EX1NFQ19XRVAJCTB4MDEKKyNkZWZpbmUgVFhfQ01EX1NFQ19DQ00JCTB4MDIKKyNkZWZpbmUgVFhfQ01EX1NFQ19US0lQCQkweDAzCisjZGVmaW5lIFRYX0NNRF9TRUNfTVNLCQkweDAzCisjZGVmaW5lIFRYX0NNRF9TRUNfU0hJRlQJNgorI2RlZmluZSBUWF9DTURfU0VDX0tFWTEyOAkweDA4CisKKy8qCisgKiBzZWN1cml0eSBvdmVyaGVhZCBzaXplcworICovCisjZGVmaW5lIFdFUF9JVl9MRU4gNAorI2RlZmluZSBXRVBfSUNWX0xFTiA0CisjZGVmaW5lIENDTVBfTUlDX0xFTiA4CisjZGVmaW5lIFRLSVBfSUNWX0xFTiA0CisKKy8qCisgKiBDX1RYID0gMHgxYyAoY29tbWFuZCkKKyAqLworCitzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCB7CisJLyoKKwkgKiBNUERVIGJ5dGUgY291bnQ6CisJICogTUFDIGhlYWRlciAoMjQvMjYvMzAvMzIgYnl0ZXMpICsgMiBieXRlcyBwYWQgaWYgMjYvMzAgaGVhZGVyIHNpemUsCisJICogKyA4IGJ5dGUgSVYgZm9yIENDTSBvciBUS0lQIChub3QgdXNlZCBmb3IgV0VQKQorCSAqICsgRGF0YSBwYXlsb2FkCisJICogKyA4LWJ5dGUgTUlDIChub3QgdXNlZCBmb3IgQ0NNL1dFUCkKKwkgKiBOT1RFOiAgRG9lcyBub3QgaW5jbHVkZSBUeCBjb21tYW5kIGJ5dGVzLCBwb3N0LU1BQyBwYWQgYnl0ZXMsCisJICogICAgICAgIE1JQyAoQ0NNKSA4IGJ5dGVzLCBJQ1YgKFdFUC9US0lQL0NLSVApIDQgYnl0ZXMsIENSQyA0IGJ5dGVzLmkKKwkgKiBSYW5nZTogMTQtMjM0MiBieXRlcy4KKwkgKi8KKwlfX2xlMTYgbGVuOworCisJLyoKKwkgKiBNUERVIG9yIE1TRFUgYnl0ZSBjb3VudCBmb3IgbmV4dCBmcmFtZS4KKwkgKiBVc2VkIGZvciBmcmFnbWVudGF0aW9uIGFuZCBidXJzdGluZywgYnV0IG5vdCAxMW4gYWdncmVnYXRpb24uCisJICogU2FtZSBhcyAibGVuIiwgYnV0IGZvciBuZXh0IGZyYW1lLiAgU2V0IHRvIDAgaWYgbm90IGFwcGxpY2FibGUuCisJICovCisJX19sZTE2IG5leHRfZnJhbWVfbGVuOworCisJX19sZTMyIHR4X2ZsYWdzOwkvKiBUWF9DTURfRkxHXyogKi8KKworCXU4IHJhdGU7CisKKwkvKiBJbmRleCBvZiByZWNpcGllbnQgc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUgKi8KKwl1OCBzdGFfaWQ7CisJdTggdGlkX3RzcGVjOworCXU4IHNlY19jdGw7CisJdTgga2V5WzE2XTsKKwl1bmlvbiB7CisJCXU4IGJ5dGVbOF07CisJCV9fbGUxNiB3b3JkWzRdOworCQlfX2xlMzIgZHdbMl07CisJfSB0a2lwX21pYzsKKwlfX2xlMzIgbmV4dF9mcmFtZV9pbmZvOworCXVuaW9uIHsKKwkJX19sZTMyIGxpZmVfdGltZTsKKwkJX19sZTMyIGF0dGVtcHQ7CisJfSBzdG9wX3RpbWU7CisJdTggc3VwcF9yYXRlc1syXTsKKwl1OCBydHNfcmV0cnlfbGltaXQ7CS8qYnl0ZSA1MCAqLworCXU4IGRhdGFfcmV0cnlfbGltaXQ7CS8qYnl0ZSA1MSAqLworCXVuaW9uIHsKKwkJX19sZTE2IHBtX2ZyYW1lX3RpbWVvdXQ7CisJCV9fbGUxNiBhdHRlbXB0X2R1cmF0aW9uOworCX0gdGltZW91dDsKKworCS8qCisJICogRHVyYXRpb24gb2YgRURDQSBidXJzdCBUeCBPcHBvcnR1bml0eSwgaW4gMzItdXNlYyB1bml0cy4KKwkgKiBTZXQgdGhpcyBpZiB0eG9wIHRpbWUgaXMgbm90IHNwZWNpZmllZCBieSBIQ0NBIHByb3RvY29sIChlLmcuIGJ5IEFQKS4KKwkgKi8KKwlfX2xlMTYgZHJpdmVyX3R4b3A7CisKKwkvKgorCSAqIE1BQyBoZWFkZXIgZ29lcyBoZXJlLCBmb2xsb3dlZCBieSAyIGJ5dGVzIHBhZGRpbmcgaWYgTUFDIGhlYWRlcgorCSAqIGxlbmd0aCBpcyAyNiBvciAzMCBieXRlcywgZm9sbG93ZWQgYnkgcGF5bG9hZCBkYXRhCisJICovCisJdTggcGF5bG9hZFswXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZHJbMF07Cit9IF9fcGFja2VkOworCisvKgorICogQ19UWCA9IDB4MWMgKHJlc3BvbnNlKQorICovCitzdHJ1Y3QgaWwzOTQ1X3R4X3Jlc3AgeworCXU4IGZhaWx1cmVfcnRzOworCXU4IGZhaWx1cmVfZnJhbWU7CisJdTggYnRfa2lsbF9jb3VudDsKKwl1OCByYXRlOworCV9fbGUzMiB3aXJlbGVzc19tZWRpYV90aW1lOworCV9fbGUzMiBzdGF0dXM7CQkvKiBUWCBzdGF0dXMgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiA0OTY1IHVDb2RlIHVwZGF0ZXMgdGhlc2UgVHggYXR0ZW1wdCBjb3VudCB2YWx1ZXMgaW4gaG9zdCBEUkFNLgorICogVXNlZCBmb3IgbWFuYWdpbmcgVHggcmV0cmllcyB3aGVuIGV4cGVjdGluZyBibG9jay1hY2tzLgorICogRHJpdmVyIHNob3VsZCBzZXQgdGhlc2UgZmllbGRzIHRvIDAuCisgKi8KK3N0cnVjdCBpbF9kcmFtX3NjcmF0Y2ggeworCXU4IHRyeV9jbnQ7CQkvKiBUeCBhdHRlbXB0cyAqLworCXU4IGJ0X2tpbGxfY250OwkJLyogVHggYXR0ZW1wdHMgYmxvY2tlZCBieSBCbHVldG9vdGggZGV2aWNlICovCisJX19sZTE2IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsX3R4X2NtZCB7CisJLyoKKwkgKiBNUERVIGJ5dGUgY291bnQ6CisJICogTUFDIGhlYWRlciAoMjQvMjYvMzAvMzIgYnl0ZXMpICsgMiBieXRlcyBwYWQgaWYgMjYvMzAgaGVhZGVyIHNpemUsCisJICogKyA4IGJ5dGUgSVYgZm9yIENDTSBvciBUS0lQIChub3QgdXNlZCBmb3IgV0VQKQorCSAqICsgRGF0YSBwYXlsb2FkCisJICogKyA4LWJ5dGUgTUlDIChub3QgdXNlZCBmb3IgQ0NNL1dFUCkKKwkgKiBOT1RFOiAgRG9lcyBub3QgaW5jbHVkZSBUeCBjb21tYW5kIGJ5dGVzLCBwb3N0LU1BQyBwYWQgYnl0ZXMsCisJICogICAgICAgIE1JQyAoQ0NNKSA4IGJ5dGVzLCBJQ1YgKFdFUC9US0lQL0NLSVApIDQgYnl0ZXMsIENSQyA0IGJ5dGVzLmkKKwkgKiBSYW5nZTogMTQtMjM0MiBieXRlcy4KKwkgKi8KKwlfX2xlMTYgbGVuOworCisJLyoKKwkgKiBNUERVIG9yIE1TRFUgYnl0ZSBjb3VudCBmb3IgbmV4dCBmcmFtZS4KKwkgKiBVc2VkIGZvciBmcmFnbWVudGF0aW9uIGFuZCBidXJzdGluZywgYnV0IG5vdCAxMW4gYWdncmVnYXRpb24uCisJICogU2FtZSBhcyAibGVuIiwgYnV0IGZvciBuZXh0IGZyYW1lLiAgU2V0IHRvIDAgaWYgbm90IGFwcGxpY2FibGUuCisJICovCisJX19sZTE2IG5leHRfZnJhbWVfbGVuOworCisJX19sZTMyIHR4X2ZsYWdzOwkvKiBUWF9DTURfRkxHXyogKi8KKworCS8qIHVDb2RlIG1heSBtb2RpZnkgdGhpcyBmaWVsZCBvZiB0aGUgVHggY29tbWFuZCAoaW4gaG9zdCBEUkFNISkuCisJICogRHJpdmVyIG11c3QgYWxzbyBzZXQgZHJhbV9sc2JfcHRyIGFuZCBkcmFtX21zYl9wdHIgaW4gdGhpcyBjbWQuICovCisJc3RydWN0IGlsX2RyYW1fc2NyYXRjaCBzY3JhdGNoOworCisJLyogUmF0ZSBmb3IgKmFsbCogVHggYXR0ZW1wdHMsIGlmIFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLIGlzIGNsZWFyZWQuICovCisJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiAqLworCisJLyogSW5kZXggb2YgZGVzdGluYXRpb24gc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUgKi8KKwl1OCBzdGFfaWQ7CisKKwkvKiBUeXBlIG9mIHNlY3VyaXR5IGVuY3J5cHRpb246ICBDQ00gb3IgVEtJUCAqLworCXU4IHNlY19jdGw7CQkvKiBUWF9DTURfU0VDXyogKi8KKworCS8qCisJICogSW5kZXggaW50byByYXRlIHRhYmxlIChzZWUgQ19UWF9MSU5LX1FVQUxJVFlfQ01EKSBmb3IgaW5pdGlhbAorCSAqIFR4IGF0dGVtcHQsIGlmIFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLIGlzIHNldC4gIE5vcm1hbGx5ICIwIiBmb3IKKwkgKiBkYXRhIGZyYW1lcywgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCB0byBzZWxlY3RpdmVseSByZWR1Y2UgaW5pdGlhbAorCSAqIHJhdGUgKHZpYSBub24tMCB2YWx1ZSkgZm9yIHNwZWNpYWwgZnJhbWVzIChlLmcuIG1hbmFnZW1lbnQpLCB3aGlsZQorCSAqIHN0aWxsIHN1cHBvcnRpbmcgcmF0ZSBzY2FsaW5nIGZvciBhbGwgZnJhbWVzLgorCSAqLworCXU4IGluaXRpYWxfcmF0ZV9pZHg7CisJdTggcmVzZXJ2ZWQ7CisJdTgga2V5WzE2XTsKKwlfX2xlMTYgbmV4dF9mcmFtZV9mbGFnczsKKwlfX2xlMTYgcmVzZXJ2ZWQyOworCXVuaW9uIHsKKwkJX19sZTMyIGxpZmVfdGltZTsKKwkJX19sZTMyIGF0dGVtcHQ7CisJfSBzdG9wX3RpbWU7CisKKwkvKiBIb3N0IERSQU0gcGh5c2ljYWwgYWRkcmVzcyBwb2ludGVyIHRvICJzY3JhdGNoIiBpbiB0aGlzIGNvbW1hbmQuCisJICogTXVzdCBiZSBkd29yZCBhbGlnbmVkLiAgIjAiIGluIGRyYW1fbHNiX3B0ciBkaXNhYmxlcyB1c2FnZS4gKi8KKwlfX2xlMzIgZHJhbV9sc2JfcHRyOworCXU4IGRyYW1fbXNiX3B0cjsKKworCXU4IHJ0c19yZXRyeV9saW1pdDsJLypieXRlIDUwICovCisJdTggZGF0YV9yZXRyeV9saW1pdDsJLypieXRlIDUxICovCisJdTggdGlkX3RzcGVjOworCXVuaW9uIHsKKwkJX19sZTE2IHBtX2ZyYW1lX3RpbWVvdXQ7CisJCV9fbGUxNiBhdHRlbXB0X2R1cmF0aW9uOworCX0gdGltZW91dDsKKworCS8qCisJICogRHVyYXRpb24gb2YgRURDQSBidXJzdCBUeCBPcHBvcnR1bml0eSwgaW4gMzItdXNlYyB1bml0cy4KKwkgKiBTZXQgdGhpcyBpZiB0eG9wIHRpbWUgaXMgbm90IHNwZWNpZmllZCBieSBIQ0NBIHByb3RvY29sIChlLmcuIGJ5IEFQKS4KKwkgKi8KKwlfX2xlMTYgZHJpdmVyX3R4b3A7CisKKwkvKgorCSAqIE1BQyBoZWFkZXIgZ29lcyBoZXJlLCBmb2xsb3dlZCBieSAyIGJ5dGVzIHBhZGRpbmcgaWYgTUFDIGhlYWRlcgorCSAqIGxlbmd0aCBpcyAyNiBvciAzMCBieXRlcywgZm9sbG93ZWQgYnkgcGF5bG9hZCBkYXRhCisJICovCisJdTggcGF5bG9hZFswXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZHJbMF07Cit9IF9fcGFja2VkOworCisvKiBUWCBjb21tYW5kIHJlc3BvbnNlIGlzIHNlbnQgYWZ0ZXIgKjM5NDUqIHRyYW5zbWlzc2lvbiBhdHRlbXB0cy4KKyAqCisgKiBOT1RFUzoKKyAqCisgKiBUWF9TVEFUVVNfRkFJTF9ORVhUX0ZSQUcKKyAqCisgKiBJZiB0aGUgZnJhZ21lbnQgZmxhZyBpbiB0aGUgTUFDIGhlYWRlciBmb3IgdGhlIGZyYW1lIGJlaW5nIHRyYW5zbWl0dGVkCisgKiBpcyBzZXQgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCB0aW1lIHRvIHRyYW5zbWl0IHRoZSBuZXh0IGZyYW1lLCB0aGUKKyAqIFRYIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkIHdpdGggJ1RYX1NUQVRVU19GQUlMX05FWFRfRlJBRycuCisgKgorICogVFhfU1RBVFVTX0ZJRk9fVU5ERVJSVU4KKyAqCisgKiBJbmRpY2F0ZXMgdGhlIGhvc3QgZGlkIG5vdCBwcm92aWRlIGJ5dGVzIHRvIHRoZSBGSUZPIGZhc3QgZW5vdWdoIHdoaWxlCisgKiBhIFRYIHdhcyBpbiBwcm9ncmVzcy4KKyAqCisgKiBUWF9TVEFUVVNfRkFJTF9NR01OVF9BQk9SVAorICoKKyAqIFRoaXMgc3RhdHVzIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIEFCT1JUIE9OIE1HTVQgUlggcGFyYW1ldGVyIHdhcworICogc2V0IHRvIHRydWUgd2l0aCB0aGUgVFggY29tbWFuZC4KKyAqCisgKiBJZiB0aGUgTVNCIG9mIHRoZSBzdGF0dXMgcGFyYW1ldGVyIGlzIHNldCB0aGVuIGFuIGFib3J0IHNlcXVlbmNlIGlzCisgKiByZXF1aXJlZC4gIFRoaXMgc2VxdWVuY2UgY29uc2lzdHMgb2YgdGhlIGhvc3QgYWN0aXZhdGluZyB0aGUgVFggQWJvcnQKKyAqIGNvbnRyb2wgbGluZSwgYW5kIHRoZW4gd2FpdGluZyBmb3IgdGhlIFRYIEFib3J0IGNvbW1hbmQgcmVzcG9uc2UuICBUaGlzCisgKiBpbmRpY2F0ZXMgdGhhdCBhIHRoZSBkZXZpY2UgaXMgbm8gbG9uZ2VyIGluIGEgdHJhbnNtaXQgc3RhdGUsIGFuZCB0aGF0IHRoZQorICogY29tbWFuZCBGSUZPIGhhcyBiZWVuIGNsZWFyZWQuICBUaGUgaG9zdCBtdXN0IHRoZW4gZGVhY3RpdmF0ZSB0aGUgVFggQWJvcnQKKyAqIGNvbnRyb2wgbGluZS4gIFJlY2VpdmluZyBpcyBzdGlsbCBhbGxvd2VkIGluIHRoaXMgY2FzZS4KKyAqLworZW51bSB7CisJVFhfMzk0NV9TVEFUVVNfU1VDQ0VTUyA9IDB4MDEsCisJVFhfMzk0NV9TVEFUVVNfRElSRUNUX0RPTkUgPSAweDAyLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfU0hPUlRfTElNSVQgPSAweDgyLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTE9OR19MSU1JVCA9IDB4ODMsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9GSUZPX1VOREVSUlVOID0gMHg4NCwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX01HTU5UX0FCT1JUID0gMHg4NSwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX05FWFRfRlJBRyA9IDB4ODYsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9MSUZFX0VYUElSRSA9IDB4ODcsCisJVFhfMzk0NV9TVEFUVVNfRkFJTF9ERVNUX1BTID0gMHg4OCwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0FCT1JURUQgPSAweDg5LAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfQlRfUkVUUlkgPSAweDhhLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfU1RBX0lOVkFMSUQgPSAweDhiLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfRlJBR19EUk9QUEVEID0gMHg4YywKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX1RJRF9ESVNBQkxFID0gMHg4ZCwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX0ZSQU1FX0ZMVVNIRUQgPSAweDhlLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfSU5TVUZGSUNJRU5UX0NGX1BPTEwgPSAweDhmLAorCVRYXzM5NDVfU1RBVFVTX0ZBSUxfVFhfTE9DS0VEID0gMHg5MCwKKwlUWF8zOTQ1X1NUQVRVU19GQUlMX05PX0JFQUNPTl9PTl9SQURBUiA9IDB4OTEsCit9OworCisvKgorICogVFggY29tbWFuZCByZXNwb25zZSBpcyBzZW50IGFmdGVyICo0OTY1KiB0cmFuc21pc3Npb24gYXR0ZW1wdHMuCisgKgorICogYm90aCBwb3N0cG9uZSBhbmQgYWJvcnQgc3RhdHVzIGFyZSBleHBlY3RlZCBiZWhhdmlvciBmcm9tIHVDb2RlLiB0aGVyZSBpcworICogbm8gc3BlY2lhbCBvcGVyYXRpb24gcmVxdWlyZWQgZnJvbSBkcml2ZXI7IGV4Y2VwdCBmb3IgUkZLSUxMX0ZMVVNILAorICogd2hpY2ggcmVxdWlyZWQgdHggZmx1c2ggaG9zdCBjb21tYW5kIHRvIGZsdXNoIGFsbCB0aGUgdHggZnJhbWVzIGluIHF1ZXVlcworICovCitlbnVtIHsKKwlUWF9TVEFUVVNfU1VDQ0VTUyA9IDB4MDEsCisJVFhfU1RBVFVTX0RJUkVDVF9ET05FID0gMHgwMiwKKwkvKiBwb3N0cG9uZSBUWCAqLworCVRYX1NUQVRVU19QT1NUUE9ORV9ERUxBWSA9IDB4NDAsCisJVFhfU1RBVFVTX1BPU1RQT05FX0ZFV19CWVRFUyA9IDB4NDEsCisJVFhfU1RBVFVTX1BPU1RQT05FX1FVSUVUX1BFUklPRCA9IDB4NDMsCisJVFhfU1RBVFVTX1BPU1RQT05FX0NBTENfVFRBSyA9IDB4NDQsCisJLyogYWJvcnQgVFggKi8KKwlUWF9TVEFUVVNfRkFJTF9JTlRFUk5BTF9DUk9TU0VEX1JFVFJZID0gMHg4MSwKKwlUWF9TVEFUVVNfRkFJTF9TSE9SVF9MSU1JVCA9IDB4ODIsCisJVFhfU1RBVFVTX0ZBSUxfTE9OR19MSU1JVCA9IDB4ODMsCisJVFhfU1RBVFVTX0ZBSUxfRklGT19VTkRFUlJVTiA9IDB4ODQsCisJVFhfU1RBVFVTX0ZBSUxfRFJBSU5fRkxPVyA9IDB4ODUsCisJVFhfU1RBVFVTX0ZBSUxfUkZLSUxMX0ZMVVNIID0gMHg4NiwKKwlUWF9TVEFUVVNfRkFJTF9MSUZFX0VYUElSRSA9IDB4ODcsCisJVFhfU1RBVFVTX0ZBSUxfREVTVF9QUyA9IDB4ODgsCisJVFhfU1RBVFVTX0ZBSUxfSE9TVF9BQk9SVEVEID0gMHg4OSwKKwlUWF9TVEFUVVNfRkFJTF9CVF9SRVRSWSA9IDB4OGEsCisJVFhfU1RBVFVTX0ZBSUxfU1RBX0lOVkFMSUQgPSAweDhiLAorCVRYX1NUQVRVU19GQUlMX0ZSQUdfRFJPUFBFRCA9IDB4OGMsCisJVFhfU1RBVFVTX0ZBSUxfVElEX0RJU0FCTEUgPSAweDhkLAorCVRYX1NUQVRVU19GQUlMX0ZJRk9fRkxVU0hFRCA9IDB4OGUsCisJVFhfU1RBVFVTX0ZBSUxfSU5TVUZGSUNJRU5UX0NGX1BPTEwgPSAweDhmLAorCVRYX1NUQVRVU19GQUlMX1BBU1NJVkVfTk9fUlggPSAweDkwLAorCVRYX1NUQVRVU19GQUlMX05PX0JFQUNPTl9PTl9SQURBUiA9IDB4OTEsCit9OworCisjZGVmaW5lCVRYX1BBQ0tFVF9NT0RFX1JFR1VMQVIJCTB4MDAwMAorI2RlZmluZQlUWF9QQUNLRVRfTU9ERV9CVVJTVF9TRVEJMHgwMTAwCisjZGVmaW5lCVRYX1BBQ0tFVF9NT0RFX0JVUlNUX0ZJUlNUCTB4MDIwMAorCitlbnVtIHsKKwlUWF9QT1dFUl9QQV9OT1RfQUNUSVZFID0gMHgwLAorfTsKKworZW51bSB7CisJVFhfU1RBVFVTX01TSyA9IDB4MDAwMDAwZmYsCS8qIGJpdHMgMDo3ICovCisJVFhfU1RBVFVTX0RFTEFZX01TSyA9IDB4MDAwMDAwNDAsCisJVFhfU1RBVFVTX0FCT1JUX01TSyA9IDB4MDAwMDAwODAsCisJVFhfUEFDS0VUX01PREVfTVNLID0gMHgwMDAwZmYwMCwJLyogYml0cyA4OjE1ICovCisJVFhfRklGT19OVU1CRVJfTVNLID0gMHgwMDA3MDAwMCwJLyogYml0cyAxNjoxOCAqLworCVRYX1JFU0VSVkVEID0gMHgwMDc4MDAwMCwJLyogYml0cyAxOToyMiAqLworCVRYX1BPV0VSX1BBX0RFVEVDVF9NU0sgPSAweDdmODAwMDAwLAkvKiBiaXRzIDIzOjMwICovCisJVFhfQUJPUlRfUkVRVUlSRURfTVNLID0gMHg4MDAwMDAwMCwJLyogYml0cyAzMTozMSAqLworfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVFggYWdncmVnYXRpb24gc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitlbnVtIHsKKwlBR0dfVFhfU1RBVEVfVFJBTlNNSVRURUQgPSAweDAwLAorCUFHR19UWF9TVEFURV9VTkRFUlJVTl9NU0sgPSAweDAxLAorCUFHR19UWF9TVEFURV9GRVdfQllURVNfTVNLID0gMHgwNCwKKwlBR0dfVFhfU1RBVEVfQUJPUlRfTVNLID0gMHgwOCwKKwlBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RUTF9NU0sgPSAweDEwLAorCUFHR19UWF9TVEFURV9MQVNUX1NFTlRfVFJZX0NOVF9NU0sgPSAweDIwLAorCUFHR19UWF9TVEFURV9TQ0RfUVVFUllfTVNLID0gMHg4MCwKKwlBR0dfVFhfU1RBVEVfVEVTVF9CQURfQ1JDMzJfTVNLID0gMHgxMDAsCisJQUdHX1RYX1NUQVRFX1JFU1BPTlNFX01TSyA9IDB4MWZmLAorCUFHR19UWF9TVEFURV9EVU1QX1RYX01TSyA9IDB4MjAwLAorCUFHR19UWF9TVEFURV9ERUxBWV9UWF9NU0sgPSAweDQwMAorfTsKKworI2RlZmluZSBBR0dfVFhfU1RBVFVTX01TSwkweDAwMDAwZmZmCS8qIGJpdHMgMDoxMSAqLworI2RlZmluZSBBR0dfVFhfVFJZX01TSwkJMHgwMDAwZjAwMAkvKiBiaXRzIDEyOjE1ICovCisKKyNkZWZpbmUgQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9NU0sgIChBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RUTF9NU0sgfCBcCisJCQkJICAgICBBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLKQorCisvKiAjIHR4IGF0dGVtcHRzIGZvciBmaXJzdCBmcmFtZSBpbiBhZ2dyZWdhdGlvbiAqLworI2RlZmluZSBBR0dfVFhfU1RBVEVfVFJZX0NOVF9QT1MgMTIKKyNkZWZpbmUgQUdHX1RYX1NUQVRFX1RSWV9DTlRfTVNLIDB4ZjAwMAorCisvKiBDb21tYW5kIElEIGFuZCBzZXF1ZW5jZSBudW1iZXIgb2YgVHggY29tbWFuZCBmb3IgdGhpcyBmcmFtZSAqLworI2RlZmluZSBBR0dfVFhfU1RBVEVfU0VRX05VTV9QT1MgMTYKKyNkZWZpbmUgQUdHX1RYX1NUQVRFX1NFUV9OVU1fTVNLIDB4ZmZmZjAwMDAKKworLyoKKyAqIENfVFggPSAweDFjIChyZXNwb25zZSkKKyAqCisgKiBUaGlzIHJlc3BvbnNlIG1heSBiZSBpbiBvbmUgb2YgdHdvIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtYXRzLCBpbmRpY2F0ZWQKKyAqIGJ5IHRoZSBmcmFtZV9jb3VudCBmaWVsZDoKKyAqCisgKiAxKSAgTm8gYWdncmVnYXRpb24gKGZyYW1lX2NvdW50ID09IDEpLiAgVGhpcyByZXBvcnRzIFR4IHJlc3VsdHMgZm9yCisgKiAgICAgYSBzaW5nbGUgZnJhbWUuICBNdWx0aXBsZSBhdHRlbXB0cywgYXQgdmFyaW91cyBiaXQgcmF0ZXMsIG1heSBoYXZlCisgKiAgICAgYmVlbiBtYWRlIGZvciB0aGlzIGZyYW1lLgorICoKKyAqIDIpICBBZ2dyZWdhdGlvbiAoZnJhbWVfY291bnQgPiAxKS4gIFRoaXMgcmVwb3J0cyBUeCByZXN1bHRzIGZvcgorICogICAgIDIgb3IgbW9yZSBmcmFtZXMgdGhhdCB1c2VkIGJsb2NrLWFja25vd2xlZGdlLiAgQWxsIGZyYW1lcyB3ZXJlCisgKiAgICAgdHJhbnNtaXR0ZWQgYXQgc2FtZSByYXRlLiAgUmF0ZSBzY2FsaW5nIG1heSBoYXZlIGJlZW4gdXNlZCBpZiBmaXJzdAorICogICAgIGZyYW1lIGluIHRoaXMgbmV3IGFnZyBibG9jayBmYWlsZWQgaW4gcHJldmlvdXMgYWdnIGJsb2NrKHMpLgorICoKKyAqICAgICBOb3RlIHRoYXQsIGZvciBhZ2dyZWdhdGlvbiwgQUNLIChibG9jay1hY2spIHN0YXR1cyBpcyBub3QgZGVsaXZlcmVkIGhlcmU7CisgKiAgICAgYmxvY2stYWNrIGhhcyBub3QgYmVlbiByZWNlaXZlZCBieSB0aGUgdGltZSB0aGUgNDk2NSBkZXZpY2UgcmVjb3JkcworICogICAgIHRoaXMgc3RhdHVzLgorICogICAgIFRoaXMgc3RhdHVzIHJlbGF0ZXMgdG8gcmVhc29ucyB0aGUgdHggbWlnaHQgaGF2ZSBiZWVuIGJsb2NrZWQgb3IgYWJvcnRlZAorICogICAgIHdpdGhpbiB0aGUgc2VuZGluZyBzdGF0aW9uICh0aGlzIDQ5NjUgZGV2aWNlKSwgcmF0aGVyIHRoYW4gd2hldGhlciBpdCB3YXMKKyAqICAgICByZWNlaXZlZCBzdWNjZXNzZnVsbHkgYnkgdGhlIGRlc3RpbmF0aW9uIHN0YXRpb24uCisgKi8KK3N0cnVjdCBhZ2dfdHhfc3RhdHVzIHsKKwlfX2xlMTYgc3RhdHVzOworCV9fbGUxNiBzZXF1ZW5jZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDQ5NjVfdHhfcmVzcCB7CisJdTggZnJhbWVfY291bnQ7CQkvKiAxIG5vIGFnZ3JlZ2F0aW9uLCA+MSBhZ2dyZWdhdGlvbiAqLworCXU4IGJ0X2tpbGxfY291bnQ7CS8qICMgYmxvY2tlZCBieSBibHVldG9vdGggKHVudXNlZCBmb3IgYWdnKSAqLworCXU4IGZhaWx1cmVfcnRzOwkJLyogIyBmYWlsdXJlcyBkdWUgdG8gdW5zdWNjZXNzZnVsIFJUUyAqLworCXU4IGZhaWx1cmVfZnJhbWU7CS8qICMgZmFpbHVyZXMgZHVlIHRvIG5vIEFDSyAodW51c2VkIGZvciBhZ2cpICovCisKKwkvKiBGb3Igbm9uLWFnZzogIFJhdGUgYXQgd2hpY2ggZnJhbWUgd2FzIHN1Y2Nlc3NmdWwuCisJICogRm9yIGFnZzogIFJhdGUgYXQgd2hpY2ggYWxsIGZyYW1lcyB3ZXJlIHRyYW5zbWl0dGVkLiAqLworCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogICovCisKKwkvKiBGb3Igbm9uLWFnZzogIFJUUyArIENUUyArIGZyYW1lIHR4IGF0dGVtcHRzIHRpbWUgKyBBQ0suCisJICogRm9yIGFnZzogIFJUUyArIENUUyArIGFnZ3JlZ2F0aW9uIHR4IHRpbWUgKyBibG9jay1hY2sgdGltZS4gKi8KKwlfX2xlMTYgd2lyZWxlc3NfbWVkaWFfdGltZTsJLyogdVNlY3MgKi8KKworCV9fbGUxNiByZXNlcnZlZDsKKwlfX2xlMzIgcGFfcG93ZXIxOwkvKiBSRiBwb3dlciBhbXBsaWZpZXIgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKSAqLworCV9fbGUzMiBwYV9wb3dlcjI7CisKKwkvKgorCSAqIEZvciBub24tYWdnOiAgZnJhbWUgc3RhdHVzIFRYX1NUQVRVU18qCisJICogRm9yIGFnZzogIHN0YXR1cyBvZiAxc3QgZnJhbWUsIEFHR19UWF9TVEFURV8qOyBvdGhlciBmcmFtZSBzdGF0dXMKKwkgKiAgICAgICAgICAgZmllbGRzIGZvbGxvdyB0aGlzIG9uZSwgdXAgdG8gZnJhbWVfY291bnQuCisJICogICAgICAgICAgIEJpdCBmaWVsZHM6CisJICogICAgICAgICAgIDExLSAwOiAgQUdHX1RYX1NUQVRFXyogc3RhdHVzIGNvZGUKKwkgKiAgICAgICAgICAgMTUtMTI6ICBSZXRyeSBjb3VudCBmb3IgMXN0IGZyYW1lIGluIGFnZ3JlZ2F0aW9uIChyZXRyaWVzCisJICogICAgICAgICAgICAgICAgICAgb2NjdXIgaWYgdHggZmFpbGVkIGZvciB0aGlzIGZyYW1lIHdoZW4gaXQgd2FzIGEKKwkgKiAgICAgICAgICAgICAgICAgICBtZW1iZXIgb2YgYSBwcmV2aW91cyBhZ2dyZWdhdGlvbiBibG9jaykuICBJZiByYXRlCisJICogICAgICAgICAgICAgICAgICAgc2NhbGluZyBpcyB1c2VkLCByZXRyeSBjb3VudCBpbmRpY2F0ZXMgdGhlIHJhdGUKKwkgKiAgICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSB1c2VkIGZvciBhbGwgZnJhbWVzIGluIHRoZSBuZXcgYWdnLgorCSAqICAgICAgICAgICAzMS0xNjogIFNlcXVlbmNlICMgZm9yIHRoaXMgZnJhbWUncyBUeCBjbWQgKG5vdCBTU04hKQorCSAqLworCXVuaW9uIHsKKwkJX19sZTMyIHN0YXR1czsKKwkJc3RydWN0IGFnZ190eF9zdGF0dXMgYWdnX3N0YXR1c1swXTsJLyogZm9yIGVhY2ggYWdnIGZyYW1lICovCisJfSB1OworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fQ09NUFJFU1NFRF9CQSA9IDB4YzUgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKgorICogUmVwb3J0cyBCbG9jay1BY2tub3dsZWRnZSBmcm9tIHJlY2lwaWVudCBzdGF0aW9uCisgKi8KK3N0cnVjdCBpbF9jb21wcmVzc2VkX2JhX3Jlc3AgeworCV9fbGUzMiBzdGFfYWRkcl9sbzMyOworCV9fbGUxNiBzdGFfYWRkcl9oaTE2OworCV9fbGUxNiByZXNlcnZlZDsKKworCS8qIEluZGV4IG9mIHJlY2lwaWVudCAoQkEtc2VuZGluZykgc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUgKi8KKwl1OCBzdGFfaWQ7CisJdTggdGlkOworCV9fbGUxNiBzZXFfY3RsOworCV9fbGU2NCBiaXRtYXA7CisJX19sZTE2IHNjZF9mbG93OworCV9fbGUxNiBzY2Rfc3NuOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfVFhfUFdSX1RCTCA9IDB4OTcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBTZWUgZGV0YWlscyB1bmRlciAiVFhQT1dFUiIgaW4gNDk2NS5oLgorICovCisKK3N0cnVjdCBpbDM5NDVfdHhwb3dlcnRhYmxlX2NtZCB7CisJdTggYmFuZDsJCS8qIDA6IDUgR0h6LCAxOiAyLjQgR0h6ICovCisJdTggcmVzZXJ2ZWQ7CisJX19sZTE2IGNoYW5uZWw7CisJc3RydWN0IGlsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJTF9NQVhfUkFURVNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsNDk2NV90eHBvd2VydGFibGVfY21kIHsKKwl1OCBiYW5kOwkJLyogMDogNSBHSHosIDE6IDIuNCBHSHogKi8KKwl1OCByZXNlcnZlZDsKKwlfX2xlMTYgY2hhbm5lbDsKKwlzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19jbWQgLSBSYXRlIFNjYWxpbmcgQ29tbWFuZCAmIFJlc3BvbnNlCisgKgorICogQ19SQVRFX1NDQUxFID0gMHg0NyAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICoKKyAqIE5PVEU6IFRoZSB0YWJsZSBvZiByYXRlcyBwYXNzZWQgdG8gdGhlIHVDb2RlIHZpYSB0aGUKKyAqIFJBVEVfU0NBTEUgY29tbWFuZCBzZXRzIHVwIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyIG9mCisgKiByYXRlcyB1c2VkIGZvciBhbGwgcmVsYXRlZCBjb21tYW5kcywgaW5jbHVkaW5nIHJhdGUKKyAqIG1hc2tzLCBldGMuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHlvdSBzZXQgOU1CIChQTENQIDB4MGYpIGFzIHRoZSBmaXJzdAorICogcmF0ZSBpbiB0aGUgcmF0ZSB0YWJsZSwgdGhlIGJpdCBtYXNrIGZvciB0aGF0IHJhdGUKKyAqIHdoZW4gcGFzc2VkIHRocm91Z2ggb2ZkbV9iYXNpY19yYXRlcyBvbiB0aGUgQ19SWE9OCisgKiBjb21tYW5kIHdvdWxkIGJlIGJpdCAwICgxIDw8IDApCisgKi8KK3N0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8geworCV9fbGUxNiByYXRlX25fZmxhZ3M7CisJdTggdHJ5X2NudDsKKwl1OCBuZXh0X3JhdGVfaWR4OworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfY21kIHsKKwl1OCB0YWJsZV9pZDsKKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19pbmZvIHRhYmxlW0lMX01BWF9SQVRFU107Cit9IF9fcGFja2VkOworCisvKlJTX05FV19BUEk6IG9ubHkgVExDX1JUUyByZW1haW5zIGFuZCBtb3ZlZCB0byBiaXQgMCAqLworI2RlZmluZSAgTElOS19RVUFMX0ZMQUdTX1NFVF9TVEFfVExDX1JUU19NU0sJKDEgPDwgMCkKKworLyogIyBvZiBFRENBIHByaW9yaXRpemVkIHR4IGZpZm9zICovCisjZGVmaW5lICBMSU5LX1FVQUxfQUNfTlVNIEFDX05VTQorCisvKiAjIGVudHJpZXMgaW4gcmF0ZSBzY2FsZSB0YWJsZSB0byBzdXBwb3J0IFR4IHJldHJpZXMgKi8KKyNkZWZpbmUgIExJTktfUVVBTF9NQVhfUkVUUllfTlVNIDE2CisKKy8qIFR4IGFudGVubmEgc2VsZWN0aW9uIHZhbHVlcyAqLworI2RlZmluZSAgTElOS19RVUFMX0FOVF9BX01TSyAoMSA8PCAwKQorI2RlZmluZSAgTElOS19RVUFMX0FOVF9CX01TSyAoMSA8PCAxKQorI2RlZmluZSAgTElOS19RVUFMX0FOVF9NU0sgICAoTElOS19RVUFMX0FOVF9BX01TS3xMSU5LX1FVQUxfQU5UX0JfTVNLKQorCisvKioKKyAqIHN0cnVjdCBpbF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMKKyAqCisgKiBVc2VkIGluIENfVFhfTElOS19RVUFMSVRZX0NNRAorICovCitzdHJ1Y3QgaWxfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zIHsKKwl1OCBmbGFnczsKKworCS8qIE5vIGVudHJpZXMgYXQgb3IgYWJvdmUgdGhpcyAoZHJpdmVyIGNob3NlbikgaWR4IGNvbnRhaW4gTUlNTyAqLworCXU4IG1pbW9fZGVsaW1pdGVyOworCisJLyogQmVzdCBzaW5nbGUgYW50ZW5uYSB0byB1c2UgZm9yIHNpbmdsZSBzdHJlYW0gKGxlZ2FjeSwgU0lTTykuICovCisJdTggc2luZ2xlX3N0cmVhbV9hbnRfbXNrOwkvKiBMSU5LX1FVQUxfQU5UXyogKi8KKworCS8qIEJlc3QgYW50ZW5uYXMgdG8gdXNlIGZvciBNSU1PICh1bnVzZWQgZm9yIDQ5NjUsIGFzc3VtZXMgYm90aCkuICovCisJdTggZHVhbF9zdHJlYW1fYW50X21zazsJLyogTElOS19RVUFMX0FOVF8qICovCisKKwkvKgorCSAqIElmIGRyaXZlciBuZWVkcyB0byB1c2UgZGlmZmVyZW50IGluaXRpYWwgcmF0ZXMgZm9yIGRpZmZlcmVudAorCSAqIEVEQ0EgUU9TIGFjY2VzcyBjYXRlZ29yaWVzIChhcyBpbXBsZW1lbnRlZCBieSB0eCBmaWZvcyAwLTMpLAorCSAqIHRoaXMgdGFibGUgd2lsbCBzZXQgdGhhdCB1cCwgYnkgaW5kaWNhdGluZyB0aGUgaWR4ZXMgaW4gdGhlCisJICogcnNfdGFibGVbTElOS19RVUFMX01BWF9SRVRSWV9OVU1dIHJhdGUgdGFibGUgYXQgd2hpY2ggdG8gc3RhcnQuCisJICogT3RoZXJ3aXNlLCBkcml2ZXIgc2hvdWxkIHNldCBhbGwgZW50cmllcyB0byAwLgorCSAqCisJICogRW50cnkgdXNhZ2U6CisJICogMCA9IEJhY2tncm91bmQsIDEgPSBCZXN0IEVmZm9ydCAobm9ybWFsKSwgMiA9IFZpZGVvLCAzID0gVm9pY2UKKwkgKiBUWCBGSUZPcyBhYm92ZSAzIHVzZSBzYW1lIHZhbHVlICh0eXBpY2FsbHkgMCkgYXMgVFggRklGTyAzLgorCSAqLworCXU4IHN0YXJ0X3JhdGVfaWR4W0xJTktfUVVBTF9BQ19OVU1dOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGCSg0MDAwKQkvKiA0IG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfTUFYCSg4MDAwKQorI2RlZmluZSBMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfTUlOCSgxMDApCisKKyNkZWZpbmUgTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX0RFRgkoMykKKyNkZWZpbmUgTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX01BWAkoMjU1KQorI2RlZmluZSBMSU5LX1FVQUxfQUdHX0RJU0FCTEVfU1RBUlRfTUlOCSgwKQorCisjZGVmaW5lIExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfREVGCSgzMSkKKyNkZWZpbmUgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9NQVgJKDYzKQorI2RlZmluZSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX01JTgkoMCkKKworLyoqCisgKiBzdHJ1Y3QgaWxfbGlua19xdWFsX2FnZ19wYXJhbXMKKyAqCisgKiBVc2VkIGluIENfVFhfTElOS19RVUFMSVRZX0NNRAorICovCitzdHJ1Y3QgaWxfbGlua19xdWFsX2FnZ19wYXJhbXMgeworCisJLyoKKwkgKk1heGltdW0gbnVtYmVyIG9mIHVTZWMgaW4gYWdncmVnYXRpb24uCisJICogZGVmYXVsdCBzZXQgdG8gNDAwMCAoNCBtaWxsaXNlY29uZHMpIGlmIG5vdCBjb25maWd1cmVkIGluIC5jZmcKKwkgKi8KKwlfX2xlMTYgYWdnX3RpbWVfbGltaXQ7CisKKwkvKgorCSAqIE51bWJlciBvZiBUeCByZXRyaWVzIGFsbG93ZWQgZm9yIGEgZnJhbWUsIGJlZm9yZSB0aGF0IGZyYW1lIHdpbGwKKwkgKiBubyBsb25nZXIgYmUgY29uc2lkZXJlZCBmb3IgdGhlIHN0YXJ0IG9mIGFuIGFnZ3JlZ2F0aW9uIHNlcXVlbmNlCisJICogKHNjaGVkdWxlciB3aWxsIHRoZW4gdHJ5IHRvIHR4IGl0IGFzIHNpbmdsZSBmcmFtZSkuCisJICogRHJpdmVyIHNob3VsZCBzZXQgdGhpcyB0byAzLgorCSAqLworCXU4IGFnZ19kaXNfc3RhcnRfdGg7CisKKwkvKgorCSAqIE1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbi4KKwkgKiAwID0gbm8gbGltaXQgKGRlZmF1bHQpLiAgMSA9IG5vIGFnZ3JlZ2F0aW9uLgorCSAqIE90aGVyIHZhbHVlcyA9IG1heCAjIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbi4KKwkgKi8KKwl1OCBhZ2dfZnJhbWVfY250X2xpbWl0OworCisJX19sZTMyIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyoKKyAqIENfVFhfTElOS19RVUFMSVRZX0NNRCA9IDB4NGUgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBGb3IgNDk2NSBkZXZpY2VzIG9ubHk7IDM5NDUgdXNlcyBDX1JBVEVfU0NBTEUuCisgKgorICogRWFjaCBzdGF0aW9uIGluIHRoZSA0OTY1IGRldmljZSdzIGludGVybmFsIHN0YXRpb24gdGFibGUgaGFzIGl0cyBvd24gdGFibGUKKyAqIG9mIDE2CisgKiBUeCByYXRlcyBhbmQgbW9kdWxhdGlvbiBtb2RlcyAoZS5nLiBsZWdhY3kvU0lTTy9NSU1PKSBmb3IgcmV0cnlpbmcgVHggd2hlbgorICogYW4gQUNLIGlzIG5vdCByZWNlaXZlZC4gIFRoaXMgY29tbWFuZCByZXBsYWNlcyB0aGUgZW50aXJlIHRhYmxlIGZvcgorICogb25lIHN0YXRpb24uCisgKgorICogTk9URTogIFN0YXRpb24gbXVzdCBhbHJlYWR5IGJlIGluIDQ5NjUgZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZS4KKyAqCSAgVXNlIENfQUREX1NUQS4KKyAqCisgKiBUaGUgcmF0ZSBzY2FsaW5nIHByb2NlZHVyZXMgZGVzY3JpYmVkIGJlbG93IHdvcmsgd2VsbC4gIE9mIGNvdXJzZSwgb3RoZXIKKyAqIHByb2NlZHVyZXMgYXJlIHBvc3NpYmxlLCBhbmQgbWF5IHdvcmsgYmV0dGVyIGZvciBwYXJ0aWN1bGFyIGVudmlyb25tZW50cy4KKyAqCisgKgorICogRklMTElORyBUSEUgUkFURSBUQkwKKyAqCisgKiBHaXZlbiBhIHBhcnRpY3VsYXIgaW5pdGlhbCByYXRlIGFuZCBtb2RlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSByYXRlCisgKiBzY2FsaW5nIGFsZ29yaXRobSBkZXNjcmliZWQgYmVsb3csIHRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nCisgKiBmb3JtdWxhIHRvIGZpbGwgdGhlIHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXSByYXRlIHRhYmxlIGluIHRoZQorICogTGluayBRdWFsaXR5IGNvbW1hbmQ6CisgKgorICoKKyAqIDEpICBJZiB1c2luZyBIaWdoLXRocm91Z2hwdXQgKEhUKSAoU0lTTyBvciBNSU1PKSBpbml0aWFsIHJhdGU6CisgKiAgICAgYSkgVXNlIHRoaXMgc2FtZSBpbml0aWFsIHJhdGUgZm9yIGZpcnN0IDMgZW50cmllcy4KKyAqICAgICBiKSBGaW5kIG5leHQgbG93ZXIgYXZhaWxhYmxlIHJhdGUgdXNpbmcgc2FtZSBtb2RlIChTSVNPIG9yIE1JTU8pLAorICogICAgICAgIHVzZSBmb3IgbmV4dCAzIGVudHJpZXMuICBJZiBubyBsb3dlciByYXRlIGF2YWlsYWJsZSwgc3dpdGNoIHRvCisgKiAgICAgICAgbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwgbm8gTUlNTywgbm8gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLgorICogICAgIGMpIElmIHVzaW5nIE1JTU8sIHNldCBjb21tYW5kJ3MgbWltb19kZWxpbWl0ZXIgdG8gbnVtYmVyIG9mIGVudHJpZXMKKyAqICAgICAgICB1c2luZyBNSU1PICgzIG9yIDYpLgorICogICAgIGQpIEFmdGVyIHRyeWluZyAyIEhUIHJhdGVzLCBzd2l0Y2ggdG8gbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwKKyAqICAgICAgICBubyBNSU1PLCBubyBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGF0IHRoZSBuZXh0IGxvd2VyIGJpdCByYXRlCisgKiAgICAgICAgKGUuZy4gaWYgc2Vjb25kIEhUIGJpdCByYXRlIHdhcyA1NCwgdHJ5IDQ4IGxlZ2FjeSksIGFuZCBmb2xsb3cKKyAqICAgICAgICBsZWdhY3kgcHJvY2VkdXJlIGZvciByZW1haW5pbmcgdGFibGUgZW50cmllcy4KKyAqCisgKiAyKSAgSWYgdXNpbmcgbGVnYWN5IGluaXRpYWwgcmF0ZToKKyAqICAgICBhKSBVc2UgdGhlIGluaXRpYWwgcmF0ZSBmb3Igb25seSBvbmUgZW50cnkuCisgKiAgICAgYikgRm9yIGVhY2ggZm9sbG93aW5nIGVudHJ5LCByZWR1Y2UgdGhlIHJhdGUgdG8gbmV4dCBsb3dlciBhdmFpbGFibGUKKyAqICAgICAgICByYXRlLCB1bnRpbCByZWFjaGluZyB0aGUgbG93ZXN0IGF2YWlsYWJsZSByYXRlLgorICogICAgIGMpIFdoZW4gcmVkdWNpbmcgcmF0ZSwgYWxzbyBzd2l0Y2ggYW50ZW5uYSBzZWxlY3Rpb24uCisgKiAgICAgZCkgT25jZSBsb3dlc3QgYXZhaWxhYmxlIHJhdGUgaXMgcmVhY2hlZCwgcmVwZWF0IHRoaXMgcmF0ZSB1bnRpbAorICogICAgICAgIHJhdGUgdGFibGUgaXMgZmlsbGVkICgxNiBlbnRyaWVzKSwgc3dpdGNoaW5nIGFudGVubmEgZWFjaCBlbnRyeS4KKyAqCisgKgorICogQUNDVU1VTEFUSU5HIEhJU1RPUlkKKyAqCisgKiBUaGUgcmF0ZSBzY2FsaW5nIGFsZ29yaXRobSBmb3IgNDk2NSBkZXZpY2VzLCBhcyBpbXBsZW1lbnRlZCBpbiBMaW51eCBkcml2ZXIsCisgKiB1c2VzIHR3byBzZXRzIG9mIGZyYW1lIFR4IHN1Y2Nlc3MgaGlzdG9yeTogIE9uZSBmb3IgdGhlIGN1cnJlbnQvYWN0aXZlCisgKiBtb2R1bGF0aW9uIG1vZGUsIGFuZCBvbmUgZm9yIGEgc3BlY3VsYXRpdmUvc2VhcmNoIG1vZGUgdGhhdCBpcyBiZWluZworICogYXR0ZW1wdGVkLiBJZiB0aGUgc3BlY3VsYXRpdmUgbW9kZSB0dXJucyBvdXQgdG8gYmUgbW9yZSBlZmZlY3RpdmUgKGkuZS4KKyAqIGFjdHVhbCB0cmFuc2ZlciByYXRlIGlzIGJldHRlciksIHRoZW4gdGhlIGRyaXZlciBjb250aW51ZXMgdG8gdXNlIHRoZQorICogc3BlY3VsYXRpdmUgbW9kZSBhcyB0aGUgbmV3IGN1cnJlbnQgYWN0aXZlIG1vZGUuCisgKgorICogRWFjaCBoaXN0b3J5IHNldCBjb250YWlucywgc2VwYXJhdGVseSBmb3IgZWFjaCBwb3NzaWJsZSByYXRlLCBkYXRhIGZvciBhCisgKiBzbGlkaW5nIHdpbiBvZiB0aGUgNjIgbW9zdCByZWNlbnQgdHggYXR0ZW1wdHMgYXQgdGhhdCByYXRlLiAgVGhlIGRhdGEKKyAqIGluY2x1ZGVzIGEgc2hpZnRpbmcgYml0bWFwIG9mIHN1Y2Nlc3MoMSkvZmFpbHVyZSgwKSwgYW5kIHN1bXMgb2Ygc3VjY2Vzc2Z1bAorICogYW5kIGF0dGVtcHRlZCBmcmFtZXMsIGZyb20gd2hpY2ggdGhlIGRyaXZlciBjYW4gYWRkaXRpb25hbGx5IGNhbGN1bGF0ZSBhCisgKiBzdWNjZXNzIHJhdGlvIChzdWNjZXNzIC8gYXR0ZW1wdGVkKSBhbmQgbnVtYmVyIG9mIGZhaWx1cmVzCisgKiAoYXR0ZW1wdGVkIC0gc3VjY2VzcyksIGFuZCBjb250cm9sIHRoZSBzaXplIG9mIHRoZSB3aW4gKGF0dGVtcHRlZCkuCisgKiBUaGUgZHJpdmVyIHVzZXMgdGhlIGJpdCBtYXAgdG8gcmVtb3ZlIHN1Y2Nlc3NlcyBmcm9tIHRoZSBzdWNjZXNzIHN1bSwgYXMKKyAqIHRoZSBvbGRlc3QgdHggYXR0ZW1wdHMgZmFsbCBvdXQgb2YgdGhlIHdpbi4KKyAqCisgKiBXaGVuIHRoZSA0OTY1IGRldmljZSBtYWtlcyBtdWx0aXBsZSB0eCBhdHRlbXB0cyBmb3IgYSBnaXZlbiBmcmFtZSwgZWFjaAorICogYXR0ZW1wdCBtaWdodCBiZSBhdCBhIGRpZmZlcmVudCByYXRlLCBhbmQgaGF2ZSBkaWZmZXJlbnQgbW9kdWxhdGlvbgorICogY2hhcmFjdGVyaXN0aWNzIChlLmcuIGFudGVubmEsIGZhdCBjaGFubmVsLCBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGFzIHNldAorICogdXAgaW4gdGhlIHJhdGUgc2NhbGluZyB0YWJsZSBpbiB0aGUgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGUgZHJpdmVyIG11c3QKKyAqIGRldGVybWluZSB3aGljaCByYXRlIHRhYmxlIGVudHJ5IHdhcyB1c2VkIGZvciBlYWNoIHR4IGF0dGVtcHQsIHRvIGRldGVybWluZQorICogd2hpY2ggcmF0ZS1zcGVjaWZpYyBoaXN0b3J5IHRvIHVwZGF0ZSwgYW5kIHJlY29yZCBvbmx5IHRob3NlIGF0dGVtcHRzIHRoYXQKKyAqIG1hdGNoIHRoZSBtb2R1bGF0aW9uIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaGlzdG9yeSBzZXQuCisgKgorICogV2hlbiB1c2luZyBibG9jay1hY2sgKGFnZ3JlZ2F0aW9uKSwgYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUKKyAqIHJhdGUsIHNpbmNlIHRoZXJlIGlzIG5vIHBlci1hdHRlbXB0IGFja25vd2xlZGdtZW50IGZyb20gdGhlIGRlc3RpbmF0aW9uCisgKiBzdGF0aW9uLiAgVGhlIFR4IHJlc3BvbnNlIHN0cnVjdCBpbF90eF9yZXNwIGluZGljYXRlcyB0aGUgVHggcmF0ZSBpbgorICogcmF0ZV9uX2ZsYWdzIGZpZWxkLiAgQWZ0ZXIgcmVjZWl2aW5nIGEgYmxvY2stYWNrLCB0aGUgZHJpdmVyIGNhbiB1cGRhdGUKKyAqIGhpc3RvcnkgZm9yIHRoZSBlbnRpcmUgYmxvY2sgYWxsIGF0IG9uY2UuCisgKgorICoKKyAqIEZJTkRJTkcgQkVTVCBTVEFSVElORyBSQVRFOgorICoKKyAqIFdoZW4gd29ya2luZyB3aXRoIGEgc2VsZWN0ZWQgaW5pdGlhbCBtb2R1bGF0aW9uIG1vZGUgKHNlZSBiZWxvdyksIHRoZQorICogZHJpdmVyIGF0dGVtcHRzIHRvIGZpbmQgYSBiZXN0IGluaXRpYWwgcmF0ZS4gIFRoZSBpbml0aWFsIHJhdGUgaXMgdGhlCisgKiBmaXJzdCBlbnRyeSBpbiB0aGUgTGluayBRdWFsaXR5IGNvbW1hbmQncyByYXRlIHRhYmxlLgorICoKKyAqIDEpICBDYWxjdWxhdGUgYWN0dWFsIHRocm91Z2hwdXQgKHN1Y2Nlc3MgcmF0aW8gKiBleHBlY3RlZCB0aHJvdWdocHV0LCBzZWUKKyAqICAgICB0YWJsZSBiZWxvdykgZm9yIGN1cnJlbnQgaW5pdGlhbCByYXRlLiAgRG8gdGhpcyBvbmx5IGlmIGVub3VnaCBmcmFtZXMKKyAqICAgICBoYXZlIGJlZW4gYXR0ZW1wdGVkIHRvIG1ha2UgdGhlIHZhbHVlIG1lYW5pbmdmdWw6ICBhdCBsZWFzdCA2IGZhaWxlZAorICogICAgIHR4IGF0dGVtcHRzLCBvciBhdCBsZWFzdCA4IHN1Y2Nlc3Nlcy4gIElmIG5vdCBlbm91Z2gsIGRvbid0IHRyeSByYXRlCisgKiAgICAgc2NhbGluZyB5ZXQuCisgKgorICogMikgIEZpbmQgYXZhaWxhYmxlIHJhdGVzIGFkamFjZW50IHRvIGN1cnJlbnQgaW5pdGlhbCByYXRlLiAgQXZhaWxhYmxlIG1lYW5zOgorICogICAgIGEpICBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgJiYKKyAqICAgICBiKSAgc3VwcG9ydGVkIGJ5IGFzc29jaWF0aW9uICYmCisgKiAgICAgYykgIHdpdGhpbiBhbnkgY29uc3RyYWludHMgc2VsZWN0ZWQgYnkgdXNlcgorICoKKyAqIDMpICBHYXRoZXIgbWVhc3VyZWQgdGhyb3VnaHB1dHMgZm9yIGFkamFjZW50IHJhdGVzLiAgVGhlc2UgbWlnaHQgbm90IGhhdmUKKyAqICAgICBlbm91Z2ggaGlzdG9yeSB0byBjYWxjdWxhdGUgYSB0aHJvdWdocHV0LiAgVGhhdCdzIG9rYXksIHdlIG1pZ2h0IHRyeQorICogICAgIHVzaW5nIG9uZSBvZiB0aGVtIGFueXdheSEKKyAqCisgKiA0KSAgVHJ5IGRlY3JlYXNpbmcgcmF0ZSBpZiwgZm9yIGN1cnJlbnQgcmF0ZToKKyAqICAgICBhKSAgc3VjY2VzcyByYXRpbyBpcyA8IDE1JSB8fAorICogICAgIGIpICBsb3dlciBhZGphY2VudCByYXRlIGhhcyBiZXR0ZXIgbWVhc3VyZWQgdGhyb3VnaHB1dCB8fAorICogICAgIGMpICBoaWdoZXIgYWRqYWNlbnQgcmF0ZSBoYXMgd29yc2UgdGhyb3VnaHB1dCwgYW5kIGxvd2VyIGlzIHVubWVhc3VyZWQKKyAqCisgKiAgICAgQXMgYSBzYW5pdHkgY2hlY2ssIGlmIGRlY3JlYXNlIHdhcyBkZXRlcm1pbmVkIGFib3ZlLCBsZWF2ZSByYXRlCisgKiAgICAgdW5jaGFuZ2VkIGlmOgorICogICAgIGEpICBsb3dlciByYXRlIHVuYXZhaWxhYmxlCisgKiAgICAgYikgIHN1Y2Nlc3MgcmF0aW8gYXQgY3VycmVudCByYXRlID4gODUlICh2ZXJ5IGdvb2QpCisgKiAgICAgYykgIGN1cnJlbnQgbWVhc3VyZWQgdGhyb3VnaHB1dCBpcyBiZXR0ZXIgdGhhbiBleHBlY3RlZCB0aHJvdWdocHV0CisgKiAgICAgICAgIG9mIGxvd2VyIHJhdGUgKHVuZGVyIHBlcmZlY3QgMTAwJSB0eCBjb25kaXRpb25zLCBzZWUgdGFibGUgYmVsb3cpCisgKgorICogNSkgIFRyeSBpbmNyZWFzaW5nIHJhdGUgaWYsIGZvciBjdXJyZW50IHJhdGU6CisgKiAgICAgYSkgIHN1Y2Nlc3MgcmF0aW8gaXMgPCAxNSUgfHwKKyAqICAgICBiKSAgYm90aCBhZGphY2VudCByYXRlcycgdGhyb3VnaHB1dHMgYXJlIHVubWVhc3VyZWQgKHRyeSBpdCEpIHx8CisgKiAgICAgYikgIGhpZ2hlciBhZGphY2VudCByYXRlIGhhcyBiZXR0ZXIgbWVhc3VyZWQgdGhyb3VnaHB1dCB8fAorICogICAgIGMpICBsb3dlciBhZGphY2VudCByYXRlIGhhcyB3b3JzZSB0aHJvdWdocHV0LCBhbmQgaGlnaGVyIGlzIHVubWVhc3VyZWQKKyAqCisgKiAgICAgQXMgYSBzYW5pdHkgY2hlY2ssIGlmIGluY3JlYXNlIHdhcyBkZXRlcm1pbmVkIGFib3ZlLCBsZWF2ZSByYXRlCisgKiAgICAgdW5jaGFuZ2VkIGlmOgorICogICAgIGEpICBzdWNjZXNzIHJhdGlvIGF0IGN1cnJlbnQgcmF0ZSA8IDcwJS4gIFRoaXMgaXMgbm90IHBhcnRpY3VsYXJseQorICogICAgICAgICBnb29kIHBlcmZvcm1hbmNlOyBoaWdoZXIgcmF0ZSBpcyBzdXJlIHRvIGhhdmUgcG9vcmVyIHN1Y2Nlc3MuCisgKgorICogNikgIFJlLWV2YWx1YXRlIHRoZSByYXRlIGFmdGVyIGVhY2ggdHggZnJhbWUuICBJZiB3b3JraW5nIHdpdGggYmxvY2stCisgKiAgICAgYWNrbm93bGVkZ2UsIGhpc3RvcnkgYW5kIHN0YXRzIG1heSBiZSBjYWxjdWxhdGVkIGZvciB0aGUgZW50aXJlCisgKiAgICAgYmxvY2sgKGluY2x1ZGluZyBwcmlvciBoaXN0b3J5IHRoYXQgZml0cyB3aXRoaW4gdGhlIGhpc3Rvcnkgd2lucyksCisgKiAgICAgYmVmb3JlIHJlLWV2YWx1YXRpb24uCisgKgorICogRklORElORyBCRVNUIFNUQVJUSU5HIE1PRFVMQVRJT04gTU9ERToKKyAqCisgKiBBZnRlciB3b3JraW5nIHdpdGggYSBtb2R1bGF0aW9uIG1vZGUgZm9yIGEgIndoaWxlIiAoYW5kIGRvaW5nIHJhdGUgc2NhbGluZyksCisgKiB0aGUgZHJpdmVyIHNlYXJjaGVzIGZvciBhIG5ldyBpbml0aWFsIG1vZGUgaW4gYW4gYXR0ZW1wdCB0byBpbXByb3ZlCisgKiB0aHJvdWdocHV0LiAgVGhlICJ3aGlsZSIgaXMgbWVhc3VyZWQgYnkgbnVtYmVycyBvZiBhdHRlbXB0ZWQgZnJhbWVzOgorICoKKyAqIEZvciBsZWdhY3kgbW9kZSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKKyAqICAgNDgwIHN1Y2Nlc3NmdWwgZnJhbWVzLCBvciAxNjAgZmFpbGVkIGZyYW1lcworICogRm9yIGhpZ2gtdGhyb3VnaHB1dCBtb2RlcyAoU0lTTyBvciBNSU1PKSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKKyAqICAgNDUwMCBzdWNjZXNzZnVsIGZyYW1lcywgb3IgNDAwIGZhaWxlZCBmcmFtZXMKKyAqCisgKiBNb2RlIHN3aXRjaCBwb3NzaWJpbGl0aWVzIGFyZSAoMyBmb3IgZWFjaCBtb2RlKToKKyAqCisgKiBGb3IgbGVnYWN5OgorICogICBDaGFuZ2UgYW50ZW5uYSwgdHJ5IFNJU08gKGlmIEhUIGFzc29jaWF0aW9uKSwgdHJ5IE1JTU8gKGlmIEhUIGFzc29jaWF0aW9uKQorICogRm9yIFNJU086CisgKiAgIENoYW5nZSBhbnRlbm5hLCB0cnkgTUlNTywgdHJ5IHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbCAoU0dJKQorICogRm9yIE1JTU86CisgKiAgIFRyeSBTSVNPIGFudGVubmEgQSwgU0lTTyBhbnRlbm5hIEIsIHRyeSBzaG9ydGVuZWQgZ3VhcmQgaW50ZXJ2YWwgKFNHSSkKKyAqCisgKiBXaGVuIHRyeWluZyBhIG5ldyBtb2RlLCB1c2UgdGhlIHNhbWUgYml0IHJhdGUgYXMgdGhlIG9sZC9jdXJyZW50IG1vZGUgd2hlbgorICogdHJ5aW5nIGFudGVubmEgc3dpdGNoZXMgYW5kIHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbC4gIFdoZW4gc3dpdGNoaW5nIHRvCisgKiBTSVNPIGZyb20gTUlNTyBvciBsZWdhY3ksIG9yIHRvIE1JTU8gZnJvbSBTSVNPIG9yIGxlZ2FjeSwgdXNlIGEgcmF0ZQorICogZm9yIHdoaWNoIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpIGlzIGFib3V0IHRoZQorICogc2FtZSBvciBzbGlnaHRseSBiZXR0ZXIgdGhhbiB0aGUgYWN0dWFsIG1lYXN1cmVkIHRocm91Z2hwdXQgZGVsaXZlcmVkIGJ5CisgKiB0aGUgb2xkL2N1cnJlbnQgbW9kZS4KKyAqCisgKiBBY3R1YWwgdGhyb3VnaHB1dCBjYW4gYmUgZXN0aW1hdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0CisgKiBieSB0aGUgc3VjY2VzcyByYXRpbyAoc3VjY2Vzc2Z1bCAvIGF0dGVtcHRlZCB0eCBmcmFtZXMpLiAgRnJhbWUgc2l6ZSBpcworICogbm90IGNvbnNpZGVyZWQgaW4gdGhpcyBjYWxjdWxhdGlvbjsgaXQgYXNzdW1lcyB0aGF0IGZyYW1lIHNpemUgd2lsbCBhdmVyYWdlCisgKiBvdXQgdG8gYmUgZmFpcmx5IGNvbnNpc3RlbnQgb3ZlciBzZXZlcmFsIHNhbXBsZXMuICBUaGUgZm9sbG93aW5nIGFyZQorICogbWV0cmljIHZhbHVlcyBmb3IgZXhwZWN0ZWQgdGhyb3VnaHB1dCBhc3N1bWluZyAxMDAlIHN1Y2Nlc3MgcmF0aW8uCisgKiBPbmx5IEcgYmFuZCBoYXMgc3VwcG9ydCBmb3IgQ0NLIHJhdGVzOgorICoKKyAqICAgICAgICAgICBSQVRFOiAgMSAgICAyICAgIDUgICAxMSAgICA2ICAgOSAgIDEyICAgMTggICAyNCAgIDM2ICAgNDggICA1NCAgIDYwCisgKgorICogICAgICAgICAgICAgIEc6ICA3ICAgMTMgICAzNSAgIDU4ICAgNDAgIDU3ICAgNzIgICA5OCAgMTIxICAxNTQgIDE3NyAgMTg2ICAxODYKKyAqICAgICAgICAgICAgICBBOiAgMCAgICAwICAgIDAgICAgMCAgIDQwICA1NyAgIDcyICAgOTggIDEyMSAgMTU0ICAxNzcgIDE4NiAgMTg2CisgKiAgICAgU0lTTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA0MiAgNDIgICA3NiAgMTAyICAxMjQgIDE1OSAgMTgzICAxOTMgIDIwMgorICogU0dJIFNJU08gMjBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNDYgIDQ2ICAgODIgIDExMCAgMTMyICAxNjggIDE5MiAgMjAyICAyMTEKKyAqICAgICBNSU1PIDIwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDc0ICA3NCAgMTIzICAxNTUgIDE3OSAgMjE0ICAyMzYgIDI0NCAgMjUxCisgKiBTR0kgTUlNTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA4MSAgODEgIDEzMSAgMTY0ICAxODggIDIyMiAgMjQzICAyNTEgIDI1NworICogICAgIFNJU08gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNzcgIDc3ICAxMjcgIDE2MCAgMTg0ICAyMjAgIDI0MiAgMjUwICAyNTcKKyAqIFNHSSBTSVNPIDQwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDgzICA4MyAgMTM1ICAxNjkgIDE5MyAgMjI5ICAyNTAgIDI1NyAgMjY0CisgKiAgICAgTUlNTyA0ME1IejogIDAgICAgMCAgICAwICAgIDAgIDEyMyAxMjMgIDE4MiAgMjE0ICAyMzUgIDI2NCAgMjc5ICAyODUgIDI4OQorICogU0dJIE1JTU8gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAxMzEgMTMxICAxOTEgIDIyMiAgMjQyICAyNzAgIDI4NCAgMjg5ICAyOTMKKyAqCisgKiBBZnRlciB0aGUgbmV3IG1vZGUgaGFzIGJlZW4gdHJpZWQgZm9yIGEgc2hvcnQgd2hpbGUgKG1pbmltdW0gb2YgNiBmYWlsZWQKKyAqIGZyYW1lcyBvciA4IHN1Y2Nlc3NmdWwgZnJhbWVzKSwgY29tcGFyZSBzdWNjZXNzIHJhdGlvIGFuZCBhY3R1YWwgdGhyb3VnaHB1dAorICogZXN0aW1hdGUgb2YgdGhlIG5ldyBtb2RlIHdpdGggdGhlIG9sZC4gIElmIGVpdGhlciBpcyBiZXR0ZXIgd2l0aCB0aGUgbmV3CisgKiBtb2RlLCBjb250aW51ZSB0byB1c2UgdGhlIG5ldyBtb2RlLgorICoKKyAqIENvbnRpbnVlIGNvbXBhcmluZyBtb2RlcyB1bnRpbCBhbGwgMyBwb3NzaWJpbGl0aWVzIGhhdmUgYmVlbiB0cmllZC4KKyAqIElmIG1vdmluZyBmcm9tIGxlZ2FjeSB0byBIVCwgdHJ5IGFsbCAzIHBvc3NpYmlsaXRpZXMgZnJvbSB0aGUgbmV3IEhUCisgKiBtb2RlLiAgQWZ0ZXIgdHJ5aW5nIGFsbCAzLCBhIGJlc3QgbW9kZSBpcyBmb3VuZC4gIENvbnRpbnVlIHRvIHVzZSB0aGlzIG1vZGUKKyAqIGZvciB0aGUgbG9uZ2VyICJ3aGlsZSIgZGVzY3JpYmVkIGFib3ZlIChlLmcuIDQ4MCBzdWNjZXNzZnVsIGZyYW1lcyBmb3IKKyAqIGxlZ2FjeSksIGFuZCB0aGVuIHJlcGVhdCB0aGUgc2VhcmNoIHByb2Nlc3MuCisgKgorICovCitzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCB7CisKKwkvKiBJbmRleCBvZiBkZXN0aW5hdGlvbi9yZWNpcGllbnQgc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUgKi8KKwl1OCBzdGFfaWQ7CisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiBjb250cm9sOwkJLyogbm90IHVzZWQgKi8KKwlzdHJ1Y3QgaWxfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zIGdlbmVyYWxfcGFyYW1zOworCXN0cnVjdCBpbF9saW5rX3F1YWxfYWdnX3BhcmFtcyBhZ2dfcGFyYW1zOworCisJLyoKKwkgKiBSYXRlIGluZm87IHdoZW4gdXNpbmcgcmF0ZS1zY2FsaW5nLCBUeCBjb21tYW5kJ3MgaW5pdGlhbF9yYXRlX2lkeAorCSAqIHNwZWNpZmllcyAxc3QgVHggcmF0ZSBhdHRlbXB0ZWQsIHZpYSBpZHggaW50byB0aGlzIHRhYmxlLgorCSAqIDQ5NjUgZGV2aWNlcyB3b3JrcyBpdHMgd2F5IHRocm91Z2ggdGFibGUgd2hlbiByZXRyeWluZyBUeC4KKwkgKi8KKwlzdHJ1Y3QgeworCQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qLCBSQVRFXyogKi8KKwl9IHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXTsKKwlfX2xlMzIgcmVzZXJ2ZWQyOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEJUIGNvbmZpZ3VyYXRpb24gZW5hYmxlIGZsYWdzOgorICogICBiaXQgMCAtIDE6IEJUIGNoYW5uZWwgYW5ub3VuY2VtZW50IGVuYWJsZWQKKyAqICAgICAgICAgICAwOiBkaXNhYmxlCisgKiAgIGJpdCAxIC0gMTogcHJpb3JpdHkgb2YgQlQgZGV2aWNlIGVuYWJsZWQKKyAqICAgICAgICAgICAwOiBkaXNhYmxlCisgKi8KKyNkZWZpbmUgQlRfQ09FWF9ESVNBQkxFICgweDApCisjZGVmaW5lIEJUX0VOQUJMRV9DSEFOTkVMX0FOTk9VTkNFIEJJVCgwKQorI2RlZmluZSBCVF9FTkFCTEVfUFJJT1JJVFkJICAgQklUKDEpCisKKyNkZWZpbmUgQlRfQ09FWF9FTkFCTEUgIChCVF9FTkFCTEVfQ0hBTk5FTF9BTk5PVU5DRSB8IEJUX0VOQUJMRV9QUklPUklUWSkKKworI2RlZmluZSBCVF9MRUFEX1RJTUVfREVGICgweDFFKQorCisjZGVmaW5lIEJUX01BWF9LSUxMX0RFRiAoMHg1KQorCisvKgorICogQ19CVF9DT05GSUcgPSAweDliIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKgorICogMzk0NSBhbmQgNDk2NSBkZXZpY2VzIHN1cHBvcnQgaGFyZHdhcmUgaGFuZHNoYWtlIHdpdGggQmx1ZXRvb3RoIGRldmljZSBvbgorICogc2FtZSBwbGF0Zm9ybS4gIEJsdWV0b290aCBkZXZpY2UgYWxlcnRzIHdpcmVsZXNzIGRldmljZSB3aGVuIGl0IHdpbGwgVHg7CisgKiB3aXJlbGVzcyBkZXZpY2UgY2FuIGRlbGF5IG9yIGtpbGwgaXRzIG93biBUeCB0byBhY2NvbW1vZGF0ZS4KKyAqLworc3RydWN0IGlsX2J0X2NtZCB7CisJdTggZmxhZ3M7CisJdTggbGVhZF90aW1lOworCXU4IG1heF9raWxsOworCXU4IHJlc2VydmVkOworCV9fbGUzMiBraWxsX2Fja19tYXNrOworCV9fbGUzMiBraWxsX2N0c19tYXNrOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDYpCisgKiBTcGVjdHJ1bSBNYW5hZ2VtZW50ICg4MDIuMTFoKSBDb21tYW5kcywgUmVzcG9uc2VzLCBOb3RpZmljYXRpb25zOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNwZWN0cnVtIE1hbmFnZW1lbnQKKyAqLworI2RlZmluZSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRyAoUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgICAgICAgICB8IFwKKwkJCQkgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLICAgICAgICB8IFwKKwkJCQkgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICB8IFwKKwkJCQkgUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLICAgICB8IFwKKwkJCQkgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyB8IFwKKwkJCQkgUlhPTl9GSUxURVJfQVNTT0NfTVNLICAgICAgICAgICB8IFwKKwkJCQkgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spCisKK3N0cnVjdCBpbF9tZWFzdXJlX2NoYW5uZWwgeworCV9fbGUzMiBkdXJhdGlvbjsJLyogbWVhc3VyZW1lbnQgZHVyYXRpb24gaW4gZXh0ZW5kZWQgYmVhY29uCisJCQkJICogZm9ybWF0ICovCisJdTggY2hhbm5lbDsJCS8qIGNoYW5uZWwgdG8gbWVhc3VyZSAqLworCXU4IHR5cGU7CQkvKiBzZWUgZW51bSBpbF9tZWFzdXJlX3R5cGUgKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKgorICogQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzQgKGNvbW1hbmQpCisgKi8KK3N0cnVjdCBpbF9zcGVjdHJ1bV9jbWQgeworCV9fbGUxNiBsZW47CQkvKiBudW1iZXIgb2YgYnl0ZXMgc3RhcnRpbmcgZnJvbSB0b2tlbiAqLworCXU4IHRva2VuOwkJLyogdG9rZW4gaWQgKi8KKwl1OCBpZDsJCQkvKiBtZWFzdXJlbWVudCBpZCAtLSAwIG9yIDEgKi8KKwl1OCBvcmlnaW47CQkvKiAwID0gVEdoLCAxID0gb3RoZXIsIDIgPSBUR2sgKi8KKwl1OCBwZXJpb2RpYzsJCS8qIDEgPSBwZXJpb2RpYyAqLworCV9fbGUxNiBwYXRoX2xvc3NfdGltZW91dDsKKwlfX2xlMzIgc3RhcnRfdGltZTsJLyogc3RhcnQgdGltZSBpbiBleHRlbmRlZCBiZWFjb24gZm9ybWF0ICovCisJX19sZTMyIHJlc2VydmVkMjsKKwlfX2xlMzIgZmxhZ3M7CQkvKiByeG9uIGZsYWdzICovCisJX19sZTMyIGZpbHRlcl9mbGFnczsJLyogcnhvbiBmaWx0ZXIgZmxhZ3MgKi8KKwlfX2xlMTYgY2hhbm5lbF9jb3VudDsJLyogbWluaW11bSAxLCBtYXhpbXVtIDEwICovCisJX19sZTE2IHJlc2VydmVkMzsKKwlzdHJ1Y3QgaWxfbWVhc3VyZV9jaGFubmVsIGNoYW5uZWxzWzEwXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDX1NQRUNUUlVNX01FQVNVUkVNRU5UID0gMHg3NCAocmVzcG9uc2UpCisgKi8KK3N0cnVjdCBpbF9zcGVjdHJ1bV9yZXNwIHsKKwl1OCB0b2tlbjsKKwl1OCBpZDsJCQkvKiBpZCBvZiB0aGUgcHJpb3IgY29tbWFuZCByZXBsYWNlZCwgb3IgMHhmZiAqLworCV9fbGUxNiBzdGF0dXM7CQkvKiAwIC0gY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQKKwkJCQkgKiAxIC0gY2Fubm90IGhhbmRsZSAoY29uZmxpY3RzIHdpdGggYW5vdGhlcgorCQkJCSAqICAgICBtZWFzdXJlbWVudCkgKi8KK30gX19wYWNrZWQ7CisKK2VudW0gaWxfbWVhc3VyZW1lbnRfc3RhdGUgeworCUlMX01FQVNVUkVNRU5UX1NUQVJUID0gMCwKKwlJTF9NRUFTVVJFTUVOVF9TVE9QID0gMSwKK307CisKK2VudW0gaWxfbWVhc3VyZW1lbnRfc3RhdHVzIHsKKwlJTF9NRUFTVVJFTUVOVF9PSyA9IDAsCisJSUxfTUVBU1VSRU1FTlRfQ09OQ1VSUkVOVCA9IDEsCisJSUxfTUVBU1VSRU1FTlRfQ1NBX0NPTkZMSUNUID0gMiwKKwlJTF9NRUFTVVJFTUVOVF9UR0hfQ09ORkxJQ1QgPSAzLAorCS8qIDQtNSByZXNlcnZlZCAqLworCUlMX01FQVNVUkVNRU5UX1NUT1BQRUQgPSA2LAorCUlMX01FQVNVUkVNRU5UX1RJTUVPVVQgPSA3LAorCUlMX01FQVNVUkVNRU5UX1BFUklPRElDX0ZBSUxFRCA9IDgsCit9OworCisjZGVmaW5lIE5VTV9FTEVNRU5UU19JTl9ISVNUT0dSQU0gOAorCitzdHJ1Y3QgaWxfbWVhc3VyZW1lbnRfaGlzdG9ncmFtIHsKKwlfX2xlMzIgb2ZkbVtOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNXTsJLyogaW4gMC44dXNlYyBjb3VudHMgKi8KKwlfX2xlMzIgY2NrW05VTV9FTEVNRU5UU19JTl9ISVNUT0dSQU1dOwkvKiBpbiAxdXNlYyBjb3VudHMgKi8KK30gX19wYWNrZWQ7CisKKy8qIGNsZWFyIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNvdW50ZXJzICovCitzdHJ1Y3QgaWxfbWVhc3VyZW1lbnRfY2NhX2NvdW50ZXJzIHsKKwlfX2xlMzIgb2ZkbTsKKwlfX2xlMzIgY2NrOworfSBfX3BhY2tlZDsKKworZW51bSBpbF9tZWFzdXJlX3R5cGUgeworCUlMX01FQVNVUkVfQkFTSUMgPSAoMSA8PCAwKSwKKwlJTF9NRUFTVVJFX0NIQU5ORUxfTE9BRCA9ICgxIDw8IDEpLAorCUlMX01FQVNVUkVfSElTVE9HUkFNX1JQSSA9ICgxIDw8IDIpLAorCUlMX01FQVNVUkVfSElTVE9HUkFNX05PSVNFID0gKDEgPDwgMyksCisJSUxfTUVBU1VSRV9GUkFNRSA9ICgxIDw8IDQpLAorCS8qIGJpdHMgNTo2IGFyZSByZXNlcnZlZCAqLworCUlMX01FQVNVUkVfSURMRSA9ICgxIDw8IDcpLAorfTsKKworLyoKKyAqIE5fU1BFQ1RSVU1fTUVBU1VSRU1FTlQgPSAweDc1IChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiB7CisJdTggaWQ7CQkJLyogbWVhc3VyZW1lbnQgaWQgLS0gMCBvciAxICovCisJdTggdG9rZW47CisJdTggY2hhbm5lbF9pZHg7CQkvKiBpZHggaW4gbWVhc3VyZW1lbnQgY2hhbm5lbCBsaXN0ICovCisJdTggc3RhdGU7CQkvKiAwIC0gc3RhcnQsIDEgLSBzdG9wICovCisJX19sZTMyIHN0YXJ0X3RpbWU7CS8qIGxvd2VyIDMyLWJpdHMgb2YgVFNGICovCisJdTggYmFuZDsJCS8qIDAgLSA1LjJHSHosIDEgLSAyLjRHSHogKi8KKwl1OCBjaGFubmVsOworCXU4IHR5cGU7CQkvKiBzZWUgZW51bSBpbF9tZWFzdXJlbWVudF90eXBlICovCisJdTggcmVzZXJ2ZWQxOworCS8qIE5PVEU6ICBjY2Ffb2ZkbSwgY2NhX2NjaywgYmFzaWNfdHlwZSwgYW5kIGhpc3RvZ3JhbSBhcmUgb25seSBvbmx5CisJICogdmFsaWQgaWYgYXBwbGljYWJsZSBmb3IgbWVhc3VyZW1lbnQgdHlwZSByZXF1ZXN0ZWQuICovCisJX19sZTMyIGNjYV9vZmRtOwkvKiBjY2EgZnJhY3Rpb24gdGltZSBpbiA0ME1oeiBjbG9jayBwZXJpb2RzICovCisJX19sZTMyIGNjYV9jY2s7CQkvKiBjY2EgZnJhY3Rpb24gdGltZSBpbiA0NE1oeiBjbG9jayBwZXJpb2RzICovCisJX19sZTMyIGNjYV90aW1lOwkvKiBjaGFubmVsIGxvYWQgdGltZSBpbiB1c2VjcyAqLworCXU4IGJhc2ljX3R5cGU7CQkvKiAwIC0gYnNzLCAxIC0gb2ZkbSBwcmVhbWJsZSwgMiAtCisJCQkJICogdW5pZGVudGlmaWVkICovCisJdTggcmVzZXJ2ZWQyWzNdOworCXN0cnVjdCBpbF9tZWFzdXJlbWVudF9oaXN0b2dyYW0gaGlzdG9ncmFtOworCV9fbGUzMiBzdG9wX3RpbWU7CS8qIGxvd2VyIDMyLWJpdHMgb2YgVFNGICovCisJX19sZTMyIHN0YXR1czsJCS8qIHNlZSBpbF9tZWFzdXJlbWVudF9zdGF0dXMgKi8KK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg3KQorICogUG93ZXIgTWFuYWdlbWVudCBDb21tYW5kcywgUmVzcG9uc2VzLCBOb3RpZmljYXRpb25zOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgLSBQb3dlciBUYWJsZSBDb21tYW5kCisgKiBAZmxhZ3M6IFNlZSBiZWxvdzoKKyAqCisgKiBDX1BPV0VSX1RCTCA9IDB4NzcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBQTSBhbGxvdzoKKyAqICAgYml0IDAgLSAnMCcgRHJpdmVyIG5vdCBhbGxvdyBwb3dlciBtYW5hZ2VtZW50CisgKiAgICAgICAgICAgJzEnIERyaXZlciBhbGxvdyBQTSAodXNlIHJlc3Qgb2YgcGFyYW1ldGVycykKKyAqCisgKiB1Q29kZSBzZW5kIHNsZWVwIG5vdGlmaWNhdGlvbnM6CisgKiAgIGJpdCAxIC0gJzAnIERvbid0IHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uCisgKiAgICAgICAgICAgJzEnIHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uIChTRU5EX1BNX05PVElGSUNBVElPTikKKyAqCisgKiBTbGVlcCBvdmVyIERUSU0KKyAqICAgYml0IDIgLSAnMCcgUE0gaGF2ZSB0byB3YWxrIHVwIGV2ZXJ5IERUSU0KKyAqICAgICAgICAgICAnMScgUE0gY291bGQgc2xlZXAgb3ZlciBEVElNIHRpbGwgbGlzdGVuIEludGVydmFsLgorICoKKyAqIFBDSSBwb3dlciBtYW5hZ2VkCisgKiAgIGJpdCAzIC0gJzAnIChQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKKyAqICAgICAgICAgICAnMScgIShQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKKyAqCisgKiBGYXN0IFBECisgKiAgIGJpdCA0IC0gJzEnIFB1dCByYWRpbyB0byBzbGVlcCB3aGVuIHJlY2VpdmluZyBmcmFtZSBmb3Igb3RoZXJzCisgKgorICogRm9yY2Ugc2xlZXAgTW9kZXMKKyAqICAgYml0IDMxLzMwLSAnMDAnIHVzZSBib3RoIG1hYy94dGFsIHNsZWVwcworICogICAgICAgICAgICAgICcwMScgZm9yY2UgTWFjIHNsZWVwCisgKiAgICAgICAgICAgICAgJzEwJyBmb3JjZSB4dGFsIHNsZWVwCisgKiAgICAgICAgICAgICAgJzExJyBJbGxlZ2FsIHNldAorICoKKyAqIE5PVEU6IGlmIHNsZWVwX2ludGVydmFsW1NMRUVQX0lOVFJWTF9UQkxfU0laRS0xXSA+IERUSU0gcGVyaW9kIHRoZW4KKyAqIHVjb2RlIGFzc3VtZSBzbGVlcCBvdmVyIERUSU0gaXMgYWxsb3dlZCBhbmQgd2UgZG9uJ3QgbmVlZCB0byB3YWtlIHVwCisgKiBmb3IgZXZlcnkgRFRJTS4KKyAqLworI2RlZmluZSBJTF9QT1dFUl9WRUNfU0laRSA1CisKKyNkZWZpbmUgSUxfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSwljcHVfdG9fbGUxNihCSVQoMCkpCisjZGVmaW5lIElMX1BPV0VSX1BDSV9QTV9NU0sJCQljcHVfdG9fbGUxNihCSVQoMykpCisKK3N0cnVjdCBpbDM5NDVfcG93ZXJ0YWJsZV9jbWQgeworCV9fbGUxNiBmbGFnczsKKwl1OCByZXNlcnZlZFsyXTsKKwlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OworCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7CisJX19sZTMyIHNsZWVwX2ludGVydmFsW0lMX1BPV0VSX1ZFQ19TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCB7CisJX19sZTE2IGZsYWdzOworCXU4IGtlZXBfYWxpdmVfc2Vjb25kczsJLyogMzk0NSByZXNlcnZlZCAqLworCXU4IGRlYnVnX2ZsYWdzOwkJLyogMzk0NSByZXNlcnZlZCAqLworCV9fbGUzMiByeF9kYXRhX3RpbWVvdXQ7CisJX19sZTMyIHR4X2RhdGFfdGltZW91dDsKKwlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSUxfUE9XRVJfVkVDX1NJWkVdOworCV9fbGUzMiBrZWVwX2FsaXZlX2JlYWNvbnM7Cit9IF9fcGFja2VkOworCisvKgorICogTl9QTV9TTEVFUCA9IDB4N0EgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICogYWxsIGRldmljZXMgaWRlbnRpY2FsLgorICovCitzdHJ1Y3QgaWxfc2xlZXBfbm90aWZpY2F0aW9uIHsKKwl1OCBwbV9zbGVlcF9tb2RlOworCXU4IHBtX3dha2V1cF9zcmM7CisJX19sZTE2IHJlc2VydmVkOworCV9fbGUzMiBzbGVlcF90aW1lOworCV9fbGUzMiB0c2ZfbG93OworCV9fbGUzMiBiY29uX3RpbWVyOworfSBfX3BhY2tlZDsKKworLyogU2xlZXAgc3RhdGVzLiAgYWxsIGRldmljZXMgaWRlbnRpY2FsLiAqLworZW51bSB7CisJSUxfUE1fTk9fU0xFRVAgPSAwLAorCUlMX1BNX1NMUF9NQUMgPSAxLAorCUlMX1BNX1NMUF9GVUxMX01BQ19VTkFTU09DSUFURSA9IDIsCisJSUxfUE1fU0xQX0ZVTExfTUFDX0NBUkRfU1RBVEUgPSAzLAorCUlMX1BNX1NMUF9QSFkgPSA0LAorCUlMX1BNX1NMUF9SRVBFTlQgPSA1LAorCUlMX1BNX1dBS0VVUF9CWV9USU1FUiA9IDYsCisJSUxfUE1fV0FLRVVQX0JZX0RSSVZFUiA9IDcsCisJSUxfUE1fV0FLRVVQX0JZX1JGS0lMTCA9IDgsCisJLyogMyByZXNlcnZlZCAqLworCUlMX1BNX05VTV9PRl9NT0RFUyA9IDEyLAorfTsKKworLyoKKyAqIE5fQ0FSRF9TVEFURSA9IDB4YTEgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICovCitzdHJ1Y3QgaWxfY2FyZF9zdGF0ZV9ub3RpZiB7CisJX19sZTMyIGZsYWdzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIV19DQVJEX0RJU0FCTEVEICAgMHgwMQorI2RlZmluZSBTV19DQVJEX0RJU0FCTEVEICAgMHgwMgorI2RlZmluZSBDVF9DQVJEX0RJU0FCTEVEICAgMHgwNAorI2RlZmluZSBSWE9OX0NBUkRfRElTQUJMRUQgMHgxMAorCitzdHJ1Y3QgaWxfY3Rfa2lsbF9jb25maWcgeworCV9fbGUzMiByZXNlcnZlZDsKKwlfX2xlMzIgY3JpdGljYWxfdGVtcGVyYXR1cmVfTTsKKwlfX2xlMzIgY3JpdGljYWxfdGVtcGVyYXR1cmVfUjsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg4KQorICogU2NhbiBDb21tYW5kcywgUmVzcG9uc2VzLCBOb3RpZmljYXRpb25zOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFIGNwdV90b19sZTMyKDApCisjZGVmaW5lIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSAgY3B1X3RvX2xlMzIoMSkKKworLyoqCisgKiBzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsIC0gZW50cnkgaW4gQ19TQ0FOIGNoYW5uZWwgdGFibGUKKyAqCisgKiBPbmUgZm9yIGVhY2ggY2hhbm5lbCBpbiB0aGUgc2NhbiBsaXN0LgorICogRWFjaCBjaGFubmVsIGNhbiBpbmRlcGVuZGVudGx5IHNlbGVjdDoKKyAqIDEpICBTU0lEIGZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMKKyAqIDIpICBUeHBvd2VyIHNldHRpbmcgKGZvciByYXRlIHNwZWNpZmllZCB3aXRoaW4gVHggY29tbWFuZCkKKyAqIDMpICBIb3cgbG9uZyB0byBzdGF5IG9uLWNoYW5uZWwgKGJlaGF2aW9yIG1heSBiZSBtb2RpZmllZCBieSBxdWlldF90aW1lLAorICogICAgIHF1aWV0X3BsY3BfdGgsIGdvb2RfQ1JDX3RoKQorICoKKyAqIFRvIGF2b2lkIHVDb2RlIGVycm9ycywgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgYXJlIHRydWUgKHNlZSBjb21tZW50cworICogdW5kZXIgc3RydWN0IGlsX3NjYW5fY21kIGFib3V0IG1heF9vdXRfdGltZSBhbmQgcXVpZXRfdGltZSk6CisgKiAxKSAgSWYgdXNpbmcgcGFzc2l2ZV9kd2VsbCAoaS5lLiBwYXNzaXZlX2R3ZWxsICE9IDApOgorICogICAgIGFjdGl2ZV9kd2VsbCA8PSBwYXNzaXZlX2R3ZWxsICg8IG1heF9vdXRfdGltZSBpZiBtYXhfb3V0X3RpbWUgIT0gMCkKKyAqIDIpICBxdWlldF90aW1lIDw9IGFjdGl2ZV9kd2VsbAorICogMykgIElmIHJlc3RyaWN0aW5nIG9mZi1jaGFubmVsIHRpbWUgKGkuZS4gbWF4X291dF90aW1lICE9MCk6CisgKiAgICAgcGFzc2l2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQorICogICAgIGFjdGl2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQorICovCitzdHJ1Y3QgaWwzOTQ1X3NjYW5fY2hhbm5lbCB7CisJLyoKKwkgKiB0eXBlIGlzIGRlZmluZWQgYXM6CisJICogMDowIDEgPSBhY3RpdmUsIDAgPSBwYXNzaXZlCisJICogMTo0IFNTSUQgZGlyZWN0IGJpdCBtYXA7IGlmIGEgYml0IGlzIHNldCwgdGhlbiBjb3JyZXNwb25kaW5nCisJICogICAgIFNTSUQgSUUgaXMgdHJhbnNtaXR0ZWQgaW4gcHJvYmUgcmVxdWVzdC4KKwkgKiA1OjcgcmVzZXJ2ZWQKKwkgKi8KKwl1OCB0eXBlOworCXU4IGNoYW5uZWw7CQkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGlsMzk0NV9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkICovCisJc3RydWN0IGlsMzk0NV90eF9wb3dlciB0cGM7CisJX19sZTE2IGFjdGl2ZV9kd2VsbDsJLyogaW4gMTAyNC11U2VjIFRVICh0aW1lIHVuaXRzKSwgdHlwIDUtNTAgKi8KKwlfX2xlMTYgcGFzc2l2ZV9kd2VsbDsJLyogaW4gMTAyNC11U2VjIFRVICh0aW1lIHVuaXRzKSwgdHlwIDIwLTUwMCAqLworfSBfX3BhY2tlZDsKKworLyogc2V0IG51bWJlciBvZiBkaXJlY3QgcHJvYmVzIHU4IHR5cGUgKi8KKyNkZWZpbmUgSUwzOV9TQ0FOX1BST0JFX01BU0sobikgKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCisKK3N0cnVjdCBpbF9zY2FuX2NoYW5uZWwgeworCS8qCisJICogdHlwZSBpcyBkZWZpbmVkIGFzOgorCSAqIDA6MCAxID0gYWN0aXZlLCAwID0gcGFzc2l2ZQorCSAqIDE6MjAgU1NJRCBkaXJlY3QgYml0IG1hcDsgaWYgYSBiaXQgaXMgc2V0LCB0aGVuIGNvcnJlc3BvbmRpbmcKKwkgKiAgICAgU1NJRCBJRSBpcyB0cmFuc21pdHRlZCBpbiBwcm9iZSByZXF1ZXN0LgorCSAqIDIxOjMxIHJlc2VydmVkCisJICovCisJX19sZTMyIHR5cGU7CisJX19sZTE2IGNoYW5uZWw7CQkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGlsX3NjYW5fY21kICJmbGFncyIgZmllbGQgKi8KKwl1OCB0eF9nYWluOwkJLyogZ2FpbiBmb3IgYW5hbG9nIHJhZGlvICovCisJdTggZHNwX2F0dGVuOwkJLyogZ2FpbiBmb3IgRFNQICovCisJX19sZTE2IGFjdGl2ZV9kd2VsbDsJLyogaW4gMTAyNC11U2VjIFRVICh0aW1lIHVuaXRzKSwgdHlwIDUtNTAgKi8KKwlfX2xlMTYgcGFzc2l2ZV9kd2VsbDsJLyogaW4gMTAyNC11U2VjIFRVICh0aW1lIHVuaXRzKSwgdHlwIDIwLTUwMCAqLworfSBfX3BhY2tlZDsKKworLyogc2V0IG51bWJlciBvZiBkaXJlY3QgcHJvYmVzIF9fbGUzMiB0eXBlICovCisjZGVmaW5lIElMX1NDQU5fUFJPQkVfTUFTSyhuKQljcHVfdG9fbGUzMigoQklUKG4pIHwgKEJJVChuKSAtIEJJVCgxKSkpKQorCisvKioKKyAqIHN0cnVjdCBpbF9zc2lkX2llIC0gZGlyZWN0ZWQgc2NhbiBuZXR3b3JrIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqCisgKiBVcCB0byAyMCBvZiB0aGVzZSBtYXkgYXBwZWFyIGluIENfU0NBTiAoTm90ZTogT25seSA0IGFyZSBpbgorICogMzk0NSBTQ0FOIGFwaSksIHNlbGVjdGVkIGJ5ICJ0eXBlIiBiaXQgZmllbGQgaW4gc3RydWN0IGlsX3NjYW5fY2hhbm5lbDsKKyAqIGVhY2ggY2hhbm5lbCBtYXkgc2VsZWN0IGRpZmZlcmVudCBzc2lkcyBmcm9tIGFtb25nIHRoZSAyMCAoNCkgZW50cmllcy4KKyAqIFNTSUQgSUVzIGdldCB0cmFuc21pdHRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGVudHJ5LgorICovCitzdHJ1Y3QgaWxfc3NpZF9pZSB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IHNzaWRbMzJdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBQUk9CRV9PUFRJT05fTUFYXzM5NDUJCTQKKyNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWAkJMjAKKyNkZWZpbmUgVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURQljcHVfdG9fbGUzMigweEZGRkZGRkZGKQorI2RlZmluZSBJTF9HT09EX0NSQ19USF9ESVNBQkxFRAkwCisjZGVmaW5lIElMX0dPT0RfQ1JDX1RIX0RFRkFVTFQJCWNwdV90b19sZTE2KDEpCisjZGVmaW5lIElMX0dPT0RfQ1JDX1RIX05FVkVSCQljcHVfdG9fbGUxNigweGZmZmYpCisjZGVmaW5lIElMX01BWF9TQ0FOX1NJWkUgMTAyNAorI2RlZmluZSBJTF9NQVhfQ01EX1NJWkUgNDA5NgorCisvKgorICogQ19TQ0FOID0gMHg4MCAoY29tbWFuZCkKKyAqCisgKiBUaGUgaGFyZHdhcmUgc2NhbiBjb21tYW5kIGlzIHZlcnkgcG93ZXJmdWw7IHRoZSBkcml2ZXIgY2FuIHNldCBpdCB1cCB0bworICogbWFpbnRhaW4gKHJlbGF0aXZlbHkpIG5vcm1hbCBuZXR3b3JrIHRyYWZmaWMgd2hpbGUgZG9pbmcgYSBzY2FuIGluIHRoZQorICogYmFja2dyb3VuZC4gIFRoZSBtYXhfb3V0X3RpbWUgYW5kIHN1c3BlbmRfdGltZSBjb250cm9sIHRoZSByYXRpbyBvZiBob3cKKyAqIGxvbmcgdGhlIGRldmljZSBzdGF5cyBvbiBhbiBhc3NvY2lhdGVkIG5ldHdvcmsgY2hhbm5lbCAoInNlcnZpY2UgY2hhbm5lbCIpCisgKiB2cy4gaG93IGxvbmcgaXQncyBhd2F5IGZyb20gdGhlIHNlcnZpY2UgY2hhbm5lbCwgaS5lLiB0dW5lZCB0byBvdGhlciBjaGFubmVscworICogZm9yIHNjYW5uaW5nLgorICoKKyAqIG1heF9vdXRfdGltZSBpcyB0aGUgbWF4IHRpbWUgb2ZmLWNoYW5uZWwgKGluIHVzZWMpLCBhbmQgc3VzcGVuZF90aW1lCisgKiBpcyBob3cgbG9uZyAoaW4gImV4dGVuZGVkIGJlYWNvbiIgZm9ybWF0KSB0aGF0IHRoZSBzY2FuIGlzICJzdXNwZW5kZWQiCisgKiBhZnRlciByZXR1cm5pbmcgdG8gdGhlIHNlcnZpY2UgY2hhbm5lbC4gIFRoYXQgaXMsIHN1c3BlbmRfdGltZSBpcyB0aGUKKyAqIHRpbWUgdGhhdCB3ZSBzdGF5IG9uIHRoZSBzZXJ2aWNlIGNoYW5uZWwsIGRvaW5nIG5vcm1hbCB3b3JrLCBiZXR3ZWVuCisgKiBzY2FuIHNlZ21lbnRzLiAgVGhlIGRyaXZlciBtYXkgc2V0IHRoZXNlIHBhcmFtZXRlcnMgZGlmZmVyZW50bHkgdG8gc3VwcG9ydAorICogc2Nhbm5pbmcgd2hlbiBhc3NvY2lhdGVkIHZzLiBub3QgYXNzb2NpYXRlZCwgYW5kIGxpZ2h0IHZzLiBoZWF2eSB0cmFmZmljCisgKiBsb2FkcyB3aGVuIGFzc29jaWF0ZWQuCisgKgorICogQWZ0ZXIgcmVjZWl2aW5nIHRoaXMgY29tbWFuZCwgdGhlIGRldmljZSdzIHNjYW4gZW5naW5lIGRvZXMgdGhlIGZvbGxvd2luZzsKKyAqCisgKiAxKSAgU2VuZHMgU0NBTl9TVEFSVCBub3RpZmljYXRpb24gdG8gZHJpdmVyCisgKiAyKSAgQ2hlY2tzIHRvIHNlZSBpZiBpdCBoYXMgdGltZSB0byBkbyBzY2FuIGZvciBvbmUgY2hhbm5lbAorICogMykgIFNlbmRzIE5VTEwgcGFja2V0LCB3aXRoIHBvd2VyLXNhdmUgKFBTKSBiaXQgc2V0IHRvIDEsCisgKiAgICAgdG8gdGVsbCBBUCB0aGF0IHdlJ3JlIGdvaW5nIG9mZi1jaGFubmVsCisgKiA0KSAgVHVuZXMgdG8gZmlyc3QgY2hhbm5lbCBpbiBzY2FuIGxpc3QsIGRvZXMgYWN0aXZlIG9yIHBhc3NpdmUgc2NhbgorICogNSkgIFNlbmRzIFNDQU5fUkVTVUxUIG5vdGlmaWNhdGlvbiB0byBkcml2ZXIKKyAqIDYpICBDaGVja3MgdG8gc2VlIGlmIGl0IGhhcyB0aW1lIHRvIGRvIHNjYW4gb24gKm5leHQqIGNoYW5uZWwgaW4gbGlzdAorICogNykgIFJlcGVhdHMgNC02IHVudGlsIGl0IG5vIGxvbmdlciBoYXMgdGltZSB0byBzY2FuIHRoZSBuZXh0IGNoYW5uZWwKKyAqICAgICBiZWZvcmUgbWF4X291dF90aW1lIGV4cGlyZXMKKyAqIDgpICBSZXR1cm5zIHRvIHNlcnZpY2UgY2hhbm5lbAorICogOSkgIFNlbmRzIE5VTEwgcGFja2V0IHdpdGggUFM9MCB0byB0ZWxsIEFQIHRoYXQgd2UncmUgYmFjaworICogMTApIFN0YXlzIG9uIHNlcnZpY2UgY2hhbm5lbCB1bnRpbCBzdXNwZW5kX3RpbWUgZXhwaXJlcworICogMTEpIFJlcGVhdHMgZW50aXJlIHByb2Nlc3MgMi0xMCB1bnRpbCBsaXN0IGlzIGNvbXBsZXRlCisgKiAxMikgU2VuZHMgU0NBTl9DT01QTEVURSBub3RpZmljYXRpb24KKyAqCisgKiBGb3IgZmFzdCwgZWZmaWNpZW50IHNjYW5zLCB0aGUgc2NhbiBjb21tYW5kIGFsc28gaGFzIHN1cHBvcnQgZm9yIHN0YXlpbmcgb24KKyAqIGEgY2hhbm5lbCBmb3IganVzdCBhIHNob3J0IHRpbWUsIGlmIGRvaW5nIGFjdGl2ZSBzY2FubmluZyBhbmQgZ2V0dGluZyBubworICogcmVzcG9uc2VzIHRvIHRoZSB0cmFuc21pdHRlZCBwcm9iZSByZXF1ZXN0LiAgVGhpcyB0aW1lIGlzIGNvbnRyb2xsZWQgYnkKKyAqIHF1aWV0X3RpbWUsIGFuZCB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgYmVsb3cgd2hpY2ggYSBjaGFubmVsIGlzCisgKiBjb25zaWRlcmVkICJxdWlldCIgaXMgY29udHJvbGxlZCBieSBxdWlldF9wbGNwX3RocmVzaG9sZC4KKyAqCisgKiBGb3IgYWN0aXZlIHNjYW5uaW5nIG9uIGNoYW5uZWxzIHRoYXQgaGF2ZSByZWd1bGF0b3J5IHJlc3RyaWN0aW9ucyBhZ2FpbnN0CisgKiBibGluZGx5IHRyYW5zbWl0dGluZywgdGhlIHNjYW4gY2FuIGxpc3RlbiBiZWZvcmUgdHJhbnNtaXR0aW5nLCB0byBtYWtlIHN1cmUKKyAqIHRoYXQgdGhlcmUgaXMgYWxyZWFkeSBsZWdpdGltYXRlIGFjdGl2aXR5IG9uIHRoZSBjaGFubmVsLiAgSWYgZW5vdWdoCisgKiBwYWNrZXRzIGFyZSBjbGVhbmx5IHJlY2VpdmVkIG9uIHRoZSBjaGFubmVsIChjb250cm9sbGVkIGJ5IGdvb2RfQ1JDX3RoLAorICogdHlwaWNhbCB2YWx1ZSAxKSwgdGhlIHNjYW4gZW5naW5lIHN0YXJ0cyB0cmFuc21pdHRpbmcgcHJvYmUgcmVxdWVzdHMuCisgKgorICogRHJpdmVyIG11c3QgdXNlIHNlcGFyYXRlIHNjYW4gY29tbWFuZHMgZm9yIDIuNCB2cy4gNSBHSHogYmFuZHMuCisgKgorICogVG8gYXZvaWQgdUNvZGUgZXJyb3JzLCBzZWUgdGltaW5nIHJlc3RyaWN0aW9ucyBkZXNjcmliZWQgdW5kZXIKKyAqIHN0cnVjdCBpbF9zY2FuX2NoYW5uZWwuCisgKi8KKworc3RydWN0IGlsMzk0NV9zY2FuX2NtZCB7CisJX19sZTE2IGxlbjsKKwl1OCByZXNlcnZlZDA7CisJdTggY2hhbm5lbF9jb3VudDsJLyogIyBjaGFubmVscyBpbiBjaGFubmVsIGxpc3QgKi8KKwlfX2xlMTYgcXVpZXRfdGltZTsJLyogZHdlbGwgb25seSB0aGlzICMgbWlsbGlzZWNzIG9uIHF1aWV0IGNoYW5uZWwKKwkJCQkgKiAob25seSBmb3IgYWN0aXZlIHNjYW4pICovCisJX19sZTE2IHF1aWV0X3BsY3BfdGg7CS8qIHF1aWV0IGNobmwgaXMgPCB0aGlzICMgcGt0cyAodHlwLiAxKSAqLworCV9fbGUxNiBnb29kX0NSQ190aDsJLyogcGFzc2l2ZSAtPiBhY3RpdmUgcHJvbW90aW9uIHRocmVzaG9sZCAqLworCV9fbGUxNiByZXNlcnZlZDE7CisJX19sZTMyIG1heF9vdXRfdGltZTsJLyogbWF4IHVzZWMgdG8gYmUgYXdheSBmcm9tIGFzc29jaWF0ZWQgKHNlcnZpY2UpCisJCQkJICogY2hhbm5lbCAqLworCV9fbGUzMiBzdXNwZW5kX3RpbWU7CS8qIHBhdXNlIHNjYW4gdGhpcyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uCisJCQkJICogZm9ybWF0Iikgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaGFubmVsOgorCQkJCSAqIDM5NDU7IDMxOjI0ICMgYmVhY29ucywgMTk6MCBhZGRpdGlvbmFsIHVzZWMsCisJCQkJICogNDk2NTsgMzE6MjIgIyBiZWFjb25zLCAyMTowIGFkZGl0aW9uYWwgdXNlYy4KKwkJCQkgKi8KKwlfX2xlMzIgZmxhZ3M7CQkvKiBSWE9OX0ZMR18qICovCisJX19sZTMyIGZpbHRlcl9mbGFnczsJLyogUlhPTl9GSUxURVJfKiAqLworCisJLyogRm9yIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBmb3IgcGFzc2l2ZSBzY2FucykuCisJICogRG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkLiAgTXVzdCBzcGVjaWZ5IFR4IHJhdGU7IG5vIHJhdGUgc2NhbGluZy4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCB0eF9jbWQ7CisKKwkvKiBGb3IgZGlyZWN0ZWQgYWN0aXZlIHNjYW5zIChzZXQgdG8gYWxsLTBzIG90aGVyd2lzZSkgKi8KKwlzdHJ1Y3QgaWxfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXzM5NDVdOworCisJLyoKKwkgKiBQcm9iZSByZXF1ZXN0IGZyYW1lLCBmb2xsb3dlZCBieSBjaGFubmVsIGxpc3QuCisJICoKKwkgKiBTaXplIG9mIHByb2JlIHJlcXVlc3QgZnJhbWUgaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgY291bnQgaW4gdHhfY21kLgorCSAqIENoYW5uZWwgbGlzdCBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHByb2JlIHJlcXVlc3QgZnJhbWUuCisJICogTnVtYmVyIG9mIGNoYW5uZWxzIGluIGxpc3QgaXMgc3BlY2lmaWVkIGJ5IGNoYW5uZWxfY291bnQuCisJICogRWFjaCBjaGFubmVsIGluIGxpc3QgaXMgb2YgdHlwZToKKwkgKgorCSAqIHN0cnVjdCBpbDM5NDVfc2Nhbl9jaGFubmVsIGNoYW5uZWxzWzBdOworCSAqCisJICogTk9URTogIE9ubHkgb25lIGJhbmQgb2YgY2hhbm5lbHMgY2FuIGJlIHNjYW5uZWQgcGVyIHBhc3MuICBZb3UKKwkgKiBtdXN0IG5vdCBtaXggMi40R0h6IGNoYW5uZWxzIGFuZCA1LjJHSHogY2hhbm5lbHMsIGFuZCB5b3UgbXVzdCB3YWl0CisJICogZm9yIG9uZSBzY2FuIHRvIGNvbXBsZXRlIChpLmUuIHJlY2VpdmUgTl9TQ0FOX0NPTVBMRVRFKQorCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KKwkgKi8KKwl1OCBkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGlsX3NjYW5fY21kIHsKKwlfX2xlMTYgbGVuOworCXU4IHJlc2VydmVkMDsKKwl1OCBjaGFubmVsX2NvdW50OwkvKiAjIGNoYW5uZWxzIGluIGNoYW5uZWwgbGlzdCAqLworCV9fbGUxNiBxdWlldF90aW1lOwkvKiBkd2VsbCBvbmx5IHRoaXMgIyBtaWxsaXNlY3Mgb24gcXVpZXQgY2hhbm5lbAorCQkJCSAqIChvbmx5IGZvciBhY3RpdmUgc2NhbikgKi8KKwlfX2xlMTYgcXVpZXRfcGxjcF90aDsJLyogcXVpZXQgY2hubCBpcyA8IHRoaXMgIyBwa3RzICh0eXAuIDEpICovCisJX19sZTE2IGdvb2RfQ1JDX3RoOwkvKiBwYXNzaXZlIC0+IGFjdGl2ZSBwcm9tb3Rpb24gdGhyZXNob2xkICovCisJX19sZTE2IHJ4X2NoYWluOwkvKiBSWE9OX1JYX0NIQUlOXyogKi8KKwlfX2xlMzIgbWF4X291dF90aW1lOwkvKiBtYXggdXNlYyB0byBiZSBhd2F5IGZyb20gYXNzb2NpYXRlZCAoc2VydmljZSkKKwkJCQkgKiBjaGFubmVsICovCisJX19sZTMyIHN1c3BlbmRfdGltZTsJLyogcGF1c2Ugc2NhbiB0aGlzIGxvbmcgKGluICJleHRlbmRlZCBiZWFjb24KKwkJCQkgKiBmb3JtYXQiKSB3aGVuIHJldHVybmluZyB0byBzZXJ2aWNlIGNobmw6CisJCQkJICogMzk0NTsgMzE6MjQgIyBiZWFjb25zLCAxOTowIGFkZGl0aW9uYWwgdXNlYywKKwkJCQkgKiA0OTY1OyAzMToyMiAjIGJlYWNvbnMsIDIxOjAgYWRkaXRpb25hbCB1c2VjLgorCQkJCSAqLworCV9fbGUzMiBmbGFnczsJCS8qIFJYT05fRkxHXyogKi8KKwlfX2xlMzIgZmlsdGVyX2ZsYWdzOwkvKiBSWE9OX0ZJTFRFUl8qICovCisKKwkvKiBGb3IgYWN0aXZlIHNjYW5zIChzZXQgdG8gYWxsLTBzIGZvciBwYXNzaXZlIHNjYW5zKS4KKwkgKiBEb2VzIG5vdCBpbmNsdWRlIHBheWxvYWQuICBNdXN0IHNwZWNpZnkgVHggcmF0ZTsgbm8gcmF0ZSBzY2FsaW5nLiAqLworCXN0cnVjdCBpbF90eF9jbWQgdHhfY21kOworCisJLyogRm9yIGRpcmVjdGVkIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBvdGhlcndpc2UpICovCisJc3RydWN0IGlsX3NzaWRfaWUgZGlyZWN0X3NjYW5bUFJPQkVfT1BUSU9OX01BWF07CisKKwkvKgorCSAqIFByb2JlIHJlcXVlc3QgZnJhbWUsIGZvbGxvd2VkIGJ5IGNoYW5uZWwgbGlzdC4KKwkgKgorCSAqIFNpemUgb2YgcHJvYmUgcmVxdWVzdCBmcmFtZSBpcyBzcGVjaWZpZWQgYnkgYnl0ZSBjb3VudCBpbiB0eF9jbWQuCisJICogQ2hhbm5lbCBsaXN0IGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJvYmUgcmVxdWVzdCBmcmFtZS4KKwkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gbGlzdCBpcyBzcGVjaWZpZWQgYnkgY2hhbm5lbF9jb3VudC4KKwkgKiBFYWNoIGNoYW5uZWwgaW4gbGlzdCBpcyBvZiB0eXBlOgorCSAqCisJICogc3RydWN0IGlsX3NjYW5fY2hhbm5lbCBjaGFubmVsc1swXTsKKwkgKgorCSAqIE5PVEU6ICBPbmx5IG9uZSBiYW5kIG9mIGNoYW5uZWxzIGNhbiBiZSBzY2FubmVkIHBlciBwYXNzLiAgWW91CisJICogbXVzdCBub3QgbWl4IDIuNEdIeiBjaGFubmVscyBhbmQgNS4yR0h6IGNoYW5uZWxzLCBhbmQgeW91IG11c3Qgd2FpdAorCSAqIGZvciBvbmUgc2NhbiB0byBjb21wbGV0ZSAoaS5lLiByZWNlaXZlIE5fU0NBTl9DT01QTEVURSkKKwkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCisJICovCisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qIENhbiBhYm9ydCB3aWxsIG5vdGlmeSBieSBjb21wbGV0ZSBub3RpZmljYXRpb24gd2l0aCBhYm9ydCBzdGF0dXMuICovCisjZGVmaW5lIENBTl9BQk9SVF9TVEFUVVMJY3B1X3RvX2xlMzIoMHgxKQorLyogY29tcGxldGUgbm90aWZpY2F0aW9uIHN0YXR1c2VzICovCisjZGVmaW5lIEFCT1JUX1NUQVRVUyAgICAgICAgICAgIDB4MgorCisvKgorICogQ19TQ0FOID0gMHg4MCAocmVzcG9uc2UpCisgKi8KK3N0cnVjdCBpbF9zY2FucmVxX25vdGlmaWNhdGlvbiB7CisJX19sZTMyIHN0YXR1czsJCS8qIDE6IG9rYXksIDI6IGNhbm5vdCBmdWxmaWxsIHJlcXVlc3QgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX1NDQU5fU1RBUlQgPSAweDgyIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX3NjYW5zdGFydF9ub3RpZmljYXRpb24geworCV9fbGUzMiB0c2ZfbG93OworCV9fbGUzMiB0c2ZfaGlnaDsKKwlfX2xlMzIgYmVhY29uX3RpbWVyOworCXU4IGNoYW5uZWw7CisJdTggYmFuZDsKKwl1OCByZXNlcnZlZFsyXTsKKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSAgU0NBTl9PV05FUl9TVEFUVVMgMHgxCisjZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDIKKworI2RlZmluZSBJTF9QUk9CRV9TVEFUVVNfT0sJCTAKKyNkZWZpbmUgSUxfUFJPQkVfU1RBVFVTX1RYX0ZBSUxFRAlCSVQoMCkKKy8qIGVycm9yIHN0YXR1c2VzIGNvbWJpbmVkIHdpdGggVFhfRkFJTEVEICovCisjZGVmaW5lIElMX1BST0JFX1NUQVRVU19GQUlMX1RUTAlCSVQoMSkKKyNkZWZpbmUgSUxfUFJPQkVfU1RBVFVTX0ZBSUxfQlQJQklUKDIpCisKKyNkZWZpbmUgTlVNQkVSX09GX1NUQVRTIDEJLyogZmlyc3QgX19sZTMyIGlzIGdvb2QgQ1JDICovCisvKgorICogTl9TQ0FOX1JFU1VMVFMgPSAweDgzIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqLworc3RydWN0IGlsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiB7CisJdTggY2hhbm5lbDsKKwl1OCBiYW5kOworCXU4IHByb2JlX3N0YXR1czsKKwl1OCBudW1fcHJvYmVfbm90X3NlbnQ7CS8qIG5vdCBlbm91Z2ggdGltZSB0byBzZW5kICovCisJX19sZTMyIHRzZl9sb3c7CisJX19sZTMyIHRzZl9oaWdoOworCV9fbGUzMiBzdGF0c1tOVU1CRVJfT0ZfU1RBVFNdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIE5fU0NBTl9DT01QTEVURSA9IDB4ODQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICovCitzdHJ1Y3QgaWxfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiB7CisJdTggc2Nhbm5lZF9jaGFubmVsczsKKwl1OCBzdGF0dXM7CisJdTggbGFzdF9jaGFubmVsOworCV9fbGUzMiB0c2ZfbG93OworCV9fbGUzMiB0c2ZfaGlnaDsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICg5KQorICogSUJTUy9BUCBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gaWxfaWJzc19tYW5hZ2VyIHsKKwlJTF9OT1RfSUJTU19NQU5BR0VSID0gMCwKKwlJTF9JQlNTX01BTkFHRVIgPSAxLAorfTsKKworLyoKKyAqIE5fQkVBQ09OID0gMHg5MCAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKi8KKworc3RydWN0IGlsMzk0NV9iZWFjb25fbm90aWYgeworCXN0cnVjdCBpbDM5NDVfdHhfcmVzcCBiZWFjb25fbm90aWZ5X2hkcjsKKwlfX2xlMzIgbG93X3RzZjsKKwlfX2xlMzIgaGlnaF90c2Y7CisJX19sZTMyIGlic3NfbWdyX3N0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbDQ5NjVfYmVhY29uX25vdGlmIHsKKwlzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7CisJX19sZTMyIGxvd190c2Y7CisJX19sZTMyIGhpZ2hfdHNmOworCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Cit9IF9fcGFja2VkOworCisvKgorICogQ19UWF9CRUFDT049IDB4OTEgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqLworCitzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgeworCXN0cnVjdCBpbDM5NDVfdHhfY21kIHR4OworCV9fbGUxNiB0aW1faWR4OworCXU4IHRpbV9zaXplOworCXU4IHJlc2VydmVkMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciBmcmFtZVswXTsJLyogYmVhY29uIGZyYW1lICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCB7CisJc3RydWN0IGlsX3R4X2NtZCB0eDsKKwlfX2xlMTYgdGltX2lkeDsKKwl1OCB0aW1fc2l6ZTsKKwl1OCByZXNlcnZlZDE7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDEwKQorICogU3RhdGlzdGljcyBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUxfVEVNUF9DT05WRVJUIDI2MAorCisjZGVmaW5lIFNVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTICA4CisjZGVmaW5lIFNVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTICA0CisjZGVmaW5lIFNVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTICAxMgorCisvKiBVc2VkIGZvciBwYXNzaW5nIHRvIGRyaXZlciBudW1iZXIgb2Ygc3VjY2Vzc2VzIGFuZCBmYWlsdXJlcyBwZXIgcmF0ZSAqLworc3RydWN0IHJhdGVfaGlzdG9ncmFtIHsKKwl1bmlvbiB7CisJCV9fbGUzMiBhW1NVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTXTsKKwkJX19sZTMyIGJbU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFNdOworCQlfX2xlMzIgZ1tTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMU107CisJfSBzdWNjZXNzOworCXVuaW9uIHsKKwkJX19sZTMyIGFbU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFNdOworCQlfX2xlMzIgYltTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMU107CisJCV9fbGUzMiBnW1NVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTXTsKKwl9IGZhaWxlZDsKK30gX19wYWNrZWQ7CisKKy8qIHN0YXRzIGNvbW1hbmQgcmVzcG9uc2UgKi8KKworc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSB7CisJX19sZTMyIGluYV9jbnQ7CisJX19sZTMyIGZpbmFfY250OworCV9fbGUzMiBwbGNwX2VycjsKKwlfX2xlMzIgY3JjMzJfZXJyOworCV9fbGUzMiBvdmVycnVuX2VycjsKKwlfX2xlMzIgZWFybHlfb3ZlcnJ1bl9lcnI7CisJX19sZTMyIGNyYzMyX2dvb2Q7CisJX19sZTMyIGZhbHNlX2FsYXJtX2NudDsKKwlfX2xlMzIgZmluYV9zeW5jX2Vycl9jbnQ7CisJX19sZTMyIHNmZF90aW1lb3V0OworCV9fbGUzMiBmaW5hX3RpbWVvdXQ7CisJX19sZTMyIHVucmVzcG9uZGVkX3J0czsKKwlfX2xlMzIgcnhlX2ZyYW1lX2xpbWl0X292ZXJydW47CisJX19sZTMyIHNlbnRfYWNrX2NudDsKKwlfX2xlMzIgc2VudF9jdHNfY250OworfSBfX3BhY2tlZDsKKworc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkgeworCV9fbGUzMiBib2d1c19jdHM7CS8qIENUUyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQ1RTICovCisJX19sZTMyIGJvZ3VzX2FjazsJLyogQUNLIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBBQ0sgKi8KKwlfX2xlMzIgbm9uX2Jzc2lkX2ZyYW1lczsJLyogbnVtYmVyIG9mIGZyYW1lcyB3aXRoIEJTU0lEIHRoYXQKKwkJCQkJICogZG9lc24ndCBiZWxvbmcgdG8gdGhlIFNUQSBCU1NJRCAqLworCV9fbGUzMiBmaWx0ZXJlZF9mcmFtZXM7CS8qIGNvdW50IGZyYW1lcyB0aGF0IHdlcmUgZHVtcGVkIGluIHRoZQorCQkJCSAqIGZpbHRlcmluZyBwcm9jZXNzICovCisJX19sZTMyIG5vbl9jaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGJ1dCBub3Qgb24KKwkJCQkJICogb3VyIHNlcnZpbmcgY2hhbm5lbCAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGl3bDM5X3N0YXRzX3J4IHsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5IG9mZG07CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSBjY2s7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkgZ2VuZXJhbDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2wzOV9zdGF0c190eCB7CisJX19sZTMyIHByZWFtYmxlX2NudDsKKwlfX2xlMzIgcnhfZGV0ZWN0ZWRfY250OworCV9fbGUzMiBidF9wcmlvX2RlZmVyX2NudDsKKwlfX2xlMzIgYnRfcHJpb19raWxsX2NudDsKKwlfX2xlMzIgZmV3X2J5dGVzX2NudDsKKwlfX2xlMzIgY3RzX3RpbWVvdXQ7CisJX19sZTMyIGFja190aW1lb3V0OworCV9fbGUzMiBleHBlY3RlZF9hY2tfY250OworCV9fbGUzMiBhY3R1YWxfYWNrX2NudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c19kYmcgeworCV9fbGUzMiBidXJzdF9jaGVjazsKKwlfX2xlMzIgYnVyc3RfY291bnQ7CisJX19sZTMyIHdhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQ7CisJX19sZTMyIHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGl3bDM5X3N0YXRzX2RpdiB7CisJX19sZTMyIHR4X29uX2E7CisJX19sZTMyIHR4X29uX2I7CisJX19sZTMyIGV4ZWNfdGltZTsKKwlfX2xlMzIgcHJvYmVfdGltZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpd2wzOV9zdGF0c19nZW5lcmFsIHsKKwlfX2xlMzIgdGVtcGVyYXR1cmU7CisJc3RydWN0IHN0YXRzX2RiZyBkYmc7CisJX19sZTMyIHNsZWVwX3RpbWU7CisJX19sZTMyIHNsb3RzX291dDsKKwlfX2xlMzIgc2xvdHNfaWRsZTsKKwlfX2xlMzIgdHRsX3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZGl2IGRpdjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c19yeF9waHkgeworCV9fbGUzMiBpbmFfY250OworCV9fbGUzMiBmaW5hX2NudDsKKwlfX2xlMzIgcGxjcF9lcnI7CisJX19sZTMyIGNyYzMyX2VycjsKKwlfX2xlMzIgb3ZlcnJ1bl9lcnI7CisJX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOworCV9fbGUzMiBjcmMzMl9nb29kOworCV9fbGUzMiBmYWxzZV9hbGFybV9jbnQ7CisJX19sZTMyIGZpbmFfc3luY19lcnJfY250OworCV9fbGUzMiBzZmRfdGltZW91dDsKKwlfX2xlMzIgZmluYV90aW1lb3V0OworCV9fbGUzMiB1bnJlc3BvbmRlZF9ydHM7CisJX19sZTMyIHJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuOworCV9fbGUzMiBzZW50X2Fja19jbnQ7CisJX19sZTMyIHNlbnRfY3RzX2NudDsKKwlfX2xlMzIgc2VudF9iYV9yc3BfY250OworCV9fbGUzMiBkc3Bfc2VsZl9raWxsOworCV9fbGUzMiBtaF9mb3JtYXRfZXJyOworCV9fbGUzMiByZV9hY3FfbWFpbl9yc3NpX3N1bTsKKwlfX2xlMzIgcmVzZXJ2ZWQzOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX3J4X2h0X3BoeSB7CisJX19sZTMyIHBsY3BfZXJyOworCV9fbGUzMiBvdmVycnVuX2VycjsKKwlfX2xlMzIgZWFybHlfb3ZlcnJ1bl9lcnI7CisJX19sZTMyIGNyYzMyX2dvb2Q7CisJX19sZTMyIGNyYzMyX2VycjsKKwlfX2xlMzIgbWhfZm9ybWF0X2VycjsKKwlfX2xlMzIgYWdnX2NyYzMyX2dvb2Q7CisJX19sZTMyIGFnZ19tcGR1X2NudDsKKwlfX2xlMzIgYWdnX2NudDsKKwlfX2xlMzIgdW5zdXBwb3J0X21jczsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFICAgICAgY3B1X3RvX2xlMzIoMSkKKworc3RydWN0IHN0YXRzX3J4X25vbl9waHkgeworCV9fbGUzMiBib2d1c19jdHM7CS8qIENUUyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQ1RTICovCisJX19sZTMyIGJvZ3VzX2FjazsJLyogQUNLIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBBQ0sgKi8KKwlfX2xlMzIgbm9uX2Jzc2lkX2ZyYW1lczsJLyogbnVtYmVyIG9mIGZyYW1lcyB3aXRoIEJTU0lEIHRoYXQKKwkJCQkJICogZG9lc24ndCBiZWxvbmcgdG8gdGhlIFNUQSBCU1NJRCAqLworCV9fbGUzMiBmaWx0ZXJlZF9mcmFtZXM7CS8qIGNvdW50IGZyYW1lcyB0aGF0IHdlcmUgZHVtcGVkIGluIHRoZQorCQkJCSAqIGZpbHRlcmluZyBwcm9jZXNzICovCisJX19sZTMyIG5vbl9jaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGJ1dCBub3Qgb24KKwkJCQkJICogb3VyIHNlcnZpbmcgY2hhbm5lbCAqLworCV9fbGUzMiBjaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGFuZCBpbiBvdXIKKwkJCQkgKiBzZXJ2aW5nIGNoYW5uZWwgKi8KKwlfX2xlMzIgbnVtX21pc3NlZF9iY29uOwkvKiBudW1iZXIgb2YgbWlzc2VkIGJlYWNvbnMgKi8KKwlfX2xlMzIgYWRjX3J4X3NhdHVyYXRpb25fdGltZTsJLyogY291bnQgaW4gMC44dXMgdW5pdHMgdGhlIHRpbWUgdGhlCisJCQkJCSAqIEFEQyB3YXMgaW4gc2F0dXJhdGlvbiAqLworCV9fbGUzMiBpbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lOwkvKiB0b3RhbCB0aW1lIChpbiAwLjh1cykgc2VhcmNoZWQKKwkJCQkJCSAqIGZvciBJTkEgKi8KKwlfX2xlMzIgYmVhY29uX3NpbGVuY2VfcnNzaV9hOwkvKiBSU1NJIHNpbGVuY2UgYWZ0ZXIgYmVhY29uIGZyYW1lICovCisJX19sZTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYjsJLyogUlNTSSBzaWxlbmNlIGFmdGVyIGJlYWNvbiBmcmFtZSAqLworCV9fbGUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2M7CS8qIFJTU0kgc2lsZW5jZSBhZnRlciBiZWFjb24gZnJhbWUgKi8KKwlfX2xlMzIgaW50ZXJmZXJlbmNlX2RhdGFfZmxhZzsJLyogZmxhZyBmb3IgaW50ZXJmZXJlbmNlIGRhdGEKKwkJCQkJICogYXZhaWxhYmlsaXR5LiAxIHdoZW4gZGF0YSBpcworCQkJCQkgKiBhdmFpbGFibGUuICovCisJX19sZTMyIGNoYW5uZWxfbG9hZDsJLyogY291bnRzIFJYIEVuYWJsZSB0aW1lIGluIHVTZWMgKi8KKwlfX2xlMzIgZHNwX2ZhbHNlX2FsYXJtczsJLyogRFNQIGZhbHNlIGFsYXJtIChib3RoIE9GRE0KKwkJCQkJICogYW5kIENDSykgY291bnRlciAqLworCV9fbGUzMiBiZWFjb25fcnNzaV9hOworCV9fbGUzMiBiZWFjb25fcnNzaV9iOworCV9fbGUzMiBiZWFjb25fcnNzaV9jOworCV9fbGUzMiBiZWFjb25fZW5lcmd5X2E7CisJX19sZTMyIGJlYWNvbl9lbmVyZ3lfYjsKKwlfX2xlMzIgYmVhY29uX2VuZXJneV9jOworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX3J4IHsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5IG9mZG07CisJc3RydWN0IHN0YXRzX3J4X3BoeSBjY2s7CisJc3RydWN0IHN0YXRzX3J4X25vbl9waHkgZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfaHRfcGh5IG9mZG1faHQ7Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBzdGF0c190eF9wb3dlciAtIGN1cnJlbnQgdHggcG93ZXIKKyAqCisgKiBAYW50X2E6IGN1cnJlbnQgdHggcG93ZXIgb24gY2hhaW4gYSBpbiAxLzIgZEIgc3RlcAorICogQGFudF9iOiBjdXJyZW50IHR4IHBvd2VyIG9uIGNoYWluIGIgaW4gMS8yIGRCIHN0ZXAKKyAqIEBhbnRfYzogY3VycmVudCB0eCBwb3dlciBvbiBjaGFpbiBjIGluIDEvMiBkQiBzdGVwCisgKi8KK3N0cnVjdCBzdGF0c190eF9wb3dlciB7CisJdTggYW50X2E7CisJdTggYW50X2I7CisJdTggYW50X2M7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfdHhfbm9uX3BoeV9hZ2cgeworCV9fbGUzMiBiYV90aW1lb3V0OworCV9fbGUzMiBiYV9yZXNjaGVkdWxlX2ZyYW1lczsKKwlfX2xlMzIgc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQ7CisJX19sZTMyIHNjZF9xdWVyeV9ub19hZ2c7CisJX19sZTMyIHNjZF9xdWVyeV9hZ2c7CisJX19sZTMyIHNjZF9xdWVyeV9taXNtYXRjaDsKKwlfX2xlMzIgZnJhbWVfbm90X3JlYWR5OworCV9fbGUzMiB1bmRlcnJ1bjsKKwlfX2xlMzIgYnRfcHJpb19raWxsOworCV9fbGUzMiByeF9iYV9yc3BfY250OworfSBfX3BhY2tlZDsKKworc3RydWN0IHN0YXRzX3R4IHsKKwlfX2xlMzIgcHJlYW1ibGVfY250OworCV9fbGUzMiByeF9kZXRlY3RlZF9jbnQ7CisJX19sZTMyIGJ0X3ByaW9fZGVmZXJfY250OworCV9fbGUzMiBidF9wcmlvX2tpbGxfY250OworCV9fbGUzMiBmZXdfYnl0ZXNfY250OworCV9fbGUzMiBjdHNfdGltZW91dDsKKwlfX2xlMzIgYWNrX3RpbWVvdXQ7CisJX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7CisJX19sZTMyIGFjdHVhbF9hY2tfY250OworCV9fbGUzMiBkdW1wX21zZHVfY250OworCV9fbGUzMiBidXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudDsKKwlfX2xlMzIgYnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudDsKKwlfX2xlMzIgY3RzX3RpbWVvdXRfY29sbGlzaW9uOworCV9fbGUzMiBhY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb247CisJc3RydWN0IHN0YXRzX3R4X25vbl9waHlfYWdnIGFnZzsKKworCV9fbGUzMiByZXNlcnZlZDE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfZGl2IHsKKwlfX2xlMzIgdHhfb25fYTsKKwlfX2xlMzIgdHhfb25fYjsKKwlfX2xlMzIgZXhlY190aW1lOworCV9fbGUzMiBwcm9iZV90aW1lOworCV9fbGUzMiByZXNlcnZlZDE7CisJX19sZTMyIHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzdGF0c19nZW5lcmFsX2NvbW1vbiB7CisJX19sZTMyIHRlbXBlcmF0dXJlOwkvKiByYWRpbyB0ZW1wZXJhdHVyZSAqLworCXN0cnVjdCBzdGF0c19kYmcgZGJnOworCV9fbGUzMiBzbGVlcF90aW1lOworCV9fbGUzMiBzbG90c19vdXQ7CisJX19sZTMyIHNsb3RzX2lkbGU7CisJX19sZTMyIHR0bF90aW1lc3RhbXA7CisJc3RydWN0IHN0YXRzX2RpdiBkaXY7CisJX19sZTMyIHJ4X2VuYWJsZV9jb3VudGVyOworCS8qCisJICogbnVtX29mX3Nvc19zdGF0ZXM6CisJICogIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgd2UgaGF2ZSB0byByZS10dW5lCisJICogIGluIG9yZGVyIHRvIGdldCBvdXQgb2YgYmFkIFBIWSBzdGF0dXMKKwkgKi8KKwlfX2xlMzIgbnVtX29mX3Nvc19zdGF0ZXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbCB7CisJc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uIGNvbW1vbjsKKwlfX2xlMzIgcmVzZXJ2ZWQyOworCV9fbGUzMiByZXNlcnZlZDM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFVDT0RFX1NUQVRTX0NMRUFSX01TSwkJKDB4MSA8PCAwKQorI2RlZmluZSBVQ09ERV9TVEFUU19GUkVRVUVOQ1lfTVNLCQkoMHgxIDw8IDEpCisjZGVmaW5lIFVDT0RFX1NUQVRTX05BUlJPV19CQU5EX01TSwkoMHgxIDw8IDIpCisKKy8qCisgKiBDX1NUQVRTID0gMHg5YywKKyAqIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4KKyAqCisgKiBUaGlzIGNvbW1hbmQgdHJpZ2dlcnMgYW4gaW1tZWRpYXRlIHJlc3BvbnNlIGNvbnRhaW5pbmcgdUNvZGUgc3RhdHMuCisgKiBUaGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIE5fU1RBVFMgMHg5ZCwgYmVsb3cuCisgKgorICogSWYgdGhlIENMRUFSX1NUQVRTIGNvbmZpZ3VyYXRpb24gZmxhZyBpcyBzZXQsIHVDb2RlIHdpbGwgY2xlYXIgaXRzCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBzdGF0cyAoY291bnRlcnMpIGFmdGVyIGlzc3VpbmcgdGhlIHJlc3BvbnNlLgorICogVGhpcyBmbGFnIGRvZXMgbm90IGFmZmVjdCBOX1NUQVRTcyBhZnRlciBiZWFjb25zIChzZWUgYmVsb3cpLgorICoKKyAqIElmIHRoZSBESVNBQkxFX05PVElGIGNvbmZpZ3VyYXRpb24gZmxhZyBpcyBzZXQsIHVDb2RlIHdpbGwgbm90IGlzc3VlCisgKiBOX1NUQVRTcyBhZnRlciByZWNlaXZlZCBiZWFjb25zIChzZWUgYmVsb3cpLiAgVGhpcyBmbGFnCisgKiBkb2VzIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIHRvIHRoZSBDX1NUQVRTIDB4OWMgaXRzZWxmLgorICovCisjZGVmaW5lIElMX1NUQVRTX0NPTkZfQ0xFQVJfU1RBVFMgY3B1X3RvX2xlMzIoMHgxKQkvKiBzZWUgYWJvdmUgKi8KKyNkZWZpbmUgSUxfU1RBVFNfQ09ORl9ESVNBQkxFX05PVElGIGNwdV90b19sZTMyKDB4MikJLyogc2VlIGFib3ZlICovCitzdHJ1Y3QgaWxfc3RhdHNfY21kIHsKKwlfX2xlMzIgY29uZmlndXJhdGlvbl9mbGFnczsJLyogSUxfU1RBVFNfQ09ORl8qICovCit9IF9fcGFja2VkOworCisvKgorICogTl9TVEFUUyA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICoKKyAqIEJ5IGRlZmF1bHQsIHVDb2RlIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBhZnRlciByZWNlaXZpbmcgYSBiZWFjb24KKyAqIHdoaWxlIGFzc29jaWF0ZWQuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHNldCBESVNBQkxFX05PVElGIGZsYWcgaW4gdGhlCisgKiBDX1NUQVRTIDB4OWMsIGFib3ZlLgorICoKKyAqIFN0YXRpc3RpY3MgY291bnRlcnMgY29udGludWUgdG8gaW5jcmVtZW50IGJlYWNvbiBhZnRlciBiZWFjb24sIGJ1dCBhcmUKKyAqIGNsZWFyZWQgd2hlbiBjaGFuZ2luZyBjaGFubmVscyBvciB3aGVuIGRyaXZlciBpc3N1ZXMgQ19TVEFUUworICogMHg5YyB3aXRoIENMRUFSX1NUQVRTIGJpdCBzZXQgKHNlZSBhYm92ZSkuCisgKgorICogdUNvZGUgYWxzbyBpc3N1ZXMgdGhpcyBub3RpZmljYXRpb24gZHVyaW5nIHNjYW5zLiAgdUNvZGUgY2xlYXJzIHN0YXRzCisgKiBhcHByb3ByaWF0ZWx5IHNvIHRoYXQgZWFjaCBub3RpZmljYXRpb24gY29udGFpbnMgc3RhdHMgZm9yIG9ubHkgdGhlCisgKiBvbmUgY2hhbm5lbCB0aGF0IGhhcyBqdXN0IGJlZW4gc2Nhbm5lZC4KKyAqLworI2RlZmluZSBTVEFUU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLICAgICAgICAgY3B1X3RvX2xlMzIoMHgyKQorI2RlZmluZSBTVEFUU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMHg4KQorCitzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzIHsKKwlfX2xlMzIgZmxhZzsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnggcng7CisJc3RydWN0IGl3bDM5X3N0YXRzX3R4IHR4OworCXN0cnVjdCBpd2wzOV9zdGF0c19nZW5lcmFsIGdlbmVyYWw7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgeworCV9fbGUzMiBmbGFnOworCXN0cnVjdCBzdGF0c19yeCByeDsKKwlzdHJ1Y3Qgc3RhdHNfdHggdHg7CisJc3RydWN0IHN0YXRzX2dlbmVyYWwgZ2VuZXJhbDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBOX01JU1NFRF9CRUFDT05TID0gMHhhMiAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKgorICogdUNvZGUgc2VuZCBOX01JU1NFRF9CRUFDT05TIHRvIGRyaXZlciB3aGVuIGRldGVjdCBiZWFjb24gbWlzc2VkCisgKiBpbiByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG1pc3NlZCBiZWFjb25zLCB3aGljaCBtZWFuIHdoZW4gZHJpdmVyIHJlY2VpdmUgdGhlCisgKiBub3RpZmljYXRpb24sIGluc2lkZSB0aGUgY29tbWFuZCwgaXQgY2FuIGZpbmQgYWxsIHRoZSBiZWFjb25zIGluZm9ybWF0aW9uCisgKiB3aGljaCBpbmNsdWRlIG51bWJlciBvZiB0b3RhbCBtaXNzZWQgYmVhY29ucywgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG1pc3NlZAorICogYmVhY29ucywgbnVtYmVyIG9mIGJlYWNvbnMgcmVjZWl2ZWQgYW5kIG51bWJlciBvZiBiZWFjb25zIGV4cGVjdGVkIHRvCisgKiByZWNlaXZlLgorICoKKyAqIElmIHVDb2RlIGRldGVjdGVkIGNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zID4gNSwgaXQgd2lsbCByZXNldCB0aGUgcmFkaW8KKyAqIGluIG9yZGVyIHRvIGJyaW5nIHRoZSByYWRpby9QSFkgYmFjayB0byB3b3JraW5nIHN0YXRlOyB3aGljaCBoYXMgbm8gcmVsYXRpb24KKyAqIHRvIHdoZW4gZHJpdmVyIHdpbGwgcGVyZm9ybSBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbi4KKyAqCisgKiBEcml2ZXIgc2hvdWxkIHNldCBpdCBvd24gbWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgdG8gZGVjaWRlIHdoZW4gdG8gcGVyZm9ybQorICogc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb24gYmFzZWQgb24gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIG1pc3NlZCBiZWFjb25zIGluCisgKiBvcmRlciB0byBpbXByb3ZlIG92ZXJhbGwgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgaW4gbm9pc3kgZW52aXJvbm1lbnQuCisgKgorICovCisKKyNkZWZpbmUgSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUlOCSgxKQorI2RlZmluZSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUYJKDUpCisjZGVmaW5lIElMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01BWAlJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUYKKworc3RydWN0IGlsX21pc3NlZF9iZWFjb25fbm90aWYgeworCV9fbGUzMiBjb25zZWN1dGl2ZV9taXNzZWRfYmVhY29uczsKKwlfX2xlMzIgdG90YWxfbWlzc2VkX2JlY29uczsKKwlfX2xlMzIgbnVtX2V4cGVjdGVkX2JlYWNvbnM7CisJX19sZTMyIG51bV9yZWN2ZF9iZWFjb25zOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDExKQorICogUnggQ2FsaWJyYXRpb24gQ29tbWFuZHM6CisgKgorICogV2l0aCB0aGUgdUNvZGUgdXNlZCBmb3Igb3BlbiBzb3VyY2UgZHJpdmVycywgbW9zdCBUeCBjYWxpYnJhdGlvbiAoZXhjZXB0CisgKiBmb3IgVHggUG93ZXIpIGFuZCBtb3N0IFJ4IGNhbGlicmF0aW9uIGlzIGRvbmUgYnkgdUNvZGUgZHVyaW5nIHRoZQorICogImluaXRpYWxpemUiIHBoYXNlIG9mIHVDb2RlIGJvb3QuICBEcml2ZXIgbXVzdCBjYWxpYnJhdGUgb25seToKKyAqCisgKiAxKSAgVHggcG93ZXIgKGRlcGVuZHMgb24gdGVtcGVyYXR1cmUpLCBkZXNjcmliZWQgZWxzZXdoZXJlCisgKiAyKSAgUmVjZWl2ZXIgZ2FpbiBiYWxhbmNlIChvcHRpbWl6ZSBNSU1PLCBhbmQgZGV0ZWN0IGRpc2Nvbm5lY3RlZCBhbnRlbm5hcykKKyAqIDMpICBSZWNlaXZlciBzZW5zaXRpdml0eSAodG8gb3B0aW1pemUgc2lnbmFsIGRldGVjdGlvbikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQ19TRU5TSVRJVklUWSA9IDB4YTggKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBUaGlzIGNvbW1hbmQgc2V0cyB1cCB0aGUgUnggc2lnbmFsIGRldGVjdG9yIGZvciBhIHNlbnNpdGl2aXR5IGxldmVsIHRoYXQKKyAqIGlzIGhpZ2ggZW5vdWdoIHRvIGxvY2sgb250byBhbGwgc2lnbmFscyB3aXRoaW4gdGhlIGFzc29jaWF0ZWQgbmV0d29yaywKKyAqIGJ1dCBsb3cgZW5vdWdoIHRvIGlnbm9yZSBzaWduYWxzIHRoYXQgYXJlIGJlbG93IGEgY2VydGFpbiB0aHJlc2hvbGQsIHNvIGFzCisgKiBub3QgdG8gaGF2ZSB0b28gbWFueSAiZmFsc2UgYWxhcm1zIi4gIEZhbHNlIGFsYXJtcyBhcmUgc2lnbmFscyB0aGF0IHRoZQorICogUnggRFNQIHRyaWVzIHRvIGxvY2sgb250bywgYnV0IHRoZW4gZGlzY2FyZHMgYWZ0ZXIgZGV0ZXJtaW5pbmcgdGhhdCB0aGV5CisgKiBhcmUgbm9pc2UuCisgKgorICogVGhlIG9wdGltdW0gbnVtYmVyIG9mIGZhbHNlIGFsYXJtcyBpcyBiZXR3ZWVuIDUgYW5kIDUwIHBlciAyMDAgVFVzCisgKiAoMjAwICogMTAyNCB1U2VjcywgaS5lLiAyMDQuOCBtaWxsaXNlY29uZHMpIG9mIGFjdHVhbCBSeCB0aW1lIChpLmUuCisgKiB0aW1lIGxpc3RlbmluZywgbm90IHRyYW5zbWl0dGluZykuICBEcml2ZXIgbXVzdCBhZGp1c3Qgc2Vuc2l0aXZpdHkgc28gdGhhdAorICogdGhlIHJhdGlvIG9mIGFjdHVhbCBmYWxzZSBhbGFybXMgdG8gYWN0dWFsIFJ4IHRpbWUgZmFsbHMgd2l0aGluIHRoaXMgcmFuZ2UuCisgKgorICogV2hpbGUgYXNzb2NpYXRlZCwgdUNvZGUgZGVsaXZlcnMgTl9TVEFUU3MgYWZ0ZXIgZWFjaAorICogcmVjZWl2ZWQgYmVhY29uLiAgVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiB0byB0aGUgZHJpdmVyIHRvIGFuYWx5emUgdGhlCisgKiBzZW5zaXRpdml0eS4gIERvbid0IGFuYWx5emUgc3RhdHMgdGhhdCBjb21lIGluIGZyb20gc2Nhbm5pbmcsIG9yIGFueQorICogb3RoZXIgbm9uLWFzc29jaWF0ZWQtbmV0d29yayBzb3VyY2UuICBQZXJ0aW5lbnQgc3RhdHMgaW5jbHVkZToKKyAqCisgKiBGcm9tICJnZW5lcmFsIiBzdGF0cyAoc3RydWN0IHN0YXRzX3J4X25vbl9waHkpOgorICoKKyAqIChiZWFjb25fZW5lcmd5X1thYmNdICYgMHgwRkYwMCkgPj4gOCAodW5zaWduZWQsIGhpZ2hlciB2YWx1ZSBpcyBsb3dlciBsZXZlbCkKKyAqICAgTWVhc3VyZSBvZiBlbmVyZ3kgb2YgZGVzaXJlZCBzaWduYWwuICBVc2VkIGZvciBlc3RhYmxpc2hpbmcgYSBsZXZlbAorICogICBiZWxvdyB3aGljaCB0aGUgZGV2aWNlIGRvZXMgbm90IGRldGVjdCBzaWduYWxzLgorICoKKyAqIChiZWFjb25fc2lsZW5jZV9yc3NpX1thYmNdICYgMHgwRkYwMCkgPj4gOCAodW5zaWduZWQsIHVuaXRzIGluIGRCKQorICogICBNZWFzdXJlIG9mIGJhY2tncm91bmQgbm9pc2UgaW4gc2lsZW50IHBlcmlvZCBhZnRlciBiZWFjb24uCisgKgorICogY2hhbm5lbF9sb2FkCisgKiAgIHVTZWNzIG9mIGFjdHVhbCBSeCB0aW1lIGR1cmluZyBiZWFjb24gcGVyaW9kICh2YXJpZXMgYWNjb3JkaW5nIHRvCisgKiAgIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IHRyYW5zbWl0dGluZykuCisgKgorICogRnJvbSAiY2NrIiBhbmQgIm9mZG0iIHN0YXRzIChzdHJ1Y3Qgc3RhdHNfcnhfcGh5KSwgc2VwYXJhdGVseToKKyAqCisgKiBmYWxzZV9hbGFybV9jbnQKKyAqICAgU2lnbmFsIGxvY2tzIGFiYW5kb25lZCBlYXJseSAoYmVmb3JlIHBoeS1sZXZlbCBoZWFkZXIpLgorICoKKyAqIHBsY3BfZXJyCisgKiAgIFNpZ25hbCBsb2NrcyBhYmFuZG9uZWQgbGF0ZSAoZHVyaW5nIHBoeS1sZXZlbCBoZWFkZXIpLgorICoKKyAqIE5PVEU6ICBCb3RoIGZhbHNlX2FsYXJtX2NudCBhbmQgcGxjcF9lcnIgaW5jcmVtZW50IG1vbm90b25pY2FsbHkgZnJvbQorICogICAgICAgIGJlYWNvbiB0byBiZWFjb24sIGkuZS4gZWFjaCB2YWx1ZSBpcyBhbiBhY2N1bXVsYXRpb24gb2YgYWxsIGVycm9ycworICogICAgICAgIGJlZm9yZSBhbmQgaW5jbHVkaW5nIHRoZSBsYXRlc3QgYmVhY29uLiAgVmFsdWVzIHdpbGwgd3JhcCBhcm91bmQgdG8gMAorICogICAgICAgIGFmdGVyIGNvdW50aW5nIHVwIHRvIDJeMzIgLSAxLiAgRHJpdmVyIG11c3QgZGlmZmVyZW50aWF0ZSB2cy4KKyAqICAgICAgICBwcmV2aW91cyBiZWFjb24ncyB2YWx1ZXMgdG8gZGV0ZXJtaW5lICMgZmFsc2UgYWxhcm1zIGluIHRoZSBjdXJyZW50CisgKiAgICAgICAgYmVhY29uIHBlcmlvZC4KKyAqCisgKiBUb3RhbCBudW1iZXIgb2YgZmFsc2UgYWxhcm1zID0gZmFsc2VfYWxhcm1zICsgcGxjcF9lcnJzCisgKgorICogRm9yIE9GRE0sIGFkanVzdCB0aGUgZm9sbG93aW5nIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZAorICogKG5vdGljZSB0aGF0IHRoZSBzdGFydCBwb2ludHMgZm9yIE9GRE0gYXJlIGF0IG9yIGNsb3NlIHRvIHNldHRpbmdzIGZvcgorICogbWF4aW11bSBzZW5zaXRpdml0eSk6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVCAgLyAgTUlOICAvICBNQVgKKyAqICAgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JRFggICAgICAgICAgOTAgICAvICAgODUgIC8gIDEyMAorICogICBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFggICAgIDE3MCAgIC8gIDE3MCAgLyAgMjEwCisgKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgMTA1ICAgLyAgMTA1ICAvICAxNDAKKyAqICAgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAyMjAgICAvICAyMjAgIC8gIDI3MAorICoKKyAqICAgSWYgYWN0dWFsIHJhdGUgb2YgT0ZETSBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBoaWdoCisgKiAgIChncmVhdGVyIHRoYW4gNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgcmVkdWNlIHNlbnNpdGl2aXR5CisgKiAgIGJ5ICphZGRpbmcqIDEgdG8gYWxsIDQgb2YgdGhlIHRhYmxlIGVudHJpZXMgYWJvdmUsIHVwIHRvIHRoZSBtYXggZm9yCisgKiAgIGVhY2ggZW50cnkuICBDb252ZXJzZWx5LCBpZiBmYWxzZSBhbGFybSByYXRlIGlzIHRvbyBsb3cgKGxlc3MgdGhhbiA1CisgKiAgIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksICpzdWJ0cmFjdCogMSBmcm9tIGVhY2ggZW50cnkgdG8KKyAqICAgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkuCisgKgorICogRm9yIENDSyBzZW5zaXRpdml0eSwga2VlcCB0cmFjayBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgMSkuICAyMC1iZWFjb24gaGlzdG9yeSBvZiBtYXhpbXVtIGJhY2tncm91bmQgbm9pc2UsIGluZGljYXRlZCBieQorICogICAgICAgIChiZWFjb25fc2lsZW5jZV9yc3NpX1thYmNdICYgMHgwRkYwMCksIHVuaXRzIGluIGRCLCBhY3Jvc3MgdGhlCisgKiAgICAgICAgMyByZWNlaXZlcnMuICBGb3IgYW55IGdpdmVuIGJlYWNvbiwgdGhlICJzaWxlbmNlIHJlZmVyZW5jZSIgaXMKKyAqICAgICAgICB0aGUgbWF4aW11bSBvZiBsYXN0IDYwIHNhbXBsZXMgKDIwIGJlYWNvbnMgKiAzIHJlY2VpdmVycykuCisgKgorICogICAyKS4gIDEwLWJlYWNvbiBoaXN0b3J5IG9mIHN0cm9uZ2VzdCBzaWduYWwgbGV2ZWwsIGFzIGluZGljYXRlZAorICogICAgICAgIGJ5IChiZWFjb25fZW5lcmd5X1thYmNdICYgMHgwRkYwMCkgPj4gOCwgYWNyb3NzIHRoZSAzIHJlY2VpdmVycywKKyAqICAgICAgICBpLmUuIHRoZSBzdHJlbmd0aCBvZiB0aGUgc2lnbmFsIHRocm91Z2ggdGhlIGJlc3QgcmVjZWl2ZXIgYXQgdGhlCisgKiAgICAgICAgbW9tZW50LiAgVGhlc2UgbWVhc3VyZW1lbnRzIGFyZSAidXBzaWRlIGRvd24iLCB3aXRoIGxvd2VyIHZhbHVlcworICogICAgICAgIGZvciBzdHJvbmdlciBzaWduYWxzLCBzbyBtYXggZW5lcmd5IHdpbGwgYmUgKm1pbmltdW0qIHZhbHVlLgorICoKKyAqICAgICAgICBUaGVuIGZvciBhbnkgZ2l2ZW4gYmVhY29uLCB0aGUgZHJpdmVyIG11c3QgZGV0ZXJtaW5lIHRoZSAqd2Vha2VzdCoKKyAqICAgICAgICBvZiB0aGUgc3Ryb25nZXN0IHNpZ25hbHM7IHRoaXMgaXMgdGhlIG1pbmltdW0gbGV2ZWwgdGhhdCBuZWVkcyB0byBiZQorICogICAgICAgIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCwgd2hlbiB1c2luZyB0aGUgYmVzdCByZWNlaXZlciBhdCB0aGUgbW9tZW50LgorICogICAgICAgICJNYXggY2NrIGVuZXJneSIgaXMgdGhlIG1heGltdW0gKGhpZ2hlciB2YWx1ZSBtZWFucyBsb3dlciBlbmVyZ3khKQorICogICAgICAgIG9mIHRoZSBsYXN0IDEwIG1pbmltYS4gIE9uY2UgdGhpcyBpcyBkZXRlcm1pbmVkLCBkcml2ZXIgbXVzdCBhZGQKKyAqICAgICAgICBhIGxpdHRsZSBtYXJnaW4gYnkgYWRkaW5nICI2IiB0byBpdC4KKyAqCisgKiAgIDMpLiAgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbiBwZXJpb2RzIHdpdGggdG9vIGZldyBmYWxzZSBhbGFybXMuCisgKiAgICAgICAgUmVzZXQgdGhpcyB0byAwIGF0IHRoZSBmaXJzdCBiZWFjb24gcGVyaW9kIHRoYXQgZmFsbHMgd2l0aGluIHRoZQorICogICAgICAgICJnb29kIiByYW5nZSAoNSB0byA1MCBmYWxzZSBhbGFybXMgcGVyIDIwNC44IG1pbGxpc2Vjb25kcyByeCkuCisgKgorICogVGhlbiwgYWRqdXN0IHRoZSBmb2xsb3dpbmcgQ0NLIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZAorICogKG5vdGljZSB0aGF0IHRoZSBzdGFydCBwb2ludHMgZm9yIENDSyBhcmUgYXQgbWF4aW11bSBzZW5zaXRpdml0eSk6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVCAgLyAgTUlOICAvICBNQVgKKyAqICAgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFggICAgICAgICAxMjUgICAvICAxMjUgIC8gIDIwMAorICogICBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JRFggICAgIDIwMCAgIC8gIDIwMCAgLyAgNDAwCisgKiAgIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFggICAgICAgICAgICAgICAgMTAwICAgLyAgICAwICAvICAxMDAKKyAqCisgKiAgIElmIGFjdHVhbCByYXRlIG9mIENDSyBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBoaWdoCisgKiAgIChncmVhdGVyIHRoYW4gNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgbWV0aG9kIGZvciByZWR1Y2luZworICogICBzZW5zaXRpdml0eSBpczoKKyAqCisgKiAgIDEpICAqQWRkKiAzIHRvIHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lEWCwKKyAqICAgICAgIHVwIHRvIG1heCA0MDAuCisgKgorICogICAyKSAgSWYgY3VycmVudCB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWCBpcyA8IDE2MCwKKyAqICAgICAgIHNlbnNpdGl2aXR5IGhhcyBiZWVuIHJlZHVjZWQgYSBzaWduaWZpY2FudCBhbW91bnQ7IGJyaW5nIGl0IHVwIHRvCisgKiAgICAgICBhIG1vZGVyYXRlIDE2MS4gIE90aGVyd2lzZSwgKmFkZCogMywgdXAgdG8gbWF4IDIwMC4KKyAqCisgKiAgIDMpICBhKSAgSWYgY3VycmVudCB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWCBpcyA+IDE2MCwKKyAqICAgICAgIHNlbnNpdGl2aXR5IGhhcyBiZWVuIHJlZHVjZWQgb25seSBhIG1vZGVyYXRlIG9yIHNtYWxsIGFtb3VudDsKKyAqICAgICAgICpzdWJ0cmFjdCogMiBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFgsCisgKiAgICAgICBkb3duIHRvIG1pbiAwLiAgT3RoZXJ3aXNlIChpZiBnYWluIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgcmVkdWNlZCksCisgKiAgICAgICBkb24ndCBjaGFuZ2UgdGhlIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFggdmFsdWUuCisgKgorICogICAgICAgYikgIFNhdmUgYSBzbmFwc2hvdCBvZiB0aGUgInNpbGVuY2UgcmVmZXJlbmNlIi4KKyAqCisgKiAgIElmIGFjdHVhbCByYXRlIG9mIENDSyBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBsb3cKKyAqICAgKGxlc3MgdGhhbiA1IGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIG1ldGhvZCBmb3IgaW5jcmVhc2luZworICogICBzZW5zaXRpdml0eSBpcyB1c2VkIG9ubHkgaWY6CisgKgorICogICAxYSkgIFByZXZpb3VzIGJlYWNvbiBkaWQgbm90IGhhdmUgdG9vIG1hbnkgZmFsc2UgYWxhcm1zCisgKiAgIDFiKSAgQU5EIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmV2aW91cyAic2lsZW5jZSByZWZlcmVuY2UiIGFuZCBjdXJyZW50CisgKiAgICAgICAgInNpbGVuY2UgcmVmZXJlbmNlIiAocHJldiAtIGN1cnJlbnQpIGlzIDIgb3IgbW9yZSwKKyAqICAgT1IgMikgIDEwMCBvciBtb3JlIGNvbnNlY3V0aXZlIGJlYWNvbiBwZXJpb2RzIGhhdmUgaGFkIHJhdGUgb2YKKyAqICAgICAgICAgIGxlc3MgdGhhbiA1IGZhbHNlIGFsYXJtcyBwZXIgMjA0LjggbWlsbGlzZWNvbmRzIHJ4IHRpbWUuCisgKgorICogICBNZXRob2QgZm9yIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHk6CisgKgorICogICAxKSAgKlN1YnRyYWN0KiAzIGZyb20gdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFgsCisgKiAgICAgICBkb3duIHRvIG1pbiAxMjUuCisgKgorICogICAyKSAgKlN1YnRyYWN0KiAzIGZyb20gdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYLAorICogICAgICAgZG93biB0byBtaW4gMjAwLgorICoKKyAqICAgMykgICpBZGQqIDIgdG8gdmFsdWUgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWCwgdXAgdG8gbWF4IDEwMC4KKyAqCisgKiAgIElmIGFjdHVhbCByYXRlIG9mIENDSyBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHdpdGhpbiBnb29kIHJhbmdlCisgKiAgIChiZXR3ZWVuIDUgYW5kIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyk6CisgKgorICogICAxKSAgU2F2ZSBhIHNuYXBzaG90IG9mIHRoZSBzaWxlbmNlIHJlZmVyZW5jZS4KKyAqCisgKiAgIDIpICBJZiBwcmV2aW91cyBiZWFjb24gaGFkIHRvbyBtYW55IENDSyBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpLAorICogICAgICAgZ2l2ZSBzb21lIGV4dHJhIG1hcmdpbiB0byBlbmVyZ3kgdGhyZXNob2xkIGJ5ICpzdWJ0cmFjdGluZyogOAorICogICAgICAgZnJvbSB2YWx1ZSBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYLgorICoKKyAqICAgRm9yIGFsbCBjYXNlcyAodG9vIGZldywgdG9vIG1hbnksIGdvb2QgcmFuZ2UpLCBtYWtlIHN1cmUgdGhhdCB0aGUgQ0NLCisgKiAgIGRldGVjdGlvbiB0aHJlc2hvbGQgKGVuZXJneSkgaXMgYmVsb3cgdGhlIGVuZXJneSBsZXZlbCBmb3Igcm9idXN0CisgKiAgIGRldGVjdGlvbiBvdmVyIHRoZSBwYXN0IDEwIGJlYWNvbiBwZXJpb2RzLCB0aGUgIk1heCBjY2sgZW5lcmd5Ii4KKyAqICAgTG93ZXIgdmFsdWVzIG1lYW4gaGlnaGVyIGVuZXJneTsgdGhpcyBtZWFucyBtYWtpbmcgc3VyZSB0aGF0IHRoZSB2YWx1ZQorICogICBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYIGlzIGF0IG9yICphYm92ZSogIk1heCBjY2sgZW5lcmd5Ii4KKyAqCisgKi8KKworLyoKKyAqIFRhYmxlIGVudHJpZXMgaW4gQ19TRU5TSVRJVklUWSAoc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCkKKyAqLworI2RlZmluZSBIRF9UQkxfU0laRSAgKDExKQkvKiBudW1iZXIgb2YgZW50cmllcyAqLworI2RlZmluZSBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYICAgICAgICAgICAgICAgICAoMCkJLyogdGFibGUgaWR4ZXMgKi8KKyNkZWZpbmUgSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JRFggICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSURYICAgICAgICAgICgyKQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFggICAgICAoMykKKyNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAgKDQpCisjZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgICg1KQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JRFggICAgICAoNikKKyNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JRFggICAgICAgICAgICAgKDcpCisjZGVmaW5lIEhEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lEWCAgICAgICAgICg4KQorI2RlZmluZSBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWCAgICAgICAgICAoOSkKKyNkZWZpbmUgSERfT0ZETV9FTkVSR1lfVEhfSU5fSURYICAgICAgICAgICAgICAgICAgKDEwKQorCisvKiBDb250cm9sIGZpZWxkIGluIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQgKi8KKyNkZWZpbmUgQ19TRU5TSVRJVklUWV9DT05UUk9MX0RFRkFVTFRfVEJMCWNwdV90b19sZTE2KDApCisjZGVmaW5lIENfU0VOU0lUSVZJVFlfQ09OVFJPTF9XT1JLX1RCTAljcHVfdG9fbGUxNigxKQorCisvKioKKyAqIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQKKyAqIEBjb250cm9sOiAgKDEpIHVwZGF0ZXMgd29ya2luZyB0YWJsZSwgKDApIHVwZGF0ZXMgZGVmYXVsdCB0YWJsZQorICogQHRhYmxlOiAgZW5lcmd5IHRocmVzaG9sZCB2YWx1ZXMsIHVzZSBIRF8qIGFzIGlkeCBpbnRvIHRhYmxlCisgKgorICogQWx3YXlzIHVzZSAiMSIgaW4gImNvbnRyb2wiIHRvIHVwZGF0ZSB1Q29kZSdzIHdvcmtpbmcgdGFibGUgYW5kIERTUC4KKyAqLworc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCB7CisJX19sZTE2IGNvbnRyb2w7CQkvKiBhbHdheXMgdXNlICIxIiAqLworCV9fbGUxNiB0YWJsZVtIRF9UQkxfU0laRV07CS8qIHVzZSBIRF8qIGFzIGlkeCAqLworfSBfX3BhY2tlZDsKKworLyoqCisgKiBDX1BIWV9DQUxJQlJBVElPTiA9IDB4YjAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqCisgKiBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgcmVsYXRpdmUgZ2FpbnMgb2YgNDk2NSBkZXZpY2UncyAzIHJhZGlvIHJlY2VpdmVyIGNoYWlucy4KKyAqCisgKiBBZnRlciB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIGRyaXZlciBzaG91bGQgYWNjdW11bGF0ZSBzaWduYWwgYW5kIG5vaXNlCisgKiBzdGF0cyBmcm9tIHRoZSBOX1NUQVRTcyB0aGF0IGZvbGxvdyB0aGUgZmlyc3QgMjAKKyAqIGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIChkb24ndCBjb2xsZWN0IHN0YXRzIHRoYXQgY29tZQorICogaW4gZnJvbSBzY2FubmluZywgb3IgYW55IG90aGVyIG5vbi1uZXR3b3JrIHNvdXJjZSkuCisgKgorICogRElTQ09OTkVDVEVEIEFOVEVOTkE6CisgKgorICogRHJpdmVyIHNob3VsZCBkZXRlcm1pbmUgd2hpY2ggYW50ZW5uYXMgYXJlIGFjdHVhbGx5IGNvbm5lY3RlZCwgYnkgY29tcGFyaW5nCisgKiBhdmVyYWdlIGJlYWNvbiBzaWduYWwgbGV2ZWxzIGZvciB0aGUgMyBSeCBjaGFpbnMuICBBY2N1bXVsYXRlIChhZGQpIHRoZQorICogZm9sbG93aW5nIHZhbHVlcyBvdmVyIDIwIGJlYWNvbnMsIG9uZSBhY2N1bXVsYXRvciBmb3IgZWFjaCBvZiB0aGUgY2hhaW5zCisgKiBhL2IvYywgZnJvbSBzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeToKKyAqCisgKiBiZWFjb25fcnNzaV9bYWJjXSAmIDB4MEZGICh1bnNpZ25lZCwgdW5pdHMgaW4gZEIpCisgKgorICogRmluZCB0aGUgc3Ryb25nZXN0IHNpZ25hbCBmcm9tIGFtb25nIGEvYi9jLiAgQ29tcGFyZSB0aGUgb3RoZXIgdHdvIHRvIHRoZQorICogc3Ryb25nZXN0LiAgSWYgYW55IHNpZ25hbCBpcyBtb3JlIHRoYW4gMTUgZEIgKHRpbWVzIDIwLCB1bmxlc3MgeW91CisgKiBkaXZpZGUgdGhlIGFjY3VtdWxhdGVkIHZhbHVlcyBieSAyMCkgYmVsb3cgdGhlIHN0cm9uZ2VzdCwgdGhlIGRyaXZlcgorICogY29uc2lkZXJzIHRoYXQgYW50ZW5uYSB0byBiZSBkaXNjb25uZWN0ZWQsIGFuZCBzaG91bGQgbm90IHRyeSB0byB1c2UgdGhhdAorICogYW50ZW5uYS9jaGFpbiBmb3IgUnggb3IgVHguICBJZiBib3RoIEEgYW5kIEIgc2VlbSB0byBiZSBkaXNjb25uZWN0ZWQsCisgKiBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgdGhlIHN0cm9uZ2VyIG9uZSBhcyBjb25uZWN0ZWQsIGFuZCBhdHRlbXB0IHRvIHVzZSBpdAorICogKEEgYW5kIEIgYXJlIHRoZSBvbmx5IDIgVHggY2hhaW5zISkuCisgKgorICoKKyAqIFJYIEJBTEFOQ0U6CisgKgorICogRHJpdmVyIHNob3VsZCBiYWxhbmNlIHRoZSAzIHJlY2VpdmVycyAoYnV0IGp1c3QgdGhlIG9uZXMgdGhhdCBhcmUgY29ubmVjdGVkCisgKiB0byBhbnRlbm5hcywgc2VlIGFib3ZlKSBmb3IgZ2FpbiwgYnkgY29tcGFyaW5nIHRoZSBhdmVyYWdlIHNpZ25hbCBsZXZlbHMKKyAqIGRldGVjdGVkIGR1cmluZyB0aGUgc2lsZW5jZSBhZnRlciBlYWNoIGJlYWNvbiAoYmFja2dyb3VuZCBub2lzZSkuCisgKiBBY2N1bXVsYXRlIChhZGQpIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG92ZXIgMjAgYmVhY29ucywgb25lIGFjY3VtdWxhdG9yIGZvcgorICogZWFjaCBvZiB0aGUgY2hhaW5zIGEvYi9jLCBmcm9tIHN0cnVjdCBzdGF0c19yeF9ub25fcGh5OgorICoKKyAqIGJlYWNvbl9zaWxlbmNlX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQorICoKKyAqIEZpbmQgdGhlIHdlYWtlc3QgYmFja2dyb3VuZCBub2lzZSBsZXZlbCBmcm9tIGFtb25nIGEvYi9jLiAgVGhpcyBSeCBjaGFpbgorICogd2lsbCBiZSB0aGUgcmVmZXJlbmNlLCB3aXRoIDAgZ2FpbiBhZGp1c3RtZW50LiAgQXR0ZW51YXRlIG90aGVyIGNoYW5uZWxzIGJ5CisgKiBmaW5kaW5nIG5vaXNlIGRpZmZlcmVuY2U6CisgKgorICogKGFjY3VtX25vaXNlW2ldIC0gYWNjdW1fbm9pc2VbcmVmZXJlbmNlXSkgLyAzMAorICoKKyAqIFRoZSAiMzAiIGFkanVzdHMgdGhlIGRCIGluIHRoZSAyMCBhY2N1bXVsYXRlZCBzYW1wbGVzIHRvIHVuaXRzIG9mIDEuNSBkQi4KKyAqIEZvciB1c2UgaW4gZGlmZl9nYWluX1thYmNdIGZpZWxkcyBvZiBzdHJ1Y3QgaWxfY2FsaWJyYXRpb25fY21kLCB0aGUKKyAqIGRyaXZlciBzaG91bGQgbGltaXQgdGhlIGRpZmZlcmVuY2UgcmVzdWx0cyB0byBhIHJhbmdlIG9mIDAtMyAoMC00LjUgZEIpLAorICogYW5kIHNldCBiaXQgMiB0byBpbmRpY2F0ZSAicmVkdWNlIGdhaW4iLiAgVGhlIHZhbHVlIGZvciB0aGUgcmVmZXJlbmNlCisgKiAod2Vha2VzdCkgY2hhaW4gc2hvdWxkIGJlICIwIi4KKyAqCisgKiBkaWZmX2dhaW5fW2FiY10gYml0IGZpZWxkczoKKyAqICAgMjogKDEpIHJlZHVjZSBnYWluLCAoMCkgaW5jcmVhc2UgZ2FpbgorICogMS0wOiBhbW91bnQgb2YgZ2FpbiwgdW5pdHMgb2YgMS41IGRCCisgKi8KKworLyogUGh5IGNhbGlicmF0aW9uIGNvbW1hbmQgZm9yIHNlcmllcyAqLworLyogVGhlIGRlZmF1bHQgY2FsaWJyYXRlIHRhYmxlIHNpemUgaWYgbm90IHNwZWNpZmllZCBieSBmaXJtd2FyZSAqLworI2RlZmluZSBJTF9ERUZBVUxUX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJMTgKK2VudW0geworCUlMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRCA9IDcsCisJSUxfTUFYX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUgPSAxOSwKK307CisKKyNkZWZpbmUgSUxfTUFYX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJCSgyNTMpCisKK3N0cnVjdCBpbF9jYWxpYl9oZHIgeworCXU4IG9wX2NvZGU7CisJdTggZmlyc3RfZ3JvdXA7CisJdTggZ3JvdXBzX251bTsKKwl1OCBkYXRhX3ZhbGlkOworfSBfX3BhY2tlZDsKKworLyogSUxfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EICg3KSAqLworc3RydWN0IGlsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgeworCXN0cnVjdCBpbF9jYWxpYl9oZHIgaGRyOworCXM4IGRpZmZfZ2Fpbl9hOwkJLyogc2VlIGFib3ZlICovCisJczggZGlmZl9nYWluX2I7CisJczggZGlmZl9nYWluX2M7CisJdTggcmVzZXJ2ZWQxOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKDEyKQorICogTWlzY2VsbGFuZW91cyBDb21tYW5kczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBMRURzIENvbW1hbmQgJiBSZXNwb25zZQorICogQ19MRURTID0gMHg0OCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICoKKyAqIEZvciBlYWNoIG9mIDMgcG9zc2libGUgTEVEcyAoQWN0aXZpdHkvTGluay9UZWNoLCBzZWxlY3RlZCBieSAiaWQiIGZpZWxkKSwKKyAqIHRoaXMgY29tbWFuZCB0dXJucyBpdCBvbiBvciBvZmYsIG9yIHNldHMgdXAgYSBwZXJpb2RpYyBibGlua2luZyBjeWNsZS4KKyAqLworc3RydWN0IGlsX2xlZF9jbWQgeworCV9fbGUzMiBpbnRlcnZhbDsJLyogImludGVydmFsIiBpbiB1U2VjICovCisJdTggaWQ7CQkJLyogMTogQWN0aXZpdHksIDI6IExpbmssIDM6IFRlY2ggKi8KKwl1OCBvZmY7CQkJLyogIyBpbnRlcnZhbHMgb2ZmIHdoaWxlIGJsaW5raW5nOworCQkJCSAqICIwIiwgd2l0aCA+MCAib24iIHZhbHVlLCB0dXJucyBMRUQgb24gKi8KKwl1OCBvbjsJCQkvKiAjIGludGVydmFscyBvbiB3aGlsZSBibGlua2luZzsKKwkJCQkgKiAiMCIsIHJlZ2FyZGxlc3Mgb2YgIm9mZiIsIHR1cm5zIExFRCBvZmYgKi8KKwl1OCByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICgxMykKKyAqIFVuaW9uIG9mIGFsbCBleHBlY3RlZCBub3RpZmljYXRpb25zL3Jlc3BvbnNlczoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUxfUlhfRlJBTUVfU0laRV9NU0sJMHgwMDAwM2ZmZgorCitzdHJ1Y3QgaWxfcnhfcGt0IHsKKwkvKgorCSAqIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBSWCBmcmFtZSBoZWFkZXIgY29udGFpbiBib3RoIHRoZSBSWCBmcmFtZQorCSAqIHNpemUgYW5kIHNvbWUgZmxhZ3MuCisJICogQml0IGZpZWxkczoKKwkgKiAzMTogICAgZmxhZyBmbHVzaCBSQiByZXF1ZXN0CisJICogMzA6ICAgIGZsYWcgaWdub3JlIFRDICh0ZXJtaW5hbCBjb3VudGVyKSByZXF1ZXN0CisJICogMjk6ICAgIGZsYWcgZmFzdCBJUlEgcmVxdWVzdAorCSAqIDI4LTE0OiBSZXNlcnZlZAorCSAqIDEzLTAwOiBSWCBmcmFtZSBzaXplCisJICovCisJX19sZTMyIGxlbl9uX2ZsYWdzOworCXN0cnVjdCBpbF9jbWRfaGVhZGVyIGhkcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWUgcnhfZnJhbWU7CisJCXN0cnVjdCBpbDM5NDVfdHhfcmVzcCB0eF9yZXNwOworCQlzdHJ1Y3QgaWwzOTQ1X2JlYWNvbl9ub3RpZiBiZWFjb25fc3RhdHVzOworCisJCXN0cnVjdCBpbF9hbGl2ZV9yZXNwIGFsaXZlX2ZyYW1lOworCQlzdHJ1Y3QgaWxfc3BlY3RydW1fbm90aWZpY2F0aW9uIHNwZWN0cnVtX25vdGlmOworCQlzdHJ1Y3QgaWxfY3NhX25vdGlmaWNhdGlvbiBjc2Ffbm90aWY7CisJCXN0cnVjdCBpbF9lcnJvcl9yZXNwIGVycl9yZXNwOworCQlzdHJ1Y3QgaWxfY2FyZF9zdGF0ZV9ub3RpZiBjYXJkX3N0YXRlX25vdGlmOworCQlzdHJ1Y3QgaWxfYWRkX3N0YV9yZXNwIGFkZF9zdGE7CisJCXN0cnVjdCBpbF9yZW1fc3RhX3Jlc3AgcmVtX3N0YTsKKwkJc3RydWN0IGlsX3NsZWVwX25vdGlmaWNhdGlvbiBzbGVlcF9ub3RpZjsKKwkJc3RydWN0IGlsX3NwZWN0cnVtX3Jlc3Agc3BlY3RydW07CisJCXN0cnVjdCBpbF9ub3RpZl9zdGF0cyBzdGF0czsKKwkJc3RydWN0IGlsX2NvbXByZXNzZWRfYmFfcmVzcCBjb21wcmVzc2VkX2JhOworCQlzdHJ1Y3QgaWxfbWlzc2VkX2JlYWNvbl9ub3RpZiBtaXNzZWRfYmVhY29uOworCQlfX2xlMzIgc3RhdHVzOworCQl1OCByYXdbMF07CisJfSB1OworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9faWxfY29tbWFuZHNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWJhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYwpAQCAtMCwwICsxLDU3MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworY29uc3QgY2hhciAqCitpbF9nZXRfY21kX3N0cmluZyh1OCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKE5fQUxJVkUpOworCQlJTF9DTUQoTl9FUlJPUik7CisJCUlMX0NNRChDX1JYT04pOworCQlJTF9DTUQoQ19SWE9OX0FTU09DKTsKKwkJSUxfQ01EKENfUU9TX1BBUkFNKTsKKwkJSUxfQ01EKENfUlhPTl9USU1JTkcpOworCQlJTF9DTUQoQ19BRERfU1RBKTsKKwkJSUxfQ01EKENfUkVNX1NUQSk7CisJCUlMX0NNRChDX1dFUEtFWSk7CisJCUlMX0NNRChOXzM5NDVfUlgpOworCQlJTF9DTUQoQ19UWCk7CisJCUlMX0NNRChDX1JBVEVfU0NBTEUpOworCQlJTF9DTUQoQ19MRURTKTsKKwkJSUxfQ01EKENfVFhfTElOS19RVUFMSVRZX0NNRCk7CisJCUlMX0NNRChDX0NIQU5ORUxfU1dJVENIKTsKKwkJSUxfQ01EKE5fQ0hBTk5FTF9TV0lUQ0gpOworCQlJTF9DTUQoQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCk7CisJCUlMX0NNRChOX1NQRUNUUlVNX01FQVNVUkVNRU5UKTsKKwkJSUxfQ01EKENfUE9XRVJfVEJMKTsKKwkJSUxfQ01EKE5fUE1fU0xFRVApOworCQlJTF9DTUQoTl9QTV9ERUJVR19TVEFUUyk7CisJCUlMX0NNRChDX1NDQU4pOworCQlJTF9DTUQoQ19TQ0FOX0FCT1JUKTsKKwkJSUxfQ01EKE5fU0NBTl9TVEFSVCk7CisJCUlMX0NNRChOX1NDQU5fUkVTVUxUUyk7CisJCUlMX0NNRChOX1NDQU5fQ09NUExFVEUpOworCQlJTF9DTUQoTl9CRUFDT04pOworCQlJTF9DTUQoQ19UWF9CRUFDT04pOworCQlJTF9DTUQoQ19UWF9QV1JfVEJMKTsKKwkJSUxfQ01EKENfQlRfQ09ORklHKTsKKwkJSUxfQ01EKENfU1RBVFMpOworCQlJTF9DTUQoTl9TVEFUUyk7CisJCUlMX0NNRChOX0NBUkRfU1RBVEUpOworCQlJTF9DTUQoTl9NSVNTRURfQkVBQ09OUyk7CisJCUlMX0NNRChDX0NUX0tJTExfQ09ORklHKTsKKwkJSUxfQ01EKENfU0VOU0lUSVZJVFkpOworCQlJTF9DTUQoQ19QSFlfQ0FMSUJSQVRJT04pOworCQlJTF9DTUQoTl9SWF9QSFkpOworCQlJTF9DTUQoTl9SWF9NUERVKTsKKwkJSUxfQ01EKE5fUlgpOworCQlJTF9DTUQoTl9DT01QUkVTU0VEX0JBKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCisJfQorfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfY21kX3N0cmluZyk7CisKKyNkZWZpbmUgSE9TVF9DT01QTEVURV9USU1FT1VUIChIWiAvIDIpCisKK3N0YXRpYyB2b2lkCitpbF9nZW5lcmljX2NtZF9jYWxsYmFjayhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCQlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpCit7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSUxfQ01EX0ZBSUxFRF9NU0spIHsKKwkJSUxfRVJSKCJCYWQgcmV0dXJuIGZyb20gJXMgKDB4JTA4WClcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3dpdGNoIChjbWQtPmhkci5jbWQpIHsKKwljYXNlIENfVFhfTElOS19RVUFMSVRZX0NNRDoKKwljYXNlIENfU0VOU0lUSVZJVFk6CisJCURfSENfRFVNUCgiYmFjayBmcm9tICVzICgweCUwOFgpXG4iLAorCQkJICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURfSEMoImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwKKwkJICAgICBwa3QtPmhkci5mbGFncyk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2lsX3NlbmRfY21kX2FzeW5jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpCit7CisJaW50IHJldDsKKworCUJVR19PTighKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpKTsKKworCS8qIEFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgZXhwZWN0IGFuIFNLQiB0byBiZSBzZXQuICovCisJQlVHX09OKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpOworCisJLyogQXNzaWduIGEgZ2VuZXJpYyBjYWxsYmFjayBpZiBvbmUgaXMgbm90IHByb3ZpZGVkICovCisJaWYgKCFjbWQtPmNhbGxiYWNrKQorCQljbWQtPmNhbGxiYWNrID0gaWxfZ2VuZXJpY19jbWRfY2FsbGJhY2s7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldCA9IGlsX2VucXVldWVfaGNtZChpbCwgY21kKTsKKwlpZiAocmV0IDwgMCkgeworCQlJTF9FUlIoIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2lsX3NlbmRfY21kX3N5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCkKK3sKKwlpbnQgY21kX2lkeDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCUJVR19PTihjbWQtPmZsYWdzICYgQ01EX0FTWU5DKTsKKworCS8qIEEgc3luY2hyb25vdXMgY29tbWFuZCBjYW4gbm90IGhhdmUgYSBjYWxsYmFjayBzZXQuICovCisJQlVHX09OKGNtZC0+Y2FsbGJhY2spOworCisJRF9JTkZPKCJBdHRlbXB0aW5nIHRvIHNlbmQgc3luYyBjb21tYW5kICVzXG4iLAorCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisKKwlzZXRfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKwlEX0lORk8oIlNldHRpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCisJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKKworCWNtZF9pZHggPSBpbF9lbnF1ZXVlX2hjbWQoaWwsIGNtZCk7CisJaWYgKGNtZF9pZHggPCAwKSB7CisJCXJldCA9IGNtZF9pZHg7CisJCUlMX0VSUigiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGlsLT53YWl0X2NvbW1hbmRfcXVldWUsCisJCQkJICF0ZXN0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cyksCisJCQkJIEhPU1RfQ09NUExFVEVfVElNRU9VVCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHRlc3RfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKSkgeworCQkJSUxfRVJSKCJFcnJvciBzZW5kaW5nICVzOiB0aW1lIG91dCBhZnRlciAlZG1zLlxuIiwKKwkJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwKKwkJCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOworCisJCQljbGVhcl9iaXQoU19IQ01EX0FDVElWRSwgJmlsLT5zdGF0dXMpOworCQkJRF9JTkZPKCJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKKwkJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJZ290byBjYW5jZWw7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cykpIHsKKwkJSUxfRVJSKCJDb21tYW5kICVzIGFib3J0ZWQ6IFJGIEtJTEwgU3dpdGNoXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXQgPSAtRUNBTkNFTEVEOworCQlnb3RvIGZhaWw7CisJfQorCWlmICh0ZXN0X2JpdChTX0ZXX0VSUk9SLCAmaWwtPnN0YXR1cykpIHsKKwkJSUxfRVJSKCJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSAmJiAhY21kLT5yZXBseV9wYWdlKSB7CisJCUlMX0VSUigiRXJyb3I6IFJlc3BvbnNlIE5VTEwgaW4gJyVzJ1xuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBjYW5jZWw7CisJfQorCisJcmV0ID0gMDsKKwlnb3RvIG91dDsKKworY2FuY2VsOgorCWlmIChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7CisJCS8qCisJCSAqIENhbmNlbCB0aGUgQ01EX1dBTlRfU0tCIGZsYWcgZm9yIHRoZSBjbWQgaW4gdGhlCisJCSAqIFRYIGNtZCBxdWV1ZS4gT3RoZXJ3aXNlIGluIGNhc2UgdGhlIGNtZCBjb21lcworCQkgKiBpbiBsYXRlciwgaXQgd2lsbCBwb3NzaWJseSBzZXQgYW4gaW52YWxpZAorCQkgKiBhZGRyZXNzIChjbWQtPm1ldGEuc291cmNlKS4KKwkJICovCisJCWlsLT50eHFbaWwtPmNtZF9xdWV1ZV0ubWV0YVtjbWRfaWR4XS5mbGFncyAmPSB+Q01EX1dBTlRfU0tCOworCX0KK2ZhaWw6CisJaWYgKGNtZC0+cmVwbHlfcGFnZSkgeworCQlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQtPnJlcGx5X3BhZ2UpOworCQljbWQtPnJlcGx5X3BhZ2UgPSAwOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2NtZF9zeW5jKTsKKworaW50CitpbF9zZW5kX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9ob3N0X2NtZCAqY21kKQoreworCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQorCQlyZXR1cm4gaWxfc2VuZF9jbWRfYXN5bmMoaWwsIGNtZCk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfc3luYyhpbCwgY21kKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWQpOworCitpbnQKK2lsX3NlbmRfY21kX3BkdShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkLCB1MTYgbGVuLCBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IGlkLAorCQkubGVuID0gbGVuLAorCQkuZGF0YSA9IGRhdGEsCisJfTsKKworCXJldHVybiBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWRfcGR1KTsKKworaW50CitpbF9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICAgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCQlzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJCQlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IGlkLAorCQkubGVuID0gbGVuLAorCQkuZGF0YSA9IGRhdGEsCisJfTsKKworCWNtZC5mbGFncyB8PSBDTURfQVNZTkM7CisJY21kLmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfYXN5bmMoaWwsICZjbWQpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2NtZF9wZHVfYXN5bmMpOworCisvKiBkZWZhdWx0OiBJTF9MRURfQkxJTksoMCkgdXNpbmcgYmxpbmtpbmcgaWR4IHRhYmxlICovCitzdGF0aWMgaW50IGxlZF9tb2RlOworbW9kdWxlX3BhcmFtKGxlZF9tb2RlLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhsZWRfbW9kZSwKKwkJICIwPXN5c3RlbSBkZWZhdWx0LCAiICIxPU9uKFJGIE9uKS9PZmYoUkYgT2ZmKSwgMj1ibGlua2luZyIpOworCisvKiBUaHJvdWdocHV0CQlPRkYgdGltZShtcykJT04gdGltZSAobXMpCisgKgk+MzAwCQkJMjUJCTI1CisgKgk+MjAwIHRvIDMwMAkJNDAJCTQwCisgKgk+MTAwIHRvIDIwMAkJNTUJCTU1CisgKgk+NzAgdG8gMTAwCQk2NQkJNjUKKyAqCT41MCB0byA3MAkJNzUJCTc1CisgKgk+MjAgdG8gNTAJCTg1CQk4NQorICoJPjEwIHRvIDIwCQk5NQkJOTUKKyAqCT41IHRvIDEwCQkxMTAJCTExMAorICoJPjEgdG8gNQkJCTEzMAkJMTMwCisgKgk+MCB0byAxCQkJMTY3CQkxNjcKKyAqCTw9MAkJCQkJU09MSUQgT04KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHB0X2JsaW5rIGlsX2JsaW5rW10gPSB7CisJey50aHJvdWdocHV0ID0gMCwJCS5ibGlua190aW1lID0gMzM0fSwKKwl7LnRocm91Z2hwdXQgPSAxICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMjYwfSwKKwl7LnRocm91Z2hwdXQgPSA1ICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMjIwfSwKKwl7LnRocm91Z2hwdXQgPSAxMCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDE5MH0sCisJey50aHJvdWdocHV0ID0gMjAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSAxNzB9LAorCXsudGhyb3VnaHB1dCA9IDUwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMTUwfSwKKwl7LnRocm91Z2hwdXQgPSA3MCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDEzMH0sCisJey50aHJvdWdocHV0ID0gMTAwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMTEwfSwKKwl7LnRocm91Z2hwdXQgPSAyMDAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSA4MH0sCisJey50aHJvdWdocHV0ID0gMzAwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gNTB9LAorfTsKKworLyoKKyAqIEFkanVzdCBsZWQgYmxpbmsgcmF0ZSB0byBjb21wZW5zYXRlIG9uIGEgTUFDIENsb2NrIGRpZmZlcmVuY2Ugb24gZXZlcnkgSFcKKyAqIExlZCBibGluayByYXRlIGFuYWx5c2lzIHNob3dlZCBhbiBhdmVyYWdlIGRldmlhdGlvbiBvZiAwJSBvbiAzOTQ1LAorICogNSUgb24gNDk2NSBIVy4KKyAqIE5lZWQgdG8gY29tcGVuc2F0ZSBvbiB0aGUgbGVkIG9uL29mZiB0aW1lIHBlciBIVyBhY2NvcmRpbmcgdG8gdGhlIGRldmlhdGlvbgorICogdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBsZWQgZnJlcXVlbmN5CisgKiBUaGUgY2FsY3VsYXRpb24gaXM6ICgxMDAtYXZlcmFnZURldmlhdGlvbikvMTAwICogYmxpbmtUaW1lCisgKiBGb3IgY29kZSBlZmZpY2llbmN5IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGJlOgorICogICAgIGNvbXBlbnNhdGlvbiA9ICgxMDAgLSBhdmVyYWdlRGV2aWF0aW9uKSAqIDY0IC8gMTAwCisgKiAgICAgTmV3QmxpbmtUaW1lID0gKGNvbXBlbnNhdGlvbiAqIEJsaW5rVGltZSkgLyA2NAorICovCitzdGF0aWMgaW5saW5lIHU4CitpbF9ibGlua19jb21wZW5zYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB1OCB0aW1lLCB1MTYgY29tcGVuc2F0aW9uKQoreworCWlmICghY29tcGVuc2F0aW9uKSB7CisJCUlMX0VSUigidW5kZWZpbmVkIGJsaW5rIGNvbXBlbnNhdGlvbjogIgorCQkgICAgICAgInVzZSBwcmUtZGVmaW5lZCBibGlua2luZyB0aW1lXG4iKTsKKwkJcmV0dXJuIHRpbWU7CisJfQorCisJcmV0dXJuICh1OCkgKCh0aW1lICogY29tcGVuc2F0aW9uKSA+PiA2KTsKK30KKworLyogU2V0IGxlZCBwYXR0ZXJuIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQKK2lsX2xlZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCB1bnNpZ25lZCBsb25nIG9uLCB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlzdHJ1Y3QgaWxfbGVkX2NtZCBsZWRfY21kID0geworCQkuaWQgPSBJTF9MRURfTElOSywKKwkJLmludGVydmFsID0gSUxfREVGX0xFRF9JTlRSVkwKKwl9OworCWludCByZXQ7CisKKwlpZiAoIXRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpbC0+Ymxpbmtfb24gPT0gb24gJiYgaWwtPmJsaW5rX29mZiA9PSBvZmYpCisJCXJldHVybiAwOworCisJaWYgKG9mZiA9PSAwKSB7CisJCS8qIGxlZCBpcyBTT0xJRF9PTiAqLworCQlvbiA9IElMX0xFRF9TT0xJRDsKKwl9CisKKwlEX0xFRCgiTGVkIGJsaW5rIHRpbWUgY29tcGVuc2F0aW9uPSV1XG4iLAorCSAgICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKwlsZWRfY21kLm9uID0KKwkgICAgaWxfYmxpbmtfY29tcGVuc2F0aW9uKGlsLCBvbiwKKwkJCQkgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKwlsZWRfY21kLm9mZiA9CisJICAgIGlsX2JsaW5rX2NvbXBlbnNhdGlvbihpbCwgb2ZmLAorCQkJCSAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOworCisJcmV0ID0gaWwtPmNmZy0+b3BzLT5sZWQtPmNtZChpbCwgJmxlZF9jbWQpOworCWlmICghcmV0KSB7CisJCWlsLT5ibGlua19vbiA9IG9uOworCQlpbC0+Ymxpbmtfb2ZmID0gb2ZmOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWxfbGVkX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgaWxfcHJpdiwgbGVkKTsKKwl1bnNpZ25lZCBsb25nIG9uID0gMDsKKworCWlmIChicmlnaHRuZXNzID4gMCkKKwkJb24gPSBJTF9MRURfU09MSUQ7CisKKwlpbF9sZWRfY21kKGlsLCBvbiwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsX2xlZF9ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAorCQkgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGlsX3ByaXYsIGxlZCk7CisKKwlyZXR1cm4gaWxfbGVkX2NtZChpbCwgKmRlbGF5X29uLCAqZGVsYXlfb2ZmKTsKK30KKwordm9pZAoraWxfbGVkc19pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgbW9kZSA9IGxlZF9tb2RlOworCWludCByZXQ7CisKKwlpZiAobW9kZSA9PSBJTF9MRURfREVGQVVMVCkKKwkJbW9kZSA9IGlsLT5jZmctPmxlZF9tb2RlOworCisJaWwtPmxlZC5uYW1lID0KKwkgICAga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy1sZWQiLCB3aXBoeV9uYW1lKGlsLT5ody0+d2lwaHkpKTsKKwlpbC0+bGVkLmJyaWdodG5lc3Nfc2V0ID0gaWxfbGVkX2JyaWdodG5lc3Nfc2V0OworCWlsLT5sZWQuYmxpbmtfc2V0ID0gaWxfbGVkX2JsaW5rX3NldDsKKwlpbC0+bGVkLm1heF9icmlnaHRuZXNzID0gMTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSUxfTEVEX0RFRkFVTFQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCWNhc2UgSUxfTEVEX0JMSU5LOgorCQlpbC0+bGVkLmRlZmF1bHRfdHJpZ2dlciA9CisJCSAgICBpZWVlODAyMTFfY3JlYXRlX3RwdF9sZWRfdHJpZ2dlcihpbC0+aHcsCisJCQkJCQkgICAgIElFRUU4MDIxMV9UUFRfTEVEVFJJR19GTF9DT05ORUNURUQsCisJCQkJCQkgICAgIGlsX2JsaW5rLAorCQkJCQkJICAgICBBUlJBWV9TSVpFKGlsX2JsaW5rKSk7CisJCWJyZWFrOworCWNhc2UgSUxfTEVEX1JGX1NUQVRFOgorCQlpbC0+bGVkLmRlZmF1bHRfdHJpZ2dlciA9IGllZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUoaWwtPmh3KTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZpbC0+cGNpX2Rldi0+ZGV2LCAmaWwtPmxlZCk7CisJaWYgKHJldCkgeworCQlrZnJlZShpbC0+bGVkLm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWwtPmxlZF9yZWdpc3RlcmVkID0gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woaWxfbGVkc19pbml0KTsKKwordm9pZAoraWxfbGVkc19leGl0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoIWlsLT5sZWRfcmVnaXN0ZXJlZCkKKwkJcmV0dXJuOworCisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmlsLT5sZWQpOworCWtmcmVlKGlsLT5sZWQubmFtZSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2xlZHNfZXhpdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFRVBST00gQkFORFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBpbF9lZXByb21fYmFuZCBkZWZpbml0aW9ucyBiZWxvdyBwcm92aWRlIHRoZSBtYXBwaW5nIGZyb20gdGhlCisgKiBFRVBST00gY29udGVudHMgdG8gdGhlIHNwZWNpZmljIGNoYW5uZWwgbnVtYmVyIHN1cHBvcnRlZCBmb3IgZWFjaAorICogYmFuZC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWxfcHJpdi0+ZWVwcm9tLmJhbmRfM19jaGFubmVsc1s0XSBmcm9tIHRoZSBiYW5kXzMKKyAqIGRlZmluaXRpb24gYmVsb3cgbWFwcyB0byBwaHlzaWNhbCBjaGFubmVsIDQyIGluIHRoZSA1LjJHSHogc3BlY3RydW0uCisgKiBUaGUgc3BlY2lmaWMgZ2VvZ3JhcGh5IGFuZCBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhhdCBjaGFubmVsCisgKiBpcyBjb250YWluZWQgaW4gdGhlIGVlcHJvbSBtYXAgaXRzZWxmLgorICoKKyAqIER1cmluZyBpbml0LCB3ZSBjb3B5IHRoZSBlZXByb20gaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgbWFwCisgKiBpbmZvcm1hdGlvbiBpbnRvIGlsLT5jaGFubmVsX2luZm9fMjQvNTIgYW5kIGlsLT5jaGFubmVsX21hcF8yNC81MgorICoKKyAqIGNoYW5uZWxfbWFwXzI0LzUyIHByb3ZpZGVzIHRoZSBpZHggaW4gdGhlIGNoYW5uZWxfaW5mbyBhcnJheSBmb3IgYQorICogZ2l2ZW4gY2hhbm5lbC4gIFdlIGhhdmUgdG8gaGF2ZSB0d28gc2VwYXJhdGUgbWFwcyBhcyB0aGVyZSBpcyBjaGFubmVsCisgKiBvdmVybGFwIHdpdGggdGhlIDIuNEdIeiBhbmQgNS4yR0h6IHNwZWN0cnVtIGFzIHNlZW4gaW4gYmFuZF8xIGFuZAorICogYmFuZF8yCisgKgorICogQSB2YWx1ZSBvZiAweGZmIHN0b3JlZCBpbiB0aGUgY2hhbm5lbF9tYXAgaW5kaWNhdGVzIHRoYXQgdGhlIGNoYW5uZWwKKyAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIGF0IGFsbC4KKyAqCisgKiBBIHZhbHVlIG9mIDB4ZmUgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsIGlzIG5vdAorICogdmFsaWQgZm9yIFR4IHdpdGggdGhlIGN1cnJlbnQgaGFyZHdhcmUuICBUaGlzIG1lYW5zIHRoYXQKKyAqIHdoaWxlIHRoZSBzeXN0ZW0gY2FuIHR1bmUgYW5kIHJlY2VpdmUgb24gYSBnaXZlbiBjaGFubmVsLCBpdCBtYXkgbm90CisgKiBiZSBhYmxlIHRvIGFzc29jaWF0ZSBvciB0cmFuc21pdCBhbnkgZnJhbWVzIG9uIHRoYXQKKyAqIGNoYW5uZWwuICBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoYXQKKyAqIGVudHJ5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDIuNCBHSHogKi8KK2NvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzFbMTRdID0geworCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAorfTsKKworLyogNS4yIEdIeiBiYW5kcyAqLworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzJbXSA9IHsJLyogNDkxNS01MDgwTUh6ICovCisJMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsIDcsIDgsIDExLCAxMiwgMTYKK307CisKK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF8zW10gPSB7CS8qIDUxNzAtNTMyME1IeiAqLworCTM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQKK307CisKK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF80W10gPSB7CS8qIDU1MDAtNTcwME1IeiAqLworCTEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfNVtdID0gewkvKiA1NzI1LTU4MjVNSHogKi8KKwkxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Cit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfNltdID0gewkvKiAyLjQgaHQ0MCBjaGFubmVsICovCisJMSwgMiwgMywgNCwgNSwgNiwgNworfTsKKworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzdbXSA9IHsJLyogNS4yIGh0NDAgY2hhbm5lbCAqLworCTM2LCA0NCwgNTIsIDYwLCAxMDAsIDEwOCwgMTE2LCAxMjQsIDEzMiwgMTQ5LCAxNTcKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFRVBST00gcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2lsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgZ3AgPSBfaWxfcmQoaWwsIENTUl9FRVBST01fR1ApICYgQ1NSX0VFUFJPTV9HUF9WQUxJRF9NU0s7CisJaW50IHJldCA9IDA7CisKKwlEX0VFUFJPTSgiRUVQUk9NIHNpZ25hdHVyZT0weCUwOHhcbiIsIGdwKTsKKwlzd2l0Y2ggKGdwKSB7CisJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEs6CisJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEs6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiYmFkIEVFUFJPTSBzaWduYXR1cmUsIiAiRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOworCQlyZXQgPSAtRU5PRU5UOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworY29uc3QgdTggKgoraWxfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCBzaXplX3Qgb2Zmc2V0KQoreworCUJVR19PTihvZmZzZXQgPj0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplKTsKKwlyZXR1cm4gJmlsLT5lZXByb21bb2Zmc2V0XTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZWVwcm9tX3F1ZXJ5X2FkZHIpOworCit1MTYKK2lsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCkKK3sKKwlpZiAoIWlsLT5lZXByb20pCisJCXJldHVybiAwOworCXJldHVybiAodTE2KSBpbC0+ZWVwcm9tW29mZnNldF0gfCAoKHUxNikgaWwtPmVlcHJvbVtvZmZzZXQgKyAxXSA8PCA4KTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZWVwcm9tX3F1ZXJ5MTYpOworCisvKioKKyAqIGlsX2VlcHJvbV9pbml0IC0gcmVhZCBFRVBST00gY29udGVudHMKKyAqCisgKiBMb2FkIHRoZSBFRVBST00gY29udGVudHMgZnJvbSBhZGFwdGVyIGludG8gaWwtPmVlcHJvbQorICoKKyAqIE5PVEU6ICBUaGlzIHJvdXRpbmUgdXNlcyB0aGUgbm9uLWRlYnVnIElPIGFjY2VzcyBmdW5jdGlvbnMuCisgKi8KK2ludAoraWxfZWVwcm9tX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUxNiAqZTsKKwl1MzIgZ3AgPSBfaWxfcmQoaWwsIENTUl9FRVBST01fR1ApOworCWludCBzejsKKwlpbnQgcmV0OworCXUxNiBhZGRyOworCisJLyogYWxsb2NhdGUgZWVwcm9tICovCisJc3ogPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7CisJRF9FRVBST00oIk5WTSBzaXplID0gJWRcbiIsIHN6KTsKKwlpbC0+ZWVwcm9tID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbC0+ZWVwcm9tKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZXJyOworCX0KKwllID0gKF9fbGUxNiAqKSBpbC0+ZWVwcm9tOworCisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChpbCk7CisKKwlyZXQgPSBpbF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShpbCk7CisJaWYgKHJldCA8IDApIHsKKwkJSUxfRVJSKCJFRVBST00gbm90IGZvdW5kLCBFRVBST01fR1A9MHglMDh4XG4iLCBncCk7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyOworCX0KKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgKGluc3RlYWQgb2YgdUNvZGUpIGlzIGFsbG93ZWQgdG8gcmVhZCBFRVBST00gKi8KKwlyZXQgPSBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5hY3F1aXJlX3NlbWFwaG9yZShpbCk7CisJaWYgKHJldCA8IDApIHsKKwkJSUxfRVJSKCJGYWlsZWQgdG8gYWNxdWlyZSBFRVBST00gc2VtYXBob3JlLlxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGVlcHJvbSBpcyBhbiBhcnJheSBvZiAxNmJpdCB2YWx1ZXMgKi8KKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgc3o7IGFkZHIgKz0gc2l6ZW9mKHUxNikpIHsKKwkJdTMyIHI7CisKKwkJX2lsX3dyKGlsLCBDU1JfRUVQUk9NX1JFRywKKwkJICAgICAgIENTUl9FRVBST01fUkVHX01TS19BRERSICYgKGFkZHIgPDwgMSkpOworCisJCXJldCA9CisJCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9FRVBST01fUkVHLAorCQkJCSBDU1JfRUVQUk9NX1JFR19SRUFEX1ZBTElEX01TSywKKwkJCQkgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCisJCQkJIElMX0VFUFJPTV9BQ0NFU1NfVElNRU9VVCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlJTF9FUlIoIlRpbWUgb3V0IHJlYWRpbmcgRUVQUk9NWyVkXVxuIiwgYWRkcik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJciA9IF9pbF9yZChpbCwgQ1NSX0VFUFJPTV9SRUcpOworCQllW2FkZHIgLyAyXSA9IGNwdV90b19sZTE2KHIgPj4gMTYpOworCX0KKworCURfRUVQUk9NKCJOVk0gVHlwZTogJXMsIHZlcnNpb246IDB4JXhcbiIsICJFRVBST00iLAorCQkgaWxfZWVwcm9tX3F1ZXJ5MTYoaWwsIEVFUFJPTV9WRVJTSU9OKSk7CisKKwlyZXQgPSAwOworZG9uZToKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWxlYXNlX3NlbWFwaG9yZShpbCk7CisKK2VycjoKKwlpZiAocmV0KQorCQlpbF9lZXByb21fZnJlZShpbCk7CisJLyogUmVzZXQgY2hpcCB0byBzYXZlIHBvd2VyIHVudGlsIHdlIGxvYWQgdUNvZGUgZHVyaW5nICJ1cCIuICovCisJaWxfYXBtX3N0b3AoaWwpOworYWxsb2NfZXJyOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2VlcHJvbV9pbml0KTsKKwordm9pZAoraWxfZWVwcm9tX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT5lZXByb20pOworCWlsLT5lZXByb20gPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF9lZXByb21fZnJlZSk7CisKK3N0YXRpYyB2b2lkCitpbF9pbml0X2JhbmRfcmVmZXJlbmNlKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgaW50IGVlcF9iYW5kLAorCQkgICAgICAgaW50ICplZXByb21fY2hfY291bnQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKiplZXByb21fY2hfaW5mbywKKwkJICAgICAgIGNvbnN0IHU4ICoqZWVwcm9tX2NoX2lkeCkKK3sKKwl1MzIgb2Zmc2V0ID0KKwkgICAgaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1tlZXBfYmFuZCAtIDFdOworCXN3aXRjaCAoZWVwX2JhbmQpIHsKKwljYXNlIDE6CQkvKiAyLjRHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8xKTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzE7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIDQuOUdIeiBiYW5kICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzIpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfMjsKKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogNS4yR0h6IGJhbmQgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMyk7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF8zOworCQlicmVhazsKKwljYXNlIDQ6CQkvKiA1LjVHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF80KTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzQ7CisJCWJyZWFrOworCWNhc2UgNToJCS8qIDUuN0dIeiBiYW5kICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzUpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfNTsKKwkJYnJlYWs7CisJY2FzZSA2OgkJLyogMi40R0h6IGh0NDAgY2hhbm5lbHMgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNik7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF82OworCQlicmVhazsKKwljYXNlIDc6CQkvKiA1IEdIeiBodDQwIGNoYW5uZWxzICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzcpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfNzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisjZGVmaW5lIENIRUNLX0FORF9QUklOVCh4KSAoKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF8jI3gpIFwKKwkJCSAgICA/ICMgeCAiICIgOiAiIikKKy8qKgorICogaWxfbW9kX2h0NDBfY2hhbl9pbmZvIC0gQ29weSBodDQwIGNoYW5uZWwgaW5mbyBpbnRvIGRyaXZlcidzIGlsLgorICoKKyAqIERvZXMgbm90IHNldCB1cCBhIGNvbW1hbmQsIG9yIHRvdWNoIGhhcmR3YXJlLgorICovCitzdGF0aWMgaW50CitpbF9tb2RfaHQ0MF9jaGFuX2luZm8oc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIHUxNiBjaGFubmVsLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKmVlcHJvbV9jaCwKKwkJICAgICAgdTggY2xlYXJfaHQ0MF9leHRlbnNpb25fY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCisJY2hfaW5mbyA9CisJICAgIChzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICopaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgYmFuZCwgY2hhbm5lbCk7CisKKwlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCisJCXJldHVybiAtMTsKKworCURfRUVQUk9NKCJIVDQwIENoLiAlZCBbJXNHSHpdICVzJXMlcyVzJXMoMHglMDJ4ICVkZEJtKToiCisJCSAiIEFkLUhvYyAlc3N1cHBvcnRlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwKKwkJIGlsX2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pID8gIjUuMiIgOiAiMi40IiwKKwkJIENIRUNLX0FORF9QUklOVChJQlNTKSwgQ0hFQ0tfQU5EX1BSSU5UKEFDVElWRSksCisJCSBDSEVDS19BTkRfUFJJTlQoUkFEQVIpLCBDSEVDS19BTkRfUFJJTlQoV0lERSksCisJCSBDSEVDS19BTkRfUFJJTlQoREZTKSwgZWVwcm9tX2NoLT5mbGFncywKKwkJIGVlcHJvbV9jaC0+bWF4X3Bvd2VyX2F2ZywKKwkJICgoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpICYmCisJCSAgIShlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpKSA/ICIiIDogIm5vdCAiKTsKKworCWNoX2luZm8tPmh0NDBfZWVwcm9tID0gKmVlcHJvbV9jaDsKKwljaF9pbmZvLT5odDQwX21heF9wb3dlcl9hdmcgPSBlZXByb21fY2gtPm1heF9wb3dlcl9hdmc7CisJY2hfaW5mby0+aHQ0MF9mbGFncyA9IGVlcHJvbV9jaC0+ZmxhZ3M7CisJaWYgKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9WQUxJRCkKKwkJY2hfaW5mby0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbCAmPQorCQkgICAgfmNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDSEVDS19BTkRfUFJJTlRfSSh4KSAoKGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFncyAmIEVFUFJPTV9DSEFOTkVMXyMjeCkgXAorCQkJICAgID8gIyB4ICIgIiA6ICIiKQorCisvKioKKyAqIGlsX2luaXRfY2hhbm5lbF9tYXAgLSBTZXQgdXAgZHJpdmVyJ3MgaW5mbyBmb3IgYWxsIHBvc3NpYmxlIGNoYW5uZWxzCisgKi8KK2ludAoraWxfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGVlcHJvbV9jaF9jb3VudCA9IDA7CisJY29uc3QgdTggKmVlcHJvbV9jaF9pZHggPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqZWVwcm9tX2NoX2luZm8gPSBOVUxMOworCWludCBiYW5kLCBjaDsKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCisJaWYgKGlsLT5jaGFubmVsX2NvdW50KSB7CisJCURfRUVQUk9NKCJDaGFubmVsIG1hcCBhbHJlYWR5IGluaXRpYWxpemVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCURfRUVQUk9NKCJJbml0aWFsaXppbmcgcmVndWxhdG9yeSBpbmZvIGZyb20gRUVQUk9NXG4iKTsKKworCWlsLT5jaGFubmVsX2NvdW50ID0KKwkgICAgQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8xKSArIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMikgKworCSAgICBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzMpICsgQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF80KSArCisJICAgIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNSk7CisKKwlEX0VFUFJPTSgiUGFyc2luZyBkYXRhIGZvciAlZCBjaGFubmVscy5cbiIsIGlsLT5jaGFubmVsX2NvdW50KTsKKworCWlsLT5jaGFubmVsX2luZm8gPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvKSAqIGlsLT5jaGFubmVsX2NvdW50LAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbC0+Y2hhbm5lbF9pbmZvKSB7CisJCUlMX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIGNoYW5uZWxfaW5mb1xuIik7CisJCWlsLT5jaGFubmVsX2NvdW50ID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2hfaW5mbyA9IGlsLT5jaGFubmVsX2luZm87CisKKwkvKiBMb29wIHRocm91Z2ggdGhlIDUgRUVQUk9NIGJhbmRzIGFkZGluZyB0aGVtIGluIG9yZGVyIHRvIHRoZQorCSAqIGNoYW5uZWwgbWFwIHdlIG1haW50YWluICh0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhbgorCSAqIHdoYXQganVzdCBpbiB0aGUgRUVQUk9NKSAqLworCWZvciAoYmFuZCA9IDE7IGJhbmQgPD0gNTsgYmFuZCsrKSB7CisKKwkJaWxfaW5pdF9iYW5kX3JlZmVyZW5jZShpbCwgYmFuZCwgJmVlcHJvbV9jaF9jb3VudCwKKwkJCQkgICAgICAgJmVlcHJvbV9jaF9pbmZvLCAmZWVwcm9tX2NoX2lkeCk7CisKKwkJLyogTG9vcCB0aHJvdWdoIGVhY2ggYmFuZCBhZGRpbmcgZWFjaCBvZiB0aGUgY2hhbm5lbHMgKi8KKwkJZm9yIChjaCA9IDA7IGNoIDwgZWVwcm9tX2NoX2NvdW50OyBjaCsrKSB7CisJCQljaF9pbmZvLT5jaGFubmVsID0gZWVwcm9tX2NoX2lkeFtjaF07CisJCQljaF9pbmZvLT5iYW5kID0KKwkJCSAgICAoYmFuZCA9PQorCQkJICAgICAxKSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOworCisJCQkvKiBwZXJtYW5lbnRseSBzdG9yZSBFRVBST00ncyBjaGFubmVsIHJlZ3VsYXRvcnkgZmxhZ3MKKwkJCSAqICAgYW5kIG1heCBwb3dlciBpbiBjaGFubmVsIGluZm8gZGF0YWJhc2UuICovCisJCQljaF9pbmZvLT5lZXByb20gPSBlZXByb21fY2hfaW5mb1tjaF07CisKKwkJCS8qIENvcHkgdGhlIHJ1bi10aW1lIGZsYWdzIHNvIHRoZXkgYXJlIHRoZXJlIGV2ZW4gb24KKwkJCSAqIGludmFsaWQgY2hhbm5lbHMgKi8KKwkJCWNoX2luZm8tPmZsYWdzID0gZWVwcm9tX2NoX2luZm9bY2hdLmZsYWdzOworCQkJLyogRmlyc3Qgd3JpdGUgdGhhdCBodDQwIGlzIG5vdCBlbmFibGVkLCBhbmQgdGhlbiBlbmFibGUKKwkJCSAqIG9uZSBieSBvbmUgKi8KKwkJCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgPQorCQkJICAgIElFRUU4MDIxMV9DSEFOX05PX0hUNDA7CisKKwkJCWlmICghKGlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpKSB7CisJCQkJRF9FRVBST00oIkNoLiAlZCBGbGFncyAleCBbJXNHSHpdIC0gIgorCQkJCQkgIk5vIHRyYWZmaWNcbiIsIGNoX2luZm8tPmNoYW5uZWwsCisJCQkJCSBjaF9pbmZvLT5mbGFncywKKwkJCQkJIGlsX2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pID8gIjUuMiIgOgorCQkJCQkgIjIuNCIpOworCQkJCWNoX2luZm8rKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogSW5pdGlhbGl6ZSByZWd1bGF0b3J5LWJhc2VkIHJ1bi10aW1lIGRhdGEgKi8KKwkJCWNoX2luZm8tPm1heF9wb3dlcl9hdmcgPSBjaF9pbmZvLT5jdXJyX3R4cG93ID0KKwkJCSAgICBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZzsKKwkJCWNoX2luZm8tPnNjYW5fcG93ZXIgPSBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZzsKKwkJCWNoX2luZm8tPm1pbl9wb3dlciA9IDA7CisKKwkJCURfRUVQUk9NKCJDaC4gJWQgWyVzR0h6XSAiICIlcyVzJXMlcyVzJXMoMHglMDJ4ICVkZEJtKToiCisJCQkJICIgQWQtSG9jICVzc3VwcG9ydGVkXG4iLCBjaF9pbmZvLT5jaGFubmVsLAorCQkJCSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/ICI1LjIiIDogIjIuNCIsCisJCQkJIENIRUNLX0FORF9QUklOVF9JKFZBTElEKSwKKwkJCQkgQ0hFQ0tfQU5EX1BSSU5UX0koSUJTUyksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKEFDVElWRSksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKFJBREFSKSwKKwkJCQkgQ0hFQ0tfQU5EX1BSSU5UX0koV0lERSksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKERGUyksCisJCQkJIGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFncywKKwkJCQkgZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmcsCisJCQkJICgoZWVwcm9tX2NoX2luZm9bY2hdLgorCQkJCSAgIGZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykgJiYKKwkJCQkgICEoZWVwcm9tX2NoX2luZm9bY2hdLgorCQkJCSAgICBmbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKSkgPyAiIiA6CisJCQkJICJub3QgIik7CisKKwkJCWNoX2luZm8rKzsKKwkJfQorCX0KKworCS8qIENoZWNrIGlmIHdlIGRvIGhhdmUgSFQ0MCBjaGFubmVscyAqLworCWlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzVdID09CisJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCAmJgorCSAgICBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzZdID09CisJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCkKKwkJcmV0dXJuIDA7CisKKwkvKiBUd28gYWRkaXRpb25hbCBFRVBST00gYmFuZHMgZm9yIDIuNCBhbmQgNSBHSHogSFQ0MCBjaGFubmVscyAqLworCWZvciAoYmFuZCA9IDY7IGJhbmQgPD0gNzsgYmFuZCsrKSB7CisJCWVudW0gaWVlZTgwMjExX2JhbmQgaWVlZWJhbmQ7CisKKwkJaWxfaW5pdF9iYW5kX3JlZmVyZW5jZShpbCwgYmFuZCwgJmVlcHJvbV9jaF9jb3VudCwKKwkJCQkgICAgICAgJmVlcHJvbV9jaF9pbmZvLCAmZWVwcm9tX2NoX2lkeCk7CisKKwkJLyogRUVQUk9NIGJhbmQgNiBpcyAyLjQsIGJhbmQgNyBpcyA1IEdIeiAqLworCQlpZWVlYmFuZCA9CisJCSAgICAoYmFuZCA9PSA2KSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOworCisJCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCisJCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgeworCQkJLyogU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGxvd2VyIGhhbGYgKi8KKwkJCWlsX21vZF9odDQwX2NoYW5faW5mbyhpbCwgaWVlZWJhbmQsIGVlcHJvbV9jaF9pZHhbY2hdLAorCQkJCQkgICAgICAmZWVwcm9tX2NoX2luZm9bY2hdLAorCQkJCQkgICAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7CisKKwkJCS8qIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciB1cHBlciBoYWxmICovCisJCQlpbF9tb2RfaHQ0MF9jaGFuX2luZm8oaWwsIGllZWViYW5kLAorCQkJCQkgICAgICBlZXByb21fY2hfaWR4W2NoXSArIDQsCisJCQkJCSAgICAgICZlZXByb21fY2hfaW5mb1tjaF0sCisJCQkJCSAgICAgIElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfaW5pdF9jaGFubmVsX21hcCk7CisKKy8qCisgKiBpbF9mcmVlX2NoYW5uZWxfbWFwIC0gdW5kbyBhbGxvY2F0aW9ucyBpbiBpbF9pbml0X2NoYW5uZWxfbWFwCisgKi8KK3ZvaWQKK2lsX2ZyZWVfY2hhbm5lbF9tYXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT5jaGFubmVsX2luZm8pOworCWlsLT5jaGFubmVsX2NvdW50ID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZnJlZV9jaGFubmVsX21hcCk7CisKKy8qKgorICogaWxfZ2V0X2NoYW5uZWxfaW5mbyAtIEZpbmQgZHJpdmVyJ3MgaWxhdGUgY2hhbm5lbCBpbmZvCisgKgorICogQmFzZWQgb24gYmFuZCBhbmQgY2hhbm5lbCBudW1iZXIuCisgKi8KK2NvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKgoraWxfZ2V0X2NoYW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJICAgIHUxNiBjaGFubmVsKQoreworCWludCBpOworCisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQlmb3IgKGkgPSAxNDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJCWlmIChpbC0+Y2hhbm5lbF9pbmZvW2ldLmNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCQlyZXR1cm4gJmlsLT5jaGFubmVsX2luZm9baV07CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlpZiAoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpCisJCQlyZXR1cm4gJmlsLT5jaGFubmVsX2luZm9bY2hhbm5lbCAtIDFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X2NoYW5uZWxfaW5mbyk7CisKKy8qCisgKiBTZXR0aW5nIHBvd2VyIGxldmVsIGFsbG93cyB0aGUgY2FyZCB0byBnbyB0byBzbGVlcCB3aGVuIG5vdCBidXN5LgorICoKKyAqIFdlIGNhbGN1bGF0ZSBhIHNsZWVwIGNvbW1hbmQgYmFzZWQgb24gdGhlIHJlcXVpcmVkIGxhdGVuY3ksIHdoaWNoCisgKiB3ZSBnZXQgZnJvbSBtYWM4MDIxMS4gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZXJtYWwgdGhyb3R0bGluZywgd2UgY2FuCisgKiBhbHNvIHVzZSBwcmUtZGVmaW5lZCBwb3dlciBsZXZlbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgb2xkIHBvd2VyIGxldmVscy4gVGhleSBhcmUgc3RpbGwgdXNlZCBieSBkZWZhdWx0CisgKiAobGV2ZWwgMSkgYW5kIGZvciB0aGVybWFsIHRocm90dGxlIChsZXZlbHMgMyB0aHJvdWdoIDUpCisgKi8KKworc3RydWN0IGlsX3Bvd2VyX3ZlY19lbnRyeSB7CisJc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIGNtZDsKKwl1OCBub19kdGltOwkJLyogbnVtYmVyIG9mIHNraXAgZHRpbSAqLworfTsKKworc3RhdGljIHZvaWQKK2lsX3Bvd2VyX3NsZWVwX2NhbV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgKmNtZCkKK3sKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJaWYgKGlsLT5wb3dlcl9kYXRhLnBjaV9wbSkKKwkJY21kLT5mbGFncyB8PSBJTF9QT1dFUl9QQ0lfUE1fTVNLOworCisJRF9QT1dFUigiU2xlZXAgY29tbWFuZCBmb3IgQ0FNXG4iKTsKK30KKworc3RhdGljIGludAoraWxfc2V0X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3Bvd2VydGFibGVfY21kICpjbWQpCit7CisJRF9QT1dFUigiU2VuZGluZyBwb3dlci9zbGVlcCBjb21tYW5kXG4iKTsKKwlEX1BPV0VSKCJGbGFncyB2YWx1ZSA9IDB4JTA4WFxuIiwgY21kLT5mbGFncyk7CisJRF9QT1dFUigiVHggdGltZW91dCA9ICV1XG4iLCBsZTMyX3RvX2NwdShjbWQtPnR4X2RhdGFfdGltZW91dCkpOworCURfUE9XRVIoIlJ4IHRpbWVvdXQgPSAldVxuIiwgbGUzMl90b19jcHUoY21kLT5yeF9kYXRhX3RpbWVvdXQpKTsKKwlEX1BPV0VSKCJTbGVlcCBpbnRlcnZhbCB2ZWN0b3IgPSB7ICVkICwgJWQgLCAlZCAsICVkICwgJWQgfVxuIiwKKwkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFswXSksCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMV0pLAorCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzJdKSwKKwkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFszXSksCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbNF0pKTsKKworCXJldHVybiBpbF9zZW5kX2NtZF9wZHUoaWwsIENfUE9XRVJfVEJMLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQpLCBjbWQpOworfQorCitpbnQKK2lsX3Bvd2VyX3NldF9tb2RlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3Bvd2VydGFibGVfY21kICpjbWQsIGJvb2wgZm9yY2UpCit7CisJaW50IHJldDsKKwlib29sIHVwZGF0ZV9jaGFpbnM7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJLyogRG9uJ3QgdXBkYXRlIHRoZSBSWCBjaGFpbiB3aGVuIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uIGlzIHJ1bm5pbmcgKi8KKwl1cGRhdGVfY2hhaW5zID0gaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfRE9ORSB8fAorCSAgICBpbC0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSA9PSBJTF9DSEFJTl9OT0lTRV9BTElWRTsKKworCWlmICghbWVtY21wKCZpbC0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKSAmJiAhZm9yY2UpCisJCXJldHVybiAwOworCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpCisJCXJldHVybiAtRUlPOworCisJLyogc2NhbiBjb21wbGV0ZSB1c2Ugc2xlZXBfcG93ZXJfbmV4dCwgbmVlZCB0byBiZSB1cGRhdGVkICovCisJbWVtY3B5KCZpbC0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgY21kLCBzaXplb2YoKmNtZCkpOworCWlmICh0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykgJiYgIWZvcmNlKSB7CisJCURfSU5GTygiRGVmZXIgcG93ZXIgc2V0IG1vZGUgd2hpbGUgc2Nhbm5pbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY21kLT5mbGFncyAmIElMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spCisJCXNldF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKTsKKworCXJldCA9IGlsX3NldF9wb3dlcihpbCwgY21kKTsKKwlpZiAoIXJldCkgeworCQlpZiAoIShjbWQtPmZsYWdzICYgSUxfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSykpCisJCQljbGVhcl9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKTsKKworCQlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyAmJiB1cGRhdGVfY2hhaW5zKQorCQkJaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhpbCk7CisJCWVsc2UgaWYgKGlsLT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MpCisJCQlEX1BPV0VSKCJDYW5ub3QgdXBkYXRlIHRoZSBwb3dlciwgY2hhaW4gbm9pc2UgIgorCQkJCSJjYWxpYnJhdGlvbiBydW5uaW5nOiAlZFxuIiwKKwkJCQlpbC0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSk7CisKKwkJbWVtY3B5KCZpbC0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwl9IGVsc2UKKwkJSUxfRVJSKCJzZXQgcG93ZXIgZmFpbCwgcmV0ID0gJWQiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50CitpbF9wb3dlcl91cGRhdGVfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZm9yY2UpCit7CisJc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIGNtZDsKKworCWlsX3Bvd2VyX3NsZWVwX2NhbV9jbWQoaWwsICZjbWQpOworCXJldHVybiBpbF9wb3dlcl9zZXRfbW9kZShpbCwgJmNtZCwgZm9yY2UpOworfQorRVhQT1JUX1NZTUJPTChpbF9wb3dlcl91cGRhdGVfbW9kZSk7CisKKy8qIGluaXRpYWxpemUgdG8gZGVmYXVsdCAqLwordm9pZAoraWxfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTE2IGxjdGwgPSBpbF9wY2llX2xpbmtfY3RsKGlsKTsKKworCWlsLT5wb3dlcl9kYXRhLnBjaV9wbSA9ICEobGN0bCAmIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4pOworCisJaWwtPnBvd2VyX2RhdGEuZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGUgPSAtMTsKKworCW1lbXNldCgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCAwLCBzaXplb2YoaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3Bvd2VyX2luaXRpYWxpemUpOworCisvKiBGb3IgYWN0aXZlIHNjYW4sIGxpc3RlbiBBQ1RJVkVfRFdFTExfVElNRSAobXNlYykgb24gZWFjaCBjaGFubmVsIGFmdGVyCisgKiBzZW5kaW5nIHByb2JlIHJlcS4gIFRoaXMgc2hvdWxkIGJlIHNldCBsb25nIGVub3VnaCB0byBoZWFyIHByb2JlIHJlc3BvbnNlcworICogZnJvbSBtb3JlIHRoYW4gb25lIEFQLiAgKi8KKyNkZWZpbmUgSUxfQUNUSVZFX0RXRUxMX1RJTUVfMjQgICAgKDMwKQkvKiBhbGwgdGltZXMgaW4gbXNlYyAqLworI2RlZmluZSBJTF9BQ1RJVkVfRFdFTExfVElNRV81MiAgICAoMjApCisKKyNkZWZpbmUgSUxfQUNUSVZFX0RXRUxMX0ZBQ1RPUl8yNEdIWiAoMykKKyNkZWZpbmUgSUxfQUNUSVZFX0RXRUxMX0ZBQ1RPUl81MkdIWiAoMikKKworLyogRm9yIHBhc3NpdmUgc2NhbiwgbGlzdGVuIFBBU1NJVkVfRFdFTExfVElNRSAobXNlYykgb24gZWFjaCBjaGFubmVsLgorICogTXVzdCBiZSBzZXQgbG9uZ2VyIHRoYW4gYWN0aXZlIGR3ZWxsIHRpbWUuCisgKiBGb3IgdGhlIG1vc3QgcmVsaWFibGUgc2Nhbiwgc2V0ID4gQVAgYmVhY29uIGludGVydmFsICh0eXBpY2FsbHkgMTAwbXNlYykuICovCisjZGVmaW5lIElMX1BBU1NJVkVfRFdFTExfVElNRV8yNCAgICgyMCkJLyogYWxsIHRpbWVzIGluIG1zZWMgKi8KKyNkZWZpbmUgSUxfUEFTU0lWRV9EV0VMTF9USU1FXzUyICAgKDEwKQorI2RlZmluZSBJTF9QQVNTSVZFX0RXRUxMX0JBU0UgICAgICAoMTAwKQorI2RlZmluZSBJTF9DSEFOTkVMX1RVTkVfVElNRSAgICAgICA1CisKK3N0YXRpYyBpbnQKK2lsX3NlbmRfc2Nhbl9hYm9ydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19TQ0FOX0FCT1JULAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCisJfTsKKworCS8qIEV4aXQgaW5zdGFudGx5IHdpdGggZXJyb3Igd2hlbiBkZXZpY2UgaXMgbm90IHJlYWR5CisJICogdG8gcmVjZWl2ZSBzY2FuIGFib3J0IGNvbW1hbmQgb3IgaXQgZG9lcyBub3QgcGVyZm9ybQorCSAqIGhhcmR3YXJlIHNjYW4gY3VycmVudGx5ICovCisJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgIXRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSB8fAorCSAgICAhdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUlPOworCisJcmV0ID0gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJaWYgKHBrdC0+dS5zdGF0dXMgIT0gQ0FOX0FCT1JUX1NUQVRVUykgeworCQkvKiBUaGUgc2NhbiBhYm9ydCB3aWxsIHJldHVybiAxIGZvciBzdWNjZXNzIG9yCisJCSAqIDIgZm9yICJmYWlsdXJlIi4gIEEgZmFpbHVyZSBjb25kaXRpb24gY2FuIGJlCisJCSAqIGR1ZSB0byBzaW1wbHkgbm90IGJlaW5nIGluIGFuIGFjdGl2ZSBzY2FuIHdoaWNoCisJCSAqIGNhbiBvY2N1ciBpZiB3ZSBzZW5kIHRoZSBzY2FuIGFib3J0IGJlZm9yZSB3ZQorCQkgKiB0aGUgbWljcm9jb2RlIGhhcyBub3RpZmllZCB1cyB0aGF0IGEgc2NhbiBpcworCQkgKiBjb21wbGV0ZWQuICovCisJCURfU0NBTigiU0NBTl9BQk9SVCByZXQgJWQuXG4iLCBwa3QtPnUuc3RhdHVzKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsX2NvbXBsZXRlX3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGFib3J0ZWQpCit7CisJLyogY2hlY2sgaWYgc2NhbiB3YXMgcmVxdWVzdGVkIGZyb20gbWFjODAyMTEgKi8KKwlpZiAoaWwtPnNjYW5fcmVxdWVzdCkgeworCQlEX1NDQU4oIkNvbXBsZXRlIHNjYW4gaW4gbWFjODAyMTFcbiIpOworCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoaWwtPmh3LCBhYm9ydGVkKTsKKwl9CisKKwlpbC0+c2Nhbl92aWYgPSBOVUxMOworCWlsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOworfQorCit2b2lkCitpbF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICghdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiRm9yY2luZyBzY2FuIGVuZCB3aGlsZSBub3Qgc2Nhbm5pbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJRF9TQ0FOKCJGb3JjaW5nIHNjYW4gZW5kXG4iKTsKKwljbGVhcl9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpOworCWNsZWFyX2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKKwljbGVhcl9iaXQoU19TQ0FOX0FCT1JUSU5HLCAmaWwtPnN0YXR1cyk7CisJaWxfY29tcGxldGVfc2NhbihpbCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbF9kb19zY2FuX2Fib3J0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICghdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiTm90IHBlcmZvcm1pbmcgc2NhbiB0byBhYm9ydFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTX1NDQU5fQUJPUlRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIlNjYW4gYWJvcnQgaW4gcHJvZ3Jlc3NcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gaWxfc2VuZF9zY2FuX2Fib3J0KGlsKTsKKwlpZiAocmV0KSB7CisJCURfU0NBTigiU2VuZCBzY2FuIGFib3J0IGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJaWxfZm9yY2Vfc2Nhbl9lbmQoaWwpOworCX0gZWxzZQorCQlEX1NDQU4oIlN1Y2Nlc3NmdWxseSBzZW5kIHNjYW4gYWJvcnRcbiIpOworfQorCisvKioKKyAqIGlsX3NjYW5fY2FuY2VsIC0gQ2FuY2VsIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIEhXIHNjYW4KKyAqLworaW50CitpbF9zY2FuX2NhbmNlbChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJRF9TQ0FOKCJRdWV1aW5nIGFib3J0IHNjYW5cbiIpOworCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5hYm9ydF9zY2FuKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2Nhbl9jYW5jZWwpOworCisvKioKKyAqIGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQgLSBDYW5jZWwgYW55IGN1cnJlbnRseSBleGVjdXRpbmcgSFcgc2NhbgorICogQG1zOiBhbW91bnQgb2YgdGltZSB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBzY2FuIHRvIGFib3J0CisgKgorICovCitpbnQKK2lsX3NjYW5fY2FuY2VsX3RpbWVvdXQoc3RydWN0IGlsX3ByaXYgKmlsLCB1bnNpZ25lZCBsb25nIG1zKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlEX1NDQU4oIlNjYW4gY2FuY2VsIHRpbWVvdXRcbiIpOworCisJaWxfZG9fc2Nhbl9hYm9ydChpbCk7CisKKwl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKCF0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSkKKwkJCWJyZWFrOworCQltc2xlZXAoMjApOworCX0KKworCXJldHVybiB0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2Nhbl9jYW5jZWxfdGltZW91dCk7CisKKy8qIFNlcnZpY2UgcmVzcG9uc2UgdG8gQ19TQ0FOICgweDgwKSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NjYW5yZXFfbm90aWZpY2F0aW9uICpub3RpZiA9CisJICAgIChzdHJ1Y3QgaWxfc2NhbnJlcV9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OworCisJRF9TQ0FOKCJTY2FuIHJlcXVlc3Qgc3RhdHVzID0gMHgleFxuIiwgbm90aWYtPnN0YXR1cyk7CisjZW5kaWYKK30KKworLyogU2VydmljZSBOX1NDQU5fU1RBUlQgKDB4ODIpICovCitzdGF0aWMgdm9pZAoraWxfaGRsX3NjYW5fc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2NhbnN0YXJ0X25vdGlmaWNhdGlvbiAqbm90aWYgPQorCSAgICAoc3RydWN0IGlsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OworCWlsLT5zY2FuX3N0YXJ0X3RzZiA9IGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KTsKKwlEX1NDQU4oIlNjYW4gc3RhcnQ6ICIgIiVkIFs4MDIuMTElc10gIgorCSAgICAgICAiKFRTRjogMHglMDhYOiUwOFgpIC0gJWQgKGJlYWNvbiB0aW1lciAldSlcbiIsIG5vdGlmLT5jaGFubmVsLAorCSAgICAgICBub3RpZi0+YmFuZCA/ICJiZyIgOiAiYSIsIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfaGlnaCksCisJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSwgbm90aWYtPnN0YXR1cywgbm90aWYtPmJlYWNvbl90aW1lcik7Cit9CisKKy8qIFNlcnZpY2UgTl9TQ0FOX1JFU1VMVFMgKDB4ODMpICovCitzdGF0aWMgdm9pZAoraWxfaGRsX3NjYW5fcmVzdWx0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9zY2FucmVzdWx0c19ub3RpZmljYXRpb24gKm5vdGlmID0KKwkgICAgKHN0cnVjdCBpbF9zY2FucmVzdWx0c19ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OworCisJRF9TQ0FOKCJTY2FuIGNoLnJlczogIiAiJWQgWzgwMi4xMSVzXSAiICIoVFNGOiAweCUwOFg6JTA4WCkgLSAlZCAiCisJICAgICAgICJlbGFwc2VkPSVsdSB1c2VjXG4iLCBub3RpZi0+Y2hhbm5lbCwgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2hpZ2gpLCBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyksCisJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT5zdGF0c1swXSksCisJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSAtIGlsLT5zY2FuX3N0YXJ0X3RzZik7CisjZW5kaWYKK30KKworLyogU2VydmljZSBOX1NDQU5fQ09NUExFVEUgKDB4ODQpICovCitzdGF0aWMgdm9pZAoraWxfaGRsX3NjYW5fY29tcGxldGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9zY2FuY29tcGxldGVfbm90aWZpY2F0aW9uICpzY2FuX25vdGlmID0gKHZvaWQgKilwa3QtPnUucmF3OworI2VuZGlmCisKKwlEX1NDQU4oIlNjYW4gY29tcGxldGU6ICVkIGNoYW5uZWxzIChUU0YgMHglMDhYOiUwOFgpIC0gJWRcbiIsCisJICAgICAgIHNjYW5fbm90aWYtPnNjYW5uZWRfY2hhbm5lbHMsIHNjYW5fbm90aWYtPnRzZl9sb3csCisJICAgICAgIHNjYW5fbm90aWYtPnRzZl9oaWdoLCBzY2FuX25vdGlmLT5zdGF0dXMpOworCisJLyogVGhlIEhXIGlzIG5vIGxvbmdlciBzY2FubmluZyAqLworCWNsZWFyX2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKKworCURfU0NBTigiU2NhbiBvbiAlc0dIeiB0b29rICVkbXNcbiIsCisJICAgICAgIChpbC0+c2Nhbl9iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8gIjIuNCIgOiAiNS4yIiwKKwkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gaWwtPnNjYW5fc3RhcnQpKTsKKworCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5zY2FuX2NvbXBsZXRlZCk7Cit9CisKK3ZvaWQKK2lsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIHNjYW4gaGFuZGxlcnMgKi8KKwlpbC0+aGFuZGxlcnNbQ19TQ0FOXSA9IGlsX2hkbF9zY2FuOworCWlsLT5oYW5kbGVyc1tOX1NDQU5fU1RBUlRdID0gaWxfaGRsX3NjYW5fc3RhcnQ7CisJaWwtPmhhbmRsZXJzW05fU0NBTl9SRVNVTFRTXSA9IGlsX2hkbF9zY2FuX3Jlc3VsdHM7CisJaWwtPmhhbmRsZXJzW05fU0NBTl9DT01QTEVURV0gPSBpbF9oZGxfc2Nhbl9jb21wbGV0ZTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyk7CisKK2lubGluZSB1MTYKK2lsX2dldF9hY3RpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCSB1OCBuX3Byb2JlcykKK3sKKwlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyZXR1cm4gSUxfQUNUSVZFX0RXRUxMX1RJTUVfNTIgKworCQkgICAgSUxfQUNUSVZFX0RXRUxMX0ZBQ1RPUl81MkdIWiAqIChuX3Byb2JlcyArIDEpOworCWVsc2UKKwkJcmV0dXJuIElMX0FDVElWRV9EV0VMTF9USU1FXzI0ICsKKwkJICAgIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKiAobl9wcm9iZXMgKyAxKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKTsKKwordTE2CitpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUxNiB2YWx1ZTsKKworCXUxNiBwYXNzaXZlID0KKwkgICAgKGJhbmQgPT0KKwkgICAgIElFRUU4MDIxMV9CQU5EXzJHSFopID8gSUxfUEFTU0lWRV9EV0VMTF9CQVNFICsKKwkgICAgSUxfUEFTU0lWRV9EV0VMTF9USU1FXzI0IDogSUxfUEFTU0lWRV9EV0VMTF9CQVNFICsKKwkgICAgSUxfUEFTU0lWRV9EV0VMTF9USU1FXzUyOworCisJaWYgKGlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBhc3NvY2lhdGVkLCB3ZSBjbGFtcCB0aGUgbWF4aW11bSBwYXNzaXZlCisJCSAqIGR3ZWxsIHRpbWUgdG8gYmUgOTglIG9mIHRoZSBzbWFsbGVzdCBiZWFjb24gaW50ZXJ2YWwKKwkJICogKG1pbnVzIDIgKiBjaGFubmVsIHR1bmUgdGltZSkKKwkJICovCisJCXZhbHVlID0gY3R4LT52aWYgPyBjdHgtPnZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCA6IDA7CisJCWlmICh2YWx1ZSA+IElMX1BBU1NJVkVfRFdFTExfQkFTRSB8fCAhdmFsdWUpCisJCQl2YWx1ZSA9IElMX1BBU1NJVkVfRFdFTExfQkFTRTsKKwkJdmFsdWUgPSAodmFsdWUgKiA5OCkgLyAxMDAgLSBJTF9DSEFOTkVMX1RVTkVfVElNRSAqIDI7CisJCXBhc3NpdmUgPSBtaW4odmFsdWUsIHBhc3NpdmUpOworCX0KKworCXJldHVybiBwYXNzaXZlOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKTsKKwordm9pZAoraWxfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTggYW50X2lkeCA9IGZscyhpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCkgLSAxOworCWlmICghaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzVHSFpdKQorCQlpbC0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBhbnRfaWR4OworCWlmICghaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzJHSFpdKQorCQlpbC0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSBhbnRfaWR4OworfQorRVhQT1JUX1NZTUJPTChpbF9pbml0X3NjYW5fcGFyYW1zKTsKKworc3RhdGljIGludAoraWxfc2Nhbl9pbml0aWF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoV0FSTl9PTighaWwtPmNmZy0+b3BzLT51dGlscy0+cmVxdWVzdF9zY2FuKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPnNjYW5fY2hlY2spOworCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpIHsKKwkJSUxfV0FSTigiUmVxdWVzdCBzY2FuIGNhbGxlZCB3aGVuIGRyaXZlciBub3QgcmVhZHkuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHRlc3RfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiTXVsdGlwbGUgY29uY3VycmVudCBzY2FuIHJlcXVlc3RzIGluIHBhcmFsbGVsLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKHRlc3RfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiU2NhbiByZXF1ZXN0IHdoaWxlIGFib3J0IHBlbmRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlEX1NDQU4oIlN0YXJ0aW5nIHNjYW4uLi5cbiIpOworCisJc2V0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cyk7CisJaWwtPnNjYW5fc3RhcnQgPSBqaWZmaWVzOworCisJcmV0ID0gaWwtPmNmZy0+b3BzLT51dGlscy0+cmVxdWVzdF9zY2FuKGlsLCB2aWYpOworCWlmIChyZXQpIHsKKwkJY2xlYXJfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5zY2FuX2NoZWNrLAorCQkJICAgSUxfU0NBTl9DSEVDS19XQVRDSERPRyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbF9tYWNfaHdfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkgICAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWludCByZXQ7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAocmVxLT5uX2NoYW5uZWxzID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWlmICh0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJRF9TQ0FOKCJTY2FuIGFscmVhZHkgaW4gcHJvZ3Jlc3MuXG4iKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIG1hYzgwMjExIHdpbGwgb25seSBhc2sgZm9yIG9uZSBiYW5kIGF0IGEgdGltZSAqLworCWlsLT5zY2FuX3JlcXVlc3QgPSByZXE7CisJaWwtPnNjYW5fdmlmID0gdmlmOworCWlsLT5zY2FuX2JhbmQgPSByZXEtPmNoYW5uZWxzWzBdLT5iYW5kOworCisJcmV0ID0gaWxfc2Nhbl9pbml0aWF0ZShpbCwgdmlmKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9tYWNfaHdfc2Nhbik7CisKK3N0YXRpYyB2b2lkCitpbF9iZ19zY2FuX2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHNjYW5fY2hlY2sud29yayk7CisKKwlEX1NDQU4oIlNjYW4gY2hlY2sgd29ya1xuIik7CisKKwkvKiBTaW5jZSB3ZSBhcmUgaGVyZSBmaXJtd2FyZSBkb2VzIG5vdCBmaW5pc2ggc2NhbiBhbmQKKwkgKiBtb3N0IGxpa2VseSBpcyBpbiBiYWQgc2hhcGUsIHNvIHdlIGRvbid0IGJvdGhlciB0bworCSAqIHNlbmQgYWJvcnQgY29tbWFuZCwganVzdCBmb3JjZSBzY2FuIGNvbXBsZXRlIHRvIG1hYzgwMjExICovCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbF9mb3JjZV9zY2FuX2VuZChpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCisvKioKKyAqIGlsX2ZpbGxfcHJvYmVfcmVxIC0gZmlsbCBpbiBhbGwgcmVxdWlyZWQgZmllbGRzIGFuZCBJRSBmb3IgcHJvYmUgcmVxdWVzdAorICovCisKK3UxNgoraWxfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKmZyYW1lLAorCQkgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllcywgaW50IGllX2xlbiwgaW50IGxlZnQpCit7CisJaW50IGxlbiA9IDA7CisJdTggKnBvcyA9IE5VTEw7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgcHJvYmUgcmVxdWVzdCwKKwkgKiB0d28gbWFuZGF0b3J5IElFcyBhbmQgdGhlIGRhdGEgKi8KKwlsZWZ0IC09IDI0OworCWlmIChsZWZ0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlmcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOworCW1lbWNweShmcmFtZS0+ZGEsIGlsX2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZnJhbWUtPnNhLCB0YSwgRVRIX0FMRU4pOworCW1lbWNweShmcmFtZS0+YnNzaWQsIGlsX2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKKwlmcmFtZS0+c2VxX2N0cmwgPSAwOworCisJbGVuICs9IDI0OworCisJLyogLi4ubmV4dCBJRS4uLiAqLworCXBvcyA9ICZmcmFtZS0+dS5wcm9iZV9yZXEudmFyaWFibGVbMF07CisKKwkvKiBmaWxsIGluIG91ciBpbmRpcmVjdCBTU0lEIElFICovCisJbGVmdCAtPSAyOworCWlmIChsZWZ0IDwgMCkKKwkJcmV0dXJuIDA7CisJKnBvcysrID0gV0xBTl9FSURfU1NJRDsKKwkqcG9zKysgPSAwOworCisJbGVuICs9IDI7CisKKwlpZiAoV0FSTl9PTihsZWZ0IDwgaWVfbGVuKSkKKwkJcmV0dXJuIGxlbjsKKworCWlmIChpZXMgJiYgaWVfbGVuKSB7CisJCW1lbWNweShwb3MsIGllcywgaWVfbGVuKTsKKwkJbGVuICs9IGllX2xlbjsKKwl9CisKKwlyZXR1cm4gKHUxNikgbGVuOworfQorRVhQT1JUX1NZTUJPTChpbF9maWxsX3Byb2JlX3JlcSk7CisKK3N0YXRpYyB2b2lkCitpbF9iZ19hYm9ydF9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlsX3ByaXYsIGFib3J0X3NjYW4pOworCisJRF9TQ0FOKCJBYm9ydCBzY2FuIHdvcmtcbiIpOworCisJLyogV2Uga2VlcCBzY2FuX2NoZWNrIHdvcmsgcXVldWVkIGluIGNhc2Ugd2hlbiBmaXJtd2FyZSB3aWxsIG5vdAorCSAqIHJlcG9ydCBiYWNrIHNjYW4gY29tcGxldGVkIG5vdGlmaWNhdGlvbiAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMjAwKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbF9iZ19zY2FuX2NvbXBsZXRlZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpbF9wcml2LCBzY2FuX2NvbXBsZXRlZCk7CisJYm9vbCBhYm9ydGVkOworCisJRF9TQ0FOKCJDb21wbGV0ZWQgc2Nhbi5cbiIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPnNjYW5fY2hlY2spOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWFib3J0ZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoU19TQ0FOX0FCT1JUSU5HLCAmaWwtPnN0YXR1cyk7CisJaWYgKGFib3J0ZWQpCisJCURfU0NBTigiQWJvcnRlZCBzY2FuIGNvbXBsZXRlZC5cbiIpOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiU2NhbiBhbHJlYWR5IGNvbXBsZXRlZC5cbiIpOworCQlnb3RvIG91dF9zZXR0aW5nczsKKwl9CisKKwlpbF9jb21wbGV0ZV9zY2FuKGlsLCBhYm9ydGVkKTsKKworb3V0X3NldHRpbmdzOgorCS8qIENhbiB3ZSBzdGlsbCB0YWxrIHRvIGZpcm13YXJlID8gKi8KKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFdlIGRvIG5vdCBjb21taXQgcG93ZXIgc2V0dGluZ3Mgd2hpbGUgc2NhbiBpcyBwZW5kaW5nLAorCSAqIGRvIGl0IG5vdyBpZiB0aGUgc2V0dGluZ3MgY2hhbmdlZC4KKwkgKi8KKwlpbF9wb3dlcl9zZXRfbW9kZShpbCwgJmlsLT5wb3dlcl9kYXRhLnNsZWVwX2NtZF9uZXh0LCBmYWxzZSk7CisJaWxfc2V0X3R4X3Bvd2VyKGlsLCBpbC0+dHhfcG93ZXJfbmV4dCwgZmFsc2UpOworCisJaWwtPmNmZy0+b3BzLT51dGlscy0+cG9zdF9zY2FuKGlsKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKwordm9pZAoraWxfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlJTklUX1dPUksoJmlsLT5zY2FuX2NvbXBsZXRlZCwgaWxfYmdfc2Nhbl9jb21wbGV0ZWQpOworCUlOSVRfV09SSygmaWwtPmFib3J0X3NjYW4sIGlsX2JnX2Fib3J0X3NjYW4pOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbC0+c2Nhbl9jaGVjaywgaWxfYmdfc2Nhbl9jaGVjayk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayk7CisKK3ZvaWQKK2lsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNhbmNlbF93b3JrX3N5bmMoJmlsLT5hYm9ydF9zY2FuKTsKKwljYW5jZWxfd29ya19zeW5jKCZpbC0+c2Nhbl9jb21wbGV0ZWQpOworCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPnNjYW5fY2hlY2spKSB7CisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlsX2ZvcmNlX3NjYW5fZW5kKGlsKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayk7CisKKy8qIGlsLT5zdGFfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkCitpbF9zdGFfdWNvZGVfYWN0aXZhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBzdGFfaWQpCit7CisKKwlpZiAoIShpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKQorCQlJTF9FUlIoIkFDVElWQVRFIGEgbm9uIERSSVZFUiBhY3RpdmUgc3RhdGlvbiBpZCAldSBhZGRyICVwTVxuIiwKKwkJICAgICAgIHN0YV9pZCwgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgeworCQlEX0FTU09DKCJTVEEgaWQgJXUgYWRkciAlcE0gYWxyZWFkeSBwcmVzZW50IgorCQkJIiBpbiB1Q29kZSAoYWNjb3JkaW5nIHRvIGRyaXZlcilcbiIsIHN0YV9pZCwKKwkJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJfSBlbHNlIHsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfVUNPREVfQUNUSVZFOworCQlEX0FTU09DKCJBZGRlZCBTVEEgaWQgJXUgYWRkciAlcE0gdG8gdUNvZGVcbiIsIHN0YV9pZCwKKwkJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJfQorfQorCitzdGF0aWMgaW50CitpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEsCisJCQlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QsIGJvb2wgc3luYykKK3sKKwl1OCBzdGFfaWQgPSBhZGRzdGEtPnN0YS5zdGFfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTzsKKworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfQUREX1NUQSAoMHglMDhYKVxuIiwgcGt0LT5oZHIuZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCURfSU5GTygiUHJvY2Vzc2luZyByZXNwb25zZSBmb3IgYWRkaW5nIHN0YXRpb24gJXVcbiIsIHN0YV9pZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKHBrdC0+dS5hZGRfc3RhLnN0YXR1cykgeworCWNhc2UgQUREX1NUQV9TVUNDRVNTX01TSzoKKwkJRF9JTkZPKCJDX0FERF9TVEEgUEFTU0VEXG4iKTsKKwkJaWxfc3RhX3Vjb2RlX2FjdGl2YXRlKGlsLCBzdGFfaWQpOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIEFERF9TVEFfTk9fUk9PTV9JTl9UQkw6CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyByb29tIGluIHRhYmxlLlxuIiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBBRERfU1RBX05PX0JMT0NLX0FDS19SRVNPVVJDRToKKwkJSUxfRVJSKCJBZGRpbmcgc3RhdGlvbiAlZCBmYWlsZWQsIG5vIGJsb2NrIGFjayByZXNvdXJjZS5cbiIsCisJCSAgICAgICBzdGFfaWQpOworCQlicmVhazsKKwljYXNlIEFERF9TVEFfTU9ESUZZX05PTl9FWElTVF9TVEE6CisJCUlMX0VSUigiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCisJCSAgICAgICBzdGFfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEX0FTU09DKCJSZWNlaXZlZCBDX0FERF9TVEE6KDB4JTA4WClcbiIsIHBrdC0+dS5hZGRfc3RhLnN0YXR1cyk7CisJCWJyZWFrOworCX0KKworCURfSU5GTygiJXMgc3RhdGlvbiBpZCAldSBhZGRyICVwTVxuIiwKKwkgICAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KKwkgICAgICAgU1RBX0NPTlRST0xfTU9ESUZZX01TSyA/ICJNb2RpZmllZCIgOiAiQWRkZWQiLCBzdGFfaWQsCisJICAgICAgIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisKKwkvKgorCSAqIFhYWDogVGhlIE1BQyBhZGRyZXNzIGluIHRoZSBjb21tYW5kIGJ1ZmZlciBpcyBvZnRlbiBjaGFuZ2VkIGZyb20KKwkgKiB0aGUgb3JpZ2luYWwgc2VudCB0byB0aGUgZGV2aWNlLiBUaGF0IGlzLCB0aGUgTUFDIGFkZHJlc3MKKwkgKiB3cml0dGVuIHRvIHRoZSBjb21tYW5kIGJ1ZmZlciBvZnRlbiBpcyBub3QgdGhlIHNhbWUgTUFDIGFkZHJlc3MKKwkgKiByZWFkIGZyb20gdGhlIGNvbW1hbmQgYnVmZmVyIHdoZW4gdGhlIGNvbW1hbmQgcmV0dXJucy4gVGhpcworCSAqIGlzc3VlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQgYW5kIHRoaXMgZGVidWdnaW5nIGlzIGxlZnQgdG8KKwkgKiBvYnNlcnZlIHRoZSBwcm9ibGVtLgorCSAqLworCURfSU5GTygiJXMgc3RhdGlvbiBhY2NvcmRpbmcgdG8gY21kIGJ1ZmZlciAlcE1cbiIsCisJICAgICAgIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID09CisJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwgYWRkc3RhLT5zdGEuYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWxfYWRkX3N0YV9jYWxsYmFjayhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCSAgICBzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpCit7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaWxfYWRkc3RhX2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisKKwlpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChpbCwgYWRkc3RhLCBwa3QsIGZhbHNlKTsKKworfQorCitpbnQKK2lsX3NlbmRfYWRkX3N0YShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJdTggZGF0YVtzaXplb2YoKnN0YSldOworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfQUREX1NUQSwKKwkJLmZsYWdzID0gZmxhZ3MsCisJCS5kYXRhID0gZGF0YSwKKwl9OworCXU4IHN0YV9pZCBfX21heWJlX3VudXNlZCA9IHN0YS0+c3RhLnN0YV9pZDsKKworCURfSU5GTygiQWRkaW5nIHN0YSAldSAoJXBNKSAlc3N5bmNocm9ub3VzbHlcbiIsIHN0YV9pZCwgc3RhLT5zdGEuYWRkciwKKwkgICAgICAgZmxhZ3MgJiBDTURfQVNZTkMgPyAiYSIgOiAiIik7CisKKwlpZiAoZmxhZ3MgJiBDTURfQVNZTkMpCisJCWNtZC5jYWxsYmFjayA9IGlsX2FkZF9zdGFfY2FsbGJhY2s7CisJZWxzZSB7CisJCWNtZC5mbGFncyB8PSBDTURfV0FOVF9TS0I7CisJCW1pZ2h0X3NsZWVwKCk7CisJfQorCisJY21kLmxlbiA9IGlsLT5jZmctPm9wcy0+dXRpbHMtPmJ1aWxkX2FkZHN0YV9oY21kKHN0YSwgZGF0YSk7CisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCisJaWYgKHJldCB8fCAoZmxhZ3MgJiBDTURfQVNZTkMpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCA9PSAwKSB7CisJCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJCXJldCA9IGlsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKGlsLCBzdGEsIHBrdCwgdHJ1ZSk7CisJfQorCWlsX2ZyZWVfcGFnZXMoaWwsIGNtZC5yZXBseV9wYWdlKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfYWRkX3N0YSk7CisKK3N0YXRpYyB2b2lkCitpbF9zZXRfaHRfYWRkX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZHgsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgICAgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKnN0YV9odF9pbmYgPSAmc3RhLT5odF9jYXA7CisJX19sZTMyIHN0YV9mbGFnczsKKwl1OCBtaW1vX3BzX21vZGU7CisKKwlpZiAoIXN0YSB8fCAhc3RhX2h0X2luZi0+aHRfc3VwcG9ydGVkKQorCQlnb3RvIGRvbmU7CisKKwltaW1vX3BzX21vZGUgPSAoc3RhX2h0X2luZi0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TTV9QUykgPj4gMjsKKwlEX0FTU09DKCJzcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlIG1vZGU6ICVzXG4iLAorCQkobWltb19wc19tb2RlID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykgPyAic3RhdGljIiA6CisJCShtaW1vX3BzX21vZGUgPT0gV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQykgPyAiZHluYW1pYyIgOgorCQkiZGlzYWJsZWQiKTsKKworCXN0YV9mbGFncyA9IGlsLT5zdGF0aW9uc1tpZHhdLnN0YS5zdGF0aW9uX2ZsYWdzOworCisJc3RhX2ZsYWdzICY9IH4oU1RBX0ZMR19SVFNfTUlNT19QUk9UX01TSyB8IFNUQV9GTEdfTUlNT19ESVNfTVNLKTsKKworCXN3aXRjaCAobWltb19wc19tb2RlKSB7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUM6CisJCXN0YV9mbGFncyB8PSBTVEFfRkxHX01JTU9fRElTX01TSzsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9QU19EWU5BTUlDOgorCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19SVFNfTUlNT19QUk9UX01TSzsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9QU19ESVNBQkxFRDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfV0FSTigiSW52YWxpZCBNSU1PIFBTIG1vZGUgJWRcbiIsIG1pbW9fcHNfbW9kZSk7CisJCWJyZWFrOworCX0KKworCXN0YV9mbGFncyB8PQorCSAgICBjcHVfdG9fbGUzMigodTMyKSBzdGFfaHRfaW5mLT4KKwkJCWFtcGR1X2ZhY3RvciA8PCBTVEFfRkxHX01BWF9BR0dfU0laRV9QT1MpOworCisJc3RhX2ZsYWdzIHw9CisJICAgIGNwdV90b19sZTMyKCh1MzIpIHN0YV9odF9pbmYtPgorCQkJYW1wZHVfZGVuc2l0eSA8PCBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfUE9TKTsKKworCWlmIChpbF9pc19odDQwX3R4X2FsbG93ZWQoaWwsIGN0eCwgJnN0YS0+aHRfY2FwKSkKKwkJc3RhX2ZsYWdzIHw9IFNUQV9GTEdfSFQ0MF9FTl9NU0s7CisJZWxzZQorCQlzdGFfZmxhZ3MgJj0gflNUQV9GTEdfSFQ0MF9FTl9NU0s7CisKKwlpbC0+c3RhdGlvbnNbaWR4XS5zdGEuc3RhdGlvbl9mbGFncyA9IHN0YV9mbGFnczsKK2RvbmU6CisJcmV0dXJuOworfQorCisvKioKKyAqIGlsX3ByZXBfc3RhdGlvbiAtIFByZXBhcmUgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWRkaXRpb24KKyAqCisgKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggc3RhX2xvY2sgaGVsZAorICovCit1OAoraWxfcHJlcF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQljb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKKwlpbnQgaTsKKwl1OCBzdGFfaWQgPSBJTF9JTlZBTElEX1NUQVRJT047CisJdTE2IHJhdGU7CisKKwlpZiAoaXNfYXApCisJCXN0YV9pZCA9IGN0eC0+YXBfc3RhX2lkOworCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQorCQlzdGFfaWQgPSBjdHgtPmJjYXN0X3N0YV9pZDsKKwllbHNlCisJCWZvciAoaSA9IElMX1NUQV9JRDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyCisJCQkgICAgKGlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIsIGFkZHIpKSB7CisJCQkJc3RhX2lkID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFpbC0+c3RhdGlvbnNbaV0udXNlZCAmJgorCQkJICAgIHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCQkJc3RhX2lkID0gaTsKKwkJfQorCisJLyoKKwkgKiBUaGVzZSB0d28gY29uZGl0aW9ucyBoYXZlIHRoZSBzYW1lIG91dGNvbWUsIGJ1dCBrZWVwIHRoZW0KKwkgKiBzZXBhcmF0ZQorCSAqLworCWlmICh1bmxpa2VseShzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJcmV0dXJuIHN0YV9pZDsKKworCS8qCisJICogdUNvZGUgaXMgbm90IGFibGUgdG8gZGVhbCB3aXRoIG11bHRpcGxlIHJlcXVlc3RzIHRvIGFkZCBhCisJICogc3RhdGlvbi4gS2VlcCB0cmFjayBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3Mgc28gdGhhdCB3ZSBkbyBub3Qgc2VuZAorCSAqIGFub3RoZXIuCisJICovCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgeworCQlEX0lORk8oIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLCBzdGFfaWQpOworCQlyZXR1cm4gc3RhX2lkOworCX0KKworCWlmICgoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSAmJgorCSAgICAoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCisJICAgICFjb21wYXJlX2V0aGVyX2FkZHIoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyLCBhZGRyKSkgeworCQlEX0FTU09DKCJTVEEgJWQgKCVwTSkgYWxyZWFkeSBhZGRlZCwgbm90IGFkZGluZyBhZ2Fpbi5cbiIsCisJCQlzdGFfaWQsIGFkZHIpOworCQlyZXR1cm4gc3RhX2lkOworCX0KKworCXN0YXRpb24gPSAmaWwtPnN0YXRpb25zW3N0YV9pZF07CisJc3RhdGlvbi0+dXNlZCA9IElMX1NUQV9EUklWRVJfQUNUSVZFOworCURfQVNTT0MoIkFkZCBTVEEgdG8gZHJpdmVyIElEICVkOiAlcE1cbiIsIHN0YV9pZCwgYWRkcik7CisJaWwtPm51bV9zdGF0aW9ucysrOworCisJLyogU2V0IHVwIHRoZSBDX0FERF9TVEEgY29tbWFuZCB0byBzZW5kIHRvIGRldmljZSAqLworCW1lbXNldCgmc3RhdGlvbi0+c3RhLCAwLCBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwltZW1jcHkoc3RhdGlvbi0+c3RhLnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJc3RhdGlvbi0+c3RhLm1vZGUgPSAwOworCXN0YXRpb24tPnN0YS5zdGEuc3RhX2lkID0gc3RhX2lkOworCXN0YXRpb24tPnN0YS5zdGF0aW9uX2ZsYWdzID0gY3R4LT5zdGF0aW9uX2ZsYWdzOworCXN0YXRpb24tPmN0eGlkID0gY3R4LT5jdHhpZDsKKworCWlmIChzdGEpIHsKKwkJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gKnN0YV9wcml2OworCisJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCQlzdGFfcHJpdi0+Y3R4ID0gY3R4OworCX0KKworCS8qCisJICogT0sgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHksIHNpbmNlIGxvY2FsIHN0YXRpb25zIChJQlNTIEJTU0lECisJICogU1RBIGFuZCBicm9hZGNhc3QgU1RBKSBwYXNzIGluIGEgTlVMTCBzdGEsIGFuZCBtYWM4MDIxMQorCSAqIGRvZXNuJ3QgYWxsb3cgSFQgSUJTUy4KKwkgKi8KKwlpbF9zZXRfaHRfYWRkX3N0YXRpb24oaWwsIHN0YV9pZCwgc3RhLCBjdHgpOworCisJLyogMzk0NSBvbmx5ICovCisJcmF0ZSA9IChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/IFJBVEVfNk1fUExDUCA6IFJBVEVfMU1fUExDUDsKKwkvKiBUdXJuIG9uIGJvdGggYW50ZW5uYXMgZm9yIHRoZSBzdGF0aW9uLi4uICovCisJc3RhdGlvbi0+c3RhLnJhdGVfbl9mbGFncyA9IGNwdV90b19sZTE2KHJhdGUgfCBSQVRFX01DU19BTlRfQUJfTVNLKTsKKworCXJldHVybiBzdGFfaWQ7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlsX3ByZXBfc3RhdGlvbik7CisKKyNkZWZpbmUgU1RBX1dBSVRfVElNRU9VVCAoSFovMikKKworLyoqCisgKiBpbF9hZGRfc3RhdGlvbl9jb21tb24gLQorICovCitpbnQKK2lsX2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCSAgICAgIHU4ICpzdGFfaWRfcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJaW50IHJldCA9IDA7CisJdTggc3RhX2lkOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwkqc3RhX2lkX3IgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCXN0YV9pZCA9IGlsX3ByZXBfc3RhdGlvbihpbCwgY3R4LCBhZGRyLCBpc19hcCwgc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBwcmVwYXJlIHN0YXRpb24gJXBNIGZvciBhZGRpdGlvblxuIiwgYWRkcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogdUNvZGUgaXMgbm90IGFibGUgdG8gZGVhbCB3aXRoIG11bHRpcGxlIHJlcXVlc3RzIHRvIGFkZCBhCisJICogc3RhdGlvbi4gS2VlcCB0cmFjayBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3Mgc28gdGhhdCB3ZSBkbyBub3Qgc2VuZAorCSAqIGFub3RoZXIuCisJICovCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgeworCQlEX0lORk8oIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLCBzdGFfaWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQlEX0FTU09DKCJTVEEgJWQgKCVwTSkgYWxyZWFkeSBhZGRlZCwgbm90IGFkZGluZyBhZ2Fpbi5cbiIsCisJCQlzdGFfaWQsIGFkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKworCS8qIEFkZCBzdGF0aW9uIHRvIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KKwlyZXQgPSBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7CisJaWYgKHJldCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJSUxfRVJSKCJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKKwkJICAgICAgIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwl9CisJKnN0YV9pZF9yID0gc3RhX2lkOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2FkZF9zdGF0aW9uX2NvbW1vbik7CisKKy8qKgorICogaWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIHVjb2RlIHN0YXR1cyBmb3IgYSBzdGF0aW9uCisgKgorICogaWwtPnN0YV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgdm9pZAoraWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBzdGFfaWQpCit7CisJLyogVWNvZGUgbXVzdCBiZSBhY3RpdmUgYW5kIGRyaXZlciBtdXN0IGJlIG5vbiBhY3RpdmUgKi8KKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLgorCSAgICAgdXNlZCAmIChJTF9TVEFfVUNPREVfQUNUSVZFIHwgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKSAhPQorCSAgICBJTF9TVEFfVUNPREVfQUNUSVZFKQorCQlJTF9FUlIoInJlbW92ZWQgbm9uIGFjdGl2ZSBTVEEgJXVcbiIsIHN0YV9pZCk7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfVUNPREVfQUNUSVZFOworCisJbWVtc2V0KCZpbC0+c3RhdGlvbnNbc3RhX2lkXSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9zdGF0aW9uX2VudHJ5KSk7CisJRF9BU1NPQygiUmVtb3ZlZCBTVEEgJXVcbiIsIHN0YV9pZCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsX3NlbmRfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCAqIGFkZHIsIGludCBzdGFfaWQsCisJCSAgICAgICBib29sIHRlbXBvcmFyeSkKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJaW50IHJldDsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKKwlzdHJ1Y3QgaWxfcmVtX3N0YV9jbWQgcm1fc3RhX2NtZDsKKworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfUkVNX1NUQSwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfcmVtX3N0YV9jbWQpLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwkJLmRhdGEgPSAmcm1fc3RhX2NtZCwKKwl9OworCisJbWVtc2V0KCZybV9zdGFfY21kLCAwLCBzaXplb2Yocm1fc3RhX2NtZCkpOworCXJtX3N0YV9jbWQubnVtX3N0YSA9IDE7CisJbWVtY3B5KCZybV9zdGFfY21kLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKworCWNtZC5mbGFncyB8PSBDTURfV0FOVF9TS0I7CisKKwlyZXQgPSBpbF9zZW5kX2NtZChpbCwgJmNtZCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGt0ID0gKHN0cnVjdCBpbF9yeF9wa3QgKiljbWQucmVwbHlfcGFnZTsKKwlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJTF9DTURfRkFJTEVEX01TSykgeworCQlJTF9FUlIoIkJhZCByZXR1cm4gZnJvbSBDX1JFTV9TVEEgKDB4JTA4WClcbiIsIHBrdC0+aGRyLmZsYWdzKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKHBrdC0+dS5yZW1fc3RhLnN0YXR1cykgeworCQljYXNlIFJFTV9TVEFfU1VDQ0VTU19NU0s6CisJCQlpZiAoIXRlbXBvcmFyeSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQkJCWlsX3N0YV91Y29kZV9kZWFjdGl2YXRlKGlsLCBzdGFfaWQpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywKKwkJCQkJCSAgICAgICBmbGFnc19zcGluKTsKKwkJCX0KKwkJCURfQVNTT0MoIkNfUkVNX1NUQSBQQVNTRURcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlPOworCQkJSUxfRVJSKCJDX1JFTV9TVEEgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlsX2ZyZWVfcGFnZXMoaWwsIGNtZC5yZXBseV9wYWdlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWxfcmVtb3ZlX3N0YXRpb24gLSBSZW1vdmUgZHJpdmVyJ3Mga25vd2xlZGdlIG9mIHN0YXRpb24uCisgKi8KK2ludAoraWxfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCBzdGFfaWQsIGNvbnN0IHU4ICogYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9JTkZPKCJVbmFibGUgdG8gcmVtb3ZlIHN0YXRpb24gJXBNLCBkZXZpY2Ugbm90IHJlYWR5LlxuIiwKKwkJICAgICAgIGFkZHIpOworCQkvKgorCQkgKiBJdCBpcyB0eXBpY2FsIGZvciBzdGF0aW9ucyB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlCisJCSAqIGdvaW5nIGRvd24uIFJldHVybiBzdWNjZXNzIHNpbmNlIGRldmljZSB3aWxsIGJlIGRvd24KKwkJICogc29vbiBhbnl3YXkKKwkJICovCisJCXJldHVybiAwOworCX0KKworCURfQVNTT0MoIlJlbW92aW5nIFNUQSBmcm9tIGRyaXZlcjolZCAgJXBNXG4iLCBzdGFfaWQsIGFkZHIpOworCisJaWYgKFdBUk5fT04oc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSkgeworCQlEX0lORk8oIlJlbW92aW5nICVwTSBidXQgbm9uIERSSVZFUiBhY3RpdmVcbiIsIGFkZHIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7CisJCURfSU5GTygiUmVtb3ZpbmcgJXBNIGJ1dCBub24gVUNPREUgYWN0aXZlXG4iLCBhZGRyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0xPQ0FMKSB7CisJCWtmcmVlKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOworCX0KKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOworCisJaWwtPm51bV9zdGF0aW9ucy0tOworCisJQlVHX09OKGlsLT5udW1fc3RhdGlvbnMgPCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfcmVtb3ZlX3N0YXRpb24oaWwsIGFkZHIsIHN0YV9pZCwgZmFsc2UpOworb3V0X2VycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlsX3JlbW92ZV9zdGF0aW9uKTsKKworLyoqCisgKiBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyAtIGNsZWFyIHVjb2RlIHN0YXRpb24gdGFibGUgYml0cworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCB0aGUgYml0cyBpbiB0aGUgZHJpdmVyIGluZGljYXRpbmcKKyAqIHdoaWNoIHN0YXRpb25zIGFyZSBhY3RpdmUgaW4gdGhlIHVjb2RlLiBDYWxsIHdoZW4gc29tZXRoaW5nCisgKiBvdGhlciB0aGFuIGV4cGxpY2l0IHN0YXRpb24gbWFuYWdlbWVudCB3b3VsZCBjYXVzZSB0aGlzIGluCisgKiB0aGUgdWNvZGUsIGUuZy4gdW5hc3NvY2lhdGVkIFJYT04uCisgKi8KK3ZvaWQKK2lsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKKwlib29sIGNsZWFyZWQgPSBmYWxzZTsKKworCURfSU5GTygiQ2xlYXJpbmcgdWNvZGUgc3RhdGlvbnMgaW4gZHJpdmVyXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmIChjdHggJiYgY3R4LT5jdHhpZCAhPSBpbC0+c3RhdGlvbnNbaV0uY3R4aWQpCisJCQljb250aW51ZTsKKworCQlpZiAoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSB7CisJCQlEX0lORk8oIkNsZWFyaW5nIHVjb2RlIGFjdGl2ZSBmb3Igc3RhdGlvbiAlZFxuIiwgaSk7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJCWNsZWFyZWQgPSB0cnVlOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisKKwlpZiAoIWNsZWFyZWQpCisJCURfSU5GTygiTm8gYWN0aXZlIHN0YXRpb25zIGZvdW5kIHRvIGJlIGNsZWFyZWRcbiIpOworfQorRVhQT1JUX1NZTUJPTChpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyk7CisKKy8qKgorICogaWxfcmVzdG9yZV9zdGF0aW9ucygpIC0gUmVzdG9yZSBkcml2ZXIga25vd24gc3RhdGlvbnMgdG8gZGV2aWNlCisgKgorICogQWxsIHN0YXRpb25zIGNvbnNpZGVyZWQgYWN0aXZlIGJ5IGRyaXZlciwgYnV0IG5vdCBwcmVzZW50IGluIHVjb2RlLCBpcworICogcmVzdG9yZWQuCisgKgorICogRnVuY3Rpb24gc2xlZXBzLgorICovCit2b2lkCitpbF9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCWludCBpOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlpbnQgcmV0OworCWJvb2wgc2VuZF9scTsKKworCWlmICghaWxfaXNfcmVhZHkoaWwpKSB7CisJCURfSU5GTygiTm90IHJlYWR5IHlldCwgbm90IHJlc3RvcmluZyBhbnkgc3RhdGlvbnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCURfQVNTT0MoIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMgLi4uIHN0YXJ0LlxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQorCQkJY29udGludWU7CisJCWlmICgoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkJICAgICEoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQkJRF9BU1NPQygiUmVzdG9yaW5nIHN0YSAlcE1cbiIsCisJCQkJaWwtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkcik7CisJCQlpbC0+c3RhdGlvbnNbaV0uc3RhLm1vZGUgPSAwOworCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgfD0gSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCQlmb3VuZCA9IHRydWU7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpKSB7CisJCQltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbaV0uc3RhLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCQkJc2VuZF9scSA9IGZhbHNlOworCQkJaWYgKGlsLT5zdGF0aW9uc1tpXS5scSkgeworCQkJCW1lbWNweSgmbHEsIGlsLT5zdGF0aW9uc1tpXS5scSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSk7CisJCQkJc2VuZF9scSA9IHRydWU7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQkJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCQkJaWYgKHJldCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQkJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCisJCQkJICAgICAgIGlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOworCQkJCWlsLT5zdGF0aW9uc1tpXS51c2VkICY9IH5JTF9TVEFfRFJJVkVSX0FDVElWRTsKKwkJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPQorCQkJCSAgICB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLAorCQkJCQkJICAgICAgIGZsYWdzX3NwaW4pOworCQkJfQorCQkJLyoKKwkJCSAqIFJhdGUgc2NhbGluZyBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCBzZW5kCisJCQkgKiBjdXJyZW50IExRIGNvbW1hbmQKKwkJCSAqLworCQkJaWYgKHNlbmRfbHEpCisJCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxLCBDTURfU1lOQywgdHJ1ZSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCWlsLT5zdGF0aW9uc1tpXS51c2VkICY9IH5JTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJaWYgKCFmb3VuZCkKKwkJRF9JTkZPKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIgorCQkgICAgICAgIiAuLi4uIG5vIHN0YXRpb25zIHRvIGJlIHJlc3RvcmVkLlxuIik7CisJZWxzZQorCQlEX0lORk8oIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMiICIgLi4uLiBjb21wbGV0ZS5cbiIpOworfQorRVhQT1JUX1NZTUJPTChpbF9yZXN0b3JlX3N0YXRpb25zKTsKKworaW50CitpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbC0+c3RhX2tleV9tYXhfbnVtOyBpKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmaWwtPnVjb2RlX2tleV90YWJsZSkpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiBXRVBfSU5WQUxJRF9PRkZTRVQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgpOworCit2b2lkCitpbF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmICghKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX0JDQVNUKSkKKwkJCWNvbnRpbnVlOworCisJCWlsLT5zdGF0aW9uc1tpXS51c2VkICY9IH5JTF9TVEFfVUNPREVfQUNUSVZFOworCQlpbC0+bnVtX3N0YXRpb25zLS07CisJCUJVR19PTihpbC0+bnVtX3N0YXRpb25zIDwgMCk7CisJCWtmcmVlKGlsLT5zdGF0aW9uc1tpXS5scSk7CisJCWlsLT5zdGF0aW9uc1tpXS5scSA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3N0YXRpYyB2b2lkCitpbF9kdW1wX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSkKK3sKKwlpbnQgaTsKKwlEX1JBVEUoImxxIHN0YXRpb24gaWQgMHgleFxuIiwgbHEtPnN0YV9pZCk7CisJRF9SQVRFKCJscSBhbnQgMHglWCAweCVYXG4iLCBscS0+Z2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrLAorCSAgICAgICBscS0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU07IGkrKykKKwkJRF9SQVRFKCJscSBpZHggJWQgMHglWFxuIiwgaSwgbHEtPnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitpbF9kdW1wX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSkKK3sKK30KKyNlbmRpZgorCisvKioKKyAqIGlsX2lzX2xxX3RhYmxlX3ZhbGlkKCkgLSBUZXN0IG9uZSBhc3BlY3Qgb2YgTFEgY21kIGZvciB2YWxpZGl0eQorICoKKyAqIEl0IHNvbWV0aW1lcyBoYXBwZW5zIHdoZW4gYSBIVCByYXRlIGhhcyBiZWVuIGluIHVzZSBhbmQgd2UKKyAqIGxvb3NlIGNvbm5lY3Rpdml0eSB3aXRoIEFQIHRoZW4gbWFjODAyMTEgd2lsbCBmaXJzdCB0ZWxsIHVzIHRoYXQgdGhlCisgKiBjdXJyZW50IGNoYW5uZWwgaXMgbm90IEhUIGFueW1vcmUgYmVmb3JlIHJlbW92aW5nIHRoZSBzdGF0aW9uLiBJbiBzdWNoIGEKKyAqIHNjZW5hcmlvIHRoZSBSWE9OIGZsYWdzIHdpbGwgYmUgdXBkYXRlZCB0byBpbmRpY2F0ZSB3ZSBhcmUgbm90CisgKiBjb21tdW5pY2F0aW5nIEhUIGFueW1vcmUsIGJ1dCB0aGUgTFEgY29tbWFuZCBtYXkgc3RpbGwgY29udGFpbiBIVCByYXRlcy4KKyAqIFRlc3QgZm9yIHRoaXMgdG8gcHJldmVudCBkcml2ZXIgZnJvbSBzZW5kaW5nIExRIGNvbW1hbmQgYmV0d2VlbiB0aGUgdGltZQorICogUlhPTiBmbGFncyBhcmUgdXBkYXRlZCBhbmQgd2hlbiBMUSBjb21tYW5kIGlzIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyBib29sCitpbF9pc19scV90YWJsZV92YWxpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCit7CisJaW50IGk7CisKKwlpZiAoY3R4LT5odC5lbmFibGVkKQorCQlyZXR1cm4gdHJ1ZTsKKworCURfSU5GTygiQ2hhbm5lbCAldSBpcyBub3QgYW4gSFQgY2hhbm5lbFxuIiwgY3R4LT5hY3RpdmUuY2hhbm5lbCk7CisJZm9yIChpID0gMDsgaSA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNOyBpKyspIHsKKwkJaWYgKGxlMzJfdG9fY3B1KGxxLT5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpICYgUkFURV9NQ1NfSFRfTVNLKSB7CisJCQlEX0lORk8oImlkeCAlZCBvZiBMUSBleHBlY3RzIEhUIGNoYW5uZWxcbiIsIGkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGlsX3NlbmRfbHFfY21kKCkgLSBTZW5kIGxpbmsgcXVhbGl0eSBjb21tYW5kCisgKiBAaW5pdDogVGhpcyBjb21tYW5kIGlzIHNlbnQgYXMgcGFydCBvZiBzdGF0aW9uIGluaXRpYWxpemF0aW9uIHJpZ2h0CisgKiAgICAgICAgYWZ0ZXIgc3RhdGlvbiBoYXMgYmVlbiBhZGRlZC4KKyAqCisgKiBUaGUgbGluayBxdWFsaXR5IGNvbW1hbmQgaXMgc2VudCBhcyB0aGUgbGFzdCBzdGVwIG9mIHN0YXRpb24gY3JlYXRpb24uCisgKiBUaGlzIGlzIHRoZSBzcGVjaWFsIGNhc2UgaW4gd2hpY2ggaW5pdCBpcyBzZXQgYW5kIHdlIGNhbGwgYSBjYWxsYmFjayBpbgorICogdGhpcyBjYXNlIHRvIGNsZWFyIHRoZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgc3RhdGlvbiBjcmVhdGlvbiBpcyBpbgorICogcHJvZ3Jlc3MuCisgKi8KK2ludAoraWxfc2VuZF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJICAgICAgIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSwgdTggZmxhZ3MsIGJvb2wgaW5pdCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1RYX0xJTktfUVVBTElUWV9DTUQsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQpLAorCQkuZmxhZ3MgPSBmbGFncywKKwkJLmRhdGEgPSBscSwKKwl9OworCisJaWYgKFdBUk5fT04obHEtPnN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWlmICghKGlsLT5zdGF0aW9uc1tscS0+c3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCisJaWxfZHVtcF9scV9jbWQoaWwsIGxxKTsKKwlCVUdfT04oaW5pdCAmJiAoY21kLmZsYWdzICYgQ01EX0FTWU5DKSk7CisKKwlpZiAoaWxfaXNfbHFfdGFibGVfdmFsaWQoaWwsIGN0eCwgbHEpKQorCQlyZXQgPSBpbF9zZW5kX2NtZChpbCwgJmNtZCk7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJaWYgKGNtZC5mbGFncyAmIENNRF9BU1lOQykKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbml0KSB7CisJCURfSU5GTygiaW5pdCBMUSBjb21tYW5kIGNvbXBsZXRlLCIKKwkJICAgICAgICIgY2xlYXJpbmcgc3RhIGFkZGl0aW9uIHN0YXR1cyBmb3Igc3RhICVkXG4iLAorCQkgICAgICAgbHEtPnN0YV9pZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlpbC0+c3RhdGlvbnNbbHEtPnN0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfbHFfY21kKTsKKworaW50CitpbF9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uICpzdGFfY29tbW9uID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWludCByZXQ7CisKKwlEX0lORk8oInJlY2VpdmVkIHJlcXVlc3QgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJRF9JTkZPKCJwcm9jZWVkaW5nIHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwlyZXQgPSBpbF9yZW1vdmVfc3RhdGlvbihpbCwgc3RhX2NvbW1vbi0+c3RhX2lkLCBzdGEtPmFkZHIpOworCWlmIChyZXQpCisJCUlMX0VSUigiRXJyb3IgcmVtb3Zpbmcgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19zdGFfcmVtb3ZlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJYLUZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KKyAqCisgKiBEcml2ZXIgYWxsb2NhdGVzIGEgY2lyY3VsYXIgYnVmZmVyIG9mIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSwKKyAqIGVhY2ggb2Ygd2hpY2ggcG9pbnQgdG8gUmVjZWl2ZSBCdWZmZXJzIHRvIGJlIGZpbGxlZCBieSB0aGUgTklDLiAgVGhlc2UgZ2V0CisgKiB1c2VkIG5vdCBvbmx5IGZvciBSeCBmcmFtZXMsIGJ1dCBmb3IgYW55IGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCisgKiBmcm9tIHRoZSBOSUMuICBUaGUgZHJpdmVyIGFuZCBOSUMgbWFuYWdlIHRoZSBSeCBidWZmZXJzIGJ5IG1lYW5zCisgKiBvZiBpZHhlcyBpbnRvIHRoZSBjaXJjdWxhciBidWZmZXIuCisgKgorICogUnggUXVldWUgSW5kZXhlcworICogVGhlIGhvc3QvZmlybXdhcmUgc2hhcmUgdHdvIGlkeCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgorICoKKyAqIFRoZSBSRUFEIGlkeCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZworICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAorICogZ29vZCBkYXRhLgorICogVGhlIFJFQUQgaWR4IGlzIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlIG9uY2UgdGhlIGNhcmQgaXMgZW5hYmxlZC4KKyAqCisgKiBUaGUgV1JJVEUgaWR4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQorICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KKyAqCisgKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKKyAqIFdSSVRFID0gUkVBRC4KKyAqCisgKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0CisgKiBJRFggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKKyAqCisgKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpZHgKKyAqIGFuZCBmaXJlIHRoZSBSWCBpbnRlcnJ1cHQuICBUaGUgZHJpdmVyIGNhbiB0aGVuIHF1ZXJ5IHRoZSBSRUFEIGlkeCBhbmQKKyAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGlkeCBmb3J3YXJkIGFzIGl0CisgKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgorICoKKyAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKKyAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCisgKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCisgKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCisgKiArIEluIGlsX3J4X3JlcGxlbmlzaCAoc2NoZWR1bGVkKSBpZiAncHJvY2Vzc2VkJyAhPSAncmVhZCcgdGhlbiB0aGUKKyAqICAgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYW5kIHRoZSBSRUFEIElEWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKKyAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaWR4ZXMgYXMgd2VsbCkKKyAqICsgQSByZWNlaXZlZCBwYWNrZXQgaXMgcHJvY2Vzc2VkIGFuZCBoYW5kZWQgdG8gdGhlIGtlcm5lbCBuZXR3b3JrIHN0YWNrLAorICogICBkZXRhY2hlZCBmcm9tIHRoZSBpd2wtPnJ4cS4gIFRoZSBkcml2ZXIgJ3Byb2Nlc3NlZCcgaWR4IGlzIHVwZGF0ZWQuCisgKiArIFRoZSBIb3N0L0Zpcm13YXJlIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGF0IHRhc2tsZXQgdGltZSBmcm9tIHRoZSByeF9mcmVlCisgKiAgIGxpc3QuIElmIHRoZXJlIGFyZSBubyBhbGxvY2F0ZWQgYnVmZmVycyBpbiBpd2wtPnJ4cS0+cnhfZnJlZSwgdGhlIFJFQUQKKyAqICAgSURYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXdsLT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKKyAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgorICoKKyAqCisgKiBEcml2ZXIgc2VxdWVuY2U6CisgKgorICogaWxfcnhfcXVldWVfYWxsb2MoKSAgIEFsbG9jYXRlcyByeF9mcmVlCisgKiBpbF9yeF9yZXBsZW5pc2goKSAgICAgUmVwbGVuaXNoZXMgcnhfZnJlZSBsaXN0IGZyb20gcnhfdXNlZCwgYW5kIGNhbGxzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbF9yeF9xdWV1ZV9yZXN0b2NrCisgKiBpbF9yeF9xdWV1ZV9yZXN0b2NrKCkgTW92ZXMgYXZhaWxhYmxlIGJ1ZmZlcnMgZnJvbSByeF9mcmVlIGludG8gUngKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB1cGRhdGVzIGZpcm13YXJlIHBvaW50ZXJzLCBhbmQgdXBkYXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFdSSVRFIGlkeC4gIElmIGluc3VmZmljaWVudCByeF9mcmVlIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIHNjaGVkdWxlcyBpbF9yeF9yZXBsZW5pc2gKKyAqCisgKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQorICogSVNSIC0gaWxfcngoKSAgICAgICAgIERldGFjaCBpbF9yeF9idWZzIGZyb20gcG9vbCB1cCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQgSURYLCBkZXRhY2hpbmcgdGhlIFNLQiBmcm9tIHRoZSBwb29sLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZXMgdGhlIHBhY2tldCBidWZmZXIgZnJvbSBxdWV1ZSB0byByeF91c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbHMgaWxfcnhfcXVldWVfcmVzdG9jayB0byByZWZpbGwgYW55IGVtcHR5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90cy4KKyAqIC4uLgorICoKKyAqLworCisvKioKKyAqIGlsX3J4X3F1ZXVlX3NwYWNlIC0gUmV0dXJuIG51bWJlciBvZiBmcmVlIHNsb3RzIGF2YWlsYWJsZSBpbiBxdWV1ZS4KKyAqLworaW50CitpbF9yeF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnEpCit7CisJaW50IHMgPSBxLT5yZWFkIC0gcS0+d3JpdGU7CisJaWYgKHMgPD0gMCkKKwkJcyArPSBSWF9RVUVVRV9TSVpFOworCS8qIGtlZXAgc29tZSBidWZmZXIgdG8gbm90IGNvbmZ1c2UgZnVsbCBhbmQgZW1wdHkgcXVldWUgKi8KKwlzIC09IDI7CisJaWYgKHMgPCAwKQorCQlzID0gMDsKKwlyZXR1cm4gczsKK30KK0VYUE9SVF9TWU1CT0woaWxfcnhfcXVldWVfc3BhY2UpOworCisvKioKKyAqIGlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIgLSBVcGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgZm9yIHRoZSBSWCBxdWV1ZQorICovCit2b2lkCitpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJ4X3dydF9wdHJfcmVnID0gaWwtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZzsKKwl1MzIgcmVnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKKworCWlmIChxLT5uZWVkX3VwZGF0ZSA9PSAwKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJLyogSWYgcG93ZXItc2F2aW5nIGlzIGluIHVzZSwgbWFrZSBzdXJlIGRldmljZSBpcyBhd2FrZSAqLworCWlmICh0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpKSB7CisJCXJlZyA9IF9pbF9yZChpbCwgQ1NSX1VDT0RFX0RSVl9HUDEpOworCisJCWlmIChyZWcgJiBDU1JfVUNPREVfRFJWX0dQMV9CSVRfTUFDX1NMRUVQKSB7CisJCQlEX0lORk8oIlJ4IHF1ZXVlIHJlcXVlc3Rpbmcgd2FrZXVwLCIgIiBHUDEgPSAweCV4XG4iLAorCQkJICAgICAgIHJlZyk7CisJCQlpbF9zZXRfYml0KGlsLCBDU1JfR1BfQ05UUkwsCisJCQkJICAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKKwkJCWdvdG8gZXhpdF91bmxvY2s7CisJCX0KKworCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKKwkJaWxfd3IoaWwsIHJ4X3dydF9wdHJfcmVnLCBxLT53cml0ZV9hY3R1YWwpOworCisJCS8qIEVsc2UgZGV2aWNlIGlzIGFzc3VtZWQgdG8gYmUgYXdha2UgKi8KKwl9IGVsc2UgeworCQkvKiBEZXZpY2UgZXhwZWN0cyBhIG11bHRpcGxlIG9mIDggKi8KKwkJcS0+d3JpdGVfYWN0dWFsID0gKHEtPndyaXRlICYgfjB4Nyk7CisJCWlsX3dyKGlsLCByeF93cnRfcHRyX3JlZywgcS0+d3JpdGVfYWN0dWFsKTsKKwl9CisKKwlxLT5uZWVkX3VwZGF0ZSA9IDA7CisKK2V4aXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cik7CisKK2ludAoraWxfcnhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlsLT5wY2lfZGV2LT5kZXY7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmcnhxLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKKworCS8qIEFsbG9jIHRoZSBjaXJjdWxhciBidWZmZXIgb2YgUmVhZCBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpICovCisJcnhxLT5iZCA9CisJICAgIGRtYV9hbGxvY19jb2hlcmVudChkZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCAmcnhxLT5iZF9kbWEsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHEtPmJkKQorCQlnb3RvIGVycl9iZDsKKworCXJ4cS0+cmJfc3R0cyA9CisJICAgIGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemVvZihzdHJ1Y3QgaWxfcmJfc3RhdHVzKSwKKwkJCSAgICAgICAmcnhxLT5yYl9zdHRzX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHEtPnJiX3N0dHMpCisJCWdvdG8gZXJyX3JiOworCisJLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmcnhxLT5wb29sW2ldLmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCisJLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCisJICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCisJcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7CisJcnhxLT53cml0ZV9hY3R1YWwgPSAwOworCXJ4cS0+ZnJlZV9jb3VudCA9IDA7CisJcnhxLT5uZWVkX3VwZGF0ZSA9IDA7CisJcmV0dXJuIDA7CisKK2Vycl9yYjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCisJCQkgIHJ4cS0+YmRfZG1hKTsKK2Vycl9iZDoKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcnhfcXVldWVfYWxsb2MpOworCit2b2lkCitpbF9oZGxfc3BlY3RydW1fbWVhc3VyZW1lbnQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc3BlY3RydW1fbm90aWZpY2F0aW9uICpyZXBvcnQgPSAmKHBrdC0+dS5zcGVjdHJ1bV9ub3RpZik7CisKKwlpZiAoIXJlcG9ydC0+c3RhdGUpIHsKKwkJRF8xMUgoIlNwZWN0cnVtIE1lYXN1cmUgTm90aWZpY2F0aW9uOiBTdGFydFxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoJmlsLT5tZWFzdXJlX3JlcG9ydCwgcmVwb3J0LCBzaXplb2YoKnJlcG9ydCkpOworCWlsLT5tZWFzdXJlbWVudF9zdGF0dXMgfD0gTUVBU1VSRU1FTlRfUkVBRFk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudCk7CisKKy8qCisgKiByZXR1cm5zIG5vbi16ZXJvIGlmIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZAorICovCitpbnQKK2lsX3NldF9kZWNyeXB0ZWRfZmxhZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCSAgICAgIHUzMiBkZWNyeXB0X3Jlcywgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQoreworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisKKwkvKgorCSAqIEFsbCBjb250ZXh0cyBoYXZlIHRoZSBzYW1lIHNldHRpbmcgaGVyZSBkdWUgdG8gaXQgYmVpbmcKKwkgKiBhIG1vZHVsZSBwYXJhbWV0ZXIsIHNvIE9LIHRvIGNoZWNrIGFueSBjb250ZXh0LgorCSAqLworCWlmIChpbC0+Y3R4LmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0spCisJCXJldHVybiAwOworCisJaWYgKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKQorCQlyZXR1cm4gMDsKKworCURfUlgoImRlY3J5cHRfcmVzOjB4JXhcbiIsIGRlY3J5cHRfcmVzKTsKKwlzd2l0Y2ggKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spIHsKKwljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfVEtJUDoKKwkJLyogVGhlIHVDb2RlIGhhcyBnb3QgYSBiYWQgcGhhc2UgMSBLZXksIHB1c2hlcyB0aGUgcGFja2V0LgorCQkgKiBEZWNyeXB0aW9uIHdpbGwgYmUgZG9uZSBpbiBTVy4gKi8KKwkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KKwkJICAgIFJYX1JFU19TVEFUVVNfQkFEX0tFWV9UVEFLKQorCQkJYnJlYWs7CisKKwljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfV0VQOgorCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQorCQkgICAgUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQykgeworCQkJLyogYmFkIElDViwgdGhlIHBhY2tldCBpcyBkZXN0cm95ZWQgc2luY2UgdGhlCisJCQkgKiBkZWNyeXB0aW9uIGlzIGlucGxhY2UsIGRyb3AgaXQgKi8KKwkJCURfUlgoIlBhY2tldCBkZXN0cm95ZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0NDTVA6CisJCWlmICgoZGVjcnlwdF9yZXMgJiBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0spID09CisJCSAgICBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfT0spIHsKKwkJCURfUlgoImh3IGRlY3J5cHQgc3VjY2Vzc2Z1bGx5ISEhXG4iKTsKKwkJCXN0YXRzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXRfZGVjcnlwdGVkX2ZsYWcpOworCisvKioKKyAqIGlsX3R4cV91cGRhdGVfd3JpdGVfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaWR4IHRvIGhhcmR3YXJlCisgKi8KK3ZvaWQKK2lsX3R4cV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJdTMyIHJlZyA9IDA7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCisJCXJldHVybjsKKworCS8qIGlmIHdlJ3JlIHRyeWluZyB0byBzYXZlIHBvd2VyICovCisJaWYgKHRlc3RfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cykpIHsKKwkJLyogd2FrZSB1cCBuaWMgaWYgaXQncyBwb3dlcmVkIGRvd24gLi4uCisJCSAqIHVDb2RlIHdpbGwgd2FrZSB1cCwgYW5kIGludGVycnVwdCB1cyBhZ2Fpbiwgc28gbmV4dAorCQkgKiB0aW1lIHdlJ2xsIHNraXAgdGhpcyBwYXJ0LiAqLworCQlyZWcgPSBfaWxfcmQoaWwsIENTUl9VQ09ERV9EUlZfR1AxKTsKKworCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgeworCQkJRF9JTkZPKCJUeCBxdWV1ZSAlZCByZXF1ZXN0aW5nIHdha2V1cCwiICIgR1AxID0gMHgleFxuIiwKKwkJCSAgICAgICB0eHFfaWQsIHJlZyk7CisJCQlpbF9zZXRfYml0KGlsLCBDU1JfR1BfQ05UUkwsCisJCQkJICAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlsX3dyKGlsLCBIQlVTX1RBUkdfV1JQVFIsIHR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKKworCQkvKgorCQkgKiBlbHNlIG5vdCBpbiBwb3dlci1zYXZlIG1vZGUsCisJCSAqIHVDb2RlIHdpbGwgbmV2ZXIgc2xlZXAgd2hlbiB3ZSdyZQorCQkgKiB0cnlpbmcgdG8gdHggKGR1cmluZyBSRktJTEwsIHdlJ3JlIG5vdCB0cnlpbmcgdG8gdHgpLgorCQkgKi8KKwl9IGVsc2UKKwkJX2lsX3dyKGlsLCBIQlVTX1RBUkdfV1JQVFIsIHR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKKwl0eHEtPm5lZWRfdXBkYXRlID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIpOworCisvKioKKyAqIGlsX3R4X3F1ZXVlX3VubWFwIC0gIFVubWFwIGFueSByZW1haW5pbmcgRE1BIG1hcHBpbmdzIGFuZCBmcmVlIHNrYidzCisgKi8KK3ZvaWQKK2lsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKworCWlmIChxLT5uX2JkID09IDApCisJCXJldHVybjsKKworCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChpbCwgdHhxKTsKKwkJcS0+cmVhZF9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF90eF9xdWV1ZV91bm1hcCk7CisKKy8qKgorICogaWxfdHhfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgorICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KKyAqCisgKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KKyAqIEZyZWUgYWxsIGJ1ZmZlcnMuCisgKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqLwordm9pZAoraWxfdHhfcXVldWVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbC0+cGNpX2Rldi0+ZGV2OworCWludCBpOworCisJaWxfdHhfcXVldWVfdW5tYXAoaWwsIHR4cV9pZCk7CisKKwkvKiBEZS1hbGxvYyBhcnJheSBvZiBjb21tYW5kL3R4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVEZEX1RYX0NNRF9TTE9UUzsgaSsrKQorCQlrZnJlZSh0eHEtPmNtZFtpXSk7CisKKwkvKiBEZS1hbGxvYyBjaXJjdWxhciBidWZmZXIgb2YgVEZEcyAqLworCWlmICh0eHEtPnEubl9iZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBpbC0+aHdfcGFyYW1zLnRmZF9zaXplICogdHhxLT5xLm5fYmQsCisJCQkJICB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7CisKKwkvKiBEZS1hbGxvYyBhcnJheSBvZiBwZXItVEZEIGRyaXZlciBkYXRhICovCisJa2ZyZWUodHhxLT50eGIpOworCXR4cS0+dHhiID0gTlVMTDsKKworCS8qIGRlYWxsb2NhdGUgYXJyYXlzICovCisJa2ZyZWUodHhxLT5jbWQpOworCWtmcmVlKHR4cS0+bWV0YSk7CisJdHhxLT5jbWQgPSBOVUxMOworCXR4cS0+bWV0YSA9IE5VTEw7CisKKwkvKiAwLWZpbGwgcXVldWUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQodHhxLCAwLCBzaXplb2YoKnR4cSkpOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9xdWV1ZV9mcmVlKTsKKworLyoqCisgKiBpbF9jbWRfcXVldWVfdW5tYXAgLSBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBmcm9tIGNvbW1hbmQgcXVldWUKKyAqLwordm9pZAoraWxfY21kX3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW2lsLT5jbWRfcXVldWVdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJaW50IGk7CisKKwlpZiAocS0+bl9iZCA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAocS0+cmVhZF9wdHIgIT0gcS0+d3JpdGVfcHRyKSB7CisJCWkgPSBpbF9nZXRfY21kX2lkeChxLCBxLT5yZWFkX3B0ciwgMCk7CisKKwkJaWYgKHR4cS0+bWV0YVtpXS5mbGFncyAmIENNRF9NQVBQRUQpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaWwtPnBjaV9kZXYsCisJCQkJCSBkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKKwkJCQkJIGRtYV91bm1hcF9sZW4oJnR4cS0+bWV0YVtpXSwgbGVuKSwKKwkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQl0eHEtPm1ldGFbaV0uZmxhZ3MgPSAwOworCQl9CisKKwkJcS0+cmVhZF9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7CisJfQorCisJaSA9IHEtPm5fd2luOworCWlmICh0eHEtPm1ldGFbaV0uZmxhZ3MgJiBDTURfTUFQUEVEKSB7CisJCXBjaV91bm1hcF9zaW5nbGUoaWwtPnBjaV9kZXYsCisJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAorCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCisJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF9jbWRfcXVldWVfdW5tYXApOworCisvKioKKyAqIGlsX2NtZF9xdWV1ZV9mcmVlIC0gRGVhbGxvY2F0ZSBETUEgcXVldWUuCisgKiBAdHhxOiBUcmFuc21pdCBxdWV1ZSB0byBkZWFsbG9jYXRlLgorICoKKyAqIEVtcHR5IHF1ZXVlIGJ5IHJlbW92aW5nIGFuZCBkZXN0cm95aW5nIGFsbCBCRCdzLgorICogRnJlZSBhbGwgYnVmZmVycy4KKyAqIDAtZmlsbCwgYnV0IGRvIG5vdCBmcmVlICJ0eHEiIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICovCit2b2lkCitpbF9jbWRfcXVldWVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWwtPnBjaV9kZXYtPmRldjsKKwlpbnQgaTsKKworCWlsX2NtZF9xdWV1ZV91bm1hcChpbCk7CisKKwkvKiBEZS1hbGxvYyBhcnJheSBvZiBjb21tYW5kL3R4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFRGRF9DTURfU0xPVFM7IGkrKykKKwkJa2ZyZWUodHhxLT5jbWRbaV0pOworCisJLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KKwlpZiAodHhxLT5xLm5fYmQpCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgaWwtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOworCisJLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KKwlrZnJlZSh0eHEtPmNtZCk7CisJa2ZyZWUodHhxLT5tZXRhKTsKKwl0eHEtPmNtZCA9IE5VTEw7CisJdHhxLT5tZXRhID0gTlVMTDsKKworCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLworCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2NtZF9xdWV1ZV9mcmVlKTsKKworLyoqKioqKioqKioqKioqKiBETUEtUVVFVUUtR0VORVJBTC1GVU5DVElPTlMgICoqKioqCisgKiBETUEgc2VydmljZXMKKyAqCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICogQSBUeCBvciBSeCBxdWV1ZSByZXNpZGVzIGluIGhvc3QgRFJBTSwgYW5kIGlzIGNvbXByaXNlZCBvZiBhIGNpcmN1bGFyIGJ1ZmZlcgorICogb2YgYnVmZmVyIGRlc2NyaXB0b3JzLCBlYWNoIG9mIHdoaWNoIHBvaW50cyB0byBvbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgZm9yCisgKiB0aGUgZGV2aWNlIHRvIHJlYWQgZnJvbSBvciBmaWxsLiAgRHJpdmVyIGFuZCBkZXZpY2UgZXhjaGFuZ2Ugc3RhdHVzIG9mIGVhY2gKKyAqIHF1ZXVlIHZpYSAicmVhZCIgYW5kICJ3cml0ZSIgcG9pbnRlcnMuICBEcml2ZXIga2VlcHMgbWluaW11bSBvZiAyIGVtcHR5CisgKiBlbnRyaWVzIGluIGVhY2ggY2lyY3VsYXIgYnVmZmVyLCB0byBwcm90ZWN0IGFnYWluc3QgY29uZnVzaW5nIGVtcHR5IGFuZCBmdWxsCisgKiBxdWV1ZSBzdGF0ZXMuCisgKgorICogVGhlIGRldmljZSByZWFkcyBvciB3cml0ZXMgdGhlIGRhdGEgaW4gdGhlIHF1ZXVlcyB2aWEgdGhlIGRldmljZSdzIHNldmVyYWwKKyAqIERNQS9GSUZPIGNoYW5uZWxzLiAgRWFjaCBxdWV1ZSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgRE1BIGNoYW5uZWwuCisgKgorICogRm9yIFR4IHF1ZXVlLCB0aGVyZSBhcmUgbG93IG1hcmsgYW5kIGhpZ2ggbWFyayBsaW1pdHMuIElmLCBhZnRlciBxdWV1aW5nCisgKiB0aGUgcGFja2V0IGZvciBUeCwgZnJlZSBzcGFjZSBiZWNvbWUgPCBsb3cgbWFyaywgVHggcXVldWUgc3RvcHBlZC4gV2hlbgorICogcmVjbGFpbWluZyBwYWNrZXRzIChvbiAndHggZG9uZSBJUlEpLCBpZiBmcmVlIHNwYWNlIGJlY29tZSA+IGhpZ2ggbWFyaywKKyAqIFR4IHF1ZXVlIHJlc3VtZWQuCisgKgorICogU2VlIG1vcmUgZGV0YWlsZWQgaW5mbyBpbiA0OTY1LmguCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK2lsX3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpbF9xdWV1ZSAqcSkKK3sKKwlpbnQgcyA9IHEtPnJlYWRfcHRyIC0gcS0+d3JpdGVfcHRyOworCisJaWYgKHEtPnJlYWRfcHRyID4gcS0+d3JpdGVfcHRyKQorCQlzIC09IHEtPm5fYmQ7CisKKwlpZiAocyA8PSAwKQorCQlzICs9IHEtPm5fd2luOworCS8qIGtlZXAgc29tZSByZXNlcnZlIHRvIG5vdCBjb25mdXNlIGVtcHR5IGFuZCBmdWxsIHNpdHVhdGlvbnMgKi8KKwlzIC09IDI7CisJaWYgKHMgPCAwKQorCQlzID0gMDsKKwlyZXR1cm4gczsKK30KK0VYUE9SVF9TWU1CT0woaWxfcXVldWVfc3BhY2UpOworCisKKy8qKgorICogaWxfcXVldWVfaW5pdCAtIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBhbmQgcmVhZC93cml0ZSBpZHhlcworICovCitzdGF0aWMgaW50CitpbF9xdWV1ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3F1ZXVlICpxLCBpbnQgY291bnQsIGludCBzbG90c19udW0sCisJICAgICAgdTMyIGlkKQoreworCXEtPm5fYmQgPSBjb3VudDsKKwlxLT5uX3dpbiA9IHNsb3RzX251bTsKKwlxLT5pZCA9IGlkOworCisJLyogY291bnQgbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlIGlsX3F1ZXVlX2luY193cmFwCisJICogYW5kIGlsX3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCisJQlVHX09OKCFpc19wb3dlcl9vZl8yKGNvdW50KSk7CisKKwkvKiBzbG90c19udW0gbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCisJICogaWxfZ2V0X2NtZF9pZHggaXMgYnJva2VuLiAqLworCUJVR19PTighaXNfcG93ZXJfb2ZfMihzbG90c19udW0pKTsKKworCXEtPmxvd19tYXJrID0gcS0+bl93aW4gLyA0OworCWlmIChxLT5sb3dfbWFyayA8IDQpCisJCXEtPmxvd19tYXJrID0gNDsKKworCXEtPmhpZ2hfbWFyayA9IHEtPm5fd2luIC8gODsKKwlpZiAocS0+aGlnaF9tYXJrIDwgMikKKwkJcS0+aGlnaF9tYXJrID0gMjsKKworCXEtPndyaXRlX3B0ciA9IHEtPnJlYWRfcHRyID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsX3R4X3F1ZXVlX2FsbG9jIC0gQWxsb2MgZHJpdmVyIGRhdGEgYW5kIFRGRCBDQiBmb3Igb25lIFR4L2NtZCBxdWV1ZQorICovCitzdGF0aWMgaW50CitpbF90eF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCB1MzIgaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlsLT5wY2lfZGV2LT5kZXY7CisJc2l6ZV90IHRmZF9zeiA9IGlsLT5od19wYXJhbXMudGZkX3NpemUgKiBURkRfUVVFVUVfU0laRV9NQVg7CisKKwkvKiBEcml2ZXIgaWxhdGUgZGF0YSwgb25seSBmb3IgVHggKG5vdCBjb21tYW5kKSBxdWV1ZXMsCisJICogbm90IHNoYXJlZCB3aXRoIGRldmljZS4gKi8KKwlpZiAoaWQgIT0gaWwtPmNtZF9xdWV1ZSkgeworCQl0eHEtPnR4YiA9IGtjYWxsb2MoVEZEX1FVRVVFX1NJWkVfTUFYLCBzaXplb2YodHhxLT50eGJbMF0pLAorCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZiAoIXR4cS0+dHhiKSB7CisJCQlJTF9FUlIoImttYWxsb2MgZm9yIGF1eGlsaWFyeSBCRCAiCisJCQkgICAgICAgInN0cnVjdHVyZXMgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQl0eHEtPnR4YiA9IE5VTEw7CisJfQorCisJLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3JzIChURkRzKSwKKwkgKiBzaGFyZWQgd2l0aCBkZXZpY2UgKi8KKwl0eHEtPnRmZHMgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCB0ZmRfc3osICZ0eHEtPnEuZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghdHhxLT50ZmRzKSB7CisJCUlMX0VSUigicGNpX2FsbG9jX2NvbnNpc3RlbnQoJXpkKSBmYWlsZWRcbiIsIHRmZF9zeik7CisJCWdvdG8gZXJyb3I7CisJfQorCXR4cS0+cS5pZCA9IGlkOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWtmcmVlKHR4cS0+dHhiKTsKKwl0eHEtPnR4YiA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBpbF90eF9xdWV1ZV9pbml0IC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIHR4L2NtZCBxdWV1ZQorICovCitpbnQKK2lsX3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgaW50IHNsb3RzX251bSwKKwkJIHUzMiB0eHFfaWQpCit7CisJaW50IGksIGxlbjsKKwlpbnQgcmV0OworCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07CisKKwkvKgorCSAqIEFsbG9jIGJ1ZmZlciBhcnJheSBmb3IgY29tbWFuZHMgKFR4IG9yIG90aGVyIHR5cGVzIG9mIGNvbW1hbmRzKS4KKwkgKiBGb3IgdGhlIGNvbW1hbmQgcXVldWUgKCM0LyM5KSwgYWxsb2NhdGUgY29tbWFuZCBzcGFjZSArIG9uZSBiaWcKKwkgKiBjb21tYW5kIGZvciBzY2FuLCBzaW5jZSBzY2FuIGNvbW1hbmQgaXMgdmVyeSBodWdlOyB0aGUgc3lzdGVtIHdpbGwKKwkgKiBub3QgaGF2ZSB0d28gc2NhbnMgYXQgdGhlIHNhbWUgdGltZSwgc28gb25seSBvbmUgaXMgbmVlZGVkLgorCSAqIEZvciBub3JtYWwgVHggcXVldWVzIChhbGwgb3RoZXIgcXVldWVzKSwgbm8gc3VwZXItc2l6ZSBjb21tYW5kCisJICogc3BhY2UgaXMgbmVlZGVkLgorCSAqLworCWlmICh0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJYWN0dWFsX3Nsb3RzKys7CisKKwl0eHEtPm1ldGEgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfY21kX21ldGEpICogYWN0dWFsX3Nsb3RzLCBHRlBfS0VSTkVMKTsKKwl0eHEtPmNtZCA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9kZXZpY2VfY21kICopICogYWN0dWFsX3Nsb3RzLCBHRlBfS0VSTkVMKTsKKworCWlmICghdHhxLT5tZXRhIHx8ICF0eHEtPmNtZCkKKwkJZ290byBvdXRfZnJlZV9hcnJheXM7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGlsX2RldmljZV9jbWQpOworCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfc2xvdHM7IGkrKykgeworCQkvKiBvbmx5IGhhcHBlbnMgZm9yIGNtZCBxdWV1ZSAqLworCQlpZiAoaSA9PSBzbG90c19udW0pCisJCQlsZW4gPSBJTF9NQVhfQ01EX1NJWkU7CisKKwkJdHhxLT5jbWRbaV0gPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdHhxLT5jbWRbaV0pCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBBbGxvYyBkcml2ZXIgZGF0YSBhcnJheSBhbmQgVEZEIGNpcmN1bGFyIGJ1ZmZlciAqLworCXJldCA9IGlsX3R4X3F1ZXVlX2FsbG9jKGlsLCB0eHEsIHR4cV9pZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl0eHEtPm5lZWRfdXBkYXRlID0gMDsKKworCS8qCisJICogRm9yIHRoZSBkZWZhdWx0IHF1ZXVlcyAwLTMsIHNldCB1cCB0aGUgc3dxX2lkCisJICogYWxyZWFkeSAtLSBhbGwgb3RoZXJzIG5lZWQgdG8gZ2V0IG9uZSBsYXRlcgorCSAqIChpZiB0aGV5IG5lZWQgb25lIGF0IGFsbCkuCisJICovCisJaWYgKHR4cV9pZCA8IDQpCisJCWlsX3NldF9zd3FfaWQodHhxLCB0eHFfaWQsIHR4cV9pZCk7CisKKwkvKiBURkRfUVVFVUVfU0laRV9NQVggbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCisJICogaWxfcXVldWVfaW5jX3dyYXAgYW5kIGlsX3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCisJQlVJTERfQlVHX09OKFRGRF9RVUVVRV9TSVpFX01BWCAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSk7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaWR4ZXMgKi8KKwlpbF9xdWV1ZV9pbml0KGlsLCAmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwgdHhxX2lkKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgcXVldWUgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQoaWwsIHR4cSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspCisJCWtmcmVlKHR4cS0+Y21kW2ldKTsKK291dF9mcmVlX2FycmF5czoKKwlrZnJlZSh0eHEtPm1ldGEpOworCWtmcmVlKHR4cS0+Y21kKTsKKworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9xdWV1ZV9pbml0KTsKKwordm9pZAoraWxfdHhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgaW50IHNsb3RzX251bSwKKwkJICB1MzIgdHhxX2lkKQoreworCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07CisKKwlpZiAodHhxX2lkID09IGlsLT5jbWRfcXVldWUpCisJCWFjdHVhbF9zbG90cysrOworCisJbWVtc2V0KHR4cS0+bWV0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMpOworCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaWR4ZXMgKi8KKwlpbF9xdWV1ZV9pbml0KGlsLCAmdHhxLT5xLCBURkRfUVVFVUVfU0laRV9NQVgsIHNsb3RzX251bSwgdHhxX2lkKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgcXVldWUgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQoaWwsIHR4cSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3R4X3F1ZXVlX3Jlc2V0KTsKKworLyoqKioqKioqKioqKioqKiBIT1NUIENPTU1BTkQgUVVFVUUgRlVOQ1RJT05TICAgKioqKiovCisKKy8qKgorICogaWxfZW5xdWV1ZV9oY21kIC0gZW5xdWV1ZSBhIHVDb2RlIGNvbW1hbmQKKyAqIEBpbDogZGV2aWNlIGlsYXRlIGRhdGEgcG9pbnQKKyAqIEBjbWQ6IGEgcG9pbnQgdG8gdGhlIHVjb2RlIGNvbW1hbmQgc3RydWN0dXJlCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgPCAwIHZhbHVlcyB0byBpbmRpY2F0ZSB0aGUgb3BlcmF0aW9uIGlzCisgKiBmYWlsZWQuIE9uIHN1Y2Nlc3MsIGl0IHR1cm5zIHRoZSBpZHggKD4gMCkgb2YgY29tbWFuZCBpbiB0aGUKKyAqIGNvbW1hbmQgcXVldWUuCisgKi8KK2ludAoraWxfZW5xdWV1ZV9oY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpvdXRfY21kOworCXN0cnVjdCBpbF9jbWRfbWV0YSAqb3V0X21ldGE7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuOworCXUzMiBpZHg7CisJdTE2IGZpeF9zaXplOworCisJY21kLT5sZW4gPSBpbC0+Y2ZnLT5vcHMtPnV0aWxzLT5nZXRfaGNtZF9zaXplKGNtZC0+aWQsIGNtZC0+bGVuKTsKKwlmaXhfc2l6ZSA9ICh1MTYpIChjbWQtPmxlbiArIHNpemVvZihvdXRfY21kLT5oZHIpKTsKKworCS8qIElmIGFueSBvZiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmVzIGVuZCB1cCBiZWluZyBsYXJnZXIgdGhhbgorCSAqIHRoZSBURkRfTUFYX1BBWUxPQURfU0laRSwgYW5kIGl0IHNlbnQgYXMgYSAnc21hbGwnIGNvbW1hbmQgdGhlbgorCSAqIHdlIHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgVEZEIGVudHJpZXMKKwkgKiBBbHNvLCBjaGVjayB0byBzZWUgaWYgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBleGNlZWQgdGhlIHNpemUKKwkgKiBvZiBkZXZpY2VfY21kIGFuZCBtYXhfY21kX3NpemUuICovCisJQlVHX09OKChmaXhfc2l6ZSA+IFRGRF9NQVhfUEFZTE9BRF9TSVpFKSAmJgorCSAgICAgICAhKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKSk7CisJQlVHX09OKGZpeF9zaXplID4gSUxfTUFYX0NNRF9TSVpFKTsKKworCWlmIChpbF9pc19yZmtpbGwoaWwpIHx8IGlsX2lzX2N0a2lsbChpbCkpIHsKKwkJSUxfV0FSTigiTm90IHNlbmRpbmcgY29tbWFuZCAtICVzIEtJTExcbiIsCisJCQlpbF9pc19yZmtpbGwoaWwpID8gIlJGIiA6ICJDVCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGlsX3F1ZXVlX3NwYWNlKHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+aGNtZF9sb2NrLCBmbGFncyk7CisKKwkJSUxfRVJSKCJSZXN0YXJ0aW5nIGFkYXB0ZXIgZHVlIHRvIGNvbW1hbmQgcXVldWUgZnVsbFxuIik7CisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaWR4ID0gaWxfZ2V0X2NtZF9pZHgocSwgcS0+d3JpdGVfcHRyLCBjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSk7CisJb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07CisJb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07CisKKwlpZiAoV0FSTl9PTihvdXRfbWV0YS0+ZmxhZ3MgJiBDTURfTUFQUEVEKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+aGNtZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCW1lbXNldChvdXRfbWV0YSwgMCwgc2l6ZW9mKCpvdXRfbWV0YSkpOwkvKiByZS1pbml0aWFsaXplIHRvIE5VTEwgKi8KKwlvdXRfbWV0YS0+ZmxhZ3MgPSBjbWQtPmZsYWdzIHwgQ01EX01BUFBFRDsKKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikKKwkJb3V0X21ldGEtPnNvdXJjZSA9IGNtZDsKKwlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKKwkJb3V0X21ldGEtPmNhbGxiYWNrID0gY21kLT5jYWxsYmFjazsKKworCW91dF9jbWQtPmhkci5jbWQgPSBjbWQtPmlkOworCW1lbWNweSgmb3V0X2NtZC0+Y21kLnBheWxvYWQsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCisJLyogQXQgdGhpcyBwb2ludCwgdGhlIG91dF9jbWQgbm93IGhhcyBhbGwgb2YgdGhlIGluY29taW5nIGNtZAorCSAqIGluZm9ybWF0aW9uICovCisKKwlvdXRfY21kLT5oZHIuZmxhZ3MgPSAwOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CisJICAgIGNwdV90b19sZTE2KFFVRVVFX1RPX1NFUShpbC0+Y21kX3F1ZXVlKSB8IElEWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CisJaWYgKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKQorCQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgfD0gU0VRX0hVR0VfRlJBTUU7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9kZXZpY2VfY21kKTsKKwlpZiAoaWR4ID09IFRGRF9DTURfU0xPVFMpCisJCWxlbiA9IElMX01BWF9DTURfU0laRTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN3aXRjaCAob3V0X2NtZC0+aGRyLmNtZCkgeworCWNhc2UgQ19UWF9MSU5LX1FVQUxJVFlfQ01EOgorCWNhc2UgQ19TRU5TSVRJVklUWToKKwkJRF9IQ19EVU1QKCJTZW5kaW5nIGNvbW1hbmQgJXMgKCMleCksIHNlcTogMHglMDRYLCAiCisJCQkgICIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCisJCQkgIGlsX2dldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLCBvdXRfY21kLT5oZHIuY21kLAorCQkJICBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwKKwkJCSAgcS0+d3JpdGVfcHRyLCBpZHgsIGlsLT5jbWRfcXVldWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEX0hDKCJTZW5kaW5nIGNvbW1hbmQgJXMgKCMleCksIHNlcTogMHglMDRYLCAiCisJCSAgICAgIiVkIGJ5dGVzIGF0ICVkWyVkXTolZFxuIiwKKwkJICAgICBpbF9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwgb3V0X2NtZC0+aGRyLmNtZCwKKwkJICAgICBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwgcS0+d3JpdGVfcHRyLAorCQkgICAgIGlkeCwgaWwtPmNtZF9xdWV1ZSk7CisJfQorI2VuZGlmCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisKKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKQorCQkvKiBTZXQgdXAgZW50cnkgaW4gcXVldWUncyBieXRlIGNvdW50IGNpcmN1bGFyIGJ1ZmZlciAqLworCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwoaWwsIHR4cSwgMCk7CisKKwlwaHlzX2FkZHIgPQorCSAgICBwY2lfbWFwX3NpbmdsZShpbC0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwgZml4X3NpemUsCisJCQkgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgcGh5c19hZGRyKTsKKwlkbWFfdW5tYXBfbGVuX3NldChvdXRfbWV0YSwgbGVuLCBmaXhfc2l6ZSk7CisKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKGlsLCB0eHEsIHBoeXNfYWRkciwgZml4X3NpemUsCisJCQkJCQkgMSwgVTMyX1BBRChjbWQtPmxlbikpOworCisJLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpZHggKi8KKwlxLT53cml0ZV9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCXJldHVybiBpZHg7Cit9CisKKy8qKgorICogaWxfaGNtZF9xdWV1ZV9yZWNsYWltIC0gUmVjbGFpbSBUWCBjb21tYW5kIHF1ZXVlIGVudHJpZXMgYWxyZWFkeSBUeCdkCisgKgorICogV2hlbiBGVyBhZHZhbmNlcyAnUicgaWR4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpZHgKKyAqIG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZSBmb3Jtcy4gIElmIHRoZXJlIGlzCisgKiBlbm91Z2ggZnJlZSBzcGFjZSAoPiBsb3cgbWFyayksIHdha2UgdGhlIHN0YWNrIHRoYXQgZmVlZHMgdXMuCisgKi8KK3N0YXRpYyB2b2lkCitpbF9oY21kX3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4LCBpbnQgY21kX2lkeCkKK3sKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlpbnQgbmZyZWVkID0gMDsKKworCWlmIChpZHggPj0gcS0+bl9iZCB8fCBpbF9xdWV1ZV91c2VkKHEsIGlkeCkgPT0gMCkgeworCQlJTF9FUlIoIlJlYWQgaWR4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGlkeCAlZCwgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLCB0eHFfaWQsIGlkeCwgcS0+bl9iZCwKKwkJICAgICAgIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCWlmIChuZnJlZWQrKyA+IDApIHsKKwkJCUlMX0VSUigiSENNRCBza2lwcGVkOiBpZHggKCVkKSAlZCAlZFxuIiwgaWR4LAorCQkJICAgICAgIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOworCQkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworCQl9CisKKwl9Cit9CisKKy8qKgorICogaWxfdHhfY21kX2NvbXBsZXRlIC0gUHVsbCB1bnVzZWQgYnVmZmVycyBvZmYgdGhlIHF1ZXVlIGFuZCByZWNsYWltIHRoZW0KKyAqIEByeGI6IFJ4IGJ1ZmZlciB0byByZWNsYWltCisgKgorICogSWYgYW4gUnggYnVmZmVyIGhhcyBhbiBhc3luYyBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggaXQgdGhlIGNhbGxiYWNrCisgKiB3aWxsIGJlIGV4ZWN1dGVkLiAgVGhlIGF0dGFjaGVkIHNrYiAoaWYgcHJlc2VudCkgd2lsbCBvbmx5IGJlIGZyZWVkCisgKiBpZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAxCisgKi8KK3ZvaWQKK2lsX3R4X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKKwlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKKwlpbnQgaWR4ID0gU0VRX1RPX0lEWChzZXF1ZW5jZSk7CisJaW50IGNtZF9pZHg7CisJYm9vbCBodWdlID0gISEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfSFVHRV9GUkFNRSk7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZDsKKwlzdHJ1Y3QgaWxfY21kX21ldGEgKm1ldGE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgYSBUeCBjb21tYW5kIGlzIGJlaW5nIGhhbmRsZWQgYW5kIGl0IGlzbid0IGluIHRoZSBhY3R1YWwKKwkgKiBjb21tYW5kIHF1ZXVlIHRoZW4gdGhlcmUgYSBjb21tYW5kIHJvdXRpbmcgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQKKwkgKiBpbiB0aGUgcXVldWUgbWFuYWdlbWVudCBjb2RlLiAqLworCWlmIChXQVJOCisJICAgICh0eHFfaWQgIT0gaWwtPmNtZF9xdWV1ZSwKKwkgICAgICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKKwkgICAgIHR4cV9pZCwgaWwtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsIGlsLT50eHFbaWwtPmNtZF9xdWV1ZV0ucS5yZWFkX3B0ciwKKwkgICAgIGlsLT50eHFbaWwtPmNtZF9xdWV1ZV0ucS53cml0ZV9wdHIpKSB7CisJCWlsX3ByaW50X2hleF9lcnJvcihpbCwgcGt0LCAzMik7CisJCXJldHVybjsKKwl9CisKKwljbWRfaWR4ID0gaWxfZ2V0X2NtZF9pZHgoJnR4cS0+cSwgaWR4LCBodWdlKTsKKwljbWQgPSB0eHEtPmNtZFtjbWRfaWR4XTsKKwltZXRhID0gJnR4cS0+bWV0YVtjbWRfaWR4XTsKKworCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LCBkbWFfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKKwkJCSBkbWFfdW5tYXBfbGVuKG1ldGEsIGxlbiksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBJbnB1dCBlcnJvciBjaGVja2luZyBpcyBkb25lIHdoZW4gY29tbWFuZHMgYXJlIGFkZGVkIHRvIHF1ZXVlLiAqLworCWlmIChtZXRhLT5mbGFncyAmIENNRF9XQU5UX1NLQikgeworCQltZXRhLT5zb3VyY2UtPnJlcGx5X3BhZ2UgPSAodW5zaWduZWQgbG9uZylyeGJfYWRkcihyeGIpOworCQlyeGItPnBhZ2UgPSBOVUxMOworCX0gZWxzZSBpZiAobWV0YS0+Y2FsbGJhY2spCisJCW1ldGEtPmNhbGxiYWNrKGlsLCBjbWQsIHBrdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJaWxfaGNtZF9xdWV1ZV9yZWNsYWltKGlsLCB0eHFfaWQsIGlkeCwgY21kX2lkeCk7CisKKwlpZiAoIShtZXRhLT5mbGFncyAmIENNRF9BU1lOQykpIHsKKwkJY2xlYXJfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKwkJRF9JTkZPKCJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCkpOworCQl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwl9CisKKwkvKiBNYXJrIGFzIHVubWFwcGVkICovCisJbWV0YS0+ZmxhZ3MgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9jbWRfY29tcGxldGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIml3bC1sZWdhY3k6IGNvbW1vbiBmdW5jdGlvbnMgZm9yIDM5NDUgYW5kIDQ5NjUiKTsKK01PRFVMRV9WRVJTSU9OKElXTFdJRklfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgorICogZXZlcnkgdGltZSB0aGUgcHJpb3JpdHkgbGluZSBpcyBhc3NlcnRlZCAoQlQgaXMgc2VuZGluZyBzaWduYWxzIG9uIHRoZQorICogcHJpb3JpdHkgbGluZSBpbiB0aGUgUENJeCkuCisgKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gZmFsc2UsIHVDb2RlIHdpbGwgaWdub3JlIHRoZSBCVCBhY3Rpdml0eSBhbmQKKyAqIHBlcmZvcm0gdGhlIG5vcm1hbCBvcGVyYXRpb24KKyAqCisgKiBVc2VyIG1pZ2h0IGV4cGVyaWVuY2UgdHJhbnNtaXQgaXNzdWUgb24gc29tZSBwbGF0Zm9ybSBkdWUgdG8gV2lGaS9CVAorICogY28tZXhpc3QgcHJvYmxlbS4gVGhlIHBvc3NpYmxlIGJlaGF2aW9ycyBhcmU6CisgKiAgIEFibGUgdG8gc2NhbiBhbmQgZmluZGluZyBhbGwgdGhlIGF2YWlsYWJsZSBBUAorICogICBOb3QgYWJsZSB0byBhc3NvY2lhdGUgd2l0aCBhbnkgQVAKKyAqIE9uIHRob3NlIHBsYXRmb3JtcywgV2lGaSBjb21tdW5pY2F0aW9uIGNhbiBiZSByZXN0b3JlZCBieSBzZXQKKyAqICJidF9jb2V4X2FjdGl2ZSIgbW9kdWxlIHBhcmFtZXRlciB0byAiZmFsc2UiCisgKgorICogZGVmYXVsdDogYnRfY29leF9hY3RpdmUgPSB0cnVlIChCVF9DT0VYX0VOQUJMRSkKKyAqLworc3RhdGljIGJvb2wgYnRfY29leF9hY3RpdmUgPSB0cnVlOworbW9kdWxlX3BhcmFtKGJ0X2NvZXhfYWN0aXZlLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYnRfY29leF9hY3RpdmUsICJlbmFibGUgd2lmaS9ibHVldG9vdGggY28tZXhpc3QiKTsKKwordTMyIGlsX2RlYnVnX2xldmVsOworRVhQT1JUX1NZTUJPTChpbF9kZWJ1Z19sZXZlbCk7CisKK2NvbnN0IHU4IGlsX2JjYXN0X2FkZHJbRVRIX0FMRU5dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CitFWFBPUlRfU1lNQk9MKGlsX2JjYXN0X2FkZHIpOworCisvKiBUaGlzIGZ1bmN0aW9uIGJvdGggYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBodyBhbmQgaWwuICovCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICoKK2lsX2FsbG9jX2FsbChzdHJ1Y3QgaWxfY2ZnICpjZmcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKKwkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIGlsYXRlIHN0cnVjdHVyZSAqLworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCisJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpbF9wcml2KSwKKwkJCQljZmctPm9wcy0+aWVlZTgwMjExX29wcyk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIiwgY2ZnLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWwgPSBody0+cHJpdjsKKwlpbC0+aHcgPSBodzsKKworb3V0OgorCXJldHVybiBodzsKK30KK0VYUE9SVF9TWU1CT0woaWxfYWxsb2NfYWxsKTsKKworI2RlZmluZSBNQVhfQklUX1JBVEVfNDBfTUhaIDE1MAkvKiBNYnBzICovCisjZGVmaW5lIE1BWF9CSVRfUkFURV8yMF9NSFogNzIJLyogTWJwcyAqLworc3RhdGljIHZvaWQKK2lsX2luaXRfaHRfaHdfY2FwYWIoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9pbmZvLAorCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCXUxNiBtYXhfYml0X3JhdGUgPSAwOworCXU4IHJ4X2NoYWluc19udW0gPSBpbC0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW07CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKworCWh0X2luZm8tPmNhcCA9IDA7CisJbWVtc2V0KCZodF9pbmZvLT5tY3MsIDAsIHNpemVvZihodF9pbmZvLT5tY3MpKTsKKworCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IHRydWU7CisKKwlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzIwX01IWjsKKwlpZiAoaWwtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgJiBCSVQoYmFuZCkpIHsKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CisJCWh0X2luZm8tPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKKwkJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzQwX01IWjsKKwl9CisKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOworCisJaHRfaW5mby0+YW1wZHVfZmFjdG9yID0gQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9ERUY7CisJaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9IENGR19IVF9NUERVX0RFTlNJVFlfREVGOworCisJaHRfaW5mby0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOworCWlmIChyeF9jaGFpbnNfbnVtID49IDIpCisJCWh0X2luZm8tPm1jcy5yeF9tYXNrWzFdID0gMHhGRjsKKwlpZiAocnhfY2hhaW5zX251bSA+PSAzKQorCQlodF9pbmZvLT5tY3MucnhfbWFza1syXSA9IDB4RkY7CisKKwkvKiBIaWdoZXN0IHN1cHBvcnRlZCBSeCBkYXRhIHJhdGUgKi8KKwltYXhfYml0X3JhdGUgKj0gcnhfY2hhaW5zX251bTsKKwlXQVJOX09OKG1heF9iaXRfcmF0ZSAmIH5JRUVFODAyMTFfSFRfTUNTX1JYX0hJR0hFU1RfTUFTSyk7CisJaHRfaW5mby0+bWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNihtYXhfYml0X3JhdGUpOworCisJLyogVHggTUNTIGNhcGFiaWxpdGllcyAqLworCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7CisJaWYgKHR4X2NoYWluc19udW0gIT0gcnhfY2hhaW5zX251bSkgeworCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9IElFRUU4MDIxMV9IVF9NQ1NfVFhfUlhfRElGRjsKKwkJaHRfaW5mby0+bWNzLnR4X3BhcmFtcyB8PQorCQkgICAgKCh0eF9jaGFpbnNfbnVtIC0KKwkJICAgICAgMSkgPDwgSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVCk7CisJfQorfQorCisvKioKKyAqIGlsX2luaXRfZ2VvcyAtIEluaXRpYWxpemUgbWFjODAyMTEncyBnZW8vY2hhbm5lbCBpbmZvIGJhc2VkIGZyb20gZWVwcm9tCisgKi8KK2ludAoraWxfaW5pdF9nZW9zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqZ2VvX2NoOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXM7CisJaW50IGkgPSAwOworCXM4IG1heF90eF9wb3dlciA9IDA7CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fYml0cmF0ZXMgfHwKKwkgICAgaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fYml0cmF0ZXMpIHsKKwkJRF9JTkZPKCJHZW9ncmFwaHkgbW9kZXMgYWxyZWFkeSBpbml0aWFsaXplZC5cbiIpOworCQlzZXRfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2hhbm5lbHMgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpICogaWwtPmNoYW5uZWxfY291bnQsCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJhdGVzID0KKwkgICAga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBSQVRFX0NPVU5UX0xFR0FDWSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJhdGVzKSB7CisJCWtmcmVlKGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogNS4yR0h6IGNoYW5uZWxzIHN0YXJ0IGFmdGVyIHRoZSAyLjRHSHogY2hhbm5lbHMgKi8KKwlzYmFuZCA9ICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07CisJc2JhbmQtPmNoYW5uZWxzID0gJmNoYW5uZWxzW0FSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSldOworCS8qIGp1c3QgT0ZETSAqLworCXNiYW5kLT5iaXRyYXRlcyA9ICZyYXRlc1tJTF9GSVJTVF9PRkRNX1JBVEVdOworCXNiYW5kLT5uX2JpdHJhdGVzID0gUkFURV9DT1VOVF9MRUdBQ1kgLSBJTF9GSVJTVF9PRkRNX1JBVEU7CisKKwlpZiAoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pCisJCWlsX2luaXRfaHRfaHdfY2FwYWIoaWwsICZzYmFuZC0+aHRfY2FwLCBJRUVFODAyMTFfQkFORF81R0haKTsKKworCXNiYW5kID0gJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKKwlzYmFuZC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwkvKiBPRkRNICYgQ0NLICovCisJc2JhbmQtPmJpdHJhdGVzID0gcmF0ZXM7CisJc2JhbmQtPm5fYml0cmF0ZXMgPSBSQVRFX0NPVU5UX0xFR0FDWTsKKworCWlmIChpbC0+Y2ZnLT5za3UgJiBJTF9TS1VfTikKKwkJaWxfaW5pdF9odF9od19jYXBhYihpbCwgJnNiYW5kLT5odF9jYXAsIElFRUU4MDIxMV9CQU5EXzJHSFopOworCisJaWwtPmllZWVfY2hhbm5lbHMgPSBjaGFubmVsczsKKwlpbC0+aWVlZV9yYXRlcyA9IHJhdGVzOworCisJZm9yIChpID0gMDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJY2ggPSAmaWwtPmNoYW5uZWxfaW5mb1tpXTsKKworCQlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2gpKQorCQkJY29udGludWU7CisKKwkJc2JhbmQgPSAmaWwtPmJhbmRzW2NoLT5iYW5kXTsKKworCQlnZW9fY2ggPSAmc2JhbmQtPmNoYW5uZWxzW3NiYW5kLT5uX2NoYW5uZWxzKytdOworCisJCWdlb19jaC0+Y2VudGVyX2ZyZXEgPQorCQkgICAgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoLT5jaGFubmVsLCBjaC0+YmFuZCk7CisJCWdlb19jaC0+bWF4X3Bvd2VyID0gY2gtPm1heF9wb3dlcl9hdmc7CisJCWdlb19jaC0+bWF4X2FudGVubmFfZ2FpbiA9IDB4ZmY7CisJCWdlb19jaC0+aHdfdmFsdWUgPSBjaC0+Y2hhbm5lbDsKKworCQlpZiAoaWxfaXNfY2hhbm5lbF92YWxpZChjaCkpIHsKKwkJCWlmICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpKQorCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSUJTUzsKKworCQkJaWYgKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfQUNUSVZFKSkKKwkJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKKworCQkJaWYgKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKQorCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUkFEQVI7CisKKwkJCWdlb19jaC0+ZmxhZ3MgfD0gY2gtPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7CisKKwkJCWlmIChjaC0+bWF4X3Bvd2VyX2F2ZyA+IG1heF90eF9wb3dlcikKKwkJCQltYXhfdHhfcG93ZXIgPSBjaC0+bWF4X3Bvd2VyX2F2ZzsKKwkJfSBlbHNlIHsKKwkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fRElTQUJMRUQ7CisJCX0KKworCQlEX0lORk8oIkNoYW5uZWwgJWQgRnJlcT0lZFslc0dIel0gJXMgZmxhZz0weCVYXG4iLCBjaC0+Y2hhbm5lbCwKKwkJICAgICAgIGdlb19jaC0+Y2VudGVyX2ZyZXEsCisJCSAgICAgICBpbF9pc19jaGFubmVsX2FfYmFuZChjaCkgPyAiNS4yIiA6ICIyLjQiLAorCQkgICAgICAgZ2VvX2NoLT4KKwkJICAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQgPyAicmVzdHJpY3RlZCIgOiAidmFsaWQiLAorCQkgICAgICAgZ2VvX2NoLT5mbGFncyk7CisJfQorCisJaWwtPnR4X3Bvd2VyX2RldmljZV9sbXQgPSBtYXhfdHhfcG93ZXI7CisJaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID0gbWF4X3R4X3Bvd2VyOworCWlsLT50eF9wb3dlcl9uZXh0ID0gbWF4X3R4X3Bvd2VyOworCisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzID09IDAgJiYKKwkgICAgKGlsLT5jZmctPnNrdSAmIElMX1NLVV9BKSkgeworCQlJTF9JTkZPKCJJbmNvcnJlY3RseSBkZXRlY3RlZCBCRyBjYXJkIGFzIEFCRy4gIgorCQkJIlBsZWFzZSBzZW5kIHlvdXIgUENJIElEIDB4JTA0WDoweCUwNFggdG8gbWFpbnRhaW5lci5cbiIsCisJCQlpbC0+cGNpX2Rldi0+ZGV2aWNlLCBpbC0+cGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSk7CisJCWlsLT5jZmctPnNrdSAmPSB+SUxfU0tVX0E7CisJfQorCisJSUxfSU5GTygiVHVuYWJsZSBjaGFubmVsczogJWQgODAyLjExYmcsICVkIDgwMi4xMWEgY2hhbm5lbHNcbiIsCisJCWlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzLAorCQlpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyk7CisKKwlzZXRfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9pbml0X2dlb3MpOworCisvKgorICogaWxfZnJlZV9nZW9zIC0gdW5kbyBhbGxvY2F0aW9ucyBpbiBpbF9pbml0X2dlb3MKKyAqLwordm9pZAoraWxfZnJlZV9nZW9zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+aWVlZV9jaGFubmVscyk7CisJa2ZyZWUoaWwtPmllZWVfcmF0ZXMpOworCWNsZWFyX2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2ZyZWVfZ2Vvcyk7CisKK3N0YXRpYyBib29sCitpbF9pc19jaGFubmVsX2V4dGVuc2lvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCXUxNiBjaGFubmVsLCB1OCBleHRlbnNpb25fY2hhbl9vZmZzZXQpCit7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBiYW5kLCBjaGFubmVsKTsKKwlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChleHRlbnNpb25fY2hhbl9vZmZzZXQgPT0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkUpCisJCXJldHVybiAhKGNoX2luZm8tPgorCQkJIGh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJiBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7CisJZWxzZSBpZiAoZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID09IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XKQorCQlyZXR1cm4gIShjaF9pbmZvLT4KKwkJCSBodDQwX2V4dGVuc2lvbl9jaGFubmVsICYgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKTsKKworCXJldHVybiBmYWxzZTsKK30KKworYm9vbAoraWxfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKK3sKKwlpZiAoIWN0eC0+aHQuZW5hYmxlZCB8fCAhY3R4LT5odC5pc180MG1oeikKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBXZSBkbyBub3QgY2hlY2sgZm9yIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwCisJICogdGhlIGJpdCB3aWxsIG5vdCBzZXQgaWYgaXQgaXMgcHVyZSA0ME1IeiBjYXNlCisJICovCisJaWYgKGh0X2NhcCAmJiAhaHRfY2FwLT5odF9zdXBwb3J0ZWQpCisJCXJldHVybiBmYWxzZTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJaWYgKGlsLT5kaXNhYmxlX2h0NDApCisJCXJldHVybiBmYWxzZTsKKyNlbmRpZgorCisJcmV0dXJuIGlsX2lzX2NoYW5uZWxfZXh0ZW5zaW9uKGlsLCBpbC0+YmFuZCwKKwkJCQkgICAgICAgbGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpLAorCQkJCSAgICAgICBjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2lzX2h0NDBfdHhfYWxsb3dlZCk7CisKK3N0YXRpYyB1MTYKK2lsX2FkanVzdF9iZWFjb25faW50ZXJ2YWwodTE2IGJlYWNvbl92YWwsIHUxNiBtYXhfYmVhY29uX3ZhbCkKK3sKKwl1MTYgbmV3X3ZhbDsKKwl1MTYgYmVhY29uX2ZhY3RvcjsKKworCS8qCisJICogSWYgbWFjODAyMTEgaGFzbid0IGdpdmVuIHVzIGEgYmVhY29uIGludGVydmFsLCBwcm9ncmFtCisJICogdGhlIGRlZmF1bHQgaW50byB0aGUgZGV2aWNlLgorCSAqLworCWlmICghYmVhY29uX3ZhbCkKKwkJcmV0dXJuIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOworCisJLyoKKwkgKiBJZiB0aGUgYmVhY29uIGludGVydmFsIHdlIG9idGFpbmVkIGZyb20gdGhlIHBlZXIKKwkgKiBpcyB0b28gbGFyZ2UsIHdlJ2xsIGhhdmUgdG8gd2FrZSB1cCBtb3JlIG9mdGVuCisJICogKGFuZCBpbiBJQlNTIGNhc2UsIHdlJ2xsIGJlYWNvbiB0b28gbXVjaCkKKwkgKgorCSAqIEZvciBleGFtcGxlLCBpZiBtYXhfYmVhY29uX3ZhbCBpcyA0MDk2LCBhbmQgdGhlCisJICogcmVxdWVzdGVkIGJlYWNvbiBpbnRlcnZhbCBpcyA3MDAwLCB3ZSdsbCBoYXZlIHRvCisJICogdXNlIDM1MDAgdG8gYmUgYWJsZSB0byB3YWtlIHVwIG9uIHRoZSBiZWFjb25zLgorCSAqCisJICogVGhpcyBjb3VsZCBiYWRseSBpbmZsdWVuY2UgYmVhY29uIGRldGVjdGlvbiBzdGF0cy4KKwkgKi8KKworCWJlYWNvbl9mYWN0b3IgPSAoYmVhY29uX3ZhbCArIG1heF9iZWFjb25fdmFsKSAvIG1heF9iZWFjb25fdmFsOworCW5ld192YWwgPSBiZWFjb25fdmFsIC8gYmVhY29uX2ZhY3RvcjsKKworCWlmICghbmV3X3ZhbCkKKwkJbmV3X3ZhbCA9IG1heF9iZWFjb25fdmFsOworCisJcmV0dXJuIG5ld192YWw7Cit9CisKK2ludAoraWxfc2VuZF9yeG9uX3RpbWluZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwl1NjQgdHNmOworCXMzMiBpbnRlcnZhbF90bSwgcmVtOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CisJdTE2IGJlYWNvbl9pbnQ7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCisJY29uZiA9ICZpbC0+aHctPmNvbmY7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJbWVtc2V0KCZjdHgtPnRpbWluZywgMCwgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX3RpbWVfY21kKSk7CisKKwljdHgtPnRpbWluZy50aW1lc3RhbXAgPSBjcHVfdG9fbGU2NChpbC0+dGltZXN0YW1wKTsKKwljdHgtPnRpbWluZy5saXN0ZW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihjb25mLT5saXN0ZW5faW50ZXJ2YWwpOworCisJYmVhY29uX2ludCA9IHZpZiA/IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCA6IDA7CisKKwkvKgorCSAqIFRPRE86IEZvciBJQlNTIHdlIG5lZWQgdG8gZ2V0IGF0aW1fd2luIGZyb20gbWFjODAyMTEsCisJICogICAgICAgZm9yIG5vdyBqdXN0IGFsd2F5cyB1c2UgMAorCSAqLworCWN0eC0+dGltaW5nLmF0aW1fd2luID0gMDsKKworCWJlYWNvbl9pbnQgPQorCSAgICBpbF9hZGp1c3RfYmVhY29uX2ludGVydmFsKGJlYWNvbl9pbnQsCisJCQkJICAgICAgaWwtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsICoKKwkJCQkgICAgICBUSU1FX1VOSVQpOworCWN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGJlYWNvbl9pbnQpOworCisJdHNmID0gaWwtPnRpbWVzdGFtcDsJLyogdHNmIGlzIG1vZGlmZWQgYnkgZG9fZGl2OiBjb3B5IGl0ICovCisJaW50ZXJ2YWxfdG0gPSBiZWFjb25faW50ICogVElNRV9VTklUOworCXJlbSA9IGRvX2Rpdih0c2YsIGludGVydmFsX3RtKTsKKwljdHgtPnRpbWluZy5iZWFjb25faW5pdF92YWwgPSBjcHVfdG9fbGUzMihpbnRlcnZhbF90bSAtIHJlbSk7CisKKwljdHgtPnRpbWluZy5kdGltX3BlcmlvZCA9IHZpZiA/ICh2aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kID8gOiAxKSA6IDE7CisKKwlEX0FTU09DKCJiZWFjb24gaW50ZXJ2YWwgJWQgYmVhY29uIHRpbWVyICVkIGJlYWNvbiB0aW0gJWRcbiIsCisJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCksCisJCWxlMzJfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCksCisJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmF0aW1fd2luKSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fdGltaW5nX2NtZCwgc2l6ZW9mKGN0eC0+dGltaW5nKSwKKwkJCSAgICAgICAmY3R4LT50aW1pbmcpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX3J4b25fdGltaW5nKTsKKwordm9pZAoraWxfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgaW50IGh3X2RlY3J5cHQpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCWlmIChod19kZWNyeXB0KQorCQlyeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSzsKKwllbHNlCisJCXJ4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0s7CisKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25faHdjcnlwdG8pOworCisvKiB2YWxpZGF0ZSBSWE9OIHN0cnVjdHVyZSBpcyB2YWxpZCAqLworaW50CitpbF9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOworCWJvb2wgZXJyb3IgPSBmYWxzZTsKKworCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19UR0pfTkFSUk9XX0JBTkRfTVNLKSB7CisJCQlJTF9XQVJOKCJjaGVjayAyLjRHOiB3cm9uZyBuYXJyb3dcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX1JBREFSX0RFVEVDVF9NU0spIHsKKwkJCUlMX1dBUk4oImNoZWNrIDIuNEc6IHdyb25nIHJhZGFyXG4iKTsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSB7CisJCQlJTF9XQVJOKCJjaGVjayA1LjJHOiBub3Qgc2hvcnQgc2xvdCFcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0NDS19NU0spIHsKKwkJCUlMX1dBUk4oImNoZWNrIDUuMkc6IENDSyFcbiIpOworCQkJZXJyb3IgPSB0cnVlOworCQl9CisJfQorCWlmICgocnhvbi0+bm9kZV9hZGRyWzBdIHwgcnhvbi0+YnNzaWRfYWRkclswXSkgJiAweDEpIHsKKwkJSUxfV0FSTigibWFjL2Jzc2lkIG1jYXN0IVxuIik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwkvKiBtYWtlIHN1cmUgYmFzaWMgcmF0ZXMgNk1icHMgYW5kIDFNYnBzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoKHJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMgJiBSQVRFXzZNX01BU0spID09IDAgJiYKKwkgICAgKHJ4b24tPmNja19iYXNpY19yYXRlcyAmIFJBVEVfMU1fTUFTSykgPT0gMCkgeworCQlJTF9XQVJOKCJuZWl0aGVyIDEgbm9yIDYgYXJlIGJhc2ljXG4iKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmIChsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkgPiAyMDA3KSB7CisJCUlMX1dBUk4oImFpZCA+IDIwMDdcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSA9PQorCSAgICAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLKSkgeworCQlJTF9XQVJOKCJDQ0sgYW5kIHNob3J0IHNsb3RcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLKSkgPT0KKwkgICAgKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKSB7CisJCUlMX1dBUk4oIkNDSyBhbmQgYXV0byBkZXRlY3QiKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmICgocnhvbi0+CisJICAgICBmbGFncyAmIChSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgfCBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spKSA9PQorCSAgICBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spIHsKKwkJSUxfV0FSTigiVEdnIGJ1dCBubyBhdXRvLWRldGVjdFxuIik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAoZXJyb3IpCisJCUlMX1dBUk4oIlR1bmluZyB0byBjaGFubmVsICVkXG4iLCBsZTE2X3RvX2NwdShyeG9uLT5jaGFubmVsKSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIFJYT05cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2NoZWNrX3J4b25fY21kKTsKKworLyoqCisgKiBpbF9mdWxsX3J4b25fcmVxdWlyZWQgLSBjaGVjayBpZiBmdWxsIFJYT04gKHZzIFJYT05fQVNTT0MpIGNtZCBpcyBuZWVkZWQKKyAqIEBpbDogc3RhZ2luZ19yeG9uIGlzIGNvbXBhcmVkIHRvIGFjdGl2ZV9yeG9uCisgKgorICogSWYgdGhlIFJYT04gc3RydWN0dXJlIGlzIGNoYW5naW5nIGVub3VnaCB0byByZXF1aXJlIGEgbmV3IHR1bmUsCisgKiBvciBpcyBjbGVhcmluZyB0aGUgUlhPTl9GSUxURVJfQVNTT0NfTVNLLCB0aGVuIHJldHVybiAxIHRvIGluZGljYXRlIHRoYXQKKyAqIGEgbmV3IHR1bmUgKGZ1bGwgUlhPTiBjb21tYW5kLCByYXRoZXIgdGhhbiBSWE9OX0FTU09DIGNtZCkgaXMgcmVxdWlyZWQuCisgKi8KK2ludAoraWxfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqc3RhZ2luZyA9ICZjdHgtPnN0YWdpbmc7CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICphY3RpdmUgPSAmY3R4LT5hY3RpdmU7CisKKyNkZWZpbmUgQ0hLKGNvbmQpCQkJCQkJCVwKKwlpZiAoKGNvbmQpKSB7CQkJCQkJCVwKKwkJRF9JTkZPKCJuZWVkIGZ1bGwgUlhPTiAtICIgI2NvbmQgIlxuIik7CVwKKwkJcmV0dXJuIDE7CQkJCQkJXAorCX0KKworI2RlZmluZSBDSEtfTkVRKGMxLCBjMikJCQkJCQlcCisJaWYgKChjMSkgIT0gKGMyKSkgewkJCQkJXAorCQlEX0lORk8oIm5lZWQgZnVsbCBSWE9OIC0gIglcCisJCQkgICAgICAgI2MxICIgIT0gIiAjYzIgIiAtICVkICE9ICVkXG4iLAlcCisJCQkgICAgICAgKGMxKSwgKGMyKSk7CQkJXAorCQlyZXR1cm4gMTsJCQkJCVwKKwl9CisKKwkvKiBUaGVzZSBpdGVtcyBhcmUgb25seSBzZXR0YWJsZSBmcm9tIHRoZSBmdWxsIFJYT04gY29tbWFuZCAqLworCUNISyghaWxfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSk7CisJQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ic3NpZF9hZGRyLCBhY3RpdmUtPmJzc2lkX2FkZHIpKTsKKwlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPm5vZGVfYWRkciwgYWN0aXZlLT5ub2RlX2FkZHIpKTsKKwlDSEsoY29tcGFyZV9ldGhlcl9hZGRyCisJICAgIChzdGFnaW5nLT53bGFwX2Jzc2lkX2FkZHIsIGFjdGl2ZS0+d2xhcF9ic3NpZF9hZGRyKSk7CisJQ0hLX05FUShzdGFnaW5nLT5kZXZfdHlwZSwgYWN0aXZlLT5kZXZfdHlwZSk7CisJQ0hLX05FUShzdGFnaW5nLT5jaGFubmVsLCBhY3RpdmUtPmNoYW5uZWwpOworCUNIS19ORVEoc3RhZ2luZy0+YWlyX3Byb3BhZ2F0aW9uLCBhY3RpdmUtPmFpcl9wcm9wYWdhdGlvbik7CisJQ0hLX05FUShzdGFnaW5nLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMsCisJCWFjdGl2ZS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzKTsKKwlDSEtfTkVRKHN0YWdpbmctPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMsCisJCWFjdGl2ZS0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyk7CisJQ0hLX05FUShzdGFnaW5nLT5hc3NvY19pZCwgYWN0aXZlLT5hc3NvY19pZCk7CisKKwkvKiBmbGFncywgZmlsdGVyX2ZsYWdzLCBvZmRtX2Jhc2ljX3JhdGVzLCBhbmQgY2NrX2Jhc2ljX3JhdGVzIGNhbgorCSAqIGJlIHVwZGF0ZWQgd2l0aCB0aGUgUlhPTl9BU1NPQyBjb21tYW5kIC0tIGhvd2V2ZXIgb25seSBzb21lCisJICogZmxhZyB0cmFuc2l0aW9ucyBhcmUgYWxsb3dlZCB1c2luZyBSWE9OX0FTU09DICovCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IHN3aXRjaGluZyBiYW5kcyAqLworCUNIS19ORVEoc3RhZ2luZy0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0ssCisJCWFjdGl2ZS0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOworCisJLyogQ2hlY2sgaWYgd2UgYXJlIHN3aXRjaGluZyBhc3NvY2lhdGlvbiB0b2dnbGUgKi8KKwlDSEtfTkVRKHN0YWdpbmctPmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSywKKwkJYWN0aXZlLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOworCisjdW5kZWYgQ0hLCisjdW5kZWYgQ0hLX05FUQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2Z1bGxfcnhvbl9yZXF1aXJlZCk7CisKK3U4CitpbF9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJLyoKKwkgKiBBc3NpZ24gdGhlIGxvd2VzdCByYXRlIC0tIHNob3VsZCByZWFsbHkgZ2V0IHRoaXMgZnJvbQorCSAqIHRoZSBiZWFjb24gc2tiIGZyb20gbWFjODAyMTEuCisJICovCisJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKKwkJcmV0dXJuIFJBVEVfMU1fUExDUDsKKwllbHNlCisJCXJldHVybiBSQVRFXzZNX1BMQ1A7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9sb3dlc3RfcGxjcCk7CisKK3N0YXRpYyB2b2lkCitfaWxfc2V0X3J4b25faHQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mLAorCQlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCWlmICghY3R4LT5odC5lbmFibGVkKSB7CisJCXJ4b24tPmZsYWdzICY9CisJCSAgICB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0sgfAorCQkgICAgICBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSyB8IFJYT05fRkxHX0hUNDBfUFJPVF9NU0sKKwkJICAgICAgfCBSWE9OX0ZMR19IVF9QUk9UX01TSyk7CisJCXJldHVybjsKKwl9CisKKwlyeG9uLT5mbGFncyB8PQorCSAgICBjcHVfdG9fbGUzMihjdHgtPmh0LnByb3RlY3Rpb24gPDwgUlhPTl9GTEdfSFRfT1BFUkFUSU5HX01PREVfUE9TKTsKKworCS8qIFNldCB1cCBjaGFubmVsIGJhbmR3aWR0aDoKKwkgKiAyMCBNSHogb25seSwgMjAvNDAgbWl4ZWQgb3IgcHVyZSA0MCBpZiBodDQwIG9rICovCisJLyogY2xlYXIgdGhlIEhUIGNoYW5uZWwgbW9kZSBiZWZvcmUgc2V0IHRoZSBtb2RlICovCisJcnhvbi0+ZmxhZ3MgJj0KKwkgICAgfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spOworCWlmIChpbF9pc19odDQwX3R4X2FsbG93ZWQoaWwsIGN0eCwgTlVMTCkpIHsKKwkJLyogcHVyZSBodDQwICovCisJCWlmIChjdHgtPmh0LnByb3RlY3Rpb24gPT0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl8yME1IWikgeworCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDA7CisJCQkvKiBOb3RlOiBjb250cm9sIGNoYW5uZWwgaXMgb3Bwb3NpdGUgb2YgZXh0ZW5zaW9uIGNoYW5uZWwgKi8KKwkJCXN3aXRjaCAoY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpIHsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CisJCQkJcnhvbi0+ZmxhZ3MgJj0KKwkJCQkgICAgflJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOworCQkJCWJyZWFrOworCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE5vdGU6IGNvbnRyb2wgY2hhbm5lbCBpcyBvcHBvc2l0ZSBvZiBleHRlbnNpb24gY2hhbm5lbCAqLworCQkJc3dpdGNoIChjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCkgeworCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKKwkJCQlyeG9uLT5mbGFncyAmPQorCQkJCSAgICB+KFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKTsKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgorCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOworCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORToKKwkJCWRlZmF1bHQ6CisJCQkJLyogY2hhbm5lbCBsb2NhdGlvbiBvbmx5IHZhbGlkIGlmIGluIE1peGVkIG1vZGUgKi8KKwkJCQlJTF9FUlIoImludmFsaWQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1k7CisJfQorCisJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwlEX0FTU09DKCJyeG9uIGZsYWdzIDB4JVggb3BlcmF0aW9uIG1vZGUgOjB4JVggIgorCQkiZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IDB4JXhcbiIsIGxlMzJfdG9fY3B1KHJ4b24tPmZsYWdzKSwKKwkJY3R4LT5odC5wcm90ZWN0aW9uLCBjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Cit9CisKK3ZvaWQKK2lsX3NldF9yeG9uX2h0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZikKK3sKKwlfaWxfc2V0X3J4b25faHQoaWwsIGh0X2NvbmYsICZpbC0+Y3R4KTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25faHQpOworCisvKiBSZXR1cm4gdmFsaWQsIHVudXNlZCwgY2hhbm5lbCBmb3IgYSBwYXNzaXZlIHNjYW4gdG8gcmVzZXQgdGhlIFJGICovCit1OAoraWxfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCWludCBpOworCXU4IGNoYW5uZWwgPSAwOworCXU4IG1pbiwgbWF4OworCisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQltaW4gPSAxNDsKKwkJbWF4ID0gaWwtPmNoYW5uZWxfY291bnQ7CisJfSBlbHNlIHsKKwkJbWluID0gMDsKKwkJbWF4ID0gMTQ7CisJfQorCisJZm9yIChpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKKwkJY2hhbm5lbCA9IGlsLT5jaGFubmVsX2luZm9baV0uY2hhbm5lbDsKKwkJaWYgKGNoYW5uZWwgPT0gbGUxNl90b19jcHUoaWwtPmN0eC5zdGFnaW5nLmNoYW5uZWwpKQorCQkJY29udGludWU7CisKKwkJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGJhbmQsIGNoYW5uZWwpOworCQlpZiAoaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjaGFubmVsOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKTsKKworLyoqCisgKiBpbF9zZXRfcnhvbl9jaGFubmVsIC0gU2V0IHRoZSBiYW5kIGFuZCBjaGFubmVsIHZhbHVlcyBpbiBzdGFnaW5nIFJYT04KKyAqIEBjaDogcmVxdWVzdGVkIGNoYW5uZWwgYXMgYSBwb2ludGVyIHRvIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorCisgKiBOT1RFOiAgRG9lcyBub3QgY29tbWl0IHRvIHRoZSBoYXJkd2FyZTsgaXQgc2V0cyBhcHByb3ByaWF0ZSBiaXQgZmllbGRzCisgKiBpbiB0aGUgc3RhZ2luZyBSWE9OIGZsYWcgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBjaC0+YmFuZAorICovCitpbnQKK2lsX3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoLAorCQkgICAgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGNoLT5iYW5kOworCXUxNiBjaGFubmVsID0gY2gtPmh3X3ZhbHVlOworCisJaWYgKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSA9PSBjaGFubmVsICYmIGlsLT5iYW5kID09IGJhbmQpCisJCXJldHVybiAwOworCisJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKwlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX0JBTkRfMjRHX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0s7CisKKwlpbC0+YmFuZCA9IGJhbmQ7CisKKwlEX0lORk8oIlN0YWdpbmcgY2hhbm5lbCBzZXQgdG8gJWQgWyVkXVxuIiwgY2hhbm5lbCwgYmFuZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3J4b25fY2hhbm5lbCk7CisKK3ZvaWQKK2lsX3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9CisJCSAgICB+KFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8CisJCSAgICAgIFJYT05fRkxHX0NDS19NU0spOworCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfSBlbHNlIHsKKwkJLyogQ29waWVkIGZyb20gaWxfcG9zdF9hc3NvY2lhdGUoKSAqLworCQlpZiAodmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX0JBTkRfMjRHX01TSzsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19DQ0tfTVNLOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X2ZsYWdzX2Zvcl9iYW5kKTsKKworLyoKKyAqIGluaXRpYWxpemUgcnhvbiBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmcm9tIGVlcHJvbQorICovCit2b2lkCitpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisKKwltZW1zZXQoJmN0eC0+c3RhZ2luZywgMCwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOworCisJaWYgKCFjdHgtPnZpZikgeworCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPnVudXNlZF9kZXZ0eXBlOworCX0gZWxzZQorCQlzd2l0Y2ggKGN0eC0+dmlmLT50eXBlKSB7CisKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT5zdGF0aW9uX2RldnR5cGU7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0gUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CisJCQlicmVhazsKKworCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT5pYnNzX2RldnR5cGU7CisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0KKwkJCSAgICBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyB8CisJCQkgICAgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0s7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJSUxfRVJSKCJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSAlZFxuIiwKKwkJCSAgICAgICBjdHgtPnZpZi0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCisjaWYgMAorCS8qIFRPRE86ICBGaWd1cmUgb3V0IHdoZW4gc2hvcnRfcHJlYW1ibGUgd291bGQgYmUgc2V0IGFuZCBjYWNoZSBmcm9tCisJICogdGhhdCAqLworCWlmICghaHdfdG9fbG9jYWwoaWwtPmh3KS0+c2hvcnRfcHJlYW1ibGUpCisJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCWVsc2UKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKyNlbmRpZgorCisJY2hfaW5mbyA9CisJICAgIGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGlsLT5iYW5kLCBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSk7CisKKwlpZiAoIWNoX2luZm8pCisJCWNoX2luZm8gPSAmaWwtPmNoYW5uZWxfaW5mb1swXTsKKworCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hfaW5mby0+Y2hhbm5lbCk7CisJaWwtPmJhbmQgPSBjaF9pbmZvLT5iYW5kOworCisJaWxfc2V0X2ZsYWdzX2Zvcl9iYW5kKGlsLCBjdHgsIGlsLT5iYW5kLCBjdHgtPnZpZik7CisKKwljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9CisJICAgIChJTF9PRkRNX1JBVEVTX01BU0sgPj4gSUxfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7CisJY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9CisJICAgIChJTF9DQ0tfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9DQ0tfUkFURSkgJiAweEY7CisKKwkvKiBjbGVhciBib3RoIE1JWCBhbmQgUFVSRTQwIG1vZGUgZmxhZyAqLworCWN0eC0+c3RhZ2luZy5mbGFncyAmPQorCSAgICB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRCB8IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QVVJFXzQwKTsKKwlpZiAoY3R4LT52aWYpCisJCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLCBjdHgtPnZpZi0+YWRkciwgRVRIX0FMRU4pOworCisJY3R4LT5zdGFnaW5nLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyA9IDB4ZmY7CisJY3R4LT5zdGFnaW5nLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOworfQorRVhQT1JUX1NZTUJPTChpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKTsKKwordm9pZAoraWxfc2V0X3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmh3ID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7CisJaW50IGk7CisKKwlodyA9IGlsX2dldF9od19tb2RlKGlsLCBpbC0+YmFuZCk7CisJaWYgKCFodykgeworCQlJTF9FUlIoIkZhaWxlZCB0byBzZXQgcmF0ZTogdW5hYmxlIHRvIGdldCBodyBtb2RlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5hY3RpdmVfcmF0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHctPm5fYml0cmF0ZXM7IGkrKykgeworCQlyYXRlID0gJihody0+Yml0cmF0ZXNbaV0pOworCQlpZiAocmF0ZS0+aHdfdmFsdWUgPCBSQVRFX0NPVU5UX0xFR0FDWSkKKwkJCWlsLT5hY3RpdmVfcmF0ZSB8PSAoMSA8PCByYXRlLT5od192YWx1ZSk7CisJfQorCisJRF9SQVRFKCJTZXQgYWN0aXZlX3JhdGUgPSAlMHhcbiIsIGlsLT5hY3RpdmVfcmF0ZSk7CisKKwlpbC0+Y3R4LnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KKwkgICAgKElMX0NDS19CQVNJQ19SQVRFU19NQVNLID4+IElMX0ZJUlNUX0NDS19SQVRFKSAmIDB4RjsKKworCWlsLT5jdHguc3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkgICAgKElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3JhdGUpOworCit2b2lkCitpbF9jaHN3aXRjaF9kb25lKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBpc19zdWNjZXNzKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBpc19zdWNjZXNzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfY2hzd2l0Y2hfZG9uZSk7CisKK3ZvaWQKK2lsX2hkbF9jc2Eoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfY3NhX25vdGlmaWNhdGlvbiAqY3NhID0gJihwa3QtPnUuY3NhX25vdGlmKTsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCisJaWYgKCF0ZXN0X2JpdChTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IGlsLT5zd2l0Y2hfY2hhbm5lbCkgeworCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOworCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJRF8xMUgoIkNTQSBub3RpZjogY2hhbm5lbCAlZFxuIiwgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7CisJCWlsX2Noc3dpdGNoX2RvbmUoaWwsIHRydWUpOworCX0gZWxzZSB7CisJCUlMX0VSUigiQ1NBIG5vdGlmIChmYWlsKSA6IGNoYW5uZWwgJWRcbiIsCisJCSAgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKKwkJaWxfY2hzd2l0Y2hfZG9uZShpbCwgZmFsc2UpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfaGRsX2NzYSk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3ZvaWQKK2lsX3ByaW50X3J4X2NvbmZpZ19jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKworCURfUkFESU8oIlJYIENPTkZJRzpcbiIpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9SQURJTywgKHU4ICopIHJ4b24sIHNpemVvZigqcnhvbikpOworCURfUkFESU8oInUxNiBjaGFubmVsOiAweCV4XG4iLCBsZTE2X3RvX2NwdShyeG9uLT5jaGFubmVsKSk7CisJRF9SQURJTygidTMyIGZsYWdzOiAweCUwOFhcbiIsIGxlMzJfdG9fY3B1KHJ4b24tPmZsYWdzKSk7CisJRF9SQURJTygidTMyIGZpbHRlcl9mbGFnczogMHglMDh4XG4iLCBsZTMyX3RvX2NwdShyeG9uLT5maWx0ZXJfZmxhZ3MpKTsKKwlEX1JBRElPKCJ1OCBkZXZfdHlwZTogMHgleFxuIiwgcnhvbi0+ZGV2X3R5cGUpOworCURfUkFESU8oInU4IG9mZG1fYmFzaWNfcmF0ZXM6IDB4JTAyeFxuIiwgcnhvbi0+b2ZkbV9iYXNpY19yYXRlcyk7CisJRF9SQURJTygidTggY2NrX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsIHJ4b24tPmNja19iYXNpY19yYXRlcyk7CisJRF9SQURJTygidThbNl0gbm9kZV9hZGRyOiAlcE1cbiIsIHJ4b24tPm5vZGVfYWRkcik7CisJRF9SQURJTygidThbNl0gYnNzaWRfYWRkcjogJXBNXG4iLCByeG9uLT5ic3NpZF9hZGRyKTsKKwlEX1JBRElPKCJ1MTYgYXNzb2NfaWQ6IDB4JXhcbiIsIGxlMTZfdG9fY3B1KHJ4b24tPmFzc29jX2lkKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3ByaW50X3J4X2NvbmZpZ19jbWQpOworI2VuZGlmCisvKioKKyAqIGlsX2lycV9oYW5kbGVfZXJyb3IgLSBjYWxsZWQgZm9yIEhXIG9yIFNXIGVycm9yIGludGVycnVwdCBmcm9tIGNhcmQKKyAqLwordm9pZAoraWxfaXJxX2hhbmRsZV9lcnJvcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogU2V0IHRoZSBGVyBlcnJvciBmbGFnIC0tIGNsZWFyZWQgb24gaWxfZG93biAqLworCXNldF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpOworCisJLyogQ2FuY2VsIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZC4gKi8KKwljbGVhcl9iaXQoU19IQ01EX0FDVElWRSwgJmlsLT5zdGF0dXMpOworCisJSUxfRVJSKCJMb2FkZWQgZmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pOworCisJaWwtPmNmZy0+b3BzLT5saWItPmR1bXBfbmljX2Vycm9yX2xvZyhpbCk7CisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKQorCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maChpbCwgTlVMTCwgZmFsc2UpOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgSUxfRExfRldfRVJST1JTKQorCQlpbF9wcmludF9yeF9jb25maWdfY21kKGlsLCAmaWwtPmN0eCk7CisjZW5kaWYKKworCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJLyogS2VlcCB0aGUgcmVzdGFydCBwcm9jZXNzIGZyb20gdHJ5aW5nIHRvIHNlbmQgaG9zdAorCSAqIGNvbW1hbmRzIGJ5IGNsZWFyaW5nIHRoZSBJTklUIHN0YXR1cyBiaXQgKi8KKwljbGVhcl9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpOworCisJaWYgKCF0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0RCRyhJTF9ETF9GV19FUlJPUlMsCisJCSAgICAgICAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byB1Q29kZSBlcnJvci5cbiIpOworCisJCWlmIChpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KQorCQkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfaXJxX2hhbmRsZV9lcnJvcik7CisKK3N0YXRpYyBpbnQKK2lsX2FwbV9zdG9wX21hc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBzdG9wIGRldmljZSdzIGJ1c21hc3RlciBETUEgYWN0aXZpdHkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19TVE9QX01BU1RFUik7CisKKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX01BU1RFUl9ESVNBQkxFRCwKKwkJCSBDU1JfUkVTRVRfUkVHX0ZMQUdfTUFTVEVSX0RJU0FCTEVELCAxMDApOworCWlmIChyZXQpCisJCUlMX1dBUk4oIk1hc3RlciBEaXNhYmxlIFRpbWVkIE91dCwgMTAwIHVzZWNcbiIpOworCisJRF9JTkZPKCJzdG9wIG1hc3RlclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbF9hcG1fc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJRF9JTkZPKCJTdG9wIGNhcmQsIHB1dCBpbiBsb3cgcG93ZXIgc3RhdGVcbiIpOworCisJLyogU3RvcCBkZXZpY2UncyBETUEgYWN0aXZpdHkgKi8KKwlpbF9hcG1fc3RvcF9tYXN0ZXIoaWwpOworCisJLyogUmVzZXQgdGhlIGVudGlyZSBkZXZpY2UgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19TV19SRVNFVCk7CisKKwl1ZGVsYXkoMTApOworCisJLyoKKwkgKiBDbGVhciAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgZnJvbQorCSAqIEQwQSogKHBvd2VyZWQtdXAgQWN0aXZlKSAtLT4gRDBVKiAoVW5pbml0aWFsaXplZCkgc3RhdGUuCisJICovCisJaWxfY2xlYXJfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOworfQorRVhQT1JUX1NZTUJPTChpbF9hcG1fc3RvcCk7CisKKy8qCisgKiBTdGFydCB1cCBOSUMncyBiYXNpYyBmdW5jdGlvbmFsaXR5IGFmdGVyIGl0IGhhcyBiZWVuIHJlc2V0CisgKiAoZS5nLiBhZnRlciBwbGF0Zm9ybSBib290LCBvciBzaHV0ZG93biB2aWEgaWxfYXBtX3N0b3AoKSkKKyAqIE5PVEU6ICBUaGlzIGRvZXMgbm90IGxvYWQgdUNvZGUgbm9yIHN0YXJ0IHRoZSBlbWJlZGRlZCBwcm9jZXNzb3IKKyAqLworaW50CitpbF9hcG1faW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IDA7CisJdTE2IGxjdGw7CisKKwlEX0lORk8oIkluaXQgY2FyZCdzIGJhc2ljIGZ1bmN0aW9uc1xuIik7CisKKwkvKgorCSAqIFVzZSAic2V0X2JpdCIgYmVsb3cgcmF0aGVyIHRoYW4gIndyaXRlIiwgdG8gcHJlc2VydmUgYW55IGhhcmR3YXJlCisJICogYml0cyBhbHJlYWR5IHNldCBieSBkZWZhdWx0IGFmdGVyIHJlc2V0LgorCSAqLworCisJLyogRGlzYWJsZSBMMFMgZXhpdCB0aW1lciAocGxhdGZvcm0gTk1JIFdvcmsvQXJvdW5kKSAqLworCWlsX3NldF9iaXQoaWwsIENTUl9HSU9fQ0hJQ0tFTl9CSVRTLAorCQkgICBDU1JfR0lPX0NISUNLRU5fQklUU19SRUdfQklUX0RJU19MMFNfRVhJVF9USU1FUik7CisKKwkvKgorCSAqIERpc2FibGUgTDBzIHdpdGhvdXQgYWZmZWN0aW5nIEwxOworCSAqICBkb24ndCB3YWl0IGZvciBJQ0ggTDBzIChJQ0ggYnVnIFcvQSkKKwkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfR0lPX0NISUNLRU5fQklUUywKKwkJICAgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYKTsKKworCS8qIFNldCBGSCB3YWl0IHRocmVzaG9sZCB0byBtYXhpbXVtIChIVyBlcnJvciBkdXJpbmcgc3RyZXNzIFcvQSkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfREJHX0hQRVRfTUVNX1JFRywgQ1NSX0RCR19IUEVUX01FTV9SRUdfVkFMKTsKKworCS8qCisJICogRW5hYmxlIEhBUCBJTlRBIChpbnRlcnJ1cHQgZnJvbSBtYW5hZ2VtZW50IGJ1cykgdG8KKwkgKiB3YWtlIGRldmljZSdzIFBDSSBFeHByZXNzIGxpbmsgTDFhIC0+IEwwcworCSAqIE5PVEU6ICBUaGlzIGlzIG5vLW9wIGZvciAzOTQ1IChub24tZXhpc3RlbnQgYml0KQorCSAqLworCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfSEFQX1dBS0VfTDFBKTsKKworCS8qCisJICogSFcgYnVnIFcvQSBmb3IgaW5zdGFiaWxpdHkgaW4gUENJZSBidXMgTDAtPkwwUy0+TDEgdHJhbnNpdGlvbi4KKwkgKiBDaGVjayBpZiBCSU9TIChvciBPUykgZW5hYmxlZCBMMS1BU1BNIG9uIHRoaXMgZGV2aWNlLgorCSAqIElmIHNvIChsaWtlbHkpLCBkaXNhYmxlIEwwUywgc28gZGV2aWNlIG1vdmVzIGRpcmVjdGx5IEwwLT5MMTsKKwkgKiAgICBjb3N0cyBuZWdsaWdpYmxlIGFtb3VudCBvZiBwb3dlciBzYXZpbmdzLgorCSAqIElmIG5vdCAodW5saWtlbHkpLCBlbmFibGUgTDBTLCBzbyB0aGVyZSBpcyBhdCBsZWFzdCBzb21lCisJICogICAgcG93ZXIgc2F2aW5ncywgZXZlbiB3aXRob3V0IEwxLgorCSAqLworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2V0X2wwcykgeworCQlsY3RsID0gaWxfcGNpZV9saW5rX2N0bChpbCk7CisJCWlmICgobGN0bCAmIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgPT0KKwkJICAgIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgeworCQkJLyogTDEtQVNQTSBlbmFibGVkOyBkaXNhYmxlKCEpIEwwUyAgKi8KKwkJCWlsX3NldF9iaXQoaWwsIENTUl9HSU9fUkVHLAorCQkJCSAgIENTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7CisJCQlEX1BPV0VSKCJMMSBFbmFibGVkOyBEaXNhYmxpbmcgTDBTXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEwxLUFTUE0gZGlzYWJsZWQ7IGVuYWJsZSghKSBMMFMgKi8KKwkJCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0dJT19SRUcsCisJCQkJICAgICBDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOworCQkJRF9QT1dFUigiTDEgRGlzYWJsZWQ7IEVuYWJsaW5nIEwwU1xuIik7CisJCX0KKwl9CisKKwkvKiBDb25maWd1cmUgYW5hbG9nIHBoYXNlLWxvY2stbG9vcCBiZWZvcmUgYWN0aXZhdGluZyB0byBEMEEgKi8KKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQorCQlpbF9zZXRfYml0KGlsLCBDU1JfQU5BX1BMTF9DRkcsCisJCQkgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxsX2NmZ192YWwpOworCisJLyoKKwkgKiBTZXQgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KKwkgKiBEMFUqIC0tPiBEMEEqIChwb3dlcmVkLXVwIGFjdGl2ZSkgc3RhdGUuCisJICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKKworCS8qCisJICogV2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbjsgb25jZSBzdGFiaWxpemVkLCBhY2Nlc3MgdG8KKwkgKiBkZXZpY2UtaW50ZXJuYWwgcmVzb3VyY2VzIGlzIHN1cHBvcnRlZCwgZS5nLiBpbF93cl9wcnBoKCkKKwkgKiBhbmQgYWNjZXNzZXMgdG8gdUNvZGUgU1JBTS4KKwkgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9HUF9DTlRSTCwKKwkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAorCQkJIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQ0xPQ0tfUkVBRFksIDI1MDAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlEX0lORk8oIkZhaWxlZCB0byBpbml0IHRoZSBjYXJkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBFbmFibGUgRE1BIGFuZCBCU00gKGlmIHVzZWQpIGNsb2Nrcywgd2FpdCBmb3IgdGhlbSB0byBzdGFiaWxpemUuCisJICogQlNNIChCb29zdHJhcCBTdGF0ZSBNYWNoaW5lKSBpcyBvbmx5IGluIDM5NDUgYW5kIDQ5NjUuCisJICoKKwkgKiBXcml0ZSB0byAiQ0xLX0VOX1JFRyI7ICIxIiBiaXRzIGVuYWJsZSBjbG9ja3MsIHdoaWxlICIwIiBiaXRzCisJICogZG8gbm90IGRpc2FibGUgY2xvY2tzLiAgVGhpcyBwcmVzZXJ2ZXMgYW55IGhhcmR3YXJlIGJpdHMgYWxyZWFkeQorCSAqIHNldCBieSBkZWZhdWx0IGluICJDTEtfQ1RSTF9SRUciIGFmdGVyIHJlc2V0LgorCSAqLworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+dXNlX2JzbSkKKwkJaWxfd3JfcHJwaChpbCwgQVBNR19DTEtfRU5fUkVHLAorCQkJICAgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUIHwgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUKTsKKwllbHNlCisJCWlsX3dyX3BycGgoaWwsIEFQTUdfQ0xLX0VOX1JFRywgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUKTsKKwl1ZGVsYXkoMjApOworCisJLyogRGlzYWJsZSBMMS1BY3RpdmUgKi8KKwlpbF9zZXRfYml0c19wcnBoKGlsLCBBUE1HX1BDSURFVl9TVFRfUkVHLAorCQkJIEFQTUdfUENJREVWX1NUVF9WQUxfTDFfQUNUX0RJUyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9hcG1faW5pdCk7CisKK2ludAoraWxfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpCit7CisJaW50IHJldDsKKwlzOCBwcmV2X3R4X3Bvd2VyOworCWJvb2wgZGVmZXI7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKGlsLT50eF9wb3dlcl91c2VyX2xtdCA9PSB0eF9wb3dlciAmJiAhZm9yY2UpCisJCXJldHVybiAwOworCisJaWYgKCFpbC0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogMCBkQm0gbWVhbiAxIG1pbGxpd2F0dCAqLworCWlmICh0eF9wb3dlciA8IDApIHsKKwkJSUxfV0FSTigiUmVxdWVzdGVkIHVzZXIgVFhQT1dFUiAlZCBiZWxvdyAxIG1XLlxuIiwgdHhfcG93ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHhfcG93ZXIgPiBpbC0+dHhfcG93ZXJfZGV2aWNlX2xtdCkgeworCQlJTF9XQVJOKCJSZXF1ZXN0ZWQgdXNlciBUWFBPV0VSICVkIGFib3ZlIHVwcGVyIGxpbWl0ICVkLlxuIiwKKwkJCXR4X3Bvd2VyLCBpbC0+dHhfcG93ZXJfZGV2aWNlX2xtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNjYW4gY29tcGxldGUgYW5kIGNvbW1pdF9yeG9uIHVzZSB0eF9wb3dlcl9uZXh0IHZhbHVlLAorCSAqIGl0IGFsd2F5cyBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIG5ld2VzdCByZXF1ZXN0ICovCisJaWwtPnR4X3Bvd2VyX25leHQgPSB0eF9wb3dlcjsKKworCS8qIGRvIG5vdCBzZXQgdHggcG93ZXIgd2hlbiBzY2FubmluZyBvciBjaGFubmVsIGNoYW5naW5nICovCisJZGVmZXIgPSB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgbWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOworCWlmIChkZWZlciAmJiAhZm9yY2UpIHsKKwkJRF9JTkZPKCJEZWZlcnJpbmcgdHggcG93ZXIgc2V0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJldl90eF9wb3dlciA9IGlsLT50eF9wb3dlcl91c2VyX2xtdDsKKwlpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPSB0eF9wb3dlcjsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKKworCS8qIGlmIGZhaWwgdG8gc2V0IHR4X3Bvd2VyLCByZXN0b3JlIHRoZSBvcmlnLiB0eCBwb3dlciAqLworCWlmIChyZXQpIHsKKwkJaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID0gcHJldl90eF9wb3dlcjsKKwkJaWwtPnR4X3Bvd2VyX25leHQgPSBwcmV2X3R4X3Bvd2VyOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZXRfdHhfcG93ZXIpOworCit2b2lkCitpbF9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2J0X2NtZCBidF9jbWQgPSB7CisJCS5sZWFkX3RpbWUgPSBCVF9MRUFEX1RJTUVfREVGLAorCQkubWF4X2tpbGwgPSBCVF9NQVhfS0lMTF9ERUYsCisJCS5raWxsX2Fja19tYXNrID0gMCwKKwkJLmtpbGxfY3RzX21hc2sgPSAwLAorCX07CisKKwlpZiAoIWJ0X2NvZXhfYWN0aXZlKQorCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0RJU0FCTEU7CisJZWxzZQorCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0VOQUJMRTsKKworCURfSU5GTygiQlQgY29leCAlc1xuIiwKKwkgICAgICAgKGJ0X2NtZC5mbGFncyA9PSBCVF9DT0VYX0RJU0FCTEUpID8gImRpc2FibGUiIDogImFjdGl2ZSIpOworCisJaWYgKGlsX3NlbmRfY21kX3BkdShpbCwgQ19CVF9DT05GSUcsIHNpemVvZihzdHJ1Y3QgaWxfYnRfY21kKSwgJmJ0X2NtZCkpCisJCUlMX0VSUigiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2J0X2NvbmZpZyk7CisKK2ludAoraWxfc2VuZF9zdGF0c19yZXF1ZXN0KHN0cnVjdCBpbF9wcml2ICppbCwgdTggZmxhZ3MsIGJvb2wgY2xlYXIpCit7CisJc3RydWN0IGlsX3N0YXRzX2NtZCBzdGF0c19jbWQgPSB7CisJCS5jb25maWd1cmF0aW9uX2ZsYWdzID0gY2xlYXIgPyBJTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIDogMCwKKwl9OworCisJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQorCQlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBDX1NUQVRTLCBzaXplb2Yoc3RydWN0IGlsX3N0YXRzX2NtZCksCisJCQkJCSAgICAgJnN0YXRzX2NtZCwgTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1NUQVRTLCBzaXplb2Yoc3RydWN0IGlsX3N0YXRzX2NtZCksCisJCQkJICAgICAgICZzdGF0c19jbWQpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX3N0YXRzX3JlcXVlc3QpOworCit2b2lkCitpbF9oZGxfcG1fc2xlZXAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2xlZXBfbm90aWZpY2F0aW9uICpzbGVlcCA9ICYocGt0LT51LnNsZWVwX25vdGlmKTsKKwlEX1JYKCJzbGVlcCBtb2RlOiAlZCwgc3JjOiAlZFxuIiwKKwkgICAgIHNsZWVwLT5wbV9zbGVlcF9tb2RlLCBzbGVlcC0+cG1fd2FrZXVwX3NyYyk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woaWxfaGRsX3BtX3NsZWVwKTsKKwordm9pZAoraWxfaGRsX3BtX2RlYnVnX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTMyIGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0s7CisJRF9SQURJTygiRHVtcGluZyAlZCBieXRlcyBvZiB1bmhhbmRsZWQgbm90aWZpY2F0aW9uIGZvciAlczpcbiIsIGxlbiwKKwkJaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1JBRElPLCBwa3QtPnUucmF3LCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChpbF9oZGxfcG1fZGVidWdfc3RhdHMpOworCit2b2lkCitpbF9oZGxfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCUlMX0VSUigiRXJyb3IgUmVwbHkgdHlwZSAweCUwOFggY21kICVzICgweCUwMlgpICIKKwkgICAgICAgInNlcSAweCUwNFggc2VyIDB4JTA4WFxuIiwKKwkgICAgICAgbGUzMl90b19jcHUocGt0LT51LmVycl9yZXNwLmVycm9yX3R5cGUpLAorCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhwa3QtPnUuZXJyX3Jlc3AuY21kX2lkKSwKKwkgICAgICAgcGt0LT51LmVycl9yZXNwLmNtZF9pZCwKKwkgICAgICAgbGUxNl90b19jcHUocGt0LT51LmVycl9yZXNwLmJhZF9jbWRfc2VxX251bSksCisJICAgICAgIGxlMzJfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5lcnJvcl9pbmZvKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2hkbF9lcnJvcik7CisKK3ZvaWQKK2lsX2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbWVtc2V0KCZpbC0+aXNyX3N0YXRzLCAwLCBzaXplb2YoaWwtPmlzcl9zdGF0cykpOworfQorCitpbnQKK2lsX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCisJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcTsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHF1ZXVlID49IEFDX05VTSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIHF1ZXVlID49IEFDX05VTSAlZFxuIiwgcXVldWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlxID0gQUNfTlVNIC0gMSAtIHF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbC0+Y3R4LnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19taW4gPQorCSAgICBjcHVfdG9fbGUxNihwYXJhbXMtPmN3X21pbik7CisJaWwtPmN0eC5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWF4ID0KKwkgICAgY3B1X3RvX2xlMTYocGFyYW1zLT5jd19tYXgpOworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmFpZnNuID0gcGFyYW1zLT5haWZzOworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmVkY2FfdHhvcCA9CisJICAgIGNwdV90b19sZTE2KChwYXJhbXMtPnR4b3AgKiAzMikpOworCisJaWwtPmN0eC5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0ucmVzZXJ2ZWQxID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19jb25mX3R4KTsKKworaW50CitpbF9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlyZXR1cm4gaWwtPmlic3NfbWFuYWdlciA9PSBJTF9JQlNTX01BTkFHRVI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9tYWNfdHhfbGFzdF9iZWFjb24pOworCitzdGF0aWMgaW50CitpbF9zZXRfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKGlsLCBjdHgpOworCisJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwlyZXR1cm4gaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsX3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7CisJaW50IGVycjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwkvKgorCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKKwkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCisJICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgorCSAqLworCWlsLT5pd19tb2RlID0gdmlmLT50eXBlOworCisJY3R4LT5pc19hY3RpdmUgPSB0cnVlOworCisJZXJyID0gaWxfc2V0X21vZGUoaWwsIGN0eCk7CisJaWYgKGVycikgeworCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKKwkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWxfbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlpbnQgZXJyOworCXUzMiBtb2RlczsKKworCURfTUFDODAyMTEoImVudGVyOiB0eXBlICVkLCBhZGRyICVwTVxuIiwgdmlmLT50eXBlLCB2aWYtPmFkZHIpOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCUlMX1dBUk4oIlRyeSB0byBhZGQgaW50ZXJmYWNlIHdoZW4gZGV2aWNlIG5vdCByZWFkeVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGNoZWNrIGlmIGJ1c3kgY29udGV4dCBpcyBleGNsdXNpdmUgKi8KKwlpZiAoaWwtPmN0eC52aWYgJiYKKwkgICAgKGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChpbC0+Y3R4LnZpZi0+dHlwZSkpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCW1vZGVzID0gaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXMgfCBpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisJaWYgKCEobW9kZXMgJiBCSVQodmlmLT50eXBlKSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCXZpZl9wcml2LT5jdHggPSAmaWwtPmN0eDsKKwlpbC0+Y3R4LnZpZiA9IHZpZjsKKworCWVyciA9IGlsX3NldHVwX2ludGVyZmFjZShpbCwgJmlsLT5jdHgpOworCWlmIChlcnIpIHsKKwkJaWwtPmN0eC52aWYgPSBOVUxMOworCQlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19hZGRfaW50ZXJmYWNlKTsKKworc3RhdGljIHZvaWQKK2lsX3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgIGJvb2wgbW9kZV9jaGFuZ2UpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoaWwtPnNjYW5fdmlmID09IHZpZikgeworCQlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCQlpbF9mb3JjZV9zY2FuX2VuZChpbCk7CisJfQorCisJaWYgKCFtb2RlX2NoYW5nZSkgeworCQlpbF9zZXRfbW9kZShpbCwgY3R4KTsKKwkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCisJCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOworCX0KK30KKwordm9pZAoraWxfbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlXQVJOX09OKGN0eC0+dmlmICE9IHZpZik7CisJY3R4LT52aWYgPSBOVUxMOworCisJaWxfdGVhcmRvd25faW50ZXJmYWNlKGlsLCB2aWYsIGZhbHNlKTsKKworCW1lbXNldChpbC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX3JlbW92ZV9pbnRlcmZhY2UpOworCitpbnQKK2lsX2FsbG9jX3R4cV9tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmICghaWwtPnR4cSkKKwkJaWwtPnR4cSA9CisJCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfdHhfcXVldWUpICoKKwkJCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbC0+dHhxKSB7CisJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgZm9yIHR4cVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfYWxsb2NfdHhxX21lbSk7CisKK3ZvaWQKK2lsX3R4cV9tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT50eHEpOworCWlsLT50eHEgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF90eHFfbWVtKTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisKKyNkZWZpbmUgSUxfVFJBRkZJQ19EVU1QX1NJWkUJKElMX1RSQUZGSUNfRU5UUllfU0laRSAqIElMX1RSQUZGSUNfRU5UUklFUykKKwordm9pZAoraWxfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT50eF90cmFmZmljX2lkeCA9IDA7CisJaWwtPnJ4X3RyYWZmaWNfaWR4ID0gMDsKKwlpZiAoaWwtPnR4X3RyYWZmaWMpCisJCW1lbXNldChpbC0+dHhfdHJhZmZpYywgMCwgSUxfVFJBRkZJQ19EVU1QX1NJWkUpOworCWlmIChpbC0+cnhfdHJhZmZpYykKKwkJbWVtc2V0KGlsLT5yeF90cmFmZmljLCAwLCBJTF9UUkFGRklDX0RVTVBfU0laRSk7Cit9CisKK2ludAoraWxfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiB0cmFmZmljX3NpemUgPSBJTF9UUkFGRklDX0RVTVBfU0laRTsKKworCWlmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1RYKSB7CisJCWlmICghaWwtPnR4X3RyYWZmaWMpIHsKKwkJCWlsLT50eF90cmFmZmljID0ga3phbGxvYyh0cmFmZmljX3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbC0+dHhfdHJhZmZpYykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlpZiAoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9SWCkgeworCQlpZiAoIWlsLT5yeF90cmFmZmljKSB7CisJCQlpbC0+cnhfdHJhZmZpYyA9IGt6YWxsb2ModHJhZmZpY19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghaWwtPnJ4X3RyYWZmaWMpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWxfcmVzZXRfdHJhZmZpY19sb2coaWwpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9hbGxvY190cmFmZmljX21lbSk7CisKK3ZvaWQKK2lsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWtmcmVlKGlsLT50eF90cmFmZmljKTsKKwlpbC0+dHhfdHJhZmZpYyA9IE5VTEw7CisKKwlrZnJlZShpbC0+cnhfdHJhZmZpYyk7CisJaWwtPnJ4X3RyYWZmaWMgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF9mcmVlX3RyYWZmaWNfbWVtKTsKKwordm9pZAoraWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworCV9fbGUxNiBmYzsKKwl1MTYgbGVuOworCisJaWYgKGxpa2VseSghKGlsX2RlYnVnX2xldmVsICYgSUxfRExfVFgpKSkKKwkJcmV0dXJuOworCisJaWYgKCFpbC0+dHhfdHJhZmZpYykKKwkJcmV0dXJuOworCisJZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7CisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQlsZW4gPQorCQkgICAgKGxlbmd0aCA+CisJCSAgICAgSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSA/IElMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKKwkJbWVtY3B5KChpbC0+dHhfdHJhZmZpYyArCisJCQkoaWwtPnR4X3RyYWZmaWNfaWR4ICogSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSksIGhlYWRlciwKKwkJICAgICAgIGxlbik7CisJCWlsLT50eF90cmFmZmljX2lkeCA9CisJCSAgICAoaWwtPnR4X3RyYWZmaWNfaWR4ICsgMSkgJSBJTF9UUkFGRklDX0VOVFJJRVM7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUpOworCit2b2lkCitpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7CisJX19sZTE2IGZjOworCXUxNiBsZW47CisKKwlpZiAobGlrZWx5KCEoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9SWCkpKQorCQlyZXR1cm47CisKKwlpZiAoIWlsLT5yeF90cmFmZmljKQorCQlyZXR1cm47CisKKwlmYyA9IGhlYWRlci0+ZnJhbWVfY29udHJvbDsKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CisJCWxlbiA9CisJCSAgICAobGVuZ3RoID4KKwkJICAgICBJTF9UUkFGRklDX0VOVFJZX1NJWkUpID8gSUxfVFJBRkZJQ19FTlRSWV9TSVpFIDogbGVuZ3RoOworCQltZW1jcHkoKGlsLT5yeF90cmFmZmljICsKKwkJCShpbC0+cnhfdHJhZmZpY19pZHggKiBJTF9UUkFGRklDX0VOVFJZX1NJWkUpKSwgaGVhZGVyLAorCQkgICAgICAgbGVuKTsKKwkJaWwtPnJ4X3RyYWZmaWNfaWR4ID0KKwkJICAgIChpbC0+cnhfdHJhZmZpY19pZHggKyAxKSAlIElMX1RSQUZGSUNfRU5UUklFUzsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZSk7CisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X21nbXRfc3RyaW5nKGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVTUCk7CisJCUlMX0NNRChNQU5BR0VNRU5UX1JFQVNTT0NfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVRKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVTUCk7CisJCUlMX0NNRChNQU5BR0VNRU5UX0JFQUNPTik7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FUSU0pOworCQlJTF9DTUQoTUFOQUdFTUVOVF9ESVNBU1NPQyk7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FVVEgpOworCQlJTF9DTUQoTUFOQUdFTUVOVF9ERUFVVEgpOworCQlJTF9DTUQoTUFOQUdFTUVOVF9BQ1RJT04pOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisKKwl9Cit9CisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X2N0cmxfc3RyaW5nKGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwkJSUxfQ01EKENPTlRST0xfQkFDS19SRVEpOworCQlJTF9DTUQoQ09OVFJPTF9CQUNLKTsKKwkJSUxfQ01EKENPTlRST0xfUFNQT0xMKTsKKwkJSUxfQ01EKENPTlRST0xfUlRTKTsKKwkJSUxfQ01EKENPTlRST0xfQ1RTKTsKKwkJSUxfQ01EKENPTlRST0xfQUNLKTsKKwkJSUxfQ01EKENPTlRST0xfQ0ZFTkQpOworCQlJTF9DTUQoQ09OVFJPTF9DRkVOREFDSyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKworCX0KK30KKwordm9pZAoraWxfY2xlYXJfdHJhZmZpY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbWVtc2V0KCZpbC0+dHhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOworCW1lbXNldCgmaWwtPnJ4X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRyYWZmaWNfc3RhdHMpKTsKK30KKworLyoKKyAqIGlmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTIGRlZmluZWQsCisgKiBpbF91cGRhdGVfc3RhdHMgZnVuY3Rpb24gd2lsbAorICogcmVjb3JkIGFsbCB0aGUgTUdNVCwgQ1RSTCBhbmQgREFUQSBwa3QgZm9yIGJvdGggVFggYW5kIFJ4IHBhc3MKKyAqIFVzZSBkZWJ1Z0ZzIHRvIGRpc3BsYXkgdGhlIHJ4L3J4X3N0YXRzCisgKiBpZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUyBub3QgYmVpbmcgZGVmaW5lZCwgdGhlbiBubyBNR01UIGFuZCBDVFJMCisgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY29yZGVkLCBidXQgREFUQSBwa3Qgc3RpbGwgd2lsbCBiZSByZWNvcmRlZAorICogZm9yIHRoZSByZWFzb24gb2YgaWxfbGVkLmMgbmVlZCB0byBjb250cm9sIHRoZSBsZWQgYmxpbmtpbmcgYmFzZWQgb24KKyAqIG51bWJlciBvZiB0eCBhbmQgcnggZGF0YS4KKyAqCisgKi8KK3ZvaWQKK2lsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgdHJhZmZpY19zdGF0cyAqc3RhdHM7CisKKwlpZiAoaXNfdHgpCisJCXN0YXRzID0gJmlsLT50eF9zdGF0czsKKwllbHNlCisJCXN0YXRzID0gJmlsLT5yeF9zdGF0czsKKworCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKKwkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgeworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BU1NPQ19SRVFdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FTU09DX1JFU1BdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9SRUFTU09DX1JFUV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1ApOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9SRUFTU09DX1JFU1BdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUFJPQkVfUkVRXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9QUk9CRV9SRVNQXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0JFQUNPTl0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVElNKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVRJTV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0RJU0FTU09DXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BVVRIXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0RFQVVUSF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BQ1RJT05dKys7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX2N0bChmYykpIHsKKwkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgeworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CQUNLX1JFUSk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0JBQ0tfUkVRXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JBQ0spOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9CQUNLXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BTUE9MTCk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX1BTUE9MTF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SVFMpOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9SVFNdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ1RTKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQ1RTXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FDSyk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0FDS10rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DRkVORCk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NGRU5EXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQ0ZFTkRBQ0tdKys7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGRhdGEgKi8KKwkJc3RhdHMtPmRhdGFfY250Kys7CisJCXN0YXRzLT5kYXRhX2J5dGVzICs9IGxlbjsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX3VwZGF0ZV9zdGF0cyk7CisjZW5kaWYKKworaW50CitpbF9mb3JjZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZXh0ZXJuYWwpCit7CisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcmNlX3Jlc2V0ID0gJmlsLT5mb3JjZV9yZXNldDsKKwlmb3JjZV9yZXNldC0+cmVzZXRfcmVxdWVzdF9jb3VudCsrOworCWlmICghZXh0ZXJuYWwpIHsKKwkJaWYgKGZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyArCisJCQkgICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X2R1cmF0aW9uLCBqaWZmaWVzKSkgeworCQkJRF9JTkZPKCJmb3JjZSByZXNldCByZWplY3RlZFxuIik7CisJCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50Kys7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwlmb3JjZV9yZXNldC0+cmVzZXRfc3VjY2Vzc19jb3VudCsrOworCWZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOworCisJLyoKKwkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGV4dGVybmFsKGV4OiBkZWJ1Z2ZzKSwKKwkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQorCSAqIHBhcmFtZXRlciBzZXR0aW5nCisJICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBpbnRlcm5hbCAodUNvZGUgZXJyb3Igb3IgZHJpdmVyCisJICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgorCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCisJICovCisKKwlpZiAoIWV4dGVybmFsICYmICFpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KSB7CisJCURfSU5GTygiQ2FuY2VsIGZpcm13YXJlIHJlbG9hZCBiYXNlZCBvbiAiCisJCSAgICAgICAibW9kdWxlIHBhcmFtZXRlciBzZXR0aW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSUxfRVJSKCJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKKworCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGlsX2Rvd24gKi8KKwlzZXRfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKTsKKwl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKwkvKgorCSAqIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKKwkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0CisJICovCisJY2xlYXJfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKTsKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbF9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKwl1MzIgbW9kZXM7CisJaW50IGVycjsKKworCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWlmICghY3R4LT52aWYgfHwgIWlsX2lzX3JlYWR5X3JmKGlsKSkgeworCQkvKgorCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgorCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKKwkJICovCisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJbW9kZXMgPSBjdHgtPmludGVyZmFjZV9tb2RlcyB8IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKwlpZiAoIShtb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKGlsLT5jdHgudmlmLT50eXBlKSkgfHwKKwkgICAgKGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogc3VjY2VzcyAqLworCWlsX3RlYXJkb3duX2ludGVyZmFjZShpbCwgdmlmLCB0cnVlKTsKKwl2aWYtPnR5cGUgPSBuZXd0eXBlOworCXZpZi0+cDJwID0gbmV3cDJwOworCWVyciA9IGlsX3NldHVwX2ludGVyZmFjZShpbCwgY3R4KTsKKwlXQVJOX09OKGVycik7CisJLyoKKwkgKiBXZSd2ZSBzd2l0Y2hlZCBpbnRlcm5hbGx5LCBidXQgc3VibWl0dGluZyB0byB0aGUKKwkgKiBkZXZpY2UgbWF5IGhhdmUgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTWFzayB0aGlzCisJICogZXJyb3IsIGJlY2F1c2Ugb3RoZXJ3aXNlIG1hYzgwMjExIHdpbGwgbm90IHN3aXRjaAorCSAqIChhbmQgc2V0IHRoZSBpbnRlcmZhY2UgdHlwZSBiYWNrKSBhbmQgd2UnbGwgYmUKKwkgKiBvdXQgb2Ygc3luYyB3aXRoIGl0LgorCSAqLworCWVyciA9IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2UpOworCisvKgorICogT24gZXZlcnkgd2F0Y2hkb2cgdGljayB3ZSBjaGVjayAobGF0ZXN0KSB0aW1lIHN0YW1wLiBJZiBpdCBkb2VzIG5vdAorICogY2hhbmdlIGR1cmluZyB0aW1lb3V0IHBlcmlvZCBhbmQgcXVldWUgaXMgbm90IGVtcHR5IHdlIHJlc2V0IGZpcm13YXJlLgorICovCitzdGF0aWMgaW50CitpbF9jaGVja19zdHVja19xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBjbnQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtjbnRdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisKKwlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7CisJCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCXJldHVybiAwOworCX0KKworCXRpbWVvdXQgPQorCSAgICB0eHEtPnRpbWVfc3RhbXAgKworCSAgICBtc2Vjc190b19qaWZmaWVzKGlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0KTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCUlMX0VSUigiUXVldWUgJWQgc3R1Y2sgZm9yICV1IG1zLlxuIiwgcS0+aWQsCisJCSAgICAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7CisJCXJldCA9IGlsX2ZvcmNlX3Jlc2V0KGlsLCBmYWxzZSk7CisJCXJldHVybiAocmV0ID09IC1FQUdBSU4pID8gMCA6IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYWtpbmcgd2F0Y2hkb2cgdGljayBiZSBhIHF1YXJ0ZXIgb2YgdGltZW91dCBhc3N1cmUgd2Ugd2lsbAorICogZGlzY292ZXIgdGhlIHF1ZXVlIGh1bmcgYmV0d2VlbiB0aW1lb3V0IGFuZCAxLjI1KnRpbWVvdXQKKyAqLworI2RlZmluZSBJTF9XRF9USUNLKHRpbWVvdXQpICgodGltZW91dCkgLyA0KQorCisvKgorICogV2F0Y2hkb2cgdGltZXIgY2FsbGJhY2ssIHdlIGNoZWNrIGVhY2ggdHggcXVldWUgZm9yIHN0dWNrLCBpZiBpZiBodW5nCisgKiB3ZSByZXNldCB0aGUgZmlybXdhcmUuIElmIGV2ZXJ5dGhpbmcgaXMgZmluZSBqdXN0IHJlYXJtIHRoZSB0aW1lci4KKyAqLwordm9pZAoraWxfYmdfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWRhdGE7CisJaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9IGlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCWlmICh0aW1lb3V0ID09IDApCisJCXJldHVybjsKKworCS8qIG1vbml0b3IgYW5kIGNoZWNrIGZvciBzdHVjayBjbWQgcXVldWUgKi8KKwlpZiAoaWxfY2hlY2tfc3R1Y2tfcXVldWUoaWwsIGlsLT5jbWRfcXVldWUpKQorCQlyZXR1cm47CisKKwkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igb3RoZXIgc3R1Y2sgcXVldWVzICovCisJaWYgKGlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkgeworCQlmb3IgKGNudCA9IDA7IGNudCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7CisJCQkvKiBza2lwIGFzIHdlIGFscmVhZHkgY2hlY2tlZCB0aGUgY29tbWFuZCBxdWV1ZSAqLworCQkJaWYgKGNudCA9PSBpbC0+Y21kX3F1ZXVlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGlsX2NoZWNrX3N0dWNrX3F1ZXVlKGlsLCBjbnQpKQorCQkJCXJldHVybjsKKwkJfQorCX0KKworCW1vZF90aW1lcigmaWwtPndhdGNoZG9nLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElMX1dEX1RJQ0sodGltZW91dCkpKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfYmdfd2F0Y2hkb2cpOworCit2b2lkCitpbF9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKKworCWlmICh0aW1lb3V0KQorCQltb2RfdGltZXIoJmlsLT53YXRjaGRvZywKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSUxfV0RfVElDSyh0aW1lb3V0KSkpOworCWVsc2UKKwkJZGVsX3RpbWVyKCZpbC0+d2F0Y2hkb2cpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXR1cF93YXRjaGRvZyk7CisKKy8qCisgKiBleHRlbmRlZCBiZWFjb24gdGltZSBmb3JtYXQKKyAqIHRpbWUgaW4gdXNlYyB3aWxsIGJlIGNoYW5nZWQgaW50byBhIDMyLWJpdCB2YWx1ZSBpbiBleHRlbmRlZDppbnRlcm5hbCBmb3JtYXQKKyAqIHRoZSBleHRlbmRlZCBwYXJ0IGlzIHRoZSBiZWFjb24gY291bnRzCisgKiB0aGUgaW50ZXJuYWwgcGFydCBpcyB0aGUgdGltZSBpbiB1c2VjIHdpdGhpbiBvbmUgYmVhY29uIGludGVydmFsCisgKi8KK3UzMgoraWxfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKQoreworCXUzMiBxdW90OworCXUzMiByZW07CisJdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOworCisJaWYgKCFpbnRlcnZhbCB8fCAhdXNlYykKKwkJcmV0dXJuIDA7CisKKwlxdW90ID0KKwkgICAgKHVzZWMgLworCSAgICAgaW50ZXJ2YWwpICYgKGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaChpbCwKKwkJCQkJCSAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICBiZWFjb25fdGltZV90c2ZfYml0cykgPj4gaWwtPgorCQkJICBod19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCXJlbSA9CisJICAgICh1c2VjICUgaW50ZXJ2YWwpICYgaWxfYmVhY29uX3RpbWVfbWFza19sb3coaWwsCisJCQkJCQkJaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQliZWFjb25fdGltZV90c2ZfYml0cyk7CisKKwlyZXR1cm4gKHF1b3QgPDwgaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykgKyByZW07Cit9CitFWFBPUlRfU1lNQk9MKGlsX3VzZWNzX3RvX2JlYWNvbnMpOworCisvKiBiYXNlIGlzIHVzdWFsbHkgd2hhdCB3ZSBnZXQgZnJvbSB1Y29kZSB3aXRoIGVhY2ggcmVjZWl2ZWQgZnJhbWUsCisgKiB0aGUgc2FtZSBhcyBIVyB0aW1lciBjb3VudGVyIGNvdW50aW5nIGRvd24KKyAqLworX19sZTMyCitpbF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYmFzZSwgdTMyIGFkZG9uLAorCQkgICB1MzIgYmVhY29uX2ludGVydmFsKQoreworCXUzMiBiYXNlX2xvdyA9IGJhc2UgJiBpbF9iZWFjb25fdGltZV9tYXNrX2xvdyhpbCwKKwkJCQkJCSAgICAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICAgICBiZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGFkZG9uX2xvdyA9IGFkZG9uICYgaWxfYmVhY29uX3RpbWVfbWFza19sb3coaWwsCisJCQkJCQkJaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQliZWFjb25fdGltZV90c2ZfYml0cyk7CisJdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOworCXUzMiByZXMgPSAoYmFzZSAmIGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaChpbCwKKwkJCQkJCSAgIGlsLT5od19wYXJhbXMuCisJCQkJCQkgICBiZWFjb25fdGltZV90c2ZfYml0cykpICsKKwkgICAgKGFkZG9uICYgaWxfYmVhY29uX3RpbWVfbWFza19oaWdoKGlsLAorCQkJCQkgICAgICBpbC0+aHdfcGFyYW1zLgorCQkJCQkgICAgICBiZWFjb25fdGltZV90c2ZfYml0cykpOworCisJaWYgKGJhc2VfbG93ID4gYWRkb25fbG93KQorCQlyZXMgKz0gYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJZWxzZSBpZiAoYmFzZV9sb3cgPCBhZGRvbl9sb3cpIHsKKwkJcmVzICs9IGludGVydmFsICsgYmFzZV9sb3cgLSBhZGRvbl9sb3c7CisJCXJlcyArPSAoMSA8PCBpbC0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKwl9IGVsc2UKKwkJcmVzICs9ICgxIDw8IGlsLT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCisJcmV0dXJuIGNwdV90b19sZTMyKHJlcyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2FkZF9iZWFjb25fdGltZSk7CisKKyNpZmRlZiBDT05GSUdfUE0KKworaW50CitpbF9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN5c3RlbSBnb2VzIGludG8gc3VzcGVuZCBzdGF0ZQorCSAqIG1hYzgwMjExIHdpbGwgY2FsbCBpbF9tYWNfc3RvcCgpIGZyb20gdGhlIG1hYzgwMjExIHN1c3BlbmQgZnVuY3Rpb24KKwkgKiBmaXJzdCBidXQgc2luY2UgaWxfbWFjX3N0b3AoKSBoYXMgbm8ga25vd2xlZGdlIG9mIHdobyB0aGUgY2FsbGVyIGlzLAorCSAqIGl0IHdpbGwgbm90IGNhbGwgYXBtX29wcy5zdG9wKCkgdG8gc3RvcCB0aGUgRE1BIG9wZXJhdGlvbi4KKwkgKiBDYWxsaW5nIGFwbV9vcHMuc3RvcCBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIHRoZSBETUEuCisJICovCisJaWxfYXBtX3N0b3AoaWwpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3BjaV9zdXNwZW5kKTsKKworaW50CitpbF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYm9vbCBod19yZmtpbGwgPSBmYWxzZTsKKworCS8qCisJICogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAorCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkdfUkVUUllfVElNRU9VVCwgMHgwMCk7CisKKwlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisKKwlpZiAoIShfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykpCisJCWh3X3Jma2lsbCA9IHRydWU7CisKKwlpZiAoaHdfcmZraWxsKQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCBod19yZmtpbGwpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3BjaV9yZXN1bWUpOworCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbF9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBpbF9wY2lfc3VzcGVuZCwKKwkucmVzdW1lID0gaWxfcGNpX3Jlc3VtZSwKKwkuZnJlZXplID0gaWxfcGNpX3N1c3BlbmQsCisJLnRoYXcgPSBpbF9wY2lfcmVzdW1lLAorCS5wb3dlcm9mZiA9IGlsX3BjaV9zdXNwZW5kLAorCS5yZXN0b3JlID0gaWxfcGNpX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MKGlsX3BtX29wcyk7CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQKK2lsX3VwZGF0ZV9xb3Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghY3R4LT5pc19hY3RpdmUpCisJCXJldHVybjsKKworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyA9IDA7CisKKwlpZiAoY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlKQorCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0KKwkJICAgIFFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLOworCisJaWYgKGN0eC0+aHQuZW5hYmxlZCkKKwkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzIHw9IFFPU19QQVJBTV9GTEdfVEdOX01TSzsKKworCURfUU9TKCJzZW5kIFFvUyBjbWQgd2l0aCBRb3MgYWN0aXZlPSVkIEZMQUdTPTB4JVhcbiIsCisJICAgICAgY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlLCBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MpOworCisJaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBjdHgtPnFvc19jbWQsIHNpemVvZihzdHJ1Y3QgaWxfcW9zcGFyYW1fY21kKSwKKwkJCSAgICAgICZjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybSwgTlVMTCk7Cit9CisKKy8qKgorICogaWxfbWFjX2NvbmZpZyAtIG1hYzgwMjExIGNvbmZpZyBjYWxsYmFjaworICovCitpbnQKK2lsX21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbmYtPmNoYW5uZWw7CisJc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZpbC0+Y3VycmVudF9odF9jb25maWc7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJldCA9IDA7CisJdTE2IGNoOworCWludCBzY2FuX2FjdGl2ZSA9IDA7CisJYm9vbCBodF9jaGFuZ2VkID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTighaWwtPmNmZy0+b3BzLT5sZWdhY3kpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJRF9NQUM4MDIxMSgiZW50ZXIgdG8gY2hhbm5lbCAlZCBjaGFuZ2VkIDB4JVhcbiIsIGNoYW5uZWwtPmh3X3ZhbHVlLAorCQkgICBjaGFuZ2VkKTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpKSB7CisJCXNjYW5fYWN0aXZlID0gMTsKKwkJRF9NQUM4MDIxMSgic2NhbiBhY3RpdmVcbiIpOworCX0KKworCWlmIChjaGFuZ2VkICYKKwkgICAgKElFRUU4MDIxMV9DT05GX0NIQU5HRV9TTVBTIHwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKSB7CisJCS8qIG1hYzgwMjExIHVzZXMgc3RhdGljIGZvciBub24tSFQgd2hpY2ggaXMgd2hhdCB3ZSB3YW50ICovCisJCWlsLT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJCS8qCisJCSAqIFJlY2FsY3VsYXRlIGNoYWluIGNvdW50cy4KKwkJICoKKwkJICogSWYgbW9uaXRvciBtb2RlIGlzIGVuYWJsZWQgdGhlbiBtYWM4MDIxMSB3aWxsCisJCSAqIHNldCB1cCB0aGUgU00gUFMgbW9kZSB0byBPRkYgaWYgYW4gSFQgY2hhbm5lbCBpcworCQkgKiBjb25maWd1cmVkLgorCQkgKi8KKwkJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisJfQorCisJLyogZHVyaW5nIHNjYW5uaW5nIG1hYzgwMjExIHdpbGwgZGVsYXkgY2hhbm5lbCBzZXR0aW5nIHVudGlsCisJICogc2NhbiBmaW5pc2ggd2l0aCBjaGFuZ2VkID0gMAorCSAqLworCWlmICghY2hhbmdlZCB8fCAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkgeworCisJCWlmIChzY2FuX2FjdGl2ZSkKKwkJCWdvdG8gc2V0X2NoX291dDsKKworCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOworCQljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgY2hhbm5lbC0+YmFuZCwgY2gpOworCQlpZiAoIWlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKKwkJCURfTUFDODAyMTEoImxlYXZlIC0gaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHNldF9jaF9vdXQ7CisJCX0KKworCQlpZiAoaWwtPml3X21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwkJICAgICFpbF9pc19jaGFubmVsX2lic3MoY2hfaW5mbykpIHsKKwkJCURfTUFDODAyMTEoImxlYXZlIC0gbm90IElCU1MgY2hhbm5lbFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBzZXRfY2hfb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwkJaWYgKGN0eC0+aHQuZW5hYmxlZCAhPSBjb25mX2lzX2h0KGNvbmYpKSB7CisJCQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCQkJaHRfY2hhbmdlZCA9IHRydWU7CisJCX0KKwkJaWYgKGN0eC0+aHQuZW5hYmxlZCkgeworCQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgeworCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7CisJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7CisJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKKwkJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlCisJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisKKwkJLyoKKwkJICogRGVmYXVsdCB0byBubyBwcm90ZWN0aW9uLiBQcm90ZWN0aW9uIG1vZGUgd2lsbAorCQkgKiBsYXRlciBiZSBzZXQgZnJvbSBCU1MgY29uZmlnIGluIGlsX2h0X2NvbmYKKwkJICovCisJCWN0eC0+aHQucHJvdGVjdGlvbiA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORTsKKworCQkvKiBpZiB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gaHQgdG8gMi40IGNsZWFyIGZsYWdzCisJCSAqIGZyb20gYW55IGh0IHJlbGF0ZWQgaW5mbyBzaW5jZSAyLjQgZG9lcyBub3QKKwkJICogc3VwcG9ydCBodCAqLworCQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJCWlsX3NldF9yeG9uX2NoYW5uZWwoaWwsIGNoYW5uZWwsIGN0eCk7CisJCWlsX3NldF9yeG9uX2h0KGlsLCBodF9jb25mKTsKKworCQlpbF9zZXRfZmxhZ3NfZm9yX2JhbmQoaWwsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGlsLT5jZmctPm9wcy0+bGVnYWN5LT51cGRhdGVfYmNhc3Rfc3RhdGlvbnMpCisJCQlyZXQgPSBpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+dXBkYXRlX2JjYXN0X3N0YXRpb25zKGlsKTsKKworc2V0X2NoX291dDoKKwkJLyogVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhdGVzIGFuZCByYXRlIG1hc2sgY2FuIGJlIGRpZmZlcmVudAorCQkgKiBmb3IgZWFjaCBiYW5kOyBzaW5jZSB0aGUgYmFuZCBtYXkgaGF2ZSBjaGFuZ2VkLCByZXNldAorCQkgKiB0aGUgcmF0ZSBtYXNrIHRvIHdoYXQgbWFjODAyMTEgbGlzdHMgKi8KKwkJaWxfc2V0X3JhdGUoaWwpOworCX0KKworCWlmIChjaGFuZ2VkICYgKElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUyB8IElFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSkgeworCQlyZXQgPSBpbF9wb3dlcl91cGRhdGVfbW9kZShpbCwgZmFsc2UpOworCQlpZiAocmV0KQorCQkJRF9NQUM4MDIxMSgiRXJyb3Igc2V0dGluZyBzbGVlcCBsZXZlbFxuIik7CisJfQorCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKKwkJRF9NQUM4MDIxMSgiVFggUG93ZXIgb2xkPSVkIG5ldz0lZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10LAorCQkJICAgY29uZi0+cG93ZXJfbGV2ZWwpOworCisJCWlsX3NldF90eF9wb3dlcihpbCwgY29uZi0+cG93ZXJfbGV2ZWwsIGZhbHNlKTsKKwl9CisKKwlpZiAoIWlsX2lzX3JlYWR5KGlsKSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIG5vdCByZWFkeVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzY2FuX2FjdGl2ZSkKKwkJZ290byBvdXQ7CisKKwlpZiAobWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQorCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKwllbHNlCisJCURfSU5GTygiTm90IHJlLXNlbmRpbmcgc2FtZSBSWE9OIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwlpZiAoaHRfY2hhbmdlZCkKKwkJaWxfdXBkYXRlX3FvcyhpbCwgY3R4KTsKKworb3V0OgorCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2NvbmZpZyk7CisKK3ZvaWQKK2lsX21hY19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmIChXQVJOX09OKCFpbC0+Y2ZnLT5vcHMtPmxlZ2FjeSkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJbWVtc2V0KCZpbC0+Y3VycmVudF9odF9jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgaWxfaHRfY29uZmlnKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogbmV3IGFzc29jaWF0aW9uIGdldCByaWQgb2YgaWJzcyBiZWFjb24gc2tiICovCisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWlsLT5iZWFjb25fc2tiID0gTlVMTDsKKworCWlsLT50aW1lc3RhbXAgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDEwMCk7CisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBub3QgcmVhZHlcbiIpOworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3ZSBhcmUgcmVzdGFydGluZyBhc3NvY2lhdGlvbiBwcm9jZXNzCisJICogY2xlYXIgUlhPTl9GSUxURVJfQVNTT0NfTVNLIGJpdAorCSAqLworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCWlsX3NldF9yYXRlKGlsKTsKKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX3Jlc2V0X3RzZik7CisKK3N0YXRpYyB2b2lkCitpbF9odF9jb25mKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mID0gJmlsLT5jdXJyZW50X2h0X2NvbmZpZzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCURfQVNTT0MoImVudGVyOlxuIik7CisKKwlpZiAoIWN0eC0+aHQuZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3R4LT5odC5wcm90ZWN0aW9uID0KKwkgICAgYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTjsKKwljdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCA9CisJICAgICEhKGJzc19jb25mLT4KKwkgICAgICAgaHRfb3BlcmF0aW9uX21vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKTsKKworCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gZmFsc2U7CisKKwlzd2l0Y2ggKHZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJcmN1X3JlYWRfbG9jaygpOworCQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCBic3NfY29uZi0+YnNzaWQpOworCQlpZiAoc3RhKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwkJCWludCBtYXhzdHJlYW1zOworCisJCQltYXhzdHJlYW1zID0KKwkJCSAgICAoaHRfY2FwLT5tY3MuCisJCQkgICAgIHR4X3BhcmFtcyAmIElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfTUFTSykKKwkJCSAgICA+PiBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX1NISUZUOworCQkJbWF4c3RyZWFtcyArPSAxOworCisJCQlpZiAoaHRfY2FwLT5tY3MucnhfbWFza1sxXSA9PSAwICYmCisJCQkgICAgaHRfY2FwLT5tY3MucnhfbWFza1syXSA9PSAwKQorCQkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJCWlmIChtYXhzdHJlYW1zIDw9IDEpCisJCQkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIGF0IGFsbCwgdGhpcyBjYW4gb25seSBoYXBwZW4gdGhyb3VnaCBhIHJhY2UKKwkJCSAqIHdoZW4gdGhlIEFQIGRpc2Nvbm5lY3RzIHVzIHdoaWxlIHdlJ3JlIHN0aWxsCisJCQkgKiBzZXR0aW5nIHVwIHRoZSBjb25uZWN0aW9uLCBpbiB0aGF0IGNhc2UgbWFjODAyMTEKKwkJCSAqIHdpbGwgc29vbiB0ZWxsIHVzIGFib3V0IHRoYXQuCisJCQkgKi8KKwkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlEX0FTU09DKCJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfc2V0X25vX2Fzc29jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJLyoKKwkgKiBpbmZvcm0gdGhlIHVjb2RlIHRoYXQgdGhlcmUgaXMgbm8gbG9uZ2VyIGFuCisJICogYXNzb2NpYXRpb24gYW5kIHRoYXQgbm8gbW9yZSBwYWNrZXRzIHNob3VsZCBiZQorCSAqIHNlbnQKKwkgKi8KKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsX2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2xlNjQgdGltZXN0YW1wOworCXN0cnVjdCBza19idWZmICpza2IgPSBpZWVlODAyMTFfYmVhY29uX2dldChodywgdmlmKTsKKworCWlmICghc2tiKQorCQlyZXR1cm47CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX2N0eCkgeworCQlJTF9FUlIoInVwZGF0ZSBiZWFjb24gYnV0IG5vIGJlYWNvbiBjb250ZXh0IVxuIik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlsLT5iZWFjb25fc2tiKQorCQlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWlsLT5iZWFjb25fc2tiID0gc2tiOworCisJdGltZXN0YW1wID0gKChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilza2ItPmRhdGEpLT51LmJlYWNvbi50aW1lc3RhbXA7CisJaWwtPnRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KHRpbWVzdGFtcCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShpbCk7Cit9CisKK3ZvaWQKK2lsX21hY19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsIHUzMiBjaGFuZ2VzKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKCFpbC0+Y2ZnLT5vcHMtPmxlZ2FjeSkpCisJCXJldHVybjsKKworCURfTUFDODAyMTEoImNoYW5nZXMgPSAweCVYXG4iLCBjaGFuZ2VzKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkgeworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX1FPUykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCQljdHgtPnFvc19kYXRhLnFvc19hY3RpdmUgPSBic3NfY29uZi0+cW9zOworCQlpbF91cGRhdGVfcW9zKGlsLCBjdHgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKKwkJLyoKKwkJICogdGhlIGFkZF9pbnRlcmZhY2UgY29kZSBtdXN0IG1ha2Ugc3VyZSB3ZSBvbmx5IGV2ZXIKKwkJICogaGF2ZSBhIHNpbmdsZSBpbnRlcmZhY2UgdGhhdCBjb3VsZCBiZSBiZWFjb25pbmcgYXQKKwkJICogYW55IHRpbWUuCisJCSAqLworCQlpZiAodmlmLT5ic3NfY29uZi5lbmFibGVfYmVhY29uKQorCQkJaWwtPmJlYWNvbl9jdHggPSBjdHg7CisJCWVsc2UKKwkJCWlsLT5iZWFjb25fY3R4ID0gTlVMTDsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JTU0lEKSB7CisJCURfTUFDODAyMTEoIkJTU0lEICVwTVxuIiwgYnNzX2NvbmYtPmJzc2lkKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBIVyBzY2FuIGdvaW5nIG9uIGluIHRoZQorCQkgKiBiYWNrZ3JvdW5kIHRoZW4gd2UgbmVlZCB0byBjYW5jZWwgaXQgZWxzZSB0aGUgUlhPTgorCQkgKiBiZWxvdy9pbiBwb3N0X2Fzc29jaWF0ZSB3aWxsIGZhaWwuCisJCSAqLworCQlpZiAoaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMTAwKSkgeworCQkJSUxfV0FSTigiQWJvcnRlZCBzY2FuIHN0aWxsIGluIHByb2dyZXNzIGFmdGVyIDEwMG1zXG4iKTsKKwkJCURfTUFDODAyMTEoImxlYXZpbmcgLSBzY2FuIGFib3J0IGZhaWxlZC5cbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogbWFjODAyMTEgb25seSBzZXRzIGFzc29jIHdoZW4gaW4gU1RBVElPTiBtb2RlICovCisJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwgYnNzX2NvbmYtPmFzc29jKSB7CisJCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsIGJzc19jb25mLT5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisKKwkJCS8qIGN1cnJlbnRseSBuZWVkZWQgaW4gYSBmZXcgcGxhY2VzICovCisJCQltZW1jcHkoaWwtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJfQorCisJfQorCisJLyoKKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGFmdGVyIHNldHRpbmcgdGhlIEJTU0lEIGluIGNhc2UKKwkgKiBtYWM4MDIxMSBkZWNpZGVzIHRvIGRvIGJvdGggY2hhbmdlcyBhdCBvbmNlIGJlY2F1c2UKKwkgKiBpdCB3aWxsIGludm9rZSBwb3N0X2Fzc29jaWF0ZS4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OKSkKKwkJaWxfYmVhY29uX3VwZGF0ZShodywgdmlmKTsKKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFKSB7CisJCURfTUFDODAyMTEoIkVSUF9QUkVBTUJMRSAlZFxuIiwgYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSk7CisJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9FUlBfQ1RTX1BST1QpIHsKKwkJRF9NQUM4MDIxMSgiRVJQX0NUUyAlZFxuIiwgYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCk7CisJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90ICYmIGlsLT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKKwkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0VMRl9DVFNfRU47CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0VMRl9DVFNfRU47CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgeworCQkvKiBYWFggdXNlIHRoaXMgaW5mb3JtYXRpb24KKwkJICoKKwkJICogVG8gZG8gdGhhdCwgcmVtb3ZlIGNvZGUgZnJvbSBpbF9zZXRfcmF0ZSgpIGFuZCBwdXQgc29tZXRoaW5nCisJCSAqIGxpa2UgdGhpcyBoZXJlOgorCQkgKgorCQkgaWYgKEEtYmFuZCkKKwkJIGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkJIGJzc19jb25mLT5iYXNpY19yYXRlczsKKwkJIGVsc2UKKwkJIGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KKwkJIGJzc19jb25mLT5iYXNpY19yYXRlcyA+PiA0OworCQkgY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9CisJCSBic3NfY29uZi0+YmFzaWNfcmF0ZXMgJiAweEY7CisJCSAqLworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSFQpIHsKKwkJaWxfaHRfY29uZihpbCwgdmlmKTsKKworCQlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9BU1NPQykgeworCQlEX01BQzgwMjExKCJBU1NPQyAlZFxuIiwgYnNzX2NvbmYtPmFzc29jKTsKKwkJaWYgKGJzc19jb25mLT5hc3NvYykgeworCQkJaWwtPnRpbWVzdGFtcCA9IGJzc19jb25mLT50aW1lc3RhbXA7CisKKwkJCWlmICghaWxfaXNfcmZraWxsKGlsKSkKKwkJCQlpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+cG9zdF9hc3NvY2lhdGUoaWwpOworCQl9IGVsc2UKKwkJCWlsX3NldF9ub19hc3NvYyhpbCwgdmlmKTsKKwl9CisKKwlpZiAoY2hhbmdlcyAmJiBpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpICYmIGJzc19jb25mLT5haWQpIHsKKwkJRF9NQUM4MDIxMSgiQ2hhbmdlcyAoJSN4KSB3aGlsZSBhc3NvY2lhdGVkXG4iLCBjaGFuZ2VzKTsKKwkJcmV0ID0gaWxfc2VuZF9yeG9uX2Fzc29jKGlsLCBjdHgpOworCQlpZiAoIXJldCkgeworCQkJLyogU3luYyBhY3RpdmVfcnhvbiB3aXRoIGxhdGVzdCBjaGFuZ2UuICovCisJCQltZW1jcHkoKHZvaWQgKikmY3R4LT5hY3RpdmUsICZjdHgtPnN0YWdpbmcsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCkpOworCQl9CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkgeworCQlpZiAodmlmLT5ic3NfY29uZi5lbmFibGVfYmVhY29uKSB7CisJCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsIGJzc19jb25mLT5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQltZW1jcHkoaWwtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCWlsLT5jZmctPm9wcy0+bGVnYWN5LT5jb25maWdfYXAoaWwpOworCQl9IGVsc2UKKwkJCWlsX3NldF9ub19hc3NvYyhpbCwgdmlmKTsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0lCU1MpIHsKKwkJcmV0ID0KKwkJICAgIGlsLT5jZmctPm9wcy0+bGVnYWN5LT5tYW5hZ2VfaWJzc19zdGF0aW9uKGlsLCB2aWYsCisJCQkJCQkJICAgICAgYnNzX2NvbmYtPgorCQkJCQkJCSAgICAgIGlic3Nfam9pbmVkKTsKKwkJaWYgKHJldCkKKwkJCUlMX0VSUigiZmFpbGVkIHRvICVzIElCU1Mgc3RhdGlvbiAlcE1cbiIsCisJCQkgICAgICAgYnNzX2NvbmYtPmlic3Nfam9pbmVkID8gImFkZCIgOiAicmVtb3ZlIiwKKwkJCSAgICAgICBic3NfY29uZi0+YnNzaWQpOworCX0KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2Jzc19pbmZvX2NoYW5nZWQpOworCitpcnFyZXR1cm5fdAoraWxfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGF0YTsKKwl1MzIgaW50YSwgaW50YV9tYXNrOworCXUzMiBpbnRhX2ZoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYgKCFpbCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIChidXQgZG9uJ3QgY2xlYXIhKSBpbnRlcnJ1cHRzIGhlcmUgdG8gYXZvaWQKKwkgKiAgICBiYWNrLXRvLWJhY2sgSVNScyBhbmQgc3BvcmFkaWMgaW50ZXJydXB0cyBmcm9tIG91ciBOSUMuCisJICogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VydmljZSwgdGhlIHRhc2tsZXQgd2lsbCByZS1lbmFibGUgaW50cy4KKwkgKiBJZiB3ZSAqZG9uJ3QqIGhhdmUgc29tZXRoaW5nLCB3ZSdsbCByZS1lbmFibGUgYmVmb3JlIGxlYXZpbmcgaGVyZS4gKi8KKwlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CS8qIGp1c3QgZm9yIGRlYnVnICovCisJX2lsX3dyKGlsLCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOworCisJLyogRGlzY292ZXIgd2hpY2ggaW50ZXJydXB0cyBhcmUgYWN0aXZlL3BlbmRpbmcgKi8KKwlpbnRhID0gX2lsX3JkKGlsLCBDU1JfSU5UKTsKKwlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisKKwkvKiBJZ25vcmUgaW50ZXJydXB0IGlmIHRoZXJlJ3Mgbm90aGluZyBpbiBOSUMgdG8gc2VydmljZS4KKwkgKiBUaGlzIG1heSBiZSBkdWUgdG8gSVJRIHNoYXJlZCB3aXRoIGFub3RoZXIgZGV2aWNlLAorCSAqIG9yIGR1ZSB0byBzcG9yYWRpYyBpbnRlcnJ1cHRzIHRocm93biBmcm9tIG91ciBOSUMuICovCisJaWYgKCFpbnRhICYmICFpbnRhX2ZoKSB7CisJCURfSVNSKCJJZ25vcmUgaW50ZXJydXB0LCBpbnRhID09IDAsIGludGFfZmggPT0gMFxuIik7CisJCWdvdG8gbm9uZTsKKwl9CisKKwlpZiAoaW50YSA9PSAweEZGRkZGRkZGIHx8IChpbnRhICYgMHhGRkZGRkZGMCkgPT0gMHhhNWE1YTVhMCkgeworCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZC4gSXQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJhaXNlZAorCQkgKiBhbiBpbnRlcnJ1cHQgKi8KKwkJSUxfV0FSTigiSEFSRFdBUkUgR09ORT8/IElOVEEgPT0gMHglMDh4XG4iLCBpbnRhKTsKKwkJZ290byB1bnBsdWdnZWQ7CisJfQorCisJRF9JU1IoIklTUiBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwgaW50YSwgaW50YV9tYXNrLAorCSAgICAgIGludGFfZmgpOworCisJaW50YSAmPSB+Q1NSX0lOVF9CSVRfU0NEOworCisJLyogaWxfaXJxX3Rhc2tsZXQoKSB3aWxsIHNlcnZpY2UgaW50ZXJydXB0cyBhbmQgcmUtZW5hYmxlIHRoZW0gKi8KKwlpZiAobGlrZWx5KGludGEgfHwgaW50YV9maCkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmlsLT5pcnFfdGFza2xldCk7CisKK3VucGx1Z2dlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKKworbm9uZToKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2VydmljZS4gKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KKwlpZiAodGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKQorCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2lzcik7CisKKy8qCisgKiAgaWxfdHhfY21kX3Byb3RlY3Rpb246IFNldCBydHMvY3RzLiAzOTQ1IGFuZCA0OTY1IG9ubHkgc2hhcmUgdGhpcworICogIGZ1bmN0aW9uLgorICovCit2b2lkCitpbF90eF9jbWRfcHJvdGVjdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJICAgICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpCit7CisJaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKKwkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfUlRTX01TSzsKKwkJKnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0NUU19NU0s7CisJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX0ZVTExfVFhPUF9QUk9UX01TSzsKKworCQlpZiAoIWllZWU4MDIxMV9pc19tZ210KGZjKSkKKwkJCXJldHVybjsKKworCQlzd2l0Y2ggKGZjICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfU1RZUEUpKSB7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FVVEgpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOgorCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSk6CisJCQkqdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfUlRTX01TSzsKKwkJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX0NUU19NU0s7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS4KKwkJICAgZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7CisJCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19SVFNfTVNLOworCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOworCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF90eF9jbWRfcHJvdGVjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzBiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaApAQCAtMCwwICsxLDM0MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX2lsX2NvcmVfaF9fCisjZGVmaW5lIF9faWxfY29yZV9oX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgImNzci5oIgorI2luY2x1ZGUgInBycGguaCIKKworc3RydWN0IGlsX2hvc3RfY21kOworc3RydWN0IGlsX2NtZDsKK3N0cnVjdCBpbF90eF9xdWV1ZTsKKworI2RlZmluZSBJTF9FUlIoZiwgYS4uLikgZGV2X2VycigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfV0FSTihmLCBhLi4uKSBkZXZfd2FybigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfSU5GTyhmLCBhLi4uKSBkZXZfaW5mbygmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKworI2RlZmluZSBSWF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBSWF9RVUVVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQorI2RlZmluZSBSWF9RVUVVRV9TSVpFX0xPRyAgICAgICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIFJYIHJlbGF0ZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgUlhfRlJFRV9CVUZGRVJTIDY0CisjZGVmaW5lIFJYX0xPV19XQVRFUk1BUksgOAorCisjZGVmaW5lIFUzMl9QQUQobikJCSgoNC0obikpJjB4MykKKworLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZICAgMTEwCS8qIGluIENlbHNpdXMgKi8KKworLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgorICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgorICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0cyBiZWluZyBzZW50IHRvIGRyaXZlcikKKyAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCisgKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCisgKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCisgKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCisgKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0CisgKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKKyAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAorICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KKyNkZWZpbmUgSUxfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQorCisvKgorICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCisgKiBQZXIgc3BlYzoKKyAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKKyAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCisgKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgorICogICB0aGFuIFJUUyB2YWx1ZS4KKyAqLworI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQorI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCisjZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCisjZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKKyNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQorCitzdHJ1Y3QgaWxfcnhfYnVmIHsKKwlkbWFfYWRkcl90IHBhZ2VfZG1hOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgcnhiX2FkZHIocikgcGFnZV9hZGRyZXNzKHItPnBhZ2UpCisKKy8qIGRlZmluZWQgYmVsb3cgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kOworCitzdHJ1Y3QgaWxfY21kX21ldGEgeworCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLworCXN0cnVjdCBpbF9ob3N0X2NtZCAqc291cmNlOworCS8qCisJICogb25seSBmb3IgQVNZTkMgY29tbWFuZHMKKwkgKiAod2hpY2ggaXMgc29tZXdoYXQgc3R1cGlkIC0tIGxvb2sgYXQgY29tbW9uLmMgZm9yIGluc3RhbmNlCisJICogd2hpY2ggZHVwbGljYXRlcyBhIGJ1bmNoIG9mIGNvZGUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXNuJ3QKKwkgKiBpbnZva2VkIGZvciBTWU5DIGNvbW1hbmRzLCBpZiBpdCB3ZXJlIGFuZCBpdHMgcmVzdWx0IHBhc3NlZAorCSAqIHRocm91Z2ggaXQgd291bGQgYmUgc2ltcGxlci4uLikKKwkgKi8KKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCQkgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7CisKKwkvKiBUaGUgQ01EX1NJWkVfSFVHRSBmbGFnIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZAorCSAqIHN0cnVjdHVyZSBpcyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2hhcmVkIHF1ZXVlIG1lbW9yeS4gKi8KKwl1MzIgZmxhZ3M7CisKKwkgREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOworCSBERUZJTkVfRE1BX1VOTUFQX0xFTihsZW4pOworfTsKKworLyoKKyAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCisgKgorICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKKyAqLworc3RydWN0IGlsX3F1ZXVlIHsKKwlpbnQgbl9iZDsJCS8qIG51bWJlciBvZiBCRHMgaW4gdGhpcyBxdWV1ZSAqLworCWludCB3cml0ZV9wdHI7CQkvKiAxLXN0IGVtcHR5IGVudHJ5IChpZHgpIGhvc3RfdyAqLworCWludCByZWFkX3B0cjsJCS8qIGxhc3QgdXNlZCBlbnRyeSAoaWR4KSBob3N0X3IgKi8KKwkvKiB1c2UgZm9yIG1vbml0b3JpbmcgYW5kIHJlY292ZXJpbmcgdGhlIHN0dWNrIHF1ZXVlICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsJLyogcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLworCWludCBuX3dpbjsJCS8qIHNhZmUgcXVldWUgd2luICovCisJdTMyIGlkOworCWludCBsb3dfbWFyazsJCS8qIGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlCisJCQkJICogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KKwlpbnQgaGlnaF9tYXJrOwkJLyogaGlnaCB3YXRlcm1hcmssIHN0b3AgcXVldWUgaWYgZnJlZQorCQkJCSAqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCit9OworCisvKiBPbmUgZm9yIGVhY2ggVEZEICovCitzdHJ1Y3QgaWxfdHhfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbF90eF9xdWV1ZSAtIFR4IFF1ZXVlIGZvciBETUEKKyAqIEBxOiBnZW5lcmljIFJ4L1R4IHF1ZXVlIGRlc2NyaXB0b3IKKyAqIEBiZDogYmFzZSBvZiBjaXJjdWxhciBidWZmZXIgb2YgVEZEcworICogQGNtZDogYXJyYXkgb2YgY29tbWFuZC9UWCBidWZmZXIgcG9pbnRlcnMKKyAqIEBtZXRhOiBhcnJheSBvZiBtZXRhIGRhdGEgZm9yIGVhY2ggY29tbWFuZC90eCBidWZmZXIKKyAqIEBkbWFfYWRkcl9jbWQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kL3R4IGJ1ZmZlciBhcnJheQorICogQHR4YjogYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YQorICogQHRpbWVfc3RhbXA6IHRpbWUgKGluIGppZmZpZXMpIG9mIGxhc3QgcmVhZF9wdHIgY2hhbmdlCisgKiBAbmVlZF91cGRhdGU6IGluZGljYXRlcyBuZWVkIHRvIHVwZGF0ZSByZWFkL3dyaXRlIGlkeAorICogQHNjaGVkX3JldHJ5OiBpbmRpY2F0ZXMgcXVldWUgaXMgaGlnaC10aHJvdWdocHV0IGFnZ3JlZ2F0aW9uIChIVCBBR0cpIGVuYWJsZWQKKyAqCisgKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQorICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKKyNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgorCitzdHJ1Y3QgaWxfdHhfcXVldWUgeworCXN0cnVjdCBpbF9xdWV1ZSBxOworCXZvaWQgKnRmZHM7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKipjbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICptZXRhOworCXN0cnVjdCBpbF90eF9pbmZvICp0eGI7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXU4IG5lZWRfdXBkYXRlOworCXU4IHNjaGVkX3JldHJ5OworCXU4IGFjdGl2ZTsKKwl1OCBzd3FfaWQ7Cit9OworCisvKgorICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKKyAqCisgKiBEcml2ZXIgaW5pdGlhdGVzIEVFUFJPTSByZWFkIGJ5IHdyaXRpbmcgYnl0ZSBhZGRyZXNzIDw8IDEgdG8gQ1NSX0VFUFJPTV9SRUcuCisgKiBEcml2ZXIgdGhlbiBwb2xscyBDU1JfRUVQUk9NX1JFRyBmb3IgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sgKDB4MSkuCisgKiBXaGVuIHBvbGxpbmcsIHdhaXQgMTAgdVNlYyBiZXR3ZWVuIHBvbGxpbmcgbG9vcHMsIHVwIHRvIGEgbWF4aW11bSA1MDAwIHVTZWMuCisgKiBEcml2ZXIgcmVhZHMgMTYtYml0IHZhbHVlIGZyb20gYml0cyAzMS0xNiBvZiBDU1JfRUVQUk9NX1JFRy4KKyAqLworI2RlZmluZSBJTF9FRVBST01fQUNDRVNTX1RJTUVPVVQJNTAwMAkvKiB1U2VjICovCisKKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9USU1FT1VUCQkxMAkvKiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9SRVRSWV9MSU1JVAkxMDAwCS8qIG51bWJlciBvZiBhdHRlbXB0cyAobm90IHRpbWUpICovCisKKy8qCisgKiBSZWd1bGF0b3J5IGNoYW5uZWwgdXNhZ2UgZmxhZ3MgaW4gRUVQUk9NIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NoYW5uZWwuZmxhZ3MuCisgKgorICogSUJTUyBhbmQvb3IgQVAgb3BlcmF0aW9uIGlzIGFsbG93ZWQgKm9ubHkqIG9uIHRob3NlIGNoYW5uZWxzIHdpdGgKKyAqIChWQUxJRCAmJiBJQlNTICYmIEFDVElWRSAmJiAhUkFEQVIpLiAgVGhpcyByZXN0cmljdGlvbiBpcyBpbiBwbGFjZSBiZWNhdXNlCisgKiBSQURBUiBkZXRlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgNDk2NSBkcml2ZXIsIGJ1dCBpcyBhCisgKiByZXF1aXJlbWVudCBmb3IgZXN0YWJsaXNoaW5nIGEgbmV3IG5ldHdvcmsgZm9yIGxlZ2FsIG9wZXJhdGlvbiBvbiBjaGFubmVscworICogcmVxdWlyaW5nIFJBREFSIGRldGVjdGlvbiBvciByZXN0cmljdGluZyBBQ1RJVkUgc2Nhbm5pbmcuCisgKgorICogTk9URTogICJXSURFIiBmbGFnIGRvZXMgbm90IGluZGljYXRlIGFueXRoaW5nIGFib3V0ICJIVDQwIiA0MCBNSHogY2hhbm5lbHMuCisgKiAgICAgICAgSXQgb25seSBpbmRpY2F0ZXMgdGhhdCAyMCBNSHogY2hhbm5lbCB1c2UgaXMgc3VwcG9ydGVkOyBIVDQwIGNoYW5uZWwKKyAqICAgICAgICB1c2FnZSBpcyBpbmRpY2F0ZWQgYnkgYSBzZXBhcmF0ZSBzZXQgb2YgcmVndWxhdG9yeSBmbGFncyBmb3IgZWFjaAorICogICAgICAgIEhUNDAgY2hhbm5lbCBwYWlyLgorICoKKyAqIE5PVEU6ICBVc2luZyBhIGNoYW5uZWwgaW5hcHByb3ByaWF0ZWx5IHdpbGwgcmVzdWx0IGluIGEgdUNvZGUgZXJyb3IhCisgKi8KKyNkZWZpbmUgSUxfTlVNX1RYX0NBTElCX0dST1VQUyA1CitlbnVtIHsKKwlFRVBST01fQ0hBTk5FTF9WQUxJRCA9ICgxIDw8IDApLAkvKiB1c2FibGUgZm9yIHRoaXMgU0tVL2dlbyAqLworCUVFUFJPTV9DSEFOTkVMX0lCU1MgPSAoMSA8PCAxKSwJLyogdXNhYmxlIGFzIGFuIElCU1MgY2hhbm5lbCAqLworCS8qIEJpdCAyIFJlc2VydmVkICovCisJRUVQUk9NX0NIQU5ORUxfQUNUSVZFID0gKDEgPDwgMyksCS8qIGFjdGl2ZSBzY2FubmluZyBhbGxvd2VkICovCisJRUVQUk9NX0NIQU5ORUxfUkFEQVIgPSAoMSA8PCA0KSwJLyogcmFkYXIgZGV0ZWN0aW9uIHJlcXVpcmVkICovCisJRUVQUk9NX0NIQU5ORUxfV0lERSA9ICgxIDw8IDUpLAkvKiAyMCBNSHogY2hhbm5lbCBva2F5ICovCisJLyogQml0IDYgUmVzZXJ2ZWQgKHdhcyBOYXJyb3cgQ2hhbm5lbCkgKi8KKwlFRVBST01fQ0hBTk5FTF9ERlMgPSAoMSA8PCA3KSwJLyogZHluYW1pYyBmcmVxIHNlbGVjdGlvbiBjYW5kaWRhdGUgKi8KK307CisKKy8qIFNLVSBDYXBhYmlsaXRpZXMgKi8KKy8qIDM5NDUgb25seSAqLworI2RlZmluZSBFRVBST01fU0tVX0NBUF9TV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAxKQorCisvKiAqcmVndWxhdG9yeSogY2hhbm5lbCBkYXRhIGZvcm1hdCBpbiBlZXByb20sIG9uZSBmb3IgZWFjaCBjaGFubmVsLgorICogVGhlcmUgYXJlIHNlcGFyYXRlIGVudHJpZXMgZm9yIEhUNDAgKDQwIE1IeikgdnMuIG5vcm1hbCAoMjAgTUh6KSBjaGFubmVscy4gKi8KK3N0cnVjdCBpbF9lZXByb21fY2hhbm5lbCB7CisJdTggZmxhZ3M7CQkvKiBFRVBST01fQ0hBTk5FTF8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIG1heCBwb3dlciAoZEJtKSBvbiB0aGlzIGNobmwsIGxpbWl0IDMxICovCit9IF9fcGFja2VkOworCisvKiAzOTQ1IFNwZWNpZmljICovCisjZGVmaW5lIEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQorCisvKiA0OTY1IGhhcyB0d28gcmFkaW8gdHJhbnNtaXR0ZXJzIChhbmQgMyByYWRpbyByZWNlaXZlcnMpICovCisjZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlMgICAgICAoMikKKworLyogNDk2NSBoYXMgcm9vbSBmb3IgdXAgdG8gOCBzZXRzIG9mIHR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YSAqLworI2RlZmluZSBFRVBST01fVFhfUE9XRVJfQkFORFMgICAgICAgICAgKDgpCisKKy8qIDQ5NjUgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlcyB0eHBvd2VyIGdhaW4gc2V0dGluZ3MgZm9yCisgKiBlYWNoIG9mIDMgdGFyZ2V0IG91dHB1dCBsZXZlbHMgKi8KKyNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UUyAgICgzKQorCisvKiA0OTY1IFNwZWNpZmljICovCisvKiA0OTY1IGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGggdHhwb3dlciBjYWxpYnJhdGlvbiB2ZXJzaW9uIDwgNSAqLworI2RlZmluZSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OICAgICg1KQorI2RlZmluZSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTgkoMHgyZikKKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQgICAgICAgKDIqMHhCNikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCAgICAgICAoMioweEU4KQkvKiA0OCAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgKDIqMHg0RikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9QQkEgICAgICAgICAgICAgICAgICAoMioweDU2KzEpCS8qIDkgYnl0ZXMgKi8KKworLyogMi40IEdIeiAqLworZXh0ZXJuIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzFbMTRdOworCisvKgorICogZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciBvbmUgdHhwb3dlciBsZXZlbCwgb24gb25lIGNoYW5uZWwsCisgKiBtZWFzdXJlZCBvbiBvbmUgb2YgdGhlIDIgdHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlciBhbmQgYXNzb2NpYXRlZAorICogYW50ZW5uYSkuICBFRVBST00gY29udGFpbnM6CisgKgorICogMSkgIFRlbXBlcmF0dXJlIChkZWdyZWVzIENlbHNpdXMpIG9mIGRldmljZSB3aGVuIG1lYXN1cmVtZW50IHdhcyBtYWRlLgorICoKKyAqIDIpICBHYWluIHRhYmxlIGlkeCB1c2VkIHRvIGFjaGlldmUgdGhlIHRhcmdldCBtZWFzdXJlbWVudCBwb3dlci4KKyAqICAgICBUaGlzIHJlZmVycyB0byB0aGUgIndlbGwta25vd24iIGdhaW4gdGFibGVzIChzZWUgNDk2NS5oKS4KKyAqCisgKiAzKSAgQWN0dWFsIG1lYXN1cmVkIG91dHB1dCBwb3dlciwgaW4gaGFsZi1kQm0gKCIzNCIgPSAxNyBkQm0pLgorICoKKyAqIDQpICBSRiBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgbGV2ZWwgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKS4KKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlIHsKKwl1OCB0ZW1wZXJhdHVyZTsJCS8qIERldmljZSB0ZW1wZXJhdHVyZSAoQ2Vsc2l1cykgKi8KKwl1OCBnYWluX2lkeDsJCS8qIEluZGV4IGludG8gZ2FpbiB0YWJsZSAqLworCXU4IGFjdHVhbF9wb3c7CQkvKiBNZWFzdXJlZCBSRiBvdXRwdXQgcG93ZXIsIGhhbGYtZEJtICovCisJczggcGFfZGV0OwkJLyogUG93ZXIgYW1wIGRldGVjdG9yIGxldmVsIChub3QgdXNlZCkgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBtZWFzdXJlbWVudCBzZXQgZm9yIG9uZSBjaGFubmVsLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBDaGFubmVsIG51bWJlciBtZWFzdXJlZAorICoKKyAqIDIpICBNZWFzdXJlbWVudHMgZm9yIGVhY2ggb2YgMyBwb3dlciBsZXZlbHMgZm9yIGVhY2ggb2YgMiByYWRpbyB0cmFuc21pdHRlcnMKKyAqICAgICAoYS5rLmEuICJ0eCBjaGFpbnMiKSAoNiBtZWFzdXJlbWVudHMgYWx0b2dldGhlcikKKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9jaF9pbmZvIHsKKwl1OCBjaF9udW07CisJc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlCisJICAgIG1lYXN1cmVtZW50c1tFRVBST01fVFhfUE9XRVJfVFhfQ0hBSU5TXQorCSAgICBbRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UU107Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBzdWJiYW5kIGluZm8uCisgKgorICogRm9yIGVhY2ggZnJlcXVlbmN5IHN1YmJhbmQsIEVFUFJPTSBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICoKKyAqIDEpICBGaXJzdCBhbmQgbGFzdCBjaGFubmVscyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHN1YmJhbmQuICAiMCIgdmFsdWVzCisgKiAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNhbXBsZSBzZXQgaXMgbm90IGJlaW5nIHVzZWQuCisgKgorICogMikgIFNhbXBsZSBtZWFzdXJlbWVudCBzZXRzIGZvciAyIGNoYW5uZWxzIGNsb3NlIHRvIHRoZSByYW5nZSBlbmRwb2ludHMuCisgKi8KK3N0cnVjdCBpbF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIHsKKwl1OCBjaF9mcm9tOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgbG93ZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLworCXU4IGNoX3RvOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgaGlnaGVzdCBjaGFubmVsIGluIHN1YmJhbmQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gxOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDI7Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBGYWN0b3J5LW1lYXN1cmVkIHNhdHVyYXRpb24gcG93ZXIgbGV2ZWxzIChtYXhpbXVtIGxldmVscyBhdCB3aGljaAorICogICAgIHR4IHBvd2VyIGFtcGxpZmllciBjYW4gb3V0cHV0IGEgc2lnbmFsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbikuCisgKiAgICAgVGhlcmUgaXMgb25lIGxldmVsIGZvciAyLjQgR0h6IGJhbmQgYW5kIG9uZSBmb3IgNSBHSHogYmFuZC4gIFRoZXNlCisgKiAgICAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjaGFubmVscyB3aXRoaW4gZWFjaCBvZiB0aGUgYmFuZHMuCisgKgorICogMikgIEZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKKyAqICAgICBjb25zdGFudCAoaS5lLiBzYW1lIHZhbHVlIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzL2JhbmRzKSB3aGlsZSB0aGUKKyAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50cyBhcmUgYmVpbmcgbWFkZS4KKyAqCisgKiAzKSAgVXAgdG8gOCBzZXRzIG9mIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMuCisgKiAgICAgVGhlc2UgYXJlIGZvciBkaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcywgc2luY2UgdHhwb3dlciBnYWluCisgKiAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbmFsb2cgcmFkaW8gY2lyY3VpdHJ5IHZhcnkgd2l0aCBmcmVxdWVuY3kuCisgKgorICogICAgIE5vdCBhbGwgc2V0cyBuZWVkIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGE7CisgKiAgICAgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9zdWJiYW5kX2luZm8gY29udGFpbnMgcmFuZ2Ugb2YgY2hhbm5lbHMKKyAqICAgICAoMCBpZiB1bnVzZWQpIGZvciBlYWNoIHNldCBvZiBkYXRhLgorICovCitzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8geworCXU4IHNhdHVyYXRpb25fcG93ZXIyNDsJLyogaGFsZi1kQm0gKGUuZy4gIjM0IiA9IDE3IGRCbSkgKi8KKwl1OCBzYXR1cmF0aW9uX3Bvd2VyNTI7CS8qIGhhbGYtZEJtICovCisJX19sZTE2IHZvbHRhZ2U7CQkvKiBzaWduZWQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbyBiYW5kX2luZm9bRUVQUk9NX1RYX1BPV0VSX0JBTkRTXTsKK30gX19wYWNrZWQ7CisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgRUVQUk9NX0RFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgKDIqMHgwOCkJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAoMioweDE1KQkvKiA2ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgICAoMioweDM1KQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUEJBX05VTUJFUiAgICAgICAgICAgICAoMioweDNCKzEpCS8qIDkgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDQpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9TS1VfQ0FQICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDUpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9PRU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICgyKjB4NDYpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9XT1dMQU5fTU9ERSAgICAgICAgICAgICAgICAgICgyKjB4NDcpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SQURJT19DT05GSUcgICAgICAgICAgICAgICAgICgyKjB4NDgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9OVU1fTUFDX0FERFJFU1MgICAgICAgICAgICAgICgyKjB4NEMpCS8qIDIgIGJ5dGVzICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFza3MgYXJlIHRvIGJlIGFwcGxpZWQgb24gRUVQUk9NX1JBRElPX0NPTkZJRyAqLworI2RlZmluZSBFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHgpICAgKHggJiAweDMpCS8qIGJpdHMgMC0xICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19TVEVQX01TSyh4KSAgICgoeCA+PiAyKSAgJiAweDMpCS8qIGJpdHMgMi0zICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19EQVNIX01TSyh4KSAgICgoeCA+PiA0KSAgJiAweDMpCS8qIGJpdHMgNC01ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19QTlVNX01TSyh4KSAgICgoeCA+PiA2KSAgJiAweDMpCS8qIGJpdHMgNi03ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHgpICgoeCA+PiA4KSAgJiAweEYpCS8qIGJpdHMgOC0xMSAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHgpICgoeCA+PiAxMikgJiAweEYpCS8qIGJpdHMgMTItMTUgKi8KKworI2RlZmluZSBFRVBST01fMzk0NV9SRl9DRkdfVFlQRV9NQVggIDB4MAorI2RlZmluZSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVggIDB4MQorCisvKgorICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgorICoKKyAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IGl3bCBoYXMgYSBmaXhlZCBsb2NhdGlvbgorICogaW4gRUVQUk9NIGNvbnRhaW5pbmcgRUVQUk9NX0NIQU5ORUxfKiB1c2FnZSBmbGFncyAoTFNCKSBhbmQgbWF4IHJlZ3VsYXRvcnkKKyAqIHR4cG93ZXIgKE1TQikuCisgKgorICogRW50cmllcyBpbW1lZGlhdGVseSBiZWxvdyBhcmUgZm9yIDIwIE1IeiBjaGFubmVsIHdpZHRoLiAgSFQ0MCAoNDAgTUh6KQorICogY2hhbm5lbHMgKG9ubHkgZm9yIDQ5NjUsIG5vdCBzdXBwb3J0ZWQgYnkgMzk0NSkgYXBwZWFyIGxhdGVyIGluIHRoZSBFRVBST00uCisgKgorICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9TS1VfSUQgICAgICAgICAgICAoMioweDYwKQkvKiA0ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzEgICAgICAgICAgICAoMioweDYyKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzFfQ0hBTk5FTFMgICAoMioweDYzKQkvKiAyOCBieXRlcyAqLworCisvKgorICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKKyAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgorICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCisgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yICAgICAgICAgICAgKDIqMHg3MSkJLyogMiAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTICAgKDIqMHg3MikJLyogMjYgYnl0ZXMgKi8KKworLyoKKyAqIDUuMiBHSHogY2hhbm5lbHMgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MiwgNTYsIDYwLCA2NAorICogKDUxNzAtNTMyME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzMgICAgICAgICAgICAoMioweDdGKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzNfQ0hBTk5FTFMgICAoMioweDgwKQkvKiAyNCBieXRlcyAqLworCisvKgorICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorICogKDU1MDAtNTcwME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzQgICAgICAgICAgICAoMioweDhDKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzRfQ0hBTk5FTFMgICAoMioweDhEKQkvKiAyMiBieXRlcyAqLworCisvKgorICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisgKiAoNTcyNS01ODI1TUh6KQorICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNSAgICAgICAgICAgICgyKjB4OTgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUyAgICgyKjB4OTkpCS8qIDEyIGJ5dGVzICovCisKKy8qCisgKiAyLjQgR0h6IEhUNDAgY2hhbm5lbHMgMSAoNSksIDIgKDYpLCAzICg3KSwgNCAoOCksIDUgKDkpLCA2ICgxMCksIDcgKDExKQorICoKKyAqIFRoZSBjaGFubmVsIGxpc3RlZCBpcyB0aGUgY2VudGVyIG9mIHRoZSBsb3dlciAyMCBNSHogaGFsZiBvZiB0aGUgY2hhbm5lbC4KKyAqIFRoZSBvdmVyYWxsIGNlbnRlciBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMiBjaGFubmVscyAoMTAgTUh6KSBhYm92ZSB0aGF0LAorICogYW5kIHRoZSB1cHBlciBoYWxmIG9mIGVhY2ggSFQ0MCBjaGFubmVsIGlzIGNlbnRlcmVkIDQgY2hhbm5lbHMgKDIwIE1IeikgYXdheQorICogZnJvbSB0aGUgbG93ZXIgaGFsZjsgZS5nLiB0aGUgdXBwZXIgaGFsZiBvZiBIVDQwIGNoYW5uZWwgMSBpcyBjaGFubmVsIDUsCisgKiBhbmQgdGhlIG92ZXJhbGwgSFQ0MCBjaGFubmVsIHdpZHRoIGNlbnRlcnMgb24gY2hhbm5lbCAzLgorICoKKyAqIE5PVEU6ICBUaGUgUlhPTiBjb21tYW5kIHVzZXMgMjAgTUh6IGNoYW5uZWwgbnVtYmVycyB0byBzcGVjaWZ5IHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCB0byB3aGljaCB0byB0dW5lLiAgUlhPTiBhbHNvIHNwZWNpZmllcyB3aGV0aGVyIHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCBpcyB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZiBhIEhUNDAgY2hhbm5lbC4KKyAqCisgKiBOT1RFOiAgNDk2NSBkb2VzIG5vdCBzdXBwb3J0IEhUNDAgY2hhbm5lbHMgb24gMi40IEdIei4KKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUyAoMioweEEwKQkvKiAxNCBieXRlcyAqLworCisvKgorICogNS4yIEdIeiBIVDQwIGNoYW5uZWxzIDM2ICg0MCksIDQ0ICg0OCksIDUyICg1NiksIDYwICg2NCksCisgKiAxMDAgKDEwNCksIDEwOCAoMTEyKSwgMTE2ICgxMjApLCAxMjQgKDEyOCksIDEzMiAoMTM2KSwgMTQ5ICgxNTMpLCAxNTcgKDE2MSkKKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMUyAoMioweEE4KQkvKiAyMiBieXRlcyAqLworCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MAkJCSgwKQorCitzdHJ1Y3QgaWxfZWVwcm9tX29wcyB7CisJY29uc3QgdTMyIHJlZ3VsYXRvcnlfYmFuZHNbN107CisJaW50ICgqYWNxdWlyZV9zZW1hcGhvcmUpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpyZWxlYXNlX3NlbWFwaG9yZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitpbnQgaWxfZWVwcm9tX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZWVwcm9tX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2NvbnN0IHU4ICppbF9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHNpemVfdCBvZmZzZXQpOwordTE2IGlsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCk7CitpbnQgaWxfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Citjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICppbF9nZXRfY2hhbm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJCSAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCQkJICB1MTYgY2hhbm5lbCk7CisKKyNkZWZpbmUgSUxfTlVNX1NDQU5fUkFURVMgICAgICAgICAoMikKKworc3RydWN0IGlsNDk2NV9jaGFubmVsX3RnZF9pbmZvIHsKKwl1OCB0eXBlOworCXM4IG1heF9wb3dlcjsKK307CisKK3N0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB7CisJczY0IGxhc3RfcmFkYXJfdGltZTsKK307CisKKyNkZWZpbmUgSUw0OTY1X01BWF9SQVRFICgzMykKKworc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIHsKKwkvKiBtYXhpbXVtIHBvd2VyIGxldmVsIHRvIHByZXZlbnQgY2xpcHBpbmcgZm9yIGVhY2ggcmF0ZSwgZGVyaXZlZCBieQorCSAqICAgdXMgZnJvbSB0aGlzIGJhbmQncyBzYXR1cmF0aW9uIHBvd2VyIGluIEVFUFJPTSAqLworCWNvbnN0IHM4IGNsaXBfcG93ZXJzW0lMX01BWF9SQVRFU107Cit9OworCisvKiBjdXJyZW50IFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCByYXRlIGZvciBlYWNoIGNoYW5uZWwuCisgKiByZXF1ZXN0ZWQgcG93ZXIgaXMgbGltaXRlZCBieToKKyAqIC0tIHJlZ3VsYXRvcnkgRUVQUk9NIGxpbWl0cyBmb3IgdGhpcyBjaGFubmVsCisgKiAtLSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKGNsaXAtcG93ZXJzKQorICogLS0gc3BlY3RydW0gbWFuYWdlbWVudAorICogLS0gdXNlciBwcmVmZXJlbmNlIChlLmcuIGl3Y29uZmlnKQorICogd2hlbiByZXF1ZXN0ZWQgcG93ZXIgaXMgc2V0LCBiYXNlIHBvd2VyIGlkeCBtdXN0IGFsc28gYmUgc2V0LiAqLworc3RydWN0IGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCBiYXNlX3Bvd2VyX2lkeDsJLyogZ2FpbiBpZHggZm9yIHBvd2VyIGF0IGZhY3RvcnkgdGVtcC4gKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHBvd2VyIChkQm0pIHJlcXVlc3RlZCBmb3IgdGhpcyBjaG5sL3JhdGUgKi8KK307CisKKy8qIGN1cnJlbnQgc2NhbiBUeCBwb3dlciB2YWx1ZXMgdG8gdXNlLCBvbmUgZm9yIGVhY2ggc2NhbiByYXRlIGZvciBlYWNoCisgKiBjaGFubmVsLiAqLworc3RydWN0IGlsMzk0NV9zY2FuX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHNjYW4gcHdyIChkQm0pIHJlcXVlc3RlZCBmb3IgY2hubC9yYXRlICovCit9OworCisvKgorICogT25lIGZvciBlYWNoIGNoYW5uZWwsIGhvbGRzIGFsbCBjaGFubmVsIHNldHVwIGRhdGEKKyAqIFNvbWUgb2YgdGhlIGZpZWxkcyAoZS5nLiBlZXByb20gYW5kIGZsYWdzL21heF9wb3dlcl9hdmcpIGFyZSByZWR1bmRhbnQKKyAqICAgICB3aXRoIG9uZSBhbm90aGVyIQorICovCitzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvIHsKKwlzdHJ1Y3QgaWw0OTY1X2NoYW5uZWxfdGdkX2luZm8gdGdkOworCXN0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB0Z2g7CisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGVlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgaHQ0MF9lZXByb207CS8qIEVFUFJPTSByZWd1bGF0b3J5IGxpbWl0IGZvcgorCQkJCQkJICogSFQ0MCBjaGFubmVsICovCisKKwl1OCBjaGFubmVsOwkJLyogY2hhbm5lbCBudW1iZXIgKi8KKwl1OCBmbGFnczsJCS8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwlzOCBjdXJyX3R4cG93OwkJLyogKGRCbSkgcmVndWxhdG9yeS9zcGVjdHJ1bS91c2VyIChub3QgaC93KSBsaW1pdCAqLworCXM4IG1pbl9wb3dlcjsJCS8qIGFsd2F5cyAwICovCisJczggc2Nhbl9wb3dlcjsJCS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIGRpcmVjdCBzY2FucywgYW55IHJhdGUgKi8KKworCXU4IGdyb3VwX2lkeDsJCS8qIDAtNCwgbWFwcyBjaGFubmVsIHRvIGdyb3VwMS8yLzMvNC81ICovCisJdTggYmFuZF9pZHg7CQkvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBiYW5kMS8yLzMvNC81ICovCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCisJLyogSFQ0MCBjaGFubmVsIGluZm8gKi8KKwlzOCBodDQwX21heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwl1OCBodDQwX2ZsYWdzOwkJLyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCisJdTggaHQ0MF9leHRlbnNpb25fY2hhbm5lbDsJLyogSFRfSUVfRVhUX0NIQU5ORUxfKiAqLworCisJLyogUmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgZm9yIGVhY2ggIm5vcm1hbCIgZGF0YSBUeCByYXRlLgorCSAqIFRoZXNlIGluY2x1ZGUsIGluIGFkZGl0aW9uIHRvIFJGIGFuZCBEU1AgZ2FpbiwgYSBmZXcgZmllbGRzIGZvcgorCSAqICAgcmVtZW1iZXJpbmcvbW9kaWZ5aW5nIGdhaW4gc2V0dGluZ3MgKGlkeGVzKS4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBwb3dlcl9pbmZvW0lMNDk2NV9NQVhfUkFURV07CisKKwkvKiBSYWRpby9EU1AgZ2FpbiBzZXR0aW5ncyBmb3IgZWFjaCBzY2FuIHJhdGUsIGZvciBkaXJlY3RlZCBzY2Fucy4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3NjYW5fcG93ZXJfaW5mbyBzY2FuX3B3cl9pbmZvW0lMX05VTV9TQ0FOX1JBVEVTXTsKK307CisKKyNkZWZpbmUgSUxfVFhfRklGT19CSwkJMAkvKiBzaGFyZWQgKi8KKyNkZWZpbmUgSUxfVFhfRklGT19CRQkJMQorI2RlZmluZSBJTF9UWF9GSUZPX1ZJCQkyCS8qIHNoYXJlZCAqLworI2RlZmluZSBJTF9UWF9GSUZPX1ZPCQkzCisjZGVmaW5lIElMX1RYX0ZJRk9fVU5VU0VECS0xCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHF1ZXVlcy4gTUFYX05VTSBpcyBkZWZpbmVkIGluIGh3IHNwZWNpZmljIGZpbGVzLgorICogU2V0IHRoZSBtaW5pbXVtIHRvIGFjY29tbW9kYXRlIHRoZSA0IHN0YW5kYXJkIFRYIHF1ZXVlcywgMSBjb21tYW5kCisgKiBxdWV1ZSwgMiAodW51c2VkKSBIQ0NBIHF1ZXVlcywgYW5kIDQgSFQgcXVldWVzIChvbmUgZm9yIGVhY2ggQUMpICovCisjZGVmaW5lIElMX01JTl9OVU1fUVVFVUVTCTEwCisKKyNkZWZpbmUgSUxfREVGQVVMVF9DTURfUVVFVUVfTlVNCTQKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4gICAgICAgICAgICAgIDIzMDQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAgICAgICAgICAgICAzMAorI2RlZmluZSBJRUVFODAyMTFfSExFTiAgICAgICAgICAgICAgICAgIChJRUVFODAyMTFfNEFERFJfTEVOKQorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOICAgICAgICAgICAgIChJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworc3RydWN0IGlsX2ZyYW1lIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOworCQlzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCBiZWFjb247CisJCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKKwkJdTggY21kWzM2MF07CisJfSB1OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKyNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKyNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCitlbnVtIHsKKwlDTURfU1lOQyA9IDAsCisJQ01EX1NJWkVfTk9STUFMID0gMCwKKwlDTURfTk9fU0tCID0gMCwKKwlDTURfU0laRV9IVUdFID0gKDEgPDwgMCksCisJQ01EX0FTWU5DID0gKDEgPDwgMSksCisJQ01EX1dBTlRfU0tCID0gKDEgPDwgMiksCisJQ01EX01BUFBFRCA9ICgxIDw8IDMpLAorfTsKKworI2RlZmluZSBERUZfQ01EX1BBWUxPQURfU0laRSAzMjAKKworLyoqCisgKiBzdHJ1Y3QgaWxfZGV2aWNlX2NtZAorICoKKyAqIEZvciBhbGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIGFuZCB0eCBxdWV1ZXMsIHRoaXMgZXN0YWJsaXNoZXMgdGhlIG92ZXJhbGwKKyAqIHNpemUgb2YgdGhlIGxhcmdlc3QgY29tbWFuZCB3ZSBzZW5kIHRvIHVDb2RlLCBleGNlcHQgZm9yIGEgc2NhbiBjb21tYW5kCisgKiAod2hpY2ggaXMgcmVsYXRpdmVseSBodWdlOyBzcGFjZSBpcyBhbGxvY2F0ZWQgc2VwYXJhdGVseSkuCisgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kIHsKKwlzdHJ1Y3QgaWxfY21kX2hlYWRlciBoZHI7CS8qIHVDb2RlIEFQSSAqLworCXVuaW9uIHsKKwkJdTMyIGZsYWdzOworCQl1OCB2YWw4OworCQl1MTYgdmFsMTY7CisJCXUzMiB2YWwzMjsKKwkJc3RydWN0IGlsX3R4X2NtZCB0eDsKKwkJdTggcGF5bG9hZFtERUZfQ01EX1BBWUxPQURfU0laRV07CisJfSBfX3BhY2tlZCBjbWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFRGRF9NQVhfUEFZTE9BRF9TSVpFIChzaXplb2Yoc3RydWN0IGlsX2RldmljZV9jbWQpKQorCitzdHJ1Y3QgaWxfaG9zdF9jbWQgeworCWNvbnN0IHZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyByZXBseV9wYWdlOworCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgc3RydWN0IGlsX3J4X3BrdCAqcGt0KTsKKwl1MzIgZmxhZ3M7CisJdTE2IGxlbjsKKwl1OCBpZDsKK307CisKKyNkZWZpbmUgU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFMgIDgKKyNkZWZpbmUgU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFMgIDQKKyNkZWZpbmUgU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFMgIDEyCisKKy8qKgorICogc3RydWN0IGlsX3J4X3F1ZXVlIC0gUnggcXVldWUKKyAqIEBiZDogZHJpdmVyJ3MgcG9pbnRlciB0byBidWZmZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgKHJiZCkKKyAqIEBiZF9kbWE6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQorICogQHJlYWQ6IFNoYXJlZCBpZHggdG8gbmV3ZXN0IGF2YWlsYWJsZSBSeCBidWZmZXIKKyAqIEB3cml0ZTogU2hhcmVkIGlkeCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQKKyAqIEBmcmVlX2NvdW50OiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUKKyAqIEByeF9mcmVlOiBsaXN0IG9mIGZyZWUgU0tCcyBmb3IgdXNlCisgKiBAcnhfdXNlZDogTGlzdCBvZiBSeCBidWZmZXJzIHdpdGggbm8gU0tCCisgKiBAbmVlZF91cGRhdGU6IGZsYWcgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpZHgKKyAqIEByYl9zdHRzOiBkcml2ZXIncyBwb2ludGVyIHRvIHJlY2VpdmUgYnVmZmVyIHN0YXR1cworICogQHJiX3N0dHNfZG1hOiBidXMgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMKKyAqCisgKiBOT1RFOiAgcnhfZnJlZSBhbmQgcnhfdXNlZCBhcmUgdXNlZCBhcyBhIEZJRk8gZm9yIGlsX3J4X2J1ZnMKKyAqLworc3RydWN0IGlsX3J4X3F1ZXVlIHsKKwlfX2xlMzIgKmJkOworCWRtYV9hZGRyX3QgYmRfZG1hOworCXN0cnVjdCBpbF9yeF9idWYgcG9vbFtSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTXTsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKKwl1MzIgcmVhZDsKKwl1MzIgd3JpdGU7CisJdTMyIGZyZWVfY291bnQ7CisJdTMyIHdyaXRlX2FjdHVhbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCByeF91c2VkOworCWludCBuZWVkX3VwZGF0ZTsKKwlzdHJ1Y3QgaWxfcmJfc3RhdHVzICpyYl9zdHRzOworCWRtYV9hZGRyX3QgcmJfc3R0c19kbWE7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2RlZmluZSBJTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAorCisjZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKKworI2RlZmluZSBJTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKKyNkZWZpbmUgSUxfSU5WQUxJRF9WQUxVRSAgICAtMQorCisvKioKKyAqIHN0cnVjdCBpbF9odF9hZ2cgLS0gYWdncmVnYXRpb24gc3RhdHVzIHdoaWxlIHdhaXRpbmcgZm9yIGJsb2NrLWFjaworICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBmb3IgVHggYXR0ZW1wdAorICogQGZyYW1lX2NvdW50OiAjIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZAorICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5CisgKiBAc3RhcnRfaWR4OiBJbmRleCBvZiAxc3QgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKSBpbiBUeCB3aW4KKyAqIEBiaXRtYXAwOiBMb3cgb3JkZXIgYml0bWFwLCBvbmUgYml0IGZvciBlYWNoIGZyYW1lIHBlbmRpbmcgQUNLIGluIFR4IHdpbgorICogQGJpdG1hcDE6IEhpZ2ggb3JkZXIsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luCisgKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQKKyAqCisgKiBJZiBDX1RYIGluZGljYXRlcyB0aGF0IGFnZ3JlZ2F0aW9uIHdhcyBhdHRlbXB0ZWQsIGRyaXZlciBtdXN0IHdhaXQKKyAqIGZvciBibG9jayBhY2sgKE5fQ09NUFJFU1NFRF9CQSkuICBUaGlzIHN0cnVjdCBzdG9yZXMgdHggcmVwbHkgaW5mbworICogdW50aWwgYmxvY2sgYWNrIGFycml2ZXMuCisgKi8KK3N0cnVjdCBpbF9odF9hZ2cgeworCXUxNiB0eHFfaWQ7CisJdTE2IGZyYW1lX2NvdW50OworCXUxNiB3YWl0X2Zvcl9iYTsKKwl1MTYgc3RhcnRfaWR4OworCXU2NCBiaXRtYXA7CisJdTMyIHJhdGVfbl9mbGFnczsKKyNkZWZpbmUgSUxfQUdHX09GRiAwCisjZGVmaW5lIElMX0FHR19PTiAxCisjZGVmaW5lIElMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBIDIKKyNkZWZpbmUgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkEgMworCXU4IHN0YXRlOworfTsKKworc3RydWN0IGlsX3RpZF9kYXRhIHsKKwl1MTYgc2VxX251bWJlcjsJCS8qIDQ5NjUgb25seSAqLworCXUxNiB0ZmRzX2luX3F1ZXVlOworCXN0cnVjdCBpbF9odF9hZ2cgYWdnOworfTsKKworc3RydWN0IGlsX2h3X2tleSB7CisJdTMyIGNpcGhlcjsKKwlpbnQga2V5bGVuOworCXU4IGtleWlkeDsKKwl1OCBrZXlbMzJdOworfTsKKwordW5pb24gaWxfaHRfcmF0ZV9zdXBwIHsKKwl1MTYgcmF0ZXM7CisJc3RydWN0IHsKKwkJdTggc2lzb19yYXRlOworCQl1OCBtaW1vX3JhdGU7CisJfTsKK307CisKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SyAgICgweDApCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMTZLICAoMHgxKQorI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzMySyAgKDB4MikKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsgICgweDMpCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SworI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01BWCAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9NSU4gIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfOEsKKworLyoKKyAqIE1heGltYWwgTVBEVSBkZW5zaXR5IGZvciBUWCBhZ2dyZWdhdGlvbgorICogNCAtIDJ1cyBkZW5zaXR5CisgKiA1IC0gNHVzIGRlbnNpdHkKKyAqIDYgLSA4dXMgZGVuc2l0eQorICogNyAtIDE2dXMgZGVuc2l0eQorICovCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMlVTRUMgICAoMHg0KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDICAgKDB4NSkKKyNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV84VVNFQyAgICgweDYpCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDICAoMHg3KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRiBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUFYIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUlOICAgICAoMHgxKQorCitzdHJ1Y3QgaWxfaHRfY29uZmlnIHsKKwlib29sIHNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OworCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzOwkvKiBjdXJyZW50IHNtcHMgbW9kZSAqLworfTsKKworLyogUW9TIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpbF9xb3NfaW5mbyB7CisJaW50IHFvc19hY3RpdmU7CisJc3RydWN0IGlsX3Fvc3BhcmFtX2NtZCBkZWZfcW9zX3Bhcm07Cit9OworCisvKgorICogU3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHN0YV9sb2NrIGhlbGQuIFdoZW4gc3RhdGlvbiBhZGRpdGlvbgorICogaXMgaW4gcHJvZ3Jlc3MgKElMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3Mgb25seQorICogdGhlIGNvbW1hbmRzIChpbF9hZGRzdGFfY21kIGFuZCBpbF9saW5rX3F1YWxpdHlfY21kKSB3aXRob3V0CisgKiBzdGFfbG9jayBoZWxkLgorICovCitzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSB7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhOworCXN0cnVjdCBpbF90aWRfZGF0YSB0aWRbTUFYX1RJRF9DT1VOVF07CisJdTggdXNlZCwgY3R4aWQ7CisJc3RydWN0IGlsX2h3X2tleSBrZXlpbmZvOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscTsKK307CisKK3N0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uIHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggc3RhX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWxfdmlmX3ByaXYgLSBkcml2ZXIncyBpbGF0ZSBwZXItaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKgorICogV2hlbiBtYWM4MDIxMSBhbGxvY2F0ZXMgYSB2aXJ0dWFsIGludGVyZmFjZSwgaXQgY2FuIGFsbG9jYXRlCisgKiBzcGFjZSBmb3IgdXMgdG8gcHV0IGRhdGEgaW50by4KKyAqLworc3RydWN0IGlsX3ZpZl9wcml2IHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggaWJzc19ic3NpZF9zdGFfaWQ7Cit9OworCisvKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCitzdHJ1Y3QgZndfZGVzYyB7CisJdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLworCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KKwl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KK307CisKKy8qIHVDb2RlIGZpbGUgbGF5b3V0ICovCitzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyIHsKKwlfX2xlMzIgdmVyOwkJLyogbWFqb3IvbWlub3IvQVBJL3NlcmlhbCAqLworCXN0cnVjdCB7CisJCV9fbGUzMiBpbnN0X3NpemU7CS8qIGJ5dGVzIG9mIHJ1bnRpbWUgY29kZSAqLworCQlfX2xlMzIgZGF0YV9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGRhdGEgKi8KKwkJX19sZTMyIGluaXRfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBjb2RlICovCisJCV9fbGUzMiBpbml0X2RhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBkYXRhICovCisJCV9fbGUzMiBib290X3NpemU7CS8qIGJ5dGVzIG9mIGJvb3RzdHJhcCBjb2RlICovCisJCXU4IGRhdGFbMF07CS8qIGluIHNhbWUgb3JkZXIgYXMgc2l6ZXMgKi8KKwl9IHYxOworfTsKKworc3RydWN0IGlsNDk2NV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bTsKKwl1MTYgZnJhZ19udW07CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzIHsKKwl1MTYgbWluX25yZ19jY2s7CisJdTE2IG1heF9ucmdfY2NrOworCisJdTE2IG5yZ190aF9jY2s7CisJdTE2IG5yZ190aF9vZmRtOworCisJdTE2IGF1dG9fY29ycl9taW5fb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfY2NrOworCXUxNiBhdXRvX2NvcnJfbWF4X2Nja19tcmM7CisJdTE2IGF1dG9fY29ycl9taW5fY2NrOworCXUxNiBhdXRvX2NvcnJfbWluX2Nja19tcmM7CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh4KSAoKHgpLTI3MykKKyNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4oeCkgKCh4KSsyNzMpCisKKy8qKgorICogc3RydWN0IGlsX2h3X3BhcmFtcworICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCisgKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKKyAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcworICogQHRmZF9zaXplOiBURkQgc2l6ZQorICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKKyAqIEB2YWxpZF90eC9yeF9hbnQ6IHVzYWJsZSBhbnRlbm5hcworICogQG1heF9yeHFfc2l6ZTogTWF4ICMgUnggZnJhbWVzIGluIFJ4IHF1ZXVlIChtdXN0IGJlIHBvd2VyLW9mLTIpCisgKiBAbWF4X3J4cV9sb2c6IExvZy1iYXNlLTIgb2YgbWF4X3J4cV9zaXplCisgKiBAcnhfcGFnZV9vcmRlcjogUnggYnVmZmVyIHBhZ2Ugb3JkZXIKKyAqIEByeF93cnRfcHRyX3JlZzogRkh7Mzl9X1JTQ1NSX0NITkwwX1dQVFIKKyAqIEBtYXhfc3RhdGlvbnM6CisgKiBAaHQ0MF9jaGFubmVsOiBpcyA0ME1IeiB3aWR0aCBwb3NzaWJsZSBpbiBiYW5kIDIuNAorICogQklUKElFRUU4MDIxMV9CQU5EXzVHSFopIEJJVChJRUVFODAyMTFfQkFORF81R0haKQorICogQHN3X2NyeXB0bzogMCBmb3IgaHcsIDEgZm9yIHN3CisgKiBAbWF4X3h4eF9zaXplOiBmb3IgdWNvZGUgdXNlcworICogQGN0X2tpbGxfdGhyZXNob2xkOiB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQKKyAqIEBiZWFjb25fdGltZV90c2ZfYml0czogbnVtYmVyIG9mIHZhbGlkIHRzZiBiaXRzIGZvciBiZWFjb24gdGltZQorICogQHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcworICovCitzdHJ1Y3QgaWxfaHdfcGFyYW1zIHsKKwl1OCBtYXhfdHhxX251bTsKKwl1OCBkbWFfY2hubF9udW07CisJdTE2IHNjZF9iY190YmxzX3NpemU7CisJdTMyIHRmZF9zaXplOworCXU4IHR4X2NoYWluc19udW07CisJdTggcnhfY2hhaW5zX251bTsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXUxNiBtYXhfcnhxX3NpemU7CisJdTE2IG1heF9yeHFfbG9nOworCXUzMiByeF9wYWdlX29yZGVyOworCXUzMiByeF93cnRfcHRyX3JlZzsKKwl1OCBtYXhfc3RhdGlvbnM7CisJdTggaHQ0MF9jaGFubmVsOworCXU4IG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KKwl1MzIgbWF4X2luc3Rfc2l6ZTsKKwl1MzIgbWF4X2RhdGFfc2l6ZTsKKwl1MzIgbWF4X2JzbV9zaXplOworCXUzMiBjdF9raWxsX3RocmVzaG9sZDsJLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCisJdTE2IGJlYWNvbl90aW1lX3RzZl9iaXRzOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnNlbnM7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGNvcmUgbW9kdWxlIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsLVs0LTVdLmMKKyAqCisgKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGhhcmR3YXJlIHNwZWNpZmljCisgKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGNvcmUgbW9kdWxlIGZpbGVzLgorICoKKyAqIE5hbWluZyBjb252ZW50aW9uIC0tCisgKiBpbF8gICAgICAgICA8LS0gSXMgcGFydCBvZiBpd2x3aWZpCisgKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQorICogaWw0OTY1X2JnXyAgICAgIDwtLSBDYWxsZWQgZnJvbSB3b3JrIHF1ZXVlIGNvbnRleHQKKyAqIGlsNDk2NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGlsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBjb25zdCB1OCBpbF9iY2FzdF9hZGRyW0VUSF9BTEVOXTsKK2V4dGVybiBpbnQgaWxfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3F1ZXVlICpxKTsKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpbF9xdWV1ZSAqcSwgaW50IGkpCit7CisJcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/IChpID49IHEtPnJlYWRfcHRyICYmCisJCQkJCSAgICAgIGkgPCBxLT53cml0ZV9wdHIpIDogIShpIDwKKwkJCQkJCQkJICAgIHEtPnJlYWRfcHRyCisJCQkJCQkJCSAgICAmJiBpID49CisJCQkJCQkJCSAgICBxLT4KKwkJCQkJCQkJICAgIHdyaXRlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsX2dldF9jbWRfaWR4KHN0cnVjdCBpbF9xdWV1ZSAqcSwgdTMyIGlkeCwgaW50IGlzX2h1Z2UpCit7CisJLyoKKwkgKiBUaGlzIGlzIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdCBhbmQgc2NhbiBjb21tYW5kIHdoaWNoCisJICogcmVxdWlyZWQgYnVmZmVyID4gVEZEX01BWF9QQVlMT0FEX1NJWkUsCisJICogdGhlIGJpZyBidWZmZXIgYXQgZW5kIG9mIGNvbW1hbmQgYXJyYXkKKwkgKi8KKwlpZiAoaXNfaHVnZSkKKwkJcmV0dXJuIHEtPm5fd2luOwkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworCS8qIE90aGVyd2lzZSwgdXNlIG5vcm1hbCBzaXplIGJ1ZmZlcnMgKi8KKwlyZXR1cm4gaWR4ICYgKHEtPm5fd2luIC0gMSk7Cit9CisKK3N0cnVjdCBpbF9kbWFfcHRyIHsKKwlkbWFfYWRkcl90IGRtYTsKKwl2b2lkICphZGRyOworCXNpemVfdCBzaXplOworfTsKKworI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV9BVVRPICAgICAwCisjZGVmaW5lIElMX09QRVJBVElPTl9NT0RFX0hUX09OTFkgIDEKKyNkZWZpbmUgSUxfT1BFUkFUSU9OX01PREVfTUlYRUQgICAgMgorI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV8yME1IWiAgICAzCisKKyNkZWZpbmUgSUxfVFhfQ1JDX1NJWkUgNAorI2RlZmluZSBJTF9UWF9ERUxJTUlURVJfU0laRSA0CisKKyNkZWZpbmUgVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFIC0xMDAwMAorCisvKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgorI2RlZmluZSBJTDQ5NjVfQ0FMX05VTV9CRUFDT05TCQkyMAorI2RlZmluZSBJTF9DQUxfTlVNX0JFQUNPTlMJCTE2CisjZGVmaW5lIE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUwkxNQorCisjZGVmaW5lIENIQUlOX05PSVNFX01BWF9ERUxUQV9HQUlOX0NPREUgMworCisjZGVmaW5lIE1BWF9GQV9PRkRNICA1MAorI2RlZmluZSBNSU5fRkFfT0ZETSAgNQorI2RlZmluZSBNQVhfRkFfQ0NLICAgNTAKKyNkZWZpbmUgTUlOX0ZBX0NDSyAgIDUKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9PRkRNICAgICAgIDEKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9DQ0sgICAgIDMKKyNkZWZpbmUgQVVUT19DT1JSX01BWF9USF9DQ0sgICAxNjAKKworI2RlZmluZSBOUkdfRElGRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTlJHX1NURVBfQ0NLICAgICAgICAgICAyCisjZGVmaW5lIE5SR19NQVJHSU4gICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTlVNQkVSX0NDS19OT19GQSAxMDAKKworI2RlZmluZSBBVVRPX0NPUlJfQ0NLX01JTl9WQUxfREVGICAgICgxMjUpCisKKyNkZWZpbmUgQ0hBSU5fQSAgICAgICAgICAgICAwCisjZGVmaW5lIENIQUlOX0IgICAgICAgICAgICAgMQorI2RlZmluZSBDSEFJTl9DICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCA0CisjZGVmaW5lIEFMTF9CQU5EX0ZJTFRFUgkJCTB4RkYwMAorI2RlZmluZSBJTl9CQU5EX0ZJTFRFUgkJCTB4RkYKKyNkZWZpbmUgTUlOX0FWRVJBR0VfTk9JU0VfTUFYX1ZBTFVFCTB4RkZGRkZGRkYKKworI2RlZmluZSBOUkdfTlVNX1BSRVZfU1RBVF9MICAgICAyMAorI2RlZmluZSBOVU1fUlhfQ0hBSU5TICAgICAgICAgICAzCisKK2VudW0gaWw0OTY1X2ZhbHNlX2FsYXJtX3N0YXRlIHsKKwlJTF9GQV9UT09fTUFOWSA9IDAsCisJSUxfRkFfVE9PX0ZFVyA9IDEsCisJSUxfRkFfR09PRF9SQU5HRSA9IDIsCit9OworCitlbnVtIGlsNDk2NV9jaGFpbl9ub2lzZV9zdGF0ZSB7CisJSUxfQ0hBSU5fTk9JU0VfQUxJVkUgPSAwLAkvKiBtdXN0IGJlIDAgKi8KKwlJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFLAorCUlMX0NIQUlOX05PSVNFX0NBTElCUkFURUQsCisJSUxfQ0hBSU5fTk9JU0VfRE9ORSwKK307CisKK2VudW0gaWw0OTY1X2NhbGliX2VuYWJsZWRfc3RhdGUgeworCUlMX0NBTElCX0RJU0FCTEVEID0gMCwJLyogbXVzdCBiZSAwICovCisJSUxfQ0FMSUJfRU5BQkxFRCA9IDEsCit9OworCisvKgorICogZW51bSBpbF9jYWxpYgorICogZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcmVzdWx0cyBvZiBpbml0aWFsIGNhbGlicmF0aW9ucworICogc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgdUNvZGUKKyAqLworZW51bSBpbF9jYWxpYiB7CisJSUxfQ0FMSUJfTUFYLAorfTsKKworLyogT3BhcXVlIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KK3N0cnVjdCBpbF9jYWxpYl9yZXN1bHQgeworCXZvaWQgKmJ1ZjsKKwlzaXplX3QgYnVmX2xlbjsKK307CisKK2VudW0gdWNvZGVfdHlwZSB7CisJVUNPREVfTk9ORSA9IDAsCisJVUNPREVfSU5JVCwKKwlVQ09ERV9SVAorfTsKKworLyogU2Vuc2l0aXZpdHkgY2FsaWIgZGF0YSAqLworc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgeworCXUzMiBhdXRvX2NvcnJfb2ZkbTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjOworCXUzMiBhdXRvX2NvcnJfb2ZkbV94MTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjX3gxOworCXUzMiBhdXRvX2NvcnJfY2NrOworCXUzMiBhdXRvX2NvcnJfY2NrX21yYzsKKworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9vZmRtOworCXUzMiBsYXN0X2ZhX2NudF9vZmRtOworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9jY2s7CisJdTMyIGxhc3RfZmFfY250X2NjazsKKworCXUzMiBucmdfY3Vycl9zdGF0ZTsKKwl1MzIgbnJnX3ByZXZfc3RhdGU7CisJdTMyIG5yZ192YWx1ZVsxMF07CisJdTggbnJnX3NpbGVuY2VfcnNzaVtOUkdfTlVNX1BSRVZfU1RBVF9MXTsKKwl1MzIgbnJnX3NpbGVuY2VfcmVmOworCXUzMiBucmdfZW5lcmd5X2lkeDsKKwl1MzIgbnJnX3NpbGVuY2VfaWR4OworCXUzMiBucmdfdGhfY2NrOworCXMzMiBucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZjsKKwl1MzIgbnVtX2luX2Nja19ub19mYTsKKwl1MzIgbnJnX3RoX29mZG07CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworLyogQ2hhaW4gbm9pc2UgKGRpZmZlcmVudGlhbCBSeCBnYWluKSBjYWxpYiBkYXRhICovCitzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSB7CisJdTMyIGFjdGl2ZV9jaGFpbnM7CisJdTMyIGNoYWluX25vaXNlX2E7CisJdTMyIGNoYWluX25vaXNlX2I7CisJdTMyIGNoYWluX25vaXNlX2M7CisJdTMyIGNoYWluX3NpZ25hbF9hOworCXUzMiBjaGFpbl9zaWduYWxfYjsKKwl1MzIgY2hhaW5fc2lnbmFsX2M7CisJdTE2IGJlYWNvbl9jb3VudDsKKwl1OCBkaXNjb25uX2FycmF5W05VTV9SWF9DSEFJTlNdOworCXU4IGRlbHRhX2dhaW5fY29kZVtOVU1fUlhfQ0hBSU5TXTsKKwl1OCByYWRpb193cml0ZTsKKwl1OCBzdGF0ZTsKK307CisKKyNkZWZpbmUJRUVQUk9NX1NFTV9USU1FT1VUIDEwCS8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBFRVBST01fU0VNX1JFVFJZX0xJTUlUIDEwMDAJLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KKworI2RlZmluZSBJTF9UUkFGRklDX0VOVFJJRVMJKDI1NikKKyNkZWZpbmUgSUxfVFJBRkZJQ19FTlRSWV9TSVpFICAoNjQpCisKK2VudW0geworCU1FQVNVUkVNRU5UX1JFQURZID0gKDEgPDwgMCksCisJTUVBU1VSRU1FTlRfQUNUSVZFID0gKDEgPDwgMSksCit9OworCisvKiBpbnRlcnJ1cHQgc3RhdHMgKi8KK3N0cnVjdCBpc3Jfc3RhdHMgeworCXUzMiBodzsKKwl1MzIgc3c7CisJdTMyIGVycl9jb2RlOworCXUzMiBzY2g7CisJdTMyIGFsaXZlOworCXUzMiByZmtpbGw7CisJdTMyIGN0a2lsbDsKKwl1MzIgd2FrZXVwOworCXUzMiByeDsKKwl1MzIgaGFuZGxlcnNbSUxfQ05fTUFYXTsKKwl1MzIgdHg7CisJdTMyIHVuaGFuZGxlZDsKK307CisKKy8qIG1hbmFnZW1lbnQgc3RhdHMgKi8KK2VudW0gaWxfbWdtdF9zdGF0cyB7CisJTUFOQUdFTUVOVF9BU1NPQ19SRVEgPSAwLAorCU1BTkFHRU1FTlRfQVNTT0NfUkVTUCwKKwlNQU5BR0VNRU5UX1JFQVNTT0NfUkVRLAorCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVRLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVTUCwKKwlNQU5BR0VNRU5UX0JFQUNPTiwKKwlNQU5BR0VNRU5UX0FUSU0sCisJTUFOQUdFTUVOVF9ESVNBU1NPQywKKwlNQU5BR0VNRU5UX0FVVEgsCisJTUFOQUdFTUVOVF9ERUFVVEgsCisJTUFOQUdFTUVOVF9BQ1RJT04sCisJTUFOQUdFTUVOVF9NQVgsCit9OworLyogY29udHJvbCBzdGF0cyAqLworZW51bSBpbF9jdHJsX3N0YXRzIHsKKwlDT05UUk9MX0JBQ0tfUkVRID0gMCwKKwlDT05UUk9MX0JBQ0ssCisJQ09OVFJPTF9QU1BPTEwsCisJQ09OVFJPTF9SVFMsCisJQ09OVFJPTF9DVFMsCisJQ09OVFJPTF9BQ0ssCisJQ09OVFJPTF9DRkVORCwKKwlDT05UUk9MX0NGRU5EQUNLLAorCUNPTlRST0xfTUFYLAorfTsKKworc3RydWN0IHRyYWZmaWNfc3RhdHMgeworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJdTMyIG1nbXRbTUFOQUdFTUVOVF9NQVhdOworCXUzMiBjdHJsW0NPTlRST0xfTUFYXTsKKwl1MzIgZGF0YV9jbnQ7CisJdTY0IGRhdGFfYnl0ZXM7CisjZW5kaWYKK307CisKKy8qCisgKiBob3N0IGludGVycnVwdCB0aW1lb3V0IHZhbHVlCisgKiB1c2VkIHdpdGggc2V0dGluZyBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lcgorICogdGhlIENTUl9JTlRfQ09BTEVTQ0lORyBpcyBhbiA4IGJpdCByZWdpc3RlciBpbiAzMi11c2VjIHVuaXQKKyAqCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIGlzIDY0IHggMzIgPSAyMDQ4IHVzZWNzCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIGlzIDE2IHggMzIgPSA1MTIgdXNlY3MKKyAqLworI2RlZmluZSBJTF9IT1NUX0lOVF9USU1FT1VUX01BWAkoMHhGRikKKyNkZWZpbmUgSUxfSE9TVF9JTlRfVElNRU9VVF9ERUYJKDB4NDApCisjZGVmaW5lIElMX0hPU1RfSU5UX1RJTUVPVVRfTUlOCSgweDApCisjZGVmaW5lIElMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUFYCSgweEZGKQorI2RlZmluZSBJTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKKyNkZWZpbmUgSUxfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NSU4JKDB4MCkKKworI2RlZmluZSBJTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRCAoSFoqNSkKKworLyogVFggcXVldWUgd2F0Y2hkb2cgdGltZW91dHMgaW4gbVNlY3MgKi8KKyNkZWZpbmUgSUxfREVGX1dEX1RJTUVPVVQJKDIwMDApCisjZGVmaW5lIElMX0xPTkdfV0RfVElNRU9VVAkoMTAwMDApCisjZGVmaW5lIElMX01BWF9XRF9USU1FT1VUCSgxMjAwMDApCisKK3N0cnVjdCBpbF9mb3JjZV9yZXNldCB7CisJaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7CisJaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7CisJaW50IHJlc2V0X3JlamVjdF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2R1cmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOworfTsKKworLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCisvKgorICogZm9yIF8zOTQ1IGRldmljZXMKKyAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAorICogYml0cyAyMzowICAtIGludGVydmFsCisgKi8KKyNkZWZpbmUgSUwzOTQ1X0VYVF9CRUFDT05fVElNRV9QT1MJMjQKKy8qCisgKiBmb3IgXzQ5NjUgZGV2aWNlcworICogYml0cyAzMToyMiAtIGV4dGVuZGVkCisgKiBiaXRzIDIxOjAgIC0gaW50ZXJ2YWwKKyAqLworI2RlZmluZSBJTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUwkyMgorCitzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCisJY29uc3QgdTggKmFjX3RvX2ZpZm87CisJY29uc3QgdTggKmFjX3RvX3F1ZXVlOworCXU4IG1jYXN0X3F1ZXVlOworCisJLyoKKwkgKiBXZSBjb3VsZCB1c2UgdGhlIHZpZiB0byBpbmRpY2F0ZSBhY3RpdmUsIGJ1dCB3ZQorCSAqIGFsc28gbmVlZCBpdCB0byBiZSBhY3RpdmUgZHVyaW5nIGRpc2FibGluZyB3aGVuCisJICogd2UgYWxyZWFkeSByZW1vdmVkIHRoZSB2aWYgZm9yIHR5cGUgc2V0dGluZy4KKwkgKi8KKwlib29sIGFsd2F5c19hY3RpdmUsIGlzX2FjdGl2ZTsKKworCWJvb2wgaHRfbmVlZF9tdWx0aXBsZV9jaGFpbnM7CisKKwlpbnQgY3R4aWQ7CisKKwl1MzIgaW50ZXJmYWNlX21vZGVzLCBleGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCXU4IHVudXNlZF9kZXZ0eXBlLCBhcF9kZXZ0eXBlLCBpYnNzX2RldnR5cGUsIHN0YXRpb25fZGV2dHlwZTsKKworCS8qCisJICogV2UgZGVjbGFyZSB0aGlzIGNvbnN0IHNvIGl0IGNhbiBvbmx5IGJlCisJICogY2hhbmdlZCB2aWEgZXhwbGljaXQgY2FzdCB3aXRoaW4gdGhlCisJICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIHBoeXNpY2FsCisJICogaGFyZHdhcmUuCisJICovCisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kIGFjdGl2ZTsKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgc3RhZ2luZzsKKworCXN0cnVjdCBpbF9yeG9uX3RpbWVfY21kIHRpbWluZzsKKworCXN0cnVjdCBpbF9xb3NfaW5mbyBxb3NfZGF0YTsKKworCXU4IGJjYXN0X3N0YV9pZCwgYXBfc3RhX2lkOworCisJdTggcnhvbl9jbWQsIHJ4b25fYXNzb2NfY21kLCByeG9uX3RpbWluZ19jbWQ7CisJdTggcW9zX2NtZDsKKwl1OCB3ZXBfa2V5X2NtZDsKKworCXN0cnVjdCBpbF93ZXBfa2V5IHdlcF9rZXlzW1dFUF9LRVlTX01BWF07CisJdTgga2V5X21hcHBpbmdfa2V5czsKKworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOworCisJc3RydWN0IHsKKwkJYm9vbCBub25fZ2Zfc3RhX3ByZXNlbnQ7CisJCXU4IHByb3RlY3Rpb247CisJCWJvb2wgZW5hYmxlZCwgaXNfNDBtaHo7CisJCXU4IGV4dGVuc2lvbl9jaGFuX29mZnNldDsKKwl9IGh0OworfTsKKworc3RydWN0IGlsX3Bvd2VyX21nciB7CisJc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIHNsZWVwX2NtZDsKKwlzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgc2xlZXBfY21kX25leHQ7CisJaW50IGRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlOworCWJvb2wgcGNpX3BtOworfTsKKworc3RydWN0IGlsX3ByaXYgeworCisJLyogaWVlZSBkZXZpY2UgdXNlZCBieSBnZW5lcmljIGllZWUgcHJvY2Vzc2luZyBjb2RlICovCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICppZWVlX2NoYW5uZWxzOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqaWVlZV9yYXRlczsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmc7CisKKwkvKiB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2ZyYW1lczsKKwlpbnQgZnJhbWVzX2NvdW50OworCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCWludCBhbGxvY19yeGJfcGFnZTsKKworCXZvaWQgKCpoYW5kbGVyc1tJTF9DTl9NQVhdKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107CisKKwkvKiBzcGVjdHJ1bSBtZWFzdXJlbWVudCByZXBvcnQgY2FjaGluZyAqLworCXN0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7CisJdTggbWVhc3VyZW1lbnRfc3RhdHVzOworCisJLyogdWNvZGUgYmVhY29uIHRpbWUgKi8KKwl1MzIgdWNvZGVfYmVhY29uX3RpbWU7CisJaW50IG1pc3NlZF9iZWFjb25fdGhyZXNob2xkOworCisJLyogdHJhY2sgSUJTUyBtYW5hZ2VyIChsYXN0IGJlYWNvbikgc3RhdHVzICovCisJdTMyIGlic3NfbWFuYWdlcjsKKworCS8qIGZvcmNlIHJlc2V0ICovCisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0IGZvcmNlX3Jlc2V0OworCisJLyogd2UgYWxsb2NhdGUgYXJyYXkgb2YgaWxfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KKwkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpZHggYXJyYXkgKi8KKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLworCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KKworCS8qIHRoZXJtYWwgY2FsaWJyYXRpb24gKi8KKwlzMzIgdGVtcGVyYXR1cmU7CS8qIGRlZ3JlZXMgS2VsdmluICovCisJczMyIGxhc3RfdGVtcGVyYXR1cmU7CisKKwkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgaWxfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSUxfQ0FMSUJfTUFYXTsKKworCS8qIFNjYW4gcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0X3RzZjsKKwl2b2lkICpzY2FuX2NtZDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIHNjYW5fYmFuZDsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnNjYW5fdmlmOworCXU4IHNjYW5fdHhfYW50W0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXU4IG1nbXRfdHhfYW50OworCisJLyogc3BpbmxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgZ2VuZXJhbCBzaGFyZWQgZGF0YSAqLworCXNwaW5sb2NrX3QgaGNtZF9sb2NrOwkvKiBwcm90ZWN0IGhjbWQgKi8KKwlzcGlubG9ja190IHJlZ19sb2NrOwkvKiBwcm90ZWN0IGh3IHJlZ2lzdGVyIGFjY2VzcyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCS8qIGJhc2ljIHBjaS1uZXR3b3JrIGRyaXZlciBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCisJLyogcGNpIGhhcmR3YXJlIGFkZHJlc3Mgc3VwcG9ydCAqLworCXZvaWQgX19pb21lbSAqaHdfYmFzZTsKKwl1MzIgaHdfcmV2OworCXUzMiBod193YV9yZXY7CisJdTggcmV2X2lkOworCisJLyogY29tbWFuZCBxdWV1ZSBudW1iZXIgKi8KKwl1OCBjbWRfcXVldWU7CisKKwkvKiBtYXggbnVtYmVyIG9mIHN0YXRpb24ga2V5cyAqLworCXU4IHN0YV9rZXlfbWF4X251bTsKKworCS8qIEVFUFJPTSBNQUMgYWRkcmVzc2VzICovCisJc3RydWN0IG1hY19hZGRyZXNzIGFkZHJlc3Nlc1sxXTsKKworCS8qIHVDb2RlIGltYWdlcywgc2F2ZSB0byByZWxvYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJaW50IGZ3X2lkeDsJCS8qIGZpcm13YXJlIHdlJ3JlIHRyeWluZyB0byBsb2FkICovCisJdTMyIHVjb2RlX3ZlcjsJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKKwkJCQkgICBpbF91Y29kZS52ZXIgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9jb2RlOwkvKiBydW50aW1lIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhOwkvKiBydW50aW1lIGRhdGEgb3JpZ2luYWwgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhX2JhY2t1cDsJLyogcnVudGltZSBkYXRhIHNhdmUvcmVzdG9yZSAqLworCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXQ7CS8qIGluaXRpYWxpemF0aW9uIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9pbml0X2RhdGE7CS8qIGluaXRpYWxpemF0aW9uIGRhdGEgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9ib290OwkvKiBib290c3RyYXAgaW5zdCAqLworCWVudW0gdWNvZGVfdHlwZSB1Y29kZV90eXBlOworCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KKwljaGFyIGZpcm13YXJlX25hbWVbMjVdOworCisJc3RydWN0IGlsX3J4b25fY29udGV4dCBjdHg7CisKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CisKKwkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCisJICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KKwlzdHJ1Y3QgaWxfaW5pdF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmVfaW5pdDsKKwlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCBjYXJkX2FsaXZlOworCisJdTE2IGFjdGl2ZV9yYXRlOworCisJdTggc3RhcnRfY2FsaWI7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSBjaGFpbl9ub2lzZV9kYXRhOworCV9fbGUxNiBzZW5zaXRpdml0eV90YmxbSERfVEJMX1NJWkVdOworCisJc3RydWN0IGlsX2h0X2NvbmZpZyBjdXJyZW50X2h0X2NvbmZpZzsKKworCS8qIFJhdGUgc2NhbGluZyBkYXRhICovCisJdTggcmV0cnlfcmF0ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKKworCWludCBhY3Rpdml0eV90aW1lcl9hY3RpdmU7CisKKwkvKiBSeCBhbmQgVHggRE1BIHByb2Nlc3NpbmcgcXVldWVzICovCisJc3RydWN0IGlsX3J4X3F1ZXVlIHJ4cTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cTsKKwl1bnNpZ25lZCBsb25nIHR4cV9jdHhfYWN0aXZlX21zazsKKwlzdHJ1Y3QgaWxfZG1hX3B0ciBrdzsJLyoga2VlcCB3YXJtIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaWxfZG1hX3B0ciBzY2RfYmNfdGJsczsKKworCXUzMiBzY2RfYmFzZV9hZGRyOwkvKiBzY2hlZHVsZXIgc3JhbSBiYXNlIGFkZHJlc3MgKi8KKworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJLyogY291bnRzIG1nbXQsIGN0bCwgYW5kIGRhdGEgcGFja2V0cyAqLworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHR4X3N0YXRzOworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHJ4X3N0YXRzOworCisJLyogY291bnRzIGludGVycnVwdHMgKi8KKwlzdHJ1Y3QgaXNyX3N0YXRzIGlzcl9zdGF0czsKKworCXN0cnVjdCBpbF9wb3dlcl9tZ3IgcG93ZXJfZGF0YTsKKworCS8qIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIHVzZWQgb25seSBvbiAzOTQ1IGJ1dCBmaWxsZWQgYnkgY29yZSAqLworCisJLyogc3RhdGlvbiB0YWJsZSB2YXJpYWJsZXMgKi8KKworCS8qIE5vdGU6IGlmIGxvY2sgYW5kIHN0YV9sb2NrIGFyZSBuZWVkZWQsIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBmaXJzdCAqLworCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CisJaW50IG51bV9zdGF0aW9uczsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSBzdGF0aW9uc1tJTF9TVEFUSU9OX0NPVU5UXTsKKwl1bnNpZ25lZCBsb25nIHVjb2RlX2tleV90YWJsZTsKKworCS8qIHF1ZXVlIHJlZmNvdW50cyAqLworI2RlZmluZSBJTF9NQVhfSFdfUVVFVUVTCTMyCisJdW5zaWduZWQgbG9uZyBxdWV1ZV9zdG9wcGVkW0JJVFNfVE9fTE9OR1MoSUxfTUFYX0hXX1FVRVVFUyldOworCS8qIGZvciBlYWNoIEFDICovCisJYXRvbWljX3QgcXVldWVfc3RvcF9jb3VudFs0XTsKKworCS8qIEluZGljYXRpb24gaWYgaWVlZTgwMjExX29wcy0+b3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KKwl1OCBpc19vcGVuOworCisJdTggbWFjODAyMTFfcmVnaXN0ZXJlZDsKKworCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCisJdTggKmVlcHJvbTsKKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87CisKKwllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7CisKKwkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLworCXU2NCB0aW1lc3RhbXA7CisKKwl1bmlvbiB7CisjaWYgZGVmaW5lZChDT05GSUdfSVdMMzk0NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMMzk0NV9NT0RVTEUpCisJCXN0cnVjdCB7CisJCQl2b2lkICpzaGFyZWRfdmlydDsKKwkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7CisKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhlcm1hbF9wZXJpb2RpYzsKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZraWxsX3BvbGw7CisKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgc3RhdHM7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzIGRlbHRhX3N0YXRzOworCQkJc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cyBtYXhfZGVsdGE7CisjZW5kaWYKKworCQkJdTMyIHN0YV9zdXBwX3JhdGVzOworCQkJaW50IGxhc3RfcnhfcnNzaTsJLyogRnJvbSBSeCBwYWNrZXQgc3RhdHMgKi8KKworCQkJLyogUngnZCBwYWNrZXQgdGltaW5nIGluZm9ybWF0aW9uICovCisJCQl1MzIgbGFzdF9iZWFjb25fdGltZTsKKwkJCXU2NCBsYXN0X3RzZjsKKworCQkJLyoKKwkJCSAqIGVhY2ggY2FsaWJyYXRpb24gY2hhbm5lbCBncm91cCBpbiB0aGUKKwkJCSAqIEVFUFJPTSBoYXMgYSBkZXJpdmVkIGNsaXAgc2V0dGluZyBmb3IKKwkJCSAqIGVhY2ggcmF0ZS4KKwkJCSAqLworCQkJY29uc3Qgc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIGNsaXBfZ3JvdXBzWzVdOworCisJCX0gXzM5NDU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKKwkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOworCisJCQlzdHJ1Y3QgY29tcGxldGlvbiBmaXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlOworCisJCQkvKgorCQkJICogY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMgYXJlIHRoZQorCQkJICogdHdvIGV4dHJhIGNhbGlicmF0aW9uIGNvbW1hbmRzIGZvbGxvd3MgdGhlIHN0YW5kYXJkCisJCQkgKiBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMKKwkJCSAqLworCQkJdTggcGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZDsKKwkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZDsKKworCQkJc3RydWN0IGlsX25vdGlmX3N0YXRzIHN0YXRzOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgZGVsdGFfc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgbWF4X2RlbHRhOworI2VuZGlmCisKKwkJfSBfNDk2NTsKKyNlbmRpZgorCX07CisKKwlzdHJ1Y3QgaWxfaHdfcGFyYW1zIGh3X3BhcmFtczsKKworCXUzMiBpbnRhX21hc2s7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc3RhcnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fY29tcGxldGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9yZXBsZW5pc2g7CisJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3NjYW47CisKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OworCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OworCisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOworCisJLyogVFggUG93ZXIgKi8KKwlzOCB0eF9wb3dlcl91c2VyX2xtdDsKKwlzOCB0eF9wb3dlcl9kZXZpY2VfbG10OworCXM4IHR4X3Bvd2VyX25leHQ7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkvKiBkZWJ1Z2dpbmcgaW5mbyAqLworCXUzMiBkZWJ1Z19sZXZlbDsJLyogcGVyIGRldmljZSBkZWJ1Z2dpbmcgd2lsbCBvdmVycmlkZSBnbG9iYWwKKwkJCQkgICBpbF9kZWJ1Z19sZXZlbCBpZiBzZXQgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCS8qIGRlYnVnZnMgKi8KKwl1MTYgdHhfdHJhZmZpY19pZHg7CisJdTE2IHJ4X3RyYWZmaWNfaWR4OworCXU4ICp0eF90cmFmZmljOworCXU4ICpyeF90cmFmZmljOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOworCXUzMiBkYmdmc19zcmFtX29mZnNldCwgZGJnZnNfc3JhbV9sZW47CisJYm9vbCBkaXNhYmxlX2h0NDA7CisjZW5kaWYJCQkJLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eHBvd2VyX3dvcms7CisJdTMyIGRpc2FibGVfc2Vuc19jYWw7CisJdTMyIGRpc2FibGVfY2hhaW5fbm9pc2VfY2FsOworCXUzMiBkaXNhYmxlX3R4X3Bvd2VyX2NhbDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnVuX3RpbWVfY2FsaWJfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c19wZXJpb2RpYzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKwlib29sIGh3X3JlYWR5OworCisJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CisJdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOworCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7Cit9OwkJCQkvKmlsX3ByaXYgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitpbF90eHFfY3R4X2FjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCkKK3sKKwlzZXRfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3R4cV9jdHhfZGVhY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJY2xlYXJfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfaGRyICoKK2lsX3R4X3F1ZXVlX2dldF9oZHIoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCWlmIChpbC0+dHhxW3R4cV9pZF0udHhiW2lkeF0uc2tiKQorCQlyZXR1cm4gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaWwtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYi0+CisJCSAgICBkYXRhOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKgoraWxfcnhvbl9jdHhfZnJvbV92aWYoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJcmV0dXJuIHZpZl9wcml2LT5jdHg7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfY29udGV4dChpbCwgX2N0eCkgXAorCWZvciAoX2N0eCA9ICZpbC0+Y3R4OyBfY3R4ID09ICZpbC0+Y3R4OyBfY3R4KyspCisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gKGlsLT5jdHguYWN0aXZlLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FueV9hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWxfaXNfYXNzb2NpYXRlZChpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkX2N0eChzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIChjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8pCit7CisJaWYgKGNoX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChjaF9pbmZvLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1ZBTElEKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9yYWRhcihjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB1OAoraWxfaXNfY2hhbm5lbF9hX2JhbmQoY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKK3sKKwlyZXR1cm4gY2hfaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9wYXNzaXZlKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9BQ1RJVkUpKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9pYnNzKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lsX2ZyZWVfcGFnZXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX2ZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9mcmVlX3BhZ2VzKHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCWZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworI2RlZmluZSBJV0xXSUZJX1ZFUlNJT04gImluLXRyZWU6IgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgorCisjZGVmaW5lIElMX1BDSV9ERVZJQ0UoZGV2LCBzdWJkZXYsIGNmZykgXAorCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgLmRldmljZSA9IChkZXYpLCBcCisJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSAoc3ViZGV2KSwgXAorCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkmKGNmZykKKworI2RlZmluZSBUSU1FX1VOSVQJCTEwMjQKKworI2RlZmluZSBJTF9TS1VfRyAgICAgICAweDEKKyNkZWZpbmUgSUxfU0tVX0EgICAgICAgMHgyCisjZGVmaW5lIElMX1NLVV9OICAgICAgIDB4OAorCisjZGVmaW5lIElMX0NNRCh4KSBjYXNlIHg6IHJldHVybiAjeAorCisvKiBTaXplIG9mIG9uZSBSeCBidWZmZXIgaW4gaG9zdCBEUkFNICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzNLICgzICogMTAwMCkJLyogMzk0NSBvbmx5ICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzRLICg0ICogMTAyNCkKKyNkZWZpbmUgSUxfUlhfQlVGX1NJWkVfOEsgKDggKiAxMDI0KQorCitzdHJ1Y3QgaWxfaGNtZF9vcHMgeworCWludCAoKnJ4b25fYXNzb2MpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJaW50ICgqY29tbWl0X3J4b24pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJdm9pZCAoKnNldF9yeG9uX2NoYWluKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit9OworCitzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgeworCXUxNigqZ2V0X2hjbWRfc2l6ZSkgKHU4IGNtZF9pZCwgdTE2IGxlbik7CisJdTE2KCpidWlsZF9hZGRzdGFfaGNtZCkgKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKTsKKwlpbnQgKCpyZXF1ZXN0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCXZvaWQgKCpwb3N0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworc3RydWN0IGlsX2FwbV9vcHMgeworCWludCAoKmluaXQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpjb25maWcpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzdHJ1Y3QgaWxfZGVidWdmc19vcHMgeworCXNzaXplX3QoKnJ4X3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisJc3NpemVfdCgqdHhfc3RhdHNfcmVhZCkgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKwlzc2l6ZV90KCpnZW5lcmFsX3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MpOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgaWxfdGVtcF9vcHMgeworCXZvaWQgKCp0ZW1wZXJhdHVyZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitzdHJ1Y3QgaWxfbGliX29wcyB7CisJLyogc2V0IGh3IGRlcGVuZGVudCBwYXJhbWV0ZXJzICovCisJaW50ICgqc2V0X2h3X3BhcmFtcykgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogSGFuZGxpbmcgVFggKi8KKwl2b2lkICgqdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCQkJIHUxNiBieXRlX2NudCk7CisJaW50ICgqdHhxX2F0dGFjaF9idWZfdG9fdGZkKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBkbWFfYWRkcl90IGFkZHIsCisJCQkJICAgICAgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCk7CisJdm9pZCAoKnR4cV9mcmVlX3RmZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpOworCWludCAoKnR4cV9pbml0KSAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CisJLyogc2V0dXAgUnggaGFuZGxlciAqLworCXZvaWQgKCpoYW5kbGVyX3NldHVwKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwkvKiBhbGl2ZSBub3RpZmljYXRpb24gYWZ0ZXIgaW5pdCB1Q29kZSBsb2FkICovCisJdm9pZCAoKmluaXRfYWxpdmVfc3RhcnQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KKwlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSAodTMyIGFkZHIpOworCS8qIDFzdCB1Y29kZSBsb2FkICovCisJaW50ICgqbG9hZF91Y29kZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKwl2b2lkICgqZHVtcF9uaWNfZXJyb3JfbG9nKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCpkdW1wX2ZoKSAoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworCWludCAoKnNldF9jaGFubmVsX3N3aXRjaCkgKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOworCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgaWxfYXBtX29wcyBhcG1fb3BzOworCisJLyogcG93ZXIgKi8KKwlpbnQgKCpzZW5kX3R4X3Bvd2VyKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwl2b2lkICgqdXBkYXRlX2NoYWluX2ZsYWdzKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworCS8qIGVlcHJvbSBvcGVyYXRpb25zICovCisJc3RydWN0IGlsX2VlcHJvbV9vcHMgZWVwcm9tX29wczsKKworCS8qIHRlbXBlcmF0dXJlICovCisJc3RydWN0IGlsX3RlbXBfb3BzIHRlbXBfb3BzOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwlzdHJ1Y3QgaWxfZGVidWdmc19vcHMgZGVidWdmc19vcHM7CisjZW5kaWYKKworfTsKKworc3RydWN0IGlsX2xlZF9vcHMgeworCWludCAoKmNtZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xlZF9jbWQgKmxlZF9jbWQpOworfTsKKworc3RydWN0IGlsX2xlZ2FjeV9vcHMgeworCXZvaWQgKCpwb3N0X2Fzc29jaWF0ZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJdm9pZCAoKmNvbmZpZ19hcCkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCisJaW50ICgqdXBkYXRlX2JjYXN0X3N0YXRpb25zKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCptYW5hZ2VfaWJzc19zdGF0aW9uKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCk7Cit9OworCitzdHJ1Y3QgaWxfb3BzIHsKKwljb25zdCBzdHJ1Y3QgaWxfbGliX29wcyAqbGliOworCWNvbnN0IHN0cnVjdCBpbF9oY21kX29wcyAqaGNtZDsKKwljb25zdCBzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgKnV0aWxzOworCWNvbnN0IHN0cnVjdCBpbF9sZWRfb3BzICpsZWQ7CisJY29uc3Qgc3RydWN0IGlsX25pY19vcHMgKm5pYzsKKwljb25zdCBzdHJ1Y3QgaWxfbGVnYWN5X29wcyAqbGVnYWN5OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICppZWVlODAyMTFfb3BzOworfTsKKworc3RydWN0IGlsX21vZF9wYXJhbXMgeworCWludCBzd19jcnlwdG87CQkvKiBkZWY6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCisJaW50IGRpc2FibGVfaHdfc2NhbjsJLyogZGVmOiAwID0gdXNlIGgvdyBzY2FuICovCisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IGRpc2FibGVfMTFuOwkvKiBkZWY6IDAgPSAxMW4gY2FwYWJpbGl0aWVzIGVuYWJsZWQgKi8KKwlpbnQgYW1zZHVfc2l6ZV84SzsJLyogZGVmOiAxID0gZW5hYmxlIDhLIGFtc2R1IHNpemUgKi8KKwlpbnQgYW50ZW5uYTsJCS8qIGRlZjogMCA9IGJvdGggYW50ZW5uYXMgKHVzZSBkaXZlcnNpdHkpICovCisJaW50IHJlc3RhcnRfZnc7CQkvKiBkZWY6IDEgPSByZXN0YXJ0IGZpcm13YXJlICovCit9OworCisvKgorICogQGxlZF9jb21wZW5zYXRpb246IGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nCisgKgl0byB0aGUgZGV2aWF0aW9uIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeS4KKyAqCVRoZSBkZXRhaWwgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBjb21tb24uYworICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKKyAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAorICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgorICogQHVjb2RlX3RyYWNpbmc6IHN1cHBvcnQgdWNvZGUgY29udGludW91cyB0cmFjaW5nCisgKiBAc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyOiBkcml2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHBlcmZvcm0KKyAqCXNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIG9wZXJhdGlvbgorICogQGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCisgKgljaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KKyAqLworc3RydWN0IGlsX2Jhc2VfcGFyYW1zIHsKKwlpbnQgZWVwcm9tX3NpemU7CisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IG51bV9vZl9hbXBkdV9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJLyogZm9yIGlsX2FwbV9pbml0KCkgKi8KKwl1MzIgcGxsX2NmZ192YWw7CisJYm9vbCBzZXRfbDBzOworCWJvb2wgdXNlX2JzbTsKKworCXUxNiBsZWRfY29tcGVuc2F0aW9uOworCWludCBjaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKKwlib29sIHRlbXBlcmF0dXJlX2tlbHZpbjsKKwljb25zdCBib29sIHVjb2RlX3RyYWNpbmc7CisJY29uc3QgYm9vbCBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI7CisJY29uc3QgYm9vbCBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI7Cit9OworCisjZGVmaW5lIElMX0xFRF9TT0xJRCAxMQorI2RlZmluZSBJTF9ERUZfTEVEX0lOVFJWTCBjcHVfdG9fbGUzMigxMDAwKQorCisjZGVmaW5lIElMX0xFRF9BQ1RJVklUWSAgICAgICAoMDw8MSkKKyNkZWZpbmUgSUxfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQorCisvKgorICogTEVEIG1vZGUKKyAqICAgIElMX0xFRF9ERUZBVUxUOiAgdXNlIGRldmljZSBkZWZhdWx0CisgKiAgICBJTF9MRURfUkZfU1RBVEU6IHR1cm4gTEVEIG9uL29mZiBiYXNlZCBvbiBSRiBzdGF0ZQorICoJCQlMRUQgT04gID0gUkYgT04KKyAqCQkJTEVEIE9GRiA9IFJGIE9GRgorICogICAgSUxfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKKyAqLworZW51bSBpbF9sZWRfbW9kZSB7CisJSUxfTEVEX0RFRkFVTFQsCisJSUxfTEVEX1JGX1NUQVRFLAorCUlMX0xFRF9CTElOSywKK307CisKK3ZvaWQgaWxfbGVkc19pbml0KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2xlZHNfZXhpdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKioKKyAqIHN0cnVjdCBpbF9jZmcKKyAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgorICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQorICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KKyAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCisgKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCisgKgorICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQorICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQorICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKKyAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4gVGhlIGZpcm13YXJlJ3MgQVBJIHZlcnNpb24gd2lsbCBiZQorICogc3RvcmVkIGluIEBpbF9wcml2LCBlbmFibGluZyB0aGUgZHJpdmVyIHRvIG1ha2UgcnVudGltZSBjaGFuZ2VzIGJhc2VkCisgKiBvbiBmaXJtd2FyZSB2ZXJzaW9uIHVzZWQuCisgKgorICogRm9yIGV4YW1wbGUsCisgKiBpZiAoSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpID49IDIpIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiA+PSAyLgorICogfSBlbHNlIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiAxLgorICogfQorICoKKyAqIFRoZSBpZGVhbCB1c2FnZSBvZiB0aGlzIGluZnJhc3RydWN0dXJlIGlzIHRvIHRyZWF0IGEgbmV3IHVjb2RlIEFQSQorICogcmVsZWFzZSBhcyBhIG5ldyBoYXJkd2FyZSByZXZpc2lvbi4gVGhhdCBpcywgdGhyb3VnaCB1dGlsaXppbmcgdGhlCisgKiBpbF9oY21kX3V0aWxzX29wcyBldGMuIHdlIGFjY29tbW9kYXRlIGRpZmZlcmVudCBjb21tYW5kIHN0cnVjdHVyZXMKKyAqIGFuZCBmbG93cyBiZXR3ZWVuIGhhcmR3YXJlIHZlcnNpb25zIGFzIHdlbGwgYXMgdGhlaXIgQVBJCisgKiB2ZXJzaW9ucy4KKyAqCisgKi8KK3N0cnVjdCBpbF9jZmcgeworCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpmd19uYW1lX3ByZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21heDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXVuc2lnbmVkIGludCBza3U7CisJdTE2IGVlcHJvbV92ZXI7CisJdTE2IGVlcHJvbV9jYWxpYl92ZXI7CisJY29uc3Qgc3RydWN0IGlsX29wcyAqb3BzOworCS8qIG1vZHVsZSBiYXNlZCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBtb2Rwcm9iZSBjbWQgKi8KKwljb25zdCBzdHJ1Y3QgaWxfbW9kX3BhcmFtcyAqbW9kX3BhcmFtczsKKwkvKiBwYXJhbXMgbm90IGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXN0cnVjdCBpbF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7CisJLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJZW51bSBpbF9sZWRfbW9kZSBsZWRfbW9kZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgTCBpIGIgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBpZWVlODAyMTFfaHcgKmlsX2FsbG9jX2FsbChzdHJ1Y3QgaWxfY2ZnICpjZmcpOworaW50IGlsX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICB1MTYgcXVldWUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOworaW50IGlsX21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKK3ZvaWQgaWxfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgIGludCBod19kZWNyeXB0KTsKK2ludCBpbF9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CitpbnQgaWxfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK2ludCBpbF9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKKwkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit1OCBpbF9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKK3ZvaWQgaWxfc2V0X3J4b25faHQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mKTsKK2Jvb2wgaWxfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApOwordm9pZCBpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgdTMyIGRlY3J5cHRfcmVzLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpOwordm9pZCBpbF9pcnFfaGFuZGxlX2Vycm9yKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwordm9pZCBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CitpbnQgaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCk7CitpbnQgaWxfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF90eHFfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworaW50IGlsX2FsbG9jX3RyYWZmaWNfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpOwordm9pZCBpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Citjb25zdCBjaGFyICppbF9nZXRfbWdtdF9zdHJpbmcoaW50IGNtZCk7Citjb25zdCBjaGFyICppbF9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCk7Cit2b2lkIGlsX2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfdXBkYXRlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBpc190eCwgX19sZTE2IGZjLCB1MTYgbGVuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAoraWxfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKK3sKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSWCBoYW5kbGVycy4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbF9oZGxfcG1fc2xlZXAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfcG1fZGVidWdfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUlgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfY21kX3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfcnhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcSk7CitpbnQgaWxfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3J4X3F1ZXVlICpxKTsKK3ZvaWQgaWxfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKy8qIEhhbmRsZXJzICovCit2b2lkIGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsX3JlY292ZXJfZnJvbV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7Cit2b2lkIGlsX2Noc3dpdGNoX2RvbmUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGlzX3N1Y2Nlc3MpOwordm9pZCBpbF9oZGxfY3NhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworLyogVFggaGVscGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitpbnQgaWxfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBpbnQgc2xvdHNfbnVtLAorCQkgICAgIHUzMiB0eHFfaWQpOwordm9pZCBpbF90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkgICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkKTsKK3ZvaWQgaWxfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVFggcG93ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX3NldF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGlsX2dldF9sb3dlc3RfcGxjcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTY2FubmluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX3NjYW5fY2FuY2VsKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2Nhbl9jYW5jZWxfdGltZW91dChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHVuc2lnbmVkIGxvbmcgbXMpOwordm9pZCBpbF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwordm9pZCBpbF9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfZm9yY2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGV4dGVybmFsKTsKK3UxNiBpbF9maWxsX3Byb2JlX3JlcShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsCisJCSAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCk7Cit2b2lkIGlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3UxNiBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgIHU4IG5fcHJvYmVzKTsKK3UxNiBpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIEZvciBmYXN0ZXIgYWN0aXZlIHNjYW5uaW5nLCBzY2FuIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBjaGFubmVsIGlmIGZld2VyIHRoYW4KKyAqIFBMQ1BfUVVJRVRfVEhSRVNIIHBhY2tldHMgYXJlIGhlYXJkIG9uIHRoaXMgY2hhbm5lbCB3aXRoaW4KKyAqIEFDVElWRV9RVUlFVF9USU1FIGFmdGVyIHNlbmRpbmcgcHJvYmUgcmVxdWVzdC4gIFRoaXMgc2hvcnRlbnMgdGhlIGR3ZWxsCisgKiB0aW1lIGlmIGl0J3MgYSBxdWlldCBjaGFubmVsIChub3RoaW5nIHJlc3BvbmRlZCB0byBvdXIgcHJvYmUsIGFuZCB0aGVyZSdzCisgKiBubyBvdGhlciB0cmFmZmljKS4KKyAqIERpc2FibGUgInF1aWV0IiBmZWF0dXJlIGJ5IHNldHRpbmcgUExDUF9RVUlFVF9USFJFU0ggdG8gMC4gKi8KKyNkZWZpbmUgSUxfQUNUSVZFX1FVSUVUX1RJTUUgICAgICAgY3B1X3RvX2xlMTYoMTApCS8qIG1zZWMgKi8KKyNkZWZpbmUgSUxfUExDUF9RVUlFVF9USFJFU0ggICAgICAgY3B1X3RvX2xlMTYoMSkJLyogcGFja2V0cyAqLworCisjZGVmaW5lIElMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cJCShIWiAqIDcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBTIGUgbiBkIGkgbiBnICAgICBIIG8gcyB0ICAgICBDIG8gbSBtIGEgbiBkIHMgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IGNoYXIgKmlsX2dldF9jbWRfc3RyaW5nKHU4IGNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3N5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgaWxfc2VuZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3BkdShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkLCB1MTYgbGVuLAorCQkJCSBjb25zdCB2b2lkICpkYXRhKTsKK2ludCBpbF9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCQkgICAgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkJICAgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCkpOworCitpbnQgaWxfZW5xdWV1ZV9oY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSQkJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHUxNgoraWxfcGNpZV9saW5rX2N0bChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHBvczsKKwl1MTYgcGNpX2xua19jdGw7CisJcG9zID0gcGNpX3BjaWVfY2FwKGlsLT5wY2lfZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChpbC0+cGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7CisJcmV0dXJuIHBjaV9sbmtfY3RsOworfQorCit2b2lkIGlsX2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit1MzIgaWxfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKTsKK19fbGUzMiBpbF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYmFzZSwgdTMyIGFkZG9uLAorCQkJICB1MzIgYmVhY29uX2ludGVydmFsKTsKKworI2lmZGVmIENPTkZJR19QTQoraW50IGlsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CitpbnQgaWxfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGlsX3BtX29wczsKKworI2RlZmluZSBJTF9MRUdBQ1lfUE1fT1BTCSgmaWxfcG1fb3BzKQorCisjZWxzZSAvKiAhQ09ORklHX1BNICovCisKKyNkZWZpbmUgSUxfTEVHQUNZX1BNX09QUwlOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX1BNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3ZvaWQgaWxfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitpbF9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworfQorI2VuZGlmCisKK3ZvaWQgaWxfY2xlYXJfaXNyX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgR0VPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX2luaXRfZ2VvcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2dlb3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyoqKioqKioqKioqKioqKiBEUklWRVIgU1RBVFVTIEZVTkNUSU9OUyAgICoqKioqLworCisjZGVmaW5lIFNfSENNRF9BQ1RJVkUJMAkvKiBob3N0IGNvbW1hbmQgaW4gcHJvZ3Jlc3MgKi8KKy8qIDEgaXMgdW51c2VkICh1c2VkIHRvIGJlIFNfSENNRF9TWU5DX0FDVElWRSkgKi8KKyNkZWZpbmUgU19JTlRfRU5BQkxFRAkyCisjZGVmaW5lIFNfUkZfS0lMTF9IVwkzCisjZGVmaW5lIFNfQ1RfS0lMTAkJNAorI2RlZmluZSBTX0lOSVQJCTUKKyNkZWZpbmUgU19BTElWRQkJNgorI2RlZmluZSBTX1JFQURZCQk3CisjZGVmaW5lIFNfVEVNUEVSQVRVUkUJOAorI2RlZmluZSBTX0dFT19DT05GSUdVUkVECTkKKyNkZWZpbmUgU19FWElUX1BFTkRJTkcJMTAKKyNkZWZpbmUgU19TVEFUUwkJMTIKKyNkZWZpbmUgU19TQ0FOTklORwkJMTMKKyNkZWZpbmUgU19TQ0FOX0FCT1JUSU5HCTE0CisjZGVmaW5lIFNfU0NBTl9IVwkJMTUKKyNkZWZpbmUgU19QT1dFUl9QTUkJMTYKKyNkZWZpbmUgU19GV19FUlJPUgkJMTcKKyNkZWZpbmUgU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogVGhlIGFkYXB0ZXIgaXMgJ3JlYWR5JyBpZiBSRUFEWSBhbmQgR0VPX0NPTkZJR1VSRUQgYml0cyBhcmUKKwkgKiBzZXQgYnV0IEVYSVRfUEVORElORyBpcyBub3QgKi8KKwlyZXR1cm4gdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpICYmCisJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSAmJgorCSAgICAhdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIHRlc3RfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfcmZraWxsX2h3KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZmtpbGwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbF9pc19yZmtpbGxfaHcoaWwpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY3RraWxsKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19DVF9LSUxMLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeV9yZihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaWxfaXNfcmVhZHkoaWwpOworfQorCitleHRlcm4gdm9pZCBpbF9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbF9zZW5kX3N0YXRzX3JlcXVlc3Qoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBmbGFncywgYm9vbCBjbGVhcik7Cit2b2lkIGlsX2FwbV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfYXBtX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworaW50IGlsX3NlbmRfcnhvbl90aW1pbmcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworc3RhdGljIGlubGluZSBpbnQKK2lsX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5oY21kLT5yeG9uX2Fzc29jKGlsLCBjdHgpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfY29tbWl0X3J4b24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+aGNtZC0+Y29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqCitpbF9nZXRfaHdfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlyZXR1cm4gaWwtPmh3LT53aXBoeS0+YmFuZHNbYmFuZF07Cit9CisKKy8qIG1hYzgwMjExIGhhbmRsZXJzICovCitpbnQgaWxfbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpOwordm9pZCBpbF9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK3ZvaWQgaWxfbWFjX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLCB1MzIgY2hhbmdlcyk7Cit2b2lkIGlsX3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOworCitpcnFyZXR1cm5fdCBpbF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSk7CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF93cml0ZTgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgb2ZzLCB1OCB2YWwpCit7CisJaW93cml0ZTgodmFsLCBpbC0+aHdfYmFzZSArIG9mcyk7Cit9CisjZGVmaW5lIGlsX3dyaXRlOChpbCwgb2ZzLCB2YWwpIF9pbF93cml0ZTgoaWwsIG9mcywgdmFsKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF93cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBvZnMsIHUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgaWwtPmh3X2Jhc2UgKyBvZnMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX2lsX3JkKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG9mcykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoaWwtPmh3X2Jhc2UgKyBvZnMpOworfQorCisjZGVmaW5lIElMX1BPTExfSU5URVJWQUwgMTAJLyogbWljcm9zZWNvbmRzICovCitzdGF0aWMgaW5saW5lIGludAorX2lsX3BvbGxfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIsIHUzMiBiaXRzLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCit7CisJaW50IHQgPSAwOworCisJZG8geworCQlpZiAoKF9pbF9yZChpbCwgYWRkcikgJiBtYXNrKSA9PSAoYml0cyAmIG1hc2spKQorCQkJcmV0dXJuIHQ7CisJCXVkZWxheShJTF9QT0xMX0lOVEVSVkFMKTsKKwkJdCArPSBJTF9QT0xMX0lOVEVSVkFMOworCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF9zZXRfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJX2lsX3dyKGlsLCByZWcsIF9pbF9yZChpbCwgcmVnKSB8IG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfc2V0X2JpdChwLCByLCBtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfaWxfY2xlYXJfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJX2lsX3dyKGlsLCByZWcsIF9pbF9yZChpbCwgcmVnKSAmIH5tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9jbGVhcl9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfY2xlYXJfYml0KHAsIHIsIG0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX2lsX2dyYWJfbmljX2FjY2VzcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJLyogdGhpcyBiaXQgd2FrZXMgdXAgdGhlIE5JQyAqLworCV9pbF9zZXRfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisKKwkvKgorCSAqIFRoZXNlIGJpdHMgc2F5IHRoZSBkZXZpY2UgaXMgcnVubmluZywgYW5kIHNob3VsZCBrZWVwIHJ1bm5pbmcgZm9yCisJICogYXQgbGVhc3QgYSBzaG9ydCB3aGlsZSAoYXQgbGVhc3QgYXMgbG9uZyBhcyBNQUNfQUNDRVNTX1JFUSBzdGF5cyAxKSwKKwkgKiBidXQgdGhleSBkbyBub3QgaW5kaWNhdGUgdGhhdCBlbWJlZGRlZCBTUkFNIGlzIHJlc3RvcmVkIHlldDsKKwkgKiAzOTQ1IGFuZCA0OTY1IGhhdmUgdm9sYXRpbGUgU1JBTSwgYW5kIG11c3Qgc2F2ZS9yZXN0b3JlIGNvbnRlbnRzCisJICogdG8vZnJvbSBob3N0IERSQU0gd2hlbiBzbGVlcGluZy93YWtpbmcgZm9yIHBvd2VyLXNhdmluZy4KKwkgKiBFYWNoIGRpcmVjdGlvbiB0YWtlcyBhcHByb3hpbWF0ZWx5IDEvNCBtaWxsaXNlY29uZDsgd2l0aCB0aGlzCisJICogb3ZlcmhlYWQsIGl0J3MgYSBnb29kIGlkZWEgdG8gZ3JhYiBhbmQgaG9sZCBNQUNfQUNDRVNTX1JFUVVFU1QgaWYgYQorCSAqIHNlcmllcyBvZiByZWdpc3RlciBhY2Nlc3NlcyBhcmUgZXhwZWN0ZWQgKGUuZy4gcmVhZGluZyBFdmVudCBMb2cpLAorCSAqIHRvIGtlZXAgZGV2aWNlIGZyb20gc2xlZXBpbmcuCisJICoKKwkgKiBDU1JfVUNPREVfRFJWX0dQMSByZWdpc3RlciBiaXQgTUFDX1NMRUVQID09IDAgaW5kaWNhdGVzIHRoYXQKKwkgKiBTUkFNIGlzIG9rYXkvcmVzdG9yZWQuICBXZSBkb24ndCBjaGVjayB0aGF0IGhlcmUgYmVjYXVzZSB0aGlzIGNhbGwKKwkgKiBpcyBqdXN0IGZvciBoYXJkd2FyZSByZWdpc3RlciBhY2Nlc3M7IGJ1dCBHUDEgTUFDX1NMRUVQIGNoZWNrIGlzIGEKKwkgKiBnb29kIGlkZWEgYmVmb3JlIGFjY2Vzc2luZyAzOTQ1LzQ5NjUgU1JBTSAoZS5nLiByZWFkaW5nIEV2ZW50IExvZykuCisJICoKKwkgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19WQUxfTUFDX0FDQ0VTU19FTiwKKwkJCSAoQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSB8CisJCQkgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19HT0lOR19UT19TTEVFUCksIDE1MDAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2YWwgPSBfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCk7CisJCUlMX0VSUigiTUFDIGlzIGluIGRlZXAgc2xlZXAhLiAgQ1NSX0dQX0NOVFJMID0gMHglMDhYXG4iLCB2YWwpOworCQlfaWxfd3IoaWwsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX0ZPUkNFX05NSSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19pbF9yZWxlYXNlX25pY19hY2Nlc3Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9pbF9jbGVhcl9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2lsX3JkKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZykKK3sKKwl1MzIgdmFsdWU7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCXZhbHVlID0gX2lsX3JkKGlsLCByZWcpOworCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlyZXR1cm4gdmFsdWU7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3IoaWwsIHJlZywgdmFsdWUpOworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3dyaXRlX3JlZ19idWYoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnLCB1MzIgbGVuLCB1MzIgKiB2YWx1ZXMpCit7CisJdTMyIGNvdW50ID0gc2l6ZW9mKHUzMik7CisKKwlpZiAoaWwgIT0gTlVMTCAmJiB2YWx1ZXMgIT0gTlVMTCkgeworCQlmb3IgKDsgMCA8IGxlbjsgbGVuIC09IGNvdW50LCByZWcgKz0gY291bnQsIHZhbHVlcysrKQorCQkJaWxfd3IoaWwsIHJlZywgKnZhbHVlcyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfcG9sbF9iaXQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIG1hc2ssIGludCB0aW1lb3V0KQoreworCWludCB0ID0gMDsKKworCWRvIHsKKwkJaWYgKChpbF9yZChpbCwgYWRkcikgJiBtYXNrKSA9PSBtYXNrKQorCQkJcmV0dXJuIHQ7CisJCXVkZWxheShJTF9QT0xMX0lOVEVSVkFMKTsKKwkJdCArPSBJTF9QT0xMX0lOVEVSVkFMOworCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX2lsX3JkX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnKQoreworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfUkFERFIsIHJlZyB8ICgzIDw8IDI0KSk7CisJcm1iKCk7CisJcmV0dXJuIF9pbF9yZChpbCwgSEJVU19UQVJHX1BSUEhfUkRBVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9yZF9wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKTsKKwl2YWwgPSBfaWxfcmRfcHJwaChpbCwgcmVnKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfaWxfd3JfcHJwaChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgdmFsKQoreworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfV0FERFIsICgoYWRkciAmIDB4MDAwMEZGRkYpIHwgKDMgPDwgMjQpKSk7CisJd21iKCk7CisJX2lsX3dyKGlsLCBIQlVTX1RBUkdfUFJQSF9XREFULCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3dyX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3JfcHJwaChpbCwgYWRkciwgdmFsKTsKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworI2RlZmluZSBfaWxfc2V0X2JpdHNfcHJwaChpbCwgcmVnLCBtYXNrKSBcCitfaWxfd3JfcHJwaChpbCwgcmVnLCAoX2lsX3JkX3BycGgoaWwsIHJlZykgfCBtYXNrKSkKKworc3RhdGljIGlubGluZSB2b2lkCitpbF9zZXRfYml0c19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCV9pbF9zZXRfYml0c19wcnBoKGlsLCByZWcsIG1hc2spOworCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworI2RlZmluZSBfaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCByZWcsIGJpdHMsIG1hc2spIFwKK19pbF93cl9wcnBoKGlsLCByZWcsCQkJCVwKKwkJICgoX2lsX3JkX3BycGgoaWwsIHJlZykgJiBtYXNrKSB8IGJpdHMpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9iaXRzX21hc2tfcHJwaChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiBiaXRzLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisJX2lsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgcmVnLCBiaXRzLCBtYXNrKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfY2xlYXJfYml0c19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisJdTMyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisJdmFsID0gX2lsX3JkX3BycGgoaWwsIHJlZyk7CisJX2lsX3dyX3BycGgoaWwsIHJlZywgKHZhbCAmIH5tYXNrKSk7CisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgoraWxfcmVhZF90YXJnX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisKKwlfaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIGFkZHIpOworCXJtYigpOworCXZhbHVlID0gX2lsX3JkKGlsLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cml0ZV90YXJnX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlpZiAoIV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpKSB7CisJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7CisJCXdtYigpOworCQlfaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fV0RBVCwgdmFsKTsKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cml0ZV90YXJnX21lbV9idWYoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIGxlbiwgdTMyICogdmFsdWVzKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlpZiAoIV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpKSB7CisJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7CisJCXdtYigpOworCQlmb3IgKDsgMCA8IGxlbjsgbGVuIC09IHNpemVvZih1MzIpLCB2YWx1ZXMrKykKKwkJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XREFULCAqdmFsdWVzKTsKKworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCisjZGVmaW5lIEhXX0tFWV9EWU5BTUlDIDAKKyNkZWZpbmUgSFdfS0VZX0RFRkFVTFQgMQorCisjZGVmaW5lIElMX1NUQV9EUklWRVJfQUNUSVZFIEJJVCgwKQkvKiBkcml2ZXIgZW50cnkgaXMgYWN0aXZlICovCisjZGVmaW5lIElMX1NUQV9VQ09ERV9BQ1RJVkUgIEJJVCgxKQkvKiB1Y29kZSBlbnRyeSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MgIEJJVCgyKQkvKiB1Y29kZSBlbnRyeSBpcyBpbiBwcm9jZXNzIG9mCisJCQkJCSAgIGJlaW5nIGFjdGl2YXRlZCAqLworI2RlZmluZSBJTF9TVEFfTE9DQUwgQklUKDMpCS8qIHN0YXRpb24gc3RhdGUgbm90IGRpcmVjdGVkIGJ5IG1hYzgwMjExOworCQkJCSAgICh0aGlzIGlzIGZvciB0aGUgSUJTUyBCU1NJRCBzdGF0aW9ucykgKi8KKyNkZWZpbmUgSUxfU1RBX0JDQVNUIEJJVCg0KQkvKiB0aGlzIHN0YXRpb24gaXMgdGhlIHNwZWNpYWwgYmNhc3Qgc3RhdGlvbiAqLworCit2b2lkIGlsX3Jlc3RvcmVfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOwordm9pZCBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2ludCBpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2VuZF9hZGRfc3RhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2FkZHN0YV9jbWQgKnN0YSwgdTggZmxhZ3MpOworaW50IGlsX2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcik7CitpbnQgaWxfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCBzdGFfaWQsIGNvbnN0IHU4ICogYWRkcik7CitpbnQgaWxfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOworCit1OCBpbF9wcmVwX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKKworaW50IGlsX3NlbmRfbHFfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEsIHU4IGZsYWdzLCBib29sIGluaXQpOworCisvKioKKyAqIGlsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyAtIGNsZWFyIGtub3dsZWRnZSBvZiBhbGwgc3RhdGlvbnMgZnJvbSBkcml2ZXIKKyAqIEBpbDogaXdsIGlsIHN0cnVjdAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBpbF9kb3duKCkgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhlIGNhc2UKKyAqIHdlJ3JlIGNvbWluZyB0aGVyZSBmcm9tIGEgaGFyZHdhcmUgcmVzdGFydCBtYWM4MDIxMSB3aWxsIGJlCisgKiBhYmxlIHRvIHJlY29uZmlndXJlIHN0YXRpb25zIC0tIGlmIHdlJ3JlIGdldHRpbmcgdGhlcmUgaW4gdGhlCisgKiBub3JtYWwgZG93biBmbG93IHRoZW4gdGhlIHN0YXRpb25zIHdpbGwgYWxyZWFkeSBiZSBjbGVhcmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwltZW1zZXQoaWwtPnN0YXRpb25zLCAwLCBzaXplb2YoaWwtPnN0YXRpb25zKSk7CisJaWwtPm51bV9zdGF0aW9ucyA9IDA7CisKKwlpbC0+dWNvZGVfa2V5X3RhYmxlID0gMDsKKworCS8qCisJICogUmVtb3ZlIGFsbCBrZXkgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgc3RvcmVkIGFzIHBhcnQKKwkgKiBvZiBzdGF0aW9uIGluZm9ybWF0aW9uIHNpbmNlIG1hYzgwMjExIG1heSBub3QgaGF2ZSBoYWQKKwkgKiBhIGNoYW5jZSB0byByZW1vdmUgYWxsIHRoZSBrZXlzLiBXaGVuIGRldmljZSBpcworCSAqIHJlY29uZmlndXJlZCBieSBtYWM4MDIxMSBhZnRlciBhbiBlcnJvciBhbGwga2V5cyB3aWxsCisJICogYmUgcmVjb25maWd1cmVkLgorCSAqLworCW1lbXNldChjdHgtPndlcF9rZXlzLCAwLCBzaXplb2YoY3R4LT53ZXBfa2V5cykpOworCWN0eC0+a2V5X21hcHBpbmdfa2V5cyA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX3N0YV9pZChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWlmIChXQVJOX09OKCFzdGEpKQorCQlyZXR1cm4gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJcmV0dXJuICgoc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gKilzdGEtPmRydl9wcml2KS0+c3RhX2lkOworfQorCisvKioKKyAqIGlsX3N0YV9pZF9vcl9icm9hZGNhc3QgLSByZXR1cm4gc3RhX2lkIG9yIGJyb2FkY2FzdCBzdGEKKyAqIEBpbDogaXdsIGlsCisgKiBAY29udGV4dDogdGhlIGN1cnJlbnQgY29udGV4dAorICogQHN0YTogbWFjODAyMTEgc3RhdGlvbgorICoKKyAqIEluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBtYWM4MDIxMSBwYXNzZXMgYSBzdGF0aW9uIHBvaW50ZXIKKyAqIHRoYXQgbWF5IGJlICVOVUxMLCBmb3IgZXhhbXBsZSBkdXJpbmcgVFggb3Iga2V5IHNldHVwLiBJbgorICogdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgYnJvYWRjYXN0IHN0YXRpb24sIHNvIHRoaXMKKyAqIGlubGluZSB3cmFwcyB0aGF0IHBhdHRlcm4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbF9zdGFfaWRfb3JfYnJvYWRjYXN0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY29udGV4dCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaW50IHN0YV9pZDsKKworCWlmICghc3RhKQorCQlyZXR1cm4gY29udGV4dC0+YmNhc3Rfc3RhX2lkOworCisJc3RhX2lkID0gaWxfc3RhX2lkKHN0YSk7CisKKwkvKgorCSAqIG1hYzgwMjExIHNob3VsZCBub3QgYmUgcGFzc2luZyBhIHBhcnRpYWxseQorCSAqIGluaXRpYWxpc2VkIHN0YXRpb24hCisJICovCisJV0FSTl9PTihzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKTsKKworCXJldHVybiBzdGFfaWQ7Cit9CisKKy8qKgorICogaWxfcXVldWVfaW5jX3dyYXAgLSBpbmNyZW1lbnQgcXVldWUgaWR4LCB3cmFwIGJhY2sgdG8gYmVnaW5uaW5nCisgKiBAaWR4IC0tIGN1cnJlbnQgaWR4CisgKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQorICovCitzdGF0aWMgaW5saW5lIGludAoraWxfcXVldWVfaW5jX3dyYXAoaW50IGlkeCwgaW50IG5fYmQpCit7CisJcmV0dXJuICsraWR4ICYgKG5fYmQgLSAxKTsKK30KKworLyoqCisgKiBpbF9xdWV1ZV9kZWNfd3JhcCAtIGRlY3JlbWVudCBxdWV1ZSBpZHgsIHdyYXAgYmFjayB0byBlbmQKKyAqIEBpZHggLS0gY3VycmVudCBpZHgKKyAqIEBuX2JkIC0tIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlIChtdXN0IGJlIHBvd2VyIG9mIDIpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbF9xdWV1ZV9kZWNfd3JhcChpbnQgaWR4LCBpbnQgbl9iZCkKK3sKKwlyZXR1cm4gLS1pZHggJiAobl9iZCAtIDEpOworfQorCisvKiBUT0RPOiBNb3ZlIGZ3X2Rlc2MgZnVuY3Rpb25zIHRvIGl3bC1wY2kua28gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZnJlZV9md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKK3sKKwlpZiAoZGVzYy0+dl9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBkZXNjLT5sZW4sIGRlc2MtPnZfYWRkciwKKwkJCQkgIGRlc2MtPnBfYWRkcik7CisJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwlkZXNjLT5sZW4gPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfYWxsb2NfZndfZGVzYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCit7CisJaWYgKCFkZXNjLT5sZW4pIHsKKwkJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy0+dl9hZGRyID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZwY2lfZGV2LT5kZXYsIGRlc2MtPmxlbiwgJmRlc2MtPnBfYWRkciwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gKGRlc2MtPnZfYWRkciAhPSBOVUxMKSA/IDAgOiAtRU5PTUVNOworfQorCisvKgorICogd2UgaGF2ZSA4IGJpdHMgdXNlZCBsaWtlIHRoaXM6CisgKgorICogNyA2IDUgNCAzIDIgMSAwCisgKiB8IHwgfCB8IHwgfCB8IHwKKyAqIHwgfCB8IHwgfCB8ICstKy0tLS0tLS0tIEFDIHF1ZXVlICgwLTMpCisgKiB8IHwgfCB8IHwgfAorICogfCArLSstKy0rLSstLS0tLS0tLS0tLS0gSFcgcXVldWUgSUQKKyAqIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVudXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9zd3FfaWQoc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsIHU4IGFjLCB1OCBod3EpCit7CisJQlVHX09OKGFjID4gMyk7CQkvKiBvbmx5IGhhdmUgMiBiaXRzICovCisJQlVHX09OKGh3cSA+IDMxKTsJLyogb25seSB1c2UgNSBiaXRzICovCisKKwl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93YWtlX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKKwl1OCBhYyA9IHF1ZXVlICYgMzsKKwl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIGlsLT5xdWV1ZV9zdG9wcGVkKSkKKwkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZpbC0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCisJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShpbC0+aHcsIGFjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9zdG9wX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKKwl1OCBhYyA9IHF1ZXVlICYgMzsKKwl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgaWwtPnF1ZXVlX3N0b3BwZWQpKQorCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmlsLT5xdWV1ZV9zdG9wX2NvdW50W2FjXSkgPiAwKQorCQkJaWVlZTgwMjExX3N0b3BfcXVldWUoaWwtPmh3LCBhYyk7Cit9CisKKyNpZmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCisjZW5kaWYKKworI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV9zdG9wX3F1ZXVlCisKKyNpZmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQorI3VuZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCisjZW5kaWYKKworI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV93YWtlX3F1ZXVlCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljbGVhcl9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdUNvZGUvTklDIHRvIGhvc3QgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7CisKKwkvKiBhY2tub3dsZWRnZS9jbGVhci9yZXNldCBhbnkgaW50ZXJydXB0cyBzdGlsbCBwZW5kaW5nCisJICogZnJvbSB1Q29kZSBvciBmbG93IGhhbmRsZXIgKFJ4L1R4IERNQSkgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4ZmZmZmZmZmYpOworCV9pbF93cihpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2VuYWJsZV9yZmtpbGxfaW50KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfd3IoaWwsIENTUl9JTlRfTUFTSywgQ1NSX0lOVF9CSVRfUkZfS0lMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXNldF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpOworCV9pbF93cihpbCwgQ1NSX0lOVF9NQVNLLCBpbC0+aW50YV9tYXNrKTsKK30KKworLyoqCisgKiBpbF9iZWFjb25fdGltZV9tYXNrX2xvdyAtIG1hc2sgb2YgbG93ZXIgMzIgYml0IG9mIGJlYWNvbiB0aW1lCisgKiBAaWwgLS0gcG9pbnRlciB0byBpbF9wcml2IGRhdGEgc3RydWN0dXJlCisgKiBAdHNmX2JpdHMgLS0gbnVtYmVyIG9mIGJpdHMgbmVlZCB0byBzaGlmdCBmb3IgbWFza2luZykKKyAqLworc3RhdGljIGlubGluZSB1MzIKK2lsX2JlYWNvbl90aW1lX21hc2tfbG93KHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IHRzZl9iaXRzKQoreworCXJldHVybiAoMSA8PCB0c2ZfYml0cykgLSAxOworfQorCisvKioKKyAqIGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaCAtIG1hc2sgb2YgaGlnaGVyIDMyIGJpdCBvZiBiZWFjb24gdGltZQorICogQGlsIC0tIHBvaW50ZXIgdG8gaWxfcHJpdiBkYXRhIHN0cnVjdHVyZQorICogQHRzZl9iaXRzIC0tIG51bWJlciBvZiBiaXRzIG5lZWQgdG8gc2hpZnQgZm9yIG1hc2tpbmcpCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9iZWFjb25fdGltZV9tYXNrX2hpZ2goc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgdHNmX2JpdHMpCit7CisJcmV0dXJuICgoMSA8PCAoMzIgLSB0c2ZfYml0cykpIC0gMSkgPDwgdHNmX2JpdHM7Cit9CisKKy8qKgorICogc3RydWN0IGlsX3JiX3N0YXR1cyAtIHJlc2V2ZSBidWZmZXIgc3RhdHVzIGhvc3QgbWVtb3J5IG1hcHBlZCBGSCByZWdpc3RlcnMKKyAqCisgKiBAY2xvc2VkX3JiX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGlkeCBvZiB0aGUgUkIgd2hpY2ggd2FzIGNsb3NlZAorICogQGNsb3NlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIFJYIEZyYW1lIHdoaWNoIHdhcyBjbG9zZWQKKyAqIEBmaW5pc2hlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIGN1cnJlbnQgUkIKKyAqCQkJICAgICBpbiB3aGljaCB0aGUgbGFzdCBmcmFtZSB3YXMgd3JpdHRlbiB0bworICogQGZpbmlzaGVkX2ZyX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGlkeCBvZiB0aGUgUlggRnJhbWUKKyAqCQkJICAgICB3aGljaCB3YXMgdHJhbnNmZXJyZWQKKyAqLworc3RydWN0IGlsX3JiX3N0YXR1cyB7CisJX19sZTE2IGNsb3NlZF9yYl9udW07CisJX19sZTE2IGNsb3NlZF9mcl9udW07CisJX19sZTE2IGZpbmlzaGVkX3JiX251bTsKKwlfX2xlMTYgZmluaXNoZWRfZnJfbmFtOworCV9fbGUzMiBfX3VudXNlZDsJLyogMzk0NSBvbmx5ICovCit9IF9fcGFja2VkOworCisjZGVmaW5lIFRGRF9RVUVVRV9TSVpFX01BWCAgICAgICgyNTYpCisjZGVmaW5lIFRGRF9RVUVVRV9TSVpFX0JDX0RVUAkoNjQpCisjZGVmaW5lIFRGRF9RVUVVRV9CQ19TSVpFCShURkRfUVVFVUVfU0laRV9NQVggKyBURkRfUVVFVUVfU0laRV9CQ19EVVApCisjZGVmaW5lIElMX1RYX0RNQV9NQVNLICAgICAgICBETUFfQklUX01BU0soMzYpCisjZGVmaW5lIElMX05VTV9PRl9UQlMJCTIwCisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsX2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCit7CisJcmV0dXJuIChzaXplb2YoYWRkcikgPiBzaXplb2YodTMyKSA/IChhZGRyID4+IDE2KSA+PiAxNiA6IDApICYgMHhGOworfQorCisvKioKKyAqIHN0cnVjdCBpbF90ZmRfdGIgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aGluIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBkbWEgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRyYW5zbWlzc2lvbiBhZGRyZXNzCisgKgorICogQGxvOiBsb3cgWzMxOjBdIHBvcnRpb24gb2YgdGhlIGRtYSBhZGRyZXNzIG9mIFRYIGJ1ZmZlciBldmVyeSBldmVuIGlzCisgKgl1bmFsaWduZWQgb24gMTYgYml0IGJvdW5kYXJ5CisgKiBAaGlfbl9sZW46IDAtMyBbMzU6MzJdIHBvcnRpb24gb2YgZG1hCisgKgkgICAgICA0LTE1IGxlbmd0aCBvZiB0aGUgdHggYnVmZmVyCisgKi8KK3N0cnVjdCBpbF90ZmRfdGIgeworCV9fbGUzMiBsbzsKKwlfX2xlMTYgaGlfbl9sZW47Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBpbF90ZmQKKyAqCisgKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCisgKgorICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1ICAgcmVzZXJ2ZWQKKyAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKKyAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKKyAqIEAgX19wYWQJcGFkZGluZworICoKKyAqIEVhY2ggVHggcXVldWUgdXNlcyBhIGNpcmN1bGFyIGJ1ZmZlciBvZiAyNTYgVEZEcyBzdG9yZWQgaW4gaG9zdCBEUkFNLgorICogQm90aCBkcml2ZXIgYW5kIGRldmljZSBzaGFyZSB0aGVzZSBjaXJjdWxhciBidWZmZXJzLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUKKyAqIGNvbnRpZ3VvdXMgMjU2IFRGRHMgeCAxMjggYnl0ZXMtcGVyLVRGRCA9IDMyIEtCeXRlcworICoKKyAqIERyaXZlciBtdXN0IGluZGljYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGVhY2gKKyAqIGNpcmN1bGFyIGJ1ZmZlciB2aWEgdGhlIEZINDlfTUVNX0NCQkNfUVVFVUUgcmVnaXN0ZXJzLgorICoKKyAqIEVhY2ggVEZEIGNvbnRhaW5zIHBvaW50ZXIvc2l6ZSBpbmZvcm1hdGlvbiBmb3IgdXAgdG8gMjAgZGF0YSBidWZmZXJzCisgKiBpbiBob3N0IERSQU0uICBUaGVzZSBidWZmZXJzIGNvbGxlY3RpdmVseSBjb250YWluIHRoZSAob25lKSBmcmFtZSBkZXNjcmliZWQKKyAqIGJ5IHRoZSBURkQuICBFYWNoIGJ1ZmZlciBtdXN0IGJlIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5IHdpdGhpbgorICogaXRzZWxmLCBidXQgYnVmZmVycyBtYXkgYmUgc2NhdHRlcmVkIGluIGhvc3QgRFJBTS4gIEVhY2ggYnVmZmVyIGhhcyBtYXggc2l6ZQorICogb2YgKDRLIC0gNCkuICBUaGUgY29uY2F0ZW5hdGVzIGFsbCBvZiBhIFRGRCdzIGJ1ZmZlcnMgaW50byBhIHNpbmdsZQorICogVHggZnJhbWUsIHVwIHRvIDggS0J5dGVzIGluIHNpemUuCisgKgorICogQSBtYXhpbXVtIG9mIDI1NSAobm90IDI1NiEpIFRGRHMgbWF5IGJlIG9uIGEgcXVldWUgd2FpdGluZyBmb3IgVHguCisgKi8KK3N0cnVjdCBpbF90ZmQgeworCXU4IF9fcmVzZXJ2ZWQxWzNdOworCXU4IG51bV90YnM7CisJc3RydWN0IGlsX3RmZF90YiB0YnNbSUxfTlVNX09GX1RCU107CisJX19sZTMyIF9fcGFkOworfSBfX3BhY2tlZDsKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX0NGR19SRVRSWV9USU1FT1VUCTB4MDQxCisKKy8qIFBDSSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTgkweDAxCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTgkweDAyCisKK3N0cnVjdCBpbF9yYXRlX2luZm8geworCXU4IHBsY3A7CQkvKiB1Q29kZSBBUEk6ICBSQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBwbGNwX3Npc287CQkvKiB1Q29kZSBBUEk6ICBSQVRFX1NJU09fNk1fUExDUCwgZXRjLiAqLworCXU4IHBsY3BfbWltbzI7CQkvKiB1Q29kZSBBUEk6ICBSQVRFX01JTU8yXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIFJBVEVfNk1fSUVFRSwgZXRjLiAqLworCXU4IHByZXZfaWVlZTsJCS8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBuZXh0X2llZWU7CQkvKiBuZXh0IHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBwcmV2X3JzOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBuZXh0X3JzOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLworCXU4IHByZXZfcnNfdGdnOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCisJdTggbmV4dF9yc190Z2c7CQkvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworfTsKKworc3RydWN0IGlsMzk0NV9yYXRlX2luZm8geworCXU4IHBsY3A7CQkvKiB1Q29kZSBBUEk6ICBSQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIFJBVEVfNk1fSUVFRSwgZXRjLiAqLworCXU4IHByZXZfaWVlZTsJCS8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBuZXh0X2llZWU7CQkvKiBuZXh0IHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KKwl1OCBwcmV2X3JzOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBuZXh0X3JzOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLworCXU4IHByZXZfcnNfdGdnOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCisJdTggbmV4dF9yc190Z2c7CQkvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworCXU4IHRhYmxlX3JzX2lkeDsJLyogaWR4IGluIHJhdGUgc2NhbGUgdGFibGUgY21kICovCisJdTggcHJldl90YWJsZV9yczsJLyogcHJldiBpbiByYXRlIHRhYmxlIGNtZCAqLworfTsKKworLyoKKyAqIFRoZXNlIHNlcnZlIGFzIGlkeGVzIGludG8KKyAqIHN0cnVjdCBpbF9yYXRlX2luZm8gaWxfcmF0ZXNbUkFURV9DT1VOVF07CisgKi8KK2VudW0geworCVJBVEVfMU1fSURYID0gMCwKKwlSQVRFXzJNX0lEWCwKKwlSQVRFXzVNX0lEWCwKKwlSQVRFXzExTV9JRFgsCisJUkFURV82TV9JRFgsCisJUkFURV85TV9JRFgsCisJUkFURV8xMk1fSURYLAorCVJBVEVfMThNX0lEWCwKKwlSQVRFXzI0TV9JRFgsCisJUkFURV8zNk1fSURYLAorCVJBVEVfNDhNX0lEWCwKKwlSQVRFXzU0TV9JRFgsCisJUkFURV82ME1fSURYLAorCVJBVEVfQ09VTlQsCisJUkFURV9DT1VOVF9MRUdBQ1kgPSBSQVRFX0NPVU5UIC0gMSwJLyogRXhjbHVkaW5nIDYwTSAqLworCVJBVEVfQ09VTlRfMzk0NSA9IFJBVEVfQ09VTlQgLSAxLAorCVJBVEVfSU5WTV9JRFggPSBSQVRFX0NPVU5ULAorCVJBVEVfSU5WQUxJRCA9IFJBVEVfQ09VTlQsCit9OworCitlbnVtIHsKKwlSQVRFXzZNX0lEWF9UQkwgPSAwLAorCVJBVEVfOU1fSURYX1RCTCwKKwlSQVRFXzEyTV9JRFhfVEJMLAorCVJBVEVfMThNX0lEWF9UQkwsCisJUkFURV8yNE1fSURYX1RCTCwKKwlSQVRFXzM2TV9JRFhfVEJMLAorCVJBVEVfNDhNX0lEWF9UQkwsCisJUkFURV81NE1fSURYX1RCTCwKKwlSQVRFXzFNX0lEWF9UQkwsCisJUkFURV8yTV9JRFhfVEJMLAorCVJBVEVfNU1fSURYX1RCTCwKKwlSQVRFXzExTV9JRFhfVEJMLAorCVJBVEVfSU5WTV9JRFhfVEJMID0gUkFURV9JTlZNX0lEWCAtIDEsCit9OworCitlbnVtIHsKKwlJTF9GSVJTVF9PRkRNX1JBVEUgPSBSQVRFXzZNX0lEWCwKKwlJTDM5X0xBU1RfT0ZETV9SQVRFID0gUkFURV81NE1fSURYLAorCUlMX0xBU1RfT0ZETV9SQVRFID0gUkFURV82ME1fSURYLAorCUlMX0ZJUlNUX0NDS19SQVRFID0gUkFURV8xTV9JRFgsCisJSUxfTEFTVF9DQ0tfUkFURSA9IFJBVEVfMTFNX0lEWCwKK307CisKKy8qICNkZWZpbmUgdnMuIGVudW0gdG8ga2VlcCBmcm9tIGRlZmF1bHRpbmcgdG8gJ2xhcmdlIGludGVnZXInICovCisjZGVmaW5lCVJBVEVfNk1fTUFTSyAgICgxIDw8IFJBVEVfNk1fSURYKQorI2RlZmluZQlSQVRFXzlNX01BU0sgICAoMSA8PCBSQVRFXzlNX0lEWCkKKyNkZWZpbmUJUkFURV8xMk1fTUFTSyAgKDEgPDwgUkFURV8xMk1fSURYKQorI2RlZmluZQlSQVRFXzE4TV9NQVNLICAoMSA8PCBSQVRFXzE4TV9JRFgpCisjZGVmaW5lCVJBVEVfMjRNX01BU0sgICgxIDw8IFJBVEVfMjRNX0lEWCkKKyNkZWZpbmUJUkFURV8zNk1fTUFTSyAgKDEgPDwgUkFURV8zNk1fSURYKQorI2RlZmluZQlSQVRFXzQ4TV9NQVNLICAoMSA8PCBSQVRFXzQ4TV9JRFgpCisjZGVmaW5lCVJBVEVfNTRNX01BU0sgICgxIDw8IFJBVEVfNTRNX0lEWCkKKyNkZWZpbmUgUkFURV82ME1fTUFTSyAgKDEgPDwgUkFURV82ME1fSURYKQorI2RlZmluZQlSQVRFXzFNX01BU0sgICAoMSA8PCBSQVRFXzFNX0lEWCkKKyNkZWZpbmUJUkFURV8yTV9NQVNLICAgKDEgPDwgUkFURV8yTV9JRFgpCisjZGVmaW5lCVJBVEVfNU1fTUFTSyAgICgxIDw8IFJBVEVfNU1fSURYKQorI2RlZmluZQlSQVRFXzExTV9NQVNLICAoMSA8PCBSQVRFXzExTV9JRFgpCisKKy8qIHVDb2RlIEFQSSB2YWx1ZXMgZm9yIGxlZ2FjeSBiaXQgcmF0ZXMsIGJvdGggT0ZETSBhbmQgQ0NLICovCitlbnVtIHsKKwlSQVRFXzZNX1BMQ1AgPSAxMywKKwlSQVRFXzlNX1BMQ1AgPSAxNSwKKwlSQVRFXzEyTV9QTENQID0gNSwKKwlSQVRFXzE4TV9QTENQID0gNywKKwlSQVRFXzI0TV9QTENQID0gOSwKKwlSQVRFXzM2TV9QTENQID0gMTEsCisJUkFURV80OE1fUExDUCA9IDEsCisJUkFURV81NE1fUExDUCA9IDMsCisJUkFURV82ME1fUExDUCA9IDMsCS8qRklYTUU6UlM6c2hvdWxkIGJlIHJlbW92ZWQgKi8KKwlSQVRFXzFNX1BMQ1AgPSAxMCwKKwlSQVRFXzJNX1BMQ1AgPSAyMCwKKwlSQVRFXzVNX1BMQ1AgPSA1NSwKKwlSQVRFXzExTV9QTENQID0gMTEwLAorCS8qRklYTUU6UlM6YWRkIFJBVEVfTEVHQUNZX0lOVk1fUExDUCA9IDAsICovCit9OworCisvKiB1Q29kZSBBUEkgdmFsdWVzIGZvciBPRkRNIGhpZ2gtdGhyb3VnaHB1dCAoSFQpIGJpdCByYXRlcyAqLworZW51bSB7CisJUkFURV9TSVNPXzZNX1BMQ1AgPSAwLAorCVJBVEVfU0lTT18xMk1fUExDUCA9IDEsCisJUkFURV9TSVNPXzE4TV9QTENQID0gMiwKKwlSQVRFX1NJU09fMjRNX1BMQ1AgPSAzLAorCVJBVEVfU0lTT18zNk1fUExDUCA9IDQsCisJUkFURV9TSVNPXzQ4TV9QTENQID0gNSwKKwlSQVRFX1NJU09fNTRNX1BMQ1AgPSA2LAorCVJBVEVfU0lTT182ME1fUExDUCA9IDcsCisJUkFURV9NSU1PMl82TV9QTENQID0gMHg4LAorCVJBVEVfTUlNTzJfMTJNX1BMQ1AgPSAweDksCisJUkFURV9NSU1PMl8xOE1fUExDUCA9IDB4YSwKKwlSQVRFX01JTU8yXzI0TV9QTENQID0gMHhiLAorCVJBVEVfTUlNTzJfMzZNX1BMQ1AgPSAweGMsCisJUkFURV9NSU1PMl80OE1fUExDUCA9IDB4ZCwKKwlSQVRFX01JTU8yXzU0TV9QTENQID0gMHhlLAorCVJBVEVfTUlNTzJfNjBNX1BMQ1AgPSAweGYsCisJUkFURV9TSVNPX0lOVk1fUExDUCwKKwlSQVRFX01JTU8yX0lOVk1fUExDUCA9IFJBVEVfU0lTT19JTlZNX1BMQ1AsCit9OworCisvKiBNQUMgaGVhZGVyIHZhbHVlcyBmb3IgYml0IHJhdGVzICovCitlbnVtIHsKKwlSQVRFXzZNX0lFRUUgPSAxMiwKKwlSQVRFXzlNX0lFRUUgPSAxOCwKKwlSQVRFXzEyTV9JRUVFID0gMjQsCisJUkFURV8xOE1fSUVFRSA9IDM2LAorCVJBVEVfMjRNX0lFRUUgPSA0OCwKKwlSQVRFXzM2TV9JRUVFID0gNzIsCisJUkFURV80OE1fSUVFRSA9IDk2LAorCVJBVEVfNTRNX0lFRUUgPSAxMDgsCisJUkFURV82ME1fSUVFRSA9IDEyMCwKKwlSQVRFXzFNX0lFRUUgPSAyLAorCVJBVEVfMk1fSUVFRSA9IDQsCisJUkFURV81TV9JRUVFID0gMTEsCisJUkFURV8xMU1fSUVFRSA9IDIyLAorfTsKKworI2RlZmluZSBJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAgICBcCisJKFJBVEVfMU1fTUFTSyAgICAgICAgICB8IFwKKwlSQVRFXzJNX01BU0spCisKKyNkZWZpbmUgSUxfQ0NLX1JBVEVTX01BU0sgICAgICAgICAgXAorCShJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAgfCBcCisJUkFURV81TV9NQVNLICAgICAgICAgIHwgXAorCVJBVEVfMTFNX01BU0spCisKKyNkZWZpbmUgSUxfT0ZETV9CQVNJQ19SQVRFU19NQVNLICAgXAorCShSQVRFXzZNX01BU0sgICAgICAgICB8IFwKKwlSQVRFXzEyTV9NQVNLICAgICAgICAgfCBcCisJUkFURV8yNE1fTUFTSykKKworI2RlZmluZSBJTF9PRkRNX1JBVEVTX01BU0sgICAgICAgICBcCisJKElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKKwlSQVRFXzlNX01BU0sgICAgICAgICAgfCBcCisJUkFURV8xOE1fTUFTSyAgICAgICAgIHwgXAorCVJBVEVfMzZNX01BU0sgICAgICAgICB8IFwKKwlSQVRFXzQ4TV9NQVNLICAgICAgICAgfCBcCisJUkFURV81NE1fTUFTSykKKworI2RlZmluZSBJTF9CQVNJQ19SQVRFU19NQVNLICAgICAgICAgXAorCShJTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJIElMX0NDS19CQVNJQ19SQVRFU19NQVNLKQorCisjZGVmaW5lIFJBVEVTX01BU0sgKCgxIDw8IFJBVEVfQ09VTlQpIC0gMSkKKyNkZWZpbmUgUkFURVNfTUFTS18zOTQ1ICgoMSA8PCBSQVRFX0NPVU5UXzM5NDUpIC0gMSkKKworI2RlZmluZSBJTF9JTlZBTElEX1ZBTFVFICAgIC0xCisKKyNkZWZpbmUgSUxfTUlOX1JTU0lfVkFMICAgICAgICAgICAgICAgICAtMTAwCisjZGVmaW5lIElMX01BWF9SU1NJX1ZBTCAgICAgICAgICAgICAgICAgICAgMAorCisvKiBUaGVzZSB2YWx1ZXMgc3BlY2lmeSBob3cgbWFueSBUeCBmcmFtZSBhdHRlbXB0cyBiZWZvcmUKKyAqIHNlYXJjaGluZyBmb3IgYSBuZXcgbW9kdWxhdGlvbiBtb2RlICovCisjZGVmaW5lIElMX0xFR0FDWV9GQUlMVVJFX0xJTUlUCTE2MAorI2RlZmluZSBJTF9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0ODAKKyNkZWZpbmUgSUxfTEVHQUNZX1RCTF9DT1VOVAkJMTYwCisKKyNkZWZpbmUgSUxfTk9ORV9MRUdBQ1lfRkFJTFVSRV9MSU1JVAk0MDAKKyNkZWZpbmUgSUxfTk9ORV9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0NTAwCisjZGVmaW5lIElMX05PTkVfTEVHQUNZX1RCTF9DT1VOVAkxNTAwCisKKy8qIFN1Y2Nlc3MgcmF0aW8gKEFDS2VkIC8gYXR0ZW1wdGVkIHR4IGZyYW1lcykgdmFsdWVzIChwZXJmZWN0IGlzIDEyOCAqIDEwMCkgKi8KKyNkZWZpbmUgSUxfUlNfR09PRF9SQVRJTwkJMTI4MDAJLyogMTAwJSAqLworI2RlZmluZSBSQVRFX1NDQUxFX1NXSVRDSAkJMTA4ODAJLyogIDg1JSAqLworI2RlZmluZSBSQVRFX0hJR0hfVEgJCTEwODgwCS8qICA4NSUgKi8KKyNkZWZpbmUgUkFURV9JTkNSRUFTRV9USAkJNjQwMAkvKiAgNTAlICovCisjZGVmaW5lIFJBVEVfREVDUkVBU0VfVEgJCTE5MjAJLyogIDE1JSAqLworCisvKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbGVnYWN5IG1vZGUgKi8KKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMSAgICAgIDAKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAgICAgIDEKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9TSVNPICAgICAgICAgIDIKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQiAgICAgIDMKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQyAgICAgIDQKKyNkZWZpbmUgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQyAgICAgIDUKKworLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIHNpc28gbW9kZSAqLworI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMSAgICAgICAgMAorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAgICAgICAgMQorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQiAgICAgICAgMgorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9BQyAgICAgICAgMworI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9NSU1PMl9CQyAgICAgICAgNAorI2RlZmluZSBJTF9TSVNPX1NXSVRDSF9HSSAgICAgICAgICAgICAgNQorCisvKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbWltbyBtb2RlICovCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMSAgICAgICAwCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9BTlRFTk5BMiAgICAgICAxCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0EgICAgICAgICAyCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0IgICAgICAgICAzCisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9TSVNPX0MgICAgICAgICA0CisjZGVmaW5lIElMX01JTU8yX1NXSVRDSF9HSSAgICAgICAgICAgICA1CisKKyNkZWZpbmUgSUxfTUFYX1NFQVJDSCBJTF9NSU1PMl9TV0lUQ0hfR0kKKworI2RlZmluZSBJTF9BQ1RJT05fTElNSVQJCTMJLyogIyBwb3NzaWJsZSBhY3Rpb25zICovCisKKyNkZWZpbmUgTFFfU0laRQkJMgkvKiAyIG1vZGUgdGFibGVzOiAgIkFjdGl2ZSIgYW5kICJTZWFyY2giICovCisKKy8qIGxvYWQgcGVyIHRpZCBkZWZpbmVzIGZvciBBLU1QRFUgYWN0aXZhdGlvbiAqLworI2RlZmluZSBJTF9BR0dfVFBUX1RIUkVIT0xECTAKKyNkZWZpbmUgSUxfQUdHX0xPQURfVEhSRVNIT0xECTEwCisjZGVmaW5lIElMX0FHR19BTExfVElECQkweGZmCisjZGVmaW5lIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcJNTAJLyptUyAqLworI2RlZmluZSBUSURfUVVFVUVfTUFYX1NJWkUJMjAKKyNkZWZpbmUgVElEX1JPVU5EX1ZBTFVFCQk1CS8qIG1TICovCisjZGVmaW5lIFRJRF9NQVhfTE9BRF9DT1VOVAk4CisKKyNkZWZpbmUgVElEX01BWF9USU1FX0RJRkYgKChUSURfUVVFVUVfTUFYX1NJWkUgLSAxKSAqIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcpCisjZGVmaW5lIFRJTUVfV1JBUF9BUk9VTkQoeCwgeSkgKCgoeSkgPiAoeCkpID8gKHkpIC0gKHgpIDogKDAtKHgpKSArICh5KSkKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbF9yYXRlX2luZm8gaWxfcmF0ZXNbUkFURV9DT1VOVF07CisKK2VudW0gaWxfdGFibGVfdHlwZSB7CisJTFFfTk9ORSwKKwlMUV9HLAkJCS8qIGxlZ2FjeSB0eXBlcyAqLworCUxRX0EsCisJTFFfU0lTTywJCS8qIGhpZ2gtdGhyb3VnaHB1dCB0eXBlcyAqLworCUxRX01JTU8yLAorCUxRX01BWCwKK307CisKKyNkZWZpbmUgaXNfbGVnYWN5KHRibCkgKCh0YmwpID09IExRX0cgfHwgKHRibCkgPT0gTFFfQSkKKyNkZWZpbmUgaXNfc2lzbyh0YmwpICgodGJsKSA9PSBMUV9TSVNPKQorI2RlZmluZSBpc19taW1vMih0YmwpICgodGJsKSA9PSBMUV9NSU1PMikKKyNkZWZpbmUgaXNfbWltbyh0YmwpIChpc19taW1vMih0YmwpKQorI2RlZmluZSBpc19IdCh0YmwpIChpc19zaXNvKHRibCkgfHwgaXNfbWltbyh0YmwpKQorI2RlZmluZSBpc19hX2JhbmQodGJsKSAoKHRibCkgPT0gTFFfQSkKKyNkZWZpbmUgaXNfZ19hbmQodGJsKSAoKHRibCkgPT0gTFFfRykKKworI2RlZmluZQlBTlRfTk9ORQkweDAKKyNkZWZpbmUJQU5UX0EJCUJJVCgwKQorI2RlZmluZQlBTlRfQgkJQklUKDEpCisjZGVmaW5lCUFOVF9BQgkJKEFOVF9BIHwgQU5UX0IpCisjZGVmaW5lIEFOVF9DCQlCSVQoMikKKyNkZWZpbmUJQU5UX0FDCQkoQU5UX0EgfCBBTlRfQykKKyNkZWZpbmUgQU5UX0JDCQkoQU5UX0IgfCBBTlRfQykKKyNkZWZpbmUgQU5UX0FCQwkJKEFOVF9BQiB8IEFOVF9DKQorCisjZGVmaW5lIElMX01BWF9NQ1NfRElTUExBWV9TSVpFCTEyCisKK3N0cnVjdCBpbF9yYXRlX21jc19pbmZvIHsKKwljaGFyIG1icHNbSUxfTUFYX01DU19ESVNQTEFZX1NJWkVdOworCWNoYXIgbWNzW0lMX01BWF9NQ1NfRElTUExBWV9TSVpFXTsKK307CisKKy8qKgorICogc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAtLSB0eCBzdWNjZXNzIGhpc3RvcnkgZm9yIG9uZSByYXRlCisgKi8KK3N0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgeworCXU2NCBkYXRhOwkJLyogYml0bWFwIG9mIHN1Y2Nlc3NmdWwgZnJhbWVzICovCisJczMyIHN1Y2Nlc3NfY291bnRlcjsJLyogbnVtYmVyIG9mIGZyYW1lcyBzdWNjZXNzZnVsICovCisJczMyIHN1Y2Nlc3NfcmF0aW87CS8qIHBlci1jZW50ICogMTI4ICAqLworCXMzMiBjb3VudGVyOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBhdHRlbXB0ZWQgKi8KKwlzMzIgYXZlcmFnZV90cHQ7CS8qIHN1Y2Nlc3MgcmF0aW8gKiBleHBlY3RlZCB0aHJvdWdocHV0ICovCisJdW5zaWduZWQgbG9uZyBzdGFtcDsKK307CisKKy8qKgorICogc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIC0tIHR4IHBhcmFtcyBhbmQgc3VjY2VzcyBoaXN0b3J5IGZvciBhbGwgcmF0ZXMKKyAqCisgKiBUaGVyZSBhcmUgdHdvIG9mIHRoZXNlIGluIHN0cnVjdCBpbF9scV9zdGEsCisgKiBvbmUgZm9yICJhY3RpdmUiLCBhbmQgb25lIGZvciAic2VhcmNoIi4KKyAqLworc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIHsKKwllbnVtIGlsX3RhYmxlX3R5cGUgbHFfdHlwZTsKKwl1OCBhbnRfdHlwZTsKKwl1OCBpc19TR0k7CQkvKiAxID0gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKi8KKwl1OCBpc19odDQwOwkJLyogMSA9IDQwIE1IeiBjaGFubmVsIHdpZHRoICovCisJdTggaXNfZHVwOwkJLyogMSA9IGR1cGxpY2F0ZWQgZGF0YSBzdHJlYW1zICovCisJdTggYWN0aW9uOwkJLyogY2hhbmdlIG1vZHVsYXRpb247IElMX1tMRUdBQ1kvU0lTTy9NSU1PXV9TV0lUQ0hfKiAqLworCXU4IG1heF9zZWFyY2g7CQkvKiBtYXhpbXVuIG51bWJlciBvZiB0YWJsZXMgd2UgY2FuIHNlYXJjaCAqLworCXMzMiAqZXhwZWN0ZWRfdHB0OwkvKiB0aHJvdWdocHV0IG1ldHJpY3M7IGV4cGVjdGVkX3RwdF9HLCBldGMuICovCisJdTMyIGN1cnJlbnRfcmF0ZTsJLyogcmF0ZV9uX2ZsYWdzLCB1Q29kZSBBUEkgZm9ybWF0ICovCisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSB3aW5bUkFURV9DT1VOVF07CS8qIHJhdGUgaGlzdG9yaWVzICovCit9OworCitzdHJ1Y3QgaWxfdHJhZmZpY19sb2FkIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CS8qIGFnZSBvZiB0aGUgb2xkZXN0IHN0YXRzICovCisJdTMyIHBhY2tldF9jb3VudFtUSURfUVVFVUVfTUFYX1NJWkVdOwkvKiBwYWNrZXQgY291bnQgaW4gdGhpcyB0aW1lCisJCQkJCQkgKiBzbGljZSAqLworCXUzMiB0b3RhbDsJCS8qIHRvdGFsIG51bSBvZiBwYWNrZXRzIGR1cmluZyB0aGUKKwkJCQkgKiBsYXN0IFRJRF9NQVhfVElNRV9ESUZGICovCisJdTggcXVldWVfY291bnQ7CQkvKiBudW1iZXIgb2YgcXVldWVzIHRoYXQgaGFzCisJCQkJICogYmVlbiB1c2VkIHNpbmNlIHRoZSBsYXN0IGNsZWFudXAgKi8KKwl1OCBoZWFkOwkJLyogc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWxfbHFfc3RhIC0tIGRyaXZlcidzIHJhdGUgc2NhbGluZyBpbGF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBQb2ludGVyIHRvIHRoaXMgZ2V0cyBwYXNzZWQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBkcml2ZXIgYW5kIG1hYzgwMjExLgorICovCitzdHJ1Y3QgaWxfbHFfc3RhIHsKKwl1OCBhY3RpdmVfdGJsOwkJLyogaWR4IG9mIGFjdGl2ZSB0YWJsZSwgcmFuZ2UgMC0xICovCisJdTggZW5hYmxlX2NvdW50ZXI7CS8qIGluZGljYXRlcyBIVCBtb2RlICovCisJdTggc3RheV9pbl90Ymw7CQkvKiAxOiBkaXNhbGxvdywgMDogYWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLworCXU4IHNlYXJjaF9iZXR0ZXJfdGJsOwkvKiAxOiBjdXJyZW50bHkgdHJ5aW5nIGFsdGVybmF0ZSBtb2RlICovCisJczMyIGxhc3RfdHB0OworCisJLyogVGhlIGZvbGxvd2luZyBkZXRlcm1pbmUgd2hlbiB0byBzZWFyY2ggZm9yIGEgbmV3IG1vZGUgKi8KKwl1MzIgdGFibGVfY291bnRfbGltaXQ7CisJdTMyIG1heF9mYWlsdXJlX2xpbWl0OwkvKiAjIGZhaWxlZCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKwl1MzIgbWF4X3N1Y2Nlc3NfbGltaXQ7CS8qICMgc3VjY2Vzc2Z1bCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKwl1MzIgdGFibGVfY291bnQ7CisJdTMyIHRvdGFsX2ZhaWxlZDsJLyogdG90YWwgZmFpbGVkIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLworCXUzMiB0b3RhbF9zdWNjZXNzOwkvKiB0b3RhbCBzdWNjZXNzZnVsIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLworCXU2NCBmbHVzaF90aW1lcjsJLyogdGltZSBzdGF5aW5nIGluIG1vZGUgYmVmb3JlIG5ldyBzZWFyY2ggKi8KKworCXU4IGFjdGlvbl9jb3VudGVyOwkvKiAjIG1vZGUtc3dpdGNoIGFjdGlvbnMgdHJpZWQgKi8KKwl1OCBpc19ncmVlbjsKKwl1OCBpc19kdXA7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgYml0bWFwcyBvZiByYXRlczsgUkFURV82TV9NQVNLLCBldGMuICovCisJdTMyIHN1cHBfcmF0ZXM7CisJdTE2IGFjdGl2ZV9sZWdhY3lfcmF0ZTsKKwl1MTYgYWN0aXZlX3Npc29fcmF0ZTsKKwl1MTYgYWN0aXZlX21pbW8yX3JhdGU7CisJczggbWF4X3JhdGVfaWR4OwkvKiBNYXggcmF0ZSBzZXQgYnkgdXNlciAqLworCXU4IG1pc3NlZF9yYXRlX2NvdW50ZXI7CisKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCBscTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gbHFfaW5mb1tMUV9TSVpFXTsJLyogImFjdGl2ZSIsICJzZWFyY2giICovCisJc3RydWN0IGlsX3RyYWZmaWNfbG9hZCBsb2FkW1RJRF9NQVhfTE9BRF9DT1VOVF07CisJdTggdHhfYWdnX3RpZF9lbjsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlOworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlOworCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlOworCXUzMiBkYmdfZml4ZWRfcmF0ZTsKKyNlbmRpZgorCXN0cnVjdCBpbF9wcml2ICpkcnY7CisKKwkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCisJaW50IGxhc3RfdHhyYXRlX2lkeDsKKwkvKiBsYXN0IHR4IHJhdGVfbl9mbGFncyAqLworCXUzMiBsYXN0X3JhdGVfbl9mbGFnczsKKwkvKiBwYWNrZXRzIGRlc3RpbmVkIGZvciB0aGlzIFNUQSBhcmUgYWdncmVnYXRlZCAqLworCXU4IGlzX2FnZzsKK307CisKKy8qCisgKiBpbF9zdGF0aW9uX3ByaXY6IERyaXZlcidzIGlsYXRlIHN0YXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBXaGVuIG1hYzgwMjExIGNyZWF0ZXMgYSBzdGF0aW9uIGl0IHJlc2VydmVzIHNvbWUgc3BhY2UgKGh3LT5zdGFfZGF0YV9zaXplKQorICogaW4gdGhlIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IGRyaXZlci4gVGhpcyBzdHJ1Y3R1cmUgaXMgcGxhY2VzIGluIHRoYXQKKyAqIHNwYWNlLgorICoKKyAqIFRoZSBjb21tb24gc3RydWN0IE1VU1QgYmUgZmlyc3QgYmVjYXVzZSBpdCBpcyBzaGFyZWQgYmV0d2VlbgorICogMzk0NSBhbmQgNDk2NSEKKyAqLworc3RydWN0IGlsX3N0YXRpb25fcHJpdiB7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOworCXN0cnVjdCBpbF9scV9zdGEgbHFfc3RhOworCWF0b21pY190IHBlbmRpbmdfZnJhbWVzOworCWJvb2wgY2xpZW50OworCWJvb2wgYXNsZWVwOworfTsKKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X251bV9vZl9hbnQodTggbSkKK3sKKwlyZXR1cm4gISEobSAmIEFOVF9BKSArICEhKG0gJiBBTlRfQikgKyAhIShtICYgQU5UX0MpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitpbDQ5NjVfZmlyc3RfYW50ZW5uYSh1OCBtYXNrKQoreworCWlmIChtYXNrICYgQU5UX0EpCisJCXJldHVybiBBTlRfQTsKKwlpZiAobWFzayAmIEFOVF9CKQorCQlyZXR1cm4gQU5UX0I7CisJcmV0dXJuIEFOVF9DOworfQorCisvKioKKyAqIGlsMzk0NV9yYXRlX3NjYWxlX2luaXQgLSBJbml0aWFsaXplIHRoZSByYXRlIHNjYWxlIHRhYmxlIGJhc2VkIG9uIGFzc29jIGluZm8KKyAqCisgKiBUaGUgc3BlY2lmaWMgdGhyb3VnaHB1dCB0YWJsZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5ldHdvcmsKKyAqIHRoZSBhc3NvY2lhdGVkIHdpdGgsIGluY2x1ZGluZyBBLCBCLCBHLCBhbmQgRyB3LyBUR0cgcHJvdGVjdGlvbgorICovCitleHRlcm4gdm9pZCBpbDM5NDVfcmF0ZV9zY2FsZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzMzIgc3RhX2lkKTsKKworLyogSW5pdGlhbGl6ZSBzdGF0aW9uJ3MgcmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIGFmdGVyIGFkZGluZyBzdGF0aW9uICovCitleHRlcm4gdm9pZCBpbDQ5NjVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQl1OCBzdGFfaWQpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJdTggc3RhX2lkKTsKKworLyoqCisgKiBpbF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBjYWxsYmFja3MKKyAqCisgKiBTaW5jZSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBpcyBoYXJkd2FyZSBzcGVjaWZpYywgdGhlcmUgaXMgbm8gbmVlZAorICogb3IgcmVhc29uIHRvIHBsYWNlIGl0IGFzIGEgc3RhbmQgYWxvbmUgbW9kdWxlLiAgVGhlIGRyaXZlciBjYW4gY2FsbAorICogaWxfcmF0ZV9jb250cm9sX3JlZ2lzdGVyIGluIG9yZGVyIHRvIHJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCisgKiB3aXRoIHRoZSBtYWM4MDIxMSBzdWJzeXN0ZW0uICBUaGlzIHNob3VsZCBiZSBwZXJmb3JtZWQgcHJpb3IgdG8gY2FsbGluZworICogaWVlZTgwMjExX3JlZ2lzdGVyX2h3CisgKgorICovCitleHRlcm4gaW50IGlsNDk2NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gaW50IGlsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7CisKKy8qKgorICogaWxfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIgLSBVbnJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcsIGJ1dCBiZWZvcmUKKyAqIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuCisgKi8KK2V4dGVybiB2b2lkIGlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKKworZXh0ZXJuIGludCBpbF9wb3dlcl91cGRhdGVfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZm9yY2UpOworZXh0ZXJuIHZvaWQgaWxfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitleHRlcm4gdTMyIGlsX2RlYnVnX2xldmVsOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisvKgorICogaWxfZ2V0X2RlYnVnX2xldmVsOiBSZXR1cm4gYWN0aXZlIGRlYnVnIGxldmVsIGZvciBkZXZpY2UKKyAqCisgKiBVc2luZyBzeXNmcyBpdCBpcyBwb3NzaWJsZSB0byBzZXQgcGVyIGRldmljZSBkZWJ1ZyBsZXZlbC4gVGhpcyBkZWJ1ZworICogbGV2ZWwgd2lsbCBiZSB1c2VkIGlmIHNldCwgb3RoZXJ3aXNlIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgd2hpY2ggY2FuIGJlCisgKiBzZXQgdmlhIG1vZHVsZSBwYXJhbWV0ZXIgaXMgdXNlZC4KKyAqLworc3RhdGljIGlubGluZSB1MzIKK2lsX2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKGlsLT5kZWJ1Z19sZXZlbCkKKwkJcmV0dXJuIGlsLT5kZWJ1Z19sZXZlbDsKKwllbHNlCisJCXJldHVybiBpbF9kZWJ1Z19sZXZlbDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHUzMgoraWxfZ2V0X2RlYnVnX2xldmVsKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWxfZGVidWdfbGV2ZWw7Cit9CisjZW5kaWYKKworI2RlZmluZSBpbF9wcmludF9oZXhfZXJyb3IoaWwsIHAsIGxlbikJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJpd2wgZGF0YTogIiwJCQkJXAorCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJCVwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKyNkZWZpbmUgSUxfREJHKGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgbGV2ZWwpCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmlsLT5ody0+d2lwaHktPmRldiwJCVwKKwkJCSAiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCisJCQlfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGlsX3ByaW50X2hleF9kdW1wKGlsLCBsZXZlbCwgcCwgbGVuKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgbGV2ZWwpCQkJCVwKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIml3bCBkYXRhOiAiLAkJXAorCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbiwgMSk7CVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIElMX0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKQorc3RhdGljIGlubGluZSB2b2lkCitpbF9wcmludF9oZXhfZHVtcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBsZXZlbCwgY29uc3Qgdm9pZCAqcCwgdTMyIGxlbikKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitpbnQgaWxfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWxfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgKi8KKworLyoKKyAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOgorICoKKyAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKKyAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZgorICoKKyAqICNkZWZpbmUgSUxfRExfeHh4eCBWQUxVRQorICoKKyAqIHdoZXJlIHh4eHggc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkuCisgKgorICogWW91IHRoZW4gbmVlZCB0byBlaXRoZXIgYWRkIGEgSUxfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUxfREJHKElMX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVGhlIGFjdGl2ZSBkZWJ1ZyBsZXZlbHMgY2FuIGJlIGFjY2Vzc2VkIHZpYSBmaWxlcworICoKKyAqCS9zeXMvbW9kdWxlL2l3bDQ5NjUvcGFyYW1ldGVycy9kZWJ1ZworICoJL3N5cy9tb2R1bGUvaXdsMzk0NS9wYXJhbWV0ZXJzL2RlYnVnCisgKgkvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvZGVidWdfbGV2ZWwKKyAqCisgKiB3aGVuIENPTkZJR19JV0xFR0FDWV9ERUJVRz15LgorICovCisKKy8qIDB4MDAwMDAwMEYgLSAweDAwMDAwMDAxICovCisjZGVmaW5lIElMX0RMX0lORk8JCSgxIDw8IDApCisjZGVmaW5lIElMX0RMX01BQzgwMjExCQkoMSA8PCAxKQorI2RlZmluZSBJTF9ETF9IQ01ECQkoMSA8PCAyKQorI2RlZmluZSBJTF9ETF9TVEFURQkJKDEgPDwgMykKKy8qIDB4MDAwMDAwRjAgLSAweDAwMDAwMDEwICovCisjZGVmaW5lIElMX0RMX01BQ0RVTVAJCSgxIDw8IDQpCisjZGVmaW5lIElMX0RMX0hDTURfRFVNUAkJKDEgPDwgNSkKKyNkZWZpbmUgSUxfRExfRUVQUk9NCQkoMSA8PCA2KQorI2RlZmluZSBJTF9ETF9SQURJTwkJKDEgPDwgNykKKy8qIDB4MDAwMDBGMDAgLSAweDAwMDAwMTAwICovCisjZGVmaW5lIElMX0RMX1BPV0VSCQkoMSA8PCA4KQorI2RlZmluZSBJTF9ETF9URU1QCQkoMSA8PCA5KQorI2RlZmluZSBJTF9ETF9OT1RJRgkJKDEgPDwgMTApCisjZGVmaW5lIElMX0RMX1NDQU4JCSgxIDw8IDExKQorLyogMHgwMDAwRjAwMCAtIDB4MDAwMDEwMDAgKi8KKyNkZWZpbmUgSUxfRExfQVNTT0MJCSgxIDw8IDEyKQorI2RlZmluZSBJTF9ETF9EUk9QCQkoMSA8PCAxMykKKyNkZWZpbmUgSUxfRExfVFhQT1dFUgkJKDEgPDwgMTQpCisjZGVmaW5lIElMX0RMX0FQCQkoMSA8PCAxNSkKKy8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCisjZGVmaW5lIElMX0RMX0ZXCQkoMSA8PCAxNikKKyNkZWZpbmUgSUxfRExfUkZfS0lMTAkJKDEgPDwgMTcpCisjZGVmaW5lIElMX0RMX0ZXX0VSUk9SUwkJKDEgPDwgMTgpCisjZGVmaW5lIElMX0RMX0xFRAkJKDEgPDwgMTkpCisvKiAweDAwRjAwMDAwIC0gMHgwMDEwMDAwMCAqLworI2RlZmluZSBJTF9ETF9SQVRFCQkoMSA8PCAyMCkKKyNkZWZpbmUgSUxfRExfQ0FMSUIJCSgxIDw8IDIxKQorI2RlZmluZSBJTF9ETF9XRVAJCSgxIDw8IDIyKQorI2RlZmluZSBJTF9ETF9UWAkJKDEgPDwgMjMpCisvKiAweDBGMDAwMDAwIC0gMHgwMTAwMDAwMCAqLworI2RlZmluZSBJTF9ETF9SWAkJKDEgPDwgMjQpCisjZGVmaW5lIElMX0RMX0lTUgkJKDEgPDwgMjUpCisjZGVmaW5lIElMX0RMX0hUCQkoMSA8PCAyNikKKy8qIDB4RjAwMDAwMDAgLSAweDEwMDAwMDAwICovCisjZGVmaW5lIElMX0RMXzExSAkJKDEgPDwgMjgpCisjZGVmaW5lIElMX0RMX1NUQVRTCQkoMSA8PCAyOSkKKyNkZWZpbmUgSUxfRExfVFhfUkVQTFkJCSgxIDw8IDMwKQorI2RlZmluZSBJTF9ETF9RT1MJCSgxIDw8IDMxKQorCisjZGVmaW5lIERfSU5GTyhmLCBhLi4uKQkJSUxfREJHKElMX0RMX0lORk8sIGYsICMjIGEpCisjZGVmaW5lIERfTUFDODAyMTEoZiwgYS4uLikJSUxfREJHKElMX0RMX01BQzgwMjExLCBmLCAjIyBhKQorI2RlZmluZSBEX01BQ0RVTVAoZiwgYS4uLikJSUxfREJHKElMX0RMX01BQ0RVTVAsIGYsICMjIGEpCisjZGVmaW5lIERfVEVNUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX1RFTVAsIGYsICMjIGEpCisjZGVmaW5lIERfU0NBTihmLCBhLi4uKQkJSUxfREJHKElMX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIERfUlgoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9SWCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9UWChmLCBhLi4uKQkJSUxfREJHKElMX0RMX1RYLCBmLCAjIyBhKQorI2RlZmluZSBEX0lTUihmLCBhLi4uKQkJSUxfREJHKElMX0RMX0lTUiwgZiwgIyMgYSkKKyNkZWZpbmUgRF9MRUQoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9MRUQsIGYsICMjIGEpCisjZGVmaW5lIERfV0VQKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfV0VQLCBmLCAjIyBhKQorI2RlZmluZSBEX0hDKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfSENNRCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9IQ19EVU1QKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9IQ01EX0RVTVAsIGYsICMjIGEpCisjZGVmaW5lIERfRUVQUk9NKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9FRVBST00sIGYsICMjIGEpCisjZGVmaW5lIERfQ0FMSUIoZiwgYS4uLikJSUxfREJHKElMX0RMX0NBTElCLCBmLCAjIyBhKQorI2RlZmluZSBEX0ZXKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfRlcsIGYsICMjIGEpCisjZGVmaW5lIERfUkZfS0lMTChmLCBhLi4uKQlJTF9EQkcoSUxfRExfUkZfS0lMTCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9EUk9QKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfRFJPUCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9BUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX0FQLCBmLCAjIyBhKQorI2RlZmluZSBEX1RYUE9XRVIoZiwgYS4uLikJSUxfREJHKElMX0RMX1RYUE9XRVIsIGYsICMjIGEpCisjZGVmaW5lIERfUkFURShmLCBhLi4uKQkJSUxfREJHKElMX0RMX1JBVEUsIGYsICMjIGEpCisjZGVmaW5lIERfTk9USUYoZiwgYS4uLikJSUxfREJHKElMX0RMX05PVElGLCBmLCAjIyBhKQorI2RlZmluZSBEX0FTU09DKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9BU1NPQywgZiwgIyMgYSkKKyNkZWZpbmUgRF9IVChmLCBhLi4uKQkJSUxfREJHKElMX0RMX0hULCBmLCAjIyBhKQorI2RlZmluZSBEX1NUQVRTKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9TVEFUUywgZiwgIyMgYSkKKyNkZWZpbmUgRF9UWF9SRVBMWShmLCBhLi4uKQlJTF9EQkcoSUxfRExfVFhfUkVQTFksIGYsICMjIGEpCisjZGVmaW5lIERfUU9TKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfUU9TLCBmLCAjIyBhKQorI2RlZmluZSBEX1JBRElPKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9SQURJTywgZiwgIyMgYSkKKyNkZWZpbmUgRF9QT1dFUihmLCBhLi4uKQlJTF9EQkcoSUxfRExfUE9XRVIsIGYsICMjIGEpCisjZGVmaW5lIERfMTFIKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfMTFILCBmLCAjIyBhKQorCisjZW5kaWYgLyogX19pbF9jb3JlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM4ZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY3NyLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX2lsX2Nzcl9oX18KKyNkZWZpbmUgX19pbF9jc3JfaF9fCisvKgorICogQ1NSIChjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzKQorICoKKyAqIENTUiByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGFuZCBhcmUgYWNjZXNzaWJsZQorICogd2hlbmV2ZXIgcGxhdGZvcm0gc3VwcGxpZXMgcG93ZXIgdG8gZGV2aWNlLCBldmVuIHdoZW4gZGV2aWNlIGlzIGluCisgKiBsb3cgcG93ZXIgc3RhdGVzIGR1ZSB0byBkcml2ZXItaW52b2tlZCBkZXZpY2UgcmVzZXRzCisgKiAoZS5nLiBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpIG9yIHVDb2RlLWRyaXZlbiBwb3dlci1zYXZpbmcgbW9kZXMuCisgKgorICogVXNlIF9pbF93cigpIGFuZCBfaWxfcmQoKSBmYW1pbHkgdG8gYWNjZXNzIHRoZXNlIHJlZ2lzdGVyczsKKyAqIHRoZXNlIHByb3ZpZGUgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgorICogRG8gbm90IHVzZSBpbF93cigpIGZhbWlseSBmb3IgdGhlc2UgcmVnaXN0ZXJzOworICogbm8gbmVlZCB0byAiZ3JhYiBuaWMgYWNjZXNzIiB2aWEgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRLgorICogVGhlIE1BQyAodUNvZGUgcHJvY2Vzc29yLCBldGMuKSBkb2VzIG5vdCBuZWVkIHRvIGJlIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZworICogdGhlIENTUiByZWdpc3RlcnMuCisgKgorICogTk9URTogIERldmljZSBkb2VzIG5lZWQgdG8gYmUgYXdha2UgaW4gb3JkZXIgdG8gcmVhZCB0aGlzIG1lbW9yeQorICogICAgICAgIHZpYSBDU1JfRUVQUk9NIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQ1NSX0JBU0UgICAgKDB4MDAwKQorCisjZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHICAgIChDU1JfQkFTRSsweDAwMCkJLyogaGFyZHdhcmUgaW50ZXJmYWNlIGNvbmZpZyAqLworI2RlZmluZSBDU1JfSU5UX0NPQUxFU0NJTkcgICAgICAoQ1NSX0JBU0UrMHgwMDQpCS8qIGFjY3VtIGludHMsIDMyLXVzZWMgdW5pdHMgKi8KKyNkZWZpbmUgQ1NSX0lOVCAgICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDA4KQkvKiBob3N0IGludGVycnVwdCBzdGF0dXMvYWNrICovCisjZGVmaW5lIENTUl9JTlRfTUFTSyAgICAgICAgICAgIChDU1JfQkFTRSsweDAwYykJLyogaG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIENTUl9GSF9JTlRfU1RBVFVTICAgICAgIChDU1JfQkFTRSsweDAxMCkJLyogYnVzbWFzdGVyIGludCBzdGF0dXMvYWNrICovCisjZGVmaW5lIENTUl9HUElPX0lOICAgICAgICAgICAgIChDU1JfQkFTRSsweDAxOCkJLyogcmVhZCBleHRlcm5hbCBjaGlwIHBpbnMgKi8KKyNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDIwKQkvKiBidXNtYXN0ZXIgZW5hYmxlLCBOTUksIGV0YyAqLworI2RlZmluZSBDU1JfR1BfQ05UUkwgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMjQpCisKKy8qIDJuZCBieXRlIG9mIENTUl9JTlRfQ09BTEVTQ0lORywgbm90IGFjY2Vzc2libGUgdmlhIF9pbF93cigpISAqLworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX1JFRwkoQ1NSX0JBU0UrMHgwMDUpCisKKy8qCisgKiBIYXJkd2FyZSByZXZpc2lvbiBpbmZvCisgKiBCaXQgZmllbGRzOgorICogMzEtODogIFJlc2VydmVkCisgKiAgNy00OiAgVHlwZSBvZiBkZXZpY2U6ICBzZWUgQ1NSX0hXX1JFVl9UWVBFX3h4eCBkZWZpbml0aW9ucworICogIDMtMjogIFJldmlzaW9uIHN0ZXA6ICAwID0gQSwgMSA9IEIsIDIgPSBDLCAzID0gRAorICogIDEtMDogICJEYXNoIiAoLSkgdmFsdWUsIGFzIGluIEEtMSwgZXRjLgorICoKKyAqIE5PVEU6ICBSZXZpc2lvbiBzdGVwIGFmZmVjdHMgY2FsY3VsYXRpb24gb2YgQ0NLIHR4cG93ZXIgZm9yIDQ5NjUuCisgKiBOT1RFOiAgU2VlIGFsc28gQ1NSX0hXX1JFVl9XQV9SRUcgKHdvcmstYXJvdW5kIGZvciBidWcgaW4gNDk2NSkuCisgKi8KKyNkZWZpbmUgQ1NSX0hXX1JFViAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDI4KQorCisvKgorICogRUVQUk9NIG1lbW9yeSByZWFkcworICoKKyAqIE5PVEU6ICBEZXZpY2UgbXVzdCBiZSBhd2FrZSwgaW5pdGlhbGl6ZWQgdmlhIGFwbV9vcHMuaW5pdCgpLAorICogICAgICAgIGluIG9yZGVyIHRvIHJlYWQuCisgKi8KKyNkZWZpbmUgQ1NSX0VFUFJPTV9SRUcgICAgICAgICAgKENTUl9CQVNFKzB4MDJjKQorI2RlZmluZSBDU1JfRUVQUk9NX0dQICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMzApCisKKyNkZWZpbmUgQ1NSX0dJT19SRUcJCShDU1JfQkFTRSsweDAzQykKKyNkZWZpbmUgQ1NSX0dQX1VDT0RFX1JFRwkoQ1NSX0JBU0UrMHgwNDgpCisjZGVmaW5lIENTUl9HUF9EUklWRVJfUkVHCShDU1JfQkFTRSsweDA1MCkKKworLyoKKyAqIFVDT0RFLURSSVZFUiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBtYWlsYm94IHJlZ2lzdGVycy4KKyAqIFNFVC9DTFIgcmVnaXN0ZXJzIHNldC9jbGVhciBiaXQocykgaWYgIjEiIGlzIHdyaXR0ZW4uCisgKi8KKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDEgICAgICAgKENTUl9CQVNFKzB4MDU0KQorI2RlZmluZSBDU1JfVUNPREVfRFJWX0dQMV9TRVQgICAoQ1NSX0JBU0UrMHgwNTgpCisjZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0NMUiAgIChDU1JfQkFTRSsweDA1YykKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDIgICAgICAgKENTUl9CQVNFKzB4MDYwKQorCisjZGVmaW5lIENTUl9MRURfUkVHICAgICAgICAgICAgIChDU1JfQkFTRSsweDA5NCkKKyNkZWZpbmUgQ1NSX0RSQU1fSU5UX1RCTF9SRUcJKENTUl9CQVNFKzB4MEEwKQorCisvKiBHSU8gQ2hpY2tlbiBCaXRzIChQQ0kgRXhwcmVzcyBidXMgbGluayBwb3dlciBtYW5hZ2VtZW50KSAqLworI2RlZmluZSBDU1JfR0lPX0NISUNLRU5fQklUUyAgICAoQ1NSX0JBU0UrMHgxMDApCisKKy8qIEFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgY29uZmlndXJhdGlvbiAgKi8KKyNkZWZpbmUgQ1NSX0FOQV9QTExfQ0ZHICAgICAgICAgKENTUl9CQVNFKzB4MjBjKQorCisvKgorICogQ1NSIEhhcmR3YXJlIFJldmlzaW9uIFdvcmthcm91bmQgUmVnaXN0ZXIuICBJbmRpY2F0ZXMgaGFyZHdhcmUgcmV2OworICogInN0ZXAiIGRldGVybWluZXMgQ0NLIGJhY2tvZmYgZm9yIHR4cG93ZXIgY2FsY3VsYXRpb24uICBVc2VkIGZvciA0OTY1IG9ubHkuCisgKiBTZWUgYWxzbyBDU1JfSFdfUkVWIHJlZ2lzdGVyLgorICogQml0IGZpZWxkczoKKyAqICAzLTI6ICAwID0gQSwgMSA9IEIsIDIgPSBDLCAzID0gRCBzdGVwCisgKiAgMS0wOiAgIkRhc2giICgtKSB2YWx1ZSwgYXMgaW4gQy0xLCBldGMuCisgKi8KKyNkZWZpbmUgQ1NSX0hXX1JFVl9XQV9SRUcJCShDU1JfQkFTRSsweDIyQykKKworI2RlZmluZSBDU1JfREJHX0hQRVRfTUVNX1JFRwkJKENTUl9CQVNFKzB4MjQwKQorI2RlZmluZSBDU1JfREJHX0xJTktfUFdSX01HTVRfUkVHCShDU1JfQkFTRSsweDI1MCkKKworLyogQml0cyBmb3IgQ1NSX0hXX0lGX0NPTkZJR19SRUcgKi8KKyNkZWZpbmUgQ1NSNDlfSFdfSUZfQ09ORklHX1JFR19CSVRfNDk2NV9SCSgweDAwMDAwMDEwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19NU0tfQk9BUkRfVkVSCSgweDAwMDAwQzAwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTUFDX1NJIAkoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX1JBRElPX1NJCSgweDAwMDAwMjAwKQorCisjZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTUIgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NTSAgICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9TS1VfTVJDICAgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUgICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0IgICAgKDB4MDAwMDEwMDApCisKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0hBUF9XQUtFX0wxQQkoMHgwMDA4MDAwMCkKKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNCSgweDAwMjAwMDAwKQorI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZCSgweDAwNDAwMDAwKQkvKiBQQ0lfT1dOX1NFTSAqLworI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSAoMHgwMjAwMDAwMCkJLyogTUVfT1dOICovCisjZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUJCSAgKDB4MDgwMDAwMDApCS8qIFdBS0VfTUUgKi8KKworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0RJUwkJCSgweDAwKQkvKiBkaXNhYmxlIHBlcmlvZGljIGludCAqLworI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0VOQQkJCSgweEZGKQkvKiAyNTUqMzIgdXNlYyB+IDggbXNlYyAqLworCisvKiBpbnRlcnJ1cHQgZmxhZ3MgaW4gSU5UQSwgc2V0IGJ5IHVDb2RlIG9yIGhhcmR3YXJlIChlLmcuIGRtYSksCisgKiBhY2tub3dsZWRnZWQgKHJlc2V0KSBieSBob3N0IHdyaXRpbmcgIjEiIHRvIGZsYWdnZWQgYml0cy4gKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfUlggICAgICAgICgxIDw8IDMxKQkvKiBSeCBETUEsIGNtZCByZXNwb25zZXMsIEZIX0lOVFsxNzoxNl0gKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfSFdfRVJSICAgICAgICgxIDw8IDI5KQkvKiBETUEgaGFyZHdhcmUgZXJyb3IgRkhfSU5UWzMxXSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SWF9QRVJJT0RJQwkgKDEgPDwgMjgpCS8qIFJ4IHBlcmlvZGljICovCisjZGVmaW5lIENTUl9JTlRfQklUX0ZIX1RYICAgICAgICAoMSA8PCAyNykJLyogVHggRE1BIEZIX0lOVFsxOjBdICovCisjZGVmaW5lIENTUl9JTlRfQklUX1NDRCAgICAgICAgICAoMSA8PCAyNikJLyogVFhRIHBvaW50ZXIgYWR2YW5jZWQgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfRVJSICAgICAgICgxIDw8IDI1KQkvKiB1Q29kZSBlcnJvciAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SRl9LSUxMICAgICAgKDEgPDwgNykJLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikJLyogQ3JpdGljYWwgdGVtcCAoY2hpcCB0b28gaG90KSByZmtpbGwgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfUlggICAgICAgICgxIDw8IDMpCS8qIFJ4LCBjb21tYW5kIHJlc3BvbnNlcywgMzk0NSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9XQUtFVVAgICAgICAgKDEgPDwgMSkJLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApCS8qIHVDb2RlIGludGVycnVwdHMgb25jZSBpdCBpbml0aWFsaXplcyAqLworCisjZGVmaW5lIENTUl9JTklfU0VUX01BU0sJKENTUl9JTlRfQklUX0ZIX1JYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX0hXX0VSUiAgfCBcCisJCQkJIENTUl9JTlRfQklUX0ZIX1RYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX1NXX0VSUiAgfCBcCisJCQkJIENTUl9JTlRfQklUX1JGX0tJTEwgfCBcCisJCQkJIENTUl9JTlRfQklUX1NXX1JYICAgfCBcCisJCQkJIENTUl9JTlRfQklUX1dBS0VVUCAgfCBcCisJCQkJIENTUl9JTlRfQklUX0FMSVZFKQorCisvKiBpbnRlcnJ1cHQgZmxhZ3MgaW4gRkggKGZsb3cgaGFuZGxlcikgKFBDSSBidXNtYXN0ZXIgRE1BKSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9FUlIgICAgICAgKDEgPDwgMzEpCS8qIEVycm9yICovCisjZGVmaW5lIENTUl9GSF9JTlRfQklUX0hJX1BSSU9SICAoMSA8PCAzMCkJLyogSGlnaCBwcmlvcml0eSBSeCwgYnlwYXNzIGNvYWxlc2NpbmcgKi8KKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9SWF9DSE5MMiAgKDEgPDwgMTgpCS8qIFJ4IGNoYW5uZWwgMiAoMzk0NSBvbmx5KSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSAgKDEgPDwgMTcpCS8qIFJ4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCAgKDEgPDwgMTYpCS8qIFJ4IGNoYW5uZWwgMCAqLworI2RlZmluZSBDU1IzOV9GSF9JTlRfQklUX1RYX0NITkw2ICAoMSA8PCA2KQkvKiBUeCBjaGFubmVsIDYgKDM5NDUgb25seSkgKi8KKyNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgICgxIDw8IDEpCS8qIFR4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkJLyogVHggY2hhbm5lbCAwICovCisKKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX1JYX01BU0sJKENTUl9GSF9JTlRfQklUX0hJX1BSSU9SIHwgXAorCQkJCSBDU1IzOV9GSF9JTlRfQklUX1JYX0NITkwyIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSB8IFwKKwkJCQkgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDApCisKKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX1RYX01BU0sJKENTUjM5X0ZIX0lOVF9CSVRfVFhfQ0hOTDYgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwxIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCkKKworI2RlZmluZSBDU1I0OV9GSF9JTlRfUlhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfSElfUFJJT1IgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwxIHwgXAorCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCkKKworI2RlZmluZSBDU1I0OV9GSF9JTlRfVFhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgfCBcCisJCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwwKQorCisvKiBHUElPICovCisjZGVmaW5lIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WQVVYX1BXUl9TUkMgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WTUFJTl9QV1JfU1JDICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisKKy8qIFJFU0VUICovCisjZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfRk9SQ0VfTk1JICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX1JFU0VUX1JFR19GTEFHX1NXX1JFU0VUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKy8qCisgKiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBDT05UUk9MIFJFR0lTVEVSCisgKiBCaXQgZmllbGRzOgorICogICAgMjc6ICBIV19SRl9LSUxMX1NXCisgKiAgICAgICAgIEluZGljYXRlcyBzdGF0ZSBvZiAocGxhdGZvcm0ncykgaGFyZHdhcmUgUkYtS2lsbCBzd2l0Y2gKKyAqIDI2LTI0OiAgUE9XRVJfU0FWRV9UWVBFCisgKiAgICAgICAgIEluZGljYXRlcyBjdXJyZW50IHBvd2VyLXNhdmluZyBtb2RlOgorICogICAgICAgICAwMDAgLS0gTm8gcG93ZXIgc2F2aW5nCisgKiAgICAgICAgIDAwMSAtLSBNQUMgcG93ZXItZG93bgorICogICAgICAgICAwMTAgLS0gUEhZIChyYWRpbykgcG93ZXItZG93bgorICogICAgICAgICAwMTEgLS0gRXJyb3IKKyAqICAgOS02OiAgU1lTX0NPTkZJRworICogICAgICAgICBJbmRpY2F0ZXMgY3VycmVudCBzeXN0ZW0gY29uZmlndXJhdGlvbiwgcmVmbGVjdGluZyBwaW5zIG9uIGNoaXAKKyAqICAgICAgICAgYXMgZm9yY2VkIGhpZ2gvbG93IGJ5IGRldmljZSBjaXJjdWl0IGJvYXJkLgorICogICAgIDQ6ICBHT0lOR19UT19TTEVFUAorICogICAgICAgICBJbmRpY2F0ZXMgTUFDIGlzIGVudGVyaW5nIGEgcG93ZXItc2F2aW5nIHNsZWVwIHBvd2VyLWRvd24uCisgKiAgICAgICAgIE5vdCBhIGdvb2QgdGltZSB0byBhY2Nlc3MgZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4KKyAqICAgICAzOiAgTUFDX0FDQ0VTU19SRVEKKyAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBhbmQgbWFpbnRhaW4gTUFDIHdha2V1cCwgdG8gYWxsb3cgaG9zdAorICogICAgICAgICBhY2Nlc3MgdG8gZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4gIEhvc3QgbXVzdCB3YWl0IGZvcgorICogICAgICAgICBNQUNfQ0xPQ0tfUkVBRFkgKGFuZCAhR09JTkdfVE9fU0xFRVApIGJlZm9yZSBhY2Nlc3Npbmcgbm9uLUNTUgorICogICAgICAgICBkZXZpY2UgcmVnaXN0ZXJzLgorICogICAgIDI6ICBJTklUX0RPTkUKKyAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcHV0IGRldmljZSBpbnRvIGZ1bGx5IG9wZXJhdGlvbmFsIEQwIHBvd2VyIG1vZGUuCisgKiAgICAgICAgIEhvc3QgcmVzZXRzIHRoaXMgYWZ0ZXIgU1dfUkVTRVQgdG8gcHV0IGRldmljZSBpbnRvIGxvdyBwb3dlciBtb2RlLgorICogICAgIDA6ICBNQUNfQ0xPQ0tfUkVBRFkKKyAqICAgICAgICAgSW5kaWNhdGVzIE1BQyAodWNvZGUgcHJvY2Vzc29yLCBldGMuKSBpcyBwb3dlcmVkIHVwIGFuZCBjYW4gcnVuLgorICogICAgICAgICBJbnRlcm5hbCByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUuCisgKiAgICAgICAgIE5PVEU6ICBUaGlzIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBhY3R1YWxseSBydW5uaW5nLgorICogICAgICAgICBOT1RFOiAgVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IDQ5NjUgb3IgMzk0NSBoYXMgY29tcGxldGVkCisgKiAgICAgICAgICAgICAgICBpbml0IG9yIHBvc3QtcG93ZXItZG93biByZXN0b3JlIG9mIGludGVybmFsIFNSQU0gbWVtb3J5LgorICogICAgICAgICAgICAgICAgVXNlIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgYXMgaW5kaWNhdGlvbiB0aGF0CisgKiAgICAgICAgICAgICAgICBTUkFNIGlzIHJlc3RvcmVkIGFuZCB1Q29kZSBpcyBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuCisgKiAgICAgICAgICAgICAgICBMYXRlciBkZXZpY2VzICg1eHh4LzZ4eHgvMXh4eCkgdXNlIG5vbi12b2xhdGlsZSBTUkFNLCBhbmQKKyAqICAgICAgICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBpdC4KKyAqICAgICAgICAgTk9URTogIEFmdGVyIGRldmljZSByZXNldCwgdGhpcyBiaXQgcmVtYWlucyAiMCIgdW50aWwgaG9zdCBzZXRzCisgKiAgICAgICAgICAgICAgICBJTklUX0RPTkUKKyAqLworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVAgICAgICAgICAoMHgwMDAwMDAxMCkKKworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX01TS19QT1dFUl9TQVZFX1RZUEUgICAgICAgICAoMHgwNzAwMDAwMCkKKyNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19QT1dFUl9TQVZFICAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXICAgICAgICAgICgweDA4MDAwMDAwKQorCisvKiBFRVBST00gUkVHICovCisjZGVmaW5lIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLCSgweDAwMDAwMDAxKQorI2RlZmluZSBDU1JfRUVQUk9NX1JFR19CSVRfQ01ECQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX0VFUFJPTV9SRUdfTVNLX0FERFIJCSgweDAwMDBGRkZDKQorI2RlZmluZSBDU1JfRUVQUk9NX1JFR19NU0tfREFUQQkJKDB4RkZGRjAwMDApCisKKy8qIEVFUFJPTSBHUCAqLworI2RlZmluZSBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSwkJKDB4MDAwMDAwMDcpCS8qIHNpZ25hdHVyZSAqLworI2RlZmluZSBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSwkoMHgwMDAwMDE4MCkKKyNkZWZpbmUgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLCQkoMHgwMDAwMDAwNCkKKworLyogR1AgUkVHICovCisjZGVmaW5lIENTUl9HUF9SRUdfUE9XRVJfU0FWRV9TVEFUVVNfTVNLICAgICAgICAgICAgKDB4MDMwMDAwMDApCS8qIGJpdCAyNC8yNSAqLworI2RlZmluZSBDU1JfR1BfUkVHX05PX1BPV0VSX1NBVkUgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIENTUl9HUF9SRUdfUEhZX1BPV0VSX1NBVkUgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBDU1JfR1BfUkVHX1BPV0VSX1NBVkVfRVJST1IgICAgICAgICAoMHgwMzAwMDAwMCkKKworLyogQ1NSIEdJTyAqLworI2RlZmluZSBDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQJKDB4MDAwMDAwMDIpCisKKy8qCisgKiBVQ09ERS1EUklWRVIgR1AgKGdlbmVyYWwgcHVycG9zZSkgbWFpbGJveCByZWdpc3RlciAxCisgKiBIb3N0IGRyaXZlciBhbmQgdUNvZGUgd3JpdGUgYW5kL29yIHJlYWQgdGhpcyByZWdpc3RlciB0byBjb21tdW5pY2F0ZSB3aXRoCisgKiBlYWNoIG90aGVyLgorICogQml0IGZpZWxkczoKKyAqICAgICA0OiAgVUNPREVfRElTQUJMRQorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB0byByZXF1ZXN0IHBlcm1hbmVudCBoYWx0IG9mIHVDb2RlLCBzYW1lIGFzCisgKiAgICAgICAgIHNlbmRpbmcgQ0FSRF9TVEFURSBjb21tYW5kIHdpdGggImhhbHQiIGJpdCBzZXQuCisgKiAgICAgMzogIENUX0tJTExfRVhJVAorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB0byByZXF1ZXN0IGV4aXQgZnJvbSBDVF9LSUxMIHN0YXRlLCBpLmUuIGhvc3QgdGhpbmtzCisgKiAgICAgICAgIGRldmljZSB0ZW1wZXJhdHVyZSBpcyBsb3cgZW5vdWdoIHRvIGNvbnRpbnVlIG5vcm1hbCBvcGVyYXRpb24uCisgKiAgICAgMjogIENNRF9CTE9DS0VECisgKiAgICAgICAgIEhvc3Qgc2V0cyB0aGlzIGR1cmluZyBSRiBLSUxMIHBvd2VyLWRvd24gc2VxdWVuY2UgKEhXLCBTVywgQ1QgS0lMTCkKKyAqICAgICAgICAgdG8gcmVsZWFzZSB1Q29kZSB0byBjbGVhciBhbGwgVHggYW5kIGNvbW1hbmQgcXVldWVzLCBlbnRlcgorICogICAgICAgICB1bmFzc29jaWF0ZWQgbW9kZSwgYW5kIHBvd2VyIGRvd24uCisgKiAgICAgICAgIE5PVEU6ICBTb21lIGRldmljZXMgYWxzbyB1c2UgSEJVU19UQVJHX01CWF9DIHJlZ2lzdGVyIGZvciB0aGlzIGJpdC4KKyAqICAgICAxOiAgU1dfQklUX1JGS0lMTAorICogICAgICAgICBIb3N0IHNldHMgdGhpcyB3aGVuIGlzc3VpbmcgQ0FSRF9TVEFURSBjb21tYW5kIHRvIHJlcXVlc3QKKyAqICAgICAgICAgZGV2aWNlIHNsZWVwLgorICogICAgIDA6ICBNQUNfU0xFRVAKKyAqICAgICAgICAgdUNvZGUgc2V0cyB0aGlzIHdoZW4gcHJlcGFyaW5nIGEgcG93ZXItc2F2aW5nIHBvd2VyLWRvd24uCisgKiAgICAgICAgIHVDb2RlIHJlc2V0cyB0aGlzIHdoZW4gcG93ZXItdXAgaXMgY29tcGxldGUgYW5kIFNSQU0gaXMgc2FuZS4KKyAqICAgICAgICAgTk9URTogIDM5NDUvNDk2NSBzYXZlcyBpbnRlcm5hbCBTUkFNIGRhdGEgdG8gaG9zdCB3aGVuIHBvd2VyaW5nIGRvd24sCisgKiAgICAgICAgICAgICAgICBhbmQgbXVzdCByZXN0b3JlIHRoaXMgZGF0YSBhZnRlciBwb3dlcmluZyBiYWNrIHVwLgorICogICAgICAgICAgICAgICAgTUFDX1NMRUVQIGlzIHRoZSBiZXN0IGluZGljYXRpb24gdGhhdCByZXN0b3JlIGlzIGNvbXBsZXRlLgorICogICAgICAgICAgICAgICAgTGF0ZXIgZGV2aWNlcyAoNXh4eC82eHh4LzF4eHgpIHVzZSBub24tdm9sYXRpbGUgU1JBTSwgYW5kCisgKiAgICAgICAgICAgICAgICBkbyBub3QgbmVlZCB0byBzYXZlL3Jlc3RvcmUgaXQuCisgKi8KKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQgICAgICAoMHgwMDAwMDAwOCkKKworLyogR0lPIENoaWNrZW4gQml0cyAoUENJIEV4cHJlc3MgYnVzIGxpbmsgcG93ZXIgbWFuYWdlbWVudCkgKi8KKyNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9ESVNfTDBTX0VYSVRfVElNRVIgICgweDIwMDAwMDAwKQorCisvKiBMRUQgKi8KKyNkZWZpbmUgQ1NSX0xFRF9CU01fQ1RSTF9NU0sgKDB4RkZGRkZGREYpCisjZGVmaW5lIENTUl9MRURfUkVHX1RSVU5fT04gKDB4NzgpCisjZGVmaW5lIENTUl9MRURfUkVHX1RSVU5fT0ZGICgweDM4KQorCisvKiBBTkFfUExMICovCisjZGVmaW5lIENTUjM5X0FOQV9QTExfQ0ZHX1ZBTCAgICAgICAgKDB4MDEwMDAwMDApCisKKy8qIEhQRVQgTUVNIGRlYnVnICovCisjZGVmaW5lIENTUl9EQkdfSFBFVF9NRU1fUkVHX1ZBTAkoMHhGRkZGMDAwMCkKKworLyogRFJBTSBJTlQgVEJMICovCisjZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFCQkoMSA8PCAzMSkKKyNkZWZpbmUgQ1NSX0RSQU1fSU5JVF9UQkxfV1JBUF9DSEVDSwkoMSA8PCAyNykKKworLyoKKyAqIEhCVVMgKEhvc3Qtc2lkZSBCdXMpCisgKgorICogSEJVUyByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGJ1dCBhcmUgdXNlZAorICogdG8gaW5kaXJlY3RseSBhY2Nlc3MgZGV2aWNlJ3MgaW50ZXJuYWwgbWVtb3J5IG9yIHJlZ2lzdGVycyB0aGF0CisgKiBtYXkgYmUgcG93ZXJlZC1kb3duLgorICoKKyAqIFVzZSBpbF93cigpL2lsX3JkKCkgZmFtaWx5CisgKiBmb3IgdGhlc2UgcmVnaXN0ZXJzOworICogaG9zdCBtdXN0ICJncmFiIG5pYyBhY2Nlc3MiIHZpYSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEKKyAqIHRvIG1ha2Ugc3VyZSB0aGUgTUFDICh1Q29kZSBwcm9jZXNzb3IsIGV0Yy4pIGlzIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZworICogaW50ZXJuYWwgcmVzb3VyY2VzLgorICoKKyAqIERvIG5vdCB1c2UgX2lsX3dyKCkvX2lsX3JkKCkgZmFtaWx5IHRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnM7CisgKiB0aGVzZSBwcm92aWRlIG9ubHkgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgorICovCisjZGVmaW5lIEhCVVNfQkFTRQkoMHg0MDApCisKKy8qCisgKiBSZWdpc3RlcnMgZm9yIGFjY2Vzc2luZyBkZXZpY2UncyBpbnRlcm5hbCBTUkFNIG1lbW9yeSAoZS5nLiBTQ0QgU1JBTQorICogc3RydWN0dXJlcywgZXJyb3IgbG9nLCBldmVudCBsb2csIHZlcmlmeWluZyB1Q29kZSBsb2FkKS4KKyAqIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsIHRoZW4gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGRhdGEgcmVnaXN0ZXIKKyAqIHRvIGNvbXBsZXRlIHRoZSBqb2IuICBPbmNlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGlzIHNldCB1cCwgYWNjZXNzZXMgdG8KKyAqIGRhdGEgcmVnaXN0ZXJzIGF1dG8taW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IG9uZSBkd29yZC4KKyAqIEJpdCB1c2FnZSBmb3IgYWRkcmVzcyByZWdpc3RlcnMgKHJlYWQgb3Igd3JpdGUpOgorICogIDAtMzE6ICBtZW1vcnkgYWRkcmVzcyB3aXRoaW4gZGV2aWNlCisgKi8KKyNkZWZpbmUgSEJVU19UQVJHX01FTV9SQUREUiAgICAgKEhCVVNfQkFTRSsweDAwYykKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9XQUREUiAgICAgKEhCVVNfQkFTRSsweDAxMCkKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9XREFUICAgICAgKEhCVVNfQkFTRSsweDAxOCkKKyNkZWZpbmUgSEJVU19UQVJHX01FTV9SREFUICAgICAgKEhCVVNfQkFTRSsweDAxYykKKworLyogTWFpbGJveCBDLCB1c2VkIGFzIHdvcmthcm91bmQgYWx0ZXJuYXRpdmUgdG8gQ1NSX1VDT0RFX0RSVl9HUDEgbWFpbGJveCAqLworI2RlZmluZSBIQlVTX1RBUkdfTUJYX0MgICAgICAgICAoSEJVU19CQVNFKzB4MDMwKQorI2RlZmluZSBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICgweDAwMDAwMDA0KQorCisvKgorICogUmVnaXN0ZXJzIGZvciBhY2Nlc3NpbmcgZGV2aWNlJ3MgaW50ZXJuYWwgcGVyaXBoZXJhbCByZWdpc3RlcnMKKyAqIChlLmcuIFNDRCwgQlNNLCBldGMuKS4gIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsCisgKiB0aGVuIHJlYWQgZnJvbSBvciB3cml0ZSB0byBkYXRhIHJlZ2lzdGVyIHRvIGNvbXBsZXRlIHRoZSBqb2IuCisgKiBCaXQgdXNhZ2UgZm9yIGFkZHJlc3MgcmVnaXN0ZXJzIChyZWFkIG9yIHdyaXRlKToKKyAqICAwLTE1OiAgcmVnaXN0ZXIgYWRkcmVzcyAob2Zmc2V0KSB3aXRoaW4gZGV2aWNlCisgKiAyNC0yNTogICgjIGJ5dGVzIC0gMSkgdG8gcmVhZCBvciB3cml0ZSAoZS5nLiAzIGZvciBkd29yZCkKKyAqLworI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XQUREUiAgICAoSEJVU19CQVNFKzB4MDQ0KQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SQUREUiAgICAoSEJVU19CQVNFKzB4MDQ4KQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XREFUICAgICAoSEJVU19CQVNFKzB4MDRjKQorI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SREFUICAgICAoSEJVU19CQVNFKzB4MDUwKQorCisvKgorICogUGVyLVR4LXF1ZXVlIHdyaXRlIHBvaW50ZXIgKGlkeCwgcmVhbGx5ISkKKyAqIEluZGljYXRlcyBpZHggdG8gbmV4dCBURkQgdGhhdCBkcml2ZXIgd2lsbCBmaWxsICgxIHBhc3QgbGF0ZXN0IGZpbGxlZCkuCisgKiBCaXQgdXNhZ2U6CisgKiAgMC03OiAgcXVldWUgd3JpdGUgaWR4CisgKiAxMS04OiAgcXVldWUgc2VsZWN0b3IKKyAqLworI2RlZmluZSBIQlVTX1RBUkdfV1JQVFIgICAgICAgICAoSEJVU19CQVNFKzB4MDYwKQorCisjZW5kaWYgLyogIV9faWxfY3NyX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiODkyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2RlYnVnLmMKQEAgLTAsMCArMSwxNDExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAorICogVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKKy8qIGNyZWF0ZSBhbmQgcmVtb3ZlIG9mIGZpbGVzICovCisjZGVmaW5lIERFQlVHRlNfQUREX0ZJTEUobmFtZSwgcGFyZW50LCBtb2RlKSBkbyB7CQkJXAorCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgjbmFtZSwgbW9kZSwgcGFyZW50LCBpbCwJCVwKKwkJCSAmaWxfZGJnZnNfIyNuYW1lIyNfb3BzKSkJCVwKKwkJZ290byBlcnI7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR0ZTX0FERF9CT09MKG5hbWUsIHBhcmVudCwgcHRyKSBkbyB7CQkJXAorCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKKwlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX2Jvb2woI25hbWUsIFNfSVdVU1IgfCBTX0lSVVNSLAkJXAorCQkJCSAgICBwYXJlbnQsIHB0cik7CQkJXAorCWlmIChJU19FUlIoX190bXApIHx8ICFfX3RtcCkJCQkJCVwKKwkJZ290byBlcnI7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUJVR0ZTX0FERF9YMzIobmFtZSwgcGFyZW50LCBwdHIpIGRvIHsJCQkJXAorCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKKwlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX3gzMigjbmFtZSwgU19JV1VTUiB8IFNfSVJVU1IsCQlcCisJCQkJICAgcGFyZW50LCBwdHIpOwkJCVwKKwlpZiAoSVNfRVJSKF9fdG1wKSB8fCAhX190bXApCQkJCQlcCisJCWdvdG8gZXJyOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIGZpbGUgb3BlcmF0aW9uICovCisjZGVmaW5lIERFQlVHRlNfUkVBRF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3NpemVfdCBpbF9kYmdmc18jI25hbWUjI19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCAgICAgICAgICAgICAgIFwKKwkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCAgICAgICAgICBcCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKworI2RlZmluZSBERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3QgaWxfZGJnZnNfIyNuYW1lIyNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsICAgICAgICAgICAgICBcCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwgICAgXAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKK3N0YXRpYyBpbnQKK2lsX2RiZ2ZzX29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgREVCVUdGU19SRUFEX0ZJTEVfT1BTKG5hbWUpCQkJCVwKKwlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsJCQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWxfZGJnZnNfIyNuYW1lIyNfb3BzID0gewlcCisJLnJlYWQgPSBpbF9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKKyNkZWZpbmUgREVCVUdGU19XUklURV9GSUxFX09QUyhuYW1lKQkJCQlcCisJREVCVUdGU19XUklURV9GVU5DKG5hbWUpOwkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbF9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKKwkud3JpdGUgPSBpbF9kYmdmc18jI25hbWUjI193cml0ZSwJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKKyNkZWZpbmUgREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKG5hbWUpCQkJXAorCURFQlVHRlNfUkVBRF9GVU5DKG5hbWUpOwkJCQlcCisJREVCVUdGU19XUklURV9GVU5DKG5hbWUpOwkJCQlcCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpbF9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKKwkud3JpdGUgPSBpbF9kYmdmc18jI25hbWUjI193cml0ZSwJCQlcCisJLnJlYWQgPSBpbF9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCisJLm9wZW4gPSBpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCisJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCVwKK307CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc190eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisKKwlpbnQgY250OworCXNzaXplX3QgcmV0OworCWNvbnN0IHNpemVfdCBidWZzeiA9CisJICAgIDEwMCArIHNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJNYW5hZ2VtZW50OlxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQU5BR0VNRU5UX01BWDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0JTI1c1x0XHQ6ICV1XG4iLAorCQkJICAgICAgaWxfZ2V0X21nbXRfc3RyaW5nKGNudCksIGlsLT50eF9zdGF0cy5tZ210W2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sXG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfY3RybF9zdHJpbmcoY250KSwgaWwtPnR4X3N0YXRzLmN0cmxbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkRhdGE6XG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGNudDogJXVcbiIsCisJCSAgICAgIGlsLT50eF9zdGF0cy5kYXRhX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKKwkJICAgICAgaWwtPnR4X3N0YXRzLmRhdGFfYnl0ZXMpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2NsZWFyX3RyYWZmaWNfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgY2xlYXJfZmxhZzsKKwljaGFyIGJ1Zls4XTsKKwlpbnQgYnVmX3NpemU7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIleCIsICZjbGVhcl9mbGFnKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpbF9jbGVhcl90cmFmZmljX3N0YXRzKGlsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmJ1ZjsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250OworCXNzaXplX3QgcmV0OworCWNvbnN0IHNpemVfdCBidWZzeiA9CisJICAgIDEwMCArIHNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIk1hbmFnZW1lbnQ6XG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BTkFHRU1FTlRfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfbWdtdF9zdHJpbmcoY250KSwgaWwtPnJ4X3N0YXRzLm1nbXRbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkNvbnRyb2w6XG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHQlMjVzXHRcdDogJXVcbiIsCisJCQkgICAgICBpbF9nZXRfY3RybF9zdHJpbmcoY250KSwgaWwtPnJ4X3N0YXRzLmN0cmxbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkRhdGE6XG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGNudDogJXVcbiIsCisJCSAgICAgIGlsLT5yeF9zdGF0cy5kYXRhX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKKwkJICAgICAgaWwtPnJ4X3N0YXRzLmRhdGFfYnl0ZXMpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJZVEUxX01BU0sgMHgwMDAwMDBmZjsKKyNkZWZpbmUgQllURTJfTUFTSyAweDAwMDBmZmZmOworI2RlZmluZSBCWVRFM19NQVNLIDB4MDBmZmZmZmY7CitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfc3JhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgbG9mZl90ICpwcG9zKQoreworCXUzMiB2YWw7CisJY2hhciAqYnVmOworCXNzaXplX3QgcmV0OworCWludCBpOworCWludCBwb3MgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgYnVmc3o7CisKKwkvKiBkZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBkYXRhIHNlZ21lbnQgKi8KKwlpZiAoIWlsLT5kYmdmc19zcmFtX29mZnNldCAmJiAhaWwtPmRiZ2ZzX3NyYW1fbGVuKSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOworCQlpZiAoaWwtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKKwkJCWlsLT5kYmdmc19zcmFtX2xlbiA9IGlsLT51Y29kZV9pbml0X2RhdGEubGVuOworCQllbHNlCisJCQlpbC0+ZGJnZnNfc3JhbV9sZW4gPSBpbC0+dWNvZGVfZGF0YS5sZW47CisJfQorCWJ1ZnN6ID0gMzAgKyBpbC0+ZGJnZnNfc3JhbV9sZW4gKiBzaXplb2YoY2hhcikgKiAxMDsKKwlidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3JhbV9sZW46IDB4JXhcbiIsCisJCSAgICAgIGlsLT5kYmdmc19zcmFtX2xlbik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3JhbV9vZmZzZXQ6IDB4JXhcbiIsCisJCSAgICAgIGlsLT5kYmdmc19zcmFtX29mZnNldCk7CisJZm9yIChpID0gaWwtPmRiZ2ZzX3NyYW1fbGVuOyBpID4gMDsgaSAtPSA0KSB7CisJCXZhbCA9CisJCSAgICBpbF9yZWFkX3RhcmdfbWVtKGlsLAorCQkJCSAgICAgaWwtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICsKKwkJCQkgICAgIGlsLT5kYmdmc19zcmFtX2xlbiAtIGkpOworCQlpZiAoaSA8IDQpIHsKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAxOgorCQkJCXZhbCAmPSBCWVRFMV9NQVNLOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXZhbCAmPSBCWVRFMl9NQVNLOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXZhbCAmPSBCWVRFM19NQVNLOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghKGkgJSAxNikpCisJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIweCUwOHggIiwgdmFsKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3NyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls2NF07CisJaW50IGJ1Zl9zaXplOworCXUzMiBvZmZzZXQsIGxlbjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzc2NhbmYoYnVmLCAiJXgsJXgiLCAmb2Zmc2V0LCAmbGVuKSA9PSAyKSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IG9mZnNldDsKKwkJaWwtPmRiZ2ZzX3NyYW1fbGVuID0gbGVuOworCX0gZWxzZSB7CisJCWlsLT5kYmdmc19zcmFtX29mZnNldCA9IDA7CisJCWlsLT5kYmdmc19zcmFtX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfc3RhdGlvbnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9zdGF0aW9uX2VudHJ5ICpzdGF0aW9uOworCWludCBtYXhfc3RhID0gaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7CisJY2hhciAqYnVmOworCWludCBpLCBqLCBwb3MgPSAwOworCXNzaXplX3QgcmV0OworCS8qIEFkZCAzMCBmb3IgaW5pdGlhbCBzdHJpbmcgKi8KKwljb25zdCBzaXplX3QgYnVmc3ogPSAzMCArIHNpemVvZihjaGFyKSAqIDUwMCAqIChpbC0+bnVtX3N0YXRpb25zKTsKKworCWJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm51bSBvZiBzdGF0aW9uczogJWRcblxuIiwKKwkJICAgICAgaWwtPm51bV9zdGF0aW9ucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3N0YTsgaSsrKSB7CisJCXN0YXRpb24gPSAmaWwtPnN0YXRpb25zW2ldOworCQlpZiAoIXN0YXRpb24tPnVzZWQpCisJCQljb250aW51ZTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJzdGF0aW9uICVkIC0gYWRkcjogJXBNLCBmbGFnczogJSN4XG4iLCBpLAorCQkJICAgICAgc3RhdGlvbi0+c3RhLnN0YS5hZGRyLAorCQkJICAgICAgc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3NfbXNrKTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJUSURcdHNlcV9udW1cdHR4cV9pZFx0ZnJhbWVzXHR0ZmRzXHQiKTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJzdGFydF9pZHhcdGJpdG1hcFx0XHRcdHJhdGVfbl9mbGFnc1xuIik7CisKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9USURfQ09VTlQ7IGorKykgeworCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIiVkOlx0JSN4XHQlI3hcdCV1XHQldVx0JXVcdFx0JSMuMTZsbHhcdCUjeCIsCisJCQkJICAgICAgaiwgc3RhdGlvbi0+dGlkW2pdLnNlcV9udW1iZXIsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy50eHFfaWQsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy5mcmFtZV9jb3VudCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0udGZkc19pbl9xdWV1ZSwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLnN0YXJ0X2lkeCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLmJpdG1hcCwKKwkJCQkgICAgICBzdGF0aW9uLT50aWRbal0uYWdnLnJhdGVfbl9mbGFncyk7CisKKwkJCWlmIChzdGF0aW9uLT50aWRbal0uYWdnLndhaXRfZm9yX2JhKQorCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkJICAgICAgIiAtIHdhaXRmb3JiYSIpOworCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwkJfQorCisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfbnZtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDAsIG9mcyA9IDAsIGJ1Zl9zaXplID0gMDsKKwljb25zdCB1OCAqcHRyOworCWNoYXIgKmJ1ZjsKKwl1MTYgZWVwcm9tX3ZlcjsKKwlzaXplX3QgZWVwcm9tX2xlbiA9IGlsLT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKKwlidWZfc2l6ZSA9IDQgKiBlZXByb21fbGVuICsgMjU2OworCisJaWYgKGVlcHJvbV9sZW4gJSAxNikgeworCQlJTF9FUlIoIk5WTSBzaXplIGlzIG5vdCBtdWx0aXBsZSBvZiAxNi5cbiIpOworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCisJcHRyID0gaWwtPmVlcHJvbTsKKwlpZiAoIXB0cikgeworCQlJTF9FUlIoIkludmFsaWQgRUVQUk9NIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIDQgY2hhcmFjdGVycyBmb3IgYnl0ZSAweFlZICovCisJYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllZXByb21fdmVyID0gaWxfZWVwcm9tX3F1ZXJ5MTYoaWwsIEVFUFJPTV9WRVJTSU9OKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmX3NpemUgLSBwb3MsICJFRVBST00gIiAidmVyc2lvbjogMHgleFxuIiwKKwkJICAgICAgZWVwcm9tX3Zlcik7CisJZm9yIChvZnMgPSAwOyBvZnMgPCBlZXByb21fbGVuOyBvZnMgKz0gMTYpIHsKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiMHglLjR4ICIsIG9mcyk7CisJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwgYnVmICsgcG9zLAorCQkJCSAgIGJ1Zl9zaXplIC0gcG9zLCAwKTsKKwkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOworCQlpZiAoYnVmX3NpemUgLSBwb3MgPiAwKQorCQkJYnVmW3BvcysrXSA9ICdcbic7CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfY2hhbm5lbHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHMgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnN1cHBfYmFuZCA9IE5VTEw7CisJaW50IHBvcyA9IDAsIGksIGJ1ZnN6ID0gUEFHRV9TSVpFOworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHJldDsKKworCWlmICghdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdXBwX2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgSUVFRTgwMjExX0JBTkRfMkdIWik7CisJaWYgKHN1cHBfYmFuZCkgeworCQljaGFubmVscyA9IHN1cHBfYmFuZC0+Y2hhbm5lbHM7CisKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJEaXNwbGF5aW5nICVkIGNoYW5uZWxzIGluIDIuNEdIeiBiYW5kIDgwMi4xMWJnKTpcbiIsCisJCQkgICAgICBzdXBwX2JhbmQtPm5fY2hhbm5lbHMpOworCisJCWZvciAoaSA9IDA7IGkgPCBzdXBwX2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKKwkJCXBvcyArPQorCQkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJCSAgICAgICIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5od192YWx1ZSwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5tYXhfcG93ZXIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uCisJCQkJICAgICAgZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/CisJCQkJICAgICAgIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKKwkJCQkgICAgICAoKGNoYW5uZWxzW2ldLgorCQkJCQlmbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpIHx8CisJCQkJICAgICAgIChjaGFubmVsc1tpXS4KKwkJCQkJZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikpID8gIiIgOgorCQkJCSAgICAgICIsIElCU1MiLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLgorCQkJCSAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOID8KKwkJCQkgICAgICAicGFzc2l2ZSBvbmx5IiA6ICJhY3RpdmUvcGFzc2l2ZSIpOworCX0KKwlzdXBwX2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgSUVFRTgwMjExX0JBTkRfNUdIWik7CisJaWYgKHN1cHBfYmFuZCkgeworCQljaGFubmVscyA9IHN1cHBfYmFuZC0+Y2hhbm5lbHM7CisKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJEaXNwbGF5aW5nICVkIGNoYW5uZWxzIGluIDUuMkdIeiBiYW5kICg4MDIuMTFhKVxuIiwKKwkJCSAgICAgIHN1cHBfYmFuZC0+bl9jaGFubmVscyk7CisKKwkJZm9yIChpID0gMDsgaSA8IHN1cHBfYmFuZC0+bl9jaGFubmVsczsgaSsrKQorCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIiVkOiAlZGRCbTogQlNTJXMlcywgJXMuXG4iLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLmh3X3ZhbHVlLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLm1heF9wb3dlciwKKwkJCQkgICAgICBjaGFubmVsc1tpXS4KKwkJCQkgICAgICBmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSID8KKwkJCQkgICAgICAiIChJRUVFIDgwMi4xMWggcmVxdWlyZWQpIiA6ICIiLAorCQkJCSAgICAgICgoY2hhbm5lbHNbaV0uCisJCQkJCWZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykgfHwKKwkJCQkgICAgICAgKGNoYW5uZWxzW2ldLgorCQkJCQlmbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKSkgPyAiIiA6CisJCQkJICAgICAgIiwgSUJTUyIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uCisJCQkJICAgICAgZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gPworCQkJCSAgICAgICJwYXNzaXZlIG9ubHkiIDogImFjdGl2ZS9wYXNzaXZlIik7CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbNTEyXTsKKwlpbnQgcG9zID0gMDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfSENNRF9BQ1RJVkU6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19JTlRfRU5BQkxFRDpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1JGX0tJTExfSFc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0NUX0tJTEw6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19DVF9LSUxMLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfSU5JVDpcdFx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0lOSVQsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19BTElWRTpcdFx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0FMSVZFLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfUkVBRFk6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1RFTVBFUkFUVVJFOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1RFTVBFUkFUVVJFLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfR0VPX0NPTkZJR1VSRUQ6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19FWElUX1BFTkRJTkc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfU1RBVFM6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU1RBVFMsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19TQ0FOTklORzpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1NDQU5fQUJPUlRJTkc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1NDQU5fSFc6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfUE9XRVJfUE1JOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0ZXX0VSUk9SOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0ZXX0VSUk9SLCAmaWwtPnN0YXR1cykpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2ludGVycnVwdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCWxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250ID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gMjQgKiA2NDsJLyogMjQgaXRlbXMgKiA2NCBjaGFyIHBlciBpdGVtICovCisJc3NpemVfdCByZXQ7CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiSW50ZXJydXB0IFN0YXRpc3RpY3MgUmVwb3J0OlxuIik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJIVyBFcnJvcjpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuaHcpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNXIEVycm9yOlx0XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5zdyk7CisJaWYgKGlsLT5pc3Jfc3RhdHMuc3cgfHwgaWwtPmlzcl9zdGF0cy5odykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIlx0TGFzdCBSZXN0YXJ0aW5nIENvZGU6ICAweCVYXG4iLAorCQkJICAgICAgaWwtPmlzcl9zdGF0cy5lcnJfY29kZSk7CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkZyYW1lIHRyYW5zbWl0dGVkOlx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuc2NoKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJBbGl2ZSBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5hbGl2ZSk7CisjZW5kaWYKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICJIVyBSRiBLSUxMIHN3aXRjaCB0b2dnbGVkOlx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnJma2lsbCk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDVCBLSUxMOlx0XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5jdGtpbGwpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiV2FrZXVwIEludGVycnVwdDpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLndha2V1cCk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJSeCBjb21tYW5kIHJlc3BvbnNlczpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnJ4KTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IElMX0NOX01BWDsgY250KyspIHsKKwkJaWYgKGlsLT5pc3Jfc3RhdHMuaGFuZGxlcnNbY250XSA+IDApCisJCQlwb3MgKz0KKwkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkgICAgICAiXHRSeCBoYW5kbGVyWyUzNnNdOlx0XHQgJXVcbiIsCisJCQkJICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY250KSwKKwkJCQkgICAgICBpbC0+aXNyX3N0YXRzLmhhbmRsZXJzW2NudF0pOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4L0ZIIGludGVycnVwdDpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnR4KTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlVuZXhwZWN0ZWQgSU5UQTpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnVuaGFuZGxlZCk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19pbnRlcnJ1cHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCXUzMiByZXNldF9mbGFnOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmcmVzZXRfZmxhZykgIT0gMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJlc2V0X2ZsYWcgPT0gMCkKKwkJaWxfY2xlYXJfaXNyX3N0YXRzKGlsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Fvc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCBwb3MgPSAwLCBpOworCWNoYXIgYnVmWzI1Nl07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjb250ZXh0ICVkOlxuIiwgY3R4LT5jdHhpZCk7CisJZm9yIChpID0gMDsgaSA8IEFDX05VTTsgaSsrKSB7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiXHRjd19taW5cdGN3X21heFx0YWlmc25cdHR4b3BcbiIpOworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIkFDWyVkXVx0JXVcdCV1XHQldVx0JXVcbiIsIGksCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5jd19taW4sCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5jd19tYXgsCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5haWZzbiwKKwkJCSAgICAgIGN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmVkY2FfdHhvcCk7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZGlzYWJsZV9odDQwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgaHQ0MDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmh0NDApICE9IDEpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghaWxfaXNfYW55X2Fzc29jaWF0ZWQoaWwpKQorCQlpbC0+ZGlzYWJsZV9odDQwID0gaHQ0MCA/IHRydWUgOiBmYWxzZTsKKwllbHNlIHsKKwkJSUxfRVJSKCJTdGEgYXNzb2NpYXRlZCB3aXRoIEFQIC0gIgorCQkgICAgICAgIkNoYW5nZSB0byA0ME1IeiBjaGFubmVsIHN1cHBvcnQgaXMgbm90IGFsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19kaXNhYmxlX2h0NDBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzEwMF07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIxMW4gNDBNSHogTW9kZTogJXNcbiIsCisJCSAgICAgIGlsLT5kaXNhYmxlX2h0NDAgPyAiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhzcmFtKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhudm0pOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXRpb25zKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFubmVscyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMoc3RhdHVzKTsKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhpbnRlcnJ1cHQpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHFvcyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZGlzYWJsZV9odDQwKTsKKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3RyYWZmaWNfbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwLCBvZnMgPSAwOworCWludCBjbnQgPSAwLCBlbnRyeTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnE7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0KKwkgICAgKChJTF9UUkFGRklDX0VOVFJJRVMgKiBJTF9UUkFGRklDX0VOVFJZX1NJWkUgKiA2NCkgKiAyKSArCisJICAgIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqIDMyICogOCkgKyA0MDA7CisJY29uc3QgdTggKnB0cjsKKwlzc2l6ZV90IHJldDsKKworCWlmICghaWwtPnR4cSkgeworCQlJTF9FUlIoInR4cSBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJUeCBRdWV1ZVxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgeworCQl0eHEgPSAmaWwtPnR4cVtjbnRdOworCQlxID0gJnR4cS0+cTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJxWyVkXTogcmVhZF9wdHI6ICV1LCB3cml0ZV9wdHI6ICV1XG4iLCBjbnQsCisJCQkgICAgICBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKKwl9CisJaWYgKGlsLT50eF90cmFmZmljICYmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1RYKSkgeworCQlwdHIgPSBpbC0+dHhfdHJhZmZpYzsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4IFRyYWZmaWMgaWR4OiAldVxuIiwKKwkJCSAgICAgIGlsLT50eF90cmFmZmljX2lkeCk7CisJCWZvciAoY250ID0gMCwgb2ZzID0gMDsgY250IDwgSUxfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgeworCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSUxfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7CisJCQkgICAgIGVudHJ5KyssIG9mcyArPSAxNikgeworCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JS40eCAiLAorCQkJCQkgICAgICBvZnMpOworCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKKwkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOworCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKwkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQorCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKKwkJCX0KKwkJfQorCX0KKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFF1ZXVlXG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyZWFkOiAldSwgd3JpdGU6ICV1XG4iLAorCQkgICAgICByeHEtPnJlYWQsIHJ4cS0+d3JpdGUpOworCisJaWYgKGlsLT5yeF90cmFmZmljICYmIChpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1JYKSkgeworCQlwdHIgPSBpbC0+cnhfdHJhZmZpYzsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFRyYWZmaWMgaWR4OiAldVxuIiwKKwkJCSAgICAgIGlsLT5yeF90cmFmZmljX2lkeCk7CisJCWZvciAoY250ID0gMCwgb2ZzID0gMDsgY250IDwgSUxfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgeworCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSUxfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7CisJCQkgICAgIGVudHJ5KyssIG9mcyArPSAxNikgeworCQkJCXBvcyArPQorCQkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JS40eCAiLAorCQkJCQkgICAgICBvZnMpOworCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKKwkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOworCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKwkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQorCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3RyYWZmaWNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCWludCB0cmFmZmljX2xvZzsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRyYWZmaWNfbG9nKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodHJhZmZpY19sb2cgPT0gMCkKKwkJaWxfcmVzZXRfdHJhZmZpY19sb2coaWwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdHhfcXVldWVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHE7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCWNoYXIgKmJ1ZjsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250OworCWludCByZXQ7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0KKwkgICAgc2l6ZW9mKGNoYXIpICogNjQgKiBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKworCWlmICghaWwtPnR4cSkgeworCQlJTF9FUlIoInR4cSBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgeworCQl0eHEgPSAmaWwtPnR4cVtjbnRdOworCQlxID0gJnR4cS0+cTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJod3EgJS4yZDogcmVhZD0ldSB3cml0ZT0ldSBzdG9wPSVkIgorCQkJICAgICAgIiBzd3FfaWQ9JSMuMnggKGFjICVkL2h3cSAlZClcbiIsIGNudCwKKwkJCSAgICAgIHEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIsCisJCQkgICAgICAhIXRlc3RfYml0KGNudCwgaWwtPnF1ZXVlX3N0b3BwZWQpLAorCQkJICAgICAgdHhxLT5zd3FfaWQsIHR4cS0+c3dxX2lkICYgMywKKwkJCSAgICAgICh0eHEtPnN3cV9pZCA+PiAyKSAmIDB4MWYpOworCQlpZiAoY250ID49IDQpCisJCQljb250aW51ZTsKKwkJLyogZm9yIHRoZSBBQ3MsIGRpc3BsYXkgdGhlIHN0b3AgY291bnQgdG9vICovCisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiICAgICAgICBzdG9wLWNvdW50OiAlZFxuIiwKKwkJCSAgICAgIGF0b21pY19yZWFkKCZpbC0+cXVldWVfc3RvcF9jb3VudFtjbnRdKSk7CisJfQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJY2hhciBidWZbMjU2XTsKKwlpbnQgcG9zID0gMDsKKwljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInJlYWQ6ICV1XG4iLCByeHEtPnJlYWQpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIndyaXRlOiAldVxuIiwgcnhxLT53cml0ZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZnJlZV9jb3VudDogJXVcbiIsCisJCSAgICAgIHJ4cS0+ZnJlZV9jb3VudCk7CisJaWYgKHJ4cS0+cmJfc3R0cykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2xvc2VkX3JiX251bTogJXVcbiIsCisJCQkgICAgICBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPgorCQkJCQkgIGNsb3NlZF9yYl9udW0pICYgMHgwRkZGKTsKKwl9IGVsc2UgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgImNsb3NlZF9yYl9udW06IE5vdCBBbGxvY2F0ZWRcbiIpOworCX0KKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc191Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnJ4X3N0YXRzX3JlYWQoZmlsZSwgdXNlcl9idWYsCisJCQkJCQkJICAgIGNvdW50LCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMudHhfc3RhdHNfcmVhZChmaWxlLCB1c2VyX2J1ZiwKKwkJCQkJCQkgICAgY291bnQsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5kZWJ1Z2ZzX29wcy5nZW5lcmFsX3N0YXRzX3JlYWQoZmlsZSwgdXNlcl9idWYsCisJCQkJCQkJCSBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19zZW5zaXRpdml0eV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWludCBjbnQgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEpICogNCArIDEwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YTsKKworCWRhdGEgPSAmaWwtPnNlbnNpdGl2aXR5X2RhdGE7CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX29mZG0pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX21yYzpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX3gxOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfb2ZkbV9tcmNfeDE6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfY2NrOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX2Njayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX2Nja19tcmM6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX2Nja19tcmMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgImxhc3RfYmFkX3BsY3BfY250X29mZG06XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfb2ZkbTpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5sYXN0X2ZhX2NudF9vZmRtKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJsYXN0X2JhZF9wbGNwX2NudF9jY2s6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJsYXN0X2ZhX2NudF9jY2s6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9mYV9jbnRfY2NrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfY3Vycl9zdGF0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19jdXJyX3N0YXRlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfcHJldl9zdGF0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19wcmV2X3N0YXRlKTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfdmFsdWU6XHRcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5ucmdfdmFsdWVbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcnNzaTpcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKKwkJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcmVmOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX3JlZik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX2VuZXJneV9pZHg6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfZW5lcmd5X2lkeCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfaWR4Olx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ19zaWxlbmNlX2lkeCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3RoX2NjazpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ190aF9jY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmOlx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnVtX2luX2Nja19ub19mYTpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfdGhfb2ZkbTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPm5yZ190aF9vZmRtKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2NoYWluX25vaXNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJaW50IGNudCA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSkgKiA0ICsgMTAwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhOworCisJZGF0YSA9ICZpbC0+Y2hhaW5fbm9pc2VfZGF0YTsKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYWN0aXZlX2NoYWluczpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmFjdGl2ZV9jaGFpbnMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2E6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9iOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYzpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX25vaXNlX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9hOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9iOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9jOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImJlYWNvbl9jb3VudDpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmJlYWNvbl9jb3VudCk7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaXNjb25uX2FycmF5Olx0XHRcdCIpOworCWZvciAoY250ID0gMDsgY250IDwgTlVNX1JYX0NIQUlOUzsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5kaXNjb25uX2FycmF5W2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImRlbHRhX2dhaW5fY29kZTpcdFx0Iik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fUlhfQ0hBSU5TOyBjbnQrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKKwkJCSAgICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVtjbnRdKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyYWRpb193cml0ZTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPnJhZGlvX3dyaXRlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzdGF0ZTpcdFx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+c3RhdGUpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcG93ZXJfc2F2ZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls2MF07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJdTMyIHB3cnNhdmVfc3RhdHVzOworCisJcHdyc2F2ZV9zdGF0dXMgPQorCSAgICBfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfUkVHX1BPV0VSX1NBVkVfU1RBVFVTX01TSzsKKworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlBvd2VyIFNhdmUgU3RhdHVzOiAiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlc1xuIiwKKwkJICAgICAgKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSkgPyAibm9uZSIgOgorCQkgICAgICAocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSkgPyAiTUFDIiA6CisJCSAgICAgIChwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX1BIWV9QT1dFUl9TQVZFKSA/ICJQSFkiIDoKKwkJICAgICAgImVycm9yIik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19jbGVhcl91Y29kZV9zdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCWludCBjbGVhcjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmNsZWFyKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIG1ha2UgcmVxdWVzdCB0byB1Q29kZSB0byByZXRyaWV2ZSBzdGF0cyBpbmZvcm1hdGlvbiAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfc2VuZF9zdGF0c19yZXF1ZXN0KGlsLCBDTURfU1lOQywgdHJ1ZSk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcnhvbl9mbGFnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGxlbiA9IDA7CisJY2hhciBidWZbMjBdOworCisJbGVuID0gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGxlMzJfdG9fY3B1KGlsLT5jdHguYWN0aXZlLmZsYWdzKSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfcnhvbl9maWx0ZXJfZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBsZW4gPSAwOworCWNoYXIgYnVmWzIwXTsKKworCWxlbiA9CisJICAgIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBsZTMyX3RvX2NwdShpbC0+Y3R4LmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19maF9yZWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisJc3NpemVfdCByZXQgPSAtRUZBVUxUOworCisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKSB7CisJCXJldCA9IHBvcyA9IGlsLT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKGlsLCAmYnVmLCB0cnVlKTsKKwkJaWYgKGJ1ZikgeworCQkJcmV0ID0KKwkJCSAgICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwKKwkJCQkJCSAgICBwb3MpOworCQkJa2ZyZWUoYnVmKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19taXNzZWRfYmVhY29uX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyIGJ1ZlsxMl07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlZFxuIiwKKwkJICAgICAgaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX21pc3NlZF9iZWFjb25fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgbWlzc2VkOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbWlzc2VkKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtaXNzZWQgPCBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9NSU4gfHwKKwkgICAgbWlzc2VkID4gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYKQorCQlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7CisJZWxzZQorCQlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBtaXNzZWQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19mb3JjZV9yZXNldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgYnVmWzMwMF07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKKworCWZvcmNlX3Jlc2V0ID0gJmlsLT5mb3JjZV9yZXNldDsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Q6ICVkXG4iLAorCQkgICAgICBmb3JjZV9yZXNldC0+cmVzZXRfcmVxdWVzdF9jb3VudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCBzdWNjZXNzOiAlZFxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3QgcmVqZWN0OiAlZFxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRyZXNldCBkdXJhdGlvbjogJWx1XG4iLAorCQkgICAgICBmb3JjZV9yZXNldC0+cmVzZXRfZHVyYXRpb24pOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZm9yY2VfcmVzZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJaW50IHJldDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXQgPSBpbF9mb3JjZV9yZXNldChpbCwgdHJ1ZSk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc193ZF90aW1lb3V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgdGltZW91dDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRpbWVvdXQpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gSUxfTUFYX1dEX1RJTUVPVVQpCisJCXRpbWVvdXQgPSBJTF9ERUZfV0RfVElNRU9VVDsKKworCWlsLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0ID0gdGltZW91dDsKKwlpbF9zZXR1cF93YXRjaGRvZyhpbCk7CisJcmV0dXJuIGNvdW50OworfQorCitERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0cmFmZmljX2xvZyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfcXVldWUpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3F1ZXVlKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV9yeF9zdGF0cyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfdHhfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX2dlbmVyYWxfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHNlbnNpdGl2aXR5KTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFpbl9ub2lzZSk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMocG93ZXJfc2F2ZV9zdGF0dXMpOworREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl91Y29kZV9zdGF0cyk7CitERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGNsZWFyX3RyYWZmaWNfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKGZoX3JlZyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobWlzc2VkX2JlYWNvbik7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZm9yY2VfcmVzZXQpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmxhZ3MpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmlsdGVyX2ZsYWdzKTsKK0RFQlVHRlNfV1JJVEVfRklMRV9PUFMod2RfdGltZW91dCk7CisKKy8qCisgKiBDcmVhdGUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgKgorICovCitpbnQKK2lsX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwaHlkID0gaWwtPmh3LT53aXBoeS0+ZGVidWdmc2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZHJ2LCAqZGlyX2RhdGEsICpkaXJfcmYsICpkaXJfZGVidWc7CisKKwlkaXJfZHJ2ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBoeWQpOworCWlmICghZGlyX2RydikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbC0+ZGVidWdmc19kaXIgPSBkaXJfZHJ2OworCisJZGlyX2RhdGEgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhdGEiLCBkaXJfZHJ2KTsKKwlpZiAoIWRpcl9kYXRhKQorCQlnb3RvIGVycjsKKwlkaXJfcmYgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJmIiwgZGlyX2Rydik7CisJaWYgKCFkaXJfcmYpCisJCWdvdG8gZXJyOworCWRpcl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGVidWciLCBkaXJfZHJ2KTsKKwlpZiAoIWRpcl9kZWJ1ZykKKwkJZ290byBlcnI7CisKKwlERUJVR0ZTX0FERF9GSUxFKG52bSwgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoc3JhbSwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHN0YXRpb25zLCBkaXJfZGF0YSwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShjaGFubmVscywgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoc3RhdHVzLCBkaXJfZGF0YSwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShpbnRlcnJ1cHQsIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShxb3MsIGRpcl9kYXRhLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKGRpc2FibGVfaHQ0MCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHJ4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodHhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh0cmFmZmljX2xvZywgZGlyX2RlYnVnLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShyeF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHR4X3F1ZXVlLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUocG93ZXJfc2F2ZV9zdGF0dXMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShjbGVhcl91Y29kZV9zdGF0cywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKGNsZWFyX3RyYWZmaWNfc3RhdHMsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRShmaF9yZWcsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShtaXNzZWRfYmVhY29uLCBkaXJfZGVidWcsIFNfSVdVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoZm9yY2VfcmVzZXQsIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfcnhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh1Y29kZV90eF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX2dlbmVyYWxfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisKKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKKwkJREVCVUdGU19BRERfRklMRShzZW5zaXRpdml0eSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKKwkJREVCVUdGU19BRERfRklMRShjaGFpbl9ub2lzZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRShyeG9uX2ZpbHRlcl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHdkX3RpbWVvdXQsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJaWYgKGlsLT5jZmctPmJhc2VfcGFyYW1zLT5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIpCisJCURFQlVHRlNfQUREX0JPT0woZGlzYWJsZV9zZW5zaXRpdml0eSwgZGlyX3JmLAorCQkJCSAmaWwtPmRpc2FibGVfc2Vuc19jYWwpOworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyKQorCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfY2hhaW5fbm9pc2UsIGRpcl9yZiwKKwkJCQkgJmlsLT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCk7CisJREVCVUdGU19BRERfQk9PTChkaXNhYmxlX3R4X3Bvd2VyLCBkaXJfcmYsICZpbC0+ZGlzYWJsZV90eF9wb3dlcl9jYWwpOworCXJldHVybiAwOworCitlcnI6CisJSUxfRVJSKCJDYW4ndCBjcmVhdGUgdGhlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwlpbF9kYmdmc191bnJlZ2lzdGVyKGlsKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZGJnZnNfcmVnaXN0ZXIpOworCisvKioKKyAqIFJlbW92ZSB0aGUgZGVidWdmcyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAqCisgKi8KK3ZvaWQKK2lsX2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmICghaWwtPmRlYnVnZnNfZGlyKQorCQlyZXR1cm47CisKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaWwtPmRlYnVnZnNfZGlyKTsKKwlpbC0+ZGVidWdmc19kaXIgPSBOVUxMOworfQorRVhQT1JUX1NZTUJPTChpbF9kYmdmc191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhYmIzOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIml3bC0zOTQ1LWRlYnVnZnMuaCIKLQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCi17Ci0JaW50IHAgPSAwOwotCi0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykpOwotCWlmIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKQotCQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsCi0JCQkgICAgICAgIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkgICAgICAgKGxlMzJfdG9fY3B1KHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZmxhZykgJgotCQkJVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLKQotCQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJICAgICAgIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLKQotCQkJPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQlyZXR1cm4gcDsKLX0KLQotc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5KSAqIDQwICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5KSAqIDQwICsgNDAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSAqb2ZkbSwgKmFjY3VtX29mZG0sICpkZWx0YV9vZmRtLAotCQkJCQkqbWF4X29mZG07Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCi0JICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKLQkgKi8KLQlvZmRtID0gJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3Mucngub2ZkbTsKLQljY2sgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5yeC5jY2s7Ci0JZ2VuZXJhbCA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JYWNjdW1fb2ZkbSA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JYWNjdW1fY2NrID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MucnguY2NrOwotCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWRlbHRhX29mZG0gPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtOwotCWRlbHRhX2NjayA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQltYXhfb2ZkbSA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEucngub2ZkbTsKLQltYXhfY2NrID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5yeC5jY2s7Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLnJ4LmdlbmVyYWw7Ci0KLQlwb3MgKz0gaXdsMzk0NV9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX1J4IC0gT0ZETToiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiaW5hX2NudDoiLCBsZTMyX3RvX2NwdShvZmRtLT5pbmFfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5pbmFfY250LAotCQkJIGRlbHRhX29mZG0tPmluYV9jbnQsIG1heF9vZmRtLT5pbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5maW5hX2NudCksIGFjY3VtX29mZG0tPmZpbmFfY250LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAotCQkJIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAgImNyYzMyX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmNyYzMyX2VyciksIGFjY3VtX29mZG0tPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9vZmRtLT5jcmMzMl9lcnIsIG1heF9vZmRtLT5jcmMzMl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImNyYzMyX2dvb2Q6IiwgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZ29vZCksCi0JCQkgYWNjdW1fb2ZkbS0+Y3JjMzJfZ29vZCwgZGVsdGFfb2ZkbS0+Y3JjMzJfZ29vZCwKLQkJCSBtYXhfb2ZkbS0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmYWxzZV9hbGFybV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAotCQkJIGFjY3VtX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfc3luY19lcnJfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpLAotCQkJIGFjY3VtX29mZG0tPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfc3luY19lcnJfY250LAotCQkJIG1heF9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNmZF90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX29mZG0tPnNmZF90aW1lb3V0LAotCQkJIGRlbHRhX29mZG0tPnNmZF90aW1lb3V0LAotCQkJIG1heF9vZmRtLT5zZmRfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fb2ZkbS0+ZmluYV90aW1lb3V0LAotCQkJIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAidW5yZXNwb25kZWRfcnRzOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfYWNrX2NudCwKLQkJCSBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2VudF9jdHNfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+c2VudF9jdHNfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5zZW50X2N0c19jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+c2VudF9jdHNfY250LCBtYXhfb2ZkbS0+c2VudF9jdHNfY250KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgotCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKLQkJCSAiU3RhdGlzdGljc19SeCAtIENDSzoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiaW5hX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+aW5hX2NudCksIGFjY3VtX2Njay0+aW5hX2NudCwKLQkJCSBkZWx0YV9jY2stPmluYV9jbnQsIG1heF9jY2stPmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9jbnQpLCBhY2N1bV9jY2stPmZpbmFfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9jbnQsIG1heF9jY2stPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKSwgYWNjdW1fY2NrLT5wbGNwX2VyciwKLQkJCSBkZWx0YV9jY2stPnBsY3BfZXJyLCBtYXhfY2NrLT5wbGNwX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImNyYzMyX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZXJyKSwgYWNjdW1fY2NrLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfY2NrLT5jcmMzMl9lcnIsIG1heF9jY2stPmNyYzMyX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgIm92ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fY2NrLT5vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9jY2stPm92ZXJydW5fZXJyLCBtYXhfY2NrLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5lYXJseV9vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fY2NrLT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9jY2stPmVhcmx5X292ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiY3JjMzJfZ29vZDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+Y3JjMzJfZ29vZCksIGFjY3VtX2Njay0+Y3JjMzJfZ29vZCwKLQkJCSBkZWx0YV9jY2stPmNyYzMyX2dvb2QsCi0JCQkgbWF4X2Njay0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZhbHNlX2FsYXJtX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9zeW5jX2Vycl9jbnQsCi0JCQkgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCi0JCQkgZGVsdGFfY2NrLT5zZmRfdGltZW91dCwgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsCi0JCQkgZGVsdGFfY2NrLT5maW5hX3RpbWVvdXQsIG1heF9jY2stPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9jY2stPnVucmVzcG9uZGVkX3J0cywKLQkJCSBkZWx0YV9jY2stPnVucmVzcG9uZGVkX3J0cywKLQkJCSBtYXhfY2NrLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCi0JCQkgYWNjdW1fY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBkZWx0YV9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2VudF9hY2tfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5zZW50X2Fja19jbnQpLAotCQkJIGFjY3VtX2Njay0+c2VudF9hY2tfY250LAotCQkJIGRlbHRhX2Njay0+c2VudF9hY2tfY250LAotCQkJIG1heF9jY2stPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9jdHNfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2N0c19jbnQpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX1J4IC0gR0VORVJBTDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYm9ndXNfY3RzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfY3RzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ib2d1c19jdHMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfY3RzLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfY3RzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYm9ndXNfYWNrOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfYWNrKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ib2d1c19hY2ssCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAibm9uX2Jzc2lkX2ZyYW1lczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKLQkJCSBtYXhfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbHRlcmVkX2ZyYW1lczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAotCQkJIGRlbHRhX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKLQkJCSBtYXhfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAibm9uX2NoYW5uZWxfYmVhY29uczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKLQkJCSBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgaXdsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gKHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc190eCkgKiA0OCkgKyAyNTA7Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHgsICpkZWx0YV90eCwgKm1heF90eDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCi0JICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKLQkgKi8KLQl0eCA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLnR4OwotCWFjY3VtX3R4ID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MudHg7Ci0JZGVsdGFfdHggPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy50eDsKLQltYXhfdHggPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLnR4OwotCXBvcyArPSBpd2wzOTQ1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlLTMycyAgICAgY3VycmVudCIKLQkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCi0JCQkgIlN0YXRpc3RpY3NfVHg6Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInByZWFtYmxlOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksCi0JCQkgYWNjdW1fdHgtPnByZWFtYmxlX2NudCwKLQkJCSBkZWx0YV90eC0+cHJlYW1ibGVfY250LCBtYXhfdHgtPnByZWFtYmxlX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInJ4X2RldGVjdGVkX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5yeF9kZXRlY3RlZF9jbnQpLAotCQkJIGFjY3VtX3R4LT5yeF9kZXRlY3RlZF9jbnQsCi0JCQkgZGVsdGFfdHgtPnJ4X2RldGVjdGVkX2NudCwgbWF4X3R4LT5yeF9kZXRlY3RlZF9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJidF9wcmlvX2RlZmVyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5idF9wcmlvX2RlZmVyX2NudCksCi0JCQkgYWNjdW1fdHgtPmJ0X3ByaW9fZGVmZXJfY250LAotCQkJIGRlbHRhX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKLQkJCSBtYXhfdHgtPmJ0X3ByaW9fZGVmZXJfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnRfcHJpb19raWxsX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5idF9wcmlvX2tpbGxfY250KSwKLQkJCSBhY2N1bV90eC0+YnRfcHJpb19raWxsX2NudCwKLQkJCSBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKLQkJCSBtYXhfdHgtPmJ0X3ByaW9fa2lsbF9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmZXdfYnl0ZXNfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmZld19ieXRlc19jbnQpLAotCQkJIGFjY3VtX3R4LT5mZXdfYnl0ZXNfY250LAotCQkJIGRlbHRhX3R4LT5mZXdfYnl0ZXNfY250LCBtYXhfdHgtPmZld19ieXRlc19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJjdHNfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dCksIGFjY3VtX3R4LT5jdHNfdGltZW91dCwKLQkJCSBkZWx0YV90eC0+Y3RzX3RpbWVvdXQsIG1heF90eC0+Y3RzX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJhY2tfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY2tfdGltZW91dCksCi0JCQkgYWNjdW1fdHgtPmFja190aW1lb3V0LAotCQkJIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImV4cGVjdGVkX2Fja19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+ZXhwZWN0ZWRfYWNrX2NudCksCi0JCQkgYWNjdW1fdHgtPmV4cGVjdGVkX2Fja19jbnQsCi0JCQkgZGVsdGFfdHgtPmV4cGVjdGVkX2Fja19jbnQsCi0JCQkgbWF4X3R4LT5leHBlY3RlZF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYWN0dWFsX2Fja19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWN0dWFsX2Fja19jbnQpLAotCQkJIGFjY3VtX3R4LT5hY3R1YWxfYWNrX2NudCwKLQkJCSBkZWx0YV90eC0+YWN0dWFsX2Fja19jbnQsCi0JCQkgbWF4X3R4LT5hY3R1YWxfYWNrX2NudCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgaXdsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19nZW5lcmFsKSAqIDEwICsgMzAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgKmdlbmVyYWwsICphY2N1bV9nZW5lcmFsOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgKmRiZywgKmFjY3VtX2RiZywgKmRlbHRhX2RiZywgKm1heF9kYmc7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyoKLQkgKiBUaGUgc3RhdGlzdGljIGluZm9ybWF0aW9uIGRpc3BsYXkgaGVyZSBpcyBiYXNlZCBvbgotCSAqIHRoZSBsYXN0IHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKLQkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAqLwotCWdlbmVyYWwgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsOwotCWRiZyA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCWRpdiA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCWFjY3VtX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsOwotCWRlbHRhX2dlbmVyYWwgPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5nZW5lcmFsOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsOwotCWFjY3VtX2RiZyA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCWRlbHRhX2RiZyA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuZGJnOwotCW1heF9kYmcgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLmdlbmVyYWwuZGJnOwotCWFjY3VtX2RpdiA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCWRlbHRhX2RpdiA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuZGl2OwotCW1heF9kaXYgPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLmdlbmVyYWwuZGl2OwotCXBvcyArPSBpd2wzOTQ1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlLTMycyAgICAgY3VycmVudCIKLQkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCi0JCQkgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnVyc3RfY2hlY2s6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NoZWNrKSwKLQkJCSBhY2N1bV9kYmctPmJ1cnN0X2NoZWNrLAotCQkJIGRlbHRhX2RiZy0+YnVyc3RfY2hlY2ssIG1heF9kYmctPmJ1cnN0X2NoZWNrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnVyc3RfY291bnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NvdW50KSwKLQkJCSBhY2N1bV9kYmctPmJ1cnN0X2NvdW50LAotCQkJIGRlbHRhX2RiZy0+YnVyc3RfY291bnQsIG1heF9kYmctPmJ1cnN0X2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2xlZXBfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsZWVwX3RpbWUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsZWVwX3RpbWUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xlZXBfdGltZSwgbWF4X2dlbmVyYWwtPnNsZWVwX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzbG90c19vdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbG90c19vdXQpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX291dCwKLQkJCSBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzbG90c19pZGxlOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfaWRsZSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfaWRsZSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5zbG90c19pZGxlLCBtYXhfZ2VuZXJhbC0+c2xvdHNfaWRsZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAidHRsX3RpbWVzdGFtcDpcdFx0XHQldVxuIiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInR4X29uX2E6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9hLCBtYXhfZGl2LT50eF9vbl9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAidHhfb25fYjoiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+dHhfb25fYiksIGFjY3VtX2Rpdi0+dHhfb25fYiwKLQkJCSBkZWx0YV9kaXYtPnR4X29uX2IsIG1heF9kaXYtPnR4X29uX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJleGVjX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPmV4ZWNfdGltZSksIGFjY3VtX2Rpdi0+ZXhlY190aW1lLAotCQkJIGRlbHRhX2Rpdi0+ZXhlY190aW1lLCBtYXhfZGl2LT5leGVjX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJwcm9iZV90aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAotCQkJIGRlbHRhX2Rpdi0+cHJvYmVfdGltZSwgbWF4X2Rpdi0+cHJvYmVfdGltZSk7Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZGVidWdmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZGVidWdmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmVmNGIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSBsb2ZmX3QgKnBwb3MpOwotI2Vsc2UKLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1maC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZjOTkxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWZoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9faXdsXzM5NDVfZmhfaF9fCi0jZGVmaW5lIF9faXdsXzM5NDVfZmhfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBpd2wzOTQ1IEZsb3cgSGFuZGxlciBEZWZpbml0aW9ucyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBUaGlzIEkvTyBhcmVhIGlzIGRpcmVjdGx5IHJlYWQvd3JpdGFibGUgYnkgZHJpdmVyIChlLmcuIExpbnV4IHVzZXMgd3JpdGVsKCkpCi0gKiBBZGRyZXNzZXMgYXJlIG9mZnNldHMgZnJvbSBkZXZpY2UncyBQQ0kgaGFyZHdhcmUgYmFzZSBhZGRyZXNzLgotICovCi0jZGVmaW5lIEZIMzlfTUVNX0xPV0VSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDA4MDApCi0jZGVmaW5lIEZIMzlfTUVNX1VQUEVSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDEwMDApCi0KLSNkZWZpbmUgRkgzOV9DQkNDX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE0MCkKLSNkZWZpbmUgRkgzOV9URkRCX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE4MCkKLSNkZWZpbmUgRkgzOV9SQ1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDQwMCkKLSNkZWZpbmUgRkgzOV9SU1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDRjMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDUwMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RBQkxFCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDY4MCkKLQotLyogVEZEQiAoVHJhbnNtaXQgRnJhbWUgQnVmZmVyIERlc2NyaXB0b3IpICovCi0jZGVmaW5lIEZIMzlfVEZEQihfY2gsIGJ1ZikJCQkoRkgzOV9URkRCX1RBQkxFICsgXAotCQkJCQkJICgoX2NoKSAqIDIgKyAoYnVmKSkgKiAweDI4KQotI2RlZmluZSBGSDM5X1RGREJfQ0hOTF9CVUZfQ1RSTF9SRUcoX2NoKQkoRkgzOV9URkRCX1RBQkxFICsgMHg1MCAqIChfY2gpKQotCi0vKiBDQkNDIGNoYW5uZWwgaXMgWzAsMl0gKi8KLSNkZWZpbmUgRkgzOV9DQkNDKF9jaCkJCShGSDM5X0NCQ0NfVEFCTEUgKyAoX2NoKSAqIDB4OCkKLSNkZWZpbmUgRkgzOV9DQkNDX0NUUkwoX2NoKQkoRkgzOV9DQkNDKF9jaCkgKyAweDAwKQotI2RlZmluZSBGSDM5X0NCQ0NfQkFTRShfY2gpCShGSDM5X0NCQ0MoX2NoKSArIDB4MDQpCi0KLS8qIFJDU1IgY2hhbm5lbCBpcyBbMCwyXSAqLwotI2RlZmluZSBGSDM5X1JDU1IoX2NoKQkJCShGSDM5X1JDU1JfVEFCTEUgKyAoX2NoKSAqIDB4NDApCi0jZGVmaW5lIEZIMzlfUkNTUl9DT05GSUcoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgwMCkKLSNkZWZpbmUgRkgzOV9SQ1NSX1JCRF9CQVNFKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MDQpCi0jZGVmaW5lIEZIMzlfUkNTUl9XUFRSKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MjApCi0jZGVmaW5lIEZIMzlfUkNTUl9SUFRSX0FERFIoX2NoKQkoRkgzOV9SQ1NSKF9jaCkgKyAweDI0KQotCi0jZGVmaW5lIEZIMzlfUlNDU1JfQ0hOTDBfV1BUUgkJKEZIMzlfUkNTUl9XUFRSKDApKQotCi0vKiBSU1NSICovCi0jZGVmaW5lIEZIMzlfUlNTUl9DVFJMCQkJKEZIMzlfUlNTUl9UQUJMRSArIDB4MDAwKQotI2RlZmluZSBGSDM5X1JTU1JfU1RBVFVTCQkoRkgzOV9SU1NSX1RBQkxFICsgMHgwMDQpCi0KLS8qIFRDU1IgKi8KLSNkZWZpbmUgRkgzOV9UQ1NSKF9jaCkJCQkoRkgzOV9UQ1NSX1RBQkxFICsgKF9jaCkgKiAweDIwKQotI2RlZmluZSBGSDM5X1RDU1JfQ09ORklHKF9jaCkJCShGSDM5X1RDU1IoX2NoKSArIDB4MDApCi0jZGVmaW5lIEZIMzlfVENTUl9DUkVESVQoX2NoKQkJKEZIMzlfVENTUihfY2gpICsgMHgwNCkKLSNkZWZpbmUgRkgzOV9UQ1NSX0JVRkZfU1RUUyhfY2gpCShGSDM5X1RDU1IoX2NoKSArIDB4MDgpCi0KLS8qIFRTU1IgKi8KLSNkZWZpbmUgRkgzOV9UU1NSX0NCQl9CQVNFICAgICAgICAoRkgzOV9UU1NSX1RBQkxFICsgMHgwMDApCi0jZGVmaW5lIEZIMzlfVFNTUl9NU0dfQ09ORklHICAgICAgKEZIMzlfVFNTUl9UQUJMRSArIDB4MDA4KQotI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTICAgICAgIChGSDM5X1RTU1JfVEFCTEUgKyAweDAxMCkKLQotCi0vKiBEQk0gKi8KLQotI2RlZmluZSBGSDM5X1NSVkNfQ0hOTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNikKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfUkJEQ19TSVpFICAgICAoMjApCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1BPU19JUlFfUkJUSCAgICAgICg0KQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOICAgICgweDA4MDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgICAgICAgICgweDgwMDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SRFJCRF9FTl9FTkFCTEUgICAgICAgICAgICgweDIwMDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOAkJKDB4MDEwMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0lSUV9ERVNUX0lOVF9IT1NUCQkoMHgwMDAwMTAwMCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRkgJCQkoMHgwMDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSSVZFUgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRV9WQUwJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwJKDB4MDAwMDAwMDgpCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRAkJKDB4MDAyMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UCQkoMHgwMDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UJCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCQkoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkJKDB4MDAwMDQwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfQklUX1RGREJfV1BUUgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9UWFBEX09OCSgweEZGMDAwMDAwKQotI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX1RYUERfT04JKDB4MDBGRjAwMDApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIJKDB4MDAwMDA0MDApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9URkRfT04JCSgweDAwMDAwMTAwKQotI2RlZmluZSBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTgkJKDB4MDAwMDAwODApCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USAkoMHgwMDAwMDAyMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9SU1BfV0FJVF9USAkJKDB4MDAwMDAwMDUpCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKQkoQklUKF9jaCkgPDwgMjQpCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9OT19QRU5EX1JFUShfY2gpCShCSVQoX2NoKSA8PCAxNikKLQotI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaCkgXAotCShGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfQlVGU19FTVBUWShfY2gpIHwgXAotCSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKSkKLQotI2RlZmluZSBGSDM5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRQkJCSgweDAxMDAwMDAwKQotCi1zdHJ1Y3QgaXdsMzk0NV90ZmRfdGIgewotCV9fbGUzMiBhZGRyOwotCV9fbGUzMiBsZW47Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV90ZmQgewotCV9fbGUzMiBjb250cm9sX2ZsYWdzOwotCXN0cnVjdCBpd2wzOTQ1X3RmZF90YiB0YnNbNF07Ci0JdTggX19wYWRbMjhdOwotfSBfX3BhY2tlZDsKLQotCi0jZW5kaWYgLyogX19pd2xfMzk0NV9maF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWh3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNhNjhkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWh3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUGxlYXNlIHVzZSB0aGlzIGZpbGUgKGl3bC0zOTQ1LWh3LmgpIG9ubHkgZm9yIGhhcmR3YXJlLXJlbGF0ZWQgZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC1jb21tYW5kcy5oIGZvciB1Q29kZSBBUEkgZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC0zOTQ1LmggZm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBkZWZpbml0aW9ucy4KLSAqLwotCi0jaWZuZGVmIF9faXdsXzM5NDVfaHdfXwotI2RlZmluZSBfX2l3bF8zOTQ1X2h3X18KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLQotLyogUlNTSSB0byBkQm0gKi8KLSNkZWZpbmUgSVdMMzlfUlNTSV9PRkZTRVQJOTUKLQotLyoKLSAqIEVFUFJPTSByZWxhdGVkIGNvbnN0YW50cywgZW51bXMsIGFuZCBzdHJ1Y3R1cmVzLgotICovCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX09QX01PREVfTVJDICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDcpCi0KLS8qCi0gKiBNYXBwaW5nIG9mIGEgVHggcG93ZXIgbGV2ZWwsIGF0IGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUsCi0gKiAgIHRvIGEgcmFkaW8vRFNQIGdhaW4gdGFibGUgaW5kZXguCi0gKiBPbmUgZm9yIGVhY2ggb2YgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMgaW4gZWFjaCBiYW5kLgotICogdl9kZXQgaXMgbWVhc3VyZWQgYXQgdGhlIGZhY3RvcnksIHVzaW5nIHRoZSAzOTQ1J3MgYnVpbHQtaW4gcG93ZXIgYW1wbGlmaWVyCi0gKiAgIChQQSkgb3V0cHV0IHZvbHRhZ2UgZGV0ZWN0b3IuICBUaGlzIHNhbWUgZGV0ZWN0b3IgaXMgdXNlZCBkdXJpbmcgVHggb2YKLSAqICAgbG9uZyBwYWNrZXRzIGluIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJvdmlkZSBmZWVkYmFjayBhcyB0byBwcm9wZXIgb3V0cHV0Ci0gKiAgIGxldmVsLgotICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCi0gKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfc2FtcGxlIHsKLQl1OCBnYWluX2luZGV4OwkJLyogaW5kZXggaW50byBwb3dlciAoZ2Fpbikgc2V0dXAgdGFibGUgLi4uICovCi0JczggcG93ZXI7CQkvKiAuLi4gZm9yIHRoaXMgcHdyIGxldmVsIGZvciB0aGlzIGNobmwgZ3JvdXAgKi8KLQl1MTYgdl9kZXQ7CQkvKiBQQSBvdXRwdXQgdm9sdGFnZSAqLwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIE1hcHBpbmdzIG9mIFR4IHBvd2VyIGxldmVscyAtPiBub21pbmFsIHJhZGlvL0RTUCBnYWluIHRhYmxlIGluZGV4ZXMuCi0gKiBPbmUgZm9yIGVhY2ggY2hhbm5lbCBncm91cCAoYS5rLmEuICJiYW5kIikgKDEgZm9yIEJHLCA0IGZvciBBKS4KLSAqIFR4IHBvd2VyIHNldHVwIGNvZGUgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIDUgInNhbXBsZSIgcG93ZXIgbGV2ZWxzCi0gKiAgICB0byBkZXRlcm1pbmUgdGhlIG5vbWluYWwgc2V0dXAgZm9yIGEgcmVxdWVzdGVkIHBvd2VyIGxldmVsLgotICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCi0gKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgewotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSBzYW1wbGVzWzVdOyAgLyogNSBwb3dlciBsZXZlbHMgKi8KLQlzMzIgYSwgYiwgYywgZCwgZTsJLyogY29lZmZpY2llbnRzIGZvciB2b2x0YWdlLT5wb3dlcgotCQkJCSAqIGZvcm11bGEgKHNpZ25lZCkgKi8KLQlzMzIgRmEsIEZiLCBGYywgRmQsIEZlOwkvKiB0aGVzZSBtb2RpZnkgY29lZmZzIGJhc2VkIG9uCi0JCQkJICogZnJlcXVlbmN5IChzaWduZWQpICovCi0Jczggc2F0dXJhdGlvbl9wb3dlcjsJLyogaGlnaGVzdCBwb3dlciBwb3NzaWJsZSBieSBoL3cgaW4gdGhpcwotCQkJCSAqIGJhbmQgKi8KLQl1OCBncm91cF9jaGFubmVsOwkvKiAicmVwcmVzZW50YXRpdmUiIGNoYW5uZWwgIyBpbiB0aGlzIGJhbmQgKi8KLQlzMTYgdGVtcGVyYXR1cmU7CS8qIGgvdyB0ZW1wZXJhdHVyZSBhdCBmYWN0b3J5IGNhbGliIHRoaXMgYmFuZAotCQkJCSAqIChzaWduZWQpICovCi19IF9fcGFja2VkOwotCi0vKgotICogVGVtcGVyYXR1cmUtYmFzZWQgVHgtcG93ZXIgY29tcGVuc2F0aW9uIGRhdGEsIG5vdCBiYW5kLXNwZWNpZmljLgotICogVGhlc2UgY29lZmZpY2llbnRzIGFyZSB1c2UgdG8gbW9kaWZ5IGEvYi9jL2QvZSBjb2VmZnMgYmFzZWQgb24KLSAqICAgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGVtcGVyYXR1cmUgYW5kIGZhY3RvcnkgY2FsaWIgdGVtcGVyYXR1cmUuCi0gKiBEYXRhIGNvcGllZCBmcm9tIEVFUFJPTS4KLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tX3RlbXBlcmF0dXJlX2NvcnIgewotCXUzMiBUYTsKLQl1MzIgVGI7Ci0JdTMyIFRjOwotCXUzMiBUZDsKLQl1MzIgVGU7Ci19IF9fcGFja2VkOwotCi0vKgotICogRUVQUk9NIG1hcAotICovCi1zdHJ1Y3QgaXdsMzk0NV9lZXByb20gewotCXU4IHJlc2VydmVkMFsxNl07Ci0JdTE2IGRldmljZV9pZDsJLyogYWJzLm9mczogMTYgKi8KLQl1OCByZXNlcnZlZDFbMl07Ci0JdTE2IHBtYzsJCS8qIGFicy5vZnM6IDIwICovCi0JdTggcmVzZXJ2ZWQyWzIwXTsKLQl1OCBtYWNfYWRkcmVzc1s2XTsJLyogYWJzLm9mczogNDIgKi8KLQl1OCByZXNlcnZlZDNbNThdOwotCXUxNiBib2FyZF9yZXZpc2lvbjsJLyogYWJzLm9mczogMTA2ICovCi0JdTggcmVzZXJ2ZWQ0WzExXTsKLQl1OCBib2FyZF9wYmFfbnVtYmVyWzldOwkvKiBhYnMub2ZzOiAxMTkgKi8KLQl1OCByZXNlcnZlZDVbOF07Ci0JdTE2IHZlcnNpb247CQkvKiBhYnMub2ZzOiAxMzYgKi8KLQl1OCBza3VfY2FwOwkJLyogYWJzLm9mczogMTM4ICovCi0JdTggbGVkc19tb2RlOwkJLyogYWJzLm9mczogMTM5ICovCi0JdTE2IG9lbV9tb2RlOwotCXUxNiB3b3dsYW5fbW9kZTsJLyogYWJzLm9mczogMTQyICovCi0JdTE2IGxlZHNfdGltZV9pbnRlcnZhbDsJLyogYWJzLm9mczogMTQ0ICovCi0JdTggbGVkc19vZmZfdGltZTsJLyogYWJzLm9mczogMTQ2ICovCi0JdTggbGVkc19vbl90aW1lOwkvKiBhYnMub2ZzOiAxNDcgKi8KLQl1OCBhbG1nb3JfbV92ZXJzaW9uOwkvKiBhYnMub2ZzOiAxNDggKi8KLQl1OCBhbnRlbm5hX3N3aXRjaF90eXBlOwkvKiBhYnMub2ZzOiAxNDkgKi8KLQl1OCByZXNlcnZlZDZbNDJdOwotCXU4IHNrdV9pZFs0XTsJCS8qIGFicy5vZnM6IDE5MiAqLwotCi0vKgotICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgotICoKLSAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IDM5NDUgaGFzIGEgZml4ZWQgbG9jYXRpb24KLSAqIGluIEVFUFJPTSBjb250YWluaW5nIEVFUFJPTV9DSEFOTkVMXyogdXNhZ2UgZmxhZ3MgKExTQikgYW5kIG1heCByZWd1bGF0b3J5Ci0gKiB0eHBvd2VyIChNU0IpLgotICoKLSAqIEVudHJpZXMgaW1tZWRpYXRlbHkgYmVsb3cgYXJlIGZvciAyMCBNSHogY2hhbm5lbCB3aWR0aC4KLSAqCi0gKiAyLjQgR0h6IGNoYW5uZWxzIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAotICovCi0JdTE2IGJhbmRfMV9jb3VudDsJLyogYWJzLm9mczogMTk2ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzFfY2hhbm5lbHNbMTRdOyAgLyogYWJzLm9mczogMTk4ICovCi0KLS8qCi0gKiA0LjkgR0h6IGNoYW5uZWxzIDE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LAotICogNS4wIEdIeiBjaGFubmVscyA3LCA4LCAxMSwgMTIsIDE2Ci0gKiAoNDkxNS01MDgwTUh6KSAobm9uZSBvZiB0aGVzZSBpcyBldmVyIHN1cHBvcnRlZCkKLSAqLwotCXUxNiBiYW5kXzJfY291bnQ7CS8qIGFicy5vZnM6IDIyNiAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgYmFuZF8yX2NoYW5uZWxzWzEzXTsgIC8qIGFicy5vZnM6IDIyOCAqLwotCi0vKgotICogNS4yIEdIeiBjaGFubmVscyAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Ci0gKiAoNTE3MC01MzIwTUh6KQotICovCi0JdTE2IGJhbmRfM19jb3VudDsJLyogYWJzLm9mczogMjU0ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzNfY2hhbm5lbHNbMTJdOyAgLyogYWJzLm9mczogMjU2ICovCi0KLS8qCi0gKiA1LjUgR0h6IGNoYW5uZWxzIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi0gKiAoNTUwMC01NzAwTUh6KQotICovCi0JdTE2IGJhbmRfNF9jb3VudDsJLyogYWJzLm9mczogMjgwICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzRfY2hhbm5lbHNbMTFdOyAgLyogYWJzLm9mczogMjgyICovCi0KLS8qCi0gKiA1LjcgR0h6IGNoYW5uZWxzIDE0NSwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSAqICg1NzI1LTU4MjVNSHopCi0gKi8KLQl1MTYgYmFuZF81X2NvdW50OwkvKiBhYnMub2ZzOiAzMDQgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIGJhbmRfNV9jaGFubmVsc1s2XTsgIC8qIGFicy5vZnM6IDMwNiAqLwotCi0JdTggcmVzZXJ2ZWQ5WzE5NF07Ci0KLS8qCi0gKiAzOTQ1IFR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YS4KLSAqLwotI2RlZmluZSBJV0xfTlVNX1RYX0NBTElCX0dST1VQUyA1Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgZ3JvdXBzW0lXTF9OVU1fVFhfQ0FMSUJfR1JPVVBTXTsKLS8qIGFicy5vZnM6IDUxMiAqLwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIGNvcnJlY3Rpb25zOyAgLyogYWJzLm9mczogODMyICovCi0JdTggcmVzZXJ2ZWQxNlsxNzJdOwkvKiBmaWxsIG91dCB0byBmdWxsIDEwMjQgYnl0ZSBibG9jayAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBJV0wzOTQ1X0VFUFJPTV9JTUdfU0laRSAxMDI0Ci0KLS8qIEVuZCBvZiBFRVBST00gKi8KLQotI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVICAgICAgICAgICAgICAgICgweDQwKQkvKiBiaXQgNiAgICAqLwotI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfUlRQICAgICAgICAgICAgICAgICAgICAgICgweDgwKQkvKiBiaXQgNyAgICAqLwotCi0vKiA0IERBVEEgKyAxIENNRC4gVGhlcmUgYXJlIDIgSENDQSBxdWV1ZXMgdGhhdCBhcmUgbm90IHVzZWQuICovCi0jZGVmaW5lIElXTDM5X05VTV9RVUVVRVMgICAgICAgIDUKLSNkZWZpbmUgSVdMMzlfQ01EX1FVRVVFX05VTQk0Ci0KLSNkZWZpbmUgSVdMX0RFRkFVTFRfVFhfUkVUUlkgIDE1Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUkZEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE5VTV9URkRfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgNAotCi0jZGVmaW5lIFJYX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFJYX1FVRVVFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMjU1Ci0jZGVmaW5lIFJYX1FVRVVFX1NJWkVfTE9HICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIFUzMl9QQUQobikJCSgoNC0obikpJjB4MykKLQotI2RlZmluZSBURkRfQ1RMX0NPVU5UX1NFVChuKSAgICAgICAobiA8PCAyNCkKLSNkZWZpbmUgVEZEX0NUTF9DT1VOVF9HRVQoY3RsKSAgICAgKChjdGwgPj4gMjQpICYgNykKLSNkZWZpbmUgVEZEX0NUTF9QQURfU0VUKG4pICAgICAgICAgKG4gPDwgMjgpCi0jZGVmaW5lIFRGRF9DVExfUEFEX0dFVChjdGwpICAgICAgIChjdGwgPj4gMjgpCi0KLS8qIFNpemVzIGFuZCBhZGRyZXNzZXMgZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhIG1lbW9yeSAoU1JBTSkgaW4KLSAqIDM5NDUncyBlbWJlZGRlZCBwcm9jZXNzb3IuICBEcml2ZXIgYWNjZXNzIGlzIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVncy4gKi8KLSNkZWZpbmUgSVdMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKLSNkZWZpbmUgSVdMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQJCSgweDAxNDAwMCkKLQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9MT1dFUl9CT1VORAkJKDB4ODAwMDAwKQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9VUFBFUl9CT1VORAkJKDB4ODA4MDAwKQotCi0jZGVmaW5lIElXTDM5X1JUQ19JTlNUX1NJWkUgKElXTDM5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAotCQkJCUlXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQotI2RlZmluZSBJV0wzOV9SVENfREFUQV9TSVpFIChJV0wzOV9SVENfREFUQV9VUFBFUl9CT1VORCAtIFwKLQkJCQlJV0wzOV9SVENfREFUQV9MT1dFUl9CT1VORCkKLQotI2RlZmluZSBJV0wzOV9NQVhfSU5TVF9TSVpFIElXTDM5X1JUQ19JTlNUX1NJWkUKLSNkZWZpbmUgSVdMMzlfTUFYX0RBVEFfU0laRSBJV0wzOV9SVENfREFUQV9TSVpFCi0KLS8qIFNpemUgb2YgdUNvZGUgaW5zdHJ1Y3Rpb24gbWVtb3J5IGluIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lICovCi0jZGVmaW5lIElXTDM5X01BWF9CU01fU0laRSBJV0wzOV9SVENfSU5TVF9TSVpFCi0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcikKLXsKLQlyZXR1cm4gKGFkZHIgPj0gSVdMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpICYmCi0JICAgICAgIChhZGRyIDwgSVdMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQpOwotfQotCi0vKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaXdsMzk0NV9zaGFyZWQgaXMgcHJvdmlkZWQgdG8gRkhfVFNTUl9DQkJfQkFTRQotICogYW5kICZpd2wzOTQ1X3NoYXJlZC5yeF9yZWFkX3B0clswXSBpcyBwcm92aWRlZCB0byBGSF9SQ1NSX1JQVFJfQUREUigwKSAqLwotc3RydWN0IGl3bDM5NDVfc2hhcmVkIHsKLQlfX2xlMzIgdHhfYmFzZV9wdHJbOF07Ci19IF9fcGFja2VkOwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDM5NDVfaHdfZ2V0X3JhdGUoX19sZTE2IHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gbGUxNl90b19jcHUocmF0ZV9uX2ZsYWdzKSAmIDB4RkY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGl3bDM5NDVfaHdfZ2V0X3JhdGVfbl9mbGFncyhfX2xlMTYgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiBsZTE2X3RvX2NwdShyYXRlX25fZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fbGUxNiBpd2wzOTQ1X2h3X3NldF9yYXRlX25fZmxhZ3ModTggcmF0ZSwgdTE2IGZsYWdzKQotewotCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXJhdGV8ZmxhZ3MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdmMGYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtMzk0NS1sZWQuaCIKLQotCi0vKiBTZW5kIGxlZCBjb21tYW5kICovCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF9sZWRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX2xlZF9jbWQgKmxlZF9jbWQpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX0xFRFNfQ01ELAotCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfbGVkX2NtZCksCi0JCS5kYXRhID0gbGVkX2NtZCwKLQkJLmZsYWdzID0gQ01EX0FTWU5DLAotCQkuY2FsbGJhY2sgPSBOVUxMLAotCX07Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLX0KLQotY29uc3Qgc3RydWN0IGl3bF9sZWRfb3BzIGl3bDM5NDVfbGVkX29wcyA9IHsKLQkuY21kID0gaXdsMzk0NV9zZW5kX2xlZF9jbWQsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtbGVkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3MTYyNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsXzM5NDVfbGVkX2hfXwotI2RlZmluZSBfX2l3bF8zOTQ1X2xlZF9oX18KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2wzOTQ1X2xlZF9vcHM7Ci0KLSNlbmRpZiAvKiBfX2l3bF8zOTQ1X2xlZF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFlYWYyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtMzk0NS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotI2RlZmluZSBSU19OQU1FICJpd2wtMzk0NS1ycyIKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nW0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTcsIDEzLCAzNSwgNTgsIDAsIDAsIDc2LCAxMDQsIDEzMCwgMTY4LCAxOTEsIDIwMgotfTsKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3RbSVdMX1JBVEVfQ09VTlRfMzk0NV0gPSB7Ci0JNywgMTMsIDM1LCA1OCwgMCwgMCwgMCwgODAsIDkzLCAxMTMsIDEyMywgMTI1Ci19OwotCi1zdGF0aWMgczMyIGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2FbSVdMX1JBVEVfQ09VTlRfMzk0NV0gPSB7Ci0JMCwgMCwgMCwgMCwgNDAsIDU3LCA3MiwgOTgsIDEyMSwgMTU0LCAxNzcsIDE4NgotfTsKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9iW0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTcsIDEzLCAzNSwgNTgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLXN0cnVjdCBpd2wzOTQ1X3RwdF9lbnRyeSB7Ci0JczggbWluX3Jzc2k7Ci0JdTggaW5kZXg7Ci19OwotCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfdHB0X2VudHJ5IGl3bDM5NDVfdHB0X3RhYmxlX2FbXSA9IHsKLQl7LTYwLCBJV0xfUkFURV81NE1fSU5ERVh9LAotCXstNjQsIElXTF9SQVRFXzQ4TV9JTkRFWH0sCi0Jey03MiwgSVdMX1JBVEVfMzZNX0lOREVYfSwKLQl7LTgwLCBJV0xfUkFURV8yNE1fSU5ERVh9LAotCXstODQsIElXTF9SQVRFXzE4TV9JTkRFWH0sCi0Jey04NSwgSVdMX1JBVEVfMTJNX0lOREVYfSwKLQl7LTg3LCBJV0xfUkFURV85TV9JTkRFWH0sCi0Jey04OSwgSVdMX1JBVEVfNk1fSU5ERVh9Ci19OwotCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfdHB0X2VudHJ5IGl3bDM5NDVfdHB0X3RhYmxlX2dbXSA9IHsKLQl7LTYwLCBJV0xfUkFURV81NE1fSU5ERVh9LAotCXstNjQsIElXTF9SQVRFXzQ4TV9JTkRFWH0sCi0Jey02OCwgSVdMX1JBVEVfMzZNX0lOREVYfSwKLQl7LTgwLCBJV0xfUkFURV8yNE1fSU5ERVh9LAotCXstODQsIElXTF9SQVRFXzE4TV9JTkRFWH0sCi0Jey04NSwgSVdMX1JBVEVfMTJNX0lOREVYfSwKLQl7LTg2LCBJV0xfUkFURV8xMU1fSU5ERVh9LAotCXstODgsIElXTF9SQVRFXzVNX0lOREVYfSwKLQl7LTkwLCBJV0xfUkFURV8yTV9JTkRFWH0sCi0Jey05MiwgSVdMX1JBVEVfMU1fSU5ERVh9Ci19OwotCi0jZGVmaW5lIElXTF9SQVRFX01BWF9XSU5ET1cgICAgICAgICAgNjIKLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0gJCSgzKkhaKQotI2RlZmluZSBJV0xfUkFURV9XSU5fRkxVU0ggICAgICAgKEhaLzIpCi0jZGVmaW5lIElXTDM5X1JBVEVfSElHSF9USCAgICAgICAgICAxMTUyMAotI2RlZmluZSBJV0xfU1VDQ0VTU19VUF9USAkgICA4OTYwCi0jZGVmaW5lIElXTF9TVUNDRVNTX0RPV05fVEgJICAxMDg4MAotI2RlZmluZSBJV0xfUkFURV9NSU5fRkFJTFVSRV9USCAgICAgICA2Ci0jZGVmaW5lIElXTF9SQVRFX01JTl9TVUNDRVNTX1RIICAgICAgIDgKLSNkZWZpbmUgSVdMX1JBVEVfREVDUkVBU0VfVEggICAgICAgMTkyMAotI2RlZmluZSBJV0xfUkFURV9SRVRSWV9USAkgICAgIDE1Ci0KLXN0YXRpYyB1OCBpd2wzOTQ1X2dldF9yYXRlX2luZGV4X2J5X3Jzc2koczMyIHJzc2ksIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQl1MzIgaW5kZXggPSAwOwotCXUzMiB0YWJsZV9zaXplID0gMDsKLQlzdHJ1Y3QgaXdsMzk0NV90cHRfZW50cnkgKnRwdF90YWJsZSA9IE5VTEw7Ci0KLQlpZiAoKHJzc2kgPCBJV0xfTUlOX1JTU0lfVkFMKSB8fCAocnNzaSA+IElXTF9NQVhfUlNTSV9WQUwpKQotCQlyc3NpID0gSVdMX01JTl9SU1NJX1ZBTDsKLQotCXN3aXRjaCAoYmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJdHB0X3RhYmxlID0gaXdsMzk0NV90cHRfdGFibGVfZzsKLQkJdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaXdsMzk0NV90cHRfdGFibGVfZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQl0cHRfdGFibGUgPSBpd2wzOTQ1X3RwdF90YWJsZV9hOwotCQl0YWJsZV9zaXplID0gQVJSQVlfU0laRShpd2wzOTQ1X3RwdF90YWJsZV9hKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0Jd2hpbGUgKChpbmRleCA8IHRhYmxlX3NpemUpICYmIChyc3NpIDwgdHB0X3RhYmxlW2luZGV4XS5taW5fcnNzaSkpCi0JCWluZGV4Kys7Ci0KLQlpbmRleCA9IG1pbihpbmRleCwgKHRhYmxlX3NpemUgLSAxKSk7Ci0KLQlyZXR1cm4gdHB0X3RhYmxlW2luZGV4XS5pbmRleDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9jbGVhcl93aW5kb3coc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cpCi17Ci0Jd2luZG93LT5kYXRhID0gMDsKLQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlciA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX3JhdGlvID0gLTE7Ci0Jd2luZG93LT5jb3VudGVyID0gMDsKLQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0Jd2luZG93LT5zdGFtcCA9IDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbmRvd3MgLSBmbHVzaCBvdXQgdGhlIHJhdGUgc2NhbGUgd2luZG93cwotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aW5kb3dzIHRoYXQgaGF2ZSBnYXRoZXJlZCBkYXRhIGJ1dCB3ZXJlCi0gKiBub3QgZmx1c2hlZC4gIElmIHRoZXJlIHdlcmUgYW55IHRoYXQgd2VyZSBub3QgZmx1c2hlZCwgdGhlbgotICogcmVzY2hlZHVsZSB0aGUgcmF0ZSBmbHVzaGluZyByb3V0aW5lLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5kb3dzKHN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhKQotewotCWludCB1bmZsdXNoZWQgPSAwOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gcnNfc3RhLT5wcml2OwotCi0JLyoKLQkgKiBGb3IgZWFjaCByYXRlLCBpZiB3ZSBoYXZlIGNvbGxlY3RlZCBkYXRhIG9uIHRoYXQgcmF0ZQotCSAqIGFuZCBpdCBoYXMgYmVlbiBtb3JlIHRoYW4gSVdMX1JBVEVfV0lOX0ZMVVNICi0JICogc2luY2Ugd2UgZmx1c2hlZCwgY2xlYXIgb3V0IHRoZSBnYXRoZXJlZCBzdGF0aXN0aWNzCi0JICovCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGkrKykgewotCQlpZiAoIXJzX3N0YS0+d2luW2ldLmNvdW50ZXIpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHJzX3N0YS0+d2luW2ldLnN0YW1wICsKLQkJCSAgICAgICBJV0xfUkFURV9XSU5fRkxVU0gpKSB7Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiZmx1c2hpbmcgJWQgc2FtcGxlcyBvZiByYXRlICIKLQkJCQkgICAgICAgImluZGV4ICVkXG4iLAotCQkJCSAgICAgICByc19zdGEtPndpbltpXS5jb3VudGVyLCBpKTsKLQkJCWl3bDM5NDVfY2xlYXJfd2luZG93KCZyc19zdGEtPndpbltpXSk7Ci0JCX0gZWxzZQotCQkJdW5mbHVzaGVkKys7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiB1bmZsdXNoZWQ7Ci19Ci0KLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0hfTUFYICAgICAgICAgICAgICA1MDAwCS8qIG1zZWMgKi8KLSNkZWZpbmUgSVdMX1JBVEVfRkxVU0hfTUlOICAgICAgICAgICAgICA1MAkvKiBtc2VjICovCi0jZGVmaW5lIElXTF9BVkVSQUdFX1BBQ0tFVFMgICAgICAgICAgICAgMTUwMAotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3JhdGVfc2NhbGVfZmx1c2godW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhID0gKHZvaWQgKilkYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQlpbnQgdW5mbHVzaGVkID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBwYWNrZXRfY291bnQsIGR1cmF0aW9uLCBwcHM7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JdW5mbHVzaGVkID0gaXdsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbmRvd3MocnNfc3RhKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCS8qIE51bWJlciBvZiBwYWNrZXRzIFJ4J2Qgc2luY2UgbGFzdCB0aW1lIHRoaXMgdGltZXIgcmFuICovCi0JcGFja2V0X2NvdW50ID0gKHJzX3N0YS0+dHhfcGFja2V0cyAtIHJzX3N0YS0+bGFzdF90eF9wYWNrZXRzKSArIDE7Ci0KLQlyc19zdGEtPmxhc3RfdHhfcGFja2V0cyA9IHJzX3N0YS0+dHhfcGFja2V0cyArIDE7Ci0KLQlpZiAodW5mbHVzaGVkKSB7Ci0JCWR1cmF0aW9uID0KLQkJICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoKTsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAiVHgnZCAlZCBwYWNrZXRzIGluICVkbXNcbiIsCi0JCQkgICAgICAgcGFja2V0X2NvdW50LCBkdXJhdGlvbik7Ci0KLQkJLyogRGV0ZXJtaW5lIHBhY2tldHMgcGVyIHNlY29uZCAqLwotCQlpZiAoZHVyYXRpb24pCi0JCQlwcHMgPSAocGFja2V0X2NvdW50ICogMTAwMCkgLyBkdXJhdGlvbjsKLQkJZWxzZQotCQkJcHBzID0gMDsKLQotCQlpZiAocHBzKSB7Ci0JCQlkdXJhdGlvbiA9IChJV0xfQVZFUkFHRV9QQUNLRVRTICogMTAwMCkgLyBwcHM7Ci0JCQlpZiAoZHVyYXRpb24gPCBJV0xfUkFURV9GTFVTSF9NSU4pCi0JCQkJZHVyYXRpb24gPSBJV0xfUkFURV9GTFVTSF9NSU47Ci0JCQllbHNlIGlmIChkdXJhdGlvbiA+IElXTF9SQVRFX0ZMVVNIX01BWCkKLQkJCQlkdXJhdGlvbiA9IElXTF9SQVRFX0ZMVVNIX01BWDsKLQkJfSBlbHNlCi0JCQlkdXJhdGlvbiA9IElXTF9SQVRFX0ZMVVNIX01BWDsKLQotCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBtc2Vjc190b19qaWZmaWVzKGR1cmF0aW9uKTsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAibmV3IGZsdXNoIHBlcmlvZDogJWQgbXNlYyBhdmUgJWRcbiIsCi0JCQkgICAgICAgZHVyYXRpb24sIHBhY2tldF9jb3VudCk7Ci0KLQkJbW9kX3RpbWVyKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gsIGppZmZpZXMgKwotCQkJICByc19zdGEtPmZsdXNoX3RpbWUpOwotCi0JCXJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoID0gamlmZmllczsKLQl9IGVsc2UgewotCQlyc19zdGEtPmZsdXNoX3RpbWUgPSBJV0xfUkFURV9GTFVTSDsKLQkJcnNfc3RhLT5mbHVzaF9wZW5kaW5nID0gMDsKLQl9Ci0JLyogSWYgdGhlcmUgd2VyZW4ndCBhbnkgdW5mbHVzaGVkIGVudHJpZXMsIHdlIGRvbid0IHNjaGVkdWxlIHRoZSB0aW1lcgotCSAqIHRvIHJ1biBhZ2FpbiAqLwotCi0JcnNfc3RhLT5sYXN0X2ZsdXNoID0gamlmZmllczsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YSAtIFVwZGF0ZSB0aGUgc3VjY2Vzcy9mYWlsdXJlIHNsaWRpbmcgd2luZG93Ci0gKgotICogV2Uga2VlcCBhIHNsaWRpbmcgd2luZG93IG9mIHRoZSBsYXN0IDY0IHBhY2tldHMgdHJhbnNtaXR0ZWQKLSAqIGF0IHRoaXMgcmF0ZS4gIHdpbmRvdy0+ZGF0YSBjb250YWlucyB0aGUgYml0bWFzayBvZiBzdWNjZXNzZnVsCi0gKiBwYWNrZXRzLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YShzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSwKLQkJCQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdywKLQkJCQlpbnQgc3VjY2VzcywgaW50IHJldHJpZXMsIGludCBpbmRleCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXMzMiBmYWlsX2NvdW50OwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQotCWlmICghcmV0cmllcykgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IHJldHJpZXMgPT0gMCAtLSBzaG91bGQgYmUgYXQgbGVhc3QgMVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIEtlZXAgdHJhY2sgb2Ygb25seSB0aGUgbGF0ZXN0IDYyIHR4IGZyYW1lIGF0dGVtcHRzIGluIHRoaXMgcmF0ZSdzCi0JICogaGlzdG9yeSB3aW5kb3c7IGFueXRoaW5nIG9sZGVyIGlzbid0IHJlYWxseSByZWxldmFudCBhbnkgbW9yZS4KLQkgKiBJZiB3ZSBoYXZlIGZpbGxlZCB1cCB0aGUgc2xpZGluZyB3aW5kb3csIGRyb3AgdGhlIG9sZGVzdCBhdHRlbXB0OwotCSAqIGlmIHRoZSBvbGRlc3QgYXR0ZW1wdCAoaGlnaGVzdCBiaXQgaW4gYml0bWFwKSBzaG93cyAic3VjY2VzcyIsCi0JICogc3VidHJhY3QgIjEiIGZyb20gdGhlIHN1Y2Nlc3MgY291bnRlciAodGhpcyBpcyB0aGUgbWFpbiByZWFzb24KLQkgKiB3ZSBrZWVwIHRoZXNlIGJpdG1hcHMhKS4KLQkgKiAqLwotCXdoaWxlIChyZXRyaWVzID4gMCkgewotCQlpZiAod2luZG93LT5jb3VudGVyID49IElXTF9SQVRFX01BWF9XSU5ET1cpIHsKLQotCQkJLyogcmVtb3ZlIGVhcmxpZXN0ICovCi0JCQl3aW5kb3ctPmNvdW50ZXIgPSBJV0xfUkFURV9NQVhfV0lORE9XIC0gMTsKLQotCQkJaWYgKHdpbmRvdy0+ZGF0YSAmICgxVUxMIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpKSB7Ci0JCQkJd2luZG93LT5kYXRhICY9IH4oMVVMTCA8PCAoSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDEpKTsKLQkJCQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlci0tOwotCQkJfQotCQl9Ci0KLQkJLyogSW5jcmVtZW50IGZyYW1lcy1hdHRlbXB0ZWQgY291bnRlciAqLwotCQl3aW5kb3ctPmNvdW50ZXIrKzsKLQotCQkvKiBTaGlmdCBiaXRtYXAgYnkgb25lIGZyYW1lICh0aHJvdyBhd2F5IG9sZGVzdCBoaXN0b3J5KSwKLQkJICogT1IgaW4gIjEiLCBhbmQgaW5jcmVtZW50ICJzdWNjZXNzIiBpZiB0aGlzCi0JCSAqIGZyYW1lIHdhcyBzdWNjZXNzZnVsLiAqLwotCQl3aW5kb3ctPmRhdGEgPDw9IDE7Ci0JCWlmIChzdWNjZXNzID4gMCkgewotCQkJd2luZG93LT5zdWNjZXNzX2NvdW50ZXIrKzsKLQkJCXdpbmRvdy0+ZGF0YSB8PSAweDE7Ci0JCQlzdWNjZXNzLS07Ci0JCX0KLQotCQlyZXRyaWVzLS07Ci0JfQotCi0JLyogQ2FsY3VsYXRlIGN1cnJlbnQgc3VjY2VzcyByYXRpbywgYXZvaWQgZGl2aWRlLWJ5LTAhICovCi0JaWYgKHdpbmRvdy0+Y291bnRlciA+IDApCi0JCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IDEyOCAqICgxMDAgKiB3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcikKLQkJCQkJLyB3aW5kb3ctPmNvdW50ZXI7Ci0JZWxzZQotCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQotCWZhaWxfY291bnQgPSB3aW5kb3ctPmNvdW50ZXIgLSB3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcjsKLQotCS8qIENhbGN1bGF0ZSBhdmVyYWdlIHRocm91Z2hwdXQsIGlmIHdlIGhhdmUgZW5vdWdoIGhpc3RvcnkuICovCi0JaWYgKChmYWlsX2NvdW50ID49IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSB8fAotCSAgICAod2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPj0gSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKQotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2luZGV4XSArIDY0KSAvIDEyOCk7Ci0JZWxzZQotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0KLQkvKiBUYWcgdGhpcyB3aW5kb3cgYXMgaGF2aW5nIGJlZW4gdXBkYXRlZCAqLwotCXdpbmRvdy0+c3RhbXAgPSBqaWZmaWVzOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciBhZGRpbmcgYSBuZXcgc3RhdGlvbiB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZwotICovCi12b2lkIGl3bDM5NDVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggc3RhX2lkKQotewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJnByaXYtPmh3LT5jb25mOwotCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpwc3RhOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCWludCBpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImVudGVyXG4iKTsKLQlpZiAoc3RhX2lkID09IHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCkKLQkJZ290byBvdXQ7Ci0KLQlwc3RhID0gKHN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICopIHN0YS0+ZHJ2X3ByaXY7Ci0JcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKLQlzYmFuZCA9IGh3LT53aXBoeS0+YmFuZHNbY29uZi0+Y2hhbm5lbC0+YmFuZF07Ci0KLQlyc19zdGEtPnByaXYgPSBwcml2OwotCi0JcnNfc3RhLT5zdGFydF9yYXRlID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCS8qIGRlZmF1bHQgdG8ganVzdCA4MDIuMTFiICovCi0JcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9iOwotCi0JcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOwotCXJzX3N0YS0+bGFzdF9mbHVzaCA9IGppZmZpZXM7Ci0JcnNfc3RhLT5mbHVzaF90aW1lID0gSVdMX1JBVEVfRkxVU0g7Ci0JcnNfc3RhLT5sYXN0X3R4X3BhY2tldHMgPSAwOwotCi0JcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLmRhdGEgPSAodW5zaWduZWQgbG9uZylyc19zdGE7Ci0JcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLmZ1bmN0aW9uID0gaXdsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGkrKykKLQkJaXdsMzk0NV9jbGVhcl93aW5kb3coJnJzX3N0YS0+d2luW2ldKTsKLQotCS8qIFRPRE86IHdoYXQgaXMgYSBnb29kIHN0YXJ0aW5nIHJhdGUgZm9yIFNUQT8gQWJvdXQgbWlkZGxlPyBNYXliZSBub3QKLQkgKiB0aGUgbG93ZXN0IG9yIHRoZSBoaWdoZXN0IHJhdGUuLiBDb3VsZCBjb25zaWRlciB1c2luZyBSU1NJIGZyb20KLQkgKiBwcmV2aW91cyBwYWNrZXRzPyBOZWVkIHRvIGhhdmUgSUVFRSA4MDIuMVggYXV0aCBzdWNjZWVkIGltbWVkaWF0ZWx5Ci0JICogYWZ0ZXIgYXNzb2MuLiAqLwotCi0JZm9yIChpID0gc2JhbmQtPm5fYml0cmF0ZXMgLSAxOyBpID49IDA7IGktLSkgewotCQlpZiAoc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXSAmICgxIDw8IGkpKSB7Ci0JCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3NiYW5kLT5iYW5kXTsKLQkvKiBGb3IgNSBHSHogYmFuZCBpdCBzdGFydCBhdCBJV0xfRklSU1RfT0ZETV9SQVRFICovCi0JaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJcHJpdi0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPSBwcml2LT5fMzk0NS5zdGFfc3VwcF9yYXRlcyA8PAotCQkJCQkJSVdMX0ZJUlNUX09GRE1fUkFURTsKLQl9Ci0KLW91dDoKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkICppd2wzOTQ1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQotewotCXJldHVybiBody0+cHJpdjsKLX0KLQotLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX2ZyZWUodm9pZCAqcHJpdikKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkICppd2wzOTQ1X3JzX2FsbG9jX3N0YSh2b2lkICppd2xfcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSBpd2xfcHJpdjsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnJzX3N0YS0+bG9jayk7Ci0JaW5pdF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcnNfc3RhOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX2ZyZWVfc3RhKHZvaWQgKml3bF9wcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQotCS8qCi0JICogQmUgY2FyZWZ1bCBub3QgdG8gdXNlIGFueSBtZW1iZXJzIG9mIGl3bDM5NDVfcnNfc3RhIChsaWtlIHRyeWluZwotCSAqIHRvIHVzZSBpd2xfcHJpdiB0byBwcmludCBvdXQgZGVidWdnaW5nKSBzaW5jZSBpdCBtYXkgbm90IGJlIGZ1bGx5Ci0JICogaW5pdGlhbGl6ZWQgYXQgdGhpcyBwb2ludC4KLQkgKi8KLQlkZWxfdGltZXJfc3luYygmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfcnNfdHhfc3RhdHVzIC0gVXBkYXRlIHJhdGUgY29udHJvbCB2YWx1ZXMgYmFzZWQgb24gVHggcmVzdWx0cwotICoKLSAqIE5PVEU6IFVzZXMgaXdsX3ByaXYtPnJldHJ5X3JhdGUgZm9yIHRoZSAjIG9mIHJldHJpZXMgYXR0ZW1wdGVkIGJ5Ci0gKiB0aGUgaGFyZHdhcmUgZm9yIGVhY2ggcmF0ZS4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yc190eF9zdGF0dXModm9pZCAqcHJpdl9yYXRlLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXM4IHJldHJpZXMgPSAwLCBjdXJyZW50X2NvdW50OwotCWludCBzY2FsZV9yYXRlX2luZGV4LCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3JhdGU7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudDsKLQkvKiBTYW5pdHkgQ2hlY2sgZm9yIHJldHJpZXMgKi8KLQlpZiAocmV0cmllcyA+IElXTF9SQVRFX1JFVFJZX1RIKQotCQlyZXRyaWVzID0gSVdMX1JBVEVfUkVUUllfVEg7Ci0KLQlmaXJzdF9pbmRleCA9IHNiYW5kLT5iaXRyYXRlc1tpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4XS5od192YWx1ZTsKLQlpZiAoKGZpcnN0X2luZGV4IDwgMCkgfHwgKGZpcnN0X2luZGV4ID49IElXTF9SQVRFX0NPVU5UXzM5NDUpKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogUmF0ZSBvdXQgb2YgYm91bmRzOiAlZFxuIiwgZmlyc3RfaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwcml2X3N0YSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IE5vIFNUQSBwcml2IGRhdGEgdG8gdXBkYXRlIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmICghcnNfc3RhLT5wcml2KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogU1RBIHByaXYgZGF0YSB1bmluaXRpYWxpemVkIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQotCXJzX3N0YS0+dHhfcGFja2V0cysrOwotCi0Jc2NhbGVfcmF0ZV9pbmRleCA9IGZpcnN0X2luZGV4OwotCWxhc3RfaW5kZXggPSBmaXJzdF9pbmRleDsKLQotCS8qCi0JICogVXBkYXRlIHRoZSB3aW5kb3cgZm9yIGVhY2ggcmF0ZS4gIFdlIGRldGVybWluZSB3aGljaCByYXRlcwotCSAqIHdlcmUgVHgnZCBiYXNlZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdnMuIHRoZSBudW1iZXIKLQkgKiBvZiByZXRyaWVzIGNvbmZpZ3VyZWQgZm9yIGVhY2ggcmF0ZSAtLSBjdXJyZW50bHkgc2V0IHRvIHRoZQotCSAqIHByaXYgdmFsdWUgJ3JldHJ5X3JhdGUnIHZzLiByYXRlIHNwZWNpZmljCi0JICoKLQkgKiBPbiBleGl0IGZyb20gdGhpcyB3aGlsZSBsb29wIGxhc3RfaW5kZXggaW5kaWNhdGVzIHRoZSByYXRlCi0JICogYXQgd2hpY2ggdGhlIGZyYW1lIHdhcyBmaW5hbGx5IHRyYW5zbWl0dGVkIChvciBmYWlsZWQgaWYgbm8KLQkgKiBBQ0spCi0JICovCi0Jd2hpbGUgKHJldHJpZXMgPiAxKSB7Ci0JCWlmICgocmV0cmllcyAtIDEpIDwgcHJpdi0+cmV0cnlfcmF0ZSkgewotCQkJY3VycmVudF9jb3VudCA9IChyZXRyaWVzIC0gMSk7Ci0JCQlsYXN0X2luZGV4ID0gc2NhbGVfcmF0ZV9pbmRleDsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRfY291bnQgPSBwcml2LT5yZXRyeV9yYXRlOwotCQkJbGFzdF9pbmRleCA9IGl3bDM5NDVfcnNfbmV4dF9yYXRlKHByaXYsCi0JCQkJCQkJIHNjYWxlX3JhdGVfaW5kZXgpOwotCQl9Ci0KLQkJLyogVXBkYXRlIHRoaXMgcmF0ZSBhY2NvdW50aW5nIGZvciBhcyBtYW55IHJldHJpZXMKLQkJICogYXMgd2FzIHVzZWQgZm9yIGl0IChwZXIgY3VycmVudF9jb3VudCkgKi8KLQkJaXdsMzk0NV9jb2xsZWN0X3R4X2RhdGEocnNfc3RhLAotCQkJCSAgICAmcnNfc3RhLT53aW5bc2NhbGVfcmF0ZV9pbmRleF0sCi0JCQkJICAgIDAsIGN1cnJlbnRfY291bnQsIHNjYWxlX3JhdGVfaW5kZXgpOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiVXBkYXRlIHJhdGUgJWQgZm9yICVkIHJldHJpZXMuXG4iLAotCQkJICAgICAgIHNjYWxlX3JhdGVfaW5kZXgsIGN1cnJlbnRfY291bnQpOwotCi0JCXJldHJpZXMgLT0gY3VycmVudF9jb3VudDsKLQotCQlzY2FsZV9yYXRlX2luZGV4ID0gbGFzdF9pbmRleDsKLQl9Ci0KLQotCS8qIFVwZGF0ZSB0aGUgbGFzdCBpbmRleCB3aW5kb3cgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgYmFzZWQgb24gQUNLICovCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlVwZGF0ZSByYXRlICVkIHdpdGggJXMuXG4iLAotCQkgICAgICAgbGFzdF9pbmRleCwKLQkJICAgICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSykgPwotCQkgICAgICAgInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKLQlpd2wzOTQ1X2NvbGxlY3RfdHhfZGF0YShyc19zdGEsCi0JCQkgICAgJnJzX3N0YS0+d2luW2xhc3RfaW5kZXhdLAotCQkJICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLLCAxLCBsYXN0X2luZGV4KTsKLQotCS8qIFdlIHVwZGF0ZWQgdGhlIHJhdGUgc2NhbGUgd2luZG93IC0tIGlmIGl0cyBiZWVuIG1vcmUgdGhhbgotCSAqIGZsdXNoX3RpbWUgc2luY2UgdGhlIGxhc3QgcnVuLCBzY2hlZHVsZSB0aGUgZmx1c2gKLQkgKiBhZ2FpbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghcnNfc3RhLT5mbHVzaF9wZW5kaW5nICYmCi0JICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcnNfc3RhLT5sYXN0X2ZsdXNoICsKLQkJICAgICAgIHJzX3N0YS0+Zmx1c2hfdGltZSkpIHsKLQotCQlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7Ci0JCXJzX3N0YS0+Zmx1c2hfcGVuZGluZyA9IDE7Ci0JCW1vZF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLAotCQkJICBqaWZmaWVzICsgcnNfc3RhLT5mbHVzaF90aW1lKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB1MTYgaXdsMzk0NV9nZXRfYWRqYWNlbnRfcmF0ZShzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSwKLQkJCQkgdTggaW5kZXgsIHUxNiByYXRlX21hc2ssIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQl1OCBoaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl1OCBsb3cgPSBJV0xfUkFURV9JTlZBTElEOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQotCS8qIDgwMi4xMUEgd2Fsa3MgdG8gdGhlIG5leHQgbGl0ZXJhbCBhZGphY2VudCByYXRlIGluCi0JICogdGhlIHJhdGUgdGFibGUgKi8KLQlpZiAodW5saWtlbHkoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSkgewotCQlpbnQgaTsKLQkJdTMyIG1hc2s7Ci0KLQkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KLQkJaSA9IGluZGV4IC0gMTsKLQkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWxvdyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCArIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsKLQkJICAgICBpKyssIG1hc2sgPDw9IDEpIHsKLQkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7Ci0JCQkJaGlnaCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGhpZ2ggPDwgOCkgfCBsb3c7Ci0JfQotCi0JbG93ID0gaW5kZXg7Ci0Jd2hpbGUgKGxvdyAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnRnZykKLQkJCWxvdyA9IGl3bDM5NDVfcmF0ZXNbbG93XS5wcmV2X3JzX3RnZzsKLQkJZWxzZQotCQkJbG93ID0gaXdsMzk0NV9yYXRlc1tsb3ddLnByZXZfcnM7Ci0JCWlmIChsb3cgPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgbG93KSkKLQkJCWJyZWFrOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2tpcHBpbmcgbWFza2VkIGxvd2VyIHJhdGU6ICVkXG4iLCBsb3cpOwotCX0KLQotCWhpZ2ggPSBpbmRleDsKLQl3aGlsZSAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnRnZykKLQkJCWhpZ2ggPSBpd2wzOTQ1X3JhdGVzW2hpZ2hdLm5leHRfcnNfdGdnOwotCQllbHNlCi0JCQloaWdoID0gaXdsMzk0NV9yYXRlc1toaWdoXS5uZXh0X3JzOwotCQlpZiAoaGlnaCA9PSBJV0xfUkFURV9JTlZBTElEKQotCQkJYnJlYWs7Ci0JCWlmIChyYXRlX21hc2sgJiAoMSA8PCBoaWdoKSkKLQkJCWJyZWFrOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2tpcHBpbmcgbWFza2VkIGhpZ2hlciByYXRlOiAlZFxuIiwgaGlnaCk7Ci0JfQotCi0JcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OwotfQotCi0vKioKLSAqIGl3bDM5NDVfcnNfZ2V0X3JhdGUgLSBmaW5kIHRoZSByYXRlIGZvciB0aGUgcmVxdWVzdGVkIHBhY2tldAotICoKLSAqIFJldHVybnMgdGhlIGllZWU4MDIxMV9yYXRlIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KLSAqCi0gKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBoYXMgbm8gaW50ZXJuYWwgbWFwcGluZyBiZXR3ZWVuIGh3X21vZGUncwotICogcmF0ZSBvcmRlcmluZyBhbmQgdGhlIHJhdGUgb3JkZXJpbmcgdXNlZCBieSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobS4KLSAqCi0gKiBUaGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSB1c2VzIGEgc2luZ2xlIHRhYmxlIG9mIHJhdGVzIHRoYXQgZ29lcyBhY3Jvc3MKLSAqIHRoZSBlbnRpcmUgQS9CL0cgc3BlY3RydW0gdnMuIGJlaW5nIGxpbWl0ZWQgdG8ganVzdCBvbmUgcGFydGljdWxhcgotICogaHdfbW9kZS4KLSAqCi0gKiBBcyBzdWNoLCB3ZSBjYW4ndCBjb252ZXJ0IHRoZSBpbmRleCBvYnRhaW5lZCBiZWxvdyBpbnRvIHRoZSBod19tb2RlJ3MKLSAqIHJhdGUgdGFibGUgYW5kIG11c3QgcmVmZXJlbmNlIHRoZSBkcml2ZXIgYWxsb2NhdGVkIHJhdGUgdGFibGUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnNfZ2V0X3JhdGUodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEsCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gdHhyYy0+c2JhbmQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cmMtPnNrYjsKLQl1OCBsb3cgPSBJV0xfUkFURV9JTlZBTElEOwotCXU4IGhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCXUxNiBoaWdoX2xvdzsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEgPSBwcml2X3N0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7Ci0JaW50IGN1cnJlbnRfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGxvd190cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQlpbnQgaGlnaF90cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQl1MzIgZmFpbF9jb3VudDsKLQlzOCBzY2FsZV9hY3Rpb24gPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhdGVfbWFzazsKLQlzOCBtYXhfcmF0ZV9pZHggPSAtMTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmIChyc19zdGEgJiYgIXJzX3N0YS0+cHJpdikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiUmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKLQkJcHJpdl9zdGEgPSBOVUxMOwotCX0KLQotCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBwcml2X3N0YSwgdHhyYykpCi0JCXJldHVybjsKLQotCXJhdGVfbWFzayA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0KLQkvKiBnZXQgdXNlciBtYXggcmF0ZSBpZiBzZXQgKi8KLQltYXhfcmF0ZV9pZHggPSB0eHJjLT5tYXhfcmF0ZV9pZHg7Ci0JaWYgKChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSAmJiAobWF4X3JhdGVfaWR4ICE9IC0xKSkKLQkJbWF4X3JhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JaWYgKChtYXhfcmF0ZV9pZHggPCAwKSB8fCAobWF4X3JhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UKSkKLQkJbWF4X3JhdGVfaWR4ID0gLTE7Ci0KLQlpbmRleCA9IG1pbihyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCAmIDB4ZmZmZiwgSVdMX1JBVEVfQ09VTlRfMzk0NSAtIDEpOwotCi0JaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJhdGVfbWFzayA9IHJhdGVfbWFzayA8PCBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JLyogZm9yIHJlY2VudCBhc3NvYywgY2hvb3NlIGJlc3QgcmF0ZSByZWdhcmRpbmcKLQkgKiB0byByc3NpIHZhbHVlCi0JICovCi0JaWYgKHJzX3N0YS0+c3RhcnRfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCWlmIChyc19zdGEtPnN0YXJ0X3JhdGUgPCBpbmRleCAmJgotCQkgICAocmF0ZV9tYXNrICYgKDEgPDwgcnNfc3RhLT5zdGFydF9yYXRlKSkpCi0JCQlpbmRleCA9IHJzX3N0YS0+c3RhcnRfcmF0ZTsKLQkJcnNfc3RhLT5zdGFydF9yYXRlID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl9Ci0KLQkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCi0JaWYgKChtYXhfcmF0ZV9pZHggIT0gLTEpICYmIChtYXhfcmF0ZV9pZHggPCBpbmRleCkpIHsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IG1heF9yYXRlX2lkeCkpCi0JCQlpbmRleCA9IG1heF9yYXRlX2lkeDsKLQl9Ci0KLQl3aW5kb3cgPSAmKHJzX3N0YS0+d2luW2luZGV4XSk7Ci0KLQlmYWlsX2NvdW50ID0gd2luZG93LT5jb3VudGVyIC0gd2luZG93LT5zdWNjZXNzX2NvdW50ZXI7Ci0KLQlpZiAoKChmYWlsX2NvdW50IDwgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgpICYmCi0JICAgICAod2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPCBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCkpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJJbnZhbGlkIGF2ZXJhZ2VfdHB0IG9uIHJhdGUgJWQ6ICIKLQkJCSAgICAgICAiY291bnRlcjogJWQsIHN1Y2Nlc3NfY291bnRlcjogJWQsICIKLQkJCSAgICAgICAiZXhwZWN0ZWRfdHB0IGlzICVzTlVMTFxuIiwKLQkJCSAgICAgICBpbmRleCwKLQkJCSAgICAgICB3aW5kb3ctPmNvdW50ZXIsCi0JCQkgICAgICAgd2luZG93LT5zdWNjZXNzX2NvdW50ZXIsCi0JCQkgICAgICAgcnNfc3RhLT5leHBlY3RlZF90cHQgPyAibm90ICIgOiAiIik7Ci0KLQkgICAvKiBDYW4ndCBjYWxjdWxhdGUgdGhpcyB5ZXQ7IG5vdCBlbm91Z2ggaGlzdG9yeSAqLwotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JCWdvdG8gb3V0OwotCi0JfQotCi0JY3VycmVudF90cHQgPSB3aW5kb3ctPmF2ZXJhZ2VfdHB0OwotCi0JaGlnaF9sb3cgPSBpd2wzOTQ1X2dldF9hZGphY2VudF9yYXRlKHJzX3N0YSwgaW5kZXgsIHJhdGVfbWFzaywKLQkJCQkJICAgICBzYmFuZC0+YmFuZCk7Ci0JbG93ID0gaGlnaF9sb3cgJiAweGZmOwotCWhpZ2ggPSAoaGlnaF9sb3cgPj4gOCkgJiAweGZmOwotCi0JLyogSWYgdXNlciBzZXQgbWF4IHJhdGUsIGRvbnQgYWxsb3cgaGlnaGVyIHRoYW4gdXNlciBjb25zdHJhaW4gKi8KLQlpZiAoKG1heF9yYXRlX2lkeCAhPSAtMSkgJiYgKG1heF9yYXRlX2lkeCA8IGhpZ2gpKQotCQloaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCS8qIENvbGxlY3QgTWVhc3VyZWQgdGhyb3VnaHB1dHMgb2YgYWRqYWNlbnQgcmF0ZXMgKi8KLQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvd190cHQgPSByc19zdGEtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OwotCi0JaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJaGlnaF90cHQgPSByc19zdGEtPndpbltoaWdoXS5hdmVyYWdlX3RwdDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0Jc2NhbGVfYWN0aW9uID0gMDsKLQotCS8qIExvdyBzdWNjZXNzIHJhdGlvICwgbmVlZCB0byBkcm9wIHRoZSByYXRlICovCi0JaWYgKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPCBJV0xfUkFURV9ERUNSRUFTRV9USCkgfHwgIWN1cnJlbnRfdHB0KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOwotCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQkvKiBObyB0aHJvdWdocHV0IG1lYXN1cmVkIHlldCBmb3IgYWRqYWNlbnQgcmF0ZXMsCi0JICogdHJ5IGluY3JlYXNlICovCi0JfSBlbHNlIGlmICgobG93X3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJICAgKGhpZ2hfdHB0ID09IElXTF9JTlZBTElEX1ZBTFVFKSkgewotCi0JCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQgJiYgd2luZG93LT5zdWNjZXNzX3JhdGlvID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKQotCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJZWxzZSBpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlzY2FsZV9hY3Rpb24gPSAwOwotCi0JLyogQm90aCBhZGphY2VudCB0aHJvdWdocHV0cyBhcmUgbWVhc3VyZWQsIGJ1dCBuZWl0aGVyIG9uZSBoYXMKLQkgKiBiZXR0ZXIgdGhyb3VnaHB1dDsgd2UncmUgdXNpbmcgdGhlIGJlc3QgcmF0ZSwgZG9uJ3QgY2hhbmdlCi0JICogaXQhICovCi0JfSBlbHNlIGlmICgobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChsb3dfdHB0IDwgY3VycmVudF90cHQpICYmIChoaWdoX3RwdCA8IGN1cnJlbnRfdHB0KSkgewotCi0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJObyBhY3Rpb24gLS0gbG93IFslZF0gJiBoaWdoIFslZF0gPCAiCi0JCQkgICAgICAgImN1cnJlbnRfdHB0IFslZF1cbiIsCi0JCQkgICAgICAgbG93X3RwdCwgaGlnaF90cHQsIGN1cnJlbnRfdHB0KTsKLQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmF0ZXMgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCi0JfSBlbHNlIHsKLQkJaWYgKGhpZ2hfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0KLQkJCS8qIEhpZ2ggcmF0ZSBoYXMgYmV0dGVyIHRocm91Z2hwdXQsIEluY3JlYXNlCi0JCQkgKiByYXRlICovCi0JCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgotCQkJCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkKLQkJCQlzY2FsZV9hY3Rpb24gPSAxOwotCQkJZWxzZSB7Ci0JCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkgICAgImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBoaWdoIHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gMDsKLQkJCX0KLQkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0JCQlpZiAobG93X3RwdCA+IGN1cnJlbnRfdHB0KSB7Ci0JCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkgICAgImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBsb3cgdHB0XG4iKTsKLQkJCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQkJCX0gZWxzZSBpZiAod2luZG93LT5zdWNjZXNzX3JhdGlvID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKSB7Ci0JCQkJLyogTG93ZXIgcmF0ZSBoYXMgYmV0dGVyCi0JCQkJICogdGhyb3VnaHB1dCxkZWNyZWFzZSByYXRlICovCi0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKLQkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLwotCWlmICgoc2NhbGVfYWN0aW9uID09IC0xKSAmJiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpICYmCi0JCSAgICAoKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+IElXTF9SQVRFX0hJR0hfVEgpIHx8Ci0JCSAgICAgKGN1cnJlbnRfdHB0ID4gKDEwMCAqIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2xvd10pKSkpCi0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQlzd2l0Y2ggKHNjYWxlX2FjdGlvbikgewotCWNhc2UgLTE6Ci0KLQkJLyogRGVjcmVzZSByYXRlICovCi0JCWlmIChsb3cgIT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWluZGV4ID0gbG93OwotCQlicmVhazsKLQotCWNhc2UgMToKLQkJLyogSW5jcmVhc2UgcmF0ZSAqLwotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJaW5kZXggPSBoaWdoOwotCi0JCWJyZWFrOwotCi0JY2FzZSAwOgotCWRlZmF1bHQ6Ci0JCS8qIE5vIGNoYW5nZSAqLwotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiU2VsZWN0ZWQgJWQgKGFjdGlvbiAlZCkgLSBsb3cgJWQgaGlnaCAlZFxuIiwKLQkJICAgICAgIGluZGV4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCk7Ci0KLSBvdXQ6Ci0KLQlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQlpZiAoV0FSTl9PTl9PTkNFKGluZGV4IDwgSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQlpbmRleCA9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaW5kZXg7Ci0JCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gaW5kZXggLSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCX0gZWxzZSB7Ci0JCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaW5kZXg7Ci0JCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7Ci0JfQotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlOiAlZFxuIiwgaW5kZXgpOwotfQotCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLXN0YXRpYyBpbnQgaXdsMzk0NV9vcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmJ1ZmY7Ci0JaW50IGRlc2MgPSAwOwotCWludCBqOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgInR4IHBhY2tldHM9JWQgbGFzdCByYXRlIGluZGV4PSVkXG4iCi0JCQkicmF0ZT0weCVYIGZsdXNoIHRpbWUgJWRcbiIsCi0JCQlscV9zdGEtPnR4X3BhY2tldHMsCi0JCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCwKLQkJCWxxX3N0YS0+c3RhcnRfcmF0ZSwgamlmZmllc190b19tc2VjcyhscV9zdGEtPmZsdXNoX3RpbWUpKTsKLQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsgaisrKSB7Ci0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkJImNvdW50ZXI9JWQgc3VjY2Vzcz0lZCAlJT0lZFxuIiwKLQkJCQlscV9zdGEtPndpbltqXS5jb3VudGVyLAotCQkJCWxxX3N0YS0+d2luW2pdLnN1Y2Nlc3NfY291bnRlciwKLQkJCQlscV9zdGEtPndpbltqXS5zdWNjZXNzX3JhdGlvKTsKLQl9Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKLQlrZnJlZShidWZmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzID0gewotCS5yZWFkID0gaXdsMzk0NV9zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZCwKLQkub3BlbiA9IGl3bDM5NDVfb3Blbl9maWxlX2dlbmVyaWMsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQotc3RhdGljIHZvaWQgaXdsMzk0NV9hZGRfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSwKLQkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCi17Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpscV9zdGEgPSBwcml2X3N0YTsKLQotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3N0YXRzX3RhYmxlIiwgMDYwMCwgZGlyLAotCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JlbW92ZV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0JZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIG9mIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBpcyBkb25lIGJ5IGRyaXZlciBhZnRlcgotICogdGhlIHN0YXRpb24gaXMgYWRkZWQuIFNpbmNlIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEKLSAqIHN0YXRpb24gaXMgYWRkZWQgd2UgaWdub3JlIGl0LgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX3JhdGVfaW5pdF9zdHViKHZvaWQgKnByaXZfciwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKnByaXZfc3RhKQotewotfQotCi1zdGF0aWMgc3RydWN0IHJhdGVfY29udHJvbF9vcHMgcnNfb3BzID0gewotCS5tb2R1bGUgPSBOVUxMLAotCS5uYW1lID0gUlNfTkFNRSwKLQkudHhfc3RhdHVzID0gaXdsMzk0NV9yc190eF9zdGF0dXMsCi0JLmdldF9yYXRlID0gaXdsMzk0NV9yc19nZXRfcmF0ZSwKLQkucmF0ZV9pbml0ID0gaXdsMzk0NV9yc19yYXRlX2luaXRfc3R1YiwKLQkuYWxsb2MgPSBpd2wzOTQ1X3JzX2FsbG9jLAotCS5mcmVlID0gaXdsMzk0NV9yc19mcmVlLAotCS5hbGxvY19zdGEgPSBpd2wzOTQ1X3JzX2FsbG9jX3N0YSwKLQkuZnJlZV9zdGEgPSBpd2wzOTQ1X3JzX2ZyZWVfc3RhLAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JLmFkZF9zdGFfZGVidWdmcyA9IGl3bDM5NDVfYWRkX2RlYnVnZnMsCi0JLnJlbW92ZV9zdGFfZGVidWdmcyA9IGl3bDM5NDVfcmVtb3ZlX2RlYnVnZnMsCi0jZW5kaWYKLQotfTsKLXZvaWQgaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHMzMiBzdGFfaWQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JczMyIHJzc2kgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJlbnRlclxuIik7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udmlmLAotCQkJCSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0JaWYgKCFzdGEpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlVuYWJsZSB0byBmaW5kIHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcuXG4iKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwc3RhID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKLQlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JcnNfc3RhLT50Z2cgPSAwOwotCXN3aXRjaCAocHJpdi0+YmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJLyogVE9ETzogdGhpcyBhbHdheXMgZG9lcyBHLCBub3QgYSByZWdyZXNzaW9uICovCi0JCWlmIChwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hY3RpdmUuZmxhZ3MgJgotCQkJCQkJUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSB7Ci0JCQlyc19zdGEtPnRnZyA9IDE7Ci0JCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2dfcHJvdDsKLQkJfSBlbHNlCi0JCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2c7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlyc19zdGEtPmV4cGVjdGVkX3RwdCA9IGl3bDM5NDVfZXhwZWN0ZWRfdHB0X2E7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX05VTV9CQU5EUzoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JcnNzaSA9IHByaXYtPl8zOTQ1Lmxhc3RfcnhfcnNzaTsKLQlpZiAocnNzaSA9PSAwKQotCQlyc3NpID0gSVdMX01JTl9SU1NJX1ZBTDsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJOZXR3b3JrIFJTU0k6ICVkXG4iLCByc3NpKTsKLQotCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IGl3bDM5NDVfZ2V0X3JhdGVfaW5kZXhfYnlfcnNzaShyc3NpLCBwcml2LT5iYW5kKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogcnNzaSAlZCBhc3NpZ24gcmF0ZSBpbmRleDogIgotCQkgICAgICAgIiVkIChwbGNwIDB4JXgpXG4iLCByc3NpLCByc19zdGEtPnN0YXJ0X3JhdGUsCi0JCSAgICAgICBpd2wzOTQ1X3JhdGVzW3JzX3N0YS0+c3RhcnRfcmF0ZV0ucGxjcCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLWludCBpd2wzOTQ1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZyc19vcHMpOwotfQotCi12b2lkIGl3bDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCkKLXsKLQlpZWVlODAyMTFfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoJnJzX29wcyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjMGE3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1maC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWZoLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LmgiCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtbGVkLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtbGVkLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtZGVidWdmcy5oIgotCi0jZGVmaW5lIElXTF9ERUNMQVJFX1JBVEVfSU5GTyhyLCBpcCwgaW4sIHJwLCBybiwgcHAsIG5wKSAgICBcCi0JW0lXTF9SQVRFXyMjciMjTV9JTkRFWF0gPSB7IElXTF9SQVRFXyMjciMjTV9QTENQLCAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lFRUUsICAgXAotCQkJCSAgICBJV0xfUkFURV8jI2lwIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjaW4jI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNycCMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI3JuIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjcHAjI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNucCMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI3IjI01fSU5ERVhfVEFCTEUsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNpcCMjTV9JTkRFWF9UQUJMRSB9Ci0KLS8qCi0gKiBQYXJhbWV0ZXIgb3JkZXI6Ci0gKiAgIHJhdGUsIHByZXYgcmF0ZSwgbmV4dCByYXRlLCBwcmV2IHRnZyByYXRlLCBuZXh0IHRnZyByYXRlCi0gKgotICogSWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBuZXh0IG9yIHByZXZpb3VzIHJhdGUgdGhlbiBJTlYgaXMgdXNlZCB3aGljaAotICogbWFwcyB0byBJV0xfUkFURV9JTlZBTElECi0gKgotICovCi1jb25zdCBzdHJ1Y3QgaXdsMzk0NV9yYXRlX2luZm8gaXdsMzk0NV9yYXRlc1tJV0xfUkFURV9DT1VOVF8zOTQ1XSA9IHsKLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMSwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksICAgIC8qICAxbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyLCAxLCA1LCAxLCA1LCAxLCA1KSwgICAgICAgICAgLyogIDJtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDUsIDIsIDYsIDIsIDExLCAyLCAxMSksICAgICAgICAvKjUuNW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTEsIDksIDEyLCA1LCAxMiwgNSwgMTgpLCAgICAgIC8qIDExbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLCAgICAgICAgLyogIDZtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDExLCA1LCAxMSwgNSwgMTEpLCAgICAgICAvKiAgOW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTIsIDExLCAxOCwgMTEsIDE4LCAxMSwgMTgpLCAgIC8qIDEybWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygxOCwgMTIsIDI0LCAxMiwgMjQsIDExLCAyNCksICAgLyogMThtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDI0LCAxOCwgMzYsIDE4LCAzNiwgMTgsIDM2KSwgICAvKiAyNG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMzYsIDI0LCA0OCwgMjQsIDQ4LCAyNCwgNDgpLCAgIC8qIDM2bWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg0OCwgMzYsIDU0LCAzNiwgNTQsIDM2LCA1NCksICAgLyogNDhtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDU0LCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA1NG1icHMgKi8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsMzk0NV9nZXRfcHJldl9pZWVlX3JhdGUodTggcmF0ZV9pbmRleCkKLXsKLQl1OCByYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2luZGV4XS5wcmV2X2llZWU7Ci0KLQlpZiAocmF0ZSA9PSBJV0xfUkFURV9JTlZBTElEKQotCQlyYXRlID0gcmF0ZV9pbmRleDsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotLyogMSA9IGVuYWJsZSB0aGUgaXdsMzk0NV9kaXNhYmxlX2V2ZW50cygpIGZ1bmN0aW9uICovCi0jZGVmaW5lIElXTF9FVlRfRElTQUJMRSAoMCkKLSNkZWZpbmUgSVdMX0VWVF9ESVNBQkxFX1NJWkUgKDE1MzIvMzIpCi0KLS8qKgotICogaXdsMzk0NV9kaXNhYmxlX2V2ZW50cyAtIERpc2FibGUgc2VsZWN0ZWQgZXZlbnRzIGluIHVDb2RlIGV2ZW50IGxvZwotICoKLSAqIERpc2FibGUgYW4gZXZlbnQgYnkgd3JpdGluZyAiMSJzIGludG8gImRpc2FibGUiCi0gKiAgIGJpdG1hcCBpbiBTUkFNLiAgQml0IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIEV2ZW50ICMgKGlkL3R5cGUpLgotICogICBEZWZhdWx0IHZhbHVlcyBvZiAwIGVuYWJsZSB1Q29kZSBldmVudHMgdG8gYmUgbG9nZ2VkLgotICogVXNlIGZvciBvbmx5IHNwZWNpYWwgZGVidWdnaW5nLiAgVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYXMtaXMsCi0gKiAgIHlvdSdsbCBuZWVkIHRvIHByb3ZpZGUgdGhlIHNwZWNpYWwgYml0cyEgLi4uCi0gKiAgIC4uLiBhbmQgc2V0IElXTF9FVlRfRElTQUJMRSB0byAxLiAqLwotdm9pZCBpd2wzOTQ1X2Rpc2FibGVfZXZlbnRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgaTsKLQl1MzIgYmFzZTsJCS8qIFNSQU0gYWRkcmVzcyBvZiBldmVudCBsb2cgaGVhZGVyICovCi0JdTMyIGRpc2FibGVfcHRyOwkvKiBTUkFNIGFkZHJlc3Mgb2YgZXZlbnQtZGlzYWJsZSBiaXRtYXAgYXJyYXkgKi8KLQl1MzIgYXJyYXlfc2l6ZTsJCS8qICMgb2YgdTMyIGVudHJpZXMgaW4gYXJyYXkgKi8KLQlzdGF0aWMgY29uc3QgdTMyIGV2dF9kaXNhYmxlW0lXTF9FVlRfRElTQUJMRV9TSVpFXSA9IHsKLQkJMHgwMDAwMDAwMCwJLyogICAzMSAtICAgIDAgIEV2ZW50IGlkIG51bWJlcnMgKi8KLQkJMHgwMDAwMDAwMCwJLyogICA2MyAtICAgMzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogICA5NSAtICAgNjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDEyNyAtICAgOTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDE1OSAtICAxMjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDE5MSAtICAxNjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDIyMyAtICAxOTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDI1NSAtICAyMjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDI4NyAtICAyNTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDMxOSAtICAyODggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDM1MSAtICAzMjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDM4MyAtICAzNTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQxNSAtICAzODQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQ0NyAtICA0MTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDQ3OSAtICA0NDggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDUxMSAtICA0ODAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDU0MyAtICA1MTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDU3NSAtICA1NDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDYwNyAtICA1NzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDYzOSAtICA2MDggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDY3MSAtICA2NDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDcwMyAtICA2NzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDczNSAtICA3MDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDc2NyAtICA3MzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDc5OSAtICA3NjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDgzMSAtICA4MDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDg2MyAtICA4MzIgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDg5NSAtICA4NjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDkyNyAtICA4OTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogIDk1OSAtICA5MjggKi8KLQkJMHgwMDAwMDAwMCwJLyogIDk5MSAtICA5NjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTAyMyAtICA5OTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTA1NSAtIDEwMjQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTA4NyAtIDEwNTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTExOSAtIDEwODggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTE1MSAtIDExMjAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTE4MyAtIDExNTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTIxNSAtIDExODQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTI0NyAtIDEyMTYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTI3OSAtIDEyNDggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTMxMSAtIDEyODAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTM0MyAtIDEzMTIgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTM3NSAtIDEzNDQgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQwNyAtIDEzNzYgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQzOSAtIDE0MDggKi8KLQkJMHgwMDAwMDAwMCwJLyogMTQ3MSAtIDE0NDAgKi8KLQkJMHgwMDAwMDAwMCwJLyogMTUwMyAtIDE0NzIgKi8KLQl9OwotCi0JYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUubG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0JaWYgKCFpd2wzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBldmVudCBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOwotCQlyZXR1cm47Ci0JfQotCi0JZGlzYWJsZV9wdHIgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArICg0ICogc2l6ZW9mKHUzMikpKTsKLQlhcnJheV9zaXplID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoNSAqIHNpemVvZih1MzIpKSk7Ci0KLQlpZiAoSVdMX0VWVF9ESVNBQkxFICYmIChhcnJheV9zaXplID09IElXTF9FVlRfRElTQUJMRV9TSVpFKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGlzYWJsaW5nIHNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgYXQgMHgleFxuIiwKLQkJCSAgICAgICBkaXNhYmxlX3B0cik7Ci0JCWZvciAoaSA9IDA7IGkgPCBJV0xfRVZUX0RJU0FCTEVfU0laRTsgaSsrKQotCQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LAotCQkJCQkgICBkaXNhYmxlX3B0ciArIChpICogc2l6ZW9mKHUzMikpLAotCQkJCQkgICBldnRfZGlzYWJsZVtpXSk7Ci0KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2VsZWN0ZWQgdUNvZGUgbG9nIGV2ZW50cyBtYXkgYmUgZGlzYWJsZWRcbiIpOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiICBieSB3cml0aW5nIFwiMVwicyBpbnRvIGRpc2FibGUgYml0bWFwXG4iKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIiAgaW4gU1JBTSBhdCAweCV4LCBzaXplICVkIHUzMnNcbiIsCi0JCQkgICAgICAgZGlzYWJsZV9wdHIsIGFycmF5X3NpemUpOwotCX0KLQotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHU4IHBsY3ApCi17Ci0JaW50IGlkeDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgSVdMX1JBVEVfQ09VTlRfMzk0NTsgaWR4KyspCi0JCWlmIChpd2wzOTQ1X3JhdGVzW2lkeF0ucGxjcCA9PSBwbGNwKQotCQkJcmV0dXJuIGlkeDsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLSNkZWZpbmUgVFhfU1RBVFVTX0VOVFJZKHgpIGNhc2UgVFhfMzk0NV9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQotewotCXN3aXRjaCAoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgewotCWNhc2UgVFhfMzk0NV9TVEFUVVNfU1VDQ0VTUzoKLQkJcmV0dXJuICJTVUNDRVNTIjsKLQkJVFhfU1RBVFVTX0VOVFJZKFNIT1JUX0xJTUlUKTsKLQkJVFhfU1RBVFVTX0VOVFJZKExPTkdfTElNSVQpOwotCQlUWF9TVEFUVVNfRU5UUlkoRklGT19VTkRFUlJVTik7Ci0JCVRYX1NUQVRVU19FTlRSWShNR01OVF9BQk9SVCk7Ci0JCVRYX1NUQVRVU19FTlRSWShORVhUX0ZSQUcpOwotCQlUWF9TVEFUVVNfRU5UUlkoTElGRV9FWFBJUkUpOwotCQlUWF9TVEFUVVNfRU5UUlkoREVTVF9QUyk7Ci0JCVRYX1NUQVRVU19FTlRSWShBQk9SVEVEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKEJUX1JFVFJZKTsKLQkJVFhfU1RBVFVTX0VOVFJZKFNUQV9JTlZBTElEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKEZSQUdfRFJPUFBFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShUSURfRElTQUJMRSk7Ci0JCVRYX1NUQVRVU19FTlRSWShGUkFNRV9GTFVTSEVEKTsKLQkJVFhfU1RBVFVTX0VOVFJZKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKLQkJVFhfU1RBVFVTX0VOVFJZKFRYX0xPQ0tFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShOT19CRUFDT05fT05fUkFEQVIpOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICppd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQotewotCXJldHVybiAiIjsKLX0KLSNlbmRpZgotCi0vKgotICogZ2V0IGllZWUgcHJldiByYXRlIGZyb20gcmF0ZSBzY2FsZSB0YWJsZS4KLSAqIGZvciBBIGFuZCBCIG1vZGUgd2UgbmVlZCB0byBvdmVycmlnaHQgcHJldgotICogdmFsdWUKLSAqLwotaW50IGl3bDM5NDVfcnNfbmV4dF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHJhdGUpCi17Ci0JaW50IG5leHRfcmF0ZSA9IGl3bDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKHJhdGUpOwotCi0Jc3dpdGNoIChwcml2LT5iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlpZiAocmF0ZSA9PSBJV0xfUkFURV8xMk1fSU5ERVgpCi0JCQluZXh0X3JhdGUgPSBJV0xfUkFURV85TV9JTkRFWDsKLQkJZWxzZSBpZiAocmF0ZSA9PSBJV0xfUkFURV82TV9JTkRFWCkKLQkJCW5leHRfcmF0ZSA9IElXTF9SQVRFXzZNX0lOREVYOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCWlmICghKHByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSVdMX09GRE1fUkFURVNfTUFTSykgJiYKLQkJICAgIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCQkJaWYgKHJhdGUgPT0gSVdMX1JBVEVfMTFNX0lOREVYKQotCQkJCW5leHRfcmF0ZSA9IElXTF9SQVRFXzVNX0lOREVYOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG5leHRfcmF0ZTsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfdHhfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVHggcXVldWUgZW50cmllcyBhbHJlYWR5IFR4J2QKLSAqCi0gKiBXaGVuIEZXIGFkdmFuY2VzICdSJyBpbmRleCwgYWxsIGVudHJpZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyAnUicgaW5kZXgKLSAqIG5lZWQgdG8gYmUgcmVjbGFpbWVkLiBBcyByZXN1bHQsIHNvbWUgZnJlZSBzcGFjZSBmb3Jtcy4gSWYgdGhlcmUgaXMKLSAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV90eF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIGludCB0eHFfaWQsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0Jc3RydWN0IGl3bF90eF9pbmZvICp0eF9pbmZvOwotCi0JQlVHX09OKHR4cV9pZCA9PSBJV0wzOV9DTURfUVVFVUVfTlVNKTsKLQotCWZvciAoaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGluZGV4LCBxLT5uX2JkKTsKLQkJcS0+cmVhZF9wdHIgIT0gaW5kZXg7Ci0JCXEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKLQotCQl0eF9pbmZvID0gJnR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl07Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywgdHhfaW5mby0+c2tiKTsKLQkJdHhfaW5mby0+c2tiID0gTlVMTDsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2ZyZWVfdGZkKHByaXYsIHR4cSk7Ci0JfQotCi0JaWYgKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPiBxLT5sb3dfbWFyayAmJiAodHhxX2lkID49IDApICYmCi0JCQkodHhxX2lkICE9IElXTDM5X0NNRF9RVUVVRV9OVU0pICYmCi0JCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpd2xfbGVnYWN5X3dha2VfcXVldWUocHJpdiwgdHhxKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3J4X3JlcGx5X3R4IC0gSGFuZGxlIFR4IHJlc3BvbnNlCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfdHgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKLQlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKLQlpbnQgaW5kZXggPSBTRVFfVE9fSU5ERVgoc2VxdWVuY2UpOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87Ci0Jc3RydWN0IGl3bDM5NDVfdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07Ci0JdTMyICBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0eF9yZXNwLT5zdGF0dXMpOwotCWludCByYXRlX2lkeDsKLQlpbnQgZmFpbDsKLQotCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsCi0JCQkgIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKLQkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwotCWllZWU4MDIxMV90eF9pbmZvX2NsZWFyX3N0YXR1cyhpbmZvKTsKLQotCS8qIEZpbGwgdGhlIE1SUiBjaGFpbiB3aXRoIHNvbWUgaW5mbyBhYm91dCBvbi1jaGlwIHJldHJhbnNtaXNzaW9ucyAqLwotCXJhdGVfaWR4ID0gaXdsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgodHhfcmVzcC0+cmF0ZSk7Ci0JaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCWZhaWwgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lOwotCi0JaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IHJhdGVfaWR4OwotCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IGZhaWwgKyAxOyAvKiBhZGQgZmluYWwgYXR0ZW1wdCAqLwotCi0JLyogdHhfc3RhdHVzLT5ydHNfcmV0cnlfY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX3J0czsgKi8KLQlpbmZvLT5mbGFncyB8PSAoKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spID09IFRYX1NUQVRVU19TVUNDRVNTKSA/Ci0JCQkJSUVFRTgwMjExX1RYX1NUQVRfQUNLIDogMDsKLQotCUlXTF9ERUJVR19UWChwcml2LCAiVHggcXVldWUgJWQgU3RhdHVzICVzICgweCUwOHgpIHBsY3AgcmF0ZSAlZCByZXRyaWVzICVkXG4iLAotCQkJdHhxX2lkLCBpd2wzOTQ1X2dldF90eF9mYWlsX3JlYXNvbihzdGF0dXMpLCBzdGF0dXMsCi0JCQl0eF9yZXNwLT5yYXRlLCB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lKTsKLQotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVHggcXVldWUgcmVjbGFpbSAlZFxuIiwgaW5kZXgpOwotCWl3bDM5NDVfdHhfcXVldWVfcmVjbGFpbShwcml2LCB0eHFfaWQsIGluZGV4KTsKLQotCWlmIChzdGF0dXMgJiBUWF9BQk9SVF9SRVFVSVJFRF9NU0spCi0JCUlXTF9FUlIocHJpdiwgIlRPRE86ICBJbXBsZW1lbnQgVHggQUJPUlQgUkVRVUlSRUQhISFcbiIpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW50ZWwgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uCi0gKgotICogIFJYIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIF9fbGUzMiAqc3RhdHMpCi17Ci0JaW50IGk7Ci0JX19sZTMyICpwcmV2X3N0YXRzOwotCXUzMiAqYWNjdW1fc3RhdHM7Ci0JdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKLQotCXByZXZfc3RhdHMgPSAoX19sZTMyICopJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3M7Ci0JYWNjdW1fc3RhdHMgPSAodTMyICopJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3M7Ci0JZGVsdGEgPSAodTMyICopJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3M7Ci0JbWF4X2RlbHRhID0gKHUzMiAqKSZwcml2LT5fMzk0NS5tYXhfZGVsdGE7Ci0KLQlmb3IgKGkgPSBzaXplb2YoX19sZTMyKTsgaSA8IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKTsKLQkgICAgIGkgKz0gc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywKLQkgICAgIG1heF9kZWx0YSsrLCBhY2N1bV9zdGF0cysrKSB7Ci0JCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7Ci0JCQkqZGVsdGEgPSAobGUzMl90b19jcHUoKnN0YXRzKSAtCi0JCQkJbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKLQkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7Ci0JCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKLQkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRpc3RpY3MgKi8KLQlwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwudGVtcGVyYXR1cmUgPQotCQlwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwudGVtcGVyYXR1cmU7Ci0JcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLnR0bF90aW1lc3RhbXAgPQotCQlwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmdlbmVyYWwudHRsX3RpbWVzdGFtcDsKLX0KLSNlbmRpZgotCi12b2lkIGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKSwKLQkJICAgICBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCWl3bDM5NDVfYWNjdW11bGF0aXZlX3N0YXRpc3RpY3MocHJpdiwgKF9fbGUzMiAqKSZwa3QtPnUucmF3KTsKLSNlbmRpZgotCi0JbWVtY3B5KCZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLCBwa3QtPnUucmF3LCBzaXplb2YocHJpdi0+XzM5NDUuc3RhdGlzdGljcykpOwotfQotCi12b2lkIGl3bDM5NDVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlfX2xlMzIgKmZsYWcgPSAoX19sZTMyICopJnBrdC0+dS5yYXc7Ci0KLQlpZiAobGUzMl90b19jcHUoKmZsYWcpICYgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0spIHsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCQltZW1zZXQoJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl8zOTQ1Lm1heF9kZWx0YSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzKSk7Ci0jZW5kaWYKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJTdGF0aXN0aWNzIGhhdmUgYmVlbiBjbGVhcmVkXG4iKTsKLQl9Ci0JaXdsMzk0NV9od19yeF9zdGF0aXN0aWNzKHByaXYsIHJ4Yik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1pc2MuIGludGVybmFsIHN0YXRlIGFuZCBoZWxwZXIgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBpcyBuZWNlc3Nhcnkgb25seSBmb3IgYSBudW1iZXIgb2Ygc3RhdGlzdGljcywgc2VlIHRoZSBjYWxsZXIuICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaXNfbmV0d29ya19wYWNrZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotCS8qIEZpbHRlciBpbmNvbWluZyBwYWNrZXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSB0YXJnZXRlZCB0b3dhcmQKLQkgKiB0aGlzIG5ldHdvcmssIGRpc2NhcmRpbmcgcGFja2V0cyBjb21pbmcgZnJvbSBvdXJzZWx2ZXMgKi8KLQlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOiAvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KLQkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KLQkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMywgcHJpdi0+YnNzaWQpOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjogLyogSGVhZGVyOiBEZXN0LiB8IEFQe0JTU0lEfSB8IFNvdXJjZSAqLwotCQkvKiBwYWNrZXRzIHRvIG91ciBJQlNTIHVwZGF0ZSBpbmZvcm1hdGlvbiAqLwotCQlyZXR1cm4gIWNvbXBhcmVfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIyLCBwcml2LT5ic3NpZCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKUlXTF9SWF9EQVRBKHBrdCk7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyICpyeF9oZHIgPSBJV0xfUlhfSERSKHBrdCk7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kICpyeF9lbmQgPSBJV0xfUlhfRU5EKHBrdCk7Ci0JdTE2IGxlbiA9IGxlMTZfdG9fY3B1KHJ4X2hkci0+bGVuKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQotCS8qIFdlIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgSFcsIHNvIHN0b3AgdGhlIHdhdGNoZG9nICovCi0JaWYgKHVubGlrZWx5KGxlbiArIElXTDM5X1JYX0ZSQU1FX1NJWkUgPgotCQkgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcikpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkNvcnJ1cHRpb24gZGV0ZWN0ZWQhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlIGludGVyZmFjZSBpcyBvcGVuICovCi0JaWYgKHVubGlrZWx5KCFwcml2LT5pc19vcGVuKSkgewotCQlJV0xfREVCVUdfRFJPUF9MSU1JVChwcml2LAotCQkJIkRyb3BwaW5nIHBhY2tldCB3aGlsZSBpbnRlcmZhY2UgaXMgbm90IG9wZW4uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKLQlpZiAoIXNrYikgewotCQlJV0xfRVJSKHByaXYsICJkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWl3bDM5NDVfbW9kX3BhcmFtcy5zd19jcnlwdG8pCi0JCWl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHByaXYsCi0JCQkJICAgICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXJ4Yl9hZGRyKHJ4YiksCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KHJ4X2VuZC0+c3RhdHVzKSwgc3RhdHMpOwotCi0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLAotCQkJKHZvaWQgKilyeF9oZHItPnBheWxvYWQgLSAodm9pZCAqKXBrdCwgbGVuKTsKLQotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIGZhbHNlLCBmYywgbGVuKTsKLQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHNrYiksIHN0YXRzLCBzaXplb2YoKnN0YXRzKSk7Ci0KLQlpZWVlODAyMTFfcngocHJpdi0+aHcsIHNrYik7Ci0JcHJpdi0+YWxsb2NfcnhiX3BhZ2UtLTsKLQlyeGItPnBhZ2UgPSBOVUxMOwotfQotCi0jZGVmaW5lIElXTF9ERUxBWV9ORVhUX1NDQU5fQUZURVJfQVNTT0MgKEhaKjYpCi0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfcngoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzICpyeF9zdGF0cyA9IElXTF9SWF9TVEFUUyhwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSVdMX1JYX0hEUihwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2VuZCAqcnhfZW5kID0gSVdMX1JYX0VORChwa3QpOwotCXUxNiByeF9zdGF0c19zaWdfYXZnIF9fbWF5YmVfdW51c2VkID0gbGUxNl90b19jcHUocnhfc3RhdHMtPnNpZ19hdmcpOwotCXUxNiByeF9zdGF0c19ub2lzZV9kaWZmIF9fbWF5YmVfdW51c2VkID0gbGUxNl90b19jcHUocnhfc3RhdHMtPm5vaXNlX2RpZmYpOwotCXU4IG5ldHdvcmtfcGFja2V0OwotCi0Jcnhfc3RhdHVzLmZsYWcgPSAwOwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocnhfZW5kLT50aW1lc3RhbXApOwotCXJ4X3N0YXR1cy5iYW5kID0gKHJ4X2hkci0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPwotCQkJCUlFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwotCXJ4X3N0YXR1cy5mcmVxID0KLQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGxlMTZfdG9fY3B1KHJ4X2hkci0+Y2hhbm5lbCksCi0JCQkJCSAgICAgICByeF9zdGF0dXMuYmFuZCk7Ci0KLQlyeF9zdGF0dXMucmF0ZV9pZHggPSBpd2wzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeChyeF9oZHItPnJhdGUpOwotCWlmIChyeF9zdGF0dXMuYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyeF9zdGF0dXMucmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCXJ4X3N0YXR1cy5hbnRlbm5hID0gKGxlMTZfdG9fY3B1KHJ4X2hkci0+cGh5X2ZsYWdzKSAmCi0JCQkJCVJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+IDQ7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAocnhfaGRyLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX1NIT1JUX1BSRUFNQkxFX01TSykKLQkJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19TSE9SVFBSRTsKLQotCWlmICgodW5saWtlbHkocnhfc3RhdHMtPnBoeV9jb3VudCA+IDIwKSkpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAotCQkJCXJ4X3N0YXRzLT5waHlfY291bnQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocnhfZW5kLT5zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SKQotCSAgICB8fCAhKHJ4X2VuZC0+c3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19SWEVfT1ZFUkZMT1cpKSB7Ci0JCUlXTF9ERUJVR19SWChwcml2LCAiQmFkIENSQyBvciBGSUZPOiAweCUwOFguXG4iLCByeF9lbmQtPnN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCi0JLyogQ29udmVydCAzOTQ1J3MgcnNzaSBpbmRpY2F0b3IgdG8gZEJtICovCi0Jcnhfc3RhdHVzLnNpZ25hbCA9IHJ4X3N0YXRzLT5yc3NpIC0gSVdMMzlfUlNTSV9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfU1RBVFMocHJpdiwgIlJzc2kgJWQgc2lnX2F2ZyAlZCBub2lzZV9kaWZmICVkXG4iLAotCQkJcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHNfc2lnX2F2ZywKLQkJCXJ4X3N0YXRzX25vaXNlX2RpZmYpOwotCi0JaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopSVdMX1JYX0RBVEEocGt0KTsKLQotCW5ldHdvcmtfcGFja2V0ID0gaXdsMzk0NV9pc19uZXR3b3JrX3BhY2tldChwcml2LCBoZWFkZXIpOwotCi0JSVdMX0RFQlVHX1NUQVRTX0xJTUlUKHByaXYsICJbJWNdICVkIFJTU0k6JWQgU2lnbmFsOiV1LCBSYXRlOiV1XG4iLAotCQkJICAgICAgbmV0d29ya19wYWNrZXQgPyAnKicgOiAnICcsCi0JCQkgICAgICBsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAotCQkJICAgICAgcnhfc3RhdHVzLnNpZ25hbCwgcnhfc3RhdHVzLnNpZ25hbCwKLQkJCSAgICAgIHJ4X3N0YXR1cy5yYXRlX2lkeCk7Ci0KLQlpd2xfbGVnYWN5X2RiZ19sb2dfcnhfZGF0YV9mcmFtZShwcml2LCBsZTE2X3RvX2NwdShyeF9oZHItPmxlbiksCi0JCQkJCQloZWFkZXIpOwotCi0JaWYgKG5ldHdvcmtfcGFja2V0KSB7Ci0JCXByaXYtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUgPQotCQkJbGUzMl90b19jcHUocnhfZW5kLT5iZWFjb25fdGltZXN0YW1wKTsKLQkJcHJpdi0+XzM5NDUubGFzdF90c2YgPSBsZTY0X3RvX2NwdShyeF9lbmQtPnRpbWVzdGFtcCk7Ci0JCXByaXYtPl8zOTQ1Lmxhc3RfcnhfcnNzaSA9IHJ4X3N0YXR1cy5zaWduYWw7Ci0JfQotCi0JaXdsMzk0NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShwcml2LCByeGIsICZyeF9zdGF0dXMpOwotfQotCi1pbnQgaXdsMzk0NV9od190eHFfYXR0YWNoX2J1Zl90b190ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCSAgICAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKQotewotCWludCBjb3VudDsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkLCAqdGZkX3RtcDsKLQotCXEgPSAmdHhxLT5xOwotCXRmZF90bXAgPSAoc3RydWN0IGl3bDM5NDVfdGZkICopdHhxLT50ZmRzOwotCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07Ci0KLQlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7Ci0KLQljb3VudCA9IFRGRF9DVExfQ09VTlRfR0VUKGxlMzJfdG9fY3B1KHRmZC0+Y29udHJvbF9mbGFncykpOwotCi0JaWYgKChjb3VudCA+PSBOVU1fVEZEX0NIVU5LUykgfHwgKGNvdW50IDwgMCkpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2FuIG5vdCBzZW5kIG1vcmUgdGhhbiAlZCBjaHVua3NcbiIsCi0JCQkgIE5VTV9URkRfQ0hVTktTKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdGZkLT50YnNbY291bnRdLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKLQl0ZmQtPnRic1tjb3VudF0ubGVuID0gY3B1X3RvX2xlMzIobGVuKTsKLQotCWNvdW50Kys7Ci0KLQl0ZmQtPmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUzMihURkRfQ1RMX0NPVU5UX1NFVChjb3VudCkgfAotCQkJCQkgVEZEX0NUTF9QQURfU0VUKHBhZCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od190eHFfZnJlZV90ZmQgLSBGcmVlIG9uZSBURkQsIHRob3NlIGF0IGluZGV4IFt0eHEtPnEucmVhZF9wdHJdCi0gKgotICogRG9lcyBOT1QgYWR2YW5jZSBhbnkgaW5kZXhlcwotICovCi12b2lkIGl3bDM5NDVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkX3RtcCA9IChzdHJ1Y3QgaXdsMzk0NV90ZmQgKil0eHEtPnRmZHM7Ci0JaW50IGluZGV4ID0gdHhxLT5xLnJlYWRfcHRyOwotCXN0cnVjdCBpd2wzOTQ1X3RmZCAqdGZkID0gJnRmZF90bXBbaW5kZXhdOwotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwcml2LT5wY2lfZGV2OwotCWludCBpOwotCWludCBjb3VudGVyOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JY291bnRlciA9IFRGRF9DVExfQ09VTlRfR0VUKGxlMzJfdG9fY3B1KHRmZC0+Y29udHJvbF9mbGFncykpOwotCWlmIChjb3VudGVyID4gTlVNX1RGRF9DSFVOS1MpIHsKLQkJSVdMX0VSUihwcml2LCAiVG9vIG1hbnkgY2h1bmtzOiAlaVxuIiwgY291bnRlcik7Ci0JCS8qIEB0b2RvIGlzc3VlIGZhdGFsIGVycm9yLCBpdCBpcyBxdWl0ZSBzZXJpb3VzIHNpdHVhdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogVW5tYXAgdHhfY21kICovCi0JaWYgKGNvdW50ZXIpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCWRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKLQkJCQlkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAotCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogdW5tYXAgY2h1bmtzIGlmIGFueSAqLwotCi0JZm9yIChpID0gMTsgaSA8IGNvdW50ZXI7IGkrKykKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmFkZHIpLAotCQkJIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmxlbiksIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogZnJlZSBTS0IgKi8KLQlpZiAodHhxLT50eGIpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlza2IgPSB0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYjsKLQotCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCi0JCWlmIChza2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZSAtIEFkZCByYXRlIHBvcnRpb24gdG8gVFhfQ01EOgotICoKLSovCi12b2lkIGl3bDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCSAgaW50IHN0YV9pZCwgaW50IHR4X2lkKQotewotCXUxNiBod192YWx1ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShwcml2LT5odywgaW5mbyktPmh3X3ZhbHVlOwotCXUxNiByYXRlX2luZGV4ID0gbWluKGh3X3ZhbHVlICYgMHhmZmZmLCBJV0xfUkFURV9DT1VOVF8zOTQ1KTsKLQl1MTYgcmF0ZV9tYXNrOwotCWludCByYXRlOwotCXU4IHJ0c19yZXRyeV9saW1pdDsKLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwotCV9fbGUzMiB0eF9mbGFnczsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKLQotCXJhdGUgPSBpd2wzOTQ1X3JhdGVzW3JhdGVfaW5kZXhdLnBsY3A7Ci0JdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOwotCi0JLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlIHN0YS0+c3VwcF9yYXRlcyB3aGlsZQotCSAqIGluIHRoaXMgcnVubmluZyBjb250ZXh0ICovCi0JcmF0ZV9tYXNrID0gSVdMX1JBVEVTX01BU0tfMzk0NTsKLQotCS8qIFNldCByZXRyeSBsaW1pdCBvbiBEQVRBIHBhY2tldHMgYW5kIFByb2JlIFJlc3BvbnNlcyovCi0JaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSkKLQkJZGF0YV9yZXRyeV9saW1pdCA9IDM7Ci0JZWxzZQotCQlkYXRhX3JldHJ5X2xpbWl0ID0gSVdMX0RFRkFVTFRfVFhfUkVUUlk7Ci0JdHhfY21kLT5kYXRhX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQotCWlmICh0eF9pZCA+PSBJV0wzOV9DTURfUVVFVUVfTlVNKQotCQlydHNfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJcnRzX3JldHJ5X2xpbWl0ID0gNzsKLQotCWlmIChkYXRhX3JldHJ5X2xpbWl0IDwgcnRzX3JldHJ5X2xpbWl0KQotCQlydHNfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OwotCXR4X2NtZC0+cnRzX3JldHJ5X2xpbWl0ID0gcnRzX3JldHJ5X2xpbWl0OwotCi0JdHhfY21kLT5yYXRlID0gcmF0ZTsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0KLQkvKiBPRkRNICovCi0JdHhfY21kLT5zdXBwX3JhdGVzWzBdID0KLQkgICAoKHJhdGVfbWFzayAmIElXTF9PRkRNX1JBVEVTX01BU0spID4+IElXTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKLQotCS8qIENDSyAqLwotCXR4X2NtZC0+c3VwcF9yYXRlc1sxXSA9IChyYXRlX21hc2sgJiAweEYpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlR4IHN0YSBpZDogJWQsIHJhdGU6ICVkIChwbGNwKSwgZmxhZ3M6IDB4JTRYICIKLQkJICAgICAgICJjY2svb2ZkbSBtYXNrOiAweCV4LzB4JXhcbiIsIHN0YV9pZCwKLQkJICAgICAgIHR4X2NtZC0+cmF0ZSwgbGUzMl90b19jcHUodHhfY21kLT50eF9mbGFncyksCi0JCSAgICAgICB0eF9jbWQtPnN1cHBfcmF0ZXNbMV0sIHR4X2NtZC0+c3VwcF9yYXRlc1swXSk7Ci19Ci0KLXN0YXRpYyB1OCBpd2wzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgdTE2IHR4X3JhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKLQotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJcmV0dXJuIElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKLQotCXN0YXRpb24tPnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX1RYX1JBVEVfTVNLOwotCXN0YXRpb24tPnN0YS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNih0eF9yYXRlKTsKLQlzdGF0aW9uLT5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YXRpb24tPnN0YSwgQ01EX0FTWU5DKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiU0NBTEUgc3luYyBzdGF0aW9uICVkIHRvIHJhdGUgJWRcbiIsCi0JCQlzdGFfaWQsIHR4X3JhdGUpOwotCXJldHVybiBzdGFfaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbwotCi0JCWlmIChwY2lfcG1lX2NhcGFibGUocHJpdi0+cGNpX2RldiwgUENJX0QzY29sZCkpIHsKLQkJCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkJCUFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAotCQkJCQl+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLQotCQkJaXdsX3BvbGxfYml0KHByaXYsIENTUl9HUElPX0lOLAotCQkJCSAgICAgQ1NSX0dQSU9fSU5fVkFMX1ZBVVhfUFdSX1NSQywKLQkJCQkgICAgIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIsIDUwMDApOwotCQl9Ci0gKi8KLQotCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQlBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4sCi0JCQl+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKLQotCWl3bF9wb2xsX2JpdChwcml2LCBDU1JfR1BJT19JTiwgQ1NSX0dQSU9fSU5fVkFMX1ZNQUlOX1BXUl9TUkMsCi0JCSAgICAgQ1NSX0dQSU9fSU5fQklUX0FVWF9QT1dFUiwgNTAwMCk7CS8qIHVTICovCi19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1JCRF9CQVNFKDApLCByeHEtPmJkX2RtYSk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1JDU1JfUlBUUl9BRERSKDApLAotCQkJCQlyeHEtPnJiX3N0dHNfZG1hKTsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9XUFRSKDApLCAwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9DT05GSUcoMCksCi0JCUZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkRSQkRfRU5fRU5BQkxFIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfQklUX1dSX1NUVFNfRU4gfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjggfAotCQkoUlhfUVVFVUVfU0laRV9MT0cgPDwgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSkgfAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfSVJRX0RFU1RfSU5UX0hPU1QgfAotCQkoMSA8PCBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEgpIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0ZIKTsKLQotCS8qIGZha2UgcmVhZCB0byBmbHVzaCBhbGwgcHJldiBJL08gKi8KLQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgRkgzOV9SU1NSX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV90eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0KLQkvKiBieXBhc3MgbW9kZSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX01PREVfUkVHLCAweDIpOwotCi0JLyogUkEgMCBpcyBhY3RpdmUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9BUkFTVEFUX1JFRywgMHgwMSk7Ci0KLQkvKiBhbGwgNiBmaWZvIGFyZSBhY3RpdmUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9UWEZBQ1RfUkVHLCAweDNmKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1NCWVBfTU9ERV8xX1JFRywgMHgwMTAwMDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRywgMHgwMzAwMDIpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1RYRjRNRl9SRUcsIDB4MDAwMDA0KTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9UWEY1TUZfUkVHLCAweDAwMDAwNSk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVFNTUl9DQkJfQkFTRSwKLQkJCSAgICAgcHJpdi0+XzM5NDUuc2hhcmVkX3BoeXMpOwotCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1RTU1JfTVNHX0NPTkZJRywKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9UWFBEX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIgfAotCQlGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1NOT09QX1JEX1RGRF9PTiB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfQ0JCX09OIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USCB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfUlNQX1dBSVRfVEgpOwotCi0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3R4cV9jdHhfcmVzZXQgLSBSZXNldCBUWCBxdWV1ZSBjb250ZXh0Ci0gKgotICogRGVzdHJveXMgYWxsIERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0gYWdhaW4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3R4cV9jdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYzsKLQlpbnQgdHhxX2lkLCBzbG90c19udW07Ci0KLQlpd2wzOTQ1X2h3X3R4cV9jdHhfZnJlZShwcml2KTsKLQotCS8qIGFsbG9jYXRlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLwotCXJjID0gaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogVHggQ01EIHF1ZXVlICovCi0JcmMgPSBpd2wzOTQ1X3R4X3Jlc2V0KHByaXYpOwotCWlmIChyYykKLQkJZ290byBlcnJvcjsKLQotCS8qIFR4IHF1ZXVlKHMpICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7Ci0JCXNsb3RzX251bSA9ICh0eHFfaWQgPT0gSVdMMzlfQ01EX1FVRVVFX05VTSkgPwotCQkJCVRGRF9DTURfU0xPVFMgOiBURkRfVFhfQ01EX1NMT1RTOwotCQlyYyA9IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChwcml2LCAmcHJpdi0+dHhxW3R4cV9pZF0sCi0JCQkJCQlzbG90c19udW0sIHR4cV9pZCk7Ci0JCWlmIChyYykgewotCQkJSVdMX0VSUihwcml2LCAiVHggJWQgcXVldWUgaW5pdCBmYWlsZWRcbiIsIHR4cV9pZCk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotCi0gZXJyb3I6Ci0JaXdsMzk0NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0JcmV0dXJuIHJjOwotfQotCi0KLS8qCi0gKiBTdGFydCB1cCAzOTQ1J3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBhZnRlciBpdCBoYXMgYmVlbiByZXNldAotICogKGUuZy4gYWZ0ZXIgcGxhdGZvcm0gYm9vdCwgb3Igc2h1dGRvd24gdmlhIGl3bF9sZWdhY3lfYXBtX3N0b3AoKSkKLSAqIE5PVEU6ICBUaGlzIGRvZXMgbm90IGxvYWQgdUNvZGUgbm9yIHN0YXJ0IHRoZSBlbWJlZGRlZCBwcm9jZXNzb3IKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2FwbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gaXdsX2xlZ2FjeV9hcG1faW5pdChwcml2KTsKLQotCS8qIENsZWFyIEFQTUcgKE5JQydzIGludGVybmFsIHBvd2VyIG1hbmFnZW1lbnQpIGludGVycnVwdHMgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQVBNR19SVENfSU5UX01TS19SRUcsIDB4MCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfUlRDX0lOVF9TVFRfUkVHLCAweEZGRkZGRkZGKTsKLQotCS8qIFJlc2V0IHJhZGlvIGNoaXAgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKLQkJCQlBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7Ci0JdWRlbGF5KDUpOwotCWl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkJQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCByZXZfaWQgPSBwcml2LT5wY2lfZGV2LT5yZXZpc2lvbjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBEZXRlcm1pbmUgSFcgdHlwZSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIHJldl9pZCk7Ci0KLQlpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX1JUUCkKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJUUCB0eXBlXG4iKTsKLQllbHNlIGlmIChyZXZfaWQgJiBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIzOTQ1IFJBRElPLU1CIHR5cGVcbiIpOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NQik7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIjM5NDUgUkFESU8tTU0gdHlwZVxuIik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF8zOTQ1X01NKTsKLQl9Ci0KLQlpZiAoRUVQUk9NX1NLVV9DQVBfT1BfTU9ERV9NUkMgPT0gZWVwcm9tLT5za3VfY2FwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTS1UgT1AgbW9kZSBpcyBtcmNcbiIpOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfU0tVX01SQyk7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTS1UgT1AgbW9kZSBpcyBiYXNpY1xuIik7Ci0KLQlpZiAoKGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24gJiAweEYwKSA9PSAweEQwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIzOTQ1QUJHIHJldmlzaW9uIGlzIDB4JVhcbiIsCi0JCQkgICAgICAgZWVwcm9tLT5ib2FyZF9yZXZpc2lvbik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiMzk0NUFCRyByZXZpc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOwotCQlpd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUpOwotCX0KLQotCWlmIChlZXByb20tPmFsbWdvcl9tX3ZlcnNpb24gPD0gMSkgewotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhcmQgTSB0eXBlIEEgdmVyc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhcmQgTSB0eXBlIEIgdmVyc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7Ci0JCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCSAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVFNfU0lMSUNPTl9UWVBFX0IpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZWVwcm9tLT5za3VfY2FwICYgRUVQUk9NX1NLVV9DQVBfU1dfUkZfS0lMTF9FTkFCTEUpCi0JCUlXTF9ERUJVR19SRl9LSUxMKHByaXYsICJTVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKLQotCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSkKLQkJSVdMX0RFQlVHX1JGX0tJTEwocHJpdiwgIkhXIFJGIEtJTEwgc3VwcG9ydGVkIGluIEVFUFJPTS5cbiIpOwotfQotCi1pbnQgaXdsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDM5NDVfc2V0X3B3cl92bWFpbihwcml2KTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKHByaXYpOwotCi0JLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwotCWlmICghcnhxLT5iZCkgewotCQlyYyA9IGl3bF9sZWdhY3lfcnhfcXVldWVfYWxsb2MocHJpdik7Ci0JCWlmIChyYykgewotCQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgUnggcXVldWVcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9IGVsc2UKLQkJaXdsMzk0NV9yeF9xdWV1ZV9yZXNldChwcml2LCByeHEpOwotCi0JaXdsMzk0NV9yeF9yZXBsZW5pc2gocHJpdik7Ci0KLQlpd2wzOTQ1X3J4X2luaXQocHJpdiwgcnhxKTsKLQotCi0JLyogTG9vayBhdCB1c2luZyB0aGlzIGluc3RlYWQ6Ci0JcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHJ4cSk7Ci0JKi8KLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1dQVFIoMCksIHJ4cS0+d3JpdGUgJiB+Nyk7Ci0KLQlyYyA9IGl3bDM5NDVfdHhxX2N0eF9yZXNldChwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXNldF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0Ci0gKgotICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcwotICovCi12b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdHhxX2lkOwotCi0JLyogVHggcXVldWVzICovCi0JaWYgKHByaXYtPnR4cSkKLQkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07Ci0JCSAgICAgdHhxX2lkKyspCi0JCQlpZiAodHhxX2lkID09IElXTDM5X0NNRF9RVUVVRV9OVU0pCi0JCQkJaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZShwcml2KTsKLQkJCWVsc2UKLQkJCQlpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUocHJpdiwgdHhxX2lkKTsKLQotCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCi0JaXdsX2xlZ2FjeV90eHFfbWVtKHByaXYpOwotfQotCi12b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdHhxX2lkOwotCi0JLyogc3RvcCBTQ0QgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9NT0RFX1JFRywgMCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMCk7Ci0KLQkvKiByZXNldCBURkQgcXVldWVzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7Ci0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLCAweDApOwotCQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIMzlfVFNTUl9UWF9TVEFUVVMsCi0JCQkJRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRSh0eHFfaWQpLAotCQkJCTEwMDApOwotCX0KLQotCWl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHByaXYpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wCi0gKiByZXR1cm4gaW5kZXggZGVsdGEgaW50byBwb3dlciBnYWluIHNldHRpbmdzIHRhYmxlCi0qLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcChpbnQgbmV3X3JlYWRpbmcsIGludCBvbGRfcmVhZGluZykKLXsKLQlyZXR1cm4gKG5ld19yZWFkaW5nIC0gb2xkX3JlYWRpbmcpICogKC0xMSkgLyAxMDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UgLSBLZWVwIHRlbXBlcmF0dXJlIGluIHNhbmUgcmFuZ2UKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaXdsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UoaW50IHRlbXBlcmF0dXJlKQotewotCXJldHVybiAoKHRlbXBlcmF0dXJlIDwgLTI2MCkgfHwgKHRlbXBlcmF0dXJlID4gMjUpKSA/IDEgOiAwOwotfQotCi1pbnQgaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AyKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZQotICogZ2V0IHRoZSBjdXJyZW50IHRlbXBlcmF0dXJlIGJ5IHJlYWRpbmcgZnJvbSBOSUMKLSovCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JaW50IHRlbXBlcmF0dXJlOwotCi0JdGVtcGVyYXR1cmUgPSBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQotCS8qIGRyaXZlcidzIG9rYXkgcmFuZ2UgaXMgLTI2MCB0byArMjUuCi0JICogICBodW1hbiByZWFkYWJsZSBva2F5IHJhbmdlIGlzIDAgdG8gKzI4NSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJUZW1wZXJhdHVyZTogJWRcbiIsIHRlbXBlcmF0dXJlICsgSVdMX1RFTVBfQ09OVkVSVCk7Ci0KLQkvKiBoYW5kbGUgaW5zYW5lIHRlbXAgcmVhZGluZyAqLwotCWlmIChpd2wzOTQ1X2h3X3JlZ190ZW1wX291dF9vZl9yYW5nZSh0ZW1wZXJhdHVyZSkpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgYmFkIHRlbXBlcmF0dXJlIHZhbHVlICAlZFxuIiwgdGVtcGVyYXR1cmUpOwotCi0JCS8qIGlmIHJlYWxseSByZWFsbHkgaG90KD8pLAotCQkgKiAgIHN1YnN0aXR1dGUgdGhlIDNyZCBiYW5kL2dyb3VwJ3MgdGVtcCBtZWFzdXJlZCBhdCBmYWN0b3J5ICovCi0JCWlmIChwcml2LT5sYXN0X3RlbXBlcmF0dXJlID4gMTAwKQotCQkJdGVtcGVyYXR1cmUgPSBlZXByb20tPmdyb3Vwc1syXS50ZW1wZXJhdHVyZTsKLQkJZWxzZSAvKiBlbHNlIHVzZSBtb3N0IHJlY2VudCAic2FuZSIgdmFsdWUgZnJvbSBkcml2ZXIgKi8KLQkJCXRlbXBlcmF0dXJlID0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQl9Ci0KLQlyZXR1cm4gdGVtcGVyYXR1cmU7CS8qIHJhdywgbm90ICJodW1hbiByZWFkYWJsZSIgKi8KLX0KLQotLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgotICoKLSAqIEJvdGggYXJlIGxvd2VyIHRoYW4gb2xkZXIgdmVyc2lvbnMnIDkgZGVncmVlcyAqLwotI2RlZmluZSBJV0xfVEVNUEVSQVRVUkVfTElNSVRfVElNRVIgICA2Ci0KLS8qKgotICogaXdsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZCAtIGRldGVybWluZXMgaWYgbmV3IGNhbGlicmF0aW9uIGlzIG5lZWRlZAotICoKLSAqIHJlY29yZHMgbmV3IHRlbXBlcmF0dXJlIGluIHR4X21nci0+dGVtcGVyYXR1cmUuCi0gKiByZXBsYWNlcyB0eF9tZ3ItPmxhc3RfdGVtcGVyYXR1cmUgKm9ubHkqIGlmIGNhbGliIG5lZWRlZAotICogICAgKGFzc3VtZXMgY2FsbGVyIHdpbGwgYWN0dWFsbHkgZG8gdGhlIGNhbGlicmF0aW9uISkuICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0ZW1wX2RpZmY7Ci0KLQlwcml2LT50ZW1wZXJhdHVyZSA9IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCXRlbXBfZGlmZiA9IHByaXYtPnRlbXBlcmF0dXJlIC0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotCWlmICh0ZW1wX2RpZmYgPCAwKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkLFxuIiwgdGVtcF9kaWZmKTsKLQkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKLQl9IGVsc2UgaWYgKHRlbXBfZGlmZiA9PSAwKQotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNhbWUgdGVtcCxcbiIpOwotCWVsc2UKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWQsXG4iLCB0ZW1wX2RpZmYpOwotCi0JLyogaWYgd2UgZG9uJ3QgbmVlZCBjYWxpYnJhdGlvbiwgKmRvbid0KiB1cGRhdGUgbGFzdF90ZW1wZXJhdHVyZSAqLwotCWlmICh0ZW1wX2RpZmYgPCBJV0xfVEVNUEVSQVRVUkVfTElNSVRfVElNRVIpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJUaW1lZCB0aGVybWFsIGNhbGliIG5vdCBuZWVkZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlRpbWVkIHRoZXJtYWwgY2FsaWIgbmVlZGVkXG4iKTsKLQotCS8qIGFzc3VtZSB0aGF0IGNhbGxlciB3aWxsIGFjdHVhbGx5IGRvIGNhbGliIC4uLgotCSAqICAgdXBkYXRlIHRoZSAibGFzdCB0ZW1wZXJhdHVyZSIgdmFsdWUgKi8KLQlwcml2LT5sYXN0X3RlbXBlcmF0dXJlID0gcHJpdi0+dGVtcGVyYXR1cmU7Ci0JcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgSVdMX01BWF9HQUlOX0VOVFJJRVMgNzgKLSNkZWZpbmUgSVdMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRiAgLTUKLSNkZWZpbmUgSVdMX0NDS19GUk9NX09GRE1fSU5ERVhfRElGRiAoMTApCi0KLS8qIHJhZGlvIGFuZCBEU1AgcG93ZXIgdGFibGUsIGVhY2ggc3RlcCBpcyAxLzIgZEIuCi0gKiAxc3QgbnVtYmVyIGlzIGZvciBSRiBhbmFsb2cgZ2FpbiwgMm5kIG51bWJlciBpcyBmb3IgRFNQIHByZS1EQUMgZ2Fpbi4gKi8KLXN0YXRpYyBzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlWzJdW0lXTF9NQVhfR0FJTl9FTlRSSUVTXSA9IHsKLQl7Ci0JIHsyNTEsIDEyN30sCQkvKiAyLjQgR0h6LCBoaWdoZXN0IHBvd2VyICovCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyN30sCi0JIHsyNTEsIDEyNX0sCi0JIHsyNTEsIDExMH0sCi0JIHsyNTEsIDEwNX0sCi0JIHsyNTEsIDk4fSwKLQkgezE4NywgMTI1fSwKLQkgezE4NywgMTE1fSwKLQkgezE4NywgMTA4fSwKLQkgezE4NywgOTl9LAotCSB7MjQzLCAxMTl9LAotCSB7MjQzLCAxMTF9LAotCSB7MjQzLCAxMDV9LAotCSB7MjQzLCA5N30sCi0JIHsyNDMsIDkyfSwKLQkgezIxMSwgMTA2fSwKLQkgezIxMSwgMTAwfSwKLQkgezE3OSwgMTIwfSwKLQkgezE3OSwgMTEzfSwKLQkgezE3OSwgMTA3fSwKLQkgezE0NywgMTI1fSwKLQkgezE0NywgMTE5fSwKLQkgezE0NywgMTEyfSwKLQkgezE0NywgMTA2fSwKLQkgezE0NywgMTAxfSwKLQkgezE0NywgOTd9LAotCSB7MTQ3LCA5MX0sCi0JIHsxMTUsIDEwN30sCi0JIHsyMzUsIDEyMX0sCi0JIHsyMzUsIDExNX0sCi0JIHsyMzUsIDEwOX0sCi0JIHsyMDMsIDEyN30sCi0JIHsyMDMsIDEyMX0sCi0JIHsyMDMsIDExNX0sCi0JIHsyMDMsIDEwOH0sCi0JIHsyMDMsIDEwMn0sCi0JIHsyMDMsIDk2fSwKLQkgezIwMywgOTJ9LAotCSB7MTcxLCAxMTB9LAotCSB7MTcxLCAxMDR9LAotCSB7MTcxLCA5OH0sCi0JIHsxMzksIDExNn0sCi0JIHsyMjcsIDEyNX0sCi0JIHsyMjcsIDExOX0sCi0JIHsyMjcsIDExM30sCi0JIHsyMjcsIDEwN30sCi0JIHsyMjcsIDEwMX0sCi0JIHsyMjcsIDk2fSwKLQkgezE5NSwgMTEzfSwKLQkgezE5NSwgMTA2fSwKLQkgezE5NSwgMTAyfSwKLQkgezE5NSwgOTV9LAotCSB7MTYzLCAxMTN9LAotCSB7MTYzLCAxMDZ9LAotCSB7MTYzLCAxMDJ9LAotCSB7MTYzLCA5NX0sCi0JIHsxMzEsIDExM30sCi0JIHsxMzEsIDEwNn0sCi0JIHsxMzEsIDEwMn0sCi0JIHsxMzEsIDk1fSwKLQkgezk5LCAxMTN9LAotCSB7OTksIDEwNn0sCi0JIHs5OSwgMTAyfSwKLQkgezk5LCA5NX0sCi0JIHs2NywgMTEzfSwKLQkgezY3LCAxMDZ9LAotCSB7NjcsIDEwMn0sCi0JIHs2NywgOTV9LAotCSB7MzUsIDExM30sCi0JIHszNSwgMTA2fSwKLQkgezM1LCAxMDJ9LAotCSB7MzUsIDk1fSwKLQkgezMsIDExM30sCi0JIHszLCAxMDZ9LAotCSB7MywgMTAyfSwKLQkgezMsIDk1fSB9LAkJLyogMi40IEdIeiwgbG93ZXN0IHBvd2VyICovCi0JewotCSB7MjUxLCAxMjd9LAkJLyogNS54IEdIeiwgaGlnaGVzdCBwb3dlciAqLwotCSB7MjUxLCAxMjB9LAotCSB7MjUxLCAxMTR9LAotCSB7MjE5LCAxMTl9LAotCSB7MjE5LCAxMDF9LAotCSB7MTg3LCAxMTN9LAotCSB7MTg3LCAxMDJ9LAotCSB7MTU1LCAxMTR9LAotCSB7MTU1LCAxMDN9LAotCSB7MTIzLCAxMTd9LAotCSB7MTIzLCAxMDd9LAotCSB7MTIzLCA5OX0sCi0JIHsxMjMsIDkyfSwKLQkgezkxLCAxMDh9LAotCSB7NTksIDEyNX0sCi0JIHs1OSwgMTE4fSwKLQkgezU5LCAxMDl9LAotCSB7NTksIDEwMn0sCi0JIHs1OSwgOTZ9LAotCSB7NTksIDkwfSwKLQkgezI3LCAxMDR9LAotCSB7MjcsIDk4fSwKLQkgezI3LCA5Mn0sCi0JIHsxMTUsIDExOH0sCi0JIHsxMTUsIDExMX0sCi0JIHsxMTUsIDEwNH0sCi0JIHs4MywgMTI2fSwKLQkgezgzLCAxMjF9LAotCSB7ODMsIDExM30sCi0JIHs4MywgMTA1fSwKLQkgezgzLCA5OX0sCi0JIHs1MSwgMTE4fSwKLQkgezUxLCAxMTF9LAotCSB7NTEsIDEwNH0sCi0JIHs1MSwgOTh9LAotCSB7MTksIDExNn0sCi0JIHsxOSwgMTA5fSwKLQkgezE5LCAxMDJ9LAotCSB7MTksIDk4fSwKLQkgezE5LCA5M30sCi0JIHsxNzEsIDExM30sCi0JIHsxNzEsIDEwN30sCi0JIHsxNzEsIDk5fSwKLQkgezEzOSwgMTIwfSwKLQkgezEzOSwgMTEzfSwKLQkgezEzOSwgMTA3fSwKLQkgezEzOSwgOTl9LAotCSB7MTA3LCAxMjB9LAotCSB7MTA3LCAxMTN9LAotCSB7MTA3LCAxMDd9LAotCSB7MTA3LCA5OX0sCi0JIHs3NSwgMTIwfSwKLQkgezc1LCAxMTN9LAotCSB7NzUsIDEwN30sCi0JIHs3NSwgOTl9LAotCSB7NDMsIDEyMH0sCi0JIHs0MywgMTEzfSwKLQkgezQzLCAxMDd9LAotCSB7NDMsIDk5fSwKLQkgezExLCAxMjB9LAotCSB7MTEsIDExM30sCi0JIHsxMSwgMTA3fSwKLQkgezExLCA5OX0sCi0JIHsxMzEsIDEwN30sCi0JIHsxMzEsIDk5fSwKLQkgezk5LCAxMjB9LAotCSB7OTksIDExM30sCi0JIHs5OSwgMTA3fSwKLQkgezk5LCA5OX0sCi0JIHs2NywgMTIwfSwKLQkgezY3LCAxMTN9LAotCSB7NjcsIDEwN30sCi0JIHs2NywgOTl9LAotCSB7MzUsIDEyMH0sCi0JIHszNSwgMTEzfSwKLQkgezM1LCAxMDd9LAotCSB7MzUsIDk5fSwKLQkgezMsIDEyMH0gfQkJLyogNS54IEdIeiwgbG93ZXN0IHBvd2VyICovCi19OwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChpbnQgaW5kZXgpCi17Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGluZGV4ID49IElXTF9NQVhfR0FJTl9FTlRSSUVTKQotCQlyZXR1cm4gSVdMX01BWF9HQUlOX0VOVFJJRVMgLSAxOwotCXJldHVybiAodTgpIGluZGV4OwotfQotCi0vKiBLaWNrIG9mZiB0aGVybWFsIHJlY2FsaWJyYXRpb24gY2hlY2sgZXZlcnkgNjAgc2Vjb25kcyAqLwotI2RlZmluZSBSRUdfUkVDQUxJQl9QRVJJT0QgKDYwKQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyIC0gU2V0IFR4IHBvd2VyIGZvciBzY2FuIHByb2JlIHJlcXVlc3RzCi0gKgotICogU2V0IChpbiBvdXIgY2hhbm5lbCBpbmZvIGRhdGFiYXNlKSB0aGUgZGlyZWN0IHNjYW4gVHggcG93ZXIgZm9yIDEgTWJpdCAoQ0NLKQotICogb3IgNiBNYml0IChPRkRNKSByYXRlcy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgc2Nhbl90YmxfaW5kZXgsCi0JCQkgICAgICAgczMyIHJhdGVfaW5kZXgsIGNvbnN0IHM4ICpjbGlwX3B3cnMsCi0JCQkgICAgICAgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8sCi0JCQkgICAgICAgaW50IGJhbmRfaW5kZXgpCi17Ci0Jc3RydWN0IGl3bDM5NDVfc2Nhbl9wb3dlcl9pbmZvICpzY2FuX3Bvd2VyX2luZm87Ci0JczggcG93ZXI7Ci0JdTggcG93ZXJfaW5kZXg7Ci0KLQlzY2FuX3Bvd2VyX2luZm8gPSAmY2hfaW5mby0+c2Nhbl9wd3JfaW5mb1tzY2FuX3RibF9pbmRleF07Ci0KLQkvKiB1c2UgdGhpcyBjaGFubmVsIGdyb3VwJ3MgNk1iaXQgY2xpcHBpbmcvc2F0dXJhdGlvbiBwd3IsCi0JICogICBidXQgY2FwIGF0IHJlZ3VsYXRvcnkgc2NhbiBwb3dlciByZXN0cmljdGlvbiAoc2V0IGR1cmluZyBpbml0Ci0JICogICBiYXNlZCBvbiBlZXByb20gY2hhbm5lbCBkYXRhKSBmb3IgdGhpcyBjaGFubmVsLiAgKi8KLQlwb3dlciA9IG1pbihjaF9pbmZvLT5zY2FuX3Bvd2VyLCBjbGlwX3B3cnNbSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEVdKTsKLQotCXBvd2VyID0gbWluKHBvd2VyLCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCk7Ci0Jc2Nhbl9wb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKLQotCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG5ldyBzY2FuICpwb3dlciogYW5kIGN1cnJlbnQgIm5vcm1hbCIKLQkgKiAgIFR4ICpwb3dlciogZm9yIDZNYi4gIFVzZSB0aGlzIGRpZmZlcmVuY2UgKHgyKSB0byBhZGp1c3QgdGhlCi0JICogICBjdXJyZW50ICJub3JtYWwiIHRlbXBlcmF0dXJlLWNvbXBlbnNhdGVkIFR4IHBvd2VyICppbmRleCogZm9yCi0JICogICB0aGlzIHJhdGUgKDFNYiBvciA2TWIpIHRvIHlpZWxkIG5ldyB0ZW1wLWNvbXBlbnNhdGVkIHNjYW4gcG93ZXIKLQkgKiAgICppbmRleCouICovCi0JcG93ZXJfaW5kZXggPSBjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXhdLnBvd2VyX3RhYmxlX2luZGV4Ci0JICAgIC0gKHBvd2VyIC0gY2hfaW5mby0+cG93ZXJfaW5mbwotCSAgICAgICBbSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEVdLnJlcXVlc3RlZF9wb3dlcikgKiAyOwotCi0JLyogc3RvcmUgcmVmZXJlbmNlIGluZGV4IHRoYXQgd2UgdXNlIHdoZW4gYWRqdXN0aW5nICphbGwqIHNjYW4KLQkgKiAgIHBvd2Vycy4gIFNvIHdlIGNhbiBhY2NvbW1vZGF0ZSB1c2VyIChhbGwgY2hhbm5lbCkgb3Igc3BlY3RydW0KLQkgKiAgIG1hbmFnZW1lbnQgKHNpbmdsZSBjaGFubmVsKSBwb3dlciBjaGFuZ2VzICJiZXR3ZWVuIiB0ZW1wZXJhdHVyZQotCSAqICAgZmVlZGJhY2sgY29tcGVuc2F0aW9uIHByb2NlZHVyZXMuCi0JICogZG9uJ3QgZm9yY2UgZml0IHRoaXMgcmVmZXJlbmNlIGluZGV4IGludG8gZ2FpbiB0YWJsZTsgaXQgbWF5IGJlIGEKLQkgKiAgIG5lZ2F0aXZlIG51bWJlci4gIFRoaXMgd2lsbCBoZWxwIGF2b2lkIGVycm9ycyB3aGVuIHdlJ3JlIGF0Ci0JICogICB0aGUgbG93ZXIgYm91bmRzIChoaWdoZXN0IGdhaW5zLCBmb3Igd2FybWVzdCB0ZW1wZXJhdHVyZXMpCi0JICogICBvZiB0aGUgdGFibGUuICovCi0KLQkvKiBkb24ndCBleGNlZWQgdGFibGUgYm91bmRzIGZvciAicmVhbCIgc2V0dGluZyAqLwotCXBvd2VyX2luZGV4ID0gaXdsMzk0NV9od19yZWdfZml4X3Bvd2VyX2luZGV4KHBvd2VyX2luZGV4KTsKLQotCXNjYW5fcG93ZXJfaW5mby0+cG93ZXJfdGFibGVfaW5kZXggPSBwb3dlcl9pbmRleDsKLQlzY2FuX3Bvd2VyX2luZm8tPnRwYy50eF9nYWluID0KLQkgICAgcG93ZXJfZ2Fpbl90YWJsZVtiYW5kX2luZGV4XVtwb3dlcl9pbmRleF0udHhfZ2FpbjsKLQlzY2FuX3Bvd2VyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQotCSAgICBwb3dlcl9nYWluX3RhYmxlW2JhbmRfaW5kZXhdW3Bvd2VyX2luZGV4XS5kc3BfYXR0ZW47Ci19Ci0KLS8qKgotICogaXdsMzk0NV9zZW5kX3R4X3Bvd2VyIC0gZmlsbCBpbiBUeCBQb3dlciBjb21tYW5kIHdpdGggZ2FpbiBzZXR0aW5ncwotICoKLSAqIENvbmZpZ3VyZXMgcG93ZXIgc2V0dGluZ3MgZm9yIGFsbCByYXRlcyBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbCwKLSAqIHVzaW5nIHZhbHVlcyBmcm9tIGNoYW5uZWwgaW5mbyBzdHJ1Y3QsIGFuZCBzZW5kIHRvIE5JQwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJhdGVfaWR4LCBpOwotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kIHR4cG93ZXIgPSB7Ci0JCS5jaGFubmVsID0gcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmNoYW5uZWwsCi0JfTsKLQl1MTYgY2hhbjsKLQotCWlmIChXQVJOX09OQ0UodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpLAotCQkgICAgICAiVFggUG93ZXIgcmVxdWVzdGVkIHdoaWxlIHNjYW5uaW5nIVxuIikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JY2hhbiA9IGxlMTZfdG9fY3B1KHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5jaGFubmVsKTsKLQotCXR4cG93ZXIuYmFuZCA9IChwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8gMCA6IDE7Ci0JY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBwcml2LT5iYW5kLCBjaGFuKTsKLQlpZiAoIWNoX2luZm8pIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBpbmZvIGZvciBjaGFubmVsICVkIFslZF1cbiIsCi0JCQljaGFuLCBwcml2LT5iYW5kKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJOb3QgY2FsbGluZyBUWF9QV1JfVEFCTEVfQ01EIG9uICIKLQkJCQkibm9uLVR4IGNoYW5uZWwuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZmlsbCBjbWQgd2l0aCBwb3dlciBzZXR0aW5ncyBmb3IgYWxsIHJhdGVzIGZvciBjdXJyZW50IGNoYW5uZWwgKi8KLQkvKiBGaWxsIE9GRE0gcmF0ZSAqLwotCWZvciAocmF0ZV9pZHggPSBJV0xfRklSU1RfT0ZETV9SQVRFLCBpID0gMDsKLQkgICAgIHJhdGVfaWR4IDw9IElXTDM5X0xBU1RfT0ZETV9SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKLQotCQl0eHBvd2VyLnBvd2VyW2ldLnRwYyA9IGNoX2luZm8tPnBvd2VyX2luZm9baV0udHBjOwotCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUgPSBpd2wzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOwotCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiY2ggJWQ6JWQgcmYgJWQgZHNwICUzZCByYXRlIGNvZGUgMHglMDJ4XG4iLAotCQkJCWxlMTZfdG9fY3B1KHR4cG93ZXIuY2hhbm5lbCksCi0JCQkJdHhwb3dlci5iYW5kLAotCQkJCXR4cG93ZXIucG93ZXJbaV0udHBjLnR4X2dhaW4sCi0JCQkJdHhwb3dlci5wb3dlcltpXS50cGMuZHNwX2F0dGVuLAotCQkJCXR4cG93ZXIucG93ZXJbaV0ucmF0ZSk7Ci0JfQotCS8qIEZpbGwgQ0NLIHJhdGVzICovCi0JZm9yIChyYXRlX2lkeCA9IElXTF9GSVJTVF9DQ0tfUkFURTsKLQkgICAgIHJhdGVfaWR4IDw9IElXTF9MQVNUX0NDS19SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKLQkJdHhwb3dlci5wb3dlcltpXS50cGMgPSBjaF9pbmZvLT5wb3dlcl9pbmZvW2ldLnRwYzsKLQkJdHhwb3dlci5wb3dlcltpXS5yYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKLQotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgImNoICVkOiVkIHJmICVkIGRzcCAlM2QgcmF0ZSBjb2RlIDB4JTAyeFxuIiwKLQkJCQlsZTE2X3RvX2NwdSh0eHBvd2VyLmNoYW5uZWwpLAotCQkJCXR4cG93ZXIuYmFuZCwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy50eF9nYWluLAotCQkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUpOwotCX0KLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELAotCQkJCXNpemVvZihzdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kKSwKLQkJCQkmdHhwb3dlcik7Ci0KLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyIC0gQ29uZmlndXJlcyBwb3dlciB0YWJsZXMgYXQgbmV3IGxldmVscwotICogQGNoX2luZm86IENoYW5uZWwgdG8gdXBkYXRlLiAgVXNlcyBwb3dlcl9pbmZvLnJlcXVlc3RlZF9wb3dlci4KLSAqCi0gKiBSZXBsYWNlIHJlcXVlc3RlZF9wb3dlciBhbmQgYmFzZV9wb3dlcl9pbmRleCBjaF9pbmZvIGZpZWxkcyBmb3IKLSAqIG9uZSBjaGFubmVsLgotICoKLSAqIENhbGxlZCBpZiB1c2VyIG9yIHNwZWN0cnVtIG1hbmFnZW1lbnQgY2hhbmdlcyBwb3dlciBwcmVmZXJlbmNlcy4KLSAqIFRha2VzIGludG8gYWNjb3VudCBoL3cgYW5kIG1vZHVsYXRpb24gbGltaXRhdGlvbnMgKGNsaXAgcG93ZXIpLgotICoKLSAqIFRoaXMgZG9lcyAqbm90KiBzZW5kIGFueXRoaW5nIHRvIE5JQywganVzdCBzZXRzIHVwIGNoX2luZm8gZm9yIG9uZSBjaGFubmVsLgotICoKLSAqIE5PVEU6IHJlZ19jb21wZW5zYXRlX2Zvcl90ZW1wZXJhdHVyZV9kaWYoKSAqbXVzdCogYmUgcnVuIGFmdGVyIHRoaXMgdG8KLSAqCSBwcm9wZXJseSBmaWxsIG91dCB0aGUgc2NhbiBwb3dlcnMsIGFuZCBhY3R1YWwgaC93IGdhaW4gc2V0dGluZ3MsCi0gKgkgYW5kIHNlbmQgY2hhbmdlcyB0byBOSUMKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0Jc3RydWN0IGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwb3dlcl9pbmZvOwotCWludCBwb3dlcl9jaGFuZ2VkID0gMDsKLQlpbnQgaTsKLQljb25zdCBzOCAqY2xpcF9wd3JzOwotCWludCBwb3dlcjsKLQotCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLwotCWNsaXBfcHdycyA9IHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS5jbGlwX3Bvd2VyczsKLQotCS8qIEdldCB0aGlzIGNoYW5uZWwncyByYXRlLXRvLWN1cnJlbnQtcG93ZXIgc2V0dGluZ3MgdGFibGUgKi8KLQlwb3dlcl9pbmZvID0gY2hfaW5mby0+cG93ZXJfaW5mbzsKLQotCS8qIHVwZGF0ZSBPRkRNIFR4cG93ZXIgc2V0dGluZ3MgKi8KLQlmb3IgKGkgPSBJV0xfUkFURV82TV9JTkRFWF9UQUJMRTsgaSA8PSBJV0xfUkFURV81NE1fSU5ERVhfVEFCTEU7Ci0JICAgICBpKyssICsrcG93ZXJfaW5mbykgewotCQlpbnQgZGVsdGFfaWR4OwotCi0JCS8qIGxpbWl0IG5ldyBwb3dlciB0byBiZSBubyBtb3JlIHRoYW4gaC93IGNhcGFiaWxpdHkgKi8KLQkJcG93ZXIgPSBtaW4oY2hfaW5mby0+Y3Vycl90eHBvdywgY2xpcF9wd3JzW2ldKTsKLQkJaWYgKHBvd2VyID09IHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHJlcXVlc3RlZCBwb3dlcnMsCi0JCSAqICAgIHVwZGF0ZSBiYXNlIChub24tdGVtcC1jb21wZW5zYXRlZCkgcG93ZXIgaW5kZXggKi8KLQkJZGVsdGFfaWR4ID0gKHBvd2VyIC0gcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyKSAqIDI7Ci0JCXBvd2VyX2luZm8tPmJhc2VfcG93ZXJfaW5kZXggLT0gZGVsdGFfaWR4OwotCi0JCS8qIHNhdmUgbmV3IHJlcXVlc3RlZCBwb3dlciB2YWx1ZSAqLwotCQlwb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKLQotCQlwb3dlcl9jaGFuZ2VkID0gMTsKLQl9Ci0KLQkvKiB1cGRhdGUgQ0NLIFR4cG93ZXIgc2V0dGluZ3MsIGJhc2VkIG9uIE9GRE0gMTJNIHNldHRpbmcgLi4uCi0JICogICAgLi4uIGFsbCBDQ0sgcG93ZXIgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBhcmUgdGhlICpzYW1lKi4gKi8KLQlpZiAocG93ZXJfY2hhbmdlZCkgewotCQlwb3dlciA9Ci0JCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW0lXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRV0uCi0JCSAgICByZXF1ZXN0ZWRfcG93ZXIgKyBJV0xfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOwotCi0JCS8qIGRvIGFsbCBDQ0sgcmF0ZXMnIGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZXMgKi8KLQkJZm9yIChpID0gSVdMX1JBVEVfMU1fSU5ERVhfVEFCTEU7IGkgPD0gSVdMX1JBVEVfMTFNX0lOREVYX1RBQkxFOyBpKyspIHsKLQkJCXBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOwotCQkJcG93ZXJfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9Ci0JCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tJV0xfUkFURV8xMk1fSU5ERVhfVEFCTEVdLgotCQkJICAgIGJhc2VfcG93ZXJfaW5kZXggKyBJV0xfQ0NLX0ZST01fT0ZETV9JTkRFWF9ESUZGOwotCQkJKytwb3dlcl9pbmZvOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfZ2V0X2NoX3R4cG93ZXJfbGltaXQgLSByZXR1cm5zIG5ldyBwb3dlciBsaW1pdCBmb3IgY2hhbm5lbAotICoKLSAqIE5PVEU6IFJldHVybmVkIHBvd2VyIGxpbWl0IG1heSBiZSBsZXNzIChidXQgbm90IG1vcmUpIHRoYW4gcmVxdWVzdGVkLAotICoJIGJhc2VkIHN0cmljdGx5IG9uIHJlZ3VsYXRvcnkgKGVlcHJvbSBhbmQgc3BlY3RydW0gbWd0KSBsaW1pdGF0aW9ucwotICoJIChubyBjb25zaWRlcmF0aW9uIGZvciBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMpLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0KHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXM4IG1heF9wb3dlcjsKLQotI2lmIDAKLQkvKiBpZiB3ZSdyZSB1c2luZyBUR2QgbGltaXRzLCB1c2UgbG93ZXIgb2YgVEdkIG9yIEVFUFJPTSAqLwotCWlmIChjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIgIT0gMCkKLQkJbWF4X3Bvd2VyID0gbWluKGNoX2luZm8tPnRnZF9kYXRhLm1heF9wb3dlciwKLQkJCQljaF9pbmZvLT5lZXByb20ubWF4X3Bvd2VyX2F2Zyk7Ci0KLQkvKiBlbHNlIGp1c3QgdXNlIEVFUFJPTSBsaW1pdHMgKi8KLQllbHNlCi0jZW5kaWYKLQkJbWF4X3Bvd2VyID0gY2hfaW5mby0+ZWVwcm9tLm1heF9wb3dlcl9hdmc7Ci0KLQlyZXR1cm4gbWluKG1heF9wb3dlciwgY2hfaW5mby0+bWF4X3Bvd2VyX2F2Zyk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAgLSBDb21wZW5zYXRlIGZvciB0ZW1wZXJhdHVyZQotICoKLSAqIENvbXBlbnNhdGUgdHhwb3dlciBzZXR0aW5ncyBvZiAqYWxsKiBjaGFubmVscyBmb3IgdGVtcGVyYXR1cmUuCi0gKiBUaGlzIG9ubHkgYWNjb3VudHMgZm9yIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZQotICogICBhbmQgdGhlIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmVzLCBhbmQgYmFzZXMgdGhlIG5ldyBzZXR0aW5ncwotICogICBvbiB0aGUgY2hhbm5lbCdzIGJhc2VfcG93ZXJfaW5kZXguCi0gKgotICogSWYgUnhPbiBpcyAiYXNzb2NpYXRlZCIsIHRoaXMgc2VuZHMgdGhlIG5ldyBUeHBvd2VyIHRvIE5JQyEKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqKXByaXYtPmVlcHJvbTsKLQlpbnQgZGVsdGFfaW5kZXg7Ci0JY29uc3QgczggKmNsaXBfcHdyczsgLyogYXJyYXkgb2YgaC93IG1heCBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLwotCXU4IGFfYmFuZDsKLQl1OCByYXRlX2luZGV4OwotCXU4IHNjYW5fdGJsX2luZGV4OwotCXU4IGk7Ci0JaW50IHJlZl90ZW1wOwotCWludCB0ZW1wZXJhdHVyZSA9IHByaXYtPnRlbXBlcmF0dXJlOwotCi0JaWYgKHByaXYtPmRpc2FibGVfdHhfcG93ZXJfY2FsIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogZG8gbm90IHBlcmZvcm0gdHggcG93ZXIgY2FsaWJyYXRpb24gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCS8qIHNldCB1cCBuZXcgVHggcG93ZXIgaW5mbyBmb3IgZWFjaCBhbmQgZXZlcnkgY2hhbm5lbCwgMi40IGFuZCA1LnggKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCWNoX2luZm8gPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCi0JCS8qIEdldCB0aGlzIGNobmxncnAncyBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlICovCi0JCXJlZl90ZW1wID0gKHMxNillZXByb20tPmdyb3Vwc1tjaF9pbmZvLT5ncm91cF9pbmRleF0uCi0JCSAgICB0ZW1wZXJhdHVyZTsKLQotCQkvKiBnZXQgcG93ZXIgaW5kZXggYWRqdXN0bWVudCBiYXNlZCBvbiBjdXJyZW50IGFuZCBmYWN0b3J5Ci0JCSAqIHRlbXBzICovCi0JCWRlbHRhX2luZGV4ID0gaXdsMzk0NV9od19yZWdfYWRqdXN0X3Bvd2VyX2J5X3RlbXAodGVtcGVyYXR1cmUsCi0JCQkJCQkJICAgICAgcmVmX3RlbXApOwotCi0JCS8qIHNldCB0eCBwb3dlciB2YWx1ZSBmb3IgYWxsIHJhdGVzLCBPRkRNIGFuZCBDQ0sgKi8KLQkJZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IElXTF9SQVRFX0NPVU5UXzM5NDU7Ci0JCSAgICAgcmF0ZV9pbmRleCsrKSB7Ci0JCQlpbnQgcG93ZXJfaWR4ID0KLQkJCSAgICBjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXhdLmJhc2VfcG93ZXJfaW5kZXg7Ci0KLQkJCS8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGUgKi8KLQkJCXBvd2VyX2lkeCArPSBkZWx0YV9pbmRleDsKLQotCQkJLyogc3RheSB3aXRoaW4gdGFibGUgcmFuZ2UgKi8KLQkJCXBvd2VyX2lkeCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwb3dlcl9pZHgpOwotCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS4KLQkJCSAgICBwb3dlcl90YWJsZV9pbmRleCA9ICh1OCkgcG93ZXJfaWR4OwotCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS50cGMgPQotCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdOwotCQl9Ci0KLQkJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtdG8tbWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCi0JCWNsaXBfcHdycyA9IHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS5jbGlwX3Bvd2VyczsKLQotCQkvKiBzZXQgc2NhbiB0eCBwb3dlciwgMU1iaXQgZm9yIENDSywgNk1iaXQgZm9yIE9GRE0gKi8KLQkJZm9yIChzY2FuX3RibF9pbmRleCA9IDA7Ci0JCSAgICAgc2Nhbl90YmxfaW5kZXggPCBJV0xfTlVNX1NDQU5fUkFURVM7IHNjYW5fdGJsX2luZGV4KyspIHsKLQkJCXMzMiBhY3R1YWxfaW5kZXggPSAoc2Nhbl90YmxfaW5kZXggPT0gMCkgPwotCQkJICAgIElXTF9SQVRFXzFNX0lOREVYX1RBQkxFIDogSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEU7Ci0JCQlpd2wzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihwcml2LCBzY2FuX3RibF9pbmRleCwKLQkJCQkJICAgYWN0dWFsX2luZGV4LCBjbGlwX3B3cnMsCi0JCQkJCSAgIGNoX2luZm8sIGFfYmFuZCk7Ci0JCX0KLQl9Ci0KLQkvKiBzZW5kIFR4cG93ZXIgY29tbWFuZCBmb3IgY3VycmVudCBjaGFubmVsIHRvIHVjb2RlICovCi0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci19Ci0KLWludCBpd2wzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHBvd2VyKQotewotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCXM4IG1heF9wb3dlcjsKLQl1OCBhX2JhbmQ7Ci0JdTggaTsKLQotCWlmIChwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9PSBwb3dlcikgewotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlJlcXVlc3RlZCBUeCBwb3dlciBzYW1lIGFzIGN1cnJlbnQgIgotCQkJCSJsaW1pdDogJWRkQm0uXG4iLCBwb3dlcik7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiU2V0dGluZyB1cHBlciBsaW1pdCBjbGFtcCB0byAlZGRCbS5cbiIsIHBvd2VyKTsKLQlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IHBvd2VyOwotCi0JLyogc2V0IHVwIG5ldyBUeCBwb3dlcnMgZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCWNoX2luZm8gPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCi0JCS8qIGZpbmQgbWluaW11bSBwb3dlciBvZiBhbGwgdXNlciBhbmQgcmVndWxhdG9yeSBjb25zdHJhaW50cwotCQkgKiAgICAoZG9lcyBub3QgY29uc2lkZXIgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKSAqLwotCQltYXhfcG93ZXIgPSBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChjaF9pbmZvKTsKLQkJbWF4X3Bvd2VyID0gbWluKHBvd2VyLCBtYXhfcG93ZXIpOwotCQlpZiAobWF4X3Bvd2VyICE9IGNoX2luZm8tPmN1cnJfdHhwb3cpIHsKLQkJCWNoX2luZm8tPmN1cnJfdHhwb3cgPSBtYXhfcG93ZXI7Ci0KLQkJCS8qIHRoaXMgY29uc2lkZXJzIHRoZSBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMgKi8KLQkJCWl3bDM5NDVfaHdfcmVnX3NldF9uZXdfcG93ZXIocHJpdiwgY2hfaW5mbyk7Ci0JCX0KLQl9Ci0KLQkvKiB1cGRhdGUgdHhwb3dlciBzZXR0aW5ncyBmb3IgYWxsIGNoYW5uZWxzLAotCSAqICAgc2VuZCB0byBOSUMgaWYgYXNzb2NpYXRlZC4gKi8KLQlpd2wzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHByaXYpOwotCWl3bDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKHByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1JYT05fQVNTT0MsCi0JCS5sZW4gPSBzaXplb2Yocnhvbl9hc3NvYyksCi0JCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKLQkJLmRhdGEgPSAmcnhvbl9hc3NvYywKLQl9OwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uMSA9ICZjdHgtPnN0YWdpbmc7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24yID0gJmN0eC0+YWN0aXZlOwotCi0JaWYgKChyeG9uMS0+ZmxhZ3MgPT0gcnhvbjItPmZsYWdzKSAmJgotCSAgICAocnhvbjEtPmZpbHRlcl9mbGFncyA9PSByeG9uMi0+ZmlsdGVyX2ZsYWdzKSAmJgotCSAgICAocnhvbjEtPmNja19iYXNpY19yYXRlcyA9PSByeG9uMi0+Y2NrX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPm9mZG1fYmFzaWNfcmF0ZXMgPT0gcnhvbjItPm9mZG1fYmFzaWNfcmF0ZXMpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJVc2luZyBjdXJyZW50IFJYT05fQVNTT0MuICBOb3QgcmVzZW5kaW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJ4b25fYXNzb2MuZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0Jcnhvbl9hc3NvYy5maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOwotCXJ4b25fYXNzb2Mub2ZkbV9iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2MuY2NrX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLnJlc2VydmVkID0gMDsKLQotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcGt0ID0gKHN0cnVjdCBpd2xfcnhfcGFja2V0ICopY21kLnJlcGx5X3BhZ2U7Ci0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9SWE9OX0FTU09DIGNvbW1hbmRcbiIpOwotCQlyYyA9IC1FSU87Ci0JfQotCi0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2NvbW1pdF9yeG9uIC0gY29tbWl0IHN0YWdpbmdfcnhvbiB0byBoYXJkd2FyZQotICoKLSAqIFRoZSBSWE9OIGNvbW1hbmQgaW4gc3RhZ2luZ19yeG9uIGlzIGNvbW1pdHRlZCB0byB0aGUgaGFyZHdhcmUgYW5kCi0gKiB0aGUgYWN0aXZlX3J4b24gc3RydWN0dXJlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGRhdGEuICBUaGlzCi0gKiBmdW5jdGlvbiBjb3JyZWN0bHkgdHJhbnNpdGlvbnMgb3V0IG9mIHRoZSBSWE9OX0FTU09DX01TSyBzdGF0ZSBpZgotICogYSBIVyB0dW5lIGlzIHJlcXVpcmVkIGJhc2VkIG9uIHRoZSBSWE9OIHN0cnVjdHVyZSBjaGFuZ2VzLgotICovCi1pbnQgaXdsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JLyogY2FzdCBhd2F5IHRoZSBjb25zdCBmb3IgYWN0aXZlX3J4b24gaW4gdGhpcyBmdW5jdGlvbiAqLwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOwotCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICpzdGFnaW5nX3J4b24gPSAodm9pZCAqKSZjdHgtPnN0YWdpbmc7Ci0JaW50IHJjID0gMDsKLQlib29sIG5ld19hc3NvYyA9ICEhKHN0YWdpbmdfcnhvbi0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtMTsKLQotCS8qIGFsd2F5cyBnZXQgdGltZXN0YW1wIHdpdGggUnggZnJhbWUgKi8KLQlzdGFnaW5nX3J4b24tPmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKLQotCS8qIHNlbGVjdCBhbnRlbm5hICovCi0Jc3RhZ2luZ19yeG9uLT5mbGFncyAmPQotCSAgICB+KFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX1NFTF9NU0spOwotCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgfD0gaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhwcml2KTsKLQotCXJjID0gaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChwcml2LCBjdHgpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIFJYT04gY29uZmlndXJhdGlvbi4gIE5vdCBjb21taXR0aW5nLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gc2VuZCBhIGZ1bGwgUlhPTiwgd2UgY2FuIHVzZQotCSAqIGl3bDM5NDVfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKLQkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCi0JaWYgKCFpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChwcml2LAotCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKSkgewotCQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX2Fzc29jKHByaXYsCi0JCQkJCSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCQlpZiAocmMpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAiCi0JCQkJICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKLQkJLyoKLQkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAotCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KLQkJICovCi0JCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcwotCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKLQkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0JICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSAmJiBuZXdfYXNzb2MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQotCQkvKgotCQkgKiByZXNlcnZlZDQgYW5kIDUgY291bGQgaGF2ZSBiZWVuIGZpbGxlZCBieSB0aGUgaXdsY29yZSBjb2RlLgotCQkgKiBMZXQncyBjbGVhciB0aGVtIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSAzOTQ1LgotCQkgKi8KLQkJYWN0aXZlX3J4b24tPnJlc2VydmVkNCA9IDA7Ci0JCWFjdGl2ZV9yeG9uLT5yZXNlcnZlZDUgPSAwOwotCQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1JYT04sCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3J4b25fY21kKSwKLQkJCQkgICAgICAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlKTsKLQotCQkvKiBJZiB0aGUgbWFzayBjbGVhcmluZyBmYWlsZWQgdGhlbiB3ZSBzZXQKLQkJICogYWN0aXZlX3J4b24gYmFjayB0byB3aGF0IGl0IHdhcyBwcmV2aW91c2x5ICovCi0JCWlmIChyYykgewotCQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBjbGVhcmluZyBBU1NPQ19NU0sgb24gY3VycmVudCAiCi0JCQkJICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwKLQkJCQkJICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LAotCQkJCQkgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2VuZGluZyBSWE9OXG4iCi0JCSAgICAgICAiKiB3aXRoJXMgUlhPTl9GSUxURVJfQVNTT0NfTVNLXG4iCi0JCSAgICAgICAiKiBjaGFubmVsID0gJWRcbiIKLQkJICAgICAgICIqIGJzc2lkID0gJXBNXG4iLAotCQkgICAgICAgKG5ld19hc3NvYyA/ICIiIDogIm91dCIpLAotCQkgICAgICAgbGUxNl90b19jcHUoc3RhZ2luZ19yeG9uLT5jaGFubmVsKSwKLQkJICAgICAgIHN0YWdpbmdfcnhvbi0+YnNzaWRfYWRkcik7Ci0KLQkvKgotCSAqIHJlc2VydmVkNCBhbmQgNSBjb3VsZCBoYXZlIGJlZW4gZmlsbGVkIGJ5IHRoZSBpd2xjb3JlIGNvZGUuCi0JICogTGV0J3MgY2xlYXIgdGhlbSBiZWZvcmUgcHVzaGluZyB0byB0aGUgMzk0NS4KLQkgKi8KLQlzdGFnaW5nX3J4b24tPnJlc2VydmVkNCA9IDA7Ci0Jc3RhZ2luZ19yeG9uLT5yZXNlcnZlZDUgPSAwOwotCi0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9od2NyeXB0byhwcml2LCBjdHgsICFpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKTsKLQotCS8qIEFwcGx5IHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLwotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUlhPTiwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCksCi0JCQkgICAgICBzdGFnaW5nX3J4b24pOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltZW1jcHkoYWN0aXZlX3J4b24sIHN0YWdpbmdfcnhvbiwgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCi0JaWYgKCFuZXdfYXNzb2MpIHsKLQkJaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhwcml2LAotCQkJCQkgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQkJaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHByaXYsCi0JCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JfQotCi0JLyogSWYgd2UgaXNzdWUgYSBuZXcgUlhPTiBjb21tYW5kIHdoaWNoIHJlcXVpcmVkIGEgdHVuZSB0aGVuIHdlIG11c3QKLQkgKiBzZW5kIGEgbmV3IFRYUE9XRVIgY29tbWFuZCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIFR4IGFueSBmcmFtZXMgKi8KLQlyYyA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIFR4IHBvd2VyICglZCkuXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBJbml0IHRoZSBoYXJkd2FyZSdzIHJhdGUgZmFsbGJhY2sgb3JkZXIgYmFzZWQgb24gdGhlIGJhbmQgKi8KLQlyYyA9IGl3bDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKHByaXYpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIEhXIHJhdGUgdGFibGU6ICUwMlhcbiIsIHJjKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyAtICBjYWxsZWQgd2hlbiB0aW1lIHRvIGNoZWNrIG91ciB0ZW1wZXJhdHVyZS4KLSAqCi0gKiAtLSByZXNldCBwZXJpb2RpYyB0aW1lcgotICogLS0gc2VlIGlmIHRlbXAgaGFzIGNoYW5nZWQgZW5vdWdoIHRvIHdhcnJhbnQgcmUtY2FsaWJyYXRpb24gLi4uIGlmIHNvOgotICogICAgIC0tIGNvcnJlY3QgY29lZmZzIGZvciB0ZW1wIChjYW4gcmVzZXQgdGVtcCB0aW1lcikKLSAqICAgICAtLSBzYXZlIHRoaXMgdGVtcCBhcyAibGFzdCIsCi0gKiAgICAgLS0gc2VuZCBuZXcgc2V0IG9mIGdhaW4gc2V0dGluZ3MgdG8gTklDCi0gKiBOT1RFOiAgVGhpcyBzaG91bGQgY29udGludWUgd29ya2luZywgZXZlbiB3aGVuIHdlJ3JlIG5vdCBhc3NvY2lhdGVkLAotICogICBzbyB3ZSBjYW4ga2VlcCBvdXIgaW50ZXJuYWwgdGFibGUgb2Ygc2NhbiBwb3dlcnMgY3VycmVudC4gKi8KLXZvaWQgaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogVGhpcyB3aWxsIGtpY2sgaW4gdGhlICJicnV0ZSBmb3JjZSIKLQkgKiBpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcCgpIGJlbG93ICovCi0JaWYgKCFpd2wzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHByaXYpKQotCQlnb3RvIHJlc2NoZWR1bGU7Ci0KLQkvKiBTZXQgdXAgYSBuZXcgc2V0IG9mIHRlbXAtYWRqdXN0ZWQgVHhQb3dlcnMsIHNlbmQgdG8gTklDLgotCSAqIFRoaXMgaXMgYmFzZWQgKm9ubHkqIG9uIGN1cnJlbnQgdGVtcGVyYXR1cmUsCi0JICogaWdub3JpbmcgYW55IHByZXZpb3VzIHBvd2VyIG1lYXN1cmVtZW50cyAqLwotCWl3bDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKHByaXYpOwotCi0gcmVzY2hlZHVsZToKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJICAgJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsIFJFR19SRUNBTElCX1BFUklPRCAqIEhaKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwKLQkJCQkJICAgICBfMzk0NS50aGVybWFsX3BlcmlvZGljLndvcmspOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2luZGV4IC0gZmluZCB0aGUgY2hhbm5lbC1ncm91cCBpbmRleCAoMC00KQotICogCQkJCSAgIGZvciB0aGUgY2hhbm5lbC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgY2hhbm5lbC1pbmZvIHN0cnVjdHMuCi0gKgotICogTk9URTogVGhlc2UgY2hhbm5lbCBncm91cHMgZG8gKk5PVCogbWF0Y2ggdGhlIGJhbmRzIGFib3ZlIQotICoJIFRoZXNlIGNoYW5uZWwgZ3JvdXBzIGFyZSBiYXNlZCBvbiBmYWN0b3J5LXRlc3RlZCBjaGFubmVsczsKLSAqCSBvbiBBLWJhbmQsIEVFUFJPTSdzICJncm91cCBmcmVxdWVuY3kiIGVudHJpZXMgcmVwcmVzZW50IHRoZSB0b3AKLSAqCSBjaGFubmVsIGluIGVhY2ggZ3JvdXAgMS00LiAgR3JvdXAgNSBBbGwgQi9HIGNoYW5uZWxzIGFyZSBpbiBncm91cCAwLgotICovCi1zdGF0aWMgdTE2IGl3bDM5NDVfaHdfcmVnX2dldF9jaF9ncnBfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmNoX2dycCA9ICZlZXByb20tPmdyb3Vwc1swXTsKLQl1OCBncm91cDsKLQl1MTYgZ3JvdXBfaW5kZXggPSAwOwkvKiBiYXNlZCBvbiBmYWN0b3J5IGNhbGliIGZyZXF1ZW5jaWVzICovCi0JdTggZ3JwX2NoYW5uZWw7Ci0KLQkvKiBGaW5kIHRoZSBncm91cCBpbmRleCBmb3IgdGhlIGNoYW5uZWwgLi4uIGRvbid0IHVzZSBpbmRleCAxKD8pICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykpIHsKLQkJZm9yIChncm91cCA9IDE7IGdyb3VwIDwgNTsgZ3JvdXArKykgewotCQkJZ3JwX2NoYW5uZWwgPSBjaF9ncnBbZ3JvdXBdLmdyb3VwX2NoYW5uZWw7Ci0JCQlpZiAoY2hfaW5mby0+Y2hhbm5lbCA8PSBncnBfY2hhbm5lbCkgewotCQkJCWdyb3VwX2luZGV4ID0gZ3JvdXA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogZ3JvdXAgNCBoYXMgYSBmZXcgY2hhbm5lbHMgKmFib3ZlKiBpdHMgZmFjdG9yeSBjYWwgZnJlcSAqLwotCQlpZiAoZ3JvdXAgPT0gNSkKLQkJCWdyb3VwX2luZGV4ID0gNDsKLQl9IGVsc2UKLQkJZ3JvdXBfaW5kZXggPSAwOwkvKiAyLjQgR0h6LCBncm91cCAwICovCi0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkNobmwgJWQgbWFwcGVkIHRvIGdycCAlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwKLQkJCWdyb3VwX2luZGV4KTsKLQlyZXR1cm4gZ3JvdXBfaW5kZXg7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaW5kZXggLSBJbnRlcnBvbGF0ZSB0byBnZXQgbm9taW5hbCBpbmRleAotICoKLSAqIEludGVycG9sYXRlIHRvIGdldCBub21pbmFsIChpLmUuIGF0IGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUpIGluZGV4Ci0gKiAgIGludG8gcmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgdGFibGUgZm9yIHJlcXVlc3RlZCBwb3dlci4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19nZXRfbWF0Y2hlZF9wb3dlcl9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHM4IHJlcXVlc3RlZF9wb3dlciwKLQkJCQkgICAgICAgczMyIHNldHRpbmdfaW5kZXgsIHMzMiAqbmV3X2luZGV4KQotewotCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpjaG5sX2dycCA9IE5VTEw7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCXMzMiBpbmRleDAsIGluZGV4MTsKLQlzMzIgcG93ZXIgPSAyICogcmVxdWVzdGVkX3Bvd2VyOwotCXMzMiBpOwotCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSAqc2FtcGxlczsKLQlzMzIgZ2FpbnMwLCBnYWluczE7Ci0JczMyIHJlczsKLQlzMzIgZGVub21pbmF0b3I7Ci0KLQljaG5sX2dycCA9ICZlZXByb20tPmdyb3Vwc1tzZXR0aW5nX2luZGV4XTsKLQlzYW1wbGVzID0gY2hubF9ncnAtPnNhbXBsZXM7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAocG93ZXIgPT0gc2FtcGxlc1tpXS5wb3dlcikgewotCQkJKm5ld19pbmRleCA9IHNhbXBsZXNbaV0uZ2Fpbl9pbmRleDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaWYgKHBvd2VyID4gc2FtcGxlc1sxXS5wb3dlcikgewotCQlpbmRleDAgPSAwOwotCQlpbmRleDEgPSAxOwotCX0gZWxzZSBpZiAocG93ZXIgPiBzYW1wbGVzWzJdLnBvd2VyKSB7Ci0JCWluZGV4MCA9IDE7Ci0JCWluZGV4MSA9IDI7Ci0JfSBlbHNlIGlmIChwb3dlciA+IHNhbXBsZXNbM10ucG93ZXIpIHsKLQkJaW5kZXgwID0gMjsKLQkJaW5kZXgxID0gMzsKLQl9IGVsc2UgewotCQlpbmRleDAgPSAzOwotCQlpbmRleDEgPSA0OwotCX0KLQotCWRlbm9taW5hdG9yID0gKHMzMikgc2FtcGxlc1tpbmRleDFdLnBvd2VyIC0gKHMzMikgc2FtcGxlc1tpbmRleDBdLnBvd2VyOwotCWlmIChkZW5vbWluYXRvciA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlnYWluczAgPSAoczMyKSBzYW1wbGVzW2luZGV4MF0uZ2Fpbl9pbmRleCAqICgxIDw8IDE5KTsKLQlnYWluczEgPSAoczMyKSBzYW1wbGVzW2luZGV4MV0uZ2Fpbl9pbmRleCAqICgxIDw8IDE5KTsKLQlyZXMgPSBnYWluczAgKyAoZ2FpbnMxIC0gZ2FpbnMwKSAqCi0JICAgICgoczMyKSBwb3dlciAtIChzMzIpIHNhbXBsZXNbaW5kZXgwXS5wb3dlcikgLyBkZW5vbWluYXRvciArCi0JICAgICgxIDw8IDE4KTsKLQkqbmV3X2luZGV4ID0gcmVzID4+IDE5OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2h3X3JlZ19pbml0X2NoYW5uZWxfZ3JvdXBzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgaTsKLQlzMzIgcmF0ZV9pbmRleDsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JY29uc3Qgc3RydWN0IGl3bDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmdyb3VwOwotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJJbml0aWFsaXppbmcgZmFjdG9yeSBjYWxpYiBpbmZvIGZyb20gRUVQUk9NXG4iKTsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfTlVNX1RYX0NBTElCX0dST1VQUzsgaSsrKSB7Ci0JCXM4ICpjbGlwX3B3cnM7CS8qIHRhYmxlIG9mIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCi0JCXM4IHNhdHVyX3B3cjsJLyogc2F0dXJhdGlvbiBwb3dlciBmb3IgZWFjaCBjaG5sIGdyb3VwICovCi0JCWdyb3VwID0gJmVlcHJvbS0+Z3JvdXBzW2ldOwotCi0JCS8qIHNhbml0eSBjaGVjayBvbiBmYWN0b3J5IHNhdHVyYXRpb24gcG93ZXIgdmFsdWUgKi8KLQkJaWYgKGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyIDwgNDApIHsKLQkJCUlXTF9XQVJOKHByaXYsICJFcnJvcjogc2F0dXJhdGlvbiBwb3dlciBpcyAlZCwgIgotCQkJCSAgICAibGVzcyB0aGFuIG1pbmltdW0gZXhwZWN0ZWQgNDBcbiIsCi0JCQkJICAgIGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qCi0JCSAqIERlcml2ZSByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUsIGJhc2VkIG9uCi0JCSAqICAgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIChzYXR1cmF0aW9uIHBvd2VyIGZvciBiYW5kKS4KLQkJICogQmFzaWMgdmFsdWUgaXMgM2RCIGRvd24gZnJvbSBzYXR1cmF0aW9uLCB3aXRoIGZ1cnRoZXIKLQkJICogICBwb3dlciByZWR1Y3Rpb25zIGZvciBoaWdoZXN0IDMgZGF0YSByYXRlcy4gIFRoZXNlCi0JCSAqICAgYmFja29mZnMgcHJvdmlkZSBoZWFkcm9vbSBmb3IgaGlnaCByYXRlIG1vZHVsYXRpb24KLQkJICogICBwb3dlciBwZWFrcywgd2l0aG91dCB0b28gbXVjaCBkaXN0b3J0aW9uIChjbGlwcGluZykuCi0JCSAqLwotCQkvKiB3ZSdsbCBmaWxsIGluIHRoaXMgYXJyYXkgd2l0aCBoL3cgbWF4IHBvd2VyIGxldmVscyAqLwotCQljbGlwX3B3cnMgPSAoczggKikgcHJpdi0+XzM5NDUuY2xpcF9ncm91cHNbaV0uY2xpcF9wb3dlcnM7Ci0KLQkJLyogZGl2aWRlIGZhY3Rvcnkgc2F0dXJhdGlvbiBwb3dlciBieSAyIHRvIGZpbmQgLTNkQiBsZXZlbCAqLwotCQlzYXR1cl9wd3IgPSAoczgpIChncm91cC0+c2F0dXJhdGlvbl9wb3dlciA+PiAxKTsKLQotCQkvKiBmaWxsIGluIGNoYW5uZWwgZ3JvdXAncyBub21pbmFsIHBvd2VycyBmb3IgZWFjaCByYXRlICovCi0JCWZvciAocmF0ZV9pbmRleCA9IDA7Ci0JCSAgICAgcmF0ZV9pbmRleCA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IHJhdGVfaW5kZXgrKywgY2xpcF9wd3JzKyspIHsKLQkJCXN3aXRjaCAocmF0ZV9pbmRleCkgewotCQkJY2FzZSBJV0xfUkFURV8zNk1fSU5ERVhfVEFCTEU6Ci0JCQkJaWYgKGkgPT0gMCkJLyogQi9HICovCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7Ci0JCQkJZWxzZQkvKiBBICovCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA1OwotCQkJCWJyZWFrOwotCQkJY2FzZSBJV0xfUkFURV80OE1fSU5ERVhfVEFCTEU6Ci0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDc7Ci0JCQkJZWxzZQotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gMTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElXTF9SQVRFXzU0TV9JTkRFWF9UQUJMRToKLQkJCQlpZiAoaSA9PSAwKQotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gOTsKLQkJCQllbHNlCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSAxMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3cjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tIC0gU2V0IGNoYW5uZWwgcG93ZXIgaW5mbyBiYXNlZCBvbiBFRVBST00KLSAqCi0gKiBTZWNvbmQgcGFzcyAoZHVyaW5nIGluaXQpIHRvIHNldCB1cCBwcml2LT5jaGFubmVsX2luZm8KLSAqCi0gKiBTZXQgdXAgVHgtcG93ZXIgc2V0dGluZ3MgaW4gb3VyIGNoYW5uZWwgaW5mbyBkYXRhYmFzZSBmb3IgZWFjaCBWQUxJRAotICogKGZvciB0aGlzIGdlby9TS1UpIGNoYW5uZWwsIGF0IGFsbCBUeCBkYXRhIHJhdGVzLCBiYXNlZCBvbiBlZXByb20gdmFsdWVzCi0gKiBhbmQgY3VycmVudCB0ZW1wZXJhdHVyZS4KLSAqCi0gKiBTaW5jZSB0aGlzIGlzIGJhc2VkIG9uIGN1cnJlbnQgdGVtcGVyYXR1cmUgKGF0IGluaXQgdGltZSksIHRoZXNlIHZhbHVlcyBtYXkKLSAqIG5vdCBiZSB2YWxpZCBmb3IgdmVyeSBsb25nLCBidXQgaXQgZ2l2ZXMgdXMgYSBzdGFydGluZy9kZWZhdWx0IHBvaW50LAotICogYW5kIGFsbG93cyB1cyB0byBhY3RpdmUgKGkuZS4gdXNpbmcgVHgpIHNjYW4uCi0gKgotICogVGhpcyBkb2VzICpub3QqIHdyaXRlIHZhbHVlcyB0byBOSUMsIGp1c3Qgc2V0cyB1cCBvdXIgaW50ZXJuYWwgdGFibGUuCi0gKi8KLWludCBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwd3JfaW5mbzsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JaW50IGRlbHRhX2luZGV4OwotCXU4IHJhdGVfaW5kZXg7Ci0JdTggc2Nhbl90YmxfaW5kZXg7Ci0JY29uc3QgczggKmNsaXBfcHdyczsJLyogYXJyYXkgb2YgcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUgKi8KLQl1OCBnYWluLCBkc3BfYXR0ZW47Ci0JczggcG93ZXI7Ci0JdTggcHdyX2luZGV4LCBiYXNlX3B3cl9pbmRleCwgYV9iYW5kOwotCXU4IGk7Ci0JaW50IHRlbXBlcmF0dXJlOwotCi0JLyogc2F2ZSB0ZW1wZXJhdHVyZSByZWZlcmVuY2UsCi0JICogICBzbyB3ZSBjYW4gZGV0ZXJtaW5lIG5leHQgdGltZSB0byBjYWxpYnJhdGUgKi8KLQl0ZW1wZXJhdHVyZSA9IGl3bDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCXByaXYtPmxhc3RfdGVtcGVyYXR1cmUgPSB0ZW1wZXJhdHVyZTsKLQotCWl3bDM5NDVfaHdfcmVnX2luaXRfY2hhbm5lbF9ncm91cHMocHJpdik7Ci0KLQkvKiBpbml0aWFsaXplIFR4IHBvd2VyIGluZm8gZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCi0JZm9yIChpID0gMCwgY2hfaW5mbyA9IHByaXYtPmNoYW5uZWxfaW5mbzsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7Ci0JICAgICBpKyssIGNoX2luZm8rKykgewotCQlhX2JhbmQgPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pOwotCQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbmQgdGhpcyBjaGFubmVsJ3MgY2hhbm5lbCBncm91cCAoKm5vdCogImJhbmQiKSBpbmRleCAqLwotCQljaF9pbmZvLT5ncm91cF9pbmRleCA9Ci0JCQlpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2luZGV4KHByaXYsIGNoX2luZm8pOwotCi0JCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLT5tYXgvY2xpcC1wb3dlcnMgdGFibGUgKi8KLQkJY2xpcF9wd3JzID0gcHJpdi0+XzM5NDUuY2xpcF9ncm91cHNbY2hfaW5mby0+Z3JvdXBfaW5kZXhdLmNsaXBfcG93ZXJzOwotCi0JCS8qIGNhbGN1bGF0ZSBwb3dlciBpbmRleCAqYWRqdXN0bWVudCogdmFsdWUgYWNjb3JkaW5nIHRvCi0JCSAqICBkaWZmIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSB0ZW1wZXJhdHVyZSAqLwotCQlkZWx0YV9pbmRleCA9IGl3bDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLAotCQkJCWVlcHJvbS0+Z3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS4KLQkJCQl0ZW1wZXJhdHVyZSk7Ci0KLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJEZWx0YSBpbmRleCBmb3IgY2hhbm5lbCAlZDogJWQgWyVkXVxuIiwKLQkJCQljaF9pbmZvLT5jaGFubmVsLCBkZWx0YV9pbmRleCwgdGVtcGVyYXR1cmUgKwotCQkJCUlXTF9URU1QX0NPTlZFUlQpOwotCi0JCS8qIHNldCB0eCBwb3dlciB2YWx1ZSBmb3IgYWxsIE9GRE0gcmF0ZXMgKi8KLQkJZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IElXTF9PRkRNX1JBVEVTOwotCQkgICAgIHJhdGVfaW5kZXgrKykgewotCQkJczMyIHVuaW5pdGlhbGl6ZWRfdmFyKHBvd2VyX2lkeCk7Ci0JCQlpbnQgcmM7Ci0KLQkJCS8qIHVzZSBjaGFubmVsIGdyb3VwJ3MgY2xpcC1wb3dlciB0YWJsZSwKLQkJCSAqICAgYnV0IGRvbid0IGV4Y2VlZCBjaGFubmVsJ3MgbWF4IHBvd2VyICovCi0JCQlzOCBwd3IgPSBtaW4oY2hfaW5mby0+bWF4X3Bvd2VyX2F2ZywKLQkJCQkgICAgIGNsaXBfcHdyc1tyYXRlX2luZGV4XSk7Ci0KLQkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleF07Ci0KLQkJCS8qIGdldCBiYXNlIChpLmUuIGF0IGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmUpCi0JCQkgKiAgICBwb3dlciB0YWJsZSBpbmRleCBmb3IgdGhpcyByYXRlJ3MgcG93ZXIgKi8KLQkJCXJjID0gaXdsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaW5kZXgocHJpdiwgcHdyLAotCQkJCQkJCSBjaF9pbmZvLT5ncm91cF9pbmRleCwKLQkJCQkJCQkgJnBvd2VyX2lkeCk7Ci0JCQlpZiAocmMpIHsKLQkJCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHBvd2VyIGluZGV4XG4iKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQlwd3JfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9ICh1OCkgcG93ZXJfaWR4OwotCi0JCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCi0JCQlwb3dlcl9pZHggKz0gZGVsdGFfaW5kZXg7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHJhbmdlIG9mIGdhaW4gdGFibGUgKi8KLQkJCXBvd2VyX2lkeCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwb3dlcl9pZHgpOwotCi0JCQkvKiBmaWxsIDEgT0ZETSByYXRlJ3MgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0ICovCi0JCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcHdyOwotCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2luZGV4ID0gKHU4KSBwb3dlcl9pZHg7Ci0JCQlwd3JfaW5mby0+dHBjLnR4X2dhaW4gPQotCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLnR4X2dhaW47Ci0JCQlwd3JfaW5mby0+dHBjLmRzcF9hdHRlbiA9Ci0JCQkgICAgcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3Bvd2VyX2lkeF0uZHNwX2F0dGVuOwotCQl9Ci0KLQkJLyogc2V0IHR4IHBvd2VyIGZvciBDQ0sgcmF0ZXMsIGJhc2VkIG9uIE9GRE0gMTIgTWJpdCBzZXR0aW5ncyovCi0JCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFXTsKLQkJcG93ZXIgPSBwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyICsKLQkJCUlXTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkY7Ci0JCXB3cl9pbmRleCA9IHB3cl9pbmZvLT5wb3dlcl90YWJsZV9pbmRleCArCi0JCQlJV0xfQ0NLX0ZST01fT0ZETV9JTkRFWF9ESUZGOwotCQliYXNlX3B3cl9pbmRleCA9IHB3cl9pbmZvLT5iYXNlX3Bvd2VyX2luZGV4ICsKLQkJCUlXTF9DQ0tfRlJPTV9PRkRNX0lOREVYX0RJRkY7Ci0KLQkJLyogc3RheSB3aXRoaW4gdGFibGUgcmFuZ2UgKi8KLQkJcHdyX2luZGV4ID0gaXdsMzk0NV9od19yZWdfZml4X3Bvd2VyX2luZGV4KHB3cl9pbmRleCk7Ci0JCWdhaW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2luZGV4XS50eF9nYWluOwotCQlkc3BfYXR0ZW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2luZGV4XS5kc3BfYXR0ZW47Ci0KLQkJLyogZmlsbCBlYWNoIENDSyByYXRlJ3MgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0dXJlCi0JCSAqIE5PVEU6ICBBbGwgQ0NLLXJhdGUgVHhwd3JzIGFyZSB0aGUgc2FtZSBmb3IgYSBnaXZlbiBjaG5sIQotCQkgKiBOT1RFOiAgQ0NLIHJhdGVzIHN0YXJ0IGF0IGVuZCBvZiBPRkRNIHJhdGVzISAqLwotCQlmb3IgKHJhdGVfaW5kZXggPSAwOwotCQkgICAgIHJhdGVfaW5kZXggPCBJV0xfQ0NLX1JBVEVTOyByYXRlX2luZGV4KyspIHsKLQkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleCtJV0xfT0ZETV9SQVRFU107Ci0JCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7Ci0JCQlwd3JfaW5mby0+cG93ZXJfdGFibGVfaW5kZXggPSBwd3JfaW5kZXg7Ci0JCQlwd3JfaW5mby0+YmFzZV9wb3dlcl9pbmRleCA9IGJhc2VfcHdyX2luZGV4OwotCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0gZ2FpbjsKLQkJCXB3cl9pbmZvLT50cGMuZHNwX2F0dGVuID0gZHNwX2F0dGVuOwotCQl9Ci0KLQkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCi0JCWZvciAoc2Nhbl90YmxfaW5kZXggPSAwOwotCQkgICAgIHNjYW5fdGJsX2luZGV4IDwgSVdMX05VTV9TQ0FOX1JBVEVTOyBzY2FuX3RibF9pbmRleCsrKSB7Ci0JCQlzMzIgYWN0dWFsX2luZGV4ID0gKHNjYW5fdGJsX2luZGV4ID09IDApID8KLQkJCQlJV0xfUkFURV8xTV9JTkRFWF9UQUJMRSA6IElXTF9SQVRFXzZNX0lOREVYX1RBQkxFOwotCQkJaXdsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIocHJpdiwgc2Nhbl90YmxfaW5kZXgsCi0JCQkJYWN0dWFsX2luZGV4LCBjbGlwX3B3cnMsIGNoX2luZm8sIGFfYmFuZCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDM5NDVfaHdfcnhxX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYzsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX0NPTkZJRygwKSwgMCk7Ci0JcmMgPSBpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIMzlfUlNTUl9TVEFUVVMsCi0JCQlGSDM5X1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRSwgMTAwMCk7Ci0JaWYgKHJjIDwgMCkKLQkJSVdMX0VSUihwcml2LCAiQ2FuJ3Qgc3RvcCBSeCBETUEuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsMzk0NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0KLQlzdHJ1Y3QgaXdsMzk0NV9zaGFyZWQgKnNoYXJlZF9kYXRhID0gcHJpdi0+XzM5NDUuc2hhcmVkX3ZpcnQ7Ci0KLQlzaGFyZWRfZGF0YS0+dHhfYmFzZV9wdHJbdHhxX2lkXSA9IGNwdV90b19sZTMyKCh1MzIpdHhxLT5xLmRtYV9hZGRyKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9DQkNDX0NUUkwodHhxX2lkKSwgMCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X0NCQ0NfQkFTRSh0eHFfaWQpLCAwKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfTk9JTlQgfAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfVFhGIHwKLQkJRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRCB8Ci0JCUZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwgfAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFKTsKLQotCS8qIGZha2UgcmVhZCB0byBmbHVzaCBhbGwgcHJldi4gd3JpdGVzICovCi0JaXdsX3JlYWQzMihwcml2LCBGSDM5X1RTU1JfQ0JCX0JBU0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBIQ01EIHV0aWxzCi0gKi8KLXN0YXRpYyB1MTYgaXdsMzk0NV9nZXRfaGNtZF9zaXplKHU4IGNtZF9pZCwgdTE2IGxlbikKLXsKLQlzd2l0Y2ggKGNtZF9pZCkgewotCWNhc2UgUkVQTFlfUlhPTjoKLQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCk7Ci0JY2FzZSBQT1dFUl9UQUJMRV9DTUQ6Ci0JCXJldHVybiBzaXplb2Yoc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBsZW47Ci0JfQotfQotCi0KLXN0YXRpYyB1MTYgaXdsMzk0NV9idWlsZF9hZGRzdGFfaGNtZChjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpjbWQsCi0JCQkJCQkJCXU4ICpkYXRhKQotewotCXN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaXdsMzk0NV9hZGRzdGFfY21kICopZGF0YTsKLQlhZGRzdGEtPm1vZGUgPSBjbWQtPm1vZGU7Ci0JbWVtY3B5KCZhZGRzdGEtPnN0YSwgJmNtZC0+c3RhLCBzaXplb2Yoc3RydWN0IHN0YV9pZF9tb2RpZnkpKTsKLQltZW1jcHkoJmFkZHN0YS0+a2V5LCAmY21kLT5rZXksIHNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JYWRkc3RhLT5zdGF0aW9uX2ZsYWdzID0gY21kLT5zdGF0aW9uX2ZsYWdzOwotCWFkZHN0YS0+c3RhdGlvbl9mbGFnc19tc2sgPSBjbWQtPnN0YXRpb25fZmxhZ3NfbXNrOwotCWFkZHN0YS0+dGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNigwKTsKLQlhZGRzdGEtPnJhdGVfbl9mbGFncyA9IGNtZC0+cmF0ZV9uX2ZsYWdzOwotCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCWFkZHN0YS0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOwotCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfc3NuOwotCi0JcmV0dXJuICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgY29uc3QgdTggKmFkZHIsIHU4ICpzdGFfaWRfcikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc3RhX2lkX3IpCi0JCSpzdGFfaWRfciA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCBjdHgsIGFkZHIsIDAsIE5VTEwsICZzdGFfaWQpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgYWRkcik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHN0YV9pZF9yKQotCQkqc3RhX2lkX3IgPSBzdGFfaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9MT0NBTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGl3bDM5NDVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCWludCByZXQ7Ci0KLQlpZiAoYWRkKSB7Ci0JCXJldCA9IGl3bDM5NDVfYWRkX2Jzc2lkX3N0YXRpb24ocHJpdiwgdmlmLT5ic3NfY29uZi5ic3NpZCwKLQkJCQkJCSZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpd2wzOTQ1X3N5bmNfc3RhKHByaXYsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKLQkJCQkgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPwotCQkJCSBJV0xfUkFURV82TV9QTENQIDogSVdMX1JBVEVfMU1fUExDUCk7Ci0JCWl3bDM5NDVfcmF0ZV9zY2FsZV9pbml0KHByaXYtPmh3LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOwotCi0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKHByaXYsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKLQkJCQkgIHZpZi0+YnNzX2NvbmYuYnNzaWQpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaW5pdF9od19yYXRlX3RhYmxlIC0gSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgcmF0ZSBmYWxsYmFjayB0YWJsZQotICovCi1pbnQgaXdsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYywgaSwgaW5kZXgsIHByZXZfaW5kZXg7Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCByYXRlX2NtZCA9IHsKLQkJLnJlc2VydmVkID0gezAsIDAsIDB9LAotCX07Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gKnRhYmxlID0gcmF0ZV9jbWQudGFibGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd2wzOTQ1X3JhdGVzKTsgaSsrKSB7Ci0JCWluZGV4ID0gaXdsMzk0NV9yYXRlc1tpXS50YWJsZV9yc19pbmRleDsKLQotCQl0YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0KLQkJCWl3bDM5NDVfaHdfc2V0X3JhdGVfbl9mbGFncyhpd2wzOTQ1X3JhdGVzW2ldLnBsY3AsIDApOwotCQl0YWJsZVtpbmRleF0udHJ5X2NudCA9IHByaXYtPnJldHJ5X3JhdGU7Ci0JCXByZXZfaW5kZXggPSBpd2wzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShpKTsKLQkJdGFibGVbaW5kZXhdLm5leHRfcmF0ZV9pbmRleCA9Ci0JCQkJaXdsMzk0NV9yYXRlc1twcmV2X2luZGV4XS50YWJsZV9yc19pbmRleDsKLQl9Ci0KLQlzd2l0Y2ggKHByaXYtPmJhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJTZWxlY3QgQSBtb2RlIHJhdGUgc2NhbGVcbiIpOwotCQkvKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBDQ0sgcmF0ZXMgaXMgdXNlZCwKLQkJICogaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlIDZNIE9GRE0gcmF0ZSAqLwotCQlmb3IgKGkgPSBJV0xfUkFURV8xTV9JTkRFWF9UQUJMRTsKLQkJCWkgPD0gSVdMX1JBVEVfMTFNX0lOREVYX1RBQkxFOyBpKyspCi0JCQl0YWJsZVtpXS5uZXh0X3JhdGVfaW5kZXggPQotCQkJICBpd2wzOTQ1X3JhdGVzW0lXTF9GSVJTVF9PRkRNX1JBVEVdLnRhYmxlX3JzX2luZGV4OwotCi0JCS8qIERvbid0IGZhbGwgYmFjayB0byBDQ0sgcmF0ZXMgKi8KLQkJdGFibGVbSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFXS5uZXh0X3JhdGVfaW5kZXggPQotCQkJCQkJSVdMX1JBVEVfOU1fSU5ERVhfVEFCTEU7Ci0KLQkJLyogRG9uJ3QgZHJvcCBvdXQgb2YgT0ZETSByYXRlcyAqLwotCQl0YWJsZVtJV0xfUkFURV82TV9JTkRFWF9UQUJMRV0ubmV4dF9yYXRlX2luZGV4ID0KLQkJICAgIGl3bDM5NDVfcmF0ZXNbSVdMX0ZJUlNUX09GRE1fUkFURV0udGFibGVfcnNfaW5kZXg7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2VsZWN0IEIvRyBtb2RlIHJhdGUgc2NhbGVcbiIpOwotCQkvKiBJZiBhbiBPRkRNIHJhdGUgaXMgdXNlZCwgaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlCi0JCSAqIDFNIENDSyByYXRlcyAqLwotCi0JCWlmICghKHByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzICYgSVdMX09GRE1fUkFURVNfTUFTSykgJiYKLQkJICAgIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCi0JCQlpbmRleCA9IElXTF9GSVJTVF9DQ0tfUkFURTsKLQkJCWZvciAoaSA9IElXTF9SQVRFXzZNX0lOREVYX1RBQkxFOwotCQkJICAgICBpIDw9IElXTF9SQVRFXzU0TV9JTkRFWF9UQUJMRTsgaSsrKQotCQkJCXRhYmxlW2ldLm5leHRfcmF0ZV9pbmRleCA9Ci0JCQkJCWl3bDM5NDVfcmF0ZXNbaW5kZXhdLnRhYmxlX3JzX2luZGV4OwotCi0JCQlpbmRleCA9IElXTF9SQVRFXzExTV9JTkRFWF9UQUJMRTsKLQkJCS8qIENDSyBzaG91bGRuJ3QgZmFsbCBiYWNrIHRvIE9GRE0uLi4gKi8KLQkJCXRhYmxlW2luZGV4XS5uZXh0X3JhdGVfaW5kZXggPSBJV0xfUkFURV81TV9JTkRFWF9UQUJMRTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFVwZGF0ZSB0aGUgcmF0ZSBzY2FsaW5nIGZvciBjb250cm9sIGZyYW1lIFR4ICovCi0JcmF0ZV9jbWQudGFibGVfaWQgPSAwOwotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUkFURV9TQ0FMRSwgc2l6ZW9mKHJhdGVfY21kKSwKLQkJCSAgICAgICZyYXRlX2NtZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgZGF0YSBmcmFtZSBUeCAqLwotCXJhdGVfY21kLnRhYmxlX2lkID0gMTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUkFURV9TQ0FMRSwgc2l6ZW9mKHJhdGVfY21kKSwKLQkJCQkmcmF0ZV9jbWQpOwotfQotCi0vKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyICovCi1pbnQgaXdsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQltZW1zZXQoKHZvaWQgKikmcHJpdi0+aHdfcGFyYW1zLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9od19wYXJhbXMpKTsKLQotCXByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0ID0KLQkJZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NoYXJlZCksCi0JCQkJICAgJnByaXYtPl8zOTQ1LnNoYXJlZF9waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogQXNzaWduIG51bWJlciBvZiBVc2FibGUgVFggcXVldWVzICovCi0JcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKLQotCXByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV90ZmQpOwotCXByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV8zSyk7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfc2l6ZSA9IFJYX1FVRVVFX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9ucyA9IElXTDM5NDVfU1RBVElPTl9DT1VOVDsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQgPSBJV0wzOTQ1X0JST0FEQ0FTVF9JRDsKLQotCXByaXYtPnN0YV9rZXlfbWF4X251bSA9IFNUQV9LRVlfTUFYX05VTTsKLQotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIMzlfUlNDU1JfQ0hOTDBfV1BUUjsKLQlwcml2LT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCA9IElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7Ci0JcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGludCBpd2wzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lLCB1OCByYXRlKQotewotCXN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7Ci0JdW5zaWduZWQgaW50IGZyYW1lX3NpemU7Ci0KLQl0eF9iZWFjb25fY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgKikmZnJhbWUtPnU7Ci0JbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCi0JdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0KLQkJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkOwotCXR4X2JlYWNvbl9jbWQtPnR4LnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCi0JZnJhbWVfc2l6ZSA9IGl3bDM5NDVfZmlsbF9iZWFjb25fZnJhbWUocHJpdiwKLQkJCQl0eF9iZWFjb25fY21kLT5mcmFtZSwKLQkJCQlzaXplb2YoZnJhbWUtPnUpIC0gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7Ci0KLQlCVUdfT04oZnJhbWVfc2l6ZSA+IE1BWF9NUERVX1NJWkUpOwotCXR4X2JlYWNvbl9jbWQtPnR4LmxlbiA9IGNwdV90b19sZTE2KCh1MTYpZnJhbWVfc2l6ZSk7Ci0KLQl0eF9iZWFjb25fY21kLT50eC5yYXRlID0gcmF0ZTsKLQl0eF9iZWFjb25fY21kLT50eC50eF9mbGFncyA9IChUWF9DTURfRkxHX1NFUV9DVExfTVNLIHwKLQkJCQkgICAgICBUWF9DTURfRkxHX1RTRl9NU0spOwotCi0JLyogc3VwcF9yYXRlc1swXSA9PSBPRkRNIHN0YXJ0IGF0IElXTF9GSVJTVF9PRkRNX1JBVEUqLwotCXR4X2JlYWNvbl9jbWQtPnR4LnN1cHBfcmF0ZXNbMF0gPQotCQkoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7Ci0KLQl0eF9iZWFjb25fY21kLT50eC5zdXBwX3JhdGVzWzFdID0KLQkJKElXTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAmIDB4Rik7Ci0KLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQpICsgZnJhbWVfc2l6ZTsKLX0KLQotdm9pZCBpd2wzOTQ1X2h3X3J4X2hhbmRsZXJfc2V0dXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1RYXSA9IGl3bDM5NDVfcnhfcmVwbHlfdHg7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfMzk0NV9SWF0gPSBpd2wzOTQ1X3J4X3JlcGx5X3J4OwotfQotCi12b2lkIGl3bDM5NDVfaHdfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsCi0JCQkgIGl3bDM5NDVfYmdfcmVnX3R4cG93ZXJfcGVyaW9kaWMpOwotfQotCi12b2lkIGl3bDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMpOwotfQotCi0vKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X2JzbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi0gewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JdTMyIHJlZzsKLQl1MzIgdmFsOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIHZlcmlmeSBic21cbiIpOwotCi0JLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCi0JdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKLQlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnIDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWcgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCi0JCQkJICAiYWRkciAweCUwOFgrJXUgKG9mICV1KSwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBCU01fU1JBTV9MT1dFUl9CT1VORCwKLQkJCQkgIHJlZyAtIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCBsZW4sCi0JCQkJICB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENsZWFyIHRoZSBPV05FUl9NU0ssIHRvIGVzdGFibGlzaCBkcml2ZXIgKGluc3RlYWQgb2YgdUNvZGUgcnVubmluZyBvbgotICogZW1iZWRkZWQgY29udHJvbGxlcikgYXMgRUVQUk9NIHJlYWRlcjsgZWFjaCByZWFkIGlzIGEgc2VyaWVzIG9mIHB1bHNlcwotICogdG8vZnJvbSB0aGUgRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdAotICogaWYgdGhleSB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgc29tZSBvd25lcnNoaXAgbWVjaGFuaXNtLiAgSGVyZSwgdGhlIGRyaXZlcgotICogc2ltcGx5IGNsYWltcyBvd25lcnNoaXAsIHdoaWNoIHNob3VsZCBiZSBzYWZlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqIChpLmUuIGJlZm9yZSBsb2FkaW5nIHVDb2RlISkuCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9pd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfRUVQUk9NX0dQLCBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybjsKLX0KLQotIC8qKgotICAqIGl3bDM5NDVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKLSAgKgotICAqIEJTTSBvcGVyYXRpb246Ci0gICoKLSAgKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KLSAgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIGR1cmluZyBSRktJTEwuICBXaGVuIHBvd2VyaW5nIGJhY2sKLSAgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcwotICAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCi0gICoKLSAgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKLSAgKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQotICAqIEJTTV9EUkFNXyogcmVnaXN0ZXJzLiAgT25jZSB0aGUgbmV3IHByb2dyYW0gaXMgbG9hZGVkLCBpdCBzdGFydHMKLSAgKiBhdXRvbWF0aWNhbGx5LgotICAqCi0gICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIHBvaW50cyB0aGUgQlNNIHRvIHRoZQotICAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KLSAgKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KLSAgKgotICAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCi0gICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgotICAqIChmaWxsZWQgaW5pdGlhbGx5IHdpdGggc3RhcnRpbmcgZGF0YSB2YWx1ZXMgZm9yIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IpLAotICAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCi0gICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCi0gICoKLSAgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bwotICAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KLSAgKgotICAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKLSAgKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCi0gICogYW5kIHJlLWxhdW5jaGVzIHRoZSBydW50aW1lIHVDb2RlIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuCi0gICovCi1zdGF0aWMgaW50IGl3bDM5NDVfbG9hZF9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JZG1hX2FkZHJfdCBwaW5zdDsKLQlkbWFfYWRkcl90IHBkYXRhOwotCXUzMiBpbnN0X2xlbjsKLQl1MzIgZGF0YV9sZW47Ci0JaW50IHJjOwotCWludCBpOwotCXUzMiBkb25lOwotCXUzMiByZWdfb2Zmc2V0OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIGxvYWQgYnNtXG4iKTsKLQotCS8qIG1ha2Ugc3VyZSBib290c3RyYXAgcHJvZ3JhbSBpcyBubyBsYXJnZXIgdGhhbiBCU00ncyBTUkFNIHNpemUgKi8KLQlpZiAobGVuID4gSVdMMzlfTUFYX0JTTV9TSVpFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFRlbGwgYm9vdHN0cmFwIHVDb2RlIHdoZXJlIHRvIGZpbmQgdGhlICJJbml0aWFsaXplIiB1Q29kZQotCSogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzE6MCBmb3IgMzk0NS4KLQkqIE5PVEU6ICBpd2wzOTQ1X2luaXRpYWxpemVfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAotCSogICAgICAgIGFmdGVyIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgaGFzIHJ1biwgdG8gcG9pbnQgdG8KLQkqICAgICAgICBydW50aW1lL3Byb3RvY29sIGluc3RydWN0aW9ucyBhbmQgYmFja3VwIGRhdGEgY2FjaGUuICovCi0JcGluc3QgPSBwcml2LT51Y29kZV9pbml0LnBfYWRkcjsKLQlwZGF0YSA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5wX2FkZHI7Ci0JaW5zdF9sZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlkYXRhX2xlbiA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW47Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7Ci0KLQkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7Ci0JICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZ19vZmZzZXQsCi0JCQkJCSAgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0KLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2JzbShwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIFRlbGwgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIGluc3RydWN0aW9uIFNSQU0sIHdoZW4gYXNrZWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX01FTV9TUkNfUkVHLCAweDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfTUVNX0RTVF9SRUcsCi0JCQkJIElXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHLCBsZW4gLyBzaXplb2YodTMyKSk7Ci0KLQkvKiBMb2FkIGJvb3RzdHJhcCBjb2RlIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSBub3csCi0JICogICB0byBwcmVwYXJlIHRvIGxvYWQgImluaXRpYWxpemUiIHVDb2RlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRywKLQkJQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCk7Ci0KLQkvKiBXYWl0IGZvciBsb2FkIG9mIGJvb3RzdHJhcCB1Q29kZSB0byBmaW5pc2ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJZG9uZSA9IGl3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRyk7Ci0JCWlmICghKGRvbmUgJiBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTApOwotCX0KLQlpZiAoaSA8IDEwMCkKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJTTSB3cml0ZSBjb21wbGV0ZSwgcG9sbCAlZCBpdGVyYXRpb25zXG4iLCBpKTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiQlNNIHdyaXRlIGRpZCBub3QgY29tcGxldGUhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCB0cmlnZ2VycyBpdAotCSAqICAgKGUuZy4gd2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHBvd2VyLXNhdmUgc2h1dGRvd24pICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9DVFJMX1JFRywKLQkJQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpd2xfaGNtZF9vcHMgaXdsMzk0NV9oY21kID0gewotCS5yeG9uX2Fzc29jID0gaXdsMzk0NV9zZW5kX3J4b25fYXNzb2MsCi0JLmNvbW1pdF9yeG9uID0gaXdsMzk0NV9jb21taXRfcnhvbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2xpYl9vcHMgaXdsMzk0NV9saWIgPSB7Ci0JLnR4cV9hdHRhY2hfYnVmX3RvX3RmZCA9IGl3bDM5NDVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkLAotCS50eHFfZnJlZV90ZmQgPSBpd2wzOTQ1X2h3X3R4cV9mcmVlX3RmZCwKLQkudHhxX2luaXQgPSBpd2wzOTQ1X2h3X3R4X3F1ZXVlX2luaXQsCi0JLmxvYWRfdWNvZGUgPSBpd2wzOTQ1X2xvYWRfYnNtLAotCS5kdW1wX25pY19lcnJvcl9sb2cgPSBpd2wzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZywKLQkuYXBtX29wcyA9IHsKLQkJLmluaXQgPSBpd2wzOTQ1X2FwbV9pbml0LAotCQkuY29uZmlnID0gaXdsMzk0NV9uaWNfY29uZmlnLAotCX0sCi0JLmVlcHJvbV9vcHMgPSB7Ci0JCS5yZWd1bGF0b3J5X2JhbmRzID0gewotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAotCQkJRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAotCQl9LAotCQkuYWNxdWlyZV9zZW1hcGhvcmUgPSBpd2wzOTQ1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZSwKLQkJLnJlbGVhc2Vfc2VtYXBob3JlID0gaXdsMzk0NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUsCi0JfSwKLQkuc2VuZF90eF9wb3dlcgk9IGl3bDM5NDVfc2VuZF90eF9wb3dlciwKLQkuaXNfdmFsaWRfcnRjX2RhdGFfYWRkciA9IGl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkciwKLQotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCi0JCS50eF9zdGF0c19yZWFkID0gaXdsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkLAotCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgaXdsMzk0NV9sZWdhY3lfb3BzID0gewotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bDM5NDVfcG9zdF9hc3NvY2lhdGUsCi0JLmNvbmZpZ19hcCA9IGl3bDM5NDVfY29uZmlnX2FwLAotCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsMzk0NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfaGNtZF91dGlsc19vcHMgaXdsMzk0NV9oY21kX3V0aWxzID0gewotCS5nZXRfaGNtZF9zaXplID0gaXdsMzk0NV9nZXRfaGNtZF9zaXplLAotCS5idWlsZF9hZGRzdGFfaGNtZCA9IGl3bDM5NDVfYnVpbGRfYWRkc3RhX2hjbWQsCi0JLnJlcXVlc3Rfc2NhbiA9IGl3bDM5NDVfcmVxdWVzdF9zY2FuLAotCS5wb3N0X3NjYW4gPSBpd2wzOTQ1X3Bvc3Rfc2NhbiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX29wcyBpd2wzOTQ1X29wcyA9IHsKLQkubGliID0gJml3bDM5NDVfbGliLAotCS5oY21kID0gJml3bDM5NDVfaGNtZCwKLQkudXRpbHMgPSAmaXdsMzk0NV9oY21kX3V0aWxzLAotCS5sZWQgPSAmaXdsMzk0NV9sZWRfb3BzLAotCS5sZWdhY3kgPSAmaXdsMzk0NV9sZWdhY3lfb3BzLAotCS5pZWVlODAyMTFfb3BzID0gJml3bDM5NDVfaHdfb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfYmFzZV9wYXJhbXMgaXdsMzk0NV9iYXNlX3BhcmFtcyA9IHsKLQkuZWVwcm9tX3NpemUgPSBJV0wzOTQ1X0VFUFJPTV9JTUdfU0laRSwKLQkubnVtX29mX3F1ZXVlcyA9IElXTDM5X05VTV9RVUVVRVMsCi0JLnBsbF9jZmdfdmFsID0gQ1NSMzlfQU5BX1BMTF9DRkdfVkFMLAotCS5zZXRfbDBzID0gZmFsc2UsCi0JLnVzZV9ic20gPSB0cnVlLAotCS5sZWRfY29tcGVuc2F0aW9uID0gNjQsCi0JLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9jZmcgaXdsMzk0NV9iZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMzk0NUJHIiwKLQkuZndfbmFtZV9wcmUgPSBJV0wzOTQ1X0ZXX1BSRSwKLQkudWNvZGVfYXBpX21heCA9IElXTDM5NDVfVUNPREVfQVBJX01BWCwKLQkudWNvZGVfYXBpX21pbiA9IElXTDM5NDVfVUNPREVfQVBJX01JTiwKLQkuc2t1ID0gSVdMX1NLVV9HLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04sCi0JLm9wcyA9ICZpd2wzOTQ1X29wcywKLQkubW9kX3BhcmFtcyA9ICZpd2wzOTQ1X21vZF9wYXJhbXMsCi0JLmJhc2VfcGFyYW1zID0gJml3bDM5NDVfYmFzZV9wYXJhbXMsCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2NmZyBpd2wzOTQ1X2FiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMzk0NUFCRyIsCi0JLmZ3X25hbWVfcHJlID0gSVdMMzk0NV9GV19QUkUsCi0JLnVjb2RlX2FwaV9tYXggPSBJV0wzOTQ1X1VDT0RFX0FQSV9NQVgsCi0JLnVjb2RlX2FwaV9taW4gPSBJV0wzOTQ1X1VDT0RFX0FQSV9NSU4sCi0JLnNrdSA9IElXTF9TS1VfQXxJV0xfU0tVX0csCi0JLmVlcHJvbV92ZXIgPSBFRVBST01fMzk0NV9FRVBST01fVkVSU0lPTiwKLQkub3BzID0gJml3bDM5NDVfb3BzLAotCS5tb2RfcGFyYW1zID0gJml3bDM5NDVfbW9kX3BhcmFtcywKLQkuYmFzZV9wYXJhbXMgPSAmaXdsMzk0NV9iYXNlX3BhcmFtcywKLQkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAotfTsKLQotREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaXdsMzk0NV9od19jYXJkX2lkcykgPSB7Ci0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDA1LCBpd2wzOTQ1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjIsIDB4MTAzNCwgaXdsMzk0NV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwNDQsIGl3bDM5NDVfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyNywgMHgxMDE0LCBpd2wzOTQ1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjIsIFBDSV9BTllfSUQsIGl3bDM5NDVfYWJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjcsIFBDSV9BTllfSUQsIGl3bDM5NDVfYWJnX2NmZyl9LAotCXswfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl3bDM5NDVfaHdfY2FyZF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMThiNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLTM5NDUuaCkgZm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLTM5NDUtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtMzk0NS1ody5oIGZvciBoYXJkd2FyZS1yZWxhdGVkIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfMzk0NV9oX18KLSNkZWZpbmUgX19pd2xfMzk0NV9oX18KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPiAvKiBmb3Igc3RydWN0IHBjaV9kZXZpY2VfaWQgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+Ci0KLS8qIEhhcmR3YXJlIHNwZWNpZmljIGZpbGUgZGVmaW5lcyB0aGUgUENJIElEcyB0YWJsZSBmb3IgdGhhdCBoYXJkd2FyZSBtb2R1bGUgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpd2wzOTQ1X2h3X2NhcmRfaWRzW107Ci0KLSNpbmNsdWRlICJpd2wtY3NyLmgiCi0jaW5jbHVkZSAiaXdsLXBycGguaCIKLSNpbmNsdWRlICJpd2wtZmguaCIKLSNpbmNsdWRlICJpd2wtMzk0NS1ody5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtbGVkLmgiCi0KLS8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDM5NDVfVUNPREVfQVBJX01BWCAyCi0KLS8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMMzk0NV9VQ09ERV9BUElfTUlOIDEKLQotI2RlZmluZSBJV0wzOTQ1X0ZXX1BSRQkiaXdsd2lmaS0zOTQ1LSIKLSNkZWZpbmUgX0lXTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgSVdMMzk0NV9GV19QUkUgI2FwaSAiLnVjb2RlIgotI2RlZmluZSBJV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIF9JV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpCi0KLS8qIERlZmF1bHQgbm9pc2UgbGV2ZWwgdG8gcmVwb3J0IHdoZW4gbm9pc2UgbWVhc3VyZW1lbnQgaXMgbm90IGF2YWlsYWJsZS4KLSAqICAgVGhpcyBtYXkgYmUgYmVjYXVzZSB3ZSdyZToKLSAqICAgMSkgIE5vdCBhc3NvY2lhdGVkICg0OTY1LCBubyBiZWFjb24gc3RhdGlzdGljcyBiZWluZyBzZW50IHRvIGRyaXZlcikKLSAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCi0gKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCi0gKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCi0gKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCi0gKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0Ci0gKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKLSAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAotICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KLSNkZWZpbmUgSVdMX05PSVNFX01FQVNfTk9UX0FWQUlMQUJMRSAoLTEyNykKLQotLyogTW9kdWxlIHBhcmFtZXRlcnMgYWNjZXNzaWJsZSBmcm9tIGl3bC0qLmMgKi8KLWV4dGVybiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsMzk0NV9tb2RfcGFyYW1zOwotCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgewotCXU2NCBkYXRhOwotCXMzMiBzdWNjZXNzX2NvdW50ZXI7Ci0JczMyIHN1Y2Nlc3NfcmF0aW87Ci0JczMyIGNvdW50ZXI7Ci0JczMyIGF2ZXJhZ2VfdHB0OwotCXVuc2lnbmVkIGxvbmcgc3RhbXA7Ci19OwotCi1zdHJ1Y3QgaXdsMzk0NV9yc19zdGEgewotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JczMyICpleHBlY3RlZF90cHQ7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3BhcnRpYWxfZmx1c2g7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X2ZsdXNoOwotCXUzMiBmbHVzaF90aW1lOwotCXUzMiBsYXN0X3R4X3BhY2tldHM7Ci0JdTMyIHR4X3BhY2tldHM7Ci0JdTggdGdnOwotCXU4IGZsdXNoX3BlbmRpbmc7Ci0JdTggc3RhcnRfcmF0ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByYXRlX3NjYWxlX2ZsdXNoOwotCXN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGVfZGF0YSB3aW5bSVdMX1JBVEVfQ09VTlRfMzk0NV07Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLQlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZTsKLSNlbmRpZgotCi0JLyogdXNlZCB0byBiZSBpbiBzdGFfaW5mbyAqLwotCWludCBsYXN0X3R4cmF0ZV9pZHg7Ci19OwotCi0KLS8qCi0gKiBUaGUgY29tbW9uIHN0cnVjdCBNVVNUIGJlIGZpcnN0IGJlY2F1c2UgaXQgaXMgc2hhcmVkIGJldHdlZW4KLSAqIDM5NDUgYW5kIDQ5NjUhCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2IHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSByc19zdGE7Ci19OwotCi1lbnVtIGl3bDM5NDVfYW50ZW5uYSB7Ci0JSVdMX0FOVEVOTkFfRElWRVJTSVRZLAotCUlXTF9BTlRFTk5BX01BSU4sCi0JSVdMX0FOVEVOTkFfQVVYCi19OwotCi0vKgotICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCi0gKiBQZXIgc3BlYzoKLSAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKLSAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCi0gKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgotICogICB0aGFuIFJUUyB2YWx1ZS4KLSAqLwotI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCi0jZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQotI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCi0jZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKLSNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCi0jZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKLSNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQotCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMAkwCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMQkxCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMgkyCi0jZGVmaW5lIElXTF9UWF9GSUZPX0FDMwkzCi0jZGVmaW5lIElXTF9UWF9GSUZPX0hDQ0FfMQk1Ci0jZGVmaW5lIElXTF9UWF9GSUZPX0hDQ0FfMgk2Ci0jZGVmaW5lIElXTF9UWF9GSUZPX05PTkUJNwotCi0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAotI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCi0jZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQotCi1zdHJ1Y3QgaXdsMzk0NV9mcmFtZSB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciBmcmFtZTsKLQkJc3RydWN0IGl3bDM5NDVfdHhfYmVhY29uX2NtZCBiZWFjb247Ci0JCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKLQkJdTggY21kWzM2MF07Ci0JfSB1OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLSNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLSNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKLSNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQotCi0jZGVmaW5lIFNVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTICA4Ci0jZGVmaW5lIFNVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTICA0Ci0jZGVmaW5lIFNVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTICAxMgotCi0jZGVmaW5lIElXTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAotCi0jZGVmaW5lIFNDQU5fSU5URVJWQUwgMTAwCi0KLSNkZWZpbmUgTUFYX1RJRF9DT1VOVCAgICAgICAgOQotCi0jZGVmaW5lIElXTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKLSNkZWZpbmUgSVdMX0lOVkFMSURfVkFMVUUgICAgLTEKLQotI2RlZmluZSBTVEFfUFNfU1RBVFVTX1dBS0UgICAgICAgICAgICAgMAotI2RlZmluZSBTVEFfUFNfU1RBVFVTX1NMRUVQICAgICAgICAgICAgMQotCi1zdHJ1Y3QgaXdsMzk0NV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIElXTF9SWF9IRFIoeCkgKChzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9oZHIgKikoXAotCQkgICAgICAgeC0+dS5yeF9mcmFtZS5zdGF0cy5wYXlsb2FkICsgXAotCQkgICAgICAgeC0+dS5yeF9mcmFtZS5zdGF0cy5waHlfY291bnQpKQotI2RlZmluZSBJV0xfUlhfRU5EKHgpICgoc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kICopKFwKLQkJICAgICAgIElXTF9SWF9IRFIoeCktPnBheWxvYWQgKyBcCi0JCSAgICAgICBsZTE2X3RvX2NwdShJV0xfUlhfSERSKHgpLT5sZW4pKSkKLSNkZWZpbmUgSVdMX1JYX1NUQVRTKHgpICgmeC0+dS5yeF9mcmFtZS5zdGF0cykKLSNkZWZpbmUgSVdMX1JYX0RBVEEoeCkgKElXTF9SWF9IRFIoeCktPnBheWxvYWQpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBpd2wzOTQ1LWJhc2UuYyB3aGljaCBhcmUgZm9yd2FyZCBkZWNsYXJlZCBoZXJlCi0gKiBmb3IgdXNlIGJ5IGl3bC0qLmMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gaW50IGl3bDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXdsMzk0NV9maWxsX2JlYWNvbl9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIGludCBsZWZ0KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9kdW1wX25pY19ldmVudF9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGZ1bGxfbG9nLAotCQkJCSAgICAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBpd2wtWzM0XSouYyB3aGljaCBhcmUgZm9yd2FyZCBkZWNsYXJlZCBoZXJlCi0gKiBmb3IgdXNlIGJ5IGl3bDM5NDUtYmFzZS5jCi0gKgotICogTk9URTogIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGhhcmR3YXJlIHNwZWNpZmljCi0gKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGhhcmR3YXJlIHNwZWNpZmljIGZpbGVzICh2cy4gaXdsLWJhc2UuYykKLSAqCi0gKiBOYW1pbmcgY29udmVudGlvbiAtLQotICogaXdsMzk0NV8gICAgICAgICA8LS0gSXRzIHBhcnQgb2YgaXdsd2lmaSAoc2hvdWxkIGJlIGNoYW5nZWQgdG8gaXdsMzk0NV8pCi0gKiBpd2wzOTQ1X2h3XyAgICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBieSBhbGwgSFcpCi0gKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQotICogaXdsMzk0NV9iZ18gICAgICA8LS0gQ2FsbGVkIGZyb20gd29yayBxdWV1ZSBjb250ZXh0Ci0gKiBpd2wzOTQ1X21hY18gICAgIDwtLSBtYWM4MDIxMSBjYWxsYmFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od19yeF9oYW5kbGVyX3NldHVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2h3X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3NldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X25pY19zdG9wX21hc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfbmljX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwKLQkJCQkJICAgIHU4IHJlc2V0LCB1OCBwYWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGl3bDM5NDVfaHdfZ2V0X2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWUsIHU4IHJhdGUpOwotdm9pZCBpd2wzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgIGludCBzdGFfaWQsIGludCB0eF9pZCk7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfcmVnX3NlbmRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHBvd2VyKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsMzk0NV9yZXBseV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfZGlzYWJsZV9ldmVudHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsNDk2NV9nZXRfdGVtcGVyYXR1cmUoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfY29uZmlnX2FwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLWV4dGVybiBpbnQgaXdsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0KLS8qKgotICogaXdsMzk0NV9od19maW5kX3N0YXRpb24gLSBGaW5kIHN0YXRpb24gaWQgZm9yIGEgZ2l2ZW4gQlNTSUQKLSAqIEBic3NpZDogTUFDIGFkZHJlc3Mgb2Ygc3RhdGlvbiBJRCB0byBmaW5kCi0gKgotICogTk9URTogIFRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkd2FyZSBzcGVjaWZpYyBidXQgdGhlIGNvZGUgaGFzCi0gKiBub3QgeWV0IGJlZW4gbWVyZ2VkIGludG8gYSBzaW5nbGUgY29tbW9uIGxheWVyIGZvciBtYW5hZ2luZyB0aGUKLSAqIHN0YXRpb24gdGFibGVzLgotICovCi1leHRlcm4gdTggaXdsMzk0NV9od19maW5kX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCAqYnNzaWQpOwotCi1leHRlcm4gc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsMzk0NV9od19vcHM7Ci0KLS8qCi0gKiBGb3J3YXJkIGRlY2xhcmUgaXdsLTM5NDUuYyBmdW5jdGlvbnMgZm9yIGl3bDM5NDUtYmFzZS5jCi0gKi8KLWV4dGVybiBfX2xlMzIgaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2luaXRfaHdfcmF0ZV90YWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqaXdsMzk0NV9nZXRfY2hhbm5lbF9pbmZvKAotCWNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCk7Ci0KLWV4dGVybiBpbnQgaXdsMzk0NV9yc19uZXh0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgcmF0ZSk7Ci0KLS8qIHNjYW5uaW5nICovCi1pbnQgaXdsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsMzk0NV9wb3N0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyogcmF0ZXMgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsMzk0NV9yYXRlX2luZm8gaXdsMzk0NV9yYXRlc1tJV0xfUkFURV9DT1VOVF8zOTQ1XTsKLQotLyogUmVxdWlyZXMgZnVsbCBkZWNsYXJhdGlvbiBvZiBpd2xfcHJpdiBiZWZvcmUgaW5jbHVkaW5nICovCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmQ4NzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJTklUIGNhbGlicmF0aW9ucyBmcmFtZXdvcmsKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9kYXRhIHsKLQl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9hOwotCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2I7Ci0JdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYzsKLQl1MzIgYmVhY29uX2VuZXJneV9hOwotCXUzMiBiZWFjb25fZW5lcmd5X2I7Ci0JdTMyIGJlYWNvbl9lbmVyZ3lfYzsKLX07Ci0KLXZvaWQgaXdsNDk2NV9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgewotCQlrZnJlZShwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zik7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuID0gMDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUlVOVElNRSBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICJmYWxzZSBhbGFybXMiIGFyZSBzaWduYWxzIHRoYXQgb3VyIERTUCB0cmllcyB0byBsb2NrIG9udG8sCi0gKiAgIGJ1dCB0aGVuIGRldGVybWluZXMgdGhhdCB0aGV5IGFyZSBlaXRoZXIgbm9pc2UsIG9yIHRyYW5zbWlzc2lvbnMKLSAqICAgZnJvbSBhIGRpc3RhbnQgd2lyZWxlc3MgbmV0d29yayAoYWxzbyAibm9pc2UiLCByZWFsbHkpIHRoYXQgZ2V0Ci0gKiAgICJzdGVwcGVkIG9uIiBieSBzdHJvbmdlciB0cmFuc21pc3Npb25zIHdpdGhpbiBvdXIgb3duIG5ldHdvcmsuCi0gKiBUaGlzIGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZXQgYSBzZW5zaXRpdml0eSBsZXZlbCB0aGF0IGlzIGhpZ2gKLSAqICAgZW5vdWdoIHRvIHJlY2VpdmUgYWxsIG9mIG91ciBvd24gbmV0d29yayB0cmFmZmljLCBidXQgbm90IHNvCi0gKiAgIGhpZ2ggdGhhdCBvdXIgRFNQIGdldHMgdG9vIGJ1c3kgdHJ5aW5nIHRvIGxvY2sgb250byBub24tbmV0d29yawotICogICBhY3Rpdml0eS9ub2lzZS4gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZW5zX2VuZXJneV9jY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHUzMiBub3JtX2ZhLAotCQkJCSAgIHUzMiByeF9lbmFibGVfdGltZSwKLQkJCQkgICBzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgKnJ4X2luZm8pCi17Ci0JdTMyIG1heF9ucmdfY2NrID0gMDsKLQlpbnQgaSA9IDA7Ci0JdTggbWF4X3NpbGVuY2VfcnNzaSA9IDA7Ci0JdTMyIHNpbGVuY2VfcmVmID0gMDsKLQl1OCBzaWxlbmNlX3Jzc2lfYSA9IDA7Ci0JdTggc2lsZW5jZV9yc3NpX2IgPSAwOwotCXU4IHNpbGVuY2VfcnNzaV9jID0gMDsKLQl1MzIgdmFsOwotCi0JLyogImZhbHNlX2FsYXJtcyIgdmFsdWVzIGJlbG93IGFyZSBjcm9zcy1tdWx0aXBsaWNhdGlvbnMgdG8gYXNzZXNzIHRoZQotCSAqICAgbnVtYmVycyBvZiBmYWxzZSBhbGFybXMgd2l0aGluIHRoZSBtZWFzdXJlZCBwZXJpb2Qgb2YgYWN0dWFsIFJ4Ci0JICogICAoUnggaXMgb2ZmIHdoZW4gd2UncmUgdHhpbmcpLCB2cyB0aGUgbWluL21heCBleHBlY3RlZCBmYWxzZSBhbGFybXMKLQkgKiAgIChzb21lIHNob3VsZCBiZSBleHBlY3RlZCBpZiByeCBpcyBzZW5zaXRpdmUgZW5vdWdoKSBpbiBhCi0JICogICBoeXBvdGhldGljYWwgbGlzdGVuaW5nIHBlcmlvZCBvZiAyMDAgdGltZSB1bml0cyAoVFUpLCAyMDQuOCBtc2VjOgotCSAqCi0JICogTUlOX0ZBL2ZpeGVkLXRpbWUgPCBmYWxzZV9hbGFybXMvYWN0dWFsLXJ4LXRpbWUgPCBNQVhfRkEvYmVhY29uLXRpbWUKLQkgKgotCSAqICovCi0JdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OwotCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOwotCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IDA7Ci0KLQkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLgotCSAqIFRoaXMgaXMgYmFja2dyb3VuZCBub2lzZSwgd2hpY2ggbWF5IGluY2x1ZGUgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCi0JICogICAgbmV0d29ya3MsIG1lYXN1cmVkIGR1cmluZyBzaWxlbmNlIGJlZm9yZSBvdXIgbmV0d29yaydzIGJlYWNvbiAqLwotCXNpbGVuY2VfcnNzaV9hID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCXNpbGVuY2VfcnNzaV9iID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCXNpbGVuY2VfcnNzaV9jID0gKHU4KSgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jICYKLQkJCSAgICBBTExfQkFORF9GSUxURVIpID4+IDgpOwotCi0JdmFsID0gbWF4KHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYyk7Ci0JbWF4X3NpbGVuY2VfcnNzaSA9IG1heChzaWxlbmNlX3Jzc2lfYSwgKHU4KSB2YWwpOwotCi0JLyogU3RvcmUgc2lsZW5jZSByc3NpIGluIDIwLWJlYWNvbiBoaXN0b3J5IHRhYmxlICovCi0JZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtkYXRhLT5ucmdfc2lsZW5jZV9pZHhdID0gbWF4X3NpbGVuY2VfcnNzaTsKLQlkYXRhLT5ucmdfc2lsZW5jZV9pZHgrKzsKLQlpZiAoZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID49IE5SR19OVU1fUFJFVl9TVEFUX0wpCi0JCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7Ci0KLQkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYWNyb3NzIDIwIGJlYWNvbiBoaXN0b3J5ICovCi0JZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykgewotCQl2YWwgPSBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldOwotCQlzaWxlbmNlX3JlZiA9IG1heChzaWxlbmNlX3JlZiwgdmFsKTsKLQl9Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIDIwLWJjbiBtYXggJXVcbiIsCi0JCQlzaWxlbmNlX3Jzc2lfYSwgc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jLAotCQkJc2lsZW5jZV9yZWYpOwotCi0JLyogRmluZCBtYXggcnggZW5lcmd5IChtaW4gdmFsdWUhKSBhbW9uZyBhbGwgMyByZWNlaXZlcnMsCi0JICogICBtZWFzdXJlZCBkdXJpbmcgYmVhY29uIGZyYW1lLgotCSAqIFNhdmUgaXQgaW4gMTAtYmVhY29uIGhpc3RvcnkgdGFibGUuICovCi0JaSA9IGRhdGEtPm5yZ19lbmVyZ3lfaWR4OwotCXZhbCA9IG1pbihyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYyk7Ci0JZGF0YS0+bnJnX3ZhbHVlW2ldID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSwgdmFsKTsKLQotCWRhdGEtPm5yZ19lbmVyZ3lfaWR4Kys7Ci0JaWYgKGRhdGEtPm5yZ19lbmVyZ3lfaWR4ID49IDEwKQotCQlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7Ci0KLQkvKiBGaW5kIG1pbiByeCBlbmVyZ3kgKG1heCB2YWx1ZSkgYWNyb3NzIDEwIGJlYWNvbiBoaXN0b3J5LgotCSAqIFRoaXMgaXMgdGhlIG1pbmltdW0gc2lnbmFsIGxldmVsIHRoYXQgd2Ugd2FudCB0byByZWNlaXZlIHdlbGwuCi0JICogQWRkIGJhY2tvZmYgKG1hcmdpbiBzbyB3ZSBkb24ndCBtaXNzIHNsaWdodGx5IGxvd2VyIGVuZXJneSBmcmFtZXMpLgotCSAqIFRoaXMgZXN0YWJsaXNoZXMgYW4gdXBwZXIgYm91bmQgKG1pbiB2YWx1ZSkgZm9yIGVuZXJneSB0aHJlc2hvbGQuICovCi0JbWF4X25yZ19jY2sgPSBkYXRhLT5ucmdfdmFsdWVbMF07Ci0JZm9yIChpID0gMTsgaSA8IDEwOyBpKyspCi0JCW1heF9ucmdfY2NrID0gKHUzMikgbWF4KG1heF9ucmdfY2NrLCAoZGF0YS0+bnJnX3ZhbHVlW2ldKSk7Ci0JbWF4X25yZ19jY2sgKz0gNjsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnggZW5lcmd5IGEgJXUsIGIgJXUsIGMgJXUsIDEwLWJjbiBtYXgvbWluICV1XG4iLAotCQkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCByeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IsCi0JCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MsIG1heF9ucmdfY2NrIC0gNik7Ci0KLQkvKiBDb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmVhY29ucyB3aXRoIGZld2VyLXRoYW4tZGVzaXJlZAotCSAqICAgZmFsc2UgYWxhcm1zLiAqLwotCWlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKQotCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKys7Ci0JZWxzZQotCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNvbnNlY3V0aXZlIGJjbnMgd2l0aCBmZXcgZmFsc2UgYWxhcm1zID0gJXVcbiIsCi0JCQlkYXRhLT5udW1faW5fY2NrX25vX2ZhKTsKLQotCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KLQlpZiAoKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpICYmCi0JCShkYXRhLT5hdXRvX2NvcnJfY2NrID4gQVVUT19DT1JSX01BWF9USF9DQ0spKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA+IG1heCBGQSAldVxuIiwKLQkJICAgICBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiByZWR1Y2luZyBzZW5zaXRpdml0eVxuIik7Ci0JCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCQkvKiBTdG9yZSBmb3IgImZld2VyIHRoYW4gZGVzaXJlZCIgb24gbGF0ZXIgYmVhY29uICovCi0JCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOwotCi0JCS8qIGluY3JlYXNlIGVuZXJneSB0aHJlc2hvbGQgKHJlZHVjZSBucmcgdmFsdWUpCi0JCSAqICAgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KLQkJZGF0YS0+bnJnX3RoX2NjayA9IGRhdGEtPm5yZ190aF9jY2sgLSBOUkdfU1RFUF9DQ0s7Ci0JLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCX0gZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgewotCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fRkVXOwotCi0JCS8qIENvbXBhcmUgc2lsZW5jZSBsZXZlbCB3aXRoIHNpbGVuY2UgbGV2ZWwgZm9yIG1vc3QgcmVjZW50Ci0JCSAqICAgaGVhbHRoeSBudW1iZXIgb3IgdG9vIG1hbnkgZmFsc2UgYWxhcm1zICovCi0JCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0gKHMzMilkYXRhLT5ucmdfc2lsZW5jZV9yZWYgLQotCQkJCQkJICAgKHMzMilzaWxlbmNlX3JlZjsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCSAibm9ybSBGQSAldSA8IG1pbiBGQSAldSwgc2lsZW5jZSBkaWZmICVkXG4iLAotCQkJIGZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcywKLQkJCSBkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7Ci0KLQkJLyogSW5jcmVhc2UgdmFsdWUgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHksIGJ1dCBvbmx5IGlmOgotCQkgKiAxYSkgcHJldmlvdXMgYmVhY29uIGRpZCAqbm90KiBoYXZlICp0b28gbWFueSogZmFsc2UgYWxhcm1zCi0JCSAqIDFiKSBBTkQgdGhlcmUncyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gUnggbGV2ZWxzCi0JCSAqICAgICAgZnJvbSBhIHByZXZpb3VzIGJlYWNvbiB3aXRoIHRvbyBtYW55LCBvciBoZWFsdGh5ICMgRkFzCi0JCSAqIE9SIDIpIFdlJ3ZlIHNlZW4gYSBsb3Qgb2YgYmVhY29ucyAoMTAwKSB3aXRoIHRvbyBmZXcKLQkJICogICAgICAgZmFsc2UgYWxhcm1zICovCi0JCWlmICgoZGF0YS0+bnJnX3ByZXZfc3RhdGUgIT0gSVdMX0ZBX1RPT19NQU5ZKSAmJgotCQkJKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAotCQkJKGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpKSB7Ci0KLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHlcbiIpOwotCQkJLyogSW5jcmVhc2UgbnJnIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JCQl2YWwgPSBkYXRhLT5ucmdfdGhfY2NrICsgTlJHX1NURVBfQ0NLOwotCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1pbigodTMyKXJhbmdlcy0+bWluX25yZ19jY2ssIHZhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkJICIuLi4gYnV0IG5vdCBjaGFuZ2luZyBzZW5zaXRpdml0eVxuIik7Ci0JCX0KLQotCS8qIEVsc2Ugd2UgZ290IGEgaGVhbHRoeSBudW1iZXIgb2YgZmFsc2UgYWxhcm1zLCBrZWVwIHN0YXR1cyBxdW8gKi8KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIiBGQSBpbiBzYWZlIHpvbmVcbiIpOwotCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9HT09EX1JBTkdFOwotCi0JCS8qIFN0b3JlIGZvciB1c2UgaW4gImZld2VyIHRoYW4gZGVzaXJlZCIgd2l0aCBsYXRlciBiZWFjb24gKi8KLQkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmID0gc2lsZW5jZV9yZWY7Ci0KLQkJLyogSWYgcHJldmlvdXMgYmVhY29uIGhhZCB0b28gbWFueSBmYWxzZSBhbGFybXMsCi0JCSAqICAgZ2l2ZSBpdCBzb21lIGV4dHJhIG1hcmdpbiBieSByZWR1Y2luZyBzZW5zaXRpdml0eSBhZ2FpbgotCQkgKiAgIChidXQgZG9uJ3QgZ28gYmVsb3cgbWVhc3VyZWQgZW5lcmd5IG9mIGRlc2lyZWQgUngpICovCi0JCWlmIChJV0xfRkFfVE9PX01BTlkgPT0gZGF0YS0+bnJnX3ByZXZfc3RhdGUpIHsKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiLi4uIGluY3JlYXNpbmcgbWFyZ2luXG4iKTsKLQkJCWlmIChkYXRhLT5ucmdfdGhfY2NrID4gKG1heF9ucmdfY2NrICsgTlJHX01BUkdJTikpCi0JCQkJZGF0YS0+bnJnX3RoX2NjayAtPSBOUkdfTUFSR0lOOwotCQkJZWxzZQotCQkJCWRhdGEtPm5yZ190aF9jY2sgPSBtYXhfbnJnX2NjazsKLQkJfQotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgZW5lcmd5IHRocmVzaG9sZCBkb2VzIG5vdCBnbyBhYm92ZSB0aGUgbWVhc3VyZWQKLQkgKiBlbmVyZ3kgb2YgdGhlIGRlc2lyZWQgUnggc2lnbmFscyAocmVkdWNlZCBieSBiYWNrb2ZmIG1hcmdpbiksCi0JICogb3IgZWxzZSB3ZSBtaWdodCBzdGFydCBtaXNzaW5nIFJ4IGZyYW1lcy4KLQkgKiBMb3dlciB2YWx1ZSBpcyBoaWdoZXIgZW5lcmd5LCBzbyB3ZSB1c2UgbWF4KCkhCi0JICovCi0JZGF0YS0+bnJnX3RoX2NjayA9IG1heChtYXhfbnJnX2NjaywgZGF0YS0+bnJnX3RoX2Njayk7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJuZXcgbnJnX3RoX2NjayAldVxuIiwgZGF0YS0+bnJnX3RoX2Njayk7Ci0KLQlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IGRhdGEtPm5yZ19jdXJyX3N0YXRlOwotCi0JLyogQXV0by1jb3JyZWxhdGlvbiBDQ0sgYWxnb3JpdGhtICovCi0JaWYgKGZhbHNlX2FsYXJtcyA+IG1pbl9mYWxzZV9hbGFybXMpIHsKLQotCQkvKiBpbmNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5Ci0JCSAqIHNvIHRoZSBEU1Agd29uJ3QgYmUgZGlzdHVyYmVkIGJ5IHRoZSBub2lzZQotCQkgKi8KLQkJaWYgKGRhdGEtPmF1dG9fY29ycl9jY2sgPCBBVVRPX0NPUlJfTUFYX1RIX0NDSykKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBBVVRPX0NPUlJfTUFYX1RIX0NDSyArIDE7Ci0JCWVsc2UgewotCQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayArIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPQotCQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2ssIHZhbCk7Ci0JCX0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgKyBBVVRPX0NPUlJfU1RFUF9DQ0s7Ci0JCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9jY2tfbXJjLCB2YWwpOwotCX0gZWxzZSBpZiAoKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpICYmCi0JICAgKChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGKSB8fAotCSAgIChkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSkgewotCi0JCS8qIERlY3JlYXNlIGF1dG9fY29yciB2YWx1ZXMgdG8gaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJZGF0YS0+YXV0b19jb3JyX2NjayA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrLCB2YWwpOwotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyAtIEFVVE9fQ09SUl9TVEVQX0NDSzsKLQkJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2Nja19tcmMsIHZhbCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpd2w0OTY1X3NlbnNfYXV0b19jb3JyX29mZG0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICB1MzIgbm9ybV9mYSwKLQkJCQkgICAgICAgdTMyIHJ4X2VuYWJsZV90aW1lKQotewotCXUzMiB2YWw7Ci0JdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OwotCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX09GRE0gKiByeF9lbmFibGVfdGltZTsKLQl1MzIgbWluX2ZhbHNlX2FsYXJtcyA9IE1JTl9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyAqcmFuZ2VzID0gcHJpdi0+aHdfcGFyYW1zLnNlbnM7Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCS8qIElmIHdlIGdvdCB0b28gbWFueSBmYWxzZSBhbGFybXMgdGhpcyB0aW1lLCByZWR1Y2Ugc2Vuc2l0aXZpdHkgKi8KLQlpZiAoZmFsc2VfYWxhcm1zID4gbWF4X2ZhbHNlX2FsYXJtcykgewotCi0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA+IG1heCBGQSAldSlcbiIsCi0JCQkgICAgIGZhbHNlX2FsYXJtcywgbWF4X2ZhbHNlX2FsYXJtcyk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gKyBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9Ci0JCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1fbXJjLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1feDEsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yY194MSwgdmFsKTsKLQl9Ci0KLQkvKiBFbHNlIGlmIHdlIGdvdCBmZXdlciB0aGFuIGRlc2lyZWQsIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JZWxzZSBpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykgewotCi0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibm9ybSBGQSAldSA8IG1pbiBGQSAldVxuIiwKLQkJCSAgICAgZmFsc2VfYWxhcm1zLCBtaW5fZmFsc2VfYWxhcm1zKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSAtIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyAtIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmMsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1feDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxLCB2YWwpOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluIEZBICV1IDwgbm9ybSBGQSAldSA8IG1heCBGQSAldSBPS1xuIiwKLQkJCSBtaW5fZmFsc2VfYWxhcm1zLCBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSwKLQkJCQlfX2xlMTYgKnRibCkKLXsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG0pOwotCXRibFtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1feDEpOwotCXRibFtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKLQotCXRibFtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5hdXRvX2NvcnJfY2NrKTsKLQl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKLQotCXRibFtIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPm5yZ190aF9jY2spOwotCXRibFtIRF9NSU5fRU5FUkdZX09GRE1fREVUX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbik7Ci0JdGJsW0hEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluX21yYyk7Ci0JdGJsW0hEX09GRE1fRU5FUkdZX1RIX0lOX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoZGF0YS0+bnJnX3RoX2NjYSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm9mZG06IGFjICV1IG1yYyAldSB4MSAldSBtcmNfeDEgJXUgdGhyZXNoICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG0sIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYywKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxLCBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEsCi0JCQlkYXRhLT5ucmdfdGhfb2ZkbSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNjazogYWMgJXUgbXJjICV1IHRocmVzaCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2ssIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjLAotCQkJZGF0YS0+bnJnX3RoX2Njayk7Ci19Ci0KLS8qIFByZXBhcmUgYSBTRU5TSVRJVklUWV9DTUQsIHNlbmQgdG8gdUNvZGUgaWYgdmFsdWVzIGhhdmUgY2hhbmdlZCAqLwotc3RhdGljIGludCBpd2w0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCBjbWQ7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZF9vdXQgPSB7Ci0JCS5pZCA9IFNFTlNJVElWSVRZX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCksCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmRhdGEgPSAmY21kLAotCX07Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQlpd2w0OTY1X3ByZXBhcmVfbGVnYWN5X3NlbnNpdGl2aXR5X3RibChwcml2LCBkYXRhLCAmY21kLnRhYmxlWzBdKTsKLQotCS8qIFVwZGF0ZSB1Q29kZSdzICJ3b3JrIiB0YWJsZSwgYW5kIGNvcHkgaXQgdG8gRFNQICovCi0JY21kLmNvbnRyb2wgPSBTRU5TSVRJVklUWV9DTURfQ09OVFJPTF9XT1JLX1RBQkxFOwotCi0JLyogRG9uJ3Qgc2VuZCBjb21tYW5kIHRvIHVDb2RlIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoIW1lbWNtcCgmY21kLnRhYmxlWzBdLCAmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksCi0JCSAgICBzaXplb2YodTE2KSpIRF9UQUJMRV9TSVpFKSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIk5vIGNoYW5nZSBpbiBTRU5TSVRJVklUWV9DTURcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBDb3B5IHRhYmxlIGZvciBjb21wYXJpc29uIG5leHQgdGltZSAqLwotCW1lbWNweSgmKHByaXYtPnNlbnNpdGl2aXR5X3RibFswXSksICYoY21kLnRhYmxlWzBdKSwKLQkgICAgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kX291dCk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBwcml2LT5od19wYXJhbXMuc2VuczsKLQotCWlmIChwcml2LT5kaXNhYmxlX3NlbnNfY2FsKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlN0YXJ0IGl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eVxuIik7Ci0KLQkvKiBDbGVhciBkcml2ZXIncyBzZW5zaXRpdml0eSBhbGdvIGRhdGEgKi8KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCWlmIChyYW5nZXMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEpKTsKLQotCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPSAwOwotCWRhdGEtPm5yZ19jdXJyX3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCWRhdGEtPm5yZ19wcmV2X3N0YXRlID0gSVdMX0ZBX1RPT19NQU5ZOwotCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IDA7Ci0JZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKLQlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJZGF0YS0+bnJnX3ZhbHVlW2ldID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspCi0JCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV0gPSAwOwotCi0JZGF0YS0+YXV0b19jb3JyX29mZG0gPSAgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG07Ci0JZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0gcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxICA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX3gxOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKLQlkYXRhLT5hdXRvX2NvcnJfY2NrID0gQVVUT19DT1JSX0NDS19NSU5fVkFMX0RFRjsKLQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2tfbXJjOwotCWRhdGEtPm5yZ190aF9jY2sgPSByYW5nZXMtPm5yZ190aF9jY2s7Ci0JZGF0YS0+bnJnX3RoX29mZG0gPSByYW5nZXMtPm5yZ190aF9vZmRtOwotCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbiA9IHJhbmdlcy0+YmFya2VyX2NvcnJfdGhfbWluOwotCWRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMgPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmM7Ci0JZGF0YS0+bnJnX3RoX2NjYSA9IHJhbmdlcy0+bnJnX3RoX2NjYTsKLQotCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSAwOwotCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSAwOwotCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IDA7Ci0JZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gMDsKLQotCXJldCB8PSBpd2w0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHByaXYpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDxyZXR1cm4gMHglWFxuIiwgcmV0KTsKLX0KLQotdm9pZCBpd2w0OTY1X3NlbnNpdGl2aXR5X2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqcmVzcCkKLXsKLQl1MzIgcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIGZhX2NjazsKLQl1MzIgZmFfb2ZkbTsKLQl1MzIgYmFkX3BsY3BfY2NrOwotCXUzMiBiYWRfcGxjcF9vZmRtOwotCXUzMiBub3JtX2ZhX29mZG07Ci0JdTMyIG5vcm1fZmFfY2NrOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSAqcnhfaW5mbzsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICpjY2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2RhdGEgc3RhdGlzOwotCi0JaWYgKHByaXYtPmRpc2FibGVfc2Vuc19jYWwpCi0JCXJldHVybjsKLQotCWRhdGEgPSAmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cnguZ2VuZXJhbCk7Ci0Jb2ZkbSA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cngub2ZkbSk7Ci0JY2NrID0gJigoKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqKXJlc3ApLT5yeC5jY2spOwotCi0JaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiPDwgaW52YWxpZCBkYXRhLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEV4dHJhY3QgU3RhdGlzdGljczogKi8KLQlyeF9lbmFibGVfdGltZSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmNoYW5uZWxfbG9hZCk7Ci0JZmFfY2NrID0gbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpOwotCWZhX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCWJhZF9wbGNwX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpOwotCWJhZF9wbGNwX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2Vycik7Ci0KLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9hID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSk7Ci0Jc3RhdGlzLmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOwotCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2MgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9hID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSk7Ci0Jc3RhdGlzLmJlYWNvbl9lbmVyZ3lfYiA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2IpOwotCXN0YXRpcy5iZWFjb25fZW5lcmd5X2MgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAicnhfZW5hYmxlX3RpbWUgPSAldSB1c2Vjc1xuIiwgcnhfZW5hYmxlX3RpbWUpOwotCi0JaWYgKCFyeF9lbmFibGVfdGltZSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IFJYIEVuYWJsZSBUaW1lID09IDAhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZXNlIHN0YXRpc3RpY3MgaW5jcmVhc2UgbW9ub3RvbmljYWxseSwgYW5kIGRvIG5vdCByZXNldAotCSAqICAgYXQgZWFjaCBiZWFjb24uICBDYWxjdWxhdGUgZGlmZmVyZW5jZSBmcm9tIGxhc3QgdmFsdWUsIG9yIGp1c3QKLQkgKiAgIHVzZSB0aGUgbmV3IHN0YXRpc3RpY3MgdmFsdWUgaWYgaXQgaGFzIHJlc2V0IG9yIHdyYXBwZWQgYXJvdW5kLiAqLwotCWlmIChkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPiBiYWRfcGxjcF9jY2spCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA9IGJhZF9wbGNwX2NjazsKLQllbHNlIHsKLQkJYmFkX3BsY3BfY2NrIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjazsKLQkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrICs9IGJhZF9wbGNwX2NjazsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSA+IGJhZF9wbGNwX29mZG0pCi0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPSBiYWRfcGxjcF9vZmRtOwotCWVsc2UgewotCQliYWRfcGxjcF9vZmRtIC09IGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gKz0gYmFkX3BsY3Bfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSA+IGZhX29mZG0pCi0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gPSBmYV9vZmRtOwotCWVsc2UgewotCQlmYV9vZmRtIC09IGRhdGEtPmxhc3RfZmFfY250X29mZG07Ci0JCWRhdGEtPmxhc3RfZmFfY250X29mZG0gKz0gZmFfb2ZkbTsKLQl9Ci0KLQlpZiAoZGF0YS0+bGFzdF9mYV9jbnRfY2NrID4gZmFfY2NrKQotCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgPSBmYV9jY2s7Ci0JZWxzZSB7Ci0JCWZhX2NjayAtPSBkYXRhLT5sYXN0X2ZhX2NudF9jY2s7Ci0JCWRhdGEtPmxhc3RfZmFfY250X2NjayArPSBmYV9jY2s7Ci0JfQotCi0JLyogVG90YWwgYWJvcnRlZCBzaWduYWwgbG9ja3MgKi8KLQlub3JtX2ZhX29mZG0gPSBmYV9vZmRtICsgYmFkX3BsY3Bfb2ZkbTsKLQlub3JtX2ZhX2NjayA9IGZhX2NjayArIGJhZF9wbGNwX2NjazsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LAotCQkJICJjY2s6IGZhICV1IGJhZHAgJXUgIG9mZG06IGZhICV1IGJhZHAgJXVcbiIsIGZhX2NjaywKLQkJCWJhZF9wbGNwX2NjaywgZmFfb2ZkbSwgYmFkX3BsY3Bfb2ZkbSk7Ci0KLQlpd2w0OTY1X3NlbnNfYXV0b19jb3JyX29mZG0ocHJpdiwgbm9ybV9mYV9vZmRtLCByeF9lbmFibGVfdGltZSk7Ci0JaXdsNDk2NV9zZW5zX2VuZXJneV9jY2socHJpdiwgbm9ybV9mYV9jY2ssIHJ4X2VuYWJsZV90aW1lLCAmc3RhdGlzKTsKLQotCWl3bDQ5NjVfc2Vuc2l0aXZpdHlfd3JpdGUocHJpdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHU4IG1hc2spCi17Ci0JaWYgKG1hc2sgJiBBTlRfQSkKLQkJcmV0dXJuIENIQUlOX0E7Ci0JaWYgKG1hc2sgJiBBTlRfQikKLQkJcmV0dXJuIENIQUlOX0I7Ci0JcmV0dXJuIENIQUlOX0M7Ci19Ci0KLS8qKgotICogUnVuIGRpc2Nvbm5lY3RlZCBhbnRlbm5hIGFsZ29yaXRobSB0byBmaW5kIG91dCB3aGljaCBhbnRlbm5hcyBhcmUKLSAqIGRpc2Nvbm5lY3RlZC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfZmluZF9kaXNjb25uX2FudGVubmEoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIqIGF2ZXJhZ2Vfc2lnLAotCQkJCSAgICAgc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhKQotewotCXUzMiBhY3RpdmVfY2hhaW5zID0gMDsKLQl1MzIgbWF4X2F2ZXJhZ2Vfc2lnOwotCXUxNiBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pOwotCXU4IG51bV90eF9jaGFpbnM7Ci0JdTggZmlyc3RfY2hhaW47Ci0JdTE2IGkgPSAwOwotCi0JYXZlcmFnZV9zaWdbMF0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYSAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9zaWdbMV0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYiAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9zaWdbMl0gPSBkYXRhLT5jaGFpbl9zaWduYWxfYyAvCi0JCQkgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0KLQlpZiAoYXZlcmFnZV9zaWdbMF0gPj0gYXZlcmFnZV9zaWdbMV0pIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMF07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAwOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfSBlbHNlIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMV07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAxOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfQotCi0JaWYgKGF2ZXJhZ2Vfc2lnWzJdID49IG1heF9hdmVyYWdlX3NpZykgewotCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1syXTsKLQkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDI7Ci0JCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKLQl9Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImF2ZXJhZ2Vfc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJICAgICBhdmVyYWdlX3NpZ1swXSwgYXZlcmFnZV9zaWdbMV0sIGF2ZXJhZ2Vfc2lnWzJdKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1heF9hdmVyYWdlX3NpZyA9ICVkLCBhbnRlbm5hICVkXG4iLAotCQkgICAgIG1heF9hdmVyYWdlX3NpZywgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0KLQkvKiBDb21wYXJlIHNpZ25hbCBzdHJlbmd0aHMgZm9yIGFsbCAzIHJlY2VpdmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmIChpICE9IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpIHsKLQkJCXMzMiByc3NpX2RlbHRhID0gKG1heF9hdmVyYWdlX3NpZyAtIGF2ZXJhZ2Vfc2lnW2ldKTsKLQotCQkJLyogSWYgc2lnbmFsIGlzIHZlcnkgd2VhaywgY29tcGFyZWQgd2l0aAotCQkJICogc3Ryb25nZXN0LCBtYXJrIGl0IGFzIGRpc2Nvbm5lY3RlZC4gKi8KLQkJCWlmIChyc3NpX2RlbHRhID4gTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTKQotCQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gPSAxOwotCQkJZWxzZQotCQkJCWFjdGl2ZV9jaGFpbnMgfD0gKDEgPDwgaSk7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImkgPSAlZCAgcnNzaURlbHRhID0gJWQgICIKLQkJCSAgICAgImRpc2Nvbm5fYXJyYXlbaV0gPSAlZFxuIiwKLQkJCSAgICAgaSwgcnNzaV9kZWx0YSwgZGF0YS0+ZGlzY29ubl9hcnJheVtpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBhYm92ZSBhbGdvcml0aG0gc29tZXRpbWVzIGZhaWxzIHdoZW4gdGhlIHVjb2RlCi0JICogcmVwb3J0cyAwIGZvciBhbGwgY2hhaW5zLiBJdCdzIG5vdCBjbGVhciB3aHkgdGhhdAotCSAqIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCwgYnV0IGl0IGlzIHRoZW4gY2F1c2luZyB0cm91YmxlCi0JICogYmVjYXVzZSB0aGlzIGNhbiBtYWtlIHVzIGVuYWJsZSBtb3JlIGNoYWlucyB0aGFuIHRoZQotCSAqIGhhcmR3YXJlIHJlYWxseSBoYXMuCi0JICoKLQkgKiBUbyBiZSBzYWZlLCBzaW1wbHkgbWFzayBvdXQgYW55IGNoYWlucyB0aGF0IHdlIGtub3cKLQkgKiBhcmUgbm90IG9uIHRoZSBkZXZpY2UuCi0JICovCi0JYWN0aXZlX2NoYWlucyAmPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JbnVtX3R4X2NoYWlucyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQkvKiBsb29wcyBvbiBhbGwgdGhlIGJpdHMgb2YKLQkJICogcHJpdi0+aHdfc2V0dGluZy52YWxpZF90eF9hbnQgKi8KLQkJdTggYW50X21zayA9ICgxIDw8IGkpOwotCQlpZiAoIShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgYW50X21zaykpCi0JCQljb250aW51ZTsKLQotCQludW1fdHhfY2hhaW5zKys7Ci0JCWlmIChkYXRhLT5kaXNjb25uX2FycmF5W2ldID09IDApCi0JCQkvKiB0aGVyZSBpcyBhIFR4IGFudGVubmEgY29ubmVjdGVkICovCi0JCQlicmVhazsKLQkJaWYgKG51bV90eF9jaGFpbnMgPT0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW0gJiYKLQkJICAgIGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pIHsKLQkJCS8qCi0JCQkgKiBJZiBhbGwgY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQKLQkJCSAqIGNvbm5lY3QgdGhlIGZpcnN0IHZhbGlkIHR4IGNoYWluCi0JCQkgKi8KLQkJCWZpcnN0X2NoYWluID0KLQkJCWl3bDQ5NjVfZmluZF9maXJzdF9jaGFpbihwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JCQlkYXRhLT5kaXNjb25uX2FycmF5W2ZpcnN0X2NoYWluXSA9IDA7Ci0JCQlhY3RpdmVfY2hhaW5zIHw9IEJJVChmaXJzdF9jaGFpbik7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkJIkFsbCBUeCBjaGFpbnMgYXJlIGRpc2Nvbm5lY3RlZCBXL0EgLSBkZWNsYXJlICVkIGFzIGNvbm5lY3RlZFxuIiwKLQkJCQkJZmlyc3RfY2hhaW4pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoYWN0aXZlX2NoYWlucyAhPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50ICYmCi0JICAgIGFjdGl2ZV9jaGFpbnMgIT0gcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCQkiRGV0ZWN0ZWQgdGhhdCBub3QgYWxsIGFudGVubmFzIGFyZSBjb25uZWN0ZWQhICIKLQkJCQkiQ29ubmVjdGVkOiAlI3gsIHZhbGlkOiAlI3guXG4iLAotCQkJCWFjdGl2ZV9jaGFpbnMsIHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQpOwotCi0JLyogU2F2ZSBmb3IgdXNlIHdpdGhpbiBSWE9OLCBUWCwgU0NBTiBjb21tYW5kcywgZXRjLiAqLwotCWRhdGEtPmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYWN0aXZlX2NoYWlucyAoYml0d2lzZSkgPSAweCV4XG4iLAotCQkJYWN0aXZlX2NoYWlucyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZ2Fpbl9jb21wdXRhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCXUzMiAqYXZlcmFnZV9ub2lzZSwKLQkJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSwKLQkJdTMyIG1pbl9hdmVyYWdlX25vaXNlLAotCQl1OCBkZWZhdWx0X2NoYWluKQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJnByaXYtPmNoYWluX25vaXNlX2RhdGE7Ci0KLQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pXSA9IDA7Ci0KLQlmb3IgKGkgPSBkZWZhdWx0X2NoYWluOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCXMzMiBkZWx0YV9nID0gMDsKLQotCQlpZiAoIShkYXRhLT5kaXNjb25uX2FycmF5W2ldKSAmJgotCQkgICAgKGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9PQotCQkJICAgICBDSEFJTl9OT0lTRV9ERUxUQV9HQUlOX0lOSVRfVkFMKSkgewotCQkJZGVsdGFfZyA9IGF2ZXJhZ2Vfbm9pc2VbaV0gLSBtaW5fYXZlcmFnZV9ub2lzZTsKLQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9ICh1OCkoKGRlbHRhX2cgKiAxMCkgLyAxNSk7Ci0JCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPQotCQkJCW1pbihkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0sCi0JCQkJKHU4KSBDSEFJTl9OT0lTRV9NQVhfREVMVEFfR0FJTl9DT0RFKTsKLQotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KLQkJCQkoZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldIHwgKDEgPDwgMikpOwotCQl9IGVsc2UgewotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0gMDsKLQkJfQotCX0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImRlbHRhX2dhaW5fY29kZXM6IGEgJWQgYiAlZCBjICVkXG4iLAotCQkgICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVswXSwKLQkJICAgICBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMV0sCi0JCSAgICAgZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdKTsKLQotCS8qIERpZmZlcmVudGlhbCBnYWluIGdldHMgc2VudCB0byB1Q29kZSBvbmx5IG9uY2UgKi8KLQlpZiAoIWRhdGEtPnJhZGlvX3dyaXRlKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7Ci0JCWRhdGEtPnJhZGlvX3dyaXRlID0gMTsKLQotCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCQljbWQuaGRyLm9wX2NvZGUgPSBJV0xfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EOwotCQljbWQuZGlmZl9nYWluX2EgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMF07Ci0JCWNtZC5kaWZmX2dhaW5fYiA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsxXTsKLQkJY21kLmRpZmZfZ2Fpbl9jID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdOwotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAotCQkJCSAgICAgIHNpemVvZihjbWQpLCAmY21kKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiZmFpbCBzZW5kaW5nIGNtZCAiCi0JCQkJICAgICAiUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRFxuIik7Ci0KLQkJLyogVE9ETyB3ZSBtaWdodCB3YW50IHJlY2FsY3VsYXRlCi0JCSAqIHJ4X2NoYWluIGluIHJ4b24gY21kICovCi0KLQkJLyogTWFyayBzbyB3ZSBydW4gdGhpcyBhbGdvIG9ubHkgb25jZSEgKi8KLQkJZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRDsKLQl9Ci19Ci0KLQotCi0vKgotICogQWNjdW11bGF0ZSAxNiBiZWFjb25zIG9mIHNpZ25hbCBhbmQgbm9pc2Ugc3RhdGlzdGljcyBmb3IgZWFjaCBvZgotICogICAzIHJlY2VpdmVycy9hbnRlbm5hcy9yeC1jaGFpbnMsIHRoZW4gZmlndXJlIG91dDoKLSAqIDEpICBXaGljaCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgotICogMikgIERpZmZlcmVudGlhbCByeCBnYWluIHNldHRpbmdzIHRvIGJhbGFuY2UgdGhlIDMgcmVjZWl2ZXJzLgotICovCi12b2lkIGl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpzdGF0X3Jlc3ApCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gTlVMTDsKLQotCXUzMiBjaGFpbl9ub2lzZV9hOwotCXUzMiBjaGFpbl9ub2lzZV9iOwotCXUzMiBjaGFpbl9ub2lzZV9jOwotCXUzMiBjaGFpbl9zaWdfYTsKLQl1MzIgY2hhaW5fc2lnX2I7Ci0JdTMyIGNoYWluX3NpZ19jOwotCXUzMiBhdmVyYWdlX3NpZ1tOVU1fUlhfQ0hBSU5TXSA9IHtJTklUSUFMSVpBVElPTl9WQUxVRX07Ci0JdTMyIGF2ZXJhZ2Vfbm9pc2VbTlVNX1JYX0NIQUlOU10gPSB7SU5JVElBTElaQVRJT05fVkFMVUV9OwotCXUzMiBtaW5fYXZlcmFnZV9ub2lzZSA9IE1JTl9BVkVSQUdFX05PSVNFX01BWF9WQUxVRTsKLQl1MTYgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pID0gSU5JVElBTElaQVRJT05fVkFMVUU7Ci0JdTE2IGkgPSAwOwotCXUxNiByeG9uX2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7Ci0JdTE2IHN0YXRfY2hudW0gPSBJTklUSUFMSVpBVElPTl9WQUxVRTsKLQl1OCByeG9uX2JhbmQyNDsKLQl1OCBzdGF0X2JhbmQyNDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKHByaXYtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKQotCQlyZXR1cm47Ci0KLQlkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKLQotCS8qCi0JICogQWNjdW11bGF0ZSBqdXN0IHRoZSBmaXJzdCAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiIGFmdGVyCi0JICogdGhlIGZpcnN0IGFzc29jaWF0aW9uLCB0aGVuIHdlJ3JlIGRvbmUgZm9yZXZlci4KLQkgKi8KLQlpZiAoZGF0YS0+c3RhdGUgIT0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEUpIHsKLQkJaWYgKGRhdGEtPnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRSkKLQkJCUlXTF9ERUJVR19DQUxJQihwcml2LCAiV2FpdCBmb3Igbm9pc2UgY2FsaWIgcmVzZXRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4X2luZm8gPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopc3RhdF9yZXNwKS0+Ci0JCSAgICAgIHJ4LmdlbmVyYWwpOwotCi0JaWYgKHJ4X2luZm8tPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcgIT0gSU5URVJGRVJFTkNFX0RBVEFfQVZBSUxBQkxFKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiIDw8IEludGVyZmVyZW5jZSBkYXRhIHVuYXZhaWxhYmxlXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0Jcnhvbl9iYW5kMjQgPSAhIShjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOwotCXJ4b25fY2hudW0gPSBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7Ci0KLQlzdGF0X2JhbmQyNCA9ICEhKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopCi0JCQkgc3RhdF9yZXNwKS0+ZmxhZyAmCi0JCQkgU1RBVElTVElDU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLKTsKLQlzdGF0X2NobnVtID0gbGUzMl90b19jcHUoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKikKLQkJCQkgc3RhdF9yZXNwKS0+ZmxhZykgPj4gMTY7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgYWNjdW11bGF0ZSBkYXRhIGZvciBqdXN0IHRoZSBhc3NvY2lhdGVkIGNoYW5uZWwKLQkgKiAgIChldmVuIGlmIHNjYW5uaW5nKS4gKi8KLQlpZiAoKHJ4b25fY2hudW0gIT0gc3RhdF9jaG51bSkgfHwgKHJ4b25fYmFuZDI0ICE9IHN0YXRfYmFuZDI0KSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlN0YXRzIG5vdCBmcm9tIGNoYW49JWQsIGJhbmQyND0lZFxuIiwKLQkJCQlyeG9uX2NobnVtLCByeG9uX2JhbmQyNCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogIEFjY3VtdWxhdGUgYmVhY29uIHN0YXRpc3RpY3MgdmFsdWVzIGFjcm9zcwotCSAqICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIKLQkgKi8KLQljaGFpbl9ub2lzZV9hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmCi0JCQkJSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fbm9pc2VfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYikgJgotCQkJCUlOX0JBTkRfRklMVEVSOwotCWNoYWluX25vaXNlX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYKLQkJCQlJTl9CQU5EX0ZJTFRFUjsKLQotCWNoYWluX3NpZ19hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKLQljaGFpbl9zaWdfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fc2lnX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JZGF0YS0+YmVhY29uX2NvdW50Kys7Ci0KLQlkYXRhLT5jaGFpbl9ub2lzZV9hID0gKGNoYWluX25vaXNlX2EgKyBkYXRhLT5jaGFpbl9ub2lzZV9hKTsKLQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gKGNoYWluX25vaXNlX2IgKyBkYXRhLT5jaGFpbl9ub2lzZV9iKTsKLQlkYXRhLT5jaGFpbl9ub2lzZV9jID0gKGNoYWluX25vaXNlX2MgKyBkYXRhLT5jaGFpbl9ub2lzZV9jKTsKLQotCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gKGNoYWluX3NpZ19hICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOwotCWRhdGEtPmNoYWluX3NpZ25hbF9iID0gKGNoYWluX3NpZ19iICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOwotCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gKGNoYWluX3NpZ19jICsgZGF0YS0+Y2hhaW5fc2lnbmFsX2MpOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJjaGFuPSVkLCBiYW5kMjQ9JWQsIGJlYWNvbj0lZFxuIiwKLQkJCXJ4b25fY2hudW0sIHJ4b25fYmFuZDI0LCBkYXRhLT5iZWFjb25fY291bnQpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fc2lnOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWNoYWluX3NpZ19hLCBjaGFpbl9zaWdfYiwgY2hhaW5fc2lnX2MpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhaW5fbm9pc2U6IGEgJWQgYiAlZCBjICVkXG4iLAotCQkJY2hhaW5fbm9pc2VfYSwgY2hhaW5fbm9pc2VfYiwgY2hhaW5fbm9pc2VfYyk7Ci0KLQkvKiBJZiB0aGlzIGlzIHRoZSAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiLCBkZXRlcm1pbmU6Ci0JICogMSkgIERpc2Nvbm5lY3RlZCBhbnRlbm5hcyAodXNpbmcgc2lnbmFsIHN0cmVuZ3RocykKLQkgKiAyKSAgRGlmZmVyZW50aWFsIGdhaW4gKHVzaW5nIHNpbGVuY2Ugbm9pc2UpIHRvIGJhbGFuY2UgcmVjZWl2ZXJzICovCi0JaWYgKGRhdGEtPmJlYWNvbl9jb3VudCAhPQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29ucykKLQkJcmV0dXJuOwotCi0JLyogQW5hbHl6ZSBzaWduYWwgZm9yIGRpc2Nvbm5lY3RlZCBhbnRlbm5hICovCi0JaXdsNDk2NV9maW5kX2Rpc2Nvbm5fYW50ZW5uYShwcml2LCBhdmVyYWdlX3NpZywgZGF0YSk7Ci0KLQkvKiBBbmFseXplIG5vaXNlIGZvciByeCBiYWxhbmNlICovCi0JYXZlcmFnZV9ub2lzZVswXSA9IGRhdGEtPmNoYWluX25vaXNlX2EgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9ub2lzZVsxXSA9IGRhdGEtPmNoYWluX25vaXNlX2IgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0JYXZlcmFnZV9ub2lzZVsyXSA9IGRhdGEtPmNoYWluX25vaXNlX2MgLwotCQkJICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7Ci0JCWlmICghKGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pICYmCi0JCSAgIChhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSkgewotCQkJLyogVGhpcyBtZWFucyB0aGF0IGNoYWluIGkgaXMgYWN0aXZlIGFuZCBoYXMKLQkJCSAqIGxvd2VyIG5vaXNlIHZhbHVlcyBzbyBmYXI6ICovCi0JCQltaW5fYXZlcmFnZV9ub2lzZSA9IGF2ZXJhZ2Vfbm9pc2VbaV07Ci0JCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kgPSBpOwotCQl9Ci0JfQotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWF2ZXJhZ2Vfbm9pc2VbMF0sIGF2ZXJhZ2Vfbm9pc2VbMV0sCi0JCQlhdmVyYWdlX25vaXNlWzJdKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAibWluX2F2ZXJhZ2Vfbm9pc2UgPSAlZCwgYW50ZW5uYSAlZFxuIiwKLQkJCW1pbl9hdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2kpOwotCi0JaXdsNDk2NV9nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCi0JCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksIG1pbl9hdmVyYWdlX25vaXNlLAotCQkJaXdsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7Ci0KLQkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCi0JICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KLQkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MocHJpdik7Ci0KLQlkYXRhLT5zdGF0ZSA9IElXTF9DSEFJTl9OT0lTRV9ET05FOwotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwotfQotCi12b2lkIGl3bDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCW1lbXNldCgmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSk7Ci0JbWVtc2V0KCYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSksIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKQotCQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLmRlbHRhX2dhaW5fY29kZVtpXSA9Ci0JCQkJQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTDsKLQotCS8qIEFzayBmb3Igc3RhdGlzdGljcyBub3csIHRoZSB1Q29kZSB3aWxsIHNlbmQgbm90aWZpY2F0aW9uCi0JICogcGVyaW9kaWNhbGx5IGFmdGVyIGFzc29jaWF0aW9uICovCi0JaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfQVNZTkMsIHRydWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NmM4MGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9faXdsXzQ5NjVfY2FsaWJfaF9fCi0jZGVmaW5lIF9faXdsXzQ5NjVfY2FsaWJfaF9fCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLQotdm9pZCBpd2w0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqc3RhdF9yZXNwKTsKLXZvaWQgaXdsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJlc3ApOwotdm9pZCBpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yZXNldF9ydW5fdGltZV9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0jZW5kaWYgLyogX19pd2xfNDk2NV9jYWxpYl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5MzY2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0qCi0qIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qCi0qIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0qIFVTQQotKgotKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0qCi0qIENvbnRhY3QgSW5mb3JtYXRpb246Ci0qICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1kZWJ1Z2ZzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbXRfdmFsdWUgPSAiICAlLTMwcyAlMTB1XG4iOwotc3RhdGljIGNvbnN0IGNoYXIgKmZtdF90YWJsZSA9ICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqZm10X2hlYWRlciA9Ci0JIiUtMzJzICAgIGN1cnJlbnQgIGN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiI7Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aXN0aWNzX2ZsYWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICpidWYsIGludCBidWZzeikKLXsKLQlpbnQgcCA9IDA7Ci0JdTMyIGZsYWc7Ci0KLQlmbGFnID0gbGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5mbGFnKTsKLQotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsIGZsYWcpOwotCWlmIChmbGFnICYgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0spCi0JCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwKLQkJIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkoZmxhZyAmIFVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSykKLQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJKGZsYWcgJiBVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSykKLQkJID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlyZXR1cm4gcDsKLX0KLQotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSkgKiA0MCArIDQwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICphY2N1bV9vZmRtLCAqZGVsdGFfb2ZkbSwgKm1heF9vZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSAqY2NrLCAqYWNjdW1fY2NrLCAqZGVsdGFfY2NrLCAqbWF4X2NjazsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5ICpodCwgKmFjY3VtX2h0LCAqZGVsdGFfaHQsICptYXhfaHQ7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCi0JICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5Ci0JICovCi0Jb2ZkbSA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JY2NrID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguY2NrOwotCWdlbmVyYWwgPSAmcHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWh0ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3Mucngub2ZkbV9odDsKLQlhY2N1bV9vZmRtID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3Mucngub2ZkbTsKLQlhY2N1bV9jY2sgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5jY2s7Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JYWNjdW1faHQgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5vZmRtX2h0OwotCWRlbHRhX29mZG0gPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtOwotCWRlbHRhX2NjayA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQlkZWx0YV9odCA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4Lm9mZG1faHQ7Ci0JbWF4X29mZG0gPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnJ4Lm9mZG07Ci0JbWF4X2NjayA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucnguY2NrOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOwotCW1heF9odCA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucngub2ZkbV9odDsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBPRkRNOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+aW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5pbmFfY250LCBtYXhfb2ZkbS0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9jbnQpLCBhY2N1bV9vZmRtLT5maW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX2NudCwgbWF4X29mZG0tPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAotCQkJIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfb2ZkbS0+Y3JjMzJfZXJyLCBtYXhfb2ZkbS0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9vZmRtLT5jcmMzMl9nb29kLCBkZWx0YV9vZmRtLT5jcmMzMl9nb29kLAotCQkJIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmFsc2VfYWxhcm1fY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+ZmFsc2VfYWxhcm1fY250LAotCQkJIG1heF9vZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X29mZG0tPnNmZF90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3RpbWVvdXQsIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAidW5yZXNwb25kZWRfcnRzOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LCBkZWx0YV9vZmRtLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LCBkZWx0YV9vZmRtLT5zZW50X2N0c19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9iYV9yc3BfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfYmFfcnNwX2NudCwKLQkJCSBtYXhfb2ZkbS0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmRzcF9zZWxmX2tpbGwpLAotCQkJIGFjY3VtX29mZG0tPmRzcF9zZWxmX2tpbGwsCi0JCQkgZGVsdGFfb2ZkbS0+ZHNwX3NlbGZfa2lsbCwKLQkJCSBtYXhfb2ZkbS0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5taF9mb3JtYXRfZXJyKSwKLQkJCSBhY2N1bV9vZmRtLT5taF9mb3JtYXRfZXJyLAotCQkJIGRlbHRhX29mZG0tPm1oX2Zvcm1hdF9lcnIsCi0JCQkgbWF4X29mZG0tPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnJlX2FjcV9tYWluX3Jzc2lfc3VtKSwKLQkJCSBhY2N1bV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBkZWx0YV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfb2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0pOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5pbmFfY250KSwgYWNjdW1fY2NrLT5pbmFfY250LAotCQkJIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5maW5hX2NudCksIGFjY3VtX2Njay0+ZmluYV9jbnQsCi0JCQkgZGVsdGFfY2NrLT5maW5hX2NudCwgbWF4X2Njay0+ZmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJwbGNwX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpLCBhY2N1bV9jY2stPnBsY3BfZXJyLAotCQkJIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9lcnIpLCBhY2N1bV9jY2stPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm92ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPm92ZXJydW5fZXJyLCBkZWx0YV9jY2stPm92ZXJydW5fZXJyLAotCQkJIG1heF9jY2stPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9nb29kKSwgYWNjdW1fY2NrLT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9zeW5jX2Vycl9jbnQsCi0JCQkgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LAotCQkJIG1heF9jY2stPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9jY2stPnVucmVzcG9uZGVkX3J0cywgZGVsdGFfY2NrLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCi0JCQkgZGVsdGFfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBtYXhfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwgZGVsdGFfY2NrLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2VudF9jdHNfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5zZW50X2N0c19jbnQpLAotCQkJIGFjY3VtX2Njay0+c2VudF9jdHNfY250LCBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2N0c19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZW50X2JhX3JzcF9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZHNwX3NlbGZfa2lsbCksCi0JCQkgYWNjdW1fY2NrLT5kc3Bfc2VsZl9raWxsLCBkZWx0YV9jY2stPmRzcF9zZWxmX2tpbGwsCi0JCQkgbWF4X2Njay0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm1oX2Zvcm1hdF9lcnIpLAotCQkJIGFjY3VtX2Njay0+bWhfZm9ybWF0X2VyciwgZGVsdGFfY2NrLT5taF9mb3JtYXRfZXJyLAotCQkJIG1heF9jY2stPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAotCQkJIGFjY3VtX2Njay0+cmVfYWNxX21haW5fcnNzaV9zdW0sCi0JCQkgZGVsdGFfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBHRU5FUkFMOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19jdHM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2N0cywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfY3RzLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19hY2s6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19hY2spLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19hY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fYnNzaWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmlsdGVyZWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fbWlzc2VkX2Jjb246IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24pLAotCQkJIGFjY3VtX2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbiwKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24sCi0JCQkgbWF4X2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFkY19yeF9zYXR1cmF0aW9uX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCi0JCQkgbWF4X2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfZGV0ZWN0X3NlYXJjaF90bToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSwKLQkJCSBtYXhfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3NpbGVuY2VfcnNzaV9iOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fc2lsZW5jZV9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImludGVyZmVyZW5jZV9kYXRhX2ZsYWc6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAotCQkJIGRlbHRhX2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcsCi0JCQkgbWF4X2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjaGFubmVsX2xvYWQ6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5jaGFubmVsX2xvYWQpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmNoYW5uZWxfbG9hZCwKLQkJCSBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsCi0JCQkgbWF4X2dlbmVyYWwtPmNoYW5uZWxfbG9hZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImRzcF9mYWxzZV9hbGFybXM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zLAotCQkJIGRlbHRhX2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMsCi0JCQkgbWF4X2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9hOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9hLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2IpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9jLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2E6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9jOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gT0ZETV9IVDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+cGxjcF9lcnIpLCBhY2N1bV9odC0+cGxjcF9lcnIsCi0JCQkgZGVsdGFfaHQtPnBsY3BfZXJyLCBtYXhfaHQtPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9odC0+b3ZlcnJ1bl9lcnIsCi0JCQkgZGVsdGFfaHQtPm92ZXJydW5fZXJyLCBtYXhfaHQtPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX2h0LT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9odC0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2h0LT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZ29vZCksIGFjY3VtX2h0LT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2h0LT5jcmMzMl9nb29kLCBtYXhfaHQtPmNyYzMyX2dvb2QpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZXJyKSwgYWNjdW1faHQtPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9odC0+Y3JjMzJfZXJyLCBtYXhfaHQtPmNyYzMyX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+bWhfZm9ybWF0X2VyciksCi0JCQkgYWNjdW1faHQtPm1oX2Zvcm1hdF9lcnIsCi0JCQkgZGVsdGFfaHQtPm1oX2Zvcm1hdF9lcnIsIG1heF9odC0+bWhfZm9ybWF0X2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9odC0+YWdnX2NyYzMyX2dvb2QsCi0JCQkgZGVsdGFfaHQtPmFnZ19jcmMzMl9nb29kLCBtYXhfaHQtPmFnZ19jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnX21wZHVfY250OiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19tcGR1X2NudCksCi0JCQkgYWNjdW1faHQtPmFnZ19tcGR1X2NudCwKLQkJCSBkZWx0YV9odC0+YWdnX21wZHVfY250LCBtYXhfaHQtPmFnZ19tcGR1X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+YWdnX2NudCksIGFjY3VtX2h0LT5hZ2dfY250LAotCQkJIGRlbHRhX2h0LT5hZ2dfY250LCBtYXhfaHQtPmFnZ19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ1bnN1cHBvcnRfbWNzOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPnVuc3VwcG9ydF9tY3MpLAotCQkJIGFjY3VtX2h0LT51bnN1cHBvcnRfbWNzLAotCQkJIGRlbHRhX2h0LT51bnN1cHBvcnRfbWNzLCBtYXhfaHQtPnVuc3VwcG9ydF9tY3MpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3R4KSAqIDQ4KSArIDI1MDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCAqdHgsICphY2N1bV90eCwgKmRlbHRhX3R4LCAqbWF4X3R4OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQl0eCA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnR4OwotCWFjY3VtX3R4ID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MudHg7Ci0JZGVsdGFfdHggPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy50eDsKLQltYXhfdHggPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnR4OwotCi0JcG9zICs9IGl3bDQ5NjVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfaGVhZGVyLCAiU3RhdGlzdGljc19UeDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJlYW1ibGU6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+cHJlYW1ibGVfY250KSwKLQkJCSBhY2N1bV90eC0+cHJlYW1ibGVfY250LAotCQkJIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhfZGV0ZWN0ZWRfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPnJ4X2RldGVjdGVkX2NudCksCi0JCQkgYWNjdW1fdHgtPnJ4X2RldGVjdGVkX2NudCwKLQkJCSBkZWx0YV90eC0+cnhfZGV0ZWN0ZWRfY250LCBtYXhfdHgtPnJ4X2RldGVjdGVkX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJ0X3ByaW9fZGVmZXJfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKLQkJCSBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCi0JCQkgZGVsdGFfdHgtPmJ0X3ByaW9fZGVmZXJfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidF9wcmlvX2tpbGxfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fa2lsbF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIGRlbHRhX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19raWxsX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZld19ieXRlc19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+ZmV3X2J5dGVzX2NudCksCi0JCQkgYWNjdW1fdHgtPmZld19ieXRlc19jbnQsCi0JCQkgZGVsdGFfdHgtPmZld19ieXRlc19jbnQsIG1heF90eC0+ZmV3X2J5dGVzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmN0c190aW1lb3V0KSwgYWNjdW1fdHgtPmN0c190aW1lb3V0LAotCQkJIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFja190aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFja190aW1lb3V0LCBtYXhfdHgtPmFja190aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhwZWN0ZWRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5leHBlY3RlZF9hY2tfY250KSwKLQkJCSBhY2N1bV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBkZWx0YV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmV4cGVjdGVkX2Fja19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhY3R1YWxfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY3R1YWxfYWNrX2NudCksCi0JCQkgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAotCQkJIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmFjdHVhbF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHVtcF9tc2R1X2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5kdW1wX21zZHVfY250KSwKLQkJCSBhY2N1bV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBkZWx0YV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBtYXhfdHgtPmR1bXBfbXNkdV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhYm9ydF9ueHRfZnJhbWVfbWlzbWF0Y2g6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKLQkJCSBkZWx0YV90eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQsCi0JCQkgbWF4X3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFib3J0X21pc3Npbmdfbnh0X2ZyYW1lOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIG1heF90eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5jdHNfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja19iYV90aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBiYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5iYV90aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFnZy5iYV90aW1lb3V0LAotCQkJIG1heF90eC0+YWdnLmJhX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYmFfcmVzY2hlZF9mcmFtZXM6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzLAotCQkJIGRlbHRhX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCi0JCQkgbWF4X3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZ19mcmFtZToiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBzY2RfcXVlcnlfbm9fYWdnOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2csCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnLAotCQkJIG1heF90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2cpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZzoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyksCi0JCQkgYWNjdW1fdHgtPmFnZy5zY2RfcXVlcnlfYWdnLAotCQkJIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnIHNjZF9xdWVyeV9taXNtYXRjaDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBkZWx0YV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgZnJhbWVfbm90X3JlYWR5OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5mcmFtZV9ub3RfcmVhZHkpLAotCQkJIGFjY3VtX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIGRlbHRhX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIG1heF90eC0+YWdnLmZyYW1lX25vdF9yZWFkeSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyB1bmRlcnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cudW5kZXJydW4pLAotCQkJIGFjY3VtX3R4LT5hZ2cudW5kZXJydW4sCi0JCQkgZGVsdGFfdHgtPmFnZy51bmRlcnJ1biwgbWF4X3R4LT5hZ2cudW5kZXJydW4pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYnRfcHJpb19raWxsOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5idF9wcmlvX2tpbGwpLAotCQkJIGFjY3VtX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIGRlbHRhX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIG1heF90eC0+YWdnLmJ0X3ByaW9fa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyByeF9iYV9yc3BfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5yeF9iYV9yc3BfY250KSwKLQkJCSBhY2N1bV90eC0+YWdnLnJ4X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5yeF9iYV9yc3BfY250LAotCQkJIG1heF90eC0+YWdnLnJ4X2JhX3JzcF9jbnQpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCkgKiAxMCArIDMwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgKmRiZywgKmFjY3VtX2RiZywgKmRlbHRhX2RiZywgKm1heF9kYmc7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JZGJnID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWRpdiA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZGJnID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWFjY3VtX2RpdiA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uOwotCWRlbHRhX2RiZyA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRiZzsKLQltYXhfZGJnID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbi5kYmc7Ci0JZGVsdGFfZGl2ID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGl2OwotCW1heF9kaXYgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uLmRpdjsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3ZhbHVlLCAidGVtcGVyYXR1cmU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT50ZW1wZXJhdHVyZSkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdmFsdWUsICJ0dGxfdGltZXN0YW1wOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jaGVjazoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY2hlY2spLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY2hlY2ssCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jaGVjaywgbWF4X2RiZy0+YnVyc3RfY2hlY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jb3VudDoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY291bnQpLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY291bnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAotCQkJIGFjY3VtX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKLQkJCSBkZWx0YV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCi0JCQkgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNsZWVwX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbGVlcF90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfb3V0OiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbG90c19vdXQsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfb3V0LCBtYXhfZ2VuZXJhbC0+c2xvdHNfb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfaWRsZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ0eF9vbl9hOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT50eF9vbl9hKSwgYWNjdW1fZGl2LT50eF9vbl9hLAotCQkJIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInR4X29uX2I6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhlY190aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5leGVjX3RpbWUpLCBhY2N1bV9kaXYtPmV4ZWNfdGltZSwKLQkJCSBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJvYmVfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+cHJvYmVfdGltZSksIGFjY3VtX2Rpdi0+cHJvYmVfdGltZSwKLQkJCSBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeF9lbmFibGVfY291bnRlcjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnJ4X2VuYWJsZV9jb3VudGVyKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBkZWx0YV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBtYXhfZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fb2Zfc29zX3N0YXRlczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBtYXhfZ2VuZXJhbC0+bnVtX29mX3Nvc19zdGF0ZXMpOwotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZTM1My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLXNzaXplX3QgaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLSNlbHNlCi1zdGF0aWMgc3NpemVfdAotaXdsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotc3RhdGljIHNzaXplX3QKLWl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWJhYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucwotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoZSBkZXZpY2UncyBFRVBST00gc2VtYXBob3JlIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIGRyaXZlciBhbmQgdUNvZGUKLSAqIHdoZW4gYWNjZXNzaW5nIHRoZSBFRVBST007IGVhY2ggYWNjZXNzIGlzIGEgc2VyaWVzIG9mIHB1bHNlcyB0by9mcm9tIHRoZQotICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5Ci0gKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KLSAqLwotaW50IGl3bDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgY291bnQ7Ci0JaW50IHJldDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVFUFJPTV9TRU1fUkVUUllfTElNSVQ7IGNvdW50KyspIHsKLQkJLyogUmVxdWVzdCBzZW1hcGhvcmUgKi8KLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSk7Ci0KLQkJLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKLQkJCQlFRVBST01fU0VNX1RJTUVPVVQpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCUlXTF9ERUJVR19JTyhwcml2LAotCQkJCSJBY3F1aXJlZCBzZW1hcGhvcmUgYWZ0ZXIgJWQgdHJpZXMuXG4iLAotCQkJCWNvdW50KzEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOwotCi19Ci0KLWludCBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgZWVwcm9tX3ZlcjsKLQl1MTYgY2FsaWJfdmVyOwotCi0JZWVwcm9tX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pOwotCWNhbGliX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwKLQkJCUVFUFJPTV80OTY1X0NBTElCX1ZFUlNJT05fT0ZGU0VUKTsKLQotCWlmIChlZXByb21fdmVyIDwgcHJpdi0+Y2ZnLT5lZXByb21fdmVyIHx8Ci0JICAgIGNhbGliX3ZlciA8IHByaXYtPmNmZy0+ZWVwcm9tX2NhbGliX3ZlcikKLQkJZ290byBlcnI7Ci0KLQlJV0xfSU5GTyhwcml2LCAiZGV2aWNlIEVFUFJPTSBWRVI9MHgleCwgQ0FMSUI9MHgleFxuIiwKLQkJIGVlcHJvbV92ZXIsIGNhbGliX3Zlcik7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlJV0xfRVJSKHByaXYsICJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCi0JCSAgIkNBTElCPTB4JXggPCAweCV4XG4iLAotCQkgIGVlcHJvbV92ZXIsIHByaXYtPmNmZy0+ZWVwcm9tX3ZlciwKLQkJICBjYWxpYl92ZXIsICBwcml2LT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpOwotCXJldHVybiAtRUlOVkFMOwotCi19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4ICptYWMpCi17Ci0JY29uc3QgdTggKmFkZHIgPSBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCi0JCQkJCUVFUFJPTV9NQUNfQUREUkVTUyk7Ci0JbWVtY3B5KG1hYywgYWRkciwgRVRIX0FMRU4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWh3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNmZhMjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLTQ5NjUtaHcuaCkgb25seSBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogVXNlIGl3bC1kZXYuaCBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfNDk2NV9od19oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9od19oX18KLQotI2luY2x1ZGUgIml3bC1maC5oIgotCi0vKiBFRVBST00gKi8KLSNkZWZpbmUgSVdMNDk2NV9FRVBST01fSU1HX1NJWkUJCQkxMDI0Ci0KLS8qCi0gKiB1Q29kZSBxdWV1ZSBtYW5hZ2VtZW50IGRlZmluaXRpb25zIC4uLgotICogVGhlIGZpcnN0IHF1ZXVlIHVzZWQgZm9yIGJsb2NrLWFjayBhZ2dyZWdhdGlvbiBpcyAjNyAoNDk2NSBvbmx5KS4KLSAqIEFsbCBibG9jay1hY2sgYWdncmVnYXRpb24gcXVldWVzIHNob3VsZCBtYXAgdG8gVHggRE1BL0ZJRk8gY2hhbm5lbCA3LgotICovCi0jZGVmaW5lIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFCTcKLQotLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgotICogNDk2NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLwotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9MT1dFUl9CT1VORAkJKDB4MDAwMDAwKQotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9VUFBFUl9CT1VORAkJKDB4MDE4MDAwKQotCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5ECQkoMHg4MEEwMDApCi0KLSNkZWZpbmUgSVdMNDlfUlRDX0lOU1RfU0laRSAgKElXTDQ5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAotCQkJCUlXTDQ5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQotI2RlZmluZSBJV0w0OV9SVENfREFUQV9TSVpFICAoSVdMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCi0JCQkJSVdMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCi0KLSNkZWZpbmUgSVdMNDlfTUFYX0lOU1RfU0laRSBJV0w0OV9SVENfSU5TVF9TSVpFCi0jZGVmaW5lIElXTDQ5X01BWF9EQVRBX1NJWkUgSVdMNDlfUlRDX0RBVEFfU0laRQotCi0vKiBTaXplIG9mIHVDb2RlIGluc3RydWN0aW9uIG1lbW9yeSBpbiBib290c3RyYXAgc3RhdGUgbWFjaGluZSAqLwotI2RlZmluZSBJV0w0OV9NQVhfQlNNX1NJWkUgQlNNX1NSQU1fU0laRQotCi1zdGF0aWMgaW5saW5lIGludCBpd2w0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCi17Ci0JcmV0dXJuIChhZGRyID49IElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5EKSAmJgotCSAgICAgICAoYWRkciA8IElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5EKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBURU1QRVJBVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24uCi0gKgotICogVGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgZGV2aWNlIHRlbXBlcmF0dXJlIGJlZm9yZSBjYWxjdWxhdGluZwotICogYSB0eHBvd2VyIHNldHRpbmcgKGFtcGxpZmllciBnYWluIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCkuICBUaGUKLSAqIGNhbGN1bGF0aW9uIHVzZXMgNCBtZWFzdXJlbWVudHMsIDMgb2Ygd2hpY2ggKFIxLCBSMiwgUjMpIGFyZSBjYWxpYnJhdGlvbgotICogdmFsdWVzIHVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkcml2ZXIsIGFuZCBvbmUgb2Ygd2hpY2ggKFI0KSBpcyB0aGUKLSAqIHJlYWwtdGltZSB0ZW1wZXJhdHVyZSBpbmRpY2F0b3IuCi0gKgotICogdUNvZGUgcHJvdmlkZXMgYWxsIDQgdmFsdWVzIHRvIHRoZSBkcml2ZXIgdmlhIHRoZSAiaW5pdGlhbGl6ZSBhbGl2ZSIKLSAqIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkuICBBZnRlciB0aGUgcnVudGltZSB1Q29kZQotICogaW1hZ2UgbG9hZHMsIHVDb2RlIHVwZGF0ZXMgdGhlIFI0IHZhbHVlIHZpYSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqIChzZWUgU1RBVElTVElDU19OT1RJRklDQVRJT04pLCB3aGljaCBvY2N1ciBhZnRlciBlYWNoIHJlY2VpdmVkIGJlYWNvbgotICogd2hlbiBhc3NvY2lhdGVkLCBvciBjYW4gYmUgcmVxdWVzdGVkIHZpYSBSRVBMWV9TVEFUSVNUSUNTX0NNRC4KLSAqCi0gKiBOT1RFOiAgdUNvZGUgcHJvdmlkZXMgdGhlIFI0IHZhbHVlIGFzIGEgMjMtYml0IHNpZ25lZCB2YWx1ZS4gIERyaXZlcgotICogICAgICAgIG11c3Qgc2lnbi1leHRlbmQgdG8gMzIgYml0cyBiZWZvcmUgYXBwbHlpbmcgZm9ybXVsYSBiZWxvdy4KLSAqCi0gKiBGb3JtdWxhOgotICoKLSAqIGRlZ3JlZXMgS2VsdmluID0gKCg5NyAqIDI1OSAqIChSNCAtIFIyKSAvIChSMyAtIFIxKSkgLyAxMDApICsgOAotICoKLSAqIE5PVEU6ICBUaGUgYmFzaWMgZm9ybXVsYSBpcyAyNTkgKiAoUjQtUjIpIC8gKFIzLVIxKS4gIFRoZSA5Ny8xMDAgaXMKLSAqIGFuIGFkZGl0aW9uYWwgY29ycmVjdGlvbiwgd2hpY2ggc2hvdWxkIGJlIGNlbnRlcmVkIGFyb3VuZCAwIGRlZ3JlZXMKLSAqIENlbHNpdXMgKDI3MyBkZWdyZWVzIEtlbHZpbikuICBUaGUgOCAoMyBwZXJjZW50IG9mIDI3MykgY29tcGVuc2F0ZXMgZm9yCi0gKiBjZW50ZXJpbmcgdGhlIDk3LzEwMCBjb3JyZWN0aW9uIGFyb3VuZCAwIGRlZ3JlZXMgSy4KLSAqCi0gKiBBZGQgMjczIHRvIEtlbHZpbiB2YWx1ZSB0byBmaW5kIGRlZ3JlZXMgQ2Vsc2l1cywgZm9yIGNvbXBhcmluZyBjdXJyZW50Ci0gKiB0ZW1wZXJhdHVyZSB3aXRoIGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmVzIHdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlcgotICogc2V0dGluZ3MuCi0gKi8KLSNkZWZpbmUgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVCA4Ci0jZGVmaW5lIFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMIDI1OQotCi0vKiBMaW1pdCByYW5nZSBvZiBjYWxjdWxhdGVkIHRlbXBlcmF0dXJlIHRvIGJlIGJldHdlZW4gdGhlc2UgS2VsdmluIHZhbHVlcyAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOICAoMjYzKQotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYICAoNDEwKQotCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9PVVRfT0ZfUkFOR0UodCkgXAotCSgoKHQpIDwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTikgfHwgXAotCSAoKHQpID4gSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01BWCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKiogRU5EIFRFTVBFUkFUVVJFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBUWFBPV0VSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdHhwb3dlciBjYWxjdWxhdGlvbnMgcmVseSBvbiBpbmZvcm1hdGlvbiBmcm9tIHRocmVlIHNvdXJjZXM6Ci0gKgotICogICAgIDEpIEVFUFJPTQotICogICAgIDIpICJpbml0aWFsaXplIiBhbGl2ZSBub3RpZmljYXRpb24KLSAqICAgICAzKSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqCi0gKiBFRVBST00gZGF0YSBjb25zaXN0cyBvZjoKLSAqCi0gKiAxKSAgUmVndWxhdG9yeSBpbmZvcm1hdGlvbiAobWF4IHR4cG93ZXIgYW5kIGNoYW5uZWwgdXNhZ2UgZmxhZ3MpIGlzIHByb3ZpZGVkCi0gKiAgICAgc2VwYXJhdGVseSBmb3IgZWFjaCBjaGFubmVsIHRoYXQgY2FuIHBvc3NpYmx5IHN1cHBvcnRlZCBieSA0OTY1LgotICogICAgIDQwIE1IeiB3aWRlICguMTFuIEhUNDApIGNoYW5uZWxzIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSBmcm9tIDIwIE1IegotICogICAgIChsZWdhY3kpIGNoYW5uZWxzLgotICoKLSAqICAgICBTZWUgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NoYW5uZWwgZm9yIGZvcm1hdCwgYW5kIHN0cnVjdCBpd2w0OTY1X2VlcHJvbQotICogICAgIGZvciBsb2NhdGlvbnMgaW4gRUVQUk9NLgotICoKLSAqIDIpICBGYWN0b3J5IHR4cG93ZXIgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmb3IKLSAqICAgICBzdWItYmFuZHMgb2YgY29udGlndW91cyBjaGFubmVscy4gIDIuNEdIeiBoYXMganVzdCBvbmUgc3ViLWJhbmQsCi0gKiAgICAgYnV0IDUgR0h6IGhhcyBzZXZlcmFsIHN1Yi1iYW5kcy4KLSAqCi0gKiAgICAgSW4gYWRkaXRpb24sIHBlci1iYW5kICgyLjQgYW5kIDUgR2h6KSBzYXR1cmF0aW9uIHR4cG93ZXJzIGFyZSBwcm92aWRlZC4KLSAqCi0gKiAgICAgU2VlIHN0cnVjdCBpd2w0OTY1X2VlcHJvbV9jYWxpYl9pbmZvIChhbmQgdGhlIHRyZWUgb2Ygc3RydWN0dXJlcwotICogICAgIGNvbnRhaW5lZCB3aXRoaW4gaXQpIGZvciBmb3JtYXQsIGFuZCBzdHJ1Y3QgaXdsNDk2NV9lZXByb20gZm9yCi0gKiAgICAgbG9jYXRpb25zIGluIEVFUFJPTS4KLSAqCi0gKiAiSW5pdGlhbGl6YXRpb24gYWxpdmUiIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkKLSAqIGNvbnNpc3RzIG9mOgotICoKLSAqIDEpICBUZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzLgotICoKLSAqIDIpICBQb3dlciBzdXBwbHkgdm9sdGFnZSBtZWFzdXJlbWVudC4KLSAqCi0gKiAzKSAgVHggZ2FpbiBjb21wZW5zYXRpb24gdG8gYmFsYW5jZSAyIHRyYW5zbWl0dGVycyBmb3IgTUlNTyB1c2UuCi0gKgotICogU3RhdGlzdGljcyBub3RpZmljYXRpb25zIGRlbGl2ZXI6Ci0gKgotICogMSkgIEN1cnJlbnQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZSBwYXJhbSBSNC4KLSAqLwotCi0vKioKLSAqIFRvIGNhbGN1bGF0ZSBhIHR4cG93ZXIgc2V0dGluZyBmb3IgYSBnaXZlbiBkZXNpcmVkIHRhcmdldCB0eHBvd2VyLCBjaGFubmVsLAotICogbW9kdWxhdGlvbiBiaXQgcmF0ZSwgYW5kIHRyYW5zbWl0dGVyIGNoYWluICg0OTY1IGhhcyAyIHRyYW5zbWl0dGVycyB0bwotICogc3VwcG9ydCBNSU1PIGFuZCB0cmFuc21pdCBkaXZlcnNpdHkpLCBkcml2ZXIgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgotICoKLSAqIDEpICBDb21wYXJlIGRlc2lyZWQgdHhwb3dlciB2cy4gKEVFUFJPTSkgcmVndWxhdG9yeSBsaW1pdCBmb3IgdGhpcyBjaGFubmVsLgotICogICAgIERvIG5vdCBleGNlZWQgcmVndWxhdG9yeSBsaW1pdDsgcmVkdWNlIHRhcmdldCB0eHBvd2VyIGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiAgICAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICAyIHRyYW5zbWl0dGVycyB3aWxsIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHk7IGRyaXZlciBtdXN0IHJlZHVjZSB0aGUKLSAqICAgICByZWd1bGF0b3J5IGxpbWl0IGJ5IDMgZEIgKGhhbGYtcG93ZXIpIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0aGUKLSAqICAgICBjb21iaW5lZCB0b3RhbCBvdXRwdXQgb2YgdGhlIDIgdHJhbnNtaXR0ZXJzIGlzIHdpdGhpbiByZWd1bGF0b3J5IGxpbWl0cy4KLSAqCi0gKgotICogMikgIENvbXBhcmUgdGFyZ2V0IHR4cG93ZXIgdnMuIChFRVBST00pIHNhdHVyYXRpb24gdHhwb3dlciAqcmVkdWNlZCBieQotICogICAgIGJhY2tvZmYgZm9yIHRoaXMgYml0IHJhdGUqLiAgRG8gbm90IGV4Y2VlZCAoc2F0dXJhdGlvbiAtIGJhY2tvZmZbcmF0ZV0pOwotICogICAgIHJlZHVjZSB0YXJnZXQgdHhwb3dlciBpZiBuZWNlc3NhcnkuCi0gKgotICogICAgIEJhY2tvZmYgdmFsdWVzIGJlbG93IGFyZSBpbiAxLzIgZEIgdW5pdHMgKGVxdWl2YWxlbnQgdG8gc3RlcHMgaW4KLSAqICAgICB0eHBvd2VyIGdhaW4gdGFibGVzKToKLSAqCi0gKiAgICAgT0ZETSA2IC0gMzYgTUJpdDogIDEwIHN0ZXBzICg1IGRCKQotICogICAgIE9GRE0gNDggTUJpdDogICAgICAxNSBzdGVwcyAoNy41IGRCKQotICogICAgIE9GRE0gNTQgTUJpdDogICAgICAxNyBzdGVwcyAoOC41IGRCKQotICogICAgIE9GRE0gNjAgTUJpdDogICAgICAyMCBzdGVwcyAoMTAgZEIpCi0gKiAgICAgQ0NLIGFsbCByYXRlczogICAgIDEwIHN0ZXBzICg1IGRCKQotICoKLSAqICAgICBCYWNrb2ZmIHZhbHVlcyBhcHBseSB0byBzYXR1cmF0aW9uIHR4cG93ZXIgb24gYSBwZXItdHJhbnNtaXR0ZXIgYmFzaXM7Ci0gKiAgICAgd2hlbiB1c2luZyBNSU1PICgyIHRyYW5zbWl0dGVycyksIGVhY2ggdHJhbnNtaXR0ZXIgdXNlcyB0aGUgc2FtZQotICogICAgIHNhdHVyYXRpb24gbGV2ZWwgcHJvdmlkZWQgaW4gRUVQUk9NLCBhbmQgdGhlIHNhbWUgYmFja29mZiB2YWx1ZXM7Ci0gKiAgICAgbm8gcmVkdWN0aW9uIChzdWNoIGFzIHdpdGggcmVndWxhdG9yeSB0eHBvd2VyIGxpbWl0cykgaXMgcmVxdWlyZWQuCi0gKgotICogICAgIFNhdHVyYXRpb24gYW5kIEJhY2tvZmYgdmFsdWVzIGFwcGx5IGVxdWFsbHkgdG8gMjAgTWh6IChsZWdhY3kpIGNoYW5uZWwKLSAqICAgICB3aWR0aHMgYW5kIDQwIE1oeiAoLjExbiBIVDQwKSBjaGFubmVsIHdpZHRoczsgdGhlcmUgaXMgbm8gc2VwYXJhdGUKLSAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50IGZvciBodDQwIGNoYW5uZWxzLgotICoKLSAqICAgICBUaGUgcmVzdWx0IG9mIHRoaXMgc3RlcCBpcyB0aGUgZmluYWwgdGFyZ2V0IHR4cG93ZXIuICBUaGUgcmVzdCBvZgotICogICAgIHRoZSBzdGVwcyBmaWd1cmUgb3V0IHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UgdG8gYWNoaWV2ZQotICogICAgIHRoYXQgdGFyZ2V0IHR4cG93ZXIuCi0gKgotICoKLSAqIDMpICBEZXRlcm1pbmUgKEVFUFJPTSkgY2FsaWJyYXRpb24gc3ViIGJhbmQgZm9yIHRoZSB0YXJnZXQgY2hhbm5lbCwgYnkKLSAqICAgICBjb21wYXJpbmcgYWdhaW5zdCBmaXJzdCBhbmQgbGFzdCBjaGFubmVscyBpbiBlYWNoIHN1YiBiYW5kCi0gKiAgICAgKHNlZSBzdHJ1Y3QgaXdsNDk2NV9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvKS4KLSAqCi0gKgotICogNCkgIExpbmVhcmx5IGludGVycG9sYXRlIChFRVBST00pIGZhY3RvcnkgY2FsaWJyYXRpb24gbWVhc3VyZW1lbnQgc2V0cywKLSAqICAgICByZWZlcmVuY2luZyB0aGUgMiBmYWN0b3J5LW1lYXN1cmVkIChzYW1wbGUpIGNoYW5uZWxzIHdpdGhpbiB0aGUgc3ViIGJhbmQuCi0gKgotICogICAgIEludGVycG9sYXRpb24gaXMgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFubmVsJ3MgZnJlcXVlbmN5Ci0gKiAgICAgYW5kIHRoZSBzYW1wbGUgY2hhbm5lbHMnIGZyZXF1ZW5jaWVzLiAgU2luY2UgY2hhbm5lbCBudW1iZXJzIGFyZSBiYXNlZAotICogICAgIG9uIGZyZXF1ZW5jeSAoNSBNSHogYmV0d2VlbiBlYWNoIGNoYW5uZWwgbnVtYmVyKSwgdGhpcyBpcyBlcXVpdmFsZW50Ci0gKiAgICAgdG8gaW50ZXJwb2xhdGluZyBiYXNlZCBvbiBjaGFubmVsIG51bWJlciBkaWZmZXJlbmNlcy4KLSAqCi0gKiAgICAgTm90ZSB0aGF0IHRoZSBzYW1wbGUgY2hhbm5lbHMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNoYW5uZWxzIGF0IHRoZQotICogICAgIGVkZ2VzIG9mIHRoZSBzdWIgYmFuZC4gIFRoZSB0YXJnZXQgY2hhbm5lbCBtYXkgYmUgIm91dHNpZGUiIG9mIHRoZQotICogICAgIHNwYW4gb2YgdGhlIHNhbXBsZWQgY2hhbm5lbHMuCi0gKgotICogICAgIERyaXZlciBtYXkgY2hvb3NlIHRoZSBwYWlyIChmb3IgMiBUeCBjaGFpbnMpIG9mIG1lYXN1cmVtZW50cyAoc2VlCi0gKiAgICAgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NhbGliX2NoX2luZm8pIGZvciB3aGljaCB0aGUgYWN0dWFsIG1lYXN1cmVkCi0gKiAgICAgdHhwb3dlciBjb21lcyBjbG9zZXN0IHRvIHRoZSBkZXNpcmVkIHR4cG93ZXIuICBVc3VhbGx5LCB0aG91Z2gsCi0gKiAgICAgdGhlIG1pZGRsZSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGNsb3Nlc3QgdG8gdGhlIHJlZ3VsYXRvcnkgbGltaXRzLAotICogICAgIGFuZCBpcyB0aGVyZWZvcmUgYSBnb29kIGNob2ljZSBmb3IgYWxsIHR4cG93ZXIgY2FsY3VsYXRpb25zICh0aGlzCi0gKiAgICAgYXNzdW1lcyB0aGF0IGhpZ2ggYWNjdXJhY3kgaXMgbmVlZGVkIGZvciBtYXhpbWl6aW5nIGxlZ2FsIHR4cG93ZXIsCi0gKiAgICAgd2hpbGUgbG93ZXIgdHhwb3dlciBjb25maWd1cmF0aW9ucyBkbyBub3QgbmVlZCBhcyBtdWNoIGFjY3VyYWN5KS4KLSAqCi0gKiAgICAgRHJpdmVyIHNob3VsZCBpbnRlcnBvbGF0ZSBib3RoIG1lbWJlcnMgb2YgdGhlIGNob3NlbiBtZWFzdXJlbWVudCBwYWlyLAotICogICAgIGkuZS4gZm9yIGJvdGggVHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlcnMpLCB1bmxlc3MgdGhlIGRyaXZlciBrbm93cwotICogICAgIHRoYXQgb25seSBvbmUgb2YgdGhlIGNoYWlucyB3aWxsIGJlIHVzZWQgKGUuZy4gb25seSBvbmUgdHggYW50ZW5uYQotICogICAgIGNvbm5lY3RlZCwgYnV0IHRoaXMgc2hvdWxkIGJlIHVudXN1YWwpLiAgVGhlIHJhdGUgc2NhbGluZyBhbGdvcml0aG0KLSAqICAgICBzd2l0Y2hlcyBhbnRlbm5hcyB0byBmaW5kIGJlc3QgcGVyZm9ybWFuY2UsIHNvIGJvdGggVHggY2hhaW5zIHdpbGwKLSAqICAgICBiZSB1c2VkIChhbHRob3VnaCBvbmx5IG9uZSBhdCBhIHRpbWUpIGV2ZW4gZm9yIG5vbi1NSU1PIHRyYW5zbWlzc2lvbnMuCi0gKgotICogICAgIERyaXZlciBzaG91bGQgaW50ZXJwb2xhdGUgZmFjdG9yeSB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlLCBnYWluIHRhYmxlCi0gKiAgICAgaW5kZXgsIGFuZCBhY3R1YWwgcG93ZXIuICBUaGUgcG93ZXIgYW1wbGlmaWVyIGRldGVjdG9yIHZhbHVlcyBhcmUKLSAqICAgICBub3QgdXNlZCBieSB0aGUgZHJpdmVyLgotICoKLSAqICAgICBTYW5pdHkgY2hlY2s6ICBJZiB0aGUgdGFyZ2V0IGNoYW5uZWwgaGFwcGVucyB0byBiZSBvbmUgb2YgdGhlIHNhbXBsZQotICogICAgIGNoYW5uZWxzLCB0aGUgcmVzdWx0cyBzaG91bGQgYWdyZWUgd2l0aCB0aGUgc2FtcGxlIGNoYW5uZWwncwotICogICAgIG1lYXN1cmVtZW50cyEKLSAqCi0gKgotICogNSkgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlc2lyZWQgdHhwb3dlciBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHR4cG93ZXIuICBVc2luZyAoaW50ZXJwb2xhdGVkKSBmYWN0b3J5IGdhaW4gdGFibGUgaW5kZXgKLSAqICAgICAoc2hvd24gZWxzZXdoZXJlKSBhcyBhIHN0YXJ0aW5nIHBvaW50LCBhZGp1c3QgdGhpcyBpbmRleCBsb3dlciB0bwotICogICAgIGluY3JlYXNlIHR4cG93ZXIsIG9yIGhpZ2hlciB0byBkZWNyZWFzZSB0eHBvd2VyLCB1bnRpbCB0aGUgdGFyZ2V0Ci0gKiAgICAgdHhwb3dlciBpcyByZWFjaGVkLiAgRWFjaCBzdGVwIGluIHRoZSBnYWluIHRhYmxlIGlzIDEvMiBkQi4KLSAqCi0gKiAgICAgRm9yIGV4YW1wbGUsIGlmIGZhY3RvcnkgbWVhc3VyZWQgdHhwb3dlciBpcyAxNiBkQm0sIGFuZCB0YXJnZXQgdHhwb3dlcgotICogICAgIGlzIDEzIGRCbSwgYWRkIDYgc3RlcHMgdG8gdGhlIGZhY3RvcnkgZ2FpbiBpbmRleCB0byByZWR1Y2UgdHhwb3dlcgotICogICAgIGJ5IDMgZEIuCi0gKgotICoKLSAqIDYpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGRldmljZSB0ZW1wZXJhdHVyZSBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlIGZvciBzdWItYmFuZC4gIEZhY3RvcnkgdmFsdWVzIGFyZSBpbgotICogICAgIGRlZ3JlZXMgQ2Vsc2l1cy4gIFRvIGNhbGN1bGF0ZSBjdXJyZW50IHRlbXBlcmF0dXJlLCBzZWUgY29tbWVudHMgZm9yCi0gKiAgICAgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iLgotICoKLSAqICAgICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGhpZ2hlciB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0Ci0gKiAgICAgaW5jcmVhc2UgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCksIGFuZCB2aWNlIHZlcnNlLgotICoKLSAqICAgICBUZW1wZXJhdHVyZSBhZmZlY3RzIGdhaW4gZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudCBjaGFubmVsczoKLSAqCi0gKiAgICAgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgMzQtNDM6ICA0LjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgPj0gNDQ6ICA0LjAgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKgotICogICAgIE5PVEU6ICBUZW1wZXJhdHVyZSBjYW4gaW5jcmVhc2UgcmFwaWRseSB3aGVuIHRyYW5zbWl0dGluZywgZXNwZWNpYWxseQotICogICAgICAgICAgICB3aXRoIGhlYXZ5IHRyYWZmaWMgYXQgaGlnaCB0eHBvd2Vycy4gIERyaXZlciBzaG91bGQgdXBkYXRlCi0gKiAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9ucyBvZnRlbiB1bmRlciB0aGVzZSBjb25kaXRpb25zIHRvCi0gKiAgICAgICAgICAgIG1haW50YWluIHN0cm9uZyB0eHBvd2VyIGluIHRoZSBmYWNlIG9mIHJpc2luZyB0ZW1wZXJhdHVyZS4KLSAqCi0gKgotICogNykgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgaW5kaWNhdG9yCi0gKiAgICAgKGZyb20gImluaXRpYWxpemUgYWxpdmUiKSBhbmQgZmFjdG9yeS1tZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFnZQotICogICAgIGluZGljYXRvciAoRUVQUk9NKS4KLSAqCi0gKiAgICAgSWYgdGhlIGN1cnJlbnQgdm9sdGFnZSBpcyBoaWdoZXIgKGluZGljYXRvciBpcyBsb3dlcikgdGhhbiBmYWN0b3J5Ci0gKiAgICAgdm9sdGFnZSwgZ2FpbiBzaG91bGQgYmUgcmVkdWNlZCAoZ2FpbiB0YWJsZSBpbmRleCBpbmNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAoZWVwcm9tIC0gY3VycmVudCkgLyA3Ci0gKgotICogICAgIElmIHRoZSBjdXJyZW50IHZvbHRhZ2UgaXMgbG93ZXIgKGluZGljYXRvciBpcyBoaWdoZXIpIHRoYW4gZmFjdG9yeQotICogICAgIHZvbHRhZ2UsIGdhaW4gc2hvdWxkIGJlIGluY3JlYXNlZCAoZ2FpbiB0YWJsZSBpbmRleCBkZWNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAyICogKGN1cnJlbnQgLSBlZXByb20pIC8gNwotICoKLSAqICAgICBJZiBudW1iZXIgb2YgaW5kZXggc3RlcHMgaW4gZWl0aGVyIGRpcmVjdGlvbiB0dXJucyBvdXQgdG8gYmUgPiAyLAotICogICAgIHNvbWV0aGluZyBpcyB3cm9uZyAuLi4ganVzdCB1c2UgMC4KLSAqCi0gKiAgICAgTk9URTogIFZvbHRhZ2UgY29tcGVuc2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGJhbmQvY2hhbm5lbC4KLSAqCi0gKiAgICAgTk9URTogICJJbml0aWFsaXplIiB1Q29kZSBtZWFzdXJlcyBjdXJyZW50IHZvbHRhZ2UsIHdoaWNoIGlzIGFzc3VtZWQKLSAqICAgICAgICAgICAgdG8gYmUgY29uc3RhbnQgYWZ0ZXIgdGhpcyBpbml0aWFsIG1lYXN1cmVtZW50LiAgVm9sdGFnZQotICogICAgICAgICAgICBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgKG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlKQotICogICAgICAgICAgICBtYXkgYmUgY2FsY3VsYXRlZCBvbmNlIGFuZCB1c2VkIHVudGlsIHRoZSBuZXh0IHVDb2RlIGJvb3Rsb2FkLgotICoKLSAqCi0gKiA4KSAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICBhZGp1c3QgdHhwb3dlciBmb3IgZWFjaCB0cmFuc21pdHRlciBjaGFpbiwgc28gdHhwb3dlciBpcyBiYWxhbmNlZAotICogICAgIGJldHdlZW4gdGhlIHR3byBjaGFpbnMuICBUaGVyZSBhcmUgNSBwYWlycyBvZiB0eF9hdHRlbltncm91cF1bY2hhaW5dCi0gKiAgICAgdmFsdWVzIGluICJpbml0aWFsaXplIGFsaXZlIiwgb25lIHBhaXIgZm9yIGVhY2ggb2YgNSBjaGFubmVsIHJhbmdlczoKLSAqCi0gKiAgICAgR3JvdXAgMDogIDUgR0h6IGNoYW5uZWwgMzQtNDMKLSAqICAgICBHcm91cCAxOiAgNSBHSHogY2hhbm5lbCA0NC03MAotICogICAgIEdyb3VwIDI6ICA1IEdIeiBjaGFubmVsIDcxLTEyNAotICogICAgIEdyb3VwIDM6ICA1IEdIeiBjaGFubmVsIDEyNS0yMDAKLSAqICAgICBHcm91cCA0OiAgMi40IEdIeiBhbGwgY2hhbm5lbHMKLSAqCi0gKiAgICAgQWRkIHRoZSB0eF9hdHRlbltncm91cF1bY2hhaW5dIHZhbHVlIHRvIHRoZSBpbmRleCBmb3IgdGhlIHRhcmdldCBjaGFpbi4KLSAqICAgICBUaGUgdmFsdWVzIGFyZSBzaWduZWQsIGJ1dCBhcmUgaW4gcGFpcnMgb2YgMCBhbmQgYSBub24tbmVnYXRpdmUgbnVtYmVyLAotICogICAgIHNvIGFzIHRvIHJlZHVjZSBnYWluIChpZiBuZWNlc3NhcnkpIG9mIHRoZSAiaG90dGVyIiBjaGFubmVsLiAgVGhpcwotICogICAgIGF2b2lkcyBhbnkgbmVlZCB0byBkb3VibGUtY2hlY2sgZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBhZnRlcgotICogICAgIHRoaXMgc3RlcC4KLSAqCi0gKgotICogOSkgIElmIHNldHRpbmcgdXAgZm9yIGEgQ0NLIHJhdGUsIGxvd2VyIHRoZSBnYWluIGJ5IGFkZGluZyBhIENDSyBjb21wZW5zYXRpb24KLSAqICAgICB2YWx1ZSB0byB0aGUgaW5kZXg6Ci0gKgotICogICAgIEhhcmR3YXJlIHJldiBCOiAgOSBzdGVwcyAoNC41IGRCKQotICogICAgIEhhcmR3YXJlIHJldiBDOiAgNSBzdGVwcyAoMi41IGRCKQotICoKLSAqICAgICBIYXJkd2FyZSByZXYgZm9yIDQ5NjUgY2FuIGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBDU1JfSFdfUkVWX1dBX1JFRywKLSAqICAgICBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKgotICogICAgIE5PVEU6ICBUaGlzIGNvbXBlbnNhdGlvbiBpcyBpbiBhZGRpdGlvbiB0byBhbnkgc2F0dXJhdGlvbiBiYWNrb2ZmIHRoYXQKLSAqICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gYW4gZWFybGllciBzdGVwLgotICoKLSAqCi0gKiAxMCkgU2VsZWN0IHRoZSBnYWluIHRhYmxlLCBiYXNlZCBvbiBiYW5kICgyLjQgdnMgNSBHSHopLgotICoKLSAqICAgICBMaW1pdCB0aGUgYWRqdXN0ZWQgaW5kZXggdG8gc3RheSB3aXRoaW4gdGhlIHRhYmxlIQotICoKLSAqCi0gKiAxMSkgUmVhZCBnYWluIHRhYmxlIGVudHJpZXMgZm9yIERTUCBhbmQgcmFkaW8gZ2FpbiwgcGxhY2UgaW50byBhcHByb3ByaWF0ZQotICogICAgIGxvY2F0aW9uKHMpIGluIGNvbW1hbmQgKHN0cnVjdCBpd2w0OTY1X3R4cG93ZXJ0YWJsZV9jbWQpLgotICovCi0KLS8qKgotICogV2hlbiBNSU1PIGlzIHVzZWQgKDIgdHJhbnNtaXR0ZXJzIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSksIGRyaXZlciBzaG91bGQKLSAqIGxpbWl0IGVhY2ggdHJhbnNtaXR0ZXIgdG8gZGVsaXZlciBhIG1heCBvZiAzIGRCIGJlbG93IHRoZSByZWd1bGF0b3J5IGxpbWl0Ci0gKiBmb3IgdGhlIGRldmljZS4gIFRoYXQgaXMsIHVzZSBoYWxmIHBvd2VyIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0b3RhbAotICogdHhwb3dlciBpcyB3aXRoaW4gcmVndWxhdG9yeSBsaW1pdHMuCi0gKgotICogVGhlIHZhbHVlICI2IiByZXByZXNlbnRzIG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlIHRvIHJlZHVjZSBwb3dlciAzIGRCLgotICogRWFjaCBzdGVwIGlzIDEvMiBkQi4KLSAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTiAoNikKLQotLyoqCi0gKiBDQ0sgZ2FpbiBjb21wZW5zYXRpb24uCi0gKgotICogV2hlbiBjYWxjdWxhdGluZyB0eHBvd2VycyBmb3IgQ0NLLCBhZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZSB0YXJnZXQgcG93ZXIKLSAqIGlzIHdpdGhpbiByZWd1bGF0b3J5IGFuZCBzYXR1cmF0aW9uIGxpbWl0cywgZHJpdmVyIG11c3QgYWRkaXRpb25hbGx5Ci0gKiBiYWNrIG9mZiBnYWluIGJ5IGFkZGluZyB0aGVzZSB2YWx1ZXMgdG8gdGhlIGdhaW4gdGFibGUgaW5kZXguCi0gKgotICogSGFyZHdhcmUgcmV2IGZvciA0OTY1IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgQ1NSX0hXX1JFVl9XQV9SRUcsCi0gKiBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKi8KLSNkZWZpbmUgSVdMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQl9TVEVQICg5KQotI2RlZmluZSBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVAgKDUpCi0KLS8qCi0gKiA0OTY1IHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlcgotICovCi0jZGVmaW5lIFRYX1BPV0VSX0lXTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YgICAoNykKLQotLyoqCi0gKiBHYWluIHRhYmxlcy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHBhaXIgb2YgdmFsdWVzIGZvciBzZXR0aW5nIHR4cG93ZXIsIGkuZS4KLSAqIGdhaW4gc2V0dGluZ3MgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGRldmljZSdzIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKSwKLSAqIGFuZCBmb3IgdGhlIGFuYWxvZyBnYWluIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNtaXR0ZXIuCi0gKgotICogRWFjaCBlbnRyeSBpbiB0aGUgZ2FpbiB0YWJsZXMgcmVwcmVzZW50cyBhIHN0ZXAgb2YgMS8yIGRCLiAgTm90ZSB0aGF0IHRoZXNlCi0gKiBhcmUgKnJlbGF0aXZlKiBzdGVwcywgbm90IGluZGljYXRpb25zIG9mIGFic29sdXRlIG91dHB1dCBwb3dlci4gIE91dHB1dAotICogcG93ZXIgdmFyaWVzIHdpdGggdGVtcGVyYXR1cmUsIHZvbHRhZ2UsIGFuZCBjaGFubmVsIGZyZXF1ZW5jeSwgYW5kIGFsc28KLSAqIHJlcXVpcmVzIGNvbnNpZGVyYXRpb24gb2YgYXZlcmFnZSBwb3dlciAodG8gc2F0aXNmeSByZWd1bGF0b3J5IGNvbnN0cmFpbnRzKSwKLSAqIGFuZCBwZWFrIHBvd2VyICh0byBhdm9pZCBkaXN0b3J0aW9uIG9mIHRoZSBvdXRwdXQgc2lnbmFsKS4KLSAqCi0gKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6Ci0gKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKLSAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKLSAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgotICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgotICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KLSAqCi0gKiBFRVBST00gY29udGFpbnMgZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0eHBvd2VyLiAgVGhpcyBtYXBzIGFjdHVhbAotICogbWVhc3VyZWQgdHhwb3dlciBsZXZlbHMgdG8gZ2FpbiBzZXR0aW5ncyBpbiB0aGUgIndlbGwga25vd24iIHRhYmxlcwotICogYmVsb3cgKCJ3ZWxsLWtub3duIiBtZWFucyBoZXJlIHRoYXQgYm90aCBmYWN0b3J5IGNhbGlicmF0aW9uICphbmQqIHRoZQotICogZHJpdmVyIHdvcmsgd2l0aCB0aGUgc2FtZSB0YWJsZSkuCi0gKgotICogVGhlcmUgYXJlIHNlcGFyYXRlIHRhYmxlcyBmb3IgMi40IEdIeiBhbmQgNSBHSHogYmFuZHMuICBUaGUgNSBHSHogdGFibGUKLSAqIGhhcyBhbiBleHRlbnNpb24gKGludG8gbmVnYXRpdmUgaW5kZXhlcyksIGluIGNhc2UgdGhlIGRyaXZlciBuZWVkcyB0bwotICogYm9vc3QgcG93ZXIgc2V0dGluZyBmb3IgaGlnaCBkZXZpY2UgdGVtcGVyYXR1cmVzIChoaWdoZXIgdGhhbiB3b3VsZCBiZQotICogcHJlc2VudCBkdXJpbmcgZmFjdG9yeSBjYWxpYnJhdGlvbikuICBBIDUgR2h6IEVFUFJPTSBpbmRleCBvZiAiNDAiCi0gKiBjb3JyZXNwb25kcyB0byB0aGUgNDl0aCBlbnRyeSBpbiB0aGUgdGFibGUgdXNlZCBieSB0aGUgZHJpdmVyLgotICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYCQkoMCkgIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgMi40ICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYXzUyR0haX0VYVAkoLTkpIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgNSAqLwotCi0vKioKLSAqIDIuNCBHSHogZ2FpbiB0YWJsZQotICoKLSAqIEluZGV4ICAgIERzcCBnYWluICAgUmFkaW8gZ2FpbgotICogICAwICAgICAgICAxMTAgICAgICAgICAweDNmICAgICAgKGhpZ2hlc3QgZ2FpbikKLSAqICAgMSAgICAgICAgMTA0ICAgICAgICAgMHgzZgotICogICAyICAgICAgICAgOTggICAgICAgICAweDNmCi0gKiAgIDMgICAgICAgIDExMCAgICAgICAgIDB4M2UKLSAqICAgNCAgICAgICAgMTA0ICAgICAgICAgMHgzZQotICogICA1ICAgICAgICAgOTggICAgICAgICAweDNlCi0gKiAgIDYgICAgICAgIDExMCAgICAgICAgIDB4M2QKLSAqICAgNyAgICAgICAgMTA0ICAgICAgICAgMHgzZAotICogICA4ICAgICAgICAgOTggICAgICAgICAweDNkCi0gKiAgIDkgICAgICAgIDExMCAgICAgICAgIDB4M2MKLSAqICAxMCAgICAgICAgMTA0ICAgICAgICAgMHgzYwotICogIDExICAgICAgICAgOTggICAgICAgICAweDNjCi0gKiAgMTIgICAgICAgIDExMCAgICAgICAgIDB4M2IKLSAqICAxMyAgICAgICAgMTA0ICAgICAgICAgMHgzYgotICogIDE0ICAgICAgICAgOTggICAgICAgICAweDNiCi0gKiAgMTUgICAgICAgIDExMCAgICAgICAgIDB4M2EKLSAqICAxNiAgICAgICAgMTA0ICAgICAgICAgMHgzYQotICogIDE3ICAgICAgICAgOTggICAgICAgICAweDNhCi0gKiAgMTggICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxOSAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDIwICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMjEgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAyMiAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDIzICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMjQgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAyNSAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDI2ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjcgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyOCAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDI5ICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMzAgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAzMSAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDMyICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMzMgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAzNCAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDM1ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMzYgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzNyAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDM4ICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzkgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICA0MCAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDQxICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgNDIgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICA0MyAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDQ0ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgNDUgICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICA0NiAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQ3ICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDggICAgICAgIDExMCAgICAgICAgICAweDYKLSAqICA0OSAgICAgICAgMTA0ICAgICAgICAgIDB4NgotICogIDUwICAgICAgICAgOTggICAgICAgICAgMHg2Ci0gKiAgNTEgICAgICAgIDExMCAgICAgICAgICAweDUKLSAqICA1MiAgICAgICAgMTA0ICAgICAgICAgIDB4NQotICogIDUzICAgICAgICAgOTggICAgICAgICAgMHg1Ci0gKiAgNTQgICAgICAgIDExMCAgICAgICAgICAweDQKLSAqICA1NSAgICAgICAgMTA0ICAgICAgICAgIDB4NAotICogIDU2ICAgICAgICAgOTggICAgICAgICAgMHg0Ci0gKiAgNTcgICAgICAgIDExMCAgICAgICAgICAweDMKLSAqICA1OCAgICAgICAgMTA0ICAgICAgICAgIDB4MwotICogIDU5ICAgICAgICAgOTggICAgICAgICAgMHgzCi0gKiAgNjAgICAgICAgIDExMCAgICAgICAgICAweDIKLSAqICA2MSAgICAgICAgMTA0ICAgICAgICAgIDB4MgotICogIDYyICAgICAgICAgOTggICAgICAgICAgMHgyCi0gKiAgNjMgICAgICAgIDExMCAgICAgICAgICAweDEKLSAqICA2NCAgICAgICAgMTA0ICAgICAgICAgIDB4MQotICogIDY1ICAgICAgICAgOTggICAgICAgICAgMHgxCi0gKiAgNjYgICAgICAgIDExMCAgICAgICAgICAweDAKLSAqICA2NyAgICAgICAgMTA0ICAgICAgICAgIDB4MAotICogIDY4ICAgICAgICAgOTggICAgICAgICAgMHgwCi0gKiAgNjkgICAgICAgICA5NyAgICAgICAgICAgIDAKLSAqICA3MCAgICAgICAgIDk2ICAgICAgICAgICAgMAotICogIDcxICAgICAgICAgOTUgICAgICAgICAgICAwCi0gKiAgNzIgICAgICAgICA5NCAgICAgICAgICAgIDAKLSAqICA3MyAgICAgICAgIDkzICAgICAgICAgICAgMAotICogIDc0ICAgICAgICAgOTIgICAgICAgICAgICAwCi0gKiAgNzUgICAgICAgICA5MSAgICAgICAgICAgIDAKLSAqICA3NiAgICAgICAgIDkwICAgICAgICAgICAgMAotICogIDc3ICAgICAgICAgODkgICAgICAgICAgICAwCi0gKiAgNzggICAgICAgICA4OCAgICAgICAgICAgIDAKLSAqICA3OSAgICAgICAgIDg3ICAgICAgICAgICAgMAotICogIDgwICAgICAgICAgODYgICAgICAgICAgICAwCi0gKiAgODEgICAgICAgICA4NSAgICAgICAgICAgIDAKLSAqICA4MiAgICAgICAgIDg0ICAgICAgICAgICAgMAotICogIDgzICAgICAgICAgODMgICAgICAgICAgICAwCi0gKiAgODQgICAgICAgICA4MiAgICAgICAgICAgIDAKLSAqICA4NSAgICAgICAgIDgxICAgICAgICAgICAgMAotICogIDg2ICAgICAgICAgODAgICAgICAgICAgICAwCi0gKiAgODcgICAgICAgICA3OSAgICAgICAgICAgIDAKLSAqICA4OCAgICAgICAgIDc4ICAgICAgICAgICAgMAotICogIDg5ICAgICAgICAgNzcgICAgICAgICAgICAwCi0gKiAgOTAgICAgICAgICA3NiAgICAgICAgICAgIDAKLSAqICA5MSAgICAgICAgIDc1ICAgICAgICAgICAgMAotICogIDkyICAgICAgICAgNzQgICAgICAgICAgICAwCi0gKiAgOTMgICAgICAgICA3MyAgICAgICAgICAgIDAKLSAqICA5NCAgICAgICAgIDcyICAgICAgICAgICAgMAotICogIDk1ICAgICAgICAgNzEgICAgICAgICAgICAwCi0gKiAgOTYgICAgICAgICA3MCAgICAgICAgICAgIDAKLSAqICA5NyAgICAgICAgIDY5ICAgICAgICAgICAgMAotICogIDk4ICAgICAgICAgNjggICAgICAgICAgICAwCi0gKi8KLQotLyoqCi0gKiA1IEdIeiBnYWluIHRhYmxlCi0gKgotICogSW5kZXggICAgRHNwIGdhaW4gICBSYWRpbyBnYWluCi0gKiAgLTkgCSAgICAgIDEyMyAgICAgICAgIDB4M0YgICAgICAoaGlnaGVzdCBnYWluKQotICogIC04IAkgICAgICAxMTcgICAgICAgICAweDNGCi0gKiAgLTcgICAgICAgIDExMCAgICAgICAgIDB4M0YKLSAqICAtNiAgICAgICAgMTA0ICAgICAgICAgMHgzRgotICogIC01ICAgICAgICAgOTggICAgICAgICAweDNGCi0gKiAgLTQgICAgICAgIDExMCAgICAgICAgIDB4M0UKLSAqICAtMyAgICAgICAgMTA0ICAgICAgICAgMHgzRQotICogIC0yICAgICAgICAgOTggICAgICAgICAweDNFCi0gKiAgLTEgICAgICAgIDExMCAgICAgICAgIDB4M0QKLSAqICAgMCAgICAgICAgMTA0ICAgICAgICAgMHgzRAotICogICAxICAgICAgICAgOTggICAgICAgICAweDNECi0gKiAgIDIgICAgICAgIDExMCAgICAgICAgIDB4M0MKLSAqICAgMyAgICAgICAgMTA0ICAgICAgICAgMHgzQwotICogICA0ICAgICAgICAgOTggICAgICAgICAweDNDCi0gKiAgIDUgICAgICAgIDExMCAgICAgICAgIDB4M0IKLSAqICAgNiAgICAgICAgMTA0ICAgICAgICAgMHgzQgotICogICA3ICAgICAgICAgOTggICAgICAgICAweDNCCi0gKiAgIDggICAgICAgIDExMCAgICAgICAgIDB4M0EKLSAqICAgOSAgICAgICAgMTA0ICAgICAgICAgMHgzQQotICogIDEwICAgICAgICAgOTggICAgICAgICAweDNBCi0gKiAgMTEgICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxMiAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDEzICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMTQgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAxNSAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDE2ICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMTcgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAxOCAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDE5ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjAgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyMSAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDIyICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMjMgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAyNCAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDI1ICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMjYgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAyNyAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDI4ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMjkgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzMCAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDMxICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzIgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICAzMyAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDM0ICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgMzUgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICAzNiAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDM3ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgMzggICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICAzOSAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQwICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDEgICAgICAgIDExMCAgICAgICAgIDB4MjUKLSAqICA0MiAgICAgICAgMTA0ICAgICAgICAgMHgyNQotICogIDQzICAgICAgICAgOTggICAgICAgICAweDI1Ci0gKiAgNDQgICAgICAgIDExMCAgICAgICAgIDB4MjQKLSAqICA0NSAgICAgICAgMTA0ICAgICAgICAgMHgyNAotICogIDQ2ICAgICAgICAgOTggICAgICAgICAweDI0Ci0gKiAgNDcgICAgICAgIDExMCAgICAgICAgIDB4MjMKLSAqICA0OCAgICAgICAgMTA0ICAgICAgICAgMHgyMwotICogIDQ5ICAgICAgICAgOTggICAgICAgICAweDIzCi0gKiAgNTAgICAgICAgIDExMCAgICAgICAgIDB4MjIKLSAqICA1MSAgICAgICAgMTA0ICAgICAgICAgMHgxOAotICogIDUyICAgICAgICAgOTggICAgICAgICAweDE4Ci0gKiAgNTMgICAgICAgIDExMCAgICAgICAgIDB4MTcKLSAqICA1NCAgICAgICAgMTA0ICAgICAgICAgMHgxNwotICogIDU1ICAgICAgICAgOTggICAgICAgICAweDE3Ci0gKiAgNTYgICAgICAgIDExMCAgICAgICAgIDB4MTYKLSAqICA1NyAgICAgICAgMTA0ICAgICAgICAgMHgxNgotICogIDU4ICAgICAgICAgOTggICAgICAgICAweDE2Ci0gKiAgNTkgICAgICAgIDExMCAgICAgICAgIDB4MTUKLSAqICA2MCAgICAgICAgMTA0ICAgICAgICAgMHgxNQotICogIDYxICAgICAgICAgOTggICAgICAgICAweDE1Ci0gKiAgNjIgICAgICAgIDExMCAgICAgICAgIDB4MTQKLSAqICA2MyAgICAgICAgMTA0ICAgICAgICAgMHgxNAotICogIDY0ICAgICAgICAgOTggICAgICAgICAweDE0Ci0gKiAgNjUgICAgICAgIDExMCAgICAgICAgIDB4MTMKLSAqICA2NiAgICAgICAgMTA0ICAgICAgICAgMHgxMwotICogIDY3ICAgICAgICAgOTggICAgICAgICAweDEzCi0gKiAgNjggICAgICAgIDExMCAgICAgICAgIDB4MTIKLSAqICA2OSAgICAgICAgMTA0ICAgICAgICAgMHgwOAotICogIDcwICAgICAgICAgOTggICAgICAgICAweDA4Ci0gKiAgNzEgICAgICAgIDExMCAgICAgICAgIDB4MDcKLSAqICA3MiAgICAgICAgMTA0ICAgICAgICAgMHgwNwotICogIDczICAgICAgICAgOTggICAgICAgICAweDA3Ci0gKiAgNzQgICAgICAgIDExMCAgICAgICAgIDB4MDYKLSAqICA3NSAgICAgICAgMTA0ICAgICAgICAgMHgwNgotICogIDc2ICAgICAgICAgOTggICAgICAgICAweDA2Ci0gKiAgNzcgICAgICAgIDExMCAgICAgICAgIDB4MDUKLSAqICA3OCAgICAgICAgMTA0ICAgICAgICAgMHgwNQotICogIDc5ICAgICAgICAgOTggICAgICAgICAweDA1Ci0gKiAgODAgICAgICAgIDExMCAgICAgICAgIDB4MDQKLSAqICA4MSAgICAgICAgMTA0ICAgICAgICAgMHgwNAotICogIDgyICAgICAgICAgOTggICAgICAgICAweDA0Ci0gKiAgODMgICAgICAgIDExMCAgICAgICAgIDB4MDMKLSAqICA4NCAgICAgICAgMTA0ICAgICAgICAgMHgwMwotICogIDg1ICAgICAgICAgOTggICAgICAgICAweDAzCi0gKiAgODYgICAgICAgIDExMCAgICAgICAgIDB4MDIKLSAqICA4NyAgICAgICAgMTA0ICAgICAgICAgMHgwMgotICogIDg4ICAgICAgICAgOTggICAgICAgICAweDAyCi0gKiAgODkgICAgICAgIDExMCAgICAgICAgIDB4MDEKLSAqICA5MCAgICAgICAgMTA0ICAgICAgICAgMHgwMQotICogIDkxICAgICAgICAgOTggICAgICAgICAweDAxCi0gKiAgOTIgICAgICAgIDExMCAgICAgICAgIDB4MDAKLSAqICA5MyAgICAgICAgMTA0ICAgICAgICAgMHgwMAotICogIDk0ICAgICAgICAgOTggICAgICAgICAweDAwCi0gKiAgOTUgICAgICAgICA5MyAgICAgICAgIDB4MDAKLSAqICA5NiAgICAgICAgIDg4ICAgICAgICAgMHgwMAotICogIDk3ICAgICAgICAgODMgICAgICAgICAweDAwCi0gKiAgOTggICAgICAgICA3OCAgICAgICAgIDB4MDAKLSAqLwotCi0KLS8qKgotICogU2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEVFUFJPTSByZWd1bGF0b3J5IGxldmVscy4KLSAqIElmIEVFUFJPTSB2YWx1ZXMgZmFsbCBvdXRzaWRlIE1JTi9NQVggcmFuZ2UsIHVzZSBkZWZhdWx0IHZhbHVlcy4KLSAqCi0gKiBSZWd1bGF0b3J5IGxpbWl0cyByZWZlciB0byB0aGUgbWF4aW11bSBhdmVyYWdlIHR4cG93ZXIgYWxsb3dlZCBieQotICogcmVndWxhdG9yeSBhZ2VuY2llcyBpbiB0aGUgZ2VvZ3JhcGhpZXMgaW4gd2hpY2ggdGhlIGRldmljZSBpcyBtZWFudAotICogdG8gYmUgb3BlcmF0ZWQuICBUaGVzZSBsaW1pdHMgYXJlIFNLVS1zcGVjaWZpYyAoaS5lLiBnZW9ncmFwaHktc3BlY2lmaWMpLAotICogYW5kIGNoYW5uZWwtc3BlY2lmaWM7IGVhY2ggY2hhbm5lbCBoYXMgYW4gaW5kaXZpZHVhbCByZWd1bGF0b3J5IGxpbWl0Ci0gKiBsaXN0ZWQgaW4gdGhlIEVFUFJPTS4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM0IiBtZWFucyAxNyBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfNTIgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01JTiAgICAgICAgICAoMCkKLSNkZWZpbmUgSVdMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUFYICAgICAgICAgICgzNCkKLQotLyoqCi0gKiBTYW5pdHkgY2hlY2tzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgRUVQUk9NIHNhdHVyYXRpb24gbGV2ZWxzLgotICogSWYgRUVQUk9NIHZhbHVlcyBmYWxsIG91dHNpZGUgTUlOL01BWCByYW5nZSwgdXNlIGRlZmF1bHQgdmFsdWVzLgotICoKLSAqIFNhdHVyYXRpb24gaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgb3V0cHV0IHBvd2VyIGFtcGxpZmllciBjYW4gcHJvZHVjZQotICogd2l0aG91dCBzaWduaWZpY2FudCBjbGlwcGluZyBkaXN0b3J0aW9uLiAgVGhpcyBpcyBhICJwZWFrIiBwb3dlciBsZXZlbC4KLSAqIERpZmZlcmVudCB0eXBlcyBvZiBtb2R1bGF0aW9uIChpLmUuIHZhcmlvdXMgInJhdGVzIiwgYW5kIE9GRE0gdnMuIENDSykKLSAqIHJlcXVpcmUgZGlmZmVyaW5nIGFtb3VudHMgb2YgYmFja29mZiwgcmVsYXRpdmUgdG8gdGhlaXIgYXZlcmFnZSBwb3dlciBvdXRwdXQsCi0gKiBpbiBvcmRlciB0byBhdm9pZCBjbGlwcGluZyBkaXN0b3J0aW9uLgotICoKLSAqIERyaXZlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHZpb2xhdGluZyBuZWl0aGVyIHRoZSBzYXR1cmF0aW9uIGxpbWl0LAotICogbm9yIHRoZSByZWd1bGF0b3J5IGxpbWl0LCB3aGVuIGNhbGN1bGF0aW5nIFR4IHBvd2VyIHNldHRpbmdzIGZvciB2YXJpb3VzCi0gKiByYXRlcy4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM4IiBtZWFucyAxOSBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fNTIgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiAgICAgICAgICAoMjApCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01BWCAgICAgICAgICAoNTApCi0KLS8qKgotICogQ2hhbm5lbCBncm91cHMgdXNlZCBmb3IgVHggQXR0ZW51YXRpb24gY2FsaWJyYXRpb24gKE1JTU8gdHggY2hhbm5lbCBiYWxhbmNlKQotICogYW5kIHRoZXJtYWwgVHhwb3dlciBjYWxpYnJhdGlvbi4KLSAqCi0gKiBXaGVuIGNhbGN1bGF0aW5nIHR4cG93ZXIsIGRyaXZlciBtdXN0IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgZGV2aWNlCi0gKiB0ZW1wZXJhdHVyZTsgaGlnaGVyIHRlbXBlcmF0dXJlIHJlcXVpcmVzIGhpZ2hlciBnYWluLiAgRHJpdmVyIG11c3QgY2FsY3VsYXRlCi0gKiBjdXJyZW50IHRlbXBlcmF0dXJlIChzZWUgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iKSwgdGhlbiBjb21wYXJlIHZzLgotICogZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSBpbiBFRVBST007IGlmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgaGlnaGVyCi0gKiB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0ICppbmNyZWFzZSogZ2FpbiBieSBwcm9wb3J0aW9ucyBzaG93bgotICogaW4gdGFibGUgYmVsb3cuICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGxvd2VyIHRoYW4gZmFjdG9yeSwgZHJpdmVyIG11c3QKLSAqICpkZWNyZWFzZSogZ2Fpbi4KLSAqCi0gKiBEaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcyByZXF1aXJlIGRpZmZlcmVudCBjb21wZW5zYXRpb24sIGFzIHNob3duIGJlbG93LgotICovCi0vKiBHcm91cCAwLCA1LjIgR0h6IGNoIDM0LTQzOiAgNC41IGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9GQ0ggMzQKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9MQ0ggNDMKLQotLyogR3JvdXAgMSwgNS4zIEdIeiBjaCA0NC03MDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIIDQ0Ci0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfTENIIDcwCi0KLS8qIEdyb3VwIDIsIDUuNSBHSHogY2ggNzEtMTI0OiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggNzEKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19MQ0ggMTI0Ci0KLS8qIEdyb3VwIDMsIDUuNyBHSHogY2ggMTI1LTIwMDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjRfRkNIIDEyNQotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0xDSCAyMDAKLQotLyogR3JvdXAgNCwgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgMS8yIGRCLiAqLwotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0ZDSCAxCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjVfTENIIDIwCi0KLWVudW0gewotCUNBTElCX0NIX0dST1VQXzEgPSAwLAotCUNBTElCX0NIX0dST1VQXzIgPSAxLAotCUNBTElCX0NIX0dST1VQXzMgPSAyLAotCUNBTElCX0NIX0dST1VQXzQgPSAzLAotCUNBTElCX0NIX0dST1VQXzUgPSA0LAotCUNBTElCX0NIX0dST1VQX01BWAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiBFTkQgVFhQT1dFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioKLSAqIFR4L1J4IFF1ZXVlcwotICoKLSAqIE1vc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBpcyB2aWEgcXVldWVzIG9mIGRhdGEgYnVmZmVycy4KLSAqIEZvciBleGFtcGxlLCBhbGwgY29tbWFuZHMgdGhhdCB0aGUgZHJpdmVyIGlzc3VlcyB0byBkZXZpY2UncyBlbWJlZGRlZAotICogY29udHJvbGxlciAodUNvZGUpIGFyZSB2aWEgdGhlIGNvbW1hbmQgcXVldWUgKG9uZSBvZiB0aGUgVHggcXVldWVzKS4gIEFsbAotICogdUNvZGUgY29tbWFuZCByZXNwb25zZXMvcmVwbGllcy9ub3RpZmljYXRpb25zLCBpbmNsdWRpbmcgUnggZnJhbWVzLCBhcmUKLSAqIGNvbnZleWVkIGZyb20gdUNvZGUgdG8gZHJpdmVyIHZpYSB0aGUgUnggcXVldWUuCi0gKgotICogTW9zdCBzdXBwb3J0IGZvciB0aGVzZSBxdWV1ZXMsIGluY2x1ZGluZyBoYW5kc2hha2Ugc3VwcG9ydCwgcmVzaWRlcyBpbgotICogc3RydWN0dXJlcyBpbiBob3N0IERSQU0sIHNoYXJlZCBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuICBXaGVuCi0gKiBhbGxvY2F0aW5nIHRoaXMgbWVtb3J5LCB0aGUgZHJpdmVyIG11c3QgbWFrZSBzdXJlIHRoYXQgZGF0YSB3cml0dGVuIGJ5Ci0gKiB0aGUgaG9zdCBDUFUgdXBkYXRlcyBEUkFNIGltbWVkaWF0ZWx5IChhbmQgZG9lcyBub3QgZ2V0ICJzdHVjayIgaW4gQ1BVJ3MKLSAqIGNhY2hlIG1lbW9yeSksIHNvIERSQU0gYW5kIGNhY2hlIGFyZSBjb25zaXN0ZW50LCBhbmQgdGhlIGRldmljZSBjYW4KLSAqIGltbWVkaWF0ZWx5IHNlZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIGRyaXZlci4KLSAqCi0gKiA0OTY1IHN1cHBvcnRzIHVwIHRvIDE2IERSQU0tYmFzZWQgVHggcXVldWVzLCBhbmQgc2VydmljZXMgdGhlc2UgcXVldWVzIHZpYQotICogdXAgdG8gNyBETUEgY2hhbm5lbHMgKEZJRk9zKS4gIEVhY2ggVHggcXVldWUgaXMgc3VwcG9ydGVkIGJ5IGEgY2lyY3VsYXIgYXJyYXkKLSAqIGluIERSQU0gY29udGFpbmluZyAyNTYgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpLgotICovCi0jZGVmaW5lIElXTDQ5X05VTV9GSUZPUyAJNwotI2RlZmluZSBJV0w0OV9DTURfRklGT19OVU0JNAotI2RlZmluZSBJV0w0OV9OVU1fUVVFVUVTCTE2Ci0jZGVmaW5lIElXTDQ5X05VTV9BTVBEVV9RVUVVRVMJOAotCi0KLS8qKgotICogc3RydWN0IGl3bDQ5NjVfc2NoZWRxX2JjX3RibAotICoKLSAqIEJ5dGUgQ291bnQgdGFibGUKLSAqCi0gKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBieXRlLWNvdW50IHRhYmxlIGNvbnRhaW5pbmcgMzIwIGVudHJpZXM6Ci0gKiBvbmUgMTYtYml0IGVudHJ5IGZvciBlYWNoIG9mIDI1NiBURkRzLCBwbHVzIGFuIGFkZGl0aW9uYWwgNjQgZW50cmllcyB0aGF0Ci0gKiBkdXBsaWNhdGUgdGhlIGZpcnN0IDY0IGVudHJpZXMgKHRvIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGhpbiBhIFR4IHdpbmRvdzsKLSAqIG1heCBUeCB3aW5kb3cgaXMgNjQgVEZEcykuCi0gKgotICogV2hlbiBkcml2ZXIgc2V0cyB1cCBhIG5ldyBURkQsIGl0IG11c3QgYWxzbyBlbnRlciB0aGUgdG90YWwgYnl0ZSBjb3VudAotICogb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGJ5dGUKLSAqIGNvdW50IHRhYmxlIGZvciB0aGUgY2hvc2VuIFR4IHF1ZXVlLiAgSWYgdGhlIFRGRCBpbmRleCBpcyAwLTYzLCB0aGUgZHJpdmVyCi0gKiBtdXN0IGR1cGxpY2F0ZSB0aGUgYnl0ZSBjb3VudCBlbnRyeSBpbiBjb3JyZXNwb25kaW5nIGluZGV4IDI1Ni0zMTkuCi0gKgotICogcGFkZGluZyBwdXRzIGVhY2ggYnl0ZSBjb3VudCB0YWJsZSBvbiBhIDEwMjQtYnl0ZSBib3VuZGFyeTsKLSAqIDQ5NjUgYXNzdW1lcyB0YWJsZXMgYXJlIHNlcGFyYXRlZCBieSAxMDI0IGJ5dGVzLgotICovCi1zdHJ1Y3QgaXdsNDk2NV9zY2RfYmNfdGJsIHsKLQlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07Ci0JdTggcGFkWzEwMjQgLSAoVEZEX1FVRVVFX0JDX1NJWkUpICogc2l6ZW9mKF9fbGUxNildOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKLQotLyogUlNTSSB0byBkQm0gKi8KLSNkZWZpbmUgSVdMNDk2NV9SU1NJX09GRlNFVAk0NAotCi0vKiBQQ0kgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQotCi0vKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQotI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgotCi0jZGVmaW5lIElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWSAgMTUKLQotLyogRUVQUk9NICovCi0jZGVmaW5lIElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUJMTAKLQotCi0jZW5kaWYgLyogIV9faXdsXzQ5NjVfaHdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYyZmRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtbGVkLmgiCi0KLS8qIFNlbmQgbGVkIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfc2VuZF9sZWRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9sZWRfY21kICpsZWRfY21kKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9MRURTX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xlZF9jbWQpLAotCQkuZGF0YSA9IGxlZF9jbWQsCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmNhbGxiYWNrID0gTlVMTCwKLQl9OwotCXUzMiByZWc7Ci0KLQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9MRURfUkVHKTsKLQlpZiAocmVnICE9IChyZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSykpCi0JCWl3bF93cml0ZTMyKHByaXYsIENTUl9MRURfUkVHLCByZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLX0KLQotLyogU2V0IGxlZCByZWdpc3RlciBvZmYgKi8KLXZvaWQgaXdsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfTEVEX1JFRywgQ1NSX0xFRF9SRUdfVFJVTl9PTik7Ci19Ci0KLWNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2w0OTY1X2xlZF9vcHMgPSB7Ci0JLmNtZCA9IGl3bDQ5NjVfc2VuZF9sZWRfY21kLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDM2MTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2xlZF9oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9sZWRfaF9fCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2xlZF9vcHMgaXdsNDk2NV9sZWRfb3BzOwotdm9pZCBpd2w0OTY1X2xlZF9lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfbGVkX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNmQ5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtaHcuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotdm9pZCBpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCi17Ci0JaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgewotCQlJV0xfRVJSKHByaXYsICJUeCBmbHVzaCBjb21tYW5kIHRvIGZsdXNoIG91dCBhbGwgZnJhbWVzXG4iKTsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhfZmx1c2gpOwotCX0KLX0KLQotLyoKLSAqIEVFUFJPTQotICovCi1zdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsNDk2NV9tb2RfcGFyYW1zID0gewotCS5hbXNkdV9zaXplXzhLID0gMSwKLQkucmVzdGFydF9mdyA9IDEsCi0JLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLwotfTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKLQkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCi0JCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLwotCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgewotCQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRTsgaSsrKQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQotCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLwotCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOwotCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKLQlyeHEtPmZyZWVfY291bnQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgaXdsNDk2NV9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXUzMiByYl9zaXplOwotCWNvbnN0IHUzMiByZmRubG9nID0gUlhfUVVFVUVfU0laRV9MT0c7IC8qIDI1NiBSQkRzICovCi0JdTMyIHJiX3RpbWVvdXQgPSAwOwotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKLQkJcmJfc2l6ZSA9IEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SzsKLQllbHNlCi0JCXJiX3NpemUgPSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEs7Ci0KLQkvKiBTdG9wIFJ4IERNQSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7Ci0KLQkvKiBSZXNldCBkcml2ZXIncyBSeCBxdWV1ZSB3cml0ZSBpbmRleCAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcsIDApOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQkJICAgKHUzMikocnhxLT5iZF9kbWEgPj4gOCkpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgaW4gRFJBTSB0byB1cGRhdGUgaXRzIFJ4IHN0YXR1cyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKLQkJCSAgIHJ4cS0+cmJfc3R0c19kbWEgPj4gNCk7Ci0KLQkvKiBFbmFibGUgUnggRE1BCi0JICogRGlyZWN0IHJ4IGludGVycnVwdHMgdG8gaG9zdHMKLQkgKiBSeCBidWZmZXIgc2l6ZSA0IG9yIDhrCi0JICogUkIgdGltZW91dCAweDEwCi0JICogMjU2IFJCRHMKLQkgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCi0JCQkgICBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAotCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKLQkJCSAgIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAotCQkJICAgcmJfc2l6ZXwKLQkJCSAgIChyYl90aW1lb3V0IDw8IEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MpfAotCQkJICAgKHJmZG5sb2cgPDwgRkhfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKLQotCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLwotCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbzoKLQotCQlpZiAocGNpX3BtZV9jYXBhYmxlKHByaXYtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQotCQkJaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKLQkJCQkJICAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAotCQkJCQkgICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Ci0gKi8KLQotCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAotCQkJICAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOwotfQotCi1pbnQgaXdsNDk2NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWludCByZXQ7Ci0KLQkvKiBuaWNfaW5pdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCi0JLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIHRvIGRlZmF1bHQgKDUxMiB1c2VjcykgKi8KLQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfQ09BTEVTQ0lORywgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDQ5NjVfc2V0X3B3cl92bWFpbihwcml2KTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKHByaXYpOwotCi0JLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwotCWlmICghcnhxLT5iZCkgewotCQlyZXQgPSBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKHByaXYpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0gZWxzZQotCQlpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHByaXYsIHJ4cSk7Ci0KLQlpd2w0OTY1X3J4X3JlcGxlbmlzaChwcml2KTsKLQotCWl3bDQ5NjVfcnhfaW5pdChwcml2LCByeHEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4cS0+bmVlZF91cGRhdGUgPSAxOwotCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLwotCWlmICghcHJpdi0+dHhxKSB7Ci0JCXJldCA9IGl3bDQ5NjVfdHhxX2N0eF9hbGxvYyhwcml2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCWl3bDQ5NjVfdHhxX2N0eF9yZXNldChwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19sZTMyIGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikoZG1hX2FkZHIgPj4gOCkpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAotICoKLSAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKLSAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCi0gKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgotICoKLSAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaW5kZXggZm9yd2FyZCB0byBjYXRjaCB1cCB3aXRoICdwcm9jZXNzZWQnLCBhbmQKLSAqIGFsc28gdXBkYXRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgaW4gdGhlIGZpcm13YXJlIHRvIHJlZmVyZW5jZSB0aGUgbmV3Ci0gKiB0YXJnZXQgYnVmZmVyLgotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBUaGUgb3ZlcndyaXR0ZW4gcnhiIG11c3QgYmUgYSB1c2VkIG9uZSAqLwotCQlyeGIgPSByeHEtPnF1ZXVlW3J4cS0+d3JpdGVdOwotCQlCVUdfT04ocnhiICYmIHJ4Yi0+cGFnZSk7Ci0KLQkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7Ci0JCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0KLQkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KLQkJcnhxLT5iZFtyeHEtPndyaXRlXSA9IGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihwcml2LAotCQkJCQkJCSAgICAgIHJ4Yi0+cGFnZV9kbWEpOwotCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOwotCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCXJ4cS0+ZnJlZV9jb3VudC0tOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCi0JICogcmVmaWxsIGl0ICovCi0JaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7Ci0KLQotCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgotCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLwotCWlmIChyeHEtPndyaXRlX2FjdHVhbCAhPSAocnhxLT53cml0ZSAmIH4weDcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgcnhxKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsX3J4X3F1ZXVlX3Jlc3RvY2suCi0gKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2FsbG9jYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZ2ZwX3QgcHJpb3JpdHkpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKLQotCXdoaWxlICgxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwotCi0JCWlmIChwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOwotCi0JCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCQlpZiAoIXBhZ2UpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImFsbG9jX3BhZ2VzIGZhaWxlZCwgIgotCQkJCQkgICAgICAgIm9yZGVyOiAlZFxuIiwKLQkJCQkJICAgICAgIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQotCQkJaWYgKChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykgJiYKLQkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0NSSVQocHJpdiwKLQkJCQkJIkZhaWxlZCB0byBhbGxvY19wYWdlcyB3aXRoICVzLiAiCi0JCQkJCSJPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAotCQkJCQkgcHJpb3JpdHkgPT0gR0ZQX0FUT01JQyA/Ci0JCQkJCQkgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCUJVR19PTihyeGItPnBhZ2UpOwotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUkIgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkvKiBkbWEgYWRkcmVzcyBtdXN0IGJlIG5vIG1vcmUgdGhhbiAzNiBiaXRzICovCi0JCUJVR19PTihyeGItPnBhZ2VfZG1hICYgfkRNQV9CSVRfTUFTSygzNikpOwotCQkvKiBhbmQgYWxzbyAyNTYgYnl0ZSBhbGlnbmVkISAqLwotCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIERNQV9CSVRfTUFTSyg4KSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCXJ4cS0+ZnJlZV9jb3VudCsrOwotCQlwcml2LT5hbGxvY19yeGJfcGFnZSsrOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBpd2w0OTY1X3J4X3JlcGxlbmlzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWl3bDQ5NjVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0tFUk5FTCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2w0OTY1X3J4X2FsbG9jYXRlKHByaXYsIEdGUF9BVE9NSUMpOwotCi0JaXdsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOwotfQotCi0vKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KLSAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCi0gKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KLSAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7Ci0JCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCi0JCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlfX2l3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCByeHEtPnBvb2xbaV0ucGFnZSk7Ci0JCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKLQkJCSAgcnhxLT5iZF9kbWEpOwotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCi0JCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7Ci0JcnhxLT5iZCA9IE5VTEw7Ci0JcnhxLT5yYl9zdHRzICA9IE5VTEw7Ci19Ci0KLWludCBpd2w0OTY1X3J4cV9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCS8qIHN0b3AgUnggRE1BICovCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKLQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCQkgICAgRkhfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQlpbnQgaWR4ID0gMDsKLQlpbnQgYmFuZF9vZmZzZXQgPSAwOwotCi0JLyogSFQgcmF0ZSBmb3JtYXQ6IG1hYzgwMjExIHdhbnRzIGFuIE1DUyBudW1iZXIsIHdoaWNoIGlzIGp1c3QgTFNCICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0JCXJldHVybiBpZHg7Ci0JLyogTGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCWJhbmRfb2Zmc2V0ID0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJZm9yIChpZHggPSBiYW5kX29mZnNldDsgaWR4IDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpZHgrKykKLQkJCWlmIChpd2xlZ2FjeV9yYXRlc1tpZHhdLnBsY3AgPT0gKHJhdGVfbl9mbGFncyAmIDB4RkYpKQotCQkJCXJldHVybiBpZHggLSBiYW5kX29mZnNldDsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9jYWxjX3Jzc2koc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKnJ4X3Jlc3ApCi17Ci0JLyogZGF0YSBmcm9tIFBIWS9EU1AgcmVnYXJkaW5nIHNpZ25hbCBzdHJlbmd0aCwgZXRjLiwKLQkgKiAgIGNvbnRlbnRzIGFyZSBhbHdheXMgdGhlcmUsIG5vdCBjb25maWd1cmFibGUgYnkgaG9zdC4gICovCi0Jc3RydWN0IGl3bDQ5NjVfcnhfbm9uX2NmZ19waHkgKm5jcGh5ID0KLQkgICAgKHN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5ICopcnhfcmVzcC0+bm9uX2NmZ19waHlfYnVmOwotCXUzMiBhZ2MgPSAobGUxNl90b19jcHUobmNwaHktPmFnY19pbmZvKSAmIElXTDQ5X0FHQ19EQl9NQVNLKQotCQkJPj4gSVdMNDlfQUdDX0RCX1BPUzsKLQotCXUzMiB2YWxpZF9hbnRlbm5hZSA9Ci0JICAgIChsZTE2X3RvX2NwdShyeF9yZXNwLT5waHlfZmxhZ3MpICYgSVdMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0spCi0JCQk+PiBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUOwotCXU4IG1heF9yc3NpID0gMDsKLQl1MzIgaTsKLQotCS8qIEZpbmQgbWF4IHJzc2kgYW1vbmcgMyBwb3NzaWJsZSByZWNlaXZlcnMuCi0JICogVGhlc2UgdmFsdWVzIGFyZSBtZWFzdXJlZCBieSB0aGUgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yIChEU1ApLgotCSAqIFRoZXkgc2hvdWxkIHN0YXkgZmFpcmx5IGNvbnN0YW50IGV2ZW4gYXMgdGhlIHNpZ25hbCBzdHJlbmd0aCB2YXJpZXMsCi0JICogICBpZiB0aGUgcmFkaW8ncyBhdXRvbWF0aWMgZ2FpbiBjb250cm9sIChBR0MpIGlzIHdvcmtpbmcgcmlnaHQuCi0JICogQUdDIHZhbHVlIChzZWUgYmVsb3cpIHdpbGwgcHJvdmlkZSB0aGUgImludGVyZXN0aW5nIiBpbmZvLiAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCWlmICh2YWxpZF9hbnRlbm5hZSAmICgxIDw8IGkpKQotCQkJbWF4X3Jzc2kgPSBtYXgobmNwaHktPnJzc2lfaW5mb1tpIDw8IDFdLCBtYXhfcnNzaSk7Ci0KLQlJV0xfREVCVUdfU1RBVFMocHJpdiwgIlJzc2kgSW4gQSAlZCBCICVkIEMgJWQgTWF4ICVkIEFHQyBkQiAlZFxuIiwKLQkJbmNwaHktPnJzc2lfaW5mb1swXSwgbmNwaHktPnJzc2lfaW5mb1syXSwgbmNwaHktPnJzc2lfaW5mb1s0XSwKLQkJbWF4X3Jzc2ksIGFnYyk7Ci0KLQkvKiBkQm0gPSBtYXhfcnNzaSBkQiAtIGFnYyBkQiAtIGNvbnN0YW50LgotCSAqIEhpZ2hlciBBR0MgKGhpZ2hlciByYWRpbyBnYWluKSBtZWFucyBsb3dlciBzaWduYWwuICovCi0JcmV0dXJuIG1heF9yc3NpIC0gYWdjIC0gSVdMNDk2NV9SU1NJX09GRlNFVDsKLX0KLQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZWNyeXB0X2luKQotewotCXUzMiBkZWNyeXB0X291dCA9IDA7Ci0KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQpID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkKLQkJZGVjcnlwdF9vdXQgfD0gKFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCB8Ci0JCQkJUlhfUkVTX1NUQVRVU19OT19TVEFUSU9OX0lORk9fTUlTTUFUQ0gpOwotCi0JZGVjcnlwdF9vdXQgfD0gKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSyk7Ci0KLQkvKiBwYWNrZXQgd2FzIG5vdCBlbmNyeXB0ZWQgKi8KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgPT0KLQkJCQkJUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBwYWNrZXQgd2FzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gYWxnICovCi0JaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU0VDX1RZUEVfRVJSKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBkZWNyeXB0aW9uIHdhcyBub3QgZG9uZSBpbiBIVyAqLwotCWlmICgoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spICE9Ci0JCQkJCVJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spCi0JCXJldHVybiBkZWNyeXB0X291dDsKLQotCXN3aXRjaCAoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7Ci0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKLQkJLyogYWxnIGlzIENDTTogY2hlY2sgTUlDIG9ubHkgKi8KLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0spKQotCQkJLyogQmFkIE1JQyAqLwotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCi0JCWJyZWFrOwotCi0JY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6Ci0JCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfVFRBS19PSykpIHsKLQkJCS8qIEJhZCBUVEFLICovCi0JCQlkZWNyeXB0X291dCB8PSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSzsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCBpZiBUVEFLIE9LICovCi0JZGVmYXVsdDoKLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0spKQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImRlY3J5cHRfaW46MHgleCAgZGVjcnlwdF9vdXQgPSAweCV4XG4iLAotCQkJCQlkZWNyeXB0X2luLCBkZWNyeXB0X291dCk7Ci0KLQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCQl1MTYgbGVuLAotCQkJCQl1MzIgYW1wZHVfc3RhdHVzLAotCQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0JLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KLQlpZiAodW5saWtlbHkoIXByaXYtPmlzX29wZW4pKSB7Ci0JCUlXTF9ERUJVR19EUk9QX0xJTUlUKHByaXYsCi0JCSAgICAiRHJvcHBpbmcgcGFja2V0IHdoaWxlIGludGVyZmFjZSBpcyBub3Qgb3Blbi5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSW4gY2FzZSBvZiBIVyBhY2NlbGVyYXRlZCBjcnlwdG8gYW5kIGJhZCBkZWNyeXB0aW9uLCBkcm9wICovCi0JaWYgKCFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byAmJgotCSAgICBpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyhwcml2LCBoZHIsIGFtcGR1X3N0YXR1cywgc3RhdHMpKQotCQlyZXR1cm47Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7Ci0JaWYgKCFza2IpIHsKLQkJSVdMX0VSUihwcml2LCAiZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLCAodm9pZCAqKWhkciAtIHJ4Yl9hZGRyKHJ4YiksIGxlbik7Ci0KLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCBmYWxzZSwgZmMsIGxlbik7Ci0JbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOwotCi0JaWVlZTgwMjExX3J4KHByaXYtPmh3LCBza2IpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci0JcnhiLT5wYWdlID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGZvciBSRVBMWV9SWCAobGVnYWN5IEFCRyBmcmFtZXMpLCBvcgotICogUkVQTFlfUlhfTVBEVV9DTUQgKEhUIGhpZ2gtdGhyb3VnaHB1dCBOIGZyYW1lcykuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcngoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyAqcGh5X3JlczsKLQlfX2xlMzIgcnhfcGt0X3N0YXR1czsKLQlzdHJ1Y3QgaXdsX3J4X21wZHVfcmVzX3N0YXJ0ICphbXNkdTsKLQl1MzIgbGVuOwotCXUzMiBhbXBkdV9zdGF0dXM7Ci0JdTMyIHJhdGVfbl9mbGFnczsKLQotCS8qKgotCSAqIFJFUExZX1JYIGFuZCBSRVBMWV9SWF9NUERVX0NNRCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KLQkgKglSRVBMWV9SWDogcGh5c2ljYWwgbGF5ZXIgaW5mbyBpcyBpbiB0aGlzIGJ1ZmZlcgotCSAqCVJFUExZX1JYX01QRFVfQ01EOiBwaHlzaWNhbCBsYXllciBpbmZvIHdhcyBzZW50IGluIHNlcGFyYXRlCi0JICoJCWNvbW1hbmQgYW5kIGNhY2hlZCBpbiBwcml2LT5sYXN0X3BoeV9yZXMKLQkgKgotCSAqIEhlcmUgd2Ugc2V0IHVwIGxvY2FsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gd2hpY2ggY29tbWFuZCBpcwotCSAqIHJlY2VpdmVkLgotCSAqLwotCWlmIChwa3QtPmhkci5jbWQgPT0gUkVQTFlfUlgpIHsKLQkJcGh5X3JlcyA9IChzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKilwa3QtPnUucmF3OwotCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocGt0LT51LnJhdyArIHNpemVvZigqcGh5X3JlcykKLQkJCQkrIHBoeV9yZXMtPmNmZ19waHlfY250KTsKLQotCQlsZW4gPSBsZTE2X3RvX2NwdShwaHlfcmVzLT5ieXRlX2NvdW50KTsKLQkJcnhfcGt0X3N0YXR1cyA9ICooX19sZTMyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKnBoeV9yZXMpICsKLQkJCQlwaHlfcmVzLT5jZmdfcGh5X2NudCArIGxlbik7Ci0JCWFtcGR1X3N0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpOwotCX0gZWxzZSB7Ci0JCWlmICghcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJNUERVIGZyYW1lIHdpdGhvdXQgY2FjaGVkIFBIWSBkYXRhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlwaHlfcmVzID0gJnByaXYtPl80OTY1Lmxhc3RfcGh5X3JlczsKLQkJYW1zZHUgPSAoc3RydWN0IGl3bF9yeF9tcGR1X3Jlc19zdGFydCAqKXBrdC0+dS5yYXc7Ci0JCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkpOwotCQlsZW4gPSBsZTE2X3RvX2NwdShhbXNkdS0+Ynl0ZV9jb3VudCk7Ci0JCXJ4X3BrdF9zdGF0dXMgPSAqKF9fbGUzMiAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOwotCQlhbXBkdV9zdGF0dXMgPSBpd2w0OTY1X3RyYW5zbGF0ZV9yeF9zdGF0dXMocHJpdiwKLQkJCQlsZTMyX3RvX2NwdShyeF9wa3Rfc3RhdHVzKSk7Ci0JfQotCi0JaWYgKCh1bmxpa2VseShwaHlfcmVzLT5jZmdfcGh5X2NudCA+IDIwKSkpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAotCQkJCXBoeV9yZXMtPmNmZ19waHlfY250KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SKSB8fAotCSAgICAhKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVykpIHsKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsCi0JCQkJbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVGhpcyB3aWxsIGJlIHVzZWQgaW4gc2V2ZXJhbCBwbGFjZXMgbGF0ZXIgKi8KLQlyYXRlX25fZmxhZ3MgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5yYXRlX25fZmxhZ3MpOwotCi0JLyogcnhfc3RhdHVzIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCB0byBtYWM4MDIxMSAqLwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKTsKLQlyeF9zdGF0dXMuYmFuZCA9IChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/Ci0JCQkJSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0Jcnhfc3RhdHVzLmZyZXEgPQotCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCksCi0JCQkJCQkJcnhfc3RhdHVzLmJhbmQpOwotCXJ4X3N0YXR1cy5yYXRlX2lkeCA9Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsIHJ4X3N0YXR1cy5iYW5kKTsKLQlyeF9zdGF0dXMuZmxhZyA9IDA7Ci0KLQkvKiBUU0YgaXNuJ3QgcmVsaWFibGUuIEluIG9yZGVyIHRvIGFsbG93IHNtb290aCB1c2VyIGV4cGVyaWVuY2UsCi0JICogdGhpcyBXL0EgZG9lc24ndCBwcm9wYWdhdGUgaXQgdG8gdGhlIG1hYzgwMjExICovCi0JLypyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfTVBEVTsqLwotCi0JcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7Ci0KLQkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLwotCXJ4X3N0YXR1cy5zaWduYWwgPSBpd2w0OTY1X2NhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKLQotCWl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHByaXYsIGxlbiwgaGVhZGVyKTsKLQlJV0xfREVCVUdfU1RBVFNfTElNSVQocHJpdiwgIlJzc2kgJWQsIFRTRiAlbGx1XG4iLAotCQlyeF9zdGF0dXMuc2lnbmFsLCAodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKLQotCS8qCi0JICogImFudGVubmEgbnVtYmVyIgotCSAqCi0JICogSXQgc2VlbXMgdGhhdCB0aGUgYW50ZW5uYSBmaWVsZCBpbiB0aGUgcGh5IGZsYWdzIHZhbHVlCi0JICogaXMgYWN0dWFsbHkgYSBiaXQgZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAotCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgotCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgotCSAqCi0JICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGEKLQkgKiBuZXcgODAyLjExbiByYWRpb3RhcCBmaWVsZCAiUlggY2hhaW5zIiB0aGF0IGlzIGRlZmluZWQKLQkgKiBhcyBhIGJpdG1hc2suCi0JICovCi0Jcnhfc3RhdHVzLmFudGVubmEgPQotCQkobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spCi0JCT4+IFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0KLQkvKiBTZXQgdXAgdGhlIEhUIHBoeSBmbGFncyAqLwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSFQ7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHXzQwTUhaOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOwotCi0JaXdsNDk2NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShwcml2LCBoZWFkZXIsIGxlbiwgYW1wZHVfc3RhdHVzLAotCQkJCSAgICByeGIsICZyeF9zdGF0dXMpOwotfQotCi0vKiBDYWNoZSBwaHkgZGF0YSAoUnggc2lnbmFsIHN0cmVuZ3RoLCBldGMpIGZvciBIVCBmcmFtZSAoUkVQTFlfUlhfUEhZX0NNRCkuCi0gKiBUaGlzIHdpbGwgYmUgdXNlZCBsYXRlciBpbiBpd2xfcnhfcmVwbHlfcngoKSBmb3IgUkVQTFlfUlhfTVBEVV9DTUQuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlwcml2LT5fNDk2NS5sYXN0X3BoeV9yZXNfdmFsaWQgPSB0cnVlOwotCW1lbWNweSgmcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9yeF9waHlfcmVzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTE2IHBhc3NpdmVfZHdlbGwgPSAwOwotCXUxNiBhY3RpdmVfZHdlbGwgPSAwOwotCWludCBhZGRlZCwgaTsKLQl1MTYgY2hhbm5lbDsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpCi0JCXJldHVybiAwOwotCi0JYWN0aXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQljaGFuID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJY2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOwotCQlzY2FuX2NoLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0KLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJICJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCi0JCQkJCWNoYW5uZWwpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWlzX2FjdGl2ZSB8fCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAotCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkKLQkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOwotCi0JCWlmIChuX3Byb2JlcykKLQkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMX1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCi0JCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwotCQlzY2FuX2NoLT5kc3BfYXR0ZW4gPSAxMTA7Ci0KLQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKLQkJICogcG93ZXIgbGV2ZWw6Ci0JCSAqIHNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwotCQkgKi8KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwotCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FubmluZyBjaD0lZCBwcm9iPTB4JVggWyVzICVkXVxuIiwKLQkJCSAgICAgICBjaGFubmVsLCBsZTMyX3RvX2NwdShzY2FuX2NoLT50eXBlKSwKLQkJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPwotCQkJCSJBQ1RJVkUiIDogIlBBU1NJVkUiLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFKSA/Ci0JCQkgICAgICAgYWN0aXZlX2R3ZWxsIDogcGFzc2l2ZV9kd2VsbCk7Ci0KLQkJc2Nhbl9jaCsrOwotCQlhZGRlZCsrOwotCX0KLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJ0b3RhbCBjaGFubmVscyB0byBzY2FuICVkXG4iLCBhZGRlZCk7Ci0JcmV0dXJuIGFkZGVkOwotfQotCi1pbnQgaXdsNDk2NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TQ0FOX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY21kKSwKLQkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKLQl9OwotCXN0cnVjdCBpd2xfc2Nhbl9jbWQgKnNjYW47Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1MzIgcmF0ZV9mbGFncyA9IDA7Ci0JdTE2IGNtZF9sZW47Ci0JdTE2IHJ4X2NoYWluID0gMDsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JdTggbl9wcm9iZXMgPSAwOwotCXU4IHJ4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7Ci0JdTggcmF0ZTsKLQlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOwotCWludCAgY2hhbl9tb2Q7Ci0JdTggYWN0aXZlX2NoYWluczsKLQl1OCBzY2FuX3R4X2FudGVubmFzID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHZpZikKLQkJY3R4ID0gaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQlwcml2LT5zY2FuX2NtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsKLQkJCQkJIElXTF9NQVhfU0NBTl9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCQkgICAgICAgImZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzY2FuXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCXNjYW4gPSBwcml2LT5zY2FuX2NtZDsKLQltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsgSVdMX01BWF9TQ0FOX1NJWkUpOwotCi0Jc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElXTF9QTENQX1FVSUVUX1RIUkVTSDsKLQlzY2FuLT5xdWlldF90aW1lID0gSVdMX0FDVElWRV9RVUlFVF9USU1FOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJdTE2IGludGVydmFsOwotCQl1MzIgZXh0cmE7Ci0JCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7Ci0JCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7Ci0JCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OwotCi0JCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7Ci0JCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOwotCQlpZiAoIWludGVydmFsKQotCQkJaW50ZXJ2YWwgPSBzdXNwZW5kX3RpbWU7Ci0KLQkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDIyOwotCQlzY2FuX3N1c3BlbmRfdGltZSA9IChleHRyYSB8Ci0JCSAgICAoKHN1c3BlbmRfdGltZSAlIGludGVydmFsKSAqIDEwMjQpKTsKLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAic3VzcGVuZF90aW1lIDB4JVggYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7Ci0JfQotCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgewotCQlpbnQgaSwgcCA9IDA7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgewotCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCi0JCQlpZiAoIXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pCi0JCQkJY29udGludWU7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5pZCA9IFdMQU5fRUlEX1NTSUQ7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5sZW4gPQotCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47Ci0JCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKLQkJCSAgICAgICBwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7Ci0JCQluX3Byb2JlcysrOwotCQkJcCsrOwotCQl9Ci0JCWlzX2FjdGl2ZSA9IHRydWU7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydCBwYXNzaXZlIHNjYW4uXG4iKTsKLQotCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0Jc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCXN3aXRjaCAocHJpdi0+c2Nhbl9iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKLQkJY2hhbl9tb2QgPSBsZTMyX3RvX2NwdSgKLQkJCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncyAmCi0JCQkJCQlSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCQlpZiAoY2hhbl9tb2QgPT0gQ0hBTk5FTF9NT0RFX1BVUkVfNDApIHsKLQkJCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQl9IGVsc2UgewotCQkJcmF0ZSA9IElXTF9SQVRFXzFNX1BMQ1A7Ci0JCQlyYXRlX2ZsYWdzID0gUkFURV9NQ1NfQ0NLX01TSzsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBzY2FuIGJhbmRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGFjdGl2ZSBzY2FubmluZyBpcyByZXF1ZXN0ZWQgYnV0IGEgY2VydGFpbiBjaGFubmVsIGlzCi0JICogbWFya2VkIHBhc3NpdmUsIHdlIGNhbiBkbyBhY3RpdmUgc2Nhbm5pbmcgaWYgd2UgZGV0ZWN0Ci0JICogdHJhbnNtaXNzaW9ucy4KLQkgKgotCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggc29tZSBmaXJtd2FyZSB2ZXJzaW9ucyB0aGF0IHRyaWdnZXJzCi0JICogYSBzeXNhc3NlcnQgb24gYSAiZ29vZCBDUkMgdGhyZXNob2xkIiBvZiB6ZXJvICg9PSBkaXNhYmxlZCksCi0JICogb24gYSByYWRhciBjaGFubmVsIGV2ZW4gdGhvdWdoIHRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgTk9UCi0JICogc2VuZCBwcm9iZXMuCi0JICoKLQkgKiBUaGUgImdvb2QgQ1JDIHRocmVzaG9sZCIgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZQotCSAqIG5lZWQgdG8gcmVjZWl2ZSBkdXJpbmcgb3VyIGR3ZWxsIHRpbWUgb24gYSBjaGFubmVsIGJlZm9yZQotCSAqIHNlbmRpbmcgb3V0IHByb2JlcyAtLSBzZXR0aW5nIHRoaXMgdG8gYSBodWdlIHZhbHVlIHdpbGwKLQkgKiBtZWFuIHdlIG5ldmVyIHJlYWNoIGl0LCBidXQgYXQgdGhlIHNhbWUgdGltZSB3b3JrIGFyb3VuZAotCSAqIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZS4gVGh1cyB1c2UgSVdMX0dPT0RfQ1JDX1RIX05FVkVSCi0JICogaGVyZSBpbnN0ZWFkIG9mIElXTF9HT09EX0NSQ19USF9ESVNBQkxFRC4KLQkgKi8KLQlzY2FuLT5nb29kX0NSQ190aCA9IGlzX2FjdGl2ZSA/IElXTF9HT09EX0NSQ19USF9ERUZBVUxUIDoKLQkJCQkJSVdMX0dPT0RfQ1JDX1RIX05FVkVSOwotCi0JYmFuZCA9IHByaXYtPnNjYW5fYmFuZDsKLQotCWlmIChwcml2LT5jZmctPnNjYW5fcnhfYW50ZW5uYXNbYmFuZF0pCi0JCXJ4X2FudCA9IHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKLQotCXByaXYtPnNjYW5fdHhfYW50W2JhbmRdID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsCi0JCQkJCQlwcml2LT5zY2FuX3R4X2FudFtiYW5kXSwKLQkJCQkJCSAgICBzY2FuX3R4X2FudGVubmFzKTsKLQlyYXRlX2ZsYWdzIHw9IGl3bDQ5NjVfYW50X2lkeF90b19mbGFncyhwcml2LT5zY2FuX3R4X2FudFtiYW5kXSk7Ci0Jc2Nhbi0+dHhfY21kLnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKLQotCS8qIEluIHBvd2VyIHNhdmUgbW9kZSB1c2Ugb25lIGNoYWluLCBvdGhlcndpc2UgdXNlIGFsbCBjaGFpbnMgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogcnhfYW50IGhhcyBiZWVuIHNldCB0byBhbGwgdmFsaWQgY2hhaW5zIHByZXZpb3VzbHkgKi8KLQkJYWN0aXZlX2NoYWlucyA9IHJ4X2FudCAmCi0JCQkJKCh1OCkocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKSk7Ci0JCWlmICghYWN0aXZlX2NoYWlucykKLQkJCWFjdGl2ZV9jaGFpbnMgPSByeF9hbnQ7Ci0KLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczogJXVcbiIsCi0JCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKTsKLQotCQlyeF9hbnQgPSBpd2w0OTY1X2ZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7Ci0JfQotCi0JLyogTUlNTyBpcyBub3QgdXNlZCBoZXJlLCBidXQgdmFsdWUgaXMgcmVxdWlyZWQgKi8KLQlyeF9jaGFpbiB8PSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCXJ4X2NoYWluIHw9IHJ4X2FudCA8PCBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX1BPUzsKLQlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TOwotCXJ4X2NoYWluIHw9IDB4MSA8PCBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1M7Ci0Jc2Nhbi0+cnhfY2hhaW4gPSBjcHVfdG9fbGUxNihyeF9jaGFpbik7Ci0KLQljbWRfbGVuID0gaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcShwcml2LAotCQkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKLQkJCQkJdmlmLT5hZGRyLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKLQkJCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKLQlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYoY21kX2xlbik7Ci0KLQlzY2FuLT5maWx0ZXJfZmxhZ3MgfD0gKFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLIHwKLQkJCSAgICAgICBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7Ci0KLQlzY2FuLT5jaGFubmVsX2NvdW50ID0gaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgdmlmLCBiYW5kLAotCQkJCQkJaXNfYWN0aXZlLCBuX3Byb2JlcywKLQkJCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbY21kX2xlbl0pOwotCWlmIChzY2FuLT5jaGFubmVsX2NvdW50ID09IDApIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQljbWQubGVuICs9IGxlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pICsKLQkgICAgc2Nhbi0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCk7Ci0JY21kLmRhdGEgPSBzY2FuOwotCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JaWYgKGFkZCkKLQkJcmV0dXJuIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwKLQkJCQkJCXZpZi0+YnNzX2NvbmYuYnNzaWQsCi0JCQkJCQkmdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihwcml2LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCi0JCQkJICB2aWYtPmJzc19jb25mLmJzc2lkKTsKLX0KLQotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnN0YV9sb2NrKTsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCi0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSAtPSBmcmVlZDsKLQllbHNlIHsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUsCi0JCQlmcmVlZCk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSA9IDA7Ci0JfQotfQotCi0jZGVmaW5lIElXTF9UWF9RVUVVRV9NU0sJMHhmZmZmZgotCi1zdGF0aWMgYm9vbCBpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQyB8fAotCSAgICAgICBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKLX0KLQotI2RlZmluZSBJV0xfTlVNX1JYX0NIQUlOU19NVUxUSVBMRQkzCi0jZGVmaW5lIElXTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRQkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfRFVBTAkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFCTEKLQotLyoKLSAqIERldGVybWluZSBob3cgbWFueSByZWNlaXZlci9hbnRlbm5hIGNoYWlucyB0byB1c2UuCi0gKgotICogTW9yZSBwcm92aWRlcyBiZXR0ZXIgcmVjZXB0aW9uIHZpYSBkaXZlcnNpdHkuICBGZXdlciBzYXZlcyBwb3dlcgotICogYXQgdGhlIGV4cGVuc2Ugb2YgdGhyb3VnaHB1dCwgYnV0IG9ubHkgd2hlbiBub3QgaW4gcG93ZXJzYXZlIHRvCi0gKiBzdGFydCB3aXRoLgotICoKLSAqIE1JTU8gKGR1YWwgc3RyZWFtKSByZXF1aXJlcyBhdCBsZWFzdCAyLCBidXQgd29ya3MgYmV0dGVyIHdpdGggMy4KLSAqIFRoaXMgZG9lcyBub3QgZGV0ZXJtaW5lICp3aGljaCogY2hhaW5zIHRvIHVzZSwganVzdCBob3cgbWFueS4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qICMgb2YgUnggY2hhaW5zIHRvIHVzZSB3aGVuIGV4cGVjdGluZyBNSU1PLiAqLwotCWlmIChpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0ocHJpdikpCi0JCXJldHVybiBJV0xfTlVNX1JYX0NIQUlOU19TSU5HTEU7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX05VTV9SWF9DSEFJTlNfTVVMVElQTEU7Ci19Ci0KLS8qCi0gKiBXaGVuIHdlIGFyZSBpbiBwb3dlciBzYXZpbmcgbW9kZSwgdW5sZXNzIGRldmljZSBzdXBwb3J0IHNwYXRpYWwKLSAqIG11bHRpcGxleGluZyBwb3dlciBzYXZlLCB1c2UgdGhlIGFjdGl2ZSBjb3VudCBmb3IgcnggY2hhaW4gY291bnQuCi0gKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgYWN0aXZlX2NudCkKLXsKLQkvKiAjIFJ4IGNoYWlucyB3aGVuIGlkbGluZywgZGVwZW5kaW5nIG9uIFNNUFMgbW9kZSAqLwotCXN3aXRjaCAocHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcykgewotCWNhc2UgSUVFRTgwMjExX1NNUFNfU1RBVElDOgotCWNhc2UgSUVFRTgwMjExX1NNUFNfRFlOQU1JQzoKLQkJcmV0dXJuIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFOwotCWNhc2UgSUVFRTgwMjExX1NNUFNfT0ZGOgotCQlyZXR1cm4gYWN0aXZlX2NudDsKLQlkZWZhdWx0OgotCQlXQVJOKDEsICJpbnZhbGlkIFNNUFMgbW9kZSAlZCIsCi0JCSAgICAgcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyk7Ci0JCXJldHVybiBhY3RpdmVfY250OwotCX0KLX0KLQotLyogdXAgdG8gNCBjaGFpbnMgKi8KLXN0YXRpYyB1OCBpd2w0OTY1X2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQotewotCXU4IHJlczsKLQlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDMpKSA+PiAzOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiAtIFNldCB1cCBSeCBjaGFpbiB1c2FnZSBpbiAic3RhZ2luZyIgUlhPTiBpbWFnZQotICoKLSAqIFNlbGVjdHMgaG93IG1hbnkgYW5kIHdoaWNoIFJ4IHJlY2VpdmVycy9hbnRlbm5hcy9jaGFpbnMgdG8gdXNlLgotICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHNjYW4gY29tbWFuZCAuLi4gaXQgcHV0cyBkYXRhIGluIHdyb25nIHBsYWNlLgotICovCi12b2lkIGl3bDQ5NjVfc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWJvb2wgaXNfc2luZ2xlID0gaXdsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKHByaXYpOwotCWJvb2wgaXNfY2FtID0gIXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCXU4IGlkbGVfcnhfY250LCBhY3RpdmVfcnhfY250LCB2YWxpZF9yeF9jbnQ7Ci0JdTMyIGFjdGl2ZV9jaGFpbnM7Ci0JdTE2IHJ4X2NoYWluOwotCi0JLyogVGVsbCB1Q29kZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLgotCSAqIEJlZm9yZSBmaXJzdCBhc3NvY2lhdGlvbiwgd2UgYXNzdW1lIGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgotCSAqIEp1c3QgYWZ0ZXIgZmlyc3QgYXNzb2NpYXRpb24sIGl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oKQotCSAqICAgIGNoZWNrcyB3aGljaCBhbnRlbm5hcyBhY3R1YWxseSAqYXJlKiBjb25uZWN0ZWQuICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKLQkJYWN0aXZlX2NoYWlucyA9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczsKLQllbHNlCi0JCWFjdGl2ZV9jaGFpbnMgPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JcnhfY2hhaW4gPSBhY3RpdmVfY2hhaW5zIDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCi0JLyogSG93IG1hbnkgcmVjZWl2ZXJzIHNob3VsZCB3ZSB1c2U/ICovCi0JYWN0aXZlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2FjdGl2ZV9yeF9jaGFpbl9jb3VudChwcml2KTsKLQlpZGxlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQocHJpdiwgYWN0aXZlX3J4X2NudCk7Ci0KLQotCS8qIGNvcnJlY3QgcnggY2hhaW4gY291bnQgYWNjb3JkaW5nIGh3IHNldHRpbmdzCi0JICogYW5kIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uCi0JICovCi0JdmFsaWRfcnhfY250ID0gaXdsNDk2NV9jb3VudF9jaGFpbl9iaXRtYXAoYWN0aXZlX2NoYWlucyk7Ci0JaWYgKHZhbGlkX3J4X2NudCA8IGFjdGl2ZV9yeF9jbnQpCi0JCWFjdGl2ZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7Ci0KLQlpZiAodmFsaWRfcnhfY250IDwgaWRsZV9yeF9jbnQpCi0JCWlkbGVfcnhfY250ID0gdmFsaWRfcnhfY250OwotCi0JcnhfY2hhaW4gfD0gYWN0aXZlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUzsKLQlyeF9jaGFpbiB8PSBpZGxlX3J4X2NudCAgPDwgUlhPTl9SWF9DSEFJTl9DTlRfUE9TOwotCi0JY3R4LT5zdGFnaW5nLnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOwotCi0JaWYgKCFpc19zaW5nbGUgJiYgKGFjdGl2ZV9yeF9jbnQgPj0gSVdMX05VTV9SWF9DSEFJTlNfU0lOR0xFKSAmJiBpc19jYW0pCi0JCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiB8PSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluICY9IH5SWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJyeF9jaGFpbj0weCVYIGFjdGl2ZT0lZCBpZGxlPSVkXG4iLAotCQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluLAotCQkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOwotCi0JV0FSTl9PTihhY3RpdmVfcnhfY250ID09IDAgfHwgaWRsZV9yeF9jbnQgPT0gMCB8fAotCQlhY3RpdmVfcnhfY250IDwgaWRsZV9yeF9jbnQpOwotfQotCi11OCBpd2w0OTY1X3RvZ2dsZV90eF9hbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhbnQsIHU4IHZhbGlkKQotewotCWludCBpOwotCXU4IGluZCA9IGFudDsKLQotCWZvciAoaSA9IDA7IGkgPCBSQVRFX0FOVF9OVU0gLSAxOyBpKyspIHsKLQkJaW5kID0gKGluZCArIDEpIDwgUkFURV9BTlRfTlVNID8gIGluZCArIDEgOiAwOwotCQlpZiAodmFsaWQgJiBCSVQoaW5kKSkKLQkJCXJldHVybiBpbmQ7Ci0JfQotCXJldHVybiBhbnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2w0OTY1X2dldF9maF9zdHJpbmcoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCUlXTF9DTUQoRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9XUFRSKTsKLQlJV0xfQ01EKEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHKTsKLQlJV0xfQ01EKEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWKTsKLQlJV0xfQ01EKEZIX1RTU1JfVFhfU1RBVFVTX1JFRyk7Ci0JSVdMX0NNRChGSF9UU1NSX1RYX0VSUk9SX1JFRyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQl9Ci19Ci0KLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCi17Ci0JaW50IGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaW50IHBvcyA9IDA7Ci0Jc2l6ZV90IGJ1ZnN6ID0gMDsKLSNlbmRpZgotCXN0YXRpYyBjb25zdCB1MzIgZmhfdGJsW10gPSB7Ci0JCUZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcsCi0JCUZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQlGSF9SU0NTUl9DSE5MMF9XUFRSLAotCQlGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLAotCQlGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcsCi0JCUZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCUZIX01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSViwKLQkJRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAotCQlGSF9UU1NSX1RYX0VSUk9SX1JFRwotCX07Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGRpc3BsYXkpIHsKLQkJYnVmc3ogPSBBUlJBWV9TSVpFKGZoX3RibCkgKiA0OCArIDQwOwotCQkqYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKmJ1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIgICUzNHM6IDBYJTA4eFxuIiwKLQkJCQlpd2w0OTY1X2dldF9maF9zdHJpbmcoZmhfdGJsW2ldKSwKLQkJCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0jZW5kaWYKLQlJV0xfRVJSKHByaXYsICJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgIEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCUlXTF9FUlIocHJpdiwgIiAgJTM0czogMFglMDh4XG4iLAotCQkJaXdsNDk2NV9nZXRfZmhfc3RyaW5nKGZoX3RibFtpXSksCi0JCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWJlMjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLSNkZWZpbmUgSVdMNDk2NV9SU19OQU1FICJpd2wtNDk2NS1ycyIKLQotI2RlZmluZSBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFIDEKLSNkZWZpbmUgSVdMX05VTUJFUl9UUlkgICAgICAxCi0jZGVmaW5lIElXTF9IVF9OVU1CRVJfVFJZICAgMwotCi0jZGVmaW5lIElXTF9SQVRFX01BWF9XSU5ET1cJCTYyCS8qICMgdHggaW4gaGlzdG9yeSB3aW5kb3cgKi8KLSNkZWZpbmUgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgJCTYJLyogbWluIGZhaWx1cmVzIHRvIGNhbGMgdHB0ICovCi0jZGVmaW5lIElXTF9SQVRFX01JTl9TVUNDRVNTX1RICQk4CS8qIG1pbiBzdWNjZXNzZXMgdG8gY2FsYyB0cHQgKi8KLQotLyogbWF4IGFsbG93ZWQgcmF0ZSBtaXNzIGJlZm9yZSBzeW5jIExRIGNtZCAqLwotI2RlZmluZSBJV0xfTUlTU0VEX1JBVEVfTUFYCQkxNQotLyogbWF4IHRpbWUgdG8gYWNjdW0gaGlzdG9yeSAyIHNlY29uZHMgKi8KLSNkZWZpbmUgSVdMX1JBVEVfU0NBTEVfRkxVU0hfSU5UVkwgICAoMypIWikKLQotc3RhdGljIHU4IHJzX2h0X3RvX2xlZ2FjeVtdID0gewotCUlXTF9SQVRFXzZNX0lOREVYLCBJV0xfUkFURV82TV9JTkRFWCwKLQlJV0xfUkFURV82TV9JTkRFWCwgSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsIElXTF9SQVRFXzlNX0lOREVYLAotCUlXTF9SQVRFXzEyTV9JTkRFWCwgSVdMX1JBVEVfMThNX0lOREVYLAotCUlXTF9SQVRFXzI0TV9JTkRFWCwgSVdMX1JBVEVfMzZNX0lOREVYLAotCUlXTF9SQVRFXzQ4TV9JTkRFWCwgSVdMX1JBVEVfNTRNX0lOREVYCi19OwotCi1zdGF0aWMgY29uc3QgdTggYW50X3RvZ2dsZV9sb29rdXBbXSA9IHsKLQkvKkFOVF9OT05FIC0+ICovIEFOVF9OT05FLAotCS8qQU5UX0EgICAgLT4gKi8gQU5UX0IsCi0JLypBTlRfQiAgICAtPiAqLyBBTlRfQywKLQkvKkFOVF9BQiAgIC0+ICovIEFOVF9CQywKLQkvKkFOVF9DICAgIC0+ICovIEFOVF9BLAotCS8qQU5UX0FDICAgLT4gKi8gQU5UX0FCLAotCS8qQU5UX0JDICAgLT4gKi8gQU5UX0FDLAotCS8qQU5UX0FCQyAgLT4gKi8gQU5UX0FCQywKLX07Ci0KLSNkZWZpbmUgSVdMX0RFQ0xBUkVfUkFURV9JTkZPKHIsIHMsIGlwLCBpbiwgcnAsIHJuLCBwcCwgbnApICAgIFwKLQlbSVdMX1JBVEVfIyNyIyNNX0lOREVYXSA9IHsgSVdMX1JBVEVfIyNyIyNNX1BMQ1AsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV9TSVNPXyMjcyMjTV9QTENQLCBcCi0JCQkJICAgIElXTF9SQVRFX01JTU8yXyMjcyMjTV9QTENQLFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lFRUUsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI2lwIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjaW4jI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNycCMjTV9JTkRFWCwgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI3JuIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjcHAjI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNucCMjTV9JTkRFWCB9Ci0KLS8qCi0gKiBQYXJhbWV0ZXIgb3JkZXI6Ci0gKiAgIHJhdGUsIGh0IHJhdGUsIHByZXYgcmF0ZSwgbmV4dCByYXRlLCBwcmV2IHRnZyByYXRlLCBuZXh0IHRnZyByYXRlCi0gKgotICogSWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBuZXh0IG9yIHByZXZpb3VzIHJhdGUgdGhlbiBJTlYgaXMgdXNlZCB3aGljaAotICogbWFwcyB0byBJV0xfUkFURV9JTlZBTElECi0gKgotICovCi1jb25zdCBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyBpd2xlZ2FjeV9yYXRlc1tJV0xfUkFURV9DT1VOVF0gPSB7Ci0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksICAgIC8qICAxbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyLCBJTlYsIDEsIDUsIDEsIDUsIDEsIDUpLCAgICAgICAgICAvKiAgMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNSwgSU5WLCAyLCA2LCAyLCAxMSwgMiwgMTEpLCAgICAgICAgLyo1LjVtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCBJTlYsIDksIDEyLCA5LCAxMiwgNSwgMTgpLCAgICAgIC8qIDExbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLCAgICAgICAgLyogIDZtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDYsIDExLCA2LCAxMSwgNSwgMTEpLCAgICAgICAvKiAgOW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTIsIDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwgICAvKiAxMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTgsIDE4LCAxMiwgMjQsIDEyLCAyNCwgMTEsIDI0KSwgICAvKiAxOG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMjQsIDI0LCAxOCwgMzYsIDE4LCAzNiwgMTgsIDM2KSwgICAvKiAyNG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMzYsIDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwgICAvKiAzNm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNDgsIDQ4LCAzNiwgNTQsIDM2LCA1NCwgMzYsIDU0KSwgICAvKiA0OG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNTQsIDU0LCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA1NG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNjAsIDYwLCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA2MG1icHMgKi8KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodTMyIHJhdGVfbl9mbGFncykKLXsKLQlpbnQgaWR4ID0gMDsKLQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV9NSU1PMl82TV9QTENQKQotCQkJaWR4ID0gaWR4IC0gSVdMX1JBVEVfTUlNTzJfNk1fUExDUDsKLQotCQlpZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJLyogc2tpcCA5TSBub3Qgc3VwcG9ydGVkIGluIGh0Ki8KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV85TV9JTkRFWCkKLQkJCWlkeCArPSAxOwotCQlpZiAoKGlkeCA+PSBJV0xfRklSU1RfT0ZETV9SQVRFKSAmJiAoaWR4IDw9IElXTF9MQVNUX09GRE1fUkFURSkpCi0JCQlyZXR1cm4gaWR4OwotCi0JLyogbGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGl3bGVnYWN5X3JhdGVzKTsgaWR4KyspCi0JCQlpZiAoaXdsZWdhY3lfcmF0ZXNbaWR4XS5wbGNwID09IChyYXRlX25fZmxhZ3MgJiAweEZGKSkKLQkJCQlyZXR1cm4gaWR4OwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19yYXRlX3NjYWxlX3BlcmZvcm0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKTsKLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiByYXRlX25fZmxhZ3MpOwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJCWJvb2wgZm9yY2Vfc2VhcmNoKTsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCk7Ci0jZWxzZQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHUzMiAqcmF0ZV9uX2ZsYWdzLCBpbnQgaW5kZXgpCi17fQotI2VuZGlmCi0KLS8qKgotICogVGhlIGZvbGxvd2luZyB0YWJsZXMgY29udGFpbiB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBtZXRyaWNzIGZvciBhbGwgcmF0ZXMKLSAqCi0gKgkxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA2MCBNQml0cwotICoKLSAqIHdoZXJlIGludmFsaWQgZW50cmllcyBhcmUgemVyb3MuCi0gKgotICogQ0NLIHJhdGVzIGFyZSBvbmx5IHZhbGlkIGluIGxlZ2FjeSB0YWJsZSBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gRwotICogKDIuNCBHSHopIGJhbmQuCi0gKi8KLQotc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbGVnYWN5W0lXTF9SQVRFX0NPVU5UXSA9IHsKLQk3LCAxMywgMzUsIDU4LCA0MCwgNTcsIDcyLCA5OCwgMTIxLCAxNTQsIDE3NywgMTg2LCAwCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9zaXNvMjBNSHpbNF1bSVdMX1JBVEVfQ09VTlRdID0gewotCXswLCAwLCAwLCAwLCA0MiwgMCwgIDc2LCAxMDIsIDEyNCwgMTU4LCAxODMsIDE5MywgMjAyfSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCA0NiwgMCwgIDgyLCAxMTAsIDEzMiwgMTY3LCAxOTIsIDIwMiwgMjEwfSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsIDQ4LCAwLCAgOTMsIDEzNSwgMTc2LCAyNTEsIDMxOSwgMzUxLCAzODF9LCAvKiBBR0cgKi8KLQl7MCwgMCwgMCwgMCwgNTMsIDAsIDEwMiwgMTQ5LCAxOTMsIDI3NSwgMzQ4LCAzODEsIDQxM30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X3Npc280ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsICA3NywgMCwgMTI3LCAxNjAsIDE4NCwgMjIwLCAyNDIsIDI1MCwgMjU3fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAgODMsIDAsIDEzNSwgMTY5LCAxOTMsIDIyOSwgMjUwLCAyNTcsIDI2NH0sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAgOTYsIDAsIDE4MiwgMjU5LCAzMjgsIDQ1MSwgNTUzLCA1OTgsIDY0MH0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxMDYsIDAsIDE5OSwgMjgyLCAzNTcsIDQ4NywgNTkzLCA2NDAsIDY4M30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6WzRdW0lXTF9SQVRFX0NPVU5UXSA9IHsKLQl7MCwgMCwgMCwgMCwgIDc0LCAwLCAxMjMsIDE1NSwgMTc5LCAyMTMsIDIzNSwgMjQzLCAyNTB9LCAvKiBOb3JtICovCi0JezAsIDAsIDAsIDAsICA4MSwgMCwgMTMxLCAxNjQsIDE4NywgMjIxLCAyNDIsIDI1MCwgMjU2fSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsICA5MiwgMCwgMTc1LCAyNTAsIDMxNywgNDM2LCA1MzQsIDU3OCwgNjE5fSwgLyogQUdHICovCi0JezAsIDAsIDAsIDAsIDEwMiwgMCwgMTkyLCAyNzMsIDM0NCwgNDcwLCA1NzMsIDYxOSwgNjYwfSwgLyogQUdHK1NHSSovCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9taW1vMl80ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsIDEyMywgMCwgMTgyLCAyMTQsIDIzNSwgMjY0LCAyNzksIDI4NSwgMjg5fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAxMzEsIDAsIDE5MSwgMjIyLCAyNDIsIDI3MCwgMjg0LCAyODksIDI5M30sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAxODAsIDAsIDMyNywgNDQ2LCA1NDUsIDcwOCwgODI4LCA4NzgsIDkyMn0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxOTcsIDAsIDM1NSwgNDgxLCA1ODQsIDc1MiwgODcyLCA5MjIsIDk2Nn0sIC8qIEFHRytTR0kgKi8KLX07Ci0KLS8qIG1icHMsIG1jcyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfcmF0ZV9tY3NfaW5mbyBpd2xfcmF0ZV9tY3NbSVdMX1JBVEVfQ09VTlRdID0gewotCXsgICIxIiwgIkJQU0sgRFNTUyJ9LAotCXsgICIyIiwgIlFQU0sgRFNTUyJ9LAotCXsiNS41IiwgIkJQU0sgQ0NLIn0sCi0JeyAiMTEiLCAiUVBTSyBDQ0sifSwKLQl7ICAiNiIsICJCUFNLIDEvMiJ9LAotCXsgICI5IiwgIkJQU0sgMS8yIn0sCi0JeyAiMTIiLCAiUVBTSyAxLzIifSwKLQl7ICIxOCIsICJRUFNLIDMvNCJ9LAotCXsgIjI0IiwgIjE2UUFNIDEvMiJ9LAotCXsgIjM2IiwgIjE2UUFNIDMvNCJ9LAotCXsgIjQ4IiwgIjY0UUFNIDIvMyJ9LAotCXsgIjU0IiwgIjY0UUFNIDMvNCJ9LAotCXsgIjYwIiwgIjY0UUFNIDUvNiJ9LAotfTsKLQotI2RlZmluZSBNQ1NfSU5ERVhfUEVSX1NUUkVBTQkoOCkKLQotc3RhdGljIGlubGluZSB1OCBpd2w0OTY1X3JzX2V4dHJhY3RfcmF0ZSh1MzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiAodTgpKHJhdGVfbl9mbGFncyAmIDB4RkYpOwotfQotCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdyhzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93KQotewotCXdpbmRvdy0+ZGF0YSA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPSAwOwotCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+Y291bnRlciA9IDA7Ci0Jd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+c3RhbXAgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHU4IHZhbGlkX2FudGVubmEsIHU4IGFudF90eXBlKQotewotCXJldHVybiAoYW50X3R5cGUgJiB2YWxpZF9hbnRlbm5hKSA9PSBhbnRfdHlwZTsKLX0KLQotLyoKLSAqCXJlbW92ZXMgdGhlIG9sZCBkYXRhIGZyb20gdGhlIHN0YXRpc3RpY3MuIEFsbCBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbgotICoJVElEX01BWF9USU1FX0RJRkYsIHdpbGwgYmUgZGVsZXRlZC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCwgdTMyIGN1cnJfdGltZSkKLXsKLQkvKiBUaGUgb2xkZXN0IGFnZSB3ZSB3YW50IHRvIGtlZXAgKi8KLQl1MzIgb2xkZXN0X3RpbWUgPSBjdXJyX3RpbWUgLSBUSURfTUFYX1RJTUVfRElGRjsKLQotCXdoaWxlICh0bC0+cXVldWVfY291bnQgJiYKLQkgICAgICAgKHRsLT50aW1lX3N0YW1wIDwgb2xkZXN0X3RpbWUpKSB7Ci0JCXRsLT50b3RhbCAtPSB0bC0+cGFja2V0X2NvdW50W3RsLT5oZWFkXTsKLQkJdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF0gPSAwOwotCQl0bC0+dGltZV9zdGFtcCArPSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCQl0bC0+cXVldWVfY291bnQtLTsKLQkJdGwtPmhlYWQrKzsKLQkJaWYgKHRsLT5oZWFkID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJCXRsLT5oZWFkID0gMDsKLQl9Ci19Ci0KLS8qCi0gKglpbmNyZW1lbnQgdHJhZmZpYyBsb2FkIHZhbHVlIGZvciB0aWQgYW5kIGFsc28gcmVtb3ZlCi0gKglhbnkgb2xkIHZhbHVlcyBpZiBwYXNzZWQgdGhlIGNlcnRhaW4gdGltZSBwZXJpb2QKLSAqLwotc3RhdGljIHU4IGl3bDQ5NjVfcnNfdGxfYWRkX3BhY2tldChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCi17Ci0JdTMyIGN1cnJfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7Ci0JdTMyIHRpbWVfZGlmZjsKLQlzMzIgaW5kZXg7Ci0Jc3RydWN0IGl3bF90cmFmZmljX2xvYWQgKnRsID0gTlVMTDsKLQl1OCB0aWQ7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0gZWxzZQotCQlyZXR1cm4gTUFYX1RJRF9DT1VOVDsKLQotCWlmICh1bmxpa2VseSh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKSkKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0KLQl0bCA9ICZscV9kYXRhLT5sb2FkW3RpZF07Ci0KLQljdXJyX3RpbWUgLT0gY3Vycl90aW1lICUgVElEX1JPVU5EX1ZBTFVFOwotCi0JLyogSGFwcGVucyBvbmx5IGZvciB0aGUgZmlyc3QgcGFja2V0LiBJbml0aWFsaXplIHRoZSBkYXRhICovCi0JaWYgKCEodGwtPnF1ZXVlX2NvdW50KSkgewotCQl0bC0+dG90YWwgPSAxOwotCQl0bC0+dGltZV9zdGFtcCA9IGN1cnJfdGltZTsKLQkJdGwtPnF1ZXVlX2NvdW50ID0gMTsKLQkJdGwtPmhlYWQgPSAwOwotCQl0bC0+cGFja2V0X2NvdW50WzBdID0gMTsKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0JfQotCi0JdGltZV9kaWZmID0gVElNRV9XUkFQX0FST1VORCh0bC0+dGltZV9zdGFtcCwgY3Vycl90aW1lKTsKLQlpbmRleCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7Ci0KLQkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCi0JLyogVElEX01BWF9USU1FX0RJRkYgKi8KLQlpZiAoaW5kZXggPj0gVElEX1FVRVVFX01BWF9TSVpFKQotCQlpd2w0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKLQotCWluZGV4ID0gKHRsLT5oZWFkICsgaW5kZXgpICUgVElEX1FVRVVFX01BWF9TSVpFOwotCXRsLT5wYWNrZXRfY291bnRbaW5kZXhdID0gdGwtPnBhY2tldF9jb3VudFtpbmRleF0gKyAxOwotCXRsLT50b3RhbCA9IHRsLT50b3RhbCArIDE7Ci0KLQlpZiAoKGluZGV4ICsgMSkgPiB0bC0+cXVldWVfY291bnQpCi0JCXRsLT5xdWV1ZV9jb3VudCA9IGluZGV4ICsgMTsKLQotCXJldHVybiB0aWQ7Ci19Ci0KLS8qCi0JZ2V0IHRoZSB0cmFmZmljIGxvYWQgdmFsdWUgZm9yIHRpZAotKi8KLXN0YXRpYyB1MzIgaXdsNDk2NV9yc190bF9nZXRfbG9hZChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwgdTggdGlkKQotewotCXUzMiBjdXJyX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwotCXUzMiB0aW1lX2RpZmY7Ci0JczMyIGluZGV4OwotCXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCA9IE5VTEw7Ci0KLQlpZiAodGlkID49IFRJRF9NQVhfTE9BRF9DT1VOVCkKLQkJcmV0dXJuIDA7Ci0KLQl0bCA9ICYobHFfZGF0YS0+bG9hZFt0aWRdKTsKLQotCWN1cnJfdGltZSAtPSBjdXJyX3RpbWUgJSBUSURfUk9VTkRfVkFMVUU7Ci0KLQlpZiAoISh0bC0+cXVldWVfY291bnQpKQotCQlyZXR1cm4gMDsKLQotCXRpbWVfZGlmZiA9IFRJTUVfV1JBUF9BUk9VTkQodGwtPnRpbWVfc3RhbXAsIGN1cnJfdGltZSk7Ci0JaW5kZXggPSB0aW1lX2RpZmYgLyBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCi0JLyogVGhlIGhpc3RvcnkgaXMgdG9vIGxvbmc6IHJlbW92ZSBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbiAqLwotCS8qIFRJRF9NQVhfVElNRV9ESUZGICovCi0JaWYgKGluZGV4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJaXdsNDk2NV9yc190bF9ybV9vbGRfc3RhdHModGwsIGN1cnJfdGltZSk7Ci0KLQlyZXR1cm4gdGwtPnRvdGFsOwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsIHU4IHRpZCwKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWludCByZXQgPSAtRUFHQUlOOwotCXUzMiBsb2FkOwotCi0JbG9hZCA9IGl3bDQ5NjVfcnNfdGxfZ2V0X2xvYWQobHFfZGF0YSwgdGlkKTsKLQotCWlmIChsb2FkID4gSVdMX0FHR19MT0FEX1RIUkVTSE9MRCkgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0YXJ0aW5nIFR4IGFnZzogU1RBOiAlcE0gdGlkOiAlZFxuIiwKLQkJCQlzdGEtPmFkZHIsIHRpZCk7Ci0JCXJldCA9IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCA1MDAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkvKgotCQkJICogZHJpdmVyIGFuZCBtYWM4MDIxMSBpcyBvdXQgb2Ygc3luYwotCQkJICogdGhpcyBtaWdodCBiZSBjYXVzZSBieSByZWxvYWRpbmcgZmlybXdhcmUKLQkJCSAqIHN0b3AgdGhlIHR4IGJhIHNlc3Npb24gaGVyZQotCQkJICovCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsIHN0YXJ0IFR4IGFnZyBvbiB0aWQ6ICVkXG4iLAotCQkJCXRpZCk7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkFnZ3JlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciB0aWQgJWQgIgotCQkJImJlY2F1c2UgbG9hZCA9ICV1XG4iLCB0aWQsIGxvYWQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3RsX3R1cm5fb25fYWdnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdGlkLAotCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCi0JCWl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChwcml2LCBscV9kYXRhLCB0aWQsIHN0YSk7Ci0JZWxzZQotCQlJV0xfRVJSKHByaXYsICJ0aWQgZXhjZWVkcyBtYXggbG9hZCBjb3VudDogJWQvJWRcbiIsCi0JCQl0aWQsIFRJRF9NQVhfTE9BRF9DT1VOVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2l3bDQ5NjVfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FfTVNLKSArCi0JICAgICAgICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9CX01TSykgKwotCSAgICAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQ19NU0spOwotfQotCi0vKgotICogU3RhdGljIGZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBmcm9tIGFuIGl3bF9zY2FsZV90YmxfaW5mbwotICogdGhhdCB3cmFwcyBhIE5VTEwgcG9pbnRlciBjaGVjawotICovCi1zdGF0aWMgczMyCi1pd2w0OTY1X2dldF9leHBlY3RlZF90cHQoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgcnNfaW5kZXgpCi17Ci0JaWYgKHRibC0+ZXhwZWN0ZWRfdHB0KQotCQlyZXR1cm4gdGJsLT5leHBlY3RlZF90cHRbcnNfaW5kZXhdOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhIC0gVXBkYXRlIHRoZSBzdWNjZXNzL2ZhaWx1cmUgc2xpZGluZyB3aW5kb3cKLSAqCi0gKiBXZSBrZWVwIGEgc2xpZGluZyB3aW5kb3cgb2YgdGhlIGxhc3QgNjIgcGFja2V0cyB0cmFuc21pdHRlZAotICogYXQgdGhpcyByYXRlLiAgd2luZG93LT5kYXRhIGNvbnRhaW5zIHRoZSBiaXRtYXNrIG9mIHN1Y2Nlc3NmdWwKLSAqIHBhY2tldHMuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJICAgICAgaW50IHNjYWxlX2luZGV4LCBpbnQgYXR0ZW1wdHMsIGludCBzdWNjZXNzZXMpCi17Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7Ci0Jc3RhdGljIGNvbnN0IHU2NCBtYXNrID0gKCgodTY0KTEpIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpOwotCXMzMiBmYWlsX2NvdW50LCB0cHQ7Ci0KLQlpZiAoc2NhbGVfaW5kZXggPCAwIHx8IHNjYWxlX2luZGV4ID49IElXTF9SQVRFX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNlbGVjdCB3aW5kb3cgZm9yIGN1cnJlbnQgdHggYml0IHJhdGUgKi8KLQl3aW5kb3cgPSAmKHRibC0+d2luW3NjYWxlX2luZGV4XSk7Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCAqLwotCXRwdCA9IGl3bDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdCh0YmwsIHNjYWxlX2luZGV4KTsKLQotCS8qCi0JICogS2VlcCB0cmFjayBvZiBvbmx5IHRoZSBsYXRlc3QgNjIgdHggZnJhbWUgYXR0ZW1wdHMgaW4gdGhpcyByYXRlJ3MKLQkgKiBoaXN0b3J5IHdpbmRvdzsgYW55dGhpbmcgb2xkZXIgaXNuJ3QgcmVhbGx5IHJlbGV2YW50IGFueSBtb3JlLgotCSAqIElmIHdlIGhhdmUgZmlsbGVkIHVwIHRoZSBzbGlkaW5nIHdpbmRvdywgZHJvcCB0aGUgb2xkZXN0IGF0dGVtcHQ7Ci0JICogaWYgdGhlIG9sZGVzdCBhdHRlbXB0IChoaWdoZXN0IGJpdCBpbiBiaXRtYXApIHNob3dzICJzdWNjZXNzIiwKLQkgKiBzdWJ0cmFjdCAiMSIgZnJvbSB0aGUgc3VjY2VzcyBjb3VudGVyICh0aGlzIGlzIHRoZSBtYWluIHJlYXNvbgotCSAqIHdlIGtlZXAgdGhlc2UgYml0bWFwcyEpLgotCSAqLwotCXdoaWxlIChhdHRlbXB0cyA+IDApIHsKLQkJaWYgKHdpbmRvdy0+Y291bnRlciA+PSBJV0xfUkFURV9NQVhfV0lORE9XKSB7Ci0KLQkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLwotCQkJd2luZG93LT5jb3VudGVyID0gSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDE7Ci0KLQkJCWlmICh3aW5kb3ctPmRhdGEgJiBtYXNrKSB7Ci0JCQkJd2luZG93LT5kYXRhICY9IH5tYXNrOwotCQkJCXdpbmRvdy0+c3VjY2Vzc19jb3VudGVyLS07Ci0JCQl9Ci0JCX0KLQotCQkvKiBJbmNyZW1lbnQgZnJhbWVzLWF0dGVtcHRlZCBjb3VudGVyICovCi0JCXdpbmRvdy0+Y291bnRlcisrOwotCi0JCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgdG8gdGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSAqLwotCQl3aW5kb3ctPmRhdGEgPDw9IDE7Ci0KLQkJLyogTWFyayB0aGUgbW9zdCByZWNlbnQgI3N1Y2Nlc3NlcyBhdHRlbXB0cyBhcyBzdWNjZXNzZnVsICovCi0JCWlmIChzdWNjZXNzZXMgPiAwKSB7Ci0JCQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcisrOwotCQkJd2luZG93LT5kYXRhIHw9IDB4MTsKLQkJCXN1Y2Nlc3Nlcy0tOwotCQl9Ci0KLQkJYXR0ZW1wdHMtLTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgY3VycmVudCBzdWNjZXNzIHJhdGlvLCBhdm9pZCBkaXZpZGUtYnktMCEgKi8KLQlpZiAod2luZG93LT5jb3VudGVyID4gMCkKLQkJd2luZG93LT5zdWNjZXNzX3JhdGlvID0gMTI4ICogKDEwMCAqIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyKQotCQkJCQkvIHdpbmRvdy0+Y291bnRlcjsKLQllbHNlCi0JCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCi0JLyogQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhyb3VnaHB1dCwgaWYgd2UgaGF2ZSBlbm91Z2ggaGlzdG9yeS4gKi8KLQlpZiAoKGZhaWxfY291bnQgPj0gSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgpIHx8Ci0JICAgICh3aW5kb3ctPnN1Y2Nlc3NfY291bnRlciA+PSBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCkpCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSAod2luZG93LT5zdWNjZXNzX3JhdGlvICogdHB0ICsgNjQpIC8gMTI4OwotCWVsc2UKLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JLyogVGFnIHRoaXMgd2luZG93IGFzIGhhdmluZyBiZWVuIHVwZGF0ZWQgKi8KLQl3aW5kb3ctPnN0YW1wID0gamlmZmllczsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRmlsbCB1Q29kZSBBUEkgcmF0ZV9uX2ZsYWdzIGZpZWxkLCBiYXNlZCBvbiAic2VhcmNoIiBvciAiYWN0aXZlIiB0YWJsZS4KLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCQkgaW50IGluZGV4LCB1OCB1c2VfZ3JlZW4pCi17Ci0JdTMyIHJhdGVfbl9mbGFncyA9IDA7Ci0KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJcmF0ZV9uX2ZsYWdzID0gaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3A7Ci0JCWlmIChpbmRleCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaW5kZXggPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCX0gZWxzZSBpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAoaW5kZXggPiBJV0xfTEFTVF9PRkRNX1JBVEUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgSFQgcmF0ZSBpbmRleCAlZFxuIiwgaW5kZXgpOwotCQkJaW5kZXggPSBJV0xfTEFTVF9PRkRNX1JBVEU7Ci0JCX0KLQkJcmF0ZV9uX2ZsYWdzID0gUkFURV9NQ1NfSFRfTVNLOwotCi0JCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlyYXRlX25fZmxhZ3MgfD0JaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3Bfc2lzbzsKLQkJZWxzZQotCQkJcmF0ZV9uX2ZsYWdzIHw9CWl3bGVnYWN5X3JhdGVzW2luZGV4XS5wbGNwX21pbW8yOwotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgdGJsLT5scV90eXBlICVkXG4iLCB0YmwtPmxxX3R5cGUpOwotCX0KLQotCXJhdGVfbl9mbGFncyB8PSAoKHRibC0+YW50X3R5cGUgPDwgUkFURV9NQ1NfQU5UX1BPUykgJgotCQkJCQkJICAgICBSQVRFX01DU19BTlRfQUJDX01TSyk7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAodGJsLT5pc19odDQwKSB7Ci0JCQlpZiAodGJsLT5pc19kdXApCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0RVUF9NU0s7Ci0JCQllbHNlCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0hUNDBfTVNLOwotCQl9Ci0JCWlmICh0YmwtPmlzX1NHSSkKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19TR0lfTVNLOwotCi0JCWlmICh1c2VfZ3JlZW4pIHsKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19HRl9NU0s7Ci0JCQlpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpICYmIHRibC0+aXNfU0dJKSB7Ci0JCQkJcmF0ZV9uX2ZsYWdzICY9IH5SQVRFX01DU19TR0lfTVNLOwotCQkJCUlXTF9FUlIocHJpdiwgIkdGIHdhcyBzZXQgd2l0aCBTR0k6U0lTT1xuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJhdGVfbl9mbGFnczsKLX0KLQotLyoKLSAqIEludGVycHJldCB1Q29kZSBBUEkncyByYXRlX25fZmxhZ3MgZm9ybWF0LAotICogZmlsbCAic2VhcmNoIiBvciAiYWN0aXZlIiB0eCBtb2RlIHRhYmxlLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKGNvbnN0IHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCSAgICBpbnQgKnJhdGVfaWR4KQotewotCXUzMiBhbnRfbXNrID0gKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKLQl1OCBpd2w0OTY1X251bV9vZl9hbnQgPSBpd2w0OTY1X2dldF9pd2w0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHJhdGVfbl9mbGFncyk7Ci0JdTggbWNzOwotCi0JbWVtc2V0KHRibCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pKTsKLQkqcmF0ZV9pZHggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeChyYXRlX25fZmxhZ3MpOwotCi0JaWYgKCpyYXRlX2lkeCAgPT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkqcmF0ZV9pZHggPSAtMTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRibC0+aXNfU0dJID0gMDsJLyogZGVmYXVsdCBsZWdhY3kgc2V0dXAgKi8KLQl0YmwtPmlzX2h0NDAgPSAwOwotCXRibC0+aXNfZHVwID0gMDsKLQl0YmwtPmFudF90eXBlID0gKGFudF9tc2sgPj4gUkFURV9NQ1NfQU5UX1BPUyk7Ci0JdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQotCS8qIGxlZ2FjeSByYXRlIGZvcm1hdCAqLwotCWlmICghKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykpIHsKLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKSB7Ci0JCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCQllbHNlCi0JCQkJdGJsLT5scV90eXBlID0gTFFfRzsKLQkJfQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JfSBlbHNlIHsKLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX1NHSV9NU0spCi0JCQl0YmwtPmlzX1NHSSA9IDE7Ci0KLQkJaWYgKChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykgfHwKLQkJICAgIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19EVVBfTVNLKSkKLQkJCXRibC0+aXNfaHQ0MCA9IDE7Ci0KLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQl0YmwtPmlzX2R1cCA9IDE7Ci0KLQkJbWNzID0gaXdsNDk2NV9yc19leHRyYWN0X3JhdGUocmF0ZV9uX2ZsYWdzKTsKLQotCQkvKiBTSVNPICovCi0JCWlmIChtY3MgPD0gSVdMX1JBVEVfU0lTT182ME1fUExDUCkgewotCQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX1NJU087IC8qZWxzZSBOT05FKi8KLQkJLyogTUlNTzIgKi8KLQkJfSBlbHNlIHsKLQkJCWlmIChpd2w0OTY1X251bV9vZl9hbnQgPT0gMikKLQkJCQl0YmwtPmxxX3R5cGUgPSBMUV9NSU1PMjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogc3dpdGNoIHRvIGFub3RoZXIgYW50ZW5uYS9hbnRlbm5hcyBhbmQgcmV0dXJuIDEgKi8KLS8qIGlmIG5vIG90aGVyIHZhbGlkIGFudGVubmEgZm91bmQsIHJldHVybiAwICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodTMyIHZhbGlkX2FudCwgdTMyICpyYXRlX25fZmxhZ3MsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKLXsKLQl1OCBuZXdfYW50X3R5cGU7Ci0KLQlpZiAoIXRibC0+YW50X3R5cGUgfHwgdGJsLT5hbnRfdHlwZSA+IEFOVF9BQkMpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpd2w0OTY1X3JzX2lzX3ZhbGlkX2FudCh2YWxpZF9hbnQsIHRibC0+YW50X3R5cGUpKQotCQlyZXR1cm4gMDsKLQotCW5ld19hbnRfdHlwZSA9IGFudF90b2dnbGVfbG9va3VwW3RibC0+YW50X3R5cGVdOwotCi0Jd2hpbGUgKChuZXdfYW50X3R5cGUgIT0gdGJsLT5hbnRfdHlwZSkgJiYKLQkgICAgICAgIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgbmV3X2FudF90eXBlKSkKLQkJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbbmV3X2FudF90eXBlXTsKLQotCWlmIChuZXdfYW50X3R5cGUgPT0gdGJsLT5hbnRfdHlwZSkKLQkJcmV0dXJuIDA7Ci0KLQl0YmwtPmFudF90eXBlID0gbmV3X2FudF90eXBlOwotCSpyYXRlX25fZmxhZ3MgJj0gflJBVEVfTUNTX0FOVF9BQkNfTVNLOwotCSpyYXRlX25fZmxhZ3MgfD0gbmV3X2FudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogR3JlZW4tZmllbGQgbW9kZSBpcyB2YWxpZCBpZiB0aGUgc3RhdGlvbiBzdXBwb3J0cyBpdCBhbmQKLSAqIHRoZXJlIGFyZSBubyBub24tR0Ygc3RhdGlvbnMgcHJlc2VudCBpbiB0aGUgQlNTLgotICovCi1zdGF0aWMgYm9vbCBpd2w0OTY1X3JzX3VzZV9ncmVlbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlyZXR1cm4gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgJiYKLQkJIShjdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzIC0gZ2V0IHRoZSBhdmFpbGFibGUgcmF0ZXMKLSAqCi0gKiBpZiBtYW5hZ2VtZW50IGZyYW1lIG9yIGJyb2FkY2FzdCBmcmFtZSBvbmx5IHJldHVybgotICogYmFzaWMgYXZhaWxhYmxlIHJhdGVzLgotICoKLSAqLwotc3RhdGljIHUxNiBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJICBlbnVtIGl3bF90YWJsZV90eXBlIHJhdGVfdHlwZSkKLXsKLQlpZiAoaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKLQkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlOwotCX0gZWxzZSB7Ci0JCWlmIChpc19zaXNvKHJhdGVfdHlwZSkpCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOwotCQllbHNlCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYKLWl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpbmRleCwgdTE2IHJhdGVfbWFzaywKLQkJCQlpbnQgcmF0ZV90eXBlKQotewotCXU4IGhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCXU4IGxvdyA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0KLQkvKiA4MDIuMTFBIG9yIGh0IHdhbGtzIHRvIHRoZSBuZXh0IGxpdGVyYWwgYWRqYWNlbnQgcmF0ZSBpbgotCSAqIHRoZSByYXRlIHRhYmxlICovCi0JaWYgKGlzX2FfYmFuZChyYXRlX3R5cGUpIHx8ICFpc19sZWdhY3kocmF0ZV90eXBlKSkgewotCQlpbnQgaTsKLQkJdTMyIG1hc2s7Ci0KLQkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KLQkJaSA9IGluZGV4IC0gMTsKLQkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWxvdyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCArIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKywgbWFzayA8PD0gMSkgewotCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKLQkJCQloaWdoID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLQl9Ci0KLQlsb3cgPSBpbmRleDsKLQl3aGlsZSAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJbG93ID0gaXdsZWdhY3lfcmF0ZXNbbG93XS5wcmV2X3JzOwotCQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlicmVhazsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGxvdykpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKLQl9Ci0KLQloaWdoID0gaW5kZXg7Ci0Jd2hpbGUgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQloaWdoID0gaXdsZWdhY3lfcmF0ZXNbaGlnaF0ubmV4dF9yczsKLQkJaWYgKGhpZ2ggPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgaGlnaCkpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOwotCX0KLQotCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLX0KLQotc3RhdGljIHUzMiBpd2w0OTY1X3JzX2dldF9sb3dlcl9yYXRlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCSAgICAgdTggc2NhbGVfaW5kZXgsIHU4IGh0X3Bvc3NpYmxlKQotewotCXMzMiBsb3c7Ci0JdTE2IHJhdGVfbWFzazsKLQl1MTYgaGlnaF9sb3c7Ci0JdTggc3dpdGNoX3RvX2xlZ2FjeSA9IDA7Ci0JdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGxxX3N0YS0+ZHJ2OwotCi0JLyogY2hlY2sgaWYgd2UgbmVlZCB0byBzd2l0Y2ggZnJvbSBIVCB0byBsZWdhY3kgcmF0ZXMuCi0JICogYXNzdW1wdGlvbiBpcyB0aGF0IG1hbmRhdG9yeSByYXRlcyAoMU1icHMgb3IgNk1icHMpCi0JICogYXJlIGFsd2F5cyBzdXBwb3J0ZWQgKHNwZWMgZGVtYW5kKSAqLwotCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkgJiYgKCFodF9wb3NzaWJsZSB8fCAhc2NhbGVfaW5kZXgpKSB7Ci0JCXN3aXRjaF90b19sZWdhY3kgPSAxOwotCQlzY2FsZV9pbmRleCA9IHJzX2h0X3RvX2xlZ2FjeVtzY2FsZV9pbmRleF07Ci0JCWlmIChscV9zdGEtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCWVsc2UKLQkJCXRibC0+bHFfdHlwZSA9IExRX0c7Ci0KLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmwtPmFudF90eXBlKSA+IDEpCi0JCQl0YmwtPmFudF90eXBlID0KLQkJCQlpd2w0OTY1X2ZpcnN0X2FudGVubmEocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7Ci0KLQkJdGJsLT5pc19odDQwID0gMDsKLQkJdGJsLT5pc19TR0kgPSAwOwotCQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQl9Ci0KLQlyYXRlX21hc2sgPSBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBOVUxMLCB0YmwtPmxxX3R5cGUpOwotCi0JLyogTWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9tYXNrICA9ICh1MTYpKHJhdGVfbWFzayAmCi0JCQkgICAobHFfc3RhLT5zdXBwX3JhdGVzIDw8IElXTF9GSVJTVF9PRkRNX1JBVEUpKTsKLQkJZWxzZQotCQkJcmF0ZV9tYXNrID0gKHUxNikocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKLQl9Ci0KLQkvKiBJZiB3ZSBzd2l0Y2hlZCBmcm9tIEhUIHRvIGxlZ2FjeSwgY2hlY2sgY3VycmVudCByYXRlICovCi0JaWYgKHN3aXRjaF90b19sZWdhY3kgJiYgKHJhdGVfbWFzayAmICgxIDw8IHNjYWxlX2luZGV4KSkpIHsKLQkJbG93ID0gc2NhbGVfaW5kZXg7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShscV9zdGEtPmRydiwKLQkJCQkJc2NhbGVfaW5kZXgsIHJhdGVfbWFzaywKLQkJCQkJdGJsLT5scV90eXBlKTsKLQlsb3cgPSBoaWdoX2xvdyAmIDB4ZmY7Ci0KLQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvdyA9IHNjYWxlX2luZGV4OwotCi1vdXQ6Ci0JcmV0dXJuIGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGxxX3N0YS0+ZHJ2LCB0YmwsIGxvdywgaXNfZ3JlZW4pOwotfQotCi0vKgotICogU2ltcGxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHJhdGUgc2NhbGUgdGFibGUgdHlwZXMKLSAqLwotc3RhdGljIGJvb2wgaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqYSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpiKQotewotCXJldHVybiAoYS0+bHFfdHlwZSA9PSBiLT5scV90eXBlKSAmJiAoYS0+YW50X3R5cGUgPT0gYi0+YW50X3R5cGUpICYmCi0JCShhLT5pc19TR0kgPT0gYi0+aXNfU0dJKTsKLX0KLQotLyoKLSAqIG1hYzgwMjExIHNlbmRzIHVzIFR4IHN0YXR1cwotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc190eF9zdGF0dXModm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBsZWdhY3lfc3VjY2VzczsKLQlpbnQgcmV0cmllczsKLQlpbnQgcnNfaW5kZXgsIG1hY19pbmRleCwgaTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICp0YWJsZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCWVudW0gbWFjODAyMTFfcmF0ZV9jb250cm9sX2ZsYWdzIG1hY19mbGFnczsKLQl1MzIgdHhfcmF0ZTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKmN1cnJfdGJsLCAqb3RoZXJfdGJsLCAqdG1wX3RibDsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwKLQkJImdldCBmcmFtZSBhY2sgcmVzcG9uc2UsIHVwZGF0ZSByYXRlIHNjYWxlIHdpbmRvd1xuIik7Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmICghbHFfc3RhKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJTdGF0aW9uIHJhdGUgc2NhbGluZyBub3QgY3JlYXRlZCB5ZXQuXG4iKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoIWxxX3N0YS0+ZHJ2KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpIHx8Ci0JICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spCi0JCXJldHVybjsKLQotCS8qIFRoaXMgcGFja2V0IHdhcyBhZ2dyZWdhdGVkIGJ1dCBkb2Vzbid0IGNhcnJ5IHN0YXR1cyBpbmZvICovCi0JaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCi0JICAgICEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkpCi0JCXJldHVybjsKLQotCS8qCi0JICogSWdub3JlIHRoaXMgVHggZnJhbWUgcmVzcG9uc2UgaWYgaXRzIGluaXRpYWwgcmF0ZSBkb2Vzbid0IG1hdGNoCi0JICogdGhhdCBvZiBsYXRlc3QgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGVyZSBtYXkgYmUgc3RyYWdnbGVycwotCSAqIGZyb20gYSBwcmV2aW91cyBMaW5rIFF1YWxpdHkgY29tbWFuZCwgYnV0IHdlJ3JlIG5vIGxvbmdlciBpbnRlcmVzdGVkCi0JICogaW4gdGhvc2U7IHRoZXkncmUgZWl0aGVyIGZyb20gdGhlICJhY3RpdmUiIG1vZGUgd2hpbGUgd2UncmUgdHJ5aW5nCi0JICogdG8gY2hlY2sgInNlYXJjaCIgbW9kZSwgb3IgYSBwcmlvciAic2VhcmNoIiBtb2RlIGFmdGVyIHdlJ3ZlIG1vdmVkCi0JICogdG8gYSBuZXcgInNlYXJjaCIgbW9kZSAod2hpY2ggbWlnaHQgYmVjb21lIHRoZSBuZXcgImFjdGl2ZSIgbW9kZSkuCi0JICovCi0JdGFibGUgPSAmbHFfc3RhLT5scTsKLQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7Ci0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwKLQkJCSBwcml2LT5iYW5kLCAmdGJsX3R5cGUsICZyc19pbmRleCk7Ci0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcnNfaW5kZXggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQltYWNfZmxhZ3MgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3M7Ci0JbWFjX2luZGV4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKLQkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCi0JaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJbWFjX2luZGV4ICY9IFJBVEVfTUNTX0NPREVfTVNLOwkvKiBSZW1vdmUgIyBvZiBzdHJlYW1zICovCi0JCWlmIChtYWNfaW5kZXggPj0gKElXTF9SQVRFXzlNX0lOREVYIC0gSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQltYWNfaW5kZXgrKzsKLQkJLyoKLQkJICogbWFjODAyMTEgSFQgaW5kZXggaXMgYWx3YXlzIHplcm8taW5kZXhlZDsgd2UgbmVlZCB0byBtb3ZlCi0JCSAqIEhUIE9GRE0gcmF0ZXMgYWZ0ZXIgQ0NLIHJhdGVzIGluIDIuNCBHSHogYmFuZAotCQkgKi8KLQkJaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCW1hY19pbmRleCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCX0KLQkvKiBIZXJlIHdlIGFjdHVhbGx5IGNvbXBhcmUgdGhpcyByYXRlIHRvIHRoZSBsYXRlc3QgTFEgY29tbWFuZCAqLwotCWlmICgobWFjX2luZGV4IDwgMCkgfHwKLQkgICAgKHRibF90eXBlLmlzX1NHSSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkgfHwKLQkgICAgKHRibF90eXBlLmlzX2h0NDAgIT0KLQkJCSEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpKSB8fAotCSAgICAodGJsX3R5cGUuaXNfZHVwICE9Ci0JCQkhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEpKSB8fAotCSAgICAodGJsX3R5cGUuYW50X3R5cGUgIT0gaW5mby0+YW50ZW5uYV9zZWxfdHgpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfSFRfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfR0ZfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSkgfHwKLQkgICAgKHJzX2luZGV4ICE9IG1hY19pbmRleCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsCi0JCQkgbWFjX2luZGV4LCByc19pbmRleCwgdHhfcmF0ZSk7Ci0JCS8qCi0JCSAqIFNpbmNlIHJhdGVzIG1pcy1tYXRjaCwgdGhlIGxhc3QgTFEgY29tbWFuZCBtYXkgaGF2ZSBmYWlsZWQuCi0JCSAqIEFmdGVyIElXTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aAotCQkgKiAuLi4gZHJpdmVyLgotCQkgKi8KLQkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyKys7Ci0JCWlmIChscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPiBJV0xfTUlTU0VEX1JBVEVfTUFYKSB7Ci0JCQlscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPSAwOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLAotCQkJCQkJCUNNRF9BU1lOQywgZmFsc2UpOwotCQl9Ci0JCS8qIFJlZ2FyZGxlc3MsIGlnbm9yZSB0aGlzIHN0YXR1cyBpbmZvIGZvciBvdXRkYXRlZCByYXRlICovCi0JCXJldHVybjsKLQl9IGVsc2UKLQkJLyogUmF0ZSBkaWQgbWF0Y2gsIHNvIHJlc2V0IHRoZSBtaXNzZWRfcmF0ZV9jb3VudGVyICovCi0JCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7Ci0KLQkvKiBGaWd1cmUgb3V0IGlmIHJhdGUgc2NhbGUgYWxnb3JpdGhtIGlzIGluIGFjdGl2ZSBvciBzZWFyY2ggdGFibGUgKi8KLQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCSYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pKSkgewotCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JfSBlbHNlIGlmIChpd2w0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcygmdGJsX3R5cGUsCi0JCQkJJmxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSkpIHsKLQkJY3Vycl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCW90aGVyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkiTmVpdGhlciBhY3RpdmUgbm9yIHNlYXJjaCBtYXRjaGVzIHR4IHJhdGVcbiIpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJhY3RpdmUtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwKLQkJCXRtcF90YmwtPmxxX3R5cGUsIHRtcF90YmwtPmFudF90eXBlLCB0bXBfdGJsLT5pc19TR0kpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAic2VhcmNoLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsCi0JCQl0bXBfdGJsLT5scV90eXBlLCB0bXBfdGJsLT5hbnRfdHlwZSwgdG1wX3RibC0+aXNfU0dJKTsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImFjdHVhbC0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLAotCQkJdGJsX3R5cGUubHFfdHlwZSwgdGJsX3R5cGUuYW50X3R5cGUsIHRibF90eXBlLmlzX1NHSSk7Ci0JCS8qCi0JCSAqIG5vIG1hdGNoaW5nIHRhYmxlIGZvdW5kLCBsZXQncyBieS1wYXNzIHRoZSBkYXRhIGNvbGxlY3Rpb24KLQkJICogYW5kIGNvbnRpbnVlIHRvIHBlcmZvcm0gcmF0ZSBzY2FsZSB0byBmaW5kIHRoZSByYXRlIHRhYmxlCi0JCSAqLwotCQlpd2w0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCB0cnVlKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogVXBkYXRpbmcgdGhlIGZyYW1lIGhpc3RvcnkgZGVwZW5kcyBvbiB3aGV0aGVyIHBhY2tldHMgd2VyZQotCSAqIGFnZ3JlZ2F0ZWQuCi0JICoKLQkgKiBGb3IgYWdncmVnYXRpb24sIGFsbCBwYWNrZXRzIHdlcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUgcmF0ZSwgdGhlCi0JICogZmlyc3QgaW5kZXggaW50byByYXRlIHNjYWxlIHRhYmxlLgotCSAqLwotCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSB7Ci0JCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzKTsKLQkJaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgcHJpdi0+YmFuZCwgJnRibF90eXBlLAotCQkJCSZyc19pbmRleCk7Ci0JCWl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByc19pbmRleCwKLQkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuLAotCQkJCSAgIGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuKTsKLQotCQkvKiBVcGRhdGUgc3VjY2Vzcy9mYWlsIGNvdW50cyBpZiBub3Qgc2VhcmNoaW5nIGZvciBuZXcgbW9kZSAqLwotCQlpZiAobHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzICs9IGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuOwotCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgKz0gKGluZm8tPnN0YXR1cy5hbXBkdV9sZW4gLQotCQkJCQlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7Ci0JCX0KLQl9IGVsc2UgewotCS8qCi0JICogRm9yIGxlZ2FjeSwgdXBkYXRlIGZyYW1lIGhpc3Rvcnkgd2l0aCBmb3IgZWFjaCBUeCByZXRyeS4KLQkgKi8KLQkJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCAtIDE7Ci0JCS8qIEhXIGRvZXNuJ3Qgc2VuZCBtb3JlIHRoYW4gMTUgcmV0cmllcyAqLwotCQlyZXRyaWVzID0gbWluKHJldHJpZXMsIDE1KTsKLQotCQkvKiBUaGUgbGFzdCB0cmFuc21pc3Npb24gbWF5IGhhdmUgYmVlbiBzdWNjZXNzZnVsICovCi0JCWxlZ2FjeV9zdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOwotCQkvKiBDb2xsZWN0IGRhdGEgZm9yIGVhY2ggcmF0ZSB1c2VkIGR1cmluZyBmYWlsZWQgVFggYXR0ZW1wdHMgKi8KLQkJZm9yIChpID0gMDsgaSA8PSByZXRyaWVzOyArK2kpIHsKLQkJCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKTsKLQkJCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIHByaXYtPmJhbmQsCi0JCQkJCSZ0YmxfdHlwZSwgJnJzX2luZGV4KTsKLQkJCS8qCi0JCQkgKiBPbmx5IGNvbGxlY3Qgc3RhdHMgaWYgcmV0cmllZCByYXRlIGlzIGluIHRoZSBzYW1lIFJTCi0JCQkgKiB0YWJsZSBhcyBhY3RpdmUvc2VhcmNoLgotCQkJICovCi0JCQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLCBjdXJyX3RibCkpCi0JCQkJdG1wX3RibCA9IGN1cnJfdGJsOwotCQkJZWxzZSBpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCQkJCQkgb3RoZXJfdGJsKSkKLQkJCQl0bXBfdGJsID0gb3RoZXJfdGJsOwotCQkJZWxzZQotCQkJCWNvbnRpbnVlOwotCQkJaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEodG1wX3RibCwgcnNfaW5kZXgsIDEsCi0JCQkJCSAgIGkgPCByZXRyaWVzID8gMCA6IGxlZ2FjeV9zdWNjZXNzKTsKLQkJfQotCi0JCS8qIFVwZGF0ZSBzdWNjZXNzL2ZhaWwgY291bnRzIGlmIG5vdCBzZWFyY2hpbmcgZm9yIG5ldyBtb2RlICovCi0JCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgKz0gbGVnYWN5X3N1Y2Nlc3M7Ci0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCArPSByZXRyaWVzICsgKDEgLSBsZWdhY3lfc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0JLyogVGhlIGxhc3QgVFggcmF0ZSBpcyBjYWNoZWQgaW4gbHFfc3RhOyBpdCdzIHNldCBpbiBpZi9lbHNlIGFib3ZlICovCi0JbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyA9IHR4X3JhdGU7Ci1kb25lOgotCS8qIFNlZSBpZiB0aGVyZSdzIGEgYmV0dGVyIHJhdGUgb3IgbW9kdWxhdGlvbiBtb2RlIHRvIHRyeS4gKi8KLQlpZiAoc3RhICYmIHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCi0JCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHByaXYsIHNrYiwgc3RhLCBscV9zdGEpOwotfQotCi0vKgotICogQmVnaW4gYSBwZXJpb2Qgb2Ygc3RheWluZyB3aXRoIGEgc2VsZWN0ZWQgbW9kdWxhdGlvbiBtb2RlLgotICogU2V0ICJzdGF5X2luX3RibCIgZmxhZyB0byBwcmV2ZW50IGFueSBtb2RlIHN3aXRjaGVzLgotICogU2V0IGZyYW1lIHR4IHN1Y2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBsZWdhY3kgdnMuIGhpZ2gtdGhyb3VnaHB1dCwKLSAqIGFuZCByZXNldCBvdmVyYWxsIChzcGFubmluZyBhbGwgcmF0ZXMpIHR4IHN1Y2Nlc3MgaGlzdG9yeSBzdGF0aXN0aWNzLgotICogVGhlc2UgY29udHJvbCBob3cgbG9uZyB3ZSBzdGF5IHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlIGJlZm9yZQotICogc2VhcmNoaW5nIGZvciBhIG5ldyBtb2RlLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaXNfbGVnYWN5LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCUlXTF9ERUJVR19SQVRFKHByaXYsICJ3ZSBhcmUgc3RheWluZyBpbiB0aGUgc2FtZSB0YWJsZVxuIik7Ci0JbHFfc3RhLT5zdGF5X2luX3RibCA9IDE7CS8qIG9ubHkgcGxhY2UgdGhpcyBnZXRzIHNldCAqLwotCWlmIChpc19sZWdhY3kpIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9MRUdBQ1lfVEFCTEVfQ09VTlQ7Ci0JCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJV0xfTEVHQUNZX0ZBSUxVUkVfTElNSVQ7Ci0JCWxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQgPSBJV0xfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfSBlbHNlIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9UQUJMRV9DT1VOVDsKLQkJbHFfc3RhLT5tYXhfZmFpbHVyZV9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9GQUlMVVJFX0xJTUlUOwotCQlscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0ID0gSVdMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfQotCWxxX3N0YS0+dGFibGVfY291bnQgPSAwOwotCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPSAwOwotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSBqaWZmaWVzOwotCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotfQotCi0vKgotICogRmluZCBjb3JyZWN0IHRocm91Z2hwdXQgdGFibGUgZm9yIGdpdmVuIG1vZGUgb2YgbW9kdWxhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwpCi17Ci0JLyogVXNlZCB0byBjaG9vc2UgYW1vbmcgSFQgdGFibGVzICovCi0JczMyICgqaHRfdGJsX3BvaW50ZXIpW0lXTF9SQVRFX0NPVU5UXTsKLQotCS8qIENoZWNrIGZvciBpbnZhbGlkIExRIHR5cGUgKi8KLQlpZiAoV0FSTl9PTl9PTkNFKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAhaXNfSHQodGJsLT5scV90eXBlKSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogTGVnYWN5IHJhdGVzIGhhdmUgb25seSBvbmUgdGFibGUgKi8KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogQ2hvb3NlIGFtb25nIG1hbnkgSFQgdGFibGVzIGRlcGVuZGluZyBvbiBudW1iZXIgb2Ygc3RyZWFtcwotCSAqIChTSVNPL01JTU8yKSwgY2hhbm5lbCB3aWR0aCAoMjAvNDApLCBTR0ksIGFuZCBhZ2dyZWdhdGlvbgotCSAqIHN0YXR1cyAqLwotCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkgJiYgKCF0YmwtPmlzX2h0NDAgfHwgbHFfc3RhLT5pc19kdXApKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvMjBNSHo7Ci0JZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvNDBNSHo7Ci0JZWxzZSBpZiAoaXNfbWltbzIodGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCi0JCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6OwotCWVsc2UgLyogaWYgKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpIDwtLSBtdXN0IGJlIHRydWUgKi8KLQkJaHRfdGJsX3BvaW50ZXIgPSBleHBlY3RlZF90cHRfbWltbzJfNDBNSHo7Ci0KLQlpZiAoIXRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJCS8qIE5vcm1hbCAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzBdOwotCWVsc2UgaWYgKHRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJLyogU0dJICovCi0JCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMV07Ci0JZWxzZSBpZiAoIXRibC0+aXNfU0dJICYmIGxxX3N0YS0+aXNfYWdnKQkvKiBBR0cgKi8KLQkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclsyXTsKLQllbHNlCQkJCQkJLyogQUdHK1NHSSAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzNdOwotfQotCi0vKgotICogRmluZCBzdGFydGluZyByYXRlIGZvciBuZXcgInNlYXJjaCIgaGlnaC10aHJvdWdocHV0IG1vZGUgb2YgbW9kdWxhdGlvbi4KLSAqIEdvYWwgaXMgdG8gZmluZCBsb3dlc3QgZXhwZWN0ZWQgcmF0ZSAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSB0aGF0IGlzCi0gKiBhYm92ZSB0aGUgY3VycmVudCBtZWFzdXJlZCB0aHJvdWdocHV0IG9mICJhY3RpdmUiIG1vZGUsIHRvIGdpdmUgbmV3IG1vZGUKLSAqIGEgZmFpciBjaGFuY2UgdG8gcHJvdmUgaXRzZWxmIHdpdGhvdXQgdG9vIG1hbnkgY2hhbGxlbmdlcy4KLSAqCi0gKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyB0byBtb3JlIGFnZ3Jlc3NpdmUgbW9kdWxhdGlvbgotICogKGkuZS4gbGVnYWN5IHRvIFNJU08gb3IgTUlNTywgb3IgU0lTTyB0byBNSU1PKSwgYXMgd2VsbCBhcyBsZXNzIGFnZ3Jlc3NpdmUKLSAqIChpLmUuIE1JTU8gdG8gU0lTTykuICBXaGVuIG1vdmluZyB0byBNSU1PLCBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkCi0gKiB0byBkZWNyZWFzZSB0byBtYXRjaCAiYWN0aXZlIiB0aHJvdWdocHV0LiAgV2hlbiBtb3ZpbmcgZnJvbSBNSU1PIHRvIFNJU08sCi0gKiBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkIHRvIGluY3JlYXNlLCBidXQgbm90IGlmIHBlcmZvcm1hbmNlIHdhcyBiYWQuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwJLyogInNlYXJjaCIgKi8KLQkJCSAgICB1MTYgcmF0ZV9tYXNrLCBzOCBpbmRleCkKLXsKLQkvKiAiYWN0aXZlIiB2YWx1ZXMgKi8KLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICphY3RpdmVfdGJsID0KLQkgICAgJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JczMyIGFjdGl2ZV9zciA9IGFjdGl2ZV90YmwtPndpbltpbmRleF0uc3VjY2Vzc19yYXRpbzsKLQlzMzIgYWN0aXZlX3RwdCA9IGFjdGl2ZV90YmwtPmV4cGVjdGVkX3RwdFtpbmRleF07Ci0KLQkvKiBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICovCi0JczMyICp0cHRfdGJsID0gdGJsLT5leHBlY3RlZF90cHQ7Ci0KLQlzMzIgbmV3X3JhdGUsIGhpZ2gsIGxvdywgc3RhcnRfaGk7Ci0JdTE2IGhpZ2hfbG93OwotCXM4IHJhdGUgPSBpbmRleDsKLQotCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCWZvciAoOyA7KSB7Ci0JCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShwcml2LCByYXRlLCByYXRlX21hc2ssCi0JCQkJCQl0YmwtPmxxX3R5cGUpOwotCi0JCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQkJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7Ci0KLQkJLyoKLQkJICogTG93ZXIgdGhlICJzZWFyY2giIGJpdCByYXRlLCB0byBnaXZlIG5ldyAic2VhcmNoIiBtb2RlCi0JCSAqIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdGhyb3VnaHB1dCBhcyAiYWN0aXZlIiBpZjoKLQkJICoKLQkJICogMSkgIkFjdGl2ZSIgbW9kZSBoYXMgYmVlbiB3b3JraW5nIG1vZGVzdGx5IHdlbGwgKGJ1dCBub3QKLQkJICogICAgZ3JlYXQpLCBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSB0aGUgYWN0dWFsCi0JCSAqICAgIG1lYXN1cmVkICJhY3RpdmUiIHRocm91Z2hwdXQgKGJ1dCBsZXNzIHRoYW4gZXhwZWN0ZWQKLQkJICogICAgImFjdGl2ZSIgdGhyb3VnaHB1dCB1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKiBPUgotCQkgKiAyKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgcGVyZmVjdGx5IG9yIHZlcnkgd2VsbAotCQkgKiAgICBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSBleHBlY3RlZAotCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKi8KLQkJaWYgKCgoKDEwMCAqIHRwdF90YmxbcmF0ZV0pID4gbHFfc3RhLT5sYXN0X3RwdCkgJiYKLQkJICAgICAoKGFjdGl2ZV9zciA+IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSAmJgotCQkgICAgICAoYWN0aXZlX3NyIDw9IElXTF9SQVRFX0hJR0hfVEgpICYmCi0JCSAgICAgICh0cHRfdGJsW3JhdGVdIDw9IGFjdGl2ZV90cHQpKSkgfHwKLQkJICAgICgoYWN0aXZlX3NyID49IElXTF9SQVRFX1NDQUxFX1NXSVRDSCkgJiYKLQkJICAgICAodHB0X3RibFtyYXRlXSA+IGFjdGl2ZV90cHQpKSkgewotCi0JCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCi0JCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCi0JCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLwotCQkJaWYgKHN0YXJ0X2hpICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCQluZXdfcmF0ZSA9IHN0YXJ0X2hpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQluZXdfcmF0ZSA9IHJhdGU7Ci0KLQkJCS8qIExvb3AgYWdhaW4gd2l0aCBsb3dlciByYXRlICovCi0JCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQkJcmF0ZSA9IGxvdzsKLQotCQkJLyogTG93ZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCi0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJLyogRWxzZSB0cnkgdG8gcmFpc2UgdGhlICJzZWFyY2giIHJhdGUgdG8gbWF0Y2ggImFjdGl2ZSIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qICgybmQgb3IgbGF0ZXIgcGFzcykKLQkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gbG93ZXIgdGhlIHJhdGUsIGFuZCBhcmUKLQkJCSAqIG5vdyB0cnlpbmcgdG8gcmFpc2UgaXQsIHVzZSB0aGUgbG93ZXIgcmF0ZS4gKi8KLQkJCWlmIChuZXdfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJCWJyZWFrOwotCi0JCQkvKiBMb29wIGFnYWluIHdpdGggaGlnaGVyIHJhdGUgKi8KLQkJCWVsc2UgaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkJCXN0YXJ0X2hpID0gaGlnaDsKLQkJCQlyYXRlID0gaGlnaDsKLQotCQkJLyogSGlnaGVyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLwotCQkJfSBlbHNlIHsKLQkJCQluZXdfcmF0ZSA9IHJhdGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3X3JhdGU7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBNSU1PMgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpbmRleCkKLXsKLQl1MTYgcmF0ZV9tYXNrOwotCXMzMiByYXRlOwotCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JaWYgKCFjb25mX2lzX2h0KGNvbmYpIHx8ICFzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCi0JCXJldHVybiAtMTsKLQotCWlmICgoKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDIpCi0JCQkJCQk9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCXJldHVybiAtMTsKLQotCS8qIE5lZWQgYm90aCBUeCBjaGFpbnMvYW50ZW5uYXMgdG8gc3VwcG9ydCBNSU1PICovCi0JaWYgKHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtIDwgMikKLQkJcmV0dXJuIC0xOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiB0cnkgdG8gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQotCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOwotCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGU7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19odDQwX3R4X2FsbG93ZWQocHJpdiwgY3R4LCAmc3RhLT5odF9jYXApKQotCQl0YmwtPmlzX2h0NDAgPSAxOwotCWVsc2UKLQkJdGJsLT5pc19odDQwID0gMDsKLQotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0KLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgYmVzdCByYXRlICVkIG1hc2sgJVhcbiIsCi0JCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQlpZiAoKHJhdGUgPT0gSVdMX1JBVEVfSU5WQUxJRCkgfHwgISgoMSA8PCByYXRlKSAmIHJhdGVfbWFzaykpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkiQ2FuJ3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0YmwtPmN1cnJlbnRfcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsCi0JCQkJCQkgdGJsLCByYXRlLCBpc19ncmVlbik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFN3aXRjaCB0byBuZXcgbWNzICVYIGluZGV4IGlzIGdyZWVuICVYXG4iLAotCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpc19ncmVlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBTSVNPCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaW5kZXgpCi17Ci0JdTE2IHJhdGVfbWFzazsKLQl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0JczMyIHJhdGU7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWlmICghY29uZl9pc19odChjb25mKSB8fCAhc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQotCQlyZXR1cm4gLTE7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IHRyeSB0byBzd2l0Y2ggdG8gU0lTT1xuIik7Ci0KLQl0YmwtPmlzX2R1cCA9IGxxX3N0YS0+aXNfZHVwOwotCXRibC0+bHFfdHlwZSA9IExRX1NJU087Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCi0JCXRibC0+aXNfaHQ0MCA9IDE7Ci0JZWxzZQotCQl0YmwtPmlzX2h0NDAgPSAwOwotCi0JaWYgKGlzX2dyZWVuKQotCQl0YmwtPmlzX1NHSSA9IDA7IC8qMTFuIHNwZWM6IG5vIFNHSSBpbiBTSVNPK0dyZWVuZmllbGQqLwotCi0JaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogZ2V0IGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOwotCWlmICgocmF0ZSA9PSBJV0xfUkFURV9JTlZBTElEKSB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJImNhbiBub3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJICAgICByYXRlLCByYXRlX21hc2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRibC0+Y3VycmVudF9yYXRlID0gaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwKLQkJCQkJCXRibCwgcmF0ZSwgaXNfZ3JlZW4pOwotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogU3dpdGNoIHRvIG5ldyBtY3MgJVggaW5kZXggaXMgZ3JlZW4gJVhcbiIsCi0JCSAgICAgdGJsLT5jdXJyZW50X3JhdGUsIGlzX2dyZWVuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIGxlZ2FjeQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJaW50IGluZGV4KQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnNlYXJjaF90YmwgPQotCQkJCSYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSAmKHRibC0+d2luW2luZGV4XSk7Ci0JdTMyIHN6ID0gKHNpemVvZihzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvKSAtCi0JCSAgKHNpemVvZihzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSkgKiBJV0xfUkFURV9DT1VOVCkpOwotCXU4IHN0YXJ0X2FjdGlvbjsKLQl1OCB2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCXU4IHR4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKLQlpbnQgcmV0ID0gMDsKLQl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKLQotCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfU0lTTzsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCWZvciAoOyA7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOgotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgdG9nZ2xlIEFudGVubmFcbiIpOwotCi0JCQlpZiAoKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQkJdHhfY2hhaW5zX251bSA8PSAxKSB8fAotCQkJICAgICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJCXR4X2NoYWluc19udW0gPD0gMikpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIERvbid0IGNoYW5nZSBhbnRlbm5hIGlmIHN1Y2Nlc3MgaGFzIGJlZW4gZ3JlYXQgKi8KLQkJCWlmICh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPj0gSVdMX1JTX0dPT0RfUkFUSU8pCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IG90aGVyIGFudGVubmEgKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsIHNlYXJjaF90YmwpKSB7Ci0JCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQkJaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwKLQkJCQkJCQkJc2VhcmNoX3RibCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgc3dpdGNoIHRvIFNJU09cbiIpOwotCi0JCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBTSVNPICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAwOwotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhwcml2LCBscV9zdGEsIGNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkgewotCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQjoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQzoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTGVnYWN5IHN3aXRjaCB0byBNSU1PMlxuIik7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IE1JTU8gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsKLQkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FDOwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0JDOwotCi0JCQlpZiAoIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX3R4X2FudCwKLQkJCQkJCXNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl0YmwtPmFjdGlvbisrOwotCQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCi0JfQotCXNlYXJjaF90YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCXJldHVybiAwOwotCi1vdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKLQlpZiAodXBkYXRlX3NlYXJjaF90YmxfY291bnRlcikKLQkJc2VhcmNoX3RibC0+YWN0aW9uID0gdGJsLT5hY3Rpb247Ci0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIFNJU08KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IGluZGV4KQotewotCXU4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KLQkJCQkmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKLQlzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwotCXUzMiBzeiA9IChzaXplb2Yoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbykgLQotCQkgIChzaXplb2Yoc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEpICogSVdMX1JBVEVfQ09VTlQpKTsKLQl1OCBzdGFydF9hY3Rpb247Ci0JdTggdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl1OCB0eF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07Ci0JdTggdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDA7Ci0JaW50IHJldDsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JZm9yICg7OykgewotCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7Ci0JCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTSVNPIHRvZ2dsZSBBbnRlbm5hXG4iKTsKLQkJCWlmICgodGJsLT5hY3Rpb24gPT0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQl0eF9jaGFpbnNfbnVtIDw9IDEpIHx8Ci0JCQkgICAgKHRibC0+YWN0aW9uID09IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJdHhfY2hhaW5zX251bSA8PSAyKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOgotCQljYXNlIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQkM6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUI7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7Ci0JCQllbHNlCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJIHNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gdG9nZ2xlIFNHSS9OR0lcbiIpOwotCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlpZiAoaXNfZ3JlZW4pIHsKLQkJCQlpZiAoIXRibC0+aXNfU0dJKQotCQkJCQlicmVhazsKLQkJCQllbHNlCi0JCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJCSJTR0kgd2FzIHNldCBpbiBHRitTSVNPXG4iKTsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9ICF0YmwtPmlzX1NHSTsKLQkJCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOwotCQkJaWYgKHRibC0+aXNfU0dJKSB7Ci0JCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7Ci0JCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaW5kZXhdKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSA9Ci0JCQkJaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwgc2VhcmNoX3RibCwKLQkJCQkJCSAgICAgIGluZGV4LCBpc19ncmVlbik7Ci0JCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9TSVNPX1NXSVRDSF9HSSkKLQkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCi0JCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCi0JCQlicmVhazsKLQl9Ci0Jc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7Ci0JcmV0dXJuIDA7Ci0KLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfU0lTT19TV0lUQ0hfR0kpCi0JCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQotCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gTUlNTzIKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpbmRleCkKLXsKLQlzOCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqc2VhcmNoX3RibCA9Ci0JCQkJJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKLQl1MzIgc3ogPSAoc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pIC0KLQkJICAoc2l6ZW9mKHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhKSAqIElXTF9SQVRFX0NPVU5UKSk7Ci0JdTggc3RhcnRfYWN0aW9uOwotCXU4IHZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0JdTggdHhfY2hhaW5zX251bSA9IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOwotCXU4IHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAwOwotCWludCByZXQ7Ci0KLQlzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQlmb3IgKDs7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMjoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgdG9nZ2xlIEFudGVubmFzXG4iKTsKLQotCQkJaWYgKHR4X2NoYWluc19udW0gPD0gMikKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0E6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0I6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0M6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHN3aXRjaCB0byBTSVNPXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIFNJU08gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKHRibC0+YWN0aW9uID09IElXTF9NSU1PMl9TV0lUQ0hfU0lTT19BKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0E7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9COwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0M7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUpKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPSBpd2w0OTY1X3JzX3N3aXRjaF90b19zaXNvKHByaXYsIGxxX3N0YSwKLQkJCQkJCWNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlnb3RvIG91dDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV0xfTUlNTzJfU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHRvZ2dsZSBTR0kvTkdJXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIE1JTU8yICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7Ci0JCQlpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCBzZWFyY2hfdGJsKTsKLQkJCS8qCi0JCQkgKiBJZiBhY3RpdmUgdGFibGUgYWxyZWFkeSB1c2VzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlCi0JCQkgKiBtb2R1bGF0aW9uIChkdWFsIHN0cmVhbSB3aXRoIHNob3J0IGd1YXJkIGludGVydmFsKSwKLQkJCSAqIGFuZCBpdCdzIHdvcmtpbmcgd2VsbCwgdGhlcmUncyBubyBuZWVkIHRvIGxvb2sKLQkJCSAqIGZvciBhIGJldHRlciB0eXBlIG9mIG1vZHVsYXRpb24hCi0JCQkgKi8KLQkJCWlmICh0YmwtPmlzX1NHSSkgewotCQkJCXMzMiB0cHQgPSBscV9zdGEtPmxhc3RfdHB0IC8gMTAwOwotCQkJCWlmICh0cHQgPj0gc2VhcmNoX3RibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQotCQkJCWl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHNlYXJjaF90YmwsCi0JCQkJCQkgICAgICBpbmRleCwgaXNfZ3JlZW4pOwotCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQlnb3RvIG91dDsKLQotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9NSU1PMl9TV0lUQ0hfR0kpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCX0KLQlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQlyZXR1cm4gMDsKLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTUlNTzJfU1dJVENIX0dJKQotCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0JaWYgKHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIpCi0JCXNlYXJjaF90YmwtPmFjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGNvbnRpbnVlIHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlLCBvcgotICogYmVnaW4gc2VhcmNoIGZvciBhIG5ldyBtb2RlLCBiYXNlZCBvbjoKLSAqIDEpICMgdHggc3VjY2Vzc2VzIG9yIGZhaWx1cmVzIHdoaWxlIHVzaW5nIHRoaXMgbW9kZQotICogMikgIyB0aW1lcyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIDMpIGVsYXBzZWQgdGltZSBpbiB0aGlzIG1vZGUgKG5vdCB1c2VkLCBmb3Igbm93KQotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIGJvb2wgZm9yY2Vfc2VhcmNoKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgaTsKLQlpbnQgYWN0aXZlX3RibDsKLQlpbnQgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0gMDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCS8qIElmIHdlJ3ZlIGJlZW4gZGlzYWxsb3dpbmcgc2VhcmNoLCBzZWUgaWYgd2Ugc2hvdWxkIG5vdyBhbGxvdyBpdCAqLwotCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0KLQkJLyogRWxhcHNlZCB0aW1lIHVzaW5nIGN1cnJlbnQgbW9kdWxhdGlvbiBtb2RlICovCi0JCWlmIChscV9zdGEtPmZsdXNoX3RpbWVyKQotCQkJZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0KLQkJCXRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKGxxX3N0YS0+Zmx1c2hfdGltZXIgKwotCQkJCQlJV0xfUkFURV9TQ0FMRV9GTFVTSF9JTlRWTCkpOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHdlIHNob3VsZCBhbGxvdyBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0JCSAqIElmIG1hbnkgZnJhbWVzIGhhdmUgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgb3Igd2UndmUgdXNlZAotCQkgKiB0aGlzIHNhbWUgbW9kdWxhdGlvbiBmb3IgYSBsb25nIHRpbWUsIGFsbG93IHNlYXJjaCwgYW5kCi0JCSAqIHJlc2V0IGhpc3Rvcnkgc3RhdHMgdGhhdCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugc2hvdWxkCi0JCSAqIGFsbG93IGEgbmV3IHNlYXJjaC4gIEFsc28gKGJlbG93KSByZXNldCBhbGwgYml0bWFwcyBhbmQKLQkJICogc3RhdHMgaW4gYWN0aXZlIGhpc3RvcnkuCi0JCSAqLwotCQlpZiAoZm9yY2Vfc2VhcmNoIHx8Ci0JCSAgICAobHFfc3RhLT50b3RhbF9mYWlsZWQgPiBscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0KSB8fAotCQkgICAgKGxxX3N0YS0+dG90YWxfc3VjY2VzcyA+IGxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQpIHx8Ci0JCSAgICAoKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSAmJiAobHFfc3RhLT5mbHVzaF90aW1lcikKLQkJICAgICAmJiAoZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKSkpIHsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RheSBpcyBleHBpcmVkICVkICVkICVkXG46IiwKLQkJCQkgICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLAotCQkJCSAgICAgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJCSAgICAgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKTsKLQotCQkJLyogQWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLwotCQkJbHFfc3RhLT5zdGF5X2luX3RibCA9IDA7CS8qIG9ubHkgcGxhY2UgcmVzZXQgKi8KLQkJCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7Ci0JCQlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKLQotCQkvKgotCQkgKiBFbHNlIGlmIHdlJ3ZlIHVzZWQgdGhpcyBtb2R1bGF0aW9uIG1vZGUgZW5vdWdoIHJlcGV0aXRpb25zCi0JCSAqIChyZWdhcmRsZXNzIG9mIGVsYXBzZWQgdGltZSBvciBzdWNjZXNzL2ZhaWx1cmUpLCByZXNldAotCQkgKiBoaXN0b3J5IGJpdG1hcHMgYW5kIHJhdGUtc3BlY2lmaWMgc3RhdHMgZm9yIGFsbCByYXRlcyBpbgotCQkgKiBhY3RpdmUgdGFibGUuCi0JCSAqLwotCQl9IGVsc2UgewotCQkJbHFfc3RhLT50YWJsZV9jb3VudCsrOwotCQkJaWYgKGxxX3N0YS0+dGFibGVfY291bnQgPj0KLQkJCSAgICBscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0KSB7Ci0JCQkJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7Ci0KLQkJCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJCQkiTFE6IHN0YXkgaW4gdGFibGUgY2xlYXIgd2luXG4iKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJCX0KLQkJfQotCi0JCS8qIElmIHRyYW5zaXRpb25pbmcgdG8gYWxsb3cgInNlYXJjaCIsIHJlc2V0IGFsbCBoaXN0b3J5Ci0JCSAqIGJpdG1hcHMgYW5kIHN0YXRzIGluIGFjdGl2ZSB0YWJsZSAodGhpcyB3aWxsIGJlY29tZSB0aGUgbmV3Ci0JCSAqICJzZWFyY2giIHRhYmxlKS4gKi8KLQkJaWYgKCFscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIHNldHVwIHJhdGUgdGFibGUgaW4gdUNvZGUKLSAqIHJldHVybiByYXRlX25fZmxhZ3MgYXMgdXNlZCBpbiB0aGUgdGFibGUKLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCWludCBpbmRleCwgdTggaXNfZ3JlZW4pCi17Ci0JdTMyIHJhdGU7Ci0KLQkvKiBVcGRhdGUgdUNvZGUncyByYXRlIHRhYmxlLiAqLwotCXJhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsIGluZGV4LCBpc19ncmVlbik7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKHByaXYsIGxxX3N0YSwgcmF0ZSk7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQotCXJldHVybiByYXRlOwotfQotCi0vKgotICogRG8gcmF0ZSBzY2FsaW5nIGFuZCBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlpbnQgbG93ID0gSVdMX1JBVEVfSU5WQUxJRDsKLQlpbnQgaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0JaW50IGluZGV4OwotCWludCBpOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSBOVUxMOwotCWludCBjdXJyZW50X3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCWludCBsb3dfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGhpZ2hfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JdTMyIGZhaWxfY291bnQ7Ci0Jczggc2NhbGVfYWN0aW9uID0gMDsKLQl1MTYgcmF0ZV9tYXNrOwotCXU4IHVwZGF0ZV9scSA9IDA7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCAqdGJsMTsKLQl1MTYgcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSAwOwotCXUzMiByYXRlOwotCXU4IGlzX2dyZWVuID0gMDsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCBkb25lX3NlYXJjaCA9IDA7Ci0JdTE2IGhpZ2hfbG93OwotCXMzMiBzcjsKLQl1OCB0aWQgPSBNQVhfVElEX0NPVU5UOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAicmF0ZSBzY2FsZSBjYWxjdWxhdGUgbmV3IHJhdGUgZm9yIHNrYlxuIik7Ci0KLQkvKiBTZW5kIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBOT19BQ0sgZGF0YSB1c2luZyBsb3dlc3QgcmF0ZS4gKi8KLQkvKiBUT0RPOiB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkLi4gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKLQkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykKLQkJcmV0dXJuOwotCi0JaWYgKCFzdGEgfHwgIWxxX3N0YSkKLQkJcmV0dXJuOwotCi0JbHFfc3RhLT5zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW2xxX3N0YS0+YmFuZF07Ci0KLQl0aWQgPSBpd2w0OTY1X3JzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOwotCWlmICgodGlkICE9IE1BWF9USURfQ09VTlQpICYmIChscV9zdGEtPnR4X2FnZ190aWRfZW4gJiAoMSA8PCB0aWQpKSkgewotCQl0aWRfZGF0YSA9ICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElXTF9BR0dfT0ZGKQotCQkJbHFfc3RhLT5pc19hZ2cgPSAwOwotCQllbHNlCi0JCQlscV9zdGEtPmlzX2FnZyA9IDE7Ci0JfSBlbHNlCi0JCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotCS8qCi0JICogU2VsZWN0IHJhdGUtc2NhbGUgLyBtb2R1bGF0aW9uLW1vZGUgdGFibGUgdG8gd29yayB3aXRoIGluCi0JICogdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbjogICJzZWFyY2giIGlmIHNlYXJjaGluZyBmb3IgYmV0dGVyCi0JICogbW9kdWxhdGlvbiBtb2RlLCBvciAiYWN0aXZlIiBpZiBkb2luZyByYXRlIHNjYWxpbmcgd2l0aGluIGEgbW9kZS4KLQkgKi8KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpCi0JCWxxX3N0YS0+aXNfZ3JlZW4gPSAwOwotCWVsc2UKLQkJbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCi0JLyogY3VycmVudCB0eCByYXRlICovCi0JaW5kZXggPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxlIGluZGV4ICVkIGZvciB0eXBlICVkXG4iLCBpbmRleCwKLQkJICAgICAgIHRibC0+bHFfdHlwZSk7Ci0KLQkvKiByYXRlcyBhdmFpbGFibGUgZm9yIHRoaXMgYXNzb2NpYXRpb24sIGFuZCBmb3IgbW9kdWxhdGlvbiBtb2RlICovCi0JcmF0ZV9tYXNrID0gaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzKGxxX3N0YSwgaGRyLCB0YmwtPmxxX3R5cGUpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIm1hc2sgMHglMDRYXG4iLCByYXRlX21hc2spOwotCi0JLyogbWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJKGxxX3N0YS0+c3VwcF9yYXRlcyA8PCBJV0xfRklSU1RfT0ZETV9SQVRFKSk7Ci0JCWVsc2UKLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJCQkgICAgICBscV9zdGEtPnN1cHBfcmF0ZXMpOwotCi0JfSBlbHNlCi0JCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gcmF0ZV9tYXNrOwotCi0JaWYgKCFyYXRlX3NjYWxlX2luZGV4X21zaykKLQkJcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSByYXRlX21hc2s7Ci0KLQlpZiAoISgoMSA8PCBpbmRleCkgJiByYXRlX3NjYWxlX2luZGV4X21zaykpIHsKLQkJSVdMX0VSUihwcml2LCAiQ3VycmVudCBSYXRlIGlzIG5vdCB2YWxpZFxuIik7Ci0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiByZXZlcnQgdG8gYWN0aXZlIHRhYmxlIGlmIHNlYXJjaCB0YWJsZSBpcyBub3QgdmFsaWQqLwotCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCQkvKiBnZXQgImFjdGl2ZSIgcmF0ZSBpbmZvICovCi0JCQlpbmRleCA9IGl3bDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKLQkJCXJhdGUgPSBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChwcml2LCBjdHgsIGxxX3N0YSwKLQkJCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCB0YWJsZSBhbmQgaGlzdG9yeSB3aW5kb3cgZm9yIGN1cnJlbnQgcmF0ZSAqLwotCWlmICghdGJsLT5leHBlY3RlZF90cHQpIHsKLQkJSVdMX0VSUihwcml2LCAidGJsLT5leHBlY3RlZF90cHQgaXMgTlVMTFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaW5kZXgpKSB7Ci0JCWluZGV4ID0gbHFfc3RhLT5tYXhfcmF0ZV9pZHg7Ci0JCXVwZGF0ZV9scSA9IDE7Ci0JCXdpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0Jd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGFjdHVhbCBhdmVyYWdlCi0JICogdGhyb3VnaHB1dCwga2VlcCBhbmFseXppbmcgcmVzdWx0cyBvZiBtb3JlIHR4IGZyYW1lcywgd2l0aG91dAotCSAqIGNoYW5naW5nIHJhdGUgb3IgbW9kZSAoYnlwYXNzIG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbikuCi0JICogU2V0IHVwIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlIG9ubHkgaWYgb2xkIHJhdGUgaXMgbm90IHN1cHBvcnRlZAotCSAqIGluIGN1cnJlbnQgYXNzb2NpYXRpb24gKHVzZSBuZXcgcmF0ZSBmb3VuZCBhYm92ZSkuCi0JICovCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCWlmICgoZmFpbF9jb3VudCA8IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSAmJgotCQkJKHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyIDwgSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RpbGwgYmVsb3cgVEguIHN1Y2M9JWQgdG90YWw9JWQgIgotCQkJICAgICAgICJmb3IgaW5kZXggJWRcbiIsCi0JCQkgICAgICAgd2luZG93LT5zdWNjZXNzX2NvdW50ZXIsIHdpbmRvdy0+Y291bnRlciwgaW5kZXgpOwotCi0JCS8qIENhbid0IGNhbGN1bGF0ZSB0aGlzIHlldDsgbm90IGVub3VnaCBoaXN0b3J5ICovCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQotCQkvKiBTaG91bGQgd2Ugc3RheSB3aXRoIHRoaXMgbW9kdWxhdGlvbiBtb2RlLAotCQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkJaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JCWdvdG8gb3V0OwotCX0KLQkvKiBFbHNlIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXM7IGNhbGN1bGF0ZSBlc3RpbWF0ZSBvZgotCSAqIGFjdHVhbCBhdmVyYWdlIHRocm91Z2hwdXQgKi8KLQlpZiAod2luZG93LT5hdmVyYWdlX3RwdCAhPSAoKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyAqCi0JCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSAiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBieSBub3dcbiIpOwotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpOwotCX0KLQotCS8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIGNoZWNrIHN1Y2Nlc3MuICovCi0JaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKLQkJLyogSWYgZ29vZCBzdWNjZXNzLCBjb250aW51ZSB1c2luZyB0aGUgInNlYXJjaCIgbW9kZTsKLQkJICogbm8gbmVlZCB0byBzZW5kIG5ldyBsaW5rIHF1YWxpdHkgY29tbWFuZCwgc2luY2Ugd2UncmUKLQkJICogY29udGludWluZyB0byB1c2UgdGhlIHNldHVwIHRoYXQgd2UndmUgYmVlbiB0cnlpbmcuICovCi0JCWlmICh3aW5kb3ctPmF2ZXJhZ2VfdHB0ID4gbHFfc3RhLT5sYXN0X3RwdCkgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNXSVRDSElORyBUTyBORVcgVEFCTEUgIgotCQkJCQkic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKLQkJCQkJd2luZG93LT5zdWNjZXNzX3JhdGlvLAotCQkJCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0LAotCQkJCQlscV9zdGEtPmxhc3RfdHB0KTsKLQotCQkJaWYgKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCQlscV9zdGEtPmVuYWJsZV9jb3VudGVyID0gMTsKLQotCQkJLyogU3dhcCB0YWJsZXM7ICJzZWFyY2giIGJlY29tZXMgImFjdGl2ZSIgKi8KLQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9IGFjdGl2ZV90Ymw7Ci0JCQljdXJyZW50X3RwdCA9IHdpbmRvdy0+YXZlcmFnZV90cHQ7Ci0KLQkJLyogRWxzZSBwb29yIHN1Y2Nlc3M7IGdvIGJhY2sgdG8gbW9kZSBpbiAiYWN0aXZlIiB0YWJsZSAqLwotCQl9IGVsc2UgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IEdPSU5HIEJBQ0sgVE8gVEhFIE9MRCBUQUJMRSAiCi0JCQkJCSJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAotCQkJCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8sCi0JCQkJCXdpbmRvdy0+YXZlcmFnZV90cHQsCi0JCQkJCWxxX3N0YS0+bGFzdF90cHQpOwotCi0JCQkvKiBOdWxsaWZ5ICJzZWFyY2giIHRhYmxlICovCi0JCQl0YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCi0JCQkvKiBSZXZlcnQgdG8gImFjdGl2ZSIgdGFibGUgKi8KLQkJCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7Ci0KLQkJCS8qIFJldmVydCB0byAiYWN0aXZlIiByYXRlIGFuZCB0aHJvdWdocHV0IGluZm8gKi8KLQkJCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodGJsLT5jdXJyZW50X3JhdGUpOwotCQkJY3VycmVudF90cHQgPSBscV9zdGEtPmxhc3RfdHB0OwotCi0JCQkvKiBOZWVkIHRvIHNldCB1cCBhIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlICovCi0JCQl1cGRhdGVfbHEgPSAxOwotCQl9Ci0KLQkJLyogRWl0aGVyIHdheSwgd2UndmUgbWFkZSBhIGRlY2lzaW9uOyBtb2R1bGF0aW9uIG1vZGUKLQkJICogc2VhcmNoIGlzIGRvbmUsIGFsbG93IHJhdGUgYWRqdXN0bWVudCBuZXh0IHRpbWUuICovCi0JCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQlkb25lX3NlYXJjaCA9IDE7CS8qIERvbid0IHN3aXRjaCBtb2RlcyBiZWxvdyEgKi8KLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0JLyogKEVsc2UpIG5vdCBpbiBzZWFyY2ggb2YgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgdHJ5IGZvciBiZXR0ZXIKLQkgKiBzdGFydGluZyByYXRlLCB3aGlsZSBzdGF5aW5nIGluIHRoaXMgbW9kZS4gKi8KLQloaWdoX2xvdyA9IGl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUocHJpdiwgaW5kZXgsCi0JCQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrLAotCQkJCQl0YmwtPmxxX3R5cGUpOwotCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKLQotCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaGlnaCkpCi0JCWhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCi0Jc3IgPSB3aW5kb3ctPnN1Y2Nlc3NfcmF0aW87Ci0KLQkvKiBDb2xsZWN0IG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBjdXJyZW50IGFuZCBhZGphY2VudCByYXRlcyAqLwotCWN1cnJlbnRfdHB0ID0gd2luZG93LT5hdmVyYWdlX3RwdDsKLQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvd190cHQgPSB0YmwtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OwotCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWhpZ2hfdHB0ID0gdGJsLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7Ci0KLQlzY2FsZV9hY3Rpb24gPSAwOwotCi0JLyogVG9vIG1hbnkgZmFpbHVyZXMsIGRlY3JlYXNlIHJhdGUgKi8KLQlpZiAoKHNyIDw9IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSB8fCAoY3VycmVudF90cHQgPT0gMCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCSJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOwotCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQotCS8qIE5vIHRocm91Z2hwdXQgbWVhc3VyZWQgeWV0IGZvciBhZGphY2VudCByYXRlczsgdHJ5IGluY3JlYXNlLiAqLwotCX0gZWxzZSBpZiAoKGxvd190cHQgPT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAgIChoaWdoX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkpIHsKLQotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEICYmIHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKQotCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJZWxzZSBpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlzY2FsZV9hY3Rpb24gPSAwOwotCX0KLQotCS8qIEJvdGggYWRqYWNlbnQgdGhyb3VnaHB1dHMgYXJlIG1lYXN1cmVkLCBidXQgbmVpdGhlciBvbmUgaGFzIGJldHRlcgotCSAqIHRocm91Z2hwdXQ7IHdlJ3JlIHVzaW5nIHRoZSBiZXN0IHJhdGUsIGRvbid0IGNoYW5nZSBpdCEgKi8KLQllbHNlIGlmICgobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChsb3dfdHB0IDwgY3VycmVudF90cHQpICYmCi0JCSAoaGlnaF90cHQgPCBjdXJyZW50X3RwdCkpCi0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQsCi0JICogYW5kIG1heSBoYXZlIGJldHRlciBwZXJmb3JtYW5jZS4gKi8KLQllbHNlIHsKLQkJLyogSGlnaGVyIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkICovCi0JCWlmIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgewotCQkJLyogSGlnaGVyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCi0JCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgotCQkJCQlzciA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkgewotCQkJCXNjYWxlX2FjdGlvbiA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXNjYWxlX2FjdGlvbiA9IDA7Ci0JCQl9Ci0KLQkJLyogTG93ZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KLQkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0JCQkvKiBMb3dlciByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLwotCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgewotCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJICAgICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gLTE7Ci0JCQl9IGVsc2UgaWYgKHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKSB7Ci0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKLQkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLwotCWlmICgoc2NhbGVfYWN0aW9uID09IC0xKSAmJiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpICYmCi0JCSAgICAoKHNyID4gSVdMX1JBVEVfSElHSF9USCkgfHwKLQkJICAgICAoY3VycmVudF90cHQgPiAoMTAwICogdGJsLT5leHBlY3RlZF90cHRbbG93XSkpKSkKLQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCXN3aXRjaCAoc2NhbGVfYWN0aW9uKSB7Ci0JY2FzZSAtMToKLQkJLyogRGVjcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCXVwZGF0ZV9scSA9IDE7Ci0JCQlpbmRleCA9IGxvdzsKLQkJfQotCi0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogSW5jcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCQl1cGRhdGVfbHEgPSAxOwotCQkJaW5kZXggPSBoaWdoOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQkvKiBObyBjaGFuZ2UgKi8KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiY2hvb3NlIHJhdGUgc2NhbGUgaW5kZXggJWQgYWN0aW9uICVkIGxvdyAlZCAiCi0JCSAgICAiaGlnaCAlZCB0eXBlICVkXG4iLAotCQkgICAgIGluZGV4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCwgdGJsLT5scV90eXBlKTsKLQotbHFfdXBkYXRlOgotCS8qIFJlcGxhY2UgdUNvZGUncyByYXRlIHRhYmxlIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4gKi8KLQlpZiAodXBkYXRlX2xxKQotCQlyYXRlID0gaXdsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwocHJpdiwgY3R4LCBscV9zdGEsCi0JCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCi0JLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKLQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JLyoKLQkgKiBTZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUgaWYgd2UncmU6Ci0JICogMSkgIE5vdCBjaGFuZ2luZyByYXRlcyByaWdodCBub3cKLQkgKiAyKSAgTm90IGp1c3QgZmluaXNoaW5nIHVwIGEgc2VhcmNoCi0JICogMykgIEFsbG93aW5nIGEgbmV3IHNlYXJjaAotCSAqLwotCWlmICghdXBkYXRlX2xxICYmICFkb25lX3NlYXJjaCAmJgotCQkhbHFfc3RhLT5zdGF5X2luX3RibCAmJiB3aW5kb3ctPmNvdW50ZXIpIHsKLQkJLyogU2F2ZSBjdXJyZW50IHRocm91Z2hwdXQgdG8gY29tcGFyZSB3aXRoICJzZWFyY2giIHRocm91Z2hwdXQqLwotCQlscV9zdGEtPmxhc3RfdHB0ID0gY3VycmVudF90cHQ7Ci0KLQkJLyogU2VsZWN0IGEgbmV3ICJzZWFyY2giIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuCi0JCSAqIElmIG9uZSBpcyBmb3VuZCwgc2V0IHVwIHRoZSBuZXcgInNlYXJjaCIgdGFibGUuICovCi0JCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCWl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCQllbHNlIGlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihwcml2LCBscV9zdGEsCi0JCQkJCQkJY29uZiwgc3RhLCBpbmRleCk7Ci0JCWVsc2UgLyogKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpICovCi0JCQlpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCi0JCS8qIElmIG5ldyAic2VhcmNoIiBtb2RlIHdhcyBzZWxlY3RlZCwgc2V0IHVwIGluIHVDb2RlIHRhYmxlICovCi0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiBBY2Nlc3MgdGhlICJzZWFyY2giIHRhYmxlLCBjbGVhciBpdHMgaGlzdG9yeS4gKi8KLQkJCXRibCA9ICYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCQkmKHRibC0+d2luW2ldKSk7Ci0KLQkJCS8qIFVzZSBuZXcgInNlYXJjaCIgc3RhcnQgcmF0ZSAqLwotCQkJaW5kZXggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7Ci0KLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJIlN3aXRjaCBjdXJyZW50ICBtY3M6ICVYIGluZGV4OiAlZFxuIiwKLQkJCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpbmRleCk7Ci0JCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQocHJpdiwgbHFfc3RhLAotCQkJCQkJdGJsLT5jdXJyZW50X3JhdGUpOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsCi0JCQkJCQkmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7Ci0JCX0gZWxzZQotCQkJZG9uZV9zZWFyY2ggPSAxOwotCX0KLQotCWlmIChkb25lX3NlYXJjaCAmJiAhbHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkvKiBJZiB0aGUgImFjdGl2ZSIgKG5vbi1zZWFyY2gpIG1vZGUgd2FzIGxlZ2FjeSwKLQkJICogYW5kIHdlJ3ZlIHRyaWVkIHN3aXRjaGluZyBhbnRlbm5hcywKLQkJICogYnV0IHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRyeSBIVCBtb2RlcyAobm90IGF2YWlsYWJsZSksCi0JCSAqIHN0YXkgd2l0aCBiZXN0IGFudGVubmEgbGVnYWN5IG1vZHVsYXRpb24gZm9yIGEgd2hpbGUKLQkJICogYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJdGJsMSA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlpZiAoaXNfbGVnYWN5KHRibDEtPmxxX3R5cGUpICYmICFjb25mX2lzX2h0KGNvbmYpICYmCi0JCSAgICBscV9zdGEtPmFjdGlvbl9jb3VudGVyID4gdGJsMS0+bWF4X3NlYXJjaCkgewotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTVEFZIGluIGxlZ2FjeSB0YWJsZVxuIik7Ci0JCQlpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHByaXYsIDEsIGxxX3N0YSk7Ci0JCX0KLQotCQkvKiBJZiB3ZSdyZSBpbiBhbiBIVCBtb2RlLCBhbmQgYWxsIDMgbW9kZSBzd2l0Y2ggYWN0aW9ucwotCQkgKiBoYXZlIGJlZW4gdHJpZWQgYW5kIGNvbXBhcmVkLCBzdGF5IGluIHRoaXMgYmVzdCBtb2R1bGF0aW9uCi0JCSAqIG1vZGUgZm9yIGEgd2hpbGUgYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJaWYgKGxxX3N0YS0+ZW5hYmxlX2NvdW50ZXIgJiYKLQkJICAgIChscV9zdGEtPmFjdGlvbl9jb3VudGVyID49IHRibDEtPm1heF9zZWFyY2gpKSB7Ci0JCQlpZiAoKGxxX3N0YS0+bGFzdF90cHQgPiBJV0xfQUdHX1RQVF9USFJFSE9MRCkgJiYKLQkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKLQkJCSAgICAodGlkICE9IE1BWF9USURfQ09VTlQpKSB7Ci0JCQkJdGlkX2RhdGEgPQotCQkJCSAgICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCQkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSVdMX0FHR19PRkYpIHsKLQkJCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkJCSAgICAgICAidHJ5IHRvIGFnZ3JlZ2F0ZSB0aWQgJWRcbiIsCi0JCQkJCQkgICAgICAgdGlkKTsKLQkJCQkJaXdsNDk2NV9yc190bF90dXJuX29uX2FnZyhwcml2LCB0aWQsCi0JCQkJCQkJICBscV9zdGEsIHN0YSk7Ci0JCQkJfQotCQkJfQotCQkJaXdsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShwcml2LCAwLCBscV9zdGEpOwotCQl9Ci0JfQotCi1vdXQ6Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsCi0JCQkJCQkJaW5kZXgsIGlzX2dyZWVuKTsKLQlpID0gaW5kZXg7Ci0JbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scSAtIEluaXRpYWxpemUgYSBzdGF0aW9uJ3MgaGFyZHdhcmUgcmF0ZSB0YWJsZQotICoKLSAqIFRoZSB1Q29kZSdzIHN0YXRpb24gdGFibGUgY29udGFpbnMgYSB0YWJsZSBvZiBmYWxsYmFjayByYXRlcwotICogZm9yIGF1dG9tYXRpYyBmYWxsYmFjayBkdXJpbmcgdHJhbnNtaXNzaW9uLgotICoKLSAqIE5PVEU6IFRoaXMgc2V0cyB1cCBhIGRlZmF1bHQgc2V0IG9mIHZhbHVlcy4gIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIKLSAqICAgICAgIGlmIHRoZSBkcml2ZXIncyBpd2wtNDk2NS1ycyByYXRlIHNjYWxpbmcgYWxnb3JpdGhtIGlzIHVzZWQsIGluc3RlYWQgb2YKLSAqICAgICAgIHJjODAyMTFfc2ltcGxlLgotICoKLSAqIE5PVEU6IFJ1biBSRVBMWV9BRERfU1RBIGNvbW1hbmQgdG8gc2V0IHVwIHN0YXRpb24gdGFibGUgZW50cnksIGJlZm9yZQotICogICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICh3aGljaCBydW5zIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQsCi0gKiAgICAgICB3aGljaCByZXF1aXJlcyBzdGF0aW9uIHRhYmxlIGVudHJ5IHRvIGV4aXN0KS4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19pbml0aWFsaXplX2xxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgcmF0ZV9pZHg7Ci0JaW50IGk7Ci0JdTMyIHJhdGU7Ci0JdTggdXNlX2dyZWVuID0gaXdsNDk2NV9yc191c2VfZ3JlZW4oc3RhKTsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCB2YWxpZF90eF9hbnQ7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlpZiAoIXN0YSB8fCAhbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQljdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWkgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCXZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCWlmICgoaSA8IDApIHx8IChpID49IElXTF9SQVRFX0NPVU5UKSkKLQkJaSA9IDA7Ci0KLQlyYXRlID0gaXdsZWdhY3lfcmF0ZXNbaV0ucGxjcDsKLQl0YmwtPmFudF90eXBlID0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHZhbGlkX3R4X2FudCk7Ci0JcmF0ZSB8PSB0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0KLQlpZiAoaSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkKLQkJcmF0ZSB8PSBSQVRFX01DU19DQ0tfTVNLOwotCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MocmF0ZSwgcHJpdi0+YmFuZCwgdGJsLCAmcmF0ZV9pZHgpOwotCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCB0YmwtPmFudF90eXBlKSkKLQkJaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsICZyYXRlLCB0YmwpOwotCi0JcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHRibCwgcmF0ZV9pZHgsIHVzZV9ncmVlbik7Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSByYXRlOwotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgcmF0ZSk7Ci0JcHJpdi0+c3RhdGlvbnNbbHFfc3RhLT5scS5zdGFfaWRdLmxxID0gJmxxX3N0YS0+bHE7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pd2w0OTY1X3JzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKLXsKLQotCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0JaW50IHJhdGVfaWR4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwgInJhdGUgc2NhbGUgY2FsY3VsYXRlIG5ldyByYXRlIGZvciBza2JcbiIpOwotCi0JLyogR2V0IG1heCByYXRlIGlmIHVzZXIgc2V0IG1heCByYXRlICovCi0JaWYgKGxxX3N0YSkgewotCQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IHR4cmMtPm1heF9yYXRlX2lkeDsKLQkJaWYgKChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSAmJgotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCWlmICgobHFfc3RhLT5tYXhfcmF0ZV9pZHggPCAwKSB8fAotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gLTE7Ci0JfQotCi0JLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KLQlpZiAobHFfc3RhICYmICFscV9zdGEtPmRydikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiUmF0ZSBzY2FsaW5nIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKLQkJcHJpdl9zdGEgPSBOVUxMOwotCX0KLQotCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLwotCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBwcml2X3N0YSwgdHhyYykpCi0JCXJldHVybjsKLQotCWlmICghbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlyYXRlX2lkeCAgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSB7Ci0JCXJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCS8qIDZNIGFuZCA5TSBzaGFyZWQgc2FtZSBNQ1MgaW5kZXggKi8KLQkJcmF0ZV9pZHggPSAocmF0ZV9pZHggPiAwKSA/IChyYXRlX2lkeCAtIDEpIDogMDsKLQkJaWYgKGl3bDQ5NjVfcnNfZXh0cmFjdF9yYXRlKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MpID49Ci0JCQkgSVdMX1JBVEVfTUlNTzJfNk1fUExDUCkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9pZHggKyBNQ1NfSU5ERVhfUEVSX1NUUkVBTTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOwotCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19EVVBfREFUQTsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDsKLQl9IGVsc2UgewotCQkvKiBDaGVjayBmb3IgaW52YWxpZCByYXRlcyAqLwotCQlpZiAoKHJhdGVfaWR4IDwgMCkgfHwgKHJhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkgfHwKLQkJCQkoKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopICYmCi0JCQkJIChyYXRlX2lkeCA8IElXTF9GSVJTVF9PRkRNX1JBVEUpKSkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoc2JhbmQsIHN0YSk7Ci0JCS8qIE9uIHZhbGlkIDUgR0h6IHJhdGUsIGFkanVzdCBpbmRleCAqLwotCQllbHNlIGlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IDA7Ci0JfQotCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7Ci0KLX0KLQotc3RhdGljIHZvaWQgKml3bDQ5NjVfcnNfYWxsb2Nfc3RhKHZvaWQgKnByaXZfcmF0ZSwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0KLQkJCQkoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAiY3JlYXRlIHN0YXRpb24gcmF0ZSBzY2FsZSB3aW5kb3dcbiIpOwotCi0JbHFfc3RhID0gJnN0YV9wcml2LT5scV9zdGE7Ci0KLQlyZXR1cm4gbHFfc3RhOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIGFkZGluZyBhIG5ldyBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nCi0gKi8KLXZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQl1OCBzdGFfaWQpCi17Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmcHJpdi0+aHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0KLQlzdGFfcHJpdiA9IChzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqKSBzdGEtPmRydl9wcml2OwotCWxxX3N0YSA9ICZzdGFfcHJpdi0+bHFfc3RhOwotCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKLQotCi0JbHFfc3RhLT5scS5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQlmb3IgKGogPSAwOyBqIDwgTFFfU0laRTsgaisrKQotCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW5kb3coCi0JCQkJCSZscV9zdGEtPmxxX2luZm9bal0ud2luW2ldKTsKLQotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSAwOwotCWxxX3N0YS0+c3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0JZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKLQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkmbHFfc3RhLT5scV9pbmZvW2pdLndpbltpXSk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IgotCQkJIioqKiByYXRlIHNjYWxlIHN0YXRpb24gZ2xvYmFsIGluaXQgZm9yIHN0YXRpb24gJWQgKioqXG4iLAotCQkgICAgICAgc3RhX2lkKTsKLQkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90Ci0JICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCi0JICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQotCSAqIGFmdGVyIGFzc29jLi4gKi8KLQotCWxxX3N0YS0+aXNfZHVwID0gMDsKLQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOwotCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IElXTF9NSVNTRURfUkFURV9NQVg7Ci0JbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUgPSBwcml2LT5hY3RpdmVfcmF0ZSAmIH4oMHgxMDAwKTsKLQlscV9zdGEtPmJhbmQgPSBwcml2LT5iYW5kOwotCS8qCi0JICogYWN0aXZlX3Npc29fcmF0ZSBtYXNrIGluY2x1ZGVzIDkgTUJpdHMgKGJpdCA1KSwgYW5kIENDSyAoYml0cyAwLTMpLAotCSAqIHN1cHBfcmF0ZXNbXSBkb2VzIG5vdDsgc2hpZnQgdG8gY29udmVydCBmb3JtYXQsIGZvcmNlIDkgTUJpdHMgb2ZmLgotCSAqLwotCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgfD0gaHRfY2FwLT5tY3MucnhfbWFza1swXSAmIDB4MTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgJj0gfigodTE2KTB4Mik7Ci0JbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogU2FtZSBoZXJlICovCi0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gJiAweDE7Ci0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAmPSB+KCh1MTYpMHgyKTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciAqLwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KLQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJgotCQl+aXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWlmICghbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9IEFOVF9BQjsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KSA9PSAyKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCX0KLQotCS8qIGFzIGRlZmF1bHQgYWxsb3cgYWdncmVnYXRpb24gZm9yIGFsbCB0aWRzICovCi0JbHFfc3RhLT50eF9hZ2dfdGlkX2VuID0gSVdMX0FHR19BTExfVElEOwotCWxxX3N0YS0+ZHJ2ID0gcHJpdjsKLQotCS8qIFNldCBsYXN0X3R4cmF0ZV9pZHggdG8gbG93ZXN0IHJhdGUgKi8KLQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwotCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0jZW5kaWYKLQotCWl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEsIGxxX3N0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiBuZXdfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJhdGVfaWR4OwotCWludCByZXBlYXRfcmF0ZSA9IDA7Ci0JdTggYW50X3RvZ2dsZV9jbnQgPSAwOwotCXU4IHVzZV9odF9wb3NzaWJsZSA9IDE7Ci0JdTggdmFsaWRfdHhfYW50ID0gMDsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxxX2NtZCA9ICZscV9zdGEtPmxxOwotCi0JLyogT3ZlcnJpZGUgc3RhcnRpbmcgcmF0ZSAoaW5kZXggMCkgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCWl3bDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhscV9zdGEsICZuZXdfcmF0ZSwgaW5kZXgpOwotCi0JLyogSW50ZXJwcmV0IG5ld19yYXRlIChyYXRlX25fZmxhZ3MpICovCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MobmV3X3JhdGUsIGxxX3N0YS0+YmFuZCwKLQkJCQkgICZ0YmxfdHlwZSwgJnJhdGVfaWR4KTsKLQotCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIGluaXRpYWwgcmF0ZT8gKi8KLQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCWFudF90b2dnbGVfY250ID0gMTsKLQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQl9IGVsc2UgewotCQlyZXBlYXRfcmF0ZSA9IElXTF9IVF9OVU1CRVJfVFJZOwotCX0KLQotCWxxX2NtZC0+Z2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIgPQotCQkJaXNfbWltbyh0YmxfdHlwZS5scV90eXBlKSA/IDEgOiAwOwotCi0JLyogRmlsbCAxc3QgdGFibGUgZW50cnkgKGluZGV4IDApICovCi0JbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMSkgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJCQl0YmxfdHlwZS5hbnRfdHlwZTsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMikgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJCQkJdGJsX3R5cGUuYW50X3R5cGU7Ci0JfSAvKiBvdGhlcndpc2Ugd2UgZG9uJ3QgbW9kaWZ5IHRoZSBleGlzdGluZyB2YWx1ZSAqLwotCi0JaW5kZXgrKzsKLQlyZXBlYXRfcmF0ZS0tOwotCWlmIChwcml2KQotCQl2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCi0JLyogRmlsbCByZXN0IG9mIHJhdGUgdGFibGUgKi8KLQl3aGlsZSAoaW5kZXggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgewotCQkvKiBSZXBlYXQgaW5pdGlhbC9uZXh0IHJhdGUuCi0JCSAqIEZvciBsZWdhY3kgSVdMX05VTUJFUl9UUlkgPT0gMSwgdGhpcyBsb29wIHdpbGwgbm90IGV4ZWN1dGUuCi0JCSAqIEZvciBIVCBJV0xfSFRfTlVNQkVSX1RSWSA9PSAzLCB0aGlzIGV4ZWN1dGVzIHR3aWNlLiAqLwotCQl3aGlsZSAocmVwZWF0X3JhdGUgPiAwICYmIChpbmRleCA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNKSkgewotCQkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgewotCQkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCi0JCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQkJZWxzZSBpZiAocHJpdiAmJgotCQkJCQkgaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCi0JCQkJCQkJJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7Ci0JCQl9Ci0KLQkJCS8qIE92ZXJyaWRlIG5leHQgcmF0ZSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCi0JCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCi0JCQlscV9jbWQtPnJzX3RhYmxlW2luZGV4XS5yYXRlX25fZmxhZ3MgPQotCQkJCQljcHVfdG9fbGUzMihuZXdfcmF0ZSk7Ci0JCQlyZXBlYXRfcmF0ZS0tOwotCQkJaW5kZXgrKzsKLQkJfQotCi0JCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLAotCQkJCQkJbHFfc3RhLT5iYW5kLCAmdGJsX3R5cGUsCi0JCQkJCQkmcmF0ZV9pZHgpOwotCi0JCS8qIEluZGljYXRlIHRvIHVDb2RlIHdoaWNoIGVudHJpZXMgbWlnaHQgYmUgTUlNTy4KLQkJICogSWYgaW5pdGlhbCByYXRlIHdhcyBNSU1PLCB0aGlzIHdpbGwgZmluYWxseSBlbmQgdXAKLQkJICogYXMgKElXTF9IVF9OVU1CRVJfVFJZICogMiksIGFmdGVyIDJuZCBwYXNzLCBvdGhlcndpc2UgMC4gKi8KLQkJaWYgKGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkpCi0JCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0gaW5kZXg7Ci0KLQkJLyogR2V0IG5leHQgcmF0ZSAqLwotCQluZXdfcmF0ZSA9IGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUobHFfc3RhLAotCQkJCQkmdGJsX3R5cGUsIHJhdGVfaWR4LAotCQkJCQkgICAgIHVzZV9odF9wb3NzaWJsZSk7Ci0KLQkJLyogSG93IG1hbnkgdGltZXMgc2hvdWxkIHdlIHJlcGVhdCB0aGUgbmV4dCByYXRlPyAqLwotCQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCQlpZiAoYW50X3RvZ2dsZV9jbnQgPCBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFKQotCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQllbHNlIGlmIChwcml2ICYmCi0JCQkJIGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCQkJICAgJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCWFudF90b2dnbGVfY250ID0gMTsKLQotCQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQkJfSBlbHNlIHsKLQkJCXJlcGVhdF9yYXRlID0gSVdMX0hUX05VTUJFUl9UUlk7Ci0JCX0KLQotCQkvKiBEb24ndCBhbGxvdyBIVCByYXRlcyBhZnRlciBuZXh0IHBhc3MuCi0JCSAqIGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUoKSB3aWxsIGNoYW5nZSB0eXBlIHRvIExRX0Egb3IgTFFfRy4gKi8KLQkJdXNlX2h0X3Bvc3NpYmxlID0gMDsKLQotCQkvKiBPdmVycmlkZSBuZXh0IHJhdGUgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkvKiBGaWxsIG5leHQgdGFibGUgZW50cnkgKi8KLQkJbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JCWluZGV4Kys7Ci0JCXJlcGVhdF9yYXRlLS07Ci0JfQotCi0JbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7Ci0KLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQotCQljcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKLX0KLQotc3RhdGljIHZvaWQKLSppd2w0OTY1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQotewotCXJldHVybiBody0+cHJpdjsKLX0KLS8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19mcmVlKHZvaWQgKnByaXZfcmF0ZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZnJlZV9zdGEodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gcHJpdl9yOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImVudGVyXG4iKTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmVcbiIpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotc3RhdGljIGludCBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JdTggdmFsaWRfdHhfYW50OwotCXU4IGFudF9zZWxfdHg7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlhbnRfc2VsX3R4ID0KLQkJICAoKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgJiBSQVRFX01DU19BTlRfQUJDX01TSykKLQkJICA+PiBSQVRFX01DU19BTlRfUE9TKTsKLQkJaWYgKCh2YWxpZF90eF9hbnQgJiBhbnRfc2VsX3R4KSA9PSBhbnRfc2VsX3R4KSB7Ci0JCQkqcmF0ZV9uX2ZsYWdzID0gbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9OXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwotCQkJSVdMX0VSUihwcml2LAotCQkJICAgICJJbnZhbGlkIGFudGVubmEgc2VsZWN0aW9uIDB4JVgsIFZhbGlkIGlzIDB4JVhcbiIsCi0JCQkgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9GRlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiRml4ZWQgcmF0ZSBPRkZcbiIpOwotCX0KLX0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCWNoYXIgYnVmWzY0XTsKLQlzaXplX3QgYnVmX3NpemU7Ci0JdTMyIHBhcnNlZF9yYXRlOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2LCBscV9zdGEpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCXByaXYgPSBscV9zdGEtPmRydjsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHNzY2FuZihidWYsICIleCIsICZwYXJzZWRfcmF0ZSkgPT0gMSkKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IHBhcnNlZF9yYXRlOwotCWVsc2UKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0KLQlscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZSA9IDB4MEZGRjsJLyogMSAtIDU0IE1CaXRzLCBpbmNsdWRlcyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJzdGFfaWQgJWQgcmF0ZSAweCVYXG4iLAotCQlscV9zdGEtPmxxLnN0YV9pZCwgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7Ci0KLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQoTlVMTCwgbHFfc3RhLCBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChscV9zdGEtPmRydiwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLAotCQkJCWZhbHNlKTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmJ1ZmY7Ci0JaW50IGRlc2MgPSAwOwotCWludCBpID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXNzaXplX3QgcmV0OwotCi0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJzdGFfaWQgJWRcbiIsIGxxX3N0YS0+bHEuc3RhX2lkKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiZmFpbGVkPSVkIHN1Y2Nlc3M9JWQgcmF0ZT0wJVhcbiIsCi0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCwgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUpOwotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJmaXhlZCByYXRlIDB4JVhcbiIsCi0JCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAidmFsaWRfdHhfYW50ICVzJXMlc1xuIiwKLQkgICAgKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQSkgPyAiQU5UX0EsIiA6ICIiLAotCSAgICAocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9CKSA/ICJBTlRfQiwiIDogIiIsCi0JICAgIChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0MpID8gIkFOVF9DIiA6ICIiKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAibHEgdHlwZSAlc1xuIiwKLQkgICAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpID8gImxlZ2FjeSIgOiAiSFQiKTsKLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzIiwKLQkJICAgKGlzX3Npc28odGJsLT5scV90eXBlKSkgPyAiU0lTTyIgOiAiTUlNTzIiKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyIsCi0JCSAgICh0YmwtPmlzX2h0NDApID8gIjQwTUh6IiA6ICIyME1IeiIpOwotCQkgICBkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzICVzICVzXG4iLAotCQkJKHRibC0+aXNfU0dJKSA/ICJTR0kiIDogIiIsCi0JCSAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAotCQkgICAobHFfc3RhLT5pc19hZ2cpID8gIkFHRyBvbiIgOiAiIik7Ci0JfQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJsYXN0IHR4IHJhdGU9MHglWFxuIiwKLQkJbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyk7Ci0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImdlbmVyYWw6IgotCQkiZmxhZ3M9MHglWCBtaW1vLWQ9JWQgcy1hbnQweCV4IGQtYW50PTB4JXhcbiIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrLAotCQlscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOwotCi0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImFnZzoiCi0JCQkidGltZV9saW1pdD0lZCBkaXN0X3N0YXJ0X3RoPSVkIGZyYW1lX2NudF9saW1pdD0lZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCksCi0JCQlscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCwKLQkJCWxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0KTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiU3RhcnQgaWR4IFswXT0weCV4IFsxXT0weCV4IFsyXT0weCV4IFszXT0weCV4XG4iLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzBdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzFdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzJdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzNdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7Ci0JCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgoCi0JCQlsZTMyX3RvX2NwdShscV9zdGEtPmxxLnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncykpOwotCQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHNcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiIHJhdGVbJWRdIDB4JVggJXNtYnBzICglcylcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzLCBpd2xfcmF0ZV9tY3NbaW5kZXhdLm1jcyk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOwotCWtmcmVlKGJ1ZmYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9vcHMgPSB7Ci0JLndyaXRlID0gaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUsCi0JLnJlYWQgPSBpd2w0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19Owotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciAqYnVmZjsKLQlpbnQgZGVzYyA9IDA7Ci0JaW50IGksIGo7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBMUV9TSVpFOyBpKyspIHsKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiJXMgdHlwZT0lZCBTR0k9JWQgSFQ0MD0lZCBEVVA9JWQgR0Y9JWRcbiIKLQkJCQkicmF0ZT0weCVYXG4iLAotCQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9PSBpID8gIioiIDogIngiLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5scV90eXBlLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5pc19TR0ksCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2h0NDAsCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2R1cCwKLQkJCQlscV9zdGEtPmlzX2dyZWVuLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5jdXJyZW50X3JhdGUpOwotCQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfQ09VTlQ7IGorKykgewotCQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiY291bnRlcj0lZCBzdWNjZXNzPSVkICUlPSVkXG4iLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfcmF0aW8pOwotCQl9Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQsCi0JLm9wZW4gPSBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIGJ1ZmZbMTIwXTsKLQlpbnQgZGVzYyA9IDA7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmbHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF07Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiQml0IFJhdGU9ICVkIE1iL3NcbiIsCi0JCQkJdGJsLT5leHBlY3RlZF90cHRbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdKTsKLQllbHNlCi0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkJIkJpdCBSYXRlPSAlZCBNYi9zXG4iLAotCQkJCWl3bGVnYWN5X3JhdGVzW2xxX3N0YS0+bGFzdF90eHJhdGVfaWR4XS5pZWVlID4+IDEpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2FkZF9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX3RhYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKLQkJCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzKTsKLQlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIFNfSVJVU1IsIGRpciwKLQkJCWxxX3N0YSwgJnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zY2FsZV9kYXRhIiwgU19JUlVTUiwgZGlyLAotCQkJbHFfc3RhLCAmcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSA9Ci0JCWRlYnVnZnNfY3JlYXRlX3U4KCJ0eF9hZ2dfdGlkX2VuYWJsZSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCi0JCSZscV9zdGEtPnR4X2FnZ190aWRfZW4pOwotCi19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlKTsKLQlkZWJ1Z2ZzX3JlbW92ZShscV9zdGEtPnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKLSAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCi0gKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0X3N0dWIodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKLXsKLX0KLXN0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc180OTY1X29wcyA9IHsKLQkubW9kdWxlID0gTlVMTCwKLQkubmFtZSA9IElXTDQ5NjVfUlNfTkFNRSwKLQkudHhfc3RhdHVzID0gaXdsNDk2NV9yc190eF9zdGF0dXMsCi0JLmdldF9yYXRlID0gaXdsNDk2NV9yc19nZXRfcmF0ZSwKLQkucmF0ZV9pbml0ID0gaXdsNDk2NV9yc19yYXRlX2luaXRfc3R1YiwKLQkuYWxsb2MgPSBpd2w0OTY1X3JzX2FsbG9jLAotCS5mcmVlID0gaXdsNDk2NV9yc19mcmVlLAotCS5hbGxvY19zdGEgPSBpd2w0OTY1X3JzX2FsbG9jX3N0YSwKLQkuZnJlZV9zdGEgPSBpd2w0OTY1X3JzX2ZyZWVfc3RhLAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JLmFkZF9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfYWRkX2RlYnVnZnMsCi0JLnJlbW92ZV9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnMsCi0jZW5kaWYKLX07Ci0KLWludCBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZyc180OTY1X29wcyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKQotewotCWllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigmcnNfNDk2NV9vcHMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTQ0YmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLXZvaWQgaXdsNDk2NV9yeF9taXNzZWRfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiAqbWlzc2VkX2JlYWNvbjsKLQotCW1pc3NlZF9iZWFjb24gPSAmcGt0LT51Lm1pc3NlZF9iZWFjb247Ci0JaWYgKGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPmNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zKSA+Ci0JICAgIHByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LAotCQkgICAgIm1pc3NlZCBiY24gY25zcSAlZCB0b3RsICVkIHJjZCAlZCBleHBjdGQgJWRcbiIsCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyksCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT50b3RhbF9taXNzZWRfYmVjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9yZWN2ZF9iZWFjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9leHBlY3RlZF9iZWFjb25zKSk7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQl9Ci19Ci0KLS8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAotICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKLSAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2NhbGNfbm9pc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0JaW50IG51bV9hY3RpdmVfcnggPSAwOwotCWludCB0b3RhbF9zaWxlbmNlID0gMDsKLQlpbnQgYmNuX3NpbGVuY2VfYSwgYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYzsKLQlpbnQgbGFzdF9yeF9ub2lzZTsKLQotCXJ4X2luZm8gPSAmKHByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguZ2VuZXJhbCk7Ci0JYmNuX3NpbGVuY2VfYSA9Ci0JCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKLQliY25fc2lsZW5jZV9iID0KLQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOwotCWJjbl9zaWxlbmNlX2MgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7Ci0KLQlpZiAoYmNuX3NpbGVuY2VfYSkgewotCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2E7Ci0JCW51bV9hY3RpdmVfcngrKzsKLQl9Ci0JaWYgKGJjbl9zaWxlbmNlX2IpIHsKLQkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9iOwotCQludW1fYWN0aXZlX3J4Kys7Ci0JfQotCWlmIChiY25fc2lsZW5jZV9jKSB7Ci0JCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYzsKLQkJbnVtX2FjdGl2ZV9yeCsrOwotCX0KLQotCS8qIEF2ZXJhZ2UgYW1vbmcgYWN0aXZlIGFudGVubmFzICovCi0JaWYgKG51bV9hY3RpdmVfcngpCi0JCWxhc3Rfcnhfbm9pc2UgPSAodG90YWxfc2lsZW5jZSAvIG51bV9hY3RpdmVfcngpIC0gMTA3OwotCWVsc2UKLQkJbGFzdF9yeF9ub2lzZSA9IElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEU7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImluYmFuZCBzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIGRCbSAlZFxuIiwKLQkJCWJjbl9zaWxlbmNlX2EsIGJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2MsCi0JCQlsYXN0X3J4X25vaXNlKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0vKgotICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0aXN0aWNzIGNvdW50ZXIgYXJlIGluIERXT1JECi0gKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aAotICogIHRoZSBjYXNlIG9mIGNvdW50ZXJzIHJvbGwtb3Zlci4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCV9fbGUzMiAqc3RhdHMpCi17Ci0JaW50IGksIHNpemU7Ci0JX19sZTMyICpwcmV2X3N0YXRzOwotCXUzMiAqYWNjdW1fc3RhdHM7Ci0JdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHg7Ci0KLQlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSZwcml2LT5fNDk2NS5zdGF0aXN0aWNzOwotCWFjY3VtX3N0YXRzID0gKHUzMiAqKSZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKTsKLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOwotCXR4ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MudHg7Ci0JYWNjdW1fdHggPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy50eDsKLQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljczsKLQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPl80OTY1Lm1heF9kZWx0YTsKLQotCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZTsKLQkgICAgIGkgKz0gc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywKLQkgICAgIG1heF9kZWx0YSsrLCBhY2N1bV9zdGF0cysrKSB7Ci0JCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7Ci0JCQkqZGVsdGEgPSAobGUzMl90b19jcHUoKnN0YXRzKSAtCi0JCQkJbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKLQkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7Ci0JCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKLQkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRpc3RpY3MgKi8KLQlhY2N1bV9nZW5lcmFsLT50ZW1wZXJhdHVyZSA9IGdlbmVyYWwtPnRlbXBlcmF0dXJlOwotCWFjY3VtX2dlbmVyYWwtPnR0bF90aW1lc3RhbXAgPSBnZW5lcmFsLT50dGxfdGltZXN0YW1wOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKLQotdm9pZCBpd2w0OTY1X3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0JaW50IGNoYW5nZTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCUlXTF9ERUJVR19SWChwcml2LAotCQkgICAgICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpLAotCQkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYKLQkJICAgICBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7Ci0KLQljaGFuZ2UgPSAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KLQkJICAgcGt0LT51LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSB8fAotCQkgICAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spICE9Ci0JCSAgIChwa3QtPnUuc3RhdHMuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpd2w0OTY1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnN0YXRzKTsKLSNlbmRpZgotCi0JLyogVE9ETzogcmVhZGluZyBzb21lIG9mIHN0YXRpc3RpY3MgaXMgdW5uZWVkZWQgKi8KLQltZW1jcHkoJnByaXYtPl80OTY1LnN0YXRpc3RpY3MsICZwa3QtPnUuc3RhdHMsCi0JCXNpemVvZihwcml2LT5fNDk2NS5zdGF0aXN0aWNzKSk7Ci0KLQlzZXRfYml0KFNUQVRVU19TVEFUSVNUSUNTLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIFJlc2NoZWR1bGUgdGhlIHN0YXRpc3RpY3MgdGltZXIgdG8gb2NjdXIgaW4KLQkgKiBSRUdfUkVDQUxJQl9QRVJJT0Qgc2Vjb25kcyB0byBlbnN1cmUgd2UgZ2V0IGEKLQkgKiB0aGVybWFsIHVwZGF0ZSBldmVuIGlmIHRoZSB1Q29kZSBkb2Vzbid0IGdpdmUKLQkgKiB1cyBvbmUgKi8KLQltb2RfdGltZXIoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMsIGppZmZpZXMgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMoUkVHX1JFQ0FMSUJfUEVSSU9EICogMTAwMCkpOwotCi0JaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSAmJgotCSAgICAocGt0LT5oZHIuY21kID09IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OKSkgewotCQlpd2w0OTY1X3J4X2NhbGNfbm9pc2UocHJpdik7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7Ci0JfQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlKHByaXYpOwotfQotCi12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCWlmIChsZTMyX3RvX2NwdShwa3QtPnUuc3RhdHMuZmxhZykgJiBVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykgewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCW1lbXNldCgmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcywgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLQkJbWVtc2V0KCZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl80OTY1Lm1heF9kZWx0YSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLSNlbmRpZgotCQlJV0xfREVCVUdfUlgocHJpdiwgIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOwotCX0KLQlpd2w0OTY1X3J4X3N0YXRpc3RpY3MocHJpdiwgcnhiKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjJjMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotc3RhdGljIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqCi1pd2w0OTY1X3N0YV9hbGxvY19scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQlpbnQgaSwgcjsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXUzMiByYXRlX2ZsYWdzID0gMDsKLQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIExRIGNtZC5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCi0JICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCi0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJciA9IElXTF9SQVRFXzZNX0lOREVYOwotCWVsc2UKLQkJciA9IElXTF9SQVRFXzFNX0lOREVYOwotCi0JaWYgKHIgPj0gSVdMX0ZJUlNUX0NDS19SQVRFICYmIHIgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCXJhdGVfZmxhZ3MgfD0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIDw8Ci0JCQkJUkFURV9NQ1NfQU5UX1BPUzsKLQlyYXRlX25fZmxhZ3MgPSBpd2w0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MoaXdsZWdhY3lfcmF0ZXNbcl0ucGxjcCwKLQkJCQkJCSAgIHJhdGVfZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKQotCQlsaW5rX2NtZC0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYKLQkJfml3bDQ5NjVfZmlyc3RfYW50ZW5uYShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKLQlpZiAoIWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOwotCX0gZWxzZSBpZiAoaXdsNDk2NV9udW1fb2ZfYW50KHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKLQkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl9Ci0KLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfZGlzX3N0YXJ0X3RoID0gTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX0RFRjsKLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCA9Ci0JCWNwdV90b19sZTE2KExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYpOwotCi0JbGlua19jbWQtPnN0YV9pZCA9IHN0YV9pZDsKLQotCXJldHVybiBsaW5rX2NtZDsKLX0KLQotLyoKLSAqIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24gLSBBZGQgdGhlIHNwZWNpYWwgSUJTUyBCU1NJRCBzdGF0aW9uCi0gKgotICogRnVuY3Rpb24gc2xlZXBzLgotICovCi1pbnQKLWl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKQotewotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzdGFfaWRfcikKLQkJKnN0YV9pZF9yID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQotCXJldCA9IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYWRkciwgMCwgTlVMTCwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBhZGRyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoc3RhX2lkX3IpCi0JCSpzdGFfaWRfciA9IHN0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0xPQ0FMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBTZXQgdXAgZGVmYXVsdCByYXRlIHNjYWxpbmcgdGFibGUgaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNLlxuIiwKLQkJCWFkZHIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfbHFfY21kKHByaXYsIGN0eCwgbGlua19jbWQsIENNRF9TWU5DLCB0cnVlKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkgICAgICBib29sIHNlbmRfaWZfZW1wdHkpCi17Ci0JaW50IGksIG5vdF9lbXB0eSA9IDA7Ci0JdTggYnVmZltzaXplb2Yoc3RydWN0IGl3bF93ZXBfY21kKSArCi0JCXNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYXTsKLQlzdHJ1Y3QgaXdsX3dlcF9jbWQgKndlcF9jbWQgPSAoc3RydWN0IGl3bF93ZXBfY21kICopYnVmZjsKLQlzaXplX3QgY21kX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2NtZCk7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGN0eC0+d2VwX2tleV9jbWQsCi0JCS5kYXRhID0gd2VwX2NtZCwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCi0JfTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQltZW1zZXQod2VwX2NtZCwgMCwgY21kX3NpemUgKwotCQkJKHNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVNfTUFYIDsgaSsrKSB7Ci0JCXdlcF9jbWQtPmtleVtpXS5rZXlfaW5kZXggPSBpOwotCQlpZiAoY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSkgewotCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBpOwotCQkJbm90X2VtcHR5ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXdlcF9jbWQtPmtleVtpXS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCQl9Ci0KLQkJd2VwX2NtZC0+a2V5W2ldLmtleV9zaXplID0gY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZTsKLQkJbWVtY3B5KCZ3ZXBfY21kLT5rZXlbaV0ua2V5WzNdLCBjdHgtPndlcF9rZXlzW2ldLmtleSwKLQkJCQljdHgtPndlcF9rZXlzW2ldLmtleV9zaXplKTsKLQl9Ci0KLQl3ZXBfY21kLT5nbG9iYWxfa2V5X3R5cGUgPSBXRVBfS0VZX1dFUF9UWVBFOwotCXdlcF9jbWQtPm51bV9rZXlzID0gV0VQX0tFWVNfTUFYOwotCi0JY21kX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2tleSkgKiBXRVBfS0VZU19NQVg7Ci0KLQljbWQubGVuID0gY21kX3NpemU7Ci0KLQlpZiAobm90X2VtcHR5IHx8IHNlbmRfaWZfZW1wdHkpCi0JCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kKHByaXYsICZjbWQpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGl3bDQ5NjVfc3RhdGljX3dlcGtleV9jbWQocHJpdiwgY3R4LCBmYWxzZSk7Ci19Ci0KLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX1dFUChwcml2LCAiUmVtb3ZpbmcgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCk7Ci0KLQltZW1zZXQoJmN0eC0+d2VwX2tleXNba2V5Y29uZi0+a2V5aWR4XSwgMCwgc2l6ZW9mKGN0eC0+d2VwX2tleXNbMF0pKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkiTm90IHNlbmRpbmcgUkVQTFlfV0VQS0VZIGNvbW1hbmQgZHVlIHRvIFJGS0lMTC5cbiIpOwotCQkvKiBidXQga2V5cyBpbiBkZXZpY2UgYXJlIGNsZWFyIGFueXdheSBzbyByZXR1cm4gc3VjY2VzcyAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIDEpOwotCUlXTF9ERUJVR19XRVAocHJpdiwgIlJlbW92ZSBkZWZhdWx0IFdFUCBrZXk6IGlkeD0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl8xMjggJiYKLQkgICAga2V5Y29uZi0+a2V5bGVuICE9IFdFUF9LRVlfTEVOXzY0KSB7Ci0JCUlXTF9ERUJVR19XRVAocHJpdiwgIkJhZCBXRVAga2V5IGxlbmd0aCAlZFxuIiwga2V5Y29uZi0+a2V5bGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RFRkFVTFQ7Ci0JcHJpdi0+c3RhdGlvbnNbY3R4LT5hcF9zdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOwotCi0JY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOwotCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKLQkJCQkJCQlrZXljb25mLT5rZXlsZW4pOwotCi0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIGZhbHNlKTsKLQlJV0xfREVCVUdfV0VQKHByaXYsICJTZXQgZGVmYXVsdCBXRVAga2V5OiBsZW49JWQgaWR4PSVkIHJldD0lZFxuIiwKLQkJa2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkJdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfV0VQIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoa2V5Y29uZi0+a2V5bGVuID09IFdFUF9LRVlfTEVOXzEyOCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSzsKLQotCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCi0JCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5aWR4ID0ga2V5Y29uZi0+a2V5aWR4OwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksCi0JCQkJa2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOwotCi0JbWVtY3B5KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5WzNdLAotCQkJCWtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKQotCQkJPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9Ci0JCQkJIGl3bF9sZWdhY3lfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JICogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCQkgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19DQ01QIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQotCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCSBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJCSB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQlfX2xlMTYga2V5X2ZsYWdzID0gMDsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKLQlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7Ci0Ja2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOwotCi0JaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKLQotCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCi0KLQkvKiBUaGlzIGNvcHkgaXMgYWN1dGFsbHkgbm90IG5lZWRlZDogd2UgZ2V0IHRoZSBrZXkgd2l0aCBlYWNoIFRYICovCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCi17Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KSkgewotCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5Ci0JCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIGN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHRha1tpXSA9Ci0JCQljcHVfdG9fbGUxNihwaGFzZTFrZXlbaV0pOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCWl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotaW50IGl3bDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJICAgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGtleV9mbGFnczsKLQl1OCBrZXlpZHg7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JY3R4LT5rZXlfbWFwcGluZ19rZXlzLS07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzKTsKLQlrZXlpZHggPSAoa2V5X2ZsYWdzID4+IFNUQV9LRVlfRkxHX0tFWUlEX1BPUykgJiAweDM7Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsICJSZW1vdmUgZHluYW1pYyBrZXk6IGlkeD0lZCBzdGE9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkKTsKLQotCWlmIChrZXljb25mLT5rZXlpZHggIT0ga2V5aWR4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gcmVtb3ZlIGEga2V5IHdpdGggaW5kZXggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQotCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcwotCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGluZGV4LgotCQkgKiBEb24ndCBkbyBhbnl0aGluZyBhbmQgcmV0dXJuIG9rCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJSZW1vdmluZyB3cm9uZyBrZXkgJWQgMHgleFxuIiwKLQkJCSAgICBrZXljb25mLT5rZXlpZHgsIGtleV9mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0LAotCQkmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKLQkJSVdMX0VSUihwcml2LCAiaW5kZXggJWQgbm90IHVzZWQgaW4gdUNvZGUga2V5IHRhYmxlLlxuIiwKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9Ci0JCQlTVEFfS0VZX0ZMR19OT19FTkMgfCBTVEFfS0VZX0ZMR19JTlZBTElEOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkgIk5vdCBzZW5kaW5nIFJFUExZX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQotewotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQljdHgtPmtleV9tYXBwaW5nX2tleXMrKzsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RZTkFNSUM7Ci0KLQlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHByaXYsIGN0eCwKLQkJCQkJCQlrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXJldCA9IGl3bDQ5NjVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBjdHgsCi0JCQkJCQkJa2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwgY3R4LAotCQkJCQkJCWtleWNvbmYsIHN0YV9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmtub3duIGFsZzogJXMgY2lwaGVyID0gJXhcbiIsIF9fZnVuY19fLAotCQkJa2V5Y29uZi0+Y2lwaGVyKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsCi0JCSJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmNpcGhlciwga2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsCi0JCSAgICAgIHN0YV9pZCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uIC0gYWRkIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gZHJpdmVyJ3Mgc3RhdGlvbiB0YWJsZS4KLSAqCi0gKiBUaGlzIGFkZHMgdGhlIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gdGhlIGRyaXZlcidzIHN0YXRpb24gdGFibGUKLSAqIGFuZCBtYXJrcyBpdCBkcml2ZXIgYWN0aXZlLCBzbyB0aGF0IGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhlCi0gKiBkZXZpY2UgYXQgdGhlIG5leHQgYmVzdCB0aW1lLgotICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBzdGFfaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihwcml2LCBjdHgsIGl3bGVnYWN5X2JjYXN0X2FkZHIsCi0JCQkJCQkJCWZhbHNlLCBOVUxMKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIHByZXBhcmUgYnJvYWRjYXN0IHN0YXRpb25cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfQkNBU1Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9uIC0gdXBkYXRlIGJyb2FkY2FzdCBzdGF0aW9uJ3MgTFEgY29tbWFuZAotICoKLSAqIE9ubHkgdXNlZCBieSBpd2w0OTY1LiBQbGFjZWQgaGVyZSB0byBoYXZlIGFsbCBiY2FzdCBzdGF0aW9uIG1hbmFnZW1lbnQKLSAqIGNvZGUgdG9nZXRoZXIuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXU4IHN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCi0JbGlua19jbWQgPSBpd2w0OTY1X3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOwotCWlmICghbGlua19jbWQpIHsKLQkJSVdMX0VSUihwcml2LAotCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nIGZvciBiY2FzdCBzdGF0aW9uLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKQotCQlrZnJlZShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJCY2FzdCBzdGF0aW9uIHJhdGUgc2NhbGluZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuIik7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCByZXQgPSAwOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJcmV0ID0gaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZCAtIEVuYWJsZSBUeCBmb3IgdGhpcyBUSUQgaW4gc3RhdGlvbiB0YWJsZQotICovCi1pbnQgaXdsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JLyogUmVtb3ZlICJkaXNhYmxlIiBmbGFnLCB0byBlbmFibGUgVHggZm9yIHRoaXMgVElEICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS50aWRfZGlzYWJsZV90eCAmPSBjcHVfdG9fbGUxNih+KDEgPDwgdGlkKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSBpbnQgdGlkLCB1MTYgc3NuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpdGlkOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY3B1X3RvX2xlMTYoc3NuKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLWludCBpd2w0OTY1X3N0YV9yeF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQlpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHN0YXRpb24gZm9yIEFHRyB0aWQgJWRcbiIsIHRpZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSAwOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfREVMQkFfVElEX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCl0aWQ7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXZvaWQKLWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCBjbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgfD0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPQotCQkJCQlTVEFfTU9ESUZZX1NMRUVQX1RYX0NPVU5UX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwKLQkJCQkmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTJlMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC00OTY1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotLyoKLSAqIG1hYzgwMjExIHF1ZXVlcywgQUNzLCBoYXJkd2FyZSBxdWV1ZXMsIEZJRk9zLgotICoKLSAqIENmLiBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL0RvY3VtZW50YXRpb24vbWFjODAyMTEvcXVldWVzCi0gKgotICogTWFjODAyMTEgdXNlcyB0aGUgZm9sbG93aW5nIG51bWJlcnMsIHdoaWNoIHdlIGdldCBhcyBmcm9tIGl0Ci0gKiBieSB3YXkgb2Ygc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik6Ci0gKgotICoJVk8JMAotICoJVkkJMQotICoJQkUJMgotICoJQksJMwotICoKLSAqCi0gKiBSZWd1bGFyIChub3QgQS1NUERVKSBmcmFtZXMgYXJlIHB1dCBpbnRvIGhhcmR3YXJlIHF1ZXVlcyBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgRklGT3MsIHNlZSBjb21tZW50cyBpbiBpd2wtcHJwaC5oLiBBZ2dyZWdhdGVkIGZyYW1lcyBnZXQgdGhlaXIKLSAqIG93biBxdWV1ZSBwZXIgYWdncmVnYXRpb24gc2Vzc2lvbiAoUkEvVElEIGNvbWJpbmF0aW9uKSwgc3VjaCBxdWV1ZXMgYXJlCi0gKiBzZXQgdXAgdG8gbWFwIGludG8gRklGT3MgdG9vLCBmb3Igd2hpY2ggd2UgbmVlZCBhbiBBQy0+RklGTyBtYXBwaW5nLiBJbgotICogb3JkZXIgdG8gbWFwIGZyYW1lcyB0byB0aGUgcmlnaHQgcXVldWUsIHdlIGFsc28gbmVlZCBhbiBBQy0+aHcgcXVldWUKLSAqIG1hcHBpbmcuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZS4KLSAqCi0gKiBEdWUgdG8gdGhlIHdheSBodyBxdWV1ZXMgYXJlIHNldCB1cCAoYnkgdGhlIGh3IHNwZWNpZmljIG1vZHVsZXMgbGlrZQotICogaXdsLTQ5NjUuYyksIHRoZSBBQy0+aHcgcXVldWUgbWFwcGluZyBpcyB0aGUgaWRlbnRpdHkKLSAqIG1hcHBpbmcuCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IHRpZF90b19hY1tdID0gewotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfQkssCi0JSUVFRTgwMjExX0FDX0JLLAotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfVkksCi0JSUVFRTgwMjExX0FDX1ZJLAotCUlFRUU4MDIxMV9BQ19WTywKLQlJRUVFODAyMTFfQUNfVk8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gdGlkX3RvX2FjW3RpZF07Ci0KLQkvKiBubyBzdXBwb3J0IGZvciBUSURzIDgtMTUgeWV0ICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsIHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gY3R4LT5hY190b19maWZvW3RpZF90b19hY1t0aWRdXTsKLQotCS8qIG5vIHN1cHBvcnQgZm9yIFRJRHMgOC0xNSB5ZXQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoKLSAqIGhhbmRsZSBidWlsZCBSRVBMWV9UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJCXU4IHN0ZF9pZCkKLXsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0JX19sZTMyIHR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKLQotCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgotCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7Ci0JfSBlbHNlIHsKLQkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOwotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWlmIChpZWVlODAyMTFfaXNfYmFja19yZXEoZmMpKQotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0sgfCBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSzsKLQotCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwotCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7Ci0KLQl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOwotCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOwotCQllbHNlCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOwotCX0gZWxzZSB7Ci0JCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKLQl9Ci0KLQl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0JdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Ci19Ci0KLSNkZWZpbmUgUlRTX0RGQVVMVF9SRVRSWV9MSU1JVAkJNjAKLQotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJICAgICAgX19sZTE2IGZjKQotewotCXUzMiByYXRlX2ZsYWdzOwotCWludCByYXRlX2lkeDsKLQl1OCBydHNfcmV0cnlfbGltaXQ7Ci0JdTggZGF0YV9yZXRyeV9saW1pdDsKLQl1OCByYXRlX3BsY3A7Ci0KLQkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMqLwotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCWRhdGFfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJZGF0YV9yZXRyeV9saW1pdCA9IElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWTsKLQl0eF9jbWQtPmRhdGFfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OwotCi0JLyogU2V0IHJldHJ5IGxpbWl0IG9uIFJUUyBwYWNrZXRzICovCi0JcnRzX3JldHJ5X2xpbWl0ID0gUlRTX0RGQVVMVF9SRVRSWV9MSU1JVDsKLQlpZiAoZGF0YV9yZXRyeV9saW1pdCA8IHJ0c19yZXRyeV9saW1pdCkKLQkJcnRzX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IHJ0c19yZXRyeV9saW1pdDsKLQotCS8qIERBVEEgcGFja2V0cyB3aWxsIHVzZSB0aGUgdUNvZGUgc3RhdGlvbiB0YWJsZSBmb3IgcmF0ZS9hbnRlbm5hCi0JICogc2VsZWN0aW9uICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQl0eF9jbWQtPmluaXRpYWxfcmF0ZV9pbmRleCA9IDA7Ci0JCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TVEFfUkFURV9NU0s7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCBUWCByYXRlIHN0b3JlZCBpbiBtYWM4MDIxMSBoYXMgdGhlIE1DUyBiaXQgc2V0LCBpdCdzCi0JICogbm90IHJlYWxseSBhIFRYIHJhdGUuICBUaHVzLCB3ZSB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgcmF0ZSBmb3IKLQkgKiB0aGlzIGJhbmQuICBBbHNvIHVzZSB0aGUgbG93ZXN0IHN1cHBvcnRlZCByYXRlIGlmIHRoZSBzdG9yZWQgcmF0ZQotCSAqIGluZGV4IGlzIGludmFsaWQuCi0JICovCi0JcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKLQlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgfHwKLQkJCShyYXRlX2lkeCA8IDApIHx8IChyYXRlX2lkeCA+IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkpCi0JCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoJnByaXYtPmJhbmRzW2luZm8tPmJhbmRdLAotCQkJCWluZm8tPmNvbnRyb2wuc3RhKTsKLQkvKiBGb3IgNSBHSFogYmFuZCwgcmVtYXAgbWFjODAyMTEgcmF0ZSBpbmRpY2VzIGludG8gZHJpdmVyIGluZGljZXMgKi8KLQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCS8qIEdldCBQTENQIHJhdGUgZm9yIHR4X2NtZC0+cmF0ZV9uX2ZsYWdzICovCi0JcmF0ZV9wbGNwID0gaXdsZWdhY3lfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7Ci0JLyogWmVybyBvdXQgZmxhZ3MgZm9yIHRoaXMgcGFja2V0ICovCi0JcmF0ZV9mbGFncyA9IDA7Ci0KLQkvKiBTZXQgQ0NLIGZsYWcgYXMgbmVlZGVkICovCi0JaWYgKChyYXRlX2lkeCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlX2lkeCA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCS8qIFNldCB1cCBhbnRlbm5hcyAqLwotCXByaXYtPm1nbXRfdHhfYW50ID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPm1nbXRfdHhfYW50LAotCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JcmF0ZV9mbGFncyB8PSBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwotCi0JLyogU2V0IHRoZSByYXRlIGluIHRoZSBUWCBjbWQgKi8KLQl0eF9jbWQtPnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlX3BsY3AsIHJhdGVfZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnLAotCQkJCSAgICAgIGludCBzdGFfaWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OwotCi0Jc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfQ0NNOwotCQltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0s7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfVEtJUDsKLQkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOwotCQlJV0xfREVCVUdfVFgocHJpdiwgInR4X2NtZCB3aXRoIHRraXAgaHdjcnlwdG9cbiIpOwotCQlicmVhazsKLQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19LRVkxMjg7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCXR4X2NtZC0+c2VjX2N0bCB8PSAoVFhfQ01EX1NFQ19XRVAgfAotCQkJKGtleWNvbmYtPmtleWlkeCAmIFRYX0NNRF9TRUNfTVNLKSA8PCBUWF9DTURfU0VDX1NISUZUKTsKLQotCQltZW1jcHkoJnR4X2NtZC0+a2V5WzNdLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7Ci0KLQkJSVdMX0RFQlVHX1RYKHByaXYsICJDb25maWd1cmluZyBwYWNrZXQgZm9yIFdFUCBlbmNyeXB0aW9uICIKLQkJCSAgICAgIndpdGgga2V5ICVkXG4iLCBrZXljb25mLT5rZXlpZHgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5Y29uZi0+Y2lwaGVyKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogc3RhcnQgUkVQTFlfVFggY29tbWFuZCBwcm9jZXNzCi0gKi8KLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGluZm8tPmNvbnRyb2wuc3RhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQ7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgdHhxX2lkOwotCWRtYV9hZGRyX3QgcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgdHhjbWRfcGh5czsKLQlkbWFfYWRkcl90IHNjcmF0Y2hfcGh5czsKLQl1MTYgbGVuLCBmaXJzdGxlbiwgc2Vjb25kbGVuOwotCXUxNiBzZXFfbnVtYmVyID0gMDsKLQlfX2xlMTYgZmM7Ci0JdTggaGRyX2xlbjsKLQl1OCBzdGFfaWQ7Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXU4IHRpZCA9IDA7Ci0JdTggKnFjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgaXNfYWdnID0gZmFsc2U7Ci0KLQlpZiAoaW5mby0+Y29udHJvbC52aWYpCi0JCWN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYoaW5mby0+Y29udHJvbC52aWYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkRyb3BwaW5nIC0gUkYgS0lMTFxuIik7Ci0JCWdvdG8gZHJvcF91bmxvY2s7Ci0JfQotCi0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVVUSCBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOwotI2VuZGlmCi0KLQloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7Ci0KLQkvKiBGb3IgbWFuYWdlbWVudCBmcmFtZXMgdXNlIGJyb2FkY2FzdCBpZCB0byBkbyBub3QgYnJlYWsgYWdncmVnYXRpb24gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkKLQkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7Ci0JZWxzZSB7Ci0JCS8qIEZpbmQgaW5kZXggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCi0JCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdChwcml2LCBjdHgsIGluZm8tPmNvbnRyb2wuc3RhKTsKLQotCQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAotCQkJCSAgICAgICBoZHItPmFkZHIxKTsKLQkJCWdvdG8gZHJvcF91bmxvY2s7Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7Ci0KLQlpZiAoc3RhKQotCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+YXNsZWVwICYmCi0JICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUE9MTF9SRVNQT05TRSkpIHsKLQkJLyoKLQkJICogVGhpcyBzZW5kcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgZGV2aWNlLAotCQkgKiBidXQgd2UgY2FuIHJlbHkgb24gaXQgYmVpbmcgcHJvY2Vzc2VkIGJlZm9yZSB0aGUKLQkJICogbmV4dCBmcmFtZSBpcyBwcm9jZXNzZWQgLS0gYW5kIHRoZSBuZXh0IGZyYW1lIHRvCi0JCSAqIHRoaXMgc3RhdGlvbiBpcyB0aGUgb25lIHRoYXQgd2lsbCBjb25zdW1lIHRoaXMKLQkJICogY291bnRlci4KLQkJICogRm9yIG5vdyBzZXQgdGhlIGNvdW50ZXIgdG8ganVzdCAxIHNpbmNlIHdlIGRvIG5vdAotCQkgKiBzdXBwb3J0IHVBUFNEIHlldC4KLQkJICovCi0JCWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChwcml2LCBzdGFfaWQsIDEpOwotCX0KLQotCS8qCi0JICogU2VuZCB0aGlzIGZyYW1lIGFmdGVyIERUSU0gLS0gdGhlcmUncyBhIHNwZWNpYWwgcXVldWUKLQkgKiByZXNlcnZlZCBmb3IgdGhpcyBmb3IgY29udGV4dHMgdGhhdCBzdXBwb3J0IEFQIG1vZGUuCi0JICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9TRU5EX0FGVEVSX0RUSU0pIHsKLQkJdHhxX2lkID0gY3R4LT5tY2FzdF9xdWV1ZTsKLQkJLyoKLQkJICogVGhlIG1pY3JvY29kZSB3aWxsIGNsZWFyIHRoZSBtb3JlIGRhdGEKLQkJICogYml0IGluIHRoZSBsYXN0IGZyYW1lIGl0IHRyYW5zbWl0cy4KLQkJICovCi0JCWhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpOwotCX0gZWxzZQotCQl0eHFfaWQgPSBjdHgtPmFjX3RvX3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKLQotCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC9zYXZlZCBhYm92ZSB3aGVuIGxvY2tpbmcgcHJpdi0+bG9jayAqLwotCXNwaW5fbG9jaygmcHJpdi0+c3RhX2xvY2spOwotCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKLQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpIHsKLQkJCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0JCQlnb3RvIGRyb3BfdW5sb2NrOwotCQl9Ci0JCXNlcV9udW1iZXIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXI7Ci0JCXNlcV9udW1iZXIgJj0gSUVFRTgwMjExX1NDVExfU0VROwotCQloZHItPnNlcV9jdHJsID0gaGRyLT5zZXFfY3RybCAmCi0JCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7Ci0JCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoc2VxX251bWJlcik7Ci0JCXNlcV9udW1iZXIgKz0gMHgxMDsKLQkJLyogYWdncmVnYXRpb24gaXMgb24gZm9yIHRoaXMgPHN0YSx0aWQ+ICovCi0JCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgJiYKLQkJICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID09IElXTF9BR0dfT04pIHsKLQkJCXR4cV9pZCA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnR4cV9pZDsKLQkJCWlzX2FnZyA9IHRydWU7Ci0JCX0KLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7Ci0KLQlpZiAodW5saWtlbHkoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpIHsKLQkJc3Bpbl91bmxvY2soJnByaXYtPnN0YV9sb2NrKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUrKzsKLQkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXIgPSBzZXFfbnVtYmVyOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0KLQkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9IGN0eDsKLQotCS8qIFNldCB1cCBmaXJzdCBlbXB0eSBlbnRyeSBpbiBxdWV1ZSdzIGFycmF5IG9mIFR4L2NtZCBidWZmZXJzICovCi0Jb3V0X2NtZCA9IHR4cS0+Y21kW3EtPndyaXRlX3B0cl07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW3EtPndyaXRlX3B0cl07Ci0JdHhfY21kID0gJm91dF9jbWQtPmNtZC50eDsKLQltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkpOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCi0JICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7Ci0JICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCi0JICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCi0JICovCi0Jb3V0X2NtZC0+aGRyLmNtZCA9IFJFUExZX1RYOwotCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9IGNwdV90b19sZTE2KCh1MTYpKFFVRVVFX1RPX1NFUSh0eHFfaWQpIHwKLQkJCQlJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOwotCi0JLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KLQltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7Ci0KLQotCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQlsZW4gPSAodTE2KXNrYi0+bGVuOwotCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKLQotCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKLQkJaXdsNDk2NV90eF9jbWRfYnVpbGRfaHdjcnlwdG8ocHJpdiwgaW5mbywgdHhfY21kLCBza2IsIHN0YV9pZCk7Ci0KLQkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLwotCWl3bDQ5NjVfdHhfY21kX2J1aWxkX2Jhc2ljKHByaXYsIHNrYiwgdHhfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7Ci0JaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZHIpOwotCi0JaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShwcml2LCB0eF9jbWQsIGluZm8sIGZjKTsKLQotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIHRydWUsIGZjLCBsZW4pOwotCS8qCi0JICogVXNlIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSBpbiB0aGlzIHF1ZXVlJ3MgY29tbWFuZCBidWZmZXIgYXJyYXkKLQkgKiB0byBjb250YWluIHRoZSBUeCBjb21tYW5kIGFuZCBNQUMgaGVhZGVyIGNvbmNhdGVuYXRlZCB0b2dldGhlcgotCSAqIChwYXlsb2FkIGRhdGEgd2lsbCBiZSBpbiBhbm90aGVyIGJ1ZmZlcikuCi0JICogU2l6ZSBvZiB0aGlzIHZhcmllcywgZHVlIHRvIHZhcnlpbmcgTUFDIGhlYWRlciBsZW5ndGguCi0JICogSWYgZW5kIGlzIG5vdCBkd29yZCBhbGlnbmVkLCB3ZSdsbCBoYXZlIDIgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAotCSAqIG9mIHRoZSBNQUMgaGVhZGVyIChkZXZpY2UgcmVhZHMgb24gZHdvcmQgYm91bmRhcmllcykuCi0JICogV2UnbGwgdGVsbCBkZXZpY2UgYWJvdXQgdGhpcyBwYWRkaW5nIGxhdGVyLgotCSAqLwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkgKwotCQlzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArIGhkcl9sZW47Ci0JZmlyc3RsZW4gPSAobGVuICsgMykgJiB+MzsKLQotCS8qIFRlbGwgTklDIGFib3V0IGFueSAyLWJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyICovCi0JaWYgKGZpcnN0bGVuICE9IGxlbikKLQkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX01IX1BBRF9NU0s7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKLQkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCi0JdHhjbWRfcGh5cyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJICAgICZvdXRfY21kLT5oZHIsIGZpcnN0bGVuLAotCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgdHhjbWRfcGh5cyk7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZmlyc3RsZW4pOwotCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCi0JICogZmlyc3QgZW50cnkgKi8KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgdHhjbWRfcGh5cywgZmlyc3RsZW4sIDEsIDApOwotCi0JaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCX0gZWxzZSB7Ci0JCXdhaXRfd3JpdGVfcHRyID0gMTsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0JfQotCi0JLyogU2V0IHVwIFRGRCdzIDJuZCBlbnRyeSB0byBwb2ludCBkaXJlY3RseSB0byByZW1haW5kZXIgb2Ygc2tiLAotCSAqIGlmIGFueSAoODAyLjExIG51bGwgZnJhbWVzIGhhdmUgbm8gcGF5bG9hZCkuICovCi0Jc2Vjb25kbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwotCWlmIChzZWNvbmRsZW4gPiAwKSB7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sCi0JCQkJCSAgIHNlY29uZGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkJICAgcGh5c19hZGRyLCBzZWNvbmRsZW4sCi0JCQkJCQkJICAgMCwgMCk7Ci0JfQotCi0Jc2NyYXRjaF9waHlzID0gdHhjbWRfcGh5cyArIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaXdsX3R4X2NtZCwgc2NyYXRjaCk7Ci0KLQkvKiB0YWtlIGJhY2sgb3duZXJzaGlwIG9mIERNQSBidWZmZXIgdG8gZW5hYmxlIHVwZGF0ZSAqLwotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wY2lfZGV2LCB0eGNtZF9waHlzLAotCQkJCSAgICBmaXJzdGxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQl0eF9jbWQtPmRyYW1fbHNiX3B0ciA9IGNwdV90b19sZTMyKHNjcmF0Y2hfcGh5cyk7Ci0JdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpd2xfbGVnYWN5X2dldF9kbWFfaGlfYWRkcihzY3JhdGNoX3BoeXMpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsCi0JCSAgICAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7Ci0JSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9mbGFncyA9IDBYJXhcbiIsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1RYLCAodTggKil0eF9jbWQsIHNpemVvZigqdHhfY21kKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLT5oZHIsIGhkcl9sZW4pOwotCi0JLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwocHJpdiwgdHhxLAotCQkJCQkJICAgICBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbikpOwotCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHByaXYtPnBjaV9kZXYsIHR4Y21kX3BoeXMsCi0JCQkJICAgICAgIGZpcnN0bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3R4KHByaXYsCi0JCQkgICAgICYoKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzKVt0eHEtPnEud3JpdGVfcHRyXSwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSwKLQkJCSAgICAgJm91dF9jbWQtPmhkciwgZmlyc3RsZW4sCi0JCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNlY29uZGxlbik7Ci0KLQkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaW5kZXggKmp1c3QgcGFzdCogdGhpcyBsYXRlc3QgZmlsbGVkIFRGRCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKLQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQotCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCi0JICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KLQkgKi8KLQotCS8qCi0JICogQXZvaWQgYXRvbWljIG9wcyBpZiBpdCBpc24ndCBhbiBhc3NvY2lhdGVkIGNsaWVudC4KLQkgKiBBbHNvLCBpZiB0aGlzIGlzIGEgcGFja2V0IGZvciBhZ2dyZWdhdGlvbiwgZG9uJ3QKLQkgKiBpbmNyZWFzZSB0aGUgY291bnRlciBiZWNhdXNlIHRoZSB1Y29kZSB3aWxsIHN0b3AKLQkgKiBhZ2dyZWdhdGlvbiBxdWV1ZXMgd2hlbiB0aGVpciByZXNwZWN0aXZlIHN0YXRpb24KLQkgKiBnb2VzIHRvIHNsZWVwLgotCSAqLwotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+Y2xpZW50ICYmICFpc19hZ2cpCi0JCWF0b21pY19pbmMoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcyk7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspICYmCi0JCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWlmICh3YWl0X3dyaXRlX3B0cikgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJaXdsX2xlZ2FjeV9zdG9wX3F1ZXVlKHByaXYsIHR4cSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZHJvcF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsNDk2NV9hbGxvY19kbWFfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9kbWFfcHRyICpwdHIsIHNpemVfdCBzaXplKQotewotCXB0ci0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplLCAmcHRyLT5kbWEsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcHRyLT5hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwdHItPnNpemUgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsNDk2NV9mcmVlX2RtYV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX2RtYV9wdHIgKnB0cikKLXsKLQlpZiAodW5saWtlbHkoIXB0ci0+YWRkcikpCi0JCXJldHVybjsKLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHB0ci0+c2l6ZSwgcHRyLT5hZGRyLCBwdHItPmRtYSk7Ci0JbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKCpwdHIpKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3R4cV9jdHhfZnJlZSAtIEZyZWUgVFhRIENvbnRleHQKLSAqCi0gKiBEZXN0cm95IGFsbCBUWCBETUEgcXVldWVzIGFuZCBzdHJ1Y3R1cmVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQ7Ci0KLQkvKiBUeCBxdWV1ZXMgKi8KLQlpZiAocHJpdi0+dHhxKSB7Ci0JCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUocHJpdik7Ci0JCQllbHNlCi0JCQkJaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHByaXYsIHR4cV9pZCk7Ci0JfQotCWl3bDQ5NjVfZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7Ci0KLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotCi0JLyogZnJlZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KLQlpd2xfbGVnYWN5X3R4cV9tZW0ocHJpdik7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eHFfY3R4X2FsbG9jIC0gYWxsb2NhdGUgVFggcXVldWUgY29udGV4dAotICogQWxsb2NhdGUgYWxsIFR4IERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0KLSAqCi0gKiBAcGFyYW0gcHJpdgotICogQHJldHVybiBlcnJvciBjb2RlCi0gKi8KLWludCBpd2w0OTY1X3R4cV9jdHhfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0JaW50IHR4cV9pZCwgc2xvdHNfbnVtOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBGcmVlIGFsbCB0eC9jbWQgcXVldWVzIGFuZCBrZWVwLXdhcm0gYnVmZmVyICovCi0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlyZXQgPSBpd2w0OTY1X2FsbG9jX2RtYV9wdHIocHJpdiwgJnByaXYtPnNjZF9iY190YmxzLAotCQkJCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlNjaGVkdWxlciBCQyBUYWJsZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3JfYmNfdGJsczsKLQl9Ci0JLyogQWxsb2Mga2VlcC13YXJtIGJ1ZmZlciAqLwotCXJldCA9IGl3bDQ5NjVfYWxsb2NfZG1hX3B0cihwcml2LCAmcHJpdi0+a3csIElXTF9LV19TSVpFKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIktlZXAgV2FybSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3Jfa3c7Ci0JfQotCi0JLyogYWxsb2NhdGUgdHggcXVldWUgc3RydWN0dXJlICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCWl3bDQ5NjVfdHhxX3NldF9zY2hlZChwcml2LCAwKTsKLQotCS8qIFRlbGwgTklDIHdoZXJlIHRvIGZpbmQgdGhlICJrZWVwIHdhcm0iIGJ1ZmZlciAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfS1dfTUVNX0FERFJfUkVHLCBwcml2LT5rdy5kbWEgPj4gNCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBBbGxvYyBhbmQgaW5pdCBhbGwgVHggcXVldWVzLCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUgKCM0LyM5KSAqLwotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgewotCQlzbG90c19udW0gPSAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkgPwotCQkJCQlURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKLQkJcmV0ID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9pbml0KHByaXYsCi0JCQkJCSZwcml2LT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLAotCQkJCSAgICAgICB0eHFfaWQpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi0gZXJyb3I6Ci0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0JaXdsNDk2NV9mcmVlX2RtYV9wdHIocHJpdiwgJnByaXYtPmt3KTsKLSBlcnJvcl9rdzoKLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotIGVycm9yX2JjX3RibHM6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2w0OTY1X3R4cV9jdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQsIHNsb3RzX251bTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNCkgKi8KLQlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKLQkJc2xvdHNfbnVtID0gdHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSA/Ci0JCQkgICAgVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7Ci0JCWl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCQkJc2xvdHNfbnVtLCB0eHFfaWQpOwotCX0KLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV9jdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscwotICovCi12b2lkIGl3bDQ5NjVfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgY2gsIHR4cV9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCi0JZm9yIChjaCA9IDA7IGNoIDwgcHJpdi0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgewotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsCi0JCQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOwotCQlpZiAoaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBGSF9UU1NSX1RYX1NUQVRVU19SRUcsCi0JCQkJICAgIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKGNoKSwKLQkJCQkgICAgMTAwMCkpCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsaW5nIG9uIHRpbWVvdXQgd2hpbGUgc3RvcHBpbmciCi0JCQkgICAgIiBETUEgY2hhbm5lbCAlZCBbMHglMDh4XSIsIGNoLAotCQkJICAgIGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LAotCQkJCQlGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT50eHEpCi0JCXJldHVybjsKLQotCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQotCQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKHByaXYpOwotCQllbHNlCi0JCQlpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKHByaXYsIHR4cV9pZCk7Ci19Ci0KLS8qCi0gKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSAobG93ZXN0IHVudXNlZCkgVHggUXVldWUsIG1hcmsgaXQgImFjdGl2ZSIuCi0gKiBDYWxsZWQgb25seSB3aGVuIGZpbmRpbmcgcXVldWUgZm9yIGFnZ3JlZ2F0aW9uLgotICogU2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDcsIGJlY2F1c2UgdGhleSBzaG91bGQgYWxyZWFkeQotICogYmUgaW4gdXNlIGFzIEVEQ0EgQUMgKDAtMyksIENvbW1hbmQgKDQpLCByZXNlcnZlZCAoNSwgNikKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZDsKLQotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykpCi0JCQlyZXR1cm4gdHhxX2lkOwotCXJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyIC0gU3RvcCBxdWV1ZSwgYnV0IGtlZXAgY29uZmlndXJhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHUxNiB0eHFfaWQpCi17Ci0JLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOwotCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LAotCQlJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFModHhxX2lkKSwKLQkJKDAgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpfAotCQkoMSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkIC0gTWFwIHVuaXF1ZSByZWNlaXZlci90aWQgY29tYmluYXRpb24gdG8gYSBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgcmFfdGlkLAotCQkJCQl1MTYgdHhxX2lkKQotewotCXUzMiB0YmxfZHdfYWRkcjsKLQl1MzIgdGJsX2R3OwotCXUxNiBzY2RfcTJyYXRpZDsKLQotCXNjZF9xMnJhdGlkID0gcmFfdGlkICYgSVdMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSzsKLQotCXRibF9kd19hZGRyID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JCQlJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKLQotCXRibF9kdyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCB0YmxfZHdfYWRkcik7Ci0KLQlpZiAodHhxX2lkICYgMHgxKQotCQl0YmxfZHcgPSAoc2NkX3EycmF0aWQgPDwgMTYpIHwgKHRibF9kdyAmIDB4MDAwMEZGRkYpOwotCWVsc2UKLQkJdGJsX2R3ID0gc2NkX3EycmF0aWQgfCAodGJsX2R3ICYgMHhGRkZGMDAwMCk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHRibF9kd19hZGRyLCB0YmxfZHcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9xdWV1ZV9hZ2dfZW5hYmxlIC0gU2V0IHVwICYgZW5hYmxlIGFnZ3JlZ2F0aW9uIGZvciBzZWxlY3RlZCBxdWV1ZQotICoKLSAqIE5PVEU6ICB0eHFfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0gKiAgICAgICAgaS5lLiBpdCBtdXN0IGJlIG9uZSBvZiB0aGUgaGlnaGVyIHF1ZXVlcyB1c2VkIGZvciBhZ2dyZWdhdGlvbgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLAotCQkJCSAgaW50IHR4X2ZpZm8sIGludCBzdGFfaWQsIGludCB0aWQsIHUxNiBzc25faWR4KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhX3RpZDsKLQlpbnQgcmV0OwotCi0JaWYgKChJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKLQkgICAgKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyA8PSB0eHFfaWQpKSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCi0JCQl0eHFfaWQsIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFLAotCQkJSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyAtIDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYV90aWQgPSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpOwotCi0JLyogTW9kaWZ5IGRldmljZSdzIHN0YXRpb24gdGFibGUgdG8gVHggdGhpcyBUSUQgKi8KLQlyZXQgPSBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTdG9wIHRoaXMgVHggcXVldWUgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0ICovCi0JaXdsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihwcml2LCB0eHFfaWQpOwotCi0JLyogTWFwIHJlY2VpdmVyLWFkZHJlc3MgLyB0cmFmZmljLUlEIHRvIHRoaXMgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkKHByaXYsIHJhX3RpZCwgdHhxX2lkKTsKLQotCS8qIFNldCB0aGlzIHF1ZXVlIGFzIGEgY2hhaW4tYnVpbGRpbmcgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKLQotCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0IHNlcXVlbmNlIG51bWJlci4KLQkgKiBBc3N1bWVzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCWl3bDQ5NjVfc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKLQotCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsCi0JCXByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSwKLQkJKFNDRF9XSU5fU0laRSA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfUE9TKSAmCi0JCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOwotCi0JaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHR4cV9pZCkgKyBzaXplb2YodTMyKSwKLQkJKFNDRF9GUkFNRV9MSU1JVCA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKQotCQkmIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spOwotCi0JaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIElXTDQ5X1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7Ci0KLQkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAxKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpd2w0OTY1X3R4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKLXsKLQlpbnQgc3RhX2lkOwotCWludCB0eF9maWZvOwotCWludCB0eHFfaWQ7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCi0JdHhfZmlmbyA9IGl3bDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLCB0aWQpOwotCWlmICh1bmxpa2VseSh0eF9maWZvIDwgMCkpCi0JCXJldHVybiB0eF9maWZvOwotCi0JSVdMX1dBUk4ocHJpdiwgIiVzIG9uIHJhID0gJXBNIHRpZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YS0+YWRkciwgdGlkKTsKLQotCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkKHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IEFHRyBvbiBpbnZhbGlkIHN0YXRpb25cbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09GRikgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBBR0cgd2hlbiBzdGF0ZSBpcyBub3QgSVdMX0FHR19PRkYgIVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JdHhxX2lkID0gaXdsNDk2NV90eHFfY3R4X2FjdGl2YXRlX2ZyZWUocHJpdik7Ci0JaWYgKHR4cV9pZCA9PSAtMSkgewotCQlJV0xfRVJSKHByaXYsICJObyBmcmVlIGFnZ3JlZ2F0aW9uIHF1ZXVlIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQkqc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKLQl0aWRfZGF0YS0+YWdnLnR4cV9pZCA9IHR4cV9pZDsKLQlpd2xfbGVnYWN5X3NldF9zd3FfaWQoJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCWl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUocHJpdiwgdHhxX2lkLCB0eF9maWZvLAotCQkJCQkJICBzdGFfaWQsIHRpZCwgKnNzbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0JaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwotCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCSJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFcgcXVldWVcbiIsCi0JCQkgICAgIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKLQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHR4cV9pZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRQotICogcHJpdi0+bG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlcgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IHR4cV9pZCwKLQkJCQkgICB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKLXsKLQlpZiAoKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFID4gdHhxX2lkKSB8fAotCSAgICAoSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKLQkJCXR4cV9pZCwgSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0JCQlJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSArCi0JCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWl3bDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIocHJpdiwgdHhxX2lkKTsKLQotCWl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHByaXYsCi0JCQlJV0w0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsICgxIDw8IHR4cV9pZCkpOwotCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCS8qIHN1cHBvc2VzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JaXdsNDk2NV9zZXRfd3JfcHRycyhwcml2LCB0eHFfaWQsIHNzbl9pZHgpOwotCi0JaXdsX2xlZ2FjeV9jbGVhcl9iaXRzX3BycGgocHJpdiwKLQkJCSBJV0w0OV9TQ0RfSU5URVJSVVBUX01BU0ssICgxIDw8IHR4cV9pZCkpOwotCWl3bF90eHFfY3R4X2RlYWN0aXZhdGUocHJpdiwgdHhxX2lkKTsKLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV90eF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKQotewotCWludCB0eF9maWZvX2lkLCB0eHFfaWQsIHN0YV9pZCwgc3NuOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCWludCB3cml0ZV9wdHIsIHJlYWRfcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl0eF9maWZvX2lkID0gaXdsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7Ci0JaWYgKHVubGlrZWx5KHR4X2ZpZm9faWQgPCAwKSkKLQkJcmV0dXJuIHR4X2ZpZm9faWQ7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCi0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0Jc3NuID0gKHRpZF9kYXRhLT5zZXFfbnVtYmVyICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwotCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBlZXIgc3RvcHMgYWdncmVnYXRpb24KLQkJICogYWdhaW4gYmVmb3JlIHdlJ3ZlIGhhZCBhIGNoYW5jZSB0byBkcmFpbiB0aGUKLQkJICogcXVldWUgd2Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgaS5lLiBiZWZvcmUgdGhlCi0JCSAqIHNlc3Npb24gd2FzIHJlYWxseSBzdGFydGVkIGNvbXBsZXRlbHkuCi0JCSAqLwotCQlJV0xfREVCVUdfSFQocHJpdiwgIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKLQkJZ290byB0dXJuX29mZjsKLQljYXNlIElXTF9BR0dfT046Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9XQVJOKHByaXYsICJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OIG9yIHN0YXJ0aW5nXG4iKTsKLQl9Ci0KLQl3cml0ZV9wdHIgPSBwcml2LT50eHFbdHhxX2lkXS5xLndyaXRlX3B0cjsKLQlyZWFkX3B0ciA9IHByaXYtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHI7Ci0KLQkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCi0JaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0KLQkJCQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19IVChwcml2LCAiSFcgcXVldWUgaXMgZW1wdHlcbiIpOwotIHR1cm5fb2ZmOgotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0KLQkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KLQlzcGluX3VubG9jaygmcHJpdi0+c3RhX2xvY2spOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7Ci0KLQkvKgotCSAqIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGNhbGwgY2FuIGZhaWwgaXMgcXVldWUgbnVtYmVyIG91dCBvZiByYW5nZSwKLQkgKiB3aGljaCBjYW4gaGFwcGVuIGlmIHVDb2RlIGlzIHJlbG9hZGVkIGFuZCBhbGwgdGhlIHN0YXRpb24KLQkgKiBpbmZvcm1hdGlvbiBhcmUgbG9zdC4gaWYgaXQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRoZXJlIGlzIG5vIG5lZWQKLQkgKiB0byBkZWFjdGl2YXRlIHRoZSB1Q29kZSBxdWV1ZSwganVzdCByZXR1cm4gInN1Y2Nlc3MiIHRvIGFsbG93Ci0JICogIG1hYzgwMjExIHRvIGNsZWFuIHVwIGl0IG93biBkYXRhLgotCSAqLwotCWl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHByaXYsIHR4cV9pZCwgc3NuLCB0eF9maWZvX2lkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBpbnQgc3RhX2lkLCB1OCB0aWQsIGludCB0eHFfaWQpCi17Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZwcml2LT50eHFbdHhxX2lkXS5xOwotCXU4ICphZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JY3R4ID0gJnByaXYtPmNvbnRleHRzW3ByaXYtPnN0YXRpb25zW3N0YV9pZF0uY3R4aWRdOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c3RhX2xvY2spOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCi0JCS8qIGFnZ3JlZ2F0ZWQgSFcgcXVldWUgKi8KLQkJaWYgKCh0eHFfaWQgID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkKSAmJgotCQkgICAgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikpIHsKLQkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwotCQkJaW50IHR4X2ZpZm8gPSBpd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKGN0eCwgdGlkKTsKLQkJCUlXTF9ERUJVR19IVChwcml2LAotCQkJCSJIVyBxdWV1ZSBlbXB0eTogY29udGludWUgREVMQkEgZmxvd1xuIik7Ci0JCQlpd2w0OTY1X3R4cV9hZ2dfZGlzYWJsZShwcml2LCB0eHFfaWQsIHNzbiwgdHhfZmlmbyk7Ci0JCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlICovCi0JCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCQkiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIEFEREJBIGZsb3dcbiIpOwotCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047Ci0JCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCSAgICAgY29uc3QgdTggKmFkZHIxKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YShjdHgtPnZpZiwgYWRkcjEpOwotCWlmIChzdGEpIHsKLQkJc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JCS8qIGF2b2lkIGF0b21pYyBvcHMgaWYgdGhpcyBpc24ndCBhIGNsaWVudCAqLwotCQlpZiAoc3RhX3ByaXYtPmNsaWVudCAmJgotCQkgICAgYXRvbWljX2RlY19yZXR1cm4oJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcykgPT0gMCkKLQkJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UocHJpdi0+aHcsIHN0YSwgZmFsc2UpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQKLWl3bDQ5NjVfdHhfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9pbmZvICp0eF9pbmZvLAotCQkJICAgICBib29sIGlzX2FnZykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHR4X2luZm8tPnNrYi0+ZGF0YTsKLQotCWlmICghaXNfYWdnKQotCQlpd2w0OTY1X25vbl9hZ2dfdHhfc3RhdHVzKHByaXYsIHR4X2luZm8tPmN0eCwgaGRyLT5hZGRyMSk7Ci0KLQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIHR4X2luZm8tPnNrYik7Ci19Ci0KLWludCBpd2w0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhfaW5mbzsKLQlpbnQgbmZyZWVkID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCi0JaWYgKChpbmRleCA+PSBxLT5uX2JkKSB8fCAoaXdsX2xlZ2FjeV9xdWV1ZV91c2VkKHEsIGluZGV4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpbmRleCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGluZGV4LCBxLT5uX2JkKTsKLQkgICAgIHEtPnJlYWRfcHRyICE9IGluZGV4OwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewotCi0JCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKLQotCQlpZiAoV0FSTl9PTl9PTkNFKHR4X2luZm8tPnNrYiA9PSBOVUxMKSkKLQkJCWNvbnRpbnVlOwotCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJbmZyZWVkKys7Ci0KLQkJaXdsNDk2NV90eF9zdGF0dXMocHJpdiwgdHhfaW5mbywKLQkJCQkgdHhxX2lkID49IElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUpOwotCQl0eF9pbmZvLT5za2IgPSBOVUxMOwotCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChwcml2LCB0eHEpOwotCX0KLQlyZXR1cm4gbmZyZWVkOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEgLSBVcGRhdGUgdHggc3RhdHVzIGZyb20gYmxvY2stYWNrCi0gKgotICogR28gdGhyb3VnaCBibG9jay1hY2sncyBiaXRtYXAgb2YgQUNLJ2QgZnJhbWVzLCB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mCi0gKiBBQ0sgdnMuIG5vdC4gIFRoaXMgZ2V0cyBzZW50IHRvIG1hYzgwMjExLCB0aGVuIHRvIHJhdGUgc2NhbGluZyBhbGdvLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSBzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCkKLQotewotCWludCBpLCBzaCwgYWNrOwotCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7Ci0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCWludCBzdWNjZXNzZXMgPSAwOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQl1NjQgYml0bWFwLCBzZW50X2JpdG1hcDsKLQotCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpICB7Ci0JCWlmICh1bmxpa2VseShiYV9yZXNwLT5iaXRtYXApKQotCQkJSVdMX0VSUihwcml2LCAiUmVjZWl2ZWQgQkEgd2hlbiBub3QgZXhwZWN0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYXJrIHRoYXQgdGhlIGV4cGVjdGVkIGJsb2NrLWFjayByZXNwb25zZSBhcnJpdmVkICovCi0JYWdnLT53YWl0X2Zvcl9iYSA9IDA7Ci0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJCQSAlZCAlZFxuIiwgYWdnLT5zdGFydF9pZHgsCi0JCQkJCQkJYmFfcmVzcC0+c2VxX2N0bCk7Ci0KLQkvKiBDYWxjdWxhdGUgc2hpZnQgdG8gYWxpZ24gYmxvY2stYWNrIGJpdHMgd2l0aCBvdXIgVHggd2luZG93IGJpdHMgKi8KLQlzaCA9IGFnZy0+c3RhcnRfaWR4IC0gU0VRX1RPX0lOREVYKHNlcV9jdGwgPj4gNCk7Ci0JaWYgKHNoIDwgMCkgLyogdGJ3IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZGljZXMgKi8KLQkJc2ggKz0gMHgxMDA7Ci0KLQlpZiAoYWdnLT5mcmFtZV9jb3VudCA+ICg2NCAtIHNoKSkgewotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIm1vcmUgZnJhbWVzIHRoYW4gYml0bWFwIHNpemUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGRvbid0IHVzZSA2NC1iaXQgdmFsdWVzIGZvciBub3cgKi8KLQliaXRtYXAgPSBsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApID4+IHNoOwotCi0JLyogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY2NvcmRpbmcgdG8gdGhlCi0JICogdHJhbnNtaXR0ZWQgYml0bWFwIGFuZCBibG9jay1hY2sgYml0bWFwICovCi0Jc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKLQotCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKLQkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLwotCWkgPSAwOwotCXdoaWxlIChzZW50X2JpdG1hcCkgewotCQlhY2sgPSBzZW50X2JpdG1hcCAmIDFVTEw7Ci0JCXN1Y2Nlc3NlcyArPSBhY2s7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiJXMgT04gaT0lZCBpZHg9JWQgcmF3PSVkXG4iLAotCQkJYWNrID8gIkFDSyIgOiAiTkFDSyIsIGksCi0JCQkoYWdnLT5zdGFydF9pZHggKyBpKSAmIDB4ZmYsCi0JCQlhZ2ctPnN0YXJ0X2lkeCArIGkpOwotCQlzZW50X2JpdG1hcCA+Pj0gMTsKLQkJKytpOwotCX0KLQotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQml0bWFwICVsbHhcbiIsCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCi0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocHJpdi0+dHhxW3NjZF9mbG93XS50eGJbYWdnLT5zdGFydF9pZHhdLnNrYik7Ci0JbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKLQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPSBzdWNjZXNzZXM7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IGFnZy0+ZnJhbWVfY291bnQ7Ci0JaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChwcml2LCBhZ2ctPnJhdGVfbl9mbGFncywgaW5mbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0cmFuc2xhdGUgdWNvZGUgcmVzcG9uc2UgdG8gbWFjODAyMTEgdHggc3RhdHVzIGNvbnRyb2wgdmFsdWVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyID0gJmluZm8tPmNvbnRyb2wucmF0ZXNbMF07Ci0KLQlpbmZvLT5hbnRlbm5hX3NlbF90eCA9Ci0JCSgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+IFJBVEVfTUNTX0FOVF9QT1MpOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0dGX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7Ci0Jci0+aWR4ID0gaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHJhdGVfbl9mbGFncywgaW5mby0+YmFuZCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBseV9jb21wcmVzc2VkX2JhIC0gSGFuZGxlciBmb3IgUkVQTFlfQ09NUFJFU1NFRF9CQQotICoKLSAqIEhhbmRsZXMgYmxvY2stYWNrbm93bGVkZ2Ugbm90aWZpY2F0aW9uIGZyb20gZGV2aWNlLCB3aGljaCByZXBvcnRzIHN1Y2Nlc3MKLSAqIG9mIGZyYW1lcyBzZW50IHZpYSBhZ2dyZWdhdGlvbi4KLSAqLwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCA9ICZwa3QtPnUuY29tcHJlc3NlZF9iYTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOwotCXN0cnVjdCBpd2xfaHRfYWdnICphZ2c7Ci0JaW50IGluZGV4OwotCWludCBzdGFfaWQ7Ci0JaW50IHRpZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCi0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCi0JLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbmRvdywgY29ycmVzcG9uZHMgdG8gaW5kZXgKLQkgKiAoaW4gVHggcXVldWUncyBjaXJjdWxhciBidWZmZXIpIG9mIGZpcnN0IFRGRC9mcmFtZSBpbiB3aW5kb3cgKi8KLQl1MTYgYmFfcmVzcF9zY2Rfc3NuID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX3Nzbik7Ci0KLQlpZiAoc2NkX2Zsb3cgPj0gcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJCVUdfT04gc2NkX2Zsb3cgaXMgYmlnZ2VyIHRoYW4gbnVtYmVyIG9mIHF1ZXVlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3NjZF9mbG93XTsKLQlzdGFfaWQgPSBiYV9yZXNwLT5zdGFfaWQ7Ci0JdGlkID0gYmFfcmVzcC0+dGlkOwotCWFnZyA9ICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZzsKLQlpZiAodW5saWtlbHkoYWdnLT50eHFfaWQgIT0gc2NkX2Zsb3cpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAotCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdyEKLQkJICogc2luY2UgaXQgaXMgcG9zc2libGUgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCi0JCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IGVuYWJsZSB0aGUgbG9nZ2luZyBieSBkZWZhdWx0Ci0JCSAqLwotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKLQkJCSJCQSBzY2RfZmxvdyAlZCBkb2VzIG5vdCBtYXRjaCB0eHFfaWQgJWRcbiIsCi0JCQlzY2RfZmxvdywgYWdnLT50eHFfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRmluZCBpbmRleCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luZG93ICovCi0JaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYsIHR4cS0+cS5uX2JkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJSRVBMWV9DT01QUkVTU0VEX0JBIFslZF0gUmVjZWl2ZWQgZnJvbSAlcE0sICIKLQkJCSAgICJzdGFfaWQgPSAlZFxuIiwKLQkJCSAgIGFnZy0+d2FpdF9mb3JfYmEsCi0JCQkgICAodTggKikgJmJhX3Jlc3AtPnN0YV9hZGRyX2xvMzIsCi0JCQkgICBiYV9yZXNwLT5zdGFfaWQpOwotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIgotCQkJInNjZF9mbG93ID0gIgotCQkJICAgIiVkLCBzY2Rfc3NuID0gJWRcbiIsCi0JCQkgICBiYV9yZXNwLT50aWQsCi0JCQkgICBiYV9yZXNwLT5zZXFfY3RsLAotCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApLAotCQkJICAgYmFfcmVzcC0+c2NkX2Zsb3csCi0JCQkgICBiYV9yZXNwLT5zY2Rfc3NuKTsKLQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkRBVCBzdGFydF9pZHggPSAlZCwgYml0bWFwID0gMHglbGx4XG4iLAotCQkJICAgYWdnLT5zdGFydF9pZHgsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFnZy0+Yml0bWFwKTsKLQotCS8qIFVwZGF0ZSBkcml2ZXIncyByZWNvcmQgb2YgQUNLIHZzLiBub3QgZm9yIGVhY2ggZnJhbWUgaW4gd2luZG93ICovCi0JaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfY29tcHJlc3NlZF9iYShwcml2LCBhZ2csIGJhX3Jlc3ApOwotCi0JLyogUmVsZWFzZSBhbGwgVEZEcyBiZWZvcmUgdGhlIFNTTiwgaS5lLiBhbGwgVEZEcyBpbiBmcm9udCBvZgotCSAqIGJsb2NrLWFjayB3aW5kb3cgKHdlIGFzc3VtZSB0aGF0IHRoZXkndmUgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiB0cmFuc21pdHRlZCAuLi4gaWYgbm90LCBpdCdzIHRvbyBsYXRlIGFueXdheSkuICovCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZikpIHsKLQkJLyogY2FsY3VsYXRlIG1hYzgwMjExIGFtcGR1IHN3IHF1ZXVlIHRvIHdha2UgKi8KLQkJaW50IGZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHNjZF9mbG93LCBpbmRleCk7Ci0JCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0KLQkJaWYgKChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSAmJgotCQkgICAgcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCAmJgotCQkgICAgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCi0JCWl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHByaXYsIHN0YV9pZCwgdGlkLCBzY2RfZmxvdyk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKLXsKLSNkZWZpbmUgVFhfU1RBVFVTX0ZBSUwoeCkgY2FzZSBUWF9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4Ci0jZGVmaW5lIFRYX1NUQVRVU19QT1NUUE9ORSh4KSBjYXNlIFRYX1NUQVRVU19QT1NUUE9ORV8gIyMgeDogcmV0dXJuICN4Ci0KLQlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKLQljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgotCQlyZXR1cm4gIlNVQ0NFU1MiOwotCVRYX1NUQVRVU19QT1NUUE9ORShERUxBWSk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKEZFV19CWVRFUyk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKFFVSUVUX1BFUklPRCk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKENBTENfVFRBSyk7Ci0JVFhfU1RBVFVTX0ZBSUwoSU5URVJOQUxfQ1JPU1NFRF9SRVRSWSk7Ci0JVFhfU1RBVFVTX0ZBSUwoU0hPUlRfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKExPTkdfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKEZJRk9fVU5ERVJSVU4pOwotCVRYX1NUQVRVU19GQUlMKERSQUlOX0ZMT1cpOwotCVRYX1NUQVRVU19GQUlMKFJGS0lMTF9GTFVTSCk7Ci0JVFhfU1RBVFVTX0ZBSUwoTElGRV9FWFBJUkUpOwotCVRYX1NUQVRVU19GQUlMKERFU1RfUFMpOwotCVRYX1NUQVRVU19GQUlMKEhPU1RfQUJPUlRFRCk7Ci0JVFhfU1RBVFVTX0ZBSUwoQlRfUkVUUlkpOwotCVRYX1NUQVRVU19GQUlMKFNUQV9JTlZBTElEKTsKLQlUWF9TVEFUVVNfRkFJTChGUkFHX0RST1BQRUQpOwotCVRYX1NUQVRVU19GQUlMKFRJRF9ESVNBQkxFKTsKLQlUWF9TVEFUVVNfRkFJTChGSUZPX0ZMVVNIRUQpOwotCVRYX1NUQVRVU19GQUlMKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKLQlUWF9TVEFUVVNfRkFJTChQQVNTSVZFX05PX1JYKTsKLQlUWF9TVEFUVVNfRkFJTChOT19CRUFDT05fT05fUkFEQVIpOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci0KLSN1bmRlZiBUWF9TVEFUVVNfRkFJTAotI3VuZGVmIFRYX1NUQVRVU19QT1NUUE9ORQotfQotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWQxNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLQotI2RlZmluZSBJV0xfQUNfVU5TRVQgLTEKLQotLyoqCi0gKiBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludAotaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBfX2xlMzIgKmltYWdlLCB1MzIgbGVuKQotewotCXUzMiB2YWw7Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGVycmNudCA9IDA7Ci0JdTMyIGk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMC9zaXplb2YodTMyKSkgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJaSArIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAzKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICAgIGxvb2tpbmcgYXQgYWxsIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwKLQkJCQkgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCXUzMiBzYXZlX2xlbiA9IGxlbjsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCSAgIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCi0JZXJyY250ID0gMDsKLQlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgotCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKLQkJCQkgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAyMCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghZXJyY250KQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkgICAgInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKLSAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCi0gKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByZXQ7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIFRyeSBpbml0aWFsaXplICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfaW5pdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2NvZGUudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2NvZGUubGVuOwotCXJldCA9IGl3bDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmICghcmV0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyZXQgPSBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwocHJpdiwgaW1hZ2UsIGxlbik7Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjRmY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1jYWxpYi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1sZWQuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWRlYnVnZnMuaCIKLQotc3RhdGljIGludCBpd2w0OTY1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXN0YXRpYyBpbnQgaXdsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNDk2NV9VQ09ERV9BUElfTUFYIDIKLQotLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w0OTY1X1VDT0RFX0FQSV9NSU4gMgotCi0jZGVmaW5lIElXTDQ5NjVfRldfUFJFICJpd2x3aWZpLTQ5NjUtIgotI2RlZmluZSBfSVdMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w0OTY1X0ZXX1BSRSAjYXBpICIudWNvZGUiCi0jZGVmaW5lIElXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKLQotLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLwotc3RhdGljIGludCBpd2w0OTY1X3ZlcmlmeV9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JdTMyIHJlZzsKLQl1MzIgdmFsOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIHZlcmlmeSBic21cbiIpOwotCi0JLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCi0JdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKLQlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnIDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWcgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCi0JCQkJICAiYWRkciAweCUwOFgrJXUgKG9mICV1KSwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBCU01fU1JBTV9MT1dFUl9CT1VORCwKLQkJCQkgIHJlZyAtIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCBsZW4sCi0JCQkJICB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCi0gKgotICogQlNNIG9wZXJhdGlvbjoKLSAqCi0gKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KLSAqIGluIHNwZWNpYWwgU1JBTSB0aGF0IGRvZXMgbm90IHBvd2VyIGRvd24gZHVyaW5nIFJGS0lMTC4gIFdoZW4gcG93ZXJpbmcgYmFjawotICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKLSAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCi0gKgotICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3Ci0gKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQotICogQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBuZXcgcHJvZ3JhbSBpcyBsb2FkZWQsIGl0IHN0YXJ0cwotICogYXV0b21hdGljYWxseS4KLSAqCi0gKiBXaGVuIGluaXRpYWxpemluZyB0aGUgTklDLCB0aGUgaG9zdCBkcml2ZXIgcG9pbnRzIHRoZSBCU00gdG8gdGhlCi0gKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCi0gKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KLSAqCi0gKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQotICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgotICogKGZpbGxlZCBpbml0aWFsbHkgd2l0aCBzdGFydGluZyBkYXRhIHZhbHVlcyBmb3IgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciksCi0gKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAotICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCi0gKgotICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KLSAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KLSAqCi0gKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCi0gKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCi0gKiBhbmQgcmUtbGF1bmNoZXMgdGhlIHJ1bnRpbWUgdUNvZGUgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2xvYWRfYnNtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMzIgKmltYWdlID0gcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JdTMyIGxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCWRtYV9hZGRyX3QgcGluc3Q7Ci0JZG1hX2FkZHJfdCBwZGF0YTsKLQl1MzIgaW5zdF9sZW47Ci0JdTMyIGRhdGFfbGVuOwotCWludCBpOwotCXUzMiBkb25lOwotCXUzMiByZWdfb2Zmc2V0OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQmVnaW4gbG9hZCBic21cbiIpOwotCi0JcHJpdi0+dWNvZGVfdHlwZSA9IFVDT0RFX1JUOwotCi0JLyogbWFrZSBzdXJlIGJvb3RzdHJhcCBwcm9ncmFtIGlzIG5vIGxhcmdlciB0aGFuIEJTTSdzIFNSQU0gc2l6ZSAqLwotCWlmIChsZW4gPiBJV0w0OV9NQVhfQlNNX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCi0JICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzU6NCBmb3IgNDk2NS4KLQkgKiBOT1RFOiAgaXdsX2luaXRfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAotCSAqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCi0JICogICAgICAgIHJ1bnRpbWUvcHJvdG9jb2wgaW5zdHJ1Y3Rpb25zIGFuZCBiYWNrdXAgZGF0YSBjYWNoZS4KLQkgKi8KLQlwaW5zdCA9IHByaXYtPnVjb2RlX2luaXQucF9hZGRyID4+IDQ7Ci0JcGRhdGEgPSBwcml2LT51Y29kZV9pbml0X2RhdGEucF9hZGRyID4+IDQ7Ci0JaW5zdF9sZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlkYXRhX2xlbiA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW47Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7Ci0KLQkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7Ci0JICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZ19vZmZzZXQsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCi0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfYnNtKHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9NRU1fRFNUX1JFRywgSVdMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfRFdDT1VOVF9SRUcsIGxlbiAvIHNpemVvZih1MzIpKTsKLQotCS8qIExvYWQgYm9vdHN0cmFwIGNvZGUgaW50byBpbnN0cnVjdGlvbiBTUkFNIG5vdywKLQkgKiAgIHRvIHByZXBhcmUgdG8gbG9hZCAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKTsKLQotCS8qIFdhaXQgZm9yIGxvYWQgb2YgYm9vdHN0cmFwIHVDb2RlIHRvIGZpbmlzaCAqLwotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlkb25lID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHKTsKLQkJaWYgKCEoZG9uZSAmIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmIChpIDwgMTAwKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIHdyaXRlIGNvbXBsZXRlLCBwb2xsICVkIGl0ZXJhdGlvbnNcbiIsIGkpOwotCWVsc2UgewotCQlJV0xfRVJSKHByaXYsICJCU00gd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBFbmFibGUgZnV0dXJlIGJvb3QgbG9hZHMgd2hlbmV2ZXIgcG93ZXIgbWFuYWdlbWVudCB1bml0IHRyaWdnZXJzIGl0Ci0JICogICAoZS5nLiB3aGVuIHBvd2VyaW5nIGJhY2sgdXAgYWZ0ZXIgcG93ZXItc2F2ZSBzaHV0ZG93bikgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7Ci0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfc2V0X3Vjb2RlX3B0cnMgLSBTZXQgdUNvZGUgYWRkcmVzcyBsb2NhdGlvbgotICoKLSAqIFRlbGwgaW5pdGlhbGl6YXRpb24gdUNvZGUgd2hlcmUgdG8gZmluZCBydW50aW1lIHVDb2RlLgotICoKLSAqIEJTTSByZWdpc3RlcnMgaW5pdGlhbGx5IGNvbnRhaW4gcG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gdUNvZGUuCi0gKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhlbSB0byBsb2FkIHJ1bnRpbWUgdUNvZGUgaW5zdCBhbmQgZGF0YSwKLSAqIGFuZCB0byBzYXZlIHJ1bnRpbWUgZGF0YSB3aGVuIHBvd2VyaW5nIGRvd24uCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfdWNvZGVfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JZG1hX2FkZHJfdCBwaW5zdDsKLQlkbWFfYWRkcl90IHBkYXRhOwotCWludCByZXQgPSAwOwotCi0JLyogYml0cyAzNTo0IGZvciA0OTY1ICovCi0JcGluc3QgPSBwcml2LT51Y29kZV9jb2RlLnBfYWRkciA+PiA0OwotCXBkYXRhID0gcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyID4+IDQ7Ci0KLQkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsCi0JCQkJIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCS8qIEluc3QgYnl0ZSBjb3VudCBtdXN0IGJlIGxhc3QgdG8gc2V0IHVwLCBiaXQgMzEgc2lnbmFscyB1Q29kZQotCSAqICAgdGhhdCBhbGwgbmV3IHB0ci9zaXplIGluZm8gaXMgaW4gcGxhY2UgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9jb2RlLmxlbiB8IEJTTV9EUkFNX0lOU1RfTE9BRCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2luaXRfYWxpdmVfc3RhcnQgLSBDYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKgotICogQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KLSAqCi0gKiBUaGUgNDk2NSAiaW5pdGlhbGl6ZSIgQUxJVkUgcmVwbHkgY29udGFpbnMgY2FsaWJyYXRpb24gZGF0YSBmb3I6Ci0gKiAgIFZvbHRhZ2UsIHRlbXBlcmF0dXJlLCBhbmQgTUlNTyB0eCBnYWluIGNvcnJlY3Rpb24sIG5vdyBzdG9yZWQgaW4gcHJpdgotICogICAoMzk0NSBkb2VzIG5vdCBjb250YWluIHRoaXMgZGF0YSkuCi0gKgotICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCi0qLwotc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsNDk2NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBcImluaXRpYWxpemVcIiB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgdGVtcGVyYXR1cmUgKi8KLQlwcml2LT50ZW1wZXJhdHVyZSA9IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCi0JLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAotCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCi0JICogbm90aWZpY2F0aW9uLiAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCWlmIChpd2w0OTY1X3NldF91Y29kZV9wdHJzKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybjsKLQotcmVzdGFydDoKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotfQotCi1zdGF0aWMgYm9vbCBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKF9fbGUzMiByeG9uX2ZsYWdzKQotewotCWludCBjaGFuX21vZCA9IGxlMzJfdG9fY3B1KHJ4b25fZmxhZ3MgJiBSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCXJldHVybiAoKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwKSB8fAotCQkgIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfTUlYRUQpKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiByYWRpb19jZmc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcmFkaW9fY2ZnID0gaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fUkFESU9fQ09ORklHKTsKLQotCS8qIHdyaXRlIHJhZGlvIGNvbmZpZyB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpID09IEVFUFJPTV80OTY1X1JGX0NGR19UWVBFX01BWCkKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSB8Ci0JCQkgICAgRUVQUk9NX1JGX0NGR19TVEVQX01TSyhyYWRpb19jZmcpIHwKLQkJCSAgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOwotCi0JLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfUkFESU9fU0kgfAotCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7Ci0KLQlwcml2LT5jYWxpYl9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKikKLQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LAotCQkJCUVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogUmVzZXQgZGlmZmVyZW50aWFsIFJ4IGdhaW5zIGluIE5JQyB0byBwcmVwYXJlIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbi4KLSAqIENhbGxlZCBhZnRlciBldmVyeSBhc3NvY2lhdGlvbiwgYnV0IHRoaXMgcnVucyBvbmx5IG9uY2UhCi0gKiAgLi4uIG9uY2UgY2hhaW4gbm9pc2UgaXMgY2FsaWJyYXRlZCB0aGUgZmlyc3QgdGltZSwgaXQncyBnb29kIGZvcmV2ZXIuICAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9jaGFpbl9ub2lzZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKLQotCWlmICgoZGF0YS0+c3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0FMSVZFKSAmJgotCSAgICBpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7Ci0KLQkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCi0JCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOwotCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKLQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKLQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOwotCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7Ci0KLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmhkci5vcF9jb2RlID0gSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRDsKLQkJY21kLmRpZmZfZ2Fpbl9hID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9iID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9jID0gMDsKLQkJaWYgKGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCi0JCQkJIHNpemVvZihjbWQpLCAmY21kKSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiQ291bGQgbm90IHNlbmQgUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRFxuIik7Ci0JCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEU7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUnVuIGNoYWluX25vaXNlX2NhbGlicmF0ZVxuIik7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgaXdsNDk2NV9zZW5zaXRpdml0eSA9IHsKLQkubWluX25yZ19jY2sgPSA5NywKLQkubWF4X25yZ19jY2sgPSAwLCAvKiBub3QgdXNlZCwgc2V0IHRvIDAgKi8KLQotCS5hdXRvX2NvcnJfbWluX29mZG0gPSA4NSwKLQkuYXV0b19jb3JyX21pbl9vZmRtX21yYyA9IDE3MCwKLQkuYXV0b19jb3JyX21pbl9vZmRtX3gxID0gMTA1LAotCS5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxID0gMjIwLAotCi0JLmF1dG9fY29ycl9tYXhfb2ZkbSA9IDEyMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX21yYyA9IDIxMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX3gxID0gMTQwLAotCS5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxID0gMjcwLAotCi0JLmF1dG9fY29ycl9taW5fY2NrID0gMTI1LAotCS5hdXRvX2NvcnJfbWF4X2NjayA9IDIwMCwKLQkuYXV0b19jb3JyX21pbl9jY2tfbXJjID0gMjAwLAotCS5hdXRvX2NvcnJfbWF4X2Nja19tcmMgPSA0MDAsCi0KLQkubnJnX3RoX2NjayA9IDEwMCwKLQkubnJnX3RoX29mZG0gPSAxMDAsCi0KLQkuYmFya2VyX2NvcnJfdGhfbWluID0gMTkwLAotCS5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gMzkwLAotCS5ucmdfdGhfY2NhID0gNjIsCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIHdhbnQgS2VsdmluICovCi0JcHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkID0KLQkJQ0VMU0lVU19UT19LRUxWSU4oQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3NldF9od19wYXJhbXMKLSAqCi0gKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgotCSAgICBwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPD0gSVdMNDlfTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9Ci0JCQlwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDQ5X1RDU1JfQ0hOTF9OVU07Ci0JcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCi0JCQlzaXplb2Yoc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKTsKLQlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMNDk2NV9TVEFUSU9OX0NPVU5UOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTDQ5NjVfQlJPQURDQVNUX0lEOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSVdMNDlfUlRDX0RBVEFfU0laRTsKLQlwcml2LT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElXTDQ5X1JUQ19JTlNUX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSA9IEJTTV9TUkFNX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9IEJJVChJRUVFODAyMTFfQkFORF81R0haKTsKLQotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIX1JTQ1NSX0NITkwwX1dQVFI7Ci0KLQlwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bSA9IGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBpd2w0OTY1X251bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7Ci0KLQlpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQocHJpdik7Ci0KLQlwcml2LT5od19wYXJhbXMuc2VucyA9ICZpd2w0OTY1X3NlbnNpdGl2aXR5OwotCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGl3bDQ5NjVfbWF0aF9kaXZfcm91bmQoczMyIG51bSwgczMyIGRlbm9tLCBzMzIgKnJlcykKLXsKLQlzMzIgc2lnbiA9IDE7Ci0KLQlpZiAobnVtIDwgMCkgewotCQlzaWduID0gLXNpZ247Ci0JCW51bSA9IC1udW07Ci0JfQotCWlmIChkZW5vbSA8IDApIHsKLQkJc2lnbiA9IC1zaWduOwotCQlkZW5vbSA9IC1kZW5vbTsKLQl9Ci0JKnJlcyA9IDE7Ci0JKnJlcyA9ICgobnVtICogMiArIGRlbm9tKSAvIChkZW5vbSAqIDIpKSAqIHNpZ247Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2dldF92b2x0YWdlX2NvbXBlbnNhdGlvbiAtIFBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXAgZm9yIHR4cG93ZXIKLSAqCi0gKiBEZXRlcm1pbmVzIHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlciBjYWxjdWxhdGlvbnMuCi0gKiBSZXR1cm5zIG51bWJlciBvZiAxLzItZEIgc3RlcHMgdG8gc3VidHJhY3QgZnJvbSBnYWluIHRhYmxlIGluZGV4LAotICogdG8gY29tcGVuc2F0ZSBmb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHBvd2VyIHN1cHBseSB2b2x0YWdlIGR1cmluZwotICogZmFjdG9yeSBtZWFzdXJlbWVudHMsIHZzLiBjdXJyZW50IHBvd2VyIHN1cHBseSB2b2x0YWdlLgotICoKLSAqIFZvbHRhZ2UgaW5kaWNhdGlvbiBpcyBoaWdoZXIgZm9yIGxvd2VyIHZvbHRhZ2UuCi0gKiBMb3dlciB2b2x0YWdlIHJlcXVpcmVzIG1vcmUgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCkuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24oczMyIGVlcHJvbV92b2x0YWdlLAotCQkJCQkgICAgczMyIGN1cnJlbnRfdm9sdGFnZSkKLXsKLQlzMzIgY29tcCA9IDA7Ci0KLQlpZiAoKFRYX1BPV0VSX0lXTF9JTExFR0FMX1ZPTFRBR0UgPT0gZWVwcm9tX3ZvbHRhZ2UpIHx8Ci0JICAgIChUWF9QT1dFUl9JV0xfSUxMRUdBTF9WT0xUQUdFID09IGN1cnJlbnRfdm9sdGFnZSkpCi0JCXJldHVybiAwOwotCi0JaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZChjdXJyZW50X3ZvbHRhZ2UgLSBlZXByb21fdm9sdGFnZSwKLQkJCSAgICAgICBUWF9QT1dFUl9JV0xfVk9MVEFHRV9DT0RFU19QRVJfMDNWLCAmY29tcCk7Ci0KLQlpZiAoY3VycmVudF92b2x0YWdlID4gZWVwcm9tX3ZvbHRhZ2UpCi0JCWNvbXAgKj0gMjsKLQlpZiAoKGNvbXAgPCAtMikgfHwgKGNvbXAgPiAyKSkKLQkJY29tcCA9IDA7Ci0KLQlyZXR1cm4gY29tcDsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2dldF90eF9hdHRlbl9ncnAodTE2IGNoYW5uZWwpCi17Ci0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSNV9GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzU7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IxX0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjFfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfMTsKLQotCWlmIChjaGFubmVsID49IENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIICYmCi0JICAgIGNoYW5uZWwgPD0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMl9MQ0gpCi0JCXJldHVybiBDQUxJQl9DSF9HUk9VUF8yOwotCi0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IzX0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzM7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjRfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfNDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGNoYW5uZWwpCi17Ci0JczMyIGIgPSAtMTsKLQotCWZvciAoYiA9IDA7IGIgPCBFRVBST01fVFhfUE9XRVJfQkFORFM7IGIrKykgewotCQlpZiAocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW2JdLmNoX2Zyb20gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoY2hhbm5lbCA+PSBwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSkKLQkJICAgICYmIChjaGFubmVsIDw9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tiXS5jaF90bykpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYjsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2ludGVycG9sYXRlX3ZhbHVlKHMzMiB4LCBzMzIgeDEsIHMzMiB5MSwgczMyIHgyLCBzMzIgeTIpCi17Ci0JczMyIHZhbDsKLQotCWlmICh4MiA9PSB4MSkKLQkJcmV0dXJuIHkxOwotCWVsc2UgewotCQlpd2w0OTY1X21hdGhfZGl2X3JvdW5kKCh4MiAtIHgpICogKHkxIC0geTIpLCAoeDIgLSB4MSksICZ2YWwpOwotCQlyZXR1cm4gdmFsICsgeTI7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbiAtIEludGVycG9sYXRlIGZhY3RvcnkgbWVhc3VyZW1lbnRzIGZvciBvbmUgY2hhbm5lbAotICoKLSAqIEludGVycG9sYXRlcyBmYWN0b3J5IG1lYXN1cmVtZW50cyBmcm9tIHRoZSB0d28gc2FtcGxlIGNoYW5uZWxzIHdpdGhpbiBhCi0gKiBzdWItYmFuZCwgdG8gYXBwbHkgdG8gY2hhbm5lbCBvZiBpbnRlcmVzdC4gIEludGVycG9sYXRpb24gaXMgcHJvcG9ydGlvbmFsIHRvCi0gKiBkaWZmZXJlbmNlcyBpbiBjaGFubmVsIGZyZXF1ZW5jaWVzLCB3aGljaCBpcyBwcm9wb3J0aW9uYWwgdG8gZGlmZmVyZW5jZXMKLSAqIGluIGNoYW5uZWwgbnVtYmVyLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBjaGFubmVsLAotCQkJCSAgICBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9jaF9pbmZvICpjaGFuX2luZm8pCi17Ci0JczMyIHMgPSAtMTsKLQl1MzIgYzsKLQl1MzIgbTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMjsKLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICpvbWVhczsKLQl1MzIgY2hfaTE7Ci0JdTMyIGNoX2kyOwotCi0JcyA9IGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKHByaXYsIGNoYW5uZWwpOwotCWlmIChzID49IEVFUFJPTV9UWF9QT1dFUl9CQU5EUykgewotCQlJV0xfRVJSKHByaXYsICJUeCBQb3dlciBjYW4gbm90IGZpbmQgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljaF9pMSA9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tzXS5jaDEuY2hfbnVtOwotCWNoX2kyID0gcHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi5jaF9udW07Ci0JY2hhbl9pbmZvLT5jaF9udW0gPSAodTgpIGNoYW5uZWw7Ci0KLQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhbm5lbCAlZCBzdWJiYW5kICVkIGZhY3RvcnkgY2FsIGNoICVkICYgJWRcbiIsCi0JCQkgIGNoYW5uZWwsIHMsIGNoX2kxLCBjaF9pMik7Ci0KLQlmb3IgKGMgPSAwOyBjIDwgRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOUzsgYysrKSB7Ci0JCWZvciAobSA9IDA7IG0gPCBFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTOyBtKyspIHsKLQkJCW0xID0gJihwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLgotCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7Ci0JCQltMiA9ICYocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi4KLQkJCSAgICAgICBtZWFzdXJlbWVudHNbY11bbV0pOwotCQkJb21lYXMgPSAmKGNoYW5faW5mby0+bWVhc3VyZW1lbnRzW2NdW21dKTsKLQotCQkJb21lYXMtPmFjdHVhbF9wb3cgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+YWN0dWFsX3BvdywKLQkJCQkJCQkgICBjaF9pMiwKLQkJCQkJCQkgICBtMi0+YWN0dWFsX3Bvdyk7Ci0JCQlvbWVhcy0+Z2Fpbl9pZHggPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+Z2Fpbl9pZHgsIGNoX2kyLAotCQkJCQkJCSAgIG0yLT5nYWluX2lkeCk7Ci0JCQlvbWVhcy0+dGVtcGVyYXR1cmUgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+dGVtcGVyYXR1cmUsCi0JCQkJCQkJICAgY2hfaTIsCi0JCQkJCQkJICAgbTItPnRlbXBlcmF0dXJlKTsKLQkJCW9tZWFzLT5wYV9kZXQgPQotCQkJICAgIChzOCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+cGFfZGV0LCBjaF9pMiwKLQkJCQkJCQkgICBtMi0+cGFfZGV0KTsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBBUDE9JWQgQVAyPSVkIEFQPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5hY3R1YWxfcG93LCBtMi0+YWN0dWFsX3Bvdywgb21lYXMtPmFjdHVhbF9wb3cpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBOSTE9JWQgTkkyPSVkIE5JPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5nYWluX2lkeCwgbTItPmdhaW5faWR4LCBvbWVhcy0+Z2Fpbl9pZHgpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBQQTE9JWQgUEEyPSVkIFBBPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5wYV9kZXQsIG0yLT5wYV9kZXQsIG9tZWFzLT5wYV9kZXQpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCAgVDE9JWQgIFQyPSVkICBUPSVkXG4iLCBjLCBtLAotCQkJCW0xLT50ZW1wZXJhdHVyZSwgbTItPnRlbXBlcmF0dXJlLAotCQkJCW9tZWFzLT50ZW1wZXJhdHVyZSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYml0LXJhdGUtZGVwZW5kZW50IHRhYmxlIHRvIHByZXZlbnQgVHggZGlzdG9ydGlvbiwgaW4gaGFsZi1kQiB1bml0cywKLSAqIGZvciBPRkRNIDYsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXQsIGFuZCBDQ0sgYWxsIHJhdGVzLiAqLwotc3RhdGljIHMzMiBiYWNrX29mZl90YWJsZVtdID0gewotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDQwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDQwIE1IeiAqLwotCTEwCQkJLyogQ0NLICovCi19OwotCi0vKiBUaGVybWFsIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHR4cG93ZXIgZm9yIHZhcmlvdXMgZnJlcXVlbmN5IHJhbmdlcyAuLi4KLSAqICAgcmF0aW9zIGZyb20gMzoxIHRvIDQuNToxIG9mIGRlZ3JlZXMgKENlbHNpdXMpIHBlciBoYWxmLWRCIGdhaW4gYWRqdXN0ICovCi1zdGF0aWMgc3RydWN0IGl3bDQ5NjVfdHhwb3dlcl9jb21wX2VudHJ5IHsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9hOwotCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2FfZGVub207Ci19IHR4X3Bvd2VyX2NtcF90YmxlW0NBTElCX0NIX0dST1VQX01BWF0gPSB7Ci0JezksIDJ9LAkJCS8qIGdyb3VwIDAgNS4yLCBjaCAgMzQtNDMgKi8KLQl7NCwgMX0sCQkJLyogZ3JvdXAgMSA1LjIsIGNoICA0NC03MCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAyIDUuMiwgY2ggIDcxLTEyNCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAzIDUuMiwgY2ggMTI1LTIwMCAqLwotCXszLCAxfQkJCS8qIGdyb3VwIDQgMi40LCBjaCAgIGFsbCAqLwotfTsKLQotc3RhdGljIHMzMiBnZXRfbWluX3Bvd2VyX2luZGV4KHMzMiByYXRlX3Bvd2VyX2luZGV4LCB1MzIgYmFuZCkKLXsKLQlpZiAoIWJhbmQpIHsKLQkJaWYgKChyYXRlX3Bvd2VyX2luZGV4ICYgNykgPD0gNCkKLQkJCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWF81MkdIWl9FWFQ7Ci0JfQotCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWDsKLX0KLQotc3RydWN0IGdhaW5fZW50cnkgewotCXU4IGRzcDsKLQl1OCByYWRpbzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2Fpbl9lbnRyeSBnYWluX3RhYmxlWzJdWzEwOF0gPSB7Ci0JLyogNS4yR0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMjMsIDB4M0Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMTcsIDB4M0Z9LAotCSB7MTEwLCAweDNGfSwKLQkgezEwNCwgMHgzRn0sCi0JIHs5OCwgMHgzRn0sCi0JIHsxMTAsIDB4M0V9LAotCSB7MTA0LCAweDNFfSwKLQkgezk4LCAweDNFfSwKLQkgezExMCwgMHgzRH0sCi0JIHsxMDQsIDB4M0R9LAotCSB7OTgsIDB4M0R9LAotCSB7MTEwLCAweDNDfSwKLQkgezEwNCwgMHgzQ30sCi0JIHs5OCwgMHgzQ30sCi0JIHsxMTAsIDB4M0J9LAotCSB7MTA0LCAweDNCfSwKLQkgezk4LCAweDNCfSwKLQkgezExMCwgMHgzQX0sCi0JIHsxMDQsIDB4M0F9LAotCSB7OTgsIDB4M0F9LAotCSB7MTEwLCAweDM5fSwKLQkgezEwNCwgMHgzOX0sCi0JIHs5OCwgMHgzOX0sCi0JIHsxMTAsIDB4Mzh9LAotCSB7MTA0LCAweDM4fSwKLQkgezk4LCAweDM4fSwKLQkgezExMCwgMHgzN30sCi0JIHsxMDQsIDB4Mzd9LAotCSB7OTgsIDB4Mzd9LAotCSB7MTEwLCAweDM2fSwKLQkgezEwNCwgMHgzNn0sCi0JIHs5OCwgMHgzNn0sCi0JIHsxMTAsIDB4MzV9LAotCSB7MTA0LCAweDM1fSwKLQkgezk4LCAweDM1fSwKLQkgezExMCwgMHgzNH0sCi0JIHsxMDQsIDB4MzR9LAotCSB7OTgsIDB4MzR9LAotCSB7MTEwLCAweDMzfSwKLQkgezEwNCwgMHgzM30sCi0JIHs5OCwgMHgzM30sCi0JIHsxMTAsIDB4MzJ9LAotCSB7MTA0LCAweDMyfSwKLQkgezk4LCAweDMyfSwKLQkgezExMCwgMHgzMX0sCi0JIHsxMDQsIDB4MzF9LAotCSB7OTgsIDB4MzF9LAotCSB7MTEwLCAweDMwfSwKLQkgezEwNCwgMHgzMH0sCi0JIHs5OCwgMHgzMH0sCi0JIHsxMTAsIDB4MjV9LAotCSB7MTA0LCAweDI1fSwKLQkgezk4LCAweDI1fSwKLQkgezExMCwgMHgyNH0sCi0JIHsxMDQsIDB4MjR9LAotCSB7OTgsIDB4MjR9LAotCSB7MTEwLCAweDIzfSwKLQkgezEwNCwgMHgyM30sCi0JIHs5OCwgMHgyM30sCi0JIHsxMTAsIDB4MjJ9LAotCSB7MTA0LCAweDE4fSwKLQkgezk4LCAweDE4fSwKLQkgezExMCwgMHgxN30sCi0JIHsxMDQsIDB4MTd9LAotCSB7OTgsIDB4MTd9LAotCSB7MTEwLCAweDE2fSwKLQkgezEwNCwgMHgxNn0sCi0JIHs5OCwgMHgxNn0sCi0JIHsxMTAsIDB4MTV9LAotCSB7MTA0LCAweDE1fSwKLQkgezk4LCAweDE1fSwKLQkgezExMCwgMHgxNH0sCi0JIHsxMDQsIDB4MTR9LAotCSB7OTgsIDB4MTR9LAotCSB7MTEwLCAweDEzfSwKLQkgezEwNCwgMHgxM30sCi0JIHs5OCwgMHgxM30sCi0JIHsxMTAsIDB4MTJ9LAotCSB7MTA0LCAweDA4fSwKLQkgezk4LCAweDA4fSwKLQkgezExMCwgMHgwN30sCi0JIHsxMDQsIDB4MDd9LAotCSB7OTgsIDB4MDd9LAotCSB7MTEwLCAweDA2fSwKLQkgezEwNCwgMHgwNn0sCi0JIHs5OCwgMHgwNn0sCi0JIHsxMTAsIDB4MDV9LAotCSB7MTA0LCAweDA1fSwKLQkgezk4LCAweDA1fSwKLQkgezExMCwgMHgwNH0sCi0JIHsxMDQsIDB4MDR9LAotCSB7OTgsIDB4MDR9LAotCSB7MTEwLCAweDAzfSwKLQkgezEwNCwgMHgwM30sCi0JIHs5OCwgMHgwM30sCi0JIHsxMTAsIDB4MDJ9LAotCSB7MTA0LCAweDAyfSwKLQkgezk4LCAweDAyfSwKLQkgezExMCwgMHgwMX0sCi0JIHsxMDQsIDB4MDF9LAotCSB7OTgsIDB4MDF9LAotCSB7MTEwLCAweDAwfSwKLQkgezEwNCwgMHgwMH0sCi0JIHs5OCwgMHgwMH0sCi0JIHs5MywgMHgwMH0sCi0JIHs4OCwgMHgwMH0sCi0JIHs4MywgMHgwMH0sCi0JIHs3OCwgMHgwMH0sCi0JIH0sCi0JLyogMi40R0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMTAsIDB4M2Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMDQsIDB4M2Z9LAotCSB7OTgsIDB4M2Z9LAotCSB7MTEwLCAweDNlfSwKLQkgezEwNCwgMHgzZX0sCi0JIHs5OCwgMHgzZX0sCi0JIHsxMTAsIDB4M2R9LAotCSB7MTA0LCAweDNkfSwKLQkgezk4LCAweDNkfSwKLQkgezExMCwgMHgzY30sCi0JIHsxMDQsIDB4M2N9LAotCSB7OTgsIDB4M2N9LAotCSB7MTEwLCAweDNifSwKLQkgezEwNCwgMHgzYn0sCi0JIHs5OCwgMHgzYn0sCi0JIHsxMTAsIDB4M2F9LAotCSB7MTA0LCAweDNhfSwKLQkgezk4LCAweDNhfSwKLQkgezExMCwgMHgzOX0sCi0JIHsxMDQsIDB4Mzl9LAotCSB7OTgsIDB4Mzl9LAotCSB7MTEwLCAweDM4fSwKLQkgezEwNCwgMHgzOH0sCi0JIHs5OCwgMHgzOH0sCi0JIHsxMTAsIDB4Mzd9LAotCSB7MTA0LCAweDM3fSwKLQkgezk4LCAweDM3fSwKLQkgezExMCwgMHgzNn0sCi0JIHsxMDQsIDB4MzZ9LAotCSB7OTgsIDB4MzZ9LAotCSB7MTEwLCAweDM1fSwKLQkgezEwNCwgMHgzNX0sCi0JIHs5OCwgMHgzNX0sCi0JIHsxMTAsIDB4MzR9LAotCSB7MTA0LCAweDM0fSwKLQkgezk4LCAweDM0fSwKLQkgezExMCwgMHgzM30sCi0JIHsxMDQsIDB4MzN9LAotCSB7OTgsIDB4MzN9LAotCSB7MTEwLCAweDMyfSwKLQkgezEwNCwgMHgzMn0sCi0JIHs5OCwgMHgzMn0sCi0JIHsxMTAsIDB4MzF9LAotCSB7MTA0LCAweDMxfSwKLQkgezk4LCAweDMxfSwKLQkgezExMCwgMHgzMH0sCi0JIHsxMDQsIDB4MzB9LAotCSB7OTgsIDB4MzB9LAotCSB7MTEwLCAweDZ9LAotCSB7MTA0LCAweDZ9LAotCSB7OTgsIDB4Nn0sCi0JIHsxMTAsIDB4NX0sCi0JIHsxMDQsIDB4NX0sCi0JIHs5OCwgMHg1fSwKLQkgezExMCwgMHg0fSwKLQkgezEwNCwgMHg0fSwKLQkgezk4LCAweDR9LAotCSB7MTEwLCAweDN9LAotCSB7MTA0LCAweDN9LAotCSB7OTgsIDB4M30sCi0JIHsxMTAsIDB4Mn0sCi0JIHsxMDQsIDB4Mn0sCi0JIHs5OCwgMHgyfSwKLQkgezExMCwgMHgxfSwKLQkgezEwNCwgMHgxfSwKLQkgezk4LCAweDF9LAotCSB7MTEwLCAweDB9LAotCSB7MTA0LCAweDB9LAotCSB7OTgsIDB4MH0sCi0JIHs5NywgMH0sCi0JIHs5NiwgMH0sCi0JIHs5NSwgMH0sCi0JIHs5NCwgMH0sCi0JIHs5MywgMH0sCi0JIHs5MiwgMH0sCi0JIHs5MSwgMH0sCi0JIHs5MCwgMH0sCi0JIHs4OSwgMH0sCi0JIHs4OCwgMH0sCi0JIHs4NywgMH0sCi0JIHs4NiwgMH0sCi0JIHs4NSwgMH0sCi0JIHs4NCwgMH0sCi0JIHs4MywgMH0sCi0JIHs4MiwgMH0sCi0JIHs4MSwgMH0sCi0JIHs4MCwgMH0sCi0JIHs3OSwgMH0sCi0JIHs3OCwgMH0sCi0JIHs3NywgMH0sCi0JIHs3NiwgMH0sCi0JIHs3NSwgMH0sCi0JIHs3NCwgMH0sCi0JIHs3MywgMH0sCi0JIHs3MiwgMH0sCi0JIHs3MSwgMH0sCi0JIHs3MCwgMH0sCi0JIHs2OSwgMH0sCi0JIHs2OCwgMH0sCi0JIHs2NywgMH0sCi0JIHs2NiwgMH0sCi0JIHs2NSwgMH0sCi0JIHs2NCwgMH0sCi0JIHs2MywgMH0sCi0JIHs2MiwgMH0sCi0JIHs2MSwgMH0sCi0JIHs2MCwgMH0sCi0JIHs1OSwgMH0sCi0JIH0KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYmFuZCwgdTE2IGNoYW5uZWwsCi0JCQkJICAgIHU4IGlzX2h0NDAsIHU4IGN0cmxfY2hhbl9oaWdoLAotCQkJCSAgICBzdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiAqdHhfcG93ZXJfdGJsKQotewotCXU4IHNhdHVyYXRpb25fcG93ZXI7Ci0JczMyIHRhcmdldF9wb3dlcjsKLQlzMzIgdXNlcl90YXJnZXRfcG93ZXI7Ci0JczMyIHBvd2VyX2xpbWl0OwotCXMzMiBjdXJyZW50X3RlbXA7Ci0JczMyIHJlZ19saW1pdDsKLQlzMzIgY3VycmVudF9yZWd1bGF0b3J5OwotCXMzMiB0eGF0dGVuX2dycCA9IENBTElCX0NIX0dST1VQX01BWDsKLQlpbnQgaTsKLQlpbnQgYzsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaF9lZXByb21faW5mbzsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptZWFzdXJlbWVudDsKLQlzMTYgdm9sdGFnZTsKLQlzMzIgaW5pdF92b2x0YWdlOwotCXMzMiB2b2x0YWdlX2NvbXBlbnNhdGlvbjsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9udW07Ci0JczMyIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub207Ci0JczMyIGZhY3RvcnlfdGVtcDsKLQlzMzIgdGVtcGVyYXR1cmVfY29tcFsyXTsKLQlzMzIgZmFjdG9yeV9nYWluX2luZGV4WzJdOwotCXMzMiBmYWN0b3J5X2FjdHVhbF9wd3JbMl07Ci0JczMyIHBvd2VyX2luZGV4OwotCi0JLyogdHhfcG93ZXJfdXNlcl9sbXQgaXMgaW4gZEJtLCBjb252ZXJ0IHRvIGhhbGYtZEJtIChoYWxmLWRCIHVuaXRzCi0JICogICBhcmUgdXNlZCBmb3IgaW5kZXhpbmcgaW50byB0eHBvd2VyIHRhYmxlKSAqLwotCXVzZXJfdGFyZ2V0X3Bvd2VyID0gMiAqIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10OwotCi0JLyogR2V0IGN1cnJlbnQgKFJYT04pIGNoYW5uZWwsIGJhbmQsIHdpZHRoICovCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW4gJWQgYmFuZCAlZCBpc19odDQwICVkXG4iLCBjaGFubmVsLCBiYW5kLAotCQkJICBpc19odDQwKTsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2hhbm5lbCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBnZXQgdHhhdHRlbiBncm91cCwgdXNlZCB0byBzZWxlY3QgMSkgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQKLQkgKiAgIGFuZCAyKSBtaW1vIHR4cG93ZXIgYmFsYW5jZSBiZXR3ZWVuIFR4IGNoYWlucy4gKi8KLQl0eGF0dGVuX2dycCA9IGl3bDQ5NjVfZ2V0X3R4X2F0dGVuX2dycChjaGFubmVsKTsKLQlpZiAodHhhdHRlbl9ncnAgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbid0IGZpbmQgdHhhdHRlbiBncm91cCBmb3IgY2hhbm5lbCAlZC5cbiIsCi0JCQkgIGNoYW5uZWwpOwotCQlyZXR1cm4gdHhhdHRlbl9ncnA7Ci0JfQotCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW5uZWwgJWQgYmVsb25ncyB0byB0eGF0dGVuIGdyb3VwICVkXG4iLAotCQkJICBjaGFubmVsLCB0eGF0dGVuX2dycCk7Ci0KLQlpZiAoaXNfaHQ0MCkgewotCQlpZiAoY3RybF9jaGFuX2hpZ2gpCi0JCQljaGFubmVsIC09IDI7Ci0JCWVsc2UKLQkJCWNoYW5uZWwgKz0gMjsKLQl9Ci0KLQkvKiBoYXJkd2FyZSB0eHBvd2VyIGxpbWl0cyAuLi4KLQkgKiBzYXR1cmF0aW9uIChjbGlwcGluZyBkaXN0b3J0aW9uKSB0eHBvd2VycyBhcmUgaW4gaGFsZi1kQm0gKi8KLQlpZiAoYmFuZCkKLQkJc2F0dXJhdGlvbl9wb3dlciA9IHByaXYtPmNhbGliX2luZm8tPnNhdHVyYXRpb25fcG93ZXIyNDsKLQllbHNlCi0JCXNhdHVyYXRpb25fcG93ZXIgPSBwcml2LT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyNTI7Ci0KLQlpZiAoc2F0dXJhdGlvbl9wb3dlciA8IElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiB8fAotCSAgICBzYXR1cmF0aW9uX3Bvd2VyID4gSVdMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYKSB7Ci0JCWlmIChiYW5kKQotCQkJc2F0dXJhdGlvbl9wb3dlciA9IElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQ7Ci0JCWVsc2UKLQkJCXNhdHVyYXRpb25fcG93ZXIgPSBJV0xfVFhfUE9XRVJfREVGQVVMVF9TQVRVUkFUSU9OXzUyOwotCX0KLQotCS8qIHJlZ3VsYXRvcnkgdHhwb3dlciBsaW1pdHMgLi4uIHJlZ19saW1pdCB2YWx1ZXMgYXJlIGluIGhhbGYtZEJtLAotCSAqICAgbWF4X3Bvd2VyX2F2ZyB2YWx1ZXMgYXJlIGluIGRCbSwgY29udmVydCAqIDIgKi8KLQlpZiAoaXNfaHQ0MCkKLQkJcmVnX2xpbWl0ID0gY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnICogMjsKLQllbHNlCi0JCXJlZ19saW1pdCA9IGNoX2luZm8tPm1heF9wb3dlcl9hdmcgKiAyOwotCi0JaWYgKChyZWdfbGltaXQgPCBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4pIHx8Ci0JICAgIChyZWdfbGltaXQgPiBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NQVgpKSB7Ci0JCWlmIChiYW5kKQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV8yNDsKLQkJZWxzZQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MjsKLQl9Ci0KLQkvKiBJbnRlcnBvbGF0ZSB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdGhpcyBjaGFubmVsLAotCSAqICAgYmFzZWQgb24gZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZXN0cyBvbiBzcGFjZWQgY2hhbm5lbHMuICovCi0JaXdsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuKHByaXYsIGNoYW5uZWwsICZjaF9lZXByb21faW5mbyk7Ci0KLQkvKiBjYWxjdWxhdGUgdHggZ2FpbiBhZGp1c3RtZW50IGJhc2VkIG9uIHBvd2VyIHN1cHBseSB2b2x0YWdlICovCi0Jdm9sdGFnZSA9IGxlMTZfdG9fY3B1KHByaXYtPmNhbGliX2luZm8tPnZvbHRhZ2UpOwotCWluaXRfdm9sdGFnZSA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnZvbHRhZ2UpOwotCXZvbHRhZ2VfY29tcGVuc2F0aW9uID0KLQkgICAgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24odm9sdGFnZSwgaW5pdF92b2x0YWdlKTsKLQotCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJjdXJyIHZvbHQgJWQgZWVwcm9tIHZvbHQgJWQgdm9sdCBjb21wICVkXG4iLAotCQkJICBpbml0X3ZvbHRhZ2UsCi0JCQkgIHZvbHRhZ2UsIHZvbHRhZ2VfY29tcGVuc2F0aW9uKTsKLQotCS8qIGdldCBjdXJyZW50IHRlbXBlcmF0dXJlIChDZWxzaXVzKSAqLwotCWN1cnJlbnRfdGVtcCA9IG1heChwcml2LT50ZW1wZXJhdHVyZSwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTik7Ci0JY3VycmVudF90ZW1wID0gbWluKHByaXYtPnRlbXBlcmF0dXJlLCBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYKTsKLQljdXJyZW50X3RlbXAgPSBLRUxWSU5fVE9fQ0VMU0lVUyhjdXJyZW50X3RlbXApOwotCi0JLyogc2VsZWN0IHRoZXJtYWwgdHhwb3dlciBhZGp1c3RtZW50IHBhcmFtcywgYmFzZWQgb24gY2hhbm5lbCBncm91cAotCSAqICAgKHNhbWUgZnJlcXVlbmN5IGdyb3VwIHVzZWQgZm9yIG1pbW8gdHhhdHRlbiBhZGp1c3RtZW50KSAqLwotCWRlZ3JlZXNfcGVyXzA1ZGJfbnVtID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYTsKLQlkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKLQotCS8qIGdldCBwZXItY2hhaW4gdHhwb3dlciB2YWx1ZXMgZnJvbSBmYWN0b3J5IG1lYXN1cmVtZW50cyAqLwotCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKLQkJbWVhc3VyZW1lbnQgPSAmY2hfZWVwcm9tX2luZm8ubWVhc3VyZW1lbnRzW2NdWzFdOwotCi0JCS8qIHR4Z2FpbiBhZGp1c3RtZW50IChpbiBoYWxmLWRCIHN0ZXBzKSBiYXNlZCBvbiBkaWZmZXJlbmNlCi0JCSAqICAgYmV0d2VlbiBmYWN0b3J5IGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlICovCi0JCWZhY3RvcnlfdGVtcCA9IG1lYXN1cmVtZW50LT50ZW1wZXJhdHVyZTsKLQkJaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZCgoY3VycmVudF90ZW1wIC0gZmFjdG9yeV90ZW1wKSAqCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub20sCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfbnVtLAotCQkJCSAgICAgICAmdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJZmFjdG9yeV9nYWluX2luZGV4W2NdID0gbWVhc3VyZW1lbnQtPmdhaW5faWR4OwotCQlmYWN0b3J5X2FjdHVhbF9wd3JbY10gPSBtZWFzdXJlbWVudC0+YWN0dWFsX3BvdzsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhaW4gPSAlZFxuIiwgYyk7Ci0JCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJmY3RyeSB0bXAgJWQsICIKLQkJCQkgICJjdXJyIHRtcCAlZCwgY29tcCAlZCBzdGVwc1xuIiwKLQkJCQkgIGZhY3RvcnlfdGVtcCwgY3VycmVudF90ZW1wLAotCQkJCSAgdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImZjdHJ5IGlkeCAlZCwgZmN0cnkgcHdyICVkXG4iLAotCQkJCSAgZmFjdG9yeV9nYWluX2luZGV4W2NdLAotCQkJCSAgZmFjdG9yeV9hY3R1YWxfcHdyW2NdKTsKLQl9Ci0KLQkvKiBmb3IgZWFjaCBvZiAzMyBiaXQtcmF0ZXMgKGluY2x1ZGluZyAxIGZvciBDQ0spICovCi0JZm9yIChpID0gMDsgaSA8IFBPV0VSX1RBQkxFX05VTV9FTlRSSUVTOyBpKyspIHsKLQkJdTggaXNfbWltb19yYXRlOwotCQl1bmlvbiBpd2w0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHR4X3Bvd2VyOwotCi0JCS8qIGZvciBtaW1vLCByZWR1Y2UgZWFjaCBjaGFpbidzIHR4cG93ZXIgYnkgaGFsZgotCQkgKiAoM2RCLCA2IHN0ZXBzKSwgc28gdG90YWwgb3V0cHV0IHBvd2VyIGlzIHJlZ3VsYXRvcnkKLQkJICogY29tcGxpYW50LiAqLwotCQlpZiAoaSAmIDB4OCkgewotCQkJY3VycmVudF9yZWd1bGF0b3J5ID0gcmVnX2xpbWl0IC0KLQkJCSAgICBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTjsKLQkJCWlzX21pbW9fcmF0ZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50X3JlZ3VsYXRvcnkgPSByZWdfbGltaXQ7Ci0JCQlpc19taW1vX3JhdGUgPSAwOwotCQl9Ci0KLQkJLyogZmluZCB0eHBvd2VyIGxpbWl0LCBlaXRoZXIgaGFyZHdhcmUgb3IgcmVndWxhdG9yeSAqLwotCQlwb3dlcl9saW1pdCA9IHNhdHVyYXRpb25fcG93ZXIgLSBiYWNrX29mZl90YWJsZVtpXTsKLQkJaWYgKHBvd2VyX2xpbWl0ID4gY3VycmVudF9yZWd1bGF0b3J5KQotCQkJcG93ZXJfbGltaXQgPSBjdXJyZW50X3JlZ3VsYXRvcnk7Ci0KLQkJLyogcmVkdWNlIHVzZXIncyB0eHBvd2VyIHJlcXVlc3QgaWYgbmVjZXNzYXJ5Ci0JCSAqIGZvciB0aGlzIHJhdGUgb24gdGhpcyBjaGFubmVsICovCi0JCXRhcmdldF9wb3dlciA9IHVzZXJfdGFyZ2V0X3Bvd2VyOwotCQlpZiAodGFyZ2V0X3Bvd2VyID4gcG93ZXJfbGltaXQpCi0JCQl0YXJnZXRfcG93ZXIgPSBwb3dlcl9saW1pdDsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAicmF0ZSAlZCBzYXQgJWQgcmVnICVkIHVzciAlZCB0Z3QgJWRcbiIsCi0JCQkJICBpLCBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV0sCi0JCQkJICBjdXJyZW50X3JlZ3VsYXRvcnksIHVzZXJfdGFyZ2V0X3Bvd2VyLAotCQkJCSAgdGFyZ2V0X3Bvd2VyKTsKLQotCQkvKiBmb3IgZWFjaCBvZiAyIFR4IGNoYWlucyAocmFkaW8gdHJhbnNtaXR0ZXJzKSAqLwotCQlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7Ci0JCQlzMzIgYXR0ZW5fdmFsdWU7Ci0KLQkJCWlmIChpc19taW1vX3JhdGUpCi0JCQkJYXR0ZW5fdmFsdWUgPQotCQkJCSAgICAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC4KLQkJCQkgICAgdHhfYXR0ZW5bdHhhdHRlbl9ncnBdW2NdKTsKLQkJCWVsc2UKLQkJCQlhdHRlbl92YWx1ZSA9IDA7Ci0KLQkJCS8qIGNhbGN1bGF0ZSBpbmRleDsgaGlnaGVyIGluZGV4IG1lYW5zIGxvd2VyIHR4cG93ZXIgKi8KLQkJCXBvd2VyX2luZGV4ID0gKHU4KSAoZmFjdG9yeV9nYWluX2luZGV4W2NdIC0KLQkJCQkJICAgICh0YXJnZXRfcG93ZXIgLQotCQkJCQkgICAgIGZhY3RvcnlfYWN0dWFsX3B3cltjXSkgLQotCQkJCQkgICAgdGVtcGVyYXR1cmVfY29tcFtjXSAtCi0JCQkJCSAgICB2b2x0YWdlX2NvbXBlbnNhdGlvbiArCi0JCQkJCSAgICBhdHRlbl92YWx1ZSk7Ci0KLS8qCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNhbGN1bGF0ZWQgdHhwb3dlciBpbmRleCAlZFxuIiwKLQkJCQkJCXBvd2VyX2luZGV4KTsgKi8KLQotCQkJaWYgKHBvd2VyX2luZGV4IDwgZ2V0X21pbl9wb3dlcl9pbmRleChpLCBiYW5kKSkKLQkJCQlwb3dlcl9pbmRleCA9IGdldF9taW5fcG93ZXJfaW5kZXgoaSwgYmFuZCk7Ci0KLQkJCS8qIGFkanVzdCA1IEdIeiBpbmRleCB0byBzdXBwb3J0IG5lZ2F0aXZlIGluZGV4ZXMgKi8KLQkJCWlmICghYmFuZCkKLQkJCQlwb3dlcl9pbmRleCArPSA5OwotCi0JCQkvKiBDQ0ssIHJhdGUgMzIsIHJlZHVjZSB0eHBvd2VyIGZvciBDQ0sgKi8KLQkJCWlmIChpID09IFBPV0VSX1RBQkxFX0NDS19FTlRSWSkKLQkJCQlwb3dlcl9pbmRleCArPQotCQkJCSAgICBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVA7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEgKi8KLQkJCWlmIChwb3dlcl9pbmRleCA+IDEwNykgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkID4gMTA3XG4iLAotCQkJCQkgICAgcG93ZXJfaW5kZXgpOwotCQkJCXBvd2VyX2luZGV4ID0gMTA3OwotCQkJfQotCQkJaWYgKHBvd2VyX2luZGV4IDwgMCkgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkIDwgMFxuIiwKLQkJCQkJICAgIHBvd2VyX2luZGV4KTsKLQkJCQlwb3dlcl9pbmRleCA9IDA7Ci0JCQl9Ci0KLQkJCS8qIGZpbGwgdHhwb3dlciBjb21tYW5kIGZvciB0aGlzIHJhdGUvY2hhaW4gKi8KLQkJCXR4X3Bvd2VyLnMucmFkaW9fdHhfZ2FpbltjXSA9Ci0JCQkJZ2Fpbl90YWJsZVtiYW5kXVtwb3dlcl9pbmRleF0ucmFkaW87Ci0JCQl0eF9wb3dlci5zLmRzcF9wcmVkaXNfYXR0ZW5bY10gPQotCQkJCWdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaW5kZXhdLmRzcDsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYWluICVkIG1pbW8gJWQgaW5kZXggJWQgIgotCQkJCQkgICJnYWluIDB4JTAyeCBkc3AgJWRcbiIsCi0JCQkJCSAgYywgYXR0ZW5fdmFsdWUsIHBvd2VyX2luZGV4LAotCQkJCQl0eF9wb3dlci5zLnJhZGlvX3R4X2dhaW5bY10sCi0JCQkJCXR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSk7Ci0JCX0gLyogZm9yIGVhY2ggY2hhaW4gKi8KLQotCQl0eF9wb3dlcl90YmwtPnBvd2VyX3RibFtpXS5kdyA9IGNwdV90b19sZTMyKHR4X3Bvd2VyLmR3KTsKLQotCX0gLyogZm9yIGVhY2ggcmF0ZSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZW5kX3R4X3Bvd2VyIC0gQ29uZmlndXJlIHRoZSBUWFBPV0VSIGxldmVsIHVzZXIgbGltaXQKLSAqCi0gKiBVc2VzIHRoZSBhY3RpdmUgUlhPTiBmb3IgY2hhbm5lbCwgYmFuZCwgYW5kIGNoYXJhY3RlcmlzdGljcyAoaHQ0MCwgaGlnaCkKLSAqIFRoZSBwb3dlciBsaW1pdCBpcyB0YWtlbiBmcm9tIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10LgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCBjbWQgPSB7IDAgfTsKLQlpbnQgcmV0OwotCXU4IGJhbmQgPSAwOwotCWJvb2wgaXNfaHQ0MCA9IGZhbHNlOwotCXU4IGN0cmxfY2hhbl9oaWdoID0gMDsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKFdBUk5fT05DRSh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyksCi0JCSAgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQliYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0JaXNfaHQ0MCA9IGl3NDk2NV9pc19odDQwX2NoYW5uZWwoY3R4LT5hY3RpdmUuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYgKGN0eC0+YWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spKQotCQljdHJsX2NoYW5faGlnaCA9IDE7Ci0KLQljbWQuYmFuZCA9IGJhbmQ7Ci0JY21kLmNoYW5uZWwgPSBjdHgtPmFjdGl2ZS5jaGFubmVsOwotCi0JcmV0ID0gaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHByaXYsIGJhbmQsCi0JCQkJbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCksCi0JCQkJaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwKLQkJCSBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBzaXplb2YoY21kKSwgJmNtZCk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpd2w0OTY1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24xID0gJmN0eC0+c3RhZ2luZzsKLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbjIgPSAmY3R4LT5hY3RpdmU7Ci0KLQlpZiAoKHJ4b24xLT5mbGFncyA9PSByeG9uMi0+ZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+ZmlsdGVyX2ZsYWdzID09IHJ4b24yLT5maWx0ZXJfZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+Y2NrX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5jY2tfYmFzaWNfcmF0ZXMpICYmCi0JICAgIChyeG9uMS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzID09Ci0JICAgICByeG9uMi0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KLQkgICAgIHJ4b24yLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPnJ4X2NoYWluID09IHJ4b24yLT5yeF9jaGFpbikgJiYKLQkgICAgKHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOwotCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7Ci0Jcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7Ci0Jcnhvbl9hc3NvYy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPQotCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2Mub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9Ci0JICAgIGN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2MucnhfY2hhaW5fc2VsZWN0X2ZsYWdzID0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgUkVQTFlfUlhPTl9BU1NPQywKLQkJCQkgICAgIHNpemVvZihyeG9uX2Fzc29jKSwgJnJ4b25fYXNzb2MsIE5VTEwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQkvKiBjYXN0IGF3YXkgdGhlIGNvbnN0IGZvciBhY3RpdmVfcnhvbiBpbiB0aGlzIGZ1bmN0aW9uICovCi0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7Ci0JaW50IHJldDsKLQlib29sIG5ld19hc3NvYyA9Ci0JCSEhKGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCi0JY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKLQotCXJldCA9IGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQocHJpdiwgY3R4KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgUlhPTiBjb25maWd1cmF0aW9uLiAgTm90IGNvbW1pdHRpbmcuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKLQkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwotCSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKLQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKLQl9Ci0KLQkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKLQkgKiBpd2xfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKLQkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCi0JaWYgKCFpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChwcml2LCBjdHgpKSB7Ci0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX2Fzc29jKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJLyoKLQkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAotCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KLQkJICovCi0JCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcwotCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKLQkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0JICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBuZXdfYXNzb2MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQpLAotCQkJCSAgICAgICBhY3RpdmVfcnhvbik7Ci0KLQkJLyogSWYgdGhlIG1hc2sgY2xlYXJpbmcgZmFpbGVkIHRoZW4gd2Ugc2V0Ci0JCSAqIGFjdGl2ZV9yeG9uIGJhY2sgdG8gd2hhdCBpdCB3YXMgcHJldmlvdXNseSAqLwotCQlpZiAocmV0KSB7Ci0JCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LCBjdHgpOwotCQlyZXQgPSBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhwcml2LCBjdHgpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcmVzdG9yZSBXRVAga2V5cyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZW5kaW5nIFJYT05cbiIKLQkJICAgICAgICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKLQkJICAgICAgICIqIGNoYW5uZWwgPSAlZFxuIgotCQkgICAgICAgIiogYnNzaWQgPSAlcE1cbiIsCi0JCSAgICAgICAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCi0JCSAgICAgICBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksCi0JCSAgICAgICBjdHgtPnN0YWdpbmcuYnNzaWRfYWRkcik7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHByaXYsIGN0eCwKLQkJCQkhcHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5zd19jcnlwdG8pOwotCi0JLyogQXBwbHkgdGhlIG5ldyBjb25maWd1cmF0aW9uCi0JICogUlhPTiB1bmFzc29jIGNsZWFycyB0aGUgc3RhdGlvbiB0YWJsZSBpbiB1Q29kZSBzbyByZXN0b3JhdGlvbiBvZgotCSAqIHN0YXRpb25zIGlzIG5lZWRlZCBhZnRlciBpdCAodGhlIFJYT04gY29tbWFuZCkgY29tcGxldGVzCi0JICovCi0JaWYgKCFuZXdfYXNzb2MpIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZXR1cm4gZnJvbSAhbmV3X2Fzc29jIFJYT04uXG4iKTsKLQkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwgY3R4KTsKLQkJaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCXJldCA9IGl3bDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZXN0b3JlIFdFUCBrZXlzICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCWlmIChuZXdfYXNzb2MpIHsKLQkJcHJpdi0+c3RhcnRfY2FsaWIgPSAwOwotCQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkJICogUlhPTiBhc3NvYyBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAotCQkgKi8KLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCX0KLQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQotCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQotCS8qIElmIHdlIGlzc3VlIGEgbmV3IFJYT04gY29tbWFuZCB3aGljaCByZXF1aXJlZCBhIHR1bmUgdGhlbiB3ZSBtdXN0Ci0JICogc2VuZCBhIG5ldyBUWFBPV0VSIGNvbW1hbmQgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBUeCBhbnkgZnJhbWVzICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nIFRYIHBvd2VyICglZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgcmM7Ci0JdTggYmFuZCA9IDA7Ci0JYm9vbCBpc19odDQwID0gZmFsc2U7Ci0JdTggY3RybF9jaGFuX2hpZ2ggPSAwOwotCXN0cnVjdCBpd2w0OTY1X2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWJhbmQgPSBwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlpc19odDQwID0gaXc0OTY1X2lzX2h0NDBfY2hhbm5lbChjdHgtPnN0YWdpbmcuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYKLQkgICAgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKSkKLQkJY3RybF9jaGFuX2hpZ2ggPSAxOwotCi0JY21kLmJhbmQgPSBiYW5kOwotCWNtZC5leHBlY3RfYmVhY29uID0gMDsKLQljaCA9IGNoX3N3aXRjaC0+Y2hhbm5lbC0+aHdfdmFsdWU7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JY21kLnJ4b25fZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0JY21kLnJ4b25fZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OwotCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOwotCS8qCi0JICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCi0JICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKLQkgKi8KLQlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7Ci0JCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLwotCQkgICAgYmVhY29uX2ludGVydmFsKSkgewotCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCi0JCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7Ci0JCX0gZWxzZQotCQkJc3dpdGNoX2NvdW50ID0gMDsKLQl9Ci0JaWYgKHN3aXRjaF9jb3VudCA8PSAxKQotCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7Ci0JZWxzZSB7Ci0JCXN3aXRjaF90aW1lX2luX3VzZWMgPQotCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOwotCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF9sZWdhY3lfdXNlY3NfdG9fYmVhY29ucyhwcml2LAotCQkJCQkJCSBzd2l0Y2hfdGltZV9pbl91c2VjLAotCQkJCQkJCSBiZWFjb25faW50ZXJ2YWwpOwotCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCQkJICAgICAgcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUsCi0JCQkJCQkgICAgICB1Y29kZV9zd2l0Y2hfdGltZSwKLQkJCQkJCSAgICAgIGJlYWNvbl9pbnRlcnZhbCk7Ci0JfQotCUlXTF9ERUJVR18xMUgocHJpdiwgInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwKLQkJICAgICAgY21kLnN3aXRjaF90aW1lKTsKLQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoKTsKLQlpZiAoY2hfaW5mbykKLQkJY21kLmV4cGVjdF9iZWFjb24gPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKLQkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBpd2w0OTY1X2ZpbGxfdHhwb3dlcl90YmwocHJpdiwgYmFuZCwgY2gsIGlzX2h0NDAsCi0JCQkJICAgICAgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyYykgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJlcnJvcjolZCAgZmlsbCB0eHBvd2VyX3RibFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCi0JCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCSAgICB1MTYgYnl0ZV9jbnQpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCAqc2NkX2JjX3RibCA9IHByaXYtPnNjZF9iY190YmxzLmFkZHI7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKLQlpbnQgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7Ci0JX19sZTE2IGJjX2VudDsKLQotCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7Ci0KLQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gJiAweEZGRik7Ci0JLyogU2V0IHVwIGJ5dGUgY291bnQgd2l0aGluIGZpcnN0IDI1NiBlbnRyaWVzICovCi0Jc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbd3JpdGVfcHRyXSA9IGJjX2VudDsKLQotCS8qIElmIHdpdGhpbiBmaXJzdCA2NCBlbnRyaWVzLCBkdXBsaWNhdGUgYXQgZW5kICovCi0JaWYgKHdyaXRlX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKLQkJc2NkX2JjX3RibFt0eHFfaWRdLgotCQkJdGZkX29mZnNldFtURkRfUVVFVUVfU0laRV9NQVggKyB3cml0ZV9wdHJdID0gYmNfZW50OwotfQotCi0vKioKLSAqIGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlIC0gcmV0dXJuIHRoZSBjYWxpYnJhdGVkIHRlbXBlcmF0dXJlIChpbiBLZWx2aW4pCi0gKiBAc3RhdGlzdGljczogUHJvdmlkZXMgdGhlIHRlbXBlcmF0dXJlIHJlYWRpbmcgZnJvbSB0aGUgdUNvZGUKLSAqCi0gKiBBIHJldHVybiBvZiA8MCBpbmRpY2F0ZXMgYm9ndXMgZGF0YSBpbiB0aGUgc3RhdGlzdGljcwotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcGVyYXR1cmU7Ci0JczMyIHZ0OwotCXMzMiBSMSwgUjIsIFIzOwotCXUzMiBSNDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfVEVNUEVSQVRVUkUsICZwcml2LT5zdGF0dXMpICYmCi0JICAgIChwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmZsYWcgJgotCQkJU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykpIHsKLQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlJ1bm5pbmcgSFQ0MCB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMV0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzFdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1sxXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzFdKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfVEVNUChwcml2LCAiUnVubmluZyB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMF0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzBdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1swXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzBdKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBlcmF0dXJlIGlzIG9ubHkgMjMgYml0cywgc28gc2lnbiBleHRlbmQgb3V0IHRvIDMyLgotCSAqCi0JICogTk9URSBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdGlzdGljcyBub3RpZmljYXRpb24geWV0Ci0JICogd2l0aCBhbiB1cGRhdGVkIHRlbXBlcmF0dXJlLCB1c2UgUjQgcHJvdmlkZWQgdG8gdXMgaW4gdGhlCi0JICogImluaXRpYWxpemUiIEFMSVZFIHJlc3BvbnNlLgotCSAqLwotCWlmICghdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSkKLQkJdnQgPSBzaWduX2V4dGVuZDMyKFI0LCAyMyk7Ci0JZWxzZQotCQl2dCA9IHNpZ25fZXh0ZW5kMzIobGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy4KLQkJCQkgZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpLCAyMyk7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWIgdmFsdWVzIFJbMS0zXTogJWQgJWQgJWQgUjQ6ICVkXG4iLCBSMSwgUjIsIFIzLCB2dCk7Ci0KLQlpZiAoUjMgPT0gUjEpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FsaWJyYXRpb24gY29uZmxpY3QgUjEgPT0gUjNcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgS2VsdmluLCBhZGp1c3QgYnkgOTclLgotCSAqIEFkZCBvZmZzZXQgdG8gY2VudGVyIHRoZSBhZGp1c3RtZW50IGFyb3VuZCAwIGRlZ3JlZXMgQ2VudGlncmFkZS4gKi8KLQl0ZW1wZXJhdHVyZSA9IFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMICogKHZ0IC0gUjIpOwotCXRlbXBlcmF0dXJlIC89IChSMyAtIFIxKTsKLQl0ZW1wZXJhdHVyZSA9ICh0ZW1wZXJhdHVyZSAqIDk3KSAvIDEwMCArIFRFTVBFUkFUVVJFX0NBTElCX0tFTFZJTl9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWJyYXRlZCB0ZW1wZXJhdHVyZTogJWRLLCAlZENcbiIsCi0JCQl0ZW1wZXJhdHVyZSwgS0VMVklOX1RPX0NFTFNJVVModGVtcGVyYXR1cmUpKTsKLQotCXJldHVybiB0ZW1wZXJhdHVyZTsKLX0KLQotLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLiAqLwotI2RlZmluZSBJV0xfVEVNUEVSQVRVUkVfVEhSRVNIT0xEICAgMwotCi0vKioKLSAqIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKLSAqCi0gKiBJZiB0aGUgdGVtcGVyYXR1cmUgY2hhbmdlZCBoYXMgY2hhbmdlZCBzdWZmaWNpZW50bHksIHRoZW4gYSByZWNhbGlicmF0aW9uCi0gKiBpcyBuZWVkZWQuCi0gKgotICogQXNzdW1lcyBjYWxsZXIgd2lsbCByZXBsYWNlIHByaXYtPmxhc3RfdGVtcGVyYXR1cmUgb25jZSBjYWxpYnJhdGlvbgotICogZXhlY3V0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9pc190ZW1wX2NhbGliX25lZWRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHRlbXBfZGlmZjsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NUQVRJU1RJQ1MsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19URU1QKHByaXYsICJUZW1wZXJhdHVyZSBub3QgdXBkYXRlZCAtLSBubyBzdGF0aXN0aWNzLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXRlbXBfZGlmZiA9IHByaXYtPnRlbXBlcmF0dXJlIC0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotCWlmICh0ZW1wX2RpZmYgPCAwKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCQl0ZW1wX2RpZmYgPSAtdGVtcF9kaWZmOwotCX0gZWxzZSBpZiAodGVtcF9kaWZmID09IDApCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiVGVtcGVyYXR1cmUgdW5jaGFuZ2VkXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyB3YXJtZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCi0JaWYgKHRlbXBfZGlmZiA8IElXTF9URU1QRVJBVFVSRV9USFJFU0hPTEQpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICIgPT4gdGhlcm1hbCB0eHBvd2VyIGNhbGliIG5vdCBuZWVkZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbmVlZGVkXG4iKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3RlbXBlcmF0dXJlX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcDsKLQotCXRlbXAgPSBpd2w0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQlpZiAoSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0ZW1wKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKLQkJaWYgKHByaXYtPnRlbXBlcmF0dXJlKQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlIGNoYW5nZWQgIgotCQkJCSAgICAgICAiZnJvbSAlZEMgdG8gJWRDXG4iLAotCQkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyhwcml2LT50ZW1wZXJhdHVyZSksCi0JCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHRlbXApKTsKLQkJZWxzZQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlICIKLQkJCQkgICAgICAgImluaXRpYWxpemVkIHRvICVkQ1xuIiwKLQkJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModGVtcCkpOwotCX0KLQotCXByaXYtPnRlbXBlcmF0dXJlID0gdGVtcDsKLQlzZXRfYml0KFNUQVRVU19URU1QRVJBVFVSRSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIXByaXYtPmRpc2FibGVfdHhfcG93ZXJfY2FsICYmCi0JICAgICB1bmxpa2VseSghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgJiYKLQkgICAgIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQocHJpdikpCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhwb3dlcl93b3JrKTsKLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2dldF9oY21kX3NpemUodTggY21kX2lkLCB1MTYgbGVuKQotewotCXN3aXRjaCAoY21kX2lkKSB7Ci0JY2FzZSBSRVBMWV9SWE9OOgotCQlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X3J4b25fY21kKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbGVuOwotCX0KLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKmNtZCwKLQkJCQkJCQkJdTggKmRhdGEpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgKilkYXRhOwotCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKLQltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOwotCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2tleWluZm8pKTsKLQlhZGRzdGEtPnN0YXRpb25fZmxhZ3MgPSBjbWQtPnN0YXRpb25fZmxhZ3M7Ci0JYWRkc3RhLT5zdGF0aW9uX2ZsYWdzX21zayA9IGNtZC0+c3RhdGlvbl9mbGFnc19tc2s7Ci0JYWRkc3RhLT50aWRfZGlzYWJsZV90eCA9IGNtZC0+dGlkX2Rpc2FibGVfdHg7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0JYWRkc3RhLT5zbGVlcF90eF9jb3VudCA9IGNtZC0+c2xlZXBfdHhfY291bnQ7Ci0JYWRkc3RhLT5yZXNlcnZlZDEgPSBjcHVfdG9fbGUxNigwKTsKLQlhZGRzdGEtPnJlc2VydmVkMiA9IGNwdV90b19sZTE2KDApOwotCi0JcmV0dXJuICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2dldF9zY2Rfc3NuKHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3ApCi17Ci0JcmV0dXJuIGxlMzJfdG9fY3B1cCgmdHhfcmVzcC0+dS5zdGF0dXMgKyB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiBNQVhfU047Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UgZm9yIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbiBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSAgICAgIHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AsCi0JCQkJICAgICAgaW50IHR4cV9pZCwgdTE2IHN0YXJ0X2lkeCkKLXsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBhZ2dfdHhfc3RhdHVzICpmcmFtZV9zdGF0dXMgPSB0eF9yZXNwLT51LmFnZ19zdGF0dXM7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gTlVMTDsKLQl1MzIgcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKTsKLQlpbnQgaSwgc2gsIGlkeDsKLQl1MTYgc2VxOwotCWlmIChhZ2ctPndhaXRfZm9yX2JhKQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgImdvdCB0eCByZXNwb25zZSB3L28gYmxvY2stYWNrXG4iKTsKLQotCWFnZy0+ZnJhbWVfY291bnQgPSB0eF9yZXNwLT5mcmFtZV9jb3VudDsKLQlhZ2ctPnN0YXJ0X2lkeCA9IHN0YXJ0X2lkeDsKLQlhZ2ctPnJhdGVfbl9mbGFncyA9IHJhdGVfbl9mbGFnczsKLQlhZ2ctPmJpdG1hcCA9IDA7Ci0KLQkvKiBudW0gZnJhbWVzIGF0dGVtcHRlZCBieSBUeCBjb21tYW5kICovCi0JaWYgKGFnZy0+ZnJhbWVfY291bnQgPT0gMSkgewotCQkvKiBPbmx5IG9uZSBmcmFtZSB3YXMgYXR0ZW1wdGVkOyBubyBibG9jay1hY2sgd2lsbCBhcnJpdmUgKi8KLQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzWzBdLnN0YXR1cyk7Ci0JCWlkeCA9IHN0YXJ0X2lkeDsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKLQkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwgaWR4KTsKLQotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOwotCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKLQkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JCWluZm8tPmZsYWdzIHw9IGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHN0YXR1cyk7Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2wocHJpdiwgcmF0ZV9uX2ZsYWdzLCBpbmZvKTsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIjEgRnJhbWUgMHgleCBmYWlsdXJlIDolZFxuIiwKLQkJCQkgICAgc3RhdHVzICYgMHhmZiwgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmF0ZSBJbmZvIHJhdGVfbl9mbGFncz0leFxuIiwgcmF0ZV9uX2ZsYWdzKTsKLQotCQlhZ2ctPndhaXRfZm9yX2JhID0gMDsKLQl9IGVsc2UgewotCQkvKiBUd28gb3IgbW9yZSBmcmFtZXMgd2VyZSBhdHRlbXB0ZWQ7IGV4cGVjdCBibG9jay1hY2sgKi8KLQkJdTY0IGJpdG1hcCA9IDA7Ci0JCWludCBzdGFydCA9IGFnZy0+c3RhcnRfaWR4OwotCi0JCS8qIENvbnN0cnVjdCBiaXQtbWFwIG9mIHBlbmRpbmcgZnJhbWVzIHdpdGhpbiBUeCB3aW5kb3cgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFnZy0+ZnJhbWVfY291bnQ7IGkrKykgewotCQkJdTE2IHNjOwotCQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnN0YXR1cyk7Ci0JCQlzZXEgID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnNlcXVlbmNlKTsKLQkJCWlkeCA9IFNFUV9UT19JTkRFWChzZXEpOwotCQkJdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcSk7Ci0KLQkJCWlmIChzdGF0dXMgJiAoQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0sgfAotCQkJCSAgICAgIEFHR19UWF9TVEFURV9BQk9SVF9NU0spKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIHR4cV9pZD0lZCBpZHg9JWRcbiIsCi0JCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIHR4cV9pZCwgaWR4KTsKLQotCQkJaGRyID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9nZXRfaGRyKHByaXYsIHR4cV9pZCwgaWR4KTsKLQkJCWlmICghaGRyKSB7Ci0JCQkJSVdMX0VSUihwcml2LAotCQkJCQkiQlVHX09OIGlkeCBkb2Vzbid0IHBvaW50IHRvIHZhbGlkIHNrYiIKLQkJCQkJIiBpZHg9JWQsIHR4cV9pZD0lZFxuIiwgaWR4LCB0eHFfaWQpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKLQkJCWlmIChpZHggIT0gKFNFUV9UT19TTihzYykgJiAweGZmKSkgewotCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJIkJVR19PTiBpZHggZG9lc24ndCBtYXRjaCBzZXEgY29udHJvbCIKLQkJCQkJIiBpZHg9JWQsIHNlcV9pZHg9JWQsIHNlcT0lZFxuIiwKLQkJCQkJaWR4LCBTRVFfVE9fU04oc2MpLCBoZHItPnNlcV9jdHJsKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQUdHIEZyYW1lIGk9JWQgaWR4ICVkIHNlcT0lZFxuIiwKLQkJCQkJICAgaSwgaWR4LCBTRVFfVE9fU04oc2MpKTsKLQotCQkJc2ggPSBpZHggLSBzdGFydDsKLQkJCWlmIChzaCA+IDY0KSB7Ci0JCQkJc2ggPSAoc3RhcnQgLSBpZHgpICsgMHhmZjsKLQkJCQliaXRtYXAgPSBiaXRtYXAgPDwgc2g7Ci0JCQkJc2ggPSAwOwotCQkJCXN0YXJ0ID0gaWR4OwotCQkJfSBlbHNlIGlmIChzaCA8IC02NCkKLQkJCQlzaCAgPSAweGZmIC0gKHN0YXJ0IC0gaWR4KTsKLQkJCWVsc2UgaWYgKHNoIDwgMCkgewotCQkJCXNoID0gc3RhcnQgLSBpZHg7Ci0JCQkJc3RhcnQgPSBpZHg7Ci0JCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOwotCQkJCXNoID0gMDsKLQkJCX0KLQkJCWJpdG1hcCB8PSAxVUxMIDw8IHNoOwotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJzdGFydD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCQkgICBzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCQl9Ci0KLQkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7Ci0JCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiRnJhbWVzICVkIHN0YXJ0X2lkeD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LAotCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWdnLT5iaXRtYXApOwotCi0JCWlmIChiaXRtYXApCi0JCQlhZ2ctPndhaXRfZm9yX2JhID0gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBpd2w0OTY1X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4ICphZGRyKQotewotCWludCBpOwotCWludCBzdGFydCA9IDA7Ci0JaW50IHJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpCi0JCXN0YXJ0ID0gSVdMX1NUQV9JRDsKLQotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKLQkJcmV0dXJuIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IHN0YXJ0OyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKQotCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmJgotCQkgICAgKCFjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLAotCQkJCQkgYWRkcikpKSB7Ci0JCQlyZXQgPSBpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCUlXTF9ERUJVR19BU1NPQ19MSU1JVChwcml2LCAiY2FuIG5vdCBmaW5kIFNUQSAlcE0gdG90YWwgJWRcbiIsCi0JCQkgICAgICBhZGRyLCBwcml2LT5udW1fc3RhdGlvbnMpOwotCi0gb3V0OgotCS8qCi0JICogSXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgbW9yZSBjb21tYW5kcyBpbnRlcmFjdGluZyB3aXRoIHN0YXRpb25zCi0JICogYXJyaXZlIGJlZm9yZSB3ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZyB0aGUgYWRkaW5nIG9mCi0JICogc3RhdGlvbgotCSAqLwotCWlmIChyZXQgIT0gSVdMX0lOVkFMSURfU1RBVElPTiAmJgotCSAgICAoIShwcml2LT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgfHwKLQkgICAgICgocHJpdi0+c3RhdGlvbnNbcmV0XS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCi0JICAgICAgKHByaXYtPnN0YXRpb25zW3JldF0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpKSkgewotCQlJV0xfRVJSKHByaXYsICJSZXF1ZXN0ZWQgc3RhdGlvbiBpbmZvIGZvciBzdGEgJWQgYmVmb3JlIHJlYWR5LlxuIiwKLQkJCXJldCk7Ci0JCXJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2dldF9yYV9zdGFfaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQotewotCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKLQkJcmV0dXJuIElXTF9BUF9JRDsKLQl9IGVsc2UgewotCQl1OCAqZGEgPSBpZWVlODAyMTFfZ2V0X0RBKGhkcik7Ci0JCXJldHVybiBpd2w0OTY1X2ZpbmRfc3RhdGlvbihwcml2LCBkYSk7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcmVwbHlfdHggLSBIYW5kbGUgc3RhbmRhcmQgKG5vbi1hZ2dyZWdhdGlvbikgVHggcmVzcG9uc2UKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9yZXBseV90eChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTE2IHNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOwotCWludCB0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxdWVuY2UpOwotCWludCBpbmRleCA9IFNFUV9UT19JTkRFWChzZXF1ZW5jZSk7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOwotCXUzMiAgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+dS5zdGF0dXMpOwotCWludCB1bmluaXRpYWxpemVkX3Zhcih0aWQpOwotCWludCBzdGFfaWQ7Ci0JaW50IGZyZWVkOwotCXU4ICpxYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsCi0JCQkgIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKLQkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwotCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7Ci0KLQloZHIgPSBpd2xfbGVnYWN5X3R4X3F1ZXVlX2dldF9oZHIocHJpdiwgdHhxX2lkLCBpbmRleCk7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0KLQotCXN0YV9pZCA9IGl3bDQ5NjVfZ2V0X3JhX3N0YV9pZChwcml2LCBoZHIpOwotCWlmICh0eHEtPnNjaGVkX3JldHJ5ICYmIHVubGlrZWx5KHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkgewotCQlJV0xfRVJSKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlpZiAodHhxLT5zY2hlZF9yZXRyeSkgewotCQljb25zdCB1MzIgc2NkX3NzbiA9IGl3bDQ5NjVfZ2V0X3NjZF9zc24odHhfcmVzcCk7Ci0JCXN0cnVjdCBpd2xfaHRfYWdnICphZ2cgPSBOVUxMOwotCQlXQVJOX09OKCFxYyk7Ci0KLQkJYWdnID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOwotCi0JCWl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHByaXYsIGFnZywgdHhfcmVzcCwgdHhxX2lkLCBpbmRleCk7Ci0KLQkJLyogY2hlY2sgaWYgQkFSIGlzIG5lZWRlZCAqLwotCQlpZiAoKHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEpICYmICFpd2w0OTY1X2lzX3R4X3N1Y2Nlc3Moc3RhdHVzKSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7Ci0KLQkJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoc2NkX3NzbiAmIDB4ZmYpKSB7Ci0JCQlpbmRleCA9IGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAoc2NkX3NzbiAmIDB4ZmYsCi0JCQkJCQkJCXR4cS0+cS5uX2JkKTsKLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmV0cnkgc2NoZWR1bGVyIHJlY2xhaW0gc2NkX3NzbiAiCi0JCQkJCSAgICIlZCBpbmRleCAlZFxuIiwgc2NkX3NzbiAsIGluZGV4KTsKLQkJCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQkJaWYgKHFjKQotCQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwKLQkJCQkJCSAgICAgICB0aWQsIGZyZWVkKTsKLQotCQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJCSAgICAoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZSgmdHhxLT5xKSA+IHR4cS0+cS5sb3dfbWFyaykKLQkJCQkgJiYgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCQlpd2xfbGVnYWN5X3dha2VfcXVldWUocHJpdiwgdHhxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUgKyAxOwotCQlpbmZvLT5mbGFncyB8PSBpd2w0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOwotCQlpd2w0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKHByaXYsCi0JCQkJCWxlMzJfdG9fY3B1KHR4X3Jlc3AtPnJhdGVfbl9mbGFncyksCi0JCQkJCWluZm8pOwotCi0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCi0JCQkJICAgInJhdGVfbl9mbGFncyAweCV4IHJldHJpZXMgJWRcbiIsCi0JCQkJICAgdHhxX2lkLAotCQkJCSAgIGl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHN0YXR1cyksIHN0YXR1cywKLQkJCQkgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAotCQkJCSAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOwotCi0JCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0JCWVsc2UgaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0KLQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJICAgIChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCX0KLQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJaXdsNDk2NV90eHFfY2hlY2tfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7Ci0KLQlpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhwcml2LCB0eF9yZXNwLT5mcmFtZV9jb3VudCwgc3RhdHVzKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bDQ5NjVfYmVhY29uX25vdGlmICpiZWFjb24gPSAodm9pZCAqKXBrdC0+dS5yYXc7Ci0JdTggcmF0ZSBfX21heWJlX3VudXNlZCA9Ci0JCWl3bDQ5NjVfaHdfZ2V0X3JhdGUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlX25fZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICUjeCwgcmV0cmllczolZCBpYnNzbWdyOiVkICIKLQkJInRzZjoweCUuOHglLjh4IHJhdGU6JWRcbiIsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIudS5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKLQkJYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5mYWlsdXJlX2ZyYW1lLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKLQotCXByaXYtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKLX0KLQotLyogU2V0IHVwIDQ5NjUtc3BlY2lmaWMgUnggZnJhbWUgcmVwbHkgaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogTGVnYWN5IFJ4IGZyYW1lcyAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcng7Ci0JLyogVHggcmVzcG9uc2UgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9UWF0gPSBpd2w0OTY1X3J4X3JlcGx5X3R4OwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9iZWFjb25fbm90aWY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2hjbWRfb3BzIGl3bDQ5NjVfaGNtZCA9IHsKLQkucnhvbl9hc3NvYyA9IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jLAotCS5jb21taXRfcnhvbiA9IGl3bDQ5NjVfY29tbWl0X3J4b24sCi0JLnNldF9yeG9uX2NoYWluID0gaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiwKLX07Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcG9zdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JLyoKLQkgKiBTaW5jZSBzZXR0aW5nIHRoZSBSWE9OIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKLQkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgaWYgbmVlZGVkCi0JICovCi0JaWYgKG1lbWNtcCgmY3R4LT5zdGFnaW5nLCAmY3R4LT5hY3RpdmUsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF2aWYgfHwgIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0KLQljb25mID0gaXdsX2xlZ2FjeV9pZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCWlmIChyZXQpCi0JCUlXTF9XQVJOKHByaXYsICJSWE9OIHRpbWluZyAtICIKLQkJCSAgICAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KHZpZi0+YnNzX2NvbmYuYWlkKTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJdmlmLT5ic3NfY29uZi5haWQsIHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7Ci0KLQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKLQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfQotCi0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsCi0JCQl2aWYtPmJzc19jb25mLmFpZCwgY3R4LT5hY3RpdmUuYnNzaWRfYWRkcik7Ci0KLQlzd2l0Y2ggKHZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQocHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluICVkIG1vZGVcbiIsCi0JCQkgIF9fZnVuY19fLCB2aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiB0aGUgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gd2lsbCBlbmFibGVkIFBNIHVwb24gY29tcGxldGlvbgotCSAqIElmIGNoYWluIG5vaXNlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLCB0aGVuIHdlIG5lZWQgdG8gZW5hYmxlCi0JICogcG93ZXIgbWFuYWdlbWVudCBoZXJlICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0RPTkUpCi0JCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwotCi0JLyogRW5hYmxlIFJ4IGRpZmZlcmVudGlhbCBnYWluIGFuZCBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbnMgKi8KLQlpd2w0OTY1X2NoYWluX25vaXNlX3Jlc2V0KHByaXYpOwotCXByaXYtPnN0YXJ0X2NhbGliID0gMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jb25maWdfYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCByZXQgPSAwOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCi0JCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JCS8qIFJYT04gVGltaW5nICovCi0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJSVdMX1dBUk4ocHJpdiwgIlJYT04gdGltaW5nIGZhaWxlZCAtICIKLQkJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCQkvKiBBUCBoYXMgYWxsIGFudGVubmFzICovCi0JCXByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOwotCi0JCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PQotCQkJCVJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCQllbHNlCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJfQotCQkvKiBuZWVkIHRvIHNlbmQgYmVhY29uIGNtZCBiZWZvcmUgY29tbWl0dGluZyBhc3NvYyBSWE9OISAqLwotCQlpd2w0OTY1X3NlbmRfYmVhY29uX2NtZChwcml2KTsKLQkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JfQotCWl3bDQ5NjVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyBpd2w0OTY1X2hjbWRfdXRpbHMgPSB7Ci0JLmdldF9oY21kX3NpemUgPSBpd2w0OTY1X2dldF9oY21kX3NpemUsCi0JLmJ1aWxkX2FkZHN0YV9oY21kID0gaXdsNDk2NV9idWlsZF9hZGRzdGFfaGNtZCwKLQkucmVxdWVzdF9zY2FuID0gaXdsNDk2NV9yZXF1ZXN0X3NjYW4sCi0JLnBvc3Rfc2NhbiA9IGl3bDQ5NjVfcG9zdF9zY2FuLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2w0OTY1X2xpYiA9IHsKLQkuc2V0X2h3X3BhcmFtcyA9IGl3bDQ5NjVfaHdfc2V0X2h3X3BhcmFtcywKLQkudHhxX3VwZGF0ZV9ieXRlX2NudF90YmwgPSBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsLAotCS50eHFfYXR0YWNoX2J1Zl90b190ZmQgPSBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKLQkudHhxX2ZyZWVfdGZkID0gaXdsNDk2NV9od190eHFfZnJlZV90ZmQsCi0JLnR4cV9pbml0ID0gaXdsNDk2NV9od190eF9xdWV1ZV9pbml0LAotCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsNDk2NV9yeF9oYW5kbGVyX3NldHVwLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsNDk2NV9od192YWxpZF9ydGNfZGF0YV9hZGRyLAotCS5pbml0X2FsaXZlX3N0YXJ0ID0gaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0LAotCS5sb2FkX3Vjb2RlID0gaXdsNDk2NV9sb2FkX2JzbSwKLQkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2csCi0JLmR1bXBfZmggPSBpd2w0OTY1X2R1bXBfZmgsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsX2xlZ2FjeV9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDQ5NjVfbmljX2NvbmZpZywKLQl9LAotCS5lZXByb21fb3BzID0gewotCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKLQkJCUVFUFJPTV80OTY1X1JFR1VMQVRPUllfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAotCQkJRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFMKLQkJfSwKLQkJLmFjcXVpcmVfc2VtYXBob3JlID0gaXdsNDk2NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCi0JCS5yZWxlYXNlX3NlbWFwaG9yZSA9IGl3bDQ5NjVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAotCX0sCi0JLnNlbmRfdHhfcG93ZXIJPSBpd2w0OTY1X3NlbmRfdHhfcG93ZXIsCi0JLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzLAotCS50ZW1wX29wcyA9IHsKLQkJLnRlbXBlcmF0dXJlID0gaXdsNDk2NV90ZW1wZXJhdHVyZV9jYWxpYiwKLQl9LAotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCi0JCS50eF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV90eF9zdGF0c19yZWFkLAotCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgaXdsNDk2NV9sZWdhY3lfb3BzID0gewotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bDQ5NjVfcG9zdF9hc3NvY2lhdGUsCi0JLmNvbmZpZ19hcCA9IGl3bDQ5NjVfY29uZmlnX2FwLAotCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAotCS51cGRhdGVfYmNhc3Rfc3RhdGlvbnMgPSBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucywKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzID0gewotCS50eCA9IGl3bDQ5NjVfbWFjX3R4LAotCS5zdGFydCA9IGl3bDQ5NjVfbWFjX3N0YXJ0LAotCS5zdG9wID0gaXdsNDk2NV9tYWNfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlLAotCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsX2xlZ2FjeV9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsNDk2NV9jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfa2V5ID0gaXdsNDk2NV9tYWNfc2V0X2tleSwKLQkudXBkYXRlX3RraXBfa2V5ID0gaXdsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5LAotCS5jb25mX3R4ID0gaXdsX2xlZ2FjeV9tYWNfY29uZl90eCwKLQkucmVzZXRfdHNmID0gaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmLAotCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsX2xlZ2FjeV9tYWNfYnNzX2luZm9fY2hhbmdlZCwKLQkuYW1wZHVfYWN0aW9uID0gaXdsNDk2NV9tYWNfYW1wZHVfYWN0aW9uLAotCS5od19zY2FuID0gaXdsX2xlZ2FjeV9tYWNfaHdfc2NhbiwKLQkuc3RhX2FkZCA9IGl3bDQ5NjVfbWFjX3N0YV9hZGQsCi0JLnN0YV9yZW1vdmUgPSBpd2xfbGVnYWN5X21hY19zdGFfcmVtb3ZlLAotCS5jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfbWFjX2NoYW5uZWxfc3dpdGNoLAotCS50eF9sYXN0X2JlYWNvbiA9IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDQ5NjVfb3BzID0gewotCS5saWIgPSAmaXdsNDk2NV9saWIsCi0JLmhjbWQgPSAmaXdsNDk2NV9oY21kLAotCS51dGlscyA9ICZpd2w0OTY1X2hjbWRfdXRpbHMsCi0JLmxlZCA9ICZpd2w0OTY1X2xlZF9vcHMsCi0JLmxlZ2FjeSA9ICZpd2w0OTY1X2xlZ2FjeV9vcHMsCi0JLmllZWU4MDIxMV9vcHMgPSAmaXdsNDk2NV9od19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9iYXNlX3BhcmFtcyBpd2w0OTY1X2Jhc2VfcGFyYW1zID0gewotCS5lZXByb21fc2l6ZSA9IElXTDQ5NjVfRUVQUk9NX0lNR19TSVpFLAotCS5udW1fb2ZfcXVldWVzID0gSVdMNDlfTlVNX1FVRVVFUywKLQkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElXTDQ5X05VTV9BTVBEVV9RVUVVRVMsCi0JLnBsbF9jZmdfdmFsID0gMCwKLQkuc2V0X2wwcyA9IHRydWUsCi0JLnVzZV9ic20gPSB0cnVlLAotCS5sZWRfY29tcGVuc2F0aW9uID0gNjEsCi0JLmNoYWluX25vaXNlX251bV9iZWFjb25zID0gSVdMNDk2NV9DQUxfTlVNX0JFQUNPTlMsCi0JLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi0JLnRlbXBlcmF0dXJlX2tlbHZpbiA9IHRydWUsCi0JLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAotCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotfTsKLQotc3RydWN0IGl3bF9jZmcgaXdsNDk2NV9jZmcgPSB7Ci0JLm5hbWUgPSAiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSBMaW5rIDQ5NjVBR04iLAotCS5md19uYW1lX3ByZSA9IElXTDQ5NjVfRldfUFJFLAotCS51Y29kZV9hcGlfbWF4ID0gSVdMNDk2NV9VQ09ERV9BUElfTUFYLAotCS51Y29kZV9hcGlfbWluID0gSVdMNDk2NV9VQ09ERV9BUElfTUlOLAotCS5za3UgPSBJV0xfU0tVX0F8SVdMX1NLVV9HfElXTF9TS1VfTiwKLQkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAotCS52YWxpZF9yeF9hbnQgPSBBTlRfQUJDLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzQ5NjVfRUVQUk9NX1ZFUlNJT04sCi0JLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OLAotCS5vcHMgPSAmaXdsNDk2NV9vcHMsCi0JLm1vZF9wYXJhbXMgPSAmaXdsNDk2NV9tb2RfcGFyYW1zLAotCS5iYXNlX3BhcmFtcyA9ICZpd2w0OTY1X2Jhc2VfcGFyYW1zLAotCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCi0JLyoKLQkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAotCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCi0JICovCi0JLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCi19OwotCi0vKiBNb2R1bGUgZmlybXdhcmUgKi8KLU1PRFVMRV9GSVJNV0FSRShJV0w0OTY1X01PRFVMRV9GSVJNV0FSRShJV0w0OTY1X1VDT0RFX0FQSV9NQVgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY4MTYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2hfXwotI2RlZmluZSBfX2l3bF80OTY1X2hfXwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0vKiBjb25maWd1cmF0aW9uIGZvciB0aGUgXzQ5NjUgZGV2aWNlcyAqLwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDQ5NjVfY2ZnOwotCi1leHRlcm4gc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bDQ5NjVfbW9kX3BhcmFtczsKLQotZXh0ZXJuIHN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzOwotCi0vKiB0eCBxdWV1ZSAqLwotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKTsKLQotLyogUlhPTiAqLwotdm9pZCBpd2w0OTY1X3NldF9yeG9uX2NoYWluKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLQotLyogdUNvZGUgKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiBsaWIgKi8KLXZvaWQgaXdsNDk2NV9jaGVja19hYm9ydF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHU4IGZyYW1lX2NvdW50LCB1MzIgc3RhdHVzKTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWludCBpd2w0OTY1X3J4X2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwotaW50IGl3bDQ5NjVfaHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2goc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSk7Ci1pbnQgaXdsNDk2NV9yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X3J4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIHR4ICovCi12b2lkIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLWludCBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKTsKLWludCBpd2w0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci12b2lkIGl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmF0ZV9uX2ZsYWdzLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKTsKLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKLWludCBpd2w0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwotaW50IGl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotaW50IGl3bDQ5NjVfdHhfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBpbmRleCk7Ci12b2lkIGl3bDQ5NjVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgbWFzayk7Ci0KLS8qCi0gKiBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIHUzMiBpbmRleCk7Ci0vKioKLSAqIGl3bDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyAtIChvcHRpb25hbGx5KSBzdGFydCBUeC9DbWQgcXVldWUKLSAqIEB0eF9maWZvX2lkOiBUeCBETUEvRklGTyBjaGFubmVsIChyYW5nZSAwLTcpIHRoYXQgdGhlIHF1ZXVlIHdpbGwgZmVlZAotICogQHNjZF9yZXRyeTogKDEpIEluZGljYXRlcyBxdWV1ZSB3aWxsIGJlIHVzZWQgaW4gYWdncmVnYXRpb24gbW9kZQotICoKLSAqIE5PVEU6ICBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCQlpbnQgdHhfZmlmb19pZCwgaW50IHNjZF9yZXRyeSk7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0KLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgVFhfU1RBVFVTX1NVQ0NFU1M6Ci0JY2FzZSBUWF9TVEFUVVNfRElSRUNUX0RPTkU6Ci0JCXJldHVybiBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JY2FzZSBUWF9TVEFUVVNfRkFJTF9ERVNUX1BTOgotCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXdsNDk2NV9pc190eF9zdWNjZXNzKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0JcmV0dXJuIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MpIHx8Ci0JICAgICAgIChzdGF0dXMgPT0gVFhfU1RBVFVTX0RJUkVDVF9ET05FKTsKLX0KLQotdTggaXdsNDk2NV90b2dnbGVfdHhfYW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYW50X2lkeCwgdTggdmFsaWQpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X21pc3NlZF9iZWFjb25fbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWJvb2wgaXdsNDk2NV9nb29kX3BsY3BfaGVhbHRoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Ci12b2lkIGl3bDQ5NjVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQotLyogc2NhbiAqLwotaW50IGl3bDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0KLS8qIHN0YXRpb24gbWdtdCAqLwotaW50IGl3bDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwotCi0vKiBoY21kICovCi1pbnQgaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKLWl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpIHsgcmV0dXJuICIiOyB9Ci0jZW5kaWYKLQotLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2w0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKTsKLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotaW50IGl3bDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHU4IHN0YV9pZCk7Ci1pbnQgaXdsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCWludCBzdGFfaWQsIGludCB0aWQpOwotaW50IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgaW50IHRpZCwgdTE2IHNzbik7Ci1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJaW50IHRpZCk7Ci12b2lkIGl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlpbnQgc3RhX2lkLCBpbnQgY250KTsKLWludCBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiByYXRlICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3ModTggYW50X2lkeCkKLXsKLQlyZXR1cm4gQklUKGFudF9pZHgpIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9od19nZXRfcmF0ZShfX2xlMzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiBsZTMyX3RvX2NwdShyYXRlX25fZmxhZ3MpICYgMHhGRjsKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMzIgaXdsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoZmxhZ3N8KHUzMilyYXRlKTsKLX0KLQotLyogZWVwcm9tICovCi12b2lkIGl3bDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCAqbWFjKTsKLWludCBpd2w0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50ICBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIG1hYzgwMjExIGhhbmRsZXJzIChmb3IgNDk2NSkgKi8KLXZvaWQgaXdsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXZvaWQgaXdsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIGl3bDQ5NjVfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCi0JCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkgICAgIHU2NCBtdWx0aWNhc3QpOwotaW50IGl3bDQ5NjVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7Ci12b2lkIGl3bDQ5NjVfbWFjX3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQl1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKLQkJCSAgICB1OCBidWZfc2l6ZSk7Ci1pbnQgaXdsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLXZvaWQgaXdsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29tbWFuZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkwNDA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLWNvbW1hbmRzLmgpIG9ubHkgZm9yIHVDb2RlIEFQSSBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLXh4eHgtaHcuaCBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLWRldi5oIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfY29tbWFuZHNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9jb21tYW5kc19oX18KLQotc3RydWN0IGl3bF9wcml2OwotCi0vKiB1Q29kZSB2ZXJzaW9uIGNvbnRhaW5zIDQgdmFsdWVzOiBNYWpvci9NaW5vci9BUEkvU2VyaWFsICovCi0jZGVmaW5lIElXTF9VQ09ERV9NQUpPUih2ZXIpCSgoKHZlcikgJiAweEZGMDAwMDAwKSA+PiAyNCkKLSNkZWZpbmUgSVdMX1VDT0RFX01JTk9SKHZlcikJKCgodmVyKSAmIDB4MDBGRjAwMDApID4+IDE2KQotI2RlZmluZSBJV0xfVUNPREVfQVBJKHZlcikJKCgodmVyKSAmIDB4MDAwMEZGMDApID4+IDgpCi0jZGVmaW5lIElXTF9VQ09ERV9TRVJJQUwodmVyKQkoKHZlcikgJiAweDAwMDAwMEZGKQotCi0KLS8qIFR4IHJhdGVzICovCi0jZGVmaW5lIElXTF9DQ0tfUkFURVMJNAotI2RlZmluZSBJV0xfT0ZETV9SQVRFUwk4Ci0jZGVmaW5lIElXTF9NQVhfUkFURVMJKElXTF9DQ0tfUkFURVMgKyBJV0xfT0ZETV9SQVRFUykKLQotZW51bSB7Ci0JUkVQTFlfQUxJVkUgPSAweDEsCi0JUkVQTFlfRVJST1IgPSAweDIsCi0KLQkvKiBSWE9OIGFuZCBRT1MgY29tbWFuZHMgKi8KLQlSRVBMWV9SWE9OID0gMHgxMCwKLQlSRVBMWV9SWE9OX0FTU09DID0gMHgxMSwKLQlSRVBMWV9RT1NfUEFSQU0gPSAweDEzLAotCVJFUExZX1JYT05fVElNSU5HID0gMHgxNCwKLQotCS8qIE11bHRpLVN0YXRpb24gc3VwcG9ydCAqLwotCVJFUExZX0FERF9TVEEgPSAweDE4LAotCVJFUExZX1JFTU9WRV9TVEEgPSAweDE5LAotCi0JLyogU2VjdXJpdHkgKi8KLQlSRVBMWV9XRVBLRVkgPSAweDIwLAotCi0JLyogUlgsIFRYLCBMRURzICovCi0JUkVQTFlfMzk0NV9SWCA9IDB4MWIsICAgICAgICAgICAvKiAzOTQ1IG9ubHkgKi8KLQlSRVBMWV9UWCA9IDB4MWMsCi0JUkVQTFlfUkFURV9TQ0FMRSA9IDB4NDcsCS8qIDM5NDUgb25seSAqLwotCVJFUExZX0xFRFNfQ01EID0gMHg0OCwKLQlSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwgLyogZm9yIDQ5NjUgYW5kIHVwICovCi0KLQkvKiA4MDIuMTFoIHJlbGF0ZWQgKi8KLQlSRVBMWV9DSEFOTkVMX1NXSVRDSCA9IDB4NzIsCi0JQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OID0gMHg3MywKLQlSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0LAotCVNQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OID0gMHg3NSwKLQotCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLQlQT1dFUl9UQUJMRV9DTUQgPSAweDc3LAotCVBNX1NMRUVQX05PVElGSUNBVElPTiA9IDB4N0EsCi0JUE1fREVCVUdfU1RBVElTVElDX05PVElGSUMgPSAweDdCLAotCi0JLyogU2NhbiBjb21tYW5kcyBhbmQgbm90aWZpY2F0aW9ucyAqLwotCVJFUExZX1NDQU5fQ01EID0gMHg4MCwKLQlSRVBMWV9TQ0FOX0FCT1JUX0NNRCA9IDB4ODEsCi0JU0NBTl9TVEFSVF9OT1RJRklDQVRJT04gPSAweDgyLAotCVNDQU5fUkVTVUxUU19OT1RJRklDQVRJT04gPSAweDgzLAotCVNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OID0gMHg4NCwKLQotCS8qIElCU1MvQVAgY29tbWFuZHMgKi8KLQlCRUFDT05fTk9USUZJQ0FUSU9OID0gMHg5MCwKLQlSRVBMWV9UWF9CRUFDT04gPSAweDkxLAotCi0JLyogTWlzY2VsbGFuZW91cyBjb21tYW5kcyAqLwotCVJFUExZX1RYX1BXUl9UQUJMRV9DTUQgPSAweDk3LAotCi0JLyogQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBjb25maWcgY29tbWFuZCAqLwotCVJFUExZX0JUX0NPTkZJRyA9IDB4OWIsCi0KLQkvKiBTdGF0aXN0aWNzICovCi0JUkVQTFlfU1RBVElTVElDU19DTUQgPSAweDljLAotCVNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OID0gMHg5ZCwKLQotCS8qIFJGLUtJTEwgY29tbWFuZHMgYW5kIG5vdGlmaWNhdGlvbnMgKi8KLQlDQVJEX1NUQVRFX05PVElGSUNBVElPTiA9IDB4YTEsCi0KLQkvKiBNaXNzZWQgYmVhY29ucyBub3RpZmljYXRpb24gKi8KLQlNSVNTRURfQkVBQ09OU19OT1RJRklDQVRJT04gPSAweGEyLAotCi0JUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EID0gMHhhNCwKLQlTRU5TSVRJVklUWV9DTUQgPSAweGE4LAotCVJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQgPSAweGIwLAotCVJFUExZX1JYX1BIWV9DTUQgPSAweGMwLAotCVJFUExZX1JYX01QRFVfQ01EID0gMHhjMSwKLQlSRVBMWV9SWCA9IDB4YzMsCi0JUkVQTFlfQ09NUFJFU1NFRF9CQSA9IDB4YzUsCi0KLQlSRVBMWV9NQVggPSAweGZmCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMCkKLSAqIENvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnM6Ci0gKiBDb21tYW5kIGhlYWRlciwgcmF0ZV9uX2ZsYWdzLCB0eHBvd2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBpd2xfY21kX2hlYWRlciBmbGFncyB2YWx1ZSAqLwotI2RlZmluZSBJV0xfQ01EX0ZBSUxFRF9NU0sgMHg0MAotCi0jZGVmaW5lIFNFUV9UT19RVUVVRShzKQkoKChzKSA+PiA4KSAmIDB4MWYpCi0jZGVmaW5lIFFVRVVFX1RPX1NFUShxKQkoKChxKSAmIDB4MWYpIDw8IDgpCi0jZGVmaW5lIFNFUV9UT19JTkRFWChzKQkoKHMpICYgMHhmZikKLSNkZWZpbmUgSU5ERVhfVE9fU0VRKGkpCSgoaSkgJiAweGZmKQotI2RlZmluZSBTRVFfSFVHRV9GUkFNRQljcHVfdG9fbGUxNigweDQwMDApCi0jZGVmaW5lIFNFUV9SWF9GUkFNRQljcHVfdG9fbGUxNigweDgwMDApCi0KLS8qKgotICogc3RydWN0IGl3bF9jbWRfaGVhZGVyCi0gKgotICogVGhpcyBoZWFkZXIgZm9ybWF0IGFwcGVhcnMgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNvbW1hbmQgc2VudCBmcm9tIHRoZQotICogZHJpdmVyLCBhbmQgZWFjaCByZXNwb25zZS9ub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSB1Q29kZS4KLSAqLwotc3RydWN0IGl3bF9jbWRfaGVhZGVyIHsKLQl1OCBjbWQ7CQkvKiBDb21tYW5kIElEOiAgUkVQTFlfUlhPTiwgZXRjLiAqLwotCXU4IGZsYWdzOwkvKiAwOjUgcmVzZXJ2ZWQsIDYgYWJvcnQsIDcgaW50ZXJuYWwgKi8KLQkvKgotCSAqIFRoZSBkcml2ZXIgc2V0cyB1cCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHZhbHVlcyBvZiBpdHMgY2hvb3NpbmcuCi0JICogdUNvZGUgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUsIGJ1dCBwYXNzZXMgaXQgYmFjayB0byB0aGUgZHJpdmVyCi0JICogd2hlbiBzZW5kaW5nIHRoZSByZXNwb25zZSB0byBlYWNoIGRyaXZlci1vcmlnaW5hdGVkIGNvbW1hbmQsIHNvCi0JICogdGhlIGRyaXZlciBjYW4gbWF0Y2ggdGhlIHJlc3BvbnNlIHRvIHRoZSBjb21tYW5kLiAgU2luY2UgdGhlIHZhbHVlcwotCSAqIGRvbid0IGdldCB1c2VkIGJ5IHVDb2RlLCB0aGUgZHJpdmVyIG1heSBzZXQgdXAgYW4gYXJiaXRyYXJ5IGZvcm1hdC4KLQkgKgotCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246ICB1Q29kZSBzZXRzIGJpdCAxNSB3aGVuIGl0IG9yaWdpbmF0ZXMKLQkgKiB0aGUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uLCBpLmUuIHdoZW4gdGhlIHJlc3BvbnNlL25vdGlmaWNhdGlvbgotCSAqIGlzIG5vdCBhIGRpcmVjdCByZXNwb25zZSB0byBhIGNvbW1hbmQgc2VudCBieSB0aGUgZHJpdmVyLiAgRm9yCi0JICogZXhhbXBsZSwgdUNvZGUgaXNzdWVzIFJFUExZXzM5NDVfUlggd2hlbiBpdCBzZW5kcyBhIHJlY2VpdmVkIGZyYW1lCi0JICogdG8gdGhlIGRyaXZlcjsgaXQgaXMgbm90IGEgZGlyZWN0IHJlc3BvbnNlIHRvIGFueSBkcml2ZXIgY29tbWFuZC4KLQkgKgotCSAqIFRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLQkgKgotCSAqICAwOjcJCXRmZCBpbmRleCAtIHBvc2l0aW9uIHdpdGhpbiBUWCBxdWV1ZQotCSAqICA4OjEyCVRYIHF1ZXVlIGlkCi0JICogIDEzCQlyZXNlcnZlZAotCSAqICAxNAkJaHVnZSAtIGRyaXZlciBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgY29tbWFuZCBpcyBpbiB0aGUKLQkgKiAgCQknaHVnZScgc3RvcmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcnMKLQkgKiAgMTUJCXVuc29saWNpdGVkIFJYIG9yIHVDb2RlLW9yaWdpbmF0ZWQgbm90aWZpY2F0aW9uCi0JKi8KLQlfX2xlMTYgc2VxdWVuY2U7Ci0KLQkvKiBjb21tYW5kIG9yIHJlc3BvbnNlL25vdGlmaWNhdGlvbiBkYXRhIGZvbGxvd3MgaW1tZWRpYXRlbHkgKi8KLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotCi0vKioKLSAqIHN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyCi0gKgotICogVXNlZCBpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9TQ0FOX0NNRCwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gKLSAqCi0gKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6Ci0gKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKLSAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKLSAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgotICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgotICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KLSAqCi0gKiBEcml2ZXIgb2J0YWlucyB2YWx1ZXMgZnJvbSBzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlW11bXS4KLSAqLwotc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgewotCXU4IHR4X2dhaW47CQkvKiBnYWluIGZvciBhbmFsb2cgcmFkaW8gKi8KLQl1OCBkc3BfYXR0ZW47CQkvKiBnYWluIGZvciBEU1AgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUKLSAqCi0gKiBVc2VkIGluIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX0NIQU5ORUxfU1dJVENICi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3Bvd2VyX3Blcl9yYXRlIHsKLQl1OCByYXRlOwkJLyogcGxjcCAqLwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsKLQl1OCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogaXdsNDk2NSByYXRlX25fZmxhZ3MgYml0IGZpZWxkcwotICoKLSAqIHJhdGVfbl9mbGFncyBmb3JtYXQgaXMgdXNlZCBpbiBmb2xsb3dpbmcgaXdsNDk2NSBjb21tYW5kczoKLSAqICBSRVBMWV9SWCAocmVzcG9uc2Ugb25seSkKLSAqICBSRVBMWV9SWF9NUERVIChyZXNwb25zZSBvbmx5KQotICogIFJFUExZX1RYIChib3RoIGNvbW1hbmQgYW5kIHJlc3BvbnNlKQotICogIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQKLSAqCi0gKiBIaWdoLXRocm91Z2hwdXQgKEhUKSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjEiKToKLSAqICAyLTA6ICAwKSAgIDYgTWJwcwotICogICAgICAgIDEpICAxMiBNYnBzCi0gKiAgICAgICAgMikgIDE4IE1icHMKLSAqICAgICAgICAzKSAgMjQgTWJwcwotICogICAgICAgIDQpICAzNiBNYnBzCi0gKiAgICAgICAgNSkgIDQ4IE1icHMKLSAqICAgICAgICA2KSAgNTQgTWJwcwotICogICAgICAgIDcpICA2MCBNYnBzCi0gKgotICogIDQtMzogIDApICBTaW5nbGUgc3RyZWFtIChTSVNPKQotICogICAgICAgIDEpICBEdWFsIHN0cmVhbSAoTUlNTykKLSAqICAgICAgICAyKSAgVHJpcGxlIHN0cmVhbSAoTUlNTykKLSAqCi0gKiAgICA1OiAgVmFsdWUgb2YgMHgyMCBpbiBiaXRzIDc6MCBpbmRpY2F0ZXMgNiBNYnBzIEhUNDAgZHVwbGljYXRlIGRhdGEKLSAqCi0gKiBMZWdhY3kgT0ZETSByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMCIpOgotICogIDMtMDogIDB4RCkgICA2IE1icHMKLSAqICAgICAgICAweEYpICAgOSBNYnBzCi0gKiAgICAgICAgMHg1KSAgMTIgTWJwcwotICogICAgICAgIDB4NykgIDE4IE1icHMKLSAqICAgICAgICAweDkpICAyNCBNYnBzCi0gKiAgICAgICAgMHhCKSAgMzYgTWJwcwotICogICAgICAgIDB4MSkgIDQ4IE1icHMKLSAqICAgICAgICAweDMpICA1NCBNYnBzCi0gKgotICogTGVnYWN5IENDSyByYXRlIGZvcm1hdCBmb3IgYml0cyA3OjAgKGJpdCA4IG11c3QgYmUgIjAiLCBiaXQgOSAiMSIpOgotICogIDYtMDogICAxMCkgIDEgTWJwcwotICogICAgICAgICAyMCkgIDIgTWJwcwotICogICAgICAgICA1NSkgIDUuNSBNYnBzCi0gKiAgICAgICAgMTEwKSAgMTEgTWJwcwotICovCi0jZGVmaW5lIFJBVEVfTUNTX0NPREVfTVNLIDB4NwotI2RlZmluZSBSQVRFX01DU19TUEFUSUFMX1BPUyAzCi0jZGVmaW5lIFJBVEVfTUNTX1NQQVRJQUxfTVNLIDB4MTgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfRFVQX1BPUyA1Ci0jZGVmaW5lIFJBVEVfTUNTX0hUX0RVUF9NU0sgMHgyMAotCi0vKiBCaXQgODogKDEpIEhUIGZvcm1hdCwgKDApIGxlZ2FjeSBmb3JtYXQgaW4gYml0cyA3OjAgKi8KLSNkZWZpbmUgUkFURV9NQ1NfRkxBR1NfUE9TIDgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfUE9TIDgKLSNkZWZpbmUgUkFURV9NQ1NfSFRfTVNLIDB4MTAwCi0KLS8qIEJpdCA5OiAoMSkgQ0NLLCAoMCkgT0ZETS4gIEhUIChiaXQgOCkgbXVzdCBiZSAiMCIgZm9yIHRoaXMgYml0IHRvIGJlIHZhbGlkICovCi0jZGVmaW5lIFJBVEVfTUNTX0NDS19QT1MgOQotI2RlZmluZSBSQVRFX01DU19DQ0tfTVNLIDB4MjAwCi0KLS8qIEJpdCAxMDogKDEpIFVzZSBHcmVlbiBGaWVsZCBwcmVhbWJsZSAqLwotI2RlZmluZSBSQVRFX01DU19HRl9QT1MgMTAKLSNkZWZpbmUgUkFURV9NQ1NfR0ZfTVNLIDB4NDAwCi0KLS8qIEJpdCAxMTogKDEpIFVzZSA0ME1oeiBIVDQwIGNobmwgd2lkdGgsICgwKSB1c2UgMjAgTUh6IGxlZ2FjeSBjaG5sIHdpZHRoICovCi0jZGVmaW5lIFJBVEVfTUNTX0hUNDBfUE9TIDExCi0jZGVmaW5lIFJBVEVfTUNTX0hUNDBfTVNLIDB4ODAwCi0KLS8qIEJpdCAxMjogKDEpIER1cGxpY2F0ZSBkYXRhIG9uIGJvdGggMjBNSHogY2hubHMuIEhUNDAgKGJpdCAxMSkgbXVzdCBiZSBzZXQuICovCi0jZGVmaW5lIFJBVEVfTUNTX0RVUF9QT1MgMTIKLSNkZWZpbmUgUkFURV9NQ1NfRFVQX01TSyAweDEwMDAKLQotLyogQml0IDEzOiAoMSkgU2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKDAuNCB1c2VjKSwgKDApIG5vcm1hbCBHSSAoMC44IHVzZWMpICovCi0jZGVmaW5lIFJBVEVfTUNTX1NHSV9QT1MgMTMKLSNkZWZpbmUgUkFURV9NQ1NfU0dJX01TSyAweDIwMDAKLQotLyoqCi0gKiByYXRlX25fZmxhZ3MgVHggYW50ZW5uYSBtYXNrcwotICogNDk2NSBoYXMgMiB0cmFuc21pdHRlcnMKLSAqIGJpdDE0OjE2Ci0gKi8KLSNkZWZpbmUgUkFURV9NQ1NfQU5UX1BPUwkxNAotI2RlZmluZSBSQVRFX01DU19BTlRfQV9NU0sJMHgwNDAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQl9NU0sJMHgwODAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQ19NU0sJMHgxMDAwMAotI2RlZmluZSBSQVRFX01DU19BTlRfQUJfTVNLCShSQVRFX01DU19BTlRfQV9NU0sgfCBSQVRFX01DU19BTlRfQl9NU0spCi0jZGVmaW5lIFJBVEVfTUNTX0FOVF9BQkNfTVNLCShSQVRFX01DU19BTlRfQUJfTVNLIHwgUkFURV9NQ1NfQU5UX0NfTVNLKQotI2RlZmluZSBSQVRFX0FOVF9OVU0gMwotCi0jZGVmaW5lIFBPV0VSX1RBQkxFX05VTV9FTlRSSUVTCQkJMzMKLSNkZWZpbmUgUE9XRVJfVEFCTEVfTlVNX0hUX09GRE1fRU5UUklFUwkJMzIKLSNkZWZpbmUgUE9XRVJfVEFCTEVfQ0NLX0VOVFJZCQkJMzIKLQotI2RlZmluZSBJV0xfUFdSX05VTV9IVF9PRkRNX0VOVFJJRVMJCTI0Ci0jZGVmaW5lIElXTF9QV1JfQ0NLX0VOVFJJRVMJCQkyCi0KLS8qKgotICogdW5pb24gaXdsNDk2NV90eF9wb3dlcl9kdWFsX3N0cmVhbQotICoKLSAqIEhvc3QgZm9ybWF0IHVzZWQgZm9yIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX0NIQU5ORUxfU1dJVENICi0gKiBVc2UgX19sZTMyIHZlcnNpb24gKHN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbSkgd2hlbiBidWlsZGluZyBjb21tYW5kLgotICoKLSAqIERyaXZlciBwcm92aWRlcyByYWRpbyBnYWluIGFuZCBEU1AgYXR0ZW51YXRpb24gc2V0dGluZ3MgdG8gZGV2aWNlIGluIHBhaXJzLAotICogb25lIHZhbHVlIGZvciBlYWNoIHRyYW5zbWl0dGVyIGNoYWluLiAgVGhlIGZpcnN0IHZhbHVlIGlzIGZvciB0cmFuc21pdHRlciBBLAotICogc2Vjb25kIGZvciB0cmFuc21pdHRlciBCLgotICoKLSAqIEZvciBTSVNPIGJpdCByYXRlcywgYm90aCB2YWx1ZXMgaW4gYSBwYWlyIHNob3VsZCBiZSBpZGVudGljYWwuCi0gKiBGb3IgTUlNTyByYXRlcywgb25lIHZhbHVlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIsCi0gKiBpbiBvcmRlciB0byBiYWxhbmNlIHRoZSBUeCBvdXRwdXQgYmV0d2VlbiB0aGUgdHdvIHRyYW5zbWl0dGVycy4KLSAqCi0gKiBTZWUgbW9yZSBkZXRhaWxzIGluIGRvYyBmb3IgVFhQT1dFUiBpbiBpd2wtNDk2NS1ody5oLgotICovCi11bmlvbiBpd2w0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKLQlzdHJ1Y3QgewotCQl1OCByYWRpb190eF9nYWluWzJdOwotCQl1OCBkc3BfcHJlZGlzX2F0dGVuWzJdOwotCX0gczsKLQl1MzIgZHc7Ci19OwotCi0vKioKLSAqIHN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbQotICoKLSAqIFRhYmxlIGVudHJpZXMgaW4gUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gKLSAqCi0gKiBTYW1lIGZvcm1hdCBhcyBpd2xfdHhfcG93ZXJfZHVhbF9zdHJlYW0sIGJ1dCBfX2xlMzIKLSAqLwotc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKLQlfX2xlMzIgZHc7Ci19IF9fcGFja2VkOwotCi0vKioKLSAqIHN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiCi0gKgotICogRW50aXJlIHRhYmxlIHdpdGhpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9DSEFOTkVMX1NXSVRDSAotICovCi1zdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiB7Ci0Jc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHBvd2VyX3RibFtQT1dFUl9UQUJMRV9OVU1fRU5UUklFU107Ci19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMGEpCi0gKiBBbGl2ZSBhbmQgRXJyb3IgQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFVDT0RFX1ZBTElEX09LCWNwdV90b19sZTMyKDB4MSkKLSNkZWZpbmUgSU5JVElBTElaRV9TVUJUWVBFICAgICg5KQotCi0vKgotICogKCJJbml0aWFsaXplIikgUkVQTFlfQUxJVkUgPSAweDEgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKgotICogdUNvZGUgaXNzdWVzIHRoaXMgImluaXRpYWxpemUgYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBpbml0aWFsaXphdGlvbgotICogdUNvZGUgaW1hZ2UgaGFzIGNvbXBsZXRlZCBpdHMgd29yaywgYW5kIGlzIHJlYWR5IHRvIGxvYWQgdGhlIHJ1bnRpbWUgaW1hZ2UuCi0gKiBUaGlzIGlzIHRoZSAqZmlyc3QqICJhbGl2ZSIgbm90aWZpY2F0aW9uIHRoYXQgdGhlIGRyaXZlciB3aWxsIHJlY2VpdmUgYWZ0ZXIKLSAqIHJlYm9vdGluZyB1Q29kZTsgdGhlICJpbml0aWFsaXplIiBhbGl2ZSBpcyBpbmRpY2F0ZWQgYnkgc3VidHlwZSBmaWVsZCA9PSA5LgotICoKLSAqIFNlZSBjb21tZW50cyBkb2N1bWVudGluZyAiQlNNIiAoYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUpLgotICoKLSAqIEZvciA0OTY1LCB0aGlzIG5vdGlmaWNhdGlvbiBjb250YWlucyBpbXBvcnRhbnQgY2FsaWJyYXRpb24gZGF0YSBmb3IKLSAqIGNhbGN1bGF0aW5nIHR4cG93ZXIgc2V0dGluZ3M6Ci0gKgotICogMSkgIFBvd2VyIHN1cHBseSB2b2x0YWdlIGluZGljYXRpb24uICBUaGUgdm9sdGFnZSBzZW5zb3Igb3V0cHV0cyBoaWdoZXIKLSAqICAgICB2YWx1ZXMgZm9yIGxvd2VyIHZvbHRhZ2UsIGFuZCB2aWNlIHZlcnNlLgotICoKLSAqIDIpICBUZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBwYXJhbWV0ZXJzLCBmb3IgZWFjaCBvZiB0d28gY2hhbm5lbCB3aWR0aHMKLSAqICAgICAoMjAgTUh6IGFuZCA0MCBNSHopIHN1cHBvcnRlZCBieSB0aGUgcmFkaW9zLiAgVGVtcGVyYXR1cmUgc2Vuc2luZwotICogICAgIGlzIGRvbmUgdmlhIG9uZSBvZiB0aGUgcmVjZWl2ZXIgY2hhaW5zLCBhbmQgY2hhbm5lbCB3aWR0aCBpbmZsdWVuY2VzCi0gKiAgICAgdGhlIHJlc3VsdHMuCi0gKgotICogMykgIFR4IGdhaW4gY29tcGVuc2F0aW9uIHRvIGJhbGFuY2UgNDk2NSdzIDIgVHggY2hhaW5zIGZvciBNSU1PIG9wZXJhdGlvbiwKLSAqICAgICBmb3IgZWFjaCBvZiA1IGZyZXF1ZW5jeSByYW5nZXMuCi0gKi8KLXN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwIHsKLQl1OCB1Y29kZV9taW5vcjsKLQl1OCB1Y29kZV9tYWpvcjsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IHN3X3Jldls4XTsKLQl1OCB2ZXJfdHlwZTsKLQl1OCB2ZXJfc3VidHlwZTsJCS8qICI5IiBmb3IgaW5pdGlhbGl6ZSBhbGl2ZSAqLwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7Ci0JX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsKLQlfX2xlMzIgdGltZXN0YW1wOwotCV9fbGUzMiBpc192YWxpZDsKLQotCS8qIGNhbGlicmF0aW9uIHZhbHVlcyBmcm9tICJpbml0aWFsaXplIiB1Q29kZSAqLwotCV9fbGUzMiB2b2x0YWdlOwkJLyogc2lnbmVkLCBoaWdoZXIgdmFsdWUgaXMgbG93ZXIgdm9sdGFnZSAqLwotCV9fbGUzMiB0aGVybV9yMVsyXTsJLyogc2lnbmVkLCAxc3QgZm9yIG5vcm1hbCwgMm5kIGZvciBIVDQwICovCi0JX19sZTMyIHRoZXJtX3IyWzJdOwkvKiBzaWduZWQgKi8KLQlfX2xlMzIgdGhlcm1fcjNbMl07CS8qIHNpZ25lZCAqLwotCV9fbGUzMiB0aGVybV9yNFsyXTsJLyogc2lnbmVkICovCi0JX19sZTMyIHR4X2F0dGVuWzVdWzJdOwkvKiBzaWduZWQgTUlNTyBnYWluIGNvbXAsIDUgZnJlcSBncm91cHMsCi0JCQkJICogMiBUeCBjaGFpbnMgKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyoqCi0gKiBSRVBMWV9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqCi0gKiB1Q29kZSBpc3N1ZXMgdGhpcyAiYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBydW50aW1lIGltYWdlIGlzIHJlYWR5Ci0gKiB0byByZWNlaXZlIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlci4gIFRoaXMgaXMgdGhlICpzZWNvbmQqICJhbGl2ZSIKLSAqIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBkcml2ZXIgd2lsbCByZWNlaXZlIGFmdGVyIHJlYm9vdGluZyB1Q29kZTsKLSAqIHRoaXMgImFsaXZlIiBpcyBpbmRpY2F0ZWQgYnkgc3VidHlwZSBmaWVsZCAhPSA5LgotICoKLSAqIFNlZSBjb21tZW50cyBkb2N1bWVudGluZyAiQlNNIiAoYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUpLgotICoKLSAqIFRoaXMgcmVzcG9uc2UgaW5jbHVkZXMgdHdvIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgd2l0aGluIHRoZSBkZXZpY2UncwotICogZGF0YSBTUkFNIChhY2Nlc3MgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzKSB0aGF0IGFyZSB1c2VmdWwgZm9yIGRlYnVnZ2luZzoKLSAqCi0gKiAxKSAgbG9nX2V2ZW50X3RhYmxlX3B0ciBpbmRpY2F0ZXMgYmFzZSBvZiB0aGUgZXZlbnQgbG9nLiAgVGhpcyB0cmFjZXMKLSAqICAgICBhIDI1Ni1lbnRyeSBoaXN0b3J5IG9mIHVDb2RlIGV4ZWN1dGlvbiB3aXRoaW4gYSBjaXJjdWxhciBidWZmZXIuCi0gKiAgICAgSXRzIGhlYWRlciBmb3JtYXQgaXM6Ci0gKgotICoJX19sZTMyIGxvZ19zaXplOyAgICAgbG9nIGNhcGFjaXR5IChpbiBudW1iZXIgb2YgZW50cmllcykKLSAqCV9fbGUzMiB0eXBlOyAgICAgICAgICgxKSB0aW1lc3RhbXAgd2l0aCBlYWNoIGVudHJ5LCAoMCkgbm8gdGltZXN0YW1wCi0gKglfX2xlMzIgd3JhcHM7ICAgICAgICAjIHRpbWVzIHVDb2RlIGhhcyB3cmFwcGVkIHRvIHRvcCBvZiBjaXJjdWxhciBidWZmZXIKLSAqICAgICAgX19sZTMyIHdyaXRlX2luZGV4OyAgbmV4dCBjaXJjdWxhciBidWZmZXIgZW50cnkgdGhhdCB1Q29kZSB3b3VsZCBmaWxsCi0gKgotICogICAgIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgdGhlIGNpcmN1bGFyIGJ1ZmZlciBvZiBsb2cgZW50cmllcy4gIEVudHJpZXMKLSAqICAgICB3aXRoIHRpbWVzdGFtcHMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAqCi0gKglfX2xlMzIgZXZlbnRfaWQ7ICAgICByYW5nZSAwIC0gMTUwMAotICoJX19sZTMyIHRpbWVzdGFtcDsgICAgbG93IDMyIGJpdHMgb2YgVFNGIChvZiBuZXR3b3JrLCBpZiBhc3NvY2lhdGVkKQotICoJX19sZTMyIGRhdGE7ICAgICAgICAgZXZlbnRfaWQtc3BlY2lmaWMgZGF0YSB2YWx1ZQotICoKLSAqICAgICBFbnRyaWVzIHdpdGhvdXQgdGltZXN0YW1wcyBjb250YWluIG9ubHkgZXZlbnRfaWQgYW5kIGRhdGEuCi0gKgotICoKLSAqIDIpICBlcnJvcl9ldmVudF90YWJsZV9wdHIgaW5kaWNhdGVzIGJhc2Ugb2YgdGhlIGVycm9yIGxvZy4gIFRoaXMgY29udGFpbnMKLSAqICAgICBpbmZvcm1hdGlvbiBhYm91dCBhbnkgdUNvZGUgZXJyb3IgdGhhdCBvY2N1cnMuICBGb3IgNDk2NSwgdGhlIGZvcm1hdAotICogICAgIG9mIHRoZSBlcnJvciBsb2cgaXM6Ci0gKgotICoJX19sZTMyIHZhbGlkOyAgICAgICAgKG5vbnplcm8pIHZhbGlkLCAoMCkgbG9nIGlzIGVtcHR5Ci0gKglfX2xlMzIgZXJyb3JfaWQ7ICAgICB0eXBlIG9mIGVycm9yCi0gKglfX2xlMzIgcGM7ICAgICAgICAgICBwcm9ncmFtIGNvdW50ZXIKLSAqCV9fbGUzMiBibGluazE7ICAgICAgIGJyYW5jaCBsaW5rCi0gKglfX2xlMzIgYmxpbmsyOyAgICAgICBicmFuY2ggbGluawotICoJX19sZTMyIGlsaW5rMTsgICAgICAgaW50ZXJydXB0IGxpbmsKLSAqCV9fbGUzMiBpbGluazI7ICAgICAgIGludGVycnVwdCBsaW5rCi0gKglfX2xlMzIgZGF0YTE7ICAgICAgICBlcnJvci1zcGVjaWZpYyBkYXRhCi0gKglfX2xlMzIgZGF0YTI7ICAgICAgICBlcnJvci1zcGVjaWZpYyBkYXRhCi0gKglfX2xlMzIgbGluZTsgICAgICAgICBzb3VyY2UgY29kZSBsaW5lIG9mIGVycm9yCi0gKglfX2xlMzIgYmNvbl90aW1lOyAgICBiZWFjb24gdGltZXIKLSAqCV9fbGUzMiB0c2ZfbG93OyAgICAgIG5ldHdvcmsgdGltZXN0YW1wIGZ1bmN0aW9uIHRpbWVyCi0gKglfX2xlMzIgdHNmX2hpOyAgICAgICBuZXR3b3JrIHRpbWVzdGFtcCBmdW5jdGlvbiB0aW1lcgotICoJX19sZTMyIGdwMTsgICAgICAgICAgR1AxIHRpbWVyIHJlZ2lzdGVyCi0gKglfX2xlMzIgZ3AyOyAgICAgICAgICBHUDIgdGltZXIgcmVnaXN0ZXIKLSAqCV9fbGUzMiBncDM7ICAgICAgICAgIEdQMyB0aW1lciByZWdpc3RlcgotICoJX19sZTMyIHVjb2RlX3ZlcjsgICAgdUNvZGUgdmVyc2lvbgotICoJX19sZTMyIGh3X3ZlcjsgICAgICAgSFcgU2lsaWNvbiB2ZXJzaW9uCi0gKglfX2xlMzIgYnJkX3ZlcjsgICAgICBIVyBib2FyZCB2ZXJzaW9uCi0gKglfX2xlMzIgbG9nX3BjOyAgICAgICBsb2cgcHJvZ3JhbSBjb3VudGVyCi0gKglfX2xlMzIgZnJhbWVfcHRyOyAgICBmcmFtZSBwb2ludGVyCi0gKglfX2xlMzIgc3RhY2tfcHRyOyAgICBzdGFjayBwb2ludGVyCi0gKglfX2xlMzIgaGNtZDsgICAgICAgICBsYXN0IGhvc3QgY29tbWFuZAotICoJX19sZTMyIGlzcjA7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IwOiByeHR4X2ZsYWcKLSAqCV9fbGUzMiBpc3IxOyAgICAgICAgIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMTogaG9zdF9mbGFnCi0gKglfX2xlMzIgaXNyMjsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjI6IGVuY19mbGFnCi0gKglfX2xlMzIgaXNyMzsgICAgICAgICBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjM6IHRpbWVfZmxhZwotICoJX19sZTMyIGlzcjQ7ICAgICAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1I0OiB3aWNvIGludGVycnVwdAotICoJX19sZTMyIGlzcl9wcmVmOyAgICAgaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19QUkVGX1NUQVQKLSAqCV9fbGUzMiB3YWl0X2V2ZW50OyAgIHdhaXQgZXZlbnQoKSBjYWxsZXIgYWRkcmVzcwotICoJX19sZTMyIGwycF9jb250cm9sOyAgTDJwQ29udHJvbEZpZWxkCi0gKglfX2xlMzIgbDJwX2R1cmF0aW9uOyBMMnBEdXJhdGlvbkZpZWxkCi0gKglfX2xlMzIgbDJwX21odmFsaWQ7ICBMMnBNaFZhbGlkQml0cwotICoJX19sZTMyIGwycF9hZGRyX21hdGNoOyBMMnBBZGRyTWF0Y2hTdGF0Ci0gKglfX2xlMzIgbG1wbV9wbWdfc2VsOyBpbmRpY2F0ZSB3aGljaCBjbG9ja3MgYXJlIHR1cm5lZCBvbiAoTE1QTV9QTUdfU0VMKQotICoJX19sZTMyIHVfdGltZXN0YW1wOyAgaW5kaWNhdGUgd2hlbiB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgY29tcGlsYXRpb24KLSAqCV9fbGUzMiByZXNlcnZlZDsKLSAqCi0gKiBUaGUgTGludXggZHJpdmVyIGNhbiBwcmludCBib3RoIGxvZ3MgdG8gdGhlIHN5c3RlbSBsb2cgd2hlbiBhIHVDb2RlIGVycm9yCi0gKiBvY2N1cnMuCi0gKi8KLXN0cnVjdCBpd2xfYWxpdmVfcmVzcCB7Ci0JdTggdWNvZGVfbWlub3I7Ci0JdTggdWNvZGVfbWFqb3I7Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBzd19yZXZbOF07Ci0JdTggdmVyX3R5cGU7Ci0JdTggdmVyX3N1YnR5cGU7CQkJLyogbm90ICI5IiBmb3IgcnVudGltZSBhbGl2ZSAqLwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBmb3IgZXZlbnQgbG9nICovCi0JX19sZTMyIGVycm9yX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBlcnJvciBsb2cgKi8KLQlfX2xlMzIgdGltZXN0YW1wOwotCV9fbGUzMiBpc192YWxpZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9FUlJPUiA9IDB4MiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotc3RydWN0IGl3bF9lcnJvcl9yZXNwIHsKLQlfX2xlMzIgZXJyb3JfdHlwZTsKLQl1OCBjbWRfaWQ7Ci0JdTggcmVzZXJ2ZWQxOwotCV9fbGUxNiBiYWRfY21kX3NlcV9udW07Ci0JX19sZTMyIGVycm9yX2luZm87Ci0JX19sZTY0IHRpbWVzdGFtcDsKLX0gX19wYWNrZWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxKQotICogUlhPTiBDb21tYW5kcyAmIFJlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBSeCBjb25maWcgZGVmaW5lcyAmIHN0cnVjdHVyZQotICovCi0vKiByeF9jb25maWcgZGV2aWNlIHR5cGVzICAqLwotZW51bSB7Ci0JUlhPTl9ERVZfVFlQRV9BUCA9IDEsCi0JUlhPTl9ERVZfVFlQRV9FU1MgPSAzLAotCVJYT05fREVWX1RZUEVfSUJTUyA9IDQsCi0JUlhPTl9ERVZfVFlQRV9TTklGRkVSID0gNiwKLX07Ci0KLQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9NU0sJCWNwdV90b19sZTE2KDB4MSA8PCAwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1MJCSgwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX1ZBTElEX01TSwkJCWNwdV90b19sZTE2KDB4NyA8PCAxKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX1ZBTElEX1BPUwkJCSgxKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX1NFTF9NU0sJCWNwdV90b19sZTE2KDB4NyA8PCA0KQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX1NFTF9QT1MJCSg0KQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX01TSwljcHVfdG9fbGUxNigweDcgPDwgNykKLSNkZWZpbmUgUlhPTl9SWF9DSEFJTl9GT1JDRV9NSU1PX1NFTF9QT1MJKDcpCi0jZGVmaW5lIFJYT05fUlhfQ0hBSU5fQ05UX01TSwkJCWNwdV90b19sZTE2KDB4MyA8PCAxMCkKLSNkZWZpbmUgUlhPTl9SWF9DSEFJTl9DTlRfUE9TCQkJKDEwKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX01TSwkJY3B1X3RvX2xlMTYoMHgzIDw8IDEyKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUwkJKDEyKQotI2RlZmluZSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLCQljcHVfdG9fbGUxNigweDEgPDwgMTQpCi0jZGVmaW5lIFJYT05fUlhfQ0hBSU5fTUlNT19GT1JDRV9QT1MJCSgxNCkKLQotLyogcnhfY29uZmlnIGZsYWdzICovCi0vKiBiYW5kICYgbW9kdWxhdGlvbiBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgUlhPTl9GTEdfQkFORF8yNEdfTVNLICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDApCi0jZGVmaW5lIFJYT05fRkxHX0NDS19NU0sgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxKQotLyogYXV0byBkZXRlY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lIFJYT05fRkxHX0FVVE9fREVURUNUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAyKQotLyogVEdnIHByb3RlY3Rpb24gd2hlbiB0eCAqLwotI2RlZmluZSBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0sgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMykKLS8qIGNjayBzaG9ydCBzbG90ICYgcHJlYW1ibGUgKi8KLSNkZWZpbmUgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0sgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA0KQotI2RlZmluZSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0sgICAgIGNwdV90b19sZTMyKDEgPDwgNSkKLS8qIGFudGVubmEgc2VsZWN0aW9uICovCi0jZGVmaW5lIFJYT05fRkxHX0RJU19ESVZfTVNLICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA3KQotI2RlZmluZSBSWE9OX0ZMR19BTlRfU0VMX01TSyAgICAgICAgICAgIGNwdV90b19sZTMyKDB4MGYwMCkKLSNkZWZpbmUgUlhPTl9GTEdfQU5UX0FfTVNLICAgICAgICAgICAgICBjcHVfdG9fbGUzMigxIDw8IDgpCi0jZGVmaW5lIFJYT05fRkxHX0FOVF9CX01TSyAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCA5KQotLyogcmFkYXIgZGV0ZWN0aW9uIGVuYWJsZSAqLwotI2RlZmluZSBSWE9OX0ZMR19SQURBUl9ERVRFQ1RfTVNLICAgICAgIGNwdV90b19sZTMyKDEgPDwgMTIpCi0jZGVmaW5lIFJYT05fRkxHX1RHSl9OQVJST1dfQkFORF9NU0sgICAgY3B1X3RvX2xlMzIoMSA8PCAxMykKLS8qIHJ4IHJlc3BvbnNlIHRvIGhvc3Qgd2l0aCA4LWJ5dGUgVFNGCi0qIChhY2NvcmRpbmcgdG8gT05fQUlSIGRlYXNzZXJ0aW9uKSAqLwotI2RlZmluZSBSWE9OX0ZMR19UU0YySE9TVF9NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgMTUpCi0KLQotLyogSFQgZmxhZ3MgKi8KLSNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19QT1MJCSgyMikKLSNkZWZpbmUgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sJY3B1X3RvX2xlMzIoMHgxIDw8IDIyKQotCi0jZGVmaW5lIFJYT05fRkxHX0hUX09QRVJBVElOR19NT0RFX1BPUwkJKDIzKQotCi0jZGVmaW5lIFJYT05fRkxHX0hUX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgxIDw8IDIzKQotI2RlZmluZSBSWE9OX0ZMR19IVDQwX1BST1RfTVNLCQkJY3B1X3RvX2xlMzIoMHgyIDw8IDIzKQotCi0jZGVmaW5lIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1MJCSgyNSkKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSwkJY3B1X3RvX2xlMzIoMHgzIDw8IDI1KQotCi0vKiBjaGFubmVsIG1vZGUgKi8KLWVudW0gewotCUNIQU5ORUxfTU9ERV9MRUdBQ1kgPSAwLAotCUNIQU5ORUxfTU9ERV9QVVJFXzQwID0gMSwKLQlDSEFOTkVMX01PREVfTUlYRUQgPSAyLAotCUNIQU5ORUxfTU9ERV9SRVNFUlZFRCA9IDMsCi19OwotI2RlZmluZSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTEVHQUNZCQkJXAotCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9MRUdBQ1kgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDAJCQlcCi0JY3B1X3RvX2xlMzIoQ0hBTk5FTF9NT0RFX1BVUkVfNDAgPDwgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUykKLSNkZWZpbmUgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVECQkJXAotCWNwdV90b19sZTMyKENIQU5ORUxfTU9ERV9NSVhFRCA8PCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TKQotCi0vKiBDVFMgdG8gc2VsZiAoaWYgc3BlYyBhbGxvd3MpIGZsYWcgKi8KLSNkZWZpbmUgUlhPTl9GTEdfU0VMRl9DVFNfRU4JCQljcHVfdG9fbGUzMigweDE8PDMwKQotCi0vKiByeF9jb25maWcgZmlsdGVyIGZsYWdzICovCi0vKiBhY2NlcHQgYWxsIGRhdGEgZnJhbWVzICovCi0jZGVmaW5lIFJYT05fRklMVEVSX1BST01JU0NfTVNLICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAwKQotLyogcGFzcyBjb250cm9sICYgbWFuYWdlbWVudCB0byBob3N0ICovCi0jZGVmaW5lIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxKQotLyogYWNjZXB0IG11bHRpLWNhc3QgKi8KLSNkZWZpbmUgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICBjcHVfdG9fbGUzMigxIDw8IDIpCi0vKiBkb24ndCBkZWNyeXB0IHVuaS1jYXN0IGZyYW1lcyAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0sgICAgIGNwdV90b19sZTMyKDEgPDwgMykKLS8qIGRvbid0IGRlY3J5cHQgbXVsdGktY2FzdCBmcmFtZXMgKi8KLSNkZWZpbmUgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyBjcHVfdG9fbGUzMigxIDw8IDQpCi0vKiBTVEEgaXMgYXNzb2NpYXRlZCAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgICAgICAgICAgIGNwdV90b19sZTMyKDEgPDwgNSkKLS8qIHRyYW5zZmVyIHRvIGhvc3Qgbm9uIGJzc2lkIGJlYWNvbnMgaW4gYXNzb2NpYXRlZCBzdGF0ZSAqLwotI2RlZmluZSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyAgICAgIGNwdV90b19sZTMyKDEgPDwgNikKLQotLyoqCi0gKiBSRVBMWV9SWE9OID0gMHgxMCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIFJYT04gdHVuZXMgdGhlIHJhZGlvIHR1bmVyIHRvIGEgc2VydmljZSBjaGFubmVsLCBhbmQgc2V0cyB1cCBhIG51bWJlcgotICogb2YgcGFyYW1ldGVycyB0aGF0IGFyZSB1c2VkIHByaW1hcmlseSBmb3IgUngsIGJ1dCBhbHNvIGZvciBUeCBvcGVyYXRpb25zLgotICoKLSAqIE5PVEU6ICBXaGVuIHR1bmluZyB0byBhIG5ldyBjaGFubmVsLCBkcml2ZXIgbXVzdCBzZXQgdGhlCi0gKiAgICAgICAgUlhPTl9GSUxURVJfQVNTT0NfTVNLIHRvIDAuICBUaGlzIHdpbGwgY2xlYXIgc3RhdGlvbi1kZXBlbmRlbnQKLSAqICAgICAgICBpbmZvIHdpdGhpbiB0aGUgZGV2aWNlLCBpbmNsdWRpbmcgdGhlIHN0YXRpb24gdGFibGVzLCB0eCByZXRyeQotICogICAgICAgIHJhdGUgdGFibGVzLCBhbmQgdHhwb3dlciB0YWJsZXMuICBEcml2ZXIgbXVzdCBidWlsZCBhIG5ldyBzdGF0aW9uCi0gKiAgICAgICAgdGFibGUgYW5kIHR4cG93ZXIgdGFibGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbnl0aGluZyBvbiB0aGUgUlhPTgotICogICAgICAgIGNoYW5uZWwuCi0gKgotICogTk9URTogIEFsbCBSWE9OcyB3aXBlIGNsZWFuIHRoZSBpbnRlcm5hbCB0eHBvd2VyIHRhYmxlLiAgRHJpdmVyIG11c3QKLSAqICAgICAgICBpc3N1ZSBhIG5ldyBSRVBMWV9UWF9QV1JfVEFCTEVfQ01EIGFmdGVyIGVhY2ggUkVQTFlfUlhPTiAoMHgxMCksCi0gKiAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIFJYT05fRklMVEVSX0FTU09DX01TSyBpcyBzZXQuCi0gKi8KLQotc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQgewotCXU4IG5vZGVfYWRkcls2XTsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IGJzc2lkX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMjsKLQl1OCB3bGFwX2Jzc2lkX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMzsKLQl1OCBkZXZfdHlwZTsKLQl1OCBhaXJfcHJvcGFnYXRpb247Ci0JX19sZTE2IHJlc2VydmVkNDsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JX19sZTE2IHJlc2VydmVkNTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X3J4b25fY21kIHsKLQl1OCBub2RlX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdTggd2xhcF9ic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDM7Ci0JdTggZGV2X3R5cGU7Ci0JdTggYWlyX3Byb3BhZ2F0aW9uOwotCV9fbGUxNiByeF9jaGFpbjsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci19IF9fcGFja2VkOwotCi0vKiBDcmVhdGUgYSBjb21tb24gcnhvbiBjbWQgd2hpY2ggd2lsbCBiZSB0eXBlY2FzdCBpbnRvIHRoZSAzOTQ1IG9yIDQ5NjUKLSAqIHNwZWNpZmljIHJ4b24gY21kLCBkZXBlbmRpbmcgb24gd2hlcmUgaXQgaXMgY2FsbGVkIGZyb20uCi0gKi8KLXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kIHsKLQl1OCBub2RlX2FkZHJbNl07Ci0JX19sZTE2IHJlc2VydmVkMTsKLQl1OCBic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdTggd2xhcF9ic3NpZF9hZGRyWzZdOwotCV9fbGUxNiByZXNlcnZlZDM7Ci0JdTggZGV2X3R5cGU7Ci0JdTggYWlyX3Byb3BhZ2F0aW9uOwotCV9fbGUxNiByeF9jaGFpbjsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgYXNzb2NfaWQ7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci0JdTggcmVzZXJ2ZWQ0OwotCXU4IHJlc2VydmVkNTsKLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIFJFUExZX1JYT05fQVNTT0MgPSAweDExIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHsKLQlfX2xlMzIgZmxhZ3M7Ci0JX19sZTMyIGZpbHRlcl9mbGFnczsKLQl1OCBvZmRtX2Jhc2ljX3JhdGVzOwotCXU4IGNja19iYXNpY19yYXRlczsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9yeG9uX2Fzc29jX2NtZCB7Ci0JX19sZTMyIGZsYWdzOwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7Ci0JdTggb2ZkbV9iYXNpY19yYXRlczsKLQl1OCBjY2tfYmFzaWNfcmF0ZXM7Ci0JdTggb2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXU4IG9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXM7Ci0JX19sZTE2IHJ4X2NoYWluX3NlbGVjdF9mbGFnczsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUwJMTAKLSNkZWZpbmUgSVdMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJNCAvKiA0MDk2ICovCi0jZGVmaW5lIElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJMSAvKiAxMDI0ICovCi0KLS8qCi0gKiBSRVBMWV9SWE9OX1RJTUlORyA9IDB4MTQgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9yeG9uX3RpbWVfY21kIHsKLQlfX2xlNjQgdGltZXN0YW1wOwotCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JX19sZTE2IGF0aW1fd2luZG93OwotCV9fbGUzMiBiZWFjb25faW5pdF92YWw7Ci0JX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKLQl1OCBkdGltX3BlcmlvZDsKLQl1OCBkZWx0YV9jcF9ic3NfdGJ0dHM7Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfc3dpdGNoX2NtZCB7Ci0JdTggYmFuZDsKLQl1OCBleHBlY3RfYmVhY29uOwotCV9fbGUxNiBjaGFubmVsOwotCV9fbGUzMiByeG9uX2ZsYWdzOwotCV9fbGUzMiByeG9uX2ZpbHRlcl9mbGFnczsKLQlfX2xlMzIgc3dpdGNoX3RpbWU7Ci0Jc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUgcG93ZXJbSVdMX01BWF9SQVRFU107Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgewotCXU4IGJhbmQ7Ci0JdTggZXhwZWN0X2JlYWNvbjsKLQlfX2xlMTYgY2hhbm5lbDsKLQlfX2xlMzIgcnhvbl9mbGFnczsKLQlfX2xlMzIgcnhvbl9maWx0ZXJfZmxhZ3M7Ci0JX19sZTMyIHN3aXRjaF90aW1lOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiA9IDB4NzMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gewotCV9fbGUxNiBiYW5kOwotCV9fbGUxNiBjaGFubmVsOwotCV9fbGUzMiBzdGF0dXM7CQkvKiAwIC0gT0ssIDEgLSBmYWlsICovCi19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMikKLSAqIFF1YWxpdHktb2YtU2VydmljZSAoUU9TKSBDb21tYW5kcyAmIFJlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogc3RydWN0IGl3bF9hY19xb3MgLS0gUU9TIHRpbWluZyBwYXJhbXMgZm9yIFJFUExZX1FPU19QQVJBTQotICogT25lIGZvciBlYWNoIG9mIDQgRURDQSBhY2Nlc3MgY2F0ZWdvcmllcyBpbiBzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZAotICoKLSAqIEBjd19taW46IENvbnRlbnRpb24gd2luZG93LCBzdGFydCB2YWx1ZSBpbiBudW1iZXJzIG9mIHNsb3RzLgotICogICAgICAgICAgU2hvdWxkIGJlIGEgcG93ZXItb2YtMiwgbWludXMgMS4gIERldmljZSdzIGRlZmF1bHQgaXMgMHgwZi4KLSAqIEBjd19tYXg6IENvbnRlbnRpb24gd2luZG93LCBtYXggdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KLSAqICAgICAgICAgIFNob3VsZCBiZSBhIHBvd2VyLW9mLTIsIG1pbnVzIDEuICBEZXZpY2UncyBkZWZhdWx0IGlzIDB4M2YuCi0gKiBAYWlmc246ICBOdW1iZXIgb2Ygc2xvdHMgaW4gQXJiaXRyYXRpb24gSW50ZXJmcmFtZSBTcGFjZSAoYmVmb3JlCi0gKiAgICAgICAgICBwZXJmb3JtaW5nIHJhbmRvbSBiYWNrb2ZmIHRpbWluZyBwcmlvciB0byBUeCkuICBEZXZpY2UgZGVmYXVsdCAxLgotICogQGVkY2FfdHhvcDogIExlbmd0aCBvZiBUeCBvcHBvcnR1bml0eSwgaW4gdVNlY3MuICBEZXZpY2UgZGVmYXVsdCBpcyAwLgotICoKLSAqIERldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgY29udGVudGlvbiB3aW5kb3cgYnkgKDIqQ1cpICsgMSBmb3IgZWFjaAotICogdHJhbnNtaXNzaW9uIHJldHJ5LiAgRGV2aWNlIHVzZXMgY3dfbWF4IGFzIGEgYml0IG1hc2ssIEFORGVkIHdpdGggbmV3IENXCi0gKiB2YWx1ZSwgdG8gY2FwIHRoZSBDVyB2YWx1ZS4KLSAqLwotc3RydWN0IGl3bF9hY19xb3MgewotCV9fbGUxNiBjd19taW47Ci0JX19sZTE2IGN3X21heDsKLQl1OCBhaWZzbjsKLQl1OCByZXNlcnZlZDE7Ci0JX19sZTE2IGVkY2FfdHhvcDsKLX0gX19wYWNrZWQ7Ci0KLS8qIFFvUyBmbGFncyBkZWZpbmVzICovCi0jZGVmaW5lIFFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLCWNwdV90b19sZTMyKDB4MDEpCi0jZGVmaW5lIFFPU19QQVJBTV9GTEdfVEdOX01TSwkJY3B1X3RvX2xlMzIoMHgwMikKLSNkZWZpbmUgUU9TX1BBUkFNX0ZMR19UWE9QX1RZUEVfTVNLCWNwdV90b19sZTMyKDB4MTApCi0KLS8qIE51bWJlciBvZiBBY2Nlc3MgQ2F0ZWdvcmllcyAoQUMpIChFRENBKSwgcXVldWVzIDAuLjMgKi8KLSNkZWZpbmUgQUNfTlVNICAgICAgICAgICAgICAgIDQKLQotLyoKLSAqIFJFUExZX1FPU19QQVJBTSA9IDB4MTMgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBUaGlzIGNvbW1hbmQgc2V0cyB1cCB0aW1pbmdzIGZvciBlYWNoIG9mIHRoZSA0IHByaW9yaXRpemVkIEVEQ0EgVHggRklGT3MKLSAqIDA6IEJhY2tncm91bmQsIDE6IEJlc3QgRWZmb3J0LCAyOiBWaWRlbywgMzogVm9pY2UuCi0gKi8KLXN0cnVjdCBpd2xfcW9zcGFyYW1fY21kIHsKLQlfX2xlMzIgcW9zX2ZsYWdzOwotCXN0cnVjdCBpd2xfYWNfcW9zIGFjW0FDX05VTV07Ci19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoMykKLSAqIEFkZC9Nb2RpZnkgU3RhdGlvbnMgQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIE11bHRpIHN0YXRpb24gc3VwcG9ydAotICovCi0KLS8qIFNwZWNpYWwsIGRlZGljYXRlZCBsb2NhdGlvbnMgd2l0aGluIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KLSNkZWZpbmUJSVdMX0FQX0lECQkwCi0jZGVmaW5lCUlXTF9TVEFfSUQJCTIKLSNkZWZpbmUJSVdMMzk0NV9CUk9BRENBU1RfSUQJMjQKLSNkZWZpbmUgSVdMMzk0NV9TVEFUSU9OX0NPVU5UCTI1Ci0jZGVmaW5lIElXTDQ5NjVfQlJPQURDQVNUX0lECTMxCi0jZGVmaW5lCUlXTDQ5NjVfU1RBVElPTl9DT1VOVAkzMgotCi0jZGVmaW5lCUlXTF9TVEFUSU9OX0NPVU5UCTMyIAkvKiBNQVgoMzk0NSw0OTY1KSovCi0jZGVmaW5lCUlXTF9JTlZBTElEX1NUQVRJT04JMjU1Ci0KLSNkZWZpbmUgU1RBX0ZMR19UWF9SQVRFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyKQotI2RlZmluZSBTVEFfRkxHX1BXUl9TQVZFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCA4KQotI2RlZmluZSBTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLCWNwdV90b19sZTMyKDEgPDwgMTcpCi0jZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfOFVTX01TSwljcHVfdG9fbGUzMigxIDw8IDE4KQotI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9QT1MJKDE5KQotI2RlZmluZSBTVEFfRkxHX01BWF9BR0dfU0laRV9NU0sJY3B1X3RvX2xlMzIoMyA8PCAxOSkKLSNkZWZpbmUgU1RBX0ZMR19IVDQwX0VOX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyMSkKLSNkZWZpbmUgU1RBX0ZMR19NSU1PX0RJU19NU0sJCWNwdV90b19sZTMyKDEgPDwgMjIpCi0jZGVmaW5lIFNUQV9GTEdfQUdHX01QRFVfREVOU0lUWV9QT1MJKDIzKQotI2RlZmluZSBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfTVNLCWNwdV90b19sZTMyKDcgPDwgMjMpCi0KLS8qIFVzZSBpbiBtb2RlIGZpZWxkLiAgMTogbW9kaWZ5IGV4aXN0aW5nIGVudHJ5LCAwOiBhZGQgbmV3IHN0YXRpb24gZW50cnkgKi8KLSNkZWZpbmUgU1RBX0NPTlRST0xfTU9ESUZZX01TSwkJMHgwMQotCi0vKiBrZXkgZmxhZ3MgX19sZTE2Ki8KLSNkZWZpbmUgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0sJY3B1X3RvX2xlMTYoMHgwMDA3KQotI2RlZmluZSBTVEFfS0VZX0ZMR19OT19FTkMJY3B1X3RvX2xlMTYoMHgwMDAwKQotI2RlZmluZSBTVEFfS0VZX0ZMR19XRVAJCWNwdV90b19sZTE2KDB4MDAwMSkKLSNkZWZpbmUgU1RBX0tFWV9GTEdfQ0NNUAljcHVfdG9fbGUxNigweDAwMDIpCi0jZGVmaW5lIFNUQV9LRVlfRkxHX1RLSVAJY3B1X3RvX2xlMTYoMHgwMDAzKQotCi0jZGVmaW5lIFNUQV9LRVlfRkxHX0tFWUlEX1BPUwk4Ci0jZGVmaW5lIFNUQV9LRVlfRkxHX0lOVkFMSUQJY3B1X3RvX2xlMTYoMHgwODAwKQotLyogd2VwIGtleSBpcyBlaXRoZXIgZnJvbSBnbG9iYWwga2V5ICgwKSBvciBmcm9tIHN0YXRpb24gaW5mbyBhcnJheSAoMSkgKi8KLSNkZWZpbmUgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0sJY3B1X3RvX2xlMTYoMHgwMDA4KQotCi0vKiB3ZXAga2V5IGluIFNUQTogNS1ieXRlcyAoMCkgb3IgMTMtYnl0ZXMgKDEpICovCi0jZGVmaW5lIFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSwljcHVfdG9fbGUxNigweDEwMDApCi0jZGVmaW5lIFNUQV9LRVlfTVVMVElDQVNUX01TSwkJY3B1X3RvX2xlMTYoMHg0MDAwKQotI2RlZmluZSBTVEFfS0VZX01BWF9OVU0JCTgKLQotLyogRmxhZ3MgaW5kaWNhdGUgd2hldGhlciB0byBtb2RpZnkgdnMuIGRvbid0IGNoYW5nZSB2YXJpb3VzIHN0YXRpb24gcGFyYW1zICovCi0jZGVmaW5lCVNUQV9NT0RJRllfS0VZX01BU0sJCTB4MDEKLSNkZWZpbmUJU1RBX01PRElGWV9USURfRElTQUJMRV9UWAkweDAyCi0jZGVmaW5lCVNUQV9NT0RJRllfVFhfUkFURV9NU0sJCTB4MDQKLSNkZWZpbmUgU1RBX01PRElGWV9BRERCQV9USURfTVNLCTB4MDgKLSNkZWZpbmUgU1RBX01PRElGWV9ERUxCQV9USURfTVNLCTB4MTAKLSNkZWZpbmUgU1RBX01PRElGWV9TTEVFUF9UWF9DT1VOVF9NU0sJMHgyMAotCi0vKiBSZWNlaXZlciBhZGRyZXNzIChhY3R1YWxseSwgUnggc3RhdGlvbidzIGluZGV4IGludG8gc3RhdGlvbiB0YWJsZSksCi0gKiBjb21iaW5lZCB3aXRoIFRyYWZmaWMgSUQgKFFPUyBwcmlvcml0eSksIGluIGZvcm1hdCB1c2VkIGJ5IFR4IFNjaGVkdWxlciAqLwotI2RlZmluZSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpCSgoKHN0YV9pZCkgPDwgNCkgKyAodGlkKSkKLQotc3RydWN0IGl3bDQ5NjVfa2V5aW5mbyB7Ci0JX19sZTE2IGtleV9mbGFnczsKLQl1OCB0a2lwX3J4X3RzY19ieXRlMjsJLyogVFNDWzJdIGZvciBrZXkgbWl4IHBoMSBkZXRlY3Rpb24gKi8KLQl1OCByZXNlcnZlZDE7Ci0JX19sZTE2IHRraXBfcnhfdHRha1s1XTsJLyogMTAtYnl0ZSB1bmljYXN0IFRLSVAgVFRBSyAqLwotCXU4IGtleV9vZmZzZXQ7Ci0JdTggcmVzZXJ2ZWQyOwotCXU4IGtleVsxNl07CQkvKiAxNi1ieXRlIHVuaWNhc3QgZGVjcnlwdGlvbiBrZXkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IHN0YV9pZF9tb2RpZnkKLSAqIEBhZGRyW0VUSF9BTEVOXTogc3RhdGlvbidzIE1BQyBhZGRyZXNzCi0gKiBAc3RhX2lkOiBpbmRleCBvZiBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZQotICogQG1vZGlmeV9tYXNrOiBTVEFfTU9ESUZZXyosIDE6IG1vZGlmeSwgMDogZG9uJ3QgY2hhbmdlCi0gKgotICogRHJpdmVyIHNlbGVjdHMgdW51c2VkIHRhYmxlIGluZGV4IHdoZW4gYWRkaW5nIG5ldyBzdGF0aW9uLAotICogb3IgdGhlIGluZGV4IHRvIGEgcHJlLWV4aXN0aW5nIHN0YXRpb24gZW50cnkgd2hlbiBtb2RpZnlpbmcgdGhhdCBzdGF0aW9uLgotICogU29tZSBpbmRleGVzIGhhdmUgc3BlY2lhbCBwdXJwb3NlcyAoSVdMX0FQX0lELCBpbmRleCAwLCBpcyBmb3IgQVApLgotICoKLSAqIG1vZGlmeV9tYXNrIGZsYWdzIHNlbGVjdCB3aGljaCBwYXJhbWV0ZXJzIHRvIG1vZGlmeSB2cy4gbGVhdmUgYWxvbmUuCi0gKi8KLXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCXU4IHN0YV9pZDsKLQl1OCBtb2RpZnlfbWFzazsKLQlfX2xlMTYgcmVzZXJ2ZWQyOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX0FERF9TVEEgPSAweDE4IChjb21tYW5kKQotICoKLSAqIFRoZSBkZXZpY2UgY29udGFpbnMgYW4gaW50ZXJuYWwgdGFibGUgb2YgcGVyLXN0YXRpb24gaW5mb3JtYXRpb24sCi0gKiB3aXRoIGluZm8gb24gc2VjdXJpdHkga2V5cywgYWdncmVnYXRpb24gcGFyYW1ldGVycywgYW5kIFR4IHJhdGVzIGZvcgotICogaW5pdGlhbCBUeCBhdHRlbXB0IGFuZCBhbnkgcmV0cmllcyAoNDk2NSBkZXZpY2VzIHVzZXMKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQsCi0gKiAzOTQ1IHVzZXMgUkVQTFlfUkFURV9TQ0FMRSB0byBzZXQgdXAgcmF0ZSB0YWJsZXMpLgotICoKLSAqIFJFUExZX0FERF9TVEEgc2V0cyB1cCB0aGUgdGFibGUgZW50cnkgZm9yIG9uZSBzdGF0aW9uLCBlaXRoZXIgY3JlYXRpbmcKLSAqIGEgbmV3IGVudHJ5LCBvciBtb2RpZnlpbmcgYSBwcmUtZXhpc3Rpbmcgb25lLgotICoKLSAqIE5PVEU6ICBSWE9OIGNvbW1hbmQgKHdpdGhvdXQgImFzc29jaWF0ZWQiIGJpdCBzZXQpIHdpcGVzIHRoZSBzdGF0aW9uIHRhYmxlCi0gKiAgICAgICAgY2xlYW4uICBNb3ZpbmcgaW50byBSRl9LSUxMIHN0YXRlIGRvZXMgdGhpcyBhbHNvLiAgRHJpdmVyIG11c3Qgc2V0IHVwCi0gKiAgICAgICAgbmV3IHN0YXRpb24gdGFibGUgYmVmb3JlIHRyYW5zbWl0dGluZyBhbnl0aGluZyBvbiB0aGUgUlhPTiBjaGFubmVsCi0gKiAgICAgICAgKGV4Y2VwdCBhY3RpdmUgc2NhbnMgb3IgYWN0aXZlIG1lYXN1cmVtZW50czsgdGhvc2UgY29tbWFuZHMgY2FycnkKLSAqICAgICAgICB0aGVpciBvd24gdHhwb3dlci9yYXRlIHNldHVwIGRhdGEpLgotICoKLSAqICAgICAgICBXaGVuIGdldHRpbmcgc3RhcnRlZCBvbiBhIG5ldyBjaGFubmVsLCBkcml2ZXIgbXVzdCBzZXQgdXAgdGhlCi0gKiAgICAgICAgSVdMX0JST0FEQ0FTVF9JRCBlbnRyeSAobGFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgRm9yIGEgY2xpZW50Ci0gKiAgICAgICAgc3RhdGlvbiBpbiBhIEJTUywgb25jZSBhbiBBUCBpcyBzZWxlY3RlZCwgZHJpdmVyIHNldHMgdXAgdGhlIEFQIFNUQQotICogICAgICAgIGluIHRoZSBJV0xfQVBfSUQgZW50cnkgKDFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgQlJPQURDQVNUIGFuZCBBUAotICogICAgICAgIGFyZSBhbGwgdGhhdCBhcmUgbmVlZGVkIGZvciBhIEJTUyBjbGllbnQgc3RhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKLSAqICAgICAgICB1c2VkIGFzIEFQLCBvciBpbiBhbiBJQlNTIG5ldHdvcmssIGRyaXZlciBtdXN0IHNldCB1cCBzdGF0aW9uIHRhYmxlCi0gKiAgICAgICAgZW50cmllcyBmb3IgYWxsIFNUQXMgaW4gbmV0d29yaywgc3RhcnRpbmcgd2l0aCBpbmRleCBJV0xfU1RBX0lELgotICovCi0KLXN0cnVjdCBpd2wzOTQ1X2FkZHN0YV9jbWQgewotCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkWzNdOwotCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKLQlzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIGtleTsKLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsJCS8qIFNUQV9GTEdfKiAqLwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCi0KLQkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCi0JX19sZTE2IHRpZF9kaXNhYmxlX3R4OwotCi0JX19sZTE2IHJhdGVfbl9mbGFnczsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IGFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogVElEIGZvciB3aGljaCB0byByZW1vdmUgYmxvY2stYWNrIHN1cHBvcnQuCi0JICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCi0JdTggcmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0KLQkvKiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZm9yIGFkZGVkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgewotCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkWzNdOwotCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKLQlzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIGtleTsKLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsJCS8qIFNUQV9GTEdfKiAqLwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCi0KLQkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCi0JX19sZTE2IHRpZF9kaXNhYmxlX3R4OwotCi0JX19sZTE2CXJlc2VydmVkMTsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IGFkZF9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogVElEIGZvciB3aGljaCB0byByZW1vdmUgYmxvY2stYWNrIHN1cHBvcnQuCi0JICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0RFTEJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCi0JdTggcmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0KLQkvKiBTdGFydGluZyBTZXF1ZW5jZSBOdW1iZXIgZm9yIGFkZGVkIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKLQotCS8qCi0JICogTnVtYmVyIG9mIHBhY2tldHMgT0sgdG8gdHJhbnNtaXQgdG8gc3RhdGlvbiBldmVuIHRob3VnaAotCSAqIGl0IGlzIGFzbGVlcCAtLSB1c2VkIHRvIHN5bmNocm9uaXNlIFBTLXBvbGwgYW5kIHUtQVBTRAotCSAqIHJlc3BvbnNlcyB3aGlsZSB1Y29kZSBrZWVwcyB0cmFjayBvZiBTVEEgc2xlZXAgc3RhdGUuCi0JICovCi0JX19sZTE2IHNsZWVwX3R4X2NvdW50OwotCi0JX19sZTE2IHJlc2VydmVkMjsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdyYXBwZXIgc3RydWN0IGZvciAzOTQ1IGFuZCA0OTY1IGFkZHN0YV9jbWQgc3RydWN0dXJlcyAqLwotc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCB7Ci0JdTggbW9kZTsJCS8qIDE6IG1vZGlmeSBleGlzdGluZywgMDogYWRkIG5ldyBzdGF0aW9uICovCi0JdTggcmVzZXJ2ZWRbM107Ci0Jc3RydWN0IHN0YV9pZF9tb2RpZnkgc3RhOwotCXN0cnVjdCBpd2w0OTY1X2tleWluZm8ga2V5OwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkJLyogU1RBX0ZMR18qICovCi0JX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KLQotCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCi0JICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7Ci0KLQlfX2xlMTYJcmF0ZV9uX2ZsYWdzOwkJLyogMzk0NSBvbmx5ICovCi0KLQkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQl1OCBhZGRfaW1tZWRpYXRlX2JhX3RpZDsKLQotCS8qIFRJRCBmb3Igd2hpY2ggdG8gcmVtb3ZlIGJsb2NrLWFjayBzdXBwb3J0LgotCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9ERUxCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwotCXU4IHJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOwotCi0JLyogU3RhcnRpbmcgU2VxdWVuY2UgTnVtYmVyIGZvciBhZGRlZCBibG9jay1hY2sgc3VwcG9ydC4KLQkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KLQlfX2xlMTYgYWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0KLQkvKgotCSAqIE51bWJlciBvZiBwYWNrZXRzIE9LIHRvIHRyYW5zbWl0IHRvIHN0YXRpb24gZXZlbiB0aG91Z2gKLQkgKiBpdCBpcyBhc2xlZXAgLS0gdXNlZCB0byBzeW5jaHJvbmlzZSBQUy1wb2xsIGFuZCB1LUFQU0QKLQkgKiByZXNwb25zZXMgd2hpbGUgdWNvZGUga2VlcHMgdHJhY2sgb2YgU1RBIHNsZWVwIHN0YXRlLgotCSAqLwotCV9fbGUxNiBzbGVlcF90eF9jb3VudDsKLQotCV9fbGUxNiByZXNlcnZlZDI7Ci19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQUREX1NUQV9TVUNDRVNTX01TSwkJMHgxCi0jZGVmaW5lIEFERF9TVEFfTk9fUk9PTV9JTl9UQUJMRQkweDIKLSNkZWZpbmUgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0UJMHg0Ci0jZGVmaW5lIEFERF9TVEFfTU9ESUZZX05PTl9FWElTVF9TVEEJMHg4Ci0vKgotICogUkVQTFlfQUREX1NUQSA9IDB4MTggKHJlc3BvbnNlKQotICovCi1zdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCB7Ci0JdTggc3RhdHVzOwkvKiBBRERfU1RBXyogKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgUkVNX1NUQV9TVUNDRVNTX01TSyAgICAgICAgICAgICAgMHgxCi0vKgotICogIFJFUExZX1JFTV9TVEEgPSAweDE5IChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9yZW1fc3RhX3Jlc3AgewotCXU4IHN0YXR1czsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiAgUkVQTFlfUkVNX1NUQSA9IDB4MTkgKGNvbW1hbmQpCi0gKi8KLXN0cnVjdCBpd2xfcmVtX3N0YV9jbWQgewotCXU4IG51bV9zdGE7ICAgICAvKiBudW1iZXIgb2YgcmVtb3ZlZCBzdGF0aW9ucyAqLwotCXU4IHJlc2VydmVkWzNdOwotCXU4IGFkZHJbRVRIX0FMRU5dOyAvKiBNQUMgYWRkciBvZiB0aGUgZmlyc3Qgc3RhdGlvbiAqLwotCXU4IHJlc2VydmVkMlsyXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgSVdMX1RYX0ZJRk9fQktfTVNLCQljcHVfdG9fbGUzMihCSVQoMCkpCi0jZGVmaW5lIElXTF9UWF9GSUZPX0JFX01TSwkJY3B1X3RvX2xlMzIoQklUKDEpKQotI2RlZmluZSBJV0xfVFhfRklGT19WSV9NU0sJCWNwdV90b19sZTMyKEJJVCgyKSkKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVk9fTVNLCQljcHVfdG9fbGUzMihCSVQoMykpCi0jZGVmaW5lIElXTF9BR0dfVFhfUVVFVUVfTVNLCQljcHVfdG9fbGUzMigweGZmYzAwKQotCi0jZGVmaW5lIElXTF9EUk9QX1NJTkdMRQkJMAotI2RlZmluZSBJV0xfRFJPUF9TRUxFQ1RFRAkxCi0jZGVmaW5lIElXTF9EUk9QX0FMTAkJMgotCi0vKgotICogUkVQTFlfV0VQX0tFWSA9IDB4MjAKLSAqLwotc3RydWN0IGl3bF93ZXBfa2V5IHsKLQl1OCBrZXlfaW5kZXg7Ci0JdTgga2V5X29mZnNldDsKLQl1OCByZXNlcnZlZDFbMl07Ci0JdTgga2V5X3NpemU7Ci0JdTggcmVzZXJ2ZWQyWzNdOwotCXU4IGtleVsxNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3dlcF9jbWQgewotCXU4IG51bV9rZXlzOwotCXU4IGdsb2JhbF9rZXlfdHlwZTsKLQl1OCBmbGFnczsKLQl1OCByZXNlcnZlZDsKLQlzdHJ1Y3QgaXdsX3dlcF9rZXkga2V5WzBdOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBXRVBfS0VZX1dFUF9UWVBFIDEKLSNkZWZpbmUgV0VQX0tFWVNfTUFYIDQKLSNkZWZpbmUgV0VQX0lOVkFMSURfT0ZGU0VUIDB4ZmYKLSNkZWZpbmUgV0VQX0tFWV9MRU5fNjQgNQotI2RlZmluZSBXRVBfS0VZX0xFTl8xMjggMTMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDQpCi0gKiBSeCBSZXNwb25zZXM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFJYX1JFU19TVEFUVVNfTk9fQ1JDMzJfRVJST1IJY3B1X3RvX2xlMzIoMSA8PCAwKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVwljcHVfdG9fbGUzMigxIDw8IDEpCi0KLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSwljcHVfdG9fbGUxNigxIDw8IDApCi0jZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfTU9EX0NDS19NU0sJCWNwdV90b19sZTE2KDEgPDwgMSkKLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0sJY3B1X3RvX2xlMTYoMSA8PCAyKQotI2RlZmluZSBSWF9SRVNfUEhZX0ZMQUdTX05BUlJPV19CQU5EX01TSwljcHVfdG9fbGUxNigxIDw8IDMpCi0jZGVmaW5lIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0sJCTB4ZjAKLSNkZWZpbmUgUlhfUkVTX1BIWV9GTEFHU19BTlRFTk5BX1BPUwkJNAotCi0jZGVmaW5lIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLCSgweDcgPDwgOCkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FCSgweDAgPDwgOCkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9XRVAJKDB4MSA8PCA4KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0NDTVAJKDB4MiA8PCA4KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVAJKDB4MyA8PCA4KQotI2RlZmluZQlSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0VSUgkoMHg3IDw8IDgpCi0KLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19TVEFUSU9OX0ZPVU5ECSgxPDw2KQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX05PX1NUQVRJT05fSU5GT19NSVNNQVRDSAkoMTw8NykKLQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0sJKDB4MyA8PCAxMSkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19OT1RfREVDUllQVAkoMHgwIDw8IDExKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfT0sJKDB4MyA8PCAxMSkKLSNkZWZpbmUgUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQwkoMHgxIDw8IDExKQotI2RlZmluZSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSwkoMHgyIDw8IDExKQotCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0sJKDB4MjApCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0sJKDB4NDApCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19UVEFLX09LCSgxIDw8IDcpCi0jZGVmaW5lIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0sJKDB4ODAwKQotCi0KLXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzIHsKLQl1OCBwaHlfY291bnQ7Ci0JdTggaWQ7Ci0JdTggcnNzaTsKLQl1OCBhZ2M7Ci0JX19sZTE2IHNpZ19hdmc7Ci0JX19sZTE2IG5vaXNlX2RpZmY7Ci0JdTggcGF5bG9hZFswXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciB7Ci0JX19sZTE2IGNoYW5uZWw7Ci0JX19sZTE2IHBoeV9mbGFnczsKLQl1OCByZXNlcnZlZDE7Ci0JdTggcmF0ZTsKLQlfX2xlMTYgbGVuOwotCXU4IHBheWxvYWRbMF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgewotCV9fbGUzMiBzdGF0dXM7Ci0JX19sZTY0IHRpbWVzdGFtcDsKLQlfX2xlMzIgYmVhY29uX3RpbWVzdGFtcDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV8zOTQ1X1JYID0gMHgxYiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKLSAqCi0gKiBOT1RFOiAgRE8gTk9UIGRlcmVmZXJlbmNlIGZyb20gY2FzdHMgdG8gdGhpcyBzdHJ1Y3R1cmUKLSAqIEl0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIGNhbGN1bGF0aW5nIG1pbmltdW0gZGF0YSBzZXQgc2l6ZS4KLSAqIFRoZSBhY3R1YWwgb2Zmc2V0cyBvZiB0aGUgaGRyIGFuZCBlbmQgYXJlIGR5bmFtaWMgYmFzZWQgb24KLSAqIHN0YXRzLnBoeV9jb3VudAotICovCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZSB7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyIGhkcjsKLQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgZW5kOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBJV0wzOV9SWF9GUkFNRV9TSVpFCSg0ICsgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lKSkKLQotLyogRml4ZWQgKG5vbi1jb25maWd1cmFibGUpIHJ4IGRhdGEgZnJvbSBwaHkgKi8KLQotI2RlZmluZSBJV0w0OV9SWF9SRVNfUEhZX0NOVCAxNAotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUCSg0KQotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfTUFTSwkoMHg3MCkKLSNkZWZpbmUgSVdMNDlfQUdDX0RCX01BU0sJCQkoMHgzZjgwKQkvKiBNQVNLKDcsMTMpICovCi0jZGVmaW5lIElXTDQ5X0FHQ19EQl9QT1MJCQkoNykKLXN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5IHsKLQlfX2xlMTYgYW50X3NlbGVjdGlvbjsJLyogYW50IEEgYml0IDQsIGFudCBCIGJpdCA1LCBhbnQgQyBiaXQgNiAqLwotCV9fbGUxNiBhZ2NfaW5mbzsJLyogYWdjIGNvZGUgMDo2LCBhZ2MgZEIgNzoxMywgcmVzZXJ2ZWQgMTQ6MTUgKi8KLQl1OCByc3NpX2luZm9bNl07CS8qIHdlIHVzZSBldmVuIGVudHJpZXMsIDAvMi80IGZvciBBL0IvQyByc3NpICovCi0JdTggcGFkWzBdOwotfSBfX3BhY2tlZDsKLQotCi0vKgotICogUkVQTFlfUlggPSAweGMzIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQotICogVXNlZCBvbmx5IGZvciBsZWdhY3kgKG5vbiAxMW4pIGZyYW1lcy4KLSAqLwotc3RydWN0IGl3bF9yeF9waHlfcmVzIHsKLQl1OCBub25fY2ZnX3BoeV9jbnQ7ICAgICAvKiBub24gY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBieXRlIGNvdW50ICovCi0JdTggY2ZnX3BoeV9jbnQ7CQkvKiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIGJ5dGUgY291bnQgKi8KLQl1OCBzdGF0X2lkOwkJLyogY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBzZXQgSUQgKi8KLQl1OCByZXNlcnZlZDE7Ci0JX19sZTY0IHRpbWVzdGFtcDsJLyogVFNGIGF0IG9uIGFpciByaXNlICovCi0JX19sZTMyIGJlYWNvbl90aW1lX3N0YW1wOyAvKiBiZWFjb24gYXQgb24tYWlyIHJpc2UgKi8KLQlfX2xlMTYgcGh5X2ZsYWdzOwkvKiBnZW5lcmFsIHBoeSBmbGFnczogYmFuZCwgbW9kdWxhdGlvbiwgLi4uICovCi0JX19sZTE2IGNoYW5uZWw7CQkvKiBjaGFubmVsIG51bWJlciAqLwotCXU4IG5vbl9jZmdfcGh5X2J1ZlszMl07IC8qIGZvciB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZiBub25fY2ZnX3BoeSAqLwotCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogKi8KLQlfX2xlMTYgYnl0ZV9jb3VudDsJLyogZnJhbWUncyBieXRlLWNvdW50ICovCi0JX19sZTE2IGZyYW1lX3RpbWU7CS8qIGZyYW1lJ3MgdGltZSBvbiB0aGUgYWlyICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3J4X21wZHVfcmVzX3N0YXJ0IHsKLQlfX2xlMTYgYnl0ZV9jb3VudDsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICg1KQotICogVHggQ29tbWFuZHMgJiBSZXNwb25zZXM6Ci0gKgotICogRHJpdmVyIG11c3QgcGxhY2UgZWFjaCBSRVBMWV9UWCBjb21tYW5kIGludG8gb25lIG9mIHRoZSBwcmlvcml0aXplZCBUeAotICogcXVldWVzIGluIGhvc3QgRFJBTSwgc2hhcmVkIGJldHdlZW4gZHJpdmVyIGFuZCBkZXZpY2UgKHNlZSBjb21tZW50cyBmb3IKLSAqIFNDRCByZWdpc3RlcnMgYW5kIFR4L1J4IFF1ZXVlcykuICBXaGVuIHRoZSBkZXZpY2UncyBUeCBzY2hlZHVsZXIgYW5kIHVDb2RlCi0gKiBhcmUgcHJlcGFyaW5nIHRvIHRyYW5zbWl0LCB0aGUgZGV2aWNlIHB1bGxzIHRoZSBUeCBjb21tYW5kIG92ZXIgdGhlIFBDSQotICogYnVzIHZpYSBvbmUgb2YgdGhlIGRldmljZSdzIFR4IERNQSBjaGFubmVscywgdG8gZmlsbCBhbiBpbnRlcm5hbCBGSUZPCi0gKiBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB0cmFuc21pdHRlZC4KLSAqCi0gKiB1Q29kZSBoYW5kbGVzIGFsbCB0aW1pbmcgYW5kIHByb3RvY29sIHJlbGF0ZWQgdG8gY29udHJvbCBmcmFtZXMKLSAqIChSVFMvQ1RTL0FDSyksIGJhc2VkIG9uIGZsYWdzIGluIHRoZSBUeCBjb21tYW5kLiAgdUNvZGUgYW5kIFR4IHNjaGVkdWxlcgotICogaGFuZGxlIHJlY2VwdGlvbiBvZiBibG9jay1hY2tzOyB1Q29kZSB1cGRhdGVzIHRoZSBob3N0IGRyaXZlciB2aWEKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEuCi0gKgotICogdUNvZGUgaGFuZGxlcyByZXRyeWluZyBUeCB3aGVuIGFuIEFDSyBpcyBleHBlY3RlZCBidXQgbm90IHJlY2VpdmVkLgotICogVGhpcyBpbmNsdWRlcyB0cnlpbmcgbG93ZXIgZGF0YSByYXRlcyB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluIHRoZSBUeAotICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBSRVBMWV9SQVRFX1NDQUxFIChmb3IgMzk0NSkgb3IKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgKDQ5NjUpLgotICoKLSAqIERyaXZlciBzZXRzIHVwIHRyYW5zbWl0IHBvd2VyIGZvciB2YXJpb3VzIHJhdGVzIHZpYSBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELgotICogVGhpcyBjb21tYW5kIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgZXZlcnkgUlhPTiBjb21tYW5kLCBiZWZvcmUgVHggY2FuIG9jY3VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSRVBMWV9UWCBUeCBmbGFncyBmaWVsZCAqLwotCi0vKgotICogMTogVXNlIFJlcXVlc3QtVG8tU2VuZCBwcm90b2NvbCBiZWZvcmUgdGhpcyBmcmFtZS4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19DVFNfTVNLLgotICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfUlRTX01TSyBjcHVfdG9fbGUzMigxIDw8IDEpCi0KLS8qCi0gKiAxOiBUcmFuc21pdCBDbGVhci1Uby1TZW5kIHRvIHNlbGYgYmVmb3JlIHRoaXMgZnJhbWUuCi0gKiBEcml2ZXIgc2hvdWxkIHNldCB0aGlzIGZvciBBVVRIL0RFQVVUSC9BU1NPQy1SRVEvUkVBU1NPQyBtZ21udCBmcmFtZXMuCi0gKiBNdXR1YWxseSBleGNsdXNpdmUgdnMuIFRYX0NNRF9GTEdfUlRTX01TSy4KLSAqLwotI2RlZmluZSBUWF9DTURfRkxHX0NUU19NU0sgY3B1X3RvX2xlMzIoMSA8PCAyKQotCi0vKiAxOiBFeHBlY3QgQUNLIGZyb20gcmVjZWl2aW5nIHN0YXRpb24KLSAqIDA6IERvbid0IGV4cGVjdCBBQ0sgKE1BQyBoZWFkZXIncyBkdXJhdGlvbiBmaWVsZCBzL2IgMCkKLSAqIFNldCB0aGlzIGZvciB1bmljYXN0IGZyYW1lcywgYnV0IG5vdCBicm9hZGNhc3QvbXVsdGljYXN0LiAqLwotI2RlZmluZSBUWF9DTURfRkxHX0FDS19NU0sgY3B1X3RvX2xlMzIoMSA8PCAzKQotCi0vKiBGb3IgNDk2NSBkZXZpY2VzOgotICogMTogVXNlIHJhdGUgc2NhbGUgdGFibGUgKHNlZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKS4KLSAqICAgIFR4IGNvbW1hbmQncyBpbml0aWFsX3JhdGVfaW5kZXggaW5kaWNhdGVzIGZpcnN0IHJhdGUgdG8gdHJ5OwotICogICAgdUNvZGUgd2Fsa3MgdGhyb3VnaCB0YWJsZSBmb3IgYWRkaXRpb25hbCBUeCBhdHRlbXB0cy4KLSAqIDA6IFVzZSBUeCByYXRlL01DUyBmcm9tIFR4IGNvbW1hbmQncyByYXRlX25fZmxhZ3MgZmllbGQuCi0gKiAgICBUaGlzIHJhdGUgd2lsbCBiZSB1c2VkIGZvciBhbGwgVHggYXR0ZW1wdHM7IGl0IHdpbGwgbm90IGJlIHNjYWxlZC4gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgY3B1X3RvX2xlMzIoMSA8PCA0KQotCi0vKiAxOiBFeHBlY3QgaW1tZWRpYXRlIGJsb2NrLWFjay4KLSAqIFNldCB3aGVuIFR4aW5nIGEgYmxvY2stYWNrIHJlcXVlc3QgZnJhbWUuICBBbHNvIHNldCBUWF9DTURfRkxHX0FDS19NU0suICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLICBjcHVfdG9fbGUzMigxIDw8IDYpCi0KLS8qCi0gKiAxOiBGcmFtZSByZXF1aXJlcyBmdWxsIFR4LU9wIHByb3RlY3Rpb24uCi0gKiBTZXQgdGhpcyBpZiBlaXRoZXIgUlRTIG9yIENUUyBUeCBGbGFnIGdldHMgc2V0LgotICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLIGNwdV90b19sZTMyKDEgPDwgNykKLQotLyogVHggYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQ7IHVzZWQgb25seSBmb3IgMzk0NSwgcmVzZXJ2ZWQgKDApIGZvciA0OTY1IGRldmljZXMuCi0gKiBTZXQgZmllbGQgdG8gIjAiIHRvIGFsbG93IDM5NDUgdUNvZGUgdG8gc2VsZWN0IGFudGVubmEgKG5vcm1hbCB1c2FnZSkuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfQU5UX1NFTF9NU0sgY3B1X3RvX2xlMzIoMHhmMDApCi0jZGVmaW5lIFRYX0NNRF9GTEdfQU5UX0FfTVNLIGNwdV90b19sZTMyKDEgPDwgOCkKLSNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQl9NU0sgY3B1X3RvX2xlMzIoMSA8PCA5KQotCi0vKiAxOiB1Q29kZSBvdmVycmlkZXMgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpbiBNQUMgaGVhZGVyLgotICogMDogRHJpdmVyIHByb3ZpZGVzIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaW4gTUFDIGhlYWRlci4KLSAqIFNldCB0aGlzIGZvciBtYW5hZ2VtZW50IGZyYW1lcywgbm9uLVFPUyBkYXRhIGZyYW1lcywgbm9uLXVuaWNhc3QgZnJhbWVzLAotICogYW5kIGFsc28gaW4gVHggY29tbWFuZCBlbWJlZGRlZCBpbiBSRVBMWV9TQ0FOX0NNRCBmb3IgYWN0aXZlIHNjYW5zLiAqLwotI2RlZmluZSBUWF9DTURfRkxHX1NFUV9DVExfTVNLIGNwdV90b19sZTMyKDEgPDwgMTMpCi0KLS8qIDE6IFRoaXMgZnJhbWUgaXMgbm9uLWxhc3QgTVBEVTsgbW9yZSBmcmFnbWVudHMgYXJlIGNvbWluZy4KLSAqIDA6IExhc3QgZnJhZ21lbnQsIG9yIG5vdCB1c2luZyBmcmFnbWVudGF0aW9uLiAqLwotI2RlZmluZSBUWF9DTURfRkxHX01PUkVfRlJBR19NU0sgY3B1X3RvX2xlMzIoMSA8PCAxNCkKLQotLyogMTogdUNvZGUgY2FsY3VsYXRlcyBhbmQgaW5zZXJ0cyBUaW1lc3RhbXAgRnVuY3Rpb24gKFRTRikgaW4gb3V0Z29pbmcgZnJhbWUuCi0gKiAwOiBObyBUU0YgcmVxdWlyZWQgaW4gb3V0Z29pbmcgZnJhbWUuCi0gKiBTZXQgdGhpcyBmb3IgdHJhbnNtaXR0aW5nIGJlYWNvbnMgYW5kIHByb2JlIHJlc3BvbnNlcy4gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19UU0ZfTVNLIGNwdV90b19sZTMyKDEgPDwgMTYpCi0KLS8qIDE6IERyaXZlciBpbnNlcnRlZCAyIGJ5dGVzIHBhZCBhZnRlciB0aGUgTUFDIGhlYWRlciwgZm9yIChyZXF1aXJlZCkgZHdvcmQKLSAqICAgIGFsaWdubWVudCBvZiBmcmFtZSdzIHBheWxvYWQgZGF0YSBmaWVsZC4KLSAqIDA6IE5vIHBhZAotICogU2V0IHRoaXMgZm9yIE1BQyBoZWFkZXJzIHdpdGggMjYgb3IgMzAgYnl0ZXMsIGkuZS4gdGhvc2Ugd2l0aCBRT1Mgb3IgQUREUjQKLSAqIGZpZWxkIChidXQgbm90IGJvdGgpLiAgRHJpdmVyIG11c3QgYWxpZ24gZnJhbWUgZGF0YSAoaS5lLiBkYXRhIGZvbGxvd2luZwotICogTUFDIGhlYWRlcikgdG8gRFdPUkQgYm91bmRhcnkuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfTUhfUEFEX01TSyBjcHVfdG9fbGUzMigxIDw8IDIwKQotCi0vKiBhY2NlbGVyYXRlIGFnZ3JlZ2F0aW9uIHN1cHBvcnQKLSAqIDAgLSBubyBDQ01QIGVuY3J5cHRpb247IDEgLSBDQ01QIGVuY3J5cHRpb24gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyMikKLQotLyogSENDQS1BUCAtIGRpc2FibGUgZHVyYXRpb24gb3ZlcndyaXRpbmcuICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfRFVSX01TSyBjcHVfdG9fbGUzMigxIDw8IDI1KQotCi0KLS8qCi0gKiBUWCBjb21tYW5kIHNlY3VyaXR5IGNvbnRyb2wKLSAqLwotI2RlZmluZSBUWF9DTURfU0VDX1dFUAkJMHgwMQotI2RlZmluZSBUWF9DTURfU0VDX0NDTQkJMHgwMgotI2RlZmluZSBUWF9DTURfU0VDX1RLSVAJCTB4MDMKLSNkZWZpbmUgVFhfQ01EX1NFQ19NU0sJCTB4MDMKLSNkZWZpbmUgVFhfQ01EX1NFQ19TSElGVAk2Ci0jZGVmaW5lIFRYX0NNRF9TRUNfS0VZMTI4CTB4MDgKLQotLyoKLSAqIHNlY3VyaXR5IG92ZXJoZWFkIHNpemVzCi0gKi8KLSNkZWZpbmUgV0VQX0lWX0xFTiA0Ci0jZGVmaW5lIFdFUF9JQ1ZfTEVOIDQKLSNkZWZpbmUgQ0NNUF9NSUNfTEVOIDgKLSNkZWZpbmUgVEtJUF9JQ1ZfTEVOIDQKLQotLyoKLSAqIFJFUExZX1RYID0gMHgxYyAoY29tbWFuZCkKLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV90eF9jbWQgewotCS8qCi0JICogTVBEVSBieXRlIGNvdW50OgotCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAotCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKLQkgKiArIERhdGEgcGF5bG9hZAotCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCi0JICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAotCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCi0JICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCi0JICovCi0JX19sZTE2IGxlbjsKLQotCS8qCi0JICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCi0JICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgotCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKLQotCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCi0KLQl1OCByYXRlOwotCi0JLyogSW5kZXggb2YgcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCi0JdTggc3RhX2lkOwotCXU4IHRpZF90c3BlYzsKLQl1OCBzZWNfY3RsOwotCXU4IGtleVsxNl07Ci0JdW5pb24gewotCQl1OCBieXRlWzhdOwotCQlfX2xlMTYgd29yZFs0XTsKLQkJX19sZTMyIGR3WzJdOwotCX0gdGtpcF9taWM7Ci0JX19sZTMyIG5leHRfZnJhbWVfaW5mbzsKLQl1bmlvbiB7Ci0JCV9fbGUzMiBsaWZlX3RpbWU7Ci0JCV9fbGUzMiBhdHRlbXB0OwotCX0gc3RvcF90aW1lOwotCXU4IHN1cHBfcmF0ZXNbMl07Ci0JdTggcnRzX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTAgKi8KLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTEgKi8KLQl1bmlvbiB7Ci0JCV9fbGUxNiBwbV9mcmFtZV90aW1lb3V0OwotCQlfX2xlMTYgYXR0ZW1wdF9kdXJhdGlvbjsKLQl9IHRpbWVvdXQ7Ci0KLQkvKgotCSAqIER1cmF0aW9uIG9mIEVEQ0EgYnVyc3QgVHggT3Bwb3J0dW5pdHksIGluIDMyLXVzZWMgdW5pdHMuCi0JICogU2V0IHRoaXMgaWYgdHhvcCB0aW1lIGlzIG5vdCBzcGVjaWZpZWQgYnkgSENDQSBwcm90b2NvbCAoZS5nLiBieSBBUCkuCi0JICovCi0JX19sZTE2IGRyaXZlcl90eG9wOwotCi0JLyoKLQkgKiBNQUMgaGVhZGVyIGdvZXMgaGVyZSwgZm9sbG93ZWQgYnkgMiBieXRlcyBwYWRkaW5nIGlmIE1BQyBoZWFkZXIKLQkgKiBsZW5ndGggaXMgMjYgb3IgMzAgYnl0ZXMsIGZvbGxvd2VkIGJ5IHBheWxvYWQgZGF0YQotCSAqLwotCXU4IHBheWxvYWRbMF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyWzBdOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX1RYID0gMHgxYyAocmVzcG9uc2UpCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3AgewotCXU4IGZhaWx1cmVfcnRzOwotCXU4IGZhaWx1cmVfZnJhbWU7Ci0JdTggYnRfa2lsbF9jb3VudDsKLQl1OCByYXRlOwotCV9fbGUzMiB3aXJlbGVzc19tZWRpYV90aW1lOwotCV9fbGUzMiBzdGF0dXM7CQkvKiBUWCBzdGF0dXMgKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIDQ5NjUgdUNvZGUgdXBkYXRlcyB0aGVzZSBUeCBhdHRlbXB0IGNvdW50IHZhbHVlcyBpbiBob3N0IERSQU0uCi0gKiBVc2VkIGZvciBtYW5hZ2luZyBUeCByZXRyaWVzIHdoZW4gZXhwZWN0aW5nIGJsb2NrLWFja3MuCi0gKiBEcml2ZXIgc2hvdWxkIHNldCB0aGVzZSBmaWVsZHMgdG8gMC4KLSAqLwotc3RydWN0IGl3bF9kcmFtX3NjcmF0Y2ggewotCXU4IHRyeV9jbnQ7CQkvKiBUeCBhdHRlbXB0cyAqLwotCXU4IGJ0X2tpbGxfY250OwkJLyogVHggYXR0ZW1wdHMgYmxvY2tlZCBieSBCbHVldG9vdGggZGV2aWNlICovCi0JX19sZTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF90eF9jbWQgewotCS8qCi0JICogTVBEVSBieXRlIGNvdW50OgotCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLAotCSAqICsgOCBieXRlIElWIGZvciBDQ00gb3IgVEtJUCAobm90IHVzZWQgZm9yIFdFUCkKLQkgKiArIERhdGEgcGF5bG9hZAotCSAqICsgOC1ieXRlIE1JQyAobm90IHVzZWQgZm9yIENDTS9XRVApCi0JICogTk9URTogIERvZXMgbm90IGluY2x1ZGUgVHggY29tbWFuZCBieXRlcywgcG9zdC1NQUMgcGFkIGJ5dGVzLAotCSAqICAgICAgICBNSUMgKENDTSkgOCBieXRlcywgSUNWIChXRVAvVEtJUC9DS0lQKSA0IGJ5dGVzLCBDUkMgNCBieXRlcy5pCi0JICogUmFuZ2U6IDE0LTIzNDIgYnl0ZXMuCi0JICovCi0JX19sZTE2IGxlbjsKLQotCS8qCi0JICogTVBEVSBvciBNU0RVIGJ5dGUgY291bnQgZm9yIG5leHQgZnJhbWUuCi0JICogVXNlZCBmb3IgZnJhZ21lbnRhdGlvbiBhbmQgYnVyc3RpbmcsIGJ1dCBub3QgMTFuIGFnZ3JlZ2F0aW9uLgotCSAqIFNhbWUgYXMgImxlbiIsIGJ1dCBmb3IgbmV4dCBmcmFtZS4gIFNldCB0byAwIGlmIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCV9fbGUxNiBuZXh0X2ZyYW1lX2xlbjsKLQotCV9fbGUzMiB0eF9mbGFnczsJLyogVFhfQ01EX0ZMR18qICovCi0KLQkvKiB1Q29kZSBtYXkgbW9kaWZ5IHRoaXMgZmllbGQgb2YgdGhlIFR4IGNvbW1hbmQgKGluIGhvc3QgRFJBTSEpLgotCSAqIERyaXZlciBtdXN0IGFsc28gc2V0IGRyYW1fbHNiX3B0ciBhbmQgZHJhbV9tc2JfcHRyIGluIHRoaXMgY21kLiAqLwotCXN0cnVjdCBpd2xfZHJhbV9zY3JhdGNoIHNjcmF0Y2g7Ci0KLQkvKiBSYXRlIGZvciAqYWxsKiBUeCBhdHRlbXB0cywgaWYgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgaXMgY2xlYXJlZC4gKi8KLQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qICovCi0KLQkvKiBJbmRleCBvZiBkZXN0aW5hdGlvbiBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXU4IHN0YV9pZDsKLQotCS8qIFR5cGUgb2Ygc2VjdXJpdHkgZW5jcnlwdGlvbjogIENDTSBvciBUS0lQICovCi0JdTggc2VjX2N0bDsJCS8qIFRYX0NNRF9TRUNfKiAqLwotCi0JLyoKLQkgKiBJbmRleCBpbnRvIHJhdGUgdGFibGUgKHNlZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKSBmb3IgaW5pdGlhbAotCSAqIFR4IGF0dGVtcHQsIGlmIFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLIGlzIHNldC4gIE5vcm1hbGx5ICIwIiBmb3IKLQkgKiBkYXRhIGZyYW1lcywgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCB0byBzZWxlY3RpdmVseSByZWR1Y2UgaW5pdGlhbAotCSAqIHJhdGUgKHZpYSBub24tMCB2YWx1ZSkgZm9yIHNwZWNpYWwgZnJhbWVzIChlLmcuIG1hbmFnZW1lbnQpLCB3aGlsZQotCSAqIHN0aWxsIHN1cHBvcnRpbmcgcmF0ZSBzY2FsaW5nIGZvciBhbGwgZnJhbWVzLgotCSAqLwotCXU4IGluaXRpYWxfcmF0ZV9pbmRleDsKLQl1OCByZXNlcnZlZDsKLQl1OCBrZXlbMTZdOwotCV9fbGUxNiBuZXh0X2ZyYW1lX2ZsYWdzOwotCV9fbGUxNiByZXNlcnZlZDI7Ci0JdW5pb24gewotCQlfX2xlMzIgbGlmZV90aW1lOwotCQlfX2xlMzIgYXR0ZW1wdDsKLQl9IHN0b3BfdGltZTsKLQotCS8qIEhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgdG8gInNjcmF0Y2giIGluIHRoaXMgY29tbWFuZC4KLQkgKiBNdXN0IGJlIGR3b3JkIGFsaWduZWQuICAiMCIgaW4gZHJhbV9sc2JfcHRyIGRpc2FibGVzIHVzYWdlLiAqLwotCV9fbGUzMiBkcmFtX2xzYl9wdHI7Ci0JdTggZHJhbV9tc2JfcHRyOwotCi0JdTggcnRzX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTAgKi8KLQl1OCBkYXRhX3JldHJ5X2xpbWl0OwkvKmJ5dGUgNTEgKi8KLQl1OCB0aWRfdHNwZWM7Ci0JdW5pb24gewotCQlfX2xlMTYgcG1fZnJhbWVfdGltZW91dDsKLQkJX19sZTE2IGF0dGVtcHRfZHVyYXRpb247Ci0JfSB0aW1lb3V0OwotCi0JLyoKLQkgKiBEdXJhdGlvbiBvZiBFRENBIGJ1cnN0IFR4IE9wcG9ydHVuaXR5LCBpbiAzMi11c2VjIHVuaXRzLgotCSAqIFNldCB0aGlzIGlmIHR4b3AgdGltZSBpcyBub3Qgc3BlY2lmaWVkIGJ5IEhDQ0EgcHJvdG9jb2wgKGUuZy4gYnkgQVApLgotCSAqLwotCV9fbGUxNiBkcml2ZXJfdHhvcDsKLQotCS8qCi0JICogTUFDIGhlYWRlciBnb2VzIGhlcmUsIGZvbGxvd2VkIGJ5IDIgYnl0ZXMgcGFkZGluZyBpZiBNQUMgaGVhZGVyCi0JICogbGVuZ3RoIGlzIDI2IG9yIDMwIGJ5dGVzLCBmb2xsb3dlZCBieSBwYXlsb2FkIGRhdGEKLQkgKi8KLQl1OCBwYXlsb2FkWzBdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyIGhkclswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIFRYIGNvbW1hbmQgcmVzcG9uc2UgaXMgc2VudCBhZnRlciAqMzk0NSogdHJhbnNtaXNzaW9uIGF0dGVtcHRzLgotICoKLSAqIE5PVEVTOgotICoKLSAqIFRYX1NUQVRVU19GQUlMX05FWFRfRlJBRwotICoKLSAqIElmIHRoZSBmcmFnbWVudCBmbGFnIGluIHRoZSBNQUMgaGVhZGVyIGZvciB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKLSAqIGlzIHNldCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IHRpbWUgdG8gdHJhbnNtaXQgdGhlIG5leHQgZnJhbWUsIHRoZQotICogVFggc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCAnVFhfU1RBVFVTX0ZBSUxfTkVYVF9GUkFHJy4KLSAqCi0gKiBUWF9TVEFUVVNfRklGT19VTkRFUlJVTgotICoKLSAqIEluZGljYXRlcyB0aGUgaG9zdCBkaWQgbm90IHByb3ZpZGUgYnl0ZXMgdG8gdGhlIEZJRk8gZmFzdCBlbm91Z2ggd2hpbGUKLSAqIGEgVFggd2FzIGluIHByb2dyZXNzLgotICoKLSAqIFRYX1NUQVRVU19GQUlMX01HTU5UX0FCT1JUCi0gKgotICogVGhpcyBzdGF0dXMgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgQUJPUlQgT04gTUdNVCBSWCBwYXJhbWV0ZXIgd2FzCi0gKiBzZXQgdG8gdHJ1ZSB3aXRoIHRoZSBUWCBjb21tYW5kLgotICoKLSAqIElmIHRoZSBNU0Igb2YgdGhlIHN0YXR1cyBwYXJhbWV0ZXIgaXMgc2V0IHRoZW4gYW4gYWJvcnQgc2VxdWVuY2UgaXMKLSAqIHJlcXVpcmVkLiAgVGhpcyBzZXF1ZW5jZSBjb25zaXN0cyBvZiB0aGUgaG9zdCBhY3RpdmF0aW5nIHRoZSBUWCBBYm9ydAotICogY29udHJvbCBsaW5lLCBhbmQgdGhlbiB3YWl0aW5nIGZvciB0aGUgVFggQWJvcnQgY29tbWFuZCByZXNwb25zZS4gIFRoaXMKLSAqIGluZGljYXRlcyB0aGF0IGEgdGhlIGRldmljZSBpcyBubyBsb25nZXIgaW4gYSB0cmFuc21pdCBzdGF0ZSwgYW5kIHRoYXQgdGhlCi0gKiBjb21tYW5kIEZJRk8gaGFzIGJlZW4gY2xlYXJlZC4gIFRoZSBob3N0IG11c3QgdGhlbiBkZWFjdGl2YXRlIHRoZSBUWCBBYm9ydAotICogY29udHJvbCBsaW5lLiAgUmVjZWl2aW5nIGlzIHN0aWxsIGFsbG93ZWQgaW4gdGhpcyBjYXNlLgotICovCi1lbnVtIHsKLQlUWF8zOTQ1X1NUQVRVU19TVUNDRVNTID0gMHgwMSwKLQlUWF8zOTQ1X1NUQVRVU19ESVJFQ1RfRE9ORSA9IDB4MDIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9TSE9SVF9MSU1JVCA9IDB4ODIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9MT05HX0xJTUlUID0gMHg4MywKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0ZJRk9fVU5ERVJSVU4gPSAweDg0LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTUdNTlRfQUJPUlQgPSAweDg1LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTkVYVF9GUkFHID0gMHg4NiwKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0xJRkVfRVhQSVJFID0gMHg4NywKLQlUWF8zOTQ1X1NUQVRVU19GQUlMX0RFU1RfUFMgPSAweDg4LAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfQUJPUlRFRCA9IDB4ODksCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9CVF9SRVRSWSA9IDB4OGEsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9TVEFfSU5WQUxJRCA9IDB4OGIsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9GUkFHX0RST1BQRUQgPSAweDhjLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfVElEX0RJU0FCTEUgPSAweDhkLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfRlJBTUVfRkxVU0hFRCA9IDB4OGUsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9JTlNVRkZJQ0lFTlRfQ0ZfUE9MTCA9IDB4OGYsCi0JVFhfMzk0NV9TVEFUVVNfRkFJTF9UWF9MT0NLRUQgPSAweDkwLAotCVRYXzM5NDVfU1RBVFVTX0ZBSUxfTk9fQkVBQ09OX09OX1JBREFSID0gMHg5MSwKLX07Ci0KLS8qCi0gKiBUWCBjb21tYW5kIHJlc3BvbnNlIGlzIHNlbnQgYWZ0ZXIgKjQ5NjUqIHRyYW5zbWlzc2lvbiBhdHRlbXB0cy4KLSAqCi0gKiBib3RoIHBvc3Rwb25lIGFuZCBhYm9ydCBzdGF0dXMgYXJlIGV4cGVjdGVkIGJlaGF2aW9yIGZyb20gdUNvZGUuIHRoZXJlIGlzCi0gKiBubyBzcGVjaWFsIG9wZXJhdGlvbiByZXF1aXJlZCBmcm9tIGRyaXZlcjsgZXhjZXB0IGZvciBSRktJTExfRkxVU0gsCi0gKiB3aGljaCByZXF1aXJlZCB0eCBmbHVzaCBob3N0IGNvbW1hbmQgdG8gZmx1c2ggYWxsIHRoZSB0eCBmcmFtZXMgaW4gcXVldWVzCi0gKi8KLWVudW0gewotCVRYX1NUQVRVU19TVUNDRVNTID0gMHgwMSwKLQlUWF9TVEFUVVNfRElSRUNUX0RPTkUgPSAweDAyLAotCS8qIHBvc3Rwb25lIFRYICovCi0JVFhfU1RBVFVTX1BPU1RQT05FX0RFTEFZID0gMHg0MCwKLQlUWF9TVEFUVVNfUE9TVFBPTkVfRkVXX0JZVEVTID0gMHg0MSwKLQlUWF9TVEFUVVNfUE9TVFBPTkVfUVVJRVRfUEVSSU9EID0gMHg0MywKLQlUWF9TVEFUVVNfUE9TVFBPTkVfQ0FMQ19UVEFLID0gMHg0NCwKLQkvKiBhYm9ydCBUWCAqLwotCVRYX1NUQVRVU19GQUlMX0lOVEVSTkFMX0NST1NTRURfUkVUUlkgPSAweDgxLAotCVRYX1NUQVRVU19GQUlMX1NIT1JUX0xJTUlUID0gMHg4MiwKLQlUWF9TVEFUVVNfRkFJTF9MT05HX0xJTUlUID0gMHg4MywKLQlUWF9TVEFUVVNfRkFJTF9GSUZPX1VOREVSUlVOID0gMHg4NCwKLQlUWF9TVEFUVVNfRkFJTF9EUkFJTl9GTE9XID0gMHg4NSwKLQlUWF9TVEFUVVNfRkFJTF9SRktJTExfRkxVU0ggPSAweDg2LAotCVRYX1NUQVRVU19GQUlMX0xJRkVfRVhQSVJFID0gMHg4NywKLQlUWF9TVEFUVVNfRkFJTF9ERVNUX1BTID0gMHg4OCwKLQlUWF9TVEFUVVNfRkFJTF9IT1NUX0FCT1JURUQgPSAweDg5LAotCVRYX1NUQVRVU19GQUlMX0JUX1JFVFJZID0gMHg4YSwKLQlUWF9TVEFUVVNfRkFJTF9TVEFfSU5WQUxJRCA9IDB4OGIsCi0JVFhfU1RBVFVTX0ZBSUxfRlJBR19EUk9QUEVEID0gMHg4YywKLQlUWF9TVEFUVVNfRkFJTF9USURfRElTQUJMRSA9IDB4OGQsCi0JVFhfU1RBVFVTX0ZBSUxfRklGT19GTFVTSEVEID0gMHg4ZSwKLQlUWF9TVEFUVVNfRkFJTF9JTlNVRkZJQ0lFTlRfQ0ZfUE9MTCA9IDB4OGYsCi0JVFhfU1RBVFVTX0ZBSUxfUEFTU0lWRV9OT19SWCA9IDB4OTAsCi0JVFhfU1RBVFVTX0ZBSUxfTk9fQkVBQ09OX09OX1JBREFSID0gMHg5MSwKLX07Ci0KLSNkZWZpbmUJVFhfUEFDS0VUX01PREVfUkVHVUxBUgkJMHgwMDAwCi0jZGVmaW5lCVRYX1BBQ0tFVF9NT0RFX0JVUlNUX1NFUQkweDAxMDAKLSNkZWZpbmUJVFhfUEFDS0VUX01PREVfQlVSU1RfRklSU1QJMHgwMjAwCi0KLWVudW0gewotCVRYX1BPV0VSX1BBX05PVF9BQ1RJVkUgPSAweDAsCi19OwotCi1lbnVtIHsKLQlUWF9TVEFUVVNfTVNLID0gMHgwMDAwMDBmZiwJCS8qIGJpdHMgMDo3ICovCi0JVFhfU1RBVFVTX0RFTEFZX01TSyA9IDB4MDAwMDAwNDAsCi0JVFhfU1RBVFVTX0FCT1JUX01TSyA9IDB4MDAwMDAwODAsCi0JVFhfUEFDS0VUX01PREVfTVNLID0gMHgwMDAwZmYwMCwJLyogYml0cyA4OjE1ICovCi0JVFhfRklGT19OVU1CRVJfTVNLID0gMHgwMDA3MDAwMCwJLyogYml0cyAxNjoxOCAqLwotCVRYX1JFU0VSVkVEID0gMHgwMDc4MDAwMCwJCS8qIGJpdHMgMTk6MjIgKi8KLQlUWF9QT1dFUl9QQV9ERVRFQ1RfTVNLID0gMHg3ZjgwMDAwMCwJLyogYml0cyAyMzozMCAqLwotCVRYX0FCT1JUX1JFUVVJUkVEX01TSyA9IDB4ODAwMDAwMDAsCS8qIGJpdHMgMzE6MzEgKi8KLX07Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRYIGFnZ3JlZ2F0aW9uIHN0YXR1cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotZW51bSB7Ci0JQUdHX1RYX1NUQVRFX1RSQU5TTUlUVEVEID0gMHgwMCwKLQlBR0dfVFhfU1RBVEVfVU5ERVJSVU5fTVNLID0gMHgwMSwKLQlBR0dfVFhfU1RBVEVfRkVXX0JZVEVTX01TSyA9IDB4MDQsCi0JQUdHX1RYX1NUQVRFX0FCT1JUX01TSyA9IDB4MDgsCi0JQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLID0gMHgxMCwKLQlBR0dfVFhfU1RBVEVfTEFTVF9TRU5UX1RSWV9DTlRfTVNLID0gMHgyMCwKLQlBR0dfVFhfU1RBVEVfU0NEX1FVRVJZX01TSyA9IDB4ODAsCi0JQUdHX1RYX1NUQVRFX1RFU1RfQkFEX0NSQzMyX01TSyA9IDB4MTAwLAotCUFHR19UWF9TVEFURV9SRVNQT05TRV9NU0sgPSAweDFmZiwKLQlBR0dfVFhfU1RBVEVfRFVNUF9UWF9NU0sgPSAweDIwMCwKLQlBR0dfVFhfU1RBVEVfREVMQVlfVFhfTVNLID0gMHg0MDAKLX07Ci0KLSNkZWZpbmUgQUdHX1RYX1NUQVRVU19NU0sJMHgwMDAwMGZmZgkvKiBiaXRzIDA6MTEgKi8KLSNkZWZpbmUgQUdHX1RYX1RSWV9NU0sJCTB4MDAwMGYwMDAJLyogYml0cyAxMjoxNSAqLwotCi0jZGVmaW5lIEFHR19UWF9TVEFURV9MQVNUX1NFTlRfTVNLICAoQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UVExfTVNLIHwgXAotCQkJCSAgICAgQUdHX1RYX1NUQVRFX0xBU1RfU0VOVF9UUllfQ05UX01TSykKLQotLyogIyB0eCBhdHRlbXB0cyBmb3IgZmlyc3QgZnJhbWUgaW4gYWdncmVnYXRpb24gKi8KLSNkZWZpbmUgQUdHX1RYX1NUQVRFX1RSWV9DTlRfUE9TIDEyCi0jZGVmaW5lIEFHR19UWF9TVEFURV9UUllfQ05UX01TSyAweGYwMDAKLQotLyogQ29tbWFuZCBJRCBhbmQgc2VxdWVuY2UgbnVtYmVyIG9mIFR4IGNvbW1hbmQgZm9yIHRoaXMgZnJhbWUgKi8KLSNkZWZpbmUgQUdHX1RYX1NUQVRFX1NFUV9OVU1fUE9TIDE2Ci0jZGVmaW5lIEFHR19UWF9TVEFURV9TRVFfTlVNX01TSyAweGZmZmYwMDAwCi0KLS8qCi0gKiBSRVBMWV9UWCA9IDB4MWMgKHJlc3BvbnNlKQotICoKLSAqIFRoaXMgcmVzcG9uc2UgbWF5IGJlIGluIG9uZSBvZiB0d28gc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdHMsIGluZGljYXRlZAotICogYnkgdGhlIGZyYW1lX2NvdW50IGZpZWxkOgotICoKLSAqIDEpICBObyBhZ2dyZWdhdGlvbiAoZnJhbWVfY291bnQgPT0gMSkuICBUaGlzIHJlcG9ydHMgVHggcmVzdWx0cyBmb3IKLSAqICAgICBhIHNpbmdsZSBmcmFtZS4gIE11bHRpcGxlIGF0dGVtcHRzLCBhdCB2YXJpb3VzIGJpdCByYXRlcywgbWF5IGhhdmUKLSAqICAgICBiZWVuIG1hZGUgZm9yIHRoaXMgZnJhbWUuCi0gKgotICogMikgIEFnZ3JlZ2F0aW9uIChmcmFtZV9jb3VudCA+IDEpLiAgVGhpcyByZXBvcnRzIFR4IHJlc3VsdHMgZm9yCi0gKiAgICAgMiBvciBtb3JlIGZyYW1lcyB0aGF0IHVzZWQgYmxvY2stYWNrbm93bGVkZ2UuICBBbGwgZnJhbWVzIHdlcmUKLSAqICAgICB0cmFuc21pdHRlZCBhdCBzYW1lIHJhdGUuICBSYXRlIHNjYWxpbmcgbWF5IGhhdmUgYmVlbiB1c2VkIGlmIGZpcnN0Ci0gKiAgICAgZnJhbWUgaW4gdGhpcyBuZXcgYWdnIGJsb2NrIGZhaWxlZCBpbiBwcmV2aW91cyBhZ2cgYmxvY2socykuCi0gKgotICogICAgIE5vdGUgdGhhdCwgZm9yIGFnZ3JlZ2F0aW9uLCBBQ0sgKGJsb2NrLWFjaykgc3RhdHVzIGlzIG5vdCBkZWxpdmVyZWQgaGVyZTsKLSAqICAgICBibG9jay1hY2sgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGJ5IHRoZSB0aW1lIHRoZSA0OTY1IGRldmljZSByZWNvcmRzCi0gKiAgICAgdGhpcyBzdGF0dXMuCi0gKiAgICAgVGhpcyBzdGF0dXMgcmVsYXRlcyB0byByZWFzb25zIHRoZSB0eCBtaWdodCBoYXZlIGJlZW4gYmxvY2tlZCBvciBhYm9ydGVkCi0gKiAgICAgd2l0aGluIHRoZSBzZW5kaW5nIHN0YXRpb24gKHRoaXMgNDk2NSBkZXZpY2UpLCByYXRoZXIgdGhhbiB3aGV0aGVyIGl0IHdhcwotICogICAgIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBieSB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4KLSAqLwotc3RydWN0IGFnZ190eF9zdGF0dXMgewotCV9fbGUxNiBzdGF0dXM7Ci0JX19sZTE2IHNlcXVlbmNlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bDQ5NjVfdHhfcmVzcCB7Ci0JdTggZnJhbWVfY291bnQ7CQkvKiAxIG5vIGFnZ3JlZ2F0aW9uLCA+MSBhZ2dyZWdhdGlvbiAqLwotCXU4IGJ0X2tpbGxfY291bnQ7CS8qICMgYmxvY2tlZCBieSBibHVldG9vdGggKHVudXNlZCBmb3IgYWdnKSAqLwotCXU4IGZhaWx1cmVfcnRzOwkJLyogIyBmYWlsdXJlcyBkdWUgdG8gdW5zdWNjZXNzZnVsIFJUUyAqLwotCXU4IGZhaWx1cmVfZnJhbWU7CS8qICMgZmFpbHVyZXMgZHVlIHRvIG5vIEFDSyAodW51c2VkIGZvciBhZ2cpICovCi0KLQkvKiBGb3Igbm9uLWFnZzogIFJhdGUgYXQgd2hpY2ggZnJhbWUgd2FzIHN1Y2Nlc3NmdWwuCi0JICogRm9yIGFnZzogIFJhdGUgYXQgd2hpY2ggYWxsIGZyYW1lcyB3ZXJlIHRyYW5zbWl0dGVkLiAqLwotCV9fbGUzMiByYXRlX25fZmxhZ3M7CS8qIFJBVEVfTUNTXyogICovCi0KLQkvKiBGb3Igbm9uLWFnZzogIFJUUyArIENUUyArIGZyYW1lIHR4IGF0dGVtcHRzIHRpbWUgKyBBQ0suCi0JICogRm9yIGFnZzogIFJUUyArIENUUyArIGFnZ3JlZ2F0aW9uIHR4IHRpbWUgKyBibG9jay1hY2sgdGltZS4gKi8KLQlfX2xlMTYgd2lyZWxlc3NfbWVkaWFfdGltZTsJLyogdVNlY3MgKi8KLQotCV9fbGUxNiByZXNlcnZlZDsKLQlfX2xlMzIgcGFfcG93ZXIxOwkvKiBSRiBwb3dlciBhbXBsaWZpZXIgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKSAqLwotCV9fbGUzMiBwYV9wb3dlcjI7Ci0KLQkvKgotCSAqIEZvciBub24tYWdnOiAgZnJhbWUgc3RhdHVzIFRYX1NUQVRVU18qCi0JICogRm9yIGFnZzogIHN0YXR1cyBvZiAxc3QgZnJhbWUsIEFHR19UWF9TVEFURV8qOyBvdGhlciBmcmFtZSBzdGF0dXMKLQkgKiAgICAgICAgICAgZmllbGRzIGZvbGxvdyB0aGlzIG9uZSwgdXAgdG8gZnJhbWVfY291bnQuCi0JICogICAgICAgICAgIEJpdCBmaWVsZHM6Ci0JICogICAgICAgICAgIDExLSAwOiAgQUdHX1RYX1NUQVRFXyogc3RhdHVzIGNvZGUKLQkgKiAgICAgICAgICAgMTUtMTI6ICBSZXRyeSBjb3VudCBmb3IgMXN0IGZyYW1lIGluIGFnZ3JlZ2F0aW9uIChyZXRyaWVzCi0JICogICAgICAgICAgICAgICAgICAgb2NjdXIgaWYgdHggZmFpbGVkIGZvciB0aGlzIGZyYW1lIHdoZW4gaXQgd2FzIGEKLQkgKiAgICAgICAgICAgICAgICAgICBtZW1iZXIgb2YgYSBwcmV2aW91cyBhZ2dyZWdhdGlvbiBibG9jaykuICBJZiByYXRlCi0JICogICAgICAgICAgICAgICAgICAgc2NhbGluZyBpcyB1c2VkLCByZXRyeSBjb3VudCBpbmRpY2F0ZXMgdGhlIHJhdGUKLQkgKiAgICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSB1c2VkIGZvciBhbGwgZnJhbWVzIGluIHRoZSBuZXcgYWdnLgotCSAqICAgICAgICAgICAzMS0xNjogIFNlcXVlbmNlICMgZm9yIHRoaXMgZnJhbWUncyBUeCBjbWQgKG5vdCBTU04hKQotCSAqLwotCXVuaW9uIHsKLQkJX19sZTMyIHN0YXR1czsKLQkJc3RydWN0IGFnZ190eF9zdGF0dXMgYWdnX3N0YXR1c1swXTsgLyogZm9yIGVhY2ggYWdnIGZyYW1lICovCi0JfSB1OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEgPSAweGM1IChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQotICoKLSAqIFJlcG9ydHMgQmxvY2stQWNrbm93bGVkZ2UgZnJvbSByZWNpcGllbnQgc3RhdGlvbgotICovCi1zdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCB7Ci0JX19sZTMyIHN0YV9hZGRyX2xvMzI7Ci0JX19sZTE2IHN0YV9hZGRyX2hpMTY7Ci0JX19sZTE2IHJlc2VydmVkOwotCi0JLyogSW5kZXggb2YgcmVjaXBpZW50IChCQS1zZW5kaW5nKSBzdGF0aW9uIGluIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXU4IHN0YV9pZDsKLQl1OCB0aWQ7Ci0JX19sZTE2IHNlcV9jdGw7Ci0JX19sZTY0IGJpdG1hcDsKLQlfX2xlMTYgc2NkX2Zsb3c7Ci0JX19sZTE2IHNjZF9zc247Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCA9IDB4OTcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBTZWUgZGV0YWlscyB1bmRlciAiVFhQT1dFUiIgaW4gaXdsLTQ5NjUtaHcuaC4KLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV90eHBvd2VydGFibGVfY21kIHsKLQl1OCBiYW5kOwkJLyogMDogNSBHSHosIDE6IDIuNCBHSHogKi8KLQl1OCByZXNlcnZlZDsKLQlfX2xlMTYgY2hhbm5lbDsKLQlzdHJ1Y3QgaXdsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJV0xfTUFYX1JBVEVTXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2w0OTY1X3R4cG93ZXJ0YWJsZV9jbWQgewotCXU4IGJhbmQ7CQkvKiAwOiA1IEdIeiwgMTogMi40IEdIeiAqLwotCXU4IHJlc2VydmVkOwotCV9fbGUxNiBjaGFubmVsOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwotfSBfX3BhY2tlZDsKLQotCi0vKioKLSAqIHN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGluZ19jbWQgLSBSYXRlIFNjYWxpbmcgQ29tbWFuZCAmIFJlc3BvbnNlCi0gKgotICogUkVQTFlfUkFURV9TQ0FMRSA9IDB4NDcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBOT1RFOiBUaGUgdGFibGUgb2YgcmF0ZXMgcGFzc2VkIHRvIHRoZSB1Q29kZSB2aWEgdGhlCi0gKiBSQVRFX1NDQUxFIGNvbW1hbmQgc2V0cyB1cCB0aGUgY29ycmVzcG9uZGluZyBvcmRlciBvZgotICogcmF0ZXMgdXNlZCBmb3IgYWxsIHJlbGF0ZWQgY29tbWFuZHMsIGluY2x1ZGluZyByYXRlCi0gKiBtYXNrcywgZXRjLgotICoKLSAqIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IDlNQiAoUExDUCAweDBmKSBhcyB0aGUgZmlyc3QKLSAqIHJhdGUgaW4gdGhlIHJhdGUgdGFibGUsIHRoZSBiaXQgbWFzayBmb3IgdGhhdCByYXRlCi0gKiB3aGVuIHBhc3NlZCB0aHJvdWdoIG9mZG1fYmFzaWNfcmF0ZXMgb24gdGhlIFJFUExZX1JYT04KLSAqIGNvbW1hbmQgd291bGQgYmUgYml0IDAgKDEgPDwgMCkKLSAqLwotc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gewotCV9fbGUxNiByYXRlX25fZmxhZ3M7Ci0JdTggdHJ5X2NudDsKLQl1OCBuZXh0X3JhdGVfaW5kZXg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfY21kIHsKLQl1OCB0YWJsZV9pZDsKLQl1OCByZXNlcnZlZFszXTsKLQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyB0YWJsZVtJV0xfTUFYX1JBVEVTXTsKLX0gX19wYWNrZWQ7Ci0KLQotLypSU19ORVdfQVBJOiBvbmx5IFRMQ19SVFMgcmVtYWlucyBhbmQgbW92ZWQgdG8gYml0IDAgKi8KLSNkZWZpbmUgIExJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLCSgxIDw8IDApCi0KLS8qICMgb2YgRURDQSBwcmlvcml0aXplZCB0eCBmaWZvcyAqLwotI2RlZmluZSAgTElOS19RVUFMX0FDX05VTSBBQ19OVU0KLQotLyogIyBlbnRyaWVzIGluIHJhdGUgc2NhbGUgdGFibGUgdG8gc3VwcG9ydCBUeCByZXRyaWVzICovCi0jZGVmaW5lICBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSAxNgotCi0vKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiB2YWx1ZXMgKi8KLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfQV9NU0sgKDEgPDwgMCkKLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfQl9NU0sgKDEgPDwgMSkKLSNkZWZpbmUgIExJTktfUVVBTF9BTlRfTVNLICAgKExJTktfUVVBTF9BTlRfQV9NU0t8TElOS19RVUFMX0FOVF9CX01TSykKLQotCi0vKioKLSAqIHN0cnVjdCBpd2xfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zCi0gKgotICogVXNlZCBpbiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01ECi0gKi8KLXN0cnVjdCBpd2xfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zIHsKLQl1OCBmbGFnczsKLQotCS8qIE5vIGVudHJpZXMgYXQgb3IgYWJvdmUgdGhpcyAoZHJpdmVyIGNob3NlbikgaW5kZXggY29udGFpbiBNSU1PICovCi0JdTggbWltb19kZWxpbWl0ZXI7Ci0KLQkvKiBCZXN0IHNpbmdsZSBhbnRlbm5hIHRvIHVzZSBmb3Igc2luZ2xlIHN0cmVhbSAobGVnYWN5LCBTSVNPKS4gKi8KLQl1OCBzaW5nbGVfc3RyZWFtX2FudF9tc2s7CS8qIExJTktfUVVBTF9BTlRfKiAqLwotCi0JLyogQmVzdCBhbnRlbm5hcyB0byB1c2UgZm9yIE1JTU8gKHVudXNlZCBmb3IgNDk2NSwgYXNzdW1lcyBib3RoKS4gKi8KLQl1OCBkdWFsX3N0cmVhbV9hbnRfbXNrOwkJLyogTElOS19RVUFMX0FOVF8qICovCi0KLQkvKgotCSAqIElmIGRyaXZlciBuZWVkcyB0byB1c2UgZGlmZmVyZW50IGluaXRpYWwgcmF0ZXMgZm9yIGRpZmZlcmVudAotCSAqIEVEQ0EgUU9TIGFjY2VzcyBjYXRlZ29yaWVzIChhcyBpbXBsZW1lbnRlZCBieSB0eCBmaWZvcyAwLTMpLAotCSAqIHRoaXMgdGFibGUgd2lsbCBzZXQgdGhhdCB1cCwgYnkgaW5kaWNhdGluZyB0aGUgaW5kZXhlcyBpbiB0aGUKLQkgKiByc190YWJsZVtMSU5LX1FVQUxfTUFYX1JFVFJZX05VTV0gcmF0ZSB0YWJsZSBhdCB3aGljaCB0byBzdGFydC4KLQkgKiBPdGhlcndpc2UsIGRyaXZlciBzaG91bGQgc2V0IGFsbCBlbnRyaWVzIHRvIDAuCi0JICoKLQkgKiBFbnRyeSB1c2FnZToKLQkgKiAwID0gQmFja2dyb3VuZCwgMSA9IEJlc3QgRWZmb3J0IChub3JtYWwpLCAyID0gVmlkZW8sIDMgPSBWb2ljZQotCSAqIFRYIEZJRk9zIGFib3ZlIDMgdXNlIHNhbWUgdmFsdWUgKHR5cGljYWxseSAwKSBhcyBUWCBGSUZPIDMuCi0JICovCi0JdTggc3RhcnRfcmF0ZV9pbmRleFtMSU5LX1FVQUxfQUNfTlVNXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX0RFRgkoNDAwMCkgLyogNCBtaWxsaXNlY29uZHMgKi8KLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01BWAkoODAwMCkKLSNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX01JTgkoMTAwKQotCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUYJKDMpCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9NQVgJKDI1NSkKLSNkZWZpbmUgTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX01JTgkoMCkKLQotI2RlZmluZSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRgkoMzEpCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfTUFYCSg2MykKLSNkZWZpbmUgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9NSU4JKDApCi0KLS8qKgotICogc3RydWN0IGl3bF9saW5rX3F1YWxfYWdnX3BhcmFtcwotICoKLSAqIFVzZWQgaW4gUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRAotICovCi1zdHJ1Y3QgaXdsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zIHsKLQotCS8qCi0JICpNYXhpbXVtIG51bWJlciBvZiB1U2VjIGluIGFnZ3JlZ2F0aW9uLgotCSAqIGRlZmF1bHQgc2V0IHRvIDQwMDAgKDQgbWlsbGlzZWNvbmRzKSBpZiBub3QgY29uZmlndXJlZCBpbiAuY2ZnCi0JICovCi0JX19sZTE2IGFnZ190aW1lX2xpbWl0OwotCi0JLyoKLQkgKiBOdW1iZXIgb2YgVHggcmV0cmllcyBhbGxvd2VkIGZvciBhIGZyYW1lLCBiZWZvcmUgdGhhdCBmcmFtZSB3aWxsCi0JICogbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgZm9yIHRoZSBzdGFydCBvZiBhbiBhZ2dyZWdhdGlvbiBzZXF1ZW5jZQotCSAqIChzY2hlZHVsZXIgd2lsbCB0aGVuIHRyeSB0byB0eCBpdCBhcyBzaW5nbGUgZnJhbWUpLgotCSAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgdG8gMy4KLQkgKi8KLQl1OCBhZ2dfZGlzX3N0YXJ0X3RoOwotCi0JLyoKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgaW4gYWdncmVnYXRpb24uCi0JICogMCA9IG5vIGxpbWl0IChkZWZhdWx0KS4gIDEgPSBubyBhZ2dyZWdhdGlvbi4KLQkgKiBPdGhlciB2YWx1ZXMgPSBtYXggIyBmcmFtZXMgaW4gYWdncmVnYXRpb24uCi0JICovCi0JdTggYWdnX2ZyYW1lX2NudF9saW1pdDsKLQotCV9fbGUzMiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIEZvciA0OTY1IGRldmljZXMgb25seTsgMzk0NSB1c2VzIFJFUExZX1JBVEVfU0NBTEUuCi0gKgotICogRWFjaCBzdGF0aW9uIGluIHRoZSA0OTY1IGRldmljZSdzIGludGVybmFsIHN0YXRpb24gdGFibGUgaGFzIGl0cyBvd24gdGFibGUKLSAqIG9mIDE2Ci0gKiBUeCByYXRlcyBhbmQgbW9kdWxhdGlvbiBtb2RlcyAoZS5nLiBsZWdhY3kvU0lTTy9NSU1PKSBmb3IgcmV0cnlpbmcgVHggd2hlbgotICogYW4gQUNLIGlzIG5vdCByZWNlaXZlZC4gIFRoaXMgY29tbWFuZCByZXBsYWNlcyB0aGUgZW50aXJlIHRhYmxlIGZvcgotICogb25lIHN0YXRpb24uCi0gKgotICogTk9URTogIFN0YXRpb24gbXVzdCBhbHJlYWR5IGJlIGluIDQ5NjUgZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZS4KLSAqCSAgVXNlIFJFUExZX0FERF9TVEEuCi0gKgotICogVGhlIHJhdGUgc2NhbGluZyBwcm9jZWR1cmVzIGRlc2NyaWJlZCBiZWxvdyB3b3JrIHdlbGwuICBPZiBjb3Vyc2UsIG90aGVyCi0gKiBwcm9jZWR1cmVzIGFyZSBwb3NzaWJsZSwgYW5kIG1heSB3b3JrIGJldHRlciBmb3IgcGFydGljdWxhciBlbnZpcm9ubWVudHMuCi0gKgotICoKLSAqIEZJTExJTkcgVEhFIFJBVEUgVEFCTEUKLSAqCi0gKiBHaXZlbiBhIHBhcnRpY3VsYXIgaW5pdGlhbCByYXRlIGFuZCBtb2RlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSByYXRlCi0gKiBzY2FsaW5nIGFsZ29yaXRobSBkZXNjcmliZWQgYmVsb3csIHRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nCi0gKiBmb3JtdWxhIHRvIGZpbGwgdGhlIHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXSByYXRlIHRhYmxlIGluIHRoZQotICogTGluayBRdWFsaXR5IGNvbW1hbmQ6Ci0gKgotICoKLSAqIDEpICBJZiB1c2luZyBIaWdoLXRocm91Z2hwdXQgKEhUKSAoU0lTTyBvciBNSU1PKSBpbml0aWFsIHJhdGU6Ci0gKiAgICAgYSkgVXNlIHRoaXMgc2FtZSBpbml0aWFsIHJhdGUgZm9yIGZpcnN0IDMgZW50cmllcy4KLSAqICAgICBiKSBGaW5kIG5leHQgbG93ZXIgYXZhaWxhYmxlIHJhdGUgdXNpbmcgc2FtZSBtb2RlIChTSVNPIG9yIE1JTU8pLAotICogICAgICAgIHVzZSBmb3IgbmV4dCAzIGVudHJpZXMuICBJZiBubyBsb3dlciByYXRlIGF2YWlsYWJsZSwgc3dpdGNoIHRvCi0gKiAgICAgICAgbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwgbm8gTUlNTywgbm8gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLgotICogICAgIGMpIElmIHVzaW5nIE1JTU8sIHNldCBjb21tYW5kJ3MgbWltb19kZWxpbWl0ZXIgdG8gbnVtYmVyIG9mIGVudHJpZXMKLSAqICAgICAgICB1c2luZyBNSU1PICgzIG9yIDYpLgotICogICAgIGQpIEFmdGVyIHRyeWluZyAyIEhUIHJhdGVzLCBzd2l0Y2ggdG8gbGVnYWN5IG1vZGUgKG5vIEhUNDAgY2hhbm5lbCwKLSAqICAgICAgICBubyBNSU1PLCBubyBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGF0IHRoZSBuZXh0IGxvd2VyIGJpdCByYXRlCi0gKiAgICAgICAgKGUuZy4gaWYgc2Vjb25kIEhUIGJpdCByYXRlIHdhcyA1NCwgdHJ5IDQ4IGxlZ2FjeSksIGFuZCBmb2xsb3cKLSAqICAgICAgICBsZWdhY3kgcHJvY2VkdXJlIGZvciByZW1haW5pbmcgdGFibGUgZW50cmllcy4KLSAqCi0gKiAyKSAgSWYgdXNpbmcgbGVnYWN5IGluaXRpYWwgcmF0ZToKLSAqICAgICBhKSBVc2UgdGhlIGluaXRpYWwgcmF0ZSBmb3Igb25seSBvbmUgZW50cnkuCi0gKiAgICAgYikgRm9yIGVhY2ggZm9sbG93aW5nIGVudHJ5LCByZWR1Y2UgdGhlIHJhdGUgdG8gbmV4dCBsb3dlciBhdmFpbGFibGUKLSAqICAgICAgICByYXRlLCB1bnRpbCByZWFjaGluZyB0aGUgbG93ZXN0IGF2YWlsYWJsZSByYXRlLgotICogICAgIGMpIFdoZW4gcmVkdWNpbmcgcmF0ZSwgYWxzbyBzd2l0Y2ggYW50ZW5uYSBzZWxlY3Rpb24uCi0gKiAgICAgZCkgT25jZSBsb3dlc3QgYXZhaWxhYmxlIHJhdGUgaXMgcmVhY2hlZCwgcmVwZWF0IHRoaXMgcmF0ZSB1bnRpbAotICogICAgICAgIHJhdGUgdGFibGUgaXMgZmlsbGVkICgxNiBlbnRyaWVzKSwgc3dpdGNoaW5nIGFudGVubmEgZWFjaCBlbnRyeS4KLSAqCi0gKgotICogQUNDVU1VTEFUSU5HIEhJU1RPUlkKLSAqCi0gKiBUaGUgcmF0ZSBzY2FsaW5nIGFsZ29yaXRobSBmb3IgNDk2NSBkZXZpY2VzLCBhcyBpbXBsZW1lbnRlZCBpbiBMaW51eCBkcml2ZXIsCi0gKiB1c2VzIHR3byBzZXRzIG9mIGZyYW1lIFR4IHN1Y2Nlc3MgaGlzdG9yeTogIE9uZSBmb3IgdGhlIGN1cnJlbnQvYWN0aXZlCi0gKiBtb2R1bGF0aW9uIG1vZGUsIGFuZCBvbmUgZm9yIGEgc3BlY3VsYXRpdmUvc2VhcmNoIG1vZGUgdGhhdCBpcyBiZWluZwotICogYXR0ZW1wdGVkLiBJZiB0aGUgc3BlY3VsYXRpdmUgbW9kZSB0dXJucyBvdXQgdG8gYmUgbW9yZSBlZmZlY3RpdmUgKGkuZS4KLSAqIGFjdHVhbCB0cmFuc2ZlciByYXRlIGlzIGJldHRlciksIHRoZW4gdGhlIGRyaXZlciBjb250aW51ZXMgdG8gdXNlIHRoZQotICogc3BlY3VsYXRpdmUgbW9kZSBhcyB0aGUgbmV3IGN1cnJlbnQgYWN0aXZlIG1vZGUuCi0gKgotICogRWFjaCBoaXN0b3J5IHNldCBjb250YWlucywgc2VwYXJhdGVseSBmb3IgZWFjaCBwb3NzaWJsZSByYXRlLCBkYXRhIGZvciBhCi0gKiBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgNjIgbW9zdCByZWNlbnQgdHggYXR0ZW1wdHMgYXQgdGhhdCByYXRlLiAgVGhlIGRhdGEKLSAqIGluY2x1ZGVzIGEgc2hpZnRpbmcgYml0bWFwIG9mIHN1Y2Nlc3MoMSkvZmFpbHVyZSgwKSwgYW5kIHN1bXMgb2Ygc3VjY2Vzc2Z1bAotICogYW5kIGF0dGVtcHRlZCBmcmFtZXMsIGZyb20gd2hpY2ggdGhlIGRyaXZlciBjYW4gYWRkaXRpb25hbGx5IGNhbGN1bGF0ZSBhCi0gKiBzdWNjZXNzIHJhdGlvIChzdWNjZXNzIC8gYXR0ZW1wdGVkKSBhbmQgbnVtYmVyIG9mIGZhaWx1cmVzCi0gKiAoYXR0ZW1wdGVkIC0gc3VjY2VzcyksIGFuZCBjb250cm9sIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgKGF0dGVtcHRlZCkuCi0gKiBUaGUgZHJpdmVyIHVzZXMgdGhlIGJpdCBtYXAgdG8gcmVtb3ZlIHN1Y2Nlc3NlcyBmcm9tIHRoZSBzdWNjZXNzIHN1bSwgYXMKLSAqIHRoZSBvbGRlc3QgdHggYXR0ZW1wdHMgZmFsbCBvdXQgb2YgdGhlIHdpbmRvdy4KLSAqCi0gKiBXaGVuIHRoZSA0OTY1IGRldmljZSBtYWtlcyBtdWx0aXBsZSB0eCBhdHRlbXB0cyBmb3IgYSBnaXZlbiBmcmFtZSwgZWFjaAotICogYXR0ZW1wdCBtaWdodCBiZSBhdCBhIGRpZmZlcmVudCByYXRlLCBhbmQgaGF2ZSBkaWZmZXJlbnQgbW9kdWxhdGlvbgotICogY2hhcmFjdGVyaXN0aWNzIChlLmcuIGFudGVubmEsIGZhdCBjaGFubmVsLCBzaG9ydCBndWFyZCBpbnRlcnZhbCksIGFzIHNldAotICogdXAgaW4gdGhlIHJhdGUgc2NhbGluZyB0YWJsZSBpbiB0aGUgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGUgZHJpdmVyIG11c3QKLSAqIGRldGVybWluZSB3aGljaCByYXRlIHRhYmxlIGVudHJ5IHdhcyB1c2VkIGZvciBlYWNoIHR4IGF0dGVtcHQsIHRvIGRldGVybWluZQotICogd2hpY2ggcmF0ZS1zcGVjaWZpYyBoaXN0b3J5IHRvIHVwZGF0ZSwgYW5kIHJlY29yZCBvbmx5IHRob3NlIGF0dGVtcHRzIHRoYXQKLSAqIG1hdGNoIHRoZSBtb2R1bGF0aW9uIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaGlzdG9yeSBzZXQuCi0gKgotICogV2hlbiB1c2luZyBibG9jay1hY2sgKGFnZ3JlZ2F0aW9uKSwgYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUKLSAqIHJhdGUsIHNpbmNlIHRoZXJlIGlzIG5vIHBlci1hdHRlbXB0IGFja25vd2xlZGdtZW50IGZyb20gdGhlIGRlc3RpbmF0aW9uCi0gKiBzdGF0aW9uLiAgVGhlIFR4IHJlc3BvbnNlIHN0cnVjdCBpd2xfdHhfcmVzcCBpbmRpY2F0ZXMgdGhlIFR4IHJhdGUgaW4KLSAqIHJhdGVfbl9mbGFncyBmaWVsZC4gIEFmdGVyIHJlY2VpdmluZyBhIGJsb2NrLWFjaywgdGhlIGRyaXZlciBjYW4gdXBkYXRlCi0gKiBoaXN0b3J5IGZvciB0aGUgZW50aXJlIGJsb2NrIGFsbCBhdCBvbmNlLgotICoKLSAqCi0gKiBGSU5ESU5HIEJFU1QgU1RBUlRJTkcgUkFURToKLSAqCi0gKiBXaGVuIHdvcmtpbmcgd2l0aCBhIHNlbGVjdGVkIGluaXRpYWwgbW9kdWxhdGlvbiBtb2RlIChzZWUgYmVsb3cpLCB0aGUKLSAqIGRyaXZlciBhdHRlbXB0cyB0byBmaW5kIGEgYmVzdCBpbml0aWFsIHJhdGUuICBUaGUgaW5pdGlhbCByYXRlIGlzIHRoZQotICogZmlyc3QgZW50cnkgaW4gdGhlIExpbmsgUXVhbGl0eSBjb21tYW5kJ3MgcmF0ZSB0YWJsZS4KLSAqCi0gKiAxKSAgQ2FsY3VsYXRlIGFjdHVhbCB0aHJvdWdocHV0IChzdWNjZXNzIHJhdGlvICogZXhwZWN0ZWQgdGhyb3VnaHB1dCwgc2VlCi0gKiAgICAgdGFibGUgYmVsb3cpIGZvciBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIERvIHRoaXMgb25seSBpZiBlbm91Z2ggZnJhbWVzCi0gKiAgICAgaGF2ZSBiZWVuIGF0dGVtcHRlZCB0byBtYWtlIHRoZSB2YWx1ZSBtZWFuaW5nZnVsOiAgYXQgbGVhc3QgNiBmYWlsZWQKLSAqICAgICB0eCBhdHRlbXB0cywgb3IgYXQgbGVhc3QgOCBzdWNjZXNzZXMuICBJZiBub3QgZW5vdWdoLCBkb24ndCB0cnkgcmF0ZQotICogICAgIHNjYWxpbmcgeWV0LgotICoKLSAqIDIpICBGaW5kIGF2YWlsYWJsZSByYXRlcyBhZGphY2VudCB0byBjdXJyZW50IGluaXRpYWwgcmF0ZS4gIEF2YWlsYWJsZSBtZWFuczoKLSAqICAgICBhKSAgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlICYmCi0gKiAgICAgYikgIHN1cHBvcnRlZCBieSBhc3NvY2lhdGlvbiAmJgotICogICAgIGMpICB3aXRoaW4gYW55IGNvbnN0cmFpbnRzIHNlbGVjdGVkIGJ5IHVzZXIKLSAqCi0gKiAzKSAgR2F0aGVyIG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBhZGphY2VudCByYXRlcy4gIFRoZXNlIG1pZ2h0IG5vdCBoYXZlCi0gKiAgICAgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGEgdGhyb3VnaHB1dC4gIFRoYXQncyBva2F5LCB3ZSBtaWdodCB0cnkKLSAqICAgICB1c2luZyBvbmUgb2YgdGhlbSBhbnl3YXkhCi0gKgotICogNCkgIFRyeSBkZWNyZWFzaW5nIHJhdGUgaWYsIGZvciBjdXJyZW50IHJhdGU6Ci0gKiAgICAgYSkgIHN1Y2Nlc3MgcmF0aW8gaXMgPCAxNSUgfHwKLSAqICAgICBiKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKLSAqICAgICBjKSAgaGlnaGVyIGFkamFjZW50IHJhdGUgaGFzIHdvcnNlIHRocm91Z2hwdXQsIGFuZCBsb3dlciBpcyB1bm1lYXN1cmVkCi0gKgotICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBkZWNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQotICogICAgIHVuY2hhbmdlZCBpZjoKLSAqICAgICBhKSAgbG93ZXIgcmF0ZSB1bmF2YWlsYWJsZQotICogICAgIGIpICBzdWNjZXNzIHJhdGlvIGF0IGN1cnJlbnQgcmF0ZSA+IDg1JSAodmVyeSBnb29kKQotICogICAgIGMpICBjdXJyZW50IG1lYXN1cmVkIHRocm91Z2hwdXQgaXMgYmV0dGVyIHRoYW4gZXhwZWN0ZWQgdGhyb3VnaHB1dAotICogICAgICAgICBvZiBsb3dlciByYXRlICh1bmRlciBwZXJmZWN0IDEwMCUgdHggY29uZGl0aW9ucywgc2VlIHRhYmxlIGJlbG93KQotICoKLSAqIDUpICBUcnkgaW5jcmVhc2luZyByYXRlIGlmLCBmb3IgY3VycmVudCByYXRlOgotICogICAgIGEpICBzdWNjZXNzIHJhdGlvIGlzIDwgMTUlIHx8Ci0gKiAgICAgYikgIGJvdGggYWRqYWNlbnQgcmF0ZXMnIHRocm91Z2hwdXRzIGFyZSB1bm1lYXN1cmVkICh0cnkgaXQhKSB8fAotICogICAgIGIpICBoaWdoZXIgYWRqYWNlbnQgcmF0ZSBoYXMgYmV0dGVyIG1lYXN1cmVkIHRocm91Z2hwdXQgfHwKLSAqICAgICBjKSAgbG93ZXIgYWRqYWNlbnQgcmF0ZSBoYXMgd29yc2UgdGhyb3VnaHB1dCwgYW5kIGhpZ2hlciBpcyB1bm1lYXN1cmVkCi0gKgotICogICAgIEFzIGEgc2FuaXR5IGNoZWNrLCBpZiBpbmNyZWFzZSB3YXMgZGV0ZXJtaW5lZCBhYm92ZSwgbGVhdmUgcmF0ZQotICogICAgIHVuY2hhbmdlZCBpZjoKLSAqICAgICBhKSAgc3VjY2VzcyByYXRpbyBhdCBjdXJyZW50IHJhdGUgPCA3MCUuICBUaGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkKLSAqICAgICAgICAgZ29vZCBwZXJmb3JtYW5jZTsgaGlnaGVyIHJhdGUgaXMgc3VyZSB0byBoYXZlIHBvb3JlciBzdWNjZXNzLgotICoKLSAqIDYpICBSZS1ldmFsdWF0ZSB0aGUgcmF0ZSBhZnRlciBlYWNoIHR4IGZyYW1lLiAgSWYgd29ya2luZyB3aXRoIGJsb2NrLQotICogICAgIGFja25vd2xlZGdlLCBoaXN0b3J5IGFuZCBzdGF0aXN0aWNzIG1heSBiZSBjYWxjdWxhdGVkIGZvciB0aGUgZW50aXJlCi0gKiAgICAgYmxvY2sgKGluY2x1ZGluZyBwcmlvciBoaXN0b3J5IHRoYXQgZml0cyB3aXRoaW4gdGhlIGhpc3Rvcnkgd2luZG93cyksCi0gKiAgICAgYmVmb3JlIHJlLWV2YWx1YXRpb24uCi0gKgotICogRklORElORyBCRVNUIFNUQVJUSU5HIE1PRFVMQVRJT04gTU9ERToKLSAqCi0gKiBBZnRlciB3b3JraW5nIHdpdGggYSBtb2R1bGF0aW9uIG1vZGUgZm9yIGEgIndoaWxlIiAoYW5kIGRvaW5nIHJhdGUgc2NhbGluZyksCi0gKiB0aGUgZHJpdmVyIHNlYXJjaGVzIGZvciBhIG5ldyBpbml0aWFsIG1vZGUgaW4gYW4gYXR0ZW1wdCB0byBpbXByb3ZlCi0gKiB0aHJvdWdocHV0LiAgVGhlICJ3aGlsZSIgaXMgbWVhc3VyZWQgYnkgbnVtYmVycyBvZiBhdHRlbXB0ZWQgZnJhbWVzOgotICoKLSAqIEZvciBsZWdhY3kgbW9kZSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKLSAqICAgNDgwIHN1Y2Nlc3NmdWwgZnJhbWVzLCBvciAxNjAgZmFpbGVkIGZyYW1lcwotICogRm9yIGhpZ2gtdGhyb3VnaHB1dCBtb2RlcyAoU0lTTyBvciBNSU1PKSwgc2VhcmNoIGZvciBuZXcgbW9kZSBhZnRlcjoKLSAqICAgNDUwMCBzdWNjZXNzZnVsIGZyYW1lcywgb3IgNDAwIGZhaWxlZCBmcmFtZXMKLSAqCi0gKiBNb2RlIHN3aXRjaCBwb3NzaWJpbGl0aWVzIGFyZSAoMyBmb3IgZWFjaCBtb2RlKToKLSAqCi0gKiBGb3IgbGVnYWN5OgotICogICBDaGFuZ2UgYW50ZW5uYSwgdHJ5IFNJU08gKGlmIEhUIGFzc29jaWF0aW9uKSwgdHJ5IE1JTU8gKGlmIEhUIGFzc29jaWF0aW9uKQotICogRm9yIFNJU086Ci0gKiAgIENoYW5nZSBhbnRlbm5hLCB0cnkgTUlNTywgdHJ5IHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbCAoU0dJKQotICogRm9yIE1JTU86Ci0gKiAgIFRyeSBTSVNPIGFudGVubmEgQSwgU0lTTyBhbnRlbm5hIEIsIHRyeSBzaG9ydGVuZWQgZ3VhcmQgaW50ZXJ2YWwgKFNHSSkKLSAqCi0gKiBXaGVuIHRyeWluZyBhIG5ldyBtb2RlLCB1c2UgdGhlIHNhbWUgYml0IHJhdGUgYXMgdGhlIG9sZC9jdXJyZW50IG1vZGUgd2hlbgotICogdHJ5aW5nIGFudGVubmEgc3dpdGNoZXMgYW5kIHNob3J0ZW5lZCBndWFyZCBpbnRlcnZhbC4gIFdoZW4gc3dpdGNoaW5nIHRvCi0gKiBTSVNPIGZyb20gTUlNTyBvciBsZWdhY3ksIG9yIHRvIE1JTU8gZnJvbSBTSVNPIG9yIGxlZ2FjeSwgdXNlIGEgcmF0ZQotICogZm9yIHdoaWNoIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpIGlzIGFib3V0IHRoZQotICogc2FtZSBvciBzbGlnaHRseSBiZXR0ZXIgdGhhbiB0aGUgYWN0dWFsIG1lYXN1cmVkIHRocm91Z2hwdXQgZGVsaXZlcmVkIGJ5Ci0gKiB0aGUgb2xkL2N1cnJlbnQgbW9kZS4KLSAqCi0gKiBBY3R1YWwgdGhyb3VnaHB1dCBjYW4gYmUgZXN0aW1hdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSBleHBlY3RlZCB0aHJvdWdocHV0Ci0gKiBieSB0aGUgc3VjY2VzcyByYXRpbyAoc3VjY2Vzc2Z1bCAvIGF0dGVtcHRlZCB0eCBmcmFtZXMpLiAgRnJhbWUgc2l6ZSBpcwotICogbm90IGNvbnNpZGVyZWQgaW4gdGhpcyBjYWxjdWxhdGlvbjsgaXQgYXNzdW1lcyB0aGF0IGZyYW1lIHNpemUgd2lsbCBhdmVyYWdlCi0gKiBvdXQgdG8gYmUgZmFpcmx5IGNvbnNpc3RlbnQgb3ZlciBzZXZlcmFsIHNhbXBsZXMuICBUaGUgZm9sbG93aW5nIGFyZQotICogbWV0cmljIHZhbHVlcyBmb3IgZXhwZWN0ZWQgdGhyb3VnaHB1dCBhc3N1bWluZyAxMDAlIHN1Y2Nlc3MgcmF0aW8uCi0gKiBPbmx5IEcgYmFuZCBoYXMgc3VwcG9ydCBmb3IgQ0NLIHJhdGVzOgotICoKLSAqICAgICAgICAgICBSQVRFOiAgMSAgICAyICAgIDUgICAxMSAgICA2ICAgOSAgIDEyICAgMTggICAyNCAgIDM2ICAgNDggICA1NCAgIDYwCi0gKgotICogICAgICAgICAgICAgIEc6ICA3ICAgMTMgICAzNSAgIDU4ICAgNDAgIDU3ICAgNzIgICA5OCAgMTIxICAxNTQgIDE3NyAgMTg2ICAxODYKLSAqICAgICAgICAgICAgICBBOiAgMCAgICAwICAgIDAgICAgMCAgIDQwICA1NyAgIDcyICAgOTggIDEyMSAgMTU0ICAxNzcgIDE4NiAgMTg2Ci0gKiAgICAgU0lTTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA0MiAgNDIgICA3NiAgMTAyICAxMjQgIDE1OSAgMTgzICAxOTMgIDIwMgotICogU0dJIFNJU08gMjBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNDYgIDQ2ICAgODIgIDExMCAgMTMyICAxNjggIDE5MiAgMjAyICAyMTEKLSAqICAgICBNSU1PIDIwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDc0ICA3NCAgMTIzICAxNTUgIDE3OSAgMjE0ICAyMzYgIDI0NCAgMjUxCi0gKiBTR0kgTUlNTyAyME1IejogIDAgICAgMCAgICAwICAgIDAgICA4MSAgODEgIDEzMSAgMTY0ICAxODggIDIyMiAgMjQzICAyNTEgIDI1NwotICogICAgIFNJU08gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAgNzcgIDc3ICAxMjcgIDE2MCAgMTg0ICAyMjAgIDI0MiAgMjUwICAyNTcKLSAqIFNHSSBTSVNPIDQwTUh6OiAgMCAgICAwICAgIDAgICAgMCAgIDgzICA4MyAgMTM1ICAxNjkgIDE5MyAgMjI5ICAyNTAgIDI1NyAgMjY0Ci0gKiAgICAgTUlNTyA0ME1IejogIDAgICAgMCAgICAwICAgIDAgIDEyMyAxMjMgIDE4MiAgMjE0ICAyMzUgIDI2NCAgMjc5ICAyODUgIDI4OQotICogU0dJIE1JTU8gNDBNSHo6ICAwICAgIDAgICAgMCAgICAwICAxMzEgMTMxICAxOTEgIDIyMiAgMjQyICAyNzAgIDI4NCAgMjg5ICAyOTMKLSAqCi0gKiBBZnRlciB0aGUgbmV3IG1vZGUgaGFzIGJlZW4gdHJpZWQgZm9yIGEgc2hvcnQgd2hpbGUgKG1pbmltdW0gb2YgNiBmYWlsZWQKLSAqIGZyYW1lcyBvciA4IHN1Y2Nlc3NmdWwgZnJhbWVzKSwgY29tcGFyZSBzdWNjZXNzIHJhdGlvIGFuZCBhY3R1YWwgdGhyb3VnaHB1dAotICogZXN0aW1hdGUgb2YgdGhlIG5ldyBtb2RlIHdpdGggdGhlIG9sZC4gIElmIGVpdGhlciBpcyBiZXR0ZXIgd2l0aCB0aGUgbmV3Ci0gKiBtb2RlLCBjb250aW51ZSB0byB1c2UgdGhlIG5ldyBtb2RlLgotICoKLSAqIENvbnRpbnVlIGNvbXBhcmluZyBtb2RlcyB1bnRpbCBhbGwgMyBwb3NzaWJpbGl0aWVzIGhhdmUgYmVlbiB0cmllZC4KLSAqIElmIG1vdmluZyBmcm9tIGxlZ2FjeSB0byBIVCwgdHJ5IGFsbCAzIHBvc3NpYmlsaXRpZXMgZnJvbSB0aGUgbmV3IEhUCi0gKiBtb2RlLiAgQWZ0ZXIgdHJ5aW5nIGFsbCAzLCBhIGJlc3QgbW9kZSBpcyBmb3VuZC4gIENvbnRpbnVlIHRvIHVzZSB0aGlzIG1vZGUKLSAqIGZvciB0aGUgbG9uZ2VyICJ3aGlsZSIgZGVzY3JpYmVkIGFib3ZlIChlLmcuIDQ4MCBzdWNjZXNzZnVsIGZyYW1lcyBmb3IKLSAqIGxlZ2FjeSksIGFuZCB0aGVuIHJlcGVhdCB0aGUgc2VhcmNoIHByb2Nlc3MuCi0gKgotICovCi1zdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgewotCi0JLyogSW5kZXggb2YgZGVzdGluYXRpb24vcmVjaXBpZW50IHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlICovCi0JdTggc3RhX2lkOwotCXU4IHJlc2VydmVkMTsKLQlfX2xlMTYgY29udHJvbDsJCS8qIG5vdCB1c2VkICovCi0Jc3RydWN0IGl3bF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMgZ2VuZXJhbF9wYXJhbXM7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxfYWdnX3BhcmFtcyBhZ2dfcGFyYW1zOwotCi0JLyoKLQkgKiBSYXRlIGluZm87IHdoZW4gdXNpbmcgcmF0ZS1zY2FsaW5nLCBUeCBjb21tYW5kJ3MgaW5pdGlhbF9yYXRlX2luZGV4Ci0JICogc3BlY2lmaWVzIDFzdCBUeCByYXRlIGF0dGVtcHRlZCwgdmlhIGluZGV4IGludG8gdGhpcyB0YWJsZS4KLQkgKiA0OTY1IGRldmljZXMgd29ya3MgaXRzIHdheSB0aHJvdWdoIHRhYmxlIHdoZW4gcmV0cnlpbmcgVHguCi0JICovCi0Jc3RydWN0IHsKLQkJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiwgSVdMX1JBVEVfKiAqLwotCX0gcnNfdGFibGVbTElOS19RVUFMX01BWF9SRVRSWV9OVU1dOwotCV9fbGUzMiByZXNlcnZlZDI7Ci19IF9fcGFja2VkOwotCi0vKgotICogQlQgY29uZmlndXJhdGlvbiBlbmFibGUgZmxhZ3M6Ci0gKiAgIGJpdCAwIC0gMTogQlQgY2hhbm5lbCBhbm5vdW5jZW1lbnQgZW5hYmxlZAotICogICAgICAgICAgIDA6IGRpc2FibGUKLSAqICAgYml0IDEgLSAxOiBwcmlvcml0eSBvZiBCVCBkZXZpY2UgZW5hYmxlZAotICogICAgICAgICAgIDA6IGRpc2FibGUKLSAqLwotI2RlZmluZSBCVF9DT0VYX0RJU0FCTEUgKDB4MCkKLSNkZWZpbmUgQlRfRU5BQkxFX0NIQU5ORUxfQU5OT1VOQ0UgQklUKDApCi0jZGVmaW5lIEJUX0VOQUJMRV9QUklPUklUWQkgICBCSVQoMSkKLQotI2RlZmluZSBCVF9DT0VYX0VOQUJMRSAgKEJUX0VOQUJMRV9DSEFOTkVMX0FOTk9VTkNFIHwgQlRfRU5BQkxFX1BSSU9SSVRZKQotCi0jZGVmaW5lIEJUX0xFQURfVElNRV9ERUYgKDB4MUUpCi0KLSNkZWZpbmUgQlRfTUFYX0tJTExfREVGICgweDUpCi0KLS8qCi0gKiBSRVBMWV9CVF9DT05GSUcgPSAweDliIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCi0gKgotICogMzk0NSBhbmQgNDk2NSBkZXZpY2VzIHN1cHBvcnQgaGFyZHdhcmUgaGFuZHNoYWtlIHdpdGggQmx1ZXRvb3RoIGRldmljZSBvbgotICogc2FtZSBwbGF0Zm9ybS4gIEJsdWV0b290aCBkZXZpY2UgYWxlcnRzIHdpcmVsZXNzIGRldmljZSB3aGVuIGl0IHdpbGwgVHg7Ci0gKiB3aXJlbGVzcyBkZXZpY2UgY2FuIGRlbGF5IG9yIGtpbGwgaXRzIG93biBUeCB0byBhY2NvbW1vZGF0ZS4KLSAqLwotc3RydWN0IGl3bF9idF9jbWQgewotCXU4IGZsYWdzOwotCXU4IGxlYWRfdGltZTsKLQl1OCBtYXhfa2lsbDsKLQl1OCByZXNlcnZlZDsKLQlfX2xlMzIga2lsbF9hY2tfbWFzazsKLQlfX2xlMzIga2lsbF9jdHNfbWFzazsKLX0gX19wYWNrZWQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDYpCi0gKiBTcGVjdHJ1bSBNYW5hZ2VtZW50ICg4MDIuMTFoKSBDb21tYW5kcywgUmVzcG9uc2VzLCBOb3RpZmljYXRpb25zOgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFNwZWN0cnVtIE1hbmFnZW1lbnQKLSAqLwotI2RlZmluZSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRyAoUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQUNDRVBUX0dSUF9NU0sgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfRElTX0dSUF9ERUNSWVBUX01TSyB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQVNTT0NfTVNLICAgICAgICAgICB8IFwKLQkJCQkgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spCi0KLXN0cnVjdCBpd2xfbWVhc3VyZV9jaGFubmVsIHsKLQlfX2xlMzIgZHVyYXRpb247CS8qIG1lYXN1cmVtZW50IGR1cmF0aW9uIGluIGV4dGVuZGVkIGJlYWNvbgotCQkJCSAqIGZvcm1hdCAqLwotCXU4IGNoYW5uZWw7CQkvKiBjaGFubmVsIHRvIG1lYXN1cmUgKi8KLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVfdHlwZSAqLwotCV9fbGUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0IChjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NwZWN0cnVtX2NtZCB7Ci0JX19sZTE2IGxlbjsJCS8qIG51bWJlciBvZiBieXRlcyBzdGFydGluZyBmcm9tIHRva2VuICovCi0JdTggdG9rZW47CQkvKiB0b2tlbiBpZCAqLwotCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLwotCXU4IG9yaWdpbjsJCS8qIDAgPSBUR2gsIDEgPSBvdGhlciwgMiA9IFRHayAqLwotCXU4IHBlcmlvZGljOwkJLyogMSA9IHBlcmlvZGljICovCi0JX19sZTE2IHBhdGhfbG9zc190aW1lb3V0OwotCV9fbGUzMiBzdGFydF90aW1lOwkvKiBzdGFydCB0aW1lIGluIGV4dGVuZGVkIGJlYWNvbiBmb3JtYXQgKi8KLQlfX2xlMzIgcmVzZXJ2ZWQyOwotCV9fbGUzMiBmbGFnczsJCS8qIHJ4b24gZmxhZ3MgKi8KLQlfX2xlMzIgZmlsdGVyX2ZsYWdzOwkvKiByeG9uIGZpbHRlciBmbGFncyAqLwotCV9fbGUxNiBjaGFubmVsX2NvdW50OwkvKiBtaW5pbXVtIDEsIG1heGltdW0gMTAgKi8KLQlfX2xlMTYgcmVzZXJ2ZWQzOwotCXN0cnVjdCBpd2xfbWVhc3VyZV9jaGFubmVsIGNoYW5uZWxzWzEwXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQgPSAweDc0IChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9zcGVjdHJ1bV9yZXNwIHsKLQl1OCB0b2tlbjsKLQl1OCBpZDsJCQkvKiBpZCBvZiB0aGUgcHJpb3IgY29tbWFuZCByZXBsYWNlZCwgb3IgMHhmZiAqLwotCV9fbGUxNiBzdGF0dXM7CQkvKiAwIC0gY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQKLQkJCQkgKiAxIC0gY2Fubm90IGhhbmRsZSAoY29uZmxpY3RzIHdpdGggYW5vdGhlcgotCQkJCSAqICAgICBtZWFzdXJlbWVudCkgKi8KLX0gX19wYWNrZWQ7Ci0KLWVudW0gaXdsX21lYXN1cmVtZW50X3N0YXRlIHsKLQlJV0xfTUVBU1VSRU1FTlRfU1RBUlQgPSAwLAotCUlXTF9NRUFTVVJFTUVOVF9TVE9QID0gMSwKLX07Ci0KLWVudW0gaXdsX21lYXN1cmVtZW50X3N0YXR1cyB7Ci0JSVdMX01FQVNVUkVNRU5UX09LID0gMCwKLQlJV0xfTUVBU1VSRU1FTlRfQ09OQ1VSUkVOVCA9IDEsCi0JSVdMX01FQVNVUkVNRU5UX0NTQV9DT05GTElDVCA9IDIsCi0JSVdMX01FQVNVUkVNRU5UX1RHSF9DT05GTElDVCA9IDMsCi0JLyogNC01IHJlc2VydmVkICovCi0JSVdMX01FQVNVUkVNRU5UX1NUT1BQRUQgPSA2LAotCUlXTF9NRUFTVVJFTUVOVF9USU1FT1VUID0gNywKLQlJV0xfTUVBU1VSRU1FTlRfUEVSSU9ESUNfRkFJTEVEID0gOCwKLX07Ci0KLSNkZWZpbmUgTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTSA4Ci0KLXN0cnVjdCBpd2xfbWVhc3VyZW1lbnRfaGlzdG9ncmFtIHsKLQlfX2xlMzIgb2ZkbVtOVU1fRUxFTUVOVFNfSU5fSElTVE9HUkFNXTsJLyogaW4gMC44dXNlYyBjb3VudHMgKi8KLQlfX2xlMzIgY2NrW05VTV9FTEVNRU5UU19JTl9ISVNUT0dSQU1dOwkvKiBpbiAxdXNlYyBjb3VudHMgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIGNsZWFyIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNvdW50ZXJzICovCi1zdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2NjYV9jb3VudGVycyB7Ci0JX19sZTMyIG9mZG07Ci0JX19sZTMyIGNjazsKLX0gX19wYWNrZWQ7Ci0KLWVudW0gaXdsX21lYXN1cmVfdHlwZSB7Ci0JSVdMX01FQVNVUkVfQkFTSUMgPSAoMSA8PCAwKSwKLQlJV0xfTUVBU1VSRV9DSEFOTkVMX0xPQUQgPSAoMSA8PCAxKSwKLQlJV0xfTUVBU1VSRV9ISVNUT0dSQU1fUlBJID0gKDEgPDwgMiksCi0JSVdMX01FQVNVUkVfSElTVE9HUkFNX05PSVNFID0gKDEgPDwgMyksCi0JSVdMX01FQVNVUkVfRlJBTUUgPSAoMSA8PCA0KSwKLQkvKiBiaXRzIDU6NiBhcmUgcmVzZXJ2ZWQgKi8KLQlJV0xfTUVBU1VSRV9JRExFID0gKDEgPDwgNyksCi19OwotCi0vKgotICogU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT04gPSAweDc1IChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotc3RydWN0IGl3bF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gewotCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLwotCXU4IHRva2VuOwotCXU4IGNoYW5uZWxfaW5kZXg7CS8qIGluZGV4IGluIG1lYXN1cmVtZW50IGNoYW5uZWwgbGlzdCAqLwotCXU4IHN0YXRlOwkJLyogMCAtIHN0YXJ0LCAxIC0gc3RvcCAqLwotCV9fbGUzMiBzdGFydF90aW1lOwkvKiBsb3dlciAzMi1iaXRzIG9mIFRTRiAqLwotCXU4IGJhbmQ7CQkvKiAwIC0gNS4yR0h6LCAxIC0gMi40R0h6ICovCi0JdTggY2hhbm5lbDsKLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVtZW50X3R5cGUgKi8KLQl1OCByZXNlcnZlZDE7Ci0JLyogTk9URTogIGNjYV9vZmRtLCBjY2FfY2NrLCBiYXNpY190eXBlLCBhbmQgaGlzdG9ncmFtIGFyZSBvbmx5IG9ubHkKLQkgKiB2YWxpZCBpZiBhcHBsaWNhYmxlIGZvciBtZWFzdXJlbWVudCB0eXBlIHJlcXVlc3RlZC4gKi8KLQlfX2xlMzIgY2NhX29mZG07CS8qIGNjYSBmcmFjdGlvbiB0aW1lIGluIDQwTWh6IGNsb2NrIHBlcmlvZHMgKi8KLQlfX2xlMzIgY2NhX2NjazsJCS8qIGNjYSBmcmFjdGlvbiB0aW1lIGluIDQ0TWh6IGNsb2NrIHBlcmlvZHMgKi8KLQlfX2xlMzIgY2NhX3RpbWU7CS8qIGNoYW5uZWwgbG9hZCB0aW1lIGluIHVzZWNzICovCi0JdTggYmFzaWNfdHlwZTsJCS8qIDAgLSBic3MsIDEgLSBvZmRtIHByZWFtYmxlLCAyIC0KLQkJCQkgKiB1bmlkZW50aWZpZWQgKi8KLQl1OCByZXNlcnZlZDJbM107Ci0Jc3RydWN0IGl3bF9tZWFzdXJlbWVudF9oaXN0b2dyYW0gaGlzdG9ncmFtOwotCV9fbGUzMiBzdG9wX3RpbWU7CS8qIGxvd2VyIDMyLWJpdHMgb2YgVFNGICovCi0JX19sZTMyIHN0YXR1czsJCS8qIHNlZSBpd2xfbWVhc3VyZW1lbnRfc3RhdHVzICovCi19IF9fcGFja2VkOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAoNykKLSAqIFBvd2VyIE1hbmFnZW1lbnQgQ29tbWFuZHMsIFJlc3BvbnNlcywgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAtIFBvd2VyIFRhYmxlIENvbW1hbmQKLSAqIEBmbGFnczogU2VlIGJlbG93OgotICoKLSAqIFBPV0VSX1RBQkxFX0NNRCA9IDB4NzcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBQTSBhbGxvdzoKLSAqICAgYml0IDAgLSAnMCcgRHJpdmVyIG5vdCBhbGxvdyBwb3dlciBtYW5hZ2VtZW50Ci0gKiAgICAgICAgICAgJzEnIERyaXZlciBhbGxvdyBQTSAodXNlIHJlc3Qgb2YgcGFyYW1ldGVycykKLSAqCi0gKiB1Q29kZSBzZW5kIHNsZWVwIG5vdGlmaWNhdGlvbnM6Ci0gKiAgIGJpdCAxIC0gJzAnIERvbid0IHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uCi0gKiAgICAgICAgICAgJzEnIHNlbmQgc2xlZXAgbm90aWZpY2F0aW9uIChTRU5EX1BNX05PVElGSUNBVElPTikKLSAqCi0gKiBTbGVlcCBvdmVyIERUSU0KLSAqICAgYml0IDIgLSAnMCcgUE0gaGF2ZSB0byB3YWxrIHVwIGV2ZXJ5IERUSU0KLSAqICAgICAgICAgICAnMScgUE0gY291bGQgc2xlZXAgb3ZlciBEVElNIHRpbGwgbGlzdGVuIEludGVydmFsLgotICoKLSAqIFBDSSBwb3dlciBtYW5hZ2VkCi0gKiAgIGJpdCAzIC0gJzAnIChQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKLSAqICAgICAgICAgICAnMScgIShQQ0lfQ0ZHX0xJTktfQ1RSTCAmIDB4MSkKLSAqCi0gKiBGYXN0IFBECi0gKiAgIGJpdCA0IC0gJzEnIFB1dCByYWRpbyB0byBzbGVlcCB3aGVuIHJlY2VpdmluZyBmcmFtZSBmb3Igb3RoZXJzCi0gKgotICogRm9yY2Ugc2xlZXAgTW9kZXMKLSAqICAgYml0IDMxLzMwLSAnMDAnIHVzZSBib3RoIG1hYy94dGFsIHNsZWVwcwotICogICAgICAgICAgICAgICcwMScgZm9yY2UgTWFjIHNsZWVwCi0gKiAgICAgICAgICAgICAgJzEwJyBmb3JjZSB4dGFsIHNsZWVwCi0gKiAgICAgICAgICAgICAgJzExJyBJbGxlZ2FsIHNldAotICoKLSAqIE5PVEU6IGlmIHNsZWVwX2ludGVydmFsW1NMRUVQX0lOVFJWTF9UQUJMRV9TSVpFLTFdID4gRFRJTSBwZXJpb2QgdGhlbgotICogdWNvZGUgYXNzdW1lIHNsZWVwIG92ZXIgRFRJTSBpcyBhbGxvd2VkIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHdha2UgdXAKLSAqIGZvciBldmVyeSBEVElNLgotICovCi0jZGVmaW5lIElXTF9QT1dFUl9WRUNfU0laRSA1Ci0KLSNkZWZpbmUgSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0sJY3B1X3RvX2xlMTYoQklUKDApKQotI2RlZmluZSBJV0xfUE9XRVJfUENJX1BNX01TSwkJCWNwdV90b19sZTE2KEJJVCgzKSkKLQotc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQgewotCV9fbGUxNiBmbGFnczsKLQl1OCByZXNlcnZlZFsyXTsKLQlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OwotCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7Ci0JX19sZTMyIHNsZWVwX2ludGVydmFsW0lXTF9QT1dFUl9WRUNfU0laRV07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIHsKLQlfX2xlMTYgZmxhZ3M7Ci0JdTgga2VlcF9hbGl2ZV9zZWNvbmRzOwkJLyogMzk0NSByZXNlcnZlZCAqLwotCXU4IGRlYnVnX2ZsYWdzOwkJCS8qIDM5NDUgcmVzZXJ2ZWQgKi8KLQlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OwotCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7Ci0JX19sZTMyIHNsZWVwX2ludGVydmFsW0lXTF9QT1dFUl9WRUNfU0laRV07Ci0JX19sZTMyIGtlZXBfYWxpdmVfYmVhY29uczsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBQTV9TTEVFUF9OT1RJRklDQVRJT04gPSAweDdBIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4KLSAqLwotc3RydWN0IGl3bF9zbGVlcF9ub3RpZmljYXRpb24gewotCXU4IHBtX3NsZWVwX21vZGU7Ci0JdTggcG1fd2FrZXVwX3NyYzsKLQlfX2xlMTYgcmVzZXJ2ZWQ7Ci0JX19sZTMyIHNsZWVwX3RpbWU7Ci0JX19sZTMyIHRzZl9sb3c7Ci0JX19sZTMyIGJjb25fdGltZXI7Ci19IF9fcGFja2VkOwotCi0vKiBTbGVlcCBzdGF0ZXMuICBhbGwgZGV2aWNlcyBpZGVudGljYWwuICovCi1lbnVtIHsKLQlJV0xfUE1fTk9fU0xFRVAgPSAwLAotCUlXTF9QTV9TTFBfTUFDID0gMSwKLQlJV0xfUE1fU0xQX0ZVTExfTUFDX1VOQVNTT0NJQVRFID0gMiwKLQlJV0xfUE1fU0xQX0ZVTExfTUFDX0NBUkRfU1RBVEUgPSAzLAotCUlXTF9QTV9TTFBfUEhZID0gNCwKLQlJV0xfUE1fU0xQX1JFUEVOVCA9IDUsCi0JSVdMX1BNX1dBS0VVUF9CWV9USU1FUiA9IDYsCi0JSVdMX1BNX1dBS0VVUF9CWV9EUklWRVIgPSA3LAotCUlXTF9QTV9XQUtFVVBfQllfUkZLSUxMID0gOCwKLQkvKiAzIHJlc2VydmVkICovCi0JSVdMX1BNX05VTV9PRl9NT0RFUyA9IDEyLAotfTsKLQotLyoKLSAqIENBUkRfU1RBVEVfTk9USUZJQ0FUSU9OID0gMHhhMSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKi8KLXN0cnVjdCBpd2xfY2FyZF9zdGF0ZV9ub3RpZiB7Ci0JX19sZTMyIGZsYWdzOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBIV19DQVJEX0RJU0FCTEVEICAgMHgwMQotI2RlZmluZSBTV19DQVJEX0RJU0FCTEVEICAgMHgwMgotI2RlZmluZSBDVF9DQVJEX0RJU0FCTEVEICAgMHgwNAotI2RlZmluZSBSWE9OX0NBUkRfRElTQUJMRUQgMHgxMAotCi1zdHJ1Y3QgaXdsX2N0X2tpbGxfY29uZmlnIHsKLQlfX2xlMzIgICByZXNlcnZlZDsKLQlfX2xlMzIgICBjcml0aWNhbF90ZW1wZXJhdHVyZV9NOwotCV9fbGUzMiAgIGNyaXRpY2FsX3RlbXBlcmF0dXJlX1I7Ci19ICBfX3BhY2tlZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDgpCi0gKiBTY2FuIENvbW1hbmRzLCBSZXNwb25zZXMsIE5vdGlmaWNhdGlvbnM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNDQU5fQ0hBTk5FTF9UWVBFX1BBU1NJVkUgY3B1X3RvX2xlMzIoMCkKLSNkZWZpbmUgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFICBjcHVfdG9fbGUzMigxKQotCi0vKioKLSAqIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIC0gZW50cnkgaW4gUkVQTFlfU0NBTl9DTUQgY2hhbm5lbCB0YWJsZQotICoKLSAqIE9uZSBmb3IgZWFjaCBjaGFubmVsIGluIHRoZSBzY2FuIGxpc3QuCi0gKiBFYWNoIGNoYW5uZWwgY2FuIGluZGVwZW5kZW50bHkgc2VsZWN0OgotICogMSkgIFNTSUQgZm9yIGRpcmVjdGVkIGFjdGl2ZSBzY2FucwotICogMikgIFR4cG93ZXIgc2V0dGluZyAoZm9yIHJhdGUgc3BlY2lmaWVkIHdpdGhpbiBUeCBjb21tYW5kKQotICogMykgIEhvdyBsb25nIHRvIHN0YXkgb24tY2hhbm5lbCAoYmVoYXZpb3IgbWF5IGJlIG1vZGlmaWVkIGJ5IHF1aWV0X3RpbWUsCi0gKiAgICAgcXVpZXRfcGxjcF90aCwgZ29vZF9DUkNfdGgpCi0gKgotICogVG8gYXZvaWQgdUNvZGUgZXJyb3JzLCBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZSAoc2VlIGNvbW1lbnRzCi0gKiB1bmRlciBzdHJ1Y3QgaXdsX3NjYW5fY21kIGFib3V0IG1heF9vdXRfdGltZSBhbmQgcXVpZXRfdGltZSk6Ci0gKiAxKSAgSWYgdXNpbmcgcGFzc2l2ZV9kd2VsbCAoaS5lLiBwYXNzaXZlX2R3ZWxsICE9IDApOgotICogICAgIGFjdGl2ZV9kd2VsbCA8PSBwYXNzaXZlX2R3ZWxsICg8IG1heF9vdXRfdGltZSBpZiBtYXhfb3V0X3RpbWUgIT0gMCkKLSAqIDIpICBxdWlldF90aW1lIDw9IGFjdGl2ZV9kd2VsbAotICogMykgIElmIHJlc3RyaWN0aW5nIG9mZi1jaGFubmVsIHRpbWUgKGkuZS4gbWF4X291dF90aW1lICE9MCk6Ci0gKiAgICAgcGFzc2l2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQotICogICAgIGFjdGl2ZV9kd2VsbCA8IG1heF9vdXRfdGltZQotICovCi1zdHJ1Y3QgaXdsMzk0NV9zY2FuX2NoYW5uZWwgewotCS8qCi0JICogdHlwZSBpcyBkZWZpbmVkIGFzOgotCSAqIDA6MCAxID0gYWN0aXZlLCAwID0gcGFzc2l2ZQotCSAqIDE6NCBTU0lEIGRpcmVjdCBiaXQgbWFwOyBpZiBhIGJpdCBpcyBzZXQsIHRoZW4gY29ycmVzcG9uZGluZwotCSAqICAgICBTU0lEIElFIGlzIHRyYW5zbWl0dGVkIGluIHByb2JlIHJlcXVlc3QuCi0JICogNTo3IHJlc2VydmVkCi0JICovCi0JdTggdHlwZTsKLQl1OCBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bDM5NDVfc2Nhbl9jbWQgImZsYWdzIiBmaWVsZCAqLwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsKLQlfX2xlMTYgYWN0aXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgNS01MCAqLwotCV9fbGUxNiBwYXNzaXZlX2R3ZWxsOwkvKiBpbiAxMDI0LXVTZWMgVFUgKHRpbWUgdW5pdHMpLCB0eXAgMjAtNTAwICovCi19IF9fcGFja2VkOwotCi0vKiBzZXQgbnVtYmVyIG9mIGRpcmVjdCBwcm9iZXMgdTggdHlwZSAqLwotI2RlZmluZSBJV0wzOV9TQ0FOX1BST0JFX01BU0sobikgKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCi0KLXN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIHsKLQkvKgotCSAqIHR5cGUgaXMgZGVmaW5lZCBhczoKLQkgKiAwOjAgMSA9IGFjdGl2ZSwgMCA9IHBhc3NpdmUKLQkgKiAxOjIwIFNTSUQgZGlyZWN0IGJpdCBtYXA7IGlmIGEgYml0IGlzIHNldCwgdGhlbiBjb3JyZXNwb25kaW5nCi0JICogICAgIFNTSUQgSUUgaXMgdHJhbnNtaXR0ZWQgaW4gcHJvYmUgcmVxdWVzdC4KLQkgKiAyMTozMSByZXNlcnZlZAotCSAqLwotCV9fbGUzMiB0eXBlOwotCV9fbGUxNiBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bF9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkICovCi0JdTggdHhfZ2FpbjsJCS8qIGdhaW4gZm9yIGFuYWxvZyByYWRpbyAqLwotCXU4IGRzcF9hdHRlbjsJCS8qIGdhaW4gZm9yIERTUCAqLwotCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCi0JX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyBfX2xlMzIgdHlwZSAqLwotI2RlZmluZSBJV0xfU0NBTl9QUk9CRV9NQVNLKG4pCWNwdV90b19sZTMyKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCi0KLS8qKgotICogc3RydWN0IGl3bF9zc2lkX2llIC0gZGlyZWN0ZWQgc2NhbiBuZXR3b3JrIGluZm9ybWF0aW9uIGVsZW1lbnQKLSAqCi0gKiBVcCB0byAyMCBvZiB0aGVzZSBtYXkgYXBwZWFyIGluIFJFUExZX1NDQU5fQ01EIChOb3RlOiBPbmx5IDQgYXJlIGluCi0gKiAzOTQ1IFNDQU4gYXBpKSwgc2VsZWN0ZWQgYnkgInR5cGUiIGJpdCBmaWVsZCBpbiBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbDsKLSAqIGVhY2ggY2hhbm5lbCBtYXkgc2VsZWN0IGRpZmZlcmVudCBzc2lkcyBmcm9tIGFtb25nIHRoZSAyMCAoNCkgZW50cmllcy4KLSAqIFNTSUQgSUVzIGdldCB0cmFuc21pdHRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGVudHJ5LgotICovCi1zdHJ1Y3QgaXdsX3NzaWRfaWUgewotCXU4IGlkOwotCXU4IGxlbjsKLQl1OCBzc2lkWzMyXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0Ci0jZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCi0jZGVmaW5lIFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEUJY3B1X3RvX2xlMzIoMHhGRkZGRkZGRikKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RJU0FCTEVECTAKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RFRkFVTFQJCWNwdV90b19sZTE2KDEpCi0jZGVmaW5lIElXTF9HT09EX0NSQ19USF9ORVZFUgkJY3B1X3RvX2xlMTYoMHhmZmZmKQotI2RlZmluZSBJV0xfTUFYX1NDQU5fU0laRSAxMDI0Ci0jZGVmaW5lIElXTF9NQVhfQ01EX1NJWkUgNDA5NgotCi0vKgotICogUkVQTFlfU0NBTl9DTUQgPSAweDgwIChjb21tYW5kKQotICoKLSAqIFRoZSBoYXJkd2FyZSBzY2FuIGNvbW1hbmQgaXMgdmVyeSBwb3dlcmZ1bDsgdGhlIGRyaXZlciBjYW4gc2V0IGl0IHVwIHRvCi0gKiBtYWludGFpbiAocmVsYXRpdmVseSkgbm9ybWFsIG5ldHdvcmsgdHJhZmZpYyB3aGlsZSBkb2luZyBhIHNjYW4gaW4gdGhlCi0gKiBiYWNrZ3JvdW5kLiAgVGhlIG1heF9vdXRfdGltZSBhbmQgc3VzcGVuZF90aW1lIGNvbnRyb2wgdGhlIHJhdGlvIG9mIGhvdwotICogbG9uZyB0aGUgZGV2aWNlIHN0YXlzIG9uIGFuIGFzc29jaWF0ZWQgbmV0d29yayBjaGFubmVsICgic2VydmljZSBjaGFubmVsIikKLSAqIHZzLiBob3cgbG9uZyBpdCdzIGF3YXkgZnJvbSB0aGUgc2VydmljZSBjaGFubmVsLCBpLmUuIHR1bmVkIHRvIG90aGVyIGNoYW5uZWxzCi0gKiBmb3Igc2Nhbm5pbmcuCi0gKgotICogbWF4X291dF90aW1lIGlzIHRoZSBtYXggdGltZSBvZmYtY2hhbm5lbCAoaW4gdXNlYyksIGFuZCBzdXNwZW5kX3RpbWUKLSAqIGlzIGhvdyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uIiBmb3JtYXQpIHRoYXQgdGhlIHNjYW4gaXMgInN1c3BlbmRlZCIKLSAqIGFmdGVyIHJldHVybmluZyB0byB0aGUgc2VydmljZSBjaGFubmVsLiAgVGhhdCBpcywgc3VzcGVuZF90aW1lIGlzIHRoZQotICogdGltZSB0aGF0IHdlIHN0YXkgb24gdGhlIHNlcnZpY2UgY2hhbm5lbCwgZG9pbmcgbm9ybWFsIHdvcmssIGJldHdlZW4KLSAqIHNjYW4gc2VnbWVudHMuICBUaGUgZHJpdmVyIG1heSBzZXQgdGhlc2UgcGFyYW1ldGVycyBkaWZmZXJlbnRseSB0byBzdXBwb3J0Ci0gKiBzY2FubmluZyB3aGVuIGFzc29jaWF0ZWQgdnMuIG5vdCBhc3NvY2lhdGVkLCBhbmQgbGlnaHQgdnMuIGhlYXZ5IHRyYWZmaWMKLSAqIGxvYWRzIHdoZW4gYXNzb2NpYXRlZC4KLSAqCi0gKiBBZnRlciByZWNlaXZpbmcgdGhpcyBjb21tYW5kLCB0aGUgZGV2aWNlJ3Mgc2NhbiBlbmdpbmUgZG9lcyB0aGUgZm9sbG93aW5nOwotICoKLSAqIDEpICBTZW5kcyBTQ0FOX1NUQVJUIG5vdGlmaWNhdGlvbiB0byBkcml2ZXIKLSAqIDIpICBDaGVja3MgdG8gc2VlIGlmIGl0IGhhcyB0aW1lIHRvIGRvIHNjYW4gZm9yIG9uZSBjaGFubmVsCi0gKiAzKSAgU2VuZHMgTlVMTCBwYWNrZXQsIHdpdGggcG93ZXItc2F2ZSAoUFMpIGJpdCBzZXQgdG8gMSwKLSAqICAgICB0byB0ZWxsIEFQIHRoYXQgd2UncmUgZ29pbmcgb2ZmLWNoYW5uZWwKLSAqIDQpICBUdW5lcyB0byBmaXJzdCBjaGFubmVsIGluIHNjYW4gbGlzdCwgZG9lcyBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gKiA1KSAgU2VuZHMgU0NBTl9SRVNVTFQgbm90aWZpY2F0aW9uIHRvIGRyaXZlcgotICogNikgIENoZWNrcyB0byBzZWUgaWYgaXQgaGFzIHRpbWUgdG8gZG8gc2NhbiBvbiAqbmV4dCogY2hhbm5lbCBpbiBsaXN0Ci0gKiA3KSAgUmVwZWF0cyA0LTYgdW50aWwgaXQgbm8gbG9uZ2VyIGhhcyB0aW1lIHRvIHNjYW4gdGhlIG5leHQgY2hhbm5lbAotICogICAgIGJlZm9yZSBtYXhfb3V0X3RpbWUgZXhwaXJlcwotICogOCkgIFJldHVybnMgdG8gc2VydmljZSBjaGFubmVsCi0gKiA5KSAgU2VuZHMgTlVMTCBwYWNrZXQgd2l0aCBQUz0wIHRvIHRlbGwgQVAgdGhhdCB3ZSdyZSBiYWNrCi0gKiAxMCkgU3RheXMgb24gc2VydmljZSBjaGFubmVsIHVudGlsIHN1c3BlbmRfdGltZSBleHBpcmVzCi0gKiAxMSkgUmVwZWF0cyBlbnRpcmUgcHJvY2VzcyAyLTEwIHVudGlsIGxpc3QgaXMgY29tcGxldGUKLSAqIDEyKSBTZW5kcyBTQ0FOX0NPTVBMRVRFIG5vdGlmaWNhdGlvbgotICoKLSAqIEZvciBmYXN0LCBlZmZpY2llbnQgc2NhbnMsIHRoZSBzY2FuIGNvbW1hbmQgYWxzbyBoYXMgc3VwcG9ydCBmb3Igc3RheWluZyBvbgotICogYSBjaGFubmVsIGZvciBqdXN0IGEgc2hvcnQgdGltZSwgaWYgZG9pbmcgYWN0aXZlIHNjYW5uaW5nIGFuZCBnZXR0aW5nIG5vCi0gKiByZXNwb25zZXMgdG8gdGhlIHRyYW5zbWl0dGVkIHByb2JlIHJlcXVlc3QuICBUaGlzIHRpbWUgaXMgY29udHJvbGxlZCBieQotICogcXVpZXRfdGltZSwgYW5kIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBiZWxvdyB3aGljaCBhIGNoYW5uZWwgaXMKLSAqIGNvbnNpZGVyZWQgInF1aWV0IiBpcyBjb250cm9sbGVkIGJ5IHF1aWV0X3BsY3BfdGhyZXNob2xkLgotICoKLSAqIEZvciBhY3RpdmUgc2Nhbm5pbmcgb24gY2hhbm5lbHMgdGhhdCBoYXZlIHJlZ3VsYXRvcnkgcmVzdHJpY3Rpb25zIGFnYWluc3QKLSAqIGJsaW5kbHkgdHJhbnNtaXR0aW5nLCB0aGUgc2NhbiBjYW4gbGlzdGVuIGJlZm9yZSB0cmFuc21pdHRpbmcsIHRvIG1ha2Ugc3VyZQotICogdGhhdCB0aGVyZSBpcyBhbHJlYWR5IGxlZ2l0aW1hdGUgYWN0aXZpdHkgb24gdGhlIGNoYW5uZWwuICBJZiBlbm91Z2gKLSAqIHBhY2tldHMgYXJlIGNsZWFubHkgcmVjZWl2ZWQgb24gdGhlIGNoYW5uZWwgKGNvbnRyb2xsZWQgYnkgZ29vZF9DUkNfdGgsCi0gKiB0eXBpY2FsIHZhbHVlIDEpLCB0aGUgc2NhbiBlbmdpbmUgc3RhcnRzIHRyYW5zbWl0dGluZyBwcm9iZSByZXF1ZXN0cy4KLSAqCi0gKiBEcml2ZXIgbXVzdCB1c2Ugc2VwYXJhdGUgc2NhbiBjb21tYW5kcyBmb3IgMi40IHZzLiA1IEdIeiBiYW5kcy4KLSAqCi0gKiBUbyBhdm9pZCB1Q29kZSBlcnJvcnMsIHNlZSB0aW1pbmcgcmVzdHJpY3Rpb25zIGRlc2NyaWJlZCB1bmRlcgotICogc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwuCi0gKi8KLQotc3RydWN0IGl3bDM5NDVfc2Nhbl9jbWQgewotCV9fbGUxNiBsZW47Ci0JdTggcmVzZXJ2ZWQwOwotCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgY2hhbm5lbHMgaW4gY2hhbm5lbCBsaXN0ICovCi0JX19sZTE2IHF1aWV0X3RpbWU7CS8qIGR3ZWxsIG9ubHkgdGhpcyAjIG1pbGxpc2VjcyBvbiBxdWlldCBjaGFubmVsCi0JCQkJICogKG9ubHkgZm9yIGFjdGl2ZSBzY2FuKSAqLwotCV9fbGUxNiBxdWlldF9wbGNwX3RoOwkvKiBxdWlldCBjaG5sIGlzIDwgdGhpcyAjIHBrdHMgKHR5cC4gMSkgKi8KLQlfX2xlMTYgZ29vZF9DUkNfdGg7CS8qIHBhc3NpdmUgLT4gYWN0aXZlIHByb21vdGlvbiB0aHJlc2hvbGQgKi8KLQlfX2xlMTYgcmVzZXJ2ZWQxOwotCV9fbGUzMiBtYXhfb3V0X3RpbWU7CS8qIG1heCB1c2VjIHRvIGJlIGF3YXkgZnJvbSBhc3NvY2lhdGVkIChzZXJ2aWNlKQotCQkJCSAqIGNoYW5uZWwgKi8KLQlfX2xlMzIgc3VzcGVuZF90aW1lOwkvKiBwYXVzZSBzY2FuIHRoaXMgbG9uZyAoaW4gImV4dGVuZGVkIGJlYWNvbgotCQkJCSAqIGZvcm1hdCIpIHdoZW4gcmV0dXJuaW5nIHRvIHNlcnZpY2UgY2hhbm5lbDoKLQkJCQkgKiAzOTQ1OyAzMToyNCAjIGJlYWNvbnMsIDE5OjAgYWRkaXRpb25hbCB1c2VjLAotCQkJCSAqIDQ5NjU7IDMxOjIyICMgYmVhY29ucywgMjE6MCBhZGRpdGlvbmFsIHVzZWMuCi0JCQkJICovCi0JX19sZTMyIGZsYWdzOwkJLyogUlhPTl9GTEdfKiAqLwotCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CS8qIFJYT05fRklMVEVSXyogKi8KLQotCS8qIEZvciBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgZm9yIHBhc3NpdmUgc2NhbnMpLgotCSAqIERvZXMgbm90IGluY2x1ZGUgcGF5bG9hZC4gIE11c3Qgc3BlY2lmeSBUeCByYXRlOyBubyByYXRlIHNjYWxpbmcuICovCi0Jc3RydWN0IGl3bDM5NDVfdHhfY21kIHR4X2NtZDsKLQotCS8qIEZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgb3RoZXJ3aXNlKSAqLwotCXN0cnVjdCBpd2xfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXzM5NDVdOwotCi0JLyoKLQkgKiBQcm9iZSByZXF1ZXN0IGZyYW1lLCBmb2xsb3dlZCBieSBjaGFubmVsIGxpc3QuCi0JICoKLQkgKiBTaXplIG9mIHByb2JlIHJlcXVlc3QgZnJhbWUgaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgY291bnQgaW4gdHhfY21kLgotCSAqIENoYW5uZWwgbGlzdCBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHByb2JlIHJlcXVlc3QgZnJhbWUuCi0JICogTnVtYmVyIG9mIGNoYW5uZWxzIGluIGxpc3QgaXMgc3BlY2lmaWVkIGJ5IGNoYW5uZWxfY291bnQuCi0JICogRWFjaCBjaGFubmVsIGluIGxpc3QgaXMgb2YgdHlwZToKLQkgKgotCSAqIHN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCBjaGFubmVsc1swXTsKLQkgKgotCSAqIE5PVEU6ICBPbmx5IG9uZSBiYW5kIG9mIGNoYW5uZWxzIGNhbiBiZSBzY2FubmVkIHBlciBwYXNzLiAgWW91Ci0JICogbXVzdCBub3QgbWl4IDIuNEdIeiBjaGFubmVscyBhbmQgNS4yR0h6IGNoYW5uZWxzLCBhbmQgeW91IG11c3Qgd2FpdAotCSAqIGZvciBvbmUgc2NhbiB0byBjb21wbGV0ZSAoaS5lLiByZWNlaXZlIFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OKQotCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KLQkgKi8KLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF9zY2FuX2NtZCB7Ci0JX19sZTE2IGxlbjsKLQl1OCByZXNlcnZlZDA7Ci0JdTggY2hhbm5lbF9jb3VudDsJLyogIyBjaGFubmVscyBpbiBjaGFubmVsIGxpc3QgKi8KLQlfX2xlMTYgcXVpZXRfdGltZTsJLyogZHdlbGwgb25seSB0aGlzICMgbWlsbGlzZWNzIG9uIHF1aWV0IGNoYW5uZWwKLQkJCQkgKiAob25seSBmb3IgYWN0aXZlIHNjYW4pICovCi0JX19sZTE2IHF1aWV0X3BsY3BfdGg7CS8qIHF1aWV0IGNobmwgaXMgPCB0aGlzICMgcGt0cyAodHlwLiAxKSAqLwotCV9fbGUxNiBnb29kX0NSQ190aDsJLyogcGFzc2l2ZSAtPiBhY3RpdmUgcHJvbW90aW9uIHRocmVzaG9sZCAqLwotCV9fbGUxNiByeF9jaGFpbjsJLyogUlhPTl9SWF9DSEFJTl8qICovCi0JX19sZTMyIG1heF9vdXRfdGltZTsJLyogbWF4IHVzZWMgdG8gYmUgYXdheSBmcm9tIGFzc29jaWF0ZWQgKHNlcnZpY2UpCi0JCQkJICogY2hhbm5lbCAqLwotCV9fbGUzMiBzdXNwZW5kX3RpbWU7CS8qIHBhdXNlIHNjYW4gdGhpcyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uCi0JCQkJICogZm9ybWF0Iikgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaG5sOgotCQkJCSAqIDM5NDU7IDMxOjI0ICMgYmVhY29ucywgMTk6MCBhZGRpdGlvbmFsIHVzZWMsCi0JCQkJICogNDk2NTsgMzE6MjIgIyBiZWFjb25zLCAyMTowIGFkZGl0aW9uYWwgdXNlYy4KLQkJCQkgKi8KLQlfX2xlMzIgZmxhZ3M7CQkvKiBSWE9OX0ZMR18qICovCi0JX19sZTMyIGZpbHRlcl9mbGFnczsJLyogUlhPTl9GSUxURVJfKiAqLwotCi0JLyogRm9yIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBmb3IgcGFzc2l2ZSBzY2FucykuCi0JICogRG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkLiAgTXVzdCBzcGVjaWZ5IFR4IHJhdGU7IG5vIHJhdGUgc2NhbGluZy4gKi8KLQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eF9jbWQ7Ci0KLQkvKiBGb3IgZGlyZWN0ZWQgYWN0aXZlIHNjYW5zIChzZXQgdG8gYWxsLTBzIG90aGVyd2lzZSkgKi8KLQlzdHJ1Y3QgaXdsX3NzaWRfaWUgZGlyZWN0X3NjYW5bUFJPQkVfT1BUSU9OX01BWF07Ci0KLQkvKgotCSAqIFByb2JlIHJlcXVlc3QgZnJhbWUsIGZvbGxvd2VkIGJ5IGNoYW5uZWwgbGlzdC4KLQkgKgotCSAqIFNpemUgb2YgcHJvYmUgcmVxdWVzdCBmcmFtZSBpcyBzcGVjaWZpZWQgYnkgYnl0ZSBjb3VudCBpbiB0eF9jbWQuCi0JICogQ2hhbm5lbCBsaXN0IGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJvYmUgcmVxdWVzdCBmcmFtZS4KLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gbGlzdCBpcyBzcGVjaWZpZWQgYnkgY2hhbm5lbF9jb3VudC4KLQkgKiBFYWNoIGNoYW5uZWwgaW4gbGlzdCBpcyBvZiB0eXBlOgotCSAqCi0JICogc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwgY2hhbm5lbHNbMF07Ci0JICoKLQkgKiBOT1RFOiAgT25seSBvbmUgYmFuZCBvZiBjaGFubmVscyBjYW4gYmUgc2Nhbm5lZCBwZXIgcGFzcy4gIFlvdQotCSAqIG11c3Qgbm90IG1peCAyLjRHSHogY2hhbm5lbHMgYW5kIDUuMkdIeiBjaGFubmVscywgYW5kIHlvdSBtdXN0IHdhaXQKLQkgKiBmb3Igb25lIHNjYW4gdG8gY29tcGxldGUgKGkuZS4gcmVjZWl2ZSBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTikKLQkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCi0JICovCi0JdTggZGF0YVswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIENhbiBhYm9ydCB3aWxsIG5vdGlmeSBieSBjb21wbGV0ZSBub3RpZmljYXRpb24gd2l0aCBhYm9ydCBzdGF0dXMuICovCi0jZGVmaW5lIENBTl9BQk9SVF9TVEFUVVMJY3B1X3RvX2xlMzIoMHgxKQotLyogY29tcGxldGUgbm90aWZpY2F0aW9uIHN0YXR1c2VzICovCi0jZGVmaW5lIEFCT1JUX1NUQVRVUyAgICAgICAgICAgIDB4MgotCi0vKgotICogUkVQTFlfU0NBTl9DTUQgPSAweDgwIChyZXNwb25zZSkKLSAqLwotc3RydWN0IGl3bF9zY2FucmVxX25vdGlmaWNhdGlvbiB7Ci0JX19sZTMyIHN0YXR1czsJCS8qIDE6IG9rYXksIDI6IGNhbm5vdCBmdWxmaWxsIHJlcXVlc3QgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTQ0FOX1NUQVJUX05PVElGSUNBVElPTiA9IDB4ODIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gewotCV9fbGUzMiB0c2ZfbG93OwotCV9fbGUzMiB0c2ZfaGlnaDsKLQlfX2xlMzIgYmVhY29uX3RpbWVyOwotCXU4IGNoYW5uZWw7Ci0JdTggYmFuZDsKLQl1OCByZXNlcnZlZFsyXTsKLQlfX2xlMzIgc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSAgU0NBTl9PV05FUl9TVEFUVVMgMHgxCi0jZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDIKLQotI2RlZmluZSBJV0xfUFJPQkVfU1RBVFVTX09LCQkwCi0jZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfVFhfRkFJTEVECUJJVCgwKQotLyogZXJyb3Igc3RhdHVzZXMgY29tYmluZWQgd2l0aCBUWF9GQUlMRUQgKi8KLSNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19GQUlMX1RUTAlCSVQoMSkKLSNkZWZpbmUgSVdMX1BST0JFX1NUQVRVU19GQUlMX0JUCUJJVCgyKQotCi0jZGVmaW5lIE5VTUJFUl9PRl9TVEFUSVNUSUNTIDEJLyogZmlyc3QgX19sZTMyIGlzIGdvb2QgQ1JDICovCi0vKgotICogU0NBTl9SRVNVTFRTX05PVElGSUNBVElPTiA9IDB4ODMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiB7Ci0JdTggY2hhbm5lbDsKLQl1OCBiYW5kOwotCXU4IHByb2JlX3N0YXR1czsKLQl1OCBudW1fcHJvYmVfbm90X3NlbnQ7IC8qIG5vdCBlbm91Z2ggdGltZSB0byBzZW5kICovCi0JX19sZTMyIHRzZl9sb3c7Ci0JX19sZTMyIHRzZl9oaWdoOwotCV9fbGUzMiBzdGF0aXN0aWNzW05VTUJFUl9PRl9TVEFUSVNUSUNTXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTiA9IDB4ODQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICovCi1zdHJ1Y3QgaXdsX3NjYW5jb21wbGV0ZV9ub3RpZmljYXRpb24gewotCXU4IHNjYW5uZWRfY2hhbm5lbHM7Ci0JdTggc3RhdHVzOwotCXU4IGxhc3RfY2hhbm5lbDsKLQlfX2xlMzIgdHNmX2xvdzsKLQlfX2xlMzIgdHNmX2hpZ2g7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICg5KQotICogSUJTUy9BUCBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWVudW0gaXdsX2lic3NfbWFuYWdlciB7Ci0JSVdMX05PVF9JQlNTX01BTkFHRVIgPSAwLAotCUlXTF9JQlNTX01BTkFHRVIgPSAxLAotfTsKLQotLyoKLSAqIEJFQUNPTl9OT1RJRklDQVRJT04gPSAweDkwIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKLSAqLwotCi1zdHJ1Y3QgaXdsMzk0NV9iZWFjb25fbm90aWYgewotCXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7Ci0JX19sZTMyIGxvd190c2Y7Ci0JX19sZTMyIGhpZ2hfdHNmOwotCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgewotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7Ci0JX19sZTMyIGxvd190c2Y7Ci0JX19sZTMyIGhpZ2hfdHNmOwotCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7Ci19IF9fcGFja2VkOwotCi0vKgotICogUkVQTFlfVFhfQkVBQ09OID0gMHg5MSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICovCi0KLXN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgewotCXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCB0eDsKLQlfX2xlMTYgdGltX2lkeDsKLQl1OCB0aW1fc2l6ZTsKLQl1OCByZXNlcnZlZDE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF90eF9iZWFjb25fY21kIHsKLQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eDsKLQlfX2xlMTYgdGltX2lkeDsKLQl1OCB0aW1fc2l6ZTsKLQl1OCByZXNlcnZlZDE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwotfSBfX3BhY2tlZDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDEwKQotICogU3RhdGlzdGljcyBDb21tYW5kcyBhbmQgTm90aWZpY2F0aW9uczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSVdMX1RFTVBfQ09OVkVSVCAyNjAKLQotI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAotI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAotI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKLQotLyogVXNlZCBmb3IgcGFzc2luZyB0byBkcml2ZXIgbnVtYmVyIG9mIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgcGVyIHJhdGUgKi8KLXN0cnVjdCByYXRlX2hpc3RvZ3JhbSB7Ci0JdW5pb24gewotCQlfX2xlMzIgYVtTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMU107Ci0JCV9fbGUzMiBiW1NVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTXTsKLQkJX19sZTMyIGdbU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFNdOwotCX0gc3VjY2VzczsKLQl1bmlvbiB7Ci0JCV9fbGUzMiBhW1NVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTXTsKLQkJX19sZTMyIGJbU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFNdOwotCQlfX2xlMzIgZ1tTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMU107Ci0JfSBmYWlsZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBzdGF0aXN0aWNzIGNvbW1hbmQgcmVzcG9uc2UgKi8KLQotc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnhfcGh5IHsKLQlfX2xlMzIgaW5hX2NudDsKLQlfX2xlMzIgZmluYV9jbnQ7Ci0JX19sZTMyIHBsY3BfZXJyOwotCV9fbGUzMiBjcmMzMl9lcnI7Ci0JX19sZTMyIG92ZXJydW5fZXJyOwotCV9fbGUzMiBlYXJseV9vdmVycnVuX2VycjsKLQlfX2xlMzIgY3JjMzJfZ29vZDsKLQlfX2xlMzIgZmFsc2VfYWxhcm1fY250OwotCV9fbGUzMiBmaW5hX3N5bmNfZXJyX2NudDsKLQlfX2xlMzIgc2ZkX3RpbWVvdXQ7Ci0JX19sZTMyIGZpbmFfdGltZW91dDsKLQlfX2xlMzIgdW5yZXNwb25kZWRfcnRzOwotCV9fbGUzMiByeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bjsKLQlfX2xlMzIgc2VudF9hY2tfY250OwotCV9fbGUzMiBzZW50X2N0c19jbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5IHsKLQlfX2xlMzIgYm9ndXNfY3RzOwkvKiBDVFMgcmVjZWl2ZWQgd2hlbiBub3QgZXhwZWN0aW5nIENUUyAqLwotCV9fbGUzMiBib2d1c19hY2s7CS8qIEFDSyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQUNLICovCi0JX19sZTMyIG5vbl9ic3NpZF9mcmFtZXM7CS8qIG51bWJlciBvZiBmcmFtZXMgd2l0aCBCU1NJRCB0aGF0Ci0JCQkJCSAqIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBTVEEgQlNTSUQgKi8KLQlfX2xlMzIgZmlsdGVyZWRfZnJhbWVzOwkvKiBjb3VudCBmcmFtZXMgdGhhdCB3ZXJlIGR1bXBlZCBpbiB0aGUKLQkJCQkgKiBmaWx0ZXJpbmcgcHJvY2VzcyAqLwotCV9fbGUzMiBub25fY2hhbm5lbF9iZWFjb25zOwkvKiBiZWFjb25zIHdpdGggb3VyIGJzcyBpZCBidXQgbm90IG9uCi0JCQkJCSAqIG91ciBzZXJ2aW5nIGNoYW5uZWwgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4IHsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgb2ZkbTsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgY2NrOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgZ2VuZXJhbDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4IHsKLQlfX2xlMzIgcHJlYW1ibGVfY250OwotCV9fbGUzMiByeF9kZXRlY3RlZF9jbnQ7Ci0JX19sZTMyIGJ0X3ByaW9fZGVmZXJfY250OwotCV9fbGUzMiBidF9wcmlvX2tpbGxfY250OwotCV9fbGUzMiBmZXdfYnl0ZXNfY250OwotCV9fbGUzMiBjdHNfdGltZW91dDsKLQlfX2xlMzIgYWNrX3RpbWVvdXQ7Ci0JX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7Ci0JX19sZTMyIGFjdHVhbF9hY2tfY250OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHN0YXRpc3RpY3NfZGJnIHsKLQlfX2xlMzIgYnVyc3RfY2hlY2s7Ci0JX19sZTMyIGJ1cnN0X2NvdW50OwotCV9fbGUzMiB3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY250OwotCV9fbGUzMiByZXNlcnZlZFszXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2RpdiB7Ci0JX19sZTMyIHR4X29uX2E7Ci0JX19sZTMyIHR4X29uX2I7Ci0JX19sZTMyIGV4ZWNfdGltZTsKLQlfX2xlMzIgcHJvYmVfdGltZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgewotCV9fbGUzMiB0ZW1wZXJhdHVyZTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOwotCV9fbGUzMiBzbGVlcF90aW1lOwotCV9fbGUzMiBzbG90c19vdXQ7Ci0JX19sZTMyIHNsb3RzX2lkbGU7Ci0JX19sZTMyIHR0bF90aW1lc3RhbXA7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2IGRpdjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSB7Ci0JX19sZTMyIGluYV9jbnQ7Ci0JX19sZTMyIGZpbmFfY250OwotCV9fbGUzMiBwbGNwX2VycjsKLQlfX2xlMzIgY3JjMzJfZXJyOwotCV9fbGUzMiBvdmVycnVuX2VycjsKLQlfX2xlMzIgZWFybHlfb3ZlcnJ1bl9lcnI7Ci0JX19sZTMyIGNyYzMyX2dvb2Q7Ci0JX19sZTMyIGZhbHNlX2FsYXJtX2NudDsKLQlfX2xlMzIgZmluYV9zeW5jX2Vycl9jbnQ7Ci0JX19sZTMyIHNmZF90aW1lb3V0OwotCV9fbGUzMiBmaW5hX3RpbWVvdXQ7Ci0JX19sZTMyIHVucmVzcG9uZGVkX3J0czsKLQlfX2xlMzIgcnhlX2ZyYW1lX2xpbWl0X292ZXJydW47Ci0JX19sZTMyIHNlbnRfYWNrX2NudDsKLQlfX2xlMzIgc2VudF9jdHNfY250OwotCV9fbGUzMiBzZW50X2JhX3JzcF9jbnQ7Ci0JX19sZTMyIGRzcF9zZWxmX2tpbGw7Ci0JX19sZTMyIG1oX2Zvcm1hdF9lcnI7Ci0JX19sZTMyIHJlX2FjcV9tYWluX3Jzc2lfc3VtOwotCV9fbGUzMiByZXNlcnZlZDM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3RhdGlzdGljc19yeF9odF9waHkgewotCV9fbGUzMiBwbGNwX2VycjsKLQlfX2xlMzIgb3ZlcnJ1bl9lcnI7Ci0JX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOwotCV9fbGUzMiBjcmMzMl9nb29kOwotCV9fbGUzMiBjcmMzMl9lcnI7Ci0JX19sZTMyIG1oX2Zvcm1hdF9lcnI7Ci0JX19sZTMyIGFnZ19jcmMzMl9nb29kOwotCV9fbGUzMiBhZ2dfbXBkdV9jbnQ7Ci0JX19sZTMyIGFnZ19jbnQ7Ci0JX19sZTMyIHVuc3VwcG9ydF9tY3M7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSAgICAgIGNwdV90b19sZTMyKDEpCi0KLXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgewotCV9fbGUzMiBib2d1c19jdHM7CS8qIENUUyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQ1RTICovCi0JX19sZTMyIGJvZ3VzX2FjazsJLyogQUNLIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBBQ0sgKi8KLQlfX2xlMzIgbm9uX2Jzc2lkX2ZyYW1lczsJLyogbnVtYmVyIG9mIGZyYW1lcyB3aXRoIEJTU0lEIHRoYXQKLQkJCQkJICogZG9lc24ndCBiZWxvbmcgdG8gdGhlIFNUQSBCU1NJRCAqLwotCV9fbGUzMiBmaWx0ZXJlZF9mcmFtZXM7CS8qIGNvdW50IGZyYW1lcyB0aGF0IHdlcmUgZHVtcGVkIGluIHRoZQotCQkJCSAqIGZpbHRlcmluZyBwcm9jZXNzICovCi0JX19sZTMyIG5vbl9jaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGJ1dCBub3Qgb24KLQkJCQkJICogb3VyIHNlcnZpbmcgY2hhbm5lbCAqLwotCV9fbGUzMiBjaGFubmVsX2JlYWNvbnM7CS8qIGJlYWNvbnMgd2l0aCBvdXIgYnNzIGlkIGFuZCBpbiBvdXIKLQkJCQkgKiBzZXJ2aW5nIGNoYW5uZWwgKi8KLQlfX2xlMzIgbnVtX21pc3NlZF9iY29uOwkvKiBudW1iZXIgb2YgbWlzc2VkIGJlYWNvbnMgKi8KLQlfX2xlMzIgYWRjX3J4X3NhdHVyYXRpb25fdGltZTsJLyogY291bnQgaW4gMC44dXMgdW5pdHMgdGhlIHRpbWUgdGhlCi0JCQkJCSAqIEFEQyB3YXMgaW4gc2F0dXJhdGlvbiAqLwotCV9fbGUzMiBpbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lOy8qIHRvdGFsIHRpbWUgKGluIDAuOHVzKSBzZWFyY2hlZAotCQkJCQkgICogZm9yIElOQSAqLwotCV9fbGUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2E7CS8qIFJTU0kgc2lsZW5jZSBhZnRlciBiZWFjb24gZnJhbWUgKi8KLQlfX2xlMzIgYmVhY29uX3NpbGVuY2VfcnNzaV9iOwkvKiBSU1NJIHNpbGVuY2UgYWZ0ZXIgYmVhY29uIGZyYW1lICovCi0JX19sZTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYzsJLyogUlNTSSBzaWxlbmNlIGFmdGVyIGJlYWNvbiBmcmFtZSAqLwotCV9fbGUzMiBpbnRlcmZlcmVuY2VfZGF0YV9mbGFnOwkvKiBmbGFnIGZvciBpbnRlcmZlcmVuY2UgZGF0YQotCQkJCQkgKiBhdmFpbGFiaWxpdHkuIDEgd2hlbiBkYXRhIGlzCi0JCQkJCSAqIGF2YWlsYWJsZS4gKi8KLQlfX2xlMzIgY2hhbm5lbF9sb2FkOwkJLyogY291bnRzIFJYIEVuYWJsZSB0aW1lIGluIHVTZWMgKi8KLQlfX2xlMzIgZHNwX2ZhbHNlX2FsYXJtczsJLyogRFNQIGZhbHNlIGFsYXJtIChib3RoIE9GRE0KLQkJCQkJICogYW5kIENDSykgY291bnRlciAqLwotCV9fbGUzMiBiZWFjb25fcnNzaV9hOwotCV9fbGUzMiBiZWFjb25fcnNzaV9iOwotCV9fbGUzMiBiZWFjb25fcnNzaV9jOwotCV9fbGUzMiBiZWFjb25fZW5lcmd5X2E7Ci0JX19sZTMyIGJlYWNvbl9lbmVyZ3lfYjsKLQlfX2xlMzIgYmVhY29uX2VuZXJneV9jOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHN0YXRpc3RpY3NfcnggewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBvZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBjY2s7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSBnZW5lcmFsOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSBvZmRtX2h0OwotfSBfX3BhY2tlZDsKLQotLyoqCi0gKiBzdHJ1Y3Qgc3RhdGlzdGljc190eF9wb3dlciAtIGN1cnJlbnQgdHggcG93ZXIKLSAqCi0gKiBAYW50X2E6IGN1cnJlbnQgdHggcG93ZXIgb24gY2hhaW4gYSBpbiAxLzIgZEIgc3RlcAotICogQGFudF9iOiBjdXJyZW50IHR4IHBvd2VyIG9uIGNoYWluIGIgaW4gMS8yIGRCIHN0ZXAKLSAqIEBhbnRfYzogY3VycmVudCB0eCBwb3dlciBvbiBjaGFpbiBjIGluIDEvMiBkQiBzdGVwCi0gKi8KLXN0cnVjdCBzdGF0aXN0aWNzX3R4X3Bvd2VyIHsKLQl1OCBhbnRfYTsKLQl1OCBhbnRfYjsKLQl1OCBhbnRfYzsKLQl1OCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3R4X25vbl9waHlfYWdnIHsKLQlfX2xlMzIgYmFfdGltZW91dDsKLQlfX2xlMzIgYmFfcmVzY2hlZHVsZV9mcmFtZXM7Ci0JX19sZTMyIHNjZF9xdWVyeV9hZ2dfZnJhbWVfY250OwotCV9fbGUzMiBzY2RfcXVlcnlfbm9fYWdnOwotCV9fbGUzMiBzY2RfcXVlcnlfYWdnOwotCV9fbGUzMiBzY2RfcXVlcnlfbWlzbWF0Y2g7Ci0JX19sZTMyIGZyYW1lX25vdF9yZWFkeTsKLQlfX2xlMzIgdW5kZXJydW47Ci0JX19sZTMyIGJ0X3ByaW9fa2lsbDsKLQlfX2xlMzIgcnhfYmFfcnNwX2NudDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX3R4IHsKLQlfX2xlMzIgcHJlYW1ibGVfY250OwotCV9fbGUzMiByeF9kZXRlY3RlZF9jbnQ7Ci0JX19sZTMyIGJ0X3ByaW9fZGVmZXJfY250OwotCV9fbGUzMiBidF9wcmlvX2tpbGxfY250OwotCV9fbGUzMiBmZXdfYnl0ZXNfY250OwotCV9fbGUzMiBjdHNfdGltZW91dDsKLQlfX2xlMzIgYWNrX3RpbWVvdXQ7Ci0JX19sZTMyIGV4cGVjdGVkX2Fja19jbnQ7Ci0JX19sZTMyIGFjdHVhbF9hY2tfY250OwotCV9fbGUzMiBkdW1wX21zZHVfY250OwotCV9fbGUzMiBidXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudDsKLQlfX2xlMzIgYnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudDsKLQlfX2xlMzIgY3RzX3RpbWVvdXRfY29sbGlzaW9uOwotCV9fbGUzMiBhY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb247Ci0Jc3RydWN0IHN0YXRpc3RpY3NfdHhfbm9uX3BoeV9hZ2cgYWdnOwotCi0JX19sZTMyIHJlc2VydmVkMTsKLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IHN0YXRpc3RpY3NfZGl2IHsKLQlfX2xlMzIgdHhfb25fYTsKLQlfX2xlMzIgdHhfb25fYjsKLQlfX2xlMzIgZXhlY190aW1lOwotCV9fbGUzMiBwcm9iZV90aW1lOwotCV9fbGUzMiByZXNlcnZlZDE7Ci0JX19sZTMyIHJlc2VydmVkMjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIHsKLQlfX2xlMzIgdGVtcGVyYXR1cmU7ICAgLyogcmFkaW8gdGVtcGVyYXR1cmUgKi8KLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOwotCV9fbGUzMiBzbGVlcF90aW1lOwotCV9fbGUzMiBzbG90c19vdXQ7Ci0JX19sZTMyIHNsb3RzX2lkbGU7Ci0JX19sZTMyIHR0bF90aW1lc3RhbXA7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGl2IGRpdjsKLQlfX2xlMzIgcnhfZW5hYmxlX2NvdW50ZXI7Ci0JLyoKLQkgKiBudW1fb2Zfc29zX3N0YXRlczoKLQkgKiAgY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIHRvIHJlLXR1bmUKLQkgKiAgaW4gb3JkZXIgdG8gZ2V0IG91dCBvZiBiYWQgUEhZIHN0YXR1cwotCSAqLwotCV9fbGUzMiBudW1fb2Zfc29zX3N0YXRlczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWwgewotCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIGNvbW1vbjsKLQlfX2xlMzIgcmVzZXJ2ZWQyOwotCV9fbGUzMiByZXNlcnZlZDM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLCQkoMHgxIDw8IDApCi0jZGVmaW5lIFVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSwkJKDB4MSA8PCAxKQotI2RlZmluZSBVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSwkoMHgxIDw8IDIpCi0KLS8qCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCA9IDB4OWMsCi0gKiBhbGwgZGV2aWNlcyBpZGVudGljYWwuCi0gKgotICogVGhpcyBjb21tYW5kIHRyaWdnZXJzIGFuIGltbWVkaWF0ZSByZXNwb25zZSBjb250YWluaW5nIHVDb2RlIHN0YXRpc3RpY3MuCi0gKiBUaGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OIDB4OWQsIGJlbG93LgotICoKLSAqIElmIHRoZSBDTEVBUl9TVEFUUyBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIGNsZWFyIGl0cwotICogaW50ZXJuYWwgY29weSBvZiB0aGUgc3RhdGlzdGljcyAoY291bnRlcnMpIGFmdGVyIGlzc3VpbmcgdGhlIHJlc3BvbnNlLgotICogVGhpcyBmbGFnIGRvZXMgbm90IGFmZmVjdCBTVEFUSVNUSUNTX05PVElGSUNBVElPTnMgYWZ0ZXIgYmVhY29ucyAoc2VlIGJlbG93KS4KLSAqCi0gKiBJZiB0aGUgRElTQUJMRV9OT1RJRiBjb25maWd1cmF0aW9uIGZsYWcgaXMgc2V0LCB1Q29kZSB3aWxsIG5vdCBpc3N1ZQotICogU1RBVElTVElDU19OT1RJRklDQVRJT05zIGFmdGVyIHJlY2VpdmVkIGJlYWNvbnMgKHNlZSBiZWxvdykuICBUaGlzIGZsYWcKLSAqIGRvZXMgbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UgdG8gdGhlIFJFUExZX1NUQVRJU1RJQ1NfQ01EIDB4OWMgaXRzZWxmLgotICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIGNwdV90b19sZTMyKDB4MSkJLyogc2VlIGFib3ZlICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0RJU0FCTEVfTk9USUYgY3B1X3RvX2xlMzIoMHgyKS8qIHNlZSBhYm92ZSAqLwotc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCB7Ci0JX19sZTMyIGNvbmZpZ3VyYXRpb25fZmxhZ3M7CS8qIElXTF9TVEFUU19DT05GXyogKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQotICoKLSAqIEJ5IGRlZmF1bHQsIHVDb2RlIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBhZnRlciByZWNlaXZpbmcgYSBiZWFjb24KLSAqIHdoaWxlIGFzc29jaWF0ZWQuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHNldCBESVNBQkxFX05PVElGIGZsYWcgaW4gdGhlCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCAweDljLCBhYm92ZS4KLSAqCi0gKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbnRpbnVlIHRvIGluY3JlbWVudCBiZWFjb24gYWZ0ZXIgYmVhY29uLCBidXQgYXJlCi0gKiBjbGVhcmVkIHdoZW4gY2hhbmdpbmcgY2hhbm5lbHMgb3Igd2hlbiBkcml2ZXIgaXNzdWVzIFJFUExZX1NUQVRJU1RJQ1NfQ01ECi0gKiAweDljIHdpdGggQ0xFQVJfU1RBVFMgYml0IHNldCAoc2VlIGFib3ZlKS4KLSAqCi0gKiB1Q29kZSBhbHNvIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBkdXJpbmcgc2NhbnMuICB1Q29kZSBjbGVhcnMgc3RhdGlzdGljcwotICogYXBwcm9wcmlhdGVseSBzbyB0aGF0IGVhY2ggbm90aWZpY2F0aW9uIGNvbnRhaW5zIHN0YXRpc3RpY3MgZm9yIG9ubHkgdGhlCi0gKiBvbmUgY2hhbm5lbCB0aGF0IGhhcyBqdXN0IGJlZW4gc2Nhbm5lZC4KLSAqLwotI2RlZmluZSBTVEFUSVNUSUNTX1JFUExZX0ZMR19CQU5EXzI0R19NU0sgICAgICAgICBjcHVfdG9fbGUzMigweDIpCi0jZGVmaW5lIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0sgICAgICAgIGNwdV90b19sZTMyKDB4OCkKLQotc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyB7Ci0JX19sZTMyIGZsYWc7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnggcng7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfdHggdHg7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZ2VuZXJhbCBnZW5lcmFsOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHsKLQlfX2xlMzIgZmxhZzsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeCByeDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCB0eDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsIGdlbmVyYWw7Ci19IF9fcGFja2VkOwotCi0vKgotICogTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OID0gMHhhMiAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCi0gKgotICogdUNvZGUgc2VuZCBNSVNTRURfQkVBQ09OU19OT1RJRklDQVRJT04gdG8gZHJpdmVyIHdoZW4gZGV0ZWN0IGJlYWNvbiBtaXNzZWQKLSAqIGluIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbWlzc2VkIGJlYWNvbnMsIHdoaWNoIG1lYW4gd2hlbiBkcml2ZXIgcmVjZWl2ZSB0aGUKLSAqIG5vdGlmaWNhdGlvbiwgaW5zaWRlIHRoZSBjb21tYW5kLCBpdCBjYW4gZmluZCBhbGwgdGhlIGJlYWNvbnMgaW5mb3JtYXRpb24KLSAqIHdoaWNoIGluY2x1ZGUgbnVtYmVyIG9mIHRvdGFsIG1pc3NlZCBiZWFjb25zLCBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkCi0gKiBiZWFjb25zLCBudW1iZXIgb2YgYmVhY29ucyByZWNlaXZlZCBhbmQgbnVtYmVyIG9mIGJlYWNvbnMgZXhwZWN0ZWQgdG8KLSAqIHJlY2VpdmUuCi0gKgotICogSWYgdUNvZGUgZGV0ZWN0ZWQgY29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnMgPiA1LCBpdCB3aWxsIHJlc2V0IHRoZSByYWRpbwotICogaW4gb3JkZXIgdG8gYnJpbmcgdGhlIHJhZGlvL1BIWSBiYWNrIHRvIHdvcmtpbmcgc3RhdGU7IHdoaWNoIGhhcyBubyByZWxhdGlvbgotICogdG8gd2hlbiBkcml2ZXIgd2lsbCBwZXJmb3JtIHNlbnNpdGl2aXR5IGNhbGlicmF0aW9uLgotICoKLSAqIERyaXZlciBzaG91bGQgc2V0IGl0IG93biBtaXNzZWRfYmVhY29uX3RocmVzaG9sZCB0byBkZWNpZGUgd2hlbiB0byBwZXJmb3JtCi0gKiBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbiBiYXNlZCBvbiBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkIGJlYWNvbnMgaW4KLSAqIG9yZGVyIHRvIGltcHJvdmUgb3ZlcmFsbCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBpbiBub2lzeSBlbnZpcm9ubWVudC4KLSAqCi0gKi8KLQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUlOCSgxKQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCSg1KQotI2RlZmluZSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYCUlXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUYKLQotc3RydWN0IGl3bF9taXNzZWRfYmVhY29uX25vdGlmIHsKLQlfX2xlMzIgY29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnM7Ci0JX19sZTMyIHRvdGFsX21pc3NlZF9iZWNvbnM7Ci0JX19sZTMyIG51bV9leHBlY3RlZF9iZWFjb25zOwotCV9fbGUzMiBudW1fcmVjdmRfYmVhY29uczsKLX0gX19wYWNrZWQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogKDExKQotICogUnggQ2FsaWJyYXRpb24gQ29tbWFuZHM6Ci0gKgotICogV2l0aCB0aGUgdUNvZGUgdXNlZCBmb3Igb3BlbiBzb3VyY2UgZHJpdmVycywgbW9zdCBUeCBjYWxpYnJhdGlvbiAoZXhjZXB0Ci0gKiBmb3IgVHggUG93ZXIpIGFuZCBtb3N0IFJ4IGNhbGlicmF0aW9uIGlzIGRvbmUgYnkgdUNvZGUgZHVyaW5nIHRoZQotICogImluaXRpYWxpemUiIHBoYXNlIG9mIHVDb2RlIGJvb3QuICBEcml2ZXIgbXVzdCBjYWxpYnJhdGUgb25seToKLSAqCi0gKiAxKSAgVHggcG93ZXIgKGRlcGVuZHMgb24gdGVtcGVyYXR1cmUpLCBkZXNjcmliZWQgZWxzZXdoZXJlCi0gKiAyKSAgUmVjZWl2ZXIgZ2FpbiBiYWxhbmNlIChvcHRpbWl6ZSBNSU1PLCBhbmQgZGV0ZWN0IGRpc2Nvbm5lY3RlZCBhbnRlbm5hcykKLSAqIDMpICBSZWNlaXZlciBzZW5zaXRpdml0eSAodG8gb3B0aW1pemUgc2lnbmFsIGRldGVjdGlvbikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogU0VOU0lUSVZJVFlfQ01EID0gMHhhOCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIFRoaXMgY29tbWFuZCBzZXRzIHVwIHRoZSBSeCBzaWduYWwgZGV0ZWN0b3IgZm9yIGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdAotICogaXMgaGlnaCBlbm91Z2ggdG8gbG9jayBvbnRvIGFsbCBzaWduYWxzIHdpdGhpbiB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrLAotICogYnV0IGxvdyBlbm91Z2ggdG8gaWdub3JlIHNpZ25hbHMgdGhhdCBhcmUgYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZCwgc28gYXMKLSAqIG5vdCB0byBoYXZlIHRvbyBtYW55ICJmYWxzZSBhbGFybXMiLiAgRmFsc2UgYWxhcm1zIGFyZSBzaWduYWxzIHRoYXQgdGhlCi0gKiBSeCBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLCBidXQgdGhlbiBkaXNjYXJkcyBhZnRlciBkZXRlcm1pbmluZyB0aGF0IHRoZXkKLSAqIGFyZSBub2lzZS4KLSAqCi0gKiBUaGUgb3B0aW11bSBudW1iZXIgb2YgZmFsc2UgYWxhcm1zIGlzIGJldHdlZW4gNSBhbmQgNTAgcGVyIDIwMCBUVXMKLSAqICgyMDAgKiAxMDI0IHVTZWNzLCBpLmUuIDIwNC44IG1pbGxpc2Vjb25kcykgb2YgYWN0dWFsIFJ4IHRpbWUgKGkuZS4KLSAqIHRpbWUgbGlzdGVuaW5nLCBub3QgdHJhbnNtaXR0aW5nKS4gIERyaXZlciBtdXN0IGFkanVzdCBzZW5zaXRpdml0eSBzbyB0aGF0Ci0gKiB0aGUgcmF0aW8gb2YgYWN0dWFsIGZhbHNlIGFsYXJtcyB0byBhY3R1YWwgUnggdGltZSBmYWxscyB3aXRoaW4gdGhpcyByYW5nZS4KLSAqCi0gKiBXaGlsZSBhc3NvY2lhdGVkLCB1Q29kZSBkZWxpdmVycyBTVEFUSVNUSUNTX05PVElGSUNBVElPTnMgYWZ0ZXIgZWFjaAotICogcmVjZWl2ZWQgYmVhY29uLiAgVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiB0byB0aGUgZHJpdmVyIHRvIGFuYWx5emUgdGhlCi0gKiBzZW5zaXRpdml0eS4gIERvbid0IGFuYWx5emUgc3RhdGlzdGljcyB0aGF0IGNvbWUgaW4gZnJvbSBzY2FubmluZywgb3IgYW55Ci0gKiBvdGhlciBub24tYXNzb2NpYXRlZC1uZXR3b3JrIHNvdXJjZS4gIFBlcnRpbmVudCBzdGF0aXN0aWNzIGluY2x1ZGU6Ci0gKgotICogRnJvbSAiZ2VuZXJhbCIgc3RhdGlzdGljcyAoc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSk6Ci0gKgotICogKGJlYWNvbl9lbmVyZ3lfW2FiY10gJiAweDBGRjAwKSA+PiA4ICh1bnNpZ25lZCwgaGlnaGVyIHZhbHVlIGlzIGxvd2VyIGxldmVsKQotICogICBNZWFzdXJlIG9mIGVuZXJneSBvZiBkZXNpcmVkIHNpZ25hbC4gIFVzZWQgZm9yIGVzdGFibGlzaGluZyBhIGxldmVsCi0gKiAgIGJlbG93IHdoaWNoIHRoZSBkZXZpY2UgZG9lcyBub3QgZGV0ZWN0IHNpZ25hbHMuCi0gKgotICogKGJlYWNvbl9zaWxlbmNlX3Jzc2lfW2FiY10gJiAweDBGRjAwKSA+PiA4ICh1bnNpZ25lZCwgdW5pdHMgaW4gZEIpCi0gKiAgIE1lYXN1cmUgb2YgYmFja2dyb3VuZCBub2lzZSBpbiBzaWxlbnQgcGVyaW9kIGFmdGVyIGJlYWNvbi4KLSAqCi0gKiBjaGFubmVsX2xvYWQKLSAqICAgdVNlY3Mgb2YgYWN0dWFsIFJ4IHRpbWUgZHVyaW5nIGJlYWNvbiBwZXJpb2QgKHZhcmllcyBhY2NvcmRpbmcgdG8KLSAqICAgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQgdHJhbnNtaXR0aW5nKS4KLSAqCi0gKiBGcm9tICJjY2siIGFuZCAib2ZkbSIgc3RhdGlzdGljcyAoc3RydWN0IHN0YXRpc3RpY3NfcnhfcGh5KSwgc2VwYXJhdGVseToKLSAqCi0gKiBmYWxzZV9hbGFybV9jbnQKLSAqICAgU2lnbmFsIGxvY2tzIGFiYW5kb25lZCBlYXJseSAoYmVmb3JlIHBoeS1sZXZlbCBoZWFkZXIpLgotICoKLSAqIHBsY3BfZXJyCi0gKiAgIFNpZ25hbCBsb2NrcyBhYmFuZG9uZWQgbGF0ZSAoZHVyaW5nIHBoeS1sZXZlbCBoZWFkZXIpLgotICoKLSAqIE5PVEU6ICBCb3RoIGZhbHNlX2FsYXJtX2NudCBhbmQgcGxjcF9lcnIgaW5jcmVtZW50IG1vbm90b25pY2FsbHkgZnJvbQotICogICAgICAgIGJlYWNvbiB0byBiZWFjb24sIGkuZS4gZWFjaCB2YWx1ZSBpcyBhbiBhY2N1bXVsYXRpb24gb2YgYWxsIGVycm9ycwotICogICAgICAgIGJlZm9yZSBhbmQgaW5jbHVkaW5nIHRoZSBsYXRlc3QgYmVhY29uLiAgVmFsdWVzIHdpbGwgd3JhcCBhcm91bmQgdG8gMAotICogICAgICAgIGFmdGVyIGNvdW50aW5nIHVwIHRvIDJeMzIgLSAxLiAgRHJpdmVyIG11c3QgZGlmZmVyZW50aWF0ZSB2cy4KLSAqICAgICAgICBwcmV2aW91cyBiZWFjb24ncyB2YWx1ZXMgdG8gZGV0ZXJtaW5lICMgZmFsc2UgYWxhcm1zIGluIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgYmVhY29uIHBlcmlvZC4KLSAqCi0gKiBUb3RhbCBudW1iZXIgb2YgZmFsc2UgYWxhcm1zID0gZmFsc2VfYWxhcm1zICsgcGxjcF9lcnJzCi0gKgotICogRm9yIE9GRE0sIGFkanVzdCB0aGUgZm9sbG93aW5nIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBPRkRNIGFyZSBhdCBvciBjbG9zZSB0byBzZXR0aW5ncyBmb3IKLSAqIG1heGltdW0gc2Vuc2l0aXZpdHkpOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCi0gKiAgIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgOTAgICAvICAgODUgIC8gIDEyMAotICogICBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMTcwICAgLyAgMTcwICAvICAyMTAKLSAqICAgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgIDEwNSAgIC8gIDEwNSAgLyAgMTQwCi0gKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAyMjAgICAvICAyMjAgIC8gIDI3MAotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgT0ZETSBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBoaWdoCi0gKiAgIChncmVhdGVyIHRoYW4gNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgcmVkdWNlIHNlbnNpdGl2aXR5Ci0gKiAgIGJ5ICphZGRpbmcqIDEgdG8gYWxsIDQgb2YgdGhlIHRhYmxlIGVudHJpZXMgYWJvdmUsIHVwIHRvIHRoZSBtYXggZm9yCi0gKiAgIGVhY2ggZW50cnkuICBDb252ZXJzZWx5LCBpZiBmYWxzZSBhbGFybSByYXRlIGlzIHRvbyBsb3cgKGxlc3MgdGhhbiA1Ci0gKiAgIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksICpzdWJ0cmFjdCogMSBmcm9tIGVhY2ggZW50cnkgdG8KLSAqICAgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkuCi0gKgotICogRm9yIENDSyBzZW5zaXRpdml0eSwga2VlcCB0cmFjayBvZiB0aGUgZm9sbG93aW5nOgotICoKLSAqICAgMSkuICAyMC1iZWFjb24gaGlzdG9yeSBvZiBtYXhpbXVtIGJhY2tncm91bmQgbm9pc2UsIGluZGljYXRlZCBieQotICogICAgICAgIChiZWFjb25fc2lsZW5jZV9yc3NpX1thYmNdICYgMHgwRkYwMCksIHVuaXRzIGluIGRCLCBhY3Jvc3MgdGhlCi0gKiAgICAgICAgMyByZWNlaXZlcnMuICBGb3IgYW55IGdpdmVuIGJlYWNvbiwgdGhlICJzaWxlbmNlIHJlZmVyZW5jZSIgaXMKLSAqICAgICAgICB0aGUgbWF4aW11bSBvZiBsYXN0IDYwIHNhbXBsZXMgKDIwIGJlYWNvbnMgKiAzIHJlY2VpdmVycykuCi0gKgotICogICAyKS4gIDEwLWJlYWNvbiBoaXN0b3J5IG9mIHN0cm9uZ2VzdCBzaWduYWwgbGV2ZWwsIGFzIGluZGljYXRlZAotICogICAgICAgIGJ5IChiZWFjb25fZW5lcmd5X1thYmNdICYgMHgwRkYwMCkgPj4gOCwgYWNyb3NzIHRoZSAzIHJlY2VpdmVycywKLSAqICAgICAgICBpLmUuIHRoZSBzdHJlbmd0aCBvZiB0aGUgc2lnbmFsIHRocm91Z2ggdGhlIGJlc3QgcmVjZWl2ZXIgYXQgdGhlCi0gKiAgICAgICAgbW9tZW50LiAgVGhlc2UgbWVhc3VyZW1lbnRzIGFyZSAidXBzaWRlIGRvd24iLCB3aXRoIGxvd2VyIHZhbHVlcwotICogICAgICAgIGZvciBzdHJvbmdlciBzaWduYWxzLCBzbyBtYXggZW5lcmd5IHdpbGwgYmUgKm1pbmltdW0qIHZhbHVlLgotICoKLSAqICAgICAgICBUaGVuIGZvciBhbnkgZ2l2ZW4gYmVhY29uLCB0aGUgZHJpdmVyIG11c3QgZGV0ZXJtaW5lIHRoZSAqd2Vha2VzdCoKLSAqICAgICAgICBvZiB0aGUgc3Ryb25nZXN0IHNpZ25hbHM7IHRoaXMgaXMgdGhlIG1pbmltdW0gbGV2ZWwgdGhhdCBuZWVkcyB0byBiZQotICogICAgICAgIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCwgd2hlbiB1c2luZyB0aGUgYmVzdCByZWNlaXZlciBhdCB0aGUgbW9tZW50LgotICogICAgICAgICJNYXggY2NrIGVuZXJneSIgaXMgdGhlIG1heGltdW0gKGhpZ2hlciB2YWx1ZSBtZWFucyBsb3dlciBlbmVyZ3khKQotICogICAgICAgIG9mIHRoZSBsYXN0IDEwIG1pbmltYS4gIE9uY2UgdGhpcyBpcyBkZXRlcm1pbmVkLCBkcml2ZXIgbXVzdCBhZGQKLSAqICAgICAgICBhIGxpdHRsZSBtYXJnaW4gYnkgYWRkaW5nICI2IiB0byBpdC4KLSAqCi0gKiAgIDMpLiAgTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbiBwZXJpb2RzIHdpdGggdG9vIGZldyBmYWxzZSBhbGFybXMuCi0gKiAgICAgICAgUmVzZXQgdGhpcyB0byAwIGF0IHRoZSBmaXJzdCBiZWFjb24gcGVyaW9kIHRoYXQgZmFsbHMgd2l0aGluIHRoZQotICogICAgICAgICJnb29kIiByYW5nZSAoNSB0byA1MCBmYWxzZSBhbGFybXMgcGVyIDIwNC44IG1pbGxpc2Vjb25kcyByeCkuCi0gKgotICogVGhlbiwgYWRqdXN0IHRoZSBmb2xsb3dpbmcgQ0NLIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBDQ0sgYXJlIGF0IG1heGltdW0gc2Vuc2l0aXZpdHkpOgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCi0gKiAgIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAxMjUgICAvICAxMjUgIC8gIDIwMAotICogICBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMjAwICAgLyAgMjAwICAvICA0MDAKLSAqICAgSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYICAgICAgICAgICAgICAgIDEwMCAgIC8gICAgMCAgLyAgMTAwCi0gKgotICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gaGlnaAotICogICAoZ3JlYXRlciB0aGFuIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIG1ldGhvZCBmb3IgcmVkdWNpbmcKLSAqICAgc2Vuc2l0aXZpdHkgaXM6Ci0gKgotICogICAxKSAgKkFkZCogMyB0byB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCwKLSAqICAgICAgIHVwIHRvIG1heCA0MDAuCi0gKgotICogICAyKSAgSWYgY3VycmVudCB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYIGlzIDwgMTYwLAotICogICAgICAgc2Vuc2l0aXZpdHkgaGFzIGJlZW4gcmVkdWNlZCBhIHNpZ25pZmljYW50IGFtb3VudDsgYnJpbmcgaXQgdXAgdG8KLSAqICAgICAgIGEgbW9kZXJhdGUgMTYxLiAgT3RoZXJ3aXNlLCAqYWRkKiAzLCB1cCB0byBtYXggMjAwLgotICoKLSAqICAgMykgIGEpICBJZiBjdXJyZW50IHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggaXMgPiAxNjAsCi0gKiAgICAgICBzZW5zaXRpdml0eSBoYXMgYmVlbiByZWR1Y2VkIG9ubHkgYSBtb2RlcmF0ZSBvciBzbWFsbCBhbW91bnQ7Ci0gKiAgICAgICAqc3VidHJhY3QqIDIgZnJvbSB2YWx1ZSBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVgsCi0gKiAgICAgICBkb3duIHRvIG1pbiAwLiAgT3RoZXJ3aXNlIChpZiBnYWluIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgcmVkdWNlZCksCi0gKiAgICAgICBkb24ndCBjaGFuZ2UgdGhlIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCB2YWx1ZS4KLSAqCi0gKiAgICAgICBiKSAgU2F2ZSBhIHNuYXBzaG90IG9mIHRoZSAic2lsZW5jZSByZWZlcmVuY2UiLgotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycykgaXMgdG9vIGxvdwotICogICAobGVzcyB0aGFuIDUgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgbWV0aG9kIGZvciBpbmNyZWFzaW5nCi0gKiAgIHNlbnNpdGl2aXR5IGlzIHVzZWQgb25seSBpZjoKLSAqCi0gKiAgIDFhKSAgUHJldmlvdXMgYmVhY29uIGRpZCBub3QgaGF2ZSB0b28gbWFueSBmYWxzZSBhbGFybXMKLSAqICAgMWIpICBBTkQgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZXZpb3VzICJzaWxlbmNlIHJlZmVyZW5jZSIgYW5kIGN1cnJlbnQKLSAqICAgICAgICAic2lsZW5jZSByZWZlcmVuY2UiIChwcmV2IC0gY3VycmVudCkgaXMgMiBvciBtb3JlLAotICogICBPUiAyKSAgMTAwIG9yIG1vcmUgY29uc2VjdXRpdmUgYmVhY29uIHBlcmlvZHMgaGF2ZSBoYWQgcmF0ZSBvZgotICogICAgICAgICAgbGVzcyB0aGFuIDUgZmFsc2UgYWxhcm1zIHBlciAyMDQuOCBtaWxsaXNlY29uZHMgcnggdGltZS4KLSAqCi0gKiAgIE1ldGhvZCBmb3IgaW5jcmVhc2luZyBzZW5zaXRpdml0eToKLSAqCi0gKiAgIDEpICAqU3VidHJhY3QqIDMgZnJvbSB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYLAotICogICAgICAgZG93biB0byBtaW4gMTI1LgotICoKLSAqICAgMikgICpTdWJ0cmFjdCogMyBmcm9tIHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYLAotICogICAgICAgZG93biB0byBtaW4gMjAwLgotICoKLSAqICAgMykgICpBZGQqIDIgdG8gdmFsdWUgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYLCB1cCB0byBtYXggMTAwLgotICoKLSAqICAgSWYgYWN0dWFsIHJhdGUgb2YgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycykgaXMgd2l0aGluIGdvb2QgcmFuZ2UKLSAqICAgKGJldHdlZW4gNSBhbmQgNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKToKLSAqCi0gKiAgIDEpICBTYXZlIGEgc25hcHNob3Qgb2YgdGhlIHNpbGVuY2UgcmVmZXJlbmNlLgotICoKLSAqICAgMikgIElmIHByZXZpb3VzIGJlYWNvbiBoYWQgdG9vIG1hbnkgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycyksCi0gKiAgICAgICBnaXZlIHNvbWUgZXh0cmEgbWFyZ2luIHRvIGVuZXJneSB0aHJlc2hvbGQgYnkgKnN1YnRyYWN0aW5nKiA4Ci0gKiAgICAgICBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWC4KLSAqCi0gKiAgIEZvciBhbGwgY2FzZXMgKHRvbyBmZXcsIHRvbyBtYW55LCBnb29kIHJhbmdlKSwgbWFrZSBzdXJlIHRoYXQgdGhlIENDSwotICogICBkZXRlY3Rpb24gdGhyZXNob2xkIChlbmVyZ3kpIGlzIGJlbG93IHRoZSBlbmVyZ3kgbGV2ZWwgZm9yIHJvYnVzdAotICogICBkZXRlY3Rpb24gb3ZlciB0aGUgcGFzdCAxMCBiZWFjb24gcGVyaW9kcywgdGhlICJNYXggY2NrIGVuZXJneSIuCi0gKiAgIExvd2VyIHZhbHVlcyBtZWFuIGhpZ2hlciBlbmVyZ3k7IHRoaXMgbWVhbnMgbWFraW5nIHN1cmUgdGhhdCB0aGUgdmFsdWUKLSAqICAgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYIGlzIGF0IG9yICphYm92ZSogIk1heCBjY2sgZW5lcmd5Ii4KLSAqCi0gKi8KLQotLyoKLSAqIFRhYmxlIGVudHJpZXMgaW4gU0VOU0lUSVZJVFlfQ01EIChzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCkKLSAqLwotI2RlZmluZSBIRF9UQUJMRV9TSVpFICAoMTEpCS8qIG51bWJlciBvZiBlbnRyaWVzICovCi0jZGVmaW5lIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCAgICAgICAgICAgICAgICAgKDApCS8qIHRhYmxlIGluZGV4ZXMgKi8KLSNkZWZpbmUgSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JTkRFWCAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoMikKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoMykKLSNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoNCkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoNSkKLSNkZWZpbmUgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAoNikKLSNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAgICAoNykKLSNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9NUkNfSU5ERVggICAgICAgICAoOCkKLSNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JTkRFWCAgICAgICAgICAoOSkKLSNkZWZpbmUgSERfT0ZETV9FTkVSR1lfVEhfSU5fSU5ERVggICAgICAgICAgICAgICAgICAoMTApCi0KLS8qIENvbnRyb2wgZmllbGQgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQgKi8KLSNkZWZpbmUgU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfREVGQVVMVF9UQUJMRQljcHVfdG9fbGUxNigwKQotI2RlZmluZSBTRU5TSVRJVklUWV9DTURfQ09OVFJPTF9XT1JLX1RBQkxFCWNwdV90b19sZTE2KDEpCi0KLS8qKgotICogc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKLSAqIEBjb250cm9sOiAgKDEpIHVwZGF0ZXMgd29ya2luZyB0YWJsZSwgKDApIHVwZGF0ZXMgZGVmYXVsdCB0YWJsZQotICogQHRhYmxlOiAgZW5lcmd5IHRocmVzaG9sZCB2YWx1ZXMsIHVzZSBIRF8qIGFzIGluZGV4IGludG8gdGFibGUKLSAqCi0gKiBBbHdheXMgdXNlICIxIiBpbiAiY29udHJvbCIgdG8gdXBkYXRlIHVDb2RlJ3Mgd29ya2luZyB0YWJsZSBhbmQgRFNQLgotICovCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZCB7Ci0JX19sZTE2IGNvbnRyb2w7CQkJLyogYWx3YXlzIHVzZSAiMSIgKi8KLQlfX2xlMTYgdGFibGVbSERfVEFCTEVfU0laRV07CS8qIHVzZSBIRF8qIGFzIGluZGV4ICovCi19IF9fcGFja2VkOwotCi0KLS8qKgotICogUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCA9IDB4YjAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKLSAqCi0gKiBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgcmVsYXRpdmUgZ2FpbnMgb2YgNDk2NSBkZXZpY2UncyAzIHJhZGlvIHJlY2VpdmVyIGNoYWlucy4KLSAqCi0gKiBBZnRlciB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIGRyaXZlciBzaG91bGQgYWNjdW11bGF0ZSBzaWduYWwgYW5kIG5vaXNlCi0gKiBzdGF0aXN0aWNzIGZyb20gdGhlIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OcyB0aGF0IGZvbGxvdyB0aGUgZmlyc3QgMjAKLSAqIGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIChkb24ndCBjb2xsZWN0IHN0YXRpc3RpY3MgdGhhdCBjb21lCi0gKiBpbiBmcm9tIHNjYW5uaW5nLCBvciBhbnkgb3RoZXIgbm9uLW5ldHdvcmsgc291cmNlKS4KLSAqCi0gKiBESVNDT05ORUNURUQgQU5URU5OQToKLSAqCi0gKiBEcml2ZXIgc2hvdWxkIGRldGVybWluZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLCBieSBjb21wYXJpbmcKLSAqIGF2ZXJhZ2UgYmVhY29uIHNpZ25hbCBsZXZlbHMgZm9yIHRoZSAzIFJ4IGNoYWlucy4gIEFjY3VtdWxhdGUgKGFkZCkgdGhlCi0gKiBmb2xsb3dpbmcgdmFsdWVzIG92ZXIgMjAgYmVhY29ucywgb25lIGFjY3VtdWxhdG9yIGZvciBlYWNoIG9mIHRoZSBjaGFpbnMKLSAqIGEvYi9jLCBmcm9tIHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHk6Ci0gKgotICogYmVhY29uX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQotICoKLSAqIEZpbmQgdGhlIHN0cm9uZ2VzdCBzaWduYWwgZnJvbSBhbW9uZyBhL2IvYy4gIENvbXBhcmUgdGhlIG90aGVyIHR3byB0byB0aGUKLSAqIHN0cm9uZ2VzdC4gIElmIGFueSBzaWduYWwgaXMgbW9yZSB0aGFuIDE1IGRCICh0aW1lcyAyMCwgdW5sZXNzIHlvdQotICogZGl2aWRlIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZXMgYnkgMjApIGJlbG93IHRoZSBzdHJvbmdlc3QsIHRoZSBkcml2ZXIKLSAqIGNvbnNpZGVycyB0aGF0IGFudGVubmEgdG8gYmUgZGlzY29ubmVjdGVkLCBhbmQgc2hvdWxkIG5vdCB0cnkgdG8gdXNlIHRoYXQKLSAqIGFudGVubmEvY2hhaW4gZm9yIFJ4IG9yIFR4LiAgSWYgYm90aCBBIGFuZCBCIHNlZW0gdG8gYmUgZGlzY29ubmVjdGVkLAotICogZHJpdmVyIHNob3VsZCBkZWNsYXJlIHRoZSBzdHJvbmdlciBvbmUgYXMgY29ubmVjdGVkLCBhbmQgYXR0ZW1wdCB0byB1c2UgaXQKLSAqIChBIGFuZCBCIGFyZSB0aGUgb25seSAyIFR4IGNoYWlucyEpLgotICoKLSAqCi0gKiBSWCBCQUxBTkNFOgotICoKLSAqIERyaXZlciBzaG91bGQgYmFsYW5jZSB0aGUgMyByZWNlaXZlcnMgKGJ1dCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIGNvbm5lY3RlZAotICogdG8gYW50ZW5uYXMsIHNlZSBhYm92ZSkgZm9yIGdhaW4sIGJ5IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBzaWduYWwgbGV2ZWxzCi0gKiBkZXRlY3RlZCBkdXJpbmcgdGhlIHNpbGVuY2UgYWZ0ZXIgZWFjaCBiZWFjb24gKGJhY2tncm91bmQgbm9pc2UpLgotICogQWNjdW11bGF0ZSAoYWRkKSB0aGUgZm9sbG93aW5nIHZhbHVlcyBvdmVyIDIwIGJlYWNvbnMsIG9uZSBhY2N1bXVsYXRvciBmb3IKLSAqIGVhY2ggb2YgdGhlIGNoYWlucyBhL2IvYywgZnJvbSBzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5OgotICoKLSAqIGJlYWNvbl9zaWxlbmNlX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQotICoKLSAqIEZpbmQgdGhlIHdlYWtlc3QgYmFja2dyb3VuZCBub2lzZSBsZXZlbCBmcm9tIGFtb25nIGEvYi9jLiAgVGhpcyBSeCBjaGFpbgotICogd2lsbCBiZSB0aGUgcmVmZXJlbmNlLCB3aXRoIDAgZ2FpbiBhZGp1c3RtZW50LiAgQXR0ZW51YXRlIG90aGVyIGNoYW5uZWxzIGJ5Ci0gKiBmaW5kaW5nIG5vaXNlIGRpZmZlcmVuY2U6Ci0gKgotICogKGFjY3VtX25vaXNlW2ldIC0gYWNjdW1fbm9pc2VbcmVmZXJlbmNlXSkgLyAzMAotICoKLSAqIFRoZSAiMzAiIGFkanVzdHMgdGhlIGRCIGluIHRoZSAyMCBhY2N1bXVsYXRlZCBzYW1wbGVzIHRvIHVuaXRzIG9mIDEuNSBkQi4KLSAqIEZvciB1c2UgaW4gZGlmZl9nYWluX1thYmNdIGZpZWxkcyBvZiBzdHJ1Y3QgaXdsX2NhbGlicmF0aW9uX2NtZCwgdGhlCi0gKiBkcml2ZXIgc2hvdWxkIGxpbWl0IHRoZSBkaWZmZXJlbmNlIHJlc3VsdHMgdG8gYSByYW5nZSBvZiAwLTMgKDAtNC41IGRCKSwKLSAqIGFuZCBzZXQgYml0IDIgdG8gaW5kaWNhdGUgInJlZHVjZSBnYWluIi4gIFRoZSB2YWx1ZSBmb3IgdGhlIHJlZmVyZW5jZQotICogKHdlYWtlc3QpIGNoYWluIHNob3VsZCBiZSAiMCIuCi0gKgotICogZGlmZl9nYWluX1thYmNdIGJpdCBmaWVsZHM6Ci0gKiAgIDI6ICgxKSByZWR1Y2UgZ2FpbiwgKDApIGluY3JlYXNlIGdhaW4KLSAqIDEtMDogYW1vdW50IG9mIGdhaW4sIHVuaXRzIG9mIDEuNSBkQgotICovCi0KLS8qIFBoeSBjYWxpYnJhdGlvbiBjb21tYW5kIGZvciBzZXJpZXMgKi8KLS8qIFRoZSBkZWZhdWx0IGNhbGlicmF0ZSB0YWJsZSBzaXplIGlmIG5vdCBzcGVjaWZpZWQgYnkgZmlybXdhcmUgKi8KLSNkZWZpbmUgSVdMX0RFRkFVTFRfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRQkxOAotZW51bSB7Ci0JSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRAkJPSA3LAotCUlXTF9NQVhfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRQk9IDE5LAotfTsKLQotI2RlZmluZSBJV0xfTUFYX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJCSgyNTMpCi0KLXN0cnVjdCBpd2xfY2FsaWJfaGRyIHsKLQl1OCBvcF9jb2RlOwotCXU4IGZpcnN0X2dyb3VwOwotCXU4IGdyb3Vwc19udW07Ci0JdTggZGF0YV92YWxpZDsKLX0gX19wYWNrZWQ7Ci0KLS8qIElXTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQgKDcpICovCi1zdHJ1Y3QgaXdsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgewotCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKLQlzOCBkaWZmX2dhaW5fYTsJCS8qIHNlZSBhYm92ZSAqLwotCXM4IGRpZmZfZ2Fpbl9iOwotCXM4IGRpZmZfZ2Fpbl9jOwotCXU4IHJlc2VydmVkMTsKLX0gX19wYWNrZWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxMikKLSAqIE1pc2NlbGxhbmVvdXMgQ29tbWFuZHM6Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogTEVEcyBDb21tYW5kICYgUmVzcG9uc2UKLSAqIFJFUExZX0xFRFNfQ01EID0gMHg0OCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQotICoKLSAqIEZvciBlYWNoIG9mIDMgcG9zc2libGUgTEVEcyAoQWN0aXZpdHkvTGluay9UZWNoLCBzZWxlY3RlZCBieSAiaWQiIGZpZWxkKSwKLSAqIHRoaXMgY29tbWFuZCB0dXJucyBpdCBvbiBvciBvZmYsIG9yIHNldHMgdXAgYSBwZXJpb2RpYyBibGlua2luZyBjeWNsZS4KLSAqLwotc3RydWN0IGl3bF9sZWRfY21kIHsKLQlfX2xlMzIgaW50ZXJ2YWw7CS8qICJpbnRlcnZhbCIgaW4gdVNlYyAqLwotCXU4IGlkOwkJCS8qIDE6IEFjdGl2aXR5LCAyOiBMaW5rLCAzOiBUZWNoICovCi0JdTggb2ZmOwkJCS8qICMgaW50ZXJ2YWxzIG9mZiB3aGlsZSBibGlua2luZzsKLQkJCQkgKiAiMCIsIHdpdGggPjAgIm9uIiB2YWx1ZSwgdHVybnMgTEVEIG9uICovCi0JdTggb247CQkJLyogIyBpbnRlcnZhbHMgb24gd2hpbGUgYmxpbmtpbmc7Ci0JCQkJICogIjAiLCByZWdhcmRsZXNzIG9mICJvZmYiLCB0dXJucyBMRUQgb2ZmICovCi0JdTggcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICgxMykKLSAqIFVuaW9uIG9mIGFsbCBleHBlY3RlZCBub3RpZmljYXRpb25zL3Jlc3BvbnNlczoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBpd2xfcnhfcGFja2V0IHsKLQkvKgotCSAqIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBSWCBmcmFtZSBoZWFkZXIgY29udGFpbiBib3RoIHRoZSBSWCBmcmFtZQotCSAqIHNpemUgYW5kIHNvbWUgZmxhZ3MuCi0JICogQml0IGZpZWxkczoKLQkgKiAzMTogICAgZmxhZyBmbHVzaCBSQiByZXF1ZXN0Ci0JICogMzA6ICAgIGZsYWcgaWdub3JlIFRDICh0ZXJtaW5hbCBjb3VudGVyKSByZXF1ZXN0Ci0JICogMjk6ICAgIGZsYWcgZmFzdCBJUlEgcmVxdWVzdAotCSAqIDI4LTE0OiBSZXNlcnZlZAotCSAqIDEzLTAwOiBSWCBmcmFtZSBzaXplCi0JICovCi0JX19sZTMyIGxlbl9uX2ZsYWdzOwotCXN0cnVjdCBpd2xfY21kX2hlYWRlciBoZHI7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZSByeF9mcmFtZTsKLQkJc3RydWN0IGl3bDM5NDVfdHhfcmVzcCB0eF9yZXNwOwotCQlzdHJ1Y3QgaXdsMzk0NV9iZWFjb25fbm90aWYgYmVhY29uX3N0YXR1czsKLQotCQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgYWxpdmVfZnJhbWU7Ci0JCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIHNwZWN0cnVtX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gY3NhX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2Vycm9yX3Jlc3AgZXJyX3Jlc3A7Ci0JCXN0cnVjdCBpd2xfY2FyZF9zdGF0ZV9ub3RpZiBjYXJkX3N0YXRlX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCBhZGRfc3RhOwotCQlzdHJ1Y3QgaXdsX3JlbV9zdGFfcmVzcCByZW1fc3RhOwotCQlzdHJ1Y3QgaXdsX3NsZWVwX25vdGlmaWNhdGlvbiBzbGVlcF9ub3RpZjsKLQkJc3RydWN0IGl3bF9zcGVjdHJ1bV9yZXNwIHNwZWN0cnVtOwotCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3Mgc3RhdHM7Ci0JCXN0cnVjdCBpd2xfY29tcHJlc3NlZF9iYV9yZXNwIGNvbXByZXNzZWRfYmE7Ci0JCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiBtaXNzZWRfYmVhY29uOwotCQlfX2xlMzIgc3RhdHVzOwotCQl1OCByYXdbMF07Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQotI2VuZGlmCQkJCS8qIF9faXdsX2xlZ2FjeV9jb21tYW5kc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ1NjU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotCi0KLU1PRFVMRV9ERVNDUklQVElPTigiaXdsLWxlZ2FjeTogY29tbW9uIGZ1bmN0aW9ucyBmb3IgMzk0NSBhbmQgNDk2NSIpOwotTU9EVUxFX1ZFUlNJT04oSVdMV0lGSV9WRVJTSU9OKTsKLU1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCAiICIgRFJWX0FVVEhPUik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qCi0gKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gdHJ1ZSwgdUNvZGUgd2lsbCBkbyBraWxsL2RlZmVyCi0gKiBldmVyeSB0aW1lIHRoZSBwcmlvcml0eSBsaW5lIGlzIGFzc2VydGVkIChCVCBpcyBzZW5kaW5nIHNpZ25hbHMgb24gdGhlCi0gKiBwcmlvcml0eSBsaW5lIGluIHRoZSBQQ0l4KS4KLSAqIHNldCBidF9jb2V4X2FjdGl2ZSB0byBmYWxzZSwgdUNvZGUgd2lsbCBpZ25vcmUgdGhlIEJUIGFjdGl2aXR5IGFuZAotICogcGVyZm9ybSB0aGUgbm9ybWFsIG9wZXJhdGlvbgotICoKLSAqIFVzZXIgbWlnaHQgZXhwZXJpZW5jZSB0cmFuc21pdCBpc3N1ZSBvbiBzb21lIHBsYXRmb3JtIGR1ZSB0byBXaUZpL0JUCi0gKiBjby1leGlzdCBwcm9ibGVtLiBUaGUgcG9zc2libGUgYmVoYXZpb3JzIGFyZToKLSAqICAgQWJsZSB0byBzY2FuIGFuZCBmaW5kaW5nIGFsbCB0aGUgYXZhaWxhYmxlIEFQCi0gKiAgIE5vdCBhYmxlIHRvIGFzc29jaWF0ZSB3aXRoIGFueSBBUAotICogT24gdGhvc2UgcGxhdGZvcm1zLCBXaUZpIGNvbW11bmljYXRpb24gY2FuIGJlIHJlc3RvcmVkIGJ5IHNldAotICogImJ0X2NvZXhfYWN0aXZlIiBtb2R1bGUgcGFyYW1ldGVyIHRvICJmYWxzZSIKLSAqCi0gKiBkZWZhdWx0OiBidF9jb2V4X2FjdGl2ZSA9IHRydWUgKEJUX0NPRVhfRU5BQkxFKQotICovCi1zdGF0aWMgYm9vbCBidF9jb2V4X2FjdGl2ZSA9IHRydWU7Ci1tb2R1bGVfcGFyYW0oYnRfY29leF9hY3RpdmUsIGJvb2wsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhidF9jb2V4X2FjdGl2ZSwgImVuYWJsZSB3aWZpL2JsdWV0b290aCBjby1leGlzdCIpOwotCi11MzIgaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci1FWFBPUlRfU1lNQk9MKGl3bGVnYWN5X2RlYnVnX2xldmVsKTsKLQotY29uc3QgdTggaXdsZWdhY3lfYmNhc3RfYWRkcltFVEhfQUxFTl0gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKLUVYUE9SVF9TWU1CT0woaXdsZWdhY3lfYmNhc3RfYWRkcik7Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBib3RoIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgaHcgYW5kIHByaXYuICovCi1zdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfbGVnYWN5X2FsbG9jX2FsbChzdHJ1Y3QgaXdsX2NmZyAqY2ZnKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCi0JICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpd2xfcHJpdiksCi0JCQkJY2ZnLT5vcHMtPmllZWU4MDIxMV9vcHMpOwotCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsCi0JCSAgICAgICBjZmctPm5hbWUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcml2ID0gaHctPnByaXY7Ci0JcHJpdi0+aHcgPSBodzsKLQotb3V0OgotCXJldHVybiBodzsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hbGxvY19hbGwpOwotCi0jZGVmaW5lIE1BWF9CSVRfUkFURV80MF9NSFogMTUwIC8qIE1icHMgKi8KLSNkZWZpbmUgTUFYX0JJVF9SQVRFXzIwX01IWiA3MiAvKiBNYnBzICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2luaXRfaHRfaHdfY2FwYWIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9pbmZvLAotCQkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCXUxNiBtYXhfYml0X3JhdGUgPSAwOwotCXU4IHJ4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMucnhfY2hhaW5zX251bTsKLQl1OCB0eF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07Ci0KLQlodF9pbmZvLT5jYXAgPSAwOwotCW1lbXNldCgmaHRfaW5mby0+bWNzLCAwLCBzaXplb2YoaHRfaW5mby0+bWNzKSk7Ci0KLQlodF9pbmZvLT5odF9zdXBwb3J0ZWQgPSB0cnVlOwotCi0JaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwotCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV8yMF9NSFo7Ci0JaWYgKHByaXYtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgJiBCSVQoYmFuZCkpIHsKLQkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOwotCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7Ci0JCWh0X2luZm8tPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQkJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzQwX01IWjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5hbXNkdV9zaXplXzhLKQotCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFU7Ci0KLQlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX0RFRjsKLQlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gQ0ZHX0hUX01QRFVfREVOU0lUWV9ERUY7Ci0KLQlodF9pbmZvLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JaWYgKHJ4X2NoYWluc19udW0gPj0gMikKLQkJaHRfaW5mby0+bWNzLnJ4X21hc2tbMV0gPSAweEZGOwotCWlmIChyeF9jaGFpbnNfbnVtID49IDMpCi0JCWh0X2luZm8tPm1jcy5yeF9tYXNrWzJdID0gMHhGRjsKLQotCS8qIEhpZ2hlc3Qgc3VwcG9ydGVkIFJ4IGRhdGEgcmF0ZSAqLwotCW1heF9iaXRfcmF0ZSAqPSByeF9jaGFpbnNfbnVtOwotCVdBUk5fT04obWF4X2JpdF9yYXRlICYgfklFRUU4MDIxMV9IVF9NQ1NfUlhfSElHSEVTVF9NQVNLKTsKLQlodF9pbmZvLT5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KG1heF9iaXRfcmF0ZSk7Ci0KLQkvKiBUeCBNQ1MgY2FwYWJpbGl0aWVzICovCi0JaHRfaW5mby0+bWNzLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRDsKLQlpZiAodHhfY2hhaW5zX251bSAhPSByeF9jaGFpbnNfbnVtKSB7Ci0JCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgfD0gSUVFRTgwMjExX0hUX01DU19UWF9SWF9ESUZGOwotCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9ICgodHhfY2hhaW5zX251bSAtIDEpIDw8Ci0JCQkJSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVCk7Ci0JfQotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfaW5pdF9nZW9zIC0gSW5pdGlhbGl6ZSBtYWM4MDIxMSdzIGdlby9jaGFubmVsIGluZm8gYmFzZWQgZnJvbSBlZXByb20KLSAqLwotaW50IGl3bF9sZWdhY3lfaW5pdF9nZW9zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2g7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsczsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmdlb19jaDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzOwotCWludCBpID0gMDsKLQlzOCBtYXhfdHhfcG93ZXIgPSAwOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fYml0cmF0ZXMgfHwKLQkgICAgcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9iaXRyYXRlcykgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiR2VvZ3JhcGh5IG1vZGVzIGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4iKTsKLQkJc2V0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljaGFubmVscyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKgotCQkJICAgcHJpdi0+Y2hhbm5lbF9jb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFubmVscykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyYXRlcyA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogSVdMX1JBVEVfQ09VTlRfTEVHQUNZKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghcmF0ZXMpIHsKLQkJa2ZyZWUoY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiA1LjJHSHogY2hhbm5lbHMgc3RhcnQgYWZ0ZXIgdGhlIDIuNEdIeiBjaGFubmVscyAqLwotCXNiYW5kID0gJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwotCXNiYW5kLT5jaGFubmVscyA9ICZjaGFubmVsc1tBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzEpXTsKLQkvKiBqdXN0IE9GRE0gKi8KLQlzYmFuZC0+Yml0cmF0ZXMgPSAmcmF0ZXNbSVdMX0ZJUlNUX09GRE1fUkFURV07Ci0Jc2JhbmQtPm5fYml0cmF0ZXMgPSBJV0xfUkFURV9DT1VOVF9MRUdBQ1kgLSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQotCQlpd2xfbGVnYWN5X2luaXRfaHRfaHdfY2FwYWIocHJpdiwgJnNiYW5kLT5odF9jYXAsCi0JCQkJCSBJRUVFODAyMTFfQkFORF81R0haKTsKLQotCXNiYW5kID0gJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCXNiYW5kLT5jaGFubmVscyA9IGNoYW5uZWxzOwotCS8qIE9GRE0gJiBDQ0sgKi8KLQlzYmFuZC0+Yml0cmF0ZXMgPSByYXRlczsKLQlzYmFuZC0+bl9iaXRyYXRlcyA9IElXTF9SQVRFX0NPVU5UX0xFR0FDWTsKLQotCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKLQkJaXdsX2xlZ2FjeV9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAotCQkJCQkgSUVFRTgwMjExX0JBTkRfMkdIWik7Ci0KLQlwcml2LT5pZWVlX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JcHJpdi0+aWVlZV9yYXRlcyA9IHJhdGVzOwotCi0JZm9yIChpID0gMDsgIGkgPCBwcml2LT5jaGFubmVsX2NvdW50OyBpKyspIHsKLQkJY2ggPSAmcHJpdi0+Y2hhbm5lbF9pbmZvW2ldOwotCi0JCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNiYW5kID0gJnByaXYtPmJhbmRzW2NoLT5iYW5kXTsKLQotCQlnZW9fY2ggPSAmc2JhbmQtPmNoYW5uZWxzW3NiYW5kLT5uX2NoYW5uZWxzKytdOwotCi0JCWdlb19jaC0+Y2VudGVyX2ZyZXEgPQotCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoLT5jaGFubmVsLCBjaC0+YmFuZCk7Ci0JCWdlb19jaC0+bWF4X3Bvd2VyID0gY2gtPm1heF9wb3dlcl9hdmc7Ci0JCWdlb19jaC0+bWF4X2FudGVubmFfZ2FpbiA9IDB4ZmY7Ci0JCWdlb19jaC0+aHdfdmFsdWUgPSBjaC0+Y2hhbm5lbDsKLQotCQlpZiAoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoKSkgewotCQkJaWYgKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykpCi0JCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9OT19JQlNTOwotCi0JCQlpZiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9BQ1RJVkUpKQotCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOwotCi0JCQlpZiAoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpCi0JCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUjsKLQotCQkJZ2VvX2NoLT5mbGFncyB8PSBjaC0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbDsKLQotCQkJaWYgKGNoLT5tYXhfcG93ZXJfYXZnID4gbWF4X3R4X3Bvd2VyKQotCQkJCW1heF90eF9wb3dlciA9IGNoLT5tYXhfcG93ZXJfYXZnOwotCQl9IGVsc2UgewotCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRDsKLQkJfQotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDaGFubmVsICVkIEZyZXE9JWRbJXNHSHpdICVzIGZsYWc9MHglWFxuIiwKLQkJCQljaC0+Y2hhbm5lbCwgZ2VvX2NoLT5jZW50ZXJfZnJlcSwKLQkJCQlpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoKSA/ICAiNS4yIiA6ICIyLjQiLAotCQkJCWdlb19jaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCA/Ci0JCQkJInJlc3RyaWN0ZWQiIDogInZhbGlkIiwKLQkJCQkgZ2VvX2NoLT5mbGFncyk7Ci0JfQotCi0JcHJpdi0+dHhfcG93ZXJfZGV2aWNlX2xtdCA9IG1heF90eF9wb3dlcjsKLQlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IG1heF90eF9wb3dlcjsKLQlwcml2LT50eF9wb3dlcl9uZXh0ID0gbWF4X3R4X3Bvd2VyOwotCi0JaWYgKChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzID09IDApICYmCi0JICAgICBwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfQSkgewotCQlJV0xfSU5GTyhwcml2LCAiSW5jb3JyZWN0bHkgZGV0ZWN0ZWQgQkcgY2FyZCBhcyBBQkcuICIKLQkJCSJQbGVhc2Ugc2VuZCB5b3VyIFBDSSBJRCAweCUwNFg6MHglMDRYIHRvIG1haW50YWluZXIuXG4iLAotCQkJICAgcHJpdi0+cGNpX2Rldi0+ZGV2aWNlLAotCQkJICAgcHJpdi0+cGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSk7Ci0JCXByaXYtPmNmZy0+c2t1ICY9IH5JV0xfU0tVX0E7Ci0JfQotCi0JSVdMX0lORk8ocHJpdiwgIlR1bmFibGUgY2hhbm5lbHM6ICVkIDgwMi4xMWJnLCAlZCA4MDIuMTFhIGNoYW5uZWxzXG4iLAotCQkgICBwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzLAotCQkgICBwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKTsKLQotCXNldF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2luaXRfZ2Vvcyk7Ci0KLS8qCi0gKiBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaXdsX2xlZ2FjeV9pbml0X2dlb3MKLSAqLwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+aWVlZV9jaGFubmVscyk7Ci0Ja2ZyZWUocHJpdi0+aWVlZV9yYXRlcyk7Ci0JY2xlYXJfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZnJlZV9nZW9zKTsKLQotc3RhdGljIGJvb2wgaXdsX2xlZ2FjeV9pc19jaGFubmVsX2V4dGVuc2lvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1MTYgY2hhbm5lbCwgdTggZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KQotewotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCi0JY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGV4dGVuc2lvbl9jaGFuX29mZnNldCA9PSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRSkKLQkJcmV0dXJuICEoY2hfaW5mby0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbCAmCi0JCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKTsKLQllbHNlIGlmIChleHRlbnNpb25fY2hhbl9vZmZzZXQgPT0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1cpCi0JCXJldHVybiAhKGNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJgotCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKQotewotCWlmICghY3R4LT5odC5lbmFibGVkIHx8ICFjdHgtPmh0LmlzXzQwbWh6KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKgotCSAqIFdlIGRvIG5vdCBjaGVjayBmb3IgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAKLQkgKiB0aGUgYml0IHdpbGwgbm90IHNldCBpZiBpdCBpcyBwdXJlIDQwTUh6IGNhc2UKLQkgKi8KLQlpZiAoaHRfY2FwICYmICFodF9jYXAtPmh0X3N1cHBvcnRlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpZiAocHJpdi0+ZGlzYWJsZV9odDQwKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotCXJldHVybiBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfZXh0ZW5zaW9uKHByaXYsIHByaXYtPmJhbmQsCi0JCQlsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksCi0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKTsKLQotc3RhdGljIHUxNiBpd2xfbGVnYWN5X2FkanVzdF9iZWFjb25faW50ZXJ2YWwodTE2IGJlYWNvbl92YWwsIHUxNiBtYXhfYmVhY29uX3ZhbCkKLXsKLQl1MTYgbmV3X3ZhbDsKLQl1MTYgYmVhY29uX2ZhY3RvcjsKLQotCS8qCi0JICogSWYgbWFjODAyMTEgaGFzbid0IGdpdmVuIHVzIGEgYmVhY29uIGludGVydmFsLCBwcm9ncmFtCi0JICogdGhlIGRlZmF1bHQgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCWlmICghYmVhY29uX3ZhbCkKLQkJcmV0dXJuIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMOwotCi0JLyoKLQkgKiBJZiB0aGUgYmVhY29uIGludGVydmFsIHdlIG9idGFpbmVkIGZyb20gdGhlIHBlZXIKLQkgKiBpcyB0b28gbGFyZ2UsIHdlJ2xsIGhhdmUgdG8gd2FrZSB1cCBtb3JlIG9mdGVuCi0JICogKGFuZCBpbiBJQlNTIGNhc2UsIHdlJ2xsIGJlYWNvbiB0b28gbXVjaCkKLQkgKgotCSAqIEZvciBleGFtcGxlLCBpZiBtYXhfYmVhY29uX3ZhbCBpcyA0MDk2LCBhbmQgdGhlCi0JICogcmVxdWVzdGVkIGJlYWNvbiBpbnRlcnZhbCBpcyA3MDAwLCB3ZSdsbCBoYXZlIHRvCi0JICogdXNlIDM1MDAgdG8gYmUgYWJsZSB0byB3YWtlIHVwIG9uIHRoZSBiZWFjb25zLgotCSAqCi0JICogVGhpcyBjb3VsZCBiYWRseSBpbmZsdWVuY2UgYmVhY29uIGRldGVjdGlvbiBzdGF0cy4KLQkgKi8KLQotCWJlYWNvbl9mYWN0b3IgPSAoYmVhY29uX3ZhbCArIG1heF9iZWFjb25fdmFsKSAvIG1heF9iZWFjb25fdmFsOwotCW5ld192YWwgPSBiZWFjb25fdmFsIC8gYmVhY29uX2ZhY3RvcjsKLQotCWlmICghbmV3X3ZhbCkKLQkJbmV3X3ZhbCA9IG1heF9iZWFjb25fdmFsOwotCi0JcmV0dXJuIG5ld192YWw7Ci19Ci0KLWludAotaXdsX2xlZ2FjeV9zZW5kX3J4b25fdGltaW5nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQl1NjQgdHNmOwotCXMzMiBpbnRlcnZhbF90bSwgcmVtOwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7Ci0JdTE2IGJlYWNvbl9pbnQ7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCi0JY29uZiA9IGl3bF9sZWdhY3lfaWVlZTgwMjExX2dldF9od19jb25mKHByaXYtPmh3KTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCW1lbXNldCgmY3R4LT50aW1pbmcsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3J4b25fdGltZV9jbWQpKTsKLQotCWN0eC0+dGltaW5nLnRpbWVzdGFtcCA9IGNwdV90b19sZTY0KHByaXYtPnRpbWVzdGFtcCk7Ci0JY3R4LT50aW1pbmcubGlzdGVuX2ludGVydmFsID0gY3B1X3RvX2xlMTYoY29uZi0+bGlzdGVuX2ludGVydmFsKTsKLQotCWJlYWNvbl9pbnQgPSB2aWYgPyB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOwotCi0JLyoKLQkgKiBUT0RPOiBGb3IgSUJTUyB3ZSBuZWVkIHRvIGdldCBhdGltX3dpbmRvdyBmcm9tIG1hYzgwMjExLAotCSAqCSBmb3Igbm93IGp1c3QgYWx3YXlzIHVzZSAwCi0JICovCi0JY3R4LT50aW1pbmcuYXRpbV93aW5kb3cgPSAwOwotCi0JYmVhY29uX2ludCA9IGl3bF9sZWdhY3lfYWRqdXN0X2JlYWNvbl9pbnRlcnZhbChiZWFjb25faW50LAotCQkJcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgKiBUSU1FX1VOSVQpOwotCWN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGJlYWNvbl9pbnQpOwotCi0JdHNmID0gcHJpdi0+dGltZXN0YW1wOyAvKiB0c2YgaXMgbW9kaWZlZCBieSBkb19kaXY6IGNvcHkgaXQgKi8KLQlpbnRlcnZhbF90bSA9IGJlYWNvbl9pbnQgKiBUSU1FX1VOSVQ7Ci0JcmVtID0gZG9fZGl2KHRzZiwgaW50ZXJ2YWxfdG0pOwotCWN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCA9IGNwdV90b19sZTMyKGludGVydmFsX3RtIC0gcmVtKTsKLQotCWN0eC0+dGltaW5nLmR0aW1fcGVyaW9kID0gdmlmID8gKHZpZi0+YnNzX2NvbmYuZHRpbV9wZXJpb2QgPzogMSkgOiAxOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsCi0JCQkiYmVhY29uIGludGVydmFsICVkIGJlYWNvbiB0aW1lciAlZCBiZWFjb24gdGltICVkXG4iLAotCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsKSwKLQkJCWxlMzJfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbml0X3ZhbCksCi0JCQlsZTE2X3RvX2NwdShjdHgtPnRpbWluZy5hdGltX3dpbmRvdykpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIGN0eC0+cnhvbl90aW1pbmdfY21kLAotCQkJCXNpemVvZihjdHgtPnRpbWluZyksICZjdHgtPnRpbWluZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyk7Ci0KLXZvaWQKLWl3bF9sZWdhY3lfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkJaW50IGh3X2RlY3J5cHQpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCi0JaWYgKGh3X2RlY3J5cHQpCi0JCXJ4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLOwotCWVsc2UKLQkJcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSzsKLQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKTsKLQotLyogdmFsaWRhdGUgUlhPTiBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KLWludAotaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCWJvb2wgZXJyb3IgPSBmYWxzZTsKLQotCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19UR0pfTkFSUk9XX0JBTkRfTVNLKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgMi40Rzogd3JvbmcgbmFycm93XG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19SQURBUl9ERVRFQ1RfTVNLKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgMi40Rzogd3JvbmcgcmFkYXJcbiIpOwotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCEocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKLQkJCUlXTF9XQVJOKHByaXYsICJjaGVjayA1LjJHOiBub3Qgc2hvcnQgc2xvdCFcbiIpOwotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCWlmIChyeG9uLT5mbGFncyAmIFJYT05fRkxHX0NDS19NU0spIHsKLQkJCUlXTF9XQVJOKHByaXYsICJjaGVjayA1LjJHOiBDQ0shXG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCX0KLQlpZiAoKHJ4b24tPm5vZGVfYWRkclswXSB8IHJ4b24tPmJzc2lkX2FkZHJbMF0pICYgMHgxKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJtYWMvYnNzaWQgbWNhc3QhXG4iKTsKLQkJZXJyb3IgPSB0cnVlOwotCX0KLQotCS8qIG1ha2Ugc3VyZSBiYXNpYyByYXRlcyA2TWJwcyBhbmQgMU1icHMgYXJlIHN1cHBvcnRlZCAqLwotCWlmICgocnhvbi0+b2ZkbV9iYXNpY19yYXRlcyAmIElXTF9SQVRFXzZNX01BU0spID09IDAgJiYKLQkgICAgKHJ4b24tPmNja19iYXNpY19yYXRlcyAmIElXTF9SQVRFXzFNX01BU0spID09IDApIHsKLQkJSVdMX1dBUk4ocHJpdiwgIm5laXRoZXIgMSBub3IgNiBhcmUgYmFzaWNcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKGxlMTZfdG9fY3B1KHJ4b24tPmFzc29jX2lkKSA+IDIwMDcpIHsKLQkJSVdMX1dBUk4ocHJpdiwgImFpZCA+IDIwMDdcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKQotCQkJPT0gKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkNDSyBhbmQgc2hvcnQgc2xvdFxuIik7Ci0JCWVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoKHJ4b24tPmZsYWdzICYgKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKQotCQkJPT0gKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0spKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJDQ0sgYW5kIGF1dG8gZGV0ZWN0Iik7Ci0JCWVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoKHJ4b24tPmZsYWdzICYgKFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8Ci0JCQkgICAgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSkgPT0KLQkJCSAgICBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spIHsKLQkJSVdMX1dBUk4ocHJpdiwgIlRHZyBidXQgbm8gYXV0by1kZXRlY3RcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKGVycm9yKQotCQlJV0xfV0FSTihwcml2LCAiVHVuaW5nIHRvIGNoYW5uZWwgJWRcbiIsCi0JCQkgICAgbGUxNl90b19jcHUocnhvbi0+Y2hhbm5lbCkpOwotCi0JaWYgKGVycm9yKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgUlhPTlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9mdWxsX3J4b25fcmVxdWlyZWQgLSBjaGVjayBpZiBmdWxsIFJYT04gKHZzIFJYT05fQVNTT0MpIGNtZCBpcyBuZWVkZWQKLSAqIEBwcml2OiBzdGFnaW5nX3J4b24gaXMgY29tcGFyZWQgdG8gYWN0aXZlX3J4b24KLSAqCi0gKiBJZiB0aGUgUlhPTiBzdHJ1Y3R1cmUgaXMgY2hhbmdpbmcgZW5vdWdoIHRvIHJlcXVpcmUgYSBuZXcgdHVuZSwKLSAqIG9yIGlzIGNsZWFyaW5nIHRoZSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0ssIHRoZW4gcmV0dXJuIDEgdG8gaW5kaWNhdGUgdGhhdAotICogYSBuZXcgdHVuZSAoZnVsbCBSWE9OIGNvbW1hbmQsIHJhdGhlciB0aGFuIFJYT05fQVNTT0MgY21kKSBpcyByZXF1aXJlZC4KLSAqLwotaW50IGl3bF9sZWdhY3lfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnN0YWdpbmcgPSAmY3R4LT5zdGFnaW5nOwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICphY3RpdmUgPSAmY3R4LT5hY3RpdmU7Ci0KLSNkZWZpbmUgQ0hLKGNvbmQpCQkJCQkJCVwKLQlpZiAoKGNvbmQpKSB7CQkJCQkJCVwKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIm5lZWQgZnVsbCBSWE9OIC0gIiAjY29uZCAiXG4iKTsJXAotCQlyZXR1cm4gMTsJCQkJCQlcCi0JfQotCi0jZGVmaW5lIENIS19ORVEoYzEsIGMyKQkJCQkJCVwKLQlpZiAoKGMxKSAhPSAoYzIpKSB7CQkJCQlcCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJuZWVkIGZ1bGwgUlhPTiAtICIJXAotCQkJICAgICAgICNjMSAiICE9ICIgI2MyICIgLSAlZCAhPSAlZFxuIiwJXAotCQkJICAgICAgIChjMSksIChjMikpOwkJCVwKLQkJcmV0dXJuIDE7CQkJCQlcCi0JfQotCi0JLyogVGhlc2UgaXRlbXMgYXJlIG9ubHkgc2V0dGFibGUgZnJvbSB0aGUgZnVsbCBSWE9OIGNvbW1hbmQgKi8KLQlDSEsoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSk7Ci0JQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ic3NpZF9hZGRyLCBhY3RpdmUtPmJzc2lkX2FkZHIpKTsKLQlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPm5vZGVfYWRkciwgYWN0aXZlLT5ub2RlX2FkZHIpKTsKLQlDSEsoY29tcGFyZV9ldGhlcl9hZGRyKHN0YWdpbmctPndsYXBfYnNzaWRfYWRkciwKLQkJCQlhY3RpdmUtPndsYXBfYnNzaWRfYWRkcikpOwotCUNIS19ORVEoc3RhZ2luZy0+ZGV2X3R5cGUsIGFjdGl2ZS0+ZGV2X3R5cGUpOwotCUNIS19ORVEoc3RhZ2luZy0+Y2hhbm5lbCwgYWN0aXZlLT5jaGFubmVsKTsKLQlDSEtfTkVRKHN0YWdpbmctPmFpcl9wcm9wYWdhdGlvbiwgYWN0aXZlLT5haXJfcHJvcGFnYXRpb24pOwotCUNIS19ORVEoc3RhZ2luZy0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzLAotCQlhY3RpdmUtPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyk7Ci0JQ0hLX05FUShzdGFnaW5nLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzLAotCQlhY3RpdmUtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMpOwotCUNIS19ORVEoc3RhZ2luZy0+YXNzb2NfaWQsIGFjdGl2ZS0+YXNzb2NfaWQpOwotCi0JLyogZmxhZ3MsIGZpbHRlcl9mbGFncywgb2ZkbV9iYXNpY19yYXRlcywgYW5kIGNja19iYXNpY19yYXRlcyBjYW4KLQkgKiBiZSB1cGRhdGVkIHdpdGggdGhlIFJYT05fQVNTT0MgY29tbWFuZCAtLSBob3dldmVyIG9ubHkgc29tZQotCSAqIGZsYWcgdHJhbnNpdGlvbnMgYXJlIGFsbG93ZWQgdXNpbmcgUlhPTl9BU1NPQyAqLwotCi0JLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBzd2l0Y2hpbmcgYmFuZHMgKi8KLQlDSEtfTkVRKHN0YWdpbmctPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLLAotCQlhY3RpdmUtPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKTsKLQotCS8qIENoZWNrIGlmIHdlIGFyZSBzd2l0Y2hpbmcgYXNzb2NpYXRpb24gdG9nZ2xlICovCi0JQ0hLX05FUShzdGFnaW5nLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0ssCi0JCWFjdGl2ZS0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKLQotI3VuZGVmIENISwotI3VuZGVmIENIS19ORVEKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZCk7Ci0KLXU4IGl3bF9sZWdhY3lfZ2V0X2xvd2VzdF9wbGNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCS8qCi0JICogQXNzaWduIHRoZSBsb3dlc3QgcmF0ZSAtLSBzaG91bGQgcmVhbGx5IGdldCB0aGlzIGZyb20KLQkgKiB0aGUgYmVhY29uIHNrYiBmcm9tIG1hYzgwMjExLgotCSAqLwotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spCi0JCXJldHVybiBJV0xfUkFURV8xTV9QTENQOwotCWVsc2UKLQkJcmV0dXJuIElXTF9SQVRFXzZNX1BMQ1A7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2xvd2VzdF9wbGNwKTsKLQotc3RhdGljIHZvaWQgX2l3bF9sZWdhY3lfc2V0X3J4b25faHQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7Ci0KLQlpZiAoIWN0eC0+aHQuZW5hYmxlZCkgewotCQlyeG9uLT5mbGFncyAmPSB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NU0sgfAotCQkJUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sgfAotCQkJUlhPTl9GTEdfSFQ0MF9QUk9UX01TSyB8Ci0JCQlSWE9OX0ZMR19IVF9QUk9UX01TSyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyeG9uLT5mbGFncyB8PSBjcHVfdG9fbGUzMihjdHgtPmh0LnByb3RlY3Rpb24gPDwKLQkJCQkJUlhPTl9GTEdfSFRfT1BFUkFUSU5HX01PREVfUE9TKTsKLQotCS8qIFNldCB1cCBjaGFubmVsIGJhbmR3aWR0aDoKLQkgKiAyMCBNSHogb25seSwgMjAvNDAgbWl4ZWQgb3IgcHVyZSA0MCBpZiBodDQwIG9rICovCi0JLyogY2xlYXIgdGhlIEhUIGNoYW5uZWwgbW9kZSBiZWZvcmUgc2V0IHRoZSBtb2RlICovCi0Jcnhvbi0+ZmxhZ3MgJj0gfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwKLQkJCSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSyk7Ci0JaWYgKGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHByaXYsIGN0eCwgTlVMTCkpIHsKLQkJLyogcHVyZSBodDQwICovCi0JCWlmIChjdHgtPmh0LnByb3RlY3Rpb24gPT0KLQkJCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OXzIwTUhaKSB7Ci0JCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfUFVSRV80MDsKLQkJCS8qIE5vdGU6IGNvbnRyb2wgY2hhbm5lbCBpcyBvcHBvc2l0ZSBvZiBleHRlbnNpb24gY2hhbm5lbCAqLwotCQkJc3dpdGNoIChjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCkgewotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCQlyeG9uLT5mbGFncyAmPQotCQkJCQl+UlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJCXJ4b24tPmZsYWdzIHw9Ci0JCQkJCVJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTm90ZTogY29udHJvbCBjaGFubmVsIGlzIG9wcG9zaXRlIG9mIGV4dGVuc2lvbiBjaGFubmVsICovCi0JCQlzd2l0Y2ggKGN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KSB7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCXJ4b24tPmZsYWdzICY9Ci0JCQkJCX4oUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spOwotCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQkJcnhvbi0+ZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0s7Ci0JCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOgotCQkJZGVmYXVsdDoKLQkJCQkvKiBjaGFubmVsIGxvY2F0aW9uIG9ubHkgdmFsaWQgaWYgaW4gTWl4ZWQgbW9kZSAqLwotCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJImludmFsaWQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9MRUdBQ1k7Ci0JfQotCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgInJ4b24gZmxhZ3MgMHglWCBvcGVyYXRpb24gbW9kZSA6MHglWCAiCi0JCQkiZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IDB4JXhcbiIsCi0JCQlsZTMyX3RvX2NwdShyeG9uLT5mbGFncyksIGN0eC0+aHQucHJvdGVjdGlvbiwKLQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KTsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQotCQlfaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mLCBjdHgpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2h0KTsKLQotLyogUmV0dXJuIHZhbGlkLCB1bnVzZWQsIGNoYW5uZWwgZm9yIGEgcGFzc2l2ZSBzY2FuIHRvIHJlc2V0IHRoZSBSRiAqLwotdTggaXdsX2xlZ2FjeV9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQotewotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCWludCBpOwotCXU4IGNoYW5uZWwgPSAwOwotCXU4IG1pbiwgbWF4OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCW1pbiA9IDE0OwotCQltYXggPSBwcml2LT5jaGFubmVsX2NvdW50OwotCX0gZWxzZSB7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IDE0OwotCX0KLQotCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCWJvb2wgYnVzeSA9IGZhbHNlOwotCi0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCQlidXN5ID0gcHJpdi0+Y2hhbm5lbF9pbmZvW2ldLmNoYW5uZWwgPT0KLQkJCQlsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7Ci0JCQlpZiAoYnVzeSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChidXN5KQotCQkJY29udGludWU7Ci0KLQkJY2hhbm5lbCA9IHByaXYtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsOwotCQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGJhbmQsIGNoYW5uZWwpOwotCQlpZiAoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNoYW5uZWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsIC0gU2V0IHRoZSBiYW5kIGFuZCBjaGFubmVsIHZhbHVlcyBpbiBzdGFnaW5nIFJYT04KLSAqIEBjaDogcmVxdWVzdGVkIGNoYW5uZWwgYXMgYSBwb2ludGVyIHRvIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAotCi0gKiBOT1RFOiAgRG9lcyBub3QgY29tbWl0IHRvIHRoZSBoYXJkd2FyZTsgaXQgc2V0cyBhcHByb3ByaWF0ZSBiaXQgZmllbGRzCi0gKiBpbiB0aGUgc3RhZ2luZyBSWE9OIGZsYWcgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSBjaC0+YmFuZAotICovCi1pbnQKLWl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2gsCi0JCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBjaC0+YmFuZDsKLQl1MTYgY2hhbm5lbCA9IGNoLT5od192YWx1ZTsKLQotCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpID09IGNoYW5uZWwpICYmCi0JICAgIChwcml2LT5iYW5kID09IGJhbmQpKQotCQlyZXR1cm4gMDsKLQotCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0JaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19CQU5EXzI0R19NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwotCi0JcHJpdi0+YmFuZCA9IGJhbmQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhZ2luZyBjaGFubmVsIHNldCB0byAlZCBbJWRdXG4iLCBjaGFubmVsLCBiYW5kKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwpOwotCi12b2lkIGl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCSAgICB+KFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSwotCQkgICAgICB8IFJYT05fRkxHX0NDS19NU0spOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfSBlbHNlIHsKLQkJLyogQ29waWVkIGZyb20gaXdsX3Bvc3RfYXNzb2NpYXRlKCkgKi8KLQkJaWYgKHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0s7Ci0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7Ci0JCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfQ0NLX01TSzsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKTsKLQotLyoKLSAqIGluaXRpYWxpemUgcnhvbiBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcyBmcm9tIGVlcHJvbQotICovCi12b2lkIGl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQotCW1lbXNldCgmY3R4LT5zdGFnaW5nLCAwLCBzaXplb2YoY3R4LT5zdGFnaW5nKSk7Ci0KLQlpZiAoIWN0eC0+dmlmKSB7Ci0JCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+dW51c2VkX2RldnR5cGU7Ci0JfSBlbHNlCi0Jc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgewotCi0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPnN0YXRpb25fZGV2dHlwZTsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwotCQlicmVhazsKLQotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+aWJzc19kZXZ0eXBlOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPSBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyB8Ci0JCQkJCQkgIFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVuc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlICVkXG4iLAotCQkJY3R4LT52aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLSNpZiAwCi0JLyogVE9ETzogIEZpZ3VyZSBvdXQgd2hlbiBzaG9ydF9wcmVhbWJsZSB3b3VsZCBiZSBzZXQgYW5kIGNhY2hlIGZyb20KLQkgKiB0aGF0ICovCi0JaWYgKCFod190b19sb2NhbChwcml2LT5odyktPnNob3J0X3ByZWFtYmxlKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQllbHNlCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0jZW5kaWYKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwKLQkJCQkgICAgICAgbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkpOwotCi0JaWYgKCFjaF9pbmZvKQotCQljaF9pbmZvID0gJnByaXYtPmNoYW5uZWxfaW5mb1swXTsKLQotCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hfaW5mby0+Y2hhbm5lbCk7Ci0JcHJpdi0+YmFuZCA9IGNoX2luZm8tPmJhbmQ7Ci0KLQlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIHByaXYtPmJhbmQsIGN0eC0+dmlmKTsKLQotCWN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KLQkgICAgKElXTF9PRkRNX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOwotCWN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQotCSAgICAoSVdMX0NDS19SQVRFU19NQVNLID4+IElXTF9GSVJTVF9DQ0tfUkFURSkgJiAweEY7Ci0KLQkvKiBjbGVhciBib3RoIE1JWCBhbmQgUFVSRTQwIG1vZGUgZmxhZyAqLwotCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+KFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRCB8Ci0JCQkJCVJYT05fRkxHX0NIQU5ORUxfTU9ERV9QVVJFXzQwKTsKLQlpZiAoY3R4LT52aWYpCi0JCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLCBjdHgtPnZpZi0+YWRkciwgRVRIX0FMRU4pOwotCi0JY3R4LT5zdGFnaW5nLm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyA9IDB4ZmY7Ci0JY3R4LT5zdGFnaW5nLm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcpOwotCi12b2lkIGl3bF9sZWdhY3lfc2V0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmh3ID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGU7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgaTsKLQotCWh3ID0gaXdsX2dldF9od19tb2RlKHByaXYsIHByaXYtPmJhbmQpOwotCWlmICghaHcpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHNldCByYXRlOiB1bmFibGUgdG8gZ2V0IGh3IG1vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+YWN0aXZlX3JhdGUgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGh3LT5uX2JpdHJhdGVzOyBpKyspIHsKLQkJcmF0ZSA9ICYoaHctPmJpdHJhdGVzW2ldKTsKLQkJaWYgKHJhdGUtPmh3X3ZhbHVlIDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQotCQkJcHJpdi0+YWN0aXZlX3JhdGUgfD0gKDEgPDwgcmF0ZS0+aHdfdmFsdWUpOwotCX0KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJTZXQgYWN0aXZlX3JhdGUgPSAlMHhcbiIsIHByaXYtPmFjdGl2ZV9yYXRlKTsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQotCQkgICAgKElXTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfQ0NLX1JBVEUpICYgMHhGOwotCi0JCWN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzID0KLQkJICAgKElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfcmF0ZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc19zdWNjZXNzKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgaXNfc3VjY2Vzcyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gKmNzYSA9ICYocGt0LT51LmNzYV9ub3RpZik7Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFsZTMyX3RvX2NwdShjc2EtPnN0YXR1cykgJiYgY3NhLT5jaGFubmVsID09IHByaXYtPnN3aXRjaF9jaGFubmVsKSB7Ci0JCXJ4b24tPmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7Ci0JCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQlJV0xfREVCVUdfMTFIKHByaXYsICJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsCi0JCQkgICAgICBsZTE2X3RvX2NwdShjc2EtPmNoYW5uZWwpKTsKLQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIHRydWUpOwotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAotCQkJbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCBmYWxzZSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X2NzYSk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXZvaWQgaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7Ci0KLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgIlJYIENPTkZJRzpcbiIpOwotCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfUkFESU8sICh1OCAqKSByeG9uLCBzaXplb2YoKnJ4b24pKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUxNiBjaGFubmVsOiAweCV4XG4iLAotCQkJCWxlMTZfdG9fY3B1KHJ4b24tPmNoYW5uZWwpKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUzMiBmbGFnczogMHglMDhYXG4iLCBsZTMyX3RvX2NwdShyeG9uLT5mbGFncykpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTMyIGZpbHRlcl9mbGFnczogMHglMDh4XG4iLAotCQkJCWxlMzJfdG9fY3B1KHJ4b24tPmZpbHRlcl9mbGFncykpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTggZGV2X3R5cGU6IDB4JXhcbiIsIHJ4b24tPmRldl90eXBlKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4IG9mZG1fYmFzaWNfcmF0ZXM6IDB4JTAyeFxuIiwKLQkJCXJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidTggY2NrX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsCi0JCQkJcnhvbi0+Y2NrX2Jhc2ljX3JhdGVzKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4WzZdIG5vZGVfYWRkcjogJXBNXG4iLCByeG9uLT5ub2RlX2FkZHIpOwotCUlXTF9ERUJVR19SQURJTyhwcml2LCAidThbNl0gYnNzaWRfYWRkcjogJXBNXG4iLCByeG9uLT5ic3NpZF9hZGRyKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUxNiBhc3NvY19pZDogMHgleFxuIiwKLQkJCQlsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQpOwotI2VuZGlmCi0vKioKLSAqIGl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvciAtIGNhbGxlZCBmb3IgSFcgb3IgU1cgZXJyb3IgaW50ZXJydXB0IGZyb20gY2FyZAotICovCi12b2lkIGl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogU2V0IHRoZSBGVyBlcnJvciBmbGFnIC0tIGNsZWFyZWQgb24gaXdsX2Rvd24gKi8KLQlzZXRfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBDYW5jZWwgY3VycmVudGx5IHF1ZXVlZCBjb21tYW5kLiAqLwotCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCi0JSVdMX0VSUihwcml2LCAiTG9hZGVkIGZpcm13YXJlIHZlcnNpb246ICVzXG4iLAotCQlwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pOwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9uaWNfZXJyb3JfbG9nKHByaXYpOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKQotCQlwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKHByaXYsIE5VTEwsIGZhbHNlKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfRldfRVJST1JTKQotCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwKLQkJCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLSNlbmRpZgotCi0Jd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCS8qIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKLQkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0ICovCi0JY2xlYXJfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVRyhwcml2LCBJV0xfRExfRldfRVJST1JTLAotCQkJICAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byB1Q29kZSBlcnJvci5cbiIpOwotCi0JCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpCi0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKTsKLQotc3RhdGljIGludCBpd2xfbGVnYWN5X2FwbV9zdG9wX21hc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBzdG9wIGRldmljZSdzIGJ1c21hc3RlciBETUEgYWN0aXZpdHkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIpOwotCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX01BU1RFUl9ESVNBQkxFRCwKLQkJCUNTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQsIDEwMCk7Ci0JaWYgKHJldCkKLQkJSVdMX1dBUk4ocHJpdiwgIk1hc3RlciBEaXNhYmxlIFRpbWVkIE91dCwgMTAwIHVzZWNcbiIpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInN0b3AgbWFzdGVyXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9hcG1fc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0b3AgY2FyZCwgcHV0IGluIGxvdyBwb3dlciBzdGF0ZVxuIik7Ci0KLQkvKiBTdG9wIGRldmljZSdzIERNQSBhY3Rpdml0eSAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3BfbWFzdGVyKHByaXYpOwotCi0JLyogUmVzZXQgdGhlIGVudGlyZSBkZXZpY2UgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpOwotCi0JdWRlbGF5KDEwKTsKLQotCS8qCi0JICogQ2xlYXIgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KLQkgKiBEMEEqIChwb3dlcmVkLXVwIEFjdGl2ZSkgLS0+IEQwVSogKFVuaW5pdGlhbGl6ZWQpIHN0YXRlLgotCSAqLwotCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hcG1fc3RvcCk7Ci0KLQotLyoKLSAqIFN0YXJ0IHVwIE5JQydzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVzZXQKLSAqIChlLmcuIGFmdGVyIHBsYXRmb3JtIGJvb3QsIG9yIHNodXRkb3duIHZpYSBpd2xfbGVnYWN5X2FwbV9zdG9wKCkpCi0gKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCi0gKi8KLWludCBpd2xfbGVnYWN5X2FwbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgbGN0bDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0IGNhcmQncyBiYXNpYyBmdW5jdGlvbnNcbiIpOwotCi0JLyoKLQkgKiBVc2UgInNldF9iaXQiIGJlbG93IHJhdGhlciB0aGFuICJ3cml0ZSIsIHRvIHByZXNlcnZlIGFueSBoYXJkd2FyZQotCSAqIGJpdHMgYWxyZWFkeSBzZXQgYnkgZGVmYXVsdCBhZnRlciByZXNldC4KLQkgKi8KLQotCS8qIERpc2FibGUgTDBTIGV4aXQgdGltZXIgKHBsYXRmb3JtIE5NSSBXb3JrL0Fyb3VuZCkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dJT19DSElDS0VOX0JJVFMsCi0JCQkgIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfRElTX0wwU19FWElUX1RJTUVSKTsKLQotCS8qCi0JICogRGlzYWJsZSBMMHMgd2l0aG91dCBhZmZlY3RpbmcgTDE7Ci0JICogIGRvbid0IHdhaXQgZm9yIElDSCBMMHMgKElDSCBidWcgVy9BKQotCSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR0lPX0NISUNLRU5fQklUUywKLQkJCSAgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9MMUFfTk9fTDBTX1JYKTsKLQotCS8qIFNldCBGSCB3YWl0IHRocmVzaG9sZCB0byBtYXhpbXVtIChIVyBlcnJvciBkdXJpbmcgc3RyZXNzIFcvQSkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0RCR19IUEVUX01FTV9SRUcsCi0JCQkJCUNTUl9EQkdfSFBFVF9NRU1fUkVHX1ZBTCk7Ci0KLQkvKgotCSAqIEVuYWJsZSBIQVAgSU5UQSAoaW50ZXJydXB0IGZyb20gbWFuYWdlbWVudCBidXMpIHRvCi0JICogd2FrZSBkZXZpY2UncyBQQ0kgRXhwcmVzcyBsaW5rIEwxYSAtPiBMMHMKLQkgKiBOT1RFOiAgVGhpcyBpcyBuby1vcCBmb3IgMzk0NSAobm9uLWV4aXN0ZW50IGJpdCkKLQkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9IQVBfV0FLRV9MMUEpOwotCi0JLyoKLQkgKiBIVyBidWcgVy9BIGZvciBpbnN0YWJpbGl0eSBpbiBQQ0llIGJ1cyBMMC0+TDBTLT5MMSB0cmFuc2l0aW9uLgotCSAqIENoZWNrIGlmIEJJT1MgKG9yIE9TKSBlbmFibGVkIEwxLUFTUE0gb24gdGhpcyBkZXZpY2UuCi0JICogSWYgc28gKGxpa2VseSksIGRpc2FibGUgTDBTLCBzbyBkZXZpY2UgbW92ZXMgZGlyZWN0bHkgTDAtPkwxOwotCSAqICAgIGNvc3RzIG5lZ2xpZ2libGUgYW1vdW50IG9mIHBvd2VyIHNhdmluZ3MuCi0JICogSWYgbm90ICh1bmxpa2VseSksIGVuYWJsZSBMMFMsIHNvIHRoZXJlIGlzIGF0IGxlYXN0IHNvbWUKLQkgKiAgICBwb3dlciBzYXZpbmdzLCBldmVuIHdpdGhvdXQgTDEuCi0JICovCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNldF9sMHMpIHsKLQkJbGN0bCA9IGl3bF9sZWdhY3lfcGNpZV9saW5rX2N0bChwcml2KTsKLQkJaWYgKChsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOKSA9PQotCQkJCQlQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pIHsKLQkJCS8qIEwxLUFTUE0gZW5hYmxlZDsgZGlzYWJsZSghKSBMMFMgICovCi0JCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dJT19SRUcsCi0JCQkJCUNTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7Ci0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIEVuYWJsZWQ7IERpc2FibGluZyBMMFNcbiIpOwotCQl9IGVsc2UgewotCQkJLyogTDEtQVNQTSBkaXNhYmxlZDsgZW5hYmxlKCEpIEwwUyAqLwotCQkJaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dJT19SRUcsCi0JCQkJCUNTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRCk7Ci0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkwxIERpc2FibGVkOyBFbmFibGluZyBMMFNcbiIpOwotCQl9Ci0JfQotCi0JLyogQ29uZmlndXJlIGFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgYmVmb3JlIGFjdGl2YXRpbmcgdG8gRDBBICovCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0FOQV9QTExfQ0ZHLAotCQkJICAgIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKTsKLQotCS8qCi0JICogU2V0ICJpbml0aWFsaXphdGlvbiBjb21wbGV0ZSIgYml0IHRvIG1vdmUgYWRhcHRlciBmcm9tCi0JICogRDBVKiAtLT4gRDBBKiAocG93ZXJlZC11cCBhY3RpdmUpIHN0YXRlLgotCSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBjbG9jayBzdGFiaWxpemF0aW9uOyBvbmNlIHN0YWJpbGl6ZWQsIGFjY2VzcyB0bwotCSAqIGRldmljZS1pbnRlcm5hbCByZXNvdXJjZXMgaXMgc3VwcG9ydGVkLCBlLmcuIGl3bF9sZWdhY3lfd3JpdGVfcHJwaCgpCi0JICogYW5kIGFjY2Vzc2VzIHRvIHVDb2RlIFNSQU0uCi0JICovCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQ0xPQ0tfUkVBRFksCi0JCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLCAyNTAwMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZhaWxlZCB0byBpbml0IHRoZSBjYXJkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgRE1BIGFuZCBCU00gKGlmIHVzZWQpIGNsb2Nrcywgd2FpdCBmb3IgdGhlbSB0byBzdGFiaWxpemUuCi0JICogQlNNIChCb29zdHJhcCBTdGF0ZSBNYWNoaW5lKSBpcyBvbmx5IGluIDM5NDUgYW5kIDQ5NjUuCi0JICoKLQkgKiBXcml0ZSB0byAiQ0xLX0VOX1JFRyI7ICIxIiBiaXRzIGVuYWJsZSBjbG9ja3MsIHdoaWxlICIwIiBiaXRzCi0JICogZG8gbm90IGRpc2FibGUgY2xvY2tzLiAgVGhpcyBwcmVzZXJ2ZXMgYW55IGhhcmR3YXJlIGJpdHMgYWxyZWFkeQotCSAqIHNldCBieSBkZWZhdWx0IGluICJDTEtfQ1RSTF9SRUciIGFmdGVyIHJlc2V0LgotCSAqLwotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT51c2VfYnNtKQotCQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQVBNR19DTEtfRU5fUkVHLAotCQkJQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUIHwgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUKTsKLQllbHNlCi0JCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19FTl9SRUcsCi0JCQlBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSgyMCk7Ci0KLQkvKiBEaXNhYmxlIEwxLUFjdGl2ZSAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdHNfcHJwaChwcml2LCBBUE1HX1BDSURFVl9TVFRfUkVHLAotCQkJICBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMpOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hcG1faW5pdCk7Ci0KLQotaW50IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpCi17Ci0JaW50IHJldDsKLQlzOCBwcmV2X3R4X3Bvd2VyOwotCWJvb2wgZGVmZXI7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmIChwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9PSB0eF9wb3dlciAmJiAhZm9yY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiAwIGRCbSBtZWFuIDEgbWlsbGl3YXR0ICovCi0JaWYgKHR4X3Bvd2VyIDwgMCkgewotCQlJV0xfV0FSTihwcml2LAotCQkJICJSZXF1ZXN0ZWQgdXNlciBUWFBPV0VSICVkIGJlbG93IDEgbVcuXG4iLAotCQkJIHR4X3Bvd2VyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHR4X3Bvd2VyID4gcHJpdi0+dHhfcG93ZXJfZGV2aWNlX2xtdCkgewotCQlJV0xfV0FSTihwcml2LAotCQkJIlJlcXVlc3RlZCB1c2VyIFRYUE9XRVIgJWQgYWJvdmUgdXBwZXIgbGltaXQgJWQuXG4iLAotCQkJIHR4X3Bvd2VyLCBwcml2LT50eF9wb3dlcl9kZXZpY2VfbG10KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIHNjYW4gY29tcGxldGUgYW5kIGNvbW1pdF9yeG9uIHVzZSB0eF9wb3dlcl9uZXh0IHZhbHVlLAotCSAqIGl0IGFsd2F5cyBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIG5ld2VzdCByZXF1ZXN0ICovCi0JcHJpdi0+dHhfcG93ZXJfbmV4dCA9IHR4X3Bvd2VyOwotCi0JLyogZG8gbm90IHNldCB0eCBwb3dlciB3aGVuIHNjYW5uaW5nIG9yIGNoYW5uZWwgY2hhbmdpbmcgKi8KLQlkZWZlciA9IHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKLQkJbWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOwotCWlmIChkZWZlciAmJiAhZm9yY2UpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkRlZmVycmluZyB0eCBwb3dlciBzZXRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmV2X3R4X3Bvd2VyID0gcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQ7Ci0JcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPSB0eF9wb3dlcjsKLQotCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci0KLQkvKiBpZiBmYWlsIHRvIHNldCB0eF9wb3dlciwgcmVzdG9yZSB0aGUgb3JpZy4gdHggcG93ZXIgKi8KLQlpZiAocmV0KSB7Ci0JCXByaXYtPnR4X3Bvd2VyX3VzZXJfbG10ID0gcHJldl90eF9wb3dlcjsKLQkJcHJpdi0+dHhfcG93ZXJfbmV4dCA9IHByZXZfdHhfcG93ZXI7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKTsKLQotdm9pZCBpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2J0X2NtZCBidF9jbWQgPSB7Ci0JCS5sZWFkX3RpbWUgPSBCVF9MRUFEX1RJTUVfREVGLAotCQkubWF4X2tpbGwgPSBCVF9NQVhfS0lMTF9ERUYsCi0JCS5raWxsX2Fja19tYXNrID0gMCwKLQkJLmtpbGxfY3RzX21hc2sgPSAwLAotCX07Ci0KLQlpZiAoIWJ0X2NvZXhfYWN0aXZlKQotCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0RJU0FCTEU7Ci0JZWxzZQotCQlidF9jbWQuZmxhZ3MgPSBCVF9DT0VYX0VOQUJMRTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJCVCBjb2V4ICVzXG4iLAotCQkoYnRfY21kLmZsYWdzID09IEJUX0NPRVhfRElTQUJMRSkgPyAiZGlzYWJsZSIgOiAiYWN0aXZlIik7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQlRfQ09ORklHLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF9idF9jbWQpLCAmYnRfY21kKSkKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgQ29leCBDb25maWdcbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKTsKLQotaW50IGl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBmbGFncywgYm9vbCBjbGVhcikKLXsKLQlzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kIHN0YXRpc3RpY3NfY21kID0gewotCQkuY29uZmlndXJhdGlvbl9mbGFncyA9Ci0JCQljbGVhciA/IElXTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIDogMCwKLQl9OwotCi0JaWYgKGZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgUkVQTFlfU1RBVElTVElDU19DTUQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kKSwKLQkJCQkJJnN0YXRpc3RpY3NfY21kLCBOVUxMKTsKLQllbHNlCi0JCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9TVEFUSVNUSUNTX0NNRCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfc3RhdGlzdGljc19jbWQpLAotCQkJCQkmc3RhdGlzdGljc19jbWQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KTsKLQotdm9pZCBpd2xfbGVnYWN5X3J4X3BtX3NsZWVwX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2xlZXBfbm90aWZpY2F0aW9uICpzbGVlcCA9ICYocGt0LT51LnNsZWVwX25vdGlmKTsKLQlJV0xfREVCVUdfUlgocHJpdiwgInNsZWVwIG1vZGU6ICVkLCBzcmM6ICVkXG4iLAotCQkgICAgIHNsZWVwLT5wbV9zbGVlcF9tb2RlLCBzbGVlcC0+cG1fd2FrZXVwX3NyYyk7Ci0jZW5kaWYKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9wbV9zbGVlcF9ub3RpZik7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MzIgbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgIkR1bXBpbmcgJWQgYnl0ZXMgb2YgdW5oYW5kbGVkICIKLQkJCSJub3RpZmljYXRpb24gZm9yICVzOlxuIiwgbGVuLAotCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1JBRElPLCBwa3QtPnUucmF3LCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWYpOwotCi12b2lkIGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0KLQlJV0xfRVJSKHByaXYsICJFcnJvciBSZXBseSB0eXBlIDB4JTA4WCBjbWQgJXMgKDB4JTAyWCkgIgotCQkic2VxIDB4JTA0WCBzZXIgMHglMDhYXG4iLAotCQlsZTMyX3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuZXJyb3JfdHlwZSksCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT51LmVycl9yZXNwLmNtZF9pZCksCi0JCXBrdC0+dS5lcnJfcmVzcC5jbWRfaWQsCi0JCWxlMTZfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5iYWRfY21kX3NlcV9udW0pLAotCQlsZTMyX3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuZXJyb3JfaW5mbykpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3JlcGx5X2Vycm9yKTsKLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbWVtc2V0KCZwcml2LT5pc3Jfc3RhdHMsIDAsIHNpemVvZihwcml2LT5pc3Jfc3RhdHMpKTsKLX0KLQotaW50IGl3bF9sZWdhY3lfbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBSRiBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAocXVldWUgPj0gQUNfTlVNKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBxdWV1ZSA+PSBBQ19OVU0gJWRcbiIsIHF1ZXVlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcSA9IEFDX05VTSAtIDEgLSBxdWV1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19taW4gPQotCQkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19taW4pOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19tYXggPQotCQkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19tYXgpOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5haWZzbiA9IHBhcmFtcy0+YWlmczsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uZWRjYV90eG9wID0KLQkJCQljcHVfdG9fbGUxNigocGFyYW1zLT50eG9wICogMzIpKTsKLQotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5yZXNlcnZlZDEgPSAwOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19jb25mX3R4KTsKLQotaW50IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcmV0dXJuIHByaXYtPmlic3NfbWFuYWdlciA9PSBJV0xfSUJTU19NQU5BR0VSOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24pOwotCi1zdGF0aWMgaW50Ci1pd2xfbGVnYWN5X3NldF9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLQotc3RhdGljIGludCBpd2xfbGVnYWN5X3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0JaW50IGVycjsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCS8qCi0JICogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIGNvcnJlY3Qgb25seSB3aGVuIHRoZXJlJ3MganVzdAotCSAqIGEgc2luZ2xlIGNvbnRleHQsIGJ1dCBhbGwgY29kZSB1c2luZyBpdCBpcyBmb3IgaGFyZHdhcmUKLQkgKiB0aGF0IHN1cHBvcnRzIG9ubHkgb25lIGNvbnRleHQuCi0JICovCi0JcHJpdi0+aXdfbW9kZSA9IHZpZi0+dHlwZTsKLQotCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKLQotCWVyciA9IGl3bF9sZWdhY3lfc2V0X21vZGUocHJpdiwgY3R4KTsKLQlpZiAoZXJyKSB7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1pd2xfbGVnYWN5X21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXAsICpjdHggPSBOVUxMOwotCWludCBlcnI7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyOiB0eXBlICVkLCBhZGRyICVwTVxuIiwKLQkJCSAgIHZpZi0+dHlwZSwgdmlmLT5hZGRyKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiVHJ5IHRvIGFkZCBpbnRlcmZhY2Ugd2hlbiBkZXZpY2Ugbm90IHJlYWR5XG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJdTMyIHBvc3NpYmxlX21vZGVzID0KLQkJCXRtcC0+aW50ZXJmYWNlX21vZGVzIHwgdG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCi0JCWlmICh0bXAtPnZpZikgewotCQkJLyogY2hlY2sgaWYgdGhpcyBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCi0JCQlpZiAodG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYKLQkJCQkJCUJJVCh0bXAtPnZpZi0+dHlwZSkpIHsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIShwb3NzaWJsZV9tb2RlcyAmIEJJVCh2aWYtPnR5cGUpKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGhhdmUgbWF5YmUgdXNhYmxlIGNvbnRleHQgdy9vIGludGVyZmFjZSAqLwotCQljdHggPSB0bXA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghY3R4KSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl2aWZfcHJpdi0+Y3R4ID0gY3R4OwotCWN0eC0+dmlmID0gdmlmOwotCi0JZXJyID0gaXdsX2xlZ2FjeV9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKLQlpZiAoIWVycikKLQkJZ290byBvdXQ7Ci0KLQljdHgtPnZpZiA9IE5VTEw7Ci0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfYWRkX2ludGVyZmFjZSk7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGJvb2wgbW9kZV9jaGFuZ2UpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmIChwcml2LT5zY2FuX3ZpZiA9PSB2aWYpIHsKLQkJaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0JCWl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQocHJpdik7Ci0JfQotCi0JaWYgKCFtb2RlX2NoYW5nZSkgewotCQlpd2xfbGVnYWN5X3NldF9tb2RlKHByaXYsIGN0eCk7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JV0FSTl9PTihjdHgtPnZpZiAhPSB2aWYpOwotCWN0eC0+dmlmID0gTlVMTDsKLQotCWl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgZmFsc2UpOwotCi0JbWVtc2V0KHByaXYtPmJzc2lkLCAwLCBFVEhfQUxFTik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlKTsKLQotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT50eHEpCi0JCXByaXYtPnR4cSA9IGt6YWxsb2MoCi0JCQlzaXplb2Yoc3RydWN0IGl3bF90eF9xdWV1ZSkgKgotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdHhxXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2FsbG9jX3R4cV9tZW0pOwotCi12b2lkIGl3bF9sZWdhY3lfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+dHhxKTsKLQlwcml2LT50eHEgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4cV9tZW0pOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQotI2RlZmluZSBJV0xfVFJBRkZJQ19EVU1QX1NJWkUJKElXTF9UUkFGRklDX0VOVFJZX1NJWkUgKiBJV0xfVFJBRkZJQ19FTlRSSUVTKQotCi12b2lkIGl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnR4X3RyYWZmaWNfaWR4ID0gMDsKLQlwcml2LT5yeF90cmFmZmljX2lkeCA9IDA7Ci0JaWYgKHByaXYtPnR4X3RyYWZmaWMpCi0JCW1lbXNldChwcml2LT50eF90cmFmZmljLCAwLCBJV0xfVFJBRkZJQ19EVU1QX1NJWkUpOwotCWlmIChwcml2LT5yeF90cmFmZmljKQotCQltZW1zZXQocHJpdi0+cnhfdHJhZmZpYywgMCwgSVdMX1RSQUZGSUNfRFVNUF9TSVpFKTsKLX0KLQotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiB0cmFmZmljX3NpemUgPSBJV0xfVFJBRkZJQ19EVU1QX1NJWkU7Ci0KLQlpZiAoaXdsZWdhY3lfZGVidWdfbGV2ZWwgJiBJV0xfRExfVFgpIHsKLQkJaWYgKCFwcml2LT50eF90cmFmZmljKSB7Ci0JCQlwcml2LT50eF90cmFmZmljID0KLQkJCQlremFsbG9jKHRyYWZmaWNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXByaXYtPnR4X3RyYWZmaWMpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JaWYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSB7Ci0JCWlmICghcHJpdi0+cnhfdHJhZmZpYykgewotCQkJcHJpdi0+cnhfdHJhZmZpYyA9Ci0JCQkJa3phbGxvYyh0cmFmZmljX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwcml2LT5yeF90cmFmZmljKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCWl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2cocHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0pOwotCi12b2lkIGl3bF9sZWdhY3lfZnJlZV90cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+dHhfdHJhZmZpYyk7Ci0JcHJpdi0+dHhfdHJhZmZpYyA9IE5VTEw7Ci0KLQlrZnJlZShwcml2LT5yeF90cmFmZmljKTsKLQlwcml2LT5yeF90cmFmZmljID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKTsKLQotdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgIHUxNiBsZW5ndGgsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCi17Ci0JX19sZTE2IGZjOwotCXUxNiBsZW47Ci0KLQlpZiAobGlrZWx5KCEoaXdsZWdhY3lfZGVidWdfbGV2ZWwgJiBJV0xfRExfVFgpKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFwcml2LT50eF90cmFmZmljKQotCQlyZXR1cm47Ci0KLQlmYyA9IGhlYWRlci0+ZnJhbWVfY29udHJvbDsKLQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7Ci0JCWxlbiA9IChsZW5ndGggPiBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFKQotCQkgICAgICAgPyBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFIDogbGVuZ3RoOwotCQltZW1jcHkoKHByaXYtPnR4X3RyYWZmaWMgKwotCQkgICAgICAgKHByaXYtPnR4X3RyYWZmaWNfaWR4ICogSVdMX1RSQUZGSUNfRU5UUllfU0laRSkpLAotCQkgICAgICAgaGVhZGVyLCBsZW4pOwotCQlwcml2LT50eF90cmFmZmljX2lkeCA9Ci0JCQkocHJpdi0+dHhfdHJhZmZpY19pZHggKyAxKSAlIElXTF9UUkFGRklDX0VOVFJJRVM7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotCV9fbGUxNiBmYzsKLQl1MTYgbGVuOwotCi0JaWYgKGxpa2VseSghKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSkpCi0JCXJldHVybjsKLQotCWlmICghcHJpdi0+cnhfdHJhZmZpYykKLQkJcmV0dXJuOwotCi0JZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQlsZW4gPSAobGVuZ3RoID4gSVdMX1RSQUZGSUNfRU5UUllfU0laRSkKLQkJICAgICAgID8gSVdMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKLQkJbWVtY3B5KChwcml2LT5yeF90cmFmZmljICsKLQkJICAgICAgIChwcml2LT5yeF90cmFmZmljX2lkeCAqIElXTF9UUkFGRklDX0VOVFJZX1NJWkUpKSwKLQkJICAgICAgIGhlYWRlciwgbGVuKTsKLQkJcHJpdi0+cnhfdHJhZmZpY19pZHggPQotCQkJKHByaXYtPnJ4X3RyYWZmaWNfaWR4ICsgMSkgJSBJV0xfVFJBRkZJQ19FTlRSSUVTOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUpOwotCi1jb25zdCBjaGFyICppd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhpbnQgY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9BU1NPQ19SRVEpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVTUCk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9SRUFTU09DX1JFUSk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9SRUFTU09DX1JFU1ApOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfUFJPQkVfUkVRKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX1BST0JFX1JFU1ApOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQkVBQ09OKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0FUSU0pOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfRElTQVNTT0MpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQVVUSCk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9ERUFVVEgpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQUNUSU9OKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIlVOS05PV04iOwotCi0JfQotfQotCi1jb25zdCBjaGFyICppd2xfbGVnYWN5X2dldF9jdHJsX3N0cmluZyhpbnQgY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoQ09OVFJPTF9CQUNLX1JFUSk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9CQUNLKTsKLQkJSVdMX0NNRChDT05UUk9MX1BTUE9MTCk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9SVFMpOwotCQlJV0xfQ01EKENPTlRST0xfQ1RTKTsKLQkJSVdMX0NNRChDT05UUk9MX0FDSyk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9DRkVORCk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9DRkVOREFDSyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQotCX0KLX0KLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCW1lbXNldCgmcHJpdi0+dHhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOwotCW1lbXNldCgmcHJpdi0+cnhfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgdHJhZmZpY19zdGF0cykpOwotfQotCi0vKgotICogaWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMgZGVmaW5lZCwKLSAqIGl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzIGZ1bmN0aW9uIHdpbGwKLSAqIHJlY29yZCBhbGwgdGhlIE1HTVQsIENUUkwgYW5kIERBVEEgcGt0IGZvciBib3RoIFRYIGFuZCBSeCBwYXNzCi0gKiBVc2UgZGVidWdGcyB0byBkaXNwbGF5IHRoZSByeC9yeF9zdGF0aXN0aWNzCi0gKiBpZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUyBub3QgYmVpbmcgZGVmaW5lZCwgdGhlbiBubyBNR01UIGFuZCBDVFJMCi0gKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY29yZGVkLCBidXQgREFUQSBwa3Qgc3RpbGwgd2lsbCBiZSByZWNvcmRlZAotICogZm9yIHRoZSByZWFzb24gb2YgaXdsX2xlZC5jIG5lZWQgdG8gY29udHJvbCB0aGUgbGVkIGJsaW5raW5nIGJhc2VkIG9uCi0gKiBudW1iZXIgb2YgdHggYW5kIHJ4IGRhdGEuCi0gKgotICovCi12b2lkCi1pd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cwkqc3RhdHM7Ci0KLQlpZiAoaXNfdHgpCi0JCXN0YXRzID0gJnByaXYtPnR4X3N0YXRzOwotCWVsc2UKLQkJc3RhdHMgPSAmcHJpdi0+cnhfc3RhdHM7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKSB7Ci0JCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVNTT0NfUkVRXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BU1NPQ19SRVNQXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVFdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVNQXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1BST0JFX1JFUV0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUFJPQkVfUkVTUF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9CRUFDT05dKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVRJTSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FUSU1dKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ESVNBU1NPQ10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVVUSF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ERUFVVEhdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQUNUSU9OKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQUNUSU9OXSsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19jdGwoZmMpKSB7Ci0JCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkFDS19SRVEpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9CQUNLX1JFUV0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CQUNLKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQkFDS10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9QU1BPTExdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUlRTKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfUlRTXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NUUyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NUU10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BQ0spOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9BQ0tdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ0ZFTkQpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9DRkVORF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NGRU5EQUNLXSsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBkYXRhICovCi0JCXN0YXRzLT5kYXRhX2NudCsrOwotCQlzdGF0cy0+ZGF0YV9ieXRlcyArPSBsZW47Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyk7Ci0jZW5kaWYKLQotaW50IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGV4dGVybmFsKQotewotCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgKmZvcmNlX3Jlc2V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvcmNlX3Jlc2V0ID0gJnByaXYtPmZvcmNlX3Jlc2V0OwotCWZvcmNlX3Jlc2V0LT5yZXNldF9yZXF1ZXN0X2NvdW50Kys7Ci0JaWYgKCFleHRlcm5hbCkgewotCQlpZiAoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyAmJgotCQkgICAgdGltZV9hZnRlcihmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzICsKLQkJICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbiwgamlmZmllcykpIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJmb3JjZSByZXNldCByZWplY3RlZFxuIik7Ci0JCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50Kys7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCX0KLQlmb3JjZV9yZXNldC0+cmVzZXRfc3VjY2Vzc19jb3VudCsrOwotCWZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOwotCi0JLyoKLQkgKiBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGV4dGVybmFsKGV4OiBkZWJ1Z2ZzKSwKLQkgKiB0aGVuIGFsd2F5cyBwZXJmb3JtIHRoZSByZXF1ZXN0IGluIHJlZ2FyZGxlc3MgdGhlIG1vZHVsZQotCSAqIHBhcmFtZXRlciBzZXR0aW5nCi0JICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBpbnRlcm5hbCAodUNvZGUgZXJyb3Igb3IgZHJpdmVyCi0JICogZGV0ZWN0IGZhaWx1cmUpLCB0aGVuIGZ3X3Jlc3RhcnQgbW9kdWxlIHBhcmFtZXRlcgotCSAqIG5lZWQgdG8gYmUgY2hlY2sgYmVmb3JlIHBlcmZvcm1pbmcgZmlybXdhcmUgcmVsb2FkCi0JICovCi0KLQlpZiAoIWV4dGVybmFsICYmICFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnJlc3RhcnRfZncpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNhbmNlbCBmaXJtd2FyZSByZWxvYWQgYmFzZWQgb24gIgotCQkJICAgICAgICJtb2R1bGUgcGFyYW1ldGVyIHNldHRpbmdcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfRVJSKHByaXYsICJPbiBkZW1hbmQgZmlybXdhcmUgcmVsb2FkXG4iKTsKLQotCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGl3bF9kb3duICovCi0Jc2V0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpOwotCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JLyoKLQkgKiBLZWVwIHRoZSByZXN0YXJ0IHByb2Nlc3MgZnJvbSB0cnlpbmcgdG8gc2VuZCBob3N0Ci0JICogY29tbWFuZHMgYnkgY2xlYXJpbmcgdGhlIElOSVQgc3RhdHVzIGJpdAotCSAqLwotCWNsZWFyX2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpOwotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1pd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCXUzMiBpbnRlcmZhY2VfbW9kZXM7Ci0JaW50IGVycjsKLQotCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFjdHgtPnZpZiB8fCAhaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQkvKgotCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgotCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKLQkJICovCi0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaW50ZXJmYWNlX21vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0KLQlpZiAoIShpbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkgewotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkgewotCQkJaWYgKGN0eCA9PSB0bXApCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICghdG1wLT52aWYpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qCi0JCQkgKiBUaGUgY3VycmVudCBtb2RlIHN3aXRjaCB3b3VsZCBiZSBleGNsdXNpdmUsIGJ1dAotCQkJICogYW5vdGhlciBjb250ZXh0IGlzIGFjdGl2ZSAuLi4gcmVmdXNlIHRoZSBzd2l0Y2guCi0JCQkgKi8KLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JLyogc3VjY2VzcyAqLwotCWl3bF9sZWdhY3lfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7Ci0JdmlmLT50eXBlID0gbmV3dHlwZTsKLQl2aWYtPnAycCA9IG5ld3AycDsKLQllcnIgPSBpd2xfbGVnYWN5X3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOwotCVdBUk5fT04oZXJyKTsKLQkvKgotCSAqIFdlJ3ZlIHN3aXRjaGVkIGludGVybmFsbHksIGJ1dCBzdWJtaXR0aW5nIHRvIHRoZQotCSAqIGRldmljZSBtYXkgaGF2ZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBNYXNrIHRoaXMKLQkgKiBlcnJvciwgYmVjYXVzZSBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBub3Qgc3dpdGNoCi0JICogKGFuZCBzZXQgdGhlIGludGVyZmFjZSB0eXBlIGJhY2spIGFuZCB3ZSdsbCBiZQotCSAqIG91dCBvZiBzeW5jIHdpdGggaXQuCi0JICovCi0JZXJyID0gMDsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlKTsKLQotLyoKLSAqIE9uIGV2ZXJ5IHdhdGNoZG9nIHRpY2sgd2UgY2hlY2sgKGxhdGVzdCkgdGltZSBzdGFtcC4gSWYgaXQgZG9lcyBub3QKLSAqIGNoYW5nZSBkdXJpbmcgdGltZW91dCBwZXJpb2QgYW5kIHF1ZXVlIGlzIG5vdCBlbXB0eSB3ZSByZXNldCBmaXJtd2FyZS4KLSAqLwotc3RhdGljIGludCBpd2xfbGVnYWN5X2NoZWNrX3N0dWNrX3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IGNudCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW2NudF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7Ci0KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7Ci0JCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JCXJldHVybiAwOwotCX0KLQotCXRpbWVvdXQgPSB0eHEtPnRpbWVfc3RhbXAgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlJV0xfRVJSKHByaXYsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLAotCQkJCXEtPmlkLCBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0KTsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChwcml2LCBmYWxzZSk7Ci0JCXJldHVybiAocmV0ID09IC1FQUdBSU4pID8gMCA6IDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBNYWtpbmcgd2F0Y2hkb2cgdGljayBiZSBhIHF1YXJ0ZXIgb2YgdGltZW91dCBhc3N1cmUgd2Ugd2lsbAotICogZGlzY292ZXIgdGhlIHF1ZXVlIGh1bmcgYmV0d2VlbiB0aW1lb3V0IGFuZCAxLjI1KnRpbWVvdXQKLSAqLwotI2RlZmluZSBJV0xfV0RfVElDSyh0aW1lb3V0KSAoKHRpbWVvdXQpIC8gNCkKLQotLyoKLSAqIFdhdGNoZG9nIHRpbWVyIGNhbGxiYWNrLCB3ZSBjaGVjayBlYWNoIHR4IHF1ZXVlIGZvciBzdHVjaywgaWYgaWYgaHVuZwotICogd2UgcmVzZXQgdGhlIGZpcm13YXJlLiBJZiBldmVyeXRoaW5nIGlzIGZpbmUganVzdCByZWFybSB0aGUgdGltZXIuCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9iZ193YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWRhdGE7Ci0JaW50IGNudDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCXRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwotCWlmICh0aW1lb3V0ID09IDApCi0JCXJldHVybjsKLQotCS8qIG1vbml0b3IgYW5kIGNoZWNrIGZvciBzdHVjayBjbWQgcXVldWUgKi8KLQlpZiAoaXdsX2xlZ2FjeV9jaGVja19zdHVja19xdWV1ZShwcml2LCBwcml2LT5jbWRfcXVldWUpKQotCQlyZXR1cm47Ci0KLQkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igb3RoZXIgc3R1Y2sgcXVldWVzICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7Ci0JCQkvKiBza2lwIGFzIHdlIGFscmVhZHkgY2hlY2tlZCB0aGUgY29tbWFuZCBxdWV1ZSAqLwotCQkJaWYgKGNudCA9PSBwcml2LT5jbWRfcXVldWUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXdsX2xlZ2FjeV9jaGVja19zdHVja19xdWV1ZShwcml2LCBjbnQpKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csIGppZmZpZXMgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMoSVdMX1dEX1RJQ0sodGltZW91dCkpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9iZ193YXRjaGRvZyk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwotCi0JaWYgKHRpbWVvdXQpCi0JCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElXTF9XRF9USUNLKHRpbWVvdXQpKSk7Ci0JZWxzZQotCQlkZWxfdGltZXIoJnByaXYtPndhdGNoZG9nKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyk7Ci0KLS8qCi0gKiBleHRlbmRlZCBiZWFjb24gdGltZSBmb3JtYXQKLSAqIHRpbWUgaW4gdXNlYyB3aWxsIGJlIGNoYW5nZWQgaW50byBhIDMyLWJpdCB2YWx1ZSBpbiBleHRlbmRlZDppbnRlcm5hbCBmb3JtYXQKLSAqIHRoZSBleHRlbmRlZCBwYXJ0IGlzIHRoZSBiZWFjb24gY291bnRzCi0gKiB0aGUgaW50ZXJuYWwgcGFydCBpcyB0aGUgdGltZSBpbiB1c2VjIHdpdGhpbiBvbmUgYmVhY29uIGludGVydmFsCi0gKi8KLXUzMgotaXdsX2xlZ2FjeV91c2Vjc190b19iZWFjb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJdTMyIHVzZWMsIHUzMiBiZWFjb25faW50ZXJ2YWwpCi17Ci0JdTMyIHF1b3Q7Ci0JdTMyIHJlbTsKLQl1MzIgaW50ZXJ2YWwgPSBiZWFjb25faW50ZXJ2YWwgKiBUSU1FX1VOSVQ7Ci0KLQlpZiAoIWludGVydmFsIHx8ICF1c2VjKQotCQlyZXR1cm4gMDsKLQotCXF1b3QgPSAodXNlYyAvIGludGVydmFsKSAmCi0JCShpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfaGlnaChwcml2LAotCQlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpID4+Ci0JCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JcmVtID0gKHVzZWMgJSBpbnRlcnZhbCkgJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCi0JCQkJICAgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKLQotCXJldHVybiAocXVvdCA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpICsgcmVtOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMpOwotCi0vKiBiYXNlIGlzIHVzdWFsbHkgd2hhdCB3ZSBnZXQgZnJvbSB1Y29kZSB3aXRoIGVhY2ggcmVjZWl2ZWQgZnJhbWUsCi0gKiB0aGUgc2FtZSBhcyBIVyB0aW1lciBjb3VudGVyIGNvdW50aW5nIGRvd24KLSAqLwotX19sZTMyIGl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGJhc2UsCi0JCQkgICB1MzIgYWRkb24sIHUzMiBiZWFjb25faW50ZXJ2YWwpCi17Ci0JdTMyIGJhc2VfbG93ID0gYmFzZSAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19sb3cocHJpdiwKLQkJCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKLQl1MzIgYWRkb25fbG93ID0gYWRkb24gJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCi0JCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOwotCXUzMiByZXMgPSAoYmFzZSAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoKHByaXYsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSkgKwotCQkJCShhZGRvbiAmIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoKHByaXYsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSk7Ci0KLQlpZiAoYmFzZV9sb3cgPiBhZGRvbl9sb3cpCi0JCXJlcyArPSBiYXNlX2xvdyAtIGFkZG9uX2xvdzsKLQllbHNlIGlmIChiYXNlX2xvdyA8IGFkZG9uX2xvdykgewotCQlyZXMgKz0gaW50ZXJ2YWwgKyBiYXNlX2xvdyAtIGFkZG9uX2xvdzsKLQkJcmVzICs9ICgxIDw8IHByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JfSBlbHNlCi0JCXJlcyArPSAoMSA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOwotCi0JcmV0dXJuIGNwdV90b19sZTMyKHJlcyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKTsKLQotI2lmZGVmIENPTkZJR19QTQotCi1pbnQgaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyoKLQkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHN5c3RlbSBnb2VzIGludG8gc3VzcGVuZCBzdGF0ZQotCSAqIG1hYzgwMjExIHdpbGwgY2FsbCBpd2xfbWFjX3N0b3AoKSBmcm9tIHRoZSBtYWM4MDIxMSBzdXNwZW5kIGZ1bmN0aW9uCi0JICogZmlyc3QgYnV0IHNpbmNlIGl3bF9tYWNfc3RvcCgpIGhhcyBubyBrbm93bGVkZ2Ugb2Ygd2hvIHRoZSBjYWxsZXIgaXMsCi0JICogaXQgd2lsbCBub3QgY2FsbCBhcG1fb3BzLnN0b3AoKSB0byBzdG9wIHRoZSBETUEgb3BlcmF0aW9uLgotCSAqIENhbGxpbmcgYXBtX29wcy5zdG9wIGhlcmUgdG8gbWFrZSBzdXJlIHdlIHN0b3AgdGhlIERNQS4KLQkgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQpOwotCi1pbnQgaXdsX2xlZ2FjeV9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JYm9vbCBod19yZmtpbGwgPSBmYWxzZTsKLQotCS8qCi0JICogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuCi0JICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkdfUkVUUllfVElNRU9VVCwgMHgwMCk7Ci0KLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JaWYgKCEoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykpCi0JCWh3X3Jma2lsbCA9IHRydWU7Ci0KLQlpZiAoaHdfcmZraWxsKQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgaHdfcmZraWxsKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3BjaV9yZXN1bWUpOwotCi1jb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpd2xfbGVnYWN5X3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZSwKLQkuZnJlZXplID0gaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZCwKLQkudGhhdyA9IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZSwKLQkucG93ZXJvZmYgPSBpd2xfbGVnYWN5X3BjaV9zdXNwZW5kLAotCS5yZXN0b3JlID0gaXdsX2xlZ2FjeV9wY2lfcmVzdW1lLAotfTsKLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wbV9vcHMpOwotCi0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLXN0YXRpYyB2b2lkCi1pd2xfbGVnYWN5X3VwZGF0ZV9xb3Moc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkKLQkJcmV0dXJuOwotCi0JY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzID0gMDsKLQotCWlmIChjdHgtPnFvc19kYXRhLnFvc19hY3RpdmUpCi0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyB8PQotCQkJUU9TX1BBUkFNX0ZMR19VUERBVEVfRURDQV9NU0s7Ci0KLQlpZiAoY3R4LT5odC5lbmFibGVkKQotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0gUU9TX1BBUkFNX0ZMR19UR05fTVNLOwotCi0JSVdMX0RFQlVHX1FPUyhwcml2LCAic2VuZCBRb1MgY21kIHdpdGggUW9zIGFjdGl2ZT0lZCBGTEFHUz0weCVYXG4iLAotCQkgICAgICBjdHgtPnFvc19kYXRhLnFvc19hY3RpdmUsCi0JCSAgICAgIGN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyk7Ci0KLQlpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyhwcml2LCBjdHgtPnFvc19jbWQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcW9zcGFyYW1fY21kKSwKLQkJCSAgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0sIE5VTEwpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfbWFjX2NvbmZpZyAtIG1hYzgwMjExIGNvbmZpZyBjYWxsYmFjawotICovCi1pbnQgaXdsX2xlZ2FjeV9tYWNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY29uZi0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWludCByZXQgPSAwOwotCXUxNiBjaDsKLQlpbnQgc2Nhbl9hY3RpdmUgPSAwOwotCWJvb2wgaHRfY2hhbmdlZFtOVU1fSVdMX1JYT05fQ1RYXSA9IHt9OwotCi0JaWYgKFdBUk5fT04oIXByaXYtPmNmZy0+b3BzLT5sZWdhY3kpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyIHRvIGNoYW5uZWwgJWQgY2hhbmdlZCAweCVYXG4iLAotCQkJCQljaGFubmVsLT5od192YWx1ZSwgY2hhbmdlZCk7Ci0KLQlpZiAodW5saWtlbHkodGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkpIHsKLQkJc2Nhbl9hY3RpdmUgPSAxOwotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgInNjYW4gYWN0aXZlXG4iKTsKLQl9Ci0KLQlpZiAoY2hhbmdlZCAmIChJRUVFODAyMTFfQ09ORl9DSEFOR0VfU01QUyB8Ci0JCSAgICAgICBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpIHsKLQkJLyogbWFjODAyMTEgdXNlcyBzdGF0aWMgZm9yIG5vbi1IVCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgKi8KLQkJcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IGNvbmYtPnNtcHNfbW9kZTsKLQotCQkvKgotCQkgKiBSZWNhbGN1bGF0ZSBjaGFpbiBjb3VudHMuCi0JCSAqCi0JCSAqIElmIG1vbml0b3IgbW9kZSBpcyBlbmFibGVkIHRoZW4gbWFjODAyMTEgd2lsbAotCQkgKiBzZXQgdXAgdGhlIFNNIFBTIG1vZGUgdG8gT0ZGIGlmIGFuIEhUIGNoYW5uZWwgaXMKLQkJICogY29uZmlndXJlZC4KLQkJICovCi0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBkdXJpbmcgc2Nhbm5pbmcgbWFjODAyMTEgd2lsbCBkZWxheSBjaGFubmVsIHNldHRpbmcgdW50aWwKLQkgKiBzY2FuIGZpbmlzaCB3aXRoIGNoYW5nZWQgPSAwCi0JICovCi0JaWYgKCFjaGFuZ2VkIHx8IChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKSB7Ci0JCWlmIChzY2FuX2FjdGl2ZSkKLQkJCWdvdG8gc2V0X2NoX291dDsKLQotCQljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOwotCQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGNoYW5uZWwtPmJhbmQsIGNoKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBpbnZhbGlkIGNoYW5uZWxcbiIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gc2V0X2NoX291dDsKLQkJfQotCi0JCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCi0JCSAgICAhaXdsX2xlZ2FjeV9pc19jaGFubmVsX2lic3MoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBub3QgSUJTUyBjaGFubmVsXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIHNldF9jaF9vdXQ7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCQkJaWYgKGN0eC0+aHQuZW5hYmxlZCAhPSBjb25mX2lzX2h0KGNvbmYpKSB7Ci0JCQkJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKLQkJCQlodF9jaGFuZ2VkW2N0eC0+Y3R4aWRdID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCi0JCQkvKgotCQkJICogRGVmYXVsdCB0byBubyBwcm90ZWN0aW9uLiBQcm90ZWN0aW9uIG1vZGUgd2lsbAotCQkJICogbGF0ZXIgYmUgc2V0IGZyb20gQlNTIGNvbmZpZyBpbiBpd2xfaHRfY29uZgotCQkJICovCi0JCQljdHgtPmh0LnByb3RlY3Rpb24gPQotCQkJCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkU7Ci0KLQkJCS8qIGlmIHdlIGFyZSBzd2l0Y2hpbmcgZnJvbSBodCB0byAyLjQgY2xlYXIgZmxhZ3MKLQkJCSAqIGZyb20gYW55IGh0IHJlbGF0ZWQgaW5mbyBzaW5jZSAyLjQgZG9lcyBub3QKLQkJCSAqIHN1cHBvcnQgaHQgKi8KLQkJCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpICE9IGNoKSkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JCQlpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKLQkJCWl3bF9sZWdhY3lfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7Ci0KLQkJCWl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwKLQkJCQkJICAgICAgIGN0eC0+dmlmKTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeS0+dXBkYXRlX2JjYXN0X3N0YXRpb25zKQotCQkJcmV0ID0KLQkJCXByaXYtPmNmZy0+b3BzLT5sZWdhY3ktPnVwZGF0ZV9iY2FzdF9zdGF0aW9ucyhwcml2KTsKLQotIHNldF9jaF9vdXQ6Ci0JCS8qIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcyBhbmQgcmF0ZSBtYXNrIGNhbiBiZSBkaWZmZXJlbnQKLQkJICogZm9yIGVhY2ggYmFuZDsgc2luY2UgdGhlIGJhbmQgbWF5IGhhdmUgY2hhbmdlZCwgcmVzZXQKLQkJICogdGhlIHJhdGUgbWFzayB0byB3aGF0IG1hYzgwMjExIGxpc3RzICovCi0JCWl3bF9sZWdhY3lfc2V0X3JhdGUocHJpdik7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiAoSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTIHwKLQkJCUlFRUU4MDIxMV9DT05GX0NIQU5HRV9JRExFKSkgewotCQlyZXQgPSBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIGZhbHNlKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRXJyb3Igc2V0dGluZyBzbGVlcCBsZXZlbFxuIik7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJUWCBQb3dlciBvbGQ9JWQgbmV3PSVkXG4iLAotCQkJcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQsIGNvbmYtPnBvd2VyX2xldmVsKTsKLQotCQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBjb25mLT5wb3dlcl9sZXZlbCwgZmFsc2UpOwotCX0KLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeShwcml2KSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gbm90IHJlYWR5XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHNjYW5fYWN0aXZlKQotCQlnb3RvIG91dDsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWlmIChtZW1jbXAoJmN0eC0+YWN0aXZlLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCi0JCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCWVsc2UKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIk5vdCByZS1zZW5kaW5nIHNhbWUgUlhPTiBjb25maWd1cmF0aW9uLlxuIik7Ci0JCWlmIChodF9jaGFuZ2VkW2N0eC0+Y3R4aWRdKQotCQkJaXdsX2xlZ2FjeV91cGRhdGVfcW9zKHByaXYsIGN0eCk7Ci0JfQotCi1vdXQ6Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfY29uZmlnKTsKLQotdm9pZCBpd2xfbGVnYWN5X21hY19yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLyogSUJTUyBjYW4gb25seSBiZSB0aGUgSVdMX1JYT05fQ1RYX0JTUyBjb250ZXh0ICovCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+bGVnYWN5KSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQltZW1zZXQoJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9odF9jb25maWcpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogbmV3IGFzc29jaWF0aW9uIGdldCByaWQgb2YgaWJzcyBiZWFjb24gc2tiICovCi0JaWYgKHByaXYtPmJlYWNvbl9za2IpCi0JCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0KLQlwcml2LT5iZWFjb25fc2tiID0gTlVMTDsKLQotCXByaXYtPnRpbWVzdGFtcCA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIG5vdCByZWFkeVxuIik7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2UgYXJlIHJlc3RhcnRpbmcgYXNzb2NpYXRpb24gcHJvY2VzcwotCSAqIGNsZWFyIFJYT05fRklMVEVSX0FTU09DX01TSyBiaXQKLQkgKi8KLQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JaXdsX2xlZ2FjeV9zZXRfcmF0ZShwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX3Jlc2V0X3RzZik7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfaHRfY29uZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mID0gJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJlbnRlcjpcbiIpOwotCi0JaWYgKCFjdHgtPmh0LmVuYWJsZWQpCi0JCXJldHVybjsKLQotCWN0eC0+aHQucHJvdGVjdGlvbiA9Ci0JCWJzc19jb25mLT5odF9vcGVyYXRpb25fbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047Ci0JY3R4LT5odC5ub25fZ2Zfc3RhX3ByZXNlbnQgPQotCQkhIShic3NfY29uZi0+aHRfb3BlcmF0aW9uX21vZGUgJgotCQkJCUlFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOwotCi0JaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSBmYWxzZTsKLQotCXN3aXRjaCAodmlmLT50eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIGJzc19jb25mLT5ic3NpZCk7Ci0JCWlmIChzdGEpIHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwotCQkJaW50IG1heHN0cmVhbXM7Ci0KLQkJCW1heHN0cmVhbXMgPSAoaHRfY2FwLT5tY3MudHhfcGFyYW1zICYKLQkJCSAgICAgIElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfTUFTSykKLQkJCQk+PiBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX1NISUZUOwotCQkJbWF4c3RyZWFtcyArPSAxOwotCi0JCQlpZiAoKGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPT0gMCkgJiYKLQkJCSAgICAoaHRfY2FwLT5tY3MucnhfbWFza1syXSA9PSAwKSkKLQkJCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCQlpZiAobWF4c3RyZWFtcyA8PSAxKQotCQkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiBhdCBhbGwsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHRocm91Z2ggYSByYWNlCi0JCQkgKiB3aGVuIHRoZSBBUCBkaXNjb25uZWN0cyB1cyB3aGlsZSB3ZSdyZSBzdGlsbAotCQkJICogc2V0dGluZyB1cCB0aGUgY29ubmVjdGlvbiwgaW4gdGhhdCBjYXNlIG1hYzgwMjExCi0JCQkgKiB3aWxsIHNvb24gdGVsbCB1cyBhYm91dCB0aGF0LgotCQkJICovCi0JCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCS8qCi0JICogaW5mb3JtIHRoZSB1Y29kZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbgotCSAqIGFzc29jaWF0aW9uIGFuZCB0aGF0IG5vIG1vcmUgcGFja2V0cyBzaG91bGQgYmUKLQkgKiBzZW50Ci0JICovCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7Ci0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JlYWNvbl91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTY0IHRpbWVzdGFtcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7Ci0KLQlpZiAoIXNrYikKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPmJlYWNvbl9jdHgpIHsKLQkJSVdMX0VSUihwcml2LCAidXBkYXRlIGJlYWNvbiBidXQgbm8gYmVhY29uIGNvbnRleHQhXG4iKTsKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JcHJpdi0+YmVhY29uX3NrYiA9IHNrYjsKLQotCXRpbWVzdGFtcCA9ICgoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhKS0+dS5iZWFjb24udGltZXN0YW1wOwotCXByaXYtPnRpbWVzdGFtcCA9IGxlNjRfdG9fY3B1KHRpbWVzdGFtcCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShwcml2KTsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X21hY19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAotCQkJCSAgICAgdTMyIGNoYW5nZXMpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlpbnQgcmV0OwotCi0JaWYgKFdBUk5fT04oIXByaXYtPmNmZy0+b3BzLT5sZWdhY3kpKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImNoYW5nZXMgPSAweCVYXG4iLCBjaGFuZ2VzKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkgewotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfUU9TKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gYnNzX2NvbmYtPnFvczsKLQkJaXdsX2xlZ2FjeV91cGRhdGVfcW9zKHByaXYsIGN0eCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCS8qCi0JCSAqIHRoZSBhZGRfaW50ZXJmYWNlIGNvZGUgbXVzdCBtYWtlIHN1cmUgd2Ugb25seSBldmVyCi0JCSAqIGhhdmUgYSBzaW5nbGUgaW50ZXJmYWNlIHRoYXQgY291bGQgYmUgYmVhY29uaW5nIGF0Ci0JCSAqIGFueSB0aW1lLgotCQkgKi8KLQkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikKLQkJCXByaXYtPmJlYWNvbl9jdHggPSBjdHg7Ci0JCWVsc2UKLQkJCXByaXYtPmJlYWNvbl9jdHggPSBOVUxMOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJCU1NJRCAlcE1cbiIsIGJzc19jb25mLT5ic3NpZCk7Ci0KLQkJLyoKLQkJICogSWYgdGhlcmUgaXMgY3VycmVudGx5IGEgSFcgc2NhbiBnb2luZyBvbiBpbiB0aGUKLQkJICogYmFja2dyb3VuZCB0aGVuIHdlIG5lZWQgdG8gY2FuY2VsIGl0IGVsc2UgdGhlIFJYT04KLQkJICogYmVsb3cvaW4gcG9zdF9hc3NvY2lhdGUgd2lsbCBmYWlsLgotCQkgKi8KLQkJaWYgKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApKSB7Ci0JCQlJV0xfV0FSTihwcml2LAotCQkJCSJBYm9ydGVkIHNjYW4gc3RpbGwgaW4gcHJvZ3Jlc3MgYWZ0ZXIgMTAwbXNcbiIpOwotCQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsCi0JCQkJImxlYXZpbmcgLSBzY2FuIGFib3J0IGZhaWxlZC5cbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBtYWM4MDIxMSBvbmx5IHNldHMgYXNzb2Mgd2hlbiBpbiBTVEFUSU9OIG1vZGUgKi8KLQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fCBic3NfY29uZi0+YXNzb2MpIHsKLQkJCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKLQkJCSAgICAgICBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCQkJLyogY3VycmVudGx5IG5lZWRlZCBpbiBhIGZldyBwbGFjZXMgKi8KLQkJCW1lbWNweShwcml2LT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCX0gZWxzZSB7Ci0JCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9Ci0JCQkJflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBUaGlzIG5lZWRzIHRvIGJlIGFmdGVyIHNldHRpbmcgdGhlIEJTU0lEIGluIGNhc2UKLQkgKiBtYWM4MDIxMSBkZWNpZGVzIHRvIGRvIGJvdGggY2hhbmdlcyBhdCBvbmNlIGJlY2F1c2UKLQkgKiBpdCB3aWxsIGludm9rZSBwb3N0X2Fzc29jaWF0ZS4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmIGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT04pCi0JCWl3bF9sZWdhY3lfYmVhY29uX3VwZGF0ZShodywgdmlmKTsKLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRVJQX1BSRUFNQkxFICVkXG4iLAotCQkJCSAgIGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpOwotCQlpZiAoYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LAotCQkJIkVSUF9DVFMgJWRcbiIsIGJzc19jb25mLT51c2VfY3RzX3Byb3QpOwotCQlpZiAoYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCAmJgotCQkJKHByaXYtPmJhbmQgIT0gSUVFRTgwMjExX0JBTkRfNUdIWikpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKLQkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0VMRl9DVFNfRU47Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0VMRl9DVFNfRU47Ci0JfQotCi0JaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgewotCQkvKiBYWFggdXNlIHRoaXMgaW5mb3JtYXRpb24KLQkJICoKLQkJICogVG8gZG8gdGhhdCwgcmVtb3ZlIGNvZGUgZnJvbSBpd2xfbGVnYWN5X3NldF9yYXRlKCkgYW5kIHB1dCBzb21ldGhpbmcKLQkJICogbGlrZSB0aGlzIGhlcmU6Ci0JCSAqCi0JCWlmIChBLWJhbmQpCi0JCQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JCQkJYnNzX2NvbmYtPmJhc2ljX3JhdGVzOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JCQkJYnNzX2NvbmYtPmJhc2ljX3JhdGVzID4+IDQ7Ci0JCQljdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KLQkJCQlic3NfY29uZi0+YmFzaWNfcmF0ZXMgJiAweEY7Ci0JCSAqLwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSFQpIHsKLQkJaXdsX2xlZ2FjeV9odF9jb25mKHByaXYsIHZpZik7Ci0KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJBU1NPQyAlZFxuIiwgYnNzX2NvbmYtPmFzc29jKTsKLQkJaWYgKGJzc19jb25mLT5hc3NvYykgewotCQkJcHJpdi0+dGltZXN0YW1wID0gYnNzX2NvbmYtPnRpbWVzdGFtcDsKLQotCQkJaWYgKCFpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJCQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5wb3N0X2Fzc29jaWF0ZShwcml2KTsKLQkJfSBlbHNlCi0JCQlpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhwcml2LCB2aWYpOwotCX0KLQotCWlmIChjaGFuZ2VzICYmIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBic3NfY29uZi0+YWlkKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQ2hhbmdlcyAoJSN4KSB3aGlsZSBhc3NvY2lhdGVkXG4iLAotCQkJCSAgIGNoYW5nZXMpOwotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl9hc3NvYyhwcml2LCBjdHgpOwotCQlpZiAoIXJldCkgewotCQkJLyogU3luYyBhY3RpdmVfcnhvbiB3aXRoIGxhdGVzdCBjaGFuZ2UuICovCi0JCQltZW1jcHkoKHZvaWQgKikmY3R4LT5hY3RpdmUsCi0JCQkJJmN0eC0+c3RhZ2luZywKLQkJCQlzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQpKTsKLQkJfQotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKLQkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikgewotCQkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyLAotCQkJICAgICAgIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOwotCQkJbWVtY3B5KHByaXYtPmJzc2lkLCBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJCXByaXYtPmNmZy0+b3BzLT5sZWdhY3ktPmNvbmZpZ19hcChwcml2KTsKLQkJfSBlbHNlCi0JCQlpd2xfbGVnYWN5X3NldF9ub19hc3NvYyhwcml2LCB2aWYpOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfSUJTUykgewotCQlyZXQgPSBwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5tYW5hZ2VfaWJzc19zdGF0aW9uKHByaXYsIHZpZiwKLQkJCQkJCQlic3NfY29uZi0+aWJzc19qb2luZWQpOwotCQlpZiAocmV0KQotCQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvICVzIElCU1Mgc3RhdGlvbiAlcE1cbiIsCi0JCQkJYnNzX2NvbmYtPmlic3Nfam9pbmVkID8gImFkZCIgOiAicmVtb3ZlIiwKLQkJCQlic3NfY29uZi0+YnNzaWQpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQpOwotCi1pcnFyZXR1cm5fdCBpd2xfbGVnYWN5X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRhdGE7Ci0JdTMyIGludGEsIGludGFfbWFzazsKLQl1MzIgaW50YV9maDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlmICghcHJpdikKLQkJcmV0dXJuIElSUV9OT05FOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIERpc2FibGUgKGJ1dCBkb24ndCBjbGVhciEpIGludGVycnVwdHMgaGVyZSB0byBhdm9pZAotCSAqICAgIGJhY2stdG8tYmFjayBJU1JzIGFuZCBzcG9yYWRpYyBpbnRlcnJ1cHRzIGZyb20gb3VyIE5JQy4KLQkgKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0byBzZXJ2aWNlLCB0aGUgdGFza2xldCB3aWxsIHJlLWVuYWJsZSBpbnRzLgotCSAqIElmIHdlICpkb24ndCogaGF2ZSBzb21ldGhpbmcsIHdlJ2xsIHJlLWVuYWJsZSBiZWZvcmUgbGVhdmluZyBoZXJlLiAqLwotCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsgIC8qIGp1c3QgZm9yIGRlYnVnICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9NQVNLLCAweDAwMDAwMDAwKTsKLQotCS8qIERpc2NvdmVyIHdoaWNoIGludGVycnVwdHMgYXJlIGFjdGl2ZS9wZW5kaW5nICovCi0JaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCi0JLyogSWdub3JlIGludGVycnVwdCBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gTklDIHRvIHNlcnZpY2UuCi0JICogVGhpcyBtYXkgYmUgZHVlIHRvIElSUSBzaGFyZWQgd2l0aCBhbm90aGVyIGRldmljZSwKLQkgKiBvciBkdWUgdG8gc3BvcmFkaWMgaW50ZXJydXB0cyB0aHJvd24gZnJvbSBvdXIgTklDLiAqLwotCWlmICghaW50YSAmJiAhaW50YV9maCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsCi0JCQkiSWdub3JlIGludGVycnVwdCwgaW50YSA9PSAwLCBpbnRhX2ZoID09IDBcbiIpOwotCQlnb3RvIG5vbmU7Ci0JfQotCi0JaWYgKChpbnRhID09IDB4RkZGRkZGRkYpIHx8ICgoaW50YSAmIDB4RkZGRkZGRjApID09IDB4YTVhNWE1YTApKSB7Ci0JCS8qIEhhcmR3YXJlIGRpc2FwcGVhcmVkLiBJdCBtaWdodCBoYXZlIGFscmVhZHkgcmFpc2VkCi0JCSAqIGFuIGludGVycnVwdCAqLwotCQlJV0xfV0FSTihwcml2LCAiSEFSRFdBUkUgR09ORT8/IElOVEEgPT0gMHglMDh4XG4iLCBpbnRhKTsKLQkJZ290byB1bnBsdWdnZWQ7Ci0JfQotCi0JSVdMX0RFQlVHX0lTUihwcml2LCAiSVNSIGludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCwgZmggMHglMDh4XG4iLAotCQkgICAgICBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgpOwotCi0JaW50YSAmPSB+Q1NSX0lOVF9CSVRfU0NEOwotCi0JLyogaXdsX2lycV90YXNrbGV0KCkgd2lsbCBzZXJ2aWNlIGludGVycnVwdHMgYW5kIHJlLWVuYWJsZSB0aGVtICovCi0JaWYgKGxpa2VseShpbnRhIHx8IGludGFfZmgpKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdGFza2xldCk7Ci0KLXVucGx1Z2dlZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotCi1ub25lOgotCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBzZXJ2aWNlLiAqLwotCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpKQotCQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaXNyKTsKLQotLyoKLSAqICBpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uOiBTZXQgcnRzL2N0cy4gMzk0NSBhbmQgNDk2NSBvbmx5IHNoYXJlIHRoaXMKLSAqICBmdW5jdGlvbi4KLSAqLwotdm9pZCBpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkgICAgICAgX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKQotewotCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7Ci0JCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1JUU19NU0s7Ci0JCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19DVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7Ci0KLQkJaWYgKCFpZWVlODAyMTFfaXNfbWdtdChmYykpCi0JCQlyZXR1cm47Ci0KLQkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgewotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfREVBVVRIKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEpOgotCQkJKnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1JUU19NU0s7Ci0JCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgJgotCQkgICBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSB7Ci0JCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19SVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOwotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTI3MWZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfY29yZV9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2NvcmVfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZvcndhcmQgZGVjbGFyYXRpb25zICoKLSAqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgaXdsX2hvc3RfY21kOwotc3RydWN0IGl3bF9jbWQ7Ci0KLQotI2RlZmluZSBJV0xXSUZJX1ZFUlNJT04gImluLXRyZWU6IgotI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgotI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgotCi0jZGVmaW5lIElXTF9QQ0lfREVWSUNFKGRldiwgc3ViZGV2LCBjZmcpIFwKLQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwgIC5kZXZpY2UgPSAoZGV2KSwgXAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gKHN1YmRldiksIFwKLQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJihjZmcpCi0KLSNkZWZpbmUgVElNRV9VTklUCQkxMDI0Ci0KLSNkZWZpbmUgSVdMX1NLVV9HICAgICAgIDB4MQotI2RlZmluZSBJV0xfU0tVX0EgICAgICAgMHgyCi0jZGVmaW5lIElXTF9TS1VfTiAgICAgICAweDgKLQotI2RlZmluZSBJV0xfQ01EKHgpIGNhc2UgeDogcmV0dXJuICN4Ci0KLXN0cnVjdCBpd2xfaGNtZF9vcHMgewotCWludCAoKnJ4b25fYXNzb2MpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0JaW50ICgqY29tbWl0X3J4b24pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0Jdm9pZCAoKnNldF9yeG9uX2NoYWluKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci19OwotCi1zdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIHsKLQl1MTYgKCpnZXRfaGNtZF9zaXplKSh1OCBjbWRfaWQsIHUxNiBsZW4pOwotCXUxNiAoKmJ1aWxkX2FkZHN0YV9oY21kKShjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpjbWQsCi0JCQkJCQkJCXU4ICpkYXRhKTsKLQlpbnQgKCpyZXF1ZXN0X3NjYW4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0Jdm9pZCAoKnBvc3Rfc2Nhbikoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfYXBtX29wcyB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqY29uZmlnKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotc3RydWN0IGl3bF9kZWJ1Z2ZzX29wcyB7Ci0Jc3NpemVfdCAoKnJ4X3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLQlzc2l6ZV90ICgqdHhfc3RhdHNfcmVhZCkoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCXNzaXplX3QgKCpnZW5lcmFsX3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotfTsKLQotc3RydWN0IGl3bF90ZW1wX29wcyB7Ci0Jdm9pZCAoKnRlbXBlcmF0dXJlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotc3RydWN0IGl3bF9saWJfb3BzIHsKLQkvKiBzZXQgaHcgZGVwZW5kZW50IHBhcmFtZXRlcnMgKi8KLQlpbnQgKCpzZXRfaHdfcGFyYW1zKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIEhhbmRsaW5nIFRYICovCi0Jdm9pZCAoKnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJdTE2IGJ5dGVfY250KTsKLQlpbnQgKCp0eHFfYXR0YWNoX2J1Zl90b190ZmQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgICAgIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkgICAgIHUxNiBsZW4sIHU4IHJlc2V0LCB1OCBwYWQpOwotCXZvaWQgKCp0eHFfZnJlZV90ZmQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLQlpbnQgKCp0eHFfaW5pdCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLQkvKiBzZXR1cCBSeCBoYW5kbGVyICovCi0Jdm9pZCAoKnJ4X2hhbmRsZXJfc2V0dXApKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JLyogYWxpdmUgbm90aWZpY2F0aW9uIGFmdGVyIGluaXQgdUNvZGUgbG9hZCAqLwotCXZvaWQgKCppbml0X2FsaXZlX3N0YXJ0KShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KLQlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSh1MzIgYWRkcik7Ci0JLyogMXN0IHVjb2RlIGxvYWQgKi8KLQlpbnQgKCpsb2FkX3Vjb2RlKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0Jdm9pZCAoKmR1bXBfbmljX2Vycm9yX2xvZykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQlpbnQgKCpkdW1wX2ZoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKipidWYsIGJvb2wgZGlzcGxheSk7Ci0JaW50ICgqc2V0X2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOwotCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlzdHJ1Y3QgaXdsX2FwbV9vcHMgYXBtX29wczsKLQotCS8qIHBvd2VyICovCi0JaW50ICgqc2VuZF90eF9wb3dlcikgKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnVwZGF0ZV9jaGFpbl9mbGFncykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotCS8qIGVlcHJvbSBvcGVyYXRpb25zIChhcyBkZWZpbmVkIGluIGl3bC1lZXByb20uaCkgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9vcHMgZWVwcm9tX29wczsKLQotCS8qIHRlbXBlcmF0dXJlICovCi0Jc3RydWN0IGl3bF90ZW1wX29wcyB0ZW1wX29wczsKLQotCXN0cnVjdCBpd2xfZGVidWdmc19vcHMgZGVidWdmc19vcHM7Ci0KLX07Ci0KLXN0cnVjdCBpd2xfbGVkX29wcyB7Ci0JaW50ICgqY21kKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfbGVkX2NtZCAqbGVkX2NtZCk7Ci19OwotCi1zdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgewotCXZvaWQgKCpwb3N0X2Fzc29jaWF0ZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqY29uZmlnX2FwKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIHN0YXRpb24gbWFuYWdlbWVudCAqLwotCWludCAoKnVwZGF0ZV9iY2FzdF9zdGF0aW9ucykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQlpbnQgKCptYW5hZ2VfaWJzc19zdGF0aW9uKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwotfTsKLQotc3RydWN0IGl3bF9vcHMgewotCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOwotCWNvbnN0IHN0cnVjdCBpd2xfaGNtZF9vcHMgKmhjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyAqdXRpbHM7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWRfb3BzICpsZWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9uaWNfb3BzICpuaWM7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfb3BzICpsZWdhY3k7Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgKmllZWU4MDIxMV9vcHM7Ci19OwotCi1zdHJ1Y3QgaXdsX21vZF9wYXJhbXMgewotCWludCBzd19jcnlwdG87CQkvKiBkZWY6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCi0JaW50IGRpc2FibGVfaHdfc2NhbjsJLyogZGVmOiAwID0gdXNlIGgvdyBzY2FuICovCi0JaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCi0JaW50IGRpc2FibGVfMTFuOwkvKiBkZWY6IDAgPSAxMW4gY2FwYWJpbGl0aWVzIGVuYWJsZWQgKi8KLQlpbnQgYW1zZHVfc2l6ZV84SzsJLyogZGVmOiAxID0gZW5hYmxlIDhLIGFtc2R1IHNpemUgKi8KLQlpbnQgYW50ZW5uYTsgIAkJLyogZGVmOiAwID0gYm90aCBhbnRlbm5hcyAodXNlIGRpdmVyc2l0eSkgKi8KLQlpbnQgcmVzdGFydF9mdzsJCS8qIGRlZjogMSA9IHJlc3RhcnQgZmlybXdhcmUgKi8KLX07Ci0KLS8qCi0gKiBAbGVkX2NvbXBlbnNhdGlvbjogY29tcGVuc2F0ZSBvbiB0aGUgbGVkIG9uL29mZiB0aW1lIHBlciBIVyBhY2NvcmRpbmcKLSAqCXRvIHRoZSBkZXZpYXRpb24gdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBsZWQgZnJlcXVlbmN5LgotICoJVGhlIGRldGFpbCBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIGl3bC1sZWQuYwotICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKLSAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAotICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgotICogQHVjb2RlX3RyYWNpbmc6IHN1cHBvcnQgdWNvZGUgY29udGludW91cyB0cmFjaW5nCi0gKiBAc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyOiBkcml2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHBlcmZvcm0KLSAqCXNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIG9wZXJhdGlvbgotICogQGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCi0gKgljaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KLSAqLwotc3RydWN0IGl3bF9iYXNlX3BhcmFtcyB7Ci0JaW50IGVlcHJvbV9zaXplOwotCWludCBudW1fb2ZfcXVldWVzOwkvKiBkZWY6IEhXIGRlcGVuZGVudCAqLwotCWludCBudW1fb2ZfYW1wZHVfcXVldWVzOy8qIGRlZjogSFcgZGVwZW5kZW50ICovCi0JLyogZm9yIGl3bF9sZWdhY3lfYXBtX2luaXQoKSAqLwotCXUzMiBwbGxfY2ZnX3ZhbDsKLQlib29sIHNldF9sMHM7Ci0JYm9vbCB1c2VfYnNtOwotCi0JdTE2IGxlZF9jb21wZW5zYXRpb247Ci0JaW50IGNoYWluX25vaXNlX251bV9iZWFjb25zOwotCXVuc2lnbmVkIGludCB3ZF90aW1lb3V0OwotCWJvb2wgdGVtcGVyYXR1cmVfa2VsdmluOwotCWNvbnN0IGJvb2wgdWNvZGVfdHJhY2luZzsKLQljb25zdCBib29sIHNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcjsKLQljb25zdCBib29sIGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9jZmcKLSAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgotICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQotICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KLSAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCi0gKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCi0gKgotICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQotICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQotICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKLSAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4gVGhlIGZpcm13YXJlJ3MgQVBJIHZlcnNpb24gd2lsbCBiZQotICogc3RvcmVkIGluIEBpd2xfcHJpdiwgZW5hYmxpbmcgdGhlIGRyaXZlciB0byBtYWtlIHJ1bnRpbWUgY2hhbmdlcyBiYXNlZAotICogb24gZmlybXdhcmUgdmVyc2lvbiB1c2VkLgotICoKLSAqIEZvciBleGFtcGxlLAotICogaWYgKElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSA+PSAyKSB7Ci0gKglEcml2ZXIgaW50ZXJhY3RzIHdpdGggRmlybXdhcmUgQVBJIHZlcnNpb24gPj0gMi4KLSAqIH0gZWxzZSB7Ci0gKglEcml2ZXIgaW50ZXJhY3RzIHdpdGggRmlybXdhcmUgQVBJIHZlcnNpb24gMS4KLSAqIH0KLSAqCi0gKiBUaGUgaWRlYWwgdXNhZ2Ugb2YgdGhpcyBpbmZyYXN0cnVjdHVyZSBpcyB0byB0cmVhdCBhIG5ldyB1Y29kZSBBUEkKLSAqIHJlbGVhc2UgYXMgYSBuZXcgaGFyZHdhcmUgcmV2aXNpb24uIFRoYXQgaXMsIHRocm91Z2ggdXRpbGl6aW5nIHRoZQotICogaXdsX2hjbWRfdXRpbHNfb3BzIGV0Yy4gd2UgYWNjb21tb2RhdGUgZGlmZmVyZW50IGNvbW1hbmQgc3RydWN0dXJlcwotICogYW5kIGZsb3dzIGJldHdlZW4gaGFyZHdhcmUgdmVyc2lvbnMgYXMgd2VsbCBhcyB0aGVpciBBUEkKLSAqIHZlcnNpb25zLgotICoKLSAqLwotc3RydWN0IGl3bF9jZmcgewotCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpmd19uYW1lX3ByZTsKLQljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21heDsKLQljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKLQl1OCAgIHZhbGlkX3R4X2FudDsKLQl1OCAgIHZhbGlkX3J4X2FudDsKLQl1bnNpZ25lZCBpbnQgc2t1OwotCXUxNiAgZWVwcm9tX3ZlcjsKLQl1MTYgIGVlcHJvbV9jYWxpYl92ZXI7Ci0JY29uc3Qgc3RydWN0IGl3bF9vcHMgKm9wczsKLQkvKiBtb2R1bGUgYmFzZWQgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgc2V0IGZyb20gbW9kcHJvYmUgY21kICovCi0JY29uc3Qgc3RydWN0IGl3bF9tb2RfcGFyYW1zICptb2RfcGFyYW1zOwotCS8qIHBhcmFtcyBub3QgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0Jc3RydWN0IGl3bF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7Ci0JLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107Ci0JZW51bSBpd2xfbGVkX21vZGUgbGVkX21vZGU7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIEwgaSBiICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfbGVnYWN5X2FsbG9jX2FsbChzdHJ1Y3QgaXdsX2NmZyAqY2ZnKTsKLWludCBpd2xfbGVnYWN5X21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAotCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCBpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlpbnQgaHdfZGVjcnlwdCk7Ci1pbnQgaXdsX2xlZ2FjeV9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotdm9pZCBpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci11OCBpd2xfbGVnYWN5X2dldF9zaW5nbGVfY2hhbm5lbF9udW1iZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZik7Ci1ib29sIGl3bF9sZWdhY3lfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKTsKLXZvaWQgaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkgICB1MzIgZGVjcnlwdF9yZXMsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpOwotdm9pZCBpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotaW50IGl3bF9sZWdhY3lfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApOwotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1pbnQgaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9yZXNldF90cmFmZmljX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJdTE2IGxlbmd0aCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Ci12b2lkIGl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQl1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKTsKLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X21nbXRfc3RyaW5nKGludCBjbWQpOwotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCk7Ci12b2lkIGl3bF9sZWdhY3lfY2xlYXJfdHJhZmZpY19zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywKLQkJICAgICAgdTE2IGxlbik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgIHUxNiBsZW5ndGgsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCi17Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc190eCwKLQkJCQkgICAgX19sZTE2IGZjLCB1MTYgbGVuKQotewotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJYIGhhbmRsZXJzLgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotdm9pZCBpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9yZXBseV9lcnJvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSWAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSk7Ci1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpxKTsKLXZvaWQgaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLS8qIEhhbmRsZXJzICovCi12b2lkIGl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotdm9pZCBpd2xfbGVnYWN5X3JlY292ZXJfZnJvbV9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKLXZvaWQgaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBpc19zdWNjZXNzKTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9jc2Eoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci0KLS8qIFRYIGhlbHBlcnMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFRYCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKTsKLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVFggcG93ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgczggdHhfcG93ZXIsIGJvb2wgZm9yY2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2Nhbm5pbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1bnNpZ25lZCBsb25nIG1zKTsKLXZvaWQgaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKLXZvaWQgaXdsX2xlZ2FjeV9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgZXh0ZXJuYWwpOwotdTE2IGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdTE2IGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICAgIHU4IG5fcHJvYmVzKTsKLXUxNiBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIEZvciBmYXN0ZXIgYWN0aXZlIHNjYW5uaW5nLCBzY2FuIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBjaGFubmVsIGlmIGZld2VyIHRoYW4KLSAqIFBMQ1BfUVVJRVRfVEhSRVNIIHBhY2tldHMgYXJlIGhlYXJkIG9uIHRoaXMgY2hhbm5lbCB3aXRoaW4KLSAqIEFDVElWRV9RVUlFVF9USU1FIGFmdGVyIHNlbmRpbmcgcHJvYmUgcmVxdWVzdC4gIFRoaXMgc2hvcnRlbnMgdGhlIGR3ZWxsCi0gKiB0aW1lIGlmIGl0J3MgYSBxdWlldCBjaGFubmVsIChub3RoaW5nIHJlc3BvbmRlZCB0byBvdXIgcHJvYmUsIGFuZCB0aGVyZSdzCi0gKiBubyBvdGhlciB0cmFmZmljKS4KLSAqIERpc2FibGUgInF1aWV0IiBmZWF0dXJlIGJ5IHNldHRpbmcgUExDUF9RVUlFVF9USFJFU0ggdG8gMC4gKi8KLSNkZWZpbmUgSVdMX0FDVElWRV9RVUlFVF9USU1FICAgICAgIGNwdV90b19sZTE2KDEwKSAgLyogbXNlYyAqLwotI2RlZmluZSBJV0xfUExDUF9RVUlFVF9USFJFU0ggICAgICAgY3B1X3RvX2xlMTYoMSkgIC8qIHBhY2tldHMgKi8KLQotI2RlZmluZSBJV0xfU0NBTl9DSEVDS19XQVRDSERPRwkJKEhaICogNykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgIFMgZSBuIGQgaSBuIGcgICAgIEggbyBzIHQgICAgIEMgbyBtIG0gYSBuIGQgcyAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyh1OCBjbWQpOwotaW50IF9fbXVzdF9jaGVjayBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci1pbnQgX19tdXN0X2NoZWNrIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaWQsCi0JCQkJICB1MTYgbGVuLCBjb25zdCB2b2lkICpkYXRhKTsKLWludCBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGlkLCB1MTYgbGVuLAotCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KSk7Ci0KLWludCBpd2xfbGVnYWN5X2VucXVldWVfaGNtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ0kJCQkJCQkgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZSB1MTYgaXdsX2xlZ2FjeV9wY2llX2xpbmtfY3RsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcG9zOwotCXUxNiBwY2lfbG5rX2N0bDsKLQlwb3MgPSBwY2lfcGNpZV9jYXAocHJpdi0+cGNpX2Rldik7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7Ci0JcmV0dXJuIHBjaV9sbmtfY3RsOwotfQotCi12b2lkIGl3bF9sZWdhY3lfYmdfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKTsKLXUzMiBpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQl1MzIgdXNlYywgdTMyIGJlYWNvbl9pbnRlcnZhbCk7Ci1fX2xlMzIgaXdsX2xlZ2FjeV9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYmFzZSwKLQkJCSAgIHUzMiBhZGRvbiwgdTMyIGJlYWNvbl9pbnRlcnZhbCk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLWludCBpd2xfbGVnYWN5X3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Ci1pbnQgaXdsX2xlZ2FjeV9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXdsX2xlZ2FjeV9wbV9vcHM7Ci0KLSNkZWZpbmUgSVdMX0xFR0FDWV9QTV9PUFMJKCZpd2xfbGVnYWN5X3BtX29wcykKLQotI2Vsc2UgLyogIUNPTkZJR19QTSAqLwotCi0jZGVmaW5lIElXTF9MRUdBQ1lfUE1fT1BTCU5VTEwKLQotI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBFcnJvciBIYW5kbGluZyBEZWJ1Z2dpbmcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXZvaWQgaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci19Ci0jZW5kaWYKLQotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIEdFT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBpd2xfbGVnYWN5X2luaXRfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKioqKioqKioqKioqKioqIERSSVZFUiBTVEFUVVMgRlVOQ1RJT05TICAgKioqKiovCi0KLSNkZWZpbmUgU1RBVFVTX0hDTURfQUNUSVZFCTAJLyogaG9zdCBjb21tYW5kIGluIHByb2dyZXNzICovCi0vKiAxIGlzIHVudXNlZCAodXNlZCB0byBiZSBTVEFUVVNfSENNRF9TWU5DX0FDVElWRSkgKi8KLSNkZWZpbmUgU1RBVFVTX0lOVF9FTkFCTEVECTIKLSNkZWZpbmUgU1RBVFVTX1JGX0tJTExfSFcJMwotI2RlZmluZSBTVEFUVVNfQ1RfS0lMTAkJNAotI2RlZmluZSBTVEFUVVNfSU5JVAkJNQotI2RlZmluZSBTVEFUVVNfQUxJVkUJCTYKLSNkZWZpbmUgU1RBVFVTX1JFQURZCQk3Ci0jZGVmaW5lIFNUQVRVU19URU1QRVJBVFVSRQk4Ci0jZGVmaW5lIFNUQVRVU19HRU9fQ09ORklHVVJFRAk5Ci0jZGVmaW5lIFNUQVRVU19FWElUX1BFTkRJTkcJMTAKLSNkZWZpbmUgU1RBVFVTX1NUQVRJU1RJQ1MJMTIKLSNkZWZpbmUgU1RBVFVTX1NDQU5OSU5HCQkxMwotI2RlZmluZSBTVEFUVVNfU0NBTl9BQk9SVElORwkxNAotI2RlZmluZSBTVEFUVVNfU0NBTl9IVwkJMTUKLSNkZWZpbmUgU1RBVFVTX1BPV0VSX1BNSQkxNgotI2RlZmluZSBTVEFUVVNfRldfRVJST1IJCTE3Ci0jZGVmaW5lIFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFRoZSBhZGFwdGVyIGlzICdyZWFkeScgaWYgUkVBRFkgYW5kIEdFT19DT05GSUdVUkVEIGJpdHMgYXJlCi0JICogc2V0IGJ1dCBFWElUX1BFTkRJTkcgaXMgbm90ICovCi0JcmV0dXJuIHRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgICAgdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSAmJgotCSAgICAgICAhdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfSU5JVCwgJnByaXYtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmZraWxsX2h3KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX3Jma2lsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIGl3bF9sZWdhY3lfaXNfcmZraWxsX2h3KHByaXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2N0a2lsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIHRlc3RfYml0KFNUQVRVU19DVF9LSUxMLCAmcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfaXNfcmVhZHkocHJpdik7Ci19Ci0KLWV4dGVybiB2b2lkIGl3bF9sZWdhY3lfc2VuZF9idF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHU4IGZsYWdzLCBib29sIGNsZWFyKTsKLXZvaWQgaXdsX2xlZ2FjeV9hcG1fc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfYXBtX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotaW50IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnJ4b25fYXNzb2MocHJpdiwgY3R4KTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfY29tbWl0X3J4b24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5oY21kLT5jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICppd2xfZ2V0X2h3X21vZGUoCi0JCQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQlyZXR1cm4gcHJpdi0+aHctPndpcGh5LT5iYW5kc1tiYW5kXTsKLX0KLQotLyogbWFjODAyMTEgaGFuZGxlcnMgKi8KLWludCBpd2xfbGVnYWN5X21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKTsKLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci12b2lkIGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsCi0JCQkJICAgICB1MzIgY2hhbmdlcyk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKLQkJCQlfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOwotCi1pcnFyZXR1cm5fdCBpd2xfbGVnYWN5X2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKTsKLQotI2VuZGlmIC8qIF9faXdsX2xlZ2FjeV9jb3JlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNzci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhhOTYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jc3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2Nzcl9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2Nzcl9oX18KLS8qCi0gKiBDU1IgKGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMpCi0gKgotICogQ1NSIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGRpcmVjdGx5IGludG8gUENJIGJ1cyBzcGFjZSwgYW5kIGFyZSBhY2Nlc3NpYmxlCi0gKiB3aGVuZXZlciBwbGF0Zm9ybSBzdXBwbGllcyBwb3dlciB0byBkZXZpY2UsIGV2ZW4gd2hlbiBkZXZpY2UgaXMgaW4KLSAqIGxvdyBwb3dlciBzdGF0ZXMgZHVlIHRvIGRyaXZlci1pbnZva2VkIGRldmljZSByZXNldHMKLSAqIChlLmcuIENTUl9SRVNFVF9SRUdfRkxBR19TV19SRVNFVCkgb3IgdUNvZGUtZHJpdmVuIHBvd2VyLXNhdmluZyBtb2Rlcy4KLSAqCi0gKiBVc2UgaXdsX3dyaXRlMzIoKSBhbmQgaXdsX3JlYWQzMigpIGZhbWlseSB0byBhY2Nlc3MgdGhlc2UgcmVnaXN0ZXJzOwotICogdGhlc2UgcHJvdmlkZSBzaW1wbGUgUENJIGJ1cyBhY2Nlc3MsIHdpdGhvdXQgd2FraW5nIHVwIHRoZSBNQUMuCi0gKiBEbyBub3QgdXNlIGl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIoKSBmYW1pbHkgZm9yIHRoZXNlIHJlZ2lzdGVyczsKLSAqIG5vIG5lZWQgdG8gImdyYWIgbmljIGFjY2VzcyIgdmlhIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUS4KLSAqIFRoZSBNQUMgKHVDb2RlIHByb2Nlc3NvciwgZXRjLikgZG9lcyBub3QgbmVlZCB0byBiZSBwb3dlcmVkIHVwIGZvciBhY2Nlc3NpbmcKLSAqIHRoZSBDU1IgcmVnaXN0ZXJzLgotICoKLSAqIE5PVEU6ICBEZXZpY2UgZG9lcyBuZWVkIHRvIGJlIGF3YWtlIGluIG9yZGVyIHRvIHJlYWQgdGhpcyBtZW1vcnkKLSAqICAgICAgICB2aWEgQ1NSX0VFUFJPTSByZWdpc3RlcgotICovCi0jZGVmaW5lIENTUl9CQVNFICAgICgweDAwMCkKLQotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFRyAgICAoQ1NSX0JBU0UrMHgwMDApIC8qIGhhcmR3YXJlIGludGVyZmFjZSBjb25maWcgKi8KLSNkZWZpbmUgQ1NSX0lOVF9DT0FMRVNDSU5HICAgICAgKENTUl9CQVNFKzB4MDA0KSAvKiBhY2N1bSBpbnRzLCAzMi11c2VjIHVuaXRzICovCi0jZGVmaW5lIENTUl9JTlQgICAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAwOCkgLyogaG9zdCBpbnRlcnJ1cHQgc3RhdHVzL2FjayAqLwotI2RlZmluZSBDU1JfSU5UX01BU0sgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMGMpIC8qIGhvc3QgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX1NUQVRVUyAgICAgICAoQ1NSX0JBU0UrMHgwMTApIC8qIGJ1c21hc3RlciBpbnQgc3RhdHVzL2FjayovCi0jZGVmaW5lIENTUl9HUElPX0lOICAgICAgICAgICAgIChDU1JfQkFTRSsweDAxOCkgLyogcmVhZCBleHRlcm5hbCBjaGlwIHBpbnMgKi8KLSNkZWZpbmUgQ1NSX1JFU0VUICAgICAgICAgICAgICAgKENTUl9CQVNFKzB4MDIwKSAvKiBidXNtYXN0ZXIgZW5hYmxlLCBOTUksIGV0YyovCi0jZGVmaW5lIENTUl9HUF9DTlRSTCAgICAgICAgICAgIChDU1JfQkFTRSsweDAyNCkKLQotLyogMm5kIGJ5dGUgb2YgQ1NSX0lOVF9DT0FMRVNDSU5HLCBub3QgYWNjZXNzaWJsZSB2aWEgaXdsX3dyaXRlMzIoKSEgKi8KLSNkZWZpbmUgQ1NSX0lOVF9QRVJJT0RJQ19SRUcJKENTUl9CQVNFKzB4MDA1KQotCi0vKgotICogSGFyZHdhcmUgcmV2aXNpb24gaW5mbwotICogQml0IGZpZWxkczoKLSAqIDMxLTg6ICBSZXNlcnZlZAotICogIDctNDogIFR5cGUgb2YgZGV2aWNlOiAgc2VlIENTUl9IV19SRVZfVFlQRV94eHggZGVmaW5pdGlvbnMKLSAqICAzLTI6ICBSZXZpc2lvbiBzdGVwOiAgMCA9IEEsIDEgPSBCLCAyID0gQywgMyA9IEQKLSAqICAxLTA6ICAiRGFzaCIgKC0pIHZhbHVlLCBhcyBpbiBBLTEsIGV0Yy4KLSAqCi0gKiBOT1RFOiAgUmV2aXNpb24gc3RlcCBhZmZlY3RzIGNhbGN1bGF0aW9uIG9mIENDSyB0eHBvd2VyIGZvciA0OTY1LgotICogTk9URTogIFNlZSBhbHNvIENTUl9IV19SRVZfV0FfUkVHICh3b3JrLWFyb3VuZCBmb3IgYnVnIGluIDQ5NjUpLgotICovCi0jZGVmaW5lIENTUl9IV19SRVYgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAyOCkKLQotLyoKLSAqIEVFUFJPTSBtZW1vcnkgcmVhZHMKLSAqCi0gKiBOT1RFOiAgRGV2aWNlIG11c3QgYmUgYXdha2UsIGluaXRpYWxpemVkIHZpYSBhcG1fb3BzLmluaXQoKSwKLSAqICAgICAgICBpbiBvcmRlciB0byByZWFkLgotICovCi0jZGVmaW5lIENTUl9FRVBST01fUkVHICAgICAgICAgIChDU1JfQkFTRSsweDAyYykKLSNkZWZpbmUgQ1NSX0VFUFJPTV9HUCAgICAgICAgICAgKENTUl9CQVNFKzB4MDMwKQotCi0jZGVmaW5lIENTUl9HSU9fUkVHCQkoQ1NSX0JBU0UrMHgwM0MpCi0jZGVmaW5lIENTUl9HUF9VQ09ERV9SRUcJKENTUl9CQVNFKzB4MDQ4KQotI2RlZmluZSBDU1JfR1BfRFJJVkVSX1JFRwkoQ1NSX0JBU0UrMHgwNTApCi0KLS8qCi0gKiBVQ09ERS1EUklWRVIgR1AgKGdlbmVyYWwgcHVycG9zZSkgbWFpbGJveCByZWdpc3RlcnMuCi0gKiBTRVQvQ0xSIHJlZ2lzdGVycyBzZXQvY2xlYXIgYml0KHMpIGlmICIxIiBpcyB3cml0dGVuLgotICovCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxICAgICAgIChDU1JfQkFTRSsweDA1NCkKLSNkZWZpbmUgQ1NSX1VDT0RFX0RSVl9HUDFfU0VUICAgKENTUl9CQVNFKzB4MDU4KQotI2RlZmluZSBDU1JfVUNPREVfRFJWX0dQMV9DTFIgICAoQ1NSX0JBU0UrMHgwNWMpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AyICAgICAgIChDU1JfQkFTRSsweDA2MCkKLQotI2RlZmluZSBDU1JfTEVEX1JFRyAgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwOTQpCi0jZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfUkVHCShDU1JfQkFTRSsweDBBMCkKLQotLyogR0lPIENoaWNrZW4gQml0cyAoUENJIEV4cHJlc3MgYnVzIGxpbmsgcG93ZXIgbWFuYWdlbWVudCkgKi8KLSNkZWZpbmUgQ1NSX0dJT19DSElDS0VOX0JJVFMgICAgKENTUl9CQVNFKzB4MTAwKQotCi0vKiBBbmFsb2cgcGhhc2UtbG9jay1sb29wIGNvbmZpZ3VyYXRpb24gICovCi0jZGVmaW5lIENTUl9BTkFfUExMX0NGRyAgICAgICAgIChDU1JfQkFTRSsweDIwYykKLQotLyoKLSAqIENTUiBIYXJkd2FyZSBSZXZpc2lvbiBXb3JrYXJvdW5kIFJlZ2lzdGVyLiAgSW5kaWNhdGVzIGhhcmR3YXJlIHJldjsKLSAqICJzdGVwIiBkZXRlcm1pbmVzIENDSyBiYWNrb2ZmIGZvciB0eHBvd2VyIGNhbGN1bGF0aW9uLiAgVXNlZCBmb3IgNDk2NSBvbmx5LgotICogU2VlIGFsc28gQ1NSX0hXX1JFViByZWdpc3Rlci4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMy0yOiAgMCA9IEEsIDEgPSBCLCAyID0gQywgMyA9IEQgc3RlcAotICogIDEtMDogICJEYXNoIiAoLSkgdmFsdWUsIGFzIGluIEMtMSwgZXRjLgotICovCi0jZGVmaW5lIENTUl9IV19SRVZfV0FfUkVHCQkoQ1NSX0JBU0UrMHgyMkMpCi0KLSNkZWZpbmUgQ1NSX0RCR19IUEVUX01FTV9SRUcJCShDU1JfQkFTRSsweDI0MCkKLSNkZWZpbmUgQ1NSX0RCR19MSU5LX1BXUl9NR01UX1JFRwkoQ1NSX0JBU0UrMHgyNTApCi0KLS8qIEJpdHMgZm9yIENTUl9IV19JRl9DT05GSUdfUkVHICovCi0jZGVmaW5lIENTUjQ5X0hXX0lGX0NPTkZJR19SRUdfQklUXzQ5NjVfUgkoMHgwMDAwMDAxMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfTVNLX0JPQVJEX1ZFUgkoMHgwMDAwMEMwMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSAJKDB4MDAwMDAxMDApCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9SQURJT19TSQkoMHgwMDAwMDIwMCkKLQotI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF8zOTQ1X01CICAgICAgICAgKDB4MDAwMDAxMDApCi0jZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTU0gICAgICAgICAoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfU0tVX01SQyAgICAgICAgICAgICgweDAwMDAwNDAwKQotI2RlZmluZSBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFICAgICAgICAgKDB4MDAwMDA4MDApCi0jZGVmaW5lIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUU19TSUxJQ09OX1RZUEVfQSAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9CICAgICgweDAwMDAxMDAwKQotCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9IQVBfV0FLRV9MMUEJKDB4MDAwODAwMDApCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTQkoMHgwMDIwMDAwMCkKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWQkoMHgwMDQwMDAwMCkgLyogUENJX09XTl9TRU0gKi8KLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUgKDB4MDIwMDAwMDApIC8qIE1FX09XTiAqLwotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19QUkVQQVJFCQkgICgweDA4MDAwMDAwKSAvKiBXQUtFX01FICovCi0KLSNkZWZpbmUgQ1NSX0lOVF9QRVJJT0RJQ19ESVMJCQkoMHgwMCkgLyogZGlzYWJsZSBwZXJpb2RpYyBpbnQqLwotI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0VOQQkJCSgweEZGKSAvKiAyNTUqMzIgdXNlYyB+IDggbXNlYyovCi0KLS8qIGludGVycnVwdCBmbGFncyBpbiBJTlRBLCBzZXQgYnkgdUNvZGUgb3IgaGFyZHdhcmUgKGUuZy4gZG1hKSwKLSAqIGFja25vd2xlZGdlZCAocmVzZXQpIGJ5IGhvc3Qgd3JpdGluZyAiMSIgdG8gZmxhZ2dlZCBiaXRzLiAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9GSF9SWCAgICAgICAgKDEgPDwgMzEpIC8qIFJ4IERNQSwgY21kIHJlc3BvbnNlcywgRkhfSU5UWzE3OjE2XSAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9IV19FUlIgICAgICAgKDEgPDwgMjkpIC8qIERNQSBoYXJkd2FyZSBlcnJvciBGSF9JTlRbMzFdICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JYX1BFUklPRElDCSAoMSA8PCAyOCkgLyogUnggcGVyaW9kaWMgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfVFggICAgICAgICgxIDw8IDI3KSAvKiBUeCBETUEgRkhfSU5UWzE6MF0gKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfU0NEICAgICAgICAgICgxIDw8IDI2KSAvKiBUWFEgcG9pbnRlciBhZHZhbmNlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9TV19FUlIgICAgICAgKDEgPDwgMjUpIC8qIHVDb2RlIGVycm9yICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JGX0tJTEwgICAgICAoMSA8PCA3KSAgLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikgIC8qIENyaXRpY2FsIHRlbXAgKGNoaXAgdG9vIGhvdCkgcmZraWxsICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1NXX1JYICAgICAgICAoMSA8PCAzKSAgLyogUngsIGNvbW1hbmQgcmVzcG9uc2VzLCAzOTQ1ICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1dBS0VVUCAgICAgICAoMSA8PCAxKSAgLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApICAvKiB1Q29kZSBpbnRlcnJ1cHRzIG9uY2UgaXQgaW5pdGlhbGl6ZXMgKi8KLQotI2RlZmluZSBDU1JfSU5JX1NFVF9NQVNLCShDU1JfSU5UX0JJVF9GSF9SWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9IV19FUlIgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9GSF9UWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9TV19FUlIgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9SRl9LSUxMIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9TV19SWCAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9XQUtFVVAgIHwgXAotCQkJCSBDU1JfSU5UX0JJVF9BTElWRSkKLQotLyogaW50ZXJydXB0IGZsYWdzIGluIEZIIChmbG93IGhhbmRsZXIpIChQQ0kgYnVzbWFzdGVyIERNQSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfRVJSICAgICAgICgxIDw8IDMxKSAvKiBFcnJvciAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9ISV9QUklPUiAgKDEgPDwgMzApIC8qIEhpZ2ggcHJpb3JpdHkgUngsIGJ5cGFzcyBjb2FsZXNjaW5nICovCi0jZGVmaW5lIENTUjM5X0ZIX0lOVF9CSVRfUlhfQ0hOTDIgICgxIDw8IDE4KSAvKiBSeCBjaGFubmVsIDIgKDM5NDUgb25seSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDEgICgxIDw8IDE3KSAvKiBSeCBjaGFubmVsIDEgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDAgICgxIDw8IDE2KSAvKiBSeCBjaGFubmVsIDAgKi8KLSNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9UWF9DSE5MNiAgKDEgPDwgNikgIC8qIFR4IGNoYW5uZWwgNiAoMzk0NSBvbmx5KSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMSAgKDEgPDwgMSkgIC8qIFR4IGNoYW5uZWwgMSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkgIC8qIFR4IGNoYW5uZWwgMCAqLwotCi0jZGVmaW5lIENTUjM5X0ZIX0lOVF9SWF9NQVNLCShDU1JfRkhfSU5UX0JJVF9ISV9QUklPUiB8IFwKLQkJCQkgQ1NSMzlfRkhfSU5UX0JJVF9SWF9DSE5MMiB8IFwKLQkJCQkgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDEgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwwKQotCi0KLSNkZWZpbmUgQ1NSMzlfRkhfSU5UX1RYX01BU0sJKENTUjM5X0ZIX0lOVF9CSVRfVFhfQ0hOTDYgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwxIHwgXAotCQkJCSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCkKLQotI2RlZmluZSBDU1I0OV9GSF9JTlRfUlhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfSElfUFJJT1IgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1JYX0NITkwxIHwgXAotCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCkKLQotI2RlZmluZSBDU1I0OV9GSF9JTlRfVFhfTUFTSwkoQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgfCBcCi0JCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwwKQotCi0vKiBHUElPICovCi0jZGVmaW5lIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCi0jZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WQVVYX1BXUl9TUkMgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCi0jZGVmaW5lIENTUl9HUElPX0lOX1ZBTF9WTUFJTl9QV1JfU1JDICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCi0KLS8qIFJFU0VUICovCi0jZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQotI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfRk9SQ0VfTk1JICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKLSNkZWZpbmUgQ1NSX1JFU0VUX1JFR19GTEFHX1NXX1JFU0VUICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCi0jZGVmaW5lIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQgICAgICAgICAgICgweDAwMDAwMTAwKQotI2RlZmluZSBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQgICAgICAgICAgICAgKDB4ODAwMDAwMDApCi0KLS8qCi0gKiBHUCAoZ2VuZXJhbCBwdXJwb3NlKSBDT05UUk9MIFJFR0lTVEVSCi0gKiBCaXQgZmllbGRzOgotICogICAgMjc6ICBIV19SRl9LSUxMX1NXCi0gKiAgICAgICAgIEluZGljYXRlcyBzdGF0ZSBvZiAocGxhdGZvcm0ncykgaGFyZHdhcmUgUkYtS2lsbCBzd2l0Y2gKLSAqIDI2LTI0OiAgUE9XRVJfU0FWRV9UWVBFCi0gKiAgICAgICAgIEluZGljYXRlcyBjdXJyZW50IHBvd2VyLXNhdmluZyBtb2RlOgotICogICAgICAgICAwMDAgLS0gTm8gcG93ZXIgc2F2aW5nCi0gKiAgICAgICAgIDAwMSAtLSBNQUMgcG93ZXItZG93bgotICogICAgICAgICAwMTAgLS0gUEhZIChyYWRpbykgcG93ZXItZG93bgotICogICAgICAgICAwMTEgLS0gRXJyb3IKLSAqICAgOS02OiAgU1lTX0NPTkZJRwotICogICAgICAgICBJbmRpY2F0ZXMgY3VycmVudCBzeXN0ZW0gY29uZmlndXJhdGlvbiwgcmVmbGVjdGluZyBwaW5zIG9uIGNoaXAKLSAqICAgICAgICAgYXMgZm9yY2VkIGhpZ2gvbG93IGJ5IGRldmljZSBjaXJjdWl0IGJvYXJkLgotICogICAgIDQ6ICBHT0lOR19UT19TTEVFUAotICogICAgICAgICBJbmRpY2F0ZXMgTUFDIGlzIGVudGVyaW5nIGEgcG93ZXItc2F2aW5nIHNsZWVwIHBvd2VyLWRvd24uCi0gKiAgICAgICAgIE5vdCBhIGdvb2QgdGltZSB0byBhY2Nlc3MgZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4KLSAqICAgICAzOiAgTUFDX0FDQ0VTU19SRVEKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBhbmQgbWFpbnRhaW4gTUFDIHdha2V1cCwgdG8gYWxsb3cgaG9zdAotICogICAgICAgICBhY2Nlc3MgdG8gZGV2aWNlLWludGVybmFsIHJlc291cmNlcy4gIEhvc3QgbXVzdCB3YWl0IGZvcgotICogICAgICAgICBNQUNfQ0xPQ0tfUkVBRFkgKGFuZCAhR09JTkdfVE9fU0xFRVApIGJlZm9yZSBhY2Nlc3Npbmcgbm9uLUNTUgotICogICAgICAgICBkZXZpY2UgcmVnaXN0ZXJzLgotICogICAgIDI6ICBJTklUX0RPTkUKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcHV0IGRldmljZSBpbnRvIGZ1bGx5IG9wZXJhdGlvbmFsIEQwIHBvd2VyIG1vZGUuCi0gKiAgICAgICAgIEhvc3QgcmVzZXRzIHRoaXMgYWZ0ZXIgU1dfUkVTRVQgdG8gcHV0IGRldmljZSBpbnRvIGxvdyBwb3dlciBtb2RlLgotICogICAgIDA6ICBNQUNfQ0xPQ0tfUkVBRFkKLSAqICAgICAgICAgSW5kaWNhdGVzIE1BQyAodWNvZGUgcHJvY2Vzc29yLCBldGMuKSBpcyBwb3dlcmVkIHVwIGFuZCBjYW4gcnVuLgotICogICAgICAgICBJbnRlcm5hbCByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUuCi0gKiAgICAgICAgIE5PVEU6ICBUaGlzIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBhY3R1YWxseSBydW5uaW5nLgotICogICAgICAgICBOT1RFOiAgVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IDQ5NjUgb3IgMzk0NSBoYXMgY29tcGxldGVkCi0gKiAgICAgICAgICAgICAgICBpbml0IG9yIHBvc3QtcG93ZXItZG93biByZXN0b3JlIG9mIGludGVybmFsIFNSQU0gbWVtb3J5LgotICogICAgICAgICAgICAgICAgVXNlIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgYXMgaW5kaWNhdGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICBTUkFNIGlzIHJlc3RvcmVkIGFuZCB1Q29kZSBpcyBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuCi0gKiAgICAgICAgICAgICAgICBMYXRlciBkZXZpY2VzICg1eHh4LzZ4eHgvMXh4eCkgdXNlIG5vbi12b2xhdGlsZSBTUkFNLCBhbmQKLSAqICAgICAgICAgICAgICAgIGRvIG5vdCBuZWVkIHRvIHNhdmUvcmVzdG9yZSBpdC4KLSAqICAgICAgICAgTk9URTogIEFmdGVyIGRldmljZSByZXNldCwgdGhpcyBiaXQgcmVtYWlucyAiMCIgdW50aWwgaG9zdCBzZXRzCi0gKiAgICAgICAgICAgICAgICBJTklUX0RPTkUKLSAqLwotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZICAgICAgICAoMHgwMDAwMDAwMSkKLSNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSAgICAgICAgICgweDAwMDAwMDA4KQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVAgICAgICAgICAoMHgwMDAwMDAxMCkKLQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOICAgICAgICAgICAoMHgwMDAwMDAwMSkKLQotI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX01TS19QT1dFUl9TQVZFX1RZUEUgICAgICAgICAoMHgwNzAwMDAwMCkKLSNkZWZpbmUgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19QT1dFUl9TQVZFICAgICAgICAgKDB4MDQwMDAwMDApCi0jZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXICAgICAgICAgICgweDA4MDAwMDAwKQotCi0KLS8qIEVFUFJPTSBSRUcgKi8KLSNkZWZpbmUgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIENTUl9FRVBST01fUkVHX0JJVF9DTUQJCSgweDAwMDAwMDAyKQotI2RlZmluZSBDU1JfRUVQUk9NX1JFR19NU0tfQUREUgkJKDB4MDAwMEZGRkMpCi0jZGVmaW5lIENTUl9FRVBST01fUkVHX01TS19EQVRBCQkoMHhGRkZGMDAwMCkKLQotLyogRUVQUk9NIEdQICovCi0jZGVmaW5lIENTUl9FRVBST01fR1BfVkFMSURfTVNLCQkoMHgwMDAwMDAwNykgLyogc2lnbmF0dXJlICovCi0jZGVmaW5lIENTUl9FRVBST01fR1BfSUZfT1dORVJfTVNLCSgweDAwMDAwMTgwKQotI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEsJCSgweDAwMDAwMDAyKQotI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEsJCSgweDAwMDAwMDA0KQotCi0vKiBHUCBSRUcgKi8KLSNkZWZpbmUgQ1NSX0dQX1JFR19QT1dFUl9TQVZFX1NUQVRVU19NU0sgICAgICAgICAgICAoMHgwMzAwMDAwMCkgLyogYml0IDI0LzI1ICovCi0jZGVmaW5lIENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSAgICAgICAgICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBDU1JfR1BfUkVHX01BQ19QT1dFUl9TQVZFICAgICAgICAgICAoMHgwMTAwMDAwMCkKLSNkZWZpbmUgQ1NSX0dQX1JFR19QSFlfUE9XRVJfU0FWRSAgICAgICAgICAgKDB4MDIwMDAwMDApCi0jZGVmaW5lIENTUl9HUF9SRUdfUE9XRVJfU0FWRV9FUlJPUiAgICAgICAgICgweDAzMDAwMDAwKQotCi0KLS8qIENTUiBHSU8gKi8KLSNkZWZpbmUgQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVECSgweDAwMDAwMDAyKQotCi0vKgotICogVUNPREUtRFJJVkVSIEdQIChnZW5lcmFsIHB1cnBvc2UpIG1haWxib3ggcmVnaXN0ZXIgMQotICogSG9zdCBkcml2ZXIgYW5kIHVDb2RlIHdyaXRlIGFuZC9vciByZWFkIHRoaXMgcmVnaXN0ZXIgdG8gY29tbXVuaWNhdGUgd2l0aAotICogZWFjaCBvdGhlci4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgICAgNDogIFVDT0RFX0RJU0FCTEUKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBwZXJtYW5lbnQgaGFsdCBvZiB1Q29kZSwgc2FtZSBhcwotICogICAgICAgICBzZW5kaW5nIENBUkRfU1RBVEUgY29tbWFuZCB3aXRoICJoYWx0IiBiaXQgc2V0LgotICogICAgIDM6ICBDVF9LSUxMX0VYSVQKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgdG8gcmVxdWVzdCBleGl0IGZyb20gQ1RfS0lMTCBzdGF0ZSwgaS5lLiBob3N0IHRoaW5rcwotICogICAgICAgICBkZXZpY2UgdGVtcGVyYXR1cmUgaXMgbG93IGVub3VnaCB0byBjb250aW51ZSBub3JtYWwgb3BlcmF0aW9uLgotICogICAgIDI6ICBDTURfQkxPQ0tFRAotICogICAgICAgICBIb3N0IHNldHMgdGhpcyBkdXJpbmcgUkYgS0lMTCBwb3dlci1kb3duIHNlcXVlbmNlIChIVywgU1csIENUIEtJTEwpCi0gKiAgICAgICAgIHRvIHJlbGVhc2UgdUNvZGUgdG8gY2xlYXIgYWxsIFR4IGFuZCBjb21tYW5kIHF1ZXVlcywgZW50ZXIKLSAqICAgICAgICAgdW5hc3NvY2lhdGVkIG1vZGUsIGFuZCBwb3dlciBkb3duLgotICogICAgICAgICBOT1RFOiAgU29tZSBkZXZpY2VzIGFsc28gdXNlIEhCVVNfVEFSR19NQlhfQyByZWdpc3RlciBmb3IgdGhpcyBiaXQuCi0gKiAgICAgMTogIFNXX0JJVF9SRktJTEwKLSAqICAgICAgICAgSG9zdCBzZXRzIHRoaXMgd2hlbiBpc3N1aW5nIENBUkRfU1RBVEUgY29tbWFuZCB0byByZXF1ZXN0Ci0gKiAgICAgICAgIGRldmljZSBzbGVlcC4KLSAqICAgICAwOiAgTUFDX1NMRUVQCi0gKiAgICAgICAgIHVDb2RlIHNldHMgdGhpcyB3aGVuIHByZXBhcmluZyBhIHBvd2VyLXNhdmluZyBwb3dlci1kb3duLgotICogICAgICAgICB1Q29kZSByZXNldHMgdGhpcyB3aGVuIHBvd2VyLXVwIGlzIGNvbXBsZXRlIGFuZCBTUkFNIGlzIHNhbmUuCi0gKiAgICAgICAgIE5PVEU6ICAzOTQ1LzQ5NjUgc2F2ZXMgaW50ZXJuYWwgU1JBTSBkYXRhIHRvIGhvc3Qgd2hlbiBwb3dlcmluZyBkb3duLAotICogICAgICAgICAgICAgICAgYW5kIG11c3QgcmVzdG9yZSB0aGlzIGRhdGEgYWZ0ZXIgcG93ZXJpbmcgYmFjayB1cC4KLSAqICAgICAgICAgICAgICAgIE1BQ19TTEVFUCBpcyB0aGUgYmVzdCBpbmRpY2F0aW9uIHRoYXQgcmVzdG9yZSBpcyBjb21wbGV0ZS4KLSAqICAgICAgICAgICAgICAgIExhdGVyIGRldmljZXMgKDV4eHgvNnh4eC8xeHh4KSB1c2Ugbm9uLXZvbGF0aWxlIFNSQU0sIGFuZAotICogICAgICAgICAgICAgICAgZG8gbm90IG5lZWQgdG8gc2F2ZS9yZXN0b3JlIGl0LgotICovCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCi0jZGVmaW5lIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICAgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIENTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUICAgICAgKDB4MDAwMDAwMDgpCi0KLS8qIEdJTyBDaGlja2VuIEJpdHMgKFBDSSBFeHByZXNzIGJ1cyBsaW5rIHBvd2VyIG1hbmFnZW1lbnQpICovCi0jZGVmaW5lIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfTDFBX05PX0wwU19SWCAgKDB4MDA4MDAwMDApCi0jZGVmaW5lIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfRElTX0wwU19FWElUX1RJTUVSICAoMHgyMDAwMDAwMCkKLQotLyogTEVEICovCi0jZGVmaW5lIENTUl9MRURfQlNNX0NUUkxfTVNLICgweEZGRkZGRkRGKQotI2RlZmluZSBDU1JfTEVEX1JFR19UUlVOX09OICgweDc4KQotI2RlZmluZSBDU1JfTEVEX1JFR19UUlVOX09GRiAoMHgzOCkKLQotLyogQU5BX1BMTCAqLwotI2RlZmluZSBDU1IzOV9BTkFfUExMX0NGR19WQUwgICAgICAgICgweDAxMDAwMDAwKQotCi0vKiBIUEVUIE1FTSBkZWJ1ZyAqLwotI2RlZmluZSBDU1JfREJHX0hQRVRfTUVNX1JFR19WQUwJKDB4RkZGRjAwMDApCi0KLS8qIERSQU0gSU5UIFRBQkxFICovCi0jZGVmaW5lIENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFCQkoMSA8PCAzMSkKLSNkZWZpbmUgQ1NSX0RSQU1fSU5JVF9UQkxfV1JBUF9DSEVDSwkoMSA8PCAyNykKLQotLyoKLSAqIEhCVVMgKEhvc3Qtc2lkZSBCdXMpCi0gKgotICogSEJVUyByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSBpbnRvIFBDSSBidXMgc3BhY2UsIGJ1dCBhcmUgdXNlZAotICogdG8gaW5kaXJlY3RseSBhY2Nlc3MgZGV2aWNlJ3MgaW50ZXJuYWwgbWVtb3J5IG9yIHJlZ2lzdGVycyB0aGF0Ci0gKiBtYXkgYmUgcG93ZXJlZC1kb3duLgotICoKLSAqIFVzZSBpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKCkvaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKCkgZmFtaWx5Ci0gKiBmb3IgdGhlc2UgcmVnaXN0ZXJzOwotICogaG9zdCBtdXN0ICJncmFiIG5pYyBhY2Nlc3MiIHZpYSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEKLSAqIHRvIG1ha2Ugc3VyZSB0aGUgTUFDICh1Q29kZSBwcm9jZXNzb3IsIGV0Yy4pIGlzIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZwotICogaW50ZXJuYWwgcmVzb3VyY2VzLgotICoKLSAqIERvIG5vdCB1c2UgaXdsX3dyaXRlMzIoKS9pd2xfcmVhZDMyKCkgZmFtaWx5IHRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnM7Ci0gKiB0aGVzZSBwcm92aWRlIG9ubHkgc2ltcGxlIFBDSSBidXMgYWNjZXNzLCB3aXRob3V0IHdha2luZyB1cCB0aGUgTUFDLgotICovCi0jZGVmaW5lIEhCVVNfQkFTRQkoMHg0MDApCi0KLS8qCi0gKiBSZWdpc3RlcnMgZm9yIGFjY2Vzc2luZyBkZXZpY2UncyBpbnRlcm5hbCBTUkFNIG1lbW9yeSAoZS5nLiBTQ0QgU1JBTQotICogc3RydWN0dXJlcywgZXJyb3IgbG9nLCBldmVudCBsb2csIHZlcmlmeWluZyB1Q29kZSBsb2FkKS4KLSAqIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsIHRoZW4gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGRhdGEgcmVnaXN0ZXIKLSAqIHRvIGNvbXBsZXRlIHRoZSBqb2IuICBPbmNlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGlzIHNldCB1cCwgYWNjZXNzZXMgdG8KLSAqIGRhdGEgcmVnaXN0ZXJzIGF1dG8taW5jcmVtZW50IHRoZSBhZGRyZXNzIGJ5IG9uZSBkd29yZC4KLSAqIEJpdCB1c2FnZSBmb3IgYWRkcmVzcyByZWdpc3RlcnMgKHJlYWQgb3Igd3JpdGUpOgotICogIDAtMzE6ICBtZW1vcnkgYWRkcmVzcyB3aXRoaW4gZGV2aWNlCi0gKi8KLSNkZWZpbmUgSEJVU19UQVJHX01FTV9SQUREUiAgICAgKEhCVVNfQkFTRSsweDAwYykKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9XQUREUiAgICAgKEhCVVNfQkFTRSsweDAxMCkKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9XREFUICAgICAgKEhCVVNfQkFTRSsweDAxOCkKLSNkZWZpbmUgSEJVU19UQVJHX01FTV9SREFUICAgICAgKEhCVVNfQkFTRSsweDAxYykKLQotLyogTWFpbGJveCBDLCB1c2VkIGFzIHdvcmthcm91bmQgYWx0ZXJuYXRpdmUgdG8gQ1NSX1VDT0RFX0RSVl9HUDEgbWFpbGJveCAqLwotI2RlZmluZSBIQlVTX1RBUkdfTUJYX0MgICAgICAgICAoSEJVU19CQVNFKzB4MDMwKQotI2RlZmluZSBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCAgICAgICAgICgweDAwMDAwMDA0KQotCi0vKgotICogUmVnaXN0ZXJzIGZvciBhY2Nlc3NpbmcgZGV2aWNlJ3MgaW50ZXJuYWwgcGVyaXBoZXJhbCByZWdpc3RlcnMKLSAqIChlLmcuIFNDRCwgQlNNLCBldGMuKS4gIEZpcnN0IHdyaXRlIHRvIGFkZHJlc3MgcmVnaXN0ZXIsCi0gKiB0aGVuIHJlYWQgZnJvbSBvciB3cml0ZSB0byBkYXRhIHJlZ2lzdGVyIHRvIGNvbXBsZXRlIHRoZSBqb2IuCi0gKiBCaXQgdXNhZ2UgZm9yIGFkZHJlc3MgcmVnaXN0ZXJzIChyZWFkIG9yIHdyaXRlKToKLSAqICAwLTE1OiAgcmVnaXN0ZXIgYWRkcmVzcyAob2Zmc2V0KSB3aXRoaW4gZGV2aWNlCi0gKiAyNC0yNTogICgjIGJ5dGVzIC0gMSkgdG8gcmVhZCBvciB3cml0ZSAoZS5nLiAzIGZvciBkd29yZCkKLSAqLwotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XQUREUiAgICAoSEJVU19CQVNFKzB4MDQ0KQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SQUREUiAgICAoSEJVU19CQVNFKzB4MDQ4KQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9XREFUICAgICAoSEJVU19CQVNFKzB4MDRjKQotI2RlZmluZSBIQlVTX1RBUkdfUFJQSF9SREFUICAgICAoSEJVU19CQVNFKzB4MDUwKQotCi0vKgotICogUGVyLVR4LXF1ZXVlIHdyaXRlIHBvaW50ZXIgKGluZGV4LCByZWFsbHkhKQotICogSW5kaWNhdGVzIGluZGV4IHRvIG5leHQgVEZEIHRoYXQgZHJpdmVyIHdpbGwgZmlsbCAoMSBwYXN0IGxhdGVzdCBmaWxsZWQpLgotICogQml0IHVzYWdlOgotICogIDAtNzogIHF1ZXVlIHdyaXRlIGluZGV4Ci0gKiAxMS04OiAgcXVldWUgc2VsZWN0b3IKLSAqLwotI2RlZmluZSBIQlVTX1RBUkdfV1JQVFIgICAgICAgICAoSEJVU19CQVNFKzB4MDYwKQotCi0jZW5kaWYgLyogIV9faXdsX2xlZ2FjeV9jc3JfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEzMTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2RlYnVnX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfZGVidWdfaF9fCi0KLXN0cnVjdCBpd2xfcHJpdjsKLWV4dGVybiB1MzIgaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci0KLSNkZWZpbmUgSVdMX0VSUihwLCBmLCBhLi4uKSBkZXZfZXJyKCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfV0FSTihwLCBmLCBhLi4uKSBkZXZfd2FybigmKChwKS0+cGNpX2Rldi0+ZGV2KSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0lORk8ocCwgZiwgYS4uLikgZGV2X2luZm8oJigocCktPnBjaV9kZXYtPmRldiksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9DUklUKHAsIGYsIGEuLi4pIGRldl9jcml0KCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotCi0jZGVmaW5lIGl3bF9wcmludF9oZXhfZXJyb3IocHJpdiwgcCwgbGVuKQkJCQkgXAotZG8gewkJCQkJCQkJCVwKLQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIml3bCBkYXRhOiAiLAkJCQlcCi0JCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW4sIDEpOwkJXAotfSB3aGlsZSAoMCkKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotI2RlZmluZSBJV0xfREVCVUcoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChfX3ByaXYpICYgKGxldmVsKSkJCQlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICYoX19wcml2LT5ody0+d2lwaHktPmRldiksCQlcCi0JCQkgIiVjICVzICIgZm10LCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywJXAotCQkJX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBJV0xfREVCVUdfTElNSVQoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChfX3ByaXYpICYgKGxldmVsKSkgJiYgbmV0X3JhdGVsaW1pdCgpKQlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICYoX19wcml2LT5ody0+d2lwaHktPmRldiksCQlcCi0JCQkiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCi0JCQkgX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgbGV2ZWwsIHAsIGxlbikgCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBsZXZlbCkJCQkJXAotCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiaXdsIGRhdGE6ICIsCQlcCi0JCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UKLSNkZWZpbmUgSVdMX0RFQlVHKF9fcHJpdiwgbGV2ZWwsIGZtdCwgYXJncy4uLikKLSNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKF9fcHJpdiwgbGV2ZWwsIGZtdCwgYXJncy4uLikKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfcHJpbnRfaGV4X2R1bXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgbGV2ZWwsCi0JCQkJICAgICAgY29uc3Qgdm9pZCAqcCwgdTMyIGxlbikKLXt9Ci0jZW5kaWYJCQkJLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotaW50IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQKLWl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci19Ci0jZW5kaWYJCQkJLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMgKi8KLQotLyoKLSAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOgotICoKLSAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKLSAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZgotICoKLSAqICNkZWZpbmUgSVdMX0RMX3h4eHggVkFMVUUKLSAqCi0gKiB3aGVyZSB4eHh4IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NpZmljYXRpb24gKGZvciBleGFtcGxlLCBXRVApLgotICoKLSAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElXTF94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgotICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJV0xfREVCVUcoSVdMX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKLSAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCi0gKgotICogVGhlIGFjdGl2ZSBkZWJ1ZyBsZXZlbHMgY2FuIGJlIGFjY2Vzc2VkIHZpYSBmaWxlcwotICoKLSAqIAkvc3lzL21vZHVsZS9pd2w0OTY1L3BhcmFtZXRlcnMvZGVidWd7NTB9Ci0gKgkvc3lzL21vZHVsZS9pd2wzOTQ1L3BhcmFtZXRlcnMvZGVidWcKLSAqIAkvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvZGVidWdfbGV2ZWwKLSAqCi0gKiB3aGVuIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRz15LgotICovCi0KLS8qIDB4MDAwMDAwMEYgLSAweDAwMDAwMDAxICovCi0jZGVmaW5lIElXTF9ETF9JTkZPCQkoMSA8PCAwKQotI2RlZmluZSBJV0xfRExfTUFDODAyMTEJCSgxIDw8IDEpCi0jZGVmaW5lIElXTF9ETF9IQ01ECQkoMSA8PCAyKQotI2RlZmluZSBJV0xfRExfU1RBVEUJCSgxIDw8IDMpCi0vKiAweDAwMDAwMEYwIC0gMHgwMDAwMDAxMCAqLwotI2RlZmluZSBJV0xfRExfTUFDRFVNUAkJKDEgPDwgNCkKLSNkZWZpbmUgSVdMX0RMX0hDTURfRFVNUAkoMSA8PCA1KQotI2RlZmluZSBJV0xfRExfRUVQUk9NCQkoMSA8PCA2KQotI2RlZmluZSBJV0xfRExfUkFESU8JCSgxIDw8IDcpCi0vKiAweDAwMDAwRjAwIC0gMHgwMDAwMDEwMCAqLwotI2RlZmluZSBJV0xfRExfUE9XRVIJCSgxIDw8IDgpCi0jZGVmaW5lIElXTF9ETF9URU1QCQkoMSA8PCA5KQotI2RlZmluZSBJV0xfRExfTk9USUYJCSgxIDw8IDEwKQotI2RlZmluZSBJV0xfRExfU0NBTgkJKDEgPDwgMTEpCi0vKiAweDAwMDBGMDAwIC0gMHgwMDAwMTAwMCAqLwotI2RlZmluZSBJV0xfRExfQVNTT0MJCSgxIDw8IDEyKQotI2RlZmluZSBJV0xfRExfRFJPUAkJKDEgPDwgMTMpCi0jZGVmaW5lIElXTF9ETF9UWFBPV0VSCQkoMSA8PCAxNCkKLSNkZWZpbmUgSVdMX0RMX0FQCQkoMSA8PCAxNSkKLS8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCi0jZGVmaW5lIElXTF9ETF9GVwkJKDEgPDwgMTYpCi0jZGVmaW5lIElXTF9ETF9SRl9LSUxMCQkoMSA8PCAxNykKLSNkZWZpbmUgSVdMX0RMX0ZXX0VSUk9SUwkoMSA8PCAxOCkKLSNkZWZpbmUgSVdMX0RMX0xFRAkJKDEgPDwgMTkpCi0vKiAweDAwRjAwMDAwIC0gMHgwMDEwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfUkFURQkJKDEgPDwgMjApCi0jZGVmaW5lIElXTF9ETF9DQUxJQgkJKDEgPDwgMjEpCi0jZGVmaW5lIElXTF9ETF9XRVAJCSgxIDw8IDIyKQotI2RlZmluZSBJV0xfRExfVFgJCSgxIDw8IDIzKQotLyogMHgwRjAwMDAwMCAtIDB4MDEwMDAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX1JYCQkoMSA8PCAyNCkKLSNkZWZpbmUgSVdMX0RMX0lTUgkJKDEgPDwgMjUpCi0jZGVmaW5lIElXTF9ETF9IVAkJKDEgPDwgMjYpCi0jZGVmaW5lIElXTF9ETF9JTwkJKDEgPDwgMjcpCi0vKiAweEYwMDAwMDAwIC0gMHgxMDAwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfMTFICQkoMSA8PCAyOCkKLSNkZWZpbmUgSVdMX0RMX1NUQVRTCQkoMSA8PCAyOSkKLSNkZWZpbmUgSVdMX0RMX1RYX1JFUExZCQkoMSA8PCAzMCkKLSNkZWZpbmUgSVdMX0RMX1FPUwkJKDEgPDwgMzEpCi0KLSNkZWZpbmUgSVdMX0RFQlVHX0lORk8ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9JTkZPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTUFDODAyMTEocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUM4MDIxMSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX01BQ0RVTVAocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUNEVU1QLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVEVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RFTVAsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19TQ0FOKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfU0NBTiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1JYKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUlgsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19UWChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSVNSKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSVNSLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTEVEKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTEVELCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfV0VQKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfV0VQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSEMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9IQ01ELCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSENfRFVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hDTURfRFVNUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0VFUFJPTShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0VFUFJPTSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0NBTElCKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfQ0FMSUIsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19GVyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0ZXLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUkZfS0lMTChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JGX0tJTEwsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19EUk9QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfRFJPUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0RST1BfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX0RST1AsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19BUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0FQLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVFhQT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYUE9XRVIsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19JTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0lPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUkFURShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JBVEUsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SQVRFX0xJTUlUKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9SQVRFLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTk9USUYocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9OT1RJRiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0FTU09DKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHKHAsIElXTF9ETF9BU1NPQyB8IElXTF9ETF9JTkZPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfQVNTT0NfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX0FTU09DIHwgSVdMX0RMX0lORk8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19IVChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hULCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfU1RBVFMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9TVEFUUywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1NUQVRTX0xJTUlUKHAsIGYsIGEuLi4pCVwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9TVEFUUywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1RYX1JFUExZKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19UWF9SRVBMWV9MSU1JVChwLCBmLCBhLi4uKSBcCi0JCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfVFhfUkVQTFksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19RT1MocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9RT1MsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SQURJTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1JBRElPLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUE9XRVIocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9QT1dFUiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHXzExSChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMXzExSCwgZiwgIyMgYSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2OTk2YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyogY3JlYXRlIGFuZCByZW1vdmUgb2YgZmlsZXMgKi8KLSNkZWZpbmUgREVCVUdGU19BRERfRklMRShuYW1lLCBwYXJlbnQsIG1vZGUpIGRvIHsJCQlcCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCNuYW1lLCBtb2RlLCBwYXJlbnQsIHByaXYsCQlcCi0JCQkgJml3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfb3BzKSkJCVwKLQkJZ290byBlcnI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUJVR0ZTX0FERF9CT09MKG5hbWUsIHBhcmVudCwgcHRyKSBkbyB7CQkJXAotCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKLQlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX2Jvb2woI25hbWUsIFNfSVdVU1IgfCBTX0lSVVNSLAkJXAotCQkJCSAgICBwYXJlbnQsIHB0cik7CQkJXAotCWlmIChJU19FUlIoX190bXApIHx8ICFfX3RtcCkJCQkJCVwKLQkJZ290byBlcnI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUJVR0ZTX0FERF9YMzIobmFtZSwgcGFyZW50LCBwdHIpIGRvIHsJCQkJXAotCXN0cnVjdCBkZW50cnkgKl9fdG1wOwkJCQkJCVwKLQlfX3RtcCA9IGRlYnVnZnNfY3JlYXRlX3gzMigjbmFtZSwgU19JV1VTUiB8IFNfSVJVU1IsCQlcCi0JCQkJICAgcGFyZW50LCBwdHIpOwkJCVwKLQlpZiAoSVNfRVJSKF9fdG1wKSB8fCAhX190bXApCQkJCQlcCi0JCWdvdG8gZXJyOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIGZpbGUgb3BlcmF0aW9uICovCi0jZGVmaW5lIERFQlVHRlNfUkVBRF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsICAgICAgICAgICAgICAgXAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsICAgICAgICAgIFwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi0jZGVmaW5lIERFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCAgICAgICAgICAgICAgXAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsICAgIFwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi0KLXN0YXRpYyBpbnQKLWl3bF9sZWdhY3lfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBERUJVR0ZTX1JFQURfRklMRV9PUFMobmFtZSkgCQkJCVwKLQlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkucmVhZCA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAotCS5vcGVuID0gaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywgICAgICAgICAgICAgICAgICAgIAlcCi0JLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCQlcCi19OwotCi0jZGVmaW5lIERFQlVHRlNfV1JJVEVfRklMRV9PUFMobmFtZSkgCQkJCVwKLQlERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkud3JpdGUgPSBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlLAkJCVwKLQkub3BlbiA9IGl3bF9sZWdhY3lfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMsICAgICAgICAgICAgICAgICAgICAJXAotCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAotfTsKLQotI2RlZmluZSBERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JREVCVUdGU19SRUFEX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlERUJVR0ZTX1dSSVRFX0ZVTkMobmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMgPSB7CVwKLQkud3JpdGUgPSBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX3dyaXRlLAkJCVwKLQkucmVhZCA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAotCS5vcGVuID0gaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywJCQlcCi0JLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCQlcCi19OwotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3R4X3N0YXRpc3RpY3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqYnVmOwotCWludCBwb3MgPSAwOwotCi0JaW50IGNudDsKLQlzc2l6ZV90IHJldDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSAxMDAgKwotCQlzaXplb2YoY2hhcikgKiA1MCAqIChNQU5BR0VNRU5UX01BWCArIENPTlRST0xfTUFYKTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiTWFuYWdlbWVudDpcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgTUFOQUdFTUVOVF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT50eF9zdGF0cy5tZ210W2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sXG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IENPTlRST0xfTUFYOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICJcdCUyNXNcdFx0OiAldVxuIiwKLQkJCQkgaXdsX2xlZ2FjeV9nZXRfY3RybF9zdHJpbmcoY250KSwKLQkJCQkgcHJpdi0+dHhfc3RhdHMuY3RybFtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiRGF0YTpcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0Y250OiAldVxuIiwKLQkJCSBwcml2LT50eF9zdGF0cy5kYXRhX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRieXRlczogJWxsdVxuIiwKLQkJCSBwcml2LT50eF9zdGF0cy5kYXRhX2J5dGVzKTsKLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX2NsZWFyX3RyYWZmaWNfc3RhdGlzdGljc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdTMyIGNsZWFyX2ZsYWc7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJmNsZWFyX2ZsYWcpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWl3bF9sZWdhY3lfY2xlYXJfdHJhZmZpY19zdGF0cyhwcml2KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeF9zdGF0aXN0aWNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250OwotCXNzaXplX3QgcmV0OwotCWNvbnN0IHNpemVfdCBidWZzeiA9IDEwMCArCi0JCXNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIk1hbmFnZW1lbnQ6XG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BTkFHRU1FTlRfTUFYOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICJcdCUyNXNcdFx0OiAldVxuIiwKLQkJCQkgaXdsX2xlZ2FjeV9nZXRfbWdtdF9zdHJpbmcoY250KSwKLQkJCQkgcHJpdi0+cnhfc3RhdHMubWdtdFtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ29udHJvbDpcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgQ09OVFJPTF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9jdHJsX3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT5yeF9zdGF0cy5jdHJsW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJEYXRhOlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRjbnQ6ICV1XG4iLAotCQkJIHByaXYtPnJ4X3N0YXRzLmRhdGFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGJ5dGVzOiAlbGx1XG4iLAotCQkJIHByaXYtPnJ4X3N0YXRzLmRhdGFfYnl0ZXMpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIEJZVEUxX01BU0sgMHgwMDAwMDBmZjsKLSNkZWZpbmUgQllURTJfTUFTSyAweDAwMDBmZmZmOwotI2RlZmluZSBCWVRFM19NQVNLIDB4MDBmZmZmZmY7Ci1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQl1MzIgdmFsOwotCWNoYXIgKmJ1ZjsKLQlzc2l6ZV90IHJldDsKLQlpbnQgaTsKLQlpbnQgcG9zID0gMDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2l6ZV90IGJ1ZnN6OwotCi0JLyogZGVmYXVsdCBpcyB0byBkdW1wIHRoZSBlbnRpcmUgZGF0YSBzZWdtZW50ICovCi0JaWYgKCFwcml2LT5kYmdmc19zcmFtX29mZnNldCAmJiAhcHJpdi0+ZGJnZnNfc3JhbV9sZW4pIHsKLQkJcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgPSAweDgwMDAwMDsKLQkJaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gcHJpdi0+dWNvZGVfaW5pdF9kYXRhLmxlbjsKLQkJZWxzZQotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9kYXRhLmxlbjsKLQl9Ci0JYnVmc3ogPSAgMzAgKyBwcml2LT5kYmdmc19zcmFtX2xlbiAqIHNpemVvZihjaGFyKSAqIDEwOwotCWJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzcmFtX2xlbjogMHgleFxuIiwKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzcmFtX29mZnNldDogMHgleFxuIiwKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0KTsKLQlmb3IgKGkgPSBwcml2LT5kYmdmc19zcmFtX2xlbjsgaSA+IDA7IGkgLT0gNCkgewotCQl2YWwgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgKyBcCi0JCQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuIC0gaSk7Ci0JCWlmIChpIDwgNCkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIDE6Ci0JCQkJdmFsICY9IEJZVEUxX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdmFsICY9IEJZVEUyX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdmFsICY9IEJZVEUzX01BU0s7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEoaSAlIDE2KSkKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIjB4JTA4eCAiLCB2YWwpOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NyYW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzY0XTsKLQlpbnQgYnVmX3NpemU7Ci0JdTMyIG9mZnNldCwgbGVuOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChzc2NhbmYoYnVmLCAiJXgsJXgiLCAmb2Zmc2V0LCAmbGVuKSA9PSAyKSB7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ID0gb2Zmc2V0OwotCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IGxlbjsKLQl9IGVsc2UgewotCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDA7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gMDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX3N0YXRpb25zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKLQlpbnQgbWF4X3N0YSA9IHByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7Ci0JY2hhciAqYnVmOwotCWludCBpLCBqLCBwb3MgPSAwOwotCXNzaXplX3QgcmV0OwotCS8qIEFkZCAzMCBmb3IgaW5pdGlhbCBzdHJpbmcgKi8KLQljb25zdCBzaXplX3QgYnVmc3ogPSAzMCArIHNpemVvZihjaGFyKSAqIDUwMCAqIChwcml2LT5udW1fc3RhdGlvbnMpOwotCi0JYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnVtIG9mIHN0YXRpb25zOiAlZFxuXG4iLAotCQkJcHJpdi0+bnVtX3N0YXRpb25zKTsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXhfc3RhOyBpKyspIHsKLQkJc3RhdGlvbiA9ICZwcml2LT5zdGF0aW9uc1tpXTsKLQkJaWYgKCFzdGF0aW9uLT51c2VkKQotCQkJY29udGludWU7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgInN0YXRpb24gJWQgLSBhZGRyOiAlcE0sIGZsYWdzOiAlI3hcbiIsCi0JCQkJIGksIHN0YXRpb24tPnN0YS5zdGEuYWRkciwKLQkJCQkgc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3NfbXNrKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJUSURcdHNlcV9udW1cdHR4cV9pZFx0ZnJhbWVzXHR0ZmRzXHQiKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJzdGFydF9pZHhcdGJpdG1hcFx0XHRcdHJhdGVfbl9mbGFnc1xuIik7Ci0KLQkJZm9yIChqID0gMDsgaiA8IE1BWF9USURfQ09VTlQ7IGorKykgewotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDpcdCUjeFx0JSN4XHQldVx0JXVcdCV1XHRcdCUjLjE2bGx4XHQlI3giLAotCQkJCWosIHN0YXRpb24tPnRpZFtqXS5zZXFfbnVtYmVyLAotCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cudHhxX2lkLAotCQkJCXN0YXRpb24tPnRpZFtqXS5hZ2cuZnJhbWVfY291bnQsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLnRmZHNfaW5fcXVldWUsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5zdGFydF9pZHgsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5iaXRtYXAsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5yYXRlX25fZmxhZ3MpOwotCi0JCQlpZiAoc3RhdGlvbi0+dGlkW2pdLmFnZy53YWl0X2Zvcl9iYSkKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkgIiAtIHdhaXRmb3JiYSIpOwotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQkJfQotCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JfQotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX252bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCwKLQkJCQkgICAgICAgbG9mZl90ICpwcG9zKQotewotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMCwgb2ZzID0gMCwgYnVmX3NpemUgPSAwOwotCWNvbnN0IHU4ICpwdHI7Ci0JY2hhciAqYnVmOwotCXUxNiBlZXByb21fdmVyOwotCXNpemVfdCBlZXByb21fbGVuID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7Ci0JYnVmX3NpemUgPSA0ICogZWVwcm9tX2xlbiArIDI1NjsKLQotCWlmIChlZXByb21fbGVuICUgMTYpIHsKLQkJSVdMX0VSUihwcml2LCAiTlZNIHNpemUgaXMgbm90IG11bHRpcGxlIG9mIDE2LlxuIik7Ci0JCXJldHVybiAtRU5PREFUQTsKLQl9Ci0KLQlwdHIgPSBwcml2LT5lZXByb207Ci0JaWYgKCFwdHIpIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBFRVBST00gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogNCBjaGFyYWN0ZXJzIGZvciBieXRlIDB4WVkgKi8KLQlidWYgPSBremFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQllZXByb21fdmVyID0gaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fVkVSU0lPTik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiRUVQUk9NICIKLQkJCSJ2ZXJzaW9uOiAweCV4XG4iLCBlZXByb21fdmVyKTsKLQlmb3IgKG9mcyA9IDAgOyBvZnMgPCBlZXByb21fbGVuIDsgb2ZzICs9IDE2KSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIjB4JS40eCAiLCBvZnMpOwotCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiAsIDE2LCAyLCBidWYgKyBwb3MsCi0JCQkJICAgYnVmX3NpemUgLSBwb3MsIDApOwotCQlwb3MgKz0gc3RybGVuKGJ1ZiArIHBvcyk7Ci0JCWlmIChidWZfc2l6ZSAtIHBvcyA+IDApCi0JCQlidWZbcG9zKytdID0gJ1xuJzsKLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pd2xfbGVnYWN5X2RiZ2ZzX2NoYW5uZWxzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHMgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnN1cHBfYmFuZCA9IE5VTEw7Ci0JaW50IHBvcyA9IDAsIGksIGJ1ZnN6ID0gUEFHRV9TSVpFOwotCWNoYXIgKmJ1ZjsKLQlzc2l6ZV90IHJldDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXN1cHBfYmFuZCA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBJRUVFODAyMTFfQkFORF8yR0haKTsKLQlpZiAoc3VwcF9iYW5kKSB7Ci0JCWNoYW5uZWxzID0gc3VwcF9iYW5kLT5jaGFubmVsczsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkRpc3BsYXlpbmcgJWQgY2hhbm5lbHMgaW4gMi40R0h6IGJhbmQgODAyLjExYmcpOlxuIiwKLQkJCQlzdXBwX2JhbmQtPm5fY2hhbm5lbHMpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzdXBwX2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiJWQ6ICVkZEJtOiBCU1MlcyVzLCAlcy5cbiIsCi0JCQkJY2hhbm5lbHNbaV0uaHdfdmFsdWUsCi0JCQkJY2hhbm5lbHNbaV0ubWF4X3Bvd2VyLAotCQkJCWNoYW5uZWxzW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIgPwotCQkJCSIgKElFRUUgODAyLjExaCByZXF1aXJlZCkiIDogIiIsCi0JCQkJKChjaGFubmVsc1tpXS5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpCi0JCQkJfHwgKGNoYW5uZWxzW2ldLmZsYWdzICYKLQkJCQlJRUVFODAyMTFfQ0hBTl9SQURBUikpID8gIiIgOgotCQkJCSIsIElCU1MiLAotCQkJCWNoYW5uZWxzW2ldLmZsYWdzICYKLQkJCQlJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gPwotCQkJCSJwYXNzaXZlIG9ubHkiIDogImFjdGl2ZS9wYXNzaXZlIik7Ci0JfQotCXN1cHBfYmFuZCA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBJRUVFODAyMTFfQkFORF81R0haKTsKLQlpZiAoc3VwcF9iYW5kKSB7Ci0JCWNoYW5uZWxzID0gc3VwcF9iYW5kLT5jaGFubmVsczsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkRpc3BsYXlpbmcgJWQgY2hhbm5lbHMgaW4gNS4yR0h6IGJhbmQgKDgwMi4xMWEpXG4iLAotCQkJCXN1cHBfYmFuZC0+bl9jaGFubmVscyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHN1cHBfYmFuZC0+bl9jaGFubmVsczsgaSsrKQotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKLQkJCQljaGFubmVsc1tpXS5od192YWx1ZSwKLQkJCQljaGFubmVsc1tpXS5tYXhfcG93ZXIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/Ci0JCQkJIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKLQkJCQkoKGNoYW5uZWxzW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykKLQkJCQl8fCAoY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1JBREFSKSkgPyAiIiA6Ci0JCQkJIiwgSUJTUyIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiA/Ci0JCQkJInBhc3NpdmUgb25seSIgOiAiYWN0aXZlL3Bhc3NpdmUiKTsKLQl9Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBwb3MgPSAwOwotCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0hDTURfQUNUSVZFOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfSU5UX0VOQUJMRUQ6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19SRl9LSUxMX0hXOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19DVF9LSUxMOlx0XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19DVF9LSUxMLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0lOSVQ6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfQUxJVkU6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1JFQURZOlx0XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19URU1QRVJBVFVSRTpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0dFT19DT05GSUdVUkVEOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfRVhJVF9QRU5ESU5HOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1NUQVRJU1RJQ1M6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19TVEFUSVNUSUNTLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1NDQU5OSU5HOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU0NBTl9BQk9SVElORzpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU0NBTl9IVzpcdFx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19QT1dFUl9QTUk6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfRldfRVJST1I6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cykpOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19pbnRlcnJ1cHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWludCBjbnQgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAyNCAqIDY0OyAvKiAyNCBpdGVtcyAqIDY0IGNoYXIgcGVyIGl0ZW0gKi8KLQlzc2l6ZV90IHJldDsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIkludGVycnVwdCBTdGF0aXN0aWNzIFJlcG9ydDpcbiIpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiSFcgRXJyb3I6XHRcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuaHcpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNXIEVycm9yOlx0XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnN3KTsKLQlpZiAocHJpdi0+aXNyX3N0YXRzLnN3IHx8IHByaXYtPmlzcl9zdGF0cy5odykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRMYXN0IFJlc3RhcnRpbmcgQ29kZTogIDB4JVhcbiIsCi0JCQlwcml2LT5pc3Jfc3RhdHMuZXJyX2NvZGUpOwotCX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJGcmFtZSB0cmFuc21pdHRlZDpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuc2NoKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJBbGl2ZSBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLmFsaXZlKTsKLSNlbmRpZgotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJIkhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQ6XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ1QgS0lMTDpcdFx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5jdGtpbGwpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiV2FrZXVwIEludGVycnVwdDpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMud2FrZXVwKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJIlJ4IGNvbW1hbmQgcmVzcG9uc2VzOlx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5yeCk7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBSRVBMWV9NQVg7IGNudCsrKSB7Ci0JCWlmIChwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbY250XSA+IDApCi0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlx0UnggaGFuZGxlclslMzZzXTpcdFx0ICV1XG4iLAotCQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY250KSwKLQkJCQlwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbY250XSk7Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiVHgvRkggaW50ZXJydXB0Olx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy50eCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJVbmV4cGVjdGVkIElOVEE6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnVuaGFuZGxlZCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfaW50ZXJydXB0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQl1MzIgcmVzZXRfZmxhZzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAgMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHNzY2FuZihidWYsICIleCIsICZyZXNldF9mbGFnKSAhPSAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocmVzZXRfZmxhZyA9PSAwKQotCQlpd2xfbGVnYWN5X2NsZWFyX2lzcl9zdGF0cyhwcml2KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWl3bF9sZWdhY3lfZGJnZnNfcW9zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JaW50IHBvcyA9IDAsIGk7Ci0JY2hhciBidWZbMjU2ICogTlVNX0lXTF9SWE9OX0NUWF07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjb250ZXh0ICVkOlxuIiwKLQkJCQkgY3R4LT5jdHhpZCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBQ19OVU07IGkrKykgewotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJcdGN3X21pblx0Y3dfbWF4XHRhaWZzblx0dHhvcFxuIik7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIkFDWyVkXVx0JXVcdCV1XHQldVx0JXVcbiIsIGksCi0JCQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uY3dfbWluLAotCQkJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmN3X21heCwKLQkJCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5haWZzbiwKLQkJCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5lZGNhX3R4b3ApOwotCQl9Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JfQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19kaXNhYmxlX2h0NDBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCBodDQwOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmh0NDApICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICghaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkKLQkJcHJpdi0+ZGlzYWJsZV9odDQwID0gaHQ0MCA/IHRydWUgOiBmYWxzZTsKLQllbHNlIHsKLQkJSVdMX0VSUihwcml2LCAiU3RhIGFzc29jaWF0ZWQgd2l0aCBBUCAtICIKLQkJCSJDaGFuZ2UgdG8gNDBNSHogY2hhbm5lbCBzdXBwb3J0IGlzIG5vdCBhbGxvd2VkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2Rpc2FibGVfaHQ0MF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzEwMF07Ci0JaW50IHBvcyA9IDA7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiMTFuIDQwTUh6IE1vZGU6ICVzXG4iLAotCQkJcHJpdi0+ZGlzYWJsZV9odDQwID8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoc3JhbSk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMobnZtKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhzdGF0aW9ucyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMoY2hhbm5lbHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXR1cyk7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoaW50ZXJydXB0KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhxb3MpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGRpc2FibGVfaHQ0MCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdHJhZmZpY19sb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMCwgb2ZzID0gMDsKLQlpbnQgY250ID0gMCwgZW50cnk7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gKChJV0xfVFJBRkZJQ19FTlRSSUVTICogSVdMX1RSQUZGSUNfRU5UUllfU0laRSAqIDY0KSAqIDIpICsKLQkJKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgKiAzMiAqIDgpICsgNDAwOwotCWNvbnN0IHU4ICpwdHI7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJ0eHEgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlR4IFF1ZXVlXG4iKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgY250KyspIHsKLQkJdHhxID0gJnByaXYtPnR4cVtjbnRdOwotCQlxID0gJnR4cS0+cTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJxWyVkXTogcmVhZF9wdHI6ICV1LCB3cml0ZV9wdHI6ICV1XG4iLAotCQkJCWNudCwgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0cik7Ci0JfQotCWlmIChwcml2LT50eF90cmFmZmljICYmIChpd2xlZ2FjeV9kZWJ1Z19sZXZlbCAmIElXTF9ETF9UWCkpIHsKLQkJcHRyID0gcHJpdi0+dHhfdHJhZmZpYzsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJUeCBUcmFmZmljIGlkeDogJXVcbiIsCXByaXYtPnR4X3RyYWZmaWNfaWR4KTsKLQkJZm9yIChjbnQgPSAwLCBvZnMgPSAwOyBjbnQgPCBJV0xfVFJBRkZJQ19FTlRSSUVTOyBjbnQrKykgewotCQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgSVdMX1RSQUZGSUNfRU5UUllfU0laRSAvIDE2OwotCQkJICAgICBlbnRyeSsrLCAgb2ZzICs9IDE2KSB7Ci0JCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkJIjB4JS40eCAiLCBvZnMpOwotCQkJCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2LCAxNiwgMiwKLQkJCQkJCSAgIGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIDApOwotCQkJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKLQkJCQlpZiAoYnVmc3ogLSBwb3MgPiAwKQotCQkJCQlidWZbcG9zKytdID0gJ1xuJzsKLQkJCX0KLQkJfQotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlJ4IFF1ZXVlXG4iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkicmVhZDogJXUsIHdyaXRlOiAldVxuIiwKLQkJCSByeHEtPnJlYWQsIHJ4cS0+d3JpdGUpOwotCi0JaWYgKHByaXYtPnJ4X3RyYWZmaWMgJiYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1JYKSkgewotCQlwdHIgPSBwcml2LT5yeF90cmFmZmljOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlJ4IFRyYWZmaWMgaWR4OiAldVxuIiwJcHJpdi0+cnhfdHJhZmZpY19pZHgpOwotCQlmb3IgKGNudCA9IDAsIG9mcyA9IDA7IGNudCA8IElXTF9UUkFGRklDX0VOVFJJRVM7IGNudCsrKSB7Ci0JCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7Ci0JCQkgICAgIGVudHJ5KyssICBvZnMgKz0gMTYpIHsKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkiMHglLjR4ICIsIG9mcyk7Ci0JCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIG9mcywgMTYsIDE2LCAyLAotCQkJCQkJICAgYnVmICsgcG9zLCBidWZzeiAtIHBvcywgMCk7Ci0JCQkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOwotCQkJCWlmIChidWZzeiAtIHBvcyA+IDApCi0JCQkJCWJ1Zltwb3MrK10gPSAnXG4nOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3RyYWZmaWNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQlpbnQgdHJhZmZpY19sb2c7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdHJhZmZpY19sb2cpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICh0cmFmZmljX2xvZyA9PSAwKQotCQlpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHByaXYpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3R4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250OwotCWludCByZXQ7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGNoYXIpICogNjQgKgotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlpZiAoIXByaXYtPnR4cSkgewotCQlJV0xfRVJSKHByaXYsICJ0eHEgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoY250ID0gMDsgY250IDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgewotCQl0eHEgPSAmcHJpdi0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHN0b3A9JWQiCi0JCQkJIiBzd3FfaWQ9JSMuMnggKGFjICVkL2h3cSAlZClcbiIsCi0JCQkJY250LCBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyLAotCQkJCSEhdGVzdF9iaXQoY250LCBwcml2LT5xdWV1ZV9zdG9wcGVkKSwKLQkJCQl0eHEtPnN3cV9pZCwgdHhxLT5zd3FfaWQgJiAzLAotCQkJCSh0eHEtPnN3cV9pZCA+PiAyKSAmIDB4MWYpOwotCQlpZiAoY250ID49IDQpCi0JCQljb250aW51ZTsKLQkJLyogZm9yIHRoZSBBQ3MsIGRpc3BsYXkgdGhlIHN0b3AgY291bnQgdG9vICovCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiICAgICAgICBzdG9wLWNvdW50OiAlZFxuIiwKLQkJCQlhdG9taWNfcmVhZCgmcHJpdi0+cXVldWVfc3RvcF9jb3VudFtjbnRdKSk7Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeF9xdWV1ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWNoYXIgYnVmWzI1Nl07Ci0JaW50IHBvcyA9IDA7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyZWFkOiAldVxuIiwKLQkJCQkJCXJ4cS0+cmVhZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAid3JpdGU6ICV1XG4iLAotCQkJCQkJcnhxLT53cml0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZnJlZV9jb3VudDogJXVcbiIsCi0JCQkJCQlyeHEtPmZyZWVfY291bnQpOwotCWlmIChyeHEtPnJiX3N0dHMpIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2xvc2VkX3JiX251bTogJXVcbiIsCi0JCQkgbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkYpOwotCX0gZWxzZSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJImNsb3NlZF9yYl9udW06IE5vdCBBbGxvY2F0ZWRcbiIpOwotCX0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnJ4X3N0YXRzX3JlYWQoZmlsZSwKLQkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnR4X3N0YXRzX3JlYWQoZmlsZSwKLQkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMuZ2VuZXJhbF9zdGF0c19yZWFkKGZpbGUsCi0JCQl1c2VyX2J1ZiwgY291bnQsIHBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3NlbnNpdGl2aXR5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250ID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSkgKiA0ICsgMTAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSAmcHJpdi0+c2Vuc2l0aXZpdHlfZGF0YTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiYXV0b19jb3JyX29mZG1fbXJjOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9vZmRtX3gxOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJImF1dG9fY29ycl9vZmRtX21yY194MTpcdFx0ICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfY2NrOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9jY2tfbXJjOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJImxhc3RfYmFkX3BsY3BfY250X29mZG06XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImxhc3RfZmFfY250X29mZG06XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfZmFfY250X29mZG0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJsYXN0X2JhZF9wbGNwX2NudF9jY2s6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfY2NrOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19jdXJyX3N0YXRlOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ19jdXJyX3N0YXRlKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfcHJldl9zdGF0ZTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfcHJldl9zdGF0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3ZhbHVlOlx0XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgMTA7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCi0JCQkJZGF0YS0+bnJnX3ZhbHVlW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3Jzc2k6XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKLQkJCQlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3JlZjpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX3NpbGVuY2VfcmVmKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfZW5lcmd5X2lkeDpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfZW5lcmd5X2lkeCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfaWR4Olx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfc2lsZW5jZV9pZHgpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ190aF9jY2s6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX3RoX2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmOlx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm51bV9pbl9jY2tfbm9fZmE6XHRcdCAldVxuIiwKLQkJCWRhdGEtPm51bV9pbl9jY2tfbm9fZmEpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ190aF9vZmRtOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ190aF9vZmRtKTsKLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2NoYWluX25vaXNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQlpbnQgY250ID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSkgKiA0ICsgMTAwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSAmcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YTsKLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImFjdGl2ZV9jaGFpbnM6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+YWN0aXZlX2NoYWlucyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9ub2lzZV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9iOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX25vaXNlX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2M6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fc2lnbmFsX2E6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2EpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9iOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX3NpZ25hbF9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYzpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9zaWduYWxfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYmVhY29uX2NvdW50Olx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmJlYWNvbl9jb3VudCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaXNjb25uX2FycmF5Olx0XHRcdCIpOwotCWZvciAoY250ID0gMDsgY250IDwgTlVNX1JYX0NIQUlOUzsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKLQkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImRlbHRhX2dhaW5fY29kZTpcdFx0Iik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fUlhfQ0hBSU5TOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAotCQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtjbnRdKTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyYWRpb193cml0ZTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5yYWRpb193cml0ZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3RhdGU6XHRcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5zdGF0ZSk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfcG93ZXJfc2F2ZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCSAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzYwXTsKLQlpbnQgcG9zID0gMDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQl1MzIgcHdyc2F2ZV9zdGF0dXM7Ci0KLQlwd3JzYXZlX3N0YXR1cyA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQlDU1JfR1BfUkVHX1BPV0VSX1NBVkVfU1RBVFVTX01TSzsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlBvd2VyIFNhdmUgU3RhdHVzOiAiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlc1xuIiwKLQkJKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfTk9fUE9XRVJfU0FWRSkgPyAibm9uZSIgOgotCQkocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSkgPyAiTUFDIiA6Ci0JCShwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX1BIWV9QT1dFUl9TQVZFKSA/ICJQSFkiIDoKLQkJImVycm9yIik7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfY2xlYXJfdWNvZGVfc3RhdGlzdGljc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IGNsZWFyOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmNsZWFyKSAhPSAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIG1ha2UgcmVxdWVzdCB0byB1Q29kZSB0byByZXRyaWV2ZSBzdGF0aXN0aWNzIGluZm9ybWF0aW9uICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX1NZTkMsIHRydWUpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4b25fZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciBidWZbMjBdOwotCi0JbGVuID0gc3ByaW50ZihidWYsICIweCUwNFhcbiIsCi0JCWxlMzJfdG9fY3B1KHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncykpOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19yeG9uX2ZpbHRlcl9mbGFnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgbGVuID0gMDsKLQljaGFyIGJ1ZlsyMF07Ci0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwKLQlsZTMyX3RvX2NwdShwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hY3RpdmUuZmlsdGVyX2ZsYWdzKSk7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2ZoX3JlZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcG9zID0gMDsKLQlzc2l6ZV90IHJldCA9IC1FRkFVTFQ7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkgewotCQlyZXQgPSBwb3MgPSBwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKHByaXYsICZidWYsIHRydWUpOwotCQlpZiAoYnVmKSB7Ci0JCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwKLQkJCQkJCSAgICAgIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0JCQlrZnJlZShidWYpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19taXNzZWRfYmVhY29uX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQljaGFyIGJ1ZlsxMl07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlZFxuIiwKLQkJCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19taXNzZWRfYmVhY29uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQlpbnQgbWlzc2VkOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJm1pc3NlZCkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobWlzc2VkIDwgSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01JTiB8fAotCSAgICBtaXNzZWQgPiBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUFYKQotCQlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9Ci0JCQlJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCWVsc2UKLQkJcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBtaXNzZWQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZm9yY2VfcmVzZXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgYnVmWzMwMF07Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0Jc3RydWN0IGl3bF9mb3JjZV9yZXNldCAqZm9yY2VfcmVzZXQ7Ci0KLQlmb3JjZV9yZXNldCA9ICZwcml2LT5mb3JjZV9yZXNldDsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0OiAlZFxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9yZXF1ZXN0X2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCBzdWNjZXNzOiAlZFxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9zdWNjZXNzX2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRudW1iZXIgb2YgcmVzZXQgcmVxdWVzdCByZWplY3Q6ICVkXG4iLAotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIlx0cmVzZXQgZHVyYXRpb246ICVsdVxuIiwKLQkJCWZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbik7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZm9yY2VfcmVzZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCWludCByZXQ7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9mb3JjZV9yZXNldChwcml2LCB0cnVlKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc193ZF90aW1lb3V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCB0aW1lb3V0OwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnRpbWVvdXQpICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gSVdMX01BWF9XRF9USU1FT1VUKQotCQl0aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VUOwotCi0JcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA9IHRpbWVvdXQ7Ci0JaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhwcml2KTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeF9zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyh0eF9zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0cmFmZmljX2xvZyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMocnhfcXVldWUpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3F1ZXVlKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV9yeF9zdGF0cyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfdHhfc3RhdHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX2dlbmVyYWxfc3RhdHMpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHNlbnNpdGl2aXR5KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFpbl9ub2lzZSk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMocG93ZXJfc2F2ZV9zdGF0dXMpOwotREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl91Y29kZV9zdGF0aXN0aWNzKTsKLURFQlVHRlNfV1JJVEVfRklMRV9PUFMoY2xlYXJfdHJhZmZpY19zdGF0aXN0aWNzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhmaF9yZWcpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKG1pc3NlZF9iZWFjb24pOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGZvcmNlX3Jlc2V0KTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZsYWdzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZpbHRlcl9mbGFncyk7Ci1ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKHdkX3RpbWVvdXQpOwotCi0vKgotICogQ3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGVzIGFuZCBkaXJlY3RvcmllcwotICoKLSAqLwotaW50IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBkZW50cnkgKnBoeWQgPSBwcml2LT5ody0+d2lwaHktPmRlYnVnZnNkaXI7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyX2RydiwgKmRpcl9kYXRhLCAqZGlyX3JmLCAqZGlyX2RlYnVnOwotCi0JZGlyX2RydiA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBwaHlkKTsKLQlpZiAoIWRpcl9kcnYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJpdi0+ZGVidWdmc19kaXIgPSBkaXJfZHJ2OwotCi0JZGlyX2RhdGEgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhdGEiLCBkaXJfZHJ2KTsKLQlpZiAoIWRpcl9kYXRhKQotCQlnb3RvIGVycjsKLQlkaXJfcmYgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJmIiwgZGlyX2Rydik7Ci0JaWYgKCFkaXJfcmYpCi0JCWdvdG8gZXJyOwotCWRpcl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGVidWciLCBkaXJfZHJ2KTsKLQlpZiAoIWRpcl9kZWJ1ZykKLQkJZ290byBlcnI7Ci0KLQlERUJVR0ZTX0FERF9GSUxFKG52bSwgZGlyX2RhdGEsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoc3JhbSwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHN0YXRpb25zLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShjaGFubmVscywgZGlyX2RhdGEsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoc3RhdHVzLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShpbnRlcnJ1cHQsIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShxb3MsIGRpcl9kYXRhLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGRpc2FibGVfaHQ0MCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHJ4X3N0YXRpc3RpY3MsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh0eF9zdGF0aXN0aWNzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUodHJhZmZpY19sb2csIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUocnhfcXVldWUsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh0eF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHBvd2VyX3NhdmVfc3RhdHVzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoY2xlYXJfdWNvZGVfc3RhdGlzdGljcywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGNsZWFyX3RyYWZmaWNfc3RhdGlzdGljcywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGZoX3JlZywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKG1pc3NlZF9iZWFjb24sIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JREVCVUdGU19BRERfRklMRShmb3JjZV9yZXNldCwgZGlyX2RlYnVnLCBTX0lXVVNSIHwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh1Y29kZV9yeF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX3R4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfZ2VuZXJhbF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIpCi0JCURFQlVHRlNfQUREX0ZJTEUoc2Vuc2l0aXZpdHksIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKLQkJREVCVUdGU19BRERfRklMRShjaGFpbl9ub2lzZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JREVCVUdGU19BRERfRklMRShyeG9uX2ZpbHRlcl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHdkX3RpbWVvdXQsIGRpcl9kZWJ1ZywgU19JV1VTUik7Ci0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKLQkJREVCVUdGU19BRERfQk9PTChkaXNhYmxlX3NlbnNpdGl2aXR5LCBkaXJfcmYsCi0JCQkJICZwcml2LT5kaXNhYmxlX3NlbnNfY2FsKTsKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyKQotCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfY2hhaW5fbm9pc2UsIGRpcl9yZiwKLQkJCQkgJnByaXYtPmRpc2FibGVfY2hhaW5fbm9pc2VfY2FsKTsKLQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfdHhfcG93ZXIsIGRpcl9yZiwKLQkJCQkmcHJpdi0+ZGlzYWJsZV90eF9wb3dlcl9jYWwpOwotCXJldHVybiAwOwotCi1lcnI6Ci0JSVdMX0VSUihwcml2LCAiQ2FuJ3QgY3JlYXRlIHRoZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7Ci0JaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHByaXYpOwotCXJldHVybiAtRU5PTUVNOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2RiZ2ZzX3JlZ2lzdGVyKTsKLQotLyoqCi0gKiBSZW1vdmUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi0gKgotICovCi12b2lkIGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT5kZWJ1Z2ZzX2RpcikKLQkJcmV0dXJuOwotCi0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHByaXYtPmRlYnVnZnNfZGlyKTsKLQlwcml2LT5kZWJ1Z2ZzX2RpciA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzg2ZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLWRldi5oKSBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtNDk2NS1ody5oIGZvciBoYXJkd2FyZS1yZWxhdGVkIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2Rldl9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2Rldl9oX18KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPiAvKiBmb3Igc3RydWN0IHBjaV9kZXZpY2VfaWQgKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY3NyLmgiCi0jaW5jbHVkZSAiaXdsLXBycGguaCIKLSNpbmNsdWRlICJpd2wtZmguaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLWxlZC5oIgotI2luY2x1ZGUgIml3bC1wb3dlci5oIgotI2luY2x1ZGUgIml3bC1sZWdhY3ktcnMuaCIKLQotc3RydWN0IGl3bF90eF9xdWV1ZTsKLQotLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KLSNkZWZpbmUgQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZICAgMTEwIC8qIGluIENlbHNpdXMgKi8KLQotLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgotICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgotICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0aXN0aWNzIGJlaW5nIHNlbnQgdG8gZHJpdmVyKQotICogICAyKSAgU2Nhbm5pbmcgKG5vaXNlIG1lYXN1cmVtZW50IGRvZXMgbm90IGFwcGx5IHRvIGFzc29jaWF0ZWQgY2hhbm5lbCkKLSAqICAgMykgIFJlY2VpdmluZyBDQ0sgKDM5NDUgZGVsaXZlcnMgbm9pc2UgaW5mbyBvbmx5IGZvciBPRkRNIGZyYW1lcykKLSAqIFVzZSBkZWZhdWx0IG5vaXNlIHZhbHVlIG9mIC0xMjcgLi4uIHRoaXMgaXMgYmVsb3cgdGhlIHJhbmdlIG9mIG1lYXN1cmFibGUKLSAqICAgUnggZEJtIGZvciBlaXRoZXIgMzk0NSBvciA0OTY1LCBzbyBpdCBjYW4gaW5kaWNhdGUgInVubWVhc3VyYWJsZSIgdG8gdXNlci4KLSAqICAgQWxzbywgLTEyNyB3b3JrcyBiZXR0ZXIgdGhhbiAwIHdoZW4gYXZlcmFnaW5nIGZyYW1lcyB3aXRoL3dpdGhvdXQKLSAqICAgbm9pc2UgaW5mbyAoZS5nLiBhdmVyYWdpbmcgbWlnaHQgYmUgZG9uZSBpbiBhcHApOyBtZWFzdXJlZCBkQm0gdmFsdWVzIGFyZQotICogICBhbHdheXMgbmVnYXRpdmUgLi4uIHVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRlZmF1bHQga2VlcHMgYWxsCi0gKiAgIGF2ZXJhZ2VzIHdpdGhpbiBhbiBzOCdzICh1c2VkIGluIHNvbWUgYXBwcykgcmFuZ2Ugb2YgbmVnYXRpdmUgdmFsdWVzLiAqLwotI2RlZmluZSBJV0xfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQotCi0vKgotICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCi0gKiBQZXIgc3BlYzoKLSAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKLSAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCi0gKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgotICogICB0aGFuIFJUUyB2YWx1ZS4KLSAqLwotI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCi0jZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQotI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCi0jZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKLSNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCi0jZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKLSNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQotCi1zdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgewotCWRtYV9hZGRyX3QgcGFnZV9kbWE7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotI2RlZmluZSByeGJfYWRkcihyKSBwYWdlX2FkZHJlc3Moci0+cGFnZSkKLQotLyogZGVmaW5lZCBiZWxvdyAqLwotc3RydWN0IGl3bF9kZXZpY2VfY21kOwotCi1zdHJ1Y3QgaXdsX2NtZF9tZXRhIHsKLQkvKiBvbmx5IGZvciBTWU5DIGNvbW1hbmRzLCBpZmYgdGhlIHJlcGx5IHNrYiBpcyB3YW50ZWQgKi8KLQlzdHJ1Y3QgaXdsX2hvc3RfY21kICpzb3VyY2U7Ci0JLyoKLQkgKiBvbmx5IGZvciBBU1lOQyBjb21tYW5kcwotCSAqICh3aGljaCBpcyBzb21ld2hhdCBzdHVwaWQgLS0gbG9vayBhdCBpd2wtc3RhLmMgZm9yIGluc3RhbmNlCi0JICogd2hpY2ggZHVwbGljYXRlcyBhIGJ1bmNoIG9mIGNvZGUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXNuJ3QKLQkgKiBpbnZva2VkIGZvciBTWU5DIGNvbW1hbmRzLCBpZiBpdCB3ZXJlIGFuZCBpdHMgcmVzdWx0IHBhc3NlZAotCSAqIHRocm91Z2ggaXQgd291bGQgYmUgc2ltcGxlci4uLikKLQkgKi8KLQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCSBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KTsKLQotCS8qIFRoZSBDTURfU0laRV9IVUdFIGZsYWcgYml0IGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kCi0JICogc3RydWN0dXJlIGlzIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBzaGFyZWQgcXVldWUgbWVtb3J5LiAqLwotCXUzMiBmbGFnczsKLQotCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKLQlERUZJTkVfRE1BX1VOTUFQX0xFTihsZW4pOwotfTsKLQotLyoKLSAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCi0gKgotICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKLSAqLwotc3RydWN0IGl3bF9xdWV1ZSB7Ci0JaW50IG5fYmQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgQkRzIGluIHRoaXMgcXVldWUgKi8KLQlpbnQgd3JpdGVfcHRyOyAgICAgICAvKiAxLXN0IGVtcHR5IGVudHJ5IChpbmRleCkgaG9zdF93Ki8KLQlpbnQgcmVhZF9wdHI7ICAgICAgICAgLyogbGFzdCB1c2VkIGVudHJ5IChpbmRleCkgaG9zdF9yKi8KLQkvKiB1c2UgZm9yIG1vbml0b3JpbmcgYW5kIHJlY292ZXJpbmcgdGhlIHN0dWNrIHF1ZXVlICovCi0JZG1hX2FkZHJfdCBkbWFfYWRkcjsgICAvKiBwaHlzaWNhbCBhZGRyIGZvciBCRCdzICovCi0JaW50IG5fd2luZG93OwkgICAgICAgLyogc2FmZSBxdWV1ZSB3aW5kb3cgKi8KLQl1MzIgaWQ7Ci0JaW50IGxvd19tYXJrOwkgICAgICAgLyogbG93IHdhdGVybWFyaywgcmVzdW1lIHF1ZXVlIGlmIGZyZWUKLQkJCQkqIHNwYWNlIG1vcmUgdGhhbiB0aGlzICovCi0JaW50IGhpZ2hfbWFyazsgICAgICAgICAvKiBoaWdoIHdhdGVybWFyaywgc3RvcCBxdWV1ZSBpZiBmcmVlCi0JCQkJKiBzcGFjZSBsZXNzIHRoYW4gdGhpcyAqLwotfTsKLQotLyogT25lIGZvciBlYWNoIFRGRCAqLwotc3RydWN0IGl3bF90eF9pbmZvIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfdHhfcXVldWUgLSBUeCBRdWV1ZSBmb3IgRE1BCi0gKiBAcTogZ2VuZXJpYyBSeC9UeCBxdWV1ZSBkZXNjcmlwdG9yCi0gKiBAYmQ6IGJhc2Ugb2YgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMKLSAqIEBjbWQ6IGFycmF5IG9mIGNvbW1hbmQvVFggYnVmZmVyIHBvaW50ZXJzCi0gKiBAbWV0YTogYXJyYXkgb2YgbWV0YSBkYXRhIGZvciBlYWNoIGNvbW1hbmQvdHggYnVmZmVyCi0gKiBAZG1hX2FkZHJfY21kOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGNtZC90eCBidWZmZXIgYXJyYXkKLSAqIEB0eGI6IGFycmF5IG9mIHBlci1URkQgZHJpdmVyIGRhdGEKLSAqIEB0aW1lX3N0YW1wOiB0aW1lIChpbiBqaWZmaWVzKSBvZiBsYXN0IHJlYWRfcHRyIGNoYW5nZQotICogQG5lZWRfdXBkYXRlOiBpbmRpY2F0ZXMgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpbmRleAotICogQHNjaGVkX3JldHJ5OiBpbmRpY2F0ZXMgcXVldWUgaXMgaGlnaC10aHJvdWdocHV0IGFnZ3JlZ2F0aW9uIChIVCBBR0cpIGVuYWJsZWQKLSAqCi0gKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQotICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCi0gKi8KLSNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKLSNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgotCi1zdHJ1Y3QgaXdsX3R4X3F1ZXVlIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlIHE7Ci0Jdm9pZCAqdGZkczsKLQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKipjbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqbWV0YTsKLQlzdHJ1Y3QgaXdsX3R4X2luZm8gKnR4YjsKLQl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7Ci0JdTggbmVlZF91cGRhdGU7Ci0JdTggc2NoZWRfcmV0cnk7Ci0JdTggYWN0aXZlOwotCXU4IHN3cV9pZDsKLX07Ci0KLSNkZWZpbmUgSVdMX05VTV9TQ0FOX1JBVEVTICAgICAgICAgKDIpCi0KLXN0cnVjdCBpd2w0OTY1X2NoYW5uZWxfdGdkX2luZm8gewotCXU4IHR5cGU7Ci0JczggbWF4X3Bvd2VyOwotfTsKLQotc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB7Ci0JczY0IGxhc3RfcmFkYXJfdGltZTsKLX07Ci0KLSNkZWZpbmUgSVdMNDk2NV9NQVhfUkFURSAoMzMpCi0KLXN0cnVjdCBpd2wzOTQ1X2NsaXBfZ3JvdXAgewotCS8qIG1heGltdW0gcG93ZXIgbGV2ZWwgdG8gcHJldmVudCBjbGlwcGluZyBmb3IgZWFjaCByYXRlLCBkZXJpdmVkIGJ5Ci0JICogICB1cyBmcm9tIHRoaXMgYmFuZCdzIHNhdHVyYXRpb24gcG93ZXIgaW4gRUVQUk9NICovCi0JY29uc3QgczggY2xpcF9wb3dlcnNbSVdMX01BWF9SQVRFU107Ci19OwotCi0vKiBjdXJyZW50IFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCByYXRlIGZvciBlYWNoIGNoYW5uZWwuCi0gKiByZXF1ZXN0ZWQgcG93ZXIgaXMgbGltaXRlZCBieToKLSAqIC0tIHJlZ3VsYXRvcnkgRUVQUk9NIGxpbWl0cyBmb3IgdGhpcyBjaGFubmVsCi0gKiAtLSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKGNsaXAtcG93ZXJzKQotICogLS0gc3BlY3RydW0gbWFuYWdlbWVudAotICogLS0gdXNlciBwcmVmZXJlbmNlIChlLmcuIGl3Y29uZmlnKQotICogd2hlbiByZXF1ZXN0ZWQgcG93ZXIgaXMgc2V0LCBiYXNlIHBvd2VyIGluZGV4IG11c3QgYWxzbyBiZSBzZXQuICovCi1zdHJ1Y3QgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gewotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsJLyogYWN0dWFsIHJhZGlvIGFuZCBEU1AgZ2FpbiBzZXR0aW5ncyAqLwotCXM4IHBvd2VyX3RhYmxlX2luZGV4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGluZGV4IGludG8gZ2FpbiB0YWJsZSAqLwotCXM4IGJhc2VfcG93ZXJfaW5kZXg7CS8qIGdhaW4gaW5kZXggZm9yIHBvd2VyIGF0IGZhY3RvcnkgdGVtcC4gKi8KLQlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHBvd2VyIChkQm0pIHJlcXVlc3RlZCBmb3IgdGhpcyBjaG5sL3JhdGUgKi8KLX07Ci0KLS8qIGN1cnJlbnQgc2NhbiBUeCBwb3dlciB2YWx1ZXMgdG8gdXNlLCBvbmUgZm9yIGVhY2ggc2NhbiByYXRlIGZvciBlYWNoCi0gKiBjaGFubmVsLiAqLwotc3RydWN0IGl3bDM5NDVfc2Nhbl9wb3dlcl9pbmZvIHsKLQlzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciB0cGM7CS8qIGFjdHVhbCByYWRpbyBhbmQgRFNQIGdhaW4gc2V0dGluZ3MgKi8KLQlzOCBwb3dlcl90YWJsZV9pbmRleDsJLyogYWN0dWFsIChjb21wZW5zdCdkKSBpbmRleCBpbnRvIGdhaW4gdGFibGUgKi8KLQlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHNjYW4gcHdyIChkQm0pIHJlcXVlc3RlZCBmb3IgY2hubC9yYXRlICovCi19OwotCi0vKgotICogT25lIGZvciBlYWNoIGNoYW5uZWwsIGhvbGRzIGFsbCBjaGFubmVsIHNldHVwIGRhdGEKLSAqIFNvbWUgb2YgdGhlIGZpZWxkcyAoZS5nLiBlZXByb20gYW5kIGZsYWdzL21heF9wb3dlcl9hdmcpIGFyZSByZWR1bmRhbnQKLSAqICAgICB3aXRoIG9uZSBhbm90aGVyIQotICovCi1zdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyB7Ci0Jc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2RfaW5mbyB0Z2Q7Ci0Jc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB0Z2g7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBlZXByb207CS8qIEVFUFJPTSByZWd1bGF0b3J5IGxpbWl0ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBodDQwX2VlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgZm9yCi0JCQkJCQkgKiBIVDQwIGNoYW5uZWwgKi8KLQotCXU4IGNoYW5uZWw7CSAgLyogY2hhbm5lbCBudW1iZXIgKi8KLQl1OCBmbGFnczsJICAvKiBmbGFncyBjb3BpZWQgZnJvbSBFRVBST00gKi8KLQlzOCBtYXhfcG93ZXJfYXZnOyAvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBub3JtYWwgVHgsIGFueSByYXRlICovCi0JczggY3Vycl90eHBvdzsJICAvKiAoZEJtKSByZWd1bGF0b3J5L3NwZWN0cnVtL3VzZXIgKG5vdCBoL3cpIGxpbWl0ICovCi0JczggbWluX3Bvd2VyOwkgIC8qIGFsd2F5cyAwICovCi0Jczggc2Nhbl9wb3dlcjsJICAvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBkaXJlY3Qgc2NhbnMsIGFueSByYXRlICovCi0KLQl1OCBncm91cF9pbmRleDsJICAvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBncm91cDEvMi8zLzQvNSAqLwotCXU4IGJhbmRfaW5kZXg7CSAgLyogMC00LCBtYXBzIGNoYW5uZWwgdG8gYmFuZDEvMi8zLzQvNSAqLwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKLQotCS8qIEhUNDAgY2hhbm5lbCBpbmZvICovCi0JczggaHQ0MF9tYXhfcG93ZXJfYXZnOwkvKiAoZEJtKSByZWd1bC4gZWVwcm9tLCBub3JtYWwgVHgsIGFueSByYXRlICovCi0JdTggaHQ0MF9mbGFnczsJCS8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLwotCXU4IGh0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7IC8qIEhUX0lFX0VYVF9DSEFOTkVMXyogKi8KLQotCS8qIFJhZGlvL0RTUCBnYWluIHNldHRpbmdzIGZvciBlYWNoICJub3JtYWwiIGRhdGEgVHggcmF0ZS4KLQkgKiBUaGVzZSBpbmNsdWRlLCBpbiBhZGRpdGlvbiB0byBSRiBhbmQgRFNQIGdhaW4sIGEgZmV3IGZpZWxkcyBmb3IKLQkgKiAgIHJlbWVtYmVyaW5nL21vZGlmeWluZyBnYWluIHNldHRpbmdzIChpbmRleGVzKS4gKi8KLQlzdHJ1Y3QgaXdsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gcG93ZXJfaW5mb1tJV0w0OTY1X01BWF9SQVRFXTsKLQotCS8qIFJhZGlvL0RTUCBnYWluIHNldHRpbmdzIGZvciBlYWNoIHNjYW4gcmF0ZSwgZm9yIGRpcmVjdGVkIHNjYW5zLiAqLwotCXN0cnVjdCBpd2wzOTQ1X3NjYW5fcG93ZXJfaW5mbyBzY2FuX3B3cl9pbmZvW0lXTF9OVU1fU0NBTl9SQVRFU107Ci19OwotCi0jZGVmaW5lIElXTF9UWF9GSUZPX0JLCQkwCS8qIHNoYXJlZCAqLwotI2RlZmluZSBJV0xfVFhfRklGT19CRQkJMQotI2RlZmluZSBJV0xfVFhfRklGT19WSQkJMgkvKiBzaGFyZWQgKi8KLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVk8JCTMKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fVU5VU0VECS0xCi0KLS8qIE1pbmltdW0gbnVtYmVyIG9mIHF1ZXVlcy4gTUFYX05VTSBpcyBkZWZpbmVkIGluIGh3IHNwZWNpZmljIGZpbGVzLgotICogU2V0IHRoZSBtaW5pbXVtIHRvIGFjY29tbW9kYXRlIHRoZSA0IHN0YW5kYXJkIFRYIHF1ZXVlcywgMSBjb21tYW5kCi0gKiBxdWV1ZSwgMiAodW51c2VkKSBIQ0NBIHF1ZXVlcywgYW5kIDQgSFQgcXVldWVzIChvbmUgZm9yIGVhY2ggQUMpICovCi0jZGVmaW5lIElXTF9NSU5fTlVNX1FVRVVFUwkxMAotCi0jZGVmaW5lIElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU0JNAotCi0jZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAotI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCi0jZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQotCi1zdHJ1Y3QgaXdsX2ZyYW1lIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOwotCQlzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgYmVhY29uOwotCQl1OCByYXdbSUVFRTgwMjExX0ZSQU1FX0xFTl07Ci0JCXU4IGNtZFszNjBdOwotCX0gdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIFNFUV9UT19TTihzZXEpICgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCi0jZGVmaW5lIFNOX1RPX1NFUShzc24pICgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCi0jZGVmaW5lIE1BWF9TTiAoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLQotZW51bSB7Ci0JQ01EX1NZTkMgPSAwLAotCUNNRF9TSVpFX05PUk1BTCA9IDAsCi0JQ01EX05PX1NLQiA9IDAsCi0JQ01EX1NJWkVfSFVHRSA9ICgxIDw8IDApLAotCUNNRF9BU1lOQyA9ICgxIDw8IDEpLAotCUNNRF9XQU5UX1NLQiA9ICgxIDw8IDIpLAotCUNNRF9NQVBQRUQgPSAoMSA8PCAzKSwKLX07Ci0KLSNkZWZpbmUgREVGX0NNRF9QQVlMT0FEX1NJWkUgMzIwCi0KLS8qKgotICogc3RydWN0IGl3bF9kZXZpY2VfY21kCi0gKgotICogRm9yIGFsbG9jYXRpb24gb2YgdGhlIGNvbW1hbmQgYW5kIHR4IHF1ZXVlcywgdGhpcyBlc3RhYmxpc2hlcyB0aGUgb3ZlcmFsbAotICogc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjb21tYW5kIHdlIHNlbmQgdG8gdUNvZGUsIGV4Y2VwdCBmb3IgYSBzY2FuIGNvbW1hbmQKLSAqICh3aGljaCBpcyByZWxhdGl2ZWx5IGh1Z2U7IHNwYWNlIGlzIGFsbG9jYXRlZCBzZXBhcmF0ZWx5KS4KLSAqLwotc3RydWN0IGl3bF9kZXZpY2VfY21kIHsKLQlzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgaGRyOwkvKiB1Q29kZSBBUEkgKi8KLQl1bmlvbiB7Ci0JCXUzMiBmbGFnczsKLQkJdTggdmFsODsKLQkJdTE2IHZhbDE2OwotCQl1MzIgdmFsMzI7Ci0JCXN0cnVjdCBpd2xfdHhfY21kIHR4OwotCQl1OCBwYXlsb2FkW0RFRl9DTURfUEFZTE9BRF9TSVpFXTsKLQl9IF9fcGFja2VkIGNtZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgVEZEX01BWF9QQVlMT0FEX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpKQotCi0KLXN0cnVjdCBpd2xfaG9zdF9jbWQgewotCWNvbnN0IHZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgbG9uZyByZXBseV9wYWdlOwotCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpOwotCXUzMiBmbGFnczsKLQl1MTYgbGVuOwotCXU4IGlkOwotfTsKLQotI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAotI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAotI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3J4X3F1ZXVlIC0gUnggcXVldWUKLSAqIEBiZDogZHJpdmVyJ3MgcG9pbnRlciB0byBidWZmZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgKHJiZCkKLSAqIEBiZF9kbWE6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQotICogQHJlYWQ6IFNoYXJlZCBpbmRleCB0byBuZXdlc3QgYXZhaWxhYmxlIFJ4IGJ1ZmZlcgotICogQHdyaXRlOiBTaGFyZWQgaW5kZXggdG8gb2xkZXN0IHdyaXR0ZW4gUnggcGFja2V0Ci0gKiBAZnJlZV9jb3VudDogTnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgYnVmZmVycyBpbiByeF9mcmVlCi0gKiBAcnhfZnJlZTogbGlzdCBvZiBmcmVlIFNLQnMgZm9yIHVzZQotICogQHJ4X3VzZWQ6IExpc3Qgb2YgUnggYnVmZmVycyB3aXRoIG5vIFNLQgotICogQG5lZWRfdXBkYXRlOiBmbGFnIHRvIGluZGljYXRlIHdlIG5lZWQgdG8gdXBkYXRlIHJlYWQvd3JpdGUgaW5kZXgKLSAqIEByYl9zdHRzOiBkcml2ZXIncyBwb2ludGVyIHRvIHJlY2VpdmUgYnVmZmVyIHN0YXR1cwotICogQHJiX3N0dHNfZG1hOiBidXMgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMKLSAqCi0gKiBOT1RFOiAgcnhfZnJlZSBhbmQgcnhfdXNlZCBhcmUgdXNlZCBhcyBhIEZJRk8gZm9yIGl3bF9yeF9tZW1fYnVmZmVycwotICovCi1zdHJ1Y3QgaXdsX3J4X3F1ZXVlIHsKLQlfX2xlMzIgKmJkOwotCWRtYV9hZGRyX3QgYmRfZG1hOwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciBwb29sW1JYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlNdOwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcXVldWVbUlhfUVVFVUVfU0laRV07Ci0JdTMyIHJlYWQ7Ci0JdTMyIHdyaXRlOwotCXUzMiBmcmVlX2NvdW50OwotCXUzMiB3cml0ZV9hY3R1YWw7Ci0Jc3RydWN0IGxpc3RfaGVhZCByeF9mcmVlOwotCXN0cnVjdCBsaXN0X2hlYWQgcnhfdXNlZDsKLQlpbnQgbmVlZF91cGRhdGU7Ci0Jc3RydWN0IGl3bF9yYl9zdGF0dXMgKnJiX3N0dHM7Ci0JZG1hX2FkZHJfdCByYl9zdHRzX2RtYTsKLQlzcGlubG9ja190IGxvY2s7Ci19OwotCi0jZGVmaW5lIElXTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAotCi0jZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKLQotI2RlZmluZSBJV0xfSU5WQUxJRF9SQVRFICAgICAweEZGCi0jZGVmaW5lIElXTF9JTlZBTElEX1ZBTFVFICAgIC0xCi0KLS8qKgotICogc3RydWN0IGl3bF9odF9hZ2cgLS0gYWdncmVnYXRpb24gc3RhdHVzIHdoaWxlIHdhaXRpbmcgZm9yIGJsb2NrLWFjawotICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBmb3IgVHggYXR0ZW1wdAotICogQGZyYW1lX2NvdW50OiAjIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZAotICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5Ci0gKiBAc3RhcnRfaWR4OiBJbmRleCBvZiAxc3QgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKSBpbiBUeCB3aW5kb3cKLSAqIEBiaXRtYXAwOiBMb3cgb3JkZXIgYml0bWFwLCBvbmUgYml0IGZvciBlYWNoIGZyYW1lIHBlbmRpbmcgQUNLIGluIFR4IHdpbmRvdwotICogQGJpdG1hcDE6IEhpZ2ggb3JkZXIsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luZG93Ci0gKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQKLSAqCi0gKiBJZiBSRVBMWV9UWCBpbmRpY2F0ZXMgdGhhdCBhZ2dyZWdhdGlvbiB3YXMgYXR0ZW1wdGVkLCBkcml2ZXIgbXVzdCB3YWl0Ci0gKiBmb3IgYmxvY2sgYWNrIChSRVBMWV9DT01QUkVTU0VEX0JBKS4gIFRoaXMgc3RydWN0IHN0b3JlcyB0eCByZXBseSBpbmZvCi0gKiB1bnRpbCBibG9jayBhY2sgYXJyaXZlcy4KLSAqLwotc3RydWN0IGl3bF9odF9hZ2cgewotCXUxNiB0eHFfaWQ7Ci0JdTE2IGZyYW1lX2NvdW50OwotCXUxNiB3YWl0X2Zvcl9iYTsKLQl1MTYgc3RhcnRfaWR4OwotCXU2NCBiaXRtYXA7Ci0JdTMyIHJhdGVfbl9mbGFnczsKLSNkZWZpbmUgSVdMX0FHR19PRkYgMAotI2RlZmluZSBJV0xfQUdHX09OIDEKLSNkZWZpbmUgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBIDIKLSNkZWZpbmUgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBIDMKLQl1OCBzdGF0ZTsKLX07Ci0KLQotc3RydWN0IGl3bF90aWRfZGF0YSB7Ci0JdTE2IHNlcV9udW1iZXI7IC8qIDQ5NjUgb25seSAqLwotCXUxNiB0ZmRzX2luX3F1ZXVlOwotCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKLX07Ci0KLXN0cnVjdCBpd2xfaHdfa2V5IHsKLQl1MzIgY2lwaGVyOwotCWludCBrZXlsZW47Ci0JdTgga2V5aWR4OwotCXU4IGtleVszMl07Ci19OwotCi11bmlvbiBpd2xfaHRfcmF0ZV9zdXBwIHsKLQl1MTYgcmF0ZXM7Ci0Jc3RydWN0IHsKLQkJdTggc2lzb19yYXRlOwotCQl1OCBtaW1vX3JhdGU7Ci0JfTsKLX07Ci0KLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SyAgICgweDApCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMTZLICAoMHgxKQotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzMySyAgKDB4MikKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsgICgweDMpCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SwotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01BWCAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9NSU4gIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfOEsKLQotLyoKLSAqIE1heGltYWwgTVBEVSBkZW5zaXR5IGZvciBUWCBhZ2dyZWdhdGlvbgotICogNCAtIDJ1cyBkZW5zaXR5Ci0gKiA1IC0gNHVzIGRlbnNpdHkKLSAqIDYgLSA4dXMgZGVuc2l0eQotICogNyAtIDE2dXMgZGVuc2l0eQotICovCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMlVTRUMgICAoMHg0KQotI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDICAgKDB4NSkKLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV84VVNFQyAgICgweDYpCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDICAoMHg3KQotI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRiBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUFYIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUlOICAgICAoMHgxKQotCi1zdHJ1Y3QgaXdsX2h0X2NvbmZpZyB7Ci0JYm9vbCBzaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKLQllbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wczsgLyogY3VycmVudCBzbXBzIG1vZGUgKi8KLX07Ci0KLS8qIFFvUyBzdHJ1Y3R1cmVzICovCi1zdHJ1Y3QgaXdsX3Fvc19pbmZvIHsKLQlpbnQgcW9zX2FjdGl2ZTsKLQlzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZCBkZWZfcW9zX3Bhcm07Ci19OwotCi0vKgotICogU3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHN0YV9sb2NrIGhlbGQuIFdoZW4gc3RhdGlvbiBhZGRpdGlvbgotICogaXMgaW4gcHJvZ3Jlc3MgKElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIG9ubHkKLSAqIHRoZSBjb21tYW5kcyAoaXdsX2xlZ2FjeV9hZGRzdGFfY21kIGFuZCBpd2xfbGlua19xdWFsaXR5X2NtZCkgd2l0aG91dAotICogc3RhX2xvY2sgaGVsZC4KLSAqLwotc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5IHsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YTsKLQlzdHJ1Y3QgaXdsX3RpZF9kYXRhIHRpZFtNQVhfVElEX0NPVU5UXTsKLQl1OCB1c2VkLCBjdHhpZDsKLQlzdHJ1Y3QgaXdsX2h3X2tleSBrZXlpbmZvOwotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHE7Ci19OwotCi1zdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdTggc3RhX2lkOwotfTsKLQotLyoKLSAqIGl3bF9zdGF0aW9uX3ByaXY6IERyaXZlcidzIHByaXZhdGUgc3RhdGlvbiBpbmZvcm1hdGlvbgotICoKLSAqIFdoZW4gbWFjODAyMTEgY3JlYXRlcyBhIHN0YXRpb24gaXQgcmVzZXJ2ZXMgc29tZSBzcGFjZSAoaHctPnN0YV9kYXRhX3NpemUpCi0gKiBpbiB0aGUgc3RydWN0dXJlIGZvciB1c2UgYnkgZHJpdmVyLiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZXMgaW4gdGhhdAotICogc3BhY2UuCi0gKgotICogVGhlIGNvbW1vbiBzdHJ1Y3QgTVVTVCBiZSBmaXJzdCBiZWNhdXNlIGl0IGlzIHNoYXJlZCBiZXR3ZWVuCi0gKiAzOTQ1IGFuZCA0OTY1IQotICovCi1zdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiB7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uIGNvbW1vbjsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSBscV9zdGE7Ci0JYXRvbWljX3QgcGVuZGluZ19mcmFtZXM7Ci0JYm9vbCBjbGllbnQ7Ci0JYm9vbCBhc2xlZXA7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfdmlmX3ByaXYgLSBkcml2ZXIncyBwcml2YXRlIHBlci1pbnRlcmZhY2UgaW5mb3JtYXRpb24KLSAqCi0gKiBXaGVuIG1hYzgwMjExIGFsbG9jYXRlcyBhIHZpcnR1YWwgaW50ZXJmYWNlLCBpdCBjYW4gYWxsb2NhdGUKLSAqIHNwYWNlIGZvciB1cyB0byBwdXQgZGF0YSBpbnRvLgotICovCi1zdHJ1Y3QgaXdsX3ZpZl9wcml2IHsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXU4IGlic3NfYnNzaWRfc3RhX2lkOwotfTsKLQotLyogb25lIGZvciBlYWNoIHVDb2RlIGltYWdlIChpbnN0L2RhdGEsIGJvb3QvaW5pdC9ydW50aW1lKSAqLwotc3RydWN0IGZ3X2Rlc2MgewotCXZvaWQgKnZfYWRkcjsJCS8qIGFjY2VzcyBieSBkcml2ZXIgKi8KLQlkbWFfYWRkcl90IHBfYWRkcjsJLyogYWNjZXNzIGJ5IGNhcmQncyBidXNtYXN0ZXIgRE1BICovCi0JdTMyIGxlbjsJCS8qIGJ5dGVzICovCi19OwotCi0vKiB1Q29kZSBmaWxlIGxheW91dCAqLwotc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgewotCV9fbGUzMiB2ZXI7CS8qIG1ham9yL21pbm9yL0FQSS9zZXJpYWwgKi8KLQlzdHJ1Y3QgewotCQlfX2xlMzIgaW5zdF9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGNvZGUgKi8KLQkJX19sZTMyIGRhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgcnVudGltZSBkYXRhICovCi0JCV9fbGUzMiBpbml0X3NpemU7CS8qIGJ5dGVzIG9mIGluaXQgY29kZSAqLwotCQlfX2xlMzIgaW5pdF9kYXRhX3NpemU7CS8qIGJ5dGVzIG9mIGluaXQgZGF0YSAqLwotCQlfX2xlMzIgYm9vdF9zaXplOwkvKiBieXRlcyBvZiBib290c3RyYXAgY29kZSAqLwotCQl1OCBkYXRhWzBdOwkJLyogaW4gc2FtZSBvcmRlciBhcyBzaXplcyAqLwotCX0gdjE7Ci19OwotCi1zdHJ1Y3QgaXdsNDk2NV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyB7Ci0JdTE2IG1pbl9ucmdfY2NrOwotCXUxNiBtYXhfbnJnX2NjazsKLQotCXUxNiBucmdfdGhfY2NrOwotCXUxNiBucmdfdGhfb2ZkbTsKLQotCXUxNiBhdXRvX2NvcnJfbWluX29mZG07Ci0JdTE2IGF1dG9fY29ycl9taW5fb2ZkbV9tcmM7Ci0JdTE2IGF1dG9fY29ycl9taW5fb2ZkbV94MTsKLQl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yY194MTsKLQotCXUxNiBhdXRvX2NvcnJfbWF4X29mZG07Ci0JdTE2IGF1dG9fY29ycl9tYXhfb2ZkbV9tcmM7Ci0JdTE2IGF1dG9fY29ycl9tYXhfb2ZkbV94MTsKLQl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yY194MTsKLQotCXUxNiBhdXRvX2NvcnJfbWF4X2NjazsKLQl1MTYgYXV0b19jb3JyX21heF9jY2tfbXJjOwotCXUxNiBhdXRvX2NvcnJfbWluX2NjazsKLQl1MTYgYXV0b19jb3JyX21pbl9jY2tfbXJjOwotCi0JdTE2IGJhcmtlcl9jb3JyX3RoX21pbjsKLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluX21yYzsKLQl1MTYgbnJnX3RoX2NjYTsKLX07Ci0KLQotI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh4KSAoKHgpLTI3MykKLSNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4oeCkgKCh4KSsyNzMpCi0KLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2h3X3BhcmFtcwotICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCi0gKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKLSAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcwotICogQHRmZF9zaXplOiBURkQgc2l6ZQotICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKLSAqIEB2YWxpZF90eC9yeF9hbnQ6IHVzYWJsZSBhbnRlbm5hcwotICogQG1heF9yeHFfc2l6ZTogTWF4ICMgUnggZnJhbWVzIGluIFJ4IHF1ZXVlIChtdXN0IGJlIHBvd2VyLW9mLTIpCi0gKiBAbWF4X3J4cV9sb2c6IExvZy1iYXNlLTIgb2YgbWF4X3J4cV9zaXplCi0gKiBAcnhfcGFnZV9vcmRlcjogUnggYnVmZmVyIHBhZ2Ugb3JkZXIKLSAqIEByeF93cnRfcHRyX3JlZzogRkh7Mzl9X1JTQ1NSX0NITkwwX1dQVFIKLSAqIEBtYXhfc3RhdGlvbnM6Ci0gKiBAaHQ0MF9jaGFubmVsOiBpcyA0ME1IeiB3aWR0aCBwb3NzaWJsZSBpbiBiYW5kIDIuNAotICogQklUKElFRUU4MDIxMV9CQU5EXzVHSFopIEJJVChJRUVFODAyMTFfQkFORF81R0haKQotICogQHN3X2NyeXB0bzogMCBmb3IgaHcsIDEgZm9yIHN3Ci0gKiBAbWF4X3h4eF9zaXplOiBmb3IgdWNvZGUgdXNlcwotICogQGN0X2tpbGxfdGhyZXNob2xkOiB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQKLSAqIEBiZWFjb25fdGltZV90c2ZfYml0czogbnVtYmVyIG9mIHZhbGlkIHRzZiBiaXRzIGZvciBiZWFjb24gdGltZQotICogQHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzOiByYW5nZSBvZiBzZW5zaXRpdml0eSB2YWx1ZXMKLSAqLwotc3RydWN0IGl3bF9od19wYXJhbXMgewotCXU4IG1heF90eHFfbnVtOwotCXU4IGRtYV9jaG5sX251bTsKLQl1MTYgc2NkX2JjX3RibHNfc2l6ZTsKLQl1MzIgdGZkX3NpemU7Ci0JdTggIHR4X2NoYWluc19udW07Ci0JdTggIHJ4X2NoYWluc19udW07Ci0JdTggIHZhbGlkX3R4X2FudDsKLQl1OCAgdmFsaWRfcnhfYW50OwotCXUxNiBtYXhfcnhxX3NpemU7Ci0JdTE2IG1heF9yeHFfbG9nOwotCXUzMiByeF9wYWdlX29yZGVyOwotCXUzMiByeF93cnRfcHRyX3JlZzsKLQl1OCAgbWF4X3N0YXRpb25zOwotCXU4ICBodDQwX2NoYW5uZWw7Ci0JdTggIG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KLQl1MzIgbWF4X2luc3Rfc2l6ZTsKLQl1MzIgbWF4X2RhdGFfc2l6ZTsKLQl1MzIgbWF4X2JzbV9zaXplOwotCXUzMiBjdF9raWxsX3RocmVzaG9sZDsgLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCi0JdTE2IGJlYWNvbl90aW1lX3RzZl9iaXRzOwotCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGNvcmUgbW9kdWxlIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKLSAqIGZvciB1c2UgYnkgaXdsLVs0LTVdLmMKLSAqCi0gKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGhhcmR3YXJlIHNwZWNpZmljCi0gKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGNvcmUgbW9kdWxlIGZpbGVzLgotICoKLSAqIE5hbWluZyBjb252ZW50aW9uIC0tCi0gKiBpd2xfICAgICAgICAgPC0tIElzIHBhcnQgb2YgaXdsd2lmaQotICogaXdsWFhYWF8gICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBmb3IgWFhYWCkKLSAqIGl3bDQ5NjVfYmdfICAgICAgPC0tIENhbGxlZCBmcm9tIHdvcmsgcXVldWUgY29udGV4dAotICogaXdsNDk2NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gY29uc3QgdTggaXdsZWdhY3lfYmNhc3RfYWRkcltFVEhfQUxFTl07Ci1leHRlcm4gaW50IGl3bF9sZWdhY3lfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSk7Ci1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoY29uc3Qgc3RydWN0IGl3bF9xdWV1ZSAqcSwgaW50IGkpCi17Ci0JcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/Ci0JCShpID49IHEtPnJlYWRfcHRyICYmIGkgPCBxLT53cml0ZV9wdHIpIDoKLQkJIShpIDwgcS0+cmVhZF9wdHIgJiYgaSA+PSBxLT53cml0ZV9wdHIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTggaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KHN0cnVjdCBpd2xfcXVldWUgKnEsIHUzMiBpbmRleCwKLQkJCQkJCQkJaW50IGlzX2h1Z2UpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdCBhbmQgc2NhbiBjb21tYW5kIHdoaWNoCi0JICogcmVxdWlyZWQgYnVmZmVyID4gVEZEX01BWF9QQVlMT0FEX1NJWkUsCi0JICogdGhlIGJpZyBidWZmZXIgYXQgZW5kIG9mIGNvbW1hbmQgYXJyYXkKLQkgKi8KLQlpZiAoaXNfaHVnZSkKLQkJcmV0dXJuIHEtPm5fd2luZG93OwkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KLQotCS8qIE90aGVyd2lzZSwgdXNlIG5vcm1hbCBzaXplIGJ1ZmZlcnMgKi8KLQlyZXR1cm4gaW5kZXggJiAocS0+bl93aW5kb3cgLSAxKTsKLX0KLQotCi1zdHJ1Y3QgaXdsX2RtYV9wdHIgewotCWRtYV9hZGRyX3QgZG1hOwotCXZvaWQgKmFkZHI7Ci0Jc2l6ZV90IHNpemU7Ci19OwotCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9BVVRPICAgICAwCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9IVF9PTkxZICAxCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV9NSVhFRCAgICAyCi0jZGVmaW5lIElXTF9PUEVSQVRJT05fTU9ERV8yME1IWiAgICAzCi0KLSNkZWZpbmUgSVdMX1RYX0NSQ19TSVpFIDQKLSNkZWZpbmUgSVdMX1RYX0RFTElNSVRFUl9TSVpFIDQKLQotI2RlZmluZSBUWF9QT1dFUl9JV0xfSUxMRUdBTF9WT0xUQUdFIC0xMDAwMAotCi0vKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgotI2RlZmluZSBJV0w0OTY1X0NBTF9OVU1fQkVBQ09OUwkJMjAKLSNkZWZpbmUgSVdMX0NBTF9OVU1fQkVBQ09OUwkJMTYKLSNkZWZpbmUgTUFYSU1VTV9BTExPV0VEX1BBVEhMT1NTCTE1Ci0KLSNkZWZpbmUgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSAzCi0KLSNkZWZpbmUgTUFYX0ZBX09GRE0gIDUwCi0jZGVmaW5lIE1JTl9GQV9PRkRNICA1Ci0jZGVmaW5lIE1BWF9GQV9DQ0sgICA1MAotI2RlZmluZSBNSU5fRkFfQ0NLICAgNQotCi0jZGVmaW5lIEFVVE9fQ09SUl9TVEVQX09GRE0gICAgICAgMQotCi0jZGVmaW5lIEFVVE9fQ09SUl9TVEVQX0NDSyAgICAgMwotI2RlZmluZSBBVVRPX0NPUlJfTUFYX1RIX0NDSyAgIDE2MAotCi0jZGVmaW5lIE5SR19ESUZGICAgICAgICAgICAgICAgMgotI2RlZmluZSBOUkdfU1RFUF9DQ0sgICAgICAgICAgIDIKLSNkZWZpbmUgTlJHX01BUkdJTiAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1BWF9OVU1CRVJfQ0NLX05PX0ZBIDEwMAotCi0jZGVmaW5lIEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUYgICAgKDEyNSkKLQotI2RlZmluZSBDSEFJTl9BICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ0hBSU5fQiAgICAgICAgICAgICAxCi0jZGVmaW5lIENIQUlOX0MgICAgICAgICAgICAgMgotI2RlZmluZSBDSEFJTl9OT0lTRV9ERUxUQV9HQUlOX0lOSVRfVkFMIDQKLSNkZWZpbmUgQUxMX0JBTkRfRklMVEVSCQkJMHhGRjAwCi0jZGVmaW5lIElOX0JBTkRfRklMVEVSCQkJMHhGRgotI2RlZmluZSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUUJMHhGRkZGRkZGRgotCi0jZGVmaW5lIE5SR19OVU1fUFJFVl9TVEFUX0wgICAgIDIwCi0jZGVmaW5lIE5VTV9SWF9DSEFJTlMgICAgICAgICAgIDMKLQotZW51bSBpd2w0OTY1X2ZhbHNlX2FsYXJtX3N0YXRlIHsKLQlJV0xfRkFfVE9PX01BTlkgPSAwLAotCUlXTF9GQV9UT09fRkVXID0gMSwKLQlJV0xfRkFfR09PRF9SQU5HRSA9IDIsCi19OwotCi1lbnVtIGl3bDQ5NjVfY2hhaW5fbm9pc2Vfc3RhdGUgewotCUlXTF9DSEFJTl9OT0lTRV9BTElWRSA9IDAsICAvKiBtdXN0IGJlIDAgKi8KLQlJV0xfQ0hBSU5fTk9JU0VfQUNDVU1VTEFURSwKLQlJV0xfQ0hBSU5fTk9JU0VfQ0FMSUJSQVRFRCwKLQlJV0xfQ0hBSU5fTk9JU0VfRE9ORSwKLX07Ci0KLWVudW0gaXdsNDk2NV9jYWxpYl9lbmFibGVkX3N0YXRlIHsKLQlJV0xfQ0FMSUJfRElTQUJMRUQgPSAwLCAgLyogbXVzdCBiZSAwICovCi0JSVdMX0NBTElCX0VOQUJMRUQgPSAxLAotfTsKLQotLyoKLSAqIGVudW0gaXdsX2NhbGliCi0gKiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCByZXN1bHRzIG9mIGluaXRpYWwgY2FsaWJyYXRpb25zCi0gKiBzaG91bGQgYmUgc2VudCB0byB0aGUgcnVudGltZSB1Q29kZQotICovCi1lbnVtIGl3bF9jYWxpYiB7Ci0JSVdMX0NBTElCX01BWCwKLX07Ci0KLS8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCi1zdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7Ci0Jdm9pZCAqYnVmOwotCXNpemVfdCBidWZfbGVuOwotfTsKLQotZW51bSB1Y29kZV90eXBlIHsKLQlVQ09ERV9OT05FID0gMCwKLQlVQ09ERV9JTklULAotCVVDT0RFX1JUCi19OwotCi0vKiBTZW5zaXRpdml0eSBjYWxpYiBkYXRhICovCi1zdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgewotCXUzMiBhdXRvX2NvcnJfb2ZkbTsKLQl1MzIgYXV0b19jb3JyX29mZG1fbXJjOwotCXUzMiBhdXRvX2NvcnJfb2ZkbV94MTsKLQl1MzIgYXV0b19jb3JyX29mZG1fbXJjX3gxOwotCXUzMiBhdXRvX2NvcnJfY2NrOwotCXUzMiBhdXRvX2NvcnJfY2NrX21yYzsKLQotCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9vZmRtOwotCXUzMiBsYXN0X2ZhX2NudF9vZmRtOwotCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9jY2s7Ci0JdTMyIGxhc3RfZmFfY250X2NjazsKLQotCXUzMiBucmdfY3Vycl9zdGF0ZTsKLQl1MzIgbnJnX3ByZXZfc3RhdGU7Ci0JdTMyIG5yZ192YWx1ZVsxMF07Ci0JdTggIG5yZ19zaWxlbmNlX3Jzc2lbTlJHX05VTV9QUkVWX1NUQVRfTF07Ci0JdTMyIG5yZ19zaWxlbmNlX3JlZjsKLQl1MzIgbnJnX2VuZXJneV9pZHg7Ci0JdTMyIG5yZ19zaWxlbmNlX2lkeDsKLQl1MzIgbnJnX3RoX2NjazsKLQlzMzIgbnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmY7Ci0JdTMyIG51bV9pbl9jY2tfbm9fZmE7Ci0JdTMyIG5yZ190aF9vZmRtOwotCi0JdTE2IGJhcmtlcl9jb3JyX3RoX21pbjsKLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluX21yYzsKLQl1MTYgbnJnX3RoX2NjYTsKLX07Ci0KLS8qIENoYWluIG5vaXNlIChkaWZmZXJlbnRpYWwgUnggZ2FpbikgY2FsaWIgZGF0YSAqLwotc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhIHsKLQl1MzIgYWN0aXZlX2NoYWluczsKLQl1MzIgY2hhaW5fbm9pc2VfYTsKLQl1MzIgY2hhaW5fbm9pc2VfYjsKLQl1MzIgY2hhaW5fbm9pc2VfYzsKLQl1MzIgY2hhaW5fc2lnbmFsX2E7Ci0JdTMyIGNoYWluX3NpZ25hbF9iOwotCXUzMiBjaGFpbl9zaWduYWxfYzsKLQl1MTYgYmVhY29uX2NvdW50OwotCXU4IGRpc2Nvbm5fYXJyYXlbTlVNX1JYX0NIQUlOU107Ci0JdTggZGVsdGFfZ2Fpbl9jb2RlW05VTV9SWF9DSEFJTlNdOwotCXU4IHJhZGlvX3dyaXRlOwotCXU4IHN0YXRlOwotfTsKLQotI2RlZmluZQlFRVBST01fU0VNX1RJTUVPVVQgMTAJCS8qIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBFRVBST01fU0VNX1JFVFJZX0xJTUlUIDEwMDAJLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KLQotI2RlZmluZSBJV0xfVFJBRkZJQ19FTlRSSUVTCSgyNTYpCi0jZGVmaW5lIElXTF9UUkFGRklDX0VOVFJZX1NJWkUgICg2NCkKLQotZW51bSB7Ci0JTUVBU1VSRU1FTlRfUkVBRFkgPSAoMSA8PCAwKSwKLQlNRUFTVVJFTUVOVF9BQ1RJVkUgPSAoMSA8PCAxKSwKLX07Ci0KLS8qIGludGVycnVwdCBzdGF0aXN0aWNzICovCi1zdHJ1Y3QgaXNyX3N0YXRpc3RpY3MgewotCXUzMiBodzsKLQl1MzIgc3c7Ci0JdTMyIGVycl9jb2RlOwotCXUzMiBzY2g7Ci0JdTMyIGFsaXZlOwotCXUzMiByZmtpbGw7Ci0JdTMyIGN0a2lsbDsKLQl1MzIgd2FrZXVwOwotCXUzMiByeDsKLQl1MzIgcnhfaGFuZGxlcnNbUkVQTFlfTUFYXTsKLQl1MzIgdHg7Ci0JdTMyIHVuaGFuZGxlZDsKLX07Ci0KLS8qIG1hbmFnZW1lbnQgc3RhdGlzdGljcyAqLwotZW51bSBpd2xfbWdtdF9zdGF0cyB7Ci0JTUFOQUdFTUVOVF9BU1NPQ19SRVEgPSAwLAotCU1BTkFHRU1FTlRfQVNTT0NfUkVTUCwKLQlNQU5BR0VNRU5UX1JFQVNTT0NfUkVRLAotCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQLAotCU1BTkFHRU1FTlRfUFJPQkVfUkVRLAotCU1BTkFHRU1FTlRfUFJPQkVfUkVTUCwKLQlNQU5BR0VNRU5UX0JFQUNPTiwKLQlNQU5BR0VNRU5UX0FUSU0sCi0JTUFOQUdFTUVOVF9ESVNBU1NPQywKLQlNQU5BR0VNRU5UX0FVVEgsCi0JTUFOQUdFTUVOVF9ERUFVVEgsCi0JTUFOQUdFTUVOVF9BQ1RJT04sCi0JTUFOQUdFTUVOVF9NQVgsCi19OwotLyogY29udHJvbCBzdGF0aXN0aWNzICovCi1lbnVtIGl3bF9jdHJsX3N0YXRzIHsKLQlDT05UUk9MX0JBQ0tfUkVRID0gIDAsCi0JQ09OVFJPTF9CQUNLLAotCUNPTlRST0xfUFNQT0xMLAotCUNPTlRST0xfUlRTLAotCUNPTlRST0xfQ1RTLAotCUNPTlRST0xfQUNLLAotCUNPTlRST0xfQ0ZFTkQsCi0JQ09OVFJPTF9DRkVOREFDSywKLQlDT05UUk9MX01BWCwKLX07Ci0KLXN0cnVjdCB0cmFmZmljX3N0YXRzIHsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCXUzMiBtZ210W01BTkFHRU1FTlRfTUFYXTsKLQl1MzIgY3RybFtDT05UUk9MX01BWF07Ci0JdTMyIGRhdGFfY250OwotCXU2NCBkYXRhX2J5dGVzOwotI2VuZGlmCi19OwotCi0vKgotICogaG9zdCBpbnRlcnJ1cHQgdGltZW91dCB2YWx1ZQotICogdXNlZCB3aXRoIHNldHRpbmcgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIKLSAqIHRoZSBDU1JfSU5UX0NPQUxFU0NJTkcgaXMgYW4gOCBiaXQgcmVnaXN0ZXIgaW4gMzItdXNlYyB1bml0Ci0gKgotICogZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciBpcyA2NCB4IDMyID0gMjA0OCB1c2VjcwotICogZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2luZyBjYWxpYnJhdGlvbiB0aW1lciBpcyAxNiB4IDMyID0gNTEyIHVzZWNzCi0gKi8KLSNkZWZpbmUgSVdMX0hPU1RfSU5UX1RJTUVPVVRfTUFYCSgweEZGKQotI2RlZmluZSBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYJKDB4NDApCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9USU1FT1VUX01JTgkoMHgwKQotI2RlZmluZSBJV0xfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NQVgJKDB4RkYpCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKLSNkZWZpbmUgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUlOCSgweDApCi0KLSNkZWZpbmUgSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEIChIWio1KQotCi0vKiBUWCBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0cyBpbiBtU2VjcyAqLwotI2RlZmluZSBJV0xfREVGX1dEX1RJTUVPVVQJKDIwMDApCi0jZGVmaW5lIElXTF9MT05HX1dEX1RJTUVPVVQJKDEwMDAwKQotI2RlZmluZSBJV0xfTUFYX1dEX1RJTUVPVVQJKDEyMDAwMCkKLQotc3RydWN0IGl3bF9mb3JjZV9yZXNldCB7Ci0JaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7Ci0JaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7Ci0JaW50IHJlc2V0X3JlamVjdF9jb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlc2V0X2R1cmF0aW9uOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOwotfTsKLQotLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCi0vKgotICogZm9yIF8zOTQ1IGRldmljZXMKLSAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAotICogYml0cyAyMzowICAtIGludGVydmFsCi0gKi8KLSNkZWZpbmUgSVdMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TCTI0Ci0vKgotICogZm9yIF80OTY1IGRldmljZXMKLSAqIGJpdHMgMzE6MjIgLSBleHRlbmRlZAotICogYml0cyAyMTowICAtIGludGVydmFsCi0gKi8KLSNkZWZpbmUgSVdMNDk2NV9FWFRfQkVBQ09OX1RJTUVfUE9TCTIyCi0KLWVudW0gaXdsX3J4b25fY29udGV4dF9pZCB7Ci0JSVdMX1JYT05fQ1RYX0JTUywKLQotCU5VTV9JV0xfUlhPTl9DVFgKLX07Ci0KLXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwotCi0JY29uc3QgdTggKmFjX3RvX2ZpZm87Ci0JY29uc3QgdTggKmFjX3RvX3F1ZXVlOwotCXU4IG1jYXN0X3F1ZXVlOwotCi0JLyoKLQkgKiBXZSBjb3VsZCB1c2UgdGhlIHZpZiB0byBpbmRpY2F0ZSBhY3RpdmUsIGJ1dCB3ZQotCSAqIGFsc28gbmVlZCBpdCB0byBiZSBhY3RpdmUgZHVyaW5nIGRpc2FibGluZyB3aGVuCi0JICogd2UgYWxyZWFkeSByZW1vdmVkIHRoZSB2aWYgZm9yIHR5cGUgc2V0dGluZy4KLQkgKi8KLQlib29sIGFsd2F5c19hY3RpdmUsIGlzX2FjdGl2ZTsKLQotCWJvb2wgaHRfbmVlZF9tdWx0aXBsZV9jaGFpbnM7Ci0KLQllbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4aWQ7Ci0KLQl1MzIgaW50ZXJmYWNlX21vZGVzLCBleGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCXU4IHVudXNlZF9kZXZ0eXBlLCBhcF9kZXZ0eXBlLCBpYnNzX2RldnR5cGUsIHN0YXRpb25fZGV2dHlwZTsKLQotCS8qCi0JICogV2UgZGVjbGFyZSB0aGlzIGNvbnN0IHNvIGl0IGNhbiBvbmx5IGJlCi0JICogY2hhbmdlZCB2aWEgZXhwbGljaXQgY2FzdCB3aXRoaW4gdGhlCi0JICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIHBoeXNpY2FsCi0JICogaGFyZHdhcmUuCi0JICovCi0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgYWN0aXZlOwotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kIHN0YWdpbmc7Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fdGltZV9jbWQgdGltaW5nOwotCi0Jc3RydWN0IGl3bF9xb3NfaW5mbyBxb3NfZGF0YTsKLQotCXU4IGJjYXN0X3N0YV9pZCwgYXBfc3RhX2lkOwotCi0JdTggcnhvbl9jbWQsIHJ4b25fYXNzb2NfY21kLCByeG9uX3RpbWluZ19jbWQ7Ci0JdTggcW9zX2NtZDsKLQl1OCB3ZXBfa2V5X2NtZDsKLQotCXN0cnVjdCBpd2xfd2VwX2tleSB3ZXBfa2V5c1tXRVBfS0VZU19NQVhdOwotCXU4IGtleV9tYXBwaW5nX2tleXM7Ci0KLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsKLQotCXN0cnVjdCB7Ci0JCWJvb2wgbm9uX2dmX3N0YV9wcmVzZW50OwotCQl1OCBwcm90ZWN0aW9uOwotCQlib29sIGVuYWJsZWQsIGlzXzQwbWh6OwotCQl1OCBleHRlbnNpb25fY2hhbl9vZmZzZXQ7Ci0JfSBodDsKLX07Ci0KLXN0cnVjdCBpd2xfcHJpdiB7Ci0KLQkvKiBpZWVlIGRldmljZSB1c2VkIGJ5IGdlbmVyaWMgaWVlZSBwcm9jZXNzaW5nIGNvZGUgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmllZWVfY2hhbm5lbHM7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICppZWVlX3JhdGVzOwotCXN0cnVjdCBpd2xfY2ZnICpjZmc7Ci0KLQkvKiB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZSBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2ZyYW1lczsKLQlpbnQgZnJhbWVzX2NvdW50OwotCi0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCWludCBhbGxvY19yeGJfcGFnZTsKLQotCXZvaWQgKCpyeF9oYW5kbGVyc1tSRVBMWV9NQVhdKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107Ci0KLQkvKiBzcGVjdHJ1bSBtZWFzdXJlbWVudCByZXBvcnQgY2FjaGluZyAqLwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIG1lYXN1cmVfcmVwb3J0OwotCXU4IG1lYXN1cmVtZW50X3N0YXR1czsKLQotCS8qIHVjb2RlIGJlYWNvbiB0aW1lICovCi0JdTMyIHVjb2RlX2JlYWNvbl90aW1lOwotCWludCBtaXNzZWRfYmVhY29uX3RocmVzaG9sZDsKLQotCS8qIHRyYWNrIElCU1MgbWFuYWdlciAobGFzdCBiZWFjb24pIHN0YXR1cyAqLwotCXUzMiBpYnNzX21hbmFnZXI7Ci0KLQkvKiBmb3JjZSByZXNldCAqLwotCXN0cnVjdCBpd2xfZm9yY2VfcmVzZXQgZm9yY2VfcmVzZXQ7Ci0KLQkvKiB3ZSBhbGxvY2F0ZSBhcnJheSBvZiBpd2xfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KLQkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpbmRleCBhcnJheSAqLwotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLwotCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KLQotCS8qIHRoZXJtYWwgY2FsaWJyYXRpb24gKi8KLQlzMzIgdGVtcGVyYXR1cmU7CS8qIGRlZ3JlZXMgS2VsdmluICovCi0JczMyIGxhc3RfdGVtcGVyYXR1cmU7Ci0KLQkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLQlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCBjYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9NQVhdOwotCi0JLyogU2NhbiByZWxhdGVkIHZhcmlhYmxlcyAqLwotCXVuc2lnbmVkIGxvbmcgc2Nhbl9zdGFydDsKLQl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnRfdHNmOwotCXZvaWQgKnNjYW5fY21kOwotCWVudW0gaWVlZTgwMjExX2JhbmQgc2Nhbl9iYW5kOwotCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnNjYW5fcmVxdWVzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqc2Nhbl92aWY7Ci0JdTggc2Nhbl90eF9hbnRbSUVFRTgwMjExX05VTV9CQU5EU107Ci0JdTggbWdtdF90eF9hbnQ7Ci0KLQkvKiBzcGlubG9jayAqLwotCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdCBnZW5lcmFsIHNoYXJlZCBkYXRhICovCi0Jc3BpbmxvY2tfdCBoY21kX2xvY2s7CS8qIHByb3RlY3QgaGNtZCAqLwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7CS8qIHByb3RlY3QgaHcgcmVnaXN0ZXIgYWNjZXNzICovCi0Jc3RydWN0IG11dGV4IG11dGV4OwotCi0JLyogYmFzaWMgcGNpLW5ldHdvcmsgZHJpdmVyIHN0dWZmICovCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Ci0KLQkvKiBwY2kgaGFyZHdhcmUgYWRkcmVzcyBzdXBwb3J0ICovCi0Jdm9pZCBfX2lvbWVtICpod19iYXNlOwotCXUzMiAgaHdfcmV2OwotCXUzMiAgaHdfd2FfcmV2OwotCXU4ICAgcmV2X2lkOwotCi0JLyogbWljcm9jb2RlL2RldmljZSBzdXBwb3J0cyBtdWx0aXBsZSBjb250ZXh0cyAqLwotCXU4IHZhbGlkX2NvbnRleHRzOwotCi0JLyogY29tbWFuZCBxdWV1ZSBudW1iZXIgKi8KLQl1OCBjbWRfcXVldWU7Ci0KLQkvKiBtYXggbnVtYmVyIG9mIHN0YXRpb24ga2V5cyAqLwotCXU4IHN0YV9rZXlfbWF4X251bTsKLQotCS8qIEVFUFJPTSBNQUMgYWRkcmVzc2VzICovCi0Jc3RydWN0IG1hY19hZGRyZXNzIGFkZHJlc3Nlc1sxXTsKLQotCS8qIHVDb2RlIGltYWdlcywgc2F2ZSB0byByZWxvYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCi0JaW50IGZ3X2luZGV4OwkJCS8qIGZpcm13YXJlIHdlJ3JlIHRyeWluZyB0byBsb2FkICovCi0JdTMyIHVjb2RlX3ZlcjsJCQkvKiB2ZXJzaW9uIG9mIHVjb2RlLCBjb3B5IG9mCi0JCQkJCSAgIGl3bF91Y29kZS52ZXIgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9jb2RlOwkvKiBydW50aW1lIGluc3QgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhOwkvKiBydW50aW1lIGRhdGEgb3JpZ2luYWwgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhX2JhY2t1cDsJLyogcnVudGltZSBkYXRhIHNhdmUvcmVzdG9yZSAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXQ7CS8qIGluaXRpYWxpemF0aW9uIGluc3QgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9pbml0X2RhdGE7CS8qIGluaXRpYWxpemF0aW9uIGRhdGEgKi8KLQlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9ib290OwkvKiBib290c3RyYXAgaW5zdCAqLwotCWVudW0gdWNvZGVfdHlwZSB1Y29kZV90eXBlOwotCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KLQljaGFyIGZpcm13YXJlX25hbWVbMjVdOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgY29udGV4dHNbTlVNX0lXTF9SWE9OX0NUWF07Ci0KLQlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7Ci0KLQkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCi0JICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KLQlzdHJ1Y3QgaXdsX2luaXRfYWxpdmVfcmVzcCBjYXJkX2FsaXZlX2luaXQ7Ci0Jc3RydWN0IGl3bF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmU7Ci0KLQl1MTYgYWN0aXZlX3JhdGU7Ci0KLQl1OCBzdGFydF9jYWxpYjsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKLQlzdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgY2hhaW5fbm9pc2VfZGF0YTsKLQlfX2xlMTYgc2Vuc2l0aXZpdHlfdGJsW0hEX1RBQkxFX1NJWkVdOwotCi0Jc3RydWN0IGl3bF9odF9jb25maWcgY3VycmVudF9odF9jb25maWc7Ci0KLQkvKiBSYXRlIHNjYWxpbmcgZGF0YSAqLwotCXU4IHJldHJ5X3JhdGU7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2NvbW1hbmRfcXVldWU7Ci0KLQlpbnQgYWN0aXZpdHlfdGltZXJfYWN0aXZlOwotCi0JLyogUnggYW5kIFR4IERNQSBwcm9jZXNzaW5nIHF1ZXVlcyAqLwotCXN0cnVjdCBpd2xfcnhfcXVldWUgcnhxOwotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cTsKLQl1bnNpZ25lZCBsb25nIHR4cV9jdHhfYWN0aXZlX21zazsKLQlzdHJ1Y3QgaXdsX2RtYV9wdHIgIGt3OwkvKiBrZWVwIHdhcm0gYWRkcmVzcyAqLwotCXN0cnVjdCBpd2xfZG1hX3B0ciAgc2NkX2JjX3RibHM7Ci0KLQl1MzIgc2NkX2Jhc2VfYWRkcjsJLyogc2NoZWR1bGVyIHNyYW0gYmFzZSBhZGRyZXNzICovCi0KLQl1bnNpZ25lZCBsb25nIHN0YXR1czsKLQotCS8qIGNvdW50cyBtZ210LCBjdGwsIGFuZCBkYXRhIHBhY2tldHMgKi8KLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cyB0eF9zdGF0czsKLQlzdHJ1Y3QgdHJhZmZpY19zdGF0cyByeF9zdGF0czsKLQotCS8qIGNvdW50cyBpbnRlcnJ1cHRzICovCi0Jc3RydWN0IGlzcl9zdGF0aXN0aWNzIGlzcl9zdGF0czsKLQotCXN0cnVjdCBpd2xfcG93ZXJfbWdyIHBvd2VyX2RhdGE7Ci0KLQkvKiBjb250ZXh0IGluZm9ybWF0aW9uICovCi0JdTggYnNzaWRbRVRIX0FMRU5dOyAvKiB1c2VkIG9ubHkgb24gMzk0NSBidXQgZmlsbGVkIGJ5IGNvcmUgKi8KLQotCS8qIHN0YXRpb24gdGFibGUgdmFyaWFibGVzICovCi0KLQkvKiBOb3RlOiBpZiBsb2NrIGFuZCBzdGFfbG9jayBhcmUgbmVlZGVkLCBsb2NrIG11c3QgYmUgYWNxdWlyZWQgZmlyc3QgKi8KLQlzcGlubG9ja190IHN0YV9sb2NrOwotCWludCBudW1fc3RhdGlvbnM7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5IHN0YXRpb25zW0lXTF9TVEFUSU9OX0NPVU5UXTsKLQl1bnNpZ25lZCBsb25nIHVjb2RlX2tleV90YWJsZTsKLQotCS8qIHF1ZXVlIHJlZmNvdW50cyAqLwotI2RlZmluZSBJV0xfTUFYX0hXX1FVRVVFUwkzMgotCXVuc2lnbmVkIGxvbmcgcXVldWVfc3RvcHBlZFtCSVRTX1RPX0xPTkdTKElXTF9NQVhfSFdfUVVFVUVTKV07Ci0JLyogZm9yIGVhY2ggQUMgKi8KLQlhdG9taWNfdCBxdWV1ZV9zdG9wX2NvdW50WzRdOwotCi0JLyogSW5kaWNhdGlvbiBpZiBpZWVlODAyMTFfb3BzLT5vcGVuIGhhcyBiZWVuIGNhbGxlZCAqLwotCXU4IGlzX29wZW47Ci0KLQl1OCBtYWM4MDIxMV9yZWdpc3RlcmVkOwotCi0JLyogZWVwcm9tIC0tIHRoaXMgaXMgaW4gdGhlIGNhcmQncyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KLQl1OCAqZWVwcm9tOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87Ci0KLQllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7Ci0KLQkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLwotCXU2NCB0aW1lc3RhbXA7Ci0KLQl1bmlvbiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVdMMzk0NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMMzk0NV9NT0RVTEUpCi0JCXN0cnVjdCB7Ci0JCQl2b2lkICpzaGFyZWRfdmlydDsKLQkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7Ci0KLQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhlcm1hbF9wZXJpb2RpYzsKLQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZraWxsX3BvbGw7Ci0KLQkJCXN0cnVjdCBpd2wzOTQ1X25vdGlmX3N0YXRpc3RpY3Mgc3RhdGlzdGljczsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBhY2N1bV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBkZWx0YV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBtYXhfZGVsdGE7Ci0jZW5kaWYKLQotCQkJdTMyIHN0YV9zdXBwX3JhdGVzOwotCQkJaW50IGxhc3RfcnhfcnNzaTsJLyogRnJvbSBSeCBwYWNrZXQgc3RhdGlzdGljcyAqLwotCi0JCQkvKiBSeCdkIHBhY2tldCB0aW1pbmcgaW5mb3JtYXRpb24gKi8KLQkJCXUzMiBsYXN0X2JlYWNvbl90aW1lOwotCQkJdTY0IGxhc3RfdHNmOwotCi0JCQkvKgotCQkJICogZWFjaCBjYWxpYnJhdGlvbiBjaGFubmVsIGdyb3VwIGluIHRoZQotCQkJICogRUVQUk9NIGhhcyBhIGRlcml2ZWQgY2xpcCBzZXR0aW5nIGZvcgotCQkJICogZWFjaCByYXRlLgotCQkJICovCi0JCQljb25zdCBzdHJ1Y3QgaXdsMzk0NV9jbGlwX2dyb3VwIGNsaXBfZ3JvdXBzWzVdOwotCi0JCX0gXzM5NDU7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyBsYXN0X3BoeV9yZXM7Ci0JCQlib29sIGxhc3RfcGh5X3Jlc192YWxpZDsKLQotCQkJc3RydWN0IGNvbXBsZXRpb24gZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZTsKLQotCQkJLyoKLQkJCSAqIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzIGFyZSB0aGUKLQkJCSAqIHR3byBleHRyYSBjYWxpYnJhdGlvbiBjb21tYW5kcyBmb2xsb3dzIHRoZSBzdGFuZGFyZAotCQkJICogcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzCi0JCQkgKi8KLQkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQ7Ci0JCQl1OCBwaHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQ7Ci0KLQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBzdGF0aXN0aWNzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgYWNjdW1fc3RhdGlzdGljczsKLQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBkZWx0YV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YTsKLSNlbmRpZgotCi0JCX0gXzQ5NjU7Ci0jZW5kaWYKLQl9OwotCi0Jc3RydWN0IGl3bF9od19wYXJhbXMgaHdfcGFyYW1zOwotCi0JdTMyIGludGFfbWFzazsKLQotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdGFydDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl9jb21wbGV0ZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHJ4X3JlcGxlbmlzaDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWJvcnRfc2NhbjsKLQotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OwotCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOwotCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OwotCi0Jc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOwotCi0JLyogVFggUG93ZXIgKi8KLQlzOCB0eF9wb3dlcl91c2VyX2xtdDsKLQlzOCB0eF9wb3dlcl9kZXZpY2VfbG10OwotCXM4IHR4X3Bvd2VyX25leHQ7Ci0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCS8qIGRlYnVnZ2luZyBpbmZvICovCi0JdTMyIGRlYnVnX2xldmVsOyAvKiBwZXIgZGV2aWNlIGRlYnVnZ2luZyB3aWxsIG92ZXJyaWRlIGdsb2JhbAotCQkJICAgIGl3bGVnYWN5X2RlYnVnX2xldmVsIGlmIHNldCAqLwotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JLyogZGVidWdmcyAqLwotCXUxNiB0eF90cmFmZmljX2lkeDsKLQl1MTYgcnhfdHJhZmZpY19pZHg7Ci0JdTggKnR4X3RyYWZmaWM7Ci0JdTggKnJ4X3RyYWZmaWM7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7Ci0JdTMyIGRiZ2ZzX3NyYW1fb2Zmc2V0LCBkYmdmc19zcmFtX2xlbjsKLQlib29sIGRpc2FibGVfaHQ0MDsKLSNlbmRpZiAvKiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUyAqLwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHR4cG93ZXJfd29yazsKLQl1MzIgZGlzYWJsZV9zZW5zX2NhbDsKLQl1MzIgZGlzYWJsZV9jaGFpbl9ub2lzZV9jYWw7Ci0JdTMyIGRpc2FibGVfdHhfcG93ZXJfY2FsOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBydW5fdGltZV9jYWxpYl93b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0IHN0YXRpc3RpY3NfcGVyaW9kaWM7Ci0Jc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2c7Ci0JYm9vbCBod19yZWFkeTsKLQotCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwotCXVuc2lnbmVkIGxvbmcgYmxpbmtfb24sIGJsaW5rX29mZjsKLQlib29sIGxlZF9yZWdpc3RlcmVkOwotfTsgLyppd2xfcHJpdiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3R4cV9jdHhfYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXNldF9iaXQodHhxX2lkLCAmcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF90eHFfY3R4X2RlYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCWNsZWFyX2JpdCh0eHFfaWQsICZwcml2LT50eHFfY3R4X2FjdGl2ZV9tc2spOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0vKgotICogaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWw6IFJldHVybiBhY3RpdmUgZGVidWcgbGV2ZWwgZm9yIGRldmljZQotICoKLSAqIFVzaW5nIHN5c2ZzIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBwZXIgZGV2aWNlIGRlYnVnIGxldmVsLiBUaGlzIGRlYnVnCi0gKiBsZXZlbCB3aWxsIGJlIHVzZWQgaWYgc2V0LCBvdGhlcndpc2UgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCB3aGljaCBjYW4gYmUKLSAqIHNldCB2aWEgbW9kdWxlIHBhcmFtZXRlciBpcyB1c2VkLgotICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKHByaXYtPmRlYnVnX2xldmVsKQotCQlyZXR1cm4gcHJpdi0+ZGVidWdfbGV2ZWw7Ci0JZWxzZQotCQlyZXR1cm4gaXdsZWdhY3lfZGVidWdfbGV2ZWw7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xlZ2FjeV9kZWJ1Z19sZXZlbDsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9oZHIgKgotaXdsX2xlZ2FjeV90eF9xdWV1ZV9nZXRfaGRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJCSBpbnQgdHhxX2lkLCBpbnQgaWR4KQotewotCWlmIChwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpCi0JCXJldHVybiAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwcml2LT50eHFbdHhxX2lkXS4KLQkJCQl0eGJbaWR4XS5za2ItPmRhdGE7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKgotaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZihzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JcmV0dXJuIHZpZl9wcml2LT5jdHg7Ci19Ci0KLSNkZWZpbmUgZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCQkJCVwKLQlmb3IgKGN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsJCVwKLQkgICAgIGN0eCA8ICZwcml2LT5jb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsgY3R4KyspCVwKLQkJaWYgKHByaXYtPnZhbGlkX2NvbnRleHRzICYgQklUKGN0eC0+Y3R4aWQpKQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4aWQpCi17Ci0JcmV0dXJuIChwcml2LT5jb250ZXh0c1tjdHhpZF0uYWN0aXZlLmZpbHRlcl9mbGFncyAmCi0JCQlSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlyZXR1cm4gKGN0eC0+YWN0aXZlLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCWlmIChjaF9pbmZvID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9WQUxJRCkgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3JhZGFyKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXJldHVybiBjaF9pbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2gpCi17Ci0JcmV0dXJuICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0FDVElWRSkpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2xfbGVnYWN5X2lzX2NoYW5uZWxfaWJzcyhjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2gpCi17Ci0JcmV0dXJuIChjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9JQlNTKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JX19mcmVlX3BhZ2VzKHBhZ2UsIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQlwcml2LT5hbGxvY19yeGJfcGFnZS0tOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBwYWdlKQotewotCWZyZWVfcGFnZXMocGFnZSwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci19Ci0jZW5kaWYJCQkJLyogX19pd2xfbGVnYWN5X2Rldl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXZ0cmFjZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWM5OTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0vKiBzcGFyc2UgZG9lc24ndCBsaWtlIHRyYWNlcG9pbnQgbWFjcm9zICovCi0jaWZuZGVmIF9fQ0hFQ0tFUl9fCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKLSNpbmNsdWRlICJpd2wtZGV2dHJhY2UuaCIKLQotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlOCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X2lvcmVhZDMyKTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTMyKTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfcngpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl90eCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2Vycm9yKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MzcyNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKF9fSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNFKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQotI2RlZmluZSBfX0lXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDRQotCi0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi0jaWYgIWRlZmluZWQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFVklDRV9UUkFDSU5HKSB8fCBkZWZpbmVkKF9fQ0hFQ0tFUl9fKQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCAuLi4pIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8gIyMgbmFtZShwcm90bykge30KLSNlbmRpZgotCi0KLSNkZWZpbmUgUFJJVl9FTlRSWQlfX2ZpZWxkKHN0cnVjdCBpd2xfcHJpdiAqLCBwcml2KQotI2RlZmluZSBQUklWX0FTU0lHTgkoX19lbnRyeS0+cHJpdiA9IHByaXYpCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfbGVnYWN5X2lvCi0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3JlYWQzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1MzIsIHZhbCkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVwXSByZWFkIGlvWyUjeF0gPSAlI3giLCBfX2VudHJ5LT5wcml2LAotCQkJCQlfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTgsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZmcywgdTggdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1OCwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5vZmZzID0gb2ZmczsKLQkJX19lbnRyeS0+dmFsID0gdmFsOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIHdyaXRlIGlvWyUjeF0gPSAlI3gpIiwgX19lbnRyeS0+cHJpdiwKLQkJCQkJX19lbnRyeS0+b2ZmcywgX19lbnRyeS0+dmFsKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGUzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKHByaXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1MzIsIHZhbCkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVwXSB3cml0ZSBpb1slI3hdID0gJSN4KSIsIF9fZW50cnktPnByaXYsCi0JCQkJCV9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKLSk7Ci0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfbGVnYWN5X3Vjb2RlCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmkKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X2hjbWQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpoY21kLCBzaXplX3QgbGVuLCB1MzIgZmxhZ3MpLAotCVRQX0FSR1MocHJpdiwgaGNtZCwgbGVuLCBmbGFncyksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGhjbWQsIGxlbikKLQkJX19maWVsZCh1MzIsIGZsYWdzKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShoY21kKSwgaGNtZCwgbGVuKTsKLQkJX19lbnRyeS0+ZmxhZ3MgPSBmbGFnczsKLQkpLAotCVRQX3ByaW50aygiWyVwXSBoY21kICUjLjJ4ICglc3N5bmMpIiwKLQkJICBfX2VudHJ5LT5wcml2LCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSlbMF0sCi0JCSAgX19lbnRyeS0+ZmxhZ3MgJiBDTURfQVNZTkMgPyAiYSIgOiAiIikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl9yeCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJ4YnVmLCBzaXplX3QgbGVuKSwKLQlUUF9BUkdTKHByaXYsIHJ4YnVmLCBsZW4pLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQkJX19keW5hbWljX2FycmF5KHU4LCByeGJ1ZiwgbGVuKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShyeGJ1ZiksIHJ4YnVmLCBsZW4pOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIFJYIGNtZCAlIy4yeCIsCi0JCSAgX19lbnRyeS0+cHJpdiwgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkocnhidWYpKVs0XSkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl90eCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnRmZCwgc2l6ZV90IHRmZGxlbiwKLQkJIHZvaWQgKmJ1ZjAsIHNpemVfdCBidWYwX2xlbiwKLQkJIHZvaWQgKmJ1ZjEsIHNpemVfdCBidWYxX2xlbiksCi0JVFBfQVJHUyhwcml2LCB0ZmQsIHRmZGxlbiwgYnVmMCwgYnVmMF9sZW4sIGJ1ZjEsIGJ1ZjFfbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0KLQkJX19maWVsZChzaXplX3QsIGZyYW1lbGVuKQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIHRmZCwgdGZkbGVuKQotCi0JCS8qCi0JCSAqIERvIG5vdCBpbnNlcnQgYmV0d2VlbiBvciBiZWxvdyB0aGVzZSBpdGVtcywKLQkJICogd2Ugd2FudCB0byBrZWVwIHRoZSBmcmFtZSB0b2dldGhlciAoZXhjZXB0Ci0JCSAqIGZvciB0aGUgcG9zc2libGUgcGFkZGluZykuCi0JCSAqLwotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGJ1ZjAsIGJ1ZjBfbGVuKQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGJ1ZjEsIGJ1ZjFfbGVuKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5mcmFtZWxlbiA9IGJ1ZjBfbGVuICsgYnVmMV9sZW47Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHRmZCksIHRmZCwgdGZkbGVuKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCksIGJ1ZjAsIGJ1ZjBfbGVuKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMSksIGJ1ZjEsIGJ1ZjFfbGVuKTsKLQkpLAotCVRQX3ByaW50aygiWyVwXSBUWCAlLjJ4ICglenUgYnl0ZXMpIiwKLQkJICBfX2VudHJ5LT5wcml2LAotCQkgICgodTggKilfX2dldF9keW5hbWljX2FycmF5KGJ1ZjApKVswXSwKLQkJICBfX2VudHJ5LT5mcmFtZWxlbikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvciwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZXNjLCB1MzIgdGltZSwKLQkJIHUzMiBkYXRhMSwgdTMyIGRhdGEyLCB1MzIgbGluZSwgdTMyIGJsaW5rMSwKLQkJIHUzMiBibGluazIsIHUzMiBpbGluazEsIHUzMiBpbGluazIpLAotCVRQX0FSR1MocHJpdiwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lLAotCQlibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQkJX19maWVsZCh1MzIsIGRlc2MpCi0JCV9fZmllbGQodTMyLCB0aW1lKQotCQlfX2ZpZWxkKHUzMiwgZGF0YTEpCi0JCV9fZmllbGQodTMyLCBkYXRhMikKLQkJX19maWVsZCh1MzIsIGxpbmUpCi0JCV9fZmllbGQodTMyLCBibGluazEpCi0JCV9fZmllbGQodTMyLCBibGluazIpCi0JCV9fZmllbGQodTMyLCBpbGluazEpCi0JCV9fZmllbGQodTMyLCBpbGluazIpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCV9fZW50cnktPmRlc2MgPSBkZXNjOwotCQlfX2VudHJ5LT50aW1lID0gdGltZTsKLQkJX19lbnRyeS0+ZGF0YTEgPSBkYXRhMTsKLQkJX19lbnRyeS0+ZGF0YTIgPSBkYXRhMjsKLQkJX19lbnRyeS0+bGluZSA9IGxpbmU7Ci0JCV9fZW50cnktPmJsaW5rMSA9IGJsaW5rMTsKLQkJX19lbnRyeS0+YmxpbmsyID0gYmxpbmsyOwotCQlfX2VudHJ5LT5pbGluazEgPSBpbGluazE7Ci0JCV9fZW50cnktPmlsaW5rMiA9IGlsaW5rMjsKLQkpLAotCVRQX3ByaW50aygiWyVwXSAjJTAyZCAlMDEwdSBkYXRhIDB4JTA4WCAweCUwOFggbGluZSAldSwgIgotCQkgICJibGluayAweCUwNVggMHglMDVYIGlsaW5rIDB4JTA1WCAweCUwNVgiLAotCQkgIF9fZW50cnktPnByaXYsIF9fZW50cnktPmRlc2MsIF9fZW50cnktPnRpbWUsIF9fZW50cnktPmRhdGExLAotCQkgIF9fZW50cnktPmRhdGEyLCBfX2VudHJ5LT5saW5lLCBfX2VudHJ5LT5ibGluazEsCi0JCSAgX19lbnRyeS0+YmxpbmsyLCBfX2VudHJ5LT5pbGluazEsIF9fZW50cnktPmlsaW5rMikKLSk7Ci0KLSNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFICovCi0KLSN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KLSN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZQotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmYzZjQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1lZXByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBFRVBST00gQkFORFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoZSBpd2xlZ2FjeV9lZXByb21fYmFuZCBkZWZpbml0aW9ucyBiZWxvdyBwcm92aWRlIHRoZSBtYXBwaW5nIGZyb20gdGhlCi0gKiBFRVBST00gY29udGVudHMgdG8gdGhlIHNwZWNpZmljIGNoYW5uZWwgbnVtYmVyIHN1cHBvcnRlZCBmb3IgZWFjaAotICogYmFuZC4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgaXdsX3ByaXYtPmVlcHJvbS5iYW5kXzNfY2hhbm5lbHNbNF0gZnJvbSB0aGUgYmFuZF8zCi0gKiBkZWZpbml0aW9uIGJlbG93IG1hcHMgdG8gcGh5c2ljYWwgY2hhbm5lbCA0MiBpbiB0aGUgNS4yR0h6IHNwZWN0cnVtLgotICogVGhlIHNwZWNpZmljIGdlb2dyYXBoeSBhbmQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoYXQgY2hhbm5lbAotICogaXMgY29udGFpbmVkIGluIHRoZSBlZXByb20gbWFwIGl0c2VsZi4KLSAqCi0gKiBEdXJpbmcgaW5pdCwgd2UgY29weSB0aGUgZWVwcm9tIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIG1hcAotICogaW5mb3JtYXRpb24gaW50byBwcml2LT5jaGFubmVsX2luZm9fMjQvNTIgYW5kIHByaXYtPmNoYW5uZWxfbWFwXzI0LzUyCi0gKgotICogY2hhbm5lbF9tYXBfMjQvNTIgcHJvdmlkZXMgdGhlIGluZGV4IGluIHRoZSBjaGFubmVsX2luZm8gYXJyYXkgZm9yIGEKLSAqIGdpdmVuIGNoYW5uZWwuICBXZSBoYXZlIHRvIGhhdmUgdHdvIHNlcGFyYXRlIG1hcHMgYXMgdGhlcmUgaXMgY2hhbm5lbAotICogb3ZlcmxhcCB3aXRoIHRoZSAyLjRHSHogYW5kIDUuMkdIeiBzcGVjdHJ1bSBhcyBzZWVuIGluIGJhbmRfMSBhbmQKLSAqIGJhbmRfMgotICoKLSAqIEEgdmFsdWUgb2YgMHhmZiBzdG9yZWQgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsCi0gKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBhdCBhbGwuCi0gKgotICogQSB2YWx1ZSBvZiAweGZlIGluIHRoZSBjaGFubmVsX21hcCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3QKLSAqIHZhbGlkIGZvciBUeCB3aXRoIHRoZSBjdXJyZW50IGhhcmR3YXJlLiAgVGhpcyBtZWFucyB0aGF0Ci0gKiB3aGlsZSB0aGUgc3lzdGVtIGNhbiB0dW5lIGFuZCByZWNlaXZlIG9uIGEgZ2l2ZW4gY2hhbm5lbCwgaXQgbWF5IG5vdAotICogYmUgYWJsZSB0byBhc3NvY2lhdGUgb3IgdHJhbnNtaXQgYW55IGZyYW1lcyBvbiB0aGF0Ci0gKiBjaGFubmVsLiAgVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGF0Ci0gKiBlbnRyeS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAyLjQgR0h6ICovCi1jb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF8xWzE0XSA9IHsKLQkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKLX07Ci0KLS8qIDUuMiBHSHogYmFuZHMgKi8KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF8yW10gPSB7CS8qIDQ5MTUtNTA4ME1IeiAqLwotCTE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LCA3LCA4LCAxMSwgMTIsIDE2Ci19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfM1tdID0gewkvKiA1MTcwLTUzMjBNSHogKi8KLQkzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Ci19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfNFtdID0gewkvKiA1NTAwLTU3MDBNSHogKi8KLQkxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAotfTsKLQotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzVbXSA9IHsJLyogNTcyNS01ODI1TUh6ICovCi0JMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotfTsKLQotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzZbXSA9IHsgICAgICAgLyogMi40IGh0NDAgY2hhbm5lbCAqLwotCTEsIDIsIDMsIDQsIDUsIDYsIDcKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF83W10gPSB7ICAgICAgIC8qIDUuMiBodDQwIGNoYW5uZWwgKi8KLQkzNiwgNDQsIDUyLCA2MCwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzIsIDE0OSwgMTU3Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBncCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0VFUFJPTV9HUCkgJiBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSzsKLQlpbnQgcmV0ID0gMDsKLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7Ci0Jc3dpdGNoIChncCkgewotCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLOgotCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJiYWQgRUVQUk9NIHNpZ25hdHVyZSwiCi0JCQkiRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwotCQlyZXQgPSAtRU5PRU5UOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotY29uc3QgdTgKLSppd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKLXsKLQlCVUdfT04ob2Zmc2V0ID49IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplKTsKLQlyZXR1cm4gJnByaXYtPmVlcHJvbVtvZmZzZXRdOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKTsKLQotdTE2IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KQotewotCWlmICghcHJpdi0+ZWVwcm9tKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKHUxNilwcml2LT5lZXByb21bb2Zmc2V0XSB8ICgodTE2KXByaXYtPmVlcHJvbVtvZmZzZXQgKyAxXSA8PCA4KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9lZXByb21faW5pdCAtIHJlYWQgRUVQUk9NIGNvbnRlbnRzCi0gKgotICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIHByaXYtPmVlcHJvbQotICoKLSAqIE5PVEU6ICBUaGlzIHJvdXRpbmUgdXNlcyB0aGUgbm9uLWRlYnVnIElPIGFjY2VzcyBmdW5jdGlvbnMuCi0gKi8KLWludCBpd2xfbGVnYWN5X2VlcHJvbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMTYgKmU7Ci0JdTMyIGdwID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRUVQUk9NX0dQKTsKLQlpbnQgc3o7Ci0JaW50IHJldDsKLQl1MTYgYWRkcjsKLQotCS8qIGFsbG9jYXRlIGVlcHJvbSAqLwotCXN6ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7Ci0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiTlZNIHNpemUgPSAlZFxuIiwgc3opOwotCXByaXYtPmVlcHJvbSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+ZWVwcm9tKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gYWxsb2NfZXJyOwotCX0KLQllID0gKF9fbGUxNiAqKXByaXYtPmVlcHJvbTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChwcml2KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUocHJpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5hY3F1aXJlX3NlbWFwaG9yZShwcml2KTsKLQlpZiAocmV0IDwgMCkgewotCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gYWNxdWlyZSBFRVBST00gc2VtYXBob3JlLlxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGVlcHJvbSBpcyBhbiBhcnJheSBvZiAxNmJpdCB2YWx1ZXMgKi8KLQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgc3o7IGFkZHIgKz0gc2l6ZW9mKHUxNikpIHsKLQkJdTMyIHI7Ci0KLQkJX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCBDU1JfRUVQUk9NX1JFRywKLQkJCSAgICAgQ1NSX0VFUFJPTV9SRUdfTVNLX0FERFIgJiAoYWRkciA8PCAxKSk7Ci0KLQkJcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9FRVBST01fUkVHLAotCQkJCQkgIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAotCQkJCQkgIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAotCQkJCQkgIElXTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJSVdMX0VSUihwcml2LCAiVGltZSBvdXQgcmVhZGluZyBFRVBST01bJWRdXG4iLAotCQkJCQkJCWFkZHIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXIgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIENTUl9FRVBST01fUkVHKTsKLQkJZVthZGRyIC8gMl0gPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKLQl9Ci0KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJOVk0gVHlwZTogJXMsIHZlcnNpb246IDB4JXhcbiIsCi0JCSAgICAgICAiRUVQUk9NIiwKLQkJICAgICAgIGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pKTsKLQotCXJldCA9IDA7Ci1kb25lOgotCXByaXYtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVsZWFzZV9zZW1hcGhvcmUocHJpdik7Ci0KLWVycjoKLQlpZiAocmV0KQotCQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotCS8qIFJlc2V0IGNoaXAgdG8gc2F2ZSBwb3dlciB1bnRpbCB3ZSBsb2FkIHVDb2RlIGR1cmluZyAidXAiLiAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3AocHJpdik7Ci1hbGxvY19lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9lZXByb21faW5pdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9lZXByb21fZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Ja2ZyZWUocHJpdi0+ZWVwcm9tKTsKLQlwcml2LT5lZXByb20gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKTsKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9pbml0X2JhbmRfcmVmZXJlbmNlKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCWludCBlZXBfYmFuZCwgaW50ICplZXByb21fY2hfY291bnQsCi0JCQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCi0JCQljb25zdCB1OCAqKmVlcHJvbV9jaF9pbmRleCkKLXsKLQl1MzIgb2Zmc2V0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+Ci0JCQllZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbZWVwX2JhbmQgLSAxXTsKLQlzd2l0Y2ggKGVlcF9iYW5kKSB7Ci0JY2FzZSAxOgkJLyogMi40R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMSk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgkJLyogNC45R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMik7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJLyogNS4yR0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMyk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfMzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgkJLyogNS41R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNCk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJLyogNS43R0h6IGJhbmQgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNSk7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgkJLyogMi40R0h6IGh0NDAgY2hhbm5lbHMgKi8KLQkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNik7Ci0JCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOwotCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsZWdhY3lfZWVwcm9tX2JhbmRfNjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgkJLyogNSBHSHogaHQ0MCBjaGFubmVscyAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF83KTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF83OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci19Ci0KLSNkZWZpbmUgQ0hFQ0tfQU5EX1BSSU5UKHgpICgoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMXyMjeCkgXAotCQkJICAgID8gIyB4ICIgIiA6ICIiKQotLyoqCi0gKiBpd2xfbGVnYWN5X21vZF9odDQwX2NoYW5faW5mbyAtIENvcHkgaHQ0MCBjaGFubmVsIGluZm8gaW50byBkcml2ZXIncyBwcml2LgotICoKLSAqIERvZXMgbm90IHNldCB1cCBhIGNvbW1hbmQsIG9yIHRvdWNoIGhhcmR3YXJlLgotICovCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTE2IGNoYW5uZWwsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICplZXByb21fY2gsCi0JCQkgICAgICB1OCBjbGVhcl9odDQwX2V4dGVuc2lvbl9jaGFubmVsKQotewotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCi0JY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqKQotCQkJaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGJhbmQsIGNoYW5uZWwpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCi0JCXJldHVybiAtMTsKLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkhUNDAgQ2guICVkIFslc0dIel0gJXMlcyVzJXMlcygweCUwMnggJWRkQm0pOiIKLQkJCSIgQWQtSG9jICVzc3VwcG9ydGVkXG4iLAotCQkJY2hfaW5mby0+Y2hhbm5lbCwKLQkJCWl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykgPwotCQkJIjUuMiIgOiAiMi40IiwKLQkJCUNIRUNLX0FORF9QUklOVChJQlNTKSwKLQkJCUNIRUNLX0FORF9QUklOVChBQ1RJVkUpLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKFJBREFSKSwKLQkJCUNIRUNLX0FORF9QUklOVChXSURFKSwKLQkJCUNIRUNLX0FORF9QUklOVChERlMpLAotCQkJZWVwcm9tX2NoLT5mbGFncywKLQkJCWVlcHJvbV9jaC0+bWF4X3Bvd2VyX2F2ZywKLQkJCSgoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpCi0JCQkgJiYgIShlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpKSA/Ci0JCQkiIiA6ICJub3QgIik7Ci0KLQljaF9pbmZvLT5odDQwX2VlcHJvbSA9ICplZXByb21fY2g7Ci0JY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnID0gZWVwcm9tX2NoLT5tYXhfcG93ZXJfYXZnOwotCWNoX2luZm8tPmh0NDBfZmxhZ3MgPSBlZXByb21fY2gtPmZsYWdzOwotCWlmIChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfVkFMSUQpCi0JCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJj0KLQkJCQkJfmNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBDSEVDS19BTkRfUFJJTlRfSSh4KSAoKGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFncyAmIEVFUFJPTV9DSEFOTkVMXyMjeCkgXAotCQkJICAgID8gIyB4ICIgIiA6ICIiKQotCi0vKioKLSAqIGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcCAtIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciBhbGwgcG9zc2libGUgY2hhbm5lbHMKLSAqLwotaW50IGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IGVlcHJvbV9jaF9jb3VudCA9IDA7Ci0JY29uc3QgdTggKmVlcHJvbV9jaF9pbmRleCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqZWVwcm9tX2NoX2luZm8gPSBOVUxMOwotCWludCBiYW5kLCBjaDsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQotCWlmIChwcml2LT5jaGFubmVsX2NvdW50KSB7Ci0JCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkNoYW5uZWwgbWFwIGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiSW5pdGlhbGl6aW5nIHJlZ3VsYXRvcnkgaW5mbyBmcm9tIEVFUFJPTVxuIik7Ci0KLQlwcml2LT5jaGFubmVsX2NvdW50ID0KLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8xKSArCi0JICAgIEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMikgKwotCSAgICBBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzMpICsKLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF80KSArCi0JICAgIEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfNSk7Ci0KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJQYXJzaW5nIGRhdGEgZm9yICVkIGNoYW5uZWxzLlxuIiwKLQkJCXByaXYtPmNoYW5uZWxfY291bnQpOwotCi0JcHJpdi0+Y2hhbm5lbF9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9jaGFubmVsX2luZm8pICoKLQkJCQkgICAgIHByaXYtPmNoYW5uZWxfY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+Y2hhbm5lbF9pbmZvKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjaGFubmVsX2luZm9cbiIpOwotCQlwcml2LT5jaGFubmVsX2NvdW50ID0gMDsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JY2hfaW5mbyA9IHByaXYtPmNoYW5uZWxfaW5mbzsKLQotCS8qIExvb3AgdGhyb3VnaCB0aGUgNSBFRVBST00gYmFuZHMgYWRkaW5nIHRoZW0gaW4gb3JkZXIgdG8gdGhlCi0JICogY2hhbm5lbCBtYXAgd2UgbWFpbnRhaW4gKHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGFuCi0JICogd2hhdCBqdXN0IGluIHRoZSBFRVBST00pICovCi0JZm9yIChiYW5kID0gMTsgYmFuZCA8PSA1OyBiYW5kKyspIHsKLQotCQlpd2xfbGVnYWN5X2luaXRfYmFuZF9yZWZlcmVuY2UocHJpdiwgYmFuZCwgJmVlcHJvbV9jaF9jb3VudCwKLQkJCQkJJmVlcHJvbV9jaF9pbmZvLCAmZWVwcm9tX2NoX2luZGV4KTsKLQotCQkvKiBMb29wIHRocm91Z2ggZWFjaCBiYW5kIGFkZGluZyBlYWNoIG9mIHRoZSBjaGFubmVscyAqLwotCQlmb3IgKGNoID0gMDsgY2ggPCBlZXByb21fY2hfY291bnQ7IGNoKyspIHsKLQkJCWNoX2luZm8tPmNoYW5uZWwgPSBlZXByb21fY2hfaW5kZXhbY2hdOwotCQkJY2hfaW5mby0+YmFuZCA9IChiYW5kID09IDEpID8gSUVFRTgwMjExX0JBTkRfMkdIWiA6Ci0JCQkgICAgSUVFRTgwMjExX0JBTkRfNUdIWjsKLQotCQkJLyogcGVybWFuZW50bHkgc3RvcmUgRUVQUk9NJ3MgY2hhbm5lbCByZWd1bGF0b3J5IGZsYWdzCi0JCQkgKiAgIGFuZCBtYXggcG93ZXIgaW4gY2hhbm5lbCBpbmZvIGRhdGFiYXNlLiAqLwotCQkJY2hfaW5mby0+ZWVwcm9tID0gZWVwcm9tX2NoX2luZm9bY2hdOwotCi0JCQkvKiBDb3B5IHRoZSBydW4tdGltZSBmbGFncyBzbyB0aGV5IGFyZSB0aGVyZSBldmVuIG9uCi0JCQkgKiBpbnZhbGlkIGNoYW5uZWxzICovCi0JCQljaF9pbmZvLT5mbGFncyA9IGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFnczsKLQkJCS8qIEZpcnN0IHdyaXRlIHRoYXQgaHQ0MCBpcyBub3QgZW5hYmxlZCwgYW5kIHRoZW4gZW5hYmxlCi0JCQkgKiBvbmUgYnkgb25lICovCi0JCQljaF9pbmZvLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsID0KLQkJCQkJSUVFRTgwMjExX0NIQU5fTk9fSFQ0MDsKLQotCQkJaWYgKCEoaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSkgewotCQkJCUlXTF9ERUJVR19FRVBST00ocHJpdiwKLQkJCQkJICAgICAgICJDaC4gJWQgRmxhZ3MgJXggWyVzR0h6XSAtICIKLQkJCQkJICAgICAgICJObyB0cmFmZmljXG4iLAotCQkJCQkgICAgICAgY2hfaW5mby0+Y2hhbm5lbCwKLQkJCQkJICAgICAgIGNoX2luZm8tPmZsYWdzLAotCQkJCQkgICAgICAgaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/Ci0JCQkJCSAgICAgICAiNS4yIiA6ICIyLjQiKTsKLQkJCQljaF9pbmZvKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIEluaXRpYWxpemUgcmVndWxhdG9yeS1iYXNlZCBydW4tdGltZSBkYXRhICovCi0JCQljaF9pbmZvLT5tYXhfcG93ZXJfYXZnID0gY2hfaW5mby0+Y3Vycl90eHBvdyA9Ci0JCQkgICAgZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7Ci0JCQljaF9pbmZvLT5zY2FuX3Bvd2VyID0gZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7Ci0JCQljaF9pbmZvLT5taW5fcG93ZXIgPSAwOwotCi0JCQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJDaC4gJWQgWyVzR0h6XSAiCi0JCQkJICAgICAgICIlcyVzJXMlcyVzJXMoMHglMDJ4ICVkZEJtKToiCi0JCQkJICAgICAgICIgQWQtSG9jICVzc3VwcG9ydGVkXG4iLAotCQkJCSAgICAgICBjaF9pbmZvLT5jaGFubmVsLAotCQkJCSAgICAgICBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pID8KLQkJCQkgICAgICAgIjUuMiIgOiAiMi40IiwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koVkFMSUQpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShJQlNTKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koQUNUSVZFKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koUkFEQVIpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShXSURFKSwKLQkJCQkgICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koREZTKSwKLQkJCQkgICAgICAgZWVwcm9tX2NoX2luZm9bY2hdLmZsYWdzLAotCQkJCSAgICAgICBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZywKLQkJCQkgICAgICAgKChlZXByb21fY2hfaW5mb1tjaF0uCi0JCQkJCSBmbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpCi0JCQkJCSYmICEoZWVwcm9tX2NoX2luZm9bY2hdLgotCQkJCQkgICAgIGZsYWdzICYgRUVQUk9NX0NIQU5ORUxfUkFEQVIpKQotCQkJCSAgICAgICA/ICIiIDogIm5vdCAiKTsKLQotCQkJY2hfaW5mbysrOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgZG8gaGF2ZSBIVDQwIGNoYW5uZWxzICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQotCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAgJiYKLQkgICAgcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzZdID09Ci0JICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUd28gYWRkaXRpb25hbCBFRVBST00gYmFuZHMgZm9yIDIuNCBhbmQgNSBHSHogSFQ0MCBjaGFubmVscyAqLwotCWZvciAoYmFuZCA9IDY7IGJhbmQgPD0gNzsgYmFuZCsrKSB7Ci0JCWVudW0gaWVlZTgwMjExX2JhbmQgaWVlZWJhbmQ7Ci0KLQkJaXdsX2xlZ2FjeV9pbml0X2JhbmRfcmVmZXJlbmNlKHByaXYsIGJhbmQsICZlZXByb21fY2hfY291bnQsCi0JCQkJCSZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pbmRleCk7Ci0KLQkJLyogRUVQUk9NIGJhbmQgNiBpcyAyLjQsIGJhbmQgNyBpcyA1IEdIeiAqLwotCQlpZWVlYmFuZCA9Ci0JCQkoYmFuZCA9PSA2KSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOiBJRUVFODAyMTFfQkFORF81R0haOwotCi0JCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCi0JCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgewotCQkJLyogU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGxvd2VyIGhhbGYgKi8KLQkJCWl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvKHByaXYsIGllZWViYW5kLAotCQkJCQkJZWVwcm9tX2NoX2luZGV4W2NoXSwKLQkJCQkJCSZlZXByb21fY2hfaW5mb1tjaF0sCi0JCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7Ci0KLQkJCS8qIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciB1cHBlciBoYWxmICovCi0JCQlpd2xfbGVnYWN5X21vZF9odDQwX2NoYW5faW5mbyhwcml2LCBpZWVlYmFuZCwKLQkJCQkJCWVlcHJvbV9jaF9pbmRleFtjaF0gKyA0LAotCQkJCQkJJmVlcHJvbV9jaF9pbmZvW2NoXSwKLQkJCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwKTsKLQotLyoKLSAqIGl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcCAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlrZnJlZShwcml2LT5jaGFubmVsX2luZm8pOwotCXByaXYtPmNoYW5uZWxfY291bnQgPSAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXApOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyAtIEZpbmQgZHJpdmVyJ3MgcHJpdmF0ZSBjaGFubmVsIGluZm8KLSAqCi0gKiBCYXNlZCBvbiBiYW5kIGFuZCBjaGFubmVsIG51bWJlci4KLSAqLwotY29uc3Qgc3RydWN0Ci1pd2xfY2hhbm5lbF9pbmZvICppd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8oY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIHUxNiBjaGFubmVsKQotewotCWludCBpOwotCi0Jc3dpdGNoIChiYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlmb3IgKGkgPSAxNDsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7IGkrKykgewotCQkJaWYgKHByaXYtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsID09IGNoYW5uZWwpCi0JCQkJcmV0dXJuICZwcml2LT5jaGFubmVsX2luZm9baV07Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlpZiAoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpCi0JCQlyZXR1cm4gJnByaXYtPmNoYW5uZWxfaW5mb1tjaGFubmVsIC0gMV07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTljODEwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1lZXByb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9lZXByb21faF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9lZXByb21faF9fCi0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotc3RydWN0IGl3bF9wcml2OwotCi0vKgotICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKLSAqCi0gKiBEcml2ZXIgaW5pdGlhdGVzIEVFUFJPTSByZWFkIGJ5IHdyaXRpbmcgYnl0ZSBhZGRyZXNzIDw8IDEgdG8gQ1NSX0VFUFJPTV9SRUcuCi0gKiBEcml2ZXIgdGhlbiBwb2xscyBDU1JfRUVQUk9NX1JFRyBmb3IgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sgKDB4MSkuCi0gKiBXaGVuIHBvbGxpbmcsIHdhaXQgMTAgdVNlYyBiZXR3ZWVuIHBvbGxpbmcgbG9vcHMsIHVwIHRvIGEgbWF4aW11bSA1MDAwIHVTZWMuCi0gKiBEcml2ZXIgcmVhZHMgMTYtYml0IHZhbHVlIGZyb20gYml0cyAzMS0xNiBvZiBDU1JfRUVQUk9NX1JFRy4KLSAqLwotI2RlZmluZSBJV0xfRUVQUk9NX0FDQ0VTU19USU1FT1VUCTUwMDAgLyogdVNlYyAqLwotCi0jZGVmaW5lIElXTF9FRVBST01fU0VNX1RJTUVPVVQJCTEwICAgLyogbWljcm9zZWNvbmRzICovCi0jZGVmaW5lIElXTF9FRVBST01fU0VNX1JFVFJZX0xJTUlUCTEwMDAgLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KLQotCi0vKgotICogUmVndWxhdG9yeSBjaGFubmVsIHVzYWdlIGZsYWdzIGluIEVFUFJPTSBzdHJ1Y3QgaXdsNDk2NV9lZXByb21fY2hhbm5lbC5mbGFncy4KLSAqCi0gKiBJQlNTIGFuZC9vciBBUCBvcGVyYXRpb24gaXMgYWxsb3dlZCAqb25seSogb24gdGhvc2UgY2hhbm5lbHMgd2l0aAotICogKFZBTElEICYmIElCU1MgJiYgQUNUSVZFICYmICFSQURBUikuICBUaGlzIHJlc3RyaWN0aW9uIGlzIGluIHBsYWNlIGJlY2F1c2UKLSAqIFJBREFSIGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSA0OTY1IGRyaXZlciwgYnV0IGlzIGEKLSAqIHJlcXVpcmVtZW50IGZvciBlc3RhYmxpc2hpbmcgYSBuZXcgbmV0d29yayBmb3IgbGVnYWwgb3BlcmF0aW9uIG9uIGNoYW5uZWxzCi0gKiByZXF1aXJpbmcgUkFEQVIgZGV0ZWN0aW9uIG9yIHJlc3RyaWN0aW5nIEFDVElWRSBzY2FubmluZy4KLSAqCi0gKiBOT1RFOiAgIldJREUiIGZsYWcgZG9lcyBub3QgaW5kaWNhdGUgYW55dGhpbmcgYWJvdXQgIkhUNDAiIDQwIE1IeiBjaGFubmVscy4KLSAqICAgICAgICBJdCBvbmx5IGluZGljYXRlcyB0aGF0IDIwIE1IeiBjaGFubmVsIHVzZSBpcyBzdXBwb3J0ZWQ7IEhUNDAgY2hhbm5lbAotICogICAgICAgIHVzYWdlIGlzIGluZGljYXRlZCBieSBhIHNlcGFyYXRlIHNldCBvZiByZWd1bGF0b3J5IGZsYWdzIGZvciBlYWNoCi0gKiAgICAgICAgSFQ0MCBjaGFubmVsIHBhaXIuCi0gKgotICogTk9URTogIFVzaW5nIGEgY2hhbm5lbCBpbmFwcHJvcHJpYXRlbHkgd2lsbCByZXN1bHQgaW4gYSB1Q29kZSBlcnJvciEKLSAqLwotI2RlZmluZSBJV0xfTlVNX1RYX0NBTElCX0dST1VQUyA1Ci1lbnVtIHsKLQlFRVBST01fQ0hBTk5FTF9WQUxJRCA9ICgxIDw8IDApLAkvKiB1c2FibGUgZm9yIHRoaXMgU0tVL2dlbyAqLwotCUVFUFJPTV9DSEFOTkVMX0lCU1MgPSAoMSA8PCAxKSwJCS8qIHVzYWJsZSBhcyBhbiBJQlNTIGNoYW5uZWwgKi8KLQkvKiBCaXQgMiBSZXNlcnZlZCAqLwotCUVFUFJPTV9DSEFOTkVMX0FDVElWRSA9ICgxIDw8IDMpLAkvKiBhY3RpdmUgc2Nhbm5pbmcgYWxsb3dlZCAqLwotCUVFUFJPTV9DSEFOTkVMX1JBREFSID0gKDEgPDwgNCksCS8qIHJhZGFyIGRldGVjdGlvbiByZXF1aXJlZCAqLwotCUVFUFJPTV9DSEFOTkVMX1dJREUgPSAoMSA8PCA1KSwJCS8qIDIwIE1IeiBjaGFubmVsIG9rYXkgKi8KLQkvKiBCaXQgNiBSZXNlcnZlZCAod2FzIE5hcnJvdyBDaGFubmVsKSAqLwotCUVFUFJPTV9DSEFOTkVMX0RGUyA9ICgxIDw8IDcpLAkvKiBkeW5hbWljIGZyZXEgc2VsZWN0aW9uIGNhbmRpZGF0ZSAqLwotfTsKLQotLyogU0tVIENhcGFiaWxpdGllcyAqLwotLyogMzk0NSBvbmx5ICovCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX1NXX1JGX0tJTExfRU5BQkxFICAgICAgICAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIEVFUFJPTV9TS1VfQ0FQX0hXX1JGX0tJTExfRU5BQkxFICAgICAgICAgICAgICAgICgxIDw8IDEpCi0KLS8qICpyZWd1bGF0b3J5KiBjaGFubmVsIGRhdGEgZm9ybWF0IGluIGVlcHJvbSwgb25lIGZvciBlYWNoIGNoYW5uZWwuCi0gKiBUaGVyZSBhcmUgc2VwYXJhdGUgZW50cmllcyBmb3IgSFQ0MCAoNDAgTUh6KSB2cy4gbm9ybWFsICgyMCBNSHopIGNoYW5uZWxzLiAqLwotc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCB7Ci0JdTggZmxhZ3M7CQkvKiBFRVBST01fQ0hBTk5FTF8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLwotCXM4IG1heF9wb3dlcl9hdmc7CS8qIG1heCBwb3dlciAoZEJtKSBvbiB0aGlzIGNobmwsIGxpbWl0IDMxICovCi19IF9fcGFja2VkOwotCi0vKiAzOTQ1IFNwZWNpZmljICovCi0jZGVmaW5lIEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQotCi0vKiA0OTY1IGhhcyB0d28gcmFkaW8gdHJhbnNtaXR0ZXJzIChhbmQgMyByYWRpbyByZWNlaXZlcnMpICovCi0jZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlMgICAgICAoMikKLQotLyogNDk2NSBoYXMgcm9vbSBmb3IgdXAgdG8gOCBzZXRzIG9mIHR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YSAqLwotI2RlZmluZSBFRVBST01fVFhfUE9XRVJfQkFORFMgICAgICAgICAgKDgpCi0KLS8qIDQ5NjUgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlcyB0eHBvd2VyIGdhaW4gc2V0dGluZ3MgZm9yCi0gKiBlYWNoIG9mIDMgdGFyZ2V0IG91dHB1dCBsZXZlbHMgKi8KLSNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UUyAgICgzKQotCi0vKiA0OTY1IFNwZWNpZmljICovCi0vKiA0OTY1IGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGggdHhwb3dlciBjYWxpYnJhdGlvbiB2ZXJzaW9uIDwgNSAqLwotI2RlZmluZSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OICAgICg1KQotI2RlZmluZSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTgkoMHgyZikKLSNkZWZpbmUgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQgICAgICAgKDIqMHhCNikgLyogMiBieXRlcyAqLwotI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCAgICAgICAoMioweEU4KSAvKiA0OCAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgKDIqMHg0RikgLyogMiBieXRlcyAqLwotI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9QQkEgICAgICAgICAgICAgICAgICAoMioweDU2KzEpIC8qIDkgYnl0ZXMgKi8KLQotLyogMi40IEdIeiAqLwotZXh0ZXJuIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzFbMTRdOwotCi0vKgotICogZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciBvbmUgdHhwb3dlciBsZXZlbCwgb24gb25lIGNoYW5uZWwsCi0gKiBtZWFzdXJlZCBvbiBvbmUgb2YgdGhlIDIgdHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlciBhbmQgYXNzb2NpYXRlZAotICogYW50ZW5uYSkuICBFRVBST00gY29udGFpbnM6Ci0gKgotICogMSkgIFRlbXBlcmF0dXJlIChkZWdyZWVzIENlbHNpdXMpIG9mIGRldmljZSB3aGVuIG1lYXN1cmVtZW50IHdhcyBtYWRlLgotICoKLSAqIDIpICBHYWluIHRhYmxlIGluZGV4IHVzZWQgdG8gYWNoaWV2ZSB0aGUgdGFyZ2V0IG1lYXN1cmVtZW50IHBvd2VyLgotICogICAgIFRoaXMgcmVmZXJzIHRvIHRoZSAid2VsbC1rbm93biIgZ2FpbiB0YWJsZXMgKHNlZSBpd2wtNDk2NS1ody5oKS4KLSAqCi0gKiAzKSAgQWN0dWFsIG1lYXN1cmVkIG91dHB1dCBwb3dlciwgaW4gaGFsZi1kQm0gKCIzNCIgPSAxNyBkQm0pLgotICoKLSAqIDQpICBSRiBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgbGV2ZWwgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKS4KLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfbWVhc3VyZSB7Ci0JdTggdGVtcGVyYXR1cmU7CQkvKiBEZXZpY2UgdGVtcGVyYXR1cmUgKENlbHNpdXMpICovCi0JdTggZ2Fpbl9pZHg7CQkvKiBJbmRleCBpbnRvIGdhaW4gdGFibGUgKi8KLQl1OCBhY3R1YWxfcG93OwkJLyogTWVhc3VyZWQgUkYgb3V0cHV0IHBvd2VyLCBoYWxmLWRCbSAqLwotCXM4IHBhX2RldDsJCS8qIFBvd2VyIGFtcCBkZXRlY3RvciBsZXZlbCAobm90IHVzZWQpICovCi19IF9fcGFja2VkOwotCi0KLS8qCi0gKiBtZWFzdXJlbWVudCBzZXQgZm9yIG9uZSBjaGFubmVsLiAgRUVQUk9NIGNvbnRhaW5zOgotICoKLSAqIDEpICBDaGFubmVsIG51bWJlciBtZWFzdXJlZAotICoKLSAqIDIpICBNZWFzdXJlbWVudHMgZm9yIGVhY2ggb2YgMyBwb3dlciBsZXZlbHMgZm9yIGVhY2ggb2YgMiByYWRpbyB0cmFuc21pdHRlcnMKLSAqICAgICAoYS5rLmEuICJ0eCBjaGFpbnMiKSAoNiBtZWFzdXJlbWVudHMgYWx0b2dldGhlcikKLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyB7Ci0JdTggY2hfbnVtOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX21lYXN1cmUKLQkJbWVhc3VyZW1lbnRzW0VFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlNdCi0JCQlbRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UU107Ci19IF9fcGFja2VkOwotCi0vKgotICogdHhwb3dlciBzdWJiYW5kIGluZm8uCi0gKgotICogRm9yIGVhY2ggZnJlcXVlbmN5IHN1YmJhbmQsIEVFUFJPTSBjb250YWlucyB0aGUgZm9sbG93aW5nOgotICoKLSAqIDEpICBGaXJzdCBhbmQgbGFzdCBjaGFubmVscyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHN1YmJhbmQuICAiMCIgdmFsdWVzCi0gKiAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNhbXBsZSBzZXQgaXMgbm90IGJlaW5nIHVzZWQuCi0gKgotICogMikgIFNhbXBsZSBtZWFzdXJlbWVudCBzZXRzIGZvciAyIGNoYW5uZWxzIGNsb3NlIHRvIHRoZSByYW5nZSBlbmRwb2ludHMuCi0gKi8KLXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbyB7Ci0JdTggY2hfZnJvbTsJLyogY2hhbm5lbCBudW1iZXIgb2YgbG93ZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLwotCXU4IGNoX3RvOwkvKiBjaGFubmVsIG51bWJlciBvZiBoaWdoZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gxOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gyOwotfSBfX3BhY2tlZDsKLQotCi0vKgotICogdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvLiAgRUVQUk9NIGNvbnRhaW5zOgotICoKLSAqIDEpICBGYWN0b3J5LW1lYXN1cmVkIHNhdHVyYXRpb24gcG93ZXIgbGV2ZWxzIChtYXhpbXVtIGxldmVscyBhdCB3aGljaAotICogICAgIHR4IHBvd2VyIGFtcGxpZmllciBjYW4gb3V0cHV0IGEgc2lnbmFsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbikuCi0gKiAgICAgVGhlcmUgaXMgb25lIGxldmVsIGZvciAyLjQgR0h6IGJhbmQgYW5kIG9uZSBmb3IgNSBHSHogYmFuZC4gIFRoZXNlCi0gKiAgICAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjaGFubmVscyB3aXRoaW4gZWFjaCBvZiB0aGUgYmFuZHMuCi0gKgotICogMikgIEZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKLSAqICAgICBjb25zdGFudCAoaS5lLiBzYW1lIHZhbHVlIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzL2JhbmRzKSB3aGlsZSB0aGUKLSAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50cyBhcmUgYmVpbmcgbWFkZS4KLSAqCi0gKiAzKSAgVXAgdG8gOCBzZXRzIG9mIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMuCi0gKiAgICAgVGhlc2UgYXJlIGZvciBkaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcywgc2luY2UgdHhwb3dlciBnYWluCi0gKiAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbmFsb2cgcmFkaW8gY2lyY3VpdHJ5IHZhcnkgd2l0aCBmcmVxdWVuY3kuCi0gKgotICogICAgIE5vdCBhbGwgc2V0cyBuZWVkIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGE7Ci0gKiAgICAgc3RydWN0IGl3bF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIGNvbnRhaW5zIHJhbmdlIG9mIGNoYW5uZWxzCi0gKiAgICAgKDAgaWYgdW51c2VkKSBmb3IgZWFjaCBzZXQgb2YgZGF0YS4KLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaW5mbyB7Ci0JdTggc2F0dXJhdGlvbl9wb3dlcjI0OwkvKiBoYWxmLWRCbSAoZS5nLiAiMzQiID0gMTcgZEJtKSAqLwotCXU4IHNhdHVyYXRpb25fcG93ZXI1MjsJLyogaGFsZi1kQm0gKi8KLQlfX2xlMTYgdm9sdGFnZTsJCS8qIHNpZ25lZCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbwotCQliYW5kX2luZm9bRUVQUk9NX1RYX1BPV0VSX0JBTkRTXTsKLX0gX19wYWNrZWQ7Ci0KLQotLyogR2VuZXJhbCAqLwotI2RlZmluZSBFRVBST01fREVWSUNFX0lEICAgICAgICAgICAgICAgICAgICAoMioweDA4KQkvKiAyIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICgyKjB4MTUpCS8qIDYgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9CT0FSRF9SRVZJU0lPTiAgICAgICAgICAgICAgICgyKjB4MzUpCS8qIDIgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9CT0FSRF9QQkFfTlVNQkVSICAgICAgICAgICAgICgyKjB4M0IrMSkJLyogOSAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NCkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVAgICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NSkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX09FTV9NT0RFICAgICAgICAgICAgICAgICAgICAgKDIqMHg0NikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1dPV0xBTl9NT0RFICAgICAgICAgICAgICAgICAgKDIqMHg0NykJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JBRElPX0NPTkZJRyAgICAgICAgICAgICAgICAgKDIqMHg0OCkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX05VTV9NQUNfQUREUkVTUyAgICAgICAgICAgICAgKDIqMHg0QykJLyogMiAgYnl0ZXMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYXNrcyBhcmUgdG8gYmUgYXBwbGllZCBvbiBFRVBST01fUkFESU9fQ09ORklHICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0soeCkgICAoeCAmIDB4MykgICAgICAgICAvKiBiaXRzIDAtMSAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0soeCkgICAoKHggPj4gMikgICYgMHgzKSAvKiBiaXRzIDItMyAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfREFTSF9NU0soeCkgICAoKHggPj4gNCkgICYgMHgzKSAvKiBiaXRzIDQtNSAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfUE5VTV9NU0soeCkgICAoKHggPj4gNikgICYgMHgzKSAvKiBiaXRzIDYtNyAgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfVFhfQU5UX01TSyh4KSAoKHggPj4gOCkgICYgMHhGKSAvKiBiaXRzIDgtMTEgICovCi0jZGVmaW5lIEVFUFJPTV9SRl9DRkdfUlhfQU5UX01TSyh4KSAoKHggPj4gMTIpICYgMHhGKSAvKiBiaXRzIDEyLTE1ICovCi0KLSNkZWZpbmUgRUVQUk9NXzM5NDVfUkZfQ0ZHX1RZUEVfTUFYICAweDAKLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkZfQ0ZHX1RZUEVfTUFYICAweDEKLQotLyoKLSAqIFBlci1jaGFubmVsIHJlZ3VsYXRvcnkgZGF0YS4KLSAqCi0gKiBFYWNoIGNoYW5uZWwgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZCBieSBpd2wgaGFzIGEgZml4ZWQgbG9jYXRpb24KLSAqIGluIEVFUFJPTSBjb250YWluaW5nIEVFUFJPTV9DSEFOTkVMXyogdXNhZ2UgZmxhZ3MgKExTQikgYW5kIG1heCByZWd1bGF0b3J5Ci0gKiB0eHBvd2VyIChNU0IpLgotICoKLSAqIEVudHJpZXMgaW1tZWRpYXRlbHkgYmVsb3cgYXJlIGZvciAyMCBNSHogY2hhbm5lbCB3aWR0aC4gIEhUNDAgKDQwIE1IeikKLSAqIGNoYW5uZWxzIChvbmx5IGZvciA0OTY1LCBub3Qgc3VwcG9ydGVkIGJ5IDM5NDUpIGFwcGVhciBsYXRlciBpbiB0aGUgRUVQUk9NLgotICoKLSAqIDIuNCBHSHogY2hhbm5lbHMgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0Ci0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfU0tVX0lEICAgICAgICAgICAgKDIqMHg2MCkgICAgLyogNCAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xICAgICAgICAgICAgKDIqMHg2MikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTICAgKDIqMHg2MykJLyogMjggYnl0ZXMgKi8KLQotLyoKLSAqIDQuOSBHSHogY2hhbm5lbHMgMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsCi0gKiA1LjAgR0h6IGNoYW5uZWxzIDcsIDgsIDExLCAxMiwgMTYKLSAqICg0OTE1LTUwODBNSHopIChub25lIG9mIHRoZXNlIGlzIGV2ZXIgc3VwcG9ydGVkKQotICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMiAgICAgICAgICAgICgyKjB4NzEpCS8qIDIgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUyAgICgyKjB4NzIpCS8qIDI2IGJ5dGVzICovCi0KLS8qCi0gKiA1LjIgR0h6IGNoYW5uZWxzIDM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQKLSAqICg1MTcwLTUzMjBNSHopCi0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zICAgICAgICAgICAgKDIqMHg3RikJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTICAgKDIqMHg4MCkJLyogMjQgYnl0ZXMgKi8KLQotLyoKLSAqIDUuNSBHSHogY2hhbm5lbHMgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKLSAqICg1NTAwLTU3MDBNSHopCi0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80ICAgICAgICAgICAgKDIqMHg4QykJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTICAgKDIqMHg4RCkJLyogMjIgYnl0ZXMgKi8KLQotLyoKLSAqIDUuNyBHSHogY2hhbm5lbHMgMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotICogKDU3MjUtNTgyNU1IeikKLSAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzUgICAgICAgICAgICAoMioweDk4KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzVfQ0hBTk5FTFMgICAoMioweDk5KQkvKiAxMiBieXRlcyAqLwotCi0vKgotICogMi40IEdIeiBIVDQwIGNoYW5uZWxzIDEgKDUpLCAyICg2KSwgMyAoNyksIDQgKDgpLCA1ICg5KSwgNiAoMTApLCA3ICgxMSkKLSAqCi0gKiBUaGUgY2hhbm5lbCBsaXN0ZWQgaXMgdGhlIGNlbnRlciBvZiB0aGUgbG93ZXIgMjAgTUh6IGhhbGYgb2YgdGhlIGNoYW5uZWwuCi0gKiBUaGUgb3ZlcmFsbCBjZW50ZXIgZnJlcXVlbmN5IGlzIGFjdHVhbGx5IDIgY2hhbm5lbHMgKDEwIE1IeikgYWJvdmUgdGhhdCwKLSAqIGFuZCB0aGUgdXBwZXIgaGFsZiBvZiBlYWNoIEhUNDAgY2hhbm5lbCBpcyBjZW50ZXJlZCA0IGNoYW5uZWxzICgyMCBNSHopIGF3YXkKLSAqIGZyb20gdGhlIGxvd2VyIGhhbGY7IGUuZy4gdGhlIHVwcGVyIGhhbGYgb2YgSFQ0MCBjaGFubmVsIDEgaXMgY2hhbm5lbCA1LAotICogYW5kIHRoZSBvdmVyYWxsIEhUNDAgY2hhbm5lbCB3aWR0aCBjZW50ZXJzIG9uIGNoYW5uZWwgMy4KLSAqCi0gKiBOT1RFOiAgVGhlIFJYT04gY29tbWFuZCB1c2VzIDIwIE1IeiBjaGFubmVsIG51bWJlcnMgdG8gc3BlY2lmeSB0aGUKLSAqICAgICAgICBjb250cm9sIGNoYW5uZWwgdG8gd2hpY2ggdG8gdHVuZS4gIFJYT04gYWxzbyBzcGVjaWZpZXMgd2hldGhlciB0aGUKLSAqICAgICAgICBjb250cm9sIGNoYW5uZWwgaXMgdGhlIHVwcGVyIG9yIGxvd2VyIGhhbGYgb2YgYSBIVDQwIGNoYW5uZWwuCi0gKgotICogTk9URTogIDQ5NjUgZG9lcyBub3Qgc3VwcG9ydCBIVDQwIGNoYW5uZWxzIG9uIDIuNCBHSHouCi0gKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzI0X0hUNDBfQ0hBTk5FTFMgKDIqMHhBMCkJLyogMTQgYnl0ZXMgKi8KLQotLyoKLSAqIDUuMiBHSHogSFQ0MCBjaGFubmVscyAzNiAoNDApLCA0NCAoNDgpLCA1MiAoNTYpLCA2MCAoNjQpLAotICogMTAwICgxMDQpLCAxMDggKDExMiksIDExNiAoMTIwKSwgMTI0ICgxMjgpLCAxMzIgKDEzNiksIDE0OSAoMTUzKSwgMTU3ICgxNjEpCi0gKi8KLSNkZWZpbmUgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFMgKDIqMHhBOCkJLyogMjIgYnl0ZXMgKi8KLQotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAJCQkoMCkKLQotc3RydWN0IGl3bF9lZXByb21fb3BzIHsKLQljb25zdCB1MzIgcmVndWxhdG9yeV9iYW5kc1s3XTsKLQlpbnQgKCphY3F1aXJlX3NlbWFwaG9yZSkgKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKnJlbGVhc2Vfc2VtYXBob3JlKSAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLQotaW50IGl3bF9sZWdhY3lfZWVwcm9tX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9lZXByb21fZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotY29uc3QgdTggKml3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzaXplX3Qgb2Zmc2V0KTsKLXUxNiBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCk7Ci1pbnQgaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKml3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbygKLQkJY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsIHUxNiBjaGFubmVsKTsKLQotI2VuZGlmICAvKiBfX2l3bF9sZWdhY3lfZWVwcm9tX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZmguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2MDkxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZmguaAorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2ZoX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfZmhfaF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRmxvdyBIYW5kbGVyIERlZmluaXRpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBUaGlzIEkvTyBhcmVhIGlzIGRpcmVjdGx5IHJlYWQvd3JpdGFibGUgYnkgZHJpdmVyIChlLmcuIExpbnV4IHVzZXMgd3JpdGVsKCkpCi0gKiBBZGRyZXNzZXMgYXJlIG9mZnNldHMgZnJvbSBkZXZpY2UncyBQQ0kgaGFyZHdhcmUgYmFzZSBhZGRyZXNzLgotICovCi0jZGVmaW5lIEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQotI2RlZmluZSBGSF9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLQotLyoqCi0gKiBLZWVwLVdhcm0gKEtXKSBidWZmZXIgYmFzZSBhZGRyZXNzLgotICoKLSAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGEgNEtCeXRlIGJ1ZmZlciB0aGF0IGlzIHVzZWQgYnkgNDk2NSBmb3Iga2VlcGluZyB0aGUKLSAqIGhvc3QgRFJBTSBwb3dlcmVkIG9uICh2aWEgZHVtbXkgYWNjZXNzZXMgdG8gRFJBTSkgdG8gbWFpbnRhaW4gbG93LWxhdGVuY3kKLSAqIERSQU0gYWNjZXNzIHdoZW4gNDk2NSBpcyBUeGluZyBvciBSeGluZy4gIFRoZSBkdW1teSBhY2Nlc3NlcyBwcmV2ZW50IGhvc3QKLSAqIGZyb20gZ29pbmcgaW50byBhIHBvd2VyLXNhdmluZ3MgbW9kZSB0aGF0IHdvdWxkIGNhdXNlIGhpZ2hlciBEUkFNIGxhdGVuY3ksCi0gKiBhbmQgcG9zc2libGUgZGF0YSBvdmVyL3VuZGVyLXJ1bnMsIGJlZm9yZSBhbGwgVHgvUnggaXMgY29tcGxldGUuCi0gKgotICogRHJpdmVyIGxvYWRzIEZIX0tXX01FTV9BRERSX1JFRyB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChiaXRzIDM1OjQpCi0gKiBvZiB0aGUgYnVmZmVyLCB3aGljaCBtdXN0IGJlIDRLIGFsaWduZWQuICBPbmNlIHRoaXMgaXMgc2V0IHVwLCB0aGUgNDk2NQotICogYXV0b21hdGljYWxseSBpbnZva2VzIGtlZXAtd2FybSBhY2Nlc3NlcyB3aGVuIG5vcm1hbCBhY2Nlc3NlcyBtaWdodCBub3QKLSAqIGJlIHN1ZmZpY2llbnQgdG8gbWFpbnRhaW4gZmFzdCBEUkFNIHJlc3BvbnNlLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMzEtMDogIEtlZXAtd2FybSBidWZmZXIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo0XSwgbXVzdCBiZSA0SyBhbGlnbmVkCi0gKi8KLSNkZWZpbmUgRkhfS1dfTUVNX0FERFJfUkVHCQkgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDk3QykKLQotCi0vKioKLSAqIFRGRCBDaXJjdWxhciBCdWZmZXJzIEJhc2UgKENCQkMpIGFkZHJlc3NlcwotICoKLSAqIDQ5NjUgaGFzIDE2IGJhc2UgcG9pbnRlciByZWdpc3RlcnMsIG9uZSBmb3IgZWFjaCBvZiAxNiBob3N0LURSQU0tcmVzaWRlbnQKLSAqIGNpcmN1bGFyIGJ1ZmZlcnMgKENCcy9xdWV1ZXMpIGNvbnRhaW5pbmcgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpCi0gKiAoc2VlIHN0cnVjdCBpd2xfdGZkX2ZyYW1lKS4gIFRoZXNlIDE2IHBvaW50ZXIgcmVnaXN0ZXJzIGFyZSBvZmZzZXQgYnkgMHgwNAotICogYnl0ZXMgZnJvbSBvbmUgYW5vdGhlci4gIEVhY2ggVEZEIGNpcmN1bGFyIGJ1ZmZlciBpbiBEUkFNIG11c3QgYmUgMjU2LWJ5dGUKLSAqIGFsaWduZWQgKGFkZHJlc3MgYml0cyAwLTcgbXVzdCBiZSAwKS4KLSAqCi0gKiBCaXQgZmllbGRzIGluIGVhY2ggcG9pbnRlciByZWdpc3RlcjoKLSAqICAyNy0wOiBURkQgQ0IgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo4XSwgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkCi0gKi8KLSNkZWZpbmUgRkhfTUVNX0NCQkNfTE9XRVJfQk9VTkQgICAgICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQotI2RlZmluZSBGSF9NRU1fQ0JCQ19VUFBFUl9CT1VORCAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhBMTApCi0KLS8qIEZpbmQgVEZEIENCIGJhc2UgcG9pbnRlciBmb3IgZ2l2ZW4gcXVldWUgKHJhbmdlIDAtMTUpLiAqLwotI2RlZmluZSBGSF9NRU1fQ0JCQ19RVUVVRSh4KSAgKEZIX01FTV9DQkJDX0xPV0VSX0JPVU5EICsgKHgpICogMHg0KQotCi0KLS8qKgotICogUnggU1JBTSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzIChSU0NTUikKLSAqCi0gKiBUaGVzZSByZWdpc3RlcnMgcHJvdmlkZSBoYW5kc2hha2UgYmV0d2VlbiBkcml2ZXIgYW5kIDQ5NjUgZm9yIHRoZSBSeCBxdWV1ZQotICogKHRoaXMgcXVldWUgaGFuZGxlcyAqYWxsKiBjb21tYW5kIHJlc3BvbnNlcywgbm90aWZpY2F0aW9ucywgUnggZGF0YSwgZXRjLgotICogc2VudCBmcm9tIDQ5NjUgdUNvZGUgdG8gaG9zdCBkcml2ZXIpLiAgVW5saWtlIFR4LCB0aGVyZSBpcyBvbmx5IG9uZSBSeAotICogcXVldWUsIGFuZCBvbmx5IG9uZSBSeCBETUEvRklGTyBjaGFubmVsLiAgQWxzbyB1bmxpa2UgVHgsIHdoaWNoIGNhbgotICogY29uY2F0ZW5hdGUgdXAgdG8gMjAgRFJBTSBidWZmZXJzIHRvIGZvcm0gYSBUeCBmcmFtZSwgZWFjaCBSZWNlaXZlIEJ1ZmZlcgotICogRGVzY3JpcHRvciAoUkJEKSBwb2ludHMgdG8gb25seSBvbmUgUnggQnVmZmVyIChSQik7IHRoZXJlIGlzIGEgMToxCi0gKiBtYXBwaW5nIGJldHdlZW4gUkJEcyBhbmQgUkJzLgotICoKLSAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGhvc3QgRFJBTSBtZW1vcnkgZm9yIHRoZSBmb2xsb3dpbmcsIGFuZCBzZXQgdGhlCi0gKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGVhY2ggaW50byA0OTY1IHJlZ2lzdGVyczoKLSAqCi0gKiAxKSAgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKSBjaXJjdWxhciBidWZmZXIgKENCKSwgdHlwaWNhbGx5IHdpdGggMjU2Ci0gKiAgICAgZW50cmllcyAoYWx0aG91Z2ggYW55IHBvd2VyIG9mIDIsIHVwIHRvIDQwOTYsIGlzIHNlbGVjdGFibGUgYnkgZHJpdmVyKS4KLSAqICAgICBFYWNoIGVudHJ5ICgxIGR3b3JkKSBwb2ludHMgdG8gYSByZWNlaXZlIGJ1ZmZlciAoUkIpIG9mIGNvbnNpc3RlbnQgc2l6ZQotICogICAgICh0eXBpY2FsbHkgNEssIGFsdGhvdWdoIDhLIG9yIDE2SyBhcmUgYWxzbyBzZWxlY3RhYmxlIGJ5IGRyaXZlcikuCi0gKiAgICAgRHJpdmVyIHNldHMgdXAgUkIgc2l6ZSBhbmQgbnVtYmVyIG9mIFJCRHMgaW4gdGhlIENCIHZpYSBSeCBjb25maWcKLSAqICAgICByZWdpc3RlciBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLgotICoKLSAqICAgICBCaXQgZmllbGRzIHdpdGhpbiBvbmUgUkJEOgotICogICAgIDI3LTA6ICBSZWNlaXZlIEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgWzM1OjhdLCAyNTYtYnl0ZSBhbGlnbmVkCi0gKgotICogICAgIERyaXZlciBzZXRzIHBoeXNpY2FsIGFkZHJlc3MgWzM1OjhdIG9mIGJhc2Ugb2YgUkJEIGNpcmN1bGFyIGJ1ZmZlcgotICogICAgIGludG8gRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcgWzI3OjBdLgotICoKLSAqIDIpICBSeCBzdGF0dXMgYnVmZmVyLCA4IGJ5dGVzLCBpbiB3aGljaCA0OTY1IGluZGljYXRlcyB3aGljaCBSeCBCdWZmZXJzCi0gKiAgICAgKFJCcykgaGF2ZSBiZWVuIGZpbGxlZCwgdmlhIGEgIndyaXRlIHBvaW50ZXIiLCBhY3R1YWxseSB0aGUgaW5kZXggb2YKLSAqICAgICB0aGUgUkIncyBjb3JyZXNwb25kaW5nIFJCRCB3aXRoaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4gIERyaXZlciBzZXRzCi0gKiAgICAgcGh5c2ljYWwgYWRkcmVzcyBbMzU6NF0gaW50byBGSF9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHIFszMTowXS4KLSAqCi0gKiAgICAgQml0IGZpZWxkcyBpbiBsb3dlciBkd29yZCBvZiBSeCBzdGF0dXMgYnVmZmVyICh1cHBlciBkd29yZCBub3QgdXNlZAotICogICAgIGJ5IGRyaXZlcjsgc2VlIHN0cnVjdCBpd2w0OTY1X3NoYXJlZCwgdmFsMCk6Ci0gKiAgICAgMzEtMTI6ICBOb3QgdXNlZCBieSBkcml2ZXIKLSAqICAgICAxMS0gMDogIEluZGV4IG9mIGxhc3QgZmlsbGVkIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAoNDk2NSB3cml0ZXMsIGRyaXZlciByZWFkcyB0aGlzIHZhbHVlKQotICoKLSAqIEFzIHRoZSBkcml2ZXIgcHJlcGFyZXMgUmVjZWl2ZSBCdWZmZXJzIChSQnMpIGZvciA0OTY1IHRvIGZpbGwsIGRyaXZlciBtdXN0Ci0gKiBlbnRlciBwb2ludGVycyB0byB0aGVzZSBSQnMgaW50byBjb250aWd1b3VzIFJCRCBjaXJjdWxhciBidWZmZXIgZW50cmllcywKLSAqIGFuZCB1cGRhdGUgdGhlIDQ5NjUncyAid3JpdGUiIGluZGV4IHJlZ2lzdGVyLAotICogRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcuCi0gKgotICogVGhpcyAid3JpdGUiIGluZGV4IGNvcnJlc3BvbmRzIHRvIHRoZSAqbmV4dCogUkJEIHRoYXQgdGhlIGRyaXZlciB3aWxsIG1ha2UKLSAqIGF2YWlsYWJsZSwgaS5lLiBvbmUgUkJEIHBhc3QgdGhlIHRhaWwgb2YgdGhlIHJlYWR5LXRvLWZpbGwgUkJEcyB3aXRoaW4KLSAqIHRoZSBjaXJjdWxhciBidWZmZXIuICBUaGlzIHZhbHVlIHNob3VsZCBpbml0aWFsbHkgYmUgMCAoYmVmb3JlIHByZXBhcmluZyBhbnkKLSAqIFJCcyksIHNob3VsZCBiZSA4IGFmdGVyIHByZXBhcmluZyB0aGUgZmlyc3QgOCBSQnMgKGZvciBleGFtcGxlKSwgYW5kIG11c3QKLSAqIHdyYXAgYmFjayB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAoYnV0IGRvbid0IHdyYXAgYmVmb3JlCi0gKiAicmVhZCIgaW5kZXggaGFzIGFkdmFuY2VkIHBhc3QgMSEgIFNlZSBiZWxvdykuCi0gKiBOT1RFOiAgNDk2NSBFWFBFQ1RTIFRIRSBXUklURSBJTkRFWCBUTyBCRSBJTkNSRU1FTlRFRCBJTiBNVUxUSVBMRVMgT0YgOC4KLSAqCi0gKiBBcyB0aGUgNDk2NSBmaWxscyBSQnMgKHJlZmVyZW5jZWQgZnJvbSBjb250aWd1b3VzIFJCRHMgd2l0aGluIHRoZSBjaXJjdWxhcgotICogYnVmZmVyKSwgaXQgdXBkYXRlcyB0aGUgUnggc3RhdHVzIGJ1ZmZlciBpbiBob3N0IERSQU0sIDIpIGRlc2NyaWJlZCBhYm92ZSwKLSAqIHRvIHRlbGwgdGhlIGRyaXZlciB0aGUgaW5kZXggb2YgdGhlIGxhdGVzdCBmaWxsZWQgUkJELiAgVGhlIGRyaXZlciBtdXN0Ci0gKiByZWFkIHRoaXMgInJlYWQiIGluZGV4IGZyb20gRFJBTSBhZnRlciByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0IGZyb20gNDk2NS4KLSAqCi0gKiBUaGUgZHJpdmVyIG11c3QgYWxzbyBpbnRlcm5hbGx5IGtlZXAgdHJhY2sgb2YgYSB0aGlyZCBpbmRleCwgd2hpY2ggaXMgdGhlCi0gKiBuZXh0IFJCRCB0byBwcm9jZXNzLiAgV2hlbiByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0LCBkcml2ZXIgc2hvdWxkIHByb2Nlc3MKLSAqIGFsbCBmaWxsZWQgYnV0IHVucHJvY2Vzc2VkIFJCcyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBSQgotICogY29ycmVzcG9uZGluZyB0byB0aGUgInJlYWQiIGluZGV4LiAgRm9yIGV4YW1wbGUsIGlmICJyZWFkIiBpbmRleCBiZWNvbWVzICIxIiwKLSAqIGRyaXZlciBtYXkgcHJvY2VzcyB0aGUgUkIgcG9pbnRlZCB0byBieSBSQkQgMC4gIERlcGVuZGluZyBvbiB2b2x1bWUgb2YKLSAqIHRyYWZmaWMsIHRoZXJlIG1heSBiZSBtYW55IFJCcyB0byBwcm9jZXNzLgotICoKLSAqIElmIHJlYWQgaW5kZXggPT0gd3JpdGUgaW5kZXgsIDQ5NjUgdGhpbmtzIHRoZXJlIGlzIG5vIHJvb20gdG8gcHV0IG5ldyBkYXRhLgotICogRHVlIHRvIHRoaXMsIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxsZWQgUkJzIGlzIDI1NSwgaW5zdGVhZCBvZiAyNTYuICBUbwotICogYmUgc2FmZSwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSBnYXAgb2YgYXQgbGVhc3QgMiBSQkRzIGJldHdlZW4gIndyaXRlIgotICogYW5kICJyZWFkIiBpbmRleGVzOyB0aGF0IGlzLCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDI1NAotICogYnVmZmVycyB3YWl0aW5nIHRvIGJlIGZpbGxlZC4KLSAqLwotI2RlZmluZSBGSF9NRU1fUlNDU1JfTE9XRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QkMwKQotI2RlZmluZSBGSF9NRU1fUlNDU1JfVVBQRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QzAwKQotI2RlZmluZSBGSF9NRU1fUlNDU1JfQ0hOTDAJCShGSF9NRU1fUlNDU1JfTE9XRVJfQk9VTkQpCi0KLS8qKgotICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIDgtYnl0ZSBSeCBTdGF0dXMgYnVmZmVyLgotICogQml0IGZpZWxkczoKLSAqICAzMS0wOiBSeCBzdGF0dXMgYnVmZmVyIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6NF0sIG11c3QgMTYtYnl0ZSBhbGlnbmVkLgotICovCi0jZGVmaW5lIEZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcJKEZIX01FTV9SU0NTUl9DSE5MMCkKLQotLyoqCi0gKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgUnggQnVmZmVyIERlc2NyaXB0b3IgQ2lyY3VsYXIgQnVmZmVyLgotICogQml0IGZpZWxkczoKLSAqICAyNy0wOiAgUkJEIENEIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6OF0sIG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KLSAqLwotI2RlZmluZSBGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRwkoRkhfTUVNX1JTQ1NSX0NITkwwICsgMHgwMDQpCi0KLS8qKgotICogUnggd3JpdGUgcG9pbnRlciAoaW5kZXgsIHJlYWxseSEpLgotICogQml0IGZpZWxkczoKLSAqICAxMS0wOiAgSW5kZXggb2YgZHJpdmVyJ3MgbW9zdCByZWNlbnQgcHJlcGFyZWQtdG8tYmUtZmlsbGVkIFJCRCwgKyAxLgotICogICAgICAgICBOT1RFOiAgRm9yIDI1Ni1lbnRyeSBjaXJjdWxhciBidWZmZXIsIHVzZSBvbmx5IGJpdHMgWzc6MF0uCi0gKi8KLSNkZWZpbmUgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcJKEZIX01FTV9SU0NTUl9DSE5MMCArIDB4MDA4KQotI2RlZmluZSBGSF9SU0NTUl9DSE5MMF9XUFRSICAgICAgICAoRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcpCi0KLQotLyoqCi0gKiBSeCBDb25maWcvU3RhdHVzIFJlZ2lzdGVycyAoUkNTUikKLSAqIFJ4IENvbmZpZyBSZWcgZm9yIGNoYW5uZWwgMCAob25seSBjaGFubmVsIHVzZWQpCi0gKgotICogRHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHIGFzIGZvbGxvd3MgZm9yCi0gKiBub3JtYWwgb3BlcmF0aW9uIChzZWUgYml0IGZpZWxkcykuCi0gKgotICogQ2xlYXJpbmcgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyB0byAwIHR1cm5zIG9mZiBSeCBETUEuCi0gKiBEcml2ZXIgc2hvdWxkIHBvbGwgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwlmb3IKLSAqIEZIX1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRSAoYml0IDI0KSBiZWZvcmUgY29udGludWluZy4KLSAqCi0gKiBCaXQgZmllbGRzOgotICogMzEtMzA6IFJ4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAotICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQotICogMjktMjQ6IHJlc2VydmVkCi0gKiAyMy0yMDogIyBSQkRzIGluIGNpcmN1bGFyIGJ1ZmZlciA9IDJedmFsdWU7IHVzZSAiOCIgZm9yIDI1NiBSQkRzIChub3JtYWwpLAotICogICAgICAgIG1pbiAiNSIgZm9yIDMyIFJCRHMsIG1heCAiMTIiIGZvciA0MDk2IFJCRHMuCi0gKiAxOS0xODogcmVzZXJ2ZWQKLSAqIDE3LTE2OiBzaXplIG9mIGVhY2ggcmVjZWl2ZSBidWZmZXI7ICcwMCcgNEsgKG5vcm1hbCksICcwMScgOEssCi0gKiAgICAgICAgJzEwJyAxMkssICcxMScgMTZLLgotICogMTUtMTQ6IHJlc2VydmVkCi0gKiAxMy0xMjogSVJRIGRlc3RpbmF0aW9uOyAnMDAnIG5vbmUsICcwMScgaG9zdCBkcml2ZXIgKG5vcm1hbCBvcGVyYXRpb24pCi0gKiAxMS0gNDogdGltZW91dCBmb3IgY2xvc2luZyBSeCBidWZmZXIgYW5kIGludGVycnVwdGluZyBob3N0ICh1bml0cyAzMiB1c2VjKQotICogICAgICAgIHR5cGljYWwgdmFsdWUgMHgxMCAoYWJvdXQgMS8yIG1zZWMpCi0gKiAgMy0gMDogcmVzZXJ2ZWQKLSAqLwotI2RlZmluZSBGSF9NRU1fUkNTUl9MT1dFUl9CT1VORCAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEMwMCkKLSNkZWZpbmUgRkhfTUVNX1JDU1JfVVBQRVJfQk9VTkQgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhDQzApCi0jZGVmaW5lIEZIX01FTV9SQ1NSX0NITkwwICAgICAgICAgICAgKEZIX01FTV9SQ1NSX0xPV0VSX0JPVU5EKQotCi0jZGVmaW5lIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcJKEZIX01FTV9SQ1NSX0NITkwwKQotCi0jZGVmaW5lIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1RJTUVPVVRfTVNLICgweDAwMDAwRkYwKSAvKiBiaXRzIDQtMTEgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTVNLICAgKDB4MDAwMDEwMDApIC8qIGJpdHMgMTIgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfU0lOR0xFX0ZSQU1FX01TSyAoMHgwMDAwODAwMCkgLyogYml0IDE1ICovCi0jZGVmaW5lIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCX1NJWkVfTVNLICAgKDB4MDAwMzAwMDApIC8qIGJpdHMgMTYtMTcgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJEQkNfU0laRV9NU0sgKDB4MDBGMDAwMDApIC8qIGJpdHMgMjAtMjMgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfRE1BX0NITkxfRU5fTVNLICgweEMwMDAwMDAwKSAvKiBiaXRzIDMwLTMxKi8KLQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX1BPUwkoMjApCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MJKDQpCi0jZGVmaW5lIFJYX1JCX1RJTUVPVVQJKDB4MTApCi0KLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9WQUwgICAgICAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9FT0ZfVkFMICAgICAoMHg0MDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9FTkFCTEVfVkFMICAgICAgICAoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEsgICAgKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SyAgICAoMHgwMDAxMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzEySyAgICgweDAwMDIwMDAwKQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTZLICAgKDB4MDAwMzAwMDApCi0KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfTk9fSU5UX1ZBTCAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMICAoMHgwMDAwMTAwMCkKLQotI2RlZmluZSBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSwkoMHgwMDAwM0ZGRikJLyogYml0cyAwLTEzICovCi0KLS8qKgotICogUnggU2hhcmVkIFN0YXR1cyBSZWdpc3RlcnMgKFJTU1IpCi0gKgotICogQWZ0ZXIgc3RvcHBpbmcgUnggRE1BIGNoYW5uZWwgKHdyaXRpbmcgMCB0bwotICogRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRyksIGRyaXZlciBtdXN0IHBvbGwKLSAqIEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcgdW50aWwgUnggY2hhbm5lbCBpcyBpZGxlLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAgMjQ6ICAxID0gQ2hhbm5lbCAwIGlzIGlkbGUKLSAqCi0gKiBGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcgYW5kIEZIX01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSVgotICogY29udGFpbiBkZWZhdWx0IHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYmUgYWx0ZXJlZCBieSB0aGUgZHJpdmVyLgotICovCi0jZGVmaW5lIEZIX01FTV9SU1NSX0xPV0VSX0JPVU5EICAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhDNDApCi0jZGVmaW5lIEZIX01FTV9SU1NSX1VQUEVSX0JPVU5EICAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCi0KLSNkZWZpbmUgRkhfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHICAgICAgIChGSF9NRU1fUlNTUl9MT1dFUl9CT1VORCkKLSNkZWZpbmUgRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwkoRkhfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwNCkKLSNkZWZpbmUgRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWXAotCQkJCQkoRkhfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwOCkKLQotI2RlZmluZSBGSF9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJKDB4MDEwMDAwMDApCi0KLSNkZWZpbmUgRkhfTUVNX1RGRElCX1JFRzFfQUREUl9CSVRTSElGVAkyOAotCi0vKiBURkRCICBBcmVhIC0gVEZEcyBidWZmZXIgdGFibGUgKi8KLSNkZWZpbmUgRkhfTUVNX1RGRElCX0RSQU1fQUREUl9MU0JfTVNLICAgICAgKDB4RkZGRkZGRkYpCi0jZGVmaW5lIEZIX1RGRElCX0xPV0VSX0JPVU5EICAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDkwMCkKLSNkZWZpbmUgRkhfVEZESUJfVVBQRVJfQk9VTkQgICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OTU4KQotI2RlZmluZSBGSF9URkRJQl9DVFJMMF9SRUcoX2NobmwpICAoRkhfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpKQotI2RlZmluZSBGSF9URkRJQl9DVFJMMV9SRUcoX2NobmwpICAoRkhfVEZESUJfTE9XRVJfQk9VTkQgKyAweDggKiAoX2NobmwpICsgMHg0KQotCi0vKioKLSAqIFRyYW5zbWl0IERNQSBDaGFubmVsIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVycyAoVENTUikKLSAqCi0gKiA0OTY1IGhhcyBvbmUgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3IgZWFjaCBvZiA4IFR4IERNQS9GSUZPIGNoYW5uZWxzCi0gKiBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgKGRvbid0IGNvbmZ1c2UgdGhlc2Ugd2l0aCB0aGUgMTYgVHggcXVldWVzIGluIERSQU0sCi0gKiB3aGljaCBmZWVkIHRoZSBETUEvRklGTyBjaGFubmVscyk7IGNvbmZpZyByZWdzIGFyZSBzZXBhcmF0ZWQgYnkgMHgyMCBieXRlcy4KLSAqCi0gKiBUbyB1c2UgYSBUeCBETUEgY2hhbm5lbCwgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBpdHMKLSAqIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpIHdpdGg6Ci0gKgotICogRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUgfAotICogRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwKLSAqCi0gKiBBbGwgb3RoZXIgYml0cyBzaG91bGQgYmUgMC4KLSAqCi0gKiBCaXQgZmllbGRzOgotICogMzEtMzA6IFR4IERNQSBjaGFubmVsIGVuYWJsZTogJzAwJyBvZmYvcGF1c2UsICcwMScgcGF1c2UgYXQgZW5kIG9mIGZyYW1lLAotICogICAgICAgICcxMCcgb3BlcmF0ZSBub3JtYWxseQotICogMjktIDQ6IFJlc2VydmVkLCBzZXQgdG8gIjAiCi0gKiAgICAgMzogRW5hYmxlIGludGVybmFsIERNQSByZXF1ZXN0cyAoMSwgbm9ybWFsIG9wZXJhdGlvbiksIGRpc2FibGUgKDApCi0gKiAgMi0gMDogUmVzZXJ2ZWQsIHNldCB0byAiMCIKLSAqLwotI2RlZmluZSBGSF9UQ1NSX0xPV0VSX0JPVU5EICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCi0jZGVmaW5lIEZIX1RDU1JfVVBQRVJfQk9VTkQgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEU2MCkKLQotLyogRmluZCBDb250cm9sL1N0YXR1cyByZWcgZm9yIGdpdmVuIFR4IERNQS9GSUZPIGNoYW5uZWwgKi8KLSNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICg3KQotI2RlZmluZSBGSDUwX1RDU1JfQ0hOTF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpCi0KLS8qIFRDU1I6IHR4X2NvbmZpZyByZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoX2NobmwpCVwKLQkJKEZIX1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0NSRURJVF9SRUcoX2NobmwpCVwKLQkJKEZIX1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSArIDB4NCkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKF9jaG5sKQlcCi0JCShGSF9UQ1NSX0xPV0VSX0JPVU5EICsgMHgyMCAqIChfY2hubCkgKyAweDgpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9UWEYJCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0RSVgkJKDB4MDAwMDAwMDEpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEUJKDB4MDAwMDAwMDgpCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfTk9JTlQJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0VORFRGRAkoMHgwMDEwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJKDB4MDAyMDAwMDApCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19FTkRURkQJKDB4MDA0MDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfSUZURkQJKDB4MDA4MDAwMDApCi0KLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRV9FT0YJKDB4NDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCSgweDgwMDAwMDAwKQotCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9FTVBUWQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1dBSVQJKDB4MDAwMDIwMDApCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkoMHgwMDAwMDAwMykKLQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX05VTQkJKDIwKQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX0lEWAkJKDEyKQotCi0vKioKLSAqIFR4IFNoYXJlZCBTdGF0dXMgUmVnaXN0ZXJzIChUU1NSKQotICoKLSAqIEFmdGVyIHN0b3BwaW5nIFR4IERNQSBjaGFubmVsICh3cml0aW5nIDAgdG8KLSAqIEZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpKSwgZHJpdmVyIG11c3QgcG9sbAotICogRkhfVFNTUl9UWF9TVEFUVVNfUkVHIHVudGlsIHNlbGVjdGVkIFR4IGNoYW5uZWwgaXMgaWRsZQotICogKGNoYW5uZWwncyBidWZmZXJzIGVtcHR5IHwgbm8gcGVuZGluZyByZXF1ZXN0cykuCi0gKgotICogQml0IGZpZWxkczoKLSAqIDMxLTI0OiAgMSA9IENoYW5uZWwgYnVmZmVycyBlbXB0eSAoY2hhbm5lbCA3OjApCi0gKiAyMy0xNjogIDEgPSBObyBwZW5kaW5nIHJlcXVlc3RzIChjaGFubmVsIDc6MCkKLSAqLwotI2RlZmluZSBGSF9UU1NSX0xPV0VSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhFQTApCi0jZGVmaW5lIEZIX1RTU1JfVVBQRVJfQk9VTkQJCShGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEVDMCkKLQotI2RlZmluZSBGSF9UU1NSX1RYX1NUQVRVU19SRUcJCShGSF9UU1NSX0xPV0VSX0JPVU5EICsgMHgwMTApCi0KLS8qKgotICogQml0IGZpZWxkcyBmb3IgVFNTUihUeCBTaGFyZWQgU3RhdHVzICYgQ29udHJvbCkgZXJyb3Igc3RhdHVzIHJlZ2lzdGVyOgotICogMzE6ICBJbmRpY2F0ZXMgYW4gYWRkcmVzcyBlcnJvciB3aGVuIGFjY2Vzc2VkIHRvIGludGVybmFsIG1lbW9yeQotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICogMzA6ICBJbmRpY2F0ZXMgdGhhdCBIb3N0IGRpZCBub3Qgc2VuZCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGR3b3JkcyB0byBGSAotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICogMTYtOTpFYWNoIHN0YXR1cyBiaXQgaXMgZm9yIG9uZSBjaGFubmVsLiBJbmRpY2F0ZXMgdGhhdCBhbiAoRXJyb3IpIEFjdERNQQotICoJY29tbWFuZCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2NoZWR1bGVyIHdoaWxlIHRoZSBUUkIgd2FzIGFscmVhZHkgZnVsbAotICoJd2l0aCBwcmV2aW91cyBjb21tYW5kCi0gKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCi0gKiA3LTA6IEVhY2ggc3RhdHVzIGJpdCBpbmRpY2F0ZXMgYSBjaGFubmVsJ3MgVHhDcmVkaXQgZXJyb3IuIFdoZW4gYW4gZXJyb3IKLSAqCWJpdCBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBGSCBoYXMgcmVjZWl2ZWQgYSBmdWxsIGluZGljYXRpb24KLSAqCWZyb20gdGhlIFJUQyBUeEZJRk8gYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBUeENyZWRpdCBjb3VudGVyIHdhcwotICoJbm90IGVxdWFsIHRvIHplcm8uIFRoaXMgbWVhbiB0aGF0IHRoZSBjcmVkaXQgbWVjaGFuaXNtIHdhcyBub3QKLSAqCXN5bmNocm9uaXplZCB0byB0aGUgVHhGSUZPIHN0YXR1cwotICoJdUNvZGUvZHJpdmVyIG11c3Qgd3JpdGUgIjEiIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgZmxhZwotICovCi0jZGVmaW5lIEZIX1RTU1JfVFhfRVJST1JfUkVHCQkoRkhfVFNTUl9MT1dFUl9CT1VORCArIDB4MDE4KQotCi0jZGVmaW5lIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKF9jaG5sKSAoKDEgPDwgKF9jaG5sKSkgPDwgMTYpCi0KLS8qIFR4IHNlcnZpY2UgY2hhbm5lbHMgKi8KLSNkZWZpbmUgRkhfU1JWQ19DSE5MCQkoOSkKLSNkZWZpbmUgRkhfU1JWQ19MT1dFUl9CT1VORAkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHg5QzgpCi0jZGVmaW5lIEZIX1NSVkNfVVBQRVJfQk9VTkQJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQotI2RlZmluZSBGSF9TUlZDX0NITkxfU1JBTV9BRERSX1JFRyhfY2hubCkgXAotCQkoRkhfU1JWQ19MT1dFUl9CT1VORCArICgoX2NobmwpIC0gOSkgKiAweDQpCi0KLSNkZWZpbmUgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRwkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhFOTgpCi0vKiBJbnN0cnVjdCBGSCB0byBpbmNyZW1lbnQgdGhlIHJldHJ5IGNvdW50IG9mIGEgcGFja2V0IHdoZW4KLSAqIGl0IGlzIGJyb3VnaHQgZnJvbSB0aGUgbWVtb3J5IHRvIFRYLUZJRk8KLSAqLwotI2RlZmluZSBGSF9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4JKDB4MDAwMDAwMDIpCi0KLSNkZWZpbmUgUlhfUVVFVUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgUlhfUVVFVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgUlhfUVVFVUVfU0laRV9MT0cgICAgICAgICAgICAgICAgICAgICA4Ci0KLS8qCi0gKiBSWCByZWxhdGVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwotICovCi0jZGVmaW5lIFJYX0ZSRUVfQlVGRkVSUyA2NAotI2RlZmluZSBSWF9MT1dfV0FURVJNQVJLIDgKLQotLyogU2l6ZSBvZiBvbmUgUnggYnVmZmVyIGluIGhvc3QgRFJBTSAqLwotI2RlZmluZSBJV0xfUlhfQlVGX1NJWkVfM0sgKDMgKiAxMDAwKSAvKiAzOTQ1IG9ubHkgKi8KLSNkZWZpbmUgSVdMX1JYX0JVRl9TSVpFXzRLICg0ICogMTAyNCkKLSNkZWZpbmUgSVdMX1JYX0JVRl9TSVpFXzhLICg4ICogMTAyNCkKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3JiX3N0YXR1cyAtIHJlc2V2ZSBidWZmZXIgc3RhdHVzCi0gKiAJaG9zdCBtZW1vcnkgbWFwcGVkIEZIIHJlZ2lzdGVycwotICogQGNsb3NlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUkIgd2hpY2ggd2FzIGNsb3NlZAotICogQGNsb3NlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUlggRnJhbWUgd2hpY2ggd2FzIGNsb3NlZAotICogQGZpbmlzaGVkX3JiX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFJCCi0gKiAJaW4gd2hpY2ggdGhlIGxhc3QgZnJhbWUgd2FzIHdyaXR0ZW4gdG8KLSAqIEBmaW5pc2hlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUlggRnJhbWUKLSAqIAl3aGljaCB3YXMgdHJhbnNmZXJyZWQKLSAqLwotc3RydWN0IGl3bF9yYl9zdGF0dXMgewotCV9fbGUxNiBjbG9zZWRfcmJfbnVtOwotCV9fbGUxNiBjbG9zZWRfZnJfbnVtOwotCV9fbGUxNiBmaW5pc2hlZF9yYl9udW07Ci0JX19sZTE2IGZpbmlzaGVkX2ZyX25hbTsKLQlfX2xlMzIgX191bnVzZWQ7IC8qIDM5NDUgb25seSAqLwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIFRGRF9RVUVVRV9TSVpFX01BWCAgICAgICgyNTYpCi0jZGVmaW5lIFRGRF9RVUVVRV9TSVpFX0JDX0RVUAkoNjQpCi0jZGVmaW5lIFRGRF9RVUVVRV9CQ19TSVpFCShURkRfUVVFVUVfU0laRV9NQVggKyBURkRfUVVFVUVfU0laRV9CQ19EVVApCi0jZGVmaW5lIElXTF9UWF9ETUFfTUFTSyAgICAgICAgRE1BX0JJVF9NQVNLKDM2KQotI2RlZmluZSBJV0xfTlVNX09GX1RCUwkJMjAKLQotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCi17Ci0JcmV0dXJuIChzaXplb2YoYWRkcikgPiBzaXplb2YodTMyKSA/IChhZGRyID4+IDE2KSA+PiAxNiA6IDApICYgMHhGOwotfQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3RmZF90YiB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciB3aXRoaW4gdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGRtYSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdHJhbnNtaXNzaW9uIGFkZHJlc3MKLSAqCi0gKiBAbG86IGxvdyBbMzE6MF0gcG9ydGlvbiBvZiB0aGUgZG1hIGFkZHJlc3Mgb2YgVFggYnVmZmVyCi0gKiAJZXZlcnkgZXZlbiBpcyB1bmFsaWduZWQgb24gMTYgYml0IGJvdW5kYXJ5Ci0gKiBAaGlfbl9sZW4gMC0zIFszNTozMl0gcG9ydGlvbiBvZiBkbWEKLSAqCSAgICAgNC0xNSBsZW5ndGggb2YgdGhlIHR4IGJ1ZmZlcgotICovCi1zdHJ1Y3QgaXdsX3RmZF90YiB7Ci0JX19sZTMyIGxvOwotCV9fbGUxNiBoaV9uX2xlbjsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IGl3bF90ZmQKLSAqCi0gKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCi0gKgotICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAotICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicwotICoJICAgICA1ICAgcmVzZXJ2ZWQKLSAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKLSAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKLSAqIEAgX19wYWQgCXBhZGRpbmcKLSAqCi0gKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgMjU2IFRGRHMgc3RvcmVkIGluIGhvc3QgRFJBTS4KLSAqIEJvdGggZHJpdmVyIGFuZCBkZXZpY2Ugc2hhcmUgdGhlc2UgY2lyY3VsYXIgYnVmZmVycywgZWFjaCBvZiB3aGljaCBtdXN0IGJlCi0gKiBjb250aWd1b3VzIDI1NiBURkRzIHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKLSAqCi0gKiBEcml2ZXIgbXVzdCBpbmRpY2F0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiBlYWNoCi0gKiBjaXJjdWxhciBidWZmZXIgdmlhIHRoZSBGSF9NRU1fQ0JCQ19RVUVVRSByZWdpc3RlcnMuCi0gKgotICogRWFjaCBURkQgY29udGFpbnMgcG9pbnRlci9zaXplIGluZm9ybWF0aW9uIGZvciB1cCB0byAyMCBkYXRhIGJ1ZmZlcnMKLSAqIGluIGhvc3QgRFJBTS4gIFRoZXNlIGJ1ZmZlcnMgY29sbGVjdGl2ZWx5IGNvbnRhaW4gdGhlIChvbmUpIGZyYW1lIGRlc2NyaWJlZAotICogYnkgdGhlIFRGRC4gIEVhY2ggYnVmZmVyIG11c3QgYmUgYSBzaW5nbGUgY29udGlndW91cyBibG9jayBvZiBtZW1vcnkgd2l0aGluCi0gKiBpdHNlbGYsIGJ1dCBidWZmZXJzIG1heSBiZSBzY2F0dGVyZWQgaW4gaG9zdCBEUkFNLiAgRWFjaCBidWZmZXIgaGFzIG1heCBzaXplCi0gKiBvZiAoNEsgLSA0KS4gIFRoZSBjb25jYXRlbmF0ZXMgYWxsIG9mIGEgVEZEJ3MgYnVmZmVycyBpbnRvIGEgc2luZ2xlCi0gKiBUeCBmcmFtZSwgdXAgdG8gOCBLQnl0ZXMgaW4gc2l6ZS4KLSAqCi0gKiBBIG1heGltdW0gb2YgMjU1IChub3QgMjU2ISkgVEZEcyBtYXkgYmUgb24gYSBxdWV1ZSB3YWl0aW5nIGZvciBUeC4KLSAqLwotc3RydWN0IGl3bF90ZmQgewotCXU4IF9fcmVzZXJ2ZWQxWzNdOwotCXU4IG51bV90YnM7Ci0Jc3RydWN0IGl3bF90ZmRfdGIgdGJzW0lXTF9OVU1fT0ZfVEJTXTsKLQlfX2xlMzIgX19wYWQ7Ci19IF9fcGFja2VkOwotCi0vKiBLZWVwIFdhcm0gU2l6ZSAqLwotI2RlZmluZSBJV0xfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KLQotI2VuZGlmIC8qICFfX2l3bF9sZWdhY3lfZmhfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGNtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhjbWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxZmM5Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGNtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotCi0KLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcodTggY21kKQotewotCXN3aXRjaCAoY21kKSB7Ci0JCUlXTF9DTUQoUkVQTFlfQUxJVkUpOwotCQlJV0xfQ01EKFJFUExZX0VSUk9SKTsKLQkJSVdMX0NNRChSRVBMWV9SWE9OKTsKLQkJSVdMX0NNRChSRVBMWV9SWE9OX0FTU09DKTsKLQkJSVdMX0NNRChSRVBMWV9RT1NfUEFSQU0pOwotCQlJV0xfQ01EKFJFUExZX1JYT05fVElNSU5HKTsKLQkJSVdMX0NNRChSRVBMWV9BRERfU1RBKTsKLQkJSVdMX0NNRChSRVBMWV9SRU1PVkVfU1RBKTsKLQkJSVdMX0NNRChSRVBMWV9XRVBLRVkpOwotCQlJV0xfQ01EKFJFUExZXzM5NDVfUlgpOwotCQlJV0xfQ01EKFJFUExZX1RYKTsKLQkJSVdMX0NNRChSRVBMWV9SQVRFX1NDQUxFKTsKLQkJSVdMX0NNRChSRVBMWV9MRURTX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfQ0hBTk5FTF9TV0lUQ0gpOwotCQlJV0xfQ01EKENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EKTsKLQkJSVdMX0NNRChTUEVDVFJVTV9NRUFTVVJFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUE9XRVJfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChQTV9TTEVFUF9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFBNX0RFQlVHX1NUQVRJU1RJQ19OT1RJRklDKTsKLQkJSVdMX0NNRChSRVBMWV9TQ0FOX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfU0NBTl9BQk9SVF9DTUQpOwotCQlJV0xfQ01EKFNDQU5fU1RBUlRfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoQkVBQ09OX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfVFhfQkVBQ09OKTsKLQkJSVdMX0NNRChSRVBMWV9UWF9QV1JfVEFCTEVfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9CVF9DT05GSUcpOwotCQlJV0xfQ01EKFJFUExZX1NUQVRJU1RJQ1NfQ01EKTsKLQkJSVdMX0NNRChTVEFUSVNUSUNTX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoQ0FSRF9TVEFURV9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKE1JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EKTsKLQkJSVdMX0NNRChTRU5TSVRJVklUWV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYX1BIWV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYX01QRFVfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9SWCk7Ci0JCUlXTF9DTUQoUkVQTFlfQ09NUFJFU1NFRF9CQSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyk7Ci0KLSNkZWZpbmUgSE9TVF9DT01QTEVURV9USU1FT1VUIChIWiAvIDIpCi0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQotewotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0Jc3dpdGNoIChjbWQtPmhkci5jbWQpIHsKLQljYXNlIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQ6Ci0JY2FzZSBTRU5TSVRJVklUWV9DTUQ6Ci0JCUlXTF9ERUJVR19IQ19EVU1QKHByaXYsICJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsCi0JCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSEMocHJpdiwgImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKLQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQKLWl3bF9sZWdhY3lfc2VuZF9jbWRfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCi17Ci0JaW50IHJldDsKLQotCUJVR19PTighKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpKTsKLQotCS8qIEFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgZXhwZWN0IGFuIFNLQiB0byBiZSBzZXQuICovCi0JQlVHX09OKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpOwotCi0JLyogQXNzaWduIGEgZ2VuZXJpYyBjYWxsYmFjayBpZiBvbmUgaXMgbm90IHByb3ZpZGVkICovCi0JaWYgKCFjbWQtPmNhbGxiYWNrKQotCQljbWQtPmNhbGxiYWNrID0gaXdsX2xlZ2FjeV9nZW5lcmljX2NtZF9jYWxsYmFjazsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldCA9IGl3bF9sZWdhY3lfZW5xdWV1ZV9oY21kKHByaXYsIGNtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQotewotCWludCBjbWRfaWR4OwotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlCVUdfT04oY21kLT5mbGFncyAmIENNRF9BU1lOQyk7Ci0KLQkgLyogQSBzeW5jaHJvbm91cyBjb21tYW5kIGNhbiBub3QgaGF2ZSBhIGNhbGxiYWNrIHNldC4gKi8KLQlCVUdfT04oY21kLT5jYWxsYmFjayk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQXR0ZW1wdGluZyB0byBzZW5kIHN5bmMgY29tbWFuZCAlc1xuIiwKLQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCi0Jc2V0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZXR0aW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0KLQljbWRfaWR4ID0gaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQocHJpdiwgY21kKTsKLQlpZiAoY21kX2lkeCA8IDApIHsKLQkJcmV0ID0gY21kX2lkeDsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsCi0JCQkhdGVzdF9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKSwKLQkJCUhPU1RfQ09NUExFVEVfVElNRU9VVCk7Ci0JaWYgKCFyZXQpIHsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cykpIHsKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiRXJyb3Igc2VuZGluZyAlczogdGltZSBvdXQgYWZ0ZXIgJWRtcy5cbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOwotCi0JCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJCSAgICAgICBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGNhbmNlbDsKLQkJfQotCX0KLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0VSUihwcml2LCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKLQkJCSAgICAgICBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJcmV0ID0gLUVDQU5DRUxFRDsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHByaXYsICJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCi0JCQkgICAgICAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSAmJiAhY21kLT5yZXBseV9wYWdlKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCi0JCQkgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGNhbmNlbDsKLQl9Ci0KLQlyZXQgPSAwOwotCWdvdG8gb3V0OwotCi1jYW5jZWw6Ci0JaWYgKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpIHsKLQkJLyoKLQkJICogQ2FuY2VsIHRoZSBDTURfV0FOVF9TS0IgZmxhZyBmb3IgdGhlIGNtZCBpbiB0aGUKLQkJICogVFggY21kIHF1ZXVlLiBPdGhlcndpc2UgaW4gY2FzZSB0aGUgY21kIGNvbWVzCi0JCSAqIGluIGxhdGVyLCBpdCB3aWxsIHBvc3NpYmx5IHNldCBhbiBpbnZhbGlkCi0JCSAqIGFkZHJlc3MgKGNtZC0+bWV0YS5zb3VyY2UpLgotCQkgKi8KLQkJcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV0ubWV0YVtjbWRfaWR4XS5mbGFncyAmPQotCQkJCQkJCX5DTURfV0FOVF9TS0I7Ci0JfQotZmFpbDoKLQlpZiAoY21kLT5yZXBseV9wYWdlKSB7Ci0JCWl3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCBjbWQtPnJlcGx5X3BhZ2UpOwotCQljbWQtPnJlcGx5X3BhZ2UgPSAwOwotCX0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKLQkJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfYXN5bmMocHJpdiwgY21kKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZCk7Ci0KLWludAotaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gaWQsCi0JCS5sZW4gPSBsZW4sCi0JCS5kYXRhID0gZGF0YSwKLQl9OwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyhwcml2LCAmY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgdTggaWQsIHUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGlkLAotCQkubGVuID0gbGVuLAotCQkuZGF0YSA9IGRhdGEsCi0JfTsKLQotCWNtZC5mbGFncyB8PSBDTURfQVNZTkM7Ci0JY21kLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9hc3luYyhwcml2LCAmY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1oZWxwZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjIzZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2hlbHBlcnNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9oZWxwZXJzX2hfXwotCi0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1pby5oIgotCi0jZGVmaW5lIElXTF9NQVNLKGxvLCBoaSkgKCgxIDw8IChoaSkpIHwgKCgxIDw8IChoaSkpIC0gKDEgPDwgKGxvKSkpKQotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9jb25mICppd2xfbGVnYWN5X2llZWU4MDIxMV9nZXRfaHdfY29uZigKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlyZXR1cm4gJmh3LT5jb25mOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAgLSBpbmNyZW1lbnQgcXVldWUgaW5kZXgsIHdyYXAgYmFjayB0byBiZWdpbm5pbmcKLSAqIEBpbmRleCAtLSBjdXJyZW50IGluZGV4Ci0gKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGludCBpbmRleCwgaW50IG5fYmQpCi17Ci0JcmV0dXJuICsraW5kZXggJiAobl9iZCAtIDEpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAgLSBkZWNyZW1lbnQgcXVldWUgaW5kZXgsIHdyYXAgYmFjayB0byBlbmQKLSAqIEBpbmRleCAtLSBjdXJyZW50IGluZGV4Ci0gKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwKGludCBpbmRleCwgaW50IG5fYmQpCi17Ci0JcmV0dXJuIC0taW5kZXggJiAobl9iZCAtIDEpOwotfQotCi0vKiBUT0RPOiBNb3ZlIGZ3X2Rlc2MgZnVuY3Rpb25zIHRvIGl3bC1wY2kua28gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQkJCQkgICAgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCi17Ci0JaWYgKGRlc2MtPnZfYWRkcikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLAotCQkJCSAgZGVzYy0+dl9hZGRyLCBkZXNjLT5wX2FkZHIpOwotCWRlc2MtPnZfYWRkciA9IE5VTEw7Ci0JZGVzYy0+bGVuID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKLXsKLQlpZiAoIWRlc2MtPmxlbikgewotCQlkZXNjLT52X2FkZHIgPSBOVUxMOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXNjLT52X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLAotCQkJCQkgICZkZXNjLT5wX2FkZHIsIEdGUF9LRVJORUwpOwotCXJldHVybiAoZGVzYy0+dl9hZGRyICE9IE5VTEwpID8gMCA6IC1FTk9NRU07Ci19Ci0KLS8qCi0gKiB3ZSBoYXZlIDggYml0cyB1c2VkIGxpa2UgdGhpczoKLSAqCi0gKiA3IDYgNSA0IDMgMiAxIDAKLSAqIHwgfCB8IHwgfCB8IHwgfAotICogfCB8IHwgfCB8IHwgKy0rLS0tLS0tLS0gQUMgcXVldWUgKDAtMykKLSAqIHwgfCB8IHwgfCB8Ci0gKiB8ICstKy0rLSstKy0tLS0tLS0tLS0tLSBIVyBxdWV1ZSBJRAotICogfAotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW51c2VkCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV9zZXRfc3dxX2lkKHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgdTggYWMsIHU4IGh3cSkKLXsKLQlCVUdfT04oYWMgPiAzKTsgICAvKiBvbmx5IGhhdmUgMiBiaXRzICovCi0JQlVHX09OKGh3cSA+IDMxKTsgLyogb25seSB1c2UgNSBiaXRzICovCi0KLQl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfd2FrZV9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKLQl1OCBhYyA9IHF1ZXVlICYgMzsKLQl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIHByaXYtPnF1ZXVlX3N0b3BwZWQpKQotCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJnByaXYtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA8PSAwKQotCQkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aHcsIGFjKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKLQl1OCBhYyA9IHF1ZXVlICYgMzsKLQl1OCBod3EgPSAocXVldWUgPj4gMikgJiAweDFmOwotCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgcHJpdi0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfaW5jX3JldHVybigmcHJpdi0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKLQkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCBhYyk7Ci19Ci0KLSNpZmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQotI3VuZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCi0jZW5kaWYKLQotI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV9zdG9wX3F1ZXVlCi0KLSNpZmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQotI3VuZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCi0jZW5kaWYKLQotI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBET19OT1RfVVNFX2llZWU4MDIxMV93YWtlX3F1ZXVlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY2xlYXJfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSB1Q29kZS9OSUMgdG8gaG9zdCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7Ci0KLQkvKiBhY2tub3dsZWRnZS9jbGVhci9yZXNldCBhbnkgaW50ZXJydXB0cyBzdGlsbCBwZW5kaW5nCi0JICogZnJvbSB1Q29kZSBvciBmbG93IGhhbmRsZXIgKFJ4L1R4IERNQSkgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweGZmZmZmZmZmKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JSVdMX0RFQlVHX0lTUihwcml2LCAiRGlzYWJsZWQgaW50ZXJydXB0c1xuIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2VuYWJsZV9yZmtpbGxfaW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfSVNSKHByaXYsICJFbmFibGluZyByZmtpbGwgaW50ZXJydXB0XG4iKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5UX01BU0ssIENTUl9JTlRfQklUX1JGX0tJTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JSVdMX0RFQlVHX0lTUihwcml2LCAiRW5hYmxpbmcgaW50ZXJydXB0c1xuIik7Ci0Jc2V0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgcHJpdi0+aW50YV9tYXNrKTsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93IC0gbWFzayBvZiBsb3dlciAzMiBiaXQgb2YgYmVhY29uIHRpbWUKLSAqIEBwcml2IC0tIHBvaW50ZXIgdG8gaXdsX3ByaXYgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB0c2ZfYml0cyAtLSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIHNoaWZ0IGZvciBtYXNraW5nKQotICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgdTE2IHRzZl9iaXRzKQotewotCXJldHVybiAoMSA8PCB0c2ZfYml0cykgLSAxOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19oaWdoIC0gbWFzayBvZiBoaWdoZXIgMzIgYml0IG9mIGJlYWNvbiB0aW1lCi0gKiBAcHJpdiAtLSBwb2ludGVyIHRvIGl3bF9wcml2IGRhdGEgc3RydWN0dXJlCi0gKiBAdHNmX2JpdHMgLS0gbnVtYmVyIG9mIGJpdHMgbmVlZCB0byBzaGlmdCBmb3IgbWFza2luZykKLSAqLwotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2hpZ2goc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgdTE2IHRzZl9iaXRzKQotewotCXJldHVybiAoKDEgPDwgKDMyIC0gdHNmX2JpdHMpKSAtIDEpIDw8IHRzZl9iaXRzOwotfQotCi0jZW5kaWYJCQkJLyogX19pd2xfbGVnYWN5X2hlbHBlcnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2M1ZDM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1pby5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2lvX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfaW9faF9fCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1kZXZ0cmFjZS5oIgotCi0vKgotICogSU8sIHJlZ2lzdGVyLCBhbmQgTklDIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCi0gKgotICogTk9URSBvbiBuYW1pbmcgY29udmVudGlvbiBhbmQgbWFjcm8gdXNhZ2UgZm9yIHRoZXNlCi0gKgotICogQSBzaW5nbGUgXyBwcmVmaXggYmVmb3JlIGEgYW4gYWNjZXNzIGZ1bmN0aW9uIG1lYW5zIHRoYXQgbm8gc3RhdGUKLSAqIGNoZWNrIG9yIGRlYnVnIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgd2hlbiB0aGF0IGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqCi0gKiBBIGRvdWJsZSBfXyBwcmVmaXggYmVmb3JlIGFuIGFjY2VzcyBmdW5jdGlvbiBtZWFucyB0aGF0IHN0YXRlIGlzIGNoZWNrZWQKLSAqIGFuZCB0aGUgY3VycmVudCBsaW5lIG51bWJlciBhbmQgY2FsbGVyIGZ1bmN0aW9uIG5hbWUgYXJlIHByaW50ZWQgaW4gYWRkaXRpb24KLSAqIHRvIGFueSBvdGhlciBkZWJ1ZyBvdXRwdXQuCi0gKgotICogVGhlIG5vbi1wcmVmaXhlZCBuYW1lIGlzIHRoZSAjZGVmaW5lIHRoYXQgbWFwcyB0aGUgY2FsbGVyIGludG8gYQotICogI2RlZmluZSB0aGF0IHByb3ZpZGVzIHRoZSBjYWxsZXIncyBuYW1lIGFuZCBfX0xJTkVfXyB0byB0aGUgZG91YmxlCi0gKiBwcmVmaXggdmVyc2lvbi4KLSAqCi0gKiBJZiB5b3Ugd2lzaCB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRob3V0IGFueSBkZWJ1ZyBvciBzdGF0ZSBjaGVja2luZywKLSAqIHlvdSBzaG91bGQgdXNlIHRoZSBzaW5nbGUgXyBwcmVmaXggdmVyc2lvbiAoYXMgaXMgdXNlZCBieSBkZXBlbmRlbnQgSU8KLSAqIHJvdXRpbmVzLCBmb3IgZXhhbXBsZSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyIGNhbGxzIHRoZSBub24tY2hlY2sgdmVyc2lvbiBvZgotICogX2l3bF9sZWdhY3lfcmVhZDMyLikKLSAqCi0gKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlICpleHRyZW1lbHkqIHVzZWZ1bCBpbiBxdWlja2x5IGlzb2xhdGluZyBjb2RlIGRlbHRhcwotICogd2hpY2ggcmVzdWx0IGluIG1pc2NvbmZpZ3VyYXRpb24gb2YgdGhlIGhhcmR3YXJlIEkvTy4gIEluIGNvbWJpbmF0aW9uIHdpdGgKLSAqIGdpdC1iaXNlY3QgYW5kIHRoZSBJTyBkZWJ1ZyBsZXZlbCB5b3UgY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYwotICogY29tbWl0IHdoaWNoIGJyZWFrcyB0aGUgSU8gc2VxdWVuY2UgdG8gdGhlIGhhcmR3YXJlLgotICoKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfd3JpdGU4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcywgdTggdmFsKQotewotCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlOChwcml2LCBvZnMsIHZhbCk7Ci0JaW93cml0ZTgodmFsLCBwcml2LT5od19iYXNlICsgb2ZzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB2b2lkCi1fX2l3bF9sZWdhY3lfd3JpdGU4KGNvbnN0IGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHUzMiBvZnMsIHU4IHZhbCkKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgIndyaXRlOCgweCUwOFgsIDB4JTAyWCkgLSAlcyAlZFxuIiwgb2ZzLCB2YWwsIGYsIGwpOwotCV9pd2xfbGVnYWN5X3dyaXRlOChwcml2LCBvZnMsIHZhbCk7Ci19Ci0jZGVmaW5lIGl3bF93cml0ZTgocHJpdiwgb2ZzLCB2YWwpIFwKLQlfX2l3bF9sZWdhY3lfd3JpdGU4KF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgb2ZzLCB2YWwpCi0jZWxzZQotI2RlZmluZSBpd2xfd3JpdGU4KHByaXYsIG9mcywgdmFsKSBfaXdsX2xlZ2FjeV93cml0ZTgocHJpdiwgb2ZzLCB2YWwpCi0jZW5kaWYKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfd3JpdGUzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMsIHUzMiB2YWwpCi17Ci0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGUzMihwcml2LCBvZnMsIHZhbCk7Ci0JaW93cml0ZTMyKHZhbCwgcHJpdi0+aHdfYmFzZSArIG9mcyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pd2xfbGVnYWN5X3dyaXRlMzIoY29uc3QgY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgdTMyIG9mcywgdTMyIHZhbCkKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgIndyaXRlMzIoMHglMDhYLCAweCUwOFgpIC0gJXMgJWRcbiIsIG9mcywgdmFsLCBmLCBsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIG9mcywgdmFsKTsKLX0KLSNkZWZpbmUgaXdsX3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpIFwKLQlfX2l3bF9sZWdhY3lfd3JpdGUzMihfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIG9mcywgdmFsKQotI2Vsc2UKLSNkZWZpbmUgaXdsX3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpIF9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgX2l3bF9sZWdhY3lfcmVhZDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcykKLXsKLQl1MzIgdmFsID0gaW9yZWFkMzIocHJpdi0+aHdfYmFzZSArIG9mcyk7Ci0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2lvcmVhZDMyKHByaXYsIG9mcywgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHUzMgotX19pd2xfbGVnYWN5X3JlYWQzMihjaGFyICpmLCB1MzIgbCwgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZzKQotewotCUlXTF9ERUJVR19JTyhwcml2LCAicmVhZF9kaXJlY3QzMigweCUwOFgpIC0gJXMgJWRcbiIsIG9mcywgZiwgbCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBvZnMpOwotfQotI2RlZmluZSBpd2xfcmVhZDMyKHByaXYsIG9mcykgX19pd2xfbGVnYWN5X3JlYWQzMihfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIG9mcykKLSNlbHNlCi0jZGVmaW5lIGl3bF9yZWFkMzIocCwgbykgX2l3bF9sZWdhY3lfcmVhZDMyKHAsIG8pCi0jZW5kaWYKLQotI2RlZmluZSBJV0xfUE9MTF9JTlRFUlZBTCAxMAkvKiBtaWNyb3NlY29uZHMgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1faXdsX2xlZ2FjeV9wb2xsX2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCXUzMiBiaXRzLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHQgPSAwOwotCi0JZG8gewotCQlpZiAoKF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBhZGRyKSAmIG1hc2spID09IChiaXRzICYgbWFzaykpCi0JCQlyZXR1cm4gdDsKLQkJdWRlbGF5KElXTF9QT0xMX0lOVEVSVkFMKTsKLQkJdCArPSBJV0xfUE9MTF9JTlRFUlZBTDsKLQl9IHdoaWxlICh0IDwgdGltZW91dCk7Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgaW50IF9faXdsX2xlZ2FjeV9wb2xsX2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYWRkciwKLQkJCQkgdTMyIGJpdHMsIHUzMiBtYXNrLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgcmV0ID0gX2l3bF9sZWdhY3lfcG9sbF9iaXQocHJpdiwgYWRkciwgYml0cywgbWFzaywgdGltZW91dCk7Ci0JSVdMX0RFQlVHX0lPKHByaXYsICJwb2xsX2JpdCgweCUwOFgsIDB4JTA4WCwgMHglMDhYKSAtICVzLSAlcyAlZFxuIiwKLQkJICAgICBhZGRyLCBiaXRzLCBtYXNrLAotCQkgICAgIHVubGlrZWx5KHJldCAgPT0gLUVUSU1FRE9VVCkgPyAidGltZW91dCIgOiAiIiwgZiwgbCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNkZWZpbmUgaXdsX3BvbGxfYml0KHByaXYsIGFkZHIsIGJpdHMsIG1hc2ssIHRpbWVvdXQpIFwKLQlfX2l3bF9sZWdhY3lfcG9sbF9iaXQoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCBhZGRyLCBcCi0JYml0cywgbWFzaywgdGltZW91dCkKLSNlbHNlCi0jZGVmaW5lIGl3bF9wb2xsX2JpdChwLCBhLCBiLCBtLCB0KSBfaXdsX2xlZ2FjeV9wb2xsX2JpdChwLCBhLCBiLCBtLCB0KQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV9zZXRfYml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCByZWcsIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpIHwgbWFzayk7Ci19Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pd2xfbGVnYWN5X3NldF9iaXQoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JdTMyIHZhbCA9IF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpIHwgbWFzazsKLQlJV0xfREVCVUdfSU8ocHJpdiwgInNldF9iaXQoMHglMDhYLCAweCUwOFgpID0gMHglMDhYXG4iLCByZWcsCi0JCQkJCQkJbWFzaywgdmFsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9iaXQoc3RydWN0IGl3bF9wcml2ICpwLCB1MzIgciwgdTMyIG0pCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JX19pd2xfbGVnYWN5X3NldF9iaXQoX19GSUxFX18sIF9fTElORV9fLCBwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9zZXRfYml0KHN0cnVjdCBpd2xfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCV9pd2xfbGVnYWN5X3NldF9iaXQocCwgciwgbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkCi1faXdsX2xlZ2FjeV9jbGVhcl9iaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgJiB+bWFzayk7Ci19Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXdsX2xlZ2FjeV9jbGVhcl9iaXQoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJICAgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1MzIgdmFsID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgJiB+bWFzazsKLQlJV0xfREVCVUdfSU8ocHJpdiwgImNsZWFyX2JpdCgweCUwOFgsIDB4JTA4WCkgPSAweCUwOFhcbiIsIHJlZywgbWFzaywgdmFsKTsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2NsZWFyX2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlfX2l3bF9sZWdhY3lfY2xlYXJfYml0KF9fRklMRV9fLCBfX0xJTkVfXywgcCwgciwgbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfYml0KHN0cnVjdCBpd2xfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCV9pd2xfbGVnYWN5X2NsZWFyX2JpdChwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBfaXdsX2xlZ2FjeV9ncmFiX25pY19hY2Nlc3Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0JdTMyIHZhbDsKLQotCS8qIHRoaXMgYml0IHdha2VzIHVwIHRoZSBOSUMgKi8KLQlfaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCi0JLyoKLQkgKiBUaGVzZSBiaXRzIHNheSB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcsIGFuZCBzaG91bGQga2VlcCBydW5uaW5nIGZvcgotCSAqIGF0IGxlYXN0IGEgc2hvcnQgd2hpbGUgKGF0IGxlYXN0IGFzIGxvbmcgYXMgTUFDX0FDQ0VTU19SRVEgc3RheXMgMSksCi0JICogYnV0IHRoZXkgZG8gbm90IGluZGljYXRlIHRoYXQgZW1iZWRkZWQgU1JBTSBpcyByZXN0b3JlZCB5ZXQ7Ci0JICogMzk0NSBhbmQgNDk2NSBoYXZlIHZvbGF0aWxlIFNSQU0sIGFuZCBtdXN0IHNhdmUvcmVzdG9yZSBjb250ZW50cwotCSAqIHRvL2Zyb20gaG9zdCBEUkFNIHdoZW4gc2xlZXBpbmcvd2FraW5nIGZvciBwb3dlci1zYXZpbmcuCi0JICogRWFjaCBkaXJlY3Rpb24gdGFrZXMgYXBwcm94aW1hdGVseSAxLzQgbWlsbGlzZWNvbmQ7IHdpdGggdGhpcwotCSAqIG92ZXJoZWFkLCBpdCdzIGEgZ29vZCBpZGVhIHRvIGdyYWIgYW5kIGhvbGQgTUFDX0FDQ0VTU19SRVFVRVNUIGlmIGEKLQkgKiBzZXJpZXMgb2YgcmVnaXN0ZXIgYWNjZXNzZXMgYXJlIGV4cGVjdGVkIChlLmcuIHJlYWRpbmcgRXZlbnQgTG9nKSwKLQkgKiB0byBrZWVwIGRldmljZSBmcm9tIHNsZWVwaW5nLgotCSAqCi0JICogQ1NSX1VDT0RFX0RSVl9HUDEgcmVnaXN0ZXIgYml0IE1BQ19TTEVFUCA9PSAwIGluZGljYXRlcyB0aGF0Ci0JICogU1JBTSBpcyBva2F5L3Jlc3RvcmVkLiAgV2UgZG9uJ3QgY2hlY2sgdGhhdCBoZXJlIGJlY2F1c2UgdGhpcyBjYWxsCi0JICogaXMganVzdCBmb3IgaGFyZHdhcmUgcmVnaXN0ZXIgYWNjZXNzOyBidXQgR1AxIE1BQ19TTEVFUCBjaGVjayBpcyBhCi0JICogZ29vZCBpZGVhIGJlZm9yZSBhY2Nlc3NpbmcgMzk0NS80OTY1IFNSQU0gKGUuZy4gcmVhZGluZyBFdmVudCBMb2cpLgotCSAqCi0JICovCi0JcmV0ID0gX2l3bF9sZWdhY3lfcG9sbF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJICAgQ1NSX0dQX0NOVFJMX1JFR19WQUxfTUFDX0FDQ0VTU19FTiwKLQkJCSAgIChDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZIHwKLQkJCSAgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfR09JTkdfVE9fU0xFRVApLCAxNTAwMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJdmFsID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCk7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJNQUMgaXMgaW4gZGVlcCBzbGVlcCEuICBDU1JfR1BfQ05UUkwgPSAweCUwOFhcbiIsIHZhbCk7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULAotCQkJCUNTUl9SRVNFVF9SRUdfRkxBR19GT1JDRV9OTUkpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSBpbnQgX19pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2Vzcyhjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkJICAgICAgIHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfSU8ocHJpdiwgImdyYWJiaW5nIG5pYyBhY2Nlc3MgLSAlcyAlZFxuIiwgZiwgbCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLX0KLSNkZWZpbmUgaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSBcCi0JX19pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2VzcyhfX0ZJTEVfXywgX19MSU5FX18sIHByaXYpCi0jZWxzZQotI2RlZmluZSBpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpIFwKLQlfaXdsX2xlZ2FjeV9ncmFiX25pY19hY2Nlc3MocHJpdikKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKGNvbnN0IGNoYXIgKmYsIHUzMiBsLAotCQkJCQkgICAgc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCi0JSVdMX0RFQlVHX0lPKHByaXYsICJyZWxlYXNpbmcgbmljIGFjY2VzcyAtICVzICVkXG4iLCBmLCBsKTsKLQlfaXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci19Ci0jZGVmaW5lIGl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdikgXAotCV9faXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MoX19GSUxFX18sIF9fTElORV9fLCBwcml2KQotI2Vsc2UKLSNkZWZpbmUgaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KSBcCi0JX2l3bF9sZWdhY3lfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCByZWcpOwotfQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB1MzIgX19pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQl1MzIgdmFsdWUgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIHJlZyk7Ci0JSVdMX0RFQlVHX0lPKHByaXYsCi0JCQkicmVhZF9kaXJlY3QzMigweCU0WCkgPSAweCUwOHggLSAlcyAlZFxuIiwgcmVnLCB2YWx1ZSwKLQkJICAgICBmLCBsKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnKQotewotCXUzMiB2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCXZhbHVlID0gX19pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCByZWcpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQl1MzIgdmFsdWU7Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQl2YWx1ZSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgcmVnKTsKLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCXJldHVybiB2YWx1ZTsKLQotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSB1MzIgcmVnLCB1MzIgdmFsdWUpCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCByZWcsIHZhbHVlKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpZiAoIWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdikpIHsKLQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgcmVnLCB2YWx1ZSk7Ci0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV93cml0ZV9yZWdfYnVmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgICAgIHUzMiByZWcsIHUzMiBsZW4sIHUzMiAqdmFsdWVzKQotewotCXUzMiBjb3VudCA9IHNpemVvZih1MzIpOwotCi0JaWYgKChwcml2ICE9IE5VTEwpICYmICh2YWx1ZXMgIT0gTlVMTCkpIHsKLQkJZm9yICg7IDAgPCBsZW47IGxlbiAtPSBjb3VudCwgcmVnICs9IGNvdW50LCB2YWx1ZXMrKykKLQkJCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgcmVnLCAqdmFsdWVzKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCSAgICAgICB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHQgPSAwOwotCi0JZG8gewotCQlpZiAoKGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBhZGRyKSAmIG1hc2spID09IG1hc2spCi0JCQlyZXR1cm4gdDsKLQkJdWRlbGF5KElXTF9QT0xMX0lOVEVSVkFMKTsKLQkJdCArPSBJV0xfUE9MTF9JTlRFUlZBTDsKLQl9IHdoaWxlICh0IDwgdGltZW91dCk7Ci0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSBpbnQgX19pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkJICAgIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHUzMiBhZGRyLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCi17Ci0JaW50IHJldCAgPSBfaXdsX2xlZ2FjeV9wb2xsX2RpcmVjdF9iaXQocHJpdiwgYWRkciwgbWFzaywgdGltZW91dCk7Ci0KLQlpZiAodW5saWtlbHkocmV0ID09IC1FVElNRURPVVQpKQotCQlJV0xfREVCVUdfSU8ocHJpdiwgInBvbGxfZGlyZWN0X2JpdCgweCUwOFgsIDB4JTA4WCkgLSAiCi0JCQkgICAgICJ0aW1lZG91dCAtICVzICVkXG4iLCBhZGRyLCBtYXNrLCBmLCBsKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTyhwcml2LCAicG9sbF9kaXJlY3RfYml0KDB4JTA4WCwgMHglMDhYKSA9IDB4JTA4WCAiCi0JCQkgICAgICItICVzICVkXG4iLCBhZGRyLCBtYXNrLCByZXQsIGYsIGwpOwotCXJldHVybiByZXQ7Ci19Ci0jZGVmaW5lIGl3bF9wb2xsX2RpcmVjdF9iaXQocHJpdiwgYWRkciwgbWFzaywgdGltZW91dCkgXAotX19pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIGFkZHIsIG1hc2ssIHRpbWVvdXQpCi0jZWxzZQotI2RlZmluZSBpd2xfcG9sbF9kaXJlY3RfYml0IF9pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdAotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdTMyIF9pd2xfbGVnYWN5X3JlYWRfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1BSUEhfUkFERFIsIHJlZyB8ICgzIDw8IDI0KSk7Ci0Jcm1iKCk7Ci0JcmV0dXJuIF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1BSUEhfUkRBVCk7Ci19Ci1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X3JlYWRfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0JdTMyIHZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCByZWcpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9pd2xfbGVnYWN5X3dyaXRlX3BycGgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgIHUzMiBhZGRyLCB1MzIgdmFsKQotewotCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19QUlBIX1dBRERSLAotCQkJICAgICAgKChhZGRyICYgMHgwMDAwRkZGRikgfCAoMyA8PCAyNCkpKTsKLQl3bWIoKTsKLQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfUFJQSF9XREFULCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWl3bF9sZWdhY3lfd3JpdGVfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkgewotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIGFkZHIsIHZhbCk7Ci0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi0jZGVmaW5lIF9pd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgcmVnLCBtYXNrKSBcCi1faXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZywgKF9pd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCByZWcpIHwgbWFzaykpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQlfaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIHJlZywgbWFzayk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotI2RlZmluZSBfaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgcmVnLCBiaXRzLCBtYXNrKSBcCi1faXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZywJCQkJXAotCQkgKChfaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKSAmIG1hc2spIHwgYml0cykpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9iaXRzX21hc2tfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsCi0JCQkJdTMyIGJpdHMsIHUzMiBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JX2l3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIHJlZywgYml0cywgbWFzayk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHN0cnVjdCBpd2xfcHJpdgotCQkJCQkJICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQl1MzIgdmFsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JdmFsID0gX2l3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIHJlZyk7Ci0JX2l3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCByZWcsICh2YWwgJiB+bWFzaykpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCXUzMiB2YWx1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCi0JX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwgYWRkcik7Ci0Jcm1iKCk7Ci0JdmFsdWUgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0KLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpKSB7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fV0FERFIsIGFkZHIpOwotCQl3bWIoKTsKLQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9XREFULCB2YWwpOwotCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtX2J1ZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCQkgIHUzMiBsZW4sIHUzMiAqdmFsdWVzKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkgewotCQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1dBRERSLCBhZGRyKTsKLQkJd21iKCk7Ci0JCWZvciAoOyAwIDwgbGVuOyBsZW4gLT0gc2l6ZW9mKHUzMiksIHZhbHVlcysrKQotCQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwKLQkJCQkJSEJVU19UQVJHX01FTV9XREFULCAqdmFsdWVzKTsKLQotCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzU2OGE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotCi0vKiBkZWZhdWx0OiBJV0xfTEVEX0JMSU5LKDApIHVzaW5nIGJsaW5raW5nIGluZGV4IHRhYmxlICovCi1zdGF0aWMgaW50IGxlZF9tb2RlOwotbW9kdWxlX3BhcmFtKGxlZF9tb2RlLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhsZWRfbW9kZSwgIjA9c3lzdGVtIGRlZmF1bHQsICIKLQkJIjE9T24oUkYgT24pL09mZihSRiBPZmYpLCAyPWJsaW5raW5nIik7Ci0KLS8qIFRocm91Z2hwdXQJCU9GRiB0aW1lKG1zKQlPTiB0aW1lIChtcykKLSAqCT4zMDAJCQkyNQkJMjUKLSAqCT4yMDAgdG8gMzAwCQk0MAkJNDAKLSAqCT4xMDAgdG8gMjAwCQk1NQkJNTUKLSAqCT43MCB0byAxMDAJCTY1CQk2NQotICoJPjUwIHRvIDcwCQk3NQkJNzUKLSAqCT4yMCB0byA1MAkJODUJCTg1Ci0gKgk+MTAgdG8gMjAJCTk1CQk5NQotICoJPjUgdG8gMTAJCTExMAkJMTEwCi0gKgk+MSB0byA1CQkJMTMwCQkxMzAKLSAqCT4wIHRvIDEJCQkxNjcJCTE2NwotICoJPD0wCQkJCQlTT0xJRCBPTgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90cHRfYmxpbmsgaXdsX2JsaW5rW10gPSB7Ci0JeyAudGhyb3VnaHB1dCA9IDAsIC5ibGlua190aW1lID0gMzM0IH0sCi0JeyAudGhyb3VnaHB1dCA9IDEgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSAyNjAgfSwKLQl7IC50aHJvdWdocHV0ID0gNSAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDIyMCB9LAotCXsgLnRocm91Z2hwdXQgPSAxMCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE5MCB9LAotCXsgLnRocm91Z2hwdXQgPSAyMCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE3MCB9LAotCXsgLnRocm91Z2hwdXQgPSA1MCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDE1MCB9LAotCXsgLnRocm91Z2hwdXQgPSA3MCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDEzMCB9LAotCXsgLnRocm91Z2hwdXQgPSAxMDAgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSAxMTAgfSwKLQl7IC50aHJvdWdocHV0ID0gMjAwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gODAgfSwKLQl7IC50aHJvdWdocHV0ID0gMzAwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gNTAgfSwKLX07Ci0KLS8qCi0gKiBBZGp1c3QgbGVkIGJsaW5rIHJhdGUgdG8gY29tcGVuc2F0ZSBvbiBhIE1BQyBDbG9jayBkaWZmZXJlbmNlIG9uIGV2ZXJ5IEhXCi0gKiBMZWQgYmxpbmsgcmF0ZSBhbmFseXNpcyBzaG93ZWQgYW4gYXZlcmFnZSBkZXZpYXRpb24gb2YgMCUgb24gMzk0NSwKLSAqIDUlIG9uIDQ5NjUgSFcuCi0gKiBOZWVkIHRvIGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nIHRvIHRoZSBkZXZpYXRpb24KLSAqIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeQotICogVGhlIGNhbGN1bGF0aW9uIGlzOiAoMTAwLWF2ZXJhZ2VEZXZpYXRpb24pLzEwMCAqIGJsaW5rVGltZQotICogRm9yIGNvZGUgZWZmaWNpZW5jeSB0aGUgY2FsY3VsYXRpb24gd2lsbCBiZToKLSAqICAgICBjb21wZW5zYXRpb24gPSAoMTAwIC0gYXZlcmFnZURldmlhdGlvbikgKiA2NCAvIDEwMAotICogICAgIE5ld0JsaW5rVGltZSA9IChjb21wZW5zYXRpb24gKiBCbGlua1RpbWUpIC8gNjQKLSAqLwotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2JsaW5rX2NvbXBlbnNhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHU4IHRpbWUsIHUxNiBjb21wZW5zYXRpb24pCi17Ci0JaWYgKCFjb21wZW5zYXRpb24pIHsKLQkJSVdMX0VSUihwcml2LCAidW5kZWZpbmVkIGJsaW5rIGNvbXBlbnNhdGlvbjogIgotCQkJInVzZSBwcmUtZGVmaW5lZCBibGlua2luZyB0aW1lXG4iKTsKLQkJcmV0dXJuIHRpbWU7Ci0JfQotCi0JcmV0dXJuICh1OCkoKHRpbWUgKiBjb21wZW5zYXRpb24pID4+IDYpOwotfQotCi0vKiBTZXQgbGVkIHBhdHRlcm4gY29tbWFuZCAqLwotc3RhdGljIGludCBpd2xfbGVnYWN5X2xlZF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBvbiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2ZmKQotewotCXN0cnVjdCBpd2xfbGVkX2NtZCBsZWRfY21kID0gewotCQkuaWQgPSBJV0xfTEVEX0xJTkssCi0JCS5pbnRlcnZhbCA9IElXTF9ERUZfTEVEX0lOVFJWTAotCX07Ci0JaW50IHJldDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmIChwcml2LT5ibGlua19vbiA9PSBvbiAmJiBwcml2LT5ibGlua19vZmYgPT0gb2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChvZmYgPT0gMCkgewotCQkvKiBsZWQgaXMgU09MSURfT04gKi8KLQkJb24gPSBJV0xfTEVEX1NPTElEOwotCX0KLQotCUlXTF9ERUJVR19MRUQocHJpdiwgIkxlZCBibGluayB0aW1lIGNvbXBlbnNhdGlvbj0ldVxuIiwKLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOwotCWxlZF9jbWQub24gPSBpd2xfbGVnYWN5X2JsaW5rX2NvbXBlbnNhdGlvbihwcml2LCBvbiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKLQlsZWRfY21kLm9mZiA9IGl3bF9sZWdhY3lfYmxpbmtfY29tcGVuc2F0aW9uKHByaXYsIG9mZiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKLQotCXJldCA9IHByaXYtPmNmZy0+b3BzLT5sZWQtPmNtZChwcml2LCAmbGVkX2NtZCk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJpdi0+Ymxpbmtfb24gPSBvbjsKLQkJcHJpdi0+Ymxpbmtfb2ZmID0gb2ZmOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCQkgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgaXdsX3ByaXYsIGxlZCk7Ci0JdW5zaWduZWQgbG9uZyBvbiA9IDA7Ci0KLQlpZiAoYnJpZ2h0bmVzcyA+IDApCi0JCW9uID0gSVdMX0xFRF9TT0xJRDsKLQotCWl3bF9sZWdhY3lfbGVkX2NtZChwcml2LCBvbiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9sZWRfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAotCQkJICAgICB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGl3bF9wcml2LCBsZWQpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfbGVkX2NtZChwcml2LCAqZGVsYXlfb24sICpkZWxheV9vZmYpOwotfQotCi12b2lkIGl3bF9sZWdhY3lfbGVkc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgbW9kZSA9IGxlZF9tb2RlOwotCWludCByZXQ7Ci0KLQlpZiAobW9kZSA9PSBJV0xfTEVEX0RFRkFVTFQpCi0JCW1vZGUgPSBwcml2LT5jZmctPmxlZF9tb2RlOwotCi0JcHJpdi0+bGVkLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLWxlZCIsCi0JCQkJICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKLQlwcml2LT5sZWQuYnJpZ2h0bmVzc19zZXQgPSBpd2xfbGVnYWN5X2xlZF9icmlnaHRuZXNzX3NldDsKLQlwcml2LT5sZWQuYmxpbmtfc2V0ID0gaXdsX2xlZ2FjeV9sZWRfYmxpbmtfc2V0OwotCXByaXYtPmxlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIElXTF9MRURfREVGQVVMVDoKLQkJV0FSTl9PTigxKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfTEVEX0JMSU5LOgotCQlwcml2LT5sZWQuZGVmYXVsdF90cmlnZ2VyID0KLQkJCWllZWU4MDIxMV9jcmVhdGVfdHB0X2xlZF90cmlnZ2VyKHByaXYtPmh3LAotCQkJCQlJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfQ09OTkVDVEVELAotCQkJCQlpd2xfYmxpbmssIEFSUkFZX1NJWkUoaXdsX2JsaW5rKSk7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0xFRF9SRl9TVEFURToKLQkJcHJpdi0+bGVkLmRlZmF1bHRfdHJpZ2dlciA9Ci0JCQlpZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKHByaXYtPmh3KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwcml2LT5wY2lfZGV2LT5kZXYsICZwcml2LT5sZWQpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUocHJpdi0+bGVkLm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+bGVkX3JlZ2lzdGVyZWQgPSB0cnVlOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2xlZHNfaW5pdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9sZWRzX2V4aXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmICghcHJpdi0+bGVkX3JlZ2lzdGVyZWQpCi0JCXJldHVybjsKLQotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZwcml2LT5sZWQpOwotCWtmcmVlKHByaXYtPmxlZC5uYW1lKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9sZWRzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc5MWY3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9sZWRzX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfbGVkc19oX18KLQotCi1zdHJ1Y3QgaXdsX3ByaXY7Ci0KLSNkZWZpbmUgSVdMX0xFRF9TT0xJRCAxMQotI2RlZmluZSBJV0xfREVGX0xFRF9JTlRSVkwgY3B1X3RvX2xlMzIoMTAwMCkKLQotI2RlZmluZSBJV0xfTEVEX0FDVElWSVRZICAgICAgICgwPDwxKQotI2RlZmluZSBJV0xfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQotCi0vKgotICogTEVEIG1vZGUKLSAqICAgIElXTF9MRURfREVGQVVMVDogIHVzZSBkZXZpY2UgZGVmYXVsdAotICogICAgSVdMX0xFRF9SRl9TVEFURTogdHVybiBMRUQgb24vb2ZmIGJhc2VkIG9uIFJGIHN0YXRlCi0gKgkJCUxFRCBPTiAgPSBSRiBPTgotICoJCQlMRUQgT0ZGID0gUkYgT0ZGCi0gKiAgICBJV0xfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKLSAqLwotZW51bSBpd2xfbGVkX21vZGUgewotCUlXTF9MRURfREVGQVVMVCwKLQlJV0xfTEVEX1JGX1NUQVRFLAotCUlXTF9MRURfQkxJTkssCi19OwotCi12b2lkIGl3bF9sZWdhY3lfbGVkc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfbGVkc19leGl0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLSNlbmRpZiAvKiBfX2l3bF9sZWdhY3lfbGVkc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWdhY3ktcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWdhY3ktcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2NDdlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVnYWN5LXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X3JzX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfcnNfaF9fCi0KLXN0cnVjdCBpd2xfcmF0ZV9pbmZvIHsKLQl1OCBwbGNwOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV82TV9QTENQLCBldGMuICovCi0JdTggcGxjcF9zaXNvOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV9TSVNPXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBwbGNwX21pbW8yOwkvKiB1Q29kZSBBUEk6ICBJV0xfUkFURV9NSU1PMl82TV9QTENQLCBldGMuICovCi0JdTggaWVlZTsJLyogTUFDIGhlYWRlcjogIElXTF9SQVRFXzZNX0lFRUUsIGV0Yy4gKi8KLQl1OCBwcmV2X2llZWU7ICAgIC8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KLQl1OCBuZXh0X2llZWU7ICAgIC8qIG5leHQgcmF0ZSBpbiBJRUVFIHNwZWVkcyAqLwotCXU4IHByZXZfcnM7ICAgICAgLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBuZXh0X3JzOyAgICAgIC8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBwcmV2X3JzX3RnZzsgIC8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotCXU4IG5leHRfcnNfdGdnOyAgLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KLX07Ci0KLXN0cnVjdCBpd2wzOTQ1X3JhdGVfaW5mbyB7Ci0JdTggcGxjcDsJCS8qIHVDb2RlIEFQSTogIElXTF9SQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBpZWVlOwkJLyogTUFDIGhlYWRlcjogIElXTF9SQVRFXzZNX0lFRUUsIGV0Yy4gKi8KLQl1OCBwcmV2X2llZWU7CQkvKiBwcmV2aW91cyByYXRlIGluIElFRUUgc3BlZWRzICovCi0JdTggbmV4dF9pZWVlOwkJLyogbmV4dCByYXRlIGluIElFRUUgc3BlZWRzICovCi0JdTggcHJldl9yczsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBycyBhbGdvICovCi0JdTggbmV4dF9yczsJCS8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBwcmV2X3JzX3RnZzsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotCXU4IG5leHRfcnNfdGdnOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KLQl1OCB0YWJsZV9yc19pbmRleDsJLyogaW5kZXggaW4gcmF0ZSBzY2FsZSB0YWJsZSBjbWQgKi8KLQl1OCBwcmV2X3RhYmxlX3JzOwkvKiBwcmV2IGluIHJhdGUgdGFibGUgY21kICovCi19OwotCi0KLS8qCi0gKiBUaGVzZSBzZXJ2ZSBhcyBpbmRleGVzIGludG8KLSAqIHN0cnVjdCBpd2xfcmF0ZV9pbmZvIGl3bGVnYWN5X3JhdGVzW0lXTF9SQVRFX0NPVU5UXTsKLSAqLwotZW51bSB7Ci0JSVdMX1JBVEVfMU1fSU5ERVggPSAwLAotCUlXTF9SQVRFXzJNX0lOREVYLAotCUlXTF9SQVRFXzVNX0lOREVYLAotCUlXTF9SQVRFXzExTV9JTkRFWCwKLQlJV0xfUkFURV82TV9JTkRFWCwKLQlJV0xfUkFURV85TV9JTkRFWCwKLQlJV0xfUkFURV8xMk1fSU5ERVgsCi0JSVdMX1JBVEVfMThNX0lOREVYLAotCUlXTF9SQVRFXzI0TV9JTkRFWCwKLQlJV0xfUkFURV8zNk1fSU5ERVgsCi0JSVdMX1JBVEVfNDhNX0lOREVYLAotCUlXTF9SQVRFXzU0TV9JTkRFWCwKLQlJV0xfUkFURV82ME1fSU5ERVgsCi0JSVdMX1JBVEVfQ09VTlQsCi0JSVdMX1JBVEVfQ09VTlRfTEVHQUNZID0gSVdMX1JBVEVfQ09VTlQgLSAxLAkvKiBFeGNsdWRpbmcgNjBNICovCi0JSVdMX1JBVEVfQ09VTlRfMzk0NSA9IElXTF9SQVRFX0NPVU5UIC0gMSwKLQlJV0xfUkFURV9JTlZNX0lOREVYID0gSVdMX1JBVEVfQ09VTlQsCi0JSVdMX1JBVEVfSU5WQUxJRCA9IElXTF9SQVRFX0NPVU5ULAotfTsKLQotZW51bSB7Ci0JSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEUgPSAwLAotCUlXTF9SQVRFXzlNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV8xOE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMjRNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzM2TV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV80OE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfNTRNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzFNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzJNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzVNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzExTV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV9JTlZNX0lOREVYX1RBQkxFID0gSVdMX1JBVEVfSU5WTV9JTkRFWCAtIDEsCi19OwotCi1lbnVtIHsKLQlJV0xfRklSU1RfT0ZETV9SQVRFID0gSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMMzlfTEFTVF9PRkRNX1JBVEUgPSBJV0xfUkFURV81NE1fSU5ERVgsCi0JSVdMX0xBU1RfT0ZETV9SQVRFID0gSVdMX1JBVEVfNjBNX0lOREVYLAotCUlXTF9GSVJTVF9DQ0tfUkFURSA9IElXTF9SQVRFXzFNX0lOREVYLAotCUlXTF9MQVNUX0NDS19SQVRFID0gSVdMX1JBVEVfMTFNX0lOREVYLAotfTsKLQotLyogI2RlZmluZSB2cy4gZW51bSB0byBrZWVwIGZyb20gZGVmYXVsdGluZyB0byAnbGFyZ2UgaW50ZWdlcicgKi8KLSNkZWZpbmUJSVdMX1JBVEVfNk1fTUFTSyAgICgxIDw8IElXTF9SQVRFXzZNX0lOREVYKQotI2RlZmluZQlJV0xfUkFURV85TV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfOU1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzEyTV9NQVNLICAoMSA8PCBJV0xfUkFURV8xMk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzE4TV9NQVNLICAoMSA8PCBJV0xfUkFURV8xOE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzI0TV9NQVNLICAoMSA8PCBJV0xfUkFURV8yNE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzM2TV9NQVNLICAoMSA8PCBJV0xfUkFURV8zNk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzQ4TV9NQVNLICAoMSA8PCBJV0xfUkFURV80OE1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzU0TV9NQVNLICAoMSA8PCBJV0xfUkFURV81NE1fSU5ERVgpCi0jZGVmaW5lIElXTF9SQVRFXzYwTV9NQVNLICAoMSA8PCBJV0xfUkFURV82ME1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzFNX01BU0sgICAoMSA8PCBJV0xfUkFURV8xTV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMk1fTUFTSyAgICgxIDw8IElXTF9SQVRFXzJNX0lOREVYKQotI2RlZmluZQlJV0xfUkFURV81TV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfNU1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzExTV9NQVNLICAoMSA8PCBJV0xfUkFURV8xMU1fSU5ERVgpCi0KLS8qIHVDb2RlIEFQSSB2YWx1ZXMgZm9yIGxlZ2FjeSBiaXQgcmF0ZXMsIGJvdGggT0ZETSBhbmQgQ0NLICovCi1lbnVtIHsKLQlJV0xfUkFURV82TV9QTENQICA9IDEzLAotCUlXTF9SQVRFXzlNX1BMQ1AgID0gMTUsCi0JSVdMX1JBVEVfMTJNX1BMQ1AgPSA1LAotCUlXTF9SQVRFXzE4TV9QTENQID0gNywKLQlJV0xfUkFURV8yNE1fUExDUCA9IDksCi0JSVdMX1JBVEVfMzZNX1BMQ1AgPSAxMSwKLQlJV0xfUkFURV80OE1fUExDUCA9IDEsCi0JSVdMX1JBVEVfNTRNX1BMQ1AgPSAzLAotCUlXTF9SQVRFXzYwTV9QTENQID0gMywvKkZJWE1FOlJTOnNob3VsZCBiZSByZW1vdmVkKi8KLQlJV0xfUkFURV8xTV9QTENQICA9IDEwLAotCUlXTF9SQVRFXzJNX1BMQ1AgID0gMjAsCi0JSVdMX1JBVEVfNU1fUExDUCAgPSA1NSwKLQlJV0xfUkFURV8xMU1fUExDUCA9IDExMCwKLQkvKkZJWE1FOlJTOmFkZCBJV0xfUkFURV9MRUdBQ1lfSU5WTV9QTENQID0gMCwqLwotfTsKLQotLyogdUNvZGUgQVBJIHZhbHVlcyBmb3IgT0ZETSBoaWdoLXRocm91Z2hwdXQgKEhUKSBiaXQgcmF0ZXMgKi8KLWVudW0gewotCUlXTF9SQVRFX1NJU09fNk1fUExDUCA9IDAsCi0JSVdMX1JBVEVfU0lTT18xMk1fUExDUCA9IDEsCi0JSVdMX1JBVEVfU0lTT18xOE1fUExDUCA9IDIsCi0JSVdMX1JBVEVfU0lTT18yNE1fUExDUCA9IDMsCi0JSVdMX1JBVEVfU0lTT18zNk1fUExDUCA9IDQsCi0JSVdMX1JBVEVfU0lTT180OE1fUExDUCA9IDUsCi0JSVdMX1JBVEVfU0lTT181NE1fUExDUCA9IDYsCi0JSVdMX1JBVEVfU0lTT182ME1fUExDUCA9IDcsCi0JSVdMX1JBVEVfTUlNTzJfNk1fUExDUCAgPSAweDgsCi0JSVdMX1JBVEVfTUlNTzJfMTJNX1BMQ1AgPSAweDksCi0JSVdMX1JBVEVfTUlNTzJfMThNX1BMQ1AgPSAweGEsCi0JSVdMX1JBVEVfTUlNTzJfMjRNX1BMQ1AgPSAweGIsCi0JSVdMX1JBVEVfTUlNTzJfMzZNX1BMQ1AgPSAweGMsCi0JSVdMX1JBVEVfTUlNTzJfNDhNX1BMQ1AgPSAweGQsCi0JSVdMX1JBVEVfTUlNTzJfNTRNX1BMQ1AgPSAweGUsCi0JSVdMX1JBVEVfTUlNTzJfNjBNX1BMQ1AgPSAweGYsCi0JSVdMX1JBVEVfU0lTT19JTlZNX1BMQ1AsCi0JSVdMX1JBVEVfTUlNTzJfSU5WTV9QTENQID0gSVdMX1JBVEVfU0lTT19JTlZNX1BMQ1AsCi19OwotCi0vKiBNQUMgaGVhZGVyIHZhbHVlcyBmb3IgYml0IHJhdGVzICovCi1lbnVtIHsKLQlJV0xfUkFURV82TV9JRUVFICA9IDEyLAotCUlXTF9SQVRFXzlNX0lFRUUgID0gMTgsCi0JSVdMX1JBVEVfMTJNX0lFRUUgPSAyNCwKLQlJV0xfUkFURV8xOE1fSUVFRSA9IDM2LAotCUlXTF9SQVRFXzI0TV9JRUVFID0gNDgsCi0JSVdMX1JBVEVfMzZNX0lFRUUgPSA3MiwKLQlJV0xfUkFURV80OE1fSUVFRSA9IDk2LAotCUlXTF9SQVRFXzU0TV9JRUVFID0gMTA4LAotCUlXTF9SQVRFXzYwTV9JRUVFID0gMTIwLAotCUlXTF9SQVRFXzFNX0lFRUUgID0gMiwKLQlJV0xfUkFURV8yTV9JRUVFICA9IDQsCi0JSVdMX1JBVEVfNU1fSUVFRSAgPSAxMSwKLQlJV0xfUkFURV8xMU1fSUVFRSA9IDIyLAotfTsKLQotI2RlZmluZSBJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0sgICAgXAotCShJV0xfUkFURV8xTV9NQVNLICAgICAgICAgIHwgXAotCUlXTF9SQVRFXzJNX01BU0spCi0KLSNkZWZpbmUgSVdMX0NDS19SQVRFU19NQVNLICAgICAgICAgIFwKLQkoSVdMX0NDS19CQVNJQ19SQVRFU19NQVNLICB8IFwKLQlJV0xfUkFURV81TV9NQVNLICAgICAgICAgIHwgXAotCUlXTF9SQVRFXzExTV9NQVNLKQotCi0jZGVmaW5lIElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgICBcCi0JKElXTF9SQVRFXzZNX01BU0sgICAgICAgICB8IFwKLQlJV0xfUkFURV8xMk1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzI0TV9NQVNLKQotCi0jZGVmaW5lIElXTF9PRkRNX1JBVEVTX01BU0sgICAgICAgICBcCi0JKElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCi0JSVdMX1JBVEVfOU1fTUFTSyAgICAgICAgICB8IFwKLQlJV0xfUkFURV8xOE1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzM2TV9NQVNLICAgICAgICAgfCBcCi0JSVdMX1JBVEVfNDhNX01BU0sgICAgICAgICB8IFwKLQlJV0xfUkFURV81NE1fTUFTSykKLQotI2RlZmluZSBJV0xfQkFTSUNfUkFURVNfTUFTSyAgICAgICAgIFwKLQkoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKLQkgSVdMX0NDS19CQVNJQ19SQVRFU19NQVNLKQotCi0jZGVmaW5lIElXTF9SQVRFU19NQVNLICgoMSA8PCBJV0xfUkFURV9DT1VOVCkgLSAxKQotI2RlZmluZSBJV0xfUkFURVNfTUFTS18zOTQ1ICgoMSA8PCBJV0xfUkFURV9DT1VOVF8zOTQ1KSAtIDEpCi0KLSNkZWZpbmUgSVdMX0lOVkFMSURfVkFMVUUgICAgLTEKLQotI2RlZmluZSBJV0xfTUlOX1JTU0lfVkFMICAgICAgICAgICAgICAgICAtMTAwCi0jZGVmaW5lIElXTF9NQVhfUlNTSV9WQUwgICAgICAgICAgICAgICAgICAgIDAKLQotLyogVGhlc2UgdmFsdWVzIHNwZWNpZnkgaG93IG1hbnkgVHggZnJhbWUgYXR0ZW1wdHMgYmVmb3JlCi0gKiBzZWFyY2hpbmcgZm9yIGEgbmV3IG1vZHVsYXRpb24gbW9kZSAqLwotI2RlZmluZSBJV0xfTEVHQUNZX0ZBSUxVUkVfTElNSVQJMTYwCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1VDQ0VTU19MSU1JVAk0ODAKLSNkZWZpbmUgSVdMX0xFR0FDWV9UQUJMRV9DT1VOVAkJMTYwCi0KLSNkZWZpbmUgSVdMX05PTkVfTEVHQUNZX0ZBSUxVUkVfTElNSVQJNDAwCi0jZGVmaW5lIElXTF9OT05FX0xFR0FDWV9TVUNDRVNTX0xJTUlUCTQ1MDAKLSNkZWZpbmUgSVdMX05PTkVfTEVHQUNZX1RBQkxFX0NPVU5UCTE1MDAKLQotLyogU3VjY2VzcyByYXRpbyAoQUNLZWQgLyBhdHRlbXB0ZWQgdHggZnJhbWVzKSB2YWx1ZXMgKHBlcmZlY3QgaXMgMTI4ICogMTAwKSAqLwotI2RlZmluZSBJV0xfUlNfR09PRF9SQVRJTwkJMTI4MDAJLyogMTAwJSAqLwotI2RlZmluZSBJV0xfUkFURV9TQ0FMRV9TV0lUQ0gJCTEwODgwCS8qICA4NSUgKi8KLSNkZWZpbmUgSVdMX1JBVEVfSElHSF9USAkJMTA4ODAJLyogIDg1JSAqLwotI2RlZmluZSBJV0xfUkFURV9JTkNSRUFTRV9USAkJNjQwMAkvKiAgNTAlICovCi0jZGVmaW5lIElXTF9SQVRFX0RFQ1JFQVNFX1RICQkxOTIwCS8qICAxNSUgKi8KLQotLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIGxlZ2FjeSBtb2RlICovCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExICAgICAgMAotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAgICAgIDEKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfU0lTTyAgICAgICAgICAyCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCICAgICAgMwotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQyAgICAgIDQKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQkMgICAgICA1Ci0KLS8qIHBvc3NpYmxlIGFjdGlvbnMgd2hlbiBpbiBzaXNvIG1vZGUgKi8KLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX0FOVEVOTkExICAgICAgICAwCi0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAgICAgICAgMQotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIgICAgICAgIDIKLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX01JTU8yX0FDICAgICAgICAzCi0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9CQyAgICAgICAgNAotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfR0kgICAgICAgICAgICAgIDUKLQotLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIG1pbW8gbW9kZSAqLwotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX0FOVEVOTkExICAgICAgIDAKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMiAgICAgICAxCi0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfU0lTT19BICAgICAgICAgMgotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQiAgICAgICAgIDMKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0MgICAgICAgICA0Ci0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfR0kgICAgICAgICAgICAgNQotCi0jZGVmaW5lIElXTF9NQVhfU0VBUkNIIElXTF9NSU1PMl9TV0lUQ0hfR0kKLQotI2RlZmluZSBJV0xfQUNUSU9OX0xJTUlUCQkzCS8qICMgcG9zc2libGUgYWN0aW9ucyAqLwotCi0jZGVmaW5lIExRX1NJWkUJCTIJLyogMiBtb2RlIHRhYmxlczogICJBY3RpdmUiIGFuZCAiU2VhcmNoIiAqLwotCi0vKiBsb2FkIHBlciB0aWQgZGVmaW5lcyBmb3IgQS1NUERVIGFjdGl2YXRpb24gKi8KLSNkZWZpbmUgSVdMX0FHR19UUFRfVEhSRUhPTEQJMAotI2RlZmluZSBJV0xfQUdHX0xPQURfVEhSRVNIT0xECTEwCi0jZGVmaW5lIElXTF9BR0dfQUxMX1RJRAkJMHhmZgotI2RlZmluZSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HCTUwCS8qbVMgKi8KLSNkZWZpbmUgVElEX1FVRVVFX01BWF9TSVpFCTIwCi0jZGVmaW5lIFRJRF9ST1VORF9WQUxVRQkJNQkvKiBtUyAqLwotI2RlZmluZSBUSURfTUFYX0xPQURfQ09VTlQJOAotCi0jZGVmaW5lIFRJRF9NQVhfVElNRV9ESUZGICgoVElEX1FVRVVFX01BWF9TSVpFIC0gMSkgKiBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HKQotI2RlZmluZSBUSU1FX1dSQVBfQVJPVU5EKHgsIHkpICgoKHkpID4gKHgpKSA/ICh5KSAtICh4KSA6ICgwLSh4KSkgKyAoeSkpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyBpd2xlZ2FjeV9yYXRlc1tJV0xfUkFURV9DT1VOVF07Ci0KLWVudW0gaXdsX3RhYmxlX3R5cGUgewotCUxRX05PTkUsCi0JTFFfRywJCS8qIGxlZ2FjeSB0eXBlcyAqLwotCUxRX0EsCi0JTFFfU0lTTywJLyogaGlnaC10aHJvdWdocHV0IHR5cGVzICovCi0JTFFfTUlNTzIsCi0JTFFfTUFYLAotfTsKLQotI2RlZmluZSBpc19sZWdhY3kodGJsKSAoKCh0YmwpID09IExRX0cpIHx8ICgodGJsKSA9PSBMUV9BKSkKLSNkZWZpbmUgaXNfc2lzbyh0YmwpICgodGJsKSA9PSBMUV9TSVNPKQotI2RlZmluZSBpc19taW1vMih0YmwpICgodGJsKSA9PSBMUV9NSU1PMikKLSNkZWZpbmUgaXNfbWltbyh0YmwpIChpc19taW1vMih0YmwpKQotI2RlZmluZSBpc19IdCh0YmwpIChpc19zaXNvKHRibCkgfHwgaXNfbWltbyh0YmwpKQotI2RlZmluZSBpc19hX2JhbmQodGJsKSAoKHRibCkgPT0gTFFfQSkKLSNkZWZpbmUgaXNfZ19hbmQodGJsKSAoKHRibCkgPT0gTFFfRykKLQotI2RlZmluZQlBTlRfTk9ORQkweDAKLSNkZWZpbmUJQU5UX0EJCUJJVCgwKQotI2RlZmluZQlBTlRfQgkJQklUKDEpCi0jZGVmaW5lCUFOVF9BQgkJKEFOVF9BIHwgQU5UX0IpCi0jZGVmaW5lIEFOVF9DCQlCSVQoMikKLSNkZWZpbmUJQU5UX0FDCQkoQU5UX0EgfCBBTlRfQykKLSNkZWZpbmUgQU5UX0JDCQkoQU5UX0IgfCBBTlRfQykKLSNkZWZpbmUgQU5UX0FCQwkJKEFOVF9BQiB8IEFOVF9DKQotCi0jZGVmaW5lIElXTF9NQVhfTUNTX0RJU1BMQVlfU0laRQkxMgotCi1zdHJ1Y3QgaXdsX3JhdGVfbWNzX2luZm8gewotCWNoYXIJbWJwc1tJV0xfTUFYX01DU19ESVNQTEFZX1NJWkVdOwotCWNoYXIJbWNzW0lXTF9NQVhfTUNTX0RJU1BMQVlfU0laRV07Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhIC0tIHR4IHN1Y2Nlc3MgaGlzdG9yeSBmb3Igb25lIHJhdGUKLSAqLwotc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgewotCXU2NCBkYXRhOwkJLyogYml0bWFwIG9mIHN1Y2Nlc3NmdWwgZnJhbWVzICovCi0JczMyIHN1Y2Nlc3NfY291bnRlcjsJLyogbnVtYmVyIG9mIGZyYW1lcyBzdWNjZXNzZnVsICovCi0JczMyIHN1Y2Nlc3NfcmF0aW87CS8qIHBlci1jZW50ICogMTI4ICAqLwotCXMzMiBjb3VudGVyOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBhdHRlbXB0ZWQgKi8KLQlzMzIgYXZlcmFnZV90cHQ7CS8qIHN1Y2Nlc3MgcmF0aW8gKiBleHBlY3RlZCB0aHJvdWdocHV0ICovCi0JdW5zaWduZWQgbG9uZyBzdGFtcDsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAtLSB0eCBwYXJhbXMgYW5kIHN1Y2Nlc3MgaGlzdG9yeSBmb3IgYWxsIHJhdGVzCi0gKgotICogVGhlcmUgYXJlIHR3byBvZiB0aGVzZSBpbiBzdHJ1Y3QgaXdsX2xxX3N0YSwKLSAqIG9uZSBmb3IgImFjdGl2ZSIsIGFuZCBvbmUgZm9yICJzZWFyY2giLgotICovCi1zdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHsKLQllbnVtIGl3bF90YWJsZV90eXBlIGxxX3R5cGU7Ci0JdTggYW50X3R5cGU7Ci0JdTggaXNfU0dJOwkvKiAxID0gc2hvcnQgZ3VhcmQgaW50ZXJ2YWwgKi8KLQl1OCBpc19odDQwOwkvKiAxID0gNDAgTUh6IGNoYW5uZWwgd2lkdGggKi8KLQl1OCBpc19kdXA7CS8qIDEgPSBkdXBsaWNhdGVkIGRhdGEgc3RyZWFtcyAqLwotCXU4IGFjdGlvbjsJLyogY2hhbmdlIG1vZHVsYXRpb247IElXTF9bTEVHQUNZL1NJU08vTUlNT11fU1dJVENIXyogKi8KLQl1OCBtYXhfc2VhcmNoOwkvKiBtYXhpbXVuIG51bWJlciBvZiB0YWJsZXMgd2UgY2FuIHNlYXJjaCAqLwotCXMzMiAqZXhwZWN0ZWRfdHB0OwkvKiB0aHJvdWdocHV0IG1ldHJpY3M7IGV4cGVjdGVkX3RwdF9HLCBldGMuICovCi0JdTMyIGN1cnJlbnRfcmF0ZTsgIC8qIHJhdGVfbl9mbGFncywgdUNvZGUgQVBJIGZvcm1hdCAqLwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhIHdpbltJV0xfUkFURV9DT1VOVF07IC8qIHJhdGUgaGlzdG9yaWVzICovCi19OwotCi1zdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCB7Ci0JdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOwkvKiBhZ2Ugb2YgdGhlIG9sZGVzdCBzdGF0aXN0aWNzICovCi0JdTMyIHBhY2tldF9jb3VudFtUSURfUVVFVUVfTUFYX1NJWkVdOyAgIC8qIHBhY2tldCBjb3VudCBpbiB0aGlzIHRpbWUKLQkJCQkJCSAqIHNsaWNlICovCi0JdTMyIHRvdGFsOwkJCS8qIHRvdGFsIG51bSBvZiBwYWNrZXRzIGR1cmluZyB0aGUKLQkJCQkJICogbGFzdCBUSURfTUFYX1RJTUVfRElGRiAqLwotCXU4IHF1ZXVlX2NvdW50OwkJCS8qIG51bWJlciBvZiBxdWV1ZXMgdGhhdCBoYXMKLQkJCQkJICogYmVlbiB1c2VkIHNpbmNlIHRoZSBsYXN0IGNsZWFudXAgKi8KLQl1OCBoZWFkOwkJCS8qIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9scV9zdGEgLS0gZHJpdmVyJ3MgcmF0ZSBzY2FsaW5nIHByaXZhdGUgc3RydWN0dXJlCi0gKgotICogUG9pbnRlciB0byB0aGlzIGdldHMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gZHJpdmVyIGFuZCBtYWM4MDIxMS4KLSAqLwotc3RydWN0IGl3bF9scV9zdGEgewotCXU4IGFjdGl2ZV90Ymw7CQkvKiBpbmRleCBvZiBhY3RpdmUgdGFibGUsIHJhbmdlIDAtMSAqLwotCXU4IGVuYWJsZV9jb3VudGVyOwkvKiBpbmRpY2F0ZXMgSFQgbW9kZSAqLwotCXU4IHN0YXlfaW5fdGJsOwkJLyogMTogZGlzYWxsb3csIDA6IGFsbG93IHNlYXJjaCBmb3IgbmV3IG1vZGUgKi8KLQl1OCBzZWFyY2hfYmV0dGVyX3RibDsJLyogMTogY3VycmVudGx5IHRyeWluZyBhbHRlcm5hdGUgbW9kZSAqLwotCXMzMiBsYXN0X3RwdDsKLQotCS8qIFRoZSBmb2xsb3dpbmcgZGV0ZXJtaW5lIHdoZW4gdG8gc2VhcmNoIGZvciBhIG5ldyBtb2RlICovCi0JdTMyIHRhYmxlX2NvdW50X2xpbWl0OwotCXUzMiBtYXhfZmFpbHVyZV9saW1pdDsJLyogIyBmYWlsZWQgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCi0JdTMyIG1heF9zdWNjZXNzX2xpbWl0OwkvKiAjIHN1Y2Nlc3NmdWwgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCi0JdTMyIHRhYmxlX2NvdW50OwotCXUzMiB0b3RhbF9mYWlsZWQ7CS8qIHRvdGFsIGZhaWxlZCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KLQl1MzIgdG90YWxfc3VjY2VzczsJLyogdG90YWwgc3VjY2Vzc2Z1bCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KLQl1NjQgZmx1c2hfdGltZXI7CS8qIHRpbWUgc3RheWluZyBpbiBtb2RlIGJlZm9yZSBuZXcgc2VhcmNoICovCi0KLQl1OCBhY3Rpb25fY291bnRlcjsJLyogIyBtb2RlLXN3aXRjaCBhY3Rpb25zIHRyaWVkICovCi0JdTggaXNfZ3JlZW47Ci0JdTggaXNfZHVwOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKLQotCS8qIFRoZSBmb2xsb3dpbmcgYXJlIGJpdG1hcHMgb2YgcmF0ZXM7IElXTF9SQVRFXzZNX01BU0ssIGV0Yy4gKi8KLQl1MzIgc3VwcF9yYXRlczsKLQl1MTYgYWN0aXZlX2xlZ2FjeV9yYXRlOwotCXUxNiBhY3RpdmVfc2lzb19yYXRlOwotCXUxNiBhY3RpdmVfbWltbzJfcmF0ZTsKLQlzOCBtYXhfcmF0ZV9pZHg7ICAgICAvKiBNYXggcmF0ZSBzZXQgYnkgdXNlciAqLwotCXU4IG1pc3NlZF9yYXRlX2NvdW50ZXI7Ci0KLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyBscV9pbmZvW0xRX1NJWkVdOyAvKiAiYWN0aXZlIiwgInNlYXJjaCIgKi8KLQlzdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCBsb2FkW1RJRF9NQVhfTE9BRF9DT1VOVF07Ci0JdTggdHhfYWdnX3RpZF9lbjsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlOwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlOwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZTsKLQlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlOwotCXUzMiBkYmdfZml4ZWRfcmF0ZTsKLSNlbmRpZgotCXN0cnVjdCBpd2xfcHJpdiAqZHJ2OwotCi0JLyogdXNlZCB0byBiZSBpbiBzdGFfaW5mbyAqLwotCWludCBsYXN0X3R4cmF0ZV9pZHg7Ci0JLyogbGFzdCB0eCByYXRlX25fZmxhZ3MgKi8KLQl1MzIgbGFzdF9yYXRlX25fZmxhZ3M7Ci0JLyogcGFja2V0cyBkZXN0aW5lZCBmb3IgdGhpcyBTVEEgYXJlIGFnZ3JlZ2F0ZWQgKi8KLQl1OCBpc19hZ2c7Ci19OwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfbnVtX29mX2FudCh1OCBtYXNrKQotewotCXJldHVybiAgISEoKG1hc2spICYgQU5UX0EpICsKLQkJISEoKG1hc2spICYgQU5UX0IpICsKLQkJISEoKG1hc2spICYgQU5UX0MpOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfZmlyc3RfYW50ZW5uYSh1OCBtYXNrKQotewotCWlmIChtYXNrICYgQU5UX0EpCi0JCXJldHVybiBBTlRfQTsKLQlpZiAobWFzayAmIEFOVF9CKQotCQlyZXR1cm4gQU5UX0I7Ci0JcmV0dXJuIEFOVF9DOwotfQotCi0KLS8qKgotICogaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQgLSBJbml0aWFsaXplIHRoZSByYXRlIHNjYWxlIHRhYmxlIGJhc2VkIG9uIGFzc29jIGluZm8KLSAqCi0gKiBUaGUgc3BlY2lmaWMgdGhyb3VnaHB1dCB0YWJsZSB1c2VkIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG5ldHdvcmsKLSAqIHRoZSBhc3NvY2lhdGVkIHdpdGgsIGluY2x1ZGluZyBBLCBCLCBHLCBhbmQgRyB3LyBUR0cgcHJvdGVjdGlvbgotICovCi1leHRlcm4gdm9pZCBpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgczMyIHN0YV9pZCk7Ci0KLS8qIEluaXRpYWxpemUgc3RhdGlvbidzIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBhZnRlciBhZGRpbmcgc3RhdGlvbiAqLwotZXh0ZXJuIHZvaWQgaXdsNDk2NV9yc19yYXRlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yc19yYXRlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBzdGFfaWQpOwotCi0vKioKLSAqIGl3bF9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBjYWxsYmFja3MKLSAqCi0gKiBTaW5jZSB0aGUgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBpcyBoYXJkd2FyZSBzcGVjaWZpYywgdGhlcmUgaXMgbm8gbmVlZAotICogb3IgcmVhc29uIHRvIHBsYWNlIGl0IGFzIGEgc3RhbmQgYWxvbmUgbW9kdWxlLiAgVGhlIGRyaXZlciBjYW4gY2FsbAotICogaXdsX3JhdGVfY29udHJvbF9yZWdpc3RlciBpbiBvcmRlciB0byByZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcwotICogd2l0aCB0aGUgbWFjODAyMTEgc3Vic3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgcGVyZm9ybWVkIHByaW9yIHRvIGNhbGxpbmcKLSAqIGllZWU4MDIxMV9yZWdpc3Rlcl9odwotICoKLSAqLwotZXh0ZXJuIGludCBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiBpbnQgaXdsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCk7Ci0KLS8qKgotICogaXdsX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcwotICoKLSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3LCBidXQgYmVmb3JlCi0gKiB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgotICovCi1leHRlcm4gdm9pZCBpd2w0OTY1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKTsKLQotI2VuZGlmIC8qIF9faXdsX2xlZ2FjeV9yc19fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNlZjBkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLXBvd2VyLmgiCi0KLS8qCi0gKiBTZXR0aW5nIHBvd2VyIGxldmVsIGFsbG93cyB0aGUgY2FyZCB0byBnbyB0byBzbGVlcCB3aGVuIG5vdCBidXN5LgotICoKLSAqIFdlIGNhbGN1bGF0ZSBhIHNsZWVwIGNvbW1hbmQgYmFzZWQgb24gdGhlIHJlcXVpcmVkIGxhdGVuY3ksIHdoaWNoCi0gKiB3ZSBnZXQgZnJvbSBtYWM4MDIxMS4gSW4gb3JkZXIgdG8gaGFuZGxlIHRoZXJtYWwgdGhyb3R0bGluZywgd2UgY2FuCi0gKiBhbHNvIHVzZSBwcmUtZGVmaW5lZCBwb3dlciBsZXZlbHMuCi0gKi8KLQotLyoKLSAqIFRoaXMgZGVmaW5lcyB0aGUgb2xkIHBvd2VyIGxldmVscy4gVGhleSBhcmUgc3RpbGwgdXNlZCBieSBkZWZhdWx0Ci0gKiAobGV2ZWwgMSkgYW5kIGZvciB0aGVybWFsIHRocm90dGxlIChsZXZlbHMgMyB0aHJvdWdoIDUpCi0gKi8KLQotc3RydWN0IGl3bF9wb3dlcl92ZWNfZW50cnkgewotCXN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgY21kOwotCXU4IG5vX2R0aW07CS8qIG51bWJlciBvZiBza2lwIGR0aW0gKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfcG93ZXJfc2xlZXBfY2FtX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCkKLXsKLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOwotCi0JaWYgKHByaXYtPnBvd2VyX2RhdGEucGNpX3BtKQotCQljbWQtPmZsYWdzIHw9IElXTF9QT1dFUl9QQ0lfUE1fTVNLOwotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJTbGVlcCBjb21tYW5kIGZvciBDQU1cbiIpOwotfQotCi1zdGF0aWMgaW50Ci1pd2xfbGVnYWN5X3NldF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCkKLXsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNlbmRpbmcgcG93ZXIvc2xlZXAgY29tbWFuZFxuIik7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJGbGFncyB2YWx1ZSA9IDB4JTA4WFxuIiwgY21kLT5mbGFncyk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJUeCB0aW1lb3V0ID0gJXVcbiIsCi0JCQkJCWxlMzJfdG9fY3B1KGNtZC0+dHhfZGF0YV90aW1lb3V0KSk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJSeCB0aW1lb3V0ID0gJXVcbiIsCi0JCQkJCWxlMzJfdG9fY3B1KGNtZC0+cnhfZGF0YV90aW1lb3V0KSk7Ci0JSVdMX0RFQlVHX1BPV0VSKHByaXYsCi0JCQkiU2xlZXAgaW50ZXJ2YWwgdmVjdG9yID0geyAlZCAsICVkICwgJWQgLCAlZCAsICVkIH1cbiIsCi0JCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzBdKSwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMV0pLAotCQkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFsyXSksCi0JCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzNdKSwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbNF0pKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBQT1dFUl9UQUJMRV9DTUQsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQpLCBjbWQpOwotfQotCi1pbnQKLWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kICpjbWQsCi0JCSAgICAgICBib29sIGZvcmNlKQotewotCWludCByZXQ7Ci0JYm9vbCB1cGRhdGVfY2hhaW5zOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JLyogRG9uJ3QgdXBkYXRlIHRoZSBSWCBjaGFpbiB3aGVuIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uIGlzIHJ1bm5pbmcgKi8KLQl1cGRhdGVfY2hhaW5zID0gcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfRE9ORSB8fAotCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfQUxJVkU7Ci0KLQlpZiAoIW1lbWNtcCgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKSAmJiAhZm9yY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIHNjYW4gY29tcGxldGUgdXNlIHNsZWVwX3Bvd2VyX25leHQsIG5lZWQgdG8gYmUgdXBkYXRlZCAqLwotCW1lbWNweSgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgY21kLCBzaXplb2YoKmNtZCkpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpICYmICFmb3JjZSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGVmZXIgcG93ZXIgc2V0IG1vZGUgd2hpbGUgc2Nhbm5pbmdcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY21kLT5mbGFncyAmIElXTF9QT1dFUl9EUklWRVJfQUxMT1dfU0xFRVBfTVNLKQotCQlzZXRfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZXRfcG93ZXIocHJpdiwgY21kKTsKLQlpZiAoIXJldCkgewotCQlpZiAoIShjbWQtPmZsYWdzICYgSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spKQotCQkJY2xlYXJfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCi0JCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MgJiYgdXBkYXRlX2NoYWlucykKLQkJCXByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhwcml2KTsKLQkJZWxzZSBpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQotCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsCi0JCQkJCSJDYW5ub3QgdXBkYXRlIHRoZSBwb3dlciwgY2hhaW4gbm9pc2UgIgotCQkJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCi0JCQkJCXByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUpOwotCi0JCW1lbWNweSgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKLQl9IGVsc2UKLQkJSVdMX0VSUihwcml2LCAic2V0IHBvd2VyIGZhaWwsIHJldCA9ICVkIiwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSkKLXsKLQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIGNtZDsKLQotCWl3bF9sZWdhY3lfcG93ZXJfc2xlZXBfY2FtX2NtZChwcml2LCAmY21kKTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9wb3dlcl9zZXRfbW9kZShwcml2LCAmY21kLCBmb3JjZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUpOwotCi0vKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgKi8KLXZvaWQgaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgbGN0bCA9IGl3bF9sZWdhY3lfcGNpZV9saW5rX2N0bChwcml2KTsKLQotCXByaXYtPnBvd2VyX2RhdGEucGNpX3BtID0gIShsY3RsICYgUENJX0NGR19MSU5LX0NUUkxfVkFMX0wwU19FTik7Ci0KLQlwcml2LT5wb3dlcl9kYXRhLmRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlID0gLTE7Ci0KLQltZW1zZXQoJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCAwLAotCQlzaXplb2YocHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGIzNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X3Bvd2VyX3NldHRpbmdfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9wb3dlcl9zZXR0aW5nX2hfXwotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0KLWVudW0gaXdsX3Bvd2VyX2xldmVsIHsKLQlJV0xfUE9XRVJfSU5ERVhfMSwKLQlJV0xfUE9XRVJfSU5ERVhfMiwKLQlJV0xfUE9XRVJfSU5ERVhfMywKLQlJV0xfUE9XRVJfSU5ERVhfNCwKLQlJV0xfUE9XRVJfSU5ERVhfNSwKLQlJV0xfUE9XRVJfTlVNCi19OwotCi1zdHJ1Y3QgaXdsX3Bvd2VyX21nciB7Ci0Jc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWQ7Ci0Jc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBzbGVlcF9jbWRfbmV4dDsKLQlpbnQgZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGU7Ci0JYm9vbCBwY2lfcG07Ci19OwotCi1pbnQKLWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kICpjbWQsCi0JCSAgICAgICBib29sIGZvcmNlKTsKLWludCBpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmb3JjZSk7Ci12b2lkIGl3bF9sZWdhY3lfcG93ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0jZW5kaWYgIC8qIF9faXdsX2xlZ2FjeV9wb3dlcl9zZXR0aW5nX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wcnBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTQ5MzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaAorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmCV9faXdsX2xlZ2FjeV9wcnBoX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfcHJwaF9oX18KLQotLyoKLSAqIFJlZ2lzdGVycyBpbiB0aGlzIGZpbGUgYXJlIGludGVybmFsLCBub3QgUENJIGJ1cyBtZW1vcnkgbWFwcGVkLgotICogRHJpdmVyIGFjY2Vzc2VzIHRoZXNlIHZpYSBIQlVTX1RBUkdfUFJQSF8qIHJlZ2lzdGVycy4KLSAqLwotI2RlZmluZSBQUlBIX0JBU0UJKDB4MDAwMDApCi0jZGVmaW5lIFBSUEhfRU5ECSgweEZGRkZGKQotCi0vKiBBUE1HIChwb3dlciBtYW5hZ2VtZW50KSBjb25zdGFudHMgKi8KLSNkZWZpbmUgQVBNR19CQVNFCQkJKFBSUEhfQkFTRSArIDB4MzAwMCkKLSNkZWZpbmUgQVBNR19DTEtfQ1RSTF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMDApCi0jZGVmaW5lIEFQTUdfQ0xLX0VOX1JFRwkJCShBUE1HX0JBU0UgKyAweDAwMDQpCi0jZGVmaW5lIEFQTUdfQ0xLX0RJU19SRUcJCShBUE1HX0JBU0UgKyAweDAwMDgpCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMGMpCi0jZGVmaW5lIEFQTUdfUENJREVWX1NUVF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMTApCi0jZGVmaW5lIEFQTUdfUkZLSUxMX1JFRwkJCShBUE1HX0JBU0UgKyAweDAwMTQpCi0jZGVmaW5lIEFQTUdfUlRDX0lOVF9TVFRfUkVHCQkoQVBNR19CQVNFICsgMHgwMDFjKQotI2RlZmluZSBBUE1HX1JUQ19JTlRfTVNLX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAyMCkKLSNkZWZpbmUgQVBNR19ESUdJVEFMX1NWUl9SRUcJCShBUE1HX0JBU0UgKyAweDAwNTgpCi0jZGVmaW5lIEFQTUdfQU5BTE9HX1NWUl9SRUcJCShBUE1HX0JBU0UgKyAweDAwNkMpCi0KLSNkZWZpbmUgQVBNU19DTEtfVkFMX01SQl9GVU5DX01PREUJKDB4MDAwMDAwMDEpCi0jZGVmaW5lIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVAkoMHgwMDAwMDIwMCkKLSNkZWZpbmUgQVBNR19DTEtfVkFMX0JTTV9DTEtfUlFUCSgweDAwMDAwODAwKQotCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9FQVJMWV9QV1JfT0ZGX1JFU0VUX0RJUwkoMHgwMDQwMDAwMCkKLSNkZWZpbmUgQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEJCSgweDA0MDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMJCSgweDAzMDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVk1BSU4JCSgweDAwMDAwMDAwKQotI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfTUFYCQkoMHgwMTAwMDAwMCkgLyogMzk0NSBvbmx5ICovCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYCQkoMHgwMjAwMDAwMCkKLSNkZWZpbmUgQVBNR19TVlJfVk9MVEFHRV9DT05GSUdfQklUX01TSwkoMHgwMDAwMDFFMCkgLyogYml0IDg6NSAqLwotI2RlZmluZSBBUE1HX1NWUl9ESUdJVEFMX1ZPTFRBR0VfMV8zMgkJKDB4MDAwMDAwNjApCi0KLSNkZWZpbmUgQVBNR19QQ0lERVZfU1RUX1ZBTF9MMV9BQ1RfRElTCQkoMHgwMDAwMDgwMCkKLQotLyoqCi0gKiBCU00gKEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lKQotICoKLSAqIFRoZSBCb290c3RyYXAgU3RhdGUgTWFjaGluZSAoQlNNKSBzdG9yZXMgYSBzaG9ydCBib290c3RyYXAgdUNvZGUgcHJvZ3JhbQotICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biB3aGVuIHRoZSBlbWJlZGRlZCBjb250cm9sCi0gKiBwcm9jZXNzb3IgaXMgc2xlZXBpbmcgKGUuZy4gZm9yIHBlcmlvZGljIHBvd2VyLXNhdmluZyBzaHV0ZG93bnMgb2YgcmFkaW8pLgotICoKLSAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCBhZnRlciBzbGVlcHMgKG9yIGR1cmluZyBpbml0aWFsIHVDb2RlIGxvYWQpLCB0aGUgQlNNCi0gKiBpbnRlcm5hbGx5IGxvYWRzIHRoZSBzaG9ydCBib290c3RyYXAgcHJvZ3JhbSBmcm9tIHRoZSBzcGVjaWFsIFNSQU0gaW50byB0aGUKLSAqIGVtYmVkZGVkIHByb2Nlc3NvcidzIGluc3RydWN0aW9uIFNSQU0sIGFuZCBzdGFydHMgdGhlIHByb2Nlc3NvciBzbyBpdCBydW5zCi0gKiB0aGUgYm9vdHN0cmFwIHByb2dyYW0uCi0gKgotICogVGhpcyBib290c3RyYXAgcHJvZ3JhbSBsb2FkcyAodmlhIFBDSSBidXNtYXN0ZXIgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEKLSAqIGltYWdlcyBmb3IgYSB1Q29kZSBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucy4gIFRoZSBob3N0IGRyaXZlcgotICogaW5kaWNhdGVzIERSQU0gbG9jYXRpb25zIGFuZCBzaXplcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgaW1hZ2VzIHZpYSB0aGUKLSAqIGZvdXIgQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBib290c3RyYXAgcHJvZ3JhbSBsb2FkcyB0aGUgbmV3IHByb2dyYW0sCi0gKiB0aGUgbmV3IHByb2dyYW0gc3RhcnRzIGF1dG9tYXRpY2FsbHkuCi0gKgotICogVGhlIHVDb2RlIHVzZWQgZm9yIG9wZW4tc291cmNlIGRyaXZlcnMgaW5jbHVkZXMgdHdvIHByb2dyYW1zOgotICoKLSAqIDEpICBJbml0aWFsaXphdGlvbiAtLSBwZXJmb3JtcyBoYXJkd2FyZSBjYWxpYnJhdGlvbiBhbmQgc2V0cyB1cCBzb21lCi0gKiAgICAgaW50ZXJuYWwgZGF0YSwgdGhlbiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uCi0gKiAgICAgKHN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwKSB0aGF0IGl0IGhhcyBjb21wbGV0ZWQgYWxsIG9mIGl0cyB3b3JrLgotICogICAgIEFmdGVyIHNpZ25hbCBmcm9tIGhvc3QsIGl0IHRoZW4gbG9hZHMgYW5kIHN0YXJ0cyB0aGUgcnVudGltZSBwcm9ncmFtLgotICogICAgIFRoZSBpbml0aWFsaXphdGlvbiBwcm9ncmFtIG11c3QgYmUgdXNlZCB3aGVuIGluaXRpYWxseSBzZXR0aW5nIHVwIHRoZQotICogICAgIE5JQyBhZnRlciBsb2FkaW5nIHRoZSBkcml2ZXIuCi0gKgotICogMikgIFJ1bnRpbWUvUHJvdG9jb2wgLS0gcGVyZm9ybXMgYWxsIG5vcm1hbCBydW50aW1lIG9wZXJhdGlvbnMuICBUaGlzCi0gKiAgICAgbm90aWZpZXMgaG9zdCB2aWEgImFsaXZlIiBub3RpZmljYXRpb24gKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkgdGhhdCBpdAotICogICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCi0gKgotICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIGRvZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmU6Ci0gKgotICogMSkgIExvYWQgYm9vdHN0cmFwIHByb2dyYW0gKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhIGltYWdlIGZvciBib290c3RyYXApCi0gKiAgICAgaW50byBib290c3RyYXAgbWVtb3J5LiAgVXNlIGR3b3JkIHdyaXRlcyBzdGFydGluZyBhdCBCU01fU1JBTV9MT1dFUl9CT1VORAotICoKLSAqIDIpICBQb2ludCAodmlhIEJTTV9EUkFNXyopIHRvIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24KLSAqICAgICBpbWFnZXMgaW4gaG9zdCBEUkFNLgotICoKLSAqIDMpICBTZXQgdXAgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIHVDb2RlIGluc3RydWN0aW9uIFNSQU0gd2hlbiBhc2tlZDoKLSAqICAgICBCU01fV1JfTUVNX1NSQ19SRUcgPSAwCi0gKiAgICAgQlNNX1dSX01FTV9EU1RfUkVHID0gUlRDX0lOU1RfTE9XRVJfQk9VTkQKLSAqICAgICBCU01fV1JfTUVNX0RXQ09VTlRfUkVHID0gIyBkd29yZHMgaW4gYm9vdHN0cmFwIGluc3RydWN0aW9uIGltYWdlCi0gKgotICogNCkgIExvYWQgYm9vdHN0cmFwIGludG8gaW5zdHJ1Y3Rpb24gU1JBTToKLSAqICAgICBCU01fV1JfQ1RSTF9SRUcgPSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUCi0gKgotICogNSkgIFdhaXQgZm9yIGxvYWQgY29tcGxldGlvbjoKLSAqICAgICBQb2xsIEJTTV9XUl9DVFJMX1JFRyBmb3IgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCA9IDAKLSAqCi0gKiA2KSAgRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIE5JQydzIHBvd2VyIG1hbmFnZW1lbnQgdHJpZ2dlcnMgaXQ6Ci0gKiAgICAgQlNNX1dSX0NUUkxfUkVHID0gQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTgotICoKLSAqIDcpICBTdGFydCB0aGUgTklDIGJ5IHJlbW92aW5nIGFsbCByZXNldCBiaXRzOgotICogICAgIENTUl9SRVNFVCA9IDAKLSAqCi0gKiAgICAgVGhlIGJvb3RzdHJhcCB1Q29kZSAoYWxyZWFkeSBpbiBpbnN0cnVjdGlvbiBTUkFNKSBsb2FkcyBpbml0aWFsaXphdGlvbgotICogICAgIHVDb2RlLiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgcGVyZm9ybXMgZGF0YSBpbml0aWFsaXphdGlvbiwgc2VuZHMKLSAqICAgICAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIHRvIGhvc3QsIGFuZCB3YWl0cyBmb3IgYSBzaWduYWwgZnJvbQotICogICAgIGhvc3QgdG8gbG9hZCBydW50aW1lIGNvZGUuCi0gKgotICogNCkgIFBvaW50ICh2aWEgQlNNX0RSQU1fKikgdG8gdGhlICJydW50aW1lIiB1Q29kZSBkYXRhIGFuZCBpbnN0cnVjdGlvbgotICogICAgIGltYWdlcyBpbiBob3N0IERSQU0uICBUaGUgbGFzdCByZWdpc3RlciBsb2FkZWQgbXVzdCBiZSB0aGUgaW5zdHJ1Y3Rpb24KLSAqICAgICBieXRlIGNvdW50IHJlZ2lzdGVyICgiMSIgaW4gTVNiaXQgdGVsbHMgaW5pdGlhbGl6YXRpb24gdUNvZGUgdG8gbG9hZAotICogICAgIHRoZSBydW50aW1lIHVDb2RlKToKLSAqICAgICBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgPSBieXRlIGNvdW50IHwgQlNNX0RSQU1fSU5TVF9MT0FECi0gKgotICogNSkgIFdhaXQgZm9yICJhbGl2ZSIgbm90aWZpY2F0aW9uLCB0aGVuIGlzc3VlIG5vcm1hbCBydW50aW1lIGNvbW1hbmRzLgotICoKLSAqIERhdGEgY2FjaGluZyBkdXJpbmcgcG93ZXItZG93bnM6Ci0gKgotICogSnVzdCBiZWZvcmUgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgcG93ZXJzIGRvd24gKGUuZyBmb3IgYXV0b21hdGljCi0gKiBwb3dlci1zYXZpbmcgbW9kZXMsIG9yIGZvciBSRktJTEwpLCB1Q29kZSBzdG9yZXMgKHZpYSBQQ0kgYnVzbWFzdGVyIERNQSkKLSAqIGEgY3VycmVudCBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yJ3MgZGF0YSBTUkFNIGludG8gaG9zdCBEUkFNLgotICogVGhpcyBjYWNoZXMgdGhlIGRhdGEgd2hpbGUgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcidzIG1lbW9yeSBpcyBwb3dlcmVkIGRvd24uCi0gKiBMb2NhdGlvbiBhbmQgc2l6ZSBhcmUgY29udHJvbGxlZCBieSBCU01fRFJBTV9EQVRBXyogcmVnaXN0ZXJzLgotICoKLSAqIE5PVEU6ICBJbnN0cnVjdGlvbiBTUkFNIGRvZXMgbm90IG5lZWQgdG8gYmUgc2F2ZWQsIHNpbmNlIHRoYXQgZG9lc24ndAotICogICAgICAgIGNoYW5nZSBkdXJpbmcgb3BlcmF0aW9uOyB0aGUgb3JpZ2luYWwgaW1hZ2UgKGZyb20gdUNvZGUgZGlzdHJpYnV0aW9uCi0gKiAgICAgICAgZmlsZSkgY2FuIGJlIHVzZWQgZm9yIHJlbG9hZC4KLSAqCi0gKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgQm9vdHN0cmFwIGxvb2tzCi0gKiBhdCB0aGUgQlNNX0RSQU1fKiByZWdpc3RlcnMsIHdoaWNoIG5vdyBwb2ludCB0byB0aGUgcnVudGltZSBpbnN0cnVjdGlvbgotICogaW1hZ2UgYW5kIHRoZSBjYWNoZWQgKG1vZGlmaWVkKSBydW50aW1lIGRhdGEgKCpub3QqIHRoZSBpbml0aWFsaXphdGlvbgotICogdUNvZGUpLiAgQm9vdHN0cmFwIHJlbG9hZHMgdGhlc2UgcnVudGltZSBpbWFnZXMgaW50byBTUkFNLCBhbmQgcmVzdGFydHMgdGhlCi0gKiB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmIGJlZm9yZSB0aGUgcG93ZXItZG93bi4KLSAqCi0gKiBOT1RFOiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgZG9lcyAqbm90KiBydW4gYXMgcGFydCBvZiB0aGUgc2F2ZS9yZXN0b3JlCi0gKiAgICAgICAgcHJvY2VkdXJlLgotICoKLSAqIFRoaXMgc2F2ZS9yZXN0b3JlIG1ldGhvZCBpcyBtb3N0bHkgZm9yIGF1dG9ub21vdXMgcG93ZXIgbWFuYWdlbWVudCBkdXJpbmcKLSAqIG5vcm1hbCBvcGVyYXRpb24gKHJlc3VsdCBvZiBQT1dFUl9UQUJMRV9DTUQpLiAgUGxhdGZvcm0gc3VzcGVuZC9yZXN1bWUgYW5kCi0gKiBSRktJTEwgc2hvdWxkIHVzZSBjb21wbGV0ZSByZXN0YXJ0cyAod2l0aCB0b3RhbCByZS1pbml0aWFsaXphdGlvbikgb2YgdUNvZGUsCi0gKiBhbGxvd2luZyB0b3RhbCBzaHV0ZG93biAoaW5jbHVkaW5nIEJTTSBtZW1vcnkpLgotICoKLSAqIE5vdGUgdGhhdCwgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBob3N0IERSQU0gdGhhdCBoZWxkIHRoZSBpbml0aWFsCi0gKiBzdGFydHVwIGRhdGEgZm9yIHRoZSBydW50aW1lIGNvZGUgaXMgbm93IGJlaW5nIHVzZWQgYXMgYSBiYWNrdXAgZGF0YSBjYWNoZQotICogZm9yIG1vZGlmaWVkIGRhdGEhICBJZiB5b3UgbmVlZCB0byBjb21wbGV0ZWx5IHJlLWluaXRpYWxpemUgdGhlIE5JQywgbWFrZQotICogc3VyZSB0aGF0IHlvdSB1c2UgdGhlIHJ1bnRpbWUgZGF0YSBpbWFnZSBmcm9tIHRoZSB1Q29kZSBkaXN0cmlidXRpb24gZmlsZSwKLSAqIG5vdCB0aGUgbW9kaWZpZWQvc2F2ZWQgcnVudGltZSBkYXRhLiAgWW91IG1heSB3YW50IHRvIHN0b3JlIGEgc2VwYXJhdGUKLSAqICJjbGVhbiIgcnVudGltZSBkYXRhIGltYWdlIGluIERSQU0gdG8gYXZvaWQgZGlzayByZWFkcyBvZiBkaXN0cmlidXRpb24gZmlsZS4KLSAqLwotCi0vKiBCU00gYml0IGZpZWxkcyAqLwotI2RlZmluZSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUICAgICAoMHg4MDAwMDAwMCkgLyogc3RhcnQgYm9vdCBsb2FkIG5vdyAqLwotI2RlZmluZSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUX0VOICAoMHg0MDAwMDAwMCkgLyogZW5hYmxlIGJvb3QgYWZ0ZXIgcHdydXAqLwotI2RlZmluZSBCU01fRFJBTV9JTlNUX0xPQUQgICAgICAgICAgICAoMHg4MDAwMDAwMCkgLyogc3RhcnQgcHJvZ3JhbSBsb2FkIG5vdyAqLwotCi0vKiBCU00gYWRkcmVzc2VzICovCi0jZGVmaW5lIEJTTV9CQVNFICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzQwMCkKLSNkZWZpbmUgQlNNX0VORCAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgzODAwKQotCi0jZGVmaW5lIEJTTV9XUl9DVFJMX1JFRyAgICAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDApIC8qIGN0bCBhbmQgc3RhdHVzICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fU1JDX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDQpIC8qIHNvdXJjZSBpbiBCU00gbWVtICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fRFNUX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDgpIC8qIGRlc3QgaW4gU1JBTSBtZW0gKi8KLSNkZWZpbmUgQlNNX1dSX0RXQ09VTlRfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwQykgLyogYnl0ZXMgKi8KLSNkZWZpbmUgQlNNX1dSX1NUQVRVU19SRUcgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAxMCkgLyogYml0IDA6ICAxID09IGRvbmUgKi8KLQotLyoKLSAqIFBvaW50ZXJzIGFuZCBzaXplIHJlZ3MgZm9yIGJvb3RzdHJhcCBsb2FkIGFuZCBkYXRhIFNSQU0gc2F2ZS9yZXN0b3JlLgotICogTk9URTogIDM5NDUgcG9pbnRlcnMgdXNlIGJpdHMgMzE6MCBvZiBEUkFNIGFkZHJlc3MuCi0gKiAgICAgICAgNDk2NSBwb2ludGVycyB1c2UgYml0cyAzNTo0IG9mIERSQU0gYWRkcmVzcy4KLSAqLwotI2RlZmluZSBCU01fRFJBTV9JTlNUX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDkwKQotI2RlZmluZSBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDk0KQotI2RlZmluZSBCU01fRFJBTV9EQVRBX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDk4KQotI2RlZmluZSBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDlDKQotCi0vKgotICogQlNNIHNwZWNpYWwgbWVtb3J5LCBzdGF5cyBwb3dlcmVkIG9uIGR1cmluZyBwb3dlci1zYXZlIHNsZWVwcy4KLSAqIFJlYWQvd3JpdGUsIGFkZHJlc3MgcmFuZ2UgZnJvbSBMT1dFUl9CT1VORCB0byAoTE9XRVJfQk9VTkQgKyBTSVpFIC0xKQotICovCi0jZGVmaW5lIEJTTV9TUkFNX0xPV0VSX0JPVU5EICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzgwMCkKLSNkZWZpbmUgQlNNX1NSQU1fU0laRQkJCSgxMDI0KSAvKiBieXRlcyAqLwotCi0KLS8qIDM5NDUgVHggc2NoZWR1bGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBBTE1fU0NEX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgyRTAwKQotI2RlZmluZSBBTE1fU0NEX01PREVfUkVHICAgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMDApCi0jZGVmaW5lIEFMTV9TQ0RfQVJBU1RBVF9SRUcgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAwNCkKLSNkZWZpbmUgQUxNX1NDRF9UWEZBQ1RfUkVHICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDEwKQotI2RlZmluZSBBTE1fU0NEX1RYRjRNRl9SRUcgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMTQpCi0jZGVmaW5lIEFMTV9TQ0RfVFhGNU1GX1JFRyAgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAyMCkKLSNkZWZpbmUgQUxNX1NDRF9TQllQX01PREVfMV9SRUcgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDJDKQotI2RlZmluZSBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRyAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMzApCi0KLS8qKgotICogVHggU2NoZWR1bGVyCi0gKgotICogVGhlIFR4IFNjaGVkdWxlciBzZWxlY3RzIHRoZSBuZXh0IGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLCBjaG9vc2luZyBURkRzCi0gKiAoVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMpIGZyb20gdXAgdG8gMTYgY2lyY3VsYXIgVHggcXVldWVzIHJlc2lkZW50IGluCi0gKiBob3N0IERSQU0uICBJdCBzdGVlcnMgZWFjaCBmcmFtZSdzIFR4IGNvbW1hbmQgKHdoaWNoIGNvbnRhaW5zIHRoZSBmcmFtZQotICogZGF0YSkgaW50byBvbmUgb2YgdXAgdG8gNyBwcmlvcml0aXplZCBUeCBETUEgRklGTyBjaGFubmVscyB3aXRoaW4gdGhlCi0gKiBkZXZpY2UuICBBIHF1ZXVlIG1hcHMgdG8gb25seSBvbmUgKHNlbGVjdGFibGUgYnkgZHJpdmVyKSBUeCBETUEgY2hhbm5lbCwKLSAqIGJ1dCBvbmUgRE1BIGNoYW5uZWwgbWF5IHRha2UgaW5wdXQgZnJvbSBzZXZlcmFsIHF1ZXVlcy4KLSAqCi0gKiBUeCBETUEgRklGT3MgaGF2ZSBkZWRpY2F0ZWQgcHVycG9zZXMuICBGb3IgNDk2NSwgdGhleSBhcmUgdXNlZCBhcyBmb2xsb3dzCi0gKiAoY2YuIGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbyBpbiBpd2wtNDk2NS5jKToKLSAqCi0gKiAwIC0tIEVEQ0EgQksgKGJhY2tncm91bmQpIGZyYW1lcywgbG93ZXN0IHByaW9yaXR5Ci0gKiAxIC0tIEVEQ0EgQkUgKGJlc3QgZWZmb3J0KSBmcmFtZXMsIG5vcm1hbCBwcmlvcml0eQotICogMiAtLSBFRENBIFZJICh2aWRlbykgZnJhbWVzLCBoaWdoZXIgcHJpb3JpdHkKLSAqIDMgLS0gRURDQSBWTyAodm9pY2UpIGFuZCBtYW5hZ2VtZW50IGZyYW1lcywgaGlnaGVzdCBwcmlvcml0eQotICogNCAtLSBDb21tYW5kcyAoZS5nLiBSWE9OLCBldGMuKQotICogNSAtLSB1bnVzZWQgKEhDQ0EpCi0gKiA2IC0tIHVudXNlZCAoSENDQSkKLSAqIDcgLS0gbm90IHVzZWQgYnkgZHJpdmVyIChkZXZpY2UtaW50ZXJuYWwgb25seSkKLSAqCi0gKgotICogRHJpdmVyIHNob3VsZCBub3JtYWxseSBtYXAgcXVldWVzIDAtNiB0byBUeCBETUEvRklGTyBjaGFubmVscyAwLTYuCi0gKiBJbiBhZGRpdGlvbiwgZHJpdmVyIGNhbiBtYXAgdGhlIHJlbWFpbmluZyBxdWV1ZXMgdG8gVHggRE1BL0ZJRk8KLSAqIGNoYW5uZWxzIDAtMyB0byBzdXBwb3J0IDExbiBhZ2dyZWdhdGlvbiB2aWEgRURDQSBETUEgY2hhbm5lbHMuCi0gKgotICogVGhlIGRyaXZlciBzZXRzIHVwIGVhY2ggcXVldWUgdG8gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzOgotICoKLSAqIDEpICBTY2hlZHVsZXItQWNrLCBpbiB3aGljaCB0aGUgc2NoZWR1bGVyIGF1dG9tYXRpY2FsbHkgc3VwcG9ydHMgYQotICogICAgIGJsb2NrLWFjayAoQkEpIHdpbmRvdyBvZiB1cCB0byA2NCBURkRzLiAgSW4gdGhpcyBtb2RlLCBlYWNoIHF1ZXVlCi0gKiAgICAgY29udGFpbnMgVEZEcyBmb3IgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgUmVjaXBpZW50IEFkZHJlc3MgKFJBKQotICogICAgIGFuZCBUcmFmZmljIElkZW50aWZpZXIgKFRJRCksIHRoYXQgaXMsIHRyYWZmaWMgb2YgYSBnaXZlbgotICogICAgIFF1YWxpdHktT2YtU2VydmljZSAoUU9TKSBwcmlvcml0eSwgZGVzdGluZWQgZm9yIGEgc2luZ2xlIHN0YXRpb24uCi0gKgotICogICAgIEluIHNjaGVkdWxlci1hY2sgbW9kZSwgdGhlIHNjaGVkdWxlciBrZWVwcyB0cmFjayBvZiB0aGUgVHggc3RhdHVzIG9mCi0gKiAgICAgZWFjaCBmcmFtZSB3aXRoaW4gdGhlIEJBIHdpbmRvdywgaW5jbHVkaW5nIHdoZXRoZXIgaXQncyBiZWVuIHRyYW5zbWl0dGVkLAotICogICAgIGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2VpdmluZyBzdGF0aW9uLiAgVGhlIGRldmljZQotICogICAgIGF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIGJsb2NrLWFja3MgcmVjZWl2ZWQgZnJvbSB0aGUgcmVjZWl2aW5nIFNUQSwKLSAqICAgICBhbmQgcmVzY2hlZHVsZXMgdW4tYWNrZWQgZnJhbWVzIHRvIGJlIHJldHJhbnNtaXR0ZWQgKHN1Y2Nlc3NmdWwKLSAqICAgICBUeCBjb21wbGV0aW9uIG1heSBlbmQgdXAgYmVpbmcgb3V0LW9mLW9yZGVyKS4KLSAqCi0gKiAgICAgVGhlIGRyaXZlciBtdXN0IG1haW50YWluIHRoZSBxdWV1ZSdzIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNCi0gKiAgICAgKHN0cnVjdCBpd2w0OTY1X3NjaGVkX3F1ZXVlX2J5dGVfY250X3RibCkgZm9yIHRoaXMgbW9kZS4KLSAqICAgICBUaGlzIG1vZGUgZG9lcyBub3Qgc3VwcG9ydCBmcmFnbWVudGF0aW9uLgotICoKLSAqIDIpICBGSUZPIChhLmsuYS4gbm9uLVNjaGVkdWxlci1BQ0spLCBpbiB3aGljaCBlYWNoIFRGRCBpcyBwcm9jZXNzZWQgaW4gb3JkZXIuCi0gKiAgICAgVGhlIGRldmljZSBtYXkgYXV0b21hdGljYWxseSByZXRyeSBUeCwgYnV0IHdpbGwgcmV0cnkgb25seSBvbmUgZnJhbWUKLSAqICAgICBhdCBhIHRpbWUsIHVudGlsIHJlY2VpdmluZyBBQ0sgZnJvbSByZWNlaXZpbmcgc3RhdGlvbiwgb3IgcmVhY2hpbmcKLSAqICAgICByZXRyeSBsaW1pdCBhbmQgZ2l2aW5nIHVwLgotICoKLSAqICAgICBUaGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpIG11c3QgdXNlIHRoaXMgbW9kZSEKLSAqICAgICBUaGlzIG1vZGUgZG9lcyBub3QgcmVxdWlyZSB1c2Ugb2YgdGhlIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNLgotICoKLSAqIERyaXZlciBjb250cm9scyBzY2hlZHVsZXIgb3BlcmF0aW9uIHZpYSAzIG1lYW5zOgotICogMSkgIFNjaGVkdWxlciByZWdpc3RlcnMKLSAqIDIpICBTaGFyZWQgc2NoZWR1bGVyIGRhdGEgYmFzZSBpbiBpbnRlcm5hbCA0OTU2IFNSQU0KLSAqIDMpICBTaGFyZWQgZGF0YSBpbiBob3N0IERSQU0KLSAqCi0gKiBJbml0aWFsaXphdGlvbjoKLSAqCi0gKiBXaGVuIGxvYWRpbmcsIGRyaXZlciBzaG91bGQgYWxsb2NhdGUgbWVtb3J5IGZvcjoKLSAqIDEpICAxNiBURkQgY2lyY3VsYXIgYnVmZmVycywgZWFjaCB3aXRoIHNwYWNlIGZvciAodHlwaWNhbGx5KSAyNTYgVEZEcy4KLSAqIDIpICAxNiBCeXRlIENvdW50IGNpcmN1bGFyIGJ1ZmZlcnMgaW4gMTYgS0J5dGVzIGNvbnRpZ3VvdXMgbWVtb3J5Ci0gKiAgICAgKDEwMjQgYnl0ZXMgZm9yIGVhY2ggcXVldWUpLgotICoKLSAqIEFmdGVyIHJlY2VpdmluZyAiQWxpdmUiIHJlc3BvbnNlIGZyb20gdUNvZGUsIGRyaXZlciBtdXN0IGluaXRpYWxpemUKLSAqIHRoZSBzY2hlZHVsZXIgKGVzcGVjaWFsbHkgZm9yIHF1ZXVlICM0LyM5LCB0aGUgY29tbWFuZCBxdWV1ZSwgb3RoZXJ3aXNlCi0gKiB0aGUgZHJpdmVyIGNhbid0IGlzc3VlIGNvbW1hbmRzISk6Ci0gKi8KLQotLyoqCi0gKiBNYXggVHggd2luZG93IHNpemUgaXMgdGhlIG1heCBudW1iZXIgb2YgY29udGlndW91cyBURkRzIHRoYXQgdGhlIHNjaGVkdWxlcgotICogY2FuIGtlZXAgdHJhY2sgb2YgYXQgb25lIHRpbWUgd2hlbiBjcmVhdGluZyBibG9jay1hY2sgY2hhaW5zIG9mIGZyYW1lcy4KLSAqIE5vdGUgdGhhdCAiNjQiIG1hdGNoZXMgdGhlIG51bWJlciBvZiBhY2sgYml0cyBpbiBhIGJsb2NrLWFjayBwYWNrZXQuCi0gKiBEcml2ZXIgc2hvdWxkIHVzZSBTQ0RfV0lOX1NJWkUgYW5kIFNDRF9GUkFNRV9MSU1JVCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZQotICogSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHgpIHZhbHVlcy4KLSAqLwotI2RlZmluZSBTQ0RfV0lOX1NJWkUJCQkJNjQKLSNkZWZpbmUgU0NEX0ZSQU1FX0xJTUlUCQkJCTY0Ci0KLS8qIFNDRCByZWdpc3RlcnMgYXJlIGludGVybmFsLCBtdXN0IGJlIGFjY2Vzc2VkIHZpYSBIQlVTX1RBUkdfUFJQSCByZWdzICovCi0jZGVmaW5lIElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQJCTB4YTAyYzAwCi0KLS8qCi0gKiA0OTY1IHRlbGxzIGRyaXZlciBTUkFNIGFkZHJlc3MgZm9yIGludGVybmFsIHNjaGVkdWxlciBzdHJ1Y3RzIHZpYSB0aGlzIHJlZy4KLSAqIFZhbHVlIGlzIHZhbGlkIG9ubHkgYWZ0ZXIgIkFsaXZlIiByZXNwb25zZSBmcm9tIHVDb2RlLgotICovCi0jZGVmaW5lIElXTDQ5X1NDRF9TUkFNX0JBU0VfQUREUiAgICAgICAgICAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDApCi0KLS8qCi0gKiBEcml2ZXIgbWF5IG5lZWQgdG8gdXBkYXRlIHF1ZXVlLWVtcHR5IGJpdHMgYWZ0ZXIgY2hhbmdpbmcgcXVldWUncwotICogd3JpdGUgYW5kIHJlYWQgcG9pbnRlcnMgKGluZGV4ZXMpIGR1cmluZyAocmUtKWluaXRpYWxpemF0aW9uIChpLmUuIHdoZW4KLSAqIHNjaGVkdWxlciBpcyBub3QgdHJhY2tpbmcgd2hhdCdzIGhhcHBlbmluZykuCi0gKiBCaXQgZmllbGRzOgotICogMzEtMTY6ICBXcml0ZSBtYXNrIC0tIDE6IHVwZGF0ZSBlbXB0eSBiaXQsIDA6IGRvbid0IGNoYW5nZSBlbXB0eSBiaXQKLSAqIDE1LTAwOiAgRW1wdHkgc3RhdGUsIG9uZSBmb3IgZWFjaCBxdWV1ZSAtLSAxOiBlbXB0eSwgMDogbm9uLWVtcHR5Ci0gKiBOT1RFOiAgVGhpcyByZWdpc3RlciBpcyBub3QgdXNlZCBieSBMaW51eCBkcml2ZXIuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0VNUFRZX0JJVFMgICAgICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NCkKLQotLyoKLSAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBhcnJheSBvZiBieXRlIGNvdW50IChCQykgY2lyY3VsYXIgYnVmZmVycyAoQ0JzKS4KLSAqIEVhY2ggVHggcXVldWUgaGFzIGEgQkMgQ0IgaW4gaG9zdCBEUkFNIHRvIHN1cHBvcnQgU2NoZWR1bGVyLUFDSyBtb2RlLgotICogVGhpcyByZWdpc3RlciBwb2ludHMgdG8gQkMgQ0IgZm9yIHF1ZXVlIDAsIG11c3QgYmUgb24gMTAyNC1ieXRlIGJvdW5kYXJ5LgotICogT3RoZXJzIGFyZSBzcGFjZWQgYnkgMTAyNCBieXRlcy4KLSAqIEVhY2ggQkMgQ0IgaXMgMiBieXRlcyAqICgyNTYgKyA2NCkgPSA3NDAgYnl0ZXMsIGZvbGxvd2VkIGJ5IDM4NCBieXRlcyBwYWQuCi0gKiAoSW5kZXggaW50byBhIHF1ZXVlJ3MgQkMgQ0IpID0gKGluZGV4IGludG8gcXVldWUncyBURkQgQ0IpID0gKFNTTiAmIDB4ZmYpLgotICogQml0IGZpZWxkczoKLSAqIDI1LTAwOiAgQnl0ZSBDb3VudCBDQiBwaHlzaWNhbCBhZGRyZXNzIFszNToxMF0sIG11c3QgYmUgMTAyNC1ieXRlIGFsaWduZWQuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MTApCi0KLS8qCi0gKiBFbmFibGVzIGFueS9hbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMuCi0gKiBTY2hlZHVsZXIgZ2VuZXJhdGVzIHJlcXVlc3RzIGZvciBvbmx5IHRoZSBhY3RpdmUgY2hhbm5lbHMuCi0gKiBTZXQgdGhpcyB0byAweGZmIHRvIGVuYWJsZSBhbGwgOCBjaGFubmVscyAobm9ybWFsIHVzYWdlKS4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAgNy0gMDogIEVuYWJsZSAoMSksIGRpc2FibGUgKDApLCBvbmUgYml0IGZvciBlYWNoIGNoYW5uZWwgMC03Ci0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RYRkFDVCAgICAgICAgICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MWMpCi0vKgotICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpbmRleGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgotICogSW5pdGlhbGl6ZWQgYW5kIHVwZGF0ZWQgYnkgZHJpdmVyIGFzIG5ldyBURkRzIGFyZSBhZGRlZCB0byBxdWV1ZS4KLSAqIE5PVEU6ICBJZiB1c2luZyBCbG9jayBBY2ssIGluZGV4IG11c3QgY29ycmVzcG9uZCB0byBmcmFtZSdzCi0gKiAgICAgICAgU3RhcnQgU2VxdWVuY2UgTnVtYmVyOyBpbmRleCA9IChTU04gJiAweGZmKQotICogTk9URTogIEFsdGVybmF0aXZlIHRvIEhCVVNfVEFSR19XUlBUUiwgd2hpY2ggaXMgd2hhdCBMaW51eCBkcml2ZXIgdXNlcz8KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfV1JQVFIoeCkgIChJV0w0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgyNCArICh4KSAqIDQpCi0KLS8qCi0gKiBRdWV1ZSAoeCkgUmVhZCBQb2ludGVycyAoaW5kZXhlcywgcmVhbGx5ISksIG9uZSBmb3IgZWFjaCBUeCBxdWV1ZS4KLSAqIEZvciBGSUZPIG1vZGUsIGluZGV4IGluZGljYXRlcyBuZXh0IGZyYW1lIHRvIHRyYW5zbWl0LgotICogRm9yIFNjaGVkdWxlci1BQ0sgbW9kZSwgaW5kZXggaW5kaWNhdGVzIGZpcnN0IGZyYW1lIGluIFR4IHdpbmRvdy4KLSAqIEluaXRpYWxpemVkIGJ5IGRyaXZlciwgdXBkYXRlZCBieSBzY2hlZHVsZXIuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKHgpICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NjQgKyAoeCkgKiA0KQotCi0vKgotICogU2VsZWN0IHdoaWNoIHF1ZXVlcyB3b3JrIGluIGNoYWluIG1vZGUgKDEpIHZzLiBub3QgKDApLgotICogVXNlIGNoYWluIG1vZGUgdG8gYnVpbGQgY2hhaW5zIG9mIGFnZ3JlZ2F0ZWQgZnJhbWVzLgotICogQml0IGZpZWxkczoKLSAqIDMxLTE2OiAgUmVzZXJ2ZWQKLSAqIDE1LTAwOiAgTW9kZSwgb25lIGJpdCBmb3IgZWFjaCBxdWV1ZSAtLSAxOiBDaGFpbiBtb2RlLCAwOiBvbmUtYXQtYS10aW1lCi0gKiBOT1RFOiAgSWYgZHJpdmVyIHNldHMgdXAgcXVldWUgZm9yIGNoYWluIG1vZGUsIGl0IHNob3VsZCBiZSBhbHNvIHNldCB1cAotICogICAgICAgIFNjaGVkdWxlci1BQ0sgbW9kZSBhcyB3ZWxsLCB2aWEgU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpLgotICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweGQwKQotCi0vKgotICogU2VsZWN0IHdoaWNoIHF1ZXVlcyBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gc2NoZWR1bGVyIGluY3JlbWVudHMKLSAqIGEgcXVldWUncyByZWFkIHBvaW50ZXIgKGluZGV4KS4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAzMS0xNjogIFJlc2VydmVkCi0gKiAxNS0wMDogIEludGVycnVwdCBlbmFibGUsIG9uZSBiaXQgZm9yIGVhY2ggcXVldWUgLS0gMTogZW5hYmxlZCwgMDogZGlzYWJsZWQKLSAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXBwYXJlbnRseSBhIG5vLW9wOyBkcml2ZXIgcmVsaWVzIG9uIGludGVycnVwdHMKLSAqICAgICAgICBmcm9tIFJ4IHF1ZXVlIHRvIHJlYWQgVHggY29tbWFuZCByZXNwb25zZXMgYW5kIHVwZGF0ZSBUeCBxdWV1ZXMuCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4ZTQpCi0KLS8qCi0gKiBRdWV1ZSBzZWFyY2ggc3RhdHVzIHJlZ2lzdGVycy4gIE9uZSBmb3IgZWFjaCBxdWV1ZS4KLSAqIFNldHMgdXAgcXVldWUgbW9kZSBhbmQgYXNzaWducyBxdWV1ZSB0byBUeCBETUEgY2hhbm5lbC4KLSAqIEJpdCBmaWVsZHM6Ci0gKiAxOS0xMDogV3JpdGUgbWFzay9lbmFibGUgYml0cyBmb3IgYml0cyAwLTkKLSAqICAgICA5OiBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjAiCi0gKiAgICAgODogU2NoZWR1bGVyLUFDSyBtb2RlICgxKSwgbm9uLVNjaGVkdWxlci1BQ0sgKGkuZS4gRklGTykgbW9kZSAoMCkuCi0gKiAgICAgICAgRHJpdmVyIHNob3VsZCBpbml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIG90aGVyd2lzZS4KLSAqICAgNy02OiBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjAiCi0gKiAgICAgNTogV2luZG93IFNpemUgTGVmdDsgaW5kaWNhdGVzIHdoZXRoZXIgc2NoZWR1bGVyIGNhbiByZXF1ZXN0Ci0gKiAgICAgICAgYW5vdGhlciBURkQsIGJhc2VkIG9uIHdpbmRvdyBzaXplLCBldGMuICBEcml2ZXIgc2hvdWxkIGluaXQKLSAqICAgICAgICB0aGlzIGJpdCB0byAiMSIgZm9yIGFnZ3JlZ2F0aW9uIG1vZGUsIG9yICIwIiBmb3Igbm9uLWFnZy4KLSAqICAgNC0xOiBUeCBGSUZPIHRvIHVzZSAocmFuZ2UgMC03KS4KLSAqICAgICAwOiBRdWV1ZSBpcyBhY3RpdmUgKDEpLCBub3QgYWN0aXZlICgwKS4KLSAqIE90aGVyIGJpdHMgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgIjAiCi0gKgotICogTk9URTogIElmIGVuYWJsaW5nIFNjaGVkdWxlci1BQ0sgbW9kZSwgY2hhaW4gbW9kZSBzaG91bGQgYWxzbyBiZSBlbmFibGVkCi0gKiAgICAgICAgdmlhIFNDRF9RVUVVRUNIQUlOX1NFTC4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFMoeClcCi0JKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDEwNCArICh4KSAqIDQpCi0KLS8qIEJpdCBmaWVsZCBwb3NpdGlvbnMgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUJKDApCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfVFhGCSgxKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNSkKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNLCSg4KQotCi0vKiBXcml0ZSBtYXNrcyAqLwotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4JKDEwKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLCQkoMHgwMDA3RkMwMCkKLQotLyoqCi0gKiA0OTY1IGludGVybmFsIFNSQU0gc3RydWN0dXJlcyBmb3Igc2NoZWR1bGVyLCBzaGFyZWQgd2l0aCBkcml2ZXIgLi4uCi0gKgotICogRHJpdmVyIHNob3VsZCBjbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgZm9sbG93aW5nIGFyZWFzIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiByZXNwb25zZSBmcm9tIDQ5NjUgdUNvZGUsIGkuZS4gYWZ0ZXIgaW5pdGlhbAotICogdUNvZGUgbG9hZCwgb3IgYWZ0ZXIgYSB1Q29kZSBsb2FkIGRvbmUgZm9yIGVycm9yIHJlY292ZXJ5OgotICoKLSAqIFNDRF9DT05URVhUX0RBVEFfT0ZGU0VUIChzaXplIDEyOCBieXRlcykKLSAqIFNDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQgKHNpemUgMjU2IGJ5dGVzKQotICogU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUIChzaXplIDMyIGJ5dGVzKQotICoKLSAqIERyaXZlciBhY2Nlc3NlcyBTUkFNIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVnaXN0ZXJzLgotICogRHJpdmVyIHJlYWRzIGJhc2UgYWRkcmVzcyBvZiB0aGlzIHNjaGVkdWxlciBhcmVhIGZyb20gU0NEX1NSQU1fQkFTRV9BRERSLgotICogQWxsIE9GRlNFVCB2YWx1ZXMgbXVzdCBiZSBhZGRlZCB0byB0aGlzIGJhc2UgYWRkcmVzcy4KLSAqLwotCi0vKgotICogUXVldWUgY29udGV4dC4gIE9uZSA4LWJ5dGUgZW50cnkgZm9yIGVhY2ggb2YgMTYgcXVldWVzLgotICoKLSAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAweDgwKSB0byAwIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFkZGl0aW9uYWxseSwgZHJpdmVyIHNob3VsZCBpbml0Ci0gKiBlYWNoIHF1ZXVlJ3MgZW50cnkgYXMgZm9sbG93czoKLSAqCi0gKiBMUyBEd29yZCBiaXQgZmllbGRzOgotICogIDAtMDY6ICBNYXggVHggd2luZG93IHNpemUgZm9yIFNjaGVkdWxlci1BQ0suICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gNjQuCi0gKgotICogTVMgRHdvcmQgYml0IGZpZWxkczoKLSAqIDE2LTIyOiAgRnJhbWUgbGltaXQuICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gMTAgKDB4YSkuCi0gKgotICogRHJpdmVyIHNob3VsZCBpbml0IGFsbCBvdGhlciBiaXRzIHRvIDAuCi0gKgotICogSW5pdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgZHJpdmVyIHJlY2VpdmVzICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSA0OTY1IHVDb2RlLAotICogYW5kIHdoZW4gc2V0dGluZyB1cCBxdWV1ZSBmb3IgYWdncmVnYXRpb24uCi0gKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQJCQkweDM4MAotI2RlZmluZSBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoeCkgXAotCQkJKElXTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUICsgKCh4KSAqIDgpKQotCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MJCSgwKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfTVNLCQkoMHgwMDAwMDA3RikKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUwkoMTYpCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0sJKDB4MDA3RjAwMDApCi0KLS8qCi0gKiBUeCBTdGF0dXMgQml0bWFwCi0gKgotICogRHJpdmVyIHNob3VsZCBjbGVhciB0aGlzIGVudGlyZSBhcmVhIChzaXplIDB4MTAwKSB0byAwIGFmdGVyIHJlY2VpdmluZwotICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFyZWEgaXMgdXNlZCBvbmx5IGJ5IGRldmljZSBpdHNlbGY7Ci0gKiBubyBvdGhlciBzdXBwb3J0IChiZXNpZGVzIGNsZWFyaW5nKSBpcyByZXF1aXJlZCBmcm9tIGRyaXZlci4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfVFhfU1RUU19CSVRNQVBfT0ZGU0VUCQkweDQwMAotCi0vKgotICogUkF4VElEIHRvIHF1ZXVlIHRyYW5zbGF0aW9uIG1hcHBpbmcuCi0gKgotICogV2hlbiBxdWV1ZSBpcyBpbiBTY2hlZHVsZXItQUNLIG1vZGUsIGZyYW1lcyBwbGFjZWQgaW4gYSB0aGF0IHF1ZXVlIG11c3QgYmUKLSAqIGZvciBvbmx5IG9uZSBjb21iaW5hdGlvbiBvZiByZWNlaXZlciBhZGRyZXNzIChSQSkgYW5kIHRyYWZmaWMgSUQgKFRJRCksIGkuZS4KLSAqIG9uZSBRT1MgcHJpb3JpdHkgbGV2ZWwgZGVzdGluZWQgZm9yIG9uZSBzdGF0aW9uIChmb3IgdGhpcyB3aXJlbGVzcyBsaW5rLAotICogbm90IGZpbmFsIGRlc3RpbmF0aW9uKS4gIFRoZSBTQ0RfVFJBTlNMQVRFX1RBQkxFIGFyZWEgcHJvdmlkZXMgMTYgMTYtYml0Ci0gKiBtYXBwaW5ncywgb25lIGZvciBlYWNoIG9mIHRoZSAxNiBxdWV1ZXMuICBJZiBxdWV1ZSBpcyBub3QgaW4gU2NoZWR1bGVyLUFDSwotICogbW9kZSwgdGhlIGRldmljZSBpZ25vcmVzIHRoZSBtYXBwaW5nIHZhbHVlLgotICoKLSAqIEJpdCBmaWVsZHMsIGZvciBlYWNoIDE2LWJpdCBtYXA6Ci0gKiAxNS05OiAgUmVzZXJ2ZWQsIHNldCB0byAwCi0gKiAgOC00OiAgSW5kZXggaW50byBkZXZpY2UncyBzdGF0aW9uIHRhYmxlIGZvciByZWNpcGllbnQgc3RhdGlvbgotICogIDMtMDogIFRyYWZmaWMgSUQgKHRpZCksIHJhbmdlIDAtMTUKLSAqCi0gKiBEcml2ZXIgc2hvdWxkIGNsZWFyIHRoaXMgZW50aXJlIGFyZWEgKHNpemUgMzIgYnl0ZXMpIHRvIDAgYWZ0ZXIgcmVjZWl2aW5nCi0gKiAiQWxpdmUiIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlLiAgVG8gdXBkYXRlIGEgMTYtYml0IG1hcCB2YWx1ZSwgZHJpdmVyCi0gKiBtdXN0IHJlYWQgYSBkd29yZC1hbGlnbmVkIHZhbHVlIGZyb20gZGV2aWNlIFNSQU0sIHJlcGxhY2UgdGhlIDE2LWJpdCBtYXAKLSAqIHZhbHVlIG9mIGludGVyZXN0LCBhbmQgd3JpdGUgdGhlIGR3b3JkIHZhbHVlIGJhY2sgaW50byBkZXZpY2UgU1JBTS4KLSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQJCTB4NTAwCi0KLS8qIEZpbmQgdHJhbnNsYXRpb24gdGFibGUgZHdvcmQgdG8gcmVhZC93cml0ZSBmb3IgZ2l2ZW4gcXVldWUgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKLQkoKElXTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVCArICgoeCkgKiAyKSkgJiAweGZmZmZmZmZjKQotCi0jZGVmaW5lIElXTF9TQ0RfVFhGSUZPX1BPU19USUQJCQkoMCkKLSNkZWZpbmUgSVdMX1NDRF9UWEZJRk9fUE9TX1JBCQkJKDQpCi0jZGVmaW5lIElXTF9TQ0RfUVVFVUVfUkFfVElEX01BUF9SQVRJRF9NU0sJKDB4MDFGRikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqIEVORCBUWCBTQ0hFRFVMRVIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmCQkJCS8qIF9faXdsX2xlZ2FjeV9wcnBoX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ZDBhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJYLUZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KLSAqCi0gKiBEcml2ZXIgYWxsb2NhdGVzIGEgY2lyY3VsYXIgYnVmZmVyIG9mIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSwKLSAqIGVhY2ggb2Ygd2hpY2ggcG9pbnQgdG8gUmVjZWl2ZSBCdWZmZXJzIHRvIGJlIGZpbGxlZCBieSB0aGUgTklDLiAgVGhlc2UgZ2V0Ci0gKiB1c2VkIG5vdCBvbmx5IGZvciBSeCBmcmFtZXMsIGJ1dCBmb3IgYW55IGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCi0gKiBmcm9tIHRoZSBOSUMuICBUaGUgZHJpdmVyIGFuZCBOSUMgbWFuYWdlIHRoZSBSeCBidWZmZXJzIGJ5IG1lYW5zCi0gKiBvZiBpbmRleGVzIGludG8gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KLSAqCi0gKiBSeCBRdWV1ZSBJbmRleGVzCi0gKiBUaGUgaG9zdC9maXJtd2FyZSBzaGFyZSB0d28gaW5kZXggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KLSAqCi0gKiBUaGUgUkVBRCBpbmRleCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZwotICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAotICogZ29vZCBkYXRhLgotICogVGhlIFJFQUQgaW5kZXggaXMgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUgb25jZSB0aGUgY2FyZCBpcyBlbmFibGVkLgotICoKLSAqIFRoZSBXUklURSBpbmRleCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKLSAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCi0gKgotICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCi0gKiBXUklURSA9IFJFQUQuCi0gKgotICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAotICogSU5ERVggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKLSAqCi0gKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpbmRleAotICogYW5kIGZpcmUgdGhlIFJYIGludGVycnVwdC4gIFRoZSBkcml2ZXIgY2FuIHRoZW4gcXVlcnkgdGhlIFJFQUQgaW5kZXggYW5kCi0gKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpbmRleCBmb3J3YXJkIGFzIGl0Ci0gKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgotICoKLSAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKLSAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCi0gKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCi0gKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCi0gKiArIEluIGl3bF9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCi0gKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJTkRFWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKLSAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaW5kZXhlcyBhcyB3ZWxsKQotICogKyBBIHJlY2VpdmVkIHBhY2tldCBpcyBwcm9jZXNzZWQgYW5kIGhhbmRlZCB0byB0aGUga2VybmVsIG5ldHdvcmsgc3RhY2ssCi0gKiAgIGRldGFjaGVkIGZyb20gdGhlIGl3bC0+cnhxLiAgVGhlIGRyaXZlciAncHJvY2Vzc2VkJyBpbmRleCBpcyB1cGRhdGVkLgotICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQotICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECi0gKiAgIElOREVYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXdsLT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKLSAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgotICoKLSAqCi0gKiBEcml2ZXIgc2VxdWVuY2U6Ci0gKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYygpICAgQWxsb2NhdGVzIHJ4X2ZyZWUKLSAqIGl3bF9yeF9yZXBsZW5pc2goKSAgICAgUmVwbGVuaXNoZXMgcnhfZnJlZSBsaXN0IGZyb20gcnhfdXNlZCwgYW5kIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd2xfcnhfcXVldWVfcmVzdG9jawotICogaXdsX3J4X3F1ZXVlX3Jlc3RvY2soKSBNb3ZlcyBhdmFpbGFibGUgYnVmZmVycyBmcm9tIHJ4X2ZyZWUgaW50byBSeAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHVwZGF0ZXMgZmlybXdhcmUgcG9pbnRlcnMsIGFuZCB1cGRhdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgV1JJVEUgaW5kZXguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaXdsX3J4X3JlcGxlbmlzaAotICoKLSAqIC0tIGVuYWJsZSBpbnRlcnJ1cHRzIC0tCi0gKiBJU1IgLSBpd2xfcngoKSAgICAgICAgIERldGFjaCBpd2xfcnhfbWVtX2J1ZmZlcnMgZnJvbSBwb29sIHVwIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRCBJTkRFWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGl3bF9yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgotICogLi4uCi0gKgotICovCi0KLS8qKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCi0gKi8KLWludCBpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpCi17Ci0JaW50IHMgPSBxLT5yZWFkIC0gcS0+d3JpdGU7Ci0JaWYgKHMgPD0gMCkKLQkJcyArPSBSWF9RVUVVRV9TSVpFOwotCS8qIGtlZXAgc29tZSBidWZmZXIgdG8gbm90IGNvbmZ1c2UgZnVsbCBhbmQgZW1wdHkgcXVldWUgKi8KLQlzIC09IDI7Ci0JaWYgKHMgPCAwKQotCQlzID0gMDsKLQlyZXR1cm4gczsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9xdWV1ZV9zcGFjZSk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByeF93cnRfcHRyX3JlZyA9IHByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZzsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChxLT5uZWVkX3VwZGF0ZSA9PSAwKQotCQlnb3RvIGV4aXRfdW5sb2NrOwotCi0JLyogSWYgcG93ZXItc2F2aW5nIGlzIGluIHVzZSwgbWFrZSBzdXJlIGRldmljZSBpcyBhd2FrZSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9XRVJfUE1JLCAmcHJpdi0+c3RhdHVzKSkgewotCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiUnggcXVldWUgcmVxdWVzdGluZyB3YWtldXAsIgotCQkJCSIgR1AxID0gMHgleFxuIiwgcmVnKTsKLQkJCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLQkJCWdvdG8gZXhpdF91bmxvY2s7Ci0JCX0KLQotCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByeF93cnRfcHRyX3JlZywKLQkJCQlxLT53cml0ZV9hY3R1YWwpOwotCi0JLyogRWxzZSBkZXZpY2UgaXMgYXNzdW1lZCB0byBiZSBhd2FrZSAqLwotCX0gZWxzZSB7Ci0JCS8qIERldmljZSBleHBlY3RzIGEgbXVsdGlwbGUgb2YgOCAqLwotCQlxLT53cml0ZV9hY3R1YWwgPSAocS0+d3JpdGUgJiB+MHg3KTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByeF93cnRfcHRyX3JlZywKLQkJCXEtPndyaXRlX2FjdHVhbCk7Ci0JfQotCi0JcS0+bmVlZF91cGRhdGUgPSAwOwotCi0gZXhpdF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIpOwotCi1pbnQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnJ4cS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7Ci0KLQkvKiBBbGxvYyB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIFJlYWQgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSAqLwotCXJ4cS0+YmQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgJnJ4cS0+YmRfZG1hLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeHEtPmJkKQotCQlnb3RvIGVycl9iZDsKLQotCXJ4cS0+cmJfc3R0cyA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCi0JCQkJCSAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOwotCWlmICghcnhxLT5yYl9zdHRzKQotCQlnb3RvIGVycl9yYjsKLQotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspCi0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQotCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQotCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLwotCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOwotCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKLQlyeHEtPmZyZWVfY291bnQgPSAwOwotCXJ4cS0+bmVlZF91cGRhdGUgPSAwOwotCXJldHVybiAwOwotCi1lcnJfcmI6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCi0JCQkgIHJ4cS0+YmRfZG1hKTsKLWVycl9iZDoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9xdWV1ZV9hbGxvYyk7Ci0KLQotdm9pZCBpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uICpyZXBvcnQgPSAmKHBrdC0+dS5zcGVjdHJ1bV9ub3RpZik7Ci0KLQlpZiAoIXJlcG9ydC0+c3RhdGUpIHsKLQkJSVdMX0RFQlVHXzExSChwcml2LAotCQkJIlNwZWN0cnVtIE1lYXN1cmUgTm90aWZpY2F0aW9uOiBTdGFydFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoJnByaXYtPm1lYXN1cmVfcmVwb3J0LCByZXBvcnQsIHNpemVvZigqcmVwb3J0KSk7Ci0JcHJpdi0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX1JFQURZOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYpOwotCi0vKgotICogcmV0dXJucyBub24temVybyBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKLSAqLwotaW50IGl3bF9sZWdhY3lfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkgICB1MzIgZGVjcnlwdF9yZXMsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpCi17Ci0JdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCS8qCi0JICogQWxsIGNvbnRleHRzIGhhdmUgdGhlIHNhbWUgc2V0dGluZyBoZXJlIGR1ZSB0byBpdCBiZWluZwotCSAqIGEgbW9kdWxlIHBhcmFtZXRlciwgc28gT0sgdG8gY2hlY2sgYW55IGNvbnRleHQuCi0JICovCi0JaWYgKHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJgotCQkJCQkJUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLKQotCQlyZXR1cm4gMDsKLQotCWlmICghKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkKLQkJcmV0dXJuIDA7Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImRlY3J5cHRfcmVzOjB4JXhcbiIsIGRlY3J5cHRfcmVzKTsKLQlzd2l0Y2ggKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spIHsKLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfVEtJUDoKLQkJLyogVGhlIHVDb2RlIGhhcyBnb3QgYSBiYWQgcGhhc2UgMSBLZXksIHB1c2hlcyB0aGUgcGFja2V0LgotCQkgKiBEZWNyeXB0aW9uIHdpbGwgYmUgZG9uZSBpbiBTVy4gKi8KLQkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KLQkJICAgIFJYX1JFU19TVEFUVVNfQkFEX0tFWV9UVEFLKQotCQkJYnJlYWs7Ci0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfV0VQOgotCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQotCQkgICAgUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQykgewotCQkJLyogYmFkIElDViwgdGhlIHBhY2tldCBpcyBkZXN0cm95ZWQgc2luY2UgdGhlCi0JCQkgKiBkZWNyeXB0aW9uIGlzIGlucGxhY2UsIGRyb3AgaXQgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LCAiUGFja2V0IGRlc3Ryb3llZFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKLQkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KLQkJICAgIFJYX1JFU19TVEFUVVNfREVDUllQVF9PSykgewotCQkJSVdMX0RFQlVHX1JYKHByaXYsICJodyBkZWNyeXB0IHN1Y2Nlc3NmdWxseSEhIVxuIik7Ci0JCQlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfZGVjcnlwdGVkX2ZsYWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zY2FuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjUyMjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0KLS8qIEZvciBhY3RpdmUgc2NhbiwgbGlzdGVuIEFDVElWRV9EV0VMTF9USU1FIChtc2VjKSBvbiBlYWNoIGNoYW5uZWwgYWZ0ZXIKLSAqIHNlbmRpbmcgcHJvYmUgcmVxLiAgVGhpcyBzaG91bGQgYmUgc2V0IGxvbmcgZW5vdWdoIHRvIGhlYXIgcHJvYmUgcmVzcG9uc2VzCi0gKiBmcm9tIG1vcmUgdGhhbiBvbmUgQVAuICAqLwotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfMjQgICAgKDMwKSAgICAgICAvKiBhbGwgdGltZXMgaW4gbXNlYyAqLwotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfNTIgICAgKDIwKQotCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICgzKQotI2RlZmluZSBJV0xfQUNUSVZFX0RXRUxMX0ZBQ1RPUl81MkdIWiAoMikKLQotLyogRm9yIHBhc3NpdmUgc2NhbiwgbGlzdGVuIFBBU1NJVkVfRFdFTExfVElNRSAobXNlYykgb24gZWFjaCBjaGFubmVsLgotICogTXVzdCBiZSBzZXQgbG9uZ2VyIHRoYW4gYWN0aXZlIGR3ZWxsIHRpbWUuCi0gKiBGb3IgdGhlIG1vc3QgcmVsaWFibGUgc2Nhbiwgc2V0ID4gQVAgYmVhY29uIGludGVydmFsICh0eXBpY2FsbHkgMTAwbXNlYykuICovCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgICAoMjApICAgICAgIC8qIGFsbCB0aW1lcyBpbiBtc2VjICovCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfNTIgICAoMTApCi0jZGVmaW5lIElXTF9QQVNTSVZFX0RXRUxMX0JBU0UgICAgICAoMTAwKQotI2RlZmluZSBJV0xfQ0hBTk5FTF9UVU5FX1RJTUUgICAgICAgNQotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2VuZF9zY2FuX2Fib3J0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1NDQU5fQUJPUlRfQ01ELAotCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCi0JfTsKLQotCS8qIEV4aXQgaW5zdGFudGx5IHdpdGggZXJyb3Igd2hlbiBkZXZpY2UgaXMgbm90IHJlYWR5Ci0JICogdG8gcmVjZWl2ZSBzY2FuIGFib3J0IGNvbW1hbmQgb3IgaXQgZG9lcyBub3QgcGVyZm9ybQotCSAqIGhhcmR3YXJlIHNjYW4gY3VycmVudGx5ICovCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgICF0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgICF0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPnUuc3RhdHVzICE9IENBTl9BQk9SVF9TVEFUVVMpIHsKLQkJLyogVGhlIHNjYW4gYWJvcnQgd2lsbCByZXR1cm4gMSBmb3Igc3VjY2VzcyBvcgotCQkgKiAyIGZvciAiZmFpbHVyZSIuICBBIGZhaWx1cmUgY29uZGl0aW9uIGNhbiBiZQotCQkgKiBkdWUgdG8gc2ltcGx5IG5vdCBiZWluZyBpbiBhbiBhY3RpdmUgc2NhbiB3aGljaAotCQkgKiBjYW4gb2NjdXIgaWYgd2Ugc2VuZCB0aGUgc2NhbiBhYm9ydCBiZWZvcmUgd2UKLQkJICogdGhlIG1pY3JvY29kZSBoYXMgbm90aWZpZWQgdXMgdGhhdCBhIHNjYW4gaXMKLQkJICogY29tcGxldGVkLiAqLwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU0NBTl9BQk9SVCByZXQgJWQuXG4iLCBwa3QtPnUuc3RhdHVzKTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfY29tcGxldGVfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgYWJvcnRlZCkKLXsKLQkvKiBjaGVjayBpZiBzY2FuIHdhcyByZXF1ZXN0ZWQgZnJvbSBtYWM4MDIxMSAqLwotCWlmIChwcml2LT5zY2FuX3JlcXVlc3QpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkNvbXBsZXRlIHNjYW4gaW4gbWFjODAyMTFcbiIpOwotCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQocHJpdi0+aHcsIGFib3J0ZWQpOwotCX0KLQotCXByaXYtPnNjYW5fdmlmID0gTlVMTDsKLQlwcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotfQotCi12b2lkIGl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiRm9yY2luZyBzY2FuIGVuZCB3aGlsZSBub3Qgc2Nhbm5pbmdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkZvcmNpbmcgc2NhbiBlbmRcbiIpOwotCWNsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCWNsZWFyX2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JY2xlYXJfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlpd2xfbGVnYWN5X2NvbXBsZXRlX3NjYW4ocHJpdiwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfZG9fc2Nhbl9hYm9ydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiTm90IHBlcmZvcm1pbmcgc2NhbiB0byBhYm9ydFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWJvcnQgaW4gcHJvZ3Jlc3NcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX3NjYW5fYWJvcnQocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2VuZCBzY2FuIGFib3J0IGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChwcml2KTsKLQl9IGVsc2UKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN1Y2Nlc3NmdWxseSBzZW5kIHNjYW4gYWJvcnRcbiIpOwotfQotCi0vKioKLSAqIGl3bF9zY2FuX2NhbmNlbCAtIENhbmNlbCBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBIVyBzY2FuCi0gKi8KLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfU0NBTihwcml2LCAiUXVldWluZyBhYm9ydCBzY2FuXG4iKTsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmFib3J0X3NjYW4pOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQgLSBDYW5jZWwgYW55IGN1cnJlbnRseSBleGVjdXRpbmcgSFcgc2NhbgotICogQG1zOiBhbW91bnQgb2YgdGltZSB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBzY2FuIHRvIGFib3J0Ci0gKgotICovCi1pbnQgaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcykKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcyk7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjYW5jZWwgdGltZW91dFxuIik7Ci0KLQlpd2xfbGVnYWN5X2RvX3NjYW5fYWJvcnQocHJpdik7Ci0KLQl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpIHsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cykpCi0JCQlicmVhazsKLQkJbXNsZWVwKDIwKTsKLQl9Ci0KLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQpOwotCi0vKiBTZXJ2aWNlIHJlc3BvbnNlIHRvIFJFUExZX1NDQU5fQ01EICgweDgwKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9yZXBseV9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2NhbnJlcV9ub3RpZmljYXRpb24gKm5vdGlmID0KLQkgICAgKHN0cnVjdCBpd2xfc2NhbnJlcV9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gcmVxdWVzdCBzdGF0dXMgPSAweCV4XG4iLCBub3RpZi0+c3RhdHVzKTsKLSNlbmRpZgotfQotCi0vKiBTZXJ2aWNlIFNDQU5fU1RBUlRfTk9USUZJQ0FUSU9OICgweDgyKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX3N0YXJ0X25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9zY2Fuc3RhcnRfbm90aWZpY2F0aW9uICpub3RpZiA9Ci0JICAgIChzdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKilwa3QtPnUucmF3OwotCXByaXYtPnNjYW5fc3RhcnRfdHNmID0gbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpOwotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIHN0YXJ0OiAiCi0JCSAgICAgICAiJWQgWzgwMi4xMSVzXSAiCi0JCSAgICAgICAiKFRTRjogMHglMDhYOiUwOFgpIC0gJWQgKGJlYWNvbiB0aW1lciAldSlcbiIsCi0JCSAgICAgICBub3RpZi0+Y2hhbm5lbCwKLQkJICAgICAgIG5vdGlmLT5iYW5kID8gImJnIiA6ICJhIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfaGlnaCksCi0JCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyksCi0JCSAgICAgICBub3RpZi0+c3RhdHVzLCBub3RpZi0+YmVhY29uX3RpbWVyKTsKLX0KLQotLyogU2VydmljZSBTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OICgweDgzKSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX3Jlc3VsdHNfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICpub3RpZiA9Ci0JICAgIChzdHJ1Y3QgaXdsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiAqKXBrdC0+dS5yYXc7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBjaC5yZXM6ICIKLQkJICAgICAgICIlZCBbODAyLjExJXNdICIKLQkJICAgICAgICIoVFNGOiAweCUwOFg6JTA4WCkgLSAlZCAiCi0JCSAgICAgICAiZWxhcHNlZD0lbHUgdXNlY1xuIiwKLQkJICAgICAgIG5vdGlmLT5jaGFubmVsLAotCQkgICAgICAgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9oaWdoKSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT5zdGF0aXN0aWNzWzBdKSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSAtIHByaXYtPnNjYW5fc3RhcnRfdHNmKTsKLSNlbmRpZgotfQotCi0vKiBTZXJ2aWNlIFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OICgweDg0KSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9yeF9zY2FuX2NvbXBsZXRlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX3NjYW5jb21wbGV0ZV9ub3RpZmljYXRpb24gKnNjYW5fbm90aWYgPSAodm9pZCAqKXBrdC0+dS5yYXc7Ci0jZW5kaWYKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkiU2NhbiBjb21wbGV0ZTogJWQgY2hhbm5lbHMgKFRTRiAweCUwOFg6JTA4WCkgLSAlZFxuIiwKLQkJICAgICAgIHNjYW5fbm90aWYtPnNjYW5uZWRfY2hhbm5lbHMsCi0JCSAgICAgICBzY2FuX25vdGlmLT50c2ZfbG93LAotCQkgICAgICAgc2Nhbl9ub3RpZi0+dHNmX2hpZ2gsIHNjYW5fbm90aWYtPnN0YXR1cyk7Ci0KLQkvKiBUaGUgSFcgaXMgbm8gbG9uZ2VyIHNjYW5uaW5nICovCi0JY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIG9uICVzR0h6IHRvb2sgJWRtc1xuIiwKLQkJICAgICAgIChwcml2LT5zY2FuX2JhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPyAiMi40IiA6ICI1LjIiLAotCQkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gcHJpdi0+c2Nhbl9zdGFydCkpOwotCi0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NvbXBsZXRlZCk7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBzY2FuIGhhbmRsZXJzICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU0NBTl9DTURdID0gaXdsX2xlZ2FjeV9yeF9yZXBseV9zY2FuOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NDQU5fU1RBUlRfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9zdGFydF9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9yZXN1bHRzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bF9sZWdhY3lfcnhfc2Nhbl9jb21wbGV0ZV9ub3RpZjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKTsKLQotaW5saW5lIHUxNiBpd2xfbGVnYWN5X2dldF9hY3RpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1OCBuX3Byb2JlcykKLXsKLQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyZXR1cm4gSVdMX0FDVElWRV9EV0VMTF9USU1FXzUyICsKLQkJCUlXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzUyR0haICogKG5fcHJvYmVzICsgMSk7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX0FDVElWRV9EV0VMTF9USU1FXzI0ICsKLQkJCUlXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICogKG5fcHJvYmVzICsgMSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKTsKLQotdTE2IGl3bF9sZWdhY3lfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQl1MTYgcGFzc2l2ZSA9IChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopID8KLQkgICAgSVdMX1BBU1NJVkVfRFdFTExfQkFTRSArIElXTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgOgotCSAgICBJV0xfUEFTU0lWRV9EV0VMTF9CQVNFICsgSVdMX1BBU1NJVkVfRFdFTExfVElNRV81MjsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCS8qCi0JCSAqIElmIHdlJ3JlIGFzc29jaWF0ZWQsIHdlIGNsYW1wIHRoZSBtYXhpbXVtIHBhc3NpdmUKLQkJICogZHdlbGwgdGltZSB0byBiZSA5OCUgb2YgdGhlIHNtYWxsZXN0IGJlYWNvbiBpbnRlcnZhbAotCQkgKiAobWludXMgMiAqIGNoYW5uZWwgdHVuZSB0aW1lKQotCQkgKi8KLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJCXUxNiB2YWx1ZTsKLQotCQkJaWYgKCFpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCi0JCQkJY29udGludWU7Ci0JCQl2YWx1ZSA9IGN0eC0+dmlmID8gY3R4LT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOwotCQkJaWYgKCh2YWx1ZSA+IElXTF9QQVNTSVZFX0RXRUxMX0JBU0UpIHx8ICF2YWx1ZSkKLQkJCQl2YWx1ZSA9IElXTF9QQVNTSVZFX0RXRUxMX0JBU0U7Ci0JCQl2YWx1ZSA9ICh2YWx1ZSAqIDk4KSAvIDEwMCAtIElXTF9DSEFOTkVMX1RVTkVfVElNRSAqIDI7Ci0JCQlwYXNzaXZlID0gbWluKHZhbHVlLCBwYXNzaXZlKTsKLQkJfQotCX0KLQotCXJldHVybiBwYXNzaXZlOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUpOwotCi12b2lkIGl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTggYW50X2lkeCA9IGZscyhwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KSAtIDE7Ci0JaWYgKCFwcml2LT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF81R0haXSkKLQkJcHJpdi0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBhbnRfaWR4OwotCWlmICghcHJpdi0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfMkdIWl0pCi0JCXByaXYtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gYW50X2lkeDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pbml0X3NjYW5fcGFyYW1zKTsKLQotc3RhdGljIGludCBpd2xfbGVnYWN5X3NjYW5faW5pdGlhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoV0FSTl9PTighcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5yZXF1ZXN0X3NjYW4pKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiUmVxdWVzdCBzY2FuIGNhbGxlZCB3aGVuIGRyaXZlciBub3QgcmVhZHkuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LAotCQkJIk11bHRpcGxlIGNvbmN1cnJlbnQgc2NhbiByZXF1ZXN0cyBpbiBwYXJhbGxlbC5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gcmVxdWVzdCB3aGlsZSBhYm9ydCBwZW5kaW5nLlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlN0YXJ0aW5nIHNjYW4uLi5cbiIpOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCXByaXYtPnNjYW5fc3RhcnQgPSBqaWZmaWVzOwotCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5yZXF1ZXN0X3NjYW4ocHJpdiwgdmlmKTsKLQlpZiAocmV0KSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zY2FuX2NoZWNrLAotCQkJICAgSVdMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xfbGVnYWN5X21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAocmVxLT5uX2NoYW5uZWxzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gYWxyZWFkeSBpbiBwcm9ncmVzcy5cbiIpOwotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JLyogbWFjODAyMTEgd2lsbCBvbmx5IGFzayBmb3Igb25lIGJhbmQgYXQgYSB0aW1lICovCi0JcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxOwotCXByaXYtPnNjYW5fdmlmID0gdmlmOwotCXByaXYtPnNjYW5fYmFuZCA9IHJlcS0+Y2hhbm5lbHNbMF0tPmJhbmQ7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NjYW5faW5pdGlhdGUocHJpdiwgdmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfaHdfc2Nhbik7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfYmdfc2Nhbl9jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgc2Nhbl9jaGVjay53b3JrKTsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGNoZWNrIHdvcmtcbiIpOwotCi0JLyogU2luY2Ugd2UgYXJlIGhlcmUgZmlybXdhcmUgZG9lcyBub3QgZmluaXNoIHNjYW4gYW5kCi0JICogbW9zdCBsaWtlbHkgaXMgaW4gYmFkIHNoYXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8KLQkgKiBzZW5kIGFib3J0IGNvbW1hbmQsIGp1c3QgZm9yY2Ugc2NhbiBjb21wbGV0ZSB0byBtYWM4MDIxMSAqLwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEgLSBmaWxsIGluIGFsbCByZXF1aXJlZCBmaWVsZHMgYW5kIElFIGZvciBwcm9iZSByZXF1ZXN0Ci0gKi8KLQotdTE2Ci1pd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKLQkJICAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllcywgaW50IGllX2xlbiwgaW50IGxlZnQpCi17Ci0JaW50IGxlbiA9IDA7Ci0JdTggKnBvcyA9IE5VTEw7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgcHJvYmUgcmVxdWVzdCwKLQkgKiB0d28gbWFuZGF0b3J5IElFcyBhbmQgdGhlIGRhdGEgKi8KLQlsZWZ0IC09IDI0OwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlmcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCW1lbWNweShmcmFtZS0+ZGEsIGl3bGVnYWN5X2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoZnJhbWUtPnNhLCB0YSwgRVRIX0FMRU4pOwotCW1lbWNweShmcmFtZS0+YnNzaWQsIGl3bGVnYWN5X2JjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQlmcmFtZS0+c2VxX2N0cmwgPSAwOwotCi0JbGVuICs9IDI0OwotCi0JLyogLi4ubmV4dCBJRS4uLiAqLwotCXBvcyA9ICZmcmFtZS0+dS5wcm9iZV9yZXEudmFyaWFibGVbMF07Ci0KLQkvKiBmaWxsIGluIG91ciBpbmRpcmVjdCBTU0lEIElFICovCi0JbGVmdCAtPSAyOwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JKnBvcysrID0gV0xBTl9FSURfU1NJRDsKLQkqcG9zKysgPSAwOwotCi0JbGVuICs9IDI7Ci0KLQlpZiAoV0FSTl9PTihsZWZ0IDwgaWVfbGVuKSkKLQkJcmV0dXJuIGxlbjsKLQotCWlmIChpZXMgJiYgaWVfbGVuKSB7Ci0JCW1lbWNweShwb3MsIGllcywgaWVfbGVuKTsKLQkJbGVuICs9IGllX2xlbjsKLQl9Ci0KLQlyZXR1cm4gKHUxNilsZW47Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEpOwotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JnX2Fib3J0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIGFib3J0X3NjYW4pOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkFib3J0IHNjYW4gd29ya1xuIik7Ci0KLQkvKiBXZSBrZWVwIHNjYW5fY2hlY2sgd29yayBxdWV1ZWQgaW4gY2FzZSB3aGVuIGZpcm13YXJlIHdpbGwgbm90Ci0JICogcmVwb3J0IGJhY2sgc2NhbiBjb21wbGV0ZWQgbm90aWZpY2F0aW9uICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2JnX3NjYW5fY29tcGxldGVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGl3bF9wcml2LCBzY2FuX2NvbXBsZXRlZCk7Ci0JYm9vbCBhYm9ydGVkOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkNvbXBsZXRlZCBzY2FuLlxuIik7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5zY2FuX2NoZWNrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWFib3J0ZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpOwotCWlmIChhYm9ydGVkKQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiQWJvcnRlZCBzY2FuIGNvbXBsZXRlZC5cbiIpOwotCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBhbHJlYWR5IGNvbXBsZXRlZC5cbiIpOwotCQlnb3RvIG91dF9zZXR0aW5nczsKLQl9Ci0KLQlpd2xfbGVnYWN5X2NvbXBsZXRlX3NjYW4ocHJpdiwgYWJvcnRlZCk7Ci0KLW91dF9zZXR0aW5nczoKLQkvKiBDYW4gd2Ugc3RpbGwgdGFsayB0byBmaXJtd2FyZSA/ICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogV2UgZG8gbm90IGNvbW1pdCBwb3dlciBzZXR0aW5ncyB3aGlsZSBzY2FuIGlzIHBlbmRpbmcsCi0JICogZG8gaXQgbm93IGlmIHRoZSBzZXR0aW5ncyBjaGFuZ2VkLgotCSAqLwotCWl3bF9sZWdhY3lfcG93ZXJfc2V0X21vZGUocHJpdiwgJnByaXYtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsIGZhbHNlKTsKLQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7Ci0KLQlwcml2LT5jZmctPm9wcy0+dXRpbHMtPnBvc3Rfc2Nhbihwcml2KTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi12b2lkIGl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJTklUX1dPUksoJnByaXYtPnNjYW5fY29tcGxldGVkLCBpd2xfbGVnYWN5X2JnX3NjYW5fY29tcGxldGVkKTsKLQlJTklUX1dPUksoJnByaXYtPmFib3J0X3NjYW4sIGl3bF9sZWdhY3lfYmdfYWJvcnRfc2Nhbik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnNjYW5fY2hlY2ssIGl3bF9sZWdhY3lfYmdfc2Nhbl9jaGVjayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKTsKLQotdm9pZCBpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPmFib3J0X3NjYW4pOwotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnNjYW5fY29tcGxldGVkKTsKLQotCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNjYW5fY2hlY2spKSB7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChwcml2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNwZWN0cnVtLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaAppbmRleCA5ZjcwYTQ3Li44NWZlNDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaApAQCAtMjYsOCArMjYsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBfX2l3bF9sZWdhY3lfc3BlY3RydW1faF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9zcGVjdHJ1bV9oX18KKyNpZm5kZWYgX19pbF9zcGVjdHJ1bV9oX18KKyNkZWZpbmUgX19pbF9zcGVjdHJ1bV9oX18KIGVudW0gewkJCQkvKiBpZWVlODAyMTFfYmFzaWNfcmVwb3J0Lm1hcCAqLwogCUlFRUU4MDIxMV9CQVNJQ19NQVBfQlNTID0gKDEgPDwgMCksCiAJSUVFRTgwMjExX0JBU0lDX01BUF9PRkRNID0gKDEgPDwgMSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmMKaW5kZXggNjZmMGZiMi4uNzVmZTMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuYwpAQCAtMzEsODEgKzMxLDgyIEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgogI2luY2x1ZGUgIml3bC1zdGEuaCIKIAotLyogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3N0YV91Y29kZV9hY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKKy8qIGlsLT5zdGFfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGlsX3N0YV91Y29kZV9hY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKIHsKIAotCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpCi0JCUlXTF9FUlIocHJpdiwKKwlpZiAoIShpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKQorCQlJTF9FUlIoCiAJCQkiQUNUSVZBVEUgYSBub24gRFJJVkVSIGFjdGl2ZSBzdGF0aW9uIGlkICV1IGFkZHIgJXBNXG4iLAotCQkJc3RhX2lkLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCQlzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CiAKLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSB7CisJCURfQVNTT0MoCiAJCQkiU1RBIGlkICV1IGFkZHIgJXBNIGFscmVhZHkgcHJlc2VudCIKIAkJCSIgaW4gdUNvZGUgKGFjY29yZGluZyB0byBkcml2ZXIpXG4iLAotCQkJc3RhX2lkLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCQlzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CiAJfSBlbHNlIHsKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfVUNPREVfQUNUSVZFOwotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIkFkZGVkIFNUQSBpZCAldSBhZGRyICVwTSB0byB1Q29kZVxuIiwKLQkJCQlzdGFfaWQsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfVUNPREVfQUNUSVZFOworCQlEX0FTU09DKCJBZGRlZCBTVEEgaWQgJXUgYWRkciAlcE0gdG8gdUNvZGVcbiIsCisJCQkJc3RhX2lkLCBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwogCX0KIH0KIAotc3RhdGljIGludCBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqYWRkc3RhLAotCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorc3RhdGljIGludCBpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJICAgIHN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEsCisJCQkJICAgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCwKIAkJCQkgICAgYm9vbCBzeW5jKQogewogCXU4IHN0YV9pZCA9IGFkZHN0YS0+c3RhLnN0YV9pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAtRUlPOwogCi0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9BRERfU1RBICgweCUwOFgpXG4iLAorCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfQUREX1NUQSAoMHglMDhYKVxuIiwKIAkJCXBrdC0+aGRyLmZsYWdzKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUHJvY2Vzc2luZyByZXNwb25zZSBmb3IgYWRkaW5nIHN0YXRpb24gJXVcbiIsCisJRF9JTkZPKCJQcm9jZXNzaW5nIHJlc3BvbnNlIGZvciBhZGRpbmcgc3RhdGlvbiAldVxuIiwKIAkJICAgICAgIHN0YV9pZCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHBrdC0+dS5hZGRfc3RhLnN0YXR1cykgewogCWNhc2UgQUREX1NUQV9TVUNDRVNTX01TSzoKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJFUExZX0FERF9TVEEgUEFTU0VEXG4iKTsKLQkJaXdsX2xlZ2FjeV9zdGFfdWNvZGVfYWN0aXZhdGUocHJpdiwgc3RhX2lkKTsKKwkJRF9JTkZPKCJDX0FERF9TVEEgUEFTU0VEXG4iKTsKKwkJaWxfc3RhX3Vjb2RlX2FjdGl2YXRlKGlsLCBzdGFfaWQpOwogCQlyZXQgPSAwOwogCQlicmVhazsKLQljYXNlIEFERF9TVEFfTk9fUk9PTV9JTl9UQUJMRToKLQkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyByb29tIGluIHRhYmxlLlxuIiwKKwljYXNlIEFERF9TVEFfTk9fUk9PTV9JTl9UQkw6CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyByb29tIGluIHRhYmxlLlxuIiwKIAkJCXN0YV9pZCk7CiAJCWJyZWFrOwogCWNhc2UgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0U6Ci0JCUlXTF9FUlIocHJpdiwKKwkJSUxfRVJSKAogCQkJIkFkZGluZyBzdGF0aW9uICVkIGZhaWxlZCwgbm8gYmxvY2sgYWNrIHJlc291cmNlLlxuIiwKIAkJCXN0YV9pZCk7CiAJCWJyZWFrOwogCWNhc2UgQUREX1NUQV9NT0RJRllfTk9OX0VYSVNUX1NUQToKLQkJSVdMX0VSUihwcml2LCAiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCisJCUlMX0VSUigiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCiAJCQlzdGFfaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlY2VpdmVkIFJFUExZX0FERF9TVEE6KDB4JTA4WClcbiIsCisJCURfQVNTT0MoIlJlY2VpdmVkIENfQUREX1NUQTooMHglMDhYKVxuIiwKIAkJCQlwa3QtPnUuYWRkX3N0YS5zdGF0dXMpOwogCQlicmVhazsKIAl9CiAKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJXMgc3RhdGlvbiBpZCAldSBhZGRyICVwTVxuIiwKLQkJICAgICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KKwlEX0lORk8oIiVzIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9PQogCQkgICAgICAgU1RBX0NPTlRST0xfTU9ESUZZX01TSyA/ICAiTW9kaWZpZWQiIDogIkFkZGVkIiwKLQkJICAgICAgIHN0YV9pZCwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCQkgICAgICAgc3RhX2lkLCBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwogCiAJLyoKIAkgKiBYWFg6IFRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgY29tbWFuZCBidWZmZXIgaXMgb2Z0ZW4gY2hhbmdlZCBmcm9tCkBAIC0xMTUsNjggKzExNiw2OCBAQAogCSAqIGlzc3VlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQgYW5kIHRoaXMgZGVidWdnaW5nIGlzIGxlZnQgdG8KIAkgKiBvYnNlcnZlIHRoZSBwcm9ibGVtLgogCSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICIlcyBzdGF0aW9uIGFjY29yZGluZyB0byBjbWQgYnVmZmVyICVwTVxuIiwKLQkJICAgICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KKwlEX0lORk8oIiVzIHN0YXRpb24gYWNjb3JkaW5nIHRvIGNtZCBidWZmZXIgJXBNXG4iLAorCQkgICAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KIAkJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwKIAkJICAgICAgIGFkZHN0YS0+c3RhLmFkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3N0YXRpYyB2b2lkIGlsX2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJCSBzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QpCiB7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqYWRkc3RhID0KLQkJKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCXN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEgPQorCQkoc3RydWN0IGlsX2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOwogCi0JaXdsX2xlZ2FjeV9wcm9jZXNzX2FkZF9zdGFfcmVzcChwcml2LCBhZGRzdGEsIHBrdCwgZmFsc2UpOworCWlsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKGlsLCBhZGRzdGEsIHBrdCwgZmFsc2UpOwogCiB9CiAKLWludCBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncykKK2ludCBpbF9zZW5kX2FkZF9zdGEoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgIHN0cnVjdCBpbF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKQogewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSBOVUxMOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAJdTggZGF0YVtzaXplb2YoKnN0YSldOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9BRERfU1RBLAorCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfQUREX1NUQSwKIAkJLmZsYWdzID0gZmxhZ3MsCiAJCS5kYXRhID0gZGF0YSwKIAl9OwogCXU4IHN0YV9pZCBfX21heWJlX3VudXNlZCA9IHN0YS0+c3RhLnN0YV9pZDsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBZGRpbmcgc3RhICV1ICglcE0pICVzc3luY2hyb25vdXNseVxuIiwKKwlEX0lORk8oIkFkZGluZyBzdGEgJXUgKCVwTSkgJXNzeW5jaHJvbm91c2x5XG4iLAogCQkgICAgICAgc3RhX2lkLCBzdGEtPnN0YS5hZGRyLCBmbGFncyAmIENNRF9BU1lOQyA/ICAiYSIgOiAiIik7CiAKIAlpZiAoZmxhZ3MgJiBDTURfQVNZTkMpCi0JCWNtZC5jYWxsYmFjayA9IGl3bF9sZWdhY3lfYWRkX3N0YV9jYWxsYmFjazsKKwkJY21kLmNhbGxiYWNrID0gaWxfYWRkX3N0YV9jYWxsYmFjazsKIAllbHNlIHsKIAkJY21kLmZsYWdzIHw9IENNRF9XQU5UX1NLQjsKIAkJbWlnaHRfc2xlZXAoKTsKIAl9CiAKLQljbWQubGVuID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOwotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJY21kLmxlbiA9IGlsLT5jZmctPm9wcy0+dXRpbHMtPmJ1aWxkX2FkZHN0YV9oY21kKHN0YSwgZGF0YSk7CisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCiAJaWYgKHJldCB8fCAoZmxhZ3MgJiBDTURfQVNZTkMpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJldCA9PSAwKSB7Ci0JCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCQlyZXQgPSBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIHN0YSwgcGt0LCB0cnVlKTsKKwkJcGt0ID0gKHN0cnVjdCBpbF9yeF9wa3QgKiljbWQucmVwbHlfcGFnZTsKKwkJcmV0ID0gaWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3AoaWwsIHN0YSwgcGt0LCB0cnVlKTsKIAl9Ci0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YSk7CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfYWRkX3N0YSk7CiAKLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfc2V0X2h0X2FkZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaW5kZXgsCitzdGF0aWMgdm9pZCBpbF9zZXRfaHRfYWRkX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZHgsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQorCQkJCSAgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKnN0YV9odF9pbmYgPSAmc3RhLT5odF9jYXA7CiAJX19sZTMyIHN0YV9mbGFnczsKQEAgLTE4NiwxMyArMTg3LDEzIEBACiAJCWdvdG8gZG9uZTsKIAogCW1pbW9fcHNfbW9kZSA9IChzdGFfaHRfaW5mLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyOwotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAic3BhdGlhbCBtdWx0aXBsZXhpbmcgcG93ZXIgc2F2ZSBtb2RlOiAlc1xuIiwKKwlEX0FTU09DKCJzcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlIG1vZGU6ICVzXG4iLAogCQkJKG1pbW9fcHNfbW9kZSA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpID8KIAkJCSJzdGF0aWMiIDoKIAkJCShtaW1vX3BzX21vZGUgPT0gV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQykgPwogCQkJImR5bmFtaWMiIDogImRpc2FibGVkIik7CiAKLQlzdGFfZmxhZ3MgPSBwcml2LT5zdGF0aW9uc1tpbmRleF0uc3RhLnN0YXRpb25fZmxhZ3M7CisJc3RhX2ZsYWdzID0gaWwtPnN0YXRpb25zW2lkeF0uc3RhLnN0YXRpb25fZmxhZ3M7CiAKIAlzdGFfZmxhZ3MgJj0gfihTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLIHwgU1RBX0ZMR19NSU1PX0RJU19NU0spOwogCkBAIC0yMDYsNyArMjA3LDcgQEAKIAljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBNSU1PIFBTIG1vZGUgJWRcbiIsIG1pbW9fcHNfbW9kZSk7CisJCUlMX1dBUk4oIkludmFsaWQgTUlNTyBQUyBtb2RlICVkXG4iLCBtaW1vX3BzX21vZGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTIxNiwyNyArMjE3LDI3IEBACiAJc3RhX2ZsYWdzIHw9IGNwdV90b19sZTMyKAogCSAgICAgICh1MzIpc3RhX2h0X2luZi0+YW1wZHVfZGVuc2l0eSA8PCBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfUE9TKTsKIAotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCisJaWYgKGlsX2lzX2h0NDBfdHhfYWxsb3dlZChpbCwgY3R4LCAmc3RhLT5odF9jYXApKQogCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19IVDQwX0VOX01TSzsKIAllbHNlCiAJCXN0YV9mbGFncyAmPSB+U1RBX0ZMR19IVDQwX0VOX01TSzsKIAotCXByaXYtPnN0YXRpb25zW2luZGV4XS5zdGEuc3RhdGlvbl9mbGFncyA9IHN0YV9mbGFnczsKKwlpbC0+c3RhdGlvbnNbaWR4XS5zdGEuc3RhdGlvbl9mbGFncyA9IHN0YV9mbGFnczsKICBkb25lOgogCXJldHVybjsKIH0KIAogLyoqCi0gKiBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbiAtIFByZXBhcmUgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWRkaXRpb24KKyAqIGlsX3ByZXBfc3RhdGlvbiAtIFByZXBhcmUgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWRkaXRpb24KICAqCiAgKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggc3RhX2xvY2sgaGVsZAogICovCi11OCBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCit1OCBpbF9wcmVwX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCiAJCSAgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CisJc3RydWN0IGlsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CiAJaW50IGk7Ci0JdTggc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKKwl1OCBzdGFfaWQgPSBJTF9JTlZBTElEX1NUQVRJT047CiAJdTE2IHJhdGU7CiAKIAlpZiAoaXNfYXApCkBAIC0yNDQsMTUgKzI0NSwxNSBAQAogCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQogCQlzdGFfaWQgPSBjdHgtPmJjYXN0X3N0YV9pZDsKIAllbHNlCi0JCWZvciAoaSA9IElXTF9TVEFfSUQ7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKLQkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkciwKKwkJZm9yIChpID0gSUxfU1RBX0lEOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoaWwtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkciwKIAkJCQkJCWFkZHIpKSB7CiAJCQkJc3RhX2lkID0gaTsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaWYgKCFwcml2LT5zdGF0aW9uc1tpXS51c2VkICYmCi0JCQkgICAgc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCisJCQlpZiAoIWlsLT5zdGF0aW9uc1tpXS51c2VkICYmCisJCQkgICAgc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKIAkJCQlzdGFfaWQgPSBpOwogCQl9CiAKQEAgLTI2MCw3ICsyNjEsNyBAQAogCSAqIFRoZXNlIHR3byBjb25kaXRpb25zIGhhdmUgdGhlIHNhbWUgb3V0Y29tZSwgYnV0IGtlZXAgdGhlbQogCSAqIHNlcGFyYXRlCiAJICovCi0JaWYgKHVubGlrZWx5KHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKKwlpZiAodW5saWtlbHkoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpCiAJCXJldHVybiBzdGFfaWQ7CiAKIAkvKgpAQCAtMjY4LDMwICsyNjksMzAgQEAKIAkgKiBzdGF0aW9uLiBLZWVwIHRyYWNrIGlmIG9uZSBpcyBpbiBwcm9ncmVzcyBzbyB0aGF0IHdlIGRvIG5vdCBzZW5kCiAJICogYW5vdGhlci4KIAkgKi8KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgeworCQlEX0lORk8oCiAJCQkJIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLAogCQkJCXN0YV9pZCk7CiAJCXJldHVybiBzdGFfaWQ7CiAJfQogCi0JaWYgKChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCi0JICAgIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgJiYKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgYWRkcikpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJICAgIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgJiYKKwkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIsIGFkZHIpKSB7CisJCURfQVNTT0MoCiAJCQkJIlNUQSAlZCAoJXBNKSBhbHJlYWR5IGFkZGVkLCBub3QgYWRkaW5nIGFnYWluLlxuIiwKIAkJCQlzdGFfaWQsIGFkZHIpOwogCQlyZXR1cm4gc3RhX2lkOwogCX0KIAotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKLQlzdGF0aW9uLT51c2VkID0gSVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiQWRkIFNUQSB0byBkcml2ZXIgSUQgJWQ6ICVwTVxuIiwKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCXN0YXRpb24tPnVzZWQgPSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlEX0FTU09DKCJBZGQgU1RBIHRvIGRyaXZlciBJRCAlZDogJXBNXG4iLAogCQkJc3RhX2lkLCBhZGRyKTsKLQlwcml2LT5udW1fc3RhdGlvbnMrKzsKKwlpbC0+bnVtX3N0YXRpb25zKys7CiAKLQkvKiBTZXQgdXAgdGhlIFJFUExZX0FERF9TVEEgY29tbWFuZCB0byBzZW5kIHRvIGRldmljZSAqLwotCW1lbXNldCgmc3RhdGlvbi0+c3RhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOworCS8qIFNldCB1cCB0aGUgQ19BRERfU1RBIGNvbW1hbmQgdG8gc2VuZCB0byBkZXZpY2UgKi8KKwltZW1zZXQoJnN0YXRpb24tPnN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CiAJbWVtY3B5KHN0YXRpb24tPnN0YS5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCXN0YXRpb24tPnN0YS5tb2RlID0gMDsKIAlzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCA9IHN0YV9pZDsKQEAgLTI5OSw3ICszMDAsNyBAQAogCXN0YXRpb24tPmN0eGlkID0gY3R4LT5jdHhpZDsKIAogCWlmIChzdGEpIHsKLQkJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uICpzdGFfcHJpdjsKKwkJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gKnN0YV9wcml2OwogCiAJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwogCQlzdGFfcHJpdi0+Y3R4ID0gY3R4OwpAQCAtMzEwLDQyICszMTEsNDIgQEAKIAkgKiBTVEEgYW5kIGJyb2FkY2FzdCBTVEEpIHBhc3MgaW4gYSBOVUxMIHN0YSwgYW5kIG1hYzgwMjExCiAJICogZG9lc24ndCBhbGxvdyBIVCBJQlNTLgogCSAqLwotCWl3bF9sZWdhY3lfc2V0X2h0X2FkZF9zdGF0aW9uKHByaXYsIHN0YV9pZCwgc3RhLCBjdHgpOworCWlsX3NldF9odF9hZGRfc3RhdGlvbihpbCwgc3RhX2lkLCBzdGEsIGN0eCk7CiAKIAkvKiAzOTQ1IG9ubHkgKi8KLQlyYXRlID0gKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPwotCQlJV0xfUkFURV82TV9QTENQIDogSVdMX1JBVEVfMU1fUExDUDsKKwlyYXRlID0gKGlsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8KKwkJUkFURV82TV9QTENQIDogUkFURV8xTV9QTENQOwogCS8qIFR1cm4gb24gYm90aCBhbnRlbm5hcyBmb3IgdGhlIHN0YXRpb24uLi4gKi8KIAlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYocmF0ZSB8IFJBVEVfTUNTX0FOVF9BQl9NU0spOwogCiAJcmV0dXJuIHN0YV9pZDsKIAogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9wcmVwX3N0YXRpb24pOworRVhQT1JUX1NZTUJPTF9HUEwoaWxfcHJlcF9zdGF0aW9uKTsKIAogI2RlZmluZSBTVEFfV0FJVF9USU1FT1VUIChIWi8yKQogCiAvKioKLSAqIGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uIC0KKyAqIGlsX2FkZF9zdGF0aW9uX2NvbW1vbiAtCiAgKi8KIGludAotaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKK2lsX2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCiAJCQkgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAJaW50IHJldCA9IDA7CiAJdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOwogCiAJKnN0YV9pZF9yID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCXN0YV9pZCA9IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHByaXYsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBwcmVwYXJlIHN0YXRpb24gJXBNIGZvciBhZGRpdGlvblxuIiwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gcHJlcGFyZSBzdGF0aW9uICVwTSBmb3IgYWRkaXRpb25cbiIsCiAJCQlhZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM1NCw3NSArMzU1LDc1IEBACiAJICogc3RhdGlvbi4gS2VlcCB0cmFjayBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3Mgc28gdGhhdCB3ZSBkbyBub3Qgc2VuZAogCSAqIGFub3RoZXIuCiAJICovCi0JaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKAogCQkJIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLAogCQkgICAgICAgc3RhX2lkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCQlyZXR1cm4gLUVFWElTVDsKIAl9CiAKLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKLQkgICAgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFKSkgewotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQlEX0FTU09DKAogCQkJIlNUQSAlZCAoJXBNKSBhbHJlYWR5IGFkZGVkLCBub3QgYWRkaW5nIGFnYWluLlxuIiwKIAkJCXN0YV9pZCwgYWRkcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQlzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkJCQlzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCiAJLyogQWRkIHN0YXRpb24gdG8gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CisJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOwogCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJSVdMX0VSUihwcml2LCAiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJSUxfRVJSKCJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKKwkJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAl9CiAJKnN0YV9pZF9yID0gc3RhX2lkOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKTsKK0VYUE9SVF9TWU1CT0woaWxfYWRkX3N0YXRpb25fY29tbW9uKTsKIAogLyoqCi0gKiBpd2xfbGVnYWN5X3N0YV91Y29kZV9kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSB1Y29kZSBzdGF0dXMgZm9yIGEgc3RhdGlvbgorICogaWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUgLSBkZWFjdGl2YXRlIHVjb2RlIHN0YXR1cyBmb3IgYSBzdGF0aW9uCiAgKgotICogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkCisgKiBpbC0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfc3RhX3Vjb2RlX2RlYWN0aXZhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCitzdGF0aWMgdm9pZCBpbF9zdGFfdWNvZGVfZGVhY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKIHsKIAkvKiBVY29kZSBtdXN0IGJlIGFjdGl2ZSBhbmQgZHJpdmVyIG11c3QgYmUgbm9uIGFjdGl2ZSAqLwotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYKLQkgICAgIChJV0xfU1RBX1VDT0RFX0FDVElWRSB8IElXTF9TVEFfRFJJVkVSX0FDVElWRSkpICE9Ci0JCQkJCQlJV0xfU1RBX1VDT0RFX0FDVElWRSkKLQkJSVdMX0VSUihwcml2LCAicmVtb3ZlZCBub24gYWN0aXZlIFNUQSAldVxuIiwgc3RhX2lkKTsKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJgorCSAgICAgKElMX1NUQV9VQ09ERV9BQ1RJVkUgfCBJTF9TVEFfRFJJVkVSX0FDVElWRSkpICE9CisJCQkJCQlJTF9TVEFfVUNPREVfQUNUSVZFKQorCQlJTF9FUlIoInJlbW92ZWQgbm9uIGFjdGl2ZSBTVEEgJXVcbiIsIHN0YV9pZCk7CiAKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9BQ1RJVkU7CiAKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkpKTsKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSkpOworCURfQVNTT0MoIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOwogfQogCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgaW50IGlsX3NlbmRfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLAogCQkJCSAgIGNvbnN0IHU4ICphZGRyLCBpbnQgc3RhX2lkLAogCQkJCSAgIGJvb2wgdGVtcG9yYXJ5KQogewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OwogCWludCByZXQ7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47Ci0Jc3RydWN0IGl3bF9yZW1fc3RhX2NtZCBybV9zdGFfY21kOworCXN0cnVjdCBpbF9yZW1fc3RhX2NtZCBybV9zdGFfY21kOwogCi0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1JFTU9WRV9TVEEsCi0JCS5sZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9yZW1fc3RhX2NtZCksCisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19SRU1fU1RBLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9yZW1fc3RhX2NtZCksCiAJCS5mbGFncyA9IENNRF9TWU5DLAogCQkuZGF0YSA9ICZybV9zdGFfY21kLAogCX07CkBAIC00MzMsMTQgKzQzNCwxNCBAQAogCiAJY21kLmZsYWdzIHw9IENNRF9XQU5UX1NLQjsKIAotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gUkVQTFlfUkVNT1ZFX1NUQSAoMHglMDhYKVxuIiwKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfUkVNX1NUQSAoMHglMDhYKVxuIiwKIAkJCSAgcGt0LT5oZHIuZmxhZ3MpOwogCQlyZXQgPSAtRUlPOwogCX0KQEAgLTQ0OSwzNCArNDUwLDM0IEBACiAJCXN3aXRjaCAocGt0LT51LnJlbV9zdGEuc3RhdHVzKSB7CiAJCWNhc2UgUkVNX1NUQV9TVUNDRVNTX01TSzoKIAkJCWlmICghdGVtcG9yYXJ5KSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCQlpd2xfbGVnYWN5X3N0YV91Y29kZV9kZWFjdGl2YXRlKHByaXYsIHN0YV9pZCk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQkJaWxfc3RhX3Vjb2RlX2RlYWN0aXZhdGUoaWwsIHN0YV9pZCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLAogCQkJCQkJCQlmbGFnc19zcGluKTsKIAkJCX0KLQkJCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUkVQTFlfUkVNT1ZFX1NUQSBQQVNTRURcbiIpOworCQkJRF9BU1NPQygiQ19SRU1fU1RBIFBBU1NFRFxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldCA9IC1FSU87Ci0JCQlJV0xfRVJSKHByaXYsICJSRVBMWV9SRU1PVkVfU1RBIGZhaWxlZFxuIik7CisJCQlJTF9FUlIoIkNfUkVNX1NUQSBmYWlsZWRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24gLSBSZW1vdmUgZHJpdmVyJ3Mga25vd2xlZGdlIG9mIHN0YXRpb24uCisgKiBpbF9yZW1vdmVfc3RhdGlvbiAtIFJlbW92ZSBkcml2ZXIncyBrbm93bGVkZ2Ugb2Ygc3RhdGlvbi4KICAqLwotaW50IGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCB1OCBzdGFfaWQsCitpbnQgaWxfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCB1OCBzdGFfaWQsCiAJCSAgICAgICBjb25zdCB1OCAqYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5KHByaXYpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9JTkZPKAogCQkJIlVuYWJsZSB0byByZW1vdmUgc3RhdGlvbiAlcE0sIGRldmljZSBub3QgcmVhZHkuXG4iLAogCQkJYWRkcik7CiAJCS8qCkBAIC00ODcsODUgKzQ4OCw4NSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlbW92aW5nIFNUQSBmcm9tIGRyaXZlcjolZCAgJXBNXG4iLAorCURfQVNTT0MoIlJlbW92aW5nIFNUQSBmcm9tIGRyaXZlcjolZCAgJXBNXG4iLAogCQkJc3RhX2lkLCBhZGRyKTsKIAotCWlmIChXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKKwlpZiAoV0FSTl9PTihzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLAorCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKKwkJRF9JTkZPKCJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLAogCQkJCWFkZHIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JaWYgKCEocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZW1vdmluZyAlcE0gYnV0IG5vbiBVQ09ERSBhY3RpdmVcbiIsCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7CisJCURfSU5GTygiUmVtb3ZpbmcgJXBNIGJ1dCBub24gVUNPREUgYWN0aXZlXG4iLAogCQkJCWFkZHIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCi0JaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfTE9DQUwpIHsKLQkJa2ZyZWUocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0xPQ0FMKSB7CisJCWtmcmVlKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOwogCX0KIAotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9EUklWRVJfQUNUSVZFOwogCi0JcHJpdi0+bnVtX3N0YXRpb25zLS07CisJaWwtPm51bV9zdGF0aW9ucy0tOwogCi0JQlVHX09OKHByaXYtPm51bV9zdGF0aW9ucyA8IDApOworCUJVR19PTihpbC0+bnVtX3N0YXRpb25zIDwgMCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihwcml2LCBhZGRyLCBzdGFfaWQsIGZhbHNlKTsKKwlyZXR1cm4gaWxfc2VuZF9yZW1vdmVfc3RhdGlvbihpbCwgYWRkciwgc3RhX2lkLCBmYWxzZSk7CiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlsX3JlbW92ZV9zdGF0aW9uKTsKIAogLyoqCi0gKiBpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zIC0gY2xlYXIgdWNvZGUgc3RhdGlvbiB0YWJsZSBiaXRzCisgKiBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyAtIGNsZWFyIHVjb2RlIHN0YXRpb24gdGFibGUgYml0cwogICoKICAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCB0aGUgYml0cyBpbiB0aGUgZHJpdmVyIGluZGljYXRpbmcKICAqIHdoaWNoIHN0YXRpb25zIGFyZSBhY3RpdmUgaW4gdGhlIHVjb2RlLiBDYWxsIHdoZW4gc29tZXRoaW5nCiAgKiBvdGhlciB0aGFuIGV4cGxpY2l0IHN0YXRpb24gbWFuYWdlbWVudCB3b3VsZCBjYXVzZSB0aGlzIGluCiAgKiB0aGUgdWNvZGUsIGUuZy4gdW5hc3NvY2lhdGVkIFJYT04uCiAgKi8KLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQordm9pZCBpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwogCWJvb2wgY2xlYXJlZCA9IGZhbHNlOwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIHVjb2RlIHN0YXRpb25zIGluIGRyaXZlclxuIik7CisJRF9JTkZPKCJDbGVhcmluZyB1Y29kZSBzdGF0aW9ucyBpbiBkcml2ZXJcbiIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmIChjdHggJiYgY3R4LT5jdHhpZCAhPSBwcml2LT5zdGF0aW9uc1tpXS5jdHhpZCkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoY3R4ICYmIGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQogCQkJY29udGludWU7CiAKLQkJaWYgKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJaWYgKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgeworCQkJRF9JTkZPKAogCQkJCSJDbGVhcmluZyB1Y29kZSBhY3RpdmUgZm9yIHN0YXRpb24gJWRcbiIsIGkpOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKIAkJCWNsZWFyZWQgPSB0cnVlOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCiAJaWYgKCFjbGVhcmVkKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQlEX0lORk8oCiAJCQkiTm8gYWN0aXZlIHN0YXRpb25zIGZvdW5kIHRvIGJlIGNsZWFyZWRcbiIpOwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0woaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMpOwogCiAvKioKLSAqIGl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucygpIC0gUmVzdG9yZSBkcml2ZXIga25vd24gc3RhdGlvbnMgdG8gZGV2aWNlCisgKiBpbF9yZXN0b3JlX3N0YXRpb25zKCkgLSBSZXN0b3JlIGRyaXZlciBrbm93biBzdGF0aW9ucyB0byBkZXZpY2UKICAqCiAgKiBBbGwgc3RhdGlvbnMgY29uc2lkZXJlZCBhY3RpdmUgYnkgZHJpdmVyLCBidXQgbm90IHByZXNlbnQgaW4gdWNvZGUsIGlzCiAgKiByZXN0b3JlZC4KQEAgLTU3Myw1OCArNTc0LDU4IEBACiAgKiBGdW5jdGlvbiBzbGVlcHMuCiAgKi8KIHZvaWQKLWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCitpbF9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQogewotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCBscTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAJaW50IGk7CiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCWludCByZXQ7CiAJYm9vbCBzZW5kX2xxOwogCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5KHByaXYpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9JTkZPKAogCQkJIk5vdCByZWFkeSB5ZXQsIG5vdCByZXN0b3JpbmcgYW55IHN0YXRpb25zLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMgLi4uIHN0YXJ0LlxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmIChjdHgtPmN0eGlkICE9IHByaXYtPnN0YXRpb25zW2ldLmN0eGlkKQorCURfQVNTT0MoIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMgLi4uIHN0YXJ0LlxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQogCQkJY29udGludWU7Ci0JCWlmICgocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKLQkJCSAgICAhKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkpIHsKLQkJCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUmVzdG9yaW5nIHN0YSAlcE1cbiIsCi0JCQkJCXByaXYtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkcik7Ci0JCQlwcml2LT5zdGF0aW9uc1tpXS5zdGEubW9kZSA9IDA7Ci0JCQlwcml2LT5zdGF0aW9uc1tpXS51c2VkIHw9IElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwkJaWYgKChpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSAmJgorCQkgICAgIShpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7CisJCQlEX0FTU09DKCJSZXN0b3Jpbmcgc3RhICVwTVxuIiwKKwkJCQkJaWwtPnN0YXRpb25zW2ldLnN0YS5zdGEuYWRkcik7CisJCQlpbC0+c3RhdGlvbnNbaV0uc3RhLm1vZGUgPSAwOworCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgfD0gSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CiAJCQlmb3VuZCA9IHRydWU7CiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICgocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpIHsKLQkJCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW2ldLnN0YSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmICgoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpIHsKKwkJCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tpXS5zdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CiAJCQlzZW5kX2xxID0gZmFsc2U7Ci0JCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0ubHEpIHsKLQkJCQltZW1jcHkoJmxxLCBwcml2LT5zdGF0aW9uc1tpXS5scSwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCkpOworCQkJaWYgKGlsLT5zdGF0aW9uc1tpXS5scSkgeworCQkJCW1lbWNweSgmbHEsIGlsLT5zdGF0aW9uc1tpXS5scSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSk7CiAJCQkJc2VuZF9scSA9IHRydWU7CiAJCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCXJldCA9IGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQkJCUlXTF9FUlIocHJpdiwgIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAotCQkJCQlwcml2LT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOwotCQkJCXByaXYtPnN0YXRpb25zW2ldLnVzZWQgJj0KLQkJCQkJCX5JV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPQotCQkJCQkJfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAorCQkJCQlpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKKwkJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPQorCQkJCQkJfklMX1NUQV9EUklWRVJfQUNUSVZFOworCQkJCWlsLT5zdGF0aW9uc1tpXS51c2VkICY9CisJCQkJCQl+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLAogCQkJCQkJCQlmbGFnc19zcGluKTsKIAkJCX0KIAkJCS8qCkBAIC02MzIsNzggKzYzMyw3OCBAQAogCQkJICogY3VycmVudCBMUSBjb21tYW5kCiAJCQkgKi8KIAkJCWlmIChzZW5kX2xxKQotCQkJCWl3bF9sZWdhY3lfc2VuZF9scV9jbWQocHJpdiwgY3R4LCAmbHEsCisJCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxLAogCQkJCQkJCQlDTURfU1lOQywgdHJ1ZSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAlpZiAoIWZvdW5kKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKKwkJRF9JTkZPKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIgogCQkJCSIgLi4uLiBubyBzdGF0aW9ucyB0byBiZSByZXN0b3JlZC5cbiIpOwogCWVsc2UKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJlc3RvcmluZyBhbGwga25vd24gc3RhdGlvbnMiCisJCURfSU5GTygiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKIAkJCQkiIC4uLi4gY29tcGxldGUuXG4iKTsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0woaWxfcmVzdG9yZV9zdGF0aW9ucyk7CiAKLWludCBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitpbnQgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c3RhX2tleV9tYXhfbnVtOyBpKyspCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPnN0YV9rZXlfbWF4X251bTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQogCQkJcmV0dXJuIGk7CiAKIAlyZXR1cm4gV0VQX0lOVkFMSURfT0ZGU0VUOwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleCk7CitFWFBPUlRfU1lNQk9MKGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgpOwogCi12b2lkIGl3bF9sZWdhY3lfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICghKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX0JDQVNUKSkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKCEoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiBJTF9TVEFfQkNBU1QpKQogCQkJY29udGludWU7CiAKLQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7Ci0JCXByaXYtPm51bV9zdGF0aW9ucy0tOwotCQlCVUdfT04ocHJpdi0+bnVtX3N0YXRpb25zIDwgMCk7Ci0JCWtmcmVlKHByaXYtPnN0YXRpb25zW2ldLmxxKTsKLQkJcHJpdi0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOworCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJaWwtPm51bV9zdGF0aW9ucy0tOworCQlCVUdfT04oaWwtPm51bV9zdGF0aW9ucyA8IDApOworCQlrZnJlZShpbC0+c3RhdGlvbnNbaV0ubHEpOworCQlpbC0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMpOwogCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2R1bXBfbHFfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitzdGF0aWMgdm9pZCBpbF9kdW1wX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCiB7CiAJaW50IGk7Ci0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIHN0YXRpb24gaWQgMHgleFxuIiwgbHEtPnN0YV9pZCk7Ci0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIGFudCAweCVYIDB4JVhcbiIsCisJRF9SQVRFKCJscSBzdGF0aW9uIGlkIDB4JXhcbiIsIGxxLT5zdGFfaWQpOworCURfUkFURSgibHEgYW50IDB4JVggMHglWFxuIiwKIAkJICAgICAgIGxxLT5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2ssCiAJCSAgICAgICBscS0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU07IGkrKykKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIGluZGV4ICVkIDB4JVhcbiIsCisJCURfUkFURSgibHEgaWR4ICVkIDB4JVhcbiIsCiAJCQkgICAgICAgaSwgbHEtPnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncyk7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZHVtcF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCitzdGF0aWMgaW5saW5lIHZvaWQgaWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSkKIHsKIH0KICNlbmRpZgogCiAvKioKLSAqIGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQoKSAtIFRlc3Qgb25lIGFzcGVjdCBvZiBMUSBjbWQgZm9yIHZhbGlkaXR5CisgKiBpbF9pc19scV90YWJsZV92YWxpZCgpIC0gVGVzdCBvbmUgYXNwZWN0IG9mIExRIGNtZCBmb3IgdmFsaWRpdHkKICAqCiAgKiBJdCBzb21ldGltZXMgaGFwcGVucyB3aGVuIGEgSFQgcmF0ZSBoYXMgYmVlbiBpbiB1c2UgYW5kIHdlCiAgKiBsb29zZSBjb25uZWN0aXZpdHkgd2l0aCBBUCB0aGVuIG1hYzgwMjExIHdpbGwgZmlyc3QgdGVsbCB1cyB0aGF0IHRoZQpAQCAtNzEzLDIyICs3MTQsMjIgQEAKICAqIFRlc3QgZm9yIHRoaXMgdG8gcHJldmVudCBkcml2ZXIgZnJvbSBzZW5kaW5nIExRIGNvbW1hbmQgYmV0d2VlbiB0aGUgdGltZQogICogUlhPTiBmbGFncyBhcmUgdXBkYXRlZCBhbmQgd2hlbiBMUSBjb21tYW5kIGlzIHVwZGF0ZWQuCiAgKi8KLXN0YXRpYyBib29sIGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCitzdGF0aWMgYm9vbCBpbF9pc19scV90YWJsZV92YWxpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCiB7CiAJaW50IGk7CiAKIAlpZiAoY3R4LT5odC5lbmFibGVkKQogCQlyZXR1cm4gdHJ1ZTsKIAotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDaGFubmVsICV1IGlzIG5vdCBhbiBIVCBjaGFubmVsXG4iLAorCURfSU5GTygiQ2hhbm5lbCAldSBpcyBub3QgYW4gSFQgY2hhbm5lbFxuIiwKIAkJICAgICAgIGN0eC0+YWN0aXZlLmNoYW5uZWwpOwogCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CiAJCWlmIChsZTMyX3RvX2NwdShscS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKSAmCiAJCQkJCQlSQVRFX01DU19IVF9NU0spIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJpbmRleCAlZCBvZiBMUSBleHBlY3RzIEhUIGNoYW5uZWxcbiIsCisJCQlEX0lORk8oCisJCQkJICAgICAgICJpZHggJWQgb2YgTFEgZXhwZWN0cyBIVCBjaGFubmVsXG4iLAogCQkJCSAgICAgICBpKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNzM3LDcgKzczOCw3IEBACiB9CiAKIC8qKgotICogaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZCgpIC0gU2VuZCBsaW5rIHF1YWxpdHkgY29tbWFuZAorICogaWxfc2VuZF9scV9jbWQoKSAtIFNlbmQgbGluayBxdWFsaXR5IGNvbW1hbmQKICAqIEBpbml0OiBUaGlzIGNvbW1hbmQgaXMgc2VudCBhcyBwYXJ0IG9mIHN0YXRpb24gaW5pdGlhbGl6YXRpb24gcmlnaHQKICAqICAgICAgICBhZnRlciBzdGF0aW9uIGhhcyBiZWVuIGFkZGVkLgogICoKQEAgLTc0NiwzNSArNzQ3LDM1IEBACiAgKiB0aGlzIGNhc2UgdG8gY2xlYXIgdGhlIHN0YXRlIGluZGljYXRpbmcgdGhhdCBzdGF0aW9uIGNyZWF0aW9uIGlzIGluCiAgKiBwcm9ncmVzcy4KICAqLwotaW50IGl3bF9sZWdhY3lfc2VuZF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkgICAgc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscSwgdTggZmxhZ3MsIGJvb2wgaW5pdCkKK2ludCBpbF9zZW5kX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgIHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscSwgdTggZmxhZ3MsIGJvb2wgaW5pdCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CiAKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpLAorCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfVFhfTElOS19RVUFMSVRZX0NNRCwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCksCiAJCS5mbGFncyA9IGZsYWdzLAogCQkuZGF0YSA9IGxxLAogCX07CiAKLQlpZiAoV0FSTl9PTihscS0+c3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQorCWlmIChXQVJOX09OKGxxLT5zdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JaWYgKCEocHJpdi0+c3RhdGlvbnNbbHEtPnN0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWlmICghKGlsLT5zdGF0aW9uc1tscS0+c3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKIAotCWl3bF9sZWdhY3lfZHVtcF9scV9jbWQocHJpdiwgbHEpOworCWlsX2R1bXBfbHFfY21kKGlsLCBscSk7CiAJQlVHX09OKGluaXQgJiYgKGNtZC5mbGFncyAmIENNRF9BU1lOQykpOwogCi0JaWYgKGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQocHJpdiwgY3R4LCBscSkpCi0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7CisJaWYgKGlsX2lzX2xxX3RhYmxlX3ZhbGlkKGlsLCBjdHgsIGxxKSkKKwkJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOwogCWVsc2UKIAkJcmV0ID0gLUVJTlZBTDsKIApAQCAtNzgyLDM1ICs3ODMsMzUgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmIChpbml0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJpbml0IExRIGNvbW1hbmQgY29tcGxldGUsIgorCQlEX0lORk8oImluaXQgTFEgY29tbWFuZCBjb21wbGV0ZSwiCiAJCQkJIiBjbGVhcmluZyBzdGEgYWRkaXRpb24gc3RhdHVzIGZvciBzdGEgJWRcbiIsCiAJCQkgICAgICAgbHEtPnN0YV9pZCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCXByaXYtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJaWwtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwogCX0KIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfbHFfY21kKTsKK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9scV9jbWQpOwogCi1pbnQgaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKK2ludCBpbF9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKIAlpbnQgcmV0OwogCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAorCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCiAJCQlzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAogCQkJc3RhLT5hZGRyKTsKLQlyZXQgPSBpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uKHByaXYsIHN0YV9jb21tb24tPnN0YV9pZCwgc3RhLT5hZGRyKTsKKwlyZXQgPSBpbF9yZW1vdmVfc3RhdGlvbihpbCwgc3RhX2NvbW1vbi0+c3RhX2lkLCBzdGEtPmFkZHIpOwogCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAorCQlJTF9FUlIoIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAogCQkJc3RhLT5hZGRyKTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MKGlsX21hY19zdGFfcmVtb3ZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiZDc1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF9sZWdhY3lfc3RhX2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfc3RhX2hfXwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0jZGVmaW5lIEhXX0tFWV9EWU5BTUlDIDAKLSNkZWZpbmUgSFdfS0VZX0RFRkFVTFQgMQotCi0jZGVmaW5lIElXTF9TVEFfRFJJVkVSX0FDVElWRSBCSVQoMCkgLyogZHJpdmVyIGVudHJ5IGlzIGFjdGl2ZSAqLwotI2RlZmluZSBJV0xfU1RBX1VDT0RFX0FDVElWRSAgQklUKDEpIC8qIHVjb2RlIGVudHJ5IGlzIGFjdGl2ZSAqLwotI2RlZmluZSBJV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1MgIEJJVCgyKSAvKiB1Y29kZSBlbnRyeSBpcyBpbiBwcm9jZXNzIG9mCi0JCQkJCSAgICBiZWluZyBhY3RpdmF0ZWQgKi8KLSNkZWZpbmUgSVdMX1NUQV9MT0NBTCBCSVQoMykgLyogc3RhdGlvbiBzdGF0ZSBub3QgZGlyZWN0ZWQgYnkgbWFjODAyMTE7Ci0JCQkJKHRoaXMgaXMgZm9yIHRoZSBJQlNTIEJTU0lEIHN0YXRpb25zKSAqLwotI2RlZmluZSBJV0xfU1RBX0JDQVNUIEJJVCg0KSAvKiB0aGlzIHN0YXRpb24gaXMgdGhlIHNwZWNpYWwgYmNhc3Qgc3RhdGlvbiAqLwotCi0KLXZvaWQgaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9nZXRfZnJlZV91Y29kZV9rZXlfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKTsKLWludCBpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCAqc3RhX2lkX3IpOwotaW50IGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJY29uc3QgdTggc3RhX2lkLAotCQkJY29uc3QgdTggKmFkZHIpOwotaW50IGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Ci0KLXU4IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQljb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscSwKLQkJCXU4IGZsYWdzLCBib29sIGluaXQpOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zIC0gY2xlYXIga25vd2xlZGdlIG9mIGFsbCBzdGF0aW9ucyBmcm9tIGRyaXZlcgotICogQHByaXY6IGl3bCBwcml2IHN0cnVjdAotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBpd2xfZG93bigpIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoZSBjYXNlCi0gKiB3ZSdyZSBjb21pbmcgdGhlcmUgZnJvbSBhIGhhcmR3YXJlIHJlc3RhcnQgbWFjODAyMTEgd2lsbCBiZQotICogYWJsZSB0byByZWNvbmZpZ3VyZSBzdGF0aW9ucyAtLSBpZiB3ZSdyZSBnZXR0aW5nIHRoZXJlIGluIHRoZQotICogbm9ybWFsIGRvd24gZmxvdyB0aGVuIHRoZSBzdGF0aW9ucyB3aWxsIGFscmVhZHkgYmUgY2xlYXJlZC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQltZW1zZXQocHJpdi0+c3RhdGlvbnMsIDAsIHNpemVvZihwcml2LT5zdGF0aW9ucykpOwotCXByaXYtPm51bV9zdGF0aW9ucyA9IDA7Ci0KLQlwcml2LT51Y29kZV9rZXlfdGFibGUgPSAwOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJLyoKLQkJICogUmVtb3ZlIGFsbCBrZXkgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgc3RvcmVkIGFzIHBhcnQKLQkJICogb2Ygc3RhdGlvbiBpbmZvcm1hdGlvbiBzaW5jZSBtYWM4MDIxMSBtYXkgbm90IGhhdmUgaGFkCi0JCSAqIGEgY2hhbmNlIHRvIHJlbW92ZSBhbGwgdGhlIGtleXMuIFdoZW4gZGV2aWNlIGlzCi0JCSAqIHJlY29uZmlndXJlZCBieSBtYWM4MDIxMSBhZnRlciBhbiBlcnJvciBhbGwga2V5cyB3aWxsCi0JCSAqIGJlIHJlY29uZmlndXJlZC4KLQkJICovCi0JCW1lbXNldChjdHgtPndlcF9rZXlzLCAwLCBzaXplb2YoY3R4LT53ZXBfa2V5cykpOwotCQljdHgtPmtleV9tYXBwaW5nX2tleXMgPSAwOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfc3RhX2lkKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0JaWYgKFdBUk5fT04oIXN0YSkpCi0JCXJldHVybiBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCi0JcmV0dXJuICgoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uICopc3RhLT5kcnZfcHJpdiktPnN0YV9pZDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3QgLSByZXR1cm4gc3RhX2lkIG9yIGJyb2FkY2FzdCBzdGEKLSAqIEBwcml2OiBpd2wgcHJpdgotICogQGNvbnRleHQ6IHRoZSBjdXJyZW50IGNvbnRleHQKLSAqIEBzdGE6IG1hYzgwMjExIHN0YXRpb24KLSAqCi0gKiBJbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgbWFjODAyMTEgcGFzc2VzIGEgc3RhdGlvbiBwb2ludGVyCi0gKiB0aGF0IG1heSBiZSAlTlVMTCwgZm9yIGV4YW1wbGUgZHVyaW5nIFRYIG9yIGtleSBzZXR1cC4gSW4KLSAqIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB1c2UgdGhlIGJyb2FkY2FzdCBzdGF0aW9uLCBzbyB0aGlzCi0gKiBpbmxpbmUgd3JhcHMgdGhhdCBwYXR0ZXJuLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjb250ZXh0LAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0JaW50IHN0YV9pZDsKLQotCWlmICghc3RhKQotCQlyZXR1cm4gY29udGV4dC0+YmNhc3Rfc3RhX2lkOwotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWQoc3RhKTsKLQotCS8qCi0JICogbWFjODAyMTEgc2hvdWxkIG5vdCBiZSBwYXNzaW5nIGEgcGFydGlhbGx5Ci0JICogaW5pdGlhbGlzZWQgc3RhdGlvbiEKLQkgKi8KLQlXQVJOX09OKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKTsKLQotCXJldHVybiBzdGFfaWQ7Ci19Ci0jZW5kaWYgLyogX19pd2xfbGVnYWN5X3N0YV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWUyNjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0KLS8qKgotICogaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0ciAtIFNlbmQgbmV3IHdyaXRlIGluZGV4IHRvIGhhcmR3YXJlCi0gKi8KLXZvaWQKLWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0JdTMyIHJlZyA9IDA7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQotCWlmICh0eHEtPm5lZWRfdXBkYXRlID09IDApCi0JCXJldHVybjsKLQotCS8qIGlmIHdlJ3JlIHRyeWluZyB0byBzYXZlIHBvd2VyICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKSB7Ci0JCS8qIHdha2UgdXAgbmljIGlmIGl0J3MgcG93ZXJlZCBkb3duIC4uLgotCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKLQkJICogdGltZSB3ZSdsbCBza2lwIHRoaXMgcGFydC4gKi8KLQkJcmVnID0gaXdsX3JlYWQzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMSk7Ci0KLQkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJCSJUeCBxdWV1ZSAlZCByZXF1ZXN0aW5nIHdha2V1cCwiCi0JCQkJCSIgR1AxID0gMHgleFxuIiwgdHhxX2lkLCByZWcpOwotCQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJCXR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKLQotCQkvKgotCQkgKiBlbHNlIG5vdCBpbiBwb3dlci1zYXZlIG1vZGUsCi0JCSAqIHVDb2RlIHdpbGwgbmV2ZXIgc2xlZXAgd2hlbiB3ZSdyZQotCQkgKiB0cnlpbmcgdG8gdHggKGR1cmluZyBSRktJTEwsIHdlJ3JlIG5vdCB0cnlpbmcgdG8gdHgpLgotCQkgKi8KLQl9IGVsc2UKLQkJaXdsX3dyaXRlMzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJICAgIHR4cS0+cS53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV90eF9xdWV1ZV91bm1hcCAtICBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBhbmQgZnJlZSBza2IncwotICovCi12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQotCWlmIChxLT5uX2JkID09IDApCi0JCXJldHVybjsKLQotCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2ZyZWVfdGZkKHByaXYsIHR4cSk7Ci0JCXEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUgLSBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KLSAqIEB0eHE6IFRyYW5zbWl0IHF1ZXVlIHRvIGRlYWxsb2NhdGUuCi0gKgotICogRW1wdHkgcXVldWUgYnkgcmVtb3ZpbmcgYW5kIGRlc3Ryb3lpbmcgYWxsIEJEJ3MuCi0gKiBGcmVlIGFsbCBidWZmZXJzLgotICogMC1maWxsLCBidXQgZG8gbm90IGZyZWUgInR4cSIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCWl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXAocHJpdiwgdHhxX2lkKTsKLQotCS8qIERlLWFsbG9jIGFycmF5IG9mIGNvbW1hbmQvdHggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBURkRfVFhfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqCi0JCQkJICB0eHEtPnEubl9iZCwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YSAqLwotCWtmcmVlKHR4cS0+dHhiKTsKLQl0eHEtPnR4YiA9IE5VTEw7Ci0KLQkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLwotCWtmcmVlKHR4cS0+Y21kKTsKLQlrZnJlZSh0eHEtPm1ldGEpOwotCXR4cS0+Y21kID0gTlVMTDsKLQl0eHEtPm1ldGEgPSBOVUxMOwotCi0JLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCi0JbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKTsKLQotLyoqCi0gKiBpd2xfY21kX3F1ZXVlX3VubWFwIC0gVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgZnJvbSBjb21tYW5kIHF1ZXVlCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9jbWRfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQlpbnQgaTsKLQotCWlmIChxLT5uX2JkID09IDApCi0JCXJldHVybjsKLQotCXdoaWxlIChxLT5yZWFkX3B0ciAhPSBxLT53cml0ZV9wdHIpIHsKLQkJaSA9IGl3bF9sZWdhY3lfZ2V0X2NtZF9pbmRleChxLCBxLT5yZWFkX3B0ciwgMCk7Ci0KLQkJaWYgKHR4cS0+bWV0YVtpXS5mbGFncyAmIENNRF9NQVBQRUQpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAotCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7Ci0JCX0KLQotCQlxLT5yZWFkX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOwotCX0KLQotCWkgPSBxLT5uX3dpbmRvdzsKLQlpZiAodHhxLT5tZXRhW2ldLmZsYWdzICYgQ01EX01BUFBFRCkgewotCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJIGRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaV0sIG1hcHBpbmcpLAotCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCi0JCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCXR4cS0+bWV0YVtpXS5mbGFncyA9IDA7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NtZF9xdWV1ZV91bm1hcCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgotICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KLSAqCi0gKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KLSAqIEZyZWUgYWxsIGJ1ZmZlcnMuCi0gKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlpbnQgaTsKLQotCWl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKHByaXYpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8PSBURkRfQ01EX1NMT1RTOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLQotCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCi0JaWYgKHR4cS0+cS5uX2JkKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHByaXYtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAotCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOwotCi0JLyogZGVhbGxvY2F0ZSBhcnJheXMgKi8KLQlrZnJlZSh0eHEtPmNtZCk7Ci0Ja2ZyZWUodHhxLT5tZXRhKTsKLQl0eHEtPmNtZCA9IE5VTEw7Ci0JdHhxLT5tZXRhID0gTlVMTDsKLQotCS8qIDAtZmlsbCBxdWV1ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwotCW1lbXNldCh0eHEsIDAsIHNpemVvZigqdHhxKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUpOwotCi0vKioqKioqKioqKioqKioqIERNQS1RVUVVRS1HRU5FUkFMLUZVTkNUSU9OUyAgKioqKioKLSAqIERNQSBzZXJ2aWNlcwotICoKLSAqIFRoZW9yeSBvZiBvcGVyYXRpb24KLSAqCi0gKiBBIFR4IG9yIFJ4IHF1ZXVlIHJlc2lkZXMgaW4gaG9zdCBEUkFNLCBhbmQgaXMgY29tcHJpc2VkIG9mIGEgY2lyY3VsYXIgYnVmZmVyCi0gKiBvZiBidWZmZXIgZGVzY3JpcHRvcnMsIGVhY2ggb2Ygd2hpY2ggcG9pbnRzIHRvIG9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyBmb3IKLSAqIHRoZSBkZXZpY2UgdG8gcmVhZCBmcm9tIG9yIGZpbGwuICBEcml2ZXIgYW5kIGRldmljZSBleGNoYW5nZSBzdGF0dXMgb2YgZWFjaAotICogcXVldWUgdmlhICJyZWFkIiBhbmQgIndyaXRlIiBwb2ludGVycy4gIERyaXZlciBrZWVwcyBtaW5pbXVtIG9mIDIgZW1wdHkKLSAqIGVudHJpZXMgaW4gZWFjaCBjaXJjdWxhciBidWZmZXIsIHRvIHByb3RlY3QgYWdhaW5zdCBjb25mdXNpbmcgZW1wdHkgYW5kIGZ1bGwKLSAqIHF1ZXVlIHN0YXRlcy4KLSAqCi0gKiBUaGUgZGV2aWNlIHJlYWRzIG9yIHdyaXRlcyB0aGUgZGF0YSBpbiB0aGUgcXVldWVzIHZpYSB0aGUgZGV2aWNlJ3Mgc2V2ZXJhbAotICogRE1BL0ZJRk8gY2hhbm5lbHMuICBFYWNoIHF1ZXVlIGlzIG1hcHBlZCB0byBhIHNpbmdsZSBETUEgY2hhbm5lbC4KLSAqCi0gKiBGb3IgVHggcXVldWUsIHRoZXJlIGFyZSBsb3cgbWFyayBhbmQgaGlnaCBtYXJrIGxpbWl0cy4gSWYsIGFmdGVyIHF1ZXVpbmcKLSAqIHRoZSBwYWNrZXQgZm9yIFR4LCBmcmVlIHNwYWNlIGJlY29tZSA8IGxvdyBtYXJrLCBUeCBxdWV1ZSBzdG9wcGVkLiBXaGVuCi0gKiByZWNsYWltaW5nIHBhY2tldHMgKG9uICd0eCBkb25lIElSUSksIGlmIGZyZWUgc3BhY2UgYmVjb21lID4gaGlnaCBtYXJrLAotICogVHggcXVldWUgcmVzdW1lZC4KLSAqCi0gKiBTZWUgbW9yZSBkZXRhaWxlZCBpbmZvIGluIGl3bC00OTY1LWh3LmguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxKQotewotCWludCBzID0gcS0+cmVhZF9wdHIgLSBxLT53cml0ZV9wdHI7Ci0KLQlpZiAocS0+cmVhZF9wdHIgPiBxLT53cml0ZV9wdHIpCi0JCXMgLT0gcS0+bl9iZDsKLQotCWlmIChzIDw9IDApCi0JCXMgKz0gcS0+bl93aW5kb3c7Ci0JLyoga2VlcCBzb21lIHJlc2VydmUgdG8gbm90IGNvbmZ1c2UgZW1wdHkgYW5kIGZ1bGwgc2l0dWF0aW9ucyAqLwotCXMgLT0gMjsKLQlpZiAocyA8IDApCi0JCXMgPSAwOwotCXJldHVybiBzOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKTsKLQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcXVldWVfaW5pdCAtIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBhbmQgcmVhZC93cml0ZSBpbmRleGVzCi0gKi8KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9xdWV1ZSAqcSwKLQkJCSAgaW50IGNvdW50LCBpbnQgc2xvdHNfbnVtLCB1MzIgaWQpCi17Ci0JcS0+bl9iZCA9IGNvdW50OwotCXEtPm5fd2luZG93ID0gc2xvdHNfbnVtOwotCXEtPmlkID0gaWQ7Ci0KLQkvKiBjb3VudCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UgaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcAotCSAqIGFuZCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCi0JQlVHX09OKCFpc19wb3dlcl9vZl8yKGNvdW50KSk7Ci0KLQkvKiBzbG90c19udW0gbXVzdCBiZSBwb3dlci1vZi10d28gc2l6ZSwgb3RoZXJ3aXNlCi0JICogaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4IGlzIGJyb2tlbi4gKi8KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2xvdHNfbnVtKSk7Ci0KLQlxLT5sb3dfbWFyayA9IHEtPm5fd2luZG93IC8gNDsKLQlpZiAocS0+bG93X21hcmsgPCA0KQotCQlxLT5sb3dfbWFyayA9IDQ7Ci0KLQlxLT5oaWdoX21hcmsgPSBxLT5uX3dpbmRvdyAvIDg7Ci0JaWYgKHEtPmhpZ2hfbWFyayA8IDIpCi0JCXEtPmhpZ2hfbWFyayA9IDI7Ci0KLQlxLT53cml0ZV9wdHIgPSBxLT5yZWFkX3B0ciA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X3F1ZXVlX2FsbG9jIC0gQWxsb2MgZHJpdmVyIGRhdGEgYW5kIFRGRCBDQiBmb3Igb25lIFR4L2NtZCBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCB1MzIgaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBjaV9kZXYtPmRldjsKLQlzaXplX3QgdGZkX3N6ID0gcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYOwotCi0JLyogRHJpdmVyIHByaXZhdGUgZGF0YSwgb25seSBmb3IgVHggKG5vdCBjb21tYW5kKSBxdWV1ZXMsCi0JICogbm90IHNoYXJlZCB3aXRoIGRldmljZS4gKi8KLQlpZiAoaWQgIT0gcHJpdi0+Y21kX3F1ZXVlKSB7Ci0JCXR4cS0+dHhiID0ga3phbGxvYyhzaXplb2YodHhxLT50eGJbMF0pICoKLQkJCQkgICBURkRfUVVFVUVfU0laRV9NQVgsIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4cS0+dHhiKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJrbWFsbG9jIGZvciBhdXhpbGlhcnkgQkQgIgotCQkJCSAgInN0cnVjdHVyZXMgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IGVsc2UgewotCQl0eHEtPnR4YiA9IE5VTEw7Ci0JfQotCi0JLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3JzIChURkRzKSwKLQkgKiBzaGFyZWQgd2l0aCBkZXZpY2UgKi8KLQl0eHEtPnRmZHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCB0ZmRfc3osICZ0eHEtPnEuZG1hX2FkZHIsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdHhxLT50ZmRzKSB7Ci0JCUlXTF9FUlIocHJpdiwgInBjaV9hbGxvY19jb25zaXN0ZW50KCV6ZCkgZmFpbGVkXG4iLCB0ZmRfc3opOwotCQlnb3RvIGVycm9yOwotCX0KLQl0eHEtPnEuaWQgPSBpZDsKLQotCXJldHVybiAwOwotCi0gZXJyb3I6Ci0Ja2ZyZWUodHhxLT50eGIpOwotCXR4cS0+dHhiID0gTlVMTDsKLQotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSB0eC9jbWQgcXVldWUKLSAqLwotaW50IGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCkKLXsKLQlpbnQgaSwgbGVuOwotCWludCByZXQ7Ci0JaW50IGFjdHVhbF9zbG90cyA9IHNsb3RzX251bTsKLQotCS8qCi0JICogQWxsb2MgYnVmZmVyIGFycmF5IGZvciBjb21tYW5kcyAoVHggb3Igb3RoZXIgdHlwZXMgb2YgY29tbWFuZHMpLgotCSAqIEZvciB0aGUgY29tbWFuZCBxdWV1ZSAoIzQvIzkpLCBhbGxvY2F0ZSBjb21tYW5kIHNwYWNlICsgb25lIGJpZwotCSAqIGNvbW1hbmQgZm9yIHNjYW4sIHNpbmNlIHNjYW4gY29tbWFuZCBpcyB2ZXJ5IGh1Z2U7IHRoZSBzeXN0ZW0gd2lsbAotCSAqIG5vdCBoYXZlIHR3byBzY2FucyBhdCB0aGUgc2FtZSB0aW1lLCBzbyBvbmx5IG9uZSBpcyBuZWVkZWQuCi0JICogRm9yIG5vcm1hbCBUeCBxdWV1ZXMgKGFsbCBvdGhlciBxdWV1ZXMpLCBubyBzdXBlci1zaXplIGNvbW1hbmQKLQkgKiBzcGFjZSBpcyBuZWVkZWQuCi0JICovCi0JaWYgKHR4cV9pZCA9PSBwcml2LT5jbWRfcXVldWUpCi0JCWFjdHVhbF9zbG90cysrOwotCi0JdHhxLT5tZXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl3bF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JdHhxLT5jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKikgKiBhY3R1YWxfc2xvdHMsCi0JCQkgICBHRlBfS0VSTkVMKTsKLQotCWlmICghdHhxLT5tZXRhIHx8ICF0eHEtPmNtZCkKLQkJZ290byBvdXRfZnJlZV9hcnJheXM7Ci0KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspIHsKLQkJLyogb25seSBoYXBwZW5zIGZvciBjbWQgcXVldWUgKi8KLQkJaWYgKGkgPT0gc2xvdHNfbnVtKQotCQkJbGVuID0gSVdMX01BWF9DTURfU0laRTsKLQotCQl0eHEtPmNtZFtpXSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0eHEtPmNtZFtpXSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCS8qIEFsbG9jIGRyaXZlciBkYXRhIGFycmF5IGFuZCBURkQgY2lyY3VsYXIgYnVmZmVyICovCi0JcmV0ID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9hbGxvYyhwcml2LCB0eHEsIHR4cV9pZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQotCS8qCi0JICogRm9yIHRoZSBkZWZhdWx0IHF1ZXVlcyAwLTMsIHNldCB1cCB0aGUgc3dxX2lkCi0JICogYWxyZWFkeSAtLSBhbGwgb3RoZXJzIG5lZWQgdG8gZ2V0IG9uZSBsYXRlcgotCSAqIChpZiB0aGV5IG5lZWQgb25lIGF0IGFsbCkuCi0JICovCi0JaWYgKHR4cV9pZCA8IDQpCi0JCWl3bF9sZWdhY3lfc2V0X3N3cV9pZCh0eHEsIHR4cV9pZCwgdHhxX2lkKTsKLQotCS8qIFRGRF9RVUVVRV9TSVpFX01BWCBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKLQkgKiBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwIGFuZCBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwIGFyZSBicm9rZW4uICovCi0JQlVJTERfQlVHX09OKFRGRF9RVUVVRV9TSVpFX01BWCAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSk7Ci0KLQkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaW5kZXhlcyAqLwotCWl3bF9sZWdhY3lfcXVldWVfaW5pdChwcml2LCAmdHhxLT5xLAotCQkJCVRGRF9RVUVVRV9TSVpFX01BWCwgc2xvdHNfbnVtLCB0eHFfaWQpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBxdWV1ZSAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KHByaXYsIHR4cSk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspCi0JCWtmcmVlKHR4cS0+Y21kW2ldKTsKLW91dF9mcmVlX2FycmF5czoKLQlrZnJlZSh0eHEtPm1ldGEpOwotCWtmcmVlKHR4cS0+Y21kKTsKLQotCXJldHVybiAtRU5PTUVNOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X3F1ZXVlX2luaXQpOwotCi12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQlpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKQotewotCWludCBhY3R1YWxfc2xvdHMgPSBzbG90c19udW07Ci0KLQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJYWN0dWFsX3Nsb3RzKys7Ci0KLQltZW1zZXQodHhxLT5tZXRhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9jbWRfbWV0YSkgKiBhY3R1YWxfc2xvdHMpOwotCi0JdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaW5kZXhlcyAqLwotCWl3bF9sZWdhY3lfcXVldWVfaW5pdChwcml2LCAmdHhxLT5xLAotCQkJCVRGRF9RVUVVRV9TSVpFX01BWCwgc2xvdHNfbnVtLCB0eHFfaWQpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBxdWV1ZSAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KHByaXYsIHR4cSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQpOwotCi0vKioqKioqKioqKioqKioqIEhPU1QgQ09NTUFORCBRVUVVRSBGVU5DVElPTlMgICAqKioqKi8KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2VucXVldWVfaGNtZCAtIGVucXVldWUgYSB1Q29kZSBjb21tYW5kCi0gKiBAcHJpdjogZGV2aWNlIHByaXZhdGUgZGF0YSBwb2ludAotICogQGNtZDogYSBwb2ludCB0byB0aGUgdWNvZGUgY29tbWFuZCBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyA8IDAgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBvcGVyYXRpb24gaXMKLSAqIGZhaWxlZC4gT24gc3VjY2VzcywgaXQgdHVybnMgdGhlIGluZGV4ICg+IDApIG9mIGNvbW1hbmQgaW4gdGhlCi0gKiBjb21tYW5kIHF1ZXVlLgotICovCi1pbnQgaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqb3V0X2NtZDsKLQlzdHJ1Y3QgaXdsX2NtZF9tZXRhICpvdXRfbWV0YTsKLQlkbWFfYWRkcl90IHBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBsZW47Ci0JdTMyIGlkeDsKLQl1MTYgZml4X3NpemU7Ci0KLQljbWQtPmxlbiA9IHByaXYtPmNmZy0+b3BzLT51dGlscy0+Z2V0X2hjbWRfc2l6ZShjbWQtPmlkLCBjbWQtPmxlbik7Ci0JZml4X3NpemUgPSAodTE2KShjbWQtPmxlbiArIHNpemVvZihvdXRfY21kLT5oZHIpKTsKLQotCS8qIElmIGFueSBvZiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmVzIGVuZCB1cCBiZWluZyBsYXJnZXIgdGhhbgotCSAqIHRoZSBURkRfTUFYX1BBWUxPQURfU0laRSwgYW5kIGl0IHNlbnQgYXMgYSAnc21hbGwnIGNvbW1hbmQgdGhlbgotCSAqIHdlIHdpbGwgbmVlZCB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgVEZEIGVudHJpZXMKLQkgKiBBbHNvLCBjaGVjayB0byBzZWUgaWYgY29tbWFuZCBidWZmZXIgc2hvdWxkIG5vdCBleGNlZWQgdGhlIHNpemUKLQkgKiBvZiBkZXZpY2VfY21kIGFuZCBtYXhfY21kX3NpemUuICovCi0JQlVHX09OKChmaXhfc2l6ZSA+IFRGRF9NQVhfUEFZTE9BRF9TSVpFKSAmJgotCSAgICAgICAhKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKSk7Ci0JQlVHX09OKGZpeF9zaXplID4gSVdMX01BWF9DTURfU0laRSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikgfHwgaXdsX2xlZ2FjeV9pc19jdGtpbGwocHJpdikpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIk5vdCBzZW5kaW5nIGNvbW1hbmQgLSAlcyBLSUxMXG4iLAotCQkJIGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpID8gIlJGIiA6ICJDVCIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8ICgoY21kLT5mbGFncyAmIENNRF9BU1lOQykgPyAyIDogMSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQkJSVdMX0VSUihwcml2LCAiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byBjb21tYW5kIHF1ZXVlIGZ1bGxcbiIpOwotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCQlyZXR1cm4gLUVOT1NQQzsKLQl9Ci0KLQlpZHggPSBpd2xfbGVnYWN5X2dldF9jbWRfaW5kZXgocSwgcS0+d3JpdGVfcHRyLCBjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSk7Ci0Jb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07Ci0KLQlpZiAoV0FSTl9PTihvdXRfbWV0YS0+ZmxhZ3MgJiBDTURfTUFQUEVEKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JbWVtc2V0KG91dF9tZXRhLCAwLCBzaXplb2YoKm91dF9tZXRhKSk7CS8qIHJlLWluaXRpYWxpemUgdG8gTlVMTCAqLwotCW91dF9tZXRhLT5mbGFncyA9IGNtZC0+ZmxhZ3MgfCBDTURfTUFQUEVEOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKQotCQlvdXRfbWV0YS0+c291cmNlID0gY21kOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQotCQlvdXRfbWV0YS0+Y2FsbGJhY2sgPSBjbWQtPmNhbGxiYWNrOwotCi0Jb3V0X2NtZC0+aGRyLmNtZCA9IGNtZC0+aWQ7Ci0JbWVtY3B5KCZvdXRfY21kLT5jbWQucGF5bG9hZCwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0KLQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgb3V0X2NtZCBub3cgaGFzIGFsbCBvZiB0aGUgaW5jb21pbmcgY21kCi0JICogaW5mb3JtYXRpb24gKi8KLQotCW91dF9jbWQtPmhkci5mbGFncyA9IDA7Ci0Jb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoUVVFVUVfVE9fU0VRKHByaXYtPmNtZF9xdWV1ZSkgfAotCQkJSU5ERVhfVE9fU0VRKHEtPndyaXRlX3B0cikpOwotCWlmIChjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSkKLQkJb3V0X2NtZC0+aGRyLnNlcXVlbmNlIHw9IFNFUV9IVUdFX0ZSQU1FOwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpOwotCWlmIChpZHggPT0gVEZEX0NNRF9TTE9UUykKLQkJbGVuID0gSVdMX01BWF9DTURfU0laRTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN3aXRjaCAob3V0X2NtZC0+aGRyLmNtZCkgewotCWNhc2UgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRDoKLQljYXNlIFNFTlNJVElWSVRZX0NNRDoKLQkJSVdMX0RFQlVHX0hDX0RVTVAocHJpdiwKLQkJCQkiU2VuZGluZyBjb21tYW5kICVzICgjJXgpLCBzZXE6IDB4JTA0WCwgIgotCQkJCSIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwKLQkJCQlvdXRfY21kLT5oZHIuY21kLAotCQkJCWxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksIGZpeF9zaXplLAotCQkJCXEtPndyaXRlX3B0ciwgaWR4LCBwcml2LT5jbWRfcXVldWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSEMocHJpdiwgIlNlbmRpbmcgY29tbWFuZCAlcyAoIyV4KSwgc2VxOiAweCUwNFgsICIKLQkJCQkiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAotCQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcob3V0X2NtZC0+aGRyLmNtZCksCi0JCQkJb3V0X2NtZC0+aGRyLmNtZCwKLQkJCQlsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLCBmaXhfc2l6ZSwKLQkJCQlxLT53cml0ZV9wdHIsIGlkeCwgcHJpdi0+Y21kX3F1ZXVlKTsKLQl9Ci0jZW5kaWYKLQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibCkKLQkJLyogU2V0IHVwIGVudHJ5IGluIHF1ZXVlJ3MgYnl0ZSBjb3VudCBjaXJjdWxhciBidWZmZXIgKi8KLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwocHJpdiwgdHhxLCAwKTsKLQotCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsCi0JCQkJICAgZml4X3NpemUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JZG1hX3VubWFwX2FkZHJfc2V0KG91dF9tZXRhLCBtYXBwaW5nLCBwaHlzX2FkZHIpOwotCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGZpeF9zaXplKTsKLQotCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl9oY21kKHByaXYsICZvdXRfY21kLT5oZHIsCi0JCQkJCQlmaXhfc2l6ZSwgY21kLT5mbGFncyk7Ci0KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgcGh5c19hZGRyLCBmaXhfc2l6ZSwgMSwKLQkJCQkJCSAgIFUzMl9QQUQoY21kLT5sZW4pKTsKLQotCS8qIEluY3JlbWVudCBhbmQgdXBkYXRlIHF1ZXVlJ3Mgd3JpdGUgaW5kZXggKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7Ci0JaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGlkeDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2hjbWRfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVFggY29tbWFuZCBxdWV1ZSBlbnRyaWVzIGFscmVhZHkgVHgnZAotICoKLSAqIFdoZW4gRlcgYWR2YW5jZXMgJ1InIGluZGV4LCBhbGwgZW50cmllcyBiZXR3ZWVuIG9sZCBhbmQgbmV3ICdSJyBpbmRleAotICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiAgSWYgdGhlcmUgaXMKLSAqIGVub3VnaCBmcmVlIHNwYWNlICg+IGxvdyBtYXJrKSwgd2FrZSB0aGUgc3RhY2sgdGhhdCBmZWVkcyB1cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9oY21kX3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLAotCQkJCSAgIGludCBpZHgsIGludCBjbWRfaWR4KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKLQlpbnQgbmZyZWVkID0gMDsKLQotCWlmICgoaWR4ID49IHEtPm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQocSwgaWR4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpZHgsIHEtPm5fYmQsIHEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpZHggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGlkeCwgcS0+bl9iZCk7IHEtPnJlYWRfcHRyICE9IGlkeDsKLQkgICAgIHEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKLQotCQlpZiAobmZyZWVkKysgPiAwKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJIQ01EIHNraXBwZWQ6IGluZGV4ICglZCkgJWQgJWRcbiIsIGlkeCwKLQkJCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCQl9Ci0KLQl9Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUgLSBQdWxsIHVudXNlZCBidWZmZXJzIG9mZiB0aGUgcXVldWUgYW5kIHJlY2xhaW0gdGhlbQotICogQHJ4YjogUnggYnVmZmVyIHRvIHJlY2xhaW0KLSAqCi0gKiBJZiBhbiBSeCBidWZmZXIgaGFzIGFuIGFzeW5jIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGUgY2FsbGJhY2sKLSAqIHdpbGwgYmUgZXhlY3V0ZWQuICBUaGUgYXR0YWNoZWQgc2tiIChpZiBwcmVzZW50KSB3aWxsIG9ubHkgYmUgZnJlZWQKLSAqIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIDEKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7Ci0JaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7Ci0JaW50IGluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKLQlpbnQgY21kX2luZGV4OwotCWJvb2wgaHVnZSA9ICEhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX0hVR0VfRlJBTUUpOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm1ldGE7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJZiBhIFR4IGNvbW1hbmQgaXMgYmVpbmcgaGFuZGxlZCBhbmQgaXQgaXNuJ3QgaW4gdGhlIGFjdHVhbAotCSAqIGNvbW1hbmQgcXVldWUgdGhlbiB0aGVyZSBhIGNvbW1hbmQgcm91dGluZyBidWcgaGFzIGJlZW4gaW50cm9kdWNlZAotCSAqIGluIHRoZSBxdWV1ZSBtYW5hZ2VtZW50IGNvZGUuICovCi0JaWYgKFdBUk4odHhxX2lkICE9IHByaXYtPmNtZF9xdWV1ZSwKLQkJICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKLQkJICB0eHFfaWQsIHByaXYtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsCi0JCSAgcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV0ucS5yZWFkX3B0ciwKLQkJICBwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5xLndyaXRlX3B0cikpIHsKLQkJaXdsX3ByaW50X2hleF9lcnJvcihwcml2LCBwa3QsIDMyKTsKLQkJcmV0dXJuOwotCX0KLQotCWNtZF9pbmRleCA9IGl3bF9sZWdhY3lfZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCBpbmRleCwgaHVnZSk7Ci0JY21kID0gdHhxLT5jbWRbY21kX2luZGV4XTsKLQltZXRhID0gJnR4cS0+bWV0YVtjbWRfaW5kZXhdOwotCi0JdHhxLT50aW1lX3N0YW1wID0gamlmZmllczsKLQotCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCSBkbWFfdW5tYXBfYWRkcihtZXRhLCBtYXBwaW5nKSwKLQkJCSBkbWFfdW5tYXBfbGVuKG1ldGEsIGxlbiksCi0JCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQotCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCi0JaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7Ci0JCW1ldGEtPnNvdXJjZS0+cmVwbHlfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXJ4Yl9hZGRyKHJ4Yik7Ci0JCXJ4Yi0+cGFnZSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChtZXRhLT5jYWxsYmFjaykKLQkJbWV0YS0+Y2FsbGJhY2socHJpdiwgY21kLCBwa3QpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotCi0JaXdsX2xlZ2FjeV9oY21kX3F1ZXVlX3JlY2xhaW0ocHJpdiwgdHhxX2lkLCBpbmRleCwgY21kX2luZGV4KTsKLQotCWlmICghKG1ldGEtPmZsYWdzICYgQ01EX0FTWU5DKSkgewotCQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAotCQkJICAgICAgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSk7Ci0JCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JfQotCi0JLyogTWFyayBhcyB1bm1hcHBlZCAqLwotCW1ldGEtPmZsYWdzID0gMDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wzOTQ1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjgyZDg2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2RlZmluZSBEUlZfTkFNRQkiaXdsMzk0NSIKLQotI2luY2x1ZGUgIml3bC1maC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWZoLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtc3BlY3RydW0uaCIKLQotLyoKLSAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KLSAqLwotCi0jZGVmaW5lIERSVl9ERVNDUklQVElPTglcCi0iSW50ZWwoUikgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uIGRyaXZlciBmb3IgTGludXgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLSNkZWZpbmUgVkQgImQiCi0jZWxzZQotI2RlZmluZSBWRAotI2VuZGlmCi0KLS8qCi0gKiBhZGQgInMiIHRvIGluZGljYXRlIHNwZWN0cnVtIG1lYXN1cmVtZW50IGluY2x1ZGVkLgotICogd2UgYWRkIGl0IGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIGluIHdoaWNoCi0gKiB0aGlzIHdhcyBjb25maWd1cmFibGUuCi0gKi8KLSNkZWZpbmUgRFJWX1ZFUlNJT04gIElXTFdJRklfVkVSU0lPTiBWRCAicyIKLSNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiIKLSNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7Ci1NT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Ci1NT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0gLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0cnVjdCBpd2xfbW9kX3BhcmFtcyBpd2wzOTQ1X21vZF9wYXJhbXMgPSB7Ci0JLnN3X2NyeXB0byA9IDEsCi0JLnJlc3RhcnRfZncgPSAxLAotCS5kaXNhYmxlX2h3X3NjYW4gPSAxLAotCS8qIHRoZSByZXN0IGFyZSAwIGJ5IGRlZmF1bHQgKi8KLX07Ci0KLS8qKgotICogaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyAtIEdldCBhbnRlbm5hIGZsYWdzIGZvciBSWE9OIGNvbW1hbmQKLSAqIEBwcml2OiBlZXByb20gYW5kIGFudGVubmEgZmllbGRzIGFyZSB1c2VkIHRvIGRldGVybWluZSBhbnRlbm5hIGZsYWdzCi0gKgotICogcHJpdi0+ZWVwcm9tMzkgIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFudGVubmEgQVVYL01BSU4gYXJlIHJldmVyc2VkCi0gKiBpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSBzcGVjaWZpZXMgdGhlIGFudGVubmEgZGl2ZXJzaXR5IG1vZGU6Ci0gKgotICogSVdMX0FOVEVOTkFfRElWRVJTSVRZIC0gTklDIHNlbGVjdHMgYmVzdCBhbnRlbm5hIGJ5IGl0c2VsZgotICogSVdMX0FOVEVOTkFfTUFJTiAgICAgIC0gRm9yY2UgTUFJTiBhbnRlbm5hCi0gKiBJV0xfQU5URU5OQV9BVVggICAgICAgLSBGb3JjZSBBVVggYW50ZW5uYQotICovCi1fX2xlMzIgaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCi0Jc3dpdGNoIChpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSkgewotCWNhc2UgSVdMX0FOVEVOTkFfRElWRVJTSVRZOgotCQlyZXR1cm4gMDsKLQotCWNhc2UgSVdMX0FOVEVOTkFfTUFJTjoKLQkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKLQkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKLQkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0FfTVNLOwotCi0JY2FzZSBJV0xfQU5URU5OQV9BVVg6Ci0JCWlmIChlZXByb20tPmFudGVubmFfc3dpdGNoX3R5cGUpCi0JCQlyZXR1cm4gUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0s7Ci0JCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKLQl9Ci0KLQkvKiBiYWQgYW50ZW5uYSBzZWxlY3RvciB2YWx1ZSAqLwotCUlXTF9FUlIocHJpdiwgIkJhZCBhbnRlbm5hIHNlbGVjdG9yIHZhbHVlICgweCV4KVxuIiwKLQkJaXdsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOwotCi0JcmV0dXJuIDA7CQkvKiAiZGl2ZXJzaXR5IiBpcyBkZWZhdWx0IGlmIGVycm9yICovCi19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCSAgIHU4IHN0YV9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fbGUxNiBrZXlfZmxhZ3MgPSAwOwotCWludCByZXQ7Ci0KLQlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7Ci0Ja2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOwotCi0JaWYgKHN0YV9pZCA9PSBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQpCi0JCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7Ci0KLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7Ci0Ja2V5Y29uZi0+aHdfa2V5X2lkeCA9IGtleWNvbmYtPmtleWlkeDsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47Ci0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJod2NyeXB0bzogbW9kaWZ5IHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwKLQkJCQkmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkgIHU4IHN0YV9pZCkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkgIHU4IHN0YV9pZCkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCXNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IFNUQV9LRVlfRkxHX05PX0VOQzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiaHdjcnlwdG86IGNsZWFyIHVjb2RlIHN0YXRpb24ga2V5IGluZm9cbiIpOwotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfRFlOQU1JQzsKLQotCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlyZXQgPSBpd2wzOTQ1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlyZXQgPSBpd2wzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwga2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiVW5rbm93biBhbGc6ICVzIGFsZz0leFxuIiwgX19mdW5jX18sCi0JCQlrZXljb25mLT5jaXBoZXIpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCUlXTF9ERUJVR19XRVAocHJpdiwgIlNldCBkeW5hbWljIGtleTogYWxnPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVkIHJldD0lZFxuIiwKLQkJICAgICAga2V5Y29uZi0+Y2lwaGVyLCBrZXljb25mLT5rZXlsZW4sIGtleWNvbmYtPmtleWlkeCwKLQkJICAgICAgc3RhX2lkLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3JlbW92ZV9zdGF0aWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X3N0YXRpY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlJV0xfRVJSKHByaXYsICJTdGF0aWMga2V5IGludmFsaWQ6IGNpcGhlciAleFxuIiwga2V5LT5jaXBoZXIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NsZWFyX2ZyZWVfZnJhbWVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVkIGZyYW1lcyBvbiBwcmUtYWxsb2NhdGVkIGhlYXAgb24gY2xlYXIuXG4iLAotCQkgICAgICAgcHJpdi0+ZnJhbWVzX2NvdW50KTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmcHJpdi0+ZnJlZV9mcmFtZXMpKSB7Ci0JCWVsZW1lbnQgPSBwcml2LT5mcmVlX2ZyYW1lcy5uZXh0OwotCQlsaXN0X2RlbChlbGVtZW50KTsKLQkJa2ZyZWUobGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsMzk0NV9mcmFtZSwgbGlzdCkpOwotCQlwcml2LT5mcmFtZXNfY291bnQtLTsKLQl9Ci0KLQlpZiAocHJpdi0+ZnJhbWVzX2NvdW50KSB7Ci0JCUlXTF9XQVJOKHByaXYsICIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKLQkJCSAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCQlwcml2LT5mcmFtZXNfY291bnQgPSAwOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lICppd2wzOTQ1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlpZiAobGlzdF9lbXB0eSgmcHJpdi0+ZnJlZV9mcmFtZXMpKSB7Ci0JCWZyYW1lID0ga3phbGxvYyhzaXplb2YoKmZyYW1lKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZnJhbWUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSFcbiIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQlwcml2LT5mcmFtZXNfY291bnQrKzsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQotCWVsZW1lbnQgPSBwcml2LT5mcmVlX2ZyYW1lcy5uZXh0OwotCWxpc3RfZGVsKGVsZW1lbnQpOwotCXJldHVybiBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lLCBsaXN0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lKQotewotCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOwotCWxpc3RfYWRkKCZmcmFtZS0+bGlzdCwgJnByaXYtPmZyZWVfZnJhbWVzKTsKLX0KLQotdW5zaWduZWQgaW50IGl3bDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJaW50IGxlZnQpCi17Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSB8fCAhcHJpdi0+YmVhY29uX3NrYikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocHJpdi0+YmVhY29uX3NrYi0+bGVuID4gbGVmdCkKLQkJcmV0dXJuIDA7Ci0KLQltZW1jcHkoaGRyLCBwcml2LT5iZWFjb25fc2tiLT5kYXRhLCBwcml2LT5iZWFjb25fc2tiLT5sZW4pOwotCi0JcmV0dXJuIHByaXYtPmJlYWNvbl9za2ItPmxlbjsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lOwotCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOwotCWludCByYzsKLQl1OCByYXRlOwotCi0JZnJhbWUgPSBpd2wzOTQ1X2dldF9mcmVlX2ZyYW1lKHByaXYpOwotCi0JaWYgKCFmcmFtZSkgewotCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgotCQkJICAiY29tbWFuZC5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyYXRlID0gaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3AocHJpdiwKLQkJCQkmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCi0JZnJhbWVfc2l6ZSA9IGl3bDM5NDVfaHdfZ2V0X2JlYWNvbl9jbWQocHJpdiwgZnJhbWUsIHJhdGUpOwotCi0JcmMgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9UWF9CRUFDT04sIGZyYW1lX3NpemUsCi0JCQkgICAgICAmZnJhbWUtPnUuY21kWzBdKTsKLQotCWl3bDM5NDVfZnJlZV9mcmFtZShwcml2LCBmcmFtZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfdW5zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+XzM5NDUuc2hhcmVkX3ZpcnQpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsCi0JCQkJICBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2hhcmVkKSwKLQkJCQkgIHByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0LAotCQkJCSAgcHJpdi0+XzM5NDUuc2hhcmVkX3BoeXMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2J1aWxkX3R4X2NtZF9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2JfZnJhZywKLQkJCQkgICAgICBpbnQgc3RhX2lkKQotewotCXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqdHhfY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7Ci0Jc3RydWN0IGl3bF9od19rZXkgKmtleWluZm8gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvOwotCi0JdHhfY21kLT5zZWNfY3RsID0gMDsKLQotCXN3aXRjaCAoa2V5aW5mby0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKLQkJbWVtY3B5KHR4X2NtZC0+a2V5LCBrZXlpbmZvLT5rZXksIGtleWluZm8tPmtleWxlbik7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCXR4X2NtZC0+c2VjX2N0bCB8PSBUWF9DTURfU0VDX0tFWTEyODsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfV0VQIHwKLQkJICAgIChpbmZvLT5jb250cm9sLmh3X2tleS0+aHdfa2V5X2lkeCAmIFRYX0NNRF9TRUNfTVNLKSA8PCBUWF9DTURfU0VDX1NISUZUOwotCi0JCW1lbWNweSgmdHhfY21kLT5rZXlbM10sIGtleWluZm8tPmtleSwga2V5aW5mby0+a2V5bGVuKTsKLQotCQlJV0xfREVCVUdfVFgocHJpdiwgIkNvbmZpZ3VyaW5nIHBhY2tldCBmb3IgV0VQIGVuY3J5cHRpb24gIgotCQkJICAgICAid2l0aCBrZXkgJWRcbiIsIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5od19rZXlfaWR4KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGVuY29kZSBjaXBoZXIgJXhcbiIsIGtleWluZm8tPmNpcGhlcik7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIGhhbmRsZSBidWlsZCBSRVBMWV9UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCB1OCBzdGRfaWQpCi17Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKLQlfX2xlMzIgdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOwotCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKLQotCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgotCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7Ci0JfSBlbHNlIHsKLQkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOwotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwotCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7Ci0KLQl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOwotCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOwotCQllbHNlCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOwotCX0gZWxzZSB7Ci0JCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKLQl9Ci0KLQl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0JdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Ci19Ci0KLS8qCi0gKiBzdGFydCBSRVBMWV9UWCBjb21tYW5kIHByb2Nlc3MKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQ7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gTlVMTDsKLQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKm91dF9jbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGE7Ci0JZG1hX2FkZHJfdCBwaHlzX2FkZHI7Ci0JZG1hX2FkZHJfdCB0eGNtZF9waHlzOwotCWludCB0eHFfaWQgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKLQl1MTYgbGVuLCBpZHgsIGhkcl9sZW47Ci0JdTggaWQ7Ci0JdTggdW5pY2FzdDsKLQl1OCBzdGFfaWQ7Ci0JdTggdGlkID0gMDsKLQlfX2xlMTYgZmM7Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkgewotCQlJV0xfREVCVUdfRFJPUChwcml2LCAiRHJvcHBpbmcgLSBSRiBLSUxMXG4iKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQlpZiAoKGllZWU4MDIxMV9nZXRfdHhfcmF0ZShwcml2LT5odywgaW5mbyktPmh3X3ZhbHVlICYgMHhGRikgPT0gSVdMX0lOVkFMSURfUkFURSkgewotCQlJV0xfRVJSKHByaXYsICJFUlJPUjogTm8gVFggcmF0ZSBhdmFpbGFibGUuXG4iKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQl1bmljYXN0ID0gIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOwotCWlkID0gMDsKLQotCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGllZWU4MDIxMV9pc19hdXRoKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIEFVVEggZnJhbWVcbiIpOwotCWVsc2UgaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVNTT0MgZnJhbWVcbiIpOwotCWVsc2UgaWYgKGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBSRUFTU09DIGZyYW1lXG4iKTsKLSNlbmRpZgotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwotCi0JLyogRmluZCBpbmRleCBpbnRvIHN0YXRpb24gdGFibGUgZm9yIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3QoCi0JCQlwcml2LCAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10sCi0JCQlpbmZvLT5jb250cm9sLnN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAotCQkJICAgICAgIGhkci0+YWRkcjEpOwotCQlnb3RvIGRyb3A7Ci0JfQotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJaWYgKHVubGlrZWx5KHRpZCA+PSBNQVhfVElEX0NPVU5UKSkKLQkJCWdvdG8gZHJvcDsKLQl9Ci0KLQkvKiBEZXNjcmlwdG9yIGZvciBjaG9zZW4gVHggcXVldWUgKi8KLQl0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKQotCQlnb3RvIGRyb3A7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWR4ID0gaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KHEsIHEtPndyaXRlX3B0ciwgMCk7Ci0KLQkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCS8qIEluaXQgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwotCW91dF9jbWQgPSB0eHEtPmNtZFtpZHhdOwotCW91dF9tZXRhID0gJnR4cS0+bWV0YVtpZHhdOwotCXR4X2NtZCA9IChzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgKilvdXRfY21kLT5jbWQucGF5bG9hZDsKLQltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZigqdHhfY21kKSk7Ci0KLQkvKgotCSAqIFNldCB1cCB0aGUgVHgtY29tbWFuZCAobm90IE1BQyEpIGhlYWRlci4KLQkgKiBTdG9yZSB0aGUgY2hvc2VuIFR4IHF1ZXVlIGFuZCBURkQgaW5kZXggd2l0aGluIHRoZSBzZXF1ZW5jZSBmaWVsZDsKLQkgKiBhZnRlciBUeCwgdUNvZGUncyBUeCByZXNwb25zZSB3aWxsIHJldHVybiB0aGlzIHZhbHVlIHNvIGRyaXZlciBjYW4KLQkgKiBsb2NhdGUgdGhlIGZyYW1lIHdpdGhpbiB0aGUgdHggcXVldWUgYW5kIGRvIHBvc3QtdHggcHJvY2Vzc2luZy4KLQkgKi8KLQlvdXRfY21kLT5oZHIuY21kID0gUkVQTFlfVFg7Ci0Jb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0gY3B1X3RvX2xlMTYoKHUxNikoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfAotCQkJCUlOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7Ci0KLQkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwotCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJfbGVuKTsKLQotCi0JaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQotCQlpd2wzOTQ1X2J1aWxkX3R4X2NtZF9od2NyeXB0byhwcml2LCBpbmZvLCBvdXRfY21kLCBza2IsIHN0YV9pZCk7Ci0KLQkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLwotCWl3bDM5NDVfYnVpbGRfdHhfY21kX2Jhc2ljKHByaXYsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkKTsKLQotCS8qIHNldCBpc19oY2NhIHRvIDA7IGl0IHByb2JhYmx5IHdpbGwgbmV2ZXIgYmUgaW1wbGVtZW50ZWQgKi8KLQlpd2wzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHByaXYsIG91dF9jbWQsIGluZm8sIGhkciwgc3RhX2lkLCAwKTsKLQotCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQlsZW4gPSAodTE2KXNrYi0+bGVuOwotCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKLQotCWl3bF9sZWdhY3lfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHByaXYsIGxlbiwgaGRyKTsKLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCB0cnVlLCBmYywgbGVuKTsKLQl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9BX01TSzsKLQl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9CX01TSzsKLQotCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQl9IGVsc2UgewotCQl3YWl0X3dyaXRlX3B0ciA9IDE7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAwOwotCX0KLQotCUlXTF9ERUJVR19UWChwcml2LCAic2VxdWVuY2UgbnIgPSAwWCV4XG4iLAotCQkgICAgIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSkpOwotCUlXTF9ERUJVR19UWChwcml2LCAidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOwotCWl3bF9wcmludF9oZXhfZHVtcChwcml2LCBJV0xfRExfVFgsICh1OCAqKXR4X2NtZC0+aGRyLAotCQkJICAgaWVlZTgwMjExX2hkcmxlbihmYykpOwotCi0JLyoKLQkgKiBVc2UgdGhlIGZpcnN0IGVtcHR5IGVudHJ5IGluIHRoaXMgcXVldWUncyBjb21tYW5kIGJ1ZmZlciBhcnJheQotCSAqIHRvIGNvbnRhaW4gdGhlIFR4IGNvbW1hbmQgYW5kIE1BQyBoZWFkZXIgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyCi0JICogKHBheWxvYWQgZGF0YSB3aWxsIGJlIGluIGFub3RoZXIgYnVmZmVyKS4KLQkgKiBTaXplIG9mIHRoaXMgdmFyaWVzLCBkdWUgdG8gdmFyeWluZyBNQUMgaGVhZGVyIGxlbmd0aC4KLQkgKiBJZiBlbmQgaXMgbm90IGR3b3JkIGFsaWduZWQsIHdlJ2xsIGhhdmUgMiBleHRyYSBieXRlcyBhdCB0aGUgZW5kCi0JICogb2YgdGhlIE1BQyBoZWFkZXIgKGRldmljZSByZWFkcyBvbiBkd29yZCBib3VuZGFyaWVzKS4KLQkgKiBXZSdsbCB0ZWxsIGRldmljZSBhYm91dCB0aGlzIHBhZGRpbmcgbGF0ZXIuCi0JICovCi0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcikgKyBoZHJfbGVuOwotCWxlbiA9IChsZW4gKyAzKSAmIH4zOwotCi0JLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIFR4IGNvbW1hbmQncyBoZWFkZXIgKG5vdCBNQUMgaGVhZGVyISksCi0JICogd2l0aGluIGNvbW1hbmQgYnVmZmVyIGFycmF5LiAqLwotCXR4Y21kX3BoeXMgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LCAmb3V0X2NtZC0+aGRyLAotCQkJCSAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCS8qIHdlIGRvIG5vdCBtYXAgbWV0YSBkYXRhIC4uLiBzbyB3ZSBjYW4gc2FmZWx5IGFjY2VzcyBhZGRyZXNzIHRvCi0JICogcHJvdmlkZSB0byB1bm1hcCBjb21tYW5kKi8KLQlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOwotCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGxlbik7Ci0KLQkvKiBBZGQgYnVmZmVyIGNvbnRhaW5pbmcgVHggY29tbWFuZCBhbmQgTUFDKCEpIGhlYWRlciB0byBURkQncwotCSAqIGZpcnN0IGVudHJ5ICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwKLQkJCQkJCSAgIHR4Y21kX3BoeXMsIGxlbiwgMSwgMCk7Ci0KLQotCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKLQkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLwotCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKLQlpZiAobGVuKSB7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sCi0JCQkJCSAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkJICAgcGh5c19hZGRyLCBsZW4sCi0JCQkJCQkJICAgMCwgVTMyX1BBRChsZW4pKTsKLQl9Ci0KLQotCS8qIFRlbGwgZGV2aWNlIHRoZSB3cml0ZSBpbmRleCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCi0JcS0+d3JpdGVfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOwotCWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgdHhxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspCi0JICAgICYmIHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKLQkJaWYgKHdhaXRfd3JpdGVfcHRyKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpd2xfbGVnYWN5X3N0b3BfcXVldWUocHJpdiwgdHhxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZHJvcF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotZHJvcDoKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9nZXRfbWVhc3VyZW1lbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICAgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaXdsX3NwZWN0cnVtX2NtZCBzcGVjdHJ1bTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQsCi0JCS5kYXRhID0gKHZvaWQgKikmc3BlY3RydW0sCi0JCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKLQl9OwotCXUzMiBhZGRfdGltZSA9IGxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSk7Ci0JaW50IHJjOwotCWludCBzcGVjdHJ1bV9yZXNwX3N0YXR1czsKLQlpbnQgZHVyYXRpb24gPSBsZTE2X3RvX2NwdShwYXJhbXMtPmR1cmF0aW9uKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkKLQkJYWRkX3RpbWUgPSBpd2xfbGVnYWN5X3VzZWNzX3RvX2JlYWNvbnMocHJpdiwKLQkJCWxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSkgLSBwcml2LT5fMzk0NS5sYXN0X3RzZiwKLQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCkpOwotCi0JbWVtc2V0KCZzcGVjdHJ1bSwgMCwgc2l6ZW9mKHNwZWN0cnVtKSk7Ci0KLQlzcGVjdHJ1bS5jaGFubmVsX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7Ci0Jc3BlY3RydW0uZmxhZ3MgPQotCSAgICBSWE9OX0ZMR19UU0YySE9TVF9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0sgfCBSWE9OX0ZMR19ESVNfRElWX01TSzsKLQlzcGVjdHJ1bS5maWx0ZXJfZmxhZ3MgPSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRzsKLQljbWQubGVuID0gc2l6ZW9mKHNwZWN0cnVtKTsKLQlzcGVjdHJ1bS5sZW4gPSBjcHVfdG9fbGUxNihjbWQubGVuIC0gc2l6ZW9mKHNwZWN0cnVtLmxlbikpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkKLQkJc3BlY3RydW0uc3RhcnRfdGltZSA9Ci0JCQlpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCXByaXYtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUsIGFkZF90aW1lLAotCQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCkpOwotCWVsc2UKLQkJc3BlY3RydW0uc3RhcnRfdGltZSA9IDA7Ci0KLQlzcGVjdHJ1bS5jaGFubmVsc1swXS5kdXJhdGlvbiA9IGNwdV90b19sZTMyKGR1cmF0aW9uICogVElNRV9VTklUKTsKLQlzcGVjdHJ1bS5jaGFubmVsc1swXS5jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsOwotCXNwZWN0cnVtLmNoYW5uZWxzWzBdLnR5cGUgPSB0eXBlOwotCWlmIChjdHgtPmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKLQkJc3BlY3RydW0uZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLIHwKLQkJICAgIFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8IFJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKLQotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcGt0ID0gKHN0cnVjdCBpd2xfcnhfcGFja2V0ICopY21kLnJlcGx5X3BhZ2U7Ci0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSBSRVBMWV9SWF9PTl9BU1NPQyBjb21tYW5kXG4iKTsKLQkJcmMgPSAtRUlPOwotCX0KLQotCXNwZWN0cnVtX3Jlc3Bfc3RhdHVzID0gbGUxNl90b19jcHUocGt0LT51LnNwZWN0cnVtLnN0YXR1cyk7Ci0Jc3dpdGNoIChzcGVjdHJ1bV9yZXNwX3N0YXR1cykgewotCWNhc2UgMDoJCS8qIENvbW1hbmQgd2lsbCBiZSBoYW5kbGVkICovCi0JCWlmIChwa3QtPnUuc3BlY3RydW0uaWQgIT0gMHhmZikgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJlcGxhY2VkIGV4aXN0aW5nIG1lYXN1cmVtZW50OiAlZFxuIiwKLQkJCQkJCXBrdC0+dS5zcGVjdHJ1bS5pZCk7Ci0JCQlwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgJj0gfk1FQVNVUkVNRU5UX1JFQURZOwotCQl9Ci0JCXByaXYtPm1lYXN1cmVtZW50X3N0YXR1cyB8PSBNRUFTVVJFTUVOVF9BQ1RJVkU7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6CQkvKiBDb21tYW5kIHdpbGwgbm90IGJlIGhhbmRsZWQgKi8KLQkJcmMgPSAtRUFHQUlOOwotCQlicmVhazsKLQl9Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKLQotCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgdWNvZGUgc3RhdHVzIDB4JTA4WCByZXZpc2lvbiAiCi0JCSAgICAgICAiMHglMDFYIDB4JTAxWFxuIiwKLQkJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsCi0JCSAgICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlKTsKLQotCWlmIChwYWxpdmUtPnZlcl9zdWJ0eXBlID09IElOSVRJQUxJWkVfU1VCVFlQRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlX2luaXQsICZwa3QtPnUuYWxpdmVfZnJhbWUsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSk7Ci0JCXB3b3JrID0gJnByaXYtPmluaXRfYWxpdmVfc3RhcnQ7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlLCAmcGt0LT51LmFsaXZlX2ZyYW1lLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkpOwotCQlwd29yayA9ICZwcml2LT5hbGl2ZV9zdGFydDsKLQkJaXdsMzk0NV9kaXNhYmxlX2V2ZW50cyhwcml2KTsKLQl9Ci0KLQkvKiBXZSBkZWxheSB0aGUgQUxJVkUgcmVzcG9uc2UgYnkgNW1zIHRvCi0JICogZ2l2ZSB0aGUgSFcgUkYgS2lsbCB0aW1lIHRvIGFjdGl2YXRlLi4uICovCi0JaWYgKHBhbGl2ZS0+aXNfdmFsaWQgPT0gVUNPREVfVkFMSURfT0spCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsIHB3b3JrLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoNSkpOwotCWVsc2UKLQkJSVdMX1dBUk4ocHJpdiwgInVDb2RlIGRpZCBub3QgcmVzcG9uZCBPSy5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X2FkZF9zdGEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLSNlbmRpZgotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJSZWNlaXZlZCBSRVBMWV9BRERfU1RBOiAweCUwMlhcbiIsIHBrdC0+dS5zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X2JlYWNvbl9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bDM5NDVfYmVhY29uX25vdGlmICpiZWFjb24gPSAmKHBrdC0+dS5iZWFjb25fc3RhdHVzKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQl1OCByYXRlID0gYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICV4IHJldHJpZXMgJWQgaXNzICVkICIKLQkJInRzZiAlZCAlZCByYXRlICVkXG4iLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAotCQliZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOwotI2VuZGlmCi0KLQlwcml2LT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Ci0KLX0KLQotLyogSGFuZGxlIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlIHRoYXQgY2FyZCdzIHBvd2VyIHN0YXRlIGlzIGNoYW5naW5nCi0gKiBkdWUgdG8gc29mdHdhcmUsIGhhcmR3YXJlLCBvciBjcml0aWNhbCB0ZW1wZXJhdHVyZSBSRktJTEwgKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfY2FyZF9zdGF0ZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KHBrdC0+dS5jYXJkX3N0YXRlX25vdGlmLmZsYWdzKTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHByaXYtPnN0YXR1czsKLQotCUlXTF9XQVJOKHByaXYsICJDYXJkIHN0YXRlIHJlY2VpdmVkOiBIVzolcyBTVzolc1xuIiwKLQkJCSAgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAotCQkJICAoZmxhZ3MgJiBTV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIpOwotCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCWlmIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KTsKLQotCWlmICgodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9Ci0JICAgICB0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpKQotCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwKLQkJCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCWVsc2UKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcwotICoKLSAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQotICogdG8gdGhlIGhvc3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKLSAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9BTElWRV0gPSBpd2wzOTQ1X3J4X3JlcGx5X2FsaXZlOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0FERF9TVEFdID0gaXdsMzk0NV9yeF9yZXBseV9hZGRfc3RhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0VSUk9SXSA9IGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3I7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfY3NhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OXSA9Ci0JCQlpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fU0xFRVBfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fREVCVUdfU1RBVElTVElDX05PVElGSUNdID0KLQkgICAgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsMzk0NV9yeF9iZWFjb25fbm90aWY7Ci0KLQkvKgotCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQotCSAqIHN0YXRpc3RpY3MgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYwotCSAqIHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCi0JICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU1RBVElTVElDU19DTURdID0gaXdsMzk0NV9yZXBseV9zdGF0aXN0aWNzOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OXSA9IGl3bDM5NDVfaHdfcnhfc3RhdGlzdGljczsKLQotCWl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhwcml2KTsKLQlwcml2LT5yeF9oYW5kbGVyc1tDQVJEX1NUQVRFX05PVElGSUNBVElPTl0gPSBpd2wzOTQ1X3J4X2NhcmRfc3RhdGVfbm90aWY7Ci0KLQkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KLQlpd2wzOTQ1X2h3X3J4X2hhbmRsZXJfc2V0dXAocHJpdik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSWC1GVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCB0aGVvcnkgb2Ygb3BlcmF0aW9uCi0gKgotICogVGhlIGhvc3QgYWxsb2NhdGVzIDMyIERNQSB0YXJnZXQgYWRkcmVzc2VzIGFuZCBwYXNzZXMgdGhlIGhvc3QgYWRkcmVzcwotICogdG8gdGhlIGZpcm13YXJlIGF0IHJlZ2lzdGVyIElXTF9SRkRTX1RBQkxFX0xPV0VSICsgTiAqIFJGRF9TSVpFIHdoZXJlIE4gaXMKLSAqIDAgdG8gMzEKLSAqCi0gKiBSeCBRdWV1ZSBJbmRleGVzCi0gKiBUaGUgaG9zdC9maXJtd2FyZSBzaGFyZSB0d28gaW5kZXggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KLSAqCi0gKiBUaGUgUkVBRCBpbmRleCBtYXBzIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IHRoZSBmaXJtd2FyZSBtYXkgYmUgd3JpdGluZwotICogdG8gLS0gdGhlIGRyaXZlciBjYW4gcmVhZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoaXMgcG9zaXRpb24gYW5kIGdldAotICogZ29vZCBkYXRhLgotICogVGhlIFJFQUQgaW5kZXggaXMgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUgb25jZSB0aGUgY2FyZCBpcyBlbmFibGVkLgotICoKLSAqIFRoZSBXUklURSBpbmRleCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKLSAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCi0gKgotICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCi0gKiBXUklURSA9IFJFQUQuCi0gKgotICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAotICogSU5ERVggcG9zaXRpb24sIGFuZCBXUklURSB0byB0aGUgbGFzdCAoUkVBRCAtIDEgd3JhcHBlZCkKLSAqCi0gKiBXaGVuIHRoZSBmaXJtd2FyZSBwbGFjZXMgYSBwYWNrZXQgaW4gYSBidWZmZXIsIGl0IHdpbGwgYWR2YW5jZSB0aGUgUkVBRCBpbmRleAotICogYW5kIGZpcmUgdGhlIFJYIGludGVycnVwdC4gIFRoZSBkcml2ZXIgY2FuIHRoZW4gcXVlcnkgdGhlIFJFQUQgaW5kZXggYW5kCi0gKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpbmRleCBmb3J3YXJkIGFzIGl0Ci0gKiByZXNldHMgdGhlIFJ4IHF1ZXVlIGJ1ZmZlcnMgd2l0aCBuZXcgbWVtb3J5LgotICoKLSAqIFRoZSBtYW5hZ2VtZW50IGluIHRoZSBkcml2ZXIgaXMgYXMgZm9sbG93czoKLSAqICsgQSBsaXN0IG9mIHByZS1hbGxvY2F0ZWQgU0tCcyBpcyBzdG9yZWQgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUuICBXaGVuCi0gKiAgIGl3bC0+cnhxLT5mcmVlX2NvdW50IGRyb3BzIHRvIG9yIGJlbG93IFJYX0xPV19XQVRFUk1BUkssIHdvcmsgaXMgc2NoZWR1bGVkCi0gKiAgIHRvIHJlcGxlbmlzaCB0aGUgaXdsLT5yeHEtPnJ4X2ZyZWUuCi0gKiArIEluIGl3bDM5NDVfcnhfcmVwbGVuaXNoIChzY2hlZHVsZWQpIGlmICdwcm9jZXNzZWQnICE9ICdyZWFkJyB0aGVuIHRoZQotICogICBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhbmQgdGhlIFJFQUQgSU5ERVggaXMgdXBkYXRlZCAodXBkYXRpbmcgdGhlCi0gKiAgICdwcm9jZXNzZWQnIGFuZCAncmVhZCcgZHJpdmVyIGluZGV4ZXMgYXMgd2VsbCkKLSAqICsgQSByZWNlaXZlZCBwYWNrZXQgaXMgcHJvY2Vzc2VkIGFuZCBoYW5kZWQgdG8gdGhlIGtlcm5lbCBuZXR3b3JrIHN0YWNrLAotICogICBkZXRhY2hlZCBmcm9tIHRoZSBpd2wtPnJ4cS4gIFRoZSBkcml2ZXIgJ3Byb2Nlc3NlZCcgaW5kZXggaXMgdXBkYXRlZC4KLSAqICsgVGhlIEhvc3QvRmlybXdhcmUgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYXQgdGFza2xldCB0aW1lIGZyb20gdGhlIHJ4X2ZyZWUKLSAqICAgbGlzdC4gSWYgdGhlcmUgYXJlIG5vIGFsbG9jYXRlZCBidWZmZXJzIGluIGl3bC0+cnhxLT5yeF9mcmVlLCB0aGUgUkVBRAotICogICBJTkRFWCBpcyBub3QgaW5jcmVtZW50ZWQgYW5kIGl3bC0+c3RhdHVzKFJYX1NUQUxMRUQpIGlzIHNldC4gIElmIHRoZXJlCi0gKiAgIHdlcmUgZW5vdWdoIGZyZWUgYnVmZmVycyBhbmQgUlhfU1RBTExFRCBpcyBzZXQgaXQgaXMgY2xlYXJlZC4KLSAqCi0gKgotICogRHJpdmVyIHNlcXVlbmNlOgotICoKLSAqIGl3bDM5NDVfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrCi0gKiBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soKSBNb3ZlcyBhdmFpbGFibGUgYnVmZmVycyBmcm9tIHJ4X2ZyZWUgaW50byBSeAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHVwZGF0ZXMgZmlybXdhcmUgcG9pbnRlcnMsIGFuZCB1cGRhdGVzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgV1JJVEUgaW5kZXguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaXdsMzk0NV9yeF9yZXBsZW5pc2gKLSAqCi0gKiAtLSBlbmFibGUgaW50ZXJydXB0cyAtLQotICogSVNSIC0gaXdsMzk0NV9yeCgpICAgICAgICAgRGV0YWNoIGl3bF9yeF9tZW1fYnVmZmVycyBmcm9tIHBvb2wgdXAgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElOREVYLCBkZXRhY2hpbmcgdGhlIFNLQiBmcm9tIHRoZSBwb29sLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZXMgdGhlIHBhY2tldCBidWZmZXIgZnJvbSBxdWV1ZSB0byByeF91c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbHMgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIHRvIHJlZmlsbCBhbnkgZW1wdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzLgotICogLi4uCi0gKgotICovCi0KLS8qKgotICogaXdsMzk0NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19sZTMyIGl3bDM5NDVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMilkbWFfYWRkcik7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrIC0gcmVmaWxsIFJYIHF1ZXVlIGZyb20gcHJlLWFsbG9jYXRlZCBwb29sCi0gKgotICogSWYgdGhlcmUgYXJlIHNsb3RzIGluIHRoZSBSWCBxdWV1ZSB0aGF0IG5lZWQgdG8gYmUgcmVzdG9ja2VkLAotICogYW5kIHdlIGhhdmUgZnJlZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcnMsIGZpbGwgdGhlIHJhbmtzIGFzIG11Y2gKLSAqIGFzIHdlIGNhbiwgcHVsbGluZyBmcm9tIHJ4X2ZyZWUuCi0gKgotICogVGhpcyBtb3ZlcyB0aGUgJ3dyaXRlJyBpbmRleCBmb3J3YXJkIHRvIGNhdGNoIHVwIHdpdGggJ3Byb2Nlc3NlZCcsIGFuZAotICogYWxzbyB1cGRhdGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBpbiB0aGUgZmlybXdhcmUgdG8gcmVmZXJlbmNlIHRoZSBuZXcKLSAqIHRhcmdldCBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHdyaXRlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCXdyaXRlID0gcnhxLT53cml0ZSAmIH4weDc7Ci0Jd2hpbGUgKChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBHZXQgbmV4dCBmcmVlIFJ4IGJ1ZmZlciwgcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCi0JCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKLQkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIsIGxpc3QpOwotCQlsaXN0X2RlbChlbGVtZW50KTsKLQotCQkvKiBQb2ludCB0byBSeCBidWZmZXIgdmlhIG5leHQgUkJEIGluIGNpcmN1bGFyIGJ1ZmZlciAqLwotCQlyeHEtPmJkW3J4cS0+d3JpdGVdID0gaXdsMzk0NV9kbWFfYWRkcjJyYmRfcHRyKHByaXYsIHJ4Yi0+cGFnZV9kbWEpOwotCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOwotCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCXJ4cS0+ZnJlZV9jb3VudC0tOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCi0JICogcmVmaWxsIGl0ICovCi0JaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7Ci0KLQotCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgotCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLwotCWlmICgocnhxLT53cml0ZV9hY3R1YWwgIT0gKHJ4cS0+d3JpdGUgJiB+MHg3KSkKLQkgICAgfHwgKGFicyhyeHEtPndyaXRlIC0gcnhxLT5yZWFkKSA+IDcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgcnhxKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrLgotICogVGhpcyBpcyBjYWxsZWQgYXMgYSBzY2hlZHVsZWQgd29yayBpdGVtIChleGNlcHQgZm9yIGR1cmluZyBpbml0aWFsaXphdGlvbikKLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9hbGxvY2F0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGdmcF90IHByaW9yaXR5KQotewotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWdmcF90IGdmcF9tYXNrID0gcHJpb3JpdHk7Ci0KLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwotCi0JCWlmIChwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOwotCi0JCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCQlpZiAoIXBhZ2UpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyLlxuIik7Ci0JCQlpZiAoKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKSAmJgotCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKLQkJCQlJV0xfQ1JJVChwcml2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIgd2l0aCAlcy4gT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKLQkJCQkJIHByaW9yaXR5ID09IEdGUF9BVE9NSUMgPyAgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSQi9TS0IgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOwotCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJcHJpdi0+YWxsb2NfcnhiX3BhZ2UrKzsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLXZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKLQkvKiBGaWxsIHRoZSByeF91c2VkIHF1ZXVlIHdpdGggX2FsbF8gb2YgdGhlIFJ4IGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUlhfRlJFRV9CVUZGRVJTICsgUlhfUVVFVUVfU0laRTsgaSsrKSB7Ci0JCS8qIEluIHRoZSByZXNldCBmdW5jdGlvbiwgdGhlc2UgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZAotCQkgKiB0byBhbiBTS0IsIHNvIHdlIG5lZWQgdG8gdW5tYXAgYW5kIGZyZWUgcG90ZW50aWFsIHN0b3JhZ2UgKi8KLQkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKLQkJCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKLQkJCQlQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKLQkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKLQkJfQotCQlsaXN0X2FkZF90YWlsKCZyeHEtPnBvb2xbaV0ubGlzdCwgJnJ4cS0+cnhfdXNlZCk7Ci0JfQotCi0JLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCi0JICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCi0JcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7Ci0JcnhxLT53cml0ZV9hY3R1YWwgPSAwOwotCXJ4cS0+ZnJlZV9jb3VudCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpd2wzOTQ1X3J4X2FsbG9jYXRlKHByaXYsIEdGUF9LRVJORUwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGxlbmlzaF9ub3coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bDM5NDVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0FUT01JQyk7Ci0KLQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLQotLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCi0gKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXRzIFNLQiBzZXQgdG8gTlVMTAotICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCi0gKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTOyBpKyspIHsKLQkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKLQkJCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKLQkJCQlQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCV9faXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKLQkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKLQkJfQotCX0KLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAotCQkJICByeHEtPmJkX2RtYSk7Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpd2xfcmJfc3RhdHVzKSwKLQkJCSAgcnhxLT5yYl9zdHRzLCByeHEtPnJiX3N0dHNfZG1hKTsKLQlyeHEtPmJkID0gTlVMTDsKLQlyeHEtPnJiX3N0dHMgID0gTlVMTDsKLX0KLQotCi0vKiBDb252ZXJ0IGxpbmVhciBzaWduYWwtdG8tbm9pc2UgcmF0aW8gaW50byBkQiAqLwotc3RhdGljIHU4IHJhdGlvMmRCWzEwMF0gPSB7Ci0vKgkgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAqLwotCSAwLCAgMCwgIDYsIDEwLCAxMiwgMTQsIDE2LCAxNywgMTgsIDE5LCAvKiAwMCAtIDA5ICovCi0JMjAsIDIxLCAyMiwgMjIsIDIzLCAyMywgMjQsIDI1LCAyNiwgMjYsIC8qIDEwIC0gMTkgKi8KLQkyNiwgMjYsIDI2LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI5LCAyOSwgLyogMjAgLSAyOSAqLwotCTI5LCAzMCwgMzAsIDMwLCAzMSwgMzEsIDMxLCAzMSwgMzIsIDMyLCAvKiAzMCAtIDM5ICovCi0JMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsIDMzLCAzNCwgMzQsIC8qIDQwIC0gNDkgKi8KLQkzNCwgMzQsIDM0LCAzNCwgMzUsIDM1LCAzNSwgMzUsIDM1LCAzNSwgLyogNTAgLSA1OSAqLwotCTM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNywgMzcsIDM3LCAvKiA2MCAtIDY5ICovCi0JMzcsIDM3LCAzNywgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOCwgMzgsIC8qIDcwIC0gNzkgKi8KLQkzOCwgMzgsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDM5LCAzOSwgLyogODAgLSA4OSAqLwotCTM5LCAzOSwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDAsIDQwICAvKiA5MCAtIDk5ICovCi19OwotCi0vKiBDYWxjdWxhdGVzIGEgcmVsYXRpdmUgZEIgdmFsdWUgZnJvbSBhIHJhdGlvIG9mIGxpbmVhcgotICogICAoaS5lLiBub3QgZEIpIHNpZ25hbCBsZXZlbHMuCi0gKiBDb252ZXJzaW9uIGFzc3VtZXMgdGhhdCBsZXZlbHMgYXJlIHZvbHRhZ2VzICgyMCpsb2cpLCBub3QgcG93ZXJzICgxMCpsb2cpLiAqLwotaW50IGl3bDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pCi17Ci0JLyogMTAwMDoxIG9yIGhpZ2hlciBqdXN0IHJlcG9ydCBhcyA2MCBkQiAqLwotCWlmIChzaWdfcmF0aW8gPj0gMTAwMCkKLQkJcmV0dXJuIDYwOwotCi0JLyogMTAwOjEgb3IgaGlnaGVyLCBkaXZpZGUgYnkgMTAgYW5kIHVzZSB0YWJsZSwKLQkgKiAgIGFkZCAyMCBkQiB0byBtYWtlIHVwIGZvciBkaXZpZGUgYnkgMTAgKi8KLQlpZiAoc2lnX3JhdGlvID49IDEwMCkKLQkJcmV0dXJuIDIwICsgKGludClyYXRpbzJkQltzaWdfcmF0aW8vMTBdOwotCi0JLyogV2Ugc2hvdWxkbid0IHNlZSB0aGlzICovCi0JaWYgKHNpZ19yYXRpbyA8IDEpCi0JCXJldHVybiAwOwotCi0JLyogVXNlIHRhYmxlIGZvciByYXRpb3MgMToxIC0gOTk6MSAqLwotCXJldHVybiAoaW50KXJhdGlvMmRCW3NpZ19yYXRpb107Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9oYW5kbGUgLSBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20gdUNvZGUKLSAqCi0gKiBVc2VzIHRoZSBwcml2LT5yeF9oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKLSAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAotICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0JdTMyIHIsIGk7Ci0JaW50IHJlY2xhaW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBmaWxsX3J4ID0gMDsKLQl1MzIgY291bnQgPSA4OwotCWludCB0b3RhbF9lbXB0eSA9IDA7Ci0KLQkvKiB1Q29kZSdzIHJlYWQgaW5kZXggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4Ci0JICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KLQlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkY7Ci0JaSA9IHJ4cS0+cmVhZDsKLQotCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCi0JdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7Ci0JaWYgKHRvdGFsX2VtcHR5IDwgMCkKLQkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKLQotCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCi0JCWZpbGxfcnggPSAxOwotCS8qIFJ4IGludGVycnVwdCwgYnV0IG5vdGhpbmcgc2VudCBmcm9tIHVDb2RlICovCi0JaWYgKGkgPT0gcikKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7Ci0KLQl3aGlsZSAoaSAhPSByKSB7Ci0JCWludCBsZW47Ci0KLQkJcnhiID0gcnhxLT5xdWV1ZVtpXTsKLQotCQkvKiBJZiBhbiBSWEIgZG9lc24ndCBoYXZlIGEgUnggcXVldWUgc2xvdCBhc3NvY2lhdGVkIHdpdGggaXQsCi0JCSAqIHRoZW4gYSBidWcgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiB0aGUgcXVldWUgcmVmaWxsaW5nCi0JCSAqIHJvdXRpbmVzIC0tIGNhdGNoIGl0IGhlcmUgKi8KLQkJQlVHX09OKHJ4YiA9PSBOVUxMKTsKLQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeGItPnBhZ2VfZG1hLAotCQkJICAgICAgIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7Ci0JCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KLQkJdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3J4KHByaXYsIHBrdCwgbGVuKTsKLQotCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCi0JCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCi0JCSAqIElmIHRoZSBwYWNrZXQgKGUuZy4gUnggZnJhbWUpIG9yaWdpbmF0ZWQgZnJvbSB1Q29kZSwKLQkJICogICB0aGVyZSBpcyBubyBjb21tYW5kIGJ1ZmZlciB0byByZWNsYWltLgotCQkgKiBVY29kZSBzaG91bGQgc2V0IFNFUV9SWF9GUkFNRSBiaXQgaWYgdWNvZGUtb3JpZ2luYXRlZCwKLQkJICogICBidXQgYXBwYXJlbnRseSBhIGZldyBkb24ndCBnZXQgc2V0OyBjYXRjaCB0aGVtIGhlcmUuICovCi0JCXJlY2xhaW0gPSAhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX1JYX0ZSQU1FKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBTVEFUSVNUSUNTX05PVElGSUNBVElPTikgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfVFgpOwotCi0JCS8qIEJhc2VkIG9uIHR5cGUgb2YgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24sCi0JCSAqICAgaGFuZGxlIHRob3NlIHRoYXQgbmVlZCBoYW5kbGluZyB2aWEgZnVuY3Rpb24gaW4KLQkJICogICByeF9oYW5kbGVycyB0YWJsZS4gIFNlZSBpd2wzOTQ1X3NldHVwX3J4X2hhbmRsZXJzKCkgKi8KLQkJaWYgKHByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0pIHsKLQkJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsIGksCi0JCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7Ci0JCQlwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOwotCQkJcHJpdi0+cnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSAocHJpdiwgcnhiKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vIGhhbmRsaW5nIG5lZWRlZCAqLwotCQkJSVdMX0RFQlVHX1JYKHByaXYsCi0JCQkJInIgJWQgaSAlZCBObyBoYW5kbGVyIG5lZWRlZCBmb3IgJXMsIDB4JTAyeFxuIiwKLQkJCQlyLCBpLCBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksCi0JCQkJcGt0LT5oZHIuY21kKTsKLQkJfQotCi0JCS8qCi0JCSAqIFhYWDogQWZ0ZXIgaGVyZSwgd2Ugc2hvdWxkIGFsd2F5cyBjaGVjayByeGItPnBhZ2UKLQkJICogYWdhaW5zdCBOVUxMIGJlZm9yZSB0b3VjaGluZyBpdCBvciBpdHMgdmlydHVhbAotCQkgKiBtZW1vcnkgKHBrdCkuIEJlY2F1c2Ugc29tZSByeF9oYW5kbGVyIG1pZ2h0IGhhdmUKLQkJICogYWxyZWFkeSB0YWtlbiBvciBmcmVlZCB0aGUgcGFnZXMuCi0JCSAqLwotCi0JCWlmIChyZWNsYWltKSB7Ci0JCQkvKiBJbnZva2UgYW55IGNhbGxiYWNrcywgdHJhbnNmZXIgdGhlIGJ1ZmZlciB0byBjYWxsZXIsCi0JCQkgKiBhbmQgZmlyZSBvZmYgdGhlIChwb3NzaWJseSkgYmxvY2tpbmcgaXdsX2xlZ2FjeV9zZW5kX2NtZCgpCi0JCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLwotCQkJaWYgKHJ4Yi0+cGFnZSkKLQkJCQlpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZShwcml2LCByeGIpOwotCQkJZWxzZQotCQkJCUlXTF9XQVJOKHByaXYsICJDbGFpbSBudWxsIHJ4Yj9cbiIpOwotCQl9Ci0KLQkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKLQkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCi0JCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7Ci0JCQlyeGItPnBhZ2VfZG1hID0gcGNpX21hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwKLQkJCQkwLCBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCi0JCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbid0IGFzc2VydC4gKi8KLQkJaWYgKGZpbGxfcngpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZiAoY291bnQgPj0gOCkgewotCQkJCXJ4cS0+cmVhZCA9IGk7Ci0JCQkJaXdsMzk0NV9yeF9yZXBsZW5pc2hfbm93KHByaXYpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KLQlyeHEtPnJlYWQgPSBpOwotCWlmIChmaWxsX3J4KQotCQlpd2wzOTQ1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JZWxzZQotCQlpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLS8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2wzOTQ1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KLQlzeW5jaHJvbml6ZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxKTsKLQl0YXNrbGV0X2tpbGwoJnByaXYtPmlycV90YXNrbGV0KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKml3bDM5NDVfZGVzY19sb29rdXAoaW50IGkpCi17Ci0Jc3dpdGNoIChpKSB7Ci0JY2FzZSAxOgotCQlyZXR1cm4gIkZBSUwiOwotCWNhc2UgMjoKLQkJcmV0dXJuICJCQURfUEFSQU0iOwotCWNhc2UgMzoKLQkJcmV0dXJuICJCQURfQ0hFQ0tTVU0iOwotCWNhc2UgNDoKLQkJcmV0dXJuICJOTUlfSU5URVJSVVBUIjsKLQljYXNlIDU6Ci0JCXJldHVybiAiU1lTQVNTRVJUIjsKLQljYXNlIDY6Ci0JCXJldHVybiAiRkFUQUxfRVJST1IiOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLSNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQotI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCi0KLXZvaWQgaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBpOwotCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7Ci0JdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKLQotCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0KLQlpZiAoIWl3bDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlJV0xfRVJSKHByaXYsICJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYXG4iLCBiYXNlKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JY291bnQgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7Ci0KLQlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOwotCQlJV0xfRVJSKHByaXYsICJTdGF0dXM6IDB4JTA4bFgsIGNvdW50OiAlZFxuIiwKLQkJCXByaXYtPnN0YXR1cywgY291bnQpOwotCX0KLQotCUlXTF9FUlIocHJpdiwgIkRlc2MgICAgICAgVGltZSAgICAgICBhc3J0UEMgIGJsaW5rMiAiCi0JCSAgImlsaW5rMSAgbm1pUEMgICBMaW5lXG4iKTsKLQlmb3IgKGkgPSBFUlJPUl9TVEFSVF9PRkZTRVQ7Ci0JICAgICBpIDwgKGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSArIEVSUk9SX1NUQVJUX09GRlNFVDsKLQkgICAgIGkgKz0gRVJST1JfRUxFTV9TSVpFKSB7Ci0JCWRlc2MgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkpOwotCQl0aW1lID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDEgKiBzaXplb2YodTMyKSk7Ci0JCWJsaW5rMSA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyAyICogc2l6ZW9mKHUzMikpOwotCQlibGluazIgPQotCQkgICAgaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyBpICsgMyAqIHNpemVvZih1MzIpKTsKLQkJaWxpbmsxID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDQgKiBzaXplb2YodTMyKSk7Ci0JCWlsaW5rMiA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyA1ICogc2l6ZW9mKHUzMikpOwotCQlkYXRhMSA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyA2ICogc2l6ZW9mKHUzMikpOwotCi0JCUlXTF9FUlIocHJpdiwKLQkJCSIlLTEzcyAoMHglWCkgJTAxMHUgMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYICV1XG5cbiIsCi0JCQlpd2wzOTQ1X2Rlc2NfbG9va3VwKGRlc2MpLCBkZXNjLCB0aW1lLCBibGluazEsIGJsaW5rMiwKLQkJCWlsaW5rMSwgaWxpbmsyLCBkYXRhMSk7Ci0JCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvcihwcml2LCBkZXNjLCB0aW1lLCBkYXRhMSwgMCwKLQkJCQkJMCwgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaXJxX3Rhc2tsZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBpbnRhLCBoYW5kbGVkID0gMDsKLQl1MzIgaW50YV9maDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXUzMiBpbnRhX21hc2s7Ci0jZW5kaWYKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyB1Q29kZSBpbnRlcnJ1cHRzLgotCSAqIE5vdGU6ICBTb21lIGJpdHMgaW4gQ1NSX0lOVCBhcmUgIk9SIiBvZiBiaXRzIGluIENTUl9GSF9JTlRfU1RBVFVTLAotCSAqICBhbmQgd2lsbCBjbGVhciBvbmx5IHdoZW4gQ1NSX0ZIX0lOVF9TVEFUVVMgZ2V0cyBjbGVhcmVkLiAqLwotCWludGEgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlQpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIGludGEpOwotCi0JLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgZmxvdy1oYW5kbGVyIChETUEpIGludGVycnVwdHMuCi0JICogQW55IG5ldyBpbnRlcnJ1cHRzIHRoYXQgaGFwcGVuIGFmdGVyIHRoaXMsIGVpdGhlciB3aGlsZSB3ZSdyZQotCSAqIGluIHRoaXMgdGFza2xldCwgb3IgbGF0ZXIsIHdpbGwgc2hvdyB1cCBpbiBuZXh0IElTUi90YXNrbGV0LiAqLwotCWludGFfZmggPSBpd2xfcmVhZDMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgaW50YV9maCk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiBJV0xfRExfSVNSKSB7Ci0JCS8qIGp1c3QgZm9yIGRlYnVnICovCi0JCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHhcbiIsCi0JCQkgICAgICBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgpOwotCX0KLSNlbmRpZgotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogU2luY2UgQ1NSX0lOVCBhbmQgQ1NSX0ZIX0lOVF9TVEFUVVMgcmVhZHMgYW5kIGNsZWFycyBhcmUgbm90Ci0JICogYXRvbWljLCBtYWtlIHN1cmUgdGhhdCBpbnRhIGNvdmVycyBhbGwgdGhlIGludGVycnVwdHMgdGhhdAotCSAqIHdlJ3ZlIGRpc2NvdmVyZWQsIGV2ZW4gaWYgRkggaW50ZXJydXB0IGNhbWUgaW4ganVzdCBhZnRlcgotCSAqIHJlYWRpbmcgQ1NSX0lOVC4gKi8KLQlpZiAoaW50YV9maCAmIENTUjM5X0ZIX0lOVF9SWF9NQVNLKQotCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1JYOwotCWlmIChpbnRhX2ZoICYgQ1NSMzlfRkhfSU5UX1RYX01BU0spCi0JCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7Ci0KLQkvKiBOb3cgc2VydmljZSBhbGwgaW50ZXJydXB0IGJpdHMgZGlzY292ZXJlZCBhYm92ZS4gKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0hXX0VSUikgewotCQlJV0xfRVJSKHByaXYsICJIYXJkd2FyZSBlcnJvciBkZXRlY3RlZC4gIFJlc3RhcnRpbmcuXG4iKTsKLQotCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQkJaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkJcHJpdi0+aXNyX3N0YXRzLmh3Kys7Ci0JCWl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihwcml2KTsKLQotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0hXX0VSUjsKLQotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgKElXTF9ETF9JU1IpKSB7Ci0JCS8qIE5JQyBmaXJlcyB0aGlzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LCByZWR1bmRhbnQgd2l0aCBXQUtFVVAgKi8KLQkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TQ0QpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIlNjaGVkdWxlciBmaW5pc2hlZCB0byB0cmFuc21pdCAiCi0JCQkJICAgICAgInRoZSBmcmFtZS9mcmFtZXMuXG4iKTsKLQkJCXByaXYtPmlzcl9zdGF0cy5zY2grKzsKLQkJfQotCi0JCS8qIEFsaXZlIG5vdGlmaWNhdGlvbiB2aWEgUnggaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlYWwgd29yayAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0FMSVZFKSB7Ci0JCQlJV0xfREVCVUdfSVNSKHByaXYsICJBbGl2ZSBpbnRlcnJ1cHRcbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLmFsaXZlKys7Ci0JCX0KLQl9Ci0jZW5kaWYKLQkvKiBTYWZlbHkgaWdub3JlIHRoZXNlIGJpdHMgZm9yIGRlYnVnIGNoZWNrcyBiZWxvdyAqLwotCWludGEgJj0gfihDU1JfSU5UX0JJVF9TQ0QgfCBDU1JfSU5UX0JJVF9BTElWRSk7Ci0KLQkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgotCQkJIlJlc3RhcnRpbmcgMHglWC5cbiIsIGludGEpOwotCQlwcml2LT5pc3Jfc3RhdHMuc3crKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKLQl9Ci0KLQkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiV2FrZXVwIGludGVycnVwdFxuIik7Ci0JCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+cnhxKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzBdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzFdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzJdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzNdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzRdKTsKLQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxWzVdKTsKLQotCQlwcml2LT5pc3Jfc3RhdHMud2FrZXVwKys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOwotCX0KLQotCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAotCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKLQkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLwotCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7Ci0JCWl3bDM5NDVfcnhfaGFuZGxlKHByaXYpOwotCQlwcml2LT5pc3Jfc3RhdHMucngrKzsKLQkJaGFuZGxlZCB8PSAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCk7Ci0JfQotCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJUeCBpbnRlcnJ1cHRcbiIpOwotCQlwcml2LT5pc3Jfc3RhdHMudHgrKzsKLQotCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUywgKDEgPDwgNikpOwotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVENTUl9DUkVESVQKLQkJCQkJKEZIMzlfU1JWQ19DSE5MKSwgMHgwKTsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKLQl9Ci0KLQlpZiAoaW50YSAmIH5oYW5kbGVkKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOwotCQlwcml2LT5pc3Jfc3RhdHMudW5oYW5kbGVkKys7Ci0JfQotCi0JaWYgKGludGEgJiB+cHJpdi0+aW50YV9tYXNrKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKLQkJCSBpbnRhICYgfnByaXYtPmludGFfbWFzayk7Ci0JCUlXTF9XQVJOKHByaXYsICIgICB3aXRoIEZIX0lOVCA9IDB4JTA4eFxuIiwgaW50YV9maCk7Ci0JfQotCi0JLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpCi0JCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JCWludGFfbWFzayA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVF9NQVNLKTsKLQkJaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKLQkJCSJmbGFncyAweCUwOGx4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgsIGZsYWdzKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkJICAgICB1OCBpc19hY3RpdmUsIHU4IG5fcHJvYmVzLAotCQkJCSAgICAgc3RydWN0IGl3bDM5NDVfc2Nhbl9jaGFubmVsICpzY2FuX2NoLAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTE2IHBhc3NpdmVfZHdlbGwgPSAwOwotCXUxNiBhY3RpdmVfZHdlbGwgPSAwOwotCWludCBhZGRlZCwgaTsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpCi0JCXJldHVybiAwOwotCi0JYWN0aXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQljaGFuID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJc2Nhbl9jaC0+Y2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOwotCi0JCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgYmFuZCwKLQkJCQkJCQlzY2FuX2NoLT5jaGFubmVsKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJIkNoYW5uZWwgJWQgaXMgSU5WQUxJRCBmb3IgdGhpcyBiYW5kLlxuIiwKLQkJCSAgICAgICBzY2FuX2NoLT5jaGFubmVsKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCQkvKiBJZiBwYXNzaXZlICwgc2V0IHVwIGZvciBhdXRvLXN3aXRjaAotCQkgKiAgYW5kIHVzZSBsb25nIGFjdGl2ZV9kd2VsbCB0aW1lLgotCQkgKi8KLQkJaWYgKCFpc19hY3RpdmUgfHwgaXdsX2xlZ2FjeV9pc19jaGFubmVsX3Bhc3NpdmUoY2hfaW5mbykgfHwKLQkJICAgIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikpIHsKLQkJCXNjYW5fY2gtPnR5cGUgPSAwOwkvKiBwYXNzaXZlICovCi0JCQlpZiAoSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpID09IDEpCi0JCQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCAtIDEpOwotCQl9IGVsc2UgewotCQkJc2Nhbl9jaC0+dHlwZSA9IDE7CS8qIGFjdGl2ZSAqLwotCQl9Ci0KLQkJLyogU2V0IGRpcmVjdCBwcm9iZSBiaXRzLiBUaGVzZSBtYXkgYmUgdXNlZCBib3RoIGZvciBhY3RpdmUKLQkJICogc2NhbiBjaGFubmVscyAocHJvYmVzIGdldHMgc2VudCByaWdodCBhd2F5KSwKLQkJICogb3IgZm9yIHBhc3NpdmUgY2hhbm5lbHMgKHByb2JlcyBnZXQgc2Ugc2VudCBvbmx5IGFmdGVyCi0JCSAqIGhlYXJpbmcgY2xlYXIgUnggcGFja2V0KS4qLwotCQlpZiAoSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpID49IDIpIHsKLQkJCWlmIChuX3Byb2JlcykKLQkJCQlzY2FuX2NoLT50eXBlIHw9IElXTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB1Q29kZSB2MSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGRpcmVjdCBwcm9iZSBiaXRzIG9uCi0JCQkgKiBwYXNzaXZlIGNoYW5uZWwuICovCi0JCQlpZiAoKHNjYW5fY2gtPnR5cGUgJiAxKSAmJiBuX3Byb2JlcykKLQkJCQlzY2FuX2NoLT50eXBlIHw9IElXTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0JCX0KLQotCQkvKiBTZXQgdHhwb3dlciBsZXZlbHMgdG8gZGVmYXVsdHMgKi8KLQkJc2Nhbl9jaC0+dHBjLmRzcF9hdHRlbiA9IDExMDsKLQkJLyogc2Nhbl9wd3JfaW5mby0+dHBjLmRzcF9hdHRlbjsgKi8KLQotCQkvKnNjYW5fcHdyX2luZm8tPnRwYy50eF9nYWluOyAqLwotCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwotCQllbHNlIHsKLQkJCXNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwotCQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKLQkJCSAqIHBvd2VyIGxldmVsOgotCQkJICogc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwotCQkJICovCi0JCX0KLQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2Nhbm5pbmcgJWQgWyVzICVkXVxuIiwKLQkJCSAgICAgICBzY2FuX2NoLT5jaGFubmVsLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgMSkgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIiwKLQkJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIDEpID8KLQkJCSAgICAgICBhY3RpdmVfZHdlbGwgOiBwYXNzaXZlX2R3ZWxsKTsKLQotCQlzY2FuX2NoKys7Ci0JCWFkZGVkKys7Ci0JfQotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgInRvdGFsIGNoYW5uZWxzIHRvIHNjYW4gJWRcbiIsIGFkZGVkKTsKLQlyZXR1cm4gYWRkZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaW5pdF9od19yYXRlcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UX0xFR0FDWTsgaSsrKSB7Ci0JCXJhdGVzW2ldLmJpdHJhdGUgPSBpd2wzOTQ1X3JhdGVzW2ldLmllZWUgKiA1OwotCQlyYXRlc1tpXS5od192YWx1ZSA9IGk7IC8qIFJhdGUgc2NhbGluZyB3aWxsIHdvcmsgb24gaW5kZXhlcyAqLwotCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7Ci0JCXJhdGVzW2ldLmZsYWdzID0gMDsKLQkJaWYgKChpID4gSVdMMzlfTEFTVF9PRkRNX1JBVEUpIHx8IChpIDwgSVdMX0ZJUlNUX09GRE1fUkFURSkpIHsKLQkJCS8qCi0JCQkgKiBJZiBDQ0sgIT0gMU0gdGhlbiBzZXQgc2hvcnQgcHJlYW1ibGUgcmF0ZSBmbGFnLgotCQkJICovCi0JCQlyYXRlc1tpXS5mbGFncyB8PSAoaXdsMzk0NV9yYXRlc1tpXS5wbGNwID09IDEwKSA/Ci0JCQkJMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOwotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2NvZGUpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXApOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X2luc3RfZnVsbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIF9fbGUzMiAqaW1hZ2UsIHUzMiBsZW4pCi17Ci0JdTMyIHZhbDsKLQl1MzIgc2F2ZV9sZW4gPSBsZW47Ci0JaW50IHJjID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCSAgICAgICBJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0KLQllcnJjbnQgPSAwOwotCWZvciAoOyBsZW4gPiAwOyBsZW4gLT0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCi0JCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZwotCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCi0JCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCi0JCQkJICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCSAgc2F2ZV9sZW4gLSBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0JCQlyYyA9IC1FSU87Ci0JCQllcnJjbnQrKzsKLQkJCWlmIChlcnJjbnQgPj0gMjApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQotCWlmICghZXJyY250KQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKLQotCXJldHVybiByYzsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIF9fbGUzMiAqaW1hZ2UsIHUzMiBsZW4pCi17Ci0JdTMyIHZhbDsKLQlpbnQgcmMgPSAwOwotCXUzMiBlcnJjbnQgPSAwOwotCXUzMiBpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAvc2l6ZW9mKHUzMikpIHsKLQkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCi0JCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZwotCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCi0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCWkgKyBJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JCXZhbCA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0jaWYgMCAvKiBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0byBzZWUgZGV0YWlscyAqLwotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgotCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKLQkJCQkgIGksIHZhbCwgKmltYWdlKTsKLSNlbmRpZgotCQkJcmMgPSAtRUlPOwotCQkJZXJyY250Kys7Ci0JCQlpZiAoZXJyY250ID49IDMpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAotICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByYyA9IDA7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmMgPSBpd2wzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShwcml2LCBpbWFnZSwgbGVuKTsKLQlpZiAocmMgPT0gMCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQm9vdHN0cmFwIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJ5IGluaXRpYWxpemUgKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9pbml0LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmIChyYyA9PSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9jb2RlLnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9jb2RlLmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmIChyYyA9PSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3RfZnVsbChwcml2LCBpbWFnZSwgbGVuKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9uaWNfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCAwKTsKLX0KLQotI2RlZmluZSBJV0wzOTQ1X1VDT0RFX0dFVChpdGVtKQkJCQkJCVwKLXN0YXRpYyB1MzIgaXdsMzk0NV91Y29kZV9nZXRfIyNpdGVtKGNvbnN0IHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICp1Y29kZSlcCi17CQkJCQkJCQkJXAotCXJldHVybiBsZTMyX3RvX2NwdSh1Y29kZS0+djEuaXRlbSk7CQkJCVwKLX0KLQotc3RhdGljIHUzMiBpd2wzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZSh1MzIgYXBpX3ZlcikKLXsKLQlyZXR1cm4gMjQ7Ci19Ci0KLXN0YXRpYyB1OCAqaXdsMzk0NV91Y29kZV9nZXRfZGF0YShjb25zdCBzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGUpCi17Ci0JcmV0dXJuICh1OCAqKSB1Y29kZS0+djEuZGF0YTsKLX0KLQotSVdMMzk0NV9VQ09ERV9HRVQoaW5zdF9zaXplKTsKLUlXTDM5NDVfVUNPREVfR0VUKGRhdGFfc2l6ZSk7Ci1JV0wzOTQ1X1VDT0RFX0dFVChpbml0X3NpemUpOwotSVdMMzk0NV9VQ09ERV9HRVQoaW5pdF9kYXRhX3NpemUpOwotSVdMMzk0NV9VQ09ERV9HRVQoYm9vdF9zaXplKTsKLQotLyoqCi0gKiBpd2wzOTQ1X3JlYWRfdWNvZGUgLSBSZWFkIHVDb2RlIGltYWdlcyBmcm9tIGRpc2sgZmlsZS4KLSAqCi0gKiBDb3B5IGludG8gYnVmZmVycyBmb3IgY2FyZCB0byBmZXRjaCB2aWEgYnVzLW1hc3RlcmluZwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfcmVhZF91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKnVjb2RlOwotCWludCByZXQgPSAtRUlOVkFMLCBpbmRleDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdzsKLQkvKiBmaXJtd2FyZSBmaWxlIG5hbWUgY29udGFpbnMgdUNvZGUvZHJpdmVyIGNvbXBhdGliaWxpdHkgdmVyc2lvbiAqLwotCWNvbnN0IGNoYXIgKm5hbWVfcHJlID0gcHJpdi0+Y2ZnLT5md19uYW1lX3ByZTsKLQljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21heCA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21heDsKLQljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21pbiA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21pbjsKLQljaGFyIGJ1ZlsyNV07Ci0JdTggKnNyYzsKLQlzaXplX3QgbGVuOwotCXUzMiBhcGlfdmVyLCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOwotCi0JLyogQXNrIGtlcm5lbCBmaXJtd2FyZV9jbGFzcyBtb2R1bGUgdG8gZ2V0IHRoZSBib290IGZpcm13YXJlIG9mZiBkaXNrLgotCSAqIHJlcXVlc3RfZmlybXdhcmUoKSBpcyBzeW5jaHJvbm91cywgZmlsZSBpcyBpbiBtZW1vcnkgb24gcmV0dXJuLiAqLwotCWZvciAoaW5kZXggPSBhcGlfbWF4OyBpbmRleCA+PSBhcGlfbWluOyBpbmRleC0tKSB7Ci0JCXNwcmludGYoYnVmLCAiJXMldSVzIiwgbmFtZV9wcmUsIGluZGV4LCAiLnVjb2RlIik7Ci0JCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnVjb2RlX3JhdywgYnVmLCAmcHJpdi0+cGNpX2Rldi0+ZGV2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCUlXTF9FUlIocHJpdiwgIiVzIGZpcm13YXJlIGZpbGUgcmVxIGZhaWxlZDogJWRcbiIsCi0JCQkJICBidWYsIHJldCk7Ci0JCQlpZiAocmV0ID09IC1FTk9FTlQpCi0JCQkJY29udGludWU7Ci0JCQllbHNlCi0JCQkJZ290byBlcnJvcjsKLQkJfSBlbHNlIHsKLQkJCWlmIChpbmRleCA8IGFwaV9tYXgpCi0JCQkJSVdMX0VSUihwcml2LCAiTG9hZGVkIGZpcm13YXJlICVzLCAiCi0JCQkJCSJ3aGljaCBpcyBkZXByZWNhdGVkLiAiCi0JCQkJCSIgUGxlYXNlIHVzZSBBUEkgdiV1IGluc3RlYWQuXG4iLAotCQkJCQkgIGJ1ZiwgYXBpX21heCk7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiR290IGZpcm13YXJlICclcycgZmlsZSAiCi0JCQkJICAgICAgICIoJXpkIGJ5dGVzKSBmcm9tIGRpc2tcbiIsCi0JCQkJICAgICAgIGJ1ZiwgdWNvZGVfcmF3LT5zaXplKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgYXQgbGVhc3Qgb3VyIGhlYWRlciEgKi8KLQlpZiAodWNvZGVfcmF3LT5zaXplIDwgIGl3bDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKDEpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCi0JLyogRGF0YSBmcm9tIHVjb2RlIGZpbGU6ICBoZWFkZXIgZm9sbG93ZWQgYnkgdUNvZGUgaW1hZ2VzICovCi0JdWNvZGUgPSAoc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7Ci0KLQlwcml2LT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKLQlhcGlfdmVyID0gSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpOwotCWluc3Rfc2l6ZSA9IGl3bDM5NDVfdWNvZGVfZ2V0X2luc3Rfc2l6ZSh1Y29kZSk7Ci0JZGF0YV9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfZGF0YV9zaXplKHVjb2RlKTsKLQlpbml0X3NpemUgPSBpd2wzOTQ1X3Vjb2RlX2dldF9pbml0X3NpemUodWNvZGUpOwotCWluaXRfZGF0YV9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfaW5pdF9kYXRhX3NpemUodWNvZGUpOwotCWJvb3Rfc2l6ZSA9IGl3bDM5NDVfdWNvZGVfZ2V0X2Jvb3Rfc2l6ZSh1Y29kZSk7Ci0Jc3JjID0gaXdsMzk0NV91Y29kZV9nZXRfZGF0YSh1Y29kZSk7Ci0KLQkvKiBhcGlfdmVyIHNob3VsZCBtYXRjaCB0aGUgYXBpIHZlcnNpb24gZm9ybWluZyBwYXJ0IG9mIHRoZQotCSAqIGZpcm13YXJlIGZpbGVuYW1lIC4uLiBidXQgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoYXQgYW5kIG9ubHkgcmVseQotCSAqIG9uIHRoZSBBUEkgdmVyc2lvbiByZWFkIGZyb20gZmlybXdhcmUgaGVhZGVyIGZyb20gaGVyZSBvbiBmb3J3YXJkICovCi0KLQlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKLQkJSVdMX0VSUihwcml2LCAiRHJpdmVyIHVuYWJsZSB0byBzdXBwb3J0IHlvdXIgZmlybXdhcmUgQVBJLiAiCi0JCQkgICJEcml2ZXIgc3VwcG9ydHMgdiV1LCBmaXJtd2FyZSBpcyB2JXUuXG4iLAotCQkJICBhcGlfbWF4LCBhcGlfdmVyKTsKLQkJcHJpdi0+dWNvZGVfdmVyID0gMDsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0JaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKLQkJSVdMX0VSUihwcml2LCAiRmlybXdhcmUgaGFzIG9sZCBBUEkgdmVyc2lvbi4gRXhwZWN0ZWQgJXUsICIKLQkJCSAgImdvdCAldS4gTmV3IGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCAiCi0JCQkgICJmcm9tIGh0dHA6Ly93d3cuaW50ZWxsaW51eHdpcmVsZXNzLm9yZy5cbiIsCi0JCQkgIGFwaV9tYXgsIGFwaV92ZXIpOwotCi0JSVdMX0lORk8ocHJpdiwgImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAotCQlJV0xfVUNPREVfTUFKT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJSVdMX1VDT0RFX01JTk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCUlXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSwKLQkJSVdMX1VDT0RFX1NFUklBTChwcml2LT51Y29kZV92ZXIpKTsKLQotCXNucHJpbnRmKHByaXYtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiwKLQkJIHNpemVvZihwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pLAotCQkgIiV1LiV1LiV1LiV1IiwKLQkJIElXTF9VQ09ERV9NQUpPUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX01JTk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfU0VSSUFMKHByaXYtPnVjb2RlX3ZlcikpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsCi0JCSAgICAgICBwcml2LT51Y29kZV92ZXIpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBpbnN0IHNpemUgPSAldVxuIiwKLQkJICAgICAgIGluc3Rfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICV1XG4iLAotCQkgICAgICAgZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGluaXQgaW5zdCBzaXplID0gJXVcbiIsCi0JCSAgICAgICBpbml0X3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBkYXRhIHNpemUgPSAldVxuIiwKLQkJICAgICAgIGluaXRfZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJXVcbiIsCi0JCSAgICAgICBib290X3NpemUpOwotCi0KLQkvKiBWZXJpZnkgc2l6ZSBvZiBmaWxlIHZzLiBpbWFnZSBzaXplIGluZm8gaW4gZmlsZSdzIGhlYWRlciAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgIT0gaXdsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUoYXBpX3ZlcikgKwotCQlpbnN0X3NpemUgKyBkYXRhX3NpemUgKyBpbml0X3NpemUgKwotCQlpbml0X2RhdGFfc2l6ZSArIGJvb3Rfc2l6ZSkgewotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkidUNvZGUgZmlsZSBzaXplICV6ZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzaXplXG4iLAotCQkJdWNvZGVfcmF3LT5zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KLQlpZiAoaW5zdF9zaXplID4gSVdMMzlfTUFYX0lOU1RfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQkgICAgICAgaW5zdF9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQlpZiAoZGF0YV9zaXplID4gSVdMMzlfTUFYX0RBVEFfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgZGF0YSBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCSAgICAgICBkYXRhX3NpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQlpZiAoaW5pdF9zaXplID4gSVdMMzlfTUFYX0lOU1RfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJ1Q29kZSBpbml0IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWluaXRfc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCWlmIChpbml0X2RhdGFfc2l6ZSA+IElXTDM5X01BWF9EQVRBX1NJWkUpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkidUNvZGUgaW5pdCBkYXRhIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWluaXRfZGF0YV9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0JaWYgKGJvb3Rfc2l6ZSA+IElXTDM5X01BWF9CU01fU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJ1Q29kZSBib290IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJCWJvb3Rfc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCi0JLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgotCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCi0JICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCi0JcHJpdi0+dWNvZGVfY29kZS5sZW4gPSBpbnN0X3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9jb2RlKTsKLQotCXByaXYtPnVjb2RlX2RhdGEubGVuID0gZGF0YV9zaXplOwotCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YSk7Ci0KLQlwcml2LT51Y29kZV9kYXRhX2JhY2t1cC5sZW4gPSBkYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFwcml2LT51Y29kZV9kYXRhLnZfYWRkciB8fAotCSAgICAhcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQotCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KLQlpZiAoaW5pdF9zaXplICYmIGluaXRfZGF0YV9zaXplKSB7Ci0JCXByaXYtPnVjb2RlX2luaXQubGVuID0gaW5pdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCi0JCXByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW4gPSBpbml0X2RhdGFfc2l6ZTsKLQkJaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0X2RhdGEpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogQm9vdHN0cmFwIChpbnN0cnVjdGlvbnMgb25seSwgbm8gZGF0YSkgKi8KLQlpZiAoYm9vdF9zaXplKSB7Ci0JCXByaXYtPnVjb2RlX2Jvb3QubGVuID0gYm9vdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2Jvb3QpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfYm9vdC52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogQ29weSBpbWFnZXMgaW50byBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciByZWFkcyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIChmaXJzdCBibG9jayBvZiBkYXRhIGluIGZpbGUpICovCi0JbGVuID0gaW5zdF9zaXplOwotCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGluc3RyIGxlbiAlemRcbiIsIGxlbik7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCBzcmMsIGxlbik7Ci0Jc3JjICs9IGxlbjsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKLQkJcHJpdi0+dWNvZGVfY29kZS52X2FkZHIsICh1MzIpcHJpdi0+dWNvZGVfY29kZS5wX2FkZHIpOwotCi0JLyogUnVudGltZSBkYXRhICgybmQgYmxvY2spCi0JICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpd2wzOTQ1X3VwKCkgICovCi0JbGVuID0gZGF0YV9zaXplOwotCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICV6ZFxuIiwgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfZGF0YS52X2FkZHIsIHNyYywgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBzcmMsIGxlbik7Ci0Jc3JjICs9IGxlbjsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAoM3JkIGJsb2NrKSAqLwotCWlmIChpbml0X3NpemUpIHsKLQkJbGVuID0gaW5pdF9zaXplOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJXpkXG4iLCBsZW4pOwotCQltZW1jcHkocHJpdi0+dWNvZGVfaW5pdC52X2FkZHIsIHNyYywgbGVuKTsKLQkJc3JjICs9IGxlbjsKLQl9Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBkYXRhICg0dGggYmxvY2spICovCi0JaWYgKGluaXRfZGF0YV9zaXplKSB7Ci0JCWxlbiA9IGluaXRfZGF0YV9zaXplOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBkYXRhIGxlbiAlemRcbiIsIGxlbik7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyLCBzcmMsIGxlbik7Ci0JCXNyYyArPSBsZW47Ci0JfQotCi0JLyogQm9vdHN0cmFwIGluc3RydWN0aW9ucyAoNXRoIGJsb2NrKSAqLwotCWxlbiA9IGJvb3Rfc2l6ZTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlemRcbiIsIGxlbik7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyLCBzcmMsIGxlbik7Ci0KLQkvKiBXZSBoYXZlIG91ciBjb3BpZXMgbm93LCBhbGxvdyBPUyByZWxlYXNlIGl0cyBjb3BpZXMgKi8KLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfcGNpX2FsbG9jOgotCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlyZXQgPSAtRU5PTUVNOwotCWl3bDM5NDVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0KLSBlcnJfcmVsZWFzZToKLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci0KLSBlcnJvcjoKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogaXdsMzk0NV9zZXRfdWNvZGVfcHRycyAtIFNldCB1Q29kZSBhZGRyZXNzIGxvY2F0aW9uCi0gKgotICogVGVsbCBpbml0aWFsaXphdGlvbiB1Q29kZSB3aGVyZSB0byBmaW5kIHJ1bnRpbWUgdUNvZGUuCi0gKgotICogQlNNIHJlZ2lzdGVycyBpbml0aWFsbHkgY29udGFpbiBwb2ludGVycyB0byBpbml0aWFsaXphdGlvbiB1Q29kZS4KLSAqIFdlIG5lZWQgdG8gcmVwbGFjZSB0aGVtIHRvIGxvYWQgcnVudGltZSB1Q29kZSBpbnN0IGFuZCBkYXRhLAotICogYW5kIHRvIHNhdmUgcnVudGltZSBkYXRhIHdoZW4gcG93ZXJpbmcgZG93bi4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3NldF91Y29kZV9wdHJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlkbWFfYWRkcl90IHBpbnN0OwotCWRtYV9hZGRyX3QgcGRhdGE7Ci0KLQkvKiBiaXRzIDMxOjAgZm9yIDM5NDUgKi8KLQlwaW5zdCA9IHByaXYtPnVjb2RlX2NvZGUucF9hZGRyOwotCXBkYXRhID0gcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyOwotCi0JLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCBpbWFnZSB0byBsb2FkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9kYXRhLmxlbik7Ci0KLQkvKiBJbnN0IGJ5dGUgY291bnQgbXVzdCBiZSBsYXN0IHRvIHNldCB1cCwgYml0IDMxIHNpZ25hbHMgdUNvZGUKLQkgKiAgIHRoYXQgYWxsIG5ldyBwdHIvc2l6ZSBpbmZvIGlzIGluIHBsYWNlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywKLQkJCQkgcHJpdi0+dWNvZGVfY29kZS5sZW4gfCBCU01fRFJBTV9JTlNUX0xPQUQpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9pbml0X2FsaXZlX3N0YXJ0IC0gQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICoKLSAqIENhbGxlZCBhZnRlciBSRVBMWV9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQgZnJvbSAiaW5pdGlhbGl6ZSIgdUNvZGUuCi0gKgotICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogQ2hlY2sgYWxpdmUgcmVzcG9uc2UgZm9yICJ2YWxpZCIgc2lnbiBmcm9tIHVDb2RlICovCi0JaWYgKHByaXYtPmNhcmRfYWxpdmVfaW5pdC5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgewotCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0Ci0JCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXplIEFsaXZlIGZhaWxlZC5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JLyogQm9vdHN0cmFwIHVDb2RlIGhhcyBsb2FkZWQgaW5pdGlhbGl6ZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAiaW5pdGlhbGl6ZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDM5NDVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgXCJpbml0aWFsaXplXCIgdUNvZGUgbG9hZC5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAotCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCi0JICogbm90aWZpY2F0aW9uLiAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCWlmIChpd2wzOTQ1X3NldF91Y29kZV9wdHJzKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybjsKLQotIHJlc3RhcnQ6Ci0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICAgZnJvbSBwcm90b2NvbC9ydW50aW1lIHVDb2RlIChpbml0aWFsaXphdGlvbiB1Q29kZSdzCi0gKiAgICAgICAgICAgICAgICAgICBBbGl2ZSBnZXRzIGhhbmRsZWQgYnkgaXdsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KCkpLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdGhlcm1hbF9zcGluID0gMDsKLQl1MzIgcmZraWxsOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCi0JaWYgKHByaXYtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKLQkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAotCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHVDb2RlIGhhcyBsb2FkZWQgUnVudGltZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAicnVudGltZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDM5NDVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQlyZmtpbGwgPSBpd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCBBUE1HX1JGS0lMTF9SRUcpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJSRktJTEwgc3RhdHVzOiAweCV4XG4iLCByZmtpbGwpOwotCi0JaWYgKHJma2lsbCAmIDB4MSkgewotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCQkvKiBpZiBSRktJTEwgaXMgbm90IG9uLCB0aGVuIHdhaXQgZm9yIHRoZXJtYWwKLQkJICogc2Vuc29yIGluIGFkYXB0ZXIgdG8ga2ljayBpbiAqLwotCQl3aGlsZSAoaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUocHJpdikgPT0gMCkgewotCQkJdGhlcm1hbF9zcGluKys7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0KLQkJaWYgKHRoZXJtYWxfc3BpbikKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJUaGVybWFsIGNhbGlicmF0aW9uIHRvb2sgJWR1c1xuIiwKLQkJCQkgICAgICAgdGhlcm1hbF9zcGluICogMTApOwotCX0gZWxzZQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIEFmdGVyIHRoZSBBTElWRSByZXNwb25zZSwgd2UgY2FuIHNlbmQgY29tbWFuZHMgdG8gMzk0NSB1Q29kZSAqLwotCXNldF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIEVuYWJsZSB3YXRjaGRvZyB0byBtb25pdG9yIHRoZSBkcml2ZXIgdHggcXVldWVzICovCi0JaXdsX2xlZ2FjeV9zZXR1cF93YXRjaGRvZyhwcml2KTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJcmV0dXJuOwotCi0JaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKLQotCXByaXYtPmFjdGl2ZV9yYXRlID0gSVdMX1JBVEVTX01BU0tfMzk0NTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKSB7Ci0JCXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9Ci0JCQkJKHN0cnVjdCBpd2wzOTQ1X3J4b25fY21kICopKCZjdHgtPmFjdGl2ZSk7Ci0KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQl9IGVsc2UgewotCQkvKiBJbml0aWFsaXplIG91ciByeF9jb25maWcgZGF0YSAqLwotCQlpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCi0JaXdsX2xlZ2FjeV9zZW5kX2J0X2NvbmZpZyhwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLwotCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCWl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMocHJpdik7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQUxJVkUgcHJvY2Vzc2luZyBjb21wbGV0ZS5cbiIpOwotCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQlyZXR1cm47Ci0KLSByZXN0YXJ0OgotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotc3RhdGljIHZvaWQgX19pd2wzOTQ1X2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGV4aXRfcGVuZGluZzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsIERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBTdG9wIFRYIHF1ZXVlcyB3YXRjaGRvZy4gV2UgbmVlZCB0byBoYXZlIFNUQVRVU19FWElUX1BFTkRJTkcgYml0IHNldAotCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hkb2cpOwotCi0JLyogU3RhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIG5vdyBiZSBjbGVhcmVkIGluIGRldmljZSAqLwotCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwgTlVMTCk7Ci0JaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOwotCWl3bF9sZWdhY3lfY2xlYXJfZHJpdmVyX3N0YXRpb25zKHByaXYpOwotCi0JLyogVW5ibG9jayBhbnkgd2FpdGluZyBjYWxscyAqLwotCXdha2VfdXBfYWxsKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JLyogV2lwZSBvdXQgdGhlIEVYSVRfUEVORElORyBzdGF0dXMgYml0IGlmIHdlIGFyZSBub3QgYWN0dWFsbHkKLQkgKiBleGl0aW5nIHRoZSBtb2R1bGUgKi8KLQlpZiAoIWV4aXRfcGVuZGluZykKLQkJY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JLyogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOwotCi0JLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsMzk0NV9zeW5jaHJvbml6ZV9pcnEocHJpdik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKLQotCS8qIElmIHdlIGhhdmUgbm90IHByZXZpb3VzbHkgY2FsbGVkIGl3bDM5NDVfaW5pdCgpIHRoZW4KLQkgKiBjbGVhciBhbGwgYml0cyBidXQgdGhlIFJGIEtpbGwgYml0cyBhbmQgcmV0dXJuICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2luaXQocHJpdikpIHsKLQkJcHJpdi0+c3RhdHVzID0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQkJdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKLQkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCi0JcHJpdi0+c3RhdHVzICY9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQlTVEFUVVNfR0VPX0NPTkZJR1VSRUQgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19GV19FUlJPUiB8Ci0JCQl0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19FWElUX1BFTkRJTkc7Ci0KLQlpd2wzOTQ1X2h3X3R4cV9jdHhfc3RvcChwcml2KTsKLQlpd2wzOTQ1X2h3X3J4cV9zdG9wKHByaXYpOwotCi0JLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSg1KTsKLQotCS8qIFN0b3AgdGhlIGRldmljZSwgYW5kIHB1dCBpdCBpbiBsb3cgcG93ZXIgc3RhdGUgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0gZXhpdDoKLQltZW1zZXQoJnByaXYtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCXByaXYtPmJlYWNvbl9za2IgPSBOVUxMOwotCi0JLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLwotCWl3bDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCV9faXdsMzk0NV9kb3duKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaXdsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLX0KLQotI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQotCi1zdGF0aWMgaW50IGl3bDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IHN0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXN0YV9pZCA9IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHByaXYsIGN0eCwKLQkJCQkJaXdsZWdhY3lfYmNhc3RfYWRkciwgZmFsc2UsIE5VTEwpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gcHJlcGFyZSBicm9hZGNhc3Qgc3RhdGlvblxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfRFJJVkVSX0FDVElWRTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9CQ0FTVDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pd2wzOTQ1X3VwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmMsIGk7Ci0KLQlyYyA9IGl3bDM5NDVfYWxsb2NfYmNhc3Rfc3RhdGlvbihwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBwZW5kaW5nOyB3aWxsIG5vdCBicmluZyB0aGUgTklDIHVwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2RhdGEudl9hZGRyKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVjb2RlIG5vdCBhdmFpbGFibGUgZm9yIGRldmljZSBicmluZyB1cFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCi0JaWYgKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JZWxzZSB7Ci0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCQlJV0xfV0FSTihwcml2LCAiUmFkaW8gZGlzYWJsZWQgYnkgSFcgUkYgS2lsbCBzd2l0Y2hcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQotCXJjID0gaXdsMzk0NV9od19uaWNfaW5pdChwcml2KTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGludCBuaWNcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKLQkJICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7Ci0KLQkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JLyogcmVhbGx5IG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKLQotCS8qIENvcHkgb3JpZ2luYWwgdWNvZGUgZGF0YSBpbWFnZSBmcm9tIGRpc2sgaW50byBiYWNrdXAgY2FjaGUuCi0JICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb24tYm9hcmQgcHJvY2Vzc29yJ3MKLQkgKiBkYXRhIFNSQU0gZm9yIGEgY2xlYW4gc3RhcnQgd2hlbiB0aGUgcnVudGltZSBwcm9ncmFtIGZpcnN0IGxvYWRzLiAqLwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHByaXYtPnVjb2RlX2RhdGEudl9hZGRyLAotCSAgICAgICBwcml2LT51Y29kZV9kYXRhLmxlbik7Ci0KLQkvKiBXZSByZXR1cm4gc3VjY2VzcyB3aGVuIHdlIHJlc3VtZSBmcm9tIHN1c3BlbmQgYW5kIHJmX2tpbGwgaXMgb24uICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hXX1JFU1RBUlRTOyBpKyspIHsKLQotCQkvKiBsb2FkIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lLAotCQkgKiBsb2FkIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gcHJvY2Vzc29yJ3MgbWVtb3J5LAotCQkgKiBwcmVwYXJlIHRvIGxvYWQgdGhlICJpbml0aWFsaXplIiB1Q29kZSAqLwotCQlyYyA9IHByaXYtPmNmZy0+b3BzLT5saWItPmxvYWRfdWNvZGUocHJpdik7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIlVuYWJsZSB0byBzZXQgdXAgYm9vdHN0cmFwIHVDb2RlOiAlZFxuIiwgcmMpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBzdGFydCBjYXJkOyAiaW5pdGlhbGl6ZSIgd2lsbCBsb2FkIHJ1bnRpbWUgdWNvZGUgKi8KLQkJaXdsMzk0NV9uaWNfc3RhcnQocHJpdik7Ci0KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgRFJWX05BTUUgIiBpcyBjb21pbmcgdXBcbiIpOwotCi0JCXJldHVybiAwOwotCX0KLQotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0JX19pd2wzOTQ1X2Rvd24ocHJpdik7Ci0JY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCi0JICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCi0JSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlIGFmdGVyICVkIGF0dGVtcHRzLlxuIiwgaSk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogV29ya3F1ZXVlIGNhbGxiYWNrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCBpbml0X2FsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2wzOTQ1X2luaXRfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2wzOTQ1X2FsaXZlX3N0YXJ0KHByaXYpOwotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi0vKgotICogMzk0NSBjYW5ub3QgaW50ZXJydXB0IGRyaXZlciB3aGVuIGhhcmR3YXJlIHJmIGtpbGwgc3dpdGNoIHRvZ2dsZXM7Ci0gKiBkcml2ZXIgbXVzdCBwb2xsIENTUl9HUF9DTlRSTF9SRUcgcmVnaXN0ZXIgZm9yIGNoYW5nZS4gIFRoaXMgcmVnaXN0ZXIKLSAqICppcyogcmVhZGFibGUgZXZlbiB3aGVuIGRldmljZSBoYXMgYmVlbiBTV19SRVNFVCBpbnRvIGxvdyBwb3dlciBtb2RlCi0gKiAoZS5nLiBkdXJpbmcgUkYgS0lMTCkuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcmZraWxsX3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIF8zOTQ1LnJma2lsbF9wb2xsLndvcmspOwotCWJvb2wgb2xkX3Jma2lsbCA9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQlib29sIG5ld19yZmtpbGwgPSAhKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKQotCQkJJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVyk7Ci0KLQlpZiAobmV3X3Jma2lsbCAhPSBvbGRfcmZraWxsKSB7Ci0JCWlmIChuZXdfcmZraWxsKQotCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCWVsc2UKLQkJCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIG5ld19yZmtpbGwpOwotCi0JCUlXTF9ERUJVR19SRl9LSUxMKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKLQkJCQluZXdfcmZraWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOwotCX0KLQotCS8qIEtlZXAgdGhpcyBydW5uaW5nLCBldmVuIGlmIHJhZGlvIG5vdyBlbmFibGVkLiAgVGhpcyB3aWxsIGJlCi0JICogY2FuY2VsbGVkIGluIG1hY19zdGFydCgpIGlmIHN5c3RlbSBkZWNpZGVzIHRvIHN0YXJ0IGFnYWluICovCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLAotCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKLQotfQotCi1pbnQgaXdsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TQ0FOX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NtZCksCi0JCS5mbGFncyA9IENNRF9TSVpFX0hVR0UsCi0JfTsKLQlzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NtZCAqc2NhbjsKLQl1OCBuX3Byb2JlcyA9IDA7Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCWJvb2wgaXNfYWN0aXZlID0gZmFsc2U7Ci0JaW50IHJldDsKLQl1MTYgbGVuOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQlwcml2LT5zY2FuX2NtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kKSArCi0JCQkJCSBJV0xfTUFYX1NDQU5fU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJpdi0+c2Nhbl9jbWQpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsICJGYWlsIHRvIGFsbG9jYXRlIHNjYW4gbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCXNjYW4gPSBwcml2LT5zY2FuX2NtZDsKLQltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kKSArIElXTF9NQVhfU0NBTl9TSVpFKTsKLQotCXNjYW4tPnF1aWV0X3BsY3BfdGggPSBJV0xfUExDUF9RVUlFVF9USFJFU0g7Ci0Jc2Nhbi0+cXVpZXRfdGltZSA9IElXTF9BQ1RJVkVfUVVJRVRfVElNRTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpIHsKLQkJdTE2IGludGVydmFsOwotCQl1MzIgZXh0cmE7Ci0JCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7Ci0JCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7Ci0KLQkJaW50ZXJ2YWwgPSB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7Ci0KLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gMDsKLQkJc2Nhbi0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIoMjAwICogMTAyNCk7Ci0JCWlmICghaW50ZXJ2YWwpCi0JCQlpbnRlcnZhbCA9IHN1c3BlbmRfdGltZTsKLQkJLyoKLQkJICogc3VzcGVuZCB0aW1lIGZvcm1hdDoKLQkJICogIDAtMTk6IGJlYWNvbiBpbnRlcnZhbCBpbiB1c2VjICh0aW1lIGJlZm9yZSBleGVjLikKLQkJICogMjAtMjM6IDAKLQkJICogMjQtMzE6IG51bWJlciBvZiBiZWFjb25zIChzdXNwZW5kIGJldHdlZW4gY2hhbm5lbHMpCi0JCSAqLwotCi0JCWV4dHJhID0gKHN1c3BlbmRfdGltZSAvIGludGVydmFsKSA8PCAyNDsKLQkJc2Nhbl9zdXNwZW5kX3RpbWUgPSAweEZGMEZGRkZGICYKLQkJICAgIChleHRyYSB8ICgoc3VzcGVuZF90aW1lICUgaW50ZXJ2YWwpICogMTAyNCkpOwotCi0JCXNjYW4tPnN1c3BlbmRfdGltZSA9IGNwdV90b19sZTMyKHNjYW5fc3VzcGVuZF90aW1lKTsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgInN1c3BlbmRfdGltZSAweCVYIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKLQkJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOwotCX0KLQotCWlmIChwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHMpIHsKLQkJaW50IGksIHAgPSAwOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiS2lja2luZyBvZmYgYWN0aXZlIHNjYW5cbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKLQkJCS8qIGFsd2F5cyBkb2VzIHdpbGRjYXJkIGFueXdheSAqLwotCQkJaWYgKCFwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKQotCQkJCWNvbnRpbnVlOwotCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uaWQgPSBXTEFOX0VJRF9TU0lEOwotCQkJc2Nhbi0+ZGlyZWN0X3NjYW5bcF0ubGVuID0KLQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuOwotCQkJbWVtY3B5KHNjYW4tPmRpcmVjdF9zY2FuW3BdLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAotCQkJICAgICAgIHByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOwotCQkJbl9wcm9iZXMrKzsKLQkJCXArKzsKLQkJfQotCQlpc19hY3RpdmUgPSB0cnVlOwotCX0gZWxzZQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiS2lja2luZyBvZmYgcGFzc2l2ZSBzY2FuLlxuIik7Ci0KLQkvKiBXZSBkb24ndCBidWlsZCBhIGRpcmVjdCBzY2FuIHByb2JlIHJlcXVlc3Q7IHRoZSB1Q29kZSB3aWxsIGRvCi0JICogdGhhdCBiYXNlZCBvbiB0aGUgZGlyZWN0X21hc2sgYWRkZWQgdG8gZWFjaCBjaGFubmVsIGVudHJ5ICovCi0Jc2Nhbi0+dHhfY21kLnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQlzY2FuLT50eF9jbWQuc3RhX2lkID0gcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkOwotCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCS8qIGZsYWdzICsgcmF0ZSBzZWxlY3Rpb24gKi8KLQotCXN3aXRjaCAocHJpdi0+c2Nhbl9iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKLQkJc2Nhbi0+dHhfY21kLnJhdGUgPSBJV0xfUkFURV8xTV9QTENQOwotCQliYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlzY2FuLT50eF9jbWQucmF0ZSA9IElXTF9SQVRFXzZNX1BMQ1A7Ci0JCWJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBzY2FuIGJhbmRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGFjdGl2ZSBzY2FuaW5nIGlzIHJlcXVlc3RlZCBidXQgYSBjZXJ0YWluIGNoYW5uZWwKLQkgKiBpcyBtYXJrZWQgcGFzc2l2ZSwgd2UgY2FuIGRvIGFjdGl2ZSBzY2FubmluZyBpZiB3ZQotCSAqIGRldGVjdCB0cmFuc21pc3Npb25zLgotCSAqLwotCXNjYW4tPmdvb2RfQ1JDX3RoID0gaXNfYWN0aXZlID8gSVdMX0dPT0RfQ1JDX1RIX0RFRkFVTFQgOgotCQkJCQlJV0xfR09PRF9DUkNfVEhfRElTQUJMRUQ7Ci0KLQlsZW4gPSBpd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHByaXYsIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAotCQkJCQl2aWYtPmFkZHIsIHByaXYtPnNjYW5fcmVxdWVzdC0+aWUsCi0JCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+aWVfbGVuLAotCQkJCQlJV0xfTUFYX1NDQU5fU0laRSAtIHNpemVvZigqc2NhbikpOwotCXNjYW4tPnR4X2NtZC5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwotCi0JLyogc2VsZWN0IFJ4IGFudGVubmFzICovCi0Jc2Nhbi0+ZmxhZ3MgfD0gaXdsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhwcml2KTsKLQotCXNjYW4tPmNoYW5uZWxfY291bnQgPSBpd2wzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2Nhbihwcml2LCBiYW5kLCBpc19hY3RpdmUsIG5fcHJvYmVzLAotCQkJCQkJCSAgICAodm9pZCAqKSZzY2FuLT5kYXRhW2xlbl0sIHZpZik7Ci0JaWYgKHNjYW4tPmNoYW5uZWxfY291bnQgPT0gMCkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWNtZC5sZW4gKz0gbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKwotCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCk7Ci0JY21kLmRhdGEgPSBzY2FuOwotCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotCWlmIChyZXQpCi0JCWNsZWFyX2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2wzOTQ1X3Bvc3Rfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCS8qCi0JICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCi0JICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAotCSAqLwotCWlmIChtZW1jbXAoJmN0eC0+c3RhZ2luZywgJmN0eC0+YWN0aXZlLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCi0JCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCByZXN0YXJ0KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7Ci0JCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCi0JCQljdHgtPnZpZiA9IE5VTEw7Ci0JCXByaXYtPmlzX29wZW4gPSAwOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsMzk0NV9kb3duKHByaXYpOwotCQlpZWVlODAyMTFfcmVzdGFydF9odyhwcml2LT5odyk7Ci0JfSBlbHNlIHsKLQkJaXdsMzk0NV9kb3duKHByaXYpOwotCi0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCV9faXdsMzk0NV91cChwcml2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3J4X3JlcGxlbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgcnhfcmVwbGVuaXNoKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JaXdsMzk0NV9yeF9yZXBsZW5pc2gocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXZvaWQgaXdsMzk0NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAoIWN0eC0+dmlmIHx8ICFwcml2LT5pc19vcGVuKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIkFzc29jaWF0ZWQgYXMgJWQgdG86ICVwTVxuIiwKLQkJCWN0eC0+dmlmLT5ic3NfY29uZi5haWQsIGN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWNvbmYgPSBpd2xfbGVnYWN5X2llZWU4MDIxMV9nZXRfaHdfY29uZihwcml2LT5odyk7Ci0KLQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JcmMgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl90aW1pbmcocHJpdiwgY3R4KTsKLQlpZiAocmMpCi0JCUlXTF9XQVJOKHByaXYsICJSRVBMWV9SWE9OX1RJTUlORyBmYWlsZWQgLSAiCi0JCQkgICAgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCi0JY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gY3B1X3RvX2xlMTYoY3R4LT52aWYtPmJzc19jb25mLmFpZCk7Ci0KLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgImFzc29jIGlkICVkIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwKLQkJCWN0eC0+dmlmLT5ic3NfY29uZi5haWQsIGN0eC0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKLQotCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0KLQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfQotCi0JaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0Jc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaXdsMzk0NV9yYXRlX3NjYWxlX2luaXQocHJpdi0+aHcsIElXTF9BUF9JRCk7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCWl3bDM5NDVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICIlcyBTaG91bGQgbm90IGJlIGNhbGxlZCBpbiAlZCBtb2RlXG4iLAotCQkJX19mdW5jX18sIGN0eC0+dmlmLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVUNPREVfUkVBRFlfVElNRU9VVAkoMiAqIEhaKQotCi1zdGF0aWMgaW50IGl3bDM5NDVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQkvKiBmZXRjaCB1Y29kZSBmaWxlIGZyb20gZGlzaywgYWxsb2MgYW5kIGNvcHkgdG8gYnVzLW1hc3RlciBidWZmZXJzIC4uLgotCSAqIHVjb2RlIGZpbGVuYW1lIGFuZCBtYXggc2l6ZXMgYXJlIGNhcmQtc3BlY2lmaWMuICovCi0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUubGVuKSB7Ci0JCXJldCA9IGl3bDM5NDVfcmVhZF91Y29kZShwcml2KTsKLQkJaWYgKHJldCkgewotCQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IHJlYWQgbWljcm9jb2RlOiAlZFxuIiwgcmV0KTsKLQkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQkJZ290byBvdXRfcmVsZWFzZV9pcnE7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBfX2l3bDM5NDVfdXAocHJpdik7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3JlbGVhc2VfaXJxOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YXJ0IFVQIHdvcmsuXG4iKTsKLQotCS8qIFdhaXQgZm9yIFNUQVJUX0FMSVZFIGZyb20gdWNvZGUuIE90aGVyd2lzZSBjYWxsYmFja3MgZnJvbQotCSAqIG1hYzgwMjExIHdpbGwgbm90IGJlIHJ1biBzdWNjZXNzZnVsbHkuICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKLQkJCXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cyksCi0JCQlVQ09ERV9SRUFEWV9USU1FT1VUKTsKLQlpZiAoIXJldCkgewotCQlpZiAoIXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykpIHsKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiV2FpdCBmb3IgU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKLQkJfQotCX0KLQotCS8qIHVjb2RlIGlzIHJ1bm5pbmcgYW5kIHdpbGwgc2VuZCByZmtpbGwgbm90aWZpY2F0aW9ucywKLQkgKiBubyBuZWVkIHRvIHBvbGwgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYW55bW9yZSAqLwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsKTsKLQotCXByaXYtPmlzX29wZW4gPSAxOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotCi1vdXRfcmVsZWFzZV9pcnE6Ci0JcHJpdi0+aXNfb3BlbiA9IDA7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIGZhaWxlZFxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFwcml2LT5pc19vcGVuKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBza2lwXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaXYtPmlzX29wZW4gPSAwOwotCi0JaXdsMzk0NV9kb3duKHByaXYpOwotCi0JZmx1c2hfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0KLQkvKiBzdGFydCBwb2xsaW5nIHRoZSBraWxsc3dpdGNoIHN0YXRlIGFnYWluICovCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLAotCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKLQkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOwotCi0JaWYgKGl3bDM5NDVfdHhfc2tiKHByaXYsIHNrYikpCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotdm9pZCBpd2wzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBvbmx5IGF0IEFQIGJyaW5nIHVwICovCi0JaWYgKCEoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKSkgewotCi0JCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JCS8qIFJYT04gVGltaW5nICovCi0JCXJjID0gaXdsX2xlZ2FjeV9zZW5kX3J4b25fdGltaW5nKHByaXYsIGN0eCk7Ci0JCWlmIChyYykKLQkJCUlXTF9XQVJOKHByaXYsICJSRVBMWV9SWE9OX1RJTUlORyBmYWlsZWQgLSAiCi0JCQkJCSJBdHRlbXB0aW5nIHRvIGNvbnRpbnVlLlxuIik7Ci0KLQkJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKLQotCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQlSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPQotCQkJCX5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0KLQkJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgewotCQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9Ci0JCQkJCVJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCQkJZWxzZQotCQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPQotCQkJCQl+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCX0KLQkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JfQotCWl3bDM5NDVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldCA9IDA7Ci0JdTggc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQl1OCBzdGF0aWNfa2V5OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAoaXdsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JLyoKLQkgKiBUbyBzdXBwb3J0IElCU1MgUlNOLCBkb24ndCBwcm9ncmFtIGdyb3VwIGtleXMgaW4gSUJTUywgdGhlCi0JICogaGFyZHdhcmUgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGZyYW1lcy4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCi0JICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCXN0YXRpY19rZXkgPSAhaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpOwotCi0JaWYgKCFzdGF0aWNfa2V5KSB7Ci0JCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdCgKLQkJCQlwcml2LCAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10sIHN0YSk7Ci0JCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTRVRfS0VZOgotCQlpZiAoc3RhdGljX2tleSkKLQkJCXJldCA9IGl3bDM5NDVfc2V0X3N0YXRpY19rZXkocHJpdiwga2V5KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsMzk0NV9zZXRfZHluYW1pY19rZXkocHJpdiwga2V5LCBzdGFfaWQpOwotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQljYXNlIERJU0FCTEVfS0VZOgotCQlpZiAoc3RhdGljX2tleSkKLQkJCXJldCA9IGl3bDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkocHJpdik7Ci0JCWVsc2UKLQkJCXJldCA9IGl3bDM5NDVfY2xlYXJfc3RhX2tleV9pbmZvKHByaXYsIHN0YV9pZCk7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X21hY19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaW50IHJldDsKLQlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQotCXJldCA9IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsCi0JCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLAotCQkJCSAgICAgc3RhLT5hZGRyLCBpc19hcCwgc3RhLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKLQkJCXN0YS0+YWRkciwgcmV0KTsKLQkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCi0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOwotCi0JLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCi0JCSAgICAgICBzdGEtPmFkZHIpOwotCWl3bDM5NDVfcnNfcmF0ZV9pbml0KHByaXYsIHN0YSwgc3RhX2lkKTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkJICAgICB1NjQgbXVsdGljYXN0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCi0JaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKLQkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKLQllbHNlCQkJCQlcCi0JCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKLQl9IHdoaWxlICgwKQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCi0JCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOwotCi0JQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyk7Ci0JQ0hLKEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7Ci0KLSN1bmRlZiBDSEsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gfmZpbHRlcl9uYW5kOwotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOwotCi0JLyoKLQkgKiBOb3QgY29tbWl0dGluZyBkaXJlY3RseSBiZWNhdXNlIGhhcmR3YXJlIGNhbiBwZXJmb3JtIGEgc2NhbiwKLQkgKiBidXQgZXZlbiBpZiBodyBpcyByZWFkeSwgY29tbWl0dGluZyBoZXJlIGJyZWFrcyBmb3Igc29tZSByZWFzb24sCi0JICogd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgotCSAqLwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQkvKgotCSAqIFJlY2VpdmluZyBhbGwgbXVsdGljYXN0IGZyYW1lcyBpcyBhbHdheXMgZW5hYmxlZCBieSB0aGUKLQkgKiBkZWZhdWx0IGZsYWdzIHNldHVwIGluIGl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCi0JICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAotCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCSp0b3RhbF9mbGFncyAmPSBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKLQkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc3lzZnMgYXR0cmlidXRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KLSAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvYnVzL3BjaS9kcml2ZXJzL2l3bC8pCi0gKiB1c2VkIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgbGV2ZWwuCi0gKgotICogU2VlIHRoZSBsZXZlbCBkZWZpbml0aW9ucyBpbiBpd2wgZm9yIGRldGFpbHMuCi0gKgotICogVGhlIGRlYnVnX2xldmVsIGJlaW5nIG1hbmFnZWQgdXNpbmcgc3lzZnMgYmVsb3cgaXMgYSBwZXIgZGV2aWNlIGRlYnVnCi0gKiBsZXZlbCB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIGlmIGl0ICh0aGUgcGVyCi0gKiBkZXZpY2UgZGVidWcgbGV2ZWwpIGlzIHNldC4KLSAqLwotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlJV0xfSU5GTyhwcml2LCAiJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UgewotCQlwcml2LT5kZWJ1Z19sZXZlbCA9IHZhbDsKLQkJaWYgKGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0ocHJpdikpCi0JCQlJV0xfRVJSKHByaXYsCi0JCQkJIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGdlbmVyYXRlIHRyYWZmaWMgbG9nXG4iKTsKLQl9Ci0JcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZWJ1Z19sZXZlbCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCQlpd2wzOTQ1X3Nob3dfZGVidWdfbGV2ZWwsIGl3bDM5NDVfc3RvcmVfZGVidWdfbGV2ZWwpOwotCi0jZW5kaWYgLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgaXdsMzk0NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT50eF9wb3dlcl91c2VyX2xtdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKLQl1MzIgdmFsOwotCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKLQlpZiAocCA9PSBidWYpCi0JCUlXTF9JTkZPKHByaXYsICI6ICVzIGlzIG5vdCBpbiBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UKLQkJaXdsMzk0NV9od19yZWdfc2V0X3R4cG93ZXIocHJpdiwgdmFsKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHR4X3Bvd2VyLCBTX0lXVVNSIHwgU19JUlVHTywgaXdsMzk0NV9zaG93X3R4X3Bvd2VyLCBpd2wzOTQ1X3N0b3JlX3R4X3Bvd2VyKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGN0eC0+YWN0aXZlLmZsYWdzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JdTMyIGZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmIChsZTMyX3RvX2NwdShjdHgtPnN0YWdpbmcuZmxhZ3MpICE9IGZsYWdzKSB7Ci0JCS8qIENhbmNlbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgc2NhbnMuLi4gKi8KLQkJaWYgKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApKQotCQkJSVdMX1dBUk4ocHJpdiwgIkNvdWxkIG5vdCBjYW5jZWwgc2Nhbi5cbiIpOwotCQllbHNlIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb21taXR0aW5nIHJ4b24uZmxhZ3MgPSAweCUwNFhcbiIsCi0JCQkJICAgICAgIGZsYWdzKTsKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKLQkJCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGZsYWdzLCBTX0lXVVNSIHwgU19JUlVHTywgaXdsMzk0NV9zaG93X2ZsYWdzLCBpd2wzOTQ1X3N0b3JlX2ZsYWdzKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLAotCQlsZTMyX3RvX2NwdShjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9maWx0ZXJfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTMyIGZpbHRlcl9mbGFncyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKGxlMzJfdG9fY3B1KGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MpICE9IGZpbHRlcl9mbGFncykgewotCQkvKiBDYW5jZWwgYW55IGN1cnJlbnRseSBydW5uaW5nIHNjYW5zLi4uICovCi0JCWlmIChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKSkKLQkJCUlXTF9XQVJOKHByaXYsICJDb3VsZCBub3QgY2FuY2VsIHNjYW4uXG4iKTsKLQkJZWxzZSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ29tbWl0dGluZyByeG9uLmZpbHRlcl9mbGFncyA9ICIKLQkJCQkgICAgICAgIjB4JTA0WFxuIiwgZmlsdGVyX2ZsYWdzKTsKLQkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPQotCQkJCWNwdV90b19sZTMyKGZpbHRlcl9mbGFncyk7Ci0JCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihmaWx0ZXJfZmxhZ3MsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfZmlsdGVyX2ZsYWdzLAotCQkgICBpd2wzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd19tZWFzdXJlbWVudChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIG1lYXN1cmVfcmVwb3J0OwotCXUzMiBzaXplID0gc2l6ZW9mKG1lYXN1cmVfcmVwb3J0KSwgbGVuID0gMCwgb2ZzID0gMDsKLQl1OCAqZGF0YSA9ICh1OCAqKSZtZWFzdXJlX3JlcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgJiBNRUFTVVJFTUVOVF9SRUFEWSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbWVtY3B5KCZtZWFzdXJlX3JlcG9ydCwgJnByaXYtPm1lYXN1cmVfcmVwb3J0LCBzaXplKTsKLQlwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChzaXplICYmIChQQUdFX1NJWkUgLSBsZW4pKSB7Ci0JCWhleF9kdW1wX3RvX2J1ZmZlcihkYXRhICsgb2ZzLCBzaXplLCAxNiwgMSwgYnVmICsgbGVuLAotCQkJCSAgIFBBR0VfU0laRSAtIGxlbiwgMSk7Ci0JCWxlbiA9IHN0cmxlbihidWYpOwotCQlpZiAoUEFHRV9TSVpFIC0gbGVuKQotCQkJYnVmW2xlbisrXSA9ICdcbic7Ci0KLQkJb2ZzICs9IDE2OwotCQlzaXplIC09IG1pbihzaXplLCAxNlUpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZCwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtcyA9IHsKLQkJLmNoYW5uZWwgPSBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKLQkJLnN0YXJ0X3RpbWUgPSBjcHVfdG9fbGU2NChwcml2LT5fMzk0NS5sYXN0X3RzZiksCi0JCS5kdXJhdGlvbiA9IGNwdV90b19sZTE2KDEpLAotCX07Ci0JdTggdHlwZSA9IElXTF9NRUFTVVJFX0JBU0lDOwotCXU4IGJ1ZmZlclszMl07Ci0JdTggY2hhbm5lbDsKLQotCWlmIChjb3VudCkgewotCQljaGFyICpwID0gYnVmZmVyOwotCQlzdHJuY3B5KGJ1ZmZlciwgYnVmLCBtaW4oc2l6ZW9mKGJ1ZmZlciksIGNvdW50KSk7Ci0JCWNoYW5uZWwgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKLQkJaWYgKGNoYW5uZWwpCi0JCQlwYXJhbXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0KLQkJcCA9IGJ1ZmZlcjsKLQkJd2hpbGUgKCpwICYmICpwICE9ICcgJykKLQkJCXArKzsKLQkJaWYgKCpwKQotCQkJdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKTsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW52b2tpbmcgbWVhc3VyZW1lbnQgb2YgdHlwZSAlZCBvbiAiCi0JCSAgICAgICAiY2hhbm5lbCAlZCAoZm9yICclcycpXG4iLCB0eXBlLCBwYXJhbXMuY2hhbm5lbCwgYnVmKTsKLQlpd2wzOTQ1X2dldF9tZWFzdXJlbWVudChwcml2LCAmcGFyYW1zLCB0eXBlKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG1lYXN1cmVtZW50LCBTX0lSVVNSIHwgU19JV1VTUiwKLQkJICAgaXdsMzk0NV9zaG93X21lYXN1cmVtZW50LCBpd2wzOTQ1X3N0b3JlX21lYXN1cmVtZW50KTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9yZXRyeV9yYXRlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JcHJpdi0+cmV0cnlfcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7Ci0JaWYgKHByaXYtPnJldHJ5X3JhdGUgPD0gMCkKLQkJcHJpdi0+cmV0cnlfcmF0ZSA9IDE7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd19yZXRyeV9yYXRlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBwcml2LT5yZXRyeV9yYXRlKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHJldHJ5X3JhdGUsIFNfSVdVU1IgfCBTX0lSVVNSLCBpd2wzOTQ1X3Nob3dfcmV0cnlfcmF0ZSwKLQkJICAgaXdsMzk0NV9zdG9yZV9yZXRyeV9yYXRlKTsKLQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQkvKiBhbGwgdGhpcyBzaGl0IGRvZXNuJ3QgYmVsb25nIGludG8gc3lzZnMgYW55d2F5ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihjaGFubmVscywgU19JUlVTUiwgaXdsMzk0NV9zaG93X2NoYW5uZWxzLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X2FudGVubmEoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaXdsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2FudGVubmEoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpbnQgYW50OwotCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKHNzY2FuZihidWYsICIlMWkiLCAmYW50KSAhPSAxKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JaWYgKChhbnQgPj0gMCkgJiYgKGFudCA8PSAyKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2V0dGluZyBhbnRlbm5hIHNlbGVjdCB0byAlZC5cbiIsIGFudCk7Ci0JCWl3bDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hID0gKGVudW0gaXdsMzk0NV9hbnRlbm5hKWFudDsKLQl9IGVsc2UKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBhbnRlbm5hIHNlbGVjdCB2YWx1ZSAlZC5cbiIsIGFudCk7Ci0KLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGFudGVubmEsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfYW50ZW5uYSwgaXdsMzk0NV9zdG9yZV9hbnRlbm5hKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHN0YXR1cywgU19JUlVHTywgaXdsMzk0NV9zaG93X3N0YXR1cywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfZHVtcF9lcnJvcl9sb2coc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKLQotCWlmIChwWzBdID09ICcxJykKLQkJaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2cocHJpdik7Ci0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGR1bXBfZXJyb3JzLCBTX0lXVVNSLCBOVUxMLCBpd2wzOTQ1X2R1bXBfZXJyb3JfbG9nKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyIGRvd24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX05BTUUpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCUlOSVRfV09SSygmcHJpdi0+cmVzdGFydCwgaXdsMzk0NV9iZ19yZXN0YXJ0KTsKLQlJTklUX1dPUksoJnByaXYtPnJ4X3JlcGxlbmlzaCwgaXdsMzk0NV9iZ19yeF9yZXBsZW5pc2gpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2wzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsMzk0NV9iZ19hbGl2ZV9zdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLCBpd2wzOTQ1X3Jma2lsbF9wb2xsKTsKLQotCWl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JaXdsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hkb2cpOwotCXByaXYtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXByaXYtPndhdGNoZG9nLmZ1bmN0aW9uID0gaXdsX2xlZ2FjeV9iZ193YXRjaGRvZzsKLQotCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3Rhc2tsZXQsICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkKLQkJICAgICBpd2wzOTQ1X2lycV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsMzk0NV9od19jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydCk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YWxpdmVfc3RhcnQpOwotCi0JaXdsX2xlZ2FjeV9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXdsMzk0NV9zeXNmc19lbnRyaWVzW10gPSB7Ci0JJmRldl9hdHRyX2FudGVubmEuYXR0ciwKLQkmZGV2X2F0dHJfY2hhbm5lbHMuYXR0ciwKLQkmZGV2X2F0dHJfZHVtcF9lcnJvcnMuYXR0ciwKLQkmZGV2X2F0dHJfZmxhZ3MuYXR0ciwKLQkmZGV2X2F0dHJfZmlsdGVyX2ZsYWdzLmF0dHIsCi0JJmRldl9hdHRyX21lYXN1cmVtZW50LmF0dHIsCi0JJmRldl9hdHRyX3JldHJ5X3JhdGUuYXR0ciwKLQkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3RlbXBlcmF0dXJlLmF0dHIsCi0JJmRldl9hdHRyX3R4X3Bvd2VyLmF0dHIsCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCi0jZW5kaWYKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IE5VTEwsCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLwotCS5hdHRycyA9IGl3bDM5NDVfc3lzZnNfZW50cmllcywKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDM5NDVfaHdfb3BzID0gewotCS50eCA9IGl3bDM5NDVfbWFjX3R4LAotCS5zdGFydCA9IGl3bDM5NDVfbWFjX3N0YXJ0LAotCS5zdG9wID0gaXdsMzk0NV9tYWNfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlLAotCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsX2xlZ2FjeV9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsMzk0NV9jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfa2V5ID0gaXdsMzk0NV9tYWNfc2V0X2tleSwKLQkuY29uZl90eCA9IGl3bF9sZWdhY3lfbWFjX2NvbmZfdHgsCi0JLnJlc2V0X3RzZiA9IGl3bF9sZWdhY3lfbWFjX3Jlc2V0X3RzZiwKLQkuYnNzX2luZm9fY2hhbmdlZCA9IGl3bF9sZWdhY3lfbWFjX2Jzc19pbmZvX2NoYW5nZWQsCi0JLmh3X3NjYW4gPSBpd2xfbGVnYWN5X21hY19od19zY2FuLAotCS5zdGFfYWRkID0gaXdsMzk0NV9tYWNfc3RhX2FkZCwKLQkuc3RhX3JlbW92ZSA9IGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUsCi0JLnR4X2xhc3RfYmVhY29uID0gaXdsX2xlZ2FjeV9tYWNfdHhfbGFzdF9iZWFjb24sCi19OwotCi1zdGF0aWMgaW50IGl3bDM5NDVfaW5pdF9kcnYoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCi0JcHJpdi0+cmV0cnlfcmF0ZSA9IDE7Ci0JcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5oY21kX2xvY2spOwotCi0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZyZWVfZnJhbWVzKTsKLQotCW11dGV4X2luaXQoJnByaXYtPm11dGV4KTsKLQotCXByaXYtPmllZWVfY2hhbm5lbHMgPSBOVUxMOwotCXByaXYtPmllZWVfcmF0ZXMgPSBOVUxMOwotCXByaXYtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCi0JLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLwotCXByaXYtPmZvcmNlX3Jlc2V0LnJlc2V0X2R1cmF0aW9uID0gSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOwotCi0JaWYgKGVlcHJvbS0+dmVyc2lvbiA8IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJVbnN1cHBvcnRlZCBFRVBST00gdmVyc2lvbjogMHglMDRYXG4iLAotCQkJIGVlcHJvbS0+dmVyc2lvbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBTZXQgdXAgdHhwb3dlciBzZXR0aW5ncyBpbiBkcml2ZXIgZm9yIGFsbCBjaGFubmVscyAqLwotCWlmIChpd2wzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHByaXYpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7Ci0JfQotCi0JcmV0ID0gaXdsX2xlZ2FjeV9pbml0X2dlb3MocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOwotCX0KLQlpd2wzOTQ1X2luaXRfaHdfcmF0ZXMocHJpdiwgcHJpdi0+aWVlZV9yYXRlcyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfY2hhbm5lbF9tYXA6Ci0JaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwKHByaXYpOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgSVdMMzk0NV9NQVhfUFJPQkVfUkVRVUVTVAkyMDAKLQotc3RhdGljIGludCBpd2wzOTQ1X3NldHVwX21hYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCi0JaHctPnJhdGVfY29udHJvbF9hbGdvcml0aG0gPSAiaXdsLTM5NDUtcnMiOwotCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2KTsKLQlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3ZpZl9wcml2KTsKLQotCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLwotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKLQkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UOwotCi0JaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPQotCQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pbnRlcmZhY2VfbW9kZXM7Ci0KLQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfAotCQkJICAgIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAotCQkJICAgIFdJUEhZX0ZMQUdfSUJTU19SU047Ci0KLQlody0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gUFJPQkVfT1BUSU9OX01BWF8zOTQ1OwotCS8qIHdlIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciBhbmQgYSB6ZXJvLWxlbmd0aCBTU0lEIGVsZW1lbnQgKi8KLQlody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IElXTDM5NDVfTUFYX1BST0JFX1JFUVVFU1QgLSAyNCAtIDI7Ci0KLQkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KLQlody0+cXVldWVzID0gNDsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWdhY3lfbGVkc19pbml0KHByaXYpOwotCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotCWludCBlcnIgPSAwLCBpOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgaXdsX2NmZyAqY2ZnID0gKHN0cnVjdCBpd2xfY2ZnICopKGVudC0+ZHJpdmVyX2RhdGEpOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqZWVwcm9tOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKLQkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIHByaXZhdGUgc3RydWN0dXJlICovCi0JaHcgPSBpd2xfbGVnYWN5X2FsbG9jX2FsbChjZmcpOwotCWlmIChodyA9PSBOVUxMKSB7Ci0JCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQlwcml2ID0gaHctPnByaXY7Ci0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOwotCi0JcHJpdi0+Y21kX3F1ZXVlID0gSVdMMzlfQ01EX1FVRVVFX05VTTsKLQotCS8qIDM5NDUgaGFzIG9ubHkgb25lIHZhbGlkIGNvbnRleHQgKi8KLQlwcml2LT52YWxpZF9jb250ZXh0cyA9IEJJVChJV0xfUlhPTl9DVFhfQlNTKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fSVdMX1JYT05fQ1RYOyBpKyspCi0JCXByaXYtPmNvbnRleHRzW2ldLmN0eGlkID0gaTsKLQotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnJ4b25fY21kID0gUkVQTFlfUlhPTjsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX3RpbWluZ19jbWQgPSBSRVBMWV9SWE9OX1RJTUlORzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX2Fzc29jX2NtZCA9IFJFUExZX1JYT05fQVNTT0M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucW9zX2NtZCA9IFJFUExZX1FPU19QQVJBTTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hcF9zdGFfaWQgPSBJV0xfQVBfSUQ7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ud2VwX2tleV9jbWQgPSBSRVBMWV9XRVBLRVk7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaW50ZXJmYWNlX21vZGVzID0KLQkJQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKLQkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhdGlvbl9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udW51c2VkX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKLQotCS8qCi0JICogRGlzYWJsaW5nIGhhcmR3YXJlIHNjYW4gbWVhbnMgdGhhdCBtYWM4MDIxMSB3aWxsIHBlcmZvcm0gc2NhbnMKLQkgKiAidGhlIGhhcmQgd2F5IiwgcmF0aGVyIHRoYW4gdXNpbmcgZGV2aWNlJ3Mgc2Nhbi4KLQkgKi8KLQlpZiAoaXdsMzk0NV9tb2RfcGFyYW1zLmRpc2FibGVfaHdfc2NhbikgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRGlzYWJsaW5nIGh3X3NjYW5cbiIpOwotCQlpd2wzOTQ1X2h3X29wcy5od19zY2FuID0gTlVMTDsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIExPQUQgRFJJVkVSICoqKlxuIik7Ci0JcHJpdi0+Y2ZnID0gY2ZnOwotCXByaXYtPnBjaV9kZXYgPSBwZGV2OwotCXByaXYtPmludGFfbWFzayA9IENTUl9JTklfU0VUX01BU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDIuIEluaXRpYWxpemluZyBQQ0kgYnVzCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsIFBDSUVfTElOS19TVEFURV9MMFMgfCBQQ0lFX0xJTktfU1RBVEVfTDEgfAotCQkJCVBDSUVfTElOS19TVEFURV9DTEtQTSk7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaWVlZTgwMjExX2ZyZWVfaHc7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmICghZXJyKQotCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikgewotCQlJV0xfV0FSTihwcml2LCAiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOwotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0JfQotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDMuIFJlYWQgUkVWIFJlZ2lzdGVyCi0JICogKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdi0+aHdfYmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKLQlpZiAoIXByaXYtPmh3X2Jhc2UpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4bGx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIHByaXYtPmh3X2Jhc2UpOwotCi0JLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgMHgwMCk7Ci0KLQkvKiB0aGVzZSBzcGluIGxvY2tzIHdpbGwgYmUgdXNlZCBpbiBhcG1fb3BzLmluaXQgYW5kIEVFUFJPTSBhY2Nlc3MKLQkgKiB3ZSBzaG91bGQgaW5pdCBub3cKLQkgKi8KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmVnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKLQotCS8qCi0JICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQotCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCi0JICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCi0JICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA0LiBSZWFkIEVFUFJPTQotCSAqICoqKioqKioqKioqKioqKioqKioqLwotCi0JLyogUmVhZCB0aGUgRUVQUk9NICovCi0JZXJyID0gaXdsX2xlZ2FjeV9lZXByb21faW5pdChwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7Ci0JCWdvdG8gb3V0X2lvdW5tYXA7Ci0JfQotCS8qIE1BQyBBZGRyZXNzIGxvY2F0aW9uIGluIEVFUFJPTSBzYW1lIGZvciAzOTQ1LzQ5NjUgKi8KLQllZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBlZXByb20tPm1hY19hZGRyZXNzKTsKLQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgZWVwcm9tLT5tYWNfYWRkcmVzcyk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA1LiBTZXR1cCBIVyBDb25zdGFudHMKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBEZXZpY2Utc3BlY2lmaWMgc2V0dXAgKi8KLQlpZiAoaXdsMzk0NV9od19zZXRfaHdfcGFyYW1zKHByaXYpKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZXQgaHcgc2V0dGluZ3NcbiIpOwotCQlnb3RvIG91dF9lZXByb21fZnJlZTsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA2LiBTZXR1cCBwcml2Ci0JICogKioqKioqKioqKioqKioqKioqKiovCi0KLQllcnIgPSBpd2wzOTQ1X2luaXRfZHJ2KHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiaW5pdGlhbGl6aW5nIGRyaXZlciBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF91bnNldF9od19wYXJhbXM7Ci0JfQotCi0JSVdMX0lORk8ocHJpdiwgIkRldGVjdGVkIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayAlc1xuIiwKLQkJcHJpdi0+Y2ZnLT5uYW1lKTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDcuIFNldHVwIFNlcnZpY2VzCi0JICogKioqKioqKioqKioqKioqKioqKiovCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXBjaV9lbmFibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBpd2xfbGVnYWN5X2lzciwKLQkJCSAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwcml2LT5wY2lfZGV2LT5pcnEpOwotCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKLQl9Ci0KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsMzk0NV9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBkZXZpY2UgYXR0cmlidXRlc1xuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfaXJxOwotCX0KLQotCWl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbChwcml2LAotCQkJICAgICAmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0uY2hhbm5lbHNbNV0sCi0JCQkgICAgICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JaXdsMzk0NV9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCWl3bDM5NDVfc2V0dXBfcnhfaGFuZGxlcnMocHJpdik7Ci0JaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHByaXYpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDguIFNldHVwIGFuZCBSZWdpc3RlciBtYWM4MDIxMQotCSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JZXJyID0gaXdsMzk0NV9zZXR1cF9tYWMocHJpdik7Ci0JaWYgKGVycikKLQkJZ290byAgb3V0X3JlbW92ZV9zeXNmczsKLQotCWVyciA9IGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIocHJpdiwgRFJWX05BTUUpOwotCWlmIChlcnIpCi0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlcy4gSWdub3JpbmcgZXJyb3I6ICVkXG4iLCBlcnIpOwotCi0JLyogU3RhcnQgbW9uaXRvcmluZyB0aGUga2lsbHN3aXRjaCAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5fMzk0NS5yZmtpbGxfcG9sbCwKLQkJCSAgIDIgKiBIWik7Ci0KLQlyZXR1cm4gMDsKLQotIG91dF9yZW1vdmVfc3lzZnM6Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlwcml2LT53b3JrcXVldWUgPSBOVUxMOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7Ci0gb3V0X3JlbGVhc2VfaXJxOgotCWZyZWVfaXJxKHByaXYtPnBjaV9kZXYtPmlycSwgcHJpdik7Ci0gb3V0X2Rpc2FibGVfbXNpOgotCXBjaV9kaXNhYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0gb3V0X3Vuc2V0X2h3X3BhcmFtczoKLQlpd2wzOTQ1X3Vuc2V0X2h3X3BhcmFtcyhwcml2KTsKLSBvdXRfZWVwcm9tX2ZyZWU6Ci0JaXdsX2xlZ2FjeV9lZXByb21fZnJlZShwcml2KTsKLSBvdXRfaW91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLSBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLSBvdXRfaWVlZTgwMjExX2ZyZWVfaHc6Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKLSBvdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bDM5NDVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBVTkxPQUQgRFJJVkVSICoqKlxuIik7Ci0KLQlpd2xfbGVnYWN5X2RiZ2ZzX3VucmVnaXN0ZXIocHJpdik7Ci0KLQlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCi0JaXdsX2xlZ2FjeV9sZWRzX2V4aXQocHJpdik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgewotCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhwcml2LT5odyk7Ci0JCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOwotCX0gZWxzZSB7Ci0JCWl3bDM5NDVfZG93bihwcml2KTsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcmVzZXQgdG8gbG93IHBvd2VyIGJlZm9yZSB1bmxvYWRpbmcgZHJpdmVyLgotCSAqIFRoaXMgbWF5IGJlIHJlZHVuZGFudCB3aXRoIGl3bF9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KLQkgKiBydW4gaXdsX2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKLQkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGl3bF9kb3duKCkgYXQgYWxsIGJlZm9yZSBsZWF2aW5nIGRyaXZlci4KLQkgKiBUaGlzIChpbmV4cGVuc2l2ZSkgY2FsbCAqbWFrZXMgc3VyZSogZGV2aWNlIGlzIHJlc2V0LgotCSAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3AocHJpdik7Ci0KLQkvKiBtYWtlIHN1cmUgd2UgZmx1c2ggYW55IHBlbmRpbmcgaXJxIG9yCi0JICogdGFza2xldCBmb3IgdGhlIGRyaXZlcgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaXdsMzk0NV9zeW5jaHJvbml6ZV9pcnEocHJpdik7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsMzk0NV9hdHRyaWJ1dGVfZ3JvdXApOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5fMzk0NS5yZmtpbGxfcG9sbCk7Ci0KLQlpd2wzOTQ1X2RlYWxsb2NfdWNvZGVfcGNpKHByaXYpOwotCi0JaWYgKHByaXYtPnJ4cS5iZCkKLQkJaXdsMzk0NV9yeF9xdWV1ZV9mcmVlKHByaXYsICZwcml2LT5yeHEpOwotCWl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHByaXYpOwotCi0JaXdsMzk0NV91bnNldF9od19wYXJhbXMocHJpdik7Ci0KLQkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQotCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGxzIGl3bDM5NDVfbWFjX3N0b3AsIHdoaWNoIGZsdXNoZXMKLQkgKiBwcml2LT53b3JrcXVldWUuLi4gc28gd2UgY2FuJ3QgdGFrZSBkb3duIHRoZSB3b3JrcXVldWUKLQkgKiB1bnRpbCBub3cuLi4gKi8KLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCi0JZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7Ci0KLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0JaXdsX2xlZ2FjeV9mcmVlX2dlb3MocHJpdik7Ci0Ja2ZyZWUocHJpdi0+c2Nhbl9jbWQpOwotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGRyaXZlciBhbmQgbW9kdWxlIGVudHJ5IHBvaW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXdsMzk0NV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBEUlZfTkFNRSwKLQkuaWRfdGFibGUgPSBpd2wzOTQ1X2h3X2NhcmRfaWRzLAotCS5wcm9iZSA9IGl3bDM5NDVfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpd2wzOTQ1X3BjaV9yZW1vdmUpLAotCS5kcml2ZXIucG0gPSBJV0xfTEVHQUNZX1BNX09QUywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGl3bDM5NDVfaW5pdCh2b2lkKQotewotCi0JaW50IHJldDsKLQlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOwotCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKLQotCXJldCA9IGl3bDM5NDVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2wzOTQ1X2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIFBDSSBtb2R1bGVcbiIpOwotCQlnb3RvIGVycm9yX3JlZ2lzdGVyOwotCX0KLQotCXJldHVybiByZXQ7Ci0KLWVycm9yX3JlZ2lzdGVyOgotCWl3bDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXdsMzk0NV9leGl0KHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpd2wzOTQ1X2RyaXZlcik7Ci0JaXdsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOwotfQotCi1NT0RVTEVfRklSTVdBUkUoSVdMMzk0NV9NT0RVTEVfRklSTVdBUkUoSVdMMzk0NV9VQ09ERV9BUElfTUFYKSk7Ci0KLW1vZHVsZV9wYXJhbV9uYW1lZChhbnRlbm5hLCBpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYW50ZW5uYSwgInNlbGVjdCBhbnRlbm5hICgxPU1haW4sIDI9QXV4LCBkZWZhdWx0IDAgW2JvdGhdKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHN3Y3J5cHRvLCBpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywKLQkJInVzaW5nIHNvZnR3YXJlIGNyeXB0byAoZGVmYXVsdCAxIFtzb2Z0d2FyZV0pIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9od19zY2FuLCBpd2wzOTQ1X21vZF9wYXJhbXMuZGlzYWJsZV9od19zY2FuLAotCQlpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2h3X3NjYW4sICJkaXNhYmxlIGhhcmR3YXJlIHNjYW5uaW5nIChkZWZhdWx0IDEpIik7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGl3bGVnYWN5X2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgb3V0cHV0IG1hc2siKTsKLSNlbmRpZgotbW9kdWxlX3BhcmFtX25hbWVkKGZ3X3Jlc3RhcnQsIGl3bDM5NDVfbW9kX3BhcmFtcy5yZXN0YXJ0X2Z3LCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhmd19yZXN0YXJ0LCAicmVzdGFydCBmaXJtd2FyZSBpbiBjYXNlIG9mIGVycm9yIik7Ci0KLW1vZHVsZV9leGl0KGl3bDM5NDVfZXhpdCk7Ci1tb2R1bGVfaW5pdChpd2wzOTQ1X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsNDk2NS1iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmYmE5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDMyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotI2RlZmluZSBEUlZfTkFNRSAgICAgICAgIml3bDQ5NjUiCi0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWxlZC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtb2R1bGUgYm9pbGVyIHBsYXRlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KLSAqLwotI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkludGVsKFIpIFdpcmVsZXNzIFdpRmkgNDk2NSBkcml2ZXIgZm9yIExpbnV4IgotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0jZGVmaW5lIFZEICJkIgotI2Vsc2UKLSNkZWZpbmUgVkQKLSNlbmRpZgotCi0jZGVmaW5lIERSVl9WRVJTSU9OICAgICBJV0xXSUZJX1ZFUlNJT04gVkQKLQotCi1NT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKLU1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLU1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCAiICIgRFJWX0FVVEhPUik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoIml3bDQ5NjUiKTsKLQotdm9pZCBpd2w0OTY1X3VwZGF0ZV9jaGFpbl9mbGFncyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pIHsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCQkJaWYgKGN0eC0+YWN0aXZlLnJ4X2NoYWluICE9IGN0eC0+c3RhZ2luZy5yeF9jaGFpbikKLQkJCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfY2xlYXJfZnJlZV9mcmFtZXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJWQgZnJhbWVzIG9uIHByZS1hbGxvY2F0ZWQgaGVhcCBvbiBjbGVhci5cbiIsCi0JCSAgICAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCQlrZnJlZShsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfZnJhbWUsIGxpc3QpKTsKLQkJcHJpdi0+ZnJhbWVzX2NvdW50LS07Ci0JfQotCi0JaWYgKHByaXYtPmZyYW1lc19jb3VudCkgewotCQlJV0xfV0FSTihwcml2LCAiJWQgZnJhbWVzIHN0aWxsIGluIHVzZS4gIERpZCB3ZSBsb3NlIG9uZT9cbiIsCi0JCQkgICAgcHJpdi0+ZnJhbWVzX2NvdW50KTsKLQkJcHJpdi0+ZnJhbWVzX2NvdW50ID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2ZyYW1lICppd2w0OTY1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2ZyYW1lICpmcmFtZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCWlmIChsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZnJhbWUgPSBremFsbG9jKHNpemVvZigqZnJhbWUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcmFtZSkgewotCQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIVxuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCXByaXYtPmZyYW1lc19jb3VudCsrOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCi0JZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JbGlzdF9kZWwoZWxlbWVudCk7Ci0JcmV0dXJuIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9mcmFtZSwgbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZnJlZV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfZnJhbWUgKmZyYW1lKQotewotCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOwotCWxpc3RfYWRkKCZmcmFtZS0+bGlzdCwgJnByaXYtPmZyZWVfZnJhbWVzKTsKLX0KLQotc3RhdGljIHUzMiBpd2w0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgaW50IGxlZnQpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5iZWFjb25fc2tiKQotCQlyZXR1cm4gMDsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiLT5sZW4gPiBsZWZ0KQotCQlyZXR1cm4gMDsKLQotCW1lbWNweShoZHIsIHByaXYtPmJlYWNvbl9za2ItPmRhdGEsIHByaXYtPmJlYWNvbl9za2ItPmxlbik7Ci0KLQlyZXR1cm4gcHJpdi0+YmVhY29uX3NrYi0+bGVuOwotfQotCi0vKiBQYXJzZSB0aGUgYmVhY29uIGZyYW1lIHRvIGZpbmQgdGhlIFRJTSBlbGVtZW50IGFuZCBzZXQgdGltX2lkeCAmIHRpbV9zaXplICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldF9iZWFjb25fdGltKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQsCi0JCQkgICAgICAgdTggKmJlYWNvbiwgdTMyIGZyYW1lX3NpemUpCi17Ci0JdTE2IHRpbV9pZHg7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJlYWNvbjsKLQotCS8qCi0JICogVGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIGZyYW1lIHN0YXJ0IGJ1dCB3ZSBzdGFydCBsb29raW5nIGF0IHRoZQotCSAqIHZhcmlhYmxlLWxlbmd0aCBwYXJ0IG9mIHRoZSBiZWFjb24uCi0JICovCi0JdGltX2lkeCA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlIC0gYmVhY29uOwotCi0JLyogUGFyc2UgdmFyaWFibGUtbGVuZ3RoIGVsZW1lbnRzIG9mIGJlYWNvbiB0byBmaW5kIFdMQU5fRUlEX1RJTSAqLwotCXdoaWxlICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMikpICYmCi0JCQkoYmVhY29uW3RpbV9pZHhdICE9IFdMQU5fRUlEX1RJTSkpCi0JCXRpbV9pZHggKz0gYmVhY29uW3RpbV9pZHgrMV0gKyAyOwotCi0JLyogSWYgVElNIGZpZWxkIHdhcyBmb3VuZCwgc2V0IHZhcmlhYmxlcyAqLwotCWlmICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMSkpICYmIChiZWFjb25bdGltX2lkeF0gPT0gV0xBTl9FSURfVElNKSkgewotCQl0eF9iZWFjb25fY21kLT50aW1faWR4ID0gY3B1X3RvX2xlMTYodGltX2lkeCk7Ci0JCXR4X2JlYWNvbl9jbWQtPnRpbV9zaXplID0gYmVhY29uW3RpbV9pZHgrMV07Ci0JfSBlbHNlCi0JCUlXTF9XQVJOKHByaXYsICJVbmFibGUgdG8gZmluZCBUSU0gRWxlbWVudCBpbiBiZWFjb25cbiIpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGl3bDQ5NjVfaHdfZ2V0X2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgaXdsX2ZyYW1lICpmcmFtZSkKLXsKLQlzdHJ1Y3QgaXdsX3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7Ci0JdTMyIGZyYW1lX3NpemU7Ci0JdTMyIHJhdGVfZmxhZ3M7Ci0JdTMyIHJhdGU7Ci0JLyoKLQkgKiBXZSBoYXZlIHRvIHNldCB1cCB0aGUgVFggY29tbWFuZCwgdGhlIFRYIEJlYWNvbiBjb21tYW5kLCBhbmQgdGhlCi0JICogYmVhY29uIGNvbnRlbnRzLgotCSAqLwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5iZWFjb25fY3R4KSB7Ci0JCUlXTF9FUlIocHJpdiwgInRyeWluZyB0byBidWlsZCBiZWFjb24gdy9vIGJlYWNvbiBjb250ZXh0IVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIEluaXRpYWxpemUgbWVtb3J5ICovCi0JdHhfYmVhY29uX2NtZCA9ICZmcmFtZS0+dS5iZWFjb247Ci0JbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCi0JLyogU2V0IHVwIFRYIGJlYWNvbiBjb250ZW50cyAqLwotCWZyYW1lX3NpemUgPSBpd2w0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHByaXYsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAotCQkJCXNpemVvZihmcmFtZS0+dSkgLSBzaXplb2YoKnR4X2JlYWNvbl9jbWQpKTsKLQlpZiAoV0FSTl9PTl9PTkNFKGZyYW1lX3NpemUgPiBNQVhfTVBEVV9TSVpFKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFmcmFtZV9zaXplKQotCQlyZXR1cm4gMDsKLQotCS8qIFNldCB1cCBUWCBjb21tYW5kIGZpZWxkcyAqLwotCXR4X2JlYWNvbl9jbWQtPnR4LmxlbiA9IGNwdV90b19sZTE2KCh1MTYpZnJhbWVfc2l6ZSk7Ci0JdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0gcHJpdi0+YmVhY29uX2N0eC0+YmNhc3Rfc3RhX2lkOwotCXR4X2JlYWNvbl9jbWQtPnR4LnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCXR4X2JlYWNvbl9jbWQtPnR4LnR4X2ZsYWdzID0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSyB8Ci0JCVRYX0NNRF9GTEdfVFNGX01TSyB8IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOwotCi0JLyogU2V0IHVwIFRYIGJlYWNvbiBjb21tYW5kIGZpZWxkcyAqLwotCWl3bDQ5NjVfc2V0X2JlYWNvbl90aW0ocHJpdiwgdHhfYmVhY29uX2NtZCwgKHU4ICopdHhfYmVhY29uX2NtZC0+ZnJhbWUsCi0JCQkgICBmcmFtZV9zaXplKTsKLQotCS8qIFNldCB1cCBwYWNrZXQgcmF0ZSBhbmQgZmxhZ3MgKi8KLQlyYXRlID0gaXdsX2xlZ2FjeV9nZXRfbG93ZXN0X3BsY3AocHJpdiwgcHJpdi0+YmVhY29uX2N0eCk7Ci0JcHJpdi0+bWdtdF90eF9hbnQgPSBpd2w0OTY1X3RvZ2dsZV90eF9hbnQocHJpdiwgcHJpdi0+bWdtdF90eF9hbnQsCi0JCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCXJhdGVfZmxhZ3MgPSBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwotCWlmICgocmF0ZSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlIDw9IElXTF9MQVNUX0NDS19SQVRFKSkKLQkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOwotCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLAotCQkJcmF0ZV9mbGFncyk7Ci0KLQlyZXR1cm4gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSArIGZyYW1lX3NpemU7Ci19Ci0KLWludCBpd2w0OTY1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9mcmFtZSAqZnJhbWU7Ci0JdW5zaWduZWQgaW50IGZyYW1lX3NpemU7Ci0JaW50IHJjOwotCi0JZnJhbWUgPSBpd2w0OTY1X2dldF9mcmVlX2ZyYW1lKHByaXYpOwotCWlmICghZnJhbWUpIHsKLQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IG9idGFpbiBmcmVlIGZyYW1lIGJ1ZmZlciBmb3IgYmVhY29uICIKLQkJCSAgImNvbW1hbmQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZnJhbWVfc2l6ZSA9IGl3bDQ5NjVfaHdfZ2V0X2JlYWNvbl9jbWQocHJpdiwgZnJhbWUpOwotCWlmICghZnJhbWVfc2l6ZSkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBjb25maWd1cmluZyB0aGUgYmVhY29uIGNvbW1hbmRcbiIpOwotCQlpd2w0OTY1X2ZyZWVfZnJhbWUocHJpdiwgZnJhbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1RYX0JFQUNPTiwgZnJhbWVfc2l6ZSwKLQkJCSAgICAgICZmcmFtZS0+dS5jbWRbMF0pOwotCi0JaXdsNDk2NV9mcmVlX2ZyYW1lKHByaXYsIGZyYW1lKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bDQ5NjVfdGZkX3RiX2dldF9hZGRyKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQotCWRtYV9hZGRyX3QgYWRkciA9IGdldF91bmFsaWduZWRfbGUzMigmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWFkZHIgfD0KLQkJKChkbWFfYWRkcl90KShsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pICYgMHhGKSA8PCAxNikgPDwgMTY7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotc3RhdGljIGlubGluZSB1MTYgaXdsNDk2NV90ZmRfdGJfZ2V0X2xlbihzdHJ1Y3QgaXdsX3RmZCAqdGZkLCB1OCBpZHgpCi17Ci0Jc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07Ci0KLQlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsNDk2NV90ZmRfc2V0X3RiKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCwKLQkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKLQotCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOwotCi0JdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOwotCi0JdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKLX0KLQotc3RhdGljIGlubGluZSB1OCBpd2w0OTY1X3RmZF9nZXRfbnVtX3RicyhzdHJ1Y3QgaXdsX3RmZCAqdGZkKQotewotCXJldHVybiB0ZmQtPm51bV90YnMgJiAweDFmOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkIC0gRnJlZSBhbGwgY2h1bmtzIHJlZmVyZW5jZWQgYnkgVEZEIFt0eHEtPnEucmVhZF9wdHJdCi0gKiBAcHJpdiAtIGRyaXZlciBwcml2YXRlIGRhdGEKLSAqIEB0eHEgLSB0eCBxdWV1ZQotICoKLSAqIERvZXMgTk9UIGFkdmFuY2UgYW55IFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpbmRleGVzCi0gKiBEb2VzIE5PVCBmcmVlIHRoZSBURkQgaXRzZWxmICh3aGljaCBpcyB3aXRoaW4gY2lyY3VsYXIgYnVmZmVyKQotICovCi12b2lkIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCXN0cnVjdCBpd2xfdGZkICp0ZmRfdG1wID0gKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzOwotCXN0cnVjdCBpd2xfdGZkICp0ZmQ7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IHByaXYtPnBjaV9kZXY7Ci0JaW50IGluZGV4ID0gdHhxLT5xLnJlYWRfcHRyOwotCWludCBpOwotCWludCBudW1fdGJzOwotCi0JdGZkID0gJnRmZF90bXBbaW5kZXhdOwotCi0JLyogU2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBjaHVua3MgKi8KLQludW1fdGJzID0gaXdsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKLQotCWlmIChudW1fdGJzID49IElXTF9OVU1fT0ZfVEJTKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOwotCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KLQkJcmV0dXJuOwotCX0KLQotCS8qIFVubWFwIHR4X2NtZCAqLwotCWlmIChudW1fdGJzKQotCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwKLQkJCQlkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2luZGV4XSwgbWFwcGluZyksCi0JCQkJZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2luZGV4XSwgbGVuKSwKLQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JLyogVW5tYXAgY2h1bmtzLCBpZiBhbnkuICovCi0JZm9yIChpID0gMTsgaSA8IG51bV90YnM7IGkrKykKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGl3bDQ5NjVfdGZkX3RiX2dldF9hZGRyKHRmZCwgaSksCi0JCQkJaXdsNDk2NV90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpLAotCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogZnJlZSBTS0IgKi8KLQlpZiAodHhxLT50eGIpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlza2IgPSB0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYjsKLQotCQkvKiBjYW4gYmUgY2FsbGVkIGZyb20gaXJxcy1kaXNhYmxlZCBjb250ZXh0ICovCi0JCWlmIChza2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQl0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdLnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLWludCBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLAotCQkJCSB1OCByZXNldCwgdTggcGFkKQotewotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZCwgKnRmZF90bXA7Ci0JdTMyIG51bV90YnM7Ci0KLQlxID0gJnR4cS0+cTsKLQl0ZmRfdG1wID0gKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzOwotCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07Ci0KLQlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7Ci0KLQludW1fdGJzID0gaXdsNDk2NV90ZmRfZ2V0X251bV90YnModGZkKTsKLQotCS8qIEVhY2ggVEZEIGNhbiBwb2ludCB0byBhIG1heGltdW0gMjAgVHggYnVmZmVycyAqLwotCWlmIChudW1fdGJzID49IElXTF9OVU1fT0ZfVEJTKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAotCQkJICBJV0xfTlVNX09GX1RCUyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUJVR19PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpOwotCWlmICh1bmxpa2VseShhZGRyICYgfklXTF9UWF9ETUFfTUFTSykpCi0JCUlXTF9FUlIocHJpdiwgIlVuYWxpZ25lZCBhZGRyZXNzID0gJWxseFxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKLQotCWl3bDQ5NjVfdGZkX3NldF90Yih0ZmQsIG51bV90YnMsIGFkZHIsIGxlbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRlbGwgbmljIHdoZXJlIHRvIGZpbmQgY2lyY3VsYXIgYnVmZmVyIG9mIFR4IEZyYW1lIERlc2NyaXB0b3JzIGZvcgotICogZ2l2ZW4gVHggcXVldWUsIGFuZCBlbmFibGUgdGhlIERNQSBjaGFubmVsIHVzZWQgZm9yIHRoYXQgcXVldWUuCi0gKgotICogNDk2NSBzdXBwb3J0cyB1cCB0byAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwgbWFwcGVkIHRvIHVwIHRvIDggVHggRE1BCi0gKiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuCi0gKi8KLWludCBpd2w0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCi0JLyogQ2lyY3VsYXIgYnVmZmVyIChURkQgcXVldWUgaW4gRFJBTSkgcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fQ0JCQ19RVUVVRSh0eHFfaWQpLAotCQkJICAgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdlbmVyaWMgUlggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9yZXBseV9hbGl2ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9hbGl2ZV9yZXNwICpwYWxpdmU7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqcHdvcms7Ci0KLQlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIgotCQkgICAgICAgIjB4JTAxWCAweCUwMVhcbiIsCi0JCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLAotCQkgICAgICAgcGFsaXZlLT52ZXJfc3VidHlwZSk7Ci0KLQlpZiAocGFsaXZlLT52ZXJfc3VidHlwZSA9PSBJTklUSUFMSVpFX1NVQlRZUEUpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemF0aW9uIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0JCW1lbWNweSgmcHJpdi0+Y2FyZF9hbGl2ZV9pbml0LAotCQkgICAgICAgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2luaXRfYWxpdmVfcmVzcCkpOwotCQlwd29yayA9ICZwcml2LT5pbml0X2FsaXZlX3N0YXJ0OwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0JCW1lbWNweSgmcHJpdi0+Y2FyZF9hbGl2ZSwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQkJcHdvcmsgPSAmcHJpdi0+YWxpdmVfc3RhcnQ7Ci0JfQotCi0JLyogV2UgZGVsYXkgdGhlIEFMSVZFIHJlc3BvbnNlIGJ5IDVtcyB0bwotCSAqIGdpdmUgdGhlIEhXIFJGIEtpbGwgdGltZSB0byBhY3RpdmF0ZS4uLiAqLwotCWlmIChwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCBwd29yaywKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKDUpKTsKLQllbHNlCi0JCUlXTF9XQVJOKHByaXYsICJ1Q29kZSBkaWQgbm90IHJlc3BvbmQgT0suXG4iKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWMgLSBUaW1lciBjYWxsYmFjayB0byBxdWV1ZSBzdGF0aXN0aWNzCi0gKgotICogVGhpcyBjYWxsYmFjayBpcyBwcm92aWRlZCBpbiBvcmRlciB0byBzZW5kIGEgc3RhdGlzdGljcyByZXF1ZXN0LgotICoKLSAqIFRoaXMgdGltZXIgZnVuY3Rpb24gaXMgY29udGludWFsbHkgcmVzZXQgdG8gZXhlY3V0ZSB3aXRoaW4KLSAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OCi0gKiB3YXMgcmVjZWl2ZWQuICBXZSBuZWVkIHRvIGVuc3VyZSB3ZSByZWNlaXZlIHRoZSBzdGF0aXN0aWNzIGluIG9yZGVyCi0gKiB0byB1cGRhdGUgdGhlIHRlbXBlcmF0dXJlIHVzZWQgZm9yIGNhbGlicmF0aW5nIHRoZSBUWFBPV0VSLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWModW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilkYXRhOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBkb250IHNlbmQgaG9zdCBjb21tYW5kIGlmIHJmLWtpbGwgaXMgb24gKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpCi0JCXJldHVybjsKLQotCWl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX0FTWU5DLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9Ci0JCShzdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgKilwa3QtPnUucmF3OwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXU4IHJhdGUgPSBpd2w0OTY1X2h3X2dldF9yYXRlKGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZV9uX2ZsYWdzKTsKLQotCUlXTF9ERUJVR19SWChwcml2LCAiYmVhY29uIHN0YXR1cyAleCByZXRyaWVzICVkIGlzcyAlZCAiCi0JCSJ0c2YgJWQgJWQgcmF0ZSAlZFxuIiwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci51LnN0YXR1cykgJiBUWF9TVEFUVVNfTVNLLAotCQliZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLmZhaWx1cmVfZnJhbWUsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5oaWdoX3RzZiksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+bG93X3RzZiksIHJhdGUpOwotI2VuZGlmCi0KLQlwcml2LT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlN0b3AgYWxsIHF1ZXVlc1xuIik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKLQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKLQotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKLQkJCUNTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUKTsKLQlpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkKLQkJaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBIYW5kbGUgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUgdGhhdCBjYXJkJ3MgcG93ZXIgc3RhdGUgaXMgY2hhbmdpbmcKLSAqIGR1ZSB0byBzb2Z0d2FyZSwgaGFyZHdhcmUsIG9yIGNyaXRpY2FsIHRlbXBlcmF0dXJlIFJGS0lMTCAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9jYXJkX3N0YXRlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gcHJpdi0+c3RhdHVzOwotCi0JSVdMX0RFQlVHX1JGX0tJTEwocHJpdiwgIkNhcmQgc3RhdGUgcmVjZWl2ZWQ6IEhXOiVzIFNXOiVzIENUOiVzXG4iLAotCQkJICAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIsCi0JCQkgIChmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKLQkJCSAgKGZsYWdzICYgQ1RfQ0FSRF9ESVNBQkxFRCkgPwotCQkJICAiUmVhY2hlZCIgOiAiTm90IHJlYWNoZWQiKTsKLQotCWlmIChmbGFncyAmIChTV19DQVJEX0RJU0FCTEVEIHwgSFdfQ0FSRF9ESVNBQkxFRCB8Ci0JCSAgICAgQ1RfQ0FSRF9ESVNBQkxFRCkpIHsKLQotCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCi0JCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NQlhfQywKLQkJCQkJSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOwotCi0JCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkgewotCQkJaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkJCSAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOwotCQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUJYX0MsCi0JCQkJCUhCVVNfVEFSR19NQlhfQ19SRUdfQklUX0NNRF9CTE9DS0VEKTsKLQkJfQotCX0KLQotCWlmIChmbGFncyAmIENUX0NBUkRfRElTQUJMRUQpCi0JCWl3bDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2socHJpdik7Ci0KLQlpZiAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIShmbGFncyAmIFJYT05fQ0FSRF9ESVNBQkxFRCkpCi0JCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwocHJpdik7Ci0KLQlpZiAoKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmc3RhdHVzKSAhPQotCSAgICAgdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKSkKLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksCi0JCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCWVsc2UKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3NldHVwX3J4X2hhbmRsZXJzIC0gSW5pdGlhbGl6ZSBSeCBoYW5kbGVyIGNhbGxiYWNrcwotICoKLSAqIFNldHVwIHRoZSBSWCBoYW5kbGVycyBmb3IgZWFjaCBvZiB0aGUgcmVwbHkgdHlwZXMgc2VudCBmcm9tIHRoZSB1Q29kZQotICogdG8gdGhlIGhvc3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjaGFpbnMgaW50byB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgZm9yIHRoZW0gdG8gc2V0dXAKLSAqIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBoYW5kbGVycyBhcyB3ZWxsLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldHVwX3J4X2hhbmRsZXJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9BTElWRV0gPSBpd2w0OTY1X3J4X3JlcGx5X2FsaXZlOwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0VSUk9SXSA9IGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3I7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfY3NhOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OXSA9Ci0JCQlpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fU0xFRVBfTk9USUZJQ0FUSU9OXSA9IGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUE1fREVCVUdfU1RBVElTVElDX05PVElGSUNdID0KLQkgICAgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9iZWFjb25fbm90aWY7Ci0KLQkvKgotCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQotCSAqIHN0YXRpc3RpY3MgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYwotCSAqIHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCi0JICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfU1RBVElTVElDU19DTURdID0gaXdsNDk2NV9yZXBseV9zdGF0aXN0aWNzOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OXSA9IGl3bDQ5NjVfcnhfc3RhdGlzdGljczsKLQotCWl3bF9sZWdhY3lfc2V0dXBfcnhfc2Nhbl9oYW5kbGVycyhwcml2KTsKLQotCS8qIHN0YXR1cyBjaGFuZ2UgaGFuZGxlciAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW0NBUkRfU1RBVEVfTk9USUZJQ0FUSU9OXSA9Ci0JCQkJCWl3bDQ5NjVfcnhfY2FyZF9zdGF0ZV9ub3RpZjsKLQotCXByaXYtPnJ4X2hhbmRsZXJzW01JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTl0gPQotCSAgICBpd2w0OTY1X3J4X21pc3NlZF9iZWFjb25fbm90aWY7Ci0JLyogUnggaGFuZGxlcnMgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9SWF9QSFlfQ01EXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5OwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYX01QRFVfQ01EXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcng7Ci0JLyogYmxvY2sgYWNrICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfQ09NUFJFU1NFRF9CQV0gPSBpd2w0OTY1X3J4X3JlcGx5X2NvbXByZXNzZWRfYmE7Ci0JLyogU2V0IHVwIGhhcmR3YXJlIHNwZWNpZmljIFJ4IGhhbmRsZXJzICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+cnhfaGFuZGxlcl9zZXR1cChwcml2KTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQotICoKLSAqIFVzZXMgdGhlIHByaXYtPnJ4X2hhbmRsZXJzIGNhbGxiYWNrIGZ1bmN0aW9uIGFycmF5IHRvIGludm9rZQotICogdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXJzLCBpbmNsdWRpbmcgY29tbWFuZCByZXNwb25zZXMsCi0gKiBmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb25zLCBhbmQgb3RoZXIgbm90aWZpY2F0aW9ucy4KLSAqLwotdm9pZCBpd2w0OTY1X3J4X2hhbmRsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGI7Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCXUzMiByLCBpOwotCWludCByZWNsYWltOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggZmlsbF9yeCA9IDA7Ci0JdTMyIGNvdW50ID0gODsKLQlpbnQgdG90YWxfZW1wdHk7Ci0KLQkvKiB1Q29kZSdzIHJlYWQgaW5kZXggKHN0b3JlZCBpbiBzaGFyZWQgRFJBTSkgaW5kaWNhdGVzIHRoZSBsYXN0IFJ4Ci0JICogYnVmZmVyIHRoYXQgdGhlIGRyaXZlciBtYXkgcHJvY2VzcyAobGFzdCBidWZmZXIgZmlsbGVkIGJ5IHVjb2RlKS4gKi8KLQlyID0gbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT5jbG9zZWRfcmJfbnVtKSAmICAweDBGRkY7Ci0JaSA9IHJ4cS0+cmVhZDsKLQotCS8qIFJ4IGludGVycnVwdCwgYnV0IG5vdGhpbmcgc2VudCBmcm9tIHVDb2RlICovCi0JaWYgKGkgPT0gcikKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZFxuIiwgciwgaSk7Ci0KLQkvKiBjYWxjdWxhdGUgdG90YWwgZnJhbWVzIG5lZWQgdG8gYmUgcmVzdG9jayBhZnRlciBoYW5kbGluZyBSWCAqLwotCXRvdGFsX2VtcHR5ID0gciAtIHJ4cS0+d3JpdGVfYWN0dWFsOwotCWlmICh0b3RhbF9lbXB0eSA8IDApCi0JCXRvdGFsX2VtcHR5ICs9IFJYX1FVRVVFX1NJWkU7Ci0KLQlpZiAodG90YWxfZW1wdHkgPiAoUlhfUVVFVUVfU0laRSAvIDIpKQotCQlmaWxsX3J4ID0gMTsKLQotCXdoaWxlIChpICE9IHIpIHsKLQkJaW50IGxlbjsKLQotCQlyeGIgPSByeHEtPnF1ZXVlW2ldOwotCi0JCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKLQkJICogdGhlbiBhIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBxdWV1ZSByZWZpbGxpbmcKLQkJICogcm91dGluZXMgLS0gY2F0Y2ggaXQgaGVyZSAqLwotCQlCVUdfT04ocnhiID09IE5VTEwpOwotCi0JCXJ4cS0+cXVldWVbaV0gPSBOVUxMOwotCi0JCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCi0JCQkgICAgICAgUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0KLQkJbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQkJbGVuICs9IHNpemVvZih1MzIpOyAvKiBhY2NvdW50IGZvciBzdGF0dXMgd29yZCAqLwotCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOwotCi0JCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKLQkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KLQkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAotCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCi0JCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAotCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KLQkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYX1BIWV9DTUQpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9SWF9NUERVX0NNRCkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfQ09NUFJFU1NFRF9CQSkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gU1RBVElTVElDU19OT1RJRklDQVRJT04pICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1RYKTsKLQotCQkvKiBCYXNlZCBvbiB0eXBlIG9mIGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uLAotCQkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCi0JCSAqICAgcnhfaGFuZGxlcnMgdGFibGUuICBTZWUgaXdsNDk2NV9zZXR1cF9yeF9oYW5kbGVycygpICovCi0JCWlmIChwcml2LT5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7Ci0JCQlJV0xfREVCVUdfUlgocHJpdiwgInIgPSAlZCwgaSA9ICVkLCAlcywgMHglMDJ4XG4iLCByLAotCQkJCWksIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwKLQkJCQlwa3QtPmhkci5jbWQpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0rKzsKLQkJCXByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKHByaXYsIHJ4Yik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBObyBoYW5kbGluZyBuZWVkZWQgKi8KLQkJCUlXTF9ERUJVR19SWChwcml2LAotCQkJCSJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsCi0JCQkJciwgaSwgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLAotCQkJCXBrdC0+aGRyLmNtZCk7Ci0JCX0KLQotCQkvKgotCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCi0JCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKLQkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgcnhfaGFuZGxlciBtaWdodCBoYXZlCi0JCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgotCQkgKi8KLQotCQlpZiAocmVjbGFpbSkgewotCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAotCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nIGl3bF9sZWdhY3lfc2VuZF9jbWQoKQotCQkJICogYXMgd2UgcmVjbGFpbSB0aGUgZHJpdmVyIGNvbW1hbmQgcXVldWUgKi8KLQkJCWlmIChyeGItPnBhZ2UpCi0JCQkJaXdsX2xlZ2FjeV90eF9jbWRfY29tcGxldGUocHJpdiwgcnhiKTsKLQkJCWVsc2UKLQkJCQlJV0xfV0FSTihwcml2LCAiQ2xhaW0gbnVsbCByeGI/XG4iKTsKLQkJfQotCi0JCS8qIFJldXNlIHRoZSBwYWdlIGlmIHBvc3NpYmxlLiBGb3Igbm90aWZpY2F0aW9uIHBhY2tldHMgYW5kCi0JCSAqIFNLQnMgdGhhdCBmYWlsIHRvIFJ4IGNvcnJlY3RseSwgYWRkIHRoZW0gYmFjayBpbnRvIHRoZQotCQkgKiByeF9mcmVlIGxpc3QgZm9yIHJldXNlIGxhdGVyLiAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChyeGItPnBhZ2UgIT0gTlVMTCkgewotCQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeGItPnBhZ2UsCi0JCQkJMCwgUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOwotCQkJcnhxLT5mcmVlX2NvdW50Kys7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlpID0gKGkgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCS8qIElmIHRoZXJlIGFyZSBhIGxvdCBvZiB1bnVzZWQgZnJhbWVzLAotCQkgKiByZXN0b2NrIHRoZSBSeCBxdWV1ZSBzbyB1Y29kZSB3b250IGFzc2VydC4gKi8KLQkJaWYgKGZpbGxfcngpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZiAoY291bnQgPj0gOCkgewotCQkJCXJ4cS0+cmVhZCA9IGk7Ci0JCQkJaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHByaXYpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEJhY2t0cmFjayBvbmUgZW50cnkgKi8KLQlyeHEtPnJlYWQgPSBpOwotCWlmIChmaWxsX3J4KQotCQlpd2w0OTY1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JZWxzZQotCQlpd2w0OTY1X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7Ci19Ci0KLS8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmbHVzaCBhbnkgc2NoZWR1bGVkIHRhc2tsZXQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2w0OTY1X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KLQlzeW5jaHJvbml6ZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxKTsKLQl0YXNrbGV0X2tpbGwoJnByaXYtPmlycV90YXNrbGV0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9pcnFfdGFza2xldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGludGEsIGhhbmRsZWQgPSAwOwotCXUzMiBpbnRhX2ZoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JdTMyIGludGFfbWFzazsKLSNlbmRpZgotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCi0JICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCi0JICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCi0JaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgaW50YSk7Ci0KLQkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyBmbG93LWhhbmRsZXIgKERNQSkgaW50ZXJydXB0cy4KLQkgKiBBbnkgbmV3IGludGVycnVwdHMgdGhhdCBoYXBwZW4gYWZ0ZXIgdGhpcywgZWl0aGVyIHdoaWxlIHdlJ3JlCi0JICogaW4gdGhpcyB0YXNrbGV0LCBvciBsYXRlciwgd2lsbCBzaG93IHVwIGluIG5leHQgSVNSL3Rhc2tsZXQuICovCi0JaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLCBpbnRhX2ZoKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9JU1IpIHsKLQkJLyoganVzdCBmb3IgZGVidWcgKi8KLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwKLQkJCSAgICAgIGludGEsIGludGFfbWFzaywgaW50YV9maCk7Ci0JfQotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKLQkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0Ci0JICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCi0JICogcmVhZGluZyBDU1JfSU5ULiAqLwotCWlmIChpbnRhX2ZoICYgQ1NSNDlfRkhfSU5UX1JYX01BU0spCi0JCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7Ci0JaWYgKGludGFfZmggJiBDU1I0OV9GSF9JTlRfVFhfTUFTSykKLQkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKLQotCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkhhcmR3YXJlIGVycm9yIGRldGVjdGVkLiAgUmVzdGFydGluZy5cbiIpOwotCi0JCS8qIFRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCQlwcml2LT5pc3Jfc3RhdHMuaHcrKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfSFdfRVJSOwotCi0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgewotCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKLQkJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnNjaCsrOwotCQl9Ci0KLQkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCi0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIkFsaXZlIGludGVycnVwdFxuIik7Ci0JCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUrKzsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCi0JaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKLQotCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKLQkJaW50IGh3X3JmX2tpbGwgPSAwOwotCQlpZiAoIShpd2xfcmVhZDMyKHByaXYsIENTUl9HUF9DTlRSTCkgJgotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKSkKLQkJCWh3X3JmX2tpbGwgPSAxOwotCi0JCUlXTF9XQVJOKHByaXYsICJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKLQkJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOwotCi0JCXByaXYtPmlzcl9zdGF0cy5yZmtpbGwrKzsKLQotCQkvKiBkcml2ZXIgb25seSBsb2FkcyB1Y29kZSBvbmNlIHNldHRpbmcgdGhlIGludGVyZmFjZSB1cC4KLQkJICogdGhlIGRyaXZlciBhbGxvd3MgbG9hZGluZyB0aGUgdWNvZGUgZXZlbiBpZiB0aGUgcmFkaW8KLQkJICogaXMga2lsbGVkLiBIZW5jZSB1cGRhdGUgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgaGVyZS4gVGhlCi0JCSAqIHJma2lsbCBoYW5kbGVyIHdpbGwgY2FyZSBhYm91dCByZXN0YXJ0aW5nIGlmIG5lZWRlZC4KLQkJICovCi0JCWlmICghdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJaWYgKGh3X3JmX2tpbGwpCi0JCQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCQllbHNlCi0JCQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQkJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCBod19yZl9raWxsKTsKLQkJfQotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfUkZfS0lMTDsKLQl9Ci0KLQkvKiBDaGlwIGdvdCB0b28gaG90IGFuZCBzdG9wcGVkIGl0c2VsZiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQ1RfS0lMTCkgewotCQlJV0xfRVJSKHByaXYsICJNaWNyb2NvZGUgQ1Qga2lsbCBlcnJvciBkZXRlY3RlZC5cbiIpOwotCQlwcml2LT5pc3Jfc3RhdHMuY3RraWxsKys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfQ1RfS0lMTDsKLQl9Ci0KLQkvKiBFcnJvciBkZXRlY3RlZCBieSB1Q29kZSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU1dfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIgotCQkJIiBSZXN0YXJ0aW5nIDB4JVguXG4iLCBpbnRhKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnN3Kys7Ci0JCWl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcihwcml2KTsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9TV19FUlI7Ci0JfQotCi0JLyoKLQkgKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwLgotCSAqIFRlbGwgZGV2aWNlIGFib3V0IGFueSBuZXcgdHggb3IgaG9zdCBjb21tYW5kcyBlbnF1ZXVlZCwKLQkgKiBhbmQgYWJvdXQgYW55IFJ4IGJ1ZmZlcnMgbWFkZSBhdmFpbGFibGUgd2hpbGUgYXNsZWVwLgotCSAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfV0FLRVVQKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIldha2V1cCBpbnRlcnJ1cHRcbiIpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnJ4cSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykKLQkJCWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgJnByaXYtPnR4cVtpXSk7Ci0JCXByaXYtPmlzcl9zdGF0cy53YWtldXArKzsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9XQUtFVVA7Ci0JfQotCi0JLyogQWxsIHVDb2RlIGNvbW1hbmQgcmVzcG9uc2VzLCBpbmNsdWRpbmcgVHggY29tbWFuZCByZXNwb25zZXMsCi0JICogUnggInJlc3BvbnNlcyIgKGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbiksIGFuZCBvdGhlcgotCSAqIG5vdGlmaWNhdGlvbnMgZnJvbSB1Q29kZSBjb21lIHRocm91Z2ggaGVyZSovCi0JaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpIHsKLQkJaXdsNDk2NV9yeF9oYW5kbGUocHJpdik7Ci0JCXByaXYtPmlzcl9zdGF0cy5yeCsrOwotCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKLQl9Ci0KLQkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJ1Q29kZSBsb2FkIGludGVycnVwdFxuIik7Ci0JCXByaXYtPmlzcl9zdGF0cy50eCsrOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0ZIX1RYOwotCQkvKiBXYWtlIHVwIHVDb2RlIGxvYWQgcm91dGluZSwgbm93IHRoYXQgbG9hZCBpcyBjb21wbGV0ZSAqLwotCQlwcml2LT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDE7Ci0JCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0JfQotCi0JaWYgKGludGEgJiB+aGFuZGxlZCkgewotCQlJV0xfRVJSKHByaXYsICJVbmhhbmRsZWQgSU5UQSBiaXRzIDB4JTA4eFxuIiwgaW50YSAmIH5oYW5kbGVkKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnVuaGFuZGxlZCsrOwotCX0KLQotCWlmIChpbnRhICYgfihwcml2LT5pbnRhX21hc2spKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKLQkJCSBpbnRhICYgfnByaXYtPmludGFfbWFzayk7Ci0JCUlXTF9XQVJOKHByaXYsICIgICB3aXRoIEZIX0lOVCA9IDB4JTA4eFxuIiwgaW50YV9maCk7Ci0JfQotCi0JLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cykpCi0JCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JLyogUmUtZW5hYmxlIFJGX0tJTEwgaWYgaXQgb2NjdXJyZWQgKi8KLQllbHNlIGlmIChoYW5kbGVkICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkKLQkJaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIChJV0xfRExfSVNSKSkgewotCQlpbnRhID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UKTsKLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlpbnRhX2ZoID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwKLQkJCSJFbmQgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHgsICIKLQkJCSJmbGFncyAweCUwOGx4XG4iLCBpbnRhLCBpbnRhX21hc2ssIGludGFfZmgsIGZsYWdzKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogc3lzZnMgYXR0cmlidXRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCi0vKgotICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IGF0dHJpYnV0ZSB0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24KLSAqIG9mIHRoaXMgZGV2aWNlIGRyaXZlciAoaS5lLiBhIG5ldyBmaWxlIGluIC9zeXMvY2xhc3MvbmV0L3dsYW4wL2RldmljZS8pCi0gKiB1c2VkIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgbGV2ZWwuCi0gKgotICogU2VlIHRoZSBsZXZlbCBkZWZpbml0aW9ucyBpbiBpd2wgZm9yIGRldGFpbHMuCi0gKgotICogVGhlIGRlYnVnX2xldmVsIGJlaW5nIG1hbmFnZWQgdXNpbmcgc3lzZnMgYmVsb3cgaXMgYSBwZXIgZGV2aWNlIGRlYnVnCi0gKiBsZXZlbCB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIGlmIGl0ICh0aGUgcGVyCi0gKiBkZXZpY2UgZGVidWcgbGV2ZWwpIGlzIHNldC4KLSAqLwotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zaG93X2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2w0OTY1X3N0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7Ci0JZWxzZSB7Ci0JCXByaXYtPmRlYnVnX2xldmVsID0gdmFsOwotCQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCX0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCWl3bDQ5NjVfc2hvd19kZWJ1Z19sZXZlbCwgaXdsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbCk7Ci0KLQotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwotCi0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwcml2LT50ZW1wZXJhdHVyZSk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgaXdsNDk2NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10KTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQpCi0JCUlXTF9JTkZPKHByaXYsICIlcyBpcyBub3QgaW4gZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKLQllbHNlIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgdmFsLCBmYWxzZSk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgc2V0dGluZyB0eCBwb3dlciAoMHglZCkuXG4iLAotCQkJCXJldCk7Ci0JCWVsc2UKLQkJCXJldCA9IGNvdW50OwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJaXdsNDk2NV9zaG93X3R4X3Bvd2VyLCBpd2w0OTY1X3N0b3JlX3R4X3Bvd2VyKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKml3bF9zeXNmc19lbnRyaWVzW10gPSB7Ci0JJmRldl9hdHRyX3RlbXBlcmF0dXJlLmF0dHIsCi0JJmRldl9hdHRyX3R4X3Bvd2VyLmF0dHIsCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JJmRldl9hdHRyX2RlYnVnX2xldmVsLmF0dHIsCi0jZW5kaWYKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpd2xfYXR0cmlidXRlX2dyb3VwID0gewotCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCi0JLmF0dHJzID0gaXdsX3N5c2ZzX2VudHJpZXMsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9kZWFsbG9jX3Vjb2RlX3BjaShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2NvZGUpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXApOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfbmljX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBSZW1vdmUgYWxsIHJlc2V0cyB0byBhbGxvdyBOSUMgdG8gb3BlcmF0ZSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsCi0JCQkJCXZvaWQgKmNvbnRleHQpOwotc3RhdGljIGludCBpd2w0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCQl1MzIgbWF4X3Byb2JlX2xlbmd0aCk7Ci0KLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGl3bDQ5NjVfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgZmlyc3QpCi17Ci0JY29uc3QgY2hhciAqbmFtZV9wcmUgPSBwcml2LT5jZmctPmZ3X25hbWVfcHJlOwotCWNoYXIgdGFnWzhdOwotCi0JaWYgKGZpcnN0KSB7Ci0JCXByaXYtPmZ3X2luZGV4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwotCQlzcHJpbnRmKHRhZywgIiVkIiwgcHJpdi0+ZndfaW5kZXgpOwotCX0gZWxzZSB7Ci0JCXByaXYtPmZ3X2luZGV4LS07Ci0JCXNwcmludGYodGFnLCAiJWQiLCBwcml2LT5md19pbmRleCk7Ci0JfQotCi0JaWYgKHByaXYtPmZ3X2luZGV4IDwgcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluKSB7Ci0JCUlXTF9FUlIocHJpdiwgIm5vIHN1aXRhYmxlIGZpcm13YXJlIGZvdW5kIVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCXNwcmludGYocHJpdi0+ZmlybXdhcmVfbmFtZSwgIiVzJXMlcyIsIG5hbWVfcHJlLCB0YWcsICIudWNvZGUiKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJhdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgJyVzJ1xuIiwKLQkJICAgICAgIHByaXYtPmZpcm13YXJlX25hbWUpOwotCi0JcmV0dXJuIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBwcml2LT5maXJtd2FyZV9uYW1lLAotCQkJCSAgICAgICAmcHJpdi0+cGNpX2Rldi0+ZGV2LCBHRlBfS0VSTkVMLCBwcml2LAotCQkJCSAgICAgICBpd2w0OTY1X3Vjb2RlX2NhbGxiYWNrKTsKLX0KLQotc3RydWN0IGl3bDQ5NjVfZmlybXdhcmVfcGllY2VzIHsKLQljb25zdCB2b2lkICppbnN0LCAqZGF0YSwgKmluaXQsICppbml0X2RhdGEsICpib290OwotCXNpemVfdCBpbnN0X3NpemUsIGRhdGFfc2l6ZSwgaW5pdF9zaXplLCBpbml0X2RhdGFfc2l6ZSwgYm9vdF9zaXplOwotfTsKLQotc3RhdGljIGludCBpd2w0OTY1X2xvYWRfZmlybXdhcmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdywKLQkJCQkgICAgICAgc3RydWN0IGl3bDQ5NjVfZmlybXdhcmVfcGllY2VzICpwaWVjZXMpCi17Ci0Jc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKnVjb2RlID0gKHZvaWQgKil1Y29kZV9yYXctPmRhdGE7Ci0JdTMyIGFwaV92ZXIsIGhkcl9zaXplOwotCWNvbnN0IHU4ICpzcmM7Ci0KLQlwcml2LT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKLQlhcGlfdmVyID0gSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpOwotCi0Jc3dpdGNoIChhcGlfdmVyKSB7Ci0JZGVmYXVsdDoKLQljYXNlIDA6Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJaGRyX3NpemUgPSAyNDsKLQkJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IGhkcl9zaXplKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJGaWxlIHNpemUgdG9vIHNtYWxsIVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlwaWVjZXMtPmluc3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbnN0X3NpemUpOwotCQlwaWVjZXMtPmRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5kYXRhX3NpemUpOwotCQlwaWVjZXMtPmluaXRfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbml0X3NpemUpOwotCQlwaWVjZXMtPmluaXRfZGF0YV9zaXplID0KLQkJCQlsZTMyX3RvX2NwdSh1Y29kZS0+djEuaW5pdF9kYXRhX3NpemUpOwotCQlwaWVjZXMtPmJvb3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5ib290X3NpemUpOwotCQlzcmMgPSB1Y29kZS0+djEuZGF0YTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogVmVyaWZ5IHNpemUgb2YgZmlsZSB2cy4gaW1hZ2Ugc2l6ZSBpbmZvIGluIGZpbGUncyBoZWFkZXIgKi8KLQlpZiAodWNvZGVfcmF3LT5zaXplICE9IGhkcl9zaXplICsgcGllY2VzLT5pbnN0X3NpemUgKwotCQkJCXBpZWNlcy0+ZGF0YV9zaXplICsgcGllY2VzLT5pbml0X3NpemUgKwotCQkJCXBpZWNlcy0+aW5pdF9kYXRhX3NpemUgKyBwaWVjZXMtPmJvb3Rfc2l6ZSkgewotCi0JCUlXTF9FUlIocHJpdiwKLQkJCSJ1Q29kZSBmaWxlIHNpemUgJWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZVxuIiwKLQkJCShpbnQpdWNvZGVfcmF3LT5zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGllY2VzLT5pbnN0ID0gc3JjOwotCXNyYyArPSBwaWVjZXMtPmluc3Rfc2l6ZTsKLQlwaWVjZXMtPmRhdGEgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+ZGF0YV9zaXplOwotCXBpZWNlcy0+aW5pdCA9IHNyYzsKLQlzcmMgKz0gcGllY2VzLT5pbml0X3NpemU7Ci0JcGllY2VzLT5pbml0X2RhdGEgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+aW5pdF9kYXRhX3NpemU7Ci0JcGllY2VzLT5ib290ID0gc3JjOwotCXNyYyArPSBwaWVjZXMtPmJvb3Rfc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfdWNvZGVfY2FsbGJhY2sgLSBjYWxsYmFjayB3aGVuIGZpcm13YXJlIHdhcyBsb2FkZWQKLSAqCi0gKiBJZiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCBjb3BpZXMgdGhlIGZpcm13YXJlIGludG8gYnVmZmVycwotICogZm9yIHRoZSBjYXJkIHRvIGZldGNoICh2aWEgRE1BKS4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGV4dDsKLQlzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGU7Ci0JaW50IGVycjsKLQlzdHJ1Y3QgaXdsNDk2NV9maXJtd2FyZV9waWVjZXMgcGllY2VzOwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluOwotCXUzMiBhcGlfdmVyOwotCi0JdTMyIG1heF9wcm9iZV9sZW5ndGggPSAyMDA7Ci0JdTMyIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplID0KLQkJCUlXTF9ERUZBVUxUX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkU7Ci0KLQltZW1zZXQoJnBpZWNlcywgMCwgc2l6ZW9mKHBpZWNlcykpOwotCi0JaWYgKCF1Y29kZV9yYXcpIHsKLQkJaWYgKHByaXYtPmZ3X2luZGV4IDw9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21heCkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkicmVxdWVzdCBmb3IgZmlybXdhcmUgZmlsZSAnJXMnIGZhaWxlZC5cbiIsCi0JCQkJcHJpdi0+ZmlybXdhcmVfbmFtZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJMb2FkZWQgZmlybXdhcmUgZmlsZSAnJXMnICglemQgYnl0ZXMpLlxuIiwKLQkJICAgICAgIHByaXYtPmZpcm13YXJlX25hbWUsIHVjb2RlX3Jhdy0+c2l6ZSk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgYXQgbGVhc3QgdGhlIEFQSSB2ZXJzaW9uIG51bWJlciAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgPCA0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCS8qIERhdGEgZnJvbSB1Y29kZSBmaWxlOiAgaGVhZGVyIGZvbGxvd2VkIGJ5IHVDb2RlIGltYWdlcyAqLwotCXVjb2RlID0gKHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICopdWNvZGVfcmF3LT5kYXRhOwotCi0JZXJyID0gaXdsNDk2NV9sb2FkX2Zpcm13YXJlKHByaXYsIHVjb2RlX3JhdywgJnBpZWNlcyk7Ci0KLQlpZiAoZXJyKQotCQlnb3RvIHRyeV9hZ2FpbjsKLQotCWFwaV92ZXIgPSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3Zlcik7Ci0KLQkvKgotCSAqIGFwaV92ZXIgc2hvdWxkIG1hdGNoIHRoZSBhcGkgdmVyc2lvbiBmb3JtaW5nIHBhcnQgb2YgdGhlCi0JICogZmlybXdhcmUgZmlsZW5hbWUgLi4uIGJ1dCB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdCBhbmQgb25seSByZWx5Ci0JICogb24gdGhlIEFQSSB2ZXJzaW9uIHJlYWQgZnJvbSBmaXJtd2FyZSBoZWFkZXIgZnJvbSBoZXJlIG9uIGZvcndhcmQKLQkgKi8KLQlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIkRyaXZlciB1bmFibGUgdG8gc3VwcG9ydCB5b3VyIGZpcm13YXJlIEFQSS4gIgotCQkJIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsCi0JCQlhcGlfbWF4LCBhcGlfdmVyKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKLQkJSVdMX0VSUihwcml2LAotCQkJIkZpcm13YXJlIGhhcyBvbGQgQVBJIHZlcnNpb24uIEV4cGVjdGVkIHYldSwgIgotCQkJImdvdCB2JXUuIE5ldyBmaXJtd2FyZSBjYW4gYmUgb2J0YWluZWQgIgotCQkJImZyb20gaHR0cDovL3d3dy5pbnRlbGxpbnV4d2lyZWxlc3Mub3JnLlxuIiwKLQkJCWFwaV9tYXgsIGFwaV92ZXIpOwotCi0JSVdMX0lORk8ocHJpdiwgImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAotCQkgSVdMX1VDT0RFX01BSk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfTUlOT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9TRVJJQUwocHJpdi0+dWNvZGVfdmVyKSk7Ci0KLQlzbnByaW50Zihwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24sCi0JCSBzaXplb2YocHJpdi0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKLQkJICIldS4ldS4ldS4ldSIsCi0JCSBJV0xfVUNPREVfTUFKT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9NSU5PUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX1NFUklBTChwcml2LT51Y29kZV92ZXIpKTsKLQotCS8qCi0JICogRm9yIGFueSBvZiB0aGUgZmFpbHVyZXMgYmVsb3cgKGJlZm9yZSBhbGxvY2F0aW5nIHBjaSBtZW1vcnkpCi0JICogd2Ugd2lsbCB0cnkgdG8gbG9hZCBhIHZlcnNpb24gd2l0aCBhIHNtYWxsZXIgQVBJIC0tIG1heWJlIHRoZQotCSAqIHVzZXIganVzdCBnb3QgYSBjb3JydXB0ZWQgdmVyc2lvbiBvZiB0aGUgbGF0ZXN0IEFQSS4KLQkgKi8KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgdWNvZGUgdmVyc2lvbiByYXcgPSAweCV4XG4iLAotCQkgICAgICAgcHJpdi0+dWNvZGVfdmVyKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgaW5zdCBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICVaZFxuIiwKLQkJICAgICAgIHBpZWNlcy5kYXRhX3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAlWmRcbiIsCi0JCSAgICAgICBwaWVjZXMuaW5pdF9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGluaXQgZGF0YSBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmJvb3Rfc2l6ZSk7Ci0KLQkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KLQlpZiAocGllY2VzLmluc3Rfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCXBpZWNlcy5pbnN0X3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAocGllY2VzLmRhdGFfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGRhdGEgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJcGllY2VzLmRhdGFfc2l6ZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCWlmIChwaWVjZXMuaW5pdF9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgaW5pdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuaW5pdF9zaXplKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgInVDb2RlIGluaXQgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuaW5pdF9kYXRhX3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAocGllY2VzLmJvb3Rfc2l6ZSA+IHByaXYtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgYm9vdCBpbnN0ciBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuYm9vdF9zaXplKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogQWxsb2NhdGUgdWNvZGUgYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgbG9hZGluZyAuLi4gKi8KLQotCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgotCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCi0JICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCi0JcHJpdi0+dWNvZGVfY29kZS5sZW4gPSBwaWVjZXMuaW5zdF9zaXplOwotCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfY29kZSk7Ci0KLQlwcml2LT51Y29kZV9kYXRhLmxlbiA9IHBpZWNlcy5kYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQotCXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLmxlbiA9IHBpZWNlcy5kYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFwcml2LT51Y29kZV9kYXRhLnZfYWRkciB8fAotCSAgICAhcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyKQotCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KLQlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfaW5pdC5sZW4gPSBwaWVjZXMuaW5pdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCi0JCXByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW4gPSBwaWVjZXMuaW5pdF9kYXRhX3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdF9kYXRhKTsKLQotCQlpZiAoIXByaXYtPnVjb2RlX2luaXQudl9hZGRyIHx8ICFwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyKQotCQkJZ290byBlcnJfcGNpX2FsbG9jOwotCX0KLQotCS8qIEJvb3RzdHJhcCAoaW5zdHJ1Y3Rpb25zIG9ubHksIG5vIGRhdGEpICovCi0JaWYgKHBpZWNlcy5ib290X3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfYm9vdC5sZW4gPSBwaWVjZXMuYm9vdF9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2Jvb3QpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfYm9vdC52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogTm93IHRoYXQgd2UgY2FuIG5vIGxvbmdlciBmYWlsLCBjb3B5IGluZm9ybWF0aW9uICovCi0KLQlwcml2LT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07Ci0KLQkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLwotCi0JLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSB1Q29kZSBpbnN0ciBsZW4gJVpkXG4iLAotCQkJcGllY2VzLmluc3Rfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCBwaWVjZXMuaW5zdCwgcGllY2VzLmluc3Rfc2l6ZSk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgaW5zdHIgYnVmIHZhZGRyID0gMHglcCwgcGFkZHIgPSAweCUwOHhcbiIsCi0JCXByaXYtPnVjb2RlX2NvZGUudl9hZGRyLCAodTMyKXByaXYtPnVjb2RlX2NvZGUucF9hZGRyKTsKLQotCS8qCi0JICogUnVudGltZSBkYXRhCi0JICogTk9URTogIENvcHkgaW50byBiYWNrdXAgYnVmZmVyIHdpbGwgYmUgZG9uZSBpbiBpd2xfdXAoKQotCSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGRhdGEgbGVuICVaZFxuIiwKLQkJCXBpZWNlcy5kYXRhX3NpemUpOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhLnZfYWRkciwgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHBpZWNlcy5kYXRhLCBwaWVjZXMuZGF0YV9zaXplKTsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAqLwotCWlmIChwaWVjZXMuaW5pdF9zaXplKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBpbnN0ciBsZW4gJVpkXG4iLAotCQkJCXBpZWNlcy5pbml0X3NpemUpOwotCQltZW1jcHkocHJpdi0+dWNvZGVfaW5pdC52X2FkZHIsIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXphdGlvbiBkYXRhICovCi0JaWYgKHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGluaXQgZGF0YSBsZW4gJVpkXG4iLAotCQkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0X2RhdGEudl9hZGRyLCBwaWVjZXMuaW5pdF9kYXRhLAotCQkgICAgICAgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKLQl9Ci0KLQkvKiBCb290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgYm9vdCBpbnN0ciBsZW4gJVpkXG4iLAotCQkJcGllY2VzLmJvb3Rfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyLCBwaWVjZXMuYm9vdCwgcGllY2VzLmJvb3Rfc2l6ZSk7Ci0KLQkvKgotCSAqIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcwotCSAqIGJhc2Ugb24gdGhlIHNpemUgb2Ygc3RhbmRhcmQgcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzIHRhYmxlIHNpemUKLQkgKi8KLQlwcml2LT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KLQkJc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemU7Ci0JcHJpdi0+XzQ5NjUucGh5X2NhbGliX2NoYWluX25vaXNlX2dhaW5fY21kID0KLQkJc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgKyAxOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBzdGlsbCBwYXJ0IG9mIHByb2JlKCkgaW4gYSBzZW5zZS4uLgotCSAqCi0JICogOS4gU2V0dXAgYW5kIHJlZ2lzdGVyIHdpdGggbWFjODAyMTEgYW5kIGRlYnVnZnMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JZXJyID0gaXdsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIocHJpdiwgbWF4X3Byb2JlX2xlbmd0aCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfdW5iaW5kOwotCi0JZXJyID0gaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3Rlcihwcml2LCBEUlZfTkFNRSk7Ci0JaWYgKGVycikKLQkJSVdMX0VSUihwcml2LAotCQkiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyBlcnJvcjogJWRcbiIsIGVycik7Ci0KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnByaXYtPnBjaV9kZXYtPmRldi5rb2JqLAotCQkJCQkmaXdsX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKLQkJZ290byBvdXRfdW5iaW5kOwotCX0KLQotCS8qIFdlIGhhdmUgb3VyIGNvcGllcyBub3csIGFsbG93IE9TIHJlbGVhc2UgaXRzIGNvcGllcyAqLwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQljb21wbGV0ZSgmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0JcmV0dXJuOwotCi0gdHJ5X2FnYWluOgotCS8qIHRyeSBuZXh0LCBpZiBhbnkgKi8KLQlpZiAoaXdsNDk2NV9yZXF1ZXN0X2Zpcm13YXJlKHByaXYsIGZhbHNlKSkKLQkJZ290byBvdXRfdW5iaW5kOwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQlyZXR1cm47Ci0KLSBlcnJfcGNpX2FsbG9jOgotCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlpd2w0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKHByaXYpOwotIG91dF91bmJpbmQ6Ci0JY29tcGxldGUoJnByaXYtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwotCWRldmljZV9yZWxlYXNlX2RyaXZlcigmcHJpdi0+cGNpX2Rldi0+ZGV2KTsKLQlyZWxlYXNlX2Zpcm13YXJlKHVjb2RlX3Jhdyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVzY19sb29rdXBfdGV4dFtdID0gewotCSJPSyIsCi0JIkZBSUwiLAotCSJCQURfUEFSQU0iLAotCSJCQURfQ0hFQ0tTVU0iLAotCSJOTUlfSU5URVJSVVBUX1dERyIsCi0JIlNZU0FTU0VSVCIsCi0JIkZBVEFMX0VSUk9SIiwKLQkiQkFEX0NPTU1BTkQiLAotCSJIV19FUlJPUl9UVU5FX0xPQ0siLAotCSJIV19FUlJPUl9URU1QRVJBVFVSRSIsCi0JIklMTEVHQUxfQ0hBTl9GUkVRIiwKLQkiVkNDX05PVF9TVEFCTEUiLAotCSJGSF9FUlJPUiIsCi0JIk5NSV9JTlRFUlJVUFRfSE9TVCIsCi0JIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwKLQkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwKLQkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsCi0JIkhXX0VSUk9SX0FCU19MT0NLIiwKLQkiSFdfRVJST1JfQ0FMX0xPQ0tfRkFJTCIsCi0JIk5NSV9JTlRFUlJVUFRfSU5TVF9BQ1RJT05fUFQiLAotCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKLQkiTk1JX1RSTV9IV19FUiIsCi0JIk5NSV9JTlRFUlJVUFRfVFJNIiwKLQkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCi0JIkRFQlVHXzAiLAotCSJERUJVR18xIiwKLQkiREVCVUdfMiIsCi0JIkRFQlVHXzMiLAotfTsKLQotc3RhdGljIHN0cnVjdCB7IGNoYXIgKm5hbWU7IHU4IG51bTsgfSBhZHZhbmNlZF9sb29rdXBbXSA9IHsKLQl7ICJOTUlfSU5URVJSVVBUX1dERyIsIDB4MzQgfSwKLQl7ICJTWVNBU1NFUlQiLCAweDM1IH0sCi0JeyAiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsIDB4MzcgfSwKLQl7ICJCQURfQ09NTUFORCIsIDB4MzggfSwKLQl7ICJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwgMHgzQyB9LAotCXsgIkZBVEFMX0VSUk9SIiwgMHgzRCB9LAotCXsgIk5NSV9UUk1fSFdfRVJSIiwgMHg0NiB9LAotCXsgIk5NSV9JTlRFUlJVUFRfVFJNIiwgMHg0QyB9LAotCXsgIk5NSV9JTlRFUlJVUFRfQlJFQUtfUE9JTlQiLCAweDU0IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9XREdfUlhGX0ZVTEwiLCAweDVDIH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9XREdfTk9fUkJEX1JYRl9GVUxMIiwgMHg2NCB9LAotCXsgIk5NSV9JTlRFUlJVUFRfSE9TVCIsIDB4NjYgfSwKLQl7ICJOTUlfSU5URVJSVVBUX0FDVElPTl9QVCIsIDB4N0MgfSwKLQl7ICJOTUlfSU5URVJSVVBUX1VOS05PV04iLCAweDg0IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsIDB4ODYgfSwKLQl7ICJBRFZBTkNFRF9TWVNBU1NFUlQiLCAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqaXdsNDk2NV9kZXNjX2xvb2t1cCh1MzIgbnVtKQotewotCWludCBpOwotCWludCBtYXggPSBBUlJBWV9TSVpFKGRlc2NfbG9va3VwX3RleHQpOwotCi0JaWYgKG51bSA8IG1heCkKLQkJcmV0dXJuIGRlc2NfbG9va3VwX3RleHRbbnVtXTsKLQotCW1heCA9IEFSUkFZX1NJWkUoYWR2YW5jZWRfbG9va3VwKSAtIDE7Ci0JZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCWlmIChhZHZhbmNlZF9sb29rdXBbaV0ubnVtID09IG51bSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gYWR2YW5jZWRfbG9va3VwW2ldLm5hbWU7Ci19Ci0KLSNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQotI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCi0KLXZvaWQgaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBkYXRhMiwgbGluZTsKLQl1MzIgZGVzYywgdGltZSwgY291bnQsIGJhc2UsIGRhdGExOwotCXUzMiBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazI7Ci0JdTMyIHBjLCBoY21kOwotCi0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgewotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQl9Ci0KLQlpZiAoIXByaXYtPmNmZy0+b3BzLT5saWItPmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJSVdMX0VSUihwcml2LAotCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAotCQkJYmFzZSwgKHByaXYtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgPyAiSW5pdCIgOiAiUlQiKTsKLQkJcmV0dXJuOwotCX0KLQotCWNvdW50ID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UpOwotCi0JaWYgKEVSUk9SX1NUQVJUX09GRlNFVCA8PSBjb3VudCAqIEVSUk9SX0VMRU1fU0laRSkgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBJV0wgRXJyb3IgTG9nIER1bXA6XG4iKTsKLQkJSVdMX0VSUihwcml2LCAiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsCi0JCQlwcml2LT5zdGF0dXMsIGNvdW50KTsKLQl9Ci0KLQlkZXNjID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAxICogc2l6ZW9mKHUzMikpOwotCXByaXYtPmlzcl9zdGF0cy5lcnJfY29kZSA9IGRlc2M7Ci0JcGMgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDIgKiBzaXplb2YodTMyKSk7Ci0JYmxpbmsxID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAzICogc2l6ZW9mKHUzMikpOwotCWJsaW5rMiA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgNCAqIHNpemVvZih1MzIpKTsKLQlpbGluazEgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDUgKiBzaXplb2YodTMyKSk7Ci0JaWxpbmsyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA2ICogc2l6ZW9mKHUzMikpOwotCWRhdGExID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA3ICogc2l6ZW9mKHUzMikpOwotCWRhdGEyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA4ICogc2l6ZW9mKHUzMikpOwotCWxpbmUgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDkgKiBzaXplb2YodTMyKSk7Ci0JdGltZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgMTEgKiBzaXplb2YodTMyKSk7Ci0JaGNtZCA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgMjIgKiBzaXplb2YodTMyKSk7Ci0KLQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXJyb3IocHJpdiwgZGVzYywKLQkJCQkJdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lLAotCQkJCSAgICAgIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMik7Ci0KLQlJV0xfRVJSKHByaXYsICJEZXNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgIgotCQkiZGF0YTEgICAgICBkYXRhMiAgICAgIGxpbmVcbiIpOwotCUlXTF9FUlIocHJpdiwgIiUtMjhzICgweCUwNFgpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCi0JCWl3bDQ5NjVfZGVzY19sb29rdXAoZGVzYyksIGRlc2MsIHRpbWUsIGRhdGExLCBkYXRhMiwgbGluZSk7Ci0JSVdMX0VSUihwcml2LCAicGMgICAgICBibGluazEgIGJsaW5rMiAgaWxpbmsxICBpbGluazIgIGhjbWRcbiIpOwotCUlXTF9FUlIocHJpdiwgIjB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYXG4iLAotCQlwYywgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBoY21kKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jdF9raWxsX2NvbmZpZyBjbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWNtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9SID0KLQkJY3B1X3RvX2xlMzIocHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkKTsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0NUX0tJTExfQ09ORklHX0NNRCwKLQkJCSAgICAgICBzaXplb2YoY21kKSwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EIGZhaWxlZFxuIik7Ci0JZWxzZQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EICIKLQkJCQkic3VjY2VlZGVkLCAiCi0JCQkJImNyaXRpY2FsIHRlbXBlcmF0dXJlIGlzICVkXG4iLAotCQkJCXByaXYtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzOCBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKLQlJV0xfVFhfRklGT19WTywKLQlJV0xfVFhfRklGT19WSSwKLQlJV0xfVFhfRklGT19CRSwKLQlJV0xfVFhfRklGT19CSywKLQlJV0w0OV9DTURfRklGT19OVU0sCi0JSVdMX1RYX0ZJRk9fVU5VU0VELAotCUlXTF9UWF9GSUZPX1VOVVNFRCwKLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9hbGl2ZV9ub3RpZnkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUzMiBhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIGNoYW47Ci0JdTMyIHJlZ192YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQ2xlYXIgNDk2NSdzIGludGVybmFsIFR4IFNjaGVkdWxlciBkYXRhIGJhc2UgKi8KLQlwcml2LT5zY2RfYmFzZV9hZGRyID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwKLQkJCQkJSVdMNDlfU0NEX1NSQU1fQkFTRV9BRERSKTsKLQlhID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUOwotCWZvciAoOyBhIDwgcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTDQ5X1NDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQ7IGEgKz0gNCkKLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKLQlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVQ7IGEgKz0gNCkKLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBhLCAwKTsKLQlmb3IgKDsgYSA8IHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCSAgICAgICBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUocHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKTsgYSArPSA0KQotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIGEsIDApOwotCi0JLyogVGVsIDQ5NjUgd2hlcmUgdG8gZmluZCBUeCBieXRlIGNvdW50IHRhYmxlcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfRFJBTV9CQVNFX0FERFIsCi0JCQlwcml2LT5zY2RfYmNfdGJscy5kbWEgPj4gMTApOwotCi0JLyogRW5hYmxlIERNQSBjaGFubmVsICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IEZINDlfVENTUl9DSE5MX05VTSA7IGNoYW4rKykKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LAotCQkJCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAotCQkJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKLQkJCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKLQotCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KLQlyZWdfdmFsID0gaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEZIX1RYX0NISUNLRU5fQklUU19SRUcpOwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRywKLQkJCSAgIHJlZ192YWwgfCBGSF9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4pOwotCi0JLyogRGlzYWJsZSBjaGFpbiBtb2RlIGZvciBhbGwgcXVldWVzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIElXTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIGVhY2ggVHggcXVldWUgKGluY2x1ZGluZyB0aGUgY29tbWFuZCBxdWV1ZSkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBpKyspIHsKLQotCQkvKiBURkQgY2lyY3VsYXIgYnVmZmVyIHJlYWQvd3JpdGUgaW5kZXhlcyAqLwotCQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKGkpLCAwKTsKLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsIDAgfCAoaSA8PCA4KSk7Ci0KLQkJLyogTWF4IFR4IFdpbmRvdyBzaXplIGZvciBTY2hlZHVsZXItQUNLIG1vZGUgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJCQlJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoaSksCi0JCQkJKFNDRF9XSU5fU0laRSA8PAotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MpICYKLQkJCQlJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfTVNLKTsKLQotCQkvKiBGcmFtZSBsaW1pdCAqLwotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCQkJCUlXTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSArCi0JCQkJc2l6ZW9mKHUzMiksCi0JCQkJKFNDRF9GUkFNRV9MSU1JVCA8PAotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKLQkJCQlJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLKTsKLQotCX0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLAotCQkJCSAoMSA8PCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pIC0gMSk7Ci0KLQkvKiBBY3RpdmF0ZSBhbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMgKi8KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgSVdMX01BU0soMCwgNikpOwotCi0JaXdsNDk2NV9zZXRfd3JfcHRycyhwcml2LCBJV0xfREVGQVVMVF9DTURfUVVFVUVfTlVNLCAwKTsKLQotCS8qIG1ha2Ugc3VyZSBhbGwgcXVldWUgYXJlIG5vdCBzdG9wcGVkICovCi0JbWVtc2V0KCZwcml2LT5xdWV1ZV9zdG9wcGVkWzBdLCAwLCBzaXplb2YocHJpdi0+cXVldWVfc3RvcHBlZCkpOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWF0b21pY19zZXQoJnByaXYtPnF1ZXVlX3N0b3BfY291bnRbaV0sIDApOwotCi0JLyogcmVzZXQgdG8gMCB0byBlbmFibGUgYWxsIHRoZSBxdWV1ZSBmaXJzdCAqLwotCXByaXYtPnR4cV9jdHhfYWN0aXZlX21zayA9IDA7Ci0JLyogTWFwIGVhY2ggVHgvY21kIHF1ZXVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGZpZm8gKi8KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pICE9IDcpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGVmYXVsdF9xdWV1ZV90b190eF9maWZvKTsgaSsrKSB7Ci0JCWludCBhYyA9IGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmb1tpXTsKLQotCQlpd2xfdHhxX2N0eF9hY3RpdmF0ZShwcml2LCBpKTsKLQotCQlpZiAoYWMgPT0gSVdMX1RYX0ZJRk9fVU5VU0VEKQotCQkJY29udGludWU7Ci0KLQkJaXdsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHByaXYsICZwcml2LT50eHFbaV0sIGFjLCAwKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2FsaXZlX3N0YXJ0IC0gY2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICogICAgICAgICAgICAgICAgICAgZnJvbSBwcm90b2NvbC9ydW50aW1lIHVDb2RlIChpbml0aWFsaXphdGlvbiB1Q29kZSdzCi0gKiAgICAgICAgICAgICAgICAgICBBbGl2ZSBnZXRzIGhhbmRsZWQgYnkgaXdsX2luaXRfYWxpdmVfc3RhcnQoKSkuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYWxpdmVfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCi0JaWYgKHByaXYtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKLQkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAotCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHVDb2RlIGhhcyBsb2FkZWQgUnVudGltZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCi0JICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKLQkgKiAicnVudGltZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCi0JaWYgKGl3bDQ5NjVfdmVyaWZ5X3Vjb2RlKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOwotCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCYWQgcnVudGltZSB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQlyZXQgPSBpd2w0OTY1X2FsaXZlX25vdGlmeShwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkiQ291bGQgbm90IGNvbXBsZXRlIEFMSVZFIHRyYW5zaXRpb24gW250Zl06ICVkXG4iLCByZXQpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0KLQkvKiBBZnRlciB0aGUgQUxJVkUgcmVzcG9uc2UsIHdlIGNhbiBzZW5kIGhvc3QgY29tbWFuZHMgdG8gdGhlIHVDb2RlICovCi0Jc2V0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpOwotCi0JLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KLQlpd2xfbGVnYWN5X3NldHVwX3dhdGNoZG9nKHByaXYpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKQotCQlyZXR1cm47Ci0KLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOwotCi0JcHJpdi0+YWN0aXZlX3JhdGUgPSBJV0xfUkFURVNfTUFTSzsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKLQkJc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0KLQkJCQkoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKikmY3R4LT5hY3RpdmU7Ci0JCS8qIGFwcGx5IGFueSBjaGFuZ2VzIGluIHN0YWdpbmcgKi8KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCQkvKiBJbml0aWFsaXplIG91ciByeF9jb25maWcgZGF0YSAqLwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKLQkJCWl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCB0bXApOwotCi0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIGVuYWJsZWQgKi8KLQlpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHByaXYpOwotCi0JaXdsNDk2NV9yZXNldF9ydW5fdGltZV9jYWxpYihwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgYWRhcHRlciBmb3IgdW5hc3NvY2lhdGVkIG9wZXJhdGlvbiAqLwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBOSUMgaXMgaW5pdGlhbGl6ZWQgYW5kIG9wZXJhdGlvbmFsICovCi0JaXdsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhwcml2KTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBTElWRSBwcm9jZXNzaW5nIGNvbXBsZXRlLlxuIik7Ci0Jd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVwZGF0ZWQgcG93ZXIgbW9kZVxuIik7Ci0KLQlyZXR1cm47Ci0KLSByZXN0YXJ0OgotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotc3RhdGljIHZvaWQgX19pd2w0OTY1X2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGV4aXRfcGVuZGluZzsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsIERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7Ci0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCWV4aXRfcGVuZGluZyA9IHRlc3RfYW5kX3NldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBTdG9wIFRYIHF1ZXVlcyB3YXRjaGRvZy4gV2UgbmVlZCB0byBoYXZlIFNUQVRVU19FWElUX1BFTkRJTkcgYml0IHNldAotCSAqIHRvIHByZXZlbnQgcmVhcm0gdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hkb2cpOwotCi0JaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhwcml2LCBOVUxMKTsKLQlpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JaXdsX2xlZ2FjeV9jbGVhcl9kcml2ZXJfc3RhdGlvbnMocHJpdik7Ci0KLQkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCi0Jd2FrZV91cF9hbGwoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQkvKiBXaXBlIG91dCB0aGUgRVhJVF9QRU5ESU5HIHN0YXR1cyBiaXQgaWYgd2UgYXJlIG5vdCBhY3R1YWxseQotCSAqIGV4aXRpbmcgdGhlIG1vZHVsZSAqLwotCWlmICghZXhpdF9wZW5kaW5nKQotCQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQkvKiB0ZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2w0OTY1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCi0JLyogSWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSBjYWxsZWQgaXdsX2luaXQoKSB0aGVuCi0JICogY2xlYXIgYWxsIGJpdHMgYnV0IHRoZSBSRiBLaWxsIGJpdCBhbmQgcmV0dXJuICovCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2luaXQocHJpdikpIHsKLQkJcHJpdi0+c3RhdHVzID0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQkgICAgICAgdGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIC4uLm90aGVyd2lzZSBjbGVhciBvdXQgYWxsIHRoZSBzdGF0dXMgYml0cyBidXQgdGhlIFJGIEtpbGwKLQkgKiBiaXQgYW5kIGNvbnRpbnVlIHRha2luZyB0aGUgTklDIGRvd24uICovCi0JcHJpdi0+c3RhdHVzICY9IHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19SRl9LSUxMX0hXIHwKLQkJCXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQlTVEFUVVNfR0VPX0NPTkZJR1VSRUQgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19GV19FUlJPUiB8Ci0JCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19FWElUX1BFTkRJTkc7Ci0KLQlpd2w0OTY1X3R4cV9jdHhfc3RvcChwcml2KTsKLQlpd2w0OTY1X3J4cV9zdG9wKHByaXYpOwotCi0JLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOwotCXVkZWxheSg1KTsKLQotCS8qIE1ha2Ugc3VyZSAocmVkdW5kYW50KSB3ZSd2ZSByZWxlYXNlZCBvdXIgcmVxdWVzdCB0byBzdGF5IGF3YWtlICovCi0JaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7Ci0KLQkvKiBTdG9wIHRoZSBkZXZpY2UsIGFuZCBwdXQgaXQgaW4gbG93IHBvd2VyIHN0YXRlICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotIGV4aXQ6Ci0JbWVtc2V0KCZwcml2LT5jYXJkX2FsaXZlLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSk7Ci0KLQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCXByaXYtPmJlYWNvbl9za2IgPSBOVUxMOwotCi0JLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLwotCWl3bDQ5NjVfY2xlYXJfZnJlZV9mcmFtZXMocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCV9faXdsNDk2NV9kb3duKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLX0KLQotI2RlZmluZSBIV19SRUFEWV9USU1FT1VUICg1MCkKLQotc3RhdGljIGludCBpd2w0OTY1X3NldF9od19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFkpOwotCi0JLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCXJldCA9IGl3bF9wb2xsX2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCi0JCQkJSFdfUkVBRFlfVElNRU9VVCk7Ci0JaWYgKHJldCAhPSAtRVRJTUVET1VUKQotCQlwcml2LT5od19yZWFkeSA9IHRydWU7Ci0JZWxzZQotCQlwcml2LT5od19yZWFkeSA9IGZhbHNlOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImhhcmR3YXJlICVzXG4iLAotCQkgICAgICAocHJpdi0+aHdfcmVhZHkgPT0gMSkgPyAicmVhZHkiIDogIm5vdCByZWFkeSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9wcmVwYXJlX2NhcmRfaHcoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIml3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3IGVudGVyXG4iKTsKLQotCXJldCA9IGl3bDQ5NjVfc2V0X2h3X3JlYWR5KHByaXYpOwotCWlmIChwcml2LT5od19yZWFkeSkKLQkJcmV0dXJuIHJldDsKLQotCS8qIElmIEhXIGlzIG5vdCByZWFkeSwgcHJlcGFyZSB0aGUgY29uZGl0aW9ucyB0byBjaGVjayBhZ2FpbiAqLwotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUpOwotCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJfkNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUFJFUEFSRV9ET05FLAotCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsIDE1MDAwMCk7Ci0KLQkvKiBIVyBzaG91bGQgYmUgcmVhZHkgYnkgbm93LCBjaGVjayBhZ2Fpbi4gKi8KLQlpZiAocmV0ICE9IC1FVElNRURPVVQpCi0JCWl3bDQ5NjVfc2V0X2h3X3JlYWR5KHByaXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQotCi1zdGF0aWMgaW50IF9faXdsNDk2NV91cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIpIHsKLQkJSVdMX0VSUihwcml2LCAidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5ndXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlyZXQgPSBpd2w0OTY1X2FsbG9jX2JjYXN0X3N0YXRpb24ocHJpdiwgY3R4KTsKLQkJaWYgKHJldCkgewotCQkJaXdsX2xlZ2FjeV9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCWl3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHByaXYpOwotCi0JaWYgKCFwcml2LT5od19yZWFkeSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBIVyBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLwotCWlmIChpd2xfcmVhZDMyKHByaXYsCi0JCUNTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKSB7Ci0JCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCB0cnVlKTsKLQotCQlpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCQlJV0xfV0FSTihwcml2LCAiUmFkaW8gZGlzYWJsZWQgYnkgSFcgUkYgS2lsbCBzd2l0Y2hcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQotCS8qIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGl3bF9od19uaWNfaW5pdCAqLwotCXByaXYtPmNtZF9xdWV1ZSA9IElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU07Ci0KLQlyZXQgPSBpd2w0OTY1X2h3X25pY19pbml0KHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgbmljXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCS8qIGNsZWFyIChhZ2FpbiksIHRoZW4gZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOwotCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCi0JLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KLQkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncwotCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCi0JbWVtY3B5KHByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIsCi0JICAgICAgIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgewotCi0JCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCi0JCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCi0JCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCi0JCXJldCA9IHByaXYtPmNmZy0+b3BzLT5saWItPmxvYWRfdWNvZGUocHJpdik7Ci0KLQkJaWYgKHJldCkgewotCQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIHNldCB1cCBib290c3RyYXAgdUNvZGU6ICVkXG4iLAotCQkJCXJldCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHN0YXJ0IGNhcmQ7ICJpbml0aWFsaXplIiB3aWxsIGxvYWQgcnVudGltZSB1Y29kZSAqLwotCQlpd2w0OTY1X25pY19zdGFydChwcml2KTsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCBEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlfX2l3bDQ5NjVfZG93bihwcml2KTsKLQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiB0cmllZCB0byByZXN0YXJ0IGFuZCBjb25maWcgdGhlIGRldmljZSBmb3IgYXMgbG9uZyBhcyBvdXIKLQkgKiBwYXRpZW5jZSBjb3VsZCB3aXRoc3RhbmQgKi8KLQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXb3JrcXVldWUgY2FsbGJhY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmluaXRfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGFsaXZlX3N0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2w0OTY1X2FsaXZlX3N0YXJ0KHByaXYpOwotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsCi0JCQlydW5fdGltZV9jYWxpYl93b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHByaXYtPnN0YXJ0X2NhbGliKSB7Ci0JCWl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24ocHJpdiwKLQkJCQkodm9pZCAqKSZwcml2LT5fNDk2NS5zdGF0aXN0aWNzKTsKLQkJaXdsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihwcml2LAotCQkJCSh2b2lkICopJnByaXYtPl80OTY1LnN0YXRpc3RpY3MpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJlc3RhcnQpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cykpIHsKLQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQotCQkJY3R4LT52aWYgPSBOVUxMOwotCQlwcml2LT5pc19vcGVuID0gMDsKLQotCQlfX2l3bDQ5NjVfZG93bihwcml2KTsKLQotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLQkJaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOwotCX0gZWxzZSB7Ci0JCWl3bDQ5NjVfZG93bihwcml2KTsKLQotCQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfX2l3bDQ5NjVfdXAocHJpdik7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9iZ19yeF9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2w0OTY1X3J4X3JlcGxlbmlzaChwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFVDT0RFX1JFQURZX1RJTUVPVVQJKDQgKiBIWikKLQotLyoKLSAqIE5vdCBhIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9uLCBidXQgaXQgZml0cyBpbiB3aXRoIGFsbCB0aGUKLSAqIG90aGVyIG1hYzgwMjExIGZ1bmN0aW9ucyBncm91cGVkIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgdTMyIG1heF9wcm9iZV9sZW5ndGgpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtNDk2NS1ycyI7Ci0KLQkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KLQlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8Ci0JCSAgICBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04gfAotCQkgICAgSUVFRTgwMjExX0hXX05FRURfRFRJTV9QRVJJT0QgfAotCQkgICAgSUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQgfAotCQkgICAgSUVFRTgwMjExX0hXX1JFUE9SVFNfVFhfQUNLX1NUQVRVUzsKLQotCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKLQkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1NNUFMgfAotCQkJICAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7Ci0KLQlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdik7Ci0JaHctPnZpZl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF92aWZfcHJpdik7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBjdHgtPmludGVyZmFjZV9tb2RlczsKLQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCX0KLQotCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8Ci0JCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUzsKLQotCS8qCi0JICogRm9yIG5vdywgZGlzYWJsZSBQUyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgYWZmZWN0cwotCSAqIFJYIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCi0JICovCi0JaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCi0JaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7Ci0JLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwotCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gbWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKLQotCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLwotCWh3LT5xdWV1ZXMgPSA0OwotCi0JaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJV0xfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWdhY3lfbGVkc19pbml0KHByaXYpOwotCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpd2w0OTY1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQkvKiB3ZSBzaG91bGQgYmUgdmVyaWZ5aW5nIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgb3BlbmVkICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCXJldCA9IF9faXdsNDk2NV91cChwcml2KTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCWdvdG8gb3V0OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YXJ0IFVQIHdvcmsgZG9uZS5cbiIpOwotCi0JLyogV2FpdCBmb3IgU1RBUlRfQUxJVkUgZnJvbSBSdW4gVGltZSB1Y29kZS4gT3RoZXJ3aXNlIGNhbGxiYWNrcyBmcm9tCi0JICogbWFjODAyMTEgd2lsbCBub3QgYmUgcnVuIHN1Y2Nlc3NmdWxseS4gKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSwKLQkJCVVDT0RFX1JFQURZX1RJTUVPVVQpOwotCWlmICghcmV0KSB7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJSVdMX0VSUihwcml2LCAiU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKLQkJCQlqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JfQotCi0JaXdsNDk2NV9sZWRfZW5hYmxlKHByaXYpOwotCi1vdXQ6Ci0JcHJpdi0+aXNfb3BlbiA9IDE7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaXdsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKCFwcml2LT5pc19vcGVuKQotCQlyZXR1cm47Ci0KLQlwcml2LT5pc19vcGVuID0gMDsKLQotCWl3bDQ5NjVfZG93bihwcml2KTsKLQotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCi0JLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKLQkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7Ci0JaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi12b2lkIGl3bDQ5NjVfbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImVudGVyXG4iKTsKLQotCUlXTF9ERUJVR19UWChwcml2LCAiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCi0JCSAgICAgaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCBJRUVFODAyMTFfU0tCX0NCKHNrYikpLT5iaXRyYXRlKTsKLQotCWlmIChpd2w0OTY1X3R4X3NrYihwcml2LCBza2IpKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotdm9pZCBpd2w0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJdTMyIGl2MzIsIHUxNiAqcGhhc2Uxa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpd2w0OTY1X3VwZGF0ZV90a2lwX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXljb25mLCBzdGEsCi0JCQkgICAgaXYzMiwgcGhhc2Uxa2V5KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1pbnQgaXdsNDk2NV9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCWJvb2wgaXNfZGVmYXVsdF93ZXBfa2V5ID0gZmFsc2U7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIHZpZl9wcml2LT5jdHgsIHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGdldHRpbmcgV0VQIGdyb3VwIGtleSBhbmQgd2UgZGlkbid0IHJlY2VpdmUgYW55IGtleSBtYXBwaW5nCi0JICogc28gZmFyLCB3ZSBhcmUgaW4gbGVnYWN5IHdlcCBtb2RlIChncm91cCBrZXkgb25seSksIG90aGVyd2lzZSB3ZSBhcmUKLQkgKiBpbiAxWCBtb2RlLgotCSAqIEluIGxlZ2FjeSB3ZXAgbW9kZSwgd2UgdXNlIGFub3RoZXIgaG9zdCBjb21tYW5kIHRvIHRoZSB1Q29kZS4KLQkgKi8KLQlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmCi0JICAgICFzdGEpIHsKLQkJaWYgKGNtZCA9PSBTRVRfS0VZKQotCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0gIWN0eC0+a2V5X21hcHBpbmdfa2V5czsKLQkJZWxzZQotCQkJaXNfZGVmYXVsdF93ZXBfa2V5ID0KLQkJCQkJKGtleS0+aHdfa2V5X2lkeCA9PSBIV19LRVlfREVGQVVMVCk7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNFVF9LRVk6Ci0JCWlmIChpc19kZWZhdWx0X3dlcF9rZXkpCi0JCQlyZXQgPSBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwKLQkJCQkJCQl2aWZfcHJpdi0+Y3R4LCBrZXkpOwotCQllbHNlCi0JCQlyZXQgPSBpd2w0OTY1X3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LAotCQkJCQkJICBrZXksIHN0YV9pZCk7Ci0KLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBESVNBQkxFX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKLQkJCXJldCA9IGl3bDQ5NjVfcmVtb3ZlX2RlZmF1bHRfd2VwX2tleShwcml2LCBjdHgsIGtleSk7Ci0JCWVsc2UKLQkJCXJldCA9IGl3bDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHByaXYsIGN0eCwKLQkJCQkJCQlrZXksIHN0YV9pZCk7Ci0KLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJkaXNhYmxlIGh3Y3J5cHRvIGtleVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXdsNDk2NV9tYWNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuLAotCQkJICAgIHU4IGJ1Zl9zaXplKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKLQkJICAgICBzdGEtPmFkZHIsIHRpZCk7Ci0KLQlpZiAoIShwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikpCi0JCXJldHVybiAtRUFDQ0VTOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBSeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdG9wKHByaXYsIHN0YSwgdGlkKTsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgVHhcbiIpOwotCQlyZXQgPSBpd2w0OTY1X3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgVHhcbiIpOwotCQlyZXQgPSBpd2w0OTY1X3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOwotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGl3bDQ5NjVfbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0JYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInJlY2VpdmVkIHJlcXVlc3QgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlhdG9taWNfc2V0KCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMsIDApOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLAotCQkJCSAgICAgaXNfYXAsIHN0YSwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsCi0JCQlzdGEtPmFkZHIsIHJldCk7Ci0JCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzdGFfcHJpdi0+Y29tbW9uLnN0YV9pZCA9IHN0YV9pZDsKLQotCS8qIEluaXRpYWxpemUgcmF0ZSBzY2FsaW5nICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemluZyByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNXG4iLAotCQkgICAgICAgc3RhLT5hZGRyKTsKLQlpd2w0OTY1X3JzX3JhdGVfaW5pdChwcml2LCBzdGEsIHN0YV9pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpd2w0OTY1X21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTE2IGNoOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQotCQlnb3RvIG91dDsKLQotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQotCQlnb3RvIG91dDsKLQotCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7Ci0JaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpID09IGNoKQotCQlnb3RvIG91dDsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgY2hhbm5lbC0+YmFuZCwgY2gpOwotCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0KLQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOwotCi0JLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KLQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOwotCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7Ci0JCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UKLQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCi0JaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNoYW5uZWwsIGN0eCk7Ci0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKLQlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0KLQlpd2xfbGVnYWN5X3NldF9yYXRlKHByaXYpOwotCS8qCi0JICogYXQgdGhpcyBwb2ludCwgc3RhZ2luZ19yeG9uIGhhcyB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsIHN3aXRjaAotCSAqLwotCXNldF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCXByaXYtPnN3aXRjaF9jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOwotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgewotCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7Ci0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7Ci0JfQotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXZvaWQgaXdsNDk2NV9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCSAgICAgdTY0IG11bHRpY2FzdCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLSNkZWZpbmUgQ0hLKHRlc3QsIGZsYWcpCWRvIHsgXAotCWlmICgqdG90YWxfZmxhZ3MgJiAodGVzdCkpCQlcCi0JCWZpbHRlcl9vciB8PSAoZmxhZyk7CQlcCi0JZWxzZQkJCQkJXAotCQlmaWx0ZXJfbmFuZCB8PSAoZmxhZyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLAotCQkJY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKLQotCUNISyhGSUZfT1RIRVJfQlNTIHwgRklGX1BST01JU0NfSU5fQlNTLCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7Ci0JLyogU2V0dGluZyBfanVzdF8gUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIGNhdXNlcyBGSCBlcnJvcnMgKi8KLQlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKLQotI3VuZGVmIENISwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOwotCi0JCS8qCi0JCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAotCQkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgotCQkgKi8KLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCS8qCi0JICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQotCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKCkKLQkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgbXVsdGljYXN0Ci0JICogZmlsdGVycyBpbnRvIHRoZSBkZXZpY2UuCi0JICovCi0JKnRvdGFsX2ZsYWdzICY9IEZJRl9PVEhFUl9CU1MgfCBGSUZfQUxMTVVMVEkgfCBGSUZfUFJPTUlTQ19JTl9CU1MgfAotCQkJRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9iZ190eHBvd2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsCi0JCQl0eHBvd2VyX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JLyogSWYgYSBzY2FuIGhhcHBlbmVkIHRvIHN0YXJ0IGJlZm9yZSB3ZSBnb3QgaGVyZQotCSAqIHRoZW4ganVzdCByZXR1cm47IHRoZSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiB3aWxsCi0JICoga2ljayBvZmYgYW5vdGhlciBzY2hlZHVsZWQgd29yayB0byBjb21wZW5zYXRlIGZvcgotCSAqIGFueSB0ZW1wZXJhdHVyZSBkZWx0YSB3ZSBtaXNzZWQgaGVyZS4gKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBSZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSBhc3NvY2lhdGVkLCB3ZSBtdXN0IHJlY29uZmlndXJlIHRoZQotCSAqIFRYIHBvd2VyIHNpbmNlIGZyYW1lcyBjYW4gYmUgc2VudCBvbiBub24tcmFkYXIgY2hhbm5lbHMgd2hpbGUKLQkgKiBub3QgYXNzb2NpYXRlZCAqLwotCXByaXYtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIocHJpdik7Ci0KLQkvKiBVcGRhdGUgbGFzdF90ZW1wZXJhdHVyZSB0byBrZWVwIGlzX2NhbGliX25lZWRlZCBmcm9tIHJ1bm5pbmcKLQkgKiB3aGVuIGl0IGlzbid0IG5lZWRlZC4uLiAqLwotCXByaXYtPmxhc3RfdGVtcGVyYXR1cmUgPSBwcml2LT50ZW1wZXJhdHVyZTsKLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JSU5JVF9XT1JLKCZwcml2LT5yZXN0YXJ0LCBpd2w0OTY1X2JnX3Jlc3RhcnQpOwotCUlOSVRfV09SSygmcHJpdi0+cnhfcmVwbGVuaXNoLCBpd2w0OTY1X2JnX3J4X3JlcGxlbmlzaCk7Ci0JSU5JVF9XT1JLKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrLCBpd2w0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0LCBpd2w0OTY1X2JnX2luaXRfYWxpdmVfc3RhcnQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5hbGl2ZV9zdGFydCwgaXdsNDk2NV9iZ19hbGl2ZV9zdGFydCk7Ci0KLQlpd2xfbGVnYWN5X3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhwcml2KTsKLQotCUlOSVRfV09SSygmcHJpdi0+dHhwb3dlcl93b3JrLCBpd2w0OTY1X2JnX3R4cG93ZXJfd29yayk7Ci0KLQlpbml0X3RpbWVyKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljKTsKLQlwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMuZnVuY3Rpb24gPSBpd2w0OTY1X2JnX3N0YXRpc3RpY3NfcGVyaW9kaWM7Ci0KLQlpbml0X3RpbWVyKCZwcml2LT53YXRjaGRvZyk7Ci0JcHJpdi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7Ci0JcHJpdi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpd2xfbGVnYWN5X2JnX3dhdGNoZG9nOwotCi0JdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQotCQlpd2w0OTY1X2lycV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+dHhwb3dlcl93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmluaXRfYWxpdmVfc3RhcnQpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmFsaXZlX3N0YXJ0KTsKLQljYW5jZWxfd29ya19zeW5jKCZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrKTsKLQotCWl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhwcml2KTsKLQotCWRlbF90aW1lcl9zeW5jKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpKyspIHsKLQkJcmF0ZXNbaV0uYml0cmF0ZSA9IGl3bGVnYWN5X3JhdGVzW2ldLmllZWUgKiA1OwotCQlyYXRlc1tpXS5od192YWx1ZSA9IGk7IC8qIFJhdGUgc2NhbGluZyB3aWxsIHdvcmsgb24gaW5kZXhlcyAqLwotCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7Ci0JCXJhdGVzW2ldLmZsYWdzID0gMDsKLQkJaWYgKChpID49IElXTF9GSVJTVF9DQ0tfUkFURSkgJiYgKGkgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpKSB7Ci0JCQkvKgotCQkJICogSWYgQ0NLICE9IDFNIHRoZW4gc2V0IHNob3J0IHByZWFtYmxlIHJhdGUgZmxhZy4KLQkJCSAqLwotCQkJcmF0ZXNbaV0uZmxhZ3MgfD0KLQkJCQkoaXdsZWdhY3lfcmF0ZXNbaV0ucGxjcCA9PSBJV0xfUkFURV8xTV9QTENQKSA/Ci0JCQkJCTAgOiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRTsKLQkJfQotCX0KLX0KLS8qCi0gKiBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIHUzMiBpbmRleCkKLXsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwKLQkJCSAgICAgKGluZGV4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1JEUFRSKHR4cV9pZCksIGluZGV4KTsKLX0KLQotdm9pZCBpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCWludCB0eF9maWZvX2lkLCBpbnQgc2NkX3JldHJ5KQotewotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0KLQkvKiBGaW5kIG91dCB3aGV0aGVyIHRvIGFjdGl2YXRlIFR4IHF1ZXVlICovCi0JaW50IGFjdGl2ZSA9IHRlc3RfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykgPyAxIDogMDsKLQotCS8qIFNldCB1cCBhbmQgYWN0aXZhdGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHR4cV9pZCksCi0JCQkgKGFjdGl2ZSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRSkgfAotCQkJICh0eF9maWZvX2lkIDw8IElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfVFhGKSB8Ci0JCQkgKHNjZF9yZXRyeSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTCkgfAotCQkJIChzY2RfcmV0cnkgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNLKSB8Ci0JCQkgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX01TSyk7Ci0KLQl0eHEtPnNjaGVkX3JldHJ5ID0gc2NkX3JldHJ5OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVzICVzIFF1ZXVlICVkIG9uIEFDICVkXG4iLAotCQkgICAgICAgYWN0aXZlID8gIkFjdGl2YXRlIiA6ICJEZWFjdGl2YXRlIiwKLQkJICAgICAgIHNjZF9yZXRyeSA/ICJCQSIgOiAiQUMiLCB0eHFfaWQsIHR4X2ZpZm9faWQpOwotfQotCi0KLXN0YXRpYyBpbnQgaXdsNDk2NV9pbml0X2RydihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGFfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmhjbWRfbG9jayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZnJlZV9mcmFtZXMpOwotCi0JbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwotCi0JcHJpdi0+aWVlZV9jaGFubmVscyA9IE5VTEw7Ci0JcHJpdi0+aWVlZV9yYXRlcyA9IE5VTEw7Ci0JcHJpdi0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gSUVFRTgwMjExX1NNUFNfU1RBVElDOwotCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX0RFRjsKLQotCS8qIGluaXRpYWxpemUgZm9yY2UgcmVzZXQgKi8KLQlwcml2LT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElXTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRDsKLQotCS8qIENob29zZSB3aGljaCByZWNlaXZlcnMvYW50ZW5uYXMgdG8gdXNlICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsCi0JCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0KLQlpd2xfbGVnYWN5X2luaXRfc2Nhbl9wYXJhbXMocHJpdik7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfZ2Vvcyhwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImluaXRpYWxpemluZyBnZW9zIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7Ci0JfQotCWl3bDQ5NjVfaW5pdF9od19yYXRlcyhwcml2LCBwcml2LT5pZWVlX3JhdGVzKTsKLQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9jaGFubmVsX21hcDoKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV91bmluaXRfZHJ2KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2w0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyhwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci0Ja2ZyZWUocHJpdi0+c2Nhbl9jbWQpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2h3X2RldGVjdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+aHdfcmV2ID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIENTUl9IV19SRVYpOwotCXByaXYtPmh3X3dhX3JldiA9IF9pd2xfbGVnYWN5X3JlYWQzMihwcml2LCBDU1JfSFdfUkVWX1dBX1JFRyk7Ci0JcHJpdi0+cmV2X2lkID0gcHJpdi0+cGNpX2Rldi0+cmV2aXNpb247Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkhXIFJldmlzaW9uIElEID0gMHglWFxuIiwgcHJpdi0+cmV2X2lkKTsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3NldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX3NpemUgPSBSWF9RVUVVRV9TSVpFOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX2xvZyA9IFJYX1FVRVVFX1NJWkVfTE9HOwotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPmFtc2R1X3NpemVfOEspCi0JCXByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV84Syk7Ci0JZWxzZQotCQlwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJV0xfUlhfQlVGX1NJWkVfNEspOwotCi0JcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJV0xfTUFYX1VDT0RFX0JFQUNPTl9JTlRFUlZBTDsKLQotCWlmIChwcml2LT5jZmctPm1vZF9wYXJhbXMtPmRpc2FibGVfMTFuKQotCQlwcml2LT5jZmctPnNrdSAmPSB+SVdMX1NLVV9OOwotCi0JLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCi0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9od19wYXJhbXMocHJpdik7Ci19Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2w0OTY1X2Jzc19hY190b19maWZvW10gPSB7Ci0JSVdMX1RYX0ZJRk9fVk8sCi0JSVdMX1RYX0ZJRk9fVkksCi0JSVdMX1RYX0ZJRk9fQkUsCi0JSVdMX1RYX0ZJRk9fQkssCi19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsNDk2NV9ic3NfYWNfdG9fcXVldWVbXSA9IHsKLQkwLCAxLCAyLCAzLAotfTsKLQotc3RhdGljIGludAotaXdsNDk2NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IGVyciA9IDAsIGk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCBpd2xfY2ZnICpjZmcgPSAoc3RydWN0IGl3bF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MTYgcGNpX2NtZDsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JaHcgPSBpd2xfbGVnYWN5X2FsbG9jX2FsbChjZmcpOwotCWlmICghaHcpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXByaXYgPSBody0+cHJpdjsKLQkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIHByaXYgYXJlIGFsbG9jYXRlZC4gKi8KLQotCS8qCi0JICogVGhlIGRlZmF1bHQgY29udGV4dCBpcyBhbHdheXMgdmFsaWQsCi0JICogbW9yZSBtYXkgYmUgZGlzY292ZXJlZCB3aGVuIGZpcm13YXJlCi0JICogaXMgbG9hZGVkLgotCSAqLwotCXByaXYtPnZhbGlkX2NvbnRleHRzID0gQklUKElXTF9SWE9OX0NUWF9CU1MpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9JV0xfUlhPTl9DVFg7IGkrKykKLQkJcHJpdi0+Y29udGV4dHNbaV0uY3R4aWQgPSBpOwotCi0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWx3YXlzX2FjdGl2ZSA9IHRydWU7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaXNfYWN0aXZlID0gdHJ1ZTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX2NtZCA9IFJFUExZX1JYT047Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucnhvbl90aW1pbmdfY21kID0gUkVQTFlfUlhPTl9USU1JTkc7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucnhvbl9hc3NvY19jbWQgPSBSRVBMWV9SWE9OX0FTU09DOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnFvc19jbWQgPSBSRVBMWV9RT1NfUEFSQU07Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYXBfc3RhX2lkID0gSVdMX0FQX0lEOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLndlcF9rZXlfY21kID0gUkVQTFlfV0VQS0VZOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjX3RvX2ZpZm8gPSBpd2w0OTY1X2Jzc19hY190b19maWZvOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjX3RvX3F1ZXVlID0gaXdsNDk2NV9ic3NfYWNfdG9fcXVldWU7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyA9Ci0JCUJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaW50ZXJmYWNlX21vZGVzID0KLQkJQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFwX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0FQOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmlic3NfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfSUJTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOwotCi0JQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMSk7Ci0KLQlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIExPQUQgRFJJVkVSICoqKlxuIik7Ci0JcHJpdi0+Y2ZnID0gY2ZnOwotCXByaXYtPnBjaV9kZXYgPSBwZGV2OwotCXByaXYtPmludGFfbWFzayA9IENTUl9JTklfU0VUX01BU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcGNpX2Rpc2FibGVfbGlua19zdGF0ZShwZGV2LCBQQ0lFX0xJTktfU1RBVEVfTDBTIHwgUENJRV9MSU5LX1NUQVRFX0wxIHwKLQkJCQlQQ0lFX0xJTktfU1RBVEVfQ0xLUE0pOwotCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2llZWU4MDIxMV9mcmVlX2h3OwotCX0KLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzYpKTsKLQlpZiAoIWVycikKLQkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOwotCWlmIChlcnIpIHsKLQkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwKLQkJCQkJCQlETUFfQklUX01BU0soMzIpKTsKLQkJLyogYm90aCBhdHRlbXB0cyBmYWlsZWQ6ICovCi0JCWlmIChlcnIpIHsKLQkJCUlXTF9XQVJOKHByaXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0JCX0KLQl9Ci0KLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdik7Ci0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDMuIFJlYWQgUkVWIHJlZ2lzdGVyCi0JICoqKioqKioqKioqKioqKioqKioqKioqLwotCXByaXYtPmh3X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7Ci0JaWYgKCFwcml2LT5od19iYXNlKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIHByaXYtPmh3X2Jhc2UpOwotCi0JLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCi0JICogd2Ugc2hvdWxkIGluaXQgbm93Ci0JICovCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJlZ19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7Ci0KLQkvKgotCSAqIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IganVzdCBpbiBjYXNlIGl0IGlzIGluIGEKLQkgKiBzdHJhbmdlIHN0YXRlIC4uLiBsaWtlIGJlaW5nIGxlZnQgc3RyYW5kZWQgYnkgYSBwcmltYXJ5IGtlcm5lbAotCSAqIGFuZCB0aGlzIGlzIG5vdyB0aGUga2R1bXAga2VybmVsIHRyeWluZyB0byBzdGFydCB1cAotCSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX05FVk9fUkVTRVQpOwotCi0JaXdsNDk2NV9od19kZXRlY3QocHJpdik7Ci0JSVdMX0lORk8ocHJpdiwgIkRldGVjdGVkICVzLCBSRVY9MHglWFxuIiwKLQkJcHJpdi0+Y2ZnLT5uYW1lLCBwcml2LT5od19yZXYpOwotCi0JLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotCSAqIFBDSSBUeCByZXRyaWVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKLQotCWl3bDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHByaXYpOwotCWlmICghcHJpdi0+aHdfcmVhZHkpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkZhaWxlZCwgSFcgbm90IHJlYWR5XG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioKLQkgKiA0LiBSZWFkIEVFUFJPTQotCSAqKioqKioqKioqKioqKioqKi8KLQkvKiBSZWFkIHRoZSBFRVBST00gKi8KLQllcnIgPSBpd2xfbGVnYWN5X2VlcHJvbV9pbml0KHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0JZXJyID0gaXdsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihwcml2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKLQotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCi0JLyogZXh0cmFjdCBNQUMgQWRkcmVzcyAqLwotCWl3bDQ5NjVfZWVwcm9tX2dldF9tYWMocHJpdiwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkcik7Ci0JcHJpdi0+aHctPndpcGh5LT5hZGRyZXNzZXMgPSBwcml2LT5hZGRyZXNzZXM7Ci0JcHJpdi0+aHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDE7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCi0JICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAoaXdsNDk2NV9zZXRfaHdfcGFyYW1zKHByaXYpKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZXQgaHcgcGFyYW1ldGVyc1xuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqCi0JICogNi4gU2V0dXAgcHJpdgotCSAqKioqKioqKioqKioqKioqKioqLwotCi0JZXJyID0gaXdsNDk2NV9pbml0X2Rydihwcml2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKLQkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIHByaXYgYXJlIGluaXRpYWxpemVkLiAqLwotCi0JLyoqKioqKioqKioqKioqKioqKioqCi0JICogNy4gU2V0dXAgc2VydmljZXMKLQkgKioqKioqKioqKioqKioqKioqKiovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwY2lfZW5hYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQotCWVyciA9IHJlcXVlc3RfaXJxKHByaXYtPnBjaV9kZXYtPmlycSwgaXdsX2xlZ2FjeV9pc3IsCi0JCQkgIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgcHJpdik7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBhbGxvY2F0aW5nIElSUSAlZFxuIiwgcHJpdi0+cGNpX2Rldi0+aXJxKTsKLQkJZ290byBvdXRfZGlzYWJsZV9tc2k7Ci0JfQotCi0JaXdsNDk2NV9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwotCWl3bDQ5NjVfc2V0dXBfcnhfaGFuZGxlcnMocHJpdik7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogOC4gRW5hYmxlIGludGVycnVwdHMgYW5kIHJlYWQgUkZLSUxMIHN0YXRlCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCS8qIGVuYWJsZSByZmtpbGwgaW50ZXJydXB0OiBodyBidWcgdy9hICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocHJpdi0+cGNpX2RldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKLQlpZiAocGNpX2NtZCAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkgewotCQlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7Ci0JfQotCi0JaXdsX2xlZ2FjeV9lbmFibGVfcmZraWxsX2ludChwcml2KTsKLQotCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCi0JaWYgKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwKLQkJdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKTsKLQotCWl3bF9sZWdhY3lfcG93ZXJfaW5pdGlhbGl6ZShwcml2KTsKLQotCWluaXRfY29tcGxldGlvbigmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0KLQllcnIgPSBpd2w0OTY1X3JlcXVlc3RfZmlybXdhcmUocHJpdiwgdHJ1ZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7Ci0KLQlyZXR1cm4gMDsKLQotIG91dF9kZXN0cm95X3dvcmtxdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0JZnJlZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBwcml2KTsKLSBvdXRfZGlzYWJsZV9tc2k6Ci0JcGNpX2Rpc2FibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCWl3bDQ5NjVfdW5pbml0X2Rydihwcml2KTsKLSBvdXRfZnJlZV9lZXByb206Ci0JaXdsX2xlZ2FjeV9lZXByb21fZnJlZShwcml2KTsKLSBvdXRfaW91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLSBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLSBvdXRfaWVlZTgwMjExX2ZyZWVfaHc6Ci0JaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHByaXYpOwotCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKLSBvdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGl3bDQ5NjVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKLQotCWl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3Rlcihwcml2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaXdsX2F0dHJpYnV0ZV9ncm91cCk7Ci0KLQkvKiBpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyBjYWxsIHdpbCBjYXVzZSBpd2xfbWFjX3N0b3AgdG8KLQkgKiB0byBiZSBjYWxsZWQgYW5kIGl3bDQ5NjVfZG93biBzaW5jZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGRldmljZQotCSAqIHdlIG5lZWQgdG8gc2V0IFNUQVRVU19FWElUX1BFTkRJTkcgYml0LgotCSAqLwotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpd2xfbGVnYWN5X2xlZHNfZXhpdChwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQkJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7Ci0JfSBlbHNlIHsKLQkJaXdsNDk2NV9kb3duKHByaXYpOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIGRldmljZSBpcyByZXNldCB0byBsb3cgcG93ZXIgYmVmb3JlIHVubG9hZGluZyBkcml2ZXIuCi0JICogVGhpcyBtYXkgYmUgcmVkdW5kYW50IHdpdGggaXdsNDk2NV9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KLQkgKiBydW4gaXdsNDk2NV9kb3duKCkgd2l0aG91dCBjYWxsaW5nIGFwbV9vcHMuc3RvcCgpLCBhbmQgdGhlcmUgYXJlCi0JICogcGF0aHMgdG8gYXZvaWQgcnVubmluZyBpd2w0OTY1X2Rvd24oKSBhdCBhbGwgYmVmb3JlIGxlYXZpbmcgZHJpdmVyLgotCSAqIFRoaXMgKGluZXhwZW5zaXZlKSBjYWxsICptYWtlcyBzdXJlKiBkZXZpY2UgaXMgcmVzZXQuCi0JICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKLQkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2w0OTY1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCWl3bDQ5NjVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0KLQlpZiAocHJpdi0+cnhxLmJkKQotCQlpd2w0OTY1X3J4X3F1ZXVlX2ZyZWUocHJpdiwgJnByaXYtPnJ4cSk7Ci0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotCi0KLQkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQotCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGxzIGl3bF9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcwotCSAqIHByaXYtPndvcmtxdWV1ZS4uLiBzbyB3ZSBjYW4ndCB0YWtlIGRvd24gdGhlIHdvcmtxdWV1ZQotCSAqIHVudGlsIG5vdy4uLiAqLwotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0JcHJpdi0+d29ya3F1ZXVlID0gTlVMTDsKLQlpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0ocHJpdik7Ci0KLQlmcmVlX2lycShwcml2LT5wY2lfZGV2LT5pcnEsIHByaXYpOwotCXBjaV9kaXNhYmxlX21zaShwcml2LT5wY2lfZGV2KTsKLQlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5od19iYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlpd2w0OTY1X3VuaW5pdF9kcnYocHJpdik7Ci0KLQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotfQotCi0vKgotICogQWN0aXZhdGUvRGVhY3RpdmF0ZSBUeCBETUEvRklGTyBjaGFubmVscyBhY2NvcmRpbmcgdHggZmlmb3MgbWFzawotICogbXVzdCBiZSBjYWxsZWQgdW5kZXIgcHJpdi0+bG9jayBhbmQgbWFjIGFjY2VzcwotICovCi12b2lkIGl3bDQ5NjVfdHhxX3NldF9zY2hlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBtYXNrKQotewotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfVFhGQUNULCBtYXNrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIGFuZCBtb2R1bGUgZW50cnkgcG9pbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhhcmR3YXJlIHNwZWNpZmljIGZpbGUgZGVmaW5lcyB0aGUgUENJIElEcyB0YWJsZSBmb3IgdGhhdCBoYXJkd2FyZSBtb2R1bGUgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpd2w0OTY1X2h3X2NhcmRfaWRzKSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSVdMNDk2NSkKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjI5LCBQQ0lfQU5ZX0lELCBpd2w0OTY1X2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMzAsIFBDSV9BTllfSUQsIGl3bDQ5NjVfY2ZnKX0sCi0jZW5kaWYgLyogQ09ORklHX0lXTDQ5NjUgKi8KLQotCXswfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpd2w0OTY1X2h3X2NhcmRfaWRzKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGl3bDQ5NjVfZHJpdmVyID0gewotCS5uYW1lID0gRFJWX05BTUUsCi0JLmlkX3RhYmxlID0gaXdsNDk2NV9od19jYXJkX2lkcywKLQkucHJvYmUgPSBpd2w0OTY1X3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoaXdsNDk2NV9wY2lfcmVtb3ZlKSwKLQkuZHJpdmVyLnBtID0gSVdMX0xFR0FDWV9QTV9PUFMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpd2w0OTY1X2luaXQodm9pZCkKLXsKLQotCWludCByZXQ7Ci0JcHJfaW5mbyhEUlZfREVTQ1JJUFRJT04gIiwgIiBEUlZfVkVSU0lPTiAiXG4iKTsKLQlwcl9pbmZvKERSVl9DT1BZUklHSFQgIlxuIik7Ci0KLQlyZXQgPSBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3RlcigpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobTogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaXdsNDk2NV9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKLQkJZ290byBlcnJvcl9yZWdpc3RlcjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnJvcl9yZWdpc3RlcjoKLQlpd2w0OTY1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGl3bDQ5NjVfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaXdsNDk2NV9kcml2ZXIpOwotCWl3bDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKLX0KLQotbW9kdWxlX2V4aXQoaXdsNDk2NV9leGl0KTsKLW1vZHVsZV9pbml0KGl3bDQ5NjVfaW5pdCk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaXdsZWdhY3lfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwotI2VuZGlmCi0KLW1vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaXdsNDk2NV9tb2RfcGFyYW1zLnN3X2NyeXB0bywgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Moc3djcnlwdG8sICJ1c2luZyBjcnlwdG8gaW4gc29mdHdhcmUgKGRlZmF1bHQgMCBbaGFyZHdhcmVdKSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHF1ZXVlc19udW0sIGl3bDQ5NjVfbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhxdWV1ZXNfbnVtLCAibnVtYmVyIG9mIGh3IHF1ZXVlcy4iKTsKLW1vZHVsZV9wYXJhbV9uYW1lZCgxMW5fZGlzYWJsZSwgaXdsNDk2NV9tb2RfcGFyYW1zLmRpc2FibGVfMTFuLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwgImRpc2FibGUgMTFuIGZ1bmN0aW9uYWxpdHkiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChhbXNkdV9zaXplXzhLLCBpd2w0OTY1X21vZF9wYXJhbXMuYW1zZHVfc2l6ZV84SywKLQkJICAgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYW1zZHVfc2l6ZV84SywgImVuYWJsZSA4SyBhbXNkdSBzaXplIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaXdsNDk2NV9tb2RfcGFyYW1zLnJlc3RhcnRfZncsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZ3X3Jlc3RhcnQsICJyZXN0YXJ0IGZpcm13YXJlIGluIGNhc2Ugb2YgZXJyb3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L3BycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L3BycGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvcHJwaC5oCkBAIC0wLDAgKzEsNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9faWxfcHJwaF9oX18KKyNkZWZpbmUgX19pbF9wcnBoX2hfXworCisvKgorICogUmVnaXN0ZXJzIGluIHRoaXMgZmlsZSBhcmUgaW50ZXJuYWwsIG5vdCBQQ0kgYnVzIG1lbW9yeSBtYXBwZWQuCisgKiBEcml2ZXIgYWNjZXNzZXMgdGhlc2UgdmlhIEhCVVNfVEFSR19QUlBIXyogcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFBSUEhfQkFTRQkoMHgwMDAwMCkKKyNkZWZpbmUgUFJQSF9FTkQJKDB4RkZGRkYpCisKKy8qIEFQTUcgKHBvd2VyIG1hbmFnZW1lbnQpIGNvbnN0YW50cyAqLworI2RlZmluZSBBUE1HX0JBU0UJCQkoUFJQSF9CQVNFICsgMHgzMDAwKQorI2RlZmluZSBBUE1HX0NMS19DVFJMX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwMCkKKyNkZWZpbmUgQVBNR19DTEtfRU5fUkVHCQkJKEFQTUdfQkFTRSArIDB4MDAwNCkKKyNkZWZpbmUgQVBNR19DTEtfRElTX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwOCkKKyNkZWZpbmUgQVBNR19QU19DVFJMX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAwYykKKyNkZWZpbmUgQVBNR19QQ0lERVZfU1RUX1JFRwkJKEFQTUdfQkFTRSArIDB4MDAxMCkKKyNkZWZpbmUgQVBNR19SRktJTExfUkVHCQkJKEFQTUdfQkFTRSArIDB4MDAxNCkKKyNkZWZpbmUgQVBNR19SVENfSU5UX1NUVF9SRUcJCShBUE1HX0JBU0UgKyAweDAwMWMpCisjZGVmaW5lIEFQTUdfUlRDX0lOVF9NU0tfUkVHCQkoQVBNR19CQVNFICsgMHgwMDIwKQorI2RlZmluZSBBUE1HX0RJR0lUQUxfU1ZSX1JFRwkJKEFQTUdfQkFTRSArIDB4MDA1OCkKKyNkZWZpbmUgQVBNR19BTkFMT0dfU1ZSX1JFRwkJKEFQTUdfQkFTRSArIDB4MDA2QykKKworI2RlZmluZSBBUE1TX0NMS19WQUxfTVJCX0ZVTkNfTU9ERQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUCSgweDAwMDAwMjAwKQorI2RlZmluZSBBUE1HX0NMS19WQUxfQlNNX0NMS19SUVQJKDB4MDAwMDA4MDApCisKKyNkZWZpbmUgQVBNR19QU19DVFJMX0VBUkxZX1BXUl9PRkZfUkVTRVRfRElTCSgweDAwNDAwMDAwKQorI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUQkJKDB4MDQwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQwkJKDB4MDMwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19NQVgJCSgweDAxMDAwMDAwKQkvKiAzOTQ1IG9ubHkgKi8KKyNkZWZpbmUgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgJCSgweDAyMDAwMDAwKQorI2RlZmluZSBBUE1HX1NWUl9WT0xUQUdFX0NPTkZJR19CSVRfTVNLCSgweDAwMDAwMUUwKQkvKiBiaXQgODo1ICovCisjZGVmaW5lIEFQTUdfU1ZSX0RJR0lUQUxfVk9MVEFHRV8xXzMyCQkoMHgwMDAwMDA2MCkKKworI2RlZmluZSBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMJCSgweDAwMDAwODAwKQorCisvKioKKyAqIEJTTSAoQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUpCisgKgorICogVGhlIEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lIChCU00pIHN0b3JlcyBhIHNob3J0IGJvb3RzdHJhcCB1Q29kZSBwcm9ncmFtCisgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIHdoZW4gdGhlIGVtYmVkZGVkIGNvbnRyb2wKKyAqIHByb2Nlc3NvciBpcyBzbGVlcGluZyAoZS5nLiBmb3IgcGVyaW9kaWMgcG93ZXItc2F2aW5nIHNodXRkb3ducyBvZiByYWRpbykuCisgKgorICogV2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00KKyAqIGludGVybmFsbHkgbG9hZHMgdGhlIHNob3J0IGJvb3RzdHJhcCBwcm9ncmFtIGZyb20gdGhlIHNwZWNpYWwgU1JBTSBpbnRvIHRoZQorICogZW1iZWRkZWQgcHJvY2Vzc29yJ3MgaW5zdHJ1Y3Rpb24gU1JBTSwgYW5kIHN0YXJ0cyB0aGUgcHJvY2Vzc29yIHNvIGl0IHJ1bnMKKyAqIHRoZSBib290c3RyYXAgcHJvZ3JhbS4KKyAqCisgKiBUaGlzIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgUENJIGJ1c21hc3RlciBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YQorICogaW1hZ2VzIGZvciBhIHVDb2RlIHByb2dyYW0gZnJvbSBob3N0IERSQU0gbG9jYXRpb25zLiAgVGhlIGhvc3QgZHJpdmVyCisgKiBpbmRpY2F0ZXMgRFJBTSBsb2NhdGlvbnMgYW5kIHNpemVzIGZvciBpbnN0cnVjdGlvbiBhbmQgZGF0YSBpbWFnZXMgdmlhIHRoZQorICogZm91ciBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzIHRoZSBuZXcgcHJvZ3JhbSwKKyAqIHRoZSBuZXcgcHJvZ3JhbSBzdGFydHMgYXV0b21hdGljYWxseS4KKyAqCisgKiBUaGUgdUNvZGUgdXNlZCBmb3Igb3Blbi1zb3VyY2UgZHJpdmVycyBpbmNsdWRlcyB0d28gcHJvZ3JhbXM6CisgKgorICogMSkgIEluaXRpYWxpemF0aW9uIC0tIHBlcmZvcm1zIGhhcmR3YXJlIGNhbGlicmF0aW9uIGFuZCBzZXRzIHVwIHNvbWUKKyAqICAgICBpbnRlcm5hbCBkYXRhLCB0aGVuIG5vdGlmaWVzIGhvc3QgdmlhICJpbml0aWFsaXplIGFsaXZlIiBub3RpZmljYXRpb24KKyAqICAgICAoc3RydWN0IGlsX2luaXRfYWxpdmVfcmVzcCkgdGhhdCBpdCBoYXMgY29tcGxldGVkIGFsbCBvZiBpdHMgd29yay4KKyAqICAgICBBZnRlciBzaWduYWwgZnJvbSBob3N0LCBpdCB0aGVuIGxvYWRzIGFuZCBzdGFydHMgdGhlIHJ1bnRpbWUgcHJvZ3JhbS4KKyAqICAgICBUaGUgaW5pdGlhbGl6YXRpb24gcHJvZ3JhbSBtdXN0IGJlIHVzZWQgd2hlbiBpbml0aWFsbHkgc2V0dGluZyB1cCB0aGUKKyAqICAgICBOSUMgYWZ0ZXIgbG9hZGluZyB0aGUgZHJpdmVyLgorICoKKyAqIDIpICBSdW50aW1lL1Byb3RvY29sIC0tIHBlcmZvcm1zIGFsbCBub3JtYWwgcnVudGltZSBvcGVyYXRpb25zLiAgVGhpcworICogICAgIG5vdGlmaWVzIGhvc3QgdmlhICJhbGl2ZSIgbm90aWZpY2F0aW9uIChzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkgdGhhdCBpdAorICogICAgIGlzIHJlYWR5IHRvIGJlIHVzZWQuCisgKgorICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIGRvZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmU6CisgKgorICogMSkgIExvYWQgYm9vdHN0cmFwIHByb2dyYW0gKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhIGltYWdlIGZvciBib290c3RyYXApCisgKiAgICAgaW50byBib290c3RyYXAgbWVtb3J5LiAgVXNlIGR3b3JkIHdyaXRlcyBzdGFydGluZyBhdCBCU01fU1JBTV9MT1dFUl9CT1VORAorICoKKyAqIDIpICBQb2ludCAodmlhIEJTTV9EUkFNXyopIHRvIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24KKyAqICAgICBpbWFnZXMgaW4gaG9zdCBEUkFNLgorICoKKyAqIDMpICBTZXQgdXAgQlNNIHRvIGNvcHkgZnJvbSBCU00gU1JBTSBpbnRvIHVDb2RlIGluc3RydWN0aW9uIFNSQU0gd2hlbiBhc2tlZDoKKyAqICAgICBCU01fV1JfTUVNX1NSQ19SRUcgPSAwCisgKiAgICAgQlNNX1dSX01FTV9EU1RfUkVHID0gUlRDX0lOU1RfTE9XRVJfQk9VTkQKKyAqICAgICBCU01fV1JfTUVNX0RXQ09VTlRfUkVHID0gIyBkd29yZHMgaW4gYm9vdHN0cmFwIGluc3RydWN0aW9uIGltYWdlCisgKgorICogNCkgIExvYWQgYm9vdHN0cmFwIGludG8gaW5zdHJ1Y3Rpb24gU1JBTToKKyAqICAgICBCU01fV1JfQ1RSTF9SRUcgPSBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUCisgKgorICogNSkgIFdhaXQgZm9yIGxvYWQgY29tcGxldGlvbjoKKyAqICAgICBQb2xsIEJTTV9XUl9DVFJMX1JFRyBmb3IgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCA9IDAKKyAqCisgKiA2KSAgRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIE5JQydzIHBvd2VyIG1hbmFnZW1lbnQgdHJpZ2dlcnMgaXQ6CisgKiAgICAgQlNNX1dSX0NUUkxfUkVHID0gQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTgorICoKKyAqIDcpICBTdGFydCB0aGUgTklDIGJ5IHJlbW92aW5nIGFsbCByZXNldCBiaXRzOgorICogICAgIENTUl9SRVNFVCA9IDAKKyAqCisgKiAgICAgVGhlIGJvb3RzdHJhcCB1Q29kZSAoYWxyZWFkeSBpbiBpbnN0cnVjdGlvbiBTUkFNKSBsb2FkcyBpbml0aWFsaXphdGlvbgorICogICAgIHVDb2RlLiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgcGVyZm9ybXMgZGF0YSBpbml0aWFsaXphdGlvbiwgc2VuZHMKKyAqICAgICAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIHRvIGhvc3QsIGFuZCB3YWl0cyBmb3IgYSBzaWduYWwgZnJvbQorICogICAgIGhvc3QgdG8gbG9hZCBydW50aW1lIGNvZGUuCisgKgorICogNCkgIFBvaW50ICh2aWEgQlNNX0RSQU1fKikgdG8gdGhlICJydW50aW1lIiB1Q29kZSBkYXRhIGFuZCBpbnN0cnVjdGlvbgorICogICAgIGltYWdlcyBpbiBob3N0IERSQU0uICBUaGUgbGFzdCByZWdpc3RlciBsb2FkZWQgbXVzdCBiZSB0aGUgaW5zdHJ1Y3Rpb24KKyAqICAgICBieXRlIGNvdW50IHJlZ2lzdGVyICgiMSIgaW4gTVNiaXQgdGVsbHMgaW5pdGlhbGl6YXRpb24gdUNvZGUgdG8gbG9hZAorICogICAgIHRoZSBydW50aW1lIHVDb2RlKToKKyAqICAgICBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgPSBieXRlIGNvdW50IHwgQlNNX0RSQU1fSU5TVF9MT0FECisgKgorICogNSkgIFdhaXQgZm9yICJhbGl2ZSIgbm90aWZpY2F0aW9uLCB0aGVuIGlzc3VlIG5vcm1hbCBydW50aW1lIGNvbW1hbmRzLgorICoKKyAqIERhdGEgY2FjaGluZyBkdXJpbmcgcG93ZXItZG93bnM6CisgKgorICogSnVzdCBiZWZvcmUgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIgcG93ZXJzIGRvd24gKGUuZyBmb3IgYXV0b21hdGljCisgKiBwb3dlci1zYXZpbmcgbW9kZXMsIG9yIGZvciBSRktJTEwpLCB1Q29kZSBzdG9yZXMgKHZpYSBQQ0kgYnVzbWFzdGVyIERNQSkKKyAqIGEgY3VycmVudCBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yJ3MgZGF0YSBTUkFNIGludG8gaG9zdCBEUkFNLgorICogVGhpcyBjYWNoZXMgdGhlIGRhdGEgd2hpbGUgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcidzIG1lbW9yeSBpcyBwb3dlcmVkIGRvd24uCisgKiBMb2NhdGlvbiBhbmQgc2l6ZSBhcmUgY29udHJvbGxlZCBieSBCU01fRFJBTV9EQVRBXyogcmVnaXN0ZXJzLgorICoKKyAqIE5PVEU6ICBJbnN0cnVjdGlvbiBTUkFNIGRvZXMgbm90IG5lZWQgdG8gYmUgc2F2ZWQsIHNpbmNlIHRoYXQgZG9lc24ndAorICogICAgICAgIGNoYW5nZSBkdXJpbmcgb3BlcmF0aW9uOyB0aGUgb3JpZ2luYWwgaW1hZ2UgKGZyb20gdUNvZGUgZGlzdHJpYnV0aW9uCisgKiAgICAgICAgZmlsZSkgY2FuIGJlIHVzZWQgZm9yIHJlbG9hZC4KKyAqCisgKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgQm9vdHN0cmFwIGxvb2tzCisgKiBhdCB0aGUgQlNNX0RSQU1fKiByZWdpc3RlcnMsIHdoaWNoIG5vdyBwb2ludCB0byB0aGUgcnVudGltZSBpbnN0cnVjdGlvbgorICogaW1hZ2UgYW5kIHRoZSBjYWNoZWQgKG1vZGlmaWVkKSBydW50aW1lIGRhdGEgKCpub3QqIHRoZSBpbml0aWFsaXphdGlvbgorICogdUNvZGUpLiAgQm9vdHN0cmFwIHJlbG9hZHMgdGhlc2UgcnVudGltZSBpbWFnZXMgaW50byBTUkFNLCBhbmQgcmVzdGFydHMgdGhlCisgKiB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmIGJlZm9yZSB0aGUgcG93ZXItZG93bi4KKyAqCisgKiBOT1RFOiAgSW5pdGlhbGl6YXRpb24gdUNvZGUgZG9lcyAqbm90KiBydW4gYXMgcGFydCBvZiB0aGUgc2F2ZS9yZXN0b3JlCisgKiAgICAgICAgcHJvY2VkdXJlLgorICoKKyAqIFRoaXMgc2F2ZS9yZXN0b3JlIG1ldGhvZCBpcyBtb3N0bHkgZm9yIGF1dG9ub21vdXMgcG93ZXIgbWFuYWdlbWVudCBkdXJpbmcKKyAqIG5vcm1hbCBvcGVyYXRpb24gKHJlc3VsdCBvZiBDX1BPV0VSX1RCTCkuICBQbGF0Zm9ybSBzdXNwZW5kL3Jlc3VtZSBhbmQKKyAqIFJGS0lMTCBzaG91bGQgdXNlIGNvbXBsZXRlIHJlc3RhcnRzICh3aXRoIHRvdGFsIHJlLWluaXRpYWxpemF0aW9uKSBvZiB1Q29kZSwKKyAqIGFsbG93aW5nIHRvdGFsIHNodXRkb3duIChpbmNsdWRpbmcgQlNNIG1lbW9yeSkuCisgKgorICogTm90ZSB0aGF0LCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgdGhlIGhvc3QgRFJBTSB0aGF0IGhlbGQgdGhlIGluaXRpYWwKKyAqIHN0YXJ0dXAgZGF0YSBmb3IgdGhlIHJ1bnRpbWUgY29kZSBpcyBub3cgYmVpbmcgdXNlZCBhcyBhIGJhY2t1cCBkYXRhIGNhY2hlCisgKiBmb3IgbW9kaWZpZWQgZGF0YSEgIElmIHlvdSBuZWVkIHRvIGNvbXBsZXRlbHkgcmUtaW5pdGlhbGl6ZSB0aGUgTklDLCBtYWtlCisgKiBzdXJlIHRoYXQgeW91IHVzZSB0aGUgcnVudGltZSBkYXRhIGltYWdlIGZyb20gdGhlIHVDb2RlIGRpc3RyaWJ1dGlvbiBmaWxlLAorICogbm90IHRoZSBtb2RpZmllZC9zYXZlZCBydW50aW1lIGRhdGEuICBZb3UgbWF5IHdhbnQgdG8gc3RvcmUgYSBzZXBhcmF0ZQorICogImNsZWFuIiBydW50aW1lIGRhdGEgaW1hZ2UgaW4gRFJBTSB0byBhdm9pZCBkaXNrIHJlYWRzIG9mIGRpc3RyaWJ1dGlvbiBmaWxlLgorICovCisKKy8qIEJTTSBiaXQgZmllbGRzICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQgICAgICgweDgwMDAwMDAwKQkvKiBzdGFydCBib290IGxvYWQgbm93ICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4gICgweDQwMDAwMDAwKQkvKiBlbmFibGUgYm9vdCBhZnRlciBwd3J1cCAqLworI2RlZmluZSBCU01fRFJBTV9JTlNUX0xPQUQgICAgICAgICAgICAoMHg4MDAwMDAwMCkJLyogc3RhcnQgcHJvZ3JhbSBsb2FkIG5vdyAqLworCisvKiBCU00gYWRkcmVzc2VzICovCisjZGVmaW5lIEJTTV9CQVNFICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzQwMCkKKyNkZWZpbmUgQlNNX0VORCAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgzODAwKQorCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFRyAgICAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDApCS8qIGN0bCBhbmQgc3RhdHVzICovCisjZGVmaW5lIEJTTV9XUl9NRU1fU1JDX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDQpCS8qIHNvdXJjZSBpbiBCU00gbWVtICovCisjZGVmaW5lIEJTTV9XUl9NRU1fRFNUX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDgpCS8qIGRlc3QgaW4gU1JBTSBtZW0gKi8KKyNkZWZpbmUgQlNNX1dSX0RXQ09VTlRfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwQykJLyogYnl0ZXMgKi8KKyNkZWZpbmUgQlNNX1dSX1NUQVRVU19SRUcgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAxMCkJLyogYml0IDA6ICAxID09IGRvbmUgKi8KKworLyoKKyAqIFBvaW50ZXJzIGFuZCBzaXplIHJlZ3MgZm9yIGJvb3RzdHJhcCBsb2FkIGFuZCBkYXRhIFNSQU0gc2F2ZS9yZXN0b3JlLgorICogTk9URTogIDM5NDUgcG9pbnRlcnMgdXNlIGJpdHMgMzE6MCBvZiBEUkFNIGFkZHJlc3MuCisgKiAgICAgICAgNDk2NSBwb2ludGVycyB1c2UgYml0cyAzNTo0IG9mIERSQU0gYWRkcmVzcy4KKyAqLworI2RlZmluZSBCU01fRFJBTV9JTlNUX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDkwKQorI2RlZmluZSBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDk0KQorI2RlZmluZSBCU01fRFJBTV9EQVRBX1BUUl9SRUcgICAgICAgIChCU01fQkFTRSArIDB4MDk4KQorI2RlZmluZSBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcgIChCU01fQkFTRSArIDB4MDlDKQorCisvKgorICogQlNNIHNwZWNpYWwgbWVtb3J5LCBzdGF5cyBwb3dlcmVkIG9uIGR1cmluZyBwb3dlci1zYXZlIHNsZWVwcy4KKyAqIFJlYWQvd3JpdGUsIGFkZHJlc3MgcmFuZ2UgZnJvbSBMT1dFUl9CT1VORCB0byAoTE9XRVJfQk9VTkQgKyBTSVpFIC0xKQorICovCisjZGVmaW5lIEJTTV9TUkFNX0xPV0VSX0JPVU5EICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzgwMCkKKyNkZWZpbmUgQlNNX1NSQU1fU0laRQkJCSgxMDI0KQkvKiBieXRlcyAqLworCisvKiAzOTQ1IFR4IHNjaGVkdWxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUxNX1NDRF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MkUwMCkKKyNkZWZpbmUgQUxNX1NDRF9NT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDAwKQorI2RlZmluZSBBTE1fU0NEX0FSQVNUQVRfUkVHICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMDQpCisjZGVmaW5lIEFMTV9TQ0RfVFhGQUNUX1JFRyAgICAgICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAxMCkKKyNkZWZpbmUgQUxNX1NDRF9UWEY0TUZfUkVHICAgICAgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDE0KQorI2RlZmluZSBBTE1fU0NEX1RYRjVNRl9SRUcgICAgICAgICAgICAgICAgICAoQUxNX1NDRF9CQVNFICsgMHgwMjApCisjZGVmaW5lIEFMTV9TQ0RfU0JZUF9NT0RFXzFfUkVHICAgICAgICAgICAgIChBTE1fU0NEX0JBU0UgKyAweDAyQykKKyNkZWZpbmUgQUxNX1NDRF9TQllQX01PREVfMl9SRUcgICAgICAgICAgICAgKEFMTV9TQ0RfQkFTRSArIDB4MDMwKQorCisvKioKKyAqIFR4IFNjaGVkdWxlcgorICoKKyAqIFRoZSBUeCBTY2hlZHVsZXIgc2VsZWN0cyB0aGUgbmV4dCBmcmFtZSB0byBiZSB0cmFuc21pdHRlZCwgY2hvb3NpbmcgVEZEcworICogKFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3JzKSBmcm9tIHVwIHRvIDE2IGNpcmN1bGFyIFR4IHF1ZXVlcyByZXNpZGVudCBpbgorICogaG9zdCBEUkFNLiAgSXQgc3RlZXJzIGVhY2ggZnJhbWUncyBUeCBjb21tYW5kICh3aGljaCBjb250YWlucyB0aGUgZnJhbWUKKyAqIGRhdGEpIGludG8gb25lIG9mIHVwIHRvIDcgcHJpb3JpdGl6ZWQgVHggRE1BIEZJRk8gY2hhbm5lbHMgd2l0aGluIHRoZQorICogZGV2aWNlLiAgQSBxdWV1ZSBtYXBzIHRvIG9ubHkgb25lIChzZWxlY3RhYmxlIGJ5IGRyaXZlcikgVHggRE1BIGNoYW5uZWwsCisgKiBidXQgb25lIERNQSBjaGFubmVsIG1heSB0YWtlIGlucHV0IGZyb20gc2V2ZXJhbCBxdWV1ZXMuCisgKgorICogVHggRE1BIEZJRk9zIGhhdmUgZGVkaWNhdGVkIHB1cnBvc2VzLiAgRm9yIDQ5NjUsIHRoZXkgYXJlIHVzZWQgYXMgZm9sbG93cworICogKGNmLiBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8gaW4gNDk2NS5jKToKKyAqCisgKiAwIC0tIEVEQ0EgQksgKGJhY2tncm91bmQpIGZyYW1lcywgbG93ZXN0IHByaW9yaXR5CisgKiAxIC0tIEVEQ0EgQkUgKGJlc3QgZWZmb3J0KSBmcmFtZXMsIG5vcm1hbCBwcmlvcml0eQorICogMiAtLSBFRENBIFZJICh2aWRlbykgZnJhbWVzLCBoaWdoZXIgcHJpb3JpdHkKKyAqIDMgLS0gRURDQSBWTyAodm9pY2UpIGFuZCBtYW5hZ2VtZW50IGZyYW1lcywgaGlnaGVzdCBwcmlvcml0eQorICogNCAtLSBDb21tYW5kcyAoZS5nLiBSWE9OLCBldGMuKQorICogNSAtLSB1bnVzZWQgKEhDQ0EpCisgKiA2IC0tIHVudXNlZCAoSENDQSkKKyAqIDcgLS0gbm90IHVzZWQgYnkgZHJpdmVyIChkZXZpY2UtaW50ZXJuYWwgb25seSkKKyAqCisgKgorICogRHJpdmVyIHNob3VsZCBub3JtYWxseSBtYXAgcXVldWVzIDAtNiB0byBUeCBETUEvRklGTyBjaGFubmVscyAwLTYuCisgKiBJbiBhZGRpdGlvbiwgZHJpdmVyIGNhbiBtYXAgdGhlIHJlbWFpbmluZyBxdWV1ZXMgdG8gVHggRE1BL0ZJRk8KKyAqIGNoYW5uZWxzIDAtMyB0byBzdXBwb3J0IDExbiBhZ2dyZWdhdGlvbiB2aWEgRURDQSBETUEgY2hhbm5lbHMuCisgKgorICogVGhlIGRyaXZlciBzZXRzIHVwIGVhY2ggcXVldWUgdG8gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzOgorICoKKyAqIDEpICBTY2hlZHVsZXItQWNrLCBpbiB3aGljaCB0aGUgc2NoZWR1bGVyIGF1dG9tYXRpY2FsbHkgc3VwcG9ydHMgYQorICogICAgIGJsb2NrLWFjayAoQkEpIHdpbiBvZiB1cCB0byA2NCBURkRzLiAgSW4gdGhpcyBtb2RlLCBlYWNoIHF1ZXVlCisgKiAgICAgY29udGFpbnMgVEZEcyBmb3IgYSB1bmlxdWUgY29tYmluYXRpb24gb2YgUmVjaXBpZW50IEFkZHJlc3MgKFJBKQorICogICAgIGFuZCBUcmFmZmljIElkZW50aWZpZXIgKFRJRCksIHRoYXQgaXMsIHRyYWZmaWMgb2YgYSBnaXZlbgorICogICAgIFF1YWxpdHktT2YtU2VydmljZSAoUU9TKSBwcmlvcml0eSwgZGVzdGluZWQgZm9yIGEgc2luZ2xlIHN0YXRpb24uCisgKgorICogICAgIEluIHNjaGVkdWxlci1hY2sgbW9kZSwgdGhlIHNjaGVkdWxlciBrZWVwcyB0cmFjayBvZiB0aGUgVHggc3RhdHVzIG9mCisgKiAgICAgZWFjaCBmcmFtZSB3aXRoaW4gdGhlIEJBIHdpbiwgaW5jbHVkaW5nIHdoZXRoZXIgaXQncyBiZWVuIHRyYW5zbWl0dGVkLAorICogICAgIGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHJlY2VpdmluZyBzdGF0aW9uLiAgVGhlIGRldmljZQorICogICAgIGF1dG9tYXRpY2FsbHkgcHJvY2Vzc2VzIGJsb2NrLWFja3MgcmVjZWl2ZWQgZnJvbSB0aGUgcmVjZWl2aW5nIFNUQSwKKyAqICAgICBhbmQgcmVzY2hlZHVsZXMgdW4tYWNrZWQgZnJhbWVzIHRvIGJlIHJldHJhbnNtaXR0ZWQgKHN1Y2Nlc3NmdWwKKyAqICAgICBUeCBjb21wbGV0aW9uIG1heSBlbmQgdXAgYmVpbmcgb3V0LW9mLW9yZGVyKS4KKyAqCisgKiAgICAgVGhlIGRyaXZlciBtdXN0IG1haW50YWluIHRoZSBxdWV1ZSdzIEJ5dGUgQ291bnQgdGFibGUgaW4gaG9zdCBEUkFNCisgKiAgICAgKHN0cnVjdCBpbDQ5NjVfc2NoZWRfcXVldWVfYnl0ZV9jbnRfdGJsKSBmb3IgdGhpcyBtb2RlLgorICogICAgIFRoaXMgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGZyYWdtZW50YXRpb24uCisgKgorICogMikgIEZJRk8gKGEuay5hLiBub24tU2NoZWR1bGVyLUFDSyksIGluIHdoaWNoIGVhY2ggVEZEIGlzIHByb2Nlc3NlZCBpbiBvcmRlci4KKyAqICAgICBUaGUgZGV2aWNlIG1heSBhdXRvbWF0aWNhbGx5IHJldHJ5IFR4LCBidXQgd2lsbCByZXRyeSBvbmx5IG9uZSBmcmFtZQorICogICAgIGF0IGEgdGltZSwgdW50aWwgcmVjZWl2aW5nIEFDSyBmcm9tIHJlY2VpdmluZyBzdGF0aW9uLCBvciByZWFjaGluZworICogICAgIHJldHJ5IGxpbWl0IGFuZCBnaXZpbmcgdXAuCisgKgorICogICAgIFRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgbXVzdCB1c2UgdGhpcyBtb2RlIQorICogICAgIFRoaXMgbW9kZSBkb2VzIG5vdCByZXF1aXJlIHVzZSBvZiB0aGUgQnl0ZSBDb3VudCB0YWJsZSBpbiBob3N0IERSQU0uCisgKgorICogRHJpdmVyIGNvbnRyb2xzIHNjaGVkdWxlciBvcGVyYXRpb24gdmlhIDMgbWVhbnM6CisgKiAxKSAgU2NoZWR1bGVyIHJlZ2lzdGVycworICogMikgIFNoYXJlZCBzY2hlZHVsZXIgZGF0YSBiYXNlIGluIGludGVybmFsIDQ5NTYgU1JBTQorICogMykgIFNoYXJlZCBkYXRhIGluIGhvc3QgRFJBTQorICoKKyAqIEluaXRpYWxpemF0aW9uOgorICoKKyAqIFdoZW4gbG9hZGluZywgZHJpdmVyIHNob3VsZCBhbGxvY2F0ZSBtZW1vcnkgZm9yOgorICogMSkgIDE2IFRGRCBjaXJjdWxhciBidWZmZXJzLCBlYWNoIHdpdGggc3BhY2UgZm9yICh0eXBpY2FsbHkpIDI1NiBURkRzLgorICogMikgIDE2IEJ5dGUgQ291bnQgY2lyY3VsYXIgYnVmZmVycyBpbiAxNiBLQnl0ZXMgY29udGlndW91cyBtZW1vcnkKKyAqICAgICAoMTAyNCBieXRlcyBmb3IgZWFjaCBxdWV1ZSkuCisgKgorICogQWZ0ZXIgcmVjZWl2aW5nICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSB1Q29kZSwgZHJpdmVyIG11c3QgaW5pdGlhbGl6ZQorICogdGhlIHNjaGVkdWxlciAoZXNwZWNpYWxseSBmb3IgcXVldWUgIzQvIzksIHRoZSBjb21tYW5kIHF1ZXVlLCBvdGhlcndpc2UKKyAqIHRoZSBkcml2ZXIgY2FuJ3QgaXNzdWUgY29tbWFuZHMhKToKKyAqLworCisvKioKKyAqIE1heCBUeCB3aW4gc2l6ZSBpcyB0aGUgbWF4IG51bWJlciBvZiBjb250aWd1b3VzIFRGRHMgdGhhdCB0aGUgc2NoZWR1bGVyCisgKiBjYW4ga2VlcCB0cmFjayBvZiBhdCBvbmUgdGltZSB3aGVuIGNyZWF0aW5nIGJsb2NrLWFjayBjaGFpbnMgb2YgZnJhbWVzLgorICogTm90ZSB0aGF0ICI2NCIgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGFjayBiaXRzIGluIGEgYmxvY2stYWNrIHBhY2tldC4KKyAqIERyaXZlciBzaG91bGQgdXNlIFNDRF9XSU5fU0laRSBhbmQgU0NEX0ZSQU1FX0xJTUlUIHZhbHVlcyB0byBpbml0aWFsaXplCisgKiBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh4KSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU0NEX1dJTl9TSVpFCQkJCTY0CisjZGVmaW5lIFNDRF9GUkFNRV9MSU1JVAkJCQk2NAorCisvKiBTQ0QgcmVnaXN0ZXJzIGFyZSBpbnRlcm5hbCwgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgSEJVU19UQVJHX1BSUEggcmVncyAqLworI2RlZmluZSBJTDQ5X1NDRF9TVEFSVF9PRkZTRVQJCTB4YTAyYzAwCisKKy8qCisgKiA0OTY1IHRlbGxzIGRyaXZlciBTUkFNIGFkZHJlc3MgZm9yIGludGVybmFsIHNjaGVkdWxlciBzdHJ1Y3RzIHZpYSB0aGlzIHJlZy4KKyAqIFZhbHVlIGlzIHZhbGlkIG9ubHkgYWZ0ZXIgIkFsaXZlIiByZXNwb25zZSBmcm9tIHVDb2RlLgorICovCisjZGVmaW5lIElMNDlfU0NEX1NSQU1fQkFTRV9BRERSICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgwKQorCisvKgorICogRHJpdmVyIG1heSBuZWVkIHRvIHVwZGF0ZSBxdWV1ZS1lbXB0eSBiaXRzIGFmdGVyIGNoYW5naW5nIHF1ZXVlJ3MKKyAqIHdyaXRlIGFuZCByZWFkIHBvaW50ZXJzIChpZHhlcykgZHVyaW5nIChyZS0paW5pdGlhbGl6YXRpb24gKGkuZS4gd2hlbgorICogc2NoZWR1bGVyIGlzIG5vdCB0cmFja2luZyB3aGF0J3MgaGFwcGVuaW5nKS4KKyAqIEJpdCBmaWVsZHM6CisgKiAzMS0xNjogIFdyaXRlIG1hc2sgLS0gMTogdXBkYXRlIGVtcHR5IGJpdCwgMDogZG9uJ3QgY2hhbmdlIGVtcHR5IGJpdAorICogMTUtMDA6ICBFbXB0eSBzdGF0ZSwgb25lIGZvciBlYWNoIHF1ZXVlIC0tIDE6IGVtcHR5LCAwOiBub24tZW1wdHkKKyAqIE5PVEU6ICBUaGlzIHJlZ2lzdGVyIGlzIG5vdCB1c2VkIGJ5IExpbnV4IGRyaXZlci4KKyAqLworI2RlZmluZSBJTDQ5X1NDRF9FTVBUWV9CSVRTICAgICAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4NCkKKworLyoKKyAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBhcnJheSBvZiBieXRlIGNvdW50IChCQykgY2lyY3VsYXIgYnVmZmVycyAoQ0JzKS4KKyAqIEVhY2ggVHggcXVldWUgaGFzIGEgQkMgQ0IgaW4gaG9zdCBEUkFNIHRvIHN1cHBvcnQgU2NoZWR1bGVyLUFDSyBtb2RlLgorICogVGhpcyByZWdpc3RlciBwb2ludHMgdG8gQkMgQ0IgZm9yIHF1ZXVlIDAsIG11c3QgYmUgb24gMTAyNC1ieXRlIGJvdW5kYXJ5LgorICogT3RoZXJzIGFyZSBzcGFjZWQgYnkgMTAyNCBieXRlcy4KKyAqIEVhY2ggQkMgQ0IgaXMgMiBieXRlcyAqICgyNTYgKyA2NCkgPSA3NDAgYnl0ZXMsIGZvbGxvd2VkIGJ5IDM4NCBieXRlcyBwYWQuCisgKiAoSW5kZXggaW50byBhIHF1ZXVlJ3MgQkMgQ0IpID0gKGlkeCBpbnRvIHF1ZXVlJ3MgVEZEIENCKSA9IChTU04gJiAweGZmKS4KKyAqIEJpdCBmaWVsZHM6CisgKiAyNS0wMDogIEJ5dGUgQ291bnQgQ0IgcGh5c2ljYWwgYWRkcmVzcyBbMzU6MTBdLCBtdXN0IGJlIDEwMjQtYnl0ZSBhbGlnbmVkLgorICovCisjZGVmaW5lIElMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgxMCkKKworLyoKKyAqIEVuYWJsZXMgYW55L2FsbCBUeCBETUEvRklGTyBjaGFubmVscy4KKyAqIFNjaGVkdWxlciBnZW5lcmF0ZXMgcmVxdWVzdHMgZm9yIG9ubHkgdGhlIGFjdGl2ZSBjaGFubmVscy4KKyAqIFNldCB0aGlzIHRvIDB4ZmYgdG8gZW5hYmxlIGFsbCA4IGNoYW5uZWxzIChub3JtYWwgdXNhZ2UpLgorICogQml0IGZpZWxkczoKKyAqICA3LSAwOiAgRW5hYmxlICgxKSwgZGlzYWJsZSAoMCksIG9uZSBiaXQgZm9yIGVhY2ggY2hhbm5lbCAwLTcKKyAqLworI2RlZmluZSBJTDQ5X1NDRF9UWEZBQ1QgICAgICAgICAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MWMpCisvKgorICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpZHhlcywgcmVhbGx5ISksIG9uZSBmb3IgZWFjaCBUeCBxdWV1ZS4KKyAqIEluaXRpYWxpemVkIGFuZCB1cGRhdGVkIGJ5IGRyaXZlciBhcyBuZXcgVEZEcyBhcmUgYWRkZWQgdG8gcXVldWUuCisgKiBOT1RFOiAgSWYgdXNpbmcgQmxvY2sgQWNrLCBpZHggbXVzdCBjb3JyZXNwb25kIHRvIGZyYW1lJ3MKKyAqICAgICAgICBTdGFydCBTZXF1ZW5jZSBOdW1iZXI7IGlkeCA9IChTU04gJiAweGZmKQorICogTk9URTogIEFsdGVybmF0aXZlIHRvIEhCVVNfVEFSR19XUlBUUiwgd2hpY2ggaXMgd2hhdCBMaW51eCBkcml2ZXIgdXNlcz8KKyAqLworI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9XUlBUUih4KSAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MjQgKyAoeCkgKiA0KQorCisvKgorICogUXVldWUgKHgpIFJlYWQgUG9pbnRlcnMgKGlkeGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgorICogRm9yIEZJRk8gbW9kZSwgaWR4IGluZGljYXRlcyBuZXh0IGZyYW1lIHRvIHRyYW5zbWl0LgorICogRm9yIFNjaGVkdWxlci1BQ0sgbW9kZSwgaWR4IGluZGljYXRlcyBmaXJzdCBmcmFtZSBpbiBUeCB3aW4uCisgKiBJbml0aWFsaXplZCBieSBkcml2ZXIsIHVwZGF0ZWQgYnkgc2NoZWR1bGVyLgorICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1JEUFRSKHgpICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHg2NCArICh4KSAqIDQpCisKKy8qCisgKiBTZWxlY3Qgd2hpY2ggcXVldWVzIHdvcmsgaW4gY2hhaW4gbW9kZSAoMSkgdnMuIG5vdCAoMCkuCisgKiBVc2UgY2hhaW4gbW9kZSB0byBidWlsZCBjaGFpbnMgb2YgYWdncmVnYXRlZCBmcmFtZXMuCisgKiBCaXQgZmllbGRzOgorICogMzEtMTY6ICBSZXNlcnZlZAorICogMTUtMDA6ICBNb2RlLCBvbmUgYml0IGZvciBlYWNoIHF1ZXVlIC0tIDE6IENoYWluIG1vZGUsIDA6IG9uZS1hdC1hLXRpbWUKKyAqIE5PVEU6ICBJZiBkcml2ZXIgc2V0cyB1cCBxdWV1ZSBmb3IgY2hhaW4gbW9kZSwgaXQgc2hvdWxkIGJlIGFsc28gc2V0IHVwCisgKiAgICAgICAgU2NoZWR1bGVyLUFDSyBtb2RlIGFzIHdlbGwsIHZpYSBTQ0RfUVVFVUVfU1RBVFVTX0JJVFMoeCkuCisgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwgIChJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweGQwKQorCisvKgorICogU2VsZWN0IHdoaWNoIHF1ZXVlcyBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gc2NoZWR1bGVyIGluY3JlbWVudHMKKyAqIGEgcXVldWUncyByZWFkIHBvaW50ZXIgKGlkeCkuCisgKiBCaXQgZmllbGRzOgorICogMzEtMTY6ICBSZXNlcnZlZAorICogMTUtMDA6ICBJbnRlcnJ1cHQgZW5hYmxlLCBvbmUgYml0IGZvciBlYWNoIHF1ZXVlIC0tIDE6IGVuYWJsZWQsIDA6IGRpc2FibGVkCisgKiBOT1RFOiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGFwcGFyZW50bHkgYSBuby1vcDsgZHJpdmVyIHJlbGllcyBvbiBpbnRlcnJ1cHRzCisgKiAgICAgICAgZnJvbSBSeCBxdWV1ZSB0byByZWFkIFR4IGNvbW1hbmQgcmVzcG9uc2VzIGFuZCB1cGRhdGUgVHggcXVldWVzLgorICovCisjZGVmaW5lIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHhlNCkKKworLyoKKyAqIFF1ZXVlIHNlYXJjaCBzdGF0dXMgcmVnaXN0ZXJzLiAgT25lIGZvciBlYWNoIHF1ZXVlLgorICogU2V0cyB1cCBxdWV1ZSBtb2RlIGFuZCBhc3NpZ25zIHF1ZXVlIHRvIFR4IERNQSBjaGFubmVsLgorICogQml0IGZpZWxkczoKKyAqIDE5LTEwOiBXcml0ZSBtYXNrL2VuYWJsZSBiaXRzIGZvciBiaXRzIDAtOQorICogICAgIDk6IERyaXZlciBzaG91bGQgaW5pdCB0byAiMCIKKyAqICAgICA4OiBTY2hlZHVsZXItQUNLIG1vZGUgKDEpLCBub24tU2NoZWR1bGVyLUFDSyAoaS5lLiBGSUZPKSBtb2RlICgwKS4KKyAqICAgICAgICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjEiIGZvciBhZ2dyZWdhdGlvbiBtb2RlLCBvciAiMCIgb3RoZXJ3aXNlLgorICogICA3LTY6IERyaXZlciBzaG91bGQgaW5pdCB0byAiMCIKKyAqICAgICA1OiBXaW5kb3cgU2l6ZSBMZWZ0OyBpbmRpY2F0ZXMgd2hldGhlciBzY2hlZHVsZXIgY2FuIHJlcXVlc3QKKyAqICAgICAgICBhbm90aGVyIFRGRCwgYmFzZWQgb24gd2luIHNpemUsIGV0Yy4gIERyaXZlciBzaG91bGQgaW5pdAorICogICAgICAgIHRoaXMgYml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIGZvciBub24tYWdnLgorICogICA0LTE6IFR4IEZJRk8gdG8gdXNlIChyYW5nZSAwLTcpLgorICogICAgIDA6IFF1ZXVlIGlzIGFjdGl2ZSAoMSksIG5vdCBhY3RpdmUgKDApLgorICogT3RoZXIgYml0cyBzaG91bGQgYmUgd3JpdHRlbiBhcyAiMCIKKyAqCisgKiBOT1RFOiAgSWYgZW5hYmxpbmcgU2NoZWR1bGVyLUFDSyBtb2RlLCBjaGFpbiBtb2RlIHNob3VsZCBhbHNvIGJlIGVuYWJsZWQKKyAqICAgICAgICB2aWEgU0NEX1FVRVVFQ0hBSU5fU0VMLgorICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpXAorCShJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDEwNCArICh4KSAqIDQpCisKKy8qIEJpdCBmaWVsZCBwb3NpdGlvbnMgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRQkoMCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRgkoMSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ0sJKDgpCisKKy8qIFdyaXRlIG1hc2tzICovCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19TQ0RfQUNUX0VOCSgxMCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLCQkoMHgwMDA3RkMwMCkKKworLyoqCisgKiA0OTY1IGludGVybmFsIFNSQU0gc3RydWN0dXJlcyBmb3Igc2NoZWR1bGVyLCBzaGFyZWQgd2l0aCBkcml2ZXIgLi4uCisgKgorICogRHJpdmVyIHNob3VsZCBjbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgZm9sbG93aW5nIGFyZWFzIGFmdGVyIHJlY2VpdmluZworICogIkFsaXZlIiByZXNwb25zZSBmcm9tIDQ5NjUgdUNvZGUsIGkuZS4gYWZ0ZXIgaW5pdGlhbAorICogdUNvZGUgbG9hZCwgb3IgYWZ0ZXIgYSB1Q29kZSBsb2FkIGRvbmUgZm9yIGVycm9yIHJlY292ZXJ5OgorICoKKyAqIFNDRF9DT05URVhUX0RBVEFfT0ZGU0VUIChzaXplIDEyOCBieXRlcykKKyAqIFNDRF9UWF9TVFRTX0JJVE1BUF9PRkZTRVQgKHNpemUgMjU2IGJ5dGVzKQorICogU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUIChzaXplIDMyIGJ5dGVzKQorICoKKyAqIERyaXZlciBhY2Nlc3NlcyBTUkFNIHZpYSBIQlVTX1RBUkdfTUVNXyogcmVnaXN0ZXJzLgorICogRHJpdmVyIHJlYWRzIGJhc2UgYWRkcmVzcyBvZiB0aGlzIHNjaGVkdWxlciBhcmVhIGZyb20gU0NEX1NSQU1fQkFTRV9BRERSLgorICogQWxsIE9GRlNFVCB2YWx1ZXMgbXVzdCBiZSBhZGRlZCB0byB0aGlzIGJhc2UgYWRkcmVzcy4KKyAqLworCisvKgorICogUXVldWUgY29udGV4dC4gIE9uZSA4LWJ5dGUgZW50cnkgZm9yIGVhY2ggb2YgMTYgcXVldWVzLgorICoKKyAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAweDgwKSB0byAwIGFmdGVyIHJlY2VpdmluZworICogIkFsaXZlIiBub3RpZmljYXRpb24gZnJvbSB1Q29kZS4gIEFkZGl0aW9uYWxseSwgZHJpdmVyIHNob3VsZCBpbml0CisgKiBlYWNoIHF1ZXVlJ3MgZW50cnkgYXMgZm9sbG93czoKKyAqCisgKiBMUyBEd29yZCBiaXQgZmllbGRzOgorICogIDAtMDY6ICBNYXggVHggd2luIHNpemUgZm9yIFNjaGVkdWxlci1BQ0suICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gNjQuCisgKgorICogTVMgRHdvcmQgYml0IGZpZWxkczoKKyAqIDE2LTIyOiAgRnJhbWUgbGltaXQuICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gMTAgKDB4YSkuCisgKgorICogRHJpdmVyIHNob3VsZCBpbml0IGFsbCBvdGhlciBiaXRzIHRvIDAuCisgKgorICogSW5pdCBtdXN0IGJlIGRvbmUgYWZ0ZXIgZHJpdmVyIHJlY2VpdmVzICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSA0OTY1IHVDb2RlLAorICogYW5kIHdoZW4gc2V0dGluZyB1cCBxdWV1ZSBmb3IgYWdncmVnYXRpb24uCisgKi8KKyNkZWZpbmUgSUw0OV9TQ0RfQ09OVEVYVF9EQVRBX09GRlNFVAkJCTB4MzgwCisjZGVmaW5lIElMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHgpIFwKKwkJCShJTDQ5X1NDRF9DT05URVhUX0RBVEFfT0ZGU0VUICsgKCh4KSAqIDgpKQorCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX1BPUwkJKDApCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX01TSwkJKDB4MDAwMDAwN0YpCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUwkoMTYpCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSwkoMHgwMDdGMDAwMCkKKworLyoKKyAqIFR4IFN0YXR1cyBCaXRtYXAKKyAqCisgKiBEcml2ZXIgc2hvdWxkIGNsZWFyIHRoaXMgZW50aXJlIGFyZWEgKHNpemUgMHgxMDApIHRvIDAgYWZ0ZXIgcmVjZWl2aW5nCisgKiAiQWxpdmUiIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlLiAgQXJlYSBpcyB1c2VkIG9ubHkgYnkgZGV2aWNlIGl0c2VsZjsKKyAqIG5vIG90aGVyIHN1cHBvcnQgKGJlc2lkZXMgY2xlYXJpbmcpIGlzIHJlcXVpcmVkIGZyb20gZHJpdmVyLgorICovCisjZGVmaW5lIElMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVAkJMHg0MDAKKworLyoKKyAqIFJBeFRJRCB0byBxdWV1ZSB0cmFuc2xhdGlvbiBtYXBwaW5nLgorICoKKyAqIFdoZW4gcXVldWUgaXMgaW4gU2NoZWR1bGVyLUFDSyBtb2RlLCBmcmFtZXMgcGxhY2VkIGluIGEgdGhhdCBxdWV1ZSBtdXN0IGJlCisgKiBmb3Igb25seSBvbmUgY29tYmluYXRpb24gb2YgcmVjZWl2ZXIgYWRkcmVzcyAoUkEpIGFuZCB0cmFmZmljIElEIChUSUQpLCBpLmUuCisgKiBvbmUgUU9TIHByaW9yaXR5IGxldmVsIGRlc3RpbmVkIGZvciBvbmUgc3RhdGlvbiAoZm9yIHRoaXMgd2lyZWxlc3MgbGluaywKKyAqIG5vdCBmaW5hbCBkZXN0aW5hdGlvbikuICBUaGUgU0NEX1RSQU5TTEFURV9UQkwgYXJlYSBwcm92aWRlcyAxNiAxNi1iaXQKKyAqIG1hcHBpbmdzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIDE2IHF1ZXVlcy4gIElmIHF1ZXVlIGlzIG5vdCBpbiBTY2hlZHVsZXItQUNLCisgKiBtb2RlLCB0aGUgZGV2aWNlIGlnbm9yZXMgdGhlIG1hcHBpbmcgdmFsdWUuCisgKgorICogQml0IGZpZWxkcywgZm9yIGVhY2ggMTYtYml0IG1hcDoKKyAqIDE1LTk6ICBSZXNlcnZlZCwgc2V0IHRvIDAKKyAqICA4LTQ6ICBJbmRleCBpbnRvIGRldmljZSdzIHN0YXRpb24gdGFibGUgZm9yIHJlY2lwaWVudCBzdGF0aW9uCisgKiAgMy0wOiAgVHJhZmZpYyBJRCAodGlkKSwgcmFuZ2UgMC0xNQorICoKKyAqIERyaXZlciBzaG91bGQgY2xlYXIgdGhpcyBlbnRpcmUgYXJlYSAoc2l6ZSAzMiBieXRlcykgdG8gMCBhZnRlciByZWNlaXZpbmcKKyAqICJBbGl2ZSIgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUuICBUbyB1cGRhdGUgYSAxNi1iaXQgbWFwIHZhbHVlLCBkcml2ZXIKKyAqIG11c3QgcmVhZCBhIGR3b3JkLWFsaWduZWQgdmFsdWUgZnJvbSBkZXZpY2UgU1JBTSwgcmVwbGFjZSB0aGUgMTYtYml0IG1hcAorICogdmFsdWUgb2YgaW50ZXJlc3QsIGFuZCB3cml0ZSB0aGUgZHdvcmQgdmFsdWUgYmFjayBpbnRvIGRldmljZSBTUkFNLgorICovCisjZGVmaW5lIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUCQkweDUwMAorCisvKiBGaW5kIHRyYW5zbGF0aW9uIHRhYmxlIGR3b3JkIHRvIHJlYWQvd3JpdGUgZm9yIGdpdmVuIHF1ZXVlICovCisjZGVmaW5lIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKKwkoKElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUICsgKCh4KSAqIDIpKSAmIDB4ZmZmZmZmZmMpCisKKyNkZWZpbmUgSUxfU0NEX1RYRklGT19QT1NfVElECQkJKDApCisjZGVmaW5lIElMX1NDRF9UWEZJRk9fUE9TX1JBCQkJKDQpCisjZGVmaW5lIElMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSwkoMHgwMUZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKiogRU5EIFRYIFNDSEVEVUxFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogX19pbF9wcnBoX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnCmluZGV4IDU3NzAzZDUuLmFlMDg0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcKQEAgLTEwMiwxMiArMTAyLDI4IEBACiAJICBvY2N1ci4KIGVuZG1lbnUKIAotY29uZmlnIElXTFdJRklfREVWSUNFX1NWVE9PTAotCWJvb2wgIml3bHdpZmkgZGV2aWNlIHN2dG9vbCBzdXBwb3J0IgorY29uZmlnIElXTFdJRklfREVWSUNFX1RFU1RNT0RFCisJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gSVdMV0lGSQotCXNlbGVjdCBOTDgwMjExX1RFU1RNT0RFCisJZGVwZW5kcyBvbiBOTDgwMjExX1RFU1RNT0RFCiAJaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgc3Z0b29sIHN1cHBvcnQgZm9yIGl3bHdpZmkgZGV2aWNlIHRocm91Z2gKLQkgIE5MODAyMTFfVEVTVE1PREUuIHN2dG9vbCBpcyBhIHNvZnR3YXJlIHZhbGlkYXRpb24gdG9vbCB0aGF0IHJ1bnMgaW4KLQkgIHRoZSB1c2VyIHNwYWNlIGFuZCBpbnRlcmFjdHMgd2l0aCB0aGUgZGV2aWNlIGluIHRoZSBrZXJuZWwgc3BhY2UKLQkgIHRocm91Z2ggdGhlIGdlbmVyaWMgbmV0bGluayBtZXNzYWdlIHZpYSBOTDgwMjExX1RFU1RNT0RFIGNoYW5uZWwuCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSB0ZXN0bW9kZSBzdXBwb3J0IGZvciBpd2x3aWZpIGRldmljZSB0aHJvdWdoCisJICBOTDgwMjExX1RFU1RNT0RFLiBUaGlzIHByb3ZpZGUgdGhlIGNhcGFiaWxpdGllcyBvZiBlbmFibGUgdXNlciBzcGFjZQorCSAgdmFsaWRhdGlvbiBhcHBsaWNhdGlvbnMgdG8gaW50ZXJhY3RzIHdpdGggdGhlIGRldmljZSB0aHJvdWdoIHRoZQorCSAgZ2VuZXJpYyBuZXRsaW5rIG1lc3NhZ2UgdmlhIE5MODAyMTFfVEVTVE1PREUgY2hhbm5lbC4KKworY29uZmlnIElXTFdJRklfUDJQCisgICAgICAgYm9vbCAiaXdsd2lmaSBleHBlcmltZW50YWwgUDJQIHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBJV0xXSUZJCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBleHBlcmltZW50YWwgUDJQIHN1cHBvcnQgZm9yIHNvbWUgZGV2aWNlcworICAgICAgICAgYmFzZWQgb24gbWljcm9jb2RlIHN1cHBvcnQuIFNpbmNlIFAyUCBzdXBwb3J0IGlzIHN0aWxsIHVuZGVyCisgICAgICAgICBkZXZlbG9wbWVudCwgdGhpcyBvcHRpb24gbWF5IGV2ZW4gZW5hYmxlIGl0IGZvciBzb21lIGRldmljZXMKKyAgICAgICAgIG5vdyB0aGF0IHR1cm4gb3V0IHRvIG5vdCBzdXBwb3J0IGl0IGluIHRoZSBmdXR1cmUgZHVlIHRvCisgICAgICAgICBtaWNyb2NvZGUgcmVzdHJpY3Rpb25zLgorCisgICAgICAgICBUbyBkZXRlcm1pbmUgaWYgeW91ciBtaWNyb2NvZGUgc3VwcG9ydHMgdGhlIGV4cGVyaW1lbnRhbCBQMlAKKyAgICAgICAgIG9mZmVyZWQgYnkgdGhpcyBvcHRpb24sIGNoZWNrIGlmIHRoZSBkcml2ZXIgYWR2ZXJ0aXNlcyBBUAorICAgICAgICAgc3VwcG9ydCB3aGVuIGl0IGlzIGxvYWRlZC4KKworICAgICAgICAgU2F5IFkgb25seSBpZiB5b3Ugd2FudCB0byBleHBlcmltZW50IHdpdGggUDJQLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUKaW5kZXggYzczZTVlZC4uOWRjODRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIyBXSUZJCiBvYmotJChDT05GSUdfSVdMV0lGSSkJKz0gaXdsd2lmaS5vCi1pd2x3aWZpLW9ianMJCTo9IGl3bC1hZ24ubyBpd2wtYWduLXJzLm8KLWl3bHdpZmktb2JqcwkJKz0gaXdsLWFnbi11Y29kZS5vIGl3bC1hZ24tdHgubworaXdsd2lmaS1vYmpzCQk6PSBpd2wtYWduLm8gaXdsLWFnbi1ycy5vIGl3bC1tYWM4MDIxMS5vCitpd2x3aWZpLW9ianMJCSs9IGl3bC11Y29kZS5vIGl3bC1hZ24tdHgubwogaXdsd2lmaS1vYmpzCQkrPSBpd2wtYWduLWxpYi5vIGl3bC1hZ24tY2FsaWIubyBpd2wtaW8ubwogaXdsd2lmaS1vYmpzCQkrPSBpd2wtYWduLXR0Lm8gaXdsLWFnbi1zdGEubyBpd2wtYWduLXJ4Lm8KIApAQCAtMTgsNyArMTgsNyBAQAogCiBpd2x3aWZpLSQoQ09ORklHX0lXTFdJRklfREVCVUdGUykgKz0gaXdsLWRlYnVnZnMubwogaXdsd2lmaS0kKENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HKSArPSBpd2wtZGV2dHJhY2UubwotaXdsd2lmaS0kKENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wpICs9IGl3bC1zdi1vcGVuLm8KK2l3bHdpZmktJChDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUpICs9IGl3bC10ZXN0bW9kZS5vCiAKIENGTEFHU19pd2wtZGV2dHJhY2UubyA6PSAtSSQoc3JjKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKaW5kZXggZTEyYjQ4Yy4uMWVmN2JmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwpAQCAtMTI0LDEwICsxMjQsMTAgQEAKIHsKIAlpZiAoaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcyA+PSBJV0xfTUlOX05VTV9RVUVVRVMgJiYKIAkgICAgaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcyA8PSBJV0xBR05fTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CisJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQogCQkJaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlczsKIAotCWh3X3BhcmFtcyhwcml2KS5tYXhfdHhxX251bSA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisJaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKIAlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQgPSBJV0xBR05fQlJPQURDQVNUX0lEOwogCiAJaHdfcGFyYW1zKHByaXYpLm1heF9kYXRhX3NpemUgPSBJV0xBR05fUlRDX0RBVEFfU0laRTsKQEAgLTEzNSwyOCArMTM1LDE5IEBACiAKIAlod19wYXJhbXMocHJpdikuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKTsKIAotCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JaWYgKHByaXYtPmNmZy0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKKwlod19wYXJhbXMocHJpdikudHhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF90eF9hbnQpOworCWlmIChjZmcocHJpdiktPnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkpCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0gMTsKIAllbHNlCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0KLQkJCW51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7CisJCQludW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKKwlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF90eF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfcnhfYW50OwogCiAJaXdsMTAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDEwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJCUJJVChJV0xfQ0FMSUJfWFRBTCkJCXwKLQkJCUJJVChJV0xfQ0FMSUJfTE8pCQl8Ci0JCQlCSVQoSVdMX0NBTElCX1RYX0lRKSAJCXwKLQkJCUJJVChJV0xfQ0FMSUJfVFhfSVFfUEVSRCkJfAotCQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwotCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0RDKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkxLDYgKzE4Miw3IEBACiAJLmNoYWluX25vaXNlX3NjYWxlID0gMTAwMCwKIAkud2RfdGltZW91dCA9IElXTF9ERUZfV0RfVElNRU9VVCwKIAkubWF4X2V2ZW50X2xvZ19zaXplID0gMTI4LAorCS53ZF9kaXNhYmxlID0gdHJ1ZSwKIH07CiBzdGF0aWMgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsMTAwMF9odF9wYXJhbXMgPSB7CiAJLmh0X2dyZWVuZmllbGRfc3VwcG9ydCA9IHRydWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggNzk0MzE5Ny4uMDk0NjkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtODYsNyArODYsNyBAQAogewogCWl3bF9yZl9jb25maWcocHJpdik7CiAKLQlpZiAocHJpdi0+Y2ZnLT5pcV9pbnZlcnQpCisJaWYgKGNmZyhwcml2KS0+aXFfaW52ZXJ0KQogCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9HUF9EUklWRVJfUkVHLAogCQkJICAgIENTUl9HUF9EUklWRVJfUkVHX0JJVF9SQURJT19JUV9JTlZFUik7CiB9CkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogewogCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgogCSAgICBpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzIDw9IElXTEFHTl9OVU1fUVVFVUVTKQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCi0JaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlod19wYXJhbXMocHJpdikubWF4X2RhdGFfc2l6ZSA9IElXTDYwX1JUQ19EQVRBX1NJWkU7CkBAIC0xMzEsMjkgKzEzMSwxOSBAQAogCiAJaHdfcGFyYW1zKHByaXYpLmh0NDBfY2hhbm5lbCA9ICBCSVQoSUVFRTgwMjExX0JBTkRfMkdIWik7CiAKLQlod19wYXJhbXMocHJpdikudHhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQpOwotCWlmIChwcml2LT5jZmctPnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkpCisJaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfdHhfYW50KTsKKwlpZiAoY2ZnKHByaXYpLT5yeF93aXRoX3Npc29fZGl2ZXJzaXR5KQogCQlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9IDE7CiAJZWxzZQogCQlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9Ci0JCQludW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KTsKLQlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQ7Ci0JaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfcnhfYW50OworCQkJbnVtX29mX2FudChjZmcocHJpdiktPnZhbGlkX3J4X2FudCk7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfdHhfYW50OworCWh3X3BhcmFtcyhwcml2KS52YWxpZF9yeF9hbnQgPSBjZmcocHJpdiktPnZhbGlkX3J4X2FudDsKIAogCWl3bDIwMDBfc2V0X2N0X3RocmVzaG9sZChwcml2KTsKIAogCS8qIFNldCBpbml0aWFsIHNlbnNpdGl2aXR5IHBhcmFtZXRlcnMgKi8KLQkvKiBTZXQgaW5pdGlhbCBjYWxpYnJhdGlvbiBzZXQgKi8KIAlod19wYXJhbXMocHJpdikuc2VucyA9ICZpd2wyMDAwX3NlbnNpdGl2aXR5OwotCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyA9Ci0JCUJJVChJV0xfQ0FMSUJfWFRBTCkgICAgICAgICAgICAgfAotCQlCSVQoSVdMX0NBTElCX0xPKSAgICAgICAgICAgICAgIHwKLQkJQklUKElXTF9DQUxJQl9UWF9JUSkgICAgICAgICAgICB8Ci0JCUJJVChJV0xfQ0FMSUJfQkFTRV9CQU5EKTsKLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX2RjX2NhbGliKQotCQlod19wYXJhbXMocHJpdikuY2FsaWJfcnRfY2ZnIHw9IElXTF9DQUxJQl9DRkdfRENfSURYOwotCWlmIChwcml2LT5jZmctPm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX1RFTVBfT0ZGU0VUKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjU4LDI1ICsyNDgsMTkgQEAKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkubGliID0gJml3bDIwMDBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2wyMDAwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIgPSB0cnVlLAkJCQlcCiAJLnRlbXBfb2Zmc2V0X3YyID0gdHJ1ZSwJCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCiAJLmlxX2ludmVydCA9IHRydWUJCQkJCVwKIAogc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2NmZyA9IHsKLQkubmFtZSA9ICIyMDAwIFNlcmllcyAyeDIgQkdOIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDIyMDAgQkdOIiwKIAlJV0xfREVWSUNFXzIwMDAsCiAJLmh0X3BhcmFtcyA9ICZpd2wyMDAwX2h0X3BhcmFtcywKIH07CiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDIwMDBfMmJnX2NmZyA9IHsKLQkubmFtZSA9ICIyMDAwIFNlcmllcyAyeDIgQkciLAotCUlXTF9ERVZJQ0VfMjAwMCwKLX07Ci0KIHN0cnVjdCBpd2xfY2ZnIGl3bDIwMDBfMmJnbl9kX2NmZyA9IHsKLQkubmFtZSA9ICIyMDAwRCBTZXJpZXMgMngyIEJHTiIsCisJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiAyMjAwRCBCR04iLAogCUlXTF9ERVZJQ0VfMjAwMCwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKQEAgLTI5MSw3ICsyNzUsNiBAQAogCS5saWIgPSAmaXdsMjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMzBfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsMjAzMF9idF9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkudGVtcF9vZmZzZXRfdjIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKQEAgLTI5OSwxNiArMjgyLDExIEBACiAJLmlxX2ludmVydCA9IHRydWUJCQkJCVwKIAogc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmduX2NmZyA9IHsKLQkubmFtZSA9ICIyMDAwIFNlcmllcyAyeDIgQkdOL0JUIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDIyMzAgQkdOIiwKIAlJV0xfREVWSUNFXzIwMzAsCiAJLmh0X3BhcmFtcyA9ICZpd2wyMDAwX2h0X3BhcmFtcywKIH07CiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDIwMzBfMmJnX2NmZyA9IHsKLQkubmFtZSA9ICIyMDAwIFNlcmllcyAyeDIgQkcvQlQiLAotCUlXTF9ERVZJQ0VfMjAzMCwKLX07Ci0KICNkZWZpbmUgSVdMX0RFVklDRV8xMDUJCQkJCQlcCiAJLmZ3X25hbWVfcHJlID0gSVdMMTA1X0ZXX1BSRSwJCQkJXAogCS51Y29kZV9hcGlfbWF4ID0gSVdMMTA1X1VDT0RFX0FQSV9NQVgsCQkJXApAQCAtMzE4LDcgKzI5Niw2IEBACiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fMjAwMF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmxpYiA9ICZpd2wyMDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAwMF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS50ZW1wX29mZnNldF92MiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXApAQCAtMzI2LDE5ICszMDMsMTQgQEAKIAkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUsCQkJCVwKIAkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCi1zdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmdfY2ZnID0gewotCS5uYW1lID0gIjEwNSBTZXJpZXMgMXgxIEJHIiwKLQlJV0xfREVWSUNFXzEwNSwKLX07Ci0KIHN0cnVjdCBpd2xfY2ZnIGl3bDEwNV9iZ25fY2ZnID0gewotCS5uYW1lID0gIjEwNSBTZXJpZXMgMXgxIEJHTiIsCisJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiAxMDUgQkdOIiwKIAlJV0xfREVWSUNFXzEwNSwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsMTA1X2Jnbl9kX2NmZyA9IHsKLQkubmFtZSA9ICIxMDVEIFNlcmllcyAxeDEgQkdOIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDEwNUQgQkdOIiwKIAlJV0xfREVWSUNFXzEwNSwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKQEAgLTM1Myw3ICszMjUsNiBAQAogCS5saWIgPSAmaXdsMjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMzBfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsMjAzMF9idF9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkudGVtcF9vZmZzZXRfdjIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKQEAgLTM2MSwxMyArMzMyLDggQEAKIAkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUsCQkJCVwKIAkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCi1zdHJ1Y3QgaXdsX2NmZyBpd2wxMzVfYmdfY2ZnID0gewotCS5uYW1lID0gIjEzNSBTZXJpZXMgMXgxIEJHL0JUIiwKLQlJV0xfREVWSUNFXzEzNSwKLX07Ci0KIHN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ25fY2ZnID0gewotCS5uYW1lID0gIjEzNSBTZXJpZXMgMXgxIEJHTi9CVCIsCisJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiAxMzUgQkdOIiwKIAlJV0xfREVWSUNFXzEzNSwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCBjNTExYzk4Li5iM2EzNjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC0xMzQsMTAgKzEzNCwxMCBAQAogCiAjZGVmaW5lIElXTF81MTUwX1ZPTFRBR0VfVE9fVEVNUEVSQVRVUkVfQ09FRkYJKC01KQogCi1zdGF0aWMgczMyIGl3bF90ZW1wX2NhbGliX3RvX29mZnNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitzdGF0aWMgczMyIGl3bF90ZW1wX2NhbGliX3RvX29mZnNldChzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCkKIHsKIAl1MTYgdGVtcGVyYXR1cmUsIHZvbHRhZ2U7Ci0JX19sZTE2ICp0ZW1wX2NhbGliID0gKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LAorCV9fbGUxNiAqdGVtcF9jYWxpYiA9IChfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwKIAkJCQlFRVBST01fS0VMVklOX1RFTVBFUkFUVVJFKTsKIAogCXRlbXBlcmF0dXJlID0gbGUxNl90b19jcHUodGVtcF9jYWxpYlswXSk7CkBAIC0xNTEsNyArMTUxLDcgQEAKIHsKIAljb25zdCBzMzIgdm9sdDJ0ZW1wX2NvZWYgPSBJV0xfNTE1MF9WT0xUQUdFX1RPX1RFTVBFUkFUVVJFX0NPRUZGOwogCXMzMiB0aHJlc2hvbGQgPSAoczMyKUNFTFNJVVNfVE9fS0VMVklOKENUX0tJTExfVEhSRVNIT0xEX0xFR0FDWSkgLQotCQkJaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHByaXYpOworCQkJaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHByaXYtPnNocmQpOwogCiAJaHdfcGFyYW1zKHByaXYpLmN0X2tpbGxfdGhyZXNob2xkID0gdGhyZXNob2xkICogdm9sdDJ0ZW1wX2NvZWY7CiB9CkBAIC0xNjYsMTAgKzE2NiwxMCBAQAogewogCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgogCSAgICBpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzIDw9IElXTEFHTl9OVU1fUVVFVUVTKQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCi0JaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlod19wYXJhbXMocHJpdikubWF4X2RhdGFfc2l6ZSA9IElXTEFHTl9SVENfREFUQV9TSVpFOwpAQCAtMTc4LDIyICsxNzgsMTUgQEAKIAlod19wYXJhbXMocHJpdikuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKSB8CiAJCQkJCUJJVChJRUVFODAyMTFfQkFORF81R0haKTsKIAotCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KTsKLQlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQ7Ci0JaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfcnhfYW50OworCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CisJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKKwlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF90eF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfcnhfYW50OwogCiAJaXdsNTAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDUwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQlCSVQoSVdMX0NBTElCX0xPKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRX1BFUkQpCXwKLQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDIsMTAgKzE5NSwxMCBAQAogewogCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgogCSAgICBpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzIDw9IElXTEFHTl9OVU1fUVVFVUVTKQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCi0JaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlod19wYXJhbXMocHJpdikubWF4X2RhdGFfc2l6ZSA9IElXTEFHTl9SVENfREFUQV9TSVpFOwpAQCAtMjE0LDIyICsyMDcsMTUgQEAKIAlod19wYXJhbXMocHJpdikuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKSB8CiAJCQkJCUJJVChJRUVFODAyMTFfQkFORF81R0haKTsKIAotCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KTsKLQlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQ7Ci0JaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfcnhfYW50OworCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CisJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKKwlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF90eF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfcnhfYW50OwogCiAJaXdsNTE1MF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDUxNTBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9MTykJCXwKLQkJQklUKElXTF9DQUxJQl9UWF9JUSkJCXwKLQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwotCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX0RDKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM3LDcgKzIyMyw3IEBACiBzdGF0aWMgdm9pZCBpd2w1MTUwX3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAl1MzIgdnQgPSAwOwotCXMzMiBvZmZzZXQgPSAgaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHByaXYpOworCXMzMiBvZmZzZXQgPSAgaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHByaXYtPnNocmQpOwogCiAJdnQgPSBsZTMyX3RvX2NwdShwcml2LT5zdGF0aXN0aWNzLmNvbW1vbi50ZW1wZXJhdHVyZSk7CiAJdnQgPSB2dCAvIElXTF81MTUwX1ZPTFRBR0VfVE9fVEVNUEVSQVRVUkVfQ09FRkYgKyBvZmZzZXQ7CkBAIC0zNjQsNiArMzUwLDcgQEAKIAkud2RfdGltZW91dCA9IElXTF9MT05HX1dEX1RJTUVPVVQsCiAJLm1heF9ldmVudF9sb2dfc2l6ZSA9IDUxMiwKIAkubm9faWRsZV9zdXBwb3J0ID0gdHJ1ZSwKKwkud2RfZGlzYWJsZSA9IHRydWUsCiB9Owogc3RhdGljIHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDUwMDBfaHRfcGFyYW1zID0gewogCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLApAQCAtNDMzLDcgKzQyMCw3IEBACiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNTA1MF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmxpYiA9ICZpd2w1MTUwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNTAwMF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAorCS5ub194dGFsX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAkJCQlcCiAJLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYwppbmRleCBjODQwYzc4Li41NGI3NTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCkBAIC00NiwxMSArNDYsMTIgQEAKICNpbmNsdWRlICJpd2wtY2ZnLmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDYwMDBfVUNPREVfQVBJX01BWCA0CisjZGVmaW5lIElXTDYwMDBfVUNPREVfQVBJX01BWCA2CiAjZGVmaW5lIElXTDYwNTBfVUNPREVfQVBJX01BWCA1CiAjZGVmaW5lIElXTDYwMDBHMl9VQ09ERV9BUElfTUFYIDYKIAogLyogT2xkZXN0IHZlcnNpb24gd2Ugd29uJ3Qgd2FybiBhYm91dCAqLworI2RlZmluZSBJV0w2MDAwX1VDT0RFX0FQSV9PSyA0CiAjZGVmaW5lIElXTDYwMDBHMl9VQ09ERV9BUElfT0sgNQogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCkBAIC04MCw3ICs4MSw3IEBACiBzdGF0aWMgdm9pZCBpd2w2MDUwX2FkZGl0aW9uYWxfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJLyogSW5kaWNhdGUgY2FsaWJyYXRpb24gdmVyc2lvbiB0byB1Q29kZS4gKi8KLQlpZiAoaXdsYWduX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHByaXYpID49IDYpCisJaWYgKGl3bF9lZXByb21fY2FsaWJfdmVyc2lvbihwcml2LT5zaHJkKSA+PSA2KQogCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9HUF9EUklWRVJfUkVHLAogCQkJCUNTUl9HUF9EUklWRVJfUkVHX0JJVF9DQUxJQl9WRVJTSU9ONik7CiB9CkBAIC04OCw3ICs4OSw3IEBACiBzdGF0aWMgdm9pZCBpd2w2MTUwX2FkZGl0aW9uYWxfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJLyogSW5kaWNhdGUgY2FsaWJyYXRpb24gdmVyc2lvbiB0byB1Q29kZS4gKi8KLQlpZiAoaXdsYWduX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHByaXYpID49IDYpCisJaWYgKGl3bF9lZXByb21fY2FsaWJfdmVyc2lvbihwcml2LT5zaHJkKSA+PSA2KQogCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9HUF9EUklWRVJfUkVHLAogCQkJCUNTUl9HUF9EUklWRVJfUkVHX0JJVF9DQUxJQl9WRVJTSU9ONik7CiAJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfR1BfRFJJVkVSX1JFRywKQEAgLTEwMSwxNCArMTAyLDE0IEBACiAJaXdsX3JmX2NvbmZpZyhwcml2KTsKIAogCS8qIG5vIGxvY2tpbmcgcmVxdWlyZWQgZm9yIHJlZ2lzdGVyIHdyaXRlICovCi0JaWYgKHByaXYtPmNmZy0+cGFfdHlwZSA9PSBJV0xfUEFfSU5URVJOQUwpIHsKKwlpZiAoY2ZnKHByaXYpLT5wYV90eXBlID09IElXTF9QQV9JTlRFUk5BTCkgewogCQkvKiAyeDIgSVBBIHBoeSB0eXBlICovCiAJCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX0dQX0RSSVZFUl9SRUcsCiAJCQkgICAgIENTUl9HUF9EUklWRVJfUkVHX0JJVF9SQURJT19TS1VfMngyX0lQQSk7CiAJfQogCS8qIGRvIGFkZGl0aW9uYWwgbmljIGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHByaXYtPmNmZy0+YWRkaXRpb25hbF9uaWNfY29uZmlnKQotCQkJcHJpdi0+Y2ZnLT5hZGRpdGlvbmFsX25pY19jb25maWcocHJpdik7CisJaWYgKGNmZyhwcml2KS0+YWRkaXRpb25hbF9uaWNfY29uZmlnKQorCQkJY2ZnKHByaXYpLT5hZGRpdGlvbmFsX25pY19jb25maWcocHJpdik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyBpd2w2MDAwX3NlbnNpdGl2aXR5ID0gewpAQCAtMTQwLDEwICsxNDEsMTAgQEAKIHsKIAlpZiAoaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcyA+PSBJV0xfTUlOX05VTV9RVUVVRVMgJiYKIAkgICAgaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcyA8PSBJV0xBR05fTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CisJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQogCQkJaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlczsKIAotCWh3X3BhcmFtcyhwcml2KS5tYXhfdHhxX251bSA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisJaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKIAlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQgPSBJV0xBR05fQlJPQURDQVNUX0lEOwogCiAJaHdfcGFyYW1zKHByaXYpLm1heF9kYXRhX3NpemUgPSBJV0w2MF9SVENfREFUQV9TSVpFOwpAQCAtMTUyLDI5ICsxNTMsMTkgQEAKIAlod19wYXJhbXMocHJpdikuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKSB8CiAJCQkJCUJJVChJRUVFODAyMTFfQkFORF81R0haKTsKIAotCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JaWYgKHByaXYtPmNmZy0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKKwlod19wYXJhbXMocHJpdikudHhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF90eF9hbnQpOworCWlmIChjZmcocHJpdiktPnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkpCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0gMTsKIAllbHNlCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0KLQkJCW51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7CisJCQludW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKKwlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF90eF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfcnhfYW50OwogCiAJaXdsNjAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDYwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQlCSVQoSVdMX0NBTElCX0xPKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAotCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX3J0X2NmZyB8PSBJV0xfQ0FMSUJfQ0ZHX0RDX0lEWDsKLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliKQotCQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgfD0gQklUKElXTF9DQUxJQl9URU1QX09GRlNFVCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2NCw3ICszNTUsNiBAQAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDVfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5saWIgPSAmaXdsNjAwMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDYwMDBfZzJfYmFzZV9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFCiAKQEAgLTQwNiw3ICszOTYsNiBAQAogCS5saWIgPSAmaXdsNjAzMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDYwMDBfZzJfYmFzZV9wYXJhbXMsCQkJXAogCS5idF9wYXJhbXMgPSAmaXdsNjAwMF9idF9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCiAJLmFkdl9wbSA9IHRydWUJCQkJCQlcCkBAIC00MzQsMjEgKzQyMywxMSBAQAogfTsKIAogc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWduX2NmZyA9IHsKLQkubmFtZSA9ICI2MDM1IFNlcmllcyAyeDIgQUdOL0JUIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBBZHZhbmNlZC1OIDYyMzUgQUdOIiwKIAlJV0xfREVWSUNFXzYwMzAsCiAJLmh0X3BhcmFtcyA9ICZpd2w2MDAwX2h0X3BhcmFtcywKIH07CiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDYwMzVfMmFiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiNjAzNSBTZXJpZXMgMngyIEFCRy9CVCIsCi0JSVdMX0RFVklDRV82MDMwLAotfTsKLQotc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYmdfY2ZnID0gewotCS5uYW1lID0gIjYwMzUgU2VyaWVzIDJ4MiBCRy9CVCIsCi0JSVdMX0RFVklDRV82MDMwLAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMTAzMF9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTAzMCBCR04iLAogCUlXTF9ERVZJQ0VfNjAzMCwKQEAgLTQ3OSw2ICs0NTgsNyBAQAogI2RlZmluZSBJV0xfREVWSUNFXzYwMDBpCQkJCQlcCiAJLmZ3X25hbWVfcHJlID0gSVdMNjAwMF9GV19QUkUsCQkJCVwKIAkudWNvZGVfYXBpX21heCA9IElXTDYwMDBfVUNPREVfQVBJX01BWCwJCQlcCisJLnVjb2RlX2FwaV9vayA9IElXTDYwMDBfVUNPREVfQVBJX09LLAkJCVwKIAkudWNvZGVfYXBpX21pbiA9IElXTDYwMDBfVUNPREVfQVBJX01JTiwJCQlcCiAJLnZhbGlkX3R4X2FudCA9IEFOVF9CQywJCS8qIC5jZmcgb3ZlcndyaXRlICovCVwKIAkudmFsaWRfcnhfYW50ID0gQU5UX0JDLAkJLyogLmNmZyBvdmVyd3JpdGUgKi8JXApAQCAtNTE2LDcgKzQ5Niw2IEBACiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjA1MF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKIAkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKIApAQCAtNTQwLDcgKzUxOSw2IEBACiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjE1MF9FRVBST01fVkVSU0lPTiwJCVwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MTUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKIAkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKIApAQCAtNTU5LDE3ICs1MzcsMTcgQEAKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBVbHRpbWF0ZS1OIDYzMDAgQUdOIiwKIAkuZndfbmFtZV9wcmUgPSBJV0w2MDAwX0ZXX1BSRSwKIAkudWNvZGVfYXBpX21heCA9IElXTDYwMDBfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX29rID0gSVdMNjAwMF9VQ09ERV9BUElfT0ssCiAJLnVjb2RlX2FwaV9taW4gPSBJV0w2MDAwX1VDT0RFX0FQSV9NSU4sCiAJLmVlcHJvbV92ZXIgPSBFRVBST01fNjAwMF9FRVBST01fVkVSU0lPTiwKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV82MDAwX1RYX1BPV0VSX1ZFUlNJT04sCiAJLmxpYiA9ICZpd2w2MDAwX2xpYiwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjAwMF9iYXNlX3BhcmFtcywKIAkuaHRfcGFyYW1zID0gJml3bDYwMDBfaHRfcGFyYW1zLAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAogfTsKIAotTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfVUNPREVfQVBJX01BWCkpOworTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBfVUNPREVfQVBJX09LKSk7CiBNT0RVTEVfRklSTVdBUkUoSVdMNjA1MF9NT0RVTEVfRklSTVdBUkUoSVdMNjA1MF9VQ09ERV9BUElfTUFYKSk7CiBNT0RVTEVfRklSTVdBUkUoSVdMNjAwNV9NT0RVTEVfRklSTVdBUkUoSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w2MDMwX01PRFVMRV9GSVJNV0FSRShJV0w2MDAwRzJfVUNPREVfQVBJX01BWCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYwppbmRleCAwM2JhYzQ4Li41MGZmODQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYwpAQCAtODIsNTYgKzgyLDY0IEBACiAJdTMyIGJlYWNvbl9lbmVyZ3lfYzsKIH07CiAKLWludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK2ludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewotCWludCByZXQgPSAwOwotCWludCBpID0gMDsKLQogCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCwKIAkJLmZsYWdzID0gQ01EX1NZTkMsCiAJfTsKKwlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzOwogCi0JZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgewotCQlpZiAoKEJJVChpKSAmIGh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZykgJiYKLQkJICAgIHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKSB7Ci0JCQloY21kLmxlblswXSA9IHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbjsKLQkJCWhjbWQuZGF0YVswXSA9IHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmOwotCQkJaGNtZC5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZOwotCQkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kKHRyYW5zKHByaXYpLCAmaGNtZCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJSVdMX0VSUihwcml2LCAiRXJyb3IgJWQgaXRlcmF0aW9uICVkXG4iLAotCQkJCQlyZXQsIGkpOwotCQkJCWJyZWFrOwotCQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmdHJhbnMtPmNhbGliX3Jlc3VsdHMsIGxpc3QpIHsKKwkJaW50IHJldDsKKworCQloY21kLmxlblswXSA9IHJlcy0+Y21kX2xlbjsKKwkJaGNtZC5kYXRhWzBdID0gJnJlcy0+aGRyOworCQloY21kLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFk7CisJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucywgJmhjbWQpOworCQlpZiAocmV0KSB7CisJCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3IgJWQgb24gY2FsaWIgY21kICVkXG4iLAorCQkJCXJldCwgcmVzLT5oZHIub3BfY29kZSk7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGl3bF9jYWxpYl9zZXQoc3RydWN0IGl3bF9jYWxpYl9yZXN1bHQgKnJlcywgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKLXsKLQlpZiAocmVzLT5idWZfbGVuICE9IGxlbikgewotCQlrZnJlZShyZXMtPmJ1Zik7Ci0JCXJlcy0+YnVmID0ga3phbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwotCX0KLQlpZiAodW5saWtlbHkocmVzLT5idWYgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVzLT5idWZfbGVuID0gbGVuOwotCW1lbWNweShyZXMtPmJ1ZiwgYnVmLCBsZW4pOwogCXJldHVybiAwOwogfQogCi12b2lkIGl3bF9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQoraW50IGl3bF9jYWxpYl9zZXQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCSAgY29uc3Qgc3RydWN0IGl3bF9jYWxpYl9oZHIgKmNtZCwgaW50IGxlbikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCAqdG1wOwogCi0JZm9yIChpID0gMDsgaSA8IElXTF9DQUxJQl9NQVg7IGkrKykgewotCQlrZnJlZShwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zik7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuID0gMDsKKwlyZXMgPSBrbWFsbG9jKHNpemVvZigqcmVzKSArIGxlbiAtIHNpemVvZihzdHJ1Y3QgaXdsX2NhbGliX2hkciksCisJCSAgICAgIEdGUF9BVE9NSUMpOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoJnJlcy0+aGRyLCBjbWQsIGxlbik7CisJcmVzLT5jbWRfbGVuID0gbGVuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZ0cmFucy0+Y2FsaWJfcmVzdWx0cywgbGlzdCkgeworCQlpZiAodG1wLT5oZHIub3BfY29kZSA9PSByZXMtPmhkci5vcF9jb2RlKSB7CisJCQlsaXN0X3JlcGxhY2UoJnRtcC0+bGlzdCwgJnJlcy0+bGlzdCk7CisJCQlrZnJlZSh0bXApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiB3YXNuJ3QgaW4gbGlzdCBhbHJlYWR5ICovCisJbGlzdF9hZGRfdGFpbCgmcmVzLT5saXN0LCAmdHJhbnMtPmNhbGliX3Jlc3VsdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdG1wLCAmdHJhbnMtPmNhbGliX3Jlc3VsdHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnJlcy0+bGlzdCk7CisJCWtmcmVlKHJlcyk7CiAJfQogfQogCkBAIC01MDUsNyArNTEzLDcgQEAKIAogCWl3bF9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90YmwocHJpdiwgZGF0YSwgJmNtZC5lbmhhbmNlX3RhYmxlWzBdKTsKIAotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5oZF92MikgeworCWlmIChjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5oZF92MikgewogCQljbWQuZW5oYW5jZV90YWJsZVtIRF9JTkFfTk9OX1NRVUFSRV9ERVRfT0ZETV9JTkRFWF0gPQogCQkJSERfSU5BX05PTl9TUVVBUkVfREVUX09GRE1fREFUQV9WMjsKIAkJY21kLmVuaGFuY2VfdGFibGVbSERfSU5BX05PTl9TUVVBUkVfREVUX0NDS19JTkRFWF0gPQpAQCAtODM5LDcgKzg0Nyw3IEBACiAJCQkgKiBjb25uZWN0IHRoZSBmaXJzdCB2YWxpZCB0eCBjaGFpbgogCQkJICovCiAJCQlmaXJzdF9jaGFpbiA9Ci0JCQkJZmluZF9maXJzdF9jaGFpbihwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7CisJCQkJZmluZF9maXJzdF9jaGFpbihjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CiAJCQlkYXRhLT5kaXNjb25uX2FycmF5W2ZpcnN0X2NoYWluXSA9IDA7CiAJCQlhY3RpdmVfY2hhaW5zIHw9IEJJVChmaXJzdF9jaGFpbik7CiAJCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKQEAgLTg4Miw3ICs4OTAsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlkZWx0YV9nID0gKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX3NjYWxlICoKKwkJZGVsdGFfZyA9IChjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9zY2FsZSAqCiAJCQkoKHMzMilhdmVyYWdlX25vaXNlW2RlZmF1bHRfY2hhaW5dIC0KIAkJCShzMzIpYXZlcmFnZV9ub2lzZVtpXSkpIC8gMTUwMDsKIApAQCAtMTAzOSw4ICsxMDQ3LDggQEAKIAkJcmV0dXJuOwogCiAJLyogQW5hbHl6ZSBzaWduYWwgZm9yIGRpc2Nvbm5lY3RlZCBhbnRlbm5hICovCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7CisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zICYmCisJICAgIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7CiAJCS8qIERpc2FibGUgZGlzY29ubmVjdGVkIGFudGVubmEgYWxnb3JpdGhtIGZvciBhZHZhbmNlZAogCQkgICBidCBjb2V4LCBhc3N1bWluZyB2YWxpZCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkICovCiAJCWRhdGEtPmFjdGl2ZV9jaGFpbnMgPSBod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50OwpAQCAtMTA3NCw3ICsxMDgyLDcgQEAKIAogCWl3bGFnbl9nYWluX2NvbXB1dGF0aW9uKHByaXYsIGF2ZXJhZ2Vfbm9pc2UsCiAJCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCBtaW5fYXZlcmFnZV9ub2lzZSwKLQkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSk7CisJCQkJZmluZF9maXJzdF9jaGFpbihjZmcocHJpdiktPnZhbGlkX3J4X2FudCkpOwogCiAJLyogU29tZSBwb3dlciBjaGFuZ2VzIG1heSBoYXZlIGJlZW4gbWFkZSBkdXJpbmcgdGhlIGNhbGlicmF0aW9uLgogCSAqIFVwZGF0ZSBhbmQgY29tbWl0IHRoZSBSWE9OCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oCmluZGV4IGE4NjlmYzkuLjEwMjc1Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oCkBAIC03Miw4ICs3Miw0IEBACiB2b2lkIGl3bF9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9yZXNldF9ydW5fdGltZV9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogCi1pbnQgaXdsX3NlbmRfY2FsaWJfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9jYWxpYl9zZXQoc3RydWN0IGl3bF9jYWxpYl9yZXN1bHQgKnJlcywgY29uc3QgdTggKmJ1ZiwgaW50IGxlbik7Ci12b2lkIGl3bF9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQogI2VuZGlmIC8qIF9faXdsX2NhbGliX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jCmluZGV4IDFhNTJlZDIuLjY0Y2Y0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1saWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAorI2luY2x1ZGUgIml3bC13aWZpLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWlvLmgiCkBAIC05MiwxMSArOTMsMTEgQEAKIAlpd2xfdHRfaGFuZGxlcihwcml2KTsKIH0KIAotdTE2IGl3bGFnbl9lZXByb21fY2FsaWJfdmVyc2lvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit1MTYgaXdsX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKQogewogCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqaGRyOwogCi0JaGRyID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LAorCWhkciA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9oZHIgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwKIAkJCQkJCQlFRVBST01fQ0FMSUJfQUxMKTsKIAlyZXR1cm4gaGRyLT52ZXJzaW9uOwogCkBAIC0xMDUsNyArMTA2LDcgQEAKIC8qCiAgKiBFRVBST00KICAqLwotc3RhdGljIHUzMiBlZXByb21faW5kaXJlY3RfYWRkcmVzcyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyZXNzKQorc3RhdGljIHUzMiBlZXByb21faW5kaXJlY3RfYWRkcmVzcyhjb25zdCBzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwgdTMyIGFkZHJlc3MpCiB7CiAJdTE2IG9mZnNldCA9IDA7CiAKQEAgLTExNCwzMSArMTE1LDMxIEBACiAKIAlzd2l0Y2ggKGFkZHJlc3MgJiBJTkRJUkVDVF9UWVBFX01TSykgewogCWNhc2UgSU5ESVJFQ1RfSE9TVDoKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX0hPU1QpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfSE9TVCk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfR0VORVJBTDoKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX0dFTkVSQUwpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfR0VORVJBTCk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfUkVHVUxBVE9SWToKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX1JFR1VMQVRPUlkpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfUkVHVUxBVE9SWSk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfVFhQX0xJTUlUOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfVFhQX0xJTUlUKTsKKwkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHNocmQsIEVFUFJPTV9MSU5LX1RYUF9MSU1JVCk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfVFhQX0xJTUlUX1NJWkU6Ci0JCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fTElOS19UWFBfTElNSVRfU0laRSk7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19UWFBfTElNSVRfU0laRSk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfQ0FMSUJSQVRJT046Ci0JCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fTElOS19DQUxJQlJBVElPTik7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19DQUxJQlJBVElPTik7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfUFJPQ0VTU19BREpTVDoKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX1BST0NFU1NfQURKU1QpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfUFJPQ0VTU19BREpTVCk7CiAJCWJyZWFrOwogCWNhc2UgSU5ESVJFQ1RfT1RIRVJTOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfT1RIRVJTKTsKKwkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHNocmQsIEVFUFJPTV9MSU5LX09USEVSUyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgImlsbGVnYWwgaW5kaXJlY3QgdHlwZTogMHglWFxuIiwKKwkJSVdMX0VSUihzaHJkLT50cmFucywgImlsbGVnYWwgaW5kaXJlY3QgdHlwZTogMHglWFxuIiwKIAkJYWRkcmVzcyAmIElORElSRUNUX1RZUEVfTVNLKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTQ3LDExICsxNDgsMTEgQEAKIAlyZXR1cm4gKGFkZHJlc3MgJiBBRERSRVNTX01TSykgKyAob2Zmc2V0IDw8IDEpOwogfQogCi1jb25zdCB1OCAqaXdsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKK2NvbnN0IHU4ICppd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsIHNpemVfdCBvZmZzZXQpCiB7Ci0JdTMyIGFkZHJlc3MgPSBlZXByb21faW5kaXJlY3RfYWRkcmVzcyhwcml2LCBvZmZzZXQpOwotCUJVR19PTihhZGRyZXNzID49IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplKTsKLQlyZXR1cm4gJnByaXYtPmVlcHJvbVthZGRyZXNzXTsKKwl1MzIgYWRkcmVzcyA9IGVlcHJvbV9pbmRpcmVjdF9hZGRyZXNzKHNocmQsIG9mZnNldCk7CisJQlVHX09OKGFkZHJlc3MgPj0gc2hyZC0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUpOworCXJldHVybiAmc2hyZC0+ZWVwcm9tW2FkZHJlc3NdOwogfQogCiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsYWduX21vZF9wYXJhbXMgPSB7CkBAIC0yMzIsNyArMjMzLDcgQEAKIAkJCQlJV0xfUEFOX1NDRF9CS19NU0sgfCBJV0xfUEFOX1NDRF9NR01UX01TSyB8CiAJCQkJSVdMX1BBTl9TQ0RfTVVMVElDQVNUX01TSzsKIAotCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCisJaWYgKGNmZyhwcml2KS0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKIAkJZmx1c2hfY21kLmZpZm9fY29udHJvbCB8PSBJV0xfQUdHX1RYX1FVRVVFX01TSzsKIAogCUlXTF9ERUJVR19JTkZPKHByaXYsICJmaWZvIHF1ZXVlIGNvbnRyb2w6IDBYJXhcbiIsCkBAIC0zNzQsMTUgKzM3NSwxNSBAQAogCUJVSUxEX0JVR19PTihzaXplb2YoaXdsYWduX2RlZl8zd19sb29rdXApICE9CiAJCQlzaXplb2YoYmFzaWMuYnQzX2xvb2t1cF90YWJsZSkpOwogCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zKSB7Ci0JCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2Vzc2lvbl8yKSB7CisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zKSB7CisJCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcy0+YnRfc2Vzc2lvbl8yKSB7CiAJCQlidF9jbWRfMjAwMC5wcmlvX2Jvb3N0ID0gY3B1X3RvX2xlMzIoCi0JCQkJcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X3ByaW9fYm9vc3QpOworCQkJCWNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9wcmlvX2Jvb3N0KTsKIAkJCWJ0X2NtZF8yMDAwLnR4X3ByaW9fYm9vc3QgPSAwOwogCQkJYnRfY21kXzIwMDAucnhfcHJpb19ib29zdCA9IDA7CiAJCX0gZWxzZSB7CiAJCQlidF9jbWRfNjAwMC5wcmlvX2Jvb3N0ID0KLQkJCQlwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfcHJpb19ib29zdDsKKwkJCQljZmcocHJpdiktPmJ0X3BhcmFtcy0+YnRfcHJpb19ib29zdDsKIAkJCWJ0X2NtZF82MDAwLnR4X3ByaW9fYm9vc3QgPSAwOwogCQkJYnRfY21kXzYwMDAucnhfcHJpb19ib29zdCA9IDA7CiAJCX0KQEAgLTQzMCw3ICs0MzEsNyBAQAogCQkgICAgICAgcHJpdi0+YnRfZnVsbF9jb25jdXJyZW50ID8KIAkJICAgICAgICJmdWxsIGNvbmN1cnJlbmN5IiA6ICIzLXdpcmUiKTsKIAotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2Vzc2lvbl8yKSB7CisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9zZXNzaW9uXzIpIHsKIAkJbWVtY3B5KCZidF9jbWRfMjAwMC5iYXNpYywgJmJhc2ljLAogCQkJc2l6ZW9mKGJhc2ljKSk7CiAJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksIFJFUExZX0JUX0NPTkZJRywKQEAgLTc5OSw4ICs4MDAsOCBAQAogICovCiBzdGF0aWMgaW50IGl3bF9nZXRfYWN0aXZlX3J4X2NoYWluX2NvdW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKIAkgICAgKHByaXYtPmJ0X2Z1bGxfY29uY3VycmVudCB8fAogCSAgICAgcHJpdi0+YnRfdHJhZmZpY19sb2FkID49IElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIKSkgewogCQkvKgpAQCAtODI3LDYgKzgyOCw3IEBACiAJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6CiAJY2FzZSBJRUVFODAyMTFfU01QU19EWU5BTUlDOgogCQlyZXR1cm4gSVdMX05VTV9JRExFX0NIQUlOU19TSU5HTEU7CisJY2FzZSBJRUVFODAyMTFfU01QU19BVVRPTUFUSUM6CiAJY2FzZSBJRUVFODAyMTFfU01QU19PRkY6CiAJCXJldHVybiBhY3RpdmVfY250OwogCWRlZmF1bHQ6CkBAIC04NzAsOCArODcyLDggQEAKIAllbHNlCiAJCWFjdGl2ZV9jaGFpbnMgPSBod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50OwogCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0ICYmCisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zICYmCisJICAgIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0ICYmCiAJICAgIChwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQgfHwKIAkgICAgIHByaXYtPmJ0X3RyYWZmaWNfbG9hZCA+PSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfSElHSCkpIHsKIAkJLyoKQEAgLTkzMyw1MyArOTM1LDM1OSBAQAogCXJldHVybiBhbnQ7CiB9CiAKLS8qIG5vdGlmaWNhdGlvbiB3YWl0IHN1cHBvcnQgKi8KLXZvaWQgaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCi0JCQkJICAgdTggY21kLAotCQkJCSAgIHZvaWQgKCpmbikoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkJCQkgICAgICB2b2lkICpkYXRhKSwKLQkJCQkgICB2b2lkICpmbl9kYXRhKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQgaXdsYWduX2NvbnZlcnRfcDFrKHUxNiAqcDFrLCBfX2xlMTYgKm91dCkKIHsKLQl3YWl0X2VudHJ5LT5mbiA9IGZuOwotCXdhaXRfZW50cnktPmZuX2RhdGEgPSBmbl9kYXRhOwotCXdhaXRfZW50cnktPmNtZCA9IGNtZDsKLQl3YWl0X2VudHJ5LT50cmlnZ2VyZWQgPSBmYWxzZTsKLQl3YWl0X2VudHJ5LT5hYm9ydGVkID0gZmFsc2U7CisJaW50IGk7CiAKLQlzcGluX2xvY2tfYmgoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7Ci0JbGlzdF9hZGQoJndhaXRfZW50cnktPmxpc3QsICZwcml2LT5ub3RpZl93YWl0cyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IElXTEFHTl9QMUtfU0laRTsgaSsrKQorCQlvdXRbaV0gPSBjcHVfdG9fbGUxNihwMWtbaV0pOwogfQogCi1pbnQgaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQorc3RydWN0IHdvd2xhbl9rZXlfZGF0YSB7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9yc2NfdHNjX3BhcmFtc19jbWQgKnJzY190c2M7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kICp0a2lwOworCWNvbnN0IHU4ICpic3NpZDsKKwlib29sIGVycm9yLCB1c2VfcnNjX3RzYywgdXNlX3RraXA7Cit9OworCisKK3N0YXRpYyB2b2lkIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCisJCQkgICAgICAgdm9pZCAqX2RhdGEpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhICpkYXRhID0gX2RhdGE7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGRhdGEtPmN0eDsKKwlzdHJ1Y3QgYWVzX3NjICphZXNfc2MsICphZXNfdHhfc2MgPSBOVUxMOworCXN0cnVjdCB0a2lwX3NjICp0a2lwX3NjLCAqdGtpcF90eF9zYyA9IE5VTEw7CisJc3RydWN0IGl3bGFnbl9wMWtfY2FjaGUgKnJ4X3Axa3M7CisJdTggKnJ4X21pY19rZXk7CisJc3RydWN0IGllZWU4MDIxMV9rZXlfc2VxIHNlcTsKKwl1MzIgY3VyX3J4X2l2MzIgPSAwOworCXUxNiBwMWtbSVdMQUdOX1AxS19TSVpFXTsKKwlpbnQgcmV0LCBpOwogCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHByaXYtPm5vdGlmX3dhaXRxLAotCQkJCSB3YWl0X2VudHJ5LT50cmlnZ2VyZWQgfHwgd2FpdF9lbnRyeS0+YWJvcnRlZCwKLQkJCQkgdGltZW91dCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwogCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOwotCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKLQlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKKwlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8CisJICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmCisJICAgICAhc3RhICYmICFjdHgtPmtleV9tYXBwaW5nX2tleXMpCisJCXJldCA9IGl3bF9zZXRfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKKwllbHNlCisJCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgY3R4LCBrZXksIHN0YSk7CiAKLQlpZiAod2FpdF9lbnRyeS0+YWJvcnRlZCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIGtleSBkdXJpbmcgc3VzcGVuZCFcbiIpOworCQlkYXRhLT5lcnJvciA9IHRydWU7CisJfQogCi0JLyogcmV0dXJuIHZhbHVlIGlzIGFsd2F5cyA+PSAwICovCi0JaWYgKHJldCA8PSAwKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGtleS0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlpZiAoc3RhKSB7CisJCQl0a2lwX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC51bmljYXN0X3JzYzsKKwkJCXRraXBfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC50c2M7CisKKwkJCXJ4X3Axa3MgPSBkYXRhLT50a2lwLT5yeF91bmk7CisKKwkJCWllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcShrZXksICZzZXEpOworCQkJdGtpcF90eF9zYy0+aXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOworCQkJdGtpcF90eF9zYy0+aXYzMiA9IGNwdV90b19sZTMyKHNlcS50a2lwLml2MzIpOworCisJCQlpZWVlODAyMTFfZ2V0X3RraXBfcDFrX2l2KGtleSwgc2VxLnRraXAuaXYzMiwgcDFrKTsKKwkJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIGRhdGEtPnRraXAtPnR4LnAxayk7CisKKwkJCW1lbWNweShkYXRhLT50a2lwLT5taWNfa2V5cy50eCwKKwkJCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1RYX01JQ19LRVldLAorCQkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOworCisJCQlyeF9taWNfa2V5ID0gZGF0YS0+dGtpcC0+bWljX2tleXMucnhfdW5pY2FzdDsKKwkJfSBlbHNlIHsKKwkJCXRraXBfc2MgPQorCQkJCWRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLnRraXAubXVsdGljYXN0X3JzYzsKKwkJCXJ4X3Axa3MgPSBkYXRhLT50a2lwLT5yeF9tdWx0aTsKKwkJCXJ4X21pY19rZXkgPSBkYXRhLT50a2lwLT5taWNfa2V5cy5yeF9tY2FzdDsKKwkJfQorCisJCS8qCisJCSAqIEZvciBub24tUW9TIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgdUNvZGUgYW5kCisJCSAqIG1hYzgwMjExIHVzZSBUSUQgMCAoYXMgdGhleSBuZWVkIHRvIHRvIGF2b2lkIHJlcGxheSBhdHRhY2tzKQorCQkgKiBmb3IgY2hlY2tpbmcgdGhlIElWIGluIHRoZSBmcmFtZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX05VTV9SU0M7IGkrKykgeworCQkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleSwgaSwgJnNlcSk7CisJCQl0a2lwX3NjW2ldLml2MTYgPSBjcHVfdG9fbGUxNihzZXEudGtpcC5pdjE2KTsKKwkJCXRraXBfc2NbaV0uaXYzMiA9IGNwdV90b19sZTMyKHNlcS50a2lwLml2MzIpOworCQkJLyogd3JhcHBpbmcgaXNuJ3QgYWxsb3dlZCwgQVAgbXVzdCByZWtleSAqLworCQkJaWYgKHNlcS50a2lwLml2MzIgPiBjdXJfcnhfaXYzMikKKwkJCQljdXJfcnhfaXYzMiA9IHNlcS50a2lwLml2MzI7CisJCX0KKworCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleSwgZGF0YS0+YnNzaWQsIGN1cl9yeF9pdjMyLCBwMWspOworCQlpd2xhZ25fY29udmVydF9wMWsocDFrLCByeF9wMWtzWzBdLnAxayk7CisJCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5LCBkYXRhLT5ic3NpZCwKKwkJCQkJICBjdXJfcnhfaXYzMiArIDEsIHAxayk7CisJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIHJ4X3Axa3NbMV0ucDFrKTsKKworCQltZW1jcHkocnhfbWljX2tleSwKKwkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfUlhfTUlDX0tFWV0sCisJCSAgICAgICBJV0xBR05fTUlDX0tFWV9TSVpFKTsKKworCQlkYXRhLT51c2VfdGtpcCA9IHRydWU7CisJCWRhdGEtPnVzZV9yc2NfdHNjID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlpZiAoc3RhKSB7CisJCQl1OCAqcG4gPSBzZXEuY2NtcC5wbjsKKworCQkJYWVzX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLnVuaWNhc3RfcnNjOworCQkJYWVzX3R4X3NjID0gJmRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy50c2M7CisKKwkJCWllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcShrZXksICZzZXEpOworCQkJYWVzX3R4X3NjLT5wbiA9IGNwdV90b19sZTY0KAorCQkJCQkodTY0KXBuWzVdIHwKKwkJCQkJKCh1NjQpcG5bNF0gPDwgOCkgfAorCQkJCQkoKHU2NClwblszXSA8PCAxNikgfAorCQkJCQkoKHU2NClwblsyXSA8PCAyNCkgfAorCQkJCQkoKHU2NClwblsxXSA8PCAzMikgfAorCQkJCQkoKHU2NClwblswXSA8PCA0MCkpOworCQl9IGVsc2UKKwkJCWFlc19zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy5tdWx0aWNhc3RfcnNjOworCisJCS8qCisJCSAqIEZvciBub24tUW9TIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgYm90aCB0aGUgdUNvZGUgYW5kCisJCSAqIG1hYzgwMjExIHVzZSBUSUQgMCBmb3IgY2hlY2tpbmcgdGhlIElWIGluIHRoZSBmcmFtZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX05VTV9SU0M7IGkrKykgeworCQkJdTggKnBuID0gc2VxLmNjbXAucG47CisKKwkJCWllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcShrZXksIGksICZzZXEpOworCQkJYWVzX3NjLT5wbiA9IGNwdV90b19sZTY0KAorCQkJCQkodTY0KXBuWzVdIHwKKwkJCQkJKCh1NjQpcG5bNF0gPDwgOCkgfAorCQkJCQkoKHU2NClwblszXSA8PCAxNikgfAorCQkJCQkoKHU2NClwblsyXSA8PCAyNCkgfAorCQkJCQkoKHU2NClwblsxXSA8PCAzMikgfAorCQkJCQkoKHU2NClwblswXSA8PCA0MCkpOworCQl9CisJCWRhdGEtPnVzZV9yc2NfdHNjID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiB9CiAKLXZvaWQgaXdsYWduX3JlbW92ZV9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnkpCitpbnQgaXdsYWduX3NlbmRfcGF0dGVybnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQogewotCXNwaW5fbG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKLQlsaXN0X2RlbCgmd2FpdF9lbnRyeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybnNfY21kICpwYXR0ZXJuX2NtZDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gUkVQTFlfV09XTEFOX1BBVFRFUk5TLAorCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKKwkJLmZsYWdzID0gQ01EX1NZTkMsCisJfTsKKwlpbnQgaSwgZXJyOworCisJaWYgKCF3b3dsYW4tPm5fcGF0dGVybnMpCisJCXJldHVybiAwOworCisJY21kLmxlblswXSA9IHNpemVvZigqcGF0dGVybl9jbWQpICsKKwkJd293bGFuLT5uX3BhdHRlcm5zICogc2l6ZW9mKHN0cnVjdCBpd2xhZ25fd293bGFuX3BhdHRlcm4pOworCisJcGF0dGVybl9jbWQgPSBrbWFsbG9jKGNtZC5sZW5bMF0sIEdGUF9LRVJORUwpOworCWlmICghcGF0dGVybl9jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJcGF0dGVybl9jbWQtPm5fcGF0dGVybnMgPSBjcHVfdG9fbGUzMih3b3dsYW4tPm5fcGF0dGVybnMpOworCisJZm9yIChpID0gMDsgaSA8IHdvd2xhbi0+bl9wYXR0ZXJuczsgaSsrKSB7CisJCWludCBtYXNrX2xlbiA9IERJVl9ST1VORF9VUCh3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuLCA4KTsKKworCQltZW1jcHkoJnBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5tYXNrLAorCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5tYXNrLCBtYXNrX2xlbik7CisJCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLnBhdHRlcm4sCisJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm4sCisJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuKTsKKwkJcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2tfc2l6ZSA9IG1hc2tfbGVuOworCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybl9zaXplID0KKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW47CisJfQorCisJY21kLmRhdGFbMF0gPSBwYXR0ZXJuX2NtZDsKKwllcnIgPSBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZjbWQpOworCWtmcmVlKHBhdHRlcm5fY21kKTsKKwlyZXR1cm4gZXJyOwogfQorCitpbnQgaXdsYWduX3N1c3BlbmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQoreworCXN0cnVjdCBpd2xhZ25fd293bGFuX3dha2V1cF9maWx0ZXJfY21kIHdha2V1cF9maWx0ZXJfY21kOworCXN0cnVjdCBpd2xfcnhvbl9jbWQgcnhvbjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXN0cnVjdCBpd2xhZ25fd293bGFuX2tla19rY2tfbWF0ZXJpYWxfY21kIGtla19rY2tfY21kOworCXN0cnVjdCBpd2xhZ25fd293bGFuX3RraXBfcGFyYW1zX2NtZCB0a2lwX2NtZCA9IHt9OworCXN0cnVjdCBpd2xhZ25fZDNfY29uZmlnX2NtZCBkM19jZmdfY21kID0ge307CisJc3RydWN0IHdvd2xhbl9rZXlfZGF0YSBrZXlfZGF0YSA9IHsKKwkJLmN0eCA9IGN0eCwKKwkJLmJzc2lkID0gY3R4LT5hY3RpdmUuYnNzaWRfYWRkciwKKwkJLnVzZV9yc2NfdHNjID0gZmFsc2UsCisJCS50a2lwID0gJnRraXBfY21kLAorCQkudXNlX3RraXAgPSBmYWxzZSwKKwl9OworCWludCByZXQsIGk7CisJdTE2IHNlcTsKKworCWtleV9kYXRhLnJzY190c2MgPSBremFsbG9jKHNpemVvZigqa2V5X2RhdGEucnNjX3RzYyksIEdGUF9LRVJORUwpOworCWlmICgha2V5X2RhdGEucnNjX3RzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoJndha2V1cF9maWx0ZXJfY21kLCAwLCBzaXplb2Yod2FrZXVwX2ZpbHRlcl9jbWQpKTsKKworCS8qCisJICogV2Uga25vdyB0aGUgbGFzdCB1c2VkIHNlcW5vLCBhbmQgdGhlIHVDb2RlIGV4cGVjdHMgdG8ga25vdyB0aGF0CisJICogb25lLCBpdCB3aWxsIGluY3JlbWVudCBiZWZvcmUgVFguCisJICovCisJc2VxID0gbGUxNl90b19jcHUocHJpdi0+bGFzdF9zZXFfY3RsKSAmIElFRUU4MDIxMV9TQ1RMX1NFUTsKKwl3YWtldXBfZmlsdGVyX2NtZC5ub25fcW9zX3NlcSA9IGNwdV90b19sZTE2KHNlcSk7CisKKwkvKgorCSAqIEZvciBRb1MgY291bnRlcnMsIHdlIHN0b3JlIHRoZSBvbmUgdG8gdXNlIG5leHQsIHNvIHN1YnRyYWN0IDB4MTAKKwkgKiBzaW5jZSB0aGUgdUNvZGUgd2lsbCBhZGQgMHgxMCBiZWZvcmUgdXNpbmcgdGhlIHZhbHVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBJV0xfTUFYX1RJRF9DT1VOVDsgaSsrKSB7CisJCXNlcSA9IHByaXYtPnRpZF9kYXRhW0lXTF9BUF9JRF1baV0uc2VxX251bWJlcjsKKwkJc2VxIC09IDB4MTA7CisJCXdha2V1cF9maWx0ZXJfY21kLnFvc19zZXFbaV0gPSBjcHVfdG9fbGUxNihzZXEpOworCX0KKworCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTIHwKKwkJCQkgICAgSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UpOworCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUKTsKKwlpZiAod293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwpOworCWlmICh3b3dsYW4tPmVhcF9pZGVudGl0eV9yZXEpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0VBUF9JREVOVF9SRVEpOworCWlmICh3b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfNFdBWV9IQU5EU0hBS0UpOworCWlmICh3b3dsYW4tPm5fcGF0dGVybnMpCisJCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gpOworCisJaWYgKHdvd2xhbi0+cmZraWxsX3JlbGVhc2UpCisJCWQzX2NmZ19jbWQud2FrZXVwX2ZsYWdzIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fRDNfV0FLRVVQX1JGS0lMTCk7CisKKwlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOworCisJbWVtY3B5KCZyeG9uLCAmY3R4LT5hY3RpdmUsIHNpemVvZihyeG9uKSk7CisKKwlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOworCisJcHJpdi0+c2hyZC0+d293bGFuID0gdHJ1ZTsKKworCXJldCA9IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUodHJhbnMocHJpdiksIElXTF9VQ09ERV9XT1dMQU4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogbm93IGNvbmZpZ3VyZSBXb1dMQU4gdWNvZGUgKi8KKwlyZXQgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoJmN0eC0+c3RhZ2luZywgJnJ4b24sIHNpemVvZihyeG9uKSk7CisJcmV0ID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykgeworCQkvKiBtYXJrIGFsbCBrZXlzIGNsZWFyICovCisJCXByaXYtPnVjb2RlX2tleV90YWJsZSA9IDA7CisJCWN0eC0+a2V5X21hcHBpbmdfa2V5cyA9IDA7CisKKwkJLyoKKwkJICogVGhpcyBuZWVkcyB0byBiZSB1bmxvY2tlZCBkdWUgdG8gbG9jayBvcmRlcmluZworCQkgKiBjb25zdHJhaW50cy4gU2luY2Ugd2UncmUgaW4gdGhlIHN1c3BlbmQgcGF0aAorCQkgKiB0aGF0IGlzbid0IHJlYWxseSBhIHByb2JsZW0gdGhvdWdoLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJCWllZWU4MDIxMV9pdGVyX2tleXMocHJpdi0+aHcsIGN0eC0+dmlmLAorCQkJCSAgICBpd2xhZ25fd293bGFuX3Byb2dyYW1fa2V5cywKKwkJCQkgICAgJmtleV9kYXRhKTsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCQlpZiAoa2V5X2RhdGEuZXJyb3IpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChrZXlfZGF0YS51c2VfcnNjX3RzYykgeworCQkJc3RydWN0IGl3bF9ob3N0X2NtZCByc2NfdHNjX2NtZCA9IHsKKwkJCQkuaWQgPSBSRVBMWV9XT1dMQU5fVFNDX1JTQ19QQVJBTVMsCisJCQkJLmZsYWdzID0gQ01EX1NZTkMsCisJCQkJLmRhdGFbMF0gPSBrZXlfZGF0YS5yc2NfdHNjLAorCQkJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAorCQkJCS5sZW5bMF0gPSBzaXplb2Yoa2V5X2RhdGEucnNjX3RzYyksCisJCQl9OworCisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZyc2NfdHNjX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGtleV9kYXRhLnVzZV90a2lwKSB7CisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAorCQkJCQkJIFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUywKKwkJCQkJCSBDTURfU1lOQywgc2l6ZW9mKHRraXBfY21kKSwKKwkJCQkJCSAmdGtpcF9jbWQpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwcml2LT5oYXZlX3Jla2V5X2RhdGEpIHsKKwkJCW1lbXNldCgma2VrX2tja19jbWQsIDAsIHNpemVvZihrZWtfa2NrX2NtZCkpOworCQkJbWVtY3B5KGtla19rY2tfY21kLmtjaywgcHJpdi0+a2NrLCBOTDgwMjExX0tDS19MRU4pOworCQkJa2VrX2tja19jbWQua2NrX2xlbiA9IGNwdV90b19sZTE2KE5MODAyMTFfS0NLX0xFTik7CisJCQltZW1jcHkoa2VrX2tja19jbWQua2VrLCBwcml2LT5rZWssIE5MODAyMTFfS0VLX0xFTik7CisJCQlrZWtfa2NrX2NtZC5rZWtfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LRUtfTEVOKTsKKwkJCWtla19rY2tfY21kLnJlcGxheV9jdHIgPSBwcml2LT5yZXBsYXlfY3RyOworCisJCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAorCQkJCQkJIFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMLAorCQkJCQkJIENNRF9TWU5DLCBzaXplb2Yoa2VrX2tja19jbWQpLAorCQkJCQkJICZrZWtfa2NrX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfRDNfQ09ORklHLCBDTURfU1lOQywKKwkJCQkgICAgIHNpemVvZihkM19jZmdfY21kKSwgJmQzX2NmZ19jbWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfV09XTEFOX1dBS0VVUF9GSUxURVIsCisJCQkJIENNRF9TWU5DLCBzaXplb2Yod2FrZXVwX2ZpbHRlcl9jbWQpLAorCQkJCSAmd2FrZXVwX2ZpbHRlcl9jbWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaXdsYWduX3NlbmRfcGF0dGVybnMocHJpdiwgd293bGFuKTsKKyBvdXQ6CisJa2ZyZWUoa2V5X2RhdGEucnNjX3RzYyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwppbmRleCA2NjExOGNlLi4zMzRiNWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJfSBlbHNlCiAJCXJldHVybiBJV0xfTUFYX1RJRF9DT1VOVDsKIAotCWlmICh1bmxpa2VseSh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKSkKKwlpZiAodW5saWtlbHkodGlkID49IElXTF9NQVhfVElEX0NPVU5UKSkKIAkJcmV0dXJuIElXTF9NQVhfVElEX0NPVU5UOwogCiAJdGwgPSAmbHFfZGF0YS0+bG9hZFt0aWRdOwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCiAJbHFfc3RhLT5hY3RpdmVfbWltbzNfcmF0ZSAgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCiAKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RFU1RNT0RFCiAJLyogdGVzdG1vZGUgaGFzIGhpZ2hlciBwcmlvcml0eSB0byBvdmVyd2lydGUgdGhlIGZpeGVkIHJhdGUgKi8KIAlpZiAocHJpdi0+dG1fZml4ZWRfcmF0ZSkKIAkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IHByaXYtPnRtX2ZpeGVkX3JhdGU7CkBAIC0zNzksNyArMzc5LDcgQEAKIAlzMzIgaW5kZXg7CiAJc3RydWN0IGl3bF90cmFmZmljX2xvYWQgKnRsID0gTlVMTDsKIAotCWlmICh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKQorCWlmICh0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpCiAJCXJldHVybiAwOwogCiAJdGwgPSAmKGxxX2RhdGEtPmxvYWRbdGlkXSk7CkBAIC00NDQsMTEgKzQ0NCwxMSBAQAogCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewotCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCisJaWYgKHRpZCA8IElXTF9NQVhfVElEX0NPVU5UKQogCQlyc190bF90dXJuX29uX2FnZ19mb3JfdGlkKHByaXYsIGxxX2RhdGEsIHRpZCwgc3RhKTsKIAllbHNlCi0JCUlXTF9FUlIocHJpdiwgInRpZCBleGNlZWRzIG1heCBsb2FkIGNvdW50OiAlZC8lZFxuIiwKLQkJCXRpZCwgVElEX01BWF9MT0FEX0NPVU5UKTsKKwkJSVdMX0VSUihwcml2LCAidGlkIGV4Y2VlZHMgbWF4IFRJRCBjb3VudDogJWQvJWRcbiIsCisJCQl0aWQsIElXTF9NQVhfVElEX0NPVU5UKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X251bV9vZl9hbnRfZnJvbV9yYXRlKHUzMiByYXRlX25fZmxhZ3MpCkBAIC0xMDgxLDEyICsxMDgxLDEyIEBACiAJaWYgKHN0YSAmJiBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdKQogCQlyc19yYXRlX3NjYWxlX3BlcmZvcm0ocHJpdiwgc2tiLCBzdGEsIGxxX3N0YSk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSAmJiBkZWZpbmVkKENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDODAyMTFfREVCVUdGUykgJiYgZGVmaW5lZChDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUpCiAJaWYgKChwcml2LT50bV9maXhlZF9yYXRlKSAmJgogCSAgICAocHJpdi0+dG1fZml4ZWRfcmF0ZSAhPSBscV9zdGEtPmRiZ19maXhlZF9yYXRlKSkKIAkJcnNfcHJvZ3JhbV9maXhfcmF0ZShwcml2LCBscV9zdGEpOwogI2VuZGlmCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KQorCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJiBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkKIAkJcnNfYnRfdXBkYXRlX2xxKHByaXYsIGN0eCwgbHFfc3RhKTsKIH0KIApAQCAtMTQ1OCwxMCArMTQ1OCw4IEBACiAJCWJyZWFrOwogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0xPVzoKIAkJLyogYXZvaWQgYW50ZW5uYSBCIHVubGVzcyBNSU1PICovCi0JCXZhbGlkX3R4X2FudCA9Ci0JCQlmaXJzdF9hbnRlbm5hKGh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQpOwogCQlpZiAodGJsLT5hY3Rpb24gPT0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTIpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOwogCQlicmVhazsKIAljYXNlIElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOgogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0NPTlRJTlVPVVM6CkBAIC0xNjM2LDEwICsxNjM0LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfTE9XOgogCQkvKiBhdm9pZCBhbnRlbm5hIEIgdW5sZXNzIE1JTU8gKi8KLQkJdmFsaWRfdHhfYW50ID0KLQkJCWZpcnN0X2FudGVubmEoaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCk7CiAJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTIpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMTsKKwkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOwogCQlicmVhazsKIAljYXNlIElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOgogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0NPTlRJTlVPVVM6CkBAIC0yMjc3LDcgKzIyNzMsNyBAQAogCXRpZCA9IHJzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOwogCWlmICgodGlkICE9IElXTF9NQVhfVElEX0NPVU5UKSAmJgogCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkpIHsKLQkJdGlkX2RhdGEgPSAmcHJpdi0+c2hyZC0+dGlkX2RhdGFbbHFfc3RhLT5scS5zdGFfaWRdW3RpZF07CisJCXRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW2xxX3N0YS0+bHEuc3RhX2lkXVt0aWRdOwogCQlpZiAodGlkX2RhdGEtPmFnZy5zdGF0ZSA9PSBJV0xfQUdHX09GRikKIAkJCWxxX3N0YS0+aXNfYWdnID0gMDsKIAkJZWxzZQpAQCAtMjY0OSw4ICsyNjQ1LDcgQEAKIAkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKIAkJCSAgICAodGlkICE9IElXTF9NQVhfVElEX0NPVU5UKSkgewogCQkJCXU4IHN0YV9pZCA9IGxxX3N0YS0+bHEuc3RhX2lkOwotCQkJCXRpZF9kYXRhID0KLQkJCQkgICAmcHJpdi0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOworCQkJCXRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKIAkJCQlpZiAodGlkX2RhdGEtPmFnZy5zdGF0ZSA9PSBJV0xfQUdHX09GRikgewogCQkJCQlJV0xfREVCVUdfUkFURShwcml2LAogCQkJCQkJICAgICAgICJ0cnkgdG8gYWdncmVnYXRlIHRpZCAlZFxuIiwKQEAgLTI5MDgsNyArMjkwMyw3IEBACiAJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCiAJCWxxX3N0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7CiAJbHFfc3RhLT5pc19hZ2cgPSAwOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKIAlwcml2LT50bV9maXhlZF9yYXRlID0gMDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCkBAIC0zMDU5LDExICszMDU0LDExIEBACiAJICogb3ZlcndyaXRlIGlmIG5lZWRlZCwgcGFzcyBhZ2dyZWdhdGlvbiB0aW1lIGxpbWl0CiAJICogdG8gdUNvZGUgaW4gdVNlYwogCSAqLwotCWlmIChwcml2ICYmIHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZ2dfdGltZV9saW1pdCAmJgorCWlmIChwcml2ICYmIGNmZyhwcml2KS0+YnRfcGFyYW1zICYmCisJICAgIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZ2dfdGltZV9saW1pdCAmJgogCSAgICBwcml2LT5idF90cmFmZmljX2xvYWQgPj0gSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0hJR0gpCiAJCWxxX2NtZC0+YWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCA9Ci0JCQljcHVfdG9fbGUxNihwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWdnX3RpbWVfbGltaXQpOworCQkJY3B1X3RvX2xlMTYoY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFnZ190aW1lX2xpbWl0KTsKIH0KIAogc3RhdGljIHZvaWQgKnJzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaAppbmRleCBmNGY2ZGViLi42Njc1YjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaApAQCAtMjgxLDcgKzI4MSw2IEBACiAjZGVmaW5lIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcJNTAJLyptUyAqLwogI2RlZmluZSBUSURfUVVFVUVfTUFYX1NJWkUJMjAKICNkZWZpbmUgVElEX1JPVU5EX1ZBTFVFCQk1CS8qIG1TICovCi0jZGVmaW5lIFRJRF9NQVhfTE9BRF9DT1VOVAk4CiAKICNkZWZpbmUgVElEX01BWF9USU1FX0RJRkYgKChUSURfUVVFVUVfTUFYX1NJWkUgLSAxKSAqIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcpCiAjZGVmaW5lIFRJTUVfV1JBUF9BUk9VTkQoeCwgeSkgKCgoeSkgPiAoeCkpID8gKHkpIC0gKHgpIDogKDAtKHgpKSArICh5KSkKQEAgLTQwMiw3ICs0MDEsNyBAQAogCiAJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kIGxxOwogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gbHFfaW5mb1tMUV9TSVpFXTsgLyogImFjdGl2ZSIsICJzZWFyY2giICovCi0Jc3RydWN0IGl3bF90cmFmZmljX2xvYWQgbG9hZFtUSURfTUFYX0xPQURfQ09VTlRdOworCXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkIGxvYWRbSVdMX01BWF9USURfQ09VTlRdOwogCXU4IHR4X2FnZ190aWRfZW47CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKIAlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfZmlsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4LmMKaW5kZXggNWFmOWU2Mi4uYjIyYjI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4LmMKQEAgLTExNyw2ICsxMTcsNyBAQAogCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUyk7CiAJCUlXTF9DTUQoUkVQTFlfV09XTEFOX0tFS19LQ0tfTUFURVJJQUwpOwogCQlJV0xfQ01EKFJFUExZX1dPV0xBTl9HRVRfU1RBVFVTKTsKKwkJSVdMX0NNRChSRVBMWV9EM19DT05GSUcpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAiVU5LTk9XTiI7CiAKQEAgLTMxNyw3ICszMTgsNyBAQAogCQkJCSB1bnNpZ25lZCBpbnQgbXNlY3MpCiB7CiAJaW50IGRlbHRhOwotCWludCB0aHJlc2hvbGQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZDsKKwlpbnQgdGhyZXNob2xkID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQ7CiAKIAlpZiAodGhyZXNob2xkID09IElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX0RJU0FCTEUpIHsKIAkJSVdMX0RFQlVHX1JBRElPKHByaXYsICJwbGNwX2VyciBjaGVjayBkaXNhYmxlZFxuIik7CkBAIC01ODIsOCArNTgzLDggQEAKIAkJaXdsYWduX3J4X2NhbGNfbm9pc2UocHJpdik7CiAJCXF1ZXVlX3dvcmsocHJpdi0+c2hyZC0+d29ya3F1ZXVlLCAmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7CiAJfQotCWlmIChwcml2LT5jZmctPmxpYi0+dGVtcGVyYXR1cmUgJiYgY2hhbmdlKQotCQlwcml2LT5jZmctPmxpYi0+dGVtcGVyYXR1cmUocHJpdik7CisJaWYgKGNmZyhwcml2KS0+bGliLT50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCisJCWNmZyhwcml2KS0+bGliLT50ZW1wZXJhdHVyZShwcml2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODAwLDcgKzgwMSw4IEBACiAJCQkJCSAgICAgICBjdHgtPmFjdGl2ZS5ic3NpZF9hZGRyKSkKIAkJCQljb250aW51ZTsKIAkJCWN0eC0+bGFzdF90eF9yZWplY3RlZCA9IGZhbHNlOwotCQkJaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHRyYW5zKHByaXYpLCBjdHgtPmN0eGlkKTsKKwkJCWl3bF90cmFuc193YWtlX2FueV9xdWV1ZSh0cmFucyhwcml2KSwgY3R4LT5jdHhpZCwKKwkJCQkiY2hhbm5lbCBnb3QgYWN0aXZlIik7CiAJCX0KIAl9CiAKQEAgLTEwMzIsNiArMTAzNCw1MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGl3bGFnbl9yeF9ub2Ffbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKKwkJCQkgICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaXdsX3dpcGFuX25vYV9kYXRhICpuZXdfZGF0YSwgKm9sZF9kYXRhOworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpd2xfd2lwYW5fbm9hX25vdGlmaWNhdGlvbiAqbm9hX25vdGlmID0gKHZvaWQgKilwa3QtPnUucmF3OworCisJLyogbm8gY29uZGl0aW9uIC0tIHdlJ3JlIGluIHNvZnRpcnEgKi8KKwlvbGRfZGF0YSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocHJpdi0+bm9hX2RhdGEsIHRydWUpOworCisJaWYgKG5vYV9ub3RpZi0+bm9hX2FjdGl2ZSkgeworCQl1MzIgbGVuID0gbGUxNl90b19jcHUobm9hX25vdGlmLT5ub2FfYXR0cmlidXRlLmxlbmd0aCk7CisJCXUzMiBjb3B5bGVuID0gbGVuOworCisJCS8qIEVJRCwgbGVuLCBPVUksIHN1YnR5cGUgKi8KKwkJbGVuICs9IDEgKyAxICsgMyArIDE7CisJCS8qIFAyUCBpZCwgUDJQIGxlbmd0aCAqLworCQlsZW4gKz0gMSArIDI7CisJCWNvcHlsZW4gKz0gMSArIDI7CisKKwkJbmV3X2RhdGEgPSBrbWFsbG9jKHNpemVvZigqbmV3X2RhdGEpICsgbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19kYXRhKSB7CisJCQluZXdfZGF0YS0+bGVuZ3RoID0gbGVuOworCQkJbmV3X2RhdGEtPmRhdGFbMF0gPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM7CisJCQluZXdfZGF0YS0+ZGF0YVsxXSA9IGxlbiAtIDI7IC8qIG5vdCBjb3VudGluZyBFSUQsIGxlbiAqLworCQkJbmV3X2RhdGEtPmRhdGFbMl0gPSAoV0xBTl9PVUlfV0ZBID4+IDE2KSAmIDB4ZmY7CisJCQluZXdfZGF0YS0+ZGF0YVszXSA9IChXTEFOX09VSV9XRkEgPj4gOCkgJiAweGZmOworCQkJbmV3X2RhdGEtPmRhdGFbNF0gPSAoV0xBTl9PVUlfV0ZBID4+IDApICYgMHhmZjsKKwkJCW5ld19kYXRhLT5kYXRhWzVdID0gV0xBTl9PVUlfVFlQRV9XRkFfUDJQOworCQkJbWVtY3B5KCZuZXdfZGF0YS0+ZGF0YVs2XSwgJm5vYV9ub3RpZi0+bm9hX2F0dHJpYnV0ZSwKKwkJCSAgICAgICBjb3B5bGVuKTsKKwkJfQorCX0gZWxzZQorCQluZXdfZGF0YSA9IE5VTEw7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIocHJpdi0+bm9hX2RhdGEsIG5ld19kYXRhKTsKKworCWlmIChvbGRfZGF0YSkKKwkJa2ZyZWVfcmN1KG9sZF9kYXRhLCByY3VfaGVhZCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBpd2xfc2V0dXBfcnhfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCiAgKgpAQCAtMTA1NSw2ICsxMTAxLDggQEAKIAloYW5kbGVyc1tCRUFDT05fTk9USUZJQ0FUSU9OXQkJPSBpd2xhZ25fcnhfYmVhY29uX25vdGlmOwogCWhhbmRsZXJzW1JFUExZX0FERF9TVEFdCQkJPSBpd2xfYWRkX3N0YV9jYWxsYmFjazsKIAorCWhhbmRsZXJzW1JFUExZX1dJUEFOX05PQV9OT1RJRklDQVRJT05dCT0gaXdsYWduX3J4X25vYV9ub3RpZmljYXRpb247CisKIAkvKgogCSAqIFRoZSBzYW1lIGhhbmRsZXIgaXMgdXNlZCBmb3IgYm90aCB0aGUgUkVQTFkgdG8gYSBkaXNjcmV0ZQogCSAqIHN0YXRpc3RpY3MgcmVxdWVzdCBmcm9tIHRoZSBob3N0IGFzIHdlbGwgYXMgZm9yIHRoZSBwZXJpb2RpYwpAQCAtMTA4MywxMyArMTEzMSwxMyBAQAogCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1RYXSA9IGl3bGFnbl9yeF9yZXBseV90eDsKIAogCS8qIHNldCB1cCBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPm5vdGlmX3dhaXRzKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5ub3RpZl93YWl0cSk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNocmQtPm5vdGlmX3dhaXRfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnNocmQtPm5vdGlmX3dhaXRzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5zaHJkLT5ub3RpZl93YWl0cSk7CiAKIAkvKiBTZXQgdXAgQlQgUnggaGFuZGxlcnMgKi8KLQlpZiAocHJpdi0+Y2ZnLT5saWItPmJ0X3J4X2hhbmRsZXJfc2V0dXApCi0JCXByaXYtPmNmZy0+bGliLT5idF9yeF9oYW5kbGVyX3NldHVwKHByaXYpOworCWlmIChjZmcocHJpdiktPmxpYi0+YnRfcnhfaGFuZGxlcl9zZXR1cCkKKwkJY2ZnKHByaXYpLT5saWItPmJ0X3J4X2hhbmRsZXJfc2V0dXAocHJpdik7CiAKIH0KIApAQCAtMTEwNCwxMSArMTE1MiwxMSBAQAogCSAqIGV2ZW4gaWYgdGhlIFJYIGhhbmRsZXIgY29uc3VtZXMgdGhlIFJYQiB3ZSBoYXZlCiAJICogYWNjZXNzIHRvIGl0IGluIHRoZSBub3RpZmljYXRpb24gd2FpdCBlbnRyeS4KIAkgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPm5vdGlmX3dhaXRzKSkgeworCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+c2hyZC0+bm90aWZfd2FpdHMpKSB7CiAJCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKnc7CiAKLQkJc3Bpbl9sb2NrKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcml2LT5ub3RpZl93YWl0cywgbGlzdCkgeworCQlzcGluX2xvY2soJnByaXYtPnNocmQtPm5vdGlmX3dhaXRfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByaXYtPnNocmQtPm5vdGlmX3dhaXRzLCBsaXN0KSB7CiAJCQlpZiAody0+Y21kICE9IHBrdC0+aGRyLmNtZCkKIAkJCQljb250aW51ZTsKIAkJCUlXTF9ERUJVR19SWChwcml2LApAQCAtMTExNywxMSArMTE2NSwxMSBAQAogCQkJCXBrdC0+aGRyLmNtZCk7CiAJCQl3LT50cmlnZ2VyZWQgPSB0cnVlOwogCQkJaWYgKHctPmZuKQotCQkJCXctPmZuKHByaXYsIHBrdCwgdy0+Zm5fZGF0YSk7CisJCQkJdy0+Zm4odHJhbnMocHJpdiksIHBrdCwgdy0+Zm5fZGF0YSk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZwcml2LT5zaHJkLT5ub3RpZl93YWl0X2xvY2spOwogCi0JCXdha2VfdXBfYWxsKCZwcml2LT5ub3RpZl93YWl0cSk7CisJCXdha2VfdXBfYWxsKCZwcml2LT5zaHJkLT5ub3RpZl93YWl0cSk7CiAJfQogCiAJaWYgKHByaXYtPnByZV9yeF9oYW5kbGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKaW5kZXggNThhMzgxYy4uMWM2NjU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCkBAIC00NSw3ICs0NSw4IEBACiAJc2VuZC0+ZmlsdGVyX2ZsYWdzID0gb2xkX2ZpbHRlcjsKIAogCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyBvbiBCU1MgKCVkKVxuIiwgcmV0KTsKKwkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTChwcml2LAorCQkJIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyBvbiBCU1MgKCVkKVxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01OSw3ICs2MCw3IEBACiAJdTggb2xkX2Rldl90eXBlID0gc2VuZC0+ZGV2X3R5cGU7CiAJaW50IHJldDsKIAotCWl3bGFnbl9pbml0X25vdGlmaWNhdGlvbl93YWl0KHByaXYsICZkaXNhYmxlX3dhaXQsCisJaXdsX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdi0+c2hyZCwgJmRpc2FibGVfd2FpdCwKIAkJCQkgICAgICBSRVBMWV9XSVBBTl9ERUFDVElWQVRJT05fQ09NUExFVEUsCiAJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAKQEAgLTczLDkgKzc0LDkgQEAKIAogCWlmIChyZXQpIHsKIAkJSVdMX0VSUihwcml2LCAiRXJyb3IgZGlzYWJsaW5nIFBBTiAoJWQpXG4iLCByZXQpOwotCQlpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LCAmZGlzYWJsZV93YWl0KTsKKwkJaXdsX3JlbW92ZV9ub3RpZmljYXRpb24ocHJpdi0+c2hyZCwgJmRpc2FibGVfd2FpdCk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKHByaXYsICZkaXNhYmxlX3dhaXQsIEhaKTsKKwkJcmV0ID0gaXdsX3dhaXRfbm90aWZpY2F0aW9uKHByaXYtPnNocmQsICZkaXNhYmxlX3dhaXQsIEhaKTsKIAkJaWYgKHJldCkKIAkJCUlXTF9FUlIocHJpdiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBQQU4gZGlzYWJsZVxuIik7CiAJfQpAQCAtMTE2LDcgKzExNyw3IEBACiAJaWYgKGN0eC0+aHQuZW5hYmxlZCkKIAkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzIHw9IFFPU19QQVJBTV9GTEdfVEdOX01TSzsKIAotCUlXTF9ERUJVR19RT1MocHJpdiwgInNlbmQgUW9TIGNtZCB3aXRoIFFvcyBhY3RpdmU9JWQgRkxBR1M9MHglWFxuIiwKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAic2VuZCBRb1MgY21kIHdpdGggUW9zIGFjdGl2ZT0lZCBGTEFHUz0weCVYXG4iLAogCQkgICAgICBjdHgtPnFvc19kYXRhLnFvc19hY3RpdmUsCiAJCSAgICAgIGN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyk7CiAKQEAgLTEyNCw3ICsxMjUsNyBAQAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZCksCiAJCQkgICAgICAgJmN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtKTsKIAlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gdXBkYXRlIFFvU1xuIik7CisJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwocHJpdiwgIkZhaWxlZCB0byB1cGRhdGUgUW9TXG4iKTsKIH0KIAogc3RhdGljIGludCBpd2xhZ25fdXBkYXRlX2JlYWNvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC0yOTUsOSArMjk2LDkgQEAKIAl9CiAKIAlpZiAoY3R4LT52aWYgJiYgY3R4LT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcyAmJiBwcml2LT5jZmctPmh0X3BhcmFtcy0+c21wc19tb2RlKQorCSAgICBjZmcocHJpdiktPmh0X3BhcmFtcyAmJiBjZmcocHJpdiktPmh0X3BhcmFtcy0+c21wc19tb2RlKQogCQlpZWVlODAyMTFfcmVxdWVzdF9zbXBzKGN0eC0+dmlmLAotCQkJCSAgICAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+c21wc19tb2RlKTsKKwkJCQkgICAgICAgY2ZnKHByaXYpLT5odF9wYXJhbXMtPnNtcHNfbW9kZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0NCw4ICs0NDUsOCBAQAogCSAqIGZvcmNlIENUUy10by1zZWxmIGZyYW1lcyBwcm90ZWN0aW9uIGlmIFJUUy1DVFMgaXMgbm90IHByZWZlcnJlZAogCSAqIG9uZSBhZ2dyZWdhdGlvbiBwcm90ZWN0aW9uIG1ldGhvZAogCSAqLwotCWlmICghKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCi0JICAgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSkKKwlpZiAoIShjZmcocHJpdiktPmh0X3BhcmFtcyAmJgorCSAgICAgIGNmZyhwcml2KS0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikpCiAJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TRUxGX0NUU19FTjsKIAogCWlmICgoY3R4LT52aWYgJiYgY3R4LT52aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KSB8fApAQCAtNTI4LDYgKzUyOSwyNCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGl3bGFnbl9jb25maWdfaHQ0MChzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7CisJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7CisJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOworCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisJfQorfQorCiBpbnQgaXdsYWduX21hY19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwpAQCAtNTQxLDYgKzU2MCw5IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiAKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCiAJaWYgKHVubGlrZWx5KHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnNocmQtPnN0YXR1cykpKSB7CiAJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBzY2FubmluZ1xuIik7CiAJCWdvdG8gb3V0OwpAQCAtNTg2LDE5ICs2MDgsMTEgQEAKIAkJCQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOwogCiAJCQlpZiAoY3R4LT5odC5lbmFibGVkKSB7Ci0JCQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgewotCQkJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjb25mX2lzX2h0NDBfcGx1cyhjb25mKSkgewotCQkJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCQkJCX0KKwkJCQkvKiBpZiBIVDQwIGlzIHVzZWQsIGl0IHNob3VsZCBub3QgY2hhbmdlCisJCQkJICogYWZ0ZXIgYXNzb2NpYXRlZCBleGNlcHQgY2hhbm5lbCBzd2l0Y2ggKi8KKwkJCQlpZiAoIWN0eC0+aHQuaXNfNDBtaHogfHwKKwkJCQkJCSFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKKwkJCQkJaXdsYWduX2NvbmZpZ19odDQwKGNvbmYsIGN0eCk7CiAJCQl9IGVsc2UKIAkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CiAKQEAgLTg0MCw3ICs4NTQsOCBAQAogCQkJaWYgKGN0eC0+bGFzdF90eF9yZWplY3RlZCkgewogCQkJCWN0eC0+bGFzdF90eF9yZWplY3RlZCA9IGZhbHNlOwogCQkJCWl3bF90cmFuc193YWtlX2FueV9xdWV1ZSh0cmFucyhwcml2KSwKLQkJCQkJCQkgY3R4LT5jdHhpZCk7CisJCQkJCQkJIGN0eC0+Y3R4aWQsCisJCQkJCQkJICJEaXNhc3NvYzogZmx1c2ggcXVldWUiKTsKIAkJCX0KIAkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXN0YS5jCmluZGV4IGVkNjI4MzYuLjczNTM4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1zdGEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMKQEAgLTEzMCwyNSArMTMwLDE1IEBACiAJcmV0dXJuIGl3bF9wcm9jZXNzX2FkZF9zdGFfcmVzcChwcml2LCBhZGRzdGEsIHBrdCk7CiB9CiAKLXN0YXRpYyB1MTYgaXdsYWduX2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqY21kLCB1OCAqZGF0YSkKLXsKLQl1MTYgc2l6ZSA9ICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2xfYWRkc3RhX2NtZCk7Ci0Jc3RydWN0IGl3bF9hZGRzdGFfY21kICphZGRzdGEgPSAoc3RydWN0IGl3bF9hZGRzdGFfY21kICopZGF0YTsKLQltZW1jcHkoYWRkc3RhLCBjbWQsIHNpemUpOwotCS8qIHJlc3J2ZWQgaW4gNTAwMCAqLwotCWFkZHN0YS0+cmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYoMCk7Ci0JcmV0dXJuIHNpemU7Ci19Ci0KIGludCBpd2xfc2VuZF9hZGRfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJICAgICBzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKnN0YSwgdTggZmxhZ3MpCiB7CiAJaW50IHJldCA9IDA7Ci0JdTggZGF0YVtzaXplb2YoKnN0YSldOwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9BRERfU1RBLAogCQkuZmxhZ3MgPSBmbGFncywKLQkJLmRhdGEgPSB7IGRhdGEsIH0sCisJCS5kYXRhID0geyBzdGEsIH0sCisJCS5sZW4gPSB7IHNpemVvZigqc3RhKSwgfSwKIAl9OwogCXU4IHN0YV9pZCBfX21heWJlX3VudXNlZCA9IHN0YS0+c3RhLnN0YV9pZDsKIApAQCAtMTYwLDcgKzE1MCw2IEBACiAJCW1pZ2h0X3NsZWVwKCk7CiAJfQogCi0JY21kLmxlblswXSA9IGl3bGFnbl9idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOwogCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7CiAKIAlpZiAocmV0IHx8IChmbGFncyAmIENNRF9BU1lOQykpCkBAIC00NjMsNiArNDUyLDcgQEAKIAkJICAgICAgIGNvbnN0IHU4ICphZGRyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdGlkOwogCiAJaWYgKCFpd2xfaXNfcmVhZHkocHJpdi0+c2hyZCkpIHsKIAkJSVdMX0RFQlVHX0lORk8ocHJpdiwKQEAgLTUwMSw2ICs0OTEsMTAgQEAKIAkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IE5VTEw7CiAJfQogCisJZm9yICh0aWQgPSAwOyB0aWQgPCBJV0xfTUFYX1RJRF9DT1VOVDsgdGlkKyspCisJCW1lbXNldCgmcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLCAwLAorCQkJc2l6ZW9mKHByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXSkpOworCiAJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JV0xfU1RBX0RSSVZFUl9BQ1RJVkU7CiAKIAlwcml2LT5udW1fc3RhdGlvbnMtLTsKQEAgLTY0Nyw3ICs2NDEsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IGl3bF9hZGRzdGFfY21kIHN0YV9jbWQ7CiAJc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kIGxxOwotCWJvb2wgYWN0aXZlOworCWJvb2wgYWN0aXZlLCBoYXZlX2xxID0gZmFsc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKIAlpZiAoIShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpKSB7CkBAIC02NTcsNyArNjUxLDEwIEBACiAKIAltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgc2l6ZW9mKHN0YV9jbWQpKTsKIAlzdGFfY21kLm1vZGUgPSAwOwotCW1lbWNweSgmbHEsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEsIHNpemVvZihscSkpOworCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKSB7CisJCW1lbWNweSgmbHEsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEsIHNpemVvZihscSkpOworCQloYXZlX2xxID0gdHJ1ZTsKKwl9CiAKIAlhY3RpdmUgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRTsKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfRFJJVkVSX0FDVElWRTsKQEAgLTY3OSw3ICs2NzYsOCBAQAogCWlmIChyZXQpCiAJCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byByZS1hZGQgU1RBICVwTSAoJWQpXG4iLAogCQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIsIHJldCk7Ci0JaXdsX3NlbmRfbHFfY21kKHByaXYsIGN0eCwgJmxxLCBDTURfU1lOQywgdHJ1ZSk7CisJaWYgKGhhdmVfbHEpCisJCWl3bF9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscSwgQ01EX1NZTkMsIHRydWUpOwogfQogCiBpbnQgaXdsX2dldF9mcmVlX3Vjb2RlX2tleV9vZmZzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQpAQCAtODI1LDI4ICs4MjMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpd2xhZ25fbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaW50IHJldDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHJlY2VpdmVkIHJlcXVlc3QgdG8gcmVtb3ZlICIKLQkJCSAgICJzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQlyZXQgPSBpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgc3RhX3ByaXYtPnN0YV9pZCwgc3RhLT5hZGRyKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJFcnJvciByZW1vdmluZyBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQogCiB2b2lkIGl3bF9zdGFfZmlsbF9scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCiAJCSAgICAgdTggc3RhX2lkLCBzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kKQpAQCAtMTI2OCw5ICsxMjQ0LDYgQEAKIAogCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQkJa2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCiAJCWlmIChzdGEpCiAJCQlhZGRyID0gc3RhLT5hZGRyOwogCQllbHNlIC8qIHN0YXRpb24gbW9kZSBjYXNlIG9ubHkgKi8KQEAgLTEyODMsOCArMTI1Niw2IEBACiAJCQkJCSAgc2VxLnRraXAuaXYzMiwgcDFrLCBDTURfU1lOQyk7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJa2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgogCQlyZXQgPSBpd2xhZ25fc2VuZF9zdGFfa2V5KHByaXYsIGtleWNvbmYsIHN0YV9pZCwKQEAgLTE0NjQsMjAgKzE0MzUsNyBAQAogCXJldHVybiBpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9zdGFfbW9kaWZ5X3BzX3dha2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzICY9IH5TVEFfRkxHX1BXUl9TQVZFX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzX21zayA9IFNUQV9GTEdfUFdSX1NBVkVfTVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IDA7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc2xlZXBfdHhfY291bnQgPSAwOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCWl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBDTURfQVNZTkMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLX0KIAogdm9pZCBpd2xfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCBjbnQpCiB7CkBAIC0xNDk0LDM2ICsxNDUyLDMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwogCiB9Ci0KLXZvaWQgaXdsYWduX21hY19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaW50IHN0YV9pZDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNUQV9OT1RJRllfU0xFRVA6Ci0JCVdBUk5fT04oIXN0YV9wcml2LT5jbGllbnQpOwotCQlzdGFfcHJpdi0+YXNsZWVwID0gdHJ1ZTsKLQkJaWYgKGF0b21pY19yZWFkKCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMpID4gMCkKLQkJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UoaHcsIHN0YSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBX05PVElGWV9BV0FLRToKLQkJV0FSTl9PTighc3RhX3ByaXYtPmNsaWVudCk7Ci0JCWlmICghc3RhX3ByaXYtPmFzbGVlcCkKLQkJCWJyZWFrOwotCQlzdGFfcHJpdi0+YXNsZWVwID0gZmFsc2U7Ci0JCXN0YV9pZCA9IGl3bF9zdGFfaWQoc3RhKTsKLQkJaWYgKHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJaXdsX3N0YV9tb2RpZnlfcHNfd2FrZShwcml2LCBzdGFfaWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCmluZGV4IGMyNzE4MGEuLmIwZGZmN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jCkBAIC02MzMsNyArNjMzLDcgQEAKIAlJTklUX1dPUksoJnByaXYtPmN0X2VudGVyLCBpd2xfYmdfY3RfZW50ZXIpOwogCUlOSVRfV09SSygmcHJpdi0+Y3RfZXhpdCwgaXdsX2JnX2N0X2V4aXQpOwogCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmFkdl90aGVybWFsX3Rocm90dGxlKSB7CisJaWYgKGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPmFkdl90aGVybWFsX3Rocm90dGxlKSB7CiAJCUlXTF9ERUJVR19URU1QKHByaXYsICJBZHZhbmNlZCBUaGVybWFsIFRocm90dGxpbmdcbiIpOwogCQl0dC0+cmVzdHJpY3Rpb24gPSBrY2FsbG9jKElXTF9USV9TVEFURV9NQVgsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd2xfdHRfcmVzdHJpY3Rpb24pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwppbmRleCAzNWE2YjcxLi5jNjY0YzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYwpAQCAtNzQsOCArNzQsOCBAQAogCWVsc2UgaWYgKGllZWU4MDIxMV9pc19iYWNrX3JlcShmYykpCiAJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQUNLX01TSyB8IFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLOwogCWVsc2UgaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWiAmJgotCQkgcHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkJIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0ICYmCisJCSBjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCQkgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKIAkJIChpZWVlODAyMTFfaXNfYXV0aChmYykgfHwgaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykgfHwKIAkJIGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykgfHwKIAkJIHNrYi0+cHJvdG9jb2wgPT0gY3B1X3RvX2JlMTYoRVRIX1BfUEFFKSkpCkBAIC05MSw3ICs5MSwxMCBAQAogCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwogCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKIAl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVEpCisJCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCQllbHNlCisJCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKIAl9CiAKIAlpd2xhZ25fdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7CkBAIC0xNDgsNyArMTUxLDcgQEAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CiAJCXR4X2NtZC0+aW5pdGlhbF9yYXRlX2luZGV4ID0gMDsKIAkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX1NUQV9SQVRFX01TSzsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RFU1RNT0RFCiAJCWlmIChwcml2LT50bV9maXhlZF9yYXRlKSB7CiAJCQkvKgogCQkJICogcmF0ZSBvdmVyd3JpdGUgYnkgdGVzdG1vZGUKQEAgLTE2MSw3ICsxNjQsOCBAQAogCQl9CiAjZW5kaWYKIAkJcmV0dXJuOwotCX0KKwl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19iYWNrX3JlcShmYykpCisJCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TVEFfUkFURV9NU0s7CiAKIAkvKioKIAkgKiBJZiB0aGUgY3VycmVudCBUWCByYXRlIHN0b3JlZCBpbiBtYWM4MDIxMSBoYXMgdGhlIE1DUyBiaXQgc2V0LCBpdCdzCkBAIC0xODcsOCArMTkxLDggQEAKIAkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOwogCiAJLyogU2V0IHVwIGFudGVubmFzICovCi0JIGlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKKwkgaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zICYmCisJICAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgogCSAgICAgcHJpdi0+YnRfZnVsbF9jb25jdXJyZW50KSB7CiAJCS8qIG9wZXJhdGVkIGFzIDF4MSBpbiBmdWxsIGNvbmN1cnJlbmN5IG1vZGUgKi8KIAkJcHJpdi0+bWdtdF90eF9hbnQgPSBpd2xfdG9nZ2xlX3R4X2FudChwcml2LCBwcml2LT5tZ210X3R4X2FudCwKQEAgLTI1OCw4ICsyNjIsOCBAQAogCiAJX19sZTE2IGZjOwogCXU4IGhkcl9sZW47Ci0JdTE2IGxlbjsKLQl1OCBzdGFfaWQ7CisJdTE2IGxlbiwgc2VxX251bWJlciA9IDA7CisJdTggc3RhX2lkLCB0aWQgPSBJV0xfTUFYX1RJRF9DT1VOVDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgaXNfYWdnID0gZmFsc2U7CiAKQEAgLTI4Myw2ICsyODcsMTkgQEAKIAkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOwogI2VuZGlmCiAKKwlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKSkgeworCQlzdHJ1Y3QgaXdsX3dpcGFuX25vYV9kYXRhICpub2FfZGF0YSA9CisJCQlyY3VfZGVyZWZlcmVuY2UocHJpdi0+bm9hX2RhdGEpOworCisJCWlmIChub2FfZGF0YSAmJgorCQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIG5vYV9kYXRhLT5sZW5ndGgsCisJCQkJICAgICBHRlBfQVRPTUlDKSA9PSAwKSB7CisJCQltZW1jcHkoc2tiX3B1dChza2IsIG5vYV9kYXRhLT5sZW5ndGgpLAorCQkJICAgICAgIG5vYV9kYXRhLT5kYXRhLCBub2FfZGF0YS0+bGVuZ3RoKTsKKwkJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwkJfQorCX0KKwogCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKIAogCS8qIEZvciBtYW5hZ2VtZW50IGZyYW1lcyB1c2UgYnJvYWRjYXN0IGlkIHRvIGRvIG5vdCBicmVhayBhZ2dyZWdhdGlvbiAqLwpAQCAtMzUxLDkgKzM2OCw1MSBAQAogCWluZm8tPmRyaXZlcl9kYXRhWzBdID0gY3R4OwogCWluZm8tPmRyaXZlcl9kYXRhWzFdID0gZGV2X2NtZDsKIAotCWlmIChpd2xfdHJhbnNfdHgodHJhbnMocHJpdiksIHNrYiwgZGV2X2NtZCwgY3R4LT5jdHhpZCwgc3RhX2lkKSkKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSAmJiAhaWVlZTgwMjExX2lzX3Fvc19udWxsZnVuYyhmYykpIHsKKwkJdTggKnFjID0gTlVMTDsKKwkJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CisJCWlmIChXQVJOX09OX09OQ0UodGlkID49IElXTF9NQVhfVElEX0NPVU5UKSkKKwkJCWdvdG8gZHJvcF91bmxvY2tfc3RhOworCQl0aWRfZGF0YSA9ICZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF07CisKKwkJLyogYWdncmVnYXRpb24gaXMgb24gZm9yIHRoaXMgPHN0YSx0aWQ+ICovCisJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgJiYKKwkJICAgIHRpZF9kYXRhLT5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PTikgeworCQkJSVdMX0VSUihwcml2LCAiVFhfQ1RMX0FNUERVIHdoaWxlIG5vdCBpbiBBR0c6IgorCQkJCSIgVHggZmxhZ3MgPSAweCUwOHgsIGFnZy5zdGF0ZSA9ICVkIiwKKwkJCQlpbmZvLT5mbGFncywgdGlkX2RhdGEtPmFnZy5zdGF0ZSk7CisJCQlJV0xfRVJSKHByaXYsICJzdGFfaWQgPSAlZCwgdGlkID0gJWQgc2VxX251bSA9ICVkIiwKKwkJCQlzdGFfaWQsIHRpZCwgU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKSk7CisJCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKKwkJfQorCisJCS8qIFdlIGNhbiByZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgc3RhY2sgaW4gSVdMX0FHR197T04sT0ZGfQorCQkgKiBvbmx5LiBDaGVjayB0aGlzIGhlcmUuCisJCSAqLworCQlpZiAoV0FSTl9PTkNFKHRpZF9kYXRhLT5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PTiAmJgorCQkgICAgdGlkX2RhdGEtPmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09GRiwKKwkJICAgICJUeCB3aGlsZSBhZ2cuc3RhdGUgPSAlZCIsIHRpZF9kYXRhLT5hZ2cuc3RhdGUpKQorCQkJZ290byBkcm9wX3VubG9ja19zdGE7CisKKwkJc2VxX251bWJlciA9IHRpZF9kYXRhLT5zZXFfbnVtYmVyOworCQlzZXFfbnVtYmVyICY9IElFRUU4MDIxMV9TQ1RMX1NFUTsKKwkJaGRyLT5zZXFfY3RybCAmPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU0NUTF9GUkFHKTsKKwkJaGRyLT5zZXFfY3RybCB8PSBjcHVfdG9fbGUxNihzZXFfbnVtYmVyKTsKKwkJc2VxX251bWJlciArPSAweDEwOworCX0KKworCS8qIENvcHkgTUFDIGhlYWRlciBmcm9tIHNrYiBpbnRvIGNvbW1hbmQgYnVmZmVyICovCisJbWVtY3B5KHR4X2NtZC0+aGRyLCBoZHIsIGhkcl9sZW4pOworCisJaWYgKGl3bF90cmFuc190eCh0cmFucyhwcml2KSwgc2tiLCBkZXZfY21kLCBjdHgtPmN0eGlkLCBzdGFfaWQsIHRpZCkpCiAJCWdvdG8gZHJvcF91bmxvY2tfc3RhOwogCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykgJiYgIWllZWU4MDIxMV9pc19xb3NfbnVsbGZ1bmMoZmMpICYmCisJICAgICFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCXByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5zZXFfbnVtYmVyID0gc2VxX251bWJlcjsKKwogCXNwaW5fdW5sb2NrKCZwcml2LT5zaHJkLT5zdGFfbG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOwogCkBAIC0zNzgsMTAgKzQzNyw4MSBAQAogCXJldHVybiAtMTsKIH0KIAoraW50IGl3bGFnbl90eF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKQoreworCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YV9pZDsKKworCXN0YV9pZCA9IGl3bF9zdGFfaWQoc3RhKTsKKworCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgeworCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHN0YXRpb24gZm9yIEFHRyB0aWQgJWRcbiIsIHRpZCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisKKwl0aWRfZGF0YSA9ICZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF07CisKKwlzd2l0Y2ggKHByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUpIHsKKwljYXNlIElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQToKKwkJLyoKKwkJKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBlZXIgc3RvcHMgYWdncmVnYXRpb24KKwkJKiBhZ2FpbiBiZWZvcmUgd2UndmUgaGFkIGEgY2hhbmNlIHRvIGRyYWluIHRoZQorCQkqIHF1ZXVlIHdlIHNlbGVjdGVkIHByZXZpb3VzbHksIGkuZS4gYmVmb3JlIHRoZQorCQkqIHNlc3Npb24gd2FzIHJlYWxseSBzdGFydGVkIGNvbXBsZXRlbHkuCisJCSovCisJCUlXTF9ERUJVR19IVChwcml2LCAiQUdHIHN0b3AgYmVmb3JlIHNldHVwIGRvbmVcbiIpOworCQlnb3RvIHR1cm5fb2ZmOworCWNhc2UgSVdMX0FHR19PTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVdMX1dBUk4ocHJpdiwgIlN0b3BwaW5nIEFHRyB3aGlsZSBzdGF0ZSBub3QgT04gIgorCQkJICJvciBzdGFydGluZyBmb3IgJWQgb24gJWQgKCVkKVxuIiwgc3RhX2lkLCB0aWQsCisJCQkgcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXRpZF9kYXRhLT5hZ2cuc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKKworCS8qIFRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGZvciB0aGlzIFJBIC8gVElEIGluIHRoZSBIVyAqLworCWlmICh0aWRfZGF0YS0+YWdnLnNzbiAhPSB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiQ2FuJ3QgcHJvY2VlZDogc3NuICVkLCAiCisJCQkJICAgICJuZXh0X3JlY2wgPSAlZCIsCisJCQkJICAgIHRpZF9kYXRhLT5hZ2cuc3NuLAorCQkJCSAgICB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOworCQlwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlID0KKwkJCUlXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiQ2FuIHByb2NlZWQ6IHNzbiA9IG5leHRfcmVjbCA9ICVkIiwKKwkJCSAgICB0aWRfZGF0YS0+YWdnLnNzbik7Cit0dXJuX29mZjoKKwlwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlID0gSVdMX0FHR19PRkY7CisKKwkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KKwlzcGluX3VubG9jaygmcHJpdi0+c2hyZC0+c3RhX2xvY2spOworCXNwaW5fbG9jaygmcHJpdi0+c2hyZC0+bG9jayk7CisKKwlpd2xfdHJhbnNfdHhfYWdnX2Rpc2FibGUodHJhbnMocHJpdiksIHN0YV9pZCwgdGlkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKKworCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGl3bGFnbl90eF9hZ2dfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24pCiB7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc3RhX2lkOwogCWludCByZXQ7CiAKQEAgLTM5Niw3ICs1MjYsNyBAQAogCWlmICh1bmxpa2VseSh0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwcml2LT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlICE9IElXTF9BR0dfT0ZGKSB7CisJaWYgKHByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PRkYpIHsKIAkJSVdMX0VSUihwcml2LCAiU3RhcnQgQUdHIHdoZW4gc3RhdGUgaXMgbm90IElXTF9BR0dfT0ZGICFcbiIpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTQwNSwyNyArNTM1LDEzNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpd2xfdHJhbnNfdHhfYWdnX2FsbG9jKHRyYW5zKHByaXYpLCB2aWZfcHJpdi0+Y3R4LT5jdHhpZCwgc3RhX2lkLAotCQkJCSAgICAgdGlkLCBzc24pOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCisJdGlkX2RhdGEgPSAmcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOworCXRpZF9kYXRhLT5hZ2cuc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKKworCSpzc24gPSB0aWRfZGF0YS0+YWdnLnNzbjsKKworCXJldCA9IGl3bF90cmFuc190eF9hZ2dfYWxsb2ModHJhbnMocHJpdiksIHN0YV9pZCwgdGlkKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCpzc24gPT0gdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKSB7CisJCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwgIkNhbiBwcm9jZWVkOiBzc24gPSBuZXh0X3JlY2wgPSAlZCIsCisJCQkJICAgIHRpZF9kYXRhLT5hZ2cuc3NuKTsKKwkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047CisJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCX0gZWxzZSB7CisJCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwgIkNhbid0IHByb2NlZWQ6IHNzbiAlZCwgIgorCQkJCSAgICAibmV4dF9yZWNsYWltZWQgPSAlZCIsCisJCQkJICAgIHRpZF9kYXRhLT5hZ2cuc3NuLAorCQkJCSAgICB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaXdsYWduX3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpCitpbnQgaXdsYWduX3R4X2FnZ19vcGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHU4IGJ1Zl9zaXplKQogewotCWludCBzdGFfaWQ7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgc3NuOwogCi0Jc3RhX2lkID0gaXdsX3N0YV9pZChzdGEpOworCWJ1Zl9zaXplID0gbWluX3QoaW50LCBidWZfc2l6ZSwgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUYpOwogCi0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKLQkJcmV0dXJuIC1FTlhJTzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzc24gPSBwcml2LT50aWRfZGF0YVtzdGFfcHJpdi0+c3RhX2lkXVt0aWRdLmFnZy5zc247CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWl3bF90cmFuc190eF9hZ2dfc2V0dXAodHJhbnMocHJpdiksIGN0eC0+Y3R4aWQsIHN0YV9wcml2LT5zdGFfaWQsIHRpZCwKKwkJCSAgICAgICBidWZfc2l6ZSwgc3NuKTsKKworCS8qCisJICogSWYgdGhlIGxpbWl0IGlzIDAsIHRoZW4gaXQgd2Fzbid0IGluaXRpYWxpc2VkIHlldCwKKwkgKiB1c2UgdGhlIGRlZmF1bHQuIFdlIGNhbiBkbyB0aGF0IHNpbmNlIHdlIHRha2UgdGhlCisJICogbWluaW11bSBiZWxvdywgYW5kIHdlIGRvbid0IHdhbnQgdG8gZ28gYWJvdmUgb3VyCisJICogZGVmYXVsdCBkdWUgdG8gaGFyZHdhcmUgcmVzdHJpY3Rpb25zLgorCSAqLworCWlmIChzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID09IDApCisJCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUgPQorCQkJTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUY7CisKKwkvKgorCSAqIEV2ZW4gdGhvdWdoIGluIHRoZW9yeSB0aGUgcGVlciBjb3VsZCBoYXZlIGRpZmZlcmVudAorCSAqIGFnZ3JlZ2F0aW9uIHJlb3JkZXIgYnVmZmVyIHNpemVzIGZvciBkaWZmZXJlbnQgc2Vzc2lvbnMsCisJICogb3VyIHVjb2RlIGRvZXNuJ3QgYWxsb3cgZm9yIHRoYXQgYW5kIGhhcyBhIGdsb2JhbCBsaW1pdAorCSAqIGZvciBlYWNoIHN0YXRpb24uIFRoZXJlZm9yZSwgdXNlIHRoZSBtaW5pbXVtIG9mIGFsbCB0aGUKKwkgKiBhZ2dyZWdhdGlvbiBzZXNzaW9ucyBhbmQgb3VyIGRlZmF1bHQgdmFsdWUuCisJICovCisJc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9CisJCW1pbihzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplLCBidWZfc2l6ZSk7CisKKwlpZiAoY2ZnKHByaXYpLT5odF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSB7CisJCS8qCisJCSAqIHN3aXRjaCB0byBSVFMvQ1RTIGlmIGl0IGlzIHRoZSBwcmVmZXIgcHJvdGVjdGlvbgorCQkgKiBtZXRob2QgZm9yIEhUIHRyYWZmaWMKKwkJICovCisKKwkJc3RhX3ByaXYtPmxxX3N0YS5scS5nZW5lcmFsX3BhcmFtcy5mbGFncyB8PQorCQkJTElOS19RVUFMX0ZMQUdTX1NFVF9TVEFfVExDX1JUU19NU0s7CiAJfQorCXByaXYtPmFnZ190aWRzX2NvdW50Kys7CisJSVdMX0RFQlVHX0hUKHByaXYsICJwcml2LT5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAorCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKIAotCXJldHVybiBpd2xfdHJhbnNfdHhfYWdnX2Rpc2FibGUodHJhbnMocHJpdiksIHZpZl9wcml2LT5jdHgtPmN0eGlkLAotCQkJCQlzdGFfaWQsIHRpZCk7CisJc3RhX3ByaXYtPmxxX3N0YS5scS5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPQorCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplOworCisJSVdMX0lORk8ocHJpdiwgIlR4IGFnZ3JlZ2F0aW9uIGVuYWJsZWQgb24gcmEgPSAlcE0gdGlkID0gJWRcbiIsCisJCSBzdGEtPmFkZHIsIHRpZCk7CisKKwlyZXR1cm4gaXdsX3NlbmRfbHFfY21kKHByaXYsIGN0eCwKKwkJCSZzdGFfcHJpdi0+bHFfc3RhLmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX2NoZWNrX3JhdGlkX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgdTggdGlkKQoreworCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKKwllbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJdTggKmFkZHI7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5zdGFfbG9jayk7CisKKwlhZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7CisJY3R4ID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5jdHhpZDsKKwl2aWYgPSBwcml2LT5jb250ZXh0c1tjdHhdLnZpZjsKKworCXN3aXRjaCAocHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSkgeworCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgorCQkvKiBUaGVyZSBhcmUgbm8gcGFja2V0cyBmb3IgdGhpcyBSQSAvIFRJRCBpbiB0aGUgSFcgYW55IG1vcmUgKi8KKwkJaWYgKHRpZF9kYXRhLT5hZ2cuc3NuID09IHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCkgeworCQkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LAorCQkJCSJDYW4gY29udGludWUgREVMQkEgZmxvdyBzc24gPSBuZXh0X3JlY2wgPSIKKwkJCQkiICVkIiwgdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKTsKKwkJCWl3bF90cmFuc190eF9hZ2dfZGlzYWJsZSh0cmFucyhwcml2KSwgc3RhX2lkLCB0aWQpOworCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT0ZGOworCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6CisJCS8qIFRoZXJlIGFyZSBubyBwYWNrZXRzIGZvciB0aGlzIFJBIC8gVElEIGluIHRoZSBIVyBhbnkgbW9yZSAqLworCQlpZiAodGlkX2RhdGEtPmFnZy5zc24gPT0gdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsCisJCQkJIkNhbiBjb250aW51ZSBBRERCQSBmbG93IHNzbiA9IG5leHRfcmVjbCA9IgorCQkJCSIgJWQiLCB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOworCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047CisJCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogfQogCiBzdGF0aWMgdm9pZCBpd2xhZ25fbm9uX2FnZ190eF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtNTY1LDcgKzgwNCw3IEBACiAJCUlXTEFHTl9UWF9SRVNfVElEX1BPUzsKIAlpbnQgc3RhX2lkID0gKHR4X3Jlc3AtPnJhX3RpZCAmIElXTEFHTl9UWF9SRVNfUkFfTVNLKSA+PgogCQlJV0xBR05fVFhfUkVTX1JBX1BPUzsKLQlzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnID0gJnByaXYtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2c7CisJc3RydWN0IGl3bF9odF9hZ2cgKmFnZyA9ICZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnOwogCXUzMiBzdGF0dXMgPSBsZTE2X3RvX2NwdSh0eF9yZXNwLT5zdGF0dXMuc3RhdHVzKTsKIAlpbnQgaTsKIApAQCAtNTgxLDggKzgyMCw4IEBACiAJICogbm90aWZpY2F0aW9uIGFnYWluLgogCSAqLwogCWlmICh0eF9yZXNwLT5idF9raWxsX2NvdW50ICYmIHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJSVdMX0RFQlVHX0NPRVgocHJpdiwgInJlY2VpdmUgcmVwbHkgdHggdy8gYnRfa2lsbFxuIik7CiAJfQogCkBAIC03NTUsNyArOTk0LDcgQEAKIAlzdHJ1Y3QgaXdsYWduX3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJdTMyIHN0YXR1cyA9IGxlMTZfdG9fY3B1KHR4X3Jlc3AtPnN0YXR1cy5zdGF0dXMpOwotCXUzMiBzc24gPSBpd2xhZ25fZ2V0X3NjZF9zc24odHhfcmVzcCk7CisJdTE2IHNzbiA9IGl3bGFnbl9nZXRfc2NkX3Nzbih0eF9yZXNwKTsKIAlpbnQgdGlkOwogCWludCBzdGFfaWQ7CiAJaW50IGZyZWVkOwpAQCAtNzc3LDEwICsxMDE2LDM0IEBACiAJCWl3bF9yeF9yZXBseV90eF9hZ2cocHJpdiwgdHhfcmVzcCk7CiAKIAlpZiAodHhfcmVzcC0+ZnJhbWVfY291bnQgPT0gMSkgeworCQl1MTYgbmV4dF9yZWNsYWltZWQgPSBsZTE2X3RvX2NwdSh0eF9yZXNwLT5zZXFfY3RsKTsKKwkJbmV4dF9yZWNsYWltZWQgPSBTRVFfVE9fU04obmV4dF9yZWNsYWltZWQgKyAweDEwKTsKKworCQlpZiAoaXNfYWdnKSB7CisJCQkvKiBJZiB0aGlzIGlzIGFuIGFnZ3JlZ2F0aW9uIHF1ZXVlLCB3ZSBjYW4gcmVseSBvbiB0aGUKKwkJCSAqIHNzbiBzaW5jZSB0aGUgd2lmaSBzZXF1ZW5jZSBudW1iZXIgY29ycmVzcG9uZHMgdG8KKwkJCSAqIHRoZSBpbmRleCBpbiB0aGUgVEZEIHJpbmcgKCUyNTYpLgorCQkJICogVGhlIHNlcV9jdGwgaXMgdGhlIHNlcXVlbmNlIGNvbnRyb2wgb2YgdGhlIHBhY2tldAorCQkJICogdG8gd2hpY2ggdGhpcyBUeCByZXNwb25zZSByZWxhdGVzLiBCdXQgaWYgdGhlcmUgaXMgYQorCQkJICogaG9sZSBpbiB0aGUgYml0bWFwIG9mIHRoZSBCQSB3ZSByZWNlaXZlZCwgdGhpcyBUeAorCQkJICogcmVzcG9uc2UgbWF5IGFsbG93IHRvIHJlY2xhaW0gdGhlIGhvbGUgYW5kIGFsbCB0aGUKKwkJCSAqIHN1YnNlcXVlbnQgcGFja2V0cyB0aGF0IHdlcmUgYWxyZWFkeSBhY2tlZC4KKwkJCSAqIEluIHRoYXQgY2FzZSwgc2VxX2N0bCAhPSBzc24sIGFuZCB0aGUgbmV4dCBwYWNrZXQKKwkJCSAqIHRvIGJlIHJlY2xhaW1lZCB3aWxsIGJlIHNzbiBhbmQgbm90IHNlcV9jdGwuCisJCQkgKi8KKwkJCW5leHRfcmVjbGFpbWVkID0gc3NuOworCQl9CisKIAkJX19za2JfcXVldWVfaGVhZF9pbml0KCZza2JzKTsKKwkJcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLm5leHRfcmVjbGFpbWVkID0gbmV4dF9yZWNsYWltZWQ7CisKKwkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJOZXh0IHJlY2xhaW1lZCBwYWNrZXQ6JWQiLAorCQkJCQkgIG5leHRfcmVjbGFpbWVkKTsKKwogCQkvKndlIGNhbiBmcmVlIHVudGlsIHNzbiAlIHEubl9iZCBub3QgaW5jbHVzaXZlICovCi0JCWl3bF90cmFuc19yZWNsYWltKHRyYW5zKHByaXYpLCBzdGFfaWQsIHRpZCwgdHhxX2lkLAotCQkJCSAgc3NuLCBzdGF0dXMsICZza2JzKTsKKwkJV0FSTl9PTihpd2xfdHJhbnNfcmVjbGFpbSh0cmFucyhwcml2KSwgc3RhX2lkLCB0aWQsIHR4cV9pZCwKKwkJCQkgIHNzbiwgc3RhdHVzLCAmc2ticykpOworCQlpd2xhZ25fY2hlY2tfcmF0aWRfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQpOwogCQlmcmVlZCA9IDA7CiAJCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZza2JzKSkgewogCQkJc2tiID0gX19za2JfZGVxdWV1ZSgmc2ticyk7CkBAIC04MDAsNyArMTA2Myw4IEBACiAJCQkgICAgaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkgJiYgY3R4LT52aWYgJiYKIAkJCSAgICBjdHgtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CiAJCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gdHJ1ZTsKLQkJCQlpd2xfdHJhbnNfc3RvcF9xdWV1ZSh0cmFucyhwcml2KSwgdHhxX2lkKTsKKwkJCQlpd2xfdHJhbnNfc3RvcF9xdWV1ZSh0cmFucyhwcml2KSwgdHhxX2lkLAorCQkJCQkiVHggb24gcGFzc2l2ZSBjaGFubmVsIik7CiAKIAkJCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKIAkJCQkJICAgIlRYUSAlZCBzdGF0dXMgJXMgKDB4JTA4eCkgIgpAQCAtODc0LDI0ICsxMTM4LDEwIEBACiAKIAlzdGFfaWQgPSBiYV9yZXNwLT5zdGFfaWQ7CiAJdGlkID0gYmFfcmVzcC0+dGlkOwotCWFnZyA9ICZwcml2LT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnOworCWFnZyA9ICZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CiAKLQlpZiAodW5saWtlbHkoYWdnLT50eHFfaWQgIT0gc2NkX2Zsb3cpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAotCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdyEKLQkJICogc2luY2UgaXQgaXMgcG9zc2libGUgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCi0JCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IGVuYWJsZSB0aGUgbG9nZ2luZyBieSBkZWZhdWx0Ci0JCSAqLwotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKLQkJCSJCQSBzY2RfZmxvdyAlZCBkb2VzIG5vdCBtYXRjaCB0eHFfaWQgJWRcbiIsCi0JCQlzY2RfZmxvdywgYWdnLT50eHFfaWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlpZiAodW5saWtlbHkoIWFnZy0+d2FpdF9mb3JfYmEpKSB7CiAJCWlmICh1bmxpa2VseShiYV9yZXNwLT5iaXRtYXApKQogCQkJSVdMX0VSUihwcml2LCAiUmVjZWl2ZWQgQkEgd2hlbiBub3QgZXhwZWN0ZWRcbiIpOwpAQCAtODk5LDYgKzExNDksMTcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJX19za2JfcXVldWVfaGVhZF9pbml0KCZyZWNsYWltZWRfc2ticyk7CisKKwkvKiBSZWxlYXNlIGFsbCBURkRzIGJlZm9yZSB0aGUgU1NOLCBpLmUuIGFsbCBURkRzIGluIGZyb250IG9mCisJICogYmxvY2stYWNrIHdpbmRvdyAod2UgYXNzdW1lIHRoYXQgdGhleSd2ZSBiZWVuIHN1Y2Nlc3NmdWxseQorCSAqIHRyYW5zbWl0dGVkIC4uLiBpZiBub3QsIGl0J3MgdG9vIGxhdGUgYW55d2F5KS4gKi8KKwlpZiAoaXdsX3RyYW5zX3JlY2xhaW0odHJhbnMocHJpdiksIHN0YV9pZCwgdGlkLCBzY2RfZmxvdywKKwkJCSAgICAgIGJhX3Jlc3Bfc2NkX3NzbiwgMCwgJnJlY2xhaW1lZF9za2JzKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKIAlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIlJFUExZX0NPTVBSRVNTRURfQkEgWyVkXSBSZWNlaXZlZCBmcm9tICVwTSwgIgogCQkJICAgInN0YV9pZCA9ICVkXG4iLAogCQkJICAgYWdnLT53YWl0X2Zvcl9iYSwKQEAgLTkwNiwxMSArMTE2Nyw5IEBACiAJCQkgICBiYV9yZXNwLT5zdGFfaWQpOwogCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsICIKIAkJCSAgICJzY2RfZmxvdyA9ICVkLCBzY2Rfc3NuID0gJWRcbiIsCi0JCQkgICBiYV9yZXNwLT50aWQsCi0JCQkgICBiYV9yZXNwLT5zZXFfY3RsLAorCQkJICAgYmFfcmVzcC0+dGlkLCBsZTE2X3RvX2NwdShiYV9yZXNwLT5zZXFfY3RsKSwKIAkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfcmVzcC0+Yml0bWFwKSwKLQkJCSAgIGJhX3Jlc3AtPnNjZF9mbG93LAotCQkJICAgYmFfcmVzcC0+c2NkX3Nzbik7CisJCQkgICBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuKTsKIAogCS8qIE1hcmsgdGhhdCB0aGUgZXhwZWN0ZWQgYmxvY2stYWNrIHJlc3BvbnNlIGFycml2ZWQgKi8KIAlhZ2ctPndhaXRfZm9yX2JhID0gZmFsc2U7CkBAIC05MjksMTMgKzExODgsOSBAQAogCUlXTF9ERUJVR19IVChwcml2LCAiYWdnIGZyYW1lcyBzZW50OiVkLCBhY2tlZDolZFxuIiwKIAkJCWJhX3Jlc3AtPnR4ZWQsIGJhX3Jlc3AtPnR4ZWRfMl9kb25lKTsKIAotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcmVjbGFpbWVkX3NrYnMpOworCXByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5uZXh0X3JlY2xhaW1lZCA9IGJhX3Jlc3Bfc2NkX3NzbjsKIAotCS8qIFJlbGVhc2UgYWxsIFRGRHMgYmVmb3JlIHRoZSBTU04sIGkuZS4gYWxsIFRGRHMgaW4gZnJvbnQgb2YKLQkgKiBibG9jay1hY2sgd2luZG93ICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5Ci0JICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLiAqLwotCWl3bF90cmFuc19yZWNsYWltKHRyYW5zKHByaXYpLCBzdGFfaWQsIHRpZCwgc2NkX2Zsb3csIGJhX3Jlc3Bfc2NkX3NzbiwKLQkJCSAgMCwgJnJlY2xhaW1lZF9za2JzKTsKKwlpd2xhZ25fY2hlY2tfcmF0aWRfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQpOwogCWZyZWVkID0gMDsKIAl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmcmVjbGFpbWVkX3NrYnMpKSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi11Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTBkZDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1hZ24taHcuaCIKLSNpbmNsdWRlICJpd2wtYWduLmgiCi0jaW5jbHVkZSAiaXdsLWFnbi1jYWxpYi5oIgotI2luY2x1ZGUgIml3bC10cmFucy5oIgotI2luY2x1ZGUgIml3bC1maC5oIgotCi1zdGF0aWMgc3RydWN0IGl3bF93aW1heF9jb2V4X2V2ZW50X2VudHJ5IGN1X3ByaW9yaXRpZXNbQ09FWF9OVU1fT0ZfRVZFTlRTXSA9IHsKLQl7Q09FWF9DVV9VTkFTU09DX0lETEVfUlAsIENPRVhfQ1VfVU5BU1NPQ19JRExFX1dQLAotCSAwLCBDT0VYX1VOQVNTT0NfSURMRV9GTEFHU30sCi0Je0NPRVhfQ1VfVU5BU1NPQ19NQU5VQUxfU0NBTl9SUCwgQ09FWF9DVV9VTkFTU09DX01BTlVBTF9TQ0FOX1dQLAotCSAwLCBDT0VYX1VOQVNTT0NfTUFOVUFMX1NDQU5fRkxBR1N9LAotCXtDT0VYX0NVX1VOQVNTT0NfQVVUT19TQ0FOX1JQLCBDT0VYX0NVX1VOQVNTT0NfQVVUT19TQ0FOX1dQLAotCSAwLCBDT0VYX1VOQVNTT0NfQVVUT19TQ0FOX0ZMQUdTfSwKLQl7Q09FWF9DVV9DQUxJQlJBVElPTl9SUCwgQ09FWF9DVV9DQUxJQlJBVElPTl9XUCwKLQkgMCwgQ09FWF9DQUxJQlJBVElPTl9GTEFHU30sCi0Je0NPRVhfQ1VfUEVSSU9ESUNfQ0FMSUJSQVRJT05fUlAsIENPRVhfQ1VfUEVSSU9ESUNfQ0FMSUJSQVRJT05fV1AsCi0JIDAsIENPRVhfUEVSSU9ESUNfQ0FMSUJSQVRJT05fRkxBR1N9LAotCXtDT0VYX0NVX0NPTk5FQ1RJT05fRVNUQUJfUlAsIENPRVhfQ1VfQ09OTkVDVElPTl9FU1RBQl9XUCwKLQkgMCwgQ09FWF9DT05ORUNUSU9OX0VTVEFCX0ZMQUdTfSwKLQl7Q09FWF9DVV9BU1NPQ0lBVEVEX0lETEVfUlAsIENPRVhfQ1VfQVNTT0NJQVRFRF9JRExFX1dQLAotCSAwLCBDT0VYX0FTU09DSUFURURfSURMRV9GTEFHU30sCi0Je0NPRVhfQ1VfQVNTT0NfTUFOVUFMX1NDQU5fUlAsIENPRVhfQ1VfQVNTT0NfTUFOVUFMX1NDQU5fV1AsCi0JIDAsIENPRVhfQVNTT0NfTUFOVUFMX1NDQU5fRkxBR1N9LAotCXtDT0VYX0NVX0FTU09DX0FVVE9fU0NBTl9SUCwgQ09FWF9DVV9BU1NPQ19BVVRPX1NDQU5fV1AsCi0JIDAsIENPRVhfQVNTT0NfQVVUT19TQ0FOX0ZMQUdTfSwKLQl7Q09FWF9DVV9BU1NPQ19BQ1RJVkVfTEVWRUxfUlAsIENPRVhfQ1VfQVNTT0NfQUNUSVZFX0xFVkVMX1dQLAotCSAwLCBDT0VYX0FTU09DX0FDVElWRV9MRVZFTF9GTEFHU30sCi0Je0NPRVhfQ1VfUkZfT05fUlAsIENPRVhfQ1VfUkZfT05fV1AsIDAsIENPRVhfQ1VfUkZfT05fRkxBR1N9LAotCXtDT0VYX0NVX1JGX09GRl9SUCwgQ09FWF9DVV9SRl9PRkZfV1AsIDAsIENPRVhfUkZfT0ZGX0ZMQUdTfSwKLQl7Q09FWF9DVV9TVEFORF9BTE9ORV9ERUJVR19SUCwgQ09FWF9DVV9TVEFORF9BTE9ORV9ERUJVR19XUCwKLQkgMCwgQ09FWF9TVEFORF9BTE9ORV9ERUJVR19GTEFHU30sCi0Je0NPRVhfQ1VfSVBBTl9BU1NPQ19MRVZFTF9SUCwgQ09FWF9DVV9JUEFOX0FTU09DX0xFVkVMX1dQLAotCSAwLCBDT0VYX0lQQU5fQVNTT0NfTEVWRUxfRkxBR1N9LAotCXtDT0VYX0NVX1JTUlZEMV9SUCwgQ09FWF9DVV9SU1JWRDFfV1AsIDAsIENPRVhfUlNSVkQxX0ZMQUdTfSwKLQl7Q09FWF9DVV9SU1JWRDJfUlAsIENPRVhfQ1VfUlNSVkQyX1dQLCAwLCBDT0VYX1JTUlZEMl9GTEFHU30KLX07Ci0KLS8qCi0gKiB1Y29kZQotICovCi1zdGF0aWMgaW50IGl3bGFnbl9sb2FkX3NlY3Rpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCXN0cnVjdCBmd19kZXNjICppbWFnZSwgdTMyIGRzdF9hZGRyKQotewotCWRtYV9hZGRyX3QgcGh5X2FkZHIgPSBpbWFnZS0+cF9hZGRyOwotCXUzMiBieXRlX2NudCA9IGltYWdlLT5sZW47Ci0JaW50IHJldDsKLQotCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMDsKLQotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCi0JCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKEZIX1NSVkNfQ0hOTCksCi0JCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UpOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfU1JWQ19DSE5MX1NSQU1fQUREUl9SRUcoRkhfU1JWQ19DSE5MKSwgZHN0X2FkZHIpOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfVEZESUJfQ1RSTDBfUkVHKEZIX1NSVkNfQ0hOTCksCi0JCXBoeV9hZGRyICYgRkhfTUVNX1RGRElCX0RSQU1fQUREUl9MU0JfTVNLKTsKLQotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCi0JCUZIX1RGRElCX0NUUkwxX1JFRyhGSF9TUlZDX0NITkwpLAotCQkoaXdsX2dldF9kbWFfaGlfYWRkcihwaHlfYWRkcikKLQkJCTw8IEZIX01FTV9URkRJQl9SRUcxX0FERFJfQklUU0hJRlQpIHwgYnl0ZV9jbnQpOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKEZIX1NSVkNfQ0hOTCksCi0JCTEgPDwgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9OVU0gfAotCQkxIDw8IEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfSURYIHwKLQkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1ZBTElEKTsKLQotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksCi0JCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKEZIX1NSVkNfQ0hOTCksCi0JCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCXwKLQkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJfAotCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9FTkRURkQpOwotCi0JSVdMX0RFQlVHX0ZXKHByaXYsICIlcyB1Q29kZSBzZWN0aW9uIGJlaW5nIGxvYWRlZC4uLlxuIiwgbmFtZSk7Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHByaXYtPnNocmQtPndhaXRfY29tbWFuZF9xdWV1ZSwKLQkJCQkgcHJpdi0+dWNvZGVfd3JpdGVfY29tcGxldGUsIDUgKiBIWik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGxvYWQgdGhlICVzIHVDb2RlIHNlY3Rpb25cbiIsCi0JCQluYW1lKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX2xvYWRfZ2l2ZW5fdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBmd19pbWcgKmltYWdlKQotewotCWludCByZXQgPSAwOwotCi0JcmV0ID0gaXdsYWduX2xvYWRfc2VjdGlvbihwcml2LCAiSU5TVCIsICZpbWFnZS0+Y29kZSwKLQkJCQkgICBJV0xBR05fUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gaXdsYWduX2xvYWRfc2VjdGlvbihwcml2LCAiREFUQSIsICZpbWFnZS0+ZGF0YSwKLQkJCQkgICAgSVdMQUdOX1JUQ19EQVRBX0xPV0VSX0JPVU5EKTsKLX0KLQotLyoKLSAqICBDYWxpYnJhdGlvbgotICovCi1zdGF0aWMgaW50IGl3bGFnbl9zZXRfWHRhbF9jYWxpYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jYWxpYl94dGFsX2ZyZXFfY21kIGNtZDsKLQlfX2xlMTYgKnh0YWxfY2FsaWIgPQotCQkoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9YVEFMKTsKLQotCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9DUllTVEFMX0ZSUV9DTUQpOwotCWNtZC5jYXBfcGluMSA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMF0pOwotCWNtZC5jYXBfcGluMiA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMV0pOwotCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9YVEFMXSwKLQkJCSAgICAgKHU4ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9zZXRfdGVtcGVyYXR1cmVfb2Zmc2V0X2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NhbGliX3RlbXBlcmF0dXJlX29mZnNldF9jbWQgY21kOwotCV9fbGUxNiAqb2Zmc2V0X2NhbGliID0KLQkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fUkFXX1RFTVBFUkFUVVJFKTsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JaXdsX3NldF9jYWxpYl9oZHIoJmNtZC5oZHIsIElXTF9QSFlfQ0FMSUJSQVRFX1RFTVBfT0ZGU0VUX0NNRCk7Ci0JbWVtY3B5KCZjbWQucmFkaW9fc2Vuc29yX29mZnNldCwgb2Zmc2V0X2NhbGliLCBzaXplb2YoKm9mZnNldF9jYWxpYikpOwotCWlmICghKGNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0KSkKLQkJY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQgPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlJhZGlvIHNlbnNvciBvZmZzZXQ6ICVkXG4iLAotCQkJbGUxNl90b19jcHUoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQpKTsKLQlyZXR1cm4gaXdsX2NhbGliX3NldCgmcHJpdi0+Y2FsaWJfcmVzdWx0c1tJV0xfQ0FMSUJfVEVNUF9PRkZTRVRdLAotCQkJICAgICAodTggKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWJfdjIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfY2FsaWJfdGVtcGVyYXR1cmVfb2Zmc2V0X3YyX2NtZCBjbWQ7Ci0JX19sZTE2ICpvZmZzZXRfY2FsaWJfaGlnaCA9IChfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwKLQkJCQkgICAgIEVFUFJPTV9LRUxWSU5fVEVNUEVSQVRVUkUpOwotCV9fbGUxNiAqb2Zmc2V0X2NhbGliX2xvdyA9Ci0JCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1JBV19URU1QRVJBVFVSRSk7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaGRyICpoZHI7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9URU1QX09GRlNFVF9DTUQpOwotCWhkciA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9oZHIgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwKLQkJCQkJCQlFRVBST01fQ0FMSUJfQUxMKTsKLQltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2hpZ2gsIG9mZnNldF9jYWxpYl9oaWdoLAotCQlzaXplb2YoKm9mZnNldF9jYWxpYl9oaWdoKSk7Ci0JbWVtY3B5KCZjbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3csIG9mZnNldF9jYWxpYl9sb3csCi0JCXNpemVvZigqb2Zmc2V0X2NhbGliX2xvdykpOwotCWlmICghKGNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2xvdykpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJubyBpbmZvIGluIEVFUFJPTSwgdXNlIGRlZmF1bHRcbiIpOwotCQljbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3cgPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7Ci0JCWNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2hpZ2ggPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7Ci0JfQotCW1lbWNweSgmY21kLmJ1cm50Vm9sdGFnZVJlZiwgJmhkci0+dm9sdGFnZSwKLQkJc2l6ZW9mKGhkci0+dm9sdGFnZSkpOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJSYWRpbyBzZW5zb3Igb2Zmc2V0IGhpZ2g6ICVkXG4iLAotCQkJbGUxNl90b19jcHUoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfaGlnaCkpOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUmFkaW8gc2Vuc29yIG9mZnNldCBsb3c6ICVkXG4iLAotCQkJbGUxNl90b19jcHUoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfbG93KSk7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJWb2x0YWdlIFJlZjogJWRcbiIsCi0JCQlsZTE2X3RvX2NwdShjbWQuYnVybnRWb2x0YWdlUmVmKSk7Ci0KLQlyZXR1cm4gaXdsX2NhbGliX3NldCgmcHJpdi0+Y2FsaWJfcmVzdWx0c1tJV0xfQ0FMSUJfVEVNUF9PRkZTRVRdLAotCQkJICAgICAodTggKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX3NlbmRfY2FsaWJfY2ZnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NhbGliX2NmZ19jbWQgY2FsaWJfY2ZnX2NtZDsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gQ0FMSUJSQVRJT05fQ0ZHX0NNRCwKLQkJLmxlbiA9IHsgc2l6ZW9mKHN0cnVjdCBpd2xfY2FsaWJfY2ZnX2NtZCksIH0sCi0JCS5kYXRhID0geyAmY2FsaWJfY2ZnX2NtZCwgfSwKLQl9OwotCi0JbWVtc2V0KCZjYWxpYl9jZmdfY21kLCAwLCBzaXplb2YoY2FsaWJfY2ZnX2NtZCkpOwotCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLmlzX2VuYWJsZSA9IElXTF9DQUxJQl9JTklUX0NGR19BTEw7Ci0JY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2Uuc3RhcnQgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOwotCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLnNlbmRfcmVzID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKLQljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcuZmxhZ3MgPQotCQlJV0xfQ0FMSUJfQ0ZHX0ZMQUdfU0VORF9DT01QTEVURV9OVEZZX01TSzsKLQotCXJldHVybiBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZjbWQpOwotfQotCi1pbnQgaXdsYWduX3J4X2NhbGliX3Jlc3VsdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIsCi0JCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9jYWxpYl9oZHIgKmhkciA9IChzdHJ1Y3QgaXdsX2NhbGliX2hkciAqKXBrdC0+dS5yYXc7Ci0JaW50IGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7Ci0JaW50IGluZGV4OwotCi0JLyogcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmICovCi0JbGVuIC09IDQ7Ci0KLQkvKiBEZWZpbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZQotCSAqIHVDb2RlLiBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzIHNlbmRzIHRoZW0gaW4gYSByb3cgYWNjb3JkaW5nIHRvCi0JICogdGhlaXIgaW5kZXguIFdlIHNvcnQgdGhlbSBoZXJlCi0JICovCi0Jc3dpdGNoIChoZHItPm9wX2NvZGUpIHsKLQljYXNlIElXTF9QSFlfQ0FMSUJSQVRFX0RDX0NNRDoKLQkJaW5kZXggPSBJV0xfQ0FMSUJfREM7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfTE9fQ01EOgotCQlpbmRleCA9IElXTF9DQUxJQl9MTzsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfUEhZX0NBTElCUkFURV9UWF9JUV9DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX1RYX0lROwotCQlicmVhazsKLQljYXNlIElXTF9QSFlfQ0FMSUJSQVRFX1RYX0lRX1BFUkRfQ01EOgotCQlpbmRleCA9IElXTF9DQUxJQl9UWF9JUV9QRVJEOwotCQlicmVhazsKLQljYXNlIElXTF9QSFlfQ0FMSUJSQVRFX0JBU0VfQkFORF9DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX0JBU0VfQkFORDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiVW5rbm93biBjYWxpYnJhdGlvbiBub3RpZmljYXRpb24gJWRcbiIsCi0JCQkgIGhkci0+b3BfY29kZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaXdsX2NhbGliX3NldCgmcHJpdi0+Y2FsaWJfcmVzdWx0c1tpbmRleF0sIHBrdC0+dS5yYXcsIGxlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xhZ25faW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewotCQkvKgotCQkgKiBUZWxsIHVDb2RlIHdlIGFyZSByZWFkeSB0byBwZXJmb3JtIGNhbGlicmF0aW9uCi0JCSAqIG5lZWQgdG8gcGVyZm9ybSB0aGlzIGJlZm9yZSBhbnkgY2FsaWJyYXRpb24KLQkJICogbm8gbmVlZCB0byBjbG9zZSB0aGUgZW52bG9wZSBzaW5jZSB3ZSBhcmUgZ29pbmcKLQkJICogdG8gbG9hZCB0aGUgcnVudGltZSB1Q29kZSBsYXRlci4KLQkJICovCi0JCXJldCA9IGl3bGFnbl9zZW5kX2J0X2Vudihwcml2LCBJV0xfQlRfQ09FWF9FTlZfT1BFTiwKLQkJCUJUX0NPRVhfUFJJT19UQkxfRVZUX0lOSVRfQ0FMSUIyKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQl9Ci0KLQlyZXQgPSBpd2xhZ25fc2VuZF9jYWxpYl9jZmcocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qKgotCSAqIHRlbXBlcmF0dXJlIG9mZnNldCBjYWxpYnJhdGlvbiBpcyBvbmx5IG5lZWRlZCBmb3IgcnVudGltZSB1Y29kZSwKLQkgKiBzbyBwcmVwYXJlIHRoZSB2YWx1ZSBub3cuCi0JICovCi0JaWYgKHByaXYtPmNmZy0+bmVlZF90ZW1wX29mZnNldF9jYWxpYikgewotCQlpZiAocHJpdi0+Y2ZnLT50ZW1wX29mZnNldF92MikKLQkJCXJldHVybiBpd2xhZ25fc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYl92Mihwcml2KTsKLQkJZWxzZQotCQkJcmV0dXJuIGl3bGFnbl9zZXRfdGVtcGVyYXR1cmVfb2Zmc2V0X2NhbGliKHByaXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9zZW5kX3dpbWF4X2NvZXgoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfd2ltYXhfY29leF9jbWQgY29leF9jbWQ7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c3VwcG9ydF93aW1heF9jb2V4aXN0KSB7Ci0JCS8qIFVuTWFzayB3YWtlIHVwIHNyYyBhdCBhc3NvY2lhdGVkIHNsZWVwICovCi0JCWNvZXhfY21kLmZsYWdzID0gQ09FWF9GTEFHU19BU1NPQ19XQV9VTk1BU0tfTVNLOwotCi0JCS8qIFVuTWFzayB3YWtlIHVwIHNyYyBhdCB1bmFzc29jaWF0ZWQgc2xlZXAgKi8KLQkJY29leF9jbWQuZmxhZ3MgfD0gQ09FWF9GTEFHU19VTkFTU09DX1dBX1VOTUFTS19NU0s7Ci0JCW1lbWNweShjb2V4X2NtZC5zdGFfcHJpbywgY3VfcHJpb3JpdGllcywKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfZXZlbnRfZW50cnkpICoKLQkJCSBDT0VYX05VTV9PRl9FVkVOVFMpOwotCi0JCS8qIGVuYWJsaW5nIHRoZSBjb2V4aXN0ZW5jZSBmZWF0dXJlICovCi0JCWNvZXhfY21kLmZsYWdzIHw9IENPRVhfRkxBR1NfQ09FWF9FTkFCTEVfTVNLOwotCi0JCS8qIGVuYWJsaW5nIHRoZSBwcmlvcml0aWVzIHRhYmxlcyAqLwotCQljb2V4X2NtZC5mbGFncyB8PSBDT0VYX0ZMQUdTX1NUQV9UQUJMRV9WQUxJRF9NU0s7Ci0JfSBlbHNlIHsKLQkJLyogY29leGlzdGVuY2UgaXMgZGlzYWJsZWQgKi8KLQkJbWVtc2V0KCZjb2V4X2NtZCwgMCwgc2l6ZW9mKGNvZXhfY21kKSk7Ci0JfQotCXJldHVybiBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAotCQkJCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01ELCBDTURfU1lOQywKLQkJCQlzaXplb2YoY29leF9jbWQpLCAmY29leF9jbWQpOwotfQotCi1zdGF0aWMgY29uc3QgdTggaXdsYWduX2J0X3ByaW9fdGJsW0JUX0NPRVhfUFJJT19UQkxfRVZUX01BWF0gPSB7Ci0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQllQQVNTIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8Ci0JCSgwIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAotCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0JZUEFTUyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMSA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19MT1cgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fTE9XIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8Ci0JCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAotCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0hJR0ggPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fSElHSCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMSA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19CWVBBU1MgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQ09FWF9PRkYgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQ09FWF9PTiA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi12b2lkIGl3bGFnbl9zZW5kX3ByaW9fdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2J0X2NvZXhfcHJpb190YWJsZV9jbWQgcHJpb190YmxfY21kOwotCi0JbWVtY3B5KHByaW9fdGJsX2NtZC5wcmlvX3RibCwgaXdsYWduX2J0X3ByaW9fdGJsLAotCQlzaXplb2YoaXdsYWduX2J0X3ByaW9fdGJsKSk7Ci0JaWYgKGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCi0JCQkJUkVQTFlfQlRfQ09FWF9QUklPX1RBQkxFLCBDTURfU1lOQywKLQkJCQlzaXplb2YocHJpb190YmxfY21kKSwgJnByaW9fdGJsX2NtZCkpCi0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZW5kIEJUIHByaW8gdGJsIGNvbW1hbmRcbiIpOwotfQotCi1pbnQgaXdsYWduX3NlbmRfYnRfZW52KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYWN0aW9uLCB1OCB0eXBlKQotewotCXN0cnVjdCBpd2xfYnRfY29leF9wcm90X2Vudl9jbWQgZW52X2NtZDsKLQlpbnQgcmV0OwotCi0JZW52X2NtZC5hY3Rpb24gPSBhY3Rpb247Ci0JZW52X2NtZC50eXBlID0gdHlwZTsKLQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAotCQkJICAgICAgIFJFUExZX0JUX0NPRVhfUFJPVF9FTlYsIENNRF9TWU5DLAotCQkJICAgICAgIHNpemVvZihlbnZfY21kKSwgJmVudl9jbWQpOwotCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZW5kIEJUIGVudiBjb21tYW5kXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgaXdsYWduX2FsaXZlX25vdGlmeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgcmV0OwotCi0JaWYgKCFwcml2LT50eF9jbWRfcG9vbCkKLQkJcHJpdi0+dHhfY21kX3Bvb2wgPQotCQkJa21lbV9jYWNoZV9jcmVhdGUoIml3bGFnbl9kZXZfY21kIiwKLQkJCQkJICBzaXplb2Yoc3RydWN0IGl3bF9kZXZpY2VfY21kKSwKLQkJCQkJICBzaXplb2Yodm9pZCAqKSwgMCwgTlVMTCk7Ci0KLQlpZiAoIXByaXYtPnR4X2NtZF9wb29sKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWl3bF90cmFuc190eF9zdGFydCh0cmFucyhwcml2KSk7Ci0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCi0JCWN0eC0+bGFzdF90eF9yZWplY3RlZCA9IGZhbHNlOwotCi0JcmV0ID0gaXdsYWduX3NlbmRfd2ltYXhfY29leChwcml2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gaXdsYWduX3NldF9YdGFsX2NhbGliKHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gaXdsX3NlbmRfY2FsaWJfcmVzdWx0cyhwcml2KTsKLX0KLQotCi0vKioKLSAqIGl3bF92ZXJpZnlfaW5zdF9zcGFyc2UgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICB1c2luZyBzYW1wbGUgZGF0YSAxMDAgYnl0ZXMgYXBhcnQuICBJZiB0aGVzZSBzYW1wbGUgcG9pbnRzIGFyZSBnb29kLAotICogICBpdCdzIGEgcHJldHR5IGdvb2QgYmV0IHRoYXQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZW0gaXMgZ29vZCwgdG9vLgotICovCi1zdGF0aWMgaW50IGl3bF92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBmd19kZXNjICpmd19kZXNjKQotewotCV9fbGUzMiAqaW1hZ2UgPSAoX19sZTMyICopZndfZGVzYy0+dl9hZGRyOwotCXUzMiBsZW4gPSBmd19kZXNjLT5sZW47Ci0JdTMyIHZhbDsKLQl1MzIgaTsKLQotCUlXTF9ERUJVR19GVyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMC9zaXplb2YodTMyKSkgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCWkgKyBJV0xBR05fUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCQl2YWwgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9wcmludF9taXNtYXRjaF9pbnN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGZ3X2Rlc2MgKmZ3X2Rlc2MpCi17Ci0JX19sZTMyICppbWFnZSA9IChfX2xlMzIgKilmd19kZXNjLT52X2FkZHI7Ci0JdTMyIGxlbiA9IGZ3X2Rlc2MtPmxlbjsKLQl1MzIgdmFsOwotCXUzMiBvZmZzOwotCWludCBlcnJvcnMgPSAwOwotCi0JSVdMX0RFQlVHX0ZXKHByaXYsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7Ci0KLQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJICAgSVdMQUdOX1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKLQotCWZvciAob2ZmcyA9IDA7Ci0JICAgICBvZmZzIDwgbGVuICYmIGVycm9ycyA8IDIwOwotCSAgICAgb2ZmcyArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJdmFsID0gaXdsX3JlYWQzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGF0ICIKLQkJCQkib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCW9mZnMsIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7Ci0JCQllcnJvcnMrKzsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBpd2xfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCi0gKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cwotICovCi1zdGF0aWMgaW50IGl3bF92ZXJpZnlfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgZndfaW1nICppbWcpCi17Ci0JaWYgKCFpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsICZpbWctPmNvZGUpKSB7Ci0JCUlXTF9ERUJVR19GVyhwcml2LCAidUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfRVJSKHByaXYsICJVQ09ERSBJTUFHRSBJTiBJTlNUUlVDVElPTiBTUkFNIE5PVCBWQUxJRCEhXG4iKTsKLQotCWl3bF9wcmludF9taXNtYXRjaF9pbnN0KHByaXYsICZpbWctPmNvZGUpOwotCXJldHVybiAtRUlPOwotfQotCi1zdHJ1Y3QgaXdsYWduX2FsaXZlX2RhdGEgewotCWJvb2wgdmFsaWQ7Ci0JdTggc3VidHlwZTsKLX07Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9hbGl2ZV9mbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKLQkJCSAgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xhZ25fYWxpdmVfZGF0YSAqYWxpdmVfZGF0YSA9IGRhdGE7Ci0Jc3RydWN0IGl3bF9hbGl2ZV9yZXNwICpwYWxpdmU7Ci0KLQlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOwotCi0JSVdMX0RFQlVHX0ZXKHByaXYsICJBbGl2ZSB1Y29kZSBzdGF0dXMgMHglMDhYIHJldmlzaW9uICIKLQkJICAgICAgICIweCUwMVggMHglMDFYXG4iLAotCQkgICAgICAgcGFsaXZlLT5pc192YWxpZCwgcGFsaXZlLT52ZXJfdHlwZSwKLQkJICAgICAgIHBhbGl2ZS0+dmVyX3N1YnR5cGUpOwotCi0JcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlID0KLQkJbGUzMl90b19jcHUocGFsaXZlLT5lcnJvcl9ldmVudF90YWJsZV9wdHIpOwotCXByaXYtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGUgPQotCQlsZTMyX3RvX2NwdShwYWxpdmUtPmxvZ19ldmVudF90YWJsZV9wdHIpOwotCi0JYWxpdmVfZGF0YS0+c3VidHlwZSA9IHBhbGl2ZS0+dmVyX3N1YnR5cGU7Ci0JYWxpdmVfZGF0YS0+dmFsaWQgPSBwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LOwotfQotCi0jZGVmaW5lIFVDT0RFX0FMSVZFX1RJTUVPVVQJSFoKLSNkZWZpbmUgVUNPREVfQ0FMSUJfVElNRU9VVAkoMipIWikKLQotaW50IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgZndfaW1nICppbWFnZSwKLQkJCQkgZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB1Y29kZV90eXBlKQotewotCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgYWxpdmVfd2FpdDsKLQlzdHJ1Y3QgaXdsYWduX2FsaXZlX2RhdGEgYWxpdmVfZGF0YTsKLQlpbnQgcmV0OwotCWVudW0gaXdsYWduX3Vjb2RlX3R5cGUgb2xkX3R5cGU7Ci0KLQlyZXQgPSBpd2xfdHJhbnNfc3RhcnRfZGV2aWNlKHRyYW5zKHByaXYpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdiwgJmFsaXZlX3dhaXQsIFJFUExZX0FMSVZFLAotCQkJCSAgICAgIGl3bGFnbl9hbGl2ZV9mbiwgJmFsaXZlX2RhdGEpOwotCi0Jb2xkX3R5cGUgPSBwcml2LT51Y29kZV90eXBlOwotCXByaXYtPnVjb2RlX3R5cGUgPSB1Y29kZV90eXBlOwotCi0JcmV0ID0gaXdsYWduX2xvYWRfZ2l2ZW5fdWNvZGUocHJpdiwgaW1hZ2UpOwotCWlmIChyZXQpIHsKLQkJcHJpdi0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOwotCQlpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LCAmYWxpdmVfd2FpdCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaXdsX3RyYW5zX2tpY2tfbmljKHRyYW5zKHByaXYpKTsKLQotCS8qCi0JICogU29tZSB0aGluZ3MgbWF5IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBub3csIGJ1dCB3ZQotCSAqIGp1c3Qgd2FpdCBmb3IgdGhlIEFMSVZFIG5vdGlmaWNhdGlvbiBoZXJlLgotCSAqLwotCXJldCA9IGl3bGFnbl93YWl0X25vdGlmaWNhdGlvbihwcml2LCAmYWxpdmVfd2FpdCwgVUNPREVfQUxJVkVfVElNRU9VVCk7Ci0JaWYgKHJldCkgewotCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCFhbGl2ZV9kYXRhLnZhbGlkKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkxvYWRlZCB1Y29kZSBpcyBub3QgdmFsaWQhXG4iKTsKLQkJcHJpdi0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgc3RlcCB0YWtlcyBhIGxvbmcgdGltZSAoNjAtODBtcyEhKSBhbmQKLQkgKiBXb1dMQU4gaW1hZ2Ugc2hvdWxkIGJlIGxvYWRlZCBxdWlja2x5LCBzbwotCSAqIHNraXAgaXQgZm9yIFdvV0xBTi4KLQkgKi8KLQlpZiAodWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfV09XTEFOKSB7Ci0JCXJldCA9IGl3bF92ZXJpZnlfdWNvZGUocHJpdiwgaW1hZ2UpOwotCQlpZiAocmV0KSB7Ci0JCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogZGVsYXkgYSBiaXQgdG8gZ2l2ZSByZmtpbGwgdGltZSB0byBydW4gKi8KLQkJbXNsZWVwKDUpOwotCX0KLQotCXJldCA9IGl3bGFnbl9hbGl2ZV9ub3RpZnkocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfV0FSTihwcml2LAotCQkJIkNvdWxkIG5vdCBjb21wbGV0ZSBBTElWRSB0cmFuc2l0aW9uOiAlZFxuIiwgcmV0KTsKLQkJcHJpdi0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsYWduX3J1bl9pbml0X3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IGNhbGliX3dhaXQ7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCS8qIE5vIGluaXQgdWNvZGUgcmVxdWlyZWQ/IEN1cmlvdXMsIGJ1dCBtYXliZSBvayAqLwotCWlmICghcHJpdi0+dWNvZGVfaW5pdC5jb2RlLmxlbikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocHJpdi0+dWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfTk9ORSkKLQkJcmV0dXJuIDA7Ci0KLQlpd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdChwcml2LCAmY2FsaWJfd2FpdCwKLQkJCQkgICAgICBDQUxJQlJBVElPTl9DT01QTEVURV9OT1RJRklDQVRJT04sCi0JCQkJICAgICAgTlVMTCwgTlVMTCk7Ci0KLQkvKiBXaWxsIGFsc28gc3RhcnQgdGhlIGRldmljZSAqLwotCXJldCA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwgJnByaXYtPnVjb2RlX2luaXQsCi0JCQkJCSAgIElXTF9VQ09ERV9JTklUKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gaXdsYWduX2luaXRfYWxpdmVfc3RhcnQocHJpdik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCS8qCi0JICogU29tZSB0aGluZ3MgbWF5IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBub3csIGJ1dCB3ZQotCSAqIGp1c3Qgd2FpdCBmb3IgdGhlIGNhbGlicmF0aW9uIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlyZXQgPSBpd2xhZ25fd2FpdF9ub3RpZmljYXRpb24ocHJpdiwgJmNhbGliX3dhaXQsIFVDT0RFX0NBTElCX1RJTUVPVVQpOwotCi0JZ290byBvdXQ7Ci0KLSBlcnJvcjoKLQlpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LCAmY2FsaWJfd2FpdCk7Ci0gb3V0OgotCS8qIFdoYXRldmVyIGhhcHBlbmVkLCBzdG9wIHRoZSBkZXZpY2UgKi8KLQlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOwotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCmluZGV4IDlkNDYzY2YuLmIyZDk1ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTQ0LDYgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAogI2luY2x1ZGUgIml3bC1lZXByb20uaCIKKyNpbmNsdWRlICJpd2wtd2lmaS5oIgogI2luY2x1ZGUgIml3bC1kZXYuaCIKICNpbmNsdWRlICJpd2wtY29yZS5oIgogI2luY2x1ZGUgIml3bC1pby5oIgpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJdTMyIG51bV93cmFwczsgIC8qICMgdGltZXMgdUNvZGUgd3JhcHBlZCB0byB0b3Agb2YgbG9nICovCiAJdTMyIG5leHRfZW50cnk7IC8qIGluZGV4IG9mIG5leHQgZW50cnkgdG8gYmUgd3JpdHRlbiBieSB1Q29kZSAqLwogCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5lcnJvcl9ldmVudF90YWJsZTsKKwliYXNlID0gcHJpdi0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOwogCWlmIChpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewogCQljYXBhY2l0eSA9IGl3bF9yZWFkX3RhcmdfbWVtKGJ1cyhwcml2KSwgYmFzZSk7CiAJCW51bV93cmFwcyA9IGl3bF9yZWFkX3RhcmdfbWVtKGJ1cyhwcml2KSwKQEAgLTQ1Miw1MiArNDUyLDYgQEAKIAlpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfZGVzYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19kZXNjICpkZXNjKQotewotCWlmIChkZXNjLT52X2FkZHIpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGJ1cyhwcml2KS0+ZGV2LCBkZXNjLT5sZW4sCi0JCQkJICBkZXNjLT52X2FkZHIsIGRlc2MtPnBfYWRkcik7Ci0JZGVzYy0+dl9hZGRyID0gTlVMTDsKLQlkZXNjLT5sZW4gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfZnJlZV9md19pbWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgZndfaW1nICppbWcpCi17Ci0JaXdsX2ZyZWVfZndfZGVzYyhwcml2LCAmaW1nLT5jb2RlKTsKLQlpd2xfZnJlZV9md19kZXNjKHByaXYsICZpbWctPmRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfZGVhbGxvY191Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsX2ZyZWVfZndfaW1nKHByaXYsICZwcml2LT51Y29kZV9ydCk7Ci0JaXdsX2ZyZWVfZndfaW1nKHByaXYsICZwcml2LT51Y29kZV9pbml0KTsKLQlpd2xfZnJlZV9md19pbWcocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbik7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgZndfZGVzYyAqZGVzYywKLQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKLXsKLQlpZiAoIWxlbikgewotCQlkZXNjLT52X2FkZHIgPSBOVUxMOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXNjLT52X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoYnVzKHByaXYpLT5kZXYsIGxlbiwKLQkJCQkJICAmZGVzYy0+cF9hZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MtPnZfYWRkcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXNjLT5sZW4gPSBsZW47Ci0JbWVtY3B5KGRlc2MtPnZfYWRkciwgZGF0YSwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgaXdsX2luaXRfY29udGV4dChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiB1Y29kZV9mbGFncykKIHsKIAlpbnQgaTsKQEAgLTU1NSwyMyArNTA5LDE0IEBACiAJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7CiB9CiAKLQotc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgewotCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOwotCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKLQl1MzIgZmxhZ3M7Ci19OwotCiBzdGF0aWMgdm9pZCBpd2xfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsIHZvaWQgKmNvbnRleHQpOwotc3RhdGljIGludCBpd2xhZ25fbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xhZ25fdWNvZGVfY2FwYWJpbGl0aWVzICpjYXBhKTsKIAogI2RlZmluZSBVQ09ERV9FWFBFUklNRU5UQUxfSU5ERVgJMTAwCiAjZGVmaW5lIFVDT0RFX0VYUEVSSU1FTlRBTF9UQUcJCSJleHAiCiAKIHN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGl3bF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmaXJzdCkKIHsKLQljb25zdCBjaGFyICpuYW1lX3ByZSA9IHByaXYtPmNmZy0+ZndfbmFtZV9wcmU7CisJY29uc3QgY2hhciAqbmFtZV9wcmUgPSBjZmcocHJpdiktPmZ3X25hbWVfcHJlOwogCWNoYXIgdGFnWzhdOwogCiAJaWYgKGZpcnN0KSB7CkBAIC01ODAsMTQgKzUyNSwxNCBAQAogCQlzdHJjcHkodGFnLCBVQ09ERV9FWFBFUklNRU5UQUxfVEFHKTsKIAl9IGVsc2UgaWYgKHByaXYtPmZ3X2luZGV4ID09IFVDT0RFX0VYUEVSSU1FTlRBTF9JTkRFWCkgewogI2VuZGlmCi0JCXByaXYtPmZ3X2luZGV4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCQlwcml2LT5md19pbmRleCA9IGNmZyhwcml2KS0+dWNvZGVfYXBpX21heDsKIAkJc3ByaW50Zih0YWcsICIlZCIsIHByaXYtPmZ3X2luZGV4KTsKIAl9IGVsc2UgewogCQlwcml2LT5md19pbmRleC0tOwogCQlzcHJpbnRmKHRhZywgIiVkIiwgcHJpdi0+ZndfaW5kZXgpOwogCX0KIAotCWlmIChwcml2LT5md19pbmRleCA8IHByaXYtPmNmZy0+dWNvZGVfYXBpX21pbikgeworCWlmIChwcml2LT5md19pbmRleCA8IGNmZyhwcml2KS0+dWNvZGVfYXBpX21pbikgewogCQlJV0xfRVJSKHByaXYsICJubyBzdWl0YWJsZSBmaXJtd2FyZSBmb3VuZCFcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC04OTIsOSArODM3LDkgQEAKIAlzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGU7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaXdsYWduX2Zpcm13YXJlX3BpZWNlcyBwaWVjZXM7Ci0JY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBwcml2LT5jZmctPnVjb2RlX2FwaV9tYXg7Ci0JdW5zaWduZWQgaW50IGFwaV9vayA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX29rOwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluOworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gY2ZnKHByaXYpLT51Y29kZV9hcGlfbWF4OworCXVuc2lnbmVkIGludCBhcGlfb2sgPSBjZmcocHJpdiktPnVjb2RlX2FwaV9vazsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21pbiA9IGNmZyhwcml2KS0+dWNvZGVfYXBpX21pbjsKIAl1MzIgYXBpX3ZlcjsKIAljaGFyIGJ1aWxkc3RyWzI1XTsKIAl1MzIgYnVpbGQ7CkBAIC0xMDQwLDMwICs5ODUsMzIgQEAKIAkvKiBSdW50aW1lIGluc3RydWN0aW9ucyBhbmQgMiBjb3BpZXMgb2YgZGF0YToKIAkgKiAxKSB1bm1vZGlmaWVkIGZyb20gZGlzawogCSAqIDIpIGJhY2t1cCBjYWNoZSBmb3Igc2F2ZS9yZXN0b3JlIGR1cmluZyBwb3dlci1kb3ducyAqLwotCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfcnQuY29kZSwKKwlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLCAmdHJhbnMocHJpdiktPnVjb2RlX3J0LmNvZGUsCiAJCQkgICAgICBwaWVjZXMuaW5zdCwgcGllY2VzLmluc3Rfc2l6ZSkpCiAJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3J0LmRhdGEsCisJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwgJnRyYW5zKHByaXYpLT51Y29kZV9ydC5kYXRhLAogCQkJICAgICAgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpKQogCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAKIAkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgKi8KIAlpZiAocGllY2VzLmluaXRfc2l6ZSAmJiBwaWVjZXMuaW5pdF9kYXRhX3NpemUpIHsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9pbml0LmNvZGUsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksICZ0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5jb2RlLAogCQkJCSAgICAgIHBpZWNlcy5pbml0LCBwaWVjZXMuaW5pdF9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9pbml0LmRhdGEsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksICZ0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5kYXRhLAogCQkJCSAgICAgIHBpZWNlcy5pbml0X2RhdGEsIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkpCiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CiAJfQogCiAJLyogV29XTEFOIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLwogCWlmIChwaWVjZXMud293bGFuX2luc3Rfc2l6ZSAmJiBwaWVjZXMud293bGFuX2RhdGFfc2l6ZSkgewotCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbi5jb2RlLAorCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLAorCQkJCSAgICAgICZ0cmFucyhwcml2KS0+dWNvZGVfd293bGFuLmNvZGUsCiAJCQkJICAgICAgcGllY2VzLndvd2xhbl9pbnN0LAogCQkJCSAgICAgIHBpZWNlcy53b3dsYW5faW5zdF9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQkJaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4uZGF0YSwKKwkJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwKKwkJCQkgICAgICAmdHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5kYXRhLAogCQkJCSAgICAgIHBpZWNlcy53b3dsYW5fZGF0YSwKIAkJCQkgICAgICBwaWVjZXMud293bGFuX2RhdGFfc2l6ZSkpCiAJCQlnb3RvIGVycl9wY2lfYWxsb2M7CkBAIC0xMDgxLDIwICsxMDI4LDIzIEBACiAJCXByaXYtPmluaXRfZXZ0bG9nX3NpemUgPSAocGllY2VzLmluaXRfZXZ0bG9nX3NpemUgLSAxNikvMTI7CiAJZWxzZQogCQlwcml2LT5pbml0X2V2dGxvZ19zaXplID0KLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZTsKKwkJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZTsKIAlwcml2LT5pbml0X2VycmxvZ19wdHIgPSBwaWVjZXMuaW5pdF9lcnJsb2dfcHRyOwogCXByaXYtPmluc3RfZXZ0bG9nX3B0ciA9IHBpZWNlcy5pbnN0X2V2dGxvZ19wdHI7CiAJaWYgKHBpZWNlcy5pbnN0X2V2dGxvZ19zaXplKQogCQlwcml2LT5pbnN0X2V2dGxvZ19zaXplID0gKHBpZWNlcy5pbnN0X2V2dGxvZ19zaXplIC0gMTYpLzEyOwogCWVsc2UKIAkJcHJpdi0+aW5zdF9ldnRsb2dfc2l6ZSA9Ci0JCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemU7CisJCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5tYXhfZXZlbnRfbG9nX3NpemU7CiAJcHJpdi0+aW5zdF9lcnJsb2dfcHRyID0gcGllY2VzLmluc3RfZXJybG9nX3B0cjsKKyNpZm5kZWYgQ09ORklHX0lXTFdJRklfUDJQCisJdWNvZGVfY2FwYS5mbGFncyAmPSB+SVdMX1VDT0RFX1RMVl9GTEFHU19QQU47CisjZW5kaWYKIAogCXByaXYtPm5ld19zY2FuX3RocmVzaG9sZF9iZWhhdmlvdXIgPQogCQkhISh1Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdTQ0FOKTsKIAotCWlmICghKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfSVBBTl9FTkFCTEUpKQorCWlmICghKGNmZyhwcml2KS0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfSVBBTl9FTkFCTEUpKQogCQl1Y29kZV9jYXBhLmZsYWdzICY9IH5JV0xfVUNPREVfVExWX0ZMQUdTX1BBTjsKIAogCS8qCkBAIC0xMTExLDcgKzEwNjEsNiBAQAogCQlwcml2LT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07CiAJCXByaXYtPnNocmQtPmNtZF9xdWV1ZSA9IElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU07CiAJfQotCiAJLyoKIAkgKiBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgb2YgY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMKIAkgKiBiYXNlIG9uIHRoZSBzaXplIG9mIHN0YW5kYXJkIHBoeSBjYWxpYnJhdGlvbiBjb21tYW5kcyB0YWJsZSBzaXplCkBAIC0xMTU2LDcgKzExMDUsNyBAQAogCiAgZXJyX3BjaV9hbGxvYzoKIAlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcGNpIG1lbW9yeVxuIik7Ci0JaXdsX2RlYWxsb2NfdWNvZGUocHJpdik7CisJaXdsX2RlYWxsb2NfdWNvZGUodHJhbnMocHJpdikpOwogIG91dF91bmJpbmQ6CiAJY29tcGxldGUoJnByaXYtPmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOwogCWRldmljZV9yZWxlYXNlX2RyaXZlcihidXMocHJpdiktPmRldik7CkBAIC0xMTc2LDcgKzExMjUsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKIAlwcml2LT50aGVybWFsX3Rocm90dGxlLmN0X2tpbGxfdG9nZ2xlID0gZmFsc2U7CiAKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c3VwcG9ydF9jdF9raWxsX2V4aXQpIHsKKwlpZiAoY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+c3VwcG9ydF9jdF9raWxsX2V4aXQpIHsKIAkJYWR2X2NtZC5jcml0aWNhbF90ZW1wZXJhdHVyZV9lbnRlciA9CiAJCQljcHVfdG9fbGUzMihod19wYXJhbXMocHJpdikuY3Rfa2lsbF90aHJlc2hvbGQpOwogCQlhZHZfY21kLmNyaXRpY2FsX3RlbXBlcmF0dXJlX2V4aXQgPQpAQCAtMTI3MSwxMCArMTIyMCwxMCBAQAogCQlyZXR1cm4gLUVSRktJTEw7CiAKIAkvKiBkb3dubG9hZCBwcmlvcml0eSB0YWJsZSBiZWZvcmUgYW55IGNhbGlicmF0aW9uIHJlcXVlc3QgKi8KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJLyogQ29uZmlndXJlIEJsdWV0b290aCBkZXZpY2UgY29leGlzdGVuY2Ugc3VwcG9ydCAqLwotCQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X3Njb19kaXNhYmxlKQorCQlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMtPmJ0X3Njb19kaXNhYmxlKQogCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IGZhbHNlOwogCQllbHNlCiAJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gdHJ1ZTsKQEAgLTEyODYsMTQgKzEyMzUsMTQgQEAKIAkJcHJpdi0+YnRfdmFsaWQgPSBJV0xBR05fQlRfVkFMSURfRU5BQkxFX0ZMQUdTOwogCQlwcml2LT5jdXJfcnNzaV9jdHggPSBOVUxMOwogCi0JCWl3bGFnbl9zZW5kX3ByaW9fdGJsKHByaXYpOworCQlpd2xfc2VuZF9wcmlvX3RibCh0cmFucyhwcml2KSk7CiAKIAkJLyogRklYTUU6IHcvYSB0byBmb3JjZSBjaGFuZ2UgdUNvZGUgQlQgc3RhdGUgbWFjaGluZSAqLwotCQlyZXQgPSBpd2xhZ25fc2VuZF9idF9lbnYocHJpdiwgSVdMX0JUX0NPRVhfRU5WX09QRU4sCisJCXJldCA9IGl3bF9zZW5kX2J0X2Vudih0cmFucyhwcml2KSwgSVdMX0JUX0NPRVhfRU5WX09QRU4sCiAJCQkJCSBCVF9DT0VYX1BSSU9fVEJMX0VWVF9JTklUX0NBTElCMik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBpd2xhZ25fc2VuZF9idF9lbnYocHJpdiwgSVdMX0JUX0NPRVhfRU5WX0NMT1NFLAorCQlyZXQgPSBpd2xfc2VuZF9idF9lbnYodHJhbnMocHJpdiksIElXTF9CVF9DT0VYX0VOVl9DTE9TRSwKIAkJCQkJIEJUX0NPRVhfUFJJT19UQkxfRVZUX0lOSVRfQ0FMSUIyKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMzEzLDcgKzEyNjIsNyBAQAogCXByaXYtPmFjdGl2ZV9yYXRlID0gSVdMX1JBVEVTX01BU0s7CiAKIAkvKiBDb25maWd1cmUgVHggYW50ZW5uYSBzZWxlY3Rpb24gYmFzZWQgb24gSC9XIGNvbmZpZyAqLwotCWl3bGFnbl9zZW5kX3R4X2FudF9jb25maWcocHJpdiwgcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQpOworCWl3bGFnbl9zZW5kX3R4X2FudF9jb25maWcocHJpdiwgY2ZnKHByaXYpLT52YWxpZF90eF9hbnQpOwogCiAJaWYgKGl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpICYmICFwcml2LT5zaHJkLT53b3dsYW4pIHsKIAkJc3RydWN0IGl3bF9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPQpAQCAtMTM1Miw3ICsxMzAxLDcgQEAKIAogc3RhdGljIHZvaWQgaXdsX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKLXN0YXRpYyB2b2lkIF9faXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQordm9pZCBfX2l3bF9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlpbnQgZXhpdF9wZW5kaW5nOwogCkBAIC0xMzgyLDkgKzEzMzEsOSBAQAogCXByaXYtPmJ0X3N0YXR1cyA9IDA7CiAJcHJpdi0+Y3VyX3Jzc2lfY3R4ID0gTlVMTDsKIAlwcml2LT5idF9pc19zY28gPSAwOwotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcykKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMpCiAJCXByaXYtPmJ0X3RyYWZmaWNfbG9hZCA9Ci0JCQkgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X2luaXRfdHJhZmZpY19sb2FkOworCQkJIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9pbml0X3RyYWZmaWNfbG9hZDsKIAllbHNlCiAJCXByaXYtPmJ0X3RyYWZmaWNfbG9hZCA9IDA7CiAJcHJpdi0+YnRfZnVsbF9jb25jdXJyZW50ID0gZmFsc2U7CkBAIC0xNDE1LDcgKzEzNjQsNyBAQAogCXByaXYtPmJlYWNvbl9za2IgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIGl3bF9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiAJX19pd2xfZG93bihwcml2KTsKQEAgLTE0MjQsNTcgKzEzNzMsNiBAQAogCWl3bF9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKIH0KIAotI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQotCi1zdGF0aWMgaW50IF9faXdsX3VwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCXJldCA9IGl3bGFnbl9hbGxvY19iY2FzdF9zdGF0aW9uKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCWl3bF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldCA9IGl3bGFnbl9ydW5faW5pdF91Y29kZShwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcmV0ID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LAotCQkJCQkgICAmcHJpdi0+dWNvZGVfcnQsCi0JCQkJCSAgIElXTF9VQ09ERV9SRUdVTEFSKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBzdGFydCBSVCB1Y29kZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcmV0ID0gaXdsX2FsaXZlX3N0YXJ0KHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOwotCV9faXdsX2Rvd24ocHJpdik7Ci0JY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOwotCi0JSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlLlxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBXb3JrcXVldWUgY2FsbGJhY2tzCkBAIC0xNTAyLDcgKzE0MDAsNyBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3ZvaWQgaXdsYWduX3ByZXBhcmVfcmVzdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKIAlib29sIGJ0X2Z1bGxfY29uY3VycmVudDsKQEAgLTE1NTksMTE4MCArMTQ1Nyw4IEBACiAJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9zdGFfYXBfbGltaXRzW10gPSB7Ci0JewotCQkubWF4ID0gMSwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAotCX0sCi0JewotCQkubWF4ID0gMSwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduXzJzdGFfbGltaXRzW10gPSB7Ci0JewotCQkubWF4ID0gMiwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHNbXSA9IHsKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCi0JfSwKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8Ci0JCQkgQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3AycF8yc3RhX2xpbWl0c1tdID0gewotCXsKLQkJLm1heCA9IDIsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKLQl9LAotCXsKLQkJLm1heCA9IDEsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KLWl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGVbXSA9IHsKLQl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKLQkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCi0JICAuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCi0JICAubGltaXRzID0gaXdsYWduX3N0YV9hcF9saW1pdHMsCi0JICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9zdGFfYXBfbGltaXRzKSwKLQl9LAotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5saW1pdHMgPSBpd2xhZ25fMnN0YV9saW1pdHMsCi0JICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl8yc3RhX2xpbWl0cyksCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uCi1pd2xhZ25faWZhY2VfY29tYmluYXRpb25zX3AycFtdID0gewotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKLQkgIC5saW1pdHMgPSBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHMsCi0JICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cyksCi0JfSwKLQl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKLQkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCi0JICAubGltaXRzID0gaXdsYWduX3AycF8yc3RhX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF8yc3RhX2xpbWl0cyksCi0JfSwKLX07Ci0KLS8qCi0gKiBOb3QgYSBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbiwgYnV0IGl0IGZpdHMgaW4gd2l0aCBhbGwgdGhlCi0gKiBvdGhlciBtYWM4MDIxMSBmdW5jdGlvbnMgZ3JvdXBlZCBoZXJlLgotICovCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgKmNhcGEpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtYWduLXJzIjsKLQotCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLwotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKLQkJICAgIElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTiB8Ci0JCSAgICBJRUVFODAyMTFfSFdfTkVFRF9EVElNX1BFUklPRCB8Ci0JCSAgICBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8Ci0JCSAgICBJRUVFODAyMTFfSFdfUkVQT1JUU19UWF9BQ0tfU1RBVFVTOwotCi0JLyoKLQkgKiBJbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHdpbGwgY3Jhc2ggc29tZSBBUCdzLiAgVGhpcwotCSAqIHdvcmthcm91bmQgcmVtb3ZlcyB0aGUgc3RpbXVsdXMgd2hpY2ggY2F1c2VzIHRoZSBjcmFzaCB1bnRpbAotCSAqIHRoZSBBUCBzb2Z0d2FyZSBjYW4gYmUgZml4ZWQuCi0JaHctPm1heF90eF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQkgKi8KLQotCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAotCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTOwotCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKLQkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1NNUFMgfAotCQkJICAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7Ci0KLQlpZiAoY2FwYS0+ZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX01GUCkKLQkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19NRlBfQ0FQQUJMRTsKLQotCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2KTsKLQlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3ZpZl9wcml2KTsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+aW50ZXJmYWNlX21vZGVzOwotCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0JfQotCi0JQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7Ci0KLQlpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkpIHsKLQkJaHctPndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSBpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX3AycDsKLQkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9Ci0JCQlBUlJBWV9TSVpFKGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwKTsKLQl9IGVsc2UgaWYgKGh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX0FQKSkgewotCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGU7Ci0JCWh3LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPQotCQkJQVJSQVlfU0laRShpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX2R1YWxtb2RlKTsKLQl9Ci0KLQlody0+d2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDEwMDA7Ci0KLQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfAotCQkJICAgIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAotCQkJICAgIFdJUEhZX0ZMQUdfSUJTU19SU047Ci0KLQlpZiAocHJpdi0+dWNvZGVfd293bGFuLmNvZGUubGVuICYmIGRldmljZV9jYW5fd2FrZXVwKGJ1cyhwcml2KS0+ZGV2KSkgewotCQlody0+d2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9NQUdJQ19QS1QgfAotCQkJCQkgIFdJUEhZX1dPV0xBTl9ESVNDT05ORUNUIHwKLQkJCQkJICBXSVBIWV9XT1dMQU5fRUFQX0lERU5USVRZX1JFUSB8Ci0JCQkJCSAgV0lQSFlfV09XTEFOX1JGS0lMTF9SRUxFQVNFOwotCQlpZiAoIWl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykKLQkJCWh3LT53aXBoeS0+d293bGFuLmZsYWdzIHw9Ci0JCQkJV0lQSFlfV09XTEFOX1NVUFBPUlRTX0dUS19SRUtFWSB8Ci0JCQkJV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFOwotCi0JCWh3LT53aXBoeS0+d293bGFuLm5fcGF0dGVybnMgPSBJV0xBR05fV09XTEFOX01BWF9QQVRURVJOUzsKLQkJaHctPndpcGh5LT53b3dsYW4ucGF0dGVybl9taW5fbGVuID0KLQkJCQkJSVdMQUdOX1dPV0xBTl9NSU5fUEFUVEVSTl9MRU47Ci0JCWh3LT53aXBoeS0+d293bGFuLnBhdHRlcm5fbWF4X2xlbiA9Ci0JCQkJCUlXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5fTEVOOwotCX0KLQotCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5wb3dlcl9zYXZlKQotCQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKLQllbHNlCi0JCWh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKLQotCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYOwotCS8qIHdlIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciBhbmQgYSB6ZXJvLWxlbmd0aCBTU0lEIGVsZW1lbnQgKi8KLQlody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9IGNhcGEtPm1heF9wcm9iZV9sZW5ndGggLSAyNCAtIDI7Ci0KLQkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KLQlody0+cXVldWVzID0gNDsKLQotCWh3LT5tYXhfbGlzdGVuX2ludGVydmFsID0gSVdMX0NPTk5fTUFYX0xJU1RFTl9JTlRFUlZBTDsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKLQlpZiAocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscykKLQkJcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9Ci0JCQkmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07Ci0KLQlpd2xfbGVkc19pbml0KHByaXYpOwotCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWdpc3RlciBodyAoZXJyb3IgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQkvKiB3ZSBzaG91bGQgYmUgdmVyaWZ5aW5nIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgb3BlbmVkICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCXJldCA9IF9faXdsX3VwKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhcnQgVVAgd29yayBkb25lLlxuIik7Ci0KLQkvKiBOb3cgd2Ugc2hvdWxkIGJlIGRvbmUsIGFuZCB0aGUgUkVBRFkgYml0IHNob3VsZCBiZSBzZXQuICovCi0JaWYgKFdBUk5fT04oIXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnNocmQtPnN0YXR1cykpKQotCQlyZXQgPSAtRUlPOwotCi0JaXdsYWduX2xlZF9lbmFibGUocHJpdik7Ci0KLQlwcml2LT5pc19vcGVuID0gMTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAoIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCXByaXYtPmlzX29wZW4gPSAwOwotCi0JaXdsX2Rvd24ocHJpdik7Ci0KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+c2hyZC0+d29ya3F1ZXVlKTsKLQotCS8qIFVzZXIgc3BhY2Ugc29mdHdhcmUgbWF5IGV4cGVjdCBnZXR0aW5nIHJma2lsbCBjaGFuZ2VzCi0JICogZXZlbiBpZiBpbnRlcmZhY2UgaXMgZG93biAqLwotCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7Ci0JaXdsX2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgaXdsYWduX3NlbmRfcGF0dGVybnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbikKLXsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9wYXR0ZXJuc19jbWQgKnBhdHRlcm5fY21kOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9XT1dMQU5fUEFUVEVSTlMsCi0JCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAotCQkuZmxhZ3MgPSBDTURfU1lOQywKLQl9OwotCWludCBpLCBlcnI7Ci0KLQlpZiAoIXdvd2xhbi0+bl9wYXR0ZXJucykKLQkJcmV0dXJuIDA7Ci0KLQljbWQubGVuWzBdID0gc2l6ZW9mKCpwYXR0ZXJuX2NtZCkgKwotCQkJd293bGFuLT5uX3BhdHRlcm5zICogc2l6ZW9mKHN0cnVjdCBpd2xhZ25fd293bGFuX3BhdHRlcm4pOwotCi0JcGF0dGVybl9jbWQgPSBrbWFsbG9jKGNtZC5sZW5bMF0sIEdGUF9LRVJORUwpOwotCWlmICghcGF0dGVybl9jbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGF0dGVybl9jbWQtPm5fcGF0dGVybnMgPSBjcHVfdG9fbGUzMih3b3dsYW4tPm5fcGF0dGVybnMpOwotCi0JZm9yIChpID0gMDsgaSA8IHdvd2xhbi0+bl9wYXR0ZXJuczsgaSsrKSB7Ci0JCWludCBtYXNrX2xlbiA9IERJVl9ST1VORF9VUCh3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuLCA4KTsKLQotCQltZW1jcHkoJnBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5tYXNrLAotCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5tYXNrLCBtYXNrX2xlbik7Ci0JCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLnBhdHRlcm4sCi0JCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm4sCi0JCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBhdHRlcm5fbGVuKTsKLQkJcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2tfc2l6ZSA9IG1hc2tfbGVuOwotCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybl9zaXplID0KLQkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW47Ci0JfQotCi0JY21kLmRhdGFbMF0gPSBwYXR0ZXJuX2NtZDsKLQllcnIgPSBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZjbWQpOwotCWtmcmVlKHBhdHRlcm5fY21kKTsKLQlyZXR1cm4gZXJyOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfc2V0X3Jla2V5X2RhdGEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlpZiAoaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udmlmICE9IHZpZikKLQkJZ290byBvdXQ7Ci0KLQltZW1jcHkocHJpdi0+a2VrLCBkYXRhLT5rZWssIE5MODAyMTFfS0VLX0xFTik7Ci0JbWVtY3B5KHByaXYtPmtjaywgZGF0YS0+a2NrLCBOTDgwMjExX0tDS19MRU4pOwotCXByaXYtPnJlcGxheV9jdHIgPSBjcHVfdG9fbGU2NChiZTY0X3RvX2NwdXAoKF9fYmU2NCAqKSZkYXRhLT5yZXBsYXlfY3RyKSk7Ci0JcHJpdi0+aGF2ZV9yZWtleV9kYXRhID0gdHJ1ZTsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RydWN0IHdvd2xhbl9rZXlfZGF0YSB7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9yc2NfdHNjX3BhcmFtc19jbWQgKnJzY190c2M7Ci0Jc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kICp0a2lwOwotCWNvbnN0IHU4ICpic3NpZDsKLQlib29sIGVycm9yLCB1c2VfcnNjX3RzYywgdXNlX3RraXA7Ci19OwotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgdm9pZCBpd2xhZ25fY29udmVydF9wMWsodTE2ICpwMWssIF9fbGUxNiAqb3V0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IElXTEFHTl9QMUtfU0laRTsgaSsrKQotCQlvdXRbaV0gPSBjcHVfdG9fbGUxNihwMWtbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fd293bGFuX3Byb2dyYW1fa2V5cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LAotCQkJCSAgICAgICB2b2lkICpfZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhICpkYXRhID0gX2RhdGE7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGRhdGEtPmN0eDsKLQlzdHJ1Y3QgYWVzX3NjICphZXNfc2MsICphZXNfdHhfc2MgPSBOVUxMOwotCXN0cnVjdCB0a2lwX3NjICp0a2lwX3NjLCAqdGtpcF90eF9zYyA9IE5VTEw7Ci0Jc3RydWN0IGl3bGFnbl9wMWtfY2FjaGUgKnJ4X3Axa3M7Ci0JdTggKnJ4X21pY19rZXk7Ci0Jc3RydWN0IGllZWU4MDIxMV9rZXlfc2VxIHNlcTsKLQl1MzIgY3VyX3J4X2l2MzIgPSAwOwotCXUxNiBwMWtbSVdMQUdOX1AxS19TSVpFXTsKLQlpbnQgcmV0LCBpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSAmJgotCSAgICAgIXN0YSAmJiAhY3R4LT5rZXlfbWFwcGluZ19rZXlzKQotCQlyZXQgPSBpd2xfc2V0X2RlZmF1bHRfd2VwX2tleShwcml2LCBjdHgsIGtleSk7Ci0JZWxzZQotCQlyZXQgPSBpd2xfc2V0X2R5bmFtaWNfa2V5KHByaXYsIGN0eCwga2V5LCBzdGEpOwotCi0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIGtleSBkdXJpbmcgc3VzcGVuZCFcbiIpOwotCQlkYXRhLT5lcnJvciA9IHRydWU7Ci0JfQotCi0Jc3dpdGNoIChrZXktPmNpcGhlcikgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJaWYgKHN0YSkgewotCQkJdGtpcF9zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLnRraXAudW5pY2FzdF9yc2M7Ci0JCQl0a2lwX3R4X3NjID0gJmRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLnRraXAudHNjOwotCi0JCQlyeF9wMWtzID0gZGF0YS0+dGtpcC0+cnhfdW5pOwotCi0JCQlpZWVlODAyMTFfZ2V0X2tleV90eF9zZXEoa2V5LCAmc2VxKTsKLQkJCXRraXBfdHhfc2MtPml2MTYgPSBjcHVfdG9fbGUxNihzZXEudGtpcC5pdjE2KTsKLQkJCXRraXBfdHhfc2MtPml2MzIgPSBjcHVfdG9fbGUzMihzZXEudGtpcC5pdjMyKTsKLQotCQkJaWVlZTgwMjExX2dldF90a2lwX3Axa19pdihrZXksIHNlcS50a2lwLml2MzIsIHAxayk7Ci0JCQlpd2xhZ25fY29udmVydF9wMWsocDFrLCBkYXRhLT50a2lwLT50eC5wMWspOwotCi0JCQltZW1jcHkoZGF0YS0+dGtpcC0+bWljX2tleXMudHgsCi0JCQkgICAgICAgJmtleS0+a2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9UWF9NSUNfS0VZXSwKLQkJCSAgICAgICBJV0xBR05fTUlDX0tFWV9TSVpFKTsKLQotCQkJcnhfbWljX2tleSA9IGRhdGEtPnRraXAtPm1pY19rZXlzLnJ4X3VuaWNhc3Q7Ci0JCX0gZWxzZSB7Ci0JCQl0a2lwX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC5tdWx0aWNhc3RfcnNjOwotCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X211bHRpOwotCQkJcnhfbWljX2tleSA9IGRhdGEtPnRraXAtPm1pY19rZXlzLnJ4X21jYXN0OwotCQl9Ci0KLQkJLyoKLQkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKLQkJICogbWFjODAyMTEgdXNlIFRJRCAwIChhcyB0aGV5IG5lZWQgdG8gdG8gYXZvaWQgcmVwbGF5IGF0dGFja3MpCi0JCSAqIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7Ci0JCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5LCBpLCAmc2VxKTsKLQkJCXRraXBfc2NbaV0uaXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOwotCQkJdGtpcF9zY1tpXS5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7Ci0JCQkvKiB3cmFwcGluZyBpc24ndCBhbGxvd2VkLCBBUCBtdXN0IHJla2V5ICovCi0JCQlpZiAoc2VxLnRraXAuaXYzMiA+IGN1cl9yeF9pdjMyKQotCQkJCWN1cl9yeF9pdjMyID0gc2VxLnRraXAuaXYzMjsKLQkJfQotCi0JCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5LCBkYXRhLT5ic3NpZCwgY3VyX3J4X2l2MzIsIHAxayk7Ci0JCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIHJ4X3Axa3NbMF0ucDFrKTsKLQkJaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayhrZXksIGRhdGEtPmJzc2lkLAotCQkJCQkgIGN1cl9yeF9pdjMyICsgMSwgcDFrKTsKLQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgcnhfcDFrc1sxXS5wMWspOwotCi0JCW1lbWNweShyeF9taWNfa2V5LAotCQkgICAgICAgJmtleS0+a2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZXSwKLQkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOwotCi0JCWRhdGEtPnVzZV90a2lwID0gdHJ1ZTsKLQkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCWlmIChzdGEpIHsKLQkJCXU4ICpwbiA9IHNlcS5jY21wLnBuOwotCi0JCQlhZXNfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMudW5pY2FzdF9yc2M7Ci0JCQlhZXNfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLnRzYzsKLQotCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7Ci0JCQlhZXNfdHhfc2MtPnBuID0gY3B1X3RvX2xlNjQoCi0JCQkJCSh1NjQpcG5bNV0gfAotCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8Ci0JCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8Ci0JCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8Ci0JCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8Ci0JCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7Ci0JCX0gZWxzZQotCQkJYWVzX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLm11bHRpY2FzdF9yc2M7Ci0KLQkJLyoKLQkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKLQkJICogbWFjODAyMTEgdXNlIFRJRCAwIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7Ci0JCQl1OCAqcG4gPSBzZXEuY2NtcC5wbjsKLQotCQkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleSwgaSwgJnNlcSk7Ci0JCQlhZXNfc2MtPnBuID0gY3B1X3RvX2xlNjQoCi0JCQkJCSh1NjQpcG5bNV0gfAotCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8Ci0JCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8Ci0JCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8Ci0JCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8Ci0JCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7Ci0JCX0KLQkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3N1c3BlbmQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bGFnbl93b3dsYW5fd2FrZXVwX2ZpbHRlcl9jbWQgd2FrZXVwX2ZpbHRlcl9jbWQ7Ci0Jc3RydWN0IGl3bF9yeG9uX2NtZCByeG9uOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGl3bGFnbl93b3dsYW5fa2VrX2tja19tYXRlcmlhbF9jbWQga2VrX2tja19jbWQ7Ci0Jc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kIHRraXBfY21kID0ge307Ci0Jc3RydWN0IHdvd2xhbl9rZXlfZGF0YSBrZXlfZGF0YSA9IHsKLQkJLmN0eCA9IGN0eCwKLQkJLmJzc2lkID0gY3R4LT5hY3RpdmUuYnNzaWRfYWRkciwKLQkJLnVzZV9yc2NfdHNjID0gZmFsc2UsCi0JCS50a2lwID0gJnRraXBfY21kLAotCQkudXNlX3RraXAgPSBmYWxzZSwKLQl9OwotCXN0cnVjdCBpd2xhZ25fZDNfY29uZmlnX2NtZCBkM19jZmdfY21kID0ge307Ci0JaW50IHJldCwgaTsKLQl1MTYgc2VxOwotCi0JaWYgKFdBUk5fT04oIXdvd2xhbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyogRG9uJ3QgYXR0ZW1wdCBXb1dMQU4gd2hlbiBub3QgYXNzb2NpYXRlZCwgdGVhciBkb3duIGluc3RlYWQuICovCi0JaWYgKCFjdHgtPnZpZiB8fCBjdHgtPnZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JICAgICFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlrZXlfZGF0YS5yc2NfdHNjID0ga3phbGxvYyhzaXplb2YoKmtleV9kYXRhLnJzY190c2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleV9kYXRhLnJzY190c2MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtc2V0KCZ3YWtldXBfZmlsdGVyX2NtZCwgMCwgc2l6ZW9mKHdha2V1cF9maWx0ZXJfY21kKSk7Ci0KLQkvKgotCSAqIFdlIGtub3cgdGhlIGxhc3QgdXNlZCBzZXFubywgYW5kIHRoZSB1Q29kZSBleHBlY3RzIHRvIGtub3cgdGhhdAotCSAqIG9uZSwgaXQgd2lsbCBpbmNyZW1lbnQgYmVmb3JlIFRYLgotCSAqLwotCXNlcSA9IGxlMTZfdG9fY3B1KHByaXYtPmxhc3Rfc2VxX2N0bCkgJiBJRUVFODAyMTFfU0NUTF9TRVE7Ci0Jd2FrZXVwX2ZpbHRlcl9jbWQubm9uX3Fvc19zZXEgPSBjcHVfdG9fbGUxNihzZXEpOwotCi0JLyoKLQkgKiBGb3IgUW9TIGNvdW50ZXJzLCB3ZSBzdG9yZSB0aGUgb25lIHRvIHVzZSBuZXh0LCBzbyBzdWJ0cmFjdCAweDEwCi0JICogc2luY2UgdGhlIHVDb2RlIHdpbGwgYWRkIDB4MTAgYmVmb3JlIHVzaW5nIHRoZSB2YWx1ZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNlcSA9IHByaXYtPnNocmQtPnRpZF9kYXRhW0lXTF9BUF9JRF1baV0uc2VxX251bWJlcjsKLQkJc2VxIC09IDB4MTA7Ci0JCXdha2V1cF9maWx0ZXJfY21kLnFvc19zZXFbaV0gPSBjcHVfdG9fbGUxNihzZXEpOwotCX0KLQotCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTIHwKLQkJCQkgICAgSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UpOwotCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUKTsKLQlpZiAod293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwpOwotCWlmICh3b3dsYW4tPmVhcF9pZGVudGl0eV9yZXEpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0VBUF9JREVOVF9SRVEpOwotCWlmICh3b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfNFdBWV9IQU5EU0hBS0UpOwotCWlmICh3b3dsYW4tPm5fcGF0dGVybnMpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gpOwotCi0JaWYgKHdvd2xhbi0+cmZraWxsX3JlbGVhc2UpCi0JCWQzX2NmZ19jbWQud2FrZXVwX2ZsYWdzIHw9Ci0JCQljcHVfdG9fbGUzMihJV0xBR05fRDNfV0FLRVVQX1JGS0lMTCk7Ci0KLQlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCi0JbWVtY3B5KCZyeG9uLCAmY3R4LT5hY3RpdmUsIHNpemVvZihyeG9uKSk7Ci0KLQlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOwotCi0JcHJpdi0+c2hyZC0+d293bGFuID0gdHJ1ZTsKLQotCXJldCA9IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbiwKLQkJCQkJICAgSVdMX1VDT0RFX1dPV0xBTik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCS8qIG5vdyBjb25maWd1cmUgV29XTEFOIHVjb2RlICovCi0JcmV0ID0gaXdsX2FsaXZlX3N0YXJ0KHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQltZW1jcHkoJmN0eC0+c3RhZ2luZywgJnJ4b24sIHNpemVvZihyeG9uKSk7Ci0JcmV0ID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IGl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCB0cnVlKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JaWYgKCFpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pIHsKLQkJLyogbWFyayBhbGwga2V5cyBjbGVhciAqLwotCQlwcml2LT51Y29kZV9rZXlfdGFibGUgPSAwOwotCQljdHgtPmtleV9tYXBwaW5nX2tleXMgPSAwOwotCi0JCS8qCi0JCSAqIFRoaXMgbmVlZHMgdG8gYmUgdW5sb2NrZWQgZHVlIHRvIGxvY2sgb3JkZXJpbmcKLQkJICogY29uc3RyYWludHMuIFNpbmNlIHdlJ3JlIGluIHRoZSBzdXNwZW5kIHBhdGgKLQkJICogdGhhdCBpc24ndCByZWFsbHkgYSBwcm9ibGVtIHRob3VnaC4KLQkJICovCi0JCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCQlpZWVlODAyMTFfaXRlcl9rZXlzKHByaXYtPmh3LCBjdHgtPnZpZiwKLQkJCQkgICAgaXdsYWduX3dvd2xhbl9wcm9ncmFtX2tleXMsCi0JCQkJICAgICZrZXlfZGF0YSk7Ci0JCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQkJaWYgKGtleV9kYXRhLmVycm9yKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChrZXlfZGF0YS51c2VfcnNjX3RzYykgewotCQkJc3RydWN0IGl3bF9ob3N0X2NtZCByc2NfdHNjX2NtZCA9IHsKLQkJCQkuaWQgPSBSRVBMWV9XT1dMQU5fVFNDX1JTQ19QQVJBTVMsCi0JCQkJLmZsYWdzID0gQ01EX1NZTkMsCi0JCQkJLmRhdGFbMF0gPSBrZXlfZGF0YS5yc2NfdHNjLAotCQkJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAotCQkJCS5sZW5bMF0gPSBzaXplb2YoKmtleV9kYXRhLnJzY190c2MpLAotCQkJfTsKLQotCQkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kKHRyYW5zKHByaXYpLCAmcnNjX3RzY19jbWQpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaWYgKGtleV9kYXRhLnVzZV90a2lwKSB7Ci0JCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAotCQkJCQkJIFJFUExZX1dPV0xBTl9US0lQX1BBUkFNUywKLQkJCQkJCSBDTURfU1lOQywgc2l6ZW9mKHRraXBfY21kKSwKLQkJCQkJCSAmdGtpcF9jbWQpOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaWYgKHByaXYtPmhhdmVfcmVrZXlfZGF0YSkgewotCQkJbWVtc2V0KCZrZWtfa2NrX2NtZCwgMCwgc2l6ZW9mKGtla19rY2tfY21kKSk7Ci0JCQltZW1jcHkoa2VrX2tja19jbWQua2NrLCBwcml2LT5rY2ssIE5MODAyMTFfS0NLX0xFTik7Ci0JCQlrZWtfa2NrX2NtZC5rY2tfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LQ0tfTEVOKTsKLQkJCW1lbWNweShrZWtfa2NrX2NtZC5rZWssIHByaXYtPmtlaywgTkw4MDIxMV9LRUtfTEVOKTsKLQkJCWtla19rY2tfY21kLmtla19sZW4gPSBjcHVfdG9fbGUxNihOTDgwMjExX0tFS19MRU4pOwotCQkJa2VrX2tja19jbWQucmVwbGF5X2N0ciA9IHByaXYtPnJlcGxheV9jdHI7Ci0KLQkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCi0JCQkJCQkgUkVQTFlfV09XTEFOX0tFS19LQ0tfTUFURVJJQUwsCi0JCQkJCQkgQ01EX1NZTkMsIHNpemVvZihrZWtfa2NrX2NtZCksCi0JCQkJCQkgJmtla19rY2tfY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCX0KLQotCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksIFJFUExZX0QzX0NPTkZJRywgQ01EX1NZTkMsCi0JCQkJICAgICBzaXplb2YoZDNfY2ZnX2NtZCksICZkM19jZmdfY21kKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfV09XTEFOX1dBS0VVUF9GSUxURVIsCi0JCQkJIENNRF9TWU5DLCBzaXplb2Yod2FrZXVwX2ZpbHRlcl9jbWQpLAotCQkJCSAmd2FrZXVwX2ZpbHRlcl9jbWQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBpd2xhZ25fc2VuZF9wYXR0ZXJucyhwcml2LCB3b3dsYW4pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoYnVzKHByaXYpLT5kZXYsIHRydWUpOwotCi0JLyogTm93IGxldCB0aGUgdWNvZGUgb3BlcmF0ZSBvbiBpdHMgb3duICovCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCi0JCQkgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUpOwotCi0JZ290byBvdXQ7Ci0KLSBlcnJvcjoKLQlwcml2LT5zaHJkLT53b3dsYW4gPSBmYWxzZTsKLQlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOwotCWllZWU4MDIxMV9yZXN0YXJ0X2h3KHByaXYtPmh3KTsKLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0Ja2ZyZWUoa2V5X2RhdGEucnNjX3RzYyk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBiYXNlLCBzdGF0dXMgPSAweGZmZmZmZmZmOwotCWludCByZXQgPSAtRUlPOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCi0JCQkgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUpOwotCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5lcnJvcl9ldmVudF90YWJsZTsKLQlpZiAoaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJ1cyhwcml2KS0+cmVnX2xvY2ssIGZsYWdzKTsKLQkJcmV0ID0gaXdsX2dyYWJfbmljX2FjY2Vzc19zaWxlbnQoYnVzKHByaXYpKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlpd2xfd3JpdGUzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkFERFIsIGJhc2UpOwotCQkJc3RhdHVzID0gaXdsX3JlYWQzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKGJ1cyhwcml2KSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzKHByaXYpLT5yZWdfbG9jaywgZmxhZ3MpOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwotCQlpZiAocmV0ID09IDApIHsKLQkJCWlmICghcHJpdi0+d293bGFuX3NyYW0pCi0JCQkJcHJpdi0+d293bGFuX3NyYW0gPQotCQkJCQlremFsbG9jKHByaXYtPnVjb2RlX3dvd2xhbi5kYXRhLmxlbiwKLQkJCQkJCUdGUF9LRVJORUwpOwotCi0JCQlpZiAocHJpdi0+d293bGFuX3NyYW0pCi0JCQkJX2l3bF9yZWFkX3RhcmdfbWVtX3dvcmRzKAotCQkJCQlidXMocHJpdiksIDB4ODAwMDAwLCBwcml2LT53b3dsYW5fc3JhbSwKLQkJCQkJcHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuIC8gNCk7Ci0JCX0KLSNlbmRpZgotCX0KLQotCS8qIHdlJ2xsIGNsZWFyIGN0eC0+dmlmIGR1cmluZyBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KCkgKi8KLQl2aWYgPSBjdHgtPnZpZjsKLQotCXByaXYtPnNocmQtPndvd2xhbiA9IGZhbHNlOwotCi0JZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKGJ1cyhwcml2KS0+ZGV2LCBmYWxzZSk7Ci0KLQlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOwotCi0JbWVtc2V0KCh2b2lkICopJmN0eC0+YWN0aXZlLCAwLCBzaXplb2YoY3R4LT5hY3RpdmUpKTsKLQlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOwotCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3QodmlmKTsKLQotCXJldHVybiAxOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlJV0xfREVCVUdfTUFDRFVNUChwcml2LCAiZW50ZXJcbiIpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKLQkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOwotCi0JaWYgKGl3bGFnbl90eF9za2IocHJpdiwgc2tiKSkKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQotCUlXTF9ERUJVR19NQUNEVU1QKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgICAgICB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlpd2xfdXBkYXRlX3RraXBfa2V5KHByaXYsIHZpZiwga2V5Y29uZiwgc3RhLCBpdjMyLCBwaGFzZTFrZXkpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKLQlpbnQgcmV0OwotCWJvb2wgaXNfZGVmYXVsdF93ZXBfa2V5ID0gZmFsc2U7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQotCS8qCi0JICogV2UgY291bGQgcHJvZ3JhbSB0aGVzZSBrZXlzIGludG8gdGhlIGhhcmR3YXJlIGFzIHdlbGwsIGJ1dCB3ZQotCSAqIGRvbid0IGV4cGVjdCBtdWNoIG11bHRpY2FzdCB0cmFmZmljIGluIElCU1MgYW5kIGhhdmluZyBrZXlzCi0JICogZm9yIG1vcmUgc3RhdGlvbnMgaXMgcHJvYmFibHkgbW9yZSB1c2VmdWwuCi0JICoKLQkgKiBNYXJrIGtleSBUWC1vbmx5IGFuZCByZXR1cm4gMC4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCi0JICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpIHsKLQkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBJZiB0aGV5IGtleSB3YXMgVFgtb25seSwgYWNjZXB0IGRlbGV0aW9uICovCi0JaWYgKGNtZCA9PSBESVNBQkxFX0tFWSAmJiBrZXktPmh3X2tleV9pZHggPT0gV0VQX0lOVkFMSURfT0ZGU0VUKQotCQlyZXR1cm4gMDsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOwotCi0JQlVJTERfQlVHX09OKFdFUF9JTlZBTElEX09GRlNFVCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQpOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKLQkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQotCSAqIGluIDFYIG1vZGUuCi0JICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgotCSAqLwotCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYgIXN0YSkgewotCQlpZiAoY21kID09IFNFVF9LRVkpCi0JCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOwotCQllbHNlCi0JCQlpc19kZWZhdWx0X3dlcF9rZXkgPQotCQkJCWtleS0+aHdfa2V5X2lkeCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQ7Ci0JfQotCi0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0VUX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkgewotCQkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5KTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5LCBzdGEpOwotCQlpZiAocmV0KSB7Ci0JCQkvKgotCQkJICogY2FuJ3QgYWRkIGtleSBmb3IgUlgsIGJ1dCB3ZSBkb24ndCBuZWVkIGl0Ci0JCQkgKiBpbiB0aGUgZGV2aWNlIGZvciBUWCBzbyBzdGlsbCByZXR1cm4gMAotCQkJICovCi0JCQlyZXQgPSAwOwotCQkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCQl9Ci0KLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBESVNBQkxFX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKLQkJCXJldCA9IGl3bF9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsX3JlbW92ZV9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKLQotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24sCi0JCQkJICAgdTggYnVmX3NpemUpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKLQkJICAgICBzdGEtPmFkZHIsIHRpZCk7Ci0KLQlpZiAoIShwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpKQotCQlyZXR1cm4gLUVBQ0NFUzsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgUnhcbiIpOwotCQlyZXQgPSBpd2xfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7Ci0JCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0b3AocHJpdiwgc3RhLCB0aWQpOwotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCi0JCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBUeFxuIik7Ci0JCXJldCA9IGl3bGFnbl90eF9hZ2dfc3RhcnQocHJpdiwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFR4XG4iKTsKLQkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOwotCQlpZiAoKHJldCA9PSAwKSAmJiAocHJpdi0+YWdnX3RpZHNfY291bnQgPiAwKSkgewotCQkJcHJpdi0+YWdnX3RpZHNfY291bnQtLTsKLQkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKLQkJCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKLQkJfQotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCi0JCQlyZXQgPSAwOwotCQlpZiAoIXByaXYtPmFnZ190aWRzX2NvdW50ICYmIHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCi0JCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKLQkJCS8qCi0JCQkgKiBzd2l0Y2ggb2ZmIFJUUy9DVFMgaWYgaXQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZAotCQkJICovCi0JCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzICY9Ci0JCQkJfkxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOwotCQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLAotCQkJCQkmc3RhX3ByaXYtPmxxX3N0YS5scSwgQ01EX0FTWU5DLCBmYWxzZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6Ci0JCWJ1Zl9zaXplID0gbWluX3QoaW50LCBidWZfc2l6ZSwgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUYpOwotCi0JCWl3bF90cmFuc190eF9hZ2dfc2V0dXAodHJhbnMocHJpdiksIGN0eC0+Y3R4aWQsIGl3bF9zdGFfaWQoc3RhKSwKLQkJCQl0aWQsIGJ1Zl9zaXplKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgbGltaXQgaXMgMCwgdGhlbiBpdCB3YXNuJ3QgaW5pdGlhbGlzZWQgeWV0LAotCQkgKiB1c2UgdGhlIGRlZmF1bHQuIFdlIGNhbiBkbyB0aGF0IHNpbmNlIHdlIHRha2UgdGhlCi0JCSAqIG1pbmltdW0gYmVsb3csIGFuZCB3ZSBkb24ndCB3YW50IHRvIGdvIGFib3ZlIG91cgotCQkgKiBkZWZhdWx0IGR1ZSB0byBoYXJkd2FyZSByZXN0cmljdGlvbnMuCi0JCSAqLwotCQlpZiAoc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9PSAwKQotCQkJc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9Ci0JCQkJTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUY7Ci0KLQkJLyoKLQkJICogRXZlbiB0aG91Z2ggaW4gdGhlb3J5IHRoZSBwZWVyIGNvdWxkIGhhdmUgZGlmZmVyZW50Ci0JCSAqIGFnZ3JlZ2F0aW9uIHJlb3JkZXIgYnVmZmVyIHNpemVzIGZvciBkaWZmZXJlbnQgc2Vzc2lvbnMsCi0JCSAqIG91ciB1Y29kZSBkb2Vzbid0IGFsbG93IGZvciB0aGF0IGFuZCBoYXMgYSBnbG9iYWwgbGltaXQKLQkJICogZm9yIGVhY2ggc3RhdGlvbi4gVGhlcmVmb3JlLCB1c2UgdGhlIG1pbmltdW0gb2YgYWxsIHRoZQotCQkgKiBhZ2dyZWdhdGlvbiBzZXNzaW9ucyBhbmQgb3VyIGRlZmF1bHQgdmFsdWUuCi0JCSAqLwotCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID0KLQkJCW1pbihzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplLCBidWZfc2l6ZSk7Ci0KLQkJaWYgKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCi0JCSAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKLQkJCS8qCi0JCQkgKiBzd2l0Y2ggdG8gUlRTL0NUUyBpZiBpdCBpcyB0aGUgcHJlZmVyIHByb3RlY3Rpb24KLQkJCSAqIG1ldGhvZCBmb3IgSFQgdHJhZmZpYwotCQkJICovCi0KLQkJCXN0YV9wcml2LT5scV9zdGEubHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MgfD0KLQkJCQlMSU5LX1FVQUxfRkxBR1NfU0VUX1NUQV9UTENfUlRTX01TSzsKLQkJfQotCQlwcml2LT5hZ2dfdGlkc19jb3VudCsrOwotCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCi0JCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKLQotCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmFnZ19wYXJhbXMuYWdnX2ZyYW1lX2NudF9saW1pdCA9Ci0JCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplOwotCi0JCWl3bF9zZW5kX2xxX2NtZChwcml2LCBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKSwKLQkJCQkmc3RhX3ByaXYtPmxxX3N0YS5scSwgQ01EX0FTWU5DLCBmYWxzZSk7Ci0KLQkJSVdMX0lORk8ocHJpdiwgIlR4IGFnZ3JlZ2F0aW9uIGVuYWJsZWQgb24gcmEgPSAlcE0gdGlkID0gJWRcbiIsCi0JCQkgc3RhLT5hZGRyLCB0aWQpOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0JYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCWludCByZXQgPSAwOwotCXU4IHN0YV9pZDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCXN0YV9wcml2LT5zdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCi0JYXRvbWljX3NldCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzLCAwKTsKLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQotCQlzdGFfcHJpdi0+Y2xpZW50ID0gdHJ1ZTsKLQotCXJldCA9IGl3bF9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLAotCQkJCSAgICAgaXNfYXAsIHN0YSwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsCi0JCQlzdGEtPmFkZHIsIHJldCk7Ci0JCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzdGFfcHJpdi0+c3RhX2lkID0gc3RhX2lkOwotCi0JLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCi0JCSAgICAgICBzdGEtPmFkZHIpOwotCWl3bF9yc19yYXRlX2luaXQocHJpdiwgc3RhLCBzdGFfaWQpOwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjaF9zd2l0Y2gtPmNoYW5uZWw7Ci0Jc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYgPSAmcHJpdi0+Y3VycmVudF9odF9jb25maWc7Ci0JLyoKLQkgKiBNVUxUSS1GSVhNRQotCSAqIFdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGludGVyZmFjZXMsIHdlIG5lZWQgdG8KLQkgKiByZXZpc2l0IHRoaXMuIFRoZSBjaGFubmVsIHN3aXRjaCBjb21tYW5kIGluIHRoZSBkZXZpY2UKLQkgKiBvbmx5IGFmZmVjdHMgdGhlIEJTUyBjb250ZXh0LCBidXQgd2hhdCBkb2VzIHRoYXQgcmVhbGx5Ci0JICogbWVhbj8gQW5kIHdoYXQgaWYgd2UgZ2V0IGEgQ1NBIG9uIHRoZSBzZWNvbmQgaW50ZXJmYWNlPwotCSAqIFRoaXMgbmVlZHMgYSBsb3Qgb2Ygd29yay4KLQkgKi8KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXUxNiBjaDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKGl3bF9pc19yZmtpbGwocHJpdi0+c2hyZCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFwcml2LT5jZmctPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQotCQlnb3RvIG91dDsKLQotCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7Ci0JaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpID09IGNoKQotCQlnb3RvIG91dDsKLQotCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7Ci0JaWYgKCFpc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7Ci0KLQlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOwotCi0JLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KLQljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOwotCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKLQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7Ci0JCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UKLQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCi0JaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOwotCi0JaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKLQlpd2xfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7Ci0JaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7Ci0KLQlpd2xfc2V0X3JhdGUocHJpdik7Ci0JLyoKLQkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCi0JICovCi0Jc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0JcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JaWYgKHByaXYtPmNmZy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgewotCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOwotCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7Ci0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7Ci0JfQotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCQkgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCQkgICAgdTY0IG11bHRpY2FzdCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLSNkZWZpbmUgQ0hLKHRlc3QsIGZsYWcpCWRvIHsgXAotCWlmICgqdG90YWxfZmxhZ3MgJiAodGVzdCkpCQlcCi0JCWZpbHRlcl9vciB8PSAoZmxhZyk7CQlcCi0JZWxzZQkJCQkJXAotCQlmaWx0ZXJfbmFuZCB8PSAoZmxhZyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLAotCQkJY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKLQotCUNISyhGSUZfT1RIRVJfQlNTIHwgRklGX1BST01JU0NfSU5fQlNTLCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7Ci0JLyogU2V0dGluZyBfanVzdF8gUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIGNhdXNlcyBGSCBlcnJvcnMgKi8KLQlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKLQotI3VuZGVmIENISwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOwotCi0JCS8qCi0JCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAotCQkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgotCQkgKi8KLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCS8qCi0JICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQotCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoKQotCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwcm9ncmFtbWluZyBtdWx0aWNhc3QKLQkgKiBmaWx0ZXJzIGludG8gdGhlIGRldmljZS4KLQkgKi8KLQkqdG90YWxfZmxhZ3MgJj0gRklGX09USEVSX0JTUyB8IEZJRl9BTExNVUxUSSB8IEZJRl9QUk9NSVNDX0lOX0JTUyB8Ci0JCQlGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CiAKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJBYm9ydGluZyBmbHVzaCBkdWUgdG8gZGV2aWNlIHNodXRkb3duXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkgewotCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBSRiBLaWxsXG4iKTsKLQkJZ290byBkb25lOwotCX0KIAotCS8qCi0JICogbWFjODAyMTEgd2lsbCBub3QgcHVzaCBhbnkgbW9yZSBmcmFtZXMgZm9yIHRyYW5zbWl0Ci0JICogdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlZAotCSAqLwotCWlmIChkcm9wKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAic2VuZCBmbHVzaCBjb21tYW5kXG4iKTsKLQkJaWYgKGl3bGFnbl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgewotCQkJSVdMX0VSUihwcml2LCAiZmx1c2ggcmVxdWVzdCBmYWlsXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIndhaXQgdHJhbnNtaXQvZmx1c2ggYWxsIGZyYW1lc1xuIik7Ci0JaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkodHJhbnMocHJpdikpOwotZG9uZToKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KIAogdm9pZCBpd2xhZ25fZGlzYWJsZV9yb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpAQCAtMjc2NiwxNjAgKzE0OTIsNiBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwogfQogCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKLQkJCQkgICAgIGludCBkdXJhdGlvbikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoIShjdHgtPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwcml2LT5od19yb2NfY2hhbm5lbCA9IGNoYW5uZWw7Ci0JcHJpdi0+aHdfcm9jX2NoYW50eXBlID0gY2hhbm5lbF90eXBlOwotCXByaXYtPmh3X3JvY19kdXJhdGlvbiA9IGR1cmF0aW9uOwotCXByaXYtPmh3X3JvY19zdGFydF9ub3RpZmllZCA9IGZhbHNlOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmh3X3JvY19kaXNhYmxlX3dvcmspOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkgewotCQljdHgtPmlzX2FjdGl2ZSA9IHRydWU7Ci0JCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IFJYT05fREVWX1RZUEVfUDJQOwotCQltZW1jcHkoY3R4LT5zdGFnaW5nLm5vZGVfYWRkciwKLQkJICAgICAgIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YWdpbmcubm9kZV9hZGRyLAotCQkgICAgICAgRVRIX0FMRU4pOwotCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsCi0JCSAgICAgICBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5zdGFnaW5nLm5vZGVfYWRkciwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQkJZXJyID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgfAotCQkJCQkgICAgIFJYT05fRklMVEVSX1BST01JU0NfTVNLIHwKLQkJCQkJICAgICBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0s7Ci0KLQkJZXJyID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JCWlmIChlcnIpIHsKLQkJCWl3bGFnbl9kaXNhYmxlX3JvYyhwcml2KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXByaXYtPmh3X3JvY19zZXR1cCA9IHRydWU7Ci0JfQotCi0JZXJyID0gaXdsX3NjYW5faW5pdGlhdGUocHJpdiwgY3R4LT52aWYsIElXTF9TQ0FOX1JPQywgY2hhbm5lbC0+YmFuZCk7Ci0JaWYgKGVycikKLQkJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOwotCi0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCWlmICghKHByaXYtPnNocmQtPnZhbGlkX2NvbnRleHRzICYgQklUKElXTF9SWE9OX0NUWF9QQU4pKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIHByaXYtPmh3X3JvY19kdXJhdGlvbik7Ci0JaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY190eF9zeW5jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX3R4X3N5bmNfdHlwZSB0eXBlKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OwotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKGl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChjdHgtPnByZWF1dGhfYnNzaWQgfHwgdGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gaXdsX2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCBjdHgsIGJzc2lkLCB0cnVlLCBOVUxMLCAmc3RhX2lkKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWlmIChXQVJOX09OKHN0YV9pZCAhPSBjdHgtPmFwX3N0YV9pZCkpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfcmVtb3ZlX3N0YTsKLQl9Ci0KLQltZW1jcHkoY3R4LT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKLQljdHgtPnByZWF1dGhfYnNzaWQgPSB0cnVlOwotCi0JcmV0ID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0KLQlpZiAocmV0ID09IDApCi0JCWdvdG8gb3V0OwotCi0gb3V0X3JlbW92ZV9zdGE6Ci0JaXdsX3JlbW92ZV9zdGF0aW9uKHByaXYsIHN0YV9pZCwgYnNzaWQpOwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmluaXNoX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBjb25zdCB1OCAqYnNzaWQsCi0JCQkJICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCi0JCWdvdG8gb3V0OwotCi0JaXdsX3JlbW92ZV9zdGF0aW9uKHByaXYsIGN0eC0+YXBfc3RhX2lkLCBic3NpZCk7Ci0JY3R4LT5wcmVhdXRoX2Jzc2lkID0gZmFsc2U7Ci0JLyogbm8gbmVlZCB0byBjb21taXQgKi8KLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIGRyaXZlciBzZXR1cCBhbmQgdGVhcmRvd24KQEAgLTI5NDMsOCArMTUxNSw4IEBACiAKIAlpd2xfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwogCi0JaWYgKHByaXYtPmNmZy0+bGliLT5idF9zZXR1cF9kZWZlcnJlZF93b3JrKQotCQlwcml2LT5jZmctPmxpYi0+YnRfc2V0dXBfZGVmZXJyZWRfd29yayhwcml2KTsKKwlpZiAoY2ZnKHByaXYpLT5saWItPmJ0X3NldHVwX2RlZmVycmVkX3dvcmspCisJCWNmZyhwcml2KS0+bGliLT5idF9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOwogCiAJaW5pdF90aW1lcigmcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYyk7CiAJcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKQEAgLTI5NjEsOCArMTUzMyw4IEBACiAKIHN0YXRpYyB2b2lkIGl3bF9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaWYgKHByaXYtPmNmZy0+bGliLT5jYW5jZWxfZGVmZXJyZWRfd29yaykKLQkJcHJpdi0+Y2ZnLT5saWItPmNhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOworCWlmIChjZmcocHJpdiktPmxpYi0+Y2FuY2VsX2RlZmVycmVkX3dvcmspCisJCWNmZyhwcml2KS0+bGliLT5jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKIAogCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnJ1bl90aW1lX2NhbGliX3dvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPmJlYWNvbl91cGRhdGUpOwpAQCAtMzAwNiw2ICsxNTc4LDggQEAKIAogCW11dGV4X2luaXQoJnByaXYtPnNocmQtPm11dGV4KTsKIAorCUlOSVRfTElTVF9IRUFEKCZ0cmFucyhwcml2KS0+Y2FsaWJfcmVzdWx0cyk7CisKIAlwcml2LT5pZWVlX2NoYW5uZWxzID0gTlVMTDsKIAlwcml2LT5pZWVlX3JhdGVzID0gTlVMTDsKIAlwcml2LT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKQEAgLTMwMjksOCArMTYwMyw4IEBACiAJaXdsX2luaXRfc2Nhbl9wYXJhbXMocHJpdik7CiAKIAkvKiBpbml0IGJ0IGNvZXggKi8KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJcHJpdi0+a2lsbF9hY2tfbWFzayA9IElXTEFHTl9CVF9LSUxMX0FDS19NQVNLX0RFRkFVTFQ7CiAJCXByaXYtPmtpbGxfY3RzX21hc2sgPSBJV0xBR05fQlRfS0lMTF9DVFNfTUFTS19ERUZBVUxUOwogCQlwcml2LT5idF92YWxpZCA9IElXTEFHTl9CVF9BTExfVkFMSURfTVNLOwpAQCAtMzA2Miw4OCArMTYzNiwxOSBAQAogCiBzdGF0aWMgdm9pZCBpd2xfdW5pbml0X2RydihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhwcml2KTsKIAlpd2xfZnJlZV9nZW9zKHByaXYpOwogCWl3bF9mcmVlX2NoYW5uZWxfbWFwKHByaXYpOwogCWlmIChwcml2LT50eF9jbWRfcG9vbCkKIAkJa21lbV9jYWNoZV9kZXN0cm95KHByaXYtPnR4X2NtZF9wb29sKTsKIAlrZnJlZShwcml2LT5zY2FuX2NtZCk7CiAJa2ZyZWUocHJpdi0+YmVhY29uX2NtZCk7CisJa2ZyZWUocmN1X2RlcmVmZXJlbmNlX3Jhdyhwcml2LT5ub2FfZGF0YSkpOwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAlrZnJlZShwcml2LT53b3dsYW5fc3JhbSk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgaXdsYWduX21hY19yc3NpX2NhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JCQlwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewotCQlpZiAocnNzaV9ldmVudCA9PSBSU1NJX0VWRU5UX0xPVykKLQkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSB0cnVlOwotCQllbHNlIGlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfSElHSCkKLQkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSBmYWxzZTsKLQotCQlpd2xhZ25fc2VuZF9hZHZhbmNlX2J0X2NvbmZpZyhwcml2KTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkFkdmFuY2VkIEJUIGNvZXggZGlzYWJsZWQsIgotCQkJCSJpZ25vcmluZyBSU1NJIGNhbGxiYWNrXG4iKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBib29sIHNldCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCXF1ZXVlX3dvcmsocHJpdi0+c2hyZC0+d29ya3F1ZXVlLCAmcHJpdi0+YmVhY29uX3VwZGF0ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsYWduX2h3X29wcyA9IHsKLQkudHggPSBpd2xhZ25fbWFjX3R4LAotCS5zdGFydCA9IGl3bGFnbl9tYWNfc3RhcnQsCi0JLnN0b3AgPSBpd2xhZ25fbWFjX3N0b3AsCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0JLnN1c3BlbmQgPSBpd2xhZ25fbWFjX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGl3bGFnbl9tYWNfcmVzdW1lLAotI2VuZGlmCi0JLmFkZF9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNoYW5nZV9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2UsCi0JLmNvbmZpZyA9IGl3bGFnbl9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIsCi0JLnNldF9rZXkgPSBpd2xhZ25fbWFjX3NldF9rZXksCi0JLnVwZGF0ZV90a2lwX2tleSA9IGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5LAotCS5zZXRfcmVrZXlfZGF0YSA9IGl3bGFnbl9tYWNfc2V0X3Jla2V5X2RhdGEsCi0JLmNvbmZfdHggPSBpd2xhZ25fbWFjX2NvbmZfdHgsCi0JLmJzc19pbmZvX2NoYW5nZWQgPSBpd2xhZ25fYnNzX2luZm9fY2hhbmdlZCwKLQkuYW1wZHVfYWN0aW9uID0gaXdsYWduX21hY19hbXBkdV9hY3Rpb24sCi0JLmh3X3NjYW4gPSBpd2xhZ25fbWFjX2h3X3NjYW4sCi0JLnN0YV9ub3RpZnkgPSBpd2xhZ25fbWFjX3N0YV9ub3RpZnksCi0JLnN0YV9hZGQgPSBpd2xhZ25fbWFjX3N0YV9hZGQsCi0JLnN0YV9yZW1vdmUgPSBpd2xhZ25fbWFjX3N0YV9yZW1vdmUsCi0JLmNoYW5uZWxfc3dpdGNoID0gaXdsYWduX21hY19jaGFubmVsX3N3aXRjaCwKLQkuZmx1c2ggPSBpd2xhZ25fbWFjX2ZsdXNoLAotCS50eF9sYXN0X2JlYWNvbiA9IGl3bGFnbl9tYWNfdHhfbGFzdF9iZWFjb24sCi0JLnJlbWFpbl9vbl9jaGFubmVsID0gaXdsYWduX21hY19yZW1haW5fb25fY2hhbm5lbCwKLQkuY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsID0gaXdsYWduX21hY19jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCi0JLnJzc2lfY2FsbGJhY2sgPSBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2ssCi0JQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGl3bGFnbl9tYWNfdGVzdG1vZGVfY21kKQotCUNGRzgwMjExX1RFU1RNT0RFX0RVTVAoaXdsYWduX21hY190ZXN0bW9kZV9kdW1wKQotCS50eF9zeW5jID0gaXdsYWduX21hY190eF9zeW5jLAotCS5maW5pc2hfdHhfc3luYyA9IGl3bGFnbl9tYWNfZmluaXNoX3R4X3N5bmMsCi0JLnNldF90aW0gPSBpd2xhZ25fbWFjX3NldF90aW0sCi19OwogCiBzdGF0aWMgdTMyIGl3bF9od19kZXRlY3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewpAQCAtMzE2NCwzNiArMTY2OSw1NCBAQAogCQkJZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV80Syk7CiAKIAlpZiAoaXdsYWduX21vZF9wYXJhbXMuZGlzYWJsZV8xMW4pCi0JCXByaXYtPmNmZy0+c2t1ICY9IH5FRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFOworCQljZmcocHJpdiktPnNrdSAmPSB+RUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRTsKIAogCWh3X3BhcmFtcyhwcml2KS5udW1fYW1wZHVfcXVldWVzID0KLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlczsKKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlczsKIAlod19wYXJhbXMocHJpdikuc2hhZG93X3JlZ19lbmFibGUgPQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmVnX2VuYWJsZTsKLQlod19wYXJhbXMocHJpdikuc2t1ID0gcHJpdi0+Y2ZnLT5za3U7Ci0JaHdfcGFyYW1zKHByaXYpLndkX3RpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmVnX2VuYWJsZTsKKwlod19wYXJhbXMocHJpdikuc2t1ID0gY2ZnKHByaXYpLT5za3U7CisJaHdfcGFyYW1zKHByaXYpLndkX3RpbWVvdXQgPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwogCiAJLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCi0JcmV0dXJuIHByaXYtPmNmZy0+bGliLT5zZXRfaHdfcGFyYW1zKHByaXYpOworCXJldHVybiBjZmcocHJpdiktPmxpYi0+c2V0X2h3X3BhcmFtcyhwcml2KTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBib3RoIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgaHcgYW5kIHByaXYuICovCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9odyAqaXdsX2FsbG9jX2FsbCh2b2lkKQorCisKK3N0YXRpYyB2b2lkIGl3bF9kZWJ1Z19jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCi0JICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCWRldl9wcmludGsoS0VSTl9JTkZPLCBidXMocHJpdiktPmRldiwgIkNPTkZJR19JV0xXSUZJX0RFQlVHICIKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCQkiZW5hYmxlZFxuIik7CisjZWxzZQorCQkiZGlzYWJsZWRcbiIpOworI2VuZGlmCisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVCVUdGUyAiCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworCQkiZW5hYmxlZFxuIik7CisjZWxzZQorCQkiZGlzYWJsZWRcbiIpOworI2VuZGlmCisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcgIgorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKIAotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgaXdsX3ByaXYpLCAmaXdsYWduX2h3X29wcyk7Ci0JaWYgKCFodykKLQkJZ290byBvdXQ7Ci0KLQlwcml2ID0gaHctPnByaXY7Ci0JcHJpdi0+aHcgPSBodzsKLQotb3V0OgotCXJldHVybiBodzsKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYnVzKHByaXYpLT5kZXYsICJDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUgIgorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERQorCQkiZW5hYmxlZFxuIik7CisjZWxzZQorCQkiZGlzYWJsZWRcbiIpOworI2VuZGlmCisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfUDJQICIKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9QMlAKKwkJImVuYWJsZWRcbiIpOworI2Vsc2UKKwkJImRpc2FibGVkXG4iKTsKKyNlbmRpZgogfQogCiBpbnQgaXdsX3Byb2JlKHN0cnVjdCBpd2xfYnVzICpidXMsIGNvbnN0IHN0cnVjdCBpd2xfdHJhbnNfb3BzICp0cmFuc19vcHMsCkBAIC0zMjMxLDggKzE3NTQsMTEgQEAKIAogCVNFVF9JRUVFODAyMTFfREVWKGh3LCBidXMocHJpdiktPmRldik7CiAKKwkvKiB3aGF0IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMgd2UgaGF2ZSAqLworCWl3bF9kZWJ1Z19jb25maWcocHJpdik7CisKIAlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIExPQUQgRFJJVkVSICoqKlxuIik7Ci0JcHJpdi0+Y2ZnID0gY2ZnOworCWNmZyhwcml2KSA9IGNmZzsKIAogCS8qIGlzIGFudGVubmEgY291cGxpbmcgbW9yZSB0aGFuIDM1ZEIgPyAqLwogCXByaXYtPmJ0X2FudF9jb3VwbGVfb2sgPQpAQCAtMzI2Niw3ICsxNzkyLDcgQEAKIAkgKioqKioqKioqKioqKioqKioqKioqKiovCiAJaHdfcmV2ID0gaXdsX2h3X2RldGVjdChwcml2KTsKIAlJV0xfSU5GTyhwcml2LCAiRGV0ZWN0ZWQgJXMsIFJFVj0weCVYXG4iLAotCQlwcml2LT5jZmctPm5hbWUsIGh3X3Jldik7CisJCWNmZyhwcml2KS0+bmFtZSwgaHdfcmV2KTsKIAogCWVyciA9IGl3bF90cmFuc19yZXF1ZXN0X2lycSh0cmFucyhwcml2KSk7CiAJaWYgKGVycikKQEAgLTMyOTYsMTEgKzE4MjIsMTEgQEAKIAkJZ290byBvdXRfZnJlZV9lZXByb207CiAKIAkvKiBleHRyYWN0IE1BQyBBZGRyZXNzICovCi0JaXdsX2VlcHJvbV9nZXRfbWFjKHByaXYsIHByaXYtPmFkZHJlc3Nlc1swXS5hZGRyKTsKKwlpd2xfZWVwcm9tX2dldF9tYWMocHJpdi0+c2hyZCwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIpOwogCUlXTF9ERUJVR19JTkZPKHByaXYsICJNQUMgYWRkcmVzczogJXBNXG4iLCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkcik7CiAJcHJpdi0+aHctPndpcGh5LT5hZGRyZXNzZXMgPSBwcml2LT5hZGRyZXNzZXM7CiAJcHJpdi0+aHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDE7Ci0JbnVtX21hYyA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fTlVNX01BQ19BRERSRVNTKTsKKwludW1fbWFjID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYtPnNocmQsIEVFUFJPTV9OVU1fTUFDX0FERFJFU1MpOwogCWlmIChudW1fbWFjID4gMSkgewogCQltZW1jcHkocHJpdi0+YWRkcmVzc2VzWzFdLmFkZHIsIHByaXYtPmFkZHJlc3Nlc1swXS5hZGRyLAogCQkgICAgICAgRVRIX0FMRU4pOwpAQCAtMzM2NSw3ICsxODkxLDcgQEAKIAlwcml2LT5zaHJkLT53b3JrcXVldWUgPSBOVUxMOwogCWl3bF91bmluaXRfZHJ2KHByaXYpOwogb3V0X2ZyZWVfZWVwcm9tOgotCWl3bF9lZXByb21fZnJlZShwcml2KTsKKwlpd2xfZWVwcm9tX2ZyZWUocHJpdi0+c2hyZCk7CiBvdXRfZnJlZV90cmFuczoKIAlpd2xfdHJhbnNfZnJlZSh0cmFucyhwcml2KSk7CiBvdXRfZnJlZV90cmFmZmljX21lbToKQEAgLTMzOTAsMjEgKzE5MTYsMTYgQEAKIAlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOwogCiAJaXdsX3Rlc3Rtb2RlX2NsZWFudXAocHJpdik7Ci0JaXdsX2xlZHNfZXhpdChwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQkJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7Ci0JfQorCWl3bGFnbl9tYWNfdW5yZWdpc3Rlcihwcml2KTsKIAogCWl3bF90dF9leGl0KHByaXYpOwogCiAJLypUaGlzIHdpbGwgc3RvcCB0aGUgcXVldWVzLCBtb3ZlIHRoZSBkZXZpY2UgdG8gbG93IHBvd2VyIHN0YXRlICovCiAJaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKHByaXYpKTsKIAotCWl3bF9kZWFsbG9jX3Vjb2RlKHByaXYpOworCWl3bF9kZWFsbG9jX3Vjb2RlKHRyYW5zKHByaXYpKTsKIAotCWl3bF9lZXByb21fZnJlZShwcml2KTsKKwlpd2xfZWVwcm9tX2ZyZWUocHJpdi0+c2hyZCk7CiAKIAkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KIAlmbHVzaF93b3JrcXVldWUocHJpdi0+c2hyZC0+d29ya3F1ZXVlKTsKQEAgLTM1MDQsOSArMjAyNSwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGFja19jaGVjaywgaXdsYWduX21vZF9wYXJhbXMuYWNrX2NoZWNrLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoYWNrX2NoZWNrLCAiQ2hlY2sgYWNrIGhlYWx0aCAoZGVmYXVsdDogMCBbZGlzYWJsZWRdKSIpOwogCi1tb2R1bGVfcGFyYW1fbmFtZWQod2RfZGlzYWJsZSwgaXdsYWduX21vZF9wYXJhbXMud2RfZGlzYWJsZSwgYm9vbCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fbmFtZWQod2RfZGlzYWJsZSwgaXdsYWduX21vZF9wYXJhbXMud2RfZGlzYWJsZSwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Mod2RfZGlzYWJsZSwKLQkJIkRpc2FibGUgc3R1Y2sgcXVldWUgd2F0Y2hkb2cgdGltZXIgKGRlZmF1bHQ6IDAgW2VuYWJsZWRdKSIpOworCQkiRGlzYWJsZSBzdHVjayBxdWV1ZSB3YXRjaGRvZyB0aW1lciAwPXN5c3RlbSBkZWZhdWx0LCAiCisJCSIxPWRpc2FibGUsIDI9ZW5hYmxlIChkZWZhdWx0OiAwKSIpOwogCiAvKgogICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaAppbmRleCA1YjkzNmVjLi5mODRmYjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaApAQCAtNjUsNiArNjUsMTIgQEAKIAogI2luY2x1ZGUgIml3bC1kZXYuaCIKIAorc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgeworCXUzMiBtYXhfcHJvYmVfbGVuZ3RoOworCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKKwl1MzIgZmxhZ3M7Cit9OworCiBleHRlcm4gc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsYWduX2h3X29wczsKIAogaW50IGl3bF9yZXNldF9pY3Qoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOwpAQCAtNzcsNiArODMsMTYgQEAKIAloZHItPmRhdGFfdmFsaWQgPSAxOwogfQogCit2b2lkIF9faXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsYWduX3ByZXBhcmVfcmVzdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOworCisvKiBNQUM4MDIxMSAqLworc3RydWN0IGllZWU4MDIxMV9odyAqaXdsX2FsbG9jX2FsbCh2b2lkKTsKK2ludCBpd2xhZ25fbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBpd2xhZ25fdWNvZGVfY2FwYWJpbGl0aWVzICpjYXBhKTsKK3ZvaWQgaXdsYWduX21hY191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisKIC8qIFJYT04gKi8KIGludCBpd2xhZ25fc2V0X3Bhbl9wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xhZ25fY29tbWl0X3J4b24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKQEAgLTg2LDI1ICsxMDIsMjcgQEAKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYsCiAJCQkgICAgIHUzMiBjaGFuZ2VzKTsKK3ZvaWQgaXdsYWduX2NvbmZpZ19odDQwKHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogCiAvKiB1Q29kZSAqLwogaW50IGl3bGFnbl9yeF9jYWxpYl9yZXN1bHQoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiLAogCQkJICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKLWludCBpd2xhZ25fc2VuZF9idF9lbnYoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhY3Rpb24sIHU4IHR5cGUpOwotdm9pZCBpd2xhZ25fc2VuZF9wcmlvX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bGFnbl9ydW5faW5pdF91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bGFnbl9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgZndfaW1nICppbWFnZSwKLQkJCQkgZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB1Y29kZV90eXBlKTsKIAogLyogbGliICovCiBpbnQgaXdsYWduX3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsYWduX3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci11MTYgaXdsYWduX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Cit1MTYgaXdsX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKTsKIGludCBpd2xhZ25fdHhmaWZvX2ZsdXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGZsdXNoX2NvbnRyb2wpOwogdm9pZCBpd2xhZ25fZGV2X3R4Zmlmb19mbHVzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUxNiBmbHVzaF9jb250cm9sKTsKIGludCBpd2xhZ25fc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitpbnQgaXdsYWduX3NlbmRfcGF0dGVybnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbik7CitpbnQgaXdsYWduX3N1c3BlbmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKTsKKyNlbmRpZgogCiAvKiByeCAqLwogaW50IGl3bGFnbl9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7CkBAIC0xMTUsNiArMTMzLDggQEAKIGludCBpd2xhZ25fdHhfc2tiKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaXdsYWduX3R4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbik7CitpbnQgaXdsYWduX3R4X2FnZ19vcGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHU4IGJ1Zl9zaXplKTsKIGludCBpd2xhZ25fdHhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCk7CiBpbnQgaXdsYWduX3J4X3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtMTk2LDkgKzIxNiw2IEBACiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCAqc3RhX2lkX3IpOwogaW50IGl3bF9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4IHN0YV9pZCwKIAkJICAgICAgIGNvbnN0IHU4ICphZGRyKTsKLWludCBpd2xhZ25fbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLQogdTggaXdsX3ByZXBfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCiAJCSAgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiAKQEAgLTMxNiwxMCArMzMzLDYgQEAKIGludCBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKIGludCBpd2xfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bGFnbl9tYWNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwogCiAvKiByYXRlICovCiBzdGF0aWMgaW5saW5lIHUzMiBpd2xfYW50X2lkeF90b19mbGFncyh1OCBhbnRfaWR4KQpAQCAtMzM5LDI4ICszNTIsMTEgQEAKIAogLyogZWVwcm9tICovCiB2b2lkIGl3bF9lZXByb21fZW5oYW5jZWRfdHhwb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCAqbWFjKTsKK3ZvaWQgaXdsX2VlcHJvbV9nZXRfbWFjKGNvbnN0IHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLCB1OCAqbWFjKTsKIAotLyogbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwotdm9pZCBfX2FjcXVpcmVzKHdhaXRfZW50cnkpCi1pd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAotCQkJICAgICAgdTggY21kLAotCQkJICAgICAgdm9pZCAoKmZuKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkJCQkgdm9pZCAqZGF0YSksCi0JCQkgICAgICB2b2lkICpmbl9kYXRhKTsKLWludCBfX211c3RfY2hlY2sgX19yZWxlYXNlcyh3YWl0X2VudHJ5KQotaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAotCQkJIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7Ci12b2lkIF9fcmVsZWFzZXMod2FpdF9lbnRyeSkKLWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnkpOwotZXh0ZXJuIGludCBpd2xhZ25faW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogZXh0ZXJuIGludCBpd2xfYWxpdmVfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIC8qIHN2dG9vbCAqLwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKIGV4dGVybiBpbnQgaXdsYWduX21hY190ZXN0bW9kZV9jbWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHZvaWQgKmRhdGEsCiAJCQkJICAgaW50IGxlbik7CiBleHRlcm4gaW50IGl3bGFnbl9tYWNfdGVzdG1vZGVfZHVtcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2ZnLmgKaW5kZXggMmEyZGM0NS4uZTFkNzgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2ZnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY2ZnLmgKQEAgLTEwMSwxNyArMTAxLDExIEBACiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTMwX2Jnbl9jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTMwX2JnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ25fY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDIwMDBfMmJnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ25fZF9jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDMwXzJiZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDM1XzJhYmdfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMzVfMmJnX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmdfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwNV9iZ25fY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEwNV9iZ25fZF9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTM1X2JnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMzVfYmduX2NmZzsKIAogI2VuZGlmIC8qIF9faXdsX3BjaV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCmluZGV4IGY0ZWNjZjUuLjI2NWRlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaApAQCAtMTA5LDEwICsxMDksMTAgQEAKIAkvKiBSWCwgVFgsIExFRHMgKi8KIAlSRVBMWV9UWCA9IDB4MWMsCiAJUkVQTFlfTEVEU19DTUQgPSAweDQ4LAotCVJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgPSAweDRlLCAvKiBmb3IgNDk2NSBhbmQgdXAgKi8KKwlSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwKIAogCS8qIFdpTUFYIGNvZXhpc3RlbmNlICovCi0JQ09FWF9QUklPUklUWV9UQUJMRV9DTUQgPSAweDVhLAkvKiBmb3IgNTAwMCBzZXJpZXMgYW5kIHVwICovCisJQ09FWF9QUklPUklUWV9UQUJMRV9DTUQgPSAweDVhLAogCUNPRVhfTUVESVVNX05PVElGSUNBVElPTiA9IDB4NWIsCiAJQ09FWF9FVkVOVF9DTUQgPSAweDVjLAogCkBAIC00NjYsMjMgKzQ2NiwyNyBAQAogCXUzMiBmcmFtZV9wdHI7CQkvKiBmcmFtZSBwb2ludGVyICovCiAJdTMyIHN0YWNrX3B0cjsJCS8qIHN0YWNrIHBvaW50ZXIgKi8KIAl1MzIgaGNtZDsJCS8qIGxhc3QgaG9zdCBjb21tYW5kIGhlYWRlciAqLwotI2lmIDAKLQkvKiBubyBuZWVkIHRvIHJlYWQgdGhlIHJlbWFpbmRlciwgd2UgZG9uJ3QgdXNlIHRoZSB2YWx1ZXMgKi8KLQl1MzIgaXNyMDsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMDogcnh0eF9mbGFnICovCi0JdTMyIGlzcjE7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjE6IGhvc3RfZmxhZyAqLwotCXUzMiBpc3IyOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IyOiBlbmNfZmxhZyAqLwotCXUzMiBpc3IzOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IzOiB0aW1lX2ZsYWcgKi8KLQl1MzIgaXNyNDsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSNDogd2ljbyBpbnRlcnJ1cHQgKi8KKwl1MzIgaXNyMDsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMDoKKwkJCQkgKiByeHR4X2ZsYWcgKi8KKwl1MzIgaXNyMTsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMToKKwkJCQkgKiBob3N0X2ZsYWcgKi8KKwl1MzIgaXNyMjsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMjoKKwkJCQkgKiBlbmNfZmxhZyAqLworCXUzMiBpc3IzOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IzOgorCQkJCSAqIHRpbWVfZmxhZyAqLworCXUzMiBpc3I0OwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1I0OgorCQkJCSAqIHdpY28gaW50ZXJydXB0ICovCiAJdTMyIGlzcl9wcmVmOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19QUkVGX1NUQVQgKi8KIAl1MzIgd2FpdF9ldmVudDsJCS8qIHdhaXQgZXZlbnQoKSBjYWxsZXIgYWRkcmVzcyAqLwogCXUzMiBsMnBfY29udHJvbDsJLyogTDJwQ29udHJvbEZpZWxkICovCiAJdTMyIGwycF9kdXJhdGlvbjsJLyogTDJwRHVyYXRpb25GaWVsZCAqLwogCXUzMiBsMnBfbWh2YWxpZDsJLyogTDJwTWhWYWxpZEJpdHMgKi8KIAl1MzIgbDJwX2FkZHJfbWF0Y2g7CS8qIEwycEFkZHJNYXRjaFN0YXQgKi8KLQl1MzIgbG1wbV9wbWdfc2VsOwkvKiBpbmRpY2F0ZSB3aGljaCBjbG9ja3MgYXJlIHR1cm5lZCBvbiAoTE1QTV9QTUdfU0VMKSAqLwotCXUzMiB1X3RpbWVzdGFtcDsJLyogaW5kaWNhdGUgd2hlbiB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgY29tcGlsYXRpb24gKi8KKwl1MzIgbG1wbV9wbWdfc2VsOwkvKiBpbmRpY2F0ZSB3aGljaCBjbG9ja3MgYXJlIHR1cm5lZCBvbgorCQkJCSAqIChMTVBNX1BNR19TRUwpICovCisJdTMyIHVfdGltZXN0YW1wOwkvKiBpbmRpY2F0ZSB3aGVuIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZQorCQkJCSAqIGNvbXBpbGF0aW9uICovCiAJdTMyIGZsb3dfaGFuZGxlcjsJLyogRkggcmVhZC93cml0ZSBwb2ludGVycywgUlggY3JlZGl0ICovCi0jZW5kaWYKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBpd2xfYWxpdmVfcmVzcCB7CkBAIC04MTAsNyArODE0LDcgQEAKICNkZWZpbmUJSVdMQUdOX1NUQVRJT05fQ09VTlQJMTYKIAogI2RlZmluZQlJV0xfSU5WQUxJRF9TVEFUSU9OIAkyNTUKLSNkZWZpbmUgSVdMX01BWF9USURfQ09VTlQJOQorI2RlZmluZSBJV0xfTUFYX1RJRF9DT1VOVAk4CiAKICNkZWZpbmUgU1RBX0ZMR19UWF9SQVRFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCAyKQogI2RlZmluZSBTVEFfRkxHX1BXUl9TQVZFX01TSwkJY3B1X3RvX2xlMzIoMSA8PCA4KQpAQCAtOTMxLDggKzkzNSw3IEBACiAJICogY29ycmVzcG9uZGluZyB0byBiaXQgKGUuZy4gYml0IDUgY29udHJvbHMgVElEIDUpLgogCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9USURfRElTQUJMRV9UWCB0byB1c2UgdGhpcyBmaWVsZC4gKi8KIAlfX2xlMTYgdGlkX2Rpc2FibGVfdHg7Ci0KLQlfX2xlMTYJcmF0ZV9uX2ZsYWdzOwkJLyogMzk0NSBvbmx5ICovCisJX19sZTE2IGxlZ2FjeV9yZXNlcnZlZDsKIAogCS8qIFRJRCBmb3Igd2hpY2ggdG8gYWRkIGJsb2NrLWFjayBzdXBwb3J0LgogCSAqIFNldCBtb2RpZnlfbWFzayBiaXQgU1RBX01PRElGWV9BRERCQV9USURfTVNLIHRvIHVzZSB0aGlzIGZpZWxkLiAqLwpAQCAtMTE2Miw4ICsxMTY1LDcgQEAKICAqCiAgKiB1Q29kZSBoYW5kbGVzIHJldHJ5aW5nIFR4IHdoZW4gYW4gQUNLIGlzIGV4cGVjdGVkIGJ1dCBub3QgcmVjZWl2ZWQuCiAgKiBUaGlzIGluY2x1ZGVzIHRyeWluZyBsb3dlciBkYXRhIHJhdGVzIHRoYW4gdGhlIG9uZSByZXF1ZXN0ZWQgaW4gdGhlIFR4Ci0gKiBjb21tYW5kLCBhcyBzZXQgdXAgYnkgdGhlIFJFUExZX1JBVEVfU0NBTEUgKGZvciAzOTQ1KSBvcgotICogUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCAoYWduKS4KKyAqIGNvbW1hbmQsIGFzIHNldCB1cCBieSB0aGUgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCAoYWduKS4KICAqCiAgKiBEcml2ZXIgc2V0cyB1cCB0cmFuc21pdCBwb3dlciBmb3IgdmFyaW91cyByYXRlcyB2aWEgUkVQTFlfVFhfUFdSX1RBQkxFX0NNRC4KICAqIFRoaXMgY29tbWFuZCBtdXN0IGJlIGV4ZWN1dGVkIGFmdGVyIGV2ZXJ5IFJYT04gY29tbWFuZCwgYmVmb3JlIFR4IGNhbiBvY2N1ci4KQEAgLTExNzUsMjUgKzExNzcsOSBAQAogICogMTogVXNlIFJUUy9DVFMgcHJvdG9jb2wgb3IgQ1RTLXRvLXNlbGYgaWYgc3BlYyBhbGxvd3MgaXQKICAqIGJlZm9yZSB0aGlzIGZyYW1lLiBpZiBDVFMtdG8tc2VsZiByZXF1aXJlZCBjaGVjawogICogUlhPTl9GTEdfU0VMRl9DVFNfRU4gc3RhdHVzLgotICogdW51c2VkIGluIDM5NDUvNDk2NSwgdXNlZCBpbiA1MDAwIHNlcmllcyBhbmQgYWZ0ZXIKICAqLwogI2RlZmluZSBUWF9DTURfRkxHX1BST1RfUkVRVUlSRV9NU0sgY3B1X3RvX2xlMzIoMSA8PCAwKQogCi0vKgotICogMTogVXNlIFJlcXVlc3QtVG8tU2VuZCBwcm90b2NvbCBiZWZvcmUgdGhpcyBmcmFtZS4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19DVFNfTVNLLgotICogdXNlZCBpbiAzOTQ1LzQ5NjUsIHVudXNlZCBpbiA1MDAwIHNlcmllcyBhbmQgYWZ0ZXIKLSAqLwotI2RlZmluZSBUWF9DTURfRkxHX1JUU19NU0sgY3B1X3RvX2xlMzIoMSA8PCAxKQotCi0vKgotICogMTogVHJhbnNtaXQgQ2xlYXItVG8tU2VuZCB0byBzZWxmIGJlZm9yZSB0aGlzIGZyYW1lLgotICogRHJpdmVyIHNob3VsZCBzZXQgdGhpcyBmb3IgQVVUSC9ERUFVVEgvQVNTT0MtUkVRL1JFQVNTT0MgbWdtbnQgZnJhbWVzLgotICogTXV0dWFsbHkgZXhjbHVzaXZlIHZzLiBUWF9DTURfRkxHX1JUU19NU0suCi0gKiB1c2VkIGluIDM5NDUvNDk2NSwgdW51c2VkIGluIDUwMDAgc2VyaWVzIGFuZCBhZnRlcgotICovCi0jZGVmaW5lIFRYX0NNRF9GTEdfQ1RTX01TSyBjcHVfdG9fbGUzMigxIDw8IDIpCi0KIC8qIDE6IEV4cGVjdCBBQ0sgZnJvbSByZWNlaXZpbmcgc3RhdGlvbgogICogMDogRG9uJ3QgZXhwZWN0IEFDSyAoTUFDIGhlYWRlcidzIGR1cmF0aW9uIGZpZWxkIHMvYiAwKQogICogU2V0IHRoaXMgZm9yIHVuaWNhc3QgZnJhbWVzLCBidXQgbm90IGJyb2FkY2FzdC9tdWx0aWNhc3QuICovCkBAIC0xMjExLDE4ICsxMTk3LDggQEAKICAqIFNldCB3aGVuIFR4aW5nIGEgYmxvY2stYWNrIHJlcXVlc3QgZnJhbWUuICBBbHNvIHNldCBUWF9DTURfRkxHX0FDS19NU0suICovCiAjZGVmaW5lIFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLICBjcHVfdG9fbGUzMigxIDw8IDYpCiAKLS8qCi0gKiAxOiBGcmFtZSByZXF1aXJlcyBmdWxsIFR4LU9wIHByb3RlY3Rpb24uCi0gKiBTZXQgdGhpcyBpZiBlaXRoZXIgUlRTIG9yIENUUyBUeCBGbGFnIGdldHMgc2V0LgotICogdXNlZCBpbiAzOTQ1LzQ5NjUsIHVudXNlZCBpbiA1MDAwIHNlcmllcyBhbmQgYWZ0ZXIKLSAqLwotI2RlZmluZSBUWF9DTURfRkxHX0ZVTExfVFhPUF9QUk9UX01TSyBjcHVfdG9fbGUzMigxIDw8IDcpCi0KLS8qIFR4IGFudGVubmEgc2VsZWN0aW9uIGZpZWxkOyB1c2VkIG9ubHkgZm9yIDM5NDUsIHJlc2VydmVkICgwKSBmb3IgYWduIGRldmljZXMuCi0gKiBTZXQgZmllbGQgdG8gIjAiIHRvIGFsbG93IDM5NDUgdUNvZGUgdG8gc2VsZWN0IGFudGVubmEgKG5vcm1hbCB1c2FnZSkuICovCisvKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZDsgcmVzZXJ2ZWQgKDApIGZvciBhZ24gZGV2aWNlcy4gKi8KICNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfU0VMX01TSyBjcHVfdG9fbGUzMigweGYwMCkKLSNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQV9NU0sgY3B1X3RvX2xlMzIoMSA8PCA4KQotI2RlZmluZSBUWF9DTURfRkxHX0FOVF9CX01TSyBjcHVfdG9fbGUzMigxIDw8IDkpCiAKIC8qIDE6IElnbm9yZSBCbHVldG9vdGggcHJpb3JpdHkgZm9yIHRoaXMgZnJhbWUuCiAgKiAwOiBEZWxheSBUeCB1bnRpbCBCbHVldG9vdGggZGV2aWNlIGlzIGRvbmUgKG5vcm1hbCB1c2FnZSkuICovCkBAIC0xNTY4LDcgKzE1NDQsNiBAQAogCV9fbGU2NCBiaXRtYXA7CiAJX19sZTE2IHNjZF9mbG93OwogCV9fbGUxNiBzY2Rfc3NuOwotCS8qIGZvbGxvd2luZyBvbmx5IGZvciA1MDAwIHNlcmllcyBhbmQgdXAgKi8KIAl1OCB0eGVkOwkvKiBudW1iZXIgb2YgZnJhbWVzIHNlbnQgKi8KIAl1OCB0eGVkXzJfZG9uZTsgLyogbnVtYmVyIG9mIGZyYW1lcyBhY2tlZCAqLwogfSBfX3BhY2tlZDsKQEAgLTE2NzAsNyArMTY0NSw3IEBACiAvKgogICogUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCA9IDB4NGUgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKICAqCi0gKiBGb3IgYWduIGRldmljZXMgb25seTsgMzk0NSB1c2VzIFJFUExZX1JBVEVfU0NBTEUuCisgKiBGb3IgYWduIGRldmljZXMKICAqCiAgKiBFYWNoIHN0YXRpb24gaW4gdGhlIGFnbiBkZXZpY2UncyBpbnRlcm5hbCBzdGF0aW9uIHRhYmxlIGhhcyBpdHMgb3duIHRhYmxlCiAgKiBvZiAxNgpAQCAtMTkxOSw3ICsxODk0LDcgQEAKIC8qCiAgKiBSRVBMWV9CVF9DT05GSUcgPSAweDliIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKgotICogMzk0NSBhbmQgYWduIGRldmljZXMgc3VwcG9ydCBoYXJkd2FyZSBoYW5kc2hha2Ugd2l0aCBCbHVldG9vdGggZGV2aWNlIG9uCisgKiBhZ24gZGV2aWNlcyBzdXBwb3J0IGhhcmR3YXJlIGhhbmRzaGFrZSB3aXRoIEJsdWV0b290aCBkZXZpY2Ugb24KICAqIHNhbWUgcGxhdGZvcm0uICBCbHVldG9vdGggZGV2aWNlIGFsZXJ0cyB3aXJlbGVzcyBkZXZpY2Ugd2hlbiBpdCB3aWxsIFR4OwogICogd2lyZWxlc3MgZGV2aWNlIGNhbiBkZWxheSBvciBraWxsIGl0cyBvd24gVHggdG8gYWNjb21tb2RhdGUuCiAgKi8KQEAgLTIyMDMsOCArMjE3OCw4IEBACiAKIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgewogCV9fbGUxNiBmbGFnczsKLQl1OCBrZWVwX2FsaXZlX3NlY29uZHM7CQkvKiAzOTQ1IHJlc2VydmVkICovCi0JdTggZGVidWdfZmxhZ3M7CQkJLyogMzk0NSByZXNlcnZlZCAqLworCXU4IGtlZXBfYWxpdmVfc2Vjb25kczsKKwl1OCBkZWJ1Z19mbGFnczsKIAlfX2xlMzIgcnhfZGF0YV90aW1lb3V0OwogCV9fbGUzMiB0eF9kYXRhX3RpbWVvdXQ7CiAJX19sZTMyIHNsZWVwX2ludGVydmFsW0lXTF9QT1dFUl9WRUNfU0laRV07CkBAIC0yMzI1LDkgKzIzMDAsOSBAQAogLyoqCiAgKiBzdHJ1Y3QgaXdsX3NzaWRfaWUgLSBkaXJlY3RlZCBzY2FuIG5ldHdvcmsgaW5mb3JtYXRpb24gZWxlbWVudAogICoKLSAqIFVwIHRvIDIwIG9mIHRoZXNlIG1heSBhcHBlYXIgaW4gUkVQTFlfU0NBTl9DTUQgKE5vdGU6IE9ubHkgNCBhcmUgaW4KLSAqIDM5NDUgU0NBTiBhcGkpLCBzZWxlY3RlZCBieSAidHlwZSIgYml0IGZpZWxkIGluIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsOwotICogZWFjaCBjaGFubmVsIG1heSBzZWxlY3QgZGlmZmVyZW50IHNzaWRzIGZyb20gYW1vbmcgdGhlIDIwICg0KSBlbnRyaWVzLgorICogVXAgdG8gMjAgb2YgdGhlc2UgbWF5IGFwcGVhciBpbiBSRVBMWV9TQ0FOX0NNRCwKKyAqIHNlbGVjdGVkIGJ5ICJ0eXBlIiBiaXQgZmllbGQgaW4gc3RydWN0IGl3bF9zY2FuX2NoYW5uZWw7CisgKiBlYWNoIGNoYW5uZWwgbWF5IHNlbGVjdCBkaWZmZXJlbnQgc3NpZHMgZnJvbSBhbW9uZyB0aGUgMjAgZW50cmllcy4KICAqIFNTSUQgSUVzIGdldCB0cmFuc21pdHRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGVudHJ5LgogICovCiBzdHJ1Y3QgaXdsX3NzaWRfaWUgewpAQCAtMjMzNiw3ICsyMzExLDYgQEAKIAl1OCBzc2lkWzMyXTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0CiAjZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCiAjZGVmaW5lIFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEUJY3B1X3RvX2xlMzIoMHhGRkZGRkZGRikKICNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RJU0FCTEVECTAKQEAgLTI0MTcsOCArMjM5MSw2IEBACiAJCQkJICogY2hhbm5lbCAqLwogCV9fbGUzMiBzdXNwZW5kX3RpbWU7CS8qIHBhdXNlIHNjYW4gdGhpcyBsb25nIChpbiAiZXh0ZW5kZWQgYmVhY29uCiAJCQkJICogZm9ybWF0Iikgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaG5sOgotCQkJCSAqIDM5NDU7IDMxOjI0ICMgYmVhY29ucywgMTk6MCBhZGRpdGlvbmFsIHVzZWMsCi0JCQkJICogNDk2NTsgMzE6MjIgIyBiZWFjb25zLCAyMTowIGFkZGl0aW9uYWwgdXNlYy4KIAkJCQkgKi8KIAlfX2xlMzIgZmxhZ3M7CQkvKiBSWE9OX0ZMR18qICovCiAJX19sZTMyIGZpbHRlcl9mbGFnczsJLyogUlhPTl9GSUxURVJfKiAqLwpAQCAtMjczNCw3ICsyNzA2LDcgQEAKIAogc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gewogCV9fbGUzMiB0ZW1wZXJhdHVyZTsgICAvKiByYWRpbyB0ZW1wZXJhdHVyZSAqLwotCV9fbGUzMiB0ZW1wZXJhdHVyZV9tOyAvKiBmb3IgNTAwMCBhbmQgdXAsIHRoaXMgaXMgcmFkaW8gdm9sdGFnZSAqLworCV9fbGUzMiB0ZW1wZXJhdHVyZV9tOyAvKiByYWRpbyB2b2x0YWdlICovCiAJc3RydWN0IHN0YXRpc3RpY3NfZGJnIGRiZzsKIAlfX2xlMzIgc2xlZXBfdGltZTsKIAlfX2xlMzIgc2xvdHNfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCmluZGV4IDAwMWZkZjEuLmU1MTNhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKQEAgLTYwLDggKzYwLDggQEAKIAogCWh0X2luZm8tPmh0X3N1cHBvcnRlZCA9IHRydWU7CiAKLQlpZiAocHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPmh0X2dyZWVuZmllbGRfc3VwcG9ydCkKKwlpZiAoY2ZnKHByaXYpLT5odF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5odF9wYXJhbXMtPmh0X2dyZWVuZmllbGRfc3VwcG9ydCkKIAkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRDsKIAlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CiAJbWF4X2JpdF9yYXRlID0gTUFYX0JJVF9SQVRFXzIwX01IWjsKQEAgLTc2LDExICs3Niw3IEBACiAJCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX01BWF9BTVNEVTsKIAogCWh0X2luZm8tPmFtcGR1X2ZhY3RvciA9IENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGOwotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJiBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YW1wZHVfZmFjdG9yKQotCQlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YW1wZHVfZmFjdG9yOwogCWh0X2luZm8tPmFtcGR1X2RlbnNpdHkgPSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRjsKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFtcGR1X2RlbnNpdHkpCi0JCWh0X2luZm8tPmFtcGR1X2RlbnNpdHkgPSBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YW1wZHVfZGVuc2l0eTsKIAogCWh0X2luZm8tPm1jcy5yeF9tYXNrWzBdID0gMHhGRjsKIAlpZiAocnhfY2hhaW5zX251bSA+PSAyKQpAQCAtMTQxLDcgKzEzNyw3IEBACiAJc2JhbmQtPmJpdHJhdGVzID0gJnJhdGVzW0lXTF9GSVJTVF9PRkRNX1JBVEVdOwogCXNiYW5kLT5uX2JpdHJhdGVzID0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZIC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKIAotCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCisJaWYgKGNmZyhwcml2KS0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKIAkJaXdsX2luaXRfaHRfaHdfY2FwYWIocHJpdiwgJnNiYW5kLT5odF9jYXAsCiAJCQkJCSBJRUVFODAyMTFfQkFORF81R0haKTsKIApAQCAtMTUxLDcgKzE0Nyw3IEBACiAJc2JhbmQtPmJpdHJhdGVzID0gcmF0ZXM7CiAJc2JhbmQtPm5fYml0cmF0ZXMgPSBJV0xfUkFURV9DT1VOVF9MRUdBQ1k7CiAKLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQorCWlmIChjZmcocHJpdiktPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCiAJCWl3bF9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAogCQkJCQkgSUVFRTgwMjExX0JBTkRfMkdIWik7CiAKQEAgLTIwNiwxMiArMjAyLDEyIEBACiAJcHJpdi0+dHhfcG93ZXJfbmV4dCA9IG1heF90eF9wb3dlcjsKIAogCWlmICgocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyA9PSAwKSAmJgotCSAgICAgcHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF9CQU5EXzUyR0haKSB7CisJICAgICBjZmcocHJpdiktPnNrdSAmIEVFUFJPTV9TS1VfQ0FQX0JBTkRfNTJHSFopIHsKIAkJY2hhciBidWZbMzJdOwogCQlidXNfZ2V0X2h3X2lkKGJ1cyhwcml2KSwgYnVmLCBzaXplb2YoYnVmKSk7CiAJCUlXTF9JTkZPKHByaXYsICJJbmNvcnJlY3RseSBkZXRlY3RlZCBCRyBjYXJkIGFzIEFCRy4gIgogCQkJIlBsZWFzZSBzZW5kIHlvdXIgJXMgdG8gbWFpbnRhaW5lci5cbiIsIGJ1Zik7Ci0JCXByaXYtPmNmZy0+c2t1ICY9IH5FRVBST01fU0tVX0NBUF9CQU5EXzUyR0haOworCQljZmcocHJpdiktPnNrdSAmPSB+RUVQUk9NX1NLVV9DQVBfQkFORF81MkdIWjsKIAl9CiAKIAlJV0xfSU5GTyhwcml2LCAiVHVuYWJsZSBjaGFubmVsczogJWQgODAyLjExYmcsICVkIDgwMi4xMWEgY2hhbm5lbHNcbiIsCkBAIC04MzYsMTkgKzgzMiw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgaXdsYWduX2Fib3J0X25vdGlmaWNhdGlvbl93YWl0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPm5vdGlmX3dhaXRfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkod2FpdF9lbnRyeSwgJnByaXYtPm5vdGlmX3dhaXRzLCBsaXN0KQotCQl3YWl0X2VudHJ5LT5hYm9ydGVkID0gdHJ1ZTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ub3RpZl93YWl0X2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXBfYWxsKCZwcml2LT5ub3RpZl93YWl0cSk7Ci19Ci0KIHZvaWQgaXdsYWduX2Z3X2Vycm9yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBvbmRlbWFuZCkKIHsKIAl1bnNpZ25lZCBpbnQgcmVsb2FkX21zZWM7CkBAIC04NjAsNyArODQzLDcgQEAKIAkvKiBDYW5jZWwgY3VycmVudGx5IHF1ZXVlZCBjb21tYW5kLiAqLwogCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zaHJkLT5zdGF0dXMpOwogCi0JaXdsYWduX2Fib3J0X25vdGlmaWNhdGlvbl93YWl0cyhwcml2KTsKKwlpd2xfYWJvcnRfbm90aWZpY2F0aW9uX3dhaXRzKHByaXYtPnNocmQpOwogCiAJLyogS2VlcCB0aGUgcmVzdGFydCBwcm9jZXNzIGZyb20gdHJ5aW5nIHRvIHNlbmQgaG9zdAogCSAqIGNvbW1hbmRzIGJ5IGNsZWFyaW5nIHRoZSByZWFkeSBiaXQgKi8KQEAgLTk3OSw5ICs5NjIsOSBAQAogCWJ1c19hcG1fY29uZmlnKGJ1cyhwcml2KSk7CiAKIAkvKiBDb25maWd1cmUgYW5hbG9nIHBoYXNlLWxvY2stbG9vcCBiZWZvcmUgYWN0aXZhdGluZyB0byBEMEEgKi8KLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxsX2NmZ192YWwpCisJaWYgKGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQogCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9BTkFfUExMX0NGRywKLQkJCSAgICBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGxfY2ZnX3ZhbCk7CisJCQkgICAgY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+cGxsX2NmZ192YWwpOwogCiAJLyoKIAkgKiBTZXQgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KQEAgLTExMjAsMjI5ICsxMTAzLDggQEAKIAkJCQkJJnN0YXRpc3RpY3NfY21kKTsKIH0KIAotaW50IGl3bGFnbl9tYWNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBxdWV1ZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBxOwogCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CiAKLQlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHF1ZXVlID49IEFDX05VTSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gcXVldWUgPj0gQUNfTlVNICVkXG4iLCBxdWV1ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXEgPSBBQ19OVU0gLSAxIC0gcXVldWU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBNVUxUSS1GSVhNRQotCSAqIFRoaXMgbWF5IG5lZWQgdG8gYmUgZG9uZSBwZXIgaW50ZXJmYWNlIGluIG5sODAyMTEvY2ZnODAyMTEvbWFjODAyMTEuCi0JICovCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWluID0KLQkJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWluKTsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWF4ID0KLQkJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWF4KTsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uYWlmc24gPSBwYXJhbXMtPmFpZnM7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmVkY2FfdHhvcCA9Ci0JCQkJY3B1X3RvX2xlMTYoKHBhcmFtcy0+dHhvcCAqIDMyKSk7Ci0KLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0ucmVzZXJ2ZWQxID0gMDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bGFnbl9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlyZXR1cm4gcHJpdi0+aWJzc19tYW5hZ2VyID09IElXTF9JQlNTX01BTkFHRVI7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX3NldF9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOwotCi0JaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0KLQlyZXR1cm4gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7Ci0JaW50IGVycjsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCS8qCi0JICogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIGNvcnJlY3Qgb25seSB3aGVuIHRoZXJlJ3MganVzdAotCSAqIGEgc2luZ2xlIGNvbnRleHQsIGJ1dCBhbGwgY29kZSB1c2luZyBpdCBpcyBmb3IgaGFyZHdhcmUKLQkgKiB0aGF0IHN1cHBvcnRzIG9ubHkgb25lIGNvbnRleHQuCi0JICovCi0JcHJpdi0+aXdfbW9kZSA9IHZpZi0+dHlwZTsKLQotCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKLQotCWVyciA9IGl3bF9zZXRfbW9kZShwcml2LCBjdHgpOwotCWlmIChlcnIpIHsKLQkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCi0JCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJiBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgotCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJLyoKLQkJICogcHJldGVuZCB0byBoYXZlIGhpZ2ggQlQgdHJhZmZpYyBhcyBsb25nIGFzIHdlCi0JCSAqIGFyZSBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlLCBhcyB0aGlzIHdpbGwgY2F1c2UKLQkJICogdGhlIHJhdGUgc2NhbGluZyBldGMuIHRvIGJlaGF2ZSBhcyBpbnRlbmRlZC4KLQkJICovCi0JCXByaXYtPmJ0X3RyYWZmaWNfbG9hZCA9IElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsYWduX21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXAsICpjdHggPSBOVUxMOwotCWludCBlcnI7Ci0JZW51bSBubDgwMjExX2lmdHlwZSB2aWZ0eXBlID0gaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogdHlwZSAlZCwgYWRkciAlcE1cbiIsCi0JCQkgICB2aWZ0eXBlLCB2aWYtPmFkZHIpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5od19yb2NfZGlzYWJsZV93b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWl3bGFnbl9kaXNhYmxlX3JvYyhwcml2KTsKLQotCWlmICghaXdsX2lzX3JlYWR5X3JmKHByaXYtPnNocmQpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJUcnkgdG8gYWRkIGludGVyZmFjZSB3aGVuIGRldmljZSBub3QgcmVhZHlcbiIpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkgewotCQl1MzIgcG9zc2libGVfbW9kZXMgPQotCQkJdG1wLT5pbnRlcmZhY2VfbW9kZXMgfCB0bXAtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0KLQkJaWYgKHRtcC0+dmlmKSB7Ci0JCQkvKiBjaGVjayBpZiB0aGlzIGJ1c3kgY29udGV4dCBpcyBleGNsdXNpdmUgKi8KLQkJCWlmICh0bXAtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJgotCQkJCQkJQklUKHRtcC0+dmlmLT50eXBlKSkgewotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghKHBvc3NpYmxlX21vZGVzICYgQklUKHZpZnR5cGUpKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGhhdmUgbWF5YmUgdXNhYmxlIGNvbnRleHQgdy9vIGludGVyZmFjZSAqLwotCQljdHggPSB0bXA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghY3R4KSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl2aWZfcHJpdi0+Y3R4ID0gY3R4OwotCWN0eC0+dmlmID0gdmlmOwotCi0JZXJyID0gaXdsX3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOwotCWlmICghZXJyKQotCQlnb3RvIG91dDsKLQotCWN0eC0+dmlmID0gTlVMTDsKLQlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfdGVhcmRvd25faW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGJvb2wgbW9kZV9jaGFuZ2UpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKHByaXYtPnNjYW5fdmlmID09IHZpZikgewotCQlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCQlpd2xfZm9yY2Vfc2Nhbl9lbmQocHJpdik7Ci0JfQotCi0JaWYgKCFtb2RlX2NoYW5nZSkgewotCQlpd2xfc2V0X21vZGUocHJpdiwgY3R4KTsKLQkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCi0JCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogV2hlbiByZW1vdmluZyB0aGUgSUJTUyBpbnRlcmZhY2UsIG92ZXJ3cml0ZSB0aGUKLQkgKiBCVCB0cmFmZmljIGxvYWQgd2l0aCB0aGUgc3RvcmVkIG9uZSBmcm9tIHRoZSBsYXN0Ci0JICogbm90aWZpY2F0aW9uLCBpZiBhbnkuIElmIHRoaXMgaXMgYSBkZXZpY2UgdGhhdAotCSAqIGRvZXNuJ3QgaW1wbGVtZW50IHRoaXMsIHRoaXMgaGFzIG5vIGVmZmVjdCBzaW5jZQotCSAqIGJvdGggdmFsdWVzIGFyZSB0aGUgc2FtZSBhbmQgemVyby4KLQkgKi8KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQlwcml2LT5idF90cmFmZmljX2xvYWQgPSBwcml2LT5sYXN0X2J0X3RyYWZmaWNfbG9hZDsKLX0KLQotdm9pZCBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKFdBUk5fT04oY3R4LT52aWYgIT0gdmlmKSkgewotCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCQlJV0xfRVJSKHByaXYsICJjdHgtPnZpZiA9ICVwLCB2aWYgPSAlcFxuIiwgY3R4LT52aWYsIHZpZik7Ci0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKQotCQkJSVdMX0VSUihwcml2LCAiXHRJRCA9ICVkOlx0Y3R4ID0gJXBcdGN0eC0+dmlmID0gJXBcbiIsCi0JCQkJdG1wLT5jdHhpZCwgdG1wLCB0bXAtPnZpZik7Ci0JfQotCWN0eC0+dmlmID0gTlVMTDsKLQotCWl3bF90ZWFyZG93bl9pbnRlcmZhY2UocHJpdiwgdmlmLCBmYWxzZSk7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi19CiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAKQEAgLTE2NDksOTcgKzE0MTEsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGl3bGFnbl9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpic3NfY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBuZXd2aWZ0eXBlID0gbmV3dHlwZTsKLQl1MzIgaW50ZXJmYWNlX21vZGVzOwotCWludCBlcnI7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKCFjdHgtPnZpZiB8fCAhaXdsX2lzX3JlYWR5X3JmKHByaXYtPnNocmQpKSB7Ci0JCS8qCi0JCSAqIEh1aD8gQnV0IHdhaXQgLi4uIHRoaXMgY2FuIG1heWJlIGhhcHBlbiB3aGVuCi0JCSAqIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmaXJtd2FyZSByZXN0YXJ0IQotCQkgKi8KLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpbnRlcmZhY2VfbW9kZXMgPSBjdHgtPmludGVyZmFjZV9tb2RlcyB8IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKLQotCWlmICghKGludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIFJlZnVzZSBhIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBkb25lIGJ5IG1vdmluZyBmcm9tIHRoZSBQQU4KLQkgKiBjb250ZXh0IHRvIHRoZSBCU1MgY29udGV4dCBpbnN0ZWFkLCBpZiB0aGUgQlNTIGNvbnRleHQgaXMKLQkgKiBhdmFpbGFibGUgYW5kIGNhbiBzdXBwb3J0IHRoZSBuZXcgaW50ZXJmYWNlIHR5cGUuCi0JICovCi0JaWYgKGN0eC0+Y3R4aWQgPT0gSVdMX1JYT05fQ1RYX1BBTiAmJiAhYnNzX2N0eC0+dmlmICYmCi0JICAgIChic3NfY3R4LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkgfHwKLQkgICAgIGJzc19jdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7Ci0JCUJVSUxEX0JVR19PTihOVU1fSVdMX1JYT05fQ1RYICE9IDIpOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpIHsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJCWlmIChjdHggPT0gdG1wKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXRtcC0+dmlmKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKgotCQkJICogVGhlIGN1cnJlbnQgbW9kZSBzd2l0Y2ggd291bGQgYmUgZXhjbHVzaXZlLCBidXQKLQkJCSAqIGFub3RoZXIgY29udGV4dCBpcyBhY3RpdmUgLi4uIHJlZnVzZSB0aGUgc3dpdGNoLgotCQkJICovCi0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIHN1Y2Nlc3MgKi8KLQlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7Ci0JdmlmLT50eXBlID0gbmV3dmlmdHlwZTsKLQl2aWYtPnAycCA9IG5ld3AycDsKLQllcnIgPSBpd2xfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7Ci0JV0FSTl9PTihlcnIpOwotCS8qCi0JICogV2UndmUgc3dpdGNoZWQgaW50ZXJuYWxseSwgYnV0IHN1Ym1pdHRpbmcgdG8gdGhlCi0JICogZGV2aWNlIG1heSBoYXZlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uIE1hc2sgdGhpcwotCSAqIGVycm9yLCBiZWNhdXNlIG90aGVyd2lzZSBtYWM4MDIxMSB3aWxsIG5vdCBzd2l0Y2gKLQkgKiAoYW5kIHNldCB0aGUgaW50ZXJmYWNlIHR5cGUgYmFjaykgYW5kIHdlJ2xsIGJlCi0JICogb3V0IG9mIHN5bmMgd2l0aCBpdC4KLQkgKi8KLQllcnIgPSAwOwotCi0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIGVycjsKLX0KIAogaW50IGl3bF9jbWRfZWNob190ZXN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewogCQkuaWQgPSBSRVBMWV9FQ0hPLAorCQkubGVuID0geyAwIH0sCiAJCS5mbGFncyA9IENNRF9TWU5DLAogCX07CiAKQEAgLTE3ODMsNyArMTQ2MSw3IEBACiAJaWYgKGl3bF9pc19yZmtpbGwocHJpdi0+c2hyZCkpCiAJCXJldHVybjsKIAotCXRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCXRpbWVvdXQgPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OwogCWlmICh0aW1lb3V0ID09IDApCiAJCXJldHVybjsKIApAQCAtMTgwOCwxMyArMTQ4NiwyNSBAQAogCiB2b2lkIGl3bF9zZXR1cF93YXRjaGRvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKIAotCWlmICh0aW1lb3V0ICYmICFpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlKQotCQltb2RfdGltZXIoJnByaXYtPndhdGNoZG9nLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJV0xfV0RfVElDSyh0aW1lb3V0KSkpOwotCWVsc2UKLQkJZGVsX3RpbWVyKCZwcml2LT53YXRjaGRvZyk7CisJaWYgKCFpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlKSB7CisJCS8qIHVzZSBzeXN0ZW0gZGVmYXVsdCAqLworCQlpZiAodGltZW91dCAmJiAhY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+d2RfZGlzYWJsZSkKKwkJCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csCisJCQkJamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyhJV0xfV0RfVElDSyh0aW1lb3V0KSkpOworCQllbHNlCisJCQlkZWxfdGltZXIoJnByaXYtPndhdGNoZG9nKTsKKwl9IGVsc2UgeworCQkvKiBtb2R1bGUgcGFyYW1ldGVyIG92ZXJ3cml0ZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwkJaWYgKHRpbWVvdXQgJiYgaXdsYWduX21vZF9wYXJhbXMud2RfZGlzYWJsZSA9PSAyKQorCQkJbW9kX3RpbWVyKCZwcml2LT53YXRjaGRvZywKKwkJCQlqaWZmaWVzICsKKwkJCQltc2Vjc190b19qaWZmaWVzKElXTF9XRF9USUNLKHRpbWVvdXQpKSk7CisJCWVsc2UKKwkJCWRlbF90aW1lcigmcHJpdi0+d2F0Y2hkb2cpOworCX0KIH0KIAogLyoqCkBAIC0xODkwLDM0ICsxNTgwLDYgQEAKIAlyZXR1cm4gY3B1X3RvX2xlMzIocmVzKTsKIH0KIAotdm9pZCBpd2xfc3RhcnRfdHhfYmFfdHJhbnNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAotCQkJCSB1OCBzdGFfaWQsIHU4IHRpZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwotCXU4ICphZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7Ci0KLQlpZiAoY3R4ID09IE5VTV9JV0xfUlhPTl9DVFgpCi0JCWN0eCA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0uY3R4aWQ7Ci0JdmlmID0gcHJpdi0+Y29udGV4dHNbY3R4XS52aWY7Ci0KLQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7Ci19Ci0KLXZvaWQgaXdsX3N0b3BfdHhfYmFfdHJhbnNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJdTggc3RhX2lkLCB1OCB0aWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKLQl1OCAqYWRkciA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyOwotCi0JaWYgKGN0eCA9PSBOVU1fSVdMX1JYT05fQ1RYKQotCQljdHggPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmN0eGlkOwotCXZpZiA9IHByaXYtPmNvbnRleHRzW2N0eF0udmlmOwotCi0JaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7Ci19Ci0KIHZvaWQgaXdsX3NldF9od19yZmtpbGxfc3RhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIHN0YXRlKQogewogCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LCBzdGF0ZSk7CkBAIC0xOTI1LDggKzE1ODcsNyBAQAogCiB2b2lkIGl3bF9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlwcml2LT5jZmctPmxpYi0+bmljX2NvbmZpZyhwcml2KTsKLQorCWNmZyhwcml2KS0+bGliLT5uaWNfY29uZmlnKHByaXYpOwogfQogCiB2b2lkIGl3bF9mcmVlX3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKaW5kZXggMTM3ZGEzMy4uN2JmNzZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaApAQCAtMTEzLDYgKzExMyw3IEBACiAgKiBAc2hhZG93X3JlZ19lbmFibGU6IEhXIHNoYWRob3cgcmVnaXN0ZXIgYml0CiAgKiBAbm9faWRsZV9zdXBwb3J0OiBkbyBub3Qgc3VwcG9ydCBpZGxlIG1vZGUKICAqIEBoZF92MjogdjIgb2YgZW5oYW5jZWQgc2Vuc2l0aXZpdHkgdmFsdWUsIHVzZWQgZm9yIDIwMDAgc2VyaWVzIGFuZCB1cAorICogd2RfZGlzYWJsZTogZGlzYWJsZSB3YXRjaGRvZyB0aW1lcgogICovCiBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIHsKIAlpbnQgZWVwcm9tX3NpemU7CkBAIC0xMzQsMTQgKzEzNSwxMyBAQAogCWNvbnN0IGJvb2wgc2hhZG93X3JlZ19lbmFibGU7CiAJY29uc3QgYm9vbCBub19pZGxlX3N1cHBvcnQ7CiAJY29uc3QgYm9vbCBoZF92MjsKKwljb25zdCBib29sIHdkX2Rpc2FibGU7CiB9OwogLyoKICAqIEBhZHZhbmNlZF9idF9jb2V4aXN0OiBzdXBwb3J0IGFkdmFuY2VkIGJ0IGNvZXhpc3QKICAqIEBidF9pbml0X3RyYWZmaWNfbG9hZDogc3BlY2lmeSBpbml0aWFsIGJ0IHRyYWZmaWMgbG9hZAogICogQGJ0X3ByaW9fYm9vc3Q6IGRlZmF1bHQgYnQgcHJpb3JpdHkgYm9vc3QgdmFsdWUKICAqIEBhZ2dfdGltZV9saW1pdDogbWF4aW11bSBudW1iZXIgb2YgdVNlYyBpbiBhZ2dyZWdhdGlvbgotICogQGFtcGR1X2ZhY3RvcjogTWF4aW11bSBBLU1QRFUgbGVuZ3RoIGZhY3RvcgotICogQGFtcGR1X2RlbnNpdHk6IE1pbmltdW0gQS1NUERVIHNwYWNpbmcKICAqIEBidF9zY29fZGlzYWJsZTogdUNvZGUgc2hvdWxkIG5vdCByZXNwb25zZSB0byBCVCBpbiBTQ08vRVNDTyBtb2RlCiAgKi8KIHN0cnVjdCBpd2xfYnRfcGFyYW1zIHsKQEAgLTE0OSw4ICsxNDksNiBAQAogCXU4IGJ0X2luaXRfdHJhZmZpY19sb2FkOwogCXU4IGJ0X3ByaW9fYm9vc3Q7CiAJdTE2IGFnZ190aW1lX2xpbWl0OwotCXU4IGFtcGR1X2ZhY3RvcjsKLQl1OCBhbXBkdV9kZW5zaXR5OwogCWJvb2wgYnRfc2NvX2Rpc2FibGU7CiAJYm9vbCBidF9zZXNzaW9uXzI7CiB9OwpAQCAtMTYzLDg0ICsxNjEsMTAgQEAKIAllbnVtIGllZWU4MDIxMV9zbXBzX21vZGUgc21wc19tb2RlOwogfTsKIAotLyoqCi0gKiBzdHJ1Y3QgaXdsX2NmZwotICogQG5hbWU6IE9mZmljYWwgbmFtZSBvZiB0aGUgZGV2aWNlCi0gKiBAZndfbmFtZV9wcmU6IEZpcm13YXJlIGZpbGVuYW1lIHByZWZpeC4gVGhlIGFwaSB2ZXJzaW9uIGFuZCBleHRlbnNpb24KLSAqCSgudWNvZGUpIHdpbGwgYmUgYWRkZWQgdG8gZmlsZW5hbWUgYmVmb3JlIGxvYWRpbmcgZnJvbSBkaXNrLiBUaGUKLSAqCWZpbGVuYW1lIGlzIGNvbnN0cnVjdGVkIGFzIGZ3X25hbWVfcHJlPGFwaT4udWNvZGUuCi0gKiBAdWNvZGVfYXBpX21heDogSGlnaGVzdCB2ZXJzaW9uIG9mIHVDb2RlIEFQSSBzdXBwb3J0ZWQgYnkgZHJpdmVyLgotICogQHVjb2RlX2FwaV9vazogb2xkZXN0IHZlcnNpb24gb2YgdGhlIHVDb2RlIEFQSSB0aGF0IGlzIE9LIHRvIGxvYWQKLSAqCXdpdGhvdXQgYSB3YXJuaW5nLCBmb3IgdXNlIGluIHRyYW5zaXRpb25zCi0gKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAdmFsaWRfdHhfYW50OiB2YWxpZCB0cmFuc21pdCBhbnRlbm5hCi0gKiBAdmFsaWRfcnhfYW50OiB2YWxpZCByZWNlaXZlIGFudGVubmEKLSAqIEBza3U6IHNrdSBpbmZvcm1hdGlvbiBmcm9tIEVFUFJPTQotICogQGVlcHJvbV92ZXI6IEVFUFJPTSB2ZXJzaW9uCi0gKiBAZWVwcm9tX2NhbGliX3ZlcjogRUVQUk9NIGNhbGlicmF0aW9uIHZlcnNpb24KLSAqIEBsaWI6IHBvaW50ZXIgdG8gdGhlIGxpYiBvcHMKLSAqIEBhZGRpdGlvbmFsX25pY19jb25maWc6IGFkZGl0aW9uYWwgbmljIGNvbmZpZ3VyYXRpb24KLSAqIEBiYXNlX3BhcmFtczogcG9pbnRlciB0byBiYXNpYyBwYXJhbWV0ZXJzCi0gKiBAaHRfcGFyYW1zOiBwb2ludCB0byBodCBwYXRhbWV0ZXJzCi0gKiBAYnRfcGFyYW1zOiBwb2ludGVyIHRvIGJ0IHBhcmFtZXRlcnMKLSAqIEBwYV90eXBlOiB1c2VkIGJ5IDYwMDAgc2VyaWVzIG9ubHkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgUG93ZXIgQW1wbGlmaWVyCi0gKiBAbmVlZF9kY19jYWxpYjogbmVlZCB0byBwZXJmb3JtIGluaXQgZGMgY2FsaWJyYXRpb24KLSAqIEBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCi0gKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCi0gKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCi0gKiBAYWR2X3BtOiBhZHZhbmNlIHBvd2VyIG1hbmFnZW1lbnQKLSAqIEByeF93aXRoX3Npc29fZGl2ZXJzaXR5OiAxeDEgZGV2aWNlIHdpdGggcnggYW50ZW5uYSBkaXZlcnNpdHkKLSAqIEBpbnRlcm5hbF93aW1heF9jb2V4OiBpbnRlcm5hbCB3aWZpL3dpbWF4IGNvbWJvIGRldmljZQotICogQGlxX2ludmVydDogSS9RIGludmVyc2lvbgotICogQHRlbXBfb2Zmc2V0X3YyOiBzdXBwb3J0IHYyIG9mIHRlbXBlcmF0dXJlIG9mZnNldCBjYWxpYnJhdGlvbgotICoKLSAqIFdlIGVuYWJsZSB0aGUgZHJpdmVyIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUgd3J0IEFQSSB2ZXJzaW9uLiBUaGUKLSAqIGRyaXZlciBzcGVjaWZpZXMgd2hpY2ggQVBJcyBpdCBzdXBwb3J0cyAod2l0aCBAdWNvZGVfYXBpX21heCBiZWluZyB0aGUKLSAqIGhpZ2hlc3QgYW5kIEB1Y29kZV9hcGlfbWluIHRoZSBsb3dlc3QpLiBGaXJtd2FyZSB3aWxsIG9ubHkgYmUgbG9hZGVkIGlmCi0gKiBpdCBoYXMgYSBzdXBwb3J0ZWQgQVBJIHZlcnNpb24uCi0gKgotICogVGhlIGlkZWFsIHVzYWdlIG9mIHRoaXMgaW5mcmFzdHJ1Y3R1cmUgaXMgdG8gdHJlYXQgYSBuZXcgdWNvZGUgQVBJCi0gKiByZWxlYXNlIGFzIGEgbmV3IGhhcmR3YXJlIHJldmlzaW9uLgotICovCi1zdHJ1Y3QgaXdsX2NmZyB7Ci0JLyogcGFyYW1zIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgZGV2aWNlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KLQljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGNoYXIgKmZ3X25hbWVfcHJlOwotCWNvbnN0IHVuc2lnbmVkIGludCB1Y29kZV9hcGlfbWF4OwotCWNvbnN0IHVuc2lnbmVkIGludCB1Y29kZV9hcGlfb2s7Ci0JY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9taW47Ci0JdTggICB2YWxpZF90eF9hbnQ7Ci0JdTggICB2YWxpZF9yeF9hbnQ7Ci0JdTE2ICBza3U7Ci0JdTE2ICBlZXByb21fdmVyOwotCXUxNiAgZWVwcm9tX2NhbGliX3ZlcjsKLQljb25zdCBzdHJ1Y3QgaXdsX2xpYl9vcHMgKmxpYjsKLQl2b2lkICgqYWRkaXRpb25hbF9uaWNfY29uZmlnKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIHBhcmFtcyBub3QgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0Jc3RydWN0IGl3bF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7Ci0JLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCXN0cnVjdCBpd2xfaHRfcGFyYW1zICpodF9wYXJhbXM7Ci0Jc3RydWN0IGl3bF9idF9wYXJhbXMgKmJ0X3BhcmFtczsKLQllbnVtIGl3bF9wYV90eXBlIHBhX3R5cGU7CSAgLyogaWYgdXNlZCBzZXQgdG8gSVdMX1BBX1NZU1RFTSAqLwotCWNvbnN0IGJvb2wgbmVlZF9kY19jYWxpYjsJICAvKiBpZiB1c2VkIHNldCB0byB0cnVlICovCi0JY29uc3QgYm9vbCBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOyAvKiBpZiB1c2VkIHNldCB0byB0cnVlICovCi0JdTggc2Nhbl9yeF9hbnRlbm5hc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKLQllbnVtIGl3bF9sZWRfbW9kZSBsZWRfbW9kZTsKLQljb25zdCBib29sIGFkdl9wbTsKLQljb25zdCBib29sIHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk7Ci0JY29uc3QgYm9vbCBpbnRlcm5hbF93aW1heF9jb2V4OwotCWNvbnN0IGJvb2wgaXFfaW52ZXJ0OwotCWNvbnN0IGJvb2wgdGVtcF9vZmZzZXRfdjI7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgIEwgaSBiICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgaXdsYWduX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAotCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgaXdsYWduX21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIGl3bF9zZXRfcnhvbl9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCiAJCQkgICBpbnQgaHdfZGVjcnlwdCk7CiBpbnQgaXdsX2NoZWNrX3J4b25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7CkBAIC0yNjAsMTMgKzE4NCw2IEBACiB2b2lkIGl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKIHZvaWQgaXdsX3NldF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsYWduX21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXZvaWQgaXdsYWduX21hY19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci1pbnQgaXdsYWduX21hY19jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKTsKIGludCBpd2xfY21kX2VjaG9fdGVzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIGludCBpd2xfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKQEAgLTMyMyw5ICsyNDAsNiBAQAogaW50IGl3bF9zY2FuX2NhbmNlbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHVuc2lnbmVkIGxvbmcgbXMpOwogdm9pZCBpd2xfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xhZ25fbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKIHZvaWQgaXdsX2ludGVybmFsX3Nob3J0X2h3X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCBpd2xfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgbW9kZSwgYm9vbCBleHRlcm5hbCk7CiB1MTYgaXdsX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKQEAgLTM3OSw4ICsyOTMsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXdsX2FkdmFuY2VkX2J0X2NvZXhpc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXJldHVybiBwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdDsKKwlyZXR1cm4gY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3Q7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfZW5hYmxlX3Jma2lsbF9pbnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKaW5kZXggNjlhNzdlMi4uZjhmYzIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCkBAIC00NywyMCArNDcsMjEgQEAKIH0gd2hpbGUgKDApCiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRwotI2RlZmluZSBJV0xfREVCVUcobSwgbGV2ZWwsIGZtdCwgYXJncy4uLikJCQkJXAorI2RlZmluZSBJV0xfREVCVUcobSwgbGV2ZWwsIGZtdCwgLi4uKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbCgobSktPnNocmQpICYgKGxldmVsKSkJCQlcCi0JCWRldl9wcmludGsoS0VSTl9FUlIsIGJ1cyhtKS0+ZGV2LAkJCVwKLQkJCSAiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCi0JCQlfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCisJCWRldl9lcnIoYnVzKG0pLT5kZXYsICIlYyAlcyAiIGZtdCwJCQlcCisJCQlpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18sCQlcCisJCQkjI19fVkFfQVJHU19fKTsJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKG0sIGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCVwKKyNkZWZpbmUgSVdMX0RFQlVHX0xJTUlUKG0sIGxldmVsLCBmbXQsIC4uLikJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbCgobSktPnNocmQpICYgKGxldmVsKSAmJiBuZXRfcmF0ZWxpbWl0KCkpXAotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBidXMobSktPmRldiwJCQlcCi0JCQkiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCi0JCQkgX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAorCWlmIChpd2xfZ2V0X2RlYnVnX2xldmVsKChtKS0+c2hyZCkgJiAobGV2ZWwpICYmCQkJXAorCSAgICBuZXRfcmF0ZWxpbWl0KCkpCQkJCQkJXAorCQlkZXZfZXJyKGJ1cyhtKS0+ZGV2LCAiJWMgJXMgIiBmbXQsCQkJXAorCQkJaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fLAkJXAorCQkJIyNfX1ZBX0FSR1NfXyk7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGl3bF9wcmludF9oZXhfZHVtcChtLCBsZXZlbCwgcCwgbGVuKQkJCQlcCkBAIC03MCwxMCArNzEsMjkgQEAKIAkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW4sIDEpOwlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIElXTF9ERUJVR19RVUlFVF9SRktJTEwocCwgZm10LCAuLi4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKCFpd2xfaXNfcmZraWxsKHAtPnNocmQpKQkJCQkJXAorCQlkZXZfZXJyKGJ1cyhwKS0+ZGV2LCAiJXMlYyAlcyAiIGZtdCwJCQlcCisJCQkiIiwJCQkJCQlcCisJCQlpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18sCQlcCisJCQkjI19fVkFfQVJHU19fKTsJCQkJCVwKKwllbHNlIGlmCShpd2xfZ2V0X2RlYnVnX2xldmVsKHAtPnNocmQpICYgSVdMX0RMX1JBRElPKQkJXAorCQlkZXZfZXJyKGJ1cyhwKS0+ZGV2LCAiJXMlYyAlcyAiIGZtdCwJCQlcCisJCQkiKFJGS0lMTCkgIiwJCQkJCVwKKwkJCWluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXywJCVwKKwkJCSMjX19WQV9BUkdTX18pOwkJCQkJXAorfSB3aGlsZSAoMCkKKwogI2Vsc2UKICNkZWZpbmUgSVdMX0RFQlVHKG0sIGxldmVsLCBmbXQsIGFyZ3MuLi4pCiAjZGVmaW5lIElXTF9ERUJVR19MSU1JVChtLCBsZXZlbCwgZm10LCBhcmdzLi4uKQogI2RlZmluZSBpd2xfcHJpbnRfaGV4X2R1bXAobSwgbGV2ZWwsIHAsIGxlbikKKyNkZWZpbmUgSVdMX0RFQlVHX1FVSUVUX1JGS0lMTChwLCBmbXQsIGFyZ3MuLi4pCVwKK2RvIHsJCQkJCQkJXAorCWlmICghaXdsX2lzX3Jma2lsbChwLT5zaHJkKSkJCQlcCisJCUlXTF9FUlIocCwgZm10LCAjI2FyZ3MpOwkJXAorfSB3aGlsZSAoMCkKICNlbmRpZgkJCQkvKiBDT05GSUdfSVdMV0lGSV9ERUJVRyAqLwogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwpAQCAtMTE0LDQ4ICsxMzQsNDMgQEAKICAqLwogCiAvKiAweDAwMDAwMDBGIC0gMHgwMDAwMDAwMSAqLwotI2RlZmluZSBJV0xfRExfSU5GTwkJKDEgPDwgMCkKLSNkZWZpbmUgSVdMX0RMX01BQzgwMjExCQkoMSA8PCAxKQotI2RlZmluZSBJV0xfRExfSENNRAkJKDEgPDwgMikKLSNkZWZpbmUgSVdMX0RMX1NUQVRFCQkoMSA8PCAzKQorI2RlZmluZSBJV0xfRExfSU5GTwkJMHgwMDAwMDAwMQorI2RlZmluZSBJV0xfRExfTUFDODAyMTEJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdMX0RMX0hDTUQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdMX0RMX1NUQVRFCQkweDAwMDAwMDA4CiAvKiAweDAwMDAwMEYwIC0gMHgwMDAwMDAxMCAqLwotI2RlZmluZSBJV0xfRExfTUFDRFVNUAkJKDEgPDwgNCkKLSNkZWZpbmUgSVdMX0RMX0hDTURfRFVNUAkoMSA8PCA1KQotI2RlZmluZSBJV0xfRExfRUVQUk9NCQkoMSA8PCA2KQotI2RlZmluZSBJV0xfRExfUkFESU8JCSgxIDw8IDcpCisjZGVmaW5lIElXTF9ETF9FRVBST00JCTB4MDAwMDAwNDAKKyNkZWZpbmUgSVdMX0RMX1JBRElPCQkweDAwMDAwMDgwCiAvKiAweDAwMDAwRjAwIC0gMHgwMDAwMDEwMCAqLwotI2RlZmluZSBJV0xfRExfUE9XRVIJCSgxIDw8IDgpCi0jZGVmaW5lIElXTF9ETF9URU1QCQkoMSA8PCA5KQotLyogcmVzZXJ2ZWQgKDEgPDwgMTApICovCi0jZGVmaW5lIElXTF9ETF9TQ0FOCQkoMSA8PCAxMSkKKyNkZWZpbmUgSVdMX0RMX1BPV0VSCQkweDAwMDAwMTAwCisjZGVmaW5lIElXTF9ETF9URU1QCQkweDAwMDAwMjAwCisjZGVmaW5lIElXTF9ETF9TQ0FOCQkweDAwMDAwODAwCiAvKiAweDAwMDBGMDAwIC0gMHgwMDAwMTAwMCAqLwotI2RlZmluZSBJV0xfRExfQVNTT0MJCSgxIDw8IDEyKQotI2RlZmluZSBJV0xfRExfRFJPUAkJKDEgPDwgMTMpCi0vKiByZXNlcnZlZCAoMSA8PCAxNCkgKi8KLSNkZWZpbmUgSVdMX0RMX0NPRVgJCSgxIDw8IDE1KQorI2RlZmluZSBJV0xfRExfQVNTT0MJCTB4MDAwMDEwMDAKKyNkZWZpbmUgSVdMX0RMX0RST1AJCTB4MDAwMDIwMDAKKyNkZWZpbmUgSVdMX0RMX0NPRVgJCTB4MDAwMDgwMDAKIC8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCi0jZGVmaW5lIElXTF9ETF9GVwkJKDEgPDwgMTYpCi0jZGVmaW5lIElXTF9ETF9SRl9LSUxMCQkoMSA8PCAxNykKLSNkZWZpbmUgSVdMX0RMX0ZXX0VSUk9SUwkoMSA8PCAxOCkKLSNkZWZpbmUgSVdMX0RMX0xFRAkJKDEgPDwgMTkpCisjZGVmaW5lIElXTF9ETF9GVwkJMHgwMDAxMDAwMAorI2RlZmluZSBJV0xfRExfUkZfS0lMTAkJMHgwMDAyMDAwMAorI2RlZmluZSBJV0xfRExfRldfRVJST1JTCTB4MDAwNDAwMDAKKyNkZWZpbmUgSVdMX0RMX0xFRAkJMHgwMDA4MDAwMAogLyogMHgwMEYwMDAwMCAtIDB4MDAxMDAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX1JBVEUJCSgxIDw8IDIwKQotI2RlZmluZSBJV0xfRExfQ0FMSUIJCSgxIDw8IDIxKQotI2RlZmluZSBJV0xfRExfV0VQCQkoMSA8PCAyMikKLSNkZWZpbmUgSVdMX0RMX1RYCQkoMSA8PCAyMykKKyNkZWZpbmUgSVdMX0RMX1JBVEUJCTB4MDAxMDAwMDAKKyNkZWZpbmUgSVdMX0RMX0NBTElCCQkweDAwMjAwMDAwCisjZGVmaW5lIElXTF9ETF9XRVAJCTB4MDA0MDAwMDAKKyNkZWZpbmUgSVdMX0RMX1RYCQkweDAwODAwMDAwCiAvKiAweDBGMDAwMDAwIC0gMHgwMTAwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfUlgJCSgxIDw8IDI0KQotI2RlZmluZSBJV0xfRExfSVNSCQkoMSA8PCAyNSkKLSNkZWZpbmUgSVdMX0RMX0hUCQkoMSA8PCAyNikKKyNkZWZpbmUgSVdMX0RMX1JYCQkweDAxMDAwMDAwCisjZGVmaW5lIElXTF9ETF9JU1IJCTB4MDIwMDAwMDAKKyNkZWZpbmUgSVdMX0RMX0hUCQkweDA0MDAwMDAwCiAvKiAweEYwMDAwMDAwIC0gMHgxMDAwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfMTFICQkoMSA8PCAyOCkKLSNkZWZpbmUgSVdMX0RMX1NUQVRTCQkoMSA8PCAyOSkKLSNkZWZpbmUgSVdMX0RMX1RYX1JFUExZCQkoMSA8PCAzMCkKLSNkZWZpbmUgSVdMX0RMX1FPUwkJKDEgPDwgMzEpCisjZGVmaW5lIElXTF9ETF8xMUgJCTB4MTAwMDAwMDAKKyNkZWZpbmUgSVdMX0RMX1NUQVRTCQkweDIwMDAwMDAwCisjZGVmaW5lIElXTF9ETF9UWF9SRVBMWQkJMHg0MDAwMDAwMAorI2RlZmluZSBJV0xfRExfVFhfUVVFVUVTCTB4ODAwMDAwMDAKIAogI2RlZmluZSBJV0xfREVCVUdfSU5GTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0lORk8sIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19NQUM4MDIxMShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX01BQzgwMjExLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTUFDRFVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX01BQ0RVTVAsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19URU1QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVEVNUCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1NDQU4ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9TQ0FOLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfUlgocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9SWCwgZiwgIyMgYSkKQEAgLTE2NCw3ICsxNzksNiBAQAogI2RlZmluZSBJV0xfREVCVUdfTEVEKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTEVELCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfV0VQKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfV0VQLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfSEMocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9IQ01ELCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfSENfRFVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hDTURfRFVNUCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0VFUFJPTShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0VFUFJPTSwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0NBTElCKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfQ0FMSUIsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19GVyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0ZXLCBmLCAjIyBhKQpAQCAtMTg2LDkgKzIwMCw3IEBACiAjZGVmaW5lIElXTF9ERUJVR19TVEFUU19MSU1JVChwLCBmLCBhLi4uKQlcCiAJCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfU1RBVFMsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19UWF9SRVBMWShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYX1JFUExZLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVFhfUkVQTFlfTElNSVQocCwgZiwgYS4uLikgXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX1RYX1JFUExZLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUU9TKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUU9TLCBmLCAjIyBhKQorI2RlZmluZSBJV0xfREVCVUdfVFhfUVVFVUVTKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFhfUVVFVUVTLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfUkFESU8ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9SQURJTywgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1BPV0VSKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUE9XRVIsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR18xMUgocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF8xMUgsIGYsICMjIGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKaW5kZXggYTE2NzBlMy4uMDRhMzM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYwpAQCAtMjM0LDExICsyMzQsMTIgQEAKIAogCS8qIGRlZmF1bHQgaXMgdG8gZHVtcCB0aGUgZW50aXJlIGRhdGEgc2VnbWVudCAqLwogCWlmICghcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgJiYgIXByaXYtPmRiZ2ZzX3NyYW1fbGVuKSB7CisJCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gdHJhbnMocHJpdik7CiAJCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ID0gMHg4MDAwMDA7Ci0JCWlmIChwcml2LT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKQotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9pbml0LmRhdGEubGVuOworCQlpZiAodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpCisJCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IHRyYW5zLT51Y29kZV9pbml0LmRhdGEubGVuOwogCQllbHNlCi0JCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IHByaXYtPnVjb2RlX3J0LmRhdGEubGVuOworCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSB0cmFucy0+dWNvZGVfcnQuZGF0YS5sZW47CiAJfQogCWxlbiA9IHByaXYtPmRiZ2ZzX3NyYW1fbGVuOwogCkBAIC0zNDEsNyArMzQyLDcgQEAKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCiAJCQkJICAgICAgIHByaXYtPndvd2xhbl9zcmFtLAotCQkJCSAgICAgICBwcml2LT51Y29kZV93b3dsYW4uZGF0YS5sZW4pOworCQkJCSAgICAgICB0cmFucyhwcml2KS0+dWNvZGVfd293bGFuLmRhdGEubGVuKTsKIH0KIHN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19zdGF0aW9uc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtMzcxLDE1ICszNzIsMTMgQEAKIAkJCQkgaSwgc3RhdGlvbi0+c3RhLnN0YS5hZGRyLAogCQkJCSBzdGF0aW9uLT5zdGEuc3RhdGlvbl9mbGFnc19tc2spOwogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlRJRFx0c2VxX251bVx0dHhxX2lkXHR0ZmRzXHRyYXRlX25fZmxhZ3NcbiIpOworCQkJCSJUSURcdHNlcV9udW1cdHJhdGVfbl9mbGFnc1xuIik7CiAKIAkJZm9yIChqID0gMDsgaiA8IElXTF9NQVhfVElEX0NPVU5UOyBqKyspIHsKLQkJCXRpZF9kYXRhID0gJnByaXYtPnNocmQtPnRpZF9kYXRhW2ldW2pdOworCQkJdGlkX2RhdGEgPSAmcHJpdi0+dGlkX2RhdGFbaV1bal07CiAJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIiVkOlx0JSN4XHQlI3hcdCV1XHQlI3giLAorCQkJCSIlZDpcdCUjeFx0JSN4IiwKIAkJCQlqLCB0aWRfZGF0YS0+c2VxX251bWJlciwKLQkJCQl0aWRfZGF0YS0+YWdnLnR4cV9pZCwKLQkJCQl0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSwKIAkJCQl0aWRfZGF0YS0+YWdnLnJhdGVfbl9mbGFncyk7CiAKIAkJCWlmICh0aWRfZGF0YS0+YWdnLndhaXRfZm9yX2JhKQpAQCAtNDA3LDcgKzQwNiw3IEBACiAJY29uc3QgdTggKnB0cjsKIAljaGFyICpidWY7CiAJdTE2IGVlcHJvbV92ZXI7Ci0Jc2l6ZV90IGVlcHJvbV9sZW4gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKKwlzaXplX3QgZWVwcm9tX2xlbiA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplOwogCWJ1Zl9zaXplID0gNCAqIGVlcHJvbV9sZW4gKyAyNTY7CiAKIAlpZiAoZWVwcm9tX2xlbiAlIDE2KSB7CkBAIC00MTUsNyArNDE0LDcgQEAKIAkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIAotCXB0ciA9IHByaXYtPmVlcHJvbTsKKwlwdHIgPSBwcml2LT5zaHJkLT5lZXByb207CiAJaWYgKCFwdHIpIHsKIAkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBFRVBST00vT1RQIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDI3LDEwICs0MjYsMTAgQEAKIAkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZWVwcm9tX3ZlciA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fVkVSU0lPTik7CisJZWVwcm9tX3ZlciA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LT5zaHJkLCBFRVBST01fVkVSU0lPTik7CiAJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiTlZNIFR5cGU6ICVzLCAiCiAJCQkidmVyc2lvbjogMHgleFxuIiwKLQkJCShwcml2LT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkKKwkJCSh0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCiAJCQkgPyAiT1RQIiA6ICJFRVBST00iLCBlZXByb21fdmVyKTsKIAlmb3IgKG9mcyA9IDAgOyBvZnMgPCBlZXByb21fbGVuIDsgb2ZzICs9IDE2KSB7CiAJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIjB4JS40eCAiLCBvZnMpOwpAQCAtMTU0MSwxNSArMTU0MCwxNSBAQAogCWlmICh0eC0+dHhfcG93ZXIuYW50X2EgfHwgdHgtPnR4X3Bvd2VyLmFudF9iIHx8IHR4LT50eF9wb3dlci5hbnRfYykgewogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkidHggcG93ZXI6ICgxLzIgZEIgc3RlcClcbiIpOwotCQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0EpICYmIHR4LT50eF9wb3dlci5hbnRfYSkKKwkJaWYgKChjZmcocHJpdiktPnZhbGlkX3R4X2FudCAmIEFOVF9BKSAmJiB0eC0+dHhfcG93ZXIuYW50X2EpCiAJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkJCWZtdF9oZXgsICJhbnRlbm5hIEE6IiwKIAkJCQkJdHgtPnR4X3Bvd2VyLmFudF9hKTsKLQkJaWYgKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmIEFOVF9CKSAmJiB0eC0+dHhfcG93ZXIuYW50X2IpCisJCWlmICgoY2ZnKHByaXYpLT52YWxpZF90eF9hbnQgJiBBTlRfQikgJiYgdHgtPnR4X3Bvd2VyLmFudF9iKQogCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAogCQkJCQlmbXRfaGV4LCAiYW50ZW5uYSBCOiIsCiAJCQkJCXR4LT50eF9wb3dlci5hbnRfYik7Ci0JCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQykgJiYgdHgtPnR4X3Bvd2VyLmFudF9jKQorCQlpZiAoKGNmZyhwcml2KS0+dmFsaWRfdHhfYW50ICYgQU5UX0MpICYmIHR4LT50eF9wb3dlci5hbnRfYykKIAkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKIAkJCQkJZm10X2hleCwgImFudGVubmEgQzoiLAogCQkJCQl0eC0+dHhfcG93ZXIuYW50X2MpOwpAQCAtMjIyMCw3ICsyMjE5LDcgQEAKIAljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKIAogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiV1XG4iLAotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQpOworCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQpOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwogfQpAQCAtMjI0MiwxMCArMjI0MSwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKHBsY3AgPCBJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9NSU4pIHx8CiAJCShwbGNwID4gSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfTUFYKSkKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPQorCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCA9CiAJCQlJV0xfTUFYX1BMQ1BfRVJSX1RIUkVTSE9MRF9ESVNBQkxFOwogCWVsc2UKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPSBwbGNwOworCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZCA9IHBsY3A7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yMzQ3LDcgKzIzNDYsNyBAQAogCWlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gSVdMX01BWF9XRF9USU1FT1VUKQogCQl0aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VUOwogCi0JcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA9IHRpbWVvdXQ7CisJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA9IHRpbWVvdXQ7CiAJaXdsX3NldHVwX3dhdGNoZG9nKHByaXYpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTI0MDcsMTAgKzI0MDYsMTAgQEAKIAljaGFyIGJ1Zls0MF07CiAJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CiAKLQlpZiAocHJpdi0+Y2ZnLT5odF9wYXJhbXMpCisJaWYgKGNmZyhwcml2KS0+aHRfcGFyYW1zKQogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkgInVzZSAlcyBmb3IgYWdncmVnYXRpb25cbiIsCi0JCQkgKHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikgPworCQkJIChjZmcocHJpdiktPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pID8KIAkJCQkicnRzL2N0cyIgOiAiY3RzLXRvLXNlbGYiKTsKIAllbHNlCiAJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIk4vQSIpOwpAQCAtMjQyNyw3ICsyNDI2LDcgQEAKIAlpbnQgYnVmX3NpemU7CiAJaW50IHJ0czsKIAotCWlmICghcHJpdi0+Y2ZnLT5odF9wYXJhbXMpCisJaWYgKCFjZmcocHJpdiktPmh0X3BhcmFtcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CkBAIC0yNDM3LDkgKzI0MzYsOSBAQAogCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmcnRzKSAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocnRzKQotCQlwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24gPSB0cnVlOworCQljZmcocHJpdiktPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24gPSB0cnVlOwogCWVsc2UKLQkJcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uID0gZmFsc2U7CisJCWNmZyhwcml2KS0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbiA9IGZhbHNlOwogCXJldHVybiBjb3VudDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaAppbmRleCA2YzAwYTQ0Li5lNTRhNGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXYuaApAQCAtNjAsMTEgKzYwLDEwIEBACiAKIC8qIERlZmF1bHQgbm9pc2UgbGV2ZWwgdG8gcmVwb3J0IHdoZW4gbm9pc2UgbWVhc3VyZW1lbnQgaXMgbm90IGF2YWlsYWJsZS4KICAqICAgVGhpcyBtYXkgYmUgYmVjYXVzZSB3ZSdyZToKLSAqICAgMSkgIE5vdCBhc3NvY2lhdGVkICg0OTY1LCBubyBiZWFjb24gc3RhdGlzdGljcyBiZWluZyBzZW50IHRvIGRyaXZlcikKKyAqICAgMSkgIE5vdCBhc3NvY2lhdGVkICBubyBiZWFjb24gc3RhdGlzdGljcyBiZWluZyBzZW50IHRvIGRyaXZlcikKICAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCi0gKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCiAgKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCi0gKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCisgKiAgIFJ4IGRCbSBmb3IgYWxsIGFnbiBkZXZpY2VzLCBzbyBpdCBjYW4gaW5kaWNhdGUgInVubWVhc3VyYWJsZSIgdG8gdXNlci4KICAqICAgQWxzbywgLTEyNyB3b3JrcyBiZXR0ZXIgdGhhbiAwIHdoZW4gYXZlcmFnaW5nIGZyYW1lcyB3aXRoL3dpdGhvdXQKICAqICAgbm9pc2UgaW5mbyAoZS5nLiBhdmVyYWdpbmcgbWlnaHQgYmUgZG9uZSBpbiBhcHApOyBtZWFzdXJlZCBkQm0gdmFsdWVzIGFyZQogICogICBhbHdheXMgbmVnYXRpdmUgLi4uIHVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRlZmF1bHQga2VlcHMgYWxsCkBAIC0xOTAsNiArMTg5LDY5IEBACiAJc3RydWN0IGl3bF9xb3NwYXJhbV9jbWQgZGVmX3Fvc19wYXJtOwogfTsKIAorLyoqCisgKiBlbnVtIGl3bF9hZ2dfc3RhdGUKKyAqCisgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgLyB0ZWFyIGRvd24uCisgKiBUaGVzZSBzdGF0ZXMgcmVsYXRlIHRvIGEgc3BlY2lmaWMgUkEgLyBUSUQuCisgKgorICogQElXTF9BR0dfT0ZGOiBhZ2dyZWdhdGlvbiBpcyBub3QgdXNlZAorICogQElXTF9BR0dfT046IGFnZ3JlZ2F0aW9uIHNlc3Npb24gaXMgdXAKKyAqIEBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6IGVzdGFibGlzaGluZyBhIEJBIHNlc3Npb24gLSB3YWl0aW5nIGZvciB0aGUKKyAqCUhXIHF1ZXVlIHRvIGJlIGVtcHR5IGZyb20gcGFja2V0cyBmb3IgdGhpcyBSQSAvVElELgorICogQElXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTogdGVhcmluZyBkb3duIGEgQkEgc2Vzc2lvbiAtIHdhaXRpbmcgZm9yIHRoZQorICoJSFcgcXVldWUgdG8gYmUgZW1wdHkgZnJvbSBwYWNrZXRzIGZvciB0aGlzIFJBIC9USUQuCisgKi8KK2VudW0gaXdsX2FnZ19zdGF0ZSB7CisJSVdMX0FHR19PRkYgPSAwLAorCUlXTF9BR0dfT04sCisJSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBLAorCUlXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQSwKK307CisKKy8qKgorICogc3RydWN0IGl3bF9odF9hZ2cgLSBhZ2dyZWdhdGlvbiBzdGF0ZSBtYWNoaW5lCisKKyAqIFRoaXMgc3RydWN0cyBob2xkcyB0aGUgc3RhdGVzIGZvciB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgYW5kIHRlYXIKKyAqIGRvd24uIEl0IGFsc28gaG9sZHMgdGhlIHN0YXRlIGR1cmluZyB0aGUgQkEgc2Vzc2lvbiBpdHNlbGYuIFRoaXMgc3RydWN0IGlzCisgKiBkdXBsaWNhdGVkIGZvciBlYWNoIFJBIC8gVElELgorCisgKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQuIEhvbGRzIHRoZSBkYXRhIGJldHdlZW4gdGhlCisgKglUeCByZXNwb25zZSAoUkVQTFlfVFgpLCBhbmQgdGhlIGJsb2NrIGFjayBub3RpZmljYXRpb24KKyAqCShSRVBMWV9DT01QUkVTU0VEX0JBKS4KKyAqIEBzdGF0ZTogc3RhdGUgb2YgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IC8gdGVhciBkb3duLgorICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBieSB0aGUgQkEgc2Vzc2lvbiAtIHVzZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllci4KKyAqCU5lZWRlZCBieSB0aGUgdXBwZXIgbGF5ZXIgZm9yIGRlYnVnZnMgb25seS4KKyAqIEBzc246IHRoZSBmaXJzdCBwYWNrZXQgdG8gYmUgc2VudCBpbiBBR0cgSFcgcXVldWUgaW4gVHggQUdHIHN0YXJ0IGZsb3csIG9yCisgKgl0aGUgZmlyc3QgcGFja2V0IHRvIGJlIHNlbnQgaW4gbGVnYWN5IEhXIHF1ZXVlIGluIFR4IEFHRyBzdG9wIGZsb3cuCisgKglCYXNpY2FsbHkgd2hlbiBuZXh0X3JlY2xhaW1lZCByZWFjaGVzIHNzbiwgd2UgY2FuIHRlbGwgbWFjODAyMTEgdGhhdAorICoJd2UgYXJlIHJlYWR5IHRvIGZpbmlzaCB0aGUgVHggQUdHIHN0b3AgLyBzdGFydCBmbG93LgorICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5CisgKi8KK3N0cnVjdCBpd2xfaHRfYWdnIHsKKwl1MzIgcmF0ZV9uX2ZsYWdzOworCWVudW0gaXdsX2FnZ19zdGF0ZSBzdGF0ZTsKKwl1MTYgdHhxX2lkOworCXUxNiBzc247CisJYm9vbCB3YWl0X2Zvcl9iYTsKK307CisKKy8qKgorICogc3RydWN0IGl3bF90aWRfZGF0YSAtIG9uZSBmb3IgZWFjaCBSQSAvIFRJRAorCisgKiBUaGlzIHN0cnVjdHMgaG9sZHMgdGhlIHN0YXRlcyBmb3IgZWFjaCBSQSAvIFRJRC4KKworICogQHNlcV9udW1iZXI6IHRoZSBuZXh0IFdpRmkgc2VxdWVuY2UgbnVtYmVyIHRvIHVzZQorICogQG5leHRfcmVjbGFpbWVkOiB0aGUgV2lGaSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG5leHQgcGFja2V0IHRvIGJlIGFja2VkLgorICoJVGhpcyBpcyBiYXNpY2FsbHkgKGxhc3QgYWNrZWQgcGFja2V0KyspLgorICogQGFnZzogYWdncmVnYXRpb24gc3RhdGUgbWFjaGluZQorICovCitzdHJ1Y3QgaXdsX3RpZF9kYXRhIHsKKwl1MTYgc2VxX251bWJlcjsKKwl1MTYgbmV4dF9yZWNsYWltZWQ7CisJc3RydWN0IGl3bF9odF9hZ2cgYWdnOworfTsKKwogLyoKICAqIFN0cnVjdHVyZSBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aCBzdGFfbG9jayBoZWxkLiBXaGVuIHN0YXRpb24gYWRkaXRpb24KICAqIGlzIGluIHByb2dyZXNzIChJV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIGl0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcyBvbmx5CkBAIC0yMzAsMTcgKzI5Miw2IEBACiAJdTggaWJzc19ic3NpZF9zdGFfaWQ7CiB9OwogCi0vKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCi1zdHJ1Y3QgZndfZGVzYyB7Ci0Jdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLwotCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KLQl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KLX07Ci0KLXN0cnVjdCBmd19pbWcgewotCXN0cnVjdCBmd19kZXNjIGNvZGUsIGRhdGE7Ci19OwotCiAvKiB2MS92MiB1Q29kZSBmaWxlIGxheW91dCAqLwogc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgewogCV9fbGUzMiB2ZXI7CS8qIG1ham9yL21pbm9yL0FQSS9zZXJpYWwgKi8KQEAgLTQ1MiwyOSArNTAzLDYgQEAKIAlJV0xfQ0hBSU5fTk9JU0VfRE9ORSwKIH07CiAKLQotLyoKLSAqIGVudW0gaXdsX2NhbGliCi0gKiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCByZXN1bHRzIG9mIGluaXRpYWwgY2FsaWJyYXRpb25zCi0gKiBzaG91bGQgYmUgc2VudCB0byB0aGUgcnVudGltZSB1Q29kZQotICovCi1lbnVtIGl3bF9jYWxpYiB7Ci0JSVdMX0NBTElCX1hUQUwsCi0JSVdMX0NBTElCX0RDLAotCUlXTF9DQUxJQl9MTywKLQlJV0xfQ0FMSUJfVFhfSVEsCi0JSVdMX0NBTElCX1RYX0lRX1BFUkQsCi0JSVdMX0NBTElCX0JBU0VfQkFORCwKLQlJV0xfQ0FMSUJfVEVNUF9PRkZTRVQsCi0JSVdMX0NBTElCX01BWAotfTsKLQotLyogT3BhcXVlIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0IHsKLQl2b2lkICpidWY7Ci0Jc2l6ZV90IGJ1Zl9sZW47Ci19OwotCiAvKiBTZW5zaXRpdml0eSBjYWxpYiBkYXRhICovCiBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgewogCXUzMiBhdXRvX2NvcnJfb2ZkbTsKQEAgLTU0NywxNiArNTc1LDYgQEAKIAlJV0xfT1RQX0FDQ0VTU19SRUxBVElWRSwKIH07CiAKLS8qKgotICogZW51bSBpd2xfcGFfdHlwZSAtIFBvd2VyIEFtcGxpZmllciB0eXBlCi0gKiBASVdMX1BBX1NZU1RFTTogIGJhc2VkIG9uIHVDb2RlIGNvbmZpZ3VyYXRpb24KLSAqIEBJV0xfUEFfSU5URVJOQUw6IHVzZSBJbnRlcm5hbCBvbmx5Ci0gKi8KLWVudW0gaXdsX3BhX3R5cGUgewotCUlXTF9QQV9TWVNURU0gPSAwLAotCUlXTF9QQV9JTlRFUk5BTCA9IDEsCi19OwotCiAvKiByZXBseV90eF9zdGF0aXN0aWNzIChmb3IgX2FnbiBkZXZpY2VzKSAqLwogc3RydWN0IHJlcGx5X3R4X2Vycm9yX3N0YXRpc3RpY3MgewogCXUzMiBwcF9kZWxheTsKQEAgLTcxNCwzNSArNzMyLDYgQEAKICAqLwogI2RlZmluZSBJV0xBR05fRVhUX0JFQUNPTl9USU1FX1BPUwkyMgogCi0vKioKLSAqIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgLSBub3RpZmljYXRpb24gd2FpdCBlbnRyeQotICogQGxpc3Q6IGxpc3QgaGVhZCBmb3IgZ2xvYmFsIGxpc3QKLSAqIEBmbjogZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIG5vdGlmaWNhdGlvbgotICogQGNtZDogY29tbWFuZCBJRAotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCB1c2VkIGRpcmVjdGx5LCB0byB3YWl0IGZvciBhCi0gKiBub3RpZmljYXRpb24gZGVjbGFyZSBpdCBvbiB0aGUgc3RhY2ssIGFuZCBjYWxsCi0gKiBpd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdCgpIHdpdGggYXBwcm9wcmlhdGUKLSAqIHBhcmFtZXRlcnMuIFRoZW4gZG8gd2hhdGV2ZXIgd2lsbCBjYXVzZSB0aGUgdWNvZGUKLSAqIHRvIG5vdGlmeSB0aGUgZHJpdmVyLCBhbmQgdG8gd2FpdCBmb3IgdGhhdCB0aGVuCi0gKiBjYWxsIGl3bGFnbl93YWl0X25vdGlmaWNhdGlvbigpLgotICoKLSAqIEVhY2ggbm90aWZpY2F0aW9uIGlzIG9uZS1zaG90LiBJZiBhdCBzb21lIHBvaW50IHdlCi0gKiBuZWVkIHRvIHN1cHBvcnQgbXVsdGktc2hvdCBub3RpZmljYXRpb25zICh3aGljaAotICogY2FuJ3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaykgd2UgbmVlZCB0byBtb2RpZnkKLSAqIHRoZSBjb2RlIGZvciB0aGVtLgotICovCi1zdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQl2b2lkICgqZm4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKLQkJICAgdm9pZCAqZGF0YSk7Ci0Jdm9pZCAqZm5fZGF0YTsKLQotCXU4IGNtZDsKLQlib29sIHRyaWdnZXJlZCwgYWJvcnRlZDsKLX07Ci0KIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0IHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwogCkBAIC04MDUsMTQgKzc5NCw3IEBACiAJSVdMX1NDQU5fUk9DLAogfTsKIAotZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB7Ci0JSVdMX1VDT0RFX05PTkUsCi0JSVdMX1VDT0RFX1JFR1VMQVIsCi0JSVdMX1VDT0RFX0lOSVQsCi0JSVdMX1VDT0RFX1dPV0xBTiwKLX07Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RFU1RNT0RFCiBzdHJ1Y3QgaXdsX3Rlc3Rtb2RlX3RyYWNlIHsKIAl1MzIgYnVmZl9zaXplOwogCXUzMiB0b3RhbF9zaXplOwpAQCAtODIyLDggKzgwNCwyMCBAQAogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJYm9vbCB0cmFjZV9lbmFibGVkOwogfTsKK3N0cnVjdCBpd2xfdGVzdG1vZGVfc3JhbSB7CisJdTMyIGJ1ZmZfc2l6ZTsKKwl1MzIgbnVtX2NodW5rczsKKwl1OCAqYnVmZl9hZGRyOworCWJvb2wgc3JhbV9yZWFkZWQ7Cit9OwogI2VuZGlmCiAKK3N0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgeworCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwl1MzIgbGVuZ3RoOworCXU4IGRhdGFbXTsKK307CisKIHN0cnVjdCBpd2xfcHJpdiB7CiAKIAkvKmRhdGEgc2hhcmVkIGFtb25nIGFsbCB0aGUgZHJpdmVyJ3MgbGF5ZXJzICovCkBAIC04MzUsNyArODI5LDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmllZWVfY2hhbm5lbHM7CiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICppZWVlX3JhdGVzOwogCXN0cnVjdCBrbWVtX2NhY2hlICp0eF9jbWRfcG9vbDsKLQlzdHJ1Y3QgaXdsX2NmZyAqY2ZnOwogCiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwogCkBAIC04ODAsOCArODczLDcgQEAKIAlzMzIgdGVtcGVyYXR1cmU7CS8qIENlbHNpdXMgKi8KIAlzMzIgbGFzdF90ZW1wZXJhdHVyZTsKIAotCS8qIGluaXQgY2FsaWJyYXRpb24gcmVzdWx0cyAqLwotCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSVdMX0NBTElCX01BWF07CisJc3RydWN0IGl3bF93aXBhbl9ub2FfZGF0YSBfX3JjdSAqbm9hX2RhdGE7CiAKIAkvKiBTY2FuIHJlbGF0ZWQgdmFyaWFibGVzICovCiAJdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0OwpAQCAtOTA3LDIzICs4OTksMTIgQEAKIAl1MzIgdWNvZGVfdmVyOwkJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKIAkJCQkJICAgaXdsX3Vjb2RlLnZlciAqLwogCi0Jc3RydWN0IGZ3X2ltZyB1Y29kZV9ydDsKLQlzdHJ1Y3QgZndfaW1nIHVjb2RlX2luaXQ7Ci0Jc3RydWN0IGZ3X2ltZyB1Y29kZV93b3dsYW47Ci0KLQllbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGU7Ci0JdTggdWNvZGVfd3JpdGVfY29tcGxldGU7CS8qIHRoZSBpbWFnZSB3cml0ZSBpcyBjb21wbGV0ZSAqLwogCWNoYXIgZmlybXdhcmVfbmFtZVsyNV07CiAKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKIAogCV9fbGUxNiBzd2l0Y2hfY2hhbm5lbDsKIAotCXN0cnVjdCB7Ci0JCXUzMiBlcnJvcl9ldmVudF90YWJsZTsKLQkJdTMyIGxvZ19ldmVudF90YWJsZTsKLQl9IGRldmljZV9wb2ludGVyczsKLQogCXUxNiBhY3RpdmVfcmF0ZTsKIAogCXU4IHN0YXJ0X2NhbGliOwpAQCAtOTUxLDE3ICs5MzIsMTMgQEAKIAlpbnQgbnVtX3N0YXRpb25zOwogCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSBzdGF0aW9uc1tJV0xBR05fU1RBVElPTl9DT1VOVF07CiAJdW5zaWduZWQgbG9uZyB1Y29kZV9rZXlfdGFibGU7CisJc3RydWN0IGl3bF90aWRfZGF0YSB0aWRfZGF0YVtJV0xBR05fU1RBVElPTl9DT1VOVF1bSVdMX01BWF9USURfQ09VTlRdOwogCiAJdTggbWFjODAyMTFfcmVnaXN0ZXJlZDsKIAogCS8qIEluZGljYXRpb24gaWYgaWVlZTgwMjExX29wcy0+b3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KIAl1OCBpc19vcGVuOwogCi0JLyogZWVwcm9tIC0tIHRoaXMgaXMgaW4gdGhlIGNhcmQncyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KLQl1OCAqZWVwcm9tOwotCWludCAgICBudm1fZGV2aWNlX3R5cGU7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaW5mbyAqY2FsaWJfaW5mbzsKLQogCWVudW0gbmw4MDIxMV9pZnR5cGUgaXdfbW9kZTsKIAogCS8qIExhc3QgUngnZCBiZWFjb24gdGltZXN0YW1wICovCkBAIC0xMDE3LDEwICs5OTQsNiBAQAogCS8qIGNvdW50cyByZXBseV90eCBlcnJvciAqLwogCXN0cnVjdCByZXBseV90eF9lcnJvcl9zdGF0aXN0aWNzIHJlcGx5X3R4X3N0YXRzOwogCXN0cnVjdCByZXBseV9hZ2dfdHhfZXJyb3Jfc3RhdGlzdGljcyByZXBseV9hZ2dfdHhfc3RhdHM7Ci0JLyogbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbm90aWZfd2FpdHM7Ci0Jc3BpbmxvY2tfdCBub3RpZl93YWl0X2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgbm90aWZfd2FpdHE7CiAKIAkvKiByZW1haW4tb24tY2hhbm5lbCBvZmZsb2FkIHN1cHBvcnQgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmh3X3JvY19jaGFubmVsOwpAQCAtMTA5OCw4ICsxMDcxLDkgQEAKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsKIAl1bnNpZ25lZCBsb25nIGJsaW5rX29uLCBibGlua19vZmY7CiAJYm9vbCBsZWRfcmVnaXN0ZXJlZDsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RFU1RNT0RFCiAJc3RydWN0IGl3bF90ZXN0bW9kZV90cmFjZSB0ZXN0bW9kZV90cmFjZTsKKwlzdHJ1Y3QgaXdsX3Rlc3Rtb2RlX3NyYW0gdGVzdG1vZGVfc3JhbTsKIAl1MzIgdG1fZml4ZWRfcmF0ZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCmluZGV4IGE0ZTQzYmQuLmMxZWRhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jCkBAIC0xNDksMjMgKzE0OSwyMyBAQAogICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5CiAgKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KICAqLwotc3RhdGljIGludCBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXdsX2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX2J1cyAqYnVzKQogewogCXUxNiBjb3VudDsKIAlpbnQgcmV0OwogCiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgRUVQUk9NX1NFTV9SRVRSWV9MSU1JVDsgY291bnQrKykgewogCQkvKiBSZXF1ZXN0IHNlbWFwaG9yZSAqLwotCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQlpd2xfc2V0X2JpdChidXMsIENTUl9IV19JRl9DT05GSUdfUkVHLAogCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSk7CiAKIAkJLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCQlyZXQgPSBpd2xfcG9sbF9iaXQoYnVzKHByaXYpLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJcmV0ID0gaXdsX3BvbGxfYml0KGJ1cywgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCiAJCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAogCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKIAkJCQlFRVBST01fU0VNX1RJTUVPVVQpOwogCQlpZiAocmV0ID49IDApIHsKLQkJCUlXTF9ERUJVR19FRVBST00ocHJpdiwKKwkJCUlXTF9ERUJVR19FRVBST00oYnVzLAogCQkJCSJBY3F1aXJlZCBzZW1hcGhvcmUgYWZ0ZXIgJWQgdHJpZXMuXG4iLAogCQkJCWNvdW50KzEpOwogCQkJcmV0dXJuIHJldDsKQEAgLTE3NSwzOSArMTc1LDM5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaXdsX2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBpd2xfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpd2xfYnVzICpidXMpCiB7Ci0JaXdsX2NsZWFyX2JpdChidXMocHJpdiksIENTUl9IV19JRl9DT05GSUdfUkVHLAorCWl3bF9jbGVhcl9iaXQoYnVzLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKIAkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKIAogfQogCi1zdGF0aWMgaW50IGl3bF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGl3bF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKLQl1MzIgZ3AgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX0VFUFJPTV9HUCkgJiBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSzsKKwl1MzIgZ3AgPSBpd2xfcmVhZDMyKGJ1cyh0cmFucyksIENTUl9FRVBST01fR1ApICYgQ1NSX0VFUFJPTV9HUF9WQUxJRF9NU0s7CiAJaW50IHJldCA9IDA7CiAKLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJFRVBST00gc2lnbmF0dXJlPTB4JTA4eFxuIiwgZ3ApOworCUlXTF9ERUJVR19FRVBST00odHJhbnMsICJFRVBST00gc2lnbmF0dXJlPTB4JTA4eFxuIiwgZ3ApOwogCXN3aXRjaCAoZ3ApIHsKIAljYXNlIENTUl9FRVBST01fR1BfQkFEX1NJR19FRVBfR09PRF9TSUdfT1RQOgotCQlpZiAocHJpdi0+bnZtX2RldmljZV90eXBlICE9IE5WTV9ERVZJQ0VfVFlQRV9PVFApIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVFUFJPTSB3aXRoIGJhZCBzaWduYXR1cmU6IDB4JTA4eFxuIiwKKwkJaWYgKHRyYW5zLT5udm1fZGV2aWNlX3R5cGUgIT0gTlZNX0RFVklDRV9UWVBFX09UUCkgeworCQkJSVdMX0VSUih0cmFucywgIkVFUFJPTSB3aXRoIGJhZCBzaWduYXR1cmU6IDB4JTA4eFxuIiwKIAkJCQlncCk7CiAJCQlyZXQgPSAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLOgogCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLOgotCQlpZiAocHJpdi0+bnZtX2RldmljZV90eXBlICE9IE5WTV9ERVZJQ0VfVFlQRV9FRVBST00pIHsKLQkJCUlXTF9FUlIocHJpdiwgIk9UUCB3aXRoIGJhZCBzaWduYXR1cmU6IDB4JTA4eFxuIiwgZ3ApOworCQlpZiAodHJhbnMtPm52bV9kZXZpY2VfdHlwZSAhPSBOVk1fREVWSUNFX1RZUEVfRUVQUk9NKSB7CisJCQlJV0xfRVJSKHRyYW5zLCAiT1RQIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLCBncCk7CiAJCQlyZXQgPSAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1NSX0VFUFJPTV9HUF9CQURfU0lHTkFUVVJFX0JPVEhfRUVQX0FORF9PVFA6CiAJZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiYmFkIEVFUFJPTS9PVFAgc2lnbmF0dXJlLCB0eXBlPSVzLCAiCisJCUlXTF9FUlIodHJhbnMsICJiYWQgRUVQUk9NL09UUCBzaWduYXR1cmUsIHR5cGU9JXMsICIKIAkJCSJFRVBST01fR1A9MHglMDh4XG4iLAotCQkJKHByaXYtPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQorCQkJKHRyYW5zLT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkKIAkJCT8gIk9UUCIgOiAiRUVQUk9NIiwgZ3ApOwogCQlyZXQgPSAtRU5PRU5UOwogCQlicmVhazsKQEAgLTIxNSwxMSArMjE1LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdTE2IGl3bF9lZXByb21fcXVlcnkxNihjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHNpemVfdCBvZmZzZXQpCit1MTYgaXdsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLCBzaXplX3Qgb2Zmc2V0KQogewotCWlmICghcHJpdi0+ZWVwcm9tKQorCWlmICghc2hyZC0+ZWVwcm9tKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gKHUxNilwcml2LT5lZXByb21bb2Zmc2V0XSB8ICgodTE2KXByaXYtPmVlcHJvbVtvZmZzZXQgKyAxXSA8PCA4KTsKKwlyZXR1cm4gKHUxNilzaHJkLT5lZXByb21bb2Zmc2V0XSB8ICgodTE2KXNocmQtPmVlcHJvbVtvZmZzZXQgKyAxXSA8PCA4KTsKIH0KIAogaW50IGl3bF9lZXByb21fY2hlY2tfdmVyc2lvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0yMjcsMTEgKzIyNywxMSBAQAogCXUxNiBlZXByb21fdmVyOwogCXUxNiBjYWxpYl92ZXI7CiAKLQllZXByb21fdmVyID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9WRVJTSU9OKTsKLQljYWxpYl92ZXIgPSBpd2xhZ25fZWVwcm9tX2NhbGliX3ZlcnNpb24ocHJpdik7CisJZWVwcm9tX3ZlciA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LT5zaHJkLCBFRVBST01fVkVSU0lPTik7CisJY2FsaWJfdmVyID0gaXdsX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHByaXYtPnNocmQpOwogCi0JaWYgKGVlcHJvbV92ZXIgPCBwcml2LT5jZmctPmVlcHJvbV92ZXIgfHwKLQkgICAgY2FsaWJfdmVyIDwgcHJpdi0+Y2ZnLT5lZXByb21fY2FsaWJfdmVyKQorCWlmIChlZXByb21fdmVyIDwgY2ZnKHByaXYpLT5lZXByb21fdmVyIHx8CisJICAgIGNhbGliX3ZlciA8IGNmZyhwcml2KS0+ZWVwcm9tX2NhbGliX3ZlcikKIAkJZ290byBlcnI7CiAKIAlJV0xfSU5GTyhwcml2LCAiZGV2aWNlIEVFUFJPTSBWRVI9MHgleCwgQ0FMSUI9MHgleFxuIiwKQEAgLTI0MSw0NSArMjQxLDQ2IEBACiBlcnI6CiAJSVdMX0VSUihwcml2LCAiVW5zdXBwb3J0ZWQgKHRvbyBvbGQpIEVFUFJPTSBWRVI9MHgleCA8IDB4JXggIgogCQkgICJDQUxJQj0weCV4IDwgMHgleFxuIiwKLQkJICBlZXByb21fdmVyLCBwcml2LT5jZmctPmVlcHJvbV92ZXIsCi0JCSAgY2FsaWJfdmVyLCAgcHJpdi0+Y2ZnLT5lZXByb21fY2FsaWJfdmVyKTsKKwkJICBlZXByb21fdmVyLCBjZmcocHJpdiktPmVlcHJvbV92ZXIsCisJCSAgY2FsaWJfdmVyLCAgY2ZnKHByaXYpLT5lZXByb21fY2FsaWJfdmVyKTsKIAlyZXR1cm4gLUVJTlZBTDsKIAogfQogCiBpbnQgaXdsX2VlcHJvbV9jaGVja19za3Uoc3RydWN0IGl3bF9wcml2ICpwcml2KQogeworCXN0cnVjdCBpd2xfc2hhcmVkICpzaHJkID0gcHJpdi0+c2hyZDsKIAl1MTYgcmFkaW9fY2ZnOwogCi0JaWYgKCFwcml2LT5jZmctPnNrdSkgeworCWlmICghY2ZnKHByaXYpLT5za3UpIHsKIAkJLyogbm90IHVzaW5nIHNrdSBvdmVyd3JpdGUgKi8KLQkJcHJpdi0+Y2ZnLT5za3UgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1NLVV9DQVApOwotCQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFICYmCi0JCSAgICAhcHJpdi0+Y2ZnLT5odF9wYXJhbXMpIHsKKwkJY2ZnKHByaXYpLT5za3UgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX1NLVV9DQVApOworCQlpZiAoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFICYmCisJCSAgICAhY2ZnKHByaXYpLT5odF9wYXJhbXMpIHsKIAkJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgMTFuIGNvbmZpZ3VyYXRpb25cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0JaWYgKCFwcml2LT5jZmctPnNrdSkgeworCWlmICghY2ZnKHByaXYpLT5za3UpIHsKIAkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBkZXZpY2Ugc2t1XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JSVdMX0lORk8ocHJpdiwgIkRldmljZSBTS1U6IDBYJXhcbiIsIHByaXYtPmNmZy0+c2t1KTsKKwlJV0xfSU5GTyhwcml2LCAiRGV2aWNlIFNLVTogMHglWFxuIiwgY2ZnKHByaXYpLT5za3UpOwogCi0JaWYgKCFwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmJiAhcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpIHsKKwlpZiAoIWNmZyhwcml2KS0+dmFsaWRfdHhfYW50ICYmICFjZmcocHJpdiktPnZhbGlkX3J4X2FudCkgewogCQkvKiBub3QgdXNpbmcgLmNmZyBvdmVyd3JpdGUgKi8KLQkJcmFkaW9fY2ZnID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9SQURJT19DT05GSUcpOwotCQlwcml2LT5jZmctPnZhbGlkX3R4X2FudCA9IEVFUFJPTV9SRl9DRkdfVFhfQU5UX01TSyhyYWRpb19jZmcpOwotCQlwcml2LT5jZmctPnZhbGlkX3J4X2FudCA9IEVFUFJPTV9SRl9DRkdfUlhfQU5UX01TSyhyYWRpb19jZmcpOwotCQlpZiAoIXByaXYtPmNmZy0+dmFsaWRfdHhfYW50IHx8ICFwcml2LT5jZmctPnZhbGlkX3J4X2FudCkgewotCQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBjaGFpbiAoMFgleCwgMFgleClcbiIsCi0JCQkJcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQsCi0JCQkJcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOworCQlyYWRpb19jZmcgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX1JBRElPX0NPTkZJRyk7CisJCWNmZyhwcml2KS0+dmFsaWRfdHhfYW50ID0gRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHJhZGlvX2NmZyk7CisJCWNmZyhwcml2KS0+dmFsaWRfcnhfYW50ID0gRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHJhZGlvX2NmZyk7CisJCWlmICghY2ZnKHByaXYpLT52YWxpZF90eF9hbnQgfHwgIWNmZyhwcml2KS0+dmFsaWRfcnhfYW50KSB7CisJCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIGNoYWluICgweCVYLCAweCVYKVxuIiwKKwkJCQljZmcocHJpdiktPnZhbGlkX3R4X2FudCwKKwkJCQljZmcocHJpdiktPnZhbGlkX3J4X2FudCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlJV0xfSU5GTyhwcml2LCAiVmFsaWQgVHggYW50OiAwWCV4LCBWYWxpZCBSeCBhbnQ6IDBYJXhcbiIsCi0JCQkgcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQsIHByaXYtPmNmZy0+dmFsaWRfcnhfYW50KTsKKwkJSVdMX0lORk8ocHJpdiwgIlZhbGlkIFR4IGFudDogMHglWCwgVmFsaWQgUnggYW50OiAweCVYXG4iLAorCQkJIGNmZyhwcml2KS0+dmFsaWRfdHhfYW50LCBjZmcocHJpdiktPnZhbGlkX3J4X2FudCk7CiAJfQogCS8qCiAJICogZm9yIHNvbWUgc3BlY2lhbCBjYXNlcywKQEAgLTI4OSw5ICsyOTAsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGl3bF9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4ICptYWMpCit2b2lkIGl3bF9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwgdTggKm1hYykKIHsKLQljb25zdCB1OCAqYWRkciA9IGl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LAorCWNvbnN0IHU4ICphZGRyID0gaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsCiAJCQkJCUVFUFJPTV9NQUNfQUREUkVTUyk7CiAJbWVtY3B5KG1hYywgYWRkciwgRVRIX0FMRU4pOwogfQpAQCAtMzAyLDE5ICszMDMsMTkgQEAKICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGl3bF9zZXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaXdsX2FjY2Vzc19tb2RlIG1vZGUpCitzdGF0aWMgdm9pZCBpd2xfc2V0X290cF9hY2Nlc3Moc3RydWN0IGl3bF9idXMgKmJ1cywgZW51bSBpd2xfYWNjZXNzX21vZGUgbW9kZSkKIHsKLQlpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcpOworCWl3bF9yZWFkMzIoYnVzLCBDU1JfT1RQX0dQX1JFRyk7CiAKIAlpZiAobW9kZSA9PSBJV0xfT1RQX0FDQ0VTU19BQlNPTFVURSkKLQkJaXdsX2NsZWFyX2JpdChidXMocHJpdiksIENTUl9PVFBfR1BfUkVHLAorCQlpd2xfY2xlYXJfYml0KGJ1cywgQ1NSX09UUF9HUF9SRUcsCiAJCQkgICAgICBDU1JfT1RQX0dQX1JFR19PVFBfQUNDRVNTX01PREUpOwogCWVsc2UKLQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRywKKwkJaXdsX3NldF9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCSAgICBDU1JfT1RQX0dQX1JFR19PVFBfQUNDRVNTX01PREUpOwogfQogCi1zdGF0aWMgaW50IGl3bF9nZXRfbnZtX3R5cGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgaHdfcmV2KQorc3RhdGljIGludCBpd2xfZ2V0X252bV90eXBlKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBod19yZXYpCiB7CiAJdTMyIG90cGdwOwogCWludCBudm1fdHlwZTsKQEAgLTMyMiw3ICszMjMsNyBAQAogCS8qIE9UUCBvbmx5IHZhbGlkIGZvciBDUC9QUCBhbmQgYWZ0ZXIgKi8KIAlzd2l0Y2ggKGh3X3JldiAmIENTUl9IV19SRVZfVFlQRV9NU0spIHsKIAljYXNlIENTUl9IV19SRVZfVFlQRV9OT05FOgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGhhcmR3YXJlIHR5cGVcbiIpOworCQlJV0xfRVJSKGJ1cywgIlVua25vd24gaGFyZHdhcmUgdHlwZVxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCWNhc2UgQ1NSX0hXX1JFVl9UWVBFXzUzMDA6CiAJY2FzZSBDU1JfSFdfUkVWX1RZUEVfNTM1MDoKQEAgLTMzMSw3ICszMzIsNyBAQAogCQludm1fdHlwZSA9IE5WTV9ERVZJQ0VfVFlQRV9FRVBST007CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW90cGdwID0gaXdsX3JlYWQzMihidXMocHJpdiksIENTUl9PVFBfR1BfUkVHKTsKKwkJb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cywgQ1NSX09UUF9HUF9SRUcpOwogCQlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19ERVZJQ0VfU0VMRUNUKQogCQkJbnZtX3R5cGUgPSBOVk1fREVWSUNFX1RZUEVfT1RQOwogCQllbHNlCkBAIC0zNDEsNzMgKzM0Miw3MyBAQAogCXJldHVybiAgbnZtX3R5cGU7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX2luaXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGl3bF9pbml0X290cF9hY2Nlc3Moc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKIAlpbnQgcmV0OwogCiAJLyogRW5hYmxlIDQwTUh6IHJhZGlvIGNsb2NrICovCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfR1BfQ05UUkwsCi0JCSAgICBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX0dQX0NOVFJMKSB8CisJaXdsX3dyaXRlMzIoYnVzLCBDU1JfR1BfQ05UUkwsCisJCSAgICBpd2xfcmVhZDMyKGJ1cywgQ1NSX0dQX0NOVFJMKSB8CiAJCSAgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKIAogCS8qIHdhaXQgZm9yIGNsb2NrIHRvIGJlIHJlYWR5ICovCi0JcmV0ID0gaXdsX3BvbGxfYml0KGJ1cyhwcml2KSwgQ1NSX0dQX0NOVFJMLAorCXJldCA9IGl3bF9wb2xsX2JpdChidXMsIENTUl9HUF9DTlRSTCwKIAkJCQkgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKIAkJCQkgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKIAkJCQkgMjUwMDApOwogCWlmIChyZXQgPCAwKQotCQlJV0xfRVJSKHByaXYsICJUaW1lIG91dCBhY2Nlc3MgT1RQXG4iKTsKKwkJSVdMX0VSUihidXMsICJUaW1lIG91dCBhY2Nlc3MgT1RQXG4iKTsKIAllbHNlIHsKLQkJaXdsX3NldF9iaXRzX3BycGgoYnVzKHByaXYpLCBBUE1HX1BTX0NUUkxfUkVHLAorCQlpd2xfc2V0X2JpdHNfcHJwaChidXMsIEFQTUdfUFNfQ1RSTF9SRUcsCiAJCQkJICBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7CiAJCXVkZWxheSg1KTsKLQkJaXdsX2NsZWFyX2JpdHNfcHJwaChidXMocHJpdiksIEFQTUdfUFNfQ1RSTF9SRUcsCisJCWl3bF9jbGVhcl9iaXRzX3BycGgoYnVzLCBBUE1HX1BTX0NUUkxfUkVHLAogCQkJCSAgICBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUSk7CiAKIAkJLyoKIAkJICogQ1NSIGF1dG8gY2xvY2sgZ2F0ZSBkaXNhYmxlIGJpdCAtCiAJCSAqIHRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBIVyB3aXRoIE9UUCBzaGFkb3cgUkFNCiAJCSAqLwotCQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JhbV9zdXBwb3J0KQotCQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfREJHX0xJTktfUFdSX01HTVRfUkVHLAorCQlpZiAoY2ZnKGJ1cyktPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmFtX3N1cHBvcnQpCisJCQlpd2xfc2V0X2JpdChidXMsIENTUl9EQkdfTElOS19QV1JfTUdNVF9SRUcsCiAJCQkJQ1NSX1JFU0VUX0xJTktfUFdSX01HTVRfRElTQUJMRUQpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bF9yZWFkX290cF93b3JkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGFkZHIsIF9fbGUxNiAqZWVwcm9tX2RhdGEpCitzdGF0aWMgaW50IGl3bF9yZWFkX290cF93b3JkKHN0cnVjdCBpd2xfYnVzICpidXMsIHUxNiBhZGRyLCBfX2xlMTYgKmVlcHJvbV9kYXRhKQogewogCWludCByZXQgPSAwOwogCXUzMiByOwogCXUzMiBvdHBncDsKIAotCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX0VFUFJPTV9SRUcsCisJaXdsX3dyaXRlMzIoYnVzLCBDU1JfRUVQUk9NX1JFRywKIAkJICAgIENTUl9FRVBST01fUkVHX01TS19BRERSICYgKGFkZHIgPDwgMSkpOwotCXJldCA9IGl3bF9wb2xsX2JpdChidXMocHJpdiksIENTUl9FRVBST01fUkVHLAorCXJldCA9IGl3bF9wb2xsX2JpdChidXMsIENTUl9FRVBST01fUkVHLAogCQkJCSBDU1JfRUVQUk9NX1JFR19SRUFEX1ZBTElEX01TSywKIAkJCQkgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCiAJCQkJIElXTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlRpbWUgb3V0IHJlYWRpbmcgT1RQWyVkXVxuIiwgYWRkcik7CisJCUlXTF9FUlIoYnVzLCAiVGltZSBvdXQgcmVhZGluZyBPVFBbJWRdXG4iLCBhZGRyKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JciA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfRUVQUk9NX1JFRyk7CisJciA9IGl3bF9yZWFkMzIoYnVzLCBDU1JfRUVQUk9NX1JFRyk7CiAJLyogY2hlY2sgZm9yIEVDQyBlcnJvcnM6ICovCi0Jb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcpOworCW90cGdwID0gaXdsX3JlYWQzMihidXMsIENTUl9PVFBfR1BfUkVHKTsKIAlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19FQ0NfVU5DT1JSX1NUQVRVU19NU0spIHsKIAkJLyogc3RvcCBpbiB0aGlzIGNhc2UgKi8KIAkJLyogc2V0IHRoZSB1bmNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KLQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRywKKwkJaXdsX3NldF9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCUNTUl9PVFBfR1BfUkVHX0VDQ19VTkNPUlJfU1RBVFVTX01TSyk7Ci0JCUlXTF9FUlIocHJpdiwgIlVuY29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgYWJvcnQgT1RQIHJlYWRcbiIpOworCQlJV0xfRVJSKGJ1cywgIlVuY29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgYWJvcnQgT1RQIHJlYWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKG90cGdwICYgQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSykgewogCQkvKiBjb250aW51ZSBpbiB0aGlzIGNhc2UgKi8KIAkJLyogc2V0IHRoZSBjb3JyZWN0YWJsZSBPVFAgRUNDIGJpdCBmb3IgYWNrbm93bGVkZ2VtZW50ICovCi0JCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcsCisJCWl3bF9zZXRfYml0KGJ1cywgQ1NSX09UUF9HUF9SRUcsCiAJCQkJQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSyk7Ci0JCUlXTF9FUlIocHJpdiwgIkNvcnJlY3RhYmxlIE9UUCBFQ0MgZXJyb3IsIGNvbnRpbnVlIHJlYWRcbiIpOworCQlJV0xfRVJSKGJ1cywgIkNvcnJlY3RhYmxlIE9UUCBFQ0MgZXJyb3IsIGNvbnRpbnVlIHJlYWRcbiIpOwogCX0KIAkqZWVwcm9tX2RhdGEgPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKIAlyZXR1cm4gMDsKQEAgLTQxNiwyMCArNDE3LDIwIEBACiAvKgogICogaXdsX2lzX290cF9lbXB0eTogY2hlY2sgZm9yIGVtcHR5IE9UUAogICovCi1zdGF0aWMgYm9vbCBpd2xfaXNfb3RwX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBib29sIGl3bF9pc19vdHBfZW1wdHkoc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKIAl1MTYgbmV4dF9saW5rX2FkZHIgPSAwOwogCV9fbGUxNiBsaW5rX3ZhbHVlOwogCWJvb2wgaXNfZW1wdHkgPSBmYWxzZTsKIAogCS8qIGxvY2F0ZSB0aGUgYmVnaW5uaW5nIG9mIE9UUCBsaW5rIGxpc3QgKi8KLQlpZiAoIWl3bF9yZWFkX290cF93b3JkKHByaXYsIG5leHRfbGlua19hZGRyLCAmbGlua192YWx1ZSkpIHsKKwlpZiAoIWl3bF9yZWFkX290cF93b3JkKGJ1cywgbmV4dF9saW5rX2FkZHIsICZsaW5rX3ZhbHVlKSkgewogCQlpZiAoIWxpbmtfdmFsdWUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIk9UUCBpcyBlbXB0eVxuIik7CisJCQlJV0xfRVJSKGJ1cywgIk9UUCBpcyBlbXB0eVxuIik7CiAJCQlpc19lbXB0eSA9IHRydWU7CiAJCX0KIAl9IGVsc2UgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gcmVhZCBmaXJzdCBibG9jayBvZiBPVFAgbGlzdC5cbiIpOworCQlJV0xfRVJSKGJ1cywgIlVuYWJsZSB0byByZWFkIGZpcnN0IGJsb2NrIG9mIE9UUCBsaXN0LlxuIik7CiAJCWlzX2VtcHR5ID0gdHJ1ZTsKIAl9CiAKQEAgLTQ0Niw3ICs0NDcsNyBAQAogICogICB3ZSBzaG91bGQgcmVhZCBhbmQgdXNlZCB0byBjb25maWd1cmUgdGhlIGRldmljZS4KICAqICAgb25seSBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGlmIHNoYWRvdyBSQU0gaXMgZGlzYWJsZWQKICAqLwotc3RhdGljIGludCBpd2xfZmluZF9vdHBfaW1hZ2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAorc3RhdGljIGludCBpd2xfZmluZF9vdHBfaW1hZ2Uoc3RydWN0IGl3bF9idXMgKmJ1cywKIAkJCQkJdTE2ICp2YWxpZGJsb2NrYWRkcikKIHsKIAl1MTYgbmV4dF9saW5rX2FkZHIgPSAwLCB2YWxpZF9hZGRyOwpAQCAtNDU0LDEwICs0NTUsMTAgQEAKIAlpbnQgdXNlZGJsb2NrcyA9IDA7CiAKIAkvKiBzZXQgYWRkcmVzc2luZyBtb2RlIHRvIGFic29sdXRlIHRvIHRyYXZlcnNlIHRoZSBsaW5rIGxpc3QgKi8KLQlpd2xfc2V0X290cF9hY2Nlc3MocHJpdiwgSVdMX09UUF9BQ0NFU1NfQUJTT0xVVEUpOworCWl3bF9zZXRfb3RwX2FjY2VzcyhidXMsIElXTF9PVFBfQUNDRVNTX0FCU09MVVRFKTsKIAogCS8qIGNoZWNraW5nIGZvciBlbXB0eSBPVFAgb3IgZXJyb3IgKi8KLQlpZiAoaXdsX2lzX290cF9lbXB0eShwcml2KSkKKwlpZiAoaXdsX2lzX290cF9lbXB0eShidXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC00NzEsOSArNDcyLDkgQEAKIAkJICovCiAJCXZhbGlkX2FkZHIgPSBuZXh0X2xpbmtfYWRkcjsKIAkJbmV4dF9saW5rX2FkZHIgPSBsZTE2X3RvX2NwdShsaW5rX3ZhbHVlKSAqIHNpemVvZih1MTYpOwotCQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJPVFAgYmxvY2tzICVkIGFkZHIgMHgleFxuIiwKKwkJSVdMX0RFQlVHX0VFUFJPTShidXMsICJPVFAgYmxvY2tzICVkIGFkZHIgMHgleFxuIiwKIAkJCSAgICAgICB1c2VkYmxvY2tzLCBuZXh0X2xpbmtfYWRkcik7Ci0JCWlmIChpd2xfcmVhZF9vdHBfd29yZChwcml2LCBuZXh0X2xpbmtfYWRkciwgJmxpbmtfdmFsdWUpKQorCQlpZiAoaXdsX3JlYWRfb3RwX3dvcmQoYnVzLCBuZXh0X2xpbmtfYWRkciwgJmxpbmtfdmFsdWUpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICghbGlua192YWx1ZSkgewogCQkJLyoKQEAgLTQ4OCwxMCArNDg5LDEwIEBACiAJCX0KIAkJLyogbW9yZSBpbiB0aGUgbGluayBsaXN0LCBjb250aW51ZSAqLwogCQl1c2VkYmxvY2tzKys7Ci0JfSB3aGlsZSAodXNlZGJsb2NrcyA8PSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5tYXhfbGxfaXRlbXMpOworCX0gd2hpbGUgKHVzZWRibG9ja3MgPD0gY2ZnKGJ1cyktPmJhc2VfcGFyYW1zLT5tYXhfbGxfaXRlbXMpOwogCiAJLyogT1RQIGhhcyBubyB2YWxpZCBibG9ja3MgKi8KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJPVFAgaGFzIG5vIHZhbGlkIGJsb2Nrc1xuIik7CisJSVdMX0RFQlVHX0VFUFJPTShidXMsICJPVFAgaGFzIG5vIHZhbGlkIGJsb2Nrc1xuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTUwNCwyOCArNTA1LDI4IEBACiAgKiBpd2xfZ2V0X21heF90eHBvd2VyX2F2ZyAtIGdldCB0aGUgaGlnaGVzdCB0eCBwb3dlciBmcm9tIGFsbCBjaGFpbnMuCiAgKiAgICAgZmluZCB0aGUgaGlnaGVzdCB0eCBwb3dlciBmcm9tIGFsbCBjaGFpbnMgZm9yIHRoZSBjaGFubmVsCiAgKi8KLXN0YXRpYyBzOCBpd2xfZ2V0X21heF90eHBvd2VyX2F2ZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgczggaXdsX2dldF9tYXhfdHhwb3dlcl9hdmcoc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJc3RydWN0IGl3bF9lZXByb21fZW5oYW5jZWRfdHhwd3IgKmVuaGFuY2VkX3R4cG93ZXIsCiAJCWludCBlbGVtZW50LCBzOCAqbWF4X3R4cG93ZXJfaW5faGFsZl9kYm0pCiB7CiAJczggbWF4X3R4cG93ZXJfYXZnID0gMDsgLyogKGRCbSkgKi8KIAogCS8qIFRha2UgdGhlIGhpZ2hlc3QgdHggcG93ZXIgZnJvbSBhbnkgdmFsaWQgY2hhaW5zICovCi0JaWYgKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmIEFOVF9BKSAmJgorCWlmICgoY2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQSkgJiYKIAkgICAgKGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fYV9tYXggPiBtYXhfdHhwb3dlcl9hdmcpKQogCQltYXhfdHhwb3dlcl9hdmcgPSBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2FfbWF4OwotCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQikgJiYKKwlpZiAoKGNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0IpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2JfbWF4ID4gbWF4X3R4cG93ZXJfYXZnKSkKIAkJbWF4X3R4cG93ZXJfYXZnID0gZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9iX21heDsKLQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0MpICYmCisJaWYgKChjZmctPnZhbGlkX3R4X2FudCAmIEFOVF9DKSAmJgogCSAgICAoZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9jX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9IGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fY19tYXg7Ci0JaWYgKCgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FCKSB8Ci0JICAgIChwcml2LT5jZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQkMpIHwKLQkgICAgKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQykpICYmCisJaWYgKCgoY2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FCKSB8CisJICAgIChjZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQkMpIHwKKwkgICAgKGNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQykpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8yX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9ICBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8yX21heDsKLQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQkMpICYmCisJaWYgKChjZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQUJDKSAmJgogCSAgICAoZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5taW1vM19tYXggPiBtYXhfdHhwb3dlcl9hdmcpKQogCQltYXhfdHhwb3dlcl9hdmcgPSBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8zX21heDsKIApAQCAtNTgyLDYgKzU4Myw3IEBACiAKIHZvaWQgaXdsX2VlcHJvbV9lbmhhbmNlZF90eHBvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKKwlzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCA9IHByaXYtPnNocmQ7CiAJc3RydWN0IGl3bF9lZXByb21fZW5oYW5jZWRfdHhwd3IgKnR4cF9hcnJheSwgKnR4cDsKIAlpbnQgaWR4LCBlbnRyaWVzOwogCV9fbGUxNiAqdHhwX2xlbjsKQEAgLTU5MCwxMCArNTkyLDEwIEBACiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaXdsX2VlcHJvbV9lbmhhbmNlZF90eHB3cikgIT0gOCk7CiAKIAkvKiB0aGUgbGVuZ3RoIGlzIGluIDE2LWJpdCB3b3JkcywgYnV0IHdlIHdhbnQgZW50cmllcyAqLwotCXR4cF9sZW4gPSAoX19sZTE2ICopIGl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fVFhQX1NaX09GRlMpOworCXR4cF9sZW4gPSAoX19sZTE2ICopIGl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBFRVBST01fVFhQX1NaX09GRlMpOwogCWVudHJpZXMgPSBsZTE2X3RvX2NwdXAodHhwX2xlbikgKiAyIC8gRUVQUk9NX1RYUF9FTlRSWV9MRU47CiAKLQl0eHBfYXJyYXkgPSAodm9pZCAqKSBpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1RYUF9PRkZTKTsKKwl0eHBfYXJyYXkgPSAodm9pZCAqKSBpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwgRUVQUk9NX1RYUF9PRkZTKTsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgZW50cmllczsgaWR4KyspIHsKIAkJdHhwID0gJnR4cF9hcnJheVtpZHhdOwpAQCAtNjI3LDcgKzYyOSw3IEBACiAJCQkJICgodHhwLT5kZWx0YV8yMF9pbl80MCAmIDB4ZjApID4+IDQpLAogCQkJCSAodHhwLT5kZWx0YV8yMF9pbl80MCAmIDB4MGYpKTsKIAotCQltYXhfdHhwX2F2ZyA9IGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnKHByaXYsIHR4cF9hcnJheSwgaWR4LAorCQltYXhfdHhwX2F2ZyA9IGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnKGNmZyhwcml2KSwgdHhwX2FycmF5LCBpZHgsCiAJCQkJCQkgICAgICAmbWF4X3R4cF9hdmdfaGFsZmRibSk7CiAKIAkJLyoKQEAgLTY0NiwxMiArNjQ4LDEzIEBACiAvKioKICAqIGl3bF9lZXByb21faW5pdCAtIHJlYWQgRUVQUk9NIGNvbnRlbnRzCiAgKgotICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIHByaXYtPmVlcHJvbQorICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIHNocmQtPmVlcHJvbQogICoKICAqIE5PVEU6ICBUaGlzIHJvdXRpbmUgdXNlcyB0aGUgbm9uLWRlYnVnIElPIGFjY2VzcyBmdW5jdGlvbnMuCiAgKi8KIGludCBpd2xfZWVwcm9tX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgaHdfcmV2KQogeworCXN0cnVjdCBpd2xfc2hhcmVkICpzaHJkID0gcHJpdi0+c2hyZDsKIAlfX2xlMTYgKmU7CiAJdTMyIGdwID0gaXdsX3JlYWQzMihidXMocHJpdiksIENTUl9FRVBST01fR1ApOwogCWludCBzejsKQEAgLTY2MCwyMiArNjYzLDIyIEBACiAJdTE2IHZhbGlkYmxvY2thZGRyID0gMDsKIAl1MTYgY2FjaGVfYWRkciA9IDA7CiAKLQlwcml2LT5udm1fZGV2aWNlX3R5cGUgPSBpd2xfZ2V0X252bV90eXBlKHByaXYsIGh3X3Jldik7Ci0JaWYgKHByaXYtPm52bV9kZXZpY2VfdHlwZSA9PSAtRU5PRU5UKQorCXRyYW5zKHByaXYpLT5udm1fZGV2aWNlX3R5cGUgPSBpd2xfZ2V0X252bV90eXBlKGJ1cyhwcml2KSwgaHdfcmV2KTsKKwlpZiAodHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9PSAtRU5PRU5UKQogCQlyZXR1cm4gLUVOT0VOVDsKIAkvKiBhbGxvY2F0ZSBlZXByb20gKi8KLQlzeiA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplOworCXN6ID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7CiAJSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiTlZNIHNpemUgPSAlZFxuIiwgc3opOwotCXByaXYtPmVlcHJvbSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+ZWVwcm9tKSB7CisJc2hyZC0+ZWVwcm9tID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaHJkLT5lZXByb20pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBhbGxvY19lcnI7CiAJfQotCWUgPSAoX19sZTE2ICopcHJpdi0+ZWVwcm9tOworCWUgPSAoX19sZTE2ICopc2hyZC0+ZWVwcm9tOwogCiAJaXdsX2FwbV9pbml0KHByaXYpOwogCi0JcmV0ID0gaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHByaXYpOworCXJldCA9IGl3bF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZSh0cmFucyhwcml2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJSVdMX0VSUihwcml2LCAiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOwogCQlyZXQgPSAtRU5PRU5UOwpAQCAtNjgzLDE2ICs2ODYsMTYgQEAKIAl9CiAKIAkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCi0JcmV0ID0gaXdsX2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShwcml2KTsKKwlyZXQgPSBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKGJ1cyhwcml2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIGFjcXVpcmUgRUVQUk9NIHNlbWFwaG9yZS5cbiIpOwogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIGVycjsKIAl9CiAKLQlpZiAocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApIHsKKwlpZiAodHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKSB7CiAKLQkJcmV0ID0gaXdsX2luaXRfb3RwX2FjY2Vzcyhwcml2KTsKKwkJcmV0ID0gaXdsX2luaXRfb3RwX2FjY2VzcyhidXMocHJpdikpOwogCQlpZiAocmV0KSB7CiAJCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBPVFAgYWNjZXNzLlxuIik7CiAJCQlyZXQgPSAtRU5PRU5UOwpAQCAtNzA2LDggKzcwOSw4IEBACiAJCQkgICAgIENTUl9PVFBfR1BfUkVHX0VDQ19DT1JSX1NUQVRVU19NU0sgfAogCQkJICAgICBDU1JfT1RQX0dQX1JFR19FQ0NfVU5DT1JSX1NUQVRVU19NU0spOwogCQkvKiB0cmF2ZXJzaW5nIHRoZSBsaW5rZWQgbGlzdCBpZiBubyBzaGFkb3cgcmFtIHN1cHBvcnRlZCAqLwotCQlpZiAoIXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNoYWRvd19yYW1fc3VwcG9ydCkgewotCQkJaWYgKGl3bF9maW5kX290cF9pbWFnZShwcml2LCAmdmFsaWRibG9ja2FkZHIpKSB7CisJCWlmICghY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JhbV9zdXBwb3J0KSB7CisJCQlpZiAoaXdsX2ZpbmRfb3RwX2ltYWdlKGJ1cyhwcml2KSwgJnZhbGlkYmxvY2thZGRyKSkgewogCQkJCXJldCA9IC1FTk9FTlQ7CiAJCQkJZ290byBkb25lOwogCQkJfQpAQCAtNzE2LDcgKzcxOSw3IEBACiAJCSAgICAgYWRkciArPSBzaXplb2YodTE2KSkgewogCQkJX19sZTE2IGVlcHJvbV9kYXRhOwogCi0JCQlyZXQgPSBpd2xfcmVhZF9vdHBfd29yZChwcml2LCBhZGRyLCAmZWVwcm9tX2RhdGEpOworCQkJcmV0ID0gaXdsX3JlYWRfb3RwX3dvcmQoYnVzKHByaXYpLCBhZGRyLCAmZWVwcm9tX2RhdGEpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGRvbmU7CiAJCQllW2NhY2hlX2FkZHIgLyAyXSA9IGVlcHJvbV9kYXRhOwpAQCAtNzQ0LDI3ICs3NDcsMjcgQEAKIAl9CiAKIAlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJOVk0gVHlwZTogJXMsIHZlcnNpb246IDB4JXhcbiIsCi0JCSAgICAgICAocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCisJCSAgICAgICAodHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQogCQkgICAgICAgPyAiT1RQIiA6ICJFRVBST00iLAotCQkgICAgICAgaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9WRVJTSU9OKSk7CisJCSAgICAgICBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX1ZFUlNJT04pKTsKIAogCXJldCA9IDA7CiBkb25lOgotCWl3bF9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUocHJpdik7CisJaXdsX2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShidXMocHJpdikpOwogCiBlcnI6CiAJaWYgKHJldCkKLQkJaXdsX2VlcHJvbV9mcmVlKHByaXYpOworCQlpd2xfZWVwcm9tX2ZyZWUocHJpdi0+c2hyZCk7CiAJLyogUmVzZXQgY2hpcCB0byBzYXZlIHBvd2VyIHVudGlsIHdlIGxvYWQgdUNvZGUgZHVyaW5nICJ1cCIuICovCiAJaXdsX2FwbV9zdG9wKHByaXYpOwogYWxsb2NfZXJyOgogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaXdsX2VlcHJvbV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3ZvaWQgaXdsX2VlcHJvbV9mcmVlKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKQogewotCWtmcmVlKHByaXYtPmVlcHJvbSk7Ci0JcHJpdi0+ZWVwcm9tID0gTlVMTDsKKwlrZnJlZShzaHJkLT5lZXByb20pOworCXNocmQtPmVlcHJvbSA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9pbml0X2JhbmRfcmVmZXJlbmNlKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTc3Miw0OSArNzc1LDUwIEBACiAJCQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCiAJCQljb25zdCB1OCAqKmVlcHJvbV9jaF9pbmRleCkKIHsKLQl1MzIgb2Zmc2V0ID0gcHJpdi0+Y2ZnLT5saWItPgorCXN0cnVjdCBpd2xfc2hhcmVkICpzaHJkID0gcHJpdi0+c2hyZDsKKwl1MzIgb2Zmc2V0ID0gY2ZnKHByaXYpLT5saWItPgogCQkJZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzW2VlcF9iYW5kIC0gMV07CiAJc3dpdGNoIChlZXBfYmFuZCkgewogCWNhc2UgMToJCS8qIDIuNEdIeiBiYW5kICovCiAJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGl3bF9lZXByb21fYmFuZF8xKTsKIAkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgb2Zmc2V0KTsKKwkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwgb2Zmc2V0KTsKIAkJKmVlcHJvbV9jaF9pbmRleCA9IGl3bF9lZXByb21fYmFuZF8xOwogCQlicmVhazsKIAljYXNlIDI6CQkvKiA0LjlHSHogYmFuZCAqLwogCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xfZWVwcm9tX2JhbmRfMik7CiAJCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7CisJCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIG9mZnNldCk7CiAJCSplZXByb21fY2hfaW5kZXggPSBpd2xfZWVwcm9tX2JhbmRfMjsKIAkJYnJlYWs7CiAJY2FzZSAzOgkJLyogNS4yR0h6IGJhbmQgKi8KIAkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsX2VlcHJvbV9iYW5kXzMpOwogCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOworCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBvZmZzZXQpOwogCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsX2VlcHJvbV9iYW5kXzM7CiAJCWJyZWFrOwogCWNhc2UgNDoJCS8qIDUuNUdIeiBiYW5kICovCiAJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGl3bF9lZXByb21fYmFuZF80KTsKIAkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgb2Zmc2V0KTsKKwkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwgb2Zmc2V0KTsKIAkJKmVlcHJvbV9jaF9pbmRleCA9IGl3bF9lZXByb21fYmFuZF80OwogCQlicmVhazsKIAljYXNlIDU6CQkvKiA1LjdHSHogYmFuZCAqLwogCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xfZWVwcm9tX2JhbmRfNSk7CiAJCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7CisJCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIG9mZnNldCk7CiAJCSplZXByb21fY2hfaW5kZXggPSBpd2xfZWVwcm9tX2JhbmRfNTsKIAkJYnJlYWs7CiAJY2FzZSA2OgkJLyogMi40R0h6IGh0NDAgY2hhbm5lbHMgKi8KIAkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsX2VlcHJvbV9iYW5kXzYpOwogCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOworCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBvZmZzZXQpOwogCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsX2VlcHJvbV9iYW5kXzY7CiAJCWJyZWFrOwogCWNhc2UgNzoJCS8qIDUgR0h6IGh0NDAgY2hhbm5lbHMgKi8KIAkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsX2VlcHJvbV9iYW5kXzcpOwogCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOworCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBvZmZzZXQpOwogCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsX2VlcHJvbV9iYW5kXzc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC05NzksOSArOTgzLDkgQEAKIAl9CiAKIAkvKiBDaGVjayBpZiB3ZSBkbyBoYXZlIEhUNDAgY2hhbm5lbHMgKi8KLQlpZiAocHJpdi0+Y2ZnLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQorCWlmIChjZmcocHJpdiktPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzVdID09CiAJICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCAmJgotCSAgICBwcml2LT5jZmctPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzZdID09CisJICAgIGNmZyhwcml2KS0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbNl0gPT0KIAkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwKQogCQlyZXR1cm4gMDsKIApAQCAtMTAxNyw4ICsxMDIxLDggQEAKIAkgKiBkcml2ZXIgbmVlZCB0byBwcm9jZXNzIGFkZGl0aW9uIGluZm9ybWF0aW9uCiAJICogdG8gZGV0ZXJtaW5lIHRoZSBtYXggY2hhbm5lbCB0eCBwb3dlciBsaW1pdHMKIAkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5saWItPmVlcHJvbV9vcHMudXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIpCi0JCXByaXYtPmNmZy0+bGliLT5lZXByb21fb3BzLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyKHByaXYpOworCWlmIChjZmcocHJpdiktPmxpYi0+ZWVwcm9tX29wcy51cGRhdGVfZW5oYW5jZWRfdHhwb3dlcikKKwkJY2ZnKHByaXYpLT5saWItPmVlcHJvbV9vcHMudXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIocHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNjQsNyArMTA2OCw3IEBACiB7CiAJdTE2IHJhZGlvX2NmZzsKIAotCXJhZGlvX2NmZyA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fUkFESU9fQ09ORklHKTsKKwlyYWRpb19jZmcgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdi0+c2hyZCwgRUVQUk9NX1JBRElPX0NPTkZJRyk7CiAKIAkvKiB3cml0ZSByYWRpbyBjb25maWcgdmFsdWVzIHRvIHJlZ2lzdGVyICovCiAJaWYgKEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSA8PSBFRVBST01fUkZfQ09ORklHX1RZUEVfTUFYKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oCmluZGV4IGM5NDc0N2UuLjlmYTkzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKIHN0cnVjdCBpd2xfcHJpdjsKK3N0cnVjdCBpd2xfc2hhcmVkOwogCiAvKgogICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKQEAgLTMwNSwxMSArMzA2LDExIEBACiAKIAogaW50IGl3bF9lZXByb21faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBod19yZXYpOwotdm9pZCBpd2xfZWVwcm9tX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3ZvaWQgaXdsX2VlcHJvbV9mcmVlKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKTsKIGludCAgaXdsX2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBpbnQgIGl3bF9lZXByb21fY2hlY2tfc2t1KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1jb25zdCB1OCAqaXdsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCk7Ci11MTYgaXdsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCk7Citjb25zdCB1OCAqaXdsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLCBzaXplX3Qgb2Zmc2V0KTsKK3UxNiBpd2xfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsIHNpemVfdCBvZmZzZXQpOwogaW50IGl3bF9pbml0X2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBjb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqaXdsX2dldF9jaGFubmVsX2luZm8oCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uYwppbmRleCAzZmZhOGU2Li5kNTdlYTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJ1cy0+cmVnX2xvY2ssIGZsYWdzKTsKIAlpd2xfZ3JhYl9uaWNfYWNjZXNzKGJ1cyk7Ci0JdmFsdWUgPSBpd2xfcmVhZDMyKGJ1cyhidXMpLCByZWcpOworCXZhbHVlID0gaXdsX3JlYWQzMihidXMsIHJlZyk7CiAJaXdsX3JlbGVhc2VfbmljX2FjY2VzcyhidXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1cy0+cmVnX2xvY2ssIGZsYWdzKTsKIApAQCAtMjgzLDE2ICsyODMsMjkgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXZvaWQgaXdsX3dyaXRlX3RhcmdfbWVtKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBhZGRyLCB1MzIgdmFsKQoraW50IF9pd2xfd3JpdGVfdGFyZ19tZW1fd29yZHMoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIsCisJCQkJdm9pZCAqYnVmLCBpbnQgd29yZHMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2ZmcywgcmVzdWx0ID0gMDsKKwl1MzIgKnZhbHMgPSBidWY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOwogCWlmICghaXdsX2dyYWJfbmljX2FjY2VzcyhidXMpKSB7CiAJCWl3bF93cml0ZTMyKGJ1cywgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7CiAJCXdtYigpOwotCQlpd2xfd3JpdGUzMihidXMsIEhCVVNfVEFSR19NRU1fV0RBVCwgdmFsKTsKKworCQlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgd29yZHM7IG9mZnMrKykKKwkJCWl3bF93cml0ZTMyKGJ1cywgSEJVU19UQVJHX01FTV9XREFULCB2YWxzW29mZnNdKTsKIAkJaXdsX3JlbGVhc2VfbmljX2FjY2VzcyhidXMpOwotCX0KKwl9IGVsc2UKKwkJcmVzdWx0ID0gLUVCVVNZOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1cy0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBpd2xfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJcmV0dXJuIF9pd2xfd3JpdGVfdGFyZ19tZW1fd29yZHMoYnVzLCBhZGRyLCAmdmFsLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oCmluZGV4IGNlZDJjYmUuLmFhZTJlZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaApAQCAtODUsNiArODUsOSBAQAogCQkJCQkgKGJ1ZnNpemUpIC8gc2l6ZW9mKHUzMikpO1wKIAl9IHdoaWxlICgwKQogCitpbnQgX2l3bF93cml0ZV90YXJnX21lbV93b3JkcyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgYWRkciwKKwkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IHdvcmRzKTsKKwogdTMyIGl3bF9yZWFkX3RhcmdfbWVtKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBhZGRyKTsKLXZvaWQgaXdsX3dyaXRlX3RhcmdfbWVtKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBhZGRyLCB1MzIgdmFsKTsKK2ludCBpd2xfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIsIHUzMiB2YWwpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5jCmluZGV4IGViNTQxNzMuLjE0ZGNiZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5jCkBAIC0xMzcsMTEgKzEzNywxMSBAQAogCX0KIAogCUlXTF9ERUJVR19MRUQocHJpdiwgIkxlZCBibGluayB0aW1lIGNvbXBlbnNhdGlvbj0ldVxuIiwKLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOworCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CiAJbGVkX2NtZC5vbiA9IGl3bF9ibGlua19jb21wZW5zYXRpb24ocHJpdiwgb24sCi0JCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CiAJbGVkX2NtZC5vZmYgPSBpd2xfYmxpbmtfY29tcGVuc2F0aW9uKHByaXYsIG9mZiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKwkJCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKIAogCXJldCA9IGl3bF9zZW5kX2xlZF9jbWQocHJpdiwgJmxlZF9jbWQpOwogCWlmICghcmV0KSB7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKG1vZGUgPT0gSVdMX0xFRF9ERUZBVUxUKQotCQltb2RlID0gcHJpdi0+Y2ZnLT5sZWRfbW9kZTsKKwkJbW9kZSA9IGNmZyhwcml2KS0+bGVkX21vZGU7CiAKIAlwcml2LT5sZWQubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtbGVkIiwKIAkJCQkgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWQuaAppbmRleCAxYzkzZGZlLi4yNTUwYjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWQuaApAQCAtMzYsMjAgKzM2LDYgQEAKICNkZWZpbmUgSVdMX0xFRF9BQ1RJVklUWSAgICAgICAoMDw8MSkKICNkZWZpbmUgSVdMX0xFRF9MSU5LICAgICAgICAgICAoMTw8MSkKIAotLyoKLSAqIExFRCBtb2RlCi0gKiAgICBJV0xfTEVEX0RFRkFVTFQ6ICB1c2UgZGV2aWNlIGRlZmF1bHQKLSAqICAgIElXTF9MRURfUkZfU1RBVEU6IHR1cm4gTEVEIG9uL29mZiBiYXNlZCBvbiBSRiBzdGF0ZQotICoJCQlMRUQgT04gID0gUkYgT04KLSAqCQkJTEVEIE9GRiA9IFJGIE9GRgotICogICAgSVdMX0xFRF9CTElOSzogICAgYWRqdXN0IGxlZCBibGluayByYXRlIGJhc2VkIG9uIGJsaW5rIHRhYmxlCi0gKi8KLWVudW0gaXdsX2xlZF9tb2RlIHsKLQlJV0xfTEVEX0RFRkFVTFQsCi0JSVdMX0xFRF9SRl9TVEFURSwKLQlJV0xfTEVEX0JMSU5LLAotfTsKLQogdm9pZCBpd2xhZ25fbGVkX2VuYWJsZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfbGVkc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9sZWRzX2V4aXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1tYWM4MDIxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNjg5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1tYWM4MDIxMS5jCkBAIC0wLDAgKzEsMTU5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCisgKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgIml3bC1lZXByb20uaCIKKyNpbmNsdWRlICJpd2wtd2lmaS5oIgorI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1pby5oIgorI2luY2x1ZGUgIml3bC1hZ24tY2FsaWIuaCIKKyNpbmNsdWRlICJpd2wtYWduLmgiCisjaW5jbHVkZSAiaXdsLXNoYXJlZC5oIgorI2luY2x1ZGUgIml3bC1idXMuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fc3RhX2FwX2xpbWl0c1tdID0geworCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9BUCksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl8yc3RhX2xpbWl0c1tdID0geworCXsKKwkJLm1heCA9IDIsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3AycF9zdGFfZ29fbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9HTykgfAorCQkJIEJJVChOTDgwMjExX0lGVFlQRV9BUCksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9wMnBfMnN0YV9saW1pdHNbXSA9IHsKKwl7CisJCS5tYXggPSAyLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uCitpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX2R1YWxtb2RlW10gPSB7CisJeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCisJICAubWF4X2ludGVyZmFjZXMgPSAyLAorCSAgLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAorCSAgLmxpbWl0cyA9IGl3bGFnbl9zdGFfYXBfbGltaXRzLAorCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fc3RhX2FwX2xpbWl0cyksCisJfSwKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAubGltaXRzID0gaXdsYWduXzJzdGFfbGltaXRzLAorCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fMnN0YV9saW1pdHMpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbgoraXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnBbXSA9IHsKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCisJICAubGltaXRzID0gaXdsYWduX3AycF9zdGFfZ29fbGltaXRzLAorCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fcDJwX3N0YV9nb19saW1pdHMpLAorCX0sCisJeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCisJICAubWF4X2ludGVyZmFjZXMgPSAyLAorCSAgLmxpbWl0cyA9IGl3bGFnbl9wMnBfMnN0YV9saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9wMnBfMnN0YV9saW1pdHMpLAorCX0sCit9OworCisvKgorICogTm90IGEgbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb24sIGJ1dCBpdCBmaXRzIGluIHdpdGggYWxsIHRoZQorICogb3RoZXIgbWFjODAyMTEgZnVuY3Rpb25zIGdyb3VwZWQgaGVyZS4KKyAqLworaW50IGl3bGFnbl9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgKmNhcGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CisKKwlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtYWduLXJzIjsKKworCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLworCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKKwkJICAgIElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTiB8CisJCSAgICBJRUVFODAyMTFfSFdfTkVFRF9EVElNX1BFUklPRCB8CisJCSAgICBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8CisJCSAgICBJRUVFODAyMTFfSFdfUkVQT1JUU19UWF9BQ0tfU1RBVFVTOworCisJLyoKKwkgKiBJbmNsdWRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHdpbGwgY3Jhc2ggc29tZSBBUCdzLiAgVGhpcworCSAqIHdvcmthcm91bmQgcmVtb3ZlcyB0aGUgc3RpbXVsdXMgd2hpY2ggY2F1c2VzIHRoZSBjcmFzaCB1bnRpbAorCSAqIHRoZSBBUCBzb2Z0d2FyZSBjYW4gYmUgZml4ZWQuCisJaHctPm1heF90eF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKKwkgKi8KKworCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfSFdfU1VQUE9SVFNfUFMgfAorCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1BTOworCisJaWYgKGNmZyhwcml2KS0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKKwkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19EWU5BTUlDX1NNUFMgfAorCQkJICAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7CisKKwlpZiAoY2FwYS0+ZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX01GUCkKKwkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19NRlBfQ0FQQUJMRTsKKworCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2KTsKKwlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3ZpZl9wcml2KTsKKworCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7CisJCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+aW50ZXJmYWNlX21vZGVzOworCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisJfQorCisJQlVJTERfQlVHX09OKE5VTV9JV0xfUlhPTl9DVFggIT0gMik7CisKKwlpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkpIHsKKwkJaHctPndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSBpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX3AycDsKKwkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9CisJCQlBUlJBWV9TSVpFKGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwKTsKKwl9IGVsc2UgaWYgKGh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX0FQKSkgeworCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9CisJCQlpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX2R1YWxtb2RlOworCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KKwkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZSk7CisJfQorCisJaHctPndpcGh5LT5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24gPSAxMDAwOworCisJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZIHwKKwkJCSAgICBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKKwkJCSAgICBXSVBIWV9GTEFHX0lCU1NfUlNOOworCisJaWYgKHRyYW5zKHByaXYpLT51Y29kZV93b3dsYW4uY29kZS5sZW4gJiYKKwkgICAgZGV2aWNlX2Nhbl93YWtldXAoYnVzKHByaXYpLT5kZXYpKSB7CisJCWh3LT53aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX01BR0lDX1BLVCB8CisJCQkJCSAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAorCQkJCQkgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRIHwKKwkJCQkJICBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0U7CisJCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQorCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgfD0KKwkJCQlXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKKwkJCQlXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkU7CisKKwkJaHctPndpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5TOworCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21pbl9sZW4gPQorCQkJCQlJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTjsKKwkJaHctPndpcGh5LT53b3dsYW4ucGF0dGVybl9tYXhfbGVuID0KKwkJCQkJSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTl9MRU47CisJfQorCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX3NhdmUpCisJCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCWVsc2UKKwkJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCisJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7CisJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLworCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gY2FwYS0+bWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKKworCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLworCWh3LT5xdWV1ZXMgPSA0OworCisJaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJV0xfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOworCisJaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCisJCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQorCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOworCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQorCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KKwkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKKworCWl3bF9sZWRzX2luaXQocHJpdik7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXdsYWduX21hY191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpZiAoIXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCXJldHVybjsKKwlpd2xfbGVkc19leGl0KHByaXYpOworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKKwlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMDsKK30KKworc3RhdGljIGludCBfX2l3bF91cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7CisJCUlXTF9XQVJOKHByaXYsICJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgeworCQlyZXQgPSBpd2xhZ25fYWxsb2NfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOworCQlpZiAocmV0KSB7CisJCQlpd2xfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhwcml2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBpd2xfcnVuX2luaXRfdWNvZGUodHJhbnMocHJpdikpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJ1biBJTklUIHVjb2RlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBpd2xfbG9hZF91Y29kZV93YWl0X2FsaXZlKHRyYW5zKHByaXYpLCBJV0xfVUNPREVfUkVHVUxBUik7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gc3RhcnQgUlQgdWNvZGU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCXJldHVybiAwOworCisgZXJyb3I6CisJc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKKwlfX2l3bF9kb3duKHByaXYpOworCWNsZWFyX2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKKworCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwkvKiB3ZSBzaG91bGQgYmUgdmVyaWZ5aW5nIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgb3BlbmVkICovCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCXJldCA9IF9faXdsX3VwKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhcnQgVVAgd29yayBkb25lLlxuIik7CisKKwkvKiBOb3cgd2Ugc2hvdWxkIGJlIGRvbmUsIGFuZCB0aGUgUkVBRFkgYml0IHNob3VsZCBiZSBzZXQuICovCisJaWYgKFdBUk5fT04oIXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnNocmQtPnN0YXR1cykpKQorCQlyZXQgPSAtRUlPOworCisJaXdsYWduX2xlZF9lbmFibGUocHJpdik7CisKKwlwcml2LT5pc19vcGVuID0gMTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlpZiAoIXByaXYtPmlzX29wZW4pCisJCXJldHVybjsKKworCXByaXYtPmlzX29wZW4gPSAwOworCisJaXdsX2Rvd24ocHJpdik7CisKKwlmbHVzaF93b3JrcXVldWUocHJpdi0+c2hyZC0+d29ya3F1ZXVlKTsKKworCS8qIFVzZXIgc3BhY2Ugc29mdHdhcmUgbWF5IGV4cGVjdCBnZXR0aW5nIHJma2lsbCBjaGFuZ2VzCisJICogZXZlbiBpZiBpbnRlcmZhY2UgaXMgZG93biAqLworCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7CisJaXdsX2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfc2V0X3Jla2V5X2RhdGEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfZ3RrX3Jla2V5X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlpZiAoaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQorCQlyZXR1cm47CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10udmlmICE9IHZpZikKKwkJZ290byBvdXQ7CisKKwltZW1jcHkocHJpdi0+a2VrLCBkYXRhLT5rZWssIE5MODAyMTFfS0VLX0xFTik7CisJbWVtY3B5KHByaXYtPmtjaywgZGF0YS0+a2NrLCBOTDgwMjExX0tDS19MRU4pOworCXByaXYtPnJlcGxheV9jdHIgPQorCQljcHVfdG9fbGU2NChiZTY0X3RvX2NwdXAoKF9fYmU2NCAqKSZkYXRhLT5yZXBsYXlfY3RyKSk7CisJcHJpdi0+aGF2ZV9yZWtleV9kYXRhID0gdHJ1ZTsKKworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTighd293bGFuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwkvKiBEb24ndCBhdHRlbXB0IFdvV0xBTiB3aGVuIG5vdCBhc3NvY2lhdGVkLCB0ZWFyIGRvd24gaW5zdGVhZC4gKi8KKwlpZiAoIWN0eC0+dmlmIHx8IGN0eC0+dmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkgICAgIWl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGl3bGFnbl9zdXNwZW5kKHByaXYsIGh3LCB3b3dsYW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoYnVzKHByaXYpLT5kZXYsIHRydWUpOworCisJLyogTm93IGxldCB0aGUgdWNvZGUgb3BlcmF0ZSBvbiBpdHMgb3duICovCisJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCisJCQkgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUpOworCisJZ290byBvdXQ7CisKKyBlcnJvcjoKKwlwcml2LT5zaHJkLT53b3dsYW4gPSBmYWxzZTsKKwlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOworCWllZWU4MDIxMV9yZXN0YXJ0X2h3KHByaXYtPmh3KTsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBiYXNlLCBzdGF0dXMgPSAweGZmZmZmZmZmOworCWludCByZXQgPSAtRUlPOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCisJCQkgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9EM19DRkdfQ09NUExFVEUpOworCisJYmFzZSA9IHByaXYtPnNocmQtPmRldmljZV9wb2ludGVycy5lcnJvcl9ldmVudF90YWJsZTsKKwlpZiAoaXdsYWduX2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJ1cyhwcml2KS0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gaXdsX2dyYWJfbmljX2FjY2Vzc19zaWxlbnQoYnVzKHByaXYpKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlpd2xfd3JpdGUzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkFERFIsIGJhc2UpOworCQkJc3RhdHVzID0gaXdsX3JlYWQzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKGJ1cyhwcml2KSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzKHByaXYpLT5yZWdfbG9jaywgZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUworCQlpZiAocmV0ID09IDApIHsKKwkJCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gdHJhbnMocHJpdik7CisJCQlpZiAoIXByaXYtPndvd2xhbl9zcmFtKQorCQkJCXByaXYtPndvd2xhbl9zcmFtID0KKwkJCQkJa3phbGxvYyh0cmFucy0+dWNvZGVfd293bGFuLmRhdGEubGVuLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJCWlmIChwcml2LT53b3dsYW5fc3JhbSkKKwkJCQlfaXdsX3JlYWRfdGFyZ19tZW1fd29yZHMoCisJCQkJCWJ1cyhwcml2KSwgMHg4MDAwMDAsIHByaXYtPndvd2xhbl9zcmFtLAorCQkJCQl0cmFucy0+dWNvZGVfd293bGFuLmRhdGEubGVuIC8gNCk7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIHdlJ2xsIGNsZWFyIGN0eC0+dmlmIGR1cmluZyBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KCkgKi8KKwl2aWYgPSBjdHgtPnZpZjsKKworCXByaXYtPnNocmQtPndvd2xhbiA9IGZhbHNlOworCisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKGJ1cyhwcml2KS0+ZGV2LCBmYWxzZSk7CisKKwlpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHByaXYpOworCisJbWVtc2V0KCh2b2lkICopJmN0eC0+YWN0aXZlLCAwLCBzaXplb2YoY3R4LT5hY3RpdmUpKTsKKwlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOworCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlpZWVlODAyMTFfcmVzdW1lX2Rpc2Nvbm5lY3QodmlmKTsKKworCXJldHVybiAxOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgaXdsYWduX21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCUlXTF9ERUJVR19UWChwcml2LCAiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCisJCSAgICAgaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCBJRUVFODAyMTFfU0tCX0NCKHNrYikpLT5iaXRyYXRlKTsKKworCWlmIChpd2xhZ25fdHhfc2tiKHByaXYsIHNrYikpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICAgICB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlpd2xfdXBkYXRlX3RraXBfa2V5KHByaXYsIHZpZiwga2V5Y29uZiwgc3RhLCBpdjMyLCBwaGFzZTFrZXkpOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwlpbnQgcmV0OworCWJvb2wgaXNfZGVmYXVsdF93ZXBfa2V5ID0gZmFsc2U7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX01NSUM7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogV2UgY291bGQgcHJvZ3JhbSB0aGVzZSBrZXlzIGludG8gdGhlIGhhcmR3YXJlIGFzIHdlbGwsIGJ1dCB3ZQorCSAqIGRvbid0IGV4cGVjdCBtdWNoIG11bHRpY2FzdCB0cmFmZmljIGluIElCU1MgYW5kIGhhdmluZyBrZXlzCisJICogZm9yIG1vcmUgc3RhdGlvbnMgaXMgcHJvYmFibHkgbW9yZSB1c2VmdWwuCisJICoKKwkgKiBNYXJrIGtleSBUWC1vbmx5IGFuZCByZXR1cm4gMC4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpIHsKKwkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB0aGV5IGtleSB3YXMgVFgtb25seSwgYWNjZXB0IGRlbGV0aW9uICovCisJaWYgKGNtZCA9PSBESVNBQkxFX0tFWSAmJiBrZXktPmh3X2tleV9pZHggPT0gV0VQX0lOVkFMSURfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOworCisJQlVJTERfQlVHX09OKFdFUF9JTlZBTElEX09GRlNFVCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQpOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKKwkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQorCSAqIGluIDFYIG1vZGUuCisJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgorCSAqLworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYgIXN0YSkgeworCQlpZiAoY21kID09IFNFVF9LRVkpCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOworCQllbHNlCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPQorCQkJCWtleS0+aHdfa2V5X2lkeCA9PSBJV0xBR05fSFdfS0VZX0RFRkFVTFQ7CisJfQorCisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkgeworCQkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5KTsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgdmlmX3ByaXYtPmN0eCwga2V5LCBzdGEpOworCQlpZiAocmV0KSB7CisJCQkvKgorCQkJICogY2FuJ3QgYWRkIGtleSBmb3IgUlgsIGJ1dCB3ZSBkb24ndCBuZWVkIGl0CisJCQkgKiBpbiB0aGUgZGV2aWNlIGZvciBUWCBzbyBzdGlsbCByZXR1cm4gMAorCQkJICovCisJCQlyZXQgPSAwOworCQkJa2V5LT5od19rZXlfaWR4ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQl9CisKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbmFibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKKwkJCXJldCA9IGl3bF9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0gaXdsX3JlbW92ZV9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKKworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24sCisJCQkJICAgdTggYnVmX3NpemUpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldCA9IC1FSU5WQUw7CisJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKikgc3RhLT5kcnZfcHJpdjsKKworCUlXTF9ERUJVR19IVChwcml2LCAiQS1NUERVIGFjdGlvbiBvbiBhZGRyICVwTSB0aWQgJWRcbiIsCisJCSAgICAgc3RhLT5hZGRyLCB0aWQpOworCisJaWYgKCEoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgorCQlJV0xfREVCVUdfSFQocHJpdiwgInN0YXJ0IFJ4XG4iKTsKKwkJcmV0ID0gaXdsX3N0YV9yeF9hZ2dfc3RhcnQocHJpdiwgc3RhLCB0aWQsICpzc24pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOgorCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgUnhcbiIpOworCQlyZXQgPSBpd2xfc3RhX3J4X2FnZ19zdG9wKHByaXYsIHN0YSwgdGlkKTsKKwkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgVHhcbiIpOworCQlyZXQgPSBpd2xhZ25fdHhfYWdnX3N0YXJ0KHByaXYsIHZpZiwgc3RhLCB0aWQsIHNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBUeFxuIik7CisJCXJldCA9IGl3bGFnbl90eF9hZ2dfc3RvcChwcml2LCB2aWYsIHN0YSwgdGlkKTsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKHByaXYtPmFnZ190aWRzX2NvdW50ID4gMCkpIHsKKwkJCXByaXYtPmFnZ190aWRzX2NvdW50LS07CisJCQlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCisJCQkJICAgICBwcml2LT5hZ2dfdGlkc19jb3VudCk7CisJCX0KKwkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJaWYgKCFwcml2LT5hZ2dfdGlkc19jb3VudCAmJiBjZmcocHJpdiktPmh0X3BhcmFtcyAmJgorCQkgICAgY2ZnKHByaXYpLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSB7CisJCQkvKgorCQkJICogc3dpdGNoIG9mZiBSVFMvQ1RTIGlmIGl0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQKKwkJCSAqLworCQkJc3RhX3ByaXYtPmxxX3N0YS5scS5nZW5lcmFsX3BhcmFtcy5mbGFncyAmPQorCQkJCX5MSU5LX1FVQUxfRkxBR1NfU0VUX1NUQV9UTENfUlRTX01TSzsKKwkJCWl3bF9zZW5kX2xxX2NtZChwcml2LCBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKSwKKwkJCQkJJnN0YV9wcml2LT5scV9zdGEubHEsIENNRF9BU1lOQywgZmFsc2UpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgorCQlyZXQgPSBpd2xhZ25fdHhfYWdnX29wZXIocHJpdiwgdmlmLCBzdGEsIHRpZCwgYnVmX3NpemUpOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCWludCByZXQgPSAwOworCXU4IHN0YV9pZDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCXN0YV9wcml2LT5zdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOworCisJYXRvbWljX3NldCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzLCAwKTsKKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQlzdGFfcHJpdi0+Y2xpZW50ID0gdHJ1ZTsKKworCXJldCA9IGl3bF9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLAorCQkJCSAgICAgaXNfYXAsIHN0YSwgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNICglZClcbiIsCisJCQlzdGEtPmFkZHIsIHJldCk7CisJCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLworCQlnb3RvIG91dDsKKwl9CisKKwlzdGFfcHJpdi0+c3RhX2lkID0gc3RhX2lkOworCisJLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KKwlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCisJCSAgICAgICBzdGEtPmFkZHIpOworCWl3bF9yc19yYXRlX2luaXQocHJpdiwgc3RhLCBzdGFfaWQpOworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjaF9zd2l0Y2gtPmNoYW5uZWw7CisJc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYgPSAmcHJpdi0+Y3VycmVudF9odF9jb25maWc7CisJLyoKKwkgKiBNVUxUSS1GSVhNRQorCSAqIFdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGludGVyZmFjZXMsIHdlIG5lZWQgdG8KKwkgKiByZXZpc2l0IHRoaXMuIFRoZSBjaGFubmVsIHN3aXRjaCBjb21tYW5kIGluIHRoZSBkZXZpY2UKKwkgKiBvbmx5IGFmZmVjdHMgdGhlIEJTUyBjb250ZXh0LCBidXQgd2hhdCBkb2VzIHRoYXQgcmVhbGx5CisJICogbWVhbj8gQW5kIHdoYXQgaWYgd2UgZ2V0IGEgQ1NBIG9uIHRoZSBzZWNvbmQgaW50ZXJmYWNlPworCSAqIFRoaXMgbmVlZHMgYSBsb3Qgb2Ygd29yay4KKwkgKi8KKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXUxNiBjaDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKGl3bF9pc19yZmtpbGwocHJpdi0+c2hyZCkpCisJCWdvdG8gb3V0OworCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCisJCWdvdG8gb3V0OworCisJaWYgKCFjZmcocHJpdiktPmxpYi0+c2V0X2NoYW5uZWxfc3dpdGNoKQorCQlnb3RvIG91dDsKKworCWNoID0gY2hhbm5lbC0+aHdfdmFsdWU7CisJaWYgKGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpID09IGNoKQorCQlnb3RvIG91dDsKKworCWNoX2luZm8gPSBpd2xfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7CisJaWYgKCFpc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiaW52YWxpZCBjaGFubmVsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7CisKKwlwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID0gY29uZi0+c21wc19tb2RlOworCisJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KKwljdHgtPmh0LmVuYWJsZWQgPSBjb25mX2lzX2h0KGNvbmYpOworCWlmIChjdHgtPmh0LmVuYWJsZWQpCisJCWl3bGFnbl9jb25maWdfaHQ0MChjb25mLCBjdHgpOworCWVsc2UKKwkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCisJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgPSAwOworCisJaXdsX3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKKwlpd2xfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZik7CisJaXdsX3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+c2hyZC0+bG9jayk7CisKKwlpd2xfc2V0X3JhdGUocHJpdik7CisJLyoKKwkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQorCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCisJICovCisJc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7CisJcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7CisJaWYgKGNmZyhwcml2KS0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gocHJpdiwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU1RBVFVTX0NIQU5ORUxfU1dJVENIX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOworCQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKKwkJCQkgICAgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CisKKyNkZWZpbmUgQ0hLKHRlc3QsIGZsYWcpCWRvIHsgXAorCWlmICgqdG90YWxfZmxhZ3MgJiAodGVzdCkpCQlcCisJCWZpbHRlcl9vciB8PSAoZmxhZyk7CQlcCisJZWxzZQkJCQkJXAorCQlmaWx0ZXJfbmFuZCB8PSAoZmxhZyk7CQlcCisJfSB3aGlsZSAoMCkKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiRW50ZXI6IGNoYW5nZWQ6IDB4JXgsIHRvdGFsOiAweCV4XG4iLAorCQkJY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzKTsKKworCUNISyhGSUZfT1RIRVJfQlNTIHwgRklGX1BST01JU0NfSU5fQlNTLCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7CisJLyogU2V0dGluZyBfanVzdF8gUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIGNhdXNlcyBGSCBlcnJvcnMgKi8KKwlDSEsoRklGX0NPTlRST0wsIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyB8IFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKKwlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworI3VuZGVmIENISworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7CisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOworCisJCS8qCisJCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAorCQkgKiBidXQgd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgorCQkgKi8KKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCS8qCisJICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQorCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoKQorCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwcm9ncmFtbWluZyBtdWx0aWNhc3QKKwkgKiBmaWx0ZXJzIGludG8gdGhlIGRldmljZS4KKwkgKi8KKwkqdG90YWxfZmxhZ3MgJj0gRklGX09USEVSX0JTUyB8IEZJRl9BTExNVUxUSSB8IEZJRl9QUk9NSVNDX0lOX0JTUyB8CisJCQlGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX1RYKHByaXYsICJBYm9ydGluZyBmbHVzaCBkdWUgdG8gZGV2aWNlIHNodXRkb3duXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkgeworCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBSRiBLaWxsXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogbWFjODAyMTEgd2lsbCBub3QgcHVzaCBhbnkgbW9yZSBmcmFtZXMgZm9yIHRyYW5zbWl0CisJICogdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlZAorCSAqLworCWlmIChkcm9wKSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAic2VuZCBmbHVzaCBjb21tYW5kXG4iKTsKKwkJaWYgKGl3bGFnbl90eGZpZm9fZmx1c2gocHJpdiwgSVdMX0RST1BfQUxMKSkgeworCQkJSVdMX0VSUihwcml2LCAiZmx1c2ggcmVxdWVzdCBmYWlsXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIndhaXQgdHJhbnNtaXQvZmx1c2ggYWxsIGZyYW1lc1xuIik7CisJaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkodHJhbnMocHJpdikpOworZG9uZToKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCisJCQkJICAgICBpbnQgZHVyYXRpb24pCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfUEFOXTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKHByaXYtPnNocmQtPnZhbGlkX2NvbnRleHRzICYgQklUKElXTF9SWE9OX0NUWF9QQU4pKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoY3R4LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpdi0+aHdfcm9jX2NoYW5uZWwgPSBjaGFubmVsOworCXByaXYtPmh3X3JvY19jaGFudHlwZSA9IGNoYW5uZWxfdHlwZTsKKwkvKiBjb252ZXJ0IGZyb20gbXMgdG8gVFUgKi8KKwlwcml2LT5od19yb2NfZHVyYXRpb24gPSBESVZfUk9VTkRfVVAoMTAwMCAqIGR1cmF0aW9uLCAxMDI0KTsKKwlwcml2LT5od19yb2Nfc3RhcnRfbm90aWZpZWQgPSBmYWxzZTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5od19yb2NfZGlzYWJsZV93b3JrKTsKKworCWlmICghY3R4LT5pc19hY3RpdmUpIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfcW9zX2luZm8gZGVmYXVsdF9xb3NfZGF0YSA9IHsKKwkJCS5kZWZfcW9zX3Bhcm0gPSB7CisJCQkJLmFjWzBdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoMyksCisJCQkJCS5jd19tYXggPSBjcHVfdG9fbGUxNig3KSwKKwkJCQkJLmFpZnNuID0gMiwKKwkJCQkJLmVkY2FfdHhvcCA9IGNwdV90b19sZTE2KDE1MDQpLAorCQkJCX0sCisJCQkJLmFjWzFdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoNyksCisJCQkJCS5jd19tYXggPSBjcHVfdG9fbGUxNigxNSksCisJCQkJCS5haWZzbiA9IDIsCisJCQkJCS5lZGNhX3R4b3AgPSBjcHVfdG9fbGUxNigzMDA4KSwKKwkJCQl9LAorCQkJCS5hY1syXSA9IHsKKwkJCQkJLmN3X21pbiA9IGNwdV90b19sZTE2KDE1KSwKKwkJCQkJLmN3X21heCA9IGNwdV90b19sZTE2KDEwMjMpLAorCQkJCQkuYWlmc24gPSAzLAorCQkJCX0sCisJCQkJLmFjWzNdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoMTUpLAorCQkJCQkuY3dfbWF4ID0gY3B1X3RvX2xlMTYoMTAyMyksCisJCQkJCS5haWZzbiA9IDcsCisJCQkJfSwKKwkJCX0sCisJCX07CisKKwkJY3R4LT5pc19hY3RpdmUgPSB0cnVlOworCQljdHgtPnFvc19kYXRhID0gZGVmYXVsdF9xb3NfZGF0YTsKKwkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9QMlA7CisJCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLAorCQkgICAgICAgcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhZ2luZy5ub2RlX2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKKwkJICAgICAgIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YWdpbmcubm9kZV9hZGRyLAorCQkgICAgICAgRVRIX0FMRU4pOworCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSyB8CisJCQkJCSAgICAgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgfAorCQkJCQkgICAgIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSzsKKworCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwkJaWYgKGVycikgeworCQkJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpdi0+aHdfcm9jX3NldHVwID0gdHJ1ZTsKKwl9CisKKwllcnIgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBjdHgtPnZpZiwgSVdMX1NDQU5fUk9DLCBjaGFubmVsLT5iYW5kKTsKKwlpZiAoZXJyKQorCQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgcHJpdi0+aHdfcm9jX2R1cmF0aW9uKTsKKwlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgY29uc3QgdTggKmJzc2lkLAorCQkJICAgICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7CisJaW50IHJldDsKKwl1OCBzdGFfaWQ7CisKKwlpZiAoY3R4LT5jdHhpZCAhPSBJV0xfUlhPTl9DVFhfUEFOKQorCQlyZXR1cm4gMDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY3R4LT5wcmVhdXRoX2Jzc2lkIHx8IHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLAorCSAgICAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGl3bF9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgY3R4LCBic3NpZCwgdHJ1ZSwgTlVMTCwgJnN0YV9pZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoV0FSTl9PTihzdGFfaWQgIT0gY3R4LT5hcF9zdGFfaWQpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X3JlbW92ZV9zdGE7CisJfQorCisJbWVtY3B5KGN0eC0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisJY3R4LT5wcmVhdXRoX2Jzc2lkID0gdHJ1ZTsKKworCXJldCA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOworCisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworIG91dF9yZW1vdmVfc3RhOgorCWl3bF9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGFfaWQsIGJzc2lkKTsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX2ZpbmlzaF90eF9zeW5jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgY29uc3QgdTggKmJzc2lkLAorCQkJCSAgIGVudW0gaWVlZTgwMjExX3R4X3N5bmNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OworCisJaWYgKGN0eC0+Y3R4aWQgIT0gSVdMX1JYT05fQ1RYX1BBTikKKwkJcmV0dXJuOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKGl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQorCQlnb3RvIG91dDsKKworCWl3bF9yZW1vdmVfc3RhdGlvbihwcml2LCBjdHgtPmFwX3N0YV9pZCwgYnNzaWQpOworCWN0eC0+cHJlYXV0aF9ic3NpZCA9IGZhbHNlOworCS8qIG5vIG5lZWQgdG8gY29tbWl0ICovCisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkJCWNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7CisJCWlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfTE9XKQorCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IHRydWU7CisJCWVsc2UgaWYgKHJzc2lfZXZlbnQgPT0gUlNTSV9FVkVOVF9ISUdIKQorCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IGZhbHNlOworCisJCWl3bGFnbl9zZW5kX2FkdmFuY2VfYnRfY29uZmlnKHByaXYpOworCX0gZWxzZSB7CisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQWR2YW5jZWQgQlQgY29leCBkaXNhYmxlZCwiCisJCQkJImlnbm9yaW5nIFJTU0kgY2FsbGJhY2tcbiIpOworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJcXVldWVfd29yayhwcml2LT5zaHJkLT53b3JrcXVldWUsICZwcml2LT5iZWFjb25fdXBkYXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBxdWV1ZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcTsKKworCWlmIChXQVJOX09OKCFjdHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdi0+c2hyZCkpIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChxdWV1ZSA+PSBBQ19OVU0pIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIHF1ZXVlID49IEFDX05VTSAlZFxuIiwgcXVldWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlxID0gQUNfTlVNIC0gMSAtIHF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKKworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21pbiA9CisJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWluKTsKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5jd19tYXggPQorCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21heCk7CisJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uYWlmc24gPSBwYXJhbXMtPmFpZnM7CisJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uZWRjYV90eG9wID0KKwkJCWNwdV90b19sZTE2KChwYXJhbXMtPnR4b3AgKiAzMikpOworCisJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0ucmVzZXJ2ZWQxID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfdHhfbGFzdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlyZXR1cm4gcHJpdi0+aWJzc19tYW5hZ2VyID09IElXTF9JQlNTX01BTkFHRVI7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3NldF9tb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOworCisJaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CisKKwlyZXR1cm4gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3NldHVwX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gY3R4LT52aWY7CisJaW50IGVycjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKKworCS8qCisJICogVGhpcyB2YXJpYWJsZSB3aWxsIGJlIGNvcnJlY3Qgb25seSB3aGVuIHRoZXJlJ3MganVzdAorCSAqIGEgc2luZ2xlIGNvbnRleHQsIGJ1dCBhbGwgY29kZSB1c2luZyBpdCBpcyBmb3IgaGFyZHdhcmUKKwkgKiB0aGF0IHN1cHBvcnRzIG9ubHkgb25lIGNvbnRleHQuCisJICovCisJcHJpdi0+aXdfbW9kZSA9IHZpZi0+dHlwZTsKKworCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKKworCWVyciA9IGl3bF9zZXRfbW9kZShwcml2LCBjdHgpOworCWlmIChlcnIpIHsKKwkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCisJCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJiBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJLyoKKwkJICogcHJldGVuZCB0byBoYXZlIGhpZ2ggQlQgdHJhZmZpYyBhcyBsb25nIGFzIHdlCisJCSAqIGFyZSBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlLCBhcyB0aGlzIHdpbGwgY2F1c2UKKwkJICogdGhlIHJhdGUgc2NhbGluZyBldGMuIHRvIGJlaGF2ZSBhcyBpbnRlbmRlZC4KKwkJICovCisJCXByaXYtPmJ0X3RyYWZmaWNfbG9hZCA9IElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wLCAqY3R4ID0gTlVMTDsKKwlpbnQgZXJyOworCWVudW0gbmw4MDIxMV9pZnR5cGUgdmlmdHlwZSA9IGllZWU4MDIxMV92aWZfdHlwZV9wMnAodmlmKTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHR5cGUgJWQsIGFkZHIgJXBNXG4iLAorCQkJICAgdmlmdHlwZSwgdmlmLT5hZGRyKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aHdfcm9jX2Rpc2FibGVfd29yayk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisKKwlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgeworCQlJV0xfV0FSTihwcml2LCAiVHJ5IHRvIGFkZCBpbnRlcmZhY2Ugd2hlbiBkZXZpY2Ugbm90IHJlYWR5XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKKwkJdTMyIHBvc3NpYmxlX21vZGVzID0KKwkJCXRtcC0+aW50ZXJmYWNlX21vZGVzIHwgdG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCisJCWlmICh0bXAtPnZpZikgeworCQkJLyogY2hlY2sgaWYgdGhpcyBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCisJCQlpZiAodG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYKKwkJCQkJCUJJVCh0bXAtPnZpZi0+dHlwZSkpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShwb3NzaWJsZV9tb2RlcyAmIEJJVCh2aWZ0eXBlKSkpCisJCQljb250aW51ZTsKKworCQkvKiBoYXZlIG1heWJlIHVzYWJsZSBjb250ZXh0IHcvbyBpbnRlcmZhY2UgKi8KKwkJY3R4ID0gdG1wOworCQlicmVhazsKKwl9CisKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJdmlmX3ByaXYtPmN0eCA9IGN0eDsKKwljdHgtPnZpZiA9IHZpZjsKKworCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKKwlpZiAoIWVycikKKwkJZ290byBvdXQ7CisKKwljdHgtPnZpZiA9IE5VTEw7CisJcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Cisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaXdsX3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICBib29sIG1vZGVfY2hhbmdlKQoreworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChwcml2LT5zY2FuX3ZpZiA9PSB2aWYpIHsKKwkJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKKwkJaXdsX2ZvcmNlX3NjYW5fZW5kKHByaXYpOworCX0KKworCWlmICghbW9kZV9jaGFuZ2UpIHsKKwkJaXdsX3NldF9tb2RlKHByaXYsIGN0eCk7CisJCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQorCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFdoZW4gcmVtb3ZpbmcgdGhlIElCU1MgaW50ZXJmYWNlLCBvdmVyd3JpdGUgdGhlCisJICogQlQgdHJhZmZpYyBsb2FkIHdpdGggdGhlIHN0b3JlZCBvbmUgZnJvbSB0aGUgbGFzdAorCSAqIG5vdGlmaWNhdGlvbiwgaWYgYW55LiBJZiB0aGlzIGlzIGEgZGV2aWNlIHRoYXQKKwkgKiBkb2Vzbid0IGltcGxlbWVudCB0aGlzLCB0aGlzIGhhcyBubyBlZmZlY3Qgc2luY2UKKwkgKiBib3RoIHZhbHVlcyBhcmUgdGhlIHNhbWUgYW5kIHplcm8uCisJICovCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0gcHJpdi0+bGFzdF9idF90cmFmZmljX2xvYWQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoV0FSTl9PTihjdHgtPnZpZiAhPSB2aWYpKSB7CisJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7CisJCUlXTF9FUlIocHJpdiwgImN0eC0+dmlmID0gJXAsIHZpZiA9ICVwXG4iLCBjdHgtPnZpZiwgdmlmKTsKKwkJZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApCisJCQlJV0xfRVJSKHByaXYsICJcdElEID0gJWQ6XHRjdHggPSAlcFx0Y3R4LT52aWYgPSAlcFxuIiwKKwkJCQl0bXAtPmN0eGlkLCB0bXAsIHRtcC0+dmlmKTsKKwl9CisJY3R4LT52aWYgPSBOVUxMOworCisJaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIGZhbHNlKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqYnNzX2N0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOworCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dmlmdHlwZSA9IG5ld3R5cGU7CisJdTMyIGludGVyZmFjZV9tb2RlczsKKwlpbnQgZXJyOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwluZXd0eXBlID0gaWVlZTgwMjExX2lmdHlwZV9wMnAobmV3dHlwZSwgbmV3cDJwKTsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmICghY3R4LT52aWYgfHwgIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgeworCQkvKgorCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgorCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKKwkJICovCisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaW50ZXJmYWNlX21vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisKKwlpZiAoIShpbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBSZWZ1c2UgYSBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZG9uZSBieSBtb3ZpbmcgZnJvbSB0aGUgUEFOCisJICogY29udGV4dCB0byB0aGUgQlNTIGNvbnRleHQgaW5zdGVhZCwgaWYgdGhlIEJTUyBjb250ZXh0IGlzCisJICogYXZhaWxhYmxlIGFuZCBjYW4gc3VwcG9ydCB0aGUgbmV3IGludGVyZmFjZSB0eXBlLgorCSAqLworCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9QQU4gJiYgIWJzc19jdHgtPnZpZiAmJgorCSAgICAoYnNzX2N0eC0+aW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpIHx8CisJICAgICBic3NfY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSkgeworCQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSB7CisJCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKSB7CisJCQlpZiAoY3R4ID09IHRtcCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCF0bXAtPnZpZikKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIFRoZSBjdXJyZW50IG1vZGUgc3dpdGNoIHdvdWxkIGJlIGV4Y2x1c2l2ZSwgYnV0CisJCQkgKiBhbm90aGVyIGNvbnRleHQgaXMgYWN0aXZlIC4uLiByZWZ1c2UgdGhlIHN3aXRjaC4KKwkJCSAqLworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBzdWNjZXNzICovCisJaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOworCXZpZi0+dHlwZSA9IG5ld3ZpZnR5cGU7CisJdmlmLT5wMnAgPSBuZXdwMnA7CisJZXJyID0gaXdsX3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOworCVdBUk5fT04oZXJyKTsKKwkvKgorCSAqIFdlJ3ZlIHN3aXRjaGVkIGludGVybmFsbHksIGJ1dCBzdWJtaXR0aW5nIHRvIHRoZQorCSAqIGRldmljZSBtYXkgaGF2ZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBNYXNrIHRoaXMKKwkgKiBlcnJvciwgYmVjYXVzZSBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBub3Qgc3dpdGNoCisJICogKGFuZCBzZXQgdGhlIGludGVyZmFjZSB0eXBlIGJhY2spIGFuZCB3ZSdsbCBiZQorCSAqIG91dCBvZiBzeW5jIHdpdGggaXQuCisJICovCisJZXJyID0gMDsKKworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlpZiAocmVxLT5uX2NoYW5uZWxzID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJLyoKKwkgKiBJZiBhbiBpbnRlcm5hbCBzY2FuIGlzIGluIHByb2dyZXNzLCBqdXN0IHNldAorCSAqIHVwIHRoZSBzY2FuX3JlcXVlc3QgYXMgcGVyIGFib3ZlLgorCSAqLworCWlmIChwcml2LT5zY2FuX3R5cGUgIT0gSVdMX1NDQU5fTk9STUFMKSB7CisJCUlXTF9ERUJVR19TQ0FOKHByaXYsCisJCQkgICAgICAgIlNDQU4gcmVxdWVzdCBkdXJpbmcgaW50ZXJuYWwgc2NhbiAtIGRlZmVyXG4iKTsKKwkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxOworCQlwcml2LT5zY2FuX3ZpZiA9IHZpZjsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7CisJCXByaXYtPnNjYW5fdmlmID0gdmlmOworCQkvKgorCQkgKiBtYWM4MDIxMSB3aWxsIG9ubHkgYXNrIGZvciBvbmUgYmFuZCBhdCBhIHRpbWUKKwkJICogc28gdXNpbmcgY2hhbm5lbHNbMF0gaGVyZSBpcyBvaworCQkgKi8KKwkJcmV0ID0gaXdsX3NjYW5faW5pdGlhdGUocHJpdiwgdmlmLCBJV0xfU0NBTl9OT1JNQUwsCisJCQkJCXJlcS0+Y2hhbm5lbHNbMF0tPmJhbmQpOworCQlpZiAocmV0KSB7CisJCQlwcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOworCQkJcHJpdi0+c2Nhbl92aWYgPSBOVUxMOworCQl9CisJfQorCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zdGFfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWludCByZXQ7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyOiByZWNlaXZlZCByZXF1ZXN0IHRvIHJlbW92ZSAiCisJCQkgICAic3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19JTkZPKHByaXYsICJwcm9jZWVkaW5nIHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwKKwkJCXN0YS0+YWRkcik7CisJcmV0ID0gaXdsX3JlbW92ZV9zdGF0aW9uKHByaXYsIHN0YV9wcml2LT5zdGFfaWQsIHN0YS0+YWRkcik7CisJaWYgKHJldCkKKwkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTChwcml2LCAiRXJyb3IgcmVtb3Zpbmcgc3RhdGlvbiAlcE1cbiIsCisJCQlzdGEtPmFkZHIpOworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXdsX3N0YV9tb2RpZnlfcHNfd2FrZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgJj0gflNUQV9GTEdfUFdSX1NBVkVfTVNLOworCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gMDsKKwlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IDA7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisJaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlpbnQgc3RhX2lkOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU1RBX05PVElGWV9TTEVFUDoKKwkJV0FSTl9PTighc3RhX3ByaXYtPmNsaWVudCk7CisJCXN0YV9wcml2LT5hc2xlZXAgPSB0cnVlOworCQlpZiAoYXRvbWljX3JlYWQoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcykgPiAwKQorCQkJaWVlZTgwMjExX3N0YV9ibG9ja19hd2FrZShodywgc3RhLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFfTk9USUZZX0FXQUtFOgorCQlXQVJOX09OKCFzdGFfcHJpdi0+Y2xpZW50KTsKKwkJaWYgKCFzdGFfcHJpdi0+YXNsZWVwKQorCQkJYnJlYWs7CisJCXN0YV9wcml2LT5hc2xlZXAgPSBmYWxzZTsKKwkJc3RhX2lkID0gaXdsX3N0YV9pZChzdGEpOworCQlpZiAoc3RhX2lkICE9IElXTF9JTlZBTElEX1NUQVRJT04pCisJCQlpd2xfc3RhX21vZGlmeV9wc193YWtlKHByaXYsIHN0YV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsYWduX2h3X29wcyA9IHsKKwkudHggPSBpd2xhZ25fbWFjX3R4LAorCS5zdGFydCA9IGl3bGFnbl9tYWNfc3RhcnQsCisJLnN0b3AgPSBpd2xhZ25fbWFjX3N0b3AsCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJLnN1c3BlbmQgPSBpd2xhZ25fbWFjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGl3bGFnbl9tYWNfcmVzdW1lLAorI2VuZGlmCisJLmFkZF9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2UsCisJLmNoYW5nZV9pbnRlcmZhY2UgPSBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2UsCisJLmNvbmZpZyA9IGl3bGFnbl9tYWNfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyID0gaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF9rZXkgPSBpd2xhZ25fbWFjX3NldF9rZXksCisJLnVwZGF0ZV90a2lwX2tleSA9IGl3bGFnbl9tYWNfdXBkYXRlX3RraXBfa2V5LAorCS5zZXRfcmVrZXlfZGF0YSA9IGl3bGFnbl9tYWNfc2V0X3Jla2V5X2RhdGEsCisJLmNvbmZfdHggPSBpd2xhZ25fbWFjX2NvbmZfdHgsCisJLmJzc19pbmZvX2NoYW5nZWQgPSBpd2xhZ25fYnNzX2luZm9fY2hhbmdlZCwKKwkuYW1wZHVfYWN0aW9uID0gaXdsYWduX21hY19hbXBkdV9hY3Rpb24sCisJLmh3X3NjYW4gPSBpd2xhZ25fbWFjX2h3X3NjYW4sCisJLnN0YV9ub3RpZnkgPSBpd2xhZ25fbWFjX3N0YV9ub3RpZnksCisJLnN0YV9hZGQgPSBpd2xhZ25fbWFjX3N0YV9hZGQsCisJLnN0YV9yZW1vdmUgPSBpd2xhZ25fbWFjX3N0YV9yZW1vdmUsCisJLmNoYW5uZWxfc3dpdGNoID0gaXdsYWduX21hY19jaGFubmVsX3N3aXRjaCwKKwkuZmx1c2ggPSBpd2xhZ25fbWFjX2ZsdXNoLAorCS50eF9sYXN0X2JlYWNvbiA9IGl3bGFnbl9tYWNfdHhfbGFzdF9iZWFjb24sCisJLnJlbWFpbl9vbl9jaGFubmVsID0gaXdsYWduX21hY19yZW1haW5fb25fY2hhbm5lbCwKKwkuY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsID0gaXdsYWduX21hY19jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCisJLnJzc2lfY2FsbGJhY2sgPSBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2ssCisJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGl3bGFnbl9tYWNfdGVzdG1vZGVfY21kKQorCUNGRzgwMjExX1RFU1RNT0RFX0RVTVAoaXdsYWduX21hY190ZXN0bW9kZV9kdW1wKQorCS50eF9zeW5jID0gaXdsYWduX21hY190eF9zeW5jLAorCS5maW5pc2hfdHhfc3luYyA9IGl3bGFnbl9tYWNfZmluaXNoX3R4X3N5bmMsCisJLnNldF90aW0gPSBpd2xhZ25fbWFjX3NldF90aW0sCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGJvdGggYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBodyBhbmQgcHJpdi4gKi8KK3N0cnVjdCBpZWVlODAyMTFfaHcgKml3bF9hbGxvY19hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7CisJLyogbWFjODAyMTEgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhpcyBkZXZpY2UgaW5zdGFuY2UsIGluY2x1ZGluZworCSAqICAgc3BhY2UgZm9yIHRoaXMgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKworCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgaXdsX3ByaXYpLCAmaXdsYWduX2h3X29wcyk7CisJaWYgKCFodykKKwkJZ290byBvdXQ7CisKKwlwcml2ID0gaHctPnByaXY7CisJcHJpdi0+aHcgPSBodzsKKworb3V0OgorCXJldHVybiBodzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKaW5kZXggMTljYzZhOC4uODUwZWM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKQEAgLTYwLDYgKzYwLDcgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAKQEAgLTI1NSw2ICsyNTYsOCBAQAogCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4QzAyMCwgaXdsNjAwNV8yYWduX3NmZl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDg1LCAweEMyMjAsIGl3bDYwMDVfMmFnbl9zZmZfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzQxLCBpd2w2MDA1XzJhZ25fZF9jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEzMDQsIGl3bDYwMDVfMmFnbl9jZmcpfSwvKiBsb3cgNUdIeiBhY3RpdmUgKi8KKwl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweDEzMDUsIGl3bDYwMDVfMmFnbl9jZmcpfSwvKiBoaWdoIDVHSHogYWN0aXZlICovCiAKIC8qIDZ4MzAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4QSwgMHg1MzA1LCBpd2wxMDMwX2Jnbl9jZmcpfSwKQEAgLTMyNCw0NiArMzI3LDI4IEBACiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0MDIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MSwgMHg0MjIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0NDIyLCBpd2wyMDAwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0MDI2LCBpd2wyMDAwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODkxLCAweDQyMjYsIGl3bDIwMDBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDQyNiwgaXdsMjAwMF8yYmdfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MCwgMHg0ODIyLCBpd2wyMDAwXzJiZ25fZF9jZmcpfSwKIAogLyogMngzMCBTZXJpZXMgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODg3LCAweDQwNjIsIGl3bDIwMzBfMmJnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODg4LCAweDQyNjIsIGl3bDIwMzBfMmJnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODg3LCAweDQ0NjIsIGl3bDIwMzBfMmJnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg3LCAweDQwNjYsIGl3bDIwMzBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODgsIDB4NDI2NiwgaXdsMjAzMF8yYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0NDY2LCBpd2wyMDMwXzJiZ19jZmcpfSwKIAogLyogNngzNSBTZXJpZXMgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQwNjAsIGl3bDYwMzVfMmFnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODhGLCAweDQyNjAsIGl3bDYwMzVfMmFnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQ0NjAsIGl3bDYwMzVfMmFnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQwNjQsIGl3bDYwMzVfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhGLCAweDQyNjQsIGl3bDYwMzVfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQ0NjQsIGl3bDYwMzVfMmFiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhFLCAweDQwNjYsIGl3bDYwMzVfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OEYsIDB4NDI2NiwgaXdsNjAzNV8yYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDY2LCBpd2w2MDM1XzJiZ19jZmcpfSwKIAogLyogMTA1IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDAyMiwgaXdsMTA1X2Jnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODk1LCAweDAyMjIsIGl3bDEwNV9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NCwgMHgwNDIyLCBpd2wxMDVfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDAyNiwgaXdsMTA1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTUsIDB4MDIyNiwgaXdsMTA1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDQyNiwgaXdsMTA1X2JnX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDgyMiwgaXdsMTA1X2Jnbl9kX2NmZyl9LAogCiAvKiAxMzUgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwMDYyLCBpd2wxMzVfYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTMsIDB4MDI2MiwgaXdsMTM1X2Jnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODkyLCAweDA0NjIsIGl3bDEzNV9iZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwMDY2LCBpd2wxMzVfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MywgMHgwMjY2LCBpd2wxMzVfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwNDY2LCBpd2wxMzVfYmdfY2ZnKX0sCiAKIAl7MH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYwppbmRleCA0ZWFhYjIwLi4yYjE4OGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXU4IHNraXA7CiAJdTMyIHNscF9pdHJ2bDsKIAotCWlmIChwcml2LT5jZmctPmFkdl9wbSkgeworCWlmIChjZmcocHJpdiktPmFkdl9wbSkgewogCQl0YWJsZSA9IGFwbV9yYW5nZV8yOwogCQlpZiAocGVyaW9kIDw9IElXTF9EVElNX1JBTkdFXzFfTUFYKQogCQkJdGFibGUgPSBhcG1fcmFuZ2VfMTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCQljbWQtPmZsYWdzICY9IH5JV0xfUE9XRVJfU0hBRE9XX1JFR19FTkE7CiAKIAlpZiAoaXdsX2FkdmFuY2VkX2J0X2NvZXhpc3QocHJpdikpIHsKLQkJaWYgKCFwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCisJCWlmICghY2ZnKHByaXYpLT5idF9wYXJhbXMtPmJ0X3Njb19kaXNhYmxlKQogCQkJY21kLT5mbGFncyB8PSBJV0xfUE9XRVJfQlRfU0NPX0VOQTsKIAkJZWxzZQogCQkJY21kLT5mbGFncyAmPSB+SVdMX1BPV0VSX0JUX1NDT19FTkE7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJY21kLT5mbGFncyAmPSB+SVdMX1BPV0VSX1NIQURPV19SRUdfRU5BOwogCiAJaWYgKGl3bF9hZHZhbmNlZF9idF9jb2V4aXN0KHByaXYpKSB7Ci0JCWlmICghcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X3Njb19kaXNhYmxlKQorCQlpZiAoIWNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9zY29fZGlzYWJsZSkKIAkJCWNtZC0+ZmxhZ3MgfD0gSVdMX1BPV0VSX0JUX1NDT19FTkE7CiAJCWVsc2UKIAkJCWNtZC0+ZmxhZ3MgJj0gfklXTF9QT1dFUl9CVF9TQ09fRU5BOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAKIAlpZiAocHJpdi0+c2hyZC0+d293bGFuKQogCQlpd2xfc3RhdGljX3NsZWVwX2NtZChwcml2LCBjbWQsIElXTF9QT1dFUl9JTkRFWF81LCBkdGltcGVyKTsKLQllbHNlIGlmICghcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bm9faWRsZV9zdXBwb3J0ICYmCisJZWxzZSBpZiAoIWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm5vX2lkbGVfc3VwcG9ydCAmJgogCQkgcHJpdi0+aHctPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKQogCQlpd2xfc3RhdGljX3NsZWVwX2NtZChwcml2LCBjbWQsIElXTF9QT1dFUl9JTkRFWF81LCAyMCk7CiAJZWxzZSBpZiAoaXdsX3R0X2lzX2xvd19wb3dlcl9zdGF0ZShwcml2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCmluZGV4IGEyNmZiZDMuLjA4NGFhMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKQEAgLTQxNiw2ICs0MTYsOCBAQAogCiAJCWlmICghaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCiAJCQljb250aW51ZTsKKwkJaWYgKGN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9PSBSWE9OX0RFVl9UWVBFX1AyUCkKKwkJCWNvbnRpbnVlOwogCQl2YWx1ZSA9IGN0eC0+YmVhY29uX2ludDsKIAkJaWYgKCF2YWx1ZSkKIAkJCXZhbHVlID0gSVdMX1BBU1NJVkVfRFdFTExfQkFTRTsKQEAgLTY4OSw4ICs2OTEsOCBAQAogCQkgKiBJbnRlcm5hbCBzY2FucyBhcmUgcGFzc2l2ZSwgc28gd2UgY2FuIGluZGlzY3JpbWluYXRlbHkgc2V0CiAJCSAqIHRoZSBCVCBpZ25vcmUgZmxhZyBvbiAyLjQgR0h6IHNpbmNlIGl0IGFwcGxpZXMgdG8gVFggb25seS4KIAkJICovCi0JCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpCisJCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCQkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpCiAJCQlzY2FuLT50eF9jbWQudHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19JR05PUkVfQlQ7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKQEAgLTczMSwxMiArNzMzLDEyIEBACiAKIAliYW5kID0gcHJpdi0+c2Nhbl9iYW5kOwogCi0JaWYgKHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXSkKLQkJcnhfYW50ID0gcHJpdi0+Y2ZnLT5zY2FuX3J4X2FudGVubmFzW2JhbmRdOworCWlmIChjZmcocHJpdiktPnNjYW5fcnhfYW50ZW5uYXNbYmFuZF0pCisJCXJ4X2FudCA9IGNmZyhwcml2KS0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKIAogCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJLyogdHJhbnNtaXQgMi40IEdIeiBwcm9iZXMgb25seSBvbiBmaXJzdCBhbnRlbm5hICovCiAJCXNjYW5fdHhfYW50ZW5uYXMgPSBmaXJzdF9hbnRlbm5hKHNjYW5fdHhfYW50ZW5uYXMpOwogCX0KQEAgLTc2MCw4ICs3NjIsOCBAQAogCiAJCXJ4X2FudCA9IGZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7CiAJfQotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgogCSAgICBwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQpIHsKIAkJLyogb3BlcmF0ZWQgYXMgMXgxIGluIGZ1bGwgY29uY3VycmVuY3kgbW9kZSAqLwogCQlyeF9hbnQgPSBmaXJzdF9hbnRlbm5hKHJ4X2FudCk7CkBAIC05MzksNTEgKzk0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xhZ25fbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChyZXEtPm5fY2hhbm5lbHMgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQkvKgotCSAqIElmIGFuIGludGVybmFsIHNjYW4gaXMgaW4gcHJvZ3Jlc3MsIGp1c3Qgc2V0Ci0JICogdXAgdGhlIHNjYW5fcmVxdWVzdCBhcyBwZXIgYWJvdmUuCi0JICovCi0JaWYgKHByaXYtPnNjYW5fdHlwZSAhPSBJV0xfU0NBTl9OT1JNQUwpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCSAgICAgICAiU0NBTiByZXF1ZXN0IGR1cmluZyBpbnRlcm5hbCBzY2FuIC0gZGVmZXJcbiIpOwotCQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7Ci0JCXByaXYtPnNjYW5fdmlmID0gdmlmOwotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcTsKLQkJcHJpdi0+c2Nhbl92aWYgPSB2aWY7Ci0JCS8qCi0JCSAqIG1hYzgwMjExIHdpbGwgb25seSBhc2sgZm9yIG9uZSBiYW5kIGF0IGEgdGltZQotCQkgKiBzbyB1c2luZyBjaGFubmVsc1swXSBoZXJlIGlzIG9rCi0JCSAqLwotCQlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCB2aWYsIElXTF9TQ0FOX05PUk1BTCwKLQkJCQkJcmVxLT5jaGFubmVsc1swXS0+YmFuZCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JCQlwcml2LT5zY2FuX3ZpZiA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KIAogLyoKICAqIGludGVybmFsIHNob3J0IHNjYW4sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmVlbiBjYWxsZWQgd2hpbGUgYXNzb2NpYXRlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNoYXJlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKaW5kZXggMWY3YTkzYy4uOGNmODc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKQEAgLTk0LDkgKzk0LDkgQEAKICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXdsLXBjaS5jCiAgKi8KIAotc3RydWN0IGl3bF9jZmc7CiBzdHJ1Y3QgaXdsX2J1czsKIHN0cnVjdCBpd2xfcHJpdjsKK3N0cnVjdCBpd2xfdHJhbnM7CiBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlczsKIHN0cnVjdCBpd2xfdHJhbnNfb3BzOwogCkBAIC0xMjAsNyArMTIwLDcgQEAKICAqIEByZXN0YXJ0X2Z3OiByZXN0YXJ0IGZpcm13YXJlLCBkZWZhdWx0ID0gMQogICogQHBsY3BfY2hlY2s6IGVuYWJsZSBwbGNwIGhlYWx0aCBjaGVjaywgZGVmYXVsdCA9IHRydWUKICAqIEBhY2tfY2hlY2s6IGRpc2FibGUgYWNrIGhlYWx0aCBjaGVjaywgZGVmYXVsdCA9IGZhbHNlCi0gKiBAd2RfZGlzYWJsZTogZW5hYmxlIHN0dWNrIHF1ZXVlIGNoZWNrLCBkZWZhdWx0ID0gZmFsc2UKKyAqIEB3ZF9kaXNhYmxlOiBlbmFibGUgc3R1Y2sgcXVldWUgY2hlY2ssIGRlZmF1bHQgPSAwCiAgKiBAYnRfY29leF9hY3RpdmU6IGVuYWJsZSBidCBjb2V4LCBkZWZhdWx0ID0gdHJ1ZQogICogQGxlZF9tb2RlOiBzeXN0ZW0gZGVmYXVsdCwgZGVmYXVsdCA9IDAKICAqIEBub19zbGVlcF9hdXRvYWRqdXN0OiBkaXNhYmxlIGF1dG9hZGp1c3QsIGRlZmF1bHQgPSB0cnVlCkBAIC0xNDEsNyArMTQxLDcgQEAKIAlpbnQgcmVzdGFydF9mdzsKIAlib29sIHBsY3BfY2hlY2s7CiAJYm9vbCBhY2tfY2hlY2s7Ci0JYm9vbCB3ZF9kaXNhYmxlOworCWludCAgd2RfZGlzYWJsZTsKIAlib29sIGJ0X2NvZXhfYWN0aXZlOwogCWludCBsZWRfbW9kZTsKIAlib29sIG5vX3NsZWVwX2F1dG9hZGp1c3Q7CkBAIC0xNzQsNyArMTc0LDYgQEAKICAqIEBjdF9raWxsX2V4aXRfdGhyZXNob2xkOiB3aGVuIHRvIHJlZWFibGUgdGhlIGRldmljZSAtIGluIGh3IGRlcGVuZGVudCB1bml0CiAgKglyZWxldmFudCBmb3IgMTAwMCwgNjAwMCBhbmQgdXAKICAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAotICogQGNhbGliX2luaXRfY2ZnOiBzZXR1cCBpbml0aWFsIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3CiAgKiBAY2FsaWJfcnRfY2ZnOiBzZXR1cCBydW50aW1lIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3CiAgKiBAc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcwogICovCkBAIC0xOTUsNjcgKzE5NCwxNDkgQEAKIAl1MzIgY3Rfa2lsbF9leGl0X3RocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKIAotCXUzMiBjYWxpYl9pbml0X2NmZzsKIAl1MzIgY2FsaWJfcnRfY2ZnOwogCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwogfTsKIAogLyoqCi0gKiBlbnVtIGl3bF9hZ2dfc3RhdGUKKyAqIGVudW0gaXdsX3Vjb2RlX3R5cGUKICAqCi0gKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgLyB0ZWFyIGRvd24uCi0gKiBUaGVzZSBzdGF0ZXMgcmVsYXRlIHRvIGEgc3BlY2lmaWMgUkEgLyBUSUQuCisgKiBUaGUgdHlwZSBvZiB1Y29kZSBjdXJyZW50bHkgbG9hZGVkIG9uIHRoZSBoYXJkd2FyZS4KICAqCi0gKiBASVdMX0FHR19PRkY6IGFnZ3JlZ2F0aW9uIGlzIG5vdCB1c2VkCi0gKiBASVdMX0FHR19PTjogYWdncmVnYXRpb24gc2Vzc2lvbiBpcyB1cAotICogQElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTogZXN0YWJsaXNoaW5nIGEgQkEgc2Vzc2lvbiAtIHdhaXRpbmcgZm9yIHRoZQotICoJSFcgcXVldWUgdG8gYmUgZW1wdHkgZnJvbSBwYWNrZXRzIGZvciB0aGlzIFJBIC9USUQuCi0gKiBASVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOiB0ZWFyaW5nIGRvd24gYSBCQSBzZXNzaW9uIC0gd2FpdGluZyBmb3IgdGhlCi0gKglIVyBxdWV1ZSB0byBiZSBlbXB0eSBmcm9tIHBhY2tldHMgZm9yIHRoaXMgUkEgL1RJRC4KKyAqIEBJV0xfVUNPREVfTk9ORTogTm8gdWNvZGUgbG9hZGVkCisgKiBASVdMX1VDT0RFX1JFR1VMQVI6IE5vcm1hbCBydW50aW1lIHVjb2RlCisgKiBASVdMX1VDT0RFX0lOSVQ6IEluaXRpYWwgdWNvZGUKKyAqIEBJV0xfVUNPREVfV09XTEFOOiBXYWtlIG9uIFdpcmVsZXNzIGVuYWJsZWQgdWNvZGUKICAqLwotZW51bSBpd2xfYWdnX3N0YXRlIHsKLQlJV0xfQUdHX09GRiA9IDAsCi0JSVdMX0FHR19PTiwKLQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkEsCi0JSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBLAorZW51bSBpd2xfdWNvZGVfdHlwZSB7CisJSVdMX1VDT0RFX05PTkUsCisJSVdMX1VDT0RFX1JFR1VMQVIsCisJSVdMX1VDT0RFX0lOSVQsCisJSVdMX1VDT0RFX1dPV0xBTiwKIH07CiAKIC8qKgotICogc3RydWN0IGl3bF9odF9hZ2cgLSBhZ2dyZWdhdGlvbiBzdGF0ZSBtYWNoaW5lCi0KLSAqIFRoaXMgc3RydWN0cyBob2xkcyB0aGUgc3RhdGVzIGZvciB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgYW5kIHRlYXIKLSAqIGRvd24uIEl0IGFsc28gaG9sZHMgdGhlIHN0YXRlIGR1cmluZyB0aGUgQkEgc2Vzc2lvbiBpdHNlbGYuIFRoaXMgc3RydWN0IGlzCi0gKiBkdXBsaWNhdGVkIGZvciBlYWNoIFJBIC8gVElELgotCi0gKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQuIEhvbGRzIHRoZSBkYXRhIGJldHdlZW4gdGhlCi0gKglUeCByZXNwb25zZSAoUkVQTFlfVFgpLCBhbmQgdGhlIGJsb2NrIGFjayBub3RpZmljYXRpb24KLSAqCShSRVBMWV9DT01QUkVTU0VEX0JBKS4KLSAqIEBzdGF0ZTogc3RhdGUgb2YgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IC8gdGVhciBkb3duLgotICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBieSB0aGUgQkEgc2Vzc2lvbiAtIHVzZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllci4KLSAqCU5lZWRlZCBieSB0aGUgdXBwZXIgbGF5ZXIgZm9yIGRlYnVnZnMgb25seS4KLSAqIEB3YWl0X2Zvcl9iYTogRXhwZWN0IGJsb2NrLWFjayBiZWZvcmUgbmV4dCBUeCByZXBseQorICogc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAtIG5vdGlmaWNhdGlvbiB3YWl0IGVudHJ5CisgKiBAbGlzdDogbGlzdCBoZWFkIGZvciBnbG9iYWwgbGlzdAorICogQGZuOiBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgbm90aWZpY2F0aW9uCisgKiBAY21kOiBjb21tYW5kIElECisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbm90IHVzZWQgZGlyZWN0bHksIHRvIHdhaXQgZm9yIGEKKyAqIG5vdGlmaWNhdGlvbiBkZWNsYXJlIGl0IG9uIHRoZSBzdGFjaywgYW5kIGNhbGwKKyAqIGl3bGFnbl9pbml0X25vdGlmaWNhdGlvbl93YWl0KCkgd2l0aCBhcHByb3ByaWF0ZQorICogcGFyYW1ldGVycy4gVGhlbiBkbyB3aGF0ZXZlciB3aWxsIGNhdXNlIHRoZSB1Y29kZQorICogdG8gbm90aWZ5IHRoZSBkcml2ZXIsIGFuZCB0byB3YWl0IGZvciB0aGF0IHRoZW4KKyAqIGNhbGwgaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKCkuCisgKgorICogRWFjaCBub3RpZmljYXRpb24gaXMgb25lLXNob3QuIElmIGF0IHNvbWUgcG9pbnQgd2UKKyAqIG5lZWQgdG8gc3VwcG9ydCBtdWx0aS1zaG90IG5vdGlmaWNhdGlvbnMgKHdoaWNoCisgKiBjYW4ndCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrKSB3ZSBuZWVkIHRvIG1vZGlmeQorICogdGhlIGNvZGUgZm9yIHRoZW0uCiAgKi8KLXN0cnVjdCBpd2xfaHRfYWdnIHsKLQl1MzIgcmF0ZV9uX2ZsYWdzOwotCWVudW0gaXdsX2FnZ19zdGF0ZSBzdGF0ZTsKLQl1MTYgdHhxX2lkOwotCWJvb2wgd2FpdF9mb3JfYmE7CitzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwl2b2lkICgqZm4pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorCQkgICB2b2lkICpkYXRhKTsKKwl2b2lkICpmbl9kYXRhOworCisJdTggY21kOworCWJvb2wgdHJpZ2dlcmVkLCBhYm9ydGVkOwogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3RpZF9kYXRhIC0gb25lIGZvciBlYWNoIFJBIC8gVElECi0KLSAqIFRoaXMgc3RydWN0cyBob2xkcyB0aGUgc3RhdGVzIGZvciBlYWNoIFJBIC8gVElELgotCi0gKiBAc2VxX251bWJlcjogdGhlIG5leHQgV2lGaSBzZXF1ZW5jZSBudW1iZXIgdG8gdXNlCi0gKiBAdGZkc19pbl9xdWV1ZTogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byB0aGUgSFcgcXVldWVzLgotICoJRXhwb3J0ZWQgZm9yIGRlYnVnZnMgb25seQotICogQGFnZzogYWdncmVnYXRpb24gc3RhdGUgbWFjaGluZQorICogZW51bSBpd2xfcGFfdHlwZSAtIFBvd2VyIEFtcGxpZmllciB0eXBlCisgKiBASVdMX1BBX1NZU1RFTTogIGJhc2VkIG9uIHVDb2RlIGNvbmZpZ3VyYXRpb24KKyAqIEBJV0xfUEFfSU5URVJOQUw6IHVzZSBJbnRlcm5hbCBvbmx5CiAgKi8KLXN0cnVjdCBpd2xfdGlkX2RhdGEgewotCXUxNiBzZXFfbnVtYmVyOwotCXUxNiB0ZmRzX2luX3F1ZXVlOwotCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKK2VudW0gaXdsX3BhX3R5cGUgeworCUlXTF9QQV9TWVNURU0gPSAwLAorCUlXTF9QQV9JTlRFUk5BTCA9IDEsCit9OworCisvKgorICogTEVEIG1vZGUKKyAqICAgIElXTF9MRURfREVGQVVMVDogIHVzZSBkZXZpY2UgZGVmYXVsdAorICogICAgSVdMX0xFRF9SRl9TVEFURTogdHVybiBMRUQgb24vb2ZmIGJhc2VkIG9uIFJGIHN0YXRlCisgKgkJCUxFRCBPTiAgPSBSRiBPTgorICoJCQlMRUQgT0ZGID0gUkYgT0ZGCisgKiAgICBJV0xfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKKyAqLworZW51bSBpd2xfbGVkX21vZGUgeworCUlXTF9MRURfREVGQVVMVCwKKwlJV0xfTEVEX1JGX1NUQVRFLAorCUlXTF9MRURfQkxJTkssCit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfY2ZnCisgKiBAbmFtZTogT2ZmaWNhbCBuYW1lIG9mIHRoZSBkZXZpY2UKKyAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgorICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQorICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KKyAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAdWNvZGVfYXBpX29rOiBvbGRlc3QgdmVyc2lvbiBvZiB0aGUgdUNvZGUgQVBJIHRoYXQgaXMgT0sgdG8gbG9hZAorICoJd2l0aG91dCBhIHdhcm5pbmcsIGZvciB1c2UgaW4gdHJhbnNpdGlvbnMKKyAqIEB1Y29kZV9hcGlfbWluOiBMb3dlc3QgdmVyc2lvbiBvZiB1Q29kZSBBUEkgc3VwcG9ydGVkIGJ5IGRyaXZlci4KKyAqIEB2YWxpZF90eF9hbnQ6IHZhbGlkIHRyYW5zbWl0IGFudGVubmEKKyAqIEB2YWxpZF9yeF9hbnQ6IHZhbGlkIHJlY2VpdmUgYW50ZW5uYQorICogQHNrdTogc2t1IGluZm9ybWF0aW9uIGZyb20gRUVQUk9NCisgKiBAZWVwcm9tX3ZlcjogRUVQUk9NIHZlcnNpb24KKyAqIEBlZXByb21fY2FsaWJfdmVyOiBFRVBST00gY2FsaWJyYXRpb24gdmVyc2lvbgorICogQGxpYjogcG9pbnRlciB0byB0aGUgbGliIG9wcworICogQGFkZGl0aW9uYWxfbmljX2NvbmZpZzogYWRkaXRpb25hbCBuaWMgY29uZmlndXJhdGlvbgorICogQGJhc2VfcGFyYW1zOiBwb2ludGVyIHRvIGJhc2ljIHBhcmFtZXRlcnMKKyAqIEBodF9wYXJhbXM6IHBvaW50IHRvIGh0IHBhdGFtZXRlcnMKKyAqIEBidF9wYXJhbXM6IHBvaW50ZXIgdG8gYnQgcGFyYW1ldGVycworICogQHBhX3R5cGU6IHVzZWQgYnkgNjAwMCBzZXJpZXMgb25seSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBQb3dlciBBbXBsaWZpZXIKKyAqIEBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCisgKiBAbm9feHRhbF9jYWxpYjogc29tZSBkZXZpY2VzIGRvIG5vdCBuZWVkIGNyeXN0YWwgY2FsaWJyYXRpb24gZGF0YSwKKyAqCWRvbid0IHNlbmQgaXQgdG8gdGhvc2UKKyAqIEBzY2FuX3J4X2FudGVubmFzOiBhdmFpbGFibGUgYW50ZW5uYSBmb3Igc2NhbiBvcGVyYXRpb24KKyAqIEBsZWRfbW9kZTogMD1ibGlua2luZywgMT1PbihSRiBPbikvT2ZmKFJGIE9mZikKKyAqIEBhZHZfcG06IGFkdmFuY2UgcG93ZXIgbWFuYWdlbWVudAorICogQHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk6IDF4MSBkZXZpY2Ugd2l0aCByeCBhbnRlbm5hIGRpdmVyc2l0eQorICogQGludGVybmFsX3dpbWF4X2NvZXg6IGludGVybmFsIHdpZmkvd2ltYXggY29tYm8gZGV2aWNlCisgKiBAaXFfaW52ZXJ0OiBJL1EgaW52ZXJzaW9uCisgKiBAdGVtcF9vZmZzZXRfdjI6IHN1cHBvcnQgdjIgb2YgdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCisgKgorICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQorICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQorICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKKyAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4KKyAqCisgKiBUaGUgaWRlYWwgdXNhZ2Ugb2YgdGhpcyBpbmZyYXN0cnVjdHVyZSBpcyB0byB0cmVhdCBhIG5ldyB1Y29kZSBBUEkKKyAqIHJlbGVhc2UgYXMgYSBuZXcgaGFyZHdhcmUgcmV2aXNpb24uCisgKi8KK3N0cnVjdCBpd2xfY2ZnIHsKKwkvKiBwYXJhbXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBkZXZpY2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZndfbmFtZV9wcmU7CisJY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9tYXg7CisJY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9vazsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKKwl1OCAgIHZhbGlkX3R4X2FudDsKKwl1OCAgIHZhbGlkX3J4X2FudDsKKwl1MTYgIHNrdTsKKwl1MTYgIGVlcHJvbV92ZXI7CisJdTE2ICBlZXByb21fY2FsaWJfdmVyOworCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOworCXZvaWQgKCphZGRpdGlvbmFsX25pY19jb25maWcpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJLyogcGFyYW1zIG5vdCBsaWtlbHkgdG8gY2hhbmdlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KKwlzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zICpiYXNlX3BhcmFtczsKKwkvKiBwYXJhbXMgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCisJc3RydWN0IGl3bF9odF9wYXJhbXMgKmh0X3BhcmFtczsKKwlzdHJ1Y3QgaXdsX2J0X3BhcmFtcyAqYnRfcGFyYW1zOworCWVudW0gaXdsX3BhX3R5cGUgcGFfdHlwZTsJICAvKiBpZiB1c2VkIHNldCB0byBJV0xfUEFfU1lTVEVNICovCisJY29uc3QgYm9vbCBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOyAvKiBpZiB1c2VkIHNldCB0byB0cnVlICovCisJY29uc3QgYm9vbCBub194dGFsX2NhbGliOworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJZW51bSBpd2xfbGVkX21vZGUgbGVkX21vZGU7CisJY29uc3QgYm9vbCBhZHZfcG07CisJY29uc3QgYm9vbCByeF93aXRoX3Npc29fZGl2ZXJzaXR5OworCWNvbnN0IGJvb2wgaW50ZXJuYWxfd2ltYXhfY29leDsKKwljb25zdCBib29sIGlxX2ludmVydDsKKwljb25zdCBib29sIHRlbXBfb2Zmc2V0X3YyOwogfTsKIAogLyoqCkBAIC0yNjYsMTUgKzM0NywyNSBAQAogICogQHVjb2RlX293bmVyOiBJV0xfT1dORVJTSElQXyoKICAqIEBjbWRfcXVldWU6IGNvbW1hbmQgcXVldWUgbnVtYmVyCiAgKiBAc3RhdHVzOiBTVEFUVVNfKgorICogQHdvd2xhbjogYXJlIHdlIHJ1bm5pbmcgd293bGFuIHVDb2RlCiAgKiBAdmFsaWRfY29udGV4dHM6IG1pY3JvY29kZS9kZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgY29udGV4dHMKICAqIEBidXM6IHBvaW50ZXIgdG8gdGhlIGJ1cyBsYXllciBkYXRhCisgKiBAY2ZnOiBzZWUgc3RydWN0IGl3bF9jZmcKICAqIEBwcml2OiBwb2ludGVyIHRvIHRoZSB1cHBlciBsYXllciBkYXRhCisgKiBAdHJhbnM6IHBvaW50ZXIgdG8gdGhlIHRyYW5zcG9ydCBsYXllciBkYXRhCiAgKiBAaHdfcGFyYW1zOiBzZWUgc3RydWN0IGl3bF9od19wYXJhbXMKICAqIEB3b3JrcXVldWU6IHRoZSB3b3JrcXVldWUgdXNlZCBieSBhbGwgdGhlIGxheWVycyBvZiB0aGUgZHJpdmVyCiAgKiBAbG9jazogcHJvdGVjdCBnZW5lcmFsIHNoYXJlZCBkYXRhCiAgKiBAc3RhX2xvY2s6IHByb3RlY3RzIHRoZSBzdGF0aW9uIHRhYmxlLgogICoJSWYgbG9jayBhbmQgc3RhX2xvY2sgYXJlIG5lZWRlZCwgbG9jayBtdXN0IGJlIGFjcXVpcmVkIGZpcnN0LgogICogQG11dGV4OgorICogQHdhaXRfY29tbWFuZF9xdWV1ZTogdGhlIHdhaXRfcXVldWUgZm9yIFNZTkMgaG9zdCBjb21tYW5kIG5hZCB1Q29kZSBsb2FkCisgKiBAZWVwcm9tOiBwb2ludGVyIHRvIHRoZSBlZXByb20vT1RQIGltYWdlCisgKiBAdWNvZGVfdHlwZTogaW5kaWNhdG9yIG9mIGxvYWRlZCB1Y29kZSBpbWFnZQorICogQG5vdGlmX3dhaXRzOiB0aGluZ3Mgd2FpdGluZyBmb3Igbm90aWZpY2F0aW9uCisgKiBAbm90aWZfd2FpdF9sb2NrOiBsb2NrIHByb3RlY3Rpbmcgbm90aWZpY2F0aW9uCisgKiBAbm90aWZfd2FpdHE6IGhlYWQgb2Ygbm90aWZpY2F0aW9uIHdhaXQgcXVldWUKKyAqIEBkZXZpY2VfcG9pbnRlcnM6IHBvaW50ZXJzIHRvIHVjb2RlIGV2ZW50IHRhYmxlcwogICovCiBzdHJ1Y3QgaXdsX3NoYXJlZCB7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKQEAgLTI5MCw2ICszODEsNyBAQAogCXU4IHZhbGlkX2NvbnRleHRzOwogCiAJc3RydWN0IGl3bF9idXMgKmJ1czsKKwlzdHJ1Y3QgaXdsX2NmZyAqY2ZnOwogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFuczsKIAlzdHJ1Y3QgaXdsX2h3X3BhcmFtcyBod19wYXJhbXM7CkBAIC0yOTksMTMgKzM5MSwyOSBAQAogCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CiAJc3RydWN0IG11dGV4IG11dGV4OwogCi0Jc3RydWN0IGl3bF90aWRfZGF0YSB0aWRfZGF0YVtJV0xBR05fU1RBVElPTl9DT1VOVF1bSVdMX01BWF9USURfQ09VTlRdOwotCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jb21tYW5kX3F1ZXVlOworCisJLyogZWVwcm9tIC0tIHRoaXMgaXMgaW4gdGhlIGNhcmQncyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKwl1OCAqZWVwcm9tOworCisJLyogdWNvZGUgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwllbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGU7CisKKwkvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCisJc3RydWN0IGxpc3RfaGVhZCBub3RpZl93YWl0czsKKwlzcGlubG9ja190IG5vdGlmX3dhaXRfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZl93YWl0cTsKKworCXN0cnVjdCB7CisJCXUzMiBlcnJvcl9ldmVudF90YWJsZTsKKwkJdTMyIGxvZ19ldmVudF90YWJsZTsKKwl9IGRldmljZV9wb2ludGVyczsKKwogfTsKIAogLypXaGF0ZXZlciBfbSBpcyAoaXdsX3RyYW5zLCBpd2xfcHJpdiwgaXdsX2J1cywgdGhlc2UgbWFjcm9zIHdpbGwgd29yayAqLwogI2RlZmluZSBwcml2KF9tKQkoKF9tKS0+c2hyZC0+cHJpdikKKyNkZWZpbmUgY2ZnKF9tKQkJKChfbSktPnNocmQtPmNmZykKICNkZWZpbmUgYnVzKF9tKQkJKChfbSktPnNocmQtPmJ1cykKICNkZWZpbmUgdHJhbnMoX20pCSgoX20pLT5zaHJkLT50cmFucykKICNkZWZpbmUgaHdfcGFyYW1zKF9tKQkoKF9tKS0+c2hyZC0+aHdfcGFyYW1zKQpAQCAtNDI3LDEyICs1MzUsNiBAQAogCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CiAKIGludCBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcik7Ci12b2lkIGl3bF9zdGFydF90eF9iYV90cmFuc19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJIHU4IHN0YV9pZCwgdTggdGlkKTsKLXZvaWQgaXdsX3N0b3BfdHhfYmFfdHJhbnNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJdTggc3RhX2lkLCB1OCB0aWQpOwogdm9pZCBpd2xfc2V0X2h3X3Jma2lsbF9zdGF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgc3RhdGUpOwogdm9pZCBpd2xfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfZnJlZV9za2Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTQ0NSw2ICs1NDcsMjQgQEAKIHZvaWQgaXdsX3N0b3Bfc3dfcXVldWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhYyk7CiB2b2lkIGl3bF93YWtlX3N3X3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYWMpOwogCisvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCit2b2lkIGl3bF9hYm9ydF9ub3RpZmljYXRpb25fd2FpdHMoc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpOwordm9pZCBfX2FjcXVpcmVzKHdhaXRfZW50cnkpCitpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdChzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCSAgICAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCisJCQkgICAgICB1OCBjbWQsCisJCQkgICAgICB2b2lkICgqZm4pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKKwkJCQkJIHZvaWQgKmRhdGEpLAorCQkJICAgICAgdm9pZCAqZm5fZGF0YSk7CitpbnQgX19tdXN0X2NoZWNrIF9fcmVsZWFzZXMod2FpdF9lbnRyeSkKK2l3bF93YWl0X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCSBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAorCQkJIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7Cit2b2lkIF9fcmVsZWFzZXMod2FpdF9lbnRyeSkKK2l3bF9yZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLAorCQkJICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSk7CisKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiB2b2lkIGl3bF9yZXNldF90cmFmZmljX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0RFQlVHRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MGQ4OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zdi1vcGVuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDEwIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMTAgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWFnbi5oIgotI2luY2x1ZGUgIml3bC10ZXN0bW9kZS5oIgotI2luY2x1ZGUgIml3bC10cmFucy5oIgotCi0vKiBUaGUgVExWcyB1c2VkIGluIHRoZSBnbmwgbWVzc2FnZSBwb2xpY3kgYmV0d2VlbiB0aGUga2VybmVsIG1vZHVsZSBhbmQKLSAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb24uIGl3bF90ZXN0bW9kZV9nbmxfbXNnX3BvbGljeSBpcyB0byBiZSBjYXJyaWVkCi0gKiB0aHJvdWdoIHRoZSBOTDgwMjExX0NNRF9URVNUTU9ERSBjaGFubmVsIHJlZ3VsYXRlZCBieSBubDgwMjExLgotICogU2VlIGl3bC10ZXN0bW9kZS5oCi0gKi8KLXN0YXRpYwotc3RydWN0IG5sYV9wb2xpY3kgaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5W0lXTF9UTV9BVFRSX01BWF0gPSB7Ci0JW0lXTF9UTV9BVFRSX0NPTU1BTkRdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCi0KLQlbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0lEXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCi0JW0lXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAotCi0JW0lXTF9UTV9BVFRSX1JFR19PRkZTRVRdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCi0JW0lXTF9UTV9BVFRSX1JFR19WQUxVRThdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKLQlbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzJdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCi0KLQlbSVdMX1RNX0FUVFJfU1lOQ19SU1BdID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCi0JW0lXTF9UTV9BVFRSX1VDT0RFX1JYX1BLVF0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKLQotCVtJV0xfVE1fQVRUUl9FRVBST01dID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCi0KLQlbSVdMX1RNX0FUVFJfVFJBQ0VfQUREUl0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKLQlbSVdMX1RNX0FUVFJfVFJBQ0VfRFVNUF0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKLQlbSVdMX1RNX0FUVFJfVFJBQ0VfU0laRV0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKLQotCVtJV0xfVE1fQVRUUl9GSVhSQVRFXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LAotCi0JW0lXTF9UTV9BVFRSX1VDT0RFX09XTkVSXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCi19OwotCi0vKgotICogU2VlIHRoZSBzdHJ1Y3QgaXdsX3J4X3BhY2tldCBpbiBpd2wtY29tbWFuZHMuaCBmb3IgdGhlIGZvcm1hdCBvZiB0aGUKLSAqIHJlY2VpdmVkIGV2ZW50cyBmcm9tIHRoZSBkZXZpY2UKLSAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X2V2ZW50X2xlbmd0aChzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlpZiAocGt0KQotCQlyZXR1cm4gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIG11bHRpY2FzdHMgdGhlIHNwb250YW5lb3VzIG1lc3NhZ2VzIGZyb20gdGhlIGRldmljZSB0byB0aGUKLSAqIHVzZXIgc3BhY2UuIEl0IGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlcmUgaXMgYSByZWNlaXZlZCBtZXNzYWdlcwotICogZnJvbSB0aGUgZGV2aWNlLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoaW4gdGhlIElTUiBvZiB0aGUgcnggaGFuZGxlcnMKLSAqIGluIGl3bGFnbiBkcml2ZXIuCi0gKgotICogVGhlIHBhcnNpbmcgb2YgdGhlIG1lc3NhZ2UgY29udGVudCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uLAotICogVGhlIG1lc3NhZ2UgY29udGVudCBpcyB0cmVhdGVkIGFzIHVuYXR0YWNrZWQgcmF3IGRhdGEgYW5kIGlzIGVuY2Fwc3VsYXRlZAotICogd2l0aCBJV0xfVE1fQVRUUl9VQ09ERV9SWF9QS1QgbXVsdGljYXN0aW5nIHRvIHRoZSB1c2VyIHNwYWNlLgotICoKLSAqIEBwcml2OiB0aGUgaW5zdGFuY2Ugb2YgaXdsd2lmaSBkZXZpY2UKLSAqIEByeGI6IHBvaW50ZXIgdG8gcnggZGF0YSBjb250ZW50IHJlY2VpdmVkIGJ5IHRoZSBJU1IKLSAqCi0gKiBTZWUgdGhlIG1lc3NhZ2UgcG9saWNpZXMgYW5kIFRMVnMgaW4gaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5W10uCi0gKiBGb3IgdGhlIG1lc3NhZ2VzIG11bHRpY2FzdGluZyB0byB0aGUgdXNlciBhcHBsaWNhdGlvbiwgdGhlIG1hbmRhdG9yeQotICogVExWIGZpZWxkcyBhcmUgOgotICoJSVdMX1RNX0FUVFJfQ09NTUFORCBtdXN0IGJlIElXTF9UTV9DTURfREVWMkFQUF9VQ09ERV9SWF9QS1QKLSAqCUlXTF9UTV9BVFRSX1VDT0RFX1JYX1BLVCBmb3IgY2FycnlpbmcgdGhlIG1lc3NhZ2UgY29udGVudAotICovCi0KLXN0YXRpYyB2b2lkIGl3bF90ZXN0bW9kZV91Y29kZV9yeF9wa3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl2b2lkICpkYXRhOwotCWludCBsZW5ndGg7Ci0KLQlkYXRhID0gKHZvaWQgKilyeGJfYWRkcihyeGIpOwotCWxlbmd0aCA9IGdldF9ldmVudF9sZW5ndGgocnhiKTsKLQotCWlmICghZGF0YSB8fCBsZW5ndGggPT0gMCkKLQkJcmV0dXJuOwotCi0Jc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfZXZlbnRfc2tiKGh3LT53aXBoeSwgMjAgKyBsZW5ndGgsCi0JCQkJCQkJCUdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJICJSdW4gb3V0IG9mIG1lbW9yeSBmb3IgbWVzc2FnZXMgdG8gdXNlciBzcGFjZSA/XG4iKTsKLQkJcmV0dXJuOwotCX0KLQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX0NPTU1BTkQsIElXTF9UTV9DTURfREVWMkFQUF9VQ09ERV9SWF9QS1QpOwotCU5MQV9QVVQoc2tiLCBJV0xfVE1fQVRUUl9VQ09ERV9SWF9QS1QsIGxlbmd0aCwgZGF0YSk7Ci0JY2ZnODAyMTFfdGVzdG1vZGVfZXZlbnQoc2tiLCBHRlBfQVRPTUlDKTsKLQlyZXR1cm47Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiT3VjaCwgb3ZlcnJhbiBidWZmZXIsIGNoZWNrIGFsbG9jYXRpb24hXG4iKTsKLX0KLQotdm9pZCBpd2xfdGVzdG1vZGVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+cHJlX3J4X2hhbmRsZXIgPSBpd2xfdGVzdG1vZGVfdWNvZGVfcnhfcGt0OwotCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQgPSBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgaXdsX3RyYWNlX2NsZWFudXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkKSB7Ci0JCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkciAmJgotCQkgICAgcHJpdi0+dGVzdG1vZGVfdHJhY2UuZG1hX2FkZHIpCi0JCQlkbWFfZnJlZV9jb2hlcmVudChidXMocHJpdiktPmRldiwKLQkJCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSwKLQkJCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuY3B1X2FkZHIsCi0JCQkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyKTsKLQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfZW5hYmxlZCA9IGZhbHNlOwotCQlwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkciA9IE5VTEw7Ci0JCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIgPSBOVUxMOwotCQlwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkciA9IDA7Ci0JCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA9IDA7Ci0JCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRvdGFsX3NpemUgPSAwOwotCX0KLX0KLQotCi12b2lkIGl3bF90ZXN0bW9kZV9jbGVhbnVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfdHJhY2VfY2xlYW51cChwcml2KTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb21tYW5kcyB0byB0aGUgdWNvZGUuCi0gKgotICogSXQgcmV0cmlldmVzIHRoZSBtYW5kYXRvcnkgZmllbGRzIElXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRCBhbmQKLSAqIElXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBIGFuZCBjYWxscyB0byB0aGUgaGFuZGxlciB0byBzZW5kIHRoZQotICogaG9zdCBjb21tYW5kIHRvIHRoZSB1Y29kZS4KLSAqCi0gKiBJZiBhbnkgbWFuZGF0b3J5IGZpZWxkIGlzIG1pc3NpbmcsIC1FTk9NU0cgaXMgcmVwbGllZCB0byB0aGUgdXNlciBzcGFjZQotICogYXBwbGljYXRpb247IG90aGVyd2lzZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gcmVzdWx0IG9mIHRoZSBob3N0IGNvbW1hbmQgdG8KLSAqIHVjb2RlIGlzIHJlcGxpZWQuCi0gKgotICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCi0gKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX3Vjb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgbmxhdHRyICoqdGIpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfaG9zdF9jbWQpKTsKLQotCWlmICghdGJbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0lEXSB8fAotCSAgICAhdGJbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0RBVEFdKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkiRXJyb3IgZmluZGluZyB1Y29kZSBjb21tYW5kIG1hbmRhdG9yeSBmaWVsZHNcbiIpOwotCQlyZXR1cm4gLUVOT01TRzsKLQl9Ci0KLQljbWQuZmxhZ3MgPSBDTURfT05fREVNQU5EOwotCWNtZC5pZCA9IG5sYV9nZXRfdTgodGJbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0lEXSk7Ci0JY21kLmRhdGFbMF0gPSBubGFfZGF0YSh0YltJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQV0pOwotCWNtZC5sZW5bMF0gPSBubGFfbGVuKHRiW0lXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBXSk7Ci0JY21kLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFk7Ci0JSVdMX0lORk8ocHJpdiwgInRlc3Rtb2RlIHVjb2RlIGNvbW1hbmQgSUQgMHgleCwgZmxhZ3MgMHgleCwiCi0JCQkJIiBsZW4gJWRcbiIsIGNtZC5pZCwgY21kLmZsYWdzLCBjbWQubGVuWzBdKTsKLQkvKiBvaywgbGV0J3Mgc3VibWl0IHRoZSBjb21tYW5kIHRvIHVjb2RlICovCi0JcmV0dXJuIGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb21tYW5kcyBmb3IgcmVnaXN0ZXIgYWNjZXNzLgotICoKLSAqIEl0IHJldHJpZXZlcyBjb21tYW5kIElEIGNhcnJpZWQgd2l0aCBJV0xfVE1fQVRUUl9DT01NQU5EIGFuZCBjYWxscyB0byB0aGUKLSAqIGhhbmRsZXJzIHJlc3BlY3RpdmVseS4KLSAqCi0gKiBJZiBpdCdzIGFuIHVua25vd24gY29tbWRuIElELCAtRU5PU1lTIGlzIHJldHVybmVkOyBvciAtRU5PTVNHIGlmIHRoZQotICogbWFuZGF0b3J5IGZpZWxkcyhJV0xfVE1fQVRUUl9SRUdfT0ZGU0VULElXTF9UTV9BVFRSX1JFR19WQUxVRTMyLAotICogSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOCkgYXJlIG1pc3Npbmc7IE90aGVyd2lzZSAwIGlzIHJlcGxpZWQgaW5kaWNhdGluZwotICogdGhlIHN1Y2Nlc3Mgb2YgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLgotICoKLSAqIElmIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzIsIHRoZSByZWdpc3RlciByZWFkCi0gKiB2YWx1ZSBpcyByZXR1cm5lZCB3aXRoIElXTF9UTV9BVFRSX1JFR19WQUxVRTMyLgotICoKLSAqIEBodzogaWVlZTgwMjExX2h3IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRldmljZQotICogQHRiOiBnbmwgbWVzc2FnZSBmaWVsZHMgZnJvbSB0aGUgdXNlciBzcGFjZQotICovCi1zdGF0aWMgaW50IGl3bF90ZXN0bW9kZV9yZWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQl1MzIgb2ZzLCB2YWwzMjsKLQl1OCB2YWw4OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19PRkZTRVRdKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBmaW5kaW5nIHJlZ2lzdGVyIG9mZnNldFxuIik7Ci0JCXJldHVybiAtRU5PTVNHOwotCX0KLQlvZnMgPSBubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9SRUdfT0ZGU0VUXSk7Ci0JSVdMX0lORk8ocHJpdiwgInRlc3Rtb2RlIHJlZ2lzdGVyIGFjY2VzcyBjb21tYW5kIG9mZnNldCAweCV4XG4iLCBvZnMpOwotCi0Jc3dpdGNoIChubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkpIHsKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyOgotCQl2YWwzMiA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBvZnMpOwotCQlJV0xfSU5GTyhwcml2LCAiMzJiaXQgdmFsdWUgdG8gcmVhZCAweCV4XG4iLCB2YWwzMik7Ci0KLQkJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKGh3LT53aXBoeSwgMjApOwotCQlpZiAoIXNrYikgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzIsIHZhbDMyKTsKLQkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6Ci0JCWlmICghdGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzJdKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSAgICAgICAiRXJyb3IgZmluZGluZyB2YWx1ZSB0byB3cml0ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01TRzsKLQkJfSBlbHNlIHsKLQkJCXZhbDMyID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzJdKTsKLQkJCUlXTF9JTkZPKHByaXYsICIzMmJpdCB2YWx1ZSB0byB3cml0ZSAweCV4XG4iLCB2YWwzMik7Ci0JCQlpd2xfd3JpdGUzMihidXMocHJpdiksIG9mcywgdmFsMzIpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6Ci0JCWlmICghdGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOF0pIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBmaW5kaW5nIHZhbHVlIHRvIHdyaXRlXG4iKTsKLQkJCXJldHVybiAtRU5PTVNHOwotCQl9IGVsc2UgewotCQkJdmFsOCA9IG5sYV9nZXRfdTgodGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOF0pOwotCQkJSVdMX0lORk8ocHJpdiwgIjhiaXQgdmFsdWUgdG8gd3JpdGUgMHgleFxuIiwgdmFsOCk7Ci0JCQlpd2xfd3JpdGU4KGJ1cyhwcml2KSwgb2ZzLCB2YWw4KTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVW5rbm93biB0ZXN0bW9kZSByZWdpc3RlciBjb21tYW5kIElEXG4iKTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLQotbmxhX3B1dF9mYWlsdXJlOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAtRU1TR1NJWkU7Ci19Ci0KLQotc3RhdGljIGludCBpd2xfdGVzdG1vZGVfY2ZnX2luaXRfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgY2FsaWJfd2FpdDsKLQlpbnQgcmV0OwotCi0JaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdiwgJmNhbGliX3dhaXQsCi0JCQkJICAgICAgQ0FMSUJSQVRJT05fQ09NUExFVEVfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgIE5VTEwsIE5VTEwpOwotCXJldCA9IGl3bGFnbl9pbml0X2FsaXZlX3N0YXJ0KHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCSJFcnJvciBjb25maWd1cmluZyBpbml0IGNhbGlicmF0aW9uOiAlZFxuIiwgcmV0KTsKLQkJZ290byBjZmdfaW5pdF9jYWxpYl9lcnJvcjsKLQl9Ci0KLQlyZXQgPSBpd2xhZ25fd2FpdF9ub3RpZmljYXRpb24ocHJpdiwgJmNhbGliX3dhaXQsIDIgKiBIWik7Ci0JaWYgKHJldCkKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGRldGVjdGluZyIKLQkJCSIgQ0FMSUJSQVRJT05fQ09NUExFVEVfTk9USUZJQ0FUSU9OOiAlZFxuIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi1jZmdfaW5pdF9jYWxpYl9lcnJvcjoKLQlpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LCAmY2FsaWJfd2FpdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb21tYW5kcyBmb3IgZHJpdmVyLgotICoKLSAqIEl0IHJldHJpZXZlcyBjb21tYW5kIElEIGNhcnJpZWQgd2l0aCBJV0xfVE1fQVRUUl9DT01NQU5EIGFuZCBjYWxscyB0byB0aGUKLSAqIGhhbmRsZXJzIHJlc3BlY3RpdmVseS4KLSAqCi0gKiBJZiBpdCdzIGFuIHVua25vd24gY29tbWRuIElELCAtRU5PU1lTIGlzIHJlcGxpZWQ7IG90aGVyd2lzZSwgdGhlIHJldHVybmVkCi0gKiB2YWx1ZSBvZiB0aGUgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uIGlzIHJlcGxpZWQgdG8gdGhlIHVzZXIgYXBwbGljYXRpb24uCi0gKgotICogSWYgdGhlcmUncyBhbnkgbWVzc2FnZSByZXNwb25kaW5nIHRvIHRoZSB1c2VyIHNwYWNlLCBJV0xfVE1fQVRUUl9TWU5DX1JTUAotICogaXMgdXNlZCBmb3IgY2FycnkgdGhlIG1lc3NhZ2Ugd2hpbGUgSVdMX1RNX0FUVFJfQ09NTUFORCBtdXN0IHNldCB0bwotICogSVdMX1RNX0NNRF9ERVYyQVBQX1NZTkNfUlNQLgotICoKLSAqIEBodzogaWVlZTgwMjExX2h3IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRldmljZQotICogQHRiOiBnbmwgbWVzc2FnZSBmaWVsZHMgZnJvbSB0aGUgdXNlciBzcGFjZQotICovCi1zdGF0aWMgaW50IGl3bF90ZXN0bW9kZV9kcml2ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGNoYXIgKnJzcF9kYXRhX3B0ciA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IDAsIHJzcF9kYXRhX2xlbiA9IDA7Ci0KLQlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgewotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FOgotCQlyc3BfZGF0YV9wdHIgPSAodW5zaWduZWQgY2hhciAqKXByaXYtPmNmZy0+bmFtZTsKLQkJcnNwX2RhdGFfbGVuID0gc3RybGVuKHByaXYtPmNmZy0+bmFtZSk7Ci0JCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCi0JCQkJCQkJcnNwX2RhdGFfbGVuICsgMjApOwotCQlpZiAoIXNrYikgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkgICAgICAgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfQ09NTUFORCwKLQkJCSAgICBJV0xfVE1fQ01EX0RFVjJBUFBfU1lOQ19SU1ApOwotCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfU1lOQ19SU1AsCi0JCQlyc3BfZGF0YV9sZW4sIHJzcF9kYXRhX3B0cik7Ci0JCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIHNlbmRpbmcgbXNnIDogJWRcbiIsCi0JCQkJICAgICAgIHN0YXR1cyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9JTklUX0ZXOgotCQlzdGF0dXMgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV9pbml0LAotCQkJCQkJICAgICAgSVdMX1VDT0RFX0lOSVQpOwotCQlpZiAoc3RhdHVzKQotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiRXJyb3IgbG9hZGluZyBpbml0IHVjb2RlOiAlZFxuIiwgc3RhdHVzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9DRkdfSU5JVF9DQUxJQjoKLQkJaXdsX3Rlc3Rtb2RlX2NmZ19pbml0X2NhbGliKHByaXYpOwotCQlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOwotCQlicmVhazsKLQotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfUlVOVElNRV9GVzoKLQkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LAotCQkJCQkgICAmcHJpdi0+dWNvZGVfcnQsCi0JCQkJCSAgIElXTF9VQ09ERV9SRUdVTEFSKTsKLQkJaWYgKHN0YXR1cykgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiRXJyb3IgbG9hZGluZyBydW50aW1lIHVjb2RlOiAlZFxuIiwgc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXN0YXR1cyA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKLQkJaWYgKHN0YXR1cykKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkVycm9yIHN0YXJ0aW5nIHRoZSBkZXZpY2U6ICVkXG4iLCBzdGF0dXMpOwotCQlicmVhazsKLQotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9FRVBST006Ci0JCWlmIChwcml2LT5lZXByb20pIHsKLQkJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCi0JCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUgKyAyMCk7Ci0JCQlpZiAoIXNrYikgewotCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX0NPTU1BTkQsCi0JCQkJSVdMX1RNX0NNRF9ERVYyQVBQX0VFUFJPTV9SU1ApOwotCQkJTkxBX1BVVChza2IsIElXTF9UTV9BVFRSX0VFUFJPTSwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZSwKLQkJCQlwcml2LT5lZXByb20pOwotCQkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwKLQkJCQkJICAgICAgIHN0YXR1cyk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRklYUkFURV9SRVE6Ci0JCWlmICghdGJbSVdMX1RNX0FUVFJfRklYUkFURV0pIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJFcnJvciBmaW5kaW5nIGZpeHJhdGUgc2V0dGluZ1xuIik7Ci0JCQlyZXR1cm4gLUVOT01TRzsKLQkJfQotCQlwcml2LT50bV9maXhlZF9yYXRlID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfRklYUkFURV0pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJVbmtub3duIHRlc3Rtb2RlIGRyaXZlciBjb21tYW5kIElEXG4iKTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gLUVNU0dTSVpFOwotfQotCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHVzZXIgYXBwbGljYXRpb24gY29tbWFuZHMgZm9yIHVDb2RlIHRyYWNlCi0gKgotICogSXQgcmV0cmlldmVzIGNvbW1hbmQgSUQgY2FycmllZCB3aXRoIElXTF9UTV9BVFRSX0NPTU1BTkQgYW5kIGNhbGxzIHRvIHRoZQotICogaGFuZGxlcnMgcmVzcGVjdGl2ZWx5LgotICoKLSAqIElmIGl0J3MgYW4gdW5rbm93biBjb21tZG4gSUQsIC1FTk9TWVMgaXMgcmVwbGllZDsgb3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQKLSAqIHZhbHVlIG9mIHRoZSBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24gaXMgcmVwbGllZCB0byB0aGUgdXNlciBhcHBsaWNhdGlvbi4KLSAqCi0gKiBAaHc6IGllZWU4MDIxMV9odyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZXZpY2UKLSAqIEB0YjogZ25sIG1lc3NhZ2UgZmllbGRzIGZyb20gdGhlIHVzZXIgc3BhY2UKLSAqLwotc3RhdGljIGludCBpd2xfdGVzdG1vZGVfdHJhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBzdGF0dXMgPSAwOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGJ1cyhwcml2KS0+ZGV2OwotCi0Jc3dpdGNoIChubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkpIHsKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9CRUdJTl9UUkFDRToKLQkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCWlmICghdGJbSVdMX1RNX0FUVFJfVFJBQ0VfU0laRV0pCi0JCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPSBUUkFDRV9CVUZGX1NJWkVfREVGOwotCQllbHNlCi0JCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPQotCQkJCW5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1RSQUNFX1NJWkVdKTsKLQkJaWYgKCFwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA8IFRSQUNFX0JVRkZfU0laRV9NSU4gfHwKLQkJICAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA+IFRSQUNFX0JVRkZfU0laRV9NQVgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlwcml2LT50ZXN0bW9kZV90cmFjZS50b3RhbF9zaXplID0KLQkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSArIFRSQUNFX0JVRkZfUEFERDsKLQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuY3B1X2FkZHIgPQotCQkJZG1hX2FsbG9jX2NvaGVyZW50KGRldiwKLQkJCQkJICAgcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSwKLQkJCQkJICAgJnByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyLAotCQkJCQkgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkcikKLQkJCXJldHVybiAtRU5PTUVNOwotCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkID0gdHJ1ZTsKLQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfYWRkciA9ICh1OCAqKVBUUl9BTElHTigKLQkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyLCAweDEwMCk7Ci0JCW1lbXNldChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyLCAweDAzQiwKLQkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSk7Ci0JCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCi0JCQlzaXplb2YocHJpdi0+dGVzdG1vZGVfdHJhY2UuZG1hX2FkZHIpICsgMjApOwotCQlpZiAoIXNrYikgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOwotCQkJaXdsX3RyYWNlX2NsZWFudXAocHJpdik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfVFJBQ0VfQUREUiwKLQkJCXNpemVvZihwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkciksCi0JCQkodTY0ICopJnByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyKTsKLQkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJICAgICAgICJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLAotCQkJCSAgICAgICBzdGF0dXMpOwotCQl9Ci0JCXByaXYtPnRlc3Rtb2RlX3RyYWNlLm51bV9jaHVua3MgPQotCQkJRElWX1JPVU5EX1VQKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSwKLQkJCQkgICAgIFRSQUNFX0NIVU5LX1NJWkUpOwotCQlicmVhazsKLQotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0VORF9UUkFDRToKLQkJaXdsX3RyYWNlX2NsZWFudXAocHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJVbmtub3duIHRlc3Rtb2RlIG1lbSBjb21tYW5kIElEXG4iKTsKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlpZiAobmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pID09Ci0JICAgIElXTF9UTV9DTURfQVBQMkRFVl9CRUdJTl9UUkFDRSkKLQkJaXdsX3RyYWNlX2NsZWFudXAocHJpdik7Ci0JcmV0dXJuIC1FTVNHU0laRTsKLX0KLQotc3RhdGljIGludCBpd2xfdGVzdG1vZGVfdHJhY2VfZHVtcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiLAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCBpZHgsIGxlbmd0aDsKLQotCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkICYmCi0JICAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIpIHsKLQkJaWR4ID0gY2ItPmFyZ3NbNF07Ci0JCWlmIChpZHggPj0gcHJpdi0+dGVzdG1vZGVfdHJhY2UubnVtX2NodW5rcykKLQkJCXJldHVybiAtRU5PRU5UOwotCQlsZW5ndGggPSBUUkFDRV9DSFVOS19TSVpFOwotCQlpZiAoKChpZHggKyAxKSA9PSBwcml2LT50ZXN0bW9kZV90cmFjZS5udW1fY2h1bmtzKSAmJgotCQkgICAgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSAlIFRSQUNFX0NIVU5LX1NJWkUpKQotCQkJbGVuZ3RoID0gcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplICUKLQkJCQlUUkFDRV9DSFVOS19TSVpFOwotCi0JCU5MQV9QVVQoc2tiLCBJV0xfVE1fQVRUUl9UUkFDRV9EVU1QLCBsZW5ndGgsCi0JCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyICsKLQkJCShUUkFDRV9DSFVOS19TSVpFICogaWR4KSk7Ci0JCWlkeCsrOwotCQljYi0+YXJnc1s0XSA9IGlkeDsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAtRUZBVUxUOwotCi0gbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiAtRU5PQlVGUzsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBzd2l0Y2ggdWNvZGUgb3duZXJzaGlwLgotICoKLSAqIEl0IHJldHJpZXZlcyB0aGUgbWFuZGF0b3J5IGZpZWxkcyBJV0xfVE1fQVRUUl9VQ09ERV9PV05FUiBhbmQKLSAqIGRlY2lkZSB3aG8gdGhlIGN1cnJlbnQgb3duZXIgb2YgdGhlIHVDb2RlCi0gKgotICogSWYgdGhlIGN1cnJlbnQgb3duZXIgaXMgT1dORVJTSElQX1RNLCB0aGVuIHRoZSBvbmx5IGhvc3QgY29tbWFuZAotICogY2FuIGRlbGl2ZXIgdG8gdUNvZGUgaXMgZnJvbSB0ZXN0bW9kZSwgYWxsIHRoZSBvdGhlciBob3N0IGNvbW1hbmRzCi0gKiB3aWxsIGRyb3BwZWQuCi0gKgotICogZGVmYXVsdCBkcml2ZXIgaXMgdGhlIG93bmVyIG9mIHVDb2RlIGluIG5vcm1hbCBvcGVyYXRpb25hbCBtb2RlCi0gKgotICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCi0gKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX293bmVyc2hpcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXU4IG93bmVyOwotCi0JaWYgKCF0YltJV0xfVE1fQVRUUl9VQ09ERV9PV05FUl0pIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgdWNvZGUgb3duZXJcbiIpOwotCQlyZXR1cm4gLUVOT01TRzsKLQl9Ci0KLQlvd25lciA9IG5sYV9nZXRfdTgodGJbSVdMX1RNX0FUVFJfVUNPREVfT1dORVJdKTsKLQlpZiAoKG93bmVyID09IElXTF9PV05FUlNISVBfRFJJVkVSKSB8fCAob3duZXIgPT0gSVdMX09XTkVSU0hJUF9UTSkpCi0JCXByaXYtPnNocmQtPnVjb2RlX293bmVyID0gb3duZXI7Ci0JZWxzZSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbnZhbGlkIG93bmVyXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLS8qIFRoZSB0ZXN0bW9kZSBnbmwgbWVzc2FnZSBoYW5kbGVyIHRoYXQgdGFrZXMgdGhlIGdubCBtZXNzYWdlIGZyb20gdGhlCi0gKiB1c2VyIHNwYWNlIGFuZCBwYXJzZXMgaXQgcGVyIHRoZSBwb2xpY3kgaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5LCB0aGVuCi0gKiBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlcnMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gdGhlcmUgaXMgdXNlciBzcGFjZSBhcHBsaWNhdGlvbiBzZW5kaW5nCi0gKiBnbmwgbWVzc2FnZSB0aHJvdWdoIHRoZSB0ZXN0bW9kZSB0dW5uZWwgTkw4MDIxMV9DTURfVEVTVE1PREUgcmVndWxhdGVkCi0gKiBieSBubDgwMjExLgotICoKLSAqIEl0IHJldHJpZXZlcyB0aGUgbWFuZGF0b3J5IGZpZWxkLCBJV0xfVE1fQVRUUl9DT01NQU5ELCBiZWZvcmUKLSAqIGRpc3BhdGNoaW5nIGl0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZXIuCi0gKgotICogSWYgSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBtaXNzaW5nLCAtRU5PTVNHIGlzIHJlcGxpZWQgdG8gdXNlciBhcHBsaWNhdGlvbjsKLSAqIC1FTk9TWVMgaXMgcmVwbGllZCB0byB0aGUgdXNlciBhcHBsaWNhdGlvbiBpZiB0aGUgY29tbWFuZCBpcyB1bmtub3duOwotICogT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBpcyBkaXNwYXRjaGVkIHRvIHRoZSByZXNwZWN0aXZlIGhhbmRsZXIuCi0gKgotICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCi0gKiBAZGF0YTogcG9pbnRlciB0byB1c2VyIHNwYWNlIG1lc3NhZ2UKLSAqIEBsZW46IGxlbmd0aCBpbiBieXRlIG9mIEBkYXRhCi0gKi8KLWludCBpd2xhZ25fbWFjX3Rlc3Rtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZGF0YSwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgbmxhdHRyICp0YltJV0xfVE1fQVRUUl9NQVhdOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXN1bHQ7Ci0KLQlyZXN1bHQgPSBubGFfcGFyc2UodGIsIElXTF9UTV9BVFRSX01BWCAtIDEsIGRhdGEsIGxlbiwKLQkJCWl3bF90ZXN0bW9kZV9nbmxfbXNnX3BvbGljeSk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkgICAgICAgIkVycm9yIHBhcnNpbmcgdGhlIGdubCBtZXNzYWdlIDogJWRcbiIsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBhYnNvbHV0ZWx5IG1hbmRhdG9yeSAqLwotCWlmICghdGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgdGVzdG1vZGUgY29tbWFuZCB0eXBlXG4iKTsKLQkJcmV0dXJuIC1FTk9NU0c7Ci0JfQotCS8qIGluIGNhc2UgbXVsdGlwbGUgYWNjZXNzZXMgdG8gdGhlIGRldmljZSBoYXBwZW5zICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0Jc3dpdGNoIChubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkpIHsKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9VQ09ERToKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIGNtZCB0byB1Q29kZVxuIik7Ci0JCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV91Y29kZShodywgdGIpOwotCQlicmVhazsKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyOgotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyOgotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSBjbWQgdG8gcmVnaXN0ZXJcbiIpOwotCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfcmVnKGh3LCB0Yik7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FOgotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfSU5JVF9GVzoKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9DRkdfSU5JVF9DQUxJQjoKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1JVTlRJTUVfRlc6Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0VFUFJPTToKLQljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9GSVhSQVRFX1JFUToKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIGNtZCB0byBkcml2ZXJcbiIpOwotCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfZHJpdmVyKGh3LCB0Yik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfQkVHSU5fVFJBQ0U6Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRU5EX1RSQUNFOgotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFQURfVFJBQ0U6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSB1Q29kZSB0cmFjZSBjbWQgdG8gZHJpdmVyXG4iKTsKLQkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3RyYWNlKGh3LCB0Yik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfT1dORVJTSElQOgotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY2hhbmdlIHVDb2RlIG93bmVyc2hpcFxuIik7Ci0JCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9vd25lcnNoaXAoaHcsIHRiKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVW5rbm93biB0ZXN0bW9kZSBjb21tYW5kXG4iKTsKLQkJcmVzdWx0ID0gLUVOT1NZUzsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGl3bGFnbl9tYWNfdGVzdG1vZGVfZHVtcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAotCQkgICAgICB2b2lkICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBubGF0dHIgKnRiW0lXTF9UTV9BVFRSX01BWF07Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJlc3VsdDsKLQl1MzIgY21kOwotCi0JaWYgKGNiLT5hcmdzWzNdKSB7Ci0JCS8qIG9mZnNldCBieSAxIHNpbmNlIGNvbW1hbmRzIHN0YXJ0IGF0IDAgKi8KLQkJY21kID0gY2ItPmFyZ3NbM10gLSAxOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IG5sYV9wYXJzZSh0YiwgSVdMX1RNX0FUVFJfTUFYIC0gMSwgZGF0YSwgbGVuLAotCQkJCWl3bF90ZXN0bW9kZV9nbmxfbXNnX3BvbGljeSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkgICAgICAgIkVycm9yIHBhcnNpbmcgdGhlIGdubCBtZXNzYWdlIDogJWRcbiIsIHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyogSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBhYnNvbHV0ZWx5IG1hbmRhdG9yeSAqLwotCQlpZiAoIXRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJFcnJvciBmaW5kaW5nIHRlc3Rtb2RlIGNvbW1hbmQgdHlwZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01TRzsKLQkJfQotCQljbWQgPSBubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSk7Ci0JCWNiLT5hcmdzWzNdID0gY21kICsgMTsKLQl9Ci0KLQkvKiBpbiBjYXNlIG11bHRpcGxlIGFjY2Vzc2VzIHRvIHRoZSBkZXZpY2UgaGFwcGVucyAqLwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFQURfVFJBQ0U6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSB0cmFjZSBjbWQgdG8gZHJpdmVyXG4iKTsKLQkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3RyYWNlX2R1bXAoaHcsIHRiLCBza2IsIGNiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGEwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5jCkBAIC0wLDAgKzEsOTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTAgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxMCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisKKyNpbmNsdWRlICJpd2wtd2lmaS5oIgorI2luY2x1ZGUgIml3bC1kZXYuaCIKKyNpbmNsdWRlICJpd2wtY29yZS5oIgorI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgorI2luY2x1ZGUgIml3bC1pby5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtdGVzdG1vZGUuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKKyNpbmNsdWRlICJpd2wtYnVzLmgiCisKKy8qIFRoZSBUTFZzIHVzZWQgaW4gdGhlIGdubCBtZXNzYWdlIHBvbGljeSBiZXR3ZWVuIHRoZSBrZXJuZWwgbW9kdWxlIGFuZAorICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbi4gaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5IGlzIHRvIGJlIGNhcnJpZWQKKyAqIHRocm91Z2ggdGhlIE5MODAyMTFfQ01EX1RFU1RNT0RFIGNoYW5uZWwgcmVndWxhdGVkIGJ5IG5sODAyMTEuCisgKiBTZWUgaXdsLXRlc3Rtb2RlLmgKKyAqLworc3RhdGljCitzdHJ1Y3QgbmxhX3BvbGljeSBpd2xfdGVzdG1vZGVfZ25sX21zZ19wb2xpY3lbSVdMX1RNX0FUVFJfTUFYXSA9IHsKKwlbSVdMX1RNX0FUVFJfQ09NTUFORF0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKKworCVtJV0xfVE1fQVRUUl9VQ09ERV9DTURfSURdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKKwlbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0RBVEFdID0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCisKKwlbSVdMX1RNX0FUVFJfUkVHX09GRlNFVF0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKKwlbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOF0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAorCVtJV0xfVE1fQVRUUl9SRUdfVkFMVUUzMl0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKKworCVtJV0xfVE1fQVRUUl9TWU5DX1JTUF0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKKwlbSVdMX1RNX0FUVFJfVUNPREVfUlhfUEtUXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAorCisJW0lXTF9UTV9BVFRSX0VFUFJPTV0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKKworCVtJV0xfVE1fQVRUUl9UUkFDRV9BRERSXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAorCVtJV0xfVE1fQVRUUl9UUkFDRV9EVU1QXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAorCVtJV0xfVE1fQVRUUl9UUkFDRV9TSVpFXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LAorCisJW0lXTF9UTV9BVFRSX0ZJWFJBVEVdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCisKKwlbSVdMX1RNX0FUVFJfVUNPREVfT1dORVJdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKKworCVtJV0xfVE1fQVRUUl9TUkFNX0FERFJdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCisJW0lXTF9UTV9BVFRSX1NSQU1fU0laRV0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKKwlbSVdMX1RNX0FUVFJfU1JBTV9EVU1QXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAorCisJW0lXTF9UTV9BVFRSX0ZXX1ZFUlNJT05dID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCisJW0lXTF9UTV9BVFRSX0RFVklDRV9JRF0gPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKK307CisKKy8qCisgKiBTZWUgdGhlIHN0cnVjdCBpd2xfcnhfcGFja2V0IGluIGl3bC1jb21tYW5kcy5oIGZvciB0aGUgZm9ybWF0IG9mIHRoZQorICogcmVjZWl2ZWQgZXZlbnRzIGZyb20gdGhlIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfZXZlbnRfbGVuZ3RoKHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQoreworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCWlmIChwa3QpCisJCXJldHVybiBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gbXVsdGljYXN0cyB0aGUgc3BvbnRhbmVvdXMgbWVzc2FnZXMgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZQorICogdXNlciBzcGFjZS4gSXQgaXMgaW52b2tlZCB3aGVuZXZlciB0aGVyZSBpcyBhIHJlY2VpdmVkIG1lc3NhZ2VzCisgKiBmcm9tIHRoZSBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhpbiB0aGUgSVNSIG9mIHRoZSByeCBoYW5kbGVycworICogaW4gaXdsYWduIGRyaXZlci4KKyAqCisgKiBUaGUgcGFyc2luZyBvZiB0aGUgbWVzc2FnZSBjb250ZW50IGlzIGxlZnQgdG8gdGhlIHVzZXIgc3BhY2UgYXBwbGljYXRpb24sCisgKiBUaGUgbWVzc2FnZSBjb250ZW50IGlzIHRyZWF0ZWQgYXMgdW5hdHRhY2tlZCByYXcgZGF0YSBhbmQgaXMgZW5jYXBzdWxhdGVkCisgKiB3aXRoIElXTF9UTV9BVFRSX1VDT0RFX1JYX1BLVCBtdWx0aWNhc3RpbmcgdG8gdGhlIHVzZXIgc3BhY2UuCisgKgorICogQHByaXY6IHRoZSBpbnN0YW5jZSBvZiBpd2x3aWZpIGRldmljZQorICogQHJ4YjogcG9pbnRlciB0byByeCBkYXRhIGNvbnRlbnQgcmVjZWl2ZWQgYnkgdGhlIElTUgorICoKKyAqIFNlZSB0aGUgbWVzc2FnZSBwb2xpY2llcyBhbmQgVExWcyBpbiBpd2xfdGVzdG1vZGVfZ25sX21zZ19wb2xpY3lbXS4KKyAqIEZvciB0aGUgbWVzc2FnZXMgbXVsdGljYXN0aW5nIHRvIHRoZSB1c2VyIGFwcGxpY2F0aW9uLCB0aGUgbWFuZGF0b3J5CisgKiBUTFYgZmllbGRzIGFyZSA6CisgKglJV0xfVE1fQVRUUl9DT01NQU5EIG11c3QgYmUgSVdMX1RNX0NNRF9ERVYyQVBQX1VDT0RFX1JYX1BLVAorICoJSVdMX1RNX0FUVFJfVUNPREVfUlhfUEtUIGZvciBjYXJyeWluZyB0aGUgbWVzc2FnZSBjb250ZW50CisgKi8KKworc3RhdGljIHZvaWQgaXdsX3Rlc3Rtb2RlX3Vjb2RlX3J4X3BrdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvaWQgKmRhdGE7CisJaW50IGxlbmd0aDsKKworCWRhdGEgPSAodm9pZCAqKXJ4Yl9hZGRyKHJ4Yik7CisJbGVuZ3RoID0gZ2V0X2V2ZW50X2xlbmd0aChyeGIpOworCisJaWYgKCFkYXRhIHx8IGxlbmd0aCA9PSAwKQorCQlyZXR1cm47CisKKwlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19ldmVudF9za2IoaHctPndpcGh5LCAyMCArIGxlbmd0aCwKKwkJCQkJCQkJR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkgIlJ1biBvdXQgb2YgbWVtb3J5IGZvciBtZXNzYWdlcyB0byB1c2VyIHNwYWNlID9cbiIpOworCQlyZXR1cm47CisJfQorCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfQ09NTUFORCwgSVdMX1RNX0NNRF9ERVYyQVBQX1VDT0RFX1JYX1BLVCk7CisJTkxBX1BVVChza2IsIElXTF9UTV9BVFRSX1VDT0RFX1JYX1BLVCwgbGVuZ3RoLCBkYXRhKTsKKwljZmc4MDIxMV90ZXN0bW9kZV9ldmVudChza2IsIEdGUF9BVE9NSUMpOworCXJldHVybjsKKworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCUlXTF9ERUJVR19JTkZPKHByaXYsICJPdWNoLCBvdmVycmFuIGJ1ZmZlciwgY2hlY2sgYWxsb2NhdGlvbiFcbiIpOworfQorCit2b2lkIGl3bF90ZXN0bW9kZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlwcml2LT5wcmVfcnhfaGFuZGxlciA9IGl3bF90ZXN0bW9kZV91Y29kZV9yeF9wa3Q7CisJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfZW5hYmxlZCA9IGZhbHNlOworCXByaXYtPnRlc3Rtb2RlX3NyYW0uc3JhbV9yZWFkZWQgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgaXdsX3NyYW1fY2xlYW51cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit7CisJaWYgKHByaXYtPnRlc3Rtb2RlX3NyYW0uc3JhbV9yZWFkZWQpIHsKKwkJa2ZyZWUocHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX2FkZHIpOworCQlwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfYWRkciA9IE5VTEw7CisJCXByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9zaXplID0gMDsKKwkJcHJpdi0+dGVzdG1vZGVfc3JhbS5udW1fY2h1bmtzID0gMDsKKwkJcHJpdi0+dGVzdG1vZGVfc3JhbS5zcmFtX3JlYWRlZCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgaXdsX3RyYWNlX2NsZWFudXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkKSB7CisJCWlmIChwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkciAmJgorCQkgICAgcHJpdi0+dGVzdG1vZGVfdHJhY2UuZG1hX2FkZHIpCisJCQlkbWFfZnJlZV9jb2hlcmVudChidXMocHJpdiktPmRldiwKKwkJCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSwKKwkJCQkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuY3B1X2FkZHIsCisJCQkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyKTsKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfZW5hYmxlZCA9IGZhbHNlOworCQlwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkciA9IE5VTEw7CisJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIgPSBOVUxMOworCQlwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkciA9IDA7CisJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA9IDA7CisJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRvdGFsX3NpemUgPSAwOworCX0KK30KKworCit2b2lkIGl3bF90ZXN0bW9kZV9jbGVhbnVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpd2xfdHJhY2VfY2xlYW51cChwcml2KTsKKwlpd2xfc3JhbV9jbGVhbnVwKHByaXYpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHRvIHRoZSB1Y29kZS4KKyAqCisgKiBJdCByZXRyaWV2ZXMgdGhlIG1hbmRhdG9yeSBmaWVsZHMgSVdMX1RNX0FUVFJfVUNPREVfQ01EX0lEIGFuZAorICogSVdMX1RNX0FUVFJfVUNPREVfQ01EX0RBVEEgYW5kIGNhbGxzIHRvIHRoZSBoYW5kbGVyIHRvIHNlbmQgdGhlCisgKiBob3N0IGNvbW1hbmQgdG8gdGhlIHVjb2RlLgorICoKKyAqIElmIGFueSBtYW5kYXRvcnkgZmllbGQgaXMgbWlzc2luZywgLUVOT01TRyBpcyByZXBsaWVkIHRvIHRoZSB1c2VyIHNwYWNlCisgKiBhcHBsaWNhdGlvbjsgb3RoZXJ3aXNlLCB0aGUgYWN0dWFsIGV4ZWN1dGlvbiByZXN1bHQgb2YgdGhlIGhvc3QgY29tbWFuZCB0bworICogdWNvZGUgaXMgcmVwbGllZC4KKyAqCisgKiBAaHc6IGllZWU4MDIxMV9odyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZXZpY2UKKyAqIEB0YjogZ25sIG1lc3NhZ2UgZmllbGRzIGZyb20gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGludCBpd2xfdGVzdG1vZGVfdWNvZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9ob3N0X2NtZCkpOworCisJaWYgKCF0YltJV0xfVE1fQVRUUl9VQ09ERV9DTURfSURdIHx8CisJICAgICF0YltJV0xfVE1fQVRUUl9VQ09ERV9DTURfREFUQV0pIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCSJFcnJvciBmaW5kaW5nIHVjb2RlIGNvbW1hbmQgbWFuZGF0b3J5IGZpZWxkc1xuIik7CisJCXJldHVybiAtRU5PTVNHOworCX0KKworCWNtZC5mbGFncyA9IENNRF9PTl9ERU1BTkQ7CisJY21kLmlkID0gbmxhX2dldF91OCh0YltJV0xfVE1fQVRUUl9VQ09ERV9DTURfSURdKTsKKwljbWQuZGF0YVswXSA9IG5sYV9kYXRhKHRiW0lXTF9UTV9BVFRSX1VDT0RFX0NNRF9EQVRBXSk7CisJY21kLmxlblswXSA9IG5sYV9sZW4odGJbSVdMX1RNX0FUVFJfVUNPREVfQ01EX0RBVEFdKTsKKwljbWQuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWTsKKwlJV0xfSU5GTyhwcml2LCAidGVzdG1vZGUgdWNvZGUgY29tbWFuZCBJRCAweCV4LCBmbGFncyAweCV4LCIKKwkJCQkiIGxlbiAlZFxuIiwgY21kLmlkLCBjbWQuZmxhZ3MsIGNtZC5sZW5bMF0pOworCS8qIG9rLCBsZXQncyBzdWJtaXQgdGhlIGNvbW1hbmQgdG8gdWNvZGUgKi8KKwlyZXR1cm4gaXdsX3RyYW5zX3NlbmRfY21kKHRyYW5zKHByaXYpLCAmY21kKTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNvbW1hbmRzIGZvciByZWdpc3RlciBhY2Nlc3MuCisgKgorICogSXQgcmV0cmlldmVzIGNvbW1hbmQgSUQgY2FycmllZCB3aXRoIElXTF9UTV9BVFRSX0NPTU1BTkQgYW5kIGNhbGxzIHRvIHRoZQorICogaGFuZGxlcnMgcmVzcGVjdGl2ZWx5LgorICoKKyAqIElmIGl0J3MgYW4gdW5rbm93biBjb21tZG4gSUQsIC1FTk9TWVMgaXMgcmV0dXJuZWQ7IG9yIC1FTk9NU0cgaWYgdGhlCisgKiBtYW5kYXRvcnkgZmllbGRzKElXTF9UTV9BVFRSX1JFR19PRkZTRVQsSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzIsCisgKiBJV0xfVE1fQVRUUl9SRUdfVkFMVUU4KSBhcmUgbWlzc2luZzsgT3RoZXJ3aXNlIDAgaXMgcmVwbGllZCBpbmRpY2F0aW5nCisgKiB0aGUgc3VjY2VzcyBvZiB0aGUgY29tbWFuZCBleGVjdXRpb24uCisgKgorICogSWYgSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1JFQUQzMiwgdGhlIHJlZ2lzdGVyIHJlYWQKKyAqIHZhbHVlIGlzIHJldHVybmVkIHdpdGggSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzIuCisgKgorICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCisgKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX3JlZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXUzMiBvZnMsIHZhbDMyOworCXU4IHZhbDg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghdGJbSVdMX1RNX0FUVFJfUkVHX09GRlNFVF0pIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgcmVnaXN0ZXIgb2Zmc2V0XG4iKTsKKwkJcmV0dXJuIC1FTk9NU0c7CisJfQorCW9mcyA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1JFR19PRkZTRVRdKTsKKwlJV0xfSU5GTyhwcml2LCAidGVzdG1vZGUgcmVnaXN0ZXIgYWNjZXNzIGNvbW1hbmQgb2Zmc2V0IDB4JXhcbiIsIG9mcyk7CisKKwlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgeworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfUkVBRDMyOgorCQl2YWwzMiA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBvZnMpOworCQlJV0xfSU5GTyhwcml2LCAiMzJiaXQgdmFsdWUgdG8gcmVhZCAweCV4XG4iLCB2YWwzMik7CisKKwkJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKGh3LT53aXBoeSwgMjApOworCQlpZiAoIXNrYikgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfUkVHX1ZBTFVFMzIsIHZhbDMyKTsKKwkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTMyOgorCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkgICAgICAgIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FTk9NU0c7CisJCX0gZWxzZSB7CisJCQl2YWwzMiA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSk7CisJCQlJV0xfSU5GTyhwcml2LCAiMzJiaXQgdmFsdWUgdG8gd3JpdGUgMHgleFxuIiwgdmFsMzIpOworCQkJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBvZnMsIHZhbDMyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFODoKKwkJaWYgKCF0YltJV0xfVE1fQVRUUl9SRUdfVkFMVUU4XSkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FTk9NU0c7CisJCX0gZWxzZSB7CisJCQl2YWw4ID0gbmxhX2dldF91OCh0YltJV0xfVE1fQVRUUl9SRUdfVkFMVUU4XSk7CisJCQlJV0xfSU5GTyhwcml2LCAiOGJpdCB2YWx1ZSB0byB3cml0ZSAweCV4XG4iLCB2YWw4KTsKKwkJCWl3bF93cml0ZTgoYnVzKHByaXYpLCBvZnMsIHZhbDgpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19SRUFEMzI6CisJCXZhbDMyID0gaXdsX3JlYWRfcHJwaChidXMocHJpdiksIG9mcyk7CisJCUlXTF9JTkZPKHByaXYsICIzMmJpdCB2YWx1ZSB0byByZWFkIDB4JXhcbiIsIHZhbDMyKTsKKworCQlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2IoaHctPndpcGh5LCAyMCk7CisJCWlmICghc2tiKSB7CisJCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJTkxBX1BVVF9VMzIoc2tiLCBJV0xfVE1fQVRUUl9SRUdfVkFMVUUzMiwgdmFsMzIpOworCQlzdGF0dXMgPSBjZmc4MDIxMV90ZXN0bW9kZV9yZXBseShza2IpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJCSJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfV1JJVEUzMjoKKwkJaWYgKCF0YltJV0xfVE1fQVRUUl9SRUdfVkFMVUUzMl0pIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJCSJFcnJvciBmaW5kaW5nIHZhbHVlIHRvIHdyaXRlXG4iKTsKKwkJCXJldHVybiAtRU5PTVNHOworCQl9IGVsc2UgeworCQkJdmFsMzIgPSBubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9SRUdfVkFMVUUzMl0pOworCQkJSVdMX0lORk8ocHJpdiwgIjMyYml0IHZhbHVlIHRvIHdyaXRlIDB4JXhcbiIsIHZhbDMyKTsKKwkJCWl3bF93cml0ZV9wcnBoKGJ1cyhwcml2KSwgb2ZzLCB2YWwzMik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVua25vd24gdGVzdG1vZGUgcmVnaXN0ZXIgY29tbWFuZCBJRFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisKK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX2NmZ19pbml0X2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IGNhbGliX3dhaXQ7CisJaW50IHJldDsKKworCWl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KHByaXYtPnNocmQsICZjYWxpYl93YWl0LAorCQkJCSAgICAgIENBTElCUkFUSU9OX0NPTVBMRVRFX05PVElGSUNBVElPTiwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlyZXQgPSBpd2xfaW5pdF9hbGl2ZV9zdGFydCh0cmFucyhwcml2KSk7CisJaWYgKHJldCkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJIkVycm9yIGNvbmZpZ3VyaW5nIGluaXQgY2FsaWJyYXRpb246ICVkXG4iLCByZXQpOworCQlnb3RvIGNmZ19pbml0X2NhbGliX2Vycm9yOworCX0KKworCXJldCA9IGl3bF93YWl0X25vdGlmaWNhdGlvbihwcml2LT5zaHJkLCAmY2FsaWJfd2FpdCwgMiAqIEhaKTsKKwlpZiAocmV0KQorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgZGV0ZWN0aW5nIgorCQkJIiBDQUxJQlJBVElPTl9DT01QTEVURV9OT1RJRklDQVRJT046ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7CisKK2NmZ19pbml0X2NhbGliX2Vycm9yOgorCWl3bF9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYtPnNocmQsICZjYWxpYl93YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNvbW1hbmRzIGZvciBkcml2ZXIuCisgKgorICogSXQgcmV0cmlldmVzIGNvbW1hbmQgSUQgY2FycmllZCB3aXRoIElXTF9UTV9BVFRSX0NPTU1BTkQgYW5kIGNhbGxzIHRvIHRoZQorICogaGFuZGxlcnMgcmVzcGVjdGl2ZWx5LgorICoKKyAqIElmIGl0J3MgYW4gdW5rbm93biBjb21tZG4gSUQsIC1FTk9TWVMgaXMgcmVwbGllZDsgb3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQKKyAqIHZhbHVlIG9mIHRoZSBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24gaXMgcmVwbGllZCB0byB0aGUgdXNlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBJZiB0aGVyZSdzIGFueSBtZXNzYWdlIHJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgc3BhY2UsIElXTF9UTV9BVFRSX1NZTkNfUlNQCisgKiBpcyB1c2VkIGZvciBjYXJyeSB0aGUgbWVzc2FnZSB3aGlsZSBJV0xfVE1fQVRUUl9DT01NQU5EIG11c3Qgc2V0IHRvCisgKiBJV0xfVE1fQ01EX0RFVjJBUFBfU1lOQ19SU1AuCisgKgorICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCisgKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX2RyaXZlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gdHJhbnMocHJpdik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpyc3BfZGF0YV9wdHIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwLCByc3BfZGF0YV9sZW4gPSAwOworCWNoYXIgYnVmWzMyXSwgKnB0ciA9IE5VTEw7CisJdW5zaWduZWQgaW50IG51bSwgZGV2aWQ7CisKKwlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgeworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FOgorCQlyc3BfZGF0YV9wdHIgPSAodW5zaWduZWQgY2hhciAqKWNmZyhwcml2KS0+bmFtZTsKKwkJcnNwX2RhdGFfbGVuID0gc3RybGVuKGNmZyhwcml2KS0+bmFtZSk7CisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCisJCQkJCQkJcnNwX2RhdGFfbGVuICsgMjApOworCQlpZiAoIXNrYikgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkgICAgICAgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfQ09NTUFORCwKKwkJCSAgICBJV0xfVE1fQ01EX0RFVjJBUFBfU1lOQ19SU1ApOworCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfU1lOQ19SU1AsCisJCQlyc3BfZGF0YV9sZW4sIHJzcF9kYXRhX3B0cik7CisJCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIHNlbmRpbmcgbXNnIDogJWRcbiIsCisJCQkJICAgICAgIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9JTklUX0ZXOgorCQlzdGF0dXMgPSBpd2xfbG9hZF91Y29kZV93YWl0X2FsaXZlKHRyYW5zLCBJV0xfVUNPREVfSU5JVCk7CisJCWlmIChzdGF0dXMpCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCSJFcnJvciBsb2FkaW5nIGluaXQgdWNvZGU6ICVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0NGR19JTklUX0NBTElCOgorCQlpd2xfdGVzdG1vZGVfY2ZnX2luaXRfY2FsaWIocHJpdik7CisJCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyk7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9SVU5USU1FX0ZXOgorCQlzdGF0dXMgPSBpd2xfbG9hZF91Y29kZV93YWl0X2FsaXZlKHRyYW5zLCBJV0xfVUNPREVfUkVHVUxBUik7CisJCWlmIChzdGF0dXMpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJIkVycm9yIGxvYWRpbmcgcnVudGltZSB1Y29kZTogJWRcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7CisJCWlmIChzdGF0dXMpCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCSJFcnJvciBzdGFydGluZyB0aGUgZGV2aWNlOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1dPV0xBTl9GVzoKKwkJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKKwkJaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKTsKKwkJc3RhdHVzID0gaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZSh0cmFucywgSVdMX1VDT0RFX1dPV0xBTik7CisJCWlmIChzdGF0dXMpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJIkVycm9yIGxvYWRpbmcgV09XTEFOIHVjb2RlOiAlZFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCXN0YXR1cyA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKKwkJaWYgKHN0YXR1cykKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJIkVycm9yIHN0YXJ0aW5nIHRoZSBkZXZpY2U6ICVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9FRVBST006CisJCWlmIChwcml2LT5zaHJkLT5lZXByb20pIHsKKwkJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCisJCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUgKyAyMCk7CisJCQlpZiAoIXNrYikgeworCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX0NPTU1BTkQsCisJCQkJSVdMX1RNX0NNRF9ERVYyQVBQX0VFUFJPTV9SU1ApOworCQkJTkxBX1BVVChza2IsIElXTF9UTV9BVFRSX0VFUFJPTSwKKwkJCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZSwKKwkJCQlwcml2LT5zaHJkLT5lZXByb20pOworCQkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwKKwkJCQkJICAgICAgIHN0YXR1cyk7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRklYUkFURV9SRVE6CisJCWlmICghdGJbSVdMX1RNX0FUVFJfRklYUkFURV0pIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJICAgICAgICJFcnJvciBmaW5kaW5nIGZpeHJhdGUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVOT01TRzsKKwkJfQorCQlwcml2LT50bV9maXhlZF9yYXRlID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfRklYUkFURV0pOworCQlicmVhazsKKworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9GV19WRVJTSU9OOgorCQlJV0xfSU5GTyhwcml2LCAidUNvZGUgdmVyc2lvbiByYXc6IDB4JXhcbiIsIHByaXYtPnVjb2RlX3Zlcik7CisKKwkJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKGh3LT53aXBoeSwgMjApOworCQlpZiAoIXNrYikgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfRldfVkVSU0lPTiwgcHJpdi0+dWNvZGVfdmVyKTsKKwkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfREVWSUNFX0lEOgorCQlidXNfZ2V0X2h3X2lkKGJ1cyhwcml2KSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCXB0ciA9IGJ1ZjsKKwkJc3Ryc2VwKCZwdHIsICI6Iik7CisJCXNzY2FuZihzdHJzZXAoJnB0ciwgIjoiKSwgIiV4IiwgJm51bSk7CisJCXNzY2FuZihzdHJzZXAoJnB0ciwgIjoiKSwgIiV4IiwgJmRldmlkKTsKKwkJSVdMX0lORk8ocHJpdiwgIkRldmljZSBJRCA9IDB4JTA0eCwgU3ViRGV2aWNlIElEPSAweCUwNHhcbiIsCisJCQkJbnVtLCBkZXZpZCk7CisJCWRldmlkIHw9IChudW0gPDwgMTYpOworCisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksIDIwKTsKKwkJaWYgKCFza2IpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX0RFVklDRV9JRCwgZGV2aWQpOworCQlzdGF0dXMgPSBjZmc4MDIxMV90ZXN0bW9kZV9yZXBseShza2IpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJCSJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJVbmtub3duIHRlc3Rtb2RlIGRyaXZlciBjb21tYW5kIElEXG4iKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCXJldHVybiBzdGF0dXM7CisKK25sYV9wdXRfZmFpbHVyZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHVzZXIgYXBwbGljYXRpb24gY29tbWFuZHMgZm9yIHVDb2RlIHRyYWNlCisgKgorICogSXQgcmV0cmlldmVzIGNvbW1hbmQgSUQgY2FycmllZCB3aXRoIElXTF9UTV9BVFRSX0NPTU1BTkQgYW5kIGNhbGxzIHRvIHRoZQorICogaGFuZGxlcnMgcmVzcGVjdGl2ZWx5LgorICoKKyAqIElmIGl0J3MgYW4gdW5rbm93biBjb21tZG4gSUQsIC1FTk9TWVMgaXMgcmVwbGllZDsgb3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQKKyAqIHZhbHVlIG9mIHRoZSBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24gaXMgcmVwbGllZCB0byB0aGUgdXNlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAaHc6IGllZWU4MDIxMV9odyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZXZpY2UKKyAqIEB0YjogZ25sIG1lc3NhZ2UgZmllbGRzIGZyb20gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGludCBpd2xfdGVzdG1vZGVfdHJhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGJ1cyhwcml2KS0+ZGV2OworCisJc3dpdGNoIChubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkpIHsKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9CRUdJTl9UUkFDRToKKwkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICghdGJbSVdMX1RNX0FUVFJfVFJBQ0VfU0laRV0pCisJCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPSBUUkFDRV9CVUZGX1NJWkVfREVGOworCQllbHNlCisJCQlwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgPQorCQkJCW5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1RSQUNFX1NJWkVdKTsKKwkJaWYgKCFwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA8IFRSQUNFX0JVRkZfU0laRV9NSU4gfHwKKwkJICAgIHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSA+IFRSQUNFX0JVRkZfU0laRV9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT50ZXN0bW9kZV90cmFjZS50b3RhbF9zaXplID0KKwkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSArIFRSQUNFX0JVRkZfUEFERDsKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UuY3B1X2FkZHIgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KGRldiwKKwkJCQkJICAgcHJpdi0+dGVzdG1vZGVfdHJhY2UudG90YWxfc2l6ZSwKKwkJCQkJICAgJnByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwcml2LT50ZXN0bW9kZV90cmFjZS5jcHVfYWRkcikKKwkJCXJldHVybiAtRU5PTUVNOworCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkID0gdHJ1ZTsKKwkJcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfYWRkciA9ICh1OCAqKVBUUl9BTElHTigKKwkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmNwdV9hZGRyLCAweDEwMCk7CisJCW1lbXNldChwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyLCAweDAzQiwKKwkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSk7CisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCisJCQlzaXplb2YocHJpdi0+dGVzdG1vZGVfdHJhY2UuZG1hX2FkZHIpICsgMjApOworCQlpZiAoIXNrYikgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworCQkJaXdsX3RyYWNlX2NsZWFudXAocHJpdik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfVFJBQ0VfQUREUiwKKwkJCXNpemVvZihwcml2LT50ZXN0bW9kZV90cmFjZS5kbWFfYWRkciksCisJCQkodTY0ICopJnByaXYtPnRlc3Rtb2RlX3RyYWNlLmRtYV9hZGRyKTsKKwkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsCisJCQkJICAgICAgICJFcnJvciBzZW5kaW5nIG1zZyA6ICVkXG4iLAorCQkJCSAgICAgICBzdGF0dXMpOworCQl9CisJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLm51bV9jaHVua3MgPQorCQkJRElWX1JPVU5EX1VQKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSwKKwkJCQkgICAgIERVTVBfQ0hVTktfU0laRSk7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRU5EX1RSQUNFOgorCQlpd2xfdHJhY2VfY2xlYW51cChwcml2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVua25vd24gdGVzdG1vZGUgbWVtIGNvbW1hbmQgSURcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJcmV0dXJuIHN0YXR1czsKKworbmxhX3B1dF9mYWlsdXJlOgorCWtmcmVlX3NrYihza2IpOworCWlmIChubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkgPT0KKwkgICAgSVdMX1RNX0NNRF9BUFAyREVWX0JFR0lOX1RSQUNFKQorCQlpd2xfdHJhY2VfY2xlYW51cChwcml2KTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IGl3bF90ZXN0bW9kZV90cmFjZV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgbmxhdHRyICoqdGIsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IGlkeCwgbGVuZ3RoOworCisJaWYgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2VuYWJsZWQgJiYKKwkgICAgcHJpdi0+dGVzdG1vZGVfdHJhY2UudHJhY2VfYWRkcikgeworCQlpZHggPSBjYi0+YXJnc1s0XTsKKwkJaWYgKGlkeCA+PSBwcml2LT50ZXN0bW9kZV90cmFjZS5udW1fY2h1bmtzKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWxlbmd0aCA9IERVTVBfQ0hVTktfU0laRTsKKwkJaWYgKCgoaWR4ICsgMSkgPT0gcHJpdi0+dGVzdG1vZGVfdHJhY2UubnVtX2NodW5rcykgJiYKKwkJICAgIChwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgJSBEVU1QX0NIVU5LX1NJWkUpKQorCQkJbGVuZ3RoID0gcHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplICUKKwkJCQlEVU1QX0NIVU5LX1NJWkU7CisKKwkJTkxBX1BVVChza2IsIElXTF9UTV9BVFRSX1RSQUNFX0RVTVAsIGxlbmd0aCwKKwkJCXByaXYtPnRlc3Rtb2RlX3RyYWNlLnRyYWNlX2FkZHIgKworCQkJKERVTVBfQ0hVTktfU0laRSAqIGlkeCkpOworCQlpZHgrKzsKKwkJY2ItPmFyZ3NbNF0gPSBpZHg7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVGQVVMVDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVOT0JVRlM7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHVzZXIgYXBwbGljYXRpb24gc3dpdGNoIHVjb2RlIG93bmVyc2hpcC4KKyAqCisgKiBJdCByZXRyaWV2ZXMgdGhlIG1hbmRhdG9yeSBmaWVsZHMgSVdMX1RNX0FUVFJfVUNPREVfT1dORVIgYW5kCisgKiBkZWNpZGUgd2hvIHRoZSBjdXJyZW50IG93bmVyIG9mIHRoZSB1Q29kZQorICoKKyAqIElmIHRoZSBjdXJyZW50IG93bmVyIGlzIE9XTkVSU0hJUF9UTSwgdGhlbiB0aGUgb25seSBob3N0IGNvbW1hbmQKKyAqIGNhbiBkZWxpdmVyIHRvIHVDb2RlIGlzIGZyb20gdGVzdG1vZGUsIGFsbCB0aGUgb3RoZXIgaG9zdCBjb21tYW5kcworICogd2lsbCBkcm9wcGVkLgorICoKKyAqIGRlZmF1bHQgZHJpdmVyIGlzIHRoZSBvd25lciBvZiB1Q29kZSBpbiBub3JtYWwgb3BlcmF0aW9uYWwgbW9kZQorICoKKyAqIEBodzogaWVlZTgwMjExX2h3IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRldmljZQorICogQHRiOiBnbmwgbWVzc2FnZSBmaWVsZHMgZnJvbSB0aGUgdXNlciBzcGFjZQorICovCitzdGF0aWMgaW50IGl3bF90ZXN0bW9kZV9vd25lcnNoaXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwl1OCBvd25lcjsKKworCWlmICghdGJbSVdMX1RNX0FUVFJfVUNPREVfT1dORVJdKSB7CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBmaW5kaW5nIHVjb2RlIG93bmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NU0c7CisJfQorCisJb3duZXIgPSBubGFfZ2V0X3U4KHRiW0lXTF9UTV9BVFRSX1VDT0RFX09XTkVSXSk7CisJaWYgKChvd25lciA9PSBJV0xfT1dORVJTSElQX0RSSVZFUikgfHwgKG93bmVyID09IElXTF9PV05FUlNISVBfVE0pKQorCQlwcml2LT5zaHJkLT51Y29kZV9vd25lciA9IG93bmVyOworCWVsc2UgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW52YWxpZCBvd25lclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdXNlciBhcHBsaWNhdGlvbiBjb21tYW5kcyBmb3IgU1JBTSBkYXRhIGR1bXAKKyAqCisgKiBJdCByZXRyaWV2ZXMgdGhlIG1hbmRhdG9yeSBmaWVsZHMgSVdMX1RNX0FUVFJfU1JBTV9BRERSIGFuZAorICogSVdMX1RNX0FUVFJfU1JBTV9TSVpFIHRvIGRlY2lkZSB0aGUgbWVtb3J5IGFyZWEgZm9yIFNSQU0gZGF0YSByZWFkaW5nCisgKgorICogU2V2ZXJhbCBlcnJvciB3aWxsIGJlIHJldHVyZWQsIC1FQlVTWSBpZiB0aGUgU1JBTSBkYXRhIHJldHJpZXZlZCBieQorICogcHJldmlvdXMgY29tbWFuZCBoYXMgbm90IGJlZW4gZGVsaXZlcmVkIHRvIHVzZXJzcGFjZSwgb3IgLUVOT01TRyBpZgorICogdGhlIG1hbmRhdG9yeSBmaWVsZHMgKElXTF9UTV9BVFRSX1NSQU1fQUREUixJV0xfVE1fQVRUUl9TUkFNX1NJWkUpCisgKiBhcmUgbWlzc2luZywgb3IgLUVOT01FTSBpZiB0aGUgYnVmZmVyIGFsbG9jYXRpb24gZmFpbHMuCisgKgorICogT3RoZXJ3aXNlIDAgaXMgcmVwbGllZCBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBTUkFNIHJlYWRpbmcuCisgKgorICogQGh3OiBpZWVlODAyMTFfaHcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCisgKiBAdGI6IGdubCBtZXNzYWdlIGZpZWxkcyBmcm9tIHRoZSB1c2VyIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX3NyYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBubGF0dHIgKip0YikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwl1MzIgYmFzZSwgb2ZzLCBzaXplLCBtYXhzaXplOworCisJaWYgKHByaXYtPnRlc3Rtb2RlX3NyYW0uc3JhbV9yZWFkZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXRiW0lXTF9UTV9BVFRSX1NSQU1fQUREUl0pIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgU1JBTSBvZmZzZXQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5PTVNHOworCX0KKwlvZnMgPSBubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9TUkFNX0FERFJdKTsKKwlpZiAoIXRiW0lXTF9UTV9BVFRSX1NSQU1fU0laRV0pIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGZpbmRpbmcgc2l6ZSBmb3IgU1JBTSByZWFkaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NU0c7CisJfQorCXNpemUgPSBubGFfZ2V0X3UzMih0YltJV0xfVE1fQVRUUl9TUkFNX1NJWkVdKTsKKwlzd2l0Y2ggKHByaXYtPnNocmQtPnVjb2RlX3R5cGUpIHsKKwljYXNlIElXTF9VQ09ERV9SRUdVTEFSOgorCQltYXhzaXplID0gdHJhbnMocHJpdiktPnVjb2RlX3J0LmRhdGEubGVuOworCQlicmVhazsKKwljYXNlIElXTF9VQ09ERV9JTklUOgorCQltYXhzaXplID0gdHJhbnMocHJpdiktPnVjb2RlX2luaXQuZGF0YS5sZW47CisJCWJyZWFrOworCWNhc2UgSVdMX1VDT0RFX1dPV0xBTjoKKwkJbWF4c2l6ZSA9IHRyYW5zKHByaXYpLT51Y29kZV93b3dsYW4uZGF0YS5sZW47CisJCWJyZWFrOworCWNhc2UgSVdMX1VDT0RFX05PTkU6CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciwgdUNvZGUgZG9lcyBub3QgYmVlbiBsb2FkZWRcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwlkZWZhdWx0OgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IsIHVuc3VwcG9ydGVkIHVDb2RlIHR5cGVcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJaWYgKChvZnMgKyBzaXplKSA+IG1heHNpemUpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkludmFsaWQgb2Zmc2V0L3NpemU6IG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfc2l6ZSA9IChzaXplIC8gNCkgKiA0OworCXByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9hZGRyID0KKwkJa21hbGxvYyhwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9hZGRyID09IE5VTEwpIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJhc2UgPSAweDgwMDAwMDsKKwlfaXdsX3JlYWRfdGFyZ19tZW1fd29yZHMoYnVzKHByaXYpLCBiYXNlICsgb2ZzLAorCQkJCQlwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfYWRkciwKKwkJCQkJcHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX3NpemUgLyA0KTsKKwlwcml2LT50ZXN0bW9kZV9zcmFtLm51bV9jaHVua3MgPQorCQlESVZfUk9VTkRfVVAocHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX3NpemUsIERVTVBfQ0hVTktfU0laRSk7CisJcHJpdi0+dGVzdG1vZGVfc3JhbS5zcmFtX3JlYWRlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX3NyYW1fZHVtcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCBpZHgsIGxlbmd0aDsKKworCWlmIChwcml2LT50ZXN0bW9kZV9zcmFtLnNyYW1fcmVhZGVkKSB7CisJCWlkeCA9IGNiLT5hcmdzWzRdOworCQlpZiAoaWR4ID49IHByaXYtPnRlc3Rtb2RlX3NyYW0ubnVtX2NodW5rcykgeworCQkJaXdsX3NyYW1fY2xlYW51cChwcml2KTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCWxlbmd0aCA9IERVTVBfQ0hVTktfU0laRTsKKwkJaWYgKCgoaWR4ICsgMSkgPT0gcHJpdi0+dGVzdG1vZGVfc3JhbS5udW1fY2h1bmtzKSAmJgorCQkgICAgKHByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9zaXplICUgRFVNUF9DSFVOS19TSVpFKSkKKwkJCWxlbmd0aCA9IHByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9zaXplICUKKwkJCQlEVU1QX0NIVU5LX1NJWkU7CisKKwkJTkxBX1BVVChza2IsIElXTF9UTV9BVFRSX1NSQU1fRFVNUCwgbGVuZ3RoLAorCQkJcHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX2FkZHIgKworCQkJKERVTVBfQ0hVTktfU0laRSAqIGlkeCkpOworCQlpZHgrKzsKKwkJY2ItPmFyZ3NbNF0gPSBpZHg7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVGQVVMVDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLUVOT0JVRlM7Cit9CisKKworLyogVGhlIHRlc3Rtb2RlIGdubCBtZXNzYWdlIGhhbmRsZXIgdGhhdCB0YWtlcyB0aGUgZ25sIG1lc3NhZ2UgZnJvbSB0aGUKKyAqIHVzZXIgc3BhY2UgYW5kIHBhcnNlcyBpdCBwZXIgdGhlIHBvbGljeSBpd2xfdGVzdG1vZGVfZ25sX21zZ19wb2xpY3ksIHRoZW4KKyAqIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiB0aGVyZSBpcyB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uIHNlbmRpbmcKKyAqIGdubCBtZXNzYWdlIHRocm91Z2ggdGhlIHRlc3Rtb2RlIHR1bm5lbCBOTDgwMjExX0NNRF9URVNUTU9ERSByZWd1bGF0ZWQKKyAqIGJ5IG5sODAyMTEuCisgKgorICogSXQgcmV0cmlldmVzIHRoZSBtYW5kYXRvcnkgZmllbGQsIElXTF9UTV9BVFRSX0NPTU1BTkQsIGJlZm9yZQorICogZGlzcGF0Y2hpbmcgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlci4KKyAqCisgKiBJZiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIG1pc3NpbmcsIC1FTk9NU0cgaXMgcmVwbGllZCB0byB1c2VyIGFwcGxpY2F0aW9uOworICogLUVOT1NZUyBpcyByZXBsaWVkIHRvIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGlmIHRoZSBjb21tYW5kIGlzIHVua25vd247CisgKiBPdGhlcndpc2UsIHRoZSBjb21tYW5kIGlzIGRpc3BhdGNoZWQgdG8gdGhlIHJlc3BlY3RpdmUgaGFuZGxlci4KKyAqCisgKiBAaHc6IGllZWU4MDIxMV9odyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZXZpY2UKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHVzZXIgc3BhY2UgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIGluIGJ5dGUgb2YgQGRhdGEKKyAqLworaW50IGl3bGFnbl9tYWNfdGVzdG1vZGVfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBubGF0dHIgKnRiW0lXTF9UTV9BVFRSX01BWF07CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IG5sYV9wYXJzZSh0YiwgSVdMX1RNX0FUVFJfTUFYIC0gMSwgZGF0YSwgbGVuLAorCQkJaXdsX3Rlc3Rtb2RlX2dubF9tc2dfcG9saWN5KTsKKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCSAgICAgICAiRXJyb3IgcGFyc2luZyB0aGUgZ25sIG1lc3NhZ2UgOiAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIGFic29sdXRlbHkgbWFuZGF0b3J5ICovCisJaWYgKCF0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgZmluZGluZyB0ZXN0bW9kZSBjb21tYW5kIHR5cGVcbiIpOworCQlyZXR1cm4gLUVOT01TRzsKKwl9CisJLyogaW4gY2FzZSBtdWx0aXBsZSBhY2Nlc3NlcyB0byB0aGUgZGV2aWNlIGhhcHBlbnMgKi8KKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgeworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1VDT0RFOgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY21kIHRvIHVDb2RlXG4iKTsKKwkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3Vjb2RlKGh3LCB0Yik7CisJCWJyZWFrOworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfUkVBRDMyOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfV1JJVEUzMjoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFODoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfUkVBRDMyOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19XUklURTMyOgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY21kIHRvIHJlZ2lzdGVyXG4iKTsKKwkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3JlZyhodywgdGIpOworCQlicmVhazsKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfREVWSUNFTkFNRToKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX0lOSVRfRlc6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfQ0ZHX0lOSVRfQ0FMSUI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9SVU5USU1FX0ZXOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9FRVBST006CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRklYUkFURV9SRVE6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9XT1dMQU5fRlc6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0ZXX1ZFUlNJT046CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRV9JRDoKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIGNtZCB0byBkcml2ZXJcbiIpOworCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfZHJpdmVyKGh3LCB0Yik7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfQkVHSU5fVFJBQ0U6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRU5EX1RSQUNFOgorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFQURfVFJBQ0U6CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSB1Q29kZSB0cmFjZSBjbWQgdG8gZHJpdmVyXG4iKTsKKwkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3RyYWNlKGh3LCB0Yik7CisJCWJyZWFrOworCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfT1dORVJTSElQOgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY2hhbmdlIHVDb2RlIG93bmVyc2hpcFxuIik7CisJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9vd25lcnNoaXAoaHcsIHRiKTsKKwkJYnJlYWs7CisKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU06CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSBzcmFtIHJlYWQgY21kIHRvIGRyaXZlclxuIik7CisJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9zcmFtKGh3LCB0Yik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVua25vd24gdGVzdG1vZGUgY29tbWFuZFxuIik7CisJCXJlc3VsdCA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBpd2xhZ25fbWFjX3Rlc3Rtb2RlX2R1bXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgICAgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltJV0xfVE1fQVRUUl9NQVhdOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXN1bHQ7CisJdTMyIGNtZDsKKworCWlmIChjYi0+YXJnc1szXSkgeworCQkvKiBvZmZzZXQgYnkgMSBzaW5jZSBjb21tYW5kcyBzdGFydCBhdCAwICovCisJCWNtZCA9IGNiLT5hcmdzWzNdIC0gMTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBubGFfcGFyc2UodGIsIElXTF9UTV9BVFRSX01BWCAtIDEsIGRhdGEsIGxlbiwKKwkJCQlpd2xfdGVzdG1vZGVfZ25sX21zZ19wb2xpY3kpOworCQlpZiAocmVzdWx0KSB7CisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJICAgICAgICJFcnJvciBwYXJzaW5nIHRoZSBnbmwgbWVzc2FnZSA6ICVkXG4iLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8qIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgYWJzb2x1dGVseSBtYW5kYXRvcnkgKi8KKwkJaWYgKCF0YltJV0xfVE1fQVRUUl9DT01NQU5EXSkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkiRXJyb3IgZmluZGluZyB0ZXN0bW9kZSBjb21tYW5kIHR5cGVcbiIpOworCQkJcmV0dXJuIC1FTk9NU0c7CisJCX0KKwkJY21kID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pOworCQljYi0+YXJnc1szXSA9IGNtZCArIDE7CisJfQorCisJLyogaW4gY2FzZSBtdWx0aXBsZSBhY2Nlc3NlcyB0byB0aGUgZGV2aWNlIGhhcHBlbnMgKi8KKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1RSQUNFOgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidUNvZGUgdHJhY2UgY21kIHRvIGRyaXZlclxuIik7CisJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV90cmFjZV9kdW1wKGh3LCB0Yiwgc2tiLCBjYik7CisJCWJyZWFrOworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0RVTVBfU1JBTToKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIHNyYW0gZHVtcCBjbWQgdG8gZHJpdmVyXG4iKTsKKwkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3NyYW1fZHVtcChodywgdGIsIHNrYiwgY2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmgKaW5kZXggYjk4MGJkYS4uMjYxMzhmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5oCkBAIC03Niw5ICs3Niw5IEBACiAgKgl0aGUgYWN0dWFsIHVDb2RlIGhvc3QgY29tbWFuZCBJRCBpcyBjYXJyaWVkIHdpdGgKICAqCUlXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRAogICoKLSAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1JFQUQzMjoKLSAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6Ci0gKiBASVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6CisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfUkVBRDMyOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzI6CisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfV1JJVEU4OgogICoJY29tbWFuZHMgZnJvbSB1c2VyIGFwcGxpY2FpdG9uIHRvIGFjY2VzcyByZWdpc3RlcgogICoKICAqIEBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRU5BTUU6IHJldHJpZXZlIGRldmljZSBuYW1lCkBAIC0xMDMsMTYgKzEwMywzMCBAQAogICogQElXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQOgogICoJY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gY2FycnkgdGhlIGVlcHJvbSByZXNwb25zZQogICoJdG8gdXNlciBhcHBsaWNhdGlvbgorICoKICAqIEBJV0xfVE1fQ01EX0FQUDJERVZfT1dORVJTSElQOgogICoJY29tbWFuZHMgZnJvbSB1c2VyIGFwcGxpY2F0aW9uIHRvIG93biBjaGFuZ2UgdGhlIG93bmVyc2hpcCBvZiB0aGUgdUNvZGUKICAqCWlmIGFwcGxpY2F0aW9uIGhhcyB0aGUgb3duZXJzaGlwLCB0aGUgb25seSBob3N0IGNvbW1hbmQgZnJvbQogICoJdGVzdG1vZGUgd2lsbCBkZWxpdmVyIHRvIHVDb2RlLiBEZWZhdWx0IG93bmVyIGlzIGRyaXZlcgorICoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1dSSVRFMzI6CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gaW5kaXJlY3RseSBhY2Nlc3MgcGVyaXBoZXJhbCByZWdpc3RlcgorICoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVBRF9TUkFNOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9EVU1QX1NSQU06CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gcmVhZCBkYXRhIGluIHNyYW0KKyAqCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0xPQURfV09XTEFOX0ZXOiBsb2FkIFdlYWsgT24gV2lyZWxlc3MgTEFOIHVDb2RlIGltYWdlCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9GV19WRVJTSU9OOiByZXRyaWV2ZSB1Q29kZSB2ZXJzaW9uCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VfSUQ6IHJldHJpZXZlIElEIGluZm9ybWF0aW9uIGluIGRldmljZQorICoKICAqLwogZW51bSBpd2xfdG1fY21kX3QgewogCUlXTF9UTV9DTURfQVBQMkRFVl9VQ09ERQkJPSAxLAotCUlXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyCQk9IDIsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyCQk9IDMsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTgJCT0gNCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19SRUFEMzIJPSAyLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzIJPSAzLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFOAk9IDQsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FCT0gNSwKIAlJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9JTklUX0ZXCQk9IDYsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0NGR19JTklUX0NBTElCCT0gNywKQEAgLTEyNiw3ICsxNDAsMTQgQEAKIAlJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtUCQk9IDE1LAogCUlXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQCQk9IDE2LAogCUlXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVAJCT0gMTcsCi0JSVdMX1RNX0NNRF9NQVgJCQkJPSAxOCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMgk9IDE4LAorCUlXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfV1JJVEUzMgk9IDE5LAorCUlXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU0JCT0gMjAsCisJSVdMX1RNX0NNRF9BUFAyREVWX0RVTVBfU1JBTQkJPSAyMSwKKwlJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9XT1dMQU5fRlcJPSAyMiwKKwlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0ZXX1ZFUlNJT04JPSAyMywKKwlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRV9JRAk9IDI0LAorCUlXTF9UTV9DTURfTUFYCQkJCT0gMjUsCiB9OwogCiAvKgpAQCAtMTk2LDYgKzIxNywyNiBAQAogICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVAsCiAgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CiAgKglJV0xfVE1fQVRUUl9VQ09ERV9PV05FUiBmb3IgdGhlIG5ldyBvd25lcgorICoKKyAqIEBJV0xfVE1fQVRUUl9TUkFNX0FERFI6CisgKiBASVdMX1RNX0FUVFJfU1JBTV9TSVpFOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU0sCisgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9TUkFNX0FERFIgZm9yIHRoZSBhZGRyZXNzIGluIHNyYW0KKyAqCUlXTF9UTV9BVFRSX1NSQU1fU0laRSBmb3IgdGhlIGJ1ZmZlciBzaXplIG9mIGRhdGEgcmVhZGluZworICoKKyAqIEBJV0xfVE1fQVRUUl9TUkFNX0RVTVA6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX0RVTVBfU1JBTSwKKyAqCUlXTF9UTV9BVFRSX1NSQU1fRFVNUCBmb3IgdGhlIGRhdGEgaW4gc3JhbQorICoKKyAqIEBJV0xfVE1fQVRUUl9GV19WRVJTSU9OOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfRldfVkVSU0lPTiwKKyAqCUlXTF9UTV9BVFRSX0ZXX1ZFUlNJT04gZm9yIHRoZSB1Q29kZSB2ZXJzaW9uCisgKgorICogQElXTF9UTV9BVFRSX0RFVklDRV9JRDoKKyAqCVdoZW4gSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRV9JRCwKKyAqCUlXTF9UTV9BVFRSX0RFVklDRV9JRCBmb3IgdGhlIGRldmljZSBJRCBpbmZvcm1hdGlvbgorICoKICAqLwogZW51bSBpd2xfdG1fYXR0cl90IHsKIAlJV0xfVE1fQVRUUl9OT1RfQVBQTElDQUJMRQkJPSAwLApAQCAtMjEzLDcgKzI1NCwxMiBAQAogCUlXTF9UTV9BVFRSX1RSQUNFX0RVTVAJCQk9IDEyLAogCUlXTF9UTV9BVFRSX0ZJWFJBVEUJCQk9IDEzLAogCUlXTF9UTV9BVFRSX1VDT0RFX09XTkVSCQkJPSAxNCwKLQlJV0xfVE1fQVRUUl9NQVgJCQkJPSAxNSwKKwlJV0xfVE1fQVRUUl9TUkFNX0FERFIJCQk9IDE1LAorCUlXTF9UTV9BVFRSX1NSQU1fU0laRQkJCT0gMTYsCisJSVdMX1RNX0FUVFJfU1JBTV9EVU1QCQkJPSAxNywKKwlJV0xfVE1fQVRUUl9GV19WRVJTSU9OCQkJPSAxOCwKKwlJV0xfVE1fQVRUUl9ERVZJQ0VfSUQJCQk9IDE5LAorCUlXTF9UTV9BVFRSX01BWAkJCQk9IDIwLAogfTsKIAogLyogdUNvZGUgdHJhY2UgYnVmZmVyICovCkBAIC0yMjEsNiArMjY3LDggQEAKICNkZWZpbmUgVFJBQ0VfQlVGRl9TSVpFX01JTgkweDIwMDAwCiAjZGVmaW5lIFRSQUNFX0JVRkZfU0laRV9ERUYJVFJBQ0VfQlVGRl9TSVpFX01JTgogI2RlZmluZSBUUkFDRV9CVUZGX1BBREQJCTB4MjAwMAotI2RlZmluZSBUUkFDRV9DSFVOS19TSVpFCShQQUdFX1NJWkUgLSAxMDI0KQorCisvKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiBlYWNoIGR1bXAgaXQgcGFja2V0ICovCisjZGVmaW5lIERVTVBfQ0hVTktfU0laRQkJKFBBR0VfU0laRSAtIDEwMjQpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1pbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtaW50LmgKaW5kZXggMmI2NzU2ZS4uNjNhMmViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1pbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLWludC5oCkBAIC0yMzYsNiArMjM2LDcgQEAKIAljb25zdCB1OCAqYWNfdG9fZmlmb1tOVU1fSVdMX1JYT05fQ1RYXTsKIAljb25zdCB1OCAqYWNfdG9fcXVldWVbTlVNX0lXTF9SWE9OX0NUWF07CiAJdTggbWNhc3RfcXVldWVbTlVNX0lXTF9SWE9OX0NUWF07CisJdTggYWdnX3R4cVtJV0xBR05fU1RBVElPTl9DT1VOVF1bSVdMX01BWF9USURfQ09VTlRdOwogCiAJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwogCXVuc2lnbmVkIGxvbmcgdHhxX2N0eF9hY3RpdmVfbXNrOwpAQCAtMjgwLDIwICsyODEsMTYgQEAKIHZvaWQgaXdsX3RyYW5zX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCQkgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCiAJCQkJCSAgIHUxNiBieXRlX2NudCk7Ci12b2lkIGl3bF90cmFuc19wY2llX3R4cV9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cV9pZCk7CiBpbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJCSAgaW50IHRpZCk7CisJCQkJICBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKIHZvaWQgaXdsX3RyYW5zX3NldF93cl9wdHJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkLCB1MzIgaW5kZXgpOwogdm9pZCBpd2xfdHJhbnNfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCQkJICAgICBpbnQgdHhfZmlmb19pZCwgaW50IHNjZF9yZXRyeSk7Ci1pbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2FsbG9jKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsIGludCBzdGFfaWQsCi0JCQkJaW50IHRpZCwgdTE2ICpzc24pOworaW50IGl3bF90cmFuc19wY2llX3R4X2FnZ19hbGxvYyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHN0YV9pZCwgaW50IHRpZCk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4X2FnZ19zZXR1cChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQkgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKLQkJCQkgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0KTsKKwkJCQkgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0LCB1MTYgc3NuKTsKIHZvaWQgaXdsYWduX3R4cV9mcmVlX3RmZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCWludCBpbmRleCwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2Rpcik7CiBpbnQgaXdsX3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQsIGludCBpbmRleCwKQEAgLTM1NCw4ICszNTEsMTMgQEAKIAl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKIH0KIAorc3RhdGljIGlubGluZSB1OCBpd2xfZ2V0X3F1ZXVlX2FjKHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKK3sKKwlyZXR1cm4gdHhxLT5zd3FfaWQgJiAweDM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfd2FrZV9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKKwkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgY29uc3QgY2hhciAqbXNnKQogewogCXU4IHF1ZXVlID0gdHhxLT5zd3FfaWQ7CiAJdTggYWMgPSBxdWV1ZSAmIDM7CkBAIC0zNjMsMTMgKzM2NSwyMiBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApIHsKIAkJCWl3bF93YWtlX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiV2FrZSBod3EgJWQgYWMgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIG1zZyk7CisJCX0gZWxzZSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiRG9uJ3Qgd2FrZSBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQorCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCBjb25zdCBjaGFyICptc2cpCiB7CiAJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKIAl1OCBhYyA9IHF1ZXVlICYgMzsKQEAgLTM3Nyw5ICszODgsMjMgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfaW5jX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaHdxLCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSkgeworCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA+IDApIHsKIAkJCWl3bF9zdG9wX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiU3RvcCBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfSBlbHNlIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJEb24ndCBzdG9wIGh3cSAlZCBhYyAlZCIKKwkJCQkJICAgICIgc3RvcCBjb3VudCAlZC4gJXMiLAorCQkJCQkgICAgaHdxLCBhYywgYXRvbWljX3JlYWQoJnRyYW5zX3BjaWUtPgorCQkJCQkgICAgcXVldWVfc3RvcF9jb3VudFthY10pLCBtc2cpOworCQl9CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgInN0b3AgaHdxICVkLCBidXQgaXQgaXMgc3RvcHBlZC8gJXMiLAorCQkJCSAgICBod3EsIG1zZyk7CisJfQogfQogCiAjaWZkZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYwppbmRleCAzNzRjNjhjLi43OTEwMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1yeC5jCkBAIC01OTQsOCArNTk0LDggQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5lcnJvcl9ldmVudF90YWJsZTsKLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgeworCWJhc2UgPSB0cmFucy0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOworCWlmICh0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgewogCQlpZiAoIWJhc2UpCiAJCQliYXNlID0gcHJpdi0+aW5pdF9lcnJsb2dfcHRyOwogCX0gZWxzZSB7CkBAIC02MDcsNyArNjA3LDcgQEAKIAkJSVdMX0VSUih0cmFucywKIAkJCSJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYIGZvciAlcyB1Q29kZVxuIiwKIAkJCWJhc2UsCi0JCQkocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKKwkJCSh0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKIAkJCQkJPyAiSW5pdCIgOiAiUlQiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTY0OCw2ICs2NDgsMjEgQEAKIAlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaHcgdmVyc2lvblxuIiwgdGFibGUuaHdfdmVyKTsKIAlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgYm9hcmQgdmVyc2lvblxuIiwgdGFibGUuYnJkX3Zlcik7CiAJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGhjbWRcbiIsIHRhYmxlLmhjbWQpOworCisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGlzcjBcbiIsIHRhYmxlLmlzcjApOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCBpc3IxXG4iLCB0YWJsZS5pc3IxKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaXNyMlxuIiwgdGFibGUuaXNyMik7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGlzcjNcbiIsIHRhYmxlLmlzcjMpOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCBpc3I0XG4iLCB0YWJsZS5pc3I0KTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaXNyX3ByZWZcbiIsIHRhYmxlLmlzcl9wcmVmKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgd2FpdF9ldmVudFxuIiwgdGFibGUud2FpdF9ldmVudCk7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGwycF9jb250cm9sXG4iLCB0YWJsZS5sMnBfY29udHJvbCk7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGwycF9kdXJhdGlvblxuIiwgdGFibGUubDJwX2R1cmF0aW9uKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbDJwX21odmFsaWRcbiIsIHRhYmxlLmwycF9taHZhbGlkKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbDJwX2FkZHJfbWF0Y2hcbiIsIHRhYmxlLmwycF9hZGRyX21hdGNoKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbG1wbV9wbWdfc2VsXG4iLCB0YWJsZS5sbXBtX3BtZ19zZWwpOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCB0aW1lc3RhbXBcbiIsIHRhYmxlLnVfdGltZXN0YW1wKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgZmxvd19oYW5kbGVyXG4iLCB0YWJsZS5mbG93X2hhbmRsZXIpOwogfQogCiAvKioKQEAgLTY1Nyw3ICs2NzIsNyBAQAogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHByaXYodHJhbnMpOwogCS8qIFcvQSBmb3IgV2lGaS9XaU1BWCBjb2V4IGFuZCBXaU1BWCBvd24gdGhlIFJGICovCi0JaWYgKHByaXYtPmNmZy0+aW50ZXJuYWxfd2ltYXhfY29leCAmJgorCWlmIChjZmcocHJpdiktPmludGVybmFsX3dpbWF4X2NvZXggJiYKIAkgICAgKCEoaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBBUE1HX0NMS19DVFJMX1JFRykgJgogCQkJQVBNU19DTEtfVkFMX01SQl9GVU5DX01PREUpIHx8CiAJICAgICAoaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBBUE1HX1BTX0NUUkxfUkVHKSAmCkBAIC03MDksOCArNzI0LDggQEAKIAlpZiAobnVtX2V2ZW50cyA9PSAwKQogCQlyZXR1cm4gcG9zOwogCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGU7Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKKwliYXNlID0gdHJhbnMtPnNocmQtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGU7CisJaWYgKHRyYW5zLT5zaHJkLT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKSB7CiAJCWlmICghYmFzZSkKIAkJCWJhc2UgPSBwcml2LT5pbml0X2V2dGxvZ19wdHI7CiAJfSBlbHNlIHsKQEAgLTgyMyw4ICs4MzgsOCBAQAogCXNpemVfdCBidWZzeiA9IDA7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcHJpdih0cmFucyk7CiAKLQliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmxvZ19ldmVudF90YWJsZTsKLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgeworCWJhc2UgPSB0cmFucy0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmxvZ19ldmVudF90YWJsZTsKKwlpZiAodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKIAkJbG9nc2l6ZSA9IHByaXYtPmluaXRfZXZ0bG9nX3NpemU7CiAJCWlmICghYmFzZSkKIAkJCWJhc2UgPSBwcml2LT5pbml0X2V2dGxvZ19wdHI7CkBAIC04MzgsNyArODUzLDcgQEAKIAkJSVdMX0VSUih0cmFucywKIAkJCSJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCiAJCQliYXNlLAotCQkJKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpCisJCQkodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpCiAJCQkJCT8gIkluaXQiIDogIlJUIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTExMDgsNyArMTEyMyw3IEBACiAJCWlzcl9zdGF0cy0+dHgrKzsKIAkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKIAkJLyogV2FrZSB1cCB1Q29kZSBsb2FkIHJvdXRpbmUsIG5vdyB0aGF0IGxvYWQgaXMgY29tcGxldGUgKi8KLQkJcHJpdih0cmFucyktPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKKwkJdHJhbnMtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKIAkJd2FrZV91cCgmdHJhbnMtPnNocmQtPndhaXRfY29tbWFuZF9xdWV1ZSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXR4LmMKaW5kZXggNGEwYzk1My4uYmQyOTU2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS10eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtdHguYwpAQCAtNDA4LDYgKzQwOCw3IEBACiB2b2lkIGl3bF90cmFuc19zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQlpbnQgdHhxX2lkLCB1MzIgaW5kZXgpCiB7CisJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIlEgJWQgIFdyUHRyOiAlZCIsIHR4cV9pZCwgaW5kZXggJiAweGZmKTsKIAlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHRyYW5zKSwgSEJVU19UQVJHX1dSUFRSLAogCQkJKGluZGV4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKIAlpd2xfd3JpdGVfcHJwaChidXModHJhbnMpLCBTQ0RfUVVFVUVfUkRQVFIodHhxX2lkKSwgaW5kZXgpOwpAQCAtNDMwLDcgKzQzMSw3IEBACiAKIAl0eHEtPnNjaGVkX3JldHJ5ID0gc2NkX3JldHJ5OwogCi0JSVdMX0RFQlVHX0lORk8odHJhbnMsICIlcyAlcyBRdWV1ZSAlZCBvbiBGSUZPICVkXG4iLAorCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICIlcyAlcyBRdWV1ZSAlZCBvbiBGSUZPICVkXG4iLAogCQkgICAgICAgYWN0aXZlID8gIkFjdGl2YXRlIiA6ICJEZWFjdGl2YXRlIiwKIAkJICAgICAgIHNjZF9yZXRyeSA/ICJCQSIgOiAiQUMvQ01EIiwgdHhxX2lkLCB0eF9maWZvX2lkKTsKIH0KQEAgLTQ0NiwxNCArNDQ3LDIxIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19hZ2dfdHhxaWRfdmFsaWQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQpCit7CisJaWYgKHR4cV9pZCA8IElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0eHFfaWQgPCAoSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFICsKKwkJaHdfcGFyYW1zKHRyYW5zKS5udW1fYW1wZHVfcXVldWVzKTsKK30KKwogdm9pZCBpd2xfdHJhbnNfcGNpZV90eF9hZ2dfc2V0dXAoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsIGludCBzdGFfaWQsCi0JCQkJIGludCB0aWQsIGludCBmcmFtZV9saW1pdCkKKwkJCQkgaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0LCB1MTYgc3NuKQogewotCWludCB0eF9maWZvLCB0eHFfaWQsIHNzbl9pZHg7CisJaW50IHR4X2ZpZm8sIHR4cV9pZDsKIAl1MTYgcmFfdGlkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7CiAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwpAQCAtNDY5LDExICs0NzcsMTUgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQl0aWRfZGF0YSA9ICZ0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwotCXNzbl9pZHggPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwotCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zLT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCXR4cV9pZCA9IHRyYW5zX3BjaWUtPmFnZ190eHFbc3RhX2lkXVt0aWRdOworCWlmIChXQVJOX09OX09OQ0UoaXNfYWdnX3R4cWlkX3ZhbGlkKHRyYW5zLCB0eHFfaWQpID09IGZhbHNlKSkgeworCQlJV0xfRVJSKHRyYW5zLAorCQkJInF1ZXVlIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVkLCBtdXN0IGJlICVkIHRvICVkXG4iLAorCQkJdHhxX2lkLCBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUsCisJCQlJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgKworCQkJaHdfcGFyYW1zKHRyYW5zKS5udW1fYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybjsKKwl9CiAKIAlyYV90aWQgPSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpOwogCkBAIC00OTMsOSArNTA1LDkgQEAKIAogCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0IHNlcXVlbmNlIG51bWJlci4KIAkgKiBBc3N1bWVzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCWl3bF90cmFuc19zZXRfd3JfcHRycyh0cmFucywgdHhxX2lkLCBzc25faWR4KTsKKwl0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gKHNzbiAmIDB4ZmYpOworCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gKHNzbiAmIDB4ZmYpOworCWl3bF90cmFuc19zZXRfd3JfcHRycyh0cmFucywgdHhxX2lkLCBzc24pOwogCiAJLyogU2V0IHVwIFR4IHdpbmRvdyBzaXplIGFuZCBmcmFtZSBsaW1pdCBmb3IgdGhpcyBxdWV1ZSAqLwogCWl3bF93cml0ZV90YXJnX21lbShidXModHJhbnMpLCB0cmFuc19wY2llLT5zY2RfYmFzZV9hZGRyICsKQEAgLTUzOSwxMiArNTUxLDkgQEAKIH0KIAogaW50IGl3bF90cmFuc19wY2llX3R4X2FnZ19hbGxvYyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQllbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJCWludCB0aWQsIHUxNiAqc3NuKQorCQkJCWludCBzdGFfaWQsIGludCB0aWQpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKLQlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCB0eHFfaWQ7CiAKIAl0eHFfaWQgPSBpd2xhZ25fdHhxX2N0eF9hY3RpdmF0ZV9mcmVlKHRyYW5zKTsKQEAgLTU1MywzNCArNTYyLDMxIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zLT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCXRpZF9kYXRhID0gJnRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07Ci0JKnNzbiA9IFNFUV9UT19TTih0aWRfZGF0YS0+c2VxX251bWJlcik7Ci0JdGlkX2RhdGEtPmFnZy50eHFfaWQgPSB0eHFfaWQ7CisJdHJhbnNfcGNpZS0+YWdnX3R4cVtzdGFfaWRdW3RpZF0gPSB0eHFfaWQ7CiAJaXdsX3NldF9zd3FfaWQoJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLCBnZXRfYWNfZnJvbV90aWQodGlkKSwgdHhxX2lkKTsKIAotCXRpZF9kYXRhID0gJnRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07Ci0JaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJSVdMX0RFQlVHX0hUKHRyYW5zLCAiSFcgcXVldWUgaXMgZW1wdHlcbiIpOwotCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PTjsKLQkJaXdsX3N0YXJ0X3R4X2JhX3RyYW5zX3JlYWR5KHByaXYodHJhbnMpLCBjdHgsIHN0YV9pZCwgdGlkKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSFQodHJhbnMsICJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFciCi0JCQkgICAgICJxdWV1ZVxuIiwgdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUpOwotCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQogCXJldHVybiAwOwogfQogCi12b2lkIGl3bF90cmFuc19wY2llX3R4cV9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cV9pZCkKK2ludCBpd2xfdHJhbnNfcGNpZV90eF9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHN0YV9pZCwgaW50IHRpZCkKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCXU4IHR4cV9pZCA9IHRyYW5zX3BjaWUtPmFnZ190eHFbc3RhX2lkXVt0aWRdOworCisJaWYgKFdBUk5fT05fT05DRShpc19hZ2dfdHhxaWRfdmFsaWQodHJhbnMsIHR4cV9pZCkgPT0gZmFsc2UpKSB7CisJCUlXTF9FUlIodHJhbnMsCisJCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCisJCQl0eHFfaWQsIElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSwKKwkJCUlXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCisJCQlod19wYXJhbXModHJhbnMpLm51bV9hbXBkdV9xdWV1ZXMgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaXdsYWduX3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyKHRyYW5zLCB0eHFfaWQpOwogCiAJaXdsX2NsZWFyX2JpdHNfcHJwaChidXModHJhbnMpLCBTQ0RfQUdHUl9TRUwsICgxIDw8IHR4cV9pZCkpOwogCisJdHJhbnNfcGNpZS0+YWdnX3R4cVtzdGFfaWRdW3RpZF0gPSAwOwogCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAwOwogCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gMDsKIAkvKiBzdXBwb3NlcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLwpAQCAtNTg5LDgxICs1OTUsNiBAQAogCWl3bF9jbGVhcl9iaXRzX3BycGgoYnVzKHRyYW5zKSwgU0NEX0lOVEVSUlVQVF9NQVNLLCAoMSA8PCB0eHFfaWQpKTsKIAlpd2xfdHhxX2N0eF9kZWFjdGl2YXRlKHRyYW5zX3BjaWUsIHR4cV9pZCk7CiAJaXdsX3RyYW5zX3R4X3F1ZXVlX3NldF9zdGF0dXModHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSwgMCwgMCk7Ci19Ci0KLWludCBpd2xfdHJhbnNfcGNpZV90eF9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsIGludCBzdGFfaWQsCi0JCQkJICBpbnQgdGlkKQotewotCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVhZF9wdHIsIHdyaXRlX3B0cjsKLQlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YTsKLQlpbnQgdHhxX2lkOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zLT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JdGlkX2RhdGEgPSAmdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKLQl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKLQotCWlmICgoSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFID4gdHhxX2lkKSB8fAotCSAgICAoSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFICsKLQkJaHdfcGFyYW1zKHRyYW5zKS5udW1fYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKLQkJSVdMX0VSUih0cmFucywKLQkJCSJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKLQkJCXR4cV9pZCwgSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFLAotCQkJSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFICsKLQkJCWh3X3BhcmFtcyh0cmFucykubnVtX2FtcGR1X3F1ZXVlcyAtIDEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoICh0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKgotCQkqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcGVlciBzdG9wcyBhZ2dyZWdhdGlvbgotCQkqIGFnYWluIGJlZm9yZSB3ZSd2ZSBoYWQgYSBjaGFuY2UgdG8gZHJhaW4gdGhlCi0JCSogcXVldWUgd2Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgaS5lLiBiZWZvcmUgdGhlCi0JCSogc2Vzc2lvbiB3YXMgcmVhbGx5IHN0YXJ0ZWQgY29tcGxldGVseS4KLQkJKi8KLQkJSVdMX0RFQlVHX0hUKHRyYW5zLCAiQUdHIHN0b3AgYmVmb3JlIHNldHVwIGRvbmVcbiIpOwotCQlnb3RvIHR1cm5fb2ZmOwotCWNhc2UgSVdMX0FHR19PTjoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJSVdMX1dBUk4odHJhbnMsICJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OICIKLQkJCSAib3Igc3RhcnRpbmcgZm9yICVkIG9uICVkICglZClcbiIsIHN0YV9pZCwgdGlkLAotCQkJIHRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnMtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXdyaXRlX3B0ciA9IHRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyOwotCXJlYWRfcHRyID0gdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0cjsKLQotCS8qIFRoZSBxdWV1ZSBpcyBub3QgZW1wdHkgKi8KLQlpZiAod3JpdGVfcHRyICE9IHJlYWRfcHRyKSB7Ci0JCUlXTF9ERUJVR19IVCh0cmFucywgIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7Ci0JCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlID0KLQkJCUlXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnMtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19IVCh0cmFucywgIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKLXR1cm5fb2ZmOgotCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0KLQkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KLQlzcGluX3VubG9jaygmdHJhbnMtPnNocmQtPnN0YV9sb2NrKTsKLQlzcGluX2xvY2soJnRyYW5zLT5zaHJkLT5sb2NrKTsKLQotCWl3bF90cmFuc19wY2llX3R4cV9hZ2dfZGlzYWJsZSh0cmFucywgdHhxX2lkKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zLT5zaHJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpd2xfc3RvcF90eF9iYV90cmFuc19yZWFkeShwcml2KHRyYW5zKSwgY3R4LCBzdGFfaWQsIHRpZCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTgyLDcgKzkxMyw4IEBACiAKIAlyZXQgPSBpd2xfZW5xdWV1ZV9oY21kKHRyYW5zLCBjbWQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCUlXTF9FUlIodHJhbnMsICJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKKwkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTCh0cmFucywKKwkJCSJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKIAkJCSAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTAwMCw2ICs5MzIsMjAgQEAKIAlJV0xfREVCVUdfSU5GTyh0cmFucywgIkF0dGVtcHRpbmcgdG8gc2VuZCBzeW5jIGNvbW1hbmQgJXNcbiIsCiAJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CiAKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnRyYW5zLT5zaHJkLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVCVVNZOworCisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkgeworCQlJV0xfRVJSKHRyYW5zLCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKKwkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldHVybiAtRUNBTkNFTEVEOworCX0KKwlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmdHJhbnMtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX0VSUih0cmFucywgIkNvbW1hbmQgJXMgZmFpbGVkOiBGVyBFcnJvclxuIiwKKwkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldHVybiAtRUlPOworCX0KIAlzZXRfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpOwogCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiU2V0dGluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKIAkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKQEAgLTEwMDgsNyArOTU0LDggQEAKIAlpZiAoY21kX2lkeCA8IDApIHsKIAkJcmV0ID0gY21kX2lkeDsKIAkJY2xlYXJfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpOwotCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCisJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwodHJhbnMsCisJCQkiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCiAJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTEwMjIsMTIgKzk2OSwxMiBAQAogCQkJCSZ0cmFuc19wY2llLT50eHFbdHJhbnMtPnNocmQtPmNtZF9xdWV1ZV07CiAJCQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKIAotCQkJSVdMX0VSUih0cmFucywKKwkJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwodHJhbnMsCiAJCQkJIkVycm9yIHNlbmRpbmcgJXM6IHRpbWUgb3V0IGFmdGVyICVkbXMuXG4iLAogCQkJCWdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLAogCQkJCWppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7CiAKLQkJCUlXTF9FUlIodHJhbnMsCisJCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHRyYW5zLAogCQkJCSJDdXJyZW50IENNRCBxdWV1ZSByZWFkX3B0ciAlZCB3cml0ZV9wdHIgJWRcbiIsCiAJCQkJcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0cik7CiAKQEAgLTEwMzksMTggKzk4Niw2IEBACiAJCX0KIAl9CiAKLQlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHRyYW5zLCAiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKLQkJCSAgICAgICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FQ0FOQ0VMRUQ7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpKSB7Ci0JCUlXTF9FUlIodHJhbnMsICJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCi0JCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQogCWlmICgoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgJiYgIWNtZC0+cmVwbHlfcGFnZSkgewogCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3I6IFJlc3BvbnNlIE5VTEwgaW4gJyVzJ1xuIiwKIAkJCSAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwpAQCAtMTA3MSw3ICsxMDA2LDcgQEAKIAkJdHJhbnNfcGNpZS0+dHhxW3RyYW5zLT5zaHJkLT5jbWRfcXVldWVdLm1ldGFbY21kX2lkeF0uZmxhZ3MgJj0KIAkJCQkJCQl+Q01EX1dBTlRfU0tCOwogCX0KLWZhaWw6CisKIAlpZiAoY21kLT5yZXBseV9wYWdlKSB7CiAJCWl3bF9mcmVlX3BhZ2VzKHRyYW5zLT5zaHJkLCBjbWQtPnJlcGx5X3BhZ2UpOwogCQljbWQtPnJlcGx5X3BhZ2UgPSAwOwpAQCAtMTExNSw5ICsxMDUwLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAicmVjbGFpbTogWyVkLCAlZCwgJWRdXG4iLCB0eHFfaWQsCi0JCQkgICBxLT5yZWFkX3B0ciwgaW5kZXgpOwotCiAJaWYgKFdBUk5fT04oIXNrYl9xdWV1ZV9lbXB0eShza2JzKSkpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLmMKaW5kZXggZGEzNDExMC4uNDA5ZmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUuYwpAQCAtOTkwLDI5ICs5OTAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaXdsX3RyYW5zX3BjaWVfZGlzYWJsZV9zeW5jX2lycShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3N0b3BfZGV2aWNlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0KLQkJSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCisJLyogdGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zLT5zaHJkLT5sb2NrLCBmbGFncyk7CiAJaXdsX2Rpc2FibGVfaW50ZXJydXB0cyh0cmFucyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnMtPnNocmQtPmxvY2ssIGZsYWdzKTsKIAotCS8qIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGZsdXNoIHBlbmRpbmcgdGFza2xldCovCi0Jc3luY2hyb25pemVfaXJxKGJ1cyh0cmFucyktPmlycSk7Ci0JdGFza2xldF9raWxsKCZ0cmFuc19wY2llLT5pcnFfdGFza2xldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3N0b3BfZGV2aWNlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQotewotCS8qIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KLQlpd2xfd3JpdGUzMihidXModHJhbnMpLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKLQotCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCWl3bF90cmFuc19wY2llX2Rpc2FibGVfc3luY19pcnEodHJhbnMpOwotCiAJLyogZGV2aWNlIGdvaW5nIGRvd24sIFN0b3AgdXNpbmcgSUNUIHRhYmxlICovCiAJaXdsX2Rpc2FibGVfaWN0KHRyYW5zKTsKIApAQCAtMTAzOSwxMSArMTAyNiwyNSBAQAogCiAJLyogU3RvcCB0aGUgZGV2aWNlLCBhbmQgcHV0IGl0IGluIGxvdyBwb3dlciBzdGF0ZSAqLwogCWl3bF9hcG1fc3RvcChwcml2KHRyYW5zKSk7CisKKwkvKiBVcG9uIHN0b3AsIHRoZSBBUE0gaXNzdWVzIGFuIGludGVycnVwdCBpZiBIVyBSRiBraWxsIGlzIHNldC4KKwkgKiBDbGVhbiBhZ2FpbiB0aGUgaW50ZXJydXB0IGhlcmUKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnMtPnNocmQtPmxvY2ssIGZsYWdzKTsKKwlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHRyYW5zKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB0byBtYWtlIHN1cmUgd2UgZmx1c2ggcGVuZGluZyB0YXNrbGV0Ki8KKwlzeW5jaHJvbml6ZV9pcnEoYnVzKHRyYW5zKS0+aXJxKTsKKwl0YXNrbGV0X2tpbGwoJnRyYW5zX3BjaWUtPmlycV90YXNrbGV0KTsKKworCS8qIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KKwlpd2xfd3JpdGUzMihidXModHJhbnMpLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKIH0KIAogc3RhdGljIGludCBpd2xfdHJhbnNfcGNpZV90eChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJc3RydWN0IGl3bF9kZXZpY2VfY21kICpkZXZfY21kLCBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAotCQl1OCBzdGFfaWQpCisJCXU4IHN0YV9pZCwgdTggdGlkKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKQEAgLTEwNTcsMTMgKzEwNTgsMTIgQEAKIAlkbWFfYWRkcl90IHR4Y21kX3BoeXM7CiAJZG1hX2FkZHJfdCBzY3JhdGNoX3BoeXM7CiAJdTE2IGxlbiwgZmlyc3RsZW4sIHNlY29uZGxlbjsKLQl1MTYgc2VxX251bWJlciA9IDA7CiAJdTggd2FpdF93cml0ZV9wdHIgPSAwOwogCXU4IHR4cV9pZDsKLQl1OCB0aWQgPSAwOwogCWJvb2wgaXNfYWdnID0gZmFsc2U7CiAJX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCXU4IGhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjKTsKKwl1MTYgX19tYXliZV91bnVzZWQgd2lmaV9zZXE7CiAKIAkvKgogCSAqIFNlbmQgdGhpcyBmcmFtZSBhZnRlciBEVElNIC0tIHRoZXJlJ3MgYSBzcGVjaWFsIHF1ZXVlCkBAIC0xMDg0LDM2ICsxMDg0LDI4IEBACiAJCXR4cV9pZCA9CiAJCSAgICB0cmFuc19wY2llLT5hY190b19xdWV1ZVtjdHhdW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKIAotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpICYmICFpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkgewotCQl1OCAqcWMgPSBOVUxMOwotCQlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YTsKLQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJdGlkX2RhdGEgPSAmdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKLQotCQlpZiAoV0FSTl9PTl9PTkNFKHRpZCA+PSBJV0xfTUFYX1RJRF9DT1VOVCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJc2VxX251bWJlciA9IHRpZF9kYXRhLT5zZXFfbnVtYmVyOwotCQlzZXFfbnVtYmVyICY9IElFRUU4MDIxMV9TQ1RMX1NFUTsKLQkJaGRyLT5zZXFfY3RybCA9IGhkci0+c2VxX2N0cmwgJgotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOwotCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNlcV9udW1iZXIpOwotCQlzZXFfbnVtYmVyICs9IDB4MTA7Ci0JCS8qIGFnZ3JlZ2F0aW9uIGlzIG9uIGZvciB0aGlzIDxzdGEsdGlkPiAqLwotCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7Ci0JCQlXQVJOX09OX09OQ0UodGlkX2RhdGEtPmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09OKTsKLQkJCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOwotCQkJaXNfYWdnID0gdHJ1ZTsKLQkJfQorCS8qIGFnZ3JlZ2F0aW9uIGlzIG9uIGZvciB0aGlzIDxzdGEsdGlkPiAqLworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKKwkJV0FSTl9PTih0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpOworCQl0eHFfaWQgPSB0cmFuc19wY2llLT5hZ2dfdHhxW3N0YV9pZF1bdGlkXTsKKwkJaXNfYWdnID0gdHJ1ZTsKIAl9CiAKLQkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwotCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJfbGVuKTsKLQogCXR4cSA9ICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXTsKIAlxID0gJnR4cS0+cTsKIAorCS8qIEluIEFHRyBtb2RlLCB0aGUgaW5kZXggaW4gdGhlIHJpbmcgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBXaUZpCisJICogc2VxdWVuY2UgbnVtYmVyLiBUaGlzIGlzIGEgSFcgcmVxdWlyZW1lbnRzIHRvIGhlbHAgdGhlIFNDRCB0byBwYXJzZQorCSAqIHRoZSBCQS4KKwkgKiBDaGVjayBoZXJlIHRoYXQgdGhlIHBhY2tldHMgYXJlIGluIHRoZSByaWdodCBwbGFjZSBvbiB0aGUgcmluZy4KKwkgKi8KKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVRworCXdpZmlfc2VxID0gU0VRX1RPX1NOKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpKTsKKwlXQVJOX09OQ0UoaXNfYWdnICYmICgod2lmaV9zZXEgJiAweGZmKSAhPSBxLT53cml0ZV9wdHIpLAorCQkgICJROiAlZCBXaUZpIFNlcSAlZCB0ZmROdW0gJWQiLAorCQkgIHR4cV9pZCwgd2lmaV9zZXEsIHEtPndyaXRlX3B0cik7CisjZW5kaWYKKwogCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KIAl0eHEtPnNrYnNbcS0+d3JpdGVfcHRyXSA9IHNrYjsKIAl0eHEtPmNtZFtxLT53cml0ZV9wdHJdID0gZGV2X2NtZDsKQEAgLTEyMTMsMTMgKzEyMDUsNiBAQAogCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOwogCWl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cih0cmFucywgdHhxKTsKIAotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpICYmICFpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkgewotCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLnRmZHNfaW5fcXVldWUrKzsKLQkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLnNlcV9udW1iZXIgPQotCQkJCXNlcV9udW1iZXI7Ci0JfQotCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQogCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKQEAgLTEyMzEsNyArMTIxNiw3IEBACiAJCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKIAkJCWl3bF90eHFfdXBkYXRlX3dyaXRlX3B0cih0cmFucywgdHhxKTsKIAkJfSBlbHNlIHsKLQkJCWl3bF9zdG9wX3F1ZXVlKHRyYW5zLCB0eHEpOworCQkJaXdsX3N0b3BfcXVldWUodHJhbnMsIHR4cSwgIlF1ZXVlIGlzIGZ1bGwiKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTEyNjgsMTAxICsxMjUzLDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXdsYWduX3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCSAgIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCkKLXsKLQlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0ucTsKLQlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YSA9ICZ0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmdHJhbnMtPnNocmQtPnN0YV9sb2NrKTsKLQotCXN3aXRjaCAodHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUpIHsKLQljYXNlIElXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQToKLQkJLyogV2UgYXJlIHJlY2xhaW1pbmcgdGhlIGxhc3QgcGFja2V0IG9mIHRoZSAqLwotCQkvKiBhZ2dyZWdhdGVkIEhXIHF1ZXVlICovCi0JCWlmICgodHhxX2lkICA9PSB0aWRfZGF0YS0+YWdnLnR4cV9pZCkgJiYKLQkJICAgIChxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpKSB7Ci0JCQlJV0xfREVCVUdfSFQodHJhbnMsCi0JCQkJIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBERUxCQSBmbG93XG4iKTsKLQkJCWl3bF90cmFuc19wY2llX3R4cV9hZ2dfZGlzYWJsZSh0cmFucywgdHhxX2lkKTsKLQkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09GRjsKLQkJCWl3bF9zdG9wX3R4X2JhX3RyYW5zX3JlYWR5KHByaXYodHJhbnMpLAotCQkJCQkJICAgTlVNX0lXTF9SWE9OX0NUWCwKLQkJCQkJCSAgIHN0YV9pZCwgdGlkKTsKLQkJCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlICovCi0JCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCQlJV0xfREVCVUdfSFQodHJhbnMsCi0JCQkJIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBBRERCQSBmbG93XG4iKTsKLQkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwotCQkJaXdsX3N0YXJ0X3R4X2JhX3RyYW5zX3JlYWR5KHByaXYodHJhbnMpLAotCQkJCQkJICAgIE5VTV9JV0xfUlhPTl9DVFgsCi0JCQkJCQkgICAgc3RhX2lkLCB0aWQpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xfZnJlZV90ZmRzX2luX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJICAgIGludCBzdGFfaWQsIGludCB0aWQsIGludCBmcmVlZCkKLXsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2spOwotCi0JaWYgKHRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0udGZkc19pbl9xdWV1ZSA+PSBmcmVlZCkKLQkJdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS50ZmRzX2luX3F1ZXVlIC09IGZyZWVkOwotCWVsc2UgewotCQlJV0xfREVCVUdfVFgodHJhbnMsICJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCi0JCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLnRmZHNfaW5fcXVldWUsCi0JCQlmcmVlZCk7Ci0JCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0udGZkc19pbl9xdWV1ZSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2xfdHJhbnNfcGNpZV9yZWNsYWltKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorc3RhdGljIGludCBpd2xfdHJhbnNfcGNpZV9yZWNsYWltKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAogCQkgICAgICBpbnQgdHhxX2lkLCBpbnQgc3NuLCB1MzIgc3RhdHVzLAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JzKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdOwotCWVudW0gaXdsX2FnZ19zdGF0ZSBhZ2dfc3RhdGU7CiAJLyogbl9iZCBpcyB1c3VhbGx5IDI1NiA9PiBuX2JkIC0gMSA9IDB4ZmYgKi8KIAlpbnQgdGZkX251bSA9IHNzbiAmICh0eHEtPnEubl9iZCAtIDEpOwogCWludCBmcmVlZCA9IDA7Ci0JYm9vbCBjb25kOwogCiAJdHhxLT50aW1lX3N0YW1wID0gamlmZmllczsKIAotCWlmICh0eHEtPnNjaGVkX3JldHJ5KSB7Ci0JCWFnZ19zdGF0ZSA9Ci0JCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbdHhxLT5zdGFfaWRdW3R4cS0+dGlkXS5hZ2cuc3RhdGU7Ci0JCWNvbmQgPSAoYWdnX3N0YXRlICE9IElXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQSk7Ci0JfSBlbHNlIHsKLQkJY29uZCA9IChzdGF0dXMgIT0gVFhfU1RBVFVTX0ZBSUxfUEFTU0lWRV9OT19SWCk7CisJaWYgKHVubGlrZWx5KHR4cV9pZCA+PSBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgJiYKKwkJICAgICB0eHFfaWQgIT0gdHJhbnNfcGNpZS0+YWdnX3R4cVtzdGFfaWRdW3RpZF0pKSB7CisJCS8qCisJCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAorCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdy4KKwkJICogU2luY2UgaXQgaXMgY2FuIHBvc3NpYmx5IGhhcHBlbiB2ZXJ5IG9mdGVuIGFuZCBpbiBvcmRlcgorCQkgKiBub3QgdG8gZmlsbCB0aGUgc3lzbG9nLCBkb24ndCB1c2UgSVdMX0VSUiBvciBJV0xfV0FSTgorCQkgKi8KKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIkJhZCBxdWV1ZSBtYXBwaW5nIHR4cV9pZCAlZCwgIgorCQkJImFnZ190eHFbc3RhX2lkW3RpZF0gJWQiLCB0eHFfaWQsCisJCQl0cmFuc19wY2llLT5hZ2dfdHhxW3N0YV9pZF1bdGlkXSk7CisJCXJldHVybiAxOwogCX0KIAogCWlmICh0eHEtPnEucmVhZF9wdHIgIT0gdGZkX251bSkgewotCQlJV0xfREVCVUdfVFhfUkVQTFkodHJhbnMsICJSZXRyeSBzY2hlZHVsZXIgcmVjbGFpbSAiCi0JCQkJInNjZF9zc249JWQgaWR4PSVkIHR4cT0lZCBzd3E9JWRcbiIsCi0JCQkJc3NuICwgdGZkX251bSwgdHhxX2lkLCB0eHEtPnN3cV9pZCk7CisJCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIltRICVkIHwgQUMgJWRdICVkIC0+ICVkICglZClcbiIsCisJCQkJdHhxX2lkLCBpd2xfZ2V0X3F1ZXVlX2FjKHR4cSksIHR4cS0+cS5yZWFkX3B0ciwKKwkJCQl0ZmRfbnVtLCBzc24pOwogCQlmcmVlZCA9IGl3bF90eF9xdWV1ZV9yZWNsYWltKHRyYW5zLCB0eHFfaWQsIHRmZF9udW0sIHNrYnMpOwotCQlpZiAoaXdsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmIGNvbmQpCi0JCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgdHhxKTsKKwkJaWYgKGl3bF9xdWV1ZV9zcGFjZSgmdHhxLT5xKSA+IHR4cS0+cS5sb3dfbWFyayAmJgorCQkgICAoIXR4cS0+c2NoZWRfcmV0cnkgfHwKKwkJICAgc3RhdHVzICE9IFRYX1NUQVRVU19GQUlMX1BBU1NJVkVfTk9fUlgpKQorCQkJaXdsX3dha2VfcXVldWUodHJhbnMsIHR4cSwgIlBhY2tldHMgcmVjbGFpbWVkIik7CiAJfQotCi0JaXdsX2ZyZWVfdGZkc19pbl9xdWV1ZSh0cmFucywgc3RhX2lkLCB0aWQsIGZyZWVkKTsKLQlpd2xhZ25fdHhxX2NoZWNrX2VtcHR5KHRyYW5zLCBzdGFfaWQsIHRpZCwgdHhxX2lkKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaXdsX3RyYW5zX3BjaWVfZnJlZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKKwlpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHRyYW5zKTsKIAlpd2xfdHJhbnNfcGNpZV90eF9mcmVlKHRyYW5zKTsKIAlpd2xfdHJhbnNfcGNpZV9yeF9mcmVlKHRyYW5zKTsKIAlmcmVlX2lycShidXModHJhbnMpLT5pcnEsIHRyYW5zKTsKQEAgLTE0MTgsNyArMTM1MCw4IEBACiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKIHN0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3dha2VfYW55X3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgpCisJCQkJCSAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKKwkJCQkJICBjb25zdCBjaGFyICptc2cpCiB7CiAJdTggYWMsIHR4cV9pZDsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQpAQCAtMTQyNiwxMSArMTM1OSwxMSBAQAogCiAJZm9yIChhYyA9IDA7IGFjIDwgQUNfTlVNOyBhYysrKSB7CiAJCXR4cV9pZCA9IHRyYW5zX3BjaWUtPmFjX3RvX3F1ZXVlW2N0eF1bYWNdOwotCQlJV0xfREVCVUdfSU5GTyh0cmFucywgIlF1ZXVlIFN0YXR1czogUVslZF0gJXNcbiIsCisJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJRdWV1ZSBTdGF0dXM6IFFbJWRdICVzXG4iLAogCQkJYWMsCiAJCQkoYXRvbWljX3JlYWQoJnRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA+IDApCiAJCQkgICAgICA/ICJzdG9wcGVkIiA6ICJhd2FrZSIpOwotCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdKTsKKwkJaXdsX3dha2VfcXVldWUodHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSwgbXNnKTsKIAl9CiB9CiAKQEAgLTE0NTMsMTEgKzEzODYsMTIgQEAKIAlyZXR1cm4gaXdsX3RyYW5zOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfdHJhbnNfcGNpZV9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkKQorc3RhdGljIHZvaWQgaXdsX3RyYW5zX3BjaWVfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cV9pZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICptc2cpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAotCWl3bF9zdG9wX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0pOworCWl3bF9zdG9wX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0sIG1zZyk7CiB9CiAKICNkZWZpbmUgSVdMX0ZMVVNIX1dBSVRfTVMJMjAwMApAQCAtMTUxMiw4ICsxNDQ2LDEyIEBACiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJSVdMX0VSUih0cmFucywgIlF1ZXVlICVkIHN0dWNrIGZvciAldSBtcy5cbiIsIHEtPmlkLAogCQkJaHdfcGFyYW1zKHRyYW5zKS53ZF90aW1lb3V0KTsKLQkJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAorCQlJV0xfRVJSKHRyYW5zLCAiQ3VycmVudCBTVyByZWFkX3B0ciAlZCB3cml0ZV9wdHIgJWRcbiIsCiAJCQlxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKKwkJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgSFcgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAorCQkJaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBTQ0RfUVVFVUVfUkRQVFIoY250KSkKKwkJCQkmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSwKKwkJCWl3bF9yZWFkX3BycGgoYnVzKHRyYW5zKSwgU0NEX1FVRVVFX1dSUFRSKGNudCkpKTsKIAkJcmV0dXJuIDE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaAppbmRleCBjNTkyMzEyLi5lNmJmM2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmgKQEAgLTE3MSwzMiArMTcxLDMxIEBACiAJdm9pZCAoKnR4X3N0YXJ0KShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CiAKIAl2b2lkICgqd2FrZV9hbnlfcXVldWUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJICAgICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgpOworCQkJICAgICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCisJCQkgICAgICAgY29uc3QgY2hhciAqbXNnKTsKIAogCWludCAoKnNlbmRfY21kKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKTsKIAogCWludCAoKnR4KShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJc3RydWN0IGl3bF9kZXZpY2VfY21kICpkZXZfY21kLCBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAotCQl1OCBzdGFfaWQpOwotCXZvaWQgKCpyZWNsYWltKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHN0YV9pZCwgaW50IHRpZCwKKwkJdTggc3RhX2lkLCB1OCB0aWQpOworCWludCAoKnJlY2xhaW0pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAogCQkJaW50IHR4cV9pZCwgaW50IHNzbiwgdTMyIHN0YXR1cywKIAkJCXN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpOwogCiAJaW50ICgqdHhfYWdnX2Rpc2FibGUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJICAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwgaW50IHN0YV9pZCwKLQkJCSAgICAgIGludCB0aWQpOworCQkJICAgICAgaW50IHN0YV9pZCwgaW50IHRpZCk7CiAJaW50ICgqdHhfYWdnX2FsbG9jKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCSAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLCBpbnQgdGlkLAotCQkJICAgIHUxNiAqc3NuKTsKKwkJCSAgICBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKIAl2b2lkICgqdHhfYWdnX3NldHVwKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCSAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwgaW50IHN0YV9pZCwgaW50IHRpZCwKLQkJCSAgICAgaW50IGZyYW1lX2xpbWl0KTsKKwkJCSAgICAgaW50IGZyYW1lX2xpbWl0LCB1MTYgc3NuKTsKIAogCXZvaWQgKCpraWNrX25pYykoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOwogCiAJdm9pZCAoKmZyZWUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAotCXZvaWQgKCpzdG9wX3F1ZXVlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHEpOworCXZvaWQgKCpzdG9wX3F1ZXVlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHEsIGNvbnN0IGNoYXIgKm1zZyk7CiAKIAlpbnQgKCpkYmdmc19yZWdpc3Rlcikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBkZW50cnkqIGRpcik7CiAJaW50ICgqY2hlY2tfc3R1Y2tfcXVldWUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgcSk7CkBAIC0yMDcsMTcgKzIwNiw1NCBAQAogI2VuZGlmCiB9OwogCisvKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCitzdHJ1Y3QgZndfZGVzYyB7CisJZG1hX2FkZHJfdCBwX2FkZHI7CS8qIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwl2b2lkICp2X2FkZHI7CQkvKiBzb2Z0d2FyZSBhZGRyZXNzICovCisJdTMyIGxlbjsJCS8qIHNpemUgaW4gYnl0ZXMgKi8KK307CisKK3N0cnVjdCBmd19pbWcgeworCXN0cnVjdCBmd19kZXNjIGNvZGU7CS8qIGZpcm13YXJlIGNvZGUgaW1hZ2UgKi8KKwlzdHJ1Y3QgZndfZGVzYyBkYXRhOwkvKiBmaXJtd2FyZSBkYXRhIGltYWdlICovCit9OworCisvKiBPcGFxdWUgY2FsaWJyYXRpb24gcmVzdWx0cyAqLworc3RydWN0IGl3bF9jYWxpYl9yZXN1bHQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzaXplX3QgY21kX2xlbjsKKwlzdHJ1Y3QgaXdsX2NhbGliX2hkciBoZHI7CisJLyogZGF0YSBmb2xsb3dzICovCit9OworCiAvKioKICAqIHN0cnVjdCBpd2xfdHJhbnMgLSB0cmFuc3BvcnQgY29tbW9uIGRhdGEKICAqIEBvcHMgLSBwb2ludGVyIHRvIGl3bF90cmFuc19vcHMKICAqIEBzaHJkIC0gcG9pbnRlciB0byBpd2xfc2hhcmVkIHdoaWNoIGhvbGRzIHNoYXJlZCBkYXRhIGZyb20gdGhlIHVwcGVyIGxheWVyCiAgKiBAaGNtZF9sb2NrOiBwcm90ZWN0cyBIQ01ECisgKiBAdWNvZGVfd3JpdGVfY29tcGxldGU6IGluZGljYXRlcyB0aGF0IHRoZSB1Y29kZSBoYXMgYmVlbiBjb3BpZWQuCisgKiBAdWNvZGVfcnQ6IHJ1biB0aW1lIHVjb2RlIGltYWdlCisgKiBAdWNvZGVfaW5pdDogaW5pdCB1Y29kZSBpbWFnZQorICogQHVjb2RlX3dvd2xhbjogd2FrZSBvbiB3aXJlbGVzcyB1Y29kZSBpbWFnZSAob3B0aW9uYWwpCisgKiBAbnZtX2RldmljZV90eXBlOiBpbmRpY2F0ZXMgT1RQIG9yIGVlcHJvbQorICogQGNhbGliX3Jlc3VsdHM6IGxpc3QgaGVhZCBmb3IgaW5pdCBjYWxpYnJhdGlvbiByZXN1bHRzCiAgKi8KIHN0cnVjdCBpd2xfdHJhbnMgewogCWNvbnN0IHN0cnVjdCBpd2xfdHJhbnNfb3BzICpvcHM7CiAJc3RydWN0IGl3bF9zaGFyZWQgKnNocmQ7CiAJc3BpbmxvY2tfdCBoY21kX2xvY2s7CiAKKwl1OCB1Y29kZV93cml0ZV9jb21wbGV0ZTsJLyogdGhlIGltYWdlIHdyaXRlIGlzIGNvbXBsZXRlICovCisJc3RydWN0IGZ3X2ltZyB1Y29kZV9ydDsKKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX2luaXQ7CisJc3RydWN0IGZ3X2ltZyB1Y29kZV93b3dsYW47CisKKwkvKiBlZXByb20gcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwlpbnQgICAgbnZtX2RldmljZV90eXBlOworCisJLyogaW5pdCBjYWxpYnJhdGlvbiByZXN1bHRzICovCisJc3RydWN0IGxpc3RfaGVhZCBjYWxpYl9yZXN1bHRzOworCiAJLyogcG9pbnRlciB0byB0cmFucyBzcGVjaWZpYyBzdHJ1Y3QgKi8KIAkvKkVuc3VyZSB0aGF0IHRoaXMgcG9pbnRlciB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkIHRvIHNpemVvZiBwb2ludGVyICovCiAJY2hhciB0cmFuc19zcGVjaWZpY1swXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2Yodm9pZCAqKSkpKTsKQEAgLTI0OSw5ICsyODUsMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc193YWtlX2FueV9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgpCisJCQkJCSAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAorCQkJCQkgICAgY29uc3QgY2hhciAqbXNnKQogewotCXRyYW5zLT5vcHMtPndha2VfYW55X3F1ZXVlKHRyYW5zLCBjdHgpOworCXRyYW5zLT5vcHMtPndha2VfYW55X3F1ZXVlKHRyYW5zLCBjdHgsIG1zZyk7CiB9CiAKIApAQCAtMjY2LDM5ICszMDMsMzggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3R4KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmRldl9jbWQsIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCXU4IHN0YV9pZCkKKwkJdTggc3RhX2lkLCB1OCB0aWQpCiB7Ci0JcmV0dXJuIHRyYW5zLT5vcHMtPnR4KHRyYW5zLCBza2IsIGRldl9jbWQsIGN0eCwgc3RhX2lkKTsKKwlyZXR1cm4gdHJhbnMtPm9wcy0+dHgodHJhbnMsIHNrYiwgZGV2X2NtZCwgY3R4LCBzdGFfaWQsIHRpZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHJhbnNfcmVjbGFpbShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHN0YV9pZCwKK3N0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc19yZWNsYWltKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLAogCQkJCSBpbnQgdGlkLCBpbnQgdHhxX2lkLCBpbnQgc3NuLCB1MzIgc3RhdHVzLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JzKQogewotCXRyYW5zLT5vcHMtPnJlY2xhaW0odHJhbnMsIHN0YV9pZCwgdGlkLCB0eHFfaWQsIHNzbiwgc3RhdHVzLCBza2JzKTsKKwlyZXR1cm4gdHJhbnMtPm9wcy0+cmVjbGFpbSh0cmFucywgc3RhX2lkLCB0aWQsIHR4cV9pZCwgc3NuLAorCQkJCSAgIHN0YXR1cywgc2ticyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc190eF9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCiAJCQkJCSAgICBpbnQgc3RhX2lkLCBpbnQgdGlkKQogewotCXJldHVybiB0cmFucy0+b3BzLT50eF9hZ2dfZGlzYWJsZSh0cmFucywgY3R4LCBzdGFfaWQsIHRpZCk7CisJcmV0dXJuIHRyYW5zLT5vcHMtPnR4X2FnZ19kaXNhYmxlKHRyYW5zLCBzdGFfaWQsIHRpZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc190eF9hZ2dfYWxsb2Moc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJCSBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAotCQkJCQkgaW50IHN0YV9pZCwgaW50IHRpZCwgdTE2ICpzc24pCisJCQkJCSBpbnQgc3RhX2lkLCBpbnQgdGlkKQogewotCXJldHVybiB0cmFucy0+b3BzLT50eF9hZ2dfYWxsb2ModHJhbnMsIGN0eCwgc3RhX2lkLCB0aWQsIHNzbik7CisJcmV0dXJuIHRyYW5zLT5vcHMtPnR4X2FnZ19hbGxvYyh0cmFucywgc3RhX2lkLCB0aWQpOwogfQogCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHJhbnNfdHhfYWdnX3NldHVwKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCQkgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAogCQkJCQkgICBpbnQgc3RhX2lkLCBpbnQgdGlkLAotCQkJCQkgICBpbnQgZnJhbWVfbGltaXQpCisJCQkJCSAgIGludCBmcmFtZV9saW1pdCwgdTE2IHNzbikKIHsKLQl0cmFucy0+b3BzLT50eF9hZ2dfc2V0dXAodHJhbnMsIGN0eCwgc3RhX2lkLCB0aWQsIGZyYW1lX2xpbWl0KTsKKwl0cmFucy0+b3BzLT50eF9hZ2dfc2V0dXAodHJhbnMsIGN0eCwgc3RhX2lkLCB0aWQsIGZyYW1lX2xpbWl0LCBzc24pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX2tpY2tfbmljKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMzExLDkgKzM0NywxMCBAQAogCXRyYW5zLT5vcHMtPmZyZWUodHJhbnMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3N0b3BfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxKQorc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc19zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgcSwKKwkJCQkJY29uc3QgY2hhciAqbXNnKQogewotCXRyYW5zLT5vcHMtPnN0b3BfcXVldWUodHJhbnMsIHEpOworCXRyYW5zLT5vcHMtPnN0b3BfcXVldWUodHJhbnMsIHEsIG1zZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMzQ4LDQgKzM4NSwxMyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfdHJhbnNfb3BzIHRyYW5zX29wc19wY2llOwogCitpbnQgaXdsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IGl3bF9idXMgKmJ1cywgc3RydWN0IGZ3X2Rlc2MgKmRlc2MsCisJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOwordm9pZCBpd2xfZGVhbGxvY191Y29kZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CisKK2ludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKK2ludCBpd2xfY2FsaWJfc2V0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkgIGNvbnN0IHN0cnVjdCBpd2xfY2FsaWJfaGRyICpjbWQsIGludCBsZW4pOwordm9pZCBpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKKwogI2VuZGlmIC8qIF9faXdsX3RyYW5zX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMWI1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXVjb2RlLmMKQEAgLTAsMCArMSw3NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgIml3bC13aWZpLmgiCisjaW5jbHVkZSAiaXdsLWRldi5oIgorI2luY2x1ZGUgIml3bC1jb3JlLmgiCisjaW5jbHVkZSAiaXdsLWlvLmgiCisjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCisjaW5jbHVkZSAiaXdsLWZoLmgiCisKK3N0YXRpYyBzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfZXZlbnRfZW50cnkgY3VfcHJpb3JpdGllc1tDT0VYX05VTV9PRl9FVkVOVFNdID0geworCXtDT0VYX0NVX1VOQVNTT0NfSURMRV9SUCwgQ09FWF9DVV9VTkFTU09DX0lETEVfV1AsCisJIDAsIENPRVhfVU5BU1NPQ19JRExFX0ZMQUdTfSwKKwl7Q09FWF9DVV9VTkFTU09DX01BTlVBTF9TQ0FOX1JQLCBDT0VYX0NVX1VOQVNTT0NfTUFOVUFMX1NDQU5fV1AsCisJIDAsIENPRVhfVU5BU1NPQ19NQU5VQUxfU0NBTl9GTEFHU30sCisJe0NPRVhfQ1VfVU5BU1NPQ19BVVRPX1NDQU5fUlAsIENPRVhfQ1VfVU5BU1NPQ19BVVRPX1NDQU5fV1AsCisJIDAsIENPRVhfVU5BU1NPQ19BVVRPX1NDQU5fRkxBR1N9LAorCXtDT0VYX0NVX0NBTElCUkFUSU9OX1JQLCBDT0VYX0NVX0NBTElCUkFUSU9OX1dQLAorCSAwLCBDT0VYX0NBTElCUkFUSU9OX0ZMQUdTfSwKKwl7Q09FWF9DVV9QRVJJT0RJQ19DQUxJQlJBVElPTl9SUCwgQ09FWF9DVV9QRVJJT0RJQ19DQUxJQlJBVElPTl9XUCwKKwkgMCwgQ09FWF9QRVJJT0RJQ19DQUxJQlJBVElPTl9GTEFHU30sCisJe0NPRVhfQ1VfQ09OTkVDVElPTl9FU1RBQl9SUCwgQ09FWF9DVV9DT05ORUNUSU9OX0VTVEFCX1dQLAorCSAwLCBDT0VYX0NPTk5FQ1RJT05fRVNUQUJfRkxBR1N9LAorCXtDT0VYX0NVX0FTU09DSUFURURfSURMRV9SUCwgQ09FWF9DVV9BU1NPQ0lBVEVEX0lETEVfV1AsCisJIDAsIENPRVhfQVNTT0NJQVRFRF9JRExFX0ZMQUdTfSwKKwl7Q09FWF9DVV9BU1NPQ19NQU5VQUxfU0NBTl9SUCwgQ09FWF9DVV9BU1NPQ19NQU5VQUxfU0NBTl9XUCwKKwkgMCwgQ09FWF9BU1NPQ19NQU5VQUxfU0NBTl9GTEFHU30sCisJe0NPRVhfQ1VfQVNTT0NfQVVUT19TQ0FOX1JQLCBDT0VYX0NVX0FTU09DX0FVVE9fU0NBTl9XUCwKKwkgMCwgQ09FWF9BU1NPQ19BVVRPX1NDQU5fRkxBR1N9LAorCXtDT0VYX0NVX0FTU09DX0FDVElWRV9MRVZFTF9SUCwgQ09FWF9DVV9BU1NPQ19BQ1RJVkVfTEVWRUxfV1AsCisJIDAsIENPRVhfQVNTT0NfQUNUSVZFX0xFVkVMX0ZMQUdTfSwKKwl7Q09FWF9DVV9SRl9PTl9SUCwgQ09FWF9DVV9SRl9PTl9XUCwgMCwgQ09FWF9DVV9SRl9PTl9GTEFHU30sCisJe0NPRVhfQ1VfUkZfT0ZGX1JQLCBDT0VYX0NVX1JGX09GRl9XUCwgMCwgQ09FWF9SRl9PRkZfRkxBR1N9LAorCXtDT0VYX0NVX1NUQU5EX0FMT05FX0RFQlVHX1JQLCBDT0VYX0NVX1NUQU5EX0FMT05FX0RFQlVHX1dQLAorCSAwLCBDT0VYX1NUQU5EX0FMT05FX0RFQlVHX0ZMQUdTfSwKKwl7Q09FWF9DVV9JUEFOX0FTU09DX0xFVkVMX1JQLCBDT0VYX0NVX0lQQU5fQVNTT0NfTEVWRUxfV1AsCisJIDAsIENPRVhfSVBBTl9BU1NPQ19MRVZFTF9GTEFHU30sCisJe0NPRVhfQ1VfUlNSVkQxX1JQLCBDT0VYX0NVX1JTUlZEMV9XUCwgMCwgQ09FWF9SU1JWRDFfRkxBR1N9LAorCXtDT0VYX0NVX1JTUlZEMl9SUCwgQ09FWF9DVV9SU1JWRDJfV1AsIDAsIENPRVhfUlNSVkQyX0ZMQUdTfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHVDb2RlIGRvd25sb2FkIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2Rlc2Moc3RydWN0IGl3bF9idXMgKmJ1cywgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCit7CisJaWYgKGRlc2MtPnZfYWRkcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYnVzLT5kZXYsIGRlc2MtPmxlbiwKKwkJCQkgIGRlc2MtPnZfYWRkciwgZGVzYy0+cF9hZGRyKTsKKwlkZXNjLT52X2FkZHIgPSBOVUxMOworCWRlc2MtPmxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2ltZyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBzdHJ1Y3QgZndfaW1nICppbWcpCit7CisJaXdsX2ZyZWVfZndfZGVzYyhidXMsICZpbWctPmNvZGUpOworCWl3bF9mcmVlX2Z3X2Rlc2MoYnVzLCAmaW1nLT5kYXRhKTsKK30KKwordm9pZCBpd2xfZGVhbGxvY191Y29kZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlpd2xfZnJlZV9md19pbWcoYnVzKHRyYW5zKSwgJnRyYW5zLT51Y29kZV9ydCk7CisJaXdsX2ZyZWVfZndfaW1nKGJ1cyh0cmFucyksICZ0cmFucy0+dWNvZGVfaW5pdCk7CisJaXdsX2ZyZWVfZndfaW1nKGJ1cyh0cmFucyksICZ0cmFucy0+dWNvZGVfd293bGFuKTsKK30KKworaW50IGl3bF9hbGxvY19md19kZXNjKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBmd19kZXNjICpkZXNjLAorCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCWlmICghbGVuKSB7CisJCWRlc2MtPnZfYWRkciA9IE5VTEw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlc2MtPnZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChidXMtPmRldiwgbGVuLAorCQkJCQkgICZkZXNjLT5wX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghZGVzYy0+dl9hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlc2MtPmxlbiA9IGxlbjsKKwltZW1jcHkoZGVzYy0+dl9hZGRyLCBkYXRhLCBsZW4pOworCXJldHVybiAwOworfQorCisvKgorICogdWNvZGUKKyAqLworc3RhdGljIGludCBpd2xfbG9hZF9zZWN0aW9uKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCXN0cnVjdCBmd19kZXNjICppbWFnZSwgdTMyIGRzdF9hZGRyKQoreworCXN0cnVjdCBpd2xfYnVzICpidXMgPSBidXModHJhbnMpOworCWRtYV9hZGRyX3QgcGh5X2FkZHIgPSBpbWFnZS0+cF9hZGRyOworCXUzMiBieXRlX2NudCA9IGltYWdlLT5sZW47CisJaW50IHJldDsKKworCXRyYW5zLT51Y29kZV93cml0ZV9jb21wbGV0ZSA9IDA7CisKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAorCQlGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhGSF9TUlZDX0NITkwpLAorCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1NSVkNfQ0hOTF9TUkFNX0FERFJfUkVHKEZIX1NSVkNfQ0hOTCksIGRzdF9hZGRyKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1RGRElCX0NUUkwwX1JFRyhGSF9TUlZDX0NITkwpLAorCQlwaHlfYWRkciAmIEZIX01FTV9URkRJQl9EUkFNX0FERFJfTFNCX01TSyk7CisKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAorCQlGSF9URkRJQl9DVFJMMV9SRUcoRkhfU1JWQ19DSE5MKSwKKwkJKGl3bF9nZXRfZG1hX2hpX2FkZHIocGh5X2FkZHIpCisJCQk8PCBGSF9NRU1fVEZESUJfUkVHMV9BRERSX0JJVFNISUZUKSB8IGJ5dGVfY250KTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFRyhGSF9TUlZDX0NITkwpLAorCQkxIDw8IEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfTlVNIHwKKwkJMSA8PCBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX0lEWCB8CisJCUZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRCk7CisKKwlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLAorCQlGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhGSF9TUlZDX0NITkwpLAorCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRQl8CisJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9ESVNBQkxFCXwKKwkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfRU5EVEZEKTsKKworCUlXTF9ERUJVR19GVyhidXMsICIlcyB1Q29kZSBzZWN0aW9uIGJlaW5nIGxvYWRlZC4uLlxuIiwgbmFtZSk7CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRyYW5zLT5zaHJkLT53YWl0X2NvbW1hbmRfcXVldWUsCisJCQkJIHRyYW5zLT51Y29kZV93cml0ZV9jb21wbGV0ZSwgNSAqIEhaKTsKKwlpZiAoIXJldCkgeworCQlJV0xfRVJSKHRyYW5zLCAiQ291bGQgbm90IGxvYWQgdGhlICVzIHVDb2RlIHNlY3Rpb25cbiIsCisJCQluYW1lKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZ3X2ltZyAqaXdsX2dldF91Y29kZV9pbWFnZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQkJZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQoreworCXN3aXRjaCAodWNvZGVfdHlwZSkgeworCWNhc2UgSVdMX1VDT0RFX0lOSVQ6CisJCXJldHVybiAmdHJhbnMtPnVjb2RlX2luaXQ7CisJY2FzZSBJV0xfVUNPREVfV09XTEFOOgorCQlyZXR1cm4gJnRyYW5zLT51Y29kZV93b3dsYW47CisJY2FzZSBJV0xfVUNPREVfUkVHVUxBUjoKKwkJcmV0dXJuICZ0cmFucy0+dWNvZGVfcnQ7CisJY2FzZSBJV0xfVUNPREVfTk9ORToKKwkJYnJlYWs7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGl3bF9sb2FkX2dpdmVuX3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCSAgIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZndfaW1nICppbWFnZSA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UodHJhbnMsIHVjb2RlX3R5cGUpOworCisKKwlpZiAoIWltYWdlKSB7CisJCUlXTF9FUlIodHJhbnMsICJJbnZhbGlkIHVjb2RlIHJlcXVlc3RlZCAoJWQpXG4iLAorCQkJdWNvZGVfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGl3bF9sb2FkX3NlY3Rpb24odHJhbnMsICJJTlNUIiwgJmltYWdlLT5jb2RlLAorCQkJCSAgIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpd2xfbG9hZF9zZWN0aW9uKHRyYW5zLCAiREFUQSIsICZpbWFnZS0+ZGF0YSwKKwkJCQkgICAgSVdMQUdOX1JUQ19EQVRBX0xPV0VSX0JPVU5EKTsKK30KKworLyoKKyAqICBDYWxpYnJhdGlvbgorICovCitzdGF0aWMgaW50IGl3bF9zZXRfWHRhbF9jYWxpYihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX2NhbGliX3h0YWxfZnJlcV9jbWQgY21kOworCV9fbGUxNiAqeHRhbF9jYWxpYiA9CisJCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIodHJhbnMtPnNocmQsIEVFUFJPTV9YVEFMKTsKKworCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9DUllTVEFMX0ZSUV9DTUQpOworCWNtZC5jYXBfcGluMSA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMF0pOworCWNtZC5jYXBfcGluMiA9IGxlMTZfdG9fY3B1KHh0YWxfY2FsaWJbMV0pOworCXJldHVybiBpd2xfY2FsaWJfc2V0KHRyYW5zLCAodm9pZCAqKSZjbWQsIHNpemVvZihjbWQpKTsKK30KKworc3RhdGljIGludCBpd2xfc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX2NhbGliX3RlbXBlcmF0dXJlX29mZnNldF9jbWQgY21kOworCV9fbGUxNiAqb2Zmc2V0X2NhbGliID0KKwkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcih0cmFucy0+c2hyZCwKKwkJCQkJCUVFUFJPTV9SQVdfVEVNUEVSQVRVUkUpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlpd2xfc2V0X2NhbGliX2hkcigmY21kLmhkciwgSVdMX1BIWV9DQUxJQlJBVEVfVEVNUF9PRkZTRVRfQ01EKTsKKwltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0LCBvZmZzZXRfY2FsaWIsIHNpemVvZigqb2Zmc2V0X2NhbGliKSk7CisJaWYgKCEoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQpKQorCQljbWQucmFkaW9fc2Vuc29yX29mZnNldCA9IERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVDsKKworCUlXTF9ERUJVR19DQUxJQih0cmFucywgIlJhZGlvIHNlbnNvciBvZmZzZXQ6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQpKTsKKwlyZXR1cm4gaXdsX2NhbGliX3NldCh0cmFucywgKHZvaWQgKikmY21kLCBzaXplb2YoY21kKSk7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWJfdjIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF9jYWxpYl90ZW1wZXJhdHVyZV9vZmZzZXRfdjJfY21kIGNtZDsKKwlfX2xlMTYgKm9mZnNldF9jYWxpYl9oaWdoID0gKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcih0cmFucy0+c2hyZCwKKwkJCQkgICAgIEVFUFJPTV9LRUxWSU5fVEVNUEVSQVRVUkUpOworCV9fbGUxNiAqb2Zmc2V0X2NhbGliX2xvdyA9CisJCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIodHJhbnMtPnNocmQsCisJCQkJCQlFRVBST01fUkFXX1RFTVBFUkFUVVJFKTsKKwlzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9oZHIgKmhkcjsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJaXdsX3NldF9jYWxpYl9oZHIoJmNtZC5oZHIsIElXTF9QSFlfQ0FMSUJSQVRFX1RFTVBfT0ZGU0VUX0NNRCk7CisJaGRyID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqKWl3bF9lZXByb21fcXVlcnlfYWRkcih0cmFucy0+c2hyZCwKKwkJCQkJCQlFRVBST01fQ0FMSUJfQUxMKTsKKwltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2hpZ2gsIG9mZnNldF9jYWxpYl9oaWdoLAorCQlzaXplb2YoKm9mZnNldF9jYWxpYl9oaWdoKSk7CisJbWVtY3B5KCZjbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3csIG9mZnNldF9jYWxpYl9sb3csCisJCXNpemVvZigqb2Zmc2V0X2NhbGliX2xvdykpOworCWlmICghKGNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2xvdykpIHsKKwkJSVdMX0RFQlVHX0NBTElCKHRyYW5zLCAibm8gaW5mbyBpbiBFRVBST00sIHVzZSBkZWZhdWx0XG4iKTsKKwkJY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfbG93ID0gREVGQVVMVF9SQURJT19TRU5TT1JfT0ZGU0VUOworCQljbWQucmFkaW9fc2Vuc29yX29mZnNldF9oaWdoID0gREVGQVVMVF9SQURJT19TRU5TT1JfT0ZGU0VUOworCX0KKwltZW1jcHkoJmNtZC5idXJudFZvbHRhZ2VSZWYsICZoZHItPnZvbHRhZ2UsCisJCXNpemVvZihoZHItPnZvbHRhZ2UpKTsKKworCUlXTF9ERUJVR19DQUxJQih0cmFucywgIlJhZGlvIHNlbnNvciBvZmZzZXQgaGlnaDogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldF9oaWdoKSk7CisJSVdMX0RFQlVHX0NBTElCKHRyYW5zLCAiUmFkaW8gc2Vuc29yIG9mZnNldCBsb3c6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfbG93KSk7CisJSVdMX0RFQlVHX0NBTElCKHRyYW5zLCAiVm9sdGFnZSBSZWY6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoY21kLmJ1cm50Vm9sdGFnZVJlZikpOworCisJcmV0dXJuIGl3bF9jYWxpYl9zZXQodHJhbnMsICh2b2lkICopJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IGl3bF9zZW5kX2NhbGliX2NmZyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX2NhbGliX2NmZ19jbWQgY2FsaWJfY2ZnX2NtZDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ0FMSUJSQVRJT05fQ0ZHX0NNRCwKKwkJLmxlbiA9IHsgc2l6ZW9mKHN0cnVjdCBpd2xfY2FsaWJfY2ZnX2NtZCksIH0sCisJCS5kYXRhID0geyAmY2FsaWJfY2ZnX2NtZCwgfSwKKwl9OworCisJbWVtc2V0KCZjYWxpYl9jZmdfY21kLCAwLCBzaXplb2YoY2FsaWJfY2ZnX2NtZCkpOworCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLmlzX2VuYWJsZSA9IElXTF9DQUxJQl9JTklUX0NGR19BTEw7CisJY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2Uuc3RhcnQgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOworCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5vbmNlLnNlbmRfcmVzID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKKwljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcuZmxhZ3MgPQorCQlJV0xfQ0FMSUJfQ0ZHX0ZMQUdfU0VORF9DT01QTEVURV9OVEZZX01TSzsKKworCXJldHVybiBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMsICZjbWQpOworfQorCitpbnQgaXdsYWduX3J4X2NhbGliX3Jlc3VsdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIsCisJCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpCit7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGl3bF9jYWxpYl9oZHIgKmhkciA9IChzdHJ1Y3QgaXdsX2NhbGliX2hkciAqKXBrdC0+dS5yYXc7CisJaW50IGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7CisKKwkvKiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgKi8KKwlsZW4gLT0gNDsKKworCWlmIChpd2xfY2FsaWJfc2V0KHRyYW5zKHByaXYpLCBoZHIsIGxlbikpCisJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZWNvcmQgY2FsaWJyYXRpb24gZGF0YSAlZFxuIiwKKwkJCWhkci0+b3BfY29kZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl3bF9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCWludCByZXQ7CisKKwlpZiAoY2ZnKHRyYW5zKS0+YnRfcGFyYW1zICYmCisJICAgIGNmZyh0cmFucyktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCQkvKgorCQkgKiBUZWxsIHVDb2RlIHdlIGFyZSByZWFkeSB0byBwZXJmb3JtIGNhbGlicmF0aW9uCisJCSAqIG5lZWQgdG8gcGVyZm9ybSB0aGlzIGJlZm9yZSBhbnkgY2FsaWJyYXRpb24KKwkJICogbm8gbmVlZCB0byBjbG9zZSB0aGUgZW52bG9wZSBzaW5jZSB3ZSBhcmUgZ29pbmcKKwkJICogdG8gbG9hZCB0aGUgcnVudGltZSB1Q29kZSBsYXRlci4KKwkJICovCisJCXJldCA9IGl3bF9zZW5kX2J0X2Vudih0cmFucywgSVdMX0JUX0NPRVhfRU5WX09QRU4sCisJCQlCVF9DT0VYX1BSSU9fVEJMX0VWVF9JTklUX0NBTElCMik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJfQorCisJcmV0ID0gaXdsX3NlbmRfY2FsaWJfY2ZnKHRyYW5zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoqCisJICogdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uIGlzIG9ubHkgbmVlZGVkIGZvciBydW50aW1lIHVjb2RlLAorCSAqIHNvIHByZXBhcmUgdGhlIHZhbHVlIG5vdy4KKwkgKi8KKwlpZiAoY2ZnKHRyYW5zKS0+bmVlZF90ZW1wX29mZnNldF9jYWxpYikgeworCQlpZiAoY2ZnKHRyYW5zKS0+dGVtcF9vZmZzZXRfdjIpCisJCQlyZXR1cm4gaXdsX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWJfdjIodHJhbnMpOworCQllbHNlCisJCQlyZXR1cm4gaXdsX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWIodHJhbnMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3bF9zZW5kX3dpbWF4X2NvZXgoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF93aW1heF9jb2V4X2NtZCBjb2V4X2NtZDsKKworCWlmIChjZmcodHJhbnMpLT5iYXNlX3BhcmFtcy0+c3VwcG9ydF93aW1heF9jb2V4aXN0KSB7CisJCS8qIFVuTWFzayB3YWtlIHVwIHNyYyBhdCBhc3NvY2lhdGVkIHNsZWVwICovCisJCWNvZXhfY21kLmZsYWdzID0gQ09FWF9GTEFHU19BU1NPQ19XQV9VTk1BU0tfTVNLOworCisJCS8qIFVuTWFzayB3YWtlIHVwIHNyYyBhdCB1bmFzc29jaWF0ZWQgc2xlZXAgKi8KKwkJY29leF9jbWQuZmxhZ3MgfD0gQ09FWF9GTEFHU19VTkFTU09DX1dBX1VOTUFTS19NU0s7CisJCW1lbWNweShjb2V4X2NtZC5zdGFfcHJpbywgY3VfcHJpb3JpdGllcywKKwkJCXNpemVvZihzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfZXZlbnRfZW50cnkpICoKKwkJCSBDT0VYX05VTV9PRl9FVkVOVFMpOworCisJCS8qIGVuYWJsaW5nIHRoZSBjb2V4aXN0ZW5jZSBmZWF0dXJlICovCisJCWNvZXhfY21kLmZsYWdzIHw9IENPRVhfRkxBR1NfQ09FWF9FTkFCTEVfTVNLOworCisJCS8qIGVuYWJsaW5nIHRoZSBwcmlvcml0aWVzIHRhYmxlcyAqLworCQljb2V4X2NtZC5mbGFncyB8PSBDT0VYX0ZMQUdTX1NUQV9UQUJMRV9WQUxJRF9NU0s7CisJfSBlbHNlIHsKKwkJLyogY29leGlzdGVuY2UgaXMgZGlzYWJsZWQgKi8KKwkJbWVtc2V0KCZjb2V4X2NtZCwgMCwgc2l6ZW9mKGNvZXhfY21kKSk7CisJfQorCXJldHVybiBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zLAorCQkJCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01ELCBDTURfU1lOQywKKwkJCQlzaXplb2YoY29leF9jbWQpLCAmY29leF9jbWQpOworfQorCitzdGF0aWMgY29uc3QgdTggaXdsX2J0X3ByaW9fdGJsW0JUX0NPRVhfUFJJT19UQkxfRVZUX01BWF0gPSB7CisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQllQQVNTIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8CisJCSgwIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAorCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0JZUEFTUyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMSA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19MT1cgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fTE9XIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8CisJCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAorCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0hJR0ggPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fSElHSCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMSA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19CWVBBU1MgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQ09FWF9PRkYgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQ09FWF9PTiA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCit2b2lkIGl3bF9zZW5kX3ByaW9fdGJsKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfYnRfY29leF9wcmlvX3RhYmxlX2NtZCBwcmlvX3RibF9jbWQ7CisKKwltZW1jcHkocHJpb190YmxfY21kLnByaW9fdGJsLCBpd2xfYnRfcHJpb190YmwsCisJCXNpemVvZihpd2xfYnRfcHJpb190YmwpKTsKKwlpZiAoaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucywKKwkJCQlSRVBMWV9CVF9DT0VYX1BSSU9fVEFCTEUsIENNRF9TWU5DLAorCQkJCXNpemVvZihwcmlvX3RibF9jbWQpLCAmcHJpb190YmxfY21kKSkKKwkJSVdMX0VSUih0cmFucywgImZhaWxlZCB0byBzZW5kIEJUIHByaW8gdGJsIGNvbW1hbmRcbiIpOworfQorCitpbnQgaXdsX3NlbmRfYnRfZW52KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1OCBhY3Rpb24sIHU4IHR5cGUpCit7CisJc3RydWN0IGl3bF9idF9jb2V4X3Byb3RfZW52X2NtZCBlbnZfY21kOworCWludCByZXQ7CisKKwllbnZfY21kLmFjdGlvbiA9IGFjdGlvbjsKKwllbnZfY21kLnR5cGUgPSB0eXBlOworCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMsCisJCQkgICAgICAgUkVQTFlfQlRfQ09FWF9QUk9UX0VOViwgQ01EX1NZTkMsCisJCQkgICAgICAgc2l6ZW9mKGVudl9jbWQpLCAmZW52X2NtZCk7CisJaWYgKHJldCkKKwkJSVdMX0VSUih0cmFucywgImZhaWxlZCB0byBzZW5kIEJUIGVudiBjb21tYW5kXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaXdsX2FsaXZlX25vdGlmeShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwcml2KHRyYW5zKTsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoIXByaXYtPnR4X2NtZF9wb29sKQorCQlwcml2LT50eF9jbWRfcG9vbCA9CisJCQlrbWVtX2NhY2hlX2NyZWF0ZSgiaXdsX2Rldl9jbWQiLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpLAorCQkJCQkgIHNpemVvZih2b2lkICopLCAwLCBOVUxMKTsKKworCWlmICghcHJpdi0+dHhfY21kX3Bvb2wpCisJCXJldHVybiAtRU5PTUVNOworCisJaXdsX3RyYW5zX3R4X3N0YXJ0KHRyYW5zKTsKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKKwkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7CisKKwlyZXQgPSBpd2xfc2VuZF93aW1heF9jb2V4KHRyYW5zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFjZmcocHJpdiktPm5vX3h0YWxfY2FsaWIpIHsKKwkJcmV0ID0gaXdsX3NldF9YdGFsX2NhbGliKHRyYW5zKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGl3bF9zZW5kX2NhbGliX3Jlc3VsdHModHJhbnMpOworfQorCisKKy8qKgorICogaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZSAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCisgKiAgIHVzaW5nIHNhbXBsZSBkYXRhIDEwMCBieXRlcyBhcGFydC4gIElmIHRoZXNlIHNhbXBsZSBwb2ludHMgYXJlIGdvb2QsCisgKiAgIGl0J3MgYSBwcmV0dHkgZ29vZCBiZXQgdGhhdCBldmVyeXRoaW5nIGJldHdlZW4gdGhlbSBpcyBnb29kLCB0b28uCisgKi8KK3N0YXRpYyBpbnQgaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX2J1cyAqYnVzLAorCQkJCSAgICAgIHN0cnVjdCBmd19kZXNjICpmd19kZXNjKQoreworCV9fbGUzMiAqaW1hZ2UgPSAoX19sZTMyICopZndfZGVzYy0+dl9hZGRyOworCXUzMiBsZW4gPSBmd19kZXNjLT5sZW47CisJdTMyIHZhbDsKKwl1MzIgaTsKKworCUlXTF9ERUJVR19GVyhidXMsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwL3NpemVvZih1MzIpKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKKwkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLworCQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzLCBIQlVTX1RBUkdfTUVNX1JBRERSLAorCQkJaSArIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJCXZhbCA9IGl3bF9yZWFkMzIoYnVzLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXdsX3ByaW50X21pc21hdGNoX2luc3Qoc3RydWN0IGl3bF9idXMgKmJ1cywKKwkJCQkgICAgc3RydWN0IGZ3X2Rlc2MgKmZ3X2Rlc2MpCit7CisJX19sZTMyICppbWFnZSA9IChfX2xlMzIgKilmd19kZXNjLT52X2FkZHI7CisJdTMyIGxlbiA9IGZ3X2Rlc2MtPmxlbjsKKwl1MzIgdmFsOworCXUzMiBvZmZzOworCWludCBlcnJvcnMgPSAwOworCisJSVdMX0RFQlVHX0ZXKGJ1cywgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsIEhCVVNfVEFSR19NRU1fUkFERFIsCisJCQkgICBJV0xBR05fUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCisJZm9yIChvZmZzID0gMDsKKwkgICAgIG9mZnMgPCBsZW4gJiYgZXJyb3JzIDwgMjA7CisJICAgICBvZmZzICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQl2YWwgPSBpd2xfcmVhZDMyKGJ1cywgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlJV0xfRVJSKGJ1cywgInVDb2RlIElOU1Qgc2VjdGlvbiBhdCAiCisJCQkJIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCQlvZmZzLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJZXJyb3JzKys7CisJCX0KKwl9Cit9CisKKy8qKgorICogaXdsX3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAorICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKKyAqLworc3RhdGljIGludCBpd2xfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJICAgIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKK3sKKwlzdHJ1Y3QgZndfaW1nICppbWcgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKHRyYW5zLCB1Y29kZV90eXBlKTsKKworCWlmICghaW1nKSB7CisJCUlXTF9FUlIodHJhbnMsICJJbnZhbGlkIHVjb2RlIHJlcXVlc3RlZCAoJWQpXG4iLCB1Y29kZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlKGJ1cyh0cmFucyksICZpbWctPmNvZGUpKSB7CisJCUlXTF9ERUJVR19GVyh0cmFucywgInVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJSVdMX0VSUih0cmFucywgIlVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0gTk9UIFZBTElEISFcbiIpOworCisJaXdsX3ByaW50X21pc21hdGNoX2luc3QoYnVzKHRyYW5zKSwgJmltZy0+Y29kZSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0cnVjdCBpd2xfYWxpdmVfZGF0YSB7CisJYm9vbCB2YWxpZDsKKwl1OCBzdWJ0eXBlOworfTsKKworc3RhdGljIHZvaWQgaXdsX2FsaXZlX2ZuKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCisJCQkgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXdsX2FsaXZlX2RhdGEgKmFsaXZlX2RhdGEgPSBkYXRhOworCXN0cnVjdCBpd2xfYWxpdmVfcmVzcCAqcGFsaXZlOworCisJcGFsaXZlID0gJnBrdC0+dS5hbGl2ZV9mcmFtZTsKKworCUlXTF9ERUJVR19GVyh0cmFucywgIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIgorCQkgICAgICAgIjB4JTAxWCAweCUwMVhcbiIsCisJCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLAorCQkgICAgICAgcGFsaXZlLT52ZXJfc3VidHlwZSk7CisKKwl0cmFucy0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlID0KKwkJbGUzMl90b19jcHUocGFsaXZlLT5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCXRyYW5zLT5zaHJkLT5kZXZpY2VfcG9pbnRlcnMubG9nX2V2ZW50X3RhYmxlID0KKwkJbGUzMl90b19jcHUocGFsaXZlLT5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKworCWFsaXZlX2RhdGEtPnN1YnR5cGUgPSBwYWxpdmUtPnZlcl9zdWJ0eXBlOworCWFsaXZlX2RhdGEtPnZhbGlkID0gcGFsaXZlLT5pc192YWxpZCA9PSBVQ09ERV9WQUxJRF9PSzsKK30KKworLyogbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwordm9pZCBpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdChzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCQkgICBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAorCQkJCSAgIHU4IGNtZCwKKwkJCQkgICB2b2lkICgqZm4pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorCQkJCQkgICAgICB2b2lkICpkYXRhKSwKKwkJCQkgICB2b2lkICpmbl9kYXRhKQoreworCXdhaXRfZW50cnktPmZuID0gZm47CisJd2FpdF9lbnRyeS0+Zm5fZGF0YSA9IGZuX2RhdGE7CisJd2FpdF9lbnRyeS0+Y21kID0gY21kOworCXdhaXRfZW50cnktPnRyaWdnZXJlZCA9IGZhbHNlOworCXdhaXRfZW50cnktPmFib3J0ZWQgPSBmYWxzZTsKKworCXNwaW5fbG9ja19iaCgmc2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKKwlsaXN0X2FkZCgmd2FpdF9lbnRyeS0+bGlzdCwgJnNocmQtPm5vdGlmX3dhaXRzKTsKKwlzcGluX3VubG9ja19iaCgmc2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKK30KKworaW50IGl3bF93YWl0X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCSAgICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWludCByZXQ7CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoc2hyZC0+bm90aWZfd2FpdHEsCisJCQkJIHdhaXRfZW50cnktPnRyaWdnZXJlZCB8fCB3YWl0X2VudHJ5LT5hYm9ydGVkLAorCQkJCSB0aW1lb3V0KTsKKworCXNwaW5fbG9ja19iaCgmc2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKKwlsaXN0X2RlbCgmd2FpdF9lbnRyeS0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnNocmQtPm5vdGlmX3dhaXRfbG9jayk7CisKKwlpZiAod2FpdF9lbnRyeS0+YWJvcnRlZCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiByZXR1cm4gdmFsdWUgaXMgYWx3YXlzID49IDAgKi8KKwlpZiAocmV0IDw9IDApCisJCXJldHVybiAtRVRJTUVET1VUOworCXJldHVybiAwOworfQorCit2b2lkIGl3bF9yZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLAorCQkJCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnkpCit7CisJc3Bpbl9sb2NrX2JoKCZzaHJkLT5ub3RpZl93YWl0X2xvY2spOworCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmc2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKK30KKwordm9pZCBpd2xfYWJvcnRfbm90aWZpY2F0aW9uX3dhaXRzKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzaHJkLT5ub3RpZl93YWl0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhaXRfZW50cnksICZzaHJkLT5ub3RpZl93YWl0cywgbGlzdCkKKwkJd2FpdF9lbnRyeS0+YWJvcnRlZCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hyZC0+bm90aWZfd2FpdF9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2FsbCgmc2hyZC0+bm90aWZfd2FpdHEpOworfQorCisjZGVmaW5lIFVDT0RFX0FMSVZFX1RJTUVPVVQJSFoKKyNkZWZpbmUgVUNPREVfQ0FMSUJfVElNRU9VVAkoMipIWikKKworaW50IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKK3sKKwlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IGFsaXZlX3dhaXQ7CisJc3RydWN0IGl3bF9hbGl2ZV9kYXRhIGFsaXZlX2RhdGE7CisJaW50IHJldDsKKwllbnVtIGl3bF91Y29kZV90eXBlIG9sZF90eXBlOworCisJcmV0ID0gaXdsX3RyYW5zX3N0YXJ0X2RldmljZSh0cmFucyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KHRyYW5zLT5zaHJkLCAmYWxpdmVfd2FpdCwgUkVQTFlfQUxJVkUsCisJCQkJICAgICAgaXdsX2FsaXZlX2ZuLCAmYWxpdmVfZGF0YSk7CisKKwlvbGRfdHlwZSA9IHRyYW5zLT5zaHJkLT51Y29kZV90eXBlOworCXRyYW5zLT5zaHJkLT51Y29kZV90eXBlID0gdWNvZGVfdHlwZTsKKworCXJldCA9IGl3bF9sb2FkX2dpdmVuX3Vjb2RlKHRyYW5zLCB1Y29kZV90eXBlKTsKKwlpZiAocmV0KSB7CisJCXRyYW5zLT5zaHJkLT51Y29kZV90eXBlID0gb2xkX3R5cGU7CisJCWl3bF9yZW1vdmVfbm90aWZpY2F0aW9uKHRyYW5zLT5zaHJkLCAmYWxpdmVfd2FpdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaXdsX3RyYW5zX2tpY2tfbmljKHRyYW5zKTsKKworCS8qCisJICogU29tZSB0aGluZ3MgbWF5IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBub3csIGJ1dCB3ZQorCSAqIGp1c3Qgd2FpdCBmb3IgdGhlIEFMSVZFIG5vdGlmaWNhdGlvbiBoZXJlLgorCSAqLworCXJldCA9IGl3bF93YWl0X25vdGlmaWNhdGlvbih0cmFucy0+c2hyZCwgJmFsaXZlX3dhaXQsCisJCQkJCVVDT0RFX0FMSVZFX1RJTUVPVVQpOworCWlmIChyZXQpIHsKKwkJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWFsaXZlX2RhdGEudmFsaWQpIHsKKwkJSVdMX0VSUih0cmFucywgIkxvYWRlZCB1Y29kZSBpcyBub3QgdmFsaWQhXG4iKTsKKwkJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBUaGlzIHN0ZXAgdGFrZXMgYSBsb25nIHRpbWUgKDYwLTgwbXMhISkgYW5kCisJICogV29XTEFOIGltYWdlIHNob3VsZCBiZSBsb2FkZWQgcXVpY2tseSwgc28KKwkgKiBza2lwIGl0IGZvciBXb1dMQU4uCisJICovCisJaWYgKHVjb2RlX3R5cGUgIT0gSVdMX1VDT0RFX1dPV0xBTikgeworCQlyZXQgPSBpd2xfdmVyaWZ5X3Vjb2RlKHRyYW5zLCB1Y29kZV90eXBlKTsKKwkJaWYgKHJldCkgeworCQkJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBkZWxheSBhIGJpdCB0byBnaXZlIHJma2lsbCB0aW1lIHRvIHJ1biAqLworCQltc2xlZXAoNSk7CisJfQorCisJcmV0ID0gaXdsX2FsaXZlX25vdGlmeSh0cmFucyk7CisJaWYgKHJldCkgeworCQlJV0xfV0FSTih0cmFucywKKwkJCSJDb3VsZCBub3QgY29tcGxldGUgQUxJVkUgdHJhbnNpdGlvbjogJWRcbiIsIHJldCk7CisJCXRyYW5zLT5zaHJkLT51Y29kZV90eXBlID0gb2xkX3R5cGU7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpd2xfcnVuX2luaXRfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCBjYWxpYl93YWl0OworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0cmFucy0+c2hyZC0+bXV0ZXgpOworCisJLyogTm8gaW5pdCB1Y29kZSByZXF1aXJlZD8gQ3VyaW91cywgYnV0IG1heWJlIG9rICovCisJaWYgKCF0cmFucy0+dWNvZGVfaW5pdC5jb2RlLmxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgIT0gSVdMX1VDT0RFX05PTkUpCisJCXJldHVybiAwOworCisJaXdsX2luaXRfbm90aWZpY2F0aW9uX3dhaXQodHJhbnMtPnNocmQsICZjYWxpYl93YWl0LAorCQkJCSAgICAgIENBTElCUkFUSU9OX0NPTVBMRVRFX05PVElGSUNBVElPTiwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKworCS8qIFdpbGwgYWxzbyBzdGFydCB0aGUgZGV2aWNlICovCisJcmV0ID0gaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZSh0cmFucywgSVdMX1VDT0RFX0lOSVQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBpd2xfaW5pdF9hbGl2ZV9zdGFydCh0cmFucyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogU29tZSB0aGluZ3MgbWF5IHJ1biBpbiB0aGUgYmFja2dyb3VuZCBub3csIGJ1dCB3ZQorCSAqIGp1c3Qgd2FpdCBmb3IgdGhlIGNhbGlicmF0aW9uIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4KKwkgKi8KKwlyZXQgPSBpd2xfd2FpdF9ub3RpZmljYXRpb24odHJhbnMtPnNocmQsICZjYWxpYl93YWl0LAorCQkJCQlVQ09ERV9DQUxJQl9USU1FT1VUKTsKKworCWdvdG8gb3V0OworCisgZXJyb3I6CisJaXdsX3JlbW92ZV9ub3RpZmljYXRpb24odHJhbnMtPnNocmQsICZjYWxpYl93YWl0KTsKKyBvdXQ6CisJLyogV2hhdGV2ZXIgaGFwcGVuZWQsIHN0b3AgdGhlIGRldmljZSAqLworCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXdpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXdpZmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUwMTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtd2lmaS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19pd2xfd2lmaV9oX18KKyNkZWZpbmUgX19pd2xfd2lmaV9oX18KKworI2luY2x1ZGUgIml3bC1zaGFyZWQuaCIKKworaW50IGl3bF9zZW5kX2J0X2VudihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTggYWN0aW9uLCB1OCB0eXBlKTsKK3ZvaWQgaXdsX3NlbmRfcHJpb190Ymwoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworaW50IGl3bF9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKK2ludCBpd2xfcnVuX2luaXRfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworaW50IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSk7CisjZW5kaWYgIC8qIF9faXdsX3dpZmlfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY29tbWFuZHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jb21tYW5kcy5jCmluZGV4IDUwZGVlNmEuLmJkNzUwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jb21tYW5kcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jb21tYW5kcy5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgIml3bS5oIgogI2luY2x1ZGUgImJ1cy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9kZWJ1Z2ZzLmMKaW5kZXggMGEwY2M5Ni4uODdlZWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvZGVidWdmcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiaXdtLmgiCiAjaW5jbHVkZSAiYnVzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL21haW4uYwppbmRleCAzNjIwMDI3Li45OGExNzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSAiaXdtLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvc2Rpby5jCmluZGV4IDU2MzgzZTcuLjc2NGI0MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3NkaW8uYwpAQCAtNjMsNiArNjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYwppbmRleCA0ZmNkNjUzLi5kMWQ4NGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYwpAQCAtNDg1LDYgKzQ4NSw3IEBACiBzdGF0aWMgaW50IGxic19yZXRfc2NhbihzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgZHVtbXksCiAJc3RydWN0IGNtZF9oZWFkZXIgKnJlc3ApCiB7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCXN0cnVjdCBjbWRfZHNfODAyXzExX3NjYW5fcnNwICpzY2FucmVzcCA9ICh2b2lkICopcmVzcDsKIAlpbnQgYnNzc2l6ZTsKIAljb25zdCB1OCAqcG9zOwpAQCAtNjMyLDEyICs2MzMsMTQgQEAKIAkJCQkgICAgIExCU19TQ0FOX1JTU0lfVE9fTUJNKHJzc2kpLzEwMCk7CiAKIAkJCWlmIChjaGFubmVsICYmCi0JCQkgICAgIShjaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkKLQkJCQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBjaGFubmVsLAotCQkJCQlic3NpZCwgbGU2NF90b19jcHUoKihfX2xlNjQgKil0c2ZkZXNjKSwKKwkJCSAgICAhKGNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKSB7CisJCQkJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgY2hhbm5lbCwKKwkJCQkJYnNzaWQsIGdldF91bmFsaWduZWRfbGU2NCh0c2ZkZXNjKSwKIAkJCQkJY2FwYSwgaW50dmwsIGllLCBpZWxlbiwKIAkJCQkJTEJTX1NDQU5fUlNTSV9UT19NQk0ocnNzaSksCiAJCQkJCUdGUF9LRVJORUwpOworCQkJCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKKwkJCX0KIAkJfSBlbHNlCiAJCQlsYnNfZGViX3NjYW4oInNjYW4gcmVzcG9uc2U6IG1pc3NpbmcgQlNTIGNoYW5uZWwgSUVcbiIpOwogCkBAIC0xNzIwLDYgKzE3MjMsNyBAQAogCQkgICAyICsgMiArICAgICAgICAgICAgICAgICAgICAgIC8qIGF0aW0gKi8KIAkJICAgMiArIDhdOyAgICAgICAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCByYXRlcyAqLwogCXU4ICpmYWtlID0gZmFrZV9pZTsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAKIAlsYnNfZGViX2VudGVyKExCU19ERUJfQ0ZHODAyMTEpOwogCkBAIC0xNzYzLDE0ICsxNzY3LDE1IEBACiAJKmZha2UrKyA9IDB4NmM7CiAJbGJzX2RlYl9oZXgoTEJTX0RFQl9DRkc4MDIxMSwgIklFIiwgZmFrZV9pZSwgZmFrZSAtIGZha2VfaWUpOwogCi0JY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwKLQkJCSAgICBwYXJhbXMtPmNoYW5uZWwsCi0JCQkgICAgYnNzaWQsCi0JCQkgICAgMCwKLQkJCSAgICBjYXBhYmlsaXR5LAotCQkJICAgIHBhcmFtcy0+YmVhY29uX2ludGVydmFsLAotCQkJICAgIGZha2VfaWUsIGZha2UgLSBmYWtlX2llLAotCQkJICAgIDAsIEdGUF9LRVJORUwpOworCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi0+d2lwaHksCisJCQkJICBwYXJhbXMtPmNoYW5uZWwsCisJCQkJICBic3NpZCwKKwkJCQkgIDAsCisJCQkJICBjYXBhYmlsaXR5LAorCQkJCSAgcGFyYW1zLT5iZWFjb25faW50ZXJ2YWwsCisJCQkJICBmYWtlX2llLCBmYWtlIC0gZmFrZV9pZSwKKwkJCQkgIDAsIEdGUF9LRVJORUwpOworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCW1lbWNweShwcml2LT53ZGV2LT5zc2lkLCBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4pOwogCXByaXYtPndkZXYtPnNzaWRfbGVuID0gcGFyYW1zLT5zc2lkX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKaW5kZXggZTA4YWIxZC4uZDc5OGJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkZWNsLmgiCiAjaW5jbHVkZSAiY2ZnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKaW5kZXggMWFmMTgyNy4uZDhkOGYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImRlY2wuaCIKICNpbmNsdWRlICJjbWQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwppbmRleCA4ODVkZGMxLi5mOTU1YjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jCkBAIC0xMywxMyArMTMsMTQgQEAKIHsKIAlzdHJ1Y3QgbGJzX3ByaXZhdGUgKnByaXYgPSBkZXYtPm1sX3ByaXY7CiAKLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCAzMiwgIiV1LiV1LiV1LnAldSIsCisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLAorCQkiJXUuJXUuJXUucCV1IiwKIAkJcHJpdi0+ZndyZWxlYXNlID4+IDI0ICYgMHhmZiwKIAkJcHJpdi0+ZndyZWxlYXNlID4+IDE2ICYgMHhmZiwKIAkJcHJpdi0+ZndyZWxlYXNlID4+ICA4ICYgMHhmZiwKIAkJcHJpdi0+ZndyZWxlYXNlICAgICAgICYgMHhmZik7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgImxpYmVydGFzIik7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIGxic19kcml2ZXJfdmVyc2lvbik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsICJsaWJlcnRhcyIsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIGxic19kcml2ZXJfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NkaW8uYwppbmRleCBjOTYyZTIxLi45ODA0ZWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc2Rpby5jCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zcGkuYwppbmRleCA2MjJhZTZkLi41MGIxZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zcGkuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtOTk1LDYgKzk5NSw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmJ1ZmZlcl9sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWtmcmVlKHBhY2tldCk7CiAJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAiY2FuJ3QgdHJhbnNmZXIgYnVmZmVyIG9mIHR5cGUgJWRcbiIsCiAJCQkgICB0eXBlKTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTEyOTAsNyArMTI5MSw2IEBACiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGxpYmVydGFzX3NwaV9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImxpYmVydGFzX3NwaSIsCi0JCS5idXMJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLnBtCT0gJmlmX3NwaV9wbV9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKaW5kZXggODE0N2YxZS4uZGI4NzljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKQEAgLTUsNyArNSw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKaW5kZXggMzlhNmE3YS4uOTU3NjgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpAQCAtNiw3ICs2LDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKaW5kZXggNjJlMTBlZS4uYzczNjZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KIAogI2luY2x1ZGUgImRlZnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCmluZGV4IDhmMTI3NTIuLmMwMjVmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAKICNpbmNsdWRlICJob3N0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCmluZGV4IDEzNTU3ZmUuLjkwOWFjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL2NtZC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAibGliZXJ0YXNfdGYuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwppbmRleCBiYTdkOTY1Li42ODIwMmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgImlmX3VzYi5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCmluZGV4IGFjYzQ2MWEuLmNlYjUxYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgImxpYmVydGFzX3RmLmgiCiAKICNkZWZpbmUgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTiAiMDA0LnAwIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKaW5kZXggNDc3MTAwZC4uNTJiY2RmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgIm1hYzgwMjExX2h3c2ltLmgiCiAKQEAgLTM2LDcgKzM3LDggQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU29mdHdhcmUgc2ltdWxhdG9yIG9mIDgwMi4xMSByYWRpbyhzKSBmb3IgbWFjODAyMTEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotaW50IHdtZWRpdW1kX3BpZDsKK3N0YXRpYyB1MzIgd21lZGl1bWRfcGlkOworCiBzdGF0aWMgaW50IHJhZGlvcyA9IDI7CiBtb2R1bGVfcGFyYW0ocmFkaW9zLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyYWRpb3MsICJOdW1iZXIgb2Ygc2ltdWxhdGVkIHJhZGlvcyIpOwpAQCAtNjY0LDcgKzY2Niw3IEBACiB7CiAJYm9vbCBhY2s7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGk7Ci0JaW50IF9waWQ7CisJdTMyIF9waWQ7CiAKIAltYWM4MDIxMV9od3NpbV9tb25pdG9yX3J4KGh3LCBza2IpOwogCkBAIC02NzUsNyArNjc3LDcgQEAKIAl9CiAKIAkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCi0JX3BpZCA9IHdtZWRpdW1kX3BpZDsKKwlfcGlkID0gQUNDRVNTX09OQ0Uod21lZGl1bWRfcGlkKTsKIAogCWlmIChfcGlkKQogCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoaHcsIHNrYiwgX3BpZCk7CkBAIC03NjMsNyArNzY1LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGFyZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQlpbnQgX3BpZDsKKwl1MzIgX3BpZDsKIAogCWh3c2ltX2NoZWNrX21hZ2ljKHZpZik7CiAKQEAgLTc4MCw3ICs3ODIsNyBAQAogCW1hYzgwMjExX2h3c2ltX21vbml0b3JfcngoaHcsIHNrYik7CiAKIAkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCi0JX3BpZCA9IHdtZWRpdW1kX3BpZDsKKwlfcGlkID0gQUNDRVNTX09OQ0Uod21lZGl1bWRfcGlkKTsKIAogCWlmIChfcGlkKQogCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoaHcsIHNrYiwgX3BpZCk7CkBAIC0xMjUzLDcgKzEyNTUsNyBAQAogCXN0cnVjdCBod3NpbV92aWZfcHJpdiAqdnAgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3BzcG9sbCAqcHNwb2xsOwotCWludCBfcGlkOworCXUzMiBfcGlkOwogCiAJaWYgKCF2cC0+YXNzb2MpCiAJCXJldHVybjsKQEAgLTEyNzQsNyArMTI3Niw3IEBACiAJbWVtY3B5KHBzcG9sbC0+dGEsIG1hYywgRVRIX0FMRU4pOwogCiAJLyogd21lZGl1bWQgbW9kZSBjaGVjayAqLwotCV9waWQgPSB3bWVkaXVtZF9waWQ7CisJX3BpZCA9IEFDQ0VTU19PTkNFKHdtZWRpdW1kX3BpZCk7CiAKIAlpZiAoX3BpZCkKIAkJcmV0dXJuIG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25sKGRhdGEtPmh3LCBza2IsIF9waWQpOwpAQCAtMTI5MSw3ICsxMjkzLDcgQEAKIAlzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYgKnZwID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlpbnQgX3BpZDsKKwl1MzIgX3BpZDsKIAogCWlmICghdnAtPmFzc29jKQogCQlyZXR1cm47CkBAIC0xMzEzLDcgKzEzMTUsNyBAQAogCW1lbWNweShoZHItPmFkZHIzLCB2cC0+YnNzaWQsIEVUSF9BTEVOKTsKIAogCS8qIHdtZWRpdW1kIG1vZGUgY2hlY2sgKi8KLQlfcGlkID0gd21lZGl1bWRfcGlkOworCV9waWQgPSBBQ0NFU1NfT05DRSh3bWVkaXVtZF9waWQpOwogCiAJaWYgKF9waWQpCiAJCXJldHVybiBtYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ubChkYXRhLT5odywgc2tiLCBfcGlkKTsKQEAgLTE2MzMsOCArMTYzNSw2IEBACiAJaW50IHJjOwogCXByaW50ayhLRVJOX0lORk8gIm1hYzgwMjExX2h3c2ltOiBpbml0aWFsaXppbmcgbmV0bGlua1xuIik7CiAKLQl3bWVkaXVtZF9waWQgPSAwOwotCiAJcmMgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseV93aXRoX29wcygmaHdzaW1fZ2VubF9mYW1pbHksCiAJCWh3c2ltX29wcywgQVJSQVlfU0laRShod3NpbV9vcHMpKTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCmluZGV4IDdhYTlhYTAuLjY4MWQzZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBTaW5jZSB0aGUgYnVmZmVyIGlzIGxpbmVhciwgdGhlIGZ1bmN0aW9uIHVzZXMgcm90YXRpb24gdG8gc2ltdWxhdGUKICAqIGNpcmN1bGFyIGJ1ZmZlci4KICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdF91bnRpbF9zdGFydF93aW4oc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJIHN0cnVjdCBtd2lmaWV4X3J4X3Jlb3JkZXJfdGJsCiAJCQkJCSAqcnhfcmVvcl90YmxfcHRyLCBpbnQgc3RhcnRfd2luKQpAQCAtNzEsOCArNzEsNiBAQAogCiAJcnhfcmVvcl90YmxfcHRyLT5zdGFydF93aW4gPSBzdGFydF93aW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfcGt0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtODMsNyArODEsNyBAQAogICogU2luY2UgdGhlIGJ1ZmZlciBpcyBsaW5lYXIsIHRoZSBmdW5jdGlvbiB1c2VzIHJvdGF0aW9uIHRvIHNpbXVsYXRlCiAgKiBjaXJjdWxhciBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBtd2lmaWV4XzExbl9zY2FuX2FuZF9kaXNwYXRjaChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgICAgc3RydWN0IG13aWZpZXhfcnhfcmVvcmRlcl90YmwgKnJ4X3Jlb3JfdGJsX3B0cikKIHsKQEAgLTExOSw3ICsxMTcsNiBAQAogCXJ4X3Jlb3JfdGJsX3B0ci0+c3RhcnRfd2luID0gKHJ4X3Jlb3JfdGJsX3B0ci0+c3RhcnRfd2luICsgaSkKIAkJJihNQVhfVElEX1ZBTFVFIC0gMSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfcGt0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQwNSw3ICs0MDIsNyBAQAogCQkJCXU4ICp0YSwgdTggcGt0X3R5cGUsIHZvaWQgKnBheWxvYWQpCiB7CiAJc3RydWN0IG13aWZpZXhfcnhfcmVvcmRlcl90YmwgKnJ4X3Jlb3JfdGJsX3B0cjsKLQlpbnQgc3RhcnRfd2luLCBlbmRfd2luLCB3aW5fc2l6ZSwgcmV0OworCWludCBzdGFydF93aW4sIGVuZF93aW4sIHdpbl9zaXplOwogCXUxNiBwa3RfaW5kZXg7CiAKIAlyeF9yZW9yX3RibF9wdHIgPQpAQCAtNDUyLDExICs0NDksOCBAQAogCQkJc3RhcnRfd2luID0gKGVuZF93aW4gLSB3aW5fc2l6ZSkgKyAxOwogCQllbHNlCiAJCQlzdGFydF93aW4gPSAoTUFYX1RJRF9WQUxVRSAtICh3aW5fc2l6ZSAtIHNlcV9udW0pKSArIDE7Ci0JCXJldCA9IG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdF91bnRpbF9zdGFydF93aW4ocHJpdiwKKwkJbXdpZmlleF8xMW5fZGlzcGF0Y2hfcGt0X3VudGlsX3N0YXJ0X3dpbihwcml2LAogCQkJCQkJcnhfcmVvcl90YmxfcHRyLCBzdGFydF93aW4pOwotCi0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChwa3RfdHlwZSAhPSBQS1RfVFlQRV9CQVIpIHsKQEAgLTQ3NSw5ICs0NjksOSBAQAogCSAqIERpc3BhdGNoIGFsbCBwYWNrZXRzIHNlcXVlbnRpYWxseSBmcm9tIHN0YXJ0X3dpbiB1bnRpbCBhCiAJICogaG9sZSBpcyBmb3VuZCBhbmQgYWRqdXN0IHRoZSBzdGFydF93aW4gYXBwcm9wcmlhdGVseQogCSAqLwotCXJldCA9IG13aWZpZXhfMTFuX3NjYW5fYW5kX2Rpc3BhdGNoKHByaXYsIHJ4X3Jlb3JfdGJsX3B0cik7CisJbXdpZmlleF8xMW5fc2Nhbl9hbmRfZGlzcGF0Y2gocHJpdiwgcnhfcmVvcl90YmxfcHRyKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L0tjb25maWcKaW5kZXggOGYyNzk3YS4uMmEwNzhjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvS2NvbmZpZwpAQCAtMTAsMTIgKzEwLDEyIEBACiAJICBtd2lmaWV4LgogCiBjb25maWcgTVdJRklFWF9TRElPCi0JdHJpc3RhdGUgIk1hcnZlbGwgV2lGaS1FeCBEcml2ZXIgZm9yIFNEODc4NyIKKwl0cmlzdGF0ZSAiTWFydmVsbCBXaUZpLUV4IERyaXZlciBmb3IgU0Q4Nzg3L1NEODc5NyIKIAlkZXBlbmRzIG9uIE1XSUZJRVggJiYgTU1DCiAJc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbiBNYXJ2ZWxsCi0JICA4Nzg3IGNoaXBzZXQgd2l0aCBTRElPIGludGVyZmFjZS4KKwkgIDg3ODcvODc5NyBjaGlwc2V0cyB3aXRoIFNESU8gaW50ZXJmYWNlLgogCiAJICBJZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZAogCSAgbXdpZmlleF9zZGlvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCmluZGV4IDQ2MmM3MTAuLjc4N2RiZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKQEAgLTEyMCwxMCArMTIwLDExIEBACiBzdGF0aWMgaW50CiBtd2lmaWV4X2NmZzgwMjExX3NldF90eF9wb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJICAgICAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwKLQkJCSAgICAgIGludCBkYm0pCisJCQkgICAgICBpbnQgbWJtKQogewogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X2NmZzgwMjExX2dldF9wcml2KHdpcGh5KTsKIAlzdHJ1Y3QgbXdpZmlleF9wb3dlcl9jZmcgcG93ZXJfY2ZnOworCWludCBkYm0gPSBNQk1fVE9fREJNKG1ibSk7CiAKIAlpZiAodHlwZSA9PSBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEKSB7CiAJCXBvd2VyX2NmZy5pc19wb3dlcl9hdXRvID0gMDsKQEAgLTc1MCwxNyArNzUxLDEzIEBACiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+ZGlzY29ubmVjdCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXByaXYtPmRpc2Nvbm5lY3QgPSAxOwogCWlmIChtd2lmaWV4X2RlYXV0aGVudGljYXRlKHByaXYsIE5VTEwpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXdpcGh5X2RiZyh3aXBoeSwgImluZm86IHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0ZWQgZnJvbSAlcE06IgogCQkiIHJlYXNvbiBjb2RlICVkXG4iLCBwcml2LT5jZmdfYnNzaWQsIHJlYXNvbl9jb2RlKTsKIAotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7CisJbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03ODAsNiArNzc3LDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IG13aWZpZXhfYnNzX2luZm8gYnNzX2luZm87CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCWludCBpZV9sZW47CiAJdTggaWVfYnVmW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyBzaXplb2Yoc3RydWN0IGllZWVfdHlwZXNfaGVhZGVyKV07CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwpAQCAtODAwLDkgKzc5OCwxMCBAQAogCQkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGJzc19pbmZvLmJzc19jaGFuLAogCQkJCQkJICAgICAgIGJhbmQpKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi0+d2lwaHksIGNoYW4sCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwgY2hhbiwKIAkJYnNzX2luZm8uYnNzaWQsIDAsIFdMQU5fQ0FQQUJJTElUWV9JQlNTLAogCQkwLCBpZV9idWYsIGllX2xlbiwgMCwgR0ZQX0tFUk5FTCk7CisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOwogCW1lbWNweShwcml2LT5jZmdfYnNzaWQsIGJzc19pbmZvLmJzc2lkLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKQEAgLTk3OCwyNyArOTc3LDMyIEBACiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAocHJpdi0+YXNzb2NfcmVxdWVzdCkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCWlmIChwcml2LT5ic3NfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQl3aXBoeV9lcnIod2lwaHksICJyZWNlaXZlZCBpbmZyYSBhc3NvYyByZXF1ZXN0ICIKIAkJCQkid2hlbiBzdGF0aW9uIGlzIGluIGlic3MgbW9kZVxuIik7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlwcml2LT5hc3NvY19yZXF1ZXN0ID0gLUVJTlBST0dSRVNTOwotCiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogVHJ5aW5nIHRvIGFzc29jaWF0ZSB0byAlcyBhbmQgYnNzaWQgJXBNXG4iLAogCSAgICAgICAoY2hhciAqKSBzbWUtPnNzaWQsIHNtZS0+YnNzaWQpOwogCiAJcmV0ID0gbXdpZmlleF9jZmc4MDIxMV9hc3NvYyhwcml2LCBzbWUtPnNzaWRfbGVuLCBzbWUtPnNzaWQsIHNtZS0+YnNzaWQsCiAJCQkJICAgICBwcml2LT5ic3NfbW9kZSwgc21lLT5jaGFubmVsLCBzbWUsIDApOwotCi0JcHJpdi0+YXNzb2NfcmVxdWVzdCA9IDE7CiBkb25lOgotCXByaXYtPmFzc29jX3Jlc3VsdCA9IHJldDsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmNmZ193b3JrcXVldWUpOworCWlmICghcmV0KSB7CisJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHByaXYtPm5ldGRldiwgcHJpdi0+Y2ZnX2Jzc2lkLCBOVUxMLCAwLAorCQkJCQlOVUxMLCAwLCBXTEFOX1NUQVRVU19TVUNDRVNTLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsCisJCQkiaW5mbzogYXNzb2NpYXRlZCB0byBic3NpZCAlcE0gc3VjY2Vzc2Z1bGx5XG4iLAorCQkJcHJpdi0+Y2ZnX2Jzc2lkKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCSJpbmZvOiBhc3NvY2lhdGlvbiB0byBic3NpZCAlcE0gZmFpbGVkXG4iLAorCQkJcHJpdi0+Y2ZnX2Jzc2lkKTsKKwkJbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMTUsMjggKzEwMTksMjkgQEAKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9jZmc4MDIxMV9nZXRfcHJpdih3aXBoeSk7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAocHJpdi0+aWJzc19qb2luX3JlcXVlc3QpCi0JCXJldHVybiAtRUJVU1k7Ci0KIAlpZiAocHJpdi0+YnNzX21vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAicmVxdWVzdCB0byBqb2luIGlic3MgcmVjZWl2ZWQgIgogCQkJCSJ3aGVuIHN0YXRpb24gaXMgbm90IGluIGlic3MgbW9kZVxuIik7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlwcml2LT5pYnNzX2pvaW5fcmVxdWVzdCA9IC1FSU5QUk9HUkVTUzsKLQogCXdpcGh5X2RiZyh3aXBoeSwgImluZm86IHRyeWluZyB0byBqb2luIHRvICVzIGFuZCBic3NpZCAlcE1cbiIsCiAJICAgICAgIChjaGFyICopIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5ic3NpZCk7CiAKIAlyZXQgPSBtd2lmaWV4X2NmZzgwMjExX2Fzc29jKHByaXYsIHBhcmFtcy0+c3NpZF9sZW4sIHBhcmFtcy0+c3NpZCwKIAkJCQlwYXJhbXMtPmJzc2lkLCBwcml2LT5ic3NfbW9kZSwKIAkJCQlwYXJhbXMtPmNoYW5uZWwsIE5VTEwsIHBhcmFtcy0+cHJpdmFjeSk7Ci0KLQlwcml2LT5pYnNzX2pvaW5fcmVxdWVzdCA9IDE7CiBkb25lOgotCXByaXYtPmlic3Nfam9pbl9yZXN1bHQgPSByZXQ7Ci0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5jZmdfd29ya3F1ZXVlKTsKKwlpZiAoIXJldCkgeworCQljZmc4MDIxMV9pYnNzX2pvaW5lZChwcml2LT5uZXRkZXYsIHByaXYtPmNmZ19ic3NpZCwgR0ZQX0tFUk5FTCk7CisJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAorCQkJImluZm86IGpvaW5lZC9jcmVhdGVkIGFkaG9jIG5ldHdvcmsgd2l0aCBic3NpZCIKKwkJCSIgJXBNIHN1Y2Nlc3NmdWxseVxuIiwgcHJpdi0+Y2ZnX2Jzc2lkKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCSJpbmZvOiBmYWlsZWQgY3JlYXRpbmcvam9pbmluZyBhZGhvYyBuZXR3b3JrXG4iKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDUxLDE3ICsxMDU2LDEyIEBACiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfY2ZnODAyMTFfZ2V0X3ByaXYod2lwaHkpOwogCi0JaWYgKHByaXYtPmRpc2Nvbm5lY3QpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlwcml2LT5kaXNjb25uZWN0ID0gMTsKLQogCXdpcGh5X2RiZyh3aXBoeSwgImluZm86IGRpc2Nvbm5lY3RpbmcgZnJvbSBlc3NpZCAlcE1cbiIsCiAJCQlwcml2LT5jZmdfYnNzaWQpOwogCWlmIChtd2lmaWV4X2RlYXV0aGVudGljYXRlKHByaXYsIE5VTEwpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7CisJbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDc4LDE1ICsxMDc4LDQyIEBACiAJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7CisJaW50IGk7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogcmVjZWl2ZWQgc2NhbiByZXF1ZXN0IG9uICVzXG4iLCBkZXYtPm5hbWUpOwogCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdCAmJiBwcml2LT5zY2FuX3JlcXVlc3QgIT0gcmVxdWVzdCkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcXVlc3Q7CiAKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmNmZ193b3JrcXVldWUpOworCXByaXYtPnVzZXJfc2Nhbl9jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXdpZmlleF91c2VyX3NjYW5fY2ZnKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT51c2VyX3NjYW5fY2ZnKSB7CisJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIHNjYW5fcmVxXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJbWVtY3B5KHByaXYtPnVzZXJfc2Nhbl9jZmctPnNzaWRfbGlzdFtpXS5zc2lkLAorCQkJcmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwgcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOworCQlwcml2LT51c2VyX3NjYW5fY2ZnLT5zc2lkX2xpc3RbaV0ubWF4X2xlbiA9CisJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbjsKKwl9CisJZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gcmVxdWVzdC0+Y2hhbm5lbHNbaV07CisJCXByaXYtPnVzZXJfc2Nhbl9jZmctPmNoYW5fbGlzdFtpXS5jaGFuX251bWJlciA9IGNoYW4tPmh3X3ZhbHVlOworCQlwcml2LT51c2VyX3NjYW5fY2ZnLT5jaGFuX2xpc3RbaV0ucmFkaW9fdHlwZSA9IGNoYW4tPmJhbmQ7CisKKwkJaWYgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKQorCQkJcHJpdi0+dXNlcl9zY2FuX2NmZy0+Y2hhbl9saXN0W2ldLnNjYW5fdHlwZSA9CisJCQkJTVdJRklFWF9TQ0FOX1RZUEVfUEFTU0lWRTsKKwkJZWxzZQorCQkJcHJpdi0+dXNlcl9zY2FuX2NmZy0+Y2hhbl9saXN0W2ldLnNjYW5fdHlwZSA9CisJCQkJTVdJRklFWF9TQ0FOX1RZUEVfQUNUSVZFOworCisJCXByaXYtPnVzZXJfc2Nhbl9jZmctPmNoYW5fbGlzdFtpXS5zY2FuX3RpbWUgPSAwOworCX0KKwlpZiAobXdpZmlleF9zZXRfdXNlcl9zY2FuX2lvY3RsKHByaXYsIHByaXYtPnVzZXJfc2Nhbl9jZmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMjkyLDEwICsxMzE5LDYgQEAKIAogCXByaXYtPm1lZGlhX2Nvbm5lY3RlZCA9IGZhbHNlOwogCi0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7Ci0JZmx1c2hfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQogCXByaXYtPmJzc19tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNzMsOSArMTM5Niw2IEBACiAJbWVtY3B5KHdkZXYtPndpcGh5LT5wZXJtX2FkZHIsIHByaXYtPmN1cnJfYWRkciwgRVRIX0FMRU4pOwogCXdkZXYtPndpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKIAotCS8qIFdlIGFyZSB1c2luZyBjdXN0b20gZG9tYWlucyAqLwotCXdkZXYtPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZOwotCiAJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgYnNzIGJhbmQgaW5mb3JtYXRpb24gKi8KIAl3ZGV2LT53aXBoeS0+YnNzX3ByaXZfc2l6ZSA9IHNpemVvZih1OCk7CiAKQEAgLTE0MDQsMTAwICsxNDI0LDMgQEAKIAogCXJldHVybiByZXQ7CiB9Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIHJlc3VsdCBvZiBkaWZmZXJlbnQgcGVuZGluZyBuZXR3b3JrIG9wZXJhdGlvbnMuCi0gKgotICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGFuZCBDRkc4MDIuMTEgc3Vic3lzdGVtIGlzCi0gKiBub3RpZmllZCBhY2NvcmRpbmdseSAtCi0gKiAgICAgIC0gU2NhbiByZXF1ZXN0IGNvbXBsZXRpb24KLSAqICAgICAgLSBBc3NvY2lhdGlvbiByZXF1ZXN0IGNvbXBsZXRpb24KLSAqICAgICAgLSBJQlNTIGpvaW4gcmVxdWVzdCBjb21wbGV0aW9uCi0gKiAgICAgIC0gRGlzY29ubmVjdCByZXF1ZXN0IGNvbXBsZXRpb24KLSAqLwotdm9pZAotbXdpZmlleF9jZmc4MDIxMV9yZXN1bHRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUsIGNmZ193b3JrcXVldWUpOwotCXN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jZmcgKnNjYW5fcmVxOwotCWludCByZXQgPSAwLCBpOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKLQotCWlmIChwcml2LT5zY2FuX3JlcXVlc3QpIHsKLQkJc2Nhbl9yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXdpZmlleF91c2VyX3NjYW5fY2ZnKSwKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzY2FuX3JlcSkgewotCQkJZGV2X2Vycihwcml2LT5hZGFwdGVyLT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgIgotCQkJCQkJICAgICJzY2FuX3JlcVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkczsgaSsrKSB7Ci0JCQltZW1jcHkoc2Nhbl9yZXEtPnNzaWRfbGlzdFtpXS5zc2lkLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCi0JCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pOwotCQkJc2Nhbl9yZXEtPnNzaWRfbGlzdFtpXS5tYXhfbGVuID0KLQkJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKLQkJCWNoYW4gPSBwcml2LT5zY2FuX3JlcXVlc3QtPmNoYW5uZWxzW2ldOwotCQkJc2Nhbl9yZXEtPmNoYW5fbGlzdFtpXS5jaGFuX251bWJlciA9IGNoYW4tPmh3X3ZhbHVlOwotCQkJc2Nhbl9yZXEtPmNoYW5fbGlzdFtpXS5yYWRpb190eXBlID0gY2hhbi0+YmFuZDsKLQkJCWlmIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKQotCQkJCXNjYW5fcmVxLT5jaGFuX2xpc3RbaV0uc2Nhbl90eXBlID0KLQkJCQkJTVdJRklFWF9TQ0FOX1RZUEVfUEFTU0lWRTsKLQkJCWVsc2UKLQkJCQlzY2FuX3JlcS0+Y2hhbl9saXN0W2ldLnNjYW5fdHlwZSA9Ci0JCQkJCU1XSUZJRVhfU0NBTl9UWVBFX0FDVElWRTsKLQkJCXNjYW5fcmVxLT5jaGFuX2xpc3RbaV0uc2Nhbl90aW1lID0gMDsKLQkJfQotCQlpZiAobXdpZmlleF9zZXRfdXNlcl9zY2FuX2lvY3RsKHByaXYsIHNjYW5fcmVxKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCXByaXYtPnNjYW5fcmVzdWx0X3N0YXR1cyA9IHJldDsKLQkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJpbmZvOiAlczogc2VuZGluZyBzY2FuIHJlc3VsdHNcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQljZmc4MDIxMV9zY2FuX2RvbmUocHJpdi0+c2Nhbl9yZXF1ZXN0LAotCQkJCShwcml2LT5zY2FuX3Jlc3VsdF9zdGF0dXMgPCAwKSk7Ci0JCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JCWtmcmVlKHNjYW5fcmVxKTsKLQl9Ci0KLQlpZiAocHJpdi0+YXNzb2NfcmVxdWVzdCA9PSAxKSB7Ci0JCWlmICghcHJpdi0+YXNzb2NfcmVzdWx0KSB7Ci0JCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChwcml2LT5uZXRkZXYsIHByaXYtPmNmZ19ic3NpZCwKLQkJCQkJCU5VTEwsIDAsIE5VTEwsIDAsCi0JCQkJCQlXTEFOX1NUQVRVU19TVUNDRVNTLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKLQkJCQkiaW5mbzogYXNzb2NpYXRlZCB0byBic3NpZCAlcE0gc3VjY2Vzc2Z1bGx5XG4iLAotCQkJICAgICAgIHByaXYtPmNmZ19ic3NpZCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKLQkJCQkiaW5mbzogYXNzb2NpYXRpb24gdG8gYnNzaWQgJXBNIGZhaWxlZFxuIiwKLQkJCSAgICAgICBwcml2LT5jZmdfYnNzaWQpOwotCQkJbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOwotCQl9Ci0JCXByaXYtPmFzc29jX3JlcXVlc3QgPSAwOwotCQlwcml2LT5hc3NvY19yZXN1bHQgPSAwOwotCX0KLQotCWlmIChwcml2LT5pYnNzX2pvaW5fcmVxdWVzdCA9PSAxKSB7Ci0JCWlmICghcHJpdi0+aWJzc19qb2luX3Jlc3VsdCkgewotCQkJY2ZnODAyMTFfaWJzc19qb2luZWQocHJpdi0+bmV0ZGV2LCBwcml2LT5jZmdfYnNzaWQsCi0JCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKLQkJCQkiaW5mbzogam9pbmVkL2NyZWF0ZWQgYWRob2MgbmV0d29yayB3aXRoIGJzc2lkIgotCQkJCQkiICVwTSBzdWNjZXNzZnVsbHlcbiIsIHByaXYtPmNmZ19ic3NpZCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKLQkJCQkiaW5mbzogZmFpbGVkIGNyZWF0aW5nL2pvaW5pbmcgYWRob2MgbmV0d29ya1xuIik7Ci0JCX0KLQkJcHJpdi0+aWJzc19qb2luX3JlcXVlc3QgPSAwOwotCQlwcml2LT5pYnNzX2pvaW5fcmVzdWx0ID0gMDsKLQl9Ci0KLQlpZiAocHJpdi0+ZGlzY29ubmVjdCkgewotCQltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7Ci0JCXByaXYtPmRpc2Nvbm5lY3QgPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuaAppbmRleCA4ZDAxMGYyLi43NmM3NmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5oCkBAIC0yNiw1ICsyNiw0IEBACiAKIGludCBtd2lmaWV4X3JlZ2lzdGVyX2NmZzgwMjExKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKik7CiAKLXZvaWQgbXdpZmlleF9jZmc4MDIxMV9yZXN1bHRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmcC5jCmluZGV4IGYyZTZkZTAuLjE3ODJhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZnAuYwpAQCAtNzUsMTggKzc1LDMyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIG1hcHMgYW4gaW5kZXggaW4gc3VwcG9ydGVkIHJhdGVzIHRhYmxlIGludG8KICAqIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmF0ZS4KICAqLwotdTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4LCB1OCBodF9pbmZvKQordTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4IGluZGV4LAorCQkJCQkJCXU4IGh0X2luZm8pCiB7Ci0JdTE2IG1jc19yYXRlWzRdWzhdID0gewotCQl7MHgxYiwgMHgzNiwgMHg1MSwgMHg2YywgMHhhMiwgMHhkOCwgMHhmMywgMHgxMGV9Ci0JLAkJCS8qIExHIDQwTSAqLwotCXsweDFlLCAweDNjLCAweDVhLCAweDc4LCAweGI0LCAweGYwLCAweDEwZSwgMHgxMmN9Ci0JLAkJCS8qIFNHIDQwTSAqLwotCXsweDBkLCAweDFhLCAweDI3LCAweDM0LCAweDRlLCAweDY4LCAweDc1LCAweDgyfQotCSwJCQkvKiBMRyAyME0gKi8KLQl7MHgwZSwgMHgxYywgMHgyYiwgMHgzOSwgMHg1NiwgMHg3MywgMHg4MiwgMHg5MH0KLQl9OwkJCS8qIFNHIDIwTSAqLworCS8qCisJICogRm9yIGV2ZXJ5IG1jc19yYXRlIGxpbmUsIHRoZSBmaXJzdCA4IGJ5dGVzIGFyZSBmb3Igc3RyZWFtIDF4MSwKKwkgKiBhbmQgYWxsIDE2IGJ5dGVzIGFyZSBmb3Igc3RyZWFtIDJ4Mi4KKwkgKi8KKwl1MTYgIG1jc19yYXRlWzRdWzE2XSA9IHsKKwkJLyogTEdJIDQwTSAqLworCQl7IDB4MWIsIDB4MzYsIDB4NTEsIDB4NmMsIDB4YTIsIDB4ZDgsIDB4ZjMsIDB4MTBlLAorCQkgIDB4MzYsIDB4NmMsIDB4YTIsIDB4ZDgsIDB4MTQ0LCAweDFiMCwgMHgxZTYsIDB4MjFjIH0sCiAKKwkJLyogU0dJIDQwTSAqLworCQl7IDB4MWUsIDB4M2MsIDB4NWEsIDB4NzgsIDB4YjQsIDB4ZjAsIDB4MTBlLCAweDEyYywKKwkJICAweDNjLCAweDc4LCAweGI0LCAweGYwLCAweDE2OCwgMHgxZTAsIDB4MjFjLCAweDI1OCB9LAorCisJCS8qIExHSSAyME0gKi8KKwkJeyAweDBkLCAweDFhLCAweDI3LCAweDM0LCAweDRlLCAweDY4LCAweDc1LCAweDgyLAorCQkgIDB4MWEsIDB4MzQsIDB4NGUsIDB4NjgsIDB4OWMsIDB4ZDAsIDB4ZWEsIDB4MTA0IH0sCisKKwkJLyogU0dJIDIwTSAqLworCQl7IDB4MGUsIDB4MWMsIDB4MmIsIDB4MzksIDB4NTYsIDB4NzMsIDB4ODIsIDB4OTAsCisJCSAgMHgxYywgMHgzOSwgMHg1NiwgMHg3MywgMHhhZCwgMHhlNywgMHgxMDQsIDB4MTIwIH0KKwl9OworCXUzMiBtY3NfbnVtX3N1cHAgPQorCQkocHJpdi0+YWRhcHRlci0+aHdfZGV2X21jc19zdXBwb3J0ID09IEhUX1NUUkVBTV8yWDIpID8gMTYgOiA4OwogCXUzMiByYXRlOwogCiAJaWYgKGh0X2luZm8gJiBCSVQoMCkpIHsKQEAgLTk1LDcgKzEwOSw3IEBACiAJCQkJcmF0ZSA9IDB4MEQ7CS8qIE1DUyAzMiBTR0kgcmF0ZSAqLwogCQkJZWxzZQogCQkJCXJhdGUgPSAweDBDOwkvKiBNQ1MgMzIgTEdJIHJhdGUgKi8KLQkJfSBlbHNlIGlmIChpbmRleCA8IDgpIHsKKwkJfSBlbHNlIGlmIChpbmRleCA8IG1jc19udW1fc3VwcCkgewogCQkJaWYgKGh0X2luZm8gJiBCSVQoMSkpIHsKIAkJCQlpZiAoaHRfaW5mbyAmIEJJVCgyKSkKIAkJCQkJLyogU0dJLCA0ME0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NtZGV2dC5jCmluZGV4IGFjMjc4MTUuLjZlMGEzZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jbWRldnQuYwpAQCAtOTM5LDcgKzkzOSw2IEBACiB7CiAJc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZF9ub2RlID0gTlVMTCwgKnRtcF9ub2RlID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGNtZF9mbGFnczsKLQl1bnNpZ25lZCBsb25nIGNtZF9wZW5kaW5nX3FfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBzY2FuX3BlbmRpbmdfcV9mbGFnczsKIAl1aW50MTZfdCBjYW5jZWxfc2Nhbl9jbWQgPSBmYWxzZTsKIApAQCAtOTQ5LDEyICs5NDgsOSBAQAogCQljbWRfbm9kZSA9IGFkYXB0ZXItPmN1cnJfY21kOwogCQljbWRfbm9kZS0+d2FpdF9xX2VuYWJsZWQgPSBmYWxzZTsKIAkJY21kX25vZGUtPmNtZF9mbGFnIHw9IENNRF9GX0NBTkNFTEVEOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Y21kX3BlbmRpbmdfcV9sb2NrLAotCQkJCSAgY21kX3BlbmRpbmdfcV9mbGFncyk7Ci0JCWxpc3RfZGVsKCZjbWRfbm9kZS0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmNtZF9wZW5kaW5nX3FfbG9jaywKLQkJCQkgICAgICAgY21kX3BlbmRpbmdfcV9mbGFncyk7CiAJCW13aWZpZXhfaW5zZXJ0X2NtZF90b19mcmVlX3EoYWRhcHRlciwgY21kX25vZGUpOworCQltd2lmaWV4X2NvbXBsZXRlX2NtZChhZGFwdGVyLCBhZGFwdGVyLT5jdXJyX2NtZCk7CisJCWFkYXB0ZXItPmN1cnJfY21kID0gTlVMTDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bXdpZmlleF9jbWRfbG9jaywgY21kX2ZsYWdzKTsKIAl9CiAKQEAgLTk4MSw3ICs5NzcsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5td2lmaWV4X2NtZF9sb2NrLCBjbWRfZmxhZ3MpOwogCX0KIAlhZGFwdGVyLT5jbWRfd2FpdF9xLnN0YXR1cyA9IC0xOwotCW13aWZpZXhfY29tcGxldGVfY21kKGFkYXB0ZXIsIGFkYXB0ZXItPmN1cnJfY21kKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAppbmRleCAwY2M1ZDczLi42MmI4NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCkBAIC0xNjUsNiArMTY1LDcgQEAKIAogI2RlZmluZSBHRVRfUlhNQ1NTVVBQKERldk1DU1N1cHBvcnRlZCkgKERldk1DU1N1cHBvcnRlZCAmIDB4MGYpCiAjZGVmaW5lIFNFVEhUX01DUzMyKHgpICh4WzRdIHw9IDEpCisjZGVmaW5lIEhUX1NUUkVBTV8yWDIJMHgyMgogCiAjZGVmaW5lIFNFVF9TRUNPTkRBUllDSEFOKFJhZGlvVHlwZSwgU0VDQ0hBTikgKFJhZGlvVHlwZSB8PSAoU0VDQ0hBTiA8PCA0KSkKIApAQCAtNjczLDcgKzY3NCw3IEBACiAJdW5pb24gaWVlZV90eXBlc19waHlfcGFyYW1fc2V0IHBoeV9wYXJhbV9zZXQ7CiAJdTE2IHJlc2VydmVkMTsKIAlfX2xlMTYgY2FwX2luZm9fYml0bWFwOwotCXU4IERhdGFSYXRlW0hPU1RDTURfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBkYXRhX3JhdGVbSE9TVENNRF9TVVBQT1JURURfUkFURVNdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RfY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKaW5kZXggZDc5MmIzZi4uMjQ0YzcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMKQEAgLTE4Nyw4ICsxODcsNiBAQAogCXN0cnVjdCBtd2lmaWV4X29wdF9zbGVlcF9jb25maXJtICpzbGVlcF9jZm1fYnVmID0gTlVMTDsKIAogCXNrYl9wdXQoYWRhcHRlci0+c2xlZXBfY2ZtLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0pKTsKLQlzbGVlcF9jZm1fYnVmID0gKHN0cnVjdCBtd2lmaWV4X29wdF9zbGVlcF9jb25maXJtICopCi0JCQkJCQkoYWRhcHRlci0+c2xlZXBfY2ZtLT5kYXRhKTsKIAogCWFkYXB0ZXItPmNtZF9zZW50ID0gZmFsc2U7CiAKQEAgLTI1NCw2ICsyNTIsOCBAQAogCW13aWZpZXhfd21tX2luaXQoYWRhcHRlcik7CiAKIAlpZiAoYWRhcHRlci0+c2xlZXBfY2ZtKSB7CisJCXNsZWVwX2NmbV9idWYgPSAoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0gKikKKwkJCQkJCWFkYXB0ZXItPnNsZWVwX2NmbS0+ZGF0YTsKIAkJbWVtc2V0KHNsZWVwX2NmbV9idWYsIDAsIGFkYXB0ZXItPnNsZWVwX2NmbS0+bGVuKTsKIAkJc2xlZXBfY2ZtX2J1Zi0+Y29tbWFuZCA9CiAJCQkJY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfODAyXzExX1BTX01PREVfRU5IKTsKQEAgLTI4Myw2ICsyODMsNDUgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0cmFuc19zdGFydCBwZXIgdHhfcXVldWUKKyAqLwordm9pZCBtd2lmaWV4X3NldF90cmFuc19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3R4X3F1ZXVlczsgaSsrKQorCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSktPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3YWtlcyB1cCBhbGwgcXVldWVzIGluIG5ldF9kZXZpY2UKKyAqLwordm9pZCBtd2lmaWV4X3dha2VfdXBfbmV0X2Rldl9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgZGV2X3F1ZXVlX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnF1ZXVlX2xvY2ssIGRldl9xdWV1ZV9mbGFncyk7CisJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG5ldGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cXVldWVfbG9jaywgZGV2X3F1ZXVlX2ZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc3RvcHMgYWxsIHF1ZXVlcyBpbiBuZXRfZGV2aWNlCisgKi8KK3ZvaWQgbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGRldl9xdWV1ZV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5xdWV1ZV9sb2NrLCBkZXZfcXVldWVfZmxhZ3MpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnF1ZXVlX2xvY2ssIGRldl9xdWV1ZV9mbGFncyk7Cit9CisKKy8qCiAgKiAgVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgbG9jayB2YXJpYWJsZXMgYW5kIGZyZWVzIHRoZSBsb2NrcyBhbmQKICAqICBhc3NvY2lhdGVkIGxvY2tzLgogICovCkBAIC0zNTksNiArMzk4LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aW50X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tYWluX3Byb2NfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm13aWZpZXhfY21kX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5xdWV1ZV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgewogCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgewogCQkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2pvaW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCmluZGV4IDYyYjRjMjkuLjFjNDk4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCkBAIC03MjQsOCArNzI0LDggQEAKIAl1MzIgY21kX2FwcGVuZF9zaXplID0gMDsKIAl1MzIgaTsKIAl1MTYgdG1wX2NhcDsKLQl1aW50MTZfdCBodF9jYXBfaW5mbzsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19jaGFuX2xpc3RfcGFyYW1fc2V0ICpjaGFuX3RsdjsKKwl1OCByYWRpb190eXBlOwogCiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXAgKmh0X2NhcDsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8gKmh0X2luZm87CkBAIC04MzcsOCArODM3LDggQEAKIAkJYnNzX2Rlc2MtPnByaXZhY3kgPSBNV0lGSUVYXzgwMl8xMV9QUklWX0ZJTFRFUl9BQ0NFUFRfQUxMOwogCX0KIAotCW1lbXNldChhZGhvY19zdGFydC0+RGF0YVJhdGUsIDAsIHNpemVvZihhZGhvY19zdGFydC0+RGF0YVJhdGUpKTsKLQltd2lmaWV4X2dldF9hY3RpdmVfZGF0YV9yYXRlcyhwcml2LCBhZGhvY19zdGFydC0+RGF0YVJhdGUpOworCW1lbXNldChhZGhvY19zdGFydC0+ZGF0YV9yYXRlLCAwLCBzaXplb2YoYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZSkpOworCW13aWZpZXhfZ2V0X2FjdGl2ZV9kYXRhX3JhdGVzKHByaXYsIGFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUpOwogCWlmICgoYWRhcHRlci0+YWRob2Nfc3RhcnRfYmFuZCAmIEJBTkRfRykgJiYKIAkgICAgKHByaXYtPmN1cnJfcGt0X2ZpbHRlciAmIEhvc3RDbWRfQUNUX01BQ19BREhPQ19HX1BST1RFQ1RJT05fT04pKSB7CiAJCWlmIChtd2lmaWV4X3NlbmRfY21kX2FzeW5jKHByaXYsIEhvc3RDbWRfQ01EX01BQ19DT05UUk9MLApAQCAtODUwLDIwICs4NTAsMTkgQEAKIAkJfQogCX0KIAkvKiBGaW5kIHRoZSBsYXN0IG5vbiB6ZXJvICovCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGhvY19zdGFydC0+RGF0YVJhdGUpICYmCi0JCQlhZGhvY19zdGFydC0+RGF0YVJhdGVbaV07Ci0JCQlpKyspCi0JCQk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGhvY19zdGFydC0+ZGF0YV9yYXRlKTsgaSsrKQorCQlpZiAoIWFkaG9jX3N0YXJ0LT5kYXRhX3JhdGVbaV0pCisJCQlicmVhazsKIAogCXByaXYtPmN1cnJfYnNzX3BhcmFtcy5udW1fb2ZfcmF0ZXMgPSBpOwogCiAJLyogQ29weSB0aGUgYWQtaG9jIGNyZWF0aW5nIHJhdGVzIGludG8gQ3VycmVudCBCU1MgcmF0ZSBzdHJ1Y3R1cmUgKi8KIAltZW1jcHkoJnByaXYtPmN1cnJfYnNzX3BhcmFtcy5kYXRhX3JhdGVzLAotCSAgICAgICAmYWRob2Nfc3RhcnQtPkRhdGFSYXRlLCBwcml2LT5jdXJyX2Jzc19wYXJhbXMubnVtX29mX3JhdGVzKTsKKwkgICAgICAgJmFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUsIHByaXYtPmN1cnJfYnNzX3BhcmFtcy5udW1fb2ZfcmF0ZXMpOwogCiAJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBBREhPQ19TX0NNRDogcmF0ZXM9JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkgICAgICAgYWRob2Nfc3RhcnQtPkRhdGFSYXRlWzBdLCBhZGhvY19zdGFydC0+RGF0YVJhdGVbMV0sCi0JICAgICAgIGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZVsyXSwgYWRob2Nfc3RhcnQtPkRhdGFSYXRlWzNdKTsKKwkgICAgICAgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVswXSwgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVsxXSwKKwkgICAgICAgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVsyXSwgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVszXSk7CiAKIAlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IEFESE9DX1NfQ01EOiBBRC1IT0MgU3RhcnQgY29tbWFuZCBpcyByZWFkeVxuIik7CiAKQEAgLTkxNCw1NSArOTEzLDQwIEBACiAJfQogCiAJaWYgKGFkYXB0ZXItPmFkaG9jXzExbl9lbmFibGVkKSB7Ci0JCXsKLQkJCWh0X2NhcCA9IChzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCAqKSBwb3M7Ci0JCQltZW1zZXQoaHRfY2FwLCAwLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCkpOwotCQkJaHRfY2FwLT5oZWFkZXIudHlwZSA9Ci0JCQkJY3B1X3RvX2xlMTYoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSk7Ci0JCQlodF9jYXAtPmhlYWRlci5sZW4gPQotCQkJICAgICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCQkJaHRfY2FwX2luZm8gPSBsZTE2X3RvX2NwdShodF9jYXAtPmh0X2NhcC5jYXBfaW5mbyk7CisJCS8qIEZpbGwgSFQgQ0FQQUJJTElUWSAqLworCQlodF9jYXAgPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXAgKikgcG9zOworCQltZW1zZXQoaHRfY2FwLCAwLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApKTsKKwkJaHRfY2FwLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFdMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOworCQlodF9jYXAtPmhlYWRlci5sZW4gPQorCQkgICAgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CisJCXJhZGlvX3R5cGUgPSBtd2lmaWV4X2JhbmRfdG9fcmFkaW9fdHlwZSgKKwkJCQkJcHJpdi0+YWRhcHRlci0+Y29uZmlnX2JhbmRzKTsKKwkJbXdpZmlleF9maWxsX2NhcF9pbmZvKHByaXYsIHJhZGlvX3R5cGUsIGh0X2NhcCk7CiAKLQkJCWh0X2NhcF9pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwotCQkJaWYgKGFkYXB0ZXItPmNoYW5fb2Zmc2V0KSB7Ci0JCQkJaHRfY2FwX2luZm8gfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7Ci0JCQkJaHRfY2FwX2luZm8gfD0gSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDA7Ci0JCQkJaHRfY2FwX2luZm8gfD0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7Ci0JCQkJU0VUSFRfTUNTMzIoaHRfY2FwLT5odF9jYXAubWNzLnJ4X21hc2spOwotCQkJfQorCQlwb3MgKz0gc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKTsKKwkJY21kX2FwcGVuZF9zaXplICs9CisJCQlzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApOwogCi0JCQlodF9jYXAtPmh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbwotCQkJCQk9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOwotCQkJaHRfY2FwLT5odF9jYXAubWNzLnJ4X21hc2tbMF0gPSAweGZmOwotCQkJcG9zICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCk7Ci0JCQljbWRfYXBwZW5kX3NpemUgKz0KLQkJCQlzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApOwotCQl9Ci0JCXsKLQkJCWh0X2luZm8gPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvICopIHBvczsKLQkJCW1lbXNldChodF9pbmZvLCAwLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pKTsKLQkJCWh0X2luZm8tPmhlYWRlci50eXBlID0KLQkJCQljcHVfdG9fbGUxNihXTEFOX0VJRF9IVF9JTkZPUk1BVElPTik7Ci0JCQlodF9pbmZvLT5oZWFkZXIubGVuID0KLQkJCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSk7Ci0JCQlodF9pbmZvLT5odF9pbmZvLmNvbnRyb2xfY2hhbiA9Ci0JCQkJKHU4KSBwcml2LT5jdXJyX2Jzc19wYXJhbXMuYnNzX2Rlc2NyaXB0b3IuCi0JCQkJY2hhbm5lbDsKLQkJCWlmIChhZGFwdGVyLT5jaGFuX29mZnNldCkgewotCQkJCWh0X2luZm8tPmh0X2luZm8uaHRfcGFyYW0gPQotCQkJCQlhZGFwdGVyLT5jaGFuX29mZnNldDsKLQkJCQlodF9pbmZvLT5odF9pbmZvLmh0X3BhcmFtIHw9CisJCS8qIEZpbGwgSFQgSU5GT1JNQVRJT04gKi8KKwkJaHRfaW5mbyA9IChzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8gKikgcG9zOworCQltZW1zZXQoaHRfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbykpOworCQlodF9pbmZvLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFdMQU5fRUlEX0hUX0lORk9STUFUSU9OKTsKKwkJaHRfaW5mby0+aGVhZGVyLmxlbiA9CisJCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSk7CisKKwkJaHRfaW5mby0+aHRfaW5mby5jb250cm9sX2NoYW4gPQorCQkJKHU4KSBwcml2LT5jdXJyX2Jzc19wYXJhbXMuYnNzX2Rlc2NyaXB0b3IuY2hhbm5lbDsKKwkJaWYgKGFkYXB0ZXItPmNoYW5fb2Zmc2V0KSB7CisJCQlodF9pbmZvLT5odF9pbmZvLmh0X3BhcmFtID0gYWRhcHRlci0+Y2hhbl9vZmZzZXQ7CisJCQlodF9pbmZvLT5odF9pbmZvLmh0X3BhcmFtIHw9CiAJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWTsKLQkJCX0KLQkJCWh0X2luZm8tPmh0X2luZm8ub3BlcmF0aW9uX21vZGUgPQotCQkJICAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKTsKLQkJCWh0X2luZm8tPmh0X2luZm8uYmFzaWNfc2V0WzBdID0gMHhmZjsKLQkJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKLQkJCWNtZF9hcHBlbmRfc2l6ZSArPQotCQkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pOwogCQl9CisJCWh0X2luZm8tPmh0X2luZm8ub3BlcmF0aW9uX21vZGUgPQorCQkgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOworCQlodF9pbmZvLT5odF9pbmZvLmJhc2ljX3NldFswXSA9IDB4ZmY7CisJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKKwkJY21kX2FwcGVuZF9zaXplICs9CisJCQlzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKIAl9CiAKIAljbWQtPnNpemUgPSBjcHVfdG9fbGUxNigodTE2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwppbmRleCA2N2U2ZGI3Li44NGJlMTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwpAQCAtNDAxLDcgKzQwMSw3IEBACiBzdGF0aWMgaW50CiBtd2lmaWV4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY1LDggKzQ2NSw4IEBACiAJYXRvbWljX2luYygmcHJpdi0+YWRhcHRlci0+dHhfcGVuZGluZyk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnByaXYtPmFkYXB0ZXItPnR4X3BlbmRpbmcpID49IE1BWF9UWF9QRU5ESU5HKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KGRldik7CisJCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgcHJpdi0+YWRhcHRlcik7CiAJfQogCiAJcXVldWVfd29yayhwcml2LT5hZGFwdGVyLT53b3JrcXVldWUsICZwcml2LT5hZGFwdGVyLT5tYWluX3dvcmspOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAKIAlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIiVsdSA6IFR4IHRpbWVvdXQsIGJzc19pbmRleD0lZFxuIiwKIAkJCQlqaWZmaWVzLCBwcml2LT5ic3NfaW5kZXgpOwotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KGRldik7CiAJcHJpdi0+bnVtX3R4X3RpbWVvdXQrKzsKIH0KIApAQCAtNTg2LDggKzU4Niw2IEBACiAJcHJpdi0+bWVkaWFfY29ubmVjdGVkID0gZmFsc2U7CiAJbWVtc2V0KCZwcml2LT5uaWNrX25hbWUsIDAsIHNpemVvZihwcml2LT5uaWNrX25hbWUpKTsKIAlwcml2LT5udW1fdHhfdGltZW91dCA9IDA7Ci0JcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNmZzgwMjExX3dxIik7Ci0JSU5JVF9XT1JLKCZwcml2LT5jZmdfd29ya3F1ZXVlLCBtd2lmaWV4X2NmZzgwMjExX3Jlc3VsdHMpOwogCW1lbWNweShkZXYtPmRldl9hZGRyLCBwcml2LT5jdXJyX2FkZHIsIEVUSF9BTEVOKTsKIH0KIApAQCAtNzkzLDcgKzc5MSw4IEBACiAJCXByaXYgPSBhZGFwdGVyLT5wcml2W2ldOwogCQlpZiAocHJpdiAmJiBwcml2LT5uZXRkZXYpIHsKIAkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRkZXYpKQotCQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsCisJCQkJCQkJCWFkYXB0ZXIpOwogCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHJpdi0+bmV0ZGV2KSkKIAkJCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCmluZGV4IDMwZjEzOGIuLjkyMDdmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCkBAIC00NTMsMTUgKzQ1Myw4IEBACiAJdTggc2Nhbl9wZW5kaW5nX29uX2Jsb2NrOwogCXU4IHJlcG9ydF9zY2FuX3Jlc3VsdDsKIAlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7Ci0JaW50IHNjYW5fcmVzdWx0X3N0YXR1czsKLQlpbnQgYXNzb2NfcmVxdWVzdDsKLQl1MTYgYXNzb2NfcmVzdWx0OwotCWludCBpYnNzX2pvaW5fcmVxdWVzdDsKLQl1MTYgaWJzc19qb2luX3Jlc3VsdDsKLQlib29sIGRpc2Nvbm5lY3Q7CisJc3RydWN0IG13aWZpZXhfdXNlcl9zY2FuX2NmZyAqdXNlcl9zY2FuX2NmZzsKIAl1OCBjZmdfYnNzaWRbNl07Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2ZnX3dvcmtxdWV1ZTsKIAl1OCBjb3VudHJ5X2NvZGVbSUVFRTgwMjExX0NPVU5UUllfU1RSSU5HX0xFTl07CiAJc3RydWN0IHdwcyB3cHM7CiAJdTggc2Nhbl9ibG9jazsKQEAgLTY1NSwxMCArNjQ4LDE5IEBACiAJc3RydWN0IG13aWZpZXhfd2FpdF9xdWV1ZSBjbWRfd2FpdF9xOwogCXU4IHNjYW5fd2FpdF9xX3dva2VuOwogCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRfcXVldWVkOworCXNwaW5sb2NrX3QgcXVldWVfbG9jazsJCS8qIGxvY2sgZm9yIHR4IHF1ZXVlcyAqLwogfTsKIAogaW50IG13aWZpZXhfaW5pdF9sb2NrX2xpc3Qoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CiAKK3ZvaWQgbXdpZmlleF9zZXRfdHJhbnNfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQgbXdpZmlleF93YWtlX3VwX25ldF9kZXZfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CisKIGludCBtd2lmaWV4X2luaXRfZncoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CiAKIGludCBtd2lmaWV4X2luaXRfZndfY29tcGxldGUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CkBAIC03NzUsNyArNzc3LDggQEAKIHN0cnVjdCBtd2lmaWV4X2NoYW5fZnJlcV9wb3dlciAqbXdpZmlleF9nZXRfY2ZwX2J5X2JhbmRfYW5kX2ZyZXFfZnJvbV9jZmc4MDIxMSgKIAkJCQkJCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJCQl1OCBiYW5kLCB1MzIgZnJlcSk7Ci11MzIgbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUodTggaW5kZXgsIHU4IGh0X2luZm8pOwordTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4IGluZGV4LAorCQkJCQkJCXU4IGh0X2luZm8pOwogdTMyIG13aWZpZXhfZmluZF9mcmVxX2Zyb21fYmFuZF9jaGFuKHU4LCB1OCk7CiBpbnQgbXdpZmlleF9jbWRfYXBwZW5kX3ZzaWVfdGx2KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHUxNiB2c2llX21hc2ssCiAJCQkJdTggKipidWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYwppbmRleCBhMmYzMjAwLi40MDUzNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJY2FyZC0+dHhiZF9yaW5nX3ZiYXNlID0ga3phbGxvYyhjYXJkLT50eGJkX3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYXJkLT50eGJkX3JpbmdfdmJhc2UpIHsKIAkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciB0eGJkIHJpbmcuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2FyZC0+dHhiZF9yaW5nX3BiYXNlID0gdmlydF90b19waHlzKGNhcmQtPnR4YmRfcmluZ192YmFzZSk7CiAKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCWlmICghY2FyZC0+cnhiZF9yaW5nX3ZiYXNlKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgIgogCQkJCSJyeGJkX3JpbmcuXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2FyZC0+cnhiZF9yaW5nX3BiYXNlID0gdmlydF90b19waHlzKGNhcmQtPnJ4YmRfcmluZ192YmFzZSk7CiAKQEAgLTU2OSw3ICs1NjksNyBAQAogCWlmICghY2FyZC0+ZXZ0YmRfcmluZ192YmFzZSkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIuICIKIAkJCQkiVGVybWluYXRpbmcgZG93bmxvYWRcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAljYXJkLT5ldnRiZF9yaW5nX3BiYXNlID0gdmlydF90b19waHlzKGNhcmQtPmV2dGJkX3JpbmdfdmJhc2UpOwogCkBAIC0xMjMxLDE1ICsxMjMxLDEzIEBACiAJaWYgKHJkcHRyID49IE1XSUZJRVhfTUFYX0VWVF9CRCkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImV2ZW50X2NvbXBsZXRlOiBJbnZhbGlkIHJkcHRyIDB4JXhcbiIsCiAJCQkJCXJkcHRyKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBSZWFkIHRoZSBldmVudCByaW5nIHdyaXRlIHBvaW50ZXIgc2V0IGJ5IGZpcm13YXJlICovCiAJaWYgKG13aWZpZXhfcmVhZF9yZWcoYWRhcHRlciwgUkVHX0VWVEJEX1dSUFRSLCAmd3JwdHIpKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiZXZlbnRfY29tcGxldGU6IGZhaWxlZCB0byByZWFkIFJFR19FVlRCRF9XUlBUUlxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7CisJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoIWNhcmQtPmV2dF9idWZfbGlzdFtyZHB0cl0pIHsKQEAgLTEyNjgsMTUgKzEyNjYsOSBAQAogCS8qIFdyaXRlIHRoZSBldmVudCByaW5nIHJlYWQgcG9pbnRlciBpbiB0byBSRUdfRVZUQkRfUkRQVFIgKi8KIAlpZiAobXdpZmlleF93cml0ZV9yZWcoYWRhcHRlciwgUkVHX0VWVEJEX1JEUFRSLCBjYXJkLT5ldnRiZF9yZHB0cikpIHsKIAkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJldmVudF9jb21wbGV0ZTogZmFpbGVkIHRvIHJlYWQgUkVHX0VWVEJEX1JEUFRSXG4iKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIC0xOwogCX0KIAotZG9uZToKLQkvKiBGcmVlIHRoZSBidWZmZXIgZm9yIGZhaWx1cmUgY2FzZSAqLwotCWlmIChyZXQgJiYgc2tiKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCiAJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBDaGVjayBFdmVudHMgQWdhaW5cbiIpOwogCXJldCA9IG13aWZpZXhfcGNpZV9wcm9jZXNzX2V2ZW50X3JlYWR5KGFkYXB0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCmluZGV4IDhhM2Y5NTkuLmUyZTcxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCkBAIC04MTksOCArODE5LDEwIEBACiAJCQl3aWxkY2FyZF9zc2lkX3Rsdi0+aGVhZGVyLmxlbiA9IGNwdV90b19sZTE2KAogCQkJCSh1MTYpIChzc2lkX2xlbiArIHNpemVvZih3aWxkY2FyZF9zc2lkX3Rsdi0+CiAJCQkJCQkJIG1heF9zc2lkX2xlbmd0aCkpKTsKLQkJCXdpbGRjYXJkX3NzaWRfdGx2LT5tYXhfc3NpZF9sZW5ndGggPQotCQkJCXVzZXJfc2Nhbl9pbi0+c3NpZF9saXN0W3NzaWRfaWR4XS5tYXhfbGVuOworCisJCQkvKiBtYXhfc3NpZF9sZW5ndGggPSAwIHRlbGxzIGZpcm13YXJlIHRvIHBlcmZvcm0KKwkJCSAgIHNwZWNpZmljIHNjYW4gZm9yIHRoZSBTU0lEIGZpbGxlZCAqLworCQkJd2lsZGNhcmRfc3NpZF90bHYtPm1heF9zc2lkX2xlbmd0aCA9IDA7CiAKIAkJCW1lbWNweSh3aWxkY2FyZF9zc2lkX3Rsdi0+c3NpZCwKIAkJCSAgICAgICB1c2VyX3NjYW5faW4tPnNzaWRfbGlzdFtzc2lkX2lkeF0uc3NpZCwKQEAgLTEzODksMTEgKzEzOTEsOCBAQAogewogCWludCBzdGF0dXM7CiAKLQlwcml2LT5hZGFwdGVyLT5zY2FuX3dhaXRfcV93b2tlbiA9IGZhbHNlOwotCiAJc3RhdHVzID0gbXdpZmlleF9zY2FuX25ldHdvcmtzKHByaXYsIHNjYW5fcmVxKTsKLQlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gbXdpZmlleF93YWl0X3F1ZXVlX2NvbXBsZXRlKHByaXYtPmFkYXB0ZXIpOworCXF1ZXVlX3dvcmsocHJpdi0+YWRhcHRlci0+d29ya3F1ZXVlLCAmcHJpdi0+YWRhcHRlci0+bWFpbl93b3JrKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTM1LDExICsxNTM0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXdpZmlleF9mcmVlX2Jzc19wcml2KHN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcykKLXsKLQlrZnJlZShic3MtPnByaXYpOwotfQotCiAvKgogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlIG9mIHNjYW4uCiAgKgpAQCAtMTc2NSw3ICsxNzU5LDcgQEAKIAkJCQkJICAgICAgY2FwX2luZm9fYml0bWFwLCBiZWFjb25fcGVyaW9kLAogCQkJCQkgICAgICBpZV9idWYsIGllX2xlbiwgcnNzaSwgR0ZQX0tFUk5FTCk7CiAJCQkJKih1OCAqKWJzcy0+cHJpdiA9IGJhbmQ7Ci0JCQkJYnNzLT5mcmVlX3ByaXYgPSBtd2lmaWV4X2ZyZWVfYnNzX3ByaXY7CisJCQkJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOwogCiAJCQkJaWYgKHByaXYtPm1lZGlhX2Nvbm5lY3RlZCAmJiAhbWVtY21wKGJzc2lkLAogCQkJCQlwcml2LT5jdXJyX2Jzc19wYXJhbXMuYnNzX2Rlc2NyaXB0b3IKQEAgLTE3OTksNiArMTc5MywxNCBAQAogCQkJdXAoJnByaXYtPmFzeW5jX3NlbSk7CiAJCX0KIAorCQlpZiAocHJpdi0+dXNlcl9zY2FuX2NmZykgeworCQkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsICJpbmZvOiAlczogc2VuZGluZyBzY2FuICIKKwkJCQkJCQkicmVzdWx0c1xuIiwgX19mdW5jX18pOworCQkJY2ZnODAyMTFfc2Nhbl9kb25lKHByaXYtPnNjYW5fcmVxdWVzdCwgMCk7CisJCQlwcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOworCQkJa2ZyZWUocHJpdi0+dXNlcl9zY2FuX2NmZyk7CisJCQlwcml2LT51c2VyX3NjYW5fY2ZnID0gTlVMTDsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIEdldCBzY2FuIGNvbW1hbmQgZnJvbSBzY2FuX3BlbmRpbmdfcSBhbmQgcHV0IHRvCiAJCSAgIGNtZF9wZW5kaW5nX3EgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmMKaW5kZXggZmZhZjNmMy4uZDM5ZDg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmMKQEAgLTI1NiwxMCArMjU2LDEzIEBACiAKIC8qIERldmljZSBJRCBmb3IgU0Q4Nzg3ICovCiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc4NyAgICgweDkxMTkpCisvKiBEZXZpY2UgSUQgZm9yIFNEODc5NyAqLworI2RlZmluZSBTRElPX0RFVklDRV9JRF9NQVJWRUxMXzg3OTcgICAoMHg5MTI5KQogCiAvKiBXTEFOIElEcyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBtd2lmaWV4X2lkc1tdID0gewogCXtTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9NQVJWRUxMLCBTRElPX0RFVklDRV9JRF9NQVJWRUxMXzg3ODcpfSwKKwl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfTUFSVkVMTCwgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzk3KX0sCiAJe30sCiB9OwogCkBAIC0xMDg0LDcgKzEwODcsNyBAQAogCQkJCQkgICAoYWRhcHRlci0+aW9wb3J0IHwgMHgxMDAwIHwKIAkJCQkJICAgIChjYXJkLT5tcGFfcngucG9ydHMgPDwgNCkpICsKIAkJCQkJICAgY2FyZC0+bXBhX3J4LnN0YXJ0X3BvcnQsIDEpKQotCQkJcmV0dXJuIC0xOworCQkJZ290byBlcnJvcjsKIAogCQljdXJyX3B0ciA9IGNhcmQtPm1wYV9yeC5idWY7CiAKQEAgLTExMjcsMTIgKzExMzAsMjkgQEAKIAkJaWYgKG13aWZpZXhfc2Rpb19jYXJkX3RvX2hvc3QoYWRhcHRlciwgJnBrdF90eXBlLAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCQkgICAgICBhZGFwdGVyLT5pb3BvcnQgKyBwb3J0KSkKLQkJCXJldHVybiAtMTsKKwkJCWdvdG8gZXJyb3I7CiAKIAkJbXdpZmlleF9kZWNvZGVfcnhfcGFja2V0KGFkYXB0ZXIsIHNrYiwgcGt0X3R5cGUpOwogCX0KIAogCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoTVBfUlhfQUdHUl9JTl9QUk9HUkVTUyhjYXJkKSkgeworCQkvKiBNdWx0aXBvcnQtYWdncmVnYXRpb24gdHJhbnNmZXIgZmFpbGVkIC0gY2xlYW51cCAqLworCQlmb3IgKHBpbmQgPSAwOyBwaW5kIDwgY2FyZC0+bXBhX3J4LnBrdF9jbnQ7IHBpbmQrKykgeworCQkJLyogY29weSBwa3QgdG8gZGVhZ2dyIGJ1ZiAqLworCQkJc2tiX2RlYWdnciA9IGNhcmQtPm1wYV9yeC5za2JfYXJyW3BpbmRdOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiX2RlYWdncik7CisJCX0KKwkJTVBfUlhfQUdHUl9CVUZfUkVTRVQoY2FyZCk7CisJfQorCisJaWYgKGZfZG9fcnhfY3VyKQorCQkvKiBTaW5nbGUgdHJhbnNmZXIgcGVuZGluZy4gRnJlZSBjdXJyIGJ1ZmYgYWxzbyAqLworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTI2OCw3ICsxMjg4LDYgQEAKIAogCQkJCWRldl9kYmcoYWRhcHRlci0+ZGV2LAogCQkJCQkJImluZm86IENGRyByZWcgdmFsID0leFxuIiwgY3IpOwotCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9CkBAIC0xNTczLDcgKzE1OTIsMTYgQEAKIAlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIGNhcmQpOwogCiAJYWRhcHRlci0+ZGV2ID0gJmZ1bmMtPmRldjsKLQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSk7CisKKwlzd2l0Y2ggKGZ1bmMtPmRldmljZSkgeworCWNhc2UgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzk3OgorCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgU0Q4Nzk3X0RFRkFVTFRfRldfTkFNRSk7CisJCWJyZWFrOworCWNhc2UgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzg3OgorCWRlZmF1bHQ6CisJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBTRDg3ODdfREVGQVVMVF9GV19OQU1FKTsKKwkJYnJlYWs7CisJfQogCiAJcmV0dXJuIDA7CiAKQEAgLTE3NzQsNCArMTgwMiw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgV2lGaS1FeCBTRElPIERyaXZlciB2ZXJzaW9uICIgU0RJT19WRVJTSU9OKTsKIE1PRFVMRV9WRVJTSU9OKFNESU9fVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfRklSTVdBUkUoIm1ydmwvc2Q4Nzg3X3VhcHN0YS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3ODdfREVGQVVMVF9GV19OQU1FKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3OTdfREVGQVVMVF9GV19OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKaW5kZXggM2Y3MTE4MC4uYTNmYjMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJtYWluLmgiCiAKICNkZWZpbmUgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3ODdfdWFwc3RhLmJpbiIKKyNkZWZpbmUgU0Q4Nzk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3OTdfdWFwc3RhLmJpbiIKIAogI2RlZmluZSBCTE9DS19NT0RFCTEKICNkZWZpbmUgQllURV9NT0RFCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYwppbmRleCA3YTE2YjBjLi5lODEyZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCkBAIC01MDgsNyArNTA4LDcgQEAKIAlwcml2LT50eF9odGluZm8gPSByZXNwLT5wYXJhbXMudHhfcmF0ZS5odF9pbmZvOwogCWlmICghcHJpdi0+aXNfZGF0YV9yYXRlX2F1dG8pCiAJCXByaXYtPmRhdGFfcmF0ZSA9Ci0JCQltd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShwcml2LT50eF9yYXRlLAorCQkJbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUocHJpdiwgcHJpdi0+dHhfcmF0ZSwKIAkJCQkJCSAgIHByaXYtPnR4X2h0aW5mbyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9ldmVudC5jCmluZGV4IGYyMDQ4MTAuLmQ3YWEyMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfZXZlbnQuYwpAQCAtMTE1LDE4ICsxMTUsMTcgQEAKIAlpZiAoYWRhcHRlci0+bnVtX2NtZF90aW1lb3V0ICYmIGFkYXB0ZXItPmN1cnJfY21kKQogCQlyZXR1cm47CiAJcHJpdi0+bWVkaWFfY29ubmVjdGVkID0gZmFsc2U7Ci0JaWYgKCFwcml2LT5kaXNjb25uZWN0KSB7Ci0JCXByaXYtPmRpc2Nvbm5lY3QgPSAxOwotCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0ZWQgZnJvbSIKLQkJCQkiICVwTTogcmVhc29uIGNvZGUgJWRcbiIsIHByaXYtPmNmZ19ic3NpZCwKLQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwcml2LT5uZXRkZXYsCi0JCQkJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcsIE5VTEwsIDAsCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7CisJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBzdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkIGZyb20iCisJCQkiICVwTTogcmVhc29uIGNvZGUgJWRcbiIsIHByaXYtPmNmZ19ic3NpZCwKKwkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKKwlpZiAocHJpdi0+YnNzX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQljZmc4MDIxMV9kaXNjb25uZWN0ZWQocHJpdi0+bmV0ZGV2LCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywKKwkJCQkgICAgICBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKIAl9CisJbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCiAJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldGRldikpCi0JCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUocHJpdi0+bmV0ZGV2LCBhZGFwdGVyKTsKIAlpZiAobmV0aWZfY2Fycmllcl9vayhwcml2LT5uZXRkZXYpKQogCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwogCS8qIFJlc2V0IHdpcmVsZXNzIHN0YXRzIHNpZ25hbCBpbmZvICovCkBAIC0yMDEsNyArMjAwLDcgQEAKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCiAJCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPm5ldGRldik7CiAJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7CisJCQltd2lmaWV4X3dha2VfdXBfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsIGFkYXB0ZXIpOwogCQlicmVhazsKIAogCWNhc2UgRVZFTlRfREVBVVRIRU5USUNBVEVEOgpAQCAtMjkyLDcgKzI5MSw3IEBACiAJCXByaXYtPmFkaG9jX2lzX2xpbmtfc2Vuc2VkID0gZmFsc2U7CiAJCW13aWZpZXhfY2xlYW5fdHhyeChwcml2KTsKIAkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7CisJCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsIGFkYXB0ZXIpOwogCQlpZiAobmV0aWZfY2Fycmllcl9vayhwcml2LT5uZXRkZXYpKQogCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0ZGV2KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfaW9jdGwuYwppbmRleCBlYTRhMjliLi42ZDk5MGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQkJCSAgICAgICJhc3NvY2lhdGluZy4uLlxuIik7CiAKIAkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7CisJCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsIGFkYXB0ZXIpOwogCiAJCS8qIENsZWFyIGFueSBwYXN0IGFzc29jaWF0aW9uIHJlc3BvbnNlIHN0b3JlZCBmb3IKIAkJICogYXBwbGljYXRpb24gcmV0cmlldmFsICovCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJcmV0ID0gbXdpZmlleF9jaGVja19uZXR3b3JrX2NvbXBhdGliaWxpdHkocHJpdiwgYnNzX2Rlc2MpOwogCiAJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRkZXYpKQotCQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOworCQkJbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUocHJpdi0+bmV0ZGV2LCBhZGFwdGVyKTsKIAogCQlpZiAoIXJldCkgewogCQkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBuZXR3b3JrIGZvdW5kIGluIHNjYW4iCkBAIC04MzIsOCArODMyLDggQEAKIAogCWlmICghcmV0KSB7CiAJCWlmIChyYXRlLT5pc19yYXRlX2F1dG8pCi0JCQlyYXRlLT5yYXRlID0gbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUocHJpdi0+dHhfcmF0ZSwKLQkJCQkJCQlwcml2LT50eF9odGluZm8pOworCQkJcmF0ZS0+cmF0ZSA9IG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHByaXYsCisJCQkJCXByaXYtPnR4X3JhdGUsIHByaXYtPnR4X2h0aW5mbyk7CiAJCWVsc2UKIAkJCXJhdGUtPnJhdGUgPSBwcml2LT5kYXRhX3JhdGU7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jCmluZGV4IDI3NDMwNTEuLjVlMWVmN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYwpAQCAtMTI2LDYgKzEyNiw5IEBACiAJdTE2IHJ4X3BrdF90eXBlOwogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBhZGFwdGVyLT5wcml2W3J4X2luZm8tPmJzc19pbmRleF07CiAKKwlpZiAoIXByaXYpCisJCXJldHVybiAtMTsKKwogCWxvY2FsX3J4X3BkID0gKHN0cnVjdCByeHBkICopIChza2ItPmRhdGEpOwogCXJ4X3BrdF90eXBlID0gbG9jYWxfcnhfcGQtPnJ4X3BrdF90eXBlOwogCkBAIC0xODksMTIgKzE5MiwxMSBAQAogCQkJCQkgICAgICh1OCkgbG9jYWxfcnhfcGQtPnJ4X3BrdF90eXBlLAogCQkJCQkgICAgIHNrYik7CiAKLQlpZiAocmV0IHx8IChyeF9wa3RfdHlwZSA9PSBQS1RfVFlQRV9CQVIpKSB7Ci0JCWlmIChwcml2ICYmIChyZXQgPT0gLTEpKQotCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwotCisJaWYgKHJldCB8fCAocnhfcGt0X3R5cGUgPT0gUEtUX1RZUEVfQkFSKSkKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQl9CisKKwlpZiAocmV0KQorCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYwppbmRleCBhMjA2ZjQxLi5kOTI3NGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJaWYgKCFwcml2KQogCQlnb3RvIGRvbmU7CiAKLQlwcml2LT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwltd2lmaWV4X3NldF90cmFuc19zdGFydChwcml2LT5uZXRkZXYpOwogCWlmICghc3RhdHVzKSB7CiAJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CkBAIC0xNTIsNyArMTUyLDggQEAKIAkJaWYgKChHRVRfQlNTX1JPTEUodHByaXYpID09IE1XSUZJRVhfQlNTX1JPTEVfU1RBKQogCQkJCSYmICh0cHJpdi0+bWVkaWFfY29ubmVjdGVkKSkgewogCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodHByaXYtPm5ldGRldikpCi0JCQkJbmV0aWZfd2FrZV9xdWV1ZSh0cHJpdi0+bmV0ZGV2KTsKKwkJCQltd2lmaWV4X3dha2VfdXBfbmV0X2Rldl9xdWV1ZSh0cHJpdi0+bmV0ZGV2LAorCQkJCQkJCQlhZGFwdGVyKTsKIAkJfQogCX0KIGRvbmU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL2Z3LmMKaW5kZXggNTI3Y2Y1My4uNGRmOGNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vZncuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImhlcm1lcy5oIgogI2luY2x1ZGUgImhlcm1lc19kbGQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9lZXByb20uYwppbmRleCA4YjZmMzYzLi5mYThjZTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2VlcHJvbS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInA1NC5oIgogI2luY2x1ZGUgImVlcHJvbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9md2lvLmMKaW5kZXggNTNhMzQwOC4uMThlODJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZndpby5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYwppbmRleCBhZDlhZTA0Li5kYjRkOWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRwY2kuYwppbmRleCAxYjc1MzE3Li5iMWY1MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0cGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHBjaS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgInA1NC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jCmluZGV4IGYxOGRmODIuLjdmYWVkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRzcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmMKQEAgLTU4MSwxNSArNTgxLDkgQEAKIAlzdHJ1Y3QgcDU0c19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdXRleCkpIHsKLQkJLyogRklYTUU6IGhvdyB0byBoYW5kbGUgdGhpcyBlcnJvcj8gKi8KLQkJcmV0dXJuOwotCX0KLQorCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlXQVJOX09OKHByaXYtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1JFQURZKTsKIAotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPndvcmspOwotCiAJcDU0c3BpX3Bvd2VyX29mZihwcml2KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT50eF9wZW5kaW5nKTsKQEAgLTU5Nyw2ICs1OTEsOCBAQAogCiAJcHJpdi0+Zndfc3RhdGUgPSBGV19TVEFURV9PRkY7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT53b3JrKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcDU0c3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC02NTYsNiArNjUyLDcgQEAKIAlpbml0X2NvbXBsZXRpb24oJnByaXYtPmZ3X2NvbXApOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT50eF9wZW5kaW5nKTsKIAltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOwogCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmc3BpLT5kZXYpOwogCXByaXYtPmNvbW1vbi5vcGVuID0gcDU0c3BpX29wX3N0YXJ0OwogCXByaXYtPmNvbW1vbi5zdG9wID0gcDU0c3BpX29wX3N0b3A7CkBAIC03MDMsNyArNzAwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwNTRzcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9ICJwNTRzcGkiLAotCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMKaW5kZXggYThmM2JjNy4uOWI2MDk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAicDU0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3R4cnguYwppbmRleCBmNDg1Nzg0Li40MmI5N2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC90eHJ4LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMjQxLDcgKzI0Miw3IEBACiAKIAlza2JfdW5saW5rKHNrYiwgJnByaXYtPnR4X3F1ZXVlKTsKIAlwNTRfdHhfcW9zX2FjY291bnRpbmdfZnJlZShwcml2LCBza2IpOwotCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWVlZTgwMjExX2ZyZWVfdHhza2IoZGV2LCBza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocDU0X2ZyZWVfc2tiKTsKIApAQCAtNzg3LDcgKzc4OCw3IEBACiAJCQkgICAgJmhkcl9mbGFncywgJmFpZCwgJmJ1cnN0X2FsbG93ZWQpOwogCiAJaWYgKHA1NF90eF9xb3NfYWNjb3VudGluZ19hbGxvYyhwcml2LCBza2IsIHF1ZXVlKSkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZWVlODAyMTFfZnJlZV90eHNrYihkZXYsIHNrYik7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IGQ5N2EyY2FmLi40ZTQ0YjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTc3OCw3ICs3NzgsNyBAQAogCQlkd3JxLT5mbGFncyA9IDA7CiAJCWR3cnEtPmxlbmd0aCA9IDA7CiAJfQotCWVzc2lkLT5vY3RldHNbZXNzaWQtPmxlbmd0aF0gPSAnXDAnOworCWVzc2lkLT5vY3RldHNbZHdycS0+bGVuZ3RoXSA9ICdcMCc7CiAJbWVtY3B5KGV4dHJhLCBlc3NpZC0+b2N0ZXRzLCBkd3JxLT5sZW5ndGgpOwogCWtmcmVlKGVzc2lkKTsKIApAQCAtMjQ5MywzMjMgKzI0OTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIE5vdGU6IGN1cnJlbnRseSwgdXNlIGhvc3RhcGQgaW9jdGwgZnJvbSB0aGUgSG9zdCBBUCBkcml2ZXIgZm9yIFdQQQotICogc3VwcG9ydC4gVGhpcyBpcyB0byBiZSByZXBsYWNlZCB3aXRoIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgb25jZSB0aGV5Ci0gKiBnZXQgV1BBIHN1cHBvcnQuICovCi0KLS8qIE5vdGUgSUk6IHBsZWFzZSBsZWF2ZSBhbGwgdGhpcyB0b2dldGhlciBhcyBpdCB3aWxsIGJlIGVhc2llciB0byByZW1vdmUgbGF0ZXIsCi0gKiBvbmNlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYWRkIFdQQSBzdXBwb3J0IC1tY2dyb2YgKi8KLQotLyogUFJJU001NF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLwotZW51bSB7Ci0JUFJJU00yX1NFVF9FTkNSWVBUSU9OID0gNiwKLQlQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UID0gMTIsCi0JUFJJU00yX0hPU1RBUERfTUxNRSA9IDEzLAotCVBSSVNNMl9IT1NUQVBEX1NDQU5fUkVRID0gMTQsCi19OwotCiAjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJCVNJT0NJV0ZJUlNUUFJJVisxMgotI2RlZmluZSBQUklTTTU0X0hPU1RBUEQJCQlTSU9DSVdGSVJTVFBSSVYrMjUKLSNkZWZpbmUgUFJJU001NF9EUk9QX1VORU5DUllQVEVECVNJT0NJV0ZJUlNUUFJJVisyNgotCi0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSAxMDI0Ci0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKLQlvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0sIHUuZ2VuZXJpY19lbGVtLmRhdGEpCi0KLS8qIE1heGltdW0gbGVuZ3RoIGZvciBhbGdvcml0aG0gbmFtZXMgKC0xIGZvciBudWwgdGVybWluYXRpb24pCi0gKiB1c2VkIGluIGlvY3RsKCkgKi8KLSNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgotCi1zdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gewotCXUzMiBjbWQ7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCXVuaW9uIHsKLQkgICAgICAgc3RydWN0IHsKLQkJICAgICAgIHU4IGFsZ1tIT1NUQVBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKLQkJICAgICAgIHUzMiBmbGFnczsKLQkJICAgICAgIHUzMiBlcnI7Ci0JCSAgICAgICB1OCBpZHg7Ci0JCSAgICAgICB1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCi0JCSAgICAgICB1MTYga2V5X2xlbjsKLQkJICAgICAgIHU4IGtleVswXTsKLQkJICAgICAgIH0gY3J5cHQ7Ci0gICAgICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgICAgICAgICB1OCBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IGRhdGFbMF07Ci0gICAgICAgICAgICAgICB9IGdlbmVyaWNfZWxlbTsKLSAgICAgICAgICAgICAgIHN0cnVjdCB7Ci0jZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCi0jZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNtZDsKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJlYXNvbl9jb2RlOwotICAgICAgICAgICAgICAgfSBtbG1lOwotICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgdTggc3NpZF9sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRbMzJdOwotICAgICAgICAgICAgICAgfSBzY2FuX3JlcTsKLSAgICAgICB9IHU7Ci19OwotCi0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLQlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJ2YWx1ZSA9IDAsIGZvcmNlID0gMDsKLQlpbnQgYXV0aGVuID0gRE9UMTFfQVVUSF9PUywgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOwotCXVuaW9uIG9pZF9yZXNfdCByOwotCi0JLyogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KLQkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCi0JICogd2hlbiBubyBrZXkgaXMgZ2l2ZW4sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkb24ndC4gKi8KLQotCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCkgewotCQkvKiB3ZSBoYXZlIGEga2V5IHRvIHNldCAqLwotCQlpbnQgaW5kZXggPSBwYXJhbS0+dS5jcnlwdC5pZHg7Ci0JCWludCBjdXJyZW50X2luZGV4OwotCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfVEtJUCwgMCwgIiIgfTsKLQotCQkvKiBnZXQgdGhlIGN1cnJlbnQga2V5IGluZGV4ICovCi0JCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsIE5VTEwsICZyKTsKLQkJY3VycmVudF9pbmRleCA9IHIudTsKLQkJLyogVmVyaWZ5IHRoYXQgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYgKCEocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7Ci0JCQlrZXkubGVuZ3RoID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA/Ci0JCQkgICAgc2l6ZW9mIChwYXJhbS0+dS5jcnlwdC5rZXkpIDogcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKLQkJCW1lbWNweShrZXkua2V5LCBwYXJhbS0+dS5jcnlwdC5rZXksIGtleS5sZW5ndGgpOwotCQkJaWYgKGtleS5sZW5ndGggPT0gMzIpCi0JCQkJLyogd2Ugd2FudCBXUEEtUFNLICovCi0JCQkJa2V5LnR5cGUgPSBET1QxMV9QUklWX1RLSVA7Ci0JCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCi0JCQkJLyogbm8gaW5kZXggcHJvdmlkZWQgdXNlIHRoZSBjdXJyZW50IG9uZSAqLwotCQkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKLQotCQkJLyogbm93IHNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAgKi8KLQkJCXJ2YWx1ZSB8PQotCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsCi0JCQkJCSAgICAma2V5KTsKLQkJfQotCQkvKgotCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQKLQkJICogKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKS4KLQkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzCi0JCSAqLwotCQlpZiAoKGluZGV4ID09IGN1cnJlbnRfaW5kZXgpICYmIChrZXkubGVuZ3RoID4gMCkpCi0JCQlmb3JjZSA9IDE7Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IDMpKSB7Ci0JCQkvKiB3ZSB3YW50IHRvIHNldCB0aGUga2V5IGluZGV4ICovCi0JCQlydmFsdWUgfD0KLQkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLAotCQkJCQkgICAgJmluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWlmICghKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpKSB7Ci0JCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCX0KLQkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KLQlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJLyogRW5jb2RpbmcgZGlzYWJsZWQsCi0JCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7Ci0JCSAqIGludm9rZSA9IDA7Ci0JCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KLQl9Ci0JaWYgKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCS8qIEVuY29kZSBidXQgYWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMuIE5vIGF1dGggKi8KLQkJaW52b2tlID0gMTsKLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHx8IGZvcmNlKSB7Ci0JCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzLiBBdXRoICovCi0JCWF1dGhlbiA9IERPVDExX0FVVEhfQk9USDsKLQkJaW52b2tlID0gMTsKLQkJZXh1bmVuY3J5cHQgPSAxOwotCX0KLQkvKiBkbyB0aGUgY2hhbmdlIGlmIHJlcXVlc3RlZCAgKi8KLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHx8IGZvcmNlKSB7Ci0JCXJ2YWx1ZSB8PQotCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCAmYXV0aGVuKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCAmaW52b2tlKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsCi0JCQkJICAgICZleHVuZW5jcnlwdCk7Ci0JfQotCXJldHVybiBydmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZ2VuZXJpY19lbGVtZW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLSAgICAgICBpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotICAgICAgIGludCBtYXhfbGVuLCBsZW4sIGFsZW4sIHJldD0wOwotICAgICAgIHN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoOwotCi0gICAgICAgbGVuID0gcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKLSAgICAgICBtYXhfbGVuID0gcGFyYW1fbGVuIC0gUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU47Ci0gICAgICAgaWYgKG1heF9sZW4gPCAwIHx8IG1heF9sZW4gPCBsZW4pCi0gICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgIGFsZW4gPSBzaXplb2YoKmF0dGFjaCkgKyBsZW47Ci0gICAgICAgYXR0YWNoID0ga3phbGxvYyhhbGVuLCBHRlBfS0VSTkVMKTsKLSAgICAgICBpZiAoYXR0YWNoID09IE5VTEwpCi0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLQotI2RlZmluZSBXTEFOX0ZDX1RZUEVfTUdNVCAwCi0jZGVmaW5lIFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDAKLSNkZWZpbmUgV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSAyCi0KLSAgICAgICAvKiBOb3RlOiBlbmRpYW5uZXNzIGlzIGNvdmVyZWQgYnkgbWd0X3NldF92YXJsZW4gKi8KLQotICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9BU1NPQ19SRVEgPDwgNCk7Ci0gICAgICAgYXR0YWNoLT5pZCA9IC0xOwotICAgICAgIGF0dGFjaC0+c2l6ZSA9IGxlbjsKLSAgICAgICBtZW1jcHkoYXR0YWNoLT5kYXRhLCBwYXJhbS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgbGVuKTsKLQotICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLSAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0ZDX1NUWVBFX1JFQVNTT0NfUkVRIDw8IDQpOwotCi0JICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLQkgICAgICAgaWYgKHJldCA9PSAwKQotCQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEgSUUgQXR0YWNobWVudCB3YXMgc2V0XG4iLAotCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICB9Ci0KLSAgICAgICBrZnJlZShhdHRhY2gpOwotICAgICAgIHJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludAotcHJpc20yX2lvY3RsX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zY2FuX3JlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCi17Ci0JaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvIGluZm87Ci0JaW50IGksIHJ2YWx1ZTsKLQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmJzc2xpc3Q7Ci0JdTMyIG5vaXNlID0gMDsKLQljaGFyICpleHRyYSA9ICIiOwotCWNoYXIgKmN1cnJlbnRfZXYgPSAiZm9vIjsKLQl1bmlvbiBvaWRfcmVzX3QgcjsKLQotCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKLQkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KLQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKLQlub2lzZSA9IHIudTsKLQotCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLiBXZSBjYW4gcmVwb3J0IGF0IG1vc3QKLQkgKiBJV19NQVhfQVA9NjQgdG8gdGhlIHJhbmdlIHN0cnVjdC4gQnV0IHRoZSBkZXZpY2Ugd29uJ3QgcmVwcG9ydCBhbnl0aGluZwotCSAqIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIElXTUFYX0JTUz0yNC4KLQkgKi8KLQlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7Ci0JYnNzbGlzdCA9IHIucHRyOwotCi0JaW5mby5jbWQgPSBQUklTTTU0X0hPU1RBUEQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBvayBub3csIHNjYW4gdGhlIGxpc3QgYW5kIHRyYW5zbGF0ZSBpdHMgaW5mbyAqLwotCWZvciAoaSA9IDA7IGkgPCBtaW4oSVdfTUFYX0FQLCAoaW50KSBic3NsaXN0LT5ucik7IGkrKykKLQkJY3VycmVudF9ldiA9IHByaXNtNTRfdHJhbnNsYXRlX2JzcyhuZGV2LCAmaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCSAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKLQkJCQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCi0JCQkJCQkgICBub2lzZSk7Ci0Ja2ZyZWUoYnNzbGlzdCk7Ci0KLQlyZXR1cm4gcnZhbHVlOwotfQotCi1zdGF0aWMgaW50Ci1wcmlzbTU0X2hvc3RhcGQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19wb2ludCAqcCkKLXsKLSAgICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtOwotICAgICAgIGludCByZXQgPSAwOwotICAgICAgIHUzMiB1d3JxOwotCi0gICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInByaXNtNTRfaG9zdGFwZCAtIGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKLSAgICAgICBpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSkgfHwKLSAgICAgICAgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJhbSA9IG1lbWR1cF91c2VyKHAtPnBvaW50ZXIsIHAtPmxlbmd0aCk7Ci0JaWYgKElTX0VSUihwYXJhbSkpCi0JCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKLQotICAgICAgIHN3aXRjaCAocGFyYW0tPmNtZCkgewotICAgICAgIGNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgZW5jcnlwdGlvbiByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9lbmNyeXB0aW9uKG5kZXYsIHBhcmFtLCBwLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgV1BBIElFIHJlcXVlc3RcbiIsCi0JCQkgICAgICAgbmRldi0+bmFtZSk7Ci0gICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChuZGV2LCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX01MTUU6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IE1MTUUgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9tbG1lKG5kZXYsIHBhcmFtKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0NBTl9SRVE6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHNjYW4gcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zY2FuX3JlcShuZGV2LCBwYXJhbSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLQljYXNlIFBSSVNNNTRfU0VUX1dQQToKLQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgd3BhIGluaXQgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLQkgICAgICAgdXdycSA9IDE7Ci0JICAgICAgIHJldCA9IHByaXNtNTRfc2V0X3dwYShuZGV2LCBOVUxMLCAmdXdycSwgTlVMTCk7Ci0JICAgICAgIGJyZWFrOwotCWNhc2UgUFJJU001NF9EUk9QX1VORU5DUllQVEVEOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgZHJvcCB1bmVuY3J5cHRlZCByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotI2lmIDAKLQkgICAgICAgdXdycSA9IDB4MDE7Ci0JICAgICAgIG1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZ1d3JxKTsKLQkgICAgICAgZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7Ci0JICAgICAgIG1ndF9jb21taXQocHJpdik7Ci0JICAgICAgIHVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKLSNlbmRpZgotCSAgICAgICAvKiBOb3QgbmVjZXNzYXJ5LCBhcyBzZXRfd3BhIGRvZXMgaXQsIHNob3VsZCB3ZSBqdXN0IGRvIGl0IGhlcmUgdGhvdWdoPyAqLwotCSAgICAgICByZXQgPSAwOwotCSAgICAgICBicmVhazsKLSAgICAgICBkZWZhdWx0OgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBhIFdQQSBzdXBwbGljYW50IHJlcXVlc3QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQotICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKLQotICAgICAgIGtmcmVlKHBhcmFtKTsKLQotICAgICAgIHJldHVybiByZXQ7Ci19CiAKIHN0YXRpYyBpbnQKIHByaXNtNTRfc2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTMyMjMsMjAgKzI5MDcsMyBAQAogCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKIAkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMsCiB9OwotCi0vKiBGb3Igd3BhX3N1cHBsaWNhbnQgKi8KLQotaW50Ci1wcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQotewotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKLQlpbnQgcmV0ID0gLTE7Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBQUklTTTU0X0hPU1RBUEQ6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldCA9IHByaXNtNTRfaG9zdGFwZChuZGV2LCAmd3JxLT51LmRhdGEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAppbmRleCBiY2ZiZmI5Li5hMzRiY2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKQEAgLTQzLDggKzQzLDYgQEAKIAogaW50IHByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CiAKLWludCBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOwotCiBleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWY7CiAKICNlbmRpZgkJCQkvKiBfSVNMX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggNWQwZjYxNS4uNTk3MGZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTc5Myw4ICs3OTMsOCBAQAogc3RhdGljIHZvaWQgaXNscGNpX2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpc2xwY2lfZXRodG9vbF9vcHMgPSB7CkBAIC04MDQsNyArODA0LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXNscGNpX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuIAkJPSBpc2xwY2lfb3BlbiwKIAkubmRvX3N0b3AJCT0gaXNscGNpX2Nsb3NlLAotCS5uZG9fZG9faW9jdGwJCT0gcHJpc201NF9pb2N0bCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gaXNscGNpX2V0aF90cmFuc21pdCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gaXNscGNpX2V0aF90eF90aW1lb3V0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IHByaXNtNTRfc2V0X21hY19hZGRyZXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCmluZGV4IDYyMGUzYzAuLjM4MDJjMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKQEAgLTI0NCw2ICsyNDQsMTAgQEAKIAlORElTXzgwMjExX1BPV0VSX01PREVfRkFTVF9QU1AsCiB9OwogCitlbnVtIG5kaXNfODAyMTFfcG1raWRfY2FuZF9saXN0X2ZsYWdfYml0cyB7CisJTkRJU184MDIxMV9QTUtJRF9DQU5EX1BSRUFVVEggPSBjcHVfdG9fbGUzMigxIDw8IDApCit9OworCiBzdHJ1Y3QgbmRpc184MDIxMV9hdXRoX3JlcXVlc3QgewogCV9fbGUzMiBsZW5ndGg7CiAJdTggYnNzaWRbNl07CkBAIC0zODcsMTkgKzM5MSwxNyBAQAogc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfaW5mbyB7CiAJdTggYnNzaWRbNl07CiAJdTggcG1raWRbMTZdOwotfTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBuZGlzXzgwMjExX3Bta2lkIHsKIAlfX2xlMzIgbGVuZ3RoOwogCV9fbGUzMiBic3NpZF9pbmZvX2NvdW50OwogCXN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2luZm8gYnNzaWRfaW5mb1swXTsKLX07Cit9IF9fcGFja2VkOwogCiAvKgogICogIHByaXZhdGUgZGF0YQogICovCi0jZGVmaW5lIE5FVF9UWVBFXzExRkIJMAotCiAjZGVmaW5lIENBUF9NT0RFXzgwMjExQQkJMQogI2RlZmluZSBDQVBfTU9ERV84MDIxMUIJCTIKICNkZWZpbmUgQ0FQX01PREVfODAyMTFHCQk0CkBAIC0xMzQ3LDYgKzEzNDksMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpnZXRfY3VycmVudF9jaGFubmVsKHN0cnVjdCB1c2JuZXQgKnVzYmRldiwKKwkJCQkJCSAgICAgdTE2ICpiZWFjb25faW50ZXJ2YWwpCit7CisJc3RydWN0IHJuZGlzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IGdldF9ybmRpc193bGFuX3ByaXYodXNiZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IG5kaXNfODAyMTFfY29uZiBjb25maWc7CisJaW50IGxlbiwgcmV0OworCisJLyogR2V0IGNoYW5uZWwgYW5kIGJlYWNvbiBpbnRlcnZhbCAqLworCWxlbiA9IHNpemVvZihjb25maWcpOworCXJldCA9IHJuZGlzX3F1ZXJ5X29pZCh1c2JkZXYsIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTiwgJmNvbmZpZywgJmxlbik7CisJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgIiVzKCk6IE9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAtPiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHByaXYtPndkZXYud2lwaHksCisJCQkJS0haX1RPX01IWihsZTMyX3RvX2NwdShjb25maWcuZHNfY29uZmlnKSkpOworCWlmICghY2hhbm5lbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYmVhY29uX2ludGVydmFsKQorCQkqYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoY29uZmlnLmJlYWNvbl9wZXJpb2QpOworCXJldHVybiBjaGFubmVsOworfQorCiAvKiBpbmRleCBtdXN0IGJlIDAgLSBOLCBhcyBwZXIgTkRJUyAgKi8KIHN0YXRpYyBpbnQgYWRkX3dlcF9rZXkoc3RydWN0IHVzYm5ldCAqdXNiZGV2LCBjb25zdCB1OCAqa2V5LCBpbnQga2V5X2xlbiwKIAkJCQkJCQkJaW50IGluZGV4KQpAQCAtMjY1MCwxMyArMjY3OCwxMiBAQAogewogCXN0cnVjdCBybmRpc193bGFuX3ByaXZhdGUgKnByaXYgPSBnZXRfcm5kaXNfd2xhbl9wcml2KHVzYmRldik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwotCXN0cnVjdCBuZGlzXzgwMjExX2NvbmYgY29uZmlnOwogCXN0cnVjdCBuZGlzXzgwMjExX3NzaWQgc3NpZDsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJczMyIHNpZ25hbDsKIAl1NjQgdGltZXN0YW1wOwogCXUxNiBjYXBhYmlsaXR5OwotCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IDA7CiAJX19sZTMyIHJzc2k7CiAJdTggaWVfYnVmWzM0XTsKIAlpbnQgbGVuLCByZXQsIGllX2xlbjsKQEAgLTI2ODEsMjIgKzI3MDgsMTAgQEAKIAl9CiAKIAkvKiBHZXQgY2hhbm5lbCBhbmQgYmVhY29uIGludGVydmFsICovCi0JbGVuID0gc2l6ZW9mKGNvbmZpZyk7Ci0JcmV0ID0gcm5kaXNfcXVlcnlfb2lkKHVzYmRldiwgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAmY29uZmlnLCAmbGVuKTsKLQluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiJXMoKTogT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIC0+ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCWlmIChyZXQgPj0gMCkgewotCQliZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShjb25maWcuYmVhY29uX3BlcmlvZCk7Ci0JCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwocHJpdi0+d2Rldi53aXBoeSwKLQkJCQlLSFpfVE9fTUhaKGxlMzJfdG9fY3B1KGNvbmZpZy5kc19jb25maWcpKSk7Ci0JCWlmICghY2hhbm5lbCkgewotCQkJbmV0ZGV2X3dhcm4odXNiZGV2LT5uZXQsICIlcygpOiBjb3VsZCBub3QgZ2V0IGNoYW5uZWwuIgotCQkJCQkJICJcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ldGRldl93YXJuKHVzYmRldi0+bmV0LCAiJXMoKTogY291bGQgbm90IGdldCBjb25maWd1cmF0aW9uLlxuIiwKLQkJCQkJIF9fZnVuY19fKTsKKwljaGFubmVsID0gZ2V0X2N1cnJlbnRfY2hhbm5lbCh1c2JkZXYsICZiZWFjb25faW50ZXJ2YWwpOworCWlmICghY2hhbm5lbCkgeworCQluZXRkZXZfd2Fybih1c2JkZXYtPm5ldCwgIiVzKCk6IGNvdWxkIG5vdCBnZXQgY2hhbm5lbC5cbiIsCisJCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjg0MSw4ICsyODU2LDkgQEAKIAkJCQkJCXJlcV9pZV9sZW4sIHJlc3BfaWUsCiAJCQkJCQlyZXNwX2llX2xlbiwgMCwgR0ZQX0tFUk5FTCk7CiAJCWVsc2UKLQkJCWNmZzgwMjExX3JvYW1lZCh1c2JkZXYtPm5ldCwgTlVMTCwgYnNzaWQsCi0JCQkJCXJlcV9pZSwgcmVxX2llX2xlbiwKKwkJCWNmZzgwMjExX3JvYW1lZCh1c2JkZXYtPm5ldCwKKwkJCQkJZ2V0X2N1cnJlbnRfY2hhbm5lbCh1c2JkZXYsIE5VTEwpLAorCQkJCQlic3NpZCwgcmVxX2llLCByZXFfaWVfbGVuLAogCQkJCQlyZXNwX2llLCByZXNwX2llX2xlbiwgR0ZQX0tFUk5FTCk7CiAJfSBlbHNlIGlmIChwcml2LT5pbmZyYV9tb2RlID09IE5ESVNfODAyMTFfSU5GUkFfQURIT0MpCiAJCWNmZzgwMjExX2lic3Nfam9pbmVkKHVzYmRldi0+bmV0LCBic3NpZCwgR0ZQX0tFUk5FTCk7CkBAIC0zMDA4LDI1ICszMDI0LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IGxlMzJfdG9fY3B1KGNhbmRfbGlzdC0+bnVtX2NhbmRpZGF0ZXMpOyBpKyspIHsKIAkJc3RydWN0IG5kaXNfODAyMTFfcG1raWRfY2FuZGlkYXRlICpjYW5kID0KIAkJCQkJCSZjYW5kX2xpc3QtPmNhbmRpZGF0ZV9saXN0W2ldOworCQlib29sIHByZWF1dGggPSAhIShjYW5kLT5mbGFncyAmIE5ESVNfODAyMTFfUE1LSURfQ0FORF9QUkVBVVRIKTsKIAotCQluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiY2FuZFslaV06IGZsYWdzOiAweCUwOHgsIGJzc2lkOiAlcE1cbiIsCi0JCQkgICBpLCBsZTMyX3RvX2NwdShjYW5kLT5mbGFncyksIGNhbmQtPmJzc2lkKTsKKwkJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgImNhbmRbJWldOiBmbGFnczogMHglMDh4LCBwcmVhdXRoOiAlZCwgYnNzaWQ6ICVwTVxuIiwKKwkJCSAgIGksIGxlMzJfdG9fY3B1KGNhbmQtPmZsYWdzKSwgcHJlYXV0aCwgY2FuZC0+YnNzaWQpOwogCi0jaWYgMAotCQlzdHJ1Y3QgaXdfcG1raWRfY2FuZCBwY2FuZDsKLQkJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCi0JCW1lbXNldCgmcGNhbmQsIDAsIHNpemVvZihwY2FuZCkpOwotCQlpZiAobGUzMl90b19jcHUoY2FuZC0+ZmxhZ3MpICYgMHgwMSkKLQkJCXBjYW5kLmZsYWdzIHw9IElXX1BNS0lEX0NBTkRfUFJFQVVUSDsKLQkJcGNhbmQuaW5kZXggPSBpOwotCQltZW1jcHkocGNhbmQuYnNzaWQuc2FfZGF0YSwgY2FuZC0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7Ci0JCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YocGNhbmQpOwotCQl3aXJlbGVzc19zZW5kX2V2ZW50KHVzYmRldi0+bmV0LCBJV0VWUE1LSURDQU5ELCAmd3JxdSwKLQkJCQkJCQkJKHU4ICopJnBjYW5kKTsKLSNlbmRpZgorCQljZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHVzYmRldi0+bmV0LCBpLCBjYW5kLT5ic3NpZCwKKwkJCQkJCXByZWF1dGgsIEdGUF9BVE9NSUMpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCmluZGV4IDNmMTgzYTEuLmU1ZGYzODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKQEAgLTEyMDMsOCArMTIwMywxMCBAQAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfQ09OVFJPTCkpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBSWF9GSUxURVJfQ0ZHX0RST1BfUFNQT0xMLAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfUFNQT0xMKSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQSwgMSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQVIsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBSWF9GSUxURVJfQ0ZHX0RST1BfQkEsCisJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQVIsCisJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9DTlRMLAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfQ09OVFJPTCkpOwogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFJYX0ZJTFRFUl9DRkcsIHJlZyk7CkBAIC0zNzcxLDcgKzM3NzMsNyBAQAogCS8qIEFwcGFyZW50bHkgdGhlIGRhdGEgaXMgcmVhZCBmcm9tIGVuZCB0byBzdGFydCAqLwogCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkX2xvY2socnQyeDAwZGV2LCBFRlVTRV9EQVRBMywgJnJlZyk7CiAJLyogVGhlIHJldHVybmVkIHZhbHVlIGlzIGluIENQVSBvcmRlciwgYnV0IGVlcHJvbSBpcyBsZSAqLwotCXJ0MngwMGRldi0+ZWVwcm9tW2ldID0gY3B1X3RvX2xlMzIocmVnKTsKKwkqKHUzMiAqKSZydDJ4MDBkZXYtPmVlcHJvbVtpXSA9IGNwdV90b19sZTMyKHJlZyk7CiAJcnQyODAwX3JlZ2lzdGVyX3JlYWRfbG9jayhydDJ4MDBkZXYsIEVGVVNFX0RBVEEyLCAmcmVnKTsKIAkqKHUzMiAqKSZydDJ4MDBkZXYtPmVlcHJvbVtpICsgMl0gPSBjcHVfdG9fbGUzMihyZWcpOwogCXJ0MjgwMF9yZWdpc3Rlcl9yZWFkX2xvY2socnQyeDAwZGV2LCBFRlVTRV9EQVRBMSwgJnJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKaW5kZXggZjE1NjU3OS4uMzc3ODc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwpAQCAtOTE5LDYgKzkxOSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg5MzViKSB9LAogCS8qIEJ1ZmZhbG8gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAwZTgpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMTU4KSB9LAogCXsgVVNCX0RFVklDRSgweDA0MTEsIDB4MDE2ZikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAxYTIpIH0sCiAJLyogQ29yZWdhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKaW5kZXggMmVjNWMwMC4uOTlmZjEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaApAQCAtOTQzLDYgKzk0Myw3IEBACiAJICogUG93ZXJzYXZpbmcgd29yawogCSAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b3dha2V1cF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzbGVlcF93b3JrOwogCiAJLyoKIAkgKiBEYXRhIHF1ZXVlIGFycmF5cyBmb3IgUlgsIFRYLCBCZWFjb24gYW5kIEFUSU0uCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKaW5kZXggZTFmYjJhOC4uYzNlMWFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwpAQCAtNDY1LDYgKzQ2NSwyMyBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBydDJ4MDBsaWJfc2xlZXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYgPQorCSAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0MngwMF9kZXYsIHNsZWVwX3dvcmspOworCisJaWYgKCF0ZXN0X2JpdChERVZJQ0VfU1RBVEVfUFJFU0VOVCwgJnJ0MngwMGRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENoZWNrIGFnYWluIGlzIHBvd2Vyc2F2aW5nIGlzIGVuYWJsZWQsIHRvIHByZXZlbnQgcmFjZXMgZnJvbSBkZWxheWVkCisJICogd29yayBleGVjdXRpb24uCisJICovCisJaWYgKCF0ZXN0X2JpdChDT05GSUdfUE9XRVJTQVZJTkcsICZydDJ4MDBkZXYtPmZsYWdzKSkKKwkJcnQyeDAwbGliX2NvbmZpZyhydDJ4MDBkZXYsICZydDJ4MDBkZXYtPmh3LT5jb25mLAorCQkJCSBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpOworfQorCiBzdGF0aWMgdm9pZCBydDJ4MDBsaWJfcnhkb25lX2NoZWNrX3BzKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICBzdHJ1Y3Qgcnhkb25lX2VudHJ5X2Rlc2MgKnJ4ZGVzYykKQEAgLTUxMiw4ICs1MjksNyBAQAogCWNhbSB8PSAodGltX2llLT5iaXRtYXBfY3RybCAmIDB4MDEpOwogCiAJaWYgKCFjYW0gJiYgIXRlc3RfYml0KENPTkZJR19QT1dFUlNBVklORywgJnJ0MngwMGRldi0+ZmxhZ3MpKQotCQlydDJ4MDBsaWJfY29uZmlnKHJ0MngwMGRldiwgJnJ0MngwMGRldi0+aHctPmNvbmYsCi0JCQkJIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUyk7CisJCXF1ZXVlX3dvcmsocnQyeDAwZGV2LT53b3JrcXVldWUsICZydDJ4MDBkZXYtPnNsZWVwX3dvcmspOwogfQogCiBzdGF0aWMgaW50IHJ0MngwMGxpYl9yeGRvbmVfcmVhZF9zaWduYWwoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKQEAgLTgxNSwxMSArODMxLDExIEBACiAJaWYgKHNwZWMtPnN1cHBvcnRlZF9yYXRlcyAmIFNVUFBPUlRfUkFURV9PRkRNKQogCQludW1fcmF0ZXMgKz0gODsKIAotCWNoYW5uZWxzID0ga3phbGxvYyhzaXplb2YoKmNoYW5uZWxzKSAqIHNwZWMtPm51bV9jaGFubmVscywgR0ZQX0tFUk5FTCk7CisJY2hhbm5lbHMgPSBrY2FsbG9jKHNwZWMtPm51bV9jaGFubmVscywgc2l6ZW9mKCpjaGFubmVscyksIEdGUF9LRVJORUwpOwogCWlmICghY2hhbm5lbHMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmF0ZXMgPSBremFsbG9jKHNpemVvZigqcmF0ZXMpICogbnVtX3JhdGVzLCBHRlBfS0VSTkVMKTsKKwlyYXRlcyA9IGtjYWxsb2MobnVtX3JhdGVzLCBzaXplb2YoKnJhdGVzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyYXRlcykKIAkJZ290byBleGl0X2ZyZWVfY2hhbm5lbHM7CiAKQEAgLTExNDEsNiArMTE1Nyw3IEBACiAKIAlJTklUX1dPUksoJnJ0MngwMGRldi0+aW50Zl93b3JrLCBydDJ4MDBsaWJfaW50Zl9zY2hlZHVsZWQpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZydDJ4MDBkZXYtPmF1dG93YWtldXBfd29yaywgcnQyeDAwbGliX2F1dG93YWtldXApOworCUlOSVRfV09SSygmcnQyeDAwZGV2LT5zbGVlcF93b3JrLCBydDJ4MDBsaWJfc2xlZXApOwogCiAJLyoKIAkgKiBMZXQgdGhlIGRyaXZlciBwcm9iZSB0aGUgZGV2aWNlIHRvIGRldGVjdCB0aGUgY2FwYWJpbGl0aWVzLgpAQCAtMTE5Nyw2ICsxMjE0LDcgQEAKIAkgKi8KIAljYW5jZWxfd29ya19zeW5jKCZydDJ4MDBkZXYtPmludGZfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydDJ4MDBkZXYtPmF1dG93YWtldXBfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmcnQyeDAwZGV2LT5zbGVlcF93b3JrKTsKIAlpZiAocnQyeDAwX2lzX3VzYihydDJ4MDBkZXYpKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZydDJ4MDBkZXYtPnR4c3RhdHVzX3RpbWVyKTsKIAkJY2FuY2VsX3dvcmtfc3luYygmcnQyeDAwZGV2LT5yeGRvbmVfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKaW5kZXggYmYwYWNmZi4uZWRlM2M1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAgZXhpdF9mYWlsOgogCXJ0MngwMHF1ZXVlX3BhdXNlX3F1ZXVlKHF1ZXVlKTsKICBleGl0X2ZyZWVfc2tiOgotCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWVlZTgwMjExX2ZyZWVfdHhza2IoaHcsIHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydDJ4MDBtYWNfdHgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODAvZGV2LmMKaW5kZXggMDA4MjAxNS4uMmYxNGE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwL2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MC9kZXYuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lZXByb21fOTNjeDYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgInJ0bDgxODAuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4Ny9kZXYuYwppbmRleCAyNDg3M2I1Li40YTc4ZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODcvZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3L2Rldi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VlcHJvbV85M2N4Ni5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAicnRsODE4Ny5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9LY29uZmlnCmluZGV4IDQ1ZTE0NzYuLmQ2YzQyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAogY29uZmlnIFJUTDgxOTJTRQogCXRyaXN0YXRlICJSZWFsdGVrIFJUTDgxOTJTRS9SVEw4MTkxU0UgUENJZSBXaXJlbGVzcyBOZXR3b3JrIEFkYXB0ZXIiCi0JZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIE1BQzgwMjExICYmIEVYUEVSSU1FTlRBTCAmJiBQQ0kKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IFJUTFdJRkkKIAktLS1oZWxwLS0tCkBAIC0yMyw3ICsyMyw3IEBACiAKIGNvbmZpZyBSVEw4MTkyREUKIAl0cmlzdGF0ZSAiUmVhbHRlayBSVEw4MTkyREUvUlRMODE4OERFIFBDSWUgV2lyZWxlc3MgTmV0d29yayBBZGFwdGVyIgotCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBFWFBFUklNRU5UQUwgJiYgUENJCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBSVExXSUZJCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYwppbmRleCBkNGZkZDJhLi5kODFhNjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYwpAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAicmMuaCIKICNpbmNsdWRlICJiYXNlLmgiCkBAIC0zNDQsOSArMzQ1LDkgQEAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihydGxlZnVzZS0+ZGV2X2FkZHIpKSB7CiAJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBydGxlZnVzZS0+ZGV2X2FkZHIpOwogCX0gZWxzZSB7Ci0JCXU4IHJ0bG1hY1tdID0geyAweDAwLCAweGUwLCAweDRjLCAweDgxLCAweDkyLCAweDAwIH07Ci0JCWdldF9yYW5kb21fYnl0ZXMoKHJ0bG1hYyArIChFVEhfQUxFTiAtIDEpKSwgMSk7Ci0JCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBydGxtYWMpOworCQl1OCBydGxtYWMxW10gPSB7IDB4MDAsIDB4ZTAsIDB4NGMsIDB4ODEsIDB4OTIsIDB4MDAgfTsKKwkJZ2V0X3JhbmRvbV9ieXRlcygocnRsbWFjMSArIChFVEhfQUxFTiAtIDEpKSwgMSk7CisJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGh3LCBydGxtYWMxKTsKIAl9CiAKIH0KQEAgLTQ0NywxMiArNDQ4LDExIEBACiAKIAkvKiA8ND4gbG9ja3MgKi8KIAltdXRleF9pbml0KCZydGxwcml2LT5sb2Nrcy5jb25mX211dGV4KTsKLQlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuaXBzX2xvY2spOworCW11dGV4X2luaXQoJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuaXJxX3RoX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5oMmNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLnJmX3BzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5yZl9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy53YWl0cV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuY2NrX2FuZF9yd19wYWdlYV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAppbmRleCA0YWU5MDU5Li5mNjZiNTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaApAQCAtNzYsNyArNzYsNyBAQAogCVNFVF9CSVRTX1RPX0xFXzJCWVRFKF9oZHIsIDgsIDEsIF92YWwpCiAKICNkZWZpbmUgU0VUXzgwMjExX1BTX1BPTExfQUlEKF9oZHIsIF92YWwpCQlcCi0JKCoodTE2ICopKCh1OCAqKShfaGRyKSArIDIpID0gbGUxNl90b19jcHUoX3ZhbCkpCisJKCoodTE2ICopKCh1OCAqKShfaGRyKSArIDIpID0gX3ZhbCkKICNkZWZpbmUgU0VUXzgwMjExX1BTX1BPTExfQlNTSUQoX2hkciwgX3ZhbCkJCVwKIAltZW1jcHkoKCh1OCAqKShfaGRyKSkgKyA0LCAodTggKikoX3ZhbCksIEVUSF9BTEVOKQogI2RlZmluZSBTRVRfODAyMTFfUFNfUE9MTF9UQShfaGRyLCBfdmFsKQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY2FtLmMKaW5kZXggN2JhYmI2YS4uZGMzNmQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJjYW0uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5jCmluZGV4IDNmYzIxZjYuLmVkMTA1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZWZ1c2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2VmdXNlLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAiZWZ1c2UuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKaW5kZXggMTc3YThlNi4uMGQ0ZDI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIndpZmkuaCIKICNpbmNsdWRlICJwY2kuaCIKQEAgLTYwOSw3ICs2MTAsNyBAQAogCWlmICgoKHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QgKwogCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8CiAJCShydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kID4gMikpIHsKLQkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXBzX2xlYXZlX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZydGxwcml2LT53b3Jrcy5scHNfbGVhdmVfd29yayk7CiAJfQogfQogCkBAIC03MzUsNyArNzM2LDcgQEAKIAkJaWYgKCgocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCArCiAJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8CiAJCQkocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCA+IDIpKSB7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CisJCQlzY2hlZHVsZV93b3JrKCZydGxwcml2LT53b3Jrcy5scHNfbGVhdmVfd29yayk7CiAJCX0KIAogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtNzc5LDYgKzc4MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgaW50YSA9IDA7CiAJdTMyIGludGIgPSAwOworCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CiAKQEAgLTc4Niw4ICs3ODgsMTAgQEAKIAlydGxwcml2LT5jZmctPm9wcy0+aW50ZXJydXB0X3JlY29nbml6ZWQoaHcsICZpbnRhLCAmaW50Yik7CiAKIAkvKlNoYXJlZCBJUlEgb3IgSFcgZGlzYXBwYXJlZCAqLwotCWlmICghaW50YSB8fCBpbnRhID09IDB4ZmZmZikKKwlpZiAoIWludGEgfHwgaW50YSA9PSAweGZmZmYpIHsKKwkJcmV0ID0gSVJRX05PTkU7CiAJCWdvdG8gZG9uZTsKKwl9CiAKIAkvKjwxPiBiZWFjb24gcmVsYXRlZCAqLwogCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfVEJET0tdKSB7CkBAIC04ODksMTIgKzg5Myw5IEBACiAJaWYgKHJ0bHByaXYtPnJ0bGhhbC5lYXJseW1vZGVfZW5hYmxlKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9pcnFfdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKQEAgLTkwMiwxMSArOTAzLDYgQEAKIAlfcnRsX3BjaV90eF9jaGtfd2FpdHEoaHcpOwogfQogCi1zdGF0aWMgdm9pZCBfcnRsX3BjaV9pcHNfbGVhdmVfdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlydGxfbHBzX2xlYXZlKGh3KTsKLX0KLQogc3RhdGljIHZvaWQgX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CkBAIC05NDQsNiArOTQwLDE1IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBydGxfbHBzX2xlYXZlX3dvcmtfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydGxfd29ya3MgKnJ0bHdvcmtzID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGxfd29ya3MsIGxwc19sZWF2ZV93b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHJ0bHdvcmtzLT5odzsKKworCXJ0bF9scHNfbGVhdmUoaHcpOworfQorCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9pbml0X3RyeF92YXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKQEAgLTEwMDUsOSArMTAxMCw3IEBACiAJdGFza2xldF9pbml0KCZydGxwcml2LT53b3Jrcy5pcnFfcHJlcGFyZV9iY25fdGFza2xldCwKIAkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZylodyk7Ci0JdGFza2xldF9pbml0KCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCwKLQkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpX3J0bF9wY2lfaXBzX2xlYXZlX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpaHcpOworCUlOSVRfV09SSygmcnRscHJpdi0+d29ya3MubHBzX2xlYXZlX3dvcmssIHJ0bF9scHNfbGVhdmVfd29ya19jYWxsYmFjayk7CiB9CiAKIHN0YXRpYyBpbnQgX3J0bF9wY2lfaW5pdF90eF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTQ3Nyw3ICsxNDgwLDcgQEAKIAogCXN5bmNocm9uaXplX2lycShydGxwY2ktPnBkZXYtPmlycSk7CiAJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7Ci0JdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CisJY2FuY2VsX3dvcmtfc3luYygmcnRscHJpdi0+d29ya3MubHBzX2xlYXZlX3dvcmspOwogCiAJZmx1c2hfd29ya3F1ZXVlKHJ0bHByaXYtPndvcmtzLnJ0bF93cSk7CiAJZGVzdHJveV93b3JrcXVldWUocnRscHJpdi0+d29ya3MucnRsX3dxKTsKQEAgLTE1NTIsNyArMTU1NSw3IEBACiAJc2V0X2hhbF9zdG9wKHJ0bGhhbCk7CiAKIAlydGxwcml2LT5jZmctPm9wcy0+ZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOwotCXRhc2tsZXRfa2lsbCgmcnRscHJpdi0+d29ya3MuaXBzX2xlYXZlX3Rhc2tsZXQpOworCWNhbmNlbF93b3JrX3N5bmMoJnJ0bHByaXYtPndvcmtzLmxwc19sZWF2ZV93b3JrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrLCBmbGFncyk7CiAJd2hpbGUgKHBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYwppbmRleCBhNjkzZmVmLi5hMTRhNjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid2lmaS5oIgogI2luY2x1ZGUgImJhc2UuaCIKICNpbmNsdWRlICJwcy5oIgpAQCAtMjQwLDcgKzI0MSw3IEBACiAJaWYgKG1hYy0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MuaXBzX2xvY2spOworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIAogCWlmIChwcHNjLT5pbmFjdGl2ZXBzKSB7CiAJCXJ0c3RhdGUgPSBwcHNjLT5yZnB3cl9zdGF0ZTsKQEAgLTI1Niw3ICsyNTcsNyBAQAogCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmlwc19sb2NrKTsKKwltdXRleF91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIH0KIAogLypmb3IgRlcgTFBTKi8KQEAgLTM5NCw3ICszOTUsNyBAQAogCWlmIChtYWMtPmxpbmtfc3RhdGUgIT0gTUFDODAyMTFfTElOS0VEKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKKwltdXRleF9sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiAKIAkvKiBJZGxlIGZvciBhIHdoaWxlIGlmIHdlIGNvbm5lY3QgdG8gQVAgYSB3aGlsZSBhZ28uICovCiAJaWYgKG1hYy0+Y250X2FmdGVyX2xpbmtlZCA+PSAyKSB7CkBAIC00MDYsNyArNDA3LDcgQEAKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiB9CiAKIC8qTGVhdmUgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLiovCkBAIC00MTYsNyArNDE3LDcgQEAKIAlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKIAlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOwogCi0Jc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCiAJaWYgKHBwc2MtPmZ3Y3RybF9scHMpIHsKIAkJaWYgKHBwc2MtPmRvdDExX3BzbW9kZSAhPSBFQUNUSVZFKSB7CkBAIC00MzcsNyArNDM4LDcgQEAKIAkJCXJ0bF9scHNfc2V0X3BzbW9kZShodywgRUFDVElWRSk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKKwltdXRleF91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIH0KIAogLyogRm9yIHN3IExQUyovCkBAIC01MzgsOSArNTM5LDkgQEAKIAkJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSk7CiAJfQogCi0Jc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCXJ0bF9wc19zZXRfcmZfc3RhdGUoaHcsIEVSRk9OLCBSRl9DSEFOR0VfQllfUFMpOwotCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiB9CiAKIHZvaWQgcnRsX3N3bHBzX3Jmb25fd3FfY2FsbGJhY2sodm9pZCAqZGF0YSkKQEAgLTU3Myw5ICs1NzQsOSBAQAogCWlmIChydGxwcml2LT5saW5rX2luZm8uYnVzeXRyYWZmaWMpCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIAlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBFUkZTTEVFUCwgUkZfQ0hBTkdFX0JZX1BTKTsKLQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCW11dGV4X3VubG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCiAJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfT0ZGX0xFVkxfQVNQTSAmJgogCQkhUlRfSU5fUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZG1fY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2RtX2NvbW1vbi5jCmluZGV4IGEwMDc3NGUuLjcyYTk4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZG1fY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9kbV9jb21tb24uYwpAQCAtMjcsNiArMjcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImRtX2NvbW1vbi5oIgogI2luY2x1ZGUgInBoeV9jb21tb24uaCIKICNpbmNsdWRlICIuLi9wY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCmluZGV4IDQ5YTA2NGIuLjkzMWQ5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwpAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAiLi4vYmFzZS5oIgpAQCAtNzIsNiArNzMsMzQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9ibG9ja19md193cml0ZU4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNvbnN0IHU4ICpidWZmZXIsCisJCQkJdTMyIHNpemUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBibG9ja1NpemUgPSBSRUFMVEVLX1VTQl9WRU5RVF9NQVhfQlVGX1NJWkUgLSAyMDsKKwl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCisJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CisJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgaSsrKSB7CisJCW9mZnNldCA9IGkgKiBibG9ja1NpemU7CisJCXJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKHJ0bHByaXYsCisJCQkJCShGV184MTkyQ19TVEFSVF9BRERSRVNTICsgb2Zmc2V0KSwKKwkJCQkJKHZvaWQgKikoYnVmZmVyUHRyICsgb2Zmc2V0KSwKKwkJCQkJYmxvY2tTaXplKTsKKwl9CisKKwlpZiAocmVtYWluU2l6ZSkgeworCQlvZmZzZXQgPSBibG9ja0NvdW50ICogYmxvY2tTaXplOworCQlydGxwcml2LT5pby53cml0ZU5fc3luYyhydGxwcml2LAorCQkJCQkoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCisJCQkJCSh2b2lkICopKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJCXJlbWFpblNpemUpOworCX0KK30KKwogc3RhdGljIHZvaWQgX3J0bDkyY19md19ibG9ja193cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBjb25zdCB1OCAqYnVmZmVyLCB1MzIgc2l6ZSkKIHsKQEAgLTgwLDIzICsxMDksMzAgQEAKIAl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKIAl1MzIgKnB1NEJ5dGVQdHIgPSAodTMyICopIGJ1ZmZlcjsKIAl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCXUzMiBkYXRhOwogCisJaWYgKHJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKSB7CisJCXJ0bF9ibG9ja19md193cml0ZU4oaHcsIGJ1ZmZlciwgc2l6ZSk7CisJCXJldHVybjsKKwl9CiAJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CiAJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisJaWYgKHJlbWFpblNpemUpIHsKKwkJLyogdGhlIGxhc3Qgd29yZCBpcyA8IDQgYnl0ZXMgLSBwYWQgaXQgd2l0aCB6ZXJvcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNCAtIHJlbWFpblNpemU7IGkrKykKKwkJCSooYnVmZmVyUHRyICsgc2l6ZSArIGkpID0gMDsKKwkJYmxvY2tDb3VudCsrOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50OyBpKyspIHsKIAkJb2Zmc2V0ID0gaSAqIGJsb2NrU2l6ZTsKKwkJLyogZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm1zLCB0aGUgZmlybXdhcmUgZGF0YSBuZWVkIHRvIGJlIGJ5dGUKKwkJICogc3dhcHBlZCBhcyBpdCB3YXMgcmVhZCBhcyBhIGJ5dGUgc3RyaW5nIGFuZCB3aWxsIGJlIHdyaXR0ZW4KKwkJICogYXMgMzItYml0IGR3b3JkcyBhbmQgYnl0ZSBzd2FwcGVkIHdoZW4gd3JpdHRlbgorCQkgKi8KKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKHB1NEJ5dGVQdHIgKyBpKSk7CiAJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCi0JCQkJKihwdTRCeXRlUHRyICsgaSkpOwotCX0KLQotCWlmIChyZW1haW5TaXplKSB7Ci0JCW9mZnNldCA9IGJsb2NrQ291bnQgKiBibG9ja1NpemU7Ci0JCWJ1ZmZlclB0ciArPSBvZmZzZXQ7Ci0JCWZvciAoaSA9IDA7IGkgPCByZW1haW5TaXplOyBpKyspIHsKLQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChGV184MTkyQ19TVEFSVF9BRERSRVNTICsKLQkJCQkJCSBvZmZzZXQgKyBpKSwgKihidWZmZXJQdHIgKyBpKSk7Ci0JCX0KKwkJCQlkYXRhKTsKIAl9CiB9CiAKQEAgLTIyNiwxMCArMjYyLDEwIEBACiAJdTMyIGZ3c2l6ZTsKIAllbnVtIHZlcnNpb25fODE5MmMgdmVyc2lvbiA9IHJ0bGhhbC0+dmVyc2lvbjsKIAotCXByX2luZm8oIkxvYWRpbmcgZmlybXdhcmUgZmlsZSAlc1xuIiwgcnRscHJpdi0+Y2ZnLT5md19uYW1lKTsKIAlpZiAoIXJ0bGhhbC0+cGZpcm13YXJlKQogCQlyZXR1cm4gMTsKIAorCXByX2luZm8oIkxvYWRpbmcgZmlybXdhcmUgZmlsZSAlc1xuIiwgcnRscHJpdi0+Y2ZnLT5md19uYW1lKTsKIAlwZndoZWFkZXIgPSAoc3RydWN0IHJ0bDkyY19maXJtd2FyZV9oZWFkZXIgKilydGxoYWwtPnBmaXJtd2FyZTsKIAlwZndkYXRhID0gKHU4ICopIHJ0bGhhbC0+cGZpcm13YXJlOwogCWZ3c2l6ZSA9IHJ0bGhhbC0+ZndzaXplOwpAQCAtMjM3LDggKzI3Myw5IEBACiAJaWYgKElTX0ZXX0hFQURFUl9FWElTVChwZndoZWFkZXIpKSB7CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19ETUVTRywKIAkJCSAoIkZpcm13YXJlIFZlcnNpb24oJWQpLCBTaWduYXR1cmUoJSN4KSxTaXplKCVkKVxuIiwKLQkJCSAgcGZ3aGVhZGVyLT52ZXJzaW9uLCBwZndoZWFkZXItPnNpZ25hdHVyZSwKLQkJCSAgKHVpbnQpc2l6ZW9mKHN0cnVjdCBydGw5MmNfZmlybXdhcmVfaGVhZGVyKSkpOworCQkJIGxlMTZfdG9fY3B1KHBmd2hlYWRlci0+dmVyc2lvbiksCisJCQkgbGUxNl90b19jcHUocGZ3aGVhZGVyLT5zaWduYXR1cmUpLAorCQkJICh1aW50KXNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcikpKTsKIAogCQlwZndkYXRhID0gcGZ3ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcik7CiAJCWZ3c2l6ZSA9IGZ3c2l6ZSAtIHNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uaAppbmRleCAzZDU4MjNjLi5jZWM1YTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmgKQEAgLTMyLDMyICszMiwzMiBAQAogCiAjZGVmaW5lIEZXXzgxOTJDX1NJWkUJCQkJMHgzMDAwCiAjZGVmaW5lIEZXXzgxOTJDX1NUQVJUX0FERFJFU1MJCQkweDEwMDAKLSNkZWZpbmUgRldfODE5MkNfRU5EX0FERFJFU1MJCQkweDNGRkYKKyNkZWZpbmUgRldfODE5MkNfRU5EX0FERFJFU1MJCQkweDFGRkYKICNkZWZpbmUgRldfODE5MkNfUEFHRV9TSVpFCQkJNDA5NgogI2RlZmluZSBGV184MTkyQ19QT0xMSU5HX0RFTEFZCQkJNQogI2RlZmluZSBGV184MTkyQ19QT0xMSU5HX1RJTUVPVVRfQ09VTlQJCTEwMAogCiAjZGVmaW5lIElTX0ZXX0hFQURFUl9FWElTVChfcGZ3aGRyKQlcCi0JKChfcGZ3aGRyLT5zaWduYXR1cmUmMHhGRkYwKSA9PSAweDkyQzAgfHxcCi0JKF9wZndoZHItPnNpZ25hdHVyZSYweEZGRjApID09IDB4ODhDMCkKKwkoKGxlMTZfdG9fY3B1KF9wZndoZHItPnNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDkyQzAgfHxcCisJKGxlMTZfdG9fY3B1KF9wZndoZHItPnNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDg4QzApCiAKIHN0cnVjdCBydGw5MmNfZmlybXdhcmVfaGVhZGVyIHsKLQl1MTYgc2lnbmF0dXJlOworCV9fbGUxNiBzaWduYXR1cmU7CiAJdTggY2F0ZWdvcnk7CiAJdTggZnVuY3Rpb247Ci0JdTE2IHZlcnNpb247CisJX19sZTE2IHZlcnNpb247CiAJdTggc3VidmVyc2lvbjsKIAl1OCByc3ZkMTsKIAl1OCBtb250aDsKIAl1OCBkYXRlOwogCXU4IGhvdXI7CiAJdTggbWludXRlOwotCXUxNiByYW1jb2RlU2l6ZTsKLQl1MTYgcnN2ZDI7Ci0JdTMyIHN2bmluZGV4OwotCXUzMiByc3ZkMzsKLQl1MzIgcnN2ZDQ7Ci0JdTMyIHJzdmQ1OworCV9fbGUxNiByYW1jb2RlU2l6ZTsKKwlfX2xlMTYgcnN2ZDI7CisJX19sZTMyIHN2bmluZGV4OworCV9fbGUzMiByc3ZkMzsKKwlfX2xlMzIgcnN2ZDQ7CisJX19sZTMyIHJzdmQ1OwogfTsKIAogZW51bSBydGw4MTkyY19oMmNfY21kIHsKQEAgLTk0LDUgKzk0LDYgQEAKIHZvaWQgcnRsOTJjX3NldF9md19wd3Jtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbW9kZSk7CiB2b2lkIHJ0bDkyY19zZXRfZndfcnN2ZHBhZ2Vwa3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9kbF9maW5pc2hlZCk7CiB2b2lkIHJ0bDkyY19zZXRfZndfam9pbmJzc19yZXBvcnRfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBtc3RhdHVzKTsKK3ZvaWQgdXNiX3dyaXRlTl9hc3luYyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB2b2lkICpkYXRhLCB1MTYgbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvbWFpbi5jCmluZGV4IDJmNjI0ZmMuLjYwNWZmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvbWFpbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vd2lmaS5oIgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKaW5kZXggM2IxMTY0Mi4uMWYwNzU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKQEAgLTI3LDYgKzI3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vcnRsODE5MmNlL3JlZy5oIgogI2luY2x1ZGUgIi4uL3J0bDgxOTJjZS9kZWYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKaW5kZXggNTkyYTEwYS4uM2I1ODVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKQEAgLTU2OSw3ICs1NjksNyBAQAogCQl9CiAJY2FzZSBFUkZTTEVFUDp7CiAJCQlpZiAocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT0ZGKQotCQkJCWJyZWFrOworCQkJCXJldHVybiBmYWxzZTsKIAkJCWZvciAocXVldWVfaWQgPSAwLCBpID0gMDsKIAkJCSAgICAgcXVldWVfaWQgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDspIHsKIAkJCQlyaW5nID0gJnBjaXByaXYtPmRldi50eF9yaW5nW3F1ZXVlX2lkXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCmluZGV4IGE0ODQwNGMuLmYyYWEzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYwpAQCAtMjgsNiArMjgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vd2lmaS5oIgogI2luY2x1ZGUgIi4uL2NvcmUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCmluZGV4IDgxNGMwNWQuLjRlZDk3M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJfQogCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJNQVBcbiIpLAogCQkgICAgICBod2luZm8sIEhXU0VUX01BWF9TSVpFKTsKLQllZXByb21faWQgPSAqKCh1MTYgKikmaHdpbmZvWzBdKTsKKwllZXByb21faWQgPSBsZTE2X3RvX2NwdSgqKChfX2xlMTYgKikmaHdpbmZvWzBdKSk7CiAJaWYgKGVlcHJvbV9pZCAhPSBSVEw4MTkwX0VFUFJPTV9JRCkgewogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAogCQkJICgiRUVQUk9NIElEKCUjeCkgaXMgaW52YWxpZCEhXG4iLCBlZXByb21faWQpKTsKQEAgLTUxNiwxMyArNTE2LDE0IEBACiAJcHJfaW5mbygiTUFDIGFkZHJlc3M6ICVwTVxuIiwgcnRsZWZ1c2UtPmRldl9hZGRyKTsKIAlfcnRsOTJjdV9yZWFkX3R4cG93ZXJfaW5mb19mcm9tX2h3cGcoaHcsCiAJCQkJCSAgIHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKLQlydGxlZnVzZS0+ZWVwcm9tX3ZpZCA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fVklEXTsKLQlydGxlZnVzZS0+ZWVwcm9tX2RpZCA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fRElEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX3ZpZCA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopJmh3aW5mb1tFRVBST01fVklEXSk7CisJcnRsZWZ1c2UtPmVlcHJvbV9kaWQgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZod2luZm9bRUVQUk9NX0RJRF0pOwogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLAogCQkgKCIgVklEID0gMHglMDJ4IFBJRCA9IDB4JTAyeFxuIiwKIAkJIHJ0bGVmdXNlLT5lZXByb21fdmlkLCBydGxlZnVzZS0+ZWVwcm9tX2RpZCkpOwogCXJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPSAqKHU4ICopJmh3aW5mb1tFRVBST01fQ0hBTk5FTFBMQU5dOwotCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fVkVSU0lPTl07CisJcnRsZWZ1c2UtPmVlcHJvbV92ZXJzaW9uID0KKwkJCSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZod2luZm9bRUVQUk9NX1ZFUlNJT05dKTsKIAlydGxlZnVzZS0+dHhwd3JfZnJvbWVwcm9tID0gdHJ1ZTsKIAlydGxlZnVzZS0+ZWVwcm9tX29lbWlkID0gKih1OCAqKSZod2luZm9bRUVQUk9NX0NVU1RPTUVSX0lEXTsKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYwppbmRleCAwNjBhMDZmLi45ZTBjOGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYwpAQCAtODQsNiArODQsNyBAQAogCQl9CiAJfQogCXJ0bGhhbC0+dmVyc2lvbiAgPSAoZW51bSB2ZXJzaW9uXzgxOTJjKWNoaXBfdmVyc2lvbjsKKwlwcl9pbmZvKCJydGw4MTkyY3U6IENoaXAgdmVyc2lvbiAweCV4XG4iLCBjaGlwX3ZlcnNpb24pOwogCXN3aXRjaCAocnRsaGFsLT52ZXJzaW9uKSB7CiAJY2FzZSBWRVJTSU9OX05PUk1BTF9UU01DX0NISVBfOTJDXzFUMlI6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYwppbmRleCA3Mjg1MjkwLi5lNDljZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYwpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgRVJGU0xFRVA6CiAJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpCi0JCQlicmVhazsKKwkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChxdWV1ZV9pZCA9IDAsIGkgPSAwOwogCQkgICAgIHF1ZXVlX2lkIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7KSB7CiAJCQlyaW5nID0gJnBjaXByaXYtPmRldi50eF9yaW5nW3F1ZXVlX2lkXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCmluZGV4IGI5YTE1OGUuLjk0YTNlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgImxlZC5oIgogI2luY2x1ZGUgImh3LmgiCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBNT0RVTEVfQVVUSE9SKCJHZW9yZ2lhCQk8Z2VvcmdpYUByZWFsdGVrLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIlppdiBIdWFuZwk8eml2X2h1YW5nQHJlYWx0ZWsuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYwppbmRleCBiYzMzYjE0Li5iM2NjN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS90cnguYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJU0VUX1RYX0RFU0NfVFhfREVTQ19DSEVDS1NVTSh0eGRlc2MsIDApOwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKQogCQljaGVja3N1bSA9IGNoZWNrc3VtIF4gKCoocHRyICsgaW5kZXgpKTsKLQlTRVRfVFhfREVTQ19UWF9ERVNDX0NIRUNLU1VNKHR4ZGVzYywgY2hlY2tzdW0pOworCVNFVF9UWF9ERVNDX1RYX0RFU0NfQ0hFQ0tTVU0odHhkZXNjLCBjcHVfdG9fbGUxNihjaGVja3N1bSkpOwogfQogCiB2b2lkIHJ0bDkyY3VfdHhfZmlsbF9kZXNjKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYwppbmRleCAzYWM3YWYxLi4wODgzMzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYwpAQCAtMzM3NCw3ICszMzc0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBFUkZTTEVFUDoKIAkJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRikKLQkJCWJyZWFrOworCQkJcmV0dXJuIGZhbHNlOwogCiAJCWZvciAocXVldWVfaWQgPSAwLCBpID0gMDsKIAkJICAgICBxdWV1ZV9pZCA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKaW5kZXggNjkxZjgwMC4uMTQ5NDkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCkBAIC0zMCw2ICszMCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi93aWZpLmgiCiAjaW5jbHVkZSAiLi4vY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYwppbmRleCBmMjcxNzFhLi5mMTBhYzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYwpAQCAtNjAyLDcgKzYwMiw3IEBACiAJCX0KIAljYXNlIEVSRlNMRUVQOgogCQkJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRikKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gZmFsc2U7CiAKIAkJCWZvciAocXVldWVfaWQgPSAwLCBpID0gMDsKIAkJCSAgICAgcXVldWVfaWQgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCmluZGV4IDNlYzlhMGQuLjkyZjQ5ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwpAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vd2lmaS5oIgogI2luY2x1ZGUgIi4uL2NvcmUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3VzYi5jCmluZGV4IGI0MmMyZTIuLmU5NTZmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYwpAQCAtMjgsMTggKzI4LDIwIEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAid2lmaS5oIgogI2luY2x1ZGUgInVzYi5oIgogI2luY2x1ZGUgImJhc2UuaCIKICNpbmNsdWRlICJwcy5oIgorI2luY2x1ZGUgInJ0bDgxOTJjL2Z3X2NvbW1vbi5oIgogCiAjZGVmaW5lCVJFQUxURUtfVVNCX1ZFTlFUX1JFQUQJCQkweEMwCiAjZGVmaW5lCVJFQUxURUtfVVNCX1ZFTlFUX1dSSVRFCQkJMHg0MAogI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRCQkweDA1CiAjZGVmaW5lCVJFQUxURUtfVVNCX1ZFTlFUX0NNRF9JRFgJCTB4MDAKIAotI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9NQVhfQlVGX1NJWkUJCTI1NAorI2RlZmluZSBNQVhfVVNCQ1RSTF9WRU5ET1JSRVFfVElNRVMJCTEwCiAKIHN0YXRpYyB2b2lkIHVzYmN0cmxfYXN5bmNfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewpAQCAtODEsNiArODMsNyBAQAogCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CiAJZHItPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKIAlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KGxlbik7CisJLyogZGF0YSBhcmUgYWxyZWFkeSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyICovCiAJbWVtY3B5KGJ1ZiwgcGRhdGEsIGxlbik7CiAJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCB1ZGV2LCBwaXBlLAogCQkJICAgICAodW5zaWduZWQgY2hhciAqKWRyLCBidWYsIGxlbiwKQEAgLTk5LDE2ICsxMDIsMjggQEAKIAl1bnNpZ25lZCBpbnQgcGlwZTsKIAlpbnQgc3RhdHVzOwogCXU4IHJlcXR5cGU7CisJaW50IHZlbmRvcnJlcV90aW1lcyA9IDA7CisJc3RhdGljIGludCBjb3VudDsKIAogCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCk7IC8qIHJlYWRfaW4gKi8KIAlyZXF0eXBlID0gIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQ7CiAKLQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdHlwZSwgdmFsdWUsIGluZGV4LAotCQkJCSBwZGF0YSwgbGVuLCAwKTsgLyogbWF4LiB0aW1lb3V0ICovCisJZG8geworCQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdHlwZSwgdmFsdWUsCisJCQkJCSBpbmRleCwgcGRhdGEsIGxlbiwgMCk7IC8qbWF4LiB0aW1lb3V0Ki8KKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCS8qIGZpcm13YXJlIGRvd25sb2FkIGlzIGNoZWNrc3VtZWQsIGRvbid0IHJldHJ5ICovCisJCQlpZiAoKHZhbHVlID49IEZXXzgxOTJDX1NUQVJUX0FERFJFU1MgJiYKKwkJCSAgICB2YWx1ZSA8PSBGV184MTkyQ19FTkRfQUREUkVTUykpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCsrdmVuZG9ycmVxX3RpbWVzIDwgTUFYX1VTQkNUUkxfVkVORE9SUkVRX1RJTUVTKTsKIAotCWlmIChzdGF0dXMgPCAwKQorCWlmIChzdGF0dXMgPCAwICYmIGNvdW50KysgPCA0KQogCQlwcl9lcnIoInJlZyAweCV4LCB1c2JjdHJsX3ZlbmRvcnJlcSBUaW1lT3V0ISBzdGF0dXM6MHgleCB2YWx1ZT0weCV4XG4iLAotCQkgICAgICAgdmFsdWUsIHN0YXR1cywgKih1MzIgKilwZGF0YSk7CisJCSAgICAgICB2YWx1ZSwgc3RhdHVzLCBsZTMyX3RvX2NwdSgqKHUzMiAqKXBkYXRhKSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTI4LDcgKzE0Myw3IEBACiAKIAl3dmFsdWUgPSAodTE2KWFkZHI7CiAJX3VzYmN0cmxfdmVuZG9ycmVxX3N5bmNfcmVhZCh1ZGV2LCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCBkYXRhLCBsZW4pOwotCXJldCA9ICpkYXRhOworCXJldCA9IGxlMzJfdG9fY3B1KCpkYXRhKTsKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYwLDEyICsxNzUsMTIgQEAKIAl1OCByZXF1ZXN0OwogCXUxNiB3dmFsdWU7CiAJdTE2IGluZGV4OwotCXUzMiBkYXRhOworCV9fbGUzMiBkYXRhOwogCiAJcmVxdWVzdCA9IFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVE7CiAJaW5kZXggPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfSURYOyAvKiBuL2EgKi8KIAl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOwotCWRhdGEgPSB2YWw7CisJZGF0YSA9IGNwdV90b19sZTMyKHZhbCk7CiAJX3VzYmN0cmxfdmVuZG9ycmVxX2FzeW5jX3dyaXRlKHVkZXYsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLAogCQkJCSAgICAgICBsZW4pOwogfQpAQCAtMTkxLDYgKzIwNiwzMCBAQAogCV91c2Jfd3JpdGVfYXN5bmModG9fdXNiX2RldmljZShkZXYpLCBhZGRyLCB2YWwsIDQpOwogfQogCitzdGF0aWMgdm9pZCBfdXNiX3dyaXRlTl9zeW5jKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHZvaWQgKmRhdGEsCisJCQkgICAgIHUxNiBsZW4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnRscHJpdi0+aW8uZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCXU4IHJlcXVlc3QgPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVROworCXU4IHJlcXR5cGUgPSAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEU7CisJdTE2IHd2YWx1ZTsKKwl1MTYgaW5kZXggPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfSURYOworCWludCBwaXBlID0gdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApOyAvKiB3cml0ZV9vdXQgKi8KKwl1OCAqYnVmZmVyOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOworCWJ1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCAoc2l6ZV90KWxlbiwgR0ZQX0FUT01JQywgJmRtYV9hZGRyKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuOworCW1lbWNweShidWZmZXIsIGRhdGEsIGxlbik7CisJdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHBpcGUsIHJlcXVlc3QsIHJlcXR5cGUsIHd2YWx1ZSwKKwkJCWluZGV4LCBidWZmZXIsIGxlbiwgNTApOworCisJdXNiX2ZyZWVfY29oZXJlbnQodWRldiwgKHNpemVfdClsZW4sIGJ1ZmZlciwgZG1hX2FkZHIpOworfQorCiBzdGF0aWMgdm9pZCBfcnRsX3VzYl9pb19oYW5kbGVyX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC0yMDQsNiArMjQzLDcgQEAKIAlydGxwcml2LT5pby5yZWFkOF9zeW5jCQk9IF91c2JfcmVhZDhfc3luYzsKIAlydGxwcml2LT5pby5yZWFkMTZfc3luYwkJPSBfdXNiX3JlYWQxNl9zeW5jOwogCXJ0bHByaXYtPmlvLnJlYWQzMl9zeW5jCQk9IF91c2JfcmVhZDMyX3N5bmM7CisJcnRscHJpdi0+aW8ud3JpdGVOX3N5bmMJCT0gX3VzYl93cml0ZU5fc3luYzsKIH0KIAogc3RhdGljIHZvaWQgX3J0bF91c2JfaW9faGFuZGxlcl9yZWxlYXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS93aWZpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaAppbmRleCA3MTNjN2RkLi4wODVkY2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaApAQCAtNjMsNiArNjMsNyBAQAogI2RlZmluZSBBQ19NQVgJCQkJCTQKICNkZWZpbmUgUU9TX1FVRVVFX05VTQkJCQk0CiAjZGVmaW5lIFJUTF9NQUM4MDIxMV9OVU1fUVVFVUUJCQk1CisjZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX01BWF9CVUZfU0laRQkJMjU0CiAKICNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQkJNQogI2RlZmluZSBNQVhfV01NRUxFX0xFTkdUSAkJCTY0CkBAIC05NDMsOCArOTQ0LDEwIEBACiAJdW5zaWduZWQgbG9uZyBwY2lfYmFzZV9hZGRyOwkvKmRldmljZSBJL08gYWRkcmVzcyAqLwogCiAJdm9pZCAoKndyaXRlOF9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbCk7Ci0Jdm9pZCAoKndyaXRlMTZfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCBfX2xlMTYgdmFsKTsKLQl2b2lkICgqd3JpdGUzMl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIF9fbGUzMiB2YWwpOworCXZvaWQgKCp3cml0ZTE2X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7CisJdm9pZCAoKndyaXRlMzJfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKTsKKwl2b2lkICgqd3JpdGVOX3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB2b2lkICpidWYsCisJCQkgICAgIHUxNiBsZW4pOwogCiAJdTgoKnJlYWQ4X3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKIAl1MTYoKnJlYWQxNl9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcik7CkBAIC0xNTQxLDE0ICsxNTQ0LDEzIEBACiBzdHJ1Y3QgcnRsX2xvY2tzIHsKIAkvKiBtdXRleCAqLwogCXN0cnVjdCBtdXRleCBjb25mX211dGV4OworCXN0cnVjdCBtdXRleCBwc19tdXRleDsKIAogCS8qc3BpbiBsb2NrICovCi0Jc3BpbmxvY2tfdCBpcHNfbG9jazsKIAlzcGlubG9ja190IGlycV90aF9sb2NrOwogCXNwaW5sb2NrX3QgaDJjX2xvY2s7CiAJc3BpbmxvY2tfdCByZl9wc19sb2NrOwogCXNwaW5sb2NrX3QgcmZfbG9jazsKLQlzcGlubG9ja190IGxwc19sb2NrOwogCXNwaW5sb2NrX3Qgd2FpdHFfbG9jazsKIAogCS8qRHVhbCBtYWMqLwpAQCAtMTU3Myw3ICsxNTc1LDggQEAKIAkvKiBGb3IgU1cgTFBTICovCiAJc3RydWN0IGRlbGF5ZWRfd29yayBwc193b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgcHNfcmZvbl93cTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXBzX2xlYXZlX3Rhc2tsZXQ7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbHBzX2xlYXZlX3dvcms7CiB9OwogCiBzdHJ1Y3QgcnRsX2RlYnVnIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYwppbmRleCBlYWE1Zjk1Li42MjQ4YzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3NwaS5jCkBAIC0zMTksNyArMzE5LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bDEyNTFfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKLQkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwppbmRleCAzZmUzODhiLi5hZjA4Yzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwpAQCAtNDIsMTYgKzQyLDYgQEAKIAkgIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgYSBtb2R1bGUsIGl0J2xsIGJlIGNhbGxlZCB3bDEyeHhfc2Rpby4KIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIFdMMTJYWF9TRElPX1RFU1QKLQl0cmlzdGF0ZSAiVEkgd2wxMnh4IFNESU8gdGVzdGluZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0wxMlhYICYmIE1NQyAmJiBXTDEyWFhfU0RJTwotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgdGhlIFNESU8gYnVzIHRlc3Rpbmcgd2l0aCB0aGUKLQkgIFRJIHdsMTJ4eCBjaGlwc2V0cy4gIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRoaXMgdW5sZXNzIHlvdSBhcmUKLQkgIHRlc3RpbmcgYSBuZXcgaGFyZHdhcmUgcGxhdGZvcm0uICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0byB0ZXN0IHRoZQotCSAgU0RJTyBidXMgd2hpY2ggaXMgY29ubmVjdGVkIHRvIHRoZSB3bDEyeHggY2hpcC4KLQogY29uZmlnIFdMMTJYWF9QTEFURk9STV9EQVRBCiAJYm9vbAogCWRlcGVuZHMgb24gV0wxMlhYX1NESU8gIT0gbiB8fCBXTDEyNTFfU0RJTyAhPSBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUKaW5kZXggNjIxYjM0OC4uZmU2NzI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9NYWtlZmlsZQpAQCAtMywxNCArMywxMSBAQAogCiB3bDEyeHhfc3BpLW9ianMgCT0gc3BpLm8KIHdsMTJ4eF9zZGlvLW9ianMJPSBzZGlvLm8KLXdsMTJ4eF9zZGlvX3Rlc3Qtb2Jqcwk9IHNkaW9fdGVzdC5vCiAKIHdsMTJ4eC0kKENPTkZJR19OTDgwMjExX1RFU1RNT0RFKQkrPSB0ZXN0bW9kZS5vCiBvYmotJChDT05GSUdfV0wxMlhYKQkJCSs9IHdsMTJ4eC5vCiBvYmotJChDT05GSUdfV0wxMlhYX1NQSSkJCSs9IHdsMTJ4eF9zcGkubwogb2JqLSQoQ09ORklHX1dMMTJYWF9TRElPKQkJKz0gd2wxMnh4X3NkaW8ubwogCi1vYmotJChDT05GSUdfV0wxMlhYX1NESU9fVEVTVCkJCSs9IHdsMTJ4eF9zZGlvX3Rlc3QubwotCiAjIHNtYWxsIGJ1aWx0aW4gZHJpdmVyIGJpdAogb2JqLSQoQ09ORklHX1dMMTJYWF9QTEFURk9STV9EQVRBKQkrPSB3bDEyeHhfcGxhdGZvcm1fZGF0YS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmMKaW5kZXggY2EwNDRhNy4uNzUzN2M0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guYwpAQCAtMjksMTEgKzI5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3bDEyeHhfODAyMTEuaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJwcy5oIgogCi1pbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X3dha2VfdXBfY29uZGl0aW9uICp3YWtlX3VwOwogCWludCByZXQ7CkBAIC00Niw3ICs0Nyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdha2VfdXAtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwl3YWtlX3VwLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJd2FrZV91cC0+d2FrZV91cF9ldmVudCA9IHdsLT5jb25mLmNvbm4ud2FrZV91cF9ldmVudDsKIAl3YWtlX3VwLT5saXN0ZW5faW50ZXJ2YWwgPSB3bC0+Y29uZi5jb25uLmxpc3Rlbl9pbnRlcnZhbDsKIApAQCAtODQsNyArODUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3R4X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgcG93ZXIpCitpbnQgd2wxMjcxX2FjeF90eF9wb3dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJaW50IHBvd2VyKQogewogCXN0cnVjdCBhY3hfY3VycmVudF90eF9wb3dlciAqYWN4OwogCWludCByZXQ7CkBAIC0xMDAsNyArMTAyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5jdXJyZW50X3R4X3Bvd2VyID0gcG93ZXIgKiAxMDsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBET1QxMV9DVVJfVFhfUFdSLCBhY3gsIHNpemVvZigqYWN4KSk7CkBAIC0xMTQsNyArMTE2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9mZWF0dXJlX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X2ZlYXR1cmVfY2ZnKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IGFjeF9mZWF0dXJlX2NvbmZpZyAqZmVhdHVyZTsKIAlpbnQgcmV0OwpAQCAtMTI4LDcgKzEzMCw3IEBACiAJfQogCiAJLyogREZfRU5DUllQVElPTl9ESVNBQkxFIGFuZCBERl9TTklGRl9NT0RFX0VOQUJMRSBhcmUgZGlzYWJsZWQgKi8KLQlmZWF0dXJlLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJZmVhdHVyZS0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWZlYXR1cmUtPmRhdGFfZmxvd19vcHRpb25zID0gMDsKIAlmZWF0dXJlLT5vcHRpb25zID0gMDsKIApAQCAtMTg0LDMzICsxODYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3BkX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3QgYWN4X3BhY2tldF9kZXRlY3Rpb24gKnBkOwotCWludCByZXQ7Ci0KLQl3bDEyNzFfZGVidWcoREVCVUdfQUNYLCAiYWN4IGRhdGEgcGQgdGhyZXNob2xkIik7Ci0KLQlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwotCWlmICghcGQpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGQtPnRocmVzaG9sZCA9IGNwdV90b19sZTMyKHdsLT5jb25mLnJ4LnBhY2tldF9kZXRlY3Rpb25fdGhyZXNob2xkKTsKLQotCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfUERfVEhSRVNIT0xELCBwZCwgc2l6ZW9mKCpwZCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV93YXJuaW5nKCJmYWlsZWQgdG8gc2V0IHBkIHRocmVzaG9sZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlrZnJlZShwZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHdsMTI3MV9hY3hfc2xvdChzdHJ1Y3Qgd2wxMjcxICp3bCwgZW51bSBhY3hfc2xvdF90eXBlIHNsb3RfdGltZSkKK2ludCB3bDEyNzFfYWN4X3Nsb3Qoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgIGVudW0gYWN4X3Nsb3RfdHlwZSBzbG90X3RpbWUpCiB7CiAJc3RydWN0IGFjeF9zbG90ICpzbG90OwogCWludCByZXQ7CkBAIC0yMjMsNyArMjAwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2xvdC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCXNsb3QtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlzbG90LT53b25lX2luZGV4ID0gU1RBVElPTl9XT05FX0lOREVYOwogCXNsb3QtPnNsb3RfdGltZSA9IHNsb3RfdGltZTsKIApAQCAtMjM4LDggKzIxNSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLAotCQkJCSB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pCitpbnQgd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZSwgdm9pZCAqbWNfbGlzdCwgdTMyIG1jX2xpc3RfbGVuKQogewogCXN0cnVjdCBhY3hfZG90MTFfZ3JwX2FkZHJfdGJsICphY3g7CiAJaW50IHJldDsKQEAgLTI1Myw3ICsyMzAsNyBAQAogCX0KIAogCS8qIE1BQyBmaWx0ZXJpbmcgKi8KLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmVuYWJsZWQgPSBlbmFibGU7CiAJYWN4LT5udW1fZ3JvdXBzID0gbWNfbGlzdF9sZW47CiAJbWVtY3B5KGFjeC0+bWFjX3RhYmxlLCBtY19saXN0LCBtY19saXN0X2xlbiAqIEVUSF9BTEVOKTsKQEAgLTI3MCw3ICsyNDcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3NlcnZpY2VfcGVyaW9kX3RpbWVvdXQoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9zZXJ2aWNlX3BlcmlvZF90aW1lb3V0KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X3J4X3RpbWVvdXQgKnJ4X3RpbWVvdXQ7CiAJaW50IHJldDsKQEAgLTI4Myw3ICsyNjEsNyBAQAogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0FDWCwgImFjeCBzZXJ2aWNlIHBlcmlvZCB0aW1lb3V0Iik7CiAKLQlyeF90aW1lb3V0LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJcnhfdGltZW91dC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCXJ4X3RpbWVvdXQtPnBzX3BvbGxfdGltZW91dCA9IGNwdV90b19sZTE2KHdsLT5jb25mLnJ4LnBzX3BvbGxfdGltZW91dCk7CiAJcnhfdGltZW91dC0+dXBzZF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYucngudXBzZF90aW1lb3V0KTsKIApAQCAtMzAwLDcgKzI3OCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIHJ0c190aHJlc2hvbGQpCitpbnQgd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIHUzMiBydHNfdGhyZXNob2xkKQogewogCXN0cnVjdCBhY3hfcnRzX3RocmVzaG9sZCAqcnRzOwogCWludCByZXQ7CkBAIC0zMjAsNyArMjk5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnRzLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJcnRzLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJcnRzLT50aHJlc2hvbGQgPSBjcHVfdG9fbGUxNigodTE2KXJ0c190aHJlc2hvbGQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9jb25maWd1cmUod2wsIERPVDExX1JUU19USFJFU0hPTEQsIHJ0cywgc2l6ZW9mKCpydHMpKTsKQEAgLTM2Myw3ICszNDIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZV9maWx0ZXIpCitpbnQgd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZV9maWx0ZXIpCiB7CiAJc3RydWN0IGFjeF9iZWFjb25fZmlsdGVyX29wdGlvbiAqYmVhY29uX2ZpbHRlciA9IE5VTEw7CiAJaW50IHJldCA9IDA7CkBAIC0zODAsNyArMzYwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYmVhY29uX2ZpbHRlci0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWJlYWNvbl9maWx0ZXItPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAliZWFjb25fZmlsdGVyLT5lbmFibGUgPSBlbmFibGVfZmlsdGVyOwogCiAJLyoKQEAgLTQwMSw3ICszODEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX3RhYmxlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X2JlYWNvbl9maWx0ZXJfaWVfdGFibGUgKmllX3RhYmxlOwogCWludCBpLCBpZHggPSAwOwpAQCAtNDE3LDcgKzM5OCw3IEBACiAJfQogCiAJLyogY29uZmlndXJlIGRlZmF1bHQgYmVhY29uIHBhc3MtdGhyb3VnaCBydWxlcyAqLwotCWllX3RhYmxlLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJaWVfdGFibGUtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlpZV90YWJsZS0+bnVtX2llID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPmNvbmYuY29ubi5iY25fZmlsdF9pZV9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBjb25mX2Jjbl9maWx0X3J1bGUgKnIgPSAmKHdsLT5jb25mLmNvbm4uYmNuX2ZpbHRfaWVbaV0pOwpAQCAtNDU4LDcgKzQzOSw4IEBACiAKICNkZWZpbmUgQUNYX0NPTk5fTU9OSVRfRElTQUJMRV9WQUxVRSAgMHhmZmZmZmZmZgogCi1pbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpCitpbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgYWN4X2Nvbm5fbW9uaXRfcGFyYW1zICphY3g7CiAJdTMyIHRocmVzaG9sZCA9IEFDWF9DT05OX01PTklUX0RJU0FCTEVfVkFMVUU7CkBAIC00NzksNyArNDYxLDcgQEAKIAkJdGltZW91dCA9IHdsLT5jb25mLmNvbm4uYnNzX2xvc2VfdGltZW91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPnN5bmNoX2ZhaWxfdGhvbGQgPSBjcHVfdG9fbGUzMih0aHJlc2hvbGQpOwogCWFjeC0+YnNzX2xvc2VfdGltZW91dCA9IGNwdV90b19sZTMyKHRpbWVvdXQpOwogCkBAIC01ODIsNyArNTY0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9iY25fZHRpbV9vcHRpb25zKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCBhY3hfYmVhY29uX2Jyb2FkY2FzdCAqYmI7CiAJaW50IHJldDsKQEAgLTU5NSw3ICs1NzcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQliYi0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWJiLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYmItPmJlYWNvbl9yeF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYuY29ubi5iZWFjb25fcnhfdGltZW91dCk7CiAJYmItPmJyb2FkY2FzdF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYuY29ubi5icm9hZGNhc3RfdGltZW91dCk7CiAJYmItPnJ4X2Jyb2FkY2FzdF9pbl9wcyA9IHdsLT5jb25mLmNvbm4ucnhfYnJvYWRjYXN0X2luX3BzOwpAQCAtNjEyLDcgKzU5NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfYWlkKHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWlkKQoraW50IHdsMTI3MV9hY3hfYWlkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHUxNiBhaWQpCiB7CiAJc3RydWN0IGFjeF9haWQgKmFjeF9haWQ7CiAJaW50IHJldDsKQEAgLTYyNSw3ICs2MDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3hfYWlkLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4X2FpZC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeF9haWQtPmFpZCA9IGNwdV90b19sZTE2KGFpZCk7CiAKIAlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX0FJRCwgYWN4X2FpZCwgc2l6ZW9mKCphY3hfYWlkKSk7CkBAIC02NjgsNyArNjUwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gYWN4X3ByZWFtYmxlX3R5cGUgcHJlYW1ibGUpCitpbnQgd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICBlbnVtIGFjeF9wcmVhbWJsZV90eXBlIHByZWFtYmxlKQogewogCXN0cnVjdCBhY3hfcHJlYW1ibGUgKmFjeDsKIAlpbnQgcmV0OwpAQCAtNjgxLDcgKzY2NCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+cHJlYW1ibGUgPSBwcmVhbWJsZTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfUFJFQU1CTEVfVFlQRSwgYWN4LCBzaXplb2YoKmFjeCkpOwpAQCAtNjk1LDcgKzY3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfY3RzX3Byb3RlY3Qoc3RydWN0IHdsMTI3MSAqd2wsCitpbnQgd2wxMjcxX2FjeF9jdHNfcHJvdGVjdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJICAgZW51bSBhY3hfY3RzcHJvdGVjdF90eXBlIGN0c3Byb3RlY3QpCiB7CiAJc3RydWN0IGFjeF9jdHNwcm90ZWN0ICphY3g7CkBAIC03MDksNyArNjkyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5jdHNwcm90ZWN0ID0gY3RzcHJvdGVjdDsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfQ1RTX1BST1RFQ1RJT04sIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTczOSw3ICs3MjIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IGFjeF9yYXRlX3BvbGljeSAqYWN4OwogCXN0cnVjdCBjb25mX3R4X3JhdGVfY2xhc3MgKmMgPSAmd2wtPmNvbmYudHguc3RhX3JjX2NvbmY7CkBAIC03NTUsMTEgKzczOCwxMSBAQAogCX0KIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJiYXNpY19yYXRlOiAweCV4LCBmdWxsX3JhdGU6IDB4JXgiLAotCQl3bC0+YmFzaWNfcmF0ZSwgd2wtPnJhdGVfc2V0KTsKKwkJd2x2aWYtPmJhc2ljX3JhdGUsIHdsdmlmLT5yYXRlX3NldCk7CiAKIAkvKiBjb25maWd1cmUgb25lIGJhc2ljIHJhdGUgY2xhc3MgKi8KLQlhY3gtPnJhdGVfcG9saWN5X2lkeCA9IGNwdV90b19sZTMyKEFDWF9UWF9CQVNJQ19SQVRFKTsKLQlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZSk7CisJYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMih3bHZpZi0+c3RhLmJhc2ljX3JhdGVfaWR4KTsKKwlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bHZpZi0+YmFzaWNfcmF0ZSk7CiAJYWN4LT5yYXRlX3BvbGljeS5zaG9ydF9yZXRyeV9saW1pdCA9IGMtPnNob3J0X3JldHJ5X2xpbWl0OwogCWFjeC0+cmF0ZV9wb2xpY3kubG9uZ19yZXRyeV9saW1pdCA9IGMtPmxvbmdfcmV0cnlfbGltaXQ7CiAJYWN4LT5yYXRlX3BvbGljeS5hZmxhZ3MgPSBjLT5hZmxhZ3M7CkBAIC03NzEsOCArNzU0LDggQEAKIAl9CiAKIAkvKiBjb25maWd1cmUgb25lIEFQIHN1cHBvcnRlZCByYXRlIGNsYXNzICovCi0JYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMihBQ1hfVFhfQVBfRlVMTF9SQVRFKTsKLQlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+cmF0ZV9zZXQpOworCWFjeC0+cmF0ZV9wb2xpY3lfaWR4ID0gY3B1X3RvX2xlMzIod2x2aWYtPnN0YS5hcF9yYXRlX2lkeCk7CisJYWN4LT5yYXRlX3BvbGljeS5lbmFibGVkX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAlhY3gtPnJhdGVfcG9saWN5LnNob3J0X3JldHJ5X2xpbWl0ID0gYy0+c2hvcnRfcmV0cnlfbGltaXQ7CiAJYWN4LT5yYXRlX3BvbGljeS5sb25nX3JldHJ5X2xpbWl0ID0gYy0+bG9uZ19yZXRyeV9saW1pdDsKIAlhY3gtPnJhdGVfcG9saWN5LmFmbGFncyA9IGMtPmFmbGFnczsKQEAgLTc4OCw3ICs3NzEsNyBAQAogCSAqIChwMnAgcGFja2V0cyBzaG91bGQgYWx3YXlzIGdvIG91dCB3aXRoIE9GRE0gcmF0ZXMsIGV2ZW4KIAkgKiBpZiB3ZSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byAxMWIgQVApCiAJICovCi0JYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMihBQ1hfVFhfQkFTSUNfUkFURV9QMlApOworCWFjeC0+cmF0ZV9wb2xpY3lfaWR4ID0gY3B1X3RvX2xlMzIod2x2aWYtPnN0YS5wMnBfcmF0ZV9pZHgpOwogCWFjeC0+cmF0ZV9wb2xpY3kuZW5hYmxlZF9yYXRlcyA9CiAJCQkJY3B1X3RvX2xlMzIoQ09ORl9UWF9SQVRFX01BU0tfQkFTSUNfUDJQKTsKIAlhY3gtPnJhdGVfcG9saWN5LnNob3J0X3JldHJ5X2xpbWl0ID0gYy0+c2hvcnRfcmV0cnlfbGltaXQ7CkBAIC04MzksOCArODIyLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9hY19jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGFjLCB1OCBjd19taW4sIHUxNiBjd19tYXgsCi0JCSAgICAgIHU4IGFpZnNuLCB1MTYgdHhvcCkKK2ludCB3bDEyNzFfYWN4X2FjX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LCB1OCBhaWZzbiwgdTE2IHR4b3ApCiB7CiAJc3RydWN0IGFjeF9hY19jZmcgKmFjeDsKIAlpbnQgcmV0ID0gMDsKQEAgLTg1NSw3ICs4MzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmFjID0gYWM7CiAJYWN4LT5jd19taW4gPSBjd19taW47CiAJYWN4LT5jd19tYXggPSBjcHVfdG9fbGUxNihjd19tYXgpOwpAQCAtODczLDcgKzg1Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKK2ludCB3bDEyNzFfYWN4X3RpZF9jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHU4IHF1ZXVlX2lkLCB1OCBjaGFubmVsX3R5cGUsCiAJCSAgICAgICB1OCB0c2lkLCB1OCBwc19zY2hlbWUsIHU4IGFja19wb2xpY3ksCiAJCSAgICAgICB1MzIgYXBzZF9jb25mMCwgdTMyIGFwc2RfY29uZjEpCiB7CkBAIC04ODksNyArODczLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5xdWV1ZV9pZCA9IHF1ZXVlX2lkOwogCWFjeC0+Y2hhbm5lbF90eXBlID0gY2hhbm5lbF90eXBlOwogCWFjeC0+dHNpZCA9IHRzaWQ7CkBAIC0xMDk4LDcgKzEwODIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JldF9lbmFibGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfYmV0X2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9iZXRfZW5hYmxlICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTExNCw3ICsxMDk5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5lbmFibGUgPSBlbmFibGUgPyBDT05GX0JFVF9NT0RFX0VOQUJMRSA6IENPTkZfQkVUX01PREVfRElTQUJMRTsKIAlhY3gtPm1heF9jb25zZWN1dGl2ZSA9IHdsLT5jb25mLmNvbm4uYmV0X21heF9jb25zZWN1dGl2ZTsKIApAQCAtMTEyOSw3ICsxMTE0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBlbmFibGUsIF9fYmUzMiBhZGRyZXNzKQoraW50IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICB1OCBlbmFibGUsIF9fYmUzMiBhZGRyZXNzKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2FycF9maWx0ZXIgKmFjeDsKIAlpbnQgcmV0OwpAQCAtMTE0Miw3ICsxMTI4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT52ZXJzaW9uID0gQUNYX0lQVjRfVkVSU0lPTjsKIAlhY3gtPmVuYWJsZSA9IGVuYWJsZTsKIApAQCAtMTE4OSw3ICsxMTc1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTIwMiw3ICsxMTg5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5lbmFibGVkID0gZW5hYmxlOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9jb25maWd1cmUod2wsIEFDWF9LRUVQX0FMSVZFX01PREUsIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTEyMTYsNyArMTIwMyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGluZGV4LCB1OCB0cGxfdmFsaWQpCitpbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSB1OCBpbmRleCwgdTggdHBsX3ZhbGlkKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTIyOSw3ICsxMjE3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5wZXJpb2QgPSBjcHVfdG9fbGUzMih3bC0+Y29uZi5jb25uLmtlZXBfYWxpdmVfaW50ZXJ2YWwpOwogCWFjeC0+aW5kZXggPSBpbmRleDsKIAlhY3gtPnRwbF92YWxpZGF0aW9uID0gdHBsX3ZhbGlkOwpAQCAtMTI0Nyw4ICsxMjM1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSwKLQkJCQlzMTYgdGhvbGQsIHU4IGh5c3QpCitpbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJYm9vbCBlbmFibGUsIHMxNiB0aG9sZCwgdTggaHlzdCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTI2MSw5ICsxMjQ5LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2wtPmxhc3RfcnNzaV9ldmVudCA9IC0xOworCXdsdmlmLT5sYXN0X3Jzc2lfZXZlbnQgPSAtMTsKIAotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+cGFjaW5nID0gY3B1X3RvX2xlMTYod2wtPmNvbmYucm9hbV90cmlnZ2VyLnRyaWdnZXJfcGFjaW5nKTsKIAlhY3gtPm1ldHJpYyA9IFdMMTI3MV9BQ1hfVFJJR19NRVRSSUNfUlNTSV9CRUFDT047CiAJYWN4LT50eXBlID0gV0wxMjcxX0FDWF9UUklHX1RZUEVfRURHRTsKQEAgLTEyODgsNyArMTI3Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl9hdmdfd2VpZ2h0cyhzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X3Jzc2lfc25yX2F2Z193ZWlnaHRzICphY3ggPSBOVUxMOwogCXN0cnVjdCBjb25mX3JvYW1fdHJpZ2dlcl9zZXR0aW5ncyAqYyA9ICZ3bC0+Y29uZi5yb2FtX3RyaWdnZXI7CkBAIC0xMzAyLDcgKzEyOTEsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPnJzc2lfYmVhY29uID0gYy0+YXZnX3dlaWdodF9yc3NpX2JlYWNvbjsKIAlhY3gtPnJzc2lfZGF0YSA9IGMtPmF2Z193ZWlnaHRfcnNzaV9kYXRhOwogCWFjeC0+c25yX2JlYWNvbiA9IGMtPmF2Z193ZWlnaHRfc25yX2JlYWNvbjsKQEAgLTEzNjcsNiArMTM1Niw3IEBACiB9CiAKIGludCB3bDEyNzFfYWN4X3NldF9odF9pbmZvcm1hdGlvbihzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJICAgdTE2IGh0X29wZXJhdGlvbl9tb2RlKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2h0X2luZm9ybWF0aW9uICphY3g7CkBAIC0xMzgwLDcgKzEzNzAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmh0X3Byb3RlY3Rpb24gPQogCQkodTgpKGh0X29wZXJhdGlvbl9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTik7CiAJYWN4LT5yaWZzX21vZGUgPSAwOwpAQCAtMTQwMiw3ICsxMzkyLDggQEAKIH0KIAogLyogQ29uZmlndXJlIEJBIHNlc3Npb24gaW5pdGlhdG9yL3JlY2VpdmVyIHBhcmFtZXRlcnMgc2V0dGluZyBpbiB0aGUgRlcuICovCi1pbnQgd2wxMnh4X2FjeF9zZXRfYmFfaW5pdGlhdG9yX3BvbGljeShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfYWN4X3NldF9iYV9pbml0aWF0b3JfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfYmFfaW5pdGlhdG9yX3BvbGljeSAqYWN4OwogCWludCByZXQ7CkBAIC0xNDE2LDcgKzE0MDcsNyBAQAogCX0KIAogCS8qIHNldCBmb3IgdGhlIGN1cnJlbnQgcm9sZSAqLwotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+dGlkX2JpdG1hcCA9IHdsLT5jb25mLmh0LnR4X2JhX3RpZF9iaXRtYXA7CiAJYWN4LT53aW5fc2l6ZSA9IHdsLT5jb25mLmh0LnR4X2JhX3dpbl9zaXplOwogCWFjeC0+aW5hY3Rpdml0eV90aW1lb3V0ID0gd2wtPmNvbmYuaHQuaW5hY3Rpdml0eV90aW1lb3V0OwpAQCAtMTQ5NCw3ICsxNDg1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nICpyeF9zdHJlYW1pbmc7CiAJdTMyIGNvbmZfcXVldWVzLCBlbmFibGVfcXVldWVzOwpAQCAtMTUyMyw3ICsxNTE1LDcgQEAKIAkJaWYgKCEoY29uZl9xdWV1ZXMgJiBCSVQoaSkpKQogCQkJY29udGludWU7CiAKLQkJcnhfc3RyZWFtaW5nLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJCXJ4X3N0cmVhbWluZy0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCQlyeF9zdHJlYW1pbmctPnRpZCA9IGk7CiAJCXJ4X3N0cmVhbWluZy0+ZW5hYmxlID0gZW5hYmxlX3F1ZXVlcyAmIEJJVChpKTsKIAkJcnhfc3RyZWFtaW5nLT5wZXJpb2QgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWw7CkBAIC0xNTQyLDcgKzE1MzQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeSAqYWN4ID0gTlVMTDsKIAlpbnQgcmV0OwpAQCAtMTU1Myw3ICsxNTQ1LDcgQEAKIAlpZiAoIWFjeCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPm1heF90eF9yZXRyeSA9IGNwdV90b19sZTE2KHdsLT5jb25mLnR4Lm1heF90eF9yZXRyaWVzKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfTUFYX1RYX0ZBSUxVUkUsIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTE1NjcsNyArMTU1OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTJ4eF9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfY29uZmlnX3BzICpjb25maWdfcHM7CiAJaW50IHJldDsKQEAgLTE1ODIsNyArMTU3NCw3IEBACiAKIAljb25maWdfcHMtPmV4aXRfcmV0cmllcyA9IHdsLT5jb25mLmNvbm4ucHNtX2V4aXRfcmV0cmllczsKIAljb25maWdfcHMtPmVudGVyX3JldHJpZXMgPSB3bC0+Y29uZi5jb25uLnBzbV9lbnRyeV9yZXRyaWVzOwotCWNvbmZpZ19wcy0+bnVsbF9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZSk7CisJY29uZmlnX3BzLT5udWxsX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHdsdmlmLT5iYXNpY19yYXRlKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfQ09ORklHX1BTLCBjb25maWdfcHMsCiAJCQkJICAgc2l6ZW9mKCpjb25maWdfcHMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaAppbmRleCBlM2Y5M2I0Li42OTg5MmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oCkBAIC0xNzEsMTMgKzE3MSw2IEBACiAJX19sZTMyIGxpZmV0aW1lOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGFjeF9wYWNrZXRfZGV0ZWN0aW9uIHsKLQlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7Ci0KLQlfX2xlMzIgdGhyZXNob2xkOwotfSBfX3BhY2tlZDsKLQotCiBlbnVtIGFjeF9zbG90X3R5cGUgewogCVNMT1RfVElNRV9MT05HID0gMCwKIAlTTE9UX1RJTUVfU0hPUlQgPSAxLApAQCAtNjU0LDExICs2NDcsNiBAQAogCXU4IHJlc2VydmVkOwogfTsKIAotI2RlZmluZSBBQ1hfVFhfQkFTSUNfUkFURSAgICAgIDAKLSNkZWZpbmUgQUNYX1RYX0FQX0ZVTExfUkFURSAgICAxCi0jZGVmaW5lIEFDWF9UWF9CQVNJQ19SQVRFX1AyUCAgMgotI2RlZmluZSBBQ1hfVFhfQVBfTU9ERV9NR01UX1JBVEUgNAotI2RlZmluZSBBQ1hfVFhfQVBfTU9ERV9CQ1NUX1JBVEUgNQogc3RydWN0IGFjeF9yYXRlX3BvbGljeSB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCkBAIC0xMjM0LDM5ICsxMjIyLDQ4IEBACiB9OwogCiAKLWludCB3bDEyNzFfYWN4X3dha2VfdXBfY29uZGl0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOwogaW50IHdsMTI3MV9hY3hfc2xlZXBfYXV0aChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggc2xlZXBfYXV0aCk7Ci1pbnQgd2wxMjcxX2FjeF90eF9wb3dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IHBvd2VyKTsKLWludCB3bDEyNzFfYWN4X2ZlYXR1cmVfY2ZnKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfYWN4X3R4X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQlpbnQgcG93ZXIpOworaW50IHdsMTI3MV9hY3hfZmVhdHVyZV9jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMjcxX2FjeF9tZW1fbWFwKHN0cnVjdCB3bDEyNzEgKndsLAogCQkgICAgICAgc3RydWN0IGFjeF9oZWFkZXIgKm1lbV9tYXAsIHNpemVfdCBsZW4pOwogaW50IHdsMTI3MV9hY3hfcnhfbXNkdV9saWZlX3RpbWUoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfcGRfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfYWN4X3Nsb3Qoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gYWN4X3Nsb3RfdHlwZSBzbG90X3RpbWUpOwotaW50IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLAotCQkJCSB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pOwotaW50IHdsMTI3MV9hY3hfc2VydmljZV9wZXJpb2RfdGltZW91dChzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsLCB1MzIgcnRzX3RocmVzaG9sZCk7CitpbnQgd2wxMjcxX2FjeF9zbG90KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICBlbnVtIGFjeF9zbG90X3R5cGUgc2xvdF90aW1lKTsKK2ludCB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIGJvb2wgZW5hYmxlLCB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pOworaW50IHdsMTI3MV9hY3hfc2VydmljZV9wZXJpb2RfdGltZW91dChzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICB1MzIgcnRzX3RocmVzaG9sZCk7CiBpbnQgd2wxMjcxX2FjeF9kY29faXRyaW1fcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZV9maWx0ZXIpOwotaW50IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl90YWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOworaW50IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgYm9vbCBlbmFibGVfZmlsdGVyKTsKK2ludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIGJvb2wgZW5hYmxlKTsKIGludCB3bDEyNzFfYWN4X3NnX2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwogaW50IHdsMTJ4eF9hY3hfc2dfY2ZnKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfYWN4X2NjYV90aHJlc2hvbGQoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9haWQoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhaWQpOworaW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyNzFfYWN4X2FpZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1MTYgYWlkKTsKIGludCB3bDEyNzFfYWN4X2V2ZW50X21ib3hfbWFzayhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGV2ZW50X21hc2spOwotaW50IHdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBlbnVtIGFjeF9wcmVhbWJsZV90eXBlIHByZWFtYmxlKTsKLWludCB3bDEyNzFfYWN4X2N0c19wcm90ZWN0KHN0cnVjdCB3bDEyNzEgKndsLAoraW50IHdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgZW51bSBhY3hfcHJlYW1ibGVfdHlwZSBwcmVhbWJsZSk7CitpbnQgd2wxMjcxX2FjeF9jdHNfcHJvdGVjdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJICAgZW51bSBhY3hfY3RzcHJvdGVjdF90eXBlIGN0c3Byb3RlY3QpOwogaW50IHdsMTI3MV9hY3hfc3RhdGlzdGljcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGFjeF9zdGF0aXN0aWNzICpzdGF0cyk7Ci1pbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgY29uZl90eF9yYXRlX2NsYXNzICpjLAogCQkgICAgICB1OCBpZHgpOwotaW50IHdsMTI3MV9hY3hfYWNfY2ZnKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LAotCQkgICAgICB1OCBhaWZzbiwgdTE2IHR4b3ApOwotaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKK2ludCB3bDEyNzFfYWN4X2FjX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LCB1OCBhaWZzbiwgdTE2IHR4b3ApOworaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICAgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKIAkJICAgICAgIHU4IHRzaWQsIHU4IHBzX3NjaGVtZSwgdTggYWNrX3BvbGljeSwKIAkJICAgICAgIHUzMiBhcHNkX2NvbmYwLCB1MzIgYXBzZF9jb25mMSk7CiBpbnQgd2wxMjcxX2FjeF9mcmFnX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGZyYWdfdGhyZXNob2xkKTsKQEAgLTEyNzYsMjYgKzEyNzMsMzQgQEAKIGludCB3bDEyNzFfYWN4X2hvc3RfaWZfY2ZnX2JpdG1hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGhvc3RfY2ZnX2JpdG1hcCk7CiBpbnQgd2wxMjcxX2FjeF9pbml0X3J4X2ludGVycnVwdChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX2FjeF9zbWFydF9yZWZsZXgoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfYmV0X2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwotaW50IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggZW5hYmxlLCBfX2JlMzIgYWRkcmVzcyk7CitpbnQgd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgdTggZW5hYmxlLCBfX2JlMzIgYWRkcmVzcyk7CiBpbnQgd2wxMjcxX2FjeF9wbV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci1pbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaW5kZXgsIHU4IHRwbF92YWxpZCk7Ci1pbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSwKLQkJCQlzMTYgdGhvbGQsIHU4IGh5c3QpOwotaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqdmlmLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIHU4IGluZGV4LCB1OCB0cGxfdmFsaWQpOworaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfdHJpZ2dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCWJvb2wgZW5hYmxlLCBzMTYgdGhvbGQsIHU4IGh5c3QpOworaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMjcxX2FjeF9zZXRfaHRfY2FwYWJpbGl0aWVzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKIAkJCQkgICAgYm9vbCBhbGxvd19odF9vcGVyYXRpb24sIHU4IGhsaWQpOwogaW50IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkgICB1MTYgaHRfb3BlcmF0aW9uX21vZGUpOwotaW50IHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMnh4X2FjeF9zZXRfYmFfcmVjZWl2ZXJfc2Vzc2lvbihzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggdGlkX2luZGV4LAogCQkJCSAgICAgICB1MTYgc3NuLCBib29sIGVuYWJsZSwgdTggcGVlcl9obGlkKTsKIGludCB3bDEyNzFfYWN4X3RzZl9pbmZvKHN0cnVjdCB3bDEyNzEgKndsLCB1NjQgKm1hY3RpbWUpOwotaW50IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci1pbnQgd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfYWN4X3BzX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfYWN4X2NvbmZpZ19wcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyNzFfYWN4X3NldF9pbmNvbm5lY3Rpb25fc3RhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkcik7CiBpbnQgd2wxMjcxX2FjeF9mbV9jb2V4KHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyeHhfYWN4X3NldF9yYXRlX21nbXRfcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYm9vdC5jCmluZGV4IGQ0ZTYyOGQuLjhmOWNmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYwpAQCAtMjMsNyArMjMsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJhY3guaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJib290LmgiCkBAIC0zNDYsNiArMzQ4LDkgQEAKIAkJbnZzX3B0ciArPSAzOwogCiAJCWZvciAoaSA9IDA7IGkgPCBidXJzdF9sZW47IGkrKykgeworCQkJaWYgKG52c19wdHIgKyAzID49ICh1OCAqKSB3bC0+bnZzICsgbnZzX2xlbikKKwkJCQlnb3RvIG91dF9iYWRudnM7CisKIAkJCXZhbCA9IChudnNfcHRyWzBdIHwgKG52c19wdHJbMV0gPDwgOCkKIAkJCSAgICAgICB8IChudnNfcHRyWzJdIDw8IDE2KSB8IChudnNfcHRyWzNdIDw8IDI0KSk7CiAKQEAgLTM1Nyw2ICszNjIsOSBAQAogCQkJbnZzX3B0ciArPSA0OwogCQkJZGVzdF9hZGRyICs9IDQ7CiAJCX0KKworCQlpZiAobnZzX3B0ciA+PSAodTggKikgd2wtPm52cyArIG52c19sZW4pCisJCQlnb3RvIG91dF9iYWRudnM7CiAJfQogCiAJLyoKQEAgLTM2OCw2ICszNzYsMTAgQEAKIAkgKi8KIAludnNfcHRyID0gKHU4ICopd2wtPm52cyArCiAJCQlBTElHTihudnNfcHRyIC0gKHU4ICopd2wtPm52cyArIDcsIDQpOworCisJaWYgKG52c19wdHIgPj0gKHU4ICopIHdsLT5udnMgKyBudnNfbGVuKQorCQlnb3RvIG91dF9iYWRudnM7CisKIAludnNfbGVuIC09IG52c19wdHIgLSAodTggKil3bC0+bnZzOwogCiAJLyogTm93IHdlIG11c3Qgc2V0IHRoZSBwYXJ0aXRpb24gY29ycmVjdGx5ICovCkBAIC0zODMsNiArMzk1LDEwIEBACiAKIAlrZnJlZShudnNfYWxpZ25lZCk7CiAJcmV0dXJuIDA7CisKK291dF9iYWRudnM6CisJd2wxMjcxX2Vycm9yKCJudnMgZGF0YSBpcyBtYWxmb3JtZWQiKTsKKwlyZXR1cm4gLUVJTFNFUTsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX2Jvb3RfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmMKaW5kZXggYTUyMjk5ZS4uZTBkMjE3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiaW8uaCIKICNpbmNsdWRlICJhY3guaCIKQEAgLTEyMCw2ICsxMjEsMTEgQEAKIAlpZiAoIXdsLT5udnMpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlciA+PSBXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlQpIHsKKwkJd2wxMjcxX3dhcm5pbmcoIkZFTSBpbmRleCBmcm9tIElOSSBvdXQgb2YgYm91bmRzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWdlbl9wYXJtcyA9IGt6YWxsb2Moc2l6ZW9mKCpnZW5fcGFybXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdlbl9wYXJtcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNDMsNiArMTQ5LDEyIEBACiAJZ3AtPnR4X2JpcF9mZW1fbWFudWZhY3R1cmVyID0KIAkJZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlcjsKIAorCWlmIChncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIgPj0gV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UKSB7CisJCXdsMTI3MV93YXJuaW5nKCJGRU0gaW5kZXggZnJvbSBGVyBvdXQgb2YgYm91bmRzIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJGRU0gYXV0b2RldGVjdDogJXMsIG1hbnVmYWN0dXJlcjogJWRcbiIsCiAJCSAgICAgYW5zd2VyID8gImF1dG8iIDogIm1hbnVhbCIsIGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlcik7CiAKQEAgLTE2Miw2ICsxNzQsMTEgQEAKIAlpZiAoIXdsLT5udnMpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlciA+PSBXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlQpIHsKKwkJd2wxMjcxX3dhcm5pbmcoIkZFTSBpbmRleCBmcm9tIGluaSBvdXQgb2YgYm91bmRzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWdlbl9wYXJtcyA9IGt6YWxsb2Moc2l6ZW9mKCpnZW5fcGFybXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdlbl9wYXJtcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODYsNiArMjAzLDEyIEBACiAJZ3AtPnR4X2JpcF9mZW1fbWFudWZhY3R1cmVyID0KIAkJZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlcjsKIAorCWlmIChncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIgPj0gV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UKSB7CisJCXdsMTI3MV93YXJuaW5nKCJGRU0gaW5kZXggZnJvbSBGVyBvdXQgb2YgYm91bmRzIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJGRU0gYXV0b2RldGVjdDogJXMsIG1hbnVmYWN0dXJlcjogJWRcbiIsCiAJCSAgICAgYW5zd2VyID8gImF1dG8iIDogIm1hbnVhbCIsIGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlcik7CiAKQEAgLTM1OCw3ICszODEsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcm9sZV90eXBlLCB1OCAqcm9sZV9pZCkKK2ludCB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkciwgdTggcm9sZV90eXBlLAorCQkJICAgdTggKnJvbGVfaWQpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUgKmNtZDsKIAlpbnQgcmV0OwpAQCAtMzgxLDcgKzQwNSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JbWVtY3B5KGNtZC0+bWFjX2FkZHJlc3MsIHdsLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShjbWQtPm1hY19hZGRyZXNzLCBhZGRyLCBFVEhfQUxFTik7CiAJY21kLT5yb2xlX3R5cGUgPSByb2xlX3R5cGU7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9ST0xFX0VOQUJMRSwgY21kLCBzaXplb2YoKmNtZCksIDApOwpAQCAtNDMzLDM3ICs0NTcsNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqaGxpZCkKK2ludCB3bDEyeHhfYWxsb2NhdGVfbGluayhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCAqaGxpZCkKIHsKIAl1OCBsaW5rID0gZmluZF9maXJzdF96ZXJvX2JpdCh3bC0+bGlua3NfbWFwLCBXTDEyWFhfTUFYX0xJTktTKTsKIAlpZiAobGluayA+PSBXTDEyWFhfTUFYX0xJTktTKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJX19zZXRfYml0KGxpbmssIHdsLT5saW5rc19tYXApOworCV9fc2V0X2JpdChsaW5rLCB3bHZpZi0+bGlua3NfbWFwKTsKIAkqaGxpZCA9IGxpbms7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTJ4eF9mcmVlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsIHU4ICpobGlkKQordm9pZCB3bDEyeHhfZnJlZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4ICpobGlkKQogewogCWlmICgqaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKQogCQlyZXR1cm47CiAKIAlfX2NsZWFyX2JpdCgqaGxpZCwgd2wtPmxpbmtzX21hcCk7CisJX19jbGVhcl9iaXQoKmhsaWQsIHdsdmlmLT5saW5rc19tYXApOwogCSpobGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKIH0KIAotc3RhdGljIGludCB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewotCWlmICh3bC0+c2Vzc2lvbl9jb3VudGVyID49IFNFU1NJT05fQ09VTlRFUl9NQVgpCi0JCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOworCWlmICh3bHZpZi0+c2Vzc2lvbl9jb3VudGVyID49IFNFU1NJT05fQ09VTlRFUl9NQVgpCisJCXdsdmlmLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwogCi0Jd2wtPnNlc3Npb25fY291bnRlcisrOworCXdsdmlmLT5zZXNzaW9uX2NvdW50ZXIrKzsKIAotCXJldHVybiB3bC0+c2Vzc2lvbl9jb3VudGVyOworCXJldHVybiB3bHZpZi0+c2Vzc2lvbl9jb3VudGVyOwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0ICpjbWQ7CiAJaW50IHJldDsKQEAgLTQ3NCwyMCArNTAyLDIwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBkZXYgJWQiLCB3bC0+ZGV2X3JvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBkZXYgJWQiLCB3bHZpZi0+ZGV2X3JvbGVfaWQpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPmRldl9yb2xlX2lkOwotCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5kZXZfcm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKKwljbWQtPmNoYW5uZWwgPSB3bHZpZi0+Y2hhbm5lbDsKIAotCWlmICh3bC0+ZGV2X2hsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgewotCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgJndsLT5kZXZfaGxpZCk7CisJaWYgKHdsdmlmLT5kZXZfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSB7CisJCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5kZXZfaGxpZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KLQljbWQtPmRldmljZS5obGlkID0gd2wtPmRldl9obGlkOwotCWNtZC0+ZGV2aWNlLnNlc3Npb24gPSB3bC0+c2Vzc2lvbl9jb3VudGVyOworCWNtZC0+ZGV2aWNlLmhsaWQgPSB3bHZpZi0+ZGV2X2hsaWQ7CisJY21kLT5kZXZpY2Uuc2Vzc2lvbiA9IHdsdmlmLT5zZXNzaW9uX2NvdW50ZXI7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAicm9sZSBzdGFydDogcm9sZWlkPSVkLCBobGlkPSVkLCBzZXNzaW9uPSVkIiwKIAkJICAgICBjbWQtPnJvbGVfaWQsIGNtZC0+ZGV2aWNlLmhsaWQsIGNtZC0+ZGV2aWNlLnNlc3Npb24pOwpAQCAtNTAyLDkgKzUzMCw3IEBACiAKIGVycl9obGlkOgogCS8qIGNsZWFyIGxpbmtzIG9uIGVycm9yICovCi0JX19jbGVhcl9iaXQod2wtPmRldl9obGlkLCB3bC0+bGlua3NfbWFwKTsKLQl3bC0+ZGV2X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+ZGV2X2hsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtNTEzLDEyICs1MzksMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfZGV2KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0b3AgKmNtZDsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04od2wtPmRldl9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpKQorCWlmIChXQVJOX09OKHdsdmlmLT5kZXZfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CkBAIC01MjksNyArNTU2LDcgQEAKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGRldiIpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPmRldl9yb2xlX2lkOworCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5kZXZfcm9sZV9pZDsKIAljbWQtPmRpc2NfdHlwZSA9IERJU0NPTk5FQ1RfSU1NRURJQVRFOwogCWNtZC0+cmVhc29uID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCkBAIC01NDUsNyArNTcyLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmRldl9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5kZXZfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC01NTQsOCArNTgxLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCXN0cnVjdCB3bDEyeHhfY21kX3JvbGVfc3RhcnQgKmNtZDsKIAlpbnQgcmV0OwogCkBAIC01NjUsMzMgKzU5MywzMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RhcnQgc3RhICVkIiwgd2wtPnJvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBzdGEgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKLQlpZiAod2wtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKLQljbWQtPnN0YS5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JY21kLT5zdGEuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYod2wtPmJlYWNvbl9pbnQpOworCWNtZC0+Y2hhbm5lbCA9IHdsdmlmLT5jaGFubmVsOworCWNtZC0+c3RhLmJhc2ljX3JhdGVfc2V0ID0gY3B1X3RvX2xlMzIod2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwljbWQtPnN0YS5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bHZpZi0+YmVhY29uX2ludCk7CiAJY21kLT5zdGEuc3NpZF90eXBlID0gV0wxMlhYX1NTSURfVFlQRV9BTlk7Ci0JY21kLT5zdGEuc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JbWVtY3B5KGNtZC0+c3RhLnNzaWQsIHdsLT5zc2lkLCB3bC0+c3NpZF9sZW4pOwotCW1lbWNweShjbWQtPnN0YS5ic3NpZCwgd2wtPmJzc2lkLCBFVEhfQUxFTik7Ci0JY21kLT5zdGEubG9jYWxfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+cmF0ZV9zZXQpOworCWNtZC0+c3RhLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCW1lbWNweShjbWQtPnN0YS5zc2lkLCB3bHZpZi0+c3NpZCwgd2x2aWYtPnNzaWRfbGVuKTsKKwltZW1jcHkoY21kLT5zdGEuYnNzaWQsIHZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKKwljbWQtPnN0YS5sb2NhbF9yYXRlcyA9IGNwdV90b19sZTMyKHdsdmlmLT5yYXRlX3NldCk7CiAKLQlpZiAod2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpIHsKLQkJcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsICZ3bC0+c3RhX2hsaWQpOworCWlmICh3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgeworCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZnJlZTsKIAl9Ci0JY21kLT5zdGEuaGxpZCA9IHdsLT5zdGFfaGxpZDsKLQljbWQtPnN0YS5zZXNzaW9uID0gd2wxMnh4X2dldF9uZXdfc2Vzc2lvbl9pZCh3bCk7Ci0JY21kLT5zdGEucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2wtPnJhdGVfc2V0KTsKKwljbWQtPnN0YS5obGlkID0gd2x2aWYtPnN0YS5obGlkOworCWNtZC0+c3RhLnNlc3Npb24gPSB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHdsLCB3bHZpZik7CisJY21kLT5zdGEucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJyb2xlIHN0YXJ0OiByb2xlaWQ9JWQsIGhsaWQ9JWQsIHNlc3Npb249JWQgIgogCQkgICAgICJiYXNpY19yYXRlX3NldDogMHgleCwgcmVtb3RlX3JhdGVzOiAweCV4IiwKLQkJICAgICB3bC0+cm9sZV9pZCwgY21kLT5zdGEuaGxpZCwgY21kLT5zdGEuc2Vzc2lvbiwKLQkJICAgICB3bC0+YmFzaWNfcmF0ZV9zZXQsIHdsLT5yYXRlX3NldCk7CisJCSAgICAgd2x2aWYtPnJvbGVfaWQsIGNtZC0+c3RhLmhsaWQsIGNtZC0+c3RhLnNlc3Npb24sCisJCSAgICAgd2x2aWYtPmJhc2ljX3JhdGVfc2V0LCB3bHZpZi0+cmF0ZV9zZXQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfUk9MRV9TVEFSVCwgY21kLCBzaXplb2YoKmNtZCksIDApOwogCWlmIChyZXQgPCAwKSB7CkBAIC02MDMsNyArNjMxLDcgQEAKIAogZXJyX2hsaWQ6CiAJLyogY2xlYXIgbGlua3Mgb24gZXJyb3IuICovCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtNjEzLDEyICs2NDEsMTIgQEAKIH0KIAogLyogdXNlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCBpYnNzIGFzIHdlbGwgKi8KLWludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9zdGEoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3Bfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9zdG9wICpjbWQ7CiAJaW50IHJldDsKIAotCWlmIChXQVJOX09OKHdsLT5zdGFfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSkKKwlpZiAoV0FSTl9PTih3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwpAQCAtNjI3LDkgKzY1NSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIHN0YSAlZCIsIHdsLT5yb2xlX2lkKTsKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RvcCBzdGEgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAljbWQtPmRpc2NfdHlwZSA9IERJU0NPTk5FQ1RfSU1NRURJQVRFOwogCWNtZC0+cmVhc29uID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCkBAIC02MzksNyArNjY3LDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPnN0YV9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5zdGEuaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC02NDgsMTYgKzY3NiwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfYXAoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2FwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9zdGFydCAqY21kOwotCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJndsLT52aWYtPmJzc19jb25mOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiA9ICZ2aWYtPmJzc19jb25mOwogCWludCByZXQ7CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RhcnQgYXAgJWQiLCB3bC0+cm9sZV9pZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGFwICVkIiwgd2x2aWYtPnJvbGVfaWQpOwogCiAJLyogdHJ5aW5nIHRvIHVzZSBoaWRkZW4gU1NJRCB3aXRoIGFuIG9sZCBob3N0YXBkIHZlcnNpb24gKi8KLQlpZiAod2wtPnNzaWRfbGVuID09IDAgJiYgIWJzc19jb25mLT5oaWRkZW5fc3NpZCkgeworCWlmICh3bHZpZi0+c3NpZF9sZW4gPT0gMCAmJiAhYnNzX2NvbmYtPmhpZGRlbl9zc2lkKSB7CiAJCXdsMTI3MV9lcnJvcigiZ290IGEgbnVsbCBTU0lEIGZyb20gYmVhY29uL2JzcyIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTY2OSwzMCArNjk4LDMwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+YXAuZ2xvYmFsX2hsaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCi0JcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsICZ3bC0+YXBfYmNhc3RfaGxpZCk7CisJcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsIHdsdmlmLCAmd2x2aWYtPmFwLmJjYXN0X2hsaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX2dsb2JhbDsKIAotCWNtZC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWNtZC0+YXAuYWdpbmdfcGVyaW9kID0gY3B1X3RvX2xlMTYod2wtPmNvbmYudHguYXBfYWdpbmdfcGVyaW9kKTsKIAljbWQtPmFwLmJzc19pbmRleCA9IFdMMTI3MV9BUF9CU1NfSU5ERVg7Ci0JY21kLT5hcC5nbG9iYWxfaGxpZCA9IHdsLT5hcF9nbG9iYWxfaGxpZDsKLQljbWQtPmFwLmJyb2FkY2FzdF9obGlkID0gd2wtPmFwX2JjYXN0X2hsaWQ7Ci0JY21kLT5hcC5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JY21kLT5hcC5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bC0+YmVhY29uX2ludCk7CisJY21kLT5hcC5nbG9iYWxfaGxpZCA9IHdsdmlmLT5hcC5nbG9iYWxfaGxpZDsKKwljbWQtPmFwLmJyb2FkY2FzdF9obGlkID0gd2x2aWYtPmFwLmJjYXN0X2hsaWQ7CisJY21kLT5hcC5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJY21kLT5hcC5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bHZpZi0+YmVhY29uX2ludCk7CiAJY21kLT5hcC5kdGltX2ludGVydmFsID0gYnNzX2NvbmYtPmR0aW1fcGVyaW9kOwogCWNtZC0+YXAuYmVhY29uX2V4cGlyeSA9IFdMMTI3MV9BUF9ERUZfQkVBQ09OX0VYUDsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKKwljbWQtPmNoYW5uZWwgPSB3bHZpZi0+Y2hhbm5lbDsKIAogCWlmICghYnNzX2NvbmYtPmhpZGRlbl9zc2lkKSB7CiAJCS8qIHRha2UgdGhlIFNTSUQgZnJvbSB0aGUgYmVhY29uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAJCWNtZC0+YXAuc3NpZF90eXBlID0gV0wxMlhYX1NTSURfVFlQRV9QVUJMSUM7Ci0JCWNtZC0+YXAuc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JCW1lbWNweShjbWQtPmFwLnNzaWQsIHdsLT5zc2lkLCB3bC0+c3NpZF9sZW4pOworCQljbWQtPmFwLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCQltZW1jcHkoY21kLT5hcC5zc2lkLCB3bHZpZi0+c3NpZCwgd2x2aWYtPnNzaWRfbGVuKTsKIAl9IGVsc2UgewogCQljbWQtPmFwLnNzaWRfdHlwZSA9IFdMMTJYWF9TU0lEX1RZUEVfSElEREVOOwogCQljbWQtPmFwLnNzaWRfbGVuID0gYnNzX2NvbmYtPnNzaWRfbGVuOwpAQCAtNzAxLDcgKzczMCw3IEBACiAKIAljbWQtPmFwLmxvY2FsX3JhdGVzID0gY3B1X3RvX2xlMzIoMHhmZmZmZmZmZik7CiAKLQlzd2l0Y2ggKHdsLT5iYW5kKSB7CisJc3dpdGNoICh3bHZpZi0+YmFuZCkgewogCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKIAkJY21kLT5iYW5kID0gUkFESU9fQkFORF8yXzRHSFo7CiAJCWJyZWFrOwpAQCAtNzA5LDcgKzczOCw3IEBACiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfNUdIWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJd2wxMjcxX3dhcm5pbmcoImFwIHN0YXJ0IC0gdW5rbm93biBiYW5kOiAlZCIsIChpbnQpd2wtPmJhbmQpOworCQl3bDEyNzFfd2FybmluZygiYXAgc3RhcnQgLSB1bmtub3duIGJhbmQ6ICVkIiwgKGludCl3bHZpZi0+YmFuZCk7CiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfMl80R0haOwogCQlicmVhazsKIAl9CkBAIC03MjMsMTAgKzc1MiwxMCBAQAogCWdvdG8gb3V0X2ZyZWU7CiAKIG91dF9mcmVlX2JjYXN0OgotCXdsMTJ4eF9mcmVlX2xpbmsod2wsICZ3bC0+YXBfYmNhc3RfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+YXAuYmNhc3RfaGxpZCk7CiAKIG91dF9mcmVlX2dsb2JhbDoKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5nbG9iYWxfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC03MzUsNyArNzY0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0b3AgKmNtZDsKIAlpbnQgcmV0OwpAQCAtNzQ2LDkgKzc3NSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGFwICVkIiwgd2wtPnJvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGFwICVkIiwgd2x2aWYtPnJvbGVfaWQpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJY21kLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9ST0xFX1NUT1AsIGNtZCwgc2l6ZW9mKCpjbWQpLCAwKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzU2LDggKzc4NSw4IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5hcF9iY2FzdF9obGlkKTsKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5iY2FzdF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5nbG9iYWxfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC03NjYsMTAgKzc5NSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0ICpjbWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmd2wtPnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKIAlpbnQgcmV0OwogCiAJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwpAQCAtNzc4LDM1ICs4MDgsMzYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGlic3MgJWQiLCB3bC0+cm9sZV9pZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGlic3MgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKLQlpZiAod2wtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKLQljbWQtPmlic3MuYmFzaWNfcmF0ZV9zZXQgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCWNtZC0+aWJzcy5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bC0+YmVhY29uX2ludCk7CisJY21kLT5jaGFubmVsID0gd2x2aWYtPmNoYW5uZWw7CisJY21kLT5pYnNzLmJhc2ljX3JhdGVfc2V0ID0gY3B1X3RvX2xlMzIod2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwljbWQtPmlic3MuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYod2x2aWYtPmJlYWNvbl9pbnQpOwogCWNtZC0+aWJzcy5kdGltX2ludGVydmFsID0gYnNzX2NvbmYtPmR0aW1fcGVyaW9kOwogCWNtZC0+aWJzcy5zc2lkX3R5cGUgPSBXTDEyWFhfU1NJRF9UWVBFX0FOWTsKLQljbWQtPmlic3Muc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JbWVtY3B5KGNtZC0+aWJzcy5zc2lkLCB3bC0+c3NpZCwgd2wtPnNzaWRfbGVuKTsKLQltZW1jcHkoY21kLT5pYnNzLmJzc2lkLCB3bC0+YnNzaWQsIEVUSF9BTEVOKTsKLQljbWQtPnN0YS5sb2NhbF9yYXRlcyA9IGNwdV90b19sZTMyKHdsLT5yYXRlX3NldCk7CisJY21kLT5pYnNzLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCW1lbWNweShjbWQtPmlic3Muc3NpZCwgd2x2aWYtPnNzaWQsIHdsdmlmLT5zc2lkX2xlbik7CisJbWVtY3B5KGNtZC0+aWJzcy5ic3NpZCwgdmlmLT5ic3NfY29uZi5ic3NpZCwgRVRIX0FMRU4pOworCWNtZC0+c3RhLmxvY2FsX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAotCWlmICh3bC0+c3RhX2hsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgewotCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJaWYgKHdsdmlmLT5zdGEuaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSB7CisJCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5zdGEuaGxpZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KLQljbWQtPmlic3MuaGxpZCA9IHdsLT5zdGFfaGxpZDsKLQljbWQtPmlic3MucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2wtPnJhdGVfc2V0KTsKKwljbWQtPmlic3MuaGxpZCA9IHdsdmlmLT5zdGEuaGxpZDsKKwljbWQtPmlic3MucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJyb2xlIHN0YXJ0OiByb2xlaWQ9JWQsIGhsaWQ9JWQsIHNlc3Npb249JWQgIgogCQkgICAgICJiYXNpY19yYXRlX3NldDogMHgleCwgcmVtb3RlX3JhdGVzOiAweCV4IiwKLQkJICAgICB3bC0+cm9sZV9pZCwgY21kLT5zdGEuaGxpZCwgY21kLT5zdGEuc2Vzc2lvbiwKLQkJICAgICB3bC0+YmFzaWNfcmF0ZV9zZXQsIHdsLT5yYXRlX3NldCk7CisJCSAgICAgd2x2aWYtPnJvbGVfaWQsIGNtZC0+c3RhLmhsaWQsIGNtZC0+c3RhLnNlc3Npb24sCisJCSAgICAgd2x2aWYtPmJhc2ljX3JhdGVfc2V0LCB3bHZpZi0+cmF0ZV9zZXQpOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgIndsLT5ic3NpZCA9ICVwTSIsIHdsLT5ic3NpZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgInZpZi0+YnNzX2NvbmYuYnNzaWQgPSAlcE0iLAorCQkgICAgIHZpZi0+YnNzX2NvbmYuYnNzaWQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfUk9MRV9TVEFSVCwgY21kLCBzaXplb2YoKmNtZCksIDApOwogCWlmIChyZXQgPCAwKSB7CkBAIC04MTgsNyArODQ5LDcgQEAKIAogZXJyX2hsaWQ6CiAJLyogY2xlYXIgbGlua3Mgb24gZXJyb3IuICovCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtOTYyLDcgKzk5Myw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9jbWRfcHNfbW9kZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcHNfbW9kZSkKK2ludCB3bDEyNzFfY21kX3BzX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHU4IHBzX21vZGUpCiB7CiAJc3RydWN0IHdsMTI3MV9jbWRfcHNfcGFyYW1zICpwc19wYXJhbXMgPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtOTc1LDcgKzEwMDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwc19wYXJhbXMtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlwc19wYXJhbXMtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlwc19wYXJhbXMtPnBzX21vZGUgPSBwc19tb2RlOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfU0VUX1BTX01PREUsIHBzX3BhcmFtcywKQEAgLTEwMzAsNyArMTA2Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTJ4eF9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJaW50IHNpemU7CkBAIC0xMDM4LDExICsxMDcwLDEyIEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAKIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgeworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgewogCQlzaXplID0gc2l6ZW9mKHN0cnVjdCB3bDEyeHhfbnVsbF9kYXRhX3RlbXBsYXRlKTsKIAkJcHRyID0gTlVMTDsKIAl9IGVsc2UgewotCQlza2IgPSBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0KHdsLT5odywgd2wtPnZpZik7CisJCXNrYiA9IGllZWU4MDIxMV9udWxsZnVuY19nZXQod2wtPmh3LAorCQkJCQkgICAgIHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpKTsKIAkJaWYgKCFza2IpCiAJCQlnb3RvIG91dDsKIAkJc2l6ZSA9IHNrYi0+bGVuOwpAQCAtMTA1MCw3ICsxMDgzLDcgQEAKIAl9CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX05VTExfREFUQSwgcHRyLCBzaXplLCAwLAotCQkJCSAgICAgIHdsLT5iYXNpY19yYXRlKTsKKwkJCQkgICAgICB3bHZpZi0+YmFzaWNfcmF0ZSk7CiAKIG91dDoKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMDYxLDE5ICsxMDk0LDIxIEBACiAKIH0KIAotaW50IHdsMTI3MV9jbWRfYnVpbGRfa2x2X251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX2J1aWxkX2tsdl9udWxsX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAotCXNrYiA9IGllZWU4MDIxMV9udWxsZnVuY19nZXQod2wtPmh3LCB3bC0+dmlmKTsKKwlza2IgPSBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0tMViwKIAkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCSAgICAgIENNRF9URU1QTF9LTFZfSURYX05VTExfREFUQSwKLQkJCQkgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgd2x2aWYtPmJhc2ljX3JhdGUpOwogCiBvdXQ6CiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMTA4NCwzMiArMTExOSwzNSBAQAogCiB9CiAKLWludCB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhaWQpCitpbnQgd2wxMjcxX2NtZF9idWlsZF9wc19wb2xsKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIHUxNiBhaWQpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJldCA9IDA7CiAKLQlza2IgPSBpZWVlODAyMTFfcHNwb2xsX2dldCh3bC0+aHcsIHdsLT52aWYpOworCXNrYiA9IGllZWU4MDIxMV9wc3BvbGxfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1BTX1BPTEwsIHNrYi0+ZGF0YSwKLQkJCQkgICAgICBza2ItPmxlbiwgMCwgd2wtPmJhc2ljX3JhdGVfc2V0KTsKKwkJCQkgICAgICBza2ItPmxlbiwgMCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKIAogb3V0OgogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsCitpbnQgd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCSAgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAogCQkJICAgICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgdTggYmFuZCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgcmV0OwogCXUzMiByYXRlOwogCi0Jc2tiID0gaWVlZTgwMjExX3Byb2JlcmVxX2dldCh3bC0+aHcsIHdsLT52aWYsIHNzaWQsIHNzaWRfbGVuLAorCXNrYiA9IGllZWU4MDIxMV9wcm9iZXJlcV9nZXQod2wtPmh3LCB2aWYsIHNzaWQsIHNzaWRfbGVuLAogCQkJCSAgICAgaWUsIGllX2xlbik7CiAJaWYgKCFza2IpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTExMTgsNyArMTE1Niw3IEBACiAKIAl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiUFJPQkUgUkVROiAiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7CisJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iaXRyYXRlX21hc2tzW2JhbmRdKTsKIAlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0NGR19QUk9CRV9SRVFfMl80LAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLCAwLCByYXRlKTsKQEAgLTExMzIsMjAgKzExNzAsMjIgQEAKIH0KIAogc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9jbWRfYnVpbGRfYXBfcHJvYmVfcmVxKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCWludCByZXQ7CiAJdTMyIHJhdGU7CiAKIAlpZiAoIXNrYikKLQkJc2tiID0gaWVlZTgwMjExX2FwX3Byb2JlcmVxX2dldCh3bC0+aHcsIHdsLT52aWYpOworCQlza2IgPSBpZWVlODAyMTFfYXBfcHJvYmVyZXFfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiQVAgUFJPQkUgUkVROiAiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1t3bC0+YmFuZF0pOwotCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+Yml0cmF0ZV9tYXNrc1t3bHZpZi0+YmFuZF0pOworCWlmICh3bHZpZi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0NGR19QUk9CRV9SRVFfMl80LAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLCAwLCByYXRlKTsKIAllbHNlCkBAIC0xMTU5LDkgKzExOTksMTEgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1pbnQgd2wxMjcxX2NtZF9idWlsZF9hcnBfcnNwKHN0cnVjdCB3bDEyNzEgKndsLCBfX2JlMzIgaXBfYWRkcikKK2ludCB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgX19iZTMyIGlwX2FkZHIpCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJc3RydWN0IHdsMTJ4eF9hcnBfcnNwX3RlbXBsYXRlIHRtcGw7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKIAlzdHJ1Y3QgYXJwaGRyICphcnBfaGRyOwpAQCAtMTE3Myw4ICsxMjE1LDggQEAKIAloZHItPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CiAJCQkJCSBJRUVFODAyMTFfU1RZUEVfREFUQSB8CiAJCQkJCSBJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQltZW1jcHkoaGRyLT5hZGRyMSwgd2wtPnZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoaGRyLT5hZGRyMiwgd2wtPnZpZi0+YWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIxLCB2aWYtPmJzc19jb25mLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOwogCW1lbXNldChoZHItPmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CiAKIAkvKiBsbGMgbGF5ZXIgKi8KQEAgLTExOTAsMjUgKzEyMzIsMjYgQEAKIAlhcnBfaGRyLT5hcl9vcCA9IGNwdV90b19iZTE2KEFSUE9QX1JFUExZKTsKIAogCS8qIGFycCBwYXlsb2FkICovCi0JbWVtY3B5KHRtcGwuc2VuZGVyX2h3LCB3bC0+dmlmLT5hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHRtcGwuc2VuZGVyX2h3LCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKIAl0bXBsLnNlbmRlcl9pcCA9IGlwX2FkZHI7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0FSUF9SU1AsCiAJCQkJICAgICAgJnRtcGwsIHNpemVvZih0bXBsKSwgMCwKLQkJCQkgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgd2x2aWYtPmJhc2ljX3JhdGUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTI3MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCXN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciB0ZW1wbGF0ZTsKIAogCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOwogCi0JbWVtY3B5KHRlbXBsYXRlLmFkZHIxLCB3bC0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkodGVtcGxhdGUuYWRkcjIsIHdsLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh0ZW1wbGF0ZS5hZGRyMywgd2wtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHRlbXBsYXRlLmFkZHIxLCB2aWYtPmJzc19jb25mLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHRlbXBsYXRlLmFkZHIyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkodGVtcGxhdGUuYWRkcjMsIHZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKIAogCXRlbXBsYXRlLmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CiAJCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyB8CkBAIC0xMjE5LDcgKzEyNjIsNyBAQAogCiAJcmV0dXJuIHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfUU9TX05VTExfREFUQSwgJnRlbXBsYXRlLAogCQkJCSAgICAgICBzaXplb2YodGVtcGxhdGUpLCAwLAotCQkJCSAgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgIHdsdmlmLT5iYXNpY19yYXRlKTsKIH0KIAogaW50IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaWQsIHU4IGhsaWQpCkBAIC0xMjUzLDcgKzEyOTYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfY21kX3NldF9zdGFfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCitpbnQgd2wxMjcxX2NtZF9zZXRfc3RhX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICAgdTE2IGFjdGlvbiwgdTggaWQsIHU4IGtleV90eXBlLAogCQkgICAgICAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIGNvbnN0IHU4ICphZGRyLAogCQkgICAgICAgdTMyIHR4X3NlcV8zMiwgdTE2IHR4X3NlcV8xNikKIHsKQEAgLTEyNjEsNyArMTMwNSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBobGlkIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgKi8KLQlpZiAod2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCisJaWYgKHdsdmlmLT5zdGEuaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKQogCQlyZXR1cm4gMDsKIAogCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKQEAgLTEyNzAsNyArMTMxNCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNtZC0+aGxpZCA9IHdsLT5zdGFfaGxpZDsKKwljbWQtPmhsaWQgPSB3bHZpZi0+c3RhLmhsaWQ7CiAKIAlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkKIAkJY21kLT5saWRfa2V5X3R5cGUgPSBXRVBfREVGQVVMVF9MSURfVFlQRTsKQEAgLTEzMjEsOSArMTM2NSwxMCBAQAogICogVE9ETzogbWVyZ2Ugd2l0aCBzdGEvaWJzcyBpbnRvIDEgc2V0X2tleSBmdW5jdGlvbi4KICAqIG5vdGUgdGhlcmUgYXJlIHNsaWdodCBkaWZmcwogICovCi1pbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCi0JCQl1OCBrZXlfc2l6ZSwgY29uc3QgdTggKmtleSwgdTggaGxpZCwgdTMyIHR4X3NlcV8zMiwKLQkJCXUxNiB0eF9zZXFfMTYpCitpbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKKwkJCSAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIHU4IGhsaWQsIHUzMiB0eF9zZXFfMzIsCisJCQkgIHUxNiB0eF9zZXFfMTYpCiB7CiAJc3RydWN0IHdsMTI3MV9jbWRfc2V0X2tleXMgKmNtZDsKIAlpbnQgcmV0ID0gMDsKQEAgLTEzMzMsNyArMTM3OCw3IEBACiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGhsaWQgPT0gd2wtPmFwX2JjYXN0X2hsaWQpIHsKKwlpZiAoaGxpZCA9PSB3bHZpZi0+YXAuYmNhc3RfaGxpZCkgewogCQlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkKIAkJCWxpZF90eXBlID0gV0VQX0RFRkFVTFRfTElEX1RZUEU7CiAJCWVsc2UKQEAgLTE0MTEsNyArMTQ1Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTJ4eF9jbWRfYWRkX3BlZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IGhsaWQpCitpbnQgd2wxMnh4X2NtZF9hZGRfcGVlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggaGxpZCkKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9hZGRfcGVlciAqY21kOwogCWludCBpLCByZXQ7CkBAIC0xNDM4LDEzICsxNDg0LDEzIEBACiAJCWVsc2UKIAkJCWNtZC0+cHNkX3R5cGVbaV0gPSBXTDEyNzFfUFNEX0xFR0FDWTsKIAotCXN0YV9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1t3bC0+YmFuZF07CisJc3RhX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3dsdmlmLT5iYW5kXTsKIAlpZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQogCQlzdGFfcmF0ZXMgfD0gc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMF0gPDwgSFdfSFRfUkFURVNfT0ZGU0VUOwogCiAJY21kLT5zdXBwb3J0ZWRfcmF0ZXMgPQogCQljcHVfdG9fbGUzMih3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsIHN0YV9yYXRlcywKLQkJCQkJCQl3bC0+YmFuZCkpOworCQkJCQkJCXdsdmlmLT5iYW5kKSk7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAibmV3IHBlZXIgcmF0ZXM9MHgleCBxdWV1ZXM9MHgleCIsCiAJCSAgICAgY21kLT5zdXBwb3J0ZWRfcmF0ZXMsIHN0YS0+dWFwc2RfcXVldWVzKTsKQEAgLTE1ODQsMTIgKzE2MzAsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTJ4eF9jbWRfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCB1OCByb2xlX2lkKQorc3RhdGljIGludCB3bDEyeHhfY21kX3JvYyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICB1OCByb2xlX2lkKQogewogCXN0cnVjdCB3bDEyeHhfY21kX3JvYyAqY21kOwogCWludCByZXQgPSAwOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2MgJWQgKCVkKSIsIHdsLT5jaGFubmVsLCByb2xlX2lkKTsKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvYyAlZCAoJWQpIiwgd2x2aWYtPmNoYW5uZWwsIHJvbGVfaWQpOwogCiAJaWYgKFdBUk5fT04ocm9sZV9pZCA9PSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjAxLDggKzE2NDgsOCBAQAogCX0KIAogCWNtZC0+cm9sZV9pZCA9IHJvbGVfaWQ7Ci0JY21kLT5jaGFubmVsID0gd2wtPmNoYW5uZWw7Ci0Jc3dpdGNoICh3bC0+YmFuZCkgeworCWNtZC0+Y2hhbm5lbCA9IHdsdmlmLT5jaGFubmVsOworCXN3aXRjaCAod2x2aWYtPmJhbmQpIHsKIAljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfMl80R0haOwogCQlicmVhazsKQEAgLTE2MTAsNyArMTY1Nyw3IEBACiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfNUdIWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJd2wxMjcxX2Vycm9yKCJyb2MgLSB1bmtub3duIGJhbmQ6ICVkIiwgKGludCl3bC0+YmFuZCk7CisJCXdsMTI3MV9lcnJvcigicm9jIC0gdW5rbm93biBiYW5kOiAlZCIsIChpbnQpd2x2aWYtPmJhbmQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KQEAgLTE2NTcsMTQgKzE3MDQsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X3JvYyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcm9sZV9pZCkKK2ludCB3bDEyeHhfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IHJvbGVfaWQpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoV0FSTl9PTih0ZXN0X2JpdChyb2xlX2lkLCB3bC0+cm9jX21hcCkpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHdsMTJ4eF9jbWRfcm9jKHdsLCByb2xlX2lkKTsKKwlyZXQgPSB3bDEyeHhfY21kX3JvYyh3bCwgd2x2aWYsIHJvbGVfaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTc1MywzICsxODAwLDUwIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KKworLyogc3RhcnQgZGV2IHJvbGUgYW5kIHJvYyBvbiBpdHMgY2hhbm5lbCAqLworaW50IHdsMTJ4eF9zdGFydF9kZXYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oISh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyB8fAorCQkgICAgICB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9kZXYod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bHZpZiwgd2x2aWYtPmRldl9yb2xlX2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfc3RvcDsKKworCXJldHVybiAwOworCitvdXRfc3RvcDoKKwl3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wsIHdsdmlmKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBjcm9jIGRldiBobGlkLCBhbmQgc3RvcCB0aGUgcm9sZSAqLworaW50IHdsMTJ4eF9zdG9wX2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTighKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTIHx8CisJCSAgICAgIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRlc3RfYml0KHdsdmlmLT5kZXZfcm9sZV9pZCwgd2wtPnJvY19tYXApKSB7CisJCXJldCA9IHdsMTJ4eF9jcm9jKHdsLCB3bHZpZi0+ZGV2X3JvbGVfaWQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX2Rldih3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5oCmluZGV4IGI3YmQ0MjcuLjNmN2QwYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmgKQEAgLTM2LDQ1ICszNiw1NCBAQAogaW50IHdsMTI3MV9jbWRfcmFkaW9fcGFybXMoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI4eF9jbWRfcmFkaW9fcGFybXMoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9jbWRfZXh0X3JhZGlvX3Bhcm1zKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCByb2xlX3R5cGUsIHU4ICpyb2xlX2lkKTsKK2ludCB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkciwgdTggcm9sZV90eXBlLAorCQkJICAgdTggKnJvbGVfaWQpOwogaW50IHdsMTJ4eF9jbWRfcm9sZV9kaXNhYmxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqcm9sZV9pZCk7Ci1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfZGV2KHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9zdGEoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9pYnNzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfYXAoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2lic3Moc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CitpbnQgd2wxMnh4X3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfc3RvcF9kZXYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMjcxX2NtZF90ZXN0KHN0cnVjdCB3bDEyNzEgKndsLCB2b2lkICpidWYsIHNpemVfdCBidWZfbGVuLCB1OCBhbnN3ZXIpOwogaW50IHdsMTI3MV9jbWRfaW50ZXJyb2dhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBpZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKIGludCB3bDEyNzFfY21kX2NvbmZpZ3VyZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTE2IGlkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwogaW50IHdsMTI3MV9jbWRfZGF0YV9wYXRoKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci1pbnQgd2wxMjcxX2NtZF9wc19tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBwc19tb2RlKTsKK2ludCB3bDEyNzFfY21kX3BzX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHU4IHBzX21vZGUpOwogaW50IHdsMTI3MV9jbWRfcmVhZF9tZW1vcnkoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiBhZGRyLCB2b2lkICphbnN3ZXIsCiAJCQkgICBzaXplX3QgbGVuKTsKIGludCB3bDEyNzFfY21kX3RlbXBsYXRlX3NldChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTE2IHRlbXBsYXRlX2lkLAogCQkJICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIGludCBpbmRleCwgdTMyIHJhdGVzKTsKLWludCB3bDEyNzFfY21kX2J1aWxkX251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2NtZF9idWlsZF9wc19wb2xsKHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWlkKTsKLWludCB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcShzdHJ1Y3Qgd2wxMjcxICp3bCwKK2ludCB3bDEyeHhfY21kX2J1aWxkX251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgdTE2IGFpZCk7CitpbnQgd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCSAgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAogCQkJICAgICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgdTggYmFuZCk7CiBzdHJ1Y3Qgc2tfYnVmZiAqd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgd2wxMjcxX2NtZF9idWlsZF9hcnBfcnNwKHN0cnVjdCB3bDEyNzEgKndsLCBfX2JlMzIgaXBfYWRkcik7Ci1pbnQgd2wxMjcxX2J1aWxkX3Fvc19udWxsX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9jbWRfYnVpbGRfa2x2X251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX2NtZF9idWlsZF9hcnBfcnNwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIF9fYmUzMiBpcF9hZGRyKTsKK2ludCB3bDEyNzFfYnVpbGRfcW9zX251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CitpbnQgd2wxMnh4X2NtZF9idWlsZF9rbHZfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1OCBpZCwgdTggaGxpZCk7Ci1pbnQgd2wxMjcxX2NtZF9zZXRfc3RhX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTE2IGFjdGlvbiwgdTggaWQsIHU4IGtleV90eXBlLAoraW50IHdsMTI3MV9jbWRfc2V0X3N0YV9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKIAkJCSAgIHU4IGtleV9zaXplLCBjb25zdCB1OCAqa2V5LCBjb25zdCB1OCAqYWRkciwKIAkJCSAgIHUzMiB0eF9zZXFfMzIsIHUxNiB0eF9zZXFfMTYpOwotaW50IHdsMTI3MV9jbWRfc2V0X2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTE2IGFjdGlvbiwgdTggaWQsIHU4IGtleV90eXBlLAoraW50IHdsMTI3MV9jbWRfc2V0X2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCiAJCQkgIHU4IGtleV9zaXplLCBjb25zdCB1OCAqa2V5LCB1OCBobGlkLCB1MzIgdHhfc2VxXzMyLAogCQkJICB1MTYgdHhfc2VxXzE2KTsKIGludCB3bDEyeHhfY21kX3NldF9wZWVyX3N0YXRlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKTsKLWludCB3bDEyeHhfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCB1OCByb2xlX2lkKTsKK2ludCB3bDEyeHhfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IHJvbGVfaWQpOwogaW50IHdsMTJ4eF9jcm9jKHN0cnVjdCB3bDEyNzEgKndsLCB1OCByb2xlX2lkKTsKLWludCB3bDEyeHhfY21kX2FkZF9wZWVyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBobGlkKTsKK2ludCB3bDEyeHhfY21kX2FkZF9wZWVyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCBobGlkKTsKIGludCB3bDEyeHhfY21kX3JlbW92ZV9wZWVyKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKTsKIGludCB3bDEyeHhfY21kX2NvbmZpZ19md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMnh4X2NtZF9zdGFydF9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CkBAIC04Miw2ICs5MSw5IEBACiBpbnQgd2wxMnh4X2NtZF9jaGFubmVsX3N3aXRjaChzdHJ1Y3Qgd2wxMjcxICp3bCwKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCk7CiBpbnQgd2wxMnh4X2NtZF9zdG9wX2NoYW5uZWxfc3dpdGNoKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyeHhfYWxsb2NhdGVfbGluayhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJIHU4ICpobGlkKTsKK3ZvaWQgd2wxMnh4X2ZyZWVfbGluayhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCAqaGxpZCk7CiAKIGVudW0gd2wxMjcxX2NvbW1hbmRzIHsKIAlDTURfSU5URVJST0dBVEUgICAgID0gMSwgICAgLyp1c2UgdGhpcyB0byByZWFkIGluZm9ybWF0aW9uIGVsZW1lbnRzKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oCmluZGV4IDA0YmI4ZmIuLjFiY2ZiMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaApAQCAtNDQwLDYgKzQ0MCwxMCBAQAogCUNPTkZfSFdfQklUX1JBVEVfMzZNQlBTIHwgQ09ORl9IV19CSVRfUkFURV80OE1CUFMgfCAgICAgIFwKIAlDT05GX0hXX0JJVF9SQVRFXzU0TUJQUykKIAorI2RlZmluZSBDT05GX1RYX0NDS19SQVRFUyAgKENPTkZfSFdfQklUX1JBVEVfMU1CUFMgfAkJXAorCUNPTkZfSFdfQklUX1JBVEVfMk1CUFMgfCBDT05GX0hXX0JJVF9SQVRFXzVfNU1CUFMgfAlcCisJQ09ORl9IV19CSVRfUkFURV8xMU1CUFMpCisKICNkZWZpbmUgQ09ORl9UWF9PRkRNX1JBVEVTIChDT05GX0hXX0JJVF9SQVRFXzZNQlBTIHwgICAgICAgICAgICAgXAogCUNPTkZfSFdfQklUX1JBVEVfMTJNQlBTIHwgQ09ORl9IV19CSVRfUkFURV8yNE1CUFMgfCAgICAgIFwKIAlDT05GX0hXX0JJVF9SQVRFXzM2TUJQUyB8IENPTkZfSFdfQklUX1JBVEVfNDhNQlBTIHwgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWZkOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2RlYnVnLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB3bDEyeHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IEx1Y2lhbm8gQ29lbGhvIDxjb2VsaG9AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0RFQlVHX0hfXworI2RlZmluZSBfX0RFQlVHX0hfXworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIndsMTJ4eCIKKyNkZWZpbmUgRFJJVkVSX1BSRUZJWCBEUklWRVJfTkFNRSAiOiAiCisKK2VudW0geworCURFQlVHX05PTkUJPSAwLAorCURFQlVHX0lSUQk9IEJJVCgwKSwKKwlERUJVR19TUEkJPSBCSVQoMSksCisJREVCVUdfQk9PVAk9IEJJVCgyKSwKKwlERUJVR19NQUlMQk9YCT0gQklUKDMpLAorCURFQlVHX1RFU1RNT0RFCT0gQklUKDQpLAorCURFQlVHX0VWRU5UCT0gQklUKDUpLAorCURFQlVHX1RYCT0gQklUKDYpLAorCURFQlVHX1JYCT0gQklUKDcpLAorCURFQlVHX1NDQU4JPSBCSVQoOCksCisJREVCVUdfQ1JZUFQJPSBCSVQoOSksCisJREVCVUdfUFNNCT0gQklUKDEwKSwKKwlERUJVR19NQUM4MDIxMQk9IEJJVCgxMSksCisJREVCVUdfQ01ECT0gQklUKDEyKSwKKwlERUJVR19BQ1gJPSBCSVQoMTMpLAorCURFQlVHX1NESU8JPSBCSVQoMTQpLAorCURFQlVHX0ZJTFRFUlMgICA9IEJJVCgxNSksCisJREVCVUdfQURIT0MgICAgID0gQklUKDE2KSwKKwlERUJVR19BUAk9IEJJVCgxNyksCisJREVCVUdfTUFTVEVSCT0gKERFQlVHX0FESE9DIHwgREVCVUdfQVApLAorCURFQlVHX0FMTAk9IH4wLAorfTsKKworZXh0ZXJuIHUzMiB3bDEyeHhfZGVidWdfbGV2ZWw7CisKKyNkZWZpbmUgREVCVUdfRFVNUF9MSU1JVCAxMDI0CisKKyNkZWZpbmUgd2wxMjcxX2Vycm9yKGZtdCwgYXJnLi4uKSBcCisJcHJfZXJyKERSSVZFUl9QUkVGSVggIkVSUk9SICIgZm10ICJcbiIsICMjYXJnKQorCisjZGVmaW5lIHdsMTI3MV93YXJuaW5nKGZtdCwgYXJnLi4uKSBcCisJcHJfd2FybmluZyhEUklWRVJfUFJFRklYICJXQVJOSU5HICIgZm10ICJcbiIsICMjYXJnKQorCisjZGVmaW5lIHdsMTI3MV9ub3RpY2UoZm10LCBhcmcuLi4pIFwKKwlwcl9pbmZvKERSSVZFUl9QUkVGSVggZm10ICJcbiIsICMjYXJnKQorCisjZGVmaW5lIHdsMTI3MV9pbmZvKGZtdCwgYXJnLi4uKSBcCisJcHJfaW5mbyhEUklWRVJfUFJFRklYIGZtdCAiXG4iLCAjI2FyZykKKworI2RlZmluZSB3bDEyNzFfZGVidWcobGV2ZWwsIGZtdCwgYXJnLi4uKSBcCisJZG8geyBcCisJCWlmIChsZXZlbCAmIHdsMTJ4eF9kZWJ1Z19sZXZlbCkgXAorCQkJcHJfZGVidWcoRFJJVkVSX1BSRUZJWCBmbXQgIlxuIiwgIyNhcmcpOyBcCisJfSB3aGlsZSAoMCkKKworLyogVE9ETzogdXNlIHByX2RlYnVnX2hleF9kdW1wIHdoZW4gaXQgYmVjb21lcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgd2wxMjcxX2R1bXAobGV2ZWwsIHByZWZpeCwgYnVmLCBsZW4pCVwKKwlkbyB7IFwKKwkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCisJCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBEUklWRVJfUFJFRklYIHByZWZpeCwgXAorCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAlcCisJCQkJICAgICAgIGJ1ZiwJCQkJXAorCQkJCSAgICAgICBtaW5fdChzaXplX3QsIGxlbiwgREVCVUdfRFVNUF9MSU1JVCksIFwKKwkJCQkgICAgICAgMCk7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHdsMTI3MV9kdW1wX2FzY2lpKGxldmVsLCBwcmVmaXgsIGJ1ZiwgbGVuKQlcCisJZG8geyBcCisJCWlmIChsZXZlbCAmIHdsMTJ4eF9kZWJ1Z19sZXZlbCkgXAorCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgRFJJVkVSX1BSRUZJWCBwcmVmaXgsIFwKKwkJCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwJXAorCQkJCSAgICAgICBidWYsCQkJCVwKKwkJCQkgICAgICAgbWluX3Qoc2l6ZV90LCBsZW4sIERFQlVHX0RVTVBfTElNSVQpLCBcCisJCQkJICAgICAgIHRydWUpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2RlYnVnZnMuYwppbmRleCAzOTk5ZmQ1Li4xNWViM2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Z2ZzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImFjeC5oIgogI2luY2x1ZGUgInBzLmgiCiAjaW5jbHVkZSAiaW8uaCIKQEAgLTMxNiwxMiArMzE3LDE5IEBACiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJlcyA9IDA7Ci0JY2hhciBidWZbMTAyNF07CisJc3NpemVfdCByZXQ7CisJY2hhciAqYnVmOworCisjZGVmaW5lIERSSVZFUl9TVEFURV9CVUZfTEVOIDEwMjQKKworCWJ1ZiA9IGttYWxsb2MoRFJJVkVSX1NUQVRFX0JVRl9MRU4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKICNkZWZpbmUgRFJJVkVSX1NUQVRFX1BSSU5UKHgsIGZtdCkgICBcCi0JKHJlcyArPSBzY25wcmludGYoYnVmICsgcmVzLCBzaXplb2YoYnVmKSAtIHJlcyxcCisJKHJlcyArPSBzY25wcmludGYoYnVmICsgcmVzLCBEUklWRVJfU1RBVEVfQlVGX0xFTiAtIHJlcyxcCiAJCQkgICN4ICIgPSAiIGZtdCAiXG4iLCB3bC0+eCkpCiAKICNkZWZpbmUgRFJJVkVSX1NUQVRFX1BSSU5UX0xPTkcoeCkgRFJJVkVSX1NUQVRFX1BSSU5UKHgsICIlbGQiKQpAQCAtMzQ2LDI5ICszNTQsMTQgQEAKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X3Jlc3VsdHNfY291bnQpOwogCURSSVZFUl9TVEFURV9QUklOVF9MSEVYKGZsYWdzKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X2Jsb2Nrc19mcmVlZCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVCh0eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQocnhfY291bnRlcik7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChzZXNzaW9uX2NvdW50ZXIpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQoc3RhdGUpOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQoYnNzX3R5cGUpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQoY2hhbm5lbCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0hFWChyYXRlX3NldCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0hFWChiYXNpY19yYXRlX3NldCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0hFWChiYXNpY19yYXRlKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKGJhbmQpOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQoYmVhY29uX2ludCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChwc21fZW50cnlfcmV0cnkpOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQocHNfcG9sbF9mYWlsdXJlcyk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChwb3dlcl9sZXZlbCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChyc3NpX3Rob2xkKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKGxhc3RfcnNzaV9ldmVudCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChzZ19lbmFibGVkKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKGVuYWJsZV8xMWEpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQobm9pc2UpOwotCURSSVZFUl9TVEFURV9QUklOVF9MSEVYKGFwX2hsaWRfbWFwWzBdKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKGxhc3RfdHhfaGxpZCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChiYV9zdXBwb3J0KTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKGJhX3J4X2JpdG1hcCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0hFWChhcF9md19wc19tYXApOwogCURSSVZFUl9TVEFURV9QUklOVF9MSEVYKGFwX3BzX21hcCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0hFWChxdWlya3MpOwpAQCAtMzg3LDEwICszODAsMTMgQEAKICN1bmRlZiBEUklWRVJfU1RBVEVfUFJJTlRfTEhFWAogI3VuZGVmIERSSVZFUl9TVEFURV9QUklOVF9TVFIKICN1bmRlZiBEUklWRVJfU1RBVEVfUFJJTlQKKyN1bmRlZiBEUklWRVJfU1RBVEVfQlVGX0xFTgogCiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCByZXMpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCByZXMpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHJpdmVyX3N0YXRlX29wcyA9IHsKQEAgLTM5OSw2ICszOTUsMTE1IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAorc3RhdGljIHNzaXplX3Qgdmlmc19zdGF0ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKKwlpbnQgcmV0LCByZXMgPSAwOworCWNvbnN0IGludCBidWZfc2l6ZSA9IDQwOTY7CisJY2hhciAqYnVmOworCWNoYXIgdG1wX2J1Zls2NF07CisKKwlidWYgPSBremFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisjZGVmaW5lIFZJRl9TVEFURV9QUklOVCh4LCBmbXQpCQkJCVwKKwkocmVzICs9IHNjbnByaW50ZihidWYgKyByZXMsIGJ1Zl9zaXplIC0gcmVzLAlcCisJCQkgICN4ICIgPSAiIGZtdCAiXG4iLCB3bHZpZi0+eCkpCisKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX0xPTkcoeCkgIFZJRl9TVEFURV9QUklOVCh4LCAiJWxkIikKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX0lOVCh4KSAgIFZJRl9TVEFURV9QUklOVCh4LCAiJWQiKQorI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfU1RSKHgpICAgVklGX1NUQVRFX1BSSU5UKHgsICIlcyIpCisjZGVmaW5lIFZJRl9TVEFURV9QUklOVF9MSEVYKHgpICBWSUZfU1RBVEVfUFJJTlQoeCwgIjB4JWx4IikKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX0xMSEVYKHgpIFZJRl9TVEFURV9QUklOVCh4LCAiMHglbGx4IikKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX0hFWCh4KSAgIFZJRl9TVEFURV9QUklOVCh4LCAiMHgleCIpCisKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX05TVFIoeCwgbGVuKQkJCQlcCisJZG8gewkJCQkJCQlcCisJCW1lbXNldCh0bXBfYnVmLCAwLCBzaXplb2YodG1wX2J1ZikpOwkJXAorCQltZW1jcHkodG1wX2J1Ziwgd2x2aWYtPngsCQkJXAorCQkgICAgICAgbWluX3QodTgsIGxlbiwgc2l6ZW9mKHRtcF9idWYpIC0gMSkpOwlcCisJCXJlcyArPSBzY25wcmludGYoYnVmICsgcmVzLCBidWZfc2l6ZSAtIHJlcywJXAorCQkJCSAjeCAiID0gJXNcbiIsIHRtcF9idWYpOwlcCisJfSB3aGlsZSAoMCkKKworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChyb2xlX2lkKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChic3NfdHlwZSk7CisJCVZJRl9TVEFURV9QUklOVF9MSEVYKGZsYWdzKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChwMnApOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGRldl9yb2xlX2lkKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChkZXZfaGxpZCk7CisKKwkJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTIHx8CisJCSAgICB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgeworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChzdGEuaGxpZCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHN0YS5iYV9yeF9iaXRtYXApOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChzdGEuYmFzaWNfcmF0ZV9pZHgpOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChzdGEuYXBfcmF0ZV9pZHgpOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChzdGEucDJwX3JhdGVfaWR4KTsKKwkJfSBlbHNlIHsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoYXAuZ2xvYmFsX2hsaWQpOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChhcC5iY2FzdF9obGlkKTsKKwkJCVZJRl9TVEFURV9QUklOVF9MSEVYKGFwLnN0YV9obGlkX21hcFswXSk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLm1nbXRfcmF0ZV9pZHgpOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChhcC5iY2FzdF9yYXRlX2lkeCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLnVjYXN0X3JhdGVfaWR4WzBdKTsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoYXAudWNhc3RfcmF0ZV9pZHhbMV0pOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChhcC51Y2FzdF9yYXRlX2lkeFsyXSk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLnVjYXN0X3JhdGVfaWR4WzNdKTsKKwkJfQorCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGxhc3RfdHhfaGxpZCk7CisJCVZJRl9TVEFURV9QUklOVF9MSEVYKGxpbmtzX21hcFswXSk7CisJCVZJRl9TVEFURV9QUklOVF9OU1RSKHNzaWQsIHdsdmlmLT5zc2lkX2xlbik7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoYmFuZCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoY2hhbm5lbCk7CisJCVZJRl9TVEFURV9QUklOVF9IRVgoYml0cmF0ZV9tYXNrc1swXSk7CisJCVZJRl9TVEFURV9QUklOVF9IRVgoYml0cmF0ZV9tYXNrc1sxXSk7CisJCVZJRl9TVEFURV9QUklOVF9IRVgoYmFzaWNfcmF0ZV9zZXQpOworCQlWSUZfU1RBVEVfUFJJTlRfSEVYKGJhc2ljX3JhdGUpOworCQlWSUZfU1RBVEVfUFJJTlRfSEVYKHJhdGVfc2V0KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChiZWFjb25faW50KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChkZWZhdWx0X2tleSk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoYWlkKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChzZXNzaW9uX2NvdW50ZXIpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHBzX3BvbGxfZmFpbHVyZXMpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHBzbV9lbnRyeV9yZXRyeSk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQocG93ZXJfbGV2ZWwpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHJzc2lfdGhvbGQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGxhc3RfcnNzaV9ldmVudCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoYmFfc3VwcG9ydCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoYmFfYWxsb3dlZCk7CisJCVZJRl9TVEFURV9QUklOVF9MTEhFWCh0eF9zZWN1cml0eV9zZXEpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYik7CisJfQorCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX0lOVAorI3VuZGVmIFZJRl9TVEFURV9QUklOVF9MT05HCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX0hFWAorI3VuZGVmIFZJRl9TVEFURV9QUklOVF9MSEVYCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX0xMSEVYCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX1NUUgorI3VuZGVmIFZJRl9TVEFURV9QUklOVF9OU1RSCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UCisKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmVzKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZnNfc3RhdGVfb3BzID0geworCS5yZWFkID0gdmlmc19zdGF0ZV9yZWFkLAorCS5vcGVuID0gd2wxMjcxX29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKIHN0YXRpYyBzc2l6ZV90IGR0aW1faW50ZXJ2YWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC01MjAsNiArNjI1LDcgQEAKIAkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWludCByZXQ7CiAKQEAgLTU0Myw3ICs2NDksOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXdsMTI3MV9yZWNhbGNfcnhfc3RyZWFtaW5nKHdsKTsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCwgd2x2aWYpOworCX0KIAogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogb3V0OgpAQCAtNTcyLDYgKzY4MCw3IEBACiAJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAlpbnQgcmV0OwogCkBAIC01OTUsNyArNzA0LDkgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCk7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcod2wsIHdsdmlmKTsKKwl9CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dDoKQEAgLTYyNCw2ICs3MzUsNyBAQAogCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAljaGFyIGJ1ZlsxMF07CiAJc2l6ZV90IGxlbjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwpAQCAtNjQ2LDcgKzc1OCw5IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgISF2YWx1ZSk7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB3bHZpZiwgISF2YWx1ZSk7CisJfQogCiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiBvdXQ6CkBAIC03NzAsNiArODg0LDcgQEAKIAlERUJVR0ZTX0FERChncGlvX3Bvd2VyLCByb290ZGlyKTsKIAlERUJVR0ZTX0FERChzdGFydF9yZWNvdmVyeSwgcm9vdGRpcik7CiAJREVCVUdGU19BREQoZHJpdmVyX3N0YXRlLCByb290ZGlyKTsKKwlERUJVR0ZTX0FERCh2aWZzX3N0YXRlLCByb290ZGlyKTsKIAlERUJVR0ZTX0FERChkdGltX2ludGVydmFsLCByb290ZGlyKTsKIAlERUJVR0ZTX0FERChiZWFjb25faW50ZXJ2YWwsIHJvb3RkaXIpOwogCURFQlVHRlNfQUREKGJlYWNvbl9maWx0ZXJpbmcsIHJvb3RkaXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuYwppbmRleCA2NzRhZDJhLi4wMGNlNzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInJlZy5oIgogI2luY2x1ZGUgImlvLmgiCiAjaW5jbHVkZSAiZXZlbnQuaCIKQEAgLTMxLDEyICszMiwxNiBAQAogCiB2b2lkIHdsMTI3MV9wc3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7CiAJc3RydWN0IHdsMTI3MSAqd2w7CiAJaW50IHJldDsKIAogCWR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXdsID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3Qgd2wxMjcxLCBwc3BvbGxfd29yayk7CisJd2x2aWYgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3bDEyeHhfdmlmLCBwc3BvbGxfd29yayk7CisJdmlmID0gY29udGFpbmVyX29mKCh2b2lkICopd2x2aWYsIHN0cnVjdCBpZWVlODAyMTFfdmlmLCBkcnZfcHJpdik7CisJd2wgPSB3bHZpZi0+d2w7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJwc3BvbGwgd29yayIpOwogCkBAIC00NSwxMCArNTAsMTAgQEAKIAlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQogCQlnb3RvIG91dDsKIAotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKQogCQlnb3RvIG91dDsKIAogCS8qCkBAIC02MCwzMSArNjUsMzMgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQl3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFLCB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJd2wxMjcxX3BzX3NldF9tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCisJCQkgICB3bHZpZi0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dDoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9OwogCi1zdGF0aWMgdm9pZCB3bDEyNzFfZXZlbnRfcHNwb2xsX2RlbGl2ZXJ5X2ZhaWwoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyNzFfZXZlbnRfcHNwb2xsX2RlbGl2ZXJ5X2ZhaWwoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgZGVsYXkgPSB3bC0+Y29uZi5jb25uLnBzX3BvbGxfcmVjb3ZlcnlfcGVyaW9kOwogCWludCByZXQ7CiAKLQl3bC0+cHNfcG9sbF9mYWlsdXJlcysrOwotCWlmICh3bC0+cHNfcG9sbF9mYWlsdXJlcyA9PSAxKQorCXdsdmlmLT5wc19wb2xsX2ZhaWx1cmVzKys7CisJaWYgKHdsdmlmLT5wc19wb2xsX2ZhaWx1cmVzID09IDEpCiAJCXdsMTI3MV9pbmZvKCJBUCB3aXRoIGR5c2Z1bmN0aW9uYWwgcHMtcG9sbCwgIgogCQkJICAgICJ0cnlpbmcgdG8gd29yayBhcm91bmQgaXQuIik7CiAKIAkvKiBmb3JjZSBhY3RpdmUgbW9kZSByZWNlaXZlIGRhdGEgZnJvbSB0aGUgQVAgKi8KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfUFNNLCAmd2wtPmZsYWdzKSkgewotCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fQUNUSVZFX01PREUsCi0JCQkJCSB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSkgeworCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLCBTVEFUSU9OX0FDVElWRV9NT0RFLAorCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybjsKLQkJc2V0X2JpdChXTDEyNzFfRkxBR19QU1BPTExfRkFJTFVSRSwgJndsLT5mbGFncyk7Ci0JCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsod2wtPmh3LCAmd2wtPnBzcG9sbF93b3JrLAorCQlzZXRfYml0KFdMVklGX0ZMQUdfUFNQT0xMX0ZBSUxVUkUsICZ3bHZpZi0+ZmxhZ3MpOworCQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHdsLT5odywgJndsdmlmLT5wc3BvbGxfd29yaywKIAkJCQkJICAgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CiAJfQogCkBAIC05Nyw2ICsxMDQsNyBAQAogfQogCiBzdGF0aWMgaW50IHdsMTI3MV9ldmVudF9wc19yZXBvcnQoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJICBzdHJ1Y3QgZXZlbnRfbWFpbGJveCAqbWJveCwKIAkJCQkgIGJvb2wgKmJlYWNvbl9sb3NzKQogewpAQCAtMTA5LDQxICsxMTcsMzcgQEAKIAljYXNlIEVWRU5UX0VOVEVSX1BPV0VSX1NBVkVfRkFJTDoKIAkJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgIlBTTSBlbnRyeSBmYWlsZWQiKTsKIAotCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpIHsKIAkJCS8qIHJlbWFpbiBpbiBhY3RpdmUgbW9kZSAqLwotCQkJd2wtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CisJCQl3bHZpZi0+cHNtX2VudHJ5X3JldHJ5ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKHdsLT5wc21fZW50cnlfcmV0cnkgPCB0b3RhbF9yZXRyaWVzKSB7Ci0JCQl3bC0+cHNtX2VudHJ5X3JldHJ5Kys7Ci0JCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFLAotCQkJCQkJIHdsLT5iYXNpY19yYXRlLCB0cnVlKTsKKwkJaWYgKHdsdmlmLT5wc21fZW50cnlfcmV0cnkgPCB0b3RhbF9yZXRyaWVzKSB7CisJCQl3bHZpZi0+cHNtX2VudHJ5X3JldHJ5Kys7CisJCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLAorCQkJCQkJIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFLAorCQkJCQkJIHdsdmlmLT5iYXNpY19yYXRlLCB0cnVlKTsKIAkJfSBlbHNlIHsKIAkJCXdsMTI3MV9pbmZvKCJObyBhY2sgdG8gbnVsbGZ1bmMgZnJvbSBBUC4iKTsKLQkJCXdsLT5wc21fZW50cnlfcmV0cnkgPSAwOworCQkJd2x2aWYtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CiAJCQkqYmVhY29uX2xvc3MgPSB0cnVlOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgRVZFTlRfRU5URVJfUE9XRVJfU0FWRV9TVUNDRVNTOgotCQl3bC0+cHNtX2VudHJ5X3JldHJ5ID0gMDsKLQotCQkvKiBlbmFibGUgYmVhY29uIGZpbHRlcmluZyAqLwotCQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB0cnVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKKwkJd2x2aWYtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CiAKIAkJLyoKIAkJICogQkVUIGhhcyBvbmx5IGEgbWlub3IgZWZmZWN0IGluIDVHSHogYW5kIG1hc2tzCiAJCSAqIGNoYW5uZWwgc3dpdGNoIElFcywgc28gd2Ugb25seSBlbmFibGUgQkVUIG9uIDIuNEdIegogCQkqLwotCQlpZiAod2wtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJaWYgKHdsdmlmLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCiAJCQkvKiBlbmFibGUgYmVhY29uIGVhcmx5IHRlcm1pbmF0aW9uICovCi0JCQlyZXQgPSB3bDEyNzFfYWN4X2JldF9lbmFibGUod2wsIHRydWUpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHdsLCB3bHZpZiwgdHJ1ZSk7CiAKLQkJaWYgKHdsLT5wc19jb21wbCkgewotCQkJY29tcGxldGUod2wtPnBzX2NvbXBsKTsKLQkJCXdsLT5wc19jb21wbCA9IE5VTEw7CisJCWlmICh3bHZpZi0+cHNfY29tcGwpIHsKKwkJCWNvbXBsZXRlKHdsdmlmLT5wc19jb21wbCk7CisJCQl3bHZpZi0+cHNfY29tcGwgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNTQsMzkgKzE1OCw0NCBAQAogfQogCiBzdGF0aWMgdm9pZCB3bDEyNzFfZXZlbnRfcnNzaV90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkgICAgICBzdHJ1Y3QgZXZlbnRfbWFpbGJveCAqbWJveCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJZW51bSBubDgwMjExX2NxbV9yc3NpX3RocmVzaG9sZF9ldmVudCBldmVudDsKIAlzOCBtZXRyaWMgPSBtYm94LT5yc3NpX3Nucl90cmlnZ2VyX21ldHJpY1swXTsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgIlJTU0kgdHJpZ2dlciBtZXRyaWM6ICVkIiwgbWV0cmljKTsKIAotCWlmIChtZXRyaWMgPD0gd2wtPnJzc2lfdGhvbGQpCisJaWYgKG1ldHJpYyA8PSB3bHZpZi0+cnNzaV90aG9sZCkKIAkJZXZlbnQgPSBOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9MT1c7CiAJZWxzZQogCQlldmVudCA9IE5MODAyMTFfQ1FNX1JTU0lfVEhSRVNIT0xEX0VWRU5UX0hJR0g7CiAKLQlpZiAoZXZlbnQgIT0gd2wtPmxhc3RfcnNzaV9ldmVudCkKLQkJaWVlZTgwMjExX2NxbV9yc3NpX25vdGlmeSh3bC0+dmlmLCBldmVudCwgR0ZQX0tFUk5FTCk7Ci0Jd2wtPmxhc3RfcnNzaV9ldmVudCA9IGV2ZW50OworCWlmIChldmVudCAhPSB3bHZpZi0+bGFzdF9yc3NpX2V2ZW50KQorCQlpZWVlODAyMTFfY3FtX3Jzc2lfbm90aWZ5KHZpZiwgZXZlbnQsIEdGUF9LRVJORUwpOworCXdsdmlmLT5sYXN0X3Jzc2lfZXZlbnQgPSBldmVudDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3N0b3BfYmFfZXZlbnQoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyNzFfc3RvcF9iYV9ldmVudChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewotCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKSB7Ci0JCWlmICghd2wtPmJhX3J4X2JpdG1hcCkKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CisKKwlpZiAod2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgeworCQlpZiAoIXdsdmlmLT5zdGEuYmFfcnhfYml0bWFwKQogCQkJcmV0dXJuOwotCQlpZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHdsLT52aWYsIHdsLT5iYV9yeF9iaXRtYXAsCi0JCQkJCSAgICAgd2wtPmJzc2lkKTsKKwkJaWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbih2aWYsIHdsdmlmLT5zdGEuYmFfcnhfYml0bWFwLAorCQkJCQkgICAgIHZpZi0+YnNzX2NvbmYuYnNzaWQpOwogCX0gZWxzZSB7Ci0JCWludCBpOworCQl1OCBobGlkOwogCQlzdHJ1Y3Qgd2wxMjcxX2xpbmsgKmxuazsKLQkJZm9yIChpID0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUOyBpIDwgQVBfTUFYX0xJTktTOyBpKyspIHsKLQkJCWxuayA9ICZ3bC0+bGlua3NbaV07Ci0JCQlpZiAoIXdsMTI3MV9pc19hY3RpdmVfc3RhKHdsLCBpKSB8fCAhbG5rLT5iYV9iaXRtYXApCisJCWZvcl9lYWNoX3NldF9iaXQoaGxpZCwgd2x2aWYtPmFwLnN0YV9obGlkX21hcCwKKwkJCQkgV0wxMlhYX01BWF9MSU5LUykgeworCQkJbG5rID0gJndsLT5saW5rc1tobGlkXTsKKwkJCWlmICghbG5rLT5iYV9iaXRtYXApCiAJCQkJY29udGludWU7CiAKLQkJCWllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24od2wtPnZpZiwKKwkJCWllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24odmlmLAogCQkJCQkJICAgICBsbmstPmJhX2JpdG1hcCwKIAkJCQkJCSAgICAgbG5rLT5hZGRyKTsKIAkJfQpAQCAtMTk2LDE0ICsyMDUsMjMgQEAKIHN0YXRpYyB2b2lkIHdsMTJ4eF9ldmVudF9zb2Z0X2dlbWluaV9zZW5zZShzdHJ1Y3Qgd2wxMjcxICp3bCwKIAkJCQkJICAgICAgIHU4IGVuYWJsZSkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKKwogCWlmIChlbmFibGUpIHsKIAkJLyogZGlzYWJsZSBkeW5hbWljIFBTIHdoZW4gcmVxdWVzdGVkIGJ5IHRoZSBmaXJtd2FyZSAqLwotCQlpZWVlODAyMTFfZGlzYWJsZV9keW5fcHMod2wtPnZpZik7CisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWllZWU4MDIxMV9kaXNhYmxlX2R5bl9wcyh2aWYpOworCQl9CiAJCXNldF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHdsLT52aWYpOwogCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpOwotCQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCk7CisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHZpZik7CisJCQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCwgd2x2aWYpOworCQl9CiAJfQogCiB9CkBAIC0yMTcsMTAgKzIzNSwxMSBAQAogCiBzdGF0aWMgaW50IHdsMTI3MV9ldmVudF9wcm9jZXNzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgZXZlbnRfbWFpbGJveCAqbWJveCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0OwogCXUzMiB2ZWN0b3I7CiAJYm9vbCBiZWFjb25fbG9zcyA9IGZhbHNlOwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CiAJYm9vbCBkaXNjb25uZWN0X3N0YSA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgc3RhX2JpdG1hcCA9IDA7CiAKQEAgLTIzNCw3ICsyNTMsNyBAQAogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJzdGF0dXM6IDB4JXgiLAogCQkJICAgICBtYm94LT5zY2hlZHVsZWRfc2Nhbl9zdGF0dXMpOwogCi0JCXdsMTI3MV9zY2FuX3N0bSh3bCk7CisJCXdsMTI3MV9zY2FuX3N0bSh3bCwgd2wtPnNjYW5fdmlmKTsKIAl9CiAKIAlpZiAodmVjdG9yICYgUEVSSU9ESUNfU0NBTl9SRVBPUlRfRVZFTlRfSUQpIHsKQEAgLTI1Myw4ICsyNzIsNyBAQAogCQl9CiAJfQogCi0JaWYgKHZlY3RvciAmIFNPRlRfR0VNSU5JX1NFTlNFX0VWRU5UX0lEICYmCi0JICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQorCWlmICh2ZWN0b3IgJiBTT0ZUX0dFTUlOSV9TRU5TRV9FVkVOVF9JRCkKIAkJd2wxMnh4X2V2ZW50X3NvZnRfZ2VtaW5pX3NlbnNlKHdsLAogCQkJCQkgICAgICAgbWJveC0+c29mdF9nZW1pbmlfc2Vuc2VfaW5mbyk7CiAKQEAgLTI2Nyw0MCArMjg1LDU0IEBACiAJICogQlNTX0xPU0VfRVZFTlQsIGJlYWNvbiBsb3NzIGhhcyB0byBiZSByZXBvcnRlZCB0byB0aGUgc3RhY2suCiAJICoKIAkgKi8KLQlpZiAoKHZlY3RvciAmIEJTU19MT1NFX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKKwlpZiAodmVjdG9yICYgQlNTX0xPU0VfRVZFTlRfSUQpIHsKKwkJLyogVE9ETzogY2hlY2sgZm9yIG11bHRpLXJvbGUgKi8KIAkJd2wxMjcxX2luZm8oIkJlYWNvbiBsb3NzIGRldGVjdGVkLiIpOwogCiAJCS8qIGluZGljYXRlIHRvIHRoZSBzdGFjaywgdGhhdCBiZWFjb25zIGhhdmUgYmVlbiBsb3N0ICovCiAJCWJlYWNvbl9sb3NzID0gdHJ1ZTsKIAl9CiAKLQlpZiAoKHZlY3RvciAmIFBTX1JFUE9SVF9FVkVOVF9JRCkgJiYgIWlzX2FwKSB7CisJaWYgKHZlY3RvciAmIFBTX1JFUE9SVF9FVkVOVF9JRCkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJQU19SRVBPUlRfRVZFTlQiKTsKLQkJcmV0ID0gd2wxMjcxX2V2ZW50X3BzX3JlcG9ydCh3bCwgbWJveCwgJmJlYWNvbl9sb3NzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQkJcmV0ID0gd2wxMjcxX2V2ZW50X3BzX3JlcG9ydCh3bCwgd2x2aWYsCisJCQkJCQkgICAgIG1ib3gsICZiZWFjb25fbG9zcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCi0JaWYgKCh2ZWN0b3IgJiBQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCkgJiYgIWlzX2FwKQotCQl3bDEyNzFfZXZlbnRfcHNwb2xsX2RlbGl2ZXJ5X2ZhaWwod2wpOworCWlmICh2ZWN0b3IgJiBQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCkKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJCXdsMTI3MV9ldmVudF9wc3BvbGxfZGVsaXZlcnlfZmFpbCh3bCwgd2x2aWYpOworCQl9CiAKIAlpZiAodmVjdG9yICYgUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UX0lEKSB7CisJCS8qIFRPRE86IGNoZWNrIGFjdHVhbCBtdWx0aS1yb2xlIHN1cHBvcnQgKi8KIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UIik7Ci0JCWlmICh3bC0+dmlmKQotCQkJd2wxMjcxX2V2ZW50X3Jzc2lfdHJpZ2dlcih3bCwgbWJveCk7CisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl3bDEyNzFfZXZlbnRfcnNzaV90cmlnZ2VyKHdsLCB3bHZpZiwgbWJveCk7CisJCX0KIAl9CiAKLQlpZiAoKHZlY3RvciAmIEJBX1NFU1NJT05fUlhfQ09OU1RSQUlOVF9FVkVOVF9JRCkpIHsKKwlpZiAodmVjdG9yICYgQkFfU0VTU0lPTl9SWF9DT05TVFJBSU5UX0VWRU5UX0lEKSB7CisJCXU4IHJvbGVfaWQgPSBtYm94LT5yb2xlX2lkOwogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJCQV9TRVNTSU9OX1JYX0NPTlNUUkFJTlRfRVZFTlRfSUQuICIKLQkJCSAgICAgImJhX2FsbG93ZWQgPSAweCV4IiwgbWJveC0+cnhfYmFfYWxsb3dlZCk7CisJCQkgICAgICJiYV9hbGxvd2VkID0gMHgleCwgcm9sZV9pZD0lZCIsCisJCQkgICAgIG1ib3gtPnJ4X2JhX2FsbG93ZWQsIHJvbGVfaWQpOwogCi0JCXdsLT5iYV9hbGxvd2VkID0gISFtYm94LT5yeF9iYV9hbGxvd2VkOworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCQlpZiAocm9sZV9pZCAhPSAweGZmICYmIHJvbGVfaWQgIT0gd2x2aWYtPnJvbGVfaWQpCisJCQkJY29udGludWU7CiAKLQkJaWYgKHdsLT52aWYgJiYgIXdsLT5iYV9hbGxvd2VkKQotCQkJd2wxMjcxX3N0b3BfYmFfZXZlbnQod2wpOworCQkJd2x2aWYtPmJhX2FsbG93ZWQgPSAhIW1ib3gtPnJ4X2JhX2FsbG93ZWQ7CisJCQlpZiAoIXdsdmlmLT5iYV9hbGxvd2VkKQorCQkJCXdsMTI3MV9zdG9wX2JhX2V2ZW50KHdsLCB3bHZpZik7CisJCX0KIAl9CiAKLQlpZiAoKHZlY3RvciAmIENIQU5ORUxfU1dJVENIX0NPTVBMRVRFX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKKwlpZiAodmVjdG9yICYgQ0hBTk5FTF9TV0lUQ0hfQ09NUExFVEVfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiQ0hBTk5FTF9TV0lUQ0hfQ09NUExFVEVfRVZFTlRfSUQuICIKIAkJCQkJICAic3RhdHVzID0gMHgleCIsCiAJCQkJCSAgbWJveC0+Y2hhbm5lbF9zd2l0Y2hfc3RhdHVzKTsKQEAgLTMwOSw1MCArMzQxLDY1IEBACiAJCSAqIDEpIGNoYW5uZWwgc3dpdGNoIGNvbXBsZXRlIHdpdGggc3RhdHVzPTAKIAkJICogMikgY2hhbm5lbCBzd2l0Y2ggZmFpbGVkIHN0YXR1cz0xCiAJCSAqLwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX0NTX1BST0dSRVNTLCAmd2wtPmZsYWdzKSAmJgotCQkgICAgKHdsLT52aWYpKQotCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUod2wtPnZpZiwKLQkJCQltYm94LT5jaGFubmVsX3N3aXRjaF9zdGF0dXMgPyBmYWxzZSA6IHRydWUpOworCisJCS8qIFRPRE86IGNvbmZpZ3VyZSBvbmx5IHRoZSByZWxldmFudCB2aWYgKi8KKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWJvb2wgc3VjY2VzczsKKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xWSUZfRkxBR19DU19QUk9HUkVTUywKKwkJCQkJCSZ3bC0+ZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCisJCQlzdWNjZXNzID0gbWJveC0+Y2hhbm5lbF9zd2l0Y2hfc3RhdHVzID8gZmFsc2UgOiB0cnVlOworCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUodmlmLCBzdWNjZXNzKTsKKwkJfQogCX0KIAogCWlmICgodmVjdG9yICYgRFVNTVlfUEFDS0VUX0VWRU5UX0lEKSkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJEVU1NWV9QQUNLRVRfSURfRVZFTlRfSUQiKTsKLQkJaWYgKHdsLT52aWYpCi0JCQl3bDEyNzFfdHhfZHVtbXlfcGFja2V0KHdsKTsKKwkJd2wxMjcxX3R4X2R1bW15X3BhY2tldCh3bCk7CiAJfQogCiAJLyoKIAkgKiAiVFggcmV0cmllcyBleGNlZWRlZCIgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgYWNjb3JkaW5nIHRvIG1vZGUuCiAJICogSW4gQVAgbW9kZSB0aGUgb2ZmZW5kaW5nIHN0YXRpb24gaXMgZGlzY29ubmVjdGVkLgogCSAqLwotCWlmICgodmVjdG9yICYgTUFYX1RYX1JFVFJZX0VWRU5UX0lEKSAmJiBpc19hcCkgeworCWlmICh2ZWN0b3IgJiBNQVhfVFhfUkVUUllfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiTUFYX1RYX1JFVFJZX0VWRU5UX0lEIik7CiAJCXN0YV9iaXRtYXAgfD0gbGUxNl90b19jcHUobWJveC0+c3RhX3R4X3JldHJ5X2V4Y2VlZGVkKTsKIAkJZGlzY29ubmVjdF9zdGEgPSB0cnVlOwogCX0KIAotCWlmICgodmVjdG9yICYgSU5BQ1RJVkVfU1RBX0VWRU5UX0lEKSAmJiBpc19hcCkgeworCWlmICh2ZWN0b3IgJiBJTkFDVElWRV9TVEFfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiSU5BQ1RJVkVfU1RBX0VWRU5UX0lEIik7CiAJCXN0YV9iaXRtYXAgfD0gbGUxNl90b19jcHUobWJveC0+c3RhX2FnaW5nX3N0YXR1cyk7CiAJCWRpc2Nvbm5lY3Rfc3RhID0gdHJ1ZTsKIAl9CiAKLQlpZiAoaXNfYXAgJiYgZGlzY29ubmVjdF9zdGEpIHsKKwlpZiAoZGlzY29ubmVjdF9zdGEpIHsKIAkJdTMyIG51bV9wYWNrZXRzID0gd2wtPmNvbmYudHgubWF4X3R4X3JldHJpZXM7CiAJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJCWNvbnN0IHU4ICphZGRyOwogCQlpbnQgaDsKIAotCQlmb3IgKGggPSBmaW5kX2ZpcnN0X2JpdCgmc3RhX2JpdG1hcCwgQVBfTUFYX0xJTktTKTsKLQkJICAgICBoIDwgQVBfTUFYX0xJTktTOwotCQkgICAgIGggPSBmaW5kX25leHRfYml0KCZzdGFfYml0bWFwLCBBUF9NQVhfTElOS1MsIGgrMSkpIHsKLQkJCWlmICghd2wxMjcxX2lzX2FjdGl2ZV9zdGEod2wsIGgpKQorCQlmb3JfZWFjaF9zZXRfYml0KGgsICZzdGFfYml0bWFwLCBXTDEyWFhfTUFYX0xJTktTKSB7CisJCQlib29sIGZvdW5kID0gZmFsc2U7CisJCQkvKiBmaW5kIHRoZSBhcCB2aWYgY29ubmVjdGVkIHRvIHRoaXMgc3RhICovCisJCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfYXAod2wsIHdsdmlmKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChoLCB3bHZpZi0+YXAuc3RhX2hsaWRfbWFwKSkKKwkJCQkJY29udGludWU7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmb3VuZCkKIAkJCQljb250aW51ZTsKIAorCQkJdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJCQlhZGRyID0gd2wtPmxpbmtzW2hdLmFkZHI7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh3bC0+dmlmLCBhZGRyKTsKKwkJCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIGFkZHIpOwogCQkJaWYgKHN0YSkgewogCQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgInJlbW92ZSBzdGEgJWQiLCBoKTsKIAkJCQlpZWVlODAyMTFfcmVwb3J0X2xvd19hY2soc3RhLCBudW1fcGFja2V0cyk7CkBAIC0zNjEsOCArNDA4LDExIEBACiAJCX0KIAl9CiAKLQlpZiAod2wtPnZpZiAmJiBiZWFjb25fbG9zcykKLQkJaWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9zcyh3bC0+dmlmKTsKKwlpZiAoYmVhY29uX2xvc3MpCisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWllZWU4MDIxMV9jb25uZWN0aW9uX2xvc3ModmlmKTsKKwkJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCmluZGV4IDQ5YzFhMGUuLjFkODc4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCkBAIC0xMzIsNyArMTMyLDQgQEAKIGludCB3bDEyNzFfZXZlbnRfaGFuZGxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBtYm94KTsKIHZvaWQgd2wxMjcxX3BzcG9sbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLS8qIEZ1bmN0aW9ucyBmcm9tIG1haW4uYyAqLwotYm9vbCB3bDEyNzFfaXNfYWN0aXZlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmMKaW5kZXggMDRkYjY0Yy4uY2E3ZWU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAid2wxMnh4XzgwMjExLmgiCiAjaW5jbHVkZSAiYWN4LmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAidHguaCIKICNpbmNsdWRlICJpby5oIgogCi1pbnQgd2wxMjcxX3N0YV9pbml0X3RlbXBsYXRlc19jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2luaXRfdGVtcGxhdGVzX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpbnQgcmV0LCBpOwogCkBAIC02NCw3ICs2NSw3IEBACiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIE5VTEwsCiAJCQkJICAgICAgc2l6ZW9mCi0JCQkJICAgICAgKHN0cnVjdCB3bDEyeHhfcW9zX251bGxfZGF0YV90ZW1wbGF0ZSksCisJCQkJICAgICAgKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciksCiAJCQkJICAgICAgMCwgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTg4LDEwNSArODksNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IENNRF9URU1QTF9LTFZfSURYX01BWDsgaSsrKSB7Ci0JCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfS0xWLCBOVUxMLAotCQkJCQkgICAgICBXTDEyNzFfQ01EX1RFTVBMX0RGTFRfU0laRSwgaSwKLQkJCQkJICAgICAgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X2RlYXV0aF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3Qgd2wxMnh4X2Rpc2Nvbm5fdGVtcGxhdGUgKnRtcGw7Ci0JaW50IHJldDsKLQl1MzIgcmF0ZTsKLQotCXRtcGwgPSBremFsbG9jKHNpemVvZigqdG1wbCksIEdGUF9LRVJORUwpOwotCWlmICghdG1wbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0bXBsLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9ERUFVVEhfQVAsCi0JCQkJICAgICAgdG1wbCwgc2l6ZW9mKCp0bXBsKSwgMCwgcmF0ZSk7Ci0KLW91dDoKLQlrZnJlZSh0bXBsKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X251bGxfdGVtcGxhdGUoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm51bGxmdW5jOwotCWludCByZXQ7Ci0JdTMyIHJhdGU7Ci0KLQludWxsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCpudWxsZnVuYyksIEdGUF9LRVJORUwpOwotCWlmICghbnVsbGZ1bmMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8Ci0JCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8Ci0JCQkJCSAgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0KLQkvKiBudWxsZnVuYy0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCi0KLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfTlVMTF9EQVRBLCBudWxsZnVuYywKLQkJCQkgICAgICBzaXplb2YoKm51bGxmdW5jKSwgMCwgcmF0ZSk7Ci0KLW91dDoKLQlrZnJlZShudWxsZnVuYyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnFvc251bGw7Ci0JaW50IHJldDsKLQl1MzIgcmF0ZTsKLQotCXFvc251bGwgPSBremFsbG9jKHNpemVvZigqcW9zbnVsbCksIEdGUF9LRVJORUwpOwotCWlmICghcW9zbnVsbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlxb3NudWxsLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTEZVTkMgfAotCQkJCQkgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0KLQkvKiBxb3NudWxsLT5hZGRyMSBpcyBmaWxsZWQgYnkgRlcgKi8KLQotCW1lbWNweShxb3NudWxsLT5hZGRyMiwgd2wtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHFvc251bGwtPmFkZHIzLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfUU9TX05VTExfREFUQSwgcW9zbnVsbCwKLQkJCQkgICAgICBzaXplb2YoKnFvc251bGwpLCAwLCByYXRlKTsKLQotb3V0OgotCWtmcmVlKHFvc251bGwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlpbnQgcmV0OwotCiAJLyoKIAkgKiBQdXQgdmVyeSBsYXJnZSBlbXB0eSBwbGFjZWhvbGRlcnMgZm9yIGFsbCB0ZW1wbGF0ZXMuIFRoZXNlCiAJICogcmVzZXJ2ZSBtZW1vcnkgZm9yIGxhdGVyLgpAQCAtMjEwLDIyICsxMTIsMTA2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX05VTExfREFUQSwgTlVMTCwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHdsMTJ4eF9udWxsX2RhdGFfdGVtcGxhdGUpLAotCQkJCSAgICAgIDAsIFdMMTI3MV9SQVRFX0FVVE9NQVRJQyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIE5VTEwsCi0JCQkJICAgICAgc2l6ZW9mCi0JCQkJICAgICAgKHN0cnVjdCB3bDEyeHhfcW9zX251bGxfZGF0YV90ZW1wbGF0ZSksCi0JCQkJICAgICAgMCwgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1RFTVBMX0tMVl9JRFhfTUFYOyBpKyspIHsKKwkJcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9LTFYsIE5VTEwsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpLAorCQkJCQkgICAgICBpLCBXTDEyNzFfUkFURV9BVVRPTUFUSUMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfZGVhdXRoX3RlbXBsYXRlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlzdHJ1Y3Qgd2wxMnh4X2Rpc2Nvbm5fdGVtcGxhdGUgKnRtcGw7CisJaW50IHJldDsKKwl1MzIgcmF0ZTsKKworCXRtcGwgPSBremFsbG9jKHNpemVvZigqdG1wbCksIEdGUF9LRVJORUwpOworCWlmICghdG1wbCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwl0bXBsLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOworCisJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9ERUFVVEhfQVAsCisJCQkJICAgICAgdG1wbCwgc2l6ZW9mKCp0bXBsKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZSh0bXBsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X251bGxfdGVtcGxhdGUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm51bGxmdW5jOworCWludCByZXQ7CisJdTMyIHJhdGU7CisKKwludWxsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCpudWxsZnVuYyksIEdGUF9LRVJORUwpOworCWlmICghbnVsbGZ1bmMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7CisKKwkvKiBudWxsZnVuYy0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCisKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKworCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfTlVMTF9EQVRBLCBudWxsZnVuYywKKwkJCQkgICAgICBzaXplb2YoKm51bGxmdW5jKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZShudWxsZnVuYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpxb3NudWxsOworCWludCByZXQ7CisJdTMyIHJhdGU7CisKKwlxb3NudWxsID0ga3phbGxvYyhzaXplb2YoKnFvc251bGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFvc251bGwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcW9zbnVsbC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUU9TX05VTExGVU5DIHwKKwkJCQkJICAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMpOworCisJLyogcW9zbnVsbC0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCisKKwltZW1jcHkocW9zbnVsbC0+YWRkcjIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOworCW1lbWNweShxb3NudWxsLT5hZGRyMywgdmlmLT5hZGRyLCBFVEhfQUxFTik7CisKKwlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIHFvc251bGwsCisJCQkJICAgICAgc2l6ZW9mKCpxb3NudWxsKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZShxb3NudWxsKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHdsMTJ4eF9pbml0X3J4X2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpbnQgcmV0OwpAQCAtMjM3LDM5ICsyMjMsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsMTI3MV9pbml0X3BoeV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X3BoeV92aWZfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X3BkX3RocmVzaG9sZCh3bCk7CisJcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCB3bHZpZiwgREVGQVVMVF9TTE9UX1RJTUUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCBERUZBVUxUX1NMT1RfVElNRSk7CisJcmV0ID0gd2wxMjcxX2FjeF9zZXJ2aWNlX3BlcmlvZF90aW1lb3V0KHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X3NlcnZpY2VfcGVyaW9kX3RpbWVvdXQod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHdsLCB3bC0+aHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKKwlyZXQgPSB3bDEyNzFfYWN4X3J0c190aHJlc2hvbGQod2wsIHdsdmlmLCB3bC0+aHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9pbml0X2JlYWNvbl9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9pbml0X3N0YV9iZWFjb25fZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQkvKiBkaXNhYmxlIGJlYWNvbiBmaWx0ZXJpbmcgYXQgdGhpcyBzdGFnZSAqLwotCXJldCA9IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQod2wsIGZhbHNlKTsKKwlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl90YWJsZSh3bCk7CisJLyogZW5hYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KKwlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB3bHZpZiwgdHJ1ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTMwMiwxMSArMjg2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdChzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2Jjbl9kdGltX29wdGlvbnMod2wpOworCXJldCA9IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zMjcsMzYgKzMxMiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zdGFfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKKy8qIGdlbmVyaWMgc3RhIGluaXRpYWxpemF0aW9uIChub24gdmlmLXNwZWNpZmljKSAqLworc3RhdGljIGludCB3bDEyNzFfc3RhX2h3X2luaXQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHdsLT5jaGlwLmlkICE9IENISVBfSURfMTI4M19QRzIwKSB7Ci0JCXJldCA9IHdsMTI3MV9jbWRfZXh0X3JhZGlvX3Bhcm1zKHdsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIFBTIGNvbmZpZyAqLwotCXJldCA9IHdsMTI3MV9hY3hfY29uZmlnX3BzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9zdGFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwod2wsIHRydWUsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogSW5pdGlhbGl6ZSBjb25uZWN0aW9uIG1vbml0b3JpbmcgdGhyZXNob2xkcyAqLwotCXJldCA9IHdsMTI3MV9hY3hfY29ubl9tb25pdF9wYXJhbXMod2wsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIEJlYWNvbiBmaWx0ZXJpbmcgKi8KLQlyZXQgPSB3bDEyNzFfaW5pdF9iZWFjb25fZmlsdGVyKHdsKTsKKwlyZXQgPSB3bDEyeHhfYWN4X2NvbmZpZ19wcyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNjUsMTAzICszMjcsNjEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIEJlYWNvbnMgYW5kIGJyb2FkY2FzdCBzZXR0aW5ncyAqLwotCXJldCA9IHdsMTI3MV9pbml0X2JlYWNvbl9icm9hZGNhc3Qod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogQ29uZmlndXJlIGZvciBFTFAgcG93ZXIgc2F2aW5nICovCi0JcmV0ID0gd2wxMjcxX2FjeF9zbGVlcF9hdXRoKHdsLCBXTDEyNzFfUFNNX0VMUCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBDb25maWd1cmUgcnNzaS9zbnIgYXZlcmFnaW5nIHdlaWdodHMgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X3Jzc2lfc25yX2F2Z193ZWlnaHRzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2wxMnh4X2FjeF9tZW1fY2ZnKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIENvbmZpZ3VyZSB0aGUgRlcgbG9nZ2VyICovCi0JcmV0ID0gd2wxMnh4X2luaXRfZndsb2cod2wpOworCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zdGFfaHdfaW5pdF9wb3N0X21lbShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX3N0YV9od19pbml0X3Bvc3RfbWVtKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCWludCByZXQsIGk7CiAKIAkvKiBkaXNhYmxlIGFsbCBrZWVwLWFsaXZlIHRlbXBsYXRlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBDTURfVEVNUExfS0xWX0lEWF9NQVg7IGkrKykgewotCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCBpLAorCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCB3bHZpZiwgaSwKIAkJCQkJCSAgIEFDWF9LRUVQX0FMSVZFX1RQTF9JTlZBTElEKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIGRpc2FibGUgdGhlIGtlZXAtYWxpdmUgZmVhdHVyZSAqLwotCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHdsLCBmYWxzZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUod2wsIHdsdmlmLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfYXBfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKKy8qIGdlbmVyaWMgYXAgaW5pdGlhbGl6YXRpb24gKG5vbiB2aWYtc3BlY2lmaWMpICovCitzdGF0aWMgaW50IHdsMTI3MV9hcF9od19pbml0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlc19jb25maWcod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogQ29uZmlndXJlIGZvciBwb3dlciBhbHdheXMgb24gKi8KLQlyZXQgPSB3bDEyNzFfYWN4X3NsZWVwX2F1dGgod2wsIFdMMTI3MV9QU01fQ0FNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9pbml0X2FwX3JhdGVzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfYXBfbWF4X3R4X3JldHJ5KHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTJ4eF9hY3hfbWVtX2NmZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBpbml0aWFsaXplIFR4IHBvd2VyICovCi0JcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgd2wtPnBvd2VyX2xldmVsKTsKKwlyZXQgPSB3bDEyNzFfaW5pdF9hcF9yYXRlcyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYXBfaW5pdF9kZWF1dGhfdGVtcGxhdGUod2wpOworCXJldCA9IHdsMTI3MV9hcF9pbml0X2RlYXV0aF90ZW1wbGF0ZSh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gd2wxMjcxX2FwX2luaXRfbnVsbF90ZW1wbGF0ZSh3bCk7CisJcmV0ID0gd2wxMjcxX2FwX2luaXRfbnVsbF90ZW1wbGF0ZSh3bCwgdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHdsMTI3MV9hcF9pbml0X3Fvc19udWxsX3RlbXBsYXRlKHdsKTsKKwlyZXQgPSB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZSh3bCwgdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDY5LDQzICszODksNDUgQEAKIAkgKiB3aGVuIG9wZXJhdGluZyBhcyBBUCB3ZSB3YW50IHRvIHJlY2VpdmUgZXh0ZXJuYWwgYmVhY29ucyBmb3IKIAkgKiBjb25maWd1cmluZyBFUlAgcHJvdGVjdGlvbi4KIAkgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCBmYWxzZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgd2x2aWYsIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfYXBfaHdfaW5pdF9wb3N0X21lbShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXJldHVybiB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMod2wpOworCXJldHVybiB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMod2wsIHZpZik7CiB9CiAKLWludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCBpLCByZXQ7CiAJc3RydWN0IGNvbmZfdHhfcmF0ZV9jbGFzcyByYzsKIAl1MzIgc3VwcG9ydGVkX3JhdGVzOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAiQVAgYmFzaWMgcmF0ZSBzZXQ6IDB4JXgiLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19BUCwgIkFQIGJhc2ljIHJhdGUgc2V0OiAweCV4IiwKKwkJICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCi0JaWYgKHdsLT5iYXNpY19yYXRlX3NldCA9PSAwKQorCWlmICh3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyYy5lbmFibGVkX3JhdGVzID0gd2wtPmJhc2ljX3JhdGVfc2V0OworCXJjLmVuYWJsZWRfcmF0ZXMgPSB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQ7CiAJcmMubG9uZ19yZXRyeV9saW1pdCA9IDEwOwogCXJjLnNob3J0X3JldHJ5X2xpbWl0ID0gMTA7CiAJcmMuYWZsYWdzID0gMDsKLQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIEFDWF9UWF9BUF9NT0RFX01HTVRfUkFURSk7CisJcmV0ID0gd2wxMjcxX2FjeF9hcF9yYXRlX3BvbGljeSh3bCwgJnJjLCB3bHZpZi0+YXAubWdtdF9yYXRlX2lkeCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAkvKiB1c2UgdGhlIG1pbiBiYXNpYyByYXRlIGZvciBBUCBicm9hZGNhc3QvbXVsdGljYXN0ICovCi0JcmMuZW5hYmxlZF9yYXRlcyA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7CisJcmMuZW5hYmxlZF9yYXRlcyA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CiAJcmMuc2hvcnRfcmV0cnlfbGltaXQgPSAxMDsKIAlyYy5sb25nX3JldHJ5X2xpbWl0ID0gMTA7CiAJcmMuYWZsYWdzID0gMDsKLQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIEFDWF9UWF9BUF9NT0RFX0JDU1RfUkFURSk7CisJcmV0ID0gd2wxMjcxX2FjeF9hcF9yYXRlX3BvbGljeSh3bCwgJnJjLCB3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHgpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01MTMsNyArNDM1LDcgQEAKIAkgKiBJZiB0aGUgYmFzaWMgcmF0ZXMgY29udGFpbiBPRkRNIHJhdGVzLCB1c2UgT0ZETSBvbmx5CiAJICogcmF0ZXMgZm9yIHVuaWNhc3QgVFggYXMgd2VsbC4gRWxzZSB1c2UgYWxsIHN1cHBvcnRlZCByYXRlcy4KIAkgKi8KLQlpZiAoKHdsLT5iYXNpY19yYXRlX3NldCAmIENPTkZfVFhfT0ZETV9SQVRFUykpCisJaWYgKCh3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgJiBDT05GX1RYX09GRE1fUkFURVMpKQogCQlzdXBwb3J0ZWRfcmF0ZXMgPSBDT05GX1RYX09GRE1fUkFURVM7CiAJZWxzZQogCQlzdXBwb3J0ZWRfcmF0ZXMgPSBDT05GX1RYX0FQX0VOQUJMRURfUkFURVM7CkBAIC01MjcsNyArNDQ5LDggQEAKIAkJcmMuc2hvcnRfcmV0cnlfbGltaXQgPSAxMDsKIAkJcmMubG9uZ19yZXRyeV9saW1pdCA9IDEwOwogCQlyYy5hZmxhZ3MgPSAwOwotCQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIGkpOworCQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsCisJCQkJCQl3bHZpZi0+YXAudWNhc3RfcmF0ZV9pZHhbaV0pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNTM1LDI0ICs0NTgsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2V0X2JhX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfc2V0X2JhX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJLyogUmVzZXQgdGhlIEJBIFJYIGluZGljYXRvcnMgKi8KLQl3bC0+YmFfcnhfYml0bWFwID0gMDsKLQl3bC0+YmFfYWxsb3dlZCA9IHRydWU7CisJd2x2aWYtPmJhX2FsbG93ZWQgPSB0cnVlOwogCXdsLT5iYV9yeF9zZXNzaW9uX2NvdW50ID0gMDsKIAogCS8qIEJBIGlzIHN1cHBvcnRlZCBpbiBTVEEvQVAgbW9kZXMgKi8KLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUyAmJgotCSAgICB3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUykgewotCQl3bC0+YmFfc3VwcG9ydCA9IGZhbHNlOworCWlmICh3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTICYmCisJICAgIHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKSB7CisJCXdsdmlmLT5iYV9zdXBwb3J0ID0gZmFsc2U7CiAJCXJldHVybiAwOwogCX0KIAotCXdsLT5iYV9zdXBwb3J0ID0gdHJ1ZTsKKwl3bHZpZi0+YmFfc3VwcG9ydCA9IHRydWU7CiAKIAkvKiA4MDIuMTFuIGluaXRpYXRvciBCQSBzZXNzaW9uIHNldHRpbmcgKi8KLQlyZXR1cm4gd2wxMnh4X2FjeF9zZXRfYmFfaW5pdGlhdG9yX3BvbGljeSh3bCk7CisJcmV0dXJuIHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3kod2wsIHdsdmlmKTsKIH0KIAogaW50IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpCkBAIC01NjIsNyArNDg0LDcgQEAKIAlpZiAod2wtPmNoaXAuaWQgPT0gQ0hJUF9JRF8xMjgzX1BHMjApIHsKIAkJdTMyIGhvc3RfY2ZnX2JpdG1hcCA9IEhPU1RfSUZfQ0ZHX1JYX0ZJRk9fRU5BQkxFOwogCi0JCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0JMT0NLU0laRV9BTElHTk1FTlQpCisJCWlmICghKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVCkpCiAJCQkvKiBFbmFibGUgU0RJTyBwYWRkaW5nICovCiAJCQlob3N0X2NmZ19iaXRtYXAgfD0gSE9TVF9JRl9DRkdfVFhfUEFEX1RPX1NESU9fQkxLOwogCkBAIC01NzUsMzkgKzQ5NywxODYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiB2aWYtc3BlY2lmYyBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCB3bDEyeHhfaW5pdF9zdGFfcm9sZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHdsLCB3bHZpZiwgdHJ1ZSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXplIGNvbm5lY3Rpb24gbW9uaXRvcmluZyB0aHJlc2hvbGRzICovCisJcmV0ID0gd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyh3bCwgd2x2aWYsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEJlYWNvbiBmaWx0ZXJpbmcgKi8KKwlyZXQgPSB3bDEyNzFfaW5pdF9zdGFfYmVhY29uX2ZpbHRlcih3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQmVhY29ucyBhbmQgYnJvYWRjYXN0IHNldHRpbmdzICovCisJcmV0ID0gd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdCh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29uZmlndXJlIHJzc2kvc25yIGF2ZXJhZ2luZyB3ZWlnaHRzICovCisJcmV0ID0gd2wxMjcxX2FjeF9yc3NpX3Nucl9hdmdfd2VpZ2h0cyh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIHZpZi1zcGVjaWZpYyBpbnRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X2FwX3JvbGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGluaXRpYWxpemUgVHggcG93ZXIgKi8KKwlyZXQgPSB3bDEyNzFfYWN4X3R4X3Bvd2VyKHdsLCB3bHZpZiwgd2x2aWYtPnBvd2VyX2xldmVsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitpbnQgd2wxMjcxX2luaXRfdmlmX3NwZWNpZmljKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCXN0cnVjdCBjb25mX3R4X2FjX2NhdGVnb3J5ICpjb25mX2FjOworCXN0cnVjdCBjb25mX3R4X3RpZCAqY29uZl90aWQ7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpbnQgcmV0LCBpOworCisJLyoKKwkgKiBjb25zaWRlciBhbGwgZXhpc3Rpbmcgcm9sZXMgYmVmb3JlIGNvbmZpZ3VyaW5nIHBzbS4KKwkgKiBUT0RPOiByZWNvbmZpZ3VyZSBvbiBpbnRlcmZhY2UgcmVtb3ZhbC4KKwkgKi8KKwlpZiAoIXdsLT5hcF9jb3VudCkgeworCQlpZiAoaXNfYXApIHsKKwkJCS8qIENvbmZpZ3VyZSBmb3IgcG93ZXIgYWx3YXlzIG9uICovCisJCQlyZXQgPSB3bDEyNzFfYWN4X3NsZWVwX2F1dGgod2wsIFdMMTI3MV9QU01fQ0FNKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAoIXdsLT5zdGFfY291bnQpIHsKKwkJCS8qIENvbmZpZ3VyZSBmb3IgRUxQIHBvd2VyIHNhdmluZyAqLworCQkJcmV0ID0gd2wxMjcxX2FjeF9zbGVlcF9hdXRoKHdsLCBXTDEyNzFfUFNNX0VMUCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogTW9kZSBzcGVjaWZpYyBpbml0ICovCisJaWYgKGlzX2FwKSB7CisJCXJldCA9IHdsMTI3MV9hcF9od19pbml0KHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSB3bDEyeHhfaW5pdF9hcF9yb2xlKHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSB3bDEyNzFfc3RhX2h3X2luaXQod2wsIHdsdmlmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHdsMTJ4eF9pbml0X3N0YV9yb2xlKHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwl3bDEyeHhfaW5pdF9waHlfdmlmX2NvbmZpZyh3bCwgd2x2aWYpOworCisJLyogRGVmYXVsdCBUSUQvQUMgY29uZmlndXJhdGlvbiAqLworCUJVR19PTih3bC0+Y29uZi50eC50aWRfY29uZl9jb3VudCAhPSB3bC0+Y29uZi50eC5hY19jb25mX2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgd2wtPmNvbmYudHgudGlkX2NvbmZfY291bnQ7IGkrKykgeworCQljb25mX2FjID0gJndsLT5jb25mLnR4LmFjX2NvbmZbaV07CisJCXJldCA9IHdsMTI3MV9hY3hfYWNfY2ZnKHdsLCB3bHZpZiwgY29uZl9hYy0+YWMsCisJCQkJCWNvbmZfYWMtPmN3X21pbiwgY29uZl9hYy0+Y3dfbWF4LAorCQkJCQljb25mX2FjLT5haWZzbiwgY29uZl9hYy0+dHhfb3BfbGltaXQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJY29uZl90aWQgPSAmd2wtPmNvbmYudHgudGlkX2NvbmZbaV07CisJCXJldCA9IHdsMTI3MV9hY3hfdGlkX2NmZyh3bCwgd2x2aWYsCisJCQkJCSBjb25mX3RpZC0+cXVldWVfaWQsCisJCQkJCSBjb25mX3RpZC0+Y2hhbm5lbF90eXBlLAorCQkJCQkgY29uZl90aWQtPnRzaWQsCisJCQkJCSBjb25mX3RpZC0+cHNfc2NoZW1lLAorCQkJCQkgY29uZl90aWQtPmFja19wb2xpY3ksCisJCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzBdLAorCQkJCQkgY29uZl90aWQtPmFwc2RfY29uZlsxXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDb25maWd1cmUgSFcgZW5jcnlwdGlvbiAqLworCXJldCA9IHdsMTI3MV9hY3hfZmVhdHVyZV9jZmcod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1vZGUgc3BlY2lmaWMgaW5pdCAtIHBvc3QgbWVtIGluaXQgKi8KKwlpZiAoaXNfYXApCisJCXJldCA9IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHdsLCB2aWYpOworCWVsc2UKKwkJcmV0ID0gd2wxMjcxX3N0YV9od19pbml0X3Bvc3RfbWVtKHdsLCB2aWYpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb25maWd1cmUgaW5pdGlhdG9yIEJBIHNlc3Npb25zIHBvbGljaWVzICovCisJcmV0ID0gd2wxMjcxX3NldF9iYV9wb2xpY2llcyh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CiAKIGludCB3bDEyNzFfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQlzdHJ1Y3QgY29uZl90eF9hY19jYXRlZ29yeSAqY29uZl9hYzsKLQlzdHJ1Y3QgY29uZl90eF90aWQgKmNvbmZfdGlkOwotCWludCByZXQsIGk7Ci0JYm9vbCBpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpbnQgcmV0OwogCi0JaWYgKHdsLT5jaGlwLmlkID09IENISVBfSURfMTI4M19QRzIwKQorCWlmICh3bC0+Y2hpcC5pZCA9PSBDSElQX0lEXzEyODNfUEcyMCkgewogCQlyZXQgPSB3bDEyOHhfY21kX2dlbmVyYWxfcGFybXMod2wpOwotCWVsc2UKLQkJcmV0ID0gd2wxMjcxX2NtZF9nZW5lcmFsX3Bhcm1zKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICh3bC0+Y2hpcC5pZCA9PSBDSElQX0lEXzEyODNfUEcyMCkKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCQlyZXQgPSB3bDEyOHhfY21kX3JhZGlvX3Bhcm1zKHdsKTsKLQllbHNlCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSB3bDEyNzFfY21kX2dlbmVyYWxfcGFybXMod2wpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAJCXJldCA9IHdsMTI3MV9jbWRfcmFkaW9fcGFybXMod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHdsMTI3MV9jbWRfZXh0X3JhZGlvX3Bhcm1zKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIENoaXAtc3BlY2lmaWMgaW5pdCAqLwogCXJldCA9IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQod2wpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogTW9kZSBzcGVjaWZpYyBpbml0ICovCi0JaWYgKGlzX2FwKQotCQlyZXQgPSB3bDEyNzFfYXBfaHdfaW5pdCh3bCk7Ci0JZWxzZQotCQlyZXQgPSB3bDEyNzFfc3RhX2h3X2luaXQod2wpOworCS8qIEluaXQgdGVtcGxhdGVzICovCisJcmV0ID0gd2wxMjcxX2luaXRfdGVtcGxhdGVzX2NvbmZpZyh3bCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKKwlyZXQgPSB3bDEyeHhfYWN4X21lbV9jZmcod2wpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29uZmlndXJlIHRoZSBGVyBsb2dnZXIgKi8KKwlyZXQgPSB3bDEyeHhfaW5pdF9md2xvZyh3bCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTYyNiwxMSArNjk1LDYgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CiAKLQkvKiBQSFkgbGF5ZXIgY29uZmlnICovCi0JcmV0ID0gd2wxMjcxX2luaXRfcGh5X2NvbmZpZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJcmV0ID0gd2wxMjcxX2FjeF9kY29faXRyaW1fcGFyYW1zKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CkBAIC02NTUsNjEgKzcxOSwyMCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIERlZmF1bHQgVElEL0FDIGNvbmZpZ3VyYXRpb24gKi8KLQlCVUdfT04od2wtPmNvbmYudHgudGlkX2NvbmZfY291bnQgIT0gd2wtPmNvbmYudHguYWNfY29uZl9jb3VudCk7Ci0JZm9yIChpID0gMDsgaSA8IHdsLT5jb25mLnR4LnRpZF9jb25mX2NvdW50OyBpKyspIHsKLQkJY29uZl9hYyA9ICZ3bC0+Y29uZi50eC5hY19jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X2FjX2NmZyh3bCwgY29uZl9hYy0+YWMsIGNvbmZfYWMtPmN3X21pbiwKLQkJCQkJY29uZl9hYy0+Y3dfbWF4LCBjb25mX2FjLT5haWZzbiwKLQkJCQkJY29uZl9hYy0+dHhfb3BfbGltaXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JCWNvbmZfdGlkID0gJndsLT5jb25mLnR4LnRpZF9jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X3RpZF9jZmcod2wsIGNvbmZfdGlkLT5xdWV1ZV9pZCwKLQkJCQkJIGNvbmZfdGlkLT5jaGFubmVsX3R5cGUsCi0JCQkJCSBjb25mX3RpZC0+dHNpZCwKLQkJCQkJIGNvbmZfdGlkLT5wc19zY2hlbWUsCi0JCQkJCSBjb25mX3RpZC0+YWNrX3BvbGljeSwKLQkJCQkJIGNvbmZfdGlkLT5hcHNkX2NvbmZbMF0sCi0JCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQl9Ci0KIAkvKiBFbmFibGUgZGF0YSBwYXRoICovCiAJcmV0ID0gd2wxMjcxX2NtZF9kYXRhX3BhdGgod2wsIDEpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIENvbmZpZ3VyZSBIVyBlbmNyeXB0aW9uICovCi0JcmV0ID0gd2wxMjcxX2FjeF9mZWF0dXJlX2NmZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJLyogY29uZmlndXJlIFBNICovCiAJcmV0ID0gd2wxMjcxX2FjeF9wbV9jb25maWcod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIE1vZGUgc3BlY2lmaWMgaW5pdCAtIHBvc3QgbWVtIGluaXQgKi8KLQlpZiAoaXNfYXApCi0JCXJldCA9IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHdsKTsKLQllbHNlCi0JCXJldCA9IHdsMTI3MV9zdGFfaHdfaW5pdF9wb3N0X21lbSh3bCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KIAlyZXQgPSB3bDEyeHhfYWN4X3NldF9yYXRlX21nbXRfcGFyYW1zKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CiAKLQkvKiBDb25maWd1cmUgaW5pdGlhdG9yIEJBIHNlc3Npb25zIHBvbGljaWVzICovCi0JcmV0ID0gd2wxMjcxX3NldF9iYV9wb2xpY2llcyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJLyogY29uZmlndXJlIGhhbmdvdmVyICovCiAJcmV0ID0gd2wxMnh4X2FjeF9jb25maWdfaGFuZ292ZXIod2wpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmgKaW5kZXggM2EzYzIzMC4uMmRhMGY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pdC5oCkBAIC0yNywxMyArMjcsMTMgQEAKICNpbmNsdWRlICJ3bDEyeHguaCIKIAogaW50IHdsMTI3MV9od19pbml0X3Bvd2VyX2F1dGgoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9zdGFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfaW5pdF9waHlfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfaW5pdF9wdGEoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9pbml0X2VuZXJneV9kZXRlY3Rpb24oc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9od19pbml0KHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfaW5pdF92aWZfc3BlY2lmaWMoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworaW50IHdsMTI3MV9pbml0X2FwX3JhdGVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2lvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYwppbmRleCBjMmRhNjZmLi4wNzlhZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYwpAQCAtMjQsOCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndsMTJ4eF84MDIxMS5oIgogI2luY2x1ZGUgImlvLmgiCiAjaW5jbHVkZSAidHguaCIKQEAgLTQ2LDcgKzQ4LDcgQEAKIGJvb2wgd2wxMjcxX3NldF9ibG9ja19zaXplKHN0cnVjdCB3bDEyNzEgKndsKQogewogCWlmICh3bC0+aWZfb3BzLT5zZXRfYmxvY2tfc2l6ZSkgewotCQl3bC0+aWZfb3BzLT5zZXRfYmxvY2tfc2l6ZSh3bCwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKKwkJd2wtPmlmX29wcy0+c2V0X2Jsb2NrX3NpemUod2wtPmRldiwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01NSwxMiArNTcsMTIgQEAKIAogdm9pZCB3bDEyNzFfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQogewotCXdsLT5pZl9vcHMtPmRpc2FibGVfaXJxKHdsKTsKKwlkaXNhYmxlX2lycSh3bC0+aXJxKTsKIH0KIAogdm9pZCB3bDEyNzFfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCiB7Ci0Jd2wtPmlmX29wcy0+ZW5hYmxlX2lycSh3bCk7CisJZW5hYmxlX2lycSh3bC0+aXJxKTsKIH0KIAogLyogU2V0IHRoZSBTUEkgcGFydGl0aW9ucyB0byBhY2Nlc3MgdGhlIGNoaXAgYWRkcmVzc2VzCkBAIC0xMjgsMTMgKzEzMCwxMyBAQAogdm9pZCB3bDEyNzFfaW9fcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaWYgKHdsLT5pZl9vcHMtPnJlc2V0KQotCQl3bC0+aWZfb3BzLT5yZXNldCh3bCk7CisJCXdsLT5pZl9vcHMtPnJlc2V0KHdsLT5kZXYpOwogfQogCiB2b2lkIHdsMTI3MV9pb19pbml0KHN0cnVjdCB3bDEyNzEgKndsKQogewogCWlmICh3bC0+aWZfb3BzLT5pbml0KQotCQl3bC0+aWZfb3BzLT5pbml0KHdsKTsKKwkJd2wtPmlmX29wcy0+aW5pdCh3bC0+ZGV2KTsKIH0KIAogdm9pZCB3bDEyNzFfdG9wX3JlZ193cml0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHUxNiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCmluZGV4IGU4MzkzNDEuLmQzOThjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCkBAIC01MSwyMyArNTEsMTcgQEAKIHZvaWQgd2wxMjcxX2lvX3Jlc2V0KHN0cnVjdCB3bDEyNzEgKndsKTsKIHZvaWQgd2wxMjcxX2lvX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKndsMTI3MV93bF90b19kZXYoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuIHdsLT5pZl9vcHMtPmRldih3bCk7Ci19Ci0KLQogLyogUmF3IHRhcmdldCBJTywgYWRkcmVzcyBpcyBub3QgdHJhbnNsYXRlZCAqLwogc3RhdGljIGlubGluZSB2b2lkIHdsMTI3MV9yYXdfd3JpdGUoc3RydWN0IHdsMTI3MSAqd2wsIGludCBhZGRyLCB2b2lkICpidWYsCiAJCQkJICAgIHNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCiB7Ci0Jd2wtPmlmX29wcy0+d3JpdGUod2wsIGFkZHIsIGJ1ZiwgbGVuLCBmaXhlZCk7CisJd2wtPmlmX29wcy0+d3JpdGUod2wtPmRldiwgYWRkciwgYnVmLCBsZW4sIGZpeGVkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHdsMTI3MV9yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKIAkJCQkgICBzaXplX3QgbGVuLCBib29sIGZpeGVkKQogewotCXdsLT5pZl9vcHMtPnJlYWQod2wsIGFkZHIsIGJ1ZiwgbGVuLCBmaXhlZCk7CisJd2wtPmlmX29wcy0+cmVhZCh3bC0+ZGV2LCBhZGRyLCBidWYsIGxlbiwgZml4ZWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiB3bDEyNzFfcmF3X3JlYWQzMihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIpCkBAIC0xNTUsMTMgKzE0OSwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgd2wxMjcxX3Bvd2VyX29mZihzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQl3bC0+aWZfb3BzLT5wb3dlcih3bCwgZmFsc2UpOworCXdsLT5pZl9vcHMtPnBvd2VyKHdsLT5kZXYsIGZhbHNlKTsKIAljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfR1BJT19QT1dFUiwgJndsLT5mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHdsMTI3MV9wb3dlcl9vbihzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQlpbnQgcmV0ID0gd2wtPmlmX29wcy0+cG93ZXIod2wsIHRydWUpOworCWludCByZXQgPSB3bC0+aWZfb3BzLT5wb3dlcih3bC0+ZGV2LCB0cnVlKTsKIAlpZiAocmV0ID09IDApCiAJCXNldF9iaXQoV0wxMjcxX0ZMQUdfR1BJT19QT1dFUiwgJndsLT5mbGFncyk7CiAKQEAgLTE3NiwxNSArMTcwLDEwIEBACiBpbnQgd2wxMjcxX3NldF9wYXJ0aXRpb24oc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkgc3RydWN0IHdsMTI3MV9wYXJ0aXRpb25fc2V0ICpwKTsKIAorYm9vbCB3bDEyNzFfc2V0X2Jsb2NrX3NpemUoc3RydWN0IHdsMTI3MSAqd2wpOworCiAvKiBGdW5jdGlvbnMgZnJvbSB3bDEyNzFfbWFpbi5jICovCiAKLWludCB3bDEyNzFfcmVnaXN0ZXJfaHcoc3RydWN0IHdsMTI3MSAqd2wpOwotdm9pZCB3bDEyNzFfdW5yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2luaXRfaWVlZTgwMjExKHN0cnVjdCB3bDEyNzEgKndsKTsKLXN0cnVjdCBpZWVlODAyMTFfaHcgKndsMTI3MV9hbGxvY19odyh2b2lkKTsKLWludCB3bDEyNzFfZnJlZV9odyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pcnFyZXR1cm5fdCB3bDEyNzFfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpOwotYm9vbCB3bDEyNzFfc2V0X2Jsb2NrX3NpemUoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV90eF9kdW1teV9wYWNrZXQoc3RydWN0IHdsMTI3MSAqd2wpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jCmluZGV4IDg4NGY4MmIuLmMzMDU4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYwpAQCAtMzIsOCArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd2wxMnh4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2wxMnh4XzgwMjExLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiaW8uaCIKQEAgLTM3Nyw0MiArMzc5LDMwIEBACiBzdGF0aWMgYm9vbCBidWdfb25fcmVjb3Zlcnk7CiAKIHN0YXRpYyB2b2lkIF9fd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCQkgYm9vbCByZXNldF90eF9xdWV1ZXMpOwotc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci0KLQotc3RhdGljIHZvaWQgd2wxMjcxX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB3bDEyNzFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJ3bDEyNzEiLAotCS5pZCAgICAgICAgICAgICA9IC0xLAotCi0JLyogZGV2aWNlIG1vZGVsIGluc2lzdHMgdG8gaGF2ZSBhIHJlbGVhc2UgZnVuY3Rpb24gKi8KLQkuZGV2ICAgICAgICAgICAgPSB7Ci0JCS5yZWxlYXNlID0gd2wxMjcxX2RldmljZV9yZWxlYXNlLAotCX0sCi19Oworc3RhdGljIHZvaWQgd2wxMjcxX29wX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIAogc3RhdGljIERFRklORV9NVVRFWCh3bF9saXN0X211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQod2xfbGlzdCk7CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2NoZWNrX29wZXJzdGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdW5zaWduZWQgY2hhciBvcGVyc3RhdGUpCitzdGF0aWMgaW50IHdsMTI3MV9jaGVja19vcGVyc3RhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgb3BlcnN0YXRlKQogewogCWludCByZXQ7CisKIAlpZiAob3BlcnN0YXRlICE9IElGX09QRVJfVVApCiAJCXJldHVybiAwOwogCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoV0wxMjcxX0ZMQUdfU1RBX1NUQVRFX1NFTlQsICZ3bC0+ZmxhZ3MpKQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsICZ3bHZpZi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHdsMTJ4eF9jbWRfc2V0X3BlZXJfc3RhdGUod2wsIHdsLT5zdGFfaGxpZCk7CisJcmV0ID0gd2wxMnh4X2NtZF9zZXRfcGVlcl9zdGF0ZSh3bCwgd2x2aWYtPnN0YS5obGlkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXdsMTJ4eF9jcm9jKHdsLCB3bC0+cm9sZV9pZCk7CisJd2wxMnh4X2Nyb2Mod2wsIHdsdmlmLT5yb2xlX2lkKTsKIAogCXdsMTI3MV9pbmZvKCJBc3NvY2lhdGlvbiBjb21wbGV0ZWQuIik7CiAJcmV0dXJuIDA7CkBAIC00MjYsNiArNDE2LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3Qgd2wxMjcxICp3bDsKIAlzdHJ1Y3Qgd2wxMjcxICp3bF90ZW1wOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIENoZWNrIHRoYXQgdGhpcyBub3RpZmljYXRpb24gaXMgZm9yIHVzLiAqLwpAQCAtNDU5LDE3ICs0NTAsMTggQEAKIAlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpCi0JCWdvdG8gb3V0OworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpCisJCQljb250aW51ZTsKIAotCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKIAotCXdsMTI3MV9jaGVja19vcGVyc3RhdGUod2wsIGRldi0+b3BlcnN0YXRlKTsKKwkJd2wxMjcxX2NoZWNrX29wZXJzdGF0ZSh3bCwgd2x2aWYsIGRldi0+b3BlcnN0YXRlKTsKIAotCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwotCisJCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworCX0KIG91dDoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKQEAgLTQ5OCwxOSArNDkwLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSAgIGJvb2wgZW5hYmxlKQogewogCWludCByZXQgPSAwOwogCiAJLyogd2Ugc2hvdWxkIGhvbGQgd2wtPm11dGV4ICovCi0JcmV0ID0gd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcod2wsIGVuYWJsZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcod2wsIHdsdmlmLCBlbmFibGUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCWlmIChlbmFibGUpCi0JCXNldF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpOworCQlzZXRfYml0KFdMVklGX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpOwogCWVsc2UKLQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2wtPmZsYWdzKTsKKwkJY2xlYXJfYml0KFdMVklGX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC01MTksMjUgKzUxMiwyNSBAQAogICogdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2hlbiB0aGUgcnhfc3RyZWFtaW5nIGludGVydmFsCiAgKiBoYXMgYmVlZCBjaGFuZ2VkIG9yIHJ4X3N0cmVhbWluZyBzaG91bGQgYmUgZGlzYWJsZWQKICAqLwotaW50IHdsMTI3MV9yZWNhbGNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTI3MV9yZWNhbGNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldCA9IDA7CiAJaW50IHBlcmlvZCA9IHdsLT5jb25mLnJ4X3N0cmVhbWluZy5pbnRlcnZhbDsKIAogCS8qIGRvbid0IHJlY29uZmlndXJlIGlmIHJ4X3N0cmVhbWluZyBpcyBkaXNhYmxlZCAqLwotCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0OwogCiAJLyogcmVjb25maWd1cmUvZGlzYWJsZSBhY2NvcmRpbmcgdG8gbmV3IHN0cmVhbWluZ19wZXJpb2QgKi8KIAlpZiAocGVyaW9kICYmCi0JICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSAmJgogCSAgICAod2wtPmNvbmYucnhfc3RyZWFtaW5nLmFsd2F5cyB8fAogCSAgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpKSkKLQkJcmV0ID0gd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcod2wsIHRydWUpOworCQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgd2x2aWYsIHRydWUpOwogCWVsc2UgewotCQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgZmFsc2UpOworCQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgd2x2aWYsIGZhbHNlKTsKIAkJLyogZG9uJ3QgY2FuY2VsX3dvcmtfc3luYyBzaW5jZSB3ZSBtaWdodCBkZWFkbG9jayAqLwotCQlkZWxfdGltZXJfc3luYygmd2wtPnJ4X3N0cmVhbWluZ190aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZ3bHZpZi0+cnhfc3RyZWFtaW5nX3RpbWVyKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTU0NiwxMyArNTM5LDE0IEBACiBzdGF0aWMgdm9pZCB3bDEyNzFfcnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCB3bDEyNzEgKndsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bDEyNzEsIHJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bDEyeHhfdmlmLAorCQkJCQkJcnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHdsdmlmLT53bDsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpIHx8Ci0JICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykgfHwKKwlpZiAodGVzdF9iaXQoV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsdmlmLT5mbGFncykgfHwKKwkgICAgIXRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpIHx8CiAJICAgICghd2wtPmNvbmYucnhfc3RyZWFtaW5nLmFsd2F5cyAmJgogCSAgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkpCiAJCWdvdG8gb3V0OwpAQCAtNTY0LDEyICs1NTgsMTIgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgdHJ1ZSk7CisJcmV0ID0gd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcod2wsIHdsdmlmLCB0cnVlKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2xlZXA7CiAKIAkvKiBzdG9wIGl0IGFmdGVyIHNvbWUgdGltZSBvZiBpbmFjdGl2aXR5ICovCi0JbW9kX3RpbWVyKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyLAorCW1vZF90aW1lcigmd2x2aWYtPnJ4X3N0cmVhbWluZ190aW1lciwKIAkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb24pKTsKIAogb3V0X3NsZWVwOgpAQCAtNTgxLDE5ICs1NzUsMjAgQEAKIHN0YXRpYyB2b2lkIHdsMTI3MV9yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCB3bDEyNzEgKndsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bDEyNzEsIHJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiwKKwkJCQkJCXJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCXN0cnVjdCB3bDEyNzEgKndsID0gd2x2aWYtPndsOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAotCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCBmYWxzZSk7CisJcmV0ID0gd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcod2wsIHdsdmlmLCBmYWxzZSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfc2xlZXA7CiAKQEAgLTYwNSw4ICs2MDAsOSBAQAogCiBzdGF0aWMgdm9pZCB3bDEyNzFfcnhfc3RyZWFtaW5nX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3Qgd2wxMjcxICp3bCA9IChzdHJ1Y3Qgd2wxMjcxICopZGF0YTsKLQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+cnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gKHN0cnVjdCB3bDEyeHhfdmlmICopZGF0YTsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHdsdmlmLT53bDsKKwlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bHZpZi0+cnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTI3MV9jb25mX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpCkBAIC02NDUsOSArNjQxLDcgQEAKIAogc3RhdGljIGludCB3bDEyNzFfcGx0X2luaXQoc3RydWN0IHdsMTI3MSAqd2wpCiB7Ci0Jc3RydWN0IGNvbmZfdHhfYWNfY2F0ZWdvcnkgKmNvbmZfYWM7Ci0Jc3RydWN0IGNvbmZfdHhfdGlkICpjb25mX3RpZDsKLQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAlpZiAod2wtPmNoaXAuaWQgPT0gQ0hJUF9JRF8xMjgzX1BHMjApCiAJCXJldCA9IHdsMTI4eF9jbWRfZ2VuZXJhbF9wYXJtcyh3bCk7CkBAIC02NzYsNzQgKzY3MCwxNCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gd2wxMjcxX3N0YV9pbml0X3RlbXBsYXRlc19jb25maWcod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gd2wxMjcxX2FjeF9pbml0X21lbV9jb25maWcod2wpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogUEhZIGxheWVyIGNvbmZpZyAqLwotCXJldCA9IHdsMTI3MV9pbml0X3BoeV9jb25maWcod2wpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQotCXJldCA9IHdsMTI3MV9hY3hfZGNvX2l0cmltX3BhcmFtcyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JLyogSW5pdGlhbGl6ZSBjb25uZWN0aW9uIG1vbml0b3JpbmcgdGhyZXNob2xkcyAqLwotCXJldCA9IHdsMTI3MV9hY3hfY29ubl9tb25pdF9wYXJhbXMod2wsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KLQkvKiBCbHVldG9vdGggV0xBTiBjb2V4aXN0ZW5jZSAqLwotCXJldCA9IHdsMTI3MV9pbml0X3B0YSh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JLyogRk0gV0xBTiBjb2V4aXN0ZW5jZSAqLwotCXJldCA9IHdsMTI3MV9hY3hfZm1fY29leCh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JLyogRW5lcmd5IGRldGVjdGlvbiAqLwotCXJldCA9IHdsMTI3MV9pbml0X2VuZXJneV9kZXRlY3Rpb24od2wpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQogCXJldCA9IHdsMTJ4eF9hY3hfbWVtX2NmZyh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwogCi0JLyogRGVmYXVsdCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLwotCXJldCA9IHdsMTI3MV9hY3hfZnJhZ190aHJlc2hvbGQod2wsIHdsLT5jb25mLnR4LmZyYWdfdGhyZXNob2xkKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KLQkvKiBEZWZhdWx0IFRJRC9BQyBjb25maWd1cmF0aW9uICovCi0JQlVHX09OKHdsLT5jb25mLnR4LnRpZF9jb25mX2NvdW50ICE9IHdsLT5jb25mLnR4LmFjX2NvbmZfY291bnQpOwotCWZvciAoaSA9IDA7IGkgPCB3bC0+Y29uZi50eC50aWRfY29uZl9jb3VudDsgaSsrKSB7Ci0JCWNvbmZfYWMgPSAmd2wtPmNvbmYudHguYWNfY29uZltpXTsKLQkJcmV0ID0gd2wxMjcxX2FjeF9hY19jZmcod2wsIGNvbmZfYWMtPmFjLCBjb25mX2FjLT5jd19taW4sCi0JCQkJCWNvbmZfYWMtPmN3X21heCwgY29uZl9hYy0+YWlmc24sCi0JCQkJCWNvbmZfYWMtPnR4X29wX2xpbWl0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQotCQljb25mX3RpZCA9ICZ3bC0+Y29uZi50eC50aWRfY29uZltpXTsKLQkJcmV0ID0gd2wxMjcxX2FjeF90aWRfY2ZnKHdsLCBjb25mX3RpZC0+cXVldWVfaWQsCi0JCQkJCSBjb25mX3RpZC0+Y2hhbm5lbF90eXBlLAotCQkJCQkgY29uZl90aWQtPnRzaWQsCi0JCQkJCSBjb25mX3RpZC0+cHNfc2NoZW1lLAotCQkJCQkgY29uZl90aWQtPmFja19wb2xpY3ksCi0JCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzBdLAotCQkJCQkgY29uZl90aWQtPmFwc2RfY29uZlsxXSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0JfQotCiAJLyogRW5hYmxlIGRhdGEgcGF0aCAqLwogCXJldCA9IHdsMTI3MV9jbWRfZGF0YV9wYXRoKHdsLCAxKTsKIAlpZiAocmV0IDwgMCkKQEAgLTc2OCwxNCArNzAyLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMnh4X2lycV9wc19yZWd1bGF0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkLCB1OCB0eF9wa3RzKQorc3RhdGljIHZvaWQgd2wxMnh4X2lycV9wc19yZWd1bGF0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJCXU4IGhsaWQsIHU4IHR4X3BrdHMpCiB7CiAJYm9vbCBmd19wcywgc2luZ2xlX3N0YTsKIAotCS8qIG9ubHkgcmVndWxhdGUgc3RhdGlvbiBsaW5rcyAqLwotCWlmIChobGlkIDwgV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUKQotCQlyZXR1cm47Ci0KIAlmd19wcyA9IHRlc3RfYml0KGhsaWQsICh1bnNpZ25lZCBsb25nICopJndsLT5hcF9md19wc19tYXApOwogCXNpbmdsZV9zdGEgPSAod2wtPmFjdGl2ZV9zdGFfY291bnQgPT0gMSk7CiAKQEAgLTc4NCw3ICs3MTYsNyBAQAogCSAqIHBhY2tldHMgaW4gRlcgb3IgaWYgdGhlIFNUQSBpcyBhd2FrZS4KIAkgKi8KIAlpZiAoIWZ3X3BzIHx8IHR4X3BrdHMgPCBXTDEyNzFfUFNfU1RBX01BWF9QQUNLRVRTKQotCQl3bDEyNzFfcHNfbGlua19lbmQod2wsIGhsaWQpOworCQl3bDEyeHhfcHNfbGlua19lbmQod2wsIHdsdmlmLCBobGlkKTsKIAogCS8qCiAJICogU3RhcnQgaGlnaC1sZXZlbCBQUyBpZiB0aGUgU1RBIGlzIGFzbGVlcCB3aXRoIGVub3VnaCBibG9ja3MgaW4gRlcuCkBAIC03OTIsMjQgKzcyNCwxNCBAQAogCSAqIGNhc2UgRlctbWVtb3J5IGNvbmdlc3Rpb24gaXMgbm90IGEgcHJvYmxlbS4KIAkgKi8KIAllbHNlIGlmICghc2luZ2xlX3N0YSAmJiBmd19wcyAmJiB0eF9wa3RzID49IFdMMTI3MV9QU19TVEFfTUFYX1BBQ0tFVFMpCi0JCXdsMTI3MV9wc19saW5rX3N0YXJ0KHdsLCBobGlkLCB0cnVlKTsKLX0KLQotYm9vbCB3bDEyNzFfaXNfYWN0aXZlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCkKLXsKLQlpbnQgaWQ7Ci0KLQkvKiBnbG9iYWwvYnJvYWRjYXN0ICJzdGF0aW9ucyIgYXJlIGFsd2F5cyBhY3RpdmUgKi8KLQlpZiAoaGxpZCA8IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZCA9IGhsaWQgLSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQ7Ci0JcmV0dXJuIHRlc3RfYml0KGlkLCB3bC0+YXBfaGxpZF9tYXApOworCQl3bDEyeHhfcHNfbGlua19zdGFydCh3bCwgd2x2aWYsIGhsaWQsIHRydWUpOwogfQogCiBzdGF0aWMgdm9pZCB3bDEyeHhfaXJxX3VwZGF0ZV9saW5rc19zdGF0dXMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkJICAgc3RydWN0IHdsMTJ4eF9md19zdGF0dXMgKnN0YXR1cykKIHsKKwlzdHJ1Y3Qgd2wxMjcxX2xpbmsgKmxuazsKIAl1MzIgY3VyX2Z3X3BzX21hcDsKIAl1OCBobGlkLCBjbnQ7CiAKQEAgLTgyNSwyNSArNzQ3LDIyIEBACiAJCXdsLT5hcF9md19wc19tYXAgPSBjdXJfZndfcHNfbWFwOwogCX0KIAotCWZvciAoaGxpZCA9IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVDsgaGxpZCA8IEFQX01BWF9MSU5LUzsgaGxpZCsrKSB7Ci0JCWlmICghd2wxMjcxX2lzX2FjdGl2ZV9zdGEod2wsIGhsaWQpKQotCQkJY29udGludWU7CisJZm9yX2VhY2hfc2V0X2JpdChobGlkLCB3bHZpZi0+YXAuc3RhX2hsaWRfbWFwLCBXTDEyWFhfTUFYX0xJTktTKSB7CisJCWxuayA9ICZ3bC0+bGlua3NbaGxpZF07CisJCWNudCA9IHN0YXR1cy0+dHhfbG5rX2ZyZWVfcGt0c1tobGlkXSAtIGxuay0+cHJldl9mcmVlZF9wa3RzOwogCi0JCWNudCA9IHN0YXR1cy0+dHhfbG5rX2ZyZWVfcGt0c1tobGlkXSAtCi0JCSAgICAgIHdsLT5saW5rc1tobGlkXS5wcmV2X2ZyZWVkX3BrdHM7CisJCWxuay0+cHJldl9mcmVlZF9wa3RzID0gc3RhdHVzLT50eF9sbmtfZnJlZV9wa3RzW2hsaWRdOworCQlsbmstPmFsbG9jYXRlZF9wa3RzIC09IGNudDsKIAotCQl3bC0+bGlua3NbaGxpZF0ucHJldl9mcmVlZF9wa3RzID0KLQkJCXN0YXR1cy0+dHhfbG5rX2ZyZWVfcGt0c1tobGlkXTsKLQkJd2wtPmxpbmtzW2hsaWRdLmFsbG9jYXRlZF9wa3RzIC09IGNudDsKLQotCQl3bDEyeHhfaXJxX3BzX3JlZ3VsYXRlX2xpbmsod2wsIGhsaWQsCi0JCQkJCSAgICB3bC0+bGlua3NbaGxpZF0uYWxsb2NhdGVkX3BrdHMpOworCQl3bDEyeHhfaXJxX3BzX3JlZ3VsYXRlX2xpbmsod2wsIHdsdmlmLCBobGlkLAorCQkJCQkgICAgbG5rLT5hbGxvY2F0ZWRfcGt0cyk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCB3bDEyeHhfZndfc3RhdHVzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJICAgICBzdHJ1Y3Qgd2wxMnh4X2Z3X3N0YXR1cyAqc3RhdHVzKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAJdTMyIG9sZF90eF9ibGtfY291bnQgPSB3bC0+dHhfYmxvY2tzX2F2YWlsYWJsZTsKIAlpbnQgYXZhaWwsIGZyZWVkX2Jsb2NrczsKQEAgLTg5OCw4ICs4MTcsOSBAQAogCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfRldfVFhfQlVTWSwgJndsLT5mbGFncyk7CiAKIAkvKiBmb3IgQVAgdXBkYXRlIG51bSBvZiBhbGxvY2F0ZWQgVFggYmxvY2tzIHBlciBsaW5rIGFuZCBwcyBzdGF0dXMgKi8KLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKLQkJd2wxMnh4X2lycV91cGRhdGVfbGlua3Nfc3RhdHVzKHdsLCBzdGF0dXMpOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9hcCh3bCwgd2x2aWYpIHsKKwkJd2wxMnh4X2lycV91cGRhdGVfbGlua3Nfc3RhdHVzKHdsLCB3bHZpZiwgc3RhdHVzKTsKKwl9CiAKIAkvKiB1cGRhdGUgdGhlIGhvc3QtY2hpcHNldCB0aW1lIG9mZnNldCAqLwogCWdldG5zdGltZW9mZGF5KCZ0cyk7CkBAIC05MzIsNyArODUyLDcgQEAKIAogI2RlZmluZSBXTDEyNzFfSVJRX01BWF9MT09QUyAyNTYKIAotaXJxcmV0dXJuX3Qgd2wxMjcxX2lycShpbnQgaXJxLCB2b2lkICpjb29raWUpCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2wxMjcxX2lycShpbnQgaXJxLCB2b2lkICpjb29raWUpCiB7CiAJaW50IHJldDsKIAl1MzIgaW50cjsKQEAgLTEwNTQsNyArOTc0LDYgQEAKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHdsMTI3MV9pcnEpOwogCiBzdGF0aWMgaW50IHdsMTI3MV9mZXRjaF9maXJtd2FyZShzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKQEAgLTEwNjksMTAgKzk4OCwxMCBAQAogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0JPT1QsICJib290aW5nIGZpcm13YXJlICVzIiwgZndfbmFtZSk7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgd2wxMjcxX3dsX3RvX2Rldih3bCkpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCB3bC0+ZGV2KTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBmaXJtd2FyZTogJWQiLCByZXQpOworCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgZmlybXdhcmUgJXM6ICVkIiwgZndfbmFtZSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTExMDcsMTAgKzEwMjYsMTEgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxMlhYX05WU19OQU1FLCB3bDEyNzFfd2xfdG9fZGV2KHdsKSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIFdMMTJYWF9OVlNfTkFNRSwgd2wtPmRldik7CiAKIAlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgbnZzIGZpbGU6ICVkIiwgcmV0KTsKKwkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgZ2V0IG52cyBmaWxlICVzOiAlZCIsIFdMMTJYWF9OVlNfTkFNRSwKKwkJCSAgICAgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEyMTcsMTEgKzExMzcsMTMgQEAKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2wxMjcxLCByZWNvdmVyeV93b3JrKTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKIAlpZiAod2wtPnN0YXRlICE9IFdMMTI3MV9TVEFURV9PTikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCS8qIEF2b2lkIGEgcmVjdXJzaXZlIHJlY292ZXJ5ICovCiAJc2V0X2JpdChXTDEyNzFfRkxBR19SRUNPVkVSWV9JTl9QUk9HUkVTUywgJndsLT5mbGFncyk7CkBAIC0xMjM4LDkgKzExNjAsMTIgQEAKIAkgKiBpbiB0aGUgZmlybXdhcmUgZHVyaW5nIHJlY292ZXJ5LiBUaGlzIGRvZW5zJ3QgaHVydCBpZiB0aGUgbmV0d29yayBpcwogCSAqIG5vdCBlbmNyeXB0ZWQuCiAJICovCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChXTDEyNzFfRkxBR19BUF9TVEFSVEVELCAmd2wtPmZsYWdzKSkKLQkJd2wtPnR4X3NlY3VyaXR5X3NlcSArPSBXTDEyNzFfVFhfU1FOX1BPU1RfUkVDT1ZFUllfUEFERElORzsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSB8fAorCQkgICAgdGVzdF9iaXQoV0xWSUZfRkxBR19BUF9TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkKKwkJCXdsdmlmLT50eF9zZWN1cml0eV9zZXEgKz0KKwkJCQlXTDEyNzFfVFhfU1FOX1BPU1RfUkVDT1ZFUllfUEFERElORzsKKwl9CiAKIAkvKiBQcmV2ZW50IHNwdXJpb3VzIFRYIGR1cmluZyBGVyByZXN0YXJ0ICovCiAJaWVlZTgwMjExX3N0b3BfcXVldWVzKHdsLT5odyk7CkBAIC0xMjUxLDcgKzExNzYsMTQgQEAKIAl9CiAKIAkvKiByZWJvb3QgdGhlIGNoaXBzZXQgKi8KLQlfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHdsLCBmYWxzZSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ3bC0+d2x2aWZfbGlzdCkpIHsKKwkJd2x2aWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ3bC0+d2x2aWZfbGlzdCwKKwkJCQkgICAgICAgc3RydWN0IHdsMTJ4eF92aWYsIGxpc3QpOworCQl2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZSh3bCwgdmlmLCBmYWxzZSk7CisJfQorCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKwl3bDEyNzFfb3Bfc3RvcCh3bC0+aHcpOwogCiAJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1JFQ09WRVJZX0lOX1BST0dSRVNTLCAmd2wtPmZsYWdzKTsKIApAQCAtMTI2Miw4ICsxMTk0LDggQEAKIAkgKiB0byByZXN0YXJ0IHRoZSBIVy4KIAkgKi8KIAlpZWVlODAyMTFfd2FrZV9xdWV1ZXMod2wtPmh3KTsKLQotb3V0OgorCXJldHVybjsKK291dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogfQogCkBAIC0xMzE4LDcgKzEyNTAsMTYgQEAKIAkvKiAwLiByZWFkIGNoaXAgaWQgZnJvbSBDSElQX0lEICovCiAJd2wtPmNoaXAuaWQgPSB3bDEyNzFfcmVhZDMyKHdsLCBDSElQX0lEX0IpOwogCi0JLyogMS4gY2hlY2sgaWYgY2hpcCBpZCBpcyB2YWxpZCAqLworCS8qCisJICogRm9yIHdsMTI3eCBiYXNlZCBkZXZpY2VzIHdlIGNvdWxkIHVzZSB0aGUgZGVmYXVsdCBibG9jaworCSAqIHNpemUgKDUxMiBieXRlcyksIGJ1dCBkdWUgdG8gYSBidWcgaW4gdGhlIHNkaW8gZHJpdmVyLCB3ZQorCSAqIG5lZWQgdG8gc2V0IGl0IGV4cGxpY2l0bHkgYWZ0ZXIgdGhlIGNoaXAgaXMgcG93ZXJlZCBvbi4gIFRvCisJICogc2ltcGxpZnkgdGhlIGNvZGUgYW5kIHNpbmNlIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3QgaXMKKwkgKiBuZWdsaWdpYmxlLCB3ZSB1c2UgdGhlIHNhbWUgYmxvY2sgc2l6ZSBmb3IgYWxsIGRpZmZlcmVudAorCSAqIGNoaXAgdHlwZXMuCisJICovCisJaWYgKCF3bDEyNzFfc2V0X2Jsb2NrX3NpemUod2wpKQorCQl3bC0+cXVpcmtzIHw9IFdMMTJYWF9RVUlSS19OT19CTE9DS1NJWkVfQUxJR05NRU5UOwogCiAJc3dpdGNoICh3bC0+Y2hpcC5pZCkgewogCWNhc2UgQ0hJUF9JRF8xMjcxX1BHMTA6CkBAIC0xMzI4LDcgKzEyNjksOSBAQAogCQlyZXQgPSB3bDEyNzFfc2V0dXAod2wpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OworCQl3bC0+cXVpcmtzIHw9IFdMMTJYWF9RVUlSS19OT19CTE9DS1NJWkVfQUxJR05NRU5UOwogCQlicmVhazsKKwogCWNhc2UgQ0hJUF9JRF8xMjcxX1BHMjA6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19CT09ULCAiY2hpcCBpZCAweCV4ICgxMjcxIFBHMjApIiwKIAkJCSAgICAgd2wtPmNoaXAuaWQpOwpAQCAtMTMzNiw3ICsxMjc5LDkgQEAKIAkJcmV0ID0gd2wxMjcxX3NldHVwKHdsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKKwkJd2wtPnF1aXJrcyB8PSBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVDsKIAkJYnJlYWs7CisKIAljYXNlIENISVBfSURfMTI4M19QRzIwOgogCQl3bDEyNzFfZGVidWcoREVCVUdfQk9PVCwgImNoaXAgaWQgMHgleCAoMTI4MyBQRzIwKSIsCiAJCQkgICAgIHdsLT5jaGlwLmlkKTsKQEAgLTEzNDQsOSArMTI4OSw2IEBACiAJCXJldCA9IHdsMTI3MV9zZXR1cCh3bCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0KLQkJaWYgKHdsMTI3MV9zZXRfYmxvY2tfc2l6ZSh3bCkpCi0JCQl3bC0+cXVpcmtzIHw9IFdMMTJYWF9RVUlSS19CTE9DS1NJWkVfQUxJR05NRU5UOwogCQlicmVhazsKIAljYXNlIENISVBfSURfMTI4M19QRzEwOgogCWRlZmF1bHQ6CkBAIC0xMzg5LDggKzEzMzEsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl3bC0+YnNzX3R5cGUgPSBCU1NfVFlQRV9TVEFfQlNTOwotCiAJd2hpbGUgKHJldHJpZXMpIHsKIAkJcmV0cmllcy0tOwogCQlyZXQgPSB3bDEyNzFfY2hpcF93YWtldXAod2wpOwpAQCAtMTQ4MiwzMyArMTQyMiwzNCBAQAogc3RhdGljIHZvaWQgd2wxMjcxX29wX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBpbmZvLT5jb250cm9sLnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHEsIG1hcHBpbmc7Ci0JdTggaGxpZCA9IDA7CisJdTggaGxpZDsKKworCWlmICh2aWYpCisJCXdsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAKIAltYXBwaW5nID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CiAJcSA9IHdsMTI3MV90eF9nZXRfcXVldWUobWFwcGluZyk7CiAKLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKLQkJaGxpZCA9IHdsMTJ4eF90eF9nZXRfaGxpZF9hcCh3bCwgc2tiKTsKKwlobGlkID0gd2wxMnh4X3R4X2dldF9obGlkKHdsLCB3bHZpZiwgc2tiKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwogCiAJLyogcXVldWUgdGhlIHBhY2tldCAqLwotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7Ci0JCWlmICghd2wxMjcxX2lzX2FjdGl2ZV9zdGEod2wsIGhsaWQpKSB7Ci0JCQl3bDEyNzFfZGVidWcoREVCVUdfVFgsICJEUk9QIHNrYiBobGlkICVkIHEgJWQiLAotCQkJCSAgICAgaGxpZCwgcSk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgInF1ZXVlIHNrYiBobGlkICVkIHEgJWQiLCBobGlkLCBxKTsKLQkJc2tiX3F1ZXVlX3RhaWwoJndsLT5saW5rc1tobGlkXS50eF9xdWV1ZVtxXSwgc2tiKTsKLQl9IGVsc2UgewotCQlza2JfcXVldWVfdGFpbCgmd2wtPnR4X3F1ZXVlW3FdLCBza2IpOworCWlmIChobGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQgfHwKKwkgICAgKHdsdmlmICYmICF0ZXN0X2JpdChobGlkLCB3bHZpZi0+bGlua3NfbWFwKSkpIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAiRFJPUCBza2IgaGxpZCAlZCBxICVkIiwgaGxpZCwgcSk7CisJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGh3LCBza2IpOworCQlnb3RvIG91dDsKIAl9CiAKKwl3bDEyNzFfZGVidWcoREVCVUdfVFgsICJxdWV1ZSBza2IgaGxpZCAlZCBxICVkIiwgaGxpZCwgcSk7CisJc2tiX3F1ZXVlX3RhaWwoJndsLT5saW5rc1tobGlkXS50eF9xdWV1ZVtxXSwgc2tiKTsKKwogCXdsLT50eF9xdWV1ZV9jb3VudFtxXSsrOwogCiAJLyoKQEAgLTE2MDksMTMgKzE1NTAsMTQgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAotCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKQEAgLTE2MjMsMTIgKzE1NjUsMTIgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJLyogZW50ZXIgcHNtIGlmIG5lZWRlZCovCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpKSB7CisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpIHsKIAkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGwpOwogCi0JCXdsLT5wc19jb21wbCA9ICZjb21wbDsKLQkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwKLQkJCQkgICB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJCXdsdmlmLT5wc19jb21wbCA9ICZjb21wbDsKKwkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCisJCQkJICAgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0X3NsZWVwOwogCkBAIC0xNjM4LDQyICsxNTgwLDQzIEBACiAKIAkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAogCQkJJmNvbXBsLCBtc2Vjc190b19qaWZmaWVzKFdMMTI3MV9QU19DT01QTEVURV9USU1FT1VUKSk7CisKKwkJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAkJaWYgKHJldCA8PSAwKSB7CiAJCQl3bDEyNzFfd2FybmluZygiY291bGRuJ3QgZW50ZXIgcHMgbW9kZSEiKTsKIAkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfY2xlYW51cDsKIAkJfQogCi0JCS8qIHRha2UgbXV0ZXggYWdhaW4sIGFuZCB3YWtldXAgKi8KLQkJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQogCQlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXRfdW5sb2NrOworCQkJZ290byBvdXRfY2xlYW51cDsKIAl9CiBvdXRfc2xlZXA6CiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CitvdXRfY2xlYW51cDoKKwl3bHZpZi0+cHNfY29tcGwgPSBOVUxMOwogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7Ci1vdXQ6CiAJcmV0dXJuIHJldDsKIAogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX2FwKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19BUF9TVEFSVEVELCAmd2wtPmZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfQVBfU1RBUlRFRCwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgdHJ1ZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgd2x2aWYsIHRydWUpOwogCiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiBvdXRfdW5sb2NrOgpAQCAtMTY4MiwyMCArMTYyNSwyMiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmQoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpCi0JCXJldHVybiB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfc3RhKHdsKTsKLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKLQkJcmV0dXJuIHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZF9hcCh3bCk7CisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQorCQlyZXR1cm4gd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX3N0YSh3bCwgd2x2aWYpOworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQorCQlyZXR1cm4gd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX2FwKHdsLCB3bHZpZik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9jb25maWd1cmVfcmVzdW1lKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMjcxX2NvbmZpZ3VyZV9yZXN1bWUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0OwotCWJvb2wgaXNfc3RhID0gd2wtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1M7Ci0JYm9vbCBpc19hcCA9IHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1M7CisJYm9vbCBpc19zdGEgPSB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUzsKKwlib29sIGlzX2FwID0gd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUzsKIAogCWlmICghaXNfc3RhICYmICFpc19hcCkKIAkJcmV0dXJuOwpAQCAtMTcwNywxMSArMTY1MiwxMSBAQAogCiAJaWYgKGlzX3N0YSkgewogCQkvKiBleGl0IHBzbSBpZiBpdCB3YXNuJ3QgY29uZmlndXJlZCAqLwotCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpKQotCQkJd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX0FDVElWRV9NT0RFLAotCQkJCQkgICB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19QU01fUkVRVUVTVEVELCAmd2x2aWYtPmZsYWdzKSkKKwkJCXdsMTI3MV9wc19zZXRfbW9kZSh3bCwgd2x2aWYsIFNUQVRJT05fQUNUSVZFX01PREUsCisJCQkJCSAgIHdsdmlmLT5iYXNpY19yYXRlLCB0cnVlKTsKIAl9IGVsc2UgaWYgKGlzX2FwKSB7Ci0JCXdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQod2wsIGZhbHNlKTsKKwkJd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgd2x2aWYsIGZhbHNlKTsKIAl9CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKQEAgLTE3MjMsMTYgKzE2NjgsMTkgQEAKIAkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHN1c3BlbmQgd293PSVkIiwgISF3b3cpOwogCVdBUk5fT04oIXdvdyB8fCAhd293LT5hbnkpOwogCiAJd2wtPndvd19lbmFibGVkID0gdHJ1ZTsKLQlyZXQgPSB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmQod2wpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV93YXJuaW5nKCJjb3VsZG4ndCBwcmVwYXJlIGRldmljZSB0byBzdXNwZW5kIik7Ci0JCXJldHVybiByZXQ7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlyZXQgPSB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmQod2wsIHdsdmlmKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXdsMTI3MV93YXJuaW5nKCJjb3VsZG4ndCBwcmVwYXJlIGRldmljZSB0byBzdXNwZW5kIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCS8qIGZsdXNoIGFueSByZW1haW5pbmcgd29yayAqLwogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgImZsdXNoaW5nIHJlbWFpbmluZyB3b3JrcyIpOwpAQCAtMTc1MSw3ICsxNjk5LDkgQEAKIAogCXdsMTI3MV9lbmFibGVfaW50ZXJydXB0cyh3bCk7CiAJZmx1c2hfd29yaygmd2wtPnR4X3dvcmspOwotCWZsdXNoX2RlbGF5ZWRfd29yaygmd2wtPnBzcG9sbF93b3JrKTsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCWZsdXNoX2RlbGF5ZWRfd29yaygmd2x2aWYtPnBzcG9sbF93b3JrKTsKKwl9CiAJZmx1c2hfZGVsYXllZF93b3JrKCZ3bC0+ZWxwX3dvcmspOwogCiAJcmV0dXJuIDA7CkBAIC0xNzYwLDYgKzE3MTAsNyBAQAogc3RhdGljIGludCB3bDEyNzFfb3BfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBydW5faXJxX3dvcmsgPSBmYWxzZTsKIApAQCAtMTc4Myw3ICsxNzM0LDkgQEAKIAkJd2wxMjcxX2lycSgwLCB3bCk7CiAJCXdsMTI3MV9lbmFibGVfaW50ZXJydXB0cyh3bCk7CiAJfQotCXdsMTI3MV9jb25maWd1cmVfcmVzdW1lKHdsKTsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCXdsMTI3MV9jb25maWd1cmVfcmVzdW1lKHdsLCB3bHZpZik7CisJfQogCXdsLT53b3dfZW5hYmxlZCA9IGZhbHNlOwogCiAJcmV0dXJuIDA7CkBAIC0xODEwLDIwICsxNzYzLDExOSBAQAogCiBzdGF0aWMgdm9pZCB3bDEyNzFfb3Bfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCWludCBpOworCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgc3RvcCIpOworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCS8qCisJICogdGhpcyBtdXN0IGJlIGJlZm9yZSB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYmVsb3csIHNvIHRoYXQgdGhlIHdvcmsKKwkgKiBmdW5jdGlvbnMgZG9uJ3QgcGVyZm9ybSBmdXJ0aGVyIHdvcmsuCisJICovCisJd2wtPnN0YXRlID0gV0wxMjcxX1NUQVRFX09GRjsKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisKKwltdXRleF9sb2NrKCZ3bF9saXN0X211dGV4KTsKKwlsaXN0X2RlbCgmd2wtPmxpc3QpOworCW11dGV4X3VubG9jaygmd2xfbGlzdF9tdXRleCk7CisKKwl3bDEyNzFfZGlzYWJsZV9pbnRlcnJ1cHRzKHdsKTsKKwl3bDEyNzFfZmx1c2hfZGVmZXJyZWRfd29yayh3bCk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+c2Nhbl9jb21wbGV0ZV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3bC0+bmV0c3RhY2tfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmd2wtPnR4X3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd2wtPmVscF93b3JrKTsKKworCS8qIGxldCdzIG5vdGlmeSBNQUM4MDIxMSBhYm91dCB0aGUgcmVtYWluaW5nIHBlbmRpbmcgVFggZnJhbWVzICovCisJd2wxMnh4X3R4X3Jlc2V0KHdsLCB0cnVlKTsKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJd2wxMjcxX3Bvd2VyX29mZih3bCk7CisKKwl3bC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisKKwl3bC0+cnhfY291bnRlciA9IDA7CisJd2wtPnBvd2VyX2xldmVsID0gV0wxMjcxX0RFRkFVTFRfUE9XRVJfTEVWRUw7CisJd2wtPnR4X2Jsb2Nrc19hdmFpbGFibGUgPSAwOworCXdsLT50eF9hbGxvY2F0ZWRfYmxvY2tzID0gMDsKKwl3bC0+dHhfcmVzdWx0c19jb3VudCA9IDA7CisJd2wtPnR4X3BhY2tldHNfY291bnQgPSAwOworCXdsLT50aW1lX29mZnNldCA9IDA7CisJd2wtPnR4X3NwYXJlX2Jsb2NrcyA9IFRYX0hXX0JMT0NLX1NQQVJFX0RFRkFVTFQ7CisJd2wtPmFwX2Z3X3BzX21hcCA9IDA7CisJd2wtPmFwX3BzX21hcCA9IDA7CisJd2wtPnNjaGVkX3NjYW5uaW5nID0gZmFsc2U7CisJbWVtc2V0KHdsLT5yb2xlc19tYXAsIDAsIHNpemVvZih3bC0+cm9sZXNfbWFwKSk7CisJbWVtc2V0KHdsLT5saW5rc19tYXAsIDAsIHNpemVvZih3bC0+bGlua3NfbWFwKSk7CisJbWVtc2V0KHdsLT5yb2NfbWFwLCAwLCBzaXplb2Yod2wtPnJvY19tYXApKTsKKwl3bC0+YWN0aXZlX3N0YV9jb3VudCA9IDA7CisKKwkvKiBUaGUgc3lzdGVtIGxpbmsgaXMgYWx3YXlzIGFsbG9jYXRlZCAqLworCV9fc2V0X2JpdChXTDEyWFhfU1lTVEVNX0hMSUQsIHdsLT5saW5rc19tYXApOworCisJLyoKKwkgKiB0aGlzIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYW5kIHRoZSBhc3NvY2lhdGVkCisJICogbXV0ZXhfbG9jaywgc28gdGhhdCB3bDEyNzFfb3BfYWRkX2ludGVyZmFjZSBkb2VzIG5vdCBhY2NpZGVudGFsbHkKKwkgKiBnZXQgZXhlY3V0ZWQgYmVmb3JlIGFsbCB0aGVzZSB2YXJzIGhhdmUgYmVlbiByZXNldC4KKwkgKi8KKwl3bC0+ZmxhZ3MgPSAwOworCisJd2wtPnR4X2Jsb2Nrc19mcmVlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKSB7CisJCXdsLT50eF9wa3RzX2ZyZWVkW2ldID0gMDsKKwkJd2wtPnR4X2FsbG9jYXRlZF9wa3RzW2ldID0gMDsKKwl9CisKKwl3bDEyNzFfZGVidWdmc19yZXNldCh3bCk7CisKKwlrZnJlZSh3bC0+Zndfc3RhdHVzKTsKKwl3bC0+Zndfc3RhdHVzID0gTlVMTDsKKwlrZnJlZSh3bC0+dHhfcmVzX2lmKTsKKwl3bC0+dHhfcmVzX2lmID0gTlVMTDsKKwlrZnJlZSh3bC0+dGFyZ2V0X21lbV9tYXApOworCXdsLT50YXJnZXRfbWVtX21hcCA9IE5VTEw7CisKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9CiAKLXN0YXRpYyB1OCB3bDEyeHhfZ2V0X3JvbGVfdHlwZShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMnh4X2FsbG9jYXRlX3JhdGVfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqaWR4KQogewotCXN3aXRjaCAod2wtPmJzc190eXBlKSB7CisJdTggcG9saWN5ID0gZmluZF9maXJzdF96ZXJvX2JpdCh3bC0+cmF0ZV9wb2xpY2llc19tYXAsCisJCQkJCVdMMTJYWF9NQVhfUkFURV9QT0xJQ0lFUyk7CisJaWYgKHBvbGljeSA+PSBXTDEyWFhfTUFYX1JBVEVfUE9MSUNJRVMpCisJCXJldHVybiAtRUJVU1k7CisKKwlfX3NldF9iaXQocG9saWN5LCB3bC0+cmF0ZV9wb2xpY2llc19tYXApOworCSppZHggPSBwb2xpY3k7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMTJ4eF9mcmVlX3JhdGVfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqaWR4KQoreworCWlmIChXQVJOX09OKCppZHggPj0gV0wxMlhYX01BWF9SQVRFX1BPTElDSUVTKSkKKwkJcmV0dXJuOworCisJX19jbGVhcl9iaXQoKmlkeCwgd2wtPnJhdGVfcG9saWNpZXNfbWFwKTsKKwkqaWR4ID0gV0wxMlhYX01BWF9SQVRFX1BPTElDSUVTOworfQorCitzdGF0aWMgdTggd2wxMnh4X2dldF9yb2xlX3R5cGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlzd2l0Y2ggKHdsdmlmLT5ic3NfdHlwZSkgewogCWNhc2UgQlNTX1RZUEVfQVBfQlNTOgotCQlpZiAod2wtPnAycCkKKwkJaWYgKHdsdmlmLT5wMnApCiAJCQlyZXR1cm4gV0wxMjcxX1JPTEVfUDJQX0dPOwogCQllbHNlCiAJCQlyZXR1cm4gV0wxMjcxX1JPTEVfQVA7CiAKIAljYXNlIEJTU19UWVBFX1NUQV9CU1M6Ci0JCWlmICh3bC0+cDJwKQorCQlpZiAod2x2aWYtPnAycCkKIAkJCXJldHVybiBXTDEyNzFfUk9MRV9QMlBfQ0w7CiAJCWVsc2UKIAkJCXJldHVybiBXTDEyNzFfUk9MRV9TVEE7CkBAIC0xODMyLDc5ICsxODg0LDk2IEBACiAJCXJldHVybiBXTDEyNzFfUk9MRV9JQlNTOwogCiAJZGVmYXVsdDoKLQkJd2wxMjcxX2Vycm9yKCJpbnZhbGlkIGJzc190eXBlOiAlZCIsIHdsLT5ic3NfdHlwZSk7CisJCXdsMTI3MV9lcnJvcigiaW52YWxpZCBic3NfdHlwZTogJWQiLCB3bHZpZi0+YnNzX3R5cGUpOwogCX0KIAlyZXR1cm4gV0wxMlhYX0lOVkFMSURfUk9MRV9UWVBFOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9vcF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X3ZpZl9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKLQlpbnQgcmV0cmllcyA9IFdMMTI3MV9CT09UX1JFVFJJRVM7Ci0JaW50IHJldCA9IDA7Ci0JdTggcm9sZV90eXBlOwotCWJvb2wgYm9vdGVkID0gZmFsc2U7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJaW50IGk7CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBhZGQgaW50ZXJmYWNlIHR5cGUgJWQgbWFjICVwTSIsCi0JCSAgICAgaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpLCB2aWYtPmFkZHIpOwotCi0JbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQlpZiAod2wtPnZpZikgewotCQl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsCi0JCQkgICAgICJtdWx0aXBsZSB2aWZzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogaW4gc29tZSB2ZXJ5IGNvcm5lciBjYXNlIEhXIHJlY292ZXJ5IHNjZW5hcmlvcyBpdHMgcG9zc2libGUgdG8KLQkgKiBnZXQgaGVyZSBiZWZvcmUgX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZSBpcyBjb21wbGV0ZSwgc28KLQkgKiBvcHQgb3V0IGlmIHRoYXQgaXMgdGhlIGNhc2UuCi0JICovCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX0lGX0lOSVRJQUxJWkVELCAmd2wtPmZsYWdzKSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KKwkvKiBjbGVhciBldmVyeXRoaW5nIGJ1dCB0aGUgcGVyc2lzdGVudCBkYXRhICovCisJbWVtc2V0KHdsdmlmLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgd2wxMnh4X3ZpZiwgcGVyc2lzdGVudCkpOwogCiAJc3dpdGNoIChpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZikpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JCXdsLT5wMnAgPSAxOworCQl3bHZpZi0+cDJwID0gMTsKIAkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQl3bC0+YnNzX3R5cGUgPSBCU1NfVFlQRV9TVEFfQlNTOwotCQl3bC0+c2V0X2Jzc190eXBlID0gQlNTX1RZUEVfU1RBX0JTUzsKKwkJd2x2aWYtPmJzc190eXBlID0gQlNTX1RZUEVfU1RBX0JTUzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJd2wtPmJzc190eXBlID0gQlNTX1RZUEVfSUJTUzsKLQkJd2wtPnNldF9ic3NfdHlwZSA9IEJTU19UWVBFX1NUQV9CU1M7CisJCXdsdmlmLT5ic3NfdHlwZSA9IEJTU19UWVBFX0lCU1M7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCQl3bC0+cDJwID0gMTsKKwkJd2x2aWYtPnAycCA9IDE7CiAJCS8qIGZhbGwtdGhyb3VnaCAqLwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCXdsLT5ic3NfdHlwZSA9IEJTU19UWVBFX0FQX0JTUzsKKwkJd2x2aWYtPmJzc190eXBlID0gQlNTX1RZUEVfQVBfQlNTOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7CisJCXdsdmlmLT5ic3NfdHlwZSA9IE1BWF9CU1NfVFlQRTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXJvbGVfdHlwZSA9IHdsMTJ4eF9nZXRfcm9sZV90eXBlKHdsKTsKLQlpZiAocm9sZV90eXBlID09IFdMMTJYWF9JTlZBTElEX1JPTEVfVFlQRSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JbWVtY3B5KHdsLT5tYWNfYWRkciwgdmlmLT5hZGRyLCBFVEhfQUxFTik7CisJd2x2aWYtPnJvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOworCXdsdmlmLT5kZXZfcm9sZV9pZCA9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQ7CisJd2x2aWYtPmRldl9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKIAotCWlmICh3bC0+c3RhdGUgIT0gV0wxMjcxX1NUQVRFX09GRikgewotCQl3bDEyNzFfZXJyb3IoImNhbm5vdCBzdGFydCBiZWNhdXNlIG5vdCBpbiBvZmYgc3RhdGU6ICVkIiwKLQkJCSAgICAgd2wtPnN0YXRlKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKKwkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKKwkJLyogaW5pdCBzdGEvaWJzcyBkYXRhICovCisJCXdsdmlmLT5zdGEuaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CisJCXdsMTJ4eF9hbGxvY2F0ZV9yYXRlX3BvbGljeSh3bCwgJndsdmlmLT5zdGEuYmFzaWNfcmF0ZV9pZHgpOworCQl3bDEyeHhfYWxsb2NhdGVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLmFwX3JhdGVfaWR4KTsKKwkJd2wxMnh4X2FsbG9jYXRlX3JhdGVfcG9saWN5KHdsLCAmd2x2aWYtPnN0YS5wMnBfcmF0ZV9pZHgpOworCX0gZWxzZSB7CisJCS8qIGluaXQgYXAgZGF0YSAqLworCQl3bHZpZi0+YXAuYmNhc3RfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CisJCXdsdmlmLT5hcC5nbG9iYWxfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CisJCXdsMTJ4eF9hbGxvY2F0ZV9yYXRlX3BvbGljeSh3bCwgJndsdmlmLT5hcC5tZ210X3JhdGVfaWR4KTsKKwkJd2wxMnh4X2FsbG9jYXRlX3JhdGVfcG9saWN5KHdsLCAmd2x2aWYtPmFwLmJjYXN0X3JhdGVfaWR4KTsKKwkJZm9yIChpID0gMDsgaSA8IENPTkZfVFhfTUFYX0FDX0NPVU5UOyBpKyspCisJCQl3bDEyeHhfYWxsb2NhdGVfcmF0ZV9wb2xpY3kod2wsCisJCQkJCQkmd2x2aWYtPmFwLnVjYXN0X3JhdGVfaWR4W2ldKTsKIAl9CiAKKwl3bHZpZi0+Yml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfQkFORF8yR0haXSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGU7CisJd2x2aWYtPmJpdHJhdGVfbWFza3NbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSB3bC0+Y29uZi50eC5iYXNpY19yYXRlXzU7CisJd2x2aWYtPmJhc2ljX3JhdGVfc2V0ID0gQ09ORl9UWF9SQVRFX01BU0tfQkFTSUM7CisJd2x2aWYtPmJhc2ljX3JhdGUgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKKwl3bHZpZi0+cmF0ZV9zZXQgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKKwl3bHZpZi0+YmVhY29uX2ludCA9IFdMMTI3MV9ERUZBVUxUX0JFQUNPTl9JTlQ7CisKKwkvKgorCSAqIG1hYzgwMjExIGNvbmZpZ3VyZXMgc29tZSB2YWx1ZXMgZ2xvYmFsbHksIHdoaWxlIHdlIHRyZWF0IHRoZW0KKwkgKiBwZXItaW50ZXJmYWNlLiB0aHVzLCBvbiBpbml0LCB3ZSBoYXZlIHRvIGNvcHkgdGhlbSBmcm9tIHdsCisJICovCisJd2x2aWYtPmJhbmQgPSB3bC0+YmFuZDsKKwl3bHZpZi0+Y2hhbm5lbCA9IHdsLT5jaGFubmVsOworCXdsdmlmLT5wb3dlcl9sZXZlbCA9IHdsLT5wb3dlcl9sZXZlbDsKKworCUlOSVRfV09SSygmd2x2aWYtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yaywKKwkJICB3bDEyNzFfcnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKKwlJTklUX1dPUksoJndsdmlmLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrLAorCQkgIHdsMTI3MV9yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmd2x2aWYtPnBzcG9sbF93b3JrLCB3bDEyNzFfcHNwb2xsX3dvcmspOworCUlOSVRfTElTVF9IRUFEKCZ3bHZpZi0+bGlzdCk7CisKKwlzZXR1cF90aW1lcigmd2x2aWYtPnJ4X3N0cmVhbWluZ190aW1lciwgd2wxMjcxX3J4X3N0cmVhbWluZ190aW1lciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB3bHZpZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIHdsMTJ4eF9pbml0X2Z3KHN0cnVjdCB3bDEyNzEgKndsKQoreworCWludCByZXRyaWVzID0gV0wxMjcxX0JPT1RfUkVUUklFUzsKKwlib29sIGJvb3RlZCA9IGZhbHNlOworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bC0+aHctPndpcGh5OworCWludCByZXQ7CisKIAl3aGlsZSAocmV0cmllcykgewogCQlyZXRyaWVzLS07CiAJCXJldCA9IHdsMTI3MV9jaGlwX3dha2V1cCh3bCk7CkBAIC0xOTE1LDI1ICsxOTg0LDYgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIHBvd2VyX29mZjsKIAotCQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKLQkJICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKSB7Ci0JCQkvKgotCQkJICogVGhlIGRldmljZSByb2xlIGlzIGEgc3BlY2lhbCByb2xlIHVzZWQgZm9yCi0JCQkgKiByeCBhbmQgdHggZnJhbWVzIHByaW9yIHRvIGFzc29jaWF0aW9uIChhcwotCQkJICogdGhlIFNUQSByb2xlIGNhbiBnZXQgcGFja2V0cyBvbmx5IGZyb20KLQkJCSAqIGl0cyBhc3NvY2lhdGVkIGJzc2lkKQotCQkJICovCi0JCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHdsLAotCQkJCQkJCSBXTDEyNzFfUk9MRV9ERVZJQ0UsCi0JCQkJCQkJICZ3bC0+ZGV2X3JvbGVfaWQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBpcnFfZGlzYWJsZTsKLQkJfQotCi0JCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUod2wsIHJvbGVfdHlwZSwgJndsLT5yb2xlX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGlycV9kaXNhYmxlOwotCiAJCXJldCA9IHdsMTI3MV9od19pbml0KHdsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGlycV9kaXNhYmxlOwpAQCAtMTk2NCw5ICsyMDE0LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2wtPnZpZiA9IHZpZjsKLQl3bC0+c3RhdGUgPSBXTDEyNzFfU1RBVEVfT047Ci0Jc2V0X2JpdChXTDEyNzFfRkxBR19JRl9JTklUSUFMSVpFRCwgJndsLT5mbGFncyk7CiAJd2wxMjcxX2luZm8oImZpcm13YXJlIGJvb3RlZCAoJXMpIiwgd2wtPmNoaXAuZndfdmVyX3N0cik7CiAKIAkvKiB1cGRhdGUgaHcvZncgdmVyc2lvbiBpbmZvIGluIHdpcGh5IHN0cnVjdCAqLwpAQCAtMTk4NCw3ICsyMDMxLDExMCBAQAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIjExYSBpcyAlc3N1cHBvcnRlZCIsCiAJCSAgICAgd2wtPmVuYWJsZV8xMWEgPyAiIiA6ICJub3QgIik7CiAKKwl3bC0+c3RhdGUgPSBXTDEyNzFfU1RBVEVfT047CiBvdXQ6CisJcmV0dXJuIGJvb3RlZDsKK30KKworc3RhdGljIGludCB3bDEyNzFfb3BfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJaW50IHJldCA9IDA7CisJdTggcm9sZV90eXBlOworCWJvb2wgYm9vdGVkID0gZmFsc2U7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBhZGQgaW50ZXJmYWNlIHR5cGUgJWQgbWFjICVwTSIsCisJCSAgICAgaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpLCB2aWYtPmFkZHIpOworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmICh3bC0+dmlmKSB7CisJCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwKKwkJCSAgICAgIm11bHRpcGxlIHZpZnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBpbiBzb21lIHZlcnkgY29ybmVyIGNhc2UgSFcgcmVjb3Zlcnkgc2NlbmFyaW9zIGl0cyBwb3NzaWJsZSB0bworCSAqIGdldCBoZXJlIGJlZm9yZSBfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlIGlzIGNvbXBsZXRlLCBzbworCSAqIG9wdCBvdXQgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfUkVDT1ZFUllfSU5fUFJPR1JFU1MsICZ3bC0+ZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KFdMVklGX0ZMQUdfSU5JVElBTElaRUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2wxMnh4X2luaXRfdmlmX2RhdGEod2wsIHZpZik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJd2x2aWYtPndsID0gd2w7CisJcm9sZV90eXBlID0gd2wxMnh4X2dldF9yb2xlX3R5cGUod2wsIHdsdmlmKTsKKwlpZiAocm9sZV90eXBlID09IFdMMTJYWF9JTlZBTElEX1JPTEVfVFlQRSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRPRE86IGFmdGVyIHRoZSBudnMgaXNzdWUgd2lsbCBiZSBzb2x2ZWQsIG1vdmUgdGhpcyBibG9jaworCSAqIHRvIHN0YXJ0KCksIGFuZCBtYWtlIHN1cmUgaGVyZSB0aGUgZHJpdmVyIGlzIE9OLgorCSAqLworCWlmICh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikgeworCQkvKgorCQkgKiB3ZSBzdGlsbCBuZWVkIHRoaXMgaW4gb3JkZXIgdG8gY29uZmlndXJlIHRoZSBmdworCQkgKiB3aGlsZSB1cGxvYWRpbmcgdGhlIG52cworCQkgKi8KKwkJbWVtY3B5KHdsLT5tYWNfYWRkciwgdmlmLT5hZGRyLCBFVEhfQUxFTik7CisKKwkJYm9vdGVkID0gd2wxMnh4X2luaXRfZncod2wpOworCQlpZiAoIWJvb3RlZCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTIHx8CisJICAgIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKSB7CisJCS8qCisJCSAqIFRoZSBkZXZpY2Ugcm9sZSBpcyBhIHNwZWNpYWwgcm9sZSB1c2VkIGZvcgorCQkgKiByeCBhbmQgdHggZnJhbWVzIHByaW9yIHRvIGFzc29jaWF0aW9uIChhcworCQkgKiB0aGUgU1RBIHJvbGUgY2FuIGdldCBwYWNrZXRzIG9ubHkgZnJvbQorCQkgKiBpdHMgYXNzb2NpYXRlZCBic3NpZCkKKwkJICovCisJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUod2wsIHZpZi0+YWRkciwKKwkJCQkJCSBXTDEyNzFfUk9MRV9ERVZJQ0UsCisJCQkJCQkgJndsdmlmLT5kZXZfcm9sZV9pZCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2VuYWJsZSh3bCwgdmlmLT5hZGRyLAorCQkJCSAgICAgcm9sZV90eXBlLCAmd2x2aWYtPnJvbGVfaWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IHdsMTI3MV9pbml0X3ZpZl9zcGVjaWZpYyh3bCwgdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl3bC0+dmlmID0gdmlmOworCWxpc3RfYWRkKCZ3bHZpZi0+bGlzdCwgJndsLT53bHZpZl9saXN0KTsKKwlzZXRfYml0KFdMVklGX0ZMQUdfSU5JVElBTElaRUQsICZ3bHZpZi0+ZmxhZ3MpOworCisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCisJCXdsLT5hcF9jb3VudCsrOworCWVsc2UKKwkJd2wtPnN0YV9jb3VudCsrOworb3V0OgorCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKIAltdXRleF9sb2NrKCZ3bF9saXN0X211dGV4KTsKQEAgLTE5OTYsMjkgKzIxNDYsMzQgQEAKIH0KIAogc3RhdGljIHZvaWQgX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJCSBib29sIHJlc2V0X3R4X3F1ZXVlcykKIHsKLQlpbnQgcmV0LCBpOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCWludCBpLCByZXQ7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSByZW1vdmUgaW50ZXJmYWNlIik7CiAKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChXTFZJRl9GTEFHX0lOSVRJQUxJWkVELCAmd2x2aWYtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJd2wtPnZpZiA9IE5VTEw7CisKIAkvKiBiZWNhdXNlIG9mIGhhcmR3YXJlIHJlY292ZXJ5LCB3ZSBtYXkgZ2V0IGhlcmUgdHdpY2UgKi8KIAlpZiAod2wtPnN0YXRlICE9IFdMMTI3MV9TVEFURV9PTikKIAkJcmV0dXJuOwogCiAJd2wxMjcxX2luZm8oImRvd24iKTsKIAotCW11dGV4X2xvY2soJndsX2xpc3RfbXV0ZXgpOwotCWxpc3RfZGVsKCZ3bC0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ3bF9saXN0X211dGV4KTsKLQogCS8qIGVuYWJsZSBkeW4gcHMganVzdCBpbiBjYXNlIChpZiBsZWZ0IG9uIGR1ZSB0byBmdyBjcmFzaCBldGMpICovCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQotCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh3bC0+dmlmKTsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpCisJCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHZpZik7CiAKLQlpZiAod2wtPnNjYW4uc3RhdGUgIT0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRSkgeworCWlmICh3bC0+c2Nhbi5zdGF0ZSAhPSBXTDEyNzFfU0NBTl9TVEFURV9JRExFICYmCisJICAgIHdsLT5zY2FuX3ZpZiA9PSB2aWYpIHsKIAkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV9JRExFOwogCQltZW1zZXQod2wtPnNjYW4uc2Nhbm5lZF9jaCwgMCwgc2l6ZW9mKHdsLT5zY2FuLnNjYW5uZWRfY2gpKTsKKwkJd2wtPnNjYW5fdmlmID0gTlVMTDsKIAkJd2wtPnNjYW4ucmVxID0gTlVMTDsKIAkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgdHJ1ZSk7CiAJfQpAQCAtMjAyOSwxMyArMjE4NCwxMyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGVpbml0OwogCi0JCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykgewotCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2Rpc2FibGUod2wsICZ3bC0+ZGV2X3JvbGVfaWQpOworCQlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpIHsKKwkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9kaXNhYmxlKHdsLCAmd2x2aWYtPmRldl9yb2xlX2lkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZGVpbml0OwogCQl9CiAKLQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2Rpc2FibGUod2wsICZ3bC0+cm9sZV9pZCk7CisJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9kaXNhYmxlKHdsLCAmd2x2aWYtPnJvbGVfaWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGVpbml0OwogCkBAIC0yMDQzLDEyMCArMjE5OCw4MiBAQAogCX0KIGRlaW5pdDoKIAkvKiBjbGVhciBhbGwgaGxpZHMgKGV4Y2VwdCBzeXN0ZW1faGxpZCkgKi8KLQl3bC0+c3RhX2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5kZXZfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7Ci0Jd2wtPmFwX2JjYXN0X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5hcF9nbG9iYWxfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CisJd2x2aWYtPmRldl9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKIAotCS8qCi0JICogdGhpcyBtdXN0IGJlIGJlZm9yZSB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYmVsb3csIHNvIHRoYXQgdGhlIHdvcmsKLQkgKiBmdW5jdGlvbnMgZG9uJ3QgcGVyZm9ybSBmdXJ0aGVyIHdvcmsuCi0JICovCi0Jd2wtPnN0YXRlID0gV0wxMjcxX1NUQVRFX09GRjsKLQotCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKLQotCXdsMTI3MV9kaXNhYmxlX2ludGVycnVwdHMod2wpOwotCXdsMTI3MV9mbHVzaF9kZWZlcnJlZF93b3JrKHdsKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5zY2FuX2NvbXBsZXRlX3dvcmspOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5uZXRzdGFja193b3JrKTsKLQljYW5jZWxfd29ya19zeW5jKCZ3bC0+dHhfd29yayk7Ci0JZGVsX3RpbWVyX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfdGltZXIpOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5wc3BvbGxfd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+ZWxwX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQotCS8qIGxldCdzIG5vdGlmeSBNQUM4MDIxMSBhYm91dCB0aGUgcmVtYWluaW5nIHBlbmRpbmcgVFggZnJhbWVzICovCi0Jd2wxMjcxX3R4X3Jlc2V0KHdsLCByZXNldF90eF9xdWV1ZXMpOwotCXdsMTI3MV9wb3dlcl9vZmYod2wpOwotCi0JbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCW1lbXNldCh3bC0+c3NpZCwgMCwgSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDEpOwotCXdsLT5zc2lkX2xlbiA9IDA7Ci0Jd2wtPmJzc190eXBlID0gTUFYX0JTU19UWVBFOwotCXdsLT5zZXRfYnNzX3R5cGUgPSBNQVhfQlNTX1RZUEU7Ci0Jd2wtPnAycCA9IDA7Ci0Jd2wtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0Jd2wtPnJ4X2NvdW50ZXIgPSAwOwotCXdsLT5wc21fZW50cnlfcmV0cnkgPSAwOwotCXdsLT5wb3dlcl9sZXZlbCA9IFdMMTI3MV9ERUZBVUxUX1BPV0VSX0xFVkVMOwotCXdsLT50eF9ibG9ja3NfYXZhaWxhYmxlID0gMDsKLQl3bC0+dHhfYWxsb2NhdGVkX2Jsb2NrcyA9IDA7Ci0Jd2wtPnR4X3Jlc3VsdHNfY291bnQgPSAwOwotCXdsLT50eF9wYWNrZXRzX2NvdW50ID0gMDsKLQl3bC0+dGltZV9vZmZzZXQgPSAwOwotCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwotCXdsLT5yYXRlX3NldCA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDOwotCXdsLT5iaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZTsKLQl3bC0+Yml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfQkFORF81R0haXSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGVfNTsKLQl3bC0+dmlmID0gTlVMTDsKLQl3bC0+dHhfc3BhcmVfYmxvY2tzID0gVFhfSFdfQkxPQ0tfU1BBUkVfREVGQVVMVDsKLQl3bDEyNzFfZnJlZV9hcF9rZXlzKHdsKTsKLQltZW1zZXQod2wtPmFwX2hsaWRfbWFwLCAwLCBzaXplb2Yod2wtPmFwX2hsaWRfbWFwKSk7Ci0Jd2wtPmFwX2Z3X3BzX21hcCA9IDA7Ci0Jd2wtPmFwX3BzX21hcCA9IDA7Ci0Jd2wtPnNjaGVkX3NjYW5uaW5nID0gZmFsc2U7Ci0Jd2wtPnJvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOwotCXdsLT5kZXZfcm9sZV9pZCA9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQ7Ci0JbWVtc2V0KHdsLT5yb2xlc19tYXAsIDAsIHNpemVvZih3bC0+cm9sZXNfbWFwKSk7Ci0JbWVtc2V0KHdsLT5saW5rc19tYXAsIDAsIHNpemVvZih3bC0+bGlua3NfbWFwKSk7Ci0JbWVtc2V0KHdsLT5yb2NfbWFwLCAwLCBzaXplb2Yod2wtPnJvY19tYXApKTsKLQl3bC0+YWN0aXZlX3N0YV9jb3VudCA9IDA7Ci0KLQkvKiBUaGUgc3lzdGVtIGxpbmsgaXMgYWx3YXlzIGFsbG9jYXRlZCAqLwotCV9fc2V0X2JpdChXTDEyWFhfU1lTVEVNX0hMSUQsIHdsLT5saW5rc19tYXApOwotCi0JLyoKLQkgKiB0aGlzIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYW5kIHRoZSBhc3NvY2lhdGVkCi0JICogbXV0ZXhfbG9jaywgc28gdGhhdCB3bDEyNzFfb3BfYWRkX2ludGVyZmFjZSBkb2VzIG5vdCBhY2NpZGVudGFsbHkKLQkgKiBnZXQgZXhlY3V0ZWQgYmVmb3JlIGFsbCB0aGVzZSB2YXJzIGhhdmUgYmVlbiByZXNldC4KLQkgKi8KLQl3bC0+ZmxhZ3MgPSAwOwotCi0Jd2wtPnR4X2Jsb2Nrc19mcmVlZCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKSB7Ci0JCXdsLT50eF9wa3RzX2ZyZWVkW2ldID0gMDsKLQkJd2wtPnR4X2FsbG9jYXRlZF9wa3RzW2ldID0gMDsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKKwkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKKwkJd2x2aWYtPnN0YS5obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLmJhc2ljX3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLmFwX3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLnAycF9yYXRlX2lkeCk7CisJfSBlbHNlIHsKKwkJd2x2aWYtPmFwLmJjYXN0X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOworCQl3bHZpZi0+YXAuZ2xvYmFsX2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOworCQl3bDEyeHhfZnJlZV9yYXRlX3BvbGljeSh3bCwgJndsdmlmLT5hcC5tZ210X3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHgpOworCQlmb3IgKGkgPSAwOyBpIDwgQ09ORl9UWF9NQVhfQUNfQ09VTlQ7IGkrKykKKwkJCXdsMTJ4eF9mcmVlX3JhdGVfcG9saWN5KHdsLAorCQkJCQkJJndsdmlmLT5hcC51Y2FzdF9yYXRlX2lkeFtpXSk7CiAJfQogCi0Jd2wxMjcxX2RlYnVnZnNfcmVzZXQod2wpOworCXdsMTJ4eF90eF9yZXNldF93bHZpZih3bCwgd2x2aWYpOworCXdsMTI3MV9mcmVlX2FwX2tleXMod2wsIHdsdmlmKTsKKwlpZiAod2wtPmxhc3Rfd2x2aWYgPT0gd2x2aWYpCisJCXdsLT5sYXN0X3dsdmlmID0gTlVMTDsKKwlsaXN0X2RlbCgmd2x2aWYtPmxpc3QpOworCW1lbXNldCh3bHZpZi0+YXAuc3RhX2hsaWRfbWFwLCAwLCBzaXplb2Yod2x2aWYtPmFwLnN0YV9obGlkX21hcCkpOworCXdsdmlmLT5yb2xlX2lkID0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRDsKKwl3bHZpZi0+ZGV2X3JvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOwogCi0Ja2ZyZWUod2wtPmZ3X3N0YXR1cyk7Ci0Jd2wtPmZ3X3N0YXR1cyA9IE5VTEw7Ci0Ja2ZyZWUod2wtPnR4X3Jlc19pZik7Ci0Jd2wtPnR4X3Jlc19pZiA9IE5VTEw7Ci0Ja2ZyZWUod2wtPnRhcmdldF9tZW1fbWFwKTsKLQl3bC0+dGFyZ2V0X21lbV9tYXAgPSBOVUxMOworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQorCQl3bC0+YXBfY291bnQtLTsKKwllbHNlCisJCXdsLT5zdGFfY291bnQtLTsKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKwlkZWxfdGltZXJfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ190aW1lcik7CisJY2FuY2VsX3dvcmtfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd2x2aWYtPnBzcG9sbF93b3JrKTsKKworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IHdsMTJ4eF92aWYgKml0ZXI7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJaWYgKHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGIHx8CisJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX0lOSVRJQUxJWkVELCAmd2x2aWYtPmZsYWdzKSkKKwkJZ290byBvdXQ7CisKIAkvKgogCSAqIHdsLT52aWYgY2FuIGJlIG51bGwgaGVyZSBpZiBzb21lb25lIHNodXRzIGRvd24gdGhlIGludGVyZmFjZQogCSAqIGp1c3Qgd2hlbiBoYXJkd2FyZSByZWNvdmVyeSBoYXMgYmVlbiBzdGFydGVkLgogCSAqLwotCWlmICh3bC0+dmlmKSB7Ci0JCVdBUk5fT04od2wtPnZpZiAhPSB2aWYpOwotCQlfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHdsLCB0cnVlKTsKLQl9CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCBpdGVyKSB7CisJCWlmIChpdGVyICE9IHdsdmlmKQorCQkJY29udGludWU7CiAKKwkJX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZSh3bCwgdmlmLCB0cnVlKTsKKwkJYnJlYWs7CisJfQorCVdBUk5fT04oaXRlciAhPSB3bHZpZik7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yZWNvdmVyeV93b3JrKTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfam9pbihzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBzZXRfYXNzb2MpCitzdGF0aWMgaW50IHdsMTI3MV9qb2luKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIGJvb2wgc2V0X2Fzc29jKQogewogCWludCByZXQ7Ci0JYm9vbCBpc19pYnNzID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKTsKKwlib29sIGlzX2lic3MgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpOwogCiAJLyoKIAkgKiBPbmUgb2YgdGhlIHNpZGUgZWZmZWN0cyBvZiB0aGUgSk9JTiBjb21tYW5kIGlzIHRoYXQgaXMgY2xlYXJzCkBAIC0yMTY3LDIwICsyMjg0LDIwIEBACiAJICogS2VlcCB0aGUgYmVsb3cgbWVzc2FnZSBmb3Igbm93LCB1bmxlc3MgaXQgc3RhcnRzIGJvdGhlcmluZwogCSAqIHVzZXJzIHdobyByZWFsbHkgbGlrZSB0byByb2FtIGEgbG90IDopCiAJICovCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkKKwlpZiAodGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpCiAJCXdsMTI3MV9pbmZvKCJKT0lOIHdoaWxlIGFzc29jaWF0ZWQuIik7CiAKIAlpZiAoc2V0X2Fzc29jKQotCQlzZXRfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKTsKKwkJc2V0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKTsKIAogCWlmIChpc19pYnNzKQotCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyh3bCk7CisJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9pYnNzKHdsLCB3bHZpZik7CiAJZWxzZQotCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHdsKTsKKwkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X3N0YSh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0OwogCiAJLyoKQEAgLTIxODksMTkgKzIzMDYsMjAgQEAKIAkgKiB0aGUgam9pbi4gVGhlIGFjeF9haWQgc3RhcnRzIHRoZSBrZWVwLWFsaXZlIHByb2Nlc3MsIGFuZCB0aGUgb3JkZXIKIAkgKiBvZiB0aGUgY29tbWFuZHMgYmVsb3cgaXMgcmVsZXZhbnQuCiAJICovCi0JcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUod2wsIHRydWUpOworCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHdsLCB3bHZpZiwgdHJ1ZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9haWQod2wsIHdsLT5haWQpOworCXJldCA9IHdsMTI3MV9hY3hfYWlkKHdsLCB3bHZpZiwgd2x2aWYtPmFpZCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9rbHZfbnVsbF9kYXRhKHdsKTsKKwlyZXQgPSB3bDEyeHhfY21kX2J1aWxkX2tsdl9udWxsX2RhdGEod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCBDTURfVEVNUExfS0xWX0lEWF9OVUxMX0RBVEEsCisJcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZyh3bCwgd2x2aWYsCisJCQkJCSAgIENNRF9URU1QTF9LTFZfSURYX05VTExfREFUQSwKIAkJCQkJICAgQUNYX0tFRVBfQUxJVkVfVFBMX1ZBTElEKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CkBAIC0yMjEwLDM0ICsyMzI4LDM0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfdW5qb2luKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfdW5qb2luKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldDsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0wxMjcxX0ZMQUdfQ1NfUFJPR1JFU1MsICZ3bC0+ZmxhZ3MpKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTFZJRl9GTEFHX0NTX1BST0dSRVNTLCAmd2x2aWYtPmZsYWdzKSkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CisKIAkJd2wxMnh4X2NtZF9zdG9wX2NoYW5uZWxfc3dpdGNoKHdsKTsKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUod2wtPnZpZiwgZmFsc2UpOworCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSh2aWYsIGZhbHNlKTsKIAl9CiAKIAkvKiB0byBzdG9wIGxpc3RlbmluZyB0byBhIGNoYW5uZWwsIHdlIGRpc2Nvbm5lY3QgKi8KLQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RvcF9zdGEod2wpOworCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX3N0YSh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKLQogCS8qIHJlc2V0IFRYIHNlY3VyaXR5IGNvdW50ZXJzIG9uIGEgY2xlYW4gZGlzY29ubmVjdCAqLwotCXdsLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IgPSAwOwotCXdsLT50eF9zZWN1cml0eV9zZXEgPSAwOworCXdsdmlmLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IgPSAwOworCXdsdmlmLT50eF9zZWN1cml0eV9zZXEgPSAwOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3NldF9iYW5kX3JhdGUoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyNzFfc2V0X2JhbmRfcmF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewotCXdsLT5iYXNpY19yYXRlX3NldCA9IHdsLT5iaXRyYXRlX21hc2tzW3dsLT5iYW5kXTsKLQl3bC0+cmF0ZV9zZXQgPSB3bC0+YmFzaWNfcmF0ZV9zZXQ7CisJd2x2aWYtPmJhc2ljX3JhdGVfc2V0ID0gd2x2aWYtPmJpdHJhdGVfbWFza3Nbd2x2aWYtPmJhbmRdOworCXdsdmlmLT5yYXRlX3NldCA9IHdsdmlmLT5iYXNpY19yYXRlX3NldDsKIH0KIAogc3RhdGljIGJvb2wgd2wxMnh4X2lzX3JvYyhzdHJ1Y3Qgd2wxMjcxICp3bCkKQEAgLTIyNTEsMjcgKzIzNjksMjUgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc3RhX2hhbmRsZV9pZGxlKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGlkbGUpCitzdGF0aWMgaW50IHdsMTI3MV9zdGFfaGFuZGxlX2lkbGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgIGJvb2wgaWRsZSkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKGlkbGUpIHsKIAkJLyogbm8gbmVlZCB0byBjcm9jIGlmIHdlIHdlcmVuJ3QgYnVzeSAoZS5nLiBkdXJpbmcgYm9vdCkgKi8KIAkJaWYgKHdsMTJ4eF9pc19yb2Mod2wpKSB7Ci0JCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCi0JCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wpOworCQkJcmV0ID0gd2wxMnh4X3N0b3BfZGV2KHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJfQotCQl3bC0+cmF0ZV9zZXQgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJd2x2aWYtPnJhdGVfc2V0ID0KKwkJCXdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wsIHdsdmlmKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZygKLQkJCXdsLCBDTURfVEVNUExfS0xWX0lEWF9OVUxMX0RBVEEsCisJCQl3bCwgd2x2aWYsIENNRF9URU1QTF9LTFZfSURYX05VTExfREFUQSwKIAkJCUFDWF9LRUVQX0FMSVZFX1RQTF9JTlZBTElEKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKQEAgLTIyODMsMTEgKzIzOTksNyBAQAogCQkJaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZCh3bC0+aHcpOwogCQl9CiAKLQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2Rldih3bCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKKwkJcmV0ID0gd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfSURMRSwgJndsLT5mbGFncyk7CkBAIC0yMjk3LDEyICsyNDA5LDEyNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgd2wxMnh4X2NvbmZpZ192aWYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLCB1MzIgY2hhbmdlZCkKK3sKKwlib29sIGlzX2FwID0gKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOworCWludCBjaGFubmVsLCByZXQ7CisKKwljaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKworCS8qIGlmIHRoZSBjaGFubmVsIGNoYW5nZXMgd2hpbGUgam9pbmVkLCBqb2luIGFnYWluICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCAmJgorCSAgICAoKHdsdmlmLT5iYW5kICE9IGNvbmYtPmNoYW5uZWwtPmJhbmQpIHx8CisJICAgICAod2x2aWYtPmNoYW5uZWwgIT0gY2hhbm5lbCkpKSB7CisJCS8qIHNlbmQgYWxsIHBlbmRpbmcgcGFja2V0cyAqLworCQl3bDEyNzFfdHhfd29ya19sb2NrZWQod2wpOworCQl3bHZpZi0+YmFuZCA9IGNvbmYtPmNoYW5uZWwtPmJhbmQ7CisJCXdsdmlmLT5jaGFubmVsID0gY2hhbm5lbDsKKworCQlpZiAoIWlzX2FwKSB7CisJCQkvKgorCQkJICogRklYTUU6IHRoZSBtYWM4MDIxMSBzaG91bGQgcmVhbGx5IHByb3ZpZGUgYSBmaXhlZAorCQkJICogcmF0ZSB0byB1c2UgaGVyZS4gZm9yIG5vdywganVzdCB1c2UgdGhlIHNtYWxsZXN0CisJCQkgKiBwb3NzaWJsZSByYXRlIGZvciB0aGUgYmFuZCBhcyBhIGZpeGVkIHJhdGUgZm9yCisJCQkgKiBhc3NvY2lhdGlvbiBmcmFtZXMgYW5kIG90aGVyIGNvbnRyb2wgbWVzc2FnZXMuCisJCQkgKi8KKwkJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpCisJCQkJd2wxMjcxX3NldF9iYW5kX3JhdGUod2wsIHdsdmlmKTsKKworCQkJd2x2aWYtPmJhc2ljX3JhdGUgPQorCQkJCXdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsCisJCQkJCQkgICAgICAgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wsIHdsdmlmKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXdsMTI3MV93YXJuaW5nKCJyYXRlIHBvbGljeSBmb3IgY2hhbm5lbCAiCisJCQkJCSAgICAgICAiZmFpbGVkICVkIiwgcmV0KTsKKworCQkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsCisJCQkJICAgICAmd2x2aWYtPmZsYWdzKSkgeworCQkJCWlmICh3bDEyeHhfaXNfcm9jKHdsKSkgeworCQkJCQkvKiByb2FtaW5nICovCisJCQkJCXJldCA9IHdsMTJ4eF9jcm9jKHdsLAorCQkJCQkJCSAgd2x2aWYtPmRldl9yb2xlX2lkKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQlyZXQgPSB3bDEyNzFfam9pbih3bCwgd2x2aWYsIGZhbHNlKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJd2wxMjcxX3dhcm5pbmcoImNtZCBqb2luIG9uIGNoYW5uZWwgIgorCQkJCQkJICAgICAgICJmYWlsZWQgJWQiLCByZXQpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIGNoYW5nZSB0aGUgUk9DIGNoYW5uZWwuIGRvIGl0IG9ubHkgaWYgd2UgYXJlCisJCQkJICogbm90IGlkbGUuIG90aGVyd2lzZSwgQ1JPQyB3aWxsIGJlIGNhbGxlZAorCQkJCSAqIGFueXdheS4KKwkJCQkgKi8KKwkJCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkgJiYKKwkJCQkgICAgIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpKSB7CisJCQkJCXJldCA9IHdsMTJ4eF9zdG9wX2Rldih3bCwgd2x2aWYpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisKKwkJCQkJcmV0ID0gd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBpZiBtYWM4MDIxMSBjaGFuZ2VzIHRoZSBQU00gbW9kZSwgbWFrZSBzdXJlIHRoZSBtb2RlIGlzIG5vdAorCSAqIGluY29ycmVjdGx5IGNoYW5nZWQgYWZ0ZXIgdGhlIHBzcG9sbCBmYWlsdXJlIGFjdGl2ZSB3aW5kb3cuCisJICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpCisJCWNsZWFyX2JpdChXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2x2aWYtPmZsYWdzKTsKKworCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTICYmCisJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCXNldF9iaXQoV0xWSUZfRkxBR19QU01fUkVRVUVTVEVELCAmd2x2aWYtPmZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBlbnRlciBQU00gb25seSBpZiB3ZSdyZSBhbHJlYWR5IGFzc29jaWF0ZWQuCisJCSAqIElmIHdlJ3JlIG5vdCwgd2UnbGwgZW50ZXIgaXQgd2hlbiBqb2luaW5nIGFuIFNTSUQsCisJCSAqIHRocm91Z2ggdGhlIGJzc19pbmZvX2NoYW5nZWQoKSBob29rLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCQl3bDEyNzFfZGVidWcoREVCVUdfUFNNLCAicHNtIGVuYWJsZWQiKTsKKwkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgd2x2aWYsCisJCQkJCQkgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCisJCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOworCQl9CisJfSBlbHNlIGlmICghKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpICYmCisJCSAgIHRlc3RfYml0KFdMVklGX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsdmlmLT5mbGFncykpIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgInBzbSBkaXNhYmxlZCIpOworCisJCWNsZWFyX2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpOworCisJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpCisJCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLAorCQkJCQkJIFNUQVRJT05fQUNUSVZFX01PREUsCisJCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOworCX0KKworCWlmIChjb25mLT5wb3dlcl9sZXZlbCAhPSB3bHZpZi0+cG93ZXJfbGV2ZWwpIHsKKwkJcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgd2x2aWYsIGNvbmYtPnBvd2VyX2xldmVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXdsdmlmLT5wb3dlcl9sZXZlbCA9IGNvbmYtPnBvd2VyX2xldmVsOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHdsMTI3MV9vcF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKIAlpbnQgY2hhbm5lbCwgcmV0ID0gMDsKLQlib29sIGlzX2FwOwogCiAJY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjb25mLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CiAKQEAgLTIzMjUsMTI4ICsyNTUwLDI3IEBACiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkgewotCQkvKiB3ZSBzdXBwb3J0IGNvbmZpZ3VyaW5nIHRoZSBjaGFubmVsIGFuZCBiYW5kIHdoaWxlIG9mZiAqLwotCQlpZiAoKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpIHsKLQkJCXdsLT5iYW5kID0gY29uZi0+Y2hhbm5lbC0+YmFuZDsKLQkJCXdsLT5jaGFubmVsID0gY2hhbm5lbDsKLQkJfQotCi0JCWlmICgoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikpCi0JCQl3bC0+cG93ZXJfbGV2ZWwgPSBjb25mLT5wb3dlcl9sZXZlbDsKLQotCQlnb3RvIG91dDsKKwkvKiB3ZSBzdXBwb3J0IGNvbmZpZ3VyaW5nIHRoZSBjaGFubmVsIGFuZCBiYW5kIGV2ZW4gd2hpbGUgb2ZmICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgeworCQl3bC0+YmFuZCA9IGNvbmYtPmNoYW5uZWwtPmJhbmQ7CisJCXdsLT5jaGFubmVsID0gY2hhbm5lbDsKIAl9CiAKLQlpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikKKwkJd2wtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CisKKwlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQorCQlnb3RvIG91dDsKIAogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKiBpZiB0aGUgY2hhbm5lbCBjaGFuZ2VzIHdoaWxlIGpvaW5lZCwgam9pbiBhZ2FpbiAqLwotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwgJiYKLQkgICAgKCh3bC0+YmFuZCAhPSBjb25mLT5jaGFubmVsLT5iYW5kKSB8fAotCSAgICAgKHdsLT5jaGFubmVsICE9IGNoYW5uZWwpKSkgewotCQkvKiBzZW5kIGFsbCBwZW5kaW5nIHBhY2tldHMgKi8KLQkJd2wxMjcxX3R4X3dvcmtfbG9ja2VkKHdsKTsKLQkJd2wtPmJhbmQgPSBjb25mLT5jaGFubmVsLT5iYW5kOwotCQl3bC0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0KLQkJaWYgKCFpc19hcCkgewotCQkJLyoKLQkJCSAqIEZJWE1FOiB0aGUgbWFjODAyMTEgc2hvdWxkIHJlYWxseSBwcm92aWRlIGEgZml4ZWQKLQkJCSAqIHJhdGUgdG8gdXNlIGhlcmUuIGZvciBub3csIGp1c3QgdXNlIHRoZSBzbWFsbGVzdAotCQkJICogcG9zc2libGUgcmF0ZSBmb3IgdGhlIGJhbmQgYXMgYSBmaXhlZCByYXRlIGZvcgotCQkJICogYXNzb2NpYXRpb24gZnJhbWVzIGFuZCBvdGhlciBjb250cm9sIG1lc3NhZ2VzLgotCQkJICovCi0JCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkKLQkJCQl3bDEyNzFfc2V0X2JhbmRfcmF0ZSh3bCk7Ci0KLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQl3bDEyNzFfd2FybmluZygicmF0ZSBwb2xpY3kgZm9yIGNoYW5uZWwgIgotCQkJCQkgICAgICAgImZhaWxlZCAlZCIsIHJldCk7Ci0KLQkJCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpIHsKLQkJCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkpIHsKLQkJCQkJLyogcm9hbWluZyAqLwotCQkJCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCQkJaWYgKHJldCA8IDApCi0JCQkJCQlnb3RvIG91dF9zbGVlcDsKLQkJCQl9Ci0JCQkJcmV0ID0gd2wxMjcxX2pvaW4od2wsIGZhbHNlKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJd2wxMjcxX3dhcm5pbmcoImNtZCBqb2luIG9uIGNoYW5uZWwgIgotCQkJCQkJICAgICAgICJmYWlsZWQgJWQiLCByZXQpOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIGNoYW5nZSB0aGUgUk9DIGNoYW5uZWwuIGRvIGl0IG9ubHkgaWYgd2UgYXJlCi0JCQkJICogbm90IGlkbGUuIG90aGVyd2lzZSwgQ1JPQyB3aWxsIGJlIGNhbGxlZAotCQkJCSAqIGFueXdheS4KLQkJCQkgKi8KLQkJCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkgJiYKLQkJCQkgICAgIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpKSB7Ci0JCQkJCXJldCA9IHdsMTJ4eF9jcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOwotCQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJCWdvdG8gb3V0X3NsZWVwOwotCi0JCQkJCXJldCA9IHdsMTJ4eF9yb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7Ci0JCQkJCWlmIChyZXQgPCAwKQotCQkJCQkJd2wxMjcxX3dhcm5pbmcoInJvYyBmYWlsZWQgJWQiLAotCQkJCQkJCSAgICAgICByZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0lETEUgJiYgIWlzX2FwKSB7Ci0JCXJldCA9IHdsMTI3MV9zdGFfaGFuZGxlX2lkbGUod2wsCi0JCQkJCWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJd2wxMjcxX3dhcm5pbmcoImlkbGUgbW9kZSBjaGFuZ2UgZmFpbGVkICVkIiwgcmV0KTsKLQl9Ci0KLQkvKgotCSAqIGlmIG1hYzgwMjExIGNoYW5nZXMgdGhlIFBTTSBtb2RlLCBtYWtlIHN1cmUgdGhlIG1vZGUgaXMgbm90Ci0JICogaW5jb3JyZWN0bHkgY2hhbmdlZCBhZnRlciB0aGUgcHNwb2xsIGZhaWx1cmUgYWN0aXZlIHdpbmRvdy4KLQkgKi8KLQlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykKLQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKTsKLQotCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTICYmCi0JICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVELCAmd2wtPmZsYWdzKSkgewotCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFdlIGVudGVyIFBTTSBvbmx5IGlmIHdlJ3JlIGFscmVhZHkgYXNzb2NpYXRlZC4KLQkJICogSWYgd2UncmUgbm90LCB3ZSdsbCBlbnRlciBpdCB3aGVuIGpvaW5pbmcgYW4gU1NJRCwKLQkJICogdGhyb3VnaCB0aGUgYnNzX2luZm9fY2hhbmdlZCgpIGhvb2suCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCQl3bDEyNzFfZGVidWcoREVCVUdfUFNNLCAicHNtIGVuYWJsZWQiKTsKLQkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCi0JCQkJCQkgd2wtPmJhc2ljX3JhdGUsIHRydWUpOwotCQl9Ci0JfSBlbHNlIGlmICghKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpICYmCi0JCSAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJwc20gZGlzYWJsZWQiKTsKLQotCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsLT5mbGFncyk7Ci0KLQkJaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpCi0JCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fQUNUSVZFX01PREUsCi0JCQkJCQkgd2wtPmJhc2ljX3JhdGUsIHRydWUpOwotCX0KLQotCWlmIChjb25mLT5wb3dlcl9sZXZlbCAhPSB3bC0+cG93ZXJfbGV2ZWwpIHsKLQkJcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgY29uZi0+cG93ZXJfbGV2ZWwpOworCS8qIGNvbmZpZ3VyZSBlYWNoIGludGVyZmFjZSAqLworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJcmV0ID0gd2wxMnh4X2NvbmZpZ192aWYod2wsIHdsdmlmLCBjb25mLCBjaGFuZ2VkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9zbGVlcDsKLQotCQl3bC0+cG93ZXJfbGV2ZWwgPSBjb25mLT5wb3dlcl9sZXZlbDsKIAl9CiAKIG91dF9zbGVlcDoKQEAgLTI1MDksNiArMjYzMyw4IEBACiB7CiAJc3RydWN0IHdsMTI3MV9maWx0ZXJfcGFyYW1zICpmcCA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpbXVsdGljYXN0OwogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOworCiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGNvbmZpZ3VyZSBmaWx0ZXIgY2hhbmdlZCAleCIKQEAgLTI1MjYsMTUgKzI2NTIsMjAgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgewotCQlpZiAoKnRvdGFsICYgRklGX0FMTE1VTFRJKQotCQkJcmV0ID0gd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibCh3bCwgZmFsc2UsIE5VTEwsIDApOwotCQllbHNlIGlmIChmcCkKLQkJCXJldCA9IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwod2wsIGZwLT5lbmFibGVkLAotCQkJCQkJCSAgIGZwLT5tY19saXN0LAotCQkJCQkJCSAgIGZwLT5tY19saXN0X2xlbmd0aCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXRfc2xlZXA7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlpZiAod2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgeworCQkJaWYgKCp0b3RhbCAmIEZJRl9BTExNVUxUSSkKKwkJCQlyZXQgPSB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHdsLCB3bHZpZiwKKwkJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJCSAgIE5VTEwsIDApOworCQkJZWxzZSBpZiAoZnApCisJCQkJcmV0ID0gd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibCh3bCwgd2x2aWYsCisJCQkJCQkJZnAtPmVuYWJsZWQsCisJCQkJCQkJZnAtPm1jX2xpc3QsCisJCQkJCQkJZnAtPm1jX2xpc3RfbGVuZ3RoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0X3NsZWVwOworCQl9CiAJfQogCiAJLyoKQEAgLTI1NTEsOSArMjY4MiwxMCBAQAogCWtmcmVlKGZwKTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfcmVjb3JkX2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaWQsIHU4IGtleV90eXBlLAotCQkJdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIHU4IGhsaWQsIHUzMiB0eF9zZXFfMzIsCi0JCQl1MTYgdHhfc2VxXzE2KQorc3RhdGljIGludCB3bDEyNzFfcmVjb3JkX2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCXU4IGlkLCB1OCBrZXlfdHlwZSwgdTgga2V5X3NpemUsCisJCQkJY29uc3QgdTggKmtleSwgdTggaGxpZCwgdTMyIHR4X3NlcV8zMiwKKwkJCQl1MTYgdHhfc2VxXzE2KQogewogCXN0cnVjdCB3bDEyNzFfYXBfa2V5ICphcF9rZXk7CiAJaW50IGk7CkBAIC0yNTY4LDEwICsyNzAwLDEwIEBACiAJICogYW4gZXhpc3Rpbmcga2V5LgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0tFWVM7IGkrKykgewotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPT0gTlVMTCkKKwkJaWYgKHdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID09IE5VTEwpCiAJCQlicmVhazsKIAotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0tPmlkID09IGlkKSB7CisJCWlmICh3bHZpZi0+YXAucmVjb3JkZWRfa2V5c1tpXS0+aWQgPT0gaWQpIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJ0cnlpbmcgdG8gcmVjb3JkIGtleSByZXBsYWNlbWVudCIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI1OTIsMjEgKzI3MjQsMjEgQEAKIAlhcF9rZXktPnR4X3NlcV8zMiA9IHR4X3NlcV8zMjsKIAlhcF9rZXktPnR4X3NlcV8xNiA9IHR4X3NlcV8xNjsKIAotCXdsLT5yZWNvcmRlZF9hcF9rZXlzW2ldID0gYXBfa2V5OworCXdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID0gYXBfa2V5OwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfZnJlZV9hcF9rZXlzKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fS0VZUzsgaSsrKSB7Ci0JCWtmcmVlKHdsLT5yZWNvcmRlZF9hcF9rZXlzW2ldKTsKLQkJd2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPSBOVUxMOworCQlrZnJlZSh3bHZpZi0+YXAucmVjb3JkZWRfa2V5c1tpXSk7CisJCXdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID0gTlVMTDsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfaHdlbmMoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X2h3ZW5jKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IGksIHJldCA9IDA7CiAJc3RydWN0IHdsMTI3MV9hcF9rZXkgKmtleTsKQEAgLTI2MTQsMTUgKzI3NDYsMTUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0tFWVM7IGkrKykgewogCQl1OCBobGlkOwotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPT0gTlVMTCkKKwkJaWYgKHdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID09IE5VTEwpCiAJCQlicmVhazsKIAotCQlrZXkgPSB3bC0+cmVjb3JkZWRfYXBfa2V5c1tpXTsKKwkJa2V5ID0gd2x2aWYtPmFwLnJlY29yZGVkX2tleXNbaV07CiAJCWhsaWQgPSBrZXktPmhsaWQ7CiAJCWlmIChobGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCi0JCQlobGlkID0gd2wtPmFwX2JjYXN0X2hsaWQ7CisJCQlobGlkID0gd2x2aWYtPmFwLmJjYXN0X2hsaWQ7CiAKLQkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHdsLCBLRVlfQUREX09SX1JFUExBQ0UsCisJCXJldCA9IHdsMTI3MV9jbWRfc2V0X2FwX2tleSh3bCwgd2x2aWYsIEtFWV9BRERfT1JfUkVQTEFDRSwKIAkJCQkJICAgIGtleS0+aWQsIGtleS0+a2V5X3R5cGUsCiAJCQkJCSAgICBrZXktPmtleV9zaXplLCBrZXktPmtleSwKIAkJCQkJICAgIGhsaWQsIGtleS0+dHhfc2VxXzMyLApAQCAtMjYzNSwyMyArMjc2NywyNCBAQAogCX0KIAogCWlmICh3ZXBfa2V5X2FkZGVkKSB7Ci0JCXJldCA9IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgd2wtPmRlZmF1bHRfa2V5LAotCQkJCQkJICAgICB3bC0+YXBfYmNhc3RfaGxpZCk7CisJCXJldCA9IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgd2x2aWYtPmRlZmF1bHRfa2V5LAorCQkJCQkJICAgICB3bHZpZi0+YXAuYmNhc3RfaGxpZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQogCiBvdXQ6Ci0Jd2wxMjcxX2ZyZWVfYXBfa2V5cyh3bCk7CisJd2wxMjcxX2ZyZWVfYXBfa2V5cyh3bCwgd2x2aWYpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NldF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKK3N0YXRpYyBpbnQgd2wxMjcxX3NldF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKIAkJICAgICAgIHU4IGtleV9zaXplLCBjb25zdCB1OCAqa2V5LCB1MzIgdHhfc2VxXzMyLAogCQkgICAgICAgdTE2IHR4X3NlcV8xNiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlpbnQgcmV0OwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKIAogCWlmIChpc19hcCkgewogCQlzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKndsX3N0YTsKQEAgLTI2NjEsMTAgKzI3OTQsMTAgQEAKIAkJCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OwogCQkJaGxpZCA9IHdsX3N0YS0+aGxpZDsKIAkJfSBlbHNlIHsKLQkJCWhsaWQgPSB3bC0+YXBfYmNhc3RfaGxpZDsKKwkJCWhsaWQgPSB3bHZpZi0+YXAuYmNhc3RfaGxpZDsKIAkJfQogCi0JCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CiAJCQkvKgogCQkJICogV2UgZG8gbm90IHN1cHBvcnQgcmVtb3Zpbmcga2V5cyBhZnRlciBBUCBzaHV0ZG93bi4KIAkJCSAqIFByZXRlbmQgd2UgZG8gdG8gbWFrZSBtYWM4MDIxMSBoYXBweS4KQEAgLTI2NzIsMTIgKzI4MDUsMTIgQEAKIAkJCWlmIChhY3Rpb24gIT0gS0VZX0FERF9PUl9SRVBMQUNFKQogCQkJCXJldHVybiAwOwogCi0JCQlyZXQgPSB3bDEyNzFfcmVjb3JkX2FwX2tleSh3bCwgaWQsCisJCQlyZXQgPSB3bDEyNzFfcmVjb3JkX2FwX2tleSh3bCwgd2x2aWYsIGlkLAogCQkJCQkgICAgIGtleV90eXBlLCBrZXlfc2l6ZSwKIAkJCQkJICAgICBrZXksIGhsaWQsIHR4X3NlcV8zMiwKIAkJCQkJICAgICB0eF9zZXFfMTYpOwogCQl9IGVsc2UgewotCQkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHdsLCBhY3Rpb24sCisJCQlyZXQgPSB3bDEyNzFfY21kX3NldF9hcF9rZXkod2wsIHdsdmlmLCBhY3Rpb24sCiAJCQkJCSAgICAgaWQsIGtleV90eXBlLCBrZXlfc2l6ZSwKIAkJCQkJICAgICBrZXksIGhsaWQsIHR4X3NlcV8zMiwKIAkJCQkJICAgICB0eF9zZXFfMTYpOwpAQCAtMjcxOCwxMCArMjg1MSwxMCBAQAogCiAJCS8qIGRvbid0IHJlbW92ZSBrZXkgaWYgaGxpZCB3YXMgYWxyZWFkeSBkZWxldGVkICovCiAJCWlmIChhY3Rpb24gPT0gS0VZX1JFTU9WRSAmJgotCQkgICAgd2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCisJCSAgICB3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkKIAkJCXJldHVybiAwOwogCi0JCXJldCA9IHdsMTI3MV9jbWRfc2V0X3N0YV9rZXkod2wsIGFjdGlvbiwKKwkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfc3RhX2tleSh3bCwgd2x2aWYsIGFjdGlvbiwKIAkJCQkJICAgICBpZCwga2V5X3R5cGUsIGtleV9zaXplLAogCQkJCQkgICAgIGtleSwgYWRkciwgdHhfc2VxXzMyLAogCQkJCQkgICAgIHR4X3NlcV8xNik7CkBAIC0yNzMxLDggKzI4NjQsOCBAQAogCQkvKiB0aGUgZGVmYXVsdCBXRVAga2V5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgYXQgbGVhc3Qgb25jZSAqLwogCQlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkgewogCQkJcmV0ID0gd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLAotCQkJCQkJCSAgICAgd2wtPmRlZmF1bHRfa2V5LAotCQkJCQkJCSAgICAgd2wtPnN0YV9obGlkKTsKKwkJCQkJCQl3bHZpZi0+ZGVmYXVsdF9rZXksCisJCQkJCQkJd2x2aWYtPnN0YS5obGlkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTI3NDcsNiArMjg4MCw3IEBACiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleV9jb25mKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldDsKIAl1MzIgdHhfc2VxXzMyID0gMDsKIAl1MTYgdHhfc2VxXzE2ID0gMDsKQEAgLTI3ODIsMjAgKzI5MTYsMjAgQEAKIAkJa2V5X3R5cGUgPSBLRVlfVEtJUDsKIAogCQlrZXlfY29uZi0+aHdfa2V5X2lkeCA9IGtleV9jb25mLT5rZXlpZHg7Ci0JCXR4X3NlcV8zMiA9IFdMMTI3MV9UWF9TRUNVUklUWV9ISTMyKHdsLT50eF9zZWN1cml0eV9zZXEpOwotCQl0eF9zZXFfMTYgPSBXTDEyNzFfVFhfU0VDVVJJVFlfTE8xNih3bC0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzMyID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CisJCXR4X3NlcV8xNiA9IFdMMTI3MV9UWF9TRUNVUklUWV9MTzE2KHdsdmlmLT50eF9zZWN1cml0eV9zZXEpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleV90eXBlID0gS0VZX0FFUzsKIAotCQlrZXlfY29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bC0+dHhfc2VjdXJpdHlfc2VxKTsKLQkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2wtPnR4X3NlY3VyaXR5X3NlcSk7CisJCWtleV9jb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFOworCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bHZpZi0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CiAJCWJyZWFrOwogCWNhc2UgV0wxMjcxX0NJUEhFUl9TVUlURV9HRU06CiAJCWtleV90eXBlID0gS0VZX0dFTTsKLQkJdHhfc2VxXzMyID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIod2wtPnR4X3NlY3VyaXR5X3NlcSk7Ci0JCXR4X3NlcV8xNiA9IFdMMTI3MV9UWF9TRUNVUklUWV9MTzE2KHdsLT50eF9zZWN1cml0eV9zZXEpOworCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bHZpZi0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdsMTI3MV9lcnJvcigiVW5rbm93biBrZXkgYWxnbyAweCV4Iiwga2V5X2NvbmYtPmNpcGhlcik7CkBAIC0yODA2LDcgKzI5NDAsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNFVF9LRVk6Ci0JCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCBLRVlfQUREX09SX1JFUExBQ0UsCisJCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCB3bHZpZiwgS0VZX0FERF9PUl9SRVBMQUNFLAogCQkJCSBrZXlfY29uZi0+a2V5aWR4LCBrZXlfdHlwZSwKIAkJCQkga2V5X2NvbmYtPmtleWxlbiwga2V5X2NvbmYtPmtleSwKIAkJCQkgdHhfc2VxXzMyLCB0eF9zZXFfMTYsIHN0YSk7CkBAIC0yODE3LDcgKzI5NTEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgRElTQUJMRV9LRVk6Ci0JCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCBLRVlfUkVNT1ZFLAorCQlyZXQgPSB3bDEyNzFfc2V0X2tleSh3bCwgd2x2aWYsIEtFWV9SRU1PVkUsCiAJCQkJICAgICBrZXlfY29uZi0+a2V5aWR4LCBrZXlfdHlwZSwKIAkJCQkgICAgIGtleV9jb25mLT5rZXlsZW4sIGtleV9jb25mLT5rZXksCiAJCQkJICAgICAwLCAwLCBzdGEpOwpAQCAtMjg0Nyw2ICsyOTgxLDggQEAKIAkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisKIAlpbnQgcmV0OwogCXU4ICpzc2lkID0gTlVMTDsKIAlzaXplX3QgbGVuID0gMDsKQEAgLTI4NzYsMTYgKzMwMTIsMTUgQEAKIAogCS8qIGNhbmNlbCBST0MgYmVmb3JlIHNjYW5uaW5nICovCiAJaWYgKHdsMTJ4eF9pc19yb2Mod2wpKSB7Ci0JCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CiAJCQkvKiBkb24ndCBhbGxvdyBzY2FubmluZyByaWdodCBub3cgKi8KIAkJCXJldCA9IC1FQlVTWTsKIAkJCWdvdG8gb3V0X3NsZWVwOwogCQl9Ci0JCXdsMTJ4eF9jcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOwotCQl3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wpOworCQl3bDEyeHhfc3RvcF9kZXYod2wsIHdsdmlmKTsKIAl9CiAKLQlyZXQgPSB3bDEyNzFfc2Nhbihody0+cHJpdiwgc3NpZCwgbGVuLCByZXEpOworCXJldCA9IHdsMTI3MV9zY2FuKGh3LT5wcml2LCB2aWYsIHNzaWQsIGxlbiwgcmVxKTsKIG91dF9zbGVlcDoKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dDoKQEAgLTI5MjEsNiArMzA1Niw3IEBACiAJfQogCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRTsKIAltZW1zZXQod2wtPnNjYW4uc2Nhbm5lZF9jaCwgMCwgc2l6ZW9mKHdsLT5zY2FuLnNjYW5uZWRfY2gpKTsKKwl3bC0+c2Nhbl92aWYgPSBOVUxMOwogCXdsLT5zY2FuLnJlcSA9IE5VTEw7CiAJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgdHJ1ZSk7CiAKQEAgLTI5MzgsNiArMzA3NCw3IEBACiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zY2hlZF9zY2FuX2llcyAqaWVzKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIndsMTI3MV9vcF9zY2hlZF9zY2FuX3N0YXJ0Iik7CkBAIC0yOTQ4LDExICszMDg1LDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9jb25maWcod2wsIHJlcSwgaWVzKTsKKwlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX2NvbmZpZyh3bCwgd2x2aWYsIHJlcSwgaWVzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2xlZXA7CiAKLQlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHdsKTsKKwlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3NsZWVwOwogCkBAIC0zMDE3LDYgKzMxNTQsNyBAQAogc3RhdGljIGludCB3bDEyNzFfb3Bfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CkBAIC0zMDMwLDEwICszMTY4LDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHdsLCB2YWx1ZSk7Ci0JaWYgKHJldCA8IDApCi0JCXdsMTI3MV93YXJuaW5nKCJ3bDEyNzFfb3Bfc2V0X3J0c190aHJlc2hvbGQgZmFpbGVkOiAlZCIsIHJldCk7Ci0KKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCXJldCA9IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZCh3bCwgd2x2aWYsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQl3bDEyNzFfd2FybmluZygic2V0IHJ0cyB0aHJlc2hvbGQgZmFpbGVkOiAlZCIsIHJldCk7CisJfQogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogCiBvdXQ6CkBAIC0zMDQyLDkgKzMxODEsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zc2lkX3NldChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBpbnQgd2wxMjcxX3NzaWRfc2V0KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgaW50IG9mZnNldCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAl1OCBzc2lkX2xlbjsKIAljb25zdCB1OCAqcHRyID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELCBza2ItPmRhdGEgKyBvZmZzZXQsCiAJCQkJCSBza2ItPmxlbiAtIG9mZnNldCk7CkBAIC0zMDYwLDggKzMyMDAsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl3bC0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKLQltZW1jcHkod2wtPnNzaWQsIHB0cisyLCBzc2lkX2xlbik7CisJd2x2aWYtPnNzaWRfbGVuID0gc3NpZF9sZW47CisJbWVtY3B5KHdsdmlmLT5zc2lkLCBwdHIrMiwgc3NpZF9sZW4pOwogCXJldHVybiAwOwogfQogCkBAIC0zMDk2LDE4ICszMjM2LDQwIEBACiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwoc3RydWN0IHdsMTI3MSAqd2wsCi0JCQkJCSB1OCAqcHJvYmVfcnNwX2RhdGEsCi0JCQkJCSBzaXplX3QgcHJvYmVfcnNwX2xlbiwKLQkJCQkJIHUzMiByYXRlcykKK3N0YXRpYyBpbnQgd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiByYXRlcywKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmd2wtPnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0OworCisJc2tiID0gaWVlZTgwMjExX3Byb2JlcmVzcF9nZXQod2wtPmh3LCB2aWYpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwKKwkJCQkgICAgICBDTURfVEVNUExfQVBfUFJPQkVfUkVTUE9OU0UsCisJCQkJICAgICAgc2tiLT5kYXRhLAorCQkJCSAgICAgIHNrYi0+bGVuLCAwLAorCQkJCSAgICAgIHJhdGVzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsMTI3MV9hcF9zZXRfcHJvYmVfcmVzcF90bXBsX2xlZ2FjeShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQkgICAgIHU4ICpwcm9iZV9yc3BfZGF0YSwKKwkJCQkJICAgICBzaXplX3QgcHJvYmVfcnNwX2xlbiwKKwkJCQkJICAgICB1MzIgcmF0ZXMpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKIAl1OCBwcm9iZV9yc3BfdGVtcGxbV0wxMjcxX0NNRF9URU1QTF9NQVhfU0laRV07CiAJaW50IHNzaWRfaWVfb2Zmc2V0LCBpZV9vZmZzZXQsIHRlbXBsX2xlbjsKIAljb25zdCB1OCAqcHRyOwogCiAJLyogbm8gbmVlZCB0byBjaGFuZ2UgcHJvYmUgcmVzcG9uc2UgaWYgdGhlIFNTSUQgaXMgc2V0IGNvcnJlY3RseSAqLwotCWlmICh3bC0+c3NpZF9sZW4gPiAwKQorCWlmICh3bHZpZi0+c3NpZF9sZW4gPiAwKQogCQlyZXR1cm4gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsCiAJCQkJCSAgICAgICBDTURfVEVNUExfQVBfUFJPQkVfUkVTUE9OU0UsCiAJCQkJCSAgICAgICBwcm9iZV9yc3BfZGF0YSwKQEAgLTMxNTMsMTYgKzMzMTUsMTggQEAKIH0KIAogc3RhdGljIGludCB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCSAgICAgICB1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1NMT1QpIHsKIAkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfc2xvdCkKLQkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgU0xPVF9USU1FX1NIT1JUKTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgd2x2aWYsIFNMT1RfVElNRV9TSE9SVCk7CiAJCWVsc2UKLQkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgU0xPVF9USU1FX0xPTkcpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCB3bHZpZiwgU0xPVF9USU1FX0xPTkcpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoIlNldCBzbG90IHRpbWUgZmFpbGVkICVkIiwgcmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzE3MSwxNiArMzMzNSwxOCBAQAogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpIHsKIAkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCQl3bDEyNzFfYWN4X3NldF9wcmVhbWJsZSh3bCwgQUNYX1BSRUFNQkxFX1NIT1JUKTsKKwkJCXdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHdsLCB3bHZpZiwgQUNYX1BSRUFNQkxFX1NIT1JUKTsKIAkJZWxzZQotCQkJd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUod2wsIEFDWF9QUkVBTUJMRV9MT05HKTsKKwkJCXdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHdsLCB3bHZpZiwgQUNYX1BSRUFNQkxFX0xPTkcpOwogCX0KIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7CiAJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90KQotCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgQ1RTUFJPVEVDVF9FTkFCTEUpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgd2x2aWYsCisJCQkJCQkgICAgIENUU1BST1RFQ1RfRU5BQkxFKTsKIAkJZWxzZQotCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgQ1RTUFJPVEVDVF9ESVNBQkxFKTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfY3RzX3Byb3RlY3Qod2wsIHdsdmlmLAorCQkJCQkJICAgICBDVFNQUk9URUNUX0RJU0FCTEUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoIlNldCBjdHNwcm90ZWN0IGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTMxOTYsMTQgKzMzNjIsMjMgQEAKIAkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKIAkJCQkJICB1MzIgY2hhbmdlZCkKIHsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCWJvb2wgaXNfYXAgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UKSkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfTUFTVEVSLCAiYmVhY29uIGludGVydmFsIHVwZGF0ZWQ6ICVkIiwKIAkJCWJzc19jb25mLT5iZWFjb25faW50KTsKIAotCQl3bC0+YmVhY29uX2ludCA9IGJzc19jb25mLT5iZWFjb25faW50OworCQl3bHZpZi0+YmVhY29uX2ludCA9IGJzc19jb25mLT5iZWFjb25faW50OworCX0KKworCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1ApICYmIGlzX2FwKSB7CisJCXUzMiByYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwkJaWYgKCF3bDEyNzFfYXBfc2V0X3Byb2JlX3Jlc3BfdG1wbCh3bCwgcmF0ZSwgdmlmKSkgeworCQkJd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAicHJvYmUgcmVzcG9uc2UgdXBkYXRlZCIpOworCQkJc2V0X2JpdChXTFZJRl9GTEFHX0FQX1BST0JFX1JFU1BfU0VULCAmd2x2aWYtPmZsYWdzKTsKKwkJfQogCX0KIAogCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikpIHsKQEAgLTMyMTQsMTcgKzMzODksMTkgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmJlYWNvbiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KHdsLT5odywgdmlmKTsKIAkJdTE2IHRtcGxfaWQ7CiAKLQkJaWYgKCFiZWFjb24pCisJCWlmICghYmVhY29uKSB7CisJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CisJCX0KIAogCQl3bDEyNzFfZGVidWcoREVCVUdfTUFTVEVSLCAiYmVhY29uIHVwZGF0ZWQiKTsKIAotCQlyZXQgPSB3bDEyNzFfc3NpZF9zZXQod2wsIGJlYWNvbiwgaWVvZmZzZXQpOworCQlyZXQgPSB3bDEyNzFfc3NpZF9zZXQodmlmLCBiZWFjb24sIGllb2Zmc2V0KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9rZnJlZV9za2IoYmVhY29uKTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCW1pbl9yYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJhc2ljX3JhdGVfc2V0KTsKKwkJbWluX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCQl0bXBsX2lkID0gaXNfYXAgPyBDTURfVEVNUExfQVBfQkVBQ09OIDoKIAkJCQkgIENNRF9URU1QTF9CRUFDT047CiAJCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCB0bXBsX2lkLApAQCAtMzIzNiw2ICszNDEzLDEzIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCisJCS8qCisJCSAqIEluIGNhc2Ugd2UgYWxyZWFkeSBoYXZlIGEgcHJvYmUtcmVzcCBiZWFjb24gc2V0IGV4cGxpY2l0bHkKKwkJICogYnkgdXNlcm1vZGUsIGRvbid0IHVzZSB0aGUgYmVhY29uIGRhdGEuCisJCSAqLworCQlpZiAodGVzdF9iaXQoV0xWSUZfRkxBR19BUF9QUk9CRV9SRVNQX1NFVCwgJndsdmlmLT5mbGFncykpCisJCQlnb3RvIGVuZF9iY247CisKIAkJLyogcmVtb3ZlIFRJTSBpZSBmcm9tIHByb2JlIHJlc3BvbnNlICovCiAJCXdsMTJ4eF9yZW1vdmVfaWUoYmVhY29uLCBXTEFOX0VJRF9USU0sIGllb2Zmc2V0KTsKIApAQCAtMzI1NCw3ICszNDM4LDcgQEAKIAkJaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkJIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKIAkJaWYgKGlzX2FwKQotCQkJcmV0ID0gd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwod2wsCisJCQlyZXQgPSB3bDEyNzFfYXBfc2V0X3Byb2JlX3Jlc3BfdG1wbF9sZWdhY3kod2wsIHZpZiwKIAkJCQkJCWJlYWNvbi0+ZGF0YSwKIAkJCQkJCWJlYWNvbi0+bGVuLAogCQkJCQkJbWluX3JhdGUpOwpAQCAtMzI2NCwxMiArMzQ0OCwxNSBAQAogCQkJCQkJYmVhY29uLT5kYXRhLAogCQkJCQkJYmVhY29uLT5sZW4sIDAsCiAJCQkJCQltaW5fcmF0ZSk7CitlbmRfYmNuOgogCQlkZXZfa2ZyZWVfc2tiKGJlYWNvbik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQogCiBvdXQ6CisJaWYgKHJldCAhPSAwKQorCQl3bDEyNzFfZXJyb3IoImJlYWNvbiBpbmZvIGNoYW5nZSBmYWlsZWQ6ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMjc5LDIzICszNDY2LDI0IEBACiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCSAgICAgICB1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSkgewogCQl1MzIgcmF0ZXMgPSBic3NfY29uZi0+YmFzaWNfcmF0ZXM7CiAKLQkJd2wtPmJhc2ljX3JhdGVfc2V0ID0gd2wxMjcxX3R4X2VuYWJsZWRfcmF0ZXNfZ2V0KHdsLCByYXRlcywKLQkJCQkJCQkJIHdsLT5iYW5kKTsKLQkJd2wtPmJhc2ljX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLAotCQkJCQkJCXdsLT5iYXNpY19yYXRlX3NldCk7CisJCXdsdmlmLT5iYXNpY19yYXRlX3NldCA9IHdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCisJCQkJCQkJCSB3bHZpZi0+YmFuZCk7CisJCXdsdmlmLT5iYXNpY19yYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCi0JCXJldCA9IHdsMTI3MV9pbml0X2FwX3JhdGVzKHdsKTsKKwkJcmV0ID0gd2wxMjcxX2luaXRfYXBfcmF0ZXMod2wsIHdsdmlmKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXdsMTI3MV9lcnJvcigiQVAgcmF0ZSBwb2xpY3kgY2hhbmdlIGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyh3bCk7CisJCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyh3bCwgdmlmKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0zMzA2LDM4ICszNDk0LDQwIEBACiAKIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkpIHsKIAkJaWYgKGJzc19jb25mLT5lbmFibGVfYmVhY29uKSB7Ci0JCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2FwKHdsKTsKKwkJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19BUF9TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkgeworCQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9hcCh3bCwgd2x2aWYpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dDsKIAotCQkJCXJldCA9IHdsMTI3MV9hcF9pbml0X2h3ZW5jKHdsKTsKKwkJCQlyZXQgPSB3bDEyNzFfYXBfaW5pdF9od2VuYyh3bCwgd2x2aWYpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dDsKIAotCQkJCXNldF9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncyk7CisJCQkJc2V0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpOwogCQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19BUCwgInN0YXJ0ZWQgQVAiKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19BUF9TVEFSVEVELCAmd2wtPmZsYWdzKSkgewotCQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX2FwKHdsKTsKKwkJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAod2wsIHdsdmlmKTsKIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJZ290byBvdXQ7CiAKLQkJCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFdMVklGX0ZMQUdfQVBfU1RBUlRFRCwgJndsdmlmLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFdMVklGX0ZMQUdfQVBfUFJPQkVfUkVTUF9TRVQsCisJCQkJCSAgJndsdmlmLT5mbGFncyk7CiAJCQkJd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAic3RvcHBlZCBBUCIpOwogCQkJfQogCQl9CiAJfQogCi0JcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCBic3NfY29uZiwgY2hhbmdlZCk7CisJcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCB2aWYsIGJzc19jb25mLCBjaGFuZ2VkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBIYW5kbGUgSFQgaW5mb3JtYXRpb24gY2hhbmdlICovCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpICYmCiAJICAgIChic3NfY29uZi0+Y2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9OT19IVCkpIHsKLQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfaHRfaW5mb3JtYXRpb24od2wsCisJCXJldCA9IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHdsLCB3bHZpZiwKIAkJCQkJYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJTZXQgaHQgaW5mb3JtYXRpb24gZmFpbGVkICVkIiwgcmV0KTsKQEAgLTMzNTUsOCArMzU0NSw5IEBACiAJCQkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCQl1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlib29sIGRvX2pvaW4gPSBmYWxzZSwgc2V0X2Fzc29jID0gZmFsc2U7Ci0JYm9vbCBpc19pYnNzID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKTsKKwlib29sIGlzX2lic3MgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpOwogCWJvb2wgaWJzc19qb2luZWQgPSBmYWxzZTsKIAl1MzIgc3RhX3JhdGVfc2V0ID0gMDsKIAlpbnQgcmV0OwpAQCAtMzM3MywxNCArMzU2NCwxMyBAQAogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9JQlNTKSB7CiAJCWlmIChic3NfY29uZi0+aWJzc19qb2luZWQpIHsKLQkJCXNldF9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsICZ3bC0+ZmxhZ3MpOworCQkJc2V0X2JpdChXTFZJRl9GTEFHX0lCU1NfSk9JTkVELCAmd2x2aWYtPmZsYWdzKTsKIAkJCWlic3Nfam9pbmVkID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsCi0JCQkJCSAgICAgICAmd2wtPmZsYWdzKSkgewotCQkJCXdsMTI3MV91bmpvaW4od2wpOwotCQkJCXdsMTJ4eF9jbWRfcm9sZV9zdGFydF9kZXYod2wpOwotCQkJCXdsMTJ4eF9yb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfSUJTU19KT0lORUQsCisJCQkJCSAgICAgICAmd2x2aWYtPmZsYWdzKSkgeworCQkJCXdsMTI3MV91bmpvaW4od2wsIHdsdmlmKTsKKwkJCQl3bDEyeHhfc3RhcnRfZGV2KHdsLCB3bHZpZik7CiAJCQl9CiAJCX0KIAl9CkBAIC0zMzk2LDQ2ICszNTg2LDQwIEBACiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19BREhPQywgImFkLWhvYyBiZWFjb25pbmc6ICVzIiwKIAkJCSAgICAgYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAotCQlpZiAoYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24pCi0JCQl3bC0+c2V0X2Jzc190eXBlID0gQlNTX1RZUEVfSUJTUzsKLQkJZWxzZQotCQkJd2wtPnNldF9ic3NfdHlwZSA9IEJTU19UWVBFX1NUQV9CU1M7CiAJCWRvX2pvaW4gPSB0cnVlOwogCX0KIAorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSURMRSkgeworCQlyZXQgPSB3bDEyNzFfc3RhX2hhbmRsZV9pZGxlKHdsLCB3bHZpZiwgYnNzX2NvbmYtPmlkbGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXdsMTI3MV93YXJuaW5nKCJpZGxlIG1vZGUgY2hhbmdlIGZhaWxlZCAlZCIsIHJldCk7CisJfQorCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQ1FNKSkgewogCQlib29sIGVuYWJsZSA9IGZhbHNlOwogCQlpZiAoYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkKQogCQkJZW5hYmxlID0gdHJ1ZTsKLQkJcmV0ID0gd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHdsLCBlbmFibGUsCisJCXJldCA9IHdsMTI3MV9hY3hfcnNzaV9zbnJfdHJpZ2dlcih3bCwgd2x2aWYsIGVuYWJsZSwKIAkJCQkJCSAgYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkLAogCQkJCQkJICBic3NfY29uZi0+Y3FtX3Jzc2lfaHlzdCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCXdsLT5yc3NpX3Rob2xkID0gYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkOworCQl3bHZpZi0+cnNzaV90aG9sZCA9IGJzc19jb25mLT5jcW1fcnNzaV90aG9sZDsKIAl9CiAKLQlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgJiYKLQkgICAgLyoKLQkgICAgICogTm93IHdlIGtub3cgdGhlIGNvcnJlY3QgYnNzaWQsIHNvIHdlIHNlbmQgYSBuZXcgam9pbiBjb21tYW5kCi0JICAgICAqIGFuZCBlbmFibGUgdGhlIEJTU0lEIGZpbHRlcgotCSAgICAgKi8KLQkgICAgbWVtY21wKHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTikpIHsKLQkJbWVtY3B5KHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQkJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIod2wtPmJzc2lkKSkgewotCQkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9udWxsX2RhdGEod2wpOworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpCisJCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGJzc19jb25mLT5ic3NpZCkpIHsKKwkJCXJldCA9IHdsMTJ4eF9jbWRfYnVpbGRfbnVsbF9kYXRhKHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJcmV0ID0gd2wxMjcxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wpOworCQkJcmV0ID0gd2wxMjcxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wsIHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAogCQkJLyogTmVlZCB0byB1cGRhdGUgdGhlIEJTU0lEIChmb3IgZmlsdGVyaW5nIGV0YykgKi8KIAkJCWRvX2pvaW4gPSB0cnVlOwogCQl9Ci0JfQogCiAJaWYgKGNoYW5nZWQgJiAoQlNTX0NIQU5HRURfQVNTT0MgfCBCU1NfQ0hBTkdFRF9IVCkpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwpAQCAtMzQ1OSwyNiArMzY0MywyOCBAQAogCQlpZiAoYnNzX2NvbmYtPmFzc29jKSB7CiAJCQl1MzIgcmF0ZXM7CiAJCQlpbnQgaWVvZmZzZXQ7Ci0JCQl3bC0+YWlkID0gYnNzX2NvbmYtPmFpZDsKKwkJCXdsdmlmLT5haWQgPSBic3NfY29uZi0+YWlkOwogCQkJc2V0X2Fzc29jID0gdHJ1ZTsKIAotCQkJd2wtPnBzX3BvbGxfZmFpbHVyZXMgPSAwOworCQkJd2x2aWYtPnBzX3BvbGxfZmFpbHVyZXMgPSAwOwogCiAJCQkvKgogCQkJICogdXNlIGJhc2ljIHJhdGVzIGZyb20gQVAsIGFuZCBkZXRlcm1pbmUgbG93ZXN0IHJhdGUKIAkJCSAqIHRvIHVzZSB3aXRoIGNvbnRyb2wgZnJhbWVzLgogCQkJICovCiAJCQlyYXRlcyA9IGJzc19jb25mLT5iYXNpY19yYXRlczsKLQkJCXdsLT5iYXNpY19yYXRlX3NldCA9CisJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPQogCQkJCXdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCi0JCQkJCQkJICAgIHdsLT5iYW5kKTsKLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCQkJCQkJCSAgICB3bHZpZi0+YmFuZCk7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCQkJaWYgKHN0YV9yYXRlX3NldCkKLQkJCQl3bC0+cmF0ZV9zZXQgPSB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCisJCQkJd2x2aWYtPnJhdGVfc2V0ID0KKwkJCQkJd2wxMjcxX3R4X2VuYWJsZWRfcmF0ZXNfZ2V0KHdsLAogCQkJCQkJCQlzdGFfcmF0ZV9zZXQsCi0JCQkJCQkJCXdsLT5iYW5kKTsKLQkJCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wpOworCQkJCQkJCQl3bHZpZi0+YmFuZCk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIApAQCAtMzQ4OCw1MyArMzY3NCw1NiBAQAogCQkJICogdXBkYXRlcyBpdCBieSBpdHNlbGYgd2hlbiB0aGUgZmlyc3QgYmVhY29uIGlzCiAJCQkgKiByZWNlaXZlZCBhZnRlciBhIGpvaW4uCiAJCQkgKi8KLQkJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHNfcG9sbCh3bCwgd2wtPmFpZCk7CisJCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwod2wsIHdsdmlmLCB3bHZpZi0+YWlkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OwogCiAJCQkvKgogCQkJICogR2V0IGEgdGVtcGxhdGUgZm9yIGhhcmR3YXJlIGNvbm5lY3Rpb24gbWFpbnRlbmFuY2UKIAkJCSAqLwotCQkJZGV2X2tmcmVlX3NrYih3bC0+cHJvYmVyZXEpOwotCQkJd2wtPnByb2JlcmVxID0gd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsIE5VTEwpOworCQkJZGV2X2tmcmVlX3NrYih3bHZpZi0+cHJvYmVyZXEpOworCQkJd2x2aWYtPnByb2JlcmVxID0gd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsCisJCQkJCQkJCQl3bHZpZiwKKwkJCQkJCQkJCU5VTEwpOwogCQkJaWVvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCiAJCQkJCSAgICB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0JCQl3bDEyNzFfc3NpZF9zZXQod2wsIHdsLT5wcm9iZXJlcSwgaWVvZmZzZXQpOworCQkJd2wxMjcxX3NzaWRfc2V0KHZpZiwgd2x2aWYtPnByb2JlcmVxLCBpZW9mZnNldCk7CiAKIAkJCS8qIGVuYWJsZSB0aGUgY29ubmVjdGlvbiBtb25pdG9yaW5nIGZlYXR1cmUgKi8KLQkJCXJldCA9IHdsMTI3MV9hY3hfY29ubl9tb25pdF9wYXJhbXMod2wsIHRydWUpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyh3bCwgd2x2aWYsIHRydWUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQkvKiB1c2UgZGVmYXVsdHMgd2hlbiBub3QgYXNzb2NpYXRlZCAqLwogCQkJYm9vbCB3YXNfYXNzb2MgPQotCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELAotCQkJCQkJICZ3bC0+ZmxhZ3MpOworCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsCisJCQkJCQkgJndsdmlmLT5mbGFncyk7CiAJCQlib29sIHdhc19pZnVwID0KLQkJCSAgICAhIXRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19TVEFfU1RBVEVfU0VOVCwKLQkJCQkJCSAmd2wtPmZsYWdzKTsKLQkJCXdsLT5haWQgPSAwOworCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsCisJCQkJCQkgJndsdmlmLT5mbGFncyk7CisJCQl3bHZpZi0+YWlkID0gMDsKIAogCQkJLyogZnJlZSBwcm9iZS1yZXF1ZXN0IHRlbXBsYXRlICovCi0JCQlkZXZfa2ZyZWVfc2tiKHdsLT5wcm9iZXJlcSk7Ci0JCQl3bC0+cHJvYmVyZXEgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYih3bHZpZi0+cHJvYmVyZXEpOworCQkJd2x2aWYtPnByb2JlcmVxID0gTlVMTDsKIAogCQkJLyogcmUtZW5hYmxlIGR5bmFtaWMgcHMgLSBqdXN0IGluIGNhc2UgKi8KLQkJCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHdsLT52aWYpOworCQkJaWVlZTgwMjExX2VuYWJsZV9keW5fcHModmlmKTsKIAogCQkJLyogcmV2ZXJ0IGJhY2sgdG8gbWluaW11bSByYXRlcyBmb3IgdGhlIGN1cnJlbnQgYmFuZCAqLwotCQkJd2wxMjcxX3NldF9iYW5kX3JhdGUod2wpOwotCQkJd2wtPmJhc2ljX3JhdGUgPQotCQkJCXdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJCXdsMTI3MV9zZXRfYmFuZF9yYXRlKHdsLCB3bHZpZik7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAKIAkJCS8qIGRpc2FibGUgY29ubmVjdGlvbiBtb25pdG9yIGZlYXR1cmVzICovCi0JCQlyZXQgPSB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHdsLCBmYWxzZSk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHdsLCB3bHZpZiwgZmFsc2UpOwogCiAJCQkvKiBEaXNhYmxlIHRoZSBrZWVwLWFsaXZlIGZlYXR1cmUgKi8KLQkJCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHdsLCBmYWxzZSk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfbW9kZSh3bCwgd2x2aWYsIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OwogCkBAIC0zNTQ2LDcgKzM3MzUsNyBAQAogCQkJCSAqIG5vIElGX09QRVJfVVAgbm90aWZpY2F0aW9uLgogCQkJCSAqLwogCQkJCWlmICghd2FzX2lmdXApIHsKLQkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsLT5yb2xlX2lkKTsKKwkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsdmlmLT5yb2xlX2lkKTsKIAkJCQkJaWYgKHJldCA8IDApCiAJCQkJCQlnb3RvIG91dDsKIAkJCQl9CkBAIC0zNTU1LDE3ICszNzQ0LDE2IEBACiAJCQkJICogcm9hbWluZyBvbiB0aGUgc2FtZSBjaGFubmVsLiB1bnRpbCB3ZSB3aWxsCiAJCQkJICogaGF2ZSBhIGJldHRlciBmbG93Li4uKQogCQkJCSAqLwotCQkJCWlmICh0ZXN0X2JpdCh3bC0+ZGV2X3JvbGVfaWQsIHdsLT5yb2NfbWFwKSkgewotCQkJCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKKwkJCQlpZiAodGVzdF9iaXQod2x2aWYtPmRldl9yb2xlX2lkLCB3bC0+cm9jX21hcCkpIHsKKwkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsCisJCQkJCQkJICB3bHZpZi0+ZGV2X3JvbGVfaWQpOwogCQkJCQlpZiAocmV0IDwgMCkKIAkJCQkJCWdvdG8gb3V0OwogCQkJCX0KIAotCQkJCXdsMTI3MV91bmpvaW4od2wpOwotCQkJCWlmICghKGNvbmZfZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKSkgewotCQkJCQl3bDEyeHhfY21kX3JvbGVfc3RhcnRfZGV2KHdsKTsKLQkJCQkJd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCQl9CisJCQkJd2wxMjcxX3Vuam9pbih3bCwgd2x2aWYpOworCQkJCWlmICghKGNvbmZfZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKSkKKwkJCQkJd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOwogCQkJfQogCQl9CiAJfQpAQCAtMzU3NiwyNyArMzc2NCwyOCBAQAogCiAJCWlmIChic3NfY29uZi0+aWJzc19qb2luZWQpIHsKIAkJCXUzMiByYXRlcyA9IGJzc19jb25mLT5iYXNpY19yYXRlczsKLQkJCXdsLT5iYXNpY19yYXRlX3NldCA9CisJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPQogCQkJCXdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCi0JCQkJCQkJICAgIHdsLT5iYW5kKTsKLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCQkJCQkJCSAgICB3bHZpZi0+YmFuZCk7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCiAJCQkvKiBieSBkZWZhdWx0LCB1c2UgMTFiICsgT0ZETSByYXRlcyAqLwotCQkJd2wtPnJhdGVfc2V0ID0gQ09ORl9UWF9JQlNTX0RFRkFVTFRfUkFURVM7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJCXdsdmlmLT5yYXRlX3NldCA9IENPTkZfVFhfSUJTU19ERUZBVUxUX1JBVEVTOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlyZXQgPSB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQod2wsIGJzc19jb25mLCBjaGFuZ2VkKTsKKwlyZXQgPSB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQod2wsIHZpZiwgYnNzX2NvbmYsIGNoYW5nZWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVJQX0ZJTFRFUikgewogCQlfX2JlMzIgYWRkciA9IGJzc19jb25mLT5hcnBfYWRkcl9saXN0WzBdOwotCQlXQVJOX09OKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKTsKKwkJV0FSTl9PTih3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUyk7CiAKIAkJaWYgKGJzc19jb25mLT5hcnBfYWRkcl9jbnQgPT0gMSAmJgogCQkgICAgYnNzX2NvbmYtPmFycF9maWx0ZXJfZW5hYmxlZCkgewpAQCAtMzYwNiwyNCArMzc5NSwyNCBAQAogCQkJICogaXNuJ3QgYmVpbmcgc2V0ICh3aGVuIHNlbmRpbmcpLCBzbyB3ZSBoYXZlIHRvCiAJCQkgKiByZWNvbmZpZ3VyZSB0aGUgdGVtcGxhdGUgdXBvbiBldmVyeSBpcCBjaGFuZ2UuCiAJCQkgKi8KLQkJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfYXJwX3JzcCh3bCwgYWRkcik7CisJCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aod2wsIHdsdmlmLCBhZGRyKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJd2wxMjcxX3dhcm5pbmcoImJ1aWxkIGFycCByc3AgZmFpbGVkOiAlZCIsIHJldCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCXJldCA9IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcih3bCwKKwkJCXJldCA9IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcih3bCwgd2x2aWYsCiAJCQkJQUNYX0FSUF9GSUxURVJfQVJQX0ZJTFRFUklORywKIAkJCQlhZGRyKTsKIAkJfSBlbHNlCi0JCQlyZXQgPSB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIod2wsIDAsIGFkZHIpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHdsLCB3bHZpZiwgMCwgYWRkcik7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoZG9fam9pbikgewotCQlyZXQgPSB3bDEyNzFfam9pbih3bCwgc2V0X2Fzc29jKTsKKwkJcmV0ID0gd2wxMjcxX2pvaW4od2wsIHdsdmlmLCBzZXRfYXNzb2MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoImNtZCBqb2luIGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTM2MzEsMzUgKzM4MjAsMzEgQEAKIAogCQkvKiBST0MgdW50aWwgY29ubmVjdGVkIChhZnRlciBFQVBPTCBleGNoYW5nZSkgKi8KIAkJaWYgKCFpc19pYnNzKSB7Ci0JCQlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bC0+cm9sZV9pZCk7CisJCQlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bHZpZiwgd2x2aWYtPnJvbGVfaWQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAKLQkJCXdsMTI3MV9jaGVja19vcGVyc3RhdGUod2wsCisJCQl3bDEyNzFfY2hlY2tfb3BlcnN0YXRlKHdsLCB3bHZpZiwKIAkJCQkJICAgICAgIGllZWU4MDIxMV9nZXRfb3BlcnN0YXRlKHZpZikpOwogCQl9CiAJCS8qCiAJCSAqIHN0b3AgZGV2aWNlIHJvbGUgaWYgc3RhcnRlZCAod2UgbWlnaHQgYWxyZWFkeSBiZSBpbgogCQkgKiBTVEEgcm9sZSkuIFRPRE86IG1ha2UgaXQgYmV0dGVyLgogCQkgKi8KLQkJaWYgKHdsLT5kZXZfcm9sZV9pZCAhPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEKSB7Ci0JCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCi0JCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wpOworCQlpZiAod2x2aWYtPmRldl9yb2xlX2lkICE9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQpIHsKKwkJCXJldCA9IHdsMTJ4eF9zdG9wX2Rldih3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBJZiB3ZSB3YW50IHRvIGdvIGluIFBTTSBidXQgd2UncmUgbm90IHRoZXJlIHlldCAqLwotCQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsLT5mbGFncykgJiYKLQkJICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpICYmCisJCSAgICAhdGVzdF9iaXQoV0xWSUZfRkxBR19QU00sICZ3bHZpZi0+ZmxhZ3MpKSB7CiAJCQllbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlOwogCiAJCQltb2RlID0gU1RBVElPTl9QT1dFUl9TQVZFX01PREU7Ci0JCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIG1vZGUsCi0JCQkJCQkgd2wtPmJhc2ljX3JhdGUsCisJCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLCBtb2RlLAorCQkJCQkJIHdsdmlmLT5iYXNpY19yYXRlLAogCQkJCQkJIHRydWUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CkBAIC0zNjczLDcgKzM4NTgsNyBAQAogCQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfaHRfY2FwYWJpbGl0aWVzKHdsLAogCQkJCQkJCSAgICAgJnN0YV9odF9jYXAsCiAJCQkJCQkJICAgICB0cnVlLAotCQkJCQkJCSAgICAgd2wtPnN0YV9obGlkKTsKKwkJCQkJCQkgICAgIHdsdmlmLT5zdGEuaGxpZCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCXdsMTI3MV93YXJuaW5nKCJTZXQgaHQgY2FwIHRydWUgZmFpbGVkICVkIiwKIAkJCQkJICAgICAgIHJldCk7CkBAIC0zNjg1LDcgKzM4NzAsNyBAQAogCQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfaHRfY2FwYWJpbGl0aWVzKHdsLAogCQkJCQkJCSAgICAgJnN0YV9odF9jYXAsCiAJCQkJCQkJICAgICBmYWxzZSwKLQkJCQkJCQkgICAgIHdsLT5zdGFfaGxpZCk7CisJCQkJCQkJICAgICB3bHZpZi0+c3RhLmhsaWQpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQl3bDEyNzFfd2FybmluZygiU2V0IGh0IGNhcCBmYWxzZSBmYWlsZWQgJWQiLAogCQkJCQkgICAgICAgcmV0KTsKQEAgLTM2OTcsNyArMzg4Miw3IEBACiAJLyogSGFuZGxlIEhUIGluZm9ybWF0aW9uIGNoYW5nZS4gRG9uZSBhZnRlciBqb2luLiAqLwogCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0hUKSAmJgogCSAgICAoYnNzX2NvbmYtPmNoYW5uZWxfdHlwZSAhPSBOTDgwMjExX0NIQU5fTk9fSFQpKSB7Ci0JCXJldCA9IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHdsLAorCQlyZXQgPSB3bDEyNzFfYWN4X3NldF9odF9pbmZvcm1hdGlvbih3bCwgd2x2aWYsCiAJCQkJCWJzc19jb25mLT5odF9vcGVyYXRpb25fbW9kZSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQl3bDEyNzFfd2FybmluZygiU2V0IGh0IGluZm9ybWF0aW9uIGZhaWxlZCAlZCIsIHJldCk7CkBAIC0zNzE1LDcgKzM5MDAsOCBAQAogCQkJCSAgICAgICB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKIAlpbnQgcmV0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgYnNzIGluZm8gY2hhbmdlZCAweCV4IiwKQEAgLTM3MjYsNiArMzkxMiw5IEBACiAJaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkKIAkJZ290byBvdXQ7CiAKKwlpZiAodW5saWtlbHkoIXRlc3RfYml0KFdMVklGX0ZMQUdfSU5JVElBTElaRUQsICZ3bHZpZi0+ZmxhZ3MpKSkKKwkJZ290byBvdXQ7CisKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzc0Niw2ICszOTM1LDcgQEAKIAkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCXU4IHBzX3NjaGVtZTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMzc5MiwxMyArMzk4MiwxMyBAQAogCSAqIHRoZSB0eG9wIGlzIGNvbmZlZCBpbiB1bml0cyBvZiAzMnVzIGJ5IHRoZSBtYWM4MDIxMSwKIAkgKiB3ZSBuZWVkIHVzCiAJICovCi0JcmV0ID0gd2wxMjcxX2FjeF9hY19jZmcod2wsIHdsMTI3MV90eF9nZXRfcXVldWUocXVldWUpLAorCXJldCA9IHdsMTI3MV9hY3hfYWNfY2ZnKHdsLCB3bHZpZiwgd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSksCiAJCQkJcGFyYW1zLT5jd19taW4sIHBhcmFtcy0+Y3dfbWF4LAogCQkJCXBhcmFtcy0+YWlmcywgcGFyYW1zLT50eG9wIDw8IDUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zbGVlcDsKIAotCXJldCA9IHdsMTI3MV9hY3hfdGlkX2NmZyh3bCwgd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSksCisJcmV0ID0gd2wxMjcxX2FjeF90aWRfY2ZnKHdsLCB3bHZpZiwgd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSksCiAJCQkJIENPTkZfQ0hBTk5FTF9UWVBFX0VEQ0YsCiAJCQkJIHdsMTI3MV90eF9nZXRfcXVldWUocXVldWUpLAogCQkJCSBwc19zY2hlbWUsIENPTkZfQUNLX1BPTElDWV9MRUdBQ1ksCkBAIC0zODYxLDQzICs0MDUxLDQzIEBACiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX2FsbG9jYXRlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgdTggKmhsaWQpCisJCQkgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKndsX3N0YTsKLQlpbnQgaWQ7CisJaW50IHJldDsKIAotCWlkID0gZmluZF9maXJzdF96ZXJvX2JpdCh3bC0+YXBfaGxpZF9tYXAsIEFQX01BWF9TVEFUSU9OUyk7Ci0JaWYgKGlkID49IEFQX01BWF9TVEFUSU9OUykgeworCisJaWYgKHdsLT5hY3RpdmVfc3RhX2NvdW50ID49IEFQX01BWF9TVEFUSU9OUykgewogCQl3bDEyNzFfd2FybmluZygiY291bGQgbm90IGFsbG9jYXRlIEhMSUQgLSB0b28gbXVjaCBzdGF0aW9ucyIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OwotCXNldF9iaXQoaWQsIHdsLT5hcF9obGlkX21hcCk7Ci0Jd2xfc3RhLT5obGlkID0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUICsgaWQ7Ci0JKmhsaWQgPSB3bF9zdGEtPmhsaWQ7CisJcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsIHdsdmlmLCAmd2xfc3RhLT5obGlkKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfd2FybmluZygiY291bGQgbm90IGFsbG9jYXRlIEhMSUQgLSB0b28gbWFueSBsaW5rcyIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNldF9iaXQod2xfc3RhLT5obGlkLCB3bHZpZi0+YXAuc3RhX2hsaWRfbWFwKTsKIAltZW1jcHkod2wtPmxpbmtzW3dsX3N0YS0+aGxpZF0uYWRkciwgc3RhLT5hZGRyLCBFVEhfQUxFTik7CiAJd2wtPmFjdGl2ZV9zdGFfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bDEyNzFfZnJlZV9zdGEoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpCit2b2lkIHdsMTI3MV9mcmVlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCBobGlkKQogewotCWludCBpZCA9IGhsaWQgLSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQ7Ci0KLQlpZiAoaGxpZCA8IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCkKKwlpZiAoIXRlc3RfYml0KGhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXApKQogCQlyZXR1cm47CiAKLQlpZiAoIXRlc3RfYml0KGlkLCB3bC0+YXBfaGxpZF9tYXApKQotCQlyZXR1cm47Ci0KLQljbGVhcl9iaXQoaWQsIHdsLT5hcF9obGlkX21hcCk7CisJY2xlYXJfYml0KGhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXApOwogCW1lbXNldCh3bC0+bGlua3NbaGxpZF0uYWRkciwgMCwgRVRIX0FMRU4pOwogCXdsLT5saW5rc1tobGlkXS5iYV9iaXRtYXAgPSAwOwogCXdsMTI3MV90eF9yZXNldF9saW5rX3F1ZXVlcyh3bCwgaGxpZCk7CiAJX19jbGVhcl9iaXQoaGxpZCwgJndsLT5hcF9wc19tYXApOwogCV9fY2xlYXJfYml0KGhsaWQsICh1bnNpZ25lZCBsb25nICopJndsLT5hcF9md19wc19tYXApOworCXdsMTJ4eF9mcmVlX2xpbmsod2wsIHdsdmlmLCAmaGxpZCk7CiAJd2wtPmFjdGl2ZV9zdGFfY291bnQtLTsKIH0KIApAQCAtMzkwNiw2ICs0MDk2LDggQEAKIAkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCXN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqd2xfc3RhOwogCWludCByZXQgPSAwOwogCXU4IGhsaWQ7CiAKQEAgLTM5MTQsMjAgKzQxMDYsMjMgQEAKIAlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQogCQlnb3RvIG91dDsKIAotCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKQorCWlmICh3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKQogCQlnb3RvIG91dDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGFkZCBzdGEgJWQiLCAoaW50KXN0YS0+YWlkKTsKIAotCXJldCA9IHdsMTI3MV9hbGxvY2F0ZV9zdGEod2wsIHN0YSwgJmhsaWQpOworCXJldCA9IHdsMTI3MV9hbGxvY2F0ZV9zdGEod2wsIHdsdmlmLCBzdGEpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAorCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OworCWhsaWQgPSB3bF9zdGEtPmhsaWQ7CisKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfc3RhOwogCi0JcmV0ID0gd2wxMnh4X2NtZF9hZGRfcGVlcih3bCwgc3RhLCBobGlkKTsKKwlyZXQgPSB3bDEyeHhfY21kX2FkZF9wZWVyKHdsLCB3bHZpZiwgc3RhLCBobGlkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2xlZXA7CiAKQEAgLTM5NDQsNyArNDEzOSw3IEBACiAKIG91dF9mcmVlX3N0YToKIAlpZiAocmV0IDwgMCkKLQkJd2wxMjcxX2ZyZWVfc3RhKHdsLCBobGlkKTsKKwkJd2wxMjcxX2ZyZWVfc3RhKHdsLCB3bHZpZiwgaGxpZCk7CiAKIG91dDoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CkBAIC0zOTU2LDYgKzQxNTEsNyBAQAogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKndsX3N0YTsKIAlpbnQgcmV0ID0gMCwgaWQ7CiAKQEAgLTM5NjQsMTQgKzQxNjAsMTQgQEAKIAlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQogCQlnb3RvIG91dDsKIAotCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKQorCWlmICh3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKQogCQlnb3RvIG91dDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHJlbW92ZSBzdGEgJWQiLCAoaW50KXN0YS0+YWlkKTsKIAogCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OwotCWlkID0gd2xfc3RhLT5obGlkIC0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUOwotCWlmIChXQVJOX09OKCF0ZXN0X2JpdChpZCwgd2wtPmFwX2hsaWRfbWFwKSkpCisJaWQgPSB3bF9zdGEtPmhsaWQ7CisJaWYgKFdBUk5fT04oIXRlc3RfYml0KGlkLCB3bHZpZi0+YXAuc3RhX2hsaWRfbWFwKSkpCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwpAQCAtMzk4Miw3ICs0MTc4LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2xlZXA7CiAKLQl3bDEyNzFfZnJlZV9zdGEod2wsIHdsX3N0YS0+aGxpZCk7CisJd2wxMjcxX2ZyZWVfc3RhKHdsLCB3bHZpZiwgd2xfc3RhLT5obGlkKTsKIAogb3V0X3NsZWVwOgogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwpAQCAtMzk5OSw2ICs0MTk1LDcgQEAKIAkJCQkgIHU4IGJ1Zl9zaXplKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldDsKIAl1OCBobGlkLCAqYmFfYml0bWFwOwogCkBAIC00MDE2LDEwICs0MjEzLDEwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykgewotCQlobGlkID0gd2wtPnN0YV9obGlkOwotCQliYV9iaXRtYXAgPSAmd2wtPmJhX3J4X2JpdG1hcDsKLQl9IGVsc2UgaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpIHsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpIHsKKwkJaGxpZCA9IHdsdmlmLT5zdGEuaGxpZDsKKwkJYmFfYml0bWFwID0gJndsdmlmLT5zdGEuYmFfcnhfYml0bWFwOworCX0gZWxzZSBpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykgewogCQlzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKndsX3N0YTsKIAogCQl3bF9zdGEgPSAoc3RydWN0IHdsMTI3MV9zdGF0aW9uICopc3RhLT5kcnZfcHJpdjsKQEAgLTQwMzksNyArNDIzNiw3IEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgotCQlpZiAoIXdsLT5iYV9zdXBwb3J0IHx8ICF3bC0+YmFfYWxsb3dlZCkgeworCQlpZiAoIXdsdmlmLT5iYV9zdXBwb3J0IHx8ICF3bHZpZi0+YmFfYWxsb3dlZCkgewogCQkJcmV0ID0gLUVOT1RTVVBQOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQxMDgsOCArNDMwNSw5IEBACiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrICptYXNrKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7Ci0JaW50IGk7CisJaW50IGksIHJldCA9IDA7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBzZXRfYml0cmF0ZV9tYXNrIDB4JXggMHgleCIsCiAJCW1hc2stPmNvbnRyb2xbTkw4MDIxMV9CQU5EXzJHSFpdLmxlZ2FjeSwKQEAgLTQxMTgsMTkgKzQzMTYsMzkgQEAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCiAJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGkrKykKLQkJd2wtPmJpdHJhdGVfbWFza3NbaV0gPQorCQl3bHZpZi0+Yml0cmF0ZV9tYXNrc1tpXSA9CiAJCQl3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCiAJCQkJCQkgICAgbWFzay0+Y29udHJvbFtpXS5sZWdhY3ksCiAJCQkJCQkgICAgaSk7CisKKwlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQorCQlnb3RvIG91dDsKKworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyAmJgorCSAgICAhdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpIHsKKworCQlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJd2wxMjcxX3NldF9iYW5kX3JhdGUod2wsIHdsdmlmKTsKKwkJd2x2aWYtPmJhc2ljX3JhdGUgPQorCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCwgd2x2aWYpOworCisJCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworCX0KK291dDoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB3bDEyeHhfb3BfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGNoYW5uZWwgc3dpdGNoIik7CkBAIC00MTM4LDE5ICs0MzU2LDI0IEBACiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAogCWlmICh1bmxpa2VseSh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSh3bC0+dmlmLCBmYWxzZSk7Ci0JCXJldHVybjsKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKHZpZiwgZmFsc2UpOworCQl9CisJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyeHhfY21kX2NoYW5uZWxfc3dpdGNoKHdsLCBjaF9zd2l0Y2gpOworCS8qIFRPRE86IGNoYW5nZSBtYWM4MDIxMSB0byBwYXNzIHZpZiBhcyBwYXJhbSAqLworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCXJldCA9IHdsMTJ4eF9jbWRfY2hhbm5lbF9zd2l0Y2god2wsIGNoX3N3aXRjaCk7CiAKLQlpZiAoIXJldCkKLQkJc2V0X2JpdChXTDEyNzFfRkxBR19DU19QUk9HUkVTUywgJndsLT5mbGFncyk7CisJCWlmICghcmV0KQorCQkJc2V0X2JpdChXTFZJRl9GTEFHX0NTX1BST0dSRVNTLCAmd2x2aWYtPmZsYWdzKTsKKwl9CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIApAQCAtNDE3MCwxMCArNDM5Myw2IEBACiAKIAkvKiBwYWNrZXRzIGFyZSBjb25zaWRlcmVkIHBlbmRpbmcgaWYgaW4gdGhlIFRYIHF1ZXVlIG9yIHRoZSBGVyAqLwogCXJldCA9ICh3bDEyNzFfdHhfdG90YWxfcXVldWVfY291bnQod2wpID4gMCkgfHwgKHdsLT50eF9mcmFtZXNfY250ID4gMCk7Ci0KLQkvKiB0aGUgYWJvdmUgaXMgYXBwcm9wcmlhdGUgZm9yIFNUQSBtb2RlIGZvciBQUyBwdXJwb3NlcyAqLwotCVdBUk5fT04od2wtPmJzc190eXBlICE9IEJTU19UWVBFX1NUQV9CU1MpOwotCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCkBAIC00NjA0LDcgKzQ4MjMsNyBAQAogCS5yZWFkID0gd2wxMjcxX3N5c2ZzX3JlYWRfZndsb2csCiB9OwogCi1pbnQgd2wxMjcxX3JlZ2lzdGVyX2h3KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfcmVnaXN0ZXJfaHcoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaW50IHJldDsKIApAQCAtNDY0NSw5ICs0ODY0LDggQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX3JlZ2lzdGVyX2h3KTsKIAotdm9pZCB3bDEyNzFfdW5yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyB2b2lkIHdsMTI3MV91bnJlZ2lzdGVyX2h3KHN0cnVjdCB3bDEyNzEgKndsKQogewogCWlmICh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX1BMVCkKIAkJX193bDEyNzFfcGx0X3N0b3Aod2wpOwpAQCAtNDY1Nyw5ICs0ODc1LDggQEAKIAl3bC0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IGZhbHNlOwogCiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bDEyNzFfdW5yZWdpc3Rlcl9odyk7CiAKLWludCB3bDEyNzFfaW5pdF9pZWVlODAyMTEoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9pbml0X2llZWU4MDIxMShzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlzdGF0aWMgY29uc3QgdTMyIGNpcGhlcl9zdWl0ZXNbXSA9IHsKIAkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsCkBAIC00NzM2LDI3ICs0OTUzLDMzIEBACiAKIAl3bC0+aHctPndpcGh5LT5yZWdfbm90aWZpZXIgPSB3bDEyNzFfcmVnX25vdGlmeTsKIAotCVNFVF9JRUVFODAyMTFfREVWKHdsLT5odywgd2wxMjcxX3dsX3RvX2Rldih3bCkpOworCS8qIHRoZSBGVyBhbnN3ZXJzIHByb2JlLXJlcXVlc3RzIGluIEFQLW1vZGUgKi8KKwl3bC0+aHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRDsKKwl3bC0+aHctPndpcGh5LT5wcm9iZV9yZXNwX29mZmxvYWQgPQorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUyB8CisJCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfV1BTMiB8CisJCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQOworCisJU0VUX0lFRUU4MDIxMV9ERVYod2wtPmh3LCB3bC0+ZGV2KTsKIAogCXdsLT5ody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24pOworCXdsLT5ody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2wxMnh4X3ZpZik7CiAKIAl3bC0+aHctPm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMgPSA4OwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bDEyNzFfaW5pdF9pZWVlODAyMTEpOwogCiAjZGVmaW5lIFdMMTI3MV9ERUZBVUxUX0NIQU5ORUwgMAogCi1zdHJ1Y3QgaWVlZTgwMjExX2h3ICp3bDEyNzFfYWxsb2NfaHcodm9pZCkKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2h3ICp3bDEyNzFfYWxsb2NfaHcodm9pZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldiA9IE5VTEw7CiAJc3RydWN0IHdsMTI3MSAqd2w7CiAJaW50IGksIGosIHJldDsKIAl1bnNpZ25lZCBpbnQgb3JkZXI7CiAKLQlCVUlMRF9CVUdfT04oQVBfTUFYX0xJTktTID4gV0wxMlhYX01BWF9MSU5LUyk7CisJQlVJTERfQlVHX09OKEFQX01BWF9TVEFUSU9OUyA+IFdMMTJYWF9NQVhfTElOS1MpOwogCiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCp3bCksICZ3bDEyNzFfb3BzKTsKIAlpZiAoIWh3KSB7CkBAIC00NzY1LDQxICs0OTg4LDI2IEBACiAJCWdvdG8gZXJyX2h3X2FsbG9jOwogCX0KIAotCXBsYXRfZGV2ID0ga21lbWR1cCgmd2wxMjcxX2RldmljZSwgc2l6ZW9mKHdsMTI3MV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBsYXRfZGV2KSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIHBsYXRmb3JtX2RldmljZSIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wbGF0X2FsbG9jOwotCX0KLQogCXdsID0gaHctPnByaXY7CiAJbWVtc2V0KHdsLCAwLCBzaXplb2YoKndsKSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmd2wtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZ3bC0+d2x2aWZfbGlzdCk7CiAKIAl3bC0+aHcgPSBodzsKLQl3bC0+cGxhdF9kZXYgPSBwbGF0X2RldjsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspCi0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJndsLT50eF9xdWV1ZVtpXSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgQVBfTUFYX0xJTktTOyBqKyspCisJCWZvciAoaiA9IDA7IGogPCBXTDEyWFhfTUFYX0xJTktTOyBqKyspCiAJCQlza2JfcXVldWVfaGVhZF9pbml0KCZ3bC0+bGlua3Nbal0udHhfcXVldWVbaV0pOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2wtPmRlZmVycmVkX3J4X3F1ZXVlKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZ3bC0+ZGVmZXJyZWRfdHhfcXVldWUpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJndsLT5lbHBfd29yaywgd2wxMjcxX2VscF93b3JrKTsKLQlJTklUX0RFTEFZRURfV09SSygmd2wtPnBzcG9sbF93b3JrLCB3bDEyNzFfcHNwb2xsX3dvcmspOwogCUlOSVRfV09SSygmd2wtPm5ldHN0YWNrX3dvcmssIHdsMTI3MV9uZXRzdGFja193b3JrKTsKIAlJTklUX1dPUksoJndsLT50eF93b3JrLCB3bDEyNzFfdHhfd29yayk7CiAJSU5JVF9XT1JLKCZ3bC0+cmVjb3Zlcnlfd29yaywgd2wxMjcxX3JlY292ZXJ5X3dvcmspOwogCUlOSVRfREVMQVlFRF9XT1JLKCZ3bC0+c2Nhbl9jb21wbGV0ZV93b3JrLCB3bDEyNzFfc2Nhbl9jb21wbGV0ZV93b3JrKTsKLQlJTklUX1dPUksoJndsLT5yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmssCi0JCSAgd2wxMjcxX3J4X3N0cmVhbWluZ19lbmFibGVfd29yayk7Ci0JSU5JVF9XT1JLKCZ3bC0+cnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yaywKLQkJICB3bDEyNzFfcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CiAKIAl3bC0+ZnJlZXphYmxlX3dxID0gY3JlYXRlX2ZyZWV6YWJsZV93b3JrcXVldWUoIndsMTJ4eF93cSIpOwogCWlmICghd2wtPmZyZWV6YWJsZV93cSkgewpAQCAtNDgwOCw0MSArNTAxNiwyMSBAQAogCX0KIAogCXdsLT5jaGFubmVsID0gV0wxMjcxX0RFRkFVTFRfQ0hBTk5FTDsKLQl3bC0+YmVhY29uX2ludCA9IFdMMTI3MV9ERUZBVUxUX0JFQUNPTl9JTlQ7Ci0Jd2wtPmRlZmF1bHRfa2V5ID0gMDsKIAl3bC0+cnhfY291bnRlciA9IDA7Ci0Jd2wtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CiAJd2wtPnBvd2VyX2xldmVsID0gV0wxMjcxX0RFRkFVTFRfUE9XRVJfTEVWRUw7Ci0Jd2wtPmJhc2ljX3JhdGVfc2V0ID0gQ09ORl9UWF9SQVRFX01BU0tfQkFTSUM7Ci0Jd2wtPmJhc2ljX3JhdGUgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKLQl3bC0+cmF0ZV9zZXQgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKIAl3bC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CiAJd2wtPnZpZiA9IE5VTEw7CiAJd2wtPmZsYWdzID0gMDsKIAl3bC0+c2dfZW5hYmxlZCA9IHRydWU7CiAJd2wtPmh3X3BnX3ZlciA9IC0xOwotCXdsLT5ic3NfdHlwZSA9IE1BWF9CU1NfVFlQRTsKLQl3bC0+c2V0X2Jzc190eXBlID0gTUFYX0JTU19UWVBFOwotCXdsLT5sYXN0X3R4X2hsaWQgPSAwOwogCXdsLT5hcF9wc19tYXAgPSAwOwogCXdsLT5hcF9md19wc19tYXAgPSAwOwogCXdsLT5xdWlya3MgPSAwOwogCXdsLT5wbGF0Zm9ybV9xdWlya3MgPSAwOwogCXdsLT5zY2hlZF9zY2FubmluZyA9IGZhbHNlOwotCXdsLT50eF9zZWN1cml0eV9zZXEgPSAwOwotCXdsLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IgPSAwOwogCXdsLT50eF9zcGFyZV9ibG9ja3MgPSBUWF9IV19CTE9DS19TUEFSRV9ERUZBVUxUOwotCXdsLT5yb2xlX2lkID0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRDsKIAl3bC0+c3lzdGVtX2hsaWQgPSBXTDEyWFhfU1lTVEVNX0hMSUQ7Ci0Jd2wtPnN0YV9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKLQl3bC0+ZGV2X3JvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOwotCXdsLT5kZXZfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7Ci0Jd2wtPnNlc3Npb25fY291bnRlciA9IDA7Ci0Jd2wtPmFwX2JjYXN0X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5hcF9nbG9iYWxfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CiAJd2wtPmFjdGl2ZV9zdGFfY291bnQgPSAwOwotCXNldHVwX3RpbWVyKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyLCB3bDEyNzFfcnhfc3RyZWFtaW5nX3RpbWVyLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHdsKTsKIAl3bC0+Zndsb2dfc2l6ZSA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2wtPmZ3bG9nX3dhaXRxKTsKIApAQCAtNDg2MCw4ICs1MDQ4LDYgQEAKIAogCS8qIEFwcGx5IGRlZmF1bHQgZHJpdmVyIGNvbmZpZ3VyYXRpb24uICovCiAJd2wxMjcxX2NvbmZfaW5pdCh3bCk7Ci0Jd2wtPmJpdHJhdGVfbWFza3NbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSB3bC0+Y29uZi50eC5iYXNpY19yYXRlOwotCXdsLT5iaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZV81OwogCiAJb3JkZXIgPSBnZXRfb3JkZXIoV0wxMjcxX0FHR1JfQlVGRkVSX1NJWkUpOwogCXdsLT5hZ2dyX2J1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOwpAQCAtNDg4Myw0OSArNTA2OSw4IEBACiAJCWdvdG8gZXJyX2R1bW15X3BhY2tldDsKIAl9CiAKLQkvKiBSZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2UgKi8KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIod2wtPnBsYXRfZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGRuJ3QgcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlIik7Ci0JCWdvdG8gZXJyX2Z3bG9nOwotCX0KLQlkZXZfc2V0X2RydmRhdGEoJndsLT5wbGF0X2Rldi0+ZGV2LCB3bCk7Ci0KLQkvKiBDcmVhdGUgc3lzZnMgZmlsZSB0byBjb250cm9sIGJ0IGNvZXggc3RhdGUgKi8KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgYnRfY29leF9zdGF0ZSIpOwotCQlnb3RvIGVycl9wbGF0Zm9ybTsKLQl9Ci0KLQkvKiBDcmVhdGUgc3lzZnMgZmlsZSB0byBnZXQgSFcgUEcgdmVyc2lvbiAqLwotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZkZXZfYXR0cl9od19wZ192ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlIGh3X3BnX3ZlciIpOwotCQlnb3RvIGVycl9idF9jb2V4X3N0YXRlOwotCX0KLQotCS8qIENyZWF0ZSBzeXNmcyBmaWxlIGZvciB0aGUgRlcgbG9nICovCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZmd2xvZ19hdHRyKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBmd2xvZyIpOwotCQlnb3RvIGVycl9od19wZ192ZXI7Ci0JfQotCiAJcmV0dXJuIGh3OwogCi1lcnJfaHdfcGdfdmVyOgotCWRldmljZV9yZW1vdmVfZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZkZXZfYXR0cl9od19wZ192ZXIpOwotCi1lcnJfYnRfY29leF9zdGF0ZToKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7Ci0KLWVycl9wbGF0Zm9ybToKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bC0+cGxhdF9kZXYpOwotCi1lcnJfZndsb2c6Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXdsLT5md2xvZyk7Ci0KIGVycl9kdW1teV9wYWNrZXQ6CiAJZGV2X2tmcmVlX3NrYih3bC0+ZHVtbXlfcGFja2V0KTsKIApAQCAtNDkzNywxOCArNTA4MiwxNCBAQAogCiBlcnJfaHc6CiAJd2wxMjcxX2RlYnVnZnNfZXhpdCh3bCk7Ci0Ja2ZyZWUocGxhdF9kZXYpOwotCi1lcnJfcGxhdF9hbGxvYzoKIAlpZWVlODAyMTFfZnJlZV9odyhodyk7CiAKIGVycl9od19hbGxvYzoKIAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bDEyNzFfYWxsb2NfaHcpOwogCi1pbnQgd2wxMjcxX2ZyZWVfaHcoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9mcmVlX2h3KHN0cnVjdCB3bDEyNzEgKndsKQogewogCS8qIFVuYmxvY2sgYW55IGZ3bG9nIHJlYWRlcnMgKi8KIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwpAQCAtNDk1NiwxNyArNTA5NywxNSBAQAogCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJndsLT5md2xvZ193YWl0cSk7CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZmd2xvZ19hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKHdsLT5kZXYsICZmd2xvZ19hdHRyKTsKIAotCWRldmljZV9yZW1vdmVfZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZkZXZfYXR0cl9od19wZ192ZXIpOworCWRldmljZV9yZW1vdmVfZmlsZSh3bC0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKIAotCWRldmljZV9yZW1vdmVfZmlsZSgmd2wtPnBsYXRfZGV2LT5kZXYsICZkZXZfYXR0cl9idF9jb2V4X3N0YXRlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bC0+cGxhdF9kZXYpOworCWRldmljZV9yZW1vdmVfZmlsZSh3bC0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXdsLT5md2xvZyk7CiAJZGV2X2tmcmVlX3NrYih3bC0+ZHVtbXlfcGFja2V0KTsKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXdsLT5hZ2dyX2J1ZiwKIAkJCWdldF9vcmRlcihXTDEyNzFfQUdHUl9CVUZGRVJfU0laRSkpOwotCWtmcmVlKHdsLT5wbGF0X2Rldik7CiAKIAl3bDEyNzFfZGVidWdmc19leGl0KHdsKTsKIApAQCAtNDk4Myw3ICs1MTIyLDE3NCBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bDEyNzFfZnJlZV9odyk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bDEyeHhfaGFyZGlycShpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBjb29raWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdsMTI3MV9kZWJ1ZyhERUJVR19JUlEsICJJUlEiKTsKKworCS8qIGNvbXBsZXRlIHRoZSBFTFAgY29tcGxldGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOworCXNldF9iaXQoV0wxMjcxX0ZMQUdfSVJRX1JVTk5JTkcsICZ3bC0+ZmxhZ3MpOworCWlmICh3bC0+ZWxwX2NvbXBsKSB7CisJCWNvbXBsZXRlKHdsLT5lbHBfY29tcGwpOworCQl3bC0+ZWxwX2NvbXBsID0gTlVMTDsKKwl9CisKKwlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1VTUEVOREVELCAmd2wtPmZsYWdzKSkgeworCQkvKiBkb24ndCBlbnF1ZXVlIGEgd29yayByaWdodCBub3cuIG1hcmsgaXQgYXMgcGVuZGluZyAqLworCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BFTkRJTkdfV09SSywgJndsLT5mbGFncyk7CisJCXdsMTI3MV9kZWJ1ZyhERUJVR19JUlEsICJzaG91bGQgbm90IGVucXVldWUgd29yayIpOworCQlkaXNhYmxlX2lycV9ub3N5bmMod2wtPmlycSk7CisJCXBtX3dha2V1cF9ldmVudCh3bC0+ZGV2LCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgd2wxMnh4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCXN0cnVjdCB3bDEyNzEgKndsOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlodyA9IHdsMTI3MV9hbGxvY19odygpOworCWlmIChJU19FUlIoaHcpKSB7CisJCXdsMTI3MV9lcnJvcigiY2FuJ3QgYWxsb2NhdGUgaHciKTsKKwkJcmV0ID0gUFRSX0VSUihodyk7CisJCWdvdG8gb3V0OworCX0KKworCXdsID0gaHctPnByaXY7CisJd2wtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJd2wtPnJlZl9jbG9jayA9IHBkYXRhLT5ib2FyZF9yZWZfY2xvY2s7CisJd2wtPnRjeG9fY2xvY2sgPSBwZGF0YS0+Ym9hcmRfdGN4b19jbG9jazsKKwl3bC0+cGxhdGZvcm1fcXVpcmtzID0gcGRhdGEtPnBsYXRmb3JtX3F1aXJrczsKKwl3bC0+c2V0X3Bvd2VyID0gcGRhdGEtPnNldF9wb3dlcjsKKwl3bC0+ZGV2ID0gJnBkZXYtPmRldjsKKwl3bC0+aWZfb3BzID0gcGRhdGEtPm9wczsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdsKTsKKworCWlmICh3bC0+cGxhdGZvcm1fcXVpcmtzICYgV0wxMlhYX1BMQVRGT1JNX1FVSVJLX0VER0VfSVJRKQorCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkc7CisJZWxzZQorCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9UOworCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod2wtPmlycSwgd2wxMnh4X2hhcmRpcnEsIHdsMTI3MV9pcnEsCisJCQkJICAgaXJxZmxhZ3MsCisJCQkJICAgcGRldi0+bmFtZSwgd2wpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigicmVxdWVzdF9pcnEoKSBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXRfZnJlZV9odzsKKwl9CisKKwlyZXQgPSBlbmFibGVfaXJxX3dha2Uod2wtPmlycSk7CisJaWYgKCFyZXQpIHsKKwkJd2wtPmlycV93YWtlX2VuYWJsZWQgPSB0cnVlOworCQlkZXZpY2VfaW5pdF93YWtldXAod2wtPmRldiwgMSk7CisJCWlmIChwZGF0YS0+cHdyX2luX3N1c3BlbmQpCisJCQlody0+d2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9BTlk7CisKKwl9CisJZGlzYWJsZV9pcnEod2wtPmlycSk7CisKKwlyZXQgPSB3bDEyNzFfaW5pdF9pZWVlODAyMTEod2wpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lycTsKKworCXJldCA9IHdsMTI3MV9yZWdpc3Rlcl9odyh3bCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXJxOworCisJLyogQ3JlYXRlIHN5c2ZzIGZpbGUgdG8gY29udHJvbCBidCBjb2V4IHN0YXRlICovCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKHdsLT5kZXYsICZkZXZfYXR0cl9idF9jb2V4X3N0YXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBidF9jb2V4X3N0YXRlIik7CisJCWdvdG8gb3V0X2lycTsKKwl9CisKKwkvKiBDcmVhdGUgc3lzZnMgZmlsZSB0byBnZXQgSFcgUEcgdmVyc2lvbiAqLworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSh3bC0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBod19wZ192ZXIiKTsKKwkJZ290byBvdXRfYnRfY29leF9zdGF0ZTsKKwl9CisKKwkvKiBDcmVhdGUgc3lzZnMgZmlsZSBmb3IgdGhlIEZXIGxvZyAqLworCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUod2wtPmRldiwgJmZ3bG9nX2F0dHIpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlIGZ3bG9nIik7CisJCWdvdG8gb3V0X2h3X3BnX3ZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2h3X3BnX3ZlcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUod2wtPmRldiwgJmRldl9hdHRyX2h3X3BnX3Zlcik7CisKK291dF9idF9jb2V4X3N0YXRlOgorCWRldmljZV9yZW1vdmVfZmlsZSh3bC0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7CisKK291dF9pcnE6CisJZnJlZV9pcnEod2wtPmlycSwgd2wpOworCitvdXRfZnJlZV9odzoKKwl3bDEyNzFfZnJlZV9odyh3bCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bDEyeHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICh3bC0+aXJxX3dha2VfZW5hYmxlZCkgeworCQlkZXZpY2VfaW5pdF93YWtldXAod2wtPmRldiwgMCk7CisJCWRpc2FibGVfaXJxX3dha2Uod2wtPmlycSk7CisJfQorCXdsMTI3MV91bnJlZ2lzdGVyX2h3KHdsKTsKKwlmcmVlX2lycSh3bC0+aXJxLCB3bCk7CisJd2wxMjcxX2ZyZWVfaHcod2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHdsMTJ4eF9pZF90YWJsZVtdIF9fZGV2aW5pdGNvbnN0ID0geworCXsgIndsMTJ4eCIsIDAgfSwKKwl7ICB9IC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgd2wxMnh4X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2wxMnh4X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gd2wxMnh4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod2wxMnh4X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gd2wxMnh4X2lkX3RhYmxlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIndsMTJ4eF9kcml2ZXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bDEyeHhfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndsMTJ4eF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQod2wxMnh4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgd2wxMnh4X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd2wxMnh4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh3bDEyeHhfZXhpdCk7CiAKIHUzMiB3bDEyeHhfZGVidWdfbGV2ZWwgPSBERUJVR19OT05FOwogRVhQT1JUX1NZTUJPTF9HUEwod2wxMnh4X2RlYnVnX2xldmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKaW5kZXggYzE1ZWJmMi4uYTdhMTEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3BzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJwcy5oIgogI2luY2x1ZGUgImlvLmgiCiAjaW5jbHVkZSAidHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIFdMMTI3MV9XQUtFVVBfVElNRU9VVCA1MDAKIApAQCAtMzIsNiArMzMsNyBAQAogewogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOwogCXN0cnVjdCB3bDEyNzEgKndsOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAogCWR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXdsID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3Qgd2wxMjcxLCBlbHBfd29yayk7CkBAIC00NywxMSArNDksMTUgQEAKIAlpZiAodW5saWtlbHkoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0VMUF9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfSU5fRUxQLCAmd2wtPmZsYWdzKSB8fAotCSAgICAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykgJiYKLQkgICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19JRExFLCAmd2wtPmZsYWdzKSkpCisJaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX0lOX0VMUCwgJndsLT5mbGFncykpCiAJCWdvdG8gb3V0OwogCisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSAmJgorCQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpKQorCQkJZ290byBvdXQ7CisJfQorCiAJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgImNoaXAgdG8gZWxwIik7CiAJd2wxMjcxX3Jhd193cml0ZTMyKHdsLCBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIsIEVMUENUUkxfU0xFRVApOwogCXNldF9iaXQoV0wxMjcxX0ZMQUdfSU5fRUxQLCAmd2wtPmZsYWdzKTsKQEAgLTY1LDEzICs3MSwxNyBAQAogLyogUm91dGluZXMgdG8gdG9nZ2xlIHNsZWVwIG1vZGUgd2hpbGUgaW4gRUxQICovCiB2b2lkIHdsMTI3MV9wc19lbHBfc2xlZXAoc3RydWN0IHdsMTI3MSAqd2wpCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOworCiAJLyogd2Ugc2hvdWxkbid0IGdldCBjb25zZWN1dGl2ZSBzbGVlcCByZXF1ZXN0cyAqLwogCWlmIChXQVJOX09OKHRlc3RfYW5kX3NldF9iaXQoV0wxMjcxX0ZMQUdfRUxQX1JFUVVFU1RFRCwgJndsLT5mbGFncykpKQogCQlyZXR1cm47CiAKLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpKQotCQlyZXR1cm47CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSAmJgorCQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpKQorCQkJcmV0dXJuOworCX0KIAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsod2wtPmh3LCAmd2wtPmVscF93b3JrLAogCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhFTFBfRU5UUllfREVMQVkpKTsKQEAgLTE0Myw4ICsxNTMsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMjcxX3BzX3NldF9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBlbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlLAotCQkgICAgICAgdTMyIHJhdGVzLCBib29sIHNlbmQpCitpbnQgd2wxMjcxX3BzX3NldF9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICAgICBlbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlLCB1MzIgcmF0ZXMsIGJvb2wgc2VuZCkKIHsKIAlpbnQgcmV0OwogCkBAIC0xNTIsMzkgKzE2MiwzNCBAQAogCWNhc2UgU1RBVElPTl9QT1dFUl9TQVZFX01PREU6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJlbnRlcmluZyBwc20iKTsKIAotCQlyZXQgPSB3bDEyNzFfYWN4X3dha2VfdXBfY29uZGl0aW9ucyh3bCk7CisJCXJldCA9IHdsMTI3MV9hY3hfd2FrZV91cF9jb25kaXRpb25zKHdsLCB3bHZpZik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQl3bDEyNzFfZXJyb3IoImNvdWxkbid0IHNldCB3YWtlIHVwIGNvbmRpdGlvbnMiKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlyZXQgPSB3bDEyNzFfY21kX3BzX21vZGUod2wsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFKTsKKwkJcmV0ID0gd2wxMjcxX2NtZF9wc19tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJc2V0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpOworCQlzZXRfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBTVEFUSU9OX0FDVElWRV9NT0RFOgogCWRlZmF1bHQ6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJsZWF2aW5nIHBzbSIpOwogCiAJCS8qIGRpc2FibGUgYmVhY29uIGVhcmx5IHRlcm1pbmF0aW9uICovCi0JCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X2JldF9lbmFibGUod2wsIGZhbHNlKTsKKwkJaWYgKHdsdmlmLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCXJldCA9IHdsMTI3MV9hY3hfYmV0X2VuYWJsZSh3bCwgd2x2aWYsIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQkvKiBkaXNhYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KLQkJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgZmFsc2UpOworCQlyZXQgPSB3bDEyNzFfY21kX3BzX21vZGUod2wsIHdsdmlmLCBTVEFUSU9OX0FDVElWRV9NT0RFKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHdsMTI3MV9jbWRfcHNfbW9kZSh3bCwgU1RBVElPTl9BQ1RJVkVfTU9ERSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUFNNLCAmd2wtPmZsYWdzKTsKKwkJY2xlYXJfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMjMsOSArMjI4LDExIEBACiAJd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHdsKTsKIH0KIAotdm9pZCB3bDEyNzFfcHNfbGlua19zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCwgYm9vbCBjbGVhbl9xdWV1ZXMpCit2b2lkIHdsMTJ4eF9wc19saW5rX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHU4IGhsaWQsIGJvb2wgY2xlYW5fcXVldWVzKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCiAJaWYgKHRlc3RfYml0KGhsaWQsICZ3bC0+YXBfcHNfbWFwKSkKIAkJcmV0dXJuOwpAQCAtMjM1LDcgKzI0Miw3IEBACiAJCSAgICAgY2xlYW5fcXVldWVzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEod2wtPnZpZiwgd2wtPmxpbmtzW2hsaWRdLmFkZHIpOworCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIHdsLT5saW5rc1tobGlkXS5hZGRyKTsKIAlpZiAoIXN0YSkgewogCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBmaW5kIHN0YSAlcE0gZm9yIHN0YXJ0aW5nIHBzIiwKIAkJCSAgICAgd2wtPmxpbmtzW2hsaWRdLmFkZHIpOwpAQCAtMjUzLDkgKzI2MCwxMCBAQAogCV9fc2V0X2JpdChobGlkLCAmd2wtPmFwX3BzX21hcCk7CiB9CiAKLXZvaWQgd2wxMjcxX3BzX2xpbmtfZW5kKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKQordm9pZCB3bDEyeHhfcHNfbGlua19lbmQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwgdTggaGxpZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAogCWlmICghdGVzdF9iaXQoaGxpZCwgJndsLT5hcF9wc19tYXApKQogCQlyZXR1cm47CkBAIC0yNjUsNyArMjczLDcgQEAKIAlfX2NsZWFyX2JpdChobGlkLCAmd2wtPmFwX3BzX21hcCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKHdsLT52aWYsIHdsLT5saW5rc1tobGlkXS5hZGRyKTsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCB3bC0+bGlua3NbaGxpZF0uYWRkcik7CiAJaWYgKCFzdGEpIHsKIAkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgZmluZCBzdGEgJXBNIGZvciBlbmRpbmcgcHMiLAogCQkJICAgICB3bC0+bGlua3NbaGxpZF0uYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5oCmluZGV4IDI1ZWI5YmMuLmExMjA1MmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcHMuaApAQCAtMjcsMTMgKzI3LDE0IEBACiAjaW5jbHVkZSAid2wxMnh4LmgiCiAjaW5jbHVkZSAiYWN4LmgiCiAKLWludCB3bDEyNzFfcHNfc2V0X21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gd2wxMjcxX2NtZF9wc19tb2RlIG1vZGUsCi0JCSAgICAgICB1MzIgcmF0ZXMsIGJvb2wgc2VuZCk7CitpbnQgd2wxMjcxX3BzX3NldF9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICAgICBlbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlLCB1MzIgcmF0ZXMsIGJvb2wgc2VuZCk7CiB2b2lkIHdsMTI3MV9wc19lbHBfc2xlZXAoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9wc19lbHBfd2FrZXVwKHN0cnVjdCB3bDEyNzEgKndsKTsKIHZvaWQgd2wxMjcxX2VscF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIHdsMTI3MV9wc19saW5rX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkLCBib29sIGNsZWFuX3F1ZXVlcyk7Ci12b2lkIHdsMTI3MV9wc19saW5rX2VuZChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCk7Cit2b2lkIHdsMTJ4eF9wc19saW5rX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHU4IGhsaWQsIGJvb2wgY2xlYW5fcXVldWVzKTsKK3ZvaWQgd2wxMnh4X3BzX2xpbmtfZW5kKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IGhsaWQpOwogCiAjZGVmaW5lIFdMMTI3MV9QU19DT01QTEVURV9USU1FT1VUIDUwMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcmVnLmgKaW5kZXggM2Y1NzBmMy4uZGYzNGQ1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yZWcuaApAQCAtNDA4LDcgKzQwOCw3IEBACiAKIAogLyogRmlybXdhcmUgaW1hZ2UgbG9hZCBjaHVuayBzaXplICovCi0jZGVmaW5lIENIVU5LX1NJWkUgICAgICAgICAgNTEyCisjZGVmaW5lIENIVU5LX1NJWkUJMTYzODQKIAogLyogRmlybXdhcmUgaW1hZ2UgaGVhZGVyIHNpemUgKi8KICNkZWZpbmUgRldfSERSX1NJWkUgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcnguYwppbmRleCBkZWU0Y2ZlLi40ZmJkMmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcnguYwpAQCAtMjUsOSArMjUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJhY3guaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJyeC5oIgorI2luY2x1ZGUgInR4LmgiCiAjaW5jbHVkZSAiaW8uaCIKIAogc3RhdGljIHU4IHdsMTJ4eF9yeF9nZXRfbWVtX2Jsb2NrKHN0cnVjdCB3bDEyeHhfZndfc3RhdHVzICpzdGF0dXMsCkBAIC05Niw3ICs5OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX3J4X2hhbmRsZV9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqZGF0YSwgdTMyIGxlbmd0aCwKLQkJCQkgYm9vbCB1bmFsaWduZWQpCisJCQkJIGJvb2wgdW5hbGlnbmVkLCB1OCAqaGxpZCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX3J4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE1OSw2ICsxNjEsNyBAQAogCSAqIHBheWxvYWQgYWxpZ25lZCB0byA0IGJ5dGVzLgogCSAqLwogCW1lbWNweShidWYsIGRhdGEgKyBzaXplb2YoKmRlc2MpLCBsZW5ndGggLSBzaXplb2YoKmRlc2MpKTsKKwkqaGxpZCA9IGRlc2MtPmhsaWQ7CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaWYgKGllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKSkKQEAgLTE2OSwxMCArMTcyLDEwIEBACiAJd2wxMjcxX3J4X3N0YXR1cyh3bCwgZGVzYywgSUVFRTgwMjExX1NLQl9SWENCKHNrYiksIGJlYWNvbik7CiAKIAlzZXFfbnVtID0gKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwotCXdsMTI3MV9kZWJ1ZyhERUJVR19SWCwgInJ4IHNrYiAweCVwOiAlZCBCICVzIHNlcSAlZCIsIHNrYiwKKwl3bDEyNzFfZGVidWcoREVCVUdfUlgsICJyeCBza2IgMHglcDogJWQgQiAlcyBzZXEgJWQgaGxpZCAlZCIsIHNrYiwKIAkJICAgICBza2ItPmxlbiAtIGRlc2MtPnBhZF9sZW4sCiAJCSAgICAgYmVhY29uID8gImJlYWNvbiIgOiAiIiwKLQkJICAgICBzZXFfbnVtKTsKKwkJICAgICBzZXFfbnVtLCAqaGxpZCk7CiAKIAlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gZGVzYy0+cGFkX2xlbik7CiAKQEAgLTE4NSw2ICsxODgsNyBAQAogdm9pZCB3bDEyeHhfcngoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfZndfc3RhdHVzICpzdGF0dXMpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfbWVtX21hcCAqd2xfbWVtX21hcCA9IHdsLT50YXJnZXRfbWVtX21hcDsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV9obGlkc1tCSVRTX1RPX0xPTkdTKFdMMTJYWF9NQVhfTElOS1MpXSA9IHswfTsKIAl1MzIgYnVmX3NpemU7CiAJdTMyIGZ3X3J4X2NvdW50ZXIgID0gc3RhdHVzLT5md19yeF9jb3VudGVyICYgTlVNX1JYX1BLVF9ERVNDX01PRF9NQVNLOwogCXUzMiBkcnZfcnhfY291bnRlciA9IHdsLT5yeF9jb3VudGVyICYgTlVNX1JYX1BLVF9ERVNDX01PRF9NQVNLOwpAQCAtMTkyLDggKzE5Niw3IEBACiAJdTMyIG1lbV9ibG9jazsKIAl1MzIgcGt0X2xlbmd0aDsKIAl1MzIgcGt0X29mZnNldDsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOwotCWJvb2wgaGFkX2RhdGEgPSBmYWxzZTsKKwl1OCBobGlkOwogCWJvb2wgdW5hbGlnbmVkID0gZmFsc2U7CiAKIAl3aGlsZSAoZHJ2X3J4X2NvdW50ZXIgIT0gZndfcnhfY291bnRlcikgewpAQCAtMjUzLDggKzI1NiwxNSBAQAogCQkJICovCiAJCQlpZiAod2wxMjcxX3J4X2hhbmRsZV9kYXRhKHdsLAogCQkJCQkJICB3bC0+YWdncl9idWYgKyBwa3Rfb2Zmc2V0LAotCQkJCQkJICBwa3RfbGVuZ3RoLCB1bmFsaWduZWQpID09IDEpCi0JCQkJaGFkX2RhdGEgPSB0cnVlOworCQkJCQkJICBwa3RfbGVuZ3RoLCB1bmFsaWduZWQsCisJCQkJCQkgICZobGlkKSA9PSAxKSB7CisJCQkJaWYgKGhsaWQgPCBXTDEyWFhfTUFYX0xJTktTKQorCQkJCQlfX3NldF9iaXQoaGxpZCwgYWN0aXZlX2hsaWRzKTsKKwkJCQllbHNlCisJCQkJCVdBUk4oMSwKKwkJCQkJICAgICAiaGxpZCBleGNlZWRlZCBXTDEyWFhfTUFYX0xJTktTICIKKwkJCQkJICAgICAiKCVkKVxuIiwgaGxpZCk7CisJCQl9CiAKIAkJCXdsLT5yeF9jb3VudGVyKys7CiAJCQlkcnZfcnhfY291bnRlcisrOwpAQCAtMjcwLDE3ICsyODAsNSBAQAogCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0VORF9PRl9UUkFOU0FDVElPTikKIAkJd2wxMjcxX3dyaXRlMzIod2wsIFJYX0RSSVZFUl9DT1VOVEVSX0FERFJFU1MsIHdsLT5yeF9jb3VudGVyKTsKIAotCWlmICghaXNfYXAgJiYgd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsICYmIGhhZF9kYXRhICYmCi0JICAgICh3bC0+Y29uZi5yeF9zdHJlYW1pbmcuYWx3YXlzIHx8Ci0JICAgICB0ZXN0X2JpdChXTDEyNzFfRkxBR19TT0ZUX0dFTUlOSSwgJndsLT5mbGFncykpKSB7Ci0JCXUzMiB0aW1lb3V0ID0gd2wtPmNvbmYucnhfc3RyZWFtaW5nLmR1cmF0aW9uOwotCi0JCS8qIHJlc3RhcnQgcnggc3RyZWFtaW5nICovCi0JCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQotCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LAotCQkJCQkgICAgICZ3bC0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKLQotCQltb2RfdGltZXIoJndsLT5yeF9zdHJlYW1pbmdfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQl9CisJd2wxMnh4X3JlYXJtX3J4X3N0cmVhbWluZyh3bCwgYWN0aXZlX2hsaWRzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jCmluZGV4IGZjMjljNjcuLjg1OTlkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJjbWQuaCIKICNpbmNsdWRlICJzY2FuLmgiCiAjaW5jbHVkZSAiYWN4LmgiCkBAIC0zNCw2ICszNSw4IEBACiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7CiAJc3RydWN0IHdsMTI3MSAqd2w7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJaW50IHJldDsKIAlib29sIGlzX3N0YSwgaXNfaWJzczsKIApAQCAtNTAsMjggKzUzLDMxIEBACiAJaWYgKHdsLT5zY2FuLnN0YXRlID09IFdMMTI3MV9TQ0FOX1NUQVRFX0lETEUpCiAJCWdvdG8gb3V0OwogCisJdmlmID0gd2wtPnNjYW5fdmlmOworCXdsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisKIAl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFX0lETEU7CiAJbWVtc2V0KHdsLT5zY2FuLnNjYW5uZWRfY2gsIDAsIHNpemVvZih3bC0+c2Nhbi5zY2FubmVkX2NoKSk7CiAJd2wtPnNjYW4ucmVxID0gTlVMTDsKKwl3bC0+c2Nhbl92aWYgPSBOVUxMOwogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpIHsKIAkJLyogcmVzdG9yZSBoYXJkd2FyZSBjb25uZWN0aW9uIG1vbml0b3JpbmcgdGVtcGxhdGUgKi8KLQkJd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsIHdsLT5wcm9iZXJlcSk7CisJCXdsMTI3MV9jbWRfYnVpbGRfYXBfcHJvYmVfcmVxKHdsLCB3bHZpZiwgd2x2aWYtPnByb2JlcmVxKTsKIAl9CiAKIAkvKiByZXR1cm4gdG8gUk9DIGlmIG5lZWRlZCAqLwotCWlzX3N0YSA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyk7Ci0JaXNfaWJzcyA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUyk7Ci0JaWYgKCgoaXNfc3RhICYmICF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpIHx8Ci0JICAgICAoaXNfaWJzcyAmJiAhdGVzdF9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsICZ3bC0+ZmxhZ3MpKSkgJiYKLQkgICAgIXRlc3RfYml0KHdsLT5kZXZfcm9sZV9pZCwgd2wtPnJvY19tYXApKSB7CisJaXNfc3RhID0gKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKTsKKwlpc19pYnNzID0gKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKTsKKwlpZiAoKChpc19zdGEgJiYgIXRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKSB8fAorCSAgICAgKGlzX2lic3MgJiYgIXRlc3RfYml0KFdMVklGX0ZMQUdfSUJTU19KT0lORUQsICZ3bHZpZi0+ZmxhZ3MpKSkgJiYKKwkgICAgIXRlc3RfYml0KHdsdmlmLT5kZXZfcm9sZV9pZCwgd2wtPnJvY19tYXApKSB7CiAJCS8qIHJlc3RvcmUgcmVtYWluIG9uIGNoYW5uZWwgKi8KLQkJd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2Rldih3bCk7Ci0JCXdsMTJ4eF9yb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7CisJCXdsMTJ4eF9zdGFydF9kZXYod2wsIHdsdmlmKTsKIAl9CiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiAKQEAgLTE1NSw5ICsxNjEsMTEgQEAKIAogI2RlZmluZSBXTDEyNzFfTk9USElOR19UT19TQ0FOIDEKIAotc3RhdGljIGludCB3bDEyNzFfc2Nhbl9zZW5kKHN0cnVjdCB3bDEyNzEgKndsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgIGJvb2wgcGFzc2l2ZSwgdTMyIGJhc2ljX3JhdGUpCitzdGF0aWMgaW50IHdsMTI3MV9zY2FuX3NlbmQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgIGJvb2wgcGFzc2l2ZSwgdTMyIGJhc2ljX3JhdGUpCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJc3RydWN0IHdsMTI3MV9jbWRfc2NhbiAqY21kOwogCXN0cnVjdCB3bDEyNzFfY21kX3RyaWdnZXJfc2Nhbl90byAqdHJpZ2dlcjsKIAlpbnQgcmV0OwpAQCAtMTc3LDExICsxODUsMTEgQEAKIAlpZiAocGFzc2l2ZSkKIAkJc2Nhbl9vcHRpb25zIHw9IFdMMTI3MV9TQ0FOX09QVF9QQVNTSVZFOwogCi0JaWYgKFdBUk5fT04od2wtPnJvbGVfaWQgPT0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRCkpIHsKKwlpZiAoV0FSTl9PTih3bHZpZi0+cm9sZV9pZCA9PSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9Ci0JY21kLT5wYXJhbXMucm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWNtZC0+cGFyYW1zLnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAljbWQtPnBhcmFtcy5zY2FuX29wdGlvbnMgPSBjcHVfdG9fbGUxNihzY2FuX29wdGlvbnMpOwogCiAJY21kLT5wYXJhbXMubl9jaCA9IHdsMTI3MV9nZXRfc2Nhbl9jaGFubmVscyh3bCwgd2wtPnNjYW4ucmVxLApAQCAtMTk0LDcgKzIwMiw2IEBACiAKIAljbWQtPnBhcmFtcy50eF9yYXRlID0gY3B1X3RvX2xlMzIoYmFzaWNfcmF0ZSk7CiAJY21kLT5wYXJhbXMubl9wcm9iZV9yZXFzID0gd2wtPmNvbmYuc2Nhbi5udW1fcHJvYmVfcmVxczsKLQljbWQtPnBhcmFtcy50eF9yYXRlID0gY3B1X3RvX2xlMzIoYmFzaWNfcmF0ZSk7CiAJY21kLT5wYXJhbXMudGlkX3RyaWdnZXIgPSAwOwogCWNtZC0+cGFyYW1zLnNjYW5fdGFnID0gV0wxMjcxX1NDQU5fREVGQVVMVF9UQUc7CiAKQEAgLTIwOCwxMSArMjE1LDExIEBACiAJCW1lbWNweShjbWQtPnBhcmFtcy5zc2lkLCB3bC0+c2Nhbi5zc2lkLCB3bC0+c2Nhbi5zc2lkX2xlbik7CiAJfQogCi0JbWVtY3B5KGNtZC0+YWRkciwgd2wtPm1hY19hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGNtZC0+YWRkciwgdmlmLT5hZGRyLCBFVEhfQUxFTik7CiAKLQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgd2wtPnNjYW4uc3NpZCwgd2wtPnNjYW4uc3NpZF9sZW4sCi0JCQkJCSB3bC0+c2Nhbi5yZXEtPmllLCB3bC0+c2Nhbi5yZXEtPmllX2xlbiwKLQkJCQkJIGJhbmQpOworCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCB3bHZpZiwgd2wtPnNjYW4uc3NpZCwKKwkJCQkJIHdsLT5zY2FuLnNzaWRfbGVuLCB3bC0+c2Nhbi5yZXEtPmllLAorCQkJCQkgd2wtPnNjYW4ucmVxLT5pZV9sZW4sIGJhbmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV9lcnJvcigiUFJPQkUgcmVxdWVzdCB0ZW1wbGF0ZSBmYWlsZWQiKTsKIAkJZ290byBvdXQ7CkBAIC0yNDEsMTEgKzI0OCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgd2wxMjcxX3NjYW5fc3RtKHN0cnVjdCB3bDEyNzEgKndsKQordm9pZCB3bDEyNzFfc2Nhbl9zdG0oc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldCA9IDA7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCXUzMiByYXRlOworCXUzMiByYXRlLCBtYXNrOwogCiAJc3dpdGNoICh3bC0+c2Nhbi5zdGF0ZSkgewogCWNhc2UgV0wxMjcxX1NDQU5fU1RBVEVfSURMRToKQEAgLTI1Myw0NyArMjYxLDU5IEBACiAKIAljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzJHSFpfQUNUSVZFOgogCQliYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQkJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iaXRyYXRlX21hc2tzW2JhbmRdKTsKLQkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgYmFuZCwgZmFsc2UsIHJhdGUpOworCQltYXNrID0gd2x2aWYtPmJpdHJhdGVfbWFza3NbYmFuZF07CisJCWlmICh3bC0+c2Nhbi5yZXEtPm5vX2NjaykgeworCQkJbWFzayAmPSB+Q09ORl9UWF9DQ0tfUkFURVM7CisJCQlpZiAoIW1hc2spCisJCQkJbWFzayA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDX1AyUDsKKwkJfQorCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgbWFzayk7CisJCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIHZpZiwgYmFuZCwgZmFsc2UsIHJhdGUpOwogCQlpZiAocmV0ID09IFdMMTI3MV9OT1RISU5HX1RPX1NDQU4pIHsKIAkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfMkdIWl9QQVNTSVZFOwotCQkJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwkJCXdsMTI3MV9zY2FuX3N0bSh3bCwgdmlmKTsKIAkJfQogCiAJCWJyZWFrOwogCiAJY2FzZSBXTDEyNzFfU0NBTl9TVEFURV8yR0haX1BBU1NJVkU6CiAJCWJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJpdHJhdGVfbWFza3NbYmFuZF0pOwotCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCBiYW5kLCB0cnVlLCByYXRlKTsKKwkJbWFzayA9IHdsdmlmLT5iaXRyYXRlX21hc2tzW2JhbmRdOworCQlpZiAod2wtPnNjYW4ucmVxLT5ub19jY2spIHsKKwkJCW1hc2sgJj0gfkNPTkZfVFhfQ0NLX1JBVEVTOworCQkJaWYgKCFtYXNrKQorCQkJCW1hc2sgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQ19QMlA7CisJCX0KKwkJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIG1hc2spOworCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCB2aWYsIGJhbmQsIHRydWUsIHJhdGUpOwogCQlpZiAocmV0ID09IFdMMTI3MV9OT1RISU5HX1RPX1NDQU4pIHsKIAkJCWlmICh3bC0+ZW5hYmxlXzExYSkKIAkJCQl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFXzVHSFpfQUNUSVZFOwogCQkJZWxzZQogCQkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfRE9ORTsKLQkJCXdsMTI3MV9zY2FuX3N0bSh3bCk7CisJCQl3bDEyNzFfc2Nhbl9zdG0od2wsIHZpZik7CiAJCX0KIAogCQlicmVhazsKIAogCWNhc2UgV0wxMjcxX1NDQU5fU1RBVEVfNUdIWl9BQ1RJVkU6CiAJCWJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOwotCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJpdHJhdGVfbWFza3NbYmFuZF0pOwotCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCBiYW5kLCBmYWxzZSwgcmF0ZSk7CisJCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7CisJCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIHZpZiwgYmFuZCwgZmFsc2UsIHJhdGUpOwogCQlpZiAocmV0ID09IFdMMTI3MV9OT1RISU5HX1RPX1NDQU4pIHsKIAkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfNUdIWl9QQVNTSVZFOwotCQkJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwkJCXdsMTI3MV9zY2FuX3N0bSh3bCwgdmlmKTsKIAkJfQogCiAJCWJyZWFrOwogCiAJY2FzZSBXTDEyNzFfU0NBTl9TVEFURV81R0haX1BBU1NJVkU6CiAJCWJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOwotCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJpdHJhdGVfbWFza3NbYmFuZF0pOwotCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCBiYW5kLCB0cnVlLCByYXRlKTsKKwkJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iaXRyYXRlX21hc2tzW2JhbmRdKTsKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgdmlmLCBiYW5kLCB0cnVlLCByYXRlKTsKIAkJaWYgKHJldCA9PSBXTDEyNzFfTk9USElOR19UT19TQ0FOKSB7CiAJCQl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFX0RPTkU7Ci0JCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQkJd2wxMjcxX3NjYW5fc3RtKHdsLCB2aWYpOwogCQl9CiAKIAkJYnJlYWs7CkBAIC0zMTcsNyArMzM3LDggQEAKIAl9CiB9CiAKLWludCB3bDEyNzFfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKK2ludCB3bDEyNzFfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQogewogCS8qCkBAIC0zMzgsNiArMzU5LDcgQEAKIAkJd2wtPnNjYW4uc3NpZF9sZW4gPSAwOwogCX0KIAorCXdsLT5zY2FuX3ZpZiA9IHZpZjsKIAl3bC0+c2Nhbi5yZXEgPSByZXE7CiAJbWVtc2V0KHdsLT5zY2FuLnNjYW5uZWRfY2gsIDAsIHNpemVvZih3bC0+c2Nhbi5zY2FubmVkX2NoKSk7CiAKQEAgLTM0Niw3ICszNjgsNyBAQAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsod2wtPmh3LCAmd2wtPnNjYW5fY29tcGxldGVfd29yaywKIAkJCQkgICAgIG1zZWNzX3RvX2ppZmZpZXMoV0wxMjcxX1NDQU5fVElNRU9VVCkpOwogCi0Jd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwl3bDEyNzFfc2Nhbl9zdG0od2wsIHZpZik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU1MCw2ICs1NzIsOSBAQAogCQkJICogc28gdGhleSdyZSB1c2VkIGluIHByb2JlIHJlcXVlc3RzLgogCQkJICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX3NzaWRzOyBpKyspIHsKKwkJCQlpZiAoIXJlcS0+c3NpZHNbaV0uc3NpZF9sZW4pCisJCQkJCWNvbnRpbnVlOworCiAJCQkJZm9yIChqID0gMDsgaiA8IGNtZC0+bl9zc2lkczsgaisrKQogCQkJCQlpZiAoIW1lbWNtcChyZXEtPnNzaWRzW2ldLnNzaWQsCiAJCQkJCQkgICBjbWQtPnNzaWRzW2pdLnNzaWQsCkBAIC01ODUsNiArNjEwLDcgQEAKIH0KIAogaW50IHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJCSAgc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zY2hlZF9zY2FuX2llcyAqaWVzKQogewpAQCAtNjMxLDcgKzY1Nyw3IEBACiAJfQogCiAJaWYgKCFmb3JjZV9wYXNzaXZlICYmIGNmZy0+YWN0aXZlWzBdKSB7Ci0JCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCByZXEtPnNzaWRzWzBdLnNzaWQsCisJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCB3bHZpZiwgcmVxLT5zc2lkc1swXS5zc2lkLAogCQkJCQkJIHJlcS0+c3NpZHNbMF0uc3NpZF9sZW4sCiAJCQkJCQkgaWVzLT5pZVtJRUVFODAyMTFfQkFORF8yR0haXSwKIAkJCQkJCSBpZXMtPmxlbltJRUVFODAyMTFfQkFORF8yR0haXSwKQEAgLTY0Myw3ICs2NjksNyBAQAogCX0KIAogCWlmICghZm9yY2VfcGFzc2l2ZSAmJiBjZmctPmFjdGl2ZVsxXSkgewotCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgIHJlcS0+c3NpZHNbMF0uc3NpZCwKKwkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEod2wsIHdsdmlmLCByZXEtPnNzaWRzWzBdLnNzaWQsCiAJCQkJCQkgcmVxLT5zc2lkc1swXS5zc2lkX2xlbiwKIAkJCQkJCSBpZXMtPmllW0lFRUU4MDIxMV9CQU5EXzVHSFpdLAogCQkJCQkJIGllcy0+bGVuW0lFRUU4MDIxMV9CQU5EXzVHSFpdLApAQCAtNjY3LDE0ICs2OTMsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTI3MV9jbWRfc2NoZWRfc2Nhbl9zdGFydCAqc3RhcnQ7CiAJaW50IHJldCA9IDA7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHBlcmlvZGljIHNjYW4gc3RhcnQiKTsKIAotCWlmICh3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUykKKwlpZiAod2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX1NUQV9CU1MpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfSURMRSwgJndsLT5mbGFncykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaAppbmRleCA5MjExNTE1Li5hN2VkNDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmgKQEAgLTI2LDE4ICsyNiwyMCBAQAogCiAjaW5jbHVkZSAid2wxMnh4LmgiCiAKLWludCB3bDEyNzFfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKK2ludCB3bDEyNzFfc2NhbihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKIGludCB3bDEyNzFfc2Nhbl9zdG9wKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfc2Nhbl9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkJY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKIAkJCQljb25zdCB1OCAqaWUsIHNpemVfdCBpZV9sZW4sIHU4IGJhbmQpOwotdm9pZCB3bDEyNzFfc2Nhbl9zdG0oc3RydWN0IHdsMTI3MSAqd2wpOwordm9pZCB3bDEyNzFfc2Nhbl9zdG0oc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogdm9pZCB3bDEyNzFfc2Nhbl9jb21wbGV0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBpbnQgd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NjaGVkX3NjYW5faWVzICppZXMpOwotaW50IHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiB2b2lkIHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fc3RvcChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB2b2lkIHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fcmVzdWx0cyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Rpby5jCmluZGV4IDUxNmE4OTguLjQ2OGE1MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NkaW8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9faWRzLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KQEAgLTQ0LDEwNyArNDUsNjcgQEAKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxCTB4NDA3NgogI2VuZGlmCiAKK3N0cnVjdCB3bDEyeHhfc2Rpb19nbHVlIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29yZTsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgd2wxMjcxX2RldmljZXNbXSBfX2RldmluaXRjb25zdCA9IHsKIAl7IFNESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX1RJLCBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEpIH0sCiAJe30KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHNkaW8sIHdsMTI3MV9kZXZpY2VzKTsKIAotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fc2V0X2Jsb2NrX3NpemUoc3RydWN0IHdsMTI3MSAqd2wsIHVuc2lnbmVkIGludCBibGtzeikKK3N0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3NldF9ibG9ja19zaXplKHN0cnVjdCBkZXZpY2UgKmNoaWxkLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYmxrc3opCiB7Ci0Jc2Rpb19jbGFpbV9ob3N0KHdsLT5pZl9wcml2KTsKLQlzZGlvX3NldF9ibG9ja19zaXplKHdsLT5pZl9wcml2LCBibGtzeik7Ci0Jc2Rpb19yZWxlYXNlX2hvc3Qod2wtPmlmX3ByaXYpOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGdsdWUtPmRldik7CisKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJc2Rpb19zZXRfYmxvY2tfc2l6ZShmdW5jLCBibGtzeik7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNkaW9fZnVuYyAqd2xfdG9fZnVuYyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlyZXR1cm4gd2wtPmlmX3ByaXY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICp3bDEyNzFfc2Rpb193bF90b19kZXYoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuICYod2xfdG9fZnVuYyh3bCktPmRldik7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3bDEyNzFfaGFyZGlycShpbnQgaXJxLCB2b2lkICpjb29raWUpCi17Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBjb29raWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXdsMTI3MV9kZWJ1ZyhERUJVR19JUlEsICJJUlEiKTsKLQotCS8qIGNvbXBsZXRlIHRoZSBFTFAgY29tcGxldGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwotCXNldF9iaXQoV0wxMjcxX0ZMQUdfSVJRX1JVTk5JTkcsICZ3bC0+ZmxhZ3MpOwotCWlmICh3bC0+ZWxwX2NvbXBsKSB7Ci0JCWNvbXBsZXRlKHdsLT5lbHBfY29tcGwpOwotCQl3bC0+ZWxwX2NvbXBsID0gTlVMTDsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1VTUEVOREVELCAmd2wtPmZsYWdzKSkgewotCQkvKiBkb24ndCBlbnF1ZXVlIGEgd29yayByaWdodCBub3cuIG1hcmsgaXQgYXMgcGVuZGluZyAqLwotCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BFTkRJTkdfV09SSywgJndsLT5mbGFncyk7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19JUlEsICJzaG91bGQgbm90IGVucXVldWUgd29yayIpOwotCQlkaXNhYmxlX2lycV9ub3N5bmMod2wtPmlycSk7Ci0JCXBtX3dha2V1cF9ldmVudCh3bDEyNzFfc2Rpb193bF90b19kZXYod2wpLCAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQotewotCWRpc2FibGVfaXJxKHdsLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQllbmFibGVfaXJxKHdsLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zZGlvX3Jhd19yZWFkKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLAogCQkJCSBzaXplX3QgbGVuLCBib29sIGZpeGVkKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGdsdWUtPmRldik7CiAKIAlpZiAodW5saWtlbHkoYWRkciA9PSBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIpKSB7CiAJCSgodTggKilidWYpWzBdID0gc2Rpb19mMF9yZWFkYihmdW5jLCBhZGRyLCAmcmV0KTsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX1NESU8sICJzZGlvIHJlYWQgNTIgYWRkciAweCV4LCBieXRlIDB4JTAyeCIsCi0JCQkgICAgIGFkZHIsICgodTggKilidWYpWzBdKTsKKwkJZGV2X2RiZyhjaGlsZC0+cGFyZW50LCAic2RpbyByZWFkIDUyIGFkZHIgMHgleCwgYnl0ZSAweCUwMnhcbiIsCisJCQlhZGRyLCAoKHU4ICopYnVmKVswXSk7CiAJfSBlbHNlIHsKIAkJaWYgKGZpeGVkKQogCQkJcmV0ID0gc2Rpb19yZWFkc2IoZnVuYywgYnVmLCBhZGRyLCBsZW4pOwogCQllbHNlCiAJCQlyZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZnVuYywgYnVmLCBhZGRyLCBsZW4pOwogCi0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyByZWFkIDUzIGFkZHIgMHgleCwgJXp1IGJ5dGVzIiwKLQkJCSAgICAgYWRkciwgbGVuKTsKLQkJd2wxMjcxX2R1bXBfYXNjaWkoREVCVUdfU0RJTywgImRhdGE6ICIsIGJ1ZiwgbGVuKTsKKwkJZGV2X2RiZyhjaGlsZC0+cGFyZW50LCAic2RpbyByZWFkIDUzIGFkZHIgMHgleCwgJXp1IGJ5dGVzXG4iLAorCQkJYWRkciwgbGVuKTsKIAl9CiAKIAlpZiAocmV0KQotCQl3bDEyNzFfZXJyb3IoInNkaW8gcmVhZCBmYWlsZWQgKCVkKSIsIHJldCk7CisJCWRldl9lcnIoY2hpbGQtPnBhcmVudCwgInNkaW8gcmVhZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fcmF3X3dyaXRlKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgYWRkciwgdm9pZCAqYnVmLAorc3RhdGljIHZvaWQgd2wxMnh4X3NkaW9fcmF3X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLAogCQkJCSAgc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhnbHVlLT5kZXYpOwogCiAJaWYgKHVubGlrZWx5KGFkZHIgPT0gSFdfQUNDRVNTX0VMUF9DVFJMX1JFR19BRERSKSkgewogCQlzZGlvX2YwX3dyaXRlYihmdW5jLCAoKHU4ICopYnVmKVswXSwgYWRkciwgJnJldCk7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyB3cml0ZSA1MiBhZGRyIDB4JXgsIGJ5dGUgMHglMDJ4IiwKLQkJCSAgICAgYWRkciwgKCh1OCAqKWJ1ZilbMF0pOworCQlkZXZfZGJnKGNoaWxkLT5wYXJlbnQsICJzZGlvIHdyaXRlIDUyIGFkZHIgMHgleCwgYnl0ZSAweCUwMnhcbiIsCisJCQlhZGRyLCAoKHU4ICopYnVmKVswXSk7CiAJfSBlbHNlIHsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX1NESU8sICJzZGlvIHdyaXRlIDUzIGFkZHIgMHgleCwgJXp1IGJ5dGVzIiwKLQkJCSAgICAgYWRkciwgbGVuKTsKLQkJd2wxMjcxX2R1bXBfYXNjaWkoREVCVUdfU0RJTywgImRhdGE6ICIsIGJ1ZiwgbGVuKTsKKwkJZGV2X2RiZyhjaGlsZC0+cGFyZW50LCAic2RpbyB3cml0ZSA1MyBhZGRyIDB4JXgsICV6dSBieXRlc1xuIiwKKwkJCWFkZHIsIGxlbik7CiAKIAkJaWYgKGZpeGVkKQogCQkJcmV0ID0gc2Rpb193cml0ZXNiKGZ1bmMsIGFkZHIsIGJ1ZiwgbGVuKTsKQEAgLTE1MywxMyArMTE0LDEzIEBACiAJfQogCiAJaWYgKHJldCkKLQkJd2wxMjcxX2Vycm9yKCJzZGlvIHdyaXRlIGZhaWxlZCAoJWQpIiwgcmV0KTsKKwkJZGV2X2VycihjaGlsZC0+cGFyZW50LCAic2RpbyB3cml0ZSBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2Rpb19wb3dlcl9vbihzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMnh4X3NkaW9fcG93ZXJfb24oc3RydWN0IHdsMTJ4eF9zZGlvX2dsdWUgKmdsdWUpCiB7Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOwogCWludCByZXQ7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZ2x1ZS0+ZGV2KTsKIAogCS8qIElmIGVuYWJsZWQsIHRlbGwgcnVudGltZSBQTSBub3QgdG8gcG93ZXIgb2ZmIHRoZSBjYXJkICovCiAJaWYgKHBtX3J1bnRpbWVfZW5hYmxlZCgmZnVuYy0+ZGV2KSkgewpAQCAtMTgwLDEwICsxNDEsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zZGlvX3Bvd2VyX29mZihzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMnh4X3NkaW9fcG93ZXJfb2ZmKHN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlKQogewotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKIAlpbnQgcmV0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGdsdWUtPmRldik7CiAKIAlzZGlvX2Rpc2FibGVfZnVuYyhmdW5jKTsKIAlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKQEAgLTIwMCw0NiArMTYxLDQzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2Rpb19zZXRfcG93ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCB3bDEyeHhfc2Rpb19zZXRfcG93ZXIoc3RydWN0IGRldmljZSAqY2hpbGQsIGJvb2wgZW5hYmxlKQogeworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOworCiAJaWYgKGVuYWJsZSkKLQkJcmV0dXJuIHdsMTI3MV9zZGlvX3Bvd2VyX29uKHdsKTsKKwkJcmV0dXJuIHdsMTJ4eF9zZGlvX3Bvd2VyX29uKGdsdWUpOwogCWVsc2UKLQkJcmV0dXJuIHdsMTI3MV9zZGlvX3Bvd2VyX29mZih3bCk7CisJCXJldHVybiB3bDEyeHhfc2Rpb19wb3dlcl9vZmYoZ2x1ZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgc2Rpb19vcHMgPSB7Ci0JLnJlYWQJCT0gd2wxMjcxX3NkaW9fcmF3X3JlYWQsCi0JLndyaXRlCQk9IHdsMTI3MV9zZGlvX3Jhd193cml0ZSwKLQkucG93ZXIJCT0gd2wxMjcxX3NkaW9fc2V0X3Bvd2VyLAotCS5kZXYJCT0gd2wxMjcxX3NkaW9fd2xfdG9fZGV2LAotCS5lbmFibGVfaXJxCT0gd2wxMjcxX3NkaW9fZW5hYmxlX2ludGVycnVwdHMsCi0JLmRpc2FibGVfaXJxCT0gd2wxMjcxX3NkaW9fZGlzYWJsZV9pbnRlcnJ1cHRzLAorCS5yZWFkCQk9IHdsMTJ4eF9zZGlvX3Jhd19yZWFkLAorCS53cml0ZQkJPSB3bDEyeHhfc2Rpb19yYXdfd3JpdGUsCisJLnBvd2VyCQk9IHdsMTJ4eF9zZGlvX3NldF9wb3dlciwKIAkuc2V0X2Jsb2NrX3NpemUgPSB3bDEyNzFfc2Rpb19zZXRfYmxvY2tfc2l6ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdsMTI3MV9wcm9iZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAogCQkJCSAgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQljb25zdCBzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKndsYW5fZGF0YTsKLQlzdHJ1Y3Qgd2wxMjcxICp3bDsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqd2xhbl9kYXRhOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlOworCXN0cnVjdCByZXNvdXJjZSByZXNbMV07CiAJbW1jX3BtX2ZsYWdfdCBtbWNmbGFnczsKLQlpbnQgcmV0OworCWludCByZXQgPSAtRU5PTUVNOwogCiAJLyogV2UgYXJlIG9ubHkgYWJsZSB0byBoYW5kbGUgdGhlIHdsYW4gZnVuY3Rpb24gKi8KIAlpZiAoZnVuYy0+bnVtICE9IDB4MDIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaHcgPSB3bDEyNzFfYWxsb2NfaHcoKTsKLQlpZiAoSVNfRVJSKGh3KSkKLQkJcmV0dXJuIFBUUl9FUlIoaHcpOworCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWlmICghZ2x1ZSkgeworCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBnbHVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCi0Jd2wgPSBody0+cHJpdjsKLQotCXdsLT5pZl9wcml2ID0gZnVuYzsKLQl3bC0+aWZfb3BzID0gJnNkaW9fb3BzOworCWdsdWUtPmRldiA9ICZmdW5jLT5kZXY7CiAKIAkvKiBHcmFiIGFjY2VzcyB0byBGTjAgZm9yIEVMUCByZWcuICovCiAJZnVuYy0+Y2FyZC0+cXVpcmtzIHw9IE1NQ19RVUlSS19MRU5JRU5UX0ZOMDsKQEAgLTI1MCw4MCArMjA4LDc5IEBACiAJd2xhbl9kYXRhID0gd2wxMnh4X2dldF9wbGF0Zm9ybV9kYXRhKCk7CiAJaWYgKElTX0VSUih3bGFuX2RhdGEpKSB7CiAJCXJldCA9IFBUUl9FUlIod2xhbl9kYXRhKTsKLQkJd2wxMjcxX2Vycm9yKCJtaXNzaW5nIHdsYW4gcGxhdGZvcm0gZGF0YTogJWQiLCByZXQpOwotCQlnb3RvIG91dF9mcmVlOworCQlkZXZfZXJyKGdsdWUtPmRldiwgIm1pc3Npbmcgd2xhbiBwbGF0Zm9ybSBkYXRhOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfZnJlZV9nbHVlOwogCX0KIAotCXdsLT5pcnEgPSB3bGFuX2RhdGEtPmlycTsKLQl3bC0+cmVmX2Nsb2NrID0gd2xhbl9kYXRhLT5ib2FyZF9yZWZfY2xvY2s7Ci0Jd2wtPnRjeG9fY2xvY2sgPSB3bGFuX2RhdGEtPmJvYXJkX3RjeG9fY2xvY2s7Ci0Jd2wtPnBsYXRmb3JtX3F1aXJrcyA9IHdsYW5fZGF0YS0+cGxhdGZvcm1fcXVpcmtzOworCS8qIGlmIHNkaW8gY2FuIGtlZXAgcG93ZXIgd2hpbGUgaG9zdCBpcyBzdXNwZW5kZWQsIGVuYWJsZSB3b3cgKi8KKwltbWNmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKKwlkZXZfZGJnKGdsdWUtPmRldiwgInNkaW8gUE0gY2FwcyA9IDB4JXhcbiIsIG1tY2ZsYWdzKTsKIAotCWlmICh3bC0+cGxhdGZvcm1fcXVpcmtzICYgV0wxMlhYX1BMQVRGT1JNX1FVSVJLX0VER0VfSVJRKQotCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkc7Ci0JZWxzZQotCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9UOworCWlmIChtbWNmbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKQorCQl3bGFuX2RhdGEtPnB3cl9pbl9zdXNwZW5kID0gdHJ1ZTsKIAotCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHdsLT5pcnEsIHdsMTI3MV9oYXJkaXJxLCB3bDEyNzFfaXJxLAotCQkJCSAgIGlycWZsYWdzLAotCQkJCSAgIERSSVZFUl9OQU1FLCB3bCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJyZXF1ZXN0X2lycSgpIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KKwl3bGFuX2RhdGEtPm9wcyA9ICZzZGlvX29wczsKIAotCXJldCA9IGVuYWJsZV9pcnFfd2FrZSh3bC0+aXJxKTsKLQlpZiAoIXJldCkgewotCQl3bC0+aXJxX3dha2VfZW5hYmxlZCA9IHRydWU7Ci0JCWRldmljZV9pbml0X3dha2V1cCh3bDEyNzFfc2Rpb193bF90b19kZXYod2wpLCAxKTsKLQotCQkvKiBpZiBzZGlvIGNhbiBrZWVwIHBvd2VyIHdoaWxlIGhvc3QgaXMgc3VzcGVuZGVkLCBlbmFibGUgd293ICovCi0JCW1tY2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOwotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gUE0gY2FwcyA9IDB4JXgiLCBtbWNmbGFncyk7Ci0KLQkJaWYgKG1tY2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpCi0JCQlody0+d2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9BTlk7Ci0JfQotCWRpc2FibGVfaXJxKHdsLT5pcnEpOwotCi0JcmV0ID0gd2wxMjcxX2luaXRfaWVlZTgwMjExKHdsKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9pcnE7Ci0KLQlyZXQgPSB3bDEyNzFfcmVnaXN0ZXJfaHcod2wpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2lycTsKLQotCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgd2wpOworCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgZ2x1ZSk7CiAKIAkvKiBUZWxsIFBNIGNvcmUgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBjYXJkIHRvIGJlIHBvd2VyZWQgbm93ICovCiAJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZmdW5jLT5kZXYpOwogCisJZ2x1ZS0+Y29yZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygid2wxMnh4IiwgLTEpOworCWlmICghZ2x1ZS0+Y29yZSkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFsbG9jYXRlIHBsYXRmb3JtX2RldmljZSIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2dsdWU7CisJfQorCisJZ2x1ZS0+Y29yZS0+ZGV2LnBhcmVudCA9ICZmdW5jLT5kZXY7CisKKwltZW1zZXQocmVzLCAweDAwLCBzaXplb2YocmVzKSk7CisKKwlyZXNbMF0uc3RhcnQgPSB3bGFuX2RhdGEtPmlycTsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwlyZXNbMF0ubmFtZSA9ICJpcnEiOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZ2x1ZS0+Y29yZSwgcmVzLCBBUlJBWV9TSVpFKHJlcykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhZGQgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBvdXRfZGV2X3B1dDsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgd2xhbl9kYXRhLAorCQkJCSAgICAgICBzaXplb2YoKndsYW5fZGF0YSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhZGQgcGxhdGZvcm0gZGF0YVxuIik7CisJCWdvdG8gb3V0X2Rldl9wdXQ7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChnbHVlLT5jb3JlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRldmljZVxuIik7CisJCWdvdG8gb3V0X2Rldl9wdXQ7CisJfQogCXJldHVybiAwOwogCi0gb3V0X2lycToKLQlmcmVlX2lycSh3bC0+aXJxLCB3bCk7CitvdXRfZGV2X3B1dDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGdsdWUtPmNvcmUpOwogCi0gb3V0X2ZyZWU6Ci0Jd2wxMjcxX2ZyZWVfaHcod2wpOworb3V0X2ZyZWVfZ2x1ZToKKwlrZnJlZShnbHVlKTsKIAorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3bDEyNzFfcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKIAogCS8qIFVuZG8gZGVjcmVtZW50IGRvbmUgYWJvdmUgaW4gd2wxMjcxX3Byb2JlICovCiAJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmZ1bmMtPmRldik7CiAKLQl3bDEyNzFfdW5yZWdpc3Rlcl9odyh3bCk7Ci0JaWYgKHdsLT5pcnFfd2FrZV9lbmFibGVkKSB7Ci0JCWRldmljZV9pbml0X3dha2V1cCh3bDEyNzFfc2Rpb193bF90b19kZXYod2wpLCAwKTsKLQkJZGlzYWJsZV9pcnFfd2FrZSh3bC0+aXJxKTsKLQl9Ci0JZnJlZV9pcnEod2wtPmlycSwgd2wpOwotCXdsMTI3MV9mcmVlX2h3KHdsKTsKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKGdsdWUtPmNvcmUpOworCXBsYXRmb3JtX2RldmljZV9wdXQoZ2x1ZS0+Y29yZSk7CisJa2ZyZWUoZ2x1ZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTMzMiwyMCArMjg5LDIxIEBACiAJLyogVGVsbCBNTUMvU0RJTyBjb3JlIGl0J3MgT0sgdG8gcG93ZXIgZG93biB0aGUgY2FyZAogCSAqIChpZiBpdCBpc24ndCBhbHJlYWR5KSwgYnV0IG5vdCB0byByZW1vdmUgaXQgY29tcGxldGVseSAqLwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGRldik7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGdsdWUtPmNvcmUpOwogCW1tY19wbV9mbGFnX3Qgc2Rpb19mbGFnczsKIAlpbnQgcmV0ID0gMDsKIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIndsMTI3MSBzdXNwZW5kLiB3b3dfZW5hYmxlZDogJWQiLAotCQkgICAgIHdsLT53b3dfZW5hYmxlZCk7CisJZGV2X2RiZyhkZXYsICJ3bDEyNzEgc3VzcGVuZC4gd293X2VuYWJsZWQ6ICVkXG4iLAorCQl3bC0+d293X2VuYWJsZWQpOwogCiAJLyogY2hlY2sgd2hldGhlciBzZGlvIHNob3VsZCBrZWVwIHBvd2VyICovCiAJaWYgKHdsLT53b3dfZW5hYmxlZCkgewogCQlzZGlvX2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOwogCiAJCWlmICghKHNkaW9fZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpIHsKLQkJCXdsMTI3MV9lcnJvcigiY2FuJ3Qga2VlcCBwb3dlciB3aGlsZSBob3N0ICIKLQkJCQkgICAgICJpcyBzdXNwZW5kZWQiKTsKKwkJCWRldl9lcnIoZGV2LCAiY2FuJ3Qga2VlcCBwb3dlciB3aGlsZSBob3N0ICIKKwkJCQkgICAgICJpcyBzdXNwZW5kZWRcbiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zNTMsNyArMzExLDcgQEAKIAkJLyoga2VlcCBwb3dlciB3aGlsZSBob3N0IHN1c3BlbmRlZCAqLwogCQlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9LRUVQX1BPV0VSKTsKIAkJaWYgKHJldCkgewotCQkJd2wxMjcxX2Vycm9yKCJlcnJvciB3aGlsZSB0cnlpbmcgdG8ga2VlcCBwb3dlciIpOworCQkJZGV2X2VycihkZXYsICJlcnJvciB3aGlsZSB0cnlpbmcgdG8ga2VlcCBwb3dlclxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0zNjcsOSArMzI1LDEwIEBACiBzdGF0aWMgaW50IHdsMTI3MV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGRldik7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGdsdWUtPmNvcmUpOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAid2wxMjcxIHJlc3VtZSIpOworCWRldl9kYmcoZGV2LCAid2wxMjcxIHJlc3VtZVxuIik7CiAJaWYgKHdsLT53b3dfZW5hYmxlZCkgewogCQkvKiBjbGFpbSBiYWNrIGhvc3QgKi8KIAkJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NkaW9fdGVzdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NkaW9fdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVkNWQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKgotICogU0RJTyB0ZXN0aW5nIGRyaXZlciBmb3Igd2wxMnh4Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uCi0gKgotICogQ29udGFjdDogUm9nZXIgUXVhZHJvcyA8cm9nZXIucXVhZHJvc0Bub2tpYS5jb20+Ci0gKgotICogd2wxMnh4IHJlYWQvd3JpdGUgcm91dGluZXMgdGFrZW4gZnJvbSB0aGUgbWFpbiBtb2R1bGUKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLQotI2luY2x1ZGUgIndsMTJ4eC5oIgotI2luY2x1ZGUgImlvLmgiCi0jaW5jbHVkZSAiYm9vdC5oIgotCi0jaWZuZGVmIFNESU9fVkVORE9SX0lEX1RJCi0jZGVmaW5lIFNESU9fVkVORE9SX0lEX1RJCQkweDAwOTcKLSNlbmRpZgotCi0jaWZuZGVmIFNESU9fREVWSUNFX0lEX1RJX1dMMTI3MQotI2RlZmluZSBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEJMHg0MDc2Ci0jZW5kaWYKLQotc3RhdGljIGJvb2wgcngsIHR4OwotCi1tb2R1bGVfcGFyYW0ocngsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MocngsICJQZXJmb3JtIHJ4IHRlc3QuIERlZmF1bHQgKDApLiAiCi0JIlRoaXMgdGVzdCBjb250aW51b3VzbHkgcmVhZHMgZGF0YSBmcm9tIHRoZSBTRElPIGRldmljZS5cbiIpOwotCi1tb2R1bGVfcGFyYW0odHgsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0ModHgsICJQZXJmb3JtIHR4IHRlc3QuIERlZmF1bHQgKDApLiAiCi0JIlRoaXMgdGVzdCBjb250aW51b3VzbHkgd3JpdGVzIGRhdGEgdG8gdGhlIFNESU8gZGV2aWNlLlxuIik7Ci0KLXN0cnVjdCB3bDEyNzFfdGVzdCB7Ci0Jc3RydWN0IHdsMTI3MSB3bDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRlc3RfdGFzazsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgd2wxMjcxX2RldmljZXNbXSA9IHsKLQl7IFNESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX1RJLCBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEpIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNkaW9fZnVuYyAqd2xfdG9fZnVuYyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlyZXR1cm4gd2wtPmlmX3ByaXY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICp3bDEyNzFfc2Rpb193bF90b19kZXYoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuICYod2xfdG9fZnVuYyh3bCktPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3Jhd19yZWFkKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgYWRkciwgdm9pZCAqYnVmLAotCQlzaXplX3QgbGVuLCBib29sIGZpeGVkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKLQotCWlmICh1bmxpa2VseShhZGRyID09IEhXX0FDQ0VTU19FTFBfQ1RSTF9SRUdfQUREUikpIHsKLQkJKCh1OCAqKWJ1ZilbMF0gPSBzZGlvX2YwX3JlYWRiKGZ1bmMsIGFkZHIsICZyZXQpOwotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gcmVhZCA1MiBhZGRyIDB4JXgsIGJ5dGUgMHglMDJ4IiwKLQkJCQlhZGRyLCAoKHU4ICopYnVmKVswXSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZpeGVkKQotCQkJcmV0ID0gc2Rpb19yZWFkc2IoZnVuYywgYnVmLCBhZGRyLCBsZW4pOwotCQllbHNlCi0JCQlyZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZnVuYywgYnVmLCBhZGRyLCBsZW4pOwotCi0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyByZWFkIDUzIGFkZHIgMHgleCwgJXp1IGJ5dGVzIiwKLQkJCQlhZGRyLCBsZW4pOwotCQl3bDEyNzFfZHVtcF9hc2NpaShERUJVR19TRElPLCAiZGF0YTogIiwgYnVmLCBsZW4pOwotCX0KLQotCWlmIChyZXQpCi0JCXdsMTI3MV9lcnJvcigic2RpbyByZWFkIGZhaWxlZCAoJWQpIiwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fcmF3X3dyaXRlKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgYWRkciwgdm9pZCAqYnVmLAotCQlzaXplX3QgbGVuLCBib29sIGZpeGVkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKLQotCWlmICh1bmxpa2VseShhZGRyID09IEhXX0FDQ0VTU19FTFBfQ1RSTF9SRUdfQUREUikpIHsKLQkJc2Rpb19mMF93cml0ZWIoZnVuYywgKCh1OCAqKWJ1ZilbMF0sIGFkZHIsICZyZXQpOwotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gd3JpdGUgNTIgYWRkciAweCV4LCBieXRlIDB4JTAyeCIsCi0JCQkJYWRkciwgKCh1OCAqKWJ1ZilbMF0pOwotCX0gZWxzZSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyB3cml0ZSA1MyBhZGRyIDB4JXgsICV6dSBieXRlcyIsCi0JCQkJYWRkciwgbGVuKTsKLQkJd2wxMjcxX2R1bXBfYXNjaWkoREVCVUdfU0RJTywgImRhdGE6ICIsIGJ1ZiwgbGVuKTsKLQotCQlpZiAoZml4ZWQpCi0JCQlyZXQgPSBzZGlvX3dyaXRlc2IoZnVuYywgYWRkciwgYnVmLCBsZW4pOwotCQllbHNlCi0JCQlyZXQgPSBzZGlvX21lbWNweV90b2lvKGZ1bmMsIGFkZHIsIGJ1ZiwgbGVuKTsKLQl9Ci0JaWYgKHJldCkKLQkJd2wxMjcxX2Vycm9yKCJzZGlvIHdyaXRlIGZhaWxlZCAoJWQpIiwgcmV0KTsKLQotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9zZGlvX3NldF9wb3dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOwotCWludCByZXQ7Ci0KLQkvKiBMZXQgdGhlIFNESU8gc3RhY2sgaGFuZGxlIHdsYW5fZW5hYmxlIGNvbnRyb2wsIHNvIHdlCi0JICoga2VlcCBob3N0IGNsYWltZWQgd2hpbGUgd2xhbiBpcyBpbiB1c2UgdG8ga2VlcCB3bDEyNzEKLQkgKiBhbGl2ZS4KLQkgKi8KLQlpZiAoZW5hYmxlKSB7Ci0JCS8qIFBvd2VyIHVwIHRoZSBjYXJkICovCi0JCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJmZ1bmMtPmRldik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJLyogUnVudGltZSBQTSBtaWdodCBiZSBkaXNhYmxlZCwgcG93ZXIgdXAgdGhlIGNhcmQgbWFudWFsbHkgKi8KLQkJcmV0ID0gbW1jX3Bvd2VyX3Jlc3RvcmVfaG9zdChmdW5jLT5jYXJkLT5ob3N0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQotCQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7Ci0JCXNkaW9fZW5hYmxlX2Z1bmMoZnVuYyk7Ci0JfSBlbHNlIHsKLQkJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7Ci0JCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCi0JCS8qIFJ1bnRpbWUgUE0gbWlnaHQgYmUgZGlzYWJsZWQsIHBvd2VyIG9mZiB0aGUgY2FyZCBtYW51YWxseSAqLwotCQlyZXQgPSBtbWNfcG93ZXJfc2F2ZV9ob3N0KGZ1bmMtPmNhcmQtPmhvc3QpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIFBvd2VyIGRvd24gdGhlIGNhcmQgKi8KLQkJcmV0ID0gcG1fcnVudGltZV9wdXRfc3luYygmZnVuYy0+ZGV2KTsKLQl9Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQotewotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgc2Rpb19vcHMgPSB7Ci0JLnJlYWQJCT0gd2wxMjcxX3NkaW9fcmF3X3JlYWQsCi0JLndyaXRlCQk9IHdsMTI3MV9zZGlvX3Jhd193cml0ZSwKLQkucG93ZXIJCT0gd2wxMjcxX3NkaW9fc2V0X3Bvd2VyLAotCS5kZXYJCT0gd2wxMjcxX3NkaW9fd2xfdG9fZGV2LAotCS5lbmFibGVfaXJxCT0gd2wxMjcxX3NkaW9fZW5hYmxlX2ludGVycnVwdHMsCi0JLmRpc2FibGVfaXJxCT0gd2wxMjcxX3NkaW9fZGlzYWJsZV9pbnRlcnJ1cHRzLAotfTsKLQotc3RhdGljIHZvaWQgd2wxMjcxX2Z3X3dha2V1cChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQl1MzIgZWxwX3JlZzsKLQotCWVscF9yZWcgPSBFTFBDVFJMX1dBS0VfVVA7Ci0Jd2wxMjcxX3Jhd193cml0ZTMyKHdsLCBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIsIGVscF9yZWcpOwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9mZXRjaF9maXJtd2FyZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWludCByZXQ7Ci0KLQlpZiAod2wtPmNoaXAuaWQgPT0gQ0hJUF9JRF8xMjgzX1BHMjApCi0JCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTDEyOFhfRldfTkFNRSwKLQkJCQkgICAgICAgd2wxMjcxX3dsX3RvX2Rldih3bCkpOwotCWVsc2UKLQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIFdMMTI3WF9GV19OQU1FLAotCQkJCSAgICAgICB3bDEyNzFfd2xfdG9fZGV2KHdsKSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgZmlybXdhcmU6ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoZnctPnNpemUgJSA0KSB7Ci0JCXdsMTI3MV9lcnJvcigiZmlybXdhcmUgc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMzIgYml0czogJXp1IiwKLQkJCQlmdy0+c2l6ZSk7Ci0JCXJldCA9IC1FSUxTRVE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXdsLT5md19sZW4gPSBmdy0+c2l6ZTsKLQl3bC0+ZncgPSB2bWFsbG9jKHdsLT5md19sZW4pOwotCi0JaWYgKCF3bC0+ZncpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZmlybXdhcmUiKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtY3B5KHdsLT5mdywgZnctPmRhdGEsIHdsLT5md19sZW4pOwotCi0JcmV0ID0gMDsKLQotb3V0OgotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfZmV0Y2hfbnZzKHN0cnVjdCB3bDEyNzEgKndsKQotewotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTDEyWFhfTlZTX05BTUUsIHdsMTI3MV93bF90b19kZXYod2wpKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBudnMgZmlsZTogJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXdsLT5udnMgPSBrbWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXdsLT5udnMpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbnZzIGZpbGUiKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jd2wtPm52c19sZW4gPSBmdy0+c2l6ZTsKLQotb3V0OgotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfY2hpcF93YWtldXAoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0Jc3RydWN0IHdsMTI3MV9wYXJ0aXRpb25fc2V0IHBhcnRpdGlvbjsKLQlpbnQgcmV0OwotCi0JbXNsZWVwKFdMMTI3MV9QUkVfUE9XRVJfT05fU0xFRVApOwotCXJldCA9IHdsMTI3MV9wb3dlcl9vbih3bCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW1zbGVlcChXTDEyNzFfUE9XRVJfT05fU0xFRVApOwotCi0JLyogV2UgZG9uJ3QgbmVlZCBhIHJlYWwgbWVtb3J5IHBhcnRpdGlvbiBoZXJlLCBiZWNhdXNlIHdlIG9ubHkgd2FudAotCSAqIHRvIHVzZSB0aGUgcmVnaXN0ZXJzIGF0IHRoaXMgcG9pbnQuICovCi0JbWVtc2V0KCZwYXJ0aXRpb24sIDAsIHNpemVvZihwYXJ0aXRpb24pKTsKLQlwYXJ0aXRpb24ucmVnLnN0YXJ0ID0gUkVHSVNURVJTX0JBU0U7Ci0JcGFydGl0aW9uLnJlZy5zaXplID0gUkVHSVNURVJTX0RPV05fU0laRTsKLQl3bDEyNzFfc2V0X3BhcnRpdGlvbih3bCwgJnBhcnRpdGlvbik7Ci0KLQkvKiBFTFAgbW9kdWxlIHdha2UgdXAgKi8KLQl3bDEyNzFfZndfd2FrZXVwKHdsKTsKLQotCS8qIHdoYWxfRndDdHJsX0Jvb3RTbSgpICovCi0KLQkvKiAwLiByZWFkIGNoaXAgaWQgZnJvbSBDSElQX0lEICovCi0Jd2wtPmNoaXAuaWQgPSB3bDEyNzFfcmVhZDMyKHdsLCBDSElQX0lEX0IpOwotCi0JLyogMS4gY2hlY2sgaWYgY2hpcCBpZCBpcyB2YWxpZCAqLwotCi0Jc3dpdGNoICh3bC0+Y2hpcC5pZCkgewotCWNhc2UgQ0hJUF9JRF8xMjcxX1BHMTA6Ci0JCXdsMTI3MV93YXJuaW5nKCJjaGlwIGlkIDB4JXggKDEyNzEgUEcxMCkgc3VwcG9ydCBpcyBvYnNvbGV0ZSIsCi0JCQkJd2wtPmNoaXAuaWQpOwotCQlicmVhazsKLQljYXNlIENISVBfSURfMTI3MV9QRzIwOgotCQl3bDEyNzFfbm90aWNlKCJjaGlwIGlkIDB4JXggKDEyNzEgUEcyMCkiLAotCQkJCXdsLT5jaGlwLmlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0lEXzEyODNfUEcyMDoKLQkJd2wxMjcxX25vdGljZSgiY2hpcCBpZCAweCV4ICgxMjgzIFBHMjApIiwKLQkJCQl3bC0+Y2hpcC5pZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9JRF8xMjgzX1BHMTA6Ci0JZGVmYXVsdDoKLQkJd2wxMjcxX3dhcm5pbmcoInVuc3VwcG9ydGVkIGNoaXAgaWQ6IDB4JXgiLCB3bC0+Y2hpcC5pZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2wxMjcxX3BhcnRpdGlvbl9zZXQgcGFydF9kb3duID0gewotCS5tZW0gPSB7Ci0JCS5zdGFydCA9IDB4MDAwMDAwMDAsCi0JCS5zaXplICA9IDB4MDAwMTc3YzAKLQl9LAotCS5yZWcgPSB7Ci0JCS5zdGFydCA9IFJFR0lTVEVSU19CQVNFLAotCQkuc2l6ZSAgPSAweDAwMDA4ODAwCi0JfSwKLQkubWVtMiA9IHsKLQkJLnN0YXJ0ID0gMHgwMDAwMDAwMCwKLQkJLnNpemUgID0gMHgwMDAwMDAwMAotCX0sCi0JLm1lbTMgPSB7Ci0JCS5zdGFydCA9IDB4MDAwMDAwMDAsCi0JCS5zaXplICA9IDB4MDAwMDAwMDAKLQl9LAotfTsKLQotc3RhdGljIGludCB0ZXN0ZXIodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGRhdGE7Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IHdsX3RvX2Z1bmMod2wpOwotCXN0cnVjdCBkZXZpY2UgKnBkZXYgPSAmZnVuYy0+ZGV2OwotCWludCByZXQgPSAwOwotCWJvb2wgcnhfc3RhcnRlZCA9IDA7Ci0JYm9vbCB0eF9zdGFydGVkID0gMDsKLQl1aW50OF90ICp0eF9idWYsICpyeF9idWY7Ci0JaW50IHRlc3Rfc2l6ZSA9IFBBR0VfU0laRTsKLQl1MzIgYWRkciA9IDA7Ci0Jc3RydWN0IHdsMTI3MV9wYXJ0aXRpb25fc2V0IHBhcnRpdGlvbjsKLQotCS8qIFdlIGFzc3VtZSBjaGlwIGlzIHBvd2VyZWQgdXAgYW5kIGZpcm13YXJlIGZldGNoZWQgKi8KLQotCW1lbWNweSgmcGFydGl0aW9uLCAmcGFydF9kb3duLCBzaXplb2YocGFydGl0aW9uKSk7Ci0JcGFydGl0aW9uLm1lbS5zdGFydCA9IGFkZHI7Ci0Jd2wxMjcxX3NldF9wYXJ0aXRpb24od2wsICZwYXJ0aXRpb24pOwotCi0JdHhfYnVmID0ga21hbGxvYyh0ZXN0X3NpemUsIEdGUF9LRVJORUwpOwotCXJ4X2J1ZiA9IGttYWxsb2ModGVzdF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4X2J1ZiB8fCAhcnhfYnVmKSB7Ci0JCWRldl9lcnIocGRldiwKLQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5LiBUZXN0IHdpbGwgbm90IHJ1bi5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWU7Ci0JfQotCi0JbWVtc2V0KHR4X2J1ZiwgMHg1YSwgdGVzdF9zaXplKTsKLQotCS8qIHdyaXRlIHNvbWV0aGluZyBpbiBkYXRhIGFyZWEgc28gd2UgY2FuIHJlYWQgaXQgYmFjayAqLwotCXdsMTI3MV93cml0ZSh3bCwgYWRkciwgdHhfYnVmLCB0ZXN0X3NpemUsIGZhbHNlKTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWlmIChyeCAmJiAhcnhfc3RhcnRlZCkgewotCQkJZGV2X2luZm8ocGRldiwgInN0YXJ0aW5nIHJ4IHRlc3RcbiIpOwotCQkJcnhfc3RhcnRlZCA9IDE7Ci0JCX0gZWxzZSBpZiAoIXJ4ICYmIHJ4X3N0YXJ0ZWQpIHsKLQkJCWRldl9pbmZvKHBkZXYsICJzdG9wcGluZyByeCB0ZXN0XG4iKTsKLQkJCXJ4X3N0YXJ0ZWQgPSAwOwotCQl9Ci0KLQkJaWYgKHR4ICYmICF0eF9zdGFydGVkKSB7Ci0JCQlkZXZfaW5mbyhwZGV2LCAic3RhcnRpbmcgdHggdGVzdFxuIik7Ci0JCQl0eF9zdGFydGVkID0gMTsKLQkJfSBlbHNlIGlmICghdHggJiYgdHhfc3RhcnRlZCkgewotCQkJZGV2X2luZm8ocGRldiwgInN0b3BwaW5nIHR4IHRlc3RcbiIpOwotCQkJdHhfc3RhcnRlZCA9IDA7Ci0JCX0KLQotCQlpZiAocnhfc3RhcnRlZCkKLQkJCXdsMTI3MV9yZWFkKHdsLCBhZGRyLCByeF9idWYsIHRlc3Rfc2l6ZSwgZmFsc2UpOwotCi0JCWlmICh0eF9zdGFydGVkKQotCQkJd2wxMjcxX3dyaXRlKHdsLCBhZGRyLCB0eF9idWYsIHRlc3Rfc2l6ZSwgZmFsc2UpOwotCi0JCWlmICghcnhfc3RhcnRlZCAmJiAhdHhfc3RhcnRlZCkKLQkJCW1zbGVlcCgxMDApOwotCX0KLQotZnJlZToKLQlrZnJlZSh0eF9idWYpOwotCWtmcmVlKHJ4X2J1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCi0JCWNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCi17Ci0JY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICp3bGFuX2RhdGE7Ci0Jc3RydWN0IHdsMTI3MSAqd2w7Ci0Jc3RydWN0IHdsMTI3MV90ZXN0ICp3bF90ZXN0OwotCWludCByZXQgPSAwOwotCi0JLyogd2wxMjcxIGhhcyAyIHNkaW8gZnVuY3Rpb25zIHdlIGhhbmRsZSBqdXN0IHRoZSB3bGFuIHBhcnQgKi8KLQlpZiAoZnVuYy0+bnVtICE9IDB4MDIpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2xfdGVzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bDEyNzFfdGVzdCksIEdGUF9LRVJORUwpOwotCWlmICghd2xfdGVzdCkgewotCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jd2wgPSAmd2xfdGVzdC0+d2w7Ci0KLQl3bC0+aWZfcHJpdiA9IGZ1bmM7Ci0Jd2wtPmlmX29wcyA9ICZzZGlvX29wczsKLQotCS8qIEdyYWIgYWNjZXNzIHRvIEZOMCBmb3IgRUxQIHJlZy4gKi8KLQlmdW5jLT5jYXJkLT5xdWlya3MgfD0gTU1DX1FVSVJLX0xFTklFTlRfRk4wOwotCi0JLyogVXNlIGJsb2NrIG1vZGUgZm9yIHRyYW5zZmVycmluZyBvdmVyIG9uZSBibG9jayBzaXplIG9mIGRhdGEgKi8KLQlmdW5jLT5jYXJkLT5xdWlya3MgfD0gTU1DX1FVSVJLX0JMS1NaX0ZPUl9CWVRFX01PREU7Ci0KLQl3bGFuX2RhdGEgPSB3bDEyeHhfZ2V0X3BsYXRmb3JtX2RhdGEoKTsKLQlpZiAoSVNfRVJSKHdsYW5fZGF0YSkpIHsKLQkJcmV0ID0gUFRSX0VSUih3bGFuX2RhdGEpOwotCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJtaXNzaW5nIHdsYW4gcGxhdGZvcm0gZGF0YTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0Jd2wtPmlycSA9IHdsYW5fZGF0YS0+aXJxOwotCXdsLT5yZWZfY2xvY2sgPSB3bGFuX2RhdGEtPmJvYXJkX3JlZl9jbG9jazsKLQl3bC0+dGN4b19jbG9jayA9IHdsYW5fZGF0YS0+Ym9hcmRfdGN4b19jbG9jazsKLQotCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgd2xfdGVzdCk7Ci0KLQkvKiBwb3dlciB1cCB0aGUgZGV2aWNlICovCi0JcmV0ID0gd2wxMjcxX2NoaXBfd2FrZXVwKHdsKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmZ1bmMtPmRldiwgImNvdWxkIG5vdCB3YWtlIHVwIGNoaXBcbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWlmICh3bC0+ZncgPT0gTlVMTCkgewotCQlyZXQgPSB3bDEyNzFfZmV0Y2hfZmlybXdhcmUod2wpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmZnVuYy0+ZGV2LCAiZmlybXdhcmUgZmV0Y2ggZXJyb3JcbiIpOwotCQkJZ290byBvdXRfb2ZmOwotCQl9Ci0JfQotCi0JLyogZmV0Y2ggTlZTICovCi0JaWYgKHdsLT5udnMgPT0gTlVMTCkgewotCQlyZXQgPSB3bDEyNzFfZmV0Y2hfbnZzKHdsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmZ1bmMtPmRldiwgIk5WUyBmZXRjaCBlcnJvclxuIik7Ci0JCQlnb3RvIG91dF9vZmY7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB3bDEyNzFfbG9hZF9maXJtd2FyZSh3bCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZnVuYy0+ZGV2LCAiZmlybXdhcmUgbG9hZCBlcnJvcjogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JZGV2X2luZm8oJmZ1bmMtPmRldiwgImluaXRpYWxpemVkXG4iKTsKLQotCS8qIEkvTyB0ZXN0aW5nIHdpbGwgYmUgZG9uZSBpbiB0aGUgdGVzdGVyIHRocmVhZCAqLwotCi0Jd2xfdGVzdC0+dGVzdF90YXNrID0ga3RocmVhZF9ydW4odGVzdGVyLCB3bCwgInNkaW9fdGVzdGVyIik7Ci0JaWYgKElTX0VSUih3bF90ZXN0LT50ZXN0X3Rhc2spKSB7Ci0JCWRldl9lcnIoJmZ1bmMtPmRldiwgInVuYWJsZSB0byBjcmVhdGUga2VybmVsIHRocmVhZFxuIik7Ci0JCXJldCA9IFBUUl9FUlIod2xfdGVzdC0+dGVzdF90YXNrKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotb3V0X29mZjoKLQkvKiBwb3dlciBvZmYgdGhlIGNoaXAgKi8KLQl3bDEyNzFfcG93ZXJfb2ZmKHdsKTsKLQotb3V0X2ZyZWU6Ci0Ja2ZyZWUod2xfdGVzdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHdsMTI3MV9yZW1vdmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKLXsKLQlzdHJ1Y3Qgd2wxMjcxX3Rlc3QgKndsX3Rlc3QgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOwotCi0JLyogc3RvcCB0aGUgSS9PIHRlc3QgdGhyZWFkICovCi0Ja3RocmVhZF9zdG9wKHdsX3Rlc3QtPnRlc3RfdGFzayk7Ci0KLQkvKiBwb3dlciBvZmYgdGhlIGNoaXAgKi8KLQl3bDEyNzFfcG93ZXJfb2ZmKCZ3bF90ZXN0LT53bCk7Ci0KLQl2ZnJlZSh3bF90ZXN0LT53bC5mdyk7Ci0Jd2xfdGVzdC0+d2wuZncgPSBOVUxMOwotCWtmcmVlKHdsX3Rlc3QtPndsLm52cyk7Ci0Jd2xfdGVzdC0+d2wubnZzID0gTlVMTDsKLQotCWtmcmVlKHdsX3Rlc3QpOwotfQotCi1zdGF0aWMgc3RydWN0IHNkaW9fZHJpdmVyIHdsMTI3MV9zZGlvX2RyaXZlciA9IHsKLQkubmFtZQkJPSAid2wxMnh4X3NkaW9fdGVzdCIsCi0JLmlkX3RhYmxlCT0gd2wxMjcxX2RldmljZXMsCi0JLnByb2JlCQk9IHdsMTI3MV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdsMTI3MV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd2wxMjcxX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJndsMTI3MV9zZGlvX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIHNkaW8gZHJpdmVyOiAlZFxuIiwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfaW5pdCh3bDEyNzFfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3bDEyNzFfZXhpdCh2b2lkKQotewotCXNkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJndsMTI3MV9zZGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh3bDEyNzFfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlJvZ2VyIFF1YWRyb3MgPHJvZ2VyLnF1YWRyb3NAbm9raWEuY29tPiIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc3BpLmMKaW5kZXggMGY5NzE4Ni4uOTJjYWE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvd2wxMnh4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCkBAIC02OSwzNSArNzAsMjIgQEAKIAogI2RlZmluZSBXU1BJX01BWF9OVU1fT0ZfQ0hVTktTIChXTDEyNzFfQUdHUl9CVUZGRVJfU0laRSAvIFdTUElfTUFYX0NIVU5LX1NJWkUpCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNwaV9kZXZpY2UgKndsX3RvX3NwaShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlyZXR1cm4gd2wtPmlmX3ByaXY7Ci19CitzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29yZTsKK307CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICp3bDEyNzFfc3BpX3dsX3RvX2RldihzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zcGlfcmVzZXQoc3RydWN0IGRldmljZSAqY2hpbGQpCiB7Ci0JcmV0dXJuICYod2xfdG9fc3BpKHdsKS0+ZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NwaV9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JZGlzYWJsZV9pcnEod2wtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JZW5hYmxlX2lycSh3bC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NwaV9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOwogCXU4ICpjbWQ7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0OwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCiAJY21kID0ga3phbGxvYyhXU1BJX0lOSVRfQ01EX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbWQpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgY21kIGZvciBzcGkgcmVzZXQiKTsKKwkJZGV2X2VycihjaGlsZC0+cGFyZW50LAorCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBjbWQgZm9yIHNwaSByZXNldFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExMCwyMSArOTgsMjIgQEAKIAl0LmxlbiA9IFdTUElfSU5JVF9DTURfTEVOOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CiAKLQlzcGlfc3luYyh3bF90b19zcGkod2wpLCAmbSk7CisJc3BpX3N5bmModG9fc3BpX2RldmljZShnbHVlLT5kZXYpLCAmbSk7CiAKLQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGkgcmVzZXQgLT4gIiwgY21kLCBXU1BJX0lOSVRfQ01EX0xFTik7CiAJa2ZyZWUoY21kKTsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3NwaV9pbml0KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMnh4X3NwaV9pbml0KHN0cnVjdCBkZXZpY2UgKmNoaWxkKQogeworCXN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoY2hpbGQtPnBhcmVudCk7CiAJdTggY3JjW1dTUElfSU5JVF9DTURfQ1JDX0xFTl0sICpjbWQ7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0OwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCiAJY21kID0ga3phbGxvYyhXU1BJX0lOSVRfQ01EX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbWQpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgY21kIGZvciBzcGkgaW5pdCIpOworCQlkZXZfZXJyKGNoaWxkLT5wYXJlbnQsCisJCQkiY291bGQgbm90IGFsbG9jYXRlIGNtZCBmb3Igc3BpIGluaXRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNjUsMTUgKzE1NCwxNiBAQAogCXQubGVuID0gV1NQSV9JTklUX0NNRF9MRU47CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKIAotCXNwaV9zeW5jKHdsX3RvX3NwaSh3bCksICZtKTsKLQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGkgaW5pdCAtPiAiLCBjbWQsIFdTUElfSU5JVF9DTURfTEVOKTsKKwlzcGlfc3luYyh0b19zcGlfZGV2aWNlKGdsdWUtPmRldiksICZtKTsKIAlrZnJlZShjbWQpOwogfQogCiAjZGVmaW5lIFdMMTI3MV9CVVNZX1dPUkRfVElNRU9VVCAxMDAwCiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NwaV9yZWFkX2J1c3koc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTJ4eF9zcGlfcmVhZF9idXN5KHN0cnVjdCBkZXZpY2UgKmNoaWxkKQogeworCXN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoY2hpbGQtPnBhcmVudCk7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBkZXZfZ2V0X2RydmRhdGEoY2hpbGQpOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsxXTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAl1MzIgKmJ1c3lfYnVmOwpAQCAtMTk0LDIwICsxODQsMjIgQEAKIAkJdFswXS5sZW4gPSBzaXplb2YodTMyKTsKIAkJdFswXS5jc19jaGFuZ2UgPSB0cnVlOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOwotCQlzcGlfc3luYyh3bF90b19zcGkod2wpLCAmbSk7CisJCXNwaV9zeW5jKHRvX3NwaV9kZXZpY2UoZ2x1ZS0+ZGV2KSwgJm0pOwogCiAJCWlmICgqYnVzeV9idWYgJiAweDEpCiAJCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBUaGUgU1BJIGJ1cyBpcyB1bnJlc3BvbnNpdmUsIHRoZSByZWFkIGZhaWxlZC4gKi8KLQl3bDEyNzFfZXJyb3IoIlNQSSByZWFkIGJ1c3ktd29yZCB0aW1lb3V0IVxuIik7CisJZGV2X2VycihjaGlsZC0+cGFyZW50LCAiU1BJIHJlYWQgYnVzeS13b3JkIHRpbWVvdXQhXG4iKTsKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3NwaV9yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zcGlfcmF3X3JlYWQoc3RydWN0IGRldmljZSAqY2hpbGQsIGludCBhZGRyLCB2b2lkICpidWYsCiAJCQkJc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOworCXN0cnVjdCB3bDEyNzEgKndsID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkKTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAJdTMyICpidXN5X2J1ZjsKQEAgLTI0MywxMCArMjM1LDEwIEBACiAJCXRbMV0uY3NfY2hhbmdlID0gdHJ1ZTsKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKIAotCQlzcGlfc3luYyh3bF90b19zcGkod2wpLCAmbSk7CisJCXNwaV9zeW5jKHRvX3NwaV9kZXZpY2UoZ2x1ZS0+ZGV2KSwgJm0pOwogCiAJCWlmICghKGJ1c3lfYnVmW1dMMTI3MV9CVVNZX1dPUkRfQ05UIC0gMV0gJiAweDEpICYmCi0JCSAgICB3bDEyNzFfc3BpX3JlYWRfYnVzeSh3bCkpIHsKKwkJICAgIHdsMTJ4eF9zcGlfcmVhZF9idXN5KGNoaWxkKSkgewogCQkJbWVtc2V0KGJ1ZiwgMCwgY2h1bmtfbGVuKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjU5LDEwICsyNTEsNyBAQAogCQl0WzBdLmNzX2NoYW5nZSA9IHRydWU7CiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CiAKLQkJc3BpX3N5bmMod2xfdG9fc3BpKHdsKSwgJm0pOwotCi0JCXdsMTI3MV9kdW1wKERFQlVHX1NQSSwgInNwaV9yZWFkIGNtZCAtPiAiLCBjbWQsIHNpemVvZigqY21kKSk7Ci0JCXdsMTI3MV9kdW1wKERFQlVHX1NQSSwgInNwaV9yZWFkIGJ1ZiA8LSAiLCBidWYsIGNodW5rX2xlbik7CisJCXNwaV9zeW5jKHRvX3NwaV9kZXZpY2UoZ2x1ZS0+ZGV2KSwgJm0pOwogCiAJCWlmICghZml4ZWQpCiAJCQlhZGRyICs9IGNodW5rX2xlbjsKQEAgLTI3MSw5ICsyNjAsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfcmF3X3dyaXRlKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgYWRkciwgdm9pZCAqYnVmLAotCQkJICBzaXplX3QgbGVuLCBib29sIGZpeGVkKQorc3RhdGljIHZvaWQgd2wxMnh4X3NwaV9yYXdfd3JpdGUoc3RydWN0IGRldmljZSAqY2hpbGQsIGludCBhZGRyLCB2b2lkICpidWYsCisJCQkJIHNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCiB7CisJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMiAqIFdTUElfTUFYX05VTV9PRl9DSFVOS1NdOwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCXUzMiBjb21tYW5kc1tXU1BJX01BWF9OVU1fT0ZfQ0hVTktTXTsKQEAgLTMwOCw5ICsyOTgsNiBAQAogCQl0W2ldLmxlbiA9IGNodW5rX2xlbjsKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbaSsrXSwgJm0pOwogCi0JCXdsMTI3MV9kdW1wKERFQlVHX1NQSSwgInNwaV93cml0ZSBjbWQgLT4gIiwgY21kLCBzaXplb2YoKmNtZCkpOwotCQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGlfd3JpdGUgYnVmIC0+ICIsIGJ1ZiwgY2h1bmtfbGVuKTsKLQogCQlpZiAoIWZpeGVkKQogCQkJYWRkciArPSBjaHVua19sZW47CiAJCWJ1ZiArPSBjaHVua19sZW47CkBAIC0zMTgsNzIgKzMwNSw0MSBAQAogCQljbWQrKzsKIAl9CiAKLQlzcGlfc3luYyh3bF90b19zcGkod2wpLCAmbSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3bDEyNzFfaGFyZGlycShpbnQgaXJxLCB2b2lkICpjb29raWUpCi17Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBjb29raWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXdsMTI3MV9kZWJ1ZyhERUJVR19JUlEsICJJUlEiKTsKLQotCS8qIGNvbXBsZXRlIHRoZSBFTFAgY29tcGxldGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwotCXNldF9iaXQoV0wxMjcxX0ZMQUdfSVJRX1JVTk5JTkcsICZ3bC0+ZmxhZ3MpOwotCWlmICh3bC0+ZWxwX2NvbXBsKSB7Ci0JCWNvbXBsZXRlKHdsLT5lbHBfY29tcGwpOwotCQl3bC0+ZWxwX2NvbXBsID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX3NwaV9zZXRfcG93ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQotewotCWlmICh3bC0+c2V0X3Bvd2VyKQotCQl3bC0+c2V0X3Bvd2VyKGVuYWJsZSk7Ci0KLQlyZXR1cm4gMDsKKwlzcGlfc3luYyh0b19zcGlfZGV2aWNlKGdsdWUtPmRldiksICZtKTsKIH0KIAogc3RhdGljIHN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyBzcGlfb3BzID0gewotCS5yZWFkCQk9IHdsMTI3MV9zcGlfcmF3X3JlYWQsCi0JLndyaXRlCQk9IHdsMTI3MV9zcGlfcmF3X3dyaXRlLAotCS5yZXNldAkJPSB3bDEyNzFfc3BpX3Jlc2V0LAotCS5pbml0CQk9IHdsMTI3MV9zcGlfaW5pdCwKLQkucG93ZXIJCT0gd2wxMjcxX3NwaV9zZXRfcG93ZXIsCi0JLmRldgkJPSB3bDEyNzFfc3BpX3dsX3RvX2RldiwKLQkuZW5hYmxlX2lycQk9IHdsMTI3MV9zcGlfZW5hYmxlX2ludGVycnVwdHMsCi0JLmRpc2FibGVfaXJxCT0gd2wxMjcxX3NwaV9kaXNhYmxlX2ludGVycnVwdHMsCisJLnJlYWQJCT0gd2wxMnh4X3NwaV9yYXdfcmVhZCwKKwkud3JpdGUJCT0gd2wxMnh4X3NwaV9yYXdfd3JpdGUsCisJLnJlc2V0CQk9IHdsMTJ4eF9zcGlfcmVzZXQsCisJLmluaXQJCT0gd2wxMnh4X3NwaV9pbml0LAogCS5zZXRfYmxvY2tfc2l6ZSA9IE5VTEwsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bDEyNzFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlOwogCXN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0Jc3RydWN0IHdsMTI3MSAqd2w7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQlpbnQgcmV0OworCXN0cnVjdCByZXNvdXJjZSByZXNbMV07CisJaW50IHJldCA9IC1FTk9NRU07CiAKIAlwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwZGF0YSkgewotCQl3bDEyNzFfZXJyb3IoIm5vIHBsYXRmb3JtIGRhdGEiKTsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaHcgPSB3bDEyNzFfYWxsb2NfaHcoKTsKLQlpZiAoSVNfRVJSKGh3KSkKLQkJcmV0dXJuIFBUUl9FUlIoaHcpOworCXBkYXRhLT5vcHMgPSAmc3BpX29wczsKIAotCXdsID0gaHctPnByaXY7CisJZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnbHVlKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgZ2x1ZVxuIik7CisJCWdvdG8gb3V0OworCX0KIAotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHdsKTsKLQl3bC0+aWZfcHJpdiA9IHNwaTsKKwlnbHVlLT5kZXYgPSAmc3BpLT5kZXY7CiAKLQl3bC0+aWZfb3BzID0gJnNwaV9vcHM7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgZ2x1ZSk7CiAKIAkvKiBUaGlzIGlzIHRoZSBvbmx5IFNQSSB2YWx1ZSB0aGF0IHdlIG5lZWQgdG8gc2V0IGhlcmUsIHRoZSByZXN0CiAJICogY29tZXMgZnJvbSB0aGUgYm9hcmQtcGVyaXBoZXJhbHMgZmlsZSAqLwpAQCAtMzkxLDY5ICszNDcsNjEgQEAKIAogCXJldCA9IHNwaV9zZXR1cChzcGkpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigic3BpX3NldHVwIGZhaWxlZCIpOwotCQlnb3RvIG91dF9mcmVlOworCQlkZXZfZXJyKGdsdWUtPmRldiwgInNwaV9zZXR1cCBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlX2dsdWU7CiAJfQogCi0Jd2wtPnNldF9wb3dlciA9IHBkYXRhLT5zZXRfcG93ZXI7Ci0JaWYgKCF3bC0+c2V0X3Bvd2VyKSB7Ci0JCXdsMTI3MV9lcnJvcigic2V0IHBvd2VyIGZ1bmN0aW9uIG1pc3NpbmcgaW4gcGxhdGZvcm0gZGF0YSIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF9mcmVlOworCWdsdWUtPmNvcmUgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIndsMTJ4eCIsIC0xKTsKKwlpZiAoIWdsdWUtPmNvcmUpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBwbGF0Zm9ybV9kZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2dsdWU7CiAJfQogCi0Jd2wtPnJlZl9jbG9jayA9IHBkYXRhLT5ib2FyZF9yZWZfY2xvY2s7Ci0Jd2wtPnRjeG9fY2xvY2sgPSBwZGF0YS0+Ym9hcmRfdGN4b19jbG9jazsKLQl3bC0+cGxhdGZvcm1fcXVpcmtzID0gcGRhdGEtPnBsYXRmb3JtX3F1aXJrczsKKwlnbHVlLT5jb3JlLT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCi0JaWYgKHdsLT5wbGF0Zm9ybV9xdWlya3MgJiBXTDEyWFhfUExBVEZPUk1fUVVJUktfRURHRV9JUlEpCi0JCWlycWZsYWdzID0gSVJRRl9UUklHR0VSX1JJU0lORzsKLQllbHNlCi0JCWlycWZsYWdzID0gSVJRRl9UUklHR0VSX0hJR0ggfCBJUlFGX09ORVNIT1Q7CisJbWVtc2V0KHJlcywgMHgwMCwgc2l6ZW9mKHJlcykpOwogCi0Jd2wtPmlycSA9IHNwaS0+aXJxOwotCWlmICh3bC0+aXJxIDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImlycSBtaXNzaW5nIGluIHBsYXRmb3JtIGRhdGEiKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfZnJlZTsKKwlyZXNbMF0uc3RhcnQgPSBzcGktPmlycTsKKwlyZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwlyZXNbMF0ubmFtZSA9ICJpcnEiOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZ2x1ZS0+Y29yZSwgcmVzLCBBUlJBWV9TSVpFKHJlcykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhZGQgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBvdXRfZGV2X3B1dDsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bC0+aXJxLCB3bDEyNzFfaGFyZGlycSwgd2wxMjcxX2lycSwKLQkJCQkgICBpcnFmbGFncywKLQkJCQkgICBEUklWRVJfTkFNRSwgd2wpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigicmVxdWVzdF9pcnEoKSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXRfZnJlZTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIG91dF9kZXZfcHV0OwogCX0KIAotCWRpc2FibGVfaXJxKHdsLT5pcnEpOwotCi0JcmV0ID0gd2wxMjcxX2luaXRfaWVlZTgwMjExKHdsKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9pcnE7Ci0KLQlyZXQgPSB3bDEyNzFfcmVnaXN0ZXJfaHcod2wpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2lycTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGdsdWUtPmNvcmUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9kZXZfcHV0OworCX0KIAogCXJldHVybiAwOwogCi0gb3V0X2lycToKLQlmcmVlX2lycSh3bC0+aXJxLCB3bCk7CitvdXRfZGV2X3B1dDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGdsdWUtPmNvcmUpOwogCi0gb3V0X2ZyZWU6Ci0Jd2wxMjcxX2ZyZWVfaHcod2wpOwotCitvdXRfZnJlZV9nbHVlOgorCWtmcmVlKGdsdWUpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHdsMTI3MV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCXN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgKmdsdWUgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAotCXdsMTI3MV91bnJlZ2lzdGVyX2h3KHdsKTsKLQlmcmVlX2lycSh3bC0+aXJxLCB3bCk7Ci0Jd2wxMjcxX2ZyZWVfaHcod2wpOworCXBsYXRmb3JtX2RldmljZV9kZWwoZ2x1ZS0+Y29yZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChnbHVlLT5jb3JlKTsKKwlrZnJlZShnbHVlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDYyLDcgKzQxMCw2IEBACiBzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd2wxMjcxX3NwaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJCT0gIndsMTI3MV9zcGkiLAotCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdGVzdG1vZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90ZXN0bW9kZS5jCmluZGV4IDRhZThlZmYuLjI1MDkzYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90ZXN0bW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90ZXN0bW9kZS5jCkBAIC0yNiw4ICsyNiwxMCBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiYWN4LmgiCiAjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAicHMuaCIKIAogI2RlZmluZSBXTDEyNzFfVE1fTUFYX0RBVEFfTEVOR1RIIDEwMjQKIApAQCAtMzYsNiArMzgsNyBAQAogCVdMMTI3MV9UTV9DTURfVEVTVCwKIAlXTDEyNzFfVE1fQ01EX0lOVEVSUk9HQVRFLAogCVdMMTI3MV9UTV9DTURfQ09ORklHVVJFLAorCVdMMTI3MV9UTV9DTURfTlZTX1BVU0gsCQkvKiBOb3QgaW4gdXNlLiBLZWVwIHRvIG5vdCBicmVhayBBQkkgKi8KIAlXTDEyNzFfVE1fQ01EX1NFVF9QTFRfTU9ERSwKIAlXTDEyNzFfVE1fQ01EX1JFQ09WRVIsCiAKQEAgLTg3LDMxICs5MCw0NyBAQAogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQlyZXQgPSB3bDEyNzFfY21kX3Rlc3Qod2wsIGJ1ZiwgYnVmX2xlbiwgYW5zd2VyKTsKLQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKKwlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IHdsMTI3MV9jbWRfdGVzdCh3bCwgYnVmLCBidWZfbGVuLCBhbnN3ZXIpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV93YXJuaW5nKCJ0ZXN0bW9kZSBjbWQgdGVzdCBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfc2xlZXA7CiAJfQogCiAJaWYgKGFuc3dlcikgewogCQlsZW4gPSBubGFfdG90YWxfc2l6ZShidWZfbGVuKTsKIAkJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKHdsLT5ody0+d2lwaHksIGxlbik7Ci0JCWlmICghc2tiKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghc2tiKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXRfc2xlZXA7CisJCX0KIAogCQlOTEFfUFVUKHNrYiwgV0wxMjcxX1RNX0FUVFJfREFUQSwgYnVmX2xlbiwgYnVmKTsKIAkJcmV0ID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKIAkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXRfc2xlZXA7CiAJfQogCi0JcmV0dXJuIDA7CitvdXRfc2xlZXA6CisJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKIAogbmxhX3B1dF9mYWlsdXJlOgogCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAtRU1TR1NJWkU7CisJcmV0ID0gLUVNU0dTSVpFOworCWdvdG8gb3V0X3NsZWVwOwogfQogCiBzdGF0aWMgaW50IHdsMTI3MV90bV9jbWRfaW50ZXJyb2dhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBubGF0dHIgKnRiW10pCkBAIC0xMjgsMzMgKzE0Nyw1MyBAQAogCiAJaWVfaWQgPSBubGFfZ2V0X3U4KHRiW1dMMTI3MV9UTV9BVFRSX0lFX0lEXSk7CiAKLQljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQlyZXQgPSB3bDEyNzFfY21kX2ludGVycm9nYXRlKHdsLCBpZV9pZCwgY21kLCBzaXplb2YoKmNtZCkpOwotCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAorCWlmICh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmICghY21kKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3NsZWVwOworCX0KKworCXJldCA9IHdsMTI3MV9jbWRfaW50ZXJyb2dhdGUod2wsIGllX2lkLCBjbWQsIHNpemVvZigqY21kKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJd2wxMjcxX3dhcm5pbmcoInRlc3Rtb2RlIGNtZCBpbnRlcnJvZ2F0ZSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJa2ZyZWUoY21kKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2Iod2wtPmh3LT53aXBoeSwgc2l6ZW9mKCpjbWQpKTsKIAlpZiAoIXNrYikgewotCQlrZnJlZShjbWQpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlOTEFfUFVUKHNrYiwgV0wxMjcxX1RNX0FUVFJfREFUQSwgc2l6ZW9mKCpjbWQpLCBjbWQpOworCXJldCA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CiAKLQlyZXR1cm4gMDsKK291dF9mcmVlOgorCWtmcmVlKGNtZCk7CitvdXRfc2xlZXA6CisJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKIAogbmxhX3B1dF9mYWlsdXJlOgogCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAtRU1TR1NJWkU7CisJcmV0ID0gLUVNU0dTSVpFOworCWdvdG8gb3V0X2ZyZWU7CiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX3RtX2NtZF9jb25maWd1cmUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBubGF0dHIgKnRiW10pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCmluZGV4IGJhZDllMjkuLjQ1MDhjY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5jCkBAIC0yNiwyMiArMjYsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJpby5oIgogI2luY2x1ZGUgInJlZy5oIgogI2luY2x1ZGUgInBzLmgiCiAjaW5jbHVkZSAidHguaCIKICNpbmNsdWRlICJldmVudC5oIgogCi1zdGF0aWMgaW50IHdsMTI3MV9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1OCBpZCkKK3N0YXRpYyBpbnQgd2wxMjcxX3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCBpZCkKIHsKIAlpbnQgcmV0OwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKIAogCWlmIChpc19hcCkKIAkJcmV0ID0gd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLCBpZCwKLQkJCQkJCSAgICAgd2wtPmFwX2JjYXN0X2hsaWQpOworCQkJCQkJICAgICB3bHZpZi0+YXAuYmNhc3RfaGxpZCk7CiAJZWxzZQotCQlyZXQgPSB3bDEyeHhfY21kX3NldF9kZWZhdWx0X3dlcF9rZXkod2wsIGlkLCB3bC0+c3RhX2hsaWQpOworCQlyZXQgPSB3bDEyeHhfY21kX3NldF9kZWZhdWx0X3dlcF9rZXkod2wsIGlkLCB3bHZpZi0+c3RhLmhsaWQpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC03Niw3ICs3OCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgd2wxMjcxX3R4X3VwZGF0ZV9maWx0ZXJzKHN0cnVjdCB3bDEyNzEgKndsLAotCQkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCWludCByZXQ7CkBAIC05MiwxNSArOTUsMTEgQEAKIAlpZiAoIWllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCXJldHVybiAwOwogCi0JaWYgKHdsLT5kZXZfaGxpZCAhPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKQorCWlmICh3bHZpZi0+ZGV2X2hsaWQgIT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkKIAkJZ290byBvdXQ7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAic3RhcnRpbmcgZGV2aWNlIHJvbGUgZm9yIHJvYW1pbmciKTsKLQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RhcnRfZGV2KHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOworCXJldCA9IHdsMTJ4eF9zdGFydF9kZXYod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiBvdXQ6CkBAIC0xMjMsMTggKzEyMiwxNiBAQAogCQl3bDEyNzFfYWN4X3NldF9pbmNvbm5lY3Rpb25fc3RhKHdsLCBoZHItPmFkZHIxKTsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3R4X3JlZ3VsYXRlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpCitzdGF0aWMgdm9pZCB3bDEyNzFfdHhfcmVndWxhdGVfbGluayhzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSAgICB1OCBobGlkKQogewogCWJvb2wgZndfcHMsIHNpbmdsZV9zdGE7CiAJdTggdHhfcGt0czsKIAotCS8qIG9ubHkgcmVndWxhdGUgc3RhdGlvbiBsaW5rcyAqLwotCWlmIChobGlkIDwgV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUKQorCWlmIChXQVJOX09OKCF0ZXN0X2JpdChobGlkLCB3bHZpZi0+bGlua3NfbWFwKSkpCiAJCXJldHVybjsKIAotCWlmIChXQVJOX09OKCF3bDEyNzFfaXNfYWN0aXZlX3N0YSh3bCwgaGxpZCkpKQotCSAgICByZXR1cm47Ci0KIAlmd19wcyA9IHRlc3RfYml0KGhsaWQsICh1bnNpZ25lZCBsb25nICopJndsLT5hcF9md19wc19tYXApOwogCXR4X3BrdHMgPSB3bC0+bGlua3NbaGxpZF0uYWxsb2NhdGVkX3BrdHM7CiAJc2luZ2xlX3N0YSA9ICh3bC0+YWN0aXZlX3N0YV9jb3VudCA9PSAxKTsKQEAgLTE0Niw3ICsxNDMsNyBAQAogCSAqIGNhc2UgRlctbWVtb3J5IGNvbmdlc3Rpb24gaXMgbm90IGEgcHJvYmxlbS4KIAkgKi8KIAlpZiAoIXNpbmdsZV9zdGEgJiYgZndfcHMgJiYgdHhfcGt0cyA+PSBXTDEyNzFfUFNfU1RBX01BWF9QQUNLRVRTKQotCQl3bDEyNzFfcHNfbGlua19zdGFydCh3bCwgaGxpZCwgdHJ1ZSk7CisJCXdsMTJ4eF9wc19saW5rX3N0YXJ0KHdsLCB3bHZpZiwgaGxpZCwgdHJ1ZSk7CiB9CiAKIGJvb2wgd2wxMnh4X2lzX2R1bW15X3BhY2tldChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE1NCw3ICsxNTEsOCBAQAogCXJldHVybiB3bC0+ZHVtbXlfcGFja2V0ID09IHNrYjsKIH0KIAotdTggd2wxMnh4X3R4X2dldF9obGlkX2FwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordTggd2wxMnh4X3R4X2dldF9obGlkX2FwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmNvbnRyb2wgPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKQEAgLTE2Nyw0OSArMTY1LDUxIEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAotCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQorCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfQVBfU1RBUlRFRCwgJndsdmlmLT5mbGFncykpCiAJCQlyZXR1cm4gd2wtPnN5c3RlbV9obGlkOwogCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAkJaWYgKGllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlyZXR1cm4gd2wtPmFwX2dsb2JhbF9obGlkOworCQkJcmV0dXJuIHdsdmlmLT5hcC5nbG9iYWxfaGxpZDsKIAkJZWxzZQotCQkJcmV0dXJuIHdsLT5hcF9iY2FzdF9obGlkOworCQkJcmV0dXJuIHdsdmlmLT5hcC5iY2FzdF9obGlkOwogCX0KIH0KIAotc3RhdGljIHU4IHdsMTI3MV90eF9nZXRfaGxpZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3U4IHdsMTJ4eF90eF9nZXRfaGxpZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAKLQlpZiAod2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkKKwlpZiAoIXdsdmlmIHx8IHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpCiAJCXJldHVybiB3bC0+c3lzdGVtX2hsaWQ7CiAKLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKLQkJcmV0dXJuIHdsMTJ4eF90eF9nZXRfaGxpZF9hcCh3bCwgc2tiKTsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKKwkJcmV0dXJuIHdsMTJ4eF90eF9nZXRfaGxpZF9hcCh3bCwgd2x2aWYsIHNrYik7CiAKLQl3bDEyNzFfdHhfdXBkYXRlX2ZpbHRlcnMod2wsIHNrYik7CisJd2wxMjcxX3R4X3VwZGF0ZV9maWx0ZXJzKHdsLCB3bHZpZiwgc2tiKTsKIAotCWlmICgodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpIHx8Ci0JICAgICB0ZXN0X2JpdChXTDEyNzFfRkxBR19JQlNTX0pPSU5FRCwgJndsLT5mbGFncykpICYmCisJaWYgKCh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSB8fAorCSAgICAgdGVzdF9iaXQoV0xWSUZfRkxBR19JQlNTX0pPSU5FRCwgJndsdmlmLT5mbGFncykpICYmCiAJICAgICFpZWVlODAyMTFfaXNfYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpICYmCiAJICAgICFpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybiB3bC0+c3RhX2hsaWQ7CisJCXJldHVybiB3bHZpZi0+c3RhLmhsaWQ7CiAJZWxzZQotCQlyZXR1cm4gd2wtPmRldl9obGlkOworCQlyZXR1cm4gd2x2aWYtPmRldl9obGlkOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHdsMTJ4eF9jYWxjX3BhY2tldF9hbGlnbm1lbnQoc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkJCQl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbmd0aCkKIHsKLQlpZiAod2wtPnF1aXJrcyAmIFdMMTJYWF9RVUlSS19CTE9DS1NJWkVfQUxJR05NRU5UKQotCQlyZXR1cm4gQUxJR04ocGFja2V0X2xlbmd0aCwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKLQllbHNlCisJaWYgKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVCkKIAkJcmV0dXJuIEFMSUdOKHBhY2tldF9sZW5ndGgsIFdMMTI3MV9UWF9BTElHTl9UTyk7CisJZWxzZQorCQlyZXR1cm4gQUxJR04ocGFja2V0X2xlbmd0aCwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfdHhfYWxsb2NhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBleHRyYSwKLQkJCQl1MzIgYnVmX29mZnNldCwgdTggaGxpZCkKK3N0YXRpYyBpbnQgd2wxMjcxX3R4X2FsbG9jYXRlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZXh0cmEsIHUzMiBidWZfb2Zmc2V0LAorCQkJICAgICAgdTggaGxpZCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyICpkZXNjOwogCXUzMiB0b3RhbF9sZW4gPSBza2ItPmxlbiArIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyKSArIGV4dHJhOwpAQCAtMjE3LDYgKzIxNyw3IEBACiAJdTMyIHRvdGFsX2Jsb2NrczsKIAlpbnQgaWQsIHJldCA9IC1FQlVTWSwgYWM7CiAJdTMyIHNwYXJlX2Jsb2NrcyA9IHdsLT50eF9zcGFyZV9ibG9ja3M7CisJYm9vbCBpc19kdW1teSA9IGZhbHNlOwogCiAJaWYgKGJ1Zl9vZmZzZXQgKyB0b3RhbF9sZW4gPiBXTDEyNzFfQUdHUl9CVUZGRVJfU0laRSkKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC0yMzEsOCArMjMyLDEwIEBACiAJbGVuID0gd2wxMnh4X2NhbGNfcGFja2V0X2FsaWdubWVudCh3bCwgdG90YWxfbGVuKTsKIAogCS8qIGluIGNhc2Ugb2YgYSBkdW1teSBwYWNrZXQsIHVzZSBkZWZhdWx0IGFtb3VudCBvZiBzcGFyZSBtZW0gYmxvY2tzICovCi0JaWYgKHVubGlrZWx5KHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpKQorCWlmICh1bmxpa2VseSh3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKSkgeworCQlpc19kdW1teSA9IHRydWU7CiAJCXNwYXJlX2Jsb2NrcyA9IFRYX0hXX0JMT0NLX1NQQVJFX0RFRkFVTFQ7CisJfQogCiAJdG90YWxfYmxvY2tzID0gKGxlbiArIFRYX0hXX0JMT0NLX1NJWkUgLSAxKSAvIFRYX0hXX0JMT0NLX1NJWkUgKwogCQlzcGFyZV9ibG9ja3M7CkBAIC0yNTcsOCArMjYwLDkgQEAKIAkJYWMgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKIAkJd2wtPnR4X2FsbG9jYXRlZF9wa3RzW2FjXSsrOwogCi0JCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTICYmCi0JCSAgICBobGlkID49IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCkKKwkJaWYgKCFpc19kdW1teSAmJiB3bHZpZiAmJgorCQkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyAmJgorCQkgICAgdGVzdF9iaXQoaGxpZCwgd2x2aWYtPmFwLnN0YV9obGlkX21hcCkpCiAJCQl3bC0+bGlua3NbaGxpZF0uYWxsb2NhdGVkX3BrdHMrKzsKIAogCQlyZXQgPSAwOwpAQCAtMjczLDE1ICsyNzcsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfdHhfZmlsbF9oZHIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICB1MzIgZXh0cmEsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqY29udHJvbCwKLQkJCSAgICAgIHU4IGhsaWQpCitzdGF0aWMgdm9pZCB3bDEyNzFfdHhfZmlsbF9oZHIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZXh0cmEsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpjb250cm9sLCB1OCBobGlkKQogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyICpkZXNjOwogCWludCBhbGlnbmVkX2xlbiwgYWMsIHJhdGVfaWR4OwogCXM2NCBob3N0dGltZTsKLQl1MTYgdHhfYXR0cjsKKwl1MTYgdHhfYXR0ciA9IDA7CisJYm9vbCBpc19kdW1teTsKIAogCWRlc2MgPSAoc3RydWN0IHdsMTI3MV90eF9od19kZXNjciAqKSBza2ItPmRhdGE7CiAKQEAgLTI5OCw3ICszMDMsOCBAQAogCWhvc3R0aW1lID0gKHRpbWVzcGVjX3RvX25zKCZ0cykgPj4gMTApOwogCWRlc2MtPnN0YXJ0X3RpbWUgPSBjcHVfdG9fbGUzMihob3N0dGltZSAtIHdsLT50aW1lX29mZnNldCk7CiAKLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykKKwlpc19kdW1teSA9IHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYik7CisJaWYgKGlzX2R1bW15IHx8ICF3bHZpZiB8fCB3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKQogCQlkZXNjLT5saWZlX3RpbWUgPSBjcHVfdG9fbGUxNihUWF9IV19NR01UX1BLVF9MSUZFVElNRV9UVSk7CiAJZWxzZQogCQlkZXNjLT5saWZlX3RpbWUgPSBjcHVfdG9fbGUxNihUWF9IV19BUF9NT0RFX1BLVF9MSUZFVElNRV9UVSk7CkBAIC0zMDcsMzkgKzMxMyw0MiBAQAogCWFjID0gd2wxMjcxX3R4X2dldF9xdWV1ZShza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CiAJZGVzYy0+dGlkID0gc2tiLT5wcmlvcml0eTsKIAotCWlmICh3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKSB7CisJaWYgKGlzX2R1bW15KSB7CiAJCS8qCiAJCSAqIEZXIGV4cGVjdHMgdGhlIGR1bW15IHBhY2tldCB0byBoYXZlIGFuIGludmFsaWQgc2Vzc2lvbiBpZCAtCiAJCSAqIGFueSBzZXNzaW9uIGlkIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIG9uZSBzZXQgaW4gdGhlIGpvaW4KIAkJICovCi0JCXR4X2F0dHIgPSAoKH53bC0+c2Vzc2lvbl9jb3VudGVyKSA8PAorCQl0eF9hdHRyID0gKFNFU1NJT05fQ09VTlRFUl9JTlZBTElEIDw8CiAJCQkgICBUWF9IV19BVFRSX09GU1RfU0VTU0lPTl9DT1VOVEVSKSAmCiAJCQkgICBUWF9IV19BVFRSX1NFU1NJT05fQ09VTlRFUjsKIAogCQl0eF9hdHRyIHw9IFRYX0hXX0FUVFJfVFhfRFVNTVlfUkVROwotCX0gZWxzZSB7CisJfSBlbHNlIGlmICh3bHZpZikgewogCQkvKiBjb25maWd1cmUgdGhlIHR4IGF0dHJpYnV0ZXMgKi8KLQkJdHhfYXR0ciA9Ci0JCQl3bC0+c2Vzc2lvbl9jb3VudGVyIDw8IFRYX0hXX0FUVFJfT0ZTVF9TRVNTSU9OX0NPVU5URVI7CisJCXR4X2F0dHIgPSB3bHZpZi0+c2Vzc2lvbl9jb3VudGVyIDw8CisJCQkgIFRYX0hXX0FUVFJfT0ZTVF9TRVNTSU9OX0NPVU5URVI7CiAJfQogCiAJZGVzYy0+aGxpZCA9IGhsaWQ7Ci0KLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgeworCWlmIChpc19kdW1teSB8fCAhd2x2aWYpCisJCXJhdGVfaWR4ID0gMDsKKwllbHNlIGlmICh3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTKSB7CiAJCS8qIGlmIHRoZSBwYWNrZXRzIGFyZSBkZXN0aW5lZCBmb3IgQVAgKGhhdmUgYSBTVEEgZW50cnkpCiAJCSAgIHNlbmQgdGhlbSB3aXRoIEFQIHJhdGUgcG9saWNpZXMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdAogCQkgICBiYXNpYyByYXRlcyAqLwotCQlpZiAoY29udHJvbC0+Y29udHJvbC5zdGEpCi0JCQlyYXRlX2lkeCA9IEFDWF9UWF9BUF9GVUxMX1JBVEU7CisJCWlmIChjb250cm9sLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQ0NLX1JBVEUpCisJCQlyYXRlX2lkeCA9IHdsdmlmLT5zdGEucDJwX3JhdGVfaWR4OworCQllbHNlIGlmIChjb250cm9sLT5jb250cm9sLnN0YSkKKwkJCXJhdGVfaWR4ID0gd2x2aWYtPnN0YS5hcF9yYXRlX2lkeDsKIAkJZWxzZQotCQkJcmF0ZV9pZHggPSBBQ1hfVFhfQkFTSUNfUkFURTsKKwkJCXJhdGVfaWR4ID0gd2x2aWYtPnN0YS5iYXNpY19yYXRlX2lkeDsKIAl9IGVsc2UgewotCQlpZiAoaGxpZCA9PSB3bC0+YXBfZ2xvYmFsX2hsaWQpCi0JCQlyYXRlX2lkeCA9IEFDWF9UWF9BUF9NT0RFX01HTVRfUkFURTsKLQkJZWxzZSBpZiAoaGxpZCA9PSB3bC0+YXBfYmNhc3RfaGxpZCkKLQkJCXJhdGVfaWR4ID0gQUNYX1RYX0FQX01PREVfQkNTVF9SQVRFOworCQlpZiAoaGxpZCA9PSB3bHZpZi0+YXAuZ2xvYmFsX2hsaWQpCisJCQlyYXRlX2lkeCA9IHdsdmlmLT5hcC5tZ210X3JhdGVfaWR4OworCQllbHNlIGlmIChobGlkID09IHdsdmlmLT5hcC5iY2FzdF9obGlkKQorCQkJcmF0ZV9pZHggPSB3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHg7CiAJCWVsc2UKLQkJCXJhdGVfaWR4ID0gYWM7CisJCQlyYXRlX2lkeCA9IHdsdmlmLT5hcC51Y2FzdF9yYXRlX2lkeFthY107CiAJfQogCiAJdHhfYXR0ciB8PSByYXRlX2lkeCA8PCBUWF9IV19BVFRSX09GU1RfUkFURV9QT0xJQ1k7CkBAIC0zNzksMjAgKzM4OCwyNCBAQAogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIHdsLT5tdXRleCAqLwotc3RhdGljIGludCB3bDEyNzFfcHJlcGFyZV90eF9mcmFtZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCQl1MzIgYnVmX29mZnNldCkKK3N0YXRpYyBpbnQgd2wxMjcxX3ByZXBhcmVfdHhfZnJhbWUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYnVmX29mZnNldCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAJdTMyIGV4dHJhID0gMDsKIAlpbnQgcmV0ID0gMDsKIAl1MzIgdG90YWxfbGVuOwogCXU4IGhsaWQ7CisJYm9vbCBpc19kdW1teTsKIAogCWlmICghc2tiKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKKwkvKiBUT0RPOiBoYW5kbGUgZHVtbXkgcGFja2V0cyBvbiBtdWx0aS12aWZzICovCisJaXNfZHVtbXkgPSB3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpOworCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5ICYmCiAJICAgIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKIAkJZXh0cmEgPSBXTDEyNzFfVEtJUF9JVl9TUEFDRTsKQEAgLTQwNSwyOSArNDE4LDI4IEBACiAJCWlzX3dlcCA9IChjaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDApIHx8CiAJCQkgKGNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpOwogCi0JCWlmICh1bmxpa2VseShpc193ZXAgJiYgd2wtPmRlZmF1bHRfa2V5ICE9IGlkeCkpIHsKLQkJCXJldCA9IHdsMTI3MV9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLCBpZHgpOworCQlpZiAodW5saWtlbHkoaXNfd2VwICYmIHdsdmlmLT5kZWZhdWx0X2tleSAhPSBpZHgpKSB7CisJCQlyZXQgPSB3bDEyNzFfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgd2x2aWYsIGlkeCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwotCQkJd2wtPmRlZmF1bHRfa2V5ID0gaWR4OworCQkJd2x2aWYtPmRlZmF1bHRfa2V5ID0gaWR4OwogCQl9CiAJfQotCi0JaGxpZCA9IHdsMTI3MV90eF9nZXRfaGxpZCh3bCwgc2tiKTsKKwlobGlkID0gd2wxMnh4X3R4X2dldF9obGlkKHdsLCB3bHZpZiwgc2tiKTsKIAlpZiAoaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSB7CiAJCXdsMTI3MV9lcnJvcigiaW52YWxpZCBobGlkLiBkcm9wcGluZyBza2IgMHglcCIsIHNrYik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IHdsMTI3MV90eF9hbGxvY2F0ZSh3bCwgc2tiLCBleHRyYSwgYnVmX29mZnNldCwgaGxpZCk7CisJcmV0ID0gd2wxMjcxX3R4X2FsbG9jYXRlKHdsLCB3bHZpZiwgc2tiLCBleHRyYSwgYnVmX29mZnNldCwgaGxpZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQl3bDEyNzFfdHhfZmlsbF9oZHIod2wsIHNrYiwgZXh0cmEsIGluZm8sIGhsaWQpOworCXdsMTI3MV90eF9maWxsX2hkcih3bCwgd2x2aWYsIHNrYiwgZXh0cmEsIGluZm8sIGhsaWQpOwogCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpIHsKKwlpZiAoIWlzX2R1bW15ICYmIHdsdmlmICYmIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpIHsKIAkJd2wxMjcxX3R4X2FwX3VwZGF0ZV9pbmNvbm5lY3Rpb25fc3RhKHdsLCBza2IpOwotCQl3bDEyNzFfdHhfcmVndWxhdGVfbGluayh3bCwgaGxpZCk7CisJCXdsMTI3MV90eF9yZWd1bGF0ZV9saW5rKHdsLCB3bHZpZiwgaGxpZCk7CiAJfQogCiAJLyoKQEAgLTQ0NCw3ICs0NTYsNyBAQAogCW1lbXNldCh3bC0+YWdncl9idWYgKyBidWZfb2Zmc2V0ICsgc2tiLT5sZW4sIDAsIHRvdGFsX2xlbiAtIHNrYi0+bGVuKTsKIAogCS8qIFJldmVydCBzaWRlIGVmZmVjdHMgaW4gdGhlIGR1bW15IHBhY2tldCBza2IsIHNvIGl0IGNhbiBiZSByZXVzZWQgKi8KLQlpZiAod2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkKKwlpZiAoaXNfZHVtbXkpCiAJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfdHhfaHdfZGVzY3IpKTsKIAogCXJldHVybiB0b3RhbF9sZW47CkBAIC01MjIsMTkgKzUzNCwxOCBAQAogCXJldHVybiAmcXVldWVzW3FdOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9zdGFfc2tiX2RlcXVldWUoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKndsMTJ4eF9sbmtfc2tiX2RlcXVldWUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSAgICAgIHN0cnVjdCB3bDEyNzFfbGluayAqbG5rKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZTsKIAotCXF1ZXVlID0gd2wxMjcxX3NlbGVjdF9xdWV1ZSh3bCwgd2wtPnR4X3F1ZXVlKTsKKwlxdWV1ZSA9IHdsMTI3MV9zZWxlY3RfcXVldWUod2wsIGxuay0+dHhfcXVldWUpOwogCWlmICghcXVldWUpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gTlVMTDsKIAogCXNrYiA9IHNrYl9kZXF1ZXVlKHF1ZXVlKTsKLQotb3V0OgogCWlmIChza2IpIHsKIAkJaW50IHEgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7CkBAIC01NDUsNDMgKzU1NiwzMyBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqd2wxMjcxX2FwX3NrYl9kZXF1ZXVlKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHN0cnVjdCBza19idWZmICp3bDEyeHhfdmlmX3NrYl9kZXF1ZXVlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgaCwgc3RhcnRfaGxpZDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZTsKIAogCS8qIHN0YXJ0IGZyb20gdGhlIGxpbmsgYWZ0ZXIgdGhlIGxhc3Qgb25lICovCi0Jc3RhcnRfaGxpZCA9ICh3bC0+bGFzdF90eF9obGlkICsgMSkgJSBBUF9NQVhfTElOS1M7CisJc3RhcnRfaGxpZCA9ICh3bHZpZi0+bGFzdF90eF9obGlkICsgMSkgJSBXTDEyWFhfTUFYX0xJTktTOwogCiAJLyogZGVxdWV1ZSBhY2NvcmRpbmcgdG8gQUMsIHJvdW5kIHJvYmluIG9uIGVhY2ggbGluayAqLwotCWZvciAoaSA9IDA7IGkgPCBBUF9NQVhfTElOS1M7IGkrKykgewotCQloID0gKHN0YXJ0X2hsaWQgKyBpKSAlIEFQX01BWF9MSU5LUzsKKwlmb3IgKGkgPSAwOyBpIDwgV0wxMlhYX01BWF9MSU5LUzsgaSsrKSB7CisJCWggPSAoc3RhcnRfaGxpZCArIGkpICUgV0wxMlhYX01BWF9MSU5LUzsKIAogCQkvKiBvbmx5IGNvbnNpZGVyIGNvbm5lY3RlZCBzdGF0aW9ucyAqLwotCQlpZiAoaCA+PSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQgJiYKLQkJICAgICF0ZXN0X2JpdChoIC0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJULCB3bC0+YXBfaGxpZF9tYXApKQorCQlpZiAoIXRlc3RfYml0KGgsIHdsdmlmLT5saW5rc19tYXApKQogCQkJY29udGludWU7CiAKLQkJcXVldWUgPSB3bDEyNzFfc2VsZWN0X3F1ZXVlKHdsLCB3bC0+bGlua3NbaF0udHhfcXVldWUpOwotCQlpZiAoIXF1ZXVlKQorCQlza2IgPSB3bDEyeHhfbG5rX3NrYl9kZXF1ZXVlKHdsLCAmd2wtPmxpbmtzW2hdKTsKKwkJaWYgKCFza2IpCiAJCQljb250aW51ZTsKIAotCQlza2IgPSBza2JfZGVxdWV1ZShxdWV1ZSk7Ci0JCWlmIChza2IpCi0JCQlicmVhazsKKwkJd2x2aWYtPmxhc3RfdHhfaGxpZCA9IGg7CisJCWJyZWFrOwogCX0KIAotCWlmIChza2IpIHsKLQkJaW50IHEgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQkJd2wtPmxhc3RfdHhfaGxpZCA9IGg7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwotCQl3bC0+dHhfcXVldWVfY291bnRbcV0tLTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQl3bC0+bGFzdF90eF9obGlkID0gMDsKLQl9CisJaWYgKCFza2IpCisJCXdsdmlmLT5sYXN0X3R4X2hsaWQgPSAwOwogCiAJcmV0dXJuIHNrYjsKIH0KQEAgLTU4OSwxMiArNTkwLDMyIEBACiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9za2JfZGVxdWV1ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsLT5sYXN0X3dsdmlmOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCi0JCXNrYiA9IHdsMTI3MV9hcF9za2JfZGVxdWV1ZSh3bCk7Ci0JZWxzZQotCQlza2IgPSB3bDEyNzFfc3RhX3NrYl9kZXF1ZXVlKHdsKTsKKwlpZiAod2x2aWYpIHsKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2NvbnRpbnVlKHdsLCB3bHZpZikgeworCQkJc2tiID0gd2wxMnh4X3ZpZl9za2JfZGVxdWV1ZSh3bCwgd2x2aWYpOworCQkJaWYgKHNrYikgeworCQkJCXdsLT5sYXN0X3dsdmlmID0gd2x2aWY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBkbyBhbm90aGVyIHBhc3MgKi8KKwlpZiAoIXNrYikgeworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCQlza2IgPSB3bDEyeHhfdmlmX3NrYl9kZXF1ZXVlKHdsLCB3bHZpZik7CisJCQlpZiAoc2tiKSB7CisJCQkJd2wtPmxhc3Rfd2x2aWYgPSB3bHZpZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghc2tiKQorCQlza2IgPSB3bDEyeHhfbG5rX3NrYl9kZXF1ZXVlKHdsLCAmd2wtPmxpbmtzW3dsLT5zeXN0ZW1faGxpZF0pOwogCiAJaWYgKCFza2IgJiYKIAkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX0RVTU1ZX1BBQ0tFVF9QRU5ESU5HLCAmd2wtPmZsYWdzKSkgewpAQCAtNjEwLDIxICs2MzEsMjEgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2tiX3F1ZXVlX2hlYWQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB3bDEyNzFfc2tiX3F1ZXVlX2hlYWQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcSA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCiAJaWYgKHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpIHsKIAkJc2V0X2JpdChXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywgJndsLT5mbGFncyk7Ci0JfSBlbHNlIGlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7Ci0JCXU4IGhsaWQgPSB3bDEyNzFfdHhfZ2V0X2hsaWQod2wsIHNrYik7CisJfSBlbHNlIHsKKwkJdTggaGxpZCA9IHdsMTJ4eF90eF9nZXRfaGxpZCh3bCwgd2x2aWYsIHNrYik7CiAJCXNrYl9xdWV1ZV9oZWFkKCZ3bC0+bGlua3NbaGxpZF0udHhfcXVldWVbcV0sIHNrYik7CiAKIAkJLyogbWFrZSBzdXJlIHdlIGRlcXVldWUgdGhlIHNhbWUgcGFja2V0IG5leHQgdGltZSAqLwotCQl3bC0+bGFzdF90eF9obGlkID0gKGhsaWQgKyBBUF9NQVhfTElOS1MgLSAxKSAlIEFQX01BWF9MSU5LUzsKLQl9IGVsc2UgewotCQlza2JfcXVldWVfaGVhZCgmd2wtPnR4X3F1ZXVlW3FdLCBza2IpOworCQl3bHZpZi0+bGFzdF90eF9obGlkID0gKGhsaWQgKyBXTDEyWFhfTUFYX0xJTktTIC0gMSkgJQorCQkJCSAgICAgIFdMMTJYWF9NQVhfTElOS1M7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7CkBAIC02MzksMjkgKzY2MCw3MSBAQAogCXJldHVybiBpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCk7CiB9CiAKK3ZvaWQgd2wxMnh4X3JlYXJtX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdW5zaWduZWQgbG9uZyAqYWN0aXZlX2hsaWRzKQoreworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKKwl1MzIgdGltZW91dDsKKwl1OCBobGlkOworCisJaWYgKCF3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwpCisJCXJldHVybjsKKworCWlmICghd2wtPmNvbmYucnhfc3RyZWFtaW5nLmFsd2F5cyAmJgorCSAgICAhdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gd2wtPmNvbmYucnhfc3RyZWFtaW5nLmR1cmF0aW9uOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCWJvb2wgZm91bmQgPSBmYWxzZTsKKwkJZm9yX2VhY2hfc2V0X2JpdChobGlkLCBhY3RpdmVfaGxpZHMsIFdMMTJYWF9NQVhfTElOS1MpIHsKKwkJCWlmICh0ZXN0X2JpdChobGlkLCB3bHZpZi0+bGlua3NfbWFwKSkgeworCQkJCWZvdW5kICA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJY29udGludWU7CisKKwkJLyogZW5hYmxlIHJ4IHN0cmVhbWluZyAqLworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LAorCQkJCQkgICAgICZ3bHZpZi0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKKworCQltb2RfdGltZXIoJndsdmlmLT5yeF9zdHJlYW1pbmdfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKKwl9Cit9CisKIHZvaWQgd2wxMjcxX3R4X3dvcmtfbG9ja2VkKHN0cnVjdCB3bDEyNzEgKndsKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bDEyNzFfdHhfaHdfZGVzY3IgKmRlc2M7CiAJdTMyIGJ1Zl9vZmZzZXQgPSAwOwogCWJvb2wgc2VudF9wYWNrZXRzID0gZmFsc2U7Ci0JYm9vbCBoYWRfZGF0YSA9IGZhbHNlOwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfaGxpZHNbQklUU19UT19MT05HUyhXTDEyWFhfTUFYX0xJTktTKV0gPSB7MH07CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseSh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikpCiAJCXJldHVybjsKIAogCXdoaWxlICgoc2tiID0gd2wxMjcxX3NrYl9kZXF1ZXVlKHdsKSkpIHsKLQkJaWYgKHdsMTI3MV90eF9pc19kYXRhX3ByZXNlbnQoc2tiKSkKLQkJCWhhZF9kYXRhID0gdHJ1ZTsKKwkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCQlib29sIGhhc19kYXRhID0gZmFsc2U7CiAKLQkJcmV0ID0gd2wxMjcxX3ByZXBhcmVfdHhfZnJhbWUod2wsIHNrYiwgYnVmX29mZnNldCk7CisJCXdsdmlmID0gTlVMTDsKKwkJaWYgKCF3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpICYmIGluZm8tPmNvbnRyb2wudmlmKQorCQkJd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEoaW5mby0+Y29udHJvbC52aWYpOworCisJCWhhc19kYXRhID0gd2x2aWYgJiYgd2wxMjcxX3R4X2lzX2RhdGFfcHJlc2VudChza2IpOworCQlyZXQgPSB3bDEyNzFfcHJlcGFyZV90eF9mcmFtZSh3bCwgd2x2aWYsIHNrYiwgYnVmX29mZnNldCk7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikgewogCQkJLyoKIAkJCSAqIEFnZ3JlZ2F0aW9uIGJ1ZmZlciBpcyBmdWxsLgogCQkJICogRmx1c2ggYnVmZmVyIGFuZCB0cnkgYWdhaW4uCiAJCQkgKi8KLQkJCXdsMTI3MV9za2JfcXVldWVfaGVhZCh3bCwgc2tiKTsKKwkJCXdsMTI3MV9za2JfcXVldWVfaGVhZCh3bCwgd2x2aWYsIHNrYik7CiAJCQl3bDEyNzFfd3JpdGUod2wsIFdMMTI3MV9TTFZfTUVNX0RBVEEsIHdsLT5hZ2dyX2J1ZiwKIAkJCQkgICAgIGJ1Zl9vZmZzZXQsIHRydWUpOwogCQkJc2VudF9wYWNrZXRzID0gdHJ1ZTsKQEAgLTY3MiwxNiArNzM1LDI3IEBACiAJCQkgKiBGaXJtd2FyZSBidWZmZXIgaXMgZnVsbC4KIAkJCSAqIFF1ZXVlIGJhY2sgbGFzdCBza2IsIGFuZCBzdG9wIGFnZ3JlZ2F0aW5nLgogCQkJICovCi0JCQl3bDEyNzFfc2tiX3F1ZXVlX2hlYWQod2wsIHNrYik7CisJCQl3bDEyNzFfc2tiX3F1ZXVlX2hlYWQod2wsIHdsdmlmLCBza2IpOwogCQkJLyogTm8gd29yayBsZWZ0LCBhdm9pZCBzY2hlZHVsaW5nIHJlZHVuZGFudCB0eCB3b3JrICovCiAJCQlzZXRfYml0KFdMMTI3MV9GTEFHX0ZXX1RYX0JVU1ksICZ3bC0+ZmxhZ3MpOwogCQkJZ290byBvdXRfYWNrOwogCQl9IGVsc2UgaWYgKHJldCA8IDApIHsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWlmICh3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKQorCQkJCS8qCisJCQkJICogZncgc3RpbGwgZXhwZWN0cyBkdW1teSBwYWNrZXQsCisJCQkJICogc28gcmUtZW5xdWV1ZSBpdAorCQkJCSAqLworCQkJCXdsMTI3MV9za2JfcXVldWVfaGVhZCh3bCwgd2x2aWYsIHNrYik7CisJCQllbHNlCisJCQkJaWVlZTgwMjExX2ZyZWVfdHhza2Iod2wtPmh3LCBza2IpOwogCQkJZ290byBvdXRfYWNrOwogCQl9CiAJCWJ1Zl9vZmZzZXQgKz0gcmV0OwogCQl3bC0+dHhfcGFja2V0c19jb3VudCsrOworCQlpZiAoaGFzX2RhdGEpIHsKKwkJCWRlc2MgPSAoc3RydWN0IHdsMTI3MV90eF9od19kZXNjciAqKSBza2ItPmRhdGE7CisJCQlfX3NldF9iaXQoZGVzYy0+aGxpZCwgYWN0aXZlX2hsaWRzKTsKKwkJfQogCX0KIAogb3V0X2FjazoKQEAgLTcwMSwxOSArNzc1LDcgQEAKIAogCQl3bDEyNzFfaGFuZGxlX3R4X2xvd193YXRlcm1hcmsod2wpOwogCX0KLQlpZiAoIWlzX2FwICYmIHdsLT5jb25mLnJ4X3N0cmVhbWluZy5pbnRlcnZhbCAmJiBoYWRfZGF0YSAmJgotCSAgICAod2wtPmNvbmYucnhfc3RyZWFtaW5nLmFsd2F5cyB8fAotCSAgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpKSkgewotCQl1MzIgdGltZW91dCA9IHdsLT5jb25mLnJ4X3N0cmVhbWluZy5kdXJhdGlvbjsKLQotCQkvKiBlbmFibGUgcnggc3RyZWFtaW5nICovCi0JCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQotCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsod2wtPmh3LAotCQkJCQkgICAgICZ3bC0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKLQotCQltb2RfdGltZXIoJndsLT5yeF9zdHJlYW1pbmdfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQl9CisJd2wxMnh4X3JlYXJtX3J4X3N0cmVhbWluZyh3bCwgYWN0aXZlX2hsaWRzKTsKIH0KIAogdm9pZCB3bDEyNzFfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC03MzcsNiArNzk5LDggQEAKIAkJCQkgICAgICBzdHJ1Y3Qgd2wxMjcxX3R4X2h3X3Jlc19kZXNjciAqcmVzdWx0KQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpZCA9IHJlc3VsdC0+aWQ7CiAJaW50IHJhdGUgPSAtMTsKQEAgLTc1NiwxMSArODIwLDE2IEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBpbmZvLT5jb250cm9sIGlzIHZhbGlkIGFzIGxvbmcgYXMgd2UgZG9uJ3QgdXBkYXRlIGluZm8tPnN0YXR1cyAqLworCXZpZiA9IGluZm8tPmNvbnRyb2wudmlmOworCXdsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisKIAkvKiB1cGRhdGUgdGhlIFRYIHN0YXR1cyBpbmZvICovCiAJaWYgKHJlc3VsdC0+c3RhdHVzID09IFRYX1NVQ0NFU1MpIHsKIAkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpCiAJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JCXJhdGUgPSB3bDEyNzFfcmF0ZV90b19pZHgocmVzdWx0LT5yYXRlX2NsYXNzX2luZGV4LCB3bC0+YmFuZCk7CisJCXJhdGUgPSB3bDEyNzFfcmF0ZV90b19pZHgocmVzdWx0LT5yYXRlX2NsYXNzX2luZGV4LAorCQkJCQkgIHdsdmlmLT5iYW5kKTsKIAkJcmV0cmllcyA9IHJlc3VsdC0+YWNrX2ZhaWx1cmVzOwogCX0gZWxzZSBpZiAocmVzdWx0LT5zdGF0dXMgPT0gVFhfUkVUUllfRVhDRUVERUQpIHsKIAkJd2wtPnN0YXRzLmV4Y2Vzc2l2ZV9yZXRyaWVzKys7CkBAIC03ODMsMTQgKzg1MiwxNCBAQAogCSAgICAgaW5mby0+Y29udHJvbC5od19rZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QIHx8CiAJICAgICBpbmZvLT5jb250cm9sLmh3X2tleS0+Y2lwaGVyID09IFdMMTI3MV9DSVBIRVJfU1VJVEVfR0VNKSkgewogCQl1OCBmd19sc2IgPSByZXN1bHQtPnR4X3NlY3VyaXR5X3NlcXVlbmNlX251bWJlcl9sc2I7Ci0JCXU4IGN1cl9sc2IgPSB3bC0+dHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiOworCQl1OCBjdXJfbHNiID0gd2x2aWYtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYjsKIAogCQkvKgogCQkgKiB1cGRhdGUgc2VjdXJpdHkgc2VxdWVuY2UgbnVtYmVyLCB0YWtpbmcgY2FyZSBvZiBwb3RlbnRpYWwKIAkJICogd3JhcC1hcm91bmQKIAkJICovCi0JCXdsLT50eF9zZWN1cml0eV9zZXEgKz0gKGZ3X2xzYiAtIGN1cl9sc2IgKyAyNTYpICUgMjU2OwotCQl3bC0+dHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiID0gZndfbHNiOworCQl3bHZpZi0+dHhfc2VjdXJpdHlfc2VxICs9IChmd19sc2IgLSBjdXJfbHNiKSAmIDB4ZmY7CisJCXdsdmlmLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2IgPSBmd19sc2I7CiAJfQogCiAJLyogcmVtb3ZlIHByaXZhdGUgaGVhZGVyIGZyb20gcGFja2V0ICovCkBAIC04ODYsNDAgKzk1NSwzMSBAQAogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIHdsLT5tdXRleCBhbmQgVFggbXVzdCBiZSBzdG9wcGVkICovCi12b2lkIHdsMTI3MV90eF9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCByZXNldF90eF9xdWV1ZXMpCit2b2lkIHdsMTJ4eF90eF9yZXNldF93bHZpZihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCWludCBpOworCisJLyogVFggZmFpbHVyZSAqLworCWZvcl9lYWNoX3NldF9iaXQoaSwgd2x2aWYtPmxpbmtzX21hcCwgV0wxMlhYX01BWF9MSU5LUykgeworCQlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKKwkJCXdsMTI3MV9mcmVlX3N0YSh3bCwgd2x2aWYsIGkpOworCQllbHNlCisJCQl3bHZpZi0+c3RhLmJhX3J4X2JpdG1hcCA9IDA7CisKKwkJd2wxMjcxX3R4X3Jlc2V0X2xpbmtfcXVldWVzKHdsLCBpKTsKKwkJd2wtPmxpbmtzW2ldLmFsbG9jYXRlZF9wa3RzID0gMDsKKwkJd2wtPmxpbmtzW2ldLnByZXZfZnJlZWRfcGt0cyA9IDA7CisJfQorCXdsdmlmLT5sYXN0X3R4X2hsaWQgPSAwOworCit9CisvKiBjYWxsZXIgbXVzdCBob2xkIHdsLT5tdXRleCBhbmQgVFggbXVzdCBiZSBzdG9wcGVkICovCit2b2lkIHdsMTJ4eF90eF9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCByZXNldF90eF9xdWV1ZXMpCiB7CiAJaW50IGk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAKLQkvKiBUWCBmYWlsdXJlICovCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFQX01BWF9MSU5LUzsgaSsrKSB7Ci0JCQl3bDEyNzFfZnJlZV9zdGEod2wsIGkpOwotCQkJd2wxMjcxX3R4X3Jlc2V0X2xpbmtfcXVldWVzKHdsLCBpKTsKLQkJCXdsLT5saW5rc1tpXS5hbGxvY2F0ZWRfcGt0cyA9IDA7Ci0JCQl3bC0+bGlua3NbaV0ucHJldl9mcmVlZF9wa3RzID0gMDsKLQkJfQotCi0JCXdsLT5sYXN0X3R4X2hsaWQgPSAwOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspIHsKLQkJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsLT50eF9xdWV1ZVtpXSkpKSB7Ci0JCQkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAiZnJlZWluZyBza2IgMHglcCIsCi0JCQkJCSAgICAgc2tiKTsKLQotCQkJCWlmICghd2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkgewotCQkJCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCQkJCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4ID0gLTE7Ci0JCQkJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IDA7Ci0JCQkJCWllZWU4MDIxMV90eF9zdGF0dXNfbmkod2wtPmh3LCBza2IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXdsLT5iYV9yeF9iaXRtYXAgPSAwOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspCiAJCXdsLT50eF9xdWV1ZV9jb3VudFtpXSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3R4LmgKaW5kZXggZGM0ZjA5YS4uMmRiYjI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3R4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3R4LmgKQEAgLTIwNiwxOCArMjA2LDIzIEBACiB2b2lkIHdsMTI3MV90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHdsMTI3MV90eF93b3JrX2xvY2tlZChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB2b2lkIHdsMTI3MV90eF9jb21wbGV0ZShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci12b2lkIHdsMTI3MV90eF9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCByZXNldF90eF9xdWV1ZXMpOwordm9pZCB3bDEyeHhfdHhfcmVzZXRfd2x2aWYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7Cit2b2lkIHdsMTJ4eF90eF9yZXNldChzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCByZXNldF90eF9xdWV1ZXMpOwogdm9pZCB3bDEyNzFfdHhfZmx1c2goc3RydWN0IHdsMTI3MSAqd2wpOwogdTggd2wxMjcxX3JhdGVfdG9faWR4KGludCByYXRlLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwogdTMyIHdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIHJhdGVfc2V0LAogCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgcmF0ZV9iYW5kKTsKIHUzMiB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHN0cnVjdCB3bDEyNzEgKndsLCB1MzIgcmF0ZV9zZXQpOwotdTggd2wxMnh4X3R4X2dldF9obGlkX2FwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3U4IHdsMTJ4eF90eF9nZXRfaGxpZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpOwordTggd2wxMnh4X3R4X2dldF9obGlkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCB3bDEyNzFfdHhfcmVzZXRfbGlua19xdWV1ZXMoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpOwogdm9pZCB3bDEyNzFfaGFuZGxlX3R4X2xvd193YXRlcm1hcmsoc3RydWN0IHdsMTI3MSAqd2wpOwogYm9vbCB3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgd2wxMnh4X3JlYXJtX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdW5zaWduZWQgbG9uZyAqYWN0aXZlX2hsaWRzKTsKIAogLyogZnJvbSBtYWluLmMgKi8KLXZvaWQgd2wxMjcxX2ZyZWVfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKTsKK3ZvaWQgd2wxMjcxX2ZyZWVfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IGhsaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaAppbmRleCAxZWM5MGZjNy4uZDIxZjcxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaApAQCAtMzUsODMgKzM1LDYgQEAKICNpbmNsdWRlICJjb25mLmgiCiAjaW5jbHVkZSAiaW5pLmgiCiAKLSNkZWZpbmUgRFJJVkVSX05BTUUgIndsMTI3MSIKLSNkZWZpbmUgRFJJVkVSX1BSRUZJWCBEUklWRVJfTkFNRSAiOiAiCi0KLS8qCi0gKiBGVyB2ZXJzaW9ucyBzdXBwb3J0IEJBIDExbgotICogdmVyc2lvbnMgbWFya3MgeC54LnguNTAtNjAueAotICovCi0jZGVmaW5lIFdMMTJYWF9CQV9TVVBQT1JUX0ZXX0NPU1RfVkVSMl9TVEFSVCAgICA1MAotI2RlZmluZSBXTDEyWFhfQkFfU1VQUE9SVF9GV19DT1NUX1ZFUjJfRU5EICAgICAgNjAKLQotZW51bSB7Ci0JREVCVUdfTk9ORQk9IDAsCi0JREVCVUdfSVJRCT0gQklUKDApLAotCURFQlVHX1NQSQk9IEJJVCgxKSwKLQlERUJVR19CT09UCT0gQklUKDIpLAotCURFQlVHX01BSUxCT1gJPSBCSVQoMyksCi0JREVCVUdfVEVTVE1PREUJPSBCSVQoNCksCi0JREVCVUdfRVZFTlQJPSBCSVQoNSksCi0JREVCVUdfVFgJPSBCSVQoNiksCi0JREVCVUdfUlgJPSBCSVQoNyksCi0JREVCVUdfU0NBTgk9IEJJVCg4KSwKLQlERUJVR19DUllQVAk9IEJJVCg5KSwKLQlERUJVR19QU00JPSBCSVQoMTApLAotCURFQlVHX01BQzgwMjExCT0gQklUKDExKSwKLQlERUJVR19DTUQJPSBCSVQoMTIpLAotCURFQlVHX0FDWAk9IEJJVCgxMyksCi0JREVCVUdfU0RJTwk9IEJJVCgxNCksCi0JREVCVUdfRklMVEVSUyAgID0gQklUKDE1KSwKLQlERUJVR19BREhPQyAgICAgPSBCSVQoMTYpLAotCURFQlVHX0FQCT0gQklUKDE3KSwKLQlERUJVR19NQVNURVIJPSAoREVCVUdfQURIT0MgfCBERUJVR19BUCksCi0JREVCVUdfQUxMCT0gfjAsCi19OwotCi1leHRlcm4gdTMyIHdsMTJ4eF9kZWJ1Z19sZXZlbDsKLQotI2RlZmluZSBERUJVR19EVU1QX0xJTUlUIDEwMjQKLQotI2RlZmluZSB3bDEyNzFfZXJyb3IoZm10LCBhcmcuLi4pIFwKLQlwcl9lcnIoRFJJVkVSX1BSRUZJWCAiRVJST1IgIiBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX3dhcm5pbmcoZm10LCBhcmcuLi4pIFwKLQlwcl93YXJuaW5nKERSSVZFUl9QUkVGSVggIldBUk5JTkcgIiBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX25vdGljZShmbXQsIGFyZy4uLikgXAotCXByX2luZm8oRFJJVkVSX1BSRUZJWCBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX2luZm8oZm10LCBhcmcuLi4pIFwKLQlwcl9pbmZvKERSSVZFUl9QUkVGSVggZm10ICJcbiIsICMjYXJnKQotCi0jZGVmaW5lIHdsMTI3MV9kZWJ1ZyhsZXZlbCwgZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCi0JCQlwcl9kZWJ1ZyhEUklWRVJfUFJFRklYIGZtdCAiXG4iLCAjI2FyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0vKiBUT0RPOiB1c2UgcHJfZGVidWdfaGV4X2R1bXAgd2hlbiBpdCB3aWxsIGJlIGF2YWlsYWJsZSAqLwotI2RlZmluZSB3bDEyNzFfZHVtcChsZXZlbCwgcHJlZml4LCBidWYsIGxlbikJXAotCWRvIHsgXAotCQlpZiAobGV2ZWwgJiB3bDEyeHhfZGVidWdfbGV2ZWwpIFwKLQkJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIERSSVZFUl9QUkVGSVggcHJlZml4LCBcCi0JCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsCVwKLQkJCQkgICAgICAgYnVmLAkJCQlcCi0JCQkJICAgICAgIG1pbl90KHNpemVfdCwgbGVuLCBERUJVR19EVU1QX0xJTUlUKSwgXAotCQkJCSAgICAgICAwKTsJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgd2wxMjcxX2R1bXBfYXNjaWkobGV2ZWwsIHByZWZpeCwgYnVmLCBsZW4pCVwKLQlkbyB7IFwKLQkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCi0JCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBEUklWRVJfUFJFRklYIHByZWZpeCwgXAotCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAlcCi0JCQkJICAgICAgIGJ1ZiwJCQkJXAotCQkJCSAgICAgICBtaW5fdChzaXplX3QsIGxlbiwgREVCVUdfRFVNUF9MSU1JVCksIFwKLQkJCQkgICAgICAgdHJ1ZSk7CQkJCVwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIFdMMTI3WF9GV19OQU1FICJ0aS1jb25uZWN0aXZpdHkvd2wxMjd4LWZ3LTMuYmluIgogI2RlZmluZSBXTDEyOFhfRldfTkFNRSAidGktY29ubmVjdGl2aXR5L3dsMTI4eC1mdy0zLmJpbiIKIApAQCAtMTQyLDE2ICs2NSwxMiBAQAogI2RlZmluZSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEICAgICAweGZmCiAjZGVmaW5lIFdMMTJYWF9JTlZBTElEX0xJTktfSUQgICAgIDB4ZmYKIAorI2RlZmluZSBXTDEyWFhfTUFYX1JBVEVfUE9MSUNJRVMgMTYKKwogLyogRGVmaW5lZCBieSBGVyBhcyAwLiBXaWxsIG5vdCBiZSBmcmVlZCBvciBhbGxvY2F0ZWQuICovCiAjZGVmaW5lIFdMMTJYWF9TWVNURU1fSExJRCAgICAgICAgIDAKIAogLyoKLSAqIFRPRE86IHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IG11bHRpcm9sZS4gcmVtb3ZlCi0gKiB0aGlzIGNvbnN0YW50IGZyb20gdGhlIGNvZGUgd2hlbiB3ZSBkby4KLSAqLwotI2RlZmluZSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQgICAzCi0KLS8qCiAgKiBXaGVuIGluIEFQLW1vZGUsIHdlIGFsbG93IChhdCBsZWFzdCkgdGhpcyBudW1iZXIgb2YgcGFja2V0cwogICogdG8gYmUgdHJhbnNtaXR0ZWQgdG8gRlcgZm9yIGEgU1RBIGluIFBTLW1vZGUuIE9ubHkgd2hlbiBwYWNrZXRzIGFyZQogICogcHJlc2VudCBpbiB0aGUgRlcgYnVmZmVycyBpdCB3aWxsIHdha2UgdGhlIHNsZWVwaW5nIFNUQS4gV2Ugd2FudCB0byBwdXQKQEAgLTIzNiwxMyArMTU1LDYgQEAKIAogI2RlZmluZSBBUF9NQVhfU1RBVElPTlMgICAgICAgICAgICA4CiAKLS8qIEJyb2FkY2FzdCBhbmQgR2xvYmFsIGxpbmtzICsgc3lzdGVtIGxpbmsgKyBsaW5rcyB0byBzdGF0aW9ucyAqLwotLyoKLSAqIFRPRE86IHdoZW4gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUIGlzIG5vIGxvbmdlciBjb25zdGFudCwgY2hhbmdlIGFsbAotICogdGhlIHBsYWNlcyB0aGF0IHVzZSB0aGlzLgotICovCi0jZGVmaW5lIEFQX01BWF9MSU5LUyAgICAgICAgICAgICAgIChBUF9NQVhfU1RBVElPTlMgKyBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQpCi0KIC8qIEZXIHN0YXR1cyByZWdpc3RlcnMgKi8KIHN0cnVjdCB3bDEyeHhfZndfc3RhdHVzIHsKIAlfX2xlMzIgaW50cjsKQEAgLTI5OSwxNyArMjExLDE0IEBACiB9OwogCiBzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgewotCXZvaWQgKCpyZWFkKShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwl2b2lkICgqcmVhZCkoc3RydWN0IGRldmljZSAqY2hpbGQsIGludCBhZGRyLCB2b2lkICpidWYsIHNpemVfdCBsZW4sCiAJCSAgICAgYm9vbCBmaXhlZCk7Ci0Jdm9pZCAoKndyaXRlKShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwl2b2lkICgqd3JpdGUpKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAogCQkgICAgIGJvb2wgZml4ZWQpOwotCXZvaWQgKCpyZXNldCkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCppbml0KShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci0JaW50ICgqcG93ZXIpKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci0Jc3RydWN0IGRldmljZSogKCpkZXYpKHN0cnVjdCB3bDEyNzEgKndsKTsKLQl2b2lkICgqZW5hYmxlX2lycSkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCpkaXNhYmxlX2lycSkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCpzZXRfYmxvY2tfc2l6ZSkgKHN0cnVjdCB3bDEyNzEgKndsLCB1bnNpZ25lZCBpbnQgYmxrc3opOworCXZvaWQgKCpyZXNldCkoc3RydWN0IGRldmljZSAqY2hpbGQpOworCXZvaWQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICpjaGlsZCk7CisJaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBib29sIGVuYWJsZSk7CisJdm9pZCAoKnNldF9ibG9ja19zaXplKSAoc3RydWN0IGRldmljZSAqY2hpbGQsIHVuc2lnbmVkIGludCBibGtzeik7CiB9OwogCiAjZGVmaW5lIE1BWF9OVU1fS0VZUyAxNApAQCAtMzI2LDI5ICsyMzUsMzMgQEAKIH07CiAKIGVudW0gd2wxMnh4X2ZsYWdzIHsKLQlXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwKLQlXTDEyNzFfRkxBR19JQlNTX0pPSU5FRCwKIAlXTDEyNzFfRkxBR19HUElPX1BPV0VSLAogCVdMMTI3MV9GTEFHX1RYX1FVRVVFX1NUT1BQRUQsCiAJV0wxMjcxX0ZMQUdfVFhfUEVORElORywKIAlXTDEyNzFfRkxBR19JTl9FTFAsCiAJV0wxMjcxX0ZMQUdfRUxQX1JFUVVFU1RFRCwKLQlXTDEyNzFfRkxBR19QU00sCi0JV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwKIAlXTDEyNzFfRkxBR19JUlFfUlVOTklORywKIAlXTDEyNzFfRkxBR19JRExFLAotCVdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLAotCVdMMTI3MV9GTEFHX1NUQV9TVEFURV9TRU5ULAogCVdMMTI3MV9GTEFHX0ZXX1RYX0JVU1ksCi0JV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwKLQlXTDEyNzFfRkxBR19JRl9JTklUSUFMSVpFRCwKIAlXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywKIAlXTDEyNzFfRkxBR19TVVNQRU5ERUQsCiAJV0wxMjcxX0ZMQUdfUEVORElOR19XT1JLLAogCVdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLAotCVdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELAogCVdMMTI3MV9GTEFHX1JFQ09WRVJZX0lOX1BST0dSRVNTLAotCVdMMTI3MV9GTEFHX0NTX1BST0dSRVNTLAorfTsKKworZW51bSB3bDEyeHhfdmlmX2ZsYWdzIHsKKwlXTFZJRl9GTEFHX0lOSVRJQUxJWkVELAorCVdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsCisJV0xWSUZfRkxBR19JQlNTX0pPSU5FRCwKKwlXTFZJRl9GTEFHX0FQX1NUQVJURUQsCisJV0xWSUZfRkxBR19QU00sCisJV0xWSUZfRkxBR19QU01fUkVRVUVTVEVELAorCVdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsCisJV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwKKwlXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLAorCVdMVklGX0ZMQUdfQ1NfUFJPR1JFU1MsCisJV0xWSUZfRkxBR19BUF9QUk9CRV9SRVNQX1NFVCwKIH07CiAKIHN0cnVjdCB3bDEyNzFfbGluayB7CkBAIC0zNjYsMTAgKzI3OSwxMSBAQAogfTsKIAogc3RydWN0IHdsMTI3MSB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJYm9vbCBtYWM4MDIxMV9yZWdpc3RlcmVkOwogCisJc3RydWN0IGRldmljZSAqZGV2OworCiAJdm9pZCAqaWZfcHJpdjsKIAogCXN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyAqaWZfb3BzOwpAQCAtMzk5LDI1ICszMTMsMjAgQEAKIAogCXM4IGh3X3BnX3ZlcjsKIAotCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07Ci0JdTggYnNzX3R5cGU7Ci0JdTggc2V0X2Jzc190eXBlOwotCXU4IHAycDsgLyogd2UgYXJlIHVzaW5nIHAycCByb2xlICovCi0JdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07Ci0JdTggc3NpZF9sZW47CiAJaW50IGNoYW5uZWw7Ci0JdTggcm9sZV9pZDsKLQl1OCBkZXZfcm9sZV9pZDsKIAl1OCBzeXN0ZW1faGxpZDsKLQl1OCBzdGFfaGxpZDsKLQl1OCBkZXZfaGxpZDsKLQl1OCBhcF9nbG9iYWxfaGxpZDsKLQl1OCBhcF9iY2FzdF9obGlkOwogCiAJdW5zaWduZWQgbG9uZyBsaW5rc19tYXBbQklUU19UT19MT05HUyhXTDEyWFhfTUFYX0xJTktTKV07CiAJdW5zaWduZWQgbG9uZyByb2xlc19tYXBbQklUU19UT19MT05HUyhXTDEyWFhfTUFYX1JPTEVTKV07CiAJdW5zaWduZWQgbG9uZyByb2NfbWFwW0JJVFNfVE9fTE9OR1MoV0wxMlhYX01BWF9ST0xFUyldOworCXVuc2lnbmVkIGxvbmcgcmF0ZV9wb2xpY2llc19tYXBbCisJCQlCSVRTX1RPX0xPTkdTKFdMMTJYWF9NQVhfUkFURV9QT0xJQ0lFUyldOworCisJc3RydWN0IGxpc3RfaGVhZCB3bHZpZl9saXN0OworCisJdTggc3RhX2NvdW50OworCXU4IGFwX2NvdW50OwogCiAJc3RydWN0IHdsMTI3MV9hY3hfbWVtX21hcCAqdGFyZ2V0X21lbV9tYXA7CiAKQEAgLTQ0MCwxMSArMzQ5LDcgQEAKIAkvKiBUaW1lLW9mZnNldCBiZXR3ZWVuIGhvc3QgYW5kIGNoaXBzZXQgY2xvY2tzICovCiAJczY0IHRpbWVfb2Zmc2V0OwogCi0JLyogU2Vzc2lvbiBjb3VudGVyIGZvciB0aGUgY2hpcHNldCAqLwotCWludCBzZXNzaW9uX2NvdW50ZXI7Ci0KIAkvKiBGcmFtZXMgc2NoZWR1bGVkIGZvciB0cmFuc21pc3Npb24sIG5vdCBoYW5kbGVkIHlldCAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcXVldWVbTlVNX1RYX1FVRVVFU107CiAJaW50IHR4X3F1ZXVlX2NvdW50W05VTV9UWF9RVUVVRVNdOwogCWxvbmcgc3RvcHBlZF9xdWV1ZXNfbWFwOwogCkBAIC00NjIsMTcgKzM2Nyw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnR4X2ZyYW1lc1tBQ1hfVFhfREVTQ1JJUFRPUlNdOwogCWludCB0eF9mcmFtZXNfY250OwogCi0JLyoKLQkgKiBTZWN1cml0eSBzZXF1ZW5jZSBudW1iZXIKLQkgKiAgICAgYml0cyAwLTE1OiBsb3dlciAxNiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCi0JICogICAgIGJpdHMgMTYtNDc6IGhpZ2hlciAzMiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCi0JICogICAgIGJpdHMgNDgtNjM6IG5vdCBpbiB1c2UKLQkgKi8KLQl1NjQgdHhfc2VjdXJpdHlfc2VxOwotCi0JLyogOCBiaXRzIG9mIHRoZSBsYXN0IHNlcXVlbmNlIG51bWJlciBpbiB1c2UgKi8KLQl1OCB0eF9zZWN1cml0eV9sYXN0X3NlcV9sc2I7Ci0KIAkvKiBGVyBSeCBjb3VudGVyICovCiAJdTMyIHJ4X2NvdW50ZXI7CiAKQEAgLTUwNyw1OSArNDAxLDIxIEBACiAJdTMyIG1ib3hfcHRyWzJdOwogCiAJLyogQXJlIHdlIGN1cnJlbnRseSBzY2FubmluZyAqLworCXN0cnVjdCBpZWVlODAyMTFfdmlmICpzY2FuX3ZpZjsKIAlzdHJ1Y3Qgd2wxMjcxX3NjYW4gc2NhbjsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjYW5fY29tcGxldGVfd29yazsKIAogCWJvb2wgc2NoZWRfc2Nhbm5pbmc7CiAKLQkvKiBwcm9iZS1yZXEgdGVtcGxhdGUgZm9yIHRoZSBjdXJyZW50IEFQICovCi0Jc3RydWN0IHNrX2J1ZmYgKnByb2JlcmVxOwotCi0JLyogT3VyIGFzc29jaWF0aW9uIElEICovCi0JdTE2IGFpZDsKLQotCS8qCi0JICogY3VycmVudGx5IGNvbmZpZ3VyZWQgcmF0ZSBzZXQ6Ci0JICoJYml0cyAgMC0xNSAtIDgwMi4xMWFiZyByYXRlcwotCSAqCWJpdHMgMTYtMjMgLSA4MDIuMTFuICAgTUNTIGluZGV4IG1hc2sKLQkgKiBzdXBwb3J0IG9ubHkgMSBzdHJlYW0sIHRodXMgb25seSA4IGJpdHMgZm9yIHRoZSBNQ1MgcmF0ZXMgKDAtNykuCi0JICovCi0JdTMyIGJhc2ljX3JhdGVfc2V0OwotCXUzMiBiYXNpY19yYXRlOwotCXUzMiByYXRlX3NldDsKLQl1MzIgYml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKLQogCS8qIFRoZSBjdXJyZW50IGJhbmQgKi8KIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAKLQkvKiBCZWFjb25pbmcgaW50ZXJ2YWwgKG5lZWRlZCBmb3IgYWQtaG9jKSAqLwotCXUzMiBiZWFjb25faW50OwotCi0JLyogRGVmYXVsdCBrZXkgKGZvciBXRVApICovCi0JdTMyIGRlZmF1bHRfa2V5OwotCi0JLyogUnggU3RyZWFtaW5nICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHJ4X3N0cmVhbWluZ19lbmFibGVfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yazsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByeF9zdHJlYW1pbmdfdGltZXI7Ci0KIAlzdHJ1Y3QgY29tcGxldGlvbiAqZWxwX2NvbXBsOwotCXN0cnVjdCBjb21wbGV0aW9uICpwc19jb21wbDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGVscF93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcHNwb2xsX3dvcms7Ci0KLQkvKiBjb3VudGVyIGZvciBwcy1wb2xsIGRlbGl2ZXJ5IGZhaWx1cmVzICovCi0JaW50IHBzX3BvbGxfZmFpbHVyZXM7Ci0KLQkvKiByZXRyeSBjb3VudGVyIGZvciBQU00gZW50cmllcyAqLwotCXU4IHBzbV9lbnRyeV9yZXRyeTsKIAogCS8qIGluIGRCbSAqLwogCWludCBwb3dlcl9sZXZlbDsKIAotCWludCByc3NpX3Rob2xkOwotCWludCBsYXN0X3Jzc2lfZXZlbnQ7Ci0KIAlzdHJ1Y3Qgd2wxMjcxX3N0YXRzIHN0YXRzOwogCiAJX19sZTMyIGJ1ZmZlcl8zMjsKQEAgLTU4MywyMCArNDM5LDkgQEAKIAkvKiBNb3N0IHJlY2VudGx5IHJlcG9ydGVkIG5vaXNlIGluIGRCbSAqLwogCXM4IG5vaXNlOwogCi0JLyogbWFwIGZvciBITElEcyBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIC0gd2hlbiBvcGVyYXRpbmcgaW4gQVAgbW9kZSAqLwotCXVuc2lnbmVkIGxvbmcgYXBfaGxpZF9tYXBbQklUU19UT19MT05HUyhBUF9NQVhfU1RBVElPTlMpXTsKLQotCS8qIHJlY29yZWRlZCBrZXlzIGZvciBBUC1tb2RlIC0gc2V0IGhlcmUgYmVmb3JlIEFQIHN0YXJ0dXAgKi8KLQlzdHJ1Y3Qgd2wxMjcxX2FwX2tleSAqcmVjb3JkZWRfYXBfa2V5c1tNQVhfTlVNX0tFWVNdOwotCiAJLyogYmFuZHMgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2Ygd2wxMnh4ICovCiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKIAotCS8qIFJYIEJBIGNvbnN0cmFpbnQgdmFsdWUgKi8KLQlib29sIGJhX3N1cHBvcnQ7Ci0JdTggYmFfcnhfYml0bWFwOwotCWJvb2wgYmFfYWxsb3dlZDsKLQogCWludCB0Y3hvX2Nsb2NrOwogCiAJLyoKQEAgLTYxMCwxMCArNDU1LDcgQEAKIAkgKiBBUC1tb2RlIC0gbGlua3MgaW5kZXhlZCBieSBITElELiBUaGUgZ2xvYmFsIGFuZCBicm9hZGNhc3QgbGlua3MKIAkgKiBhcmUgYWx3YXlzIGFjdGl2ZS4KIAkgKi8KLQlzdHJ1Y3Qgd2wxMjcxX2xpbmsgbGlua3NbQVBfTUFYX0xJTktTXTsKLQotCS8qIHRoZSBobGlkIG9mIHRoZSBsaW5rIHdoZXJlIHRoZSBsYXN0IHRyYW5zbWl0dGVkIHNrYiBjYW1lIGZyb20gKi8KLQlpbnQgbGFzdF90eF9obGlkOworCXN0cnVjdCB3bDEyNzFfbGluayBsaW5rc1tXTDEyWFhfTUFYX0xJTktTXTsKIAogCS8qIEFQLW1vZGUgLSBhIGJpdG1hcCBvZiBsaW5rcyBjdXJyZW50bHkgaW4gUFMgbW9kZSBhY2NvcmRpbmcgdG8gRlcgKi8KIAl1MzIgYXBfZndfcHNfbWFwOwpAQCAtNjMyLDIxICs0NzQsMTczIEBACiAKIAkvKiBBUC1tb2RlIC0gbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgc3RhdGlvbnMgKi8KIAlpbnQgYWN0aXZlX3N0YV9jb3VudDsKKworCS8qIGxhc3Qgd2x2aWYgd2UgdHJhbnNtaXR0ZWQgZnJvbSAqLworCXN0cnVjdCB3bDEyeHhfdmlmICpsYXN0X3dsdmlmOwogfTsKIAogc3RydWN0IHdsMTI3MV9zdGF0aW9uIHsKIAl1OCBobGlkOwogfTsKIAorc3RydWN0IHdsMTJ4eF92aWYgeworCXN0cnVjdCB3bDEyNzEgKndsOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGJzc190eXBlOworCXU4IHAycDsgLyogd2UgYXJlIHVzaW5nIHAycCByb2xlICovCisJdTggcm9sZV9pZDsKKworCS8qIHN0YS9pYnNzIHNwZWNpZmljICovCisJdTggZGV2X3JvbGVfaWQ7CisJdTggZGV2X2hsaWQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBobGlkOworCQkJdTggYmFfcnhfYml0bWFwOworCisJCQl1OCBiYXNpY19yYXRlX2lkeDsKKwkJCXU4IGFwX3JhdGVfaWR4OworCQkJdTggcDJwX3JhdGVfaWR4OworCQl9IHN0YTsKKwkJc3RydWN0IHsKKwkJCXU4IGdsb2JhbF9obGlkOworCQkJdTggYmNhc3RfaGxpZDsKKworCQkJLyogSExJRHMgYml0bWFwIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgKi8KKwkJCXVuc2lnbmVkIGxvbmcgc3RhX2hsaWRfbWFwW0JJVFNfVE9fTE9OR1MoCisJCQkJCQkJV0wxMlhYX01BWF9MSU5LUyldOworCisJCQkvKiByZWNvcmVkZWQga2V5cyAtIHNldCBoZXJlIGJlZm9yZSBBUCBzdGFydHVwICovCisJCQlzdHJ1Y3Qgd2wxMjcxX2FwX2tleSAqcmVjb3JkZWRfa2V5c1tNQVhfTlVNX0tFWVNdOworCisJCQl1OCBtZ210X3JhdGVfaWR4OworCQkJdTggYmNhc3RfcmF0ZV9pZHg7CisJCQl1OCB1Y2FzdF9yYXRlX2lkeFtDT05GX1RYX01BWF9BQ19DT1VOVF07CisJCX0gYXA7CisJfTsKKworCS8qIHRoZSBobGlkIG9mIHRoZSBsYXN0IHRyYW5zbWl0dGVkIHNrYiAqLworCWludCBsYXN0X3R4X2hsaWQ7CisKKwl1bnNpZ25lZCBsb25nIGxpbmtzX21hcFtCSVRTX1RPX0xPTkdTKFdMMTJYWF9NQVhfTElOS1MpXTsKKworCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlIGN1cnJlbnQgYmFuZCAqLworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlpbnQgY2hhbm5lbDsKKworCXUzMiBiaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXUzMiBiYXNpY19yYXRlX3NldDsKKworCS8qCisJICogY3VycmVudGx5IGNvbmZpZ3VyZWQgcmF0ZSBzZXQ6CisJICoJYml0cyAgMC0xNSAtIDgwMi4xMWFiZyByYXRlcworCSAqCWJpdHMgMTYtMjMgLSA4MDIuMTFuICAgTUNTIGluZGV4IG1hc2sKKwkgKiBzdXBwb3J0IG9ubHkgMSBzdHJlYW0sIHRodXMgb25seSA4IGJpdHMgZm9yIHRoZSBNQ1MgcmF0ZXMgKDAtNykuCisJICovCisJdTMyIGJhc2ljX3JhdGU7CisJdTMyIHJhdGVfc2V0OworCisJLyogcHJvYmUtcmVxIHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCBBUCAqLworCXN0cnVjdCBza19idWZmICpwcm9iZXJlcTsKKworCS8qIEJlYWNvbmluZyBpbnRlcnZhbCAobmVlZGVkIGZvciBhZC1ob2MpICovCisJdTMyIGJlYWNvbl9pbnQ7CisKKwkvKiBEZWZhdWx0IGtleSAoZm9yIFdFUCkgKi8KKwl1MzIgZGVmYXVsdF9rZXk7CisKKwkvKiBPdXIgYXNzb2NpYXRpb24gSUQgKi8KKwl1MTYgYWlkOworCisJLyogU2Vzc2lvbiBjb3VudGVyIGZvciB0aGUgY2hpcHNldCAqLworCWludCBzZXNzaW9uX2NvdW50ZXI7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiAqcHNfY29tcGw7CisJc3RydWN0IGRlbGF5ZWRfd29yayBwc3BvbGxfd29yazsKKworCS8qIGNvdW50ZXIgZm9yIHBzLXBvbGwgZGVsaXZlcnkgZmFpbHVyZXMgKi8KKwlpbnQgcHNfcG9sbF9mYWlsdXJlczsKKworCS8qIHJldHJ5IGNvdW50ZXIgZm9yIFBTTSBlbnRyaWVzICovCisJdTggcHNtX2VudHJ5X3JldHJ5OworCisJLyogaW4gZEJtICovCisJaW50IHBvd2VyX2xldmVsOworCisJaW50IHJzc2lfdGhvbGQ7CisJaW50IGxhc3RfcnNzaV9ldmVudDsKKworCS8qIFJYIEJBIGNvbnN0cmFpbnQgdmFsdWUgKi8KKwlib29sIGJhX3N1cHBvcnQ7CisJYm9vbCBiYV9hbGxvd2VkOworCisJLyogUnggU3RyZWFtaW5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3N0cmVhbWluZ19lbmFibGVfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9zdHJlYW1pbmdfdGltZXI7CisKKwkvKgorCSAqIFRoaXMgc3RydWN0IG11c3QgYmUgbGFzdCEKKwkgKiBkYXRhIHRoYXQgaGFzIHRvIGJlIHNhdmVkIGFjcm9zc2VkIHJlY29uZmlncyAoZS5nLiByZWNvdmVyeSkKKwkgKiBzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhpcyBzdHJ1Y3QuCisJICovCisJc3RydWN0IHsKKwkJdTggcGVyc2lzdGVudFswXTsKKwkJLyoKKwkJICogU2VjdXJpdHkgc2VxdWVuY2UgbnVtYmVyCisJCSAqICAgICBiaXRzIDAtMTU6IGxvd2VyIDE2IGJpdHMgcGFydCBvZiBzZXF1ZW5jZSBudW1iZXIKKwkJICogICAgIGJpdHMgMTYtNDc6IGhpZ2hlciAzMiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCisJCSAqICAgICBiaXRzIDQ4LTYzOiBub3QgaW4gdXNlCisJCSAqLworCQl1NjQgdHhfc2VjdXJpdHlfc2VxOworCisJCS8qIDggYml0cyBvZiB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgaW4gdXNlICovCisJCXU4IHR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYjsKKwl9OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2wxMnh4X3ZpZl90b19kYXRhKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJcmV0dXJuIChzdHJ1Y3Qgd2wxMnh4X3ZpZiAqKXZpZi0+ZHJ2X3ByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpZWVlODAyMTFfdmlmICp3bDEyeHhfd2x2aWZfdG9fdmlmKHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopd2x2aWYsIHN0cnVjdCBpZWVlODAyMTFfdmlmLCBkcnZfcHJpdik7Cit9CisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgXAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdsdmlmLCAmd2wtPndsdmlmX2xpc3QsIGxpc3QpCisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2NvbnRpbnVlKHdsLCB3bHZpZikgXAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHdsdmlmLCAmd2wtPndsdmlmX2xpc3QsIGxpc3QpCisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2Jzc190eXBlKHdsLCB3bHZpZiwgX2Jzc190eXBlKQlcCisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpCQlcCisJCQlpZiAod2x2aWYtPmJzc190eXBlID09IF9ic3NfdHlwZSkKKworI2RlZmluZSB3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikJXAorCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfYnNzX3R5cGUod2wsIHdsdmlmLCBCU1NfVFlQRV9TVEFfQlNTKQorCisjZGVmaW5lIHdsMTJ4eF9mb3JfZWFjaF93bHZpZl9hcCh3bCwgd2x2aWYpCVwKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2Jzc190eXBlKHdsLCB3bHZpZiwgQlNTX1RZUEVfQVBfQlNTKQorCiBpbnQgd2wxMjcxX3BsdF9zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX3BsdF9zdG9wKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiB2b2lkIHdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3bDEyNzEgKndsKTsKIHNpemVfdCB3bDEyeHhfY29weV9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggKm1lbWJsb2NrLCBzaXplX3QgbWF4bGVuKTsKIAogI2RlZmluZSBKT0lOX1RJTUVPVVQgNTAwMCAvKiA1MDAwIG1pbGxpc2Vjb25kcyB0byBqb2luICovCiAKLSNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX01BWCA3IC8qIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXNzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX01BWCA2IC8qIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXNzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX0lOVkFMSUQgNyAvKiB1c2VkIHdpdGggZHVtbXlfcGFja2V0ICovCiAKICNkZWZpbmUgV0wxMjcxX0RFRkFVTFRfUE9XRVJfTEVWRUwgMAogCkBAIC02NjksOCArNjYzLDggQEAKIC8qIEVhY2ggUlgvVFggdHJhbnNhY3Rpb24gcmVxdWlyZXMgYW4gZW5kLW9mLXRyYW5zYWN0aW9uIHRyYW5zZmVyICovCiAjZGVmaW5lIFdMMTJYWF9RVUlSS19FTkRfT0ZfVFJBTlNBQ1RJT04JCUJJVCgwKQogCi0vKiBXTDEyOFggcmVxdWlyZXMgYWdncmVnYXRlZCBwYWNrZXRzIHRvIGJlIGFsaWduZWQgdG8gdGhlIFNESU8gYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBXTDEyWFhfUVVJUktfQkxPQ0tTSVpFX0FMSUdOTUVOVAlCSVQoMikKKy8qIHdsMTI3eCBhbmQgU1BJIGRvbid0IHN1cHBvcnQgU0RJTyBibG9jayBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVAlCSVQoMikKIAogLyogT2xkZXIgZmlybXdhcmVzIGRpZCBub3QgaW1wbGVtZW50IHRoZSBGVyBsb2dnZXIgb3ZlciBidXMgZmVhdHVyZSAqLwogI2RlZmluZSBXTDEyWFhfUVVJUktfRldMT0dfTk9UX0lNUExFTUVOVEVECUJJVCg0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eF84MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eF84MDIxMS5oCmluZGV4IGY3OTcxZDMuLjhmMGZmYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4XzgwMjExLmgKQEAgLTExNiwxMSArMTE2LDYgQEAKIAl1OCB0YVtFVEhfQUxFTl07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3Qgd2wxMnh4X3Fvc19udWxsX2RhdGFfdGVtcGxhdGUgewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyIGhlYWRlcjsKLQlfX2xlMTYgcW9zX2N0bDsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCB3bDEyeHhfYXJwX3JzcF90ZW1wbGF0ZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4X3BsYXRmb3JtX2RhdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCmluZGV4IDk3M2IxMTAuLjNjOTZiMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworc3RhdGljIHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKIAogaW50IF9faW5pdCB3bDEyeHhfc2V0X3BsYXRmb3JtX2RhdGEoY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICpkYXRhKQogewpAQCAtMTgsNyArMTgsNyBAQAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKndsMTJ4eF9nZXRfcGxhdGZvcm1fZGF0YSh2b2lkKQorc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICp3bDEyeHhfZ2V0X3BsYXRmb3JtX2RhdGEodm9pZCkKIHsKIAlpZiAoIXBsYXRmb3JtX2RhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBjZjBkNjlkLi43ODViZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmggYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAppbmRleCAxNjFmMjA3Li45NGI3OWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaApAQCAtNTgsMTAgKzU4LDYgQEAKIAl1OCAgICAgICAgICAgICAgIGZlX2Rldl9hZGRyWzZdOwogCiAJLyogUGh5c2ljYWwgcGFyYW1ldGVycyBvZiB0aGUgY29tbXMgd2luZG93LiAqLwotCWdyYW50X2hhbmRsZV90ICAgdHhfc2htZW1faGFuZGxlOwotCWdyYW50X3JlZl90ICAgICAgdHhfc2htZW1fcmVmOwotCWdyYW50X2hhbmRsZV90ICAgcnhfc2htZW1faGFuZGxlOwotCWdyYW50X3JlZl90ICAgICAgcnhfc2htZW1fcmVmOwogCXVuc2lnbmVkIGludCAgICAgaXJxOwogCiAJLyogTGlzdCBvZiBmcm9udGVuZHMgdG8gbm90aWZ5IGFmdGVyIGEgYmF0Y2ggb2YgZnJhbWVzIHNlbnQuICovCkBAIC03MCw4ICs2Niw2IEBACiAJLyogVGhlIHNoYXJlZCByaW5ncyBhbmQgaW5kZXhlcy4gKi8KIAlzdHJ1Y3QgeGVuX25ldGlmX3R4X2JhY2tfcmluZyB0eDsKIAlzdHJ1Y3QgeGVuX25ldGlmX3J4X2JhY2tfcmluZyByeDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp0eF9jb21tc19hcmVhOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKnJ4X2NvbW1zX2FyZWE7CiAKIAkvKiBGcm9udGVuZCBmZWF0dXJlIGluZm9ybWF0aW9uLiAqLwogCXU4IGNhbl9zZzoxOwpAQCAtMTA2LDYgKzEwMCwxMSBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRpbmdfdG9fZnJlZTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbnZpZl90b194ZW5idXNfZGV2aWNlKHN0cnVjdCB4ZW52aWYgKnZpZikKK3sKKwlyZXR1cm4gdG9feGVuYnVzX2RldmljZSh2aWYtPmRldi0+ZGV2LnBhcmVudCk7Cit9CisKICNkZWZpbmUgWEVOX05FVElGX1RYX1JJTkdfU0laRSBfX0NPTlNUX1JJTkdfU0laRSh4ZW5fbmV0aWZfdHgsIFBBR0VfU0laRSkKICNkZWZpbmUgWEVOX05FVElGX1JYX1JJTkdfU0laRSBfX0NPTlNUX1JJTkdfU0laRSh4ZW5fbmV0aWZfcngsIFBBR0VfU0laRSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IGQ1NTA4OTUuLjBjYjU5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTE1ODksODggKzE1ODksNDIgQEAKIAogdm9pZCB4ZW5fbmV0YmtfdW5tYXBfZnJvbnRlbmRfcmluZ3Moc3RydWN0IHhlbnZpZiAqdmlmKQogewotCXN0cnVjdCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmIG9wOwotCi0JaWYgKHZpZi0+dHguc3JpbmcpIHsKLQkJZ250dGFiX3NldF91bm1hcF9vcCgmb3AsICh1bnNpZ25lZCBsb25nKXZpZi0+dHhfY29tbXNfYXJlYS0+YWRkciwKLQkJCQkgICAgR05UTUFQX2hvc3RfbWFwLCB2aWYtPnR4X3NobWVtX2hhbmRsZSk7Ci0KLQkJaWYgKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfdW5tYXBfZ3JhbnRfcmVmLCAmb3AsIDEpKQotCQkJQlVHKCk7Ci0JfQotCi0JaWYgKHZpZi0+cnguc3JpbmcpIHsKLQkJZ250dGFiX3NldF91bm1hcF9vcCgmb3AsICh1bnNpZ25lZCBsb25nKXZpZi0+cnhfY29tbXNfYXJlYS0+YWRkciwKLQkJCQkgICAgR05UTUFQX2hvc3RfbWFwLCB2aWYtPnJ4X3NobWVtX2hhbmRsZSk7Ci0KLQkJaWYgKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfdW5tYXBfZ3JhbnRfcmVmLCAmb3AsIDEpKQotCQkJQlVHKCk7Ci0JfQotCWlmICh2aWYtPnJ4X2NvbW1zX2FyZWEpCi0JCWZyZWVfdm1fYXJlYSh2aWYtPnJ4X2NvbW1zX2FyZWEpOwotCWlmICh2aWYtPnR4X2NvbW1zX2FyZWEpCi0JCWZyZWVfdm1fYXJlYSh2aWYtPnR4X2NvbW1zX2FyZWEpOworCWlmICh2aWYtPnR4LnNyaW5nKQorCQl4ZW5idXNfdW5tYXBfcmluZ192ZnJlZSh4ZW52aWZfdG9feGVuYnVzX2RldmljZSh2aWYpLAorCQkJCQl2aWYtPnR4LnNyaW5nKTsKKwlpZiAodmlmLT5yeC5zcmluZykKKwkJeGVuYnVzX3VubWFwX3JpbmdfdmZyZWUoeGVudmlmX3RvX3hlbmJ1c19kZXZpY2UodmlmKSwKKwkJCQkJdmlmLT5yeC5zcmluZyk7CiB9CiAKIGludCB4ZW5fbmV0YmtfbWFwX2Zyb250ZW5kX3JpbmdzKHN0cnVjdCB4ZW52aWYgKnZpZiwKIAkJCQkgZ3JhbnRfcmVmX3QgdHhfcmluZ19yZWYsCiAJCQkJIGdyYW50X3JlZl90IHJ4X3JpbmdfcmVmKQogewotCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiBvcDsKKwl2b2lkICphZGRyOwogCXN0cnVjdCB4ZW5fbmV0aWZfdHhfc3JpbmcgKnR4czsKIAlzdHJ1Y3QgeGVuX25ldGlmX3J4X3NyaW5nICpyeHM7CiAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAotCXZpZi0+dHhfY29tbXNfYXJlYSA9IGFsbG9jX3ZtX2FyZWEoUEFHRV9TSVpFKTsKLQlpZiAodmlmLT50eF9jb21tc19hcmVhID09IE5VTEwpCisJZXJyID0geGVuYnVzX21hcF9yaW5nX3ZhbGxvYyh4ZW52aWZfdG9feGVuYnVzX2RldmljZSh2aWYpLAorCQkJCSAgICAgdHhfcmluZ19yZWYsICZhZGRyKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycjsKIAotCXZpZi0+cnhfY29tbXNfYXJlYSA9IGFsbG9jX3ZtX2FyZWEoUEFHRV9TSVpFKTsKLQlpZiAodmlmLT5yeF9jb21tc19hcmVhID09IE5VTEwpCi0JCWdvdG8gZXJyOwotCi0JZ250dGFiX3NldF9tYXBfb3AoJm9wLCAodW5zaWduZWQgbG9uZyl2aWYtPnR4X2NvbW1zX2FyZWEtPmFkZHIsCi0JCQkgIEdOVE1BUF9ob3N0X21hcCwgdHhfcmluZ19yZWYsIHZpZi0+ZG9taWQpOwotCi0JaWYgKEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfbWFwX2dyYW50X3JlZiwgJm9wLCAxKSkKLQkJQlVHKCk7Ci0KLQlpZiAob3Auc3RhdHVzKSB7Ci0JCW5ldGRldl93YXJuKHZpZi0+ZGV2LAotCQkJICAgICJmYWlsZWQgdG8gbWFwIHR4IHJpbmcuIGVycj0lZCBzdGF0dXM9JWRcbiIsCi0JCQkgICAgZXJyLCBvcC5zdGF0dXMpOwotCQllcnIgPSBvcC5zdGF0dXM7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXZpZi0+dHhfc2htZW1fcmVmICAgID0gdHhfcmluZ19yZWY7Ci0JdmlmLT50eF9zaG1lbV9oYW5kbGUgPSBvcC5oYW5kbGU7Ci0KLQl0eHMgPSAoc3RydWN0IHhlbl9uZXRpZl90eF9zcmluZyAqKXZpZi0+dHhfY29tbXNfYXJlYS0+YWRkcjsKKwl0eHMgPSAoc3RydWN0IHhlbl9uZXRpZl90eF9zcmluZyAqKWFkZHI7CiAJQkFDS19SSU5HX0lOSVQoJnZpZi0+dHgsIHR4cywgUEFHRV9TSVpFKTsKIAotCWdudHRhYl9zZXRfbWFwX29wKCZvcCwgKHVuc2lnbmVkIGxvbmcpdmlmLT5yeF9jb21tc19hcmVhLT5hZGRyLAotCQkJICBHTlRNQVBfaG9zdF9tYXAsIHJ4X3JpbmdfcmVmLCB2aWYtPmRvbWlkKTsKLQotCWlmIChIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX21hcF9ncmFudF9yZWYsICZvcCwgMSkpCi0JCUJVRygpOwotCi0JaWYgKG9wLnN0YXR1cykgewotCQluZXRkZXZfd2Fybih2aWYtPmRldiwKLQkJCSAgICAiZmFpbGVkIHRvIG1hcCByeCByaW5nLiBlcnI9JWQgc3RhdHVzPSVkXG4iLAotCQkJICAgIGVyciwgb3Auc3RhdHVzKTsKLQkJZXJyID0gb3Auc3RhdHVzOworCWVyciA9IHhlbmJ1c19tYXBfcmluZ192YWxsb2MoeGVudmlmX3RvX3hlbmJ1c19kZXZpY2UodmlmKSwKKwkJCQkgICAgIHJ4X3JpbmdfcmVmLCAmYWRkcik7CisJaWYgKGVycikKIAkJZ290byBlcnI7Ci0JfQogCi0JdmlmLT5yeF9zaG1lbV9yZWYgICAgID0gcnhfcmluZ19yZWY7Ci0JdmlmLT5yeF9zaG1lbV9oYW5kbGUgID0gb3AuaGFuZGxlOwotCXZpZi0+cnhfcmVxX2NvbnNfcGVlayA9IDA7Ci0KLQlyeHMgPSAoc3RydWN0IHhlbl9uZXRpZl9yeF9zcmluZyAqKXZpZi0+cnhfY29tbXNfYXJlYS0+YWRkcjsKKwlyeHMgPSAoc3RydWN0IHhlbl9uZXRpZl9yeF9zcmluZyAqKWFkZHI7CiAJQkFDS19SSU5HX0lOSVQoJnZpZi0+cngsIHJ4cywgUEFHRV9TSVpFKTsKIAorCXZpZi0+cnhfcmVxX2NvbnNfcGVlayA9IDA7CisKIAlyZXR1cm4gMDsKIAogZXJyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvbmZjd2lsaW5rLmMgYi9kcml2ZXJzL25mYy9uZmN3aWxpbmsuYwppbmRleCA1YjBmMWZmLi4wNmMzNjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9uZmN3aWxpbmsuYworKysgYi9kcml2ZXJzL25mYy9uZmN3aWxpbmsuYwpAQCAtMjcsNiArMjcsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mYy5oPgogI2luY2x1ZGUgPG5ldC9uZmMvbmNpLmg+CiAjaW5jbHVkZSA8bmV0L25mYy9uY2lfY29yZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG41MzMuYyBiL2RyaXZlcnMvbmZjL3BuNTMzLmMKaW5kZXggN2JjYjFmZS4uYjhiNmMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvcG41MzMuYworKysgYi9kcml2ZXJzL25mYy9wbjUzMy5jCkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFBONTMzX0NNRF9JTl9MSVNUX1BBU1NJVkVfVEFSR0VUIDB4NEEKICNkZWZpbmUgUE41MzNfQ01EX0lOX0FUUiAweDUwCiAjZGVmaW5lIFBONTMzX0NNRF9JTl9SRUxFQVNFIDB4NTIKKyNkZWZpbmUgUE41MzNfQ01EX0lOX0pVTVBfRk9SX0RFUCAweDU2CiAKICNkZWZpbmUgUE41MzNfQ01EX1JFU1BPTlNFKGNtZCkgKGNtZCArIDEpCiAKQEAgLTIzMSw2ICsyMzIsMjYgQEAKIAl1OCBndFtdOwogfSBfX3BhY2tlZDsKIAorLyogUE41MzNfQ01EX0lOX0pVTVBfRk9SX0RFUCAqLworc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcCB7CisJdTggYWN0aXZlOworCXU4IGJhdWQ7CisJdTggbmV4dDsKKwl1OCBndFtdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcF9yZXNwb25zZSB7CisJdTggc3RhdHVzOworCXU4IHRnOworCXU4IG5mY2lkM3RbMTBdOworCXU4IGRpZHQ7CisJdTggYnN0OworCXU4IGJydDsKKwl1OCB0bzsKKwl1OCBwcHQ7CisJLyogb3B0aW9uYWwgKi8KKwl1OCBndFtdOworfSBfX3BhY2tlZDsKIAogc3RydWN0IHBuNTMzIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKQEAgLTExMjEsNiArMTE0Miw3IEBACiB7CiAJc3RydWN0IHBuNTMzX2NtZF9hY3RpdmF0ZV9wYXJhbSBwYXJhbTsKIAlzdHJ1Y3QgcG41MzNfY21kX2FjdGl2YXRlX3Jlc3BvbnNlICpyZXNwOworCXUxNiBndF9sZW47CiAJaW50IHJjOwogCiAJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKQEAgLTExNDYsNyArMTE2OCwxMSBAQAogCWlmIChyYyAhPSBQTjUzM19DTURfUkVUX1NVQ0NFU1MpCiAJCXJldHVybiAtRUlPOwogCi0JcmV0dXJuIDA7CisJLyogQVRSX1JFUyBnZW5lcmFsIGJ5dGVzIGFyZSBsb2NhdGVkIGF0IG9mZnNldCAxNiAqLworCWd0X2xlbiA9IFBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfTEVOKGRldi0+aW5fZnJhbWUpIC0gMTY7CisJcmMgPSBuZmNfc2V0X3JlbW90ZV9nZW5lcmFsX2J5dGVzKGRldi0+bmZjX2RldiwgcmVzcC0+Z3QsIGd0X2xlbik7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgcG41MzNfYWN0aXZhdGVfdGFyZ2V0KHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCB1MzIgdGFyZ2V0X2lkeCwKQEAgLTEyMzksNiArMTI2NSwxNDIgQEAKIAlyZXR1cm47CiB9CiAKKworc3RhdGljIGludCBwbjUzM19pbl9kZXBfbGlua191cF9jb21wbGV0ZShzdHJ1Y3QgcG41MzMgKmRldiwgdm9pZCAqYXJnLAorCQkJCQkJdTggKnBhcmFtcywgaW50IHBhcmFtc19sZW4pCit7CisJc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcCAqY21kOworCXN0cnVjdCBwbjUzM19jbWRfanVtcF9kZXBfcmVzcG9uc2UgKnJlc3A7CisJc3RydWN0IG5mY190YXJnZXQgbmZjX3RhcmdldDsKKwl1OCB0YXJnZXRfZ3RfbGVuOworCWludCByYzsKKworCWlmIChwYXJhbXNfbGVuID09IC1FTk9FTlQpIHsKKwkJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBhcmFtc19sZW4gPCAwKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJFcnJvciAlZCB3aGVuIGJyaW5naW5nIERFUCBsaW5rIHVwIiwKKwkJCQkJCQkJcGFyYW1zX2xlbik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXYtPnRndF9hdmFpbGFibGVfcHJvdHMgJiYKKwkgICAgIShkZXYtPnRndF9hdmFpbGFibGVfcHJvdHMgJiAoMSA8PCBORkNfUFJPVE9fTkZDX0RFUCkpKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJIlRoZSB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCBERVAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzcCA9IChzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwX3Jlc3BvbnNlICopIHBhcmFtczsKKwljbWQgPSAoc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcCAqKSBhcmc7CisJcmMgPSByZXNwLT5zdGF0dXMgJiBQTjUzM19DTURfUkVUX01BU0s7CisJaWYgKHJjICE9IFBONTMzX0NNRF9SRVRfU1VDQ0VTUykgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiQnJpbmdpbmcgREVQIGxpbmsgdXAgZmFpbGVkICVkIiwgcmMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldi0+dGd0X2F2YWlsYWJsZV9wcm90cykgeworCQluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIkNyZWF0aW5nIG5ldyB0YXJnZXQiKTsKKworCQluZmNfdGFyZ2V0LnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fTkZDX0RFUF9NQVNLOworCQlyYyA9IG5mY190YXJnZXRzX2ZvdW5kKGRldi0+bmZjX2RldiwgJm5mY190YXJnZXQsIDEpOworCQlpZiAocmMpCisJCQlyZXR1cm4gMDsKKworCQlkZXYtPnRndF9hdmFpbGFibGVfcHJvdHMgPSAwOworCX0KKworCWRldi0+dGd0X2FjdGl2ZV9wcm90ID0gTkZDX1BST1RPX05GQ19ERVA7CisKKwkvKiBBVFJfUkVTIGdlbmVyYWwgYnl0ZXMgYXJlIGxvY2F0ZWQgYXQgb2Zmc2V0IDE3ICovCisJdGFyZ2V0X2d0X2xlbiA9IFBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfTEVOKGRldi0+aW5fZnJhbWUpIC0gMTc7CisJcmMgPSBuZmNfc2V0X3JlbW90ZV9nZW5lcmFsX2J5dGVzKGRldi0+bmZjX2RldiwKKwkJCQkJCXJlc3AtPmd0LCB0YXJnZXRfZ3RfbGVuKTsKKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBuZmNfZGVwX2xpbmtfaXNfdXAoZGV2LT5uZmNfZGV2LAorCQkJCQkJZGV2LT5uZmNfZGV2LT50YXJnZXRzWzBdLmlkeCwKKwkJCQkJCSFjbWQtPmFjdGl2ZSwgTkZDX1JGX0lOSVRJQVRPUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbjUzM19kZXBfbGlua191cChzdHJ1Y3QgbmZjX2RldiAqbmZjX2RldiwgaW50IHRhcmdldF9pZHgsCisJCQkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpCit7CisJc3RydWN0IHBuNTMzICpkZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CisJc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcCAqY21kOworCXU4IGNtZF9sZW4sIGxvY2FsX2d0X2xlbiwgKmxvY2FsX2d0OworCWludCByYzsKKworCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAocmZfbW9kZSA9PSBORkNfUkZfVEFSR0VUKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiVGFyZ2V0IG1vZGUgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisKKwlpZiAoZGV2LT5wb2xsX21vZF9jb3VudCkgeworCQluZmNfZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiQ2Fubm90IGJyaW5nIHRoZSBERVAgbGluayB1cCB3aGlsZSBwb2xsaW5nIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGRldi0+dGd0X2FjdGl2ZV9wcm90KSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGl2ZSB0YXJnZXQiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlsb2NhbF9ndCA9IG5mY19nZXRfbG9jYWxfZ2VuZXJhbF9ieXRlcyhkZXYtPm5mY19kZXYsICZsb2NhbF9ndF9sZW4pOworCWlmIChsb2NhbF9ndF9sZW4gPiBORkNfTUFYX0dUX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWRfbGVuID0gc2l6ZW9mKHN0cnVjdCBwbjUzM19jbWRfanVtcF9kZXApICsgbG9jYWxfZ3RfbGVuOworCWNtZCA9IGt6YWxsb2MoY21kX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBuNTMzX3R4X2ZyYW1lX2luaXQoZGV2LT5vdXRfZnJhbWUsIFBONTMzX0NNRF9JTl9KVU1QX0ZPUl9ERVApOworCisJY21kLT5hY3RpdmUgPSAhY29tbV9tb2RlOworCWNtZC0+YmF1ZCA9IDA7CisJaWYgKGxvY2FsX2d0ICE9IE5VTEwpIHsKKwkJY21kLT5uZXh0ID0gNDsgLyogV2UgaGF2ZSBzb21lIEdpICovCisJCW1lbWNweShjbWQtPmd0LCBsb2NhbF9ndCwgbG9jYWxfZ3RfbGVuKTsKKwl9IGVsc2UgeworCQljbWQtPm5leHQgPSAwOworCX0KKworCW1lbWNweShQTjUzM19GUkFNRV9DTURfUEFSQU1TX1BUUihkZXYtPm91dF9mcmFtZSksIGNtZCwgY21kX2xlbik7CisJZGV2LT5vdXRfZnJhbWUtPmRhdGFsZW4gKz0gY21kX2xlbjsKKworCXBuNTMzX3R4X2ZyYW1lX2ZpbmlzaChkZXYtPm91dF9mcmFtZSk7CisKKwlyYyA9IHBuNTMzX3NlbmRfY21kX2ZyYW1lX2FzeW5jKGRldiwgZGV2LT5vdXRfZnJhbWUsIGRldi0+aW5fZnJhbWUsCisJCQkJZGV2LT5pbl9tYXhsZW4sCXBuNTMzX2luX2RlcF9saW5rX3VwX2NvbXBsZXRlLAorCQkJCWNtZCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCitvdXQ6CisJa2ZyZWUoY21kKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwbjUzM19kZXBfbGlua19kb3duKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2KQoreworCXBuNTMzX2RlYWN0aXZhdGVfdGFyZ2V0KG5mY19kZXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgUE41MzNfQ01EX0RBVEFFWENIX0hFQURfTEVOIChzaXplb2Yoc3RydWN0IHBuNTMzX2ZyYW1lKSArIDMpCiAjZGVmaW5lIFBONTMzX0NNRF9EQVRBRVhDSF9EQVRBX01BWExFTiAyNjIKIApAQCAtMTMzOSw3ICsxNTAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBuNTMzX2RhdGFfZXhjaGFuZ2Uoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsIHUzMiB0YXJnZXRfaWR4LAorc3RhdGljIGludCBwbjUzM19kYXRhX2V4Y2hhbmdlKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCB1MzIgdGFyZ2V0X2lkeCwKIAkJCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQlkYXRhX2V4Y2hhbmdlX2NiX3QgY2IsCiAJCQkJCQl2b2lkICpjYl9jb250ZXh0KQpAQCAtMTM2OCw3ICsxNTMwLDcgQEAKIAkJCVBONTMzX0NNRF9EQVRBRVhDSF9EQVRBX01BWExFTiArCiAJCQlQTjUzM19GUkFNRV9UQUlMX1NJWkU7CiAKLQlza2JfcmVzcCA9IG5mY19hbGxvY19za2Ioc2tiX3Jlc3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlza2JfcmVzcCA9IG5mY19hbGxvY19yZWN2X3NrYihza2JfcmVzcF9sZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiX3Jlc3ApIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwpAQCAtMTQzNCw2ICsxNTk2LDggQEAKIHN0cnVjdCBuZmNfb3BzIHBuNTMzX25mY19vcHMgPSB7CiAJLmRldl91cCA9IE5VTEwsCiAJLmRldl9kb3duID0gTlVMTCwKKwkuZGVwX2xpbmtfdXAgPSBwbjUzM19kZXBfbGlua191cCwKKwkuZGVwX2xpbmtfZG93biA9IHBuNTMzX2RlcF9saW5rX2Rvd24sCiAJLnN0YXJ0X3BvbGwgPSBwbjUzM19zdGFydF9wb2xsLAogCS5zdG9wX3BvbGwgPSBwbjUzM19zdG9wX3BvbGwsCiAJLmFjdGl2YXRlX3RhcmdldCA9IHBuNTMzX2FjdGl2YXRlX3RhcmdldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggM2ZmMjJlMy4uOWI2NTg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTE3LDE0ICsxNywzOSBAQAogICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKKy8qKgorICogc3RydWN0IGFsaWFzX3Byb3AgLSBBbGlhcyBwcm9wZXJ0eSBpbiAnYWxpYXNlcycgbm9kZQorICogQGxpbms6CUxpc3Qgbm9kZSB0byBsaW5rIHRoZSBzdHJ1Y3R1cmUgaW4gYWxpYXNlc19sb29rdXAgbGlzdAorICogQGFsaWFzOglBbGlhcyBwcm9wZXJ0eSBuYW1lCisgKiBAbnA6CQlQb2ludGVyIHRvIGRldmljZV9ub2RlIHRoYXQgdGhlIGFsaWFzIHN0YW5kcyBmb3IKKyAqIEBpZDoJCUluZGV4IHZhbHVlIGZyb20gZW5kIG9mIGFsaWFzIG5hbWUKKyAqIEBzdGVtOglBbGlhcyBzdHJpbmcgd2l0aG91dCB0aGUgaW5kZXgKKyAqCisgKiBUaGUgc3RydWN0dXJlIHJlcHJlc2VudHMgb25lIGFsaWFzIHByb3BlcnR5IG9mICdhbGlhc2VzJyBub2RlIGFzCisgKiBhbiBlbnRyeSBpbiBhbGlhc2VzX2xvb2t1cCBsaXN0LgorICovCitzdHJ1Y3QgYWxpYXNfcHJvcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCWNvbnN0IGNoYXIgKmFsaWFzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJaW50IGlkOworCWNoYXIgc3RlbVswXTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYWxpYXNlc19sb29rdXApOworCiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsbG5vZGVzOwogc3RydWN0IGRldmljZV9ub2RlICpvZl9jaG9zZW47CitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2FsaWFzZXM7CisKK3N0YXRpYyBERUZJTkVfTVVURVgob2ZfYWxpYXNlc19tdXRleCk7CiAKIC8qIHVzZSB3aGVuIHRyYXZlcnNpbmcgdHJlZSB0aHJvdWdoIHRoZSBhbGxuZXh0LCBjaGlsZCwgc2libGluZywKICAqIG9yIHBhcmVudCBtZW1iZXJzIG9mIHN0cnVjdCBkZXZpY2Vfbm9kZS4KQEAgLTYzMiw2ICs2NTcsMzUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KTsKIAogLyoqCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3U2NCAtIEZpbmQgYW5kIHJlYWQgYSA2NCBiaXQgaW50ZWdlciBmcm9tIGEgcHJvcGVydHkKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZToJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgYSA2NC1iaXQgdmFsdWUgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1NjQgdmFsdWUgY2FuIGJlIGRlY29kZWQuCisgKi8KK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCSB1NjQgKm91dF92YWx1ZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CisKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcHJvcC0+dmFsdWUpCisJCXJldHVybiAtRU5PREFUQTsKKwlpZiAoc2l6ZW9mKCpvdXRfdmFsdWUpID4gcHJvcC0+bGVuZ3RoKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwkqb3V0X3ZhbHVlID0gb2ZfcmVhZF9udW1iZXIocHJvcC0+dmFsdWUsIDIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91NjQpOworCisvKioKICAqIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nIC0gRmluZCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIGEgcHJvcGVydHkKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgpAQCAtNjYyLDYgKzcxNiw5MCBAQAogRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcpOwogCiAvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4IC0gRmluZCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIGEgbXVsdGlwbGUKKyAqIHN0cmluZ3MgcHJvcGVydHkuCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBpbmRleDoJaW5kZXggb2YgdGhlIHN0cmluZyBpbiB0aGUgbGlzdCBvZiBzdHJpbmdzCisgKiBAb3V0X3N0cmluZzoJcG9pbnRlciB0byBudWxsIHRlcm1pbmF0ZWQgcmV0dXJuIHN0cmluZywgbW9kaWZpZWQgb25seSBpZgorICoJCXJldHVybiB2YWx1ZSBpcyAwLgorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSB0cmVlIG5vZGUgYW5kIHJldHJpZXZlIGEgbnVsbAorICogdGVybWluYXRlZCBzdHJpbmcgdmFsdWUgKHBvaW50ZXIgdG8gZGF0YSwgbm90IGEgY29weSkgaW4gdGhlIGxpc3Qgb2Ygc3RyaW5ncworICogY29udGFpbmVkIGluIHRoYXQgcHJvcGVydHkuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmCisgKiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRUlMU0VRIGlmIHRoZSBzdHJpbmcgaXMgbm90CisgKiBudWxsLXRlcm1pbmF0ZWQgd2l0aGluIHRoZSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IGRhdGEuCisgKgorICogVGhlIG91dF9zdHJpbmcgcG9pbnRlciBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgc3RyaW5nIGNhbiBiZSBkZWNvZGVkLgorICovCitpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJICBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipvdXRwdXQpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOworCWludCBpID0gMDsKKwlzaXplX3QgbCA9IDAsIHRvdGFsID0gMDsKKwljb25zdCBjaGFyICpwOworCisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXByb3AtPnZhbHVlKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKHN0cm5sZW4ocHJvcC0+dmFsdWUsIHByb3AtPmxlbmd0aCkgPj0gcHJvcC0+bGVuZ3RoKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCXAgPSBwcm9wLT52YWx1ZTsKKworCWZvciAoaSA9IDA7IHRvdGFsIDwgcHJvcC0+bGVuZ3RoOyB0b3RhbCArPSBsLCBwICs9IGwpIHsKKwkJbCA9IHN0cmxlbihwKSArIDE7CisJCWlmICgoKnAgIT0gMCkgJiYgKGkrKyA9PSBpbmRleCkpIHsKKwkJCSpvdXRwdXQgPSBwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9EQVRBOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgpOworCisKKy8qKgorICogb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyAtIEZpbmQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgZnJvbSBhCisgKiBtdWx0aXBsZSBzdHJpbmdzIHByb3BlcnR5LgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIHRyZWUgbm9kZSBhbmQgcmV0cmlldmUgdGhlIG51bWJlciBvZiBudWxsCisgKiB0ZXJtaW5hdGVkIHN0cmluZyBjb250YWluIGluIGl0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBvbgorICogc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5CisgKiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRUlMU0VRIGlmIHRoZSBzdHJpbmcgaXMgbm90IG51bGwtdGVybWluYXRlZAorICogd2l0aGluIHRoZSBsZW5ndGggb2YgdGhlIHByb3BlcnR5IGRhdGEuCisgKi8KK2ludCBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3BuYW1lLCBOVUxMKTsKKwlpbnQgaSA9IDA7CisJc2l6ZV90IGwgPSAwLCB0b3RhbCA9IDA7CisJY29uc3QgY2hhciAqcDsKKworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwcm9wLT52YWx1ZSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCWlmIChzdHJubGVuKHByb3AtPnZhbHVlLCBwcm9wLT5sZW5ndGgpID49IHByb3AtPmxlbmd0aCkKKwkJcmV0dXJuIC1FSUxTRVE7CisKKwlwID0gcHJvcC0+dmFsdWU7CisKKwlmb3IgKGkgPSAwOyB0b3RhbCA8IHByb3AtPmxlbmd0aDsgdG90YWwgKz0gbCwgcCArPSBsKSB7CisJCWwgPSBzdHJsZW4ocCkgKyAxOworCQlpZiAoKnAgIT0gMCkKKwkJCWkrKzsKKwl9CisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKTsKKworLyoqCiAgKiBvZl9wYXJzZV9waGFuZGxlIC0gUmVzb2x2ZSBhIHBoYW5kbGUgcHJvcGVydHkgdG8gYSBkZXZpY2Vfbm9kZSBwb2ludGVyCiAgKiBAbnA6IFBvaW50ZXIgdG8gZGV2aWNlIG5vZGUgaG9sZGluZyBwaGFuZGxlIHByb3BlcnR5CiAgKiBAcGhhbmRsZV9uYW1lOiBOYW1lIG9mIHByb3BlcnR5IGhvbGRpbmcgYSBwaGFuZGxlIHZhbHVlCkBAIC05ODgsMyArMTEyNiw5OSBAQAogfQogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09GX0RZTkFNSUMpICovCiAKK3N0YXRpYyB2b2lkIG9mX2FsaWFzX2FkZChzdHJ1Y3QgYWxpYXNfcHJvcCAqYXAsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgaW50IGlkLCBjb25zdCBjaGFyICpzdGVtLCBpbnQgc3RlbV9sZW4pCit7CisJYXAtPm5wID0gbnA7CisJYXAtPmlkID0gaWQ7CisJc3RybmNweShhcC0+c3RlbSwgc3RlbSwgc3RlbV9sZW4pOworCWFwLT5zdGVtW3N0ZW1fbGVuXSA9IDA7CisJbGlzdF9hZGRfdGFpbCgmYXAtPmxpbmssICZhbGlhc2VzX2xvb2t1cCk7CisJcHJfZGVidWcoImFkZGluZyBEVCBhbGlhczolczogc3RlbT0lcyBpZD0laSBub2RlPSVzXG4iLAorCQkgYXAtPmFsaWFzLCBhcC0+c3RlbSwgYXAtPmlkLCBucCA/IG5wLT5mdWxsX25hbWUgOiBOVUxMKTsKK30KKworLyoqCisgKiBvZl9hbGlhc19zY2FuIC0gU2NhbiBhbGwgcHJvcGVydGllcyBvZiAnYWxpYXNlcycgbm9kZQorICoKKyAqIFRoZSBmdW5jdGlvbiBzY2FucyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgJ2FsaWFzZXMnIG5vZGUgYW5kIHBvcHVsYXRlCisgKiB0aGUgdGhlIGdsb2JhbCBsb29rdXAgdGFibGUgd2l0aCB0aGUgcHJvcGVydGllcy4gIEl0IHJldHVybnMgdGhlCisgKiBudW1iZXIgb2YgYWxpYXNfcHJvcCBmb3VuZCwgb3IgZXJyb3IgY29kZSBpbiBlcnJvciBjYXNlLgorICoKKyAqIEBkdF9hbGxvYzoJQW4gYWxsb2NhdG9yIHRoYXQgcHJvdmlkZXMgYSB2aXJ0dWFsIGFkZHJlc3MgdG8gbWVtb3J5CisgKgkJZm9yIHRoZSByZXN1bHRpbmcgdHJlZQorICovCit2b2lkIG9mX2FsaWFzX3NjYW4odm9pZCAqICgqZHRfYWxsb2MpKHU2NCBzaXplLCB1NjQgYWxpZ24pKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisKKwlvZl9jaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbiIpOworCWlmIChvZl9jaG9zZW4gPT0gTlVMTCkKKwkJb2ZfY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW5AMCIpOworCW9mX2FsaWFzZXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2FsaWFzZXMiKTsKKwlpZiAoIW9mX2FsaWFzZXMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3Byb3BlcnR5KHBwLCBvZl9hbGlhc2VzLT5wcm9wZXJ0aWVzKSB7CisJCWNvbnN0IGNoYXIgKnN0YXJ0ID0gcHAtPm5hbWU7CisJCWNvbnN0IGNoYXIgKmVuZCA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwkJc3RydWN0IGFsaWFzX3Byb3AgKmFwOworCQlpbnQgaWQsIGxlbjsKKworCQkvKiBTa2lwIHRob3NlIHdlIGRvIG5vdCB3YW50IHRvIHByb2NlZWQgKi8KKwkJaWYgKCFzdHJjbXAocHAtPm5hbWUsICJuYW1lIikgfHwKKwkJICAgICFzdHJjbXAocHAtPm5hbWUsICJwaGFuZGxlIikgfHwKKwkJICAgICFzdHJjbXAocHAtPm5hbWUsICJsaW51eCxwaGFuZGxlIikpCisJCQljb250aW51ZTsKKworCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKHBwLT52YWx1ZSk7CisJCWlmICghbnApCisJCQljb250aW51ZTsKKworCQkvKiB3YWxrIHRoZSBhbGlhcyBiYWNrd2FyZHMgdG8gZXh0cmFjdCB0aGUgaWQgYW5kIHdvcmsgb3V0CisJCSAqIHRoZSAnc3RlbScgc3RyaW5nICovCisJCXdoaWxlIChpc2RpZ2l0KCooZW5kLTEpKSAmJiBlbmQgPiBzdGFydCkKKwkJCWVuZC0tOworCQlsZW4gPSBlbmQgLSBzdGFydDsKKworCQlpZiAoa3N0cnRvaW50KGVuZCwgMTAsICZpZCkgPCAwKQorCQkJY29udGludWU7CisKKwkJLyogQWxsb2NhdGUgYW4gYWxpYXNfcHJvcCB3aXRoIGVub3VnaCBzcGFjZSBmb3IgdGhlIHN0ZW0gKi8KKwkJYXAgPSBkdF9hbGxvYyhzaXplb2YoKmFwKSArIGxlbiArIDEsIDQpOworCQlpZiAoIWFwKQorCQkJY29udGludWU7CisJCWFwLT5hbGlhcyA9IHN0YXJ0OworCQlvZl9hbGlhc19hZGQoYXAsIG5wLCBpZCwgc3RhcnQsIGxlbik7CisJfQorfQorCisvKioKKyAqIG9mX2FsaWFzX2dldF9pZCAtIEdldCBhbGlhcyBpZCBmb3IgdGhlIGdpdmVuIGRldmljZV9ub2RlCisgKiBAbnA6CQlQb2ludGVyIHRvIHRoZSBnaXZlbiBkZXZpY2Vfbm9kZQorICogQHN0ZW06CUFsaWFzIHN0ZW0gb2YgdGhlIGdpdmVuIGRldmljZV9ub2RlCisgKgorICogVGhlIGZ1bmN0aW9uIHRyYXZlbHMgdGhlIGxvb2t1cCB0YWJsZSB0byBnZXQgYWxpYXMgaWQgZm9yIHRoZSBnaXZlbgorICogZGV2aWNlX25vZGUgYW5kIGFsaWFzIHN0ZW0uICBJdCByZXR1cm5zIHRoZSBhbGlhcyBpZCBpZiBmaW5kIGl0LgorICovCitpbnQgb2ZfYWxpYXNfZ2V0X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnN0ZW0pCit7CisJc3RydWN0IGFsaWFzX3Byb3AgKmFwcDsKKwlpbnQgaWQgPSAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmb2ZfYWxpYXNlc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcHAsICZhbGlhc2VzX2xvb2t1cCwgbGluaykgeworCQlpZiAoc3RyY21wKGFwcC0+c3RlbSwgc3RlbSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChucCA9PSBhcHAtPm5wKSB7CisJCQlpZCA9IGFwcC0+aWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJm9mX2FsaWFzZXNfbXV0ZXgpOworCisJcmV0dXJuIGlkOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWxpYXNfZ2V0X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvZmR0LmMgYi9kcml2ZXJzL29mL2ZkdC5jCmluZGV4IDY1MjAwYWYuLmZkODVmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZmR0LmMKKysrIGIvZHJpdmVycy9vZi9mZHQuYwpAQCAtNjgxLDkgKzY4MSwxNCBAQAogCWlmIChwICE9IE5VTEwgJiYgbCA+IDApCiAJCXN0cmxjcHkoZGF0YSwgcCwgbWluKChpbnQpbCwgQ09NTUFORF9MSU5FX1NJWkUpKTsKIAorCS8qCisJICogQ09ORklHX0NNRExJTkUgaXMgbWVhbnQgdG8gYmUgYSBkZWZhdWx0IGluIGNhc2Ugbm90aGluZyBlbHNlCisJICogbWFuYWdlZCB0byBzZXQgdGhlIGNvbW1hbmQgbGluZSwgdW5sZXNzIENPTkZJR19DTURMSU5FX0ZPUkNFCisJICogaXMgc2V0IGluIHdoaWNoIGNhc2Ugd2Ugb3ZlcnJpZGUgd2hhdGV2ZXIgd2FzIGZvdW5kIGVhcmxpZXIuCisJICovCiAjaWZkZWYgQ09ORklHX0NNRExJTkUKICNpZm5kZWYgQ09ORklHX0NNRExJTkVfRk9SQ0UKLQlpZiAocCA9PSBOVUxMIHx8IGwgPT0gMCB8fCAobCA9PSAxICYmICgqcCkgPT0gMCkpCisJaWYgKCEoKGNoYXIgKilkYXRhKVswXSkKICNlbmRpZgogCQlzdHJsY3B5KGRhdGEsIENPTkZJR19DTURMSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7CiAjZW5kaWYgLyogQ09ORklHX0NNRExJTkUgKi8KQEAgLTcwNywxMCArNzEyLDggQEAKIAlfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShpbml0aWFsX2Jvb3RfcGFyYW1zLCAmYWxsbm9kZXMsCiAJCQkJZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaCk7CiAKLQkvKiBHZXQgcG9pbnRlciB0byBPRiAiL2Nob3NlbiIgbm9kZSBmb3IgdXNlIGV2ZXJ5d2hlcmUgKi8KLQlvZl9jaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbiIpOwotCWlmIChvZl9jaG9zZW4gPT0gTlVMTCkKLQkJb2ZfY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW5AMCIpOworCS8qIEdldCBwb2ludGVyIHRvICIvY2hvc2VuIiBhbmQgIi9hbGlhc2FzIiBub2RlcyBmb3IgdXNlIGV2ZXJ5d2hlcmUgKi8KKwlvZl9hbGlhc19zY2FuKGVhcmx5X2luaXRfZHRfYWxsb2NfbWVtb3J5X2FyY2gpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX09GX0VBUkxZX0ZMQVRUUkVFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2lycS5jIGIvZHJpdmVycy9vZi9pcnEuYwppbmRleCA5ZjY4OWYxZC4uNmQzZGQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9pcnEuYworKysgYi9kcml2ZXJzL29mL2lycS5jCkBAIC0xOSwxMCArMTksMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIC8qIEZvciBhcmNocyB0aGF0IGRvbid0IHN1cHBvcnQgTk9fSVJRIChzdWNoIGFzIHg4NiksIHByb3ZpZGUgYSBkdW1teSB2YWx1ZSAqLwogI2lmbmRlZiBOT19JUlEKQEAgLTU4LDI3ICs2MCwyNyBAQAogICovCiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2lycV9maW5kX3BhcmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnAsICpjID0gY2hpbGQ7CiAJY29uc3QgX19iZTMyICpwYXJwOwogCi0JaWYgKCFvZl9ub2RlX2dldChjaGlsZCkpCisJaWYgKCFvZl9ub2RlX2dldChjKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlkbyB7Ci0JCXBhcnAgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJpbnRlcnJ1cHQtcGFyZW50IiwgTlVMTCk7CisJCXBhcnAgPSBvZl9nZXRfcHJvcGVydHkoYywgImludGVycnVwdC1wYXJlbnQiLCBOVUxMKTsKIAkJaWYgKHBhcnAgPT0gTlVMTCkKLQkJCXAgPSBvZl9nZXRfcGFyZW50KGNoaWxkKTsKKwkJCXAgPSBvZl9nZXRfcGFyZW50KGMpOwogCQllbHNlIHsKIAkJCWlmIChvZl9pcnFfd29ya2Fyb3VuZHMgJiBPRl9JTUFQX05PX1BIQU5ETEUpCiAJCQkJcCA9IG9mX25vZGVfZ2V0KG9mX2lycV9kZmx0X3BpYyk7CiAJCQllbHNlCiAJCQkJcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGJlMzJfdG9fY3B1cChwYXJwKSk7CiAJCX0KLQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwotCQljaGlsZCA9IHA7CisJCW9mX25vZGVfcHV0KGMpOworCQljID0gcDsKIAl9IHdoaWxlIChwICYmIG9mX2dldF9wcm9wZXJ0eShwLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpID09IE5VTEwpOwogCi0JcmV0dXJuIHA7CisJcmV0dXJuIChwID09IGNoaWxkKSA/IE5VTEwgOiBwOwogfQogCiAvKioKQEAgLTM4NiwzICszODgsMTA4IEBACiAKIAlyZXR1cm4gaTsKIH0KKworc3RydWN0IGludGNfZGVzYyB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqaW50ZXJydXB0X3BhcmVudDsKK307CisKKy8qKgorICogb2ZfaXJxX2luaXQgLSBTY2FuIGFuZCBpbml0IG1hdGNoaW5nIGludGVycnVwdCBjb250cm9sbGVycyBpbiBEVAorICogQG1hdGNoZXM6IDAgdGVybWluYXRlZCBhcnJheSBvZiBub2RlcyB0byBtYXRjaCBhbmQgaW5pdCBmdW5jdGlvbiB0byBjYWxsCisgKgorICogVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgZGV2aWNlIHRyZWUgZm9yIG1hdGNoaW5nIGludGVycnVwdCBjb250cm9sbGVyIG5vZGVzLAorICogYW5kIGNhbGxzIHRoZWlyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBpbiBvcmRlciB3aXRoIHBhcmVudHMgZmlyc3QuCisgKi8KK3ZvaWQgX19pbml0IG9mX2lycV9pbml0KGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGludGNfZGVzYyAqZGVzYywgKnRlbXBfZGVzYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGludGNfZGVzY19saXN0LCBpbnRjX3BhcmVudF9saXN0OworCisJSU5JVF9MSVNUX0hFQUQoJmludGNfZGVzY19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW50Y19wYXJlbnRfbGlzdCk7CisKKwlmb3JfZWFjaF9tYXRjaGluZ19ub2RlKG5wLCBtYXRjaGVzKSB7CisJCWlmICghb2ZfZmluZF9wcm9wZXJ0eShucCwgImludGVycnVwdC1jb250cm9sbGVyIiwgTlVMTCkpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSGVyZSwgd2UgYWxsb2NhdGUgYW5kIHBvcHVsYXRlIGFuIGludGNfZGVzYyB3aXRoIHRoZSBub2RlCisJCSAqIHBvaW50ZXIsIGludGVycnVwdC1wYXJlbnQgZGV2aWNlX25vZGUgZXRjLgorCQkgKi8KKwkJZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChXQVJOX09OKCFkZXNjKSkKKwkJCWdvdG8gZXJyOworCisJCWRlc2MtPmRldiA9IG5wOworCQlkZXNjLT5pbnRlcnJ1cHRfcGFyZW50ID0gb2ZfaXJxX2ZpbmRfcGFyZW50KG5wKTsKKwkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bGlzdCwgJmludGNfZGVzY19saXN0KTsKKwl9CisKKwkvKgorCSAqIFRoZSByb290IGlycSBjb250cm9sbGVyIGlzIHRoZSBvbmUgd2l0aG91dCBhbiBpbnRlcnJ1cHQtcGFyZW50LgorCSAqIFRoYXQgb25lIGdvZXMgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBjb250cm9sbGVycyB0aGF0IHJlZmVyZW5jZSBpdCwKKwkgKiBmb2xsb3dlZCBieSB0aGUgb25lcyB0aGF0IHJlZmVyZW5jZSB0aGUgMm5kIGxldmVsIGNvbnRyb2xsZXJzLCBldGMuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpbnRjX2Rlc2NfbGlzdCkpIHsKKwkJLyoKKwkJICogUHJvY2VzcyBhbGwgY29udHJvbGxlcnMgd2l0aCB0aGUgY3VycmVudCAncGFyZW50Jy4KKwkJICogRmlyc3QgcGFzcyB3aWxsIGJlIGxvb2tpbmcgZm9yIE5VTEwgYXMgdGhlIHBhcmVudC4KKwkJICogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBOVUxMIHBhcmVudCBtZWFucyBhIHJvb3QgY29udHJvbGxlci4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCB0ZW1wX2Rlc2MsICZpbnRjX2Rlc2NfbGlzdCwgbGlzdCkgeworCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJCQlpbnQgcmV0OworCQkJb2ZfaXJxX2luaXRfY2JfdCBpcnFfaW5pdF9jYjsKKworCQkJaWYgKGRlc2MtPmludGVycnVwdF9wYXJlbnQgIT0gcGFyZW50KQorCQkJCWNvbnRpbnVlOworCisJCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7CisJCQltYXRjaCA9IG9mX21hdGNoX25vZGUobWF0Y2hlcywgZGVzYy0+ZGV2KTsKKwkJCWlmIChXQVJOKCFtYXRjaC0+ZGF0YSwKKwkJCSAgICAib2ZfaXJxX2luaXQ6IG5vIGluaXQgZnVuY3Rpb24gZm9yICVzXG4iLAorCQkJICAgIG1hdGNoLT5jb21wYXRpYmxlKSkgeworCQkJCWtmcmVlKGRlc2MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwcl9kZWJ1Zygib2ZfaXJxX2luaXQ6IGluaXQgJXMgQCAlcCwgcGFyZW50ICVwXG4iLAorCQkJCSBtYXRjaC0+Y29tcGF0aWJsZSwKKwkJCQkgZGVzYy0+ZGV2LCBkZXNjLT5pbnRlcnJ1cHRfcGFyZW50KTsKKwkJCWlycV9pbml0X2NiID0gbWF0Y2gtPmRhdGE7CisJCQlyZXQgPSBpcnFfaW5pdF9jYihkZXNjLT5kZXYsIGRlc2MtPmludGVycnVwdF9wYXJlbnQpOworCQkJaWYgKHJldCkgeworCQkJCWtmcmVlKGRlc2MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogVGhpcyBvbmUgaXMgbm93IHNldCB1cDsgYWRkIGl0IHRvIHRoZSBwYXJlbnQgbGlzdCBzbworCQkJICogaXRzIGNoaWxkcmVuIGNhbiBnZXQgcHJvY2Vzc2VkIGluIGEgc3Vic2VxdWVudCBwYXNzLgorCQkJICovCisJCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5saXN0LCAmaW50Y19wYXJlbnRfbGlzdCk7CisJCX0KKworCQkvKiBHZXQgdGhlIG5leHQgcGVuZGluZyBwYXJlbnQgdGhhdCBtaWdodCBoYXZlIGNoaWxkcmVuICovCisJCWRlc2MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbnRjX3BhcmVudF9saXN0LCB0eXBlb2YoKmRlc2MpLCBsaXN0KTsKKwkJaWYgKGxpc3RfZW1wdHkoJmludGNfcGFyZW50X2xpc3QpIHx8ICFkZXNjKSB7CisJCQlwcl9lcnIoIm9mX2lycV9pbml0OiBjaGlsZHJlbiByZW1haW4sIGJ1dCBubyBwYXJlbnRzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWxpc3RfZGVsKCZkZXNjLT5saXN0KTsKKwkJcGFyZW50ID0gZGVzYy0+ZGV2OworCQlrZnJlZShkZXNjKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgdGVtcF9kZXNjLCAmaW50Y19wYXJlbnRfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZGVzYy0+bGlzdCk7CisJCWtmcmVlKGRlc2MpOworCX0KK2VycjoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgdGVtcF9kZXNjLCAmaW50Y19kZXNjX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmRlc2MtPmxpc3QpOworCQlrZnJlZShkZXNjKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX21kaW8uYyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCmluZGV4IGQzNWUzMDAuLjk4MGMwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCkBAIC04Myw3ICs4Myw2IEBACiAJCQkJYWRkcik7CiAJCQljb250aW51ZTsKIAkJfQotCQlwaHlfc2Nhbl9maXh1cHMocGh5KTsKIAogCQkvKiBBc3NvY2lhdGUgdGhlIE9GIG5vZGUgd2l0aCB0aGUgZGV2aWNlIHN0cnVjdHVyZSBzbyBpdAogCQkgKiBjYW4gYmUgbG9va2VkIHVwIGxhdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX25ldC5jIGIvZHJpdmVycy9vZi9vZl9uZXQuYwppbmRleCBiYjE4NDcxLi5mZmFiMDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX25ldC5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qKgogICogSXQgbWFwcyAnZW51bSBwaHlfaW50ZXJmYWNlX3QnIGZvdW5kIGluIGluY2x1ZGUvbGludXgvcGh5LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfcGNpLmMgYi9kcml2ZXJzL29mL29mX3BjaS5jCmluZGV4IDM3MDFiNjIuLjEzZTM3ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfcGNpLmMKKysrIGIvZHJpdmVycy9vZi9vZl9wY2kuYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX3BjaV9pcnEuYyBiL2RyaXZlcnMvb2Yvb2ZfcGNpX2lycS5jCmluZGV4IGFjMWVjNTQuLjkzMTI1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfcGNpX2lycS5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfcGNpX2lycS5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9zcGkuYyBiL2RyaXZlcnMvb2Yvb2Zfc3BpLmMKaW5kZXggMWRiY2U1OC4uNmRiYzA3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9vZl9zcGkuYworKysgYi9kcml2ZXJzL29mL29mX3NwaS5jCkBAIC02LDYgKzYsNyBAQAogICogdHJlZS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BkdC5jIGIvZHJpdmVycy9vZi9wZHQuYwppbmRleCA0ZDg3YjVkLi5iYzViMzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL3BkdC5jCisrKyBiL2RyaXZlcnMvb2YvcGR0LmMKQEAgLTIyOSw2ICsyMjksMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCAqa2VybmVsX3RyZWVfYWxsb2ModTY0IHNpemUsIHU2NCBhbGlnbikKK3sKKwlyZXR1cm4gcHJvbV9lYXJseV9hbGxvYyhzaXplKTsKK30KKwogdm9pZCBfX2luaXQgb2ZfcGR0X2J1aWxkX2RldmljZXRyZWUocGhhbmRsZSByb290X25vZGUsIHN0cnVjdCBvZl9wZHRfb3BzICpvcHMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICoqbmV4dHA7CkBAIC0yNDUsNCArMjUwLDcgQEAKIAluZXh0cCA9ICZhbGxub2Rlcy0+YWxsbmV4dDsKIAlhbGxub2Rlcy0+Y2hpbGQgPSBvZl9wZHRfYnVpbGRfdHJlZShhbGxub2RlcywKIAkJCW9mX3BkdF9wcm9tX29wcy0+Z2V0Y2hpbGQoYWxsbm9kZXMtPnBoYW5kbGUpLCAmbmV4dHApOworCisJLyogR2V0IHBvaW50ZXIgdG8gIi9jaG9zZW4iIGFuZCAiL2FsaWFzYXMiIG5vZGVzIGZvciB1c2UgZXZlcnl3aGVyZSAqLworCW9mX2FsaWFzX3NjYW4oa2VybmVsX3RyZWVfYWxsb2MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IGVkNWE2ZDMuLmNiZDVkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTMxMCwxOCArMzEwLDIxIEBACiAJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IHJlc291cmNlIHJlczsKLQlpZiAobG9va3VwKSB7Ci0JCWZvcig7IGxvb2t1cC0+bmFtZSAhPSBOVUxMOyBsb29rdXArKykgewotCQkJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgbG9va3VwLT5jb21wYXRpYmxlKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChyZXMuc3RhcnQgIT0gbG9va3VwLT5waHlzX2FkZHIpCi0JCQkJY29udGludWU7Ci0JCQlwcl9kZWJ1ZygiJXM6IGRldm5hbWU9JXNcbiIsIG5wLT5mdWxsX25hbWUsIGxvb2t1cC0+bmFtZSk7Ci0JCQlyZXR1cm4gbG9va3VwOwotCQl9CisKKwlpZiAoIWxvb2t1cCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IoOyBsb29rdXAtPm5hbWUgIT0gTlVMTDsgbG9va3VwKyspIHsKKwkJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgbG9va3VwLT5jb21wYXRpYmxlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpCisJCQljb250aW51ZTsKKwkJaWYgKHJlcy5zdGFydCAhPSBsb29rdXAtPnBoeXNfYWRkcikKKwkJCWNvbnRpbnVlOworCQlwcl9kZWJ1ZygiJXM6IGRldm5hbWU9JXNcbiIsIG5wLT5mdWxsX25hbWUsIGxvb2t1cC0+bmFtZSk7CisJCXJldHVybiBsb29rdXA7CiAJfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTMyOSw4ICszMzIsOSBAQAogICogb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgZGV2aWNlIGZvciBhIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4KICAqIEBidXM6IGRldmljZSBub2RlIG9mIHRoZSBidXMgdG8gaW5zdGFudGlhdGUKICAqIEBtYXRjaGVzOiBtYXRjaCB0YWJsZSBmb3IgYnVzIG5vZGVzCi0gKiBkaXNhbGxvdyByZWN1cnNpdmUgY3JlYXRpb24gb2YgY2hpbGQgYnVzZXMKKyAqIEBsb29rdXA6IGF1eGRhdGEgdGFibGUgZm9yIG1hdGNoaW5nIGlkIGFuZCBwbGF0Zm9ybV9kYXRhIHdpdGggZGV2aWNlIG5vZGVzCiAgKiBAcGFyZW50OiBwYXJlbnQgZm9yIG5ldyBkZXZpY2UsIG9yIE5VTEwgZm9yIHRvcCBsZXZlbC4KKyAqIEBzdHJpY3Q6IHJlcXVpcmUgY29tcGF0aWJsZSBwcm9wZXJ0eQogICoKICAqIENyZWF0ZXMgYSBwbGF0Zm9ybV9kZXZpY2UgZm9yIHRoZSBwcm92aWRlZCBkZXZpY2Vfbm9kZSwgYW5kIG9wdGlvbmFsbHkKICAqIHJlY3Vyc2l2ZWx5IGNyZWF0ZSBkZXZpY2VzIGZvciBhbGwgdGhlIGNoaWxkIG5vZGVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYyBiL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKaW5kZXggNzVhODBlNDZiLi44YjQ5MGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUtaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CQkvKiBmb3IgTDFfQ0FDSEVfQllURVMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL3NiYV9pb21tdS5jIGIvZHJpdmVycy9wYXJpc2Mvc2JhX2lvbW11LmMKaW5kZXggYTZmNzYyMS4uODY0NGQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2Mvc2JhX2lvbW11LmMKKysrIGIvZHJpdmVycy9wYXJpc2Mvc2JhX2lvbW11LmMKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3JvcGVzLmg+CiAjaW5jbHVkZSA8YXNtL21ja2lubGV5Lmg+CS8qIGZvciBwcm9jX21ja2lubGV5X3Jvb3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IDBmYTQ2NmEuLmI2Zjk3NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtNTEsMTcgKzUxLDYgQEAKICAgICAgICAgICBUaGUgUENJIGRldmljZSBmcm9udGVuZCBkcml2ZXIgYWxsb3dzIHRoZSBrZXJuZWwgdG8gaW1wb3J0IGFyYml0cmFyeQogICAgICAgICAgIFBDSSBkZXZpY2VzIGZyb20gYSBQQ0kgYmFja2VuZCB0byBzdXBwb3J0IFBDSSBkcml2ZXIgZG9tYWlucy4KIAotY29uZmlnIFhFTl9QQ0lERVZfRkVfREVCVUcKLSAgICAgICAgYm9vbCAiWGVuIFBDSSBGcm9udGVuZCBkZWJ1Z2dpbmciCi0gICAgICAgIGRlcGVuZHMgb24gWEVOX1BDSURFVl9GUk9OVEVORCAmJiBQQ0lfREVCVUcKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBYZW4gUENJIGZyb250ZW5kIHRvIHByb2R1Y2UgYSBidW5jaCBvZiBkZWJ1ZwotCSAgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cuICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIGhhdmluZyBhCi0JICBwcm9ibGVtIHdpdGggWGVuIFBDSSBmcm9udGVuZCBzdXBwb3J0IGFuZCB3YW50IHRvIHNlZSBtb3JlIG9mIHdoYXQgaXMKLQkgIGdvaW5nIG9uLgotCi0JICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KLQogY29uZmlnIEhUX0lSUQogCWJvb2wgIkludGVycnVwdHMgb24gaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcyIKIAlkZWZhdWx0IHkKQEAgLTcxLDkgKzYwLDEzIEBACiAKIAkgICBJZiB1bnN1cmUgc2F5IFkuCiAKK2NvbmZpZyBQQ0lfQVRTCisJYm9vbAorCiBjb25maWcgUENJX0lPVgogCWJvb2wgIlBDSSBJT1Ygc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBQQ0lfQVRTCiAJaGVscAogCSAgSS9PIFZpcnR1YWxpemF0aW9uIGlzIGEgUENJIGZlYXR1cmUgc3VwcG9ydGVkIGJ5IHNvbWUgZGV2aWNlcwogCSAgd2hpY2ggYWxsb3dzIHRoZW0gdG8gY3JlYXRlIHZpcnR1YWwgZGV2aWNlcyB3aGljaCBzaGFyZSB0aGVpcgpAQCAtODEsNiArNzQsMjggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFBDSV9QUkkKKwlib29sICJQQ0kgUFJJIHN1cHBvcnQiCisJc2VsZWN0IFBDSV9BVFMKKwloZWxwCisJICBQUkkgaXMgdGhlIFBDSSBQYWdlIFJlcXVlc3QgSW50ZXJmYWNlLiBJdCBhbGxvd3MgUENJIGRldmljZXMgdGhhdCBhcmUKKwkgIGJlaGluZCBhbiBJT01NVSB0byByZWNvdmVyIGZyb20gcGFnZSBmYXVsdHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ0lfUEFTSUQKKwlib29sICJQQ0kgUEFTSUQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBQQ0lfQVRTCisJaGVscAorCSAgUHJvY2VzcyBBZGRyZXNzIFNwYWNlIElkZW50aWZpZXJzIChQQVNJRHMpIGNhbiBiZSB1c2VkIGJ5IFBDSSBkZXZpY2VzCisJICB0byBhY2Nlc3MgbW9yZSB0aGFuIG9uZSBJTyBhZGRyZXNzIHNwYWNlIGF0IHRoZSBzYW1lIHRpbWUuIFRvIG1ha2UKKwkgIHVzZSBvZiB0aGlzIGZlYXR1cmUgYW4gSU9NTVUgaXMgcmVxdWlyZWQgd2hpY2ggYWxzbyBzdXBwb3J0cyBQQVNJRHMuCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgc3VjaCBhbiBJT01NVSBhbmQgd2FudCB0byBjb21waWxlIHRoZQorCSAgZHJpdmVyIGZvciBpdCBpbnRvIHlvdXIga2VybmVsLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgUENJX0lPQVBJQwogCWJvb2wKIAlkZXBlbmRzIG9uIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCA2ZmFkYWUzLi4wODNhNDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMjksNiArMjksNyBAQAogIyBCdWlsZCB0aGUgSHlwZXJ0cmFuc3BvcnQgaW50ZXJydXB0IHN1cHBvcnQKIG9iai0kKENPTkZJR19IVF9JUlEpICs9IGh0aXJxLm8KIAorb2JqLSQoQ09ORklHX1BDSV9BVFMpICs9IGF0cy5vCiBvYmotJChDT05GSUdfUENJX0lPVikgKz0gaW92Lm8KIAogIwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYXRzLmMgYi9kcml2ZXJzL3BjaS9hdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM1NmZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvYXRzLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBkcml2ZXJzL3BjaS9hdHMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbiwgWXUgWmhhbyA8eXUuemhhb0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywKKyAqCisgKiBQQ0kgRXhwcmVzcyBJL08gVmlydHVhbGl6YXRpb24gKElPVikgc3VwcG9ydC4KKyAqICAgQWRkcmVzcyBUcmFuc2xhdGlvbiBTZXJ2aWNlIDEuMAorICogICBQYWdlIFJlcXVlc3QgSW50ZXJmYWNlIGFkZGVkIGJ5IEpvZXJnIFJvZWRlbCA8am9lcmcucm9lZGVsQGFtZC5jb20+CisgKiAgIFBBU0lEIHN1cHBvcnQgYWRkZWQgYnkgSm9lcmcgUm9lZGVsIDxqb2VyZy5yb2VkZWxAYW1kLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAicGNpLmgiCisKK3N0YXRpYyBpbnQgYXRzX2FsbG9jX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHMpCit7CisJaW50IHBvczsKKwl1MTYgY2FwOworCXN0cnVjdCBwY2lfYXRzICphdHM7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0FUUyk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRU5PREVWOworCisJYXRzID0ga3phbGxvYyhzaXplb2YoKmF0cyksIEdGUF9LRVJORUwpOworCWlmICghYXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF0cy0+cG9zID0gcG9zOworCWF0cy0+c3R1ID0gcHM7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfQVRTX0NBUCwgJmNhcCk7CisJYXRzLT5xZGVwID0gUENJX0FUU19DQVBfUURFUChjYXApID8gUENJX0FUU19DQVBfUURFUChjYXApIDoKKwkJCQkJICAgIFBDSV9BVFNfTUFYX1FERVA7CisJZGV2LT5hdHMgPSBhdHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRzX2ZyZWVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJa2ZyZWUoZGV2LT5hdHMpOworCWRldi0+YXRzID0gTlVMTDsKK30KKworLyoqCisgKiBwY2lfZW5hYmxlX2F0cyAtIGVuYWJsZSB0aGUgQVRTIGNhcGFiaWxpdHkKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAcHM6IHRoZSBJT01NVSBwYWdlIHNoaWZ0CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBwY2lfZW5hYmxlX2F0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHMpCit7CisJaW50IHJjOworCXUxNiBjdHJsOworCisJQlVHX09OKGRldi0+YXRzICYmIGRldi0+YXRzLT5pc19lbmFibGVkKTsKKworCWlmIChwcyA8IFBDSV9BVFNfTUlOX1NUVSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2LT5pc19waHlzZm4gfHwgZGV2LT5pc192aXJ0Zm4pIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPmlzX3BoeXNmbiA/IGRldiA6IGRldi0+cGh5c2ZuOworCisJCW11dGV4X2xvY2soJnBkZXYtPnNyaW92LT5sb2NrKTsKKwkJaWYgKHBkZXYtPmF0cykKKwkJCXJjID0gcGRldi0+YXRzLT5zdHUgPT0gcHMgPyAwIDogLUVJTlZBTDsKKwkJZWxzZQorCQkJcmMgPSBhdHNfYWxsb2Nfb25lKHBkZXYsIHBzKTsKKworCQlpZiAoIXJjKQorCQkJcGRldi0+YXRzLT5yZWZfY250Kys7CisJCW11dGV4X3VubG9jaygmcGRldi0+c3Jpb3YtPmxvY2spOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKCFkZXYtPmlzX3BoeXNmbikgeworCQlyYyA9IGF0c19hbGxvY19vbmUoZGV2LCBwcyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwljdHJsID0gUENJX0FUU19DVFJMX0VOQUJMRTsKKwlpZiAoIWRldi0+aXNfdmlydGZuKQorCQljdHJsIHw9IFBDSV9BVFNfQ1RSTF9TVFUocHMgLSBQQ0lfQVRTX01JTl9TVFUpOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsIGN0cmwpOworCisJZGV2LT5hdHMtPmlzX2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfZW5hYmxlX2F0cyk7CisKKy8qKgorICogcGNpX2Rpc2FibGVfYXRzIC0gZGlzYWJsZSB0aGUgQVRTIGNhcGFiaWxpdHkKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKi8KK3ZvaWQgcGNpX2Rpc2FibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IGN0cmw7CisKKwlCVUdfT04oIWRldi0+YXRzIHx8ICFkZXYtPmF0cy0+aXNfZW5hYmxlZCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsICZjdHJsKTsKKwljdHJsICY9IH5QQ0lfQVRTX0NUUkxfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGRldi0+YXRzLT5wb3MgKyBQQ0lfQVRTX0NUUkwsIGN0cmwpOworCisJZGV2LT5hdHMtPmlzX2VuYWJsZWQgPSAwOworCisJaWYgKGRldi0+aXNfcGh5c2ZuIHx8IGRldi0+aXNfdmlydGZuKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5pc19waHlzZm4gPyBkZXYgOiBkZXYtPnBoeXNmbjsKKworCQltdXRleF9sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7CisJCXBkZXYtPmF0cy0+cmVmX2NudC0tOworCQlpZiAoIXBkZXYtPmF0cy0+cmVmX2NudCkKKwkJCWF0c19mcmVlX29uZShwZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7CisJfQorCisJaWYgKCFkZXYtPmlzX3BoeXNmbikKKwkJYXRzX2ZyZWVfb25lKGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfZGlzYWJsZV9hdHMpOworCisvKioKKyAqIHBjaV9hdHNfcXVldWVfZGVwdGggLSBxdWVyeSB0aGUgQVRTIEludmFsaWRhdGUgUXVldWUgRGVwdGgKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKgorICogUmV0dXJucyB0aGUgcXVldWUgZGVwdGggb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgb24gZmFpbHVyZS4KKyAqCisgKiBUaGUgQVRTIHNwZWMgdXNlcyAwIGluIHRoZSBJbnZhbGlkYXRlIFF1ZXVlIERlcHRoIGZpZWxkIHRvCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSBmdW5jdGlvbiBjYW4gYWNjZXB0IDMyIEludmFsaWRhdGUgUmVxdWVzdC4KKyAqIEJ1dCBoZXJlIHdlIHVzZSB0aGUgYHJlYWwnIHZhbHVlcyAoaS5lLiAxfjMyKSBmb3IgdGhlIFF1ZXVlCisgKiBEZXB0aDsgYW5kIDAgaW5kaWNhdGVzIHRoZSBmdW5jdGlvbiBzaGFyZXMgdGhlIFF1ZXVlIHdpdGgKKyAqIG90aGVyIGZ1bmN0aW9ucyAoZG9lc24ndCBleGNsdXNpdmVseSBvd24gYSBRdWV1ZSkuCisgKi8KK2ludCBwY2lfYXRzX3F1ZXVlX2RlcHRoKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvczsKKwl1MTYgY2FwOworCisJaWYgKGRldi0+aXNfdmlydGZuKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXYtPmF0cykKKwkJcmV0dXJuIGRldi0+YXRzLT5xZGVwOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BVFMpOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FUU19DQVAsICZjYXApOworCisJcmV0dXJuIFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA/IFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA6CisJCQkJICAgICAgIFBDSV9BVFNfTUFYX1FERVA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfYXRzX3F1ZXVlX2RlcHRoKTsKKworI2lmZGVmIENPTkZJR19QQ0lfUFJJCisvKioKKyAqIHBjaV9lbmFibGVfcHJpIC0gRW5hYmxlIFBSSSBjYXBhYmlsaXR5CisgKiBAIHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCisgKi8KK2ludCBwY2lfZW5hYmxlX3ByaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHJlcXMpCit7CisJdTE2IGNvbnRyb2wsIHN0YXR1czsKKwl1MzIgbWF4X3JlcXVlc3RzOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUFJJX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgJmNvbnRyb2wpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfU1RBVFVTX09GRiwgICZzdGF0dXMpOworCWlmICgoY29udHJvbCAmIFBDSV9QUklfRU5BQkxFKSB8fCAhKHN0YXR1cyAmIFBDSV9QUklfU1RBVFVTX1NUT1BQRUQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfTUFYX1JFUV9PRkYsICZtYXhfcmVxdWVzdHMpOworCXJlcXMgPSBtaW4obWF4X3JlcXVlc3RzLCByZXFzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQUxMT0NfUkVRX09GRiwgcmVxcyk7CisKKwljb250cm9sIHw9IFBDSV9QUklfRU5BQkxFOworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCBjb250cm9sKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2VuYWJsZV9wcmkpOworCisvKioKKyAqIHBjaV9kaXNhYmxlX3ByaSAtIERpc2FibGUgUFJJIGNhcGFiaWxpdHkKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIE9ubHkgY2xlYXJzIHRoZSBlbmFibGVkLWJpdCwgcmVnYXJkbGVzcyBvZiBpdHMgZm9ybWVyIHZhbHVlCisgKi8KK3ZvaWQgcGNpX2Rpc2FibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjb250cm9sOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUFJJX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQ09OVFJPTF9PRkYsICZjb250cm9sKTsKKwljb250cm9sICY9IH5QQ0lfUFJJX0VOQUJMRTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgY29udHJvbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfZGlzYWJsZV9wcmkpOworCisvKioKKyAqIHBjaV9wcmlfZW5hYmxlZCAtIENoZWNrcyBpZiBQUkkgY2FwYWJpbGl0eSBpcyBlbmFibGVkCisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgUFJJIGlzIGVuYWJsZWQgb24gdGhlIGRldmljZSwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcGNpX3ByaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBjb250cm9sOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUFJJX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiBmYWxzZTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfQ09OVFJPTF9PRkYsICZjb250cm9sKTsKKworCXJldHVybiAoY29udHJvbCAmIFBDSV9QUklfRU5BQkxFKSA/IHRydWUgOiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9wcmlfZW5hYmxlZCk7CisKKy8qKgorICogcGNpX3Jlc2V0X3ByaSAtIFJlc2V0cyBkZXZpY2UncyBQUkkgc3RhdGUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoZSBQUkkgY2FwYWJpbGl0eSBtdXN0IGJlIGRpc2FibGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqLworaW50IHBjaV9yZXNldF9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTE2IGNvbnRyb2w7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QUklfQ0FQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCAmY29udHJvbCk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfUFJJX0VOQUJMRSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNvbnRyb2wgfD0gUENJX1BSSV9SRVNFVDsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUFJJX0NPTlRST0xfT0ZGLCBjb250cm9sKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3Jlc2V0X3ByaSk7CisKKy8qKgorICogcGNpX3ByaV9zdG9wcGVkIC0gQ2hlY2tzIHdoZXRoZXIgdGhlIFBSSSBjYXBhYmlsaXR5IGlzIHN0b3BwZWQKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgUFJJIGNhcGFiaWxpdHkgb24gdGhlIGRldmljZSBpcyBkaXNhYmxlZCBhbmQgdGhlCisgKiBkZXZpY2UgaGFzIG5vIG91dHN0YW5kaW5nIFBSSSByZXF1ZXN0cywgZmFsc2Ugb3RoZXJ3aXNlLiBUaGUgZGV2aWNlCisgKiBpbmRpY2F0ZXMgdGhpcyB2aWEgdGhlIFNUT1BQRUQgYml0IGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlCisgKiBjYXBhYmlsaXR5LgorICogVGhlIGRldmljZSBpbnRlcm5hbCBzdGF0ZSBjYW4gYmUgY2xlYXJlZCBieSByZXNldHRpbmcgdGhlIFBSSSBzdGF0ZQorICogd2l0aCBwY2lfcmVzZXRfcHJpKCkuIFRoaXMgY2FuIGZvcmNlIHRoZSBjYXBhYmlsaXR5IGludG8gdGhlIFNUT1BQRUQKKyAqIHN0YXRlLgorICovCitib29sIHBjaV9wcmlfc3RvcHBlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgY29udHJvbCwgc3RhdHVzOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUFJJX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiB0cnVlOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgJmNvbnRyb2wpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfU1RBVFVTX09GRiwgICZzdGF0dXMpOworCisJaWYgKGNvbnRyb2wgJiBQQ0lfUFJJX0VOQUJMRSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIChzdGF0dXMgJiBQQ0lfUFJJX1NUQVRVU19TVE9QUEVEKSA/IHRydWUgOiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9wcmlfc3RvcHBlZCk7CisKKy8qKgorICogcGNpX3ByaV9zdGF0dXMgLSBSZXF1ZXN0IFBSSSBzdGF0dXMgb2YgYSBkZXZpY2UKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwgc3RhdHVzIG9uIHN1Y2Nlc3MuIFRoZSBzdGF0dXMgY2FuCisgKiBiZSBjaGVja2VkIGFnYWluc3Qgc3RhdHVzLWJpdHMuIFN1cHBvcnRlZCBiaXRzIGFyZSBjdXJyZW50bHk6CisgKiBQQ0lfUFJJX1NUQVRVU19SRjogICAgICBSZXNwb25zZSBmYWlsdXJlCisgKiBQQ0lfUFJJX1NUQVRVU19VUFJHSTogICBVbmV4cGVjdGVkIFBhZ2UgUmVxdWVzdCBHcm91cCBJbmRleAorICogUENJX1BSSV9TVEFUVVNfU1RPUFBFRDogUFJJIGhhcyBzdG9wcGVkCisgKi8KK2ludCBwY2lfcHJpX3N0YXR1cyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgc3RhdHVzLCBjb250cm9sOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfUFJJX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BSSV9DT05UUk9MX09GRiwgJmNvbnRyb2wpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QUklfU1RBVFVTX09GRiwgICZzdGF0dXMpOworCisJLyogU3RvcHBlZCBiaXQgaXMgdW5kZWZpbmVkIHdoZW4gZW5hYmxlID09IDEsIHNvIGNsZWFyIGl0ICovCisJaWYgKGNvbnRyb2wgJiBQQ0lfUFJJX0VOQUJMRSkKKwkJc3RhdHVzICY9IH5QQ0lfUFJJX1NUQVRVU19TVE9QUEVEOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9wcmlfc3RhdHVzKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJX1BSSSAqLworCisjaWZkZWYgQ09ORklHX1BDSV9QQVNJRAorLyoqCisgKiBwY2lfZW5hYmxlX3Bhc2lkIC0gRW5hYmxlIHRoZSBQQVNJRCBjYXBhYmlsaXR5CisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBmZWF0dXJlczogRmVhdHVyZXMgdG8gZW5hYmxlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiBUaGlzIGZ1bmN0aW9uIGNoZWNrcworICogd2hldGhlciB0aGUgZmVhdHVyZXMgYXJlIGFjdHVhbGx5IHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGFuZCByZXR1cm5zCisgKiBhbiBlcnJvciBpZiBub3QuCisgKi8KK2ludCBwY2lfZW5hYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZmVhdHVyZXMpCit7CisJdTE2IGNvbnRyb2wsIHN1cHBvcnRlZDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX1BBU0lEX0NBUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BBU0lEX0NPTlRST0xfT0ZGLCAmY29udHJvbCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BBU0lEX0NBUF9PRkYsICAgICAmc3VwcG9ydGVkKTsKKworCWlmICghKHN1cHBvcnRlZCAmIFBDSV9QQVNJRF9FTkFCTEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN1cHBvcnRlZCAmPSBQQ0lfUEFTSURfRVhFQyB8IFBDSV9QQVNJRF9QUklWOworCisJLyogVXNlciB3YW50cyB0byBlbmFibGUgYW55dGhpbmcgdW5zdXBwb3J0ZWQ/ICovCisJaWYgKChzdXBwb3J0ZWQgJiBmZWF0dXJlcykgIT0gZmVhdHVyZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udHJvbCA9IFBDSV9QQVNJRF9FTkFCTEUgfCBmZWF0dXJlczsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfUEFTSURfQ09OVFJPTF9PRkYsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfZW5hYmxlX3Bhc2lkKTsKKworLyoqCisgKiBwY2lfZGlzYWJsZV9wYXNpZCAtIERpc2FibGUgdGhlIFBBU0lEIGNhcGFiaWxpdHkKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqLwordm9pZCBwY2lfZGlzYWJsZV9wYXNpZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MTYgY29udHJvbCA9IDA7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QQVNJRF9DQVApOworCWlmICghcG9zKQorCQlyZXR1cm47CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BBU0lEX0NPTlRST0xfT0ZGLCBjb250cm9sKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9kaXNhYmxlX3Bhc2lkKTsKKworLyoqCisgKiBwY2lfcGFzaWRfZmVhdHVyZXMgLSBDaGVjayB3aGljaCBQQVNJRCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkCisgKiBAcGRldjogUENJIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgd2hlbiBubyBQQVNJIGNhcGFiaWxpdHkgaXMgcHJlc2VudC4KKyAqIE90aGVyd2lzZSBpcyByZXR1cm5zIGEgYml0bWFzayB3aXRoIHN1cHBvcnRlZCBmZWF0dXJlcy4gQ3VycmVudAorICogZmVhdHVyZXMgcmVwb3J0ZWQgYXJlOgorICogUENJX1BBU0lEX0VOQUJMRSAtIFBBU0lEIGNhcGFiaWxpdHkgY2FuIGJlIGVuYWJsZWQKKyAqIFBDSV9QQVNJRF9FWEVDIC0gRXhlY3V0ZSBwZXJtaXNzaW9uIHN1cHBvcnRlZAorICogUENJX1BBU0lEX1BSSVYgLSBQcml2aWxlZGdlZCBtb2RlIHN1cHBvcnRlZAorICovCitpbnQgcGNpX3Bhc2lkX2ZlYXR1cmVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBzdXBwb3J0ZWQ7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QQVNJRF9DQVApOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QQVNJRF9DQVBfT0ZGLCAmc3VwcG9ydGVkKTsKKworCXN1cHBvcnRlZCAmPSBQQ0lfUEFTSURfRU5BQkxFIHwgUENJX1BBU0lEX0VYRUMgfCBQQ0lfUEFTSURfUFJJVjsKKworCXJldHVybiBzdXBwb3J0ZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcGFzaWRfZmVhdHVyZXMpOworCisjZGVmaW5lIFBBU0lEX05VTUJFUl9TSElGVAk4CisjZGVmaW5lIFBBU0lEX05VTUJFUl9NQVNLCSgweDFmIDw8IFBBU0lEX05VTUJFUl9TSElGVCkKKy8qKgorICogcGNpX21heF9wYXNpZCAtIEdldCBtYXhpbXVtIG51bWJlciBvZiBQQVNJRHMgc3VwcG9ydGVkIGJ5IGRldmljZQorICogQHBkZXY6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSB3aGVuIFBBU0lEIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQuCisgKiBPdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgbnVtZXIgb2Ygc3VwcG9ydGVkIFBBU0lEcy4KKyAqLworaW50IHBjaV9tYXhfcGFzaWRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXUxNiBzdXBwb3J0ZWQ7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9QQVNJRF9DQVApOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QQVNJRF9DQVBfT0ZGLCAmc3VwcG9ydGVkKTsKKworCXN1cHBvcnRlZCA9IChzdXBwb3J0ZWQgJiBQQVNJRF9OVU1CRVJfTUFTSykgPj4gUEFTSURfTlVNQkVSX1NISUZUOworCisJcmV0dXJuICgxIDw8IHN1cHBvcnRlZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfbWF4X3Bhc2lkcyk7CisjZW5kaWYgLyogQ09ORklHX1BDSV9QQVNJRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy1wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWctcGNpLmMKaW5kZXggNGQ0YTY0NDcuLmQzNTA5Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWctcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy1wY2kuYwpAQCAtMSw2ICsxLDcgQEAKIC8qIENvcmUgUENJIGZ1bmN0aW9uYWxpdHkgdXNlZCBvbmx5IGJ5IFBDSSBob3RwbHVnICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJwY2kuaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCAyMjAyODU3Li41OTYxNzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIAogI2luY2x1ZGUgIi4uL3BjaS5oIgogI2luY2x1ZGUgImFjcGlwaHAuaCIKQEAgLTExNDksMTUgKzExNTAsMzUgQEAKIAlyZXR1cm4gQUVfT0sgOwogfQogCi0vKioKLSAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSAtIGhhbmRsZSBBQ1BJIGV2ZW50IG9uIGJyaWRnZXMKLSAqIEBoYW5kbGU6IE5vdGlmeSgpJ2VkIGFjcGlfaGFuZGxlCi0gKiBAdHlwZTogTm90aWZ5IGNvZGUKLSAqIEBjb250ZXh0OiBwb2ludGVyIHRvIGFjcGlwaHBfYnJpZGdlIHN0cnVjdHVyZQotICoKLSAqIEhhbmRsZXMgQUNQSSBldmVudCBub3RpZmljYXRpb24gb24ge2hvc3QscDJwfSBicmlkZ2VzLgotICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfaG90cGx1Z19ldmVudF9icmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqY29udGV4dCkKK3N0cnVjdCBhY3BpcGhwX2hwX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1MzIgdHlwZTsKKwl2b2lkICpjb250ZXh0OworfTsKKworc3RhdGljIHZvaWQgYWxsb2NfYWNwaXBocF9ocF93b3JrKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsCisJCQkJICB2b2lkICpjb250ZXh0LAorCQkJCSAgdm9pZCAoKmZ1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykpCit7CisJc3RydWN0IGFjcGlwaHBfaHBfd29yayAqaHBfd29yazsKKwlpbnQgcmV0OworCisJaHBfd29yayA9IGttYWxsb2Moc2l6ZW9mKCpocF93b3JrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocF93b3JrKQorCQlyZXR1cm47CisKKwlocF93b3JrLT5oYW5kbGUgPSBoYW5kbGU7CisJaHBfd29yay0+dHlwZSA9IHR5cGU7CisJaHBfd29yay0+Y29udGV4dCA9IGNvbnRleHQ7CisKKwlJTklUX1dPUksoJmhwX3dvcmstPndvcmssIGZ1bmMpOworCXJldCA9IHF1ZXVlX3dvcmsoa2FjcGlfaG90cGx1Z193cSwgJmhwX3dvcmstPndvcmspOworCWlmICghcmV0KQorCQlrZnJlZShocF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgX2hhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7CiAJY2hhciBvYmpuYW1lWzY0XTsKQEAgLTExNjUsMTEgKzExODYsMTggQEAKIAkJCQkgICAgICAucG9pbnRlciA9IG9iam5hbWUgfTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKIAlpbnQgbnVtX3N1Yl9icmlkZ2VzID0gMDsKKwlzdHJ1Y3QgYWNwaXBocF9ocF93b3JrICpocF93b3JrOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1MzIgdHlwZTsKKworCWhwX3dvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFjcGlwaHBfaHBfd29yaywgd29yayk7CisJaGFuZGxlID0gaHBfd29yay0+aGFuZGxlOworCXR5cGUgPSBocF93b3JrLT50eXBlOwogCiAJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKSkgewogCQkvKiBUaGlzIGJyaWRnZSBtdXN0IGhhdmUganVzdCBiZWVuIHBoeXNpY2FsbHkgaW5zZXJ0ZWQgKi8KIAkJaGFuZGxlX2JyaWRnZV9pbnNlcnRpb24oaGFuZGxlLCB0eXBlKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAlicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKTsKQEAgLTExODAsNyArMTIwOCw3IEBACiAKIAlpZiAoIWJyaWRnZSAmJiAhbnVtX3N1Yl9icmlkZ2VzKSB7CiAJCWVycigiY2Fubm90IGdldCBicmlkZ2UgaW5mb1xuIik7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7CkBAIC0xMjQxLDIyICsxMjY5LDQ5IEBACiAJCXdhcm4oIm5vdGlmeV9oYW5kbGVyOiB1bmtub3duIGV2ZW50IHR5cGUgMHgleCBmb3IgJXNcbiIsIHR5cGUsIG9iam5hbWUpOwogCQlicmVhazsKIAl9CisKK291dDoKKwlrZnJlZShocF93b3JrKTsgLyogYWxsb2NhdGVkIGluIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSAqLwogfQogCiAvKioKLSAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMgLSBoYW5kbGUgQUNQSSBldmVudCBvbiBmdW5jdGlvbnMgKGkuZS4gc2xvdHMpCisgKiBoYW5kbGVfaG90cGx1Z19ldmVudF9icmlkZ2UgLSBoYW5kbGUgQUNQSSBldmVudCBvbiBicmlkZ2VzCiAgKiBAaGFuZGxlOiBOb3RpZnkoKSdlZCBhY3BpX2hhbmRsZQogICogQHR5cGU6IE5vdGlmeSBjb2RlCi0gKiBAY29udGV4dDogcG9pbnRlciB0byBhY3BpcGhwX2Z1bmMgc3RydWN0dXJlCisgKiBAY29udGV4dDogcG9pbnRlciB0byBhY3BpcGhwX2JyaWRnZSBzdHJ1Y3R1cmUKICAqCi0gKiBIYW5kbGVzIEFDUEkgZXZlbnQgbm90aWZpY2F0aW9uIG9uIHNsb3RzLgorICogSGFuZGxlcyBBQ1BJIGV2ZW50IG5vdGlmaWNhdGlvbiBvbiB7aG9zdCxwMnB9IGJyaWRnZXMuCiAgKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiB0eXBlLAorCQkJCQl2b2lkICpjb250ZXh0KQoreworCS8qCisJICogQ3VycmVudGx5IHRoZSBjb2RlIGFkZHMgYWxsIGhvdHBsdWcgZXZlbnRzIHRvIHRoZSBrYWNwaWRfd3EKKwkgKiBxdWV1ZSB3aGVuIGl0IHNob3VsZCBhZGQgaG90cGx1ZyBldmVudHMgdG8gdGhlIGthY3BpX2hvdHBsdWdfd3EuCisJICogVGhlIHByb3BlciB3YXkgdG8gZml4IHRoaXMgaXMgdG8gcmVvcmdhbml6ZSB0aGUgY29kZSBzbyB0aGF0CisJICogZHJpdmVycyAoZG9jaywgZXRjLikgZG8gbm90IGNhbGwgYWNwaV9vc19leGVjdXRlKCksIGV0Yy4KKwkgKiBGb3Igbm93IGp1c3QgcmUtYWRkIHRoaXMgd29yayB0byB0aGUga2FjcGlfaG90cGx1Z193cSBzbyB3ZQorCSAqIGRvbid0IGRlYWRsb2NrIG9uIGhvdHBsdWcgYWN0aW9ucy4KKwkgKi8KKwlhbGxvY19hY3BpcGhwX2hwX3dvcmsoaGFuZGxlLCB0eXBlLCBjb250ZXh0LAorCQkJICAgICAgX2hhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9oYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCWNoYXIgb2JqbmFtZVs2NF07CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgLmxlbmd0aCA9IHNpemVvZihvYmpuYW1lKSwKIAkJCQkgICAgICAucG9pbnRlciA9IG9iam5hbWUgfTsKKwlzdHJ1Y3QgYWNwaXBocF9ocF93b3JrICpocF93b3JrOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1MzIgdHlwZTsKKwl2b2lkICpjb250ZXh0OworCisJaHBfd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNwaXBocF9ocF93b3JrLCB3b3JrKTsKKwloYW5kbGUgPSBocF93b3JrLT5oYW5kbGU7CisJdHlwZSA9IGhwX3dvcmstPnR5cGU7CisJY29udGV4dCA9IGhwX3dvcmstPmNvbnRleHQ7CiAKIAlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIApAQCAtMTI5MSw4ICsxMzQ2LDMyIEBACiAJCXdhcm4oIm5vdGlmeV9oYW5kbGVyOiB1bmtub3duIGV2ZW50IHR5cGUgMHgleCBmb3IgJXNcbiIsIHR5cGUsIG9iam5hbWUpOwogCQlicmVhazsKIAl9CisKKwlrZnJlZShocF93b3JrKTsgLyogYWxsb2NhdGVkIGluIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMgKi8KIH0KIAorLyoqCisgKiBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jIC0gaGFuZGxlIEFDUEkgZXZlbnQgb24gZnVuY3Rpb25zIChpLmUuIHNsb3RzKQorICogQGhhbmRsZTogTm90aWZ5KCknZWQgYWNwaV9oYW5kbGUKKyAqIEB0eXBlOiBOb3RpZnkgY29kZQorICogQGNvbnRleHQ6IHBvaW50ZXIgdG8gYWNwaXBocF9mdW5jIHN0cnVjdHVyZQorICoKKyAqIEhhbmRsZXMgQUNQSSBldmVudCBub3RpZmljYXRpb24gb24gc2xvdHMuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwKKwkJCQkgICAgICB2b2lkICpjb250ZXh0KQoreworCS8qCisJICogQ3VycmVudGx5IHRoZSBjb2RlIGFkZHMgYWxsIGhvdHBsdWcgZXZlbnRzIHRvIHRoZSBrYWNwaWRfd3EKKwkgKiBxdWV1ZSB3aGVuIGl0IHNob3VsZCBhZGQgaG90cGx1ZyBldmVudHMgdG8gdGhlIGthY3BpX2hvdHBsdWdfd3EuCisJICogVGhlIHByb3BlciB3YXkgdG8gZml4IHRoaXMgaXMgdG8gcmVvcmdhbml6ZSB0aGUgY29kZSBzbyB0aGF0CisJICogZHJpdmVycyAoZG9jaywgZXRjLikgZG8gbm90IGNhbGwgYWNwaV9vc19leGVjdXRlKCksIGV0Yy4KKwkgKiBGb3Igbm93IGp1c3QgcmUtYWRkIHRoaXMgd29yayB0byB0aGUga2FjcGlfaG90cGx1Z193cSBzbyB3ZQorCSAqIGRvbid0IGRlYWRsb2NrIG9uIGhvdHBsdWcgYWN0aW9ucy4KKwkgKi8KKwlhbGxvY19hY3BpcGhwX2hwX3dvcmsoaGFuZGxlLCB0eXBlLCBjb250ZXh0LAorCQkJICAgICAgX2hhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMpOworfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGZpbmRfcm9vdF9icmlkZ2VzKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCmluZGV4IDVmNzIyNjIuLjM3NmQ3MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJwY2llaHAuaCIKIAogI2RlZmluZSBQQ0lFSFBfREVURUNUX1BDSUUJKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2xvdC5jCmluZGV4IDNmZmQ5YzFhLi44YzA1YTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3Nsb3QuYwpAQCAtMjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCiBzdGF0aWMgc3RydWN0IGhwcF90eXBlMCBwY2lfZGVmYXVsdF90eXBlMCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggMWQwMDJiMS4uYzU2YTk0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2h0aXJxLmMgYi9kcml2ZXJzL3BjaS9odGlycS5jCmluZGV4IGRiMDU3YjYuLjZlMzczZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2h0aXJxLmMKKysrIGIvZHJpdmVycy9wY2kvaHRpcnEuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9odGlycS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb2FwaWMuYyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCmluZGV4IDIwMzUwOGIuLjU3NzU2MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvYXBpYy5jCisrKyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW92LmMgYi9kcml2ZXJzL3BjaS9pb3YuYwppbmRleCA0MmZhZTQ3Li5iODJjMTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pb3YuYworKysgYi9kcml2ZXJzL3BjaS9pb3YuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWF0cy5oPgpAQCAtNzIyLDE0NSArNzIzLDMgQEAKIAkJcmV0dXJuIGRldi0+c3Jpb3YtPm5yX3ZpcnRmbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9udW1fdmYpOwotCi1zdGF0aWMgaW50IGF0c19hbGxvY19vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBzKQotewotCWludCBwb3M7Ci0JdTE2IGNhcDsKLQlzdHJ1Y3QgcGNpX2F0cyAqYXRzOwotCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BVFMpOwotCWlmICghcG9zKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWF0cyA9IGt6YWxsb2Moc2l6ZW9mKCphdHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF0cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdHMtPnBvcyA9IHBvczsKLQlhdHMtPnN0dSA9IHBzOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FUU19DQVAsICZjYXApOwotCWF0cy0+cWRlcCA9IFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA/IFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA6Ci0JCQkJCSAgICBQQ0lfQVRTX01BWF9RREVQOwotCWRldi0+YXRzID0gYXRzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0c19mcmVlX29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWtmcmVlKGRldi0+YXRzKTsKLQlkZXYtPmF0cyA9IE5VTEw7Ci19Ci0KLS8qKgotICogcGNpX2VuYWJsZV9hdHMgLSBlbmFibGUgdGhlIEFUUyBjYXBhYmlsaXR5Ci0gKiBAZGV2OiB0aGUgUENJIGRldmljZQotICogQHBzOiB0aGUgSU9NTVUgcGFnZSBzaGlmdAotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBuZWdhdGl2ZSBvbiBmYWlsdXJlLgotICovCi1pbnQgcGNpX2VuYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBzKQotewotCWludCByYzsKLQl1MTYgY3RybDsKLQotCUJVR19PTihkZXYtPmF0cyAmJiBkZXYtPmF0cy0+aXNfZW5hYmxlZCk7Ci0KLQlpZiAocHMgPCBQQ0lfQVRTX01JTl9TVFUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRldi0+aXNfcGh5c2ZuIHx8IGRldi0+aXNfdmlydGZuKSB7Ci0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5pc19waHlzZm4gPyBkZXYgOiBkZXYtPnBoeXNmbjsKLQotCQltdXRleF9sb2NrKCZwZGV2LT5zcmlvdi0+bG9jayk7Ci0JCWlmIChwZGV2LT5hdHMpCi0JCQlyYyA9IHBkZXYtPmF0cy0+c3R1ID09IHBzID8gMCA6IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXJjID0gYXRzX2FsbG9jX29uZShwZGV2LCBwcyk7Ci0KLQkJaWYgKCFyYykKLQkJCXBkZXYtPmF0cy0+cmVmX2NudCsrOwotCQltdXRleF91bmxvY2soJnBkZXYtPnNyaW92LT5sb2NrKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCWlmICghZGV2LT5pc19waHlzZm4pIHsKLQkJcmMgPSBhdHNfYWxsb2Nfb25lKGRldiwgcHMpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JY3RybCA9IFBDSV9BVFNfQ1RSTF9FTkFCTEU7Ci0JaWYgKCFkZXYtPmlzX3ZpcnRmbikKLQkJY3RybCB8PSBQQ0lfQVRTX0NUUkxfU1RVKHBzIC0gUENJX0FUU19NSU5fU1RVKTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBkZXYtPmF0cy0+cG9zICsgUENJX0FUU19DVFJMLCBjdHJsKTsKLQotCWRldi0+YXRzLT5pc19lbmFibGVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHBjaV9kaXNhYmxlX2F0cyAtIGRpc2FibGUgdGhlIEFUUyBjYXBhYmlsaXR5Ci0gKiBAZGV2OiB0aGUgUENJIGRldmljZQotICovCi12b2lkIHBjaV9kaXNhYmxlX2F0cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUxNiBjdHJsOwotCi0JQlVHX09OKCFkZXYtPmF0cyB8fCAhZGV2LT5hdHMtPmlzX2VuYWJsZWQpOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPmF0cy0+cG9zICsgUENJX0FUU19DVFJMLCAmY3RybCk7Ci0JY3RybCAmPSB+UENJX0FUU19DVFJMX0VOQUJMRTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBkZXYtPmF0cy0+cG9zICsgUENJX0FUU19DVFJMLCBjdHJsKTsKLQotCWRldi0+YXRzLT5pc19lbmFibGVkID0gMDsKLQotCWlmIChkZXYtPmlzX3BoeXNmbiB8fCBkZXYtPmlzX3ZpcnRmbikgewotCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+aXNfcGh5c2ZuID8gZGV2IDogZGV2LT5waHlzZm47Ci0KLQkJbXV0ZXhfbG9jaygmcGRldi0+c3Jpb3YtPmxvY2spOwotCQlwZGV2LT5hdHMtPnJlZl9jbnQtLTsKLQkJaWYgKCFwZGV2LT5hdHMtPnJlZl9jbnQpCi0JCQlhdHNfZnJlZV9vbmUocGRldik7Ci0JCW11dGV4X3VubG9jaygmcGRldi0+c3Jpb3YtPmxvY2spOwotCX0KLQotCWlmICghZGV2LT5pc19waHlzZm4pCi0JCWF0c19mcmVlX29uZShkZXYpOwotfQotCi0vKioKLSAqIHBjaV9hdHNfcXVldWVfZGVwdGggLSBxdWVyeSB0aGUgQVRTIEludmFsaWRhdGUgUXVldWUgRGVwdGgKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCi0gKgotICogUmV0dXJucyB0aGUgcXVldWUgZGVwdGggb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGUgQVRTIHNwZWMgdXNlcyAwIGluIHRoZSBJbnZhbGlkYXRlIFF1ZXVlIERlcHRoIGZpZWxkIHRvCi0gKiBpbmRpY2F0ZSB0aGF0IHRoZSBmdW5jdGlvbiBjYW4gYWNjZXB0IDMyIEludmFsaWRhdGUgUmVxdWVzdC4KLSAqIEJ1dCBoZXJlIHdlIHVzZSB0aGUgYHJlYWwnIHZhbHVlcyAoaS5lLiAxfjMyKSBmb3IgdGhlIFF1ZXVlCi0gKiBEZXB0aDsgYW5kIDAgaW5kaWNhdGVzIHRoZSBmdW5jdGlvbiBzaGFyZXMgdGhlIFF1ZXVlIHdpdGgKLSAqIG90aGVyIGZ1bmN0aW9ucyAoZG9lc24ndCBleGNsdXNpdmVseSBvd24gYSBRdWV1ZSkuCi0gKi8KLWludCBwY2lfYXRzX3F1ZXVlX2RlcHRoKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IHBvczsKLQl1MTYgY2FwOwotCi0JaWYgKGRldi0+aXNfdmlydGZuKQotCQlyZXR1cm4gMDsKLQotCWlmIChkZXYtPmF0cykKLQkJcmV0dXJuIGRldi0+YXRzLT5xZGVwOwotCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9BVFMpOwotCWlmICghcG9zKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0FUU19DQVAsICZjYXApOwotCi0JcmV0dXJuIFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA/IFBDSV9BVFNfQ0FQX1FERVAoY2FwKSA6Ci0JCQkJICAgICAgIFBDSV9BVFNfTUFYX1FERVA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pcnEuYyBiL2RyaXZlcnMvcGNpL2lycS5jCmluZGV4IGRlMDExNzQuLmU1ZjY5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lycS5jCisrKyBiL2RyaXZlcnMvcGNpL2lycS5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogc3RhdGljIHZvaWQgcGNpX25vdGVfaXJxX3Byb2JsZW0oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IGNoYXIgKnJlYXNvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMmYxMDMyOC4uMGU2ZDA0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKaW5kZXggZDM2ZjQxZS4uNGVjYjY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWFjcGkuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCkBAIC00Niw2ICs0Niw5IEBACiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBjb250ZXh0OwogCiAJaWYgKGV2ZW50ID09IEFDUElfTk9USUZZX0RFVklDRV9XQUtFICYmIHBjaV9kZXYpIHsKKwkJaWYgKHBjaV9kZXYtPnBtZV9wb2xsKQorCQkJcGNpX2Rldi0+cG1lX3BvbGwgPSBmYWxzZTsKKwogCQlwY2lfd2FrZXVwX2V2ZW50KHBjaV9kZXYpOwogCQlwY2lfY2hlY2tfcG1lX3N0YXR1cyhwY2lfZGV2KTsKIAkJcG1fcnVudGltZV9yZXN1bWUoJnBjaV9kZXYtPmRldik7CkBAIC0yODIsNyArMjg1LDYgQEAKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0JaW50IGVycm9yID0gLUVOT0RFVjsKIAogCWlmICghZGV2aWNlX3J1bl93YWtlKHBoeXNfZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDIsNyArMzA0LDcgQEAKIAkJYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoZGV2KTsKIAl9CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGFjcGlfcGNpX3Byb3BhZ2F0ZV9ydW5fd2FrZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBib29sIGVuYWJsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggN2JjZjEyYS4uMTA2YmUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggZTk2NTFmMC4uNmY0NWE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTE0MDcsMTMgKzE0MDcsMTYgQEAKIC8qKgogICogcGNpX3BtZV93YWtldXAgLSBXYWtlIHVwIGEgUENJIGRldmljZSBpZiBpdHMgUE1FIFN0YXR1cyBiaXQgaXMgc2V0LgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KLSAqIEBpZ246IElnbm9yZWQuCisgKiBAcG1lX3BvbGxfcmVzZXQ6IFdoZXRoZXIgb3Igbm90IHRvIHJlc2V0IHRoZSBkZXZpY2UncyBwbWVfcG9sbCBmbGFnLgogICoKICAqIENoZWNrIGlmIEBkZXYgaGFzIGdlbmVyYXRlZCBQTUUgYW5kIHF1ZXVlIGEgcmVzdW1lIHJlcXVlc3QgZm9yIGl0IGluIHRoYXQKICAqIGNhc2UuCiAgKi8KLXN0YXRpYyBpbnQgcGNpX3BtZV93YWtldXAoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqaWduKQorc3RhdGljIGludCBwY2lfcG1lX3dha2V1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICpwbWVfcG9sbF9yZXNldCkKIHsKKwlpZiAocG1lX3BvbGxfcmVzZXQgJiYgZGV2LT5wbWVfcG9sbCkKKwkJZGV2LT5wbWVfcG9sbCA9IGZhbHNlOworCiAJaWYgKHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpIHsKIAkJcGNpX3dha2V1cF9ldmVudChkZXYpOwogCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOwpAQCAtMTQyOCw3ICsxNDMxLDcgQEAKIHZvaWQgcGNpX3BtZV93YWtldXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJaWYgKGJ1cykKLQkJcGNpX3dhbGtfYnVzKGJ1cywgcGNpX3BtZV93YWtldXAsIE5VTEwpOworCQlwY2lfd2Fsa19idXMoYnVzLCBwY2lfcG1lX3dha2V1cCwgKHZvaWQgKil0cnVlKTsKIH0KIAogLyoqCkBAIC0xNDQ2LDMxICsxNDQ5LDI2IEBACiAKIHN0YXRpYyB2b2lkIHBjaV9wbWVfbGlzdF9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcGNpX3BtZV9kZXZpY2UgKnBtZV9kZXY7CisJc3RydWN0IHBjaV9wbWVfZGV2aWNlICpwbWVfZGV2LCAqbjsKIAogCW11dGV4X2xvY2soJnBjaV9wbWVfbGlzdF9tdXRleCk7CiAJaWYgKCFsaXN0X2VtcHR5KCZwY2lfcG1lX2xpc3QpKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocG1lX2RldiwgJnBjaV9wbWVfbGlzdCwgbGlzdCkKLQkJCXBjaV9wbWVfd2FrZXVwKHBtZV9kZXYtPmRldiwgTlVMTCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGNpX3BtZV93b3JrLCBtc2Vjc190b19qaWZmaWVzKFBNRV9USU1FT1VUKSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbWVfZGV2LCBuLCAmcGNpX3BtZV9saXN0LCBsaXN0KSB7CisJCQlpZiAocG1lX2Rldi0+ZGV2LT5wbWVfcG9sbCkgeworCQkJCXBjaV9wbWVfd2FrZXVwKHBtZV9kZXYtPmRldiwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCWxpc3RfZGVsKCZwbWVfZGV2LT5saXN0KTsKKwkJCQlrZnJlZShwbWVfZGV2KTsKKwkJCX0KKwkJfQorCQlpZiAoIWxpc3RfZW1wdHkoJnBjaV9wbWVfbGlzdCkpCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBjaV9wbWVfd29yaywKKwkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhQTUVfVElNRU9VVCkpOwogCX0KIAltdXRleF91bmxvY2soJnBjaV9wbWVfbGlzdF9tdXRleCk7CiB9CiAKIC8qKgotICogcGNpX2V4dGVybmFsX3BtZSAtIGlzIGEgZGV2aWNlIGFuIGV4dGVybmFsIFBDSSBQTUUgc291cmNlPwotICogQGRldjogUENJIGRldmljZSB0byBjaGVjawotICoKLSAqLwotCi1zdGF0aWMgYm9vbCBwY2lfZXh0ZXJuYWxfcG1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaWYgKHBjaV9pc19wY2llKGRldikgfHwgZGV2LT5idXMtPm51bWJlciA9PSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgogICogcGNpX3BtZV9hY3RpdmUgLSBlbmFibGUgb3IgZGlzYWJsZSBQQ0kgZGV2aWNlJ3MgUE1FIyBmdW5jdGlvbgogICogQGRldjogUENJIGRldmljZSB0byBoYW5kbGUuCiAgKiBAZW5hYmxlOiAndHJ1ZScgdG8gZW5hYmxlIFBNRSMgZ2VuZXJhdGlvbjsgJ2ZhbHNlJyB0byBkaXNhYmxlIGl0LgpAQCAtMTUwMyw3ICsxNTAxLDcgQEAKIAkgICBoaXQsIGFuZCB0aGUgcG93ZXIgc2F2aW5ncyBmcm9tIHRoZSBkZXZpY2VzIHdpbGwgc3RpbGwgYmUgYQogCSAgIHdpbi4gKi8KIAotCWlmIChwY2lfZXh0ZXJuYWxfcG1lKGRldikpIHsKKwlpZiAoZGV2LT5wbWVfcG9sbCkgewogCQlzdHJ1Y3QgcGNpX3BtZV9kZXZpY2UgKnBtZV9kZXY7CiAJCWlmIChlbmFibGUpIHsKIAkJCXBtZV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX3BtZV9kZXZpY2UpLApAQCAtMTgyMSw2ICsxODE5LDcgQEAKIAkJCSAocG1jICYgUENJX1BNX0NBUF9QTUVfRDMpID8gIiBEM2hvdCIgOiAiIiwKIAkJCSAocG1jICYgUENJX1BNX0NBUF9QTUVfRDNjb2xkKSA/ICIgRDNjb2xkIiA6ICIiKTsKIAkJZGV2LT5wbWVfc3VwcG9ydCA9IHBtYyA+PiBQQ0lfUE1fQ0FQX1BNRV9TSElGVDsKKwkJZGV2LT5wbWVfcG9sbCA9IHRydWU7CiAJCS8qCiAJCSAqIE1ha2UgZGV2aWNlJ3MgUE0gZmxhZ3MgcmVmbGVjdCB0aGUgd2FrZS11cCBjYXBhYmlsaXR5LCBidXQKIAkJICogbGV0IHRoZSB1c2VyIHNwYWNlIGVuYWJsZSBpdCB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gYXMgbmVlZGVkLgpAQCAtMzIwMyw4ICszMjAyLDYgQEAKIAlpZiAocnEgPCAxMjggfHwgcnEgPiA0MDk2IHx8ICFpc19wb3dlcl9vZl8yKHJxKSkKIAkJZ290byBvdXQ7CiAKLQl2ID0gKGZmcyhycSkgLSA4KSA8PCAxMjsKLQogCWNhcCA9IHBjaV9wY2llX2NhcChkZXYpOwogCWlmICghY2FwKQogCQlnb3RvIG91dDsKQEAgLTMyMTIsNiArMzIwOSwyMiBAQAogCWVyciA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsICZjdGwpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OworCS8qCisJICogSWYgdXNpbmcgdGhlICJwZXJmb3JtYW5jZSIgUENJZSBjb25maWcsIHdlIGNsYW1wIHRoZQorCSAqIHJlYWQgcnEgc2l6ZSB0byB0aGUgbWF4IHBhY2tldCBzaXplIHRvIHByZXZlbnQgdGhlCisJICogaG9zdCBicmlkZ2UgZ2VuZXJhdGluZyByZXF1ZXN0cyBsYXJnZXIgdGhhbiB3ZSBjYW4KKwkgKiBjb3BlIHdpdGgKKwkgKi8KKwlpZiAocGNpZV9idXNfY29uZmlnID09IFBDSUVfQlVTX1BFUkZPUk1BTkNFKSB7CisJCWludCBtcHMgPSBwY2llX2dldF9tcHMoZGV2KTsKKworCQlpZiAobXBzIDwgMCkKKwkJCXJldHVybiBtcHM7CisJCWlmIChtcHMgPCBycSkKKwkJCXJxID0gbXBzOworCX0KKworCXYgPSAoZmZzKHJxKSAtIDgpIDw8IDEyOwogCiAJaWYgKChjdGwgJiBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEpICE9IHYpIHsKIAkJY3RsICY9IH5QQ0lfRVhQX0RFVkNUTF9SRUFEUlE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BtZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wbWUuYwppbmRleCAwMDU3MzQ0Li4wMDFmMWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BtZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMKQEAgLTg0LDYgKzg0LDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJLyogU2tpcCBQQ0llIGRldmljZXMgaW4gY2FzZSB3ZSBzdGFydGVkIGZyb20gYSByb290IHBvcnQuICovCiAJCWlmICghcGNpX2lzX3BjaWUoZGV2KSAmJiBwY2lfY2hlY2tfcG1lX3N0YXR1cyhkZXYpKSB7CisJCQlpZiAoZGV2LT5wbWVfcG9sbCkKKwkJCQlkZXYtPnBtZV9wb2xsID0gZmFsc2U7CisKIAkJCXBjaV93YWtldXBfZXZlbnQoZGV2KTsKIAkJCXBtX3JlcXVlc3RfcmVzdW1lKCZkZXYtPmRldik7CiAJCQlyZXQgPSB0cnVlOwpAQCAtMTQyLDYgKzE0NSw5IEBACiAKIAkvKiBGaXJzdCwgY2hlY2sgaWYgdGhlIFBNRSBpcyBmcm9tIHRoZSByb290IHBvcnQgaXRzZWxmLiAqLwogCWlmIChwb3J0LT5kZXZmbiA9PSBkZXZmbiAmJiBwb3J0LT5idXMtPm51bWJlciA9PSBidXNucikgeworCQlpZiAocG9ydC0+cG1lX3BvbGwpCisJCQlwb3J0LT5wbWVfcG9sbCA9IGZhbHNlOworCiAJCWlmIChwY2lfY2hlY2tfcG1lX3N0YXR1cyhwb3J0KSkgewogCQkJcG1fcmVxdWVzdF9yZXN1bWUoJnBvcnQtPmRldik7CiAJCQlmb3VuZCA9IHRydWU7CkBAIC0xODcsNiArMTkzLDkgQEAKIAkJLyogVGhlIGRldmljZSBpcyB0aGVyZSwgYnV0IHdlIGhhdmUgdG8gY2hlY2sgaXRzIFBNRSBzdGF0dXMuICovCiAJCWZvdW5kID0gcGNpX2NoZWNrX3BtZV9zdGF0dXMoZGV2KTsKIAkJaWYgKGZvdW5kKSB7CisJCQlpZiAoZGV2LT5wbWVfcG9sbCkKKwkJCQlkZXYtPnBtZV9wb2xsID0gZmFsc2U7CisKIAkJCXBjaV93YWtldXBfZXZlbnQoZGV2KTsKIAkJCXBtX3JlcXVlc3RfcmVzdW1lKCZkZXYtPmRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDZhYjZiZDMuLjA0ZTc0ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMTM2MywzMSArMTM2MywyNSBAQAogCiBzdGF0aWMgdm9pZCBwY2llX3dyaXRlX21wcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbXBzKQogewotCWludCByYywgZGV2X21wc3M7Ci0KLQlkZXZfbXBzcyA9IDEyOCA8PCBkZXYtPnBjaWVfbXBzczsKKwlpbnQgcmM7CiAKIAlpZiAocGNpZV9idXNfY29uZmlnID09IFBDSUVfQlVTX1BFUkZPUk1BTkNFKSB7Ci0JCWlmIChkZXYtPmJ1cy0+c2VsZikgewotCQkJZGV2X2RiZygmZGV2LT5idXMtPmRldiwgIkJ1cyBNUFNTICVkXG4iLAotCQkJCTEyOCA8PCBkZXYtPmJ1cy0+c2VsZi0+cGNpZV9tcHNzKTsKKwkJbXBzID0gMTI4IDw8IGRldi0+cGNpZV9tcHNzOwogCi0JCQkvKiBGb3IgIk1QUyBGb3JjZSBNYXgiLCB0aGUgYXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQKKwkJaWYgKGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYgZGV2LT5idXMtPnNlbGYpCisJCQkvKiBGb3IgIlBlcmZvcm1hbmNlIiwgdGhlIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0CiAJCQkgKiBkb3duc3RyZWFtIGNvbW11bmljYXRpb24gd2lsbCBuZXZlciBiZSBsYXJnZXIgdGhhbgogCQkJICogdGhlIE1SUlMuICBTbywgdGhlIE1QUyBvbmx5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQKIAkJCSAqIGZvciB0aGUgdXBzdHJlYW0gY29tbXVuaWNhdGlvbi4gIFRoaXMgYmVpbmcgdGhlIGNhc2UsCiAJCQkgKiB3YWxrIGZyb20gdGhlIHRvcCBkb3duIGFuZCBzZXQgdGhlIE1QUyBvZiB0aGUgY2hpbGQKIAkJCSAqIHRvIHRoYXQgb2YgdGhlIHBhcmVudCBidXMuCisJCQkgKgorCQkJICogQ29uZmlndXJlIHRoZSBkZXZpY2UgTVBTIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhlCisJCQkgKiBkZXZpY2UgTVBTUyBvciB0aGUgYnJpZGdlIE1QUyAod2hpY2ggaXMgYXNzdW1lZCB0byBiZQorCQkJICogcHJvcGVybHkgY29uZmlndXJlZCBhdCB0aGlzIHBvaW50IHRvIHRoZSBsYXJnZXN0CisJCQkgKiBhbGxvd2FibGUgTVBTIGJhc2VkIG9uIGl0cyBwYXJlbnQgYnVzKS4KIAkJCSAqLwotCQkJbXBzID0gMTI4IDw8IGRldi0+YnVzLT5zZWxmLT5wY2llX21wc3M7Ci0JCQlpZiAobXBzID4gZGV2X21wc3MpCi0JCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiTVBTIGNvbmZpZ3VyZWQgaGlnaGVyIHRoYW4iCi0JCQkJCSAiIG1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuICBJZiIKLQkJCQkJICIgYSBidXMgaXNzdWUgb2NjdXJzLCB0cnkgcnVubmluZyB3aXRoIgotCQkJCQkgIiBwY2k9cGNpZV9idXNfc2FmZS5cbiIpOwotCQl9Ci0KLQkJZGV2LT5wY2llX21wc3MgPSBmZnMobXBzKSAtIDg7CisJCQltcHMgPSBtaW4obXBzLCBwY2llX2dldF9tcHMoZGV2LT5idXMtPnNlbGYpKTsKIAl9CiAKIAlyYyA9IHBjaWVfc2V0X21wcyhkZXYsIG1wcyk7CkBAIC0xMzk1LDI1ICsxMzg5LDIyIEBACiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIGF0dGVtcHRpbmcgdG8gc2V0IHRoZSBNUFNcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBwY2llX3dyaXRlX21ycnMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1wcykKK3N0YXRpYyB2b2lkIHBjaWVfd3JpdGVfbXJycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCByYywgbXJycywgZGV2X21wc3M7CisJaW50IHJjLCBtcnJzOwogCiAJLyogSW4gdGhlICJzYWZlIiBjYXNlLCBkbyBub3QgY29uZmlndXJlIHRoZSBNUlJTLiAgVGhlcmUgYXBwZWFyIHRvIGJlCiAJICogaXNzdWVzIHdpdGggc2V0dGluZyBNUlJTIHRvIDAgb24gYSBudW1iZXIgb2YgZGV2aWNlcy4KIAkgKi8KLQogCWlmIChwY2llX2J1c19jb25maWcgIT0gUENJRV9CVVNfUEVSRk9STUFOQ0UpCiAJCXJldHVybjsKIAotCWRldl9tcHNzID0gMTI4IDw8IGRldi0+cGNpZV9tcHNzOwotCiAJLyogRm9yIE1heCBwZXJmb3JtYW5jZSwgdGhlIE1SUlMgbXVzdCBiZSBzZXQgdG8gdGhlIGxhcmdlc3Qgc3VwcG9ydGVkCiAJICogdmFsdWUuICBIb3dldmVyLCBpdCBjYW5ub3QgYmUgY29uZmlndXJlZCBsYXJnZXIgdGhhbiB0aGUgTVBTIHRoZQotCSAqIGRldmljZSBvciB0aGUgYnVzIGNhbiBzdXBwb3J0LiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGxhcmdlc3QgTVJSUwotCSAqIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGRldmljZSBNUFNTLgorCSAqIGRldmljZSBvciB0aGUgYnVzIGNhbiBzdXBwb3J0LiAgVGhpcyBzaG91bGQgYWxyZWFkeSBiZSBwcm9wZXJseQorCSAqIGNvbmZpZ3VyZWQgYnkgYSBwcmlvciBjYWxsIHRvIHBjaWVfd3JpdGVfbXBzLgogCSAqLwotCW1ycnMgPSBtaW4obXBzLCBkZXZfbXBzcyk7CisJbXJycyA9IHBjaWVfZ2V0X21wcyhkZXYpOwogCiAJLyogTVJSUyBpcyBhIFIvVyByZWdpc3Rlci4gIEludmFsaWQgdmFsdWVzIGNhbiBiZSB3cml0dGVuLCBidXQgYQogCSAqIHN1YnNlcXVlbnQgcmVhZCB3aWxsIHZlcmlmeSBpZiB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZSBvciBub3QuCkBAIC0xNDIxLDM4ICsxNDEyLDQxIEBACiAJICogc2hyaW5rIHRoZSB2YWx1ZSB1bnRpbCBpdCBpcyBhY2NlcHRhYmxlIHRvIHRoZSBIVy4KICAJICovCiAJd2hpbGUgKG1ycnMgIT0gcGNpZV9nZXRfcmVhZHJxKGRldikgJiYgbXJycyA+PSAxMjgpIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiQXR0ZW1wdGluZyB0byBtb2RpZnkgdGhlIFBDSS1FIE1SUlMgdmFsdWUiCi0JCQkgIiB0byAlZC4gIElmIGFueSBpc3N1ZXMgYXJlIGVuY291bnRlcmVkLCBwbGVhc2UgdHJ5ICIKLQkJCSAicnVubmluZyB3aXRoIHBjaT1wY2llX2J1c19zYWZlXG4iLCBtcnJzKTsKIAkJcmMgPSBwY2llX3NldF9yZWFkcnEoZGV2LCBtcnJzKTsKLQkJaWYgKHJjKQotCQkJZGV2X2VycigmZGV2LT5kZXYsCi0JCQkJIkZhaWxlZCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgTVJSU1xuIik7CisJCWlmICghcmMpCisJCQlicmVhazsKIAorCQlkZXZfd2FybigmZGV2LT5kZXYsICJGYWlsZWQgYXR0ZW1wdGluZyB0byBzZXQgdGhlIE1SUlNcbiIpOwogCQltcnJzIC89IDI7CiAJfQorCisJaWYgKG1ycnMgPCAxMjgpCisJCWRldl9lcnIoJmRldi0+ZGV2LCAiTVJSUyB3YXMgdW5hYmxlIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBhICIKKwkJCSJzYWZlIHZhbHVlLiAgSWYgcHJvYmxlbXMgYXJlIGV4cGVyaWVuY2VkLCB0cnkgcnVubmluZyAiCisJCQkid2l0aCBwY2k9cGNpZV9idXNfc2FmZS5cbiIpOwogfQogCiBzdGF0aWMgaW50IHBjaWVfYnVzX2NvbmZpZ3VyZV9zZXQoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgbXBzID0gMTI4IDw8ICoodTggKilkYXRhOworCWludCBtcHMsIG9yaWdfbXBzOwogCiAJaWYgKCFwY2lfaXNfcGNpZShkZXYpKQogCQlyZXR1cm4gMDsKIAotCWRldl9kYmcoJmRldi0+ZGV2LCAiRGV2IE1QUyAlZCBNUFNTICVkIE1SUlMgJWRcbiIsCi0JCSBwY2llX2dldF9tcHMoZGV2KSwgMTI4PDxkZXYtPnBjaWVfbXBzcywgcGNpZV9nZXRfcmVhZHJxKGRldikpOworCW1wcyA9IDEyOCA8PCAqKHU4ICopZGF0YTsKKwlvcmlnX21wcyA9IHBjaWVfZ2V0X21wcyhkZXYpOwogCiAJcGNpZV93cml0ZV9tcHMoZGV2LCBtcHMpOwotCXBjaWVfd3JpdGVfbXJycyhkZXYsIG1wcyk7CisJcGNpZV93cml0ZV9tcnJzKGRldik7CiAKLQlkZXZfZGJnKCZkZXYtPmRldiwgIkRldiBNUFMgJWQgTVBTUyAlZCBNUlJTICVkXG4iLAotCQkgcGNpZV9nZXRfbXBzKGRldiksIDEyODw8ZGV2LT5wY2llX21wc3MsIHBjaWVfZ2V0X3JlYWRycShkZXYpKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0ktRSBNYXggUGF5bG9hZCBTaXplIHNldCB0byAlNGQvJTRkICh3YXMgJTRkKSwgIgorCQkgIk1heCBSZWFkIFJxICU0ZFxuIiwgcGNpZV9nZXRfbXBzKGRldiksIDEyOCA8PCBkZXYtPnBjaWVfbXBzcywKKwkJIG9yaWdfbXBzLCBwY2llX2dldF9yZWFkcnEoZGV2KSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyogcGNpZV9idXNfY29uZmlndXJlX21wcyByZXF1aXJlcyB0aGF0IHBjaV93YWxrX2J1cyB3b3JrIGluIGEgdG9wLWRvd24sCisvKiBwY2llX2J1c19jb25maWd1cmVfc2V0dGluZ3MgcmVxdWlyZXMgdGhhdCBwY2lfd2Fsa19idXMgd29yayBpbiBhIHRvcC1kb3duLAogICogcGFyZW50cyB0aGVuIGNoaWxkcmVuIGZhc2hpb24uICBJZiB0aGlzIGNoYW5nZXMsIHRoZW4gdGhpcyBjb2RlIHdpbGwgbm90CiAgKiB3b3JrIGFzIGRlc2lnbmVkLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IGIyMzg1NmEuLjY0NzY1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMjc0NSwyMCArMjc0Niw2IEBACiAJLyogZGlzYWJsZSBtdXN0IGJlIGRvbmUgdmlhIGZ1bmN0aW9uICMwICovCiAJaWYgKFBDSV9GVU5DKGRldi0+ZGV2Zm4pKQogCQlyZXR1cm47Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4Q0IsICZkaXNhYmxlKTsKLQotCWlmIChkaXNhYmxlICYgMHgwMikKLQkJcmV0dXJuOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweENBLCAmd3JpdGVfZW5hYmxlKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweENBLCAweDU3KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweENCLCBkaXNhYmxlIHwgMHgwMik7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhDQSwgd3JpdGVfZW5hYmxlKTsKLQotCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAicHJvcHJpZXRhcnkgUmljb2ggTU1DIGNvbnRyb2xsZXIgZGlzYWJsZWQgKHZpYSBmaXJld2lyZSBmdW5jdGlvbilcbiIpOwotCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiTU1DIGNhcmRzIGFyZSBub3cgc3VwcG9ydGVkIGJ5IHN0YW5kYXJkIFNESENJIGNvbnRyb2xsZXJcbiIpOwotCiAJLyoKIAkgKiBSSUNPSCAweGU4MjMgU0QvTU1DIGNhcmQgcmVhZGVyIGZhaWxzIHRvIHJlY29nbml6ZQogCSAqIGNlcnRhaW4gdHlwZXMgb2YgU0QvTU1DIGNhcmRzLiBMb3dlcmluZyB0aGUgU0QgYmFzZQpAQCAtMjc4MSw2ICsyNzY4LDIwIEBACiAKIAkJZGV2X25vdGljZSgmZGV2LT5kZXYsICJNTUMgY29udHJvbGxlciBiYXNlIGZyZXF1ZW5jeSBjaGFuZ2VkIHRvIDUwTWh6LlxuIik7CiAJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweENCLCAmZGlzYWJsZSk7CisKKwlpZiAoZGlzYWJsZSAmIDB4MDIpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHhDQSwgJndyaXRlX2VuYWJsZSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhDQSwgMHg1Nyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhDQiwgZGlzYWJsZSB8IDB4MDIpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4Q0EsIHdyaXRlX2VuYWJsZSk7CisKKwlkZXZfbm90aWNlKCZkZXYtPmRldiwgInByb3ByaWV0YXJ5IFJpY29oIE1NQyBjb250cm9sbGVyIGRpc2FibGVkICh2aWEgZmlyZXdpcmUgZnVuY3Rpb24pXG4iKTsKKwlkZXZfbm90aWNlKCZkZXYtPmRldiwgIk1NQyBjYXJkcyBhcmUgbm93IHN1cHBvcnRlZCBieSBzdGFuZGFyZCBTREhDSSBjb250cm9sbGVyXG4iKTsKKwogfQogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9SNUM4MzIsIHJpY29oX21tY19maXh1cF9yNWM4MzIpOwogREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfUklDT0gsIFBDSV9ERVZJQ0VfSURfUklDT0hfUjVDODMyLCByaWNvaF9tbWNfZml4dXBfcjVjODMyKTsKQEAgLTI4MjIsNiArMjgyMyw4OSBAQAogfQogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9USSwgMHhiODAwLCBmaXh1cF90aTgxNnhfY2xhc3MpOwogCisvKiBTb21lIFBDSWUgZGV2aWNlcyBkbyBub3Qgd29yayByZWxpYWJseSB3aXRoIHRoZSBjbGFpbWVkIG1heGltdW0KKyAqIHBheWxvYWQgc2l6ZSBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBmaXh1cF9tcHNzXzI1NihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWRldi0+cGNpZV9tcHNzID0gMTsgLyogMjU2IGJ5dGVzICovCit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkJIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQV8wLCBmaXh1cF9tcHNzXzI1Nik7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkJIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQV8xLCBmaXh1cF9tcHNzXzI1Nik7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLAorCQkJIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQiwgZml4dXBfbXBzc18yNTYpOworCisvKiBJbnRlbCA1MDAwIGFuZCA1MTAwIE1lbW9yeSBjb250cm9sbGVycyBoYXZlIGFuIGVycmF0YSB3aXRoIHJlYWQgY29tcGxldGlvbgorICogY29hbGVzY2luZyAod2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9uIHNvbWUgQklPU2VzKSBhbmQgTVBTIG9mIDI1NkIuCisgKiBTaW5jZSB0aGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyB3aGF0IHRoZSBQQ0lFIE1QUyBvbiBlYWNoIGZhYnJpYyB3aWxsIGJlCisgKiB1bnRpbCBhbGwgb2YgdGhlIGRldmljZXMgYXJlIGRpc2NvdmVyZWQgYW5kIGJ1c2VzIHdhbGtlZCwgcmVhZCBjb21wbGV0aW9uCisgKiBjb2FsZXNjaW5nIG11c3QgYmUgZGlzYWJsZWQuICBVbmZvcnR1bmF0ZWx5LCBpdCBjYW5ub3QgYmUgcmUtZW5hYmxlZCBiZWNhdXNlCisgKiBpdCBpcyBwb3NzaWJsZSB0byBob3RwbHVnIGEgZGV2aWNlIHdpdGggTVBTIG9mIDI1NkIuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pbnRlbF9tY19lcnJhdGEoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgZXJyOworCXUxNiByY2M7CisKKwlpZiAocGNpZV9idXNfY29uZmlnID09IFBDSUVfQlVTX1RVTkVfT0ZGKQorCQlyZXR1cm47CisKKwkvKiBJbnRlbCBlcnJhdGEgc3BlY2lmaWVzIGJpdHMgdG8gY2hhbmdlIGJ1dCBkb2VzIG5vdCBzYXkgd2hhdCB0aGV5IGFyZS4KKwkgKiBLZWVwaW5nIHRoZW0gbWFnaWNhbCB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIHJlZ2lzdGVycyBhbmQgdmFsdWVzIGNhbgorCSAqIGJlIGV4cGxhaW5lZC4KKwkgKi8KKwllcnIgPSBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDgsICZyY2MpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIHJlYWQgIgorCQkJImNvbXBsZXRpb24gY29hbGVzY2luZyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEocmNjICYgKDEgPDwgMTApKSkKKwkJcmV0dXJuOworCisJcmNjICY9IH4oMSA8PCAxMCk7CisKKwllcnIgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQ4LCByY2MpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSByZWFkICIKKwkJCSJjb21wbGV0aW9uIGNvYWxlc2NpbmcgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2luZm9fb25jZSgiUmVhZCBjb21wbGV0aW9uIGNvYWxlc2NpbmcgZGlzYWJsZWQgZHVlIHRvIGhhcmR3YXJlICIKKwkJICAgICAiZXJyYXRhIHJlbGF0aW5nIHRvIDI1NkIgTVBTLlxuIik7Cit9CisvKiBJbnRlbCA1MDAwIHNlcmllcyBtZW1vcnkgY29udHJvbGxlcnMgYW5kIHBvcnRzIDItNyAqLworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVjMCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZDAsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWQ0LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVkOCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZTIsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWUzLCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVlNCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZTUsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWU2LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVlNywgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZjcsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNWY4LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjVmOSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI1ZmEsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CisvKiBJbnRlbCA1MTAwIHNlcmllcyBtZW1vcnkgY29udHJvbGxlcnMgYW5kIHBvcnRzIDItNyAqLworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVjMCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZTIsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWUzLCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVlNCwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZTUsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWU2LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVlNywgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZjcsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2NWY4LCBxdWlya19pbnRlbF9tY19lcnJhdGEpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NjVmOSwgcXVpcmtfaW50ZWxfbWNfZXJyYXRhKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDY1ZmEsIHF1aXJrX2ludGVsX21jX2VycmF0YSk7CisKIHN0YXRpYyB2b2lkIHBjaV9kb19maXh1cHMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9maXh1cCAqZiwKIAkJCSAgc3RydWN0IHBjaV9maXh1cCAqZW5kKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcm9tLmMgYi9kcml2ZXJzL3BjaS9yb20uYwppbmRleCAzNjg2NGE5Li40OGViZGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yb20uYworKysgYi9kcml2ZXJzL3BjaS9yb20uYwpAQCAtNyw2ICs3LDcgQEAKICAqIFBDSSBST00gYWNjZXNzIHJvdXRpbmVzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggNzg0ZGE5ZC4uODZiNjlmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC00MjYsNyArNDI2LDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQlJJREdFX0NPTlRST0wsIGJ1cy0+YnJpZGdlX2N0bCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKK3ZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXVuc2lnbmVkIGxvbmcgdHlwZSA9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSB8CiAJCQkJICBJT1JFU09VUkNFX1BSRUZFVENIOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwppbmRleCA1MWE5MDk1Li41NzE3NTA5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2xvdC5jIGIvZHJpdmVycy9wY2kvc2xvdC5jCmluZGV4IDk2OGNmZWEuLmFjNjQxMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Nsb3QuYworKysgYi9kcml2ZXJzL3BjaS9zbG90LmMKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgInBjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvdnBkLmMgYi9kcml2ZXJzL3BjaS92cGQuYwppbmRleCBhNWE1Y2ExLi4zOWI3OTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS92cGQuYworKysgYi9kcml2ZXJzL3BjaS92cGQuYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIGludCBwY2lfdnBkX2ZpbmRfdGFnKGNvbnN0IHU4ICpidWYsIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBsZW4sIHU4IHJkdCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RiMXh4eF9zcy5jIGIvZHJpdmVycy9wY21jaWEvZGIxeHh4X3NzLmMKaW5kZXggMDE3NTdmMS4uM2U0OWRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZGIxeHh4X3NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZGIxeHh4X3NzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKaW5kZXggZjU2ZDdkZS4uMjJhNzVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKQEAgLTk3LDcgKzk3LDcgQEAKIHN0YXRpYyBpbnQgYmFsbG9vbjNfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsCiAJCQkJICAgICAgIGNvbnN0IHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKIHsKLQlfX3Jhd193cml0ZXcoQkFMTE9PTjNfQ0ZfUkVTRVQsIEJBTExPT04zX0NGX0NPTlRST0xfUkVHIHwKKwlfX3Jhd193cml0ZXcoQkFMTE9PTjNfQ0ZfUkVTRVQsIEJBTExPT04zX0NGX0NPTlRST0xfUkVHICsKIAkJCSgoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpID8KIAkJCUJBTExPT04zX0ZQR0FfU0VUbkNMUiA6IDApKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCmluZGV4IDJjNTQwNTQuLmE4N2UyNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwpAQCAtMjMxLDYgKzIzMSw3IEBACiAKIAlfX3Jhd193cml0ZWwobWVjciwgTUVDUik7CiB9CitFWFBPUlRfU1lNQk9MKHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpza3RfbmFtZXNbXSA9IHsKIAkiUENNQ0lBIHNvY2tldCAwIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jCmluZGV4IDYzZjRkNTIuLjBiNGY5NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKaW5kZXggNmVlNDJiNC4uOTIzZjMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDJ4eC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyeHguYwppbmRleCA0ZjA5NTA2Li42ZTdkY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDJ4eC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94Mnh4LmMKQEAgLTEyLDkgKzEyLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKIGludCBjbXgyNTVfcGNtY2lhX2luaXQodm9pZCk7CiBpbnQgY214MjcwX3BjbWNpYV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92cGFjMjcwLmMKaW5kZXggZTk1NmY2NS4uNjZhYjkyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZwYWMyNzAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdnBhYzI3MC5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3ZwYWMyNzAuaD4KIAogI2luY2x1ZGUgInNvY19jb21tb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL0tjb25maWcKaW5kZXggZWY1NjY0NC4uZTE3ZTJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL0tjb25maWcKKysrIGIvZHJpdmVycy9waW5jdHJsL0tjb25maWcKQEAgLTIsMjMgKzIsMTcgQEAKICMgUElOQ1RSTCBpbmZyYXN0cnVjdHVyZSBhbmQgZHJpdmVycwogIwogCi1tZW51Y29uZmlnIFBJTkNUUkwKLQlib29sICJQSU5DVFJMIFN1cHBvcnQiCitjb25maWcgUElOQ1RSTAorCWJvb2wKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgUElOQ1RSTCBzdWJzeXN0ZW0gZm9yIGNvbnRyb2xsaW5nIHBpbnMKLQkgIG9uIGNoaXAgcGFja2FnZXMsIGZvciBleGFtcGxlIG11bHRpcGxleGluZyBwaW5zIG9uIHByaW1hcmlseQotCSAgUEdBIGFuZCBCR0EgcGFja2FnZXMgZm9yIHN5c3RlbXMgb24gY2hpcC4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogaWYgUElOQ1RSTAogCittZW51ICJQaW4gY29udHJvbGxlcnMiCisJZGVwZW5kcyBvbiBQSU5DVFJMCisKIGNvbmZpZyBQSU5NVVgKIAlib29sICJTdXBwb3J0IHBpbm11eCBjb250cm9sbGVycyIKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBwaW5jb250cm9sIHN1YnN5c3RlbSB0byBoYW5kbGUgcGluCi0JICBtdWx0aXBsZXhpbmcgZHJpdmVycy4KIAogY29uZmlnIERFQlVHX1BJTkNUUkwKIAlib29sICJEZWJ1ZyBQSU5DVFJMIGNhbGxzIgpAQCAtMzAsMTQgKzI0LDEyIEBACiAJYm9vbCAiQ1NSIFNpUkZwcmltYUlJIHBpbm11eCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1BSSU1BMgogCXNlbGVjdCBQSU5NVVgKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgU2lSRnByaW1hSUkgcGlubXV4IGRyaXZlcgogCiBjb25maWcgUElOTVVYX1UzMDAKIAlib29sICJVMzAwIHBpbm11eCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1UzMDAKIAlzZWxlY3QgUElOTVVYCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIFUzMDAgcGlubXV4IGRyaXZlcgorCitlbmRtZW51CiAKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvY29yZS5jIGIvZHJpdmVycy9waW5jdHJsL2NvcmUuYwppbmRleCA0MjM1MjJkLi5lYWRlZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvY29yZS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9jb3JlLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgInBpbmN0cmwgY29yZTogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZwppbmRleCAxMGNmMjUwLi43ZjQzY2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKQEAgLTYxLDE1ICs2MSwxOCBAQAogCWRlcGVuZHMgb24gSU5QVVQKIAlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEwgPSBuCiAJc2VsZWN0IElOUFVUX1NQQVJTRUtNQVAKKwlzZWxlY3QgSU5QVVRfUE9MTERFVgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgdGhlIG5ldyBMaW51eCBkcml2ZXIgZm9yIEFzdXMgbGFwdG9wcy4gSXQgbWF5IGFsc28gc3VwcG9ydCBzb21lCi0JICBNRURJT04sIEpWQyBvciBWSUNUT1IgbGFwdG9wcy4gSXQgbWFrZXMgYWxsIHRoZSBleHRyYSBidXR0b25zIGdlbmVyYXRlCi0JICBzdGFuZGFyZCBBQ1BJIGV2ZW50cyBhbmQgaW5wdXQgZXZlbnRzLiBJdCBhbHNvIGFkZHMKLQkgIHN1cHBvcnQgZm9yIHZpZGVvIG91dHB1dCBzd2l0Y2hpbmcsIExDRCBiYWNrbGlnaHQgY29udHJvbCwgQmx1ZXRvb3RoIGFuZAotCSAgV2xhbiBjb250cm9sLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgYWxsb3dzIHlvdSB0byBibGluayB0aG9zZSBmYW5jeSBMRURzLgorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQXN1cyBsYXB0b3BzLCBMZW5vdm8gU0wgYW5kIHRoZSBQZWdhdHJvbgorCSAgTHVjaWQgdGFibGV0LiBJdCBtYXkgYWxzbyBzdXBwb3J0IHNvbWUgTUVESU9OLCBKVkMgb3IgVklDVE9SCisJICBsYXB0b3BzLiBJdCBtYWtlcyBhbGwgdGhlIGV4dHJhIGJ1dHRvbnMgZ2VuZXJhdGUgc3RhbmRhcmQKKwkgIEFDUEkgZXZlbnRzIGFuZCBpbnB1dCBldmVudHMsIGFuZCBvbiB0aGUgTHVjaWQgdGhlIGJ1aWx0LWluCisJICBhY2NlbGVyb21ldGVyIGFwcGVhcnMgYXMgYW4gaW5wdXQgZGV2aWNlLiAgSXQgYWxzbyBhZGRzCisJICBzdXBwb3J0IGZvciB2aWRlbyBvdXRwdXQgc3dpdGNoaW5nLCBMQ0QgYmFja2xpZ2h0IGNvbnRyb2wsCisJICBCbHVldG9vdGggYW5kIFdsYW4gY29udHJvbCwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGFsbG93cyB5b3UKKwkgIHRvIGJsaW5rIHRob3NlIGZhbmN5IExFRHMuCiAKLQkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBhIHVzZXJzcGFjZSBkYWVtb24gZm9yIGhhbmRsaW5nIHRoZSBleHRyYQotCSAgYnV0dG9ucyBzZWUgPGh0dHA6Ly9hY3BpNGFzdXMuc2YubmV0Pi4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8aHR0cDovL2FjcGk0YXN1cy5zZi5uZXQ+LgogCiAJICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLWNvbXBhdGlibGUgQVNVUyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KIApAQCAtODAsOCArODMsMTAgQEAKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWRlcGVuZHMgb24gUkZLSUxMIHx8IFJGS0lMTCA9IG4KLQlkZXBlbmRzIG9uIFBPV0VSX1NVUFBMWQogCWRlcGVuZHMgb24gU0VSSU9fSTgwNDIKKwlzZWxlY3QgUE9XRVJfU1VQUExZCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTkVXX0xFRFMKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciByZmtpbGwgYW5kIGJhY2tsaWdodCBjb250cm9sIHRvIERlbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmluZGV4IGFmMmJiMjAuLmI4NDgyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwpAQCAtMTkwLDYgKzE5MCw3IEBACiAJQUNFUl9BTVcwLAogCUFDRVJfQU1XMF9WMiwKIAlBQ0VSX1dNSUQsCisJQUNFUl9XTUlEX3YyLAogfTsKIAogI2RlZmluZSBBQ0VSX0RFRkFVTFRfV0lSRUxFU1MgIDAKQEAgLTIwNSw2ICsyMDYsNyBAQAogc3RhdGljIGludCBmb3JjZV9zZXJpZXM7CiBzdGF0aWMgYm9vbCBlY19yYXdfbW9kZTsKIHN0YXRpYyBib29sIGhhc190eXBlX2FhOworc3RhdGljIHUxNiBjb21tdW5fZnVuY19iaXRtYXA7CiAKIG1vZHVsZV9wYXJhbShtYWlsbGVkLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMDQ0NCk7CkBAIC00NjQsNiArNDY2LDE1IEBACiAJCX0sCiAJCS5kcml2ZXJfZGF0YSA9ICZxdWlya19sZW5vdm9faWRlYXBhZF9zMjA1LAogCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkxlbm92byAzMDAwIE4yMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICIwNjg3QTMxIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICZxdWlya19mdWppdHN1X2FtaWxvX2xpXzE3MTgsCisJfSwKIAl7fQogfTsKIApAQCAtODY4LDYgKzg3OSwxNzQgQEAKIAlyZXR1cm4gV01JX2V4ZWN1dGVfdTMyKG1ldGhvZF9pZCwgKHUzMil2YWx1ZSwgTlVMTCk7CiB9CiAKK3N0YXRpYyBhY3BpX3N0YXR1cyB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MTYgZGV2aWNlKQoreworCXN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlIHJldHVybl92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmhvdGtleV9udW1iZXIgPSAweDAxLAorCQkuZGV2aWNlcyA9IGRldmljZSwKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dCA9IHsKKwkJc2l6ZW9mKHN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0pLAorCQkmcGFyYW1zCisJfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCisJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDIsICZpbnB1dCwgJm91dHB1dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJb2JqID0gb3V0cHV0LnBvaW50ZXI7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuIEFFX0VSUk9SOworCWVsc2UgaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCWtmcmVlKG9iaik7CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisJaWYgKG9iai0+YnVmZmVyLmxlbmd0aCAhPSA4KSB7CisJCXByX3dhcm4oIlVua25vd24gYnVmZmVyIGxlbmd0aCAlZFxuIiwgb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKQorCQlwcl93YXJuKCJHZXQgMHgleCBEZXZpY2UgU3RhdHVzIGZhaWxlZDogMHgleCAtIDB4JXhcbiIsCisJCQlkZXZpY2UsCisJCQlyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJCXJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCWVsc2UKKwkJKnZhbHVlID0gISEocmV0dXJuX3ZhbHVlLmRldmljZXMgJiBkZXZpY2UpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHdtaWRfdjJfZ2V0X3UzMih1MzIgKnZhbHVlLCB1MzIgY2FwKQoreworCXUxNiBkZXZpY2U7CisKKwlzd2l0Y2ggKGNhcCkgeworCWNhc2UgQUNFUl9DQVBfV0lSRUxFU1M6CisJCWRldmljZSA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTOworCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX0JMVUVUT09USDoKKwkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RIOworCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX1RIUkVFRzoKKwkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfVEhSRUVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCXJldHVybiB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cyh2YWx1ZSwgZGV2aWNlKTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHdtaWQzX3NldF9kZXZpY2Vfc3RhdHVzKHUzMiB2YWx1ZSwgdTE2IGRldmljZSkKK3sKKwlzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSByZXR1cm5fdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJdTE2IGRldmljZXM7CisJc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSBwYXJhbXMgPSB7CisJCS5mdW5jdGlvbl9udW0gPSAweDEsCisJCS5ob3RrZXlfbnVtYmVyID0gMHgwMSwKKwkJLmRldmljZXMgPSBjb21tdW5fZnVuY19iaXRtYXAsCisJfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7CisJCXNpemVvZihzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtKSwKKwkJJnBhcmFtcworCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0MiA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoV01JRF9HVUlEMywgMCwgMHgyLCAmaW5wdXQsICZvdXRwdXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCW9iaiA9IG91dHB1dC5wb2ludGVyOworCisJaWYgKCFvYmopCisJCXJldHVybiBBRV9FUlJPUjsKKwllbHNlIGlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlrZnJlZShvYmopOworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggIT0gOCkgeworCQlwcl93YXJuaW5nKCJVbmtub3duIGJ1ZmZlciBsZW5ndGggJWRcbiIsIG9iai0+YnVmZmVyLmxlbmd0aCk7CisJCWtmcmVlKG9iaik7CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisKKwlyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSAqKW9iai0+YnVmZmVyLnBvaW50ZXIpOworCWtmcmVlKG9iaik7CisKKwlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkgeworCQlwcl93YXJuaW5nKCJHZXQgQ3VycmVudCBEZXZpY2UgU3RhdHVzIGZhaWxlZDogIgorCQkJIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJCXJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWRldmljZXMgPSByZXR1cm5fdmFsdWUuZGV2aWNlczsKKwlwYXJhbXMuZnVuY3Rpb25fbnVtID0gMHgyOworCXBhcmFtcy5ob3RrZXlfbnVtYmVyID0gMHgwMTsKKwlwYXJhbXMuZGV2aWNlcyA9ICh2YWx1ZSkgPyAoZGV2aWNlcyB8IGRldmljZSkgOiAoZGV2aWNlcyAmIH5kZXZpY2UpOworCisJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDEsICZpbnB1dCwgJm91dHB1dDIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCW9iaiA9IG91dHB1dDIucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDQpIHsKKwkJcHJfd2FybmluZygiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLCBvYmotPmJ1ZmZlci5sZW5ndGgpOworCQlrZnJlZShvYmopOworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCisJcmV0dXJuX3ZhbHVlID0gKigoc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlrZnJlZShvYmopOworCisJaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCisJCXByX3dhcm5pbmcoIlNldCBEZXZpY2UgU3RhdHVzIGZhaWxlZDogIgorCQkJIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJCXJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHdtaWRfdjJfc2V0X3UzMih1MzIgdmFsdWUsIHUzMiBjYXApCit7CisJdTE2IGRldmljZTsKKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKKwkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfQkxVRVRPT1RIOgorCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfVEhSRUVHOgorCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisJcmV0dXJuIHdtaWQzX3NldF9kZXZpY2Vfc3RhdHVzKHZhbHVlLCBkZXZpY2UpOworfQorCiBzdGF0aWMgdm9pZCB0eXBlX2FhX2RtaV9kZWNvZGUoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmhlYWRlciwgdm9pZCAqZHVtbXkpCiB7CiAJc3RydWN0IGhvdGtleV9mdW5jdGlvbl90eXBlX2FhICp0eXBlX2FhOwpAQCAtODgxLDYgKzEwNjAsNyBAQAogCiAJcHJfaW5mbygiRnVuY3Rpb24gYml0bWFwIGZvciBDb21tdW5pY2F0aW9uIEJ1dHRvbjogMHgleFxuIiwKIAkJdHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwKTsKKwljb21tdW5fZnVuY19iaXRtYXAgPSB0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXA7CiAKIAlpZiAodHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwICYgQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MpCiAJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKQEAgLTkxMywxNyArMTA5MywxMyBAQAogCQlyZXR1cm4gQUVfRVJST1I7CiAJfQogCi0JZG1pX3dhbGsodHlwZV9hYV9kbWlfZGVjb2RlLCBOVUxMKTsKLQlpZiAoIWhhc190eXBlX2FhKSB7CisJcHJfaW5mbygiRnVuY3Rpb24gYml0bWFwIGZvciBDb21tdW5pY2F0aW9uIERldmljZTogMHgleFxuIiwgZGV2aWNlcyk7CisJaWYgKGRldmljZXMgJiAweDA3KQogCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfV0lSRUxFU1M7Ci0JCWlmIChkZXZpY2VzICYgMHg0MCkKLQkJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9USFJFRUc7Ci0JCWlmIChkZXZpY2VzICYgMHgxMCkKLQkJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CTFVFVE9PVEg7Ci0JfQotCi0JLyogV01JRCBhbHdheXMgcHJvdmlkZXMgYnJpZ2h0bmVzcyBtZXRob2RzICovCi0JaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JSSUdIVE5FU1M7CisJaWYgKGRldmljZXMgJiAweDQwKQorCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfVEhSRUVHOworCWlmIChkZXZpY2VzICYgMHgxMCkKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKIAogCWlmICghKGRldmljZXMgJiAweDIwKSkKIAkJbWF4X2JyaWdodG5lc3MgPSAweDk7CkBAIC05MzYsNiArMTExMiwxMCBAQAogCS50eXBlID0gQUNFUl9XTUlELAogfTsKIAorc3RhdGljIHN0cnVjdCB3bWlfaW50ZXJmYWNlIHdtaWRfdjJfaW50ZXJmYWNlID0geworCS50eXBlID0gQUNFUl9XTUlEX3YyLAorfTsKKwogLyoKICAqIEdlbmVyaWMgRGV2aWNlIChpbnRlcmZhY2UtaW5kZXBlbmRlbnQpCiAgKi8KQEAgLTk1Niw2ICsxMTM2LDE0IEBACiAJY2FzZSBBQ0VSX1dNSUQ6CiAJCXN0YXR1cyA9IFdNSURfZ2V0X3UzMih2YWx1ZSwgY2FwLCBpbnRlcmZhY2UpOwogCQlicmVhazsKKwljYXNlIEFDRVJfV01JRF92MjoKKwkJaWYgKGNhcCAmIChBQ0VSX0NBUF9XSVJFTEVTUyB8CisJCQkgICBBQ0VSX0NBUF9CTFVFVE9PVEggfAorCQkJICAgQUNFUl9DQVBfVEhSRUVHKSkKKwkJCXN0YXR1cyA9IHdtaWRfdjJfZ2V0X3UzMih2YWx1ZSwgY2FwKTsKKwkJZWxzZSBpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDIpKQorCQkJc3RhdHVzID0gV01JRF9nZXRfdTMyKHZhbHVlLCBjYXAsIGludGVyZmFjZSk7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBzdGF0dXM7CkBAIC05ODksNiArMTE3NywxMyBAQAogCQkJfQogCQljYXNlIEFDRVJfV01JRDoKIAkJCXJldHVybiBXTUlEX3NldF91MzIodmFsdWUsIGNhcCwgaW50ZXJmYWNlKTsKKwkJY2FzZSBBQ0VSX1dNSURfdjI6CisJCQlpZiAoY2FwICYgKEFDRVJfQ0FQX1dJUkVMRVNTIHwKKwkJCQkgICBBQ0VSX0NBUF9CTFVFVE9PVEggfAorCQkJCSAgIEFDRVJfQ0FQX1RIUkVFRykpCisJCQkJcmV0dXJuIHdtaWRfdjJfc2V0X3UzMih2YWx1ZSwgY2FwKTsKKwkJCWVsc2UgaWYgKHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQyKSkKKwkJCQlyZXR1cm4gV01JRF9zZXRfdTMyKHZhbHVlLCBjYXAsIGludGVyZmFjZSk7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAkJfQpAQCAtMTA5NSwxODYgKzEyOTAsNiBAQAogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihhY2VyX2JhY2tsaWdodF9kZXZpY2UpOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgd21pZDNfZ2V0X2RldmljZV9zdGF0dXModTMyICp2YWx1ZSwgdTE2IGRldmljZSkKLXsKLQlzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSByZXR1cm5fdmFsdWU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSBwYXJhbXMgPSB7Ci0JCS5mdW5jdGlvbl9udW0gPSAweDEsCi0JCS5ob3RrZXlfbnVtYmVyID0gMHgwMSwKLQkJLmRldmljZXMgPSBkZXZpY2UsCi0JfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7Ci0JCXNpemVvZihzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtKSwKLQkJJnBhcmFtcwotCX07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQotCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoV01JRF9HVUlEMywgMCwgMHgyLCAmaW5wdXQsICZvdXRwdXQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIHN0YXR1czsKLQotCW9iaiA9IG91dHB1dC5wb2ludGVyOwotCi0JaWYgKCFvYmopCi0JCXJldHVybiBBRV9FUlJPUjsKLQllbHNlIGlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlrZnJlZShvYmopOwotCQlyZXR1cm4gQUVfRVJST1I7Ci0JfQotCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggIT0gOCkgewotCQlwcl93YXJuKCJVbmtub3duIGJ1ZmZlciBsZW5ndGggJWRcbiIsIG9iai0+YnVmZmVyLmxlbmd0aCk7Ci0JCWtmcmVlKG9iaik7Ci0JCXJldHVybiBBRV9FUlJPUjsKLQl9Ci0KLQlyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSAqKW9iai0+YnVmZmVyLnBvaW50ZXIpOwotCWtmcmVlKG9iaik7Ci0KLQlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKLQkJcHJfd2FybigiR2V0IERldmljZSBTdGF0dXMgZmFpbGVkOiAweCV4IC0gMHgleFxuIiwKLQkJCXJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAotCQkJcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7Ci0JZWxzZQotCQkqdmFsdWUgPSAhIShyZXR1cm5fdmFsdWUuZGV2aWNlcyAmIGRldmljZSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgYWNwaV9zdGF0dXMgZ2V0X2RldmljZV9zdGF0dXModTMyICp2YWx1ZSwgdTMyIGNhcCkKLXsKLQlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7Ci0JCXUxNiBkZXZpY2U7Ci0KLQkJc3dpdGNoIChjYXApIHsKLQkJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKLQkJCWRldmljZSA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNFUl9DQVBfQkxVRVRPT1RIOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RIOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNFUl9DQVBfVEhSRUVHOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfVEhSRUVHOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gQUVfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHZhbHVlLCBkZXZpY2UpOwotCi0JfSBlbHNlIHsKLQkJcmV0dXJuIGdldF91MzIodmFsdWUsIGNhcCk7Ci0JfQotfQotCi1zdGF0aWMgYWNwaV9zdGF0dXMgd21pZDNfc2V0X2RldmljZV9zdGF0dXModTMyIHZhbHVlLCB1MTYgZGV2aWNlKQotewotCXN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlIHJldHVybl92YWx1ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQl1MTYgZGV2aWNlczsKLQlzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHBhcmFtcyA9IHsKLQkJLmZ1bmN0aW9uX251bSA9IDB4MSwKLQkJLmhvdGtleV9udW1iZXIgPSAweDAxLAotCQkuZGV2aWNlcyA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTIHwKLQkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcgfAotCQkJCUFDRVJfV01JRDNfR0RTX1dJTUFYIHwKLQkJCQlBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgsCi0JfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7Ci0JCXNpemVvZihzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtKSwKLQkJJnBhcmFtcwotCX07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0MiA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQotCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoV01JRF9HVUlEMywgMCwgMHgyLCAmaW5wdXQsICZvdXRwdXQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIHN0YXR1czsKLQotCW9iaiA9IG91dHB1dC5wb2ludGVyOwotCi0JaWYgKCFvYmopCi0JCXJldHVybiBBRV9FUlJPUjsKLQllbHNlIGlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlrZnJlZShvYmopOwotCQlyZXR1cm4gQUVfRVJST1I7Ci0JfQotCWlmIChvYmotPmJ1ZmZlci5sZW5ndGggIT0gOCkgewotCQlwcl93YXJuaW5nKCJVbmtub3duIGJ1ZmZlciBsZW5ndGggJWRcbiIsIG9iai0+YnVmZmVyLmxlbmd0aCk7Ci0JCWtmcmVlKG9iaik7Ci0JCXJldHVybiBBRV9FUlJPUjsKLQl9Ci0KLQlyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSAqKW9iai0+YnVmZmVyLnBvaW50ZXIpOwotCWtmcmVlKG9iaik7Ci0KLQlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkgewotCQlwcl93YXJuaW5nKCJHZXQgQ3VycmVudCBEZXZpY2UgU3RhdHVzIGZhaWxlZDogIgotCQkJIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKLQkJCXJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCWRldmljZXMgPSByZXR1cm5fdmFsdWUuZGV2aWNlczsKLQlwYXJhbXMuZnVuY3Rpb25fbnVtID0gMHgyOwotCXBhcmFtcy5ob3RrZXlfbnVtYmVyID0gMHgwMTsKLQlwYXJhbXMuZGV2aWNlcyA9ICh2YWx1ZSkgPyAoZGV2aWNlcyB8IGRldmljZSkgOiAoZGV2aWNlcyAmIH5kZXZpY2UpOwotCi0Jc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChXTUlEX0dVSUQzLCAwLCAweDEsICZpbnB1dCwgJm91dHB1dDIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIHN0YXR1czsKLQotCW9iaiA9IG91dHB1dDIucG9pbnRlcjsKLQotCWlmICghb2JqKQotCQlyZXR1cm4gQUVfRVJST1I7Ci0JZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJa2ZyZWUob2JqKTsKLQkJcmV0dXJuIEFFX0VSUk9SOwotCX0KLQlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDQpIHsKLQkJcHJfd2FybmluZygiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLCBvYmotPmJ1ZmZlci5sZW5ndGgpOwotCQlrZnJlZShvYmopOwotCQlyZXR1cm4gQUVfRVJST1I7Ci0JfQotCi0JcmV0dXJuX3ZhbHVlID0gKigoc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKLQlrZnJlZShvYmopOwotCi0JaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCi0JCXByX3dhcm5pbmcoIlNldCBEZXZpY2UgU3RhdHVzIGZhaWxlZDogIgotCQkJIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKLQkJCXJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGFjcGlfc3RhdHVzIHNldF9kZXZpY2Vfc3RhdHVzKHUzMiB2YWx1ZSwgdTMyIGNhcCkKLXsKLQlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7Ci0JCXUxNiBkZXZpY2U7Ci0KLQkJc3dpdGNoIChjYXApIHsKLQkJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKLQkJCWRldmljZSA9IEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNFUl9DQVBfQkxVRVRPT1RIOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RIOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNFUl9DQVBfVEhSRUVHOgotCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfVEhSRUVHOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gQUVfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIHdtaWQzX3NldF9kZXZpY2Vfc3RhdHVzKHZhbHVlLCBkZXZpY2UpOwotCi0JfSBlbHNlIHsKLQkJcmV0dXJuIHNldF91MzIodmFsdWUsIGNhcCk7Ci0JfQotfQotCiAvKgogICogUmZraWxsIGRldmljZXMKICAqLwpAQCAtMTI4NSwxMiArMTMwMCwxMyBAQAogCXUzMiBzdGF0ZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlzdGF0dXMgPSBnZXRfdTMyKCZzdGF0ZSwgQUNFUl9DQVBfV0lSRUxFU1MpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlpZiAocXVpcmtzLT53aXJlbGVzcyA9PSAzKSB7Ci0JCQlyZmtpbGxfc2V0X2h3X3N0YXRlKHdpcmVsZXNzX3Jma2lsbCwgIXN0YXRlKTsKLQkJfSBlbHNlIHsKLQkJCXJma2lsbF9zZXRfc3dfc3RhdGUod2lyZWxlc3NfcmZraWxsLCAhc3RhdGUpOworCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1dJUkVMRVNTKSkgeworCQlzdGF0dXMgPSBnZXRfdTMyKCZzdGF0ZSwgQUNFUl9DQVBfV0lSRUxFU1MpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWlmIChxdWlya3MtPndpcmVsZXNzID09IDMpCisJCQkJcmZraWxsX3NldF9od19zdGF0ZSh3aXJlbGVzc19yZmtpbGwsICFzdGF0ZSk7CisJCQllbHNlCisJCQkJcmZraWxsX3NldF9zd19zdGF0ZSh3aXJlbGVzc19yZmtpbGwsICFzdGF0ZSk7CiAJCX0KIAl9CiAKQEAgLTEzMDEsOCArMTMxNyw3IEBACiAJfQogCiAJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSAmJiB3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKLQkJc3RhdHVzID0gd21pZDNfZ2V0X2RldmljZV9zdGF0dXMoJnN0YXRlLAotCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyk7CisJCXN0YXR1cyA9IGdldF91MzIoJnN0YXRlLCBBQ0VSX1dNSUQzX0dEU19USFJFRUcpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHRocmVlZ19yZmtpbGwsICFzdGF0ZSk7CiAJfQpAQCAtMTMxNiw3ICsxMzMxLDcgQEAKIAl1MzIgY2FwID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKIAogCWlmIChyZmtpbGxfaW5pdGVkKSB7Ci0JCXN0YXR1cyA9IHNldF9kZXZpY2Vfc3RhdHVzKCFibG9ja2VkLCBjYXApOworCQlzdGF0dXMgPSBzZXRfdTMyKCFibG9ja2VkLCBjYXApOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMzQzLDcgKzEzNTgsNyBAQAogCWlmICghcmZraWxsX2RldikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlzdGF0dXMgPSBnZXRfZGV2aWNlX3N0YXR1cygmc3RhdGUsIGNhcCk7CisJc3RhdHVzID0gZ2V0X3UzMigmc3RhdGUsIGNhcCk7CiAKIAllcnIgPSByZmtpbGxfcmVnaXN0ZXIocmZraWxsX2Rldik7CiAJaWYgKGVycikgewpAQCAtMTM1OSwxOSArMTM3NCwyNCBAQAogCiBzdGF0aWMgaW50IGFjZXJfcmZraWxsX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXdpcmVsZXNzX3Jma2lsbCA9IGFjZXJfcmZraWxsX3JlZ2lzdGVyKGRldiwgUkZLSUxMX1RZUEVfV0xBTiwKLQkJImFjZXItd2lyZWxlc3MiLCBBQ0VSX0NBUF9XSVJFTEVTUyk7Ci0JaWYgKElTX0VSUih3aXJlbGVzc19yZmtpbGwpKQotCQlyZXR1cm4gUFRSX0VSUih3aXJlbGVzc19yZmtpbGwpOworCWludCBlcnI7CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpIHsKKwkJd2lyZWxlc3NfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LCBSRktJTExfVFlQRV9XTEFOLAorCQkJImFjZXItd2lyZWxlc3MiLCBBQ0VSX0NBUF9XSVJFTEVTUyk7CisJCWlmIChJU19FUlIod2lyZWxlc3NfcmZraWxsKSkgeworCQkJZXJyID0gUFRSX0VSUih3aXJlbGVzc19yZmtpbGwpOworCQkJZ290byBlcnJvcl93aXJlbGVzczsKKwkJfQorCX0KIAogCWlmIChoYXNfY2FwKEFDRVJfQ0FQX0JMVUVUT09USCkpIHsKIAkJYmx1ZXRvb3RoX3Jma2lsbCA9IGFjZXJfcmZraWxsX3JlZ2lzdGVyKGRldiwKIAkJCVJGS0lMTF9UWVBFX0JMVUVUT09USCwgImFjZXItYmx1ZXRvb3RoIiwKIAkJCUFDRVJfQ0FQX0JMVUVUT09USCk7CiAJCWlmIChJU19FUlIoYmx1ZXRvb3RoX3Jma2lsbCkpIHsKLQkJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7Ci0JCQlyZmtpbGxfZGVzdHJveSh3aXJlbGVzc19yZmtpbGwpOwotCQkJcmV0dXJuIFBUUl9FUlIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCQllcnIgPSBQVFJfRVJSKGJsdWV0b290aF9yZmtpbGwpOworCQkJZ290byBlcnJvcl9ibHVldG9vdGg7CiAJCX0KIAl9CiAKQEAgLTEzODAsMzAgKzE0MDAsNDQgQEAKIAkJCVJGS0lMTF9UWVBFX1dXQU4sICJhY2VyLXRocmVlZyIsCiAJCQlBQ0VSX0NBUF9USFJFRUcpOwogCQlpZiAoSVNfRVJSKHRocmVlZ19yZmtpbGwpKSB7Ci0JCQlyZmtpbGxfdW5yZWdpc3Rlcih3aXJlbGVzc19yZmtpbGwpOwotCQkJcmZraWxsX2Rlc3Ryb3kod2lyZWxlc3NfcmZraWxsKTsKLQkJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOwotCQkJcmZraWxsX2Rlc3Ryb3koYmx1ZXRvb3RoX3Jma2lsbCk7Ci0JCQlyZXR1cm4gUFRSX0VSUih0aHJlZWdfcmZraWxsKTsKKwkJCWVyciA9IFBUUl9FUlIodGhyZWVnX3Jma2lsbCk7CisJCQlnb3RvIGVycm9yX3RocmVlZzsKIAkJfQogCX0KIAogCXJma2lsbF9pbml0ZWQgPSB0cnVlOwogCi0JaWYgKGVjX3Jhd19tb2RlIHx8ICF3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpCisJaWYgKChlY19yYXdfbW9kZSB8fCAhd21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKSAmJgorCSAgICBoYXNfY2FwKEFDRVJfQ0FQX1dJUkVMRVNTIHwgQUNFUl9DQVBfQkxVRVRPT1RIIHwgQUNFUl9DQVBfVEhSRUVHKSkKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLAogCQkJcm91bmRfamlmZmllc19yZWxhdGl2ZShIWikpOwogCiAJcmV0dXJuIDA7CisKK2Vycm9yX3RocmVlZzoKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CTFVFVE9PVEgpKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCQlyZmtpbGxfZGVzdHJveShibHVldG9vdGhfcmZraWxsKTsKKwl9CitlcnJvcl9ibHVldG9vdGg6CisJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KHdpcmVsZXNzX3Jma2lsbCk7CisJfQorZXJyb3Jfd2lyZWxlc3M6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgYWNlcl9yZmtpbGxfZXhpdCh2b2lkKQogewotCWlmIChlY19yYXdfbW9kZSB8fCAhd21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKQorCWlmICgoZWNfcmF3X21vZGUgfHwgIXdtaV9oYXNfZ3VpZChBQ0VSV01JRF9FVkVOVF9HVUlEKSkgJiYKKwkgICAgaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUyB8IEFDRVJfQ0FQX0JMVUVUT09USCB8IEFDRVJfQ0FQX1RIUkVFRykpCiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWNlcl9yZmtpbGxfd29yayk7CiAKLQlyZmtpbGxfdW5yZWdpc3Rlcih3aXJlbGVzc19yZmtpbGwpOwotCXJma2lsbF9kZXN0cm95KHdpcmVsZXNzX3Jma2lsbCk7CisJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KHdpcmVsZXNzX3Jma2lsbCk7CisJfQogCiAJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkgewogCQlyZmtpbGxfdW5yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKQEAgLTE0MjgsMTEgKzE0NjIsNyBAQAogCiAJcHJfaW5mbygiVGhpcyB0aHJlZWcgc3lzZnMgd2lsbCBiZSByZW1vdmVkIGluIDIwMTIiCiAJCSIgLSB1c2VkIGJ5OiAlc1xuIiwgY3VycmVudC0+Y29tbSk7Ci0JaWYgKHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQzKSkKLQkJc3RhdHVzID0gd21pZDNfZ2V0X2RldmljZV9zdGF0dXMoJnJlc3VsdCwKLQkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcpOwotCWVsc2UKLQkJc3RhdHVzID0gZ2V0X3UzMigmcmVzdWx0LCBBQ0VSX0NBUF9USFJFRUcpOworCXN0YXR1cyA9IGdldF91MzIoJnJlc3VsdCwgQUNFUl9DQVBfVEhSRUVHKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCByZXN1bHQpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlJlYWQgZXJyb3JcbiIpOwpAQCAtMTQ2NCw2ICsxNDk0LDggQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiQU1XMCB2MlxuIik7CiAJY2FzZSBBQ0VSX1dNSUQ6CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIldNSURcbiIpOworCWNhc2UgQUNFUl9XTUlEX3YyOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJXTUlEIHYyXG4iKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gc3ByaW50ZihidWYsICJFcnJvciFcbiIpOwogCX0KQEAgLTE4ODMsMTIgKzE5MTUsMjAgQEAKIAlpZiAoIXdtaV9oYXNfZ3VpZChBTVcwX0dVSUQxKSAmJiB3bWlfaGFzX2d1aWQoV01JRF9HVUlEMSkpCiAJCWludGVyZmFjZSA9ICZ3bWlkX2ludGVyZmFjZTsKIAorCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpCisJCWludGVyZmFjZSA9ICZ3bWlkX3YyX2ludGVyZmFjZTsKKworCWlmIChpbnRlcmZhY2UpCisJCWRtaV93YWxrKHR5cGVfYWFfZG1pX2RlY29kZSwgTlVMTCk7CisKIAlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDIpICYmIGludGVyZmFjZSkgewotCQlpZiAoQUNQSV9GQUlMVVJFKFdNSURfc2V0X2NhcGFiaWxpdGllcygpKSkgeworCQlpZiAoIWhhc190eXBlX2FhICYmIEFDUElfRkFJTFVSRShXTUlEX3NldF9jYXBhYmlsaXRpZXMoKSkpIHsKIAkJCXByX2VycigiVW5hYmxlIHRvIGRldGVjdCBhdmFpbGFibGUgV01JRCBkZXZpY2VzXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JfSBlbHNlIGlmICghd21pX2hhc19ndWlkKFdNSURfR1VJRDIpICYmIGludGVyZmFjZSkgeworCQkvKiBXTUlEIGFsd2F5cyBwcm92aWRlcyBicmlnaHRuZXNzIG1ldGhvZHMgKi8KKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JSSUdIVE5FU1M7CisJfSBlbHNlIGlmICghd21pX2hhc19ndWlkKFdNSURfR1VJRDIpICYmIGludGVyZmFjZSAmJiAhaGFzX3R5cGVfYWEpIHsKIAkJcHJfZXJyKCJObyBXTUlEIGRldmljZSBkZXRlY3Rpb24gbWV0aG9kIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTkxMiw3ICsxOTUyLDcgQEAKIAogCXNldF9xdWlya3MoKTsKIAotCWlmIChhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkgJiYgaGFzX2NhcChBQ0VSX0NBUF9CUklHSFRORVNTKSkgeworCWlmIChhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKIAkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5ICY9IH5BQ0VSX0NBUF9CUklHSFRORVNTOwogCQlwcl9pbmZvKCJCcmlnaHRuZXNzIG11c3QgYmUgY29udHJvbGxlZCBieSAiCiAJCSAgICAgICAiZ2VuZXJpYyB2aWRlbyBkcml2ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMKaW5kZXggZmE2ZDdlYy4uZWRhY2NhZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYwpAQCAtNCw2ICs0LDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgSnVsaWVuIExlcm91Z2UsIDIwMDMtMjAwNiBLYXJvbCBLb3ppbW9yCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgQ29yZW50aW4gQ2hhcnkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgV2luZCBSaXZlciBTeXN0ZW1zCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ4LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KQEAgLTgzLDI2ICs4NSwzMiBAQAogc3RhdGljIGludCBibHVldG9vdGhfc3RhdHVzID0gMTsKIHN0YXRpYyBpbnQgd2ltYXhfc3RhdHVzID0gLTE7CiBzdGF0aWMgaW50IHd3YW5fc3RhdHVzID0gLTE7CitzdGF0aWMgaW50IGFsc19zdGF0dXM7CiAKIG1vZHVsZV9wYXJhbSh3bGFuX3N0YXR1cywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mod2xhbl9zdGF0dXMsICJTZXQgdGhlIHdpcmVsZXNzIHN0YXR1cyBvbiBib290ICIKIAkJICIoMCA9IGRpc2FibGVkLCAxID0gZW5hYmxlZCwgLTEgPSBkb24ndCBkbyBhbnl0aGluZykuICIKLQkJICJkZWZhdWx0IGlzIDEiKTsKKwkJICJkZWZhdWx0IGlzIC0xIik7CiAKIG1vZHVsZV9wYXJhbShibHVldG9vdGhfc3RhdHVzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhibHVldG9vdGhfc3RhdHVzLCAiU2V0IHRoZSB3aXJlbGVzcyBzdGF0dXMgb24gYm9vdCAiCiAJCSAiKDAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQsIC0xID0gZG9uJ3QgZG8gYW55dGhpbmcpLiAiCi0JCSAiZGVmYXVsdCBpcyAxIik7CisJCSAiZGVmYXVsdCBpcyAtMSIpOwogCiBtb2R1bGVfcGFyYW0od2ltYXhfc3RhdHVzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyh3aW1heF9zdGF0dXMsICJTZXQgdGhlIHdpcmVsZXNzIHN0YXR1cyBvbiBib290ICIKIAkJICIoMCA9IGRpc2FibGVkLCAxID0gZW5hYmxlZCwgLTEgPSBkb24ndCBkbyBhbnl0aGluZykuICIKLQkJICJkZWZhdWx0IGlzIDEiKTsKKwkJICJkZWZhdWx0IGlzIC0xIik7CiAKIG1vZHVsZV9wYXJhbSh3d2FuX3N0YXR1cywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mod3dhbl9zdGF0dXMsICJTZXQgdGhlIHdpcmVsZXNzIHN0YXR1cyBvbiBib290ICIKIAkJICIoMCA9IGRpc2FibGVkLCAxID0gZW5hYmxlZCwgLTEgPSBkb24ndCBkbyBhbnl0aGluZykuICIKLQkJICJkZWZhdWx0IGlzIDEiKTsKKwkJICJkZWZhdWx0IGlzIC0xIik7CisKK21vZHVsZV9wYXJhbShhbHNfc3RhdHVzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbHNfc3RhdHVzLCAiU2V0IHRoZSBBTFMgc3RhdHVzIG9uIGJvb3QgIgorCQkgIigwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkKS4gIgorCQkgImRlZmF1bHQgaXMgMCIpOwogCiAvKgogICogU29tZSBldmVudHMgd2UgdXNlLCBzYW1lIGZvciBhbGwgQXN1cwpAQCAtMTczLDYgKzE4MSwyOSBAQAogI2RlZmluZSBNRVRIT0RfS0JEX0xJR0hUX1NFVAkiU0xLQiIKICNkZWZpbmUgTUVUSE9EX0tCRF9MSUdIVF9HRVQJIkdMS0IiCiAKKy8qIEZvciBQZWdhdHJvbiBMdWNpZCB0YWJsZXQgKi8KKyNkZWZpbmUgREVWSUNFX05BTUVfUEVHQQkiTHVjaWQiCisKKyNkZWZpbmUgTUVUSE9EX1BFR0FfRU5BQkxFCSJFTlBSIgorI2RlZmluZSBNRVRIT0RfUEVHQV9ESVNBQkxFCSJEQVBSIgorI2RlZmluZSBQRUdBX1dMQU4JMHgwMAorI2RlZmluZSBQRUdBX0JMVUVUT09USAkweDAxCisjZGVmaW5lIFBFR0FfV1dBTgkweDAyCisjZGVmaW5lIFBFR0FfQUxTCTB4MDQKKyNkZWZpbmUgUEVHQV9BTFNfUE9XRVIJMHgwNQorCisjZGVmaW5lIE1FVEhPRF9QRUdBX1JFQUQJIlJETE4iCisjZGVmaW5lIFBFR0FfUkVBRF9BTFNfSAkweDAyCisjZGVmaW5lIFBFR0FfUkVBRF9BTFNfTAkweDAzCisKKyNkZWZpbmUgUEVHQV9BQ0NFTF9OQU1FICJwZWdhX2FjY2VsIgorI2RlZmluZSBQRUdBX0FDQ0VMX0RFU0MgIlBlZ2F0cm9uIEx1Y2lkIFRhYmxldCBBY2NlbGVyb21ldGVyIgorI2RlZmluZSBNRVRIT0RfWExSWCAiWExSWCIKKyNkZWZpbmUgTUVUSE9EX1hMUlkgIlhMUlkiCisjZGVmaW5lIE1FVEhPRF9YTFJaICJYTFJaIgorI2RlZmluZSBQRUdBX0FDQ19DTEFNUCA1MTIgLyogMUcgYWNjZWwgaXMgcmVwb3J0ZWQgYXMgfjI1Niwgc28gY2xhbXAgdG8gMkcgKi8KKyNkZWZpbmUgUEVHQV9BQ0NfUkVUUklFUyAzCisKIC8qCiAgKiBEZWZpbmUgYSBzcGVjaWZpYyBsZWQgc3RydWN0dXJlIHRvIGtlZXAgdGhlIG1haW4gc3RydWN0dXJlIGNsZWFuCiAgKi8KQEAgLTE4NSw2ICsyMTYsMTUgQEAKIH07CiAKIC8qCisgKiBTYW1lIHRoaW5nIGZvciByZmtpbGwKKyAqLworc3RydWN0IGFzdXNfcGVnYV9yZmtpbGwgeworCWludCBjb250cm9sX2lkOwkJLyogdHlwZSBvZiBjb250cm9sLiBNYXBzIHRvIFBFR0FfKiB2YWx1ZXMgKi8KKwlzdHJ1Y3QgcmZraWxsICpyZmtpbGw7CisJc3RydWN0IGFzdXNfbGFwdG9wICphc3VzOworfTsKKworLyoKICAqIFRoaXMgaXMgdGhlIG1haW4gc3RydWN0dXJlLCB3ZSBjYW4gdXNlIGl0IHRvIHN0b3JlIGFueXRoaW5nIGludGVyZXN0aW5nCiAgKiBhYm91dCB0aGUgaG90ayBkZXZpY2UKICAqLwpAQCAtMTk4LDYgKzIzOCw3IEBACiAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKIAlzdHJ1Y3Qga2V5X2VudHJ5ICprZXltYXA7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBlZ2FfYWNjZWxfcG9sbDsKIAogCXN0cnVjdCBhc3VzX2xlZCBtbGVkOwogCXN0cnVjdCBhc3VzX2xlZCB0bGVkOwpAQCAtMjA5LDkgKzI1MCwxOCBAQAogCiAJaW50IHdpcmVsZXNzX3N0YXR1czsKIAlib29sIGhhdmVfcnN0czsKKwlib29sIGlzX3BlZ2FfbHVjaWQ7CisJYm9vbCBwZWdhX2FjY19saXZlOworCWludCBwZWdhX2FjY194OworCWludCBwZWdhX2FjY195OworCWludCBwZWdhX2FjY196OwogCiAJc3RydWN0IHJma2lsbCAqZ3BzX3Jma2lsbDsKIAorCXN0cnVjdCBhc3VzX3BlZ2FfcmZraWxsIHdsYW5yZms7CisJc3RydWN0IGFzdXNfcGVnYV9yZmtpbGwgYnRyZms7CisJc3RydWN0IGFzdXNfcGVnYV9yZmtpbGwgd3dhbnJmazsKKwogCWFjcGlfaGFuZGxlIGhhbmRsZTsJLyogdGhlIGhhbmRsZSBvZiB0aGUgaG90ayBkZXZpY2UgKi8KIAl1MzIgbGVkZF9zdGF0dXM7CS8qIHN0YXR1cyBvZiB0aGUgTEVEIGRpc3BsYXkgKi8KIAl1OCBsaWdodF9sZXZlbDsJCS8qIGxpZ2h0IHNlbnNvciBsZXZlbCAqLwpAQCAtMzIzLDYgKzM3MywxMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgYXN1c19jaGVja19wZWdhX2x1Y2lkKHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKK3sKKwlyZXR1cm4gIXN0cmNtcChhc3VzLT5uYW1lLCBERVZJQ0VfTkFNRV9QRUdBKSAmJgorCSAgICFhY3BpX2NoZWNrX2hhbmRsZShhc3VzLT5oYW5kbGUsIE1FVEhPRF9QRUdBX0VOQUJMRSwgTlVMTCkgJiYKKwkgICAhYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfUEVHQV9ESVNBQkxFLCBOVUxMKSAmJgorCSAgICFhY3BpX2NoZWNrX2hhbmRsZShhc3VzLT5oYW5kbGUsIE1FVEhPRF9QRUdBX1JFQUQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGFzdXNfcGVnYV9sdWNpZF9zZXQoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzLCBpbnQgdW5pdCwgYm9vbCBlbmFibGUpCit7CisJY2hhciAqbWV0aG9kID0gZW5hYmxlID8gTUVUSE9EX1BFR0FfRU5BQkxFIDogTUVUSE9EX1BFR0FfRElTQUJMRTsKKwlyZXR1cm4gd3JpdGVfYWNwaV9pbnQoYXN1cy0+aGFuZGxlLCBtZXRob2QsIHVuaXQpOworfQorCitzdGF0aWMgaW50IHBlZ2FfYWNjX2F4aXMoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzLCBpbnQgY3VyciwgY2hhciAqbWV0aG9kKQoreworCWludCBpLCBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWZvciAoaSA9IDA7IGkgPCBQRUdBX0FDQ19SRVRSSUVTOyBpKyspIHsKKwkJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGFzdXMtPmhhbmRsZSwgbWV0aG9kLCBOVUxMLCAmdmFsKTsKKworCQkvKiBUaGUgb3V0cHV0IGlzIG5vaXN5LiAgRnJvbSByZWFkaW5nIHRoZSBBU0wKKwkJICogZGlzc2Fzc2VtYmx5LCB0aW1lb3V0IGVycm9ycyBhcmUgcmV0dXJuZWQgd2l0aCAxJ3MKKwkJICogaW4gdGhlIGhpZ2ggd29yZCwgYW5kIHRoZSBsYWNrIG9mIGxvY2tpbmcgYXJvdW5kCisJCSAqIHRoZWkgaGkvbG8gYnl0ZSByZWFkcyBtZWFucyB0aGF0IGEgdHJhbnNpdGlvbgorCQkgKiBiZXR3ZWVuIChmb3IgZXhhbXBsZSkgLTEgYW5kIDAgY291bGQgYmUgcmVhZCBhcworCQkgKiAweGZmMDAgb3IgMHgwMGZmLiAqLworCQlkZWx0YSA9IGFicyhjdXJyIC0gKHNob3J0KXZhbCk7CisJCWlmIChkZWx0YSA8IDEyOCAmJiAhKHZhbCAmIH4weGZmZmYpKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjbGFtcF92YWwoKHNob3J0KXZhbCwgLVBFR0FfQUNDX0NMQU1QLCBQRUdBX0FDQ19DTEFNUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlZ2FfYWNjZWxfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBkKQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGlwZC0+aW5wdXQtPmRldi5wYXJlbnQ7CisJc3RydWN0IGFzdXNfbGFwdG9wICphc3VzID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwkvKiBJbiBzb21lIGNhc2VzLCB0aGUgdmVyeSBmaXJzdCBjYWxsIHRvIHBvbGwgY2F1c2VzIGEKKwkgKiByZWN1cnNpdmUgZmF1bHQgdW5kZXIgdGhlIHBvbGxkZXYgd29ya2VyLiAgVGhpcyBpcworCSAqIGFwcGFyZW50bHkgcmVsYXRlZCB0byB2ZXJ5IGVhcmx5IHVzZXJzcGFjZSBhY2Nlc3MgdG8gdGhlCisJICogZGV2aWNlLCBhbmQgcGVyaGFwcyBhIGZpcm13YXJlIGJ1Zy4gRmFrZSB0aGUgZmlyc3QgcmVwb3J0LiAqLworCWlmICghYXN1cy0+cGVnYV9hY2NfbGl2ZSkgeworCQlhc3VzLT5wZWdhX2FjY19saXZlID0gdHJ1ZTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpcGQtPmlucHV0LCBBQlNfWCwgMCk7CisJCWlucHV0X3JlcG9ydF9hYnMoaXBkLT5pbnB1dCwgQUJTX1ksIDApOworCQlpbnB1dF9yZXBvcnRfYWJzKGlwZC0+aW5wdXQsIEFCU19aLCAwKTsKKwkJaW5wdXRfc3luYyhpcGQtPmlucHV0KTsKKwkJcmV0dXJuOworCX0KKworCWFzdXMtPnBlZ2FfYWNjX3ggPSBwZWdhX2FjY19heGlzKGFzdXMsIGFzdXMtPnBlZ2FfYWNjX3gsIE1FVEhPRF9YTFJYKTsKKwlhc3VzLT5wZWdhX2FjY195ID0gcGVnYV9hY2NfYXhpcyhhc3VzLCBhc3VzLT5wZWdhX2FjY195LCBNRVRIT0RfWExSWSk7CisJYXN1cy0+cGVnYV9hY2NfeiA9IHBlZ2FfYWNjX2F4aXMoYXN1cywgYXN1cy0+cGVnYV9hY2NfeiwgTUVUSE9EX1hMUlopOworCisJLyogTm90ZSB0cmFuc2Zvcm0sIGNvbnZlcnQgdG8gInJpZ2h0L3VwL291dCIgaW4gdGhlIG5hdGl2ZQorCSAqIGxhbmRzY2FwZSBvcmllbnRhdGlvbiAoaS5lLiB0aGUgdmVjdG9yIGlzIHRoZSBkaXJlY3Rpb24gb2YKKwkgKiAicmVhbCB1cCIgaW4gdGhlIGRldmljZSdzIGNhcnRpZXNpYW4gY29vcmRpbmF0ZXMpLiAqLworCWlucHV0X3JlcG9ydF9hYnMoaXBkLT5pbnB1dCwgQUJTX1gsIC1hc3VzLT5wZWdhX2FjY194KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlwZC0+aW5wdXQsIEFCU19ZLCAtYXN1cy0+cGVnYV9hY2NfeSk7CisJaW5wdXRfcmVwb3J0X2FicyhpcGQtPmlucHV0LCBBQlNfWiwgIGFzdXMtPnBlZ2FfYWNjX3opOworCWlucHV0X3N5bmMoaXBkLT5pbnB1dCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlZ2FfYWNjZWxfZXhpdChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMpCit7CisJaWYgKGFzdXMtPnBlZ2FfYWNjZWxfcG9sbCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYXN1cy0+cGVnYV9hY2NlbF9wb2xsKTsKKwkJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGFzdXMtPnBlZ2FfYWNjZWxfcG9sbCk7CisJfQorCWFzdXMtPnBlZ2FfYWNjZWxfcG9sbCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGVnYV9hY2NlbF9pbml0KHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICppcGQ7CisKKwlpZiAoIWFzdXMtPmlzX3BlZ2FfbHVjaWQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX1hMUlgsIE5VTEwpIHx8CisJICAgIGFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX1hMUlksIE5VTEwpIHx8CisJICAgIGFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX1hMUlosIE5VTEwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlwZCA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKKwlpZiAoIWlwZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcGQtPnBvbGwgPSBwZWdhX2FjY2VsX3BvbGw7CisJaXBkLT5wb2xsX2ludGVydmFsID0gMTI1OworCWlwZC0+cG9sbF9pbnRlcnZhbF9taW4gPSA1MDsKKwlpcGQtPnBvbGxfaW50ZXJ2YWxfbWF4ID0gMjAwMDsKKworCWlwZC0+aW5wdXQtPm5hbWUgPSBQRUdBX0FDQ0VMX0RFU0M7CisJaXBkLT5pbnB1dC0+cGh5cyA9IFBFR0FfQUNDRUxfTkFNRSAiL2lucHV0MCI7CisJaXBkLT5pbnB1dC0+ZGV2LnBhcmVudCA9ICZhc3VzLT5wbGF0Zm9ybV9kZXZpY2UtPmRldjsKKwlpcGQtPmlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisKKwlzZXRfYml0KEVWX0FCUywgaXBkLT5pbnB1dC0+ZXZiaXQpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlwZC0+aW5wdXQsIEFCU19YLAorCQkJICAgICAtUEVHQV9BQ0NfQ0xBTVAsIFBFR0FfQUNDX0NMQU1QLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpcGQtPmlucHV0LCBBQlNfWSwKKwkJCSAgICAgLVBFR0FfQUNDX0NMQU1QLCBQRUdBX0FDQ19DTEFNUCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaXBkLT5pbnB1dCwgQUJTX1osCisJCQkgICAgIC1QRUdBX0FDQ19DTEFNUCwgUEVHQV9BQ0NfQ0xBTVAsIDAsIDApOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShpcGQpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKworCWFzdXMtPnBlZ2FfYWNjZWxfcG9sbCA9IGlwZDsKKwlyZXR1cm4gMDsKKworZXhpdDoKKwlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoaXBkKTsKKwlyZXR1cm4gZXJyOworfQorCiAvKiBHZW5lcmljIExFRCBmdW5jdGlvbiAqLwogc3RhdGljIGludCBhc3VzX2xlZF9zZXQoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzLCBjb25zdCBjaGFyICptZXRob2QsCiAJCQkgaW50IHZhbHVlKQpAQCAtNDMwLDE3ICs2MDEsMTcgQEAKIAogc3RhdGljIHZvaWQgYXN1c19sZWRfZXhpdChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMpCiB7Ci0JaWYgKGFzdXMtPm1sZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPm1sZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5tbGVkLmxlZCk7Ci0JaWYgKGFzdXMtPnRsZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPnRsZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT50bGVkLmxlZCk7Ci0JaWYgKGFzdXMtPnBsZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPnBsZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5wbGVkLmxlZCk7Ci0JaWYgKGFzdXMtPnJsZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPnJsZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5ybGVkLmxlZCk7Ci0JaWYgKGFzdXMtPmdsZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPmdsZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5nbGVkLmxlZCk7Ci0JaWYgKGFzdXMtPmtsZWQubGVkLmRldikKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPmtsZWQubGVkLmRldikpCiAJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5rbGVkLmxlZCk7CiAJaWYgKGFzdXMtPmxlZF93b3JrcXVldWUpIHsKIAkJZGVzdHJveV93b3JrcXVldWUoYXN1cy0+bGVkX3dvcmtxdWV1ZSk7CkBAIC00NzQsNiArNjQ1LDEzIEBACiAJaW50IHI7CiAKIAkvKgorCSAqIFRoZSBQZWdhdHJvbiBMdWNpZCBoYXMgbm8gcGh5c2ljYWwgbGVkcywgYnV0IGFsbCBtZXRob2RzIGFyZQorCSAqIGF2YWlsYWJsZSBpbiB0aGUgRFNEVC4uLgorCSAqLworCWlmIChhc3VzLT5pc19wZWdhX2x1Y2lkKQorCQlyZXR1cm4gMDsKKworCS8qCiAJICogRnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgdXBkYXRlIHRoZSBMRUQncyBhcmUgY2FsbGVkIGZyb20gYQogCSAqIHdvcmtxdWV1ZS4gQnkgZG9pbmcgdGhpcyBhcyBzZXBhcmF0ZSB3b3JrIHJhdGhlciB0aGFuIHdoZW4gdGhlIExFRAogCSAqIHN1YnN5c3RlbSBhc2tzLCB3ZSBhdm9pZCBtZXNzaW5nIHdpdGggdGhlIEFzdXMgQUNQSSBzdHVmZiBkdXJpbmcgYQpAQCAtOTA3LDggKzEwODUsMTggQEAKICAqLwogc3RhdGljIHZvaWQgYXN1c19hbHNfc3dpdGNoKHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cywgaW50IHZhbHVlKQogewotCWlmICh3cml0ZV9hY3BpX2ludChhc3VzLT5oYW5kbGUsIE1FVEhPRF9BTFNfQ09OVFJPTCwgdmFsdWUpKQotCQlwcl93YXJuKCJFcnJvciBzZXR0aW5nIGxpZ2h0IHNlbnNvciBzd2l0Y2hcbiIpOworCWludCByZXQ7CisKKwlpZiAoYXN1cy0+aXNfcGVnYV9sdWNpZCkgeworCQlyZXQgPSBhc3VzX3BlZ2FfbHVjaWRfc2V0KGFzdXMsIFBFR0FfQUxTLCB2YWx1ZSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYXN1c19wZWdhX2x1Y2lkX3NldChhc3VzLCBQRUdBX0FMU19QT1dFUiwgdmFsdWUpOworCX0gZWxzZSB7CisJCXJldCA9IHdyaXRlX2FjcGlfaW50KGFzdXMtPmhhbmRsZSwgTUVUSE9EX0FMU19DT05UUk9MLCB2YWx1ZSk7CisJfQorCWlmIChyZXQpCisJCXByX3dhcm5pbmcoIkVycm9yIHNldHRpbmcgbGlnaHQgc2Vuc29yIHN3aXRjaFxuIik7CisKIAlhc3VzLT5saWdodF9zd2l0Y2ggPSB2YWx1ZTsKIH0KIApAQCAtOTY0LDYgKzExNTIsMzUgQEAKIAlyZXR1cm4gcnY7CiB9CiAKK3N0YXRpYyBpbnQgcGVnYV9pbnRfcmVhZChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMsIGludCBhcmcsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJaW50IGVyciA9IHdyaXRlX2FjcGlfaW50X3JldChhc3VzLT5oYW5kbGUsIE1FVEhPRF9QRUdBX1JFQUQsIGFyZywKKwkJCQkgICAgICZidWZmZXIpOworCWlmICghZXJyKSB7CisJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmogPSBidWZmZXIucG9pbnRlcjsKKwkJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCQkqcmVzdWx0ID0gb2JqLT5pbnRlZ2VyLnZhbHVlOworCQllbHNlCisJCQllcnIgPSAtRUlPOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2xzdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFzdXNfbGFwdG9wICphc3VzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVyciwgaGksIGxvOworCisJZXJyID0gcGVnYV9pbnRfcmVhZChhc3VzLCBQRUdBX1JFQURfQUxTX0gsICZoaSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHBlZ2FfaW50X3JlYWQoYXN1cywgUEVHQV9SRUFEX0FMU19MLCAmbG8pOworCWlmICghZXJyKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgMTAgKiBoaSArIGxvKTsKKwlyZXR1cm4gZXJyOworfQorCiAvKgogICogR1BTCiAgKi8KQEAgLTEwNjIsNiArMTI3OSw4NiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgcGVnYV9yZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKK3sKKwlzdHJ1Y3QgYXN1c19wZWdhX3Jma2lsbCAqcGVnYV9yZmsgPSBkYXRhOworCisJaW50IHJldCA9IGFzdXNfcGVnYV9sdWNpZF9zZXQocGVnYV9yZmstPmFzdXMsIHBlZ2FfcmZrLT5jb250cm9sX2lkLCAhYmxvY2tlZCk7CisJcHJfd2FybigiU2V0dGluZyByZmtpbGwgJWQsIHRvICVkOyByZXR1cm5lZCAlZFxuIiwgcGVnYV9yZmstPmNvbnRyb2xfaWQsICFibG9ja2VkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZmtpbGxfb3BzIHBlZ2FfcmZraWxsX29wcyA9IHsKKwkuc2V0X2Jsb2NrID0gcGVnYV9yZmtpbGxfc2V0LAorfTsKKworc3RhdGljIHZvaWQgcGVnYV9yZmtpbGxfdGVybWluYXRlKHN0cnVjdCBhc3VzX3BlZ2FfcmZraWxsICpwZWdhX3JmaykKK3sKKwlwcl93YXJuKCJUZXJtaW5hdGluZyAlZFxuIiwgcGVnYV9yZmstPmNvbnRyb2xfaWQpOworCWlmIChwZWdhX3Jmay0+cmZraWxsKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKHBlZ2FfcmZrLT5yZmtpbGwpOworCQlyZmtpbGxfZGVzdHJveShwZWdhX3Jmay0+cmZraWxsKTsKKwkJcGVnYV9yZmstPnJma2lsbCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBwZWdhX3Jma2lsbF9leGl0KHN0cnVjdCBhc3VzX2xhcHRvcCAqYXN1cykKK3sKKwlwZWdhX3Jma2lsbF90ZXJtaW5hdGUoJmFzdXMtPnd3YW5yZmspOworCXBlZ2FfcmZraWxsX3Rlcm1pbmF0ZSgmYXN1cy0+YnRyZmspOworCXBlZ2FfcmZraWxsX3Rlcm1pbmF0ZSgmYXN1cy0+d2xhbnJmayk7Cit9CisKK3N0YXRpYyBpbnQgcGVnYV9yZmtpbGxfc2V0dXAoc3RydWN0IGFzdXNfbGFwdG9wICphc3VzLCBzdHJ1Y3QgYXN1c19wZWdhX3Jma2lsbCAqcGVnYV9yZmssCisJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBjb250cm9saWQsIGludCByZmtpbGxfdHlwZSkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfd2FybigiU2V0dGluZyB1cCByZmsgJXMsIGNvbnRyb2wgJWQsIHR5cGUgJWRcbiIsIG5hbWUsIGNvbnRyb2xpZCwgcmZraWxsX3R5cGUpOworCXBlZ2FfcmZrLT5jb250cm9sX2lkID0gY29udHJvbGlkOworCXBlZ2FfcmZrLT5hc3VzID0gYXN1czsKKwlwZWdhX3Jmay0+cmZraWxsID0gcmZraWxsX2FsbG9jKG5hbWUsICZhc3VzLT5wbGF0Zm9ybV9kZXZpY2UtPmRldiwKKwkJCQkJcmZraWxsX3R5cGUsICZwZWdhX3Jma2lsbF9vcHMsIHBlZ2FfcmZrKTsKKwlpZiAoIXBlZ2FfcmZrLT5yZmtpbGwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKHBlZ2FfcmZrLT5yZmtpbGwpOworCWlmIChyZXN1bHQpIHsKKwkJcmZraWxsX2Rlc3Ryb3kocGVnYV9yZmstPnJma2lsbCk7CisJCXBlZ2FfcmZrLT5yZmtpbGwgPSBOVUxMOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcGVnYV9yZmtpbGxfaW5pdChzdHJ1Y3QgYXN1c19sYXB0b3AgKmFzdXMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZighYXN1cy0+aXNfcGVnYV9sdWNpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBwZWdhX3Jma2lsbF9zZXR1cChhc3VzLCAmYXN1cy0+d2xhbnJmaywgInBlZ2Etd2xhbiIsIFBFR0FfV0xBTiwgUkZLSUxMX1RZUEVfV0xBTik7CisJaWYocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHBlZ2FfcmZraWxsX3NldHVwKGFzdXMsICZhc3VzLT5idHJmaywgInBlZ2EtYnQiLCBQRUdBX0JMVUVUT09USCwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIKTsKKwlpZihyZXQpCisJCWdvdG8gZXJyX2J0cmZrOworCXJldCA9IHBlZ2FfcmZraWxsX3NldHVwKGFzdXMsICZhc3VzLT53d2FucmZrLCAicGVnYS13d2FuIiwgUEVHQV9XV0FOLCBSRktJTExfVFlQRV9XV0FOKTsKKwlpZihyZXQpCisJCWdvdG8gZXJyX3d3YW5yZms7CisKKwlwcl93YXJuKCJQZWdhIHJma2lsbCBpbml0IHN1Y2NlZWRlZFxuIik7CisJcmV0dXJuIDA7CitlcnJfd3dhbnJmazoKKwlwZWdhX3Jma2lsbF90ZXJtaW5hdGUoJmFzdXMtPmJ0cmZrKTsKK2Vycl9idHJmazoKKwlwZWdhX3Jma2lsbF90ZXJtaW5hdGUoJmFzdXMtPndsYW5yZmspOworCisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIElucHV0IGRldmljZSAoaS5lLiBob3RrZXlzKQogICovCkBAIC0xMTQxLDYgKzE0MzgsMTQgQEAKIAkJfQogCQlyZXR1cm4gOwogCX0KKworCS8qIEFjY2VsZXJvbWV0ZXIgImNvYXJzZSBvcmllbnRhdGlvbiBjaGFuZ2UiIGV2ZW50ICovCisJaWYgKGFzdXMtPnBlZ2FfYWNjZWxfcG9sbCAmJiBldmVudCA9PSAweEVBKSB7CisJCWtvYmplY3RfdWV2ZW50KCZhc3VzLT5wZWdhX2FjY2VsX3BvbGwtPmlucHV0LT5kZXYua29iaiwKKwkJCSAgICAgICBLT0JKX0NIQU5HRSk7CisJCXJldHVybiA7CisJfQorCiAJYXN1c19pbnB1dF9ub3RpZnkoYXN1cywgZXZlbnQpOwogfQogCkBAIC0xMTUyLDYgKzE0NTcsNyBAQAogc3RhdGljIERFVklDRV9BVFRSKHd3YW4sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3d3YW4sIHN0b3JlX3d3YW4pOwogc3RhdGljIERFVklDRV9BVFRSKGRpc3BsYXksIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2Rpc3ApOwogc3RhdGljIERFVklDRV9BVFRSKGxlZGQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2xlZGQsIHN0b3JlX2xlZGQpOworc3RhdGljIERFVklDRV9BVFRSKGxzX3ZhbHVlLCBTX0lSVUdPLCBzaG93X2xzdmFsdWUsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGxzX2xldmVsLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19sc2x2bCwgc3RvcmVfbHNsdmwpOwogc3RhdGljIERFVklDRV9BVFRSKGxzX3N3aXRjaCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfbHNzdywgc3RvcmVfbHNzdyk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZ3BzLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19ncHMsIHN0b3JlX2dwcyk7CkBAIC0xMTY0LDYgKzE0NzAsNyBAQAogCSZkZXZfYXR0cl93d2FuLmF0dHIsCiAJJmRldl9hdHRyX2Rpc3BsYXkuYXR0ciwKIAkmZGV2X2F0dHJfbGVkZC5hdHRyLAorCSZkZXZfYXR0cl9sc192YWx1ZS5hdHRyLAogCSZkZXZfYXR0cl9sc19sZXZlbC5hdHRyLAogCSZkZXZfYXR0cl9sc19zd2l0Y2guYXR0ciwKIAkmZGV2X2F0dHJfZ3BzLmF0dHIsCkBAIC0xMTgwLDYgKzE0ODcsMTkgQEAKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhc3VzLT5oYW5kbGU7CiAJYm9vbCBzdXBwb3J0ZWQ7CiAKKwlpZiAoYXN1cy0+aXNfcGVnYV9sdWNpZCkgeworCQkvKiBubyBsc19sZXZlbCBpbnRlcmZhY2Ugb24gdGhlIEx1Y2lkICovCisJCWlmIChhdHRyID09ICZkZXZfYXR0cl9sc19zd2l0Y2guYXR0cikKKwkJCXN1cHBvcnRlZCA9IHRydWU7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2xzX2xldmVsLmF0dHIpCisJCQlzdXBwb3J0ZWQgPSBmYWxzZTsKKwkJZWxzZQorCQkJZ290byBub3JtYWw7CisKKwkJcmV0dXJuIHN1cHBvcnRlZDsKKwl9CisKK25vcm1hbDoKIAlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfd2xhbi5hdHRyKSB7CiAJCXN1cHBvcnRlZCA9ICFhY3BpX2NoZWNrX2hhbmRsZShoYW5kbGUsIE1FVEhPRF9XTEFOLCBOVUxMKTsKIApAQCAtMTIwMiw4ICsxNTIyLDkgQEAKIAl9IGVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2xzX3N3aXRjaC5hdHRyIHx8CiAJCSAgIGF0dHIgPT0gJmRldl9hdHRyX2xzX2xldmVsLmF0dHIpIHsKIAkJc3VwcG9ydGVkID0gIWFjcGlfY2hlY2tfaGFuZGxlKGhhbmRsZSwgTUVUSE9EX0FMU19DT05UUk9MLCBOVUxMKSAmJgotCQkJICAgICFhY3BpX2NoZWNrX2hhbmRsZShoYW5kbGUsIE1FVEhPRF9BTFNfTEVWRUwsIE5VTEwpOwotCisJCQkhYWNwaV9jaGVja19oYW5kbGUoaGFuZGxlLCBNRVRIT0RfQUxTX0xFVkVMLCBOVUxMKTsKKwl9IGVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2xzX3ZhbHVlLmF0dHIpIHsKKwkJc3VwcG9ydGVkID0gYXN1cy0+aXNfcGVnYV9sdWNpZDsKIAl9IGVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2dwcy5hdHRyKSB7CiAJCXN1cHBvcnRlZCA9ICFhY3BpX2NoZWNrX2hhbmRsZShoYW5kbGUsIE1FVEhPRF9HUFNfT04sIE5VTEwpICYmCiAJCQkgICAgIWFjcGlfY2hlY2tfaGFuZGxlKGhhbmRsZSwgTUVUSE9EX0dQU19PRkYsIE5VTEwpICYmCkBAIC0xMjU4LDcgKzE1NzksNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gQVNVU19MQVBUT1BfRklMRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfQorCX0sCiB9OwogCiAvKgpAQCAtMTM4OCwxMSArMTcwOSwxMyBAQAogCWFzdXMtPmxlZGRfc3RhdHVzID0gMHhGRkY7CiAKIAkvKiBTZXQgaW5pdGlhbCB2YWx1ZXMgb2YgbGlnaHQgc2Vuc29yIGFuZCBsZXZlbCAqLwotCWFzdXMtPmxpZ2h0X3N3aXRjaCA9IDA7CS8qIERlZmF1bHQgdG8gbGlnaHQgc2Vuc29yIGRpc2FibGVkICovCisJYXN1cy0+bGlnaHRfc3dpdGNoID0gISFhbHNfc3RhdHVzOwogCWFzdXMtPmxpZ2h0X2xldmVsID0gNTsJLyogbGV2ZWwgNSBmb3Igc2Vuc29yIHNlbnNpdGl2aXR5ICovCiAKLQlpZiAoIWFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX0FMU19DT05UUk9MLCBOVUxMKSAmJgotCSAgICAhYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfQUxTX0xFVkVMLCBOVUxMKSkgeworCWlmIChhc3VzLT5pc19wZWdhX2x1Y2lkKSB7CisJCWFzdXNfYWxzX3N3aXRjaChhc3VzLCBhc3VzLT5saWdodF9zd2l0Y2gpOworCX0gZWxzZSBpZiAoIWFjcGlfY2hlY2tfaGFuZGxlKGFzdXMtPmhhbmRsZSwgTUVUSE9EX0FMU19DT05UUk9MLCBOVUxMKSAmJgorCQkgICAhYWNwaV9jaGVja19oYW5kbGUoYXN1cy0+aGFuZGxlLCBNRVRIT0RfQUxTX0xFVkVMLCBOVUxMKSkgewogCQlhc3VzX2Fsc19zd2l0Y2goYXN1cywgYXN1cy0+bGlnaHRfc3dpdGNoKTsKIAkJYXN1c19hbHNfbGV2ZWwoYXN1cywgYXN1cy0+bGlnaHRfbGV2ZWwpOwogCX0KQEAgLTE0MzksOSArMTc2MiwxMCBAQAogCQlnb3RvIGZhaWxfcGxhdGZvcm07CiAKIAkvKgotCSAqIFJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2UgZmlyc3QuICBJdCBpcyB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUKLQkgKiBzdWItZGV2aWNlcyBiZWxvdy4KKwkgKiBOZWVkIHBsYXRmb3JtIHR5cGUgZGV0ZWN0aW9uIGZpcnN0LCB0aGVuIHRoZSBwbGF0Zm9ybQorCSAqIGRldmljZS4gIEl0IGlzIHVzZWQgYXMgYSBwYXJlbnQgZm9yIHRoZSBzdWItZGV2aWNlcyBiZWxvdy4KIAkgKi8KKwlhc3VzLT5pc19wZWdhX2x1Y2lkID0gYXN1c19jaGVja19wZWdhX2x1Y2lkKGFzdXMpOwogCXJlc3VsdCA9IGFzdXNfcGxhdGZvcm1faW5pdChhc3VzKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGZhaWxfcGxhdGZvcm07CkBAIC0xNDY1LDkgKzE3ODksMjEgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGZhaWxfcmZraWxsOwogCisJcmVzdWx0ID0gcGVnYV9hY2NlbF9pbml0KGFzdXMpOworCWlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IC1FTk9ERVYpCisJCWdvdG8gZmFpbF9wZWdhX2FjY2VsOworCisJcmVzdWx0ID0gcGVnYV9yZmtpbGxfaW5pdChhc3VzKTsKKwlpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSAtRU5PREVWKQorCQlnb3RvIGZhaWxfcGVnYV9yZmtpbGw7CisKIAlhc3VzX2RldmljZV9wcmVzZW50ID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIAorZmFpbF9wZWdhX3Jma2lsbDoKKwlwZWdhX2FjY2VsX2V4aXQoYXN1cyk7CitmYWlsX3BlZ2FfYWNjZWw6CisJYXN1c19yZmtpbGxfZXhpdChhc3VzKTsKIGZhaWxfcmZraWxsOgogCWFzdXNfbGVkX2V4aXQoYXN1cyk7CiBmYWlsX2xlZDoKQEAgLTE0OTEsNiArMTgyNyw4IEBACiAJYXN1c19yZmtpbGxfZXhpdChhc3VzKTsKIAlhc3VzX2xlZF9leGl0KGFzdXMpOwogCWFzdXNfaW5wdXRfZXhpdChhc3VzKTsKKwlwZWdhX2FjY2VsX2V4aXQoYXN1cyk7CisJcGVnYV9yZmtpbGxfZXhpdChhc3VzKTsKIAlhc3VzX3BsYXRmb3JtX2V4aXQoYXN1cyk7CiAKIAlrZnJlZShhc3VzLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLXdtaS5jCmluZGV4IDk1Y2JhOWUuLmQxMDQ5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy13bWkuYwpAQCAtNDUzLDcgKzQ1Myw5IEBACiAKIHN0YXRpYyB2b2lkIGFzdXNfd21pX2xlZF9leGl0KHN0cnVjdCBhc3VzX3dtaSAqYXN1cykKIHsKLQlpZiAoYXN1cy0+dHBkX2xlZC5kZXYpCisJaWYgKCFJU19FUlJfT1JfTlVMTChhc3VzLT5rYmRfbGVkLmRldikpCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhc3VzLT5rYmRfbGVkKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGFzdXMtPnRwZF9sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFzdXMtPnRwZF9sZWQpOwogCWlmIChhc3VzLT5sZWRfd29ya3F1ZXVlKQogCQlkZXN0cm95X3dvcmtxdWV1ZShhc3VzLT5sZWRfd29ya3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCmluZGV4IGYzMWZhNGUuLmE0M2NmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwpAQCAtNjAsNiArNjAsMjIgQEAKIAlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4gdG9rZW5zW107CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgcXVpcmtfZW50cnkgeworCXU4IHRvdWNocGFkX2xlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVpcmtfZW50cnkgKnF1aXJrczsKKworc3RhdGljIHN0cnVjdCBxdWlya19lbnRyeSBxdWlya19kZWxsX3Zvc3Ryb192MTMwID0geworCS50b3VjaHBhZF9sZWQgPSAxLAorfTsKKworc3RhdGljIGludCBkbWlfbWF0Y2hlZChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pKQoreworCXF1aXJrcyA9IGRtaS0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgZGFfY29tbWFuZF9hZGRyZXNzOwogc3RhdGljIGludCBkYV9jb21tYW5kX2NvZGU7CiBzdGF0aWMgaW50IGRhX251bV90b2tlbnM7CkBAIC0xNDksNiArMTY1LDI3IEBACiAJe30KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2RldmluaXRkYXRhIGRlbGxfcXVpcmtzW10gPSB7CisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkRlbGwgVm9zdHJvIFYxMzAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8gVjEzMCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAmcXVpcmtfZGVsbF92b3N0cm9fdjEzMCwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gZG1pX21hdGNoZWQsCisJCS5pZGVudCA9ICJEZWxsIFZvc3RybyBWMTMxIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvIFYxMzEiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2RlbGxfdm9zdHJvX3YxMzAsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyICpidWZmZXI7CiBzdGF0aWMgc3RydWN0IHBhZ2UgKmJ1ZmZlcnBhZ2U7CiBzdGF0aWMgREVGSU5FX01VVEVYKGJ1ZmZlcl9tdXRleCk7CkBAIC01NTIsNiArNTg5LDQ0IEBACiAJLnVwZGF0ZV9zdGF0dXMgID0gZGVsbF9zZW5kX2ludGVuc2l0eSwKIH07CiAKK3N0YXRpYyB2b2lkIHRvdWNocGFkX2xlZF9vbigpCit7CisJaW50IGNvbW1hbmQgPSAweDk3OworCWNoYXIgZGF0YSA9IDE7CisJaTgwNDJfY29tbWFuZCgmZGF0YSwgY29tbWFuZCB8IDEgPDwgMTIpOworfQorCitzdGF0aWMgdm9pZCB0b3VjaHBhZF9sZWRfb2ZmKCkKK3sKKwlpbnQgY29tbWFuZCA9IDB4OTc7CisJY2hhciBkYXRhID0gMjsKKwlpODA0Ml9jb21tYW5kKCZkYXRhLCBjb21tYW5kIHwgMSA8PCAxMik7Cit9CisKK3N0YXRpYyB2b2lkIHRvdWNocGFkX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPiAwKQorCQl0b3VjaHBhZF9sZWRfb24oKTsKKwllbHNlCisJCXRvdWNocGFkX2xlZF9vZmYoKTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgdG91Y2hwYWRfbGVkID0geworCS5uYW1lID0gImRlbGwtbGFwdG9wOjp0b3VjaHBhZCIsCisJLmJyaWdodG5lc3Nfc2V0ID0gdG91Y2hwYWRfbGVkX3NldCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRvdWNocGFkX2xlZF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKGRldiwgJnRvdWNocGFkX2xlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHRvdWNocGFkX2xlZF9leGl0KHZvaWQpCit7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnRvdWNocGFkX2xlZCk7Cit9CisKIHN0YXRpYyBib29sIGRlbGxfbGFwdG9wX2k4MDQyX2ZpbHRlcih1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGNoYXIgc3RyLAogCQkJICAgICAgc3RydWN0IHNlcmlvICpwb3J0KQogewpAQCAtNTg0LDYgKzY1OSwxMCBAQAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShkZWxsX2RldmljZV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCisJcXVpcmtzID0gTlVMTDsKKwkvKiBmaW5kIGlmIHRoaXMgbWFjaGluZSBzdXBwb3J0IG90aGVyIGZ1bmN0aW9ucyAqLworCWRtaV9jaGVja19zeXN0ZW0oZGVsbF9xdWlya3MpOworCiAJZG1pX3dhbGsoZmluZF90b2tlbnMsIE5VTEwpOwogCiAJaWYgKCFkYV90b2tlbnMpICB7CkBAIC02MjYsNiArNzA1LDkgQEAKIAkJZ290byBmYWlsX2ZpbHRlcjsKIAl9CiAKKwlpZiAocXVpcmtzICYmIHF1aXJrcy0+dG91Y2hwYWRfbGVkKQorCQl0b3VjaHBhZF9sZWRfaW5pdCgmcGxhdGZvcm1fZGV2aWNlLT5kZXYpOworCiAJZGVsbF9sYXB0b3BfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJkZWxsX2xhcHRvcCIsIE5VTEwpOwogCWlmIChkZWxsX2xhcHRvcF9kaXIgIT0gTlVMTCkKIAkJZGVidWdmc19jcmVhdGVfZmlsZSgicmZraWxsIiwgMDQ0NCwgZGVsbF9sYXB0b3BfZGlyLCBOVUxMLApAQCAtNjkyLDYgKzc3NCw4IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZGVsbF9leGl0KHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRlbGxfbGFwdG9wX2Rpcik7CisJaWYgKHF1aXJrcyAmJiBxdWlya3MtPnRvdWNocGFkX2xlZCkKKwkJdG91Y2hwYWRfbGVkX2V4aXQoKTsKIAlpODA0Ml9yZW1vdmVfZmlsdGVyKGRlbGxfbGFwdG9wX2k4MDQyX2ZpbHRlcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZWxsX3Jma2lsbF93b3JrKTsKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKaW5kZXggMWM0NWQ5Mi4uZWE0NGFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKQEAgLTU2OCw3ICs1NjgsNyBAQAogCiBzdGF0aWMgdm9pZCBlZWVwY19sZWRfZXhpdChzdHJ1Y3QgZWVlcGNfbGFwdG9wICplZWVwYykKIHsKLQlpZiAoZWVlcGMtPnRwZF9sZWQuZGV2KQorCWlmICghSVNfRVJSX09SX05VTEwoZWVlcGMtPnRwZF9sZWQuZGV2KSkKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmVlZXBjLT50cGRfbGVkKTsKIAlpZiAoZWVlcGMtPmxlZF93b3JrcXVldWUpCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwX2FjY2VsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocF9hY2NlbC5jCmluZGV4IDFiNTJkMDAuLjIyYjJkZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2hwX2FjY2VsLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHBfYWNjZWwuYwpAQCAtNzYsNiArNzYsNyBAQAogLyogRm9yIGF1dG9tYXRpYyBpbnNlcnRpb24gb2YgdGhlIG1vZHVsZSAqLwogc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZV9pZCBsaXMzbHYwMmRfZGV2aWNlX2lkc1tdID0gewogCXsiSFBRMDAwNCIsIDB9LCAvKiBIUCBNb2JpbGUgRGF0YSBQcm90ZWN0aW9uIFN5c3RlbSBQTlAgKi8KKwl7IkhQUTYwMDAiLCAwfSwgLyogSFAgTW9iaWxlIERhdGEgUHJvdGVjdGlvbiBTeXN0ZW0gUE5QICovCiAJeyIiLCAwfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGxpczNsdjAyZF9kZXZpY2VfaWRzKTsKQEAgLTIwOSw2ICsyMTAsOCBAQAogCUFYSVNfRE1JX01BVENIKCJOQzY3MTV4IiwgIkhQIENvbXBhcSA2NzE1IiwgeV9pbnZlcnRlZCksCiAJQVhJU19ETUlfTUFUQ0goIk5DNjkzeHgiLCAiSFAgRWxpdGVCb29rIDY5MyIsIHh5X3JvdGF0ZWRfcmlnaHQpLAogCUFYSVNfRE1JX01BVENIKCJOQzY5M3h4IiwgIkhQIEVsaXRlQm9vayA4NTMiLCB4eV9zd2FwKSwKKwlBWElTX0RNSV9NQVRDSCgiTkM4NTR4eCIsICJIUCBFbGl0ZUJvb2sgODU0IiwgeV9pbnZlcnRlZCksCisJQVhJU19ETUlfTUFUQ0goIk5DMjczeHgiLCAiSFAgRWxpdGVCb29rIDI3MyIsIHlfaW52ZXJ0ZWQpLAogCS8qIEludGVsLWJhc2VkIEhQIFBhdmlsaW9uIGR2NSAqLwogCUFYSVNfRE1JX01BVENIMigiSFBEVjVfSSIsCiAJCQlQUk9EVUNUX05BTUUsICJIUCBQYXZpbGlvbiBkdjUiLApAQCAtMjI3LDcgKzIzMCwxMiBAQAogCUFYSVNfRE1JX01BVENIKCJIUEI0NTJ4IiwgIkhQIFByb0Jvb2sgNDUyIiwgeV9pbnZlcnRlZCksCiAJQVhJU19ETUlfTUFUQ0goIkhQQjUyMngiLCAiSFAgUHJvQm9vayA1MjIiLCB4eV9zd2FwKSwKIAlBWElTX0RNSV9NQVRDSCgiSFBCNTMyeCIsICJIUCBQcm9Cb29rIDUzMiIsIHlfaW52ZXJ0ZWQpLAorCUFYSVNfRE1JX01BVENIKCJIUEI2NTV4IiwgIkhQIFByb0Jvb2sgNjU1IiwgeHlfc3dhcF9pbnZlcnRlZCksCiAJQVhJU19ETUlfTUFUQ0goIk1pbmk1MTB4IiwgIkhQIE1pbmkgNTEwIiwgeHlfcm90YXRlZF9sZWZ0X3VzZCksCisJQVhJU19ETUlfTUFUQ0goIkhQQjYzeHgiLCAiSFAgUHJvQm9vayA2MyIsIHh5X3N3YXApLAorCUFYSVNfRE1JX01BVENIKCJIUEI2NHh4IiwgIkhQIFByb0Jvb2sgNjQiLCB4eV9zd2FwKSwKKwlBWElTX0RNSV9NQVRDSCgiSFBCNjR4eCIsICJIUCBFbGl0ZUJvb2sgODQiLCB4eV9zd2FwKSwKKwlBWElTX0RNSV9NQVRDSCgiSFBCNjV4eCIsICJIUCBQcm9Cb29rIDY1IiwgeF9pbnZlcnRlZCksCiAJeyBOVUxMLCB9CiAvKiBMYXB0b3AgbW9kZWxzIHdpdGhvdXQgYXhpcyBpbmZvICh5ZXQpOgogICogIk5DNjkxMCIgIkhQIENvbXBhcSA2OTEwIgpAQCAtMzIwLDcgKzMyOCw3IEBACiAJSU5JVF9XT1JLKCZocGxlZF9sZWQud29yaywgZGVsYXllZF9zZXRfc3RhdHVzX3dvcmtlcik7CiAJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKE5VTEwsICZocGxlZF9sZWQubGVkX2NsYXNzZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKCk7CisJCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKCZsaXMzX2Rldik7CiAJCWxpczNsdjAyZF9wb3dlcm9mZigmbGlzM19kZXYpOwogCQlmbHVzaF93b3JrKCZocGxlZF9sZWQud29yayk7CiAJCXJldHVybiByZXQ7CkBAIC0zMzQsNyArMzQyLDcgQEAKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSgpOworCWxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKCZsaXMzX2Rldik7CiAJbGlzM2x2MDJkX3Bvd2Vyb2ZmKCZsaXMzX2Rldik7CiAKIAlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmaHBsZWRfbGVkLmxlZF9jbGFzc2Rldik7CkBAIC0zNTQsOCArMzYyLDcgQEAKIAogc3RhdGljIGludCBsaXMzbHYwMmRfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWxpczNsdjAyZF9wb3dlcm9uKCZsaXMzX2Rldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGxpczNsdjAyZF9wb3dlcm9uKCZsaXMzX2Rldik7CiB9CiAjZWxzZQogI2RlZmluZSBsaXMzbHYwMmRfc3VzcGVuZCBOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYwppbmRleCAwYzU5NTQxLi5hMzZhZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2RlZmluZSBJREVBUEFEX1JGS0lMTF9ERVZfTlVNCSgzKQogCkBAIC00MiwxNSArNDQsNDEgQEAKICNkZWZpbmUgQ0ZHX1dJRklfQklUCSgxOCkKICNkZWZpbmUgQ0ZHX0NBTUVSQV9CSVQJKDE5KQogCitlbnVtIHsKKwlWUENDTURfUl9WUEMxID0gMHgxMCwKKwlWUENDTURfUl9CTF9NQVgsCisJVlBDQ01EX1JfQkwsCisJVlBDQ01EX1dfQkwsCisJVlBDQ01EX1JfV0lGSSwKKwlWUENDTURfV19XSUZJLAorCVZQQ0NNRF9SX0JULAorCVZQQ0NNRF9XX0JULAorCVZQQ0NNRF9SX0JMX1BPV0VSLAorCVZQQ0NNRF9SX05PVk8sCisJVlBDQ01EX1JfVlBDMiwKKwlWUENDTURfUl9UT1VDSFBBRCwKKwlWUENDTURfV19UT1VDSFBBRCwKKwlWUENDTURfUl9DQU1FUkEsCisJVlBDQ01EX1dfQ0FNRVJBLAorCVZQQ0NNRF9SXzNHLAorCVZQQ0NNRF9XXzNHLAorCVZQQ0NNRF9SX09ERCwgLyogMHgyMSAqLworCVZQQ0NNRF9SX1JGID0gMHgyMywKKwlWUENDTURfV19SRiwKKwlWUENDTURfV19CTF9QT1dFUiA9IDB4MzMsCit9OworCiBzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlIHsKIAlzdHJ1Y3QgcmZraWxsICpyZmtbSURFQVBBRF9SRktJTExfREVWX05VTV07CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2OwogCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGlnaHRkZXY7CisJc3RydWN0IGRlbnRyeSAqZGVidWc7CiAJdW5zaWduZWQgbG9uZyBjZmc7CiB9OwogCiBzdGF0aWMgYWNwaV9oYW5kbGUgaWRlYXBhZF9oYW5kbGU7CitzdGF0aWMgc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqaWRlYXBhZF9wcml2Owogc3RhdGljIGJvb2wgbm9fYnRfcmZraWxsOwogbW9kdWxlX3BhcmFtKG5vX2J0X3Jma2lsbCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vX2J0X3Jma2lsbCwgIk5vIHJma2lsbCBmb3IgYmx1ZXRvb3RoLiIpOwpAQCAtMTY0LDYgKzE5MiwxNDYgQEAKIH0KIAogLyoKKyAqIGRlYnVnZnMKKyAqLworI2RlZmluZSBERUJVR0ZTX0VWRU5UX0xFTiAoNDA5NikKK3N0YXRpYyBpbnQgZGVidWdmc19zdGF0dXNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTF9NQVgsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIkJhY2tsaWdodCBtYXg6XHQlbHVcbiIsIHZhbHVlKTsKKwlpZiAoIXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkwsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIkJhY2tsaWdodCBub3c6XHQlbHVcbiIsIHZhbHVlKTsKKwlpZiAoIXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkxfUE9XRVIsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIkJMIHBvd2VyIHZhbHVlOlx0JXNcbiIsIHZhbHVlID8gIk9uIiA6ICJPZmYiKTsKKwlzZXFfcHJpbnRmKHMsICI9PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKCFyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX1JGLCAmdmFsdWUpKQorCQlzZXFfcHJpbnRmKHMsICJSYWRpbyBzdGF0dXM6XHQlcyglbHUpXG4iLAorCQkJICAgdmFsdWUgPyAiT24iIDogIk9mZiIsIHZhbHVlKTsKKwlpZiAoIXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfV0lGSSwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiV2lmaSBzdGF0dXM6XHQlcyglbHUpXG4iLAorCQkJICAgdmFsdWUgPyAiT24iIDogIk9mZiIsIHZhbHVlKTsKKwlpZiAoIXJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQlQsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIkJUIHN0YXR1czpcdCVzKCVsdSlcbiIsCisJCQkgICB2YWx1ZSA/ICJPbiIgOiAiT2ZmIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl8zRywgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiM0cgc3RhdHVzOlx0JXMoJWx1KVxuIiwKKwkJCSAgIHZhbHVlID8gIk9uIiA6ICJPZmYiLCB2YWx1ZSk7CisJc2VxX3ByaW50ZihzLCAiPT09PT09PT09PT09PT09PT09PT09XG4iKTsKKworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9UT1VDSFBBRCwgJnZhbHVlKSkKKwkJc2VxX3ByaW50ZihzLCAiVG91Y2hwYWQgc3RhdHVzOiVzKCVsdSlcbiIsCisJCQkgICB2YWx1ZSA/ICJPbiIgOiAiT2ZmIiwgdmFsdWUpOworCWlmICghcmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9DQU1FUkEsICZ2YWx1ZSkpCisJCXNlcV9wcmludGYocywgIkNhbWVyYSBzdGF0dXM6XHQlcyglbHUpXG4iLAorCQkJICAgdmFsdWUgPyAiT24iIDogIk9mZiIsIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfc3RhdHVzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfc3RhdHVzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX3N0YXR1c19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gZGVidWdmc19zdGF0dXNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZGVidWdmc19jZmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJaWYgKCFpZGVhcGFkX3ByaXYpIHsKKwkJc2VxX3ByaW50ZihzLCAiY2ZnOiBOL0FcbiIpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYocywgImNmZzogMHglLjhsWFxuXG5DYXBhYmlsaXR5OiAiLAorCQkJICAgaWRlYXBhZF9wcml2LT5jZmcpOworCQlpZiAodGVzdF9iaXQoQ0ZHX0JUX0JJVCwgJmlkZWFwYWRfcHJpdi0+Y2ZnKSkKKwkJCXNlcV9wcmludGYocywgIkJsdWV0b290aCAiKTsKKwkJaWYgKHRlc3RfYml0KENGR18zR19CSVQsICZpZGVhcGFkX3ByaXYtPmNmZykpCisJCQlzZXFfcHJpbnRmKHMsICIzRyAiKTsKKwkJaWYgKHRlc3RfYml0KENGR19XSUZJX0JJVCwgJmlkZWFwYWRfcHJpdi0+Y2ZnKSkKKwkJCXNlcV9wcmludGYocywgIldpcmVsZXNzICIpOworCQlpZiAodGVzdF9iaXQoQ0ZHX0NBTUVSQV9CSVQsICZpZGVhcGFkX3ByaXYtPmNmZykpCisJCQlzZXFfcHJpbnRmKHMsICJDYW1lcmEgIik7CisJCXNlcV9wcmludGYocywgIlxuR3JhcGhpYzogIik7CisJCXN3aXRjaCAoKGlkZWFwYWRfcHJpdi0+Y2ZnKSYweDcwMCkgeworCQljYXNlIDB4MTAwOgorCQkJc2VxX3ByaW50ZihzLCAiSW50ZWwiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjAwOgorCQkJc2VxX3ByaW50ZihzLCAiQVRJIik7CisJCQlicmVhazsKKwkJY2FzZSAweDMwMDoKKwkJCXNlcV9wcmludGYocywgIk52aWRpYSIpOworCQkJYnJlYWs7CisJCWNhc2UgMHg0MDA6CisJCQlzZXFfcHJpbnRmKHMsICJJbnRlbCBhbmQgQVRJIik7CisJCQlicmVhazsKKwkJY2FzZSAweDUwMDoKKwkJCXNlcV9wcmludGYocywgIkludGVsIGFuZCBOdmlkaWEiKTsKKwkJCWJyZWFrOworCQl9CisJCXNlcV9wcmludGYocywgIlxuIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfY2ZnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfY2ZnX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2NmZ19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gZGVidWdmc19jZmdfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlkZWFwYWRfZGVidWdmc19pbml0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGRlbnRyeSAqbm9kZTsKKworCXByaXYtPmRlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJpZGVhcGFkIiwgTlVMTCk7CisJaWYgKHByaXYtPmRlYnVnID09IE5VTEwpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5Iik7CisJCWdvdG8gZXJyb3V0OworCX0KKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjZmciLCBTX0lSVUdPLCBwcml2LT5kZWJ1ZywgTlVMTCwKKwkJCQkgICAmZGVidWdmc19jZmdfZm9wcyk7CisJaWYgKCFub2RlKSB7CisJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0ZSBjZmcgaW4gZGVidWdmcyIpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlub2RlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhdHVzIiwgU19JUlVHTywgcHJpdi0+ZGVidWcsIE5VTEwsCisJCQkJICAgJmRlYnVnZnNfc3RhdHVzX2ZvcHMpOworCWlmICghbm9kZSkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgZXZlbnQgaW4gZGVidWdmcyIpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBpZGVhcGFkX2RlYnVnZnNfZXhpdChzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShwcml2LT5kZWJ1Zyk7CisJcHJpdi0+ZGVidWcgPSBOVUxMOworfQorCisvKgogICogc3lzZnMKICAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pZGVhcGFkX2NhbShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xNzIsNyArMzQwLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MUQsICZyZXN1bHQpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0NBTUVSQSwgJnJlc3VsdCkpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIi0xXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHJlc3VsdCk7CiB9CkBAIC0xODcsNyArMzU1LDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKHNzY2FuZihidWYsICIlaSIsICZzdGF0ZSkgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0ID0gd3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCAweDFFLCBzdGF0ZSk7CisJcmV0ID0gd3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfV19DQU1FUkEsIHN0YXRlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlyZXR1cm4gY291bnQ7CkBAIC0xOTUsMjAgKzM2Myw4IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihjYW1lcmFfcG93ZXIsIDA2NDQsIHNob3dfaWRlYXBhZF9jYW0sIHN0b3JlX2lkZWFwYWRfY2FtKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19pZGVhcGFkX2NmZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JS44bFhcbiIsIHByaXYtPmNmZyk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihjZmcsIDA0NDQsIHNob3dfaWRlYXBhZF9jZmcsIE5VTEwpOwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWRlYXBhZF9hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2NhbWVyYV9wb3dlci5hdHRyLAotCSZkZXZfYXR0cl9jZmcuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0yNDQsOSArNDAwLDkgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBpZGVhcGFkX3Jma19kYXRhIGlkZWFwYWRfcmZrX2RhdGFbXSA9IHsKLQl7ICJpZGVhcGFkX3dsYW4iLCAgICAgIENGR19XSUZJX0JJVCwgMHgxNSwgUkZLSUxMX1RZUEVfV0xBTiB9LAotCXsgImlkZWFwYWRfYmx1ZXRvb3RoIiwgQ0ZHX0JUX0JJVCwgICAweDE3LCBSRktJTExfVFlQRV9CTFVFVE9PVEggfSwKLQl7ICJpZGVhcGFkXzNnIiwgICAgICAgIENGR18zR19CSVQsICAgMHgyMCwgUkZLSUxMX1RZUEVfV1dBTiB9LAorCXsgImlkZWFwYWRfd2xhbiIsICAgIENGR19XSUZJX0JJVCwgVlBDQ01EX1dfV0lGSSwgUkZLSUxMX1RZUEVfV0xBTiB9LAorCXsgImlkZWFwYWRfYmx1ZXRvb3RoIiwgQ0ZHX0JUX0JJVCwgVlBDQ01EX1dfQlQsIFJGS0lMTF9UWVBFX0JMVUVUT09USCB9LAorCXsgImlkZWFwYWRfM2ciLCAgICAgICAgQ0ZHXzNHX0JJVCwgVlBDQ01EX1dfM0csIFJGS0lMTF9UWVBFX1dXQU4gfSwKIH07CiAKIHN0YXRpYyBpbnQgaWRlYXBhZF9yZmtfc2V0KHZvaWQgKmRhdGEsIGJvb2wgYmxvY2tlZCkKQEAgLTI2MCwxMyArNDE2LDEyIEBACiAJLnNldF9ibG9jayA9IGlkZWFwYWRfcmZrX3NldCwKIH07CiAKLXN0YXRpYyB2b2lkIGlkZWFwYWRfc3luY19yZmtfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlKQorc3RhdGljIHZvaWQgaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQogewotCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAJdW5zaWduZWQgbG9uZyBod19ibG9ja2VkOwogCWludCBpOwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgyMywgJmh3X2Jsb2NrZWQpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX1JGLCAmaHdfYmxvY2tlZCkpCiAJCXJldHVybjsKIAlod19ibG9ja2VkID0gIWh3X2Jsb2NrZWQ7CiAKQEAgLTM2Myw4ICs1MTgsMTAgQEAKICAqIGlucHV0IGRldmljZQogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGtleV9lbnRyeSBpZGVhcGFkX2tleW1hcFtdID0gewotCXsgS0VfS0VZLCAweDA2LCB7IEtFWV9TV0lUQ0hWSURFT01PREUgfSB9LAotCXsgS0VfS0VZLCAweDBELCB7IEtFWV9XTEFOIH0gfSwKKwl7IEtFX0tFWSwgNiwgIHsgS0VZX1NXSVRDSFZJREVPTU9ERSB9IH0sCisJeyBLRV9LRVksIDEzLCB7IEtFWV9XTEFOIH0gfSwKKwl7IEtFX0tFWSwgMTYsIHsgS0VZX1BST0cxIH0gfSwKKwl7IEtFX0tFWSwgMTcsIHsgS0VZX1BST0cyIH0gfSwKIAl7IEtFX0VORCwgMCB9LAogfTsKIApAQCAtNDE5LDYgKzU3NiwxOCBAQAogCXNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50KHByaXYtPmlucHV0ZGV2LCBzY2FuY29kZSwgMSwgdHJ1ZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGlkZWFwYWRfaW5wdXRfbm92b2tleShzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZ19wcmVzc2VkOworCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfTk9WTywgJmxvbmdfcHJlc3NlZCkpCisJCXJldHVybjsKKwlpZiAobG9uZ19wcmVzc2VkKQorCQlpZGVhcGFkX2lucHV0X3JlcG9ydChwcml2LCAxNyk7CisJZWxzZQorCQlpZGVhcGFkX2lucHV0X3JlcG9ydChwcml2LCAxNik7Cit9CisKIC8qCiAgKiBiYWNrbGlnaHQKICAqLwpAQCAtNDI2LDE2ICs1OTUsMTcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MTIsICZub3cpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMLCAmbm93KSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIG5vdzsKIH0KIAogc3RhdGljIGludCBpZGVhcGFkX2JhY2tsaWdodF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGlnaHRkZXYpCiB7Ci0JaWYgKHdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwgMHgxMywgYmxpZ2h0ZGV2LT5wcm9wcy5icmlnaHRuZXNzKSkKKwlpZiAod3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfV19CTCwKKwkJCSBibGlnaHRkZXYtPnByb3BzLmJyaWdodG5lc3MpKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAod3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCAweDMzLAorCWlmICh3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9XX0JMX1BPV0VSLAogCQkJIGJsaWdodGRldi0+cHJvcHMucG93ZXIgPT0gRkJfQkxBTktfUE9XRVJET1dOID8gMCA6IDEpKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNDUzLDExICs2MjMsMTEgQEAKIAlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CiAJdW5zaWduZWQgbG9uZyBtYXgsIG5vdywgcG93ZXI7CiAKLQlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDExLCAmbWF4KSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTF9NQVgsICZtYXgpKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDEyLCAmbm93KSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBWUENDTURfUl9CTCwgJm5vdykpCiAJCXJldHVybiAtRUlPOwotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MTgsICZwb3dlcikpCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgVlBDQ01EX1JfQkxfUE9XRVIsICZwb3dlcikpCiAJCXJldHVybiAtRUlPOwogCiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwpAQCAtNDkzLDcgKzY2Myw5IEBACiAJdW5zaWduZWQgbG9uZyBwb3dlcjsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxpZ2h0ZGV2ID0gcHJpdi0+YmxpZ2h0ZGV2OwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxOCwgJnBvd2VyKSkKKwlpZiAoIWJsaWdodGRldikKKwkJcmV0dXJuOworCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMX1BPV0VSLCAmcG93ZXIpKQogCQlyZXR1cm47CiAJYmxpZ2h0ZGV2LT5wcm9wcy5wb3dlciA9IHBvd2VyID8gRkJfQkxBTktfVU5CTEFOSyA6IEZCX0JMQU5LX1BPV0VSRE9XTjsKIH0KQEAgLTUwNCw3ICs2NzYsNyBAQAogCiAJLyogaWYgd2UgY29udHJvbCBicmlnaHRuZXNzIHZpYSBhY3BpIHZpZGVvIGRyaXZlciAqLwogCWlmIChwcml2LT5ibGlnaHRkZXYgPT0gTlVMTCkgewotCQlyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MTIsICZub3cpOworCQlyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIFZQQ0NNRF9SX0JMLCAmbm93KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTMzLDYgKzcwNSw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldiwgcHJpdik7CisJaWRlYXBhZF9wcml2ID0gcHJpdjsKIAlpZGVhcGFkX2hhbmRsZSA9IGFkZXZpY2UtPmhhbmRsZTsKIAlwcml2LT5jZmcgPSBjZmc7CiAKQEAgLTU0MCw2ICs3MTMsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIHBsYXRmb3JtX2ZhaWxlZDsKIAorCXJldCA9IGlkZWFwYWRfZGVidWdmc19pbml0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gZGVidWdmc19mYWlsZWQ7CisKIAlyZXQgPSBpZGVhcGFkX2lucHV0X2luaXQocHJpdik7CiAJaWYgKHJldCkKIAkJZ290byBpbnB1dF9mYWlsZWQ7CkBAIC01NTAsNyArNzI3LDcgQEAKIAkJZWxzZQogCQkJcHJpdi0+cmZrW2ldID0gTlVMTDsKIAl9Ci0JaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwlpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKHByaXYpOwogCiAJaWYgKCFhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKIAkJcmV0ID0gaWRlYXBhZF9iYWNrbGlnaHRfaW5pdChwcml2KTsKQEAgLTU2NSw2ICs3NDIsOCBAQAogCQlpZGVhcGFkX3VucmVnaXN0ZXJfcmZraWxsKGFkZXZpY2UsIGkpOwogCWlkZWFwYWRfaW5wdXRfZXhpdChwcml2KTsKIGlucHV0X2ZhaWxlZDoKKwlpZGVhcGFkX2RlYnVnZnNfZXhpdChwcml2KTsKK2RlYnVnZnNfZmFpbGVkOgogCWlkZWFwYWRfcGxhdGZvcm1fZXhpdChwcml2KTsKIHBsYXRmb3JtX2ZhaWxlZDoKIAlrZnJlZShwcml2KTsKQEAgLTU4MCw2ICs3NTksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBJREVBUEFEX1JGS0lMTF9ERVZfTlVNOyBpKyspCiAJCWlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7CiAJaWRlYXBhZF9pbnB1dF9leGl0KHByaXYpOworCWlkZWFwYWRfZGVidWdmc19leGl0KHByaXYpOwogCWlkZWFwYWRfcGxhdGZvcm1fZXhpdChwcml2KTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldiwgTlVMTCk7CiAJa2ZyZWUocHJpdik7CkBAIC01OTMsOSArNzczLDkgQEAKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhZGV2aWNlLT5oYW5kbGU7CiAJdW5zaWduZWQgbG9uZyB2cGMxLCB2cGMyLCB2cGNfYml0OwogCi0JaWYgKHJlYWRfZWNfZGF0YShoYW5kbGUsIDB4MTAsICZ2cGMxKSkKKwlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgVlBDQ01EX1JfVlBDMSwgJnZwYzEpKQogCQlyZXR1cm47Ci0JaWYgKHJlYWRfZWNfZGF0YShoYW5kbGUsIDB4MUEsICZ2cGMyKSkKKwlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgVlBDQ01EX1JfVlBDMiwgJnZwYzIpKQogCQlyZXR1cm47CiAKIAl2cGMxID0gKHZwYzIgPDwgOCkgfCB2cGMxOwpAQCAtNjAzLDExICs3ODMsMTQgQEAKIAkJaWYgKHRlc3RfYml0KHZwY19iaXQsICZ2cGMxKSkgewogCQkJc3dpdGNoICh2cGNfYml0KSB7CiAJCQljYXNlIDk6Ci0JCQkJaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwkJCQlpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKHByaXYpOwogCQkJCWJyZWFrOwogCQkJY2FzZSA0OgogCQkJCWlkZWFwYWRfYmFja2xpZ2h0X25vdGlmeV9icmlnaHRuZXNzKHByaXYpOwogCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlkZWFwYWRfaW5wdXRfbm92b2tleShwcml2KTsKKwkJCQlicmVhazsKIAkJCWNhc2UgMjoKIAkJCQlpZGVhcGFkX2JhY2tsaWdodF9ub3RpZnlfcG93ZXIocHJpdik7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKaW5kZXggYzg2NjY1My4uNDg4NzBlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CiAjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwY3V0aWwuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGN1dGlsLmMKaW5kZXggYjkzYTAzMi4uMmQwZjkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwY3V0aWwuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CiAKLXN0YXRpYyB1MzIgbWFqb3I7CitzdGF0aWMgaW50IG1ham9yOwogCiAjZGVmaW5lIE1BWF9GV19TSVpFIDI2NDE5MgogCkBAIC0xMTcsNyArMTE3LDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwY19tb2R1bGVfaW5pdCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9jaHJkZXYoMCwgImludGVsX21pZF9zY3UiLCAmc2N1X2lwY19mb3BzKTsKKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAiaW50ZWxfbWlkX3NjdSIsICZzY3VfaXBjX2ZvcHMpOworCWlmIChtYWpvciA8IDApCisJCXJldHVybiBtYWpvcjsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBjX21vZHVsZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9tc2ktd21pLmMKaW5kZXggNmY0MGJmMi4uMjI2NDMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS13bWkuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1TSSBsYXB0b3AgV01JIGhvdGtleXMgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zYW1zdW5nLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc2Ftc3VuZy1sYXB0b3AuYwppbmRleCAzNTkxNjMwLi4wOWUyNmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zYW1zdW5nLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NhbXN1bmctbGFwdG9wLmMKQEAgLTIyNiw2ICsyMjYsNyBAQAogc3RhdGljIHN0cnVjdCBtdXRleCBzYWJpX211dGV4Owogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkZXY7CiBzdGF0aWMgc3RydWN0IHJma2lsbCAqcmZrOworc3RhdGljIGJvb2wgaGFzX3N0ZXBwaW5nX3F1aXJrOwogCiBzdGF0aWMgaW50IGZvcmNlOwogbW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwKTsKQEAgLTM3MCwxNSArMzcxLDI4IEBACiAJCQkJICAmc3JldHZhbCk7CiAJaWYgKCFyZXR2YWwpIHsKIAkJdXNlcl9icmlnaHRuZXNzID0gc3JldHZhbC5yZXR2YWxbMF07Ci0JCWlmICh1c2VyX2JyaWdodG5lc3MgIT0gMCkKKwkJaWYgKHVzZXJfYnJpZ2h0bmVzcyA+IHNhYmlfY29uZmlnLT5taW5fYnJpZ2h0bmVzcykKIAkJCXVzZXJfYnJpZ2h0bmVzcyAtPSBzYWJpX2NvbmZpZy0+bWluX2JyaWdodG5lc3M7CisJCWVsc2UKKwkJCXVzZXJfYnJpZ2h0bmVzcyA9IDA7CiAJfQogCXJldHVybiB1c2VyX2JyaWdodG5lc3M7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9icmlnaHRuZXNzKHU4IHVzZXJfYnJpZ2h0bmVzcykKIHsKLQl1OCB1c2VyX2xldmVsID0gdXNlcl9icmlnaHRuZXNzIC0gc2FiaV9jb25maWctPm1pbl9icmlnaHRuZXNzOworCXU4IHVzZXJfbGV2ZWwgPSB1c2VyX2JyaWdodG5lc3MgKyBzYWJpX2NvbmZpZy0+bWluX2JyaWdodG5lc3M7CisKKwlpZiAoaGFzX3N0ZXBwaW5nX3F1aXJrICYmIHVzZXJfbGV2ZWwgIT0gMCkgeworCQkvKgorCQkgKiBzaG9ydCBjaXJjdWl0IGlmIHRoZSBzcGVjaWZpZWQgbGV2ZWwgaXMgd2hhdCdzIGFscmVhZHkgc2V0CisJCSAqIHRvIHByZXZlbnQgdGhlIHNjcmVlbiBmcm9tIGZsaWNrZXJpbmcgbmVlZGxlc3NseQorCQkgKi8KKwkJaWYgKHVzZXJfYnJpZ2h0bmVzcyA9PSByZWFkX2JyaWdodG5lc3MoKSkKKwkJCXJldHVybjsKKworCQlzYWJpX3NldF9jb21tYW5kKHNhYmlfY29uZmlnLT5jb21tYW5kcy5zZXRfYnJpZ2h0bmVzcywgMCk7CisJfQogCiAJc2FiaV9zZXRfY29tbWFuZChzYWJpX2NvbmZpZy0+Y29tbWFuZHMuc2V0X2JyaWdodG5lc3MsIHVzZXJfbGV2ZWwpOwogfQpAQCAtMzg4LDYgKzQwMiw0MCBAQAogCXJldHVybiAoaW50KXJlYWRfYnJpZ2h0bmVzcygpOwogfQogCitzdGF0aWMgdm9pZCBjaGVja19mb3Jfc3RlcHBpbmdfcXVpcmsodm9pZCkKK3sKKwl1OCBpbml0aWFsX2xldmVsOworCXU4IGNoZWNrX2xldmVsOworCXU4IG9yaWdfbGV2ZWwgPSByZWFkX2JyaWdodG5lc3MoKTsKKworCS8qCisJICogU29tZSBsYXB0b3BzIGV4aGliaXQgdGhlIHN0cmFuZ2UgYmVoYXZpb3VyIG9mIHN0ZXBwaW5nIHRvd2FyZAorCSAqIChyYXRoZXIgdGhhbiBzZXR0aW5nKSB0aGUgYnJpZ2h0bmVzcyBleGNlcHQgd2hlbiBjaGFuZ2luZyB0by9mcm9tCisJICogYnJpZ2h0bmVzcyBsZXZlbCAwLiBUaGlzIGJlaGF2aW91ciBpcyBjaGVja2VkIGZvciBoZXJlIGFuZCB3b3JrZWQKKwkgKiBhcm91bmQgaW4gc2V0X2JyaWdodG5lc3MuCisJICovCisKKwlpZiAob3JpZ19sZXZlbCA9PSAwKQorCQlzZXRfYnJpZ2h0bmVzcygxKTsKKworCWluaXRpYWxfbGV2ZWwgPSByZWFkX2JyaWdodG5lc3MoKTsKKworCWlmIChpbml0aWFsX2xldmVsIDw9IDIpCisJCWNoZWNrX2xldmVsID0gaW5pdGlhbF9sZXZlbCArIDI7CisJZWxzZQorCQljaGVja19sZXZlbCA9IGluaXRpYWxfbGV2ZWwgLSAyOworCisJaGFzX3N0ZXBwaW5nX3F1aXJrID0gZmFsc2U7CisJc2V0X2JyaWdodG5lc3MoY2hlY2tfbGV2ZWwpOworCisJaWYgKHJlYWRfYnJpZ2h0bmVzcygpICE9IGNoZWNrX2xldmVsKSB7CisJCWhhc19zdGVwcGluZ19xdWlyayA9IHRydWU7CisJCXByX2luZm8oImVuYWJsZWQgd29ya2Fyb3VuZCBmb3IgYnJpZ2h0bmVzcyBzdGVwcGluZyBxdWlya1xuIik7CisJfQorCisJc2V0X2JyaWdodG5lc3Mob3JpZ19sZXZlbCk7Cit9CisKIHN0YXRpYyBpbnQgdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJc2V0X2JyaWdodG5lc3MoYmQtPnByb3BzLmJyaWdodG5lc3MpOwpAQCAtNjIxLDYgKzY2OSwxNiBAQAogCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCiAJfSwKIAl7CisJCS5pZGVudCA9ICJOMjIwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsCisJCQkJCSJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMjIwIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJOMjIwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsKIAkJLmlkZW50ID0gIk4xNTAvTjIxMC9OMjIwL04yMzAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwKQEAgLTY0MSw2ICs2OTksMTUgQEAKIAkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAogCX0sCiAJeworCQkuaWRlbnQgPSAiUjcwMCIsCisJCS5tYXRjaGVzID0geworCQkgICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlNSNzAwIiksCisJCSAgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlNSNzAwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsKIAkJLmlkZW50ID0gIlI1MzAvUjczMCIsCiAJCS5tYXRjaGVzID0gewogCQkgICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLApAQCAtNjg2LDYgKzc1MywzMyBAQAogCQl9LAogCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2IsCiAJfSwKKwl7CisJCS5pZGVudCA9ICJSNTI4L1I3MjgiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlI1MjgvUjcyOCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUjUyOC9SNzI4IiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsKKwkJLmlkZW50ID0gIk5DMjEwL05DMTEwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOQzIxMC9OQzExMCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiTkMyMTAvTkMxMTAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCisJCXsKKwkJLmlkZW50ID0gIlg1MjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlg1MjAiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlg1MjAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBzYW1zdW5nX2RtaV90YWJsZSk7CkBAIC03NzAsNyArODY0LDcgQEAKIAlzYWJpX2lmYWNlID0gaW9yZW1hcF9ub2NhY2hlKGlmYWNlUCwgMTYpOwogCWlmICghc2FiaV9pZmFjZSkgewogCQlwcl9lcnIoIkNhbid0IHJlbWFwICV4XG4iLCBpZmFjZVApOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gZXJyb3Jfbm9fc2lnbmF0dXJlOwogCX0KIAlpZiAoZGVidWcpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgImlmYWNlUCA9IDB4JTA4eFxuIiwgaWZhY2VQKTsKQEAgLTc5NCw2ICs4ODgsOSBAQAogCQl9CiAJfQogCisJLyogQ2hlY2sgZm9yIHN0ZXBwaW5nIHF1aXJrICovCisJY2hlY2tfZm9yX3N0ZXBwaW5nX3F1aXJrKCk7CisKIAkvKiBrbm9jayB1cCBhIHBsYXRmb3JtIGRldmljZSB0byBoYW5nIHN0dWZmIG9mZiBvZiAqLwogCXNkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJzYW1zdW5nIiwgLTEsIE5VTEwsIDApOwogCWlmIChJU19FUlIoc2RldikpCkBAIC04MDIsNyArODk5LDggQEAKIAkvKiBjcmVhdGUgYSBiYWNrbGlnaHQgZGV2aWNlIHRvIHRhbGsgdG8gdGhpcyBvbmUgKi8KIAltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CiAJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKLQlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IHNhYmlfY29uZmlnLT5tYXhfYnJpZ2h0bmVzczsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IHNhYmlfY29uZmlnLT5tYXhfYnJpZ2h0bmVzcyAtCisJCQkJc2FiaV9jb25maWctPm1pbl9icmlnaHRuZXNzOwogCWJhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJzYW1zdW5nIiwgJnNkZXYtPmRldiwKIAkJCQkJCSAgICAgTlVMTCwgJmJhY2tsaWdodF9vcHMsCiAJCQkJCQkgICAgICZwcm9wcyk7CkBAIC04MjEsNyArOTE5LDYgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2ZpbGVfY3JlYXRlOwogCi1leGl0OgogCXJldHVybiAwOwogCiBlcnJvcl9maWxlX2NyZWF0ZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCmluZGV4IGJiZDE4MmUuLmMwMDZkZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwpAQCAtMzI4MSw3ICszMjgxLDcgQEAKIAkvKiByZXF1ZXN0IElSUSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpcnEsICZzcGljX2Rldi5pbnRlcnJ1cHRzLCBsaXN0KSB7CiAJCWlmICghcmVxdWVzdF9pcnEoaXJxLT5pcnEuaW50ZXJydXB0c1swXSwgc29ueV9waWNfaXJxLAotCQkJCQlJUlFGX0RJU0FCTEVELCAic29ueS1sYXB0b3AiLCAmc3BpY19kZXYpKSB7CisJCQkJCTAsICJzb255LWxhcHRvcCIsICZzcGljX2RldikpIHsKIAkJCWRwcmludGsoIklSUTogJWQgLSB0cmlnZ2VyaW5nOiAlZCAtICIKIAkJCQkJInBvbGFyaXR5OiAlZCAtIHNocjogJWRcbiIsCiAJCQkJCWlycS0+aXJxLmludGVycnVwdHNbMF0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3BzdGFyLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9wc3Rhci1sYXB0b3AuYwppbmRleCA0YzIwNDQ3Li5kNTI4ZGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3BzdGFyLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RvcHN0YXItbGFwdG9wLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAl7IEtFX0tFWSwgMHg4YywgeyBLRVlfTUVESUEgfSB9LAogCiAJLyogS25vd24gbm9uIGhvdGtleSBldmVudHMgZG9uJ3QgaGFuZGxlZCBvciB0aGF0IHdlIGRvbid0IGNhcmUgeWV0ICovCisJeyBLRV9JR05PUkUsIDB4ODIsIH0sIC8qIGJhY2tsaWdodCBldmVudCAqLwogCXsgS0VfSUdOT1JFLCAweDhlLCB9LAogCXsgS0VfSUdOT1JFLCAweDhmLCB9LAogCXsgS0VfSUdOT1JFLCAweDkwLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwppbmRleCBjYjAwOWIyLi4xM2VmOGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oPgpAQCAtNjMsMTEgKzYyLDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogLyogVG9zaGliYSBBQ1BJIG1ldGhvZCBwYXRocyAqLwotI2RlZmluZSBNRVRIT0RfTENEX0JSSUdIVE5FU1MJIlxcX1NCXy5QQ0kwLlZHQV8uTENEXy5fQkNNIgotI2RlZmluZSBUT1NIX0lOVEVSRkFDRV8xCSJcXF9TQl8uVkFMRCIKLSNkZWZpbmUgVE9TSF9JTlRFUkZBQ0VfMgkiXFxfU0JfLlZBTFoiCiAjZGVmaW5lIE1FVEhPRF9WSURFT19PVVQJIlxcX1NCXy5WQUxYLkRTU1giCi0jZGVmaW5lIEdIQ0lfTUVUSE9ECQkiLkdIQ0kiCiAKIC8qIFRvc2hpYmEgSENJIGludGVyZmFjZSBkZWZpbml0aW9ucwogICoKQEAgLTExMSw2ICsxMDYsMjUgQEAKICNkZWZpbmUgSENJX1dJUkVMRVNTX0JUX0FUVEFDSAkJMHg0MAogI2RlZmluZSBIQ0lfV0lSRUxFU1NfQlRfUE9XRVIJCTB4ODAKIAorc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgeworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXY7CisJY29uc3QgY2hhciAqbWV0aG9kX2hjaTsKKwlzdHJ1Y3QgcmZraWxsICpidF9yZms7CisJc3RydWN0IGlucHV0X2RldiAqaG90a2V5X2RldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldjsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZF9kZXY7CisKKwlpbnQgZm9yY2VfZmFuOworCWludCBsYXN0X2tleV9ldmVudDsKKwlpbnQga2V5X2V2ZW50X3ZhbGlkOworCisJaW50IGlsbHVtaW5hdGlvbl9zdXBwb3J0ZWQ6MTsKKwlpbnQgdmlkZW9fc3VwcG9ydGVkOjE7CisJaW50IGZhbl9zdXBwb3J0ZWQ6MTsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgdG9zaGliYV9kZXZpY2VfaWRzW10gPSB7CiAJeyJUT1M2MjAwIiwgMH0sCiAJeyJUT1M2MjA4IiwgMH0sCkBAIC0xMTksNyArMTMzLDcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHRvc2hpYmFfZGV2aWNlX2lkcyk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IHRvc2hpYmFfYWNwaV9rZXltYXBbXSBfX2luaXRjb25zdCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IHRvc2hpYmFfYWNwaV9rZXltYXBbXSBfX2RldmluaXRjb25zdCA9IHsKIAl7IEtFX0tFWSwgMHgxMDEsIHsgS0VZX01VVEUgfSB9LAogCXsgS0VfS0VZLCAweDEwMiwgeyBLRVlfWk9PTU9VVCB9IH0sCiAJeyBLRV9LRVksIDB4MTAzLCB7IEtFWV9aT09NSU4gfSB9LApAQCAtMTU1LDE1ICsxNjksNiBAQAogLyogYWNwaSBpbnRlcmZhY2Ugd3JhcHBlcnMKICAqLwogCi1zdGF0aWMgaW50IGlzX3ZhbGlkX2FjcGlfcGF0aChjb25zdCBjaGFyICptZXRob2ROYW1lKQotewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgKGNoYXIgKiltZXRob2ROYW1lLCAmaGFuZGxlKTsKLQlyZXR1cm4gIUFDUElfRkFJTFVSRShzdGF0dXMpOwotfQotCiBzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGNvbnN0IGNoYXIgKm1ldGhvZE5hbWUsIGludCB2YWwpCiB7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1zOwpAQCAtMTc2LDMyICsxODEsMTQgQEAKIAlpbl9vYmpzWzBdLmludGVnZXIudmFsdWUgPSB2YWw7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAoY2hhciAqKW1ldGhvZE5hbWUsICZwYXJhbXMsIE5VTEwpOwotCXJldHVybiAoc3RhdHVzID09IEFFX09LKTsKKwlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSykgPyAwIDogLUVJTzsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChjb25zdCBjaGFyICptZXRob2ROYW1lLCBpbnQgKnBWYWwpCi17Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHJlc3VsdHM7Ci0JdW5pb24gYWNwaV9vYmplY3Qgb3V0X29ianNbMV07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JcmVzdWx0cy5sZW5ndGggPSBzaXplb2Yob3V0X29ianMpOwotCXJlc3VsdHMucG9pbnRlciA9IG91dF9vYmpzOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoMCwgKGNoYXIgKiltZXRob2ROYW1lLCAwLCAmcmVzdWx0cyk7Ci0JKnBWYWwgPSBvdXRfb2Jqc1swXS5pbnRlZ2VyLnZhbHVlOwotCi0JcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spICYmIChvdXRfb2Jqc1swXS50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciAqbWV0aG9kX2hjaSAvKj0gMCovIDsKLQogLyogUGVyZm9ybSBhIHJhdyBIQ0kgY2FsbC4gIEhlcmUgd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnB1dCBvciBvdXRwdXQgYnVmZmVyCiAgKiBmb3JtYXQuCiAgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmF3KGNvbnN0IHUzMiBpbltIQ0lfV09SRFNdLCB1MzIgb3V0W0hDSV9XT1JEU10pCitzdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3JhdyhzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2LAorCQkJICAgY29uc3QgdTMyIGluW0hDSV9XT1JEU10sIHUzMiBvdXRbSENJX1dPUkRTXSkKIHsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tIQ0lfV09SRFNdOwpAQCAtMjIwLDcgKzIwNyw4IEBACiAJcmVzdWx0cy5sZW5ndGggPSBzaXplb2Yob3V0X29ianMpOwogCXJlc3VsdHMucG9pbnRlciA9IG91dF9vYmpzOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgKGNoYXIgKiltZXRob2RfaGNpLCAmcGFyYW1zLAorCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldi0+YWNwaV9kZXYtPmhhbmRsZSwKKwkJCQkgICAgICAoY2hhciAqKWRldi0+bWV0aG9kX2hjaSwgJnBhcmFtcywKIAkJCQkgICAgICAmcmVzdWx0cyk7CiAJaWYgKChzdGF0dXMgPT0gQUVfT0spICYmIChvdXRfb2Jqcy0+cGFja2FnZS5jb3VudCA8PSBIQ0lfV09SRFMpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBvdXRfb2Jqcy0+cGFja2FnZS5jb3VudDsgKytpKSB7CkBAIC0yMzcsODUgKzIyNSw3OSBAQAogICogbWF5IGJlIHVzZWZ1bCAoc3VjaCBhcyAibm90IHN1cHBvcnRlZCIpLgogICovCiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBoY2lfd3JpdGUxKHUzMiByZWcsIHUzMiBpbjEsIHUzMiAqIHJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfd3JpdGUxKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIHUzMiByZWcsCisJCQkgICAgICB1MzIgaW4xLCB1MzIgKnJlc3VsdCkKIHsKIAl1MzIgaW5bSENJX1dPUkRTXSA9IHsgSENJX1NFVCwgcmVnLCBpbjEsIDAsIDAsIDAgfTsKIAl1MzIgb3V0W0hDSV9XT1JEU107Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBoY2lfcmF3KGRldiwgaW4sIG91dCk7CiAJKnJlc3VsdCA9IChzdGF0dXMgPT0gQUVfT0spID8gb3V0WzBdIDogSENJX0ZBSUxVUkU7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGhjaV9yZWFkMSh1MzIgcmVnLCB1MzIgKiBvdXQxLCB1MzIgKiByZXN1bHQpCitzdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3JlYWQxKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIHUzMiByZWcsCisJCQkgICAgIHUzMiAqb3V0MSwgdTMyICpyZXN1bHQpCiB7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IEhDSV9HRVQsIHJlZywgMCwgMCwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkqb3V0MSA9IG91dFsyXTsKIAkqcmVzdWx0ID0gKHN0YXR1cyA9PSBBRV9PSykgPyBvdXRbMF0gOiBIQ0lfRkFJTFVSRTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3dyaXRlMih1MzIgcmVnLCB1MzIgaW4xLCB1MzIgaW4yLCB1MzIgKnJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfd3JpdGUyKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIHUzMiByZWcsCisJCQkgICAgICB1MzIgaW4xLCB1MzIgaW4yLCB1MzIgKnJlc3VsdCkKIHsKIAl1MzIgaW5bSENJX1dPUkRTXSA9IHsgSENJX1NFVCwgcmVnLCBpbjEsIGluMiwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkqcmVzdWx0ID0gKHN0YXR1cyA9PSBBRV9PSykgPyBvdXRbMF0gOiBIQ0lfRkFJTFVSRTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgaGNpX3JlYWQyKHUzMiByZWcsIHUzMiAqb3V0MSwgdTMyICpvdXQyLCB1MzIgKnJlc3VsdCkKK3N0YXRpYyBhY3BpX3N0YXR1cyBoY2lfcmVhZDIoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyIHJlZywKKwkJCSAgICAgdTMyICpvdXQxLCB1MzIgKm91dDIsIHUzMiAqcmVzdWx0KQogewogCXUzMiBpbltIQ0lfV09SRFNdID0geyBIQ0lfR0VULCByZWcsICpvdXQxLCAqb3V0MiwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkqb3V0MSA9IG91dFsyXTsKIAkqb3V0MiA9IG91dFszXTsKIAkqcmVzdWx0ID0gKHN0YXR1cyA9PSBBRV9PSykgPyBvdXRbMF0gOiBIQ0lfRkFJTFVSRTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcF9kZXY7Ci0Jc3RydWN0IHJma2lsbCAqYnRfcmZrOwotCXN0cnVjdCBpbnB1dF9kZXYgKmhvdGtleV9kZXY7Ci0JaW50IGlsbHVtaW5hdGlvbl9pbnN0YWxsZWQ7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCi0JY29uc3QgY2hhciAqYnRfbmFtZTsKLQotCXN0cnVjdCBtdXRleCBtdXRleDsKLX07Ci0KIC8qIElsbHVtaW5hdGlvbiBzdXBwb3J0ICovCi1zdGF0aWMgaW50IHRvc2hpYmFfaWxsdW1pbmF0aW9uX2F2YWlsYWJsZSh2b2lkKQorc3RhdGljIGludCB0b3NoaWJhX2lsbHVtaW5hdGlvbl9hdmFpbGFibGUoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldikKIHsKIAl1MzIgaW5bSENJX1dPUkRTXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogCXUzMiBvdXRbSENJX1dPUkRTXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlpblswXSA9IDB4ZjEwMDsKLQlzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJfaW5mbygiSWxsdW1pbmF0aW9uIGRldmljZSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWluWzBdID0gMHhmNDAwOwotCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJc3RhdHVzID0gaGNpX3JhdyhkZXYsIGluLCBvdXQpOwogCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCB0b3NoaWJhX2lsbHVtaW5hdGlvbl9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKIAkJCQkgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGNkZXYsCisJCQlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiwgbGVkX2Rldik7CiAJdTMyIGluW0hDSV9XT1JEU10gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKIAl1MzIgb3V0W0hDSV9XT1JEU107CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogRmlyc3QgcmVxdWVzdCA6IGluaXRpYWxpemUgY29tbXVuaWNhdGlvbi4gKi8KIAlpblswXSA9IDB4ZjEwMDsKLQlzdGF0dXMgPSBoY2lfcmF3KGluLCBvdXQpOworCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJfaW5mbygiSWxsdW1pbmF0aW9uIGRldmljZSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuOwpAQCAtMzI2LDcgKzMwOCw3IEBACiAJCWluWzBdID0gMHhmNDAwOwogCQlpblsxXSA9IDB4MTRlOwogCQlpblsyXSA9IDE7Ci0JCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcl9pbmZvKCJBQ1BJIGNhbGwgZm9yIGlsbHVtaW5hdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuOwpAQCAtMzM2LDcgKzMxOCw3IEBACiAJCWluWzBdID0gMHhmNDAwOwogCQlpblsxXSA9IDB4MTRlOwogCQlpblsyXSA9IDA7Ci0JCXN0YXR1cyA9IGhjaV9yYXcoaW4sIG91dCk7CisJCXN0YXR1cyA9IGhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcl9pbmZvKCJBQ1BJIGNhbGwgZm9yIGlsbHVtaW5hdGlvbiBmYWlsZWQuXG4iKTsKIAkJCXJldHVybjsKQEAgLTM0NywxMSArMzI5LDEzIEBACiAJaW5bMF0gPSAweGYyMDA7CiAJaW5bMV0gPSAwOwogCWluWzJdID0gMDsKLQloY2lfcmF3KGluLCBvdXQpOworCWhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIH0KIAogc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdG9zaGliYV9pbGx1bWluYXRpb25fZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCiB7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihjZGV2LAorCQkJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYsIGxlZF9kZXYpOwogCXUzMiBpbltIQ0lfV09SRFNdID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAJdTMyIG91dFtIQ0lfV09SRFNdOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTM1OSw3ICszNDMsNyBAQAogCiAJLyrCoEZpcnN0IHJlcXVlc3QgOiBpbml0aWFsaXplIGNvbW11bmljYXRpb24uICovCiAJaW5bMF0gPSAweGYxMDA7Ci0Jc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlzdGF0dXMgPSBoY2lfcmF3KGRldiwgaW4sIG91dCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXByX2luZm8oIklsbHVtaW5hdGlvbiBkZXZpY2Ugbm90IGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiBMRURfT0ZGOwpAQCAtMzY4LDcgKzM1Miw3IEBACiAJLyogQ2hlY2sgdGhlIGlsbHVtaW5hdGlvbiAqLwogCWluWzBdID0gMHhmMzAwOwogCWluWzFdID0gMHgxNGU7Ci0Jc3RhdHVzID0gaGNpX3Jhdyhpbiwgb3V0KTsKKwlzdGF0dXMgPSBoY2lfcmF3KGRldiwgaW4sIG91dCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXByX2luZm8oIkFDUEkgY2FsbCBmb3IgaWxsdW1pbmF0aW9uIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gTEVEX09GRjsKQEAgLTM4MCw0NiArMzY0LDM1IEBACiAJaW5bMF0gPSAweGYyMDA7CiAJaW5bMV0gPSAwOwogCWluWzJdID0gMDsKLQloY2lfcmF3KGluLCBvdXQpOworCWhjaV9yYXcoZGV2LCBpbiwgb3V0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHRvc2hpYmFfbGVkID0gewotCS5uYW1lICAgICAgICAgICA9ICJ0b3NoaWJhOjppbGx1bWluYXRpb24iLAotCS5tYXhfYnJpZ2h0bmVzcyA9IDEsCi0JLmJyaWdodG5lc3Nfc2V0ID0gdG9zaGliYV9pbGx1bWluYXRpb25fc2V0LAotCS5icmlnaHRuZXNzX2dldCA9IHRvc2hpYmFfaWxsdW1pbmF0aW9uX2dldCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiB0b3NoaWJhX2FjcGkgPSB7Ci0JLmJ0X25hbWUgPSAiVG9zaGliYSBCbHVldG9vdGgiLAotfTsKLQogLyogQmx1ZXRvb3RoIHJma2lsbCBoYW5kbGVycyAqLwogCi1zdGF0aWMgdTMyIGhjaV9nZXRfYnRfcHJlc2VudChib29sICpwcmVzZW50KQorc3RhdGljIHUzMiBoY2lfZ2V0X2J0X3ByZXNlbnQoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgYm9vbCAqcHJlc2VudCkKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWUsIHZhbHVlMjsKIAogCXZhbHVlID0gMDsKIAl2YWx1ZTIgPSAwOwotCWhjaV9yZWFkMihIQ0lfV0lSRUxFU1MsICZ2YWx1ZSwgJnZhbHVlMiwgJmhjaV9yZXN1bHQpOworCWhjaV9yZWFkMihkZXYsIEhDSV9XSVJFTEVTUywgJnZhbHVlLCAmdmFsdWUyLCAmaGNpX3Jlc3VsdCk7CiAJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpCiAJCSpwcmVzZW50ID0gKHZhbHVlICYgSENJX1dJUkVMRVNTX0JUX1BSRVNFTlQpID8gdHJ1ZSA6IGZhbHNlOwogCiAJcmV0dXJuIGhjaV9yZXN1bHQ7CiB9CiAKLXN0YXRpYyB1MzIgaGNpX2dldF9yYWRpb19zdGF0ZShib29sICpyYWRpb19zdGF0ZSkKK3N0YXRpYyB1MzIgaGNpX2dldF9yYWRpb19zdGF0ZShzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2LCBib29sICpyYWRpb19zdGF0ZSkKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWUsIHZhbHVlMjsKIAogCXZhbHVlID0gMDsKIAl2YWx1ZTIgPSAweDAwMDE7Ci0JaGNpX3JlYWQyKEhDSV9XSVJFTEVTUywgJnZhbHVlLCAmdmFsdWUyLCAmaGNpX3Jlc3VsdCk7CisJaGNpX3JlYWQyKGRldiwgSENJX1dJUkVMRVNTLCAmdmFsdWUsICZ2YWx1ZTIsICZoY2lfcmVzdWx0KTsKIAogCSpyYWRpb19zdGF0ZSA9IHZhbHVlICYgSENJX1dJUkVMRVNTX0tJTExfU1dJVENIOwogCXJldHVybiBoY2lfcmVzdWx0OwpAQCAtNDM2LDggKzQwOSw4IEBACiAJdmFsdWUgPSAoYmxvY2tlZCA9PSBmYWxzZSk7CiAKIAltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKLQlpZiAoaGNpX2dldF9yYWRpb19zdGF0ZSgmcmFkaW9fc3RhdGUpICE9IEhDSV9TVUNDRVNTKSB7Ci0JCWVyciA9IC1FQlVTWTsKKwlpZiAoaGNpX2dldF9yYWRpb19zdGF0ZShkZXYsICZyYWRpb19zdGF0ZSkgIT0gSENJX1NVQ0NFU1MpIHsKKwkJZXJyID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00NDYsMTEgKzQxOSwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQloY2lfd3JpdGUyKEhDSV9XSVJFTEVTUywgdmFsdWUsIEhDSV9XSVJFTEVTU19CVF9QT1dFUiwgJnJlc3VsdDEpOwotCWhjaV93cml0ZTIoSENJX1dJUkVMRVNTLCB2YWx1ZSwgSENJX1dJUkVMRVNTX0JUX0FUVEFDSCwgJnJlc3VsdDIpOworCWhjaV93cml0ZTIoZGV2LCBIQ0lfV0lSRUxFU1MsIHZhbHVlLCBIQ0lfV0lSRUxFU1NfQlRfUE9XRVIsICZyZXN1bHQxKTsKKwloY2lfd3JpdGUyKGRldiwgSENJX1dJUkVMRVNTLCB2YWx1ZSwgSENJX1dJUkVMRVNTX0JUX0FUVEFDSCwgJnJlc3VsdDIpOwogCiAJaWYgKHJlc3VsdDEgIT0gSENJX1NVQ0NFU1MgfHwgcmVzdWx0MiAhPSBIQ0lfU1VDQ0VTUykKLQkJZXJyID0gLUVCVVNZOworCQllcnIgPSAtRUlPOwogCWVsc2UKIAkJZXJyID0gMDsKICBvdXQ6CkBAIC00NjcsNyArNDQwLDcgQEAKIAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCi0JaGNpX3Jlc3VsdCA9IGhjaV9nZXRfcmFkaW9fc3RhdGUoJnZhbHVlKTsKKwloY2lfcmVzdWx0ID0gaGNpX2dldF9yYWRpb19zdGF0ZShkZXYsICZ2YWx1ZSk7CiAJaWYgKGhjaV9yZXN1bHQgIT0gSENJX1NVQ0NFU1MpIHsKIAkJLyogQ2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsICovCiAJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CkBAIC00ODgsNjMgKzQ2MSw2NCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG9zaGliYV9wcm9jX2RpciAvKj0gMCovIDsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqdG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlOwotc3RhdGljIGludCBmb3JjZV9mYW47Ci1zdGF0aWMgaW50IGxhc3Rfa2V5X2V2ZW50Owotc3RhdGljIGludCBrZXlfZXZlbnRfdmFsaWQ7CiAKIHN0YXRpYyBpbnQgZ2V0X2xjZChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IGJsX2dldF9kYXRhKGJkKTsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWU7CiAKLQloY2lfcmVhZDEoSENJX0xDRF9CUklHSFRORVNTLCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKLQlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykgeworCWhjaV9yZWFkMShkZXYsIEhDSV9MQ0RfQlJJR0hUTkVTUywgJnZhbHVlLCAmaGNpX3Jlc3VsdCk7CisJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpCiAJCXJldHVybiAodmFsdWUgPj4gSENJX0xDRF9CUklHSFRORVNTX1NISUZUKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBsY2RfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlpbnQgdmFsdWUgPSBnZXRfbGNkKE5VTEwpOworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBtLT5wcml2YXRlOworCWludCB2YWx1ZTsKIAorCWlmICghZGV2LT5iYWNrbGlnaHRfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbHVlID0gZ2V0X2xjZChkZXYtPmJhY2tsaWdodF9kZXYpOwogCWlmICh2YWx1ZSA+PSAwKSB7CiAJCXNlcV9wcmludGYobSwgImJyaWdodG5lc3M6ICAgICAgICAgICAgICAlZFxuIiwgdmFsdWUpOwogCQlzZXFfcHJpbnRmKG0sICJicmlnaHRuZXNzX2xldmVsczogICAgICAgJWRcbiIsCiAJCQkgICAgIEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiRXJyb3IgcmVhZGluZyBMQ0QgYnJpZ2h0bmVzc1xuIik7CisJCXJldHVybiAwOwogCX0KIAotCXJldHVybiAwOworCXByX2VycigiRXJyb3IgcmVhZGluZyBMQ0QgYnJpZ2h0bmVzc1xuIik7CisJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgbGNkX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbGNkX3Byb2Nfc2hvdywgTlVMTCk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGxjZF9wcm9jX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgaW50IHNldF9sY2QoaW50IHZhbHVlKQorc3RhdGljIGludCBzZXRfbGNkKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIGludCB2YWx1ZSkKIHsKIAl1MzIgaGNpX3Jlc3VsdDsKIAogCXZhbHVlID0gdmFsdWUgPDwgSENJX0xDRF9CUklHSFRORVNTX1NISUZUOwotCWhjaV93cml0ZTEoSENJX0xDRF9CUklHSFRORVNTLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOwotCWlmIChoY2lfcmVzdWx0ICE9IEhDSV9TVUNDRVNTKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOworCWhjaV93cml0ZTEoZGV2LCBIQ0lfTENEX0JSSUdIVE5FU1MsIHZhbHVlLCAmaGNpX3Jlc3VsdCk7CisJcmV0dXJuIGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MgPyAwIDogLUVJTzsKIH0KIAogc3RhdGljIGludCBzZXRfbGNkX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7Ci0JcmV0dXJuIHNldF9sY2QoYmQtPnByb3BzLmJyaWdodG5lc3MpOworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBibF9nZXRfZGF0YShiZCk7CisJcmV0dXJuIHNldF9sY2QoZGV2LCBiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxjZF9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgY21kWzQyXTsKIAlzaXplX3QgbGVuOwogCWludCB2YWx1ZTsKQEAgLTU1Nyw3ICs1MzEsNyBAQAogCiAJaWYgKHNzY2FuZihjbWQsICIgYnJpZ2h0bmVzcyA6ICVpIiwgJnZhbHVlKSA9PSAxICYmCiAJICAgIHZhbHVlID49IDAgJiYgdmFsdWUgPCBIQ0lfTENEX0JSSUdIVE5FU1NfTEVWRUxTKSB7Ci0JCXJldCA9IHNldF9sY2QodmFsdWUpOworCQlyZXQgPSBzZXRfbGNkKGRldiwgdmFsdWUpOwogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSBjb3VudDsKIAl9IGVsc2UgewpAQCAtNTc1LDQxICs1NDksNDkgQEAKIAkud3JpdGUJCT0gbGNkX3Byb2Nfd3JpdGUsCiB9OwogCi1zdGF0aWMgaW50IHZpZGVvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdGF0aWMgaW50IGdldF92aWRlb19zdGF0dXMoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiwgdTMyICpzdGF0dXMpCiB7CiAJdTMyIGhjaV9yZXN1bHQ7Ci0JdTMyIHZhbHVlOwogCi0JaGNpX3JlYWQxKEhDSV9WSURFT19PVVQsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwotCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7CisJaGNpX3JlYWQxKGRldiwgSENJX1ZJREVPX09VVCwgc3RhdHVzLCAmaGNpX3Jlc3VsdCk7CisJcmV0dXJuIGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCB2aWRlb19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBtLT5wcml2YXRlOworCXUzMiB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3ZpZGVvX3N0YXR1cyhkZXYsICZ2YWx1ZSk7CisJaWYgKCFyZXQpIHsKIAkJaW50IGlzX2xjZCA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfTENEKSA/IDEgOiAwOwogCQlpbnQgaXNfY3J0ID0gKHZhbHVlICYgSENJX1ZJREVPX09VVF9DUlQpID8gMSA6IDA7CiAJCWludCBpc190diA9ICh2YWx1ZSAmIEhDSV9WSURFT19PVVRfVFYpID8gMSA6IDA7CiAJCXNlcV9wcmludGYobSwgImxjZF9vdXQ6ICAgICAgICAgICAgICAgICAlZFxuIiwgaXNfbGNkKTsKIAkJc2VxX3ByaW50ZihtLCAiY3J0X291dDogICAgICAgICAgICAgICAgICVkXG4iLCBpc19jcnQpOwogCQlzZXFfcHJpbnRmKG0sICJ0dl9vdXQ6ICAgICAgICAgICAgICAgICAgJWRcbiIsIGlzX3R2KTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIkVycm9yIHJlYWRpbmcgdmlkZW8gb3V0IHN0YXR1c1xuIik7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2aWRlb19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHZpZGVvX3Byb2Nfc2hvdywgTlVMTCk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHZpZGVvX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHZpZGVvX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgKmNtZCwgKmJ1ZmZlcjsKKwlpbnQgcmV0OwogCWludCB2YWx1ZTsKIAlpbnQgcmVtYWluID0gY291bnQ7CiAJaW50IGxjZF9vdXQgPSAtMTsKIAlpbnQgY3J0X291dCA9IC0xOwogCWludCB0dl9vdXQgPSAtMTsKLQl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmlkZW9fb3V0OwogCiAJY21kID0ga21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOwpAQCAtNjQ0LDggKzYyNiw4IEBACiAKIAlrZnJlZShjbWQpOwogCi0JaGNpX3JlYWQxKEhDSV9WSURFT19PVVQsICZ2aWRlb19vdXQsICZoY2lfcmVzdWx0KTsKLQlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykgeworCXJldCA9IGdldF92aWRlb19zdGF0dXMoZGV2LCAmdmlkZW9fb3V0KTsKKwlpZiAoIXJldCkgewogCQl1bnNpZ25lZCBpbnQgbmV3X3ZpZGVvX291dCA9IHZpZGVvX291dDsKIAkJaWYgKGxjZF9vdXQgIT0gLTEpCiAJCQlfc2V0X2JpdCgmbmV3X3ZpZGVvX291dCwgSENJX1ZJREVPX09VVF9MQ0QsIGxjZF9vdXQpOwpAQCAtNjU2LDEyICs2MzgsMTAgQEAKIAkJLyogVG8gYXZvaWQgdW5uZWNlc3NhcnkgdmlkZW8gZGlzcnVwdGlvbiwgb25seSB3cml0ZSB0aGUgbmV3CiAJCSAqIHZpZGVvIHNldHRpbmcgaWYgc29tZXRoaW5nIGNoYW5nZWQuICovCiAJCWlmIChuZXdfdmlkZW9fb3V0ICE9IHZpZGVvX291dCkKLQkJCXdyaXRlX2FjcGlfaW50KE1FVEhPRF9WSURFT19PVVQsIG5ld192aWRlb19vdXQpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUZBVUxUOworCQkJcmV0ID0gd3JpdGVfYWNwaV9pbnQoTUVUSE9EX1ZJREVPX09VVCwgbmV3X3ZpZGVvX291dCk7CiAJfQogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlkZW9fcHJvY19mb3BzID0gewpAQCAtNjczLDMwICs2NTMsMzggQEAKIAkud3JpdGUJCT0gdmlkZW9fcHJvY193cml0ZSwKIH07CiAKLXN0YXRpYyBpbnQgZmFuX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdGF0aWMgaW50IGdldF9mYW5fc3RhdHVzKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYsIHUzMiAqc3RhdHVzKQogewogCXUzMiBoY2lfcmVzdWx0OworCisJaGNpX3JlYWQxKGRldiwgSENJX0ZBTiwgc3RhdHVzLCAmaGNpX3Jlc3VsdCk7CisJcmV0dXJuIGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBmYW5fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gbS0+cHJpdmF0ZTsKKwlpbnQgcmV0OwogCXUzMiB2YWx1ZTsKIAotCWhjaV9yZWFkMShIQ0lfRkFOLCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKLQlpZiAoaGNpX3Jlc3VsdCA9PSBIQ0lfU1VDQ0VTUykgeworCXJldCA9IGdldF9mYW5fc3RhdHVzKGRldiwgJnZhbHVlKTsKKwlpZiAoIXJldCkgewogCQlzZXFfcHJpbnRmKG0sICJydW5uaW5nOiAgICAgICAgICAgICAgICAgJWRcbiIsICh2YWx1ZSA+IDApKTsKLQkJc2VxX3ByaW50ZihtLCAiZm9yY2Vfb246ICAgICAgICAgICAgICAgICVkXG4iLCBmb3JjZV9mYW4pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiRXJyb3IgcmVhZGluZyBmYW4gc3RhdHVzXG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiZm9yY2Vfb246ICAgICAgICAgICAgICAgICVkXG4iLCBkZXYtPmZvcmNlX2Zhbik7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBmYW5fcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBmYW5fcHJvY19zaG93LCBOVUxMKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZmFuX3Byb2Nfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGZhbl9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgY21kWzQyXTsKIAlzaXplX3QgbGVuOwogCWludCB2YWx1ZTsKQEAgLTcwOSwxMSArNjk3LDExIEBACiAKIAlpZiAoc3NjYW5mKGNtZCwgIiBmb3JjZV9vbiA6ICVpIiwgJnZhbHVlKSA9PSAxICYmCiAJICAgIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMSkgewotCQloY2lfd3JpdGUxKEhDSV9GQU4sIHZhbHVlLCAmaGNpX3Jlc3VsdCk7CisJCWhjaV93cml0ZTEoZGV2LCBIQ0lfRkFOLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCQlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykKLQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIC1FSU87CiAJCWVsc2UKLQkJCWZvcmNlX2ZhbiA9IHZhbHVlOworCQkJZGV2LT5mb3JjZV9mYW4gPSB2YWx1ZTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03MzIsNDIgKzcyMCw0MyBAQAogCiBzdGF0aWMgaW50IGtleXNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gbS0+cHJpdmF0ZTsKIAl1MzIgaGNpX3Jlc3VsdDsKIAl1MzIgdmFsdWU7CiAKLQlpZiAoIWtleV9ldmVudF92YWxpZCkgewotCQloY2lfcmVhZDEoSENJX1NZU1RFTV9FVkVOVCwgJnZhbHVlLCAmaGNpX3Jlc3VsdCk7CisJaWYgKCFkZXYtPmtleV9ldmVudF92YWxpZCkgeworCQloY2lfcmVhZDEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKIAkJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpIHsKLQkJCWtleV9ldmVudF92YWxpZCA9IDE7Ci0JCQlsYXN0X2tleV9ldmVudCA9IHZhbHVlOworCQkJZGV2LT5rZXlfZXZlbnRfdmFsaWQgPSAxOworCQkJZGV2LT5sYXN0X2tleV9ldmVudCA9IHZhbHVlOwogCQl9IGVsc2UgaWYgKGhjaV9yZXN1bHQgPT0gSENJX0VNUFRZKSB7CiAJCQkvKiBiZXR0ZXIgbHVjayBuZXh0IHRpbWUgKi8KIAkJfSBlbHNlIGlmIChoY2lfcmVzdWx0ID09IEhDSV9OT1RfU1VQUE9SVEVEKSB7CiAJCQkvKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYW4gdW5yZXNvbHZlZCBpc3N1ZSBvbgogCQkJICogc29tZSBtYWNoaW5lcyB3aGVyZSBzeXN0ZW0gZXZlbnRzIHNwb3JhZGljYWxseQogCQkJICogYmVjb21lIGRpc2FibGVkLiAqLwotCQkJaGNpX3dyaXRlMShIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CisJCQloY2lfd3JpdGUxKGRldiwgSENJX1NZU1RFTV9FVkVOVCwgMSwgJmhjaV9yZXN1bHQpOwogCQkJcHJfbm90aWNlKCJSZS1lbmFibGVkIGhvdGtleXNcbiIpOwogCQl9IGVsc2UgewogCQkJcHJfZXJyKCJFcnJvciByZWFkaW5nIGhvdGtleSBzdGF0dXNcbiIpOwotCQkJZ290byBlbmQ7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KIAotCXNlcV9wcmludGYobSwgImhvdGtleV9yZWFkeTogICAgICAgICAgICAlZFxuIiwga2V5X2V2ZW50X3ZhbGlkKTsKLQlzZXFfcHJpbnRmKG0sICJob3RrZXk6ICAgICAgICAgICAgICAgICAgMHglMDR4XG4iLCBsYXN0X2tleV9ldmVudCk7Ci1lbmQ6CisJc2VxX3ByaW50ZihtLCAiaG90a2V5X3JlYWR5OiAgICAgICAgICAgICVkXG4iLCBkZXYtPmtleV9ldmVudF92YWxpZCk7CisJc2VxX3ByaW50ZihtLCAiaG90a2V5OiAgICAgICAgICAgICAgICAgIDB4JTA0eFxuIiwgZGV2LT5sYXN0X2tleV9ldmVudCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2V5c19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGtleXNfcHJvY19zaG93LCBOVUxMKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwga2V5c19wcm9jX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCiBzdGF0aWMgc3NpemVfdCBrZXlzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2ID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgY21kWzQyXTsKIAlzaXplX3QgbGVuOwogCWludCB2YWx1ZTsKQEAgLTc3OCw3ICs3NjcsNyBAQAogCWNtZFtsZW5dID0gJ1wwJzsKIAogCWlmIChzc2NhbmYoY21kLCAiIGhvdGtleV9yZWFkeSA6ICVpIiwgJnZhbHVlKSA9PSAxICYmIHZhbHVlID09IDApIHsKLQkJa2V5X2V2ZW50X3ZhbGlkID0gMDsKKwkJZGV2LT5rZXlfZXZlbnRfdmFsaWQgPSAwOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgyMCwyMSArODA5LDM1IEBACiAKICNkZWZpbmUgUFJPQ19UT1NISUJBCQkidG9zaGliYSIKIAotc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV90b3NoaWJhX3Byb2NfZW50cmllcyh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0CitjcmVhdGVfdG9zaGliYV9wcm9jX2VudHJpZXMoc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldikKIHsKLQlwcm9jX2NyZWF0ZSgibGNkIiwgU19JUlVHTyB8IFNfSVdVU1IsIHRvc2hpYmFfcHJvY19kaXIsICZsY2RfcHJvY19mb3BzKTsKLQlwcm9jX2NyZWF0ZSgidmlkZW8iLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwgJnZpZGVvX3Byb2NfZm9wcyk7Ci0JcHJvY19jcmVhdGUoImZhbiIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLCAmZmFuX3Byb2NfZm9wcyk7Ci0JcHJvY19jcmVhdGUoImtleXMiLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwgJmtleXNfcHJvY19mb3BzKTsKLQlwcm9jX2NyZWF0ZSgidmVyc2lvbiIsIFNfSVJVR08sIHRvc2hpYmFfcHJvY19kaXIsICZ2ZXJzaW9uX3Byb2NfZm9wcyk7CisJaWYgKGRldi0+YmFja2xpZ2h0X2RldikKKwkJcHJvY19jcmVhdGVfZGF0YSgibGNkIiwgU19JUlVHTyB8IFNfSVdVU1IsIHRvc2hpYmFfcHJvY19kaXIsCisJCQkJICZsY2RfcHJvY19mb3BzLCBkZXYpOworCWlmIChkZXYtPnZpZGVvX3N1cHBvcnRlZCkKKwkJcHJvY19jcmVhdGVfZGF0YSgidmlkZW8iLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwKKwkJCQkgJnZpZGVvX3Byb2NfZm9wcywgZGV2KTsKKwlpZiAoZGV2LT5mYW5fc3VwcG9ydGVkKQorCQlwcm9jX2NyZWF0ZV9kYXRhKCJmYW4iLCBTX0lSVUdPIHwgU19JV1VTUiwgdG9zaGliYV9wcm9jX2RpciwKKwkJCQkgJmZhbl9wcm9jX2ZvcHMsIGRldik7CisJaWYgKGRldi0+aG90a2V5X2RldikKKwkJcHJvY19jcmVhdGVfZGF0YSgia2V5cyIsIFNfSVJVR08gfCBTX0lXVVNSLCB0b3NoaWJhX3Byb2NfZGlyLAorCQkJCSAma2V5c19wcm9jX2ZvcHMsIGRldik7CisJcHJvY19jcmVhdGVfZGF0YSgidmVyc2lvbiIsIFNfSVJVR08sIHRvc2hpYmFfcHJvY19kaXIsCisJCQkgJnZlcnNpb25fcHJvY19mb3BzLCBkZXYpOwogfQogCi1zdGF0aWMgdm9pZCByZW1vdmVfdG9zaGliYV9wcm9jX2VudHJpZXModm9pZCkKK3N0YXRpYyB2b2lkIHJlbW92ZV90b3NoaWJhX3Byb2NfZW50cmllcyhzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2KQogewotCXJlbW92ZV9wcm9jX2VudHJ5KCJsY2QiLCB0b3NoaWJhX3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeSgidmlkZW8iLCB0b3NoaWJhX3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeSgiZmFuIiwgdG9zaGliYV9wcm9jX2Rpcik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImtleXMiLCB0b3NoaWJhX3Byb2NfZGlyKTsKKwlpZiAoZGV2LT5iYWNrbGlnaHRfZGV2KQorCQlyZW1vdmVfcHJvY19lbnRyeSgibGNkIiwgdG9zaGliYV9wcm9jX2Rpcik7CisJaWYgKGRldi0+dmlkZW9fc3VwcG9ydGVkKQorCQlyZW1vdmVfcHJvY19lbnRyeSgidmlkZW8iLCB0b3NoaWJhX3Byb2NfZGlyKTsKKwlpZiAoZGV2LT5mYW5fc3VwcG9ydGVkKQorCQlyZW1vdmVfcHJvY19lbnRyeSgiZmFuIiwgdG9zaGliYV9wcm9jX2Rpcik7CisJaWYgKGRldi0+aG90a2V5X2RldikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImtleXMiLCB0b3NoaWJhX3Byb2NfZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgidmVyc2lvbiIsIHRvc2hpYmFfcHJvY19kaXIpOwogfQogCkBAIC04NDMsMTQgKzg0NiwxOTcgQEAKICAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gc2V0X2xjZF9zdGF0dXMsCiB9OwogCi1zdGF0aWMgdm9pZCB0b3NoaWJhX2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpjb250ZXh0KQorc3RhdGljIGludCBfX2RldmluaXQgdG9zaGliYV9hY3BpX3NldHVwX2tleWJvYXJkKHN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCBlcnJvcjsKKworCWRldi0+aG90a2V5X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghZGV2LT5ob3RrZXlfZGV2KSB7CisJCXByX2luZm8oIlVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXYtPmhvdGtleV9kZXYtPm5hbWUgPSAiVG9zaGliYSBpbnB1dCBkZXZpY2UiOworCWRldi0+aG90a2V5X2Rldi0+cGh5cyA9ICJ0b3NoaWJhX2FjcGkvaW5wdXQwIjsKKwlkZXYtPmhvdGtleV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKworCWVycm9yID0gc3BhcnNlX2tleW1hcF9zZXR1cChkZXYtPmhvdGtleV9kZXYsIHRvc2hpYmFfYWNwaV9rZXltYXAsIE5VTEwpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChkZXYtPmFjcGlfZGV2LT5oYW5kbGUsICJFTkFCIiwgTlVMTCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByX2luZm8oIlVuYWJsZSB0byBlbmFibGUgaG90a2V5c1xuIik7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZV9rZXltYXA7CisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGV2LT5ob3RrZXlfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfa2V5bWFwOworCX0KKworCXJldHVybiAwOworCisgZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShkZXYtPmhvdGtleV9kZXYpOworIGVycl9mcmVlX2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShkZXYtPmhvdGtleV9kZXYpOworCWRldi0+aG90a2V5X2RldiA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHRvc2hpYmFfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiwgaW50IHR5cGUpCit7CisJc3RydWN0IHRvc2hpYmFfYWNwaV9kZXYgKmRldiA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaV9kZXYpOworCisJcmVtb3ZlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKGRldik7CisKKwlpZiAoZGV2LT5ob3RrZXlfZGV2KSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aG90a2V5X2Rldik7CisJCXNwYXJzZV9rZXltYXBfZnJlZShkZXYtPmhvdGtleV9kZXYpOworCX0KKworCWlmIChkZXYtPmJ0X3JmaykgeworCQlyZmtpbGxfdW5yZWdpc3RlcihkZXYtPmJ0X3Jmayk7CisJCXJma2lsbF9kZXN0cm95KGRldi0+YnRfcmZrKTsKKwl9CisKKwlpZiAoZGV2LT5iYWNrbGlnaHRfZGV2KQorCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZGV2LT5iYWNrbGlnaHRfZGV2KTsKKworCWlmIChkZXYtPmlsbHVtaW5hdGlvbl9zdXBwb3J0ZWQpCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkZXYtPmxlZF9kZXYpOworCisJa2ZyZWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIF9fZGV2aW5pdCBmaW5kX2hjaV9tZXRob2QoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSBoY2lfaGFuZGxlOworCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIkdIQ0kiLCAmaGNpX2hhbmRsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gIkdIQ0kiOworCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIlNQRkMiLCAmaGNpX2hhbmRsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gIlNQRkMiOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRvc2hpYmFfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldikKK3sKKwlzdHJ1Y3QgdG9zaGliYV9hY3BpX2RldiAqZGV2OworCWNvbnN0IGNoYXIgKmhjaV9tZXRob2Q7CisJdTMyIGhjaV9yZXN1bHQ7CisJdTMyIGR1bW15OworCWJvb2wgYnRfcHJlc2VudDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisKKwlwcl9pbmZvKCJUb3NoaWJhIExhcHRvcCBBQ1BJIEV4dHJhcyB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBUT1NISUJBX0FDUElfVkVSU0lPTik7CisKKwloY2lfbWV0aG9kID0gZmluZF9oY2lfbWV0aG9kKGFjcGlfZGV2LT5oYW5kbGUpOworCWlmICghaGNpX21ldGhvZCkgeworCQlwcl9lcnIoIkhDSSBpbnRlcmZhY2Ugbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZXYtPmFjcGlfZGV2ID0gYWNwaV9kZXY7CisJZGV2LT5tZXRob2RfaGNpID0gaGNpX21ldGhvZDsKKwlhY3BpX2Rldi0+ZHJpdmVyX2RhdGEgPSBkZXY7CisKKwlpZiAodG9zaGliYV9hY3BpX3NldHVwX2tleWJvYXJkKGRldikpCisJCXByX2luZm8oIlVuYWJsZSB0byBhY3RpdmF0ZSBob3RrZXlzXG4iKTsKKworCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOworCisJLyogZW5hYmxlIGV2ZW50IGZpZm8gKi8KKwloY2lfd3JpdGUxKGRldiwgSENJX1NZU1RFTV9FVkVOVCwgMSwgJmhjaV9yZXN1bHQpOworCisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKKwlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMgLSAxOworCWRldi0+YmFja2xpZ2h0X2RldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInRvc2hpYmEiLAorCQkJCQkJICAgICAgICZhY3BpX2Rldi0+ZGV2LAorCQkJCQkJICAgICAgIGRldiwKKwkJCQkJCSAgICAgICAmdG9zaGliYV9iYWNrbGlnaHRfZGF0YSwKKwkJCQkJCSAgICAgICAmcHJvcHMpOworCWlmIChJU19FUlIoZGV2LT5iYWNrbGlnaHRfZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRldi0+YmFja2xpZ2h0X2Rldik7CisKKwkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgdG9zaGliYSBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJZGV2LT5iYWNrbGlnaHRfZGV2ID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5iYWNrbGlnaHRfZGV2LT5wcm9wcy5icmlnaHRuZXNzID0gZ2V0X2xjZChkZXYtPmJhY2tsaWdodF9kZXYpOworCisJLyogUmVnaXN0ZXIgcmZraWxsIHN3aXRjaCBmb3IgQmx1ZXRvb3RoICovCisJaWYgKGhjaV9nZXRfYnRfcHJlc2VudChkZXYsICZidF9wcmVzZW50KSA9PSBIQ0lfU1VDQ0VTUyAmJiBidF9wcmVzZW50KSB7CisJCWRldi0+YnRfcmZrID0gcmZraWxsX2FsbG9jKCJUb3NoaWJhIEJsdWV0b290aCIsCisJCQkJCSAgICZhY3BpX2Rldi0+ZGV2LAorCQkJCQkgICBSRktJTExfVFlQRV9CTFVFVE9PVEgsCisJCQkJCSAgICZ0b3NoaWJhX3Jma19vcHMsCisJCQkJCSAgIGRldik7CisJCWlmICghZGV2LT5idF9yZmspIHsKKwkJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIHJma2lsbCBkZXZpY2VcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlyZXQgPSByZmtpbGxfcmVnaXN0ZXIoZGV2LT5idF9yZmspOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoInVuYWJsZSB0byByZWdpc3RlciByZmtpbGwgZGV2aWNlXG4iKTsKKwkJCXJma2lsbF9kZXN0cm95KGRldi0+YnRfcmZrKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlpZiAodG9zaGliYV9pbGx1bWluYXRpb25fYXZhaWxhYmxlKGRldikpIHsKKwkJZGV2LT5sZWRfZGV2Lm5hbWUgPSAidG9zaGliYTo6aWxsdW1pbmF0aW9uIjsKKwkJZGV2LT5sZWRfZGV2Lm1heF9icmlnaHRuZXNzID0gMTsKKwkJZGV2LT5sZWRfZGV2LmJyaWdodG5lc3Nfc2V0ID0gdG9zaGliYV9pbGx1bWluYXRpb25fc2V0OworCQlkZXYtPmxlZF9kZXYuYnJpZ2h0bmVzc19nZXQgPSB0b3NoaWJhX2lsbHVtaW5hdGlvbl9nZXQ7CisJCWlmICghbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZhY3BpX2Rldi0+ZGV2LCAmZGV2LT5sZWRfZGV2KSkKKwkJCWRldi0+aWxsdW1pbmF0aW9uX3N1cHBvcnRlZCA9IDE7CisJfQorCisJLyogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IEJJT1Mgc3VwcG9ydHMgZmFuIGFuZCB2aWRlbyBpbnRlcmZhY2VzICovCisKKwlyZXQgPSBnZXRfdmlkZW9fc3RhdHVzKGRldiwgJmR1bW15KTsKKwlkZXYtPnZpZGVvX3N1cHBvcnRlZCA9ICFyZXQ7CisKKwlyZXQgPSBnZXRfZmFuX3N0YXR1cyhkZXYsICZkdW1teSk7CisJZGV2LT5mYW5fc3VwcG9ydGVkID0gIXJldDsKKworCWNyZWF0ZV90b3NoaWJhX3Byb2NfZW50cmllcyhkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXRvc2hpYmFfYWNwaV9yZW1vdmUoYWNwaV9kZXYsIDApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRvc2hpYmFfYWNwaV9ub3RpZnkoc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiwgdTMyIGV2ZW50KQoreworCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGlfZGV2KTsKIAl1MzIgaGNpX3Jlc3VsdCwgdmFsdWU7CiAKIAlpZiAoZXZlbnQgIT0gMHg4MCkKIAkJcmV0dXJuOwogCWRvIHsKLQkJaGNpX3JlYWQxKEhDSV9TWVNURU1fRVZFTlQsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOworCQloY2lfcmVhZDEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKIAkJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpIHsKIAkJCWlmICh2YWx1ZSA9PSAweDEwMCkKIAkJCQljb250aW51ZTsKQEAgLTg1OCw3ICsxMDQ0LDcgQEAKIAkJCWlmICh2YWx1ZSAmIDB4ODApCiAJCQkJY29udGludWU7CiAKLQkJCWlmICghc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQodG9zaGliYV9hY3BpLmhvdGtleV9kZXYsCisJCQlpZiAoIXNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50KGRldi0+aG90a2V5X2RldiwKIAkJCQkJCQl2YWx1ZSwgMSwgdHJ1ZSkpIHsKIAkJCQlwcl9pbmZvKCJVbmtub3duIGtleSAleFxuIiwKIAkJCQkgICAgICAgdmFsdWUpOwpAQCAtODY3LDIwMCArMTA1Myw0OSBAQAogCQkJLyogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGFuIHVucmVzb2x2ZWQgaXNzdWUgb24KIAkJCSAqIHNvbWUgbWFjaGluZXMgd2hlcmUgc3lzdGVtIGV2ZW50cyBzcG9yYWRpY2FsbHkKIAkJCSAqIGJlY29tZSBkaXNhYmxlZC4gKi8KLQkJCWhjaV93cml0ZTEoSENJX1NZU1RFTV9FVkVOVCwgMSwgJmhjaV9yZXN1bHQpOworCQkJaGNpX3dyaXRlMShkZXYsIEhDSV9TWVNURU1fRVZFTlQsIDEsICZoY2lfcmVzdWx0KTsKIAkJCXByX25vdGljZSgiUmUtZW5hYmxlZCBob3RrZXlzXG4iKTsKIAkJfQogCX0gd2hpbGUgKGhjaV9yZXN1bHQgIT0gSENJX0VNUFRZKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgdG9zaGliYV9hY3BpX3NldHVwX2tleWJvYXJkKGNoYXIgKmRldmljZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JaW50IGVycm9yOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGRldmljZSwgJnRvc2hpYmFfYWNwaS5oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gZ2V0IG5vdGlmaWNhdGlvbiBkZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl0b3NoaWJhX2FjcGkuaG90a2V5X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghdG9zaGliYV9hY3BpLmhvdGtleV9kZXYpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2LT5uYW1lID0gIlRvc2hpYmEgaW5wdXQgZGV2aWNlIjsKLQl0b3NoaWJhX2FjcGkuaG90a2V5X2Rldi0+cGh5cyA9IGRldmljZTsKLQl0b3NoaWJhX2FjcGkuaG90a2V5X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCi0JZXJyb3IgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2LAotCQkJCSAgICB0b3NoaWJhX2FjcGlfa2V5bWFwLCBOVUxMKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZXJyX2ZyZWVfZGV2OwotCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKHRvc2hpYmFfYWNwaS5oYW5kbGUsCi0JCQkJQUNQSV9ERVZJQ0VfTk9USUZZLCB0b3NoaWJhX2FjcGlfbm90aWZ5LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGluc3RhbGwgaG90a2V5IG5vdGlmaWNhdGlvblxuIik7Ci0JCWVycm9yID0gLUVOT0RFVjsKLQkJZ290byBlcnJfZnJlZV9rZXltYXA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QodG9zaGliYV9hY3BpLmhhbmRsZSwgIkVOQUIiLCBOVUxMLCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGVuYWJsZSBob3RrZXlzXG4iKTsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGVycl9yZW1vdmVfbm90aWZ5OwotCX0KLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX3JlbW92ZV9ub3RpZnk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBlcnJfcmVtb3ZlX25vdGlmeToKLQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcih0b3NoaWJhX2FjcGkuaGFuZGxlLAotCQkJCSAgIEFDUElfREVWSUNFX05PVElGWSwgdG9zaGliYV9hY3BpX25vdGlmeSk7Ci0gZXJyX2ZyZWVfa2V5bWFwOgotCXNwYXJzZV9rZXltYXBfZnJlZSh0b3NoaWJhX2FjcGkuaG90a2V5X2Rldik7Ci0gZXJyX2ZyZWVfZGV2OgotCWlucHV0X2ZyZWVfZGV2aWNlKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KTsKLQl0b3NoaWJhX2FjcGkuaG90a2V5X2RldiA9IE5VTEw7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdm9pZCB0b3NoaWJhX2FjcGlfZXhpdCh2b2lkKQotewotCWlmICh0b3NoaWJhX2FjcGkuaG90a2V5X2RldikgewotCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcih0b3NoaWJhX2FjcGkuaGFuZGxlLAotCQkJCUFDUElfREVWSUNFX05PVElGWSwgdG9zaGliYV9hY3BpX25vdGlmeSk7Ci0JCXNwYXJzZV9rZXltYXBfZnJlZSh0b3NoaWJhX2FjcGkuaG90a2V5X2Rldik7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRvc2hpYmFfYWNwaS5ob3RrZXlfZGV2KTsKLQl9Ci0KLQlpZiAodG9zaGliYV9hY3BpLmJ0X3JmaykgewotCQlyZmtpbGxfdW5yZWdpc3Rlcih0b3NoaWJhX2FjcGkuYnRfcmZrKTsKLQkJcmZraWxsX2Rlc3Ryb3kodG9zaGliYV9hY3BpLmJ0X3Jmayk7Ci0JfQotCi0JaWYgKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSkKLQkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSk7Ci0KLQlyZW1vdmVfdG9zaGliYV9wcm9jX2VudHJpZXMoKTsKLQotCWlmICh0b3NoaWJhX3Byb2NfZGlyKQotCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1RPU0hJQkEsIGFjcGlfcm9vdF9kaXIpOwotCi0JaWYgKHRvc2hpYmFfYWNwaS5pbGx1bWluYXRpb25faW5zdGFsbGVkKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmdG9zaGliYV9sZWQpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodG9zaGliYV9hY3BpLnBfZGV2KTsKLQotCXJldHVybjsKLX0KK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgdG9zaGliYV9hY3BpX2RyaXZlciA9IHsKKwkubmFtZQk9ICJUb3NoaWJhIEFDUEkgZHJpdmVyIiwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWRzCT0gdG9zaGliYV9kZXZpY2VfaWRzLAorCS5mbGFncwk9IEFDUElfRFJJVkVSX0FMTF9OT1RJRllfRVZFTlRTLAorCS5vcHMJPSB7CisJCS5hZGQJCT0gdG9zaGliYV9hY3BpX2FkZCwKKwkJLnJlbW92ZQkJPSB0b3NoaWJhX2FjcGlfcmVtb3ZlLAorCQkubm90aWZ5CQk9IHRvc2hpYmFfYWNwaV9ub3RpZnksCisJfSwKK307CiAKIHN0YXRpYyBpbnQgX19pbml0IHRvc2hpYmFfYWNwaV9pbml0KHZvaWQpCiB7Ci0JdTMyIGhjaV9yZXN1bHQ7Ci0JYm9vbCBidF9wcmVzZW50OwotCWludCByZXQgPSAwOwotCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKLQotCWlmIChhY3BpX2Rpc2FibGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIHNpbXBsZSBkZXZpY2UgZGV0ZWN0aW9uOiBsb29rIGZvciBIQ0kgbWV0aG9kICovCi0JaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChUT1NIX0lOVEVSRkFDRV8xIEdIQ0lfTUVUSE9EKSkgewotCQltZXRob2RfaGNpID0gVE9TSF9JTlRFUkZBQ0VfMSBHSENJX01FVEhPRDsKLQkJaWYgKHRvc2hpYmFfYWNwaV9zZXR1cF9rZXlib2FyZChUT1NIX0lOVEVSRkFDRV8xKSkKLQkJCXByX2luZm8oIlVuYWJsZSB0byBhY3RpdmF0ZSBob3RrZXlzXG4iKTsKLQl9IGVsc2UgaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChUT1NIX0lOVEVSRkFDRV8yIEdIQ0lfTUVUSE9EKSkgewotCQltZXRob2RfaGNpID0gVE9TSF9JTlRFUkZBQ0VfMiBHSENJX01FVEhPRDsKLQkJaWYgKHRvc2hpYmFfYWNwaV9zZXR1cF9rZXlib2FyZChUT1NIX0lOVEVSRkFDRV8yKSkKLQkJCXByX2luZm8oIlVuYWJsZSB0byBhY3RpdmF0ZSBob3RrZXlzXG4iKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcl9pbmZvKCJUb3NoaWJhIExhcHRvcCBBQ1BJIEV4dHJhcyB2ZXJzaW9uICVzXG4iLAotCSAgICAgICBUT1NISUJBX0FDUElfVkVSU0lPTik7Ci0JcHJfaW5mbygiICAgIEhDSSBtZXRob2Q6ICVzXG4iLCBtZXRob2RfaGNpKTsKLQotCW11dGV4X2luaXQoJnRvc2hpYmFfYWNwaS5tdXRleCk7Ci0KLQl0b3NoaWJhX2FjcGkucF9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJ0b3NoaWJhX2FjcGkiLAotCQkJCQkJCSAgICAgIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKHRvc2hpYmFfYWNwaS5wX2RldikpIHsKLQkJcmV0ID0gUFRSX0VSUih0b3NoaWJhX2FjcGkucF9kZXYpOwotCQlwcl9lcnIoInVuYWJsZSB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQl0b3NoaWJhX2FjcGkucF9kZXYgPSBOVUxMOwotCQl0b3NoaWJhX2FjcGlfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWZvcmNlX2ZhbiA9IDA7Ci0Ja2V5X2V2ZW50X3ZhbGlkID0gMDsKLQotCS8qIGVuYWJsZSBldmVudCBmaWZvICovCi0JaGNpX3dyaXRlMShIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CisJaW50IHJldDsKIAogCXRvc2hpYmFfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBST0NfVE9TSElCQSwgYWNwaV9yb290X2Rpcik7CiAJaWYgKCF0b3NoaWJhX3Byb2NfZGlyKSB7Ci0JCXRvc2hpYmFfYWNwaV9leGl0KCk7CisJCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiIFBST0NfVE9TSElCQSAiXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlIHsKLQkJY3JlYXRlX3Rvc2hpYmFfcHJvY19lbnRyaWVzKCk7CiAJfQogCi0JcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKLQlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMgLSAxOwotCXRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInRvc2hpYmEiLAotCQkJCQkJCSAgICAgJnRvc2hpYmFfYWNwaS5wX2Rldi0+ZGV2LAotCQkJCQkJCSAgICAgTlVMTCwKLQkJCQkJCQkgICAgICZ0b3NoaWJhX2JhY2tsaWdodF9kYXRhLAotCQkJCQkJCSAgICAgJnByb3BzKTsKLSAgICAgICAgaWYgKElTX0VSUih0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UpKSB7Ci0JCXJldCA9IFBUUl9FUlIodG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlKTsKLQotCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciB0b3NoaWJhIGJhY2tsaWdodCBkZXZpY2VcbiIpOwotCQl0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOwotCQl0b3NoaWJhX2FjcGlfZXhpdCgpOwotCQlyZXR1cm4gcmV0OworCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmdG9zaGliYV9hY3BpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBBQ1BJIGRyaXZlcjogJWRcbiIsIHJldCk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfVE9TSElCQSwgYWNwaV9yb290X2Rpcik7CiAJfQogCi0JLyogUmVnaXN0ZXIgcmZraWxsIHN3aXRjaCBmb3IgQmx1ZXRvb3RoICovCi0JaWYgKGhjaV9nZXRfYnRfcHJlc2VudCgmYnRfcHJlc2VudCkgPT0gSENJX1NVQ0NFU1MgJiYgYnRfcHJlc2VudCkgewotCQl0b3NoaWJhX2FjcGkuYnRfcmZrID0gcmZraWxsX2FsbG9jKHRvc2hpYmFfYWNwaS5idF9uYW1lLAotCQkJCQkJICAgJnRvc2hpYmFfYWNwaS5wX2Rldi0+ZGV2LAotCQkJCQkJICAgUkZLSUxMX1RZUEVfQkxVRVRPT1RILAotCQkJCQkJICAgJnRvc2hpYmFfcmZrX29wcywKLQkJCQkJCSAgICZ0b3NoaWJhX2FjcGkpOwotCQlpZiAoIXRvc2hpYmFfYWNwaS5idF9yZmspIHsKLQkJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIHJma2lsbCBkZXZpY2VcbiIpOwotCQkJdG9zaGliYV9hY3BpX2V4aXQoKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CisJcmV0dXJuIHJldDsKK30KIAotCQlyZXQgPSByZmtpbGxfcmVnaXN0ZXIodG9zaGliYV9hY3BpLmJ0X3Jmayk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigidW5hYmxlIHRvIHJlZ2lzdGVyIHJma2lsbCBkZXZpY2VcbiIpOwotCQkJcmZraWxsX2Rlc3Ryb3kodG9zaGliYV9hY3BpLmJ0X3Jmayk7Ci0JCQl0b3NoaWJhX2FjcGlfZXhpdCgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXRvc2hpYmFfYWNwaS5pbGx1bWluYXRpb25faW5zdGFsbGVkID0gMDsKLQlpZiAodG9zaGliYV9pbGx1bWluYXRpb25fYXZhaWxhYmxlKCkpIHsKLQkJaWYgKCFsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJih0b3NoaWJhX2FjcGkucF9kZXYtPmRldiksCi0JCQkJCSAgICZ0b3NoaWJhX2xlZCkpCi0JCQl0b3NoaWJhX2FjcGkuaWxsdW1pbmF0aW9uX2luc3RhbGxlZCA9IDE7Ci0JfQotCi0JcmV0dXJuIDA7CitzdGF0aWMgdm9pZCBfX2V4aXQgdG9zaGliYV9hY3BpX2V4aXQodm9pZCkKK3sKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmdG9zaGliYV9hY3BpX2RyaXZlcik7CisJaWYgKHRvc2hpYmFfcHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfVE9TSElCQSwgYWNwaV9yb290X2Rpcik7CiB9CiAKIG1vZHVsZV9pbml0KHRvc2hpYmFfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3dtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMKaW5kZXggZjIzZDVhOC4uYTEzNGMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIApAQCAtNzU0LDkgKzc1NSwxMyBAQAogCXN0cnVjdCB3bWlfYmxvY2sgKndibG9jaywgKm5leHQ7CiAKIAkvKiBEZWxldGUgZGV2aWNlcyBmb3IgYWxsIHRoZSBHVUlEcyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YmxvY2ssIG5leHQsICZ3bWlfYmxvY2tfbGlzdCwgbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2Jsb2NrLCBuZXh0LCAmd21pX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJndibG9jay0+bGlzdCk7CiAJCWlmICh3YmxvY2stPmRldi5jbGFzcykKIAkJCWRldmljZV91bnJlZ2lzdGVyKCZ3YmxvY2stPmRldik7CisJCWVsc2UKKwkJCWtmcmVlKHdibG9jayk7CisJfQogfQogCiBzdGF0aWMgYm9vbCBndWlkX2FscmVhZHlfcGFyc2VkKGNvbnN0IGNoYXIgKmd1aWRfc3RyaW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwppbmRleCBjYTg0ZDUwLi5iMDBjMTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCmluZGV4IGJiZjNlZGQuLjViZTRhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKQEAgLTUwOSwxNSArNTA5LDEyIEBACiAJCQkJCSAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgKnApCiB7CiAJaW50IGk7Ci0JdW5zaWduZWQgY2hhciBtYXAgPSAwLCBmbGFncyA9IDA7Ci0KLQlpZiAocC0+Y2hhbm5lbF9jb3VudCA9PSAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOworCXVuc2lnbmVkIGNoYXIgbWFwID0gMCwgZmxhZ3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcC0+Y2hhbm5lbF9jb3VudDsgaSsrKQogCQltYXAgfD0gMSA8PCBwLT5jaGFubmVsc1tpXTsKIAotCWZsYWdzIHw9IGRtYV9mbGFncyhkZXYsIHAtPnR5cGUsIHAtPmJ1c19tYXN0ZXIsIHAtPnRyYW5zZmVyKTsKKwlmbGFncyA9IGRtYV9mbGFncyhkZXYsIHAtPnR5cGUsIHAtPmJ1c19tYXN0ZXIsIHAtPnRyYW5zZmVyKTsKIAlwbnBfcmVnaXN0ZXJfZG1hX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBtYXAsIGZsYWdzKTsKIH0KIApAQCAtNTI3LDE3ICs1MjQsMTQgQEAKIHsKIAlpbnQgaTsKIAlwbnBfaXJxX21hc2tfdCBtYXA7Ci0JdW5zaWduZWQgY2hhciBmbGFncyA9IDA7Ci0KLQlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CisJdW5zaWduZWQgY2hhciBmbGFnczsKIAogCWJpdG1hcF96ZXJvKG1hcC5iaXRzLCBQTlBfSVJRX05SKTsKIAlmb3IgKGkgPSAwOyBpIDwgcC0+aW50ZXJydXB0X2NvdW50OyBpKyspCiAJCWlmIChwLT5pbnRlcnJ1cHRzW2ldKQogCQkJX19zZXRfYml0KHAtPmludGVycnVwdHNbaV0sIG1hcC5iaXRzKTsKIAotCWZsYWdzIHw9IGlycV9mbGFncyhwLT50cmlnZ2VyaW5nLCBwLT5wb2xhcml0eSwgcC0+c2hhcmFibGUpOworCWZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CiAJcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgJm1hcCwgZmxhZ3MpOwogfQogCkBAIC01NDcsMTAgKzU0MSw3IEBACiB7CiAJaW50IGk7CiAJcG5wX2lycV9tYXNrX3QgbWFwOwotCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwotCi0JaWYgKHAtPmludGVycnVwdF9jb3VudCA9PSAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CiAKIAliaXRtYXBfemVybyhtYXAuYml0cywgUE5QX0lSUV9OUik7CiAJZm9yIChpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKSB7CkBAIC01NjQsNyArNTU1LDcgQEAKIAkJfQogCX0KIAotCWZsYWdzIHw9IGlycV9mbGFncyhwLT50cmlnZ2VyaW5nLCBwLT5wb2xhcml0eSwgcC0+c2hhcmFibGUpOworCWZsYWdzID0gaXJxX2ZsYWdzKHAtPnRyaWdnZXJpbmcsIHAtPnBvbGFyaXR5LCBwLT5zaGFyYWJsZSk7CiAJcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgJm1hcCwgZmxhZ3MpOwogfQogCkBAIC01NzQsMTEgKzU2NSw4IEBACiB7CiAJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKLQlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlpZiAoaW8tPmlvX2RlY29kZSA9PSBBQ1BJX0RFQ09ERV8xNikKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JT18xNkJJVF9BRERSOworCQlmbGFncyA9IElPUkVTT1VSQ0VfSU9fMTZCSVRfQUREUjsKIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgaW8tPm1pbmltdW0sIGlvLT5tYXhpbXVtLAogCQkJCSAgIGlvLT5hbGlnbm1lbnQsIGlvLT5hZGRyZXNzX2xlbmd0aCwgZmxhZ3MpOwogfQpAQCAtNTg3LDEzICs1NzUsOCBAQAogCQkJCQl1bnNpZ25lZCBpbnQgb3B0aW9uX2ZsYWdzLAogCQkJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqaW8pCiB7Ci0JdW5zaWduZWQgY2hhciBmbGFncyA9IDA7Ci0KLQlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgaW8tPmFkZHJlc3MsIGlvLT5hZGRyZXNzLAotCQkJCSAgIDAsIGlvLT5hZGRyZXNzX2xlbmd0aCwgZmxhZ3MgfCBJT1JFU09VUkNFX0lPX0ZJWEVEKTsKKwkJCQkgICAwLCBpby0+YWRkcmVzc19sZW5ndGgsIElPUkVTT1VSQ0VfSU9fRklYRUQpOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgcG5wYWNwaV9wYXJzZV9tZW0yNF9vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldiwKQEAgLTYwMiwxMSArNTg1LDggQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKIAotCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwotCiAJaWYgKHAtPndyaXRlX3Byb3RlY3QgPT0gQUNQSV9SRUFEX1dSSVRFX01FTU9SWSkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQlmbGFncyA9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5taW5pbXVtLCBwLT5tYXhpbXVtLAogCQkJCSAgcC0+YWxpZ25tZW50LCBwLT5hZGRyZXNzX2xlbmd0aCwgZmxhZ3MpOwogfQpAQCAtNjE3LDExICs1OTcsOCBAQAogewogCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOwogCi0JaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlpZiAocC0+d3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CisJCWZsYWdzID0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sIHAtPm1heGltdW0sCiAJCQkJICBwLT5hbGlnbm1lbnQsIHAtPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC02MzIsMTEgKzYwOSw4IEBACiB7CiAJdW5zaWduZWQgY2hhciBmbGFncyA9IDA7CiAKLQlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKLQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQogCWlmIChwLT53cml0ZV9wcm90ZWN0ID09IEFDUElfUkVBRF9XUklURV9NRU1PUlkpCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKKwkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+YWRkcmVzcywgcC0+YWRkcmVzcywKIAkJCQkgIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLCBmbGFncyk7CiB9CkBAIC02NTYsMTkgKzYzMCwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCi0JCWZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0KIAlpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgewogCQlpZiAocC0+aW5mby5tZW0ud3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQotCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOworCQkJZmxhZ3MgPSBJT1JFU09VUkNFX01FTV9XUklURUFCTEU7CiAJCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sCiAJCQkJCSAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCiAJCQkJCSAgZmxhZ3MpOwogCX0gZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKQogCQlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShkZXYsIG9wdGlvbl9mbGFncywgcC0+bWluaW11bSwKIAkJCQkJICAgcC0+bWluaW11bSwgMCwgcC0+YWRkcmVzc19sZW5ndGgsCi0JCQkJCSAgIGZsYWdzIHwgSU9SRVNPVVJDRV9JT19GSVhFRCk7CisJCQkJCSAgIElPUkVTT1VSQ0VfSU9fRklYRUQpOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgcG5wYWNwaV9wYXJzZV9leHRfYWRkcmVzc19vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldiwKQEAgLTY3OCwxOSArNjQ5LDE2IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0ICpwID0gJnItPmRhdGEuZXh0X2FkZHJlc3M2NDsKIAl1bnNpZ25lZCBjaGFyIGZsYWdzID0gMDsKIAotCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQotCQlmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwotCiAJaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJaWYgKHAtPmluZm8ubWVtLndyaXRlX3Byb3RlY3QgPT0gQUNQSV9SRUFEX1dSSVRFX01FTU9SWSkKLQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRTsKKwkJCWZsYWdzID0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCQlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKGRldiwgb3B0aW9uX2ZsYWdzLCBwLT5taW5pbXVtLAogCQkJCQkgIHAtPm1pbmltdW0sIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLAogCQkJCQkgIGZsYWdzKTsKIAl9IGVsc2UgaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkKIAkJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2UoZGV2LCBvcHRpb25fZmxhZ3MsIHAtPm1pbmltdW0sCiAJCQkJCSAgIHAtPm1pbmltdW0sIDAsIHAtPmFkZHJlc3NfbGVuZ3RoLAotCQkJCQkgICBmbGFncyB8IElPUkVTT1VSQ0VfSU9fRklYRUQpOworCQkJCQkgICBJT1JFU09VUkNFX0lPX0ZJWEVEKTsKIH0KIAogc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IDU3ZGUwNTEuLjlmODg2NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTcwLDYgKzcwLDcgQEAKIAogY29uZmlnIEJBVFRFUllfRFMyNzgwCiAJdHJpc3RhdGUgIkRTMjc4MCBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCXNlbGVjdCBXMQogCXNlbGVjdCBXMV9TTEFWRV9EUzI3ODAKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMKaW5kZXggMWZlZmU4Mi4uOTFhNzgzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9kczI3ODBfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZHMyNzgwX2JhdHRlcnkuYwpAQCAtMzksNiArMzksNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdDsKIAlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7CisJc3RydWN0IHRhc2tfc3RydWN0ICptdXRleF9ob2xkZXI7CiB9OwogCiBlbnVtIGN1cnJlbnRfdHlwZXMgewpAQCAtNDksOCArNTAsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIgbW9kZWxbXSA9ICJEUzI3ODAiOwogc3RhdGljIGNvbnN0IGNoYXIgbWFudWZhY3R1cmVyW10gPSAiTWF4aW0vRGFsbGFzIjsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICp0b19kczI3ODBfZGV2aWNlX2luZm8oCi0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICoKK3RvX2RzMjc4MF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8sIGJhdCk7CiB9CkBAIC02MCwxNyArNjEsMjggQEAKIAlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKGRldik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkOChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICp2YWwsIGludCBhZGRyKQorc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX2JhdHRlcnlfaW8oc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJY2hhciAqYnVmLCBpbnQgYWRkciwgc2l6ZV90IGNvdW50LCBpbnQgaW8pCiB7Ci0JcmV0dXJuIHcxX2RzMjc4MF9pbyhkZXYsIHZhbCwgYWRkciwgc2l6ZW9mKHU4KSwgMCk7CisJaWYgKGRldl9pbmZvLT5tdXRleF9ob2xkZXIgPT0gY3VycmVudCkKKwkJcmV0dXJuIHcxX2RzMjc4MF9pb19ub2xvY2soZGV2X2luZm8tPncxX2RldiwgYnVmLCBhZGRyLCBjb3VudCwgaW8pOworCWVsc2UKKwkJcmV0dXJuIHcxX2RzMjc4MF9pbyhkZXZfaW5mby0+dzFfZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CiB9CiAKLXN0YXRpYyBpbnQgZHMyNzgwX3JlYWQxNihzdHJ1Y3QgZGV2aWNlICpkZXYsIHMxNiAqdmFsLCBpbnQgYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkOChzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywgdTggKnZhbCwKKwlpbnQgYWRkcikKK3sKKwlyZXR1cm4gZHMyNzgwX2JhdHRlcnlfaW8oZGV2X2luZm8sIHZhbCwgYWRkciwgc2l6ZW9mKHU4KSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX3JlYWQxNihzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywgczE2ICp2YWwsCisJaW50IGFkZHIpCiB7CiAJaW50IHJldDsKIAl1OCByYXdbMl07CiAKLQlyZXQgPSB3MV9kczI3ODBfaW8oZGV2LCByYXcsIGFkZHIsIHNpemVvZih1OCkgKiAyLCAwKTsKKwlyZXQgPSBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgcmF3LCBhZGRyLCBzaXplb2YocmF3KSwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTc5LDE2ICs5MSwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkczI3ODBfcmVhZF9ibG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICp2YWwsIGludCBhZGRyLAotCXNpemVfdCBjb3VudCkKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkX2Jsb2NrKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXU4ICp2YWwsIGludCBhZGRyLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIHcxX2RzMjc4MF9pbyhkZXYsIHZhbCwgYWRkciwgY291bnQsIDApOworCXJldHVybiBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBjb3VudCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICp2YWwsIGludCBhZGRyLAotCXNpemVfdCBjb3VudCkKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF93cml0ZShzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywgdTggKnZhbCwKKwlpbnQgYWRkciwgc2l6ZV90IGNvdW50KQogewotCXJldHVybiB3MV9kczI3ODBfaW8oZGV2LCB2YWwsIGFkZHIsIGNvdW50LCAxKTsKKwlyZXR1cm4gZHMyNzgwX2JhdHRlcnlfaW8oZGV2X2luZm8sIHZhbCwgYWRkciwgY291bnQsIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkczI3ODBfc3RvcmVfZWVwcm9tKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGFkZHIpCkBAIC0xMjIsNyArMTM0LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLT53MV9kZXYsICZjb25kdWN0YW5jZSwKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sICZjb25kdWN0YW5jZSwKIAkJCQlEUzI3ODBfUlNOU1BfUkVHLCBzaXplb2YodTgpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTEzNCw3ICsxNDYsNyBAQAogc3RhdGljIGludCBkczI3ODBfZ2V0X3JzZ2Fpbl9yZWdpc3RlcihzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKIAl1MTYgKnJzZ2FpbikKIHsKLQlyZXR1cm4gZHMyNzgwX3JlYWQxNihkZXZfaW5mby0+dzFfZGV2LCByc2dhaW4sIERTMjc4MF9SU0dBSU5fTVNCX1JFRyk7CisJcmV0dXJuIGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sIHJzZ2FpbiwgRFMyNzgwX1JTR0FJTl9NU0JfUkVHKTsKIH0KIAogLyogU2V0IFJTR0FJTiB2YWx1ZSBmcm9tIDAgdG8gMS45OTkgaW4gc3RlcHMgb2YgMC4wMDEgKi8KQEAgLTE0NCw4ICsxNTYsOCBAQAogCWludCByZXQ7CiAJdTggcmF3W10gPSB7cnNnYWluID4+IDgsIHJzZ2FpbiAmIDB4RkZ9OwogCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLT53MV9kZXYsIHJhdywKLQkJCQlEUzI3ODBfUlNHQUlOX01TQl9SRUcsIHNpemVvZih1OCkgKiAyKTsKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sIHJhdywKKwkJCQlEUzI3ODBfUlNHQUlOX01TQl9SRUcsIHNpemVvZihyYXcpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTY3LDcgKzE3OSw3IEBACiAJICogQml0cyAyIC0gMCBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKIAkgKiB2b2x0YWdlIExTQiByZWdpc3RlcgogCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8tPncxX2RldiwgJnZvbHRhZ2VfcmF3LAorCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZ2b2x0YWdlX3JhdywKIAkJCQlEUzI3ODBfVk9MVF9NU0JfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTE5Niw3ICsyMDgsNyBAQAogCSAqIEJpdHMgMiAtIDAgb2YgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSA1IG9mIHRoZQogCSAqIHRlbXBlcmF0dXJlIExTQiByZWdpc3RlcgogCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8tPncxX2RldiwgJnRlbXBlcmF0dXJlX3JhdywKKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmdGVtcGVyYXR1cmVfcmF3LAogCQkJCURTMjc4MF9URU1QX01TQl9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMjIyLDEzICsyMzQsMTMgQEAKIAkgKiBUaGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQgZm9yIGN1cnJlbnQgYXJlIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YKIAkgKiB0aGUgc2Vuc2UgcmVzaXN0b3IuCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCWlmIChzZW5zZV9yZXNfcmF3ID09IDApIHsKIAkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAic2Vuc2UgcmVzaXN0b3IgdmFsdWUgaXMgMFxuIik7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzZW5zZV9yZXMgPSAxMDAwIC8gc2Vuc2VfcmVzX3JhdzsKIApAQCAtMjQ4LDcgKzI2MCw3IEBACiAJICogQml0cyA3IC0gMCBvZiB0aGUgY3VycmVudCB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgY3VycmVudAogCSAqIExTQiByZWdpc3RlcgogCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8tPncxX2RldiwgJmN1cnJlbnRfcmF3LCByZWdfbXNiKTsKKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIHJlZ19tc2IpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yNjcsNyArMjc5LDcgQEAKIAkgKiBUaGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQgZm9yIGFjY3VtdWxhdGVkIGN1cnJlbnQgYXJlIGRlcGVuZGVudCBvbgogCSAqIHRoZSB2YWx1ZSBvZiB0aGUgc2Vuc2UgcmVzaXN0b3IuCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjg1LDcgKzI5Nyw3IEBACiAJICogQml0cyA3IC0gMCBvZiB0aGUgQUNSIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBBQ1IKIAkgKiBMU0IgcmVnaXN0ZXIKIAkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLT53MV9kZXYsICZjdXJyZW50X3JhdywgRFMyNzgwX0FDUl9NU0JfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIERTMjc4MF9BQ1JfTVNCX1JFRyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTI5OSw3ICszMTEsNyBAQAogCWludCByZXQ7CiAJdTggcmF3OwogCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsICZyYXcsIERTMjc4MF9SQVJDX1JFRyk7CisJcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmcmF3LCBEUzI3ODBfUkFSQ19SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNDUsNyArMzU3LDcgQEAKIAkgKiBCaXRzIDcgLSAwIG9mIHRoZSBSQUFDIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBSQUFDCiAJICogTFNCIHJlZ2lzdGVyCiAJICovCi0JcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mby0+dzFfZGV2LCAmY2hhcmdlX3JhdywgRFMyNzgwX1JBQUNfTVNCX1JFRyk7CisJcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mbywgJmNoYXJnZV9yYXcsIERTMjc4MF9SQUFDX01TQl9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNTYsNyArMzY4LDcgQEAKIHN0YXRpYyBpbnQgZHMyNzgwX2dldF9jb250cm9sX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAogCXU4ICpjb250cm9sX3JlZykKIHsKLQlyZXR1cm4gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsIGNvbnRyb2xfcmVnLCBEUzI3ODBfQ09OVFJPTF9SRUcpOworCXJldHVybiBkczI3ODBfcmVhZDgoZGV2X2luZm8sIGNvbnRyb2xfcmVnLCBEUzI3ODBfQ09OVFJPTF9SRUcpOwogfQogCiBzdGF0aWMgaW50IGRzMjc4MF9zZXRfY29udHJvbF9yZWdpc3RlcihzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKQEAgLTM2NCw3ICszNzYsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8tPncxX2RldiwgJmNvbnRyb2xfcmVnLAorCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbnRyb2xfcmVnLAogCQkJCURTMjc4MF9DT05UUk9MX1JFRywgc2l6ZW9mKHU4KSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC01MDMsNyArNTE1LDcgQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKIAlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOwogCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsICZzZW5zZV9yZXNpc3RvciwgRFMyNzgwX1JTTlNQX1JFRyk7CisJcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmc2Vuc2VfcmVzaXN0b3IsIERTMjc4MF9SU05TUF9SRUcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01ODQsNyArNTk2LDcgQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKIAlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOwogCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLT53MV9kZXYsICZzZnIsIERTMjc4MF9TRlJfUkVHKTsKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZnIsIERTMjc4MF9TRlJfUkVHKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjExLDcgKzYyMyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mby0+dzFfZGV2LCAmbmV3X3NldHRpbmcsCisJcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCAmbmV3X3NldHRpbmcsCiAJCQkJRFMyNzgwX1NGUl9SRUcsIHNpemVvZih1OCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNjMyLDcgKzY0NCw3IEBACiAJCURTMjc4MF9FRVBST01fQkxPQ0sxX0VORCAtCiAJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgMSAtIG9mZik7CiAKLQlyZXR1cm4gZHMyNzgwX3JlYWRfYmxvY2soZGV2X2luZm8tPncxX2RldiwgYnVmLAorCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mbywgYnVmLAogCQkJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7CiB9CiAKQEAgLTY1MCw3ICs2NjIsNyBAQAogCQlEUzI3ODBfRUVQUk9NX0JMT0NLMV9FTkQgLQogCQlEUzI3ODBfRUVQUk9NX0JMT0NLMV9TVEFSVCArIDEgLSBvZmYpOwogCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sIGJ1ZiwKIAkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMV9TVEFSVCArIG9mZiwgY291bnQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNjg1LDkgKzY5Nyw4IEBACiAJCURTMjc4MF9FRVBST01fQkxPQ0swX0VORCAtCiAJCURTMjc4MF9FRVBST01fQkxPQ0swX1NUQVJUICsgMSAtIG9mZik7CiAKLQlyZXR1cm4gZHMyNzgwX3JlYWRfYmxvY2soZGV2X2luZm8tPncxX2RldiwgYnVmLAorCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mbywgYnVmLAogCQkJCURTMjc4MF9FRVBST01fQkxPQ0swX1NUQVJUICsgb2ZmLCBjb3VudCk7Ci0KIH0KIAogc3RhdGljIHNzaXplX3QgZHMyNzgwX3dyaXRlX3VzZXJfZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTcwNCw3ICs3MTUsNyBAQAogCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9FTkQgLQogCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIDEgLSBvZmYpOwogCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sIGJ1ZiwKIAkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIG9mZiwgY291bnQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNzY4LDYgKzc3OSw3IEBACiAJZGV2X2luZm8tPmJhdC5wcm9wZXJ0aWVzCT0gZHMyNzgwX2JhdHRlcnlfcHJvcHM7CiAJZGV2X2luZm8tPmJhdC5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZHMyNzgwX2JhdHRlcnlfcHJvcHMpOwogCWRldl9pbmZvLT5iYXQuZ2V0X3Byb3BlcnR5CT0gZHMyNzgwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWRldl9pbmZvLT5tdXRleF9ob2xkZXIJCT0gY3VycmVudDsKIAogCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGV2X2luZm8tPmJhdCk7CiAJaWYgKHJldCkgewpAQCAtNzk3LDYgKzgwOSw4IEBACiAJCWdvdG8gZmFpbF9yZW1vdmVfYmluX2ZpbGU7CiAJfQogCisJZGV2X2luZm8tPm11dGV4X2hvbGRlciA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIAogZmFpbF9yZW1vdmVfYmluX2ZpbGU6CkBAIC04MTYsNiArODMwLDggQEAKIHsKIAlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJZGV2X2luZm8tPm11dGV4X2hvbGRlciA9IGN1cnJlbnQ7CisKIAkvKiByZW1vdmUgYXR0cmlidXRlcyAqLwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmJhdC5kZXYtPmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKaW5kZXggOThiZmFiMy4uOWYwMTgzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCmluZGV4IGE5YjAyMDkuLjI1OTUxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jCmluZGV4IGZmYzUwMzMuLmEyMzMxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwppbmRleCBlZjhlZmFkLi45M2UzYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKaW5kZXggNjA1NTE0YS4uZTE1ZDRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogCiAjaW5jbHVkZSAicG93ZXJfc3VwcGx5LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2NsaWVudHMvS2NvbmZpZyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvS2NvbmZpZwppbmRleCA4NTIwYTdmLi40NDUxOTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9jbGllbnRzL0tjb25maWcKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnCkBAIC0yOSw0ICsyOSwxMyBAQAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGEgUFBTIHNvdXJjZSBjb25uZWN0ZWQKIAkgIHdpdGggdGhlIGludGVycnVwdCBwaW4gb2YgeW91ciBwYXJhbGxlbCBwb3J0LgogCitjb25maWcgUFBTX0NMSUVOVF9HUElPCisJdHJpc3RhdGUgIlBQUyBjbGllbnQgdXNpbmcgR1BJTyIKKwlkZXBlbmRzIG9uIFBQUyAmJiBHRU5FUklDX0hBUkRJUlFTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGEgUFBTIHNvdXJjZSB1c2luZworCSAgR1BJTy4gVG8gYmUgdXNlZnVsIHlvdSBtdXN0IGFsc28gcmVnaXN0ZXIgYSBwbGF0Zm9ybSBkZXZpY2UKKwkgIHNwZWNpZnlpbmcgdGhlIEdQSU8gcGluIGFuZCBvdGhlciBvcHRpb25zLCB1c3VhbGx5IGluIHlvdXIgYm9hcmQKKwkgIHNldHVwLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9NYWtlZmlsZSBiL2RyaXZlcnMvcHBzL2NsaWVudHMvTWFrZWZpbGUKaW5kZXggNGZlYjdlOS4uYTQ2MWQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMvY2xpZW50cy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL01ha2VmaWxlCkBAIC01LDUgKzUsNiBAQAogb2JqLSQoQ09ORklHX1BQU19DTElFTlRfS1RJTUVSKQkrPSBwcHMta3RpbWVyLm8KIG9iai0kKENPTkZJR19QUFNfQ0xJRU5UX0xESVNDKQkrPSBwcHMtbGRpc2Mubwogb2JqLSQoQ09ORklHX1BQU19DTElFTlRfUEFSUE9SVCkgKz0gcHBzX3BhcnBvcnQubworb2JqLSQoQ09ORklHX1BQU19DTElFTlRfR1BJTykJKz0gcHBzLWdwaW8ubwogCiBjY2ZsYWdzLSQoQ09ORklHX1BQU19ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMtZ3Bpby5jIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTA1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwcy1ncGlvLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBwcHMtZ3Bpby5jIC0tIFBQUyBjbGllbnQgZHJpdmVyIHVzaW5nIEdQSU8KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJpY2FyZG8gTWFydGlucyA8cmFzbUBmZS51cC5wdD4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBKYW1lcyBOdXNzIDxqYW1lc251c3NAbmFub21ldHJpY3MuY2E+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNkZWZpbmUgUFBTX0dQSU9fTkFNRSAicHBzLWdwaW8iCisjZGVmaW5lIHByX2ZtdChmbXQpIFBQU19HUElPX05BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHBzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bwcy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogSW5mbyBmb3IgZWFjaCByZWdpc3RlcmVkIHBsYXRmb3JtIGRldmljZSAqLworc3RydWN0IHBwc19ncGlvX2RldmljZV9kYXRhIHsKKwlpbnQgaXJxOwkJCS8qIElSUSB1c2VkIGFzIFBQUyBzb3VyY2UgKi8KKwlzdHJ1Y3QgcHBzX2RldmljZSAqcHBzOwkJLyogUFBTIHNvdXJjZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgcHBzX3NvdXJjZV9pbmZvIGluZm87CS8qIFBQUyBzb3VyY2UgaW5mb3JtYXRpb24gKi8KKwljb25zdCBzdHJ1Y3QgcHBzX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGE7Cit9OworCisvKgorICogUmVwb3J0IHRoZSBQUFMgZXZlbnQKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgcHBzX2dwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgcHBzX2dwaW9fZGV2aWNlX2RhdGEgKmluZm87CisJc3RydWN0IHBwc19ldmVudF90aW1lIHRzOworCWludCByaXNpbmdfZWRnZTsKKworCS8qIEdldCB0aGUgdGltZSBzdGFtcCBmaXJzdCAqLworCXBwc19nZXRfdHMoJnRzKTsKKworCWluZm8gPSBkYXRhOworCisJcmlzaW5nX2VkZ2UgPSBncGlvX2dldF92YWx1ZShpbmZvLT5wZGF0YS0+Z3Bpb19waW4pOworCWlmICgocmlzaW5nX2VkZ2UgJiYgIWluZm8tPnBkYXRhLT5hc3NlcnRfZmFsbGluZ19lZGdlKSB8fAorCQkJKCFyaXNpbmdfZWRnZSAmJiBpbmZvLT5wZGF0YS0+YXNzZXJ0X2ZhbGxpbmdfZWRnZSkpCisJCXBwc19ldmVudChpbmZvLT5wcHMsICZ0cywgUFBTX0NBUFRVUkVBU1NFUlQsIE5VTEwpOworCWVsc2UgaWYgKGluZm8tPnBkYXRhLT5jYXB0dXJlX2NsZWFyICYmCisJCQkoKHJpc2luZ19lZGdlICYmIGluZm8tPnBkYXRhLT5hc3NlcnRfZmFsbGluZ19lZGdlKSB8fAorCQkJICghcmlzaW5nX2VkZ2UgJiYgIWluZm8tPnBkYXRhLT5hc3NlcnRfZmFsbGluZ19lZGdlKSkpCisJCXBwc19ldmVudChpbmZvLT5wcHMsICZ0cywgUFBTX0NBUFRVUkVDTEVBUiwgTlVMTCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcHBzX2dwaW9fc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBwcHNfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ncGlvX3BpbiwgcGRhdGEtPmdwaW9fbGFiZWwpOworCWlmIChyZXQpIHsKKwkJcHJfd2FybmluZygiZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyAldVxuIiwgcGRhdGEtPmdwaW9fcGluKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmdwaW9fcGluKTsKKwlpZiAocmV0KSB7CisJCXByX3dhcm5pbmcoImZhaWxlZCB0byBzZXQgcGluIGRpcmVjdGlvblxuIik7CisJCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19waW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9pcnFmX3RyaWdnZXJfZmxhZ3MoY29uc3Qgc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwZGF0YS0+YXNzZXJ0X2ZhbGxpbmdfZWRnZSA/CisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIDogSVJRRl9UUklHR0VSX1JJU0lORzsKKworCWlmIChwZGF0YS0+Y2FwdHVyZV9jbGVhcikgeworCQlmbGFncyB8PSAoKGZsYWdzICYgSVJRRl9UUklHR0VSX1JJU0lORykgPworCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIDogSVJRRl9UUklHR0VSX1JJU0lORyk7CisJfQorCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW50IHBwc19ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBwc19ncGlvX2RldmljZV9kYXRhICpkYXRhOworCWludCBpcnE7CisJaW50IHJldDsKKwlpbnQgZXJyOworCWludCBwcHNfZGVmYXVsdF9wYXJhbXM7CisJY29uc3Qgc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKworCS8qIEdQSU8gc2V0dXAgKi8KKwlyZXQgPSBwcHNfZ3Bpb19zZXR1cChwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIElSUSBzZXR1cCAqLworCWlycSA9IGdwaW9fdG9faXJxKHBkYXRhLT5ncGlvX3Bpbik7CisJaWYgKGlycSA8IDApIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gbWFwIEdQSU8gdG8gSVJROiAlZFxuIiwgaXJxKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byByZXR1cm5fZXJyb3I7CisJfQorCisJLyogYWxsb2NhdGUgc3BhY2UgZm9yIGRldmljZSBpbmZvICovCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcHNfZ3Bpb19kZXZpY2VfZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZXR1cm5fZXJyb3I7CisJfQorCisJLyogaW5pdGlhbGl6ZSBQUFMgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGJvb2trZWVwaW5nIGRhdGEgc3RydWN0dXJlLiAqLworCWRhdGEtPmluZm8ubW9kZSA9IFBQU19DQVBUVVJFQVNTRVJUIHwgUFBTX09GRlNFVEFTU0VSVCB8CisJCVBQU19FQ0hPQVNTRVJUIHwgUFBTX0NBTldBSVQgfCBQUFNfVFNGTVRfVFNQRUM7CisJaWYgKHBkYXRhLT5jYXB0dXJlX2NsZWFyKQorCQlkYXRhLT5pbmZvLm1vZGUgfD0gUFBTX0NBUFRVUkVDTEVBUiB8IFBQU19PRkZTRVRDTEVBUiB8CisJCQlQUFNfRUNIT0NMRUFSOworCWRhdGEtPmluZm8ub3duZXIgPSBUSElTX01PRFVMRTsKKwlzbnByaW50ZihkYXRhLT5pbmZvLm5hbWUsIFBQU19NQVhfTkFNRV9MRU4gLSAxLCAiJXMuJWQiLAorCQkgcGRldi0+bmFtZSwgcGRldi0+aWQpOworCisJLyogcmVnaXN0ZXIgUFBTIHNvdXJjZSAqLworCXBwc19kZWZhdWx0X3BhcmFtcyA9IFBQU19DQVBUVVJFQVNTRVJUIHwgUFBTX09GRlNFVEFTU0VSVDsKKwlpZiAocGRhdGEtPmNhcHR1cmVfY2xlYXIpCisJCXBwc19kZWZhdWx0X3BhcmFtcyB8PSBQUFNfQ0FQVFVSRUNMRUFSIHwgUFBTX09GRlNFVENMRUFSOworCWRhdGEtPnBwcyA9IHBwc19yZWdpc3Rlcl9zb3VyY2UoJmRhdGEtPmluZm8sIHBwc19kZWZhdWx0X3BhcmFtcyk7CisJaWYgKGRhdGEtPnBwcyA9PSBOVUxMKSB7CisJCWtmcmVlKGRhdGEpOworCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBJUlEgJWQgYXMgUFBTIHNvdXJjZVxuIiwgaXJxKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byByZXR1cm5fZXJyb3I7CisJfQorCisJZGF0YS0+aXJxID0gaXJxOworCWRhdGEtPnBkYXRhID0gcGRhdGE7CisKKwkvKiByZWdpc3RlciBJUlEgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHBwc19ncGlvX2lycV9oYW5kbGVyLAorCQkJZ2V0X2lycWZfdHJpZ2dlcl9mbGFncyhwZGF0YSksIGRhdGEtPmluZm8ubmFtZSwgZGF0YSk7CisJaWYgKHJldCkgeworCQlwcHNfdW5yZWdpc3Rlcl9zb3VyY2UoZGF0YS0+cHBzKTsKKwkJa2ZyZWUoZGF0YSk7CisJCXByX2VycigiZmFpbGVkIHRvIGFjcXVpcmUgSVJRICVkXG4iLCBpcnEpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJldHVybl9lcnJvcjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKKwlkZXZfaW5mbyhkYXRhLT5wcHMtPmRldiwgIlJlZ2lzdGVyZWQgSVJRICVkIGFzIFBQUyBzb3VyY2VcbiIsIGlycSk7CisKKwlyZXR1cm4gMDsKKworcmV0dXJuX2Vycm9yOgorCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19waW4pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBzX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBwc19ncGlvX2RldmljZV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJY29uc3Qgc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX2lycShkYXRhLT5pcnEsIGRhdGEpOworCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb19waW4pOworCXBwc191bnJlZ2lzdGVyX3NvdXJjZShkYXRhLT5wcHMpOworCXByX2luZm8oInJlbW92ZWQgSVJRICVkIGFzIFBQUyBzb3VyY2VcbiIsIGRhdGEtPmlycSk7CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBwc19ncGlvX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcHBzX2dwaW9fcHJvYmUsCisJLnJlbW92ZQkJPSAgX19kZXZleGl0X3AocHBzX2dwaW9fcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBQUFNfR1BJT19OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRQorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcHNfZ3Bpb19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHBzX2dwaW9fZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHBzX2dwaW9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwcHNfZ3Bpb19kcml2ZXIpOworCXByX2RlYnVnKCJ1bnJlZ2lzdGVyZWQgcGxhdGZvcm0gZHJpdmVyXG4iKTsKK30KKworbW9kdWxlX2luaXQocHBzX2dwaW9faW5pdCk7Cittb2R1bGVfZXhpdChwcHNfZ3Bpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljYXJkbyBNYXJ0aW5zIDxyYXNtQGZlLnVwLnB0PiIpOworTU9EVUxFX0FVVEhPUigiSmFtZXMgTnVzcyA8amFtZXNudXNzQG5hbm9tZXRyaWNzLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVc2UgR1BJTyBwaW4gYXMgUFBTIHNvdXJjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC4wIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwcy1rdGltZXIuYyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWt0aW1lci5jCmluZGV4IDgyNTgzYjAuLjQzNmI0ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWt0aW1lci5jCisrKyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWt0aW1lci5jCkBAIC01MiwxNyArNTIsNiBAQAogfQogCiAvKgotICogVGhlIGVjaG8gZnVuY3Rpb24KLSAqLwotCi1zdGF0aWMgdm9pZCBwcHNfa3RpbWVyX2VjaG8oc3RydWN0IHBwc19kZXZpY2UgKnBwcywgaW50IGV2ZW50LCB2b2lkICpkYXRhKQotewotCWRldl9pbmZvKHBwcy0+ZGV2LCAiZWNobyAlcyAlc1xuIiwKLQkJZXZlbnQgJiBQUFNfQ0FQVFVSRUFTU0VSVCA/ICJhc3NlcnQiIDogIiIsCi0JCWV2ZW50ICYgUFBTX0NBUFRVUkVDTEVBUiA/ICJjbGVhciIgOiAiIik7Ci19Ci0KLS8qCiAgKiBUaGUgUFBTIGluZm8gc3RydWN0CiAgKi8KIApAQCAtNzIsNyArNjEsNiBAQAogCS5tb2RlCQk9IFBQU19DQVBUVVJFQVNTRVJUIHwgUFBTX09GRlNFVEFTU0VSVCB8CiAJCQkgIFBQU19FQ0hPQVNTRVJUIHwKIAkJCSAgUFBTX0NBTldBSVQgfCBQUFNfVFNGTVRfVFNQRUMsCi0JLmVjaG8JCT0gcHBzX2t0aW1lcl9lY2hvLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzX3BhcnBvcnQuYyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzX3BhcnBvcnQuYwppbmRleCBjNTcxZDZkLi5lMWI0NzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwc19wYXJwb3J0LmMKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHNfcGFycG9ydC5jCkBAIC0xMzMsMTQgKzEzMyw2IEBACiAJcmV0dXJuOwogfQogCi0vKiB0aGUgUFBTIGVjaG8gZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkIHBwc19lY2hvKHN0cnVjdCBwcHNfZGV2aWNlICpwcHMsIGludCBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlkZXZfaW5mbyhwcHMtPmRldiwgImVjaG8gJXMgJXNcbiIsCi0JCWV2ZW50ICYgUFBTX0NBUFRVUkVBU1NFUlQgPyAiYXNzZXJ0IiA6ICIiLAotCQlldmVudCAmIFBQU19DQVBUVVJFQ0xFQVIgPyAiY2xlYXIiIDogIiIpOwotfQotCiBzdGF0aWMgdm9pZCBwYXJwb3J0X2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgcHBzX2NsaWVudF9wcCAqZGV2aWNlOwpAQCAtMTUxLDcgKzE0Myw2IEBACiAJCQkJICBQUFNfT0ZGU0VUQVNTRVJUIHwgUFBTX09GRlNFVENMRUFSIHwgXAogCQkJCSAgUFBTX0VDSE9BU1NFUlQgfCBQUFNfRUNIT0NMRUFSIHwgXAogCQkJCSAgUFBTX0NBTldBSVQgfCBQUFNfVFNGTVRfVFNQRUMsCi0JCS5lY2hvCQk9IHBwc19lY2hvLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5kZXYJCT0gTlVMTAogCX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9rYXBpLmMgYi9kcml2ZXJzL3Bwcy9rYXBpLmMKaW5kZXggYTRlOGViOS4uZjE5N2U4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMva2FwaS5jCisrKyBiL2RyaXZlcnMvcHBzL2thcGkuYwpAQCAtNTIsNiArNTIsMTQgQEAKIAl0cy0+c2VjICs9IG9mZnNldC0+c2VjOwogfQogCitzdGF0aWMgdm9pZCBwcHNfZWNob19jbGllbnRfZGVmYXVsdChzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBpbnQgZXZlbnQsCisJCXZvaWQgKmRhdGEpCit7CisJZGV2X2luZm8ocHBzLT5kZXYsICJlY2hvICVzICVzXG4iLAorCQlldmVudCAmIFBQU19DQVBUVVJFQVNTRVJUID8gImFzc2VydCIgOiAiIiwKKwkJZXZlbnQgJiBQUFNfQ0FQVFVSRUNMRUFSID8gImNsZWFyIiA6ICIiKTsKK30KKwogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9ucwogICovCkBAIC04MCwxMyArODgsNiBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDsKIAl9Ci0JaWYgKChpbmZvLT5tb2RlICYgKFBQU19FQ0hPQVNTRVJUIHwgUFBTX0VDSE9DTEVBUikpICE9IDAgJiYKLQkJCWluZm8tPmVjaG8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBlY2hvIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkXG4iLAotCQkJCQlpbmZvLT5uYW1lKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBwcHNfcmVnaXN0ZXJfc291cmNlX2V4aXQ7Ci0JfQogCWlmICgoaW5mby0+bW9kZSAmIChQUFNfVFNGTVRfVFNQRUMgfCBQUFNfVFNGTVRfTlRQRlApKSA9PSAwKSB7CiAJCXByX2VycigiJXM6IHVuc3BlY2lmaWVkIHRpbWUgZm9ybWF0XG4iLAogCQkJCQlpbmZvLT5uYW1lKTsKQEAgLTEwOCw2ICsxMDksMTEgQEAKIAlwcHMtPnBhcmFtcy5tb2RlID0gZGVmYXVsdF9wYXJhbXM7CiAJcHBzLT5pbmZvID0gKmluZm87CiAKKwkvKiBjaGVjayBmb3IgZGVmYXVsdCBlY2hvIGZ1bmN0aW9uICovCisJaWYgKChwcHMtPmluZm8ubW9kZSAmIChQUFNfRUNIT0FTU0VSVCB8IFBQU19FQ0hPQ0xFQVIpKSAmJgorCQkJcHBzLT5pbmZvLmVjaG8gPT0gTlVMTCkKKwkJcHBzLT5pbmZvLmVjaG8gPSBwcHNfZWNob19jbGllbnRfZGVmYXVsdDsKKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBwcy0+cXVldWUpOwogCXNwaW5fbG9ja19pbml0KCZwcHMtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYyBiL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCmluZGV4IGQ5ZmI3MjkuLmZiNzMwMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCisrKyBiL2RyaXZlcnMvcHMzL3BzMy12dWFydC5jCkBAIC05NTIsNyArOTUyLDcgQEAKIAl9CiAKIAlyZXN1bHQgPSByZXF1ZXN0X2lycSh2dWFydF9idXNfcHJpdi52aXJxLCBwczNfdnVhcnRfaXJxX2hhbmRsZXIsCi0JCUlSUUZfRElTQUJMRUQsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7CisJCTAsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2RlYnVnKCIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jIGIvZHJpdmVycy9wczMvcHMzc3Rvcl9saWIuYwppbmRleCBhZjBhZmExLi44YzNmNWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCisrKyBiL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KQEAgLTE2Niw3ICsxNjcsNyBAQAogCQlnb3RvIGZhaWxfY2xvc2VfZGV2aWNlOwogCX0KIAotCWVycm9yID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGhhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGFuZGxlciwgMCwKIAkJCSAgICBkZXYtPnNiZC5jb3JlLmRyaXZlci0+bmFtZSwgZGV2KTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMgYi9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMKaW5kZXggNDc0MjI1OC4uMGU0MTczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wczMvc3lzLW1hbmFnZXItY29yZS5jCisrKyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wczMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL0tjb25maWcgYi9kcml2ZXJzL3JhcGlkaW8vS2NvbmZpZwppbmRleCAwNzAyMTFhLi5iYzg3MTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3JhcGlkaW8vS2NvbmZpZwpAQCAtMSw2ICsxLDggQEAKICMKICMgUmFwaWRJTyBjb25maWd1cmF0aW9uCiAjCitzb3VyY2UgImRyaXZlcnMvcmFwaWRpby9kZXZpY2VzL0tjb25maWciCisKIGNvbmZpZyBSQVBJRElPX0RJU0NfVElNRU9VVAogCWludCAiRGlzY292ZXJ5IHRpbWVvdXQgZHVyYXRpb24gKHNlY29uZHMpIgogCWRlcGVuZHMgb24gUkFQSURJTwpAQCAtMjAsOCArMjIsNiBAQAogCSAgcG9ydHMgZm9yIElucHV0L091dHB1dCBkaXJlY3Rpb24gdG8gYWxsb3cgb3RoZXIgdHJhZmZpYwogCSAgdGhhbiBNYWludGVuYW5jZSB0cmFuc2ZlcnMuCiAKLXNvdXJjZSAiZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL0tjb25maWciCi0KIGNvbmZpZyBSQVBJRElPX0RFQlVHCiAJYm9vbCAiUmFwaWRJTyBzdWJzeXN0ZW0gZGVidWcgbWVzc2FnZXMiCiAJZGVwZW5kcyBvbiBSQVBJRElPCkBAIC0zMiwzICszMiw1IEBACiAJICBnb2luZyBvbi4KIAogCSAgSWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgdGhpcywgc2F5IE4gaGVyZS4KKworc291cmNlICJkcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvcmFwaWRpby9NYWtlZmlsZQppbmRleCA4OWI4ZWNhLi5lYzNmYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yYXBpZGlvL01ha2VmaWxlCkBAIC00LDUgKzQsNiBAQAogb2JqLXkgKz0gcmlvLm8gcmlvLWFjY2Vzcy5vIHJpby1kcml2ZXIubyByaW8tc2Nhbi5vIHJpby1zeXNmcy5vCiAKIG9iai0kKENPTkZJR19SQVBJRElPKQkJKz0gc3dpdGNoZXMvCitvYmotJChDT05GSUdfUkFQSURJTykJCSs9IGRldmljZXMvCiAKIHN1YmRpci1jY2ZsYWdzLSQoQ09ORklHX1JBUElESU9fREVCVUcpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL0tjb25maWcgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTlkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgUmFwaWRJTyBtYXN0ZXIgcG9ydCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBSQVBJRElPX1RTSTcyMQorCWJvb2wgIklEVCBUc2k3MjEgUENJIEV4cHJlc3MgU1JJTyBDb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBSQVBJRElPICYmIFBDSUVQT1JUQlVTCisJZGVmYXVsdCAibiIKKwktLS1oZWxwLS0tCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIElEVCBUc2k3MjEgUENJIEV4cHJlc3MgU2VyaWFsIFJhcGlkSU8gY29udHJvbGxlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL01ha2VmaWxlIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3YjRlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgUmFwaWRJTyBkZXZpY2VzCisjCisKK29iai0kKENPTkZJR19SQVBJRElPX1RTSTcyMSkJKz0gdHNpNzIxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyNTkzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jCkBAIC0wLDAgKzEsMjM2MCBAQAorLyoKKyAqIFJhcGlkSU8gbXBvcnQgZHJpdmVyIGZvciBUc2k3MjEgUENJRXhwcmVzcy10by1TUklPIGJyaWRnZQorICoKKyAqIENvcHlyaWdodCAyMDExIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KKyAqIEFsZXhhbmRyZSBCb3VuaW5lIDxhbGV4YW5kcmUuYm91bmluZUBpZHQuY29tPgorICogQ2h1bCBLaW0gPGNodWwua2ltQGlkdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmlvLmg+CisjaW5jbHVkZSA8bGludXgvcmlvX2Rydi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAidHNpNzIxLmgiCisKKyNkZWZpbmUgREVCVUdfUFcJLyogSW5ib3VuZCBQb3J0LVdyaXRlIGRlYnVnZ2luZyAqLworCitzdGF0aWMgdm9pZCB0c2k3MjFfb21zZ19oYW5kbGVyKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gpOworc3RhdGljIHZvaWQgdHNpNzIxX2ltc2dfaGFuZGxlcihzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNoKTsKKworLyoqCisgKiB0c2k3MjFfbGNyZWFkIC0gcmVhZCBmcm9tIGxvY2FsIFNSRVAgY29uZmlnIHNwYWNlCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgaW5mbworICogQGluZGV4OiBJRCBvZiBSYXBkaUlPIGludGVyZmFjZQorICogQG9mZnNldDogT2Zmc2V0IGludG8gY29uZmlndXJhdGlvbiBzcGFjZQorICogQGxlbjogTGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIG1haW50ZW5hbmNlIHRyYW5zYWN0aW9uCisgKiBAZGF0YTogVmFsdWUgdG8gYmUgcmVhZCBpbnRvCisgKgorICogR2VuZXJhdGVzIGEgbG9jYWwgU1JFUCBzcGFjZSByZWFkLiBSZXR1cm5zICUwIG9uCisgKiBzdWNjZXNzIG9yICUtRUlOVkFMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX2xjcmVhZChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IGluZGV4LCB1MzIgb2Zmc2V0LAorCQkJIGludCBsZW4sIHUzMiAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCisJaWYgKGxlbiAhPSBzaXplb2YodTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIG9ubHkgMzItYml0IGFjY2VzcyBpcyBzdXBwb3J0ZWQgKi8KKworCSpkYXRhID0gaW9yZWFkMzIocHJpdi0+cmVncyArIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0c2k3MjFfbGN3cml0ZSAtIHdyaXRlIGludG8gbG9jYWwgU1JFUCBjb25maWcgc3BhY2UKKyAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBpbmZvCisgKiBAaW5kZXg6IElEIG9mIFJhcGRpSU8gaW50ZXJmYWNlCisgKiBAb2Zmc2V0OiBPZmZzZXQgaW50byBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAbGVuOiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbWFpbnRlbmFuY2UgdHJhbnNhY3Rpb24KKyAqIEBkYXRhOiBWYWx1ZSB0byBiZSB3cml0dGVuCisgKgorICogR2VuZXJhdGVzIGEgbG9jYWwgd3JpdGUgaW50byBTUkVQIGNvbmZpZ3VyYXRpb24gc3BhY2UuIFJldHVybnMgJTAgb24KKyAqIHN1Y2Nlc3Mgb3IgJS1FSU5WQUwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB0c2k3MjFfbGN3cml0ZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IGluZGV4LCB1MzIgb2Zmc2V0LAorCQkJICBpbnQgbGVuLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCisJaWYgKGxlbiAhPSBzaXplb2YodTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIG9ubHkgMzItYml0IGFjY2VzcyBpcyBzdXBwb3J0ZWQgKi8KKworCWlvd3JpdGUzMihkYXRhLCBwcml2LT5yZWdzICsgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRzaTcyMV9tYWludF9kbWEgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgUmFwaWRJTyBtYWludGVuYW5jZQorICogICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyB1c2luZyBkZXNpZ25hdGVkIFRzaTcyMSBETUEgY2hhbm5lbC4KKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqIEBzeXNfc2l6ZTogUmFwZGlJTyB0cmFuc3BvcnQgc3lzdGVtIHNpemUKKyAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRyYW5zYWN0aW9uCisgKiBAaG9wY291bnQ6IE51bWJlciBvZiBob3BzIHRvIHRhcmdldCBkZXZpY2UKKyAqIEBvZmZzZXQ6IE9mZnNldCBpbnRvIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIEBsZW46IExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBtYWludGVuYW5jZSB0cmFuc2FjdGlvbgorICogQGRhdGE6IExvY2F0aW9uIHRvIGJlIHJlYWQgZnJvbSBvciB3cml0ZSBpbnRvCisgKiBAZG9fd3I6IE9wZXJhdGlvbiBmbGFnICgxID09IE1BSU5UX1dSKQorICoKKyAqIEdlbmVyYXRlcyBhIFJhcGlkSU8gbWFpbnRlbmFuY2UgdHJhbnNhY3Rpb24gKFJlYWQgb3IgV3JpdGUpLgorICogUmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCAlLUVJTlZBTCBvciAlLUVGQVVMVCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9tYWludF9kbWEoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIHUzMiBzeXNfc2l6ZSwKKwkJCXUxNiBkZXN0aWQsIHU4IGhvcGNvdW50LCB1MzIgb2Zmc2V0LCBpbnQgbGVuLAorCQkJdTMyICpkYXRhLCBpbnQgZG9fd3IpCit7CisJc3RydWN0IHRzaTcyMV9kbWFfZGVzYyAqYmRfcHRyOworCXUzMiByZF9jb3VudCwgc3dyX3B0ciwgY2hfc3RhdDsKKwlpbnQgaSwgZXJyID0gMDsKKwl1MzIgb3AgPSBkb193ciA/IE1BSU5UX1dSIDogTUFJTlRfUkQ7CisKKwlpZiAob2Zmc2V0ID4gKFJJT19NQUlOVF9TUEFDRV9TWiAtIGxlbikgfHwgKGxlbiAhPSBzaXplb2YodTMyKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYmRfcHRyID0gcHJpdi0+YmRtYVtUU0k3MjFfRE1BQ0hfTUFJTlRdLmJkX2Jhc2U7CisKKwlyZF9jb3VudCA9IGlvcmVhZDMyKAorCQkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RSRENOVChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKworCS8qIEluaXRpYWxpemUgRE1BIGRlc2NyaXB0b3IgKi8KKwliZF9wdHJbMF0udHlwZV9pZCA9IGNwdV90b19sZTMyKChEVFlQRTIgPDwgMjkpIHwgKG9wIDw8IDE5KSB8IGRlc3RpZCk7CisJYmRfcHRyWzBdLmJjb3VudCA9IGNwdV90b19sZTMyKChzeXNfc2l6ZSA8PCAyNikgfCAweDA0KTsKKwliZF9wdHJbMF0ucmFkZHJfbG8gPSBjcHVfdG9fbGUzMigoaG9wY291bnQgPDwgMjQpIHwgb2Zmc2V0KTsKKwliZF9wdHJbMF0ucmFkZHJfaGkgPSAwOworCWlmIChkb193cikKKwkJYmRfcHRyWzBdLmRhdGFbMF0gPSBjcHVfdG9fYmUzMnAoZGF0YSk7CisJZWxzZQorCQliZF9wdHJbMF0uZGF0YVswXSA9IDB4ZmZmZmZmZmY7CisKKwltYigpOworCisJLyogU3RhcnQgRE1BIG9wZXJhdGlvbiAqLworCWlvd3JpdGUzMihyZF9jb3VudCArIDIsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19EV1JDTlQoVFNJNzIxX0RNQUNIX01BSU5UKSk7CisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RXUkNOVChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwlpID0gMDsKKworCS8qIFdhaXQgdW50aWwgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJd2hpbGUgKChjaF9zdGF0ID0gaW9yZWFkMzIocHJpdi0+cmVncyArCisJCVRTSTcyMV9ETUFDX1NUUyhUU0k3MjFfRE1BQ0hfTUFJTlQpKSkgJiBUU0k3MjFfRE1BQ19TVFNfUlVOKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKCsraSA+PSA1MDAwMDAwKSB7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIiVzIDogRE1BWyVkXSByZWFkIHRpbWVvdXQgY2hfc3RhdHVzPSV4XG4iLAorCQkJCV9fZnVuY19fLCBUU0k3MjFfRE1BQ0hfTUFJTlQsIGNoX3N0YXQpOworCQkJaWYgKCFkb193cikKKwkJCQkqZGF0YSA9IDB4ZmZmZmZmZmY7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKGNoX3N0YXQgJiBUU0k3MjFfRE1BQ19TVFNfQUJPUlQpIHsKKwkJLyogSWYgRE1BIG9wZXJhdGlvbiBhYm9ydGVkIGR1ZSB0byBlcnJvciwKKwkJICogcmVpbml0aWFsaXplIERNQSBjaGFubmVsCisJCSAqLworCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsICIlcyA6IERNQSBBQk9SVCBjaF9zdGF0PSV4XG4iLAorCQkJX19mdW5jX18sIGNoX3N0YXQpOworCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsICJPUD0lZCA6IGRlc3RpZD0leCBoYz0leCBvZmY9JXhcbiIsCisJCQlkb193ciA/IE1BSU5UX1dSIDogTUFJTlRfUkQsIGRlc3RpZCwgaG9wY291bnQsIG9mZnNldCk7CisJCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19JTlRfQUxMLAorCQkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0lOVChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwkJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0NUTF9JTklULAorCQkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0NUTChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwkJdWRlbGF5KDEwKTsKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKworCQkJCVRTSTcyMV9ETUFDX0RXUkNOVChUU0k3MjFfRE1BQ0hfTUFJTlQpKTsKKwkJdWRlbGF5KDEpOworCQlpZiAoIWRvX3dyKQorCQkJKmRhdGEgPSAweGZmZmZmZmZmOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCFkb193cikKKwkJKmRhdGEgPSBiZTMyX3RvX2NwdShiZF9wdHJbMF0uZGF0YVswXSk7CisKKwkvKgorCSAqIFVwZGF0ZSBkZXNjcmlwdG9yIHN0YXR1cyBGSUZPIFJEIHBvaW50ZXIuCisJICogTk9URTogU2tpcHBpbmcgY2hlY2sgYW5kIGNsZWFyIEZJRk8gZW50cmllcyBiZWNhdXNlIHdlIGFyZSB3YWl0aW5nCisJICogZm9yIHRyYW5zZmVyIHRvIGJlIGNvbXBsZXRlZC4KKwkgKi8KKwlzd3JfcHRyID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RTV1AoVFNJNzIxX0RNQUNIX01BSU5UKSk7CisJaW93cml0ZTMyKHN3cl9wdHIsIHByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19EU1JQKFRTSTcyMV9ETUFDSF9NQUlOVCkpOworZXJyX291dDoKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdHNpNzIxX2NyZWFkX2RtYSAtIEdlbmVyYXRlIGEgUmFwaWRJTyBtYWludGVuYW5jZSByZWFkIHRyYW5zYWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgdXNpbmcgVHNpNzIxIEJETUEgZW5naW5lLgorICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IGNvbnRyb2wgc3RydWN0dXJlCisgKiBAaW5kZXg6IElEIG9mIFJhcGRpSU8gaW50ZXJmYWNlCisgKiBAZGVzdGlkOiBEZXN0aW5hdGlvbiBJRCBvZiB0cmFuc2FjdGlvbgorICogQGhvcGNvdW50OiBOdW1iZXIgb2YgaG9wcyB0byB0YXJnZXQgZGV2aWNlCisgKiBAb2Zmc2V0OiBPZmZzZXQgaW50byBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAbGVuOiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbWFpbnRlbmFuY2UgdHJhbnNhY3Rpb24KKyAqIEB2YWw6IExvY2F0aW9uIHRvIGJlIHJlYWQgaW50bworICoKKyAqIEdlbmVyYXRlcyBhIFJhcGlkSU8gbWFpbnRlbmFuY2UgcmVhZCB0cmFuc2FjdGlvbi4KKyAqIFJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgJS1FSU5WQUwgb3IgJS1FRkFVTFQgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB0c2k3MjFfY3JlYWRfZG1hKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgaW5kZXgsIHUxNiBkZXN0aWQsCisJCQl1OCBob3Bjb3VudCwgdTMyIG9mZnNldCwgaW50IGxlbiwgdTMyICpkYXRhKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisKKwlyZXR1cm4gdHNpNzIxX21haW50X2RtYShwcml2LCBtcG9ydC0+c3lzX3NpemUsIGRlc3RpZCwgaG9wY291bnQsCisJCQkJb2Zmc2V0LCBsZW4sIGRhdGEsIDApOworfQorCisvKioKKyAqIHRzaTcyMV9jd3JpdGVfZG1hIC0gR2VuZXJhdGUgYSBSYXBpZElPIG1haW50ZW5hbmNlIHdyaXRlIHRyYW5zYWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIFRzaTcyMSBCRE1BIGVuZ2luZQorICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IGNvbnRyb2wgc3RydWN0dXJlCisgKiBAaW5kZXg6IElEIG9mIFJhcGRpSU8gaW50ZXJmYWNlCisgKiBAZGVzdGlkOiBEZXN0aW5hdGlvbiBJRCBvZiB0cmFuc2FjdGlvbgorICogQGhvcGNvdW50OiBOdW1iZXIgb2YgaG9wcyB0byB0YXJnZXQgZGV2aWNlCisgKiBAb2Zmc2V0OiBPZmZzZXQgaW50byBjb25maWd1cmF0aW9uIHNwYWNlCisgKiBAbGVuOiBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbWFpbnRlbmFuY2UgdHJhbnNhY3Rpb24KKyAqIEB2YWw6IFZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBHZW5lcmF0ZXMgYSBSYXBpZElPIG1haW50ZW5hbmNlIHdyaXRlIHRyYW5zYWN0aW9uLgorICogUmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZCAlLUVJTlZBTCBvciAlLUVGQVVMVCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9jd3JpdGVfZG1hKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgaW5kZXgsIHUxNiBkZXN0aWQsCisJCQkgdTggaG9wY291bnQsIHUzMiBvZmZzZXQsIGludCBsZW4sIHUzMiBkYXRhKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJdTMyIHRlbXAgPSBkYXRhOworCisJcmV0dXJuIHRzaTcyMV9tYWludF9kbWEocHJpdiwgbXBvcnQtPnN5c19zaXplLCBkZXN0aWQsIGhvcGNvdW50LAorCQkJCW9mZnNldCwgbGVuLCAmdGVtcCwgMSk7Cit9CisKKy8qKgorICogdHNpNzIxX3B3X2hhbmRsZXIgLSBUc2k3MjEgaW5ib3VuZCBwb3J0LXdyaXRlIGludGVycnVwdCBoYW5kbGVyCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgc3RydWN0dXJlCisgKgorICogSGFuZGxlcyBpbmJvdW5kIHBvcnQtd3JpdGUgaW50ZXJydXB0cy4gQ29waWVzIFBXIG1lc3NhZ2UgZnJvbSBhbiBpbnRlcm5hbAorICogYnVmZmVyIGludG8gUFcgbWVzc2FnZSBGSUZPIGFuZCBzY2hlZHVsZXMgZGVmZXJyZWQgcm91dGluZSB0byBwcm9jZXNzCisgKiBxdWV1ZWQgbWVzc2FnZXMuCisgKi8KK3N0YXRpYyBpbnQKK3RzaTcyMV9wd19oYW5kbGVyKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJdTMyIHB3X3N0YXQ7CisJdTMyIHB3X2J1ZltUU0k3MjFfUklPX1BXX01TR19TSVpFL3NpemVvZih1MzIpXTsKKworCisJcHdfc3RhdCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX1NUQVQpOworCisJaWYgKHB3X3N0YXQgJiBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfVkFMKSB7CisJCXB3X2J1ZlswXSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX0NBUFQoMCkpOworCQlwd19idWZbMV0gPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1JJT19QV19SWF9DQVBUKDEpKTsKKwkJcHdfYnVmWzJdID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fUFdfUlhfQ0FQVCgyKSk7CisJCXB3X2J1ZlszXSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX1BXX1JYX0NBUFQoMykpOworCisJCS8qIFF1ZXVlIFBXIG1lc3NhZ2UgKGlmIHRoZXJlIGlzIHJvb20gaW4gRklGTyksCisJCSAqIG90aGVyd2lzZSBkaXNjYXJkIGl0LgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZwcml2LT5wd19maWZvX2xvY2spOworCQlpZiAoa2ZpZm9fYXZhaWwoJnByaXYtPnB3X2ZpZm8pID49IFRTSTcyMV9SSU9fUFdfTVNHX1NJWkUpCisJCQlrZmlmb19pbigmcHJpdi0+cHdfZmlmbywgcHdfYnVmLAorCQkJCQkJVFNJNzIxX1JJT19QV19NU0dfU0laRSk7CisJCWVsc2UKKwkJCXByaXYtPnB3X2Rpc2NhcmRfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnByaXYtPnB3X2ZpZm9fbG9jayk7CisJfQorCisJLyogQ2xlYXIgcGVuZGluZyBQVyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKFRTSTcyMV9SSU9fUFdfUlhfU1RBVF9QV19ESVNDIHwgVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX1ZBTCwKKwkJICBwcml2LT5yZWdzICsgVFNJNzIxX1JJT19QV19SWF9TVEFUKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnB3X3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTcyMV9wd19kcGMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0c2k3MjFfZGV2aWNlLAorCQkJCQkJICAgIHB3X3dvcmspOworCXUzMiBtc2dfYnVmZmVyW1JJT19QV19NU0dfU0laRS9zaXplb2YodTMyKV07IC8qIFVzZSBmdWxsIHNpemUgUFcgbWVzc2FnZQorCQkJCQkJCWJ1ZmZlciBmb3IgUklPIGxheWVyICovCisKKwkvKgorCSAqIFByb2Nlc3MgcG9ydC13cml0ZSBtZXNzYWdlcworCSAqLworCXdoaWxlIChrZmlmb19vdXRfc3BpbmxvY2tlZCgmcHJpdi0+cHdfZmlmbywgKHVuc2lnbmVkIGNoYXIgKiltc2dfYnVmZmVyLAorCQkJIFRTSTcyMV9SSU9fUFdfTVNHX1NJWkUsICZwcml2LT5wd19maWZvX2xvY2spKSB7CisJCS8qIFByb2Nlc3Mgb25lIG1lc3NhZ2UgKi8KKyNpZmRlZiBERUJVR19QVworCQl7CisJCXUzMiBpOworCQlwcl9kZWJ1ZygiJXMgOiBQb3J0LVdyaXRlIE1lc3NhZ2U6IiwgX19mdW5jX18pOworCQlmb3IgKGkgPSAwOyBpIDwgUklPX1BXX01TR19TSVpFL3NpemVvZih1MzIpOyApIHsKKwkJCXByX2RlYnVnKCIweCUwMng6ICUwOHggJTA4eCAlMDh4ICUwOHgiLCBpKjQsCisJCQkJbXNnX2J1ZmZlcltpXSwgbXNnX2J1ZmZlcltpICsgMV0sCisJCQkJbXNnX2J1ZmZlcltpICsgMl0sIG1zZ19idWZmZXJbaSArIDNdKTsKKwkJCWkgKz0gNDsKKwkJfQorCQlwcl9kZWJ1ZygiXG4iKTsKKwkJfQorI2VuZGlmCisJCS8qIFBhc3MgdGhlIHBvcnQtd3JpdGUgbWVzc2FnZSB0byBSSU8gY29yZSBmb3IgcHJvY2Vzc2luZyAqLworCQlyaW9faW5iX3B3cml0ZV9oYW5kbGVyKCh1bmlvbiByaW9fcHdfbXNnICopbXNnX2J1ZmZlcik7CisJfQorfQorCisvKioKKyAqIHRzaTcyMV9wd19lbmFibGUgLSBlbmFibGUvZGlzYWJsZSBwb3J0LXdyaXRlIGludGVyZmFjZSBpbml0CisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgcG9ydCB3cml0ZSB1bml0CisgKiBAZW5hYmxlOiAgICAxPWVuYWJsZTsgMD1kaXNhYmxlIHBvcnQtd3JpdGUgbWVzc2FnZSBoYW5kbGluZworICovCitzdGF0aWMgaW50IHRzaTcyMV9wd19lbmFibGUoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBlbmFibGUpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgcnZhbDsKKworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFKTsKKworCWlmIChlbmFibGUpCisJCXJ2YWwgfD0gVFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFX1BXX1JYOworCWVsc2UKKwkJcnZhbCAmPSB+VFNJNzIxX1JJT19FTV9JTlRfRU5BQkxFX1BXX1JYOworCisJLyogQ2xlYXIgcGVuZGluZyBQVyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKFRTSTcyMV9SSU9fUFdfUlhfU1RBVF9QV19ESVNDIHwgVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX1ZBTCwKKwkJICBwcml2LT5yZWdzICsgVFNJNzIxX1JJT19QV19SWF9TVEFUKTsKKwkvKiBVcGRhdGUgZW5hYmxlIGJpdHMgKi8KKwlpb3dyaXRlMzIocnZhbCwgcHJpdi0+cmVncyArIFRTSTcyMV9SSU9fRU1fSU5UX0VOQUJMRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0c2k3MjFfZHNlbmQgLSBTZW5kIGEgUmFwaWRJTyBkb29yYmVsbAorICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IGluZm8KKyAqIEBpbmRleDogSUQgb2YgUmFwaWRJTyBpbnRlcmZhY2UKKyAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRhcmdldCBkZXZpY2UKKyAqIEBkYXRhOiAxNi1iaXQgaW5mbyBmaWVsZCBvZiBSYXBpZElPIGRvb3JiZWxsCisgKgorICogU2VuZHMgYSBSYXBpZElPIGRvb3JiZWxsIG1lc3NhZ2UuIEFsd2F5cyByZXR1cm5zICUwLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9kc2VuZChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IGluZGV4LAorCQkJdTE2IGRlc3RpZCwgdTE2IGRhdGEpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgb2Zmc2V0OworCisJb2Zmc2V0ID0gKCgobXBvcnQtPnN5c19zaXplKSA/IFJJT19UVF9DT0RFXzE2IDogUklPX1RUX0NPREVfOCkgPDwgMTgpIHwKKwkJIChkZXN0aWQgPDwgMik7CisKKwlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCSJTZW5kIERvb3JiZWxsIDB4JTA0eCB0byBkZXN0SUQgMHgleFxuIiwgZGF0YSwgZGVzdGlkKTsKKwlpb3dyaXRlMTZiZShkYXRhLCBwcml2LT5vZGJfYmFzZSArIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0c2k3MjFfZGJlbGxfaGFuZGxlciAtIFRzaTcyMSBkb29yYmVsbCBpbnRlcnJ1cHQgaGFuZGxlcgorICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IHN0cnVjdHVyZQorICoKKyAqIEhhbmRsZXMgaW5ib3VuZCBkb29yYmVsbCBpbnRlcnJ1cHRzLiBDb3BpZXMgZG9vcmJlbGwgZW50cnkgZnJvbSBhbiBpbnRlcm5hbAorICogYnVmZmVyIGludG8gREIgbWVzc2FnZSBGSUZPIGFuZCBzY2hlZHVsZXMgZGVmZXJyZWQgIHJvdXRpbmUgdG8gcHJvY2VzcworICogcXVldWVkIERCcy4KKyAqLworc3RhdGljIGludAordHNpNzIxX2RiZWxsX2hhbmRsZXIoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgcmVndmFsOworCisJLyogRGlzYWJsZSBJREIgaW50ZXJydXB0cyAqLworCXJlZ3ZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfU1JfQ0hJTlRFKElEQl9RVUVVRSkpOworCXJlZ3ZhbCAmPSB+VFNJNzIxX1NSX0NISU5UX0lEQlFSQ1Y7CisJaW93cml0ZTMyKHJlZ3ZhbCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVEUoSURCX1FVRVVFKSk7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5pZGJfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNpNzIxX2RiX2RwYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRzaTcyMV9kZXZpY2UsCisJCQkJCQkgICAgaWRiX3dvcmspOworCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0OworCXN0cnVjdCByaW9fZGJlbGwgKmRiZWxsOworCWludCBmb3VuZCA9IDA7CisJdTMyIHdyX3B0ciwgcmRfcHRyOworCXU2NCAqaWRiX2VudHJ5OworCXUzMiByZWd2YWw7CisJdW5pb24geworCQl1NjQgbXNnOworCQl1OCAgYnl0ZXNbOF07CisJfSBpZGI7CisKKwkvKgorCSAqIFByb2Nlc3MgcXVldWVkIGluYm91bmQgZG9vcmJlbGxzCisJICovCisJbXBvcnQgPSBwcml2LT5tcG9ydDsKKworCXdyX3B0ciA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX1dQKElEQl9RVUVVRSkpOworCXJkX3B0ciA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX1JQKElEQl9RVUVVRSkpOworCisJd2hpbGUgKHdyX3B0ciAhPSByZF9wdHIpIHsKKwkJaWRiX2VudHJ5ID0gKHU2NCAqKShwcml2LT5pZGJfYmFzZSArCisJCQkJCShUU0k3MjFfSURCX0VOVFJZX1NJWkUgKiByZF9wdHIpKTsKKwkJcmRfcHRyKys7CisJCWlkYi5tc2cgPSAqaWRiX2VudHJ5OworCQkqaWRiX2VudHJ5ID0gMDsKKworCQkvKiBQcm9jZXNzIG9uZSBkb29yYmVsbCAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRiZWxsLCAmbXBvcnQtPmRiZWxscywgbm9kZSkgeworCQkJaWYgKChkYmVsbC0+cmVzLT5zdGFydCA8PSBEQkVMTF9JTkYoaWRiLmJ5dGVzKSkgJiYKKwkJCSAgICAoZGJlbGwtPnJlcy0+ZW5kID49IERCRUxMX0lORihpZGIuYnl0ZXMpKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCkgeworCQkJZGJlbGwtPmRpbmIobXBvcnQsIGRiZWxsLT5kZXZfaWQsIERCRUxMX1NJRChpZGIuYnl0ZXMpLAorCQkJCSAgICBEQkVMTF9USUQoaWRiLmJ5dGVzKSwgREJFTExfSU5GKGlkYi5ieXRlcykpOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSJzcHVyaW91cyBpbmIgZG9vcmJlbGwsIHNpZCAlMi4yeCB0aWQgJTIuMngiCisJCQkJIiBpbmZvICU0LjR4XG4iLCBEQkVMTF9TSUQoaWRiLmJ5dGVzKSwKKwkJCQlEQkVMTF9USUQoaWRiLmJ5dGVzKSwgREJFTExfSU5GKGlkYi5ieXRlcykpOworCQl9CisJfQorCisJaW93cml0ZTMyKHJkX3B0ciAmIChJREJfUVNJWkUgLSAxKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JRFFfUlAoSURCX1FVRVVFKSk7CisKKwkvKiBSZS1lbmFibGUgSURCIGludGVycnVwdHMgKi8KKwlyZWd2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5URShJREJfUVVFVUUpKTsKKwlyZWd2YWwgfD0gVFNJNzIxX1NSX0NISU5UX0lEQlFSQ1Y7CisJaW93cml0ZTMyKHJlZ3ZhbCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVEUoSURCX1FVRVVFKSk7Cit9CisKKy8qKgorICogdHNpNzIxX2lycWhhbmRsZXIgLSBUc2k3MjEgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBwdHI6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEgKG1wb3J0IHN0cnVjdHVyZSkKKyAqCisgKiBIYW5kbGVzIFRzaTcyMSBpbnRlcnJ1cHRzIHNpZ25hbGVkIHVzaW5nIE1TSSBhbmQgSU5UQS4gQ2hlY2tzIHJlcG9ydGVkCisgKiBpbnRlcnJ1cHQgZXZlbnRzIGFuZCBjYWxscyBhbiBldmVudC1zcGVjaWZpYyBoYW5kbGVyKHMpLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHNpNzIxX2lycWhhbmRsZXIoaW50IGlycSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0ID0gKHN0cnVjdCByaW9fbXBvcnQgKilwdHI7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwl1MzIgZGV2X2ludDsKKwl1MzIgZGV2X2NoX2ludDsKKwl1MzIgaW50dmFsOworCXUzMiBjaF9pbnRlOworCisJZGV2X2ludCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0lOVCk7CisJaWYgKCFkZXZfaW50KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlkZXZfY2hfaW50ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlQpOworCisJaWYgKGRldl9pbnQgJiBUU0k3MjFfREVWX0lOVF9TUjJQQ19DSCkgeworCQkvKiBTZXJ2aWNlIFNSMlBDIENoYW5uZWwgaW50ZXJydXB0cyAqLworCQlpZiAoZGV2X2NoX2ludCAmIFRTSTcyMV9JTlRfU1IyUENfQ0hBTihJREJfUVVFVUUpKSB7CisJCQkvKiBTZXJ2aWNlIEluYm91bmQgRG9vcmJlbGwgaW50ZXJydXB0ICovCisJCQlpbnR2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsKKwkJCQkJCVRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKwkJCWlmIChpbnR2YWwgJiBUU0k3MjFfU1JfQ0hJTlRfSURCUVJDVikKKwkJCQl0c2k3MjFfZGJlbGxfaGFuZGxlcihtcG9ydCk7CisJCQllbHNlCisJCQkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwKKwkJCQkJIlVuc3VwcG9ydGVkIFNSX0NIX0lOVCAleFxuIiwgaW50dmFsKTsKKworCQkJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCQkJaW93cml0ZTMyKGludHZhbCwKKwkJCQlwcml2LT5yZWdzICsgVFNJNzIxX1NSX0NISU5UKElEQl9RVUVVRSkpOworCQkJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKwkJfQorCX0KKworCWlmIChkZXZfaW50ICYgVFNJNzIxX0RFVl9JTlRfU01TR19DSCkgeworCQlpbnQgY2g7CisKKwkJLyoKKwkJICogU2VydmljZSBjaGFubmVsIGludGVycnVwdHMgZnJvbSBNZXNzYWdpbmcgRW5naW5lCisJCSAqLworCisJCWlmIChkZXZfY2hfaW50ICYgVFNJNzIxX0lOVF9JTVNHX0NIQU5fTSkgeyAvKiBJbmJvdW5kIE1zZyAqLworCQkJLyogRGlzYWJsZSBzaWduYWxlZCBPQiBNU0cgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJCQljaF9pbnRlID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKwkJCWNoX2ludGUgJj0gfihkZXZfY2hfaW50ICYgVFNJNzIxX0lOVF9JTVNHX0NIQU5fTSk7CisJCQlpb3dyaXRlMzIoY2hfaW50ZSwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgSW5ib3VuZCBNZXNzYWdlIGludGVycnVwdCBmb3IgZWFjaCBNQk9YCisJCQkgKi8KKwkJCWZvciAoY2ggPSA0OyBjaCA8IFJJT19NQVhfTUJPWCArIDQ7IGNoKyspIHsKKwkJCQlpZiAoIShkZXZfY2hfaW50ICYgVFNJNzIxX0lOVF9JTVNHX0NIQU4oY2gpKSkKKwkJCQkJY29udGludWU7CisJCQkJdHNpNzIxX2ltc2dfaGFuZGxlcihwcml2LCBjaCk7CisJCQl9CisJCX0KKworCQlpZiAoZGV2X2NoX2ludCAmIFRTSTcyMV9JTlRfT01TR19DSEFOX00pIHsgLyogT3V0Ym91bmQgTXNnICovCisJCQkvKiBEaXNhYmxlIHNpZ25hbGVkIE9CIE1TRyBDaGFubmVsIGludGVycnVwdHMgKi8KKwkJCWNoX2ludGUgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCQkJY2hfaW50ZSAmPSB+KGRldl9jaF9pbnQgJiBUU0k3MjFfSU5UX09NU0dfQ0hBTl9NKTsKKwkJCWlvd3JpdGUzMihjaF9pbnRlLCBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCisJCQkvKgorCQkJICogUHJvY2VzcyBPdXRib3VuZCBNZXNzYWdlIGludGVycnVwdHMgZm9yIGVhY2ggTUJPWAorCQkJICovCisKKwkJCWZvciAoY2ggPSAwOyBjaCA8IFJJT19NQVhfTUJPWDsgY2grKykgeworCQkJCWlmICghKGRldl9jaF9pbnQgJiBUU0k3MjFfSU5UX09NU0dfQ0hBTihjaCkpKQorCQkJCQljb250aW51ZTsKKwkJCQl0c2k3MjFfb21zZ19oYW5kbGVyKHByaXYsIGNoKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkZXZfaW50ICYgVFNJNzIxX0RFVl9JTlRfU1JJTykgeworCQkvKiBTZXJ2aWNlIFNSSU8gTUFDIGludGVycnVwdHMgKi8KKwkJaW50dmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fRU1fSU5UX1NUQVQpOworCQlpZiAoaW50dmFsICYgVFNJNzIxX1JJT19FTV9JTlRfU1RBVF9QV19SWCkKKwkJCXRzaTcyMV9wd19oYW5kbGVyKG1wb3J0KTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTcyMV9pbnRlcnJ1cHRzX2luaXQoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJdTMyIGludHI7CisKKwkvKiBFbmFibGUgSURCIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX1NSX0NISU5UX0FMTCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKwlpb3dyaXRlMzIoVFNJNzIxX1NSX0NISU5UX0lEQlFSQ1YsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfU1JfQ0hJTlRFKElEQl9RVUVVRSkpOworCWlvd3JpdGUzMihUU0k3MjFfSU5UX1NSMlBDX0NIQU4oSURCX1FVRVVFKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKworCS8qIEVuYWJsZSBTUklPIE1BQyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKFRTSTcyMV9SSU9fRU1fREVWX0lOVF9FTl9JTlQsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX0VNX0RFVl9JTlRfRU4pOworCisJaWYgKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpCisJCWludHIgPSBUU0k3MjFfREVWX0lOVF9TUklPOworCWVsc2UKKwkJaW50ciA9IFRTSTcyMV9ERVZfSU5UX1NSMlBDX0NIIHwgVFNJNzIxX0RFVl9JTlRfU1JJTyB8CisJCQlUU0k3MjFfREVWX0lOVF9TTVNHX0NIOworCisJaW93cml0ZTMyKGludHIsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0lOVEUpOworCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0lOVEUpOworfQorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKy8qKgorICogdHNpNzIxX29tc2dfbXNpeCAtIE1TSS1YIGludGVycnVwdCBoYW5kbGVyIGZvciBvdXRib3VuZCBtZXNzYWdpbmcKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBwdHI6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEgKG1wb3J0IHN0cnVjdHVyZSkKKyAqCisgKiBIYW5kbGVzIG91dGJvdW5kIG1lc3NhZ2luZyBpbnRlcnJ1cHRzIHNpZ25hbGVkIHVzaW5nIE1TSS1YLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHNpNzIxX29tc2dfbXNpeChpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSAoKHN0cnVjdCByaW9fbXBvcnQgKilwdHIpLT5wcml2OworCWludCBtYm94OworCisJbWJveCA9IChpcnEgLSBwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfRE9ORV0udmVjdG9yKSAlIFJJT19NQVhfTUJPWDsKKwl0c2k3MjFfb21zZ19oYW5kbGVyKHByaXYsIG1ib3gpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiB0c2k3MjFfaW1zZ19tc2l4IC0gTVNJLVggaW50ZXJydXB0IGhhbmRsZXIgZm9yIGluYm91bmQgbWVzc2FnaW5nCisgKiBAaXJxOiBMaW51eCBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAcHRyOiBQb2ludGVyIHRvIGludGVycnVwdC1zcGVjaWZpYyBkYXRhIChtcG9ydCBzdHJ1Y3R1cmUpCisgKgorICogSGFuZGxlcyBpbmJvdW5kIG1lc3NhZ2luZyBpbnRlcnJ1cHRzIHNpZ25hbGVkIHVzaW5nIE1TSS1YLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHNpNzIxX2ltc2dfbXNpeChpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSAoKHN0cnVjdCByaW9fbXBvcnQgKilwdHIpLT5wcml2OworCWludCBtYm94OworCisJbWJveCA9IChpcnEgLSBwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWXS52ZWN0b3IpICUgUklPX01BWF9NQk9YOworCXRzaTcyMV9pbXNnX2hhbmRsZXIocHJpdiwgbWJveCArIDQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiB0c2k3MjFfc3Jpb19tc2l4IC0gVHNpNzIxIE1TSS1YIFNSSU8gTUFDIGludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiBMaW51eCBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAcHRyOiBQb2ludGVyIHRvIGludGVycnVwdC1zcGVjaWZpYyBkYXRhIChtcG9ydCBzdHJ1Y3R1cmUpCisgKgorICogSGFuZGxlcyBUc2k3MjEgaW50ZXJydXB0cyBmcm9tIFNSSU8gTUFDLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdHNpNzIxX3NyaW9fbXNpeChpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSAoKHN0cnVjdCByaW9fbXBvcnQgKilwdHIpLT5wcml2OworCXUzMiBzcmlvX2ludDsKKworCS8qIFNlcnZpY2UgU1JJTyBNQUMgaW50ZXJydXB0cyAqLworCXNyaW9faW50ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9SSU9fRU1fSU5UX1NUQVQpOworCWlmIChzcmlvX2ludCAmIFRTSTcyMV9SSU9fRU1fSU5UX1NUQVRfUFdfUlgpCisJCXRzaTcyMV9wd19oYW5kbGVyKChzdHJ1Y3QgcmlvX21wb3J0ICopcHRyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiB0c2k3MjFfc3IycGNfY2hfbXNpeCAtIFRzaTcyMSBNU0ktWCBTUjJQQyBDaGFubmVsIGludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiBMaW51eCBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAcHRyOiBQb2ludGVyIHRvIGludGVycnVwdC1zcGVjaWZpYyBkYXRhIChtcG9ydCBzdHJ1Y3R1cmUpCisgKgorICogSGFuZGxlcyBUc2k3MjEgaW50ZXJydXB0cyBmcm9tIFNSMlBDIENoYW5uZWwuCisgKiBOT1RFOiBBdCB0aGlzIG1vbWVudCBzZXJ2aWNlcyBvbmx5IG9uZSBTUjJQQyBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBpbmJvdW5kCisgKiBkb29yYmVsbHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0c2k3MjFfc3IycGNfY2hfbXNpeChpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYgPSAoKHN0cnVjdCByaW9fbXBvcnQgKilwdHIpLT5wcml2OworCXUzMiBzcl9jaF9pbnQ7CisKKwkvKiBTZXJ2aWNlIEluYm91bmQgREIgaW50ZXJydXB0IGZyb20gU1IyUEMgY2hhbm5lbCAqLworCXNyX2NoX2ludCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfU1JfQ0hJTlQoSURCX1FVRVVFKSk7CisJaWYgKHNyX2NoX2ludCAmIFRTSTcyMV9TUl9DSElOVF9JREJRUkNWKQorCQl0c2k3MjFfZGJlbGxfaGFuZGxlcigoc3RydWN0IHJpb19tcG9ydCAqKXB0cik7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKHNyX2NoX2ludCwgcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKwkvKiBSZWFkIGJhY2sgdG8gZW5zdXJlIHRoYXQgaW50ZXJydXB0IHdhcyBjbGVhcmVkICovCisJc3JfY2hfaW50ID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVChJREJfUVVFVUUpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiB0c2k3MjFfcmVxdWVzdF9tc2l4IC0gcmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2UgZm9yIE1TSS1YIG1vZGUuCisgKiBAbXBvcnQ6IFJhcGlkSU8gbWFzdGVyIHBvcnQgc3RydWN0dXJlCisgKgorICogUmVnaXN0ZXJzIE1TSS1YIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzIGZvciBpbnRlcnJ1cHRzIHRoYXQgYXJlIGFjdGl2ZQorICogaW1tZWRpYXRlbHkgYWZ0ZXIgbXBvcnQgaW5pdGlhbGl6YXRpb24uIE1lc3NhZ2luZyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcworICogc2hvdWxkIGJlIHJlZ2lzdGVyZWQgZHVyaW5nIGNvcnJlc3BvbmRpbmcgb3BlbiByZXF1ZXN0cy4KKyAqLworc3RhdGljIGludCB0c2k3MjFfcmVxdWVzdF9tc2l4KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lEQl0udmVjdG9yLAorCQkJdHNpNzIxX3NyMnBjX2NoX21zaXgsIDAsCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lEQl0uaXJxX25hbWUsICh2b2lkICopbXBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9QV1JYXS52ZWN0b3IsCisJCQl0c2k3MjFfc3Jpb19tc2l4LCAwLAorCQkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9QV1JYXS5pcnFfbmFtZSwgKHZvaWQgKiltcG9ydCk7CisJaWYgKGVycikKKwkJZnJlZV9pcnEoCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lEQl0udmVjdG9yLAorCQkJKHZvaWQgKiltcG9ydCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0c2k3MjFfZW5hYmxlX21zaXggLSBBdHRlbXB0cyB0byBlbmFibGUgTVNJLVggc3VwcG9ydCBmb3IgVHNpNzIxLgorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICoKKyAqIENvbmZpZ3VyZXMgTVNJLVggc3VwcG9ydCBmb3IgVHNpNzIxLiBTdXBwb3J0cyBvbmx5IGFuIGV4YWN0IG51bWJlcgorICogb2YgcmVxdWVzdGVkIHZlY3RvcnMuCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX2VuYWJsZV9tc2l4KHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbVFNJNzIxX1ZFQ1RfTUFYXTsKKwlpbnQgZXJyOworCWludCBpOworCisJZW50cmllc1tUU0k3MjFfVkVDVF9JREJdLmVudHJ5ID0gVFNJNzIxX01TSVhfU1IyUENfSURCUV9SQ1YoSURCX1FVRVVFKTsKKwllbnRyaWVzW1RTSTcyMV9WRUNUX1BXUlhdLmVudHJ5ID0gVFNJNzIxX01TSVhfU1JJT19NQUNfSU5UOworCisJLyoKKwkgKiBJbml0aWFsaXplIE1TSS1YIGVudHJpZXMgZm9yIE1lc3NhZ2luZyBFbmdpbmU6CisJICogdGhpcyBkcml2ZXIgc3VwcG9ydHMgZm91ciBSSU8gbWFpbGJveGVzIChpbmJvdW5kIGFuZCBvdXRib3VuZCkKKwkgKiBOT1RFOiBJbmJvdW5kIG1lc3NhZ2UgTUJPWCAwLi4uNCB1c2UgSUIgY2hhbm5lbHMgNC4uLjcuIFRoZXJlZm9yZQorCSAqIG9mZnNldCArNCBpcyBhZGRlZCB0byBJQiBNQk9YIG51bWJlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUklPX01BWF9NQk9YOyBpKyspIHsKKwkJZW50cmllc1tUU0k3MjFfVkVDVF9JTUIwX1JDViArIGldLmVudHJ5ID0KKwkJCQkJVFNJNzIxX01TSVhfSU1TR19EUV9SQ1YoaSArIDQpOworCQllbnRyaWVzW1RTSTcyMV9WRUNUX0lNQjBfSU5UICsgaV0uZW50cnkgPQorCQkJCQlUU0k3MjFfTVNJWF9JTVNHX0lOVChpICsgNCk7CisJCWVudHJpZXNbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgaV0uZW50cnkgPQorCQkJCQlUU0k3MjFfTVNJWF9PTVNHX0RPTkUoaSk7CisJCWVudHJpZXNbVFNJNzIxX1ZFQ1RfT01CMF9JTlQgKyBpXS5lbnRyeSA9CisJCQkJCVRTSTcyMV9NU0lYX09NU0dfSU5UKGkpOworCX0KKworCWVyciA9IHBjaV9lbmFibGVfbXNpeChwcml2LT5wZGV2LCBlbnRyaWVzLCBBUlJBWV9TSVpFKGVudHJpZXMpKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPiAwKQorCQkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwKKwkJCQkgIk9ubHkgJWQgTVNJLVggdmVjdG9ycyBhdmFpbGFibGUsICIKKwkJCQkgIm5vdCB1c2luZyBNU0ktWFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIENvcHkgTVNJLVggdmVjdG9yIGluZm9ybWF0aW9uIGludG8gdHNpNzIxIHByaXZhdGUgc3RydWN0dXJlCisJICovCisJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JREJdLnZlY3RvciA9IGVudHJpZXNbVFNJNzIxX1ZFQ1RfSURCXS52ZWN0b3I7CisJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JREJdLmlycV9uYW1lLCBJUlFfREVWSUNFX05BTUVfTUFYLAorCQkgRFJWX05BTUUgIi1pZGJAcGNpOiVzIiwgcGNpX25hbWUocHJpdi0+cGRldikpOworCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfUFdSWF0udmVjdG9yID0gZW50cmllc1tUU0k3MjFfVkVDVF9QV1JYXS52ZWN0b3I7CisJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9QV1JYXS5pcnFfbmFtZSwgSVJRX0RFVklDRV9OQU1FX01BWCwKKwkJIERSVl9OQU1FICItcHdyeEBwY2k6JXMiLCBwY2lfbmFtZShwcml2LT5wZGV2KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUklPX01BWF9NQk9YOyBpKyspIHsKKwkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX1JDViArIGldLnZlY3RvciA9CisJCQkJZW50cmllc1tUU0k3MjFfVkVDVF9JTUIwX1JDViArIGldLnZlY3RvcjsKKwkJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX1JDViArIGldLmlycV9uYW1lLAorCQkJIElSUV9ERVZJQ0VfTkFNRV9NQVgsIERSVl9OQU1FICItaW1iciVkQHBjaTolcyIsCisJCQkgaSwgcGNpX25hbWUocHJpdi0+cGRldikpOworCisJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBpXS52ZWN0b3IgPQorCQkJCWVudHJpZXNbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBpXS52ZWN0b3I7CisJCXNucHJpbnRmKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBpXS5pcnFfbmFtZSwKKwkJCSBJUlFfREVWSUNFX05BTUVfTUFYLCBEUlZfTkFNRSAiLWltYmklZEBwY2k6JXMiLAorCQkJIGksIHBjaV9uYW1lKHByaXYtPnBkZXYpKTsKKworCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfRE9ORSArIGldLnZlY3RvciA9CisJCQkJZW50cmllc1tUU0k3MjFfVkVDVF9PTUIwX0RPTkUgKyBpXS52ZWN0b3I7CisJCXNucHJpbnRmKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgaV0uaXJxX25hbWUsCisJCQkgSVJRX0RFVklDRV9OQU1FX01BWCwgRFJWX05BTUUgIi1vbWJkJWRAcGNpOiVzIiwKKwkJCSBpLCBwY2lfbmFtZShwcml2LT5wZGV2KSk7CisKKwkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0lOVCArIGldLnZlY3RvciA9CisJCQkJZW50cmllc1tUU0k3MjFfVkVDVF9PTUIwX0lOVCArIGldLnZlY3RvcjsKKwkJc25wcmludGYocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0lOVCArIGldLmlycV9uYW1lLAorCQkJIElSUV9ERVZJQ0VfTkFNRV9NQVgsIERSVl9OQU1FICItb21iaSVkQHBjaTolcyIsCisJCQkgaSwgcGNpX25hbWUocHJpdi0+cGRldikpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKK3N0YXRpYyBpbnQgdHNpNzIxX3JlcXVlc3RfaXJxKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJaW50IGVycjsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpCisJCWVyciA9IHRzaTcyMV9yZXF1ZXN0X21zaXgobXBvcnQpOworCWVsc2UKKyNlbmRpZgorCQllcnIgPSByZXF1ZXN0X2lycShwcml2LT5wZGV2LT5pcnEsIHRzaTcyMV9pcnFoYW5kbGVyLAorCQkJICAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJKSA/IDAgOiBJUlFGX1NIQVJFRCwKKwkJCSAgRFJWX05BTUUsICh2b2lkICopbXBvcnQpOworCisJaWYgKGVycikKKwkJZGV2X2VycigmcHJpdi0+cGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQsIEVycm9yOiAlZFxuIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdHNpNzIxX2luaXRfcGMyc3JfbWFwcGluZyAtIGluaXRpYWxpemVzIG91dGJvdW5kIChQQ0llLT5TUklPKQorICogdHJhbnNsYXRpb24gcmVnaW9ucy4KKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqCisgKiBEaXNhYmxlcyBTUkVQIHRyYW5zbGF0aW9uIHJlZ2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkIHRzaTcyMV9pbml0X3BjMnNyX21hcHBpbmcoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIGFsbCBQQzJTUiB0cmFuc2xhdGlvbiB3aW5kb3dzICovCisJZm9yIChpID0gMDsgaSA8IFRTSTcyMV9PQldJTl9OVU07IGkrKykKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JXSU5MQihpKSk7Cit9CisKKy8qKgorICogdHNpNzIxX2luaXRfc3IycGNfbWFwcGluZyAtIGluaXRpYWxpemVzIGluYm91bmQgKFNSSU8tPlBDSWUpCisgKiB0cmFuc2xhdGlvbiByZWdpb25zLgorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICoKKyAqIERpc2FibGVzIGluYm91bmQgd2luZG93cy4KKyAqLworc3RhdGljIHZvaWQgdHNpNzIxX2luaXRfc3IycGNfbWFwcGluZyhzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwlpbnQgaTsKKworCS8qIERpc2FibGUgYWxsIFNSMlBDIGluYm91bmQgd2luZG93cyAqLworCWZvciAoaSA9IDA7IGkgPCBUU0k3MjFfSUJXSU5fTlVNOyBpKyspCisJCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCV0lOTEIoaSkpOworfQorCisvKioKKyAqIHRzaTcyMV9wb3J0X3dyaXRlX2luaXQgLSBJbmJvdW5kIHBvcnQgd3JpdGUgaW50ZXJmYWNlIGluaXQKKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqCisgKiBJbml0aWFsaXplcyBpbmJvdW5kIHBvcnQgd3JpdGUgaGFuZGxlci4KKyAqIFJldHVybnMgJTAgb24gc3VjY2VzcyBvciAlLUVOT01FTSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHRzaTcyMV9wb3J0X3dyaXRlX2luaXQoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJcHJpdi0+cHdfZGlzY2FyZF9jb3VudCA9IDA7CisJSU5JVF9XT1JLKCZwcml2LT5wd193b3JrLCB0c2k3MjFfcHdfZHBjKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cHdfZmlmb19sb2NrKTsKKwlpZiAoa2ZpZm9fYWxsb2MoJnByaXYtPnB3X2ZpZm8sCisJCQlUU0k3MjFfUklPX1BXX01TR19TSVpFICogMzIsIEdGUF9LRVJORUwpKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwgIlBXIEZJRk8gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBVc2UgcmVsaWFibGUgcG9ydC13cml0ZSBjYXB0dXJlIG1vZGUgKi8KKwlpb3dyaXRlMzIoVFNJNzIxX1JJT19QV19DVExfUFdDX1JFTCwgcHJpdi0+cmVncyArIFRTSTcyMV9SSU9fUFdfQ1RMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2k3MjFfZG9vcmJlbGxfaW5pdChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwkvKiBPdXRib3VuZCBEb29yYmVsbHMgZG8gbm90IHJlcXVpcmUgYW55IHNldHVwLgorCSAqIFRzaTcyMSB1c2VzIGRlZGljYXRlZCBQQ0kgQkFSMSB0byBnZW5lcmF0ZSBkb29yYmVsbHMuCisJICogVGhhdCBCQVIxIHdhcyBtYXBwZWQgZHVyaW5nIHRoZSBwcm9iZSByb3V0aW5lLgorCSAqLworCisJLyogSW5pdGlhbGl6ZSBJbmJvdW5kIERvb3JiZWxsIHByb2Nlc3NpbmcgRFBDIGFuZCBxdWV1ZSAqLworCXByaXYtPmRiX2Rpc2NhcmRfY291bnQgPSAwOworCUlOSVRfV09SSygmcHJpdi0+aWRiX3dvcmssIHRzaTcyMV9kYl9kcGMpOworCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBpbmJvdW5kIGRvb3JiZWxscyBxdWV1ZSAqLworCXByaXYtPmlkYl9iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJSURCX1FTSVpFICogVFNJNzIxX0lEQl9FTlRSWV9TSVpFLAorCQkJCSZwcml2LT5pZGJfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPmlkYl9iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwcml2LT5pZGJfYmFzZSwgMCwgSURCX1FTSVpFICogVFNJNzIxX0lEQl9FTlRSWV9TSVpFKTsKKworCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIkFsbG9jYXRlZCBJREIgYnVmZmVyIEAgJXAgKHBoeXMgPSAlbGx4KVxuIiwKKwkJcHJpdi0+aWRiX2Jhc2UsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdi0+aWRiX2RtYSk7CisKKwlpb3dyaXRlMzIoVFNJNzIxX0lEUV9TSVpFX1ZBTChJREJfUVNJWkUpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9TSVpFKElEQl9RVUVVRSkpOworCWlvd3JpdGUzMigoKHU2NClwcml2LT5pZGJfZG1hID4+IDMyKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JRFFfQkFTRVUoSURCX1FVRVVFKSk7CisJaW93cml0ZTMyKCgodTY0KXByaXYtPmlkYl9kbWEgJiBUU0k3MjFfSURRX0JBU0VMX0FERFIpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9CQVNFTChJREJfUVVFVUUpKTsKKwkvKiBFbmFibGUgYWNjZXB0aW5nIGFsbCBpbmJvdW5kIGRvb3JiZWxscyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0lEUV9NQVNLKElEQl9RVUVVRSkpOworCisJaW93cml0ZTMyKFRTSTcyMV9JRFFfSU5JVCwgcHJpdi0+cmVncyArIFRTSTcyMV9JRFFfQ1RMKElEQl9RVUVVRSkpOworCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSURRX1JQKElEQl9RVUVVRSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRzaTcyMV9kb29yYmVsbF9mcmVlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCWlmIChwcml2LT5pZGJfYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBGcmVlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIGluYm91bmQgZG9vcmJlbGwgcXVldWUgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LCBJREJfUVNJWkUgKiBUU0k3MjFfSURCX0VOVFJZX1NJWkUsCisJCQkgIHByaXYtPmlkYl9iYXNlLCBwcml2LT5pZGJfZG1hKTsKKwlwcml2LT5pZGJfYmFzZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdHNpNzIxX2JkbWFfY2hfaW5pdChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNobnVtKQoreworCXN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MgKmJkX3B0cjsKKwl1NjQJCSpzdHNfcHRyOworCWRtYV9hZGRyX3QJYmRfcGh5cywgc3RzX3BoeXM7CisJaW50CQlzdHNfc2l6ZTsKKwlpbnQJCWJkX251bSA9IHByaXYtPmJkbWFbY2hudW1dLmJkX251bTsKKworCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIkluaXQgQmxvY2sgRE1BIEVuZ2luZSwgQ0glZFxuIiwgY2hudW0pOworCisJLyoKKwkgKiBJbml0aWFsaXplIERNQSBjaGFubmVsIGZvciBtYWludGVuYW5jZSByZXF1ZXN0cworCSAqLworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIERNQSBkZXNjcmlwdG9ycyAqLworCWJkX3B0ciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCQliZF9udW0gKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9kbWFfZGVzYyksCisJCQkJCSZiZF9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJkX3B0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5iZG1hW2NobnVtXS5iZF9waHlzID0gYmRfcGh5czsKKwlwcml2LT5iZG1hW2NobnVtXS5iZF9iYXNlID0gYmRfcHRyOworCisJbWVtc2V0KGJkX3B0ciwgMCwgYmRfbnVtICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MpKTsKKworCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIkRNQSBkZXNjcmlwdG9ycyBAICVwIChwaHlzID0gJWxseClcbiIsCisJCWJkX3B0ciwgKHVuc2lnbmVkIGxvbmcgbG9uZyliZF9waHlzKTsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBkZXNjcmlwdG9yIHN0YXR1cyBGSUZPICovCisJc3RzX3NpemUgPSAoYmRfbnVtID49IFRTSTcyMV9ETUFfTUlOU1RTU1opID8KKwkJCQkJYmRfbnVtIDogVFNJNzIxX0RNQV9NSU5TVFNTWjsKKwlzdHNfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhzdHNfc2l6ZSk7CisJc3RzX3B0ciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSAgICAgc3RzX3NpemUgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9kbWFfc3RzKSwKKwkJCQkgICAgICZzdHNfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHNfcHRyKSB7CisJCS8qIEZyZWUgc3BhY2UgYWxsb2NhdGVkIGZvciBETUEgZGVzY3JpcHRvcnMgKi8KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkgIGJkX251bSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9kZXNjKSwKKwkJCQkgIGJkX3B0ciwgYmRfcGh5cyk7CisJCXByaXYtPmJkbWFbY2hudW1dLmJkX2Jhc2UgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2LT5iZG1hW2NobnVtXS5zdHNfcGh5cyA9IHN0c19waHlzOworCXByaXYtPmJkbWFbY2hudW1dLnN0c19iYXNlID0gc3RzX3B0cjsKKwlwcml2LT5iZG1hW2NobnVtXS5zdHNfc2l6ZSA9IHN0c19zaXplOworCisJbWVtc2V0KHN0c19wdHIsIDAsIHN0c19zaXplKTsKKworCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJImRlc2Mgc3RhdHVzIEZJRk8gQCAlcCAocGh5cyA9ICVsbHgpIHNpemU9MHgleFxuIiwKKwkJc3RzX3B0ciwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdHNfcGh5cywgc3RzX3NpemUpOworCisJLyogSW5pdGlhbGl6ZSBETUEgZGVzY3JpcHRvcnMgcmluZyAqLworCWJkX3B0cltiZF9udW0gLSAxXS50eXBlX2lkID0gY3B1X3RvX2xlMzIoRFRZUEUzIDw8IDI5KTsKKwliZF9wdHJbYmRfbnVtIC0gMV0ubmV4dF9sbyA9IGNwdV90b19sZTMyKCh1NjQpYmRfcGh5cyAmCisJCQkJCQkgVFNJNzIxX0RNQUNfRFBUUkxfTUFTSyk7CisJYmRfcHRyW2JkX251bSAtIDFdLm5leHRfaGkgPSBjcHVfdG9fbGUzMigodTY0KWJkX3BoeXMgPj4gMzIpOworCisJLyogU2V0dXAgRE1BIGRlc2NyaXB0b3IgcG9pbnRlcnMgKi8KKwlpb3dyaXRlMzIoKCh1NjQpYmRfcGh5cyA+PiAzMiksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19EUFRSSChjaG51bSkpOworCWlvd3JpdGUzMigoKHU2NCliZF9waHlzICYgVFNJNzIxX0RNQUNfRFBUUkxfTUFTSyksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19EUFRSTChjaG51bSkpOworCisJLyogU2V0dXAgZGVzY3JpcHRvciBzdGF0dXMgRklGTyAqLworCWlvd3JpdGUzMigoKHU2NClzdHNfcGh5cyA+PiAzMiksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19EU0JIKGNobnVtKSk7CisJaW93cml0ZTMyKCgodTY0KXN0c19waHlzICYgVFNJNzIxX0RNQUNfRFNCTF9NQVNLKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RTQkwoY2hudW0pKTsKKwlpb3dyaXRlMzIoVFNJNzIxX0RNQUNfRFNTWl9TSVpFKHN0c19zaXplKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0RTU1ooY2hudW0pKTsKKworCS8qIENsZWFyIGludGVycnVwdCBiaXRzICovCisJaW93cml0ZTMyKFRTSTcyMV9ETUFDX0lOVF9BTEwsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19JTlQoY2hudW0pKTsKKworCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19JTlQoY2hudW0pKTsKKworCS8qIFRvZ2dsZSBETUEgY2hhbm5lbCBpbml0aWFsaXphdGlvbiAqLworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19DVExfSU5JVCwJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0NUTChjaG51bSkpOworCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19DVEwoY2hudW0pKTsKKwl1ZGVsYXkoMTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHNpNzIxX2JkbWFfY2hfZnJlZShzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNobnVtKQoreworCXUzMiBjaF9zdGF0OworCisJaWYgKHByaXYtPmJkbWFbY2hudW1dLmJkX2Jhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayBpZiBETUEgY2hhbm5lbCBzdGlsbCBydW5uaW5nICovCisJY2hfc3RhdCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKwlUU0k3MjFfRE1BQ19TVFMoY2hudW0pKTsKKwlpZiAoY2hfc3RhdCAmIFRTSTcyMV9ETUFDX1NUU19SVU4pCisJCXJldHVybiAtRUZBVUxUOworCisJLyogUHV0IERNQSBjaGFubmVsIGludG8gaW5pdCBzdGF0ZSAqLworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19DVExfSU5JVCwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9ETUFDX0NUTChjaG51bSkpOworCisJLyogRnJlZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIERNQSBkZXNjcmlwdG9ycyAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPmJkbWFbY2hudW1dLmJkX251bSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9kZXNjKSwKKwkJcHJpdi0+YmRtYVtjaG51bV0uYmRfYmFzZSwgcHJpdi0+YmRtYVtjaG51bV0uYmRfcGh5cyk7CisJcHJpdi0+YmRtYVtjaG51bV0uYmRfYmFzZSA9IE5VTEw7CisKKwkvKiBGcmVlIHNwYWNlIGFsbG9jYXRlZCBmb3Igc3RhdHVzIEZJRk8gKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5iZG1hW2NobnVtXS5zdHNfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpLAorCQlwcml2LT5iZG1hW2NobnVtXS5zdHNfYmFzZSwgcHJpdi0+YmRtYVtjaG51bV0uc3RzX3BoeXMpOworCXByaXYtPmJkbWFbY2hudW1dLnN0c19iYXNlID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2k3MjFfYmRtYV9pbml0KHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCS8qIEluaXRpYWxpemUgQkRNQSBjaGFubmVsIGFsbG9jYXRlZCBmb3IgUmFwaWRJTyBtYWludGVuYW5jZSByZWFkL3dyaXRlCisJICogcmVxdWVzdCBnZW5lcmF0aW9uCisJICovCisJcHJpdi0+YmRtYVtUU0k3MjFfRE1BQ0hfTUFJTlRdLmJkX251bSA9IDI7CisJaWYgKHRzaTcyMV9iZG1hX2NoX2luaXQocHJpdiwgVFNJNzIxX0RNQUNIX01BSU5UKSkgeworCQlkZXZfZXJyKCZwcml2LT5wZGV2LT5kZXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBtYWludGVuYW5jZSBETUEiCisJCQkiIGNoYW5uZWwgJWQsIGFib3J0aW5nXG4iLCBUU0k3MjFfRE1BQ0hfTUFJTlQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHNpNzIxX2JkbWFfZnJlZShzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwl0c2k3MjFfYmRtYV9jaF9mcmVlKHByaXYsIFRTSTcyMV9ETUFDSF9NQUlOVCk7Cit9CisKKy8qIEVuYWJsZSBJbmJvdW5kIE1lc3NhZ2luZyBJbnRlcnJ1cHRzICovCitzdGF0aWMgdm9pZAordHNpNzIxX2ltc2dfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNoLAorCQkJCSAgdTMyIGludGVfbWFzaykKK3sKKwl1MzIgcnZhbDsKKworCWlmICghaW50ZV9tYXNrKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBwZW5kaW5nIEluYm91bmQgTWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoaW50ZV9tYXNrLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlQoY2gpKTsKKworCS8qIEVuYWJsZSBJbmJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0lOVEUoY2gpKTsKKwlpb3dyaXRlMzIocnZhbCB8IGludGVfbWFzaywgcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfSU5URShjaCkpOworCisJaWYgKHByaXYtPmZsYWdzICYgVFNJNzIxX1VTSU5HX01TSVgpCisJCXJldHVybjsgLyogRmluaXNoZWQgaWYgd2UgYXJlIGluIE1TSS1YIG1vZGUgKi8KKworCS8qCisJICogRm9yIE1TSSBhbmQgSU5UQSBpbnRlcnJ1cHQgc2lnbmFsbGluZyB3ZSBuZWVkIHRvIGVuYWJsZSBuZXh0IGxldmVscworCSAqLworCisJLyogRW5hYmxlIERldmljZSBDaGFubmVsIEludGVycnVwdCAqLworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCWlvd3JpdGUzMihydmFsIHwgVFNJNzIxX0lOVF9JTVNHX0NIQU4oY2gpLAorCQkgIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7Cit9CisKKy8qIERpc2FibGUgSW5ib3VuZCBNZXNzYWdpbmcgSW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQKK3RzaTcyMV9pbXNnX2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gsCisJCQkJICAgdTMyIGludGVfbWFzaykKK3sKKwl1MzIgcnZhbDsKKworCWlmICghaW50ZV9tYXNrKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBwZW5kaW5nIEluYm91bmQgTWVzc2FnaW5nIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoaW50ZV9tYXNrLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlQoY2gpKTsKKworCS8qIERpc2FibGUgSW5ib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlRFKGNoKSk7CisJcnZhbCAmPSB+aW50ZV9tYXNrOworCWlvd3JpdGUzMihydmFsLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlRFKGNoKSk7CisKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkKKwkJcmV0dXJuOyAvKiBGaW5pc2hlZCBpZiB3ZSBhcmUgaW4gTVNJLVggbW9kZSAqLworCisJLyoKKwkgKiBGb3IgTVNJIGFuZCBJTlRBIGludGVycnVwdCBzaWduYWxsaW5nIHdlIG5lZWQgdG8gZGlzYWJsZSBuZXh0IGxldmVscworCSAqLworCisJLyogRGlzYWJsZSBEZXZpY2UgQ2hhbm5lbCBJbnRlcnJ1cHQgKi8KKwlydmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKwlydmFsICY9IH5UU0k3MjFfSU5UX0lNU0dfQ0hBTihjaCk7CisJaW93cml0ZTMyKHJ2YWwsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7Cit9CisKKy8qIEVuYWJsZSBPdXRib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQKK3RzaTcyMV9vbXNnX2ludGVycnVwdF9lbmFibGUoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYsIGludCBjaCwKKwkJCQkgIHUzMiBpbnRlX21hc2spCit7CisJdTMyIHJ2YWw7CisKKwlpZiAoIWludGVfbWFzaykKKwkJcmV0dXJuOworCisJLyogQ2xlYXIgcGVuZGluZyBPdXRib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihpbnRlX21hc2ssIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVChjaCkpOworCisJLyogRW5hYmxlIE91dGJvdW5kIE1lc3NhZ2luZyBjaGFubmVsIGludGVycnVwdHMgKi8KKwlydmFsID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5URShjaCkpOworCWlvd3JpdGUzMihydmFsIHwgaW50ZV9tYXNrLCBwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlRFKGNoKSk7CisKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkKKwkJcmV0dXJuOyAvKiBGaW5pc2hlZCBpZiB3ZSBhcmUgaW4gTVNJLVggbW9kZSAqLworCisJLyoKKwkgKiBGb3IgTVNJIGFuZCBJTlRBIGludGVycnVwdCBzaWduYWxsaW5nIHdlIG5lZWQgdG8gZW5hYmxlIG5leHQgbGV2ZWxzCisJICovCisKKwkvKiBFbmFibGUgRGV2aWNlIENoYW5uZWwgSW50ZXJydXB0ICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJaW93cml0ZTMyKHJ2YWwgfCBUU0k3MjFfSU5UX09NU0dfQ0hBTihjaCksCisJCSAgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKK30KKworLyogRGlzYWJsZSBPdXRib3VuZCBNZXNzYWdpbmcgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQKK3RzaTcyMV9vbXNnX2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gsCisJCQkJICAgdTMyIGludGVfbWFzaykKK3sKKwl1MzIgcnZhbDsKKworCWlmICghaW50ZV9tYXNrKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBwZW5kaW5nIE91dGJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKGludGVfbWFzaywgcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfSU5UKGNoKSk7CisKKwkvKiBEaXNhYmxlIE91dGJvdW5kIE1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJcnZhbCA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVEUoY2gpKTsKKwlydmFsICY9IH5pbnRlX21hc2s7CisJaW93cml0ZTMyKHJ2YWwsIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVEUoY2gpKTsKKworCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKQorCQlyZXR1cm47IC8qIEZpbmlzaGVkIGlmIHdlIGFyZSBpbiBNU0ktWCBtb2RlICovCisKKwkvKgorCSAqIEZvciBNU0kgYW5kIElOVEEgaW50ZXJydXB0IHNpZ25hbGxpbmcgd2UgbmVlZCB0byBkaXNhYmxlIG5leHQgbGV2ZWxzCisJICovCisKKwkvKiBEaXNhYmxlIERldmljZSBDaGFubmVsIEludGVycnVwdCAqLworCXJ2YWwgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCXJ2YWwgJj0gflRTSTcyMV9JTlRfT01TR19DSEFOKGNoKTsKKwlpb3dyaXRlMzIocnZhbCwgcHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKK30KKworLyoqCisgKiB0c2k3MjFfYWRkX291dGJfbWVzc2FnZSAtIEFkZCBtZXNzYWdlIHRvIHRoZSBUc2k3MjEgb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCB3aXRoIG91dGJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEByZGV2OiBUYXJnZXQgb2Ygb3V0Ym91bmQgbWVzc2FnZQorICogQG1ib3g6IE91dGJvdW5kIG1haWxib3gKKyAqIEBidWZmZXI6IE1lc3NhZ2UgdG8gYWRkIHRvIG91dGJvdW5kIHF1ZXVlCisgKiBAbGVuOiBMZW5ndGggb2YgbWVzc2FnZQorICovCitzdGF0aWMgaW50Cit0c2k3MjFfYWRkX291dGJfbWVzc2FnZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgc3RydWN0IHJpb19kZXYgKnJkZXYsIGludCBtYm94LAorCQkJdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJc3RydWN0IHRzaTcyMV9vbXNnX2Rlc2MgKmRlc2M7CisJdTMyIHR4X3Nsb3Q7CisKKwlpZiAoIXByaXYtPm9tc2dfaW5pdFttYm94XSB8fAorCSAgICBsZW4gPiBUU0k3MjFfTVNHX01BWF9TSVpFIHx8IGxlbiA8IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJdHhfc2xvdCA9IHByaXYtPm9tc2dfcmluZ1ttYm94XS50eF9zbG90OworCisJLyogQ29weSBjb3B5IG1lc3NhZ2UgaW50byB0cmFuc2ZlciBidWZmZXIgKi8KKwltZW1jcHkocHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW3R4X3Nsb3RdLCBidWZmZXIsIGxlbik7CisKKwlpZiAobGVuICYgMHg3KQorCQlsZW4gKz0gODsKKworCS8qIEJ1aWxkIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciAqLworCWRlc2MgPSBwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2U7CisJZGVzY1t0eF9zbG90XS50eXBlX2lkID0gY3B1X3RvX2xlMzIoKERUWVBFNCA8PCAyOSkgfCByZGV2LT5kZXN0aWQpOworCWlmICh0eF9zbG90ICUgNCA9PSAwKQorCQlkZXNjW3R4X3Nsb3RdLnR5cGVfaWQgfD0gY3B1X3RvX2xlMzIoVFNJNzIxX09NRF9JT0YpOworCisJZGVzY1t0eF9zbG90XS5tc2dfaW5mbyA9CisJCWNwdV90b19sZTMyKChtcG9ydC0+c3lzX3NpemUgPDwgMjYpIHwgKG1ib3ggPDwgMjIpIHwKKwkJCSAgICAoMHhlIDw8IDEyKSB8IChsZW4gJiAweGZmOCkpOworCWRlc2NbdHhfc2xvdF0uYnVmcHRyX2xvID0KKwkJY3B1X3RvX2xlMzIoKHU2NClwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX3BoeXNbdHhfc2xvdF0gJgorCQkJICAgIDB4ZmZmZmZmZmYpOworCWRlc2NbdHhfc2xvdF0uYnVmcHRyX2hpID0KKwkJY3B1X3RvX2xlMzIoKHU2NClwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX3BoeXNbdHhfc2xvdF0gPj4gMzIpOworCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLndyX2NvdW50Kys7CisKKwkvKiBHbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KKwlpZiAoKytwcml2LT5vbXNnX3JpbmdbbWJveF0udHhfc2xvdCA9PSBwcml2LT5vbXNnX3JpbmdbbWJveF0uc2l6ZSkgeworCQlwcml2LT5vbXNnX3JpbmdbbWJveF0udHhfc2xvdCA9IDA7CisJCS8qIE1vdmUgdGhyb3VnaCB0aGUgcmluZyBsaW5rIGRlc2NyaXB0b3IgYXQgdGhlIGVuZCAqLworCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ud3JfY291bnQrKzsKKwl9CisKKwltYigpOworCisJLyogU2V0IG5ldyB3cml0ZSBjb3VudCB2YWx1ZSAqLworCWlvd3JpdGUzMihwcml2LT5vbXNnX3JpbmdbbWJveF0ud3JfY291bnQsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RXUkNOVChtYm94KSk7CisJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFdSQ05UKG1ib3gpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRzaTcyMV9vbXNnX2hhbmRsZXIgLSBPdXRib3VuZCBNZXNzYWdlIEludGVycnVwdCBIYW5kbGVyCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKiBAY2g6ICAgbnVtYmVyIG9mIE9CIE1TRyBjaGFubmVsIHRvIHNlcnZpY2UKKyAqCisgKiBTZXJ2aWNlcyBjaGFubmVsIGludGVycnVwdHMgZnJvbSBvdXRib3VuZCBtZXNzYWdpbmcgZW5naW5lLgorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfb21zZ19oYW5kbGVyKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2LCBpbnQgY2gpCit7CisJdTMyIG9tc2dfaW50OworCisJc3Bpbl9sb2NrKCZwcml2LT5vbXNnX3JpbmdbY2hdLmxvY2spOworCisJb21zZ19pbnQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlQoY2gpKTsKKworCWlmIChvbXNnX2ludCAmIFRTSTcyMV9PQkRNQUNfSU5UX1NUX0ZVTEwpCisJCWRldl9pbmZvKCZwcml2LT5wZGV2LT5kZXYsCisJCQkiT0IgTUJPWCVkOiBTdGF0dXMgRklGTyBpcyBmdWxsXG4iLCBjaCk7CisKKwlpZiAob21zZ19pbnQgJiAoVFNJNzIxX09CRE1BQ19JTlRfRE9ORSB8IFRTSTcyMV9PQkRNQUNfSU5UX0lPRl9ET05FKSkgeworCQl1MzIgc3JkX3B0cjsKKwkJdTY0ICpzdHNfcHRyLCBsYXN0X3B0ciA9IDAsIHByZXZfcHRyID0gMDsKKwkJaW50IGksIGo7CisJCXUzMiB0eF9zbG90OworCisJCS8qCisJCSAqIEZpbmQgbGFzdCBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGRlc2NyaXB0b3IKKwkJICovCisKKwkJLyogQ2hlY2sgYW5kIGNsZWFyIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gZW50cmllcyAqLworCQlzcmRfcHRyID0gcHJpdi0+b21zZ19yaW5nW2NoXS5zdHNfcmRwdHI7CisJCXN0c19wdHIgPSBwcml2LT5vbXNnX3JpbmdbY2hdLnN0c19iYXNlOworCQlqID0gc3JkX3B0ciAqIDg7CisJCXdoaWxlIChzdHNfcHRyW2pdKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgOCAmJiBzdHNfcHRyW2pdOyBpKyssIGorKykgeworCQkJCXByZXZfcHRyID0gbGFzdF9wdHI7CisJCQkJbGFzdF9wdHIgPSBsZTY0X3RvX2NwdShzdHNfcHRyW2pdKTsKKwkJCQlzdHNfcHRyW2pdID0gMDsKKwkJCX0KKworCQkJKytzcmRfcHRyOworCQkJc3JkX3B0ciAlPSBwcml2LT5vbXNnX3JpbmdbY2hdLnN0c19zaXplOworCQkJaiA9IHNyZF9wdHIgKiA4OworCQl9CisKKwkJaWYgKGxhc3RfcHRyID09IDApCisJCQlnb3RvIG5vX3N0c191cGRhdGU7CisKKwkJcHJpdi0+b21zZ19yaW5nW2NoXS5zdHNfcmRwdHIgPSBzcmRfcHRyOworCQlpb3dyaXRlMzIoc3JkX3B0ciwgcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFNSUChjaCkpOworCisJCWlmICghcHJpdi0+bXBvcnQtPm91dGJfbXNnW2NoXS5tY2JhY2spCisJCQlnb3RvIG5vX3N0c191cGRhdGU7CisKKwkJLyogSW5mb3JtIHVwcGVyIGxheWVyIGFib3V0IHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KKworCQl0eF9zbG90ID0gKGxhc3RfcHRyIC0gKHU2NClwcml2LT5vbXNnX3JpbmdbY2hdLm9tZF9waHlzKS8KKwkJCQkJCXNpemVvZihzdHJ1Y3QgdHNpNzIxX29tc2dfZGVzYyk7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhpcyBpcyBhIExpbmsgRGVzY3JpcHRvciAoTEQpLgorCQkgKiBJZiB5ZXMsIGlnbm9yZSBMRCBhbmQgdXNlIGRlc2NyaXB0b3IgcHJvY2Vzc2VkCisJCSAqIGJlZm9yZSBMRC4KKwkJICovCisJCWlmICh0eF9zbG90ID09IHByaXYtPm9tc2dfcmluZ1tjaF0uc2l6ZSkgeworCQkJaWYgKHByZXZfcHRyKQorCQkJCXR4X3Nsb3QgPSAocHJldl9wdHIgLQorCQkJCQkodTY0KXByaXYtPm9tc2dfcmluZ1tjaF0ub21kX3BoeXMpLworCQkJCQkJc2l6ZW9mKHN0cnVjdCB0c2k3MjFfb21zZ19kZXNjKTsKKwkJCWVsc2UKKwkJCQlnb3RvIG5vX3N0c191cGRhdGU7CisJCX0KKworCQkvKiBNb3ZlIHNsb3QgaW5kZXggdG8gdGhlIG5leHQgbWVzc2FnZSB0byBiZSBzZW50ICovCisJCSsrdHhfc2xvdDsKKwkJaWYgKHR4X3Nsb3QgPT0gcHJpdi0+b21zZ19yaW5nW2NoXS5zaXplKQorCQkJdHhfc2xvdCA9IDA7CisJCUJVR19PTih0eF9zbG90ID49IHByaXYtPm9tc2dfcmluZ1tjaF0uc2l6ZSk7CisJCXByaXYtPm1wb3J0LT5vdXRiX21zZ1tjaF0ubWNiYWNrKHByaXYtPm1wb3J0LAorCQkJCXByaXYtPm9tc2dfcmluZ1tjaF0uZGV2X2lkLCBjaCwKKwkJCQl0eF9zbG90KTsKKwl9CisKK25vX3N0c191cGRhdGU6CisKKwlpZiAob21zZ19pbnQgJiBUU0k3MjFfT0JETUFDX0lOVF9FUlJPUikgeworCQkvKgorCQkqIE91dGJvdW5kIG1lc3NhZ2Ugb3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGVycm9yLAorCQkqIHJlaW5pdGlhbGl6ZSBPQiBNU0cgY2hhbm5lbAorCQkqLworCisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIk9CIE1TRyBBQk9SVCBjaF9zdGF0PSV4XG4iLAorCQkJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfU1RTKGNoKSkpOworCisJCWlvd3JpdGUzMihUU0k3MjFfT0JETUFDX0lOVF9FUlJPUiwKKwkJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlQoY2gpKTsKKwkJaW93cml0ZTMyKFRTSTcyMV9PQkRNQUNfQ1RMX0lOSVQsCisJCQkJcHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfQ1RMKGNoKSk7CisJCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0NUTChjaCkpOworCisJCS8qIEluZm9ybSB1cHBlciBsZXZlbCB0byBjbGVhciBhbGwgcGVuZGluZyB0eCBzbG90cyAqLworCQlpZiAocHJpdi0+bXBvcnQtPm91dGJfbXNnW2NoXS5tY2JhY2spCisJCQlwcml2LT5tcG9ydC0+b3V0Yl9tc2dbY2hdLm1jYmFjayhwcml2LT5tcG9ydCwKKwkJCQkJcHJpdi0+b21zZ19yaW5nW2NoXS5kZXZfaWQsIGNoLAorCQkJCQlwcml2LT5vbXNnX3JpbmdbY2hdLnR4X3Nsb3QpOworCQkvKiBTeW5jaCB0eF9zbG90IHRyYWNraW5nICovCisJCWlvd3JpdGUzMihwcml2LT5vbXNnX3JpbmdbY2hdLnR4X3Nsb3QsCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EUkRDTlQoY2gpKTsKKwkJaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9PQkRNQUNfRFJEQ05UKGNoKSk7CisJCXByaXYtPm9tc2dfcmluZ1tjaF0ud3JfY291bnQgPSBwcml2LT5vbXNnX3JpbmdbY2hdLnR4X3Nsb3Q7CisJCXByaXYtPm9tc2dfcmluZ1tjaF0uc3RzX3JkcHRyID0gMDsKKwl9CisKKwkvKiBDbGVhciBjaGFubmVsIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIob21zZ19pbnQsIHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0lOVChjaCkpOworCisJaWYgKCEocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkpIHsKKwkJdTMyIGNoX2ludGU7CisKKwkJLyogUmUtZW5hYmxlIGNoYW5uZWwgaW50ZXJydXB0cyAqLworCQljaF9pbnRlID0gaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZfQ0hBTl9JTlRFKTsKKwkJY2hfaW50ZSB8PSBUU0k3MjFfSU5UX09NU0dfQ0hBTihjaCk7CisJCWlvd3JpdGUzMihjaF9pbnRlLCBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCX0KKworCXNwaW5fdW5sb2NrKCZwcml2LT5vbXNnX3JpbmdbY2hdLmxvY2spOworfQorCisvKioKKyAqIHRzaTcyMV9vcGVuX291dGJfbWJveCAtIEluaXRpYWxpemUgVHNpNzIxIG91dGJvdW5kIG1haWxib3gKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIE91dGJvdW5kIE1lc3NhZ2luZyBFbmdpbmUKKyAqIEBkZXZfaWQ6IERldmljZSBzcGVjaWZpYyBwb2ludGVyIHRvIHBhc3Mgb24gZXZlbnQKKyAqIEBtYm94OiBNYWlsYm94IHRvIG9wZW4KKyAqIEBlbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3V0Ym91bmQgbWFpbGJveCByaW5nCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX29wZW5fb3V0Yl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB2b2lkICpkZXZfaWQsCisJCQkJIGludCBtYm94LCBpbnQgZW50cmllcykKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXN0cnVjdCB0c2k3MjFfb21zZ19kZXNjICpiZF9wdHI7CisJaW50IGksIHJjID0gMDsKKworCWlmICgoZW50cmllcyA8IFRTSTcyMV9PTVNHRF9NSU5fUklOR19TSVpFKSB8fAorCSAgICAoZW50cmllcyA+IChUU0k3MjFfT01TR0RfUklOR19TSVpFKSkgfHwKKwkgICAgKCFpc19wb3dlcl9vZl8yKGVudHJpZXMpKSB8fCBtYm94ID49IFJJT19NQVhfTUJPWCkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5kZXZfaWQgPSBkZXZfaWQ7CisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnNpemUgPSBlbnRyaWVzOworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfcmRwdHIgPSAwOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5vbXNnX3JpbmdbbWJveF0ubG9jayk7CisKKwkvKiBPdXRib3VuZCBNc2cgQnVmZmVyIGFsbG9jYXRpb24gYmFzZWQgb24KKwkgICB0aGUgbnVtYmVyIG9mIG1heGltdW0gZGVzY3JpcHRvciBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21xX2Jhc2VbaV0gPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KAorCQkJCSZwcml2LT5wZGV2LT5kZXYsIFRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCQkJJnByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfcGh5c1tpXSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfYmFzZVtpXSA9PSBOVUxMKSB7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBPQiBNU0cgZGF0YSBidWZmZXIgZm9yIgorCQkJCSIgTUJPWCVkXG4iLCBtYm94KTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJfQorCX0KKworCS8qIE91dGJvdW5kIG1lc3NhZ2UgZGVzY3JpcHRvciBhbGxvY2F0aW9uICovCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KAorCQkJCSZwcml2LT5wZGV2LT5kZXYsCisJCQkJKGVudHJpZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX29tc2dfZGVzYyksCisJCQkJJnByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgT0IgTVNHIGRlc2NyaXB0b3IgbWVtb3J5ICIKKwkJCSJmb3IgTUJPWCVkXG4iLCBtYm94KTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9idWY7CisJfQorCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnR4X3Nsb3QgPSAwOworCisJLyogT3V0Ym91bmQgbWVzc2FnZSBkZXNjcmlwdG9yIHN0YXR1cyBGSUZPIGFsbG9jYXRpb24gKi8KKwlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28oZW50cmllcyArIDEpOworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19zaXplICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpLAorCQkJJnByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgT0IgTVNHIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gIgorCQkJImZvciBNQk9YJWRcbiIsIG1ib3gpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Rlc2M7CisJfQorCisJbWVtc2V0KHByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSwgMCwKKwkJZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpKTsKKworCS8qCisJICogQ29uZmlndXJlIE91dGJvdW5kIE1lc3NhZ2luZyBFbmdpbmUKKwkgKi8KKworCS8qIFNldHVwIE91dGJvdW5kIE1lc3NhZ2UgZGVzY3JpcHRvciBwb2ludGVyICovCisJaW93cml0ZTMyKCgodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyA+PiAzMiksCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EUFRSSChtYm94KSk7CisJaW93cml0ZTMyKCgodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyAmCisJCQkJCVRTSTcyMV9PQkRNQUNfRFBUUkxfTUFTSyksCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EUFRSTChtYm94KSk7CisKKwkvKiBTZXR1cCBPdXRib3VuZCBNZXNzYWdlIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gKi8KKwlpb3dyaXRlMzIoKCh1NjQpcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19waHlzID4+IDMyKSwKKwkJCXByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RTQkgobWJveCkpOworCWlvd3JpdGUzMigoKHU2NClwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3BoeXMgJgorCQkJCQlUU0k3MjFfT0JETUFDX0RTQkxfTUFTSyksCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19EU0JMKG1ib3gpKTsKKwlpb3dyaXRlMzIoVFNJNzIxX0RNQUNfRFNTWl9TSVpFKHByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfc2l6ZSksCisJCXByaXYtPnJlZ3MgKyAodTMyKVRTSTcyMV9PQkRNQUNfRFNTWihtYm94KSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkgeworCQkvKiBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIGlmIHdlIGFyZSBpbiBNU0ktWCBtb2RlICovCisJCXJjID0gcmVxdWVzdF9pcnEoCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfRE9ORSArIG1ib3hdLnZlY3RvciwKKwkJCXRzaTcyMV9vbXNnX21zaXgsIDAsCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfRE9ORSArIG1ib3hdLmlycV9uYW1lLAorCQkJKHZvaWQgKiltcG9ydCk7CisKKwkJaWYgKHJjKSB7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHQgZm9yICIKKwkJCQkiT0JPWCVkLURPTkVcbiIsIG1ib3gpOworCQkJZ290byBvdXRfc3RhdDsKKwkJfQorCisJCXJjID0gcmVxdWVzdF9pcnEocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0lOVCArIG1ib3hdLnZlY3RvciwKKwkJCXRzaTcyMV9vbXNnX21zaXgsIDAsCisJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfSU5UICsgbWJveF0uaXJxX25hbWUsCisJCQkodm9pZCAqKW1wb3J0KTsKKworCQlpZiAocmMpCXsKKwkJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSS1YIGludGVycnVwdCBmb3IgIgorCQkJCSJNQk9YJWQtSU5UXG4iLCBtYm94KTsKKwkJCWZyZWVfaXJxKAorCQkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfT01CMF9ET05FICsgbWJveF0udmVjdG9yLAorCQkJCSh2b2lkICopbXBvcnQpOworCQkJZ290byBvdXRfc3RhdDsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCisJdHNpNzIxX29tc2dfaW50ZXJydXB0X2VuYWJsZShwcml2LCBtYm94LCBUU0k3MjFfT0JETUFDX0lOVF9BTEwpOworCisJLyogSW5pdGlhbGl6ZSBPdXRib3VuZCBNZXNzYWdlIGRlc2NyaXB0b3JzIHJpbmcgKi8KKwliZF9wdHIgPSBwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2U7CisJYmRfcHRyW2VudHJpZXNdLnR5cGVfaWQgPSBjcHVfdG9fbGUzMihEVFlQRTUgPDwgMjkpOworCWJkX3B0cltlbnRyaWVzXS5tc2dfaW5mbyA9IDA7CisJYmRfcHRyW2VudHJpZXNdLm5leHRfbG8gPQorCQljcHVfdG9fbGUzMigodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyAmCisJCVRTSTcyMV9PQkRNQUNfRFBUUkxfTUFTSyk7CisJYmRfcHRyW2VudHJpZXNdLm5leHRfaGkgPQorCQljcHVfdG9fbGUzMigodTY0KXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyA+PiAzMik7CisJcHJpdi0+b21zZ19yaW5nW21ib3hdLndyX2NvdW50ID0gMDsKKwltYigpOworCisJLyogSW5pdGlhbGl6ZSBPdXRib3VuZCBNZXNzYWdlIGVuZ2luZSAqLworCWlvd3JpdGUzMihUU0k3MjFfT0JETUFDX0NUTF9JTklULCBwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19DVEwobWJveCkpOworCWlvcmVhZDMyKHByaXYtPnJlZ3MgKyBUU0k3MjFfT0JETUFDX0RXUkNOVChtYm94KSk7CisJdWRlbGF5KDEwKTsKKworCXByaXYtPm9tc2dfaW5pdFttYm94XSA9IDE7CisKKwlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitvdXRfc3RhdDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3NpemUgKiBzaXplb2Yoc3RydWN0IHRzaTcyMV9kbWFfc3RzKSwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3BoeXMpOworCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19iYXNlID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCitvdXRfZGVzYzoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkoZW50cmllcyArIDEpICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfb21zZ19kZXNjKSwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9iYXNlLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX3BoeXMpOworCisJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tZF9iYXNlID0gTlVMTDsKKworb3V0X2J1ZjoKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+b21zZ19yaW5nW21ib3hdLnNpemU7IGkrKykgeworCQlpZiAocHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCVRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldLAorCQkJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfcGh5c1tpXSk7CisKKwkJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfYmFzZVtpXSA9IE5VTEw7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogdHNpNzIxX2Nsb3NlX291dGJfbWJveCAtIENsb3NlIFRzaTcyMSBvdXRib3VuZCBtYWlsYm94CisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgb3V0Ym91bmQgbWVzc2FnZSB1bml0CisgKiBAbWJveDogTWFpbGJveCB0byBjbG9zZQorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfY2xvc2Vfb3V0Yl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXUzMiBpOworCisJaWYgKCFwcml2LT5vbXNnX2luaXRbbWJveF0pCisJCXJldHVybjsKKwlwcml2LT5vbXNnX2luaXRbbWJveF0gPSAwOworCisJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisKKwl0c2k3MjFfb21zZ19pbnRlcnJ1cHRfZGlzYWJsZShwcml2LCBtYm94LCBUU0k3MjFfT0JETUFDX0lOVF9BTEwpOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkgeworCQlmcmVlX2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX09NQjBfRE9ORSArIG1ib3hdLnZlY3RvciwKKwkJCSAodm9pZCAqKW1wb3J0KTsKKwkJZnJlZV9pcnEocHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9PTUIwX0lOVCArIG1ib3hdLnZlY3RvciwKKwkJCSAodm9pZCAqKW1wb3J0KTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworCS8qIEZyZWUgT01TRyBEZXNjcmlwdG9yIFN0YXR1cyBGSUZPICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19zaXplICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX3N0cyksCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSwKKwkJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19waHlzKTsKKworCXByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSA9IE5VTEw7CisKKwkvKiBGcmVlIE9NU0cgZGVzY3JpcHRvcnMgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkocHJpdi0+b21zZ19yaW5nW21ib3hdLnNpemUgKyAxKSAqCisJCQlzaXplb2Yoc3RydWN0IHRzaTcyMV9vbXNnX2Rlc2MpLAorCQlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2UsCisJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbWRfcGh5cyk7CisKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0ub21kX2Jhc2UgPSBOVUxMOworCisJLyogRnJlZSBtZXNzYWdlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+b21zZ19yaW5nW21ib3hdLnNpemU7IGkrKykgeworCQlpZiAocHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQkJCVRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCQkJcHJpdi0+b21zZ19yaW5nW21ib3hdLm9tcV9iYXNlW2ldLAorCQkJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfcGh5c1tpXSk7CisKKwkJCXByaXYtPm9tc2dfcmluZ1ttYm94XS5vbXFfYmFzZVtpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKy8qKgorICogdHNpNzIxX2ltc2dfaGFuZGxlciAtIEluYm91bmQgTWVzc2FnZSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICogQGNoOiBpbmJvdW5kIG1lc3NhZ2UgY2hhbm5lbCBudW1iZXIgdG8gc2VydmljZQorICoKKyAqIFNlcnZpY2VzIGNoYW5uZWwgaW50ZXJydXB0cyBmcm9tIGluYm91bmQgbWVzc2FnaW5nIGVuZ2luZS4KKyAqLworc3RhdGljIHZvaWQgdHNpNzIxX2ltc2dfaGFuZGxlcihzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiwgaW50IGNoKQoreworCXUzMiBtYm94ID0gY2ggLSA0OworCXUzMiBpbXNnX2ludDsKKworCXNwaW5fbG9jaygmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmxvY2spOworCisJaW1zZ19pbnQgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlQoY2gpKTsKKworCWlmIChpbXNnX2ludCAmIFRTSTcyMV9JQkRNQUNfSU5UX1NSVE8pCisJCWRldl9pbmZvKCZwcml2LT5wZGV2LT5kZXYsICJJQiBNQk9YJWQgU1JJTyB0aW1lb3V0XG4iLAorCQkJbWJveCk7CisKKwlpZiAoaW1zZ19pbnQgJiBUU0k3MjFfSUJETUFDX0lOVF9QQ19FUlJPUikKKwkJZGV2X2luZm8oJnByaXYtPnBkZXYtPmRldiwgIklCIE1CT1glZCBQQ0llIGVycm9yXG4iLAorCQkJbWJveCk7CisKKwlpZiAoaW1zZ19pbnQgJiBUU0k3MjFfSUJETUFDX0lOVF9GUV9MT1cpCisJCWRldl9pbmZvKCZwcml2LT5wZGV2LT5kZXYsCisJCQkiSUIgTUJPWCVkIElCIGZyZWUgcXVldWUgbG93XG4iLCBtYm94KTsKKworCS8qIENsZWFyIElCIGNoYW5uZWwgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMihpbXNnX2ludCwgcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfSU5UKGNoKSk7CisKKwkvKiBJZiBhbiBJQiBNc2cgaXMgcmVjZWl2ZWQgbm90aWZ5IHRoZSB1cHBlciBsYXllciAqLworCWlmIChpbXNnX2ludCAmIFRTSTcyMV9JQkRNQUNfSU5UX0RRX1JDViAmJgorCQlwcml2LT5tcG9ydC0+aW5iX21zZ1ttYm94XS5tY2JhY2spCisJCXByaXYtPm1wb3J0LT5pbmJfbXNnW21ib3hdLm1jYmFjayhwcml2LT5tcG9ydCwKKwkJCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uZGV2X2lkLCBtYm94LCAtMSk7CisKKwlpZiAoIShwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSkgeworCQl1MzIgY2hfaW50ZTsKKworCQkvKiBSZS1lbmFibGUgY2hhbm5lbCBpbnRlcnJ1cHRzICovCisJCWNoX2ludGUgPSBpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCQljaF9pbnRlIHw9IFRTSTcyMV9JTlRfSU1TR19DSEFOKGNoKTsKKwkJaW93cml0ZTMyKGNoX2ludGUsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0NIQU5fSU5URSk7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmltc2dfcmluZ1ttYm94XS5sb2NrKTsKK30KKworLyoqCisgKiB0c2k3MjFfb3Blbl9pbmJfbWJveCAtIEluaXRpYWxpemUgVHNpNzIxIGluYm91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIEluYm91bmQgTWVzc2FnaW5nIEVuZ2luZQorICogQGRldl9pZDogRGV2aWNlIHNwZWNpZmljIHBvaW50ZXIgdG8gcGFzcyBvbiBldmVudAorICogQG1ib3g6IE1haWxib3ggdG8gb3BlbgorICogQGVudHJpZXM6IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBpbmJvdW5kIG1haWxib3ggcmluZworICovCitzdGF0aWMgaW50IHRzaTcyMV9vcGVuX2luYl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB2b2lkICpkZXZfaWQsCisJCQkJaW50IG1ib3gsIGludCBlbnRyaWVzKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJaW50IGNoID0gbWJveCArIDQ7CisJaW50IGk7CisJdTY0ICpmcmVlX3B0cjsKKwlpbnQgcmMgPSAwOworCisJaWYgKChlbnRyaWVzIDwgVFNJNzIxX0lNU0dEX01JTl9SSU5HX1NJWkUpIHx8CisJICAgIChlbnRyaWVzID4gVFNJNzIxX0lNU0dEX1JJTkdfU0laRSkgfHwKKwkgICAgKCFpc19wb3dlcl9vZl8yKGVudHJpZXMpKSB8fCBtYm94ID49IFJJT19NQVhfTUJPWCkgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEluaXRpYWxpemUgSUIgTWVzc2FnaW5nIFJpbmcgKi8KKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uZGV2X2lkID0gZGV2X2lkOworCXByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplID0gZW50cmllczsKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0ucnhfc2xvdCA9IDA7CisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmRlc2NfcmRwdHIgPSAwOworCXByaXYtPmltc2dfcmluZ1ttYm94XS5mcV93cnB0ciA9IDA7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplOyBpKyspCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbXFfYmFzZVtpXSA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmltc2dfcmluZ1ttYm94XS5sb2NrKTsKKworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIGluY29taW5nIG1lc3NhZ2VzICovCisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmJ1Zl9iYXNlID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJICAgZW50cmllcyAqIFRTSTcyMV9NU0dfQlVGRkVSX1NJWkUsCisJCQkJICAgJnByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfcGh5cywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKworCWlmIChwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwcml2LT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIElCIE1CT1glZFxuIiwgbWJveCk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBjaXJjdWxhciBmcmVlIGxpc3QgKi8KKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9iYXNlID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCQkJICAgZW50cmllcyAqIDgsCisJCQkJICAgJnByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX3BoeXMsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAocHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZnJlZSBxdWV1ZSBmb3IgSUIgTUJPWCVkXG4iLCBtYm94KTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9idWY7CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBJbmJvdW5kIG1lc3NhZ2UgZGVzY3JpcHRvcnMgKi8KKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX2Jhc2UgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJCQkgICBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfaW1zZ19kZXNjKSwKKwkJCQkgICAmcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9waHlzLCBHRlBfS0VSTkVMKTsKKworCWlmIChwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX2Jhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwcml2LT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIGRlc2NyaXB0b3IgbWVtb3J5IGZvciBJQiBNQk9YJWRcbiIsCisJCQltYm94KTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9kbWE7CisJfQorCisJLyogRmlsbCBmcmVlIGJ1ZmZlciBwb2ludGVyIGxpc3QgKi8KKwlmcmVlX3B0ciA9IHByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKwkJZnJlZV9wdHJbaV0gPSBjcHVfdG9fbGU2NCgKKwkJCQkodTY0KShwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX3BoeXMpICsKKwkJCQlpICogMHgxMDAwKTsKKworCW1iKCk7CisKKwkvKgorCSAqIEZvciBtYXBwaW5nIG9mIGluYm91bmQgU1JJTyBNZXNzYWdlcyBpbnRvIGFwcHJvcHJpYXRlIHF1ZXVlcyB3ZSBuZWVkCisJICogdG8gc2V0IEluYm91bmQgRGV2aWNlIElEIHJlZ2lzdGVyIGluIHRoZSBtZXNzYWdpbmcgZW5naW5lLiBXZSBkbyBpdAorCSAqIG9uY2Ugd2hlbiBmaXJzdCBpbmJvdW5kIG1haWxib3ggaXMgcmVxdWVzdGVkLgorCSAqLworCWlmICghKHByaXYtPmZsYWdzICYgVFNJNzIxX0lNU0dJRF9TRVQpKSB7CisJCWlvd3JpdGUzMigodTMyKXByaXYtPm1wb3J0LT5ob3N0X2RldmljZWlkLAorCQkJcHJpdi0+cmVncyArIFRTSTcyMV9JQl9ERVZJRCk7CisJCXByaXYtPmZsYWdzIHw9IFRTSTcyMV9JTVNHSURfU0VUOworCX0KKworCS8qCisJICogQ29uZmlndXJlIEluYm91bmQgTWVzc2FnaW5nIGNoYW5uZWwgKGNoID0gbWJveCArIDQpCisJICovCisKKwkvKiBTZXR1cCBJbmJvdW5kIE1lc3NhZ2UgZnJlZSBxdWV1ZSAqLworCWlvd3JpdGUzMigoKHU2NClwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9waHlzID4+IDMyKSwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfRlFCSChjaCkpOworCWlvd3JpdGUzMigoKHU2NClwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9waHlzICYKKwkJCVRTSTcyMV9JQkRNQUNfRlFCTF9NQVNLKSwKKwkJcHJpdi0+cmVncytUU0k3MjFfSUJETUFDX0ZRQkwoY2gpKTsKKwlpb3dyaXRlMzIoVFNJNzIxX0RNQUNfRFNTWl9TSVpFKGVudHJpZXMpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19GUVNaKGNoKSk7CisKKwkvKiBTZXR1cCBJbmJvdW5kIE1lc3NhZ2UgZGVzY3JpcHRvciBxdWV1ZSAqLworCWlvd3JpdGUzMigoKHU2NClwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX3BoeXMgPj4gMzIpLAorCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19EUUJIKGNoKSk7CisJaW93cml0ZTMyKCgodTMyKXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfcGh5cyAmCisJCSAgICh1MzIpVFNJNzIxX0lCRE1BQ19EUUJMX01BU0spLAorCQlwcml2LT5yZWdzK1RTSTcyMV9JQkRNQUNfRFFCTChjaCkpOworCWlvd3JpdGUzMihUU0k3MjFfRE1BQ19EU1NaX1NJWkUoZW50cmllcyksCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0RRU1ooY2gpKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChwcml2LT5mbGFncyAmIFRTSTcyMV9VU0lOR19NU0lYKSB7CisJCS8qIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2UgaWYgd2UgYXJlIGluIE1TSS1YIG1vZGUgKi8KKwkJcmMgPSByZXF1ZXN0X2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgbWJveF0udmVjdG9yLAorCQkJdHNpNzIxX2ltc2dfbXNpeCwgMCwKKwkJCXByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9SQ1YgKyBtYm94XS5pcnFfbmFtZSwKKwkJCSh2b2lkICopbXBvcnQpOworCisJCWlmIChyYykgeworCQkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LAorCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgTVNJLVggaW50ZXJydXB0IGZvciAiCisJCQkJIklCT1glZC1ET05FXG4iLCBtYm94KTsKKwkJCWdvdG8gb3V0X2Rlc2M7CisJCX0KKworCQlyYyA9IHJlcXVlc3RfaXJxKHByaXYtPm1zaXhbVFNJNzIxX1ZFQ1RfSU1CMF9JTlQgKyBtYm94XS52ZWN0b3IsCisJCQl0c2k3MjFfaW1zZ19tc2l4LCAwLAorCQkJcHJpdi0+bXNpeFtUU0k3MjFfVkVDVF9JTUIwX0lOVCArIG1ib3hdLmlycV9uYW1lLAorCQkJKHZvaWQgKiltcG9ydCk7CisKKwkJaWYgKHJjKQl7CisJCQlkZXZfZGJnKCZwcml2LT5wZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHQgZm9yICIKKwkJCQkiSUJPWCVkLUlOVFxuIiwgbWJveCk7CisJCQlmcmVlX2lycSgKKwkJCQlwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgbWJveF0udmVjdG9yLAorCQkJCSh2b2lkICopbXBvcnQpOworCQkJZ290byBvdXRfZGVzYzsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCisJdHNpNzIxX2ltc2dfaW50ZXJydXB0X2VuYWJsZShwcml2LCBjaCwgVFNJNzIxX0lCRE1BQ19JTlRfQUxMKTsKKworCS8qIEluaXRpYWxpemUgSW5ib3VuZCBNZXNzYWdlIEVuZ2luZSAqLworCWlvd3JpdGUzMihUU0k3MjFfSUJETUFDX0NUTF9JTklULCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19DVEwoY2gpKTsKKwlpb3JlYWQzMihwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19DVEwoY2gpKTsKKwl1ZGVsYXkoMTApOworCXByaXYtPmltc2dfcmluZ1ttYm94XS5mcV93cnB0ciA9IGVudHJpZXMgLSAxOworCWlvd3JpdGUzMihlbnRyaWVzIC0gMSwgcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfRlFXUChjaCkpOworCisJcHJpdi0+aW1zZ19pbml0W21ib3hdID0gMTsKKwlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCitvdXRfZGVzYzoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2ltc2dfZGVzYyksCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfYmFzZSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9waHlzKTsKKworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWRfYmFzZSA9IE5VTEw7CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworb3V0X2RtYToKKwlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSAqIDgsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2UsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX3BoeXMpOworCisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZnFfYmFzZSA9IE5VTEw7CisKK291dF9idWY6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUgKiBUU0k3MjFfTVNHX0JVRkZFUl9TSVpFLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfcGh5cyk7CisKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UgPSBOVUxMOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHRzaTcyMV9jbG9zZV9pbmJfbWJveCAtIFNodXQgZG93biBUc2k3MjEgaW5ib3VuZCBtYWlsYm94CisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgSW5ib3VuZCBNZXNzYWdpbmcgRW5naW5lCisgKiBAbWJveDogTWFpbGJveCB0byBjbG9zZQorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfY2xvc2VfaW5iX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJdTMyIHJ4X3Nsb3Q7CisJaW50IGNoID0gbWJveCArIDQ7CisKKwlpZiAoIXByaXYtPmltc2dfaW5pdFttYm94XSkgLyogbWJveCBpc24ndCBpbml0aWFsaXplZCB5ZXQgKi8KKwkJcmV0dXJuOworCXByaXYtPmltc2dfaW5pdFttYm94XSA9IDA7CisKKwkvKiBEaXNhYmxlIEluYm91bmQgTWVzc2FnaW5nIEVuZ2luZSAqLworCisJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCisJdHNpNzIxX2ltc2dfaW50ZXJydXB0X2Rpc2FibGUocHJpdiwgY2gsIFRTSTcyMV9PQkRNQUNfSU5UX01BU0spOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAocHJpdi0+ZmxhZ3MgJiBUU0k3MjFfVVNJTkdfTVNJWCkgeworCQlmcmVlX2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfUkNWICsgbWJveF0udmVjdG9yLAorCQkJCSh2b2lkICopbXBvcnQpOworCQlmcmVlX2lycShwcml2LT5tc2l4W1RTSTcyMV9WRUNUX0lNQjBfSU5UICsgbWJveF0udmVjdG9yLAorCQkJCSh2b2lkICopbXBvcnQpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCisJLyogQ2xlYXIgSW5ib3VuZCBCdWZmZXIgUXVldWUgKi8KKwlmb3IgKHJ4X3Nsb3QgPSAwOyByeF9zbG90IDwgcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemU7IHJ4X3Nsb3QrKykKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltcV9iYXNlW3J4X3Nsb3RdID0gTlVMTDsKKworCS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbWVzc2FnZSBidWZmZXJzICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUgKiBUU0k3MjFfTVNHX0JVRkZFUl9TSVpFLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5idWZfcGh5cyk7CisKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UgPSBOVUxMOworCisJLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBmcmVlIHBvaW50ciBsaXN0ICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUgKiA4LAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9iYXNlLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1mcV9waHlzKTsKKworCXByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2UgPSBOVUxMOworCisJLyogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBSWCBkZXNjcmlwdG9ycyAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJCXByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfaW1zZ19kZXNjKSwKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9iYXNlLAorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1kX3BoeXMpOworCisJcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9iYXNlID0gTlVMTDsKK30KKworLyoqCisgKiB0c2k3MjFfYWRkX2luYl9idWZmZXIgLSBBZGQgYnVmZmVyIHRvIHRoZSBUc2k3MjEgaW5ib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgSW5ib3VuZCBNZXNzYWdpbmcgRW5naW5lCisgKiBAbWJveDogSW5ib3VuZCBtYWlsYm94IG51bWJlcgorICogQGJ1ZjogQnVmZmVyIHRvIGFkZCB0byBpbmJvdW5kIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgdHNpNzIxX2FkZF9pbmJfYnVmZmVyKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCwgdm9pZCAqYnVmKQoreworCXN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2ID0gbXBvcnQtPnByaXY7CisJdTMyIHJ4X3Nsb3Q7CisJaW50IHJjID0gMDsKKworCXJ4X3Nsb3QgPSBwcml2LT5pbXNnX3JpbmdbbWJveF0ucnhfc2xvdDsKKwlpZiAocHJpdi0+aW1zZ19yaW5nW21ib3hdLmltcV9iYXNlW3J4X3Nsb3RdKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJFcnJvciBhZGRpbmcgaW5ib3VuZCBidWZmZXIgJWQsIGJ1ZmZlciBleGlzdHNcbiIsCisJCQlyeF9zbG90KTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1xX2Jhc2Vbcnhfc2xvdF0gPSBidWY7CisKKwlpZiAoKytwcml2LT5pbXNnX3JpbmdbbWJveF0ucnhfc2xvdCA9PSBwcml2LT5pbXNnX3JpbmdbbWJveF0uc2l6ZSkKKwkJcHJpdi0+aW1zZ19yaW5nW21ib3hdLnJ4X3Nsb3QgPSAwOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHRzaTcyMV9nZXRfaW5iX21lc3NhZ2UgLSBGZXRjaCBpbmJvdW5kIG1lc3NhZ2UgZnJvbSB0aGUgVHNpNzIxIE1TRyBRdWV1ZQorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIEluYm91bmQgTWVzc2FnaW5nIEVuZ2luZQorICogQG1ib3g6IEluYm91bmQgbWFpbGJveCBudW1iZXIKKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2Ugb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyB2b2lkICp0c2k3MjFfZ2V0X2luYl9tZXNzYWdlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdiA9IG1wb3J0LT5wcml2OworCXN0cnVjdCB0c2k3MjFfaW1zZ19kZXNjICpkZXNjOworCXUzMiByeF9zbG90OworCXZvaWQgKnJ4X3ZpcnQgPSBOVUxMOworCXU2NCByeF9waHlzOworCXZvaWQgKmJ1ZiA9IE5VTEw7CisJdTY0ICpmcmVlX3B0cjsKKwlpbnQgY2ggPSBtYm94ICsgNDsKKwlpbnQgbXNnX3NpemU7CisKKwlpZiAoIXByaXYtPmltc2dfaW5pdFttYm94XSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXNjID0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltZF9iYXNlOworCWRlc2MgKz0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLmRlc2NfcmRwdHI7CisKKwlpZiAoIShsZTMyX3RvX2NwdShkZXNjLT5tc2dfaW5mbykgJiBUU0k3MjFfSU1EX0hPKSkKKwkJZ290byBvdXQ7CisKKwlyeF9zbG90ID0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLnJ4X3Nsb3Q7CisJd2hpbGUgKHByaXYtPmltc2dfcmluZ1ttYm94XS5pbXFfYmFzZVtyeF9zbG90XSA9PSBOVUxMKSB7CisJCWlmICgrK3J4X3Nsb3QgPT0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLnNpemUpCisJCQlyeF9zbG90ID0gMDsKKwl9CisKKwlyeF9waHlzID0gKCh1NjQpbGUzMl90b19jcHUoZGVzYy0+YnVmcHRyX2hpKSA8PCAzMikgfAorCQkJbGUzMl90b19jcHUoZGVzYy0+YnVmcHRyX2xvKTsKKworCXJ4X3ZpcnQgPSBwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX2Jhc2UgKworCQkgIChyeF9waHlzIC0gKHU2NClwcml2LT5pbXNnX3JpbmdbbWJveF0uYnVmX3BoeXMpOworCisJYnVmID0gcHJpdi0+aW1zZ19yaW5nW21ib3hdLmltcV9iYXNlW3J4X3Nsb3RdOworCW1zZ19zaXplID0gbGUzMl90b19jcHUoZGVzYy0+bXNnX2luZm8pICYgVFNJNzIxX0lNRF9CQ09VTlQ7CisJaWYgKG1zZ19zaXplID09IDApCisJCW1zZ19zaXplID0gUklPX01BWF9NU0dfU0laRTsKKworCW1lbWNweShidWYsIHJ4X3ZpcnQsIG1zZ19zaXplKTsKKwlwcml2LT5pbXNnX3JpbmdbbWJveF0uaW1xX2Jhc2Vbcnhfc2xvdF0gPSBOVUxMOworCisJZGVzYy0+bXNnX2luZm8gJj0gY3B1X3RvX2xlMzIoflRTSTcyMV9JTURfSE8pOworCWlmICgrK3ByaXYtPmltc2dfcmluZ1ttYm94XS5kZXNjX3JkcHRyID09IHByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplKQorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uZGVzY19yZHB0ciA9IDA7CisKKwlpb3dyaXRlMzIocHJpdi0+aW1zZ19yaW5nW21ib3hdLmRlc2NfcmRwdHIsCisJCXByaXYtPnJlZ3MgKyBUU0k3MjFfSUJETUFDX0RRUlAoY2gpKTsKKworCS8qIFJldHVybiBmcmVlIGJ1ZmZlciBpbnRvIHRoZSBwb2ludGVyIGxpc3QgKi8KKwlmcmVlX3B0ciA9IHByaXYtPmltc2dfcmluZ1ttYm94XS5pbWZxX2Jhc2U7CisJZnJlZV9wdHJbcHJpdi0+aW1zZ19yaW5nW21ib3hdLmZxX3dycHRyXSA9IGNwdV90b19sZTY0KHJ4X3BoeXMpOworCisJaWYgKCsrcHJpdi0+aW1zZ19yaW5nW21ib3hdLmZxX3dycHRyID09IHByaXYtPmltc2dfcmluZ1ttYm94XS5zaXplKQorCQlwcml2LT5pbXNnX3JpbmdbbWJveF0uZnFfd3JwdHIgPSAwOworCisJaW93cml0ZTMyKHByaXYtPmltc2dfcmluZ1ttYm94XS5mcV93cnB0ciwKKwkJcHJpdi0+cmVncyArIFRTSTcyMV9JQkRNQUNfRlFXUChjaCkpOworb3V0OgorCXJldHVybiBidWY7Cit9CisKKy8qKgorICogdHNpNzIxX21lc3NhZ2VzX2luaXQgLSBJbml0aWFsaXphdGlvbiBvZiBNZXNzYWdpbmcgRW5naW5lCisgKiBAcHJpdjogcG9pbnRlciB0byB0c2k3MjEgcHJpdmF0ZSBkYXRhCisgKgorICogQ29uZmlndXJlcyBUc2k3MjEgbWVzc2FnaW5nIGVuZ2luZS4KKyAqLworc3RhdGljIGludCB0c2k3MjFfbWVzc2FnZXNfaW5pdChzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdikKK3sKKwlpbnQJY2g7CisKKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9TTVNHX0VDQ19MT0cpOworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1JFVFJZX0dFTl9DTlQpOworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1JFVFJZX1JYX0NOVCk7CisKKwkvKiBTZXQgU1JJTyBNZXNzYWdlIFJlcXVlc3QvUmVzcG9uc2UgVGltZW91dCAqLworCWlvd3JpdGUzMihUU0k3MjFfUlFSUFRPX1ZBTCwgcHJpdi0+cmVncyArIFRTSTcyMV9SUVJQVE8pOworCisJLyogSW5pdGlhbGl6ZSBJbmJvdW5kIE1lc3NhZ2luZyBFbmdpbmUgUmVnaXN0ZXJzICovCisJZm9yIChjaCA9IDA7IGNoIDwgVFNJNzIxX0lNU0dfQ0hOVU07IGNoKyspIHsKKwkJLyogQ2xlYXIgaW50ZXJydXB0IGJpdHMgKi8KKwkJaW93cml0ZTMyKFRTSTcyMV9JQkRNQUNfSU5UX01BU0ssCisJCQlwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlQoY2gpKTsKKwkJLyogQ2xlYXIgU3RhdHVzICovCisJCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19TVFMoY2gpKTsKKworCQlpb3dyaXRlMzIoVFNJNzIxX1NNU0dfRUNDX0NPUl9MT0dfTUFTSywKKwkJCQlwcml2LT5yZWdzICsgVFNJNzIxX1NNU0dfRUNDX0NPUl9MT0coY2gpKTsKKwkJaW93cml0ZTMyKFRTSTcyMV9TTVNHX0VDQ19OQ09SX01BU0ssCisJCQkJcHJpdi0+cmVncyArIFRTSTcyMV9TTVNHX0VDQ19OQ09SKGNoKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdHNpNzIxX2Rpc2FibGVfaW50cyAtIGRpc2FibGVzIGFsbCBkZXZpY2UgaW50ZXJydXB0cworICogQHByaXY6IHBvaW50ZXIgdG8gdHNpNzIxIHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgdm9pZCB0c2k3MjFfZGlzYWJsZV9pbnRzKHN0cnVjdCB0c2k3MjFfZGV2aWNlICpwcml2KQoreworCWludCBjaDsKKworCS8qIERpc2FibGUgYWxsIGRldmljZSBsZXZlbCBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWX0lOVEUpOworCisJLyogRGlzYWJsZSBhbGwgRGV2aWNlIENoYW5uZWwgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0RFVl9DSEFOX0lOVEUpOworCisJLyogRGlzYWJsZSBhbGwgSW5ib3VuZCBNc2cgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJZm9yIChjaCA9IDA7IGNoIDwgVFNJNzIxX0lNU0dfQ0hOVU07IGNoKyspCisJCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0lCRE1BQ19JTlRFKGNoKSk7CisKKwkvKiBEaXNhYmxlIGFsbCBPdXRib3VuZCBNc2cgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJZm9yIChjaCA9IDA7IGNoIDwgVFNJNzIxX09NU0dfQ0hOVU07IGNoKyspCisJCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX09CRE1BQ19JTlRFKGNoKSk7CisKKwkvKiBEaXNhYmxlIGFsbCBnZW5lcmFsIG1lc3NhZ2luZyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfU01TR19JTlRFKTsKKworCS8qIERpc2FibGUgYWxsIEJETUEgQ2hhbm5lbCBpbnRlcnJ1cHRzICovCisJZm9yIChjaCA9IDA7IGNoIDwgVFNJNzIxX0RNQV9NQVhDSDsgY2grKykKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfRE1BQ19JTlRFKGNoKSk7CisKKwkvKiBEaXNhYmxlIGFsbCBnZW5lcmFsIEJETUEgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX0JETUFfSU5URSk7CisKKwkvKiBEaXNhYmxlIGFsbCBTUklPIENoYW5uZWwgaW50ZXJydXB0cyAqLworCWZvciAoY2ggPSAwOyBjaCA8IFRTSTcyMV9TUklPX01BWENIOyBjaCsrKQorCQlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9TUl9DSElOVEUoY2gpKTsKKworCS8qIERpc2FibGUgYWxsIGdlbmVyYWwgU1IyUEMgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1NSMlBDX0dFTl9JTlRFKTsKKworCS8qIERpc2FibGUgYWxsIFBDMlNSIGludGVycnVwdHMgKi8KKwlpb3dyaXRlMzIoMCwgcHJpdi0+cmVncyArIFRTSTcyMV9QQzJTUl9JTlRFKTsKKworCS8qIERpc2FibGUgYWxsIEkyQyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfSTJDX0lOVF9FTkFCTEUpOworCisJLyogRGlzYWJsZSBTUklPIE1BQyBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyBUU0k3MjFfUklPX0VNX0lOVF9FTkFCTEUpOworCWlvd3JpdGUzMigwLCBwcml2LT5yZWdzICsgVFNJNzIxX1JJT19FTV9ERVZfSU5UX0VOKTsKK30KKworLyoqCisgKiB0c2k3MjFfc2V0dXBfbXBvcnQgLSBTZXR1cCBUc2k3MjEgYXMgUmFwaWRJTyBzdWJzeXN0ZW0gbWFzdGVyIHBvcnQKKyAqIEBwcml2OiBwb2ludGVyIHRvIHRzaTcyMSBwcml2YXRlIGRhdGEKKyAqCisgKiBDb25maWd1cmVzIFRzaTcyMSBhcyBSYXBpZElPIG1hc3RlciBwb3J0LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0c2k3MjFfc2V0dXBfbXBvcnQoc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5wZGV2OworCWludCBlcnIgPSAwOworCXN0cnVjdCByaW9fb3BzICpvcHM7CisKKwlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydDsKKworCW9wcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByaW9fb3BzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHMpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmlvX29wc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9wcy0+bGNyZWFkID0gdHNpNzIxX2xjcmVhZDsKKwlvcHMtPmxjd3JpdGUgPSB0c2k3MjFfbGN3cml0ZTsKKwlvcHMtPmNyZWFkID0gdHNpNzIxX2NyZWFkX2RtYTsKKwlvcHMtPmN3cml0ZSA9IHRzaTcyMV9jd3JpdGVfZG1hOworCW9wcy0+ZHNlbmQgPSB0c2k3MjFfZHNlbmQ7CisJb3BzLT5vcGVuX2luYl9tYm94ID0gdHNpNzIxX29wZW5faW5iX21ib3g7CisJb3BzLT5jbG9zZV9pbmJfbWJveCA9IHRzaTcyMV9jbG9zZV9pbmJfbWJveDsKKwlvcHMtPm9wZW5fb3V0Yl9tYm94ID0gdHNpNzIxX29wZW5fb3V0Yl9tYm94OworCW9wcy0+Y2xvc2Vfb3V0Yl9tYm94ID0gdHNpNzIxX2Nsb3NlX291dGJfbWJveDsKKwlvcHMtPmFkZF9vdXRiX21lc3NhZ2UgPSB0c2k3MjFfYWRkX291dGJfbWVzc2FnZTsKKwlvcHMtPmFkZF9pbmJfYnVmZmVyID0gdHNpNzIxX2FkZF9pbmJfYnVmZmVyOworCW9wcy0+Z2V0X2luYl9tZXNzYWdlID0gdHNpNzIxX2dldF9pbmJfbWVzc2FnZTsKKworCW1wb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJpb19tcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghbXBvcnQpIHsKKwkJa2ZyZWUob3BzKTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbXBvcnRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltcG9ydC0+b3BzID0gb3BzOworCW1wb3J0LT5pbmRleCA9IDA7CisJbXBvcnQtPnN5c19zaXplID0gMDsgLyogc21hbGwgc3lzdGVtICovCisJbXBvcnQtPnBoeV90eXBlID0gUklPX1BIWV9TRVJJQUw7CisJbXBvcnQtPnByaXYgPSAodm9pZCAqKXByaXY7CisJbXBvcnQtPnBoeXNfZWZwdHIgPSAweDEwMDsKKworCUlOSVRfTElTVF9IRUFEKCZtcG9ydC0+ZGJlbGxzKTsKKworCXJpb19pbml0X2RiZWxsX3JlcygmbXBvcnQtPnJpb3Jlc1tSSU9fRE9PUkJFTExfUkVTT1VSQ0VdLCAwLCAweGZmZmYpOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19JTkJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19PVVRCX01CT1hfUkVTT1VSQ0VdLCAwLCAwKTsKKwlzdHJjcHkobXBvcnQtPm5hbWUsICJUc2k3MjEgbXBvcnQiKTsKKworCS8qIEhvb2sgdXAgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKCF0c2k3MjFfZW5hYmxlX21zaXgocHJpdikpCisJCXByaXYtPmZsYWdzIHw9IFRTSTcyMV9VU0lOR19NU0lYOworCWVsc2UgaWYgKCFwY2lfZW5hYmxlX21zaShwZGV2KSkKKwkJcHJpdi0+ZmxhZ3MgfD0gVFNJNzIxX1VTSU5HX01TSTsKKwllbHNlCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIk1TSS9NU0ktWCBpcyBub3QgYXZhaWxhYmxlLiBVc2luZyBsZWdhY3kgSU5UeC5cbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKKwllcnIgPSB0c2k3MjFfcmVxdWVzdF9pcnEobXBvcnQpOworCisJaWYgKCFlcnIpIHsKKwkJdHNpNzIxX2ludGVycnVwdHNfaW5pdChwcml2KTsKKwkJb3BzLT5wd2VuYWJsZSA9IHRzaTcyMV9wd19lbmFibGU7CisJfSBlbHNlCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgYXNzaWduZWQgUENJIElSUSAiCisJCQkidmVjdG9yICUwMlggZXJyPTB4JXhcbiIsIHBkZXYtPmlycSwgZXJyKTsKKworCS8qIEVuYWJsZSBTUklPIGxpbmsgKi8KKwlpb3dyaXRlMzIoaW9yZWFkMzIocHJpdi0+cmVncyArIFRTSTcyMV9ERVZDVEwpIHwKKwkJICBUU0k3MjFfREVWQ1RMX1NSQk9PVF9DTVBMLAorCQkgIHByaXYtPnJlZ3MgKyBUU0k3MjFfREVWQ1RMKTsKKworCXJpb19yZWdpc3Rlcl9tcG9ydChtcG9ydCk7CisJcHJpdi0+bXBvcnQgPSBtcG9ydDsKKworCWlmIChtcG9ydC0+aG9zdF9kZXZpY2VpZCA+PSAwKQorCQlpb3dyaXRlMzIoUklPX1BPUlRfR0VOX0hPU1QgfCBSSU9fUE9SVF9HRU5fTUFTVEVSIHwKKwkJCSAgUklPX1BPUlRfR0VOX0RJU0NPVkVSRUQsCisJCQkgIHByaXYtPnJlZ3MgKyAoMHgxMDAgKyBSSU9fUE9SVF9HRU5fQ1RMX0NTUikpOworCWVsc2UKKwkJaW93cml0ZTMyKDAsIHByaXYtPnJlZ3MgKyAoMHgxMDAgKyBSSU9fUE9SVF9HRU5fQ1RMX0NTUikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRzaTcyMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdHNpNzIxX2RldmljZSAqcHJpdjsKKwlpbnQgaTsKKwlpbnQgZXJyOworCXUzMiByZWd2YWw7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRzaTcyMV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2V4aXQ7CisJfQorCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9jbGVhbjsKKwl9CisKKwlwcml2LT5wZGV2ID0gcGRldjsKKworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfU1REX1JFU09VUkNFX0VORDsgaSsrKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInJlc1slZF0gQCAweCVsbHggKDB4JWx4LCAweCVseClcbiIsCisJCQlpLCAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKSwKKwkJCSh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSksCisJCQlwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkpOworCX0KKyNlbmRpZgorCS8qCisJICogVmVyaWZ5IEJBUiBjb25maWd1cmF0aW9uCisJICovCisKKwkvKiBCQVJfMCAocmVnaXN0ZXJzKSBtdXN0IGJlIDUxMktCKyBpbiAzMi1iaXQgYWRkcmVzcyBzcGFjZSAqLworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBCQVJfMCkgJiBJT1JFU09VUkNFX01FTSkgfHwKKwkgICAgcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl8wKSAmIElPUkVTT1VSQ0VfTUVNXzY0IHx8CisJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQkFSXzApIDwgVFNJNzIxX1JFR19TUEFDRV9TSVpFKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJNaXNzaW5nIG9yIG1pc2NvbmZpZ3VyZWQgQ1NSIEJBUjAsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rpc2FibGVfcGRldjsKKwl9CisKKwkvKiBCQVJfMSAob3V0Ym91bmQgZG9vcmJlbGxzKSBtdXN0IGJlIDE2TUIrIGluIDMyLWJpdCBhZGRyZXNzIHNwYWNlICovCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl8xKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAorCSAgICBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgQkFSXzEpICYgSU9SRVNPVVJDRV9NRU1fNjQgfHwKKwkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBCQVJfMSkgPCBUU0k3MjFfREJfV0lOX1NJWkUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIk1pc3Npbmcgb3IgbWlzY29uZmlndXJlZCBEb29yYmVsbCBCQVIxLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CisJfQorCisJLyoKKwkgKiBCQVJfMiBhbmQgQkFSXzQgKG91dGJvdW5kIHRyYW5zbGF0aW9uKSBtdXN0IGJlIGluIDY0LWJpdCBQQ0llIGFkZHJlc3MKKwkgKiBzcGFjZS4KKwkgKiBOT1RFOiBCQVJfMiBhbmQgQkFSXzQgYXJlIG5vdCB1c2VkIGJ5IHRoaXMgdmVyc2lvbiBvZiBkcml2ZXIuCisJICogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGtlZXAgdGhlbSBkaXNhYmxlZCB1c2luZyBIVyBjb25maWd1cmF0aW9uCisJICogdG8gc2F2ZSBQQ0kgbWVtb3J5IHNwYWNlLgorCSAqLworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl8yKSAmIElPUkVTT1VSQ0VfTUVNKSAmJgorCSAgICAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl8yKSAmIElPUkVTT1VSQ0VfTUVNXzY0KSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiT3V0Ym91bmQgQkFSMiBpcyBub3QgdXNlZCBidXQgZW5hYmxlZC5cbiIpOworCX0KKworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl80KSAmIElPUkVTT1VSQ0VfTUVNKSAmJgorCSAgICAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIEJBUl80KSAmIElPUkVTT1VSQ0VfTUVNXzY0KSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiT3V0Ym91bmQgQkFSNCBpcyBub3QgdXNlZCBidXQgZW5hYmxlZC5cbiIpOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCQkiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZV9wZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcHJpdi0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCBCQVJfMCk7CisJaWYgKCFwcml2LT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJVbmFibGUgdG8gbWFwIGRldmljZSByZWdpc3RlcnMgc3BhY2UsIGFib3J0aW5nXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZXM7CisJfQorCisJcHJpdi0+b2RiX2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSXzEpOworCWlmICghcHJpdi0+b2RiX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlVuYWJsZSB0byBtYXAgb3V0Ym91bmQgZG9vcmJlbGxzIHNwYWNlLCBhYm9ydGluZ1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwX2JhcnM7CisJfQorCisJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHNldCBETUEgbWFza1xuIik7CisJCQlnb3RvIGVycl91bm1hcF9iYXJzOworCQl9CisKKwkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IGNvbnNpc3RlbnQgRE1BIG1hc2tcbiIpOworCX0gZWxzZSB7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwkJaWYgKGVycikKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IGNvbnNpc3RlbnQgRE1BIG1hc2tcbiIpOworCX0KKworCS8qIENsZWFyICJubyBzbm9vcCIgYW5kICJyZWxheGVkIG9yZGVyaW5nIiBiaXRzLiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwICsgUENJX0VYUF9ERVZDVEwsICZyZWd2YWwpOworCXJlZ3ZhbCAmPSB+KFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIHwgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwICsgUENJX0VYUF9ERVZDVEwsIHJlZ3ZhbCk7CisKKwkvKgorCSAqIEZJWFVQOiBjb3JyZWN0IG9mZnNldHMgb2YgTVNJLVggdGFibGVzIGluIHRoZSBNU0ktWCBDYXBhYmlsaXR5IEJsb2NrCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBUU0k3MjFfUENJRUNGR19FUENUTCwgMHgwMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBUU0k3MjFfUENJRUNGR19NU0lYVEJMLAorCQkJCQkJVFNJNzIxX01TSVhUQkxfT0ZGU0VUKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFRTSTcyMV9QQ0lFQ0ZHX01TSVhQQkEsCisJCQkJCQlUU0k3MjFfTVNJWFBCQV9PRkZTRVQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgVFNJNzIxX1BDSUVDRkdfRVBDVEwsIDApOworCS8qIEVuZCBvZiBGSVhVUCAqLworCisJdHNpNzIxX2Rpc2FibGVfaW50cyhwcml2KTsKKworCXRzaTcyMV9pbml0X3BjMnNyX21hcHBpbmcocHJpdik7CisJdHNpNzIxX2luaXRfc3IycGNfbWFwcGluZyhwcml2KTsKKworCWlmICh0c2k3MjFfYmRtYV9pbml0KHByaXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkJETUEgaW5pdGlhbGl6YXRpb24gZmFpbGVkLCBhYm9ydGluZ1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwX2JhcnM7CisJfQorCisJZXJyID0gdHNpNzIxX2Rvb3JiZWxsX2luaXQocHJpdik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9iZG1hOworCisJdHNpNzIxX3BvcnRfd3JpdGVfaW5pdChwcml2KTsKKworCWVyciA9IHRzaTcyMV9tZXNzYWdlc19pbml0KHByaXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfY29uc2lzdGVudDsKKworCWVyciA9IHRzaTcyMV9zZXR1cF9tcG9ydChwcml2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2NvbnNpc3RlbnQ7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfY29uc2lzdGVudDoKKwl0c2k3MjFfZG9vcmJlbGxfZnJlZShwcml2KTsKK2Vycl9mcmVlX2JkbWE6CisJdHNpNzIxX2JkbWFfZnJlZShwcml2KTsKK2Vycl91bm1hcF9iYXJzOgorCWlmIChwcml2LT5yZWdzKQorCQlpb3VubWFwKHByaXYtPnJlZ3MpOworCWlmIChwcml2LT5vZGJfYmFzZSkKKwkJaW91bm1hcChwcml2LT5vZGJfYmFzZSk7CitlcnJfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfY2xlYXJfbWFzdGVyKHBkZXYpOworZXJyX2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfY2xlYW46CisJa2ZyZWUocHJpdik7CitlcnJfZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUodHNpNzIxX3BjaV90YmwpID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lEVCwgUENJX0RFVklDRV9JRF9UU0k3MjEpIH0sCisJeyAwLCB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHNpNzIxX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHNpNzIxX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidHNpNzIxIiwKKwkuaWRfdGFibGUJPSB0c2k3MjFfcGNpX3RibCwKKwkucHJvYmUJCT0gdHNpNzIxX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHNpNzIxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdHNpNzIxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0c2k3MjFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHNpNzIxX2RyaXZlcik7Cit9CisKK2RldmljZV9pbml0Y2FsbCh0c2k3MjFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuaCBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmU0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuaApAQCAtMCwwICsxLDc2NiBAQAorLyoKKyAqIFRzaTcyMSBQQ0lFeHByZXNzLXRvLVNSSU8gYnJpZGdlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTEsIEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fVFNJNzIxX0gKKyNkZWZpbmUgX19UU0k3MjFfSAorCisjZGVmaW5lIERSVl9OQU1FCSJ0c2k3MjEiCisKKyNkZWZpbmUgREVGQVVMVF9IT1BDT1VOVAkweGZmCisjZGVmaW5lIERFRkFVTFRfREVTVElECQkweGZmCisKKy8qIFBDSSBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UU0k3MjEJCTB4ODBhYgorCisjZGVmaW5lIEJBUl8wCTAKKyNkZWZpbmUgQkFSXzEJMQorI2RlZmluZSBCQVJfMgkyCisjZGVmaW5lIEJBUl80CTQKKworI2RlZmluZSBUU0k3MjFfUEMyU1JfQkFSUwkyCisjZGVmaW5lIFRTSTcyMV9QQzJTUl9XSU5TCTgKKyNkZWZpbmUgVFNJNzIxX1BDMlNSX1pPTkVTCTgKKyNkZWZpbmUgVFNJNzIxX01BSU5UX1dJTgkwIC8qIFdpbmRvdyBmb3Igb3V0Ym91bmQgbWFpbnRlbmFuY2UgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSURCX1FVRVVFCQkwIC8qIEluYm91bmQgRG9vcmJlbGwgUXVldWUgdG8gdXNlICovCisjZGVmaW5lIElEQl9RU0laRQkJNTEyIC8qIEluYm91bmQgRG9vcmJlbGwgUXVldWUgc2l6ZSAqLworCisvKiBNZW1vcnkgc3BhY2Ugc2l6ZXMgKi8KKyNkZWZpbmUgVFNJNzIxX1JFR19TUEFDRV9TSVpFCQkoNTEyICogMTAyNCkgLyogNTEySyAqLworI2RlZmluZSBUU0k3MjFfREJfV0lOX1NJWkUJCSgxNiAqIDEwMjQgKiAxMDI0KSAvKiAxNk1CICovCisKKyNkZWZpbmUgIFJJT19UVF9DT0RFXzgJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFJJT19UVF9DT0RFXzE2CQkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX0RNQV9NQVhDSAk4CisjZGVmaW5lIFRTSTcyMV9ETUFfTUlOU1RTU1oJMzIKKyNkZWZpbmUgVFNJNzIxX0RNQV9TVFNCTEtTWgk4CisKKyNkZWZpbmUgVFNJNzIxX1NSSU9fTUFYQ0gJOAorCisjZGVmaW5lIERCRUxMX1NJRChidWYpCQkoKCh1OClidWZbMl0gPDwgOCkgfCAodTgpYnVmWzNdKQorI2RlZmluZSBEQkVMTF9USUQoYnVmKQkJKCgodTgpYnVmWzRdIDw8IDgpIHwgKHU4KWJ1Zls1XSkKKyNkZWZpbmUgREJFTExfSU5GKGJ1ZikJCSgoKHU4KWJ1ZlswXSA8PCA4KSB8ICh1OClidWZbMV0pCisKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19NU0dfU0laRQkxNiAgLyogVHNpNzIxIHNhdmVzIG9ubHkgMTYgYnl0ZXMgb2YgUFcgbXNnICovCisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKy8qCisgKiBSZWdpc3RlcnMgaW4gUENJZSBjb25maWd1cmF0aW9uIHNwYWNlCisgKi8KKworI2RlZmluZSBUU0k3MjFfUENJRUNGR19NU0lYVEJMCTB4MGE0CisjZGVmaW5lIFRTSTcyMV9NU0lYVEJMX09GRlNFVAkweDJjMDAwCisjZGVmaW5lIFRTSTcyMV9QQ0lFQ0ZHX01TSVhQQkEJMHgwYTgKKyNkZWZpbmUgVFNJNzIxX01TSVhQQkFfT0ZGU0VUCTB4MmEwMDAKKyNkZWZpbmUgVFNJNzIxX1BDSUVDRkdfRVBDVEwJMHg0MDAKKworLyoKKyAqIEV2ZW50IE1hbmFnZW1lbnQgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBUU0k3MjFfUklPX0VNX0lOVF9TVEFUCQkweDEwOTEwCisjZGVmaW5lIFRTSTcyMV9SSU9fRU1fSU5UX1NUQVRfUFdfUlgJMHgwMDAxMDAwMAorCisjZGVmaW5lIFRTSTcyMV9SSU9fRU1fSU5UX0VOQUJMRQkweDEwOTE0CisjZGVmaW5lIFRTSTcyMV9SSU9fRU1fSU5UX0VOQUJMRV9QV19SWAkweDAwMDEwMDAwCisKKyNkZWZpbmUgVFNJNzIxX1JJT19FTV9ERVZfSU5UX0VOCTB4MTA5MzAKKyNkZWZpbmUgVFNJNzIxX1JJT19FTV9ERVZfSU5UX0VOX0lOVAkweDAwMDAwMDAxCisKKy8qCisgKiBQb3J0LVdyaXRlIEJsb2NrIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19DVEwJCTB4MTBhMDQKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19DVExfUFdfVElNRVIJMHhmMDAwMDAwMAorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV1RfRElTCSgwIDw8IDI4KQorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV1RfMTAzCSgxIDw8IDI4KQorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV1RfMjA1CSgxIDw8IDI5KQorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV1RfNDEwCSgxIDw8IDMwKQorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV1RfODIwCSgxIDw8IDMxKQorI2RlZmluZSBUU0k3MjFfUklPX1BXX0NUTF9QV0NfTU9ERQkweDAxMDAwMDAwCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfQ1RMX1BXQ19DT05UCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19DVExfUFdDX1JFTAkweDAxMDAwMDAwCisKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19SWF9TVEFUCQkweDEwYTEwCisjZGVmaW5lIFRTSTcyMV9SSU9fUFdfUlhfU1RBVF9XUl9TSVpFCTB4MDAwMGYwMDAKKyNkZWZpbmUgVFNJX1JJT19QV19SWF9TVEFUX1dEUFRSCTB4MDAwMDAxMDAKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX1NIT1JUCTB4MDAwMDAwMDgKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX1RSVU5DCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFNJNzIxX1JJT19QV19SWF9TVEFUX1BXX0RJU0MJMHgwMDAwMDAwMgorI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX1NUQVRfUFdfVkFMCTB4MDAwMDAwMDEKKworI2RlZmluZSBUU0k3MjFfUklPX1BXX1JYX0NBUFQoeCkJKDB4MTBhMjAgKyAoeCkqNCkKKworLyoKKyAqIEluYm91bmQgRG9vcmJlbGxzCisgKi8KKworI2RlZmluZSBUU0k3MjFfSURCX0VOVFJZX1NJWkUJNjQKKworI2RlZmluZSBUU0k3MjFfSURRX0NUTCh4KQkoMHgyMDAwMCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfU1VTUEVORAkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9JRFFfSU5JVAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRTSTcyMV9JRFFfU1RTKHgpCSgweDIwMDA0ICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lEUV9SVU4JCTB4MDAyMDAwMDAKKworI2RlZmluZSBUU0k3MjFfSURRX01BU0soeCkJKDB4MjAwMDggKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX01BU0tfTUFTSwkweGZmZmYwMDAwCisjZGVmaW5lIFRTSTcyMV9JRFFfTUFTS19QQVRUCTB4MDAwMGZmZmYKKworI2RlZmluZSBUU0k3MjFfSURRX1JQKHgpCSgweDIwMDBjICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lEUV9SUF9QVFIJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JRFFfV1AoeCkJKDB4MjAwMTAgKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX1dQX1BUUgkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lEUV9CQVNFTCh4KQkoMHgyMDAxNCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9JRFFfQkFTRUxfQUREUgkweGZmZmZmZmMwCisjZGVmaW5lIFRTSTcyMV9JRFFfQkFTRVUoeCkJKDB4MjAwMTggKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX1NJWkUoeCkJKDB4MjAwMWMgKyAoeCkgKiAxMDAwKQorI2RlZmluZSBUU0k3MjFfSURRX1NJWkVfVkFMKHNpemUpCShfX2ZscyhzaXplKSAtIDQpCisjZGVmaW5lIFRTSTcyMV9JRFFfU0laRV9NSU4JNTEyCisjZGVmaW5lIFRTSTcyMV9JRFFfU0laRV9NQVgJKDUxMiAqIDEwMjQpCisKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UKHgpCSgweDIwMDQwICsgKHgpICogMTAwMCkKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5URSh4KQkoMHgyMDA0NCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVFNFVCh4KQkoMHgyMDA0OCArICh4KSAqIDEwMDApCisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9PREJPSwkweDAwMDAwMDIwCisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9JREJRUkNWCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFNJNzIxX1NSX0NISU5UX1NVU1AJMHgwMDAwMDAwOAorI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlRfT0RCVE8JMHgwMDAwMDAwNAorI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlRfT0RCUlRSWQkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9TUl9DSElOVF9PREJFUlIJMHgwMDAwMDAwMQorI2RlZmluZSBUU0k3MjFfU1JfQ0hJTlRfQUxMCTB4MDAwMDAwM2YKKworI2RlZmluZSBUU0k3MjFfSUJXSU5fTlVNCTgKKworI2RlZmluZSBUU0k3MjFfSUJXSU5MQih4KQkoMHgyOTAwMCArICh4KSAqIDIwKQorI2RlZmluZSBUU0k3MjFfSUJXSU5MQl9CQQkweGZmZmZmMDAwCisjZGVmaW5lIFRTSTcyMV9JQldJTkxCX1dFTgkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX1NSMlBDX0dFTl9JTlRFCTB4Mjk4MDAKKyNkZWZpbmUgVFNJNzIxX1NSMlBDX1BXRQkweDI5ODA0CisjZGVmaW5lIFRTSTcyMV9TUjJQQ19HRU5fSU5UCTB4Mjk4MDgKKworI2RlZmluZSBUU0k3MjFfREVWX0lOVEUJCTB4Mjk4NDAKKyNkZWZpbmUgVFNJNzIxX0RFVl9JTlQJCTB4Mjk4NDQKKyNkZWZpbmUgVFNJNzIxX0RFVl9JTlRTRVQJMHgyOTg0OAorI2RlZmluZSBUU0k3MjFfREVWX0lOVF9TTVNHX0NICTB4MDAwMDA4MDAKKyNkZWZpbmUgVFNJNzIxX0RFVl9JTlRfU01TR19OQ0gJMHgwMDAwMDQwMAorI2RlZmluZSBUU0k3MjFfREVWX0lOVF9TUjJQQ19DSAkweDAwMDAwMjAwCisjZGVmaW5lIFRTSTcyMV9ERVZfSU5UX1NSSU8JMHgwMDAwMDAyMAorCisjZGVmaW5lIFRTSTcyMV9ERVZfQ0hBTl9JTlRFCTB4Mjk4NGMKKyNkZWZpbmUgVFNJNzIxX0RFVl9DSEFOX0lOVAkweDI5ODUwCisKKyNkZWZpbmUgVFNJNzIxX0lOVF9TUjJQQ19DSEFOX00JMHhmZjAwMDAwMAorI2RlZmluZSBUU0k3MjFfSU5UX1NSMlBDX0NIQU4oeCkgKDEgPDwgKDI0ICsgKHgpKSkKKyNkZWZpbmUgVFNJNzIxX0lOVF9JTVNHX0NIQU5fTQkweDAwZmYwMDAwCisjZGVmaW5lIFRTSTcyMV9JTlRfSU1TR19DSEFOKHgpCSgxIDw8ICgxNiArICh4KSkpCisjZGVmaW5lIFRTSTcyMV9JTlRfT01TR19DSEFOX00JMHgwMDAwZmYwMAorI2RlZmluZSBUU0k3MjFfSU5UX09NU0dfQ0hBTih4KQkoMSA8PCAoOCArICh4KSkpCisKKy8qCisgKiBQQzJTUiBibG9jayByZWdpc3RlcnMKKyAqLworI2RlZmluZSBUU0k3MjFfT0JXSU5fTlVNCVRTSTcyMV9QQzJTUl9XSU5TCisKKyNkZWZpbmUgVFNJNzIxX09CV0lOTEIoeCkJKDB4NDAwMDAgKyAoeCkgKiAyMCkKKyNkZWZpbmUgVFNJNzIxX09CV0lOTEJfQkEJMHhmZmZmODAwMAorI2RlZmluZSBUU0k3MjFfT0JXSU5MQl9XRU4JMHgwMDAwMDAwMQorCisjZGVmaW5lIFRTSTcyMV9PQldJTlVCKHgpCSgweDQwMDA0ICsgKHgpICogMjApCisKKyNkZWZpbmUgVFNJNzIxX09CV0lOU1ooeCkJKDB4NDAwMDggKyAoeCkgKiAyMCkKKyNkZWZpbmUgVFNJNzIxX09CV0lOU1pfU0laRQkweDAwMDAxZjAwCisjZGVmaW5lIFRTSTcyMV9PQldJTl9TSVpFKHNpemUpCShfX2ZscyhzaXplKSAtIDE1KQorCisjZGVmaW5lIFRTSTcyMV9aT05FX1NFTAkJMHg0MTMwMAorI2RlZmluZSBUU0k3MjFfWk9ORV9TRUxfUkRfV1JCCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFNJNzIxX1pPTkVfU0VMX0dPCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFNJNzIxX1pPTkVfU0VMX1dJTgkweDAwMDAwMDM4CisjZGVmaW5lIFRTSTcyMV9aT05FX1NFTF9aT05FCTB4MDAwMDAwMDcKKworI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwCTB4NDEzMDQKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9BREQJMHhmZmZmZjAwMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX1JEVFlQRQkweDAwMDAwZjAwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfTlJFQUQJMHgwMDAwMDEwMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX01OVFJECTB4MDAwMDAyMDAKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9SRENSRgkweDAwMDAwMDIwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfV1JDUkYJMHgwMDAwMDAxMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEwX1dSVFlQRQkweDAwMDAwMDBmCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfTldSCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMF9NTlRXUgkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTBfTldSX1IJMHgwMDAwMDAwNAorCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTEJMHg0MTMwOAorCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTIJMHg0MTMwYworI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEyX0hDCTB4ZmYwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX0xVVF9EQVRBMl9BREQ2NQkweDAwMGMwMDAwCisjZGVmaW5lIFRTSTcyMV9MVVRfREFUQTJfVFQJMHgwMDAzMDAwMAorI2RlZmluZSBUU0k3MjFfTFVUX0RBVEEyX0RTVElECTB4MDAwMGZmZmYKKworI2RlZmluZSBUU0k3MjFfUEMyU1JfSU5URQkweDQxMzEwCisKKyNkZWZpbmUgVFNJNzIxX0RFVkNUTAkJMHg0ODAwNAorI2RlZmluZSBUU0k3MjFfREVWQ1RMX1NSQk9PVF9DTVBMCTB4MDAwMDAwMDQKKworI2RlZmluZSBUU0k3MjFfSTJDX0lOVF9FTkFCTEUJMHg0OTEyMAorCisvKgorICogQmxvY2sgRE1BIEVuZ2luZSBSZWdpc3RlcnMKKyAqICAgeCA9IDAuLjcKKyAqLworCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RXUkNOVCh4KQkoMHg1MTAwMCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFJEQ05UKHgpCSgweDUxMDA0ICsgKHgpICogMHgxMDAwKQorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0NUTCh4KQkoMHg1MTAwOCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfQ1RMX1NVU1AJMHgwMDAwMDAwMgorI2RlZmluZSBUU0k3MjFfRE1BQ19DVExfSU5JVAkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5UKHgpCSgweDUxMDBjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19JTlRfU1RGVUxMCTB4MDAwMDAwMTAKKyNkZWZpbmUgVFNJNzIxX0RNQUNfSU5UX0RPTkUJMHgwMDAwMDAwOAorI2RlZmluZSBUU0k3MjFfRE1BQ19JTlRfU1VTUAkweDAwMDAwMDA0CisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVF9FUlIJMHgwMDAwMDAwMgorI2RlZmluZSBUU0k3MjFfRE1BQ19JTlRfSU9GRE9ORQkweDAwMDAwMDAxCisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVF9BTEwJMHgwMDAwMDAxZgorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVFNFVCh4KQkoMHg1MTAxMCArICh4KSAqIDB4MTAwMCkKKworI2RlZmluZSBUU0k3MjFfRE1BQ19TVFMoeCkJKDB4NTEwMTQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX1NUU19BQk9SVAkweDAwNDAwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFDX1NUU19SVU4JMHgwMDIwMDAwMAorI2RlZmluZSBUU0k3MjFfRE1BQ19TVFNfQ1MJMHgwMDFmMDAwMAorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0lOVEUoeCkJKDB4NTEwMTggKyAoeCkgKiAweDEwMDApCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFBUUkwoeCkJKDB4NTEwMjQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RQVFJMX01BU0sJMHhmZmZmZmZlMAorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RQVFJIKHgpCSgweDUxMDI4ICsgKHgpICogMHgxMDAwKQorCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTQkwoeCkJKDB4NTEwMmMgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTQkxfTUFTSwkweGZmZmZmZmMwCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNCSCh4KQkoMHg1MTAzMCArICh4KSAqIDB4MTAwMCkKKworI2RlZmluZSBUU0k3MjFfRE1BQ19EU1NaKHgpCSgweDUxMDM0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19EU1NaX1NJWkVfTQkweDAwMDAwMDBmCisjZGVmaW5lIFRTSTcyMV9ETUFDX0RTU1pfU0laRShzaXplKQkoX19mbHMoc2l6ZSkgLSA0KQorCisKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNSUCh4KQkoMHg1MTAzOCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0RNQUNfRFNSUF9NQVNLCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfRE1BQ19EU1dQKHgpCSgweDUxMDNjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfRE1BQ19EU1dQX01BU0sJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9CRE1BX0lOVEUJMHg1ZjAwMAorCisvKgorICogTWVzc2FnaW5nIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgVFNJNzIxX01TR19CVUZGRVJfU0laRQkJUklPX01BWF9NU0dfU0laRQorI2RlZmluZSBUU0k3MjFfTVNHX01BWF9TSVpFCQlSSU9fTUFYX01TR19TSVpFCisjZGVmaW5lIFRTSTcyMV9JTVNHX01BWENICQk4CisjZGVmaW5lIFRTSTcyMV9JTVNHX0NITlVNCQlUU0k3MjFfSU1TR19NQVhDSAorI2RlZmluZSBUU0k3MjFfSU1TR0RfTUlOX1JJTkdfU0laRQkzMgorI2RlZmluZSBUU0k3MjFfSU1TR0RfUklOR19TSVpFCQk1MTIKKworI2RlZmluZSBUU0k3MjFfT01TR19DSE5VTQkJNCAvKiBPbmUgY2hhbm5lbCBwZXIgTUJPWCAqLworI2RlZmluZSBUU0k3MjFfT01TR0RfTUlOX1JJTkdfU0laRQkzMgorI2RlZmluZSBUU0k3MjFfT01TR0RfUklOR19TSVpFCQk1MTIKKworLyoKKyAqIE91dGJvdW5kIE1lc3NhZ2luZyBFbmdpbmUgUmVnaXN0ZXJzCisgKiAgIHggPSAwLi43CisgKi8KKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RXUkNOVCh4KQkJKDB4NjEwMDAgKyAoeCkgKiAweDEwMDApCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EUkRDTlQoeCkJCSgweDYxMDA0ICsgKHgpICogMHgxMDAwKQorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfQ1RMKHgpCQkoMHg2MTAwOCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19DVExfTUFTSwkJMHgwMDAwMDAwNworI2RlZmluZSBUU0k3MjFfT0JETUFDX0NUTF9SRVRSWV9USFIJMHgwMDAwMDAwNAorI2RlZmluZSBUU0k3MjFfT0JETUFDX0NUTF9TVVNQRU5ECTB4MDAwMDAwMDIKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19DVExfSU5JVAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UKHgpCQkoMHg2MTAwYyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRTRVQoeCkJCSgweDYxMDEwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0lOVEUoeCkJCSgweDYxMDE4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0lOVF9NQVNLCQkweDAwMDAwMDFGCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX1NUX0ZVTEwJMHgwMDAwMDAxMAorI2RlZmluZSBUU0k3MjFfT0JETUFDX0lOVF9ET05FCQkweDAwMDAwMDA4CisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX1NVU1BFTkRFRAkweDAwMDAwMDA0CisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX0VSUk9SCQkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfSU5UX0lPRl9ET05FCTB4MDAwMDAwMDEKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19JTlRfQUxMCQlUU0k3MjFfT0JETUFDX0lOVF9NQVNLCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19TVFMoeCkJCSgweDYxMDE0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX1NUU19NQVNLCQkweDAwN2YwMDAwCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfU1RTX0FCT1JUCQkweDAwNDAwMDAwCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfU1RTX1JVTgkJMHgwMDIwMDAwMAorI2RlZmluZSBUU0k3MjFfT0JETUFDX1NUU19DUwkJMHgwMDFmMDAwMAorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfUFdFKHgpCQkoMHg2MTAxYyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19QV0VfTUFTSwkJMHgwMDAwMDAwMgorI2RlZmluZSBUU0k3MjFfT0JETUFDX1BXRV9FUlJPUl9FTgkweDAwMDAwMDAyCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EUFRSTCh4KQkJKDB4NjEwMjAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFBUUkxfTUFTSwkweGZmZmZmZmYwCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EUFRSSCh4KQkJKDB4NjEwMjQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFBUUkhfTUFTSwkweGZmZmZmZmZmCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU0JMKHgpCQkoMHg2MTA0MCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU0JMX01BU0sJCTB4ZmZmZmZmYzAKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTQkgoeCkJCSgweDYxMDQ0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTQkhfTUFTSwkJMHhmZmZmZmZmZgorCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNTWih4KQkJKDB4NjEwNDggKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9PQkRNQUNfRFNTWl9NQVNLCQkweDAwMDAwMDBmCisKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU1JQKHgpCQkoMHg2MTA0YyArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX09CRE1BQ19EU1JQX01BU0sJCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTV1AoeCkJCSgweDYxMDUwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfT0JETUFDX0RTV1BfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9SUVJQVE8JCQkweDYwMDEwCisjZGVmaW5lIFRTSTcyMV9SUVJQVE9fTUFTSwkJMHgwMGZmZmZmZgorI2RlZmluZSBUU0k3MjFfUlFSUFRPX1ZBTAkJNDAwCS8qIFJlc3BvbnNlIFRPIHZhbHVlICovCisKKy8qCisgKiBJbmJvdW5kIE1lc3NhZ2luZyBFbmdpbmUgUmVnaXN0ZXJzCisgKiAgIHggPSAwLi43CisgKi8KKworI2RlZmluZSBUU0k3MjFfSUJfREVWSURfR0xPQkFMCQkweGZmZmYKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUUJMKHgpCQkoMHg2MTIwMCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUUJMX01BU0sJCTB4ZmZmZmZmYzAKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRQkgoeCkJCSgweDYxMjA0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRQkhfTUFTSwkJMHhmZmZmZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFTWl9FTlRSWV9JTlgJVFNJNzIxX0lNU0dEX1JJTkdfU0laRQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRU1ooeCkJCSgweDYxMjA4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRU1pfTUFTSwkJMHgwMDAwMDAwZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFSUCh4KQkJKDB4NjEyMGMgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRlFSUF9NQVNLCQkweDAwMDdmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUVdQKHgpCQkoMHg2MTIxMCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19GUVdQX01BU0sJCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRVEgoeCkJCSgweDYxMjE0ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0ZRVEhfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQl9ERVZJRAkJCTB4NjAwMjAKKyNkZWZpbmUgVFNJNzIxX0lCX0RFVklEX01BU0sJCTB4MDAwMGZmZmYKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0NUTCh4KQkJKDB4NjEyNDAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfQ1RMX01BU0sJCTB4MDAwMDAwMDMKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19DVExfU1VTUEVORAkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfQ1RMX0lOSVQJCTB4MDAwMDAwMDEKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX1NUUyh4KQkJKDB4NjEyNDQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfU1RTX01BU0sJCTB4MDA3ZjAwMDAKKyNkZWZpbmUgVFNJNzIxX0lCU01BQ19TVFNfQUJPUlQJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVFNJNzIxX0lCU01BQ19TVFNfUlVOCQkweDAwMjAwMDAwCisjZGVmaW5lIFRTSTcyMV9JQlNNQUNfU1RTX0NTCQkweDAwMWYwMDAwCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlQoeCkJCSgweDYxMjQ4ICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0lOVFNFVCh4KQkJKDB4NjEyNGMgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5URSh4KQkJKDB4NjEyNTAgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX01BU0sJCTB4MDAwMDEwMGYKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19JTlRfU1JUTwkJMHgwMDAwMTAwMAorI2RlZmluZSBUU0k3MjFfSUJETUFDX0lOVF9TVVNQRU5ERUQJMHgwMDAwMDAwOAorI2RlZmluZSBUU0k3MjFfSUJETUFDX0lOVF9QQ19FUlJPUgkweDAwMDAwMDA0CisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX0ZRX0xPVwkweDAwMDAwMDAyCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX0RRX1JDVgkweDAwMDAwMDAxCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfSU5UX0FMTAkJVFNJNzIxX0lCRE1BQ19JTlRfTUFTSworCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfUFdFKHgpCQkoMHg2MTI1NCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19QV0VfTUFTSwkJMHgwMDAwMTcwMAorI2RlZmluZSBUU0k3MjFfSUJETUFDX1BXRV9TUlRPCQkweDAwMDAxMDAwCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfUFdFX0lMTF9GTVQJMHgwMDAwMDQwMAorI2RlZmluZSBUU0k3MjFfSUJETUFDX1BXRV9JTExfREVDCTB4MDAwMDAyMDAKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19QV0VfSU1QX1NQCTB4MDAwMDAxMDAKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRQkwoeCkJCSgweDYxMzAwICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRQkxfTUFTSwkJMHhmZmZmZmZjMAorI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRQkxfQUREUgkJMHhmZmZmZmZjMAorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFCSCh4KQkJKDB4NjEzMDQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFCSF9NQVNLCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUVJQKHgpCQkoMHg2MTMwOCArICh4KSAqIDB4MTAwMCkKKyNkZWZpbmUgVFNJNzIxX0lCRE1BQ19EUVJQX01BU0sJCTB4MDAwN2ZmZmYKKworI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRV1IoeCkJCSgweDYxMzBjICsgKHgpICogMHgxMDAwKQorI2RlZmluZSBUU0k3MjFfSUJETUFDX0RRV1JfTUFTSwkJMHgwMDA3ZmZmZgorCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFTWih4KQkJKDB4NjEzMTQgKyAoeCkgKiAweDEwMDApCisjZGVmaW5lIFRTSTcyMV9JQkRNQUNfRFFTWl9NQVNLCQkweDAwMDAwMDBmCisKKy8qCisgKiBNZXNzYWdpbmcgRW5naW5lIEludGVycnVwdHMKKyAqLworCisjZGVmaW5lIFRTSTcyMV9TTVNHX1BXRQkJCTB4NmEwMDQKKworI2RlZmluZSBUU0k3MjFfU01TR19JTlRFCQkweDZhMDAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVAkJCTB4NmEwMDgKKyNkZWZpbmUgVFNJNzIxX1NNU0dfSU5UU0VUCQkweDZhMDEwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9NQVNLCQkweDAwODZmZmZmCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9VTlNfUlNQCQkweDAwODAwMDAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9FQ0NfTkNPUgkweDAwMDQwMDAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9FQ0NfQ09SCQkweDAwMDIwMDAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9FQ0NfTkNPUl9DSAkweDAwMDBmZjAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0lOVF9FQ0NfQ09SX0NICTB4MDAwMDAwZmYKKworI2RlZmluZSBUU0k3MjFfU01TR19FQ0NfTE9HCQkweDZhMDE0CisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19MT0dfTUFTSwkweDAwMDcwMDA3CisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19MT0dfRUNDX05DT1JfTQkweDAwMDcwMDAwCisjZGVmaW5lIFRTSTcyMV9TTVNHX0VDQ19MT0dfRUNDX0NPUl9NCTB4MDAwMDAwMDcKKworI2RlZmluZSBUU0k3MjFfUkVUUllfR0VOX0NOVAkJMHg2YTEwMAorI2RlZmluZSBUU0k3MjFfUkVUUllfR0VOX0NOVF9NQVNLCTB4ZmZmZmZmZmYKKworI2RlZmluZSBUU0k3MjFfUkVUUllfUlhfQ05UCQkweDZhMTA0CisjZGVmaW5lIFRTSTcyMV9SRVRSWV9SWF9DTlRfTUFTSwkweGZmZmZmZmZmCisKKyNkZWZpbmUgVFNJNzIxX1NNU0dfRUNDX0NPUl9MT0coeCkJKDB4NmEzMDAgKyAoeCkgKiA0KQorI2RlZmluZSBUU0k3MjFfU01TR19FQ0NfQ09SX0xPR19NQVNLCTB4MDAwMDAwZmYKKworI2RlZmluZSBUU0k3MjFfU01TR19FQ0NfTkNPUih4KQkJKDB4NmEzNDAgKyAoeCkgKiA0KQorI2RlZmluZSBUU0k3MjFfU01TR19FQ0NfTkNPUl9NQVNLCTB4MDAwMDAwZmYKKworLyoKKyAqIEJsb2NrIERNQSBEZXNjcmlwdG9ycworICovCisKK3N0cnVjdCB0c2k3MjFfZG1hX2Rlc2MgeworCV9fbGUzMiB0eXBlX2lkOworCisjZGVmaW5lIFRTSTcyMV9ETUFEX0RFVklECTB4MDAwMGZmZmYKKyNkZWZpbmUgVFNJNzIxX0RNQURfQ1JGCQkweDAwMDEwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFEX1BSSU8JMHgwMDA2MDAwMAorI2RlZmluZSBUU0k3MjFfRE1BRF9SVFlQRQkweDAwNzgwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFEX0lPRgkJMHgwODAwMDAwMAorI2RlZmluZSBUU0k3MjFfRE1BRF9EVFlQRQkweGUwMDAwMDAwCisKKwlfX2xlMzIgYmNvdW50OworCisjZGVmaW5lIFRTSTcyMV9ETUFEX0JDT1VOVDEJMHgwM2ZmZmZmZiAvKiBpZiBEVFlQRSA9PSAxICovCisjZGVmaW5lIFRTSTcyMV9ETUFEX0JDT1VOVDIJMHgwMDAwMDAwZiAvKiBpZiBEVFlQRSA9PSAyICovCisjZGVmaW5lIFRTSTcyMV9ETUFEX1RUCQkweDBjMDAwMDAwCisjZGVmaW5lIFRTSTcyMV9ETUFEX1JBRERSMAkweGMwMDAwMDAwCisKKwl1bmlvbiB7CisJCV9fbGUzMiByYWRkcl9sbzsJICAgLyogaWYgRFRZUEUgPT0gKDEgfHwgMikgKi8KKwkJX19sZTMyIG5leHRfbG87CQkgICAvKiBpZiBEVFlQRSA9PSAzICovCisJfTsKKworI2RlZmluZSBUU0k3MjFfRE1BRF9DRkdPRkYJMHgwMGZmZmZmZgorI2RlZmluZSBUU0k3MjFfRE1BRF9IT1BDTlQJMHhmZjAwMDAwMAorCisJdW5pb24geworCQlfX2xlMzIgcmFkZHJfaGk7CSAgIC8qIGlmIERUWVBFID09ICgxIHx8IDIpICovCisJCV9fbGUzMiBuZXh0X2hpOwkJICAgLyogaWYgRFRZUEUgPT0gMyAqLworCX07CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CQkgICAvKiBpZiBEVFlQRSA9PSAxICovCisJCQlfX2xlMzIgYnVmcHRyX2xvOworCQkJX19sZTMyIGJ1ZnB0cl9oaTsKKwkJCV9fbGUzMiBzX2Rpc3Q7CisJCQlfX2xlMzIgc19zaXplOworCQl9IHQxOworCQlfX2xlMzIgZGF0YVs0XTsJCSAgIC8qIGlmIERUWVBFID09IDIgKi8KKwkJdTMyICAgIHJlc2VydmVkWzRdOwkgICAvKiBpZiBEVFlQRSA9PSAzICovCisJfTsKK30gX19hbGlnbmVkKDMyKTsKKworLyoKKyAqIEluYm91bmQgTWVzc2FnaW5nIERlc2NyaXB0b3IKKyAqLworc3RydWN0IHRzaTcyMV9pbXNnX2Rlc2MgeworCV9fbGUzMiB0eXBlX2lkOworCisjZGVmaW5lIFRTSTcyMV9JTURfREVWSUQJMHgwMDAwZmZmZgorI2RlZmluZSBUU0k3MjFfSU1EX0NSRgkJMHgwMDAxMDAwMAorI2RlZmluZSBUU0k3MjFfSU1EX1BSSU8JCTB4MDAwNjAwMDAKKyNkZWZpbmUgVFNJNzIxX0lNRF9UVAkJMHgwMDE4MDAwMAorI2RlZmluZSBUU0k3MjFfSU1EX0RUWVBFCTB4ZTAwMDAwMDAKKworCV9fbGUzMiBtc2dfaW5mbzsKKworI2RlZmluZSBUU0k3MjFfSU1EX0JDT1VOVAkweDAwMDAwZmY4CisjZGVmaW5lIFRTSTcyMV9JTURfU1NJWkUJMHgwMDAwZjAwMAorI2RlZmluZSBUU0k3MjFfSU1EX0xFVEVSCTB4MDAwMzAwMDAKKyNkZWZpbmUgVFNJNzIxX0lNRF9YTUJPWAkweDAwM2MwMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfTUJPWAkJMHgwMGMwMDAwMAorI2RlZmluZSBUU0k3MjFfSU1EX0NTCQkweDc4MDAwMDAwCisjZGVmaW5lIFRTSTcyMV9JTURfSE8JCTB4ODAwMDAwMDAKKworCV9fbGUzMiBidWZwdHJfbG87CisJX19sZTMyIGJ1ZnB0cl9oaTsKKwl1MzIgICAgcmVzZXJ2ZWRbMTJdOworCit9IF9fYWxpZ25lZCg2NCk7CisKKy8qCisgKiBPdXRib3VuZCBNZXNzYWdpbmcgRGVzY3JpcHRvcgorICovCitzdHJ1Y3QgdHNpNzIxX29tc2dfZGVzYyB7CisJX19sZTMyIHR5cGVfaWQ7CisKKyNkZWZpbmUgVFNJNzIxX09NRF9ERVZJRAkweDAwMDBmZmZmCisjZGVmaW5lIFRTSTcyMV9PTURfQ1JGCQkweDAwMDEwMDAwCisjZGVmaW5lIFRTSTcyMV9PTURfUFJJTwkJMHgwMDA2MDAwMAorI2RlZmluZSBUU0k3MjFfT01EX0lPRgkJMHgwODAwMDAwMAorI2RlZmluZSBUU0k3MjFfT01EX0RUWVBFCTB4ZTAwMDAwMDAKKyNkZWZpbmUgVFNJNzIxX09NRF9SU1JWRAkweDE3ZjgwMDAwCisKKwlfX2xlMzIgbXNnX2luZm87CisKKyNkZWZpbmUgVFNJNzIxX09NRF9CQ09VTlQJMHgwMDAwMGZmOAorI2RlZmluZSBUU0k3MjFfT01EX1NTSVpFCTB4MDAwMGYwMDAKKyNkZWZpbmUgVFNJNzIxX09NRF9MRVRFUgkweDAwMDMwMDAwCisjZGVmaW5lIFRTSTcyMV9PTURfWE1CT1gJMHgwMDNjMDAwMAorI2RlZmluZSBUU0k3MjFfT01EX01CT1gJCTB4MDBjMDAwMDAKKyNkZWZpbmUgVFNJNzIxX09NRF9UVAkJMHgwYzAwMDAwMAorCisJdW5pb24geworCQlfX2xlMzIgYnVmcHRyX2xvOwkvKiBpZiBEVFlQRSA9PSA0ICovCisJCV9fbGUzMiBuZXh0X2xvOwkJLyogaWYgRFRZUEUgPT0gNSAqLworCX07CisKKwl1bmlvbiB7CisJCV9fbGUzMiBidWZwdHJfaGk7CS8qIGlmIERUWVBFID09IDQgKi8KKwkJX19sZTMyIG5leHRfaGk7CQkvKiBpZiBEVFlQRSA9PSA1ICovCisJfTsKKworfSBfX2FsaWduZWQoMTYpOworCitzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMgeworCV9fbGU2NAlkZXNjX3N0c1s4XTsKK30gX19hbGlnbmVkKDY0KTsKKworc3RydWN0IHRzaTcyMV9kZXNjX3N0c19maWZvIHsKKwl1bmlvbiB7CisJCV9fbGU2NAlkYTY0OworCQlzdHJ1Y3QgeworCQkJX19sZTMyCWxvOworCQkJX19sZTMyCWhpOworCQl9IGRhMzI7CisJfSBzdGF0WzhdOworfSBfX2FsaWduZWQoNjQpOworCisvKiBEZXNjcmlwdG9yIHR5cGVzIGZvciBCRE1BIGFuZCBNZXNzYWdpbmcgYmxvY2tzICovCitlbnVtIGRtYV9kdHlwZSB7CisJRFRZUEUxID0gMSwgLyogRGF0YSBUcmFuc2ZlciBETUEgRGVzY3JpcHRvciAqLworCURUWVBFMiA9IDIsIC8qIEltbWVkaWF0ZSBEYXRhIFRyYW5zZmVyIERNQSBEZXNjcmlwdG9yICovCisJRFRZUEUzID0gMywgLyogQmxvY2sgUG9pbnRlciBETUEgRGVzY3JpcHRvciAqLworCURUWVBFNCA9IDQsIC8qIE91dGJvdW5kIE1zZyBETUEgRGVzY3JpcHRvciAqLworCURUWVBFNSA9IDUsIC8qIE9CIE1lc3NhZ2luZyBCbG9jayBQb2ludGVyIERlc2NyaXB0b3IgKi8KKwlEVFlQRTYgPSA2ICAvKiBJbmJvdW5kIE1lc3NhZ2luZyBEZXNjcmlwdG9yICovCit9OworCitlbnVtIGRtYV9ydHlwZSB7CisJTlJFQUQgPSAwLAorCUxBU1RfTldSSVRFX1IgPSAxLAorCUFMTF9OV1JJVEUgPSAyLAorCUFMTF9OV1JJVEVfUiA9IDMsCisJTUFJTlRfUkQgPSA0LAorCU1BSU5UX1dSID0gNQorfTsKKworLyoKKyAqIG1wb3J0IERyaXZlciBEZWZpbml0aW9ucworICovCisjZGVmaW5lIFRTSTcyMV9ETUFfQ0hOVU0JVFNJNzIxX0RNQV9NQVhDSAorCisjZGVmaW5lIFRTSTcyMV9ETUFDSF9NQUlOVAkwCS8qIERNQSBjaGFubmVsIGZvciBtYWludCByZXF1ZXN0cyAqLworI2RlZmluZSBUU0k3MjFfRE1BQ0hfTUFJTlRfTkJECTMyCS8qIE51bWJlciBvZiBCRHMgZm9yIG1haW50IHJlcXVlc3RzICovCisKKyNkZWZpbmUgTVNHX0RNQV9FTlRSWV9JTlhfVE9fU0laRSh4KQkoKDB4MTAgPDwgKHgpKSAmIDB4RkZGRjApCisKK2VudW0gdHNpNzIxX3Ntc2dfaW50X2ZsYWcgeworCVNNU0dfSU5UX05PTkUJCT0gMHgwMDAwMDAwMCwKKwlTTVNHX0lOVF9FQ0NfQ09SX0NICT0gMHgwMDAwMDBmZiwKKwlTTVNHX0lOVF9FQ0NfTkNPUl9DSAk9IDB4MDAwMGZmMDAsCisJU01TR19JTlRfRUNDX0NPUgk9IDB4MDAwMjAwMDAsCisJU01TR19JTlRfRUNDX05DT1IJPSAweDAwMDQwMDAwLAorCVNNU0dfSU5UX1VOU19SU1AJPSAweDAwODAwMDAwLAorCVNNU0dfSU5UX0FMTAkJPSAweDAwMDZmZmZmCit9OworCisvKiBTdHJ1Y3R1cmVzICovCisKK3N0cnVjdCB0c2k3MjFfYmRtYV9jaGFuIHsKKwlpbnQJCWJkX251bTsJCS8qIG51bWJlciBvZiBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwl2b2lkCQkqYmRfYmFzZTsJLyogc3RhcnQgb2YgRE1BIGRlc2NyaXB0b3JzICovCisJZG1hX2FkZHJfdAliZF9waHlzOworCXZvaWQJCSpzdHNfYmFzZTsJLyogc3RhcnQgb2YgRE1BIEJEIHN0YXR1cyBGSUZPICovCisJZG1hX2FkZHJfdAlzdHNfcGh5czsKKwlpbnQJCXN0c19zaXplOworfTsKKworc3RydWN0IHRzaTcyMV9pbXNnX3JpbmcgeworCXUzMgkJc2l6ZTsKKwkvKiBWQS9QQSBvZiBkYXRhIGJ1ZmZlcnMgZm9yIGluY29taW5nIG1lc3NhZ2VzICovCisJdm9pZAkJKmJ1Zl9iYXNlOworCWRtYV9hZGRyX3QJYnVmX3BoeXM7CisJLyogVkEvUEEgb2YgY2lyY3VsYXIgZnJlZSBidWZmZXIgbGlzdCAqLworCXZvaWQJCSppbWZxX2Jhc2U7CisJZG1hX2FkZHJfdAlpbWZxX3BoeXM7CisJLyogVkEvUEEgb2YgSW5ib3VuZCBtZXNzYWdlIGRlc2NyaXB0b3JzICovCisJdm9pZAkJKmltZF9iYXNlOworCWRtYV9hZGRyX3QJaW1kX3BoeXM7CisJIC8qIEluYm91bmQgUXVldWUgYnVmZmVyIHBvaW50ZXJzICovCisJdm9pZAkJKmltcV9iYXNlW1RTSTcyMV9JTVNHRF9SSU5HX1NJWkVdOworCisJdTMyCQlyeF9zbG90OworCXZvaWQJCSpkZXZfaWQ7CisJdTMyCQlmcV93cnB0cjsKKwl1MzIJCWRlc2NfcmRwdHI7CisJc3BpbmxvY2tfdAlsb2NrOworfTsKKworc3RydWN0IHRzaTcyMV9vbXNnX3JpbmcgeworCXUzMgkJc2l6ZTsKKwkvKiBWQS9QQSBvZiBPQiBNc2cgZGVzY3JpcHRvcnMgKi8KKwl2b2lkCQkqb21kX2Jhc2U7CisJZG1hX2FkZHJfdAlvbWRfcGh5czsKKwkvKiBWQS9QQSBvZiBPQiBNc2cgZGF0YSBidWZmZXJzICovCisJdm9pZAkJKm9tcV9iYXNlW1RTSTcyMV9PTVNHRF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QJb21xX3BoeXNbVFNJNzIxX09NU0dEX1JJTkdfU0laRV07CisJLyogVkEvUEEgb2YgT0IgTXNnIGRlc2NyaXB0b3Igc3RhdHVzIEZJRk8gKi8KKwl2b2lkCQkqc3RzX2Jhc2U7CisJZG1hX2FkZHJfdAlzdHNfcGh5czsKKwl1MzIJCXN0c19zaXplOyAvKiAjIG9mIGFsbG9jYXRlZCBzdGF0dXMgZW50cmllcyAqLworCXUzMgkJc3RzX3JkcHRyOworCisJdTMyCQl0eF9zbG90OworCXZvaWQJCSpkZXZfaWQ7CisJdTMyCQl3cl9jb3VudDsKKwlzcGlubG9ja190CWxvY2s7Cit9OworCitlbnVtIHRzaTcyMV9mbGFncyB7CisJVFNJNzIxX1VTSU5HX01TSQk9ICgxIDw8IDApLAorCVRTSTcyMV9VU0lOR19NU0lYCT0gKDEgPDwgMSksCisJVFNJNzIxX0lNU0dJRF9TRVQJPSAoMSA8PCAyKSwKK307CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorLyoKKyAqIE1TSS1YIFRhYmxlIEVudHJpZXMgKDAgLi4uIDY5KQorICovCisjZGVmaW5lIFRTSTcyMV9NU0lYX0RNQUNIX0RPTkUoeCkJKDAgKyAoeCkpCisjZGVmaW5lIFRTSTcyMV9NU0lYX0RNQUNIX0lOVCh4KQkoOCArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfQkRNQV9JTlQJCTE2CisjZGVmaW5lIFRTSTcyMV9NU0lYX09NU0dfRE9ORSh4KQkoMTcgKyAoeCkpCisjZGVmaW5lIFRTSTcyMV9NU0lYX09NU0dfSU5UKHgpCQkoMjUgKyAoeCkpCisjZGVmaW5lIFRTSTcyMV9NU0lYX0lNU0dfRFFfUkNWKHgpCSgzMyArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfSU1TR19JTlQoeCkJCSg0MSArICh4KSkKKyNkZWZpbmUgVFNJNzIxX01TSVhfTVNHX0lOVAkJNDkKKyNkZWZpbmUgVFNJNzIxX01TSVhfU1IyUENfSURCUV9SQ1YoeCkJKDUwICsgKHgpKQorI2RlZmluZSBUU0k3MjFfTVNJWF9TUjJQQ19DSF9JTlQoeCkJKDU4ICsgKHgpKQorI2RlZmluZSBUU0k3MjFfTVNJWF9TUjJQQ19JTlQJCTY2CisjZGVmaW5lIFRTSTcyMV9NU0lYX1BDMlNSX0lOVAkJNjcKKyNkZWZpbmUgVFNJNzIxX01TSVhfU1JJT19NQUNfSU5UCTY4CisjZGVmaW5lIFRTSTcyMV9NU0lYX0kyQ19JTlQJCTY5CisKKy8qIE1TSS1YIHZlY3RvciBhbmQgaW5pdCB0YWJsZSBlbnRyeSBpbmRleGVzICovCitlbnVtIHRzaTcyMV9tc2l4X3ZlY3QgeworCVRTSTcyMV9WRUNUX0lEQiwKKwlUU0k3MjFfVkVDVF9QV1JYLCAvKiBQV19SWCBpcyBwYXJ0IG9mIFNSSU8gTUFDIEludGVycnVwdCByZXBvcnRpbmcgKi8KKwlUU0k3MjFfVkVDVF9PTUIwX0RPTkUsCisJVFNJNzIxX1ZFQ1RfT01CMV9ET05FLAorCVRTSTcyMV9WRUNUX09NQjJfRE9ORSwKKwlUU0k3MjFfVkVDVF9PTUIzX0RPTkUsCisJVFNJNzIxX1ZFQ1RfT01CMF9JTlQsCisJVFNJNzIxX1ZFQ1RfT01CMV9JTlQsCisJVFNJNzIxX1ZFQ1RfT01CMl9JTlQsCisJVFNJNzIxX1ZFQ1RfT01CM19JTlQsCisJVFNJNzIxX1ZFQ1RfSU1CMF9SQ1YsCisJVFNJNzIxX1ZFQ1RfSU1CMV9SQ1YsCisJVFNJNzIxX1ZFQ1RfSU1CMl9SQ1YsCisJVFNJNzIxX1ZFQ1RfSU1CM19SQ1YsCisJVFNJNzIxX1ZFQ1RfSU1CMF9JTlQsCisJVFNJNzIxX1ZFQ1RfSU1CMV9JTlQsCisJVFNJNzIxX1ZFQ1RfSU1CMl9JTlQsCisJVFNJNzIxX1ZFQ1RfSU1CM19JTlQsCisJVFNJNzIxX1ZFQ1RfTUFYCit9OworCisjZGVmaW5lIElSUV9ERVZJQ0VfTkFNRV9NQVgJNjQKKworc3RydWN0IG1zaXhfaXJxIHsKKwl1MTYJdmVjdG9yOworCWNoYXIJaXJxX25hbWVbSVJRX0RFVklDRV9OQU1FX01BWF07Cit9OworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKK3N0cnVjdCB0c2k3MjFfZGV2aWNlIHsKKwlzdHJ1Y3QgcGNpX2RldgkqcGRldjsKKwlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydDsKKwl1MzIJCWZsYWdzOworCXZvaWQgX19pb21lbQkqcmVnczsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXN0cnVjdCBtc2l4X2lycQltc2l4W1RTSTcyMV9WRUNUX01BWF07CisjZW5kaWYKKwkvKiBEb29yYmVsbHMgKi8KKwl2b2lkIF9faW9tZW0JKm9kYl9iYXNlOworCXZvaWQJCSppZGJfYmFzZTsKKwlkbWFfYWRkcl90CWlkYl9kbWE7CisJc3RydWN0IHdvcmtfc3RydWN0IGlkYl93b3JrOworCXUzMgkJZGJfZGlzY2FyZF9jb3VudDsKKworCS8qIEluYm91bmQgUG9ydC1Xcml0ZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBwd193b3JrOworCXN0cnVjdCBrZmlmbwlwd19maWZvOworCXNwaW5sb2NrX3QJcHdfZmlmb19sb2NrOworCXUzMgkJcHdfZGlzY2FyZF9jb3VudDsKKworCS8qIEJETUEgRW5naW5lICovCisJc3RydWN0IHRzaTcyMV9iZG1hX2NoYW4gYmRtYVtUU0k3MjFfRE1BX0NITlVNXTsKKworCS8qIEluYm91bmQgTWVzc2FnaW5nICovCisJaW50CQlpbXNnX2luaXRbVFNJNzIxX0lNU0dfQ0hOVU1dOworCXN0cnVjdCB0c2k3MjFfaW1zZ19yaW5nIGltc2dfcmluZ1tUU0k3MjFfSU1TR19DSE5VTV07CisKKwkvKiBPdXRib3VuZCBNZXNzYWdpbmcgKi8KKwlpbnQJCW9tc2dfaW5pdFtUU0k3MjFfT01TR19DSE5VTV07CisJc3RydWN0IHRzaTcyMV9vbXNnX3JpbmcJb21zZ19yaW5nW1RTSTcyMV9PTVNHX0NITlVNXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1zY2FuLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYwppbmRleCBlYmU3N2RkLi4yYmViZDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYwpAQCAtNTE2LDcgKzUxNiw3IEBACiAJcmV0dXJuIHJkZXY7CiAKIGNsZWFudXA6Ci0JaWYgKHJpb19pc19zd2l0Y2gocmRldikpCisJaWYgKHJzd2l0Y2gpCiAJCWtmcmVlKHJzd2l0Y2gtPnJvdXRlX3RhYmxlKTsKIAogCWtmcmVlKHJkZXYpOwpAQCAtOTIzLDcgKzkyMyw3IEBACiAgKiByaW9fZW51bV9jb21wbGV0ZS0gVGVzdHMgaWYgZW51bWVyYXRpb24gb2YgYSBuZXR3b3JrIGlzIGNvbXBsZXRlCiAgKiBAcG9ydDogTWFzdGVyIHBvcnQgdG8gc2VuZCB0cmFuc2FjdGlvbgogICoKLSAqIFRlc3RzIHRoZSBDb21wb25lbnQgVGFnIENTUiBmb3Igbm9uLXplcm8gdmFsdWUgKGVudW1lcmF0aW9uCisgKiBUZXN0cyB0aGUgUEdDQ1NSIGRpc2NvdmVyZWQgYml0IGZvciBub24temVybyB2YWx1ZSAoZW51bWVyYXRpb24KICAqIGNvbXBsZXRlIGZsYWcpLiBSZXR1cm4gJTEgaWYgZW51bWVyYXRpb24gaXMgY29tcGxldGUgb3IgJTAgaWYKICAqIGVudW1lcmF0aW9uIGlzIGluY29tcGxldGUuCiAgKi8KQEAgLTkzMyw3ICs5MzMsNyBAQAogCiAJcmlvX2xvY2FsX3JlYWRfY29uZmlnXzMyKHBvcnQsIHBvcnQtPnBoeXNfZWZwdHIgKyBSSU9fUE9SVF9HRU5fQ1RMX0NTUiwKIAkJCQkgJnJlZ3ZhbCk7Ci0JcmV0dXJuIChyZWd2YWwgJiBSSU9fUE9SVF9HRU5fTUFTVEVSKSA/IDEgOiAwOworCXJldHVybiAocmVndmFsICYgUklPX1BPUlRfR0VOX0RJU0NPVkVSRUQpID8gMSA6IDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL2lkdF9nZW4yLmMgYi9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0X2dlbjIuYwppbmRleCAwNDNlZTMxLi44MDliN2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0X2dlbjIuYworKysgYi9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0X2dlbjIuYwpAQCAtMTAsNiArMTAsNyBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3Jpb19kcnYuaD4KICNpbmNsdWRlIDxsaW51eC9yaW9faWRzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYwppbmRleCBkNjNmZGRiLi5jYTBkNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvODhwbTg2MHguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHBtODYwN19yZWd1bGF0b3JfaW5mbyB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjCWRlc2M7CkBAIC00MTIsNyArNDEzLDcgQEAKIAkJaWYgKGluZm8tPmRlc2MuaWQgPT0gcmVzLT5zdGFydCkKIAkJCWJyZWFrOwogCX0KLQlpZiAoKGkgPCAwKSB8fCAoaSA+IFBNODYwN19JRF9SR19NQVgpKSB7CisJaWYgKGkgPT0gQVJSQVlfU0laRShwbTg2MDdfcmVndWxhdG9yX2luZm8pKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBmaW5kIHJlZ3VsYXRvciAlbGx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCBjN2ZkMmMwLi45NzEzYjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTY0LDYgKzY0LDE2IEBACiAKICAgICAgICAgICBJZiB1bnN1cmUsIHNheSBuby4KIAorY29uZmlnIFJFR1VMQVRPUl9HUElPCisJdHJpc3RhdGUgIkdQSU8gcmVndWxhdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciByZWd1bGF0b3JzIHRoYXQgY2FuIGJlCisJICBjb250cm9sbGVkIHZpYSBncGlvcy4KKwkgIEl0IGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBjdXJyZW50IGFuZCB2b2x0YWdlIHJlZ3VsYXRvcnMKKwkgIGFuZCB0aGUgcGxhdGZvcm0gaGFzIHRvIHByb3ZpZGUgYSBtYXBwaW5nIG9mIEdQSU8tc3RhdGVzCisJICB0byB0YXJnZXQgdm9sdHMvYW1wcy4KKwogY29uZmlnIFJFR1VMQVRPUl9CUTI0MDIyCiAJdHJpc3RhdGUgIlRJIGJxMjQwMjIgRHVhbCBJbnB1dCAxLUNlbGwgTGktSW9uIENoYXJnZXIgSUMiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCAwNDBkNWFhLi45M2E2MzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVklSVFVBTF9DT05TVU1FUikgKz0gdmlydHVhbC5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1VTRVJTUEFDRV9DT05TVU1FUikgKz0gdXNlcnNwYWNlLWNvbnN1bWVyLm8KIAorb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9HUElPKSArPSBncGlvLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FENTM5OCkgKz0gYWQ1Mzk4Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQlEyNDAyMikgKz0gYnEyNDAyMi5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0xQMzk3MSkgKz0gbHAzOTcxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCmluZGV4IGNkNDEwNDUuLjVhYmViM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FiODUwMC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWI4NTAwLmMKaW5kZXggMDJmM2MyMy4uNmUxYWU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYWI4NTAwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWI4NTAwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWI4NTAwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9icTI0MDIyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9icTI0MDIyLmMKaW5kZXggMDY4ZDQ4OC4uZTI0ZDFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYnEyNDAyMi5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2JxMjQwMjIuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2JxMjQwMjIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggZDhlNmE0Mi4uNjY5ZDAyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcmVndWxhdG9yLmg+CkBAIC0xNDI1LDcgKzE0MjYsNyBAQAogCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCi0JaWYgKHJldCAhPSAwKQorCWlmIChyZXQgIT0gMCAmJiByZGV2LT5zdXBwbHkpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHJkZXYtPnN1cHBseSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTU1Miw2ICsxNTUzLDY4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZm9yY2VfZGlzYWJsZSk7CiAKK3N0YXRpYyB2b2lkIHJlZ3VsYXRvcl9kaXNhYmxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByZWd1bGF0b3JfZGV2LAorCQkJCQkJICBkaXNhYmxlX3dvcmsud29yayk7CisJaW50IGNvdW50LCBpLCByZXQ7CisKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisKKwlCVUdfT04oIXJkZXYtPmRlZmVycmVkX2Rpc2FibGVzKTsKKworCWNvdW50ID0gcmRldi0+ZGVmZXJyZWRfZGlzYWJsZXM7CisJcmRldi0+ZGVmZXJyZWRfZGlzYWJsZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYpOworCQlpZiAocmV0ICE9IDApCisJCQlyZGV2X2VycihyZGV2LCAiRGVmZXJyZWQgZGlzYWJsZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCX0KKworCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOworCisJaWYgKHJkZXYtPnN1cHBseSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKKwkJCWlmIChyZXQgIT0gMCkgeworCQkJCXJkZXZfZXJyKHJkZXYsCisJCQkJCSAiU3VwcGx5IGRpc2FibGUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiByZWd1bGF0b3JfZGlzYWJsZV9kZWZlcnJlZCAtIGRpc2FibGUgcmVndWxhdG9yIG91dHB1dCB3aXRoIGRlbGF5CisgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCisgKiBAbXM6IG1pbGlzZWNvbmRzIHVudGlsIHRoZSByZWd1bGF0b3IgaXMgZGlzYWJsZWQKKyAqCisgKiBFeGVjdXRlIHJlZ3VsYXRvcl9kaXNhYmxlKCkgb24gdGhlIHJlZ3VsYXRvciBhZnRlciBhIGRlbGF5LiAgVGhpcworICogaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGRldmljZXMgdGhhdCByZXF1aXJlIHNvbWUgdGltZSB0byBxdWllc2NlLgorICoKKyAqIE5PVEU6IHRoaXMgd2lsbCBvbmx5IGRpc2FibGUgdGhlIHJlZ3VsYXRvciBvdXRwdXQgaWYgbm8gb3RoZXIgY29uc3VtZXIKKyAqIGRldmljZXMgaGF2ZSBpdCBlbmFibGVkLCB0aGUgcmVndWxhdG9yIGRldmljZSBzdXBwb3J0cyBkaXNhYmxpbmcgYW5kCisgKiBtYWNoaW5lIGNvbnN0cmFpbnRzIHBlcm1pdCB0aGlzIG9wZXJhdGlvbi4KKyAqLworaW50IHJlZ3VsYXRvcl9kaXNhYmxlX2RlZmVycmVkKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwgaW50IG1zKQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisJcmRldi0+ZGVmZXJyZWRfZGlzYWJsZXMrKzsKKwltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKKworCXJldCA9IHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+ZGlzYWJsZV93b3JrLAorCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKG1zKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9kaXNhYmxlX2RlZmVycmVkKTsKKwogc3RhdGljIGludCBfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJLyogSWYgd2UgZG9uJ3Qga25vdyB0aGVuIGFzc3VtZSB0aGF0IHRoZSByZWd1bGF0b3IgaXMgYWx3YXlzIG9uICovCkBAIC0yNjIyLDYgKzI2ODUsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5jb25zdW1lcl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcmRldi0+bGlzdCk7CiAJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZyZGV2LT5ub3RpZmllcik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJkZXYtPmRpc2FibGVfd29yaywgcmVndWxhdG9yX2Rpc2FibGVfd29yayk7CiAKIAkvKiBwcmVmb3JtIGFueSByZWd1bGF0b3Igc3BlY2lmaWMgaW5pdCAqLwogCWlmIChpbml0X2RhdGEtPnJlZ3VsYXRvcl9pbml0KSB7CkBAIC0yNzI5LDYgKzI3OTMsNyBAQAogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShyZGV2LT5kZWJ1Z2ZzKTsKICNlbmRpZgorCWZsdXNoX3dvcmtfc3luYygmcmRldi0+ZGlzYWJsZV93b3JrLndvcmspOwogCVdBUk5fT04ocmRldi0+b3Blbl9jb3VudCk7CiAJdW5zZXRfcmVndWxhdG9yX3N1cHBsaWVzKHJkZXYpOwogCWxpc3RfZGVsKCZyZGV2LT5saXN0KTsKQEAgLTI5MDcsNiArMjk3Miw0MyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2dldF9pbml0X2RydmRhdGEpOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgc3NpemVfdCBzdXBwbHlfbWFwX3JlYWRfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJc3NpemVfdCBsZW4sIHJldCA9IDA7CisJc3RydWN0IHJlZ3VsYXRvcl9tYXAgKm1hcDsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcmVndWxhdG9yX21hcF9saXN0LCBsaXN0KSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LAorCQkJICAgICAgICIlcyAtPiAlcy4lc1xuIiwKKwkJCSAgICAgICByZGV2X2dldF9uYW1lKG1hcC0+cmVndWxhdG9yKSwgbWFwLT5kZXZfbmFtZSwKKwkJCSAgICAgICBtYXAtPnN1cHBseSk7CisJCWlmIChsZW4gPj0gMCkKKwkJCXJldCArPSBsZW47CisJCWlmIChyZXQgPiBQQUdFX1NJWkUpIHsKKwkJCXJldCA9IFBBR0VfU0laRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHJldCk7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3VwcGx5X21hcF9mb3BzID0geworCS5yZWFkID0gc3VwcGx5X21hcF9yZWFkX2ZpbGUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IF9faW5pdCByZWd1bGF0b3JfaW5pdCh2b2lkKQogewogCWludCByZXQ7CkBAIC0yOTE5LDYgKzMwMjEsMTAgQEAKIAkJcHJfd2FybigicmVndWxhdG9yOiBGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKIAkJZGVidWdmc19yb290ID0gTlVMTDsKIAl9CisKKwlpZiAoSVNfRVJSKGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN1cHBseV9tYXAiLCAwNDQ0LCBkZWJ1Z2ZzX3Jvb3QsCisJCQkJICAgICAgIE5VTEwsICZzdXBwbHlfbWFwX2ZvcHMpKSkKKwkJcHJfd2FybigicmVndWxhdG9yOiBGYWlsZWQgdG8gY3JlYXRlIHN1cHBsaWVzIGRlYnVnZnNcbiIpOwogI2VuZGlmCiAKIAlyZWd1bGF0b3JfZHVtbXlfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDN4LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYwppbmRleCAzNjJlMDgyLi5lMjNkZGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RiODUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKaW5kZXggMmJiOGY0NS4uNzgzMjk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGI4NTAwLXByY211LmMKQEAgLTEzLDEwICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2RiODUwMC1wcmNtdS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYng1MDAtcHJjbXUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBwb3dlciBzdGF0ZSByZWZlcmVuY2UgY291bnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCmluZGV4IGY2ZWY2NjkuLmI4ZjUyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jCmluZGV4IDJmZTlkOTljLi4yMWVjZjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9maXhlZC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2ZpeGVkLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhY2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBncGlvLXJlZ3VsYXRvci5jCisgKgorICogQ29weXJpZ2h0IDIwMTEgSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4KKyAqCisgKiBiYXNlZCBvbiBmaXhlZC5jCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogUm9nZXIgUXVhZHJvcyA8ZXh0LXJvZ2VyLnF1YWRyb3NAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHN5c3RlbXMgd2l0aCBtaXhlZCBjb250cm9sbGFibGUgYW5kCisgKiBub24tY29udHJvbGxhYmxlIHJlZ3VsYXRvcnMsIGFzIHdlbGwgYXMgZm9yIGFsbG93aW5nIHRlc3Rpbmcgb24KKyAqIHN5c3RlbXMgd2l0aCBubyBjb250cm9sbGFibGUgcmVndWxhdG9ycy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZ3Bpby1yZWd1bGF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhIHsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2OworCisJaW50IGVuYWJsZV9ncGlvOworCWJvb2wgZW5hYmxlX2hpZ2g7CisJYm9vbCBpc19lbmFibGVkOworCXVuc2lnbmVkIHN0YXJ0dXBfZGVsYXk7CisKKwlzdHJ1Y3QgZ3BpbyAqZ3Bpb3M7CisJaW50IG5yX2dwaW9zOworCisJc3RydWN0IGdwaW9fcmVndWxhdG9yX3N0YXRlICpzdGF0ZXM7CisJaW50IG5yX3N0YXRlczsKKworCWludCBzdGF0ZTsKK307CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGRhdGEtPmlzX2VuYWJsZWQ7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEgKmRhdGEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZ3Bpb19pc192YWxpZChkYXRhLT5lbmFibGVfZ3BpbykpIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZGF0YS0+ZW5hYmxlX2dwaW8sIGRhdGEtPmVuYWJsZV9oaWdoKTsKKwkJZGF0YS0+aXNfZW5hYmxlZCA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGdwaW9faXNfdmFsaWQoZGF0YS0+ZW5hYmxlX2dwaW8pKSB7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPmVuYWJsZV9ncGlvLCAhZGF0YS0+ZW5hYmxlX2hpZ2gpOworCQlkYXRhLT5pc19lbmFibGVkID0gZmFsc2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3JfZW5hYmxlX3RpbWUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfZGF0YSAqZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBkYXRhLT5zdGFydHVwX2RlbGF5OworfQorCitzdGF0aWMgaW50IGdwaW9fcmVndWxhdG9yX2dldF92YWx1ZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBwdHI7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IGRhdGEtPm5yX3N0YXRlczsgcHRyKyspCisJCWlmIChkYXRhLT5zdGF0ZXNbcHRyXS5ncGlvcyA9PSBkYXRhLT5zdGF0ZSkKKwkJCXJldHVybiBkYXRhLT5zdGF0ZXNbcHRyXS52YWx1ZTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdwaW9fcmVndWxhdG9yX3NldF92YWx1ZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQlpbnQgbWluLCBpbnQgbWF4KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkYXRhID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBwdHIsIHRhcmdldCwgc3RhdGU7CisKKwl0YXJnZXQgPSAtMTsKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IGRhdGEtPm5yX3N0YXRlczsgcHRyKyspCisJCWlmIChkYXRhLT5zdGF0ZXNbcHRyXS52YWx1ZSA+PSBtaW4gJiYKKwkJICAgIGRhdGEtPnN0YXRlc1twdHJdLnZhbHVlIDw9IG1heCkKKwkJCXRhcmdldCA9IGRhdGEtPnN0YXRlc1twdHJdLmdwaW9zOworCisJaWYgKHRhcmdldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBkYXRhLT5ucl9ncGlvczsgcHRyKyspIHsKKwkJc3RhdGUgPSAodGFyZ2V0ICYgKDEgPDwgcHRyKSkgPj4gcHRyOworCQlncGlvX3NldF92YWx1ZShkYXRhLT5ncGlvc1twdHJdLmdwaW8sIHN0YXRlKTsKKwl9CisJZGF0YS0+c3RhdGUgPSB0YXJnZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCQl1bnNpZ25lZCAqc2VsZWN0b3IpCit7CisJcmV0dXJuIGdwaW9fcmVndWxhdG9yX3NldF92YWx1ZShkZXYsIG1pbl91ViwgbWF4X3VWKTsKK30KKworc3RhdGljIGludCBncGlvX3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3JfZGF0YSAqZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChzZWxlY3RvciA+PSBkYXRhLT5ucl9zdGF0ZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRhdGEtPnN0YXRlc1tzZWxlY3Rvcl0udmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19yZWd1bGF0b3Jfc2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJaW50IG1pbl91QSwgaW50IG1heF91QSkKK3sKKwlyZXR1cm4gZ3Bpb19yZWd1bGF0b3Jfc2V0X3ZhbHVlKGRldiwgbWluX3VBLCBtYXhfdUEpOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgZ3Bpb19yZWd1bGF0b3Jfdm9sdGFnZV9vcHMgPSB7CisJLmlzX2VuYWJsZWQgPSBncGlvX3JlZ3VsYXRvcl9pc19lbmFibGVkLAorCS5lbmFibGUgPSBncGlvX3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUgPSBncGlvX3JlZ3VsYXRvcl9kaXNhYmxlLAorCS5lbmFibGVfdGltZSA9IGdwaW9fcmVndWxhdG9yX2VuYWJsZV90aW1lLAorCS5nZXRfdm9sdGFnZSA9IGdwaW9fcmVndWxhdG9yX2dldF92YWx1ZSwKKwkuc2V0X3ZvbHRhZ2UgPSBncGlvX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZSwKKwkubGlzdF92b2x0YWdlID0gZ3Bpb19yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGdwaW9fcmVndWxhdG9yX2N1cnJlbnRfb3BzID0geworCS5pc19lbmFibGVkID0gZ3Bpb19yZWd1bGF0b3JfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gZ3Bpb19yZWd1bGF0b3JfZW5hYmxlLAorCS5kaXNhYmxlID0gZ3Bpb19yZWd1bGF0b3JfZGlzYWJsZSwKKwkuZW5hYmxlX3RpbWUgPSBncGlvX3JlZ3VsYXRvcl9lbmFibGVfdGltZSwKKwkuZ2V0X2N1cnJlbnRfbGltaXQgPSBncGlvX3JlZ3VsYXRvcl9nZXRfdmFsdWUsCisJLnNldF9jdXJyZW50X2xpbWl0ID0gZ3Bpb19yZWd1bGF0b3Jfc2V0X2N1cnJlbnRfbGltaXQsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9jb25maWcgKmNvbmZpZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhOworCWludCBwdHIsIHJldCwgc3RhdGU7CisKKwlkcnZkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fcmVndWxhdG9yX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRydmRhdGEtPmRlc2MubmFtZSA9IGtzdHJkdXAoY29uZmlnLT5zdXBwbHlfbmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRydmRhdGEtPmRlc2MubmFtZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdXBwbHkgbmFtZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRydmRhdGEtPmdwaW9zID0ga21lbWR1cChjb25maWctPmdwaW9zLAorCQkJCSBjb25maWctPm5yX2dwaW9zICogc2l6ZW9mKHN0cnVjdCBncGlvKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKGRydmRhdGEtPmdwaW9zID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGdwaW8gZGF0YVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX25hbWU7CisJfQorCisJZHJ2ZGF0YS0+c3RhdGVzID0ga21lbWR1cChjb25maWctPnN0YXRlcywKKwkJCQkgIGNvbmZpZy0+bnJfc3RhdGVzICoKKwkJCQkJIHNpemVvZihzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3Jfc3RhdGUpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKGRydmRhdGEtPnN0YXRlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0ZSBkYXRhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfbWVtZ3BpbzsKKwl9CisJZHJ2ZGF0YS0+bnJfc3RhdGVzID0gY29uZmlnLT5ucl9zdGF0ZXM7CisKKwlkcnZkYXRhLT5kZXNjLm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkvKiBoYW5kbGUgcmVndWxhdG9yIHR5cGUqLworCXN3aXRjaCAoY29uZmlnLT50eXBlKSB7CisJY2FzZSBSRUdVTEFUT1JfVk9MVEFHRToKKwkJZHJ2ZGF0YS0+ZGVzYy50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CisJCWRydmRhdGEtPmRlc2Mub3BzID0gJmdwaW9fcmVndWxhdG9yX3ZvbHRhZ2Vfb3BzOworCQlkcnZkYXRhLT5kZXNjLm5fdm9sdGFnZXMgPSBjb25maWctPm5yX3N0YXRlczsKKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfQ1VSUkVOVDoKKwkJZHJ2ZGF0YS0+ZGVzYy50eXBlID0gUkVHVUxBVE9SX0NVUlJFTlQ7CisJCWRydmRhdGEtPmRlc2Mub3BzID0gJmdwaW9fcmVndWxhdG9yX2N1cnJlbnRfb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyByZWd1bGF0b3IgdHlwZSBzZXRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9tZW1ncGlvOworCQlicmVhazsKKwl9CisKKwlkcnZkYXRhLT5lbmFibGVfZ3BpbyA9IGNvbmZpZy0+ZW5hYmxlX2dwaW87CisJZHJ2ZGF0YS0+c3RhcnR1cF9kZWxheSA9IGNvbmZpZy0+c3RhcnR1cF9kZWxheTsKKworCWlmIChncGlvX2lzX3ZhbGlkKGNvbmZpZy0+ZW5hYmxlX2dwaW8pKSB7CisJCWRydmRhdGEtPmVuYWJsZV9oaWdoID0gY29uZmlnLT5lbmFibGVfaGlnaDsKKworCQlyZXQgPSBncGlvX3JlcXVlc3QoY29uZmlnLT5lbmFibGVfZ3BpbywgY29uZmlnLT5zdXBwbHlfbmFtZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgICJDb3VsZCBub3Qgb2J0YWluIHJlZ3VsYXRvciBlbmFibGUgR1BJTyAlZDogJWRcbiIsCisJCQkJCQljb25maWctPmVuYWJsZV9ncGlvLCByZXQpOworCQkJZ290byBlcnJfbWVtc3RhdGU7CisJCX0KKworCQkvKiBzZXQgb3V0cHV0IGRpcmVjdGlvbiB3aXRob3V0IGNoYW5naW5nIHN0YXRlCisJCSAqIHRvIHByZXZlbnQgZ2xpdGNoCisJCSAqLworCQlpZiAoY29uZmlnLT5lbmFibGVkX2F0X2Jvb3QpIHsKKwkJCWRydmRhdGEtPmlzX2VuYWJsZWQgPSB0cnVlOworCQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNvbmZpZy0+ZW5hYmxlX2dwaW8sCisJCQkJCQkgICAgY29uZmlnLT5lbmFibGVfaGlnaCk7CisJCX0gZWxzZSB7CisJCQlkcnZkYXRhLT5pc19lbmFibGVkID0gZmFsc2U7CisJCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoY29uZmlnLT5lbmFibGVfZ3BpbywKKwkJCQkJCSAgICAhY29uZmlnLT5lbmFibGVfaGlnaCk7CisJCX0KKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkgICAiQ291bGQgbm90IGNvbmZpZ3VyZSByZWd1bGF0b3IgZW5hYmxlIEdQSU8gJWQgZGlyZWN0aW9uOiAlZFxuIiwKKwkJCQkJCWNvbmZpZy0+ZW5hYmxlX2dwaW8sIHJldCk7CisJCQlnb3RvIGVycl9lbmFibGVncGlvOworCQl9CisJfSBlbHNlIHsKKwkJLyogUmVndWxhdG9yIHdpdGhvdXQgR1BJTyBjb250cm9sIGlzIGNvbnNpZGVyZWQKKwkJICogYWx3YXlzIGVuYWJsZWQKKwkJICovCisJCWRydmRhdGEtPmlzX2VuYWJsZWQgPSB0cnVlOworCX0KKworCWRydmRhdGEtPm5yX2dwaW9zID0gY29uZmlnLT5ucl9ncGlvczsKKwlyZXQgPSBncGlvX3JlcXVlc3RfYXJyYXkoZHJ2ZGF0YS0+Z3Bpb3MsIGRydmRhdGEtPm5yX2dwaW9zKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJICAgIkNvdWxkIG5vdCBvYnRhaW4gcmVndWxhdG9yIHNldHRpbmcgR1BJT3M6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9lbmFibGVncGlvOworCX0KKworCS8qIGJ1aWxkIGluaXRpYWwgc3RhdGUgZnJvbSBncGlvIGluaXQgZGF0YS4gKi8KKwlzdGF0ZSA9IDA7CisJZm9yIChwdHIgPSAwOyBwdHIgPCBkcnZkYXRhLT5ucl9ncGlvczsgcHRyKyspIHsKKwkJaWYgKGNvbmZpZy0+Z3Bpb3NbcHRyXS5mbGFncyAmIEdQSU9GX09VVF9JTklUX0hJR0gpCisJCQlzdGF0ZSB8PSAoMSA8PCBwdHIpOworCX0KKwlkcnZkYXRhLT5zdGF0ZSA9IHN0YXRlOworCisJZHJ2ZGF0YS0+ZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZkcnZkYXRhLT5kZXNjLCAmcGRldi0+ZGV2LAorCQkJCQkgIGNvbmZpZy0+aW5pdF9kYXRhLCBkcnZkYXRhKTsKKwlpZiAoSVNfRVJSKGRydmRhdGEtPmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5kZXYpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfc3RhdGVncGlvOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydmRhdGEpOworCisJcmV0dXJuIDA7CisKK2Vycl9zdGF0ZWdwaW86CisJZ3Bpb19mcmVlX2FycmF5KGRydmRhdGEtPmdwaW9zLCBkcnZkYXRhLT5ucl9ncGlvcyk7CitlcnJfZW5hYmxlZ3BpbzoKKwlpZiAoZ3Bpb19pc192YWxpZChjb25maWctPmVuYWJsZV9ncGlvKSkKKwkJZ3Bpb19mcmVlKGNvbmZpZy0+ZW5hYmxlX2dwaW8pOworZXJyX21lbXN0YXRlOgorCWtmcmVlKGRydmRhdGEtPnN0YXRlcyk7CitlcnJfbWVtZ3BpbzoKKwlrZnJlZShkcnZkYXRhLT5ncGlvcyk7CitlcnJfbmFtZToKKwlrZnJlZShkcnZkYXRhLT5kZXNjLm5hbWUpOworZXJyOgorCWtmcmVlKGRydmRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGdwaW9fcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9kYXRhICpkcnZkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZWd1bGF0b3JfdW5yZWdpc3RlcihkcnZkYXRhLT5kZXYpOworCisJZ3Bpb19mcmVlX2FycmF5KGRydmRhdGEtPmdwaW9zLCBkcnZkYXRhLT5ucl9ncGlvcyk7CisKKwlrZnJlZShkcnZkYXRhLT5zdGF0ZXMpOworCWtmcmVlKGRydmRhdGEtPmdwaW9zKTsKKworCWlmIChncGlvX2lzX3ZhbGlkKGRydmRhdGEtPmVuYWJsZV9ncGlvKSkKKwkJZ3Bpb19mcmVlKGRydmRhdGEtPmVuYWJsZV9ncGlvKTsKKworCWtmcmVlKGRydmRhdGEtPmRlc2MubmFtZSk7CisJa2ZyZWUoZHJ2ZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19yZWd1bGF0b3JfZHJpdmVyID0geworCS5wcm9iZQkJPSBncGlvX3JlZ3VsYXRvcl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGdwaW9fcmVndWxhdG9yX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJncGlvLXJlZ3VsYXRvciIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3Bpb19yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdwaW9fcmVndWxhdG9yX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoZ3Bpb19yZWd1bGF0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncGlvX3JlZ3VsYXRvcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwaW9fcmVndWxhdG9yX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChncGlvX3JlZ3VsYXRvcl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZ3BpbyB2b2x0YWdlIHJlZ3VsYXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvLXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwppbmRleCAwZjIyZWYxLi43MmIxNmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbHAzOTcxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYwppbmRleCA2YWExYjUwLi5mYmM1ZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbHAzOTcyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKaW5kZXggMzBlYjllNS4uMTA2MmNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJcmV0ID0gKHJldCAmIE1BWDg2NDlfUkFNUF9NQVNLKSA+PiA1OwogCXJhdGUgPSAoMzIgKiAxMDAwKSA+PiByZXQ7CS8qIHVWL3VTICovCiAKLQlyZXR1cm4gKHZvbHRhZ2UgLyByYXRlKTsKKwlyZXR1cm4gRElWX1JPVU5EX1VQKHZvbHRhZ2UsIHJhdGUpOwogfQogCiBzdGF0aWMgaW50IG1heDg2NDlfc2V0X21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIHVuc2lnbmVkIGludCBtb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKaW5kZXggZTRkYmQ2Ni4uY2M5ZWMwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYwpAQCAtOSw2ICs5LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCmluZGV4IDQ4NmVkODEuLjM4ODNkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21heDg5NTIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ3LDcgKzQ2LDYgQEAKIHN0cnVjdCBtYXg4OTUyX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IGRldmljZQkJKmRldjsKLQlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCXN0cnVjdCBtYXg4OTUyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfZGV2CSpyZGV2OwogCkBAIC0yMDgsNyArMjA2LDYgQEAKIAltYXg4OTUyLT5jbGllbnQgPSBjbGllbnQ7CiAJbWF4ODk1Mi0+ZGV2ID0gJmNsaWVudC0+ZGV2OwogCW1heDg5NTItPnBkYXRhID0gcGRhdGE7Ci0JbXV0ZXhfaW5pdCgmbWF4ODk1Mi0+bXV0ZXgpOwogCiAJbWF4ODk1Mi0+cmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcmVndWxhdG9yLCBtYXg4OTUyLT5kZXYsCiAJCQkmcGRhdGEtPnJlZ19kYXRhLCBtYXg4OTUyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTcuYwppbmRleCBhZDY2MjhjLi42MTc2MTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5Ny5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTM3ODMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzNzgzLXJlZ3VsYXRvci5jCmluZGV4IDczMGY0M2EuLjg0NzkwODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTM3ODMtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzc4My1yZWd1bGF0b3IuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAibWMxM3h4eC5oIgogCiAjZGVmaW5lIE1DMTM3ODNfUkVHX1NXSVRDSEVSUzUJCQkyOQpAQCAtMzM2LDkgKzMzNyw5IEBACiB7CiAJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXY7CiAJc3RydWN0IG1jMTN4eHggKm1jMTM3ODMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQogCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CiAJaW50IGksIHJldDsKIAogCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGlkICVkXG4iLCBfX2Z1bmNfXywgcGRldi0+aWQpOwpAQCAtMzgxLDcgKzM4Miw3IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYzEzNzgzX3JlZ3VsYXRvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KIAkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzg5Mi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTM4OTItcmVndWxhdG9yLmMKaW5kZXggMzI4NWQ0MS4uMDIzZDE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzg5Mi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzODkyLXJlZ3VsYXRvci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtYzEzeHh4LmgiCiAKICNkZWZpbmUgTUMxMzg5Ml9SRVZJU0lPTgkJCTcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYwppbmRleCBiYzI3YWIxLi42NTMyODUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtYzEzeHh4LmgiCiAKIHN0YXRpYyBpbnQgbWMxM3h4eF9yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwMjMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYwppbmRleCA3MDFhNTkwLi45ZmI0YzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYwpAQCAtNjMsNiArNjMsMTMgQEAKICNkZWZpbmUgVFBTNjUwMjNfUkVHX0NUUkxfTERPMl9FTglCSVQoMikKICNkZWZpbmUgVFBTNjUwMjNfUkVHX0NUUkxfTERPMV9FTglCSVQoMSkKIAorLyogUkVHX0NUUkwyIGJpdGZpZWxkcyAqLworI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTDJfR08JCUJJVCg3KQorI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTDJfQ09SRV9BREoJQklUKDYpCisjZGVmaW5lIFRQUzY1MDIzX1JFR19DVFJMMl9EQ0RDMglCSVQoMikKKyNkZWZpbmUgVFBTNjUwMjNfUkVHX0NUUkwyX0RDREMxCUJJVCgxKQorI2RlZmluZSBUUFM2NTAyM19SRUdfQ1RSTDJfRENEQzMJQklUKDApCisKIC8qIExET19DVFJMIGJpdGZpZWxkcyAqLwogI2RlZmluZSBUUFM2NTAyM19MRE9fQ1RSTF9MRE94X1NISUZUKGxkb19pZCkJKChsZG9faWQpKjQpCiAjZGVmaW5lIFRQUzY1MDIzX0xET19DVFJMX0xET3hfTUFTSyhsZG9faWQpCSgweEYwID4+ICgobGRvX2lkKSo0KSkKQEAgLTg1LDcgKzkyLDcgQEAKICNkZWZpbmUgVFBTNjUwMjNfTUFYX1JFR19JRAkJVFBTNjUwMjNfTERPXzIKIAogLyogU3VwcG9ydGVkIHZvbHRhZ2UgdmFsdWVzIGZvciByZWd1bGF0b3JzICovCi1zdGF0aWMgY29uc3QgdTE2IFZEQ0RDMV9WU0VMX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3QgdTE2IFZDT1JFX1ZTRUxfdGFibGVbXSA9IHsKIAk4MDAsIDgyNSwgODUwLCA4NzUsCiAJOTAwLCA5MjUsIDk1MCwgOTc1LAogCTEwMDAsIDEwMjUsIDEwNTAsIDEwNzUsCkBAIC05NiwyMCArMTAzLDI5IEBACiAJMTUwMCwgMTUyNSwgMTU1MCwgMTYwMCwKIH07CiAKLXN0YXRpYyBjb25zdCB1MTYgTERPMV9WU0VMX3RhYmxlW10gPSB7CisvKiBTdXBwb3J0ZWQgdm9sdGFnZSB2YWx1ZXMgZm9yIExETyByZWd1bGF0b3JzIGZvciB0cHM2NTAyMCAqLworc3RhdGljIGNvbnN0IHUxNiBUUFM2NTAyMF9MRE8xX1ZTRUxfdGFibGVbXSA9IHsKKwkxMDAwLCAxMDUwLCAxMTAwLCAxMzAwLAorCTE4MDAsIDI1MDAsIDMwMDAsIDMzMDAsCit9OworCitzdGF0aWMgY29uc3QgdTE2IFRQUzY1MDIwX0xETzJfVlNFTF90YWJsZVtdID0geworCTEwMDAsIDEwNTAsIDExMDAsIDEzMDAsCisJMTgwMCwgMjUwMCwgMzAwMCwgMzMwMCwKK307CisKKy8qIFN1cHBvcnRlZCB2b2x0YWdlIHZhbHVlcyBmb3IgTERPIHJlZ3VsYXRvcnMKKyAqIGZvciB0cHM2NTAyMSBhbmQgdHBzNjUwMjMgKi8KK3N0YXRpYyBjb25zdCB1MTYgVFBTNjUwMjNfTERPMV9WU0VMX3RhYmxlW10gPSB7CiAJMTAwMCwgMTEwMCwgMTMwMCwgMTgwMCwKIAkyMjAwLCAyNjAwLCAyODAwLCAzMTUwLAogfTsKIAotc3RhdGljIGNvbnN0IHUxNiBMRE8yX1ZTRUxfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCB1MTYgVFBTNjUwMjNfTERPMl9WU0VMX3RhYmxlW10gPSB7CiAJMTA1MCwgMTIwMCwgMTMwMCwgMTgwMCwKIAkyNTAwLCAyODAwLCAzMDAwLCAzMzAwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBudW1fdm9sdGFnZXNbXSA9IHtBUlJBWV9TSVpFKFZEQ0RDMV9WU0VMX3RhYmxlKSwKLQkJCQkwLCAwLCBBUlJBWV9TSVpFKExETzFfVlNFTF90YWJsZSksCi0JCQkJQVJSQVlfU0laRShMRE8yX1ZTRUxfdGFibGUpfTsKLQogLyogUmVndWxhdG9yIHNwZWNpZmljIGRldGFpbHMgKi8KIHN0cnVjdCB0cHNfaW5mbyB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTEyNyw2ICsxNDMsMTMgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltUUFM2NTAyM19OVU1fUkVHVUxBVE9SXTsKIAljb25zdCBzdHJ1Y3QgdHBzX2luZm8gKmluZm9bVFBTNjUwMjNfTlVNX1JFR1VMQVRPUl07CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXU4IGNvcmVfcmVndWxhdG9yOworfTsKKworLyogU3RydWN0IHBhc3NlZCBhcyBkcml2ZXIgZGF0YSAqLworc3RydWN0IHRwc19kcml2ZXJfZGF0YSB7CisJY29uc3Qgc3RydWN0IHRwc19pbmZvICppbmZvOworCXU4IGNvcmVfcmVndWxhdG9yOwogfTsKIAogc3RhdGljIGludCB0cHNfNjUwMjNfc2V0X2JpdHMoc3RydWN0IHRwc19wbWljICp0cHMsIHU4IHJlZywgdTggbWFzaykKQEAgLTI1Myw3ICsyNzYsNyBAQAogCWlmIChkY2RjIDwgVFBTNjUwMjNfRENEQ18xIHx8IGRjZGMgPiBUUFM2NTAyM19EQ0RDXzMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRjZGMgPT0gVFBTNjUwMjNfRENEQ18xKSB7CisJaWYgKGRjZGMgPT0gdHBzLT5jb3JlX3JlZ3VsYXRvcikgewogCQlkYXRhID0gdHBzXzY1MDIzX3JlZ19yZWFkKHRwcywgVFBTNjUwMjNfUkVHX0RFRl9DT1JFKTsKIAkJaWYgKGRhdGEgPCAwKQogCQkJcmV0dXJuIGRhdGE7CkBAIC0yNzAsMTAgKzI5MywxMCBAQAogCXN0cnVjdCB0cHNfcG1pYyAqdHBzID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBkY2RjID0gcmRldl9nZXRfaWQoZGV2KTsKIAlpbnQgdnNlbDsKKwlpbnQgcmV0OwogCi0JaWYgKGRjZGMgIT0gVFBTNjUwMjNfRENEQ18xKQorCWlmIChkY2RjICE9IHRwcy0+Y29yZV9yZWd1bGF0b3IpCiAJCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKG1pbl91ViA8IHRwcy0+aW5mb1tkY2RjXS0+bWluX3VWCiAJCQl8fCBtaW5fdVYgPiB0cHMtPmluZm9bZGNkY10tPm1heF91VikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yOTIsMTEgKzMxNSwyMSBAQAogCiAJKnNlbGVjdG9yID0gdnNlbDsKIAotCS8qIHdyaXRlIHRvIHRoZSByZWdpc3RlciBpbiBjYXNlIHdlIGZvdW5kIGEgbWF0Y2ggKi8KIAlpZiAodnNlbCA9PSB0cHMtPmluZm9bZGNkY10tPnRhYmxlX2xlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlyZXR1cm4gdHBzXzY1MDIzX3JlZ193cml0ZSh0cHMsIFRQUzY1MDIzX1JFR19ERUZfQ09SRSwgdnNlbCk7CisJCWdvdG8gZmFpbGVkOworCisJcmV0ID0gdHBzXzY1MDIzX3JlZ193cml0ZSh0cHMsIFRQUzY1MDIzX1JFR19ERUZfQ09SRSwgdnNlbCk7CisKKwkvKiBUZWxsIHRoZSBjaGlwIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIHRoZSB2YWx1ZSBpbiBERUZDT1JFCisJICogYW5kIGl0cyB0aW1lIHRvIHVwZGF0ZSB0aGUgY29yZSB2b2x0YWdlCisJICovCisJdHBzXzY1MDIzX3NldF9iaXRzKHRwcywgVFBTNjUwMjNfUkVHX0NPTl9DVFJMMiwKKwkJCQkJCVRQUzY1MDIzX1JFR19DVFJMMl9HTyk7CisKKwlyZXR1cm4gcmV0OworCitmYWlsZWQ6CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgdHBzNjUwMjNfbGRvX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCkBAIC0zNjIsNyArMzk1LDcgQEAKIAlpZiAoZGNkYyA8IFRQUzY1MDIzX0RDRENfMSB8fCBkY2RjID4gVFBTNjUwMjNfRENEQ18zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChkY2RjID09IFRQUzY1MDIzX0RDRENfMSkgeworCWlmIChkY2RjID09IHRwcy0+Y29yZV9yZWd1bGF0b3IpIHsKIAkJaWYgKHNlbGVjdG9yID49IHRwcy0+aW5mb1tkY2RjXS0+dGFibGVfbGVuKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWVsc2UKQEAgLTQxNCw3ICs0NDcsOCBAQAogc3RhdGljIGludCBfX2RldmluaXQgdHBzXzY1MDIzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0JY29uc3Qgc3RydWN0IHRwc19pbmZvICppbmZvID0gKHZvaWQgKilpZC0+ZHJpdmVyX2RhdGE7CisJY29uc3Qgc3RydWN0IHRwc19kcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSAodm9pZCAqKWlkLT5kcml2ZXJfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdHBzX2luZm8gKmluZm8gPSBkcnZfZGF0YS0+aW5mbzsKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOwogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCXN0cnVjdCB0cHNfcG1pYyAqdHBzOwpAQCAtNDQ2LDYgKzQ4MCw3IEBACiAKIAkvKiBjb21tb24gZm9yIGFsbCByZWd1bGF0b3JzICovCiAJdHBzLT5jbGllbnQgPSBjbGllbnQ7CisJdHBzLT5jb3JlX3JlZ3VsYXRvciA9IGRydl9kYXRhLT5jb3JlX3JlZ3VsYXRvcjsKIAogCWZvciAoaSA9IDA7IGkgPCBUUFM2NTAyM19OVU1fUkVHVUxBVE9SOyBpKyssIGluZm8rKywgaW5pdF9kYXRhKyspIHsKIAkJLyogU3RvcmUgcmVndWxhdG9yIHNwZWNpZmljIGluZm9ybWF0aW9uICovCkBAIC00NTMsNyArNDg4LDcgQEAKIAogCQl0cHMtPmRlc2NbaV0ubmFtZSA9IGluZm8tPm5hbWU7CiAJCXRwcy0+ZGVzY1tpXS5pZCA9IGk7Ci0JCXRwcy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gbnVtX3ZvbHRhZ2VzW2ldOworCQl0cHMtPmRlc2NbaV0ubl92b2x0YWdlcyA9IGluZm8tPnRhYmxlX2xlbjsKIAkJdHBzLT5kZXNjW2ldLm9wcyA9IChpID4gVFBTNjUwMjNfRENEQ18zID8KIAkJCQkJJnRwczY1MDIzX2xkb19vcHMgOiAmdHBzNjUwMjNfZGNkY19vcHMpOwogCQl0cHMtPmRlc2NbaV0udHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOwpAQCAtNDc1LDYgKzUxMCwxNCBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdHBzKTsKIAorCS8qIEVuYWJsZSBzZXR0aW5nIG91dHB1dCB2b2x0YWdlIGJ5IEkyQyAqLworCXRwc182NTAyM19jbGVhcl9iaXRzKHRwcywgVFBTNjUwMjNfUkVHX0NPTl9DVFJMMiwKKwkJCQkJCVRQUzY1MDIzX1JFR19DVFJMMl9DT1JFX0FESik7CisKKwkvKiBFbmFibGUgc2V0dGluZyBvdXRwdXQgdm9sdGFnZSBieSBJMkMgKi8KKwl0cHNfNjUwMjNfY2xlYXJfYml0cyh0cHMsIFRQUzY1MDIzX1JFR19DT05fQ1RSTDIsCisJCQkJCQlUUFM2NTAyM19SRUdfQ1RSTDJfQ09SRV9BREopOworCiAJcmV0dXJuIDA7CiAKICBmYWlsOgpAQCAtNTA3LDEzICs1NTAsODYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB0cHNfaW5mbyB0cHM2NTAyMF9yZWdzW10gPSB7CisJeworCQkubmFtZSA9ICJWRENEQzEiLAorCQkubWluX3VWID0gMzMwMDAwMCwKKwkJLm1heF91ViA9IDMzMDAwMDAsCisJCS5maXhlZAk9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZEQ0RDMiIsCisJCS5taW5fdVYgPSAgMTgwMDAwMCwKKwkJLm1heF91ViA9IDE4MDAwMDAsCisJCS5maXhlZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZEQ0RDMyIsCisJCS5taW5fdVYgPSAgODAwMDAwLAorCQkubWF4X3VWID0gMTYwMDAwMCwKKwkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoVkNPUkVfVlNFTF90YWJsZSksCisJCS50YWJsZSA9IFZDT1JFX1ZTRUxfdGFibGUsCisJfSwKKworCXsKKwkJLm5hbWUgPSAiTERPMSIsCisJCS5taW5fdVYgPSAxMDAwMDAwLAorCQkubWF4X3VWID0gMzE1MDAwMCwKKwkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoVFBTNjUwMjBfTERPMV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVFBTNjUwMjBfTERPMV9WU0VMX3RhYmxlLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8yIiwKKwkJLm1pbl91ViA9IDEwNTAwMDAsCisJCS5tYXhfdVYgPSAzMzAwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShUUFM2NTAyMF9MRE8yX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBUUFM2NTAyMF9MRE8yX1ZTRUxfdGFibGUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBzX2luZm8gdHBzNjUwMjFfcmVnc1tdID0geworCXsKKwkJLm5hbWUgPSAiVkRDREMxIiwKKwkJLm1pbl91ViA9ICAzMzAwMDAwLAorCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJLmZpeGVkID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVkRDREMyIiwKKwkJLm1pbl91ViA9ICAxODAwMDAwLAorCQkubWF4X3VWID0gMTgwMDAwMCwKKwkJLmZpeGVkID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVkRDREMzIiwKKwkJLm1pbl91ViA9ICA4MDAwMDAsCisJCS5tYXhfdVYgPSAxNjAwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShWQ09SRV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVkNPUkVfVlNFTF90YWJsZSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPMSIsCisJCS5taW5fdVYgPSAxMDAwMDAwLAorCQkubWF4X3VWID0gMzE1MDAwMCwKKwkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoVFBTNjUwMjNfTERPMV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVFBTNjUwMjNfTERPMV9WU0VMX3RhYmxlLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8yIiwKKwkJLm1pbl91ViA9IDEwNTAwMDAsCisJCS5tYXhfdVYgPSAzMzAwMDAwLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShUUFM2NTAyM19MRE8yX1ZTRUxfdGFibGUpLAorCQkudGFibGUgPSBUUFM2NTAyM19MRE8yX1ZTRUxfdGFibGUsCisJfSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHBzX2luZm8gdHBzNjUwMjNfcmVnc1tdID0gewogCXsKIAkJLm5hbWUgPSAiVkRDREMxIiwKIAkJLm1pbl91ViA9ICA4MDAwMDAsCiAJCS5tYXhfdVYgPSAxNjAwMDAwLAotCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShWRENEQzFfVlNFTF90YWJsZSksCi0JCS50YWJsZSA9IFZEQ0RDMV9WU0VMX3RhYmxlLAorCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShWQ09SRV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVkNPUkVfVlNFTF90YWJsZSwKIAl9LAogCXsKIAkJLm5hbWUgPSAiVkRDREMyIiwKQEAgLTUzMSwyMyArNjQ3LDQwIEBACiAJCS5uYW1lID0gIkxETzEiLAogCQkubWluX3VWID0gMTAwMDAwMCwKIAkJLm1heF91ViA9IDMxNTAwMDAsCi0JCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKExETzFfVlNFTF90YWJsZSksCi0JCS50YWJsZSA9IExETzFfVlNFTF90YWJsZSwKKwkJLnRhYmxlX2xlbiA9IEFSUkFZX1NJWkUoVFBTNjUwMjNfTERPMV9WU0VMX3RhYmxlKSwKKwkJLnRhYmxlID0gVFBTNjUwMjNfTERPMV9WU0VMX3RhYmxlLAogCX0sCiAJewogCQkubmFtZSA9ICJMRE8yIiwKIAkJLm1pbl91ViA9IDEwNTAwMDAsCiAJCS5tYXhfdVYgPSAzMzAwMDAwLAotCQkudGFibGVfbGVuID0gQVJSQVlfU0laRShMRE8yX1ZTRUxfdGFibGUpLAotCQkudGFibGUgPSBMRE8yX1ZTRUxfdGFibGUsCisJCS50YWJsZV9sZW4gPSBBUlJBWV9TSVpFKFRQUzY1MDIzX0xETzJfVlNFTF90YWJsZSksCisJCS50YWJsZSA9IFRQUzY1MDIzX0xETzJfVlNFTF90YWJsZSwKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCB0cHNfZHJpdmVyX2RhdGEgdHBzNjUwMjBfZHJ2X2RhdGEgPSB7CisJLmluZm8gPSB0cHM2NTAyMF9yZWdzLAorCS5jb3JlX3JlZ3VsYXRvciA9IFRQUzY1MDIzX0RDRENfMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2RyaXZlcl9kYXRhIHRwczY1MDIxX2Rydl9kYXRhID0geworCQkuaW5mbyA9IHRwczY1MDIxX3JlZ3MsCisJCS5jb3JlX3JlZ3VsYXRvciA9IFRQUzY1MDIzX0RDRENfMywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2RyaXZlcl9kYXRhIHRwczY1MDIzX2Rydl9kYXRhID0geworCQkuaW5mbyA9IHRwczY1MDIzX3JlZ3MsCisJCS5jb3JlX3JlZ3VsYXRvciA9IFRQUzY1MDIzX0RDRENfMSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0cHNfNjUwMjNfaWRbXSA9IHsKIAl7Lm5hbWUgPSAidHBzNjUwMjMiLAotCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0cHM2NTAyM19yZWdzLH0sCisJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZ0cHM2NTAyM19kcnZfZGF0YX0sCiAJey5uYW1lID0gInRwczY1MDIxIiwKLQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgdHBzNjUwMjNfcmVncyx9LAorCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmdHBzNjUwMjFfZHJ2X2RhdGEsfSwKKwl7Lm5hbWUgPSAidHBzNjUwMjAiLAorCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmdHBzNjUwMjBfZHJ2X2RhdGF9LAogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMKaW5kZXggYmZmZmFiYy4uYmRlZjcwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUwN3gtcmVndWxhdG9yLmMKQEAgLTkwLDEyICs5MCw2IEBACiAJMzAwMCwgMzEwMCwgMzIwMCwgMzMwMCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3ZvbHRhZ2VzW10gPSB7QVJSQVlfU0laRShWRENEQ3hfVlNFTF90YWJsZSksCi0JCQkJQVJSQVlfU0laRShWRENEQ3hfVlNFTF90YWJsZSksCi0JCQkJQVJSQVlfU0laRShWRENEQ3hfVlNFTF90YWJsZSksCi0JCQkJQVJSQVlfU0laRShMRE8xX1ZTRUxfdGFibGUpLAotCQkJCUFSUkFZX1NJWkUoTERPMl9WU0VMX3RhYmxlKX07Ci0KIHN0cnVjdCB0cHNfaW5mbyB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBtaW5fdVY7CkBAIC01OTgsNyArNTkyLDcgQEAKIAogCQl0cHMtPmRlc2NbaV0ubmFtZSA9IGluZm8tPm5hbWU7CiAJCXRwcy0+ZGVzY1tpXS5pZCA9IGk7Ci0JCXRwcy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gbnVtX3ZvbHRhZ2VzW2ldOworCQl0cHMtPmRlc2NbaV0ubl92b2x0YWdlcyA9IGluZm8tPnRhYmxlX2xlbjsKIAkJdHBzLT5kZXNjW2ldLm9wcyA9IChpID4gVFBTNjUwN1hfRENEQ18zID8KIAkJJnRwczY1MDd4X3BtaWNfbGRvX29wcyA6ICZ0cHM2NTA3eF9wbWljX2RjZGNfb3BzKTsKIAkJdHBzLT5kZXNjW2ldLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1ODZ4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKaW5kZXggYmIwNGE3NS4uMTRiOTM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTMzMiw2ICszMzMsMzYgQEAKIAkJCQkgMSA8PCByaS0+ZW5hYmxlX2JpdFsxXSk7CiB9CiAKK3N0YXRpYyBpbnQgdHBzNjU4NnhfcmVndWxhdG9yX3NldF9zbGV3X3JhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBwZGV2LT5kZXYucGFyZW50OworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpwID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRwczY1ODZ4X3NldHRpbmdzICpzZXR0aW5nID0gcC0+ZHJpdmVyX2RhdGE7CisJdWludDhfdCByZWc7CisKKwlpZiAoc2V0dGluZyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICghKHNldHRpbmctPnNsZXdfcmF0ZSAmIFRQUzY1ODZYX1NMRVdfUkFURV9TRVQpKQorCQlyZXR1cm4gMDsKKworCS8qIG9ubHkgU00wIGFuZCBTTTEgY2FuIGhhdmUgdGhlIHNsZXcgcmF0ZSBzZXR0aW5ncyAqLworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIFRQUzY1ODZYX0lEX1NNXzA6CisJCXJlZyA9IFRQUzY1ODZYX1NNMFNMOworCQlicmVhazsKKwljYXNlIFRQUzY1ODZYX0lEX1NNXzE6CisJCXJlZyA9IFRQUzY1ODZYX1NNMVNMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiT25seSBTTTAvU00xIGNhbiBzZXQgc2xldyByYXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHRwczY1ODZ4X3dyaXRlKHBhcmVudCwgcmVnLAorCQkJc2V0dGluZy0+c2xld19yYXRlICYgVFBTNjU4NlhfU0xFV19SQVRFX01BU0spOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0cHM2NTg2eF9yZWd1bGF0b3IgKmZpbmRfcmVndWxhdG9yX2luZm8oaW50IGlkKQogewogCXN0cnVjdCB0cHM2NTg2eF9yZWd1bGF0b3IgKnJpOwpAQCAtMzc0LDcgKzQwNSw3IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByZGV2KTsKIAotCXJldHVybiAwOworCXJldHVybiB0cHM2NTg2eF9yZWd1bGF0b3Jfc2V0X3NsZXdfcmF0ZShwZGV2KTsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgdHBzNjU4NnhfcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTItcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYwppbmRleCAzYTkzMTNlLi4zOWQ0YTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYwpAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPOQkxMgogI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPMTAJMTMKIAotI2RlZmluZSBUUFM2NTkxMl9NQVhfUkVHX0lECVRQUzY1OTEyX1JFR19MRE9fMTAKLQogLyogTnVtYmVyIG9mIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGF2YWlsYWJsZSAqLwogI2RlZmluZSBUUFM2NTkxMl9OVU1fRENEQwk0CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3VzZXJzcGFjZS1jb25zdW1lci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdXNlcnNwYWNlLWNvbnN1bWVyLmMKaW5kZXggOWQ1YmE5My4uZmM2NjU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdXNlcnNwYWNlLWNvbnN1bWVyLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdXNlcnNwYWNlLWNvbnN1bWVyLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL3VzZXJzcGFjZS1jb25zdW1lci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdmlydHVhbC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdmlydHVhbC5jCmluZGV4IDY5ZTU1MGYuLjg1OGMxZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3ZpcnR1YWwuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci92aXJ0dWFsLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCB2aXJ0dWFsX2NvbnN1bWVyX2RhdGEgewogCXN0cnVjdCBtdXRleCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jCmluZGV4IDBmMTJjNzAuLjcxNjMyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODQwMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODQwMC1wcml2YXRlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwppbmRleCAxYTZhNjkwLi5iODdiZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCkBAIC0xNDAsNiArMTQwLDE0IEBACiAJCXJldHVybiAoc2VsZWN0b3IgKiAxMDAwMDApICsgOTAwMDAwOwogCWNhc2UgV004OTU4OgogCQlyZXR1cm4gKHNlbGVjdG9yICogMTAwMDAwKSArIDEwMDAwMDA7CisJY2FzZSBXTTE4MTE6CisJCXN3aXRjaCAoc2VsZWN0b3IpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gKHNlbGVjdG9yICogMTAwMDAwKSArIDk1MDAwMDsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNzAsNiArMTc4LDExIEBACiAJY2FzZSBXTTg5NTg6CiAJCXNlbGVjdG9yID0gKG1pbl91ViAtIDEwMDAwMDApIC8gMTAwMDAwOwogCQlicmVhazsKKwljYXNlIFdNMTgxMToKKwkJc2VsZWN0b3IgPSAobWluX3VWIC0gOTUwMDAwKSAvIDEwMDAwMDsKKwkJaWYgKHNlbGVjdG9yID09IDApCisJCQlzZWxlY3RvciA9IDE7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDVhNTM4ZmMuLjUzZWI0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIG1lbnVjb25maWcgUlRDX0NMQVNTCiAJYm9vbCAiUmVhbCBUaW1lIENsb2NrIgogCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gIVMzOTAKKwlkZXBlbmRzIG9uICFTMzkwICYmICFVTUwKIAlzZWxlY3QgUlRDX0xJQgogCWhlbHAKIAkgIEdlbmVyaWMgUlRDIGNsYXNzIHN1cHBvcnQuIElmIHlvdSBzYXkgeWVzIGhlcmUsIHlvdSB3aWxsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCAwMWE3ZGY1My4uZTgzMjZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvY2xhc3MuYworKysgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCkBAIC0yMSwxNiArMjEsMTMgQEAKICNpbmNsdWRlICJydGMtY29yZS5oIgogCiAKLXN0YXRpYyBERUZJTkVfSURSKHJ0Y19pZHIpOwotc3RhdGljIERFRklORV9NVVRFWChpZHJfbG9jayk7CitzdGF0aWMgREVGSU5FX0lEQShydGNfaWRhKTsKIHN0cnVjdCBjbGFzcyAqcnRjX2NsYXNzOwogCiBzdGF0aWMgdm9pZCBydGNfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7Ci0JbXV0ZXhfbG9jaygmaWRyX2xvY2spOwotCWlkcl9yZW1vdmUoJnJ0Y19pZHIsIHJ0Yy0+aWQpOwotCW11dGV4X3VubG9jaygmaWRyX2xvY2spOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZydGNfaWRhLCBydGMtPmlkKTsKIAlrZnJlZShydGMpOwogfQogCkBAIC0xNDYsMjUgKzE0MywxNiBAQAogCXN0cnVjdCBydGNfd2thbHJtIGFscm07CiAJaW50IGlkLCBlcnI7CiAKLQlpZiAoaWRyX3ByZV9nZXQoJnJ0Y19pZHIsIEdGUF9LRVJORUwpID09IDApIHsKLQkJZXJyID0gLUVOT01FTTsKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZydGNfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoaWQgPCAwKSB7CisJCWVyciA9IGlkOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0KLQltdXRleF9sb2NrKCZpZHJfbG9jayk7Ci0JZXJyID0gaWRyX2dldF9uZXcoJnJ0Y19pZHIsIE5VTEwsICZpZCk7Ci0JbXV0ZXhfdW5sb2NrKCZpZHJfbG9jayk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJZ290byBleGl0OwotCi0JaWQgPSBpZCAmIE1BWF9JRF9NQVNLOwotCiAJcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ0Y19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnRjID09IE5VTEwpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0X2lkcjsKKwkJZ290byBleGl0X2lkYTsKIAl9CiAKIAlydGMtPmlkID0gaWQ7CkBAIC0yMjIsMTAgKzIxMCw4IEBACiBleGl0X2tmcmVlOgogCWtmcmVlKHJ0Yyk7CiAKLWV4aXRfaWRyOgotCW11dGV4X2xvY2soJmlkcl9sb2NrKTsKLQlpZHJfcmVtb3ZlKCZydGNfaWRyLCBpZCk7Ci0JbXV0ZXhfdW5sb2NrKCZpZHJfbG9jayk7CitleGl0X2lkYToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmcnRjX2lkYSwgaWQpOwogCiBleGl0OgogCWRldl9lcnIoZGV2LCAicnRjIGNvcmU6IHVuYWJsZSB0byByZWdpc3RlciAlcywgZXJyID0gJWRcbiIsCkBAIC0yNzYsNyArMjYyLDcgQEAKIHsKIAlydGNfZGV2X2V4aXQoKTsKIAljbGFzc19kZXN0cm95KHJ0Y19jbGFzcyk7Ci0JaWRyX2Rlc3Ryb3koJnJ0Y19pZHIpOworCWlkYV9kZXN0cm95KCZydGNfaWRhKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKHJ0Y19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKaW5kZXggNDRlOTFlNS4uOGUyODYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZG0zNTVldm0uYyBiL2RyaXZlcnMvcnRjL3J0Yy1kbTM1NWV2bS5jCmluZGV4IDU4ZDRlMTguLjIzMjJjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kbTM1NWV2bS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kbTM1NWV2bS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pMmMvZG0zNTVldm1fbXNwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDUuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDUuYwppbmRleCA1N2ZiY2MxLi4zYTMzYjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA1LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2RzMTMwNS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKaW5kZXggYjIwMDViNC4uNjJiMDc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwpAQCAtMzQsNiArMzQsNyBAQAogCWRzXzEzODgsCiAJZHNfMzIzMSwKIAltNDF0MDAsCisJbWNwNzk0MXgsCiAJcnhfODAyNSwKIAkvLyByczVjMzcyIHRvbz8gIGRpZmZlcmVudCBhZGRyZXNzLi4uCiB9OwpAQCAtNDMsNiArNDQsNyBAQAogI2RlZmluZSBEUzEzMDdfUkVHX1NFQ1MJCTB4MDAJLyogMDAtNTkgKi8KICMJZGVmaW5lIERTMTMwN19CSVRfQ0gJCTB4ODAKICMJZGVmaW5lIERTMTM0MF9CSVRfbkVPU0MJCTB4ODAKKyMJZGVmaW5lIE1DUDc5NDFYX0JJVF9TVAkJMHg4MAogI2RlZmluZSBEUzEzMDdfUkVHX01JTgkJMHgwMQkvKiAwMC01OSAqLwogI2RlZmluZSBEUzEzMDdfUkVHX0hPVVIJCTB4MDIJLyogMDAtMjMsIG9yIDEtMTJ7YW0scG19ICovCiAjCWRlZmluZSBEUzEzMDdfQklUXzEySFIJCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KQEAgLTUwLDYgKzUyLDcgQEAKICMJZGVmaW5lIERTMTM0MF9CSVRfQ0VOVFVSWV9FTgkweDgwCS8qIGluIFJFR19IT1VSICovCiAjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUlkJMHg0MAkvKiBpbiBSRUdfSE9VUiAqLwogI2RlZmluZSBEUzEzMDdfUkVHX1dEQVkJCTB4MDMJLyogMDEtMDcgKi8KKyMJZGVmaW5lIE1DUDc5NDFYX0JJVF9WQkFURU4JMHgwOAogI2RlZmluZSBEUzEzMDdfUkVHX01EQVkJCTB4MDQJLyogMDEtMzEgKi8KICNkZWZpbmUgRFMxMzA3X1JFR19NT05USAkweDA1CS8qIDAxLTEyICovCiAjCWRlZmluZSBEUzEzMzdfQklUX0NFTlRVUlkJMHg4MAkvKiBpbiBSRUdfTU9OVEggKi8KQEAgLTEzNyw2ICsxNDAsOCBAQAogfSwKIFttNDF0MDBdID0gewogfSwKK1ttY3A3OTQxeF0gPSB7Cit9LAogW3J4XzgwMjVdID0gewogfSwgfTsKIApAQCAtMTQ5LDYgKzE1NCw3IEBACiAJeyAiZHMxMzQwIiwgZHNfMTM0MCB9LAogCXsgImRzMzIzMSIsIGRzXzMyMzEgfSwKIAl7ICJtNDF0MDAiLCBtNDF0MDAgfSwKKwl7ICJtY3A3OTQxeCIsIG1jcDc5NDF4IH0sCiAJeyAicHQ3YzQzMzgiLCBkc18xMzA3IH0sCiAJeyAicng4MDI1IiwgcnhfODAyNSB9LAogCXsgfQpAQCAtMzY1LDYgKzM3MSwxMCBAQAogCQlidWZbRFMxMzA3X1JFR19IT1VSXSB8PSBEUzEzNDBfQklUX0NFTlRVUllfRU4KIAkJCQl8IERTMTM0MF9CSVRfQ0VOVFVSWTsKIAkJYnJlYWs7CisJY2FzZSBtY3A3OTQxeDoKKwkJYnVmW0RTMTMwN19SRUdfU0VDU10gfD0gTUNQNzk0MVhfQklUX1NUOworCQlidWZbRFMxMzA3X1JFR19XREFZXSB8PSBNQ1A3OTQxWF9CSVRfVkJBVEVOOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC04MDksNiArODE5LDIzIEBACiAJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgbWNwNzk0MXg6CisJCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBiYWNrdXAgYmF0dGVyeSBpcyBlbmFibGVkICovCisJCWlmICghKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1dEQVldICYgTUNQNzk0MVhfQklUX1ZCQVRFTikpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1dEQVksCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1dEQVldCisJCQkJCXwgTUNQNzk0MVhfQklUX1ZCQVRFTik7CisJCX0KKworCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKCEodG1wICYgTUNQNzk0MVhfQklUX1NUKSkgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfU0VDUywKKwkJCQkJTUNQNzk0MVhfQklUX1NUKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CisJCQlnb3RvIHJlYWRfcnRjOworCQl9CisKKwkJYnJlYWs7CiAJY2FzZSByeF84MDI1OgogCWNhc2UgZHNfMTMzNzoKIAljYXNlIGRzXzEzMzk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKaW5kZXggNTY4YWQzMC4uNTg2YzI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNiIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCmluZGV4IGZlZTQxYjkuLjEzNTAwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwppbmRleCAwNmRmYjU0Li5hMzE5NDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40IgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKaW5kZXggZDg0YTQ0OGQuLmUzZTBmOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1lbTMwMjcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1lbTMwMjcuYwppbmRleCBkOGUxYzI1Li44NDE0ZGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZW0zMDI3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWVtMzAyNy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qIFJlZ2lzdGVycyAqLwogI2RlZmluZSBFTTMwMjdfUkVHX09OX09GRl9DVFJMCTB4MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1pc2wxMjAyMi5jIGIvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMKaW5kZXggZGRiYzc5Ny4uNjE4NjgzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWlzbDEyMDIyLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW1jMTN4eHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1tYzEzeHh4LmMKaW5kZXggYTFhMjc4Yi4uOWQwYzNiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW1jMTN4eHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG1jMTN4eHhfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9faW5pdCBtYzEzeHh4X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2OwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgbWMxM3h4eF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBtYzEzeHh4X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIApAQCAtNDEwLDcgKzQxMCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jMTN4eHhfcnRjX2RyaXZlciA9IHsKIAkuaWRfdGFibGUgPSBtYzEzeHh4X3J0Y19pZHRhYmxlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYzEzeHh4X3J0Y19yZW1vdmUpLAorCS5yZW1vdmUgPSBfX2V4aXRfcChtYzEzeHh4X3J0Y19yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJJVkVSX05BTUUsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW1yc3QuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKaW5kZXggZDMzNTQ0OC4uYmIyMWY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW1yc3QuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jCkBAIC03NiwxMiArNzYsMTUgQEAKIC8qCiAgKiBydGNfdGltZSdzIHllYXIgY29udGFpbnMgdGhlIGluY3JlbWVudCBvdmVyIDE5MDAsIGJ1dCB2UlRDJ3MgWUVBUgogICogcmVnaXN0ZXIgY2FuJ3QgYmUgcHJvZ3JhbW1lZCB0byB2YWx1ZSBsYXJnZXIgdGhhbiAweDY0LCBzbyB2UlRDCi0gKiBkcml2ZXIgY2hvc2UgdG8gdXNlIDE5NjAgKDE5NzAgaXMgVU5JWCB0aW1lIHN0YXJ0IHBvaW50KSBhcyB0aGUgYmFzZSwKKyAqIGRyaXZlciBjaG9zZSB0byB1c2UgMTk3MiAoMTk3MCBpcyBVTklYIHRpbWUgc3RhcnQgcG9pbnQpIGFzIHRoZSBiYXNlLAogICogYW5kIGRvZXMgdGhlIHRyYW5zbGF0aW9uIGF0IHJlYWQvd3JpdGUgdGltZS4KICAqCi0gKiBXaHkgbm90IGp1c3QgdXNlIDE5NzAgYXMgdGhlIG9mZnNldD8gaXQncyBiZWNhdXNlIHVzaW5nIDE5NjAgd2lsbAorICogV2h5IG5vdCBqdXN0IHVzZSAxOTcwIGFzIHRoZSBvZmZzZXQ/IGl0J3MgYmVjYXVzZSB1c2luZyAxOTcyIHdpbGwKICAqIG1ha2UgaXQgY29uc2lzdGVudCBpbiBsZWFwIHllYXIgc2V0dGluZyBmb3IgYm90aCB2cnRjIGFuZCBsb3ctbGV2ZWwKLSAqIHBoeXNpY2FsIHJ0YyBkZXZpY2VzLgorICogcGh5c2ljYWwgcnRjIGRldmljZXMuIFRoZW4gd2h5IG5vdCB1c2UgMTk2MCBhcyB0aGUgb2Zmc2V0PyBJZiB3ZSB1c2UKKyAqIDE5NjAsIGZvciBhIGRldmljZSdzIGZpcnN0IHVzZSwgaXRzIFlFQVIgcmVnaXN0ZXIgaXMgMCBhbmQgdGhlIHN5c3RlbQorICogeWVhciB3aWxsIGJlIHBhcnNlZCBhcyAxOTYwIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVOSVggdGltZSBhbmQgd2lsbAorICogY2F1c2UgbWFueSBhcHBsaWNhdGlvbnMgdG8gZmFpbCBteXN0ZXJpb3VzbHkuCiAgKi8KIHN0YXRpYyBpbnQgbXJzdF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCiB7CkBAIC05OSwxMCArMTAyLDEwIEBACiAJdGltZS0+dG1feWVhciA9IHZydGNfY21vc19yZWFkKFJUQ19ZRUFSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwogCi0JLyogQWRqdXN0IGZvciB0aGUgMTk2MC8xOTAwICovCi0JdGltZS0+dG1feWVhciArPSA2MDsKKwkvKiBBZGp1c3QgZm9yIHRoZSAxOTcyLzE5MDAgKi8KKwl0aW1lLT50bV95ZWFyICs9IDcyOwogCXRpbWUtPnRtX21vbi0tOwotCXJldHVybiBSVENfMjRIOworCXJldHVybiBydGNfdmFsaWRfdG0odGltZSk7CiB9CiAKIHN0YXRpYyBpbnQgbXJzdF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdGltZSkKQEAgLTExOSw5ICsxMjIsOSBAQAogCW1pbiA9IHRpbWUtPnRtX21pbjsKIAlzZWMgPSB0aW1lLT50bV9zZWM7CiAKLQlpZiAoeXJzIDwgNzAgfHwgeXJzID4gMTM4KQorCWlmICh5cnMgPCA3MiB8fCB5cnMgPiAxMzgpCiAJCXJldHVybiAtRUlOVkFMOwotCXlycyAtPSA2MDsKKwl5cnMgLT0gNzI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW12LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbXYuYwppbmRleCA2MDYyN2E3Li43NjhlMmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbXYuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIAogI2RlZmluZSBSVENfVElNRV9SRUdfT0ZGUwkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcGNmMjEyMy5jIGIvZHJpdmVycy9ydGMvcnRjLXBjZjIxMjMuYwppbmRleCA3MWJhYjBlLi4yZWUzYmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcGNmMjEyMy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2YyMTIzLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIERSVl9WRVJTSU9OICIwLjYiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jCmluZGV4IGI0MmMwYzYuLjYwNmZkZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjMiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzQ4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM0OC5jCmluZGV4IDM2OGQwZTYuLjk3MWJjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzQ4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNDguYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwppbmRleCA4NWMxYjg0Li5kMjlmNTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNiIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwppbmRleCAzYjk0MzY3Li5lZDNlOWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jIGIvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCmluZGV4IGVjNjMxM2QuLmFhYzBmZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10eDQ5MzkuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkzOS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMgYi9kcml2ZXJzL3J0Yy9ydGMteDEyMDUuYwppbmRleCBiMDBhYWQyLi44YzA1MWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMteDEyMDUuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMteDEyMDUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMC44IgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBhMWQzZGRiLi42NTg5NGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTExLDcgKzExLDYgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgImRhc2QiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xNTk0LDcgKzE1OTMsNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CiAJaW50IGV4cGlyZXM7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0RBU10rKzsKIAlpZiAoSVNfRVJSKGlyYikpIHsKIAkJc3dpdGNoIChQVFJfRVJSKGlyYikpIHsKIAkJY2FzZSAtRUlPOgpAQCAtMjA2MSwxMyArMjA1OSwxNCBAQAogLyoKICAqIFdha2V1cCBoZWxwZXIgZm9yIHRoZSAnc2xlZXBfb24nIGZ1bmN0aW9ucy4KICAqLwotc3RhdGljIHZvaWQgZGFzZF93YWtldXBfY2Ioc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyLCB2b2lkICpkYXRhKQordm9pZCBkYXNkX3dha2V1cF9jYihzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIsIHZvaWQgKmRhdGEpCiB7CiAJc3Bpbl9sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY3FyLT5zdGFydGRldi0+Y2RldikpOwogCWNxci0+Y2FsbGJhY2tfZGF0YSA9IERBU0RfU0xFRVBPTl9FTkRfVEFHOwogCXNwaW5fdW5sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY3FyLT5zdGFydGRldi0+Y2RldikpOwogCXdha2VfdXAoJmdlbmVyaWNfd2FpdHEpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF93YWtldXBfY2IpOwogCiBzdGF0aWMgaW5saW5lIGludCBfd2FpdF9mb3Jfd2FrZXVwKHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcikKIHsKQEAgLTIxNjcsNyArMjE2Niw5IEBACiAJCX0gZWxzZQogCQkJd2FpdF9ldmVudChnZW5lcmljX3dhaXRxLCAhKGRldmljZS0+c3RvcHBlZCkpOwogCi0JCWNxci0+Y2FsbGJhY2sgPSBkYXNkX3dha2V1cF9jYjsKKwkJaWYgKCFjcXItPmNhbGxiYWNrKQorCQkJY3FyLT5jYWxsYmFjayA9IGRhc2Rfd2FrZXVwX2NiOworCiAJCWNxci0+Y2FsbGJhY2tfZGF0YSA9IERBU0RfU0xFRVBPTl9TVEFSVF9UQUc7CiAJCWRhc2RfYWRkX3JlcXVlc3RfdGFpbChjcXIpOwogCQlpZiAoaW50ZXJydXB0aWJsZSkgewpAQCAtMjI2Myw3ICsyMjY0LDExIEBACiAJY3FyLT5jYWxsYmFjayA9IGRhc2Rfd2FrZXVwX2NiOwogCWNxci0+Y2FsbGJhY2tfZGF0YSA9IERBU0RfU0xFRVBPTl9TVEFSVF9UQUc7CiAJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9RVUVVRUQ7Ci0JbGlzdF9hZGQoJmNxci0+ZGV2bGlzdCwgJmRldmljZS0+Y2N3X3F1ZXVlKTsKKwkvKgorCSAqIGFkZCBuZXcgcmVxdWVzdCBhcyBzZWNvbmQKKwkgKiBmaXJzdCB0aGUgdGVybWluYXRlZCBjcXIgbmVlZHMgdG8gYmUgZmluaXNoZWQKKwkgKi8KKwlsaXN0X2FkZCgmY3FyLT5kZXZsaXN0LCBkZXZpY2UtPmNjd19xdWV1ZS5uZXh0KTsKIAogCS8qIGxldCB0aGUgYmggc3RhcnQgdGhlIHJlcXVlc3QgdG8ga2VlcCB0aGVtIGluIG9yZGVyICovCiAJZGFzZF9zY2hlZHVsZV9kZXZpY2VfYmgoZGV2aWNlKTsKQEAgLTMyODQsNiArMzI4OSw5IEBACiAJaWYgKElTX0VSUihkZXZpY2UpKQogCQlyZXR1cm4gUFRSX0VSUihkZXZpY2UpOwogCisJLyogbWFyayBkZXZpY2UgYXMgc3VzcGVuZGVkICovCisJc2V0X2JpdChEQVNEX0ZMQUdfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncyk7CisKIAlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lLT5mcmVlemUpCiAJCXJjID0gZGV2aWNlLT5kaXNjaXBsaW5lLT5mcmVlemUoZGV2aWNlKTsKIApAQCAtMzM1OCw2ICszMzY2LDcgQEAKIAlpZiAoZGV2aWNlLT5ibG9jaykKIAkJZGFzZF9zY2hlZHVsZV9ibG9ja19iaChkZXZpY2UtPmJsb2NrKTsKIAorCWNsZWFyX2JpdChEQVNEX0ZMQUdfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncyk7CiAJZGFzZF9wdXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKaW5kZXggNmU4MzVjOS4uNmFiMjk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwpAQCAtODQ0LDYgKzg0NCwzMCBAQAogCXNldF9iaXQoREFTRF9DUVJfVkVSSUZZX1BBVEgsICZjcXItPmZsYWdzKTsKIH0KIAorLyoKKyAqIFdha2V1cCBoZWxwZXIgZm9yIHJlYWRfY29uZgorICogaWYgdGhlIGNxciBpcyBub3QgZG9uZSBhbmQgbmVlZHMgc29tZSBlcnJvciByZWNvdmVyeQorICogdGhlIGJ1ZmZlciBoYXMgdG8gYmUgcmUtaW5pdGlhbGl6ZWQgd2l0aCB0aGUgRUJDRElDICJWMS4wIgorICogdG8gc2hvdyBzdXBwb3J0IGZvciB2aXJ0dWFsIGRldmljZSBTTkVRCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfY29uZl9jYihzdHJ1Y3QgZGFzZF9jY3dfcmVxICpjcXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNjdzEgKmNjdzsKKwlfX3U4ICpyY2RfYnVmZmVyOworCisJaWYgKGNxci0+c3RhdHVzICE9ICBEQVNEX0NRUl9ET05FKSB7CisJCWNjdyA9IGNxci0+Y3BhZGRyOworCQlyY2RfYnVmZmVyID0gKF9fdTggKikoKGFkZHJfdCkgY2N3LT5jZGEpOworCQltZW1zZXQocmNkX2J1ZmZlciwgMCwgc2l6ZW9mKCpyY2RfYnVmZmVyKSk7CisKKwkJcmNkX2J1ZmZlclswXSA9IDB4RTU7CisJCXJjZF9idWZmZXJbMV0gPSAweEYxOworCQlyY2RfYnVmZmVyWzJdID0gMHg0QjsKKwkJcmNkX2J1ZmZlclszXSA9IDB4RjA7CisJfQorCWRhc2Rfd2FrZXVwX2NiKGNxciwgZGF0YSk7Cit9CisKIHN0YXRpYyBpbnQgZGFzZF9lY2tkX3JlYWRfY29uZl9pbW1lZGlhdGVseShzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyLAogCQkJCQkgICBfX3U4ICpyY2RfYnVmZmVyLApAQCAtODYzLDYgKzg4Nyw3IEBACiAJY2xlYXJfYml0KERBU0RfQ1FSX0ZMQUdTX1VTRV9FUlAsICZjcXItPmZsYWdzKTsKIAlzZXRfYml0KERBU0RfQ1FSX0FMTE9XX1NMT0NLLCAmY3FyLT5mbGFncyk7CiAJY3FyLT5yZXRyaWVzID0gNTsKKwljcXItPmNhbGxiYWNrID0gcmVhZF9jb25mX2NiOwogCXJjID0gZGFzZF9zbGVlcF9vbl9pbW1lZGlhdGx5KGNxcik7CiAJcmV0dXJuIHJjOwogfQpAQCAtOTAwLDYgKzkyNSw3IEBACiAJCWdvdG8gb3V0X2Vycm9yOwogCX0KIAlkYXNkX2Vja2RfZmlsbF9yY2RfY3FyKGRldmljZSwgY3FyLCByY2RfYnVmLCBscG0pOworCWNxci0+Y2FsbGJhY2sgPSByZWFkX2NvbmZfY2I7CiAJcmV0ID0gZGFzZF9zbGVlcF9vbihjcXIpOwogCS8qCiAJICogb24gc3VjY2VzcyB3ZSB1cGRhdGUgdGhlIHVzZXIgaW5wdXQgcGFybXMKQEAgLTEwNzUsNiArMTEwMSwxMiBAQAogCWRhdGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBhdGhfdmVyaWZpY2F0aW9uX3dvcmtfZGF0YSwgd29ya2VyKTsKIAlkZXZpY2UgPSBkYXRhLT5kZXZpY2U7CiAKKwkvKiBkZWxheSBwYXRoIHZlcmlmaWNhdGlvbiB1bnRpbCBkZXZpY2Ugd2FzIHJlc3VtZWQgKi8KKwlpZiAodGVzdF9iaXQoREFTRF9GTEFHX1NVU1BFTkRFRCwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCXNjaGVkdWxlX3dvcmsod29yayk7CisJCXJldHVybjsKKwl9CisKIAlvcG0gPSAwOwogCW5wbSA9IDA7CiAJcHBtID0gMDsKQEAgLTIwMjEsOSArMjA1MywxMyBAQAogCS8qIGZpcnN0IG9mIGFsbCBjaGVjayBmb3Igc3RhdGUgY2hhbmdlIHBlbmRpbmcgaW50ZXJydXB0ICovCiAJbWFzayA9IERFVl9TVEFUX0FUVEVOVElPTiB8IERFVl9TVEFUX0RFVl9FTkQgfCBERVZfU1RBVF9VTklUX0VYQ0VQOwogCWlmICgoc2Nzd19kc3RhdCgmaXJiLT5zY3N3KSAmIG1hc2spID09IG1hc2spIHsKLQkJLyogZm9yIGFsaWFzIG9ubHkgYW5kIG5vdCBpbiBvZmZsaW5lIHByb2Nlc3NpbmcqLworCQkvKgorCQkgKiBmb3IgYWxpYXMgb25seSwgbm90IGluIG9mZmxpbmUgcHJvY2Vzc2luZworCQkgKiBhbmQgb25seSBpZiBub3Qgc3VzcGVuZGVkCisJCSAqLwogCQlpZiAoIWRldmljZS0+YmxvY2sgJiYgcHJpdmF0ZS0+bGN1ICYmCi0JCSAgICAhdGVzdF9iaXQoREFTRF9GTEFHX09GRkxJTkUsICZkZXZpY2UtPmZsYWdzKSkgeworCQkgICAgIXRlc3RfYml0KERBU0RfRkxBR19PRkZMSU5FLCAmZGV2aWNlLT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChEQVNEX0ZMQUdfU1VTUEVOREVELCAmZGV2aWNlLT5mbGFncykpIHsKIAkJCS8qCiAJCQkgKiB0aGUgc3RhdGUgY2hhbmdlIGNvdWxkIGJlIGNhdXNlZCBieSBhbiBhbGlhcwogCQkJICogcmVhc3NpZ25tZW50IHJlbW92ZSBkZXZpY2UgZnJvbSBhbGlhcyBoYW5kbGluZwpAQCAtMjM1MCw3ICsyMzg2LDcgQEAKIAluZXdfdHJhY2sgPSAxOwogCWVuZF9pZGF3ID0gMDsKIAlsZW5fdG9fdHJhY2tfZW5kID0gMDsKLQlpZGF3X2RzdCA9IDA7CisJaWRhd19kc3QgPSBOVUxMOwogCWlkYXdfbGVuID0gMDsKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpIHsKIAkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7CkBAIC0yNDEyLDcgKzI0NDgsNyBAQAogCQkJaWYgKGVuZF9pZGF3KSB7CiAJCQkJaWRhd3MgPSBpZGFsX2NyZWF0ZV93b3JkcyhpZGF3cywgaWRhd19kc3QsCiAJCQkJCQkJICBpZGF3X2xlbik7Ci0JCQkJaWRhd19kc3QgPSAwOworCQkJCWlkYXdfZHN0ID0gTlVMTDsKIAkJCQlpZGF3X2xlbiA9IDA7CiAJCQkJZW5kX2lkYXcgPSAwOwogCQkJfQpAQCAtMzk5OCw2ICs0MDM0LDcgQEAKIAkudGhhdwkgICAgID0gZGFzZF9nZW5lcmljX3Jlc3RvcmVfZGV2aWNlLAogCS5yZXN0b3JlICAgICA9IGRhc2RfZ2VuZXJpY19yZXN0b3JlX2RldmljZSwKIAkudWNfaGFuZGxlciAgPSBkYXNkX2dlbmVyaWNfdWNfaGFuZGxlciwKKwkuaW50X2NsYXNzICAgPSBJT0lOVF9EQVMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwppbmRleCA0YjcxYjExLi5hNjJhNzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwpAQCAtNzksNiArNzksNyBAQAogCS5mcmVlemUgICAgICA9IGRhc2RfZ2VuZXJpY19wbV9mcmVlemUsCiAJLnRoYXcJICAgICA9IGRhc2RfZ2VuZXJpY19yZXN0b3JlX2RldmljZSwKIAkucmVzdG9yZSAgICAgPSBkYXNkX2dlbmVyaWNfcmVzdG9yZV9kZXZpY2UsCisJLmludF9jbGFzcyAgID0gSU9JTlRfREFTLAogfTsKIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggMWRkMTJiZC4uYWZlOGMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTUxNiw2ICs1MTYsNyBAQAogCQkJCQkgKi8KICNkZWZpbmUgREFTRF9GTEFHX0lTX1JFU0VSVkVECTcJLyogVGhlIGRldmljZSBpcyByZXNlcnZlZCAqLwogI2RlZmluZSBEQVNEX0ZMQUdfTE9DS19TVE9MRU4JOAkvKiBUaGUgZGV2aWNlIGxvY2sgd2FzIHN0b2xlbiAqLworI2RlZmluZSBEQVNEX0ZMQUdfU1VTUEVOREVECTkJLyogVGhlIGRldmljZSB3YXMgc3VzcGVuZGVkICovCiAKIAogdm9pZCBkYXNkX3B1dF9kZXZpY2Vfd2FrZShzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7CkBAIC02NDMsNiArNjQ0LDcgQEAKIGRhc2Rfc21hbGxvY19yZXF1ZXN0KGludCAsIGludCwgaW50LCBzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7CiB2b2lkIGRhc2Rfa2ZyZWVfcmVxdWVzdChzdHJ1Y3QgZGFzZF9jY3dfcmVxICosIHN0cnVjdCBkYXNkX2RldmljZSAqKTsKIHZvaWQgZGFzZF9zZnJlZV9yZXF1ZXN0KHN0cnVjdCBkYXNkX2Njd19yZXEgKiwgc3RydWN0IGRhc2RfZGV2aWNlICopOwordm9pZCBkYXNkX3dha2V1cF9jYihzdHJ1Y3QgZGFzZF9jY3dfcmVxICosIHZvaWQgKik7CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBkYXNkX2ttYWxsb2Nfc2V0X2NkYShzdHJ1Y3QgY2N3MSAqY2N3LCB2b2lkICpjZGEsIHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKaW5kZXggOWI0M2FlOS4uYTVhNTVkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtMjcsNyArMjcsNyBAQAogCiBzdGF0aWMgaW50IGRjc3NibGtfb3BlbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpOwogc3RhdGljIGludCBkY3NzYmxrX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGZtb2RlX3QgbW9kZSk7Ci1zdGF0aWMgaW50IGRjc3NibGtfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOworc3RhdGljIHZvaWQgZGNzc2Jsa19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CiBzdGF0aWMgaW50IGRjc3NibGtfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWNudW0sCiAJCQkJIHZvaWQgKiprYWRkciwgdW5zaWduZWQgbG9uZyAqcGZuKTsKIApAQCAtODE0LDcgKzgxNCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogZGNzc2Jsa19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm87CkBAIC04NzEsMTAgKzg3MSw5IEBACiAJCWJ5dGVzX2RvbmUgKz0gYnZlYy0+YnZfbGVuOwogCX0KIAliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiBmYWlsOgogCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCmluZGV4IDFmNmE0ZDguLjk4ZjNlNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCkBAIC0xODEsNyArMTgxLDcgQEAKIC8qCiAgKiBCbG9jayBkZXZpY2UgbWFrZSByZXF1ZXN0IGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IHhwcmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHZvaWQgeHByYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJeHByYW1fZGV2aWNlX3QgKnhkZXYgPSBiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKQEAgLTIyMSwxMCArMjIxLDkgQEAKIAl9CiAJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKIAliaW9fZW5kaW8oYmlvLCAwKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiBmYWlsOgogCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHhwcmFtX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwppbmRleCA2OTQ0NjRjLi45MzQ0NThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCkBAIC05LDcgKzksNiBAQAogICoJICAgICAgRGFuIE1vcnJpc29uLCBJQk0gQ29ycG9yYXRpb24gPGRtb3JyaXNvQGNzZS5idWZmYWxvLmVkdT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgpAQCAtMzYyLDcgKzM2MSw2IEBACiAJaW50IGNzdGF0LCBkc3RhdDsKIAlpbnQgY291bnQ7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0MxNV0rKzsKIAlyYXcgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CiAJcmVxID0gKHN0cnVjdCByYXczMjE1X3JlcSAqKSBpbnRwYXJtOwogCWNzdGF0ID0gaXJiLT5zY3N3LmNtZC5jc3RhdDsKQEAgLTc3Niw2ICs3NzQsNyBAQAogCS5mcmVlemUJCT0gJnJhdzMyMTVfcG1fc3RvcCwKIAkudGhhdwkJPSAmcmF3MzIxNV9wbV9zdGFydCwKIAkucmVzdG9yZQk9ICZyYXczMjE1X3BtX3N0YXJ0LAorCS5pbnRfY2xhc3MJPSBJT0lOVF9DMTUsCiB9OwogCiAjaWZkZWYgQ09ORklHX1ROMzIxNV9DT05TT0xFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9mczMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jCmluZGV4IGY2NDg5ZWIuLmU3MTI5ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKaW5kZXggODEwYWMzOC4uZTVjYjkyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwpAQCAtNyw3ICs3LDYgQEAKICAqICAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMsIDIwMDkKICAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zMzAsNyArMzI5LDYgQEAKIAlzdHJ1Y3QgcmF3MzI3MF9yZXF1ZXN0ICpycTsKIAlpbnQgcmM7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0M3MF0rKzsKIAlycCA9IGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KTsKIAlpZiAoIXJwKQogCQlyZXR1cm47CkBAIC0xMzk4LDYgKzEzOTYsNyBAQAogCS5mcmVlemUJCT0gJnJhdzMyNzBfcG1fc3RvcCwKIAkudGhhdwkJPSAmcmF3MzI3MF9wbV9zdGFydCwKIAkucmVzdG9yZQk9ICZyYXczMjcwX3BtX3N0YXJ0LAorCS5pbnRfY2xhc3MJPSBJT0lOVF9DNzAsCiB9OwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NtZC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jbWQuYwppbmRleCA4MzdlMDEwLi4wYjU0YTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NtZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY21kLmMKQEAgLTYxLDggKzYxLDggQEAKIAlyYyA9IHNjbHBfc2VydmljZV9jYWxsKGNtZCwgc2NjYik7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKLQlfX2xvYWRfcHN3X21hc2soUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX0VYVCB8Ci0JCQlQU1dfTUFTS19XQUlUIHwgUFNXX0RFRkFVTFRfS0VZKTsKKwlfX2xvYWRfcHN3X21hc2soUFNXX0RFRkFVTFRfS0VZIHwgUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX0VBIHwKKwkJCVBTV19NQVNLX0JBIHwgUFNXX01BU0tfRVhUIHwgUFNXX01BU0tfV0FJVCk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIG91dDoKIAkvKiBDb250ZW50cyBvZiB0aGUgc2NjYiBtaWdodCBoYXZlIGNoYW5nZWQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NwaV9zeXMuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpX3N5cy5jCmluZGV4IDRhNTFlM2YuLmJkMWI5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpX3N5cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpX3N5cy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAjaW5jbHVkZSA8YXNtL3NjbHAuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwppbmRleCBhOTBhMDJjLi44N2ZjMGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwpAQCAtMzAsNyArMzAsOCBAQAogCXBzd190IHF1aWVzY2VfcHN3OwogCiAJc21wX3NlbmRfc3RvcCgpOwotCXF1aWVzY2VfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfV0FJVDsKKwlxdWllc2NlX3Bzdy5tYXNrID0KKwkJUFNXX01BU0tfQkFTRSB8IFBTV19NQVNLX0VBIHwgUFNXX01BU0tfQkEgfCBQU1dfTUFTS19XQUlUOwogCXF1aWVzY2VfcHN3LmFkZHIgPSAweGZmZjsKIAlfX2xvYWRfcHN3KHF1aWVzY2VfcHN3KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzR4eC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKaW5kZXggOWVmZjJkZi4uOTM0ZWYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKQEAgLTEzMzAsNiArMTMzMCw3IEBACiAJLnNldF9vbmxpbmUgPSB0YXBlXzM0eHhfb25saW5lLAogCS5zZXRfb2ZmbGluZSA9IHRhcGVfZ2VuZXJpY19vZmZsaW5lLAogCS5mcmVlemUgPSB0YXBlX2dlbmVyaWNfcG1fc3VzcGVuZCwKKwkuaW50X2NsYXNzID0gSU9JTlRfVEFQLAogfTsKIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwppbmRleCBhN2Q1NzA3Li40OWM2YWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwpAQCAtMTc2Miw2ICsxNzYyLDcgQEAKIAkuc2V0X29mZmxpbmUgPSB0YXBlX2dlbmVyaWNfb2ZmbGluZSwKIAkuc2V0X29ubGluZSA9IHRhcGVfMzU5MF9vbmxpbmUsCiAJLmZyZWV6ZSA9IHRhcGVfZ2VuZXJpY19wbV9zdXNwZW5kLAorCS5pbnRfY2xhc3MgPSBJT0lOVF9UQVAsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYwppbmRleCA3OTc4YTBhLi5iM2EzZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYwpAQCAtMTQsNyArMTQsNiBAQAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAidGFwZSIKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkgICAgIC8vIGZvciBrZXJuZWwgcGFyYW1ldGVycwogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4JICAgICAvLyBmb3IgcmVxdWVzdGluZyBtb2R1bGVzCkBAIC0xMTE1LDcgKzExMTQsNiBAQAogCXN0cnVjdCB0YXBlX3JlcXVlc3QgKnJlcXVlc3Q7CiAJaW50IHJjOwogCi0Ja3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9UQVBdKys7CiAJZGV2aWNlID0gZGV2X2dldF9kcnZkYXRhKCZjZGV2LT5kZXYpOwogCWlmIChkZXZpY2UgPT0gTlVMTCkgewogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmMKaW5kZXggMzFhM2NjYi4uNzViZGU2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdm1jcC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtY3AuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9jcGNtZC5oPgogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCmluZGV4IGY2YjAwYzMuLjg1ZjRhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKQEAgLTExLDkgKzExLDkgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInZtdXIiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jaW8uaD4KQEAgLTc0LDYgKzc0LDcgQEAKIAkuc2V0X29ubGluZQk9IHVyX3NldF9vbmxpbmUsCiAJLnNldF9vZmZsaW5lCT0gdXJfc2V0X29mZmxpbmUsCiAJLmZyZWV6ZQkJPSB1cl9wbV9zdXNwZW5kLAorCS5pbnRfY2xhc3MJPSBJT0lOVF9WTVIsCiB9OwogCiBzdGF0aWMgREVGSU5FX01VVEVYKHZtdXJfbXV0ZXgpOwpAQCAtMzA1LDcgKzMwNiw2IEBACiB7CiAJc3RydWN0IHVyZGV2ICp1cmQ7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX1ZNUl0rKzsKIAlUUkFDRSgidXJfaW50X2hhbmRsZXI6IGludHBhcm09MHglbHggY3N0YXQ9JTAyeCBkc3RhdD0lMDJ4IHJlcz0ldVxuIiwKIAkgICAgICBpbnRwYXJtLCBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmRzdGF0LAogCSAgICAgIGlyYi0+c2Nzdy5jbWQuY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMKaW5kZXggM2I5NDA0NC4uNDMwNjhmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogI2luY2x1ZGUgPGFzbS9zY2xwLmg+CkBAIC0xNDIsMjIgKzE0Myw2IEBACiAJcmV0dXJuIG1lbWNweV9oc2EoZGVzdCwgc3JjLCBjb3VudCwgVE9fS0VSTkVMKTsKIH0KIAotc3RhdGljIGludCBtZW1jcHlfcmVhbF91c2VyKHZvaWQgX191c2VyICpkZXN0LCB1bnNpZ25lZCBsb25nIHNyYywgc2l6ZV90IGNvdW50KQotewotCXN0YXRpYyBjaGFyIGJ1Zls0MDk2XTsKLQlpbnQgb2ZmcyA9IDAsIHNpemU7Ci0KLQl3aGlsZSAob2ZmcyA8IGNvdW50KSB7Ci0JCXNpemUgPSBtaW4oc2l6ZW9mKGJ1ZiksIGNvdW50IC0gb2Zmcyk7Ci0JCWlmIChtZW1jcHlfcmVhbChidWYsICh2b2lkICopIHNyYyArIG9mZnMsIHNpemUpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoZGVzdCArIG9mZnMsIGJ1Ziwgc2l6ZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJb2ZmcyArPSBzaXplOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9jcHVfaW5mbyhlbnVtIGFyY2hfaWQgYXJjaCkKIHsKIAlzdHJ1Y3Qgc2F2ZV9hcmVhICpzYTsKQEAgLTM0Niw4ICszMzEsOCBAQAogCiAJLyogQ29weSBmcm9tIHJlYWwgbWVtICovCiAJc2l6ZSA9IGNvdW50IC0gbWVtX29mZnMgLSBoZHJfY291bnQ7Ci0JcmMgPSBtZW1jcHlfcmVhbF91c2VyKGJ1ZiArIGhkcl9jb3VudCArIG1lbV9vZmZzLCBtZW1fc3RhcnQgKyBtZW1fb2ZmcywKLQkJCSAgICAgIHNpemUpOworCXJjID0gY29weV90b191c2VyX3JlYWwoYnVmICsgaGRyX2NvdW50ICsgbWVtX29mZnMsCisJCQkgICAgICAgKHZvaWQgKikgbWVtX3N0YXJ0ICsgbWVtX29mZnMsIHNpemUpOwogCWlmIChyYykKIAkJZ290byBmYWlsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKaW5kZXggNWM1Njc0MS4uNGYxOTg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMjksMzEgKzI5LDIwIEBACiAKIC8qIGEgZGV2aWNlIG1hdGNoZXMgYSBkcml2ZXIgaWYgYWxsIGl0cyBzbGF2ZSBkZXZpY2VzIG1hdGNoIHRoZSBzYW1lCiAgKiBlbnRyeSBvZiB0aGUgZHJpdmVyICovCi1zdGF0aWMgaW50Ci1jY3dncm91cF9idXNfbWF0Y2ggKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQorc3RhdGljIGludCBjY3dncm91cF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKIHsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OwotCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnY7Ci0KLQlnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKLQlnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZHJ2KTsKKwlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKKwlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZHJ2KTsKIAogCWlmIChnZGV2LT5jcmVhdG9yX2lkID09IGdkcnYtPmRyaXZlcl9pZCkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbnQKLWNjd2dyb3VwX3VldmVudCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCi17Ci0JLyogVE9ETyAqLwotCXJldHVybiAwOwotfQogCiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIGNjd2dyb3VwX2J1c190eXBlOwogCi1zdGF0aWMgdm9pZAotX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKK3N0YXRpYyB2b2lkIF9fY2N3Z3JvdXBfcmVtb3ZlX3N5bWxpbmtzKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCiB7CiAJaW50IGk7CiAJY2hhciBzdHJbOF07CkBAIC02Myw3ICs1Miw2IEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZnZGV2LT5kZXYua29iaiwgc3RyKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmdkZXYtPmNkZXZbaV0tPmRldi5rb2JqLCAiZ3JvdXBfZGV2aWNlIik7CiAJfQotCQogfQogCiAvKgpAQCAtODcsNiArNzUsODcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgY2N3Z3JvdXBfc2V0X29ubGluZShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQoreworCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnYgPSB0b19jY3dncm91cGRydihnZGV2LT5kZXYuZHJpdmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhdG9taWNfY21weGNoZygmZ2Rldi0+b25vZmYsIDAsIDEpICE9IDApCisJCXJldHVybiAtRUFHQUlOOworCWlmIChnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpCisJCWdvdG8gb3V0OworCWlmIChnZHJ2LT5zZXRfb25saW5lKQorCQlyZXQgPSBnZHJ2LT5zZXRfb25saW5lKGdkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZ2Rldi0+c3RhdGUgPSBDQ1dHUk9VUF9PTkxJTkU7CitvdXQ6CisJYXRvbWljX3NldCgmZ2Rldi0+b25vZmYsIDApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2N3Z3JvdXBfc2V0X29mZmxpbmUoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKK3sKKwlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZ2Rldi0+ZGV2LmRyaXZlcik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYXRvbWljX2NtcHhjaGcoJmdkZXYtPm9ub2ZmLCAwLCAxKSAhPSAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoZ2Rldi0+c3RhdGUgPT0gQ0NXR1JPVVBfT0ZGTElORSkKKwkJZ290byBvdXQ7CisJaWYgKGdkcnYtPnNldF9vZmZsaW5lKQorCQlyZXQgPSBnZHJ2LT5zZXRfb2ZmbGluZShnZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWdkZXYtPnN0YXRlID0gQ0NXR1JPVVBfT0ZGTElORTsKK291dDoKKwlhdG9taWNfc2V0KCZnZGV2LT5vbm9mZiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgY2N3Z3JvdXBfb25saW5lX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisJc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlpZiAoIWRldi0+ZHJpdmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGdkcnYtPmRyaXZlci5vd25lcikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHZhbHVlID09IDEpCisJCXJldCA9IGNjd2dyb3VwX3NldF9vbmxpbmUoZ2Rldik7CisJZWxzZSBpZiAodmFsdWUgPT0gMCkKKwkJcmV0ID0gY2N3Z3JvdXBfc2V0X29mZmxpbmUoZ2Rldik7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworb3V0OgorCW1vZHVsZV9wdXQoZ2Rydi0+ZHJpdmVyLm93bmVyKTsKKwlyZXR1cm4gKHJldCA9PSAwKSA/IGNvdW50IDogcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjY3dncm91cF9vbmxpbmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisJaW50IG9ubGluZTsKKworCW9ubGluZSA9IChnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpID8gMSA6IDA7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG9ubGluZSk7Cit9CisKIC8qCiAgKiBQcm92aWRlIGFuICd1bmdyb3VwJyBhdHRyaWJ1dGUgc28gdGhlIHVzZXIgY2FuIHJlbW92ZSBncm91cCBkZXZpY2VzIG5vCiAgKiBsb25nZXIgbmVlZGVkIG9yIGFjY2lkZW50aWFsbHkgY3JlYXRlZC4gU2F2ZXMgbWVtb3J5IDopCkBAIC0xMDQsMTQgKzE3MywxMyBAQAogCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIH0KIAotc3RhdGljIHNzaXplX3QKLWNjd2dyb3VwX3VuZ3JvdXBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBjY3dncm91cF91bmdyb3VwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OworCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwogCWludCByYzsKIAotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCiAJLyogUHJldmVudCBjb25jdXJyZW50IG9ubGluZS9vZmZsaW5lIHByb2Nlc3NpbmcgYW5kIHVuZ3JvdXBpbmcuICovCiAJaWYgKGF0b21pY19jbXB4Y2hnKCZnZGV2LT5vbm9mZiwgMCwgMSkgIT0gMCkKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC0xMzIsMjQgKzIwMCwzNSBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci0KIHN0YXRpYyBERVZJQ0VfQVRUUih1bmdyb3VwLCAwMjAwLCBOVUxMLCBjY3dncm91cF91bmdyb3VwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihvbmxpbmUsIDA2NDQsIGNjd2dyb3VwX29ubGluZV9zaG93LCBjY3dncm91cF9vbmxpbmVfc3RvcmUpOwogCi1zdGF0aWMgdm9pZAotY2N3Z3JvdXBfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNjd2dyb3VwX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX29ubGluZS5hdHRyLAorCSZkZXZfYXR0cl91bmdyb3VwLmF0dHIsCisJTlVMTCwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjY3dncm91cF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGNjd2dyb3VwX2F0dHJzLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjY3dncm91cF9hdHRyX2dyb3Vwc1tdID0geworCSZjY3dncm91cF9hdHRyX2dyb3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBjY3dncm91cF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlrZnJlZSh0b19jY3dncm91cGRldihkZXYpKTsKIH0KIAotc3RhdGljIGludAotX19jY3dncm91cF9jcmVhdGVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKK3N0YXRpYyBpbnQgX19jY3dncm91cF9jcmVhdGVfc3ltbGlua3Moc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKIHsKIAljaGFyIHN0cls4XTsKIAlpbnQgaSwgcmM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZ2Rldi0+Y291bnQ7IGkrKykgewotCQlyYyA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZnZGV2LT5jZGV2W2ldLT5kZXYua29iaiwgJmdkZXYtPmRldi5rb2JqLAotCQkJCSAgICAgICAiZ3JvdXBfZGV2aWNlIik7CisJCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmdkZXYtPmNkZXZbaV0tPmRldi5rb2JqLAorCQkJCSAgICAgICAmZ2Rldi0+ZGV2LmtvYmosICJncm91cF9kZXZpY2UiKTsKIAkJaWYgKHJjKSB7CiAJCQlmb3IgKC0taTsgaSA+PSAwOyBpLS0pCiAJCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmdkZXYtPmNkZXZbaV0tPmRldi5rb2JqLApAQCAtMTU5LDggKzIzOCw4IEBACiAJfQogCWZvciAoaSA9IDA7IGkgPCBnZGV2LT5jb3VudDsgaSsrKSB7CiAJCXNwcmludGYoc3RyLCAiY2RldiVkIiwgaSk7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmdkZXYtPmRldi5rb2JqLCAmZ2Rldi0+Y2RldltpXS0+ZGV2LmtvYmosCi0JCQkJICAgICAgIHN0cik7CisJCXJjID0gc3lzZnNfY3JlYXRlX2xpbmsoJmdkZXYtPmRldi5rb2JqLAorCQkJCSAgICAgICAmZ2Rldi0+Y2RldltpXS0+ZGV2LmtvYmosIHN0cik7CiAJCWlmIChyYykgewogCQkJZm9yICgtLWk7IGkgPj0gMDsgaS0tKSB7CiAJCQkJc3ByaW50ZihzdHIsICJjZGV2JWQiLCBpKTsKQEAgLTI5MywyNiArMzcyLDE3IEBACiAJfQogCiAJZGV2X3NldF9uYW1lKCZnZGV2LT5kZXYsICIlcyIsIGRldl9uYW1lKCZnZGV2LT5jZGV2WzBdLT5kZXYpKTsKLQorCWdkZXYtPmRldi5ncm91cHMgPSBjY3dncm91cF9hdHRyX2dyb3VwczsKIAlyYyA9IGRldmljZV9hZGQoJmdkZXYtPmRldik7CiAJaWYgKHJjKQogCQlnb3RvIGVycm9yOwotCWdldF9kZXZpY2UoJmdkZXYtPmRldik7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmdkZXYtPmRldiwgJmRldl9hdHRyX3VuZ3JvdXApOwotCisJcmMgPSBfX2Njd2dyb3VwX2NyZWF0ZV9zeW1saW5rcyhnZGV2KTsKIAlpZiAocmMpIHsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CisJCWRldmljZV9kZWwoJmdkZXYtPmRldik7CiAJCWdvdG8gZXJyb3I7CiAJfQotCi0JcmMgPSBfX2Njd2dyb3VwX2NyZWF0ZV9zeW1saW5rcyhnZGV2KTsKLQlpZiAoIXJjKSB7Ci0JCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKLQkJcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRldmljZV9yZW1vdmVfZmlsZSgmZ2Rldi0+ZGV2LCAmZGV2X2F0dHJfdW5ncm91cCk7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CisJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOworCXJldHVybiAwOwogZXJyb3I6CiAJZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspCiAJCWlmIChnZGV2LT5jZGV2W2ldKSB7CkBAIC0zMzAsNyArNDAwLDE1IEBACiBFWFBPUlRfU1lNQk9MKGNjd2dyb3VwX2NyZWF0ZV9mcm9tX3N0cmluZyk7CiAKIHN0YXRpYyBpbnQgY2N3Z3JvdXBfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgICAgIHZvaWQgKmRhdGEpOworCQkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpZiAoYWN0aW9uID09IEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUikKKwkJZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKGRldiwgY2N3Z3JvdXBfdW5ncm91cF9jYWxsYmFjayk7CisKKwlyZXR1cm4gTk9USUZZX09LOworfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNjd2dyb3VwX25iID0gewogCS5ub3RpZmllcl9jYWxsID0gY2N3Z3JvdXBfbm90aWZpZXIKQEAgLTM2MiwxMzggKzQ0MCwyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZHJpdmVyIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotY2N3Z3JvdXBfc2V0X29ubGluZShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQorc3RhdGljIGludCBjY3dncm91cF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydjsKLQlpbnQgcmV0OworCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOworCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7CiAKLQlpZiAoYXRvbWljX2NtcHhjaGcoJmdkZXYtPm9ub2ZmLCAwLCAxKSAhPSAwKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlpZiAoZ2Rldi0+c3RhdGUgPT0gQ0NXR1JPVVBfT05MSU5FKSB7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoIWdkZXYtPmRldi5kcml2ZXIpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCWdkcnYgPSB0b19jY3dncm91cGRydiAoZ2Rldi0+ZGV2LmRyaXZlcik7Ci0JaWYgKChyZXQgPSBnZHJ2LT5zZXRfb25saW5lID8gZ2Rydi0+c2V0X29ubGluZShnZGV2KSA6IDApKQotCQlnb3RvIG91dDsKLQotCWdkZXYtPnN0YXRlID0gQ0NXR1JPVVBfT05MSU5FOwotIG91dDoKLQlhdG9taWNfc2V0KCZnZGV2LT5vbm9mZiwgMCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZ2Rydi0+cHJvYmUgPyBnZHJ2LT5wcm9iZShnZGV2KSA6IC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQKLWNjd2dyb3VwX3NldF9vZmZsaW5lKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCitzdGF0aWMgaW50IGNjd2dyb3VwX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydjsKLQlpbnQgcmV0OwotCi0JaWYgKGF0b21pY19jbXB4Y2hnKCZnZGV2LT5vbm9mZiwgMCwgMSkgIT0gMCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JaWYgKGdkZXYtPnN0YXRlID09IENDV0dST1VQX09GRkxJTkUpIHsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghZ2Rldi0+ZGV2LmRyaXZlcikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JZ2RydiA9IHRvX2Njd2dyb3VwZHJ2IChnZGV2LT5kZXYuZHJpdmVyKTsKLQlpZiAoKHJldCA9IGdkcnYtPnNldF9vZmZsaW5lID8gZ2Rydi0+c2V0X29mZmxpbmUoZ2RldikgOiAwKSkKLQkJZ290byBvdXQ7Ci0KLQlnZGV2LT5zdGF0ZSA9IENDV0dST1VQX09GRkxJTkU7Ci0gb3V0OgotCWF0b21pY19zZXQoJmdkZXYtPm9ub2ZmLCAwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdAotY2N3Z3JvdXBfb25saW5lX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OwotCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnY7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQlpbnQgcmV0OwotCi0JaWYgKCFkZXYtPmRyaXZlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKLQlnZHJ2ID0gdG9fY2N3Z3JvdXBkcnYoZGV2LT5kcml2ZXIpOwotCi0JaWYgKCF0cnlfbW9kdWxlX2dldChnZHJ2LT5kcml2ZXIub3duZXIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbHVlKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWlmICh2YWx1ZSA9PSAxKQotCQlyZXQgPSBjY3dncm91cF9zZXRfb25saW5lKGdkZXYpOwotCWVsc2UgaWYgKHZhbHVlID09IDApCi0JCXJldCA9IGNjd2dyb3VwX3NldF9vZmZsaW5lKGdkZXYpOwotCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKLW91dDoKLQltb2R1bGVfcHV0KGdkcnYtPmRyaXZlci5vd25lcik7Ci0JcmV0dXJuIChyZXQgPT0gMCkgPyBjb3VudCA6IHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWNjd2dyb3VwX29ubGluZV9zaG93IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0JaW50IG9ubGluZTsKLQotCW9ubGluZSA9ICh0b19jY3dncm91cGRldihkZXYpLT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCBvbmxpbmUgPyAiMVxuIiA6ICIwXG4iKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG9ubGluZSwgMDY0NCwgY2N3Z3JvdXBfb25saW5lX3Nob3csIGNjd2dyb3VwX29ubGluZV9zdG9yZSk7Ci0KLXN0YXRpYyBpbnQKLWNjd2dyb3VwX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldjsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2OwotCi0JaW50IHJldDsKLQotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCWdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoKHJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9vbmxpbmUpKSkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGdkcnYtPnByb2JlID8gZ2Rydi0+cHJvYmUoZ2RldikgOiAtRU5PREVWOwotCWlmIChyZXQpCi0JCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9vbmxpbmUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotY2N3Z3JvdXBfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldjsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZHJpdmVyICpnZHJ2OwotCi0JZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX29ubGluZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3VuZ3JvdXApOworCXN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOworCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7CiAKIAlpZiAoIWRldi0+ZHJpdmVyKQogCQlyZXR1cm4gMDsKLQotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCWdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7Ci0KIAlpZiAoZ2Rydi0+cmVtb3ZlKQogCQlnZHJ2LT5yZW1vdmUoZ2Rldik7CiAKQEAgLTUwMiwxNSArNDYzLDExIEBACiAKIHN0YXRpYyB2b2lkIGNjd2dyb3VwX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2OwotCXN0cnVjdCBjY3dncm91cF9kcml2ZXIgKmdkcnY7CisJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisJc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKIAogCWlmICghZGV2LT5kcml2ZXIpCiAJCXJldHVybjsKLQotCWdkZXYgPSB0b19jY3dncm91cGRldihkZXYpOwotCWdkcnYgPSB0b19jY3dncm91cGRydihkZXYtPmRyaXZlcik7Ci0KIAlpZiAoZ2Rydi0+c2h1dGRvd24pCiAJCWdkcnYtPnNodXRkb3duKGdkZXYpOwogfQpAQCAtNTg2LDI2ICs1NDMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgY2N3Z3JvdXBfYnVzX3R5cGUgPSB7CiAJLm5hbWUgICA9ICJjY3dncm91cCIsCiAJLm1hdGNoICA9IGNjd2dyb3VwX2J1c19tYXRjaCwKLQkudWV2ZW50ID0gY2N3Z3JvdXBfdWV2ZW50LAogCS5wcm9iZSAgPSBjY3dncm91cF9wcm9iZSwKIAkucmVtb3ZlID0gY2N3Z3JvdXBfcmVtb3ZlLAogCS5zaHV0ZG93biA9IGNjd2dyb3VwX3NodXRkb3duLAogCS5wbSA9ICZjY3dncm91cF9wbV9vcHMsCiB9OwogCi0KLXN0YXRpYyBpbnQgY2N3Z3JvdXBfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQotCWlmIChhY3Rpb24gPT0gQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSKQotCQlkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soZGV2LCBjY3dncm91cF91bmdyb3VwX2NhbGxiYWNrKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLQogLyoqCiAgKiBjY3dncm91cF9kcml2ZXJfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGEgY2N3IGdyb3VwIGRyaXZlcgogICogQGNkcml2ZXI6IGRyaXZlciB0byBiZSByZWdpc3RlcmVkCkBAIC02MTksOSArNTYyLDkgQEAKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmNkcml2ZXItPmRyaXZlcik7CiB9CitFWFBPUlRfU1lNQk9MKGNjd2dyb3VwX2RyaXZlcl9yZWdpc3Rlcik7CiAKLXN0YXRpYyBpbnQKLV9fY2N3Z3JvdXBfbWF0Y2hfYWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgX19jY3dncm91cF9tYXRjaF9hbGwoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXJldHVybiAxOwogfQpAQCAtNjUyLDYgKzU5NSw3IEBACiAJcHV0X2RyaXZlcigmY2RyaXZlci0+ZHJpdmVyKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmY2RyaXZlci0+ZHJpdmVyKTsKIH0KK0VYUE9SVF9TWU1CT0woY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXIpOwogCiAvKioKICAqIGNjd2dyb3VwX3Byb2JlX2Njd2RldigpIC0gcHJvYmUgZnVuY3Rpb24gZm9yIHNsYXZlIGRldmljZXMKQEAgLTY2Niw2ICs2MTAsNyBAQAogewogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChjY3dncm91cF9wcm9iZV9jY3dkZXYpOwogCiAvKioKICAqIGNjd2dyb3VwX3JlbW92ZV9jY3dkZXYoKSAtIHJlbW92ZSBmdW5jdGlvbiBmb3Igc2xhdmUgZGV2aWNlcwpAQCAtNzAyLDkgKzY0Nyw1IEBACiAJLyogUmVsZWFzZSBjY3dncm91cCBkZXZpY2UgcmVmZXJlbmNlIGZvciBsb2NhbCBwcm9jZXNzaW5nLiAqLwogCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CiB9Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLUVYUE9SVF9TWU1CT0woY2N3Z3JvdXBfZHJpdmVyX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChjY3dncm91cF9wcm9iZV9jY3dkZXYpOwogRVhQT1JUX1NZTUJPTChjY3dncm91cF9yZW1vdmVfY2N3ZGV2KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3cmVxLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd3JlcS5jCmluZGV4IGQxNWY4YjQuLjUxNTYyNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2N3cmVxLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jY3dyZXEuYwpAQCAtMSwxMCArMSwxMyBAQAogLyoKICAqICBIYW5kbGluZyBvZiBpbnRlcm5hbCBDQ1cgZGV2aWNlIHJlcXVlc3RzLgogICoKLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOQorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA5LCAyMDExCiAgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KICAqLwogCisjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJjaW8iCisjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KQEAgLTMyMyw3ICszMjYsMjEgQEAKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgY2N3X3JlcXVlc3QgKnJlcSA9ICZjZGV2LT5wcml2YXRlLT5yZXE7Ci0JaW50IHJjOworCWludCByYyA9IC1FTk9ERVYsIGNocDsKKworCWlmIChjaW9fdXBkYXRlX3NjaGliKHNjaCkpCisJCWdvdG8gZXJyOworCisJZm9yIChjaHAgPSAwOyBjaHAgPCA4OyBjaHArKykgeworCQlpZiAoKDB4ODAgPj4gY2hwKSAmIHNjaC0+c2NoaWIucG1jdy5scHVtKQorCQkJcHJfd2FybmluZygiJXM6IE5vIGludGVycnVwdCB3YXMgcmVjZWl2ZWQgd2l0aGluICVsdXMgIgorCQkJCSAgICIoQ1M9JTAyeCwgRFM9JTAyeCwgQ0hQSUQ9JXguJTAyeClcbiIsCisJCQkJICAgZGV2X25hbWUoJmNkZXYtPmRldiksIHJlcS0+dGltZW91dCAvIEhaLAorCQkJCSAgIHNjc3dfY3N0YXQoJnNjaC0+c2NoaWIuc2NzdyksCisJCQkJICAgc2Nzd19kc3RhdCgmc2NoLT5zY2hpYi5zY3N3KSwKKwkJCQkgICBzY2gtPnNjaGlkLmNzc2lkLAorCQkJCSAgIHNjaC0+c2NoaWIucG1jdy5jaHBpZFtjaHBdKTsKKwl9CiAKIAlpZiAoIWNjd3JlcV9uZXh0X3BhdGgoY2RldikpIHsKIAkJLyogc2V0IHRoZSBmaW5hbCByZXR1cm4gY29kZSBmb3IgdGhpcyByZXF1ZXN0ICovCkBAIC0zNDIsNyArMzU5LDcgQEAKICAqIGNjd19yZXF1ZXN0X25vdG9wZXIgLSBub3RvcGVyIGhhbmRsZXIgZm9yIEkvTyByZXF1ZXN0IHByb2NlZHVyZQogICogQGNkZXY6IGNjdyBkZXZpY2UKICAqCi0gKiBIYW5kbGUgdGltZW91dCBkdXJpbmcgSS9PIHJlcXVlc3QgcHJvY2VkdXJlLgorICogSGFuZGxlIG5vdG9wZXIgZHVyaW5nIEkvTyByZXF1ZXN0IHByb2NlZHVyZS4KICAqLwogdm9pZCBjY3dfcmVxdWVzdF9ub3RvcGVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKaW5kZXggMmQzMjIzMy4uZTc5MjQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHAuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCkBAIC0xMCw2ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjX3NjaC5jCmluZGV4IGU5NTBmMWEuLjBjODdiMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzY19zY2guYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2Nfc2NoLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogRHJpdmVyIGZvciBzMzkwIGNoc2Mgc3ViY2hhbm5lbHMKICAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDgsIDIwMDkKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOCwgMjAxMQogICoKICAqIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgogICoKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSA8YXNtL2Npby5oPgpAQCAtNTYsNiArNTcsOCBAQAogCiAJQ0hTQ19MT0coNCwgImlyYiIpOwogCUNIU0NfTE9HX0hFWCg0LCBpcmIsIHNpemVvZigqaXJiKSk7CisJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DU0NdKys7CisKIAkvKiBDb3B5IGlyYiB0byBwcm92aWRlZCByZXF1ZXN0IGFuZCBzZXQgZG9uZS4gKi8KIAlpZiAoIXJlcXVlc3QpIHsKIAkJQ0hTQ19NU0coMCwgIkludGVycnVwdCBvbiBzY2ggMC4leC4lMDR4IHdpdGggbm8gcmVxdWVzdFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IGViMzE0MGUuLmRjNjdjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtNjIyLDYgKzYyMiw3IEBACiAJCXNjaCA9IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKSh1bnNpZ25lZCBsb25nKXRwaV9pbmZvLT5pbnRwYXJtOwogCQlpZiAoIXNjaCkgewogCQkJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgY29uZGl0aW9uLiAqLworCQkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CiAJCQl0c2NoKHRwaV9pbmZvLT5zY2hpZCwgaXJiKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC02MzQsNyArNjM1LDEwIEBACiAJCQkvKiBDYWxsIGludGVycnVwdCBoYW5kbGVyIGlmIHRoZXJlIGlzIG9uZS4gKi8KIAkJCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+aXJxKQogCQkJCXNjaC0+ZHJpdmVyLT5pcnEoc2NoKTsKLQkJfQorCQkJZWxzZQorCQkJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOworCQl9IGVsc2UKKwkJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOwogCQlzcGluX3VubG9jayhzY2gtPmxvY2spOwogCQkvKgogCQkgKiBBcmUgbW9yZSBpbnRlcnJ1cHRzIHBlbmRpbmc/CkBAIC02NjcsMTggKzY3MSwyMyBAQAogCXRwaV9pbmZvID0gKHN0cnVjdCB0cGlfaW5mbyAqKSZTMzkwX2xvd2NvcmUuc3ViY2hhbm5lbF9pZDsKIAlpZiAodHBpKE5VTEwpICE9IDEpCiAJCXJldHVybiAwOworCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9fSU5URVJSVVBUXSsrOwogCWlmICh0cGlfaW5mby0+YWRhcHRlcl9JTykgewogCQlkb19hZGFwdGVyX0lPKHRwaV9pbmZvLT5pc2MpOwogCQlyZXR1cm4gMTsKIAl9CiAJaXJiID0gKHN0cnVjdCBpcmIgKikmUzM5MF9sb3djb3JlLmlyYjsKIAkvKiBTdG9yZSBpbnRlcnJ1cHQgcmVzcG9uc2UgYmxvY2sgdG8gbG93Y29yZS4gKi8KLQlpZiAodHNjaCh0cGlfaW5mby0+c2NoaWQsIGlyYikgIT0gMCkKKwlpZiAodHNjaCh0cGlfaW5mby0+c2NoaWQsIGlyYikgIT0gMCkgewogCQkvKiBOb3Qgc3RhdHVzIHBlbmRpbmcgb3Igbm90IG9wZXJhdGlvbmFsLiAqLworCQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0NJT10rKzsKIAkJcmV0dXJuIDE7CisJfQogCXNjaCA9IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKSh1bnNpZ25lZCBsb25nKXRwaV9pbmZvLT5pbnRwYXJtOwotCWlmICghc2NoKQorCWlmICghc2NoKSB7CisJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOwogCQlyZXR1cm4gMTsKKwl9CiAJaXJxX2NvbnRleHQgPSBpbl9pbnRlcnJ1cHQoKTsKIAlpZiAoIWlycV9jb250ZXh0KQogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CkBAIC02ODcsNiArNjk2LDggQEAKIAltZW1jcHkoJnNjaC0+c2NoaWIuc2NzdywgJmlyYi0+c2Nzdywgc2l6ZW9mKHVuaW9uIHNjc3cpKTsKIAlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPmlycSkKIAkJc2NoLT5kcml2ZXItPmlycShzY2gpOworCWVsc2UKKwkJa3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9DSU9dKys7CiAJc3Bpbl91bmxvY2soc2NoLT5sb2NrKTsKIAlpcnFfZXhpdCgpOwogCWlmICghaXJxX2NvbnRleHQpCkBAIC0xMDU4LDcgKzEwNjksNyBAQAogewogCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwogCi0JczM5MF9yZXNldF9zeXN0ZW0oKTsKKwlzMzkwX3Jlc2V0X3N5c3RlbShOVUxMLCBOVUxMKTsKIAlpZiAocmVpcGxfZmluZF9zY2hpZChkZXZpZCwgJnNjaGlkKSAhPSAwKQogCQlwYW5pYygiSVBMIERldmljZSBub3QgZm91bmRcbiIpOwogCWRvX3JlaXBsX2FzbSgqKChfX3UzMiopJnNjaGlkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaAppbmRleCA4MGViZGRkLi4zM2JiNGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKQEAgLTEzMyw2ICsxMzMsOCBAQAogCiBleHRlcm4gc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjaGFubmVsX3N1YnN5c3RlbXNbXTsKIAordm9pZCBjaGFubmVsX3N1YnN5c3RlbV9yZWluaXQodm9pZCk7CisKIC8qIEhlbHBlciBmdW5jdGlvbnMgdG8gYnVpbGQgbGlzdHMgZm9yIHRoZSBzbG93IHBhdGguICovCiB2b2lkIGNzc19zY2hlZHVsZV9ldmFsKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKTsKIHZvaWQgY3NzX3NjaGVkdWxlX2V2YWxfYWxsKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggOGUwNGMwMC4uZDczNGY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9jaW8uaD4KQEAgLTc0Nyw2ICs3NDgsNyBAQAogCQkJCQlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAljZGV2LT5wcml2YXRlLT5jZGV2ID0gY2RldjsKKwljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBJT0lOVF9DSU87CiAJYXRvbWljX3NldCgmY2Rldi0+cHJpdmF0ZS0+b25vZmYsIDApOwogCWNkZXYtPmRldi5wYXJlbnQgPSAmc2NoLT5kZXY7CiAJY2Rldi0+ZGV2LnJlbGVhc2UgPSBjY3dfZGV2aWNlX3JlbGVhc2U7CkBAIC0xMDEwLDYgKzEwMTIsOCBAQAogCUNJT19UUkFDRV9FVkVOVCg2LCBkZXZfbmFtZSgmc2NoLT5kZXYpKTsKIAlpZiAoY2RldikKIAkJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfSU5URVJSVVBUKTsKKwllbHNlCisJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOwogfQogCiB2b2lkIGlvX3N1YmNoYW5uZWxfaW5pdF9jb25maWcoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKQEAgLTE2MjEsNiArMTYyNSw3IEBACiAJbWVtc2V0KCZjb25zb2xlX3ByaXZhdGUsIDAsIHNpemVvZihzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlKSk7CiAJY29uc29sZV9jZGV2LnByaXZhdGUgPSAmY29uc29sZV9wcml2YXRlOwogCWNvbnNvbGVfcHJpdmF0ZS5jZGV2ID0gJmNvbnNvbGVfY2RldjsKKwljb25zb2xlX3ByaXZhdGUuaW50X2NsYXNzID0gSU9JTlRfQ0lPOwogCXJldCA9IGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUoJmNvbnNvbGVfY2Rldiwgc2NoKTsKIAlpZiAocmV0KSB7CiAJCWNpb19yZWxlYXNlX2NvbnNvbGUoKTsKQEAgLTE3MDIsMTEgKzE3MDcsMTggQEAKIAlpbnQgcmV0OwogCiAJY2Rldi0+ZHJ2ID0gY2RydjsgLyogdG8gbGV0IHRoZSBkcml2ZXIgY2FsbCBfc2V0X29ubGluZSAqLworCS8qIE5vdGU6IHdlIGludGVycHJldCBjbGFzcyAwIGluIHRoaXMgY29udGV4dCBhcyBhbiB1bmluaXRpYWxpemVkCisJICogZmllbGQgc2luY2UgaXQgdHJhbnNsYXRlcyB0byBhIG5vbi1JL08gaW50ZXJydXB0IGNsYXNzLiAqLworCWlmIChjZHJ2LT5pbnRfY2xhc3MgIT0gMCkKKwkJY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzID0gY2Rydi0+aW50X2NsYXNzOworCWVsc2UKKwkJY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzID0gSU9JTlRfQ0lPOwogCiAJcmV0ID0gY2Rydi0+cHJvYmUgPyBjZHJ2LT5wcm9iZShjZGV2KSA6IC1FTk9ERVY7CiAKIAlpZiAocmV0KSB7CiAJCWNkZXYtPmRydiA9IE5VTEw7CisJCWNkZXYtPnByaXZhdGUtPmludF9jbGFzcyA9IElPSU5UX0NJTzsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE3NDAsNiArMTc1Miw3IEBACiAJfQogCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7CiAJY2Rldi0+ZHJ2ID0gTlVMTDsKKwljZGV2LT5wcml2YXRlLT5pbnRfY2xhc3MgPSBJT0lOVF9DSU87CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmggYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCmluZGV4IDBiNzI0NWMuLjE3OTgyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgImlvX3NjaC5oIgogCiAvKgpAQCAtNTYsNyArNTcsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZGV2X2ZzbV9ldmVudChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgZW51bSBkZXZfZXZlbnQgZGV2X2V2ZW50KQogewotCWRldl9qdW1wdGFibGVbY2Rldi0+cHJpdmF0ZS0+c3RhdGVdW2Rldl9ldmVudF0oY2RldiwgZGV2X2V2ZW50KTsKKwlpbnQgc3RhdGUgPSBjZGV2LT5wcml2YXRlLT5zdGF0ZTsKKworCWlmIChkZXZfZXZlbnQgPT0gREVWX0VWRU5UX0lOVEVSUlVQVCkgeworCQlpZiAoc3RhdGUgPT0gREVWX1NUQVRFX09OTElORSkKKwkJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLgorCQkJCWlycXNbY2Rldi0+cHJpdmF0ZS0+aW50X2NsYXNzXSsrOworCQllbHNlIGlmIChzdGF0ZSAhPSBERVZfU1RBVEVfQ01GQ0hBTkdFICYmCisJCQkgc3RhdGUgIT0gREVWX1NUQVRFX0NNRlVQREFURSkKKwkJCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ0lPXSsrOworCX0KKwlkZXZfanVtcHRhYmxlW3N0YXRlXVtkZXZfZXZlbnRdKGNkZXYsIGRldl9ldmVudCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaAppbmRleCBiYTMxYWQ4Li4yZWJiNDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2NoaWQuaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgIm9yYi5oIgogCkBAIC0xNTcsNiArMTU4LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNtYl9saXN0OwkvKiBsaXN0IG9mIG1lYXN1cmVkIGRldmljZXMgKi8KIAl1NjQgY21iX3N0YXJ0X3RpbWU7CQkvKiBjbG9jayB2YWx1ZSBvZiBjbWIgcmVzZXQgKi8KIAl2b2lkICpjbWJfd2FpdDsJCQkvKiBkZWZlcnJlZCBjbWIgZW5hYmxlL2Rpc2FibGUgKi8KKwllbnVtIGludGVycnVwdGlvbl9jbGFzcyBpbnRfY2xhc3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCByc2NoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmggYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAppbmRleCAzZGQ4NjQ0Li5iOTYyZmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaApAQCAtMTgsMTQgKzE4LDYgQEAKICNkZWZpbmUgUURJT19CVVNZX0JJVF9SRVRSSUVTCQkxMDAwCQkvKiA9IDEwcyByZXRyeSB0aW1lICovCiAjZGVmaW5lIFFESU9fSU5QVVRfVEhSRVNIT0xECQkoNTAwIDw8IDEyKQkvKiA1MDAgbWljcm9zZWNvbmRzICovCiAKLS8qCi0gKiBpZiBhbiBhc3luY2hyb25vdXMgSGlwZXJTb2NrZXRzIHF1ZXVlIHJ1bnMgZnVsbCwgdGhlIDEwIHNlY29uZHMgdGltZXIgd2FpdAotICogdGlsbCBuZXh0IGluaXRpYXRpdmUgdG8gZ2l2ZSB0cmFuc21pdHRlZCBza2JzIGJhY2sgdG8gdGhlIHN0YWNrIGlzIHRvbyBsb25nLgotICogVGhlcmVmb3JlIHBvbGxpbmcgaXMgc3RhcnRlZCBpbiBjYXNlIG9mIG11bHRpY2FzdCBxdWV1ZSBpcyBmaWxsZWQgbW9yZQotICogdGhhbiA1MCBwZXJjZW50LgotICovCi0jZGVmaW5lIFFESU9fSVFESU9fUE9MTF9MVkwJCTY1CS8qIEhTIG11bHRpY2FzdCBxdWV1ZSAqLwotCiBlbnVtIHFkaW9faXJxX3N0YXRlcyB7CiAJUURJT19JUlFfU1RBVEVfSU5BQ1RJVkUsCiAJUURJT19JUlFfU1RBVEVfRVNUQUJMSVNIRUQsCkBAIC0yOTAsNiArMjgyLDkgQEAKIAkvKiBlcnJvciBjb25kaXRpb24gZHVyaW5nIGEgZGF0YSB0cmFuc2ZlciAqLwogCXVuc2lnbmVkIGludCBxZGlvX2Vycm9yOwogCisJLyogbGFzdCBzY2FuIG9mIHRoZSBxdWV1ZSAqLworCXU2NCB0aW1lc3RhbXA7CisKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKIAlzdHJ1Y3QgcWRpb19xdWV1ZV9wZXJmX3N0YXQgcV9zdGF0czsKIApAQCAtNDIzLDMxICs0MTgsNyBAQAogI2RlZmluZSBxdWV1ZV9pcnFzX2Rpc2FibGVkKHEpCQkJXAogCSh0ZXN0X2JpdChRRElPX1FVRVVFX0lSUVNfRElTQUJMRUQsICZxLT51LmluLnF1ZXVlX2lycV9zdGF0ZSkgIT0gMCkKIAotI2RlZmluZSBUSVFESU9fU0hBUkVEX0lORAkJNjMKLQotLyogZGV2aWNlIHN0YXRlIGNoYW5nZSBpbmRpY2F0b3JzICovCi1zdHJ1Y3QgaW5kaWNhdG9yX3QgewotCXUzMiBpbmQ7CS8qIHUzMiBiZWNhdXNlIG9mIGNvbXBhcmUtYW5kLXN3YXAgcGVyZm9ybWFuY2UgKi8KLQlhdG9taWNfdCBjb3VudDsgLyogdXNlIGNvdW50LCAwIG9yIDEgZm9yIG5vbi1zaGFyZWQgaW5kaWNhdG9ycyAqLwotfTsKLQotZXh0ZXJuIHN0cnVjdCBpbmRpY2F0b3JfdCAqcV9pbmRpY2F0b3JzOwotCi1zdGF0aWMgaW5saW5lIGludCBoYXNfbXVsdGlwbGVfaW5xX29uX2RzY2koc3RydWN0IHFkaW9faXJxICppcnEpCi17Ci0JcmV0dXJuIGlycS0+bnJfaW5wdXRfcXMgPiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludCByZWZlcmVuY2VzX3NoYXJlZF9kc2NpKHN0cnVjdCBxZGlvX2lycSAqaXJxKQotewotCXJldHVybiBpcnEtPmRzY2kgPT0gJnFfaW5kaWNhdG9yc1tUSVFESU9fU0hBUkVEX0lORF0uaW5kOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzaGFyZWRfaW5kKHN0cnVjdCBxZGlvX3EgKnEpCi17Ci0Jc3RydWN0IHFkaW9faXJxICppID0gcS0+aXJxX3B0cjsKLQlyZXR1cm4gcmVmZXJlbmNlc19zaGFyZWRfZHNjaShpKSB8fCBoYXNfbXVsdGlwbGVfaW5xX29uX2RzY2koaSk7Ci19CitleHRlcm4gdTY0IGxhc3RfYWlfdGltZTsKIAogLyogcHJvdG90eXBlcyBmb3IgdGhpbiBpbnRlcnJ1cHQgKi8KIHZvaWQgcWRpb19zZXR1cF90aGluaW50KHN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cik7CkBAIC00NjAsNyArNDMxLDggQEAKIHZvaWQgdGlxZGlvX2ZyZWVfbWVtb3J5KHZvaWQpOwogaW50IHRpcWRpb19yZWdpc3Rlcl90aGluaW50cyh2b2lkKTsKIHZvaWQgdGlxZGlvX3VucmVnaXN0ZXJfdGhpbmludHModm9pZCk7Ci0KK3ZvaWQgY2xlYXJfbm9uc2hhcmVkX2luZChzdHJ1Y3QgcWRpb19pcnEgKik7CitpbnQgdGVzdF9ub25zaGFyZWRfaW5kKHN0cnVjdCBxZGlvX2lycSAqKTsKIAogLyogcHJvdG90eXBlcyBmb3Igc2V0dXAgKi8KIHZvaWQgcWRpb19pbmJvdW5kX3Byb2Nlc3NpbmcodW5zaWduZWQgbG9uZyBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKaW5kZXggYWFmN2Y5My4uMjkwMjFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKQEAgLTcsNiArNyw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSAicWRpb19kZWJ1Zy5oIgogI2luY2x1ZGUgInFkaW8uaCIKQEAgLTU0LDE1ICs1NiwxNyBAQAogCWlmICghcSkKIAkJcmV0dXJuIDA7CiAKLQlzZXFfcHJpbnRmKG0sICJEU0NJOiAlZCAgIG5yX3VzZWQ6ICVkXG4iLAotCQkgICAqKHUzMiAqKXEtPmlycV9wdHItPmRzY2ksIGF0b21pY19yZWFkKCZxLT5ucl9idWZfdXNlZCkpOwotCXNlcV9wcmludGYobSwgImZ0YzogJWQgIGxhc3RfbW92ZTogJWRcbiIsCisJc2VxX3ByaW50ZihtLCAiVGltZXN0YW1wOiAlTHggIExhc3QgQUk6ICVMeFxuIiwKKwkJICAgcS0+dGltZXN0YW1wLCBsYXN0X2FpX3RpbWUpOworCXNlcV9wcmludGYobSwgIm5yX3VzZWQ6ICVkICBmdGM6ICVkICBsYXN0X21vdmU6ICVkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmcS0+bnJfYnVmX3VzZWQpLAogCQkgICBxLT5maXJzdF90b19jaGVjaywgcS0+bGFzdF9tb3ZlKTsKIAlpZiAocS0+aXNfaW5wdXRfcSkgewogCQlzZXFfcHJpbnRmKG0sICJwb2xsaW5nOiAlZCAgYWNrIHN0YXJ0OiAlZCAgYWNrIGNvdW50OiAlZFxuIiwKIAkJCSAgIHEtPnUuaW4ucG9sbGluZywgcS0+dS5pbi5hY2tfc3RhcnQsCiAJCQkgICBxLT51LmluLmFja19jb3VudCk7Ci0JCXNlcV9wcmludGYobSwgIklSUXMgZGlzYWJsZWQ6ICV1XG4iLAorCQlzZXFfcHJpbnRmKG0sICJEU0NJOiAlZCAgIElSUXMgZGlzYWJsZWQ6ICV1XG4iLAorCQkJICAgKih1MzIgKilxLT5pcnFfcHRyLT5kc2NpLAogCQkJICAgdGVzdF9iaXQoUURJT19RVUVVRV9JUlFTX0RJU0FCTEVELAogCQkJICAgJnEtPnUuaW4ucXVldWVfaXJxX3N0YXRlKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKaW5kZXggOWExMjIyOC4uM2VmOGQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3FkaW8uaD4KQEAgLTEwNSw5ICsxMDQsMTIgQEAKIAkvKiBhbGwgZG9uZSBvciBuZXh0IGJ1ZmZlciBzdGF0ZSBkaWZmZXJlbnQgKi8KIAlpZiAoY2NxID09IDAgfHwgY2NxID09IDMyKQogCQlyZXR1cm4gMDsKLQkvKiBub3QgYWxsIGJ1ZmZlcnMgcHJvY2Vzc2VkICovCi0JaWYgKGNjcSA9PSA5NiB8fCBjY3EgPT0gOTcpCisJLyogbm8gYnVmZmVyIHByb2Nlc3NlZCAqLworCWlmIChjY3EgPT0gOTcpCiAJCXJldHVybiAxOworCS8qIG5vdCBhbGwgYnVmZmVycyBwcm9jZXNzZWQgKi8KKwlpZiAoY2NxID09IDk2KQorCQlyZXR1cm4gMjsKIAkvKiBub3RpZnkgZGV2aWNlcyBpbW1lZGlhdGVseSAqLwogCURCRl9FUlJPUigiJTR4IGNjcTolM2QiLCBTQ0hfTk8ocSksIGNjcSk7CiAJcmV0dXJuIC1FSU87CkBAIC0xMjcsMTAgKzEyOSw4IEBACiBzdGF0aWMgaW50IHFkaW9fZG9fZXFicyhzdHJ1Y3QgcWRpb19xICpxLCB1bnNpZ25lZCBjaGFyICpzdGF0ZSwKIAkJCWludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYXV0b19hY2spCiB7CisJaW50IHJjLCB0bXBfY291bnQgPSBjb3VudCwgdG1wX3N0YXJ0ID0gc3RhcnQsIG5yID0gcS0+bnIsIHJldHJpZWQgPSAwOwogCXVuc2lnbmVkIGludCBjY3EgPSAwOwotCWludCB0bXBfY291bnQgPSBjb3VudCwgdG1wX3N0YXJ0ID0gc3RhcnQ7Ci0JaW50IG5yID0gcS0+bnI7Ci0JaW50IHJjOwogCiAJQlVHX09OKCFxLT5pcnFfcHRyLT5zY2hfdG9rZW4pOwogCXFwZXJmX2luYyhxLCBlcWJzKTsKQEAgLTE0MSwyOSArMTQxLDM0IEBACiAJY2NxID0gZG9fZXFicyhxLT5pcnFfcHRyLT5zY2hfdG9rZW4sIHN0YXRlLCBuciwgJnRtcF9zdGFydCwgJnRtcF9jb3VudCwKIAkJICAgICAgYXV0b19hY2spOwogCXJjID0gcWRpb19jaGVja19jY3EocSwgY2NxKTsKLQotCS8qIEF0IGxlYXN0IG9uZSBidWZmZXIgd2FzIHByb2Nlc3NlZCwgcmV0dXJuIGFuZCBleHRyYWN0IHRoZSByZW1haW5pbmcKLQkgKiBidWZmZXJzIGxhdGVyLgotCSAqLwotCWlmICgoY2NxID09IDk2KSAmJiAoY291bnQgIT0gdG1wX2NvdW50KSkgewotCQlxcGVyZl9pbmMocSwgZXFic19wYXJ0aWFsKTsKLQkJcmV0dXJuIChjb3VudCAtIHRtcF9jb3VudCk7Ci0JfQorCWlmICghcmMpCisJCXJldHVybiBjb3VudCAtIHRtcF9jb3VudDsKIAogCWlmIChyYyA9PSAxKSB7CiAJCURCRl9ERVZfRVZFTlQoREJGX1dBUk4sIHEtPmlycV9wdHIsICJFUUJTIGFnYWluOiUyZCIsIGNjcSk7CiAJCWdvdG8gYWdhaW47CiAJfQogCi0JaWYgKHJjIDwgMCkgewotCQlEQkZfRVJST1IoIiU0eCBFUUJTIEVSUk9SIiwgU0NIX05PKHEpKTsKLQkJREJGX0VSUk9SKCIlM2QlM2QlMmQiLCBjb3VudCwgdG1wX2NvdW50LCBucik7Ci0JCXEtPmhhbmRsZXIocS0+aXJxX3B0ci0+Y2RldiwKLQkJCSAgIFFESU9fRVJST1JfQUNUSVZBVEVfQ0hFQ0tfQ09ORElUSU9OLAotCQkJICAgMCwgLTEsIC0xLCBxLT5pcnFfcHRyLT5pbnRfcGFybSk7Ci0JCXJldHVybiAwOworCWlmIChyYyA9PSAyKSB7CisJCUJVR19PTih0bXBfY291bnQgPT0gY291bnQpOworCQlxcGVyZl9pbmMocSwgZXFic19wYXJ0aWFsKTsKKwkJREJGX0RFVl9FVkVOVChEQkZfV0FSTiwgcS0+aXJxX3B0ciwgIkVRQlMgcGFydDolMDJ4IiwKKwkJCXRtcF9jb3VudCk7CisJCS8qCisJCSAqIFJldHJ5IG9uY2UsIGlmIHRoYXQgZmFpbHMgYmFpbCBvdXQgYW5kIHByb2Nlc3MgdGhlCisJCSAqIGV4dHJhY3RlZCBidWZmZXJzIGJlZm9yZSB0cnlpbmcgYWdhaW4uCisJCSAqLworCQlpZiAoIXJldHJpZWQrKykKKwkJCWdvdG8gYWdhaW47CisJCWVsc2UKKwkJCXJldHVybiBjb3VudCAtIHRtcF9jb3VudDsKIAl9Ci0JcmV0dXJuIGNvdW50IC0gdG1wX2NvdW50OworCisJREJGX0VSUk9SKCIlNHggRVFCUyBFUlJPUiIsIFNDSF9OTyhxKSk7CisJREJGX0VSUk9SKCIlM2QlM2QlMmQiLCBjb3VudCwgdG1wX2NvdW50LCBucik7CisJcS0+aGFuZGxlcihxLT5pcnFfcHRyLT5jZGV2LCBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTiwKKwkJICAgMCwgLTEsIC0xLCBxLT5pcnFfcHRyLT5pbnRfcGFybSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTk2LDIxICsyMDEsMjIgQEAKIGFnYWluOgogCWNjcSA9IGRvX3NxYnMocS0+aXJxX3B0ci0+c2NoX3Rva2VuLCBzdGF0ZSwgbnIsICZ0bXBfc3RhcnQsICZ0bXBfY291bnQpOwogCXJjID0gcWRpb19jaGVja19jY3EocSwgY2NxKTsKLQlpZiAocmMgPT0gMSkgeworCWlmICghcmMpIHsKKwkJV0FSTl9PTih0bXBfY291bnQpOworCQlyZXR1cm4gY291bnQgLSB0bXBfY291bnQ7CisJfQorCisJaWYgKHJjID09IDEgfHwgcmMgPT0gMikgewogCQlEQkZfREVWX0VWRU5UKERCRl9JTkZPLCBxLT5pcnFfcHRyLCAiU1FCUyBhZ2FpbjolMmQiLCBjY3EpOwogCQlxcGVyZl9pbmMocSwgc3Fic19wYXJ0aWFsKTsKIAkJZ290byBhZ2FpbjsKIAl9Ci0JaWYgKHJjIDwgMCkgewotCQlEQkZfRVJST1IoIiU0eCBTUUJTIEVSUk9SIiwgU0NIX05PKHEpKTsKLQkJREJGX0VSUk9SKCIlM2QlM2QlMmQiLCBjb3VudCwgdG1wX2NvdW50LCBucik7Ci0JCXEtPmhhbmRsZXIocS0+aXJxX3B0ci0+Y2RldiwKLQkJCSAgIFFESU9fRVJST1JfQUNUSVZBVEVfQ0hFQ0tfQ09ORElUSU9OLAotCQkJICAgMCwgLTEsIC0xLCBxLT5pcnFfcHRyLT5pbnRfcGFybSk7Ci0JCXJldHVybiAwOwotCX0KLQlXQVJOX09OKHRtcF9jb3VudCk7Ci0JcmV0dXJuIGNvdW50IC0gdG1wX2NvdW50OworCisJREJGX0VSUk9SKCIlNHggU1FCUyBFUlJPUiIsIFNDSF9OTyhxKSk7CisJREJGX0VSUk9SKCIlM2QlM2QlMmQiLCBjb3VudCwgdG1wX2NvdW50LCBucik7CisJcS0+aGFuZGxlcihxLT5pcnFfcHRyLT5jZGV2LCBRRElPX0VSUk9SX0FDVElWQVRFX0NIRUNLX0NPTkRJVElPTiwKKwkJICAgMCwgLTEsIC0xLCBxLT5pcnFfcHRyLT5pbnRfcGFybSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHJldHVybnMgbnVtYmVyIG9mIGV4YW1pbmVkIGJ1ZmZlcnMgYW5kIHRoZWlyIGNvbW1vbiBzdGF0ZSBpbiAqc3RhdGUgKi8KQEAgLTI3NSw3ICsyODEsNyBAQAogfQogCiAvKiBzZXQgc2xzYiBzdGF0ZXMgdG8gaW5pdGlhbCBzdGF0ZSAqLwotdm9pZCBxZGlvX2luaXRfYnVmX3N0YXRlcyhzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCitzdGF0aWMgdm9pZCBxZGlvX2luaXRfYnVmX3N0YXRlcyhzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCiB7CiAJc3RydWN0IHFkaW9fcSAqcTsKIAlpbnQgaTsKQEAgLTQ0NCw3ICs0NTAsNyBAQAogCQlxcGVyZl9pbmMocSwgdGFyZ2V0X2Z1bGwpOwogCQlEQkZfREVWX0VWRU5UKERCRl9JTkZPLCBxLT5pcnFfcHRyLCAiT1VURlVMTCBGVEM6JTAyeCIsCiAJCQkgICAgICBxLT5maXJzdF90b19jaGVjayk7Ci0JCXJldHVybjsKKwkJZ290byBzZXQ7CiAJfQogCiAJREJGX0VSUk9SKCIlNHggQlVGIEVSUk9SIiwgU0NIX05PKHEpKTsKQEAgLTQ1NCw2ICs0NjAsNyBAQAogCQkgIHEtPnNiYWxbcS0+Zmlyc3RfdG9fY2hlY2tdLT5lbGVtZW50WzE0XS5zZmxhZ3MsCiAJCSAgcS0+c2JhbFtxLT5maXJzdF90b19jaGVja10tPmVsZW1lbnRbMTVdLnNmbGFncyk7CiAKK3NldDoKIAkvKgogCSAqIEludGVycnVwdHMgbWF5IGJlIGF2b2lkZWQgYXMgbG9uZyBhcyB0aGUgZXJyb3IgaXMgcHJlc2VudAogCSAqIHNvIGNoYW5nZSB0aGUgYnVmZmVyIHN0YXRlIGltbWVkaWF0ZWx5IHRvIGF2b2lkIHN0YXJ2YXRpb24uCkBAIC01MTEsNiArNTE4LDggQEAKIAlpbnQgY291bnQsIHN0b3A7CiAJdW5zaWduZWQgY2hhciBzdGF0ZSA9IDA7CiAKKwlxLT50aW1lc3RhbXAgPSBnZXRfY2xvY2tfZmFzdCgpOworCiAJLyoKIAkgKiBEb24ndCBjaGVjayAxMjggYnVmZmVycywgYXMgb3RoZXJ3aXNlIHFkaW9faW5ib3VuZF9xX21vdmVkCiAJICogd291bGQgcmV0dXJuIDAuCkBAIC03ODAsNiArNzg5LDggQEAKIAlpbnQgY291bnQsIHN0b3A7CiAJdW5zaWduZWQgY2hhciBzdGF0ZSA9IDA7CiAKKwlxLT50aW1lc3RhbXAgPSBnZXRfY2xvY2tfZmFzdCgpOworCiAJaWYgKG5lZWRfc2lnYV9zeW5jKHEpKQogCQlpZiAoKChxdWV1ZV90eXBlKHEpICE9IFFESU9fSVFESU9fUUZNVCkgJiYKIAkJICAgICFwY2lfb3V0X3N1cHBvcnRlZChxKSkgfHwKQEAgLTkxMCwyMSArOTIxLDEzIEBACiAJCWlmICghcGNpX291dF9zdXBwb3J0ZWQocSkgJiYgIXFkaW9fb3V0Ym91bmRfcV9kb25lKHEpKQogCQkJZ290byBzY2hlZDsKIAotCS8qIGJhaWwgb3V0IGZvciBIaXBlclNvY2tldHMgdW5pY2FzdCBxdWV1ZXMgKi8KLQlpZiAocXVldWVfdHlwZShxKSA9PSBRRElPX0lRRElPX1FGTVQgJiYgIW11bHRpY2FzdF9vdXRib3VuZChxKSkKLQkJcmV0dXJuOwotCi0JaWYgKChxdWV1ZV90eXBlKHEpID09IFFESU9fSVFESU9fUUZNVCkgJiYKLQkgICAgKGF0b21pY19yZWFkKCZxLT5ucl9idWZfdXNlZCkpID4gUURJT19JUURJT19QT0xMX0xWTCkKLQkJZ290byBzY2hlZDsKLQogCWlmIChxLT51Lm91dC5wY2lfb3V0X2VuYWJsZWQpCiAJCXJldHVybjsKIAogCS8qCiAJICogTm93IHdlIGtub3cgdGhhdCBxdWV1ZSB0eXBlIGlzIGVpdGhlciBxZXRoIHdpdGhvdXQgcGNpIGVuYWJsZWQKLQkgKiBvciBIaXBlclNvY2tldHMgbXVsdGljYXN0LiBNYWtlIHN1cmUgYnVmZmVyIHN3aXRjaCBmcm9tIFBSSU1FRCB0bwotCSAqIEVNUFRZIGlzIG5vdGljZWQgYW5kIG91dGJvdW5kX2hhbmRsZXIgaXMgY2FsbGVkIGFmdGVyIHNvbWUgdGltZS4KKwkgKiBvciBIaXBlclNvY2tldHMuIE1ha2Ugc3VyZSBidWZmZXIgc3dpdGNoIGZyb20gUFJJTUVEIHRvIEVNUFRZCisJICogaXMgbm90aWNlZCBhbmQgb3V0Ym91bmRfaGFuZGxlciBpcyBjYWxsZWQgYWZ0ZXIgc29tZSB0aW1lLgogCSAqLwogCWlmIChxZGlvX291dGJvdW5kX3FfZG9uZShxKSkKIAkJZGVsX3RpbWVyKCZxLT51Lm91dC50aW1lcik7CkBAIC0xMDcwLDYgKzEwNzMsNyBAQAogewogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0ciA9IGNkZXYtPnByaXZhdGUtPnFkaW9fZGF0YTsKIAlzdHJ1Y3QgcWRpb19xICpxOworCWludCBjb3VudDsKIAogCURCRl9FUlJPUigiJTR4IEFDVCBDSEVDSyIsIGlycV9wdHItPnNjaGlkLnNjaF9ubyk7CiAJREJGX0VSUk9SKCJpbnRwIDolbHgiLCBpbnRwYXJtKTsKQEAgLTEwODMsOCArMTA4NywxMCBAQAogCQlkdW1wX3N0YWNrKCk7CiAJCWdvdG8gbm9faGFuZGxlcjsKIAl9CisKKwljb3VudCA9IHN1Yl9idWYocS0+Zmlyc3RfdG9fY2hlY2ssIHEtPmZpcnN0X3RvX2tpY2spOwogCXEtPmhhbmRsZXIocS0+aXJxX3B0ci0+Y2RldiwgUURJT19FUlJPUl9BQ1RJVkFURV9DSEVDS19DT05ESVRJT04sCi0JCSAgIDAsIC0xLCAtMSwgaXJxX3B0ci0+aW50X3Bhcm0pOworCQkgICBxLT5uciwgcS0+Zmlyc3RfdG9fa2ljaywgY291bnQsIGlycV9wdHItPmludF9wYXJtKTsKIG5vX2hhbmRsZXI6CiAJcWRpb19zZXRfc3RhdGUoaXJxX3B0ciwgUURJT19JUlFfU1RBVEVfU1RPUFBFRCk7CiB9CkBAIC0xMTIzLDcgKzExMjksNiBAQAogCQlyZXR1cm47CiAJfQogCi0Ja3N0YXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkuaXJxc1tJT0lOVF9RREldKys7CiAJaWYgKGlycV9wdHItPnBlcmZfc3RhdF9lbmFibGVkKQogCQlpcnFfcHRyLT5wZXJmX3N0YXQucWRpb19pbnQrKzsKIApAQCAtMTcxNCw5ICsxNzE5LDcgQEAKIAogCVdBUk5fT04ocXVldWVfaXJxc19lbmFibGVkKHEpKTsKIAotCWlmICghc2hhcmVkX2luZChxKSkKLQkJeGNoZyhxLT5pcnFfcHRyLT5kc2NpLCAwKTsKLQorCWNsZWFyX25vbnNoYXJlZF9pbmQoaXJxX3B0cik7CiAJcWRpb19zdG9wX3BvbGxpbmcocSk7CiAJY2xlYXJfYml0KFFESU9fUVVFVUVfSVJRU19ESVNBQkxFRCwgJnEtPnUuaW4ucXVldWVfaXJxX3N0YXRlKTsKIApAQCAtMTcyNCw3ICsxNzI3LDcgQEAKIAkgKiBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIHRvIG5vdCBsb3NlIGluaXRpYXRpdmUgYWZ0ZXIKIAkgKiByZXNldHRpbmcgdGhlIEFDSyBzdGF0ZS4KIAkgKi8KLQlpZiAoIXNoYXJlZF9pbmQocSkgJiYgKnEtPmlycV9wdHItPmRzY2kpCisJaWYgKHRlc3Rfbm9uc2hhcmVkX2luZChpcnFfcHRyKSkKIAkJZ290byByZXNjYW47CiAJaWYgKCFxZGlvX2luYm91bmRfcV9kb25lKHEpKQogCQlnb3RvIHJlc2NhbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19zZXR1cC5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKaW5kZXggZGQ4YmQ2Ny4uMmFjYzAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMKQEAgLTgsNiArOCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3FkaW8uaD4KIAogI2luY2x1ZGUgImNpby5oIgpAQCAtMzgxLDYgKzM4Miw3IEBACiAJaW50IGk7CiAKIAlpcnFfcHRyLT5xZHItPnFmbXQgPSBxZGlvX2luaXQtPnFfZm9ybWF0OworCWlycV9wdHItPnFkci0+YWMgPSBxZGlvX2luaXQtPnFkcl9hYzsKIAlpcnFfcHRyLT5xZHItPmlxZGNudCA9IHFkaW9faW5pdC0+bm9faW5wdXRfcXM7CiAJaXJxX3B0ci0+cWRyLT5vcWRjbnQgPSBxZGlvX2luaXQtPm5vX291dHB1dF9xczsKIAlpcnFfcHRyLT5xZHItPmlxZHN6ID0gc2l6ZW9mKHN0cnVjdCBxZGVzZm10MCkgLyA0OyAvKiBzaXplIGluIHdvcmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fdGhpbmludC5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX3RoaW5pbnQuYwppbmRleCBhM2UzOTQ5Li4wMTFlYWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fdGhpbmludC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb190aGluaW50LmMKQEAgLTI2LDE3ICsyNiwyNCBAQAogICovCiAjZGVmaW5lIFRJUURJT19OUl9OT05TSEFSRURfSU5ECQk2MwogI2RlZmluZSBUSVFESU9fTlJfSU5ESUNBVE9SUwkJKFRJUURJT19OUl9OT05TSEFSRURfSU5EICsgMSkKKyNkZWZpbmUgVElRRElPX1NIQVJFRF9JTkQJCTYzCisKKy8qIGRldmljZSBzdGF0ZSBjaGFuZ2UgaW5kaWNhdG9ycyAqLworc3RydWN0IGluZGljYXRvcl90IHsKKwl1MzIgaW5kOwkvKiB1MzIgYmVjYXVzZSBvZiBjb21wYXJlLWFuZC1zd2FwIHBlcmZvcm1hbmNlICovCisJYXRvbWljX3QgY291bnQ7IC8qIHVzZSBjb3VudCwgMCBvciAxIGZvciBub24tc2hhcmVkIGluZGljYXRvcnMgKi8KK307CiAKIC8qIGxpc3Qgb2YgdGhpbiBpbnRlcnJ1cHQgaW5wdXQgcXVldWVzICovCiBzdGF0aWMgTElTVF9IRUFEKHRpcV9saXN0KTsKLURFRklORV9NVVRFWCh0aXFfbGlzdF9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgodGlxX2xpc3RfbG9jayk7CiAKIC8qIGFkYXB0ZXIgbG9jYWwgc3VtbWFyeSBpbmRpY2F0b3IgKi8KIHN0YXRpYyB1OCAqdGlxZGlvX2Fsc2k7CiAKLXN0cnVjdCBpbmRpY2F0b3JfdCAqcV9pbmRpY2F0b3JzOworc3RhdGljIHN0cnVjdCBpbmRpY2F0b3JfdCAqcV9pbmRpY2F0b3JzOwogCi1zdGF0aWMgdTY0IGxhc3RfYWlfdGltZTsKK3U2NCBsYXN0X2FpX3RpbWU7CiAKIC8qIHJldHVybnMgYWRkciBmb3IgdGhlIGRldmljZSBzdGF0ZSBjaGFuZ2UgaW5kaWNhdG9yICovCiBzdGF0aWMgdTMyICpnZXRfaW5kaWNhdG9yKHZvaWQpCkBAIC05MCw2ICs5Nyw0MyBAQAogCXN5bmNocm9uaXplX3JjdSgpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBoYXNfbXVsdGlwbGVfaW5xX29uX2RzY2koc3RydWN0IHFkaW9faXJxICppcnFfcHRyKQoreworCXJldHVybiBpcnFfcHRyLT5ucl9pbnB1dF9xcyA+IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlZmVyZW5jZXNfc2hhcmVkX2RzY2koc3RydWN0IHFkaW9faXJxICppcnFfcHRyKQoreworCXJldHVybiBpcnFfcHRyLT5kc2NpID09ICZxX2luZGljYXRvcnNbVElRRElPX1NIQVJFRF9JTkRdLmluZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hhcmVkX2luZChzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIpCit7CisJcmV0dXJuIHJlZmVyZW5jZXNfc2hhcmVkX2RzY2koaXJxX3B0cikgfHwKKwkJaGFzX211bHRpcGxlX2lucV9vbl9kc2NpKGlycV9wdHIpOworfQorCit2b2lkIGNsZWFyX25vbnNoYXJlZF9pbmQoc3RydWN0IHFkaW9faXJxICppcnFfcHRyKQoreworCWlmICghaXNfdGhpbmludF9pcnEoaXJxX3B0cikpCisJCXJldHVybjsKKwlpZiAoc2hhcmVkX2luZChpcnFfcHRyKSkKKwkJcmV0dXJuOworCXhjaGcoaXJxX3B0ci0+ZHNjaSwgMCk7Cit9CisKK2ludCB0ZXN0X25vbnNoYXJlZF9pbmQoc3RydWN0IHFkaW9faXJxICppcnFfcHRyKQoreworCWlmICghaXNfdGhpbmludF9pcnEoaXJxX3B0cikpCisJCXJldHVybiAwOworCWlmIChzaGFyZWRfaW5kKGlycV9wdHIpKQorCQlyZXR1cm4gMDsKKwlpZiAoKmlycV9wdHItPmRzY2kpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIGNsZWFyX3NoYXJlZF9pbmQodm9pZCkKIHsKIAlpZiAoIWF0b21pY19yZWFkKCZxX2luZGljYXRvcnNbVElRRElPX1NIQVJFRF9JTkRdLmNvdW50KSkKQEAgLTExOSw3ICsxNjMsNyBAQAogCQkJcS0+dS5pbi5xdWV1ZV9zdGFydF9wb2xsKHEtPmlycV9wdHItPmNkZXYsIHEtPm5yLAogCQkJCQkJIHEtPmlycV9wdHItPmludF9wYXJtKTsKIAkJfSBlbHNlIHsKLQkJCWlmICghc2hhcmVkX2luZChxKSkKKwkJCWlmICghc2hhcmVkX2luZChxLT5pcnFfcHRyKSkKIAkJCQl4Y2hnKHEtPmlycV9wdHItPmRzY2ksIDApOwogCiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwppbmRleCBhZWM2MGQ1Li45NGY0OWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYworKysgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlydGlvX3JpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20va3ZtX3BhcmEuaD4KQEAgLTMzLDcgKzM0LDcgQEAKICAqIFRoZSBwb2ludGVyIHRvIG91ciAocGFnZSkgb2YgZGV2aWNlIGRlc2NyaXB0aW9ucy4KICAqLwogc3RhdGljIHZvaWQgKmt2bV9kZXZpY2VzOwotc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgaG90cGx1Z193b3JrOwogCiBzdHJ1Y3Qga3ZtX2RldmljZSB7CiAJc3RydWN0IHZpcnRpb19kZXZpY2UgdmRldjsKQEAgLTMzNCwxMCArMzM1LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgbWF0Y2hfZGVzYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKCh1bG9uZyl0b19rdm1kZXYoZGV2X3RvX3ZpcnRpbyhkZXYpKS0+ZGVzYyA9PSAodWxvbmcpZGF0YSkKLQkJcmV0dXJuIDE7CisJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPSBkZXZfdG9fdmlydGlvKGRldik7CisJc3RydWN0IGt2bV9kZXZpY2UgKmtkZXYgPSB0b19rdm1kZXYodmRldik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4ga2Rldi0+ZGVzYyA9PSBkYXRhOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwppbmRleCBmMWZhMjQ4Li5iNDFmYWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYwpAQCAtNjMsNyArNjMsNiBAQAogCiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJjbGF3IgogCi0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Njd2dyb3VwLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CkBAIC0yOTEsNiArMjkwLDcgQEAKIAkuaWRzCT0gY2xhd19pZHMsCiAJLnByb2JlCT0gY2N3Z3JvdXBfcHJvYmVfY2N3ZGV2LAogCS5yZW1vdmUJPSBjY3dncm91cF9yZW1vdmVfY2N3ZGV2LAorCS5pbnRfY2xhc3MgPSBJT0lOVF9DTFcsCiB9OwogCiBzdGF0aWMgc3NpemVfdApAQCAtNjQ1LDcgKzY0NSw2IEBACiAgICAgICAgIHN0cnVjdCBjbGF3X2VudiAgKnBfZW52OwogICAgICAgICBzdHJ1Y3QgY2hiayAqcF9jaF9yPU5VTEw7CiAKLQlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW0lPSU5UX0NMV10rKzsKIAlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiY2xhd2lycSIpOwogICAgICAgICAvKiBCeXBhc3MgYWxsICd1bnNvbGljaXRlZCBpbnRlcnJ1cHRzJyAqLwogCXByaXZwdHIgPSBkZXZfZ2V0X2RydmRhdGEoJmNkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21haW4uYwppbmRleCA0MjY3ODdlLi41Y2I5M2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tYWluLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgImN0Y20iCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTEyMDMsNyArMTIwMiw2IEBACiAJaW50IGNzdGF0OwogCWludCBkc3RhdDsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfQ1RDXSsrOwogCUNUQ01fREJGX1RFWFRfKFRSQUNFLCBDVENfREJGX0RFQlVHLAogCQkiRW50ZXIgJXMoJXMpIiwgQ1RDTV9GVU5UQUlMLCBkZXZfbmFtZSgmY2Rldi0+ZGV2KSk7CiAKQEAgLTE3NjksNiArMTc2Nyw3IEBACiAJLmlkcwk9IGN0Y21faWRzLAogCS5wcm9iZQk9IGNjd2dyb3VwX3Byb2JlX2Njd2RldiwKIAkucmVtb3ZlCT0gY2N3Z3JvdXBfcmVtb3ZlX2Njd2RldiwKKwkuaW50X2NsYXNzID0gSU9JTlRfQ1RDLAogfTsKIAogc3RhdGljIHN0cnVjdCBjY3dncm91cF9kcml2ZXIgY3RjbV9ncm91cF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fc3lzZnMuYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9zeXNmcy5jCmluZGV4IDgzMDUzMTkuLjY1MGFlYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9zeXNmcy5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLWNvbnN0IGNoYXIgKmN0Y21fdHlwZVtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKmN0Y21fdHlwZVtdID0gewogCSJub3QgYSBjaGFubmVsIiwKIAkiQ1RDL0EiLAogCSJGSUNPTiBjaGFubmVsIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCmluZGV4IGZiMjQ2Yjk0Li5jMjg3MTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQJCSJsY3MiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC0xMzk5LDcgKzEzOTgsNiBAQAogCWludCByYywgaW5kZXg7CiAJaW50IGNzdGF0LCBkc3RhdDsKIAotCWtzdGF0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpLmlycXNbSU9JTlRfTENTXSsrOwogCWlmIChsY3NfY2hlY2tfaXJiX2Vycm9yKGNkZXYsIGlyYikpCiAJCXJldHVybjsKIApAQCAtMTk3Miw3ICsxOTcwLDcgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHBvcnRubywgMDY0NCwgbGNzX3BvcnRub19zaG93LCBsY3NfcG9ydG5vX3N0b3JlKTsKIAotY29uc3QgY2hhciAqbGNzX3R5cGVbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpsY3NfdHlwZVtdID0gewogCSJub3QgYSBjaGFubmVsIiwKIAkiMjIxNiBwYXJhbGxlbCIsCiAJIjIyMTYgY2hhbm5lbCIsCkBAIC0yMzk5LDYgKzIzOTcsNyBAQAogCS5pZHMJPSBsY3NfaWRzLAogCS5wcm9iZQk9IGNjd2dyb3VwX3Byb2JlX2Njd2RldiwKIAkucmVtb3ZlCT0gY2N3Z3JvdXBfcmVtb3ZlX2Njd2RldiwKKwkuaW50X2NsYXNzID0gSU9JTlRfTENTLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwppbmRleCBjZTczNTIwLi5lNGMxMTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZXRoX2wzX3NldF9yeF9jc3VtKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIGludCBvbikKK3N0YXRpYyBpbnQgcWV0aF9sM19zZXRfcnhfY3N1bShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBpbnQgb24pCiB7CiAJaW50IHJjID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggNjQ1YjBmYy4uMDg2MDE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInpmY3BfZXh0LmgiCiAjaW5jbHVkZSAiemZjcF9mYy5oIgogI2luY2x1ZGUgInpmY3BfcmVxbGlzdC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKaW5kZXggZThiN2NlZS4uOTZmMTNhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2N3LmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9jY3cuYwpAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJ6ZmNwX2V4dC5oIgogI2luY2x1ZGUgInpmY3BfcmVxbGlzdC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwppbmRleCA5NmQxNDYyLi5hOWE4MTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKQEAgLTksNiArOSw3IEBACiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UICJ6ZmNwIgogI2RlZmluZSBwcl9mbXQoZm10KSBLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CkBAIC0xNjMsNiArMTY0LDQyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGJmLT5oYmFfbG9jaywgZmxhZ3MpOwogfQogCisvKioKKyAqIHpmY3BfZGJmX2hiYV9kZWZfZXJyIC0gdHJhY2UgZXZlbnQgZm9yIGRlZmVycmVkIGVycm9yIG1lc3NhZ2VzCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9hZGFwdGVyCisgKiBAcmVxX2lkOiByZXF1ZXN0IGlkIHdoaWNoIGNhdXNlZCB0aGUgZGVmZXJyZWQgZXJyb3IgbWVzc2FnZQorICogQHNjb3VudDogbnVtYmVyIG9mIHNiYWxzIGluY2wuIHRoZSBzaWduYWxpbmcgc2JhbAorICogQHBsOiBhcnJheSBvZiBhbGwgaW52b2x2ZWQgc2JhbHMKKyAqLwordm9pZCB6ZmNwX2RiZl9oYmFfZGVmX2VycihzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyLCB1NjQgcmVxX2lkLCB1MTYgc2NvdW50LAorCQkJICB2b2lkICoqcGwpCit7CisJc3RydWN0IHpmY3BfZGJmICpkYmYgPSBhZGFwdGVyLT5kYmY7CisJc3RydWN0IHpmY3BfZGJmX3BheSAqcGF5bG9hZCA9ICZkYmYtPnBheV9idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgbGVuZ3RoOworCisJaWYgKCFwbCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRiZi0+cGF5X2xvY2ssIGZsYWdzKTsKKwltZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKCpwYXlsb2FkKSk7CisKKwltZW1jcHkocGF5bG9hZC0+YXJlYSwgImRlZl9lcnIiLCA3KTsKKwlwYXlsb2FkLT5mc2ZfcmVxX2lkID0gcmVxX2lkOworCXBheWxvYWQtPmNvdW50ZXIgPSAwOworCWxlbmd0aCA9IG1pbigodTE2KXNpemVvZihzdHJ1Y3QgcWRpb19idWZmZXIpLAorCQkgICAgICh1MTYpWkZDUF9EQkZfUEFZX01BWF9SRUMpOworCisJd2hpbGUgKChjaGFyICopcGxbcGF5bG9hZC0+Y291bnRlcl0gJiYgcGF5bG9hZC0+Y291bnRlciA8IHNjb3VudCkgeworCQltZW1jcHkocGF5bG9hZC0+ZGF0YSwgKGNoYXIgKilwbFtwYXlsb2FkLT5jb3VudGVyXSwgbGVuZ3RoKTsKKwkJZGVidWdfZXZlbnQoZGJmLT5wYXksIDEsIHBheWxvYWQsIHpmY3BfZGJmX3BsZW4obGVuZ3RoKSk7CisJCXBheWxvYWQtPmNvdW50ZXIrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYmYtPnBheV9sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHpmY3BfZGJmX3NldF9jb21tb24oc3RydWN0IHpmY3BfZGJmX3JlYyAqcmVjLAogCQkJCXN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJc3RydWN0IHpmY3BfcG9ydCAqcG9ydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCmluZGV4IDUyN2JhNDguLmVkNWQ5MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaApAQCAtNzIsNiArNzIsNyBAQAogI2RlZmluZSBaRkNQX1NUQVRVU19DT01NT05fTk9FU0MJCTB4MDAyMDAwMDAKIAogLyogYWRhcHRlciBzdGF0dXMgKi8KKyNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9NQl9BQ1QJCTB4MDAwMDAwMDEKICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9RRElPVVAJCTB4MDAwMDAwMDIKICNkZWZpbmUgWkZDUF9TVEFUVVNfQURBUFRFUl9TSU9TTF9JU1NVRUQJMHgwMDAwMDAwNAogI2RlZmluZSBaRkNQX1NUQVRVU19BREFQVEVSX1hDT05GSUdfT0sJCTB4MDAwMDAwMDgKQEAgLTMxNCw0ICszMTUsMTAgQEAKIAl2b2lkCQkJKCpoYW5kbGVyKShzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogfTsKIAorc3RhdGljIGlubGluZQoraW50IHpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZhZGFwdGVyLT5zdGF0dXMpICYgWkZDUF9TVEFUVVNfQURBUFRFUl9NQl9BQ1Q7Cit9CisKICNlbmRpZiAvKiBaRkNQX0RFRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaAppbmRleCAwMzYyN2NmZC4uMjMwMmUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCkBAIC01Myw2ICs1Myw3IEBACiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfZnNmX3JlcyhjaGFyICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfYml0X2VycihjaGFyICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfYmVycihzdHJ1Y3QgemZjcF9kYmYgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKK2V4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9kZWZfZXJyKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKiwgdTY0LCB1MTYsIHZvaWQgKiopOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfc2FuX3JlcShjaGFyICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKiwgdTMyKTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX3Nhbl9yZXMoY2hhciAqLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfc2FuX2luX2VscyhjaGFyICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYwppbmRleCAwMjJmYjZhLi5lOWE3ODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKQEAgLTkzNiwzOSArOTM2LDQ3IEBACiAJCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcmVzcCkKIHsKIAlzdHJ1Y3QgemZjcF9hZGFwdGVyICphZGFwdGVyID0gcmVxLT5hZGFwdGVyOworCXN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8gPSBhZGFwdGVyLT5xZGlvOworCXN0cnVjdCBmc2ZfcXRjYiAqcXRjYiA9IHJlcS0+cXRjYjsKIAl1MzIgZmVhdCA9IGFkYXB0ZXItPmFkYXB0ZXJfZmVhdHVyZXM7Ci0JaW50IGJ5dGVzOwogCi0JaWYgKCEoZmVhdCAmIEZTRl9GRUFUVVJFX0VMU19DVF9DSEFJTkVEX1NCQUxTKSkgewotCQlpZiAoIXpmY3BfcWRpb19zZ19vbmVfc2JhbGUoc2dfcmVxKSB8fAotCQkgICAgIXpmY3BfcWRpb19zZ19vbmVfc2JhbGUoc2dfcmVzcCkpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKHpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKGFkYXB0ZXIpKSB7CisJCWlmICh6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVxKSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsIHNnX3Jlc3ApKQorCQkJcmV0dXJuIC1FSU87CiAKLQkJemZjcF9mc2Zfc2V0dXBfY3RfZWxzX3VuY2hhaW5lZChhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSwKLQkJCQkJCXNnX3JlcSwgc2dfcmVzcCk7CisJCXpmY3BfcWRpb19zZXRfZGF0YV9kaXYocWRpbywgJnJlcS0+cWRpb19yZXEsCisJCQkJCXpmY3BfcWRpb19zYmFsZV9jb3VudChzZ19yZXEpKTsKKwkJemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KHFkaW8sICZyZXEtPnFkaW9fcmVxKTsKKwkJemZjcF9xZGlvX3NldF9zY291bnQocWRpbywgJnJlcS0+cWRpb19yZXEpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiB1c2Ugc2luZ2xlLCB1bmNoYWluZWQgU0JBTCBpZiBpdCBjYW4gaG9sZCB0aGUgcmVxdWVzdCAqLwogCWlmICh6ZmNwX3FkaW9fc2dfb25lX3NiYWxlKHNnX3JlcSkgJiYgemZjcF9xZGlvX3NnX29uZV9zYmFsZShzZ19yZXNwKSkgewotCQl6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfdW5jaGFpbmVkKGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxLAorCQl6ZmNwX2ZzZl9zZXR1cF9jdF9lbHNfdW5jaGFpbmVkKHFkaW8sICZyZXEtPnFkaW9fcmVxLAogCQkJCQkJc2dfcmVxLCBzZ19yZXNwKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JYnl0ZXMgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVxKTsKLQlpZiAoYnl0ZXMgPD0gMCkKLQkJcmV0dXJuIC1FSU87Ci0JemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxKTsKLQlyZXEtPnF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlcV9idWZfbGVuZ3RoID0gYnl0ZXM7Ci0JemZjcF9xZGlvX3NraXBfdG9fbGFzdF9zYmFsZSgmcmVxLT5xZGlvX3JlcSk7CisJaWYgKCEoZmVhdCAmIEZTRl9GRUFUVVJFX0VMU19DVF9DSEFJTkVEX1NCQUxTKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JYnl0ZXMgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSwKLQkJCQkJc2dfcmVzcCk7Ci0JcmVxLT5xdGNiLT5ib3R0b20uc3VwcG9ydC5yZXNwX2J1Zl9sZW5ndGggPSBieXRlczsKLQlpZiAoYnl0ZXMgPD0gMCkKKwlpZiAoemZjcF9xZGlvX3NiYWxzX2Zyb21fc2cocWRpbywgJnJlcS0+cWRpb19yZXEsIHNnX3JlcSkpCiAJCXJldHVybiAtRUlPOwotCXpmY3BfcWRpb19zZXRfc2JhbGVfbGFzdChhZGFwdGVyLT5xZGlvLCAmcmVxLT5xZGlvX3JlcSk7CisKKwlxdGNiLT5ib3R0b20uc3VwcG9ydC5yZXFfYnVmX2xlbmd0aCA9IHpmY3BfcWRpb19yZWFsX2J5dGVzKHNnX3JlcSk7CisKKwl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QocWRpbywgJnJlcS0+cWRpb19yZXEpOworCXpmY3BfcWRpb19za2lwX3RvX2xhc3Rfc2JhbGUocWRpbywgJnJlcS0+cWRpb19yZXEpOworCisJaWYgKHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBzZ19yZXNwKSkKKwkJcmV0dXJuIC1FSU87CisKKwlxdGNiLT5ib3R0b20uc3VwcG9ydC5yZXNwX2J1Zl9sZW5ndGggPSB6ZmNwX3FkaW9fcmVhbF9ieXRlcyhzZ19yZXNwKTsKKworCXpmY3BfcWRpb19zZXRfc2JhbGVfbGFzdChxZGlvLCAmcmVxLT5xZGlvX3JlcSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTksNyArMTEyNyw4IEBACiAKIAlyZXEtPnN0YXR1cyB8PSBaRkNQX1NUQVRVU19GU0ZSRVFfQ0xFQU5VUDsKIAotCXpmY3BfcWRpb19zYmFsX2xpbWl0KHFkaW8sICZyZXEtPnFkaW9fcmVxLCAyKTsKKwlpZiAoIXpmY3BfYWRhcHRlcl9tdWx0aV9idWZmZXJfYWN0aXZlKGFkYXB0ZXIpKQorCQl6ZmNwX3FkaW9fc2JhbF9saW1pdChxZGlvLCAmcmVxLT5xZGlvX3JlcSwgMik7CiAKIAlyZXQgPSB6ZmNwX2ZzZl9zZXR1cF9jdF9lbHMocmVxLCBlbHMtPnJlcSwgZWxzLT5yZXNwLCB0aW1lb3V0KTsKIApAQCAtMjE2Miw3ICsyMTcxLDcgQEAKIAlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CiAJc3RydWN0IGZjcF9jbW5kICpmY3BfY21uZDsKIAl1OCBzYnR5cGUgPSBTQkFMX1NGTEFHUzBfVFlQRV9SRUFEOwotCWludCByZWFsX2J5dGVzLCByZXR2YWwgPSAtRUlPLCBkaXhfYnl0ZXMgPSAwOworCWludCByZXR2YWwgPSAtRUlPOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNjc2lfY21uZC0+ZGV2aWNlOwogCXN0cnVjdCB6ZmNwX3Njc2lfZGV2ICp6ZmNwX3NkZXYgPSBzZGV2X3RvX3pmY3Aoc2Rldik7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHpmY3Bfc2Rldi0+cG9ydC0+YWRhcHRlcjsKQEAgLTIyMDcsNyArMjIxNiw4IEBACiAJCWlvLT5yZWZfdGFnX3ZhbHVlID0gc2NzaV9nZXRfbGJhKHNjc2lfY21uZCkgJiAweEZGRkZGRkZGOwogCX0KIAotCXpmY3BfZnNmX3NldF9kYXRhX2RpcihzY3NpX2NtbmQsICZpby0+ZGF0YV9kaXJlY3Rpb24pOworCWlmICh6ZmNwX2ZzZl9zZXRfZGF0YV9kaXIoc2NzaV9jbW5kLCAmaW8tPmRhdGFfZGlyZWN0aW9uKSkKKwkJZ290byBmYWlsZWRfc2NzaV9jbW5kOwogCiAJZmNwX2NtbmQgPSAoc3RydWN0IGZjcF9jbW5kICopICZyZXEtPnF0Y2ItPmJvdHRvbS5pby5mY3BfY21uZDsKIAl6ZmNwX2ZjX3Njc2lfdG9fZmNwKGZjcF9jbW5kLCBzY3NpX2NtbmQsIDApOwpAQCAtMjIxNSwxOCArMjIyNSwyMiBAQAogCWlmIChzY3NpX3Byb3Rfc2dfY291bnQoc2NzaV9jbW5kKSkgewogCQl6ZmNwX3FkaW9fc2V0X2RhdGFfZGl2KHFkaW8sICZyZXEtPnFkaW9fcmVxLAogCQkJCSAgICAgICBzY3NpX3Byb3Rfc2dfY291bnQoc2NzaV9jbW5kKSk7Ci0JCWRpeF9ieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLAorCQlyZXR2YWwgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwKKwkJCQkJCSBzY3NpX3Byb3Rfc2dsaXN0KHNjc2lfY21uZCkpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBmYWlsZWRfc2NzaV9jbW5kOworCQlpby0+cHJvdF9kYXRhX2xlbmd0aCA9IHpmY3BfcWRpb19yZWFsX2J5dGVzKAogCQkJCQkJc2NzaV9wcm90X3NnbGlzdChzY3NpX2NtbmQpKTsKLQkJaW8tPnByb3RfZGF0YV9sZW5ndGggPSBkaXhfYnl0ZXM7CiAJfQogCi0JcmVhbF9ieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLAotCQkJCQkgICAgIHNjc2lfc2dsaXN0KHNjc2lfY21uZCkpOwotCi0JaWYgKHVubGlrZWx5KHJlYWxfYnl0ZXMgPCAwKSB8fCB1bmxpa2VseShkaXhfYnl0ZXMgPCAwKSkKKwlyZXR2YWwgPSB6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwKKwkJCQkJIHNjc2lfc2dsaXN0KHNjc2lfY21uZCkpOworCWlmICh1bmxpa2VseShyZXR2YWwpKQogCQlnb3RvIGZhaWxlZF9zY3NpX2NtbmQ7CiAKIAl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QoYWRhcHRlci0+cWRpbywgJnJlcS0+cWRpb19yZXEpOworCWlmICh6ZmNwX2FkYXB0ZXJfbXVsdGlfYnVmZmVyX2FjdGl2ZShhZGFwdGVyKSkKKwkJemZjcF9xZGlvX3NldF9zY291bnQocWRpbywgJnJlcS0+cWRpb19yZXEpOwogCiAJcmV0dmFsID0gemZjcF9mc2ZfcmVxX3NlbmQocmVxKTsKIAlpZiAodW5saWtlbHkocmV0dmFsKSkKQEAgLTIzMjgsNyArMjM0Miw3IEBACiAJc3RydWN0IHpmY3BfcWRpbyAqcWRpbyA9IGFkYXB0ZXItPnFkaW87CiAJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgZnNmX3F0Y2JfYm90dG9tX3N1cHBvcnQgKmJvdHRvbTsKLQlpbnQgcmV0dmFsID0gLUVJTywgYnl0ZXM7CisJaW50IHJldHZhbCA9IC1FSU87CiAJdTggZGlyZWN0aW9uOwogCiAJaWYgKCEoYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0NGREMpKQpAQCAtMjM2MSwxMyArMjM3NSwxNyBAQAogCWJvdHRvbS0+b3BlcmF0aW9uX3N1YnR5cGUgPSBGU0ZfQ0ZEQ19PUEVSQVRJT05fU1VCVFlQRTsKIAlib3R0b20tPm9wdGlvbiA9IGZzZl9jZmRjLT5vcHRpb247CiAKLQlieXRlcyA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBmc2ZfY2ZkYy0+c2cpOworCXJldHZhbCA9IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBmc2ZfY2ZkYy0+c2cpOwogCi0JaWYgKGJ5dGVzICE9IFpGQ1BfQ0ZEQ19NQVhfU0laRSkgeworCWlmIChyZXR2YWwgfHwKKwkJKHpmY3BfcWRpb19yZWFsX2J5dGVzKGZzZl9jZmRjLT5zZykgIT0gWkZDUF9DRkRDX01BWF9TSVpFKSkgewogCQl6ZmNwX2ZzZl9yZXFfZnJlZShyZXEpOworCQlyZXR2YWwgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9Ci0JemZjcF9xZGlvX3NldF9zYmFsZV9sYXN0KGFkYXB0ZXItPnFkaW8sICZyZXEtPnFkaW9fcmVxKTsKKwl6ZmNwX3FkaW9fc2V0X3NiYWxlX2xhc3QocWRpbywgJnJlcS0+cWRpb19yZXEpOworCWlmICh6ZmNwX2FkYXB0ZXJfbXVsdGlfYnVmZmVyX2FjdGl2ZShhZGFwdGVyKSkKKwkJemZjcF9xZGlvX3NldF9zY291bnQocWRpbywgJnJlcS0+cWRpb19yZXEpOwogCiAJemZjcF9mc2Zfc3RhcnRfdGltZXIocmVxLCBaRkNQX0ZTRl9SRVFVRVNUX1RJTUVPVVQpOwogCXJldHZhbCA9IHpmY3BfZnNmX3JlcV9zZW5kKHJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCmluZGV4IGQ5YzQwZWEuLmUxNGRhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5jCkBAIC0xMCwxMSArMTAsMTYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS01TR19DT01QT05FTlQgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJ6ZmNwX2V4dC5oIgogI2luY2x1ZGUgInpmY3BfcWRpby5oIgogCiAjZGVmaW5lIFFCVUZGX1BFUl9QQUdFCQkoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBxZGlvX2J1ZmZlcikpCiAKK3N0YXRpYyBib29sIGVuYWJsZV9tdWx0aWJ1ZmZlcjsKK21vZHVsZV9wYXJhbV9uYW1lZChkYXRhcm91dGVyLCBlbmFibGVfbXVsdGlidWZmZXIsIGJvb2wsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhkYXRhcm91dGVyLCAiRW5hYmxlIGhhcmR3YXJlIGRhdGEgcm91dGVyIHN1cHBvcnQiKTsKKwogc3RhdGljIGludCB6ZmNwX3FkaW9fYnVmZmVyc19lbnF1ZXVlKHN0cnVjdCBxZGlvX2J1ZmZlciAqKnNiYWwpCiB7CiAJaW50IHBvczsKQEAgLTM3LDggKzQyLDExIEBACiAKIAlkZXZfd2FybigmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2LCAiQSBRRElPIHByb2JsZW0gb2NjdXJyZWRcbiIpOwogCi0JaWYgKHFkaW9fZXJyICYgUURJT19FUlJPUl9TTFNCX1NUQVRFKQorCWlmIChxZGlvX2VyciAmIFFESU9fRVJST1JfU0xTQl9TVEFURSkgewogCQl6ZmNwX3FkaW9fc2lvc2woYWRhcHRlcik7CisJCXpmY3BfZXJwX2FkYXB0ZXJfc2h1dGRvd24oYWRhcHRlciwgMCwgaWQpOworCQlyZXR1cm47CisJfQogCXpmY3BfZXJwX2FkYXB0ZXJfcmVvcGVuKGFkYXB0ZXIsCiAJCQkJWkZDUF9TVEFUVVNfQURBUFRFUl9MSU5LX1VOUExVR0dFRCB8CiAJCQkJWkZDUF9TVEFUVVNfQ09NTU9OX0VSUF9GQUlMRUQsIGlkKTsKQEAgLTkzLDkgKzEwMSwyNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGFybSkKIHsKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gKHN0cnVjdCB6ZmNwX3FkaW8gKikgcGFybTsKLQlpbnQgc2JhbF9pZHgsIHNiYWxfbm87CisJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9IHFkaW8tPmFkYXB0ZXI7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCWludCBzYmFsX25vLCBzYmFsX2lkeDsKKwl2b2lkICpwbFtaRkNQX1FESU9fTUFYX1NCQUxTX1BFUl9SRVEgKyAxXTsKKwl1NjQgcmVxX2lkOworCXU4IHNjb3VudDsKIAogCWlmICh1bmxpa2VseShxZGlvX2VycikpIHsKKwkJbWVtc2V0KHBsLCAwLCBaRkNQX1FESU9fTUFYX1NCQUxTX1BFUl9SRVEgKiBzaXplb2Yodm9pZCAqKSk7CisJCWlmICh6ZmNwX2FkYXB0ZXJfbXVsdGlfYnVmZmVyX2FjdGl2ZShhZGFwdGVyKSkgeworCQkJc2JhbGUgPSBxZGlvLT5yZXNfcVtpZHhdLT5lbGVtZW50OworCQkJcmVxX2lkID0gKHU2NCkgc2JhbGUtPmFkZHI7CisJCQlzY291bnQgPSBzYmFsZS0+c2NvdW50ICsgMTsgLyogaW5jbC4gc2lnbmFsaW5nIFNCQUwgKi8KKworCQkJZm9yIChzYmFsX25vID0gMDsgc2JhbF9ubyA8IHNjb3VudDsgc2JhbF9ubysrKSB7CisJCQkJc2JhbF9pZHggPSAoaWR4ICsgc2JhbF9ubykgJQorCQkJCQlRRElPX01BWF9CVUZGRVJTX1BFUl9ROworCQkJCXBsW3NiYWxfbm9dID0gcWRpby0+cmVzX3Fbc2JhbF9pZHhdOworCQkJfQorCQkJemZjcF9kYmZfaGJhX2RlZl9lcnIoYWRhcHRlciwgcmVxX2lkLCBzY291bnQsIHBsKTsKKwkJfQogCQl6ZmNwX3FkaW9faGFuZGxlcl9lcnJvcihxZGlvLCAicWRpcmVzMSIsIHFkaW9fZXJyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1NSw3ICsxODEsNyBAQAogc3RhdGljIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICoKIHpmY3BfcWRpb19zYmFsZV9uZXh0KHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSkKIHsKLQlpZiAocV9yZXEtPnNiYWxlX2N1cnIgPT0gWkZDUF9RRElPX0xBU1RfU0JBTEVfUEVSX1NCQUwpCisJaWYgKHFfcmVxLT5zYmFsZV9jdXJyID09IHFkaW8tPm1heF9zYmFsZV9wZXJfc2JhbCAtIDEpCiAJCXJldHVybiB6ZmNwX3FkaW9fc2JhbF9jaGFpbihxZGlvLCBxX3JlcSk7CiAJcV9yZXEtPnNiYWxlX2N1cnIrKzsKIAlyZXR1cm4gemZjcF9xZGlvX3NiYWxlX2N1cnIocWRpbywgcV9yZXEpOwpAQCAtMTY3LDEzICsxOTMsMTIgQEAKICAqIEBxX3JlcTogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9xZGlvX3JlcQogICogQHNnOiBzY2F0dGVyLWdhdGhlciBsaXN0CiAgKiBAbWF4X3NiYWxzOiB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIFNCQUxzIHRvIGJlIHVzZWQKLSAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcywgb3IgZXJyb3IgKG5lZ2F0aXYpCisgKiBSZXR1cm5zOiB6ZXJvIG9yIC1FSU5WQUwgb24gZXJyb3IKICAqLwogaW50IHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sIHN0cnVjdCB6ZmNwX3FkaW9fcmVxICpxX3JlcSwKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKLQlpbnQgYnl0ZXMgPSAwOwogCiAJLyogc2V0IHN0b3JhZ2UtYmxvY2sgdHlwZSBmb3IgdGhpcyByZXF1ZXN0ICovCiAJc2JhbGUgPSB6ZmNwX3FkaW9fc2JhbGVfcmVxKHFkaW8sIHFfcmVxKTsKQEAgLTE4NywxNCArMjEyLDEwIEBACiAJCQkJCSAgICAgcV9yZXEtPnNiYWxfbnVtYmVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0KIAkJc2JhbGUtPmFkZHIgPSBzZ192aXJ0KHNnKTsKIAkJc2JhbGUtPmxlbmd0aCA9IHNnLT5sZW5ndGg7Ci0KLQkJYnl0ZXMgKz0gc2ctPmxlbmd0aDsKIAl9Ci0KLQlyZXR1cm4gYnl0ZXM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgemZjcF9xZGlvX3NiYWxfY2hlY2soc3RydWN0IHpmY3BfcWRpbyAqcWRpbykKQEAgLTI4Myw2ICszMDQsOCBAQAogCW1lbWNweShpZC0+YWRhcHRlcl9uYW1lLCBkZXZfbmFtZSgmaWQtPmNkZXYtPmRldiksIDgpOwogCUFTQ0VCQyhpZC0+YWRhcHRlcl9uYW1lLCA4KTsKIAlpZC0+cWliX3JmbGFncyA9IFFJQl9SRkxBR1NfRU5BQkxFX0RBVEFfRElWOworCWlmIChlbmFibGVfbXVsdGlidWZmZXIpCisJCWlkLT5xZHJfYWMgfD0gUURSX0FDX01VTFRJX0JVRkZFUl9FTkFCTEU7CiAJaWQtPm5vX2lucHV0X3FzID0gMTsKIAlpZC0+bm9fb3V0cHV0X3FzID0gMTsKIAlpZC0+aW5wdXRfaGFuZGxlciA9IHpmY3BfcWRpb19pbnRfcmVzcDsKQEAgLTM3OCw2ICs0MDEsMTcgQEAKIAkJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfREFUQV9ESVZfRU5BQkxFRCwKIAkJCQkmcWRpby0+YWRhcHRlci0+c3RhdHVzKTsKIAorCWlmIChzc3FkLnFkaW9hYzIgJiBDSFNDX0FDMl9NVUxUSV9CVUZGRVJfRU5BQkxFRCkgeworCQlhdG9taWNfc2V0X21hc2soWkZDUF9TVEFUVVNfQURBUFRFUl9NQl9BQ1QsICZhZGFwdGVyLT5zdGF0dXMpOworCQlxZGlvLT5tYXhfc2JhbGVfcGVyX3NiYWwgPSBRRElPX01BWF9FTEVNRU5UU19QRVJfQlVGRkVSOworCX0gZWxzZSB7CisJCWF0b21pY19jbGVhcl9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfTUJfQUNULCAmYWRhcHRlci0+c3RhdHVzKTsKKwkJcWRpby0+bWF4X3NiYWxlX3Blcl9zYmFsID0gUURJT19NQVhfRUxFTUVOVFNfUEVSX0JVRkZFUiAtIDE7CisJfQorCisJcWRpby0+bWF4X3NiYWxlX3Blcl9yZXEgPQorCQlaRkNQX1FESU9fTUFYX1NCQUxTX1BFUl9SRVEgKiBxZGlvLT5tYXhfc2JhbGVfcGVyX3NiYWwKKwkJLSAyOwogCWlmIChxZGlvX2FjdGl2YXRlKGNkZXYpKQogCQlnb3RvIGZhaWxlZF9xZGlvOwogCkBAIC0zOTcsNiArNDMxLDExIEBACiAJYXRvbWljX3NldCgmcWRpby0+cmVxX3FfZnJlZSwgUURJT19NQVhfQlVGRkVSU19QRVJfUSk7CiAJYXRvbWljX3NldF9tYXNrKFpGQ1BfU1RBVFVTX0FEQVBURVJfUURJT1VQLCAmcWRpby0+YWRhcHRlci0+c3RhdHVzKTsKIAorCWlmIChhZGFwdGVyLT5zY3NpX2hvc3QpIHsKKwkJYWRhcHRlci0+c2NzaV9ob3N0LT5zZ190YWJsZXNpemUgPSBxZGlvLT5tYXhfc2JhbGVfcGVyX3JlcTsKKwkJYWRhcHRlci0+c2NzaV9ob3N0LT5tYXhfc2VjdG9ycyA9IHFkaW8tPm1heF9zYmFsZV9wZXJfcmVxICogODsKKwl9CisKIAlyZXR1cm4gMDsKIAogZmFpbGVkX3FkaW86CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3FkaW8uaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCmluZGV4IDU0ZTIyYWMuLjhhYzdmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfcWRpby5oCkBAIC0xMywyMCArMTMsOSBAQAogCiAjZGVmaW5lIFpGQ1BfUURJT19TQkFMRV9MRU4JUEFHRV9TSVpFCiAKLS8qIERNUSBidWcgd29ya2Fyb3VuZDogZG9uJ3QgdXNlIGxhc3QgU0JBTEUgKi8KLSNkZWZpbmUgWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1NCQUwJKFFESU9fTUFYX0VMRU1FTlRTX1BFUl9CVUZGRVIgLSAxKQotCi0vKiBpbmRleCBvZiBsYXN0IFNCQUxFICh3aXRoIHJlc3BlY3QgdG8gRE1RIGJ1ZyB3b3JrYXJvdW5kKSAqLwotI2RlZmluZSBaRkNQX1FESU9fTEFTVF9TQkFMRV9QRVJfU0JBTAkoWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1NCQUwgLSAxKQotCiAvKiBNYXggU0JBTFMgZm9yIGNoYWluaW5nICovCiAjZGVmaW5lIFpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUQkzNgogCi0vKiBtYXguIG51bWJlciBvZiAoZGF0YSBidWZmZXIpIFNCQUxFcyBpbiBsYXJnZXN0IFNCQUwgY2hhaW4KLSAqIHJlcXVlc3QgSUQgKyBRVENCIGluIFNCQUxFIDAgKyAxIG9mIGZpcnN0IFNCQUwgaW4gY2hhaW4gICAqLwotI2RlZmluZSBaRkNQX1FESU9fTUFYX1NCQUxFU19QRVJfUkVRICAgICBcCi0JKFpGQ1BfUURJT19NQVhfU0JBTFNfUEVSX1JFUSAqIFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9TQkFMIC0gMikKLQogLyoqCiAgKiBzdHJ1Y3QgemZjcF9xZGlvIC0gYmFzaWMgcWRpbyBkYXRhIHN0cnVjdHVyZQogICogQHJlc19xOiByZXNwb25zZSBxdWV1ZQpAQCAtNTMsNiArNDIsOCBAQAogCWF0b21pY190CQlyZXFfcV9mdWxsOwogCXdhaXRfcXVldWVfaGVhZF90CXJlcV9xX3dxOwogCXN0cnVjdCB6ZmNwX2FkYXB0ZXIJKmFkYXB0ZXI7CisJdTE2CQkJbWF4X3NiYWxlX3Blcl9zYmFsOworCXUxNgkJCW1heF9zYmFsZV9wZXJfcmVxOwogfTsKIAogLyoqCkBAIC0xNTUsNyArMTQ2LDcgQEAKIHsKIAlzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqc2JhbGU7CiAKLQlCVUdfT04ocV9yZXEtPnNiYWxlX2N1cnIgPT0gWkZDUF9RRElPX0xBU1RfU0JBTEVfUEVSX1NCQUwpOworCUJVR19PTihxX3JlcS0+c2JhbGVfY3VyciA9PSBxZGlvLT5tYXhfc2JhbGVfcGVyX3NiYWwgLSAxKTsKIAlxX3JlcS0+c2JhbGVfY3VycisrOwogCXNiYWxlID0gemZjcF9xZGlvX3NiYWxlX2N1cnIocWRpbywgcV9yZXEpOwogCXNiYWxlLT5hZGRyID0gZGF0YTsKQEAgLTE5NSw5ICsxODYsMTAgQEAKICAqIEBxX3JlcTogVGhlIGN1cnJlbnQgemZjcF9xZGlvX3JlcQogICovCiBzdGF0aWMgaW5saW5lCi12b2lkIHpmY3BfcWRpb19za2lwX3RvX2xhc3Rfc2JhbGUoc3RydWN0IHpmY3BfcWRpb19yZXEgKnFfcmVxKQordm9pZCB6ZmNwX3FkaW9fc2tpcF90b19sYXN0X3NiYWxlKHN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8sCisJCQkJICBzdHJ1Y3QgemZjcF9xZGlvX3JlcSAqcV9yZXEpCiB7Ci0JcV9yZXEtPnNiYWxlX2N1cnIgPSBaRkNQX1FESU9fTEFTVF9TQkFMRV9QRVJfU0JBTDsKKwlxX3JlcS0+c2JhbGVfY3VyciA9IHFkaW8tPm1heF9zYmFsZV9wZXJfc2JhbCAtIDE7CiB9CiAKIC8qKgpAQCAtMjI4LDggKzIyMCw1MiBAQAogewogCXN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICpzYmFsZTsKIAotCXNiYWxlID0gJnFkaW8tPnJlcV9xW3FfcmVxLT5zYmFsX2ZpcnN0XS0+ZWxlbWVudFswXTsKKwlzYmFsZSA9IHFkaW8tPnJlcV9xW3FfcmVxLT5zYmFsX2ZpcnN0XS0+ZWxlbWVudDsKIAlzYmFsZS0+bGVuZ3RoID0gY291bnQ7CiB9CiAKKy8qKgorICogemZjcF9xZGlvX3NiYWxlX2NvdW50IC0gY291bnQgc2JhbGUgdXNlZAorICogQHNnOiBwb2ludGVyIHRvIHN0cnVjdCBzY2F0dGVybGlzdAorICovCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBpbnQgemZjcF9xZGlvX3NiYWxlX2NvdW50KHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworCWZvciAoOyBzZzsgc2cgPSBzZ19uZXh0KHNnKSkKKwkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiB6ZmNwX3FkaW9fcmVhbF9ieXRlcyAtIGNvdW50IGJ5dGVzIHVzZWQKKyAqIEBzZzogcG9pbnRlciB0byBzdHJ1Y3Qgc2NhdHRlcmxpc3QKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgaW50IHpmY3BfcWRpb19yZWFsX2J5dGVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgaW50IHJlYWxfYnl0ZXMgPSAwOworCisJZm9yICg7IHNnOyBzZyA9IHNnX25leHQoc2cpKQorCQlyZWFsX2J5dGVzICs9IHNnLT5sZW5ndGg7CisKKwlyZXR1cm4gcmVhbF9ieXRlczsKK30KKworLyoqCisgKiB6ZmNwX3FkaW9fc2V0X3Njb3VudCAtIHNldCBTQkFMIGNvdW50IHZhbHVlCisgKiBAcWRpbzogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9xZGlvCisgKiBAcV9yZXE6IFRoZSBjdXJyZW50IHpmY3BfcWRpb19yZXEKKyAqLworc3RhdGljIGlubGluZQordm9pZCB6ZmNwX3FkaW9fc2V0X3Njb3VudChzdHJ1Y3QgemZjcF9xZGlvICpxZGlvLCBzdHJ1Y3QgemZjcF9xZGlvX3JlcSAqcV9yZXEpCit7CisJc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKnNiYWxlOworCisJc2JhbGUgPSBxZGlvLT5yZXFfcVtxX3JlcS0+c2JhbF9maXJzdF0tPmVsZW1lbnQ7CisJc2JhbGUtPnNjb3VudCA9IHFfcmVxLT5zYmFsX251bWJlciAtIDE7Cit9CisKICNlbmRpZiAvKiBaRkNQX1FESU9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwppbmRleCA3Y2FjODczLi4xMWYwN2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwpAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjcC5oPgpAQCAtMjQsMTEgKzI1LDggQEAKIE1PRFVMRV9QQVJNX0RFU0MocXVldWVfZGVwdGgsICJEZWZhdWx0IHF1ZXVlIGRlcHRoIGZvciBuZXcgU0NTSSBkZXZpY2VzIik7CiAKIHN0YXRpYyBib29sIGVuYWJsZV9kaWY7Ci0KLSNpZmRlZiBDT05GSUdfWkZDUF9ESUYKLW1vZHVsZV9wYXJhbV9uYW1lZChkaWYsIGVuYWJsZV9kaWYsIGJvb2wsIDA2MDApOworbW9kdWxlX3BhcmFtX25hbWVkKGRpZiwgZW5hYmxlX2RpZiwgYm9vbCwgMDQwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpZiwgIkVuYWJsZSBESUYvRElYIGRhdGEgaW50ZWdyaXR5IHN1cHBvcnQiKTsKLSNlbmRpZgogCiBzdGF0aWMgYm9vbCBhbGxvd19sdW5fc2NhbiA9IDE7CiBtb2R1bGVfcGFyYW0oYWxsb3dfbHVuX3NjYW4sIGJvb2wsIDA2MDApOwpAQCAtMzA5LDggKzMwNyw4IEBACiAJLnByb2NfbmFtZQkJID0gInpmY3AiLAogCS5jYW5fcXVldWUJCSA9IDQwOTYsCiAJLnRoaXNfaWQJCSA9IC0xLAotCS5zZ190YWJsZXNpemUJCSA9IFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9SRVEsCi0JLm1heF9zZWN0b3JzCQkgPSAoWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSAqIDgpLAorCS5zZ190YWJsZXNpemUJCSA9IDEsIC8qIGFkanVzdGVkIGxhdGVyICovCisJLm1heF9zZWN0b3JzCQkgPSA4LCAvKiBhZGp1c3RlZCBsYXRlciAqLwogCS5kbWFfYm91bmRhcnkJCSA9IFpGQ1BfUURJT19TQkFMRV9MRU4gLSAxLAogCS5jbWRfcGVyX2x1bgkJID0gMSwKIAkudXNlX2NsdXN0ZXJpbmcJCSA9IDEsCkBAIC02NjgsOSArNjY2LDkgQEAKIAkgICAgYWRhcHRlci0+YWRhcHRlcl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX0RJWF9QUk9UX1RDUElQKSB7CiAJCW1hc2sgfD0gU0hPU1RfRElYX1RZUEUxX1BST1RFQ1RJT047CiAJCXNjc2lfaG9zdF9zZXRfZ3VhcmQoc2hvc3QsIFNIT1NUX0RJWF9HVUFSRF9JUCk7Ci0JCXNob3N0LT5zZ19wcm90X3RhYmxlc2l6ZSA9IFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9SRVEgLyAyOwotCQlzaG9zdC0+c2dfdGFibGVzaXplID0gWkZDUF9RRElPX01BWF9TQkFMRVNfUEVSX1JFUSAvIDI7Ci0JCXNob3N0LT5tYXhfc2VjdG9ycyA9IFpGQ1BfUURJT19NQVhfU0JBTEVTX1BFUl9SRVEgKiA4IC8gMjsKKwkJc2hvc3QtPnNnX3Byb3RfdGFibGVzaXplID0gYWRhcHRlci0+cWRpby0+bWF4X3NiYWxlX3Blcl9yZXEgLyAyOworCQlzaG9zdC0+c2dfdGFibGVzaXplID0gYWRhcHRlci0+cWRpby0+bWF4X3NiYWxlX3Blcl9yZXEgLyAyOworCQlzaG9zdC0+bWF4X3NlY3RvcnMgPSBzaG9zdC0+c2dfdGFibGVzaXplICogODsKIAl9CiAKIAlzY3NpX2hvc3Rfc2V0X3Byb3Qoc2hvc3QsIG1hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCAzODc4YjczLi4wNmVhM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMzA5LDYgKzMwOSw3IEBACiBjb25maWcgU0NTSV9JU0NTSV9BVFRSUwogCXRyaXN0YXRlICJpU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcyIKIAlkZXBlbmRzIG9uIFNDU0kgJiYgTkVUCisJc2VsZWN0IEJMS19ERVZfQlNHTElCCiAJaGVscAogCSAgSWYgeW91IHdpc2ggdG8gZXhwb3J0IHRyYW5zcG9ydC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dAogCSAgZWFjaCBhdHRhY2hlZCBpU0NTSSBkZXZpY2UgdG8gc3lzZnMsIHNheSBZLgpAQCAtNTU5LDYgKzU2MCwxNSBAQAogc291cmNlICJkcml2ZXJzL3Njc2kvYWljOTR4eC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3Njc2kvbXZzYXMvS2NvbmZpZyIKIAorY29uZmlnIFNDU0lfTVZVTUkKKwl0cmlzdGF0ZSAiTWFydmVsbCBVTUkgZHJpdmVyIgorCWRlcGVuZHMgb24gU0NTSSAmJiBQQ0kKKwloZWxwCisJICBNb2R1bGUgZm9yIE1hcnZlbGwgVW5pdmVyc2FsIE1lc3NhZ2UgSW50ZXJmYWNlKFVNSSkgZHJpdmVyCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG12dW1pLgorCiBjb25maWcgU0NTSV9EUFRfSTJPCiAJdHJpc3RhdGUgIkFkYXB0ZWMgSTJPIFJBSUQgc3VwcG9ydCAiCiAJZGVwZW5kcyBvbiBTQ1NJICYmIFBDSSAmJiBWSVJUX1RPX0JVUwpAQCAtNjA3LDIwICs2MTcsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXJjbXNyIChtb2Rwcm9iZSBhcmNtc3IpLgogCi1jb25maWcgU0NTSV9BUkNNU1JfQUVSCi0JYm9vbCAiRW5hYmxlIFBDSSBFcnJvciBSZWNvdmVyeSBDYXBhYmlsaXR5IGluIEFyZWNhIERyaXZlcihBUkNNU1IpIgotCWRlcGVuZHMgb24gU0NTSV9BUkNNU1IgJiYgUENJRUFFUgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoZSBhZHZhbmNlZCBlcnJvciByZXBvcnRpbmcoQUVSKSBjYXBhYmlsaXR5IGlzICJOT1QiIHByb3ZpZGVkIGJ5Ci0JICBBUkMxMjAwLzEyMDEvMTIwMiBTQVRBIFJBSUQgY29udHJvbGxlcnMgY2FyZHMuCi0JICBJZiB5b3VyIGNhcmQgaXMgb25lIG9mIEFSQzEyMDAvMTIwMS8xMjAyLCBwbGVhc2UgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmcsIG4uCi0JICBJZiB5b3VyIGNhcmQgaXMgb3RoZXIgbW9kZWxzLCB5b3UgY291bGQgcGljayBpdAotCSAgb24gY29uZGl0aW9uIHRoYXQgdGhlIGtlcm5lbCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiAyLjYuMTkuCi0JICBUaGlzIGZ1bmN0aW9uIGlzIG1haW50YWluZWQgZHJpdmVyIGJ5IE5pY2sgQ2hlbmcuIElmIHlvdSBoYXZlIGFueQotCSAgcHJvYmxlbXMgb3Igc3VnZ2VzdGlvbiwgeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRhY3Qgd2l0aCA8bmljay5jaGVuZ0BhcmVjYS5jb20udHc+LgotCSAgVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb24sIGNob29zZSBZIGhlcmUuCi0KIHNvdXJjZSAiZHJpdmVycy9zY3NpL21lZ2FyYWlkL0tjb25maWcubWVnYXJhaWQiCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9tcHQyc2FzL0tjb25maWciCiAKQEAgLTE4NzIsMTAgKzE4NjgsNiBAQAogICAgICAgICAgIGNhbGxlZCB6ZmNwLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlCiAgICAgICAgICAgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgogCi1jb25maWcgWkZDUF9ESUYKLQl0cmlzdGF0ZSAiVDEwIERJRi9ESVggc3VwcG9ydCBmb3IgdGhlIHpmY3AgZHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWkZDUCAmJiBFWFBFUklNRU5UQUwKLQogY29uZmlnIFNDU0lfUE1DUkFJRAogCXRyaXN0YXRlICJQTUMgU0lFUlJBIExpbnV4IE1heFJBSUQgYWRhcHRlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgTkVUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKaW5kZXggNjE1M2E2Ni4uMmI4ODc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQpAQCAtMTM0LDYgKzEzNCw3IEBACiBvYmotJChDT05GSUdfU0NTSV9IUFRJT1ApCSs9IGhwdGlvcC5vCiBvYmotJChDT05GSUdfU0NTSV9TVEVYKQkJKz0gc3RleC5vCiBvYmotJChDT05GSUdfU0NTSV9NVlNBUykJKz0gbXZzYXMvCitvYmotJChDT05GSUdfU0NTSV9NVlVNSSkJKz0gbXZ1bWkubwogb2JqLSQoQ09ORklHX1BTM19ST00pCQkrPSBwczNyb20ubwogb2JqLSQoQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0kpCSs9IGxpYmlzY3NpLm8gbGliaXNjc2lfdGNwLm8gY3hnYmkvCiBvYmotJChDT05GSUdfU0NTSV9DWEdCNF9JU0NTSSkJKz0gbGliaXNjc2kubyBsaWJpc2NzaV90Y3AubyBjeGdiaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKaW5kZXggMWJiNWQzZi4uNzlhMzA2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2EyMDkxLmMKKysrIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMzAwMC5jIGIvZHJpdmVycy9zY3NpL2EzMDAwLmMKaW5kZXggZDk0NjgwMi4uZTI5ZmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2EzMDAwLmMKKysrIGIvZHJpdmVycy9zY3NpL2EzMDAwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMKaW5kZXggMDYxOTk1Ny4uNDA5ZjU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4gLyogRm9yIGZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZSAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCmluZGV4IDMzODI0NzUuLjRhYTc2ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwpAQCAtODk0LDE2ICs4OTQsMTcgQEAKIAlpbnQgbGVuID0gMDsKIAogCWlmIChsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5zZXJpYWxbMF0pICE9IDB4QkFEMCkKLQkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDZYXG4iLAorCQlsZW4gPSBzbnByaW50ZihidWYsIDE2LCAiJTA2WFxuIiwKIAkJICBsZTMyX3RvX2NwdShkZXYtPmFkYXB0ZXJfaW5mby5zZXJpYWxbMF0pKTsKIAlpZiAobGVuICYmCiAJICAhbWVtY21wKCZkZXYtPnN1cHBsZW1lbnRfYWRhcHRlcl9pbmZvLk1mZ1BjYmFTZXJpYWxOb1sKIAkgICAgc2l6ZW9mKGRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uTWZnUGNiYVNlcmlhbE5vKS1sZW5dLAogCSAgYnVmLCBsZW4tMSkpCi0JCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJS4qc1xuIiwKKwkJbGVuID0gc25wcmludGYoYnVmLCAxNiwgIiUuKnNcbiIsCiAJCSAgKGludClzaXplb2YoZGV2LT5zdXBwbGVtZW50X2FkYXB0ZXJfaW5mby5NZmdQY2JhU2VyaWFsTm8pLAogCQkgIGRldi0+c3VwcGxlbWVudF9hZGFwdGVyX2luZm8uTWZnUGNiYVNlcmlhbE5vKTsKLQlyZXR1cm4gbGVuOworCisJcmV0dXJuIG1pbihsZW4sIDE2KTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWFjX3Nob3dfbWF4X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2aWNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2NiLmMKaW5kZXggMjk1OTMyNy4uZmRhYzdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jCkBAIC05MDYsNiArOTA2LDcgQEAKIAogCXN3aXRjaCAoZnVuYykgewogCWNhc2UgUEhZX0ZVTkNfQ0xFQVJfRVJST1JfTE9HOgorCWNhc2UgUEhZX0ZVTkNfR0VUX0VWRU5UUzoKIAkJcmV0dXJuIC1FTk9TWVM7CiAJY2FzZSBQSFlfRlVOQ19TRVRfTElOS19SQVRFOgogCQlyYXRlcyA9IGFyZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCmluZGV4IGI4YTgyZjIuLmNkYjE1MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYwpAQCAtNjYwLDYgKzY2MCw3IEBACiAJc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1ib3hfbG9jayk7CiAJY3RybCA9ICZwaGJhLT5jdHJsOwogCXdyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOwogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAljdHh0ID0gJnJlcS0+Y29udGV4dDsKIApAQCAtODY4LDMgKzg2OSwyMiBAQAogCQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgTlVMTCwgUVRZUEVfU0dMKTsKIAlyZXR1cm4gc3RhdHVzOwogfQorCitpbnQgYmVpc2NzaV9jbWRfcmVzZXRfZnVuY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfcG9zdF9zZ2xfcGFnZXNfcmVxICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJICAgT1BDT0RFX0NPTU1PTl9GVU5DVElPTl9SRVNFVCwgc2l6ZW9mKCpyZXEpKTsKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeV93YWl0KHBoYmEpOworCisJc3Bpbl91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCmluZGV4IDQ5N2ViMjkuLjhiNDBhNWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKQEAgLTU2MSw2ICs1NjEsOCBAQAogCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSwgdTMyIHBhZ2Vfb2Zmc2V0LAogCQkJCXUzMiBudW1fcGFnZXMpOwogCitpbnQgYmVpc2NzaV9jbWRfcmVzZXRfZnVuY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKwogaW50IGJlX2NtZF93cmJxX2NyZWF0ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCBzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0sCiAJCSAgICAgICBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqd3JicSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKaW5kZXggM2NhZDEwNi4uOGIwMDJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTE3Nyw5ICsxNzcsOCBAQAogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uID0gY29ubi0+ZGRfZGF0YTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9Ci0JCShzdHJ1Y3QgU2NzaV9Ib3N0ICopaXNjc2lfc2Vzc2lvbl90b19zaG9zdChjbHNfc2Vzc2lvbik7Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKWlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KGNsc19zZXNzaW9uKTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwogCXN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwOwogCXN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXA7CiAKQEAgLTI5MCw3ICsyODksNyBAQAogaW50IGJlaXNjc2lfZ2V0X2hvc3RfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkgICBlbnVtIGlzY3NpX2hvc3RfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwogCWludCBzdGF0dXMgPSAwOwogCiAJU0VfREVCVUcoREJHX0xWTF84LCAiSW4gYmVpc2NzaV9nZXRfaG9zdF9wYXJhbSwgcGFyYW09ICVkXG4iLCBwYXJhbSk7CkBAIC03MzMsMyArNzMyLDU2IEBACiAJYmVpc2NzaV91bmJpbmRfY29ubl90b19jaWQocGhiYSwgYmVpc2NzaV9lcC0+ZXBfY2lkKTsKIAlpc2NzaV9kZXN0cm95X2VuZHBvaW50KGJlaXNjc2lfZXAtPm9wZW5pc2NzaV9lcCk7CiB9CisKK21vZGVfdCBiZTJpc2NzaV9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSkKK3sKKwlzd2l0Y2ggKHBhcmFtX3R5cGUpIHsKKwljYXNlIElTQ1NJX0hPU1RfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgSVNDU0lfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fSERSREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0VYUF9TVEFUU046CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QSU5HX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9SRUNWX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgorCQljYXNlIElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZJUlNUX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRVJMOgorCQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkRfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9BQk9SVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lGQUNFX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCmluZGV4IGZmNjBiN2YuLjRhMWYyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjZGVmaW5lIEJFMl9JUFY0ICAweDEKICNkZWZpbmUgQkUyX0lQVjYgIDB4MTAKIAorbW9kZV90IGJlMmlzY3NpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKTsKKwogdm9pZCBiZWlzY3NpX29mZmxvYWRfY29ubmVjdGlvbihzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCiAJCQkJc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMgKnBhcmFtcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCmluZGV4IDBhOWJkZmEuLjM3OWM2OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lzY3NpX2Jvb3Rfc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNjc2kvbGliaXNjc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmg+CkBAIC04MjIsMzMgKzgyMyw0NyBAQAogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CiAJaW50IHJldCwgbXNpeF92ZWMsIGksIGo7Ci0JY2hhciBkZXNjWzMyXTsKIAogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAogCWlmIChwaGJhLT5tc2l4X2VuYWJsZWQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJCXNwcmludGYoZGVzYywgImJlaXNjc2lfbXNpeF8lMDR4IiwgaSk7CisJCQlwaGJhLT5tc2lfbmFtZVtpXSA9IGt6YWxsb2MoQkVJU0NTSV9NU0lfTkFNRSwKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcGhiYS0+bXNpX25hbWVbaV0pIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZnJlZV9tc2l4X2lycXM7CisJCQl9CisKKwkJCXNwcmludGYocGhiYS0+bXNpX25hbWVbaV0sICJiZWlzY3NpXyUwMnhfJTAyeCIsCisJCQkJcGhiYS0+c2hvc3QtPmhvc3Rfbm8sIGkpOwogCQkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yOwotCQkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tc2l4LCAwLCBkZXNjLAorCQkJcmV0ID0gcmVxdWVzdF9pcnEobXNpeF92ZWMsIGJlX2lzcl9tc2l4LCAwLAorCQkJCQkgIHBoYmEtPm1zaV9uYW1lW2ldLAogCQkJCQkgICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAogCQkJCQkgICAgICJiZWlzY3NpX2luaXRfaXJxcy1GYWlsZWQgdG8iCiAJCQkJCSAgICAgInJlZ2lzdGVyIG1zaXggZm9yIGkgPSAlZFxuIiwgaSk7Ci0JCQkJaWYgKCFpKQotCQkJCQlyZXR1cm4gcmV0OworCQkJCWtmcmVlKHBoYmEtPm1zaV9uYW1lW2ldKTsKIAkJCQlnb3RvIGZyZWVfbXNpeF9pcnFzOwogCQkJfQogCQl9CisJCXBoYmEtPm1zaV9uYW1lW2ldID0ga3phbGxvYyhCRUlTQ1NJX01TSV9OQU1FLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwaGJhLT5tc2lfbmFtZVtpXSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9tc2l4X2lycXM7CisJCX0KKwkJc3ByaW50ZihwaGJhLT5tc2lfbmFtZVtpXSwgImJlaXNjc2lfbWNjXyUwMngiLAorCQkJcGhiYS0+c2hvc3QtPmhvc3Rfbm8pOwogCQltc2l4X3ZlYyA9IHBoYmEtPm1zaXhfZW50cmllc1tpXS52ZWN0b3I7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfdmVjLCBiZV9pc3JfbWNjLCAwLCAiYmVpc2NzaV9tc2l4X21jYyIsCisJCXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfdmVjLCBiZV9pc3JfbWNjLCAwLCBwaGJhLT5tc2lfbmFtZVtpXSwKIAkJCQkgICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKIAkJaWYgKHJldCkgewogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCBwaGJhLT5zaG9zdCwgImJlaXNjc2lfaW5pdF9pcnFzLSIKIAkJCQkgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgYmVpc2NzaV9tc2l4X21jY1xuIik7Ci0JCQlpKys7CisJCQlrZnJlZShwaGJhLT5tc2lfbmFtZVtpXSk7CiAJCQlnb3RvIGZyZWVfbXNpeF9pcnFzOwogCQl9CiAKQEAgLTg2Myw4ICs4NzgsMTEgQEAKIAl9CiAJcmV0dXJuIDA7CiBmcmVlX21zaXhfaXJxczoKLQlmb3IgKGogPSBpIC0gMTsgaiA9PSAwOyBqKyspCisJZm9yIChqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CisJCWtmcmVlKHBoYmEtPm1zaV9uYW1lW2pdKTsKKwkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbal0udmVjdG9yOwogCQlmcmVlX2lycShtc2l4X3ZlYywgJnBod2lfY29udGV4dC0+YmVfZXFbal0pOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTA2LDcgKzExMjQsMTIgQEAKIAkJCQkJCSYgU09MX1NUU19NQVNLKSA+PiA4KTsKIAlmbGFncyA9ICgocHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgaV9mbGFncykgLyAzMl0KIAkJCQkJJiBTT0xfRkxBR1NfTUFTSykgPj4gMjQpIHwgMHg4MDsKKwlpZiAoIXRhc2stPnNjKSB7CisJCWlmIChpb190YXNrLT5zY3NpX2NtbmQpCisJCQlzY3NpX2RtYV91bm1hcChpb190YXNrLT5zY3NpX2NtbmQpOwogCisJCXJldHVybjsKKwl9CiAJdGFzay0+c2MtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgc3RhdHVzOwogCWlmIChyc3AgIT0gSVNDU0lfU1RBVFVTX0NNRF9DT01QTEVURUQpIHsKIAkJdGFzay0+c2MtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKQEAgLTQwMjcsMTEgKzQwNTAsMTEgQEAKIAkJCQkgICAgICBUR1RfRE1fQ01EKTsKIAkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBjbWRzbl9pdHQsCiAJCQkJICAgICAgcHdyYiwgMCk7Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZG1zZywgcHdyYiwgMCk7CisJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgZG1zZywgcHdyYiwgMSk7CiAJCX0gZWxzZSB7CiAJCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2lzY3NpX3dyYiwgdHlwZSwgcHdyYiwKIAkJCQkgICAgICBJTklfUkRfQ01EKTsKLQkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAxKTsKKwkJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBkbXNnLCBwd3JiLCAwKTsKIAkJfQogCQlod2lfd3JpdGVfYnVmZmVyKHB3cmIsIHRhc2spOwogCQlicmVhazsKQEAgLTQxMDIsOSArNDEyNSw4IEBACiAJcmV0dXJuIGJlaXNjc2lfaW90YXNrKHRhc2ssIHNnLCBudW1fc2csIHhmZXJsZW4sIHdyaXRlZGlyKTsKIH0KIAotc3RhdGljIHZvaWQgYmVpc2NzaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3N0YXRpYyB2b2lkIGJlaXNjc2lfcXVpZXNjZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gTlVMTDsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwogCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKQEAgLTQxMTIsMTIgKzQxMzQsNiBAQAogCXU4ICpyZWFsX29mZnNldCA9IDA7CiAJdTMyIHZhbHVlID0gMDsKIAotCXBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0JaWYgKCFwaGJhKSB7Ci0JCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9yZW1vdmUgY2FsbGVkIHdpdGggbm8gcGhiYVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CiAJaHdpX2Rpc2FibGVfaW50cihwaGJhKTsKQEAgLTQxMjUsNiArNDE0MSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykgewogCQkJbXNpeF92ZWMgPSBwaGJhLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yOwogCQkJZnJlZV9pcnEobXNpeF92ZWMsICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldKTsKKwkJCWtmcmVlKHBoYmEtPm1zaV9uYW1lW2ldKTsKIAkJfQogCX0gZWxzZQogCQlpZiAocGhiYS0+cGNpZGV2LT5pcnEpCkBAIC00MTUyLDEwICs0MTY5LDQwIEBACiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnNpemUsCiAJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnZhLAogCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5kbWEpOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gTlVMTDsKKworCXBoYmEgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKwlpZiAoIXBoYmEpIHsKKwkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJiZWlzY3NpX3JlbW92ZSBjYWxsZWQgd2l0aCBubyBwaGJhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJlaXNjc2lfcXVpZXNjZShwaGJhKTsKIAlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChwaGJhLT5ib290X2tzZXQpOwogCWlzY3NpX2hvc3RfcmVtb3ZlKHBoYmEtPnNob3N0KTsKIAlwY2lfZGV2X3B1dChwaGJhLT5wY2lkZXYpOwogCWlzY3NpX2hvc3RfZnJlZShwaGJhLT5zaG9zdCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIGJlaXNjc2lfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IE5VTEw7CisKKwlwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKXBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCWlmICghcGhiYSkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfc2h1dGRvd24gY2FsbGVkIHdpdGggbm8gcGhiYVxuIik7CisJCXJldHVybjsKKwl9CisKKwliZWlzY3NpX3F1aWVzY2UocGhiYSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaWRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGJlaXNjc2lfbXNpeF9lbmFibGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQpAQCAtNDIzNSw3ICs0MjgyLDcgQEAKIAkJCWdjcmFzaG1vZGUrKzsKIAkJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgcGhiYS0+c2hvc3QsCiAJCQkJIkxvYWRpbmcgRHJpdmVyIGluIGNyYXNoZHVtcCBtb2RlXG4iKTsKLQkJCXJldCA9IGJlaXNjc2lfcGNpX3NvZnRfcmVzZXQocGhiYSk7CisJCQlyZXQgPSBiZWlzY3NpX2NtZF9yZXNldF9mdW5jdGlvbihwaGJhKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHBoYmEtPnNob3N0LAogCQkJCQkiUmVzZXQgRmFpbGVkLiBBYm9ydGluZyBDcmFzaGR1bXBcbiIpOwpAQCAtNDM2NCwzNyArNDQxMSwxMiBAQAogCS5uYW1lID0gRFJWX05BTUUsCiAJLmNhcHMgPSBDQVBfUkVDT1ZFUllfTDAgfCBDQVBfSERSREdTVCB8IENBUF9URVhUX05FR08gfAogCQlDQVBfTVVMVElfUjJUIHwgQ0FQX0RBVEFER1NUIHwgQ0FQX0RBVEFfUEFUSF9PRkZMT0FELAotCS5wYXJhbV9tYXNrID0gSVNDU0lfTUFYX1JFQ1ZfRExFTkdUSCB8Ci0JCUlTQ1NJX01BWF9YTUlUX0RMRU5HVEggfAotCQlJU0NTSV9IRFJER1NUX0VOIHwKLQkJSVNDU0lfREFUQURHU1RfRU4gfAotCQlJU0NTSV9JTklUSUFMX1IyVF9FTiB8Ci0JCUlTQ1NJX01BWF9SMlQgfAotCQlJU0NTSV9JTU1fREFUQV9FTiB8Ci0JCUlTQ1NJX0ZJUlNUX0JVUlNUIHwKLQkJSVNDU0lfTUFYX0JVUlNUIHwKLQkJSVNDU0lfUERVX0lOT1JERVJfRU4gfAotCQlJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfAotCQlJU0NTSV9FUkwgfAotCQlJU0NTSV9DT05OX1BPUlQgfAotCQlJU0NTSV9DT05OX0FERFJFU1MgfAotCQlJU0NTSV9FWFBfU1RBVFNOIHwKLQkJSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJSVNDU0lfUEVSU0lTVEVOVF9BRERSRVNTIHwKLQkJSVNDU0lfVEFSR0VUX05BTUUgfCBJU0NTSV9UUEdUIHwKLQkJSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCUlTQ1NJX1VTRVJOQU1FX0lOIHwgSVNDU0lfUEFTU1dPUkRfSU4gfAotCQlJU0NTSV9GQVNUX0FCT1JUIHwgSVNDU0lfQUJPUlRfVE1PIHwKLQkJSVNDU0lfTFVfUkVTRVRfVE1PIHwKLQkJSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8Ci0JCUlTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrID0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8Ci0JCQkJSVNDU0lfSE9TVF9JTklUSUFUT1JfTkFNRSwKIAkuY3JlYXRlX3Nlc3Npb24gPSBiZWlzY3NpX3Nlc3Npb25fY3JlYXRlLAogCS5kZXN0cm95X3Nlc3Npb24gPSBiZWlzY3NpX3Nlc3Npb25fZGVzdHJveSwKIAkuY3JlYXRlX2Nvbm4gPSBiZWlzY3NpX2Nvbm5fY3JlYXRlLAogCS5iaW5kX2Nvbm4gPSBiZWlzY3NpX2Nvbm5fYmluZCwKIAkuZGVzdHJveV9jb25uID0gaXNjc2lfY29ubl90ZWFyZG93biwKKwkuYXR0cl9pc192aXNpYmxlID0gYmUyaXNjc2lfYXR0cl9pc192aXNpYmxlLAogCS5zZXRfcGFyYW0gPSBiZWlzY3NpX3NldF9wYXJhbSwKIAkuZ2V0X2Nvbm5fcGFyYW0gPSBpc2NzaV9jb25uX2dldF9wYXJhbSwKIAkuZ2V0X3Nlc3Npb25fcGFyYW0gPSBpc2NzaV9zZXNzaW9uX2dldF9wYXJhbSwKQEAgLTQ0MTgsNiArNDQ0MCw3IEBACiAJLm5hbWUgPSBEUlZfTkFNRSwKIAkucHJvYmUgPSBiZWlzY3NpX2Rldl9wcm9iZSwKIAkucmVtb3ZlID0gYmVpc2NzaV9yZW1vdmUsCisJLnNodXRkb3duID0gYmVpc2NzaV9zaHV0ZG93biwKIAkuaWRfdGFibGUgPSBiZWlzY3NpX3BjaV9pZF90YWJsZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKaW5kZXggNWNlNTE3MC4uYjRhMDZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCkBAIC0zNCw3ICszNCw3IEBACiAKICNpbmNsdWRlICJiZS5oIgogI2RlZmluZSBEUlZfTkFNRQkJImJlMmlzY3NpIgotI2RlZmluZSBCVUlMRF9TVFIJCSIyLjEwMy4yOTguMCIKKyNkZWZpbmUgQlVJTERfU1RSCQkiNC4xLjIzOS4wIgogI2RlZmluZSBCRV9OQU1FCQkJIlNlcnZlckVuZ2luZXMgQmxhZGVFbmdpbmUyIiBcCiAJCQkJIkxpbnV4IGlTQ1NJIERyaXZlciB2ZXJzaW9uIiBCVUlMRF9TVFIKICNkZWZpbmUgRFJWX0RFU0MJCUJFX05BTUUgIiAiICJEcml2ZXIiCkBAIC0xNjIsNiArMTYyLDggQEAKICNkZWZpbmUgUEFHRVNfUkVRVUlSRUQoeCkgXAogCSgoeCA8IFBBR0VfU0laRSkgPyAxIDogICgoeCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFKSkKIAorI2RlZmluZSBCRUlTQ1NJX01TSV9OQU1FIDIwIC8qIHNpemUgb2YgbXNpX25hbWUgc3RyaW5nICovCisKIGVudW0gYmVfbWVtX2VudW0gewogCUhXSV9NRU1fQURETl9DT05URVhULAogCUhXSV9NRU1fV1JCLApAQCAtMjg3LDYgKzI4OSw3IEBACiAJdW5zaWduZWQgaW50IG51bV9jcHVzOwogCXVuc2lnbmVkIGludCBueHRfY3FpZDsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbTUFYX0NQVVMgKyAxXTsKKwljaGFyICptc2lfbmFtZVtNQVhfQ1BVUyArIDFdOwogCWJvb2wgbXNpeF9lbmFibGVkOwogCXN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqaW5pdF9tZW07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZGVidWdmcy5jCmluZGV4IGI0MTJlMDMuLmRlZTFhMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2RlYnVnZnMuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgogI2luY2x1ZGUgImJmYWRfaW0uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggMDEzMTIzOC4uZTVkYjY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqICBiZmFkX2ltLmMgTGludXggZHJpdmVyIElNIG1vZHVsZS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKICNpbmNsdWRlICJiZmFkX2Rydi5oIgogI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfZmNzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAppbmRleCBkZDMzNWEyLi4wNDllYTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlICJibngyZmNfY29uc3RhbnRzLmgiCiAKICNkZWZpbmUgQk5YMkZDX05BTUUJCSJibngyZmMiCi0jZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMS4wLjQiCisjZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMS4wLjkiCiAKICNkZWZpbmUgUEZYCQkJImJueDJmYzogIgogCkBAIC0xNDUsNiArMTQ1LDkgQEAKICNkZWZpbmUgUkVDX1JFVFJZX0NPVU5UCQkJMQogI2RlZmluZSBCTlgyRkNfTlVNX0VSUl9CSVRTCQk2MwogCisjZGVmaW5lIEJOWDJGQ19SRUxPR0lOX1dBSVRfVElNRQkyMDAKKyNkZWZpbmUgQk5YMkZDX1JFTE9HSU5fV0FJVF9DTlQJCTEwCisKIC8qIGJueDJmYyBkcml2ZXIgdXNlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBmY29lX3BlcmNwdV9zICovCiBleHRlcm4gc3RydWN0IGZjb2VfcGVyY3B1X3MgYm54MmZjX2dsb2JhbDsKIApAQCAtMjI0LDYgKzIyNyw3IEBACiAJc3RydWN0IGZjb2VfY3RsciBjdGxyOwogCXU4IHZsYW5fZW5hYmxlZDsKIAlpbnQgdmxhbl9pZDsKKwlib29sIGVuYWJsZWQ7CiB9OwogCiAjZGVmaW5lIGJueDJmY19mcm9tX2N0bHIoZmlwKSBjb250YWluZXJfb2YoZmlwLCBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSwgY3RscikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKaW5kZXggZDY2ZGNiZC4uY2UwY2UzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKQEAgLTI2OCwxNyArMjY4LDYgQEAKIAogCW9yaWdfaW9fcmVxID0gY2JfYXJnLT5hYm9ydGVkX2lvX3JlcTsKIAlzcnJfcmVxID0gY2JfYXJnLT5pb19yZXE7Ci0JaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKLQkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOiB4aWQgLSAweCV4IGNvbXBsZXRlZCIsCi0JCQlvcmlnX2lvX3JlcS0+eGlkKTsKLQkJZ290byBzcnJfY29tcGxfZG9uZTsKLQl9Ci0JaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgewotCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJyZWMgYWJ0cyBpbiBwcm9nICIKLQkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKLQkJCW9yaWdfaW9fcmVxLT54aWQpOwotCQlnb3RvIHNycl9jb21wbF9kb25lOwotCX0KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GTEFHX0VMU19USU1FT1VULCAmc3JyX3JlcS0+cmVxX2ZsYWdzKSkgewogCQkvKiBTUlIgdGltZWRvdXQgKi8KIAkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyIHRpbWVkIG91dCwgYWJvcnQgIgpAQCAtMjkwLDYgKzI3OSwxMiBAQAogCQkJCSJmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOwogCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAoc3JyX3JlcSk7CiAJCX0KKwkJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykgfHwKKwkJICAgIHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOnhpZCAweCV4IGZsYWdzID0gJWx4IiwKKwkJCQkgICAgICBvcmlnX2lvX3JlcS0+eGlkLCBvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKTsKKwkJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJCX0KIAkJb3JpZ19pb19yZXEtPnNycl9yZXRyeSsrOwogCQlpZiAob3JpZ19pb19yZXEtPnNycl9yZXRyeSA8PSBTUlJfUkVUUllfQ09VTlQpIHsKIAkJCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CkBAIC0zMTEsNiArMzA2LDEyIEBACiAJCX0KIAkJZ290byBzcnJfY29tcGxfZG9uZTsKIAl9CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNycl9jb21wbDp4aWQgLSAweCV4IGZsYWdzID0gJWx4IiwKKwkJCSAgICAgIG9yaWdfaW9fcmVxLT54aWQsIG9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpOworCQlnb3RvIHNycl9jb21wbF9kb25lOworCX0KIAltcF9yZXEgPSAmKHNycl9yZXEtPm1wX3JlcSk7CiAJZmNfaGRyID0gJihtcF9yZXEtPnJlc3BfZmNfaGRyKTsKIAlyZXNwX2xlbiA9IG1wX3JlcS0+cmVzcF9sZW47CkBAIC0zOTEsMTggKzM5Miw2IEBACiAJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOiBvcmlnIHhpZCA9IDB4JXgiLCBvcmlnX2lvX3JlcS0+eGlkKTsKIAl0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OwogCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKLQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiY29tcGxldGVkIgotCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAotCQkJb3JpZ19pb19yZXEtPnhpZCk7Ci0JCWdvdG8gcmVjX2NvbXBsX2RvbmU7Ci0JfQotCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKLQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiYWJ0cyBpbiBwcm9nICIKLQkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKLQkJCW9yaWdfaW9fcmVxLT54aWQpOwotCQlnb3RvIHJlY19jb21wbF9kb25lOwotCX0KIAkvKiBIYW5kbGUgUkVDIHRpbWVvdXQgY2FzZSAqLwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfRUxTX1RJTUVPVVQsICZyZWNfcmVxLT5yZXFfZmxhZ3MpKSB7CiAJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInRpbWVkIG91dCwgYWJvcnQgIgpAQCAtNDMzLDYgKzQyMiwyMCBAQAogCQl9CiAJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CiAJfQorCisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiY29tcGxldGVkIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiYWJ0cyBpbiBwcm9nICIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlnb3RvIHJlY19jb21wbF9kb25lOworCX0KKwogCW1wX3JlcSA9ICYocmVjX3JlcS0+bXBfcmVxKTsKIAlmY19oZHIgPSAmKG1wX3JlcS0+cmVzcF9mY19oZHIpOwogCXJlc3BfbGVuID0gbXBfcmVxLT5yZXNwX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwppbmRleCA4MjBhMTg0Li44YzYxNTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MmZjIgogI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JQk5YMkZDX1ZFUlNJT04KLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4gMjMsIDIwMTEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiT2N0IDIxLCAyMDExIgogCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KQEAgLTU2LDYgKzU2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgYm54MmZjX3RyYW5zcG9ydF9mdW5jdGlvbjsKIHN0YXRpYyBzdHJ1Y3QgZmNfZnVuY3Rpb25fdGVtcGxhdGUgYm54MmZjX3Zwb3J0X3hwb3J0X2Z1bmN0aW9uOwogc3RhdGljIGludCBibngyZmNfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGVudW0gZmlwX3N0YXRlIGZpcF9tb2RlKTsKK3N0YXRpYyB2b2lkIF9fYm54MmZjX2Rlc3Ryb3koc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSk7CiBzdGF0aWMgaW50IGJueDJmY19kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2aWNlKTsKIHN0YXRpYyBpbnQgYm54MmZjX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyBpbnQgYm54MmZjX2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CkBAIC02NCw3ICs2NSw2IEBACiAKIHN0YXRpYyB2b2lkIGJueDJmY19zdGFydF9kaXNjKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogc3RhdGljIGludCBibngyZmNfc2hvc3RfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IGJueDJmY19uZXRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHApOwogc3RhdGljIGludCBibngyZmNfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpOwogc3RhdGljIGludCBibngyZmNfZW1fY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpOwogc3RhdGljIGludCBibngyZmNfYmluZF9hZGFwdGVyX2RldmljZXMoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CkBAIC03OCw2ICs3OCw3IEBACiBzdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19oYmFfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2Rldik7CiBzdGF0aWMgc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmJueDJmY19pbnRlcmZhY2VfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlCiAJCQkJCQkJKnBoeXNfZGV2KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyZmNfaW50ZXJmYWNlX3B1dChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKIHN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2ZpbmRfaGJhX2Zvcl9jbmljKHN0cnVjdCBjbmljX2RldiAqY25pYyk7CiAKIHN0YXRpYyBpbnQgYm54MmZjX2Z3X2luaXQoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CkBAIC05OCw2ICs5OSwyNSBAQAogCS5ub3RpZmllcl9jYWxsID0gYm54MmZjX2NwdV9jYWxsYmFjaywKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmJueDJmY19uZXRkZXYoY29uc3Qgc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqKQorCQkoKHN0cnVjdCBmY29lX3BvcnQgKilscG9ydF9wcml2KGxwb3J0KSktPnByaXYpLT5uZXRkZXY7Cit9CisKKy8qKgorICogYm54MmZjX2dldF9sZXNiKCkgLSBGaWxsIHRoZSBGQ29FIExpbmsgRXJyb3IgU3RhdHVzIEJsb2NrCisgKiBAbHBvcnQ6IHRoZSBsb2NhbCBwb3J0CisgKiBAZmNfbGVzYjogdGhlIGxpbmsgZXJyb3Igc3RhdHVzIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGJueDJmY19nZXRfbGVzYihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LAorCQkJICAgIHN0cnVjdCBmY19lbHNfbGVzYiAqZmNfbGVzYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYm54MmZjX25ldGRldihscG9ydCk7CisKKwlfX2Zjb2VfZ2V0X2xlc2IobHBvcnQsIGZjX2xlc2IsIG5ldGRldik7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJmY19jbGVhbl9yeF9xdWV1ZShzdHJ1Y3QgZmNfbHBvcnQgKmxwKQogewogCXN0cnVjdCBmY29lX3BlcmNwdV9zICpiZzsKQEAgLTU0NSw2ICs1NjUsMTQgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCisJaWYgKGZoLT5maF9yX2N0bCA9PSBGQ19SQ1RMX0JBX0FCVFMpIHsKKwkJLyogRHJvcCBpbmNvbWluZyBBQlRTICovCisJCXB1dF9jcHUoKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKIAlpZiAobGUzMl90b19jcHUoZnJfY3JjKGZwKSkgIT0KIAkJCX5jcmMzMih+MCwgc2tiLT5kYXRhLCBmcl9sZW4pKSB7CiAJCWlmIChzdGF0cy0+SW52YWxpZENSQ0NvdW50IDwgNSkKQEAgLTcyNyw3ICs3NTUsNyBAQAogCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9MSU5LX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IGJueDJmY19uZXRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCitzdGF0aWMgaW50IGJueDJmY19uZXRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwpAQCAtNzUzLDExICs3ODEsMTYgQEAKIAlibngyZmNfbGlua19zcGVlZF91cGRhdGUobHBvcnQpOwogCiAJaWYgKCFscG9ydC0+dnBvcnQpIHsKLQkJd3dubiA9IGZjb2Vfd3duX2Zyb21fbWFjKGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsIDEsIDApOworCQlpZiAoZmNvZV9nZXRfd3duKG5ldGRldiwgJnd3bm4sIE5FVERFVl9GQ09FX1dXTk4pKQorCQkJd3dubiA9IGZjb2Vfd3duX2Zyb21fbWFjKGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsCisJCQkJCQkgMSwgMCk7CiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiV1dOTiA9IDB4JWxseFxuIiwgd3dubik7CiAJCWZjX3NldF93d25uKGxwb3J0LCB3d25uKTsKIAotCQl3d3BuID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgMiwgMCk7CisJCWlmIChmY29lX2dldF93d24obmV0ZGV2LCAmd3dwbiwgTkVUREVWX0ZDT0VfV1dQTikpCisJCQl3d3BuID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwKKwkJCQkJCSAyLCAwKTsKKwogCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIldXUE4gPSAweCVsbHhcbiIsIHd3cG4pOwogCQlmY19zZXRfd3dwbihscG9ydCwgd3dwbik7CiAJfQpAQCAtNzY5LDggKzgwMiw4IEBACiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWRhdGE7CiAKLQlCTlgyRkNfTUlTQ19EQkcoIkVSUk9SOmJueDJmY19kZXN0cm95X3RpbWVyIC0gIgotCQkgICAiRGVzdHJveSBjb21wbCBub3QgcmVjZWl2ZWQhIVxuIik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1I6Ym54MmZjX2Rlc3Ryb3lfdGltZXIgLSAiCisJICAgICAgICJEZXN0cm95IGNvbXBsIG5vdCByZWNlaXZlZCEhXG4iKTsKIAlzZXRfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwgJmhiYS0+ZmxhZ3MpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGJhLT5kZXN0cm95X3dhaXQpOwogfQpAQCAtNzgzLDcgKzgxNiw3IEBACiAgKiBAdmxhbl9pZDoJdmxhbiBpZCAtIGFzc29jaWF0ZWQgdmxhbiBpZCB3aXRoIHRoaXMgZXZlbnQKICAqCiAgKiBIYW5kbGVzIE5FVERFVl9VUCwgTkVUREVWX0RPV04sIE5FVERFVl9HT0lOR19ET1dOLE5FVERFVl9DSEFOR0UgYW5kCi0gKiBORVRERVZfQ0hBTkdFX01UVSBldmVudHMKKyAqIE5FVERFVl9DSEFOR0VfTVRVIGV2ZW50cy4gSGFuZGxlIE5FVERFVl9VTlJFR0lTVEVSIG9ubHkgZm9yIHZsYW5zLgogICovCiBzdGF0aWMgdm9pZCBibngyZmNfaW5kaWNhdGVfbmV0ZXZlbnQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgbG9uZyBldmVudCwKIAkJCQkgICAgIHUxNiB2bGFuX2lkKQpAQCAtNzkxLDEyICs4MjQsMTEgQEAKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopY29udGV4dDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqdnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlLCAqdG1wOwogCWludCB3YWl0X2Zvcl91cGxvYWQgPSAwOwogCXUzMiBsaW5rX3Bvc3NpYmxlID0gMTsKIAotCS8qIElnbm9yZSB2bGFucyBmb3Igbm93ICovCi0JaWYgKHZsYW5faWQgIT0gMCkKKwlpZiAodmxhbl9pZCAhPSAwICYmIGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CkBAIC04MjAsNiArODUyLDE4IEBACiAJY2FzZSBORVRERVZfQ0hBTkdFOgogCQlicmVhazsKIAorCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCWlmICghdmxhbl9pZCkKKwkJCXJldHVybjsKKwkJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGludGVyZmFjZSwgdG1wLCAmaWZfbGlzdCwgbGlzdCkgeworCQkJaWYgKGludGVyZmFjZS0+aGJhID09IGhiYSAmJgorCQkJICAgIGludGVyZmFjZS0+dmxhbl9pZCA9PSAodmxhbl9pZCAmIFZMQU5fVklEX01BU0spKQorCQkJCV9fYm54MmZjX2Rlc3Ryb3koaW50ZXJmYWNlKTsKKwkJfQorCQltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CisJCXJldHVybjsKKwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVua29ud24gbmV0ZXZlbnQgJWxkIiwgZXZlbnQpOwogCQlyZXR1cm47CkBAIC04MzgsOCArODgyLDE1IEBACiAJCWJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CiAKIAkJaWYgKGxpbmtfcG9zc2libGUgJiYgIWJueDJmY19saW5rX29rKGxwb3J0KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpbmRpY2F0ZV9uZXRldmVudDogY3Rscl9saW5rX3VwXG4iKTsKLQkJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOworCQkJLyogUmVzZXQgbWF4IHJlY3YgZnJhbWUgc2l6ZSB0byBkZWZhdWx0ICovCisJCQlmY19zZXRfbWZzKGxwb3J0LCBCTlgyRkNfTUZTKTsKKwkJCS8qCisJCQkgKiBjdGxyIGxpbmsgdXAgd2lsbCBvbmx5IGJlIGhhbmRsZWQgZHVyaW5nCisJCQkgKiBlbmFibGUgdG8gYXZvaWQgc2VuZGluZyBkaXNjb3Zlcnkgc29saWNpdGF0aW9uCisJCQkgKiBvbiBhIHN0YWxlIHZsYW4KKwkJCSAqLworCQkJaWYgKGludGVyZmFjZS0+ZW5hYmxlZCkKKwkJCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKIAkJfSBlbHNlIGlmIChmY29lX2N0bHJfbGlua19kb3duKCZpbnRlcmZhY2UtPmN0bHIpKSB7CiAJCQltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cG9ydCwgJmxwb3J0LT52cG9ydHMsIGxpc3QpCkBAIC05OTUsNiArMTA0NiwxNyBAQAogCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQ7CisJaW50IHJjOworCWNoYXIgYnVmWzMyXTsKKworCXJjID0gZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUodnBvcnQpOworCWlmIChyYykgeworCQlmY29lX3d3bl90b19zdHIodnBvcnQtPnBvcnRfbmFtZSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byBjcmVhdGUgdnBvcnQsICIKKwkJICAgICAgICJXV1BOICgweCVzKSBhbHJlYWR5IGV4aXN0c1xuIiwKKwkJICAgICAgIGJ1Zik7CisJCXJldHVybiByYzsKKwl9CiAKIAlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aGJhLT5mbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidm4gcG9ydHMgY2Fubm90IGJlIGNyZWF0ZWQgb24iCkBAIC0xMDI0LDE2ICsxMDg2LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJueDJmY19mcmVlX3Zwb3J0KHN0cnVjdCBibngyZmNfaGJhICpoYmEsIHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCit7CisJc3RydWN0IGJueDJmY19scG9ydCAqYmxwb3J0LCAqdG1wOworCisJc3Bpbl9sb2NrX2JoKCZoYmEtPmhiYV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxwb3J0LCB0bXAsICZoYmEtPnZwb3J0cywgbGlzdCkgeworCQlpZiAoYmxwb3J0LT5scG9ydCA9PSBscG9ydCkgeworCQkJbGlzdF9kZWwoJmJscG9ydC0+bGlzdCk7CisJCQlrZnJlZShibHBvcnQpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZoYmEtPmhiYV9sb2NrKTsKK30KKwogc3RhdGljIGludCBibngyZmNfdnBvcnRfZGVzdHJveShzdHJ1Y3QgZmNfdnBvcnQgKnZwb3J0KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdnBvcnRfdG9fc2hvc3QodnBvcnQpOwogCXN0cnVjdCBmY19scG9ydCAqbl9wb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGZjX2xwb3J0ICp2bl9wb3J0ID0gdnBvcnQtPmRkX2RhdGE7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYodm5fcG9ydCk7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGZjX2xwb3J0ICp2X3BvcnQ7CisJYm9vbCBmb3VuZCA9IGZhbHNlOwogCiAJbXV0ZXhfbG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2X3BvcnQsICZuX3BvcnQtPnZwb3J0cywgbGlzdCkKKwkJaWYgKHZfcG9ydC0+dnBvcnQgPT0gdnBvcnQpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIWZvdW5kKSB7CisJCW11dGV4X3VubG9jaygmbl9wb3J0LT5scF9tdXRleCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KIAlsaXN0X2RlbCgmdm5fcG9ydC0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKKwlibngyZmNfZnJlZV92cG9ydChpbnRlcmZhY2UtPmhiYSwgcG9ydC0+bHBvcnQpOworCWJueDJmY19wb3J0X3NodXRkb3duKHBvcnQtPmxwb3J0KTsKKwlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOwogCXF1ZXVlX3dvcmsoYm54MmZjX3dxLCAmcG9ydC0+ZGVzdHJveV93b3JrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNTQsNyArMTE0Niw3IEBACiB9CiAKIAotc3RhdGljIGludCBibngyZmNfbmV0ZGV2X3NldHVwKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCitzdGF0aWMgaW50IGJueDJmY19pbnRlcmZhY2Vfc2V0dXAoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNkZXYgPSBpbnRlcmZhY2UtPmhiYS0+cGh5c19kZXY7CkBAIC0xMjUyLDcgKzEzNDQsNyBAQAogCWludGVyZmFjZS0+Y3Rsci5nZXRfc3JjX2FkZHIgPSBibngyZmNfZ2V0X3NyY19tYWM7CiAJc2V0X2JpdChCTlgyRkNfQ1RMUl9JTklUX0RPTkUsICZpbnRlcmZhY2UtPmlmX2ZsYWdzKTsKIAotCXJjID0gYm54MmZjX25ldGRldl9zZXR1cChpbnRlcmZhY2UpOworCXJjID0gYm54MmZjX2ludGVyZmFjZV9zZXR1cChpbnRlcmZhY2UpOwogCWlmICghcmMpCiAJCXJldHVybiBpbnRlcmZhY2U7CiAKQEAgLTEzMTgsNyArMTQxMCw3IEBACiAJCWZjX3NldF93d3BuKGxwb3J0LCB2cG9ydC0+cG9ydF9uYW1lKTsKIAl9CiAJLyogQ29uZmlndXJlIG5ldGRldiBhbmQgbmV0d29ya2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBscG9ydCAqLwotCXJjID0gYm54MmZjX25ldF9jb25maWcobHBvcnQpOworCXJjID0gYm54MmZjX25ldF9jb25maWcobHBvcnQsIGludGVyZmFjZS0+bmV0ZGV2KTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXJyb3Igb24gYm54MmZjX25ldF9jb25maWdcbiIpOwogCQlnb3RvIGxwX2NvbmZpZ19lcnI7CkBAIC0xMzcyLDcgKzE0NjQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfbmV0ZGV2X2NsZWFudXAoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKK3N0YXRpYyB2b2lkIGJueDJmY19uZXRfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCS8qIERvbnQgbGlzdGVuIGZvciBFdGhlcm5ldCBwYWNrZXRzIGFueW1vcmUgKi8KIAlfX2Rldl9yZW1vdmVfcGFjaygmaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlKTsKQEAgLTEzODAsMTAgKzE0NzIsMTEgQEAKIAlzeW5jaHJvbml6ZV9uZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MmZjX2lmX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3N0YXRpYyB2b2lkIGJueDJmY19pbnRlcmZhY2VfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogeworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfbHBvcnQgKmJscG9ydCwgKnRtcDsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAkvKiBTdG9wIHRoZSB0cmFuc21pdCByZXRyeSB0aW1lciAqLwogCWRlbF90aW1lcl9zeW5jKCZwb3J0LT50aW1lcik7CkBAIC0xMzkxLDYgKzE0ODQsMTQgQEAKIAkvKiBGcmVlIGV4aXN0aW5nIHRyYW5zbWl0IHNrYnMgKi8KIAlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHBvcnQpOwogCisJYm54MmZjX25ldF9jbGVhbnVwKGludGVyZmFjZSk7CisKKwlibngyZmNfZnJlZV92cG9ydChoYmEsIGxwb3J0KTsKK30KKworc3RhdGljIHZvaWQgYm54MmZjX2lmX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3sKKwogCS8qIEZyZWUgcXVldWVkIHBhY2tldHMgZm9yIHRoZSByZWNlaXZlIHRocmVhZCAqLwogCWJueDJmY19jbGVhbl9yeF9xdWV1ZShscG9ydCk7CiAKQEAgLTE0MDcsMTkgKzE1MDgsMjIgQEAKIAkvKiBGcmVlIG1lbW9yeSB1c2VkIGJ5IHN0YXRpc3RpY2FsIGNvdW50ZXJzICovCiAJZmNfbHBvcnRfZnJlZV9zdGF0cyhscG9ydCk7CiAKLQlzcGluX2xvY2tfYmgoJmhiYS0+aGJhX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibHBvcnQsIHRtcCwgJmhiYS0+dnBvcnRzLCBsaXN0KSB7Ci0JCWlmIChibHBvcnQtPmxwb3J0ID09IGxwb3J0KSB7Ci0JCQlsaXN0X2RlbCgmYmxwb3J0LT5saXN0KTsKLQkJCWtmcmVlKGJscG9ydCk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmhiYS0+aGJhX2xvY2spOwotCiAJLyogUmVsZWFzZSBTY3NpX0hvc3QgKi8KIAlzY3NpX2hvc3RfcHV0KGxwb3J0LT5ob3N0KTsKIH0KIAorc3RhdGljIHZvaWQgX19ibngyZmNfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOworCisJYm54MmZjX2ludGVyZmFjZV9jbGVhbnVwKGludGVyZmFjZSk7CisJYm54MmZjX3N0b3AoaW50ZXJmYWNlKTsKKwlsaXN0X2RlbCgmaW50ZXJmYWNlLT5saXN0KTsKKwlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOworCXF1ZXVlX3dvcmsoYm54MmZjX3dxLCAmcG9ydC0+ZGVzdHJveV93b3JrKTsKK30KKwogLyoqCiAgKiBibngyZmNfZGVzdHJveSAtIERlc3Ryb3kgYSBibngyZmMgRkNvRSBpbnRlcmZhY2UKICAqCkBAIC0xNDMzLDggKzE1MzcsNiBAQAogc3RhdGljIGludCBibngyZmNfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBOVUxMOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlpbnQgcmMgPSAwOwogCiAJcnRubF9sb2NrKCk7CkBAIC0xNDQ3LDE1ICsxNTQ5LDkgQEAKIAkJZ290byBuZXRkZXZfZXJyOwogCX0KIAotCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCi0JYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7Ci0JbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7Ci0JYm54MmZjX3N0b3AoaW50ZXJmYWNlKTsKLQlsaXN0X2RlbCgmaW50ZXJmYWNlLT5saXN0KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUpOwotCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7Ci0JYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7CisJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOwogCiBuZXRkZXZfZXJyOgogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKQEAgLTE0NjcsMjIgKzE1NjMsMTMgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7Ci0Jc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCiAJcG9ydCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNvZV9wb3J0LCBkZXN0cm95X3dvcmspOwogCWxwb3J0ID0gcG9ydC0+bHBvcnQ7Ci0JaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKLQloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiRW50ZXJlZCBibngyZmNfZGVzdHJveV93b3JrXG4iKTsKIAotCWJueDJmY19wb3J0X3NodXRkb3duKGxwb3J0KTsKLQlydG5sX2xvY2soKTsKLQltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCWJueDJmY19pZl9kZXN0cm95KGxwb3J0LCBoYmEpOwotCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQlydG5sX3VubG9jaygpOworCWJueDJmY19pZl9kZXN0cm95KGxwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgYm54MmZjX3VuYmluZF9hZGFwdGVyX2RldmljZXMoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKQEAgLTE2NjEsNiArMTc0OCw3IEBACiAJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaGJhLT5kZXN0cm95X3dhaXQsCiAJCQkJCXRlc3RfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwKIAkJCQkJCSAmaGJhLT5mbGFncykpOworCQkJY2xlYXJfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwgJmhiYS0+ZmxhZ3MpOwogCQkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKQEAgLTE3MjMsNyArMTgxMSw3IEBACiAJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CiAJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJjYWxsaW5nIGZjX2ZhYnJpY19sb2dpblxuIik7CiAKLQlpZiAoIWJueDJmY19saW5rX29rKGxwb3J0KSkgeworCWlmICghYm54MmZjX2xpbmtfb2sobHBvcnQpICYmIGludGVyZmFjZS0+ZW5hYmxlZCkgewogCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImN0bHJfbGlua191cFxuIik7CiAJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOwogCQlmY19ob3N0X3BvcnRfdHlwZShscG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9OUE9SVDsKQEAgLTE3MzcsNiArMTgyNSwxMSBAQAogCQlpZiAoKyt3YWl0X2NudCA+IDEyKQogCQkJYnJlYWs7CiAJfQorCisJLyogUmVzZXQgbWF4IHJlY2VpdmUgZnJhbWUgc2l6ZSB0byBkZWZhdWx0ICovCisJaWYgKGZjX3NldF9tZnMobHBvcnQsIEJOWDJGQ19NRlMpKQorCQlyZXR1cm47CisKIAlmY19scG9ydF9pbml0KGxwb3J0KTsKIAlmY19mYWJyaWNfbG9naW4obHBvcnQpOwogfQpAQCAtMTgwMCw2ICsxODkzLDcgQEAKIAkJcmMgPSAtRU5PREVWOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGlzYWJsZTogaW50ZXJmYWNlIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7CiAJfSBlbHNlIHsKKwkJaW50ZXJmYWNlLT5lbmFibGVkID0gZmFsc2U7CiAJCWZjb2VfY3Rscl9saW5rX2Rvd24oJmludGVyZmFjZS0+Y3Rscik7CiAJCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShpbnRlcmZhY2UtPmN0bHIubHApOwogCX0KQEAgLTE4MjIsOCArMTkxNiwxMCBAQAogCWlmICghaW50ZXJmYWNlIHx8ICFpbnRlcmZhY2UtPmN0bHIubHApIHsKIAkJcmMgPSAtRU5PREVWOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZW5hYmxlOiBpbnRlcmZhY2Ugb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKLQl9IGVsc2UgaWYgKCFibngyZmNfbGlua19vayhpbnRlcmZhY2UtPmN0bHIubHApKQorCX0gZWxzZSBpZiAoIWJueDJmY19saW5rX29rKGludGVyZmFjZS0+Y3Rsci5scCkpIHsKIAkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CisJCWludGVyZmFjZS0+ZW5hYmxlZCA9IHRydWU7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CkBAIC0xOTIzLDcgKzIwMTksNiBAQAogCWlmICghbHBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2UgKCVzKVxuIiwKIAkJCW5ldGRldi0+bmFtZSk7Ci0JCWJueDJmY19uZXRkZXZfY2xlYW51cChpbnRlcmZhY2UpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gaWZfY3JlYXRlX2VycjsKIAl9CkBAIC0xOTM2LDggKzIwMzEsMTUgQEAKIAkvKiBNYWtlIHRoaXMgbWFzdGVyIE5fcG9ydCAqLwogCWludGVyZmFjZS0+Y3Rsci5scCA9IGxwb3J0OwogCisJaWYgKCFibngyZmNfbGlua19vayhscG9ydCkpIHsKKwkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CisJCWZjX2hvc3RfcG9ydF90eXBlKGxwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX05QT1JUOworCQlzZXRfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZpbnRlcmZhY2UtPmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJfQorCiAJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJjcmVhdGU6IFNUQVJUIERJU0NcbiIpOwogCWJueDJmY19zdGFydF9kaXNjKGludGVyZmFjZSk7CisJaW50ZXJmYWNlLT5lbmFibGVkID0gdHJ1ZTsKIAkvKgogCSAqIFJlbGVhc2UgZnJvbSBrcmVmX2luaXQgaW4gYm54MmZjX2ludGVyZmFjZV9zZXR1cCwgb24gc3VjY2VzcwogCSAqIGxwb3J0IHNob3VsZCBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRha2VuIGluIGJueDJmY19pZl9jcmVhdGUKQEAgLTE5NTEsNiArMjA1Myw3IEBACiBpZl9jcmVhdGVfZXJyOgogCWRlc3Ryb3lfd29ya3F1ZXVlKGludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSk7CiBpZnB1dF9lcnI6CisJYm54MmZjX25ldF9jbGVhbnVwKGludGVyZmFjZSk7CiAJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKIG5ldGRldl9lcnI6CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CkBAIC0yMDE3LDcgKzIxMjAsNiBAQAogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSwgKnRtcDsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCiAJQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkIGJueDJmY191bHBfZXhpdFxuIik7CiAKQEAgLTIwMzksMTggKzIxNDEsMTAgQEAKIAlsaXN0X2RlbF9pbml0KCZoYmEtPmxpc3QpOwogCWFkYXB0ZXJfY291bnQtLTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbnRlcmZhY2UsIHRtcCwgJmlmX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50ZXJmYWNlLCB0bXAsICZpZl9saXN0LCBsaXN0KQogCQkvKiBkZXN0cm95IG5vdCBjYWxsZWQgeWV0LCBtb3ZlIHRvIHF1aWVzY2VkIGxpc3QgKi8KLQkJaWYgKGludGVyZmFjZS0+aGJhID09IGhiYSkgewotCQkJYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7Ci0JCQlibngyZmNfc3RvcChpbnRlcmZhY2UpOwotCi0JCQlsaXN0X2RlbCgmaW50ZXJmYWNlLT5saXN0KTsKLQkJCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOwotCQkJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKLQkJCWJueDJmY19pZl9kZXN0cm95KGxwb3J0LCBoYmEpOwotCQl9Ci0JfQorCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhKQorCQkJX19ibngyZmNfZGVzdHJveShpbnRlcmZhY2UpOwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAogCWJueDJmY191bHBfc3RvcChoYmEpOwpAQCAtMjExOSw3ICsyMjEzLDcgQEAKIAkJCQkodm9pZCAqKXAsCiAJCQkJImJueDJmY190aHJlYWQvJWQiLCBjcHUpOwogCS8qIGJpbmQgdGhyZWFkIHRvIHRoZSBjcHUgKi8KLQlpZiAobGlrZWx5KCFJU19FUlIocC0+aW90aHJlYWQpKSkgeworCWlmIChsaWtlbHkoIUlTX0VSUih0aHJlYWQpKSkgewogCQlrdGhyZWFkX2JpbmQodGhyZWFkLCBjcHUpOwogCQlwLT5pb3RocmVhZCA9IHRocmVhZDsKIAkJd2FrZV91cF9wcm9jZXNzKHRocmVhZCk7CkBAIC0yMTMxLDcgKzIyMjUsNiBAQAogCXN0cnVjdCBibngyZmNfcGVyY3B1X3MgKnA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CiAJc3RydWN0IGJueDJmY193b3JrICp3b3JrLCAqdG1wOwotCUxJU1RfSEVBRCh3b3JrX2xpc3QpOwogCiAJQk5YMkZDX01JU0NfREJHKCJkZXN0cm95aW5nIGlvIHRocmVhZCBmb3IgQ1BVICVkXG4iLCBjcHUpOwogCkBAIC0yMTQzLDcgKzIyMzYsNyBAQAogCiAKIAkvKiBGcmVlIGFsbCB3b3JrIGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIHRtcCwgJndvcmtfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3b3JrLCB0bXAsICZwLT53b3JrX2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmd29yay0+bGlzdCk7CiAJCWJueDJmY19wcm9jZXNzX2NxX2NvbXBsKHdvcmstPnRndCwgd29yay0+d3FlKTsKIAkJa2ZyZWUod29yayk7CkBAIC0yMzc2LDYgKzI0NjksNyBAQAogCS52cG9ydF9jcmVhdGUgPSBibngyZmNfdnBvcnRfY3JlYXRlLAogCS52cG9ydF9kZWxldGUgPSBibngyZmNfdnBvcnRfZGVzdHJveSwKIAkudnBvcnRfZGlzYWJsZSA9IGJueDJmY192cG9ydF9kaXNhYmxlLAorCS5ic2dfcmVxdWVzdCA9IGZjX2xwb3J0X2JzZ19yZXF1ZXN0LAogfTsKIAogc3RhdGljIHN0cnVjdCBmY19mdW5jdGlvbl90ZW1wbGF0ZSBibngyZmNfdnBvcnRfeHBvcnRfZnVuY3Rpb24gPSB7CkBAIC0yNDA5LDYgKzI1MDMsNyBAQAogCS5nZXRfZmNfaG9zdF9zdGF0cyA9IGZjX2dldF9ob3N0X3N0YXRzLAogCS5pc3N1ZV9mY19ob3N0X2xpcCA9IGJueDJmY19mY29lX3Jlc2V0LAogCS50ZXJtaW5hdGVfcnBvcnRfaW8gPSBmY19ycG9ydF90ZXJtaW5hdGVfaW8sCisJLmJzZ19yZXF1ZXN0ID0gZmNfbHBvcnRfYnNnX3JlcXVlc3QsCiB9OwogCiAvKioKQEAgLTI0MzgsNiArMjUzMyw3IEBACiAJLmVsc2N0X3NlbmQJCT0gYm54MmZjX2Vsc2N0X3NlbmQsCiAJLmZjcF9hYm9ydF9pbwkJPSBibngyZmNfYWJvcnRfaW8sCiAJLmZjcF9jbGVhbnVwCQk9IGJueDJmY19jbGVhbnVwLAorCS5nZXRfbGVzYgkJPSBibngyZmNfZ2V0X2xlc2IsCiAJLnJwb3J0X2V2ZW50X2NhbGxiYWNrCT0gYm54MmZjX3Jwb3J0X2V2ZW50X2hhbmRsZXIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCmluZGV4IDcyY2ZiMTQuLjE5MjNhMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCkBAIC0xMDA5LDYgKzEwMDksNyBAQAogCXUzMiBjcV9jb25zOwogCXN0cnVjdCBmY29lX2NxZSAqY3FlOwogCXUzMiBudW1fZnJlZV9zcWVzID0gMDsKKwl1MzIgbnVtX2NxZXMgPSAwOwogCXUxNiB3cWU7CiAKIAkvKgpAQCAtMTA1OCwxMCArMTA1OSwxMSBAQAogCQkJCXdha2VfdXBfcHJvY2VzcyhmcHMtPmlvdGhyZWFkKTsKIAkJCWVsc2UKIAkJCQlibngyZmNfcHJvY2Vzc19jcV9jb21wbCh0Z3QsIHdxZSk7CisJCQludW1fZnJlZV9zcWVzKys7CiAJCX0KIAkJY3FlKys7CiAJCXRndC0+Y3FfY29uc19pZHgrKzsKLQkJbnVtX2ZyZWVfc3FlcysrOworCQludW1fY3FlcysrOwogCiAJCWlmICh0Z3QtPmNxX2NvbnNfaWR4ID09IEJOWDJGQ19DUV9XUUVTX01BWCkgewogCQkJdGd0LT5jcV9jb25zX2lkeCA9IDA7CkBAIC0xMDcwLDggKzEwNzIsMTAgQEAKIAkJCQkxIC0gdGd0LT5jcV9jdXJyX3RvZ2dsZV9iaXQ7CiAJCX0KIAl9Ci0JaWYgKG51bV9mcmVlX3NxZXMpIHsKLQkJYm54MmZjX2FybV9jcSh0Z3QpOworCWlmIChudW1fY3FlcykgeworCQkvKiBBcm0gQ1Egb25seSBpZiBkb29yYmVsbCBpcyBtYXBwZWQgKi8KKwkJaWYgKHRndC0+Y3R4X2Jhc2UpCisJCQlibngyZmNfYXJtX2NxKHRndCk7CiAJCWF0b21pY19hZGQobnVtX2ZyZWVfc3FlcywgJnRndC0+ZnJlZV9zcWVzKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+Y3FfbG9jayk7CkBAIC0xNzM5LDExICsxNzQzLDEzIEBACiAJLyogSW5pdCBzdGF0ZSB0byBOT1JNQUwgKi8KIAl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gdGFza190eXBlIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUOwotCWlmIChkZXZfdHlwZSA9PSBUWVBFX1RBUEUpCisJaWYgKGRldl90eXBlID09IFRZUEVfVEFQRSkgewogCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KIAkJCQlGQ09FX1RBU0tfREVWX1RZUEVfVEFQRSA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOwotCWVsc2UKKwkJaW9fcmVxLT5yZWNfcmV0cnkgPSAwOworCQlpb19yZXEtPnJlY19yZXRyeSA9IDA7CisJfSBlbHNlCiAJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQogCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9ESVNLIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwppbmRleCA2Y2MzNzg5Li44NGE3OGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKQEAgLTE3LDcgKzE3LDcgQEAKIHN0YXRpYyBpbnQgYm54MmZjX3NwbGl0X2JkKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsIHU2NCBhZGRyLCBpbnQgc2dfbGVuLAogCQkJICAgaW50IGJkX2luZGV4KTsKIHN0YXRpYyBpbnQgYm54MmZjX21hcF9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKLXN0YXRpYyB2b2lkIGJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CitzdGF0aWMgaW50IGJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfdW5tYXBfc2dfbGlzdChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY19mcmVlX21wX3Jlc2Moc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfcGFyc2VfZmNwX3JzcChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLApAQCAtMTEwMyw3ICsxMTAzLDEwIEBACiAJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwID0gcnBvcnQtPmRkX2RhdGE7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CisJaW50IGxvZ29faXNzdWVkOworCWludCB3YWl0X2NudCA9IDA7CiAJaW50IHJjID0gRkFJTEVEOwogCiAKQEAgLTExOTIsOCArMTE5NSw0MCBAQAogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKIAkJCQkiYWxyZWFkeSBpbiBhYnRzIHByb2Nlc3NpbmdcbiIsIGlvX3JlcS0+eGlkKTsKKwkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmlvX3JlcS0+dGltZW91dF93b3JrKSkKKwkJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LAorCQkJCSBibngyZmNfY21kX3JlbGVhc2UpOyAvKiBkcm9wIHRpbWVyIGhvbGQgKi8KKwkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAoaW9fcmVxKTsKKworCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmaW9fcmVxLT50bV9kb25lKTsKKworCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlpb19yZXEtPndhaXRfZm9yX2NvbXAgPSAwOworCQlyZGF0YSA9IGlvX3JlcS0+dGd0LT5yZGF0YTsKKwkJbG9nb19pc3N1ZWQgPSB0ZXN0X2FuZF9zZXRfYml0KEJOWDJGQ19GTEFHX0VYUExfTE9HTywKKwkJCQkJICAgICAgICZ0Z3QtPmZsYWdzKTsKIAkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKworCQlpZiAoIWxvZ29faXNzdWVkKSB7CisJCQlCTlgyRkNfSU9fREJHKGlvX3JlcSwgIkV4cGwgbG9nbyAtIHRndCBmbGFncyA9IDB4JWx4XG4iLAorCQkJCSAgICAgIHRndC0+ZmxhZ3MpOworCQkJbXV0ZXhfbG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CisJCQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKHJkYXRhKTsKKwkJCW11dGV4X3VubG9jaygmbHBvcnQtPmRpc2MuZGlzY19tdXRleCk7CisJCQlkbyB7CisJCQkJbXNsZWVwKEJOWDJGQ19SRUxPR0lOX1dBSVRfVElNRSk7CisJCQkJLyoKKwkJCQkgKiBJZiBzZXNzaW9uIG5vdCByZWNvdmVyZWQsIGxldCBTQ1NJLW1sCisJCQkJICogZXNjYWxhdGUgZXJyb3IgcmVjb3ZlcnkuCisJCQkJICovCisJCQkJaWYgKHdhaXRfY250KysgPiBCTlgyRkNfUkVMT0dJTl9XQUlUX0NOVCkKKwkJCQkJcmV0dXJuIEZBSUxFRDsKKwkJCX0gd2hpbGUgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19TRVNTSU9OX1JFQURZLAorCQkJCQkgICAmdGd0LT5mbGFncykpOworCQl9CiAJCXJldHVybiBTVUNDRVNTOwogCX0KIAlpZiAocmMgPT0gRkFJTEVEKSB7CkBAIC0xMjUxLDcgKzEyODYsNiBAQAogCQkJc2VxX2NsbnBfcmVxLT54aWQpOwogCQlnb3RvIGZyZWVfY2JfYXJnOwogCX0KLQlrcmVmX2dldCgmb3JpZ19pb19yZXEtPnJlZmNvdW50KTsKIAogCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAlyYyA9IGJueDJmY19zZW5kX3NycihvcmlnX2lvX3JlcSwgb2Zmc2V0LCByX2N0bCk7CkBAIC0xMjc2LDYgKzEzMTAsOCBAQAogCQkgICBpb19yZXEtPnJlZmNvdW50LnJlZmNvdW50LmNvdW50ZXIsIGlvX3JlcS0+Y21kX3R5cGUpOwogCWJueDJmY19zY3NpX2RvbmUoaW9fcmVxLCBESURfRVJST1IpOwogCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCWlmIChpb19yZXEtPndhaXRfZm9yX2NvbXApCisJCWNvbXBsZXRlKCZpb19yZXEtPnRtX2RvbmUpOwogfQogCiB2b2lkIGJueDJmY19wcm9jZXNzX2FidHNfY29tcGwoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKQEAgLTE1NjksNiArMTYwNSw4IEBACiAKIHN0YXRpYyBpbnQgYm54MmZjX21hcF9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQogeworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjID0gaW9fcmVxLT5zY19jbWQ7CiAJc3RydWN0IGZjb2VfYmRfY3R4ICpiZCA9IGlvX3JlcS0+YmRfdGJsLT5iZF90Ymw7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTE1ODAsNyArMTYxOCw4IEBACiAJdTY0IGFkZHI7CiAJaW50IGk7CiAKLQlzZ19jb3VudCA9IHNjc2lfZG1hX21hcChzYyk7CisJc2dfY291bnQgPSBkbWFfbWFwX3NnKCZoYmEtPnBjaWRldi0+ZGV2LCBzY3NpX3NnbGlzdChzYyksCisJCQkgICAgICBzY3NpX3NnX2NvdW50KHNjKSwgc2MtPnNjX2RhdGFfZGlyZWN0aW9uKTsKIAlzY3NpX2Zvcl9lYWNoX3NnKHNjLCBzZywgc2dfY291bnQsIGkpIHsKIAkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CiAJCWFkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CkBAIC0xNjA1LDIwICsxNjQ0LDI0IEBACiAJcmV0dXJuIGJkX2NvdW50OwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfYnVpbGRfYmRfbGlzdF9mcm9tX3NnKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCitzdGF0aWMgaW50IGJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IGlvX3JlcS0+c2NfY21kOwogCXN0cnVjdCBmY29lX2JkX2N0eCAqYmQgPSBpb19yZXEtPmJkX3RibC0+YmRfdGJsOwogCWludCBiZF9jb3VudDsKIAotCWlmIChzY3NpX3NnX2NvdW50KHNjKSkKKwlpZiAoc2NzaV9zZ19jb3VudChzYykpIHsKIAkJYmRfY291bnQgPSBibngyZmNfbWFwX3NnKGlvX3JlcSk7Ci0JZWxzZSB7CisJCWlmIChiZF9jb3VudCA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIHsKIAkJYmRfY291bnQgPSAwOwogCQliZFswXS5idWZfYWRkcl9sbyA9IGJkWzBdLmJ1Zl9hZGRyX2hpID0gMDsKIAkJYmRbMF0uYnVmX2xlbiA9IGJkWzBdLmZsYWdzID0gMDsKIAl9CiAJaW9fcmVxLT5iZF90YmwtPmJkX3ZhbGlkID0gYmRfY291bnQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYm54MmZjX3VubWFwX3NnX2xpc3Qoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKQEAgLTE3OTAsMTIgKzE4MzMsNiBAQAogCXRndCA9IChzdHJ1Y3QgYm54MmZjX3Jwb3J0ICopJnJwWzFdOwogCiAJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19TRVNTSU9OX1JFQURZLCAmdGd0LT5mbGFncykpIHsKLQkJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX1VQTERfUkVRX0NPTVBMLCAmdGd0LT5mbGFncykpICB7Ci0JCQlzY19jbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwotCQkJc2NfY21kLT5zY3NpX2RvbmUoc2NfY21kKTsKLQkJCXJldHVybiAwOwotCi0JCX0KIAkJLyoKIAkJICogU2Vzc2lvbiBpcyBub3Qgb2ZmbG9hZGVkIHlldC4gTGV0IFNDU0ktbWwgcmV0cnkKIAkJICogdGhlIGNvbW1hbmQuCkBAIC0xOTQ2LDcgKzE5ODMsMTMgQEAKIAl4aWQgPSBpb19yZXEtPnhpZDsKIAogCS8qIEJ1aWxkIGJ1ZmZlciBkZXNjcmlwdG9yIGxpc3QgZm9yIGZpcm13YXJlIGZyb20gc2cgbGlzdCAqLwotCWJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coaW9fcmVxKTsKKwlpZiAoYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhpb19yZXEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkJEIGxpc3QgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQogCiAJdGFza19pZHggPSB4aWQgLyBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCmluZGV4IGQ1MzExYjUuLmMxODAwYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKHJ2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbm4gaWQgZm9yICIKIAkJCSJwb3J0X2lkICglNngpXG4iLCBycG9ydC0+cG9ydF9pZCk7Ci0JCWdvdG8gb2ZsZF9lcnI7CisJCWdvdG8gdGd0X2luaXRfZXJyOwogCX0KIAogCS8qIEFsbG9jYXRlIHNlc3Npb24gcmVzb3VyY2VzICovCkBAIC0xMzQsMTggKzEzNCwxNyBAQAogCQkvKiB1cGxvYWQgd2lsbCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgc2VzcyByZXNjICovCiAJCWxwb3J0LT50dC5ycG9ydF9sb2dvZmYocmRhdGEpOwogCX0KLQkvKiBBcm0gQ1EgKi8KLQlibngyZmNfYXJtX2NxKHRndCk7CiAJcmV0dXJuOwogCiBvZmxkX2VycjoKIAkvKiBjb3VsZG4ndCBvZmZsb2FkIHRoZSBzZXNzaW9uLiBsb2cgb2ZmIGZyb20gdGhpcyBycG9ydCAqLwogCUJOWDJGQ19UR1RfREJHKHRndCwgImJueDJmY19vZmZsb2FkX3Nlc3Npb24gLSBvZmZsb2FkIGVycm9yXG4iKTsKLQlscG9ydC0+dHQucnBvcnRfbG9nb2ZmKHJkYXRhKTsKIAkvKiBGcmVlIHNlc3Npb24gcmVzb3VyY2VzICovCiAJYm54MmZjX2ZyZWVfc2Vzc2lvbl9yZXNjKGhiYSwgdGd0KTsKK3RndF9pbml0X2VycjoKIAlpZiAodGd0LT5mY29lX2Nvbm5faWQgIT0gLTEpCiAJCWJueDJmY19mcmVlX2Nvbm5faWQoaGJhLCB0Z3QtPmZjb2VfY29ubl9pZCk7CisJbHBvcnQtPnR0LnJwb3J0X2xvZ29mZihyZGF0YSk7CiB9CiAKIHZvaWQgYm54MmZjX2ZsdXNoX2FjdGl2ZV9pb3Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQpAQCAtNjI0LDcgKzYyMyw2IEBACiAJLyogY2FsbGVkIHdpdGggaGJhIG11dGV4IGhlbGQgKi8KIAlzcGluX2xvY2tfYmgoJmhiYS0+aGJhX2xvY2spOwogCWhiYS0+dGd0X29mbGRfbGlzdFtjb25uX2lkXSA9IE5VTEw7Ci0JaGJhLT5uZXh0X2Nvbm5faWQgPSBjb25uX2lkOwogCXNwaW5fdW5sb2NrX2JoKCZoYmEtPmhiYV9sb2NrKTsKIH0KIApAQCAtNzkxLDggKzc4OSw2IEBACiAJcmV0dXJuIDA7CiAKIG1lbV9hbGxvY19mYWlsdXJlOgotCWJueDJmY19mcmVlX3Nlc3Npb25fcmVzYyhoYmEsIHRndCk7Ci0JYm54MmZjX2ZyZWVfY29ubl9pZChoYmEsIHRndC0+ZmNvZV9jb25uX2lkKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtODA3LDE0ICs4MDMsMTQgQEAKIHN0YXRpYyB2b2lkIGJueDJmY19mcmVlX3Nlc3Npb25fcmVzYyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAogCQkJCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogeworCXZvaWQgX19pb21lbSAqY3R4X2Jhc2VfcHRyOworCiAJQk5YMkZDX1RHVF9EQkcodGd0LCAiRnJlZWluZyB1cCBzZXNzaW9uIHJlc291cmNlc1xuIik7CiAKLQlpZiAodGd0LT5jdHhfYmFzZSkgewotCQlpb3VubWFwKHRndC0+Y3R4X2Jhc2UpOwotCQl0Z3QtPmN0eF9iYXNlID0gTlVMTDsKLQl9Ci0KIAlzcGluX2xvY2tfYmgoJnRndC0+Y3FfbG9jayk7CisJY3R4X2Jhc2VfcHRyID0gdGd0LT5jdHhfYmFzZTsKKwl0Z3QtPmN0eF9iYXNlID0gTlVMTDsKKwogCS8qIEZyZWUgTENRICovCiAJaWYgKHRndC0+bGNxKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmxjcV9tZW1fc2l6ZSwKQEAgLTg2OCw0ICs4NjQsNyBAQAogCQl0Z3QtPnNxID0gTlVMTDsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+Y3FfbG9jayk7CisKKwlpZiAoY3R4X2Jhc2VfcHRyKQorCQlpb3VubWFwKGN0eF9iYXNlX3B0cik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCmluZGV4IGNmZmQ0ZDcuLmQxZTY5NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9pc2NzaS5jCkBAIC0yMTc3LDYgKzIxNzcsNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIG1vZGVfdCBibngyaV9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSkKK3sKKwlzd2l0Y2ggKHBhcmFtX3R5cGUpIHsKKwljYXNlIElTQ1NJX0hPU1RfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX05FVERFVl9OQU1FOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgSVNDU0lfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUkVDVl9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fSERSREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0VYUF9TVEFUU046CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QSU5HX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9SRUNWX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfUjJUOgorCQljYXNlIElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZJUlNUX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRFVfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9EQVRBU0VRX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRVJMOgorCQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fUEFTU1dPUkRfSU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9BQk9SVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSUZBQ0VfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqICdTY3NpX0hvc3RfVGVtcGxhdGUnIHN0cnVjdHVyZSBhbmQgJ2lzY3NpX3RyYW5wb3J0JyBzdHJ1Y3R1cmUgdGVtcGxhdGUKQEAgLTIyMDcsMzcgKzIyNjAsMTIgQEAKIAkJCQkgIENBUF9NVUxUSV9SMlQgfCBDQVBfREFUQURHU1QgfAogCQkJCSAgQ0FQX0RBVEFfUEFUSF9PRkZMT0FEIHwKIAkJCQkgIENBUF9URVhUX05FR08sCi0JLnBhcmFtX21hc2sJCT0gSVNDU0lfTUFYX1JFQ1ZfRExFTkdUSCB8Ci0JCQkJICBJU0NTSV9NQVhfWE1JVF9ETEVOR1RIIHwKLQkJCQkgIElTQ1NJX0hEUkRHU1RfRU4gfAotCQkJCSAgSVNDU0lfREFUQURHU1RfRU4gfAotCQkJCSAgSVNDU0lfSU5JVElBTF9SMlRfRU4gfAotCQkJCSAgSVNDU0lfTUFYX1IyVCB8Ci0JCQkJICBJU0NTSV9JTU1fREFUQV9FTiB8Ci0JCQkJICBJU0NTSV9GSVJTVF9CVVJTVCB8Ci0JCQkJICBJU0NTSV9NQVhfQlVSU1QgfAotCQkJCSAgSVNDU0lfUERVX0lOT1JERVJfRU4gfAotCQkJCSAgSVNDU0lfREFUQVNFUV9JTk9SREVSX0VOIHwKLQkJCQkgIElTQ1NJX0VSTCB8Ci0JCQkJICBJU0NTSV9DT05OX1BPUlQgfAotCQkJCSAgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX0VYUF9TVEFUU04gfAotCQkJCSAgSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJCQkgIElTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQkJCSAgSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCQkJICBJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKLQkJCQkgIElTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8Ci0JCQkJICBJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKLQkJCQkgIElTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9IT1NUX05FVERFVl9OQU1FLAogCS5jcmVhdGVfc2Vzc2lvbgkJPSBibngyaV9zZXNzaW9uX2NyZWF0ZSwKIAkuZGVzdHJveV9zZXNzaW9uCT0gYm54Mmlfc2Vzc2lvbl9kZXN0cm95LAogCS5jcmVhdGVfY29ubgkJPSBibngyaV9jb25uX2NyZWF0ZSwKIAkuYmluZF9jb25uCQk9IGJueDJpX2Nvbm5fYmluZCwKIAkuZGVzdHJveV9jb25uCQk9IGJueDJpX2Nvbm5fZGVzdHJveSwKKwkuYXR0cl9pc192aXNpYmxlCT0gYm54MmlfYXR0cl9pc192aXNpYmxlLAogCS5zZXRfcGFyYW0JCT0gaXNjc2lfc2V0X3BhcmFtLAogCS5nZXRfY29ubl9wYXJhbQkJPSBpc2NzaV9jb25uX2dldF9wYXJhbSwKIAkuZ2V0X3Nlc3Npb25fcGFyYW0JPSBpc2NzaV9zZXNzaW9uX2dldF9wYXJhbSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpL2N4Z2IzaS5jCmluZGV4IDEyNDJjN2MuLjAwMDI5NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYwpAQCAtMTA1LDI1ICsxMDUsNyBAQAogCS5jYXBzCQk9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9NVUxUSV9SMlQgfCBDQVBfSERSREdTVAogCQkJCXwgQ0FQX0RBVEFER1NUIHwgQ0FQX0RJR0VTVF9PRkZMT0FEIHwKIAkJCQlDQVBfUEFERElOR19PRkZMT0FEIHwgQ0FQX1RFWFRfTkVHTywKLQkucGFyYW1fbWFzawk9IElTQ1NJX01BWF9SRUNWX0RMRU5HVEggfCBJU0NTSV9NQVhfWE1JVF9ETEVOR1RIIHwKLQkJCQlJU0NTSV9IRFJER1NUX0VOIHwgSVNDU0lfREFUQURHU1RfRU4gfAotCQkJCUlTQ1NJX0lOSVRJQUxfUjJUX0VOIHwgSVNDU0lfTUFYX1IyVCB8Ci0JCQkJSVNDU0lfSU1NX0RBVEFfRU4gfCBJU0NTSV9GSVJTVF9CVVJTVCB8Ci0JCQkJSVNDU0lfTUFYX0JVUlNUIHwgSVNDU0lfUERVX0lOT1JERVJfRU4gfAotCQkJCUlTQ1NJX0RBVEFTRVFfSU5PUkRFUl9FTiB8IElTQ1NJX0VSTCB8Ci0JCQkJSVNDU0lfQ09OTl9QT1JUIHwgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQlJU0NTSV9FWFBfU1RBVFNOIHwgSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJCQlJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MgfAotCQkJCUlTQ1NJX1RBUkdFVF9OQU1FIHwgSVNDU0lfVFBHVCB8Ci0JCQkJSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCQkJSVNDU0lfVVNFUk5BTUVfSU4gfCBJU0NTSV9QQVNTV09SRF9JTiB8Ci0JCQkJSVNDU0lfRkFTVF9BQk9SVCB8IElTQ1NJX0FCT1JUX1RNTyB8Ci0JCQkJSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8Ci0JCQkJSVNDU0lfUElOR19UTU8gfCBJU0NTSV9SRUNWX1RNTyB8Ci0JCQkJSVNDU0lfSUZBQ0VfTkFNRSB8IElTQ1NJX0lOSVRJQVRPUl9OQU1FLAotCS5ob3N0X3BhcmFtX21hc2sJPSBJU0NTSV9IT1NUX0hXQUREUkVTUyB8IElTQ1NJX0hPU1RfSVBBRERSRVNTIHwKLQkJCQlJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FIHwKLQkJCQlJU0NTSV9IT1NUX05FVERFVl9OQU1FLAorCS5hdHRyX2lzX3Zpc2libGUJPSBjeGdiaV9hdHRyX2lzX3Zpc2libGUsCiAJLmdldF9ob3N0X3BhcmFtCT0gY3hnYmlfZ2V0X2hvc3RfcGFyYW0sCiAJLnNldF9ob3N0X3BhcmFtCT0gY3hnYmlfc2V0X2hvc3RfcGFyYW0sCiAJLyogc2Vzc2lvbiBtYW5hZ2VtZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwppbmRleCAzMWM3OWJkLi5hYzdhOWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKQEAgLTEwNiwyNSArMTA2LDcgQEAKIAkuY2FwcwkJPSBDQVBfUkVDT1ZFUllfTDAgfCBDQVBfTVVMVElfUjJUIHwgQ0FQX0hEUkRHU1QgfAogCQkJCUNBUF9EQVRBREdTVCB8IENBUF9ESUdFU1RfT0ZGTE9BRCB8CiAJCQkJQ0FQX1BBRERJTkdfT0ZGTE9BRCB8IENBUF9URVhUX05FR08sCi0JLnBhcmFtX21hc2sJPSBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIIHwgSVNDU0lfTUFYX1hNSVRfRExFTkdUSCB8Ci0JCQkJSVNDU0lfSERSREdTVF9FTiB8IElTQ1NJX0RBVEFER1NUX0VOIHwKLQkJCQlJU0NTSV9JTklUSUFMX1IyVF9FTiB8IElTQ1NJX01BWF9SMlQgfAotCQkJCUlTQ1NJX0lNTV9EQVRBX0VOIHwgSVNDU0lfRklSU1RfQlVSU1QgfAotCQkJCUlTQ1NJX01BWF9CVVJTVCB8IElTQ1NJX1BEVV9JTk9SREVSX0VOIHwKLQkJCQlJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4gfCBJU0NTSV9FUkwgfAotCQkJCUlTQ1NJX0NPTk5fUE9SVCB8IElTQ1NJX0NPTk5fQUREUkVTUyB8Ci0JCQkJSVNDU0lfRVhQX1NUQVRTTiB8IElTQ1NJX1BFUlNJU1RFTlRfUE9SVCB8Ci0JCQkJSVNDU0lfUEVSU0lTVEVOVF9BRERSRVNTIHwKLQkJCQlJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQkJCUlTQ1NJX1VTRVJOQU1FIHwgSVNDU0lfUEFTU1dPUkQgfAotCQkJCUlTQ1NJX1VTRVJOQU1FX0lOIHwgSVNDU0lfUEFTU1dPUkRfSU4gfAotCQkJCUlTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCUlTQ1NJX0xVX1JFU0VUX1RNTyB8IElTQ1NJX1RHVF9SRVNFVF9UTU8gfAotCQkJCUlTQ1NJX1BJTkdfVE1PIHwgSVNDU0lfUkVDVl9UTU8gfAotCQkJCUlTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8Ci0JCQkJSVNDU0lfSE9TVF9JTklUSUFUT1JfTkFNRSB8Ci0JCQkJSVNDU0lfSE9TVF9ORVRERVZfTkFNRSwKKwkuYXR0cl9pc192aXNpYmxlCT0gY3hnYmlfYXR0cl9pc192aXNpYmxlLAogCS5nZXRfaG9zdF9wYXJhbQk9IGN4Z2JpX2dldF9ob3N0X3BhcmFtLAogCS5zZXRfaG9zdF9wYXJhbQk9IGN4Z2JpX3NldF9ob3N0X3BhcmFtLAogCS8qIHNlc3Npb24gbWFuYWdlbWVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2JpL2xpYmN4Z2JpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuYwppbmRleCAxYzEzMjliLi5jMTBmNzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CS8qIGlwX2Rldl9maW5kICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRiZ19sZXZlbDsKQEAgLTI1NjgsNiArMjU2OSw2MiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3hnYmlfaXNjc2lfY2xlYW51cCk7CiAKK21vZGVfdCBjeGdiaV9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSkKK3sKKwlzd2l0Y2ggKHBhcmFtX3R5cGUpIHsKKwljYXNlIElTQ1NJX0hPU1RfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX05FVERFVl9OQU1FOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSVBBRERSRVNTOgorCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBJU0NTSV9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEg6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1hNSVRfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9IRFJER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fRVhQX1NUQVRTTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BJTkdfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX1JFQ1ZfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SMlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU1NX0RBVEFfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0RBVEFTRVFfSU5PUkRFUl9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FUkw6CisJCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9VU0VSTkFNRV9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GQVNUX0FCT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0FCT1JUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9MVV9SRVNFVF9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fVEdUX1JFU0VUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3hnYmlfYXR0cl9pc192aXNpYmxlKTsKKwogc3RhdGljIGludCBfX2luaXQgbGliY3hnYmlfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlzd190YWdfaWR4X2JpdHMgPSAoX19pbG9nMl91MzIoSVNDU0lfSVRUX01BU0spKSArIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuaCBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5oCmluZGV4IDNhMjViMTEuLjIwYzg4Mjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuaAorKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuaApAQCAtNzA5LDYgKzcwOSw3IEBACiAKIHZvaWQgY3hnYmlfY2xlYW51cF90YXNrKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKIAorbW9kZV90IGN4Z2JpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKTsKIHZvaWQgY3hnYmlfZ2V0X2Nvbm5fc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICosIHN0cnVjdCBpc2NzaV9zdGF0cyAqKTsKIGludCBjeGdiaV9zZXRfY29ubl9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKiwKIAkJCWVudW0gaXNjc2lfcGFyYW0sIGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaC5jCmluZGV4IDAxMTliODEuLjIzMTQ5YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGguYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RoLmg+CiAjaW5jbHVkZSAiLi4vc2NzaV9wcml2LmgiCiAKQEAgLTYwLDYgKzYxLDQ2IEBACiB9CiAKIC8qCisgKiBkZXZpY2VfaGFuZGxlcl9tYXRjaF9mdW5jdGlvbiAtIE1hdGNoIGEgZGV2aWNlIGhhbmRsZXIgdG8gYSBkZXZpY2UKKyAqIEBzZGV2IC0gU0NTSSBkZXZpY2UgdG8gYmUgdGVzdGVkCisgKgorICogVGVzdHMgQHNkZXYgYWdhaW5zdCB0aGUgbWF0Y2ggZnVuY3Rpb24gb2YgYWxsIHJlZ2lzdGVyZWQgZGV2aWNlX2hhbmRsZXIuCisgKiBSZXR1cm5zIHRoZSBmb3VuZCBkZXZpY2UgaGFuZGxlciBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICoKK2RldmljZV9oYW5kbGVyX21hdGNoX2Z1bmN0aW9uKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqdG1wX2RoLCAqZm91bmRfZGggPSBOVUxMOworCisJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX2RoLCAmc2NzaV9kaF9saXN0LCBsaXN0KSB7CisJCWlmICh0bXBfZGgtPm1hdGNoICYmIHRtcF9kaC0+bWF0Y2goc2RldikpIHsKKwkJCWZvdW5kX2RoID0gdG1wX2RoOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJcmV0dXJuIGZvdW5kX2RoOworfQorCisvKgorICogZGV2aWNlX2hhbmRsZXJfbWF0Y2hfZGV2bGlzdCAtIE1hdGNoIGEgZGV2aWNlIGhhbmRsZXIgdG8gYSBkZXZpY2UKKyAqIEBzZGV2IC0gU0NTSSBkZXZpY2UgdG8gYmUgdGVzdGVkCisgKgorICogVGVzdHMgQHNkZXYgYWdhaW5zdCBhbGwgZGV2aWNlX2hhbmRsZXIgcmVnaXN0ZXJlZCBpbiB0aGUgZGV2bGlzdC4KKyAqIFJldHVybnMgdGhlIGZvdW5kIGRldmljZSBoYW5kbGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgc3RydWN0IHNjc2lfZGV2aWNlX2hhbmRsZXIgKgorZGV2aWNlX2hhbmRsZXJfbWF0Y2hfZGV2bGlzdChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJaW50IGlkeDsKKworCWlkeCA9IHNjc2lfZ2V0X2RldmljZV9mbGFnc19rZXllZChzZGV2LCBzZGV2LT52ZW5kb3IsIHNkZXYtPm1vZGVsLAorCQkJCQkgIFNDU0lfREVWSU5GT19ESCk7CisJcmV0dXJuIGdldF9kZXZpY2VfaGFuZGxlcl9ieV9pZHgoaWR4KTsKK30KKworLyoKICAqIGRldmljZV9oYW5kbGVyX21hdGNoIC0gQXR0YWNoIGEgZGV2aWNlIGhhbmRsZXIgdG8gYSBkZXZpY2UKICAqIEBzY3NpX2RoIC0gVGhlIGRldmljZSBoYW5kbGVyIHRvIG1hdGNoIGFnYWluc3Qgb3IgTlVMTAogICogQHNkZXYgLSBTQ1NJIGRldmljZSB0byBiZSB0ZXN0ZWQgYWdhaW5zdCBAc2NzaV9kaApAQCAtNzIsMTIgKzExMywxMSBAQAogZGV2aWNlX2hhbmRsZXJfbWF0Y2goc3RydWN0IHNjc2lfZGV2aWNlX2hhbmRsZXIgKnNjc2lfZGgsCiAJCSAgICAgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpmb3VuZF9kaCA9IE5VTEw7Ci0JaW50IGlkeDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciAqZm91bmRfZGg7CiAKLQlpZHggPSBzY3NpX2dldF9kZXZpY2VfZmxhZ3Nfa2V5ZWQoc2Rldiwgc2Rldi0+dmVuZG9yLCBzZGV2LT5tb2RlbCwKLQkJCQkJICBTQ1NJX0RFVklORk9fREgpOwotCWZvdW5kX2RoID0gZ2V0X2RldmljZV9oYW5kbGVyX2J5X2lkeChpZHgpOworCWZvdW5kX2RoID0gZGV2aWNlX2hhbmRsZXJfbWF0Y2hfZnVuY3Rpb24oc2Rldik7CisJaWYgKCFmb3VuZF9kaCkKKwkJZm91bmRfZGggPSBkZXZpY2VfaGFuZGxlcl9tYXRjaF9kZXZsaXN0KHNkZXYpOwogCiAJaWYgKHNjc2lfZGggJiYgZm91bmRfZGggIT0gc2NzaV9kaCkKIAkJZm91bmRfZGggPSBOVUxMOwpAQCAtMTUxLDYgKzE5MSwxMCBAQAogCXN0cnVjdCBzY3NpX2RldmljZV9oYW5kbGVyICpzY3NpX2RoOwogCWludCBlcnIgPSAtRUlOVkFMOwogCisJaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9DQU5DRUwgfHwKKwkgICAgc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0RFTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoIXNkZXYtPnNjc2lfZGhfZGF0YSkgewogCQkvKgogCQkgKiBBdHRhY2ggdG8gYSBkZXZpY2UgaGFuZGxlcgpAQCAtMzI3LDcgKzM3MSw3IEBACiAJbGlzdF9hZGQoJnNjc2lfZGgtPmxpc3QsICZzY3NpX2RoX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOwogCi0JZm9yIChpID0gMDsgc2NzaV9kaC0+ZGV2bGlzdFtpXS52ZW5kb3I7IGkrKykgeworCWZvciAoaSA9IDA7IHNjc2lfZGgtPmRldmxpc3QgJiYgc2NzaV9kaC0+ZGV2bGlzdFtpXS52ZW5kb3I7IGkrKykgewogCQlzY3NpX2Rldl9pbmZvX2xpc3RfYWRkX2tleWVkKDAsCiAJCQkJCXNjc2lfZGgtPmRldmxpc3RbaV0udmVuZG9yLAogCQkJCQlzY3NpX2RoLT5kZXZsaXN0W2ldLm1vZGVsLApAQCAtMzYwLDcgKzQwNCw3IEBACiAJYnVzX2Zvcl9lYWNoX2Rldigmc2NzaV9idXNfdHlwZSwgTlVMTCwgc2NzaV9kaCwKIAkJCSBzY3NpX2RoX25vdGlmaWVyX3JlbW92ZSk7CiAKLQlmb3IgKGkgPSAwOyBzY3NpX2RoLT5kZXZsaXN0W2ldLnZlbmRvcjsgaSsrKSB7CisJZm9yIChpID0gMDsgc2NzaV9kaC0+ZGV2bGlzdCAmJiBzY3NpX2RoLT5kZXZsaXN0W2ldLnZlbmRvcjsgaSsrKSB7CiAJCXNjc2lfZGV2X2luZm9fbGlzdF9kZWxfa2V5ZWQoc2NzaV9kaC0+ZGV2bGlzdFtpXS52ZW5kb3IsCiAJCQkJCSAgICAgc2NzaV9kaC0+ZGV2bGlzdFtpXS5tb2RlbCwKIAkJCQkJICAgICBTQ1NJX0RFVklORk9fREgpOwpAQCAtMzk4LDcgKzQ0MiwxNSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCXNkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0JaWYgKHNkZXYgJiYgc2Rldi0+c2NzaV9kaF9kYXRhKQorCWlmICghc2RldikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJZXJyID0gU0NTSV9ESF9OT1NZUzsKKwkJaWYgKGZuKQorCQkJZm4oZGF0YSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoc2Rldi0+c2NzaV9kaF9kYXRhKQogCQlzY3NpX2RoID0gc2Rldi0+c2NzaV9kaF9kYXRhLT5zY3NpX2RoOwogCWRldiA9IGdldF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlpZiAoIXNjc2lfZGggfHwgIWRldiB8fApAQCAtNDY4LDcgKzUyMCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2RoX2hhbmRsZXJfZXhpc3QpOwogCiAvKgotICogc2NzaV9kaF9oYW5kbGVyX2F0dGFjaCAtIEF0dGFjaCBkZXZpY2UgaGFuZGxlcgorICogc2NzaV9kaF9hdHRhY2ggLSBBdHRhY2ggZGV2aWNlIGhhbmRsZXIKICAqIEBzZGV2IC0gc2RldiB0aGUgaGFuZGxlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8KICAqIEBuYW1lIC0gbmFtZSBvZiB0aGUgaGFuZGxlciB0byBhdHRhY2gKICAqLwpAQCAtNDk4LDcgKzU1MCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2RoX2F0dGFjaCk7CiAKIC8qCi0gKiBzY3NpX2RoX2hhbmRsZXJfZGV0YWNoIC0gRGV0YWNoIGRldmljZSBoYW5kbGVyCisgKiBzY3NpX2RoX2RldGFjaCAtIERldGFjaCBkZXZpY2UgaGFuZGxlcgogICogQHNkZXYgLSBzZGV2IHRoZSBoYW5kbGVyIHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tCiAgKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGRldGFjaCB0aGUgZGV2aWNlIGhhbmRsZXIgb25seQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jCmluZGV4IDZmZWM5ZmUuLjRlZjAyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kaC5oPgpAQCAtMTI4LDQzICsxMjksNiBAQAogfQogCiAvKgotICogc3VibWl0X3N0ZF9pbnF1aXJ5IC0gSXNzdWUgYSBzdGFuZGFyZCBJTlFVSVJZIGNvbW1hbmQKLSAqIEBzZGV2OiBzZGV2IHRoZSBjb21tYW5kIHNob3VsZCBiZSBzZW5kIHRvCi0gKi8KLXN0YXRpYyBpbnQgc3VibWl0X3N0ZF9pbnF1aXJ5KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGFsdWFfZGhfZGF0YSAqaCkKLXsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0JaW50IGVyciA9IFNDU0lfREhfUkVTX1RFTVBfVU5BVkFJTDsKLQotCXJxID0gZ2V0X2FsdWFfcmVxKHNkZXYsIGgtPmlucSwgQUxVQV9JTlFVSVJZX1NJWkUsIFJFQUQpOwotCWlmICghcnEpCi0JCWdvdG8gZG9uZTsKLQotCS8qIFByZXBhcmUgdGhlIGNvbW1hbmQuICovCi0JcnEtPmNtZFswXSA9IElOUVVJUlk7Ci0JcnEtPmNtZFsxXSA9IDA7Ci0JcnEtPmNtZFsyXSA9IDA7Ci0JcnEtPmNtZFs0XSA9IEFMVUFfSU5RVUlSWV9TSVpFOwotCXJxLT5jbWRfbGVuID0gQ09NTUFORF9TSVpFKElOUVVJUlkpOwotCi0JcnEtPnNlbnNlID0gaC0+c2Vuc2U7Ci0JbWVtc2V0KHJxLT5zZW5zZSwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKLQlycS0+c2Vuc2VfbGVuID0gaC0+c2Vuc2VsZW4gPSAwOwotCi0JZXJyID0gYmxrX2V4ZWN1dGVfcnEocnEtPnEsIE5VTEwsIHJxLCAxKTsKLQlpZiAoZXJyID09IC1FSU8pIHsKLQkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LAotCQkJICAgICIlczogc3RkIGlucXVpcnkgZmFpbGVkIHdpdGggJXhcbiIsCi0JCQkgICAgQUxVQV9ESF9OQU1FLCBycS0+ZXJyb3JzKTsKLQkJaC0+c2Vuc2VsZW4gPSBycS0+c2Vuc2VfbGVuOwotCQllcnIgPSBTQ1NJX0RIX0lPOwotCX0KLQlibGtfcHV0X3JlcXVlc3QocnEpOwotZG9uZToKLQlyZXR1cm4gZXJyOwotfQotCi0vKgogICogc3VibWl0X3ZwZF9pbnF1aXJ5IC0gSXNzdWUgYW4gSU5RVUlSWSBWUEQgcGFnZSAweDgzIGNvbW1hbmQKICAqIEBzZGV2OiBzZGV2IHRoZSBjb21tYW5kIHNob3VsZCBiZSBzZW50IHRvCiAgKi8KQEAgLTMzOCwyMyArMzAyLDE3IEBACiB9CiAKIC8qCi0gKiBhbHVhX3N0ZF9pbnF1aXJ5IC0gRXZhbHVhdGUgc3RhbmRhcmQgSU5RVUlSWSBjb21tYW5kCisgKiBhbHVhX2NoZWNrX3RwZ3MgLSBFdmFsdWF0ZSBUUEdTIHNldHRpbmcKICAqIEBzZGV2OiBkZXZpY2UgdG8gYmUgY2hlY2tlZAogICoKLSAqIEp1c3QgZXh0cmFjdCB0aGUgVFBHUyBzZXR0aW5nIHRvIGZpbmQgb3V0IGlmIEFMVUEKKyAqIEV4YW1pbmUgdGhlIFRQR1Mgc2V0dGluZyBvZiB0aGUgc2RldiB0byBmaW5kIG91dCBpZiBBTFVBCiAgKiBpcyBzdXBwb3J0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgYWx1YV9zdGRfaW5xdWlyeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBhbHVhX2RoX2RhdGEgKmgpCitzdGF0aWMgaW50IGFsdWFfY2hlY2tfdHBncyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBhbHVhX2RoX2RhdGEgKmgpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gU0NTSV9ESF9PSzsKIAotCWVyciA9IHN1Ym1pdF9zdGRfaW5xdWlyeShzZGV2LCBoKTsKLQotCWlmIChlcnIgIT0gU0NTSV9ESF9PSykKLQkJcmV0dXJuIGVycjsKLQotCS8qIENoZWNrIFRQR1Mgc2V0dGluZyAqLwotCWgtPnRwZ3MgPSAoaC0+aW5xWzVdID4+IDQpICYgMHgzOworCWgtPnRwZ3MgPSBzY3NpX2RldmljZV90cGdzKHNkZXYpOwogCXN3aXRjaCAoaC0+dHBncykgewogCWNhc2UgVFBHU19NT0RFX0VYUExJQ0lUfFRQR1NfTU9ERV9JTVBMSUNJVDoKIAkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LApAQCAtNTA4LDI3ICs0NjYsMjggQEAKIAkJCSAqIFBvd2VyIE9uLCBSZXNldCwgb3IgQnVzIERldmljZSBSZXNldCwganVzdCByZXRyeS4KIAkJCSAqLwogCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwotCQlpZiAoc2Vuc2VfaGRyLT5hc2MgPT0gMHgyYSAmJiBzZW5zZV9oZHItPmFzY3EgPT0gMHgwNikgeworCQlpZiAoc2Vuc2VfaGRyLT5hc2MgPT0gMHgyYSAmJiBzZW5zZV9oZHItPmFzY3EgPT0gMHgwNikKIAkJCS8qCiAJCQkgKiBBTFVBIHN0YXRlIGNoYW5nZWQKIAkJCSAqLwogCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwotCQl9Ci0JCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDJhICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDA3KSB7CisJCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDJhICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDA3KQogCQkJLyoKIAkJCSAqIEltcGxpY2l0IEFMVUEgc3RhdGUgdHJhbnNpdGlvbiBmYWlsZWQKIAkJCSAqLwogCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwotCQl9Ci0JCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDNmICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDBlKSB7CisJCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDNmICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDAzKQorCQkJLyoKKwkJCSAqIElucXVpcnkgZGF0YSBoYXMgY2hhbmdlZAorCQkJICovCisJCQlyZXR1cm4gQUREX1RPX01MUVVFVUU7CisJCWlmIChzZW5zZV9oZHItPmFzYyA9PSAweDNmICYmIHNlbnNlX2hkci0+YXNjcSA9PSAweDBlKQogCQkJLyoKIAkJCSAqIFJFUE9SVEVEX0xVTlNfREFUQV9IQVNfQ0hBTkdFRCBpcyByZXBvcnRlZAogCQkJICogd2hlbiBzd2l0Y2hpbmcgY29udHJvbGxlcnMgb24gdGFyZ2V0cyBsaWtlCiAJCQkgKiBJbnRlbCBNdWx0aS1GbGV4LiBXZSBjYW4ganVzdCByZXRyeS4KIAkJCSAqLwogCQkJcmV0dXJuIEFERF9UT19NTFFVRVVFOwotCQl9Ci0KIAkJYnJlYWs7CiAJfQogCkBAIC01NDcsOSArNTA2LDkgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc2Vuc2VfaGRyOwogCWludCBsZW4sIGssIG9mZiwgdmFsaWRfc3RhdGVzID0gMDsKLQljaGFyICp1Y3A7CisJdW5zaWduZWQgY2hhciAqdWNwOwogCXVuc2lnbmVkIGVycjsKLQl1bnNpZ25lZCBsb25nIGV4cGlyeSwgaW50ZXJ2YWwgPSAxMDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyeSwgaW50ZXJ2YWwgPSAxMDAwOwogCiAJZXhwaXJ5ID0gcm91bmRfamlmZmllc191cChqaWZmaWVzICsgQUxVQV9GQUlMT1ZFUl9USU1FT1VUKTsKICByZXRyeToKQEAgLTYxMCw3ICs1NjksNyBAQAogCWNhc2UgVFBHU19TVEFURV9UUkFOU0lUSU9OSU5HOgogCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJ5KSkgewogCQkJLyogU3RhdGUgdHJhbnNpdGlvbiwgcmV0cnkgKi8KLQkJCWludGVydmFsICo9IDEwOworCQkJaW50ZXJ2YWwgKj0gMjsKIAkJCW1zbGVlcChpbnRlcnZhbCk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CkBAIC02NDIsNyArNjAxLDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gYWx1YV9zdGRfaW5xdWlyeShzZGV2LCBoKTsKKwllcnIgPSBhbHVhX2NoZWNrX3RwZ3Moc2RldiwgaCk7CiAJaWYgKGVyciAhPSBTQ1NJX0RIX09LKQogCQlnb3RvIG91dDsKIApAQCAtNjc0LDExICs2MzMsOSBAQAogCXN0cnVjdCBhbHVhX2RoX2RhdGEgKmggPSBnZXRfYWx1YV9kYXRhKHNkZXYpOwogCWludCBlcnIgPSBTQ1NJX0RIX09LOwogCi0JaWYgKGgtPmdyb3VwX2lkICE9IC0xKSB7Ci0JCWVyciA9IGFsdWFfcnRwZyhzZGV2LCBoKTsKLQkJaWYgKGVyciAhPSBTQ1NJX0RIX09LKQotCQkJZ290byBvdXQ7Ci0JfQorCWVyciA9IGFsdWFfcnRwZyhzZGV2LCBoKTsKKwlpZiAoZXJyICE9IFNDU0lfREhfT0spCisJCWdvdG8gb3V0OwogCiAJaWYgKGgtPnRwZ3MgJiBUUEdTX01PREVfRVhQTElDSVQgJiYKIAkgICAgaC0+c3RhdGUgIT0gVFBHU19TVEFURV9PUFRJTUlaRUQgJiYKQEAgLTcyMCwyMyArNjc3LDEwIEBACiAKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzY3NpX2RoX2Rldmxpc3QgYWx1YV9kZXZfbGlzdFtdID0gewotCXsiSFAiLCAiTVNBIFZPTFVNRSIgfSwKLQl7IkhQIiwgIkhTVjEwMSIgfSwKLQl7IkhQIiwgIkhTVjExMSIgfSwKLQl7IkhQIiwgIkhTVjIwMCIgfSwKLQl7IkhQIiwgIkhTVjIxMCIgfSwKLQl7IkhQIiwgIkhTVjMwMCIgfSwKLQl7IklCTSIsICIyMTA3OTAwIiB9LAotCXsiSUJNIiwgIjIxNDUiIH0sCi0JeyJQaWxsYXIiLCAiQXhpb20iIH0sCi0JeyJJbnRlbCIsICJNdWx0aS1GbGV4In0sCi0JeyJORVRBUFAiLCAiTFVOIn0sCi0JeyJORVRBUFAiLCAiTFVOIEMtTW9kZSJ9LAotCXsiQUlYIiwgIk5WRElTSyJ9LAotCXsiUHJvbWlzZSIsICJWVHJhayJ9LAotCXtOVUxMLCBOVUxMfQotfTsKK3N0YXRpYyBib29sIGFsdWFfbWF0Y2goc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJldHVybiAoc2NzaV9kZXZpY2VfdHBncyhzZGV2KSAhPSAwKTsKK30KIAogc3RhdGljIGludCBhbHVhX2J1c19hdHRhY2goc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKIHN0YXRpYyB2b2lkIGFsdWFfYnVzX2RldGFjaChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwpAQCAtNzQ0LDEyICs2ODgsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9kZXZpY2VfaGFuZGxlciBhbHVhX2RoID0gewogCS5uYW1lID0gQUxVQV9ESF9OQU1FLAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKLQkuZGV2bGlzdCA9IGFsdWFfZGV2X2xpc3QsCiAJLmF0dGFjaCA9IGFsdWFfYnVzX2F0dGFjaCwKIAkuZGV0YWNoID0gYWx1YV9idXNfZGV0YWNoLAogCS5wcmVwX2ZuID0gYWx1YV9wcmVwX2ZuLAogCS5jaGVja19zZW5zZSA9IGFsdWFfY2hlY2tfc2Vuc2UsCiAJLmFjdGl2YXRlID0gYWx1YV9hY3RpdmF0ZSwKKwkubWF0Y2ggPSBhbHVhX21hdGNoLAogfTsKIAogLyoKQEAgLTc5MSw2ICs3MzUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKHNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAlzZGV2LT5zY3NpX2RoX2RhdGEgPSBzY3NpX2RoX2RhdGE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZGV2LT5yZXF1ZXN0X3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJc2Rldl9wcmludGsoS0VSTl9OT1RJQ0UsIHNkZXYsICIlczogQXR0YWNoZWRcbiIsIEFMVUFfREhfTkFNRSk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfZW1jLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwppbmRleCA0ODQ0MWY2Li41OTExODZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9lbWMuYwpAQCAtMjEsNiArMjEsNyBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RoLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9ocF9zdy5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfaHBfc3cuYwppbmRleCBiNDc5ZjFlLi4wZjg2YTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9ocF9zdy5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2hwX3N3LmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwppbmRleCAyN2M5ZDY1Li4xZDMxMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEVuZ2VuaW8vTFNJIFJEQUMgU0NTSSBEZXZpY2UgSGFuZGxlcgorICogTFNJL0VuZ2VuaW8vTmV0QXBwIEUtU2VyaWVzIFJEQUMgU0NTSSBEZXZpY2UgSGFuZGxlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBNaWtlIENocmlzdGllLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSBDaGFuZHJhIFNlZXRoYXJhbWFuLCBJQk0gQ29ycC4gMjAwNwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9kaC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSREFDX05BTUUgInJkYWMiCiAjZGVmaW5lIFJEQUNfUkVUUllfQ09VTlQgNQpAQCAtNzk1LDYgKzc5Niw3IEBACiAJeyJJQk0iLCAiMzUyNiJ9LAogCXsiU0dJIiwgIlRQOTQwMCJ9LAogCXsiU0dJIiwgIlRQOTUwMCJ9LAorCXsiU0dJIiwgIlRQOTcwMCJ9LAogCXsiU0dJIiwgIklTIn0sCiAJeyJTVEsiLCAiT1BFTnN0b3JhZ2UgRDI4MCJ9LAogCXsiU1VOIiwgIkNTTTIwMF9SIn0sCkBAIC04MTQsNiArODE2LDcgQEAKIAl7IlNVTiIsICJDU00xMDBfUl9GQyJ9LAogCXsiU1VOIiwgIlNUSzY1ODBfNjc4MCJ9LAogCXsiU1VOIiwgIlNVTl82MTgwIn0sCisJeyJTVU4iLCAiQXJyYXlTdG9yYWdlIn0sCiAJe05VTEwsIE5VTEx9LAogfTsKIApAQCAtOTQ1LDcgKzk0OCw3IEBACiBtb2R1bGVfaW5pdChyZGFjX2luaXQpOwogbW9kdWxlX2V4aXQocmRhY19leGl0KTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJNdWx0aXBhdGggTFNJL0VuZ2VuaW8gUkRBQyBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTXVsdGlwYXRoIExTSS9FbmdlbmlvL05ldEFwcCBFLVNlcmllcyBSREFDIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWlrZSBDaHJpc3RpZSwgQ2hhbmRyYSBTZWV0aGFyYW1hbiIpOwogTU9EVUxFX1ZFUlNJT04oIjAxLjAwLjAwMDAuMDAwMCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCmluZGV4IGExYzBkZGQuLmNlZmJlNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKQEAgLTUxLDcgKzUxLDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIAogLyogUGVyZm9ybWFuY2UgdHVuaW5nIHBhcmFtZXRlcnMgZm9yIGZjb2UgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmNvZV9kZHBfbWluOworc3RhdGljIHVuc2lnbmVkIGludCBmY29lX2RkcF9taW4gPSA0MDk2OwogbW9kdWxlX3BhcmFtX25hbWVkKGRkcF9taW4sIGZjb2VfZGRwX21pbiwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZHBfbWluLCAiTWluaW11bSBJL08gc2l6ZSBpbiBieXRlcyBmb3IgIglcCiAJCSAiRGlyZWN0IERhdGEgUGxhY2VtZW50IChERFApLiIpOwpAQCAtMTM3LDcgKzEzNyw2IEBACiBzdGF0aWMgaW50IGZjb2VfdnBvcnRfZGlzYWJsZShzdHJ1Y3QgZmNfdnBvcnQgKiwgYm9vbCBkaXNhYmxlKTsKIHN0YXRpYyB2b2lkIGZjb2Vfc2V0X3Zwb3J0X3N5bWJvbGljX25hbWUoc3RydWN0IGZjX3Zwb3J0ICopOwogc3RhdGljIHZvaWQgZmNvZV9zZXRfcG9ydF9pZChzdHJ1Y3QgZmNfbHBvcnQgKiwgdTMyLCBzdHJ1Y3QgZmNfZnJhbWUgKik7Ci1zdGF0aWMgaW50IGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKHN0cnVjdCBmY192cG9ydCAqKTsKIAogc3RhdGljIHN0cnVjdCBsaWJmY19mdW5jdGlvbl90ZW1wbGF0ZSBmY29lX2xpYmZjX2Zjbl90ZW1wbCA9IHsKIAkuZnJhbWVfc2VuZCA9IGZjb2VfeG1pdCwKQEAgLTI4MCw2ICsyNzksNyBAQAogCSAqIHVzZSB0aGUgZmlyc3Qgb25lIGZvciBTUE1BICovCiAJcmVhbF9kZXYgPSAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKSA/CiAJCXZsYW5fZGV2X3JlYWxfZGV2KG5ldGRldikgOiBuZXRkZXY7CisJZmNvZS0+cmVhbGRldiA9IHJlYWxfZGV2OwogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3JfZWFjaF9kZXZfYWRkcihyZWFsX2RldiwgaGEpIHsKIAkJaWYgKChoYS0+dHlwZSA9PSBORVRERVZfSFdfQUREUl9UX1NBTikgJiYKQEAgLTU4MCwyMyArNTgwLDYgQEAKIH0KIAogLyoqCi0gKiBmY29lX2dldF93d24oKSAtIEdldCB0aGUgd29ybGQgd2lkZSBuYW1lIGZyb20gTExEIGlmIGl0IHN1cHBvcnRzIGl0Ci0gKiBAbmV0ZGV2OiB0aGUgYXNzb2NpYXRlZCBuZXQgZGV2aWNlCi0gKiBAd3duOiB0aGUgb3V0cHV0IFdXTgotICogQHR5cGU6IHRoZSB0eXBlIG9mIFdXTiAoV1dQTiBvciBXV05OKQotICoKLSAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKLSAqLwotc3RhdGljIGludCBmY29lX2dldF93d24oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTY0ICp3d24sIGludCB0eXBlKQotewotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gbmV0ZGV2LT5uZXRkZXZfb3BzOwotCi0JaWYgKG9wcy0+bmRvX2Zjb2VfZ2V0X3d3bikKLQkJcmV0dXJuIG9wcy0+bmRvX2Zjb2VfZ2V0X3d3bihuZXRkZXYsIHd3biwgdHlwZSk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qKgogICogZmNvZV9uZXRkZXZfZmVhdHVyZXNfY2hhbmdlIC0gVXBkYXRlcyB0aGUgbHBvcnQncyBvZmZsb2FkIGZsYWdzIGJhc2VkCiAgKiBvbiB0aGUgTExEIG5ldGRldidzIEZDb0UgZmVhdHVyZSBmbGFncwogICovCkBAIC0xMTM0LDggKzExMTcsOSBAQAogCiAJcCA9ICZwZXJfY3B1KGZjb2VfcGVyY3B1LCBjcHUpOwogCi0JdGhyZWFkID0ga3RocmVhZF9jcmVhdGUoZmNvZV9wZXJjcHVfcmVjZWl2ZV90aHJlYWQsCi0JCQkJKHZvaWQgKilwLCAiZmNvZXRocmVhZC8lZCIsIGNwdSk7CisJdGhyZWFkID0ga3RocmVhZF9jcmVhdGVfb25fbm9kZShmY29lX3BlcmNwdV9yZWNlaXZlX3RocmVhZCwKKwkJCQkJKHZvaWQgKilwLCBjcHVfdG9fbm9kZShjcHUpLAorCQkJCQkiZmNvZXRocmVhZC8lZCIsIGNwdSk7CiAKIAlpZiAobGlrZWx5KCFJU19FUlIodGhyZWFkKSkpIHsKIAkJa3RocmVhZF9iaW5kKHRocmVhZCwgY3B1KTsKQEAgLTE1MzgsNyArMTUyMiwxMyBAQAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+bWFjX2xlbiA9IGVsZW47CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0ZDT0UpOwotCXNrYi0+ZGV2ID0gZmNvZS0+bmV0ZGV2OworCWlmIChmY29lLT5uZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gJiYKKwkgICAgZmNvZS0+cmVhbGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fVFgpIHsKKwkJc2tiLT52bGFuX3RjaSA9IFZMQU5fVEFHX1BSRVNFTlQgfAorCQkJCXZsYW5fZGV2X3ZsYW5faWQoZmNvZS0+bmV0ZGV2KTsKKwkJc2tiLT5kZXYgPSBmY29lLT5yZWFsZGV2OworCX0gZWxzZQorCQlza2ItPmRldiA9IGZjb2UtPm5ldGRldjsKIAogCS8qIGZpbGwgdXAgbWFjIGFuZCBmY29lIGhlYWRlcnMgKi8KIAllaCA9IGV0aF9oZHIoc2tiKTsKQEAgLTIzNTcsMTQgKzIzNDcsMTEgQEAKIAkJZ290byBkb25lOwogCiAJbWFjID0gZnJfY2IoZnApLT5ncmFudGVkX21hYzsKLQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG1hYykpIHsKLQkJLyogcHJlLUZJUCAqLwotCQlpZiAoZmNvZV9jdGxyX3JlY3ZfZmxvZ2koZmlwLCBscG9ydCwgZnApKSB7Ci0JCQlmY19mcmFtZV9mcmVlKGZwKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlmY29lX3VwZGF0ZV9zcmNfbWFjKGxwb3J0LCBtYWMpOworCS8qIHByZS1GSVAgKi8KKwlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG1hYykpCisJCWZjb2VfY3Rscl9yZWN2X2Zsb2dpKGZpcCwgbHBvcnQsIGZwKTsKKwlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihtYWMpKQorCQlmY29lX3VwZGF0ZV9zcmNfbWFjKGxwb3J0LCBtYWMpOwogZG9uZToKIAlmY19scG9ydF9mbG9naV9yZXNwKHNlcSwgZnAsIGxwb3J0KTsKIH0KQEAgLTI0NDYsNyArMjQzMyw3IEBACiAKIAlyYyA9IGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKHZwb3J0KTsKIAlpZiAocmMpIHsKLQkJd3duX3RvX3N0cih2cG9ydC0+cG9ydF9uYW1lLCBidWYsIHNpemVvZihidWYpKTsKKwkJZmNvZV93d25fdG9fc3RyKHZwb3J0LT5wb3J0X25hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlwcmludGsoS0VSTl9FUlIgImZjb2U6IEZhaWxlZCB0byBjcmVhdGUgdnBvcnQsICIKIAkJCSJXV1BOICgweCVzKSBhbHJlYWR5IGV4aXN0c1xuIiwKIAkJCWJ1Zik7CkBAIC0yNTU1LDI4ICsyNTQyLDkgQEAKIHN0YXRpYyB2b2lkIGZjb2VfZ2V0X2xlc2Ioc3RydWN0IGZjX2xwb3J0ICpscG9ydCwKIAkJCSBzdHJ1Y3QgZmNfZWxzX2xlc2IgKmZjX2xlc2IpCiB7Ci0JdW5zaWduZWQgaW50IGNwdTsKLQl1MzIgbGZjLCB2bGZjLCBtZGFjOwotCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqZGV2c3Q7Ci0Jc3RydWN0IGZjb2VfZmNfZWxzX2xlc2IgKmxlc2I7Ci0Jc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IHRlbXA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2VfbmV0ZGV2KGxwb3J0KTsKIAotCWxmYyA9IDA7Ci0JdmxmYyA9IDA7Ci0JbWRhYyA9IDA7Ci0JbGVzYiA9IChzdHJ1Y3QgZmNvZV9mY19lbHNfbGVzYiAqKWZjX2xlc2I7Ci0JbWVtc2V0KGxlc2IsIDAsIHNpemVvZigqbGVzYikpOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZGV2c3QgPSBwZXJfY3B1X3B0cihscG9ydC0+ZGV2X3N0YXRzLCBjcHUpOwotCQlsZmMgKz0gZGV2c3QtPkxpbmtGYWlsdXJlQ291bnQ7Ci0JCXZsZmMgKz0gZGV2c3QtPlZMaW5rRmFpbHVyZUNvdW50OwotCQltZGFjICs9IGRldnN0LT5NaXNzRGlzY0FkdkNvdW50OwotCX0KLQlsZXNiLT5sZXNiX2xpbmtfZmFpbCA9IGh0b25sKGxmYyk7Ci0JbGVzYi0+bGVzYl92bGlua19mYWlsID0gaHRvbmwodmxmYyk7Ci0JbGVzYi0+bGVzYl9taXNzX2ZrYSA9IGh0b25sKG1kYWMpOwotCWxlc2ItPmxlc2JfZmNzX2Vycm9yID0gaHRvbmwoZGV2X2dldF9zdGF0cyhuZXRkZXYsICZ0ZW1wKS0+cnhfY3JjX2Vycm9ycyk7CisJX19mY29lX2dldF9sZXNiKGxwb3J0LCBmY19sZXNiLCBuZXRkZXYpOwogfQogCiAvKioKQEAgLTI2MDAsNDkgKzI1NjgsMyBAQAogCWlmIChmcCAmJiBmY19mcmFtZV9wYXlsb2FkX29wKGZwKSA9PSBFTFNfRkxPR0kpCiAJCWZjb2VfY3Rscl9yZWN2X2Zsb2dpKCZmY29lLT5jdGxyLCBscG9ydCwgZnApOwogfQotCi0vKioKLSAqIGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKCkgLSBWYWxpZGF0ZSBhIHZwb3J0IGJlZm9yZSBjcmVhdGluZyBpdAotICogQHZwb3J0OiBOUElWIHBvcnQgdG8gYmUgY3JlYXRlZAotICoKLSAqIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBhZGQgdmFsaWRhdGlvbiBmb3IgYSB2cG9ydCBiZWZvcmUgY3JlYXRpbmcgaXQKLSAqIHZpYSBmY29lX3Zwb3J0X2NyZWF0ZSgpLgotICogQ3VycmVudCB2YWxpZGF0aW9ucyBhcmU6Ci0gKiAgICAgIC0gV1dQTiBzdXBwbGllZCBpcyB1bmlxdWUgZm9yIGdpdmVuIGxwb3J0Ci0gKgotICoKLSovCi1zdGF0aWMgaW50IGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKHN0cnVjdCBmY192cG9ydCAqdnBvcnQpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB2cG9ydF90b19zaG9zdCh2cG9ydCk7Ci0Jc3RydWN0IGZjX2xwb3J0ICpuX3BvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQ7Ci0JaW50IHJjID0gMDsKLQljaGFyIGJ1ZlszMl07Ci0KLQltdXRleF9sb2NrKCZuX3BvcnQtPmxwX211dGV4KTsKLQotCXd3bl90b19zdHIodnBvcnQtPnBvcnRfbmFtZSwgYnVmLCBzaXplb2YoYnVmKSk7Ci0JLyogQ2hlY2sgaWYgdGhlIHd3cG4gaXMgbm90IHNhbWUgYXMgdGhhdCBvZiB0aGUgbHBvcnQgKi8KLQlpZiAoIW1lbWNtcCgmbl9wb3J0LT53d3BuLCAmdnBvcnQtPnBvcnRfbmFtZSwgc2l6ZW9mKHU2NCkpKSB7Ci0JCUZDT0VfREJHKCJ2cG9ydCBXV1BOIDB4JXMgaXMgc2FtZSBhcyB0aGF0IG9mIHRoZSAiCi0JCQkiYmFzZSBwb3J0IFdXUE5cbiIsIGJ1Zik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGV4aXN0aW5nIHZwb3J0IHdpdGggc2FtZSB3d3BuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2bl9wb3J0LCAmbl9wb3J0LT52cG9ydHMsIGxpc3QpIHsKLQkJaWYgKCFtZW1jbXAoJnZuX3BvcnQtPnd3cG4sICZ2cG9ydC0+cG9ydF9uYW1lLCBzaXplb2YodTY0KSkpIHsKLQkJCUZDT0VfREJHKCJ2cG9ydCB3aXRoIGdpdmVuIFdXUE4gMHglcyBhbHJlYWR5ICIKLQkJCSJleGlzdHNcbiIsIGJ1Zik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotb3V0OgotCW11dGV4X3VubG9jaygmbl9wb3J0LT5scF9tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmggYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmgKaW5kZXggYzRhOTM5OS4uNmM2ODg0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuaApAQCAtODAsNiArODAsNyBAQAogc3RydWN0IGZjb2VfaW50ZXJmYWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgbGlzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnJlYWxkZXY7CiAJc3RydWN0IHBhY2tldF90eXBlIGZjb2VfcGFja2V0X3R5cGU7CiAJc3RydWN0IHBhY2tldF90eXBlIGZpcF9wYWNrZXRfdHlwZTsKIAlzdHJ1Y3QgZmNvZV9jdGxyICAgY3RscjsKQEAgLTk5LDE0ICsxMDAsNCBAQAogCQkJKChzdHJ1Y3QgZmNvZV9wb3J0ICopbHBvcnRfcHJpdihscG9ydCkpLT5wcml2KS0+bmV0ZGV2OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd3duX3RvX3N0cih1NjQgd3duLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JdTggd3dwbls4XTsKLQotCXU2NF90b193d24od3duLCB3d3BuKTsKLQlzbnByaW50ZihidWYsIGxlbiwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLQkJd3dwblswXSwgd3dwblsxXSwgd3dwblsyXSwgd3dwblszXSwKLQkJd3dwbls0XSwgd3dwbls1XSwgd3dwbls2XSwgd3dwbls3XSk7Ci19Ci0KICNlbmRpZiAvKiBfRkNPRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2VfdHJhbnNwb3J0LmMKaW5kZXggZGFjOGUzOS4uYmQ5N2IyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3RyYW5zcG9ydC5jCkBAIC04Myw2ICs4MywxMDcgQEAKIAkubm90aWZpZXJfY2FsbCA9IGxpYmZjb2VfZGV2aWNlX25vdGlmaWNhdGlvbiwKIH07CiAKK3ZvaWQgX19mY29lX2dldF9sZXNiKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsCisJCSAgICAgc3RydWN0IGZjX2Vsc19sZXNiICpmY19sZXNiLAorCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwl1MzIgbGZjLCB2bGZjLCBtZGFjOworCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqZGV2c3Q7CisJc3RydWN0IGZjb2VfZmNfZWxzX2xlc2IgKmxlc2I7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IHRlbXA7CisKKwlsZmMgPSAwOworCXZsZmMgPSAwOworCW1kYWMgPSAwOworCWxlc2IgPSAoc3RydWN0IGZjb2VfZmNfZWxzX2xlc2IgKilmY19sZXNiOworCW1lbXNldChsZXNiLCAwLCBzaXplb2YoKmxlc2IpKTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWRldnN0ID0gcGVyX2NwdV9wdHIobHBvcnQtPmRldl9zdGF0cywgY3B1KTsKKwkJbGZjICs9IGRldnN0LT5MaW5rRmFpbHVyZUNvdW50OworCQl2bGZjICs9IGRldnN0LT5WTGlua0ZhaWx1cmVDb3VudDsKKwkJbWRhYyArPSBkZXZzdC0+TWlzc0Rpc2NBZHZDb3VudDsKKwl9CisJbGVzYi0+bGVzYl9saW5rX2ZhaWwgPSBodG9ubChsZmMpOworCWxlc2ItPmxlc2JfdmxpbmtfZmFpbCA9IGh0b25sKHZsZmMpOworCWxlc2ItPmxlc2JfbWlzc19ma2EgPSBodG9ubChtZGFjKTsKKwlsZXNiLT5sZXNiX2Zjc19lcnJvciA9CisJCQlodG9ubChkZXZfZ2V0X3N0YXRzKG5ldGRldiwgJnRlbXApLT5yeF9jcmNfZXJyb3JzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZmNvZV9nZXRfbGVzYik7CisKK3ZvaWQgZmNvZV93d25fdG9fc3RyKHU2NCB3d24sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1OCB3d3BuWzhdOworCisJdTY0X3RvX3d3bih3d24sIHd3cG4pOworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkgd3dwblswXSwgd3dwblsxXSwgd3dwblsyXSwgd3dwblszXSwKKwkJIHd3cG5bNF0sIHd3cG5bNV0sIHd3cG5bNl0sIHd3cG5bN10pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmNvZV93d25fdG9fc3RyKTsKKworLyoqCisgKiBmY29lX3ZhbGlkYXRlX3Zwb3J0X2NyZWF0ZSgpIC0gVmFsaWRhdGUgYSB2cG9ydCBiZWZvcmUgY3JlYXRpbmcgaXQKKyAqIEB2cG9ydDogTlBJViBwb3J0IHRvIGJlIGNyZWF0ZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbWVhbnQgdG8gYWRkIHZhbGlkYXRpb24gZm9yIGEgdnBvcnQgYmVmb3JlIGNyZWF0aW5nIGl0CisgKiB2aWEgZmNvZV92cG9ydF9jcmVhdGUoKS4KKyAqIEN1cnJlbnQgdmFsaWRhdGlvbnMgYXJlOgorICogICAgICAtIFdXUE4gc3VwcGxpZWQgaXMgdW5pcXVlIGZvciBnaXZlbiBscG9ydAorICovCitpbnQgZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOworCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKKwlpbnQgcmMgPSAwOworCWNoYXIgYnVmWzMyXTsKKworCW11dGV4X2xvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOworCisJZmNvZV93d25fdG9fc3RyKHZwb3J0LT5wb3J0X25hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCS8qIENoZWNrIGlmIHRoZSB3d3BuIGlzIG5vdCBzYW1lIGFzIHRoYXQgb2YgdGhlIGxwb3J0ICovCisJaWYgKCFtZW1jbXAoJm5fcG9ydC0+d3dwbiwgJnZwb3J0LT5wb3J0X25hbWUsIHNpemVvZih1NjQpKSkgeworCQlMSUJGQ09FX1RSQU5TUE9SVF9EQkcoInZwb3J0IFdXUE4gMHglcyBpcyBzYW1lIGFzIHRoYXQgb2YgdGhlICIKKwkJCQkgICAgICAiYmFzZSBwb3J0IFdXUE5cbiIsIGJ1Zik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGV4aXN0aW5nIHZwb3J0IHdpdGggc2FtZSB3d3BuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bl9wb3J0LCAmbl9wb3J0LT52cG9ydHMsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJnZuX3BvcnQtPnd3cG4sICZ2cG9ydC0+cG9ydF9uYW1lLCBzaXplb2YodTY0KSkpIHsKKwkJCUxJQkZDT0VfVFJBTlNQT1JUX0RCRygidnBvcnQgd2l0aCBnaXZlbiBXV1BOIDB4JXMgIgorCQkJCQkgICAgICAiYWxyZWFkeSBleGlzdHNcbiIsIGJ1Zik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KK291dDoKKwltdXRleF91bmxvY2soJm5fcG9ydC0+bHBfbXV0ZXgpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZjb2VfdmFsaWRhdGVfdnBvcnRfY3JlYXRlKTsKKworLyoqCisgKiBmY29lX2dldF93d24oKSAtIEdldCB0aGUgd29ybGQgd2lkZSBuYW1lIGZyb20gTExEIGlmIGl0IHN1cHBvcnRzIGl0CisgKiBAbmV0ZGV2OiB0aGUgYXNzb2NpYXRlZCBuZXQgZGV2aWNlCisgKiBAd3duOiB0aGUgb3V0cHV0IFdXTgorICogQHR5cGU6IHRoZSB0eXBlIG9mIFdXTiAoV1dQTiBvciBXV05OKQorICoKKyAqIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqLworaW50IGZjb2VfZ2V0X3d3bihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1NjQgKnd3biwgaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBuZXRkZXYtPm5ldGRldl9vcHM7CisKKwlpZiAob3BzLT5uZG9fZmNvZV9nZXRfd3duKQorCQlyZXR1cm4gb3BzLT5uZG9fZmNvZV9nZXRfd3duKG5ldGRldiwgd3duLCB0eXBlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZjb2VfZ2V0X3d3bik7CisKIC8qKgogICogZmNvZV9mY19jcmMoKSAtIENhbGN1bGF0ZXMgdGhlIENSQyBmb3IgYSBnaXZlbiBmcmFtZQogICogQGZwOiBUaGUgZnJhbWUgdG8gYmUgY2hlY2tzdW1lZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2d2cDExLmMgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwppbmRleCA1MGJiNTQxLi40ODhmYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ3ZwMTEuYworKysgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCA0ZjdhNTgyLi4zNTFkYzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMjg2LDYgKzI4Niw3IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAogCXNjc2lfcHJvY19ob3N0ZGlyX3JtKHNob3N0LT5ob3N0dCk7CiAKQEAgLTI5Myw5ICsyOTQsMTEgQEAKIAkJa3RocmVhZF9zdG9wKHNob3N0LT5laGFuZGxlcik7CiAJaWYgKHNob3N0LT53b3JrX3EpCiAJCWRlc3Ryb3lfd29ya3F1ZXVlKHNob3N0LT53b3JrX3EpOwotCWlmIChzaG9zdC0+dXNwYWNlX3JlcV9xKSB7Ci0JCWtmcmVlKHNob3N0LT51c3BhY2VfcmVxX3EtPnF1ZXVlZGF0YSk7Ci0JCXNjc2lfZnJlZV9xdWV1ZShzaG9zdC0+dXNwYWNlX3JlcV9xKTsKKwlxID0gc2hvc3QtPnVzcGFjZV9yZXFfcTsKKwlpZiAocSkgeworCQlrZnJlZShxLT5xdWV1ZWRhdGEpOworCQlxLT5xdWV1ZWRhdGEgPSBOVUxMOworCQlzY3NpX2ZyZWVfcXVldWUocSk7CiAJfQogCiAJc2NzaV9kZXN0cm95X2NvbW1hbmRfZnJlZWxpc3Qoc2hvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuYyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKaW5kZXggYjIwMGI3My4uZTc2MTA3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuYworKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlICJocHNhX2NtZC5oIgogI2luY2x1ZGUgImhwc2EuaCIKIApAQCAtMTI3LDYgKzEyOCwxMCBAQAogCiBzdGF0aWMgaW50IG51bWJlcl9vZl9jb250cm9sbGVyczsKIAorc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHBzYV9jdGxyX2xpc3QgPSBMSVNUX0hFQURfSU5JVChocHNhX2N0bHJfbGlzdCk7CitzdGF0aWMgc3BpbmxvY2tfdCBsb2NrdXBfZGV0ZWN0b3JfbG9jazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmhwc2FfbG9ja3VwX2RldGVjdG9yOworCiBzdGF0aWMgaXJxcmV0dXJuX3QgZG9faHBzYV9pbnRyX2ludHgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBkb19ocHNhX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaW50IGhwc2FfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgKmFyZyk7CkBAIC00ODQsNiArNDg5LDcgQEAKICNlbmRpZgogCS5zZGV2X2F0dHJzID0gaHBzYV9zZGV2X2F0dHJzLAogCS5zaG9zdF9hdHRycyA9IGhwc2Ffc2hvc3RfYXR0cnMsCisJLm1heF9zZWN0b3JzID0gODE5MiwKIH07CiAKIApAQCAtNTY2LDE2ICs1NzIsMTYgQEAKIAkgKiBhc3N1bWVzIGgtPmRldmxvY2sgaXMgaGVsZAogCSAqLwogCWludCBpLCBmb3VuZCA9IDA7Ci0JREVDTEFSRV9CSVRNQVAobHVuX3Rha2VuLCBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSk7CisJREVDTEFSRV9CSVRNQVAobHVuX3Rha2VuLCBIUFNBX01BWF9ERVZJQ0VTKTsKIAotCW1lbXNldCgmbHVuX3Rha2VuWzBdLCAwLCBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSA+PiAzKTsKKwltZW1zZXQoJmx1bl90YWtlblswXSwgMCwgSFBTQV9NQVhfREVWSUNFUyA+PiAzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBoLT5uZGV2aWNlczsgaSsrKSB7CiAJCWlmIChoLT5kZXZbaV0tPmJ1cyA9PSBidXMgJiYgaC0+ZGV2W2ldLT50YXJnZXQgIT0gLTEpCiAJCQlzZXRfYml0KGgtPmRldltpXS0+dGFyZ2V0LCBsdW5fdGFrZW4pOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEhQU0FfTUFYX0RFVklDRVM7IGkrKykgewogCQlpZiAoIXRlc3RfYml0KGksIGx1bl90YWtlbikpIHsKIAkJCS8qICpidXMgPSAxOyAqLwogCQkJKnRhcmdldCA9IGk7CkBAIC01OTgsNyArNjA0LDcgQEAKIAl1bnNpZ25lZCBjaGFyIGFkZHIxWzhdLCBhZGRyMls4XTsKIAlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpzZDsKIAotCWlmIChuID49IEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBKSB7CisJaWYgKG4gPj0gSFBTQV9NQVhfREVWSUNFUykgewogCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJ0b28gbWFueSBkZXZpY2VzLCBzb21lIHdpbGwgYmUgIgogCQkJImluYWNjZXNzaWJsZS5cbiIpOwogCQlyZXR1cm4gLTE7CkBAIC02NzMsNyArNjc5LDcgQEAKIAlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpyZW1vdmVkW10sIGludCAqbnJlbW92ZWQpCiB7CiAJLyogYXNzdW1lcyBoLT5kZXZsb2NrIGlzIGhlbGQgKi8KLQlCVUdfT04oZW50cnkgPCAwIHx8IGVudHJ5ID49IEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBKTsKKwlCVUdfT04oZW50cnkgPCAwIHx8IGVudHJ5ID49IEhQU0FfTUFYX0RFVklDRVMpOwogCXJlbW92ZWRbKm5yZW1vdmVkXSA9IGgtPmRldltlbnRyeV07CiAJKCpucmVtb3ZlZCkrKzsKIApAQCAtNzAyLDcgKzcwOCw3IEBACiAJaW50IGk7CiAJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqc2Q7CiAKLQlCVUdfT04oZW50cnkgPCAwIHx8IGVudHJ5ID49IEhQU0FfTUFYX1NDU0lfREVWU19QRVJfSEJBKTsKKwlCVUdfT04oZW50cnkgPCAwIHx8IGVudHJ5ID49IEhQU0FfTUFYX0RFVklDRVMpOwogCiAJc2QgPSBoLT5kZXZbZW50cnldOwogCXJlbW92ZWRbKm5yZW1vdmVkXSA9IGgtPmRldltlbnRyeV07CkBAIC04MTQsMTAgKzgyMCw4IEBACiAJaW50IG5hZGRlZCwgbnJlbW92ZWQ7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2ggPSBOVUxMOwogCi0JYWRkZWQgPSBremFsbG9jKHNpemVvZigqYWRkZWQpICogSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkEsCi0JCUdGUF9LRVJORUwpOwotCXJlbW92ZWQgPSBremFsbG9jKHNpemVvZigqcmVtb3ZlZCkgKiBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSwKLQkJR0ZQX0tFUk5FTCk7CisJYWRkZWQgPSBremFsbG9jKHNpemVvZigqYWRkZWQpICogSFBTQV9NQVhfREVWSUNFUywgR0ZQX0tFUk5FTCk7CisJcmVtb3ZlZCA9IGt6YWxsb2Moc2l6ZW9mKCpyZW1vdmVkKSAqIEhQU0FfTUFYX0RFVklDRVMsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFhZGRlZCB8fCAhcmVtb3ZlZCkgewogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeSBpbiAiCkBAIC0xMzM4LDYgKzEzNDIsMjIgQEAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKIH0KIAorc3RhdGljIHZvaWQgaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZV9pZl9ub19sb2NrdXAoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIElmIGNvbnRyb2xsZXIgbG9ja3VwIGRldGVjdGVkLCBmYWtlIGEgaGFyZHdhcmUgZXJyb3IuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoaC0+bG9ja3VwX2RldGVjdGVkKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCWMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID0gQ01EX0hBUkRXQVJFX0VSUjsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmUoaCwgYyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF93aXRoX3JldHJ5KHN0cnVjdCBjdGxyX2luZm8gKmgsCiAJc3RydWN0IENvbW1hbmRMaXN0ICpjLCBpbnQgZGF0YV9kaXJlY3Rpb24pCiB7CkBAIC0xNzM1LDcgKzE3NTUsNiBAQAogCWlmIChpc19zY3NpX3Jldl81KGgpKQogCQlyZXR1cm4gMDsgLyogcDEyMTBtIGRvZXNuJ3QgbmVlZCB0byBkbyB0aGlzLiAqLwogCi0jZGVmaW5lIE1BWF9NU0EyWFhYX0VOQ0xPU1VSRVMgMzIKIAlpZiAoKm5tc2EyeHh4X2VuY2xvc3VyZXMgPj0gTUFYX01TQTJYWFhfRU5DTE9TVVJFUykgewogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiTWF4aW11bSBudW1iZXIgb2YgTVNBMlhYWCAiCiAJCQkiZW5jbG9zdXJlcyBleGNlZWRlZC4gIENoZWNrIHlvdXIgaGFyZHdhcmUgIgpAQCAtMTg0Niw4ICsxODY1LDcgQEAKIAlpbnQgcmFpZF9jdGxyX3Bvc2l0aW9uOwogCURFQ0xBUkVfQklUTUFQKGx1bnplcm9iaXRzLCBIUFNBX01BWF9UQVJHRVRTX1BFUl9DVExSKTsKIAotCWN1cnJlbnRzZCA9IGt6YWxsb2Moc2l6ZW9mKCpjdXJyZW50c2QpICogSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkEsCi0JCUdGUF9LRVJORUwpOworCWN1cnJlbnRzZCA9IGt6YWxsb2Moc2l6ZW9mKCpjdXJyZW50c2QpICogSFBTQV9NQVhfREVWSUNFUywgR0ZQX0tFUk5FTCk7CiAJcGh5c2Rldl9saXN0ID0ga3phbGxvYyhyZXBvcnRsdW5zaXplLCBHRlBfS0VSTkVMKTsKIAlsb2dkZXZfbGlzdCA9IGt6YWxsb2MocmVwb3J0bHVuc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJdG1wZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKnRtcGRldmljZSksIEdGUF9LRVJORUwpOwpAQCAtMTg3MCw2ICsxODg4LDEzIEBACiAKIAkvKiBBbGxvY2F0ZSB0aGUgcGVyIGRldmljZSBzdHJ1Y3R1cmVzICovCiAJZm9yIChpID0gMDsgaSA8IG5kZXZzX3RvX2FsbG9jYXRlOyBpKyspIHsKKwkJaWYgKGkgPj0gSFBTQV9NQVhfREVWSUNFUykgeworCQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgIm1heGltdW0gZGV2aWNlcyAoJWQpIGV4Y2VlZGVkLiIKKwkJCQkiICAlZCBkZXZpY2VzIGlnbm9yZWQuXG4iLCBIUFNBX01BWF9ERVZJQ0VTLAorCQkJCW5kZXZzX3RvX2FsbG9jYXRlIC0gSFBTQV9NQVhfREVWSUNFUyk7CisJCQlicmVhazsKKwkJfQorCiAJCWN1cnJlbnRzZFtpXSA9IGt6YWxsb2Moc2l6ZW9mKCpjdXJyZW50c2RbaV0pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjdXJyZW50c2RbaV0pIHsKIAkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGF0ICVzOiVkXG4iLApAQCAtMTk1Niw3ICsxOTgxLDcgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChuY3VycmVudCA+PSBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSkKKwkJaWYgKG5jdXJyZW50ID49IEhQU0FfTUFYX0RFVklDRVMpCiAJCQlicmVhazsKIAl9CiAJYWRqdXN0X2hwc2Ffc2NzaV90YWJsZShoLCBob3N0bm8sIGN1cnJlbnRzZCwgbmN1cnJlbnQpOwpAQCAtMjA0OCw4ICsyMDczLDE0IEBACiAJfQogCW1lbWNweShzY3NpM2FkZHIsIGRldi0+c2NzaTNhZGRyLCBzaXplb2Yoc2NzaTNhZGRyKSk7CiAKLQkvKiBOZWVkIGEgbG9jayBhcyB0aGlzIGlzIGJlaW5nIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoaC0+bG9ja3VwX2RldGVjdGVkKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlkb25lKGNtZCk7CisJCXJldHVybiAwOworCX0KKwkvKiBOZWVkIGEgbG9jayBhcyB0aGlzIGlzIGJlaW5nIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sICovCiAJYyA9IGNtZF9hbGxvYyhoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CiAJaWYgKGMgPT0gTlVMTCkgewkJCS8qIHRyb3VibGUuLi4gKi8KQEAgLTI2MDEsNyArMjYzMiw3IEBACiAJCWMtPlNHWzBdLkxlbiA9IGlvY29tbWFuZC5idWZfc2l6ZTsKIAkJYy0+U0dbMF0uRXh0ID0gMDsgLyogd2UgYXJlIG5vdCBjaGFpbmluZyovCiAJfQotCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmUoaCwgYyk7CisJaHBzYV9zY3NpX2RvX3NpbXBsZV9jbWRfY29yZV9pZl9ub19sb2NrdXAoaCwgYyk7CiAJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApCiAJCWhwc2FfcGNpX3VubWFwKGgtPnBkZXYsIGMsIDEsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJY2hlY2tfaW9jdGxfdW5pdF9hdHRlbnRpb24oaCwgYyk7CkBAIC0yNzI0LDcgKzI3NTUsNyBAQAogCQkJYy0+U0dbaV0uRXh0ID0gMDsKIAkJfQogCX0KLQlocHNhX3Njc2lfZG9fc2ltcGxlX2NtZF9jb3JlKGgsIGMpOworCWhwc2Ffc2NzaV9kb19zaW1wbGVfY21kX2NvcmVfaWZfbm9fbG9ja3VwKGgsIGMpOwogCWlmIChzZ191c2VkKQogCQlocHNhX3BjaV91bm1hcChoLT5wZGV2LCBjLCBzZ191c2VkLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWNoZWNrX2lvY3RsX3VuaXRfYXR0ZW50aW9uKGgsIGMpOwpAQCAtMjg3Miw2ICsyOTAzLDggQEAKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEJNSUNfV1JJVEU7CiAJCQljLT5SZXF1ZXN0LkNEQls2XSA9IEJNSUNfQ0FDSEVfRkxVU0g7CisJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDgpICYgMHhGRjsKKwkJCWMtPlJlcXVlc3QuQ0RCWzhdID0gc2l6ZSAmIDB4RkY7CiAJCQlicmVhazsKIAkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7CkBAIC0zMDkxLDYgKzMxMjQsNyBAQAogCWlmIChpbnRlcnJ1cHRfbm90X2Zvcl91cyhoKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJaC0+bGFzdF9pbnRyX3RpbWVzdGFtcCA9IGdldF9qaWZmaWVzXzY0KCk7CiAJd2hpbGUgKGludGVycnVwdF9wZW5kaW5nKGgpKSB7CiAJCXJhd190YWcgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpOwogCQl3aGlsZSAocmF3X3RhZyAhPSBGSUZPX0VNUFRZKQpAQCAtMzExMCw2ICszMTQ0LDcgQEAKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloLT5sYXN0X2ludHJfdGltZXN0YW1wID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAlyYXdfdGFnID0gZ2V0X25leHRfY29tcGxldGlvbihoKTsKIAl3aGlsZSAocmF3X3RhZyAhPSBGSUZPX0VNUFRZKQogCQlyYXdfdGFnID0gbmV4dF9jb21tYW5kKGgpOwpAQCAtMzEyNiw2ICszMTYxLDcgQEAKIAlpZiAoaW50ZXJydXB0X25vdF9mb3JfdXMoaCkpCiAJCXJldHVybiBJUlFfTk9ORTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWgtPmxhc3RfaW50cl90aW1lc3RhbXAgPSBnZXRfamlmZmllc182NCgpOwogCXdoaWxlIChpbnRlcnJ1cHRfcGVuZGluZyhoKSkgewogCQlyYXdfdGFnID0gZ2V0X25leHRfY29tcGxldGlvbihoKTsKIAkJd2hpbGUgKHJhd190YWcgIT0gRklGT19FTVBUWSkgewpAQCAtMzE0Niw2ICszMTgyLDcgQEAKIAl1MzIgcmF3X3RhZzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CisJaC0+bGFzdF9pbnRyX3RpbWVzdGFtcCA9IGdldF9qaWZmaWVzXzY0KCk7CiAJcmF3X3RhZyA9IGdldF9uZXh0X2NvbXBsZXRpb24oaCk7CiAJd2hpbGUgKHJhd190YWcgIT0gRklGT19FTVBUWSkgewogCQlpZiAoaHBzYV90YWdfY29udGFpbnNfaW5kZXgocmF3X3RhZykpCkBAIC0zMzAwLDYgKzMzMzcsMTMgQEAKIAkJcG1jc3IgJj0gflBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CiAJCXBtY3NyIHw9IFBDSV9EMDsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCBwbWNzcik7CisKKwkJLyoKKwkJICogVGhlIFA2MDAgcmVxdWlyZXMgYSBzbWFsbCBkZWxheSB3aGVuIGNoYW5naW5nIHN0YXRlcy4KKwkJICogT3RoZXJ3aXNlIHdlIG1heSB0aGluayB0aGUgYm9hcmQgZGlkIG5vdCByZXNldCBhbmQgd2UgYmFpbC4KKwkJICogVGhpcyBmb3Iga2R1bXAgb25seSBhbmQgaXMgcGFydGljdWxhciB0byB0aGUgUDYwMC4KKwkJICovCisJCW1zbGVlcCg1MDApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM0MzgsMTAgKzM0ODIsOCBAQAogCX0gZWxzZSB7CiAJCXVzZV9kb29yYmVsbCA9IG1pc2NfZndfc3VwcG9ydCAmIE1JU0NfRldfRE9PUkJFTExfUkVTRVQ7CiAJCWlmICh1c2VfZG9vcmJlbGwpIHsKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJDb250cm9sbGVyIGNsYWltcyB0aGF0ICIKLQkJCQkiJ0JpdCAyIGRvb3JiZWxsIHJlc2V0JyBpcyAiCi0JCQkJInN1cHBvcnRlZCwgYnV0IG5vdCAnYml0IDUgZG9vcmJlbGwgcmVzZXQnLiAgIgotCQkJCSJGaXJtd2FyZSB1cGRhdGUgaXMgcmVjb21tZW5kZWQuXG4iKTsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJTb2Z0IHJlc2V0IG5vdCBzdXBwb3J0ZWQuICIKKwkJCQkiRmlybXdhcmUgdXBkYXRlIGlzIHJlcXVpcmVkLlxuIik7CiAJCQlyYyA9IC1FTk9UU1VQUDsgLyogdHJ5IHNvZnQgcmVzZXQgKi8KIAkJCWdvdG8gdW5tYXBfY2ZndGFibGU7CiAJCX0KQEAgLTQwODUsNiArNDEyNywxNDkgQEAKIAlrZnJlZShoKTsKIH0KIAorc3RhdGljIHZvaWQgcmVtb3ZlX2N0bHJfZnJvbV9sb2NrdXBfZGV0ZWN0b3JfbGlzdChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWFzc2VydF9zcGluX2xvY2tlZCgmbG9ja3VwX2RldGVjdG9yX2xvY2spOworCWlmICghaHBzYV9sb2NrdXBfZGV0ZWN0b3IpCisJCXJldHVybjsKKwlpZiAoaC0+bG9ja3VwX2RldGVjdGVkKQorCQlyZXR1cm47IC8qIGFscmVhZHkgc3RvcHBlZCB0aGUgbG9ja3VwIGRldGVjdG9yICovCisJbGlzdF9kZWwoJmgtPmxvY2t1cF9saXN0KTsKK30KKworLyogQ2FsbGVkIHdoZW4gY29udHJvbGxlciBsb2NrdXAgZGV0ZWN0ZWQuICovCitzdGF0aWMgdm9pZCBmYWlsX2FsbF9jbWRzX29uX2xpc3Qoc3RydWN0IGN0bHJfaW5mbyAqaCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMgPSBOVUxMOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZoLT5sb2NrKTsKKwkvKiBNYXJrIGFsbCBvdXRzdGFuZGluZyBjb21tYW5kcyBhcyBmYWlsZWQgYW5kIGNvbXBsZXRlIHRoZW0uICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWMgPSBsaXN0X2VudHJ5KGxpc3QtPm5leHQsIHN0cnVjdCBDb21tYW5kTGlzdCwgbGlzdCk7CisJCWMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID0gQ01EX0hBUkRXQVJFX0VSUjsKKwkJZmluaXNoX2NtZChjLCBjLT5IZWFkZXIuVGFnLmxvd2VyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnRyb2xsZXJfbG9ja3VwX2RldGVjdGVkKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmbG9ja3VwX2RldGVjdG9yX2xvY2spOworCXJlbW92ZV9jdGxyX2Zyb21fbG9ja3VwX2RldGVjdG9yX2xpc3QoaCk7CisJaC0+YWNjZXNzLnNldF9pbnRyX21hc2soaCwgSFBTQV9JTlRSX09GRik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwloLT5sb2NrdXBfZGV0ZWN0ZWQgPSByZWFkbChoLT52YWRkciArIFNBNV9TQ1JBVENIUEFEX09GRlNFVCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJDb250cm9sbGVyIGxvY2t1cCBkZXRlY3RlZDogMHglMDh4XG4iLAorCQkJaC0+bG9ja3VwX2RldGVjdGVkKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoaC0+cGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKKwlmYWlsX2FsbF9jbWRzX29uX2xpc3QoaCwgJmgtPmNtcFEpOworCWZhaWxfYWxsX2NtZHNfb25fbGlzdChoLCAmaC0+cmVxUSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIEhFQVJUQkVBVF9TQU1QTEVfSU5URVJWQUwgKDEwICogSFopCisjZGVmaW5lIEhFQVJUQkVBVF9DSEVDS19NSU5JTVVNX0lOVEVSVkFMIChIRUFSVEJFQVRfU0FNUExFX0lOVEVSVkFMIC8gMikKKworc3RhdGljIHZvaWQgZGV0ZWN0X2NvbnRyb2xsZXJfbG9ja3VwKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdTY0IG5vdzsKKwl1MzIgaGVhcnRiZWF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrKTsKKwlub3cgPSBnZXRfamlmZmllc182NCgpOworCS8qIElmIHdlJ3ZlIHJlY2VpdmVkIGFuIGludGVycnVwdCByZWNlbnRseSwgd2UncmUgb2suICovCisJaWYgKHRpbWVfYWZ0ZXI2NChoLT5sYXN0X2ludHJfdGltZXN0YW1wICsKKwkJCQkoSEVBUlRCRUFUX0NIRUNLX01JTklNVU1fSU5URVJWQUwpLCBub3cpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCB0aGUgaGVhcnRiZWF0IHJlY2VudGx5LCB3ZSdyZSBvay4KKwkgKiBUaGlzIGNvdWxkIGhhcHBlbiBpZiBzb21lb25lIHNlbmRzIHVzIGEgc2lnbmFsLiBXZQorCSAqIG90aGVyd2lzZSBkb24ndCBjYXJlIGFib3V0IHNpZ25hbHMgaW4gdGhpcyB0aHJlYWQuCisJICovCisJaWYgKHRpbWVfYWZ0ZXI2NChoLT5sYXN0X2hlYXJ0YmVhdF90aW1lc3RhbXAgKworCQkJCShIRUFSVEJFQVRfQ0hFQ0tfTUlOSU1VTV9JTlRFUlZBTCksIG5vdykpCisJCXJldHVybjsKKworCS8qIElmIGhlYXJ0YmVhdCBoYXMgbm90IGNoYW5nZWQgc2luY2Ugd2UgbGFzdCBsb29rZWQsIHdlJ3JlIG5vdCBvay4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaC0+bG9jaywgZmxhZ3MpOworCWhlYXJ0YmVhdCA9IHJlYWRsKCZoLT5jZmd0YWJsZS0+SGVhcnRCZWF0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CisJaWYgKGgtPmxhc3RfaGVhcnRiZWF0ID09IGhlYXJ0YmVhdCkgeworCQljb250cm9sbGVyX2xvY2t1cF9kZXRlY3RlZChoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlJ3JlIG9rLiAqLworCWgtPmxhc3RfaGVhcnRiZWF0ID0gaGVhcnRiZWF0OworCWgtPmxhc3RfaGVhcnRiZWF0X3RpbWVzdGFtcCA9IG5vdzsKK30KKworc3RhdGljIGludCBkZXRlY3RfY29udHJvbGxlcl9sb2NrdXBfdGhyZWFkKHZvaWQgKm5vdHVzZWQpCit7CisJc3RydWN0IGN0bHJfaW5mbyAqaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpcywgKnRtcDsKKworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSEVBUlRCRUFUX1NBTVBMRV9JTlRFUlZBTCk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZSh0aGlzLCB0bXAsICZocHNhX2N0bHJfbGlzdCkgeworCQkJaCA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGN0bHJfaW5mbywgbG9ja3VwX2xpc3QpOworCQkJZGV0ZWN0X2NvbnRyb2xsZXJfbG9ja3VwKGgpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2t1cF9kZXRlY3Rvcl9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfY3Rscl90b19sb2NrdXBfZGV0ZWN0b3JfbGlzdChzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9ja3VwX2RldGVjdG9yX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZoLT5sb2NrdXBfbGlzdCwgJmhwc2FfY3Rscl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrdXBfZGV0ZWN0b3JfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9jb250cm9sbGVyX2xvY2t1cF9kZXRlY3RvcihzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCS8qIFN0YXJ0IHRoZSBsb2NrdXAgZGV0ZWN0b3IgdGhyZWFkIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwlpZiAoIWhwc2FfbG9ja3VwX2RldGVjdG9yKSB7CisJCXNwaW5fbG9ja19pbml0KCZsb2NrdXBfZGV0ZWN0b3JfbG9jayk7CisJCWhwc2FfbG9ja3VwX2RldGVjdG9yID0KKwkJCWt0aHJlYWRfcnVuKGRldGVjdF9jb250cm9sbGVyX2xvY2t1cF90aHJlYWQsCisJCQkJCQlOVUxMLCAiaHBzYSIpOworCX0KKwlpZiAoIWhwc2FfbG9ja3VwX2RldGVjdG9yKSB7CisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsCisJCQkiQ291bGQgbm90IHN0YXJ0IGxvY2t1cCBkZXRlY3RvciB0aHJlYWRcbiIpOworCQlyZXR1cm47CisJfQorCWFkZF9jdGxyX3RvX2xvY2t1cF9kZXRlY3Rvcl9saXN0KGgpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2NvbnRyb2xsZXJfbG9ja3VwX2RldGVjdG9yKHN0cnVjdCBjdGxyX2luZm8gKmgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrdXBfZGV0ZWN0b3JfbG9jaywgZmxhZ3MpOworCXJlbW92ZV9jdGxyX2Zyb21fbG9ja3VwX2RldGVjdG9yX2xpc3QoaCk7CisJLyogSWYgdGhlIGxpc3Qgb2YgY3RscidzIHRvIG1vbml0b3IgaXMgZW1wdHksIHN0b3AgdGhlIHRocmVhZCAqLworCWlmIChsaXN0X2VtcHR5KCZocHNhX2N0bHJfbGlzdCkpIHsKKwkJa3RocmVhZF9zdG9wKGhwc2FfbG9ja3VwX2RldGVjdG9yKTsKKwkJaHBzYV9sb2NrdXBfZGV0ZWN0b3IgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrdXBfZGV0ZWN0b3JfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocHNhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtNDEyMiw3ICs0MzA3LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAloLT5wZGV2ID0gcGRldjsKLQloLT5idXN5X2luaXRpYWxpemluZyA9IDE7CiAJaC0+aW50cl9tb2RlID0gaHBzYV9zaW1wbGVfbW9kZSA/IFNJTVBMRV9NT0RFX0lOVCA6IFBFUkZfTU9ERV9JTlQ7CiAJSU5JVF9MSVNUX0hFQUQoJmgtPmNtcFEpOwogCUlOSVRfTElTVF9IRUFEKCZoLT5yZXFRKTsKQEAgLTQyMzEsNyArNDQxNSw3IEBACiAKIAlocHNhX2hiYV9pbnF1aXJ5KGgpOwogCWhwc2FfcmVnaXN0ZXJfc2NzaShoKTsJLyogaG9vayBvdXJzZWx2ZXMgaW50byBTQ1NJIHN1YnN5c3RlbSAqLwotCWgtPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKKwlzdGFydF9jb250cm9sbGVyX2xvY2t1cF9kZXRlY3RvcihoKTsKIAlyZXR1cm4gMTsKIAogY2xlYW40OgpAQCAtNDI0MCw3ICs0NDI0LDYgQEAKIAlmcmVlX2lycShoLT5pbnRyW2gtPmludHJfbW9kZV0sIGgpOwogY2xlYW4yOgogY2xlYW4xOgotCWgtPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKIAlrZnJlZShoKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC00Mjk1LDEwICs0NDc4LDExIEBACiAJc3RydWN0IGN0bHJfaW5mbyAqaDsKIAogCWlmIChwY2lfZ2V0X2RydmRhdGEocGRldikgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVtb3ZlIGRldmljZSBcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVtb3ZlIGRldmljZVxuIik7CiAJCXJldHVybjsKIAl9CiAJaCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdG9wX2NvbnRyb2xsZXJfbG9ja3VwX2RldGVjdG9yKGgpOwogCWhwc2FfdW5yZWdpc3Rlcl9zY3NpKGgpOwkvKiB1bmhvb2sgZnJvbSBTQ1NJIHN1YnN5c3RlbSAqLwogCWhwc2Ffc2h1dGRvd24ocGRldik7CiAJaW91bm1hcChoLT52YWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYS5oIGIvZHJpdmVycy9zY3NpL2hwc2EuaAppbmRleCA3ZjUzY2VhYS4uOTFlZGFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC05NSw4ICs5NSw2IEBACiAJdW5zaWduZWQgbG9uZyAgCQkqY21kX3Bvb2xfYml0czsKIAlpbnQJCQlucl9hbGxvY3M7CiAJaW50CQkJbnJfZnJlZXM7Ci0JaW50CQkJYnVzeV9pbml0aWFsaXppbmc7Ci0JaW50CQkJYnVzeV9zY2FubmluZzsKIAlpbnQJCQlzY2FuX2ZpbmlzaGVkOwogCXNwaW5sb2NrX3QJCXNjYW5fbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlzY2FuX3dhaXRfcXVldWU7CkBAIC0xMDQsOCArMTAyLDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3Q7CiAJc3BpbmxvY2tfdCBkZXZsb2NrOyAvKiB0byBwcm90ZWN0IGhiYVtjdGxyXS0+ZGV2W107ICAqLwogCWludCBuZGV2aWNlczsgLyogbnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gLmRldltdIGFycmF5LiAqLwotI2RlZmluZSBIUFNBX01BWF9TQ1NJX0RFVlNfUEVSX0hCQSAyNTYKLQlzdHJ1Y3QgaHBzYV9zY3NpX2Rldl90ICpkZXZbSFBTQV9NQVhfU0NTSV9ERVZTX1BFUl9IQkFdOworCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldltIUFNBX01BWF9ERVZJQ0VTXTsKIAkvKgogCSAqIFBlcmZvcm1hbnQgbW9kZSB0YWJsZXMuCiAJICovCkBAIC0xMjQsNiArMTIxLDExIEBACiAJdW5zaWduZWQgY2hhciByZXBseV9wb29sX3dyYXBhcm91bmQ7CiAJdTMyICpibG9ja0ZldGNoVGFibGU7CiAJdW5zaWduZWQgY2hhciAqaGJhX2lucXVpcnlfZGF0YTsKKwl1NjQgbGFzdF9pbnRyX3RpbWVzdGFtcDsKKwl1MzIgbGFzdF9oZWFydGJlYXQ7CisJdTY0IGxhc3RfaGVhcnRiZWF0X3RpbWVzdGFtcDsKKwl1MzIgbG9ja3VwX2RldGVjdGVkOworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja3VwX2xpc3Q7CiB9OwogI2RlZmluZSBIUFNBX0FCT1JUX01TRyAwCiAjZGVmaW5lIEhQU0FfREVWSUNFX1JFU0VUX01TRyAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYV9jbWQuaCBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCmluZGV4IDU1ZDc0MWIuLjNmZDQ3MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCkBAIC0xMjMsOCArMTIzLDExIEBACiAKIC8qIEZJWE1FIHRoaXMgaXMgYSBwZXIgY29udHJvbGxlciB2YWx1ZSAoYmFyZiEpICovCiAjZGVmaW5lIEhQU0FfTUFYX1RBUkdFVFNfUEVSX0NUTFIgMTYKLSNkZWZpbmUgSFBTQV9NQVhfTFVOIDI1NgorI2RlZmluZSBIUFNBX01BWF9MVU4gMTAyNAogI2RlZmluZSBIUFNBX01BWF9QSFlTX0xVTiAxMDI0CisjZGVmaW5lIE1BWF9NU0EyWFhYX0VOQ0xPU1VSRVMgMzIKKyNkZWZpbmUgSFBTQV9NQVhfREVWSUNFUyAoSFBTQV9NQVhfUEhZU19MVU4gKyBIUFNBX01BWF9MVU4gKyBcCisJTUFYX01TQTJYWFhfRU5DTE9TVVJFUyArIDEpIC8qICsgMSBpcyBmb3IgdGhlIGNvbnRyb2xsZXIgaXRzZWxmICovCiAKIC8qIFNDU0ktMyBDb21tYW5kcyAqLwogI3ByYWdtYSBwYWNrKDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggOGQ2MzYzMC4uZmQ4NjBkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMjkwMSw3ICsyOTAxLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CiAKLQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlICE9IEdFVF9EVU1QKSB7CisJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSAhPSBSRUFEX0RVTVApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMzA5Nyw3ICszMDk3LDcgQEAKIAlFTlRFUjsKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwogCi0JaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBHRVRfRFVNUCkgeworCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gUkVBRF9EVU1QKSB7CiAJCWR1bXAgPSBpb2FfY2ZnLT5kdW1wOwogCQlpZiAoIWR1bXApIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKQEAgLTMxMDksNyArMzEwOSw3IEBACiAJCWtyZWZfcHV0KCZkdW1wLT5rcmVmLCBpcHJfcmVsZWFzZV9kdW1wKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwotCQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IERVTVBfT0JUQUlORUQpCisJCWlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gRFVNUF9PQlRBSU5FRCAmJiAhaW9hX2NmZy0+ZHVtcF90aW1lb3V0KQogCQkJaXByX2luaXRpYXRlX2lvYV9yZXNldChpb2FfY2ZnLCBJUFJfU0hVVERPV05fTk9ORSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAkJcmV0dXJuOwpAQCAtMzc1MSwxNCArMzc1MSw2IEBACiAKIAlpbWFnZV9oZHIgPSAoc3RydWN0IGlwcl91Y29kZV9pbWFnZV9oZWFkZXIgKilmd19lbnRyeS0+ZGF0YTsKIAotCWlmIChiZTMyX3RvX2NwdShpbWFnZV9oZHItPmhlYWRlcl9sZW5ndGgpID4gZndfZW50cnktPnNpemUgfHwKLQkgICAgKGlvYV9jZmctPnZwZF9jYnMtPnBhZ2UzX2RhdGEuY2FyZF90eXBlICYmCi0JICAgICBpb2FfY2ZnLT52cGRfY2JzLT5wYWdlM19kYXRhLmNhcmRfdHlwZSAhPSBpbWFnZV9oZHItPmNhcmRfdHlwZSkpIHsKLQkJZGV2X2VycigmaW9hX2NmZy0+cGRldi0+ZGV2LCAiSW52YWxpZCBtaWNyb2NvZGUgYnVmZmVyXG4iKTsKLQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXNyYyA9ICh1OCAqKWltYWdlX2hkciArIGJlMzJfdG9fY3B1KGltYWdlX2hkci0+aGVhZGVyX2xlbmd0aCk7CiAJZG5sZF9zaXplID0gZndfZW50cnktPnNpemUgLSBiZTMyX3RvX2NwdShpbWFnZV9oZHItPmhlYWRlcl9sZW5ndGgpOwogCXNnbGlzdCA9IGlwcl9hbGxvY191Y29kZV9idWZmZXIoZG5sZF9zaXplKTsKQEAgLTM3NzcsNiArMzc2OSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlwcl9pbmZvKCJVcGRhdGluZyBtaWNyb2NvZGUsIHBsZWFzZSBiZSBwYXRpZW50LiAgVGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzLlxuIik7CisKIAlyZXN1bHQgPSBpcHJfdXBkYXRlX2lvYV91Y29kZShpb2FfY2ZnLCBzZ2xpc3QpOwogCiAJaWYgKCFyZXN1bHQpCkBAIC03NDQ5LDggKzc0NDMsMTEgQEAKIAlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBpcHJfY21kLT5pb2FfY2ZnOwogCiAJaWYgKGlvYV9jZmctPnNkdF9zdGF0ZSA9PSBHRVRfRFVNUCkKKwkJaW9hX2NmZy0+c2R0X3N0YXRlID0gV0FJVF9GT1JfRFVNUDsKKwllbHNlIGlmIChpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gUkVBRF9EVU1QKQogCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBBQk9SVF9EVU1QOwogCisJaW9hX2NmZy0+ZHVtcF90aW1lb3V0ID0gMTsKIAlpcHJfY21kLT5qb2Jfc3RlcCA9IGlwcl9yZXNldF9hbGVydDsKIAogCXJldHVybiBJUFJfUkNfSk9CX0NPTlRJTlVFOwpAQCAtNzYxNCw2ICs3NjExLDggQEAKIAkJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfcmVzZXRfZW5hYmxlX2lvYTsKIAogCQlpZiAoR0VUX0RVTVAgPT0gaW9hX2NmZy0+c2R0X3N0YXRlKSB7CisJCQlpb2FfY2ZnLT5zZHRfc3RhdGUgPSBSRUFEX0RVTVA7CisJCQlpb2FfY2ZnLT5kdW1wX3RpbWVvdXQgPSAwOwogCQkJaWYgKGlvYV9jZmctPnNpczY0KQogCQkJCWlwcl9yZXNldF9zdGFydF90aW1lcihpcHJfY21kLCBJUFJfU0lTNjRfRFVNUF9USU1FT1VUKTsKIAkJCWVsc2UKQEAgLTgwMDMsOCArODAwMiwxMiBAQAogCWlmIChpb2FfY2ZnLT5pb2FfaXNfZGVhZCkKIAkJcmV0dXJuOwogCi0JaWYgKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCAmJiBpb2FfY2ZnLT5zZHRfc3RhdGUgPT0gR0VUX0RVTVApCi0JCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisJaWYgKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkgeworCQlpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IEdFVF9EVU1QKQorCQkJaW9hX2NmZy0+c2R0X3N0YXRlID0gV0FJVF9GT1JfRFVNUDsKKwkJZWxzZSBpZiAoaW9hX2NmZy0+c2R0X3N0YXRlID09IFJFQURfRFVNUCkKKwkJCWlvYV9jZmctPnNkdF9zdGF0ZSA9IEFCT1JUX0RVTVA7CisJfQogCiAJaWYgKGlvYV9jZmctPnJlc2V0X3JldHJpZXMrKyA+PSBJUFJfTlVNX1JFU0VUX1JFTE9BRF9SRVRSSUVTKSB7CiAJCWRldl9lcnIoJmlvYV9jZmctPnBkZXYtPmRldiwKQEAgLTg4MTIsNyArODgxNSw3IEBACiAJdXByb2MgPSByZWFkbChpb2FfY2ZnLT5yZWdzLnNlbnNlX3Vwcm9jX2ludGVycnVwdF9yZWczMik7CiAJaWYgKChtYXNrICYgSVBSX1BDSUlfSFJSUV9VUERBVEVEKSA9PSAwIHx8ICh1cHJvYyAmIElQUl9VUFJPQ0lfUkVTRVRfQUxFUlQpKQogCQlpb2FfY2ZnLT5uZWVkc19oYXJkX3Jlc2V0ID0gMTsKLQlpZiAoaW50ZXJydXB0cyAmIElQUl9QQ0lJX0VSUk9SX0lOVEVSUlVQVFMpCisJaWYgKChpbnRlcnJ1cHRzICYgSVBSX1BDSUlfRVJST1JfSU5URVJSVVBUUykgfHwgcmVzZXRfZGV2aWNlcykKIAkJaW9hX2NmZy0+bmVlZHNfaGFyZF9yZXNldCA9IDE7CiAJaWYgKGludGVycnVwdHMgJiBJUFJfUENJSV9JT0FfVU5JVF9DSEVDS0VEKQogCQlpb2FfY2ZnLT5pb2FfdW5pdF9jaGVja2VkID0gMTsKQEAgLTkxMjAsNiArOTEyMyw4IEBACiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ19GUEdBX0UyLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3QjIsIDAsIDAsIDAgfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DUk9DX0ZQR0FfRTIsCisJCVBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdDMywgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0NST0NfRlBHQV9FMiwKIAkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81N0M0LCAwLCAwLCAwIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fQ1JPQ19BU0lDX0UyLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3QjQsIDAsIDAsIDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuaCBiL2RyaXZlcnMvc2NzaS9pcHIuaAppbmRleCBmOTNmODYzLi5hYzg0NzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmgKKysrIGIvZHJpdmVycy9zY3NpL2lwci5oCkBAIC04Miw2ICs4Miw3IEBACiAKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QjQgICAgMHgwMzNCCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0IyICAgIDB4MDM1RgorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdDMyAgICAweDAzNTMKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QzQgICAgMHgwMzU0CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0M2ICAgIDB4MDM1NwogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTdDQyAgICAweDAzNUMKQEAgLTIwOCw3ICsyMDksNyBAQAogI2RlZmluZSBJUFJfQ0FOQ0VMX0FMTF9USU1FT1VUCQkoaXByX2Zhc3RmYWlsID8gMTAgKiBIWiA6IDMwICogSFopCiAjZGVmaW5lIElQUl9BQk9SVF9UQVNLX1RJTUVPVVQJCShpcHJfZmFzdGZhaWwgPyAxMCAqIEhaIDogMzAgKiBIWikKICNkZWZpbmUgSVBSX0lOVEVSTkFMX1RJTUVPVVQJCQkoaXByX2Zhc3RmYWlsID8gMTAgKiBIWiA6IDMwICogSFopCi0jZGVmaW5lIElQUl9XUklURV9CVUZGRVJfVElNRU9VVAkJKDEwICogNjAgKiBIWikKKyNkZWZpbmUgSVBSX1dSSVRFX0JVRkZFUl9USU1FT1VUCQkoMzAgKiA2MCAqIEhaKQogI2RlZmluZSBJUFJfU0VUX1NVUF9ERVZJQ0VfVElNRU9VVAkJKDIgKiA2MCAqIEhaKQogI2RlZmluZSBJUFJfUkVRVUVTVF9TRU5TRV9USU1FT1VUCQkoMTAgKiBIWikKICNkZWZpbmUgSVBSX09QRVJBVElPTkFMX1RJTUVPVVQJCSg1ICogNjApCkBAIC0xMzYwLDYgKzEzNjEsNyBAQAogCUlOQUNUSVZFLAogCVdBSVRfRk9SX0RVTVAsCiAJR0VUX0RVTVAsCisJUkVBRF9EVU1QLAogCUFCT1JUX0RVTVAsCiAJRFVNUF9PQlRBSU5FRAogfTsKQEAgLTEzODQsNiArMTM4Niw3IEBACiAJdTggbmVlZHNfd2FybV9yZXNldDoxOwogCXU4IG1zaV9yZWNlaXZlZDoxOwogCXU4IHNpczY0OjE7CisJdTggZHVtcF90aW1lb3V0OjE7CiAKIAl1OCByZXZpZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5jCmluZGV4IDY5ODFiNzcuLmU3ZmU5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmMKQEAgLTEyNjMsNiArMTI2MywxMCBAQAogewogCWludCBpOwogCisJLyogZGlzYWJsZSBvdXRwdXQgZGF0YSBzZWxlY3RzICovCisJZm9yIChpID0gMDsgaSA8IGlzY2lfZ3Bpb19jb3VudChpaG9zdCk7IGkrKykKKwkJd3JpdGVsKFNHUElPX0hXX0NPTlRST0wsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5zZ3Bpby5vdXRwdXRfZGF0YV9zZWxlY3RbaV0pOworCiAJaXNjaV9ob3N0X2NoYW5nZV9zdGF0ZShpaG9zdCwgaXNjaV9zdG9wcGluZyk7CiAJZm9yIChpID0gMDsgaSA8IFNDSV9NQVhfUE9SVFM7IGkrKykgewogCQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9ICZpaG9zdC0+cG9ydHNbaV07CkBAIC0xMjgxLDYgKzEyODUsMTIgQEAKIAlzcGluX3VubG9ja19pcnEoJmlob3N0LT5zY2ljX2xvY2spOwogCiAJd2FpdF9mb3Jfc3RvcChpaG9zdCk7CisKKwkvKiBkaXNhYmxlIHNncGlvOiB3aGVyZSB0aGUgYWJvdmUgd2FpdCBzaG91bGQgZ2l2ZSB0aW1lIGZvciB0aGUKKwkgKiBlbmNsb3N1cmUgdG8gc2FtcGxlIHRoZSBncGlvcyBnb2luZyBpbmFjdGl2ZQorCSAqLworCXdyaXRlbCgwLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAuc2dwaW8uaW50ZXJmYWNlX2NvbnRyb2wpOworCiAJc2NpX2NvbnRyb2xsZXJfcmVzZXQoaWhvc3QpOwogCiAJLyogQ2FuY2VsIGFueS9hbGwgb3V0c3RhbmRpbmcgcG9ydCB0aW1lcnMgKi8KQEAgLTEzNDAsNyArMTM1MCw3IEBACiAJdS0+c3RwX21heF9vY2N1cGFuY3lfdGltZW91dCA9IHN0cF9tYXhfb2NjX3RvOwogCXUtPnNzcF9tYXhfb2NjdXBhbmN5X3RpbWVvdXQgPSBzc3BfbWF4X29jY190bzsKIAl1LT5ub19vdXRib3VuZF90YXNrX3RpbWVvdXQgPSBub19vdXRib3VuZF90YXNrX3RvOwotCXUtPm1heF9udW1iZXJfY29uY3VycmVudF9kZXZpY2Vfc3Bpbl91cCA9IG1heF9jb25jdXJyX3NwaW51cDsKKwl1LT5tYXhfY29uY3Vycl9zcGludXAgPSBtYXhfY29uY3Vycl9zcGludXA7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9jb250cm9sbGVyX2luaXRpYWxfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQpAQCAtMTY1MSw3ICsxNjYxLDcgQEAKIAlpaG9zdC0+b2VtX3BhcmFtZXRlcnMuY29udHJvbGxlci5tb2RlX3R5cGUgPSBTQ0lDX1BPUlRfQVVUT01BVElDX0NPTkZJR1VSQVRJT05fTU9ERTsKIAogCS8qIERlZmF1bHQgdG8gQVBDIG1vZGUuICovCi0JaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXAgPSAxOworCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyX3NwaW5fdXAgPSAxOwogCiAJLyogRGVmYXVsdCB0byBubyBTU0Mgb3BlcmF0aW9uLiAqLwogCWlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLmRvX2VuYWJsZV9zc2MgPSBmYWxzZTsKQEAgLTE3NzcsNyArMTc4Nyw4IEBACiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG9lbS0+Y29udHJvbGxlci5tYXhfY29uY3VycmVudF9kZXZfc3Bpbl91cCA+IE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UKQorCWlmIChvZW0tPmNvbnRyb2xsZXIubWF4X2NvbmN1cnJfc3Bpbl91cCA+IE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UIHx8CisJICAgIG9lbS0+Y29udHJvbGxlci5tYXhfY29uY3Vycl9zcGluX3VwIDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKQEAgLTE4MDAsNiArMTgxMSwxNiBAQAogCXJldHVybiBTQ0lfRkFJTFVSRV9JTlZBTElEX1NUQVRFOwogfQogCitzdGF0aWMgdTggbWF4X3NwaW5fdXAoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QpCit7CisJaWYgKGlob3N0LT51c2VyX3BhcmFtZXRlcnMubWF4X2NvbmN1cnJfc3BpbnVwKQorCQlyZXR1cm4gbWluX3QodTgsIGlob3N0LT51c2VyX3BhcmFtZXRlcnMubWF4X2NvbmN1cnJfc3BpbnVwLAorCQkJICAgICBNQVhfQ09OQ1VSUkVOVF9ERVZJQ0VfU1BJTl9VUF9DT1VOVCk7CisJZWxzZQorCQlyZXR1cm4gbWluX3QodTgsIGlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyX3NwaW5fdXAsCisJCQkgICAgIE1BWF9DT05DVVJSRU5UX0RFVklDRV9TUElOX1VQX0NPVU5UKTsKK30KKwogc3RhdGljIHZvaWQgcG93ZXJfY29udHJvbF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3Qgc2NpX3RpbWVyICp0bXIgPSAoc3RydWN0IHNjaV90aW1lciAqKWRhdGE7CkBAIC0xODI5LDggKzE4NTAsNyBAQAogCQlpZiAoaXBoeSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA+PQotCQkgICAgaWhvc3QtPm9lbV9wYXJhbWV0ZXJzLmNvbnRyb2xsZXIubWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXApCisJCWlmIChpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIgPj0gbWF4X3NwaW5fdXAoaWhvc3QpKQogCQkJYnJlYWs7CiAKIAkJaWhvc3QtPnBvd2VyX2NvbnRyb2wucmVxdWVzdGVyc1tpXSA9IE5VTEw7CkBAIC0xODU1LDggKzE4NzUsNyBAQAogewogCUJVR19PTihpcGh5ID09IE5VTEwpOwogCi0JaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA8Ci0JICAgIGlob3N0LT5vZW1fcGFyYW1ldGVycy5jb250cm9sbGVyLm1heF9jb25jdXJyZW50X2Rldl9zcGluX3VwKSB7CisJaWYgKGlob3N0LT5wb3dlcl9jb250cm9sLnBoeXNfZ3JhbnRlZF9wb3dlciA8IG1heF9zcGluX3VwKGlob3N0KSkgewogCQlpaG9zdC0+cG93ZXJfY29udHJvbC5waHlzX2dyYW50ZWRfcG93ZXIrKzsKIAkJc2NpX3BoeV9jb25zdW1lX3Bvd2VyX2hhbmRsZXIoaXBoeSk7CiAKQEAgLTIzNjUsNiArMjM4NCwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1BIWVM7IGkrKykKIAkJaXNjaV9waHlfaW5pdCgmaWhvc3QtPnBoeXNbaV0sIGlob3N0LCBpKTsKIAorCS8qIGVuYWJsZSBzZ3BpbyAqLworCXdyaXRlbCgxLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAuc2dwaW8uaW50ZXJmYWNlX2NvbnRyb2wpOworCWZvciAoaSA9IDA7IGkgPCBpc2NpX2dwaW9fY291bnQoaWhvc3QpOyBpKyspCisJCXdyaXRlbChTR1BJT19IV19DT05UUk9MLCAmaWhvc3QtPnNjdV9yZWdpc3RlcnMtPnBlZzAuc2dwaW8ub3V0cHV0X2RhdGFfc2VsZWN0W2ldKTsKKwl3cml0ZWwoMCwgJmlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnNncGlvLnZlbmRvcl9zcGVjaWZpY19jb2RlKTsKKwogCWZvciAoaSA9IDA7IGkgPCBTQ0lfTUFYX1JFTU9URV9ERVZJQ0VTOyBpKyspIHsKIAkJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9ICZpaG9zdC0+ZGV2aWNlc1tpXTsKIApAQCAtMjc2MCwzICsyNzg1LDU2IEBACiAKIAlyZXR1cm4gc3RhdHVzOwogfQorCitzdGF0aWMgaW50IHNjaV93cml0ZV9ncGlvX3R4X2dwKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCB1OCByZWdfaW5kZXgsIHU4IHJlZ19jb3VudCwgdTggKndyaXRlX2RhdGEpCit7CisJaW50IGQ7CisKKwkvKiBubyBzdXBwb3J0IGZvciBUWF9HUF9DRkcgKi8KKwlpZiAocmVnX2luZGV4ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChkID0gMDsgZCA8IGlzY2lfZ3Bpb19jb3VudChpaG9zdCk7IGQrKykgeworCQl1MzIgdmFsID0gMHg0NDQ7IC8qIGFsbCBPRHgubiBjbGVhciAqLworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlpbnQgYml0ID0gKGkgPDwgMikgKyAyOworCisJCQliaXQgPSB0cnlfdGVzdF9zYXNfZ3Bpb19ncF9iaXQodG9fc2FzX2dwaW9fb2QoZCwgaSksCisJCQkJCQkgICAgICAgd3JpdGVfZGF0YSwgcmVnX2luZGV4LAorCQkJCQkJICAgICAgIHJlZ19jb3VudCk7CisJCQlpZiAoYml0IDwgMCkKKwkJCQlicmVhazsKKworCQkJLyogaWYgb2QgaXMgc2V0LCBjbGVhciB0aGUgJ2ludmVydCcgYml0ICovCisJCQl2YWwgJj0gfihiaXQgPDwgKChpIDw8IDIpICsgMikpOworCQl9CisKKwkJaWYgKGkgPCAzKQorCQkJYnJlYWs7CisJCXdyaXRlbCh2YWwsICZpaG9zdC0+c2N1X3JlZ2lzdGVycy0+cGVnMC5zZ3Bpby5vdXRwdXRfZGF0YV9zZWxlY3RbZF0pOworCX0KKworCS8qIHVubGVzcyByZWdfaW5kZXggaXMgPiAxLCB3ZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gd3JpdGUgYXQKKwkgKiBsZWFzdCBvbmUgcmVnaXN0ZXIKKwkgKi8KKwlyZXR1cm4gZCA+IDA7Cit9CisKK2ludCBpc2NpX2dwaW9fd3JpdGUoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSwgdTggcmVnX3R5cGUsIHU4IHJlZ19pbmRleCwKKwkJICAgIHU4IHJlZ19jb3VudCwgdTggKndyaXRlX2RhdGEpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBzYXNfaGEtPmxsZGRfaGE7CisJaW50IHdyaXR0ZW47CisKKwlzd2l0Y2ggKHJlZ190eXBlKSB7CisJY2FzZSBTQVNfR1BJT19SRUdfVFhfR1A6CisJCXdyaXR0ZW4gPSBzY2lfd3JpdGVfZ3Bpb190eF9ncChpaG9zdCwgcmVnX2luZGV4LCByZWdfY291bnQsIHdyaXRlX2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cml0dGVuID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2hvc3QuaAppbmRleCA5ZjMzODMxLi42NDYwNTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9ob3N0LmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaG9zdC5oCkBAIC00NDAsNiArNDQwLDE4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKiBzZXQgaHcgY29udHJvbCBmb3IgJ2FjdGl2aXR5JywgZXZlbiB0aG91Z2ggYWN0aXZlIGVuY2xvc3VyZXMgc2VlbSB0byBkcml2ZQorICogdGhlIGFjdGl2aXR5IGxlZCBvbiB0aGVpciBvd24uICBTa2lwIHNldHRpbmcgRlNFTkcgY29udHJvbCBvbiAnc3RhdHVzJyBkdWUKKyAqIHRvIHVuZXhwZWN0ZWQgb3BlcmF0aW9uIGFuZCAnZXJyb3InIGR1ZSB0byBub3QgYmVpbmcgYSBzdXBwb3J0ZWQgYXV0b21hdGljCisgKiBGU0VORyBvdXRwdXQKKyAqLworI2RlZmluZSBTR1BJT19IV19DT05UUk9MIDB4MDAwMDA0NDMKKworc3RhdGljIGlubGluZSBpbnQgaXNjaV9ncGlvX2NvdW50KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0KQoreworCXJldHVybiBBUlJBWV9TSVpFKGlob3N0LT5zY3VfcmVnaXN0ZXJzLT5wZWcwLnNncGlvLm91dHB1dF9kYXRhX3NlbGVjdCk7Cit9CisKIHZvaWQgc2NpX2NvbnRyb2xsZXJfcG9zdF9yZXF1ZXN0KHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAogCQkJCSAgICAgIHUzMiByZXF1ZXN0KTsKIHZvaWQgc2NpX2NvbnRyb2xsZXJfcmVsZWFzZV9mcmFtZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKQEAgLTU0Miw0ICs1NTQsNyBAQAogZW51bSBzY2lfc3RhdHVzIHNjaV9wb3J0X2NvbmZpZ3VyYXRpb25fYWdlbnRfaW5pdGlhbGl6ZSgKIAlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKIAlzdHJ1Y3Qgc2NpX3BvcnRfY29uZmlndXJhdGlvbl9hZ2VudCAqcG9ydF9hZ2VudCk7CisKK2ludCBpc2NpX2dwaW9fd3JpdGUoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKiwgdTggcmVnX3R5cGUsIHU4IHJlZ19pbmRleCwKKwkJICAgIHU4IHJlZ19jb3VudCwgdTggKndyaXRlX2RhdGEpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9pbml0LmMKaW5kZXggMjlhYTM0ZS4uYTk3ZWRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL2luaXQuYwpAQCAtMTE4LDcgKzExOCw3IEBACiBtb2R1bGVfcGFyYW0ocGh5X2dlbiwgYnl0ZSwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBoeV9nZW4sICJQSFkgZ2VuZXJhdGlvbiAoMTogMS41R2JwcyAyOiAzLjBHYnBzIDM6IDYuMEdicHMpIik7CiAKLXVuc2lnbmVkIGNoYXIgbWF4X2NvbmN1cnJfc3BpbnVwID0gMTsKK3Vuc2lnbmVkIGNoYXIgbWF4X2NvbmN1cnJfc3BpbnVwOwogbW9kdWxlX3BhcmFtKG1heF9jb25jdXJyX3NwaW51cCwgYnl0ZSwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9jb25jdXJyX3NwaW51cCwgIk1heCBjb25jdXJyZW50IGRldmljZSBzcGludXAiKTsKIApAQCAtMTkyLDYgKzE5Miw5IEBACiAKIAkvKiBQaHkgbWFuYWdlbWVudCAqLwogCS5sbGRkX2NvbnRyb2xfcGh5CT0gaXNjaV9waHlfY29udHJvbCwKKworCS8qIEdQSU8gc3VwcG9ydCAqLworCS5sbGRkX3dyaXRlX2dwaW8JPSBpc2NpX2dwaW9fd3JpdGUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL2lzY2kuaAppbmRleCBkMWRlNjMzLi44ZWZlYjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9pc2NpLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvaXNjaS5oCkBAIC05Nyw3ICs5Nyw3IEBACiAjZGVmaW5lIFNDVV9NQVhfQ09NUExFVElPTl9RVUVVRV9TSElGVAkgIChpbG9nMihTQ1VfTUFYX0NPTVBMRVRJT05fUVVFVUVfRU5UUklFUykpCiAKICNkZWZpbmUgU0NVX0FCU09MVVRFX01BWF9VTlNPTElDSVRFRF9GUkFNRVMgKDQwOTYpCi0jZGVmaW5lIFNDVV9VTlNPTElDSVRFRF9GUkFNRV9CVUZGRVJfU0laRSAgICgxMDI0KQorI2RlZmluZSBTQ1VfVU5TT0xJQ0lURURfRlJBTUVfQlVGRkVSX1NJWkUgICAoMTAyNFUpCiAjZGVmaW5lIFNDVV9JTlZBTElEX0ZSQU1FX0lOREVYICAgICAgICAgICAgICgweEZGRkYpCiAKICNkZWZpbmUgU0NVX0lPX1JFUVVFU1RfTUFYX1NHRV9TSVpFICAgICAgICAgKDB4MDBGRkZGRkYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9waHkuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jCmluZGV4IDA5ZTYxMTMuLjM1ZjUwYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3BoeS5jCkBAIC0xMzEzLDYgKzEzMTMsMTcgQEAKIAkJcmV0ID0gaXNjaV9wb3J0X3BlcmZvcm1faGFyZF9yZXNldChpaG9zdCwgaXBvcnQsIGlwaHkpOwogCiAJCWJyZWFrOworCWNhc2UgUEhZX0ZVTkNfR0VUX0VWRU5UUzogeworCQlzdHJ1Y3Qgc2N1X2xpbmtfbGF5ZXJfcmVnaXN0ZXJzIF9faW9tZW0gKnI7CisJCXN0cnVjdCBzYXNfcGh5ICpwaHkgPSBzYXNfcGh5LT5waHk7CisKKwkJciA9IGlwaHktPmxpbmtfbGF5ZXJfcmVnaXN0ZXJzOworCQlwaHktPnJ1bm5pbmdfZGlzcGFyaXR5X2Vycm9yX2NvdW50ID0gcmVhZGwoJnItPnJ1bm5pbmdfZGlzcGFyaXR5X2Vycm9yX2NvdW50KTsKKwkJcGh5LT5sb3NzX29mX2R3b3JkX3N5bmNfY291bnQgPSByZWFkbCgmci0+bG9zc19vZl9zeW5jX2Vycm9yX2NvdW50KTsKKwkJcGh5LT5waHlfcmVzZXRfcHJvYmxlbV9jb3VudCA9IHJlYWRsKCZyLT5waHlfcmVzZXRfcHJvYmxlbV9jb3VudCk7CisJCXBoeS0+aW52YWxpZF9kd29yZF9jb3VudCA9IHJlYWRsKCZyLT5pbnZhbGlkX2R3b3JkX2NvdW50ZXIpOworCQlicmVhazsKKwl9CiAKIAlkZWZhdWx0OgogCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5jCmluZGV4IDhmNmY5YjcuLmFjN2YyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmMKQEAgLTE0NSw0OCArMTQ1LDE1IEBACiAJfQogfQogCi0vKiBjYWxsZWQgdW5kZXIgc2NpX2xvY2sgdG8gc3RhYmlsaXplIHBoeTpwb3J0IGFzc29jaWF0aW9ucyAqLwotdm9pZCBpc2NpX3BvcnRfYmNuX2VuYWJsZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQpCi17Ci0JaW50IGk7Ci0KLQljbGVhcl9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpOwotCXdha2VfdXAoJmlob3N0LT5ldmVudHEpOwotCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcG9ydC0+cGh5X3RhYmxlKTsgaSsrKSB7Ci0JCXN0cnVjdCBpc2NpX3BoeSAqaXBoeSA9IGlwb3J0LT5waHlfdGFibGVbaV07Ci0KLQkJaWYgKCFpcGh5KQotCQkJY29udGludWU7Ci0KLQkJaWhvc3QtPnNhc19oYS5ub3RpZnlfcG9ydF9ldmVudCgmaXBoeS0+c2FzX3BoeSwKLQkJCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKLQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBpc2NpX3BvcnRfYmNfY2hhbmdlX3JlY2VpdmVkKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAogCQkJCQkgc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCiAJCQkJCSBzdHJ1Y3QgaXNjaV9waHkgKmlwaHkpCiB7Ci0JaWYgKGlwb3J0ICYmIHRlc3RfYml0KElQT1JUX0JDTl9CTE9DS0VELCAmaXBvcnQtPmZsYWdzKSkgewotCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJIiVzOiBkaXNhYmxlZCBCQ047IGlzY2lfcGh5ID0gJXAsIHNhc19waHkgPSAlcFxuIiwKLQkJCV9fZnVuY19fLCBpcGh5LCAmaXBoeS0+c2FzX3BoeSk7Ci0JCXNldF9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpOwotCQlhdG9taWNfaW5jKCZpcG9ydC0+ZXZlbnQpOwotCQl3YWtlX3VwKCZpaG9zdC0+ZXZlbnRxKTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJIiVzOiBpc2NpX3BoeSA9ICVwLCBzYXNfcGh5ID0gJXBcbiIsCi0JCQlfX2Z1bmNfXywgaXBoeSwgJmlwaHktPnNhc19waHkpOworCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCSIlczogaXNjaV9waHkgPSAlcCwgc2FzX3BoeSA9ICVwXG4iLAorCQlfX2Z1bmNfXywgaXBoeSwgJmlwaHktPnNhc19waHkpOwogCi0JCWlob3N0LT5zYXNfaGEubm90aWZ5X3BvcnRfZXZlbnQoJmlwaHktPnNhc19waHksCi0JCQkJCQlQT1JURV9CUk9BRENBU1RfUkNWRCk7Ci0JfQorCWlob3N0LT5zYXNfaGEubm90aWZ5X3BvcnRfZXZlbnQoJmlwaHktPnNhc19waHksIFBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKIAlzY2lfcG9ydF9iY25fZW5hYmxlKGlwb3J0KTsKIH0KIApAQCAtMjc4LDkgKzI0NSw2IEBACiAJCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBoeSBvbiB0aGlzIHBvcnQuICovCiAJCWlmIChpc2NpX3BoeS0+c2FzX3BoeS5wb3J0ICYmCiAJCSAgICBpc2NpX3BoeS0+c2FzX3BoeS5wb3J0LT5udW1fcGh5cyA9PSAxKSB7Ci0JCQlhdG9taWNfaW5jKCZpc2NpX3BvcnQtPmV2ZW50KTsKLQkJCWlzY2lfcG9ydF9iY25fZW5hYmxlKGlzY2lfaG9zdCwgaXNjaV9wb3J0KTsKLQogCQkJLyogY2hhbmdlIHRoZSBzdGF0ZSBmb3IgYWxsIGRldmljZXMgb24gdGhpcyBwb3J0LiAgVGhlCiAJCQkgKiBuZXh0IHRhc2sgc2VudCB0byB0aGlzIGRldmljZSB3aWxsIGJlIHJldHVybmVkIGFzCiAJCQkgKiBTQVNfVEFTS19VTkRFTElWRVJFRCwgYW5kIHRoZSBzY3NpIG1pZCBsYXllciB3aWxsCkBAIC0yOTQsOCArMjU4LDggQEAKIAkJCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlKTsKIAkJCQlzZXRfYml0KElERVZfR09ORSwgJmlzY2lfZGV2aWNlLT5mbGFncyk7CiAJCQl9CisJCQlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlzY2lfcG9ydCwgaXNjaV9zdG9wcGluZyk7CiAJCX0KLQkJaXNjaV9wb3J0X2NoYW5nZV9zdGF0ZShpc2NpX3BvcnQsIGlzY2lfc3RvcHBpbmcpOwogCX0KIAogCS8qIE5vdGlmeSBsaWJzYXMgb2YgdGhlIGJvcmtlbiBsaW5rLCB0aGlzIHdpbGwgdHJpZ2dlciBjYWxscyB0byBvdXIKQEAgLTM1MCw2ICszMTQsMzQgQEAKIAlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiUG9ydCBzdG9wIGNvbXBsZXRlXG4iKTsKIH0KIAorCitzdGF0aWMgYm9vbCBpc19wb3J0X3JlYWR5X3N0YXRlKGVudW0gc2NpX3BvcnRfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNDSV9QT1JUX1JFQURZOgorCWNhc2UgU0NJX1BPUlRfU1VCX1dBSVRJTkc6CisJY2FzZSBTQ0lfUE9SVF9TVUJfT1BFUkFUSU9OQUw6CisJY2FzZSBTQ0lfUE9SVF9TVUJfQ09ORklHVVJJTkc6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qIGZsYWcgZHVtbXkgcm5jIGhhbmxpbmcgd2hlbiBleGl0aW5nIGEgcmVhZHkgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIHBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2Uoc3RydWN0IGlzY2lfcG9ydCAqaXBvcnQsCisJCQkJICAgICAgZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGUpCit7CisJc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtID0gJmlwb3J0LT5zbTsKKwllbnVtIHNjaV9wb3J0X3N0YXRlcyBvbGRfc3RhdGUgPSBzbS0+Y3VycmVudF9zdGF0ZV9pZDsKKworCWlmIChpc19wb3J0X3JlYWR5X3N0YXRlKG9sZF9zdGF0ZSkgJiYgIWlzX3BvcnRfcmVhZHlfc3RhdGUoc3RhdGUpKQorCQlpcG9ydC0+cmVhZHlfZXhpdCA9IHRydWU7CisKKwlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisJaXBvcnQtPnJlYWR5X2V4aXQgPSBmYWxzZTsKK30KKwogLyoqCiAgKiBpc2NpX3BvcnRfaGFyZF9yZXNldF9jb21wbGV0ZSgpIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHNjaSBjb3JlCiAgKiAgICB3aGVuIHRoZSBoYXJkIHJlc2V0IGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBoYXMgYmVlbiByZWNlaXZlZC4KQEAgLTM2OCw2ICszNjAsMjYgQEAKIAkvKiBTYXZlIHRoZSBzdGF0dXMgb2YgdGhlIGhhcmQgcmVzZXQgZnJvbSB0aGUgcG9ydC4gKi8KIAlpc2NpX3BvcnQtPmhhcmRfcmVzZXRfc3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7CiAKKwlpZiAoY29tcGxldGlvbl9zdGF0dXMgIT0gU0NJX1NVQ0NFU1MpIHsKKworCQkvKiBUaGUgcmVzZXQgZmFpbGVkLiAgVGhlIHBvcnQgc3RhdGUgaXMgbm93IFNDSV9QT1JUX0ZBSUxFRC4gKi8KKwkJaWYgKGlzY2lfcG9ydC0+YWN0aXZlX3BoeV9tYXNrID09IDApIHsKKworCQkJLyogR2VuZXJhdGUgdGhlIGxpbmsgZG93biBub3cgdG8gdGhlIGhvc3QsIHNpbmNlIGl0CisJCQkgKiB3YXMgaW50ZXJjZXB0ZWQgYnkgdGhlIGhhcmQgcmVzZXQgc3RhdGUgbWFjaGluZSB3aGVuCisJCQkgKiBpdCByZWFsbHkgaGFwcGVuZWQuCisJCQkgKi8KKwkJCWlzY2lfcG9ydF9saW5rX2Rvd24oaXNjaV9wb3J0LT5pc2NpX2hvc3QsCisJCQkJCSAgICAmaXNjaV9wb3J0LT5pc2NpX2hvc3QtPnBoeXNbCisJCQkJCQkgICBpc2NpX3BvcnQtPmxhc3RfYWN0aXZlX3BoeV0sCisJCQkJCSAgICBpc2NpX3BvcnQpOworCQl9CisJCS8qIEFkdmFuY2UgdGhlIHBvcnQgc3RhdGUgc28gdGhhdCBsaW5rIHN0YXRlIGNoYW5nZXMgd2lsbCBiZQorCQkqIG5vdGljZWQuCisJCSovCisJCXBvcnRfc3RhdGVfbWFjaGluZV9jaGFuZ2UoaXNjaV9wb3J0LCBTQ0lfUE9SVF9TVUJfV0FJVElORyk7CisKKwl9CiAJY29tcGxldGVfYWxsKCZpc2NpX3BvcnQtPmhhcmRfcmVzZXRfY29tcGxldGUpOwogfQogCkBAIC02NTcsNiArNjY5LDggQEAKIAlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5vd25pbmdfY29udHJvbGxlcjsKIAogCWlwb3J0LT5hY3RpdmVfcGh5X21hc2sgJj0gfigxIDw8IGlwaHktPnBoeV9pbmRleCk7CisJaWYgKCFpcG9ydC0+YWN0aXZlX3BoeV9tYXNrKQorCQlpcG9ydC0+bGFzdF9hY3RpdmVfcGh5ID0gaXBoeS0+cGh5X2luZGV4OwogCiAJaXBoeS0+bWF4X25lZ290aWF0ZWRfc3BlZWQgPSBTQVNfTElOS19SQVRFX1VOS05PV047CiAKQEAgLTY4MywzMyArNjk3LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sIGlzX3BvcnRfcmVhZHlfc3RhdGUoZW51bSBzY2lfcG9ydF9zdGF0ZXMgc3RhdGUpCi17Ci0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgU0NJX1BPUlRfUkVBRFk6Ci0JY2FzZSBTQ0lfUE9SVF9TVUJfV0FJVElORzoKLQljYXNlIFNDSV9QT1JUX1NVQl9PUEVSQVRJT05BTDoKLQljYXNlIFNDSV9QT1JUX1NVQl9DT05GSUdVUklORzoKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotLyogZmxhZyBkdW1teSBybmMgaGFubGluZyB3aGVuIGV4aXRpbmcgYSByZWFkeSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgcG9ydF9zdGF0ZV9tYWNoaW5lX2NoYW5nZShzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCwKLQkJCQkgICAgICBlbnVtIHNjaV9wb3J0X3N0YXRlcyBzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc2NpX2Jhc2Vfc3RhdGVfbWFjaGluZSAqc20gPSAmaXBvcnQtPnNtOwotCWVudW0gc2NpX3BvcnRfc3RhdGVzIG9sZF9zdGF0ZSA9IHNtLT5jdXJyZW50X3N0YXRlX2lkOwotCi0JaWYgKGlzX3BvcnRfcmVhZHlfc3RhdGUob2xkX3N0YXRlKSAmJiAhaXNfcG9ydF9yZWFkeV9zdGF0ZShzdGF0ZSkpCi0JCWlwb3J0LT5yZWFkeV9leGl0ID0gdHJ1ZTsKLQotCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIHN0YXRlKTsKLQlpcG9ydC0+cmVhZHlfZXhpdCA9IGZhbHNlOwotfQotCiAvKioKICAqIHNjaV9wb3J0X2dlbmVyYWxfbGlua191cF9oYW5kbGVyIC0gcGh5IGNhbiBiZSBhc3NpZ25lZCB0byBwb3J0PwogICogQHNjaV9wb3J0OiBzY2lfcG9ydCBvYmplY3QgZm9yIHdoaWNoIGhhcyBhIHBoeSB0aGF0IGhhcyBnb25lIGxpbmsgdXAuCkBAIC0xNjIyLDcgKzE2MDksOCBAQAogCWlwb3J0LT5sb2dpY2FsX3BvcnRfaW5kZXggID0gU0NJQ19TRFNfRFVNTVlfUE9SVDsKIAlpcG9ydC0+cGh5c2ljYWxfcG9ydF9pbmRleCA9IGluZGV4OwogCWlwb3J0LT5hY3RpdmVfcGh5X21hc2sgICAgID0gMDsKLQlpcG9ydC0+cmVhZHlfZXhpdAkgICAgICA9IGZhbHNlOworCWlwb3J0LT5sYXN0X2FjdGl2ZV9waHkgICAgID0gMDsKKwlpcG9ydC0+cmVhZHlfZXhpdAkgICA9IGZhbHNlOwogCiAJaXBvcnQtPm93bmluZ19jb250cm9sbGVyID0gaWhvc3Q7CiAKQEAgLTE2NDgsNyArMTYzNiw2IEBACiAJaW5pdF9jb21wbGV0aW9uKCZpcG9ydC0+c3RhcnRfY29tcGxldGUpOwogCWlwb3J0LT5pc2NpX2hvc3QgPSBpaG9zdDsKIAlpc2NpX3BvcnRfY2hhbmdlX3N0YXRlKGlwb3J0LCBpc2NpX2ZyZWVkKTsKLQlhdG9taWNfc2V0KCZpcG9ydC0+ZXZlbnQsIDApOwogfQogCiAvKioKQEAgLTE2NzYsNyArMTY2Myw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOwotCWludCBpZHgsIHJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJaW50IHJldCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CiAKIAlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGlwb3J0ID0gJXBcbiIsCiAJCV9fZnVuY19fLCBpcG9ydCk7CkBAIC0xNjk3LDggKzE2ODQsMTMgQEAKIAkJCSIlczogaXBvcnQgPSAlcDsgaGFyZCByZXNldCBjb21wbGV0aW9uXG4iLAogCQkJX19mdW5jX18sIGlwb3J0KTsKIAotCQlpZiAoaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzICE9IFNDSV9TVUNDRVNTKQorCQlpZiAoaXBvcnQtPmhhcmRfcmVzZXRfc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CiAJCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKworCQkJZGV2X2VycigmaWhvc3QtPnBkZXYtPmRldiwKKwkJCQkiJXM6IGlwb3J0ID0gJXA7IGhhcmQgcmVzZXQgZmFpbGVkICgweCV4KVxuIiwKKwkJCQlfX2Z1bmNfXywgaXBvcnQsIGlwb3J0LT5oYXJkX3Jlc2V0X3N0YXR1cyk7CisJCX0KIAl9IGVsc2UgewogCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKIApAQCAtMTcxOCwxOCArMTcxMCw2IEBACiAJCQkiJXM6IGlwb3J0ID0gJXA7IGhhcmQgcmVzZXQgZmFpbGVkICIKIAkJCSIoMHgleCkgLSBkcml2aW5nIGV4cGxpY2l0IGxpbmsgZmFpbCBmb3IgYWxsIHBoeXNcbiIsCiAJCQlfX2Z1bmNfXywgaXBvcnQsIGlwb3J0LT5oYXJkX3Jlc2V0X3N0YXR1cyk7Ci0KLQkJLyogRG93biBhbGwgcGh5cyBpbiB0aGUgcG9ydC4gKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBTQ0lfTUFYX1BIWVM7ICsraWR4KSB7Ci0JCQlzdHJ1Y3QgaXNjaV9waHkgKmlwaHkgPSBpcG9ydC0+cGh5X3RhYmxlW2lkeF07Ci0KLQkJCWlmICghaXBoeSkKLQkJCQljb250aW51ZTsKLQkJCXNjaV9waHlfc3RvcChpcGh5KTsKLQkJCXNjaV9waHlfc3RhcnQoaXBoeSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydC5oCmluZGV4IGI1MGVjZDQuLmNiNWZmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnQuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0LmgKQEAgLTc3LDcgKzc3LDYgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaXNjaV9wb3J0IC0gaXNjaSBkaXJlY3QgYXR0YWNoZWQgc2FzIHBvcnQgb2JqZWN0Ci0gKiBAZXZlbnQ6IGNvdW50cyBiY25zIGFuZCBwb3J0IHN0b3AgZXZlbnRzIChmb3IgYmNuIGZpbHRlcmluZykKICAqIEByZWFkeV9leGl0OiBzZXZlcmFsIHN0YXRlcyBjb25zdGl0dXRlICdyZWFkeScuIFdoZW4gZXhpdGluZyByZWFkeSB3ZQogICogICAgICAgICAgICAgIG5lZWQgdG8gdGFrZSBleHRyYSBwb3J0LXRlYXJkb3duIGFjdGlvbnMgdGhhdCBhcmUKICAqICAgICAgICAgICAgICBza2lwcGVkIHdoZW4gZXhpdGluZyB0byBhbm90aGVyICdyZWFkeScgc3RhdGUuCkBAIC05MiwxMCArOTEsNiBAQAogICovCiBzdHJ1Y3QgaXNjaV9wb3J0IHsKIAllbnVtIGlzY2lfc3RhdHVzIHN0YXR1czsKLQkjZGVmaW5lIElQT1JUX0JDTl9CTE9DS0VEIDAKLQkjZGVmaW5lIElQT1JUX0JDTl9QRU5ESU5HIDEKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWF0b21pY190IGV2ZW50OwogCXN0cnVjdCBpc2NpX2hvc3QgKmlzY2lfaG9zdDsKIAlzdHJ1Y3QgYXNkX3Nhc19wb3J0IHNhc19wb3J0OwogCXN0cnVjdCBsaXN0X2hlYWQgcmVtb3RlX2Rldl9saXN0OwpAQCAtMTA5LDYgKzEwNCw3IEBACiAJdTggbG9naWNhbF9wb3J0X2luZGV4OwogCXU4IHBoeXNpY2FsX3BvcnRfaW5kZXg7CiAJdTggYWN0aXZlX3BoeV9tYXNrOworCXU4IGxhc3RfYWN0aXZlX3BoeTsKIAl1MTYgcmVzZXJ2ZWRfcm5pOwogCXUxNiByZXNlcnZlZF90YWc7CiAJdTMyIHN0YXJ0ZWRfcmVxdWVzdF9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9wb3J0X2NvbmZpZy5jCmluZGV4IDQ4NmIxMTMuLjM4YTk5ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3BvcnRfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcG9ydF9jb25maWcuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJY29uZmlndXJlX3BoeV9tYXNrID0gfnBvcnRfYWdlbnQtPnBoeV9jb25maWd1cmVkX21hc2sgJiBwb3J0X2FnZW50LT5waHlfcmVhZHlfbWFzazsKIAogCWlmICghY29uZmlndXJlX3BoeV9tYXNrKQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNDSV9NQVhfUEhZUzsgaW5kZXgrKykgewogCQlpZiAoKGNvbmZpZ3VyZV9waHlfbWFzayAmICgxIDw8IGluZGV4KSkgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Byb2JlX3JvbXMuaAppbmRleCBkYzAwN2U2Li4yYzc1MjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9wcm9iZV9yb21zLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcHJvYmVfcm9tcy5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiBUaGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0IGF0dGFjaGVkIGRldmljZXMKIAkgKiB0aGF0IGNhbiBoYXZlIHBvd2VyIHN1cHBsaWVkIHRvIHRoZW0gc2ltdWx0YW5lb3VzbHkuCiAJICovCi0JdTggbWF4X251bWJlcl9jb25jdXJyZW50X2RldmljZV9zcGluX3VwOworCXU4IG1heF9jb25jdXJyX3NwaW51cDsKIAogCS8qKgogCSAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBhbGxvdyBhIHBoeSB0byBjb25zdW1lCkBAIC0yMTksNyArMjE5LDcgQEAKIHN0cnVjdCBzY2lfb2VtX3BhcmFtcyB7CiAJc3RydWN0IHsKIAkJdWludDhfdCBtb2RlX3R5cGU7Ci0JCXVpbnQ4X3QgbWF4X2NvbmN1cnJlbnRfZGV2X3NwaW5fdXA7CisJCXVpbnQ4X3QgbWF4X2NvbmN1cnJfc3Bpbl91cDsKIAkJdWludDhfdCBkb19lbmFibGVfc3NjOwogCQl1aW50OF90IHJlc2VydmVkOwogCX0gY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlZ2lzdGVycy5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmgKaW5kZXggMDBhZmM3My4uZWFhNTQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVnaXN0ZXJzLmgKQEAgLTg3NSwxMjIgKzg3NSw2IEBACiAjZGVmaW5lIFNDVV9QVFN4U1JfR0VOX0JJVChuYW1lKSBcCiAJU0NVX0dFTl9CSVQoU0NVX1BUU0dfUE9SVF9UQVNLX1NDSEVEVUxFUl9TVEFUVVNfICMjIG5hbWUpCiAKLQotLyoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAqIFNHUElPIFJlZ2lzdGVyIHNoaWZ0IGFuZCBtYXNrIHZhbHVlcwotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fRU5BQkxFX1NISUZUICAgICAgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX0NMT0NLX1NFTEVDVF9TSElGVCAgICAgICAoMSkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX0NMT0NLX1NFTEVDVF9NQVNLICAgICAgICAoMHgwMDAwMDAwMikKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX1NISUZUX1dJRFRIX1NFTEVDVF9TSElGVCAoMikKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fU0VSSUFMX1NISUZUX1dJRFRIX1NFTEVDVF9NQVNLICAoMHgwMDAwMDAwNCkKLSNkZWZpbmUgU0NVX1NHUElPX0NPTlRST0xfU0dQSU9fVEVTVF9CSVRfU0hJRlQgICAgICAgICAgICAgICAgICAoMTUpCi0jZGVmaW5lIFNDVV9TR1BJT19DT05UUk9MX1NHUElPX1RFU1RfQklUX01BU0sgICAgICAgICAgICAgICAgICAgKDB4MDAwMDgwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19DT05UUk9MX1NHUElPX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAgICAgKDB4RkZGRjdGRjgpCi0KLSNkZWZpbmUgU0NVX1NHSUNSeF9HRU5fQklUKG5hbWUpIFwKLQlTQ1VfR0VOX0JJVChTQ1VfU0dQSU9fQ09OVFJPTF9TR1BJT18gIyMgbmFtZSkKLQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IwX1NISUZUICAgICAgKDApCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjBfTUFTSyAgICAgICAoMHgwMDAwMDAwRikKLSNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMV9TSElGVCAgICAgICg0KQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IxX01BU0sgICAgICAgKDB4MDAwMDAwRjApCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUjJfU0hJRlQgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX1BST0dSQU1NQUJMRV9CTElOS19SRUdJU1RFUl9SMl9NQVNLICAgICAgICgweDAwMDAwRjAwKQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IzX1NISUZUICAgICAgKDEyKQotI2RlZmluZSBTQ1VfU0dQSU9fUFJPR1JBTU1BQkxFX0JMSU5LX1JFR0lTVEVSX1IzX01BU0sgICAgICAgKDB4MDAwMEYwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGMDAwMCkKLQotI2RlZmluZSBTQ1VfU0dQQlJ4X0dFTl9WQUwobmFtZSwgdmFsdWUpCVwKLQlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19QUk9HUkFNTUFCTEVfQkxJTktfUkVHSVNURVJfICMjIG5hbWUsIHZhbHVlKQotCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMF9TSElGVCAgICAgICAgKDApCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMF9NQVNLICAgICAgICAgKDB4MDAwMDAwMDMpCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMV9TSElGVCAgICAgICAgKDQpCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMV9NQVNLICAgICAgICAgKDB4MDAwMDAwMzApCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMl9TSElGVCAgICAgICAgKDgpCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SMl9NQVNLICAgICAgICAgKDB4MDAwMDAzMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl9SM19TSElGVCAgICAgICAgKDEyKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfUjNfTUFTSyAgICAgICAgICgweDAwMDAzMDAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU1RBUlRfRFJJVkVfTE9XRVJfUkVTRVJWRURfTUFTSyAgICgweEZGRkY4ODg4KQotCi0jZGVmaW5lIFNDVV9TR1NETFJ4X0dFTl9WQUwobmFtZSwgdmFsdWUpIFwKLQlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19TVEFSVF9EUklWRV9MT1dFUl8gIyMgbmFtZSwgdmFsdWUpCi0KLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IwX1NISUZUICAgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IwX01BU0sgICAgICAgICAoMHgwMDAwMDAwMykKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IxX1NISUZUICAgICAgICAoNCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IxX01BU0sgICAgICAgICAoMHgwMDAwMDAzMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IyX1NISUZUICAgICAgICAoOCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IyX01BU0sgICAgICAgICAoMHgwMDAwMDMwMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NUQVJUX0RSSVZFX1VQUEVSX1IzX1NISUZUICAgICAgICAoMTIpCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9VUFBFUl9SM19NQVNLICAgICAgICAgKDB4MDAwMDMwMDApCi0jZGVmaW5lIFNDVV9TR1BJT19TVEFSVF9EUklWRV9VUFBFUl9SRVNFUlZFRF9NQVNLICAgKDB4RkZGRjg4ODgpCi0KLSNkZWZpbmUgU0NVX1NHU0RVUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NUQVJUX0RSSVZFX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKLQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDBfU0hJRlQgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QwX01BU0sgICAgICAgKDB4MDAwMDAwMDMpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMV9TSElGVCAgICAgICg0KQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDFfTUFTSyAgICAgICAoMHgwMDAwMDAzMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSX0QyX1NISUZUICAgICAgKDgpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EMl9NQVNLICAgICAgICgweDAwMDAwMzAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfRDNfU0hJRlQgICAgICAoMTIpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9MT1dFUl9EM19NQVNLICAgICAgICgweDAwMDAzMDAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfTE9XRVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGODg4OCkKLQotI2RlZmluZSBTQ1VfU0dTSURMUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKLQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDBfU0hJRlQgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QwX01BU0sgICAgICAgKDB4MDAwMDAwMDMpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMV9TSElGVCAgICAgICg0KQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDFfTUFTSyAgICAgICAoMHgwMDAwMDAzMCkKLSNkZWZpbmUgU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX1VQUEVSX0QyX1NISUZUICAgICAgKDgpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EMl9NQVNLICAgICAgICgweDAwMDAwMzAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfRDNfU0hJRlQgICAgICAoMTIpCi0jZGVmaW5lIFNDVV9TR1BJT19TRVJJQUxfSU5QVVRfREFUQV9VUFBFUl9EM19NQVNLICAgICAgICgweDAwMDAzMDAwKQotI2RlZmluZSBTQ1VfU0dQSU9fU0VSSUFMX0lOUFVUX0RBVEFfVVBQRVJfUkVTRVJWRURfTUFTSyAoMHhGRkZGODg4OCkKLQotI2RlZmluZSBTQ1VfU0dTSURVUnhfR0VOX1ZBTChuYW1lLCB2YWx1ZSkgXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1NFUklBTF9JTlBVVF9EQVRBX0xPV0VSXyAjIyBuYW1lLCB2YWx1ZSkKLQotI2RlZmluZSBTQ1VfU0dQSU9fVkVORE9SX1NQRUNJRklDX0NPREVfU0hJRlQgICAgICAgICAgICAoMCkKLSNkZWZpbmUgU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFX01BU0sgICAgICAgICAgICAgKDB4MDAwMDAwMEYpCi0jZGVmaW5lIFNDVV9TR1BJT19WRU5ET1JfU1BFQ0lGSUNfQ09ERV9SRVNFUlZFRF9NQVNLICAgICgweEZGRkZGRkYwKQotCi0jZGVmaW5lIFNDVV9TR1ZTQ1JfR0VOX1ZBTCh2YWx1ZSkgXAotCVNDVV9HRU5fVkFMVUUoU0NVX1NHUElPX1ZFTkRPUl9TUEVDSUZJQ19DT0RFICMjIG5hbWUsIHZhbHVlKQotCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMF9TSElGVCAgICAgICAgICAgKDApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMF9NQVNLICAgICAgICAgICAgKDB4MDAwMDAwMDMpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTBfU0hJRlQgICAgKDIpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTBfTUFTSyAgICAgKDB4MDAwMDAwMDQpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEwX1NISUZUICAgICAgKDMpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEEwX01BU0sgICAgICAgKDB4MDAwMDAwMDgpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMV9TSElGVCAgICAgICAgICAgKDQpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMV9NQVNLICAgICAgICAgICAgKDB4MDAwMDAwMzApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTFfU0hJRlQgICAgKDYpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTFfTUFTSyAgICAgKDB4MDAwMDAwNDApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEExX1NISUZUICAgICAgKDcpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9KT0dfRU5BQkxFX0RBVEExX01BU0sgICAgICAgKDB4MDAwMDAwODApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMl9TSElGVCAgICAgICAgICAgKDgpCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlBVVF9EQVRBMl9NQVNLICAgICAgICAgICAgKDB4MDAwMDAzMDApCi0jZGVmaW5lIFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF9JTlZFUlRfSU5QVVRfREFUQTJfU0hJRlQgICAgKDEwKQotI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSU5WRVJUX0lOUFVUX0RBVEEyX01BU0sgICAgICgweDAwMDAwNDAwKQotI2RlZmluZSBTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfSk9HX0VOQUJMRV9EQVRBMl9TSElGVCAgICAgICgxMSkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX0pPR19FTkFCTEVfREFUQTJfTUFTSyAgICAgICAoMHgwMDAwMDgwMCkKLSNkZWZpbmUgU0NVX1NHUElPX09VUFVUX0RBVEFfU0VMRUNUX1JFU0VSVkVEX01BU0sgICAgICAgICAgICAgICAoMHhGRkZGRjAwMCkKLQotI2RlZmluZSBTQ1VfU0dPRFNSX0dFTl9WQUwobmFtZSwgdmFsdWUpCVwKLQlTQ1VfR0VOX1ZBTFVFKFNDVV9TR1BJT19PVVBVVF9EQVRBX1NFTEVDVF8gIyMgbmFtZSwgdmFsdWUpCi0KLSNkZWZpbmUgU0NVX1NHT0RTUl9HRU5fQklUKG5hbWUpIFwKLQlTQ1VfR0VOX0JJVChTQ1VfU0dQSU9fT1VQVVRfREFUQV9TRUxFQ1RfICMjIG5hbWUpCi0KIC8qCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKiBTTVUgUmVnaXN0ZXJzCkBAIC0xNTI5LDEwICsxNDEzLDEyIEBACiAJdTMyIHNlcmlhbF9pbnB1dF91cHBlcjsKIC8qIDB4MDAxOCBTR1BJT19TR1ZTQ1IgKi8KIAl1MzIgdmVuZG9yX3NwZWNpZmljX2NvZGU7CisvKiAweDAwMUMgUmVzZXJ2ZWQgKi8KKwl1MzIgcmVzZXJ2ZWRfMDAxYzsKIC8qIDB4MDAyMCBTR1BJT19TR09EU1IgKi8KLQl1MzIgb3VwdXRfZGF0YV9zZWxlY3RbOF07CisJdTMyIG91dHB1dF9kYXRhX3NlbGVjdFs4XTsKIC8qIFJlbWFpbmRlciBvZiBtZW1vcnkgc3BhY2UgMjU2IGJ5dGVzICovCi0JdTMyIHJlc2VydmVkXzE0NDRfMTRmZlsweDMxXTsKKwl1MzIgcmVzZXJ2ZWRfMTQ0NF8xNGZmWzB4MzBdOwogCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmMgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmMKaW5kZXggYjZlNjM2OC4uYjIwN2NkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuYwpAQCAtMzg2LDYgKzM4NiwxOCBAQAogCX0KIH0KIAorLyoKKyAqIGNhbGxlZCBvbmNlIHRoZSByZW1vdGUgbm9kZSBjb250ZXh0IGhhcyB0cmFuc2lzaXRpb25lZCB0byBhIHJlYWR5CisgKiBzdGF0ZSAoYWZ0ZXIgc3VzcGVuZGluZyBSWCBhbmQvb3IgVFggZHVlIHRvIGVhcmx5IEQySCBmaXMpCisgKi8KK3N0YXRpYyB2b2lkIGF0YXBpX3JlbW90ZV9kZXZpY2VfcmVzdW1lX2RvbmUodm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gX2RldjsKKwlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxID0gaWRldi0+d29ya2luZ19yZXF1ZXN0OworCisJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKK30KKwogZW51bSBzY2lfc3RhdHVzIHNjaV9yZW1vdGVfZGV2aWNlX2V2ZW50X2hhbmRsZXIoc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiwKIAkJCQkJCSAgICAgdTMyIGV2ZW50X2NvZGUpCiB7CkBAIC00MzIsNiArNDQ0LDE2IEBACiAJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKIAorCWlmIChzdGF0ZSA9PSBTQ0lfU1RQX0RFVl9BVEFQSV9FUlJPUikgeworCQkvKiBGb3IgQVRBUEkgZXJyb3Igc3RhdGUgcmVzdW1lIHRoZSBSTkMgcmlnaHQgYXdheS4gKi8KKwkJaWYgKHNjdV9nZXRfZXZlbnRfdHlwZShldmVudF9jb2RlKSA9PSBTQ1VfRVZFTlRfVFlQRV9STkNfU1VTUEVORF9UWCB8fAorCQkgICAgc2N1X2dldF9ldmVudF90eXBlKGV2ZW50X2NvZGUpID09IFNDVV9FVkVOVF9UWVBFX1JOQ19TVVNQRU5EX1RYX1JYKSB7CisJCQlyZXR1cm4gc2NpX3JlbW90ZV9ub2RlX2NvbnRleHRfcmVzdW1lKCZpZGV2LT5ybmMsCisJCQkJCQkJICAgICAgYXRhcGlfcmVtb3RlX2RldmljZV9yZXN1bWVfZG9uZSwKKwkJCQkJCQkgICAgICBpZGV2KTsKKwkJfQorCX0KKwogCWlmIChzdGF0ZSA9PSBTQ0lfU1RQX0RFVl9JRExFKSB7CiAKIAkJLyogV2UgcGljayB1cCBzdXNwZW5zaW9uIGV2ZW50cyB0byBoYW5kbGUgc3BlY2lmaWNhbGx5IHRvIHRoaXMKQEAgLTYyNSw2ICs2NDcsNyBAQAogCWNhc2UgU0NJX1NUUF9ERVZfQ01EOgogCWNhc2UgU0NJX1NUUF9ERVZfTkNROgogCWNhc2UgU0NJX1NUUF9ERVZfTkNRX0VSUk9SOgorCWNhc2UgU0NJX1NUUF9ERVZfQVRBUElfRVJST1I6CiAJCXN0YXR1cyA9IGNvbW1vbl9jb21wbGV0ZV9pbyhpcG9ydCwgaWRldiwgaXJlcSk7CiAJCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCiAJCQlicmVhazsKQEAgLTEwMjAsNiArMTA0Myw3IEBACiAJW1NDSV9TVFBfREVWX05DUV9FUlJPUl0gPSB7CiAJCS5lbnRlcl9zdGF0ZSA9IHNjaV9zdHBfcmVtb3RlX2RldmljZV9yZWFkeV9uY3FfZXJyb3Jfc3Vic3RhdGVfZW50ZXIsCiAJfSwKKwlbU0NJX1NUUF9ERVZfQVRBUElfRVJST1JdID0geyB9LAogCVtTQ0lfU1RQX0RFVl9BV0FJVF9SRVNFVF0gPSB7IH0sCiAJW1NDSV9TTVBfREVWX0lETEVdID0gewogCQkuZW50ZXJfc3RhdGUgPSBzY2lfc21wX3JlbW90ZV9kZXZpY2VfcmVhZHlfaWRsZV9zdWJzdGF0ZV9lbnRlciwKQEAgLTE0MTQsODggKzE0MzgsMyBAQAogCiAJcmV0dXJuIHN0YXR1cyA9PSBTQ0lfU1VDQ0VTUyA/IDAgOiAtRU5PREVWOwogfQotLyoqCi0gKiBpc2NpX2RldmljZV9pc19yZXNldF9wZW5kaW5nKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYW55Ci0gKiAgICBwZW5kaW5nIHJlc2V0IGNvbmRpdGlvbiBvbiB0aGUgZGV2aWNlLgotICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBpc2NpX2RldmljZSBvYmplY3QuCi0gKgotICogdHJ1ZSBpZiB0aGVyZSBpcyBhIHJlc2V0IHBlbmRpbmcgZm9yIHRoZSBkZXZpY2UuCi0gKi8KLWJvb2wgaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZygKLQlzdHJ1Y3QgaXNjaV9ob3N0ICppc2NpX2hvc3QsCi0Jc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaXNjaV9kZXZpY2UpCi17Ci0Jc3RydWN0IGlzY2lfcmVxdWVzdCAqaXNjaV9yZXF1ZXN0OwotCXN0cnVjdCBpc2NpX3JlcXVlc3QgKnRtcF9yZXE7Ci0JYm9vbCByZXNldF9pc19wZW5kaW5nID0gZmFsc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAotCQkiJXM6IGlzY2lfZGV2aWNlID0gJXBcbiIsIF9fZnVuY19fLCBpc2NpX2RldmljZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQotCS8qIENoZWNrIGZvciByZXNldCBvbiBhbGwgcGVuZGluZyByZXF1ZXN0cy4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXNjaV9yZXF1ZXN0LCB0bXBfcmVxLAotCQkJCSAmaXNjaV9kZXZpY2UtPnJlcXNfaW5fcHJvY2VzcywgZGV2X25vZGUpIHsKLQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IGlzY2lfZGV2aWNlID0gJXAgcmVxdWVzdCA9ICVwXG4iLAotCQkJX19mdW5jX18sIGlzY2lfZGV2aWNlLCBpc2NpX3JlcXVlc3QpOwotCi0JCWlmIChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spIHsKLQkJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzaygKLQkJCQlpc2NpX3JlcXVlc3QpOwotCi0JCQlzcGluX2xvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCQlpZiAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX05FRURfREVWX1JFU0VUKQotCQkJCXJlc2V0X2lzX3BlbmRpbmcgPSB0cnVlOwotCQkJc3Bpbl91bmxvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwotCi0JZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCSIlczogaXNjaV9kZXZpY2UgPSAlcCByZXNldF9pc19wZW5kaW5nID0gJWRcbiIsCi0JCV9fZnVuY19fLCBpc2NpX2RldmljZSwgcmVzZXRfaXNfcGVuZGluZyk7Ci0KLQlyZXR1cm4gcmVzZXRfaXNfcGVuZGluZzsKLX0KLQotLyoqCi0gKiBpc2NpX2RldmljZV9jbGVhcl9yZXNldF9wZW5kaW5nKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xlYXIgaWYgYW55IHBlbmRpbmcKLSAqICAgIHJlc2V0IGNvbmRpdGlvbiBmbGFncyBvbiB0aGUgZGV2aWNlLgotICogQHJlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBpc2NpX2RldmljZSBvYmplY3QuCi0gKgotICogdHJ1ZSBpZiB0aGVyZSBpcyBhIHJlc2V0IHBlbmRpbmcgZm9yIHRoZSBkZXZpY2UuCi0gKi8KLXZvaWQgaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKLXsKLQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppc2NpX3JlcXVlc3Q7Ci0Jc3RydWN0IGlzY2lfcmVxdWVzdCAqdG1wX3JlcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogaWRldj0lcCwgaWhvc3Q9JXBcbiIsCi0JCSBfX2Z1bmNfXywgaWRldiwgaWhvc3QpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLQotCS8qIENsZWFyIHJlc2V0IHBlbmRpbmcgb24gYWxsIHBlbmRpbmcgcmVxdWVzdHMuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlzY2lfcmVxdWVzdCwgdG1wX3JlcSwKLQkJCQkgJmlkZXYtPnJlcXNfaW5fcHJvY2VzcywgZGV2X25vZGUpIHsKLQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwgIiVzOiBpZGV2ID0gJXAgcmVxdWVzdCA9ICVwXG4iLAotCQkJIF9fZnVuY19fLCBpZGV2LCBpc2NpX3JlcXVlc3QpOwotCi0JCWlmIChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spIHsKLQotCQkJdW5zaWduZWQgbG9uZyBmbGFnczI7Ci0JCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soCi0JCQkJaXNjaV9yZXF1ZXN0KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MyKTsKLQkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX05FRURfREVWX1JFU0VUOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFnczIpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9kZXZpY2UuaAppbmRleCA1N2NjZmMzLi40ODNlZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfZGV2aWNlLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX2RldmljZS5oCkBAIC0xMzIsMTAgKzEzMiw3IEBACiAJCQkJICAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7CiB2b2lkIGlzY2lfcmVtb3RlX2RldmljZV9nb25lKHN0cnVjdCBkb21haW5fZGV2aWNlICpkb21haW5fZGV2KTsKIGludCBpc2NpX3JlbW90ZV9kZXZpY2VfZm91bmQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRvbWFpbl9kZXYpOwotYm9vbCBpc2NpX2RldmljZV9pc19yZXNldF9wZW5kaW5nKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LAotCQkJCSAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldik7Ci12b2lkIGlzY2lfZGV2aWNlX2NsZWFyX3Jlc2V0X3BlbmRpbmcoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCi0JCQkJICAgICBzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2KTsKKwogLyoqCiAgKiBzY2lfcmVtb3RlX2RldmljZV9zdG9wKCkgLSBUaGlzIG1ldGhvZCB3aWxsIHN0b3AgYm90aCB0cmFuc21pc3Npb24gYW5kCiAgKiAgICByZWNlcHRpb24gb2YgbGluayBhY3Rpdml0eSBmb3IgdGhlIHN1cHBsaWVkIHJlbW90ZSBkZXZpY2UuICBUaGlzIG1ldGhvZApAQCAtMjQ0LDYgKzI0MSwxNSBAQAogCVNDSV9TVFBfREVWX05DUV9FUlJPUiwKIAogCS8qKgorCSAqIFRoaXMgaXMgdGhlIEFUQVBJIGVycm9yIHN0YXRlIGZvciB0aGUgU1RQIEFUQVBJIHJlbW90ZSBkZXZpY2UuCisJICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4gQVRBUEkgZGV2aWNlIHNlbmRzIGVycm9yIHN0YXR1cyBGSVMKKwkgKiB3aXRob3V0IGRhdGEgd2hpbGUgdGhlIGRldmljZSBvYmplY3QgaXMgaW4gQ01EIHN0YXRlLgorCSAqIEEgc3VzcGVuc2lvbiBldmVudCBpcyBleHBlY3RlZCBpbiB0aGlzIHN0YXRlLgorCSAqIFRoZSBkZXZpY2Ugb2JqZWN0IHdpbGwgcmVzdW1lIHJpZ2h0IGF3YXkuCisJICovCisJU0NJX1NUUF9ERVZfQVRBUElfRVJST1IsCisKKwkvKioKIAkgKiBUaGlzIGlzIHRoZSBSRUFEWSBzdWJzdGF0ZSBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyB3YWl0aW5nIGZvciB0aGUgUkVTRVQgdGFzawogCSAqIGNvbWluZyB0byBiZSByZWNvdmVyZWQgZnJvbSBjZXJ0YWluIGhhcmR3YXJlIHNwZWNpZmljIGVycm9yLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5jCmluZGV4IGI1ZDNhOGMuLjE5MmNiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCiAJdGFza19pdS0+dGFza19mdW5jID0gaXNjaV90bWYtPnRtZl9jb2RlOwogCXRhc2tfaXUtPnRhc2tfdGFnID0KLQkJKGlyZXEtPnR0eXBlID09IHRtZl90YXNrKSA/CisJCSh0ZXN0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKSkgPwogCQlpc2NpX3RtZi0+aW9fdGFnIDoKIAkJU0NJX0NPTlRST0xMRVJfSU5WQUxJRF9JT19UQUc7CiB9CkBAIC00ODEsNyArNDgxLDI5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzY2lfYXRhcGlfY29uc3RydWN0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGhvc3RfdG9fZGV2X2ZpcyAqaDJkX2ZpcyA9ICZpcmVxLT5zdHAuY21kOworCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKIAorCS8qIFRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiB3ZSB0YWtlIGFkdmFudGFnZSBvZiB0aGUKKwkgKiBzaWxpY29uJ3MgcGFydGlhbCBhY2NlbGVyYXRpb24gb2YgYXRhcGkgcHJvdG9jb2wgKGRtYSBkYXRhCisJICogdHJhbnNmZXJzKSwgc28gd2UgcHJvbW90ZSBhbGwgY29tbWFuZHMgdG8gZG1hIHByb3RvY29sLiAgVGhpcworCSAqIGJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggQVRBX0hPUktBR0VfQVRBUElfTU9EMTZfRE1BIGRyaXZlcy4KKwkgKi8KKwloMmRfZmlzLT5mZWF0dXJlcyB8PSBBVEFQSV9QS1RfRE1BOworCisJc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOworCisJdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpCisJCXRhc2stPnRvdGFsX3hmZXJfbGVuID0gMDsKKworCS8qIGNsZWFyIHRoZSByZXNwb25zZSBzbyB3ZSBjYW4gZGV0ZWN0IGFycml2aWFsIG9mIGFuCisJICogdW5zb2xpY2l0ZWQgaDJkIGZpcworCSAqLworCWlyZXEtPnN0cC5yc3AuZmlzX3R5cGUgPSAwOworfQogCiBzdGF0aWMgZW51bSBzY2lfc3RhdHVzCiBzY2lfaW9fcmVxdWVzdF9jb25zdHJ1Y3Rfc2F0YShzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLApAQCAtNDkxLDkgKzUxMywxMCBAQAogewogCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKIAlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2UtPmRvbWFpbl9kZXY7CiAKIAkvKiBjaGVjayBmb3IgbWFuYWdlbWVudCBwcm90b2NvbHMgKi8KLQlpZiAoaXJlcS0+dHR5cGUgPT0gdG1mX3Rhc2spIHsKKwlpZiAodGVzdF9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncykpIHsKIAkJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKIAogCQlpZiAodG1mLT50bWZfY29kZSA9PSBpc2NpX3RtZl9zYXRhX3Nyc3RfaGlnaCB8fApAQCAtNTE5LDYgKzU0MiwxMyBAQAogCiAJfQogCisJLyogQVRBUEkgKi8KKwlpZiAoZGV2LT5zYXRhX2Rldi5jb21tYW5kX3NldCA9PSBBVEFQSV9DT01NQU5EX1NFVCAmJgorCSAgICB0YXNrLT5hdGFfdGFzay5maXMuY29tbWFuZCA9PSBBVEFfQ01EX1BBQ0tFVCkgeworCQlzY2lfYXRhcGlfY29uc3RydWN0KGlyZXEpOworCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CisJfQorCiAJLyogbm9uIGRhdGEgKi8KIAlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpIHsKIAkJc2N1X3N0cF9yYXdfcmVxdWVzdF9jb25zdHJ1Y3RfdGFza19jb250ZXh0KGlyZXEpOwpAQCAtNjAyLDcgKzYzMiw3IEBACiAJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOwogCiAJLyogY2hlY2sgZm9yIG1hbmFnZW1lbnQgcHJvdG9jb2xzICovCi0JaWYgKGlyZXEtPnR0eXBlID09IHRtZl90YXNrKSB7CisJaWYgKHRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKSB7CiAJCXN0cnVjdCBpc2NpX3RtZiAqdG1mID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSk7CiAKIAkJaWYgKHRtZi0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2hpZ2ggfHwKQEAgLTYyNyw3ICs2NTcsNyBAQAogCiAvKioKICAqIHNjaV9yZXFfdHhfYnl0ZXMgLSBieXRlcyB0cmFuc2ZlcnJlZCB3aGVuIHJlcGx5IHVuZGVycnVucyByZXF1ZXN0Ci0gKiBAc2NpX3JlcTogcmVxdWVzdCB0aGF0IHdhcyB0ZXJtaW5hdGVkIGVhcmx5CisgKiBAaXJlcTogcmVxdWVzdCB0aGF0IHdhcyB0ZXJtaW5hdGVkIGVhcmx5CiAgKi8KICNkZWZpbmUgU0NVX1RBU0tfQ09OVEVYVF9TUkFNIDB4MjAwMDAwCiBzdGF0aWMgdTMyIHNjaV9yZXFfdHhfYnl0ZXMoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKQEAgLTcyOSw2ICs3NTksMTAgQEAKIAljYXNlIFNDSV9SRVFfU1RQX1NPRlRfUkVTRVRfV0FJVF9IMkRfQVNTRVJURUQ6CiAJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfSDJEX0RJQUc6CiAJY2FzZSBTQ0lfUkVRX1NUUF9TT0ZUX1JFU0VUX1dBSVRfRDJIOgorCWNhc2UgU0NJX1JFUV9BVEFQSV9XQUlUX0gyRDoKKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9QSU9fU0VUVVA6CisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfRDJIOgorCWNhc2UgU0NJX1JFUV9BVEFQSV9XQUlUX1RDX0NPTVA6CiAJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0FCT1JUSU5HKTsKIAkJcmV0dXJuIFNDSV9TVUNDRVNTOwogCWNhc2UgU0NJX1JFUV9UQVNLX1dBSVRfVENfUkVTUDoKQEAgLTExOTQsOCArMTIyOCw4IEBACiB7CiAJc3RydWN0IGlzY2lfc3RwX3JlcXVlc3QgKnN0cF9yZXEgPSAmaXJlcS0+c3RwLnJlcTsKIAlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50X3BhaXIgKnNnbF9wYWlyOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKIAlzdHJ1Y3Qgc2N1X3NnbF9lbGVtZW50ICpzZ2w7Ci0JZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKIAl1MzIgb2Zmc2V0OwogCXUzMiBsZW4gPSAwOwogCkBAIC0xMjQ5LDcgKzEyODMsNyBAQAogICovCiBzdGF0aWMgZW51bSBzY2lfc3RhdHVzCiBzY2lfc3RwX3JlcXVlc3RfcGlvX2RhdGFfaW5fY29weV9kYXRhX2J1ZmZlcihzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCAqc3RwX3JlcSwKLQkJCQkJCSAgdTggKmRhdGFfYnVmLCB1MzIgbGVuKQorCQkJCQkgICAgIHU4ICpkYXRhX2J1ZiwgdTMyIGxlbikKIHsKIAlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxOwogCXU4ICpzcmNfYWRkcjsKQEAgLTE0MjMsNiArMTQ1NywxMjggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgZW51bSBzY2lfc3RhdHVzIHByb2Nlc3NfdW5zb2xpY2l0ZWRfZmlzKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCSAgICAgICB1MzIgZnJhbWVfaW5kZXgpCit7CisJc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QgPSBpcmVxLT5vd25pbmdfY29udHJvbGxlcjsKKwllbnVtIHNjaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgKmZyYW1lX2hlYWRlcjsKKwl1MzIgKmZyYW1lX2J1ZmZlcjsKKworCXN0YXR1cyA9IHNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAorCQkJCQkJCSAgZnJhbWVfaW5kZXgsCisJCQkJCQkJICAodm9pZCAqKikmZnJhbWVfaGVhZGVyKTsKKworCWlmIChzdGF0dXMgIT0gU0NJX1NVQ0NFU1MpCisJCXJldHVybiBzdGF0dXM7CisKKwlpZiAoZnJhbWVfaGVhZGVyLT5maXNfdHlwZSAhPSBGSVNfUkVHRDJIKSB7CisJCWRldl9lcnIoJmlyZXEtPmlzY2lfaG9zdC0+cGRldi0+ZGV2LAorCQkJIiVzIEVSUk9SOiBpbnZhbGlkIGZpcyB0eXBlIDB4JVhcbiIsCisJCQlfX2Z1bmNfXywgZnJhbWVfaGVhZGVyLT5maXNfdHlwZSk7CisJCXJldHVybiBTQ0lfRkFJTFVSRTsKKwl9CisKKwlzY2lfdW5zb2xpY2l0ZWRfZnJhbWVfY29udHJvbF9nZXRfYnVmZmVyKCZpaG9zdC0+dWZfY29udHJvbCwKKwkJCQkJCSBmcmFtZV9pbmRleCwKKwkJCQkJCSAodm9pZCAqKikmZnJhbWVfYnVmZmVyKTsKKworCXNjaV9jb250cm9sbGVyX2NvcHlfc2F0YV9yZXNwb25zZSgmaXJlcS0+c3RwLnJzcCwKKwkJCQkJICAodTMyICopZnJhbWVfaGVhZGVyLAorCQkJCQkgIGZyYW1lX2J1ZmZlcik7CisKKwkvKiBGcmFtZSBoYXMgYmVlbiBkZWNvZGVkIHJldHVybiBpdCB0byB0aGUgY29udHJvbGxlciAqLworCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBlbnVtIHNjaV9zdGF0dXMgYXRhcGlfZDJoX3JlZ19mcmFtZV9oYW5kbGVyKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCisJCQkJCQkgICB1MzIgZnJhbWVfaW5kZXgpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOworCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBwcm9jZXNzX3Vuc29saWNpdGVkX2ZpcyhpcmVxLCBmcmFtZV9pbmRleCk7CisKKwlpZiAoc3RhdHVzID09IFNDSV9TVUNDRVNTKSB7CisJCWlmIChpcmVxLT5zdHAucnNwLnN0YXR1cyAmIEFUQV9FUlIpCisJCQlzdGF0dXMgPSBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRDsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBTQ0lfSU9fRkFJTFVSRV9SRVNQT05TRV9WQUxJRDsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFNDSV9TVUNDRVNTKSB7CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQlpcmVxLT5zY2lfc3RhdHVzID0gc3RhdHVzOworCX0gZWxzZSB7CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwl9CisKKwkvKiB0aGUgZDJoIHVmaSBpcyB0aGUgZW5kIG9mIG5vbi1kYXRhIGNvbW1hbmRzICovCisJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKQorCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgc2N1X2F0YXBpX3JlY29uc3RydWN0X3Jhd19mcmFtZV90YXNrX2NvbnRleHQoc3RydWN0IGlzY2lfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gc2FzX3RvX2F0YV9kZXYoaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2Rldik7CisJdm9pZCAqYXRhcGlfY2RiID0gaXJlcS0+dHR5cGVfcHRyLmlvX3Rhc2tfcHRyLT5hdGFfdGFzay5hdGFwaV9wYWNrZXQ7CisJc3RydWN0IHNjdV90YXNrX2NvbnRleHQgKnRhc2tfY29udGV4dCA9IGlyZXEtPnRjOworCisJLyogZmlsbCBpbiB0aGUgU0NVIFRhc2sgQ29udGV4dCBmb3IgYSBEQVRBIGZpcyBjb250YWluaW5nIENEQiBpbiBSYXcgRnJhbWUKKwkgKiB0eXBlLiBUaGUgVEMgZm9yIHByZXZpb3VzIFBhY2tldCBmaXMgd2FzIGFscmVhZHkgdGhlcmUsIHdlIG9ubHkgbmVlZCB0bworCSAqIGNoYW5nZSB0aGUgSDJEIGZpcyBjb250ZW50LgorCSAqLworCW1lbXNldCgmaXJlcS0+c3RwLmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBob3N0X3RvX2Rldl9maXMpKTsKKwltZW1jcHkoKCh1OCAqKSZpcmVxLT5zdHAuY21kICsgc2l6ZW9mKHUzMikpLCBhdGFwaV9jZGIsIEFUQVBJX0NEQl9MRU4pOworCW1lbXNldCgmKHRhc2tfY29udGV4dC0+dHlwZS5zdHApLCAwLCBzaXplb2Yoc3RydWN0IHN0cF90YXNrX2NvbnRleHQpKTsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3RwLmZpc190eXBlID0gRklTX0RBVEE7CisJdGFza19jb250ZXh0LT50cmFuc2Zlcl9sZW5ndGhfYnl0ZXMgPSBkZXYtPmNkYl9sZW47Cit9CisKK3N0YXRpYyB2b2lkIHNjdV9hdGFwaV9jb25zdHJ1Y3RfdGFza19jb250ZXh0KHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHNhc190b19hdGFfZGV2KGlyZXEtPnRhcmdldF9kZXZpY2UtPmRvbWFpbl9kZXYpOworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKwlzdHJ1Y3Qgc2N1X3Rhc2tfY29udGV4dCAqdGFza19jb250ZXh0ID0gaXJlcS0+dGM7CisJaW50IGNkYl9sZW4gPSBkZXYtPmNkYl9sZW47CisKKwkvKiByZWZlcmVuY2U6IFNTVEwgMS4xMy40LjIKKwkgKiB0YXNrX3R5cGUsIHNhdGFfZGlyZWN0aW9uCisJICovCisJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJdGFza19jb250ZXh0LT50YXNrX3R5cGUgPSBTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfT1VUOworCQl0YXNrX2NvbnRleHQtPnNhdGFfZGlyZWN0aW9uID0gMDsKKwl9IGVsc2UgeworCQkvKiB0b2RvOiBmb3IgTk9fREFUQSBjb21tYW5kLCB3ZSBuZWVkIHRvIHNlbmQgb3V0IHJhdyBmcmFtZS4gKi8KKwkJdGFza19jb250ZXh0LT50YXNrX3R5cGUgPSBTQ1VfVEFTS19UWVBFX1BBQ0tFVF9ETUFfSU47CisJCXRhc2tfY29udGV4dC0+c2F0YV9kaXJlY3Rpb24gPSAxOworCX0KKworCW1lbXNldCgmdGFza19jb250ZXh0LT50eXBlLnN0cCwgMCwgc2l6ZW9mKHRhc2tfY29udGV4dC0+dHlwZS5zdHApKTsKKwl0YXNrX2NvbnRleHQtPnR5cGUuc3RwLmZpc190eXBlID0gRklTX0RBVEE7CisKKwltZW1zZXQoJmlyZXEtPnN0cC5jbWQsIDAsIHNpemVvZihpcmVxLT5zdHAuY21kKSk7CisJbWVtY3B5KCZpcmVxLT5zdHAuY21kLmxiYWwsIHRhc2stPmF0YV90YXNrLmF0YXBpX3BhY2tldCwgY2RiX2xlbik7CisJdGFza19jb250ZXh0LT5zc3BfY29tbWFuZF9pdV9sZW5ndGggPSBjZGJfbGVuIC8gc2l6ZW9mKHUzMik7CisKKwkvKiB0YXNrIHBoYXNlIGlzIHNldCB0byBUWF9DTUQgKi8KKwl0YXNrX2NvbnRleHQtPnRhc2tfcGhhc2UgPSAweDE7CisKKwkvKiByZXRyeSBjb3VudGVyICovCisJdGFza19jb250ZXh0LT5zdHBfcmV0cnlfY291bnQgPSAwOworCisJLyogZGF0YSB0cmFuc2ZlciBzaXplLiAqLworCXRhc2tfY29udGV4dC0+dHJhbnNmZXJfbGVuZ3RoX2J5dGVzID0gdGFzay0+dG90YWxfeGZlcl9sZW47CisKKwkvKiBzZXR1cCBzZ2wgKi8KKwlzY2lfcmVxdWVzdF9idWlsZF9zZ2woaXJlcSk7Cit9CisKIGVudW0gc2NpX3N0YXR1cwogc2NpX2lvX3JlcXVlc3RfZnJhbWVfaGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAogCQkJCSAgdTMyIGZyYW1lX2luZGV4KQpAQCAtMTQ5MCwyOSArMTY0NiwzMCBAQAogCQlyZXR1cm4gU0NJX1NVQ0NFU1M7CiAKIAljYXNlIFNDSV9SRVFfU01QX1dBSVRfUkVTUDogewotCQlzdHJ1Y3Qgc21wX3Jlc3AgKnJzcF9oZHIgPSAmaXJlcS0+c21wLnJzcDsKLQkJdm9pZCAqZnJhbWVfaGVhZGVyOworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmdGFzay0+c21wX3Rhc2suc21wX3Jlc3A7CisJCXZvaWQgKmZyYW1lX2hlYWRlciwgKmthZGRyOworCQl1OCAqcnNwOwogCiAJCXNjaV91bnNvbGljaXRlZF9mcmFtZV9jb250cm9sX2dldF9oZWFkZXIoJmlob3N0LT51Zl9jb250cm9sLAotCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAotCQkJCQkJCSAgICAgICZmcmFtZV9oZWFkZXIpOworCQkJCQkJCSBmcmFtZV9pbmRleCwKKwkJCQkJCQkgJmZyYW1lX2hlYWRlcik7CisJCWthZGRyID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyksIEtNX0lSUTApOworCQlyc3AgPSBrYWRkciArIHNnLT5vZmZzZXQ7CisJCXNjaV9zd2FiMzJfY3B5KHJzcCwgZnJhbWVfaGVhZGVyLCAxKTsKIAotCQkvKiBieXRlIHN3YXAgdGhlIGhlYWRlci4gKi8KLQkJd29yZF9jbnQgPSBTTVBfUkVTUF9IRFJfU1ogLyBzaXplb2YodTMyKTsKLQkJc2NpX3N3YWIzMl9jcHkocnNwX2hkciwgZnJhbWVfaGVhZGVyLCB3b3JkX2NudCk7Ci0KLQkJaWYgKHJzcF9oZHItPmZyYW1lX3R5cGUgPT0gU01QX1JFU1BPTlNFKSB7CisJCWlmIChyc3BbMF0gPT0gU01QX1JFU1BPTlNFKSB7CiAJCQl2b2lkICpzbXBfcmVzcDsKIAogCQkJc2NpX3Vuc29saWNpdGVkX2ZyYW1lX2NvbnRyb2xfZ2V0X2J1ZmZlcigmaWhvc3QtPnVmX2NvbnRyb2wsCi0JCQkJCQkJCSAgICAgIGZyYW1lX2luZGV4LAotCQkJCQkJCQkgICAgICAmc21wX3Jlc3ApOworCQkJCQkJCQkgZnJhbWVfaW5kZXgsCisJCQkJCQkJCSAmc21wX3Jlc3ApOwogCi0JCQl3b3JkX2NudCA9IChzaXplb2Yoc3RydWN0IHNtcF9yZXNwKSAtIFNNUF9SRVNQX0hEUl9TWikgLwotCQkJCXNpemVvZih1MzIpOwotCi0JCQlzY2lfc3dhYjMyX2NweSgoKHU4ICopIHJzcF9oZHIpICsgU01QX1JFU1BfSERSX1NaLAotCQkJCSAgICAgICBzbXBfcmVzcCwgd29yZF9jbnQpOworCQkJd29yZF9jbnQgPSAoc2ctPmxlbmd0aC80KS0xOworCQkJaWYgKHdvcmRfY250ID4gMCkKKwkJCQl3b3JkX2NudCA9IG1pbl90KHVuc2lnbmVkIGludCwgd29yZF9jbnQsCisJCQkJCQkgU0NVX1VOU09MSUNJVEVEX0ZSQU1FX0JVRkZFUl9TSVpFLzQpOworCQkJc2NpX3N3YWIzMl9jcHkocnNwICsgNCwgc21wX3Jlc3AsIHdvcmRfY250KTsKIAogCQkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKIAkJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKQEAgLTE1MjgsMTIgKzE2ODUsMTMgQEAKIAkJCQlfX2Z1bmNfXywKIAkJCQlpcmVxLAogCQkJCWZyYW1lX2luZGV4LAotCQkJCXJzcF9oZHItPmZyYW1lX3R5cGUpOworCQkJCXJzcFswXSk7CiAKIAkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX1NNUF9GUk1fVFlQRV9FUlI7CiAJCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CiAJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9DT01QTEVURUQpOwogCQl9CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX0lSUTApOwogCiAJCXNjaV9jb250cm9sbGVyX3JlbGVhc2VfZnJhbWUoaWhvc3QsIGZyYW1lX2luZGV4KTsKIApAQCAtMTgzMyw2ICsxOTkxLDI0IEBACiAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfUElPX1NFVFVQOiB7CisJCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKTsKKworCQlzY2lfY29udHJvbGxlcl9yZWxlYXNlX2ZyYW1lKGlob3N0LCBmcmFtZV9pbmRleCk7CisJCWlyZXEtPnRhcmdldF9kZXZpY2UtPndvcmtpbmdfcmVxdWVzdCA9IGlyZXE7CisJCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfTk9ORSkgeworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQVRBUElfV0FJVF9UQ19DT01QKTsKKwkJCXNjdV9hdGFwaV9yZWNvbnN0cnVjdF9yYXdfZnJhbWVfdGFza19jb250ZXh0KGlyZXEpOworCQl9IGVsc2UgeworCQkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQVRBUElfV0FJVF9EMkgpOworCQkJc2N1X2F0YXBpX2NvbnN0cnVjdF90YXNrX2NvbnRleHQoaXJlcSk7CisJCX0KKworCQlzY2lfY29udHJvbGxlcl9jb250aW51ZV9pbyhpcmVxKTsKKwkJcmV0dXJuIFNDSV9TVUNDRVNTOworCX0KKwljYXNlIFNDSV9SRVFfQVRBUElfV0FJVF9EMkg6CisJCXJldHVybiBhdGFwaV9kMmhfcmVnX2ZyYW1lX2hhbmRsZXIoaXJlcSwgZnJhbWVfaW5kZXgpOwogCWNhc2UgU0NJX1JFUV9BQk9SVElORzoKIAkJLyoKIAkJICogVE9ETzogSXMgaXQgZXZlbiBwb3NzaWJsZSB0byBnZXQgYW4gdW5zb2xpY2l0ZWQgZnJhbWUgaW4gdGhlCkBAIC0xODk4LDEwICsyMDc0LDkgQEAKIAljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfTUFYX1BMRF9FUlIpOgogCWNhc2UgU0NVX01BS0VfQ09NUExFVElPTl9TVEFUVVMoU0NVX1RBU0tfRE9ORV9MTF9SX0VSUik6CiAJY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NNRF9MTF9SX0VSUik6Ci0JY2FzZSBTQ1VfTUFLRV9DT01QTEVUSU9OX1NUQVRVUyhTQ1VfVEFTS19ET05FX0NSQ19FUlIpOgogCQlzY2lfcmVtb3RlX2RldmljZV9zdXNwZW5kKGlyZXEtPnRhcmdldF9kZXZpY2UsCiAJCQlTQ1VfRVZFTlRfU1BFQ0lGSUMoU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpKSk7Ci0JLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGNhc2UgKi8KKwkJLyogRmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGNhc2UgKi8KIAlkZWZhdWx0OgogCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLiAqLwogCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOwpAQCAtMTk2NCw2ICsyMTM5LDExMiBAQAogCXJldHVybiBTQ0lfU1VDQ0VTUzsKIH0KIAorc3RhdGljIGVudW0gc2NpX3N0YXR1cyBhdGFwaV9yYXdfY29tcGxldGlvbihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLCB1MzIgY29tcGxldGlvbl9jb2RlLAorCQkJCQkJICBlbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIG5leHQpCit7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIFNDVV9NQUtFX0NPTVBMRVRJT05fU1RBVFVTKFNDVV9UQVNLX0RPTkVfR09PRCk6CisJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0dPT0Q7CisJCWlyZXEtPnNjaV9zdGF0dXMgPSBTQ0lfU1VDQ0VTUzsKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIG5leHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXIgY29tcGxldGlvbiBzdGF0dXMgY2F1c2UgdGhlIElPIHRvIGJlIGNvbXBsZXRlLgorCQkgKiBJZiBhIE5BSyB3YXMgcmVjZWl2ZWQsIHRoZW4gaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gcmV0cnkKKwkJICogdGhlIHJlcXVlc3QuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX05PUk1BTElaRV9DT01QTEVUSU9OX1NUQVRVUyhjb21wbGV0aW9uX2NvZGUpOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX0ZBSUxVUkVfQ09OVFJPTExFUl9TUEVDSUZJQ19JT19FUlI7CisKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGVudW0gc2NpX3N0YXR1cyBhdGFwaV9kYXRhX3RjX2NvbXBsZXRpb25faGFuZGxlcihzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxLAorCQkJCQkJCXUzMiBjb21wbGV0aW9uX2NvZGUpCit7CisJc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldiA9IGlyZXEtPnRhcmdldF9kZXZpY2U7CisJc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZDJoID0gJmlyZXEtPnN0cC5yc3A7CisJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyA9IFNDSV9TVUNDRVNTOworCisJc3dpdGNoIChTQ1VfR0VUX0NPTVBMRVRJT05fVExfU1RBVFVTKGNvbXBsZXRpb25fY29kZSkpIHsKKwljYXNlIChTQ1VfVEFTS19ET05FX0dPT0QgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaXJlcS0+c20sIFNDSV9SRVFfQ09NUExFVEVEKTsKKwkJYnJlYWs7CisKKwljYXNlIChTQ1VfVEFTS19ET05FX1VORVhQX0ZJUyA8PCBTQ1VfQ09NUExFVElPTl9UTF9TVEFUVVNfU0hJRlQpOiB7CisJCXUxNiBsZW4gPSBzY2lfcmVxX3R4X2J5dGVzKGlyZXEpOworCisJCS8qIGxpa2VseSBub24tZXJyb3IgZGF0YSB1bmRlcnJydW4sIHdvcmthcm91bmQgbWlzc2luZworCQkgKiBkMmggZnJhbWUgZnJvbSB0aGUgY29udHJvbGxlcgorCQkgKi8KKwkJaWYgKGQyaC0+ZmlzX3R5cGUgIT0gRklTX1JFR0QySCkgeworCQkJZDJoLT5maXNfdHlwZSA9IEZJU19SRUdEMkg7CisJCQlkMmgtPmZsYWdzID0gKDEgPDwgNik7CisJCQlkMmgtPnN0YXR1cyA9IDB4NTA7CisJCQlkMmgtPmVycm9yID0gMDsKKwkJCWQyaC0+bGJhbCA9IDA7CisJCQlkMmgtPmJ5dGVfY291bnRfbG93ID0gbGVuICYgMHhmZjsKKwkJCWQyaC0+Ynl0ZV9jb3VudF9oaWdoID0gbGVuID4+IDg7CisJCQlkMmgtPmRldmljZSA9IDB4YTA7CisJCQlkMmgtPmxiYWxfZXhwID0gMDsKKwkJCWQyaC0+bGJhbV9leHAgPSAwOworCQkJZDJoLT5sYmFoX2V4cCA9IDA7CisJCQlkMmgtPl9yX2EgPSAwOworCQkJZDJoLT5zZWN0b3JfY291bnQgPSAweDM7CisJCQlkMmgtPnNlY3Rvcl9jb3VudF9leHAgPSAwOworCQkJZDJoLT5fcl9iID0gMDsKKwkJCWQyaC0+X3JfYyA9IDA7CisJCQlkMmgtPl9yX2QgPSAwOworCQl9CisKKwkJaXJlcS0+c2N1X3N0YXR1cyA9IFNDVV9UQVNLX0RPTkVfR09PRDsKKwkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9TVUNDRVNTX0lPX0RPTkVfRUFSTFk7CisJCXN0YXR1cyA9IGlyZXEtPnNjaV9zdGF0dXM7CisKKwkJLyogdGhlIGh3IHdpbGwgaGF2ZSBzdXNwZW5kZWQgdGhlIHJuYywgc28gY29tcGxldGUgdGhlCisJCSAqIHJlcXVlc3QgdXBvbiBwZW5kaW5nIHJlc3VtZQorCQkgKi8KKwkJc2NpX2NoYW5nZV9zdGF0ZSgmaWRldi0+c20sIFNDSV9TVFBfREVWX0FUQVBJX0VSUk9SKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgKFNDVV9UQVNLX0RPTkVfRVhDRVNTX0RBVEEgPDwgU0NVX0NPTVBMRVRJT05fVExfU1RBVFVTX1NISUZUKToKKwkJLyogSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBubyBVRiBjb21pbmcgYWZ0ZXIuCisJCSAqIGNvbXBlbHRlIHRoZSBJTyBub3cuCisJCSAqLworCQlpcmVxLT5zY3Vfc3RhdHVzID0gU0NVX1RBU0tfRE9ORV9HT09EOworCQlpcmVxLT5zY2lfc3RhdHVzID0gU0NJX1NVQ0NFU1M7CisJCXNjaV9jaGFuZ2Vfc3RhdGUoJmlyZXEtPnNtLCBTQ0lfUkVRX0NPTVBMRVRFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKGQyaC0+ZmlzX3R5cGUgPT0gRklTX1JFR0QySCkgeworCQkJLyogVUYgcmVjZWl2ZWQgY2hhbmdlIHRoZSBkZXZpY2Ugc3RhdGUgdG8gQVRBUElfRVJST1IgKi8KKwkJCXN0YXR1cyA9IGlyZXEtPnNjaV9zdGF0dXM7CisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpZGV2LT5zbSwgU0NJX1NUUF9ERVZfQVRBUElfRVJST1IpOworCQl9IGVsc2UgeworCQkJLyogSWYgcmVjZWl2aW5nIGFueSBub24tc3VjZXNzIFRDIHN0YXR1cywgbm8gVUYKKwkJCSAqIHJlY2VpdmVkIHlldCwgdGhlbiBhbiBVRiBmb3IgdGhlIHN0YXR1cyBmaXMKKwkJCSAqIGlzIGNvbWluZyBhZnRlciAoWFhYOiBzdXNwZWN0IHRoaXMgaXMKKwkJCSAqIGFjdHVhbGx5IGEgcHJvdG9jb2wgZXJyb3Igb3IgYSBidWcgbGlrZSB0aGUKKwkJCSAqIERPTkVfVU5FWFBfRklTIGNhc2UpCisJCQkgKi8KKwkJCWlyZXEtPnNjdV9zdGF0dXMgPSBTQ1VfVEFTS19ET05FX0NIRUNLX1JFU1BPTlNFOworCQkJaXJlcS0+c2NpX3N0YXR1cyA9IFNDSV9GQUlMVVJFX0lPX1JFU1BPTlNFX1ZBTElEOworCisJCQlzY2lfY2hhbmdlX3N0YXRlKCZpcmVxLT5zbSwgU0NJX1JFUV9BVEFQSV9XQUlUX0QySCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwogZW51bSBzY2lfc3RhdHVzCiBzY2lfaW9fcmVxdWVzdF90Y19jb21wbGV0aW9uKHN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEsCiAJCQkJICB1MzIgY29tcGxldGlvbl9jb2RlKQpAQCAtMjAxNSw2ICsyMjk2LDE3IEBACiAJCXJldHVybiByZXF1ZXN0X2Fib3J0aW5nX3N0YXRlX3RjX2V2ZW50KGlyZXEsCiAJCQkJCQkgICAgICAgY29tcGxldGlvbl9jb2RlKTsKIAorCWNhc2UgU0NJX1JFUV9BVEFQSV9XQUlUX0gyRDoKKwkJcmV0dXJuIGF0YXBpX3Jhd19jb21wbGV0aW9uKGlyZXEsIGNvbXBsZXRpb25fY29kZSwKKwkJCQkJICAgIFNDSV9SRVFfQVRBUElfV0FJVF9QSU9fU0VUVVApOworCisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfVENfQ09NUDoKKwkJcmV0dXJuIGF0YXBpX3Jhd19jb21wbGV0aW9uKGlyZXEsIGNvbXBsZXRpb25fY29kZSwKKwkJCQkJICAgIFNDSV9SRVFfQVRBUElfV0FJVF9EMkgpOworCisJY2FzZSBTQ0lfUkVRX0FUQVBJX1dBSVRfRDJIOgorCQlyZXR1cm4gYXRhcGlfZGF0YV90Y19jb21wbGV0aW9uX2hhbmRsZXIoaXJlcSwgY29tcGxldGlvbl9jb2RlKTsKKwogCWRlZmF1bHQ6CiAJCWRldl93YXJuKCZpaG9zdC0+cGRldi0+ZGV2LAogCQkJICIlczogU0NJQyBJTyBSZXF1ZXN0IGdpdmVuIHRhc2sgY29tcGxldGlvbiAiCkBAIC0yMzM4LDE0ICsyNjMwLDggQEAKIAlzd2l0Y2ggKHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbikgewogCiAJY2FzZSBpc2NpX3BlcmZvcm1fbm9ybWFsX2lvX2NvbXBsZXRpb246Ci0KIAkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLwotCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IE5vcm1hbCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCXRhc2ssCi0JCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKLQkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQsIHN0YXR1cyk7CisKIAkJLyogQWRkIHRvIHRoZSBjb21wbGV0ZWQgbGlzdC4gKi8KIAkJbGlzdF9hZGQoJnJlcXVlc3QtPmNvbXBsZXRlZF9ub2RlLAogCQkJICZob3N0LT5yZXF1ZXN0c190b19jb21wbGV0ZSk7CkBAIC0yMzU4LDEzICsyNjQ0LDYgQEAKIAkJLyogTm8gbm90aWZpY2F0aW9uIHRvIGxpYnNhcyBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcwogCQkgKiBhbHJlYWR5IGluIHRoZSBhYm9ydCBwYXRoLgogCQkgKi8KLQkJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LAotCQkJICIlczogQWJvcnRlZCAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgdGFzaywKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOwotCiAJCS8qIFdha2UgdXAgd2hhdGV2ZXIgcHJvY2VzcyB3YXMgd2FpdGluZyBmb3IgdGhpcwogCQkgKiByZXF1ZXN0IHRvIGNvbXBsZXRlLgogCQkgKi8KQEAgLTIzODEsMzAgKzI2NjAsMjIgQEAKIAogCWNhc2UgaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb246CiAJCS8qIFVzZSBzYXNfdGFza19hYm9ydCAqLwotCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCi0JCQkgIiVzOiBFcnJvciAtIHRhc2sgPSAlcCwgcmVzcG9uc2U9JWQgKCVkKSwgc3RhdHVzPSVkICglZClcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgdGFzaywKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCByZXNwb25zZSwKLQkJCSB0YXNrLT50YXNrX3N0YXR1cy5zdGF0LCBzdGF0dXMpOwogCQkvKiBBZGQgdG8gdGhlIGFib3J0ZWQgbGlzdC4gKi8KIAkJbGlzdF9hZGQoJnJlcXVlc3QtPmNvbXBsZXRlZF9ub2RlLAogCQkJICZob3N0LT5yZXF1ZXN0c190b19lcnJvcmJhY2spOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwKLQkJCSAiJXM6IFVua25vd24gLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAotCQkJIF9fZnVuY19fLAotCQkJIHRhc2ssCi0JCQkgdGFzay0+dGFza19zdGF0dXMucmVzcCwgcmVzcG9uc2UsCi0JCQkgdGFzay0+dGFza19zdGF0dXMuc3RhdCwgc3RhdHVzKTsKLQogCQkvKiBBZGQgdG8gdGhlIGVycm9yIHRvIGxpYnNhcyBsaXN0LiAqLwogCQlsaXN0X2FkZCgmcmVxdWVzdC0+Y29tcGxldGVkX25vZGUsCiAJCQkgJmhvc3QtPnJlcXVlc3RzX3RvX2Vycm9yYmFjayk7CiAJCWJyZWFrOwogCX0KKwlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsCisJCSIlczogJWQgLSB0YXNrID0gJXAsIHJlc3BvbnNlPSVkICglZCksIHN0YXR1cz0lZCAoJWQpXG4iLAorCQlfX2Z1bmNfXywgdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uLCB0YXNrLAorCQkodGFzaykgPyB0YXNrLT50YXNrX3N0YXR1cy5yZXNwIDogMCwgcmVzcG9uc2UsCisJCSh0YXNrKSA/IHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgOiAwLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgdm9pZCBpc2NpX3Byb2Nlc3Nfc3RwX3Jlc3BvbnNlKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgc3RydWN0IGRldl90b19ob3N0X2ZpcyAqZmlzKQpAQCAtMjQyMSw2ICsyNjkyLDggQEAKIAkgKi8KIAlpZiAoZmlzLT5zdGF0dXMgJiBBVEFfREYpCiAJCXRzLT5zdGF0ID0gU0FTX1BST1RPX1JFU1BPTlNFOworCWVsc2UgaWYgKGZpcy0+c3RhdHVzICYgQVRBX0VSUikKKwkJdHMtPnN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJZWxzZQogCQl0cy0+c3RhdCA9IFNBTV9TVEFUX0dPT0Q7CiAKQEAgLTI0MzQsOSArMjcwNyw5IEBACiAJc3RydWN0IHNhc190YXNrICp0YXNrID0gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKHJlcXVlc3QpOwogCXN0cnVjdCBzc3BfcmVzcG9uc2VfaXUgKnJlc3BfaXU7CiAJdW5zaWduZWQgbG9uZyB0YXNrX2ZsYWdzOwotCXN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYgPSBpc2NpX2xvb2t1cF9kZXZpY2UodGFzay0+ZGV2KTsKLQllbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UgICAgICAgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKLQllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cyAgICAgICAgID0gU0FTX0FCT1JURURfVEFTSzsKKwlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2ID0gcmVxdWVzdC0+dGFyZ2V0X2RldmljZTsKKwllbnVtIHNlcnZpY2VfcmVzcG9uc2UgcmVzcG9uc2UgPSBTQVNfVEFTS19VTkRFTElWRVJFRDsKKwllbnVtIGV4ZWNfc3RhdHVzIHN0YXR1cyA9IFNBU19BQk9SVEVEX1RBU0s7CiAJZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHJlcXVlc3Rfc3RhdHVzOwogCWVudW0gaXNjaV9jb21wbGV0aW9uX3NlbGVjdGlvbiBjb21wbGV0ZV90b19ob3N0CiAJCT0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOwpAQCAtMjYwMywxOCArMjg3Niw3IEBACiAJCQlzdGF0dXMgICA9IFNBTV9TVEFUX0dPT0Q7CiAJCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmcmVxdWVzdC0+ZmxhZ3MpOwogCi0JCQlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7Ci0JCQkJdm9pZCAqcnNwID0gJnJlcXVlc3QtPnNtcC5yc3A7Ci0KLQkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJCQkiJXM6IFNNUCBwcm90b2NvbCBjb21wbGV0aW9uXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0KLQkJCQlzZ19jb3B5X2Zyb21fYnVmZmVyKAotCQkJCQkmdGFzay0+c21wX3Rhc2suc21wX3Jlc3AsIDEsCi0JCQkJCXJzcCwgc2l6ZW9mKHN0cnVjdCBzbXBfcmVzcCkpOwotCQkJfSBlbHNlIGlmIChjb21wbGV0aW9uX3N0YXR1cwotCQkJCSAgID09IFNDSV9JT19TVUNDRVNTX0lPX0RPTkVfRUFSTFkpIHsKKwkJCWlmIChjb21wbGV0aW9uX3N0YXR1cyA9PSBTQ0lfSU9fU1VDQ0VTU19JT19ET05FX0VBUkxZKSB7CiAKIAkJCQkvKiBUaGlzIHdhcyBhbiBTU1AgLyBTVFAgLyBTQVRBIHRyYW5zZmVyLgogCQkJCSAqIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBsZXNzIGRhdGEgdGhhbgpAQCAtMjc3OCw3ICszMDQwLDYgQEAKIAogCS8qIGNvbXBsZXRlIHRoZSBpbyByZXF1ZXN0IHRvIHRoZSBjb3JlLiAqLwogCXNjaV9jb250cm9sbGVyX2NvbXBsZXRlX2lvKGlob3N0LCByZXF1ZXN0LT50YXJnZXRfZGV2aWNlLCByZXF1ZXN0KTsKLQlpc2NpX3B1dF9kZXZpY2UoaWRldik7CiAKIAkvKiBzZXQgdGVybWluYXRlZCBoYW5kbGUgc28gaXQgY2Fubm90IGJlIGNvbXBsZXRlZCBvcgogCSAqIHRlcm1pbmF0ZWQgYWdhaW4sIGFuZCB0byBjYXVzZSBhbnkgY2FsbHMgaW50byBhYm9ydApAQCAtMjc5MSwzNyArMzA1Miw0MiBAQAogewogCXN0cnVjdCBpc2NpX3JlcXVlc3QgKmlyZXEgPSBjb250YWluZXJfb2Yoc20sIHR5cGVvZigqaXJlcSksIHNtKTsKIAlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaXJlcS0+dGFyZ2V0X2RldmljZS0+ZG9tYWluX2RldjsKKwllbnVtIHNjaV9iYXNlX3JlcXVlc3Rfc3RhdGVzIHN0YXRlOwogCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKIAogCS8qIFhYWCBhcyBoY2ggc2FpZCBhbHdheXMgY3JlYXRpbmcgYW4gaW50ZXJuYWwgc2FzX3Rhc2sgZm9yIHRtZgogCSAqIHJlcXVlc3RzIHdvdWxkIHNpbXBsaWZ5IHRoZSBkcml2ZXIKIAkgKi8KLQl0YXNrID0gaXJlcS0+dHR5cGUgPT0gaW9fdGFzayA/IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKSA6IE5VTEw7CisJdGFzayA9ICh0ZXN0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKSkgPyBOVUxMIDogaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlyZXEpOwogCiAJLyogYWxsIHVuYWNjZWxlcmF0ZWQgcmVxdWVzdCB0eXBlcyAobm9uIHNzcCBvciBuY3EpIGhhbmRsZWQgd2l0aAogCSAqIHN1YnN0YXRlcwogCSAqLwogCWlmICghdGFzayAmJiBkZXYtPmRldl90eXBlID09IFNBU19FTkRfREVWKSB7Ci0JCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVApOworCQlzdGF0ZSA9IFNDSV9SRVFfVEFTS19XQUlUX1RDX0NPTVA7CiAJfSBlbHNlIGlmICghdGFzayAmJgogCQkgICAoaXNjaV9yZXF1ZXN0X2FjY2Vzc190bWYoaXJlcSktPnRtZl9jb2RlID09IGlzY2lfdG1mX3NhdGFfc3JzdF9oaWdoIHx8CiAJCSAgICBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKS0+dG1mX2NvZGUgPT0gaXNjaV90bWZfc2F0YV9zcnN0X2xvdykpIHsKLQkJc2NpX2NoYW5nZV9zdGF0ZShzbSwgU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRCk7CisJCXN0YXRlID0gU0NJX1JFUV9TVFBfU09GVF9SRVNFVF9XQUlUX0gyRF9BU1NFUlRFRDsKIAl9IGVsc2UgaWYgKHRhc2sgJiYgdGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QKSB7Ci0JCXNjaV9jaGFuZ2Vfc3RhdGUoc20sIFNDSV9SRVFfU01QX1dBSVRfUkVTUCk7CisJCXN0YXRlID0gU0NJX1JFUV9TTVBfV0FJVF9SRVNQOwogCX0gZWxzZSBpZiAodGFzayAmJiBzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pICYmCiAJCSAgICF0YXNrLT5hdGFfdGFzay51c2VfbmNxKSB7Ci0JCXUzMiBzdGF0ZTsKLQotCQlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX05PTkUpCisJCWlmIChkZXYtPnNhdGFfZGV2LmNvbW1hbmRfc2V0ID09IEFUQVBJX0NPTU1BTkRfU0VUICYmCisJCQl0YXNrLT5hdGFfdGFzay5maXMuY29tbWFuZCA9PSBBVEFfQ01EX1BBQ0tFVCkgeworCQkJc3RhdGUgPSBTQ0lfUkVRX0FUQVBJX1dBSVRfSDJEOworCQl9IGVsc2UgaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9OT05FKSB7CiAJCQlzdGF0ZSA9IFNDSV9SRVFfU1RQX05PTl9EQVRBX1dBSVRfSDJEOwotCQllbHNlIGlmICh0YXNrLT5hdGFfdGFzay5kbWFfeGZlcikKKwkJfSBlbHNlIGlmICh0YXNrLT5hdGFfdGFzay5kbWFfeGZlcikgewogCQkJc3RhdGUgPSBTQ0lfUkVRX1NUUF9VRE1BX1dBSVRfVENfQ09NUDsKLQkJZWxzZSAvKiBQSU8gKi8KKwkJfSBlbHNlIC8qIFBJTyAqLyB7CiAJCQlzdGF0ZSA9IFNDSV9SRVFfU1RQX1BJT19XQUlUX0gyRDsKLQotCQlzY2lfY2hhbmdlX3N0YXRlKHNtLCBzdGF0ZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTU1Agb3IgTkNRIGFyZSBmdWxseSBhY2NlbGVyYXRlZCwgbm8gc3Vic3RhdGVzICovCisJCXJldHVybjsKIAl9CisJc2NpX2NoYW5nZV9zdGF0ZShzbSwgc3RhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBzY2lfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdGVfZW50ZXIoc3RydWN0IHNjaV9iYXNlX3N0YXRlX21hY2hpbmUgKnNtKQpAQCAtMjkxMyw2ICszMTc5LDEwIEBACiAJW1NDSV9SRVFfVEFTS19XQUlUX1RDX1JFU1BdID0geyB9LAogCVtTQ0lfUkVRX1NNUF9XQUlUX1JFU1BdID0geyB9LAogCVtTQ0lfUkVRX1NNUF9XQUlUX1RDX0NPTVBdID0geyB9LAorCVtTQ0lfUkVRX0FUQVBJX1dBSVRfSDJEXSA9IHsgfSwKKwlbU0NJX1JFUV9BVEFQSV9XQUlUX1BJT19TRVRVUF0gPSB7IH0sCisJW1NDSV9SRVFfQVRBUElfV0FJVF9EMkhdID0geyB9LAorCVtTQ0lfUkVRX0FUQVBJX1dBSVRfVENfQ09NUF0gPSB7IH0sCiAJW1NDSV9SRVFfQ09NUExFVEVEXSA9IHsKIAkJLmVudGVyX3N0YXRlID0gc2NpX3JlcXVlc3RfY29tcGxldGVkX3N0YXRlX2VudGVyLAogCX0sCkBAIC0zMjcyLDcgKzM1NDIsNyBAQAogCiAJaXJlcSA9IGlzY2lfcmVxdWVzdF9mcm9tX3RhZyhpaG9zdCwgdGFnKTsKIAlpcmVxLT50dHlwZV9wdHIuaW9fdGFza19wdHIgPSB0YXNrOwotCWlyZXEtPnR0eXBlID0gaW9fdGFzazsKKwljbGVhcl9iaXQoSVJFUV9UTUYsICZpcmVxLT5mbGFncyk7CiAJdGFzay0+bGxkZF90YXNrID0gaXJlcTsKIAogCXJldHVybiBpcmVxOwpAQCAtMzI4Niw3ICszNTU2LDcgQEAKIAogCWlyZXEgPSBpc2NpX3JlcXVlc3RfZnJvbV90YWcoaWhvc3QsIHRhZyk7CiAJaXJlcS0+dHR5cGVfcHRyLnRtZl90YXNrX3B0ciA9IGlzY2lfdG1mOwotCWlyZXEtPnR0eXBlID0gdG1mX3Rhc2s7CisJc2V0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKTsKIAogCXJldHVybiBpcmVxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5oIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVxdWVzdC5oCmluZGV4IDdhMWQ1YTkuLmJlMzg5MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlcXVlc3QuaAorKysgYi9kcml2ZXJzL3Njc2kvaXNjaS9yZXF1ZXN0LmgKQEAgLTc3LDExICs3Nyw2IEBACiAJZGVhZCAgICAgICAgPSAweDA3CiB9OwogCi1lbnVtIHRhc2tfdHlwZSB7Ci0JaW9fdGFzayAgPSAwLAotCXRtZl90YXNrID0gMQotfTsKLQogZW51bSBzY2lfcmVxdWVzdF9wcm90b2NvbCB7CiAJU0NJQ19OT19QUk9UT0NPTCwKIAlTQ0lDX1NNUF9QUk9UT0NPTCwKQEAgLTk2LDcgKzkxLDYgQEAKICAqCSAgICAgdG8gd2FpdCBmb3IgYW5vdGhlciBmaXMgb3IgaWYgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLiAgVXBvbgogICogICAgICAgICAgIHJlY2VpcHQgb2YgYSBkMmggZmlzIHRoaXMgd2lsbCBiZSB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoYXQgZmlzLgogICogQHNnbCAtIHRyYWNrIHBpbyB0cmFuc2ZlciBwcm9ncmVzcyBhcyB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIHNnbAotICogQGRldmljZV9jZGJfbGVuIC0gYXRhcGkgZGV2aWNlIGFkdmVydGlzZXMgaXQncyB0cmFuc2ZlciBjb25zdHJhaW50cyBhdCBzZXR1cAogICovCiBzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCB7CiAJdTMyIHBpb19sZW47CkBAIC0xMDcsNyArMTAxLDYgQEAKIAkJdTggc2V0OwogCQl1MzIgb2Zmc2V0OwogCX0gc2dsOwotCXUzMiBkZXZpY2VfY2RiX2xlbjsKIH07CiAKIHN0cnVjdCBpc2NpX3JlcXVlc3QgewpAQCAtMTE4LDcgKzExMSw2IEBACiAJI2RlZmluZSBJUkVRX0FDVElWRSAzCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkvKiBYWFgga2lsbCB0dHlwZSBhbmQgdHR5cGVfcHRyLCBhbGxvY2F0ZSBmdWxsIHNhc190YXNrICovCi0JZW51bSB0YXNrX3R5cGUgdHR5cGU7CiAJdW5pb24gdHR5cGVfcHRyX3VuaW9uIHsKIAkJc3RydWN0IHNhc190YXNrICppb190YXNrX3B0cjsgICAvKiBXaGVuIHR0eXBlPT1pb190YXNrICAqLwogCQlzdHJ1Y3QgaXNjaV90bWYgKnRtZl90YXNrX3B0cjsgIC8qIFdoZW4gdHR5cGU9PXRtZl90YXNrICovCkBAIC0xNzQsOSArMTY2LDYgQEAKIAkJCX07CiAJCX0gc3NwOwogCQlzdHJ1Y3QgewotCQkJc3RydWN0IHNtcF9yZXNwIHJzcDsKLQkJfSBzbXA7Ci0JCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgaXNjaV9zdHBfcmVxdWVzdCByZXE7CiAJCQlzdHJ1Y3QgaG9zdF90b19kZXZfZmlzIGNtZDsKIAkJCXN0cnVjdCBkZXZfdG9faG9zdF9maXMgcnNwOwpAQCAtMjUyLDYgKzI0MSwzMiBAQAogCVNDSV9SRVFfU1RQX1BJT19EQVRBX09VVCwKIAogCS8qCisJICogV2hpbGUgaW4gdGhpcyBzdGF0ZSB0aGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyBmb3IgdGhlIFRDCisJICogY29tcGxldGlvbiBub3RpZmljYXRpb24gZm9yIHRoZSBIMkQgUmVnaXN0ZXIgRklTCisJICovCisJU0NJX1JFUV9BVEFQSV9XQUlUX0gyRCwKKworCS8qCisJICogV2hpbGUgaW4gdGhpcyBzdGF0ZSB0aGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyBmb3IgZWl0aGVyIGEKKwkgKiBQSU8gU2V0dXAuCisJICovCisJU0NJX1JFUV9BVEFQSV9XQUlUX1BJT19TRVRVUCwKKworCS8qCisJICogVGhlIG5vbi1kYXRhIElPIHRyYW5zaXQgdG8gdGhpcyBzdGF0ZSBpbiB0aGlzIHN0YXRlIGFmdGVyIHJlY2VpdmluZworCSAqIFRDIGNvbXBsZXRpb24uIFdoaWxlIGluIHRoaXMgc3RhdGUgSU8gcmVxdWVzdCBvYmplY3QgaXMgd2FpdGluZyBmb3IKKwkgKiBEMkggc3RhdHVzIGZyYW1lIGFzIFVGLgorCSAqLworCVNDSV9SRVFfQVRBUElfV0FJVF9EMkgsCisKKwkvKgorCSAqIFdoZW4gdHJhbnNtaXR0aW5nIHJhdyBmcmFtZXMgaGFyZHdhcmUgcmVwb3J0cyB0YXNrIGNvbnRleHQgY29tcGxldGlvbgorCSAqIGFmdGVyIGV2ZXJ5IGZyYW1lIHN1Ym1pc3Npb24sIHNvIGluIHRoZSBub24tYWNjZWxlcmF0ZWQgY2FzZSB3ZSBuZWVkCisJICogdG8gZXhwZWN0IHRoZSBjb21wbGV0aW9uIGZvciB0aGUgImNkYiIgZnJhbWUuCisJICovCisJU0NJX1JFUV9BVEFQSV9XQUlUX1RDX0NPTVAsCisKKwkvKgogCSAqIFRoZSBBV0FJVF9UQ19DT01QTEVUSU9OIHN1Yi1zdGF0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhcnRlZCByYXcKIAkgKiB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZQogCSAqIGluaXRpYWwgZnJhbWUgKGkuZS4gY29tbWFuZCwgdGFzaywgZXRjLikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXNjaS9zYXMuaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oCmluZGV4IDQ2MmIxNTEuLmRjMjZiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NpL3Nhcy5oCkBAIC0yMDQsOCArMjA0LDYgQEAKIAl1OCByZXFfZGF0YVswXTsKIH0gIF9fcGFja2VkOwogCi0jZGVmaW5lIFNNUF9SRVNQX0hEUl9TWgk0Ci0KIC8qCiAgKiBzdHJ1Y3Qgc2NpX3Nhc19hZGRyZXNzIC0gVGhpcyBzdHJ1Y3R1cmUgZGVwaWN0cyBob3cgYSBTQVMgYWRkcmVzcyBpcwogICogICAgcmVwcmVzZW50ZWQgYnkgU0NJLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5jCmluZGV4IGQ2YmNkZDAuLjY2YWQzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suYworKysgYi9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmMKQEAgLTIxMiwxNiArMjEyLDI3IEBACiAJCQkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX0FUX0lOSVRJQVRPUjsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQkJCQkJLyogSW5kaWNhdGUgUVVFVUVfRlVMTCBzbyB0aGF0IHRoZSBzY3NpCi0JCQkJCSogbWlkbGF5ZXIgcmV0cmllcy4gaWYgdGhlIHJlcXVlc3QKLQkJCQkJKiBmYWlsZWQgZm9yIHJlbW90ZSBkZXZpY2UgcmVhc29ucywKLQkJCQkJKiBpdCBnZXRzIHJldHVybmVkIGFzCi0JCQkJCSogU0FTX1RBU0tfVU5ERUxJVkVSRUQgbmV4dCB0aW1lCi0JCQkJCSogdGhyb3VnaC4KLQkJCQkJKi8KLQkJCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywKLQkJCQkJCQkgU0FTX1RBU0tfQ09NUExFVEUsCi0JCQkJCQkJIFNBU19RVUVVRV9GVUxMKTsKKwkJCQkJaWYgKHRlc3RfYml0KElERVZfR09ORSwgJmlkZXYtPmZsYWdzKSkgeworCisJCQkJCQkvKiBJbmRpY2F0ZSB0aGF0IHRoZSBkZXZpY2UKKwkJCQkJCSAqIGlzIGdvbmUuCisJCQkJCQkgKi8KKwkJCQkJCWlzY2lfdGFza19yZWZ1c2UoaWhvc3QsIHRhc2ssCisJCQkJCQkJU0FTX1RBU0tfVU5ERUxJVkVSRUQsCisJCQkJCQkJU0FTX0RFVklDRV9VTktOT1dOKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIEluZGljYXRlIFFVRVVFX0ZVTEwgc28gdGhhdAorCQkJCQkJICogdGhlIHNjc2kgbWlkbGF5ZXIgcmV0cmllcy4KKwkJCQkJCSAqIElmIHRoZSByZXF1ZXN0IGZhaWxlZCBmb3IKKwkJCQkJCSAqIHJlbW90ZSBkZXZpY2UgcmVhc29ucywgaXQKKwkJCQkJCSAqIGdldHMgcmV0dXJuZWQgYXMKKwkJCQkJCSAqIFNBU19UQVNLX1VOREVMSVZFUkVEIG5leHQKKwkJCQkJCSAqIHRpbWUgdGhyb3VnaC4KKwkJCQkJCSAqLworCQkJCQkJaXNjaV90YXNrX3JlZnVzZShpaG9zdCwgdGFzaywKKwkJCQkJCQlTQVNfVEFTS19DT01QTEVURSwKKwkJCQkJCQlTQVNfUVVFVUVfRlVMTCk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTI0Myw3ICsyNTQsNyBAQAogCXN0cnVjdCBpc2NpX3RtZiAqaXNjaV90bWY7CiAJZW51bSBzY2lfc3RhdHVzIHN0YXR1czsKIAotCWlmICh0bWZfdGFzayAhPSBpcmVxLT50dHlwZSkKKwlpZiAoIXRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpKQogCQlyZXR1cm4gU0NJX0ZBSUxVUkU7CiAKIAlpc2NpX3RtZiA9IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdG1mKGlyZXEpOwpAQCAtMzI3LDYgKzMzOCw2MCBAQAogCXJldHVybiBpcmVxOwogfQogCisvKioKKyogaXNjaV9yZXF1ZXN0X21hcmtfem9tYmllKCkgLSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc2NpY19sb2NrIGhlbGQuCisqLworc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X21hcmtfem9tYmllKHN0cnVjdCBpc2NpX2hvc3QgKmlob3N0LCBzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBjb21wbGV0aW9uICp0bWZfY29tcGxldGlvbiA9IE5VTEw7CisJc3RydWN0IGNvbXBsZXRpb24gKnJlcV9jb21wbGV0aW9uOworCisJLyogU2V0IHRoZSByZXF1ZXN0IHN0YXRlIHRvICJkZWFkIi4gKi8KKwlpcmVxLT5zdGF0dXMgPSBkZWFkOworCisJcmVxX2NvbXBsZXRpb24gPSBpcmVxLT5pb19yZXF1ZXN0X2NvbXBsZXRpb247CisJaXJlcS0+aW9fcmVxdWVzdF9jb21wbGV0aW9uID0gTlVMTDsKKworCWlmICh0ZXN0X2JpdChJUkVRX1RNRiwgJmlyZXEtPmZsYWdzKSkgeworCQkvKiBCcmVhayBsaW5rcyB3aXRoIHRoZSBUTUYgcmVxdWVzdC4gKi8KKwkJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKKworCQkvKiBJbiB0aGUgY2FzZSB3aGVyZSBhIHRhc2sgcmVxdWVzdCBpcyBkeWluZywKKwkJICogdGhlIHRocmVhZCB3YWl0aW5nIG9uIHRoZSBjb21wbGV0ZSB3aWxsIHNpdCBhbmQKKwkJICogdGltZW91dCB1bmxlc3Mgd2Ugd2FrZSBpdCBub3cuICBTaW5jZSB0aGUgVE1GCisJCSAqIGhhcyBhIGRlZmF1bHQgZXJyb3Igc3RhdHVzLCBjb21wbGV0ZSBpdCBoZXJlCisJCSAqIHRvIHdha2UgdGhlIHdhaXRpbmcgdGhyZWFkLgorCQkgKi8KKwkJaWYgKHRtZikgeworCQkJdG1mX2NvbXBsZXRpb24gPSB0bWYtPmNvbXBsZXRlOworCQkJdG1mLT5jb21wbGV0ZSA9IE5VTEw7CisJCX0KKwkJaXJlcS0+dHR5cGVfcHRyLnRtZl90YXNrX3B0ciA9IE5VTEw7CisJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsICIlczogdG1mX2NvZGUgJWQsIG1hbmFnZWQgdGFnICUjeFxuIiwKKwkJCV9fZnVuY19fLCB0bWYtPnRtZl9jb2RlLCB0bWYtPmlvX3RhZyk7CisJfSBlbHNlIHsKKwkJLyogQnJlYWsgbGlua3Mgd2l0aCB0aGUgc2FzX3Rhc2sgLSB0aGUgY2FsbGJhY2sgaXMgZG9uZQorCQkgKiBlbHNld2hlcmUuCisJCSAqLworCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSk7CisKKwkJaWYgKHRhc2spCisJCQl0YXNrLT5sbGRkX3Rhc2sgPSBOVUxMOworCisJCWlyZXEtPnR0eXBlX3B0ci5pb190YXNrX3B0ciA9IE5VTEw7CisJfQorCisJZGV2X3dhcm4oJmlob3N0LT5wZGV2LT5kZXYsICJ0YXNrIGNvbnRleHQgdW5yZWNvdmVyYWJsZSAodGFnOiAlI3gpXG4iLAorCQkgaXJlcS0+aW9fdGFnKTsKKworCS8qIERvbid0IGZvcmNlIHdhaXRpbmcgdGhyZWFkcyB0byB0aW1lb3V0LiAqLworCWlmIChyZXFfY29tcGxldGlvbikKKwkJY29tcGxldGUocmVxX2NvbXBsZXRpb24pOworCisJaWYgKHRtZl9jb21wbGV0aW9uICE9IE5VTEwpCisJCWNvbXBsZXRlKHRtZl9jb21wbGV0aW9uKTsKK30KKwogc3RhdGljIGludCBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCiAJCQkJIHN0cnVjdCBpc2NpX3JlbW90ZV9kZXZpY2UgKmlkZXYsCiAJCQkJIHN0cnVjdCBpc2NpX3RtZiAqdG1mLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXMpCkBAIC0zNjQsNiArNDI5LDcgQEAKIAogCS8qIEFzc2lnbiB0aGUgcG9pbnRlciB0byB0aGUgVE1GJ3MgY29tcGxldGlvbiBrZXJuZWwgd2FpdCBzdHJ1Y3R1cmUuICovCiAJdG1mLT5jb21wbGV0ZSA9ICZjb21wbGV0aW9uOworCXRtZi0+c3RhdHVzID0gU0NJX0ZBSUxVUkVfVElNRU9VVDsKIAogCWlyZXEgPSBpc2NpX3Rhc2tfcmVxdWVzdF9idWlsZChpaG9zdCwgaWRldiwgdGFnLCB0bWYpOwogCWlmICghaXJlcSkKQEAgLTM5OSwxOCArNDY1LDM1IEBACiAJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpKTsKIAogCWlmICh0aW1lbGVmdCA9PSAwKSB7CisJCS8qIFRoZSBUTUYgZGlkIG5vdCBjb21wbGV0ZSAtIHRoaXMgY291bGQgYmUgYmVjYXVzZQorCQkgKiBvZiBhbiB1bnBsdWcuICBUZXJtaW5hdGUgdGhlIFRNRiByZXF1ZXN0IG5vdy4KKwkJICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHRtZi0+Y2Jfc3RhdGVfZnVuYyAhPSBOVUxMKQotCQkJdG1mLT5jYl9zdGF0ZV9mdW5jKGlzY2lfdG1mX3RpbWVkX291dCwgdG1mLCB0bWYtPmNiX2RhdGEpOworCQkJdG1mLT5jYl9zdGF0ZV9mdW5jKGlzY2lfdG1mX3RpbWVkX291dCwgdG1mLAorCQkJCQkgICB0bWYtPmNiX2RhdGEpOwogCi0JCXNjaV9jb250cm9sbGVyX3Rlcm1pbmF0ZV9yZXF1ZXN0KGlob3N0LAotCQkJCQkJICBpZGV2LAotCQkJCQkJICBpcmVxKTsKKwkJc2NpX2NvbnRyb2xsZXJfdGVybWluYXRlX3JlcXVlc3QoaWhvc3QsIGlkZXYsIGlyZXEpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKHRtZi0+Y29tcGxldGUpOworCQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCSZjb21wbGV0aW9uLAorCQkJbXNlY3NfdG9famlmZmllcyhJU0NJX1RFUk1JTkFUSU9OX1RJTUVPVVRfTVNFQykpOworCisJCWlmICghdGltZWxlZnQpIHsKKwkJCS8qIFN0cmFuZ2UgY29uZGl0aW9uIC0gdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBUTUYKKwkJCSAqIHJlcXVlc3QgdGltZWQtb3V0LgorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCisJCQkvKiBJZiB0aGUgVE1GIHN0YXR1cyBoYXMgbm90IGNoYW5nZWQsIGtpbGwgaXQuICovCisJCQlpZiAodG1mLT5zdGF0dXMgPT0gU0NJX0ZBSUxVUkVfVElNRU9VVCkKKwkJCQlpc2NpX3JlcXVlc3RfbWFya196b21iaWUoaWhvc3QsIGlyZXEpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CisJCX0KIAl9CiAKIAlpc2NpX3ByaW50X3RtZih0bWYpOwpAQCAtNTAxLDQ4ICs1ODQsMTcgQEAKIAlyZXR1cm4gb2xkX3N0YXRlOwogfQogCi0vKioKLSogaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKCkgLSBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mCi0qICAgIHRoZSBmaW5hbCBjbGVhbnVwIG9uIGFueSByZXF1ZXN0IHdoaWNoIGhhcyBiZWVuIGV4cGxpY2l0bHkgdGVybWluYXRlZC4KLSogQGlzY2lfaG9zdDogVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBJU0NJIGhvc3Qgb2JqZWN0Ci0qIEBpc2NpX2RldmljZTogVGhpcyBpcyB0aGUgZGV2aWNlIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIHBlbmRpbmcuCi0qIEBpc2NpX3JlcXVlc3Q6IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdGVybWluYXRlZCByZXF1ZXN0IG9iamVjdC4KLSogQHRhc2s6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZSBsaWJzYXMgSS9PIHJlcXVlc3QuCi0qLwotc3RhdGljIHZvaWQgaXNjaV9yZXF1ZXN0X2NsZWFudXBfY29tcGxldGVkX2xvaXRlcmVyKAotCXN0cnVjdCBpc2NpX2hvc3QgICAgICAgICAgKmlzY2lfaG9zdCwKLQlzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppc2NpX2RldmljZSwKLQlzdHJ1Y3QgaXNjaV9yZXF1ZXN0ICAgICAgICppc2NpX3JlcXVlc3QsCi0Jc3RydWN0IHNhc190YXNrICAgICAgICAgICAqdGFzaykKK3N0YXRpYyBpbnQgaXNjaV9yZXF1ZXN0X2lzX2RlYWxsb2NfbWFuYWdlZChlbnVtIGlzY2lfcmVxdWVzdF9zdGF0dXMgc3RhdCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCSIlczogaXNjaV9kZXZpY2U9JXAsIHJlcXVlc3Q9JXAsIHRhc2s9JXBcbiIsCi0JCV9fZnVuY19fLCBpc2NpX2RldmljZSwgaXNjaV9yZXF1ZXN0LCB0YXNrKTsKLQotCWlmICh0YXNrICE9IE5VTEwpIHsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCXRhc2stPmxsZGRfdGFzayA9IE5VTEw7Ci0KLQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7Ci0KLQkJaXNjaV9zZXRfdGFza19kb25lZmxhZ3ModGFzayk7Ci0KLQkJLyogSWYgdGhpcyB0YXNrIGlzIG5vdCBpbiB0aGUgYWJvcnQgcGF0aCwgY2FsbCB0YXNrX2RvbmUuICovCi0JCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgewotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJfSBlbHNlCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoaXNjaV9yZXF1ZXN0ICE9IE5VTEwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZGVsX2luaXQoJmlzY2lfcmVxdWVzdC0+ZGV2X25vZGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCXN3aXRjaCAoc3RhdCkgeworCWNhc2UgYWJvcnRlZDoKKwljYXNlIGFib3J0aW5nOgorCWNhc2UgdGVybWluYXRpbmc6CisJY2FzZSBjb21wbGV0ZWQ6CisJY2FzZSBkZWFkOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CiAJfQogfQogCkBAIC01NjMsMTEgKzYxNSw5IEBACiAJZW51bSBzY2lfc3RhdHVzIHN0YXR1cyAgICAgID0gU0NJX1NVQ0NFU1M7CiAJYm9vbCB3YXNfdGVybWluYXRlZCAgICAgICAgID0gZmFsc2U7CiAJYm9vbCBuZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gZmFsc2U7Ci0JZW51bSBpc2NpX3JlcXVlc3Rfc3RhdHVzIHJlcXVlc3Rfc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgICAgIHRlcm1pbmF0aW9uX2NvbXBsZXRlZCA9IDE7CiAJc3RydWN0IGNvbXBsZXRpb24gKmlvX3JlcXVlc3RfY29tcGxldGlvbjsKLQlzdHJ1Y3Qgc2FzX3Rhc2sgICAqdGFzazsKIAogCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCiAJCSIlczogZGV2aWNlID0gJXA7IHJlcXVlc3QgPSAlcFxuIiwKQEAgLTU3NywxMCArNjI3LDYgQEAKIAogCWlvX3JlcXVlc3RfY29tcGxldGlvbiA9IGlzY2lfcmVxdWVzdC0+aW9fcmVxdWVzdF9jb21wbGV0aW9uOwogCi0JdGFzayA9IChpc2NpX3JlcXVlc3QtPnR0eXBlID09IGlvX3Rhc2spCi0JCT8gaXNjaV9yZXF1ZXN0X2FjY2Vzc190YXNrKGlzY2lfcmVxdWVzdCkKLQkJOiBOVUxMOwotCiAJLyogTm90ZSB0aGF0IHdlIGFyZSBub3QgZ29pbmcgdG8gY29udHJvbAogCSAqIHRoZSB0YXJnZXQgdG8gYWJvcnQgdGhlIHJlcXVlc3QuCiAJICovCkBAIC02MTksNDIgKzY2NSwyNyBAQAogCQkJCV9fZnVuY19fLCBpc2NpX3JlcXVlc3QsIGlvX3JlcXVlc3RfY29tcGxldGlvbik7CiAKIAkJCS8qIFdhaXQgaGVyZSBmb3IgdGhlIHJlcXVlc3QgdG8gY29tcGxldGUuICovCi0JCQkjZGVmaW5lIFRFUk1JTkFUSU9OX1RJTUVPVVRfTVNFQyA1MDAKIAkJCXRlcm1pbmF0aW9uX2NvbXBsZXRlZAogCQkJCT0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAogCQkJCSAgIGlvX3JlcXVlc3RfY29tcGxldGlvbiwKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKFRFUk1JTkFUSU9OX1RJTUVPVVRfTVNFQykpOworCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoSVNDSV9URVJNSU5BVElPTl9USU1FT1VUX01TRUMpKTsKIAogCQkJaWYgKCF0ZXJtaW5hdGlvbl9jb21wbGV0ZWQpIHsKIAogCQkJCS8qIFRoZSByZXF1ZXN0IHRvIHRlcm1pbmF0ZSBoYXMgdGltZWQgb3V0LiAgKi8KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywKLQkJCQkJCSAgZmxhZ3MpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CiAKIAkJCQkvKiBDaGVjayBmb3Igc3RhdGUgY2hhbmdlcy4gKi8KLQkJCQlpZiAoIXRlc3RfYml0KElSRVFfVEVSTUlOQVRFRCwgJmlzY2lfcmVxdWVzdC0+ZmxhZ3MpKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChJUkVRX1RFUk1JTkFURUQsCisJCQkJCSAgICAgICZpc2NpX3JlcXVlc3QtPmZsYWdzKSkgewogCiAJCQkJCS8qIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBoYXZlIHRoZQogCQkJCQkgKiByZXF1ZXN0IGRpZSBhIHNpbGVudCBkZWF0aCBpZiBpdAogCQkJCQkgKiBldmVyIHJlYWxseSBjb21wbGV0ZXMuCi0JCQkJCSAqCi0JCQkJCSAqIFNldCB0aGUgcmVxdWVzdCBzdGF0ZSB0byAiZGVhZCIsCi0JCQkJCSAqIGFuZCBjbGVhciB0aGUgdGFzayBwb2ludGVyIHNvIHRoYXQKLQkJCQkJICogYW4gYWN0dWFsIGNvbXBsZXRpb24gZXZlbnQgY2FsbGJhY2sKLQkJCQkJICogZG9lc24ndCBkbyBhbnl0aGluZy4KIAkJCQkJICovCi0JCQkJCWlzY2lfcmVxdWVzdC0+c3RhdHVzID0gZGVhZDsKLQkJCQkJaXNjaV9yZXF1ZXN0LT5pb19yZXF1ZXN0X2NvbXBsZXRpb24KLQkJCQkJCT0gTlVMTDsKLQotCQkJCQlpZiAoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSB7Ci0KLQkJCQkJCS8qIEJyZWFrIGxpbmtzIHdpdGggdGhlCi0JCQkJCQkqIHNhc190YXNrLgotCQkJCQkJKi8KLQkJCQkJCWlzY2lfcmVxdWVzdC0+dHR5cGVfcHRyLmlvX3Rhc2tfcHRyCi0JCQkJCQkJPSBOVUxMOwotCQkJCQl9CisJCQkJCWlzY2lfcmVxdWVzdF9tYXJrX3pvbWJpZShpaG9zdCwKKwkJCQkJCQkJIGlzY2lfcmVxdWVzdCk7CisJCQkJCW5lZWRzX2NsZWFudXBfaGFuZGxpbmcgPSB0cnVlOwogCQkJCX0gZWxzZQogCQkJCQl0ZXJtaW5hdGlvbl9jb21wbGV0ZWQgPSAxOwogCkBAIC02OTEsMjkgKzcyMiwyOCBAQAogCQkJICogbmVlZHMgdG8gYmUgZGV0YWNoZWQgYW5kIGZyZWVkIGhlcmUuCiAJCQkgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpc2NpX3JlcXVlc3QtPnN0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCXJlcXVlc3Rfc3RhdHVzID0gaXNjaV9yZXF1ZXN0LT5zdGF0dXM7CiAKLQkJCWlmICgoaXNjaV9yZXF1ZXN0LT50dHlwZSA9PSBpb190YXNrKSAvKiBUTUZzIGFyZSBpbiB0aGVpciBvd24gdGhyZWFkICovCi0JCQkgICAgJiYgKChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGVkKQotCQkJCXx8IChyZXF1ZXN0X3N0YXR1cyA9PSBhYm9ydGluZykKLQkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gdGVybWluYXRpbmcpCi0JCQkJfHwgKHJlcXVlc3Rfc3RhdHVzID09IGNvbXBsZXRlZCkKLQkJCQl8fCAocmVxdWVzdF9zdGF0dXMgPT0gZGVhZCkKLQkJCQkpCi0JCQkgICAgKSB7CisJCQluZWVkc19jbGVhbnVwX2hhbmRsaW5nCisJCQkJPSBpc2NpX3JlcXVlc3RfaXNfZGVhbGxvY19tYW5hZ2VkKAorCQkJCQlpc2NpX3JlcXVlc3QtPnN0YXR1cyk7CiAKLQkJCQkvKiBUaGUgY29tcGxldGlvbiByb3V0aW5lIHdvbid0IGZyZWUgYSByZXF1ZXN0IGluCi0JCQkJICogdGhlIGFib3J0ZWQvYWJvcnRpbmcvZXRjLiBzdGF0ZXMsIHNvIHdlIGRvCi0JCQkJICogaXQgaGVyZS4KLQkJCQkgKi8KLQkJCQluZWVkc19jbGVhbnVwX2hhbmRsaW5nID0gdHJ1ZTsKLQkJCX0KIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzY2lfcmVxdWVzdC0+c3RhdGVfbG9jaywgZmxhZ3MpOwogCiAJCX0KLQkJaWYgKG5lZWRzX2NsZWFudXBfaGFuZGxpbmcpCi0JCQlpc2NpX3JlcXVlc3RfY2xlYW51cF9jb21wbGV0ZWRfbG9pdGVyZXIoCi0JCQkJaWhvc3QsIGlkZXYsIGlzY2lfcmVxdWVzdCwgdGFzayk7CisJCWlmIChuZWVkc19jbGVhbnVwX2hhbmRsaW5nKSB7CisKKwkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCisJCQkJIiVzOiBjbGVhbnVwIGlzY2lfZGV2aWNlPSVwLCByZXF1ZXN0PSVwXG4iLAorCQkJCV9fZnVuY19fLCBpZGV2LCBpc2NpX3JlcXVlc3QpOworCisJCQlpZiAoaXNjaV9yZXF1ZXN0ICE9IE5VTEwpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOworCQkJCWlzY2lfZnJlZV90YWcoaWhvc3QsIGlzY2lfcmVxdWVzdC0+aW9fdGFnKTsKKwkJCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlzY2lfcmVxdWVzdCwgdW5hbGxvY2F0ZWQpOworCQkJCWxpc3RfZGVsX2luaXQoJmlzY2lfcmVxdWVzdC0+ZGV2X25vZGUpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQogCX0KIH0KIApAQCAtNzcyLDcgKzgwMiw5IEBACiAJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCiAJCQkgIiVzOiBpZGV2PSVwIHJlcXVlc3Q9JXA7IHRhc2s9JXAgb2xkX3N0YXRlPSVkXG4iLAogCQkJIF9fZnVuY19fLCBpZGV2LCBpcmVxLAotCQkJaXJlcS0+dHR5cGUgPT0gaW9fdGFzayA/IGlzY2lfcmVxdWVzdF9hY2Nlc3NfdGFzayhpcmVxKSA6IE5VTEwsCisJCQkoIXRlc3RfYml0KElSRVFfVE1GLCAmaXJlcS0+ZmxhZ3MpCisJCQkJPyBpc2NpX3JlcXVlc3RfYWNjZXNzX3Rhc2soaXJlcSkKKwkJCQk6IE5VTEwpLAogCQkJb2xkX3N0YXRlKTsKIAogCQkvKiBJZiB0aGUgb2xkX3N0YXRlIGlzIHN0YXJ0ZWQ6CkBAIC04ODksMjIgKzkyMSwxNCBAQAogCQkiJXM6IGRvbWFpbl9kZXZpY2U9JXAsIGlzY2lfaG9zdD0lcDsgaXNjaV9kZXZpY2U9JXBcbiIsCiAJCSBfX2Z1bmNfXywgZG9tYWluX2RldmljZSwgaXNjaV9ob3N0LCBpc2NpX2RldmljZSk7CiAKLQlpZiAoaXNjaV9kZXZpY2UpCi0JCXNldF9iaXQoSURFVl9FSCwgJmlzY2lfZGV2aWNlLT5mbGFncyk7CisJaWYgKCFpc2NpX2RldmljZSkgeworCQkvKiBJZiB0aGUgZGV2aWNlIGlzIGdvbmUsIHN0b3AgdGhlIGVzY2FsYXRpb25zLiAqLworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwgIiVzOiBObyBkZXZcbiIsIF9fZnVuY19fKTsKIAotCS8qIElmIHRoZXJlIGlzIGEgZGV2aWNlIHJlc2V0IHBlbmRpbmcgb24gYW55IHJlcXVlc3QgaW4gdGhlCi0JICogZGV2aWNlJ3MgbGlzdCwgZmFpbCB0aGlzIExVTiByZXNldCByZXF1ZXN0IGluIG9yZGVyIHRvCi0JICogZXNjYWxhdGUgdG8gdGhlIGRldmljZSByZXNldC4KLQkgKi8KLQlpZiAoIWlzY2lfZGV2aWNlIHx8Ci0JICAgIGlzY2lfZGV2aWNlX2lzX3Jlc2V0X3BlbmRpbmcoaXNjaV9ob3N0LCBpc2NpX2RldmljZSkpIHsKLQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCQkgIiVzOiBObyBkZXYgKCVwKSwgb3IgIgotCQkJICJSRVNFVCBQRU5ESU5HOiBkb21haW5fZGV2aWNlPSVwXG4iLAotCQkJIF9fZnVuY19fLCBpc2NpX2RldmljZSwgZG9tYWluX2RldmljZSk7Ci0JCXJldCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwogCQlnb3RvIG91dDsKIAl9CisJc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKIAogCS8qIFNlbmQgdGhlIHRhc2sgbWFuYWdlbWVudCBwYXJ0IG9mIHRoZSByZXNldC4gKi8KIAlpZiAoc2FzX3Byb3RvY29sX2F0YShkb21haW5fZGV2aWNlLT50cHJvdG8pKSB7CkBAIC0xMDEzLDcgKzEwMzcsNyBAQAogCXN0cnVjdCBpc2NpX3RtZiAgICAgICAgICAgdG1mOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBmbGFnczsKLQlib29sICAgICAgICAgICAgICAgICAgICAgIGFueV9kZXZfcmVzZXQgPSBmYWxzZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1fdGVybWluYXRpb24gPSAwOwogCiAJLyogR2V0IHRoZSBpc2NpX3JlcXVlc3QgcmVmZXJlbmNlIGZyb20gdGhlIHRhc2suICBOb3RlIHRoYXQKIAkgKiB0aGlzIGNoZWNrIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgcGVuZGluZyByZXF1ZXN0IGxpc3QKQEAgLTEwMzUsODkgKzEwNTksMzQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCiAJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCSIlczogdGFzayA9ICVwXG4iLCBfX2Z1bmNfXywgdGFzayk7CisJCSIlczogZGV2ID0gJXAsIHRhc2sgPSAlcCwgb2xkX3JlcXVlc3QgPT0gJXBcbiIsCisJCV9fZnVuY19fLCBpc2NpX2RldmljZSwgdGFzaywgb2xkX3JlcXVlc3QpOwogCi0JaWYgKCFpc2NpX2RldmljZSB8fCAhb2xkX3JlcXVlc3QpCi0JCWdvdG8gb3V0OworCWlmIChpc2NpX2RldmljZSkKKwkJc2V0X2JpdChJREVWX0VILCAmaXNjaV9kZXZpY2UtPmZsYWdzKTsKIAotCXNldF9iaXQoSURFVl9FSCwgJmlzY2lfZGV2aWNlLT5mbGFncyk7Ci0KLQkvKiBUaGlzIHZlcnNpb24gb2YgdGhlIGRyaXZlciB3aWxsIGZhaWwgYWJvcnQgcmVxdWVzdHMgZm9yCi0JICogU0FUQS9TVFAuICBGYWlsaW5nIHRoZSBhYm9ydCByZXF1ZXN0IHRoaXMgd2F5IHdpbGwgY2F1c2UgdGhlCi0JICogU0NTSSBlcnJvciBoYW5kbGVyIHRocmVhZCB0byBlc2NhbGF0ZSB0byBMVU4gcmVzZXQKKwkvKiBEZXZpY2UgcmVzZXQgY29uZGl0aW9ucyBzaWduYWxsZWQgaW4gdGFza19zdGF0ZV9mbGFncyBhcmUgdGhlCisJICogcmVzcG9uc2JpbGl0eSBvZiBsaWJzYXMgdG8gb2JzZXJ2ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGVycm9yCisJICogaGFuZGxlciB0aHJlYWQuCiAJICovCi0JaWYgKHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKLQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCQkgICAgIiB0YXNrICVwIGlzIGZvciBhIFNUUC9TQVRBIGRldmljZTsiCi0JCQkgICAgIiByZXR1cm5pbmcgVE1GX1JFU1BfRlVOQ19GQUlMRURcbiIKLQkJCSAgICAiIHRvIGNhdXNlIGEgTFVOIHJlc2V0Li4uXG4iLCB0YXNrKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCSIlczogb2xkX3JlcXVlc3QgPT0gJXBcbiIsIF9fZnVuY19fLCBvbGRfcmVxdWVzdCk7Ci0KLQlhbnlfZGV2X3Jlc2V0ID0gaXNjaV9kZXZpY2VfaXNfcmVzZXRfcGVuZGluZyhpc2NpX2hvc3QsIGlzY2lfZGV2aWNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQotCWFueV9kZXZfcmVzZXQgPSBhbnlfZGV2X3Jlc2V0IHx8ICh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQpOwotCi0JLyogSWYgdGhlIGV4dHJhY3Rpb24gb2YgdGhlIHJlcXVlc3QgcmVmZXJlbmNlIGZyb20gdGhlIHRhc2sKLQkgKiBmYWlsZWQsIHRoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkIChvciBpZiB0aGVyZSBpcyBhCi0JICogcGVuZGluZyByZXNldCB0aGVuIHRoaXMgYWJvcnQgcmVxdWVzdCBmdW5jdGlvbiBtdXN0IGJlIGZhaWxlZAotCSAqIGluIG9yZGVyIHRvIGVzY2FsYXRlIHRvIHRoZSB0YXJnZXQgcmVzZXQpLgotCSAqLwotCWlmICgob2xkX3JlcXVlc3QgPT0gTlVMTCkgfHwgYW55X2Rldl9yZXNldCkgewotCi0JCS8qIElmIHRoZSBkZXZpY2UgcmVzZXQgdGFzayBmbGFnIGlzIHNldCwgZmFpbCB0aGUgdGFzawotCQkgKiBtYW5hZ2VtZW50IHJlcXVlc3QuICBPdGhlcndpc2UsIHRoZSBvcmlnaW5hbCByZXF1ZXN0Ci0JCSAqIGhhcyBjb21wbGV0ZWQuCi0JCSAqLwotCQlpZiAoYW55X2Rldl9yZXNldCkgewotCi0JCQkvKiBUdXJuIG9mZiB0aGUgdGFzaydzIERPTkUgdG8gbWFrZSBzdXJlIHRoaXMKLQkJCSAqIHRhc2sgaXMgZXNjYWxhdGVkIHRvIGEgdGFyZ2V0IHJlc2V0LgotCQkJICovCi0JCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH5TQVNfVEFTS19TVEFURV9ET05FOwotCi0JCQkvKiBNYWtlIHRoZSByZXNldCBoYXBwZW4gYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KLQkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQ7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCi0JCQkvKiBGYWlsIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdCBpbiBvcmRlciB0bwotCQkJICogZXNjYWxhdGUgdG8gdGhlIHRhcmdldCByZXNldC4KLQkJCSAqLwotCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7Ci0KLQkJCWRldl9kYmcoJmlzY2lfaG9zdC0+cGRldi0+ZGV2LAotCQkJCSIlczogRmFpbGluZyB0YXNrIGFib3J0IGluIG9yZGVyIHRvICIKLQkJCQkiZXNjYWxhdGUgdG8gdGFyZ2V0IHJlc2V0IGJlY2F1c2VcbiIKLQkJCQkiU0FTX1RBU0tfTkVFRF9ERVZfUkVTRVQgaXMgc2V0IGZvciAiCi0JCQkJInRhc2sgJXAgb24gZGV2ICVwXG4iLAotCQkJCV9fZnVuY19fLCB0YXNrLCBpc2NpX2RldmljZSk7Ci0KLQotCQl9IGVsc2UgewotCQkJLyogVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgY29tcGxldGVkIGFuZCB0aGVyZQotCQkJICogaXMgbm90aGluZyB0byBkbyBoZXJlIG90aGVyIHRoYW4gdG8gc2V0IHRoZSB0YXNrCi0JCQkgKiBkb25lIGJpdCwgYW5kIGluZGljYXRlIHRoYXQgdGhlIHRhc2sgYWJvcnQgZnVuY3Rpb24KLQkJCSAqIHdhcyBzdWNlc3NmdWwuCi0JCQkgKi8KLQkJCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKLQotCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKLQotCQkJZGV2X2RiZygmaXNjaV9ob3N0LT5wZGV2LT5kZXYsCi0JCQkJIiVzOiBhYm9ydCB0YXNrIG5vdCBuZWVkZWQgZm9yICVwXG4iLAotCQkJCV9fZnVuY19fLCB0YXNrKTsKLQkJfQotCQlnb3RvIG91dDsKLQl9IGVsc2UgeworCWlmICghaXNjaV9kZXZpY2UgfHwgIW9sZF9yZXF1ZXN0KSB7CisJCS8qIFRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBhbmQgdGhlcmUKKwkJKiBpcyBub3RoaW5nIHRvIGRvIGhlcmUgb3RoZXIgdGhhbiB0byBzZXQgdGhlIHRhc2sKKwkJKiBkb25lIGJpdCwgYW5kIGluZGljYXRlIHRoYXQgdGhlIHRhc2sgYWJvcnQgZnVuY3Rpb24KKwkJKiB3YXMgc3VjZXNzZnVsLgorCQkqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfU1RBVEVfRE9ORTsKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+KFNBU19UQVNLX0FUX0lOSVRJQVRPUiB8CisJCQkJCSAgICBTQVNfVEFTS19TVEFURV9QRU5ESU5HKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKworCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKKwkJCSIlczogYWJvcnQgdGFzayBub3QgbmVlZGVkIGZvciAlcFxuIiwKKwkJCV9fZnVuY19fLCB0YXNrKTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY2lfaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7CkBAIC0xMTQ2LDI0ICsxMTE1LDQ0IEBACiAJCWdvdG8gb3V0OwogCX0KIAlpZiAodGFzay0+dGFza19wcm90byA9PSBTQVNfUFJPVE9DT0xfU01QIHx8CisJICAgIHNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykgfHwKIAkgICAgdGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKSB7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNjaV9ob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKIAogCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCSIlczogU01QIHJlcXVlc3QgKCVkKSIKKwkJCSIlczogJXMgcmVxdWVzdCIKIAkJCSIgb3IgY29tcGxldGVfaW5fdGFyZ2V0ICglZCksIHRodXMgbm8gVE1GXG4iLAotCQkJX19mdW5jX18sICh0YXNrLT50YXNrX3Byb3RvID09IFNBU19QUk9UT0NPTF9TTVApLAorCQkJX19mdW5jX18sCisJCQkoKHRhc2stPnRhc2tfcHJvdG8gPT0gU0FTX1BST1RPQ09MX1NNUCkKKwkJCQk/ICJTTVAiCisJCQkJOiAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKQorCQkJCQk/ICJTQVRBL1NUUCIKKwkJCQkJOiAiPG90aGVyPiIpCisJCQkgKSwKIAkJCXRlc3RfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmb2xkX3JlcXVlc3QtPmZsYWdzKSk7CiAKLQkJLyogU2V0IHRoZSBzdGF0ZSBvbiB0aGUgdGFzay4gKi8KLQkJaXNjaV90YXNrX2FsbF9kb25lKHRhc2spOworCQlpZiAodGVzdF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZvbGRfcmVxdWVzdC0+ZmxhZ3MpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0RPTkU7CisJCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH4oU0FTX1RBU0tfQVRfSU5JVElBVE9SIHwKKwkJCQkJCSAgICBTQVNfVEFTS19TVEFURV9QRU5ESU5HKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQkJcmV0ID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gfihTQVNfVEFTS19BVF9JTklUSUFUT1IgfAorCQkJCQkJICAgIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJCX0KIAotCQlyZXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwotCi0JCS8qIFN0b3BwaW5nIGFuZCBTTVAgZGV2aWNlcyBhcmUgbm90IHNlbnQgYSBUTUYsIGFuZCBhcmUgbm90Ci0JCSAqIHJlc2V0LCBidXQgdGhlIG91dHN0YW5kaW5nIEkvTyByZXF1ZXN0IGlzIHRlcm1pbmF0ZWQgYmVsb3cuCisJCS8qIFNUUCBhbmQgU01QIGRldmljZXMgYXJlIG5vdCBzZW50IGEgVE1GLCBidXQgdGhlCisJCSAqIG91dHN0YW5kaW5nIEkvTyByZXF1ZXN0IGlzIHRlcm1pbmF0ZWQgYmVsb3cuICBUaGlzIGlzCisJCSAqIGJlY2F1c2UgU0FUQS9TVFAgYW5kIFNNUCBkaXNjb3ZlcnkgcGF0aCB0aW1lb3V0cyBkaXJlY3RseQorCQkgKiBjYWxsIHRoZSBhYm9ydCB0YXNrIGludGVyZmFjZSBmb3IgY2xlYW51cC4KIAkJICovCisJCXBlcmZvcm1fdGVybWluYXRpb24gPSAxOworCiAJfSBlbHNlIHsKIAkJLyogRmlsbCBpbiB0aGUgdG1mIHN0dWN0dXJlICovCiAJCWlzY2lfdGFza19idWlsZF9hYm9ydF90YXNrX3RtZigmdG1mLCBpc2NpX3RtZl9zc3BfdGFza19hYm9ydCwKQEAgLTExNzIsMjIgKzExNjEsMjQgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NpX2hvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCi0JCSNkZWZpbmUgSVNDSV9BQk9SVF9UQVNLX1RJTUVPVVRfTVMgNTAwIC8qIGhhbGYgc2Vjb25kIHRpbWVvdXQuICovCisJCSNkZWZpbmUgSVNDSV9BQk9SVF9UQVNLX1RJTUVPVVRfTVMgNTAwIC8qIDEvMiBzZWNvbmQgdGltZW91dCAqLwogCQlyZXQgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90bWYoaXNjaV9ob3N0LCBpc2NpX2RldmljZSwgJnRtZiwKIAkJCQkJICAgIElTQ0lfQUJPUlRfVEFTS19USU1FT1VUX01TKTsKIAotCQlpZiAocmV0ICE9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpCisJCWlmIChyZXQgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkKKwkJCXBlcmZvcm1fdGVybWluYXRpb24gPSAxOworCQllbHNlCiAJCQlkZXZfZGJnKCZpc2NpX2hvc3QtPnBkZXYtPmRldiwKLQkJCQkiJXM6IGlzY2lfdGFza19zZW5kX3RtZiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOworCQkJCSIlczogaXNjaV90YXNrX3NlbmRfdG1mIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCX0KLQlpZiAocmV0ID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKKwlpZiAocGVyZm9ybV90ZXJtaW5hdGlvbikgewogCQlzZXRfYml0KElSRVFfQ09NUExFVEVfSU5fVEFSR0VULCAmb2xkX3JlcXVlc3QtPmZsYWdzKTsKIAogCQkvKiBDbGVhbiB1cCB0aGUgcmVxdWVzdCBvbiBvdXIgc2lkZSwgYW5kIHdhaXQgZm9yIHRoZSBhYm9ydGVkCiAJCSAqIEkvTyB0byBjb21wbGV0ZS4KIAkJICovCi0JCWlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZShpc2NpX2hvc3QsIGlzY2lfZGV2aWNlLCBvbGRfcmVxdWVzdCk7CisJCWlzY2lfdGVybWluYXRlX3JlcXVlc3RfY29yZShpc2NpX2hvc3QsIGlzY2lfZGV2aWNlLAorCQkJCQkgICAgb2xkX3JlcXVlc3QpOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgbGVhdmUgYSByZWZlcmVuY2UgdG8gYWJvcnRlZF9pb19jb21wbGV0aW9uICovCkBAIC0xMjg4LDcgKzEyNzksOCBAQAogCQkJICAgZW51bSBzY2lfdGFza19zdGF0dXMgY29tcGxldGlvbl9zdGF0dXMpCiB7CiAJc3RydWN0IGlzY2lfdG1mICp0bWYgPSBpc2NpX3JlcXVlc3RfYWNjZXNzX3RtZihpcmVxKTsKLQlzdHJ1Y3QgY29tcGxldGlvbiAqdG1mX2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uICp0bWZfY29tcGxldGUgPSBOVUxMOworCXN0cnVjdCBjb21wbGV0aW9uICpyZXF1ZXN0X2NvbXBsZXRlID0gaXJlcS0+aW9fcmVxdWVzdF9jb21wbGV0aW9uOwogCiAJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKIAkJIiVzOiByZXF1ZXN0ID0gJXAsIHN0YXR1cz0lZFxuIiwKQEAgLTEyOTYsMjc4ICsxMjg4LDUzIEBACiAKIAlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIGNvbXBsZXRlZCk7CiAKLQl0bWYtPnN0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzOwogCXNldF9iaXQoSVJFUV9DT01QTEVURV9JTl9UQVJHRVQsICZpcmVxLT5mbGFncyk7CiAKLQlpZiAodG1mLT5wcm90byA9PSBTQVNfUFJPVE9DT0xfU1NQKSB7Ci0JCW1lbWNweSgmdG1mLT5yZXNwLnJlc3BfaXUsCi0JCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKLQkJICAgICAgIFNTUF9SRVNQX0lVX01BWF9TSVpFKTsKLQl9IGVsc2UgaWYgKHRtZi0+cHJvdG8gPT0gU0FTX1BST1RPQ09MX1NBVEEpIHsKLQkJbWVtY3B5KCZ0bWYtPnJlc3AuZDJoX2ZpcywKLQkJICAgICAgICZpcmVxLT5zdHAucnNwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZfdG9faG9zdF9maXMpKTsKKwlpZiAodG1mKSB7CisJCXRtZi0+c3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7CisKKwkJaWYgKHRtZi0+cHJvdG8gPT0gU0FTX1BST1RPQ09MX1NTUCkgeworCQkJbWVtY3B5KCZ0bWYtPnJlc3AucmVzcF9pdSwKKwkJCSAgICAgICAmaXJlcS0+c3NwLnJzcCwKKwkJCSAgICAgICBTU1BfUkVTUF9JVV9NQVhfU0laRSk7CisJCX0gZWxzZSBpZiAodG1mLT5wcm90byA9PSBTQVNfUFJPVE9DT0xfU0FUQSkgeworCQkJbWVtY3B5KCZ0bWYtPnJlc3AuZDJoX2ZpcywKKwkJCSAgICAgICAmaXJlcS0+c3RwLnJzcCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2ZpcykpOworCQl9CisJCS8qIFBSSU5UX1RNRiggKChzdHJ1Y3QgaXNjaV90bWYgKilyZXF1ZXN0LT50YXNrKSk7ICovCisJCXRtZl9jb21wbGV0ZSA9IHRtZi0+Y29tcGxldGU7CiAJfQotCi0JLyogUFJJTlRfVE1GKCAoKHN0cnVjdCBpc2NpX3RtZiAqKXJlcXVlc3QtPnRhc2spKTsgKi8KLQl0bWZfY29tcGxldGUgPSB0bWYtPmNvbXBsZXRlOwotCiAJc2NpX2NvbnRyb2xsZXJfY29tcGxldGVfaW8oaWhvc3QsIGlyZXEtPnRhcmdldF9kZXZpY2UsIGlyZXEpOwogCS8qIHNldCB0aGUgJ3Rlcm1pbmF0ZWQnIGZsYWcgaGFuZGxlIHRvIG1ha2Ugc3VyZSBpdCBjYW5ub3QgYmUgdGVybWluYXRlZAogCSAqICBvciBjb21wbGV0ZWQgYWdhaW4uCiAJICovCiAJc2V0X2JpdChJUkVRX1RFUk1JTkFURUQsICZpcmVxLT5mbGFncyk7CiAKLQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHVuYWxsb2NhdGVkKTsKLQlsaXN0X2RlbF9pbml0KCZpcmVxLT5kZXZfbm9kZSk7CisJLyogQXMgc29vbiBhcyBzb21ldGhpbmcgaXMgaW4gdGhlIHRlcm1pbmF0ZSBwYXRoLCBkZWFsbG9jYXRpb24gaXMKKwkgKiBtYW5hZ2VkIHRoZXJlLiAgTm90ZSB0aGF0IHRoZSBmaW5hbCBub24tbWFuYWdlZCBzdGF0ZSBvZiBhIHRhc2sKKwkgKiByZXF1ZXN0IGlzICJjb21wbGV0ZWQiLgorCSAqLworCWlmICgoaXJlcS0+c3RhdHVzID09IGNvbXBsZXRlZCkgfHwKKwkgICAgIWlzY2lfcmVxdWVzdF9pc19kZWFsbG9jX21hbmFnZWQoaXJlcS0+c3RhdHVzKSkgeworCQlpc2NpX3JlcXVlc3RfY2hhbmdlX3N0YXRlKGlyZXEsIHVuYWxsb2NhdGVkKTsKKwkJaXNjaV9mcmVlX3RhZyhpaG9zdCwgaXJlcS0+aW9fdGFnKTsKKwkJbGlzdF9kZWxfaW5pdCgmaXJlcS0+ZGV2X25vZGUpOworCX0KKworCS8qICJyZXF1ZXN0X2NvbXBsZXRlIiBpcyBzZXQgaWYgdGhlIHRhc2sgd2FzIGJlaW5nIHRlcm1pbmF0ZWQuICovCisJaWYgKHJlcXVlc3RfY29tcGxldGUpCisJCWNvbXBsZXRlKHJlcXVlc3RfY29tcGxldGUpOwogCiAJLyogVGhlIHRhc2sgbWFuYWdlbWVudCBwYXJ0IGNvbXBsZXRlcyBsYXN0LiAqLwotCWNvbXBsZXRlKHRtZl9jb21wbGV0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzY2lfc21wX3Rhc2tfdGltZWRvdXQodW5zaWduZWQgbG9uZyBfdGFzaykKLXsKLQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSAodm9pZCAqKSBfdGFzazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkKLQkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9BQk9SVEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCi0JY29tcGxldGUoJnRhc2stPmNvbXBsZXRpb24pOwotfQotCi1zdGF0aWMgdm9pZCBpc2NpX3NtcF90YXNrX2RvbmUoc3RydWN0IHNhc190YXNrICp0YXNrKQotewotCWlmICghZGVsX3RpbWVyKCZ0YXNrLT50aW1lcikpCi0JCXJldHVybjsKLQljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2FzX3Rhc2sgKmlzY2lfYWxsb2NfdGFzayh2b2lkKQotewotCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGt6YWxsb2Moc2l6ZW9mKCp0YXNrKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAodGFzaykgewotCQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7Ci0JCXNwaW5fbG9ja19pbml0KCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOwotCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzID0gU0FTX1RBU0tfU1RBVEVfUEVORElORzsKLQkJaW5pdF90aW1lcigmdGFzay0+dGltZXIpOwotCQlpbml0X2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOwotCX0KLQotCXJldHVybiB0YXNrOwotfQotCi1zdGF0aWMgdm9pZCBpc2NpX2ZyZWVfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwgc3RydWN0IHNhc190YXNrICAqdGFzaykKLXsKLQlpZiAodGFzaykgewotCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKLQkJa2ZyZWUodGFzayk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGlzY2lfc21wX2V4ZWN1dGVfdGFzayhzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKLQkJCQkgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdm9pZCAqcmVxLAotCQkJCSBpbnQgcmVxX3NpemUsIHZvaWQgKnJlc3AsIGludCByZXNwX3NpemUpCi17Ci0JaW50IHJlcywgcmV0cnk7Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0gTlVMTDsKLQotCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDM7IHJldHJ5KyspIHsKLQkJdGFzayA9IGlzY2lfYWxsb2NfdGFzaygpOwotCQlpZiAoIXRhc2spCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQl0YXNrLT5kZXYgPSBkZXY7Ci0JCXRhc2stPnRhc2tfcHJvdG8gPSBkZXYtPnRwcm90bzsKLQkJc2dfaW5pdF9vbmUoJnRhc2stPnNtcF90YXNrLnNtcF9yZXEsIHJlcSwgcmVxX3NpemUpOwotCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3Jlc3AsIHJlc3AsIHJlc3Bfc2l6ZSk7Ci0KLQkJdGFzay0+dGFza19kb25lID0gaXNjaV9zbXBfdGFza19kb25lOwotCi0JCXRhc2stPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdGFzazsKLQkJdGFzay0+dGltZXIuZnVuY3Rpb24gPSBpc2NpX3NtcF90YXNrX3RpbWVkb3V0OwotCQl0YXNrLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEwKkhaOwotCQlhZGRfdGltZXIoJnRhc2stPnRpbWVyKTsKLQotCQlyZXMgPSBpc2NpX3Rhc2tfZXhlY3V0ZV90YXNrKHRhc2ssIDEsIEdGUF9LRVJORUwpOwotCi0JCWlmIChyZXMpIHsKLQkJCWRlbF90aW1lcigmdGFzay0+dGltZXIpOwotCQkJZGV2X2RiZygmaWhvc3QtPnBkZXYtPmRldiwKLQkJCQkiJXM6IGV4ZWN1dGluZyBTTVAgdGFzayBmYWlsZWQ6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJlcyk7Ci0JCQlnb3RvIGV4X2VycjsKLQkJfQotCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOwotCQlyZXMgPSAtRUNPTU07Ci0JCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7Ci0JCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJCSIlczogc21wIHRhc2sgdGltZWQgb3V0IG9yIGFib3J0ZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJaXNjaV90YXNrX2Fib3J0X3Rhc2sodGFzayk7Ci0JCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkpIHsKLQkJCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJCQkiJXM6IFNNUCB0YXNrIGFib3J0ZWQgYW5kIG5vdCBkb25lXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBleF9lcnI7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKLQkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX1NUQVRfR09PRCkgewotCQkJcmVzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0YXNrLT50YXNrX3N0YXR1cy5yZXNwID09IFNBU19UQVNLX0NPTVBMRVRFICYmCi0JCSAgICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FTX0RBVEFfVU5ERVJSVU4pIHsKLQkJCS8qIG5vIGVycm9yLCBidXQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YKLQkJCSogdW5kZXJydW4gKi8KLQkJCXJlcyA9IHRhc2stPnRhc2tfc3RhdHVzLnJlc2lkdWFsOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKLQkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9PVkVSUlVOKSB7Ci0JCQlyZXMgPSAtRU1TR1NJWkU7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkJIiVzOiB0YXNrIHRvIGRldiAlMDE2bGx4IHJlc3BvbnNlOiAweCV4ICIKLQkJCQkic3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCVNBU19BRERSKGRldi0+c2FzX2FkZHIpLAotCQkJCXRhc2stPnRhc2tfc3RhdHVzLnJlc3AsCi0JCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCk7Ci0JCQlpc2NpX2ZyZWVfdGFzayhpaG9zdCwgdGFzayk7Ci0JCQl0YXNrID0gTlVMTDsKLQkJfQotCX0KLWV4X2VycjoKLQlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOwotCWlzY2lfZnJlZV90YXNrKGlob3N0LCB0YXNrKTsKLQlyZXR1cm4gcmVzOwotfQotCi0jZGVmaW5lIERJU0NPVkVSX1JFUV9TSVpFICAxNgotI2RlZmluZSBESVNDT1ZFUl9SRVNQX1NJWkUgNTYKLQotaW50IGlzY2lfc21wX2dldF9waHlfYXR0YWNoZWRfZGV2X3R5cGUoc3RydWN0IGlzY2lfaG9zdCAqaWhvc3QsCi0JCQkJICAgICAgIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIGludCBwaHlfaWQsIGludCAqYWR0KQotewotCXN0cnVjdCBzbXBfcmVzcCAqZGlzY19yZXNwOwotCXU4ICpkaXNjX3JlcTsKLQlpbnQgcmVzOwotCi0JZGlzY19yZXNwID0ga3phbGxvYyhESVNDT1ZFUl9SRVNQX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghZGlzY19yZXNwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRpc2NfcmVxID0ga3phbGxvYyhESVNDT1ZFUl9SRVFfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRpc2NfcmVxKSB7Ci0JCWRpc2NfcmVxWzBdID0gU01QX1JFUVVFU1Q7Ci0JCWRpc2NfcmVxWzFdID0gU01QX0RJU0NPVkVSOwotCQlkaXNjX3JlcVs5XSA9IHBoeV9pZDsKLQl9IGVsc2UgewotCQlrZnJlZShkaXNjX3Jlc3ApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmVzID0gaXNjaV9zbXBfZXhlY3V0ZV90YXNrKGlob3N0LCBkZXYsIGRpc2NfcmVxLCBESVNDT1ZFUl9SRVFfU0laRSwKLQkJCQkgICAgZGlzY19yZXNwLCBESVNDT1ZFUl9SRVNQX1NJWkUpOwotCWlmICghcmVzKSB7Ci0JCWlmIChkaXNjX3Jlc3AtPnJlc3VsdCAhPSBTTVBfUkVTUF9GVU5DX0FDQykKLQkJCXJlcyA9IGRpc2NfcmVzcC0+cmVzdWx0OwotCQllbHNlCi0JCQkqYWR0ID0gZGlzY19yZXNwLT5kaXNjLmF0dGFjaGVkX2Rldl90eXBlOwotCX0KLQlrZnJlZShkaXNjX3JlcSk7Ci0Ja2ZyZWUoZGlzY19yZXNwKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzY2lfd2FpdF9mb3Jfc21wX3BoeV9yZXNldChzdHJ1Y3QgaXNjaV9yZW1vdGVfZGV2aWNlICppZGV2LCBpbnQgcGh5X251bSkKLXsKLQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gaWRldi0+ZG9tYWluX2RldjsKLQlzdHJ1Y3QgaXNjaV9wb3J0ICppcG9ydCA9IGlkZXYtPmlzY2lfcG9ydDsKLQlzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCA9IGlwb3J0LT5pc2NpX2hvc3Q7Ci0JaW50IHJlcywgaXRlcmF0aW9uID0gMCwgYXR0YWNoZWRfZGV2aWNlX3R5cGU7Ci0JI2RlZmluZSBTVFBfV0FJVF9NU0VDUyAyNTAwMAotCXVuc2lnbmVkIGxvbmcgdG1vID0gbXNlY3NfdG9famlmZmllcyhTVFBfV0FJVF9NU0VDUyk7Ci0JdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyB0bW87Ci0JZW51bSB7Ci0JCVNNUF9QSFlXQUlUX1BIWURPV04sCi0JCVNNUF9QSFlXQUlUX1BIWVVQLAotCQlTTVBfUEhZV0FJVF9ET05FCi0JfSBwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9QSFlET1dOOwotCi0JLyogV2hpbGUgdGhlcmUgaXMgdGltZSwgd2FpdCBmb3IgdGhlIHBoeSB0byBnbyBhd2F5IGFuZCBjb21lIGJhY2sgKi8KLQl3aGlsZSAodGltZV9pc19hZnRlcl9qaWZmaWVzKGRlYWRsaW5lKSAmJiBwaHlfc3RhdGUgIT0gU01QX1BIWVdBSVRfRE9ORSkgewotCQlpbnQgZXZlbnQgPSBhdG9taWNfcmVhZCgmaXBvcnQtPmV2ZW50KTsKLQotCQkrK2l0ZXJhdGlvbjsKLQotCQl0bW8gPSB3YWl0X2V2ZW50X3RpbWVvdXQoaWhvc3QtPmV2ZW50cSwKLQkJCQkJIGV2ZW50ICE9IGF0b21pY19yZWFkKCZpcG9ydC0+ZXZlbnQpIHx8Ci0JCQkJCSAhdGVzdF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpLAotCQkJCQkgdG1vKTsKLQkJLyogbGluayBkb3duLCBzdG9wIHBvbGxpbmcgKi8KLQkJaWYgKCF0ZXN0X2JpdChJUE9SVF9CQ05fQkxPQ0tFRCwgJmlwb3J0LT5mbGFncykpCi0JCQlicmVhazsKLQotCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJIiVzOiBpcG9ydCAlcCwgaXRlcmF0aW9uICVkLCIKLQkJCSIgcGhhc2UgJWQ6IHRpbWVfcmVtYWluaW5nICVsdSwgYmNucyA9ICVkXG4iLAotCQkJX19mdW5jX18sIGlwb3J0LCBpdGVyYXRpb24sIHBoeV9zdGF0ZSwKLQkJCXRtbywgdGVzdF9iaXQoSVBPUlRfQkNOX1BFTkRJTkcsICZpcG9ydC0+ZmxhZ3MpKTsKLQotCQlyZXMgPSBpc2NpX3NtcF9nZXRfcGh5X2F0dGFjaGVkX2Rldl90eXBlKGlob3N0LCBkZXYsIHBoeV9udW0sCi0JCQkJCQkJICZhdHRhY2hlZF9kZXZpY2VfdHlwZSk7Ci0JCXRtbyA9IGRlYWRsaW5lIC0gamlmZmllczsKLQotCQlpZiAocmVzKSB7Ci0JCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAotCQkJCSAiJXM6IGl0ZXJhdGlvbiAlZCwgcGhhc2UgJWQ6IgotCQkJCSAiIFNNUCBlcnJvcj0lZCwgdGltZV9yZW1haW5pbmc9JWx1XG4iLAotCQkJCSBfX2Z1bmNfXywgaXRlcmF0aW9uLCBwaHlfc3RhdGUsIHJlcywgdG1vKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldl9kYmcoJmlob3N0LT5wZGV2LT5kZXYsCi0JCQkiJXM6IGlwb3J0ICVwLCBpdGVyYXRpb24gJWQsIgotCQkJIiBwaGFzZSAlZDogdGltZV9yZW1haW5pbmcgJWx1LCBiY25zID0gJWQsICIKLQkJCSJhdHRkZXZ0eXBlID0gJXhcbiIsCi0JCQlfX2Z1bmNfXywgaXBvcnQsIGl0ZXJhdGlvbiwgcGh5X3N0YXRlLAotCQkJdG1vLCB0ZXN0X2JpdChJUE9SVF9CQ05fUEVORElORywgJmlwb3J0LT5mbGFncyksCi0JCQlhdHRhY2hlZF9kZXZpY2VfdHlwZSk7Ci0KLQkJc3dpdGNoIChwaHlfc3RhdGUpIHsKLQkJY2FzZSBTTVBfUEhZV0FJVF9QSFlET1dOOgotCQkJLyogSGFzIHRoZSBkZXZpY2UgZ29uZSBhd2F5PyAqLwotCQkJaWYgKCFhdHRhY2hlZF9kZXZpY2VfdHlwZSkKLQkJCQlwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9QSFlVUDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTTVBfUEhZV0FJVF9QSFlVUDoKLQkJCS8qIEhhcyB0aGUgZGV2aWNlIGNvbWUgYmFjaz8gKi8KLQkJCWlmIChhdHRhY2hlZF9kZXZpY2VfdHlwZSkKLQkJCQlwaHlfc3RhdGUgPSBTTVBfUEhZV0FJVF9ET05FOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTTVBfUEhZV0FJVF9ET05FOgotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LCAiJXM6IGRvbmVcbiIsICBfX2Z1bmNfXyk7CisJaWYgKHRtZl9jb21wbGV0ZSkKKwkJY29tcGxldGUodG1mX2NvbXBsZXRlKTsKIH0KIAogc3RhdGljIGludCBpc2NpX3Jlc2V0X2RldmljZShzdHJ1Y3QgaXNjaV9ob3N0ICppaG9zdCwKIAkJCSAgICAgc3RydWN0IGlzY2lfcmVtb3RlX2RldmljZSAqaWRldikKIHsKIAlzdHJ1Y3Qgc2FzX3BoeSAqcGh5ID0gc2FzX2ZpbmRfbG9jYWxfcGh5KGlkZXYtPmRvbWFpbl9kZXYpOwotCXN0cnVjdCBpc2NpX3BvcnQgKmlwb3J0ID0gaWRldi0+aXNjaV9wb3J0OwogCWVudW0gc2NpX3N0YXR1cyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CkBAIC0xNTg3LDEzICsxMzU0LDYgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWhvc3QtPnNjaWNfbG9jaywgZmxhZ3MpOwogCi0JLyogTWFrZSBzdXJlIGFsbCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBhYmxlIHRvIGJlIGZ1bGx5IHRlcm1pbmF0ZWQuICovCi0JaXNjaV9kZXZpY2VfY2xlYXJfcmVzZXRfcGVuZGluZyhpaG9zdCwgaWRldik7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgZGV2aWNlIG9uIGFuIGV4cGFuZGVyLCBkaXNhYmxlIEJDTiBwcm9jZXNzaW5nLiAqLwotCWlmICghc2NzaV9pc19zYXNfcGh5X2xvY2FsKHBoeSkpCi0JCXNldF9iaXQoSVBPUlRfQkNOX0JMT0NLRUQsICZpcG9ydC0+ZmxhZ3MpOwotCiAJcmMgPSBzYXNfcGh5X3Jlc2V0KHBoeSwgdHJ1ZSk7CiAKIAkvKiBUZXJtaW5hdGUgaW4tcHJvZ3Jlc3MgSS9PIG5vdy4gKi8KQEAgLTE2MDQsMjEgKzEzNjQsNiBAQAogCXN0YXR1cyA9IHNjaV9yZW1vdGVfZGV2aWNlX3Jlc2V0X2NvbXBsZXRlKGlkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlob3N0LT5zY2ljX2xvY2ssIGZsYWdzKTsKIAotCS8qIElmIHRoaXMgaXMgYSBkZXZpY2Ugb24gYW4gZXhwYW5kZXIsIGJyaW5nIHRoZSBwaHkgYmFjayB1cC4gKi8KLQlpZiAoIXNjc2lfaXNfc2FzX3BoeV9sb2NhbChwaHkpKSB7Ci0JCS8qIEEgcGh5IHJlc2V0IHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byBnbyBhd2F5IHRoZW4gcmVhcHBlYXIuCi0JCSAqIFNpbmNlIGxpYnNhcyB3aWxsIHRha2UgYWN0aW9uIG9uIGluY29taW5nIEJDTnMgKGVnLiByZW1vdmUKLQkJICogYSBkZXZpY2UgZ29pbmcgdGhyb3VnaCBhbiBTTVAgcGh5LWNvbnRyb2wgZHJpdmVuIHJlc2V0KSwKLQkJICogd2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBwaHkgY29tZXMgYmFjayB1cCBiZWZvcmUgbGV0dGluZwotCQkgKiBkaXNjb3ZlcnkgcHJvY2VlZCBpbiBsaWJzYXMuCi0JCSAqLwotCQlpc2NpX3dhaXRfZm9yX3NtcF9waHlfcmVzZXQoaWRldiwgcGh5LT5udW1iZXIpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Ci0JCWlzY2lfcG9ydF9iY25fZW5hYmxlKGlob3N0LCBpZGV2LT5pc2NpX3BvcnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpaG9zdC0+c2NpY19sb2NrLCBmbGFncyk7Ci0JfQotCiAJaWYgKHN0YXR1cyAhPSBTQ0lfU1VDQ0VTUykgewogCQlkZXZfZGJnKCZpaG9zdC0+cGRldi0+ZGV2LAogCQkJICIlczogc2NpX3JlbW90ZV9kZXZpY2VfcmVzZXRfY29tcGxldGUoJXApICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaCBiL2RyaXZlcnMvc2NzaS9pc2NpL3Rhc2suaAppbmRleCA0YTdmYTkwLi5iYzc4YzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS90YXNrLmgKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvdGFzay5oCkBAIC01OCw2ICs1OCw4IEBACiAjaW5jbHVkZSA8c2NzaS9zYXNfYXRhLmg+CiAjaW5jbHVkZSAiaG9zdC5oIgogCisjZGVmaW5lIElTQ0lfVEVSTUlOQVRJT05fVElNRU9VVF9NU0VDIDUwMAorCiBzdHJ1Y3QgaXNjaV9yZXF1ZXN0OwogCiAvKioKQEAgLTIyNCwzNSArMjI2LDYgQEAKIAlpc2NpX3BlcmZvcm1fZXJyb3JfaW9fY29tcGxldGlvbiAgICAgICAgLyogVXNlIHNhc190YXNrX2Fib3J0ICovCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXNjaV9zZXRfdGFza19kb25lZmxhZ3MoCi0Jc3RydWN0IHNhc190YXNrICp0YXNrKQotewotCS8qIFNpbmNlIG5vIGZ1dGhlciBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGlzIHRhc2ssCi0JICogbWFrZSBzdXJlIHRvIG1hcmsgaXQgY29tcGxldGUgZnJvbSB0aGUgbGxkZCBwZXJzcGVjdGl2ZS4KLQkgKi8KLQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0RPTkU7Ci0JdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfQVRfSU5JVElBVE9SOwotCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX1NUQVRFX1BFTkRJTkc7Ci19Ci0vKioKLSAqIGlzY2lfdGFza19hbGxfZG9uZSgpIC0gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHRhc2sgYml0cyB0byBpbmRpY2F0ZSB0aGUKLSAqICAgIExMREQgaXMgZG9uZSB3aXRoIHRoZSB0YXNrLgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpc2NpX3Rhc2tfYWxsX2RvbmUoCi0Jc3RydWN0IHNhc190YXNrICp0YXNrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBTaW5jZSBubyBmdXRoZXIgYWN0aW9uIHdpbGwgYmUgdGFrZW4gb24gdGhpcyB0YXNrLAotCSAqIG1ha2Ugc3VyZSB0byBtYXJrIGl0IGNvbXBsZXRlIGZyb20gdGhlIGxsZGQgcGVyc3BlY3RpdmUuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotCWlzY2lfc2V0X3Rhc2tfZG9uZWZsYWdzKHRhc2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOwotfQotCiAvKioKICAqIGlzY2lfdGFza19zZXRfY29tcGxldGlvbl9zdGF0dXMoKSAtIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY29tcGxldGlvbiBzdGF0dXMKICAqICAgIGZvciB0aGUgcmVxdWVzdC4KQEAgLTI4Niw2ICsyNTksMjUgQEAKIAl0YXNrLT50YXNrX3N0YXR1cy5yZXNwID0gcmVzcG9uc2U7CiAJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9IHN0YXR1czsKIAorCXN3aXRjaCAodGFzay0+dGFza19wcm90bykgeworCisJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQToKKwljYXNlIFNBU19QUk9UT0NPTF9TVFA6CisJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQSB8IFNBU19QUk9UT0NPTF9TVFA6CisKKwkJaWYgKHRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbgorCQkgICAgPT0gaXNjaV9wZXJmb3JtX2Vycm9yX2lvX2NvbXBsZXRpb24pIHsKKwkJCS8qIFNBVEEvU1RQIEkvTyBoYXMgaXQncyBvd24gbWVhbnMgb2Ygc2NoZWR1bGluZyBkZXZpY2UKKwkJCSogZXJyb3IgaGFuZGxpbmcgb24gdGhlIG5vcm1hbCBwYXRoLgorCQkJKi8KKwkJCXRhc2tfbm90aWZpY2F0aW9uX3NlbGVjdGlvbgorCQkJCT0gaXNjaV9wZXJmb3JtX25vcm1hbF9pb19jb21wbGV0aW9uOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCXN3aXRjaCAodGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uKSB7CiAKIAljYXNlIGlzY2lfcGVyZm9ybV9lcnJvcl9pb19jb21wbGV0aW9uOgpAQCAtMzE1LDcgKzMwNyw5IEBACiAJCS8qIEZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNhc2UuLi4gKi8KIAljYXNlIGlzY2lfcGVyZm9ybV9ub3JtYWxfaW9fY29tcGxldGlvbjoKIAkJLyogTm9ybWFsIG5vdGlmaWNhdGlvbiAodGFza19kb25lKSAqLwotCQlpc2NpX3NldF90YXNrX2RvbmVmbGFncyh0YXNrKTsKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9ET05FOworCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICY9IH4oU0FTX1RBU0tfQVRfSU5JVElBVE9SIHwKKwkJCQkJICAgIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OQ0UoMSwgInVua25vd24gdGFza19ub3RpZmljYXRpb25fc2VsZWN0aW9uOiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCA3NzI0NDE0Li43YzM0ZDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgpAQCAtODcyLDYgKzg3Myw2MSBAQAogCWlzY3NpX2hvc3RfZnJlZShzaG9zdCk7CiB9CiAKK3N0YXRpYyBtb2RlX3QgaXNjc2lfc3dfdGNwX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQoreworCXN3aXRjaCAocGFyYW1fdHlwZSkgeworCWNhc2UgSVNDU0lfSE9TVF9QQVJBTToKKwkJc3dpdGNoIChwYXJhbSkgeworCQljYXNlIElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUU6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9IV0FERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M6CisJCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIElTQ1NJX1BBUkFNOgorCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX0hEUkRHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQURHU1RfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOOgorCQljYXNlIElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fUElOR19UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fUkVDVl9UTU86CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBTF9SMlRfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1IyVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9JTU1fREFUQV9FTjoKKwkJY2FzZSBJU0NTSV9QQVJBTV9GSVJTVF9CVVJTVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fUERVX0lOT1JERVJfRU46CisJCWNhc2UgSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOOgorCQljYXNlIElTQ1NJX1BBUkFNX0VSTDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UQVJHRVRfTkFNRToKKwkJY2FzZSBJU0NTSV9QQVJBTV9UUEdUOgorCQljYXNlIElTQ1NJX1BBUkFNX1VTRVJOQU1FOgorCQljYXNlIElTQ1NJX1BBUkFNX1BBU1NXT1JEOgorCQljYXNlIElTQ1NJX1BBUkFNX1VTRVJOQU1FX0lOOgorCQljYXNlIElTQ1NJX1BBUkFNX1BBU1NXT1JEX0lOOgorCQljYXNlIElTQ1NJX1BBUkFNX0ZBU1RfQUJPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fQUJPUlRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0xVX1JFU0VUX1RNTzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1POgorCQljYXNlIElTQ1NJX1BBUkFNX0lGQUNFX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fSU5JVElBVE9SX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaXNjc2lfc3dfdGNwX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlzZXRfYml0KFFVRVVFX0ZMQUdfQklESSwgJnNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2ZsYWdzKTsKQEAgLTkxMCwzMyArOTY2LDYgQEAKIAkubmFtZQkJCT0gInRjcCIsCiAJLmNhcHMJCQk9IENBUF9SRUNPVkVSWV9MMCB8IENBUF9NVUxUSV9SMlQgfCBDQVBfSERSREdTVAogCQkJCSAgfCBDQVBfREFUQURHU1QsCi0JLnBhcmFtX21hc2sJCT0gSVNDU0lfTUFYX1JFQ1ZfRExFTkdUSCB8Ci0JCQkJICBJU0NTSV9NQVhfWE1JVF9ETEVOR1RIIHwKLQkJCQkgIElTQ1NJX0hEUkRHU1RfRU4gfAotCQkJCSAgSVNDU0lfREFUQURHU1RfRU4gfAotCQkJCSAgSVNDU0lfSU5JVElBTF9SMlRfRU4gfAotCQkJCSAgSVNDU0lfTUFYX1IyVCB8Ci0JCQkJICBJU0NTSV9JTU1fREFUQV9FTiB8Ci0JCQkJICBJU0NTSV9GSVJTVF9CVVJTVCB8Ci0JCQkJICBJU0NTSV9NQVhfQlVSU1QgfAotCQkJCSAgSVNDU0lfUERVX0lOT1JERVJfRU4gfAotCQkJCSAgSVNDU0lfREFUQVNFUV9JTk9SREVSX0VOIHwKLQkJCQkgIElTQ1NJX0VSTCB8Ci0JCQkJICBJU0NTSV9DT05OX1BPUlQgfAotCQkJCSAgSVNDU0lfQ09OTl9BRERSRVNTIHwKLQkJCQkgIElTQ1NJX0VYUF9TVEFUU04gfAotCQkJCSAgSVNDU0lfUEVSU0lTVEVOVF9QT1JUIHwKLQkJCQkgIElTQ1NJX1BFUlNJU1RFTlRfQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9UQVJHRVRfTkFNRSB8IElTQ1NJX1RQR1QgfAotCQkJCSAgSVNDU0lfVVNFUk5BTUUgfCBJU0NTSV9QQVNTV09SRCB8Ci0JCQkJICBJU0NTSV9VU0VSTkFNRV9JTiB8IElTQ1NJX1BBU1NXT1JEX0lOIHwKLQkJCQkgIElTQ1NJX0ZBU1RfQUJPUlQgfCBJU0NTSV9BQk9SVF9UTU8gfAotCQkJCSAgSVNDU0lfTFVfUkVTRVRfVE1PIHwgSVNDU0lfVEdUX1JFU0VUX1RNTyB8Ci0JCQkJICBJU0NTSV9QSU5HX1RNTyB8IElTQ1NJX1JFQ1ZfVE1PIHwKLQkJCQkgIElTQ1NJX0lGQUNFX05BTUUgfCBJU0NTSV9JTklUSUFUT1JfTkFNRSwKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfCBJU0NTSV9IT1NUX0lQQUREUkVTUyB8Ci0JCQkJICBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FIHwKLQkJCQkgIElTQ1NJX0hPU1RfTkVUREVWX05BTUUsCiAJLyogc2Vzc2lvbiBtYW5hZ2VtZW50ICovCiAJLmNyZWF0ZV9zZXNzaW9uCQk9IGlzY3NpX3N3X3RjcF9zZXNzaW9uX2NyZWF0ZSwKIAkuZGVzdHJveV9zZXNzaW9uCT0gaXNjc2lfc3dfdGNwX3Nlc3Npb25fZGVzdHJveSwKQEAgLTk0NCw2ICs5NzMsNyBAQAogCS5jcmVhdGVfY29ubgkJPSBpc2NzaV9zd190Y3BfY29ubl9jcmVhdGUsCiAJLmJpbmRfY29ubgkJPSBpc2NzaV9zd190Y3BfY29ubl9iaW5kLAogCS5kZXN0cm95X2Nvbm4JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fZGVzdHJveSwKKwkuYXR0cl9pc192aXNpYmxlCT0gaXNjc2lfc3dfdGNwX2F0dHJfaXNfdmlzaWJsZSwKIAkuc2V0X3BhcmFtCQk9IGlzY3NpX3N3X3RjcF9jb25uX3NldF9wYXJhbSwKIAkuZ2V0X2Nvbm5fcGFyYW0JCT0gaXNjc2lfc3dfdGNwX2Nvbm5fZ2V0X3BhcmFtLAogCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19kaXNjLmMKaW5kZXggYjljYjgxNC4uNzI2OWU5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Rpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZGlzYy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8c2NzaS9mYy9mY19ncy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2Vsc2N0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZWxzY3QuYwppbmRleCA5YjI1OTY5Li5mYjkxNjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZWxzY3QuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZWxzY3QuYwpAQCAtMjEsNiArMjEsNyBAQAogICogUHJvdmlkZSBpbnRlcmZhY2UgdG8gc2VuZCBFTFMvQ1QgRkMgZnJhbWVzCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2dzLmg+CiAjaW5jbHVkZSA8c2NzaS9mYy9mY19ucy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKaW5kZXggZDI2MWU5OC4uOWRlOWRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxzY3NpL2ZjL2ZjX2ZjMi5oPgogCkBAIC02NSwxNiArNjYsMTUgQEAKICAqIGFzc2lnbmVkIHJhbmdlIG9mIGV4Y2hhbmdlcyB0byBwZXIgY3B1IHBvb2wuCiAgKi8KIHN0cnVjdCBmY19leGNoX3Bvb2wgeworCXNwaW5sb2NrX3QJIGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBleF9saXN0OwogCXUxNgkJIG5leHRfaW5kZXg7CiAJdTE2CQkgdG90YWxfZXhjaGVzOwogCiAJLyogdHdvIGNhY2hlIG9mIGZyZWUgc2xvdCBpbiBleGNoIGFycmF5ICovCiAJdTE2CQkgbGVmdDsKIAl1MTYJCSByaWdodDsKLQotCXNwaW5sb2NrX3QJIGxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBleF9saXN0OwotfTsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogLyoqCiAgKiBzdHJ1Y3QgZmNfZXhjaF9tZ3IgLSBUaGUgRXhjaGFuZ2UgTWFuYWdlciAoRU0pLgpAQCAtOTEsMTMgKzkxLDEzIEBACiAgKiBJdCBtYW5hZ2VzIHRoZSBhbGxvY2F0aW9uIG9mIGV4Y2hhbmdlIElEcy4KICAqLwogc3RydWN0IGZjX2V4Y2hfbWdyIHsKKwlzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sOworCW1lbXBvb2xfdAkqZXBfcG9vbDsKIAllbnVtIGZjX2NsYXNzCWNsYXNzOwogCXN0cnVjdCBrcmVmCWtyZWY7CiAJdTE2CQltaW5feGlkOwogCXUxNgkJbWF4X3hpZDsKLQltZW1wb29sX3QJKmVwX3Bvb2w7CiAJdTE2CQlwb29sX21heF9pbmRleDsKLQlzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sOwogCiAJLyoKIAkgKiBjdXJyZW50bHkgZXhjaGFuZ2UgbWdyIHN0YXRzIGFyZSB1cGRhdGVkIGJ1dCBub3QgdXNlZC4KQEAgLTQ3MCw2ICs0NzAsNyBAQAogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAJaW50IGVycm9yOwogCXUzMiBmX2N0bDsKKwl1OCBmaF90eXBlID0gZmgtPmZoX3R5cGU7CiAKIAllcCA9IGZjX3NlcV9leGNoKHNwKTsKIAlXQVJOX09OKChlcC0+ZXNiX3N0YXQgJiBFU0JfU1RfU0VRX0lOSVQpICE9IEVTQl9TVF9TRVFfSU5JVCk7CkBAIC00OTQsNyArNDk1LDcgQEAKIAkgKi8KIAllcnJvciA9IGxwb3J0LT50dC5mcmFtZV9zZW5kKGxwb3J0LCBmcCk7CiAKLQlpZiAoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9CTFMpCisJaWYgKGZoX3R5cGUgPT0gRkNfVFlQRV9CTFMpCiAJCXJldHVybiBlcnJvcjsKIAogCS8qCkBAIC0xNzkzLDYgKzE3OTQsOSBAQAogCQkJZ290byByZXN0YXJ0OwogCQl9CiAJfQorCXBvb2wtPm5leHRfaW5kZXggPSAwOworCXBvb2wtPmxlZnQgPSBGQ19YSURfVU5LTk9XTjsKKwlwb29sLT5yaWdodCA9IEZDX1hJRF9VTktOT1dOOwogCXNwaW5fdW5sb2NrX2JoKCZwb29sLT5sb2NrKTsKIH0KIApAQCAtMjI4MSw2ICsyMjg1LDcgQEAKIAkJZ290byBmcmVlX21lbXBvb2w7CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlwb29sID0gcGVyX2NwdV9wdHIobXAtPnBvb2wsIGNwdSk7CisJCXBvb2wtPm5leHRfaW5kZXggPSAwOwogCQlwb29sLT5sZWZ0ID0gRkNfWElEX1VOS05PV047CiAJCXBvb2wtPnJpZ2h0ID0gRkNfWElEX1VOS05PV047CiAJCXNwaW5fbG9ja19pbml0KCZwb29sLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYwppbmRleCA0YzQxZWU4Li4yMjE4NzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCkBAIC03NTksNyArNzU5LDYgQEAKIAkJZ290byBvdXQ7CiAJaWYgKGZjX2ZjcF9sb2NrX3BrdChmc3ApKQogCQlnb3RvIG91dDsKLQlmc3AtPmxhc3RfcGt0X3RpbWUgPSBqaWZmaWVzOwogCiAJaWYgKGZoLT5maF90eXBlID09IEZDX1RZUEVfQkxTKSB7CiAJCWZjX2ZjcF9hYnRzX3Jlc3AoZnNwLCBmcCk7CkBAIC0xMTQ4LDcgKzExNDcsNiBAQAogCQlyYyA9IC0xOwogCQlnb3RvIHVubG9jazsKIAl9Ci0JZnNwLT5sYXN0X3BrdF90aW1lID0gamlmZmllczsKIAlmc3AtPnNlcV9wdHIgPSBzZXE7CiAJZmNfZmNwX3BrdF9ob2xkKGZzcCk7CS8qIGhvbGQgZm9yIGZjX2ZjcF9wa3RfZGVzdHJveSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbGliZmMuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jCmluZGV4IGI3NzM1MTIuLjFiZjk4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19saWJmYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CiAjaW5jbHVkZSA8c2NzaS9mY19lbmNvZGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19scG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKaW5kZXggNjI4ZjM0Ny4uZTc3MDk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKQEAgLTg5LDYgKzg5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCkBAIC0xMDMwLDE2ICsxMDMxLDggQEAKIAkJCSAgIEZDSF9FVlRfTElQUkVTRVQsIDApOwogCWZjX3Zwb3J0c19saW5rY2hhbmdlKGxwb3J0KTsKIAlmY19scG9ydF9yZXNldF9sb2NrZWQobHBvcnQpOwotCWlmIChscG9ydC0+bGlua191cCkgewotCQkvKgotCQkgKiBXYWl0IHVwdG8gcmVzb3VyY2UgYWxsb2NhdGlvbiB0aW1lIG91dCBiZWZvcmUKLQkJICogZG9pbmcgcmUtbG9naW4gc2luY2UgaW5jb21wbGV0ZSBGSVAgZXhjaGFuZ2VkCi0JCSAqIGZyb20gbGFzdCBzZXNzaW9uIG1heSBjb2xsaWRlIHdpdGggZXhjaGFuZ2VzCi0JCSAqIGluIG5ldyBzZXNzaW9uLgotCQkgKi8KLQkJbXNsZWVwKGxwb3J0LT5yX2FfdG92KTsKKwlpZiAobHBvcnQtPmxpbmtfdXApCiAJCWZjX2xwb3J0X2VudGVyX2Zsb2dpKGxwb3J0KTsKLQl9CiB9CiAKIC8qKgpAQCAtMTQ4MSw2ICsxNDc0LDcgQEAKIAkJCSB2b2lkICpscF9hcmcpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGxwX2FyZzsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNfZWxzX2Zsb2dpICpmbHA7CiAJdTMyIGRpZDsKIAl1MTYgY3NwX2ZsYWdzOwpAQCAtMTUwOCw0OSArMTUwMiw1NiBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwogCWRpZCA9IGZjX2ZyYW1lX2RpZChmcCk7Ci0JaWYgKGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApID09IEVMU19MU19BQ0MgJiYgZGlkKSB7Ci0JCWZscCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmZscCkpOwotCQlpZiAoZmxwKSB7Ci0JCQltZnMgPSBudG9ocyhmbHAtPmZsX2NzcC5zcF9iYl9kYXRhKSAmCi0JCQkJRkNfU1BfQkJfREFUQV9NQVNLOwotCQkJaWYgKG1mcyA+PSBGQ19TUF9NSU5fTUFYX1BBWUxPQUQgJiYKLQkJCSAgICBtZnMgPCBscG9ydC0+bWZzKQotCQkJCWxwb3J0LT5tZnMgPSBtZnM7Ci0JCQljc3BfZmxhZ3MgPSBudG9ocyhmbHAtPmZsX2NzcC5zcF9mZWF0dXJlcyk7Ci0JCQlyX2FfdG92ID0gbnRvaGwoZmxwLT5mbF9jc3Auc3Bfcl9hX3Rvdik7Ci0JCQllX2RfdG92ID0gbnRvaGwoZmxwLT5mbF9jc3Auc3BfZV9kX3Rvdik7Ci0JCQlpZiAoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRURUUikKLQkJCQllX2RfdG92IC89IDEwMDAwMDA7Ci0KLQkJCWxwb3J0LT5ucGl2X2VuYWJsZWQgPSAhIShjc3BfZmxhZ3MgJiBGQ19TUF9GVF9OUElWX0FDQyk7Ci0KLQkJCWlmICgoY3NwX2ZsYWdzICYgRkNfU1BfRlRfRlBPUlQpID09IDApIHsKLQkJCQlpZiAoZV9kX3RvdiA+IGxwb3J0LT5lX2RfdG92KQotCQkJCQlscG9ydC0+ZV9kX3RvdiA9IGVfZF90b3Y7Ci0JCQkJbHBvcnQtPnJfYV90b3YgPSAyICogZV9kX3RvdjsKLQkJCQlmY19scG9ydF9zZXRfcG9ydF9pZChscG9ydCwgZGlkLCBmcCk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCVkOiBsaWJmYzogIgotCQkJCSAgICAgICAiUG9ydCAoJTYuNngpIGVudGVyZWQgIgotCQkJCSAgICAgICAicG9pbnQtdG8tcG9pbnQgbW9kZVxuIiwKLQkJCQkgICAgICAgbHBvcnQtPmhvc3QtPmhvc3Rfbm8sIGRpZCk7Ci0JCQkJZmNfbHBvcnRfcHRwX3NldHVwKGxwb3J0LCBmY19mcmFtZV9zaWQoZnApLAotCQkJCQkJICAgZ2V0X3VuYWxpZ25lZF9iZTY0KAotCQkJCQkJCSAgICZmbHAtPmZsX3d3cG4pLAotCQkJCQkJICAgZ2V0X3VuYWxpZ25lZF9iZTY0KAotCQkJCQkJCSAgICZmbHAtPmZsX3d3bm4pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbHBvcnQtPmVfZF90b3YgPSBlX2RfdG92OwotCQkJCWxwb3J0LT5yX2FfdG92ID0gcl9hX3RvdjsKLQkJCQlmY19ob3N0X2ZhYnJpY19uYW1lKGxwb3J0LT5ob3N0KSA9Ci0JCQkJCWdldF91bmFsaWduZWRfYmU2NCgmZmxwLT5mbF93d25uKTsKLQkJCQlmY19scG9ydF9zZXRfcG9ydF9pZChscG9ydCwgZGlkLCBmcCk7Ci0JCQkJZmNfbHBvcnRfZW50ZXJfZG5zKGxwb3J0KTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCUZDX0xQT1JUX0RCRyhscG9ydCwgIkZMT0dJIFJKVCBvciBiYWQgcmVzcG9uc2VcbiIpOworCWlmIChmaC0+Zmhfcl9jdGwgIT0gRkNfUkNUTF9FTFNfUkVQIHx8IGRpZCA9PSAwIHx8CisJICAgIGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApICE9IEVMU19MU19BQ0MpIHsKKwkJRkNfTFBPUlRfREJHKGxwb3J0LCAiRkxPR0kgbm90IGFjY2VwdGVkIG9yIGJhZCByZXNwb25zZVxuIik7CiAJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisJCWdvdG8gZXJyOworCX0KKworCWZscCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKmZscCkpOworCWlmICghZmxwKSB7CisJCUZDX0xQT1JUX0RCRyhscG9ydCwgIkZMT0dJIGJhZCByZXNwb25zZVxuIik7CisJCWZjX2xwb3J0X2Vycm9yKGxwb3J0LCBmcCk7CisJCWdvdG8gZXJyOworCX0KKworCW1mcyA9IG50b2hzKGZscC0+ZmxfY3NwLnNwX2JiX2RhdGEpICYKKwkJRkNfU1BfQkJfREFUQV9NQVNLOworCWlmIChtZnMgPj0gRkNfU1BfTUlOX01BWF9QQVlMT0FEICYmCisJICAgIG1mcyA8IGxwb3J0LT5tZnMpCisJCWxwb3J0LT5tZnMgPSBtZnM7CisJY3NwX2ZsYWdzID0gbnRvaHMoZmxwLT5mbF9jc3Auc3BfZmVhdHVyZXMpOworCXJfYV90b3YgPSBudG9obChmbHAtPmZsX2NzcC5zcF9yX2FfdG92KTsKKwllX2RfdG92ID0gbnRvaGwoZmxwLT5mbF9jc3Auc3BfZV9kX3Rvdik7CisJaWYgKGNzcF9mbGFncyAmIEZDX1NQX0ZUX0VEVFIpCisJCWVfZF90b3YgLz0gMTAwMDAwMDsKKworCWxwb3J0LT5ucGl2X2VuYWJsZWQgPSAhIShjc3BfZmxhZ3MgJiBGQ19TUF9GVF9OUElWX0FDQyk7CisKKwlpZiAoKGNzcF9mbGFncyAmIEZDX1NQX0ZUX0ZQT1JUKSA9PSAwKSB7CisJCWlmIChlX2RfdG92ID4gbHBvcnQtPmVfZF90b3YpCisJCQlscG9ydC0+ZV9kX3RvdiA9IGVfZF90b3Y7CisJCWxwb3J0LT5yX2FfdG92ID0gMiAqIGVfZF90b3Y7CisJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBkaWQsIGZwKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaG9zdCVkOiBsaWJmYzogIgorCQkgICAgICAgIlBvcnQgKCU2LjZ4KSBlbnRlcmVkICIKKwkJICAgICAgICJwb2ludC10by1wb2ludCBtb2RlXG4iLAorCQkgICAgICAgbHBvcnQtPmhvc3QtPmhvc3Rfbm8sIGRpZCk7CisJCWZjX2xwb3J0X3B0cF9zZXR1cChscG9ydCwgZmNfZnJhbWVfc2lkKGZwKSwKKwkJCQkgICBnZXRfdW5hbGlnbmVkX2JlNjQoCisJCQkJCSAgICZmbHAtPmZsX3d3cG4pLAorCQkJCSAgIGdldF91bmFsaWduZWRfYmU2NCgKKwkJCQkJICAgJmZscC0+Zmxfd3dubikpOworCX0gZWxzZSB7CisJCWxwb3J0LT5lX2RfdG92ID0gZV9kX3RvdjsKKwkJbHBvcnQtPnJfYV90b3YgPSByX2FfdG92OworCQlmY19ob3N0X2ZhYnJpY19uYW1lKGxwb3J0LT5ob3N0KSA9CisJCQlnZXRfdW5hbGlnbmVkX2JlNjQoJmZscC0+Zmxfd3dubik7CisJCWZjX2xwb3J0X3NldF9wb3J0X2lkKGxwb3J0LCBkaWQsIGZwKTsKKwkJZmNfbHBvcnRfZW50ZXJfZG5zKGxwb3J0KTsKIAl9CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ucGl2LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbnBpdi5jCmluZGV4IGYzM2I4OTcuLjlmYmY3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ucGl2LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX25waXYuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qKgogICogZmNfdnBvcnRfY3JlYXRlKCkgLSBDcmVhdGUgYSBuZXcgTlBJViB2cG9ydCBpbnN0YW5jZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYwppbmRleCA3NjBkYjc2Li5iOWU0MzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfcnBvcnQuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxzY3NpL2xpYmZjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCmluZGV4IDI1NmE5OTkuLjE0M2JiZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTMxNjMsNyArMzE2NCw2IEBACiB7CiAJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247Ci0JdWludDMyX3QgdmFsdWU7CiAKIAlzd2l0Y2gocGFyYW0pIHsKIAljYXNlIElTQ1NJX1BBUkFNX0ZBU1RfQUJPUlQ6CkBAIC0zMjIwLDE0ICszMjIwLDYgQEAKIAljYXNlIElTQ1NJX1BBUkFNX0VSTDoKIAkJc3NjYW5mKGJ1ZiwgIiVkIiwgJnNlc3Npb24tPmVybCk7CiAJCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fSUZNQVJLRVJfRU46Ci0JCXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSk7Ci0JCUJVR19PTih2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fT0ZNQVJLRVJfRU46Ci0JCXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSk7Ci0JCUJVR19PTih2YWx1ZSk7Ci0JCWJyZWFrOwogCWNhc2UgSVNDU0lfUEFSQU1fRVhQX1NUQVRTTjoKIAkJc3NjYW5mKGJ1ZiwgIiV1IiwgJmNvbm4tPmV4cF9zdGF0c24pOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYwppbmRleCAwOWIyMzJmZC4uNTcxNWEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCmluZGV4IGY1ODMxOTMuLjU0YTUxOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYwpAQCAtMjE5LDE3ICsyMTksMjAgQEAKIAogLyogLS0tLS0tLS0tLSBEZXZpY2UgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzYXNfdW5yZWdpc3Rlcl9jb21tb25fZGV2KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBzYXNfdW5yZWdpc3Rlcl9jb21tb25fZGV2KHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQsIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCiB7CiAJc2FzX25vdGlmeV9sbGRkX2Rldl9nb25lKGRldik7CiAJaWYgKCFkZXYtPnBhcmVudCkKIAkJZGV2LT5wb3J0LT5wb3J0X2RldiA9IE5VTEw7CiAJZWxzZQogCQlsaXN0X2RlbF9pbml0KCZkZXYtPnNpYmxpbmdzKTsKKworCXNwaW5fbG9ja19pcnEoJnBvcnQtPmRldl9saXN0X2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmRldi0+ZGV2X2xpc3Rfbm9kZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5kZXZfbGlzdF9sb2NrKTsKIH0KIAotdm9pZCBzYXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3ZvaWQgc2FzX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQsIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+cnBoeSkgewogCQlzYXNfcmVtb3ZlX2NoaWxkcmVuKCZkZXYtPnJwaHktPmRldik7CkBAIC0yNDEsMTUgKzI0NCwxNSBAQAogCQlrZnJlZShkZXYtPmV4X2Rldi5leF9waHkpOwogCQlkZXYtPmV4X2Rldi5leF9waHkgPSBOVUxMOwogCX0KLQlzYXNfdW5yZWdpc3Rlcl9jb21tb25fZGV2KGRldik7CisJc2FzX3VucmVnaXN0ZXJfY29tbW9uX2Rldihwb3J0LCBkZXYpOwogfQogCiB2b2lkIHNhc191bnJlZ2lzdGVyX2RvbWFpbl9kZXZpY2VzKHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgKm47CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkZXYsbiwmcG9ydC0+ZGV2X2xpc3QsZGV2X2xpc3Rfbm9kZSkKLQkJc2FzX3VucmVnaXN0ZXJfZGV2KGRldik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCBuLCAmcG9ydC0+ZGV2X2xpc3QsIGRldl9saXN0X25vZGUpCisJCXNhc191bnJlZ2lzdGVyX2Rldihwb3J0LCBkZXYpOwogCiAJcG9ydC0+cG9ydC0+cnBoeSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCmluZGV4IDE2YWQ5N2QuLjFiODMxYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwpAQCAtMTk5LDYgKzE5OSw4IEBACiAJcGh5LT52aXJ0dWFsID0gZHItPnZpcnR1YWw7CiAJcGh5LT5sYXN0X2RhX2luZGV4ID0gLTE7CiAKKwlwaHktPnBoeS0+aWRlbnRpZnkuc2FzX2FkZHJlc3MgPSBTQVNfQUREUihwaHktPmF0dGFjaGVkX3Nhc19hZGRyKTsKKwlwaHktPnBoeS0+aWRlbnRpZnkuZGV2aWNlX3R5cGUgPSBwaHktPmF0dGFjaGVkX2Rldl90eXBlOwogCXBoeS0+cGh5LT5pZGVudGlmeS5pbml0aWF0b3JfcG9ydF9wcm90b2NvbHMgPSBwaHktPmF0dGFjaGVkX2lwcm90bzsKIAlwaHktPnBoeS0+aWRlbnRpZnkudGFyZ2V0X3BvcnRfcHJvdG9jb2xzID0gcGh5LT5hdHRhY2hlZF90cHJvdG87CiAJcGh5LT5waHktPmlkZW50aWZ5LnBoeV9pZGVudGlmaWVyID0gcGh5X2lkOwpAQCAtMzI5LDYgKzMzMSw3IEBACiAJZGV2LT5leF9kZXYuZXhfY2hhbmdlX2NvdW50ID0gYmUxNl90b19jcHUocmctPmNoYW5nZV9jb3VudCk7CiAJZGV2LT5leF9kZXYubWF4X3JvdXRlX2luZGV4ZXMgPSBiZTE2X3RvX2NwdShyZy0+cm91dGVfaW5kZXhlcyk7CiAJZGV2LT5leF9kZXYubnVtX3BoeXMgPSBtaW4ocmctPm51bV9waHlzLCAodTgpTUFYX0VYUEFOREVSX1BIWVMpOworCWRldi0+ZXhfZGV2LnQydF9zdXBwID0gcmctPnQydF9zdXBwOwogCWRldi0+ZXhfZGV2LmNvbmZfcm91dGVfdGFibGUgPSByZy0+Y29uZl9yb3V0ZV90YWJsZTsKIAlkZXYtPmV4X2Rldi5jb25maWd1cmluZyA9IHJnLT5jb25maWd1cmluZzsKIAltZW1jcHkoZGV2LT5leF9kZXYuZW5jbG9zdXJlX2xvZ2ljYWxfaWQsIHJnLT5lbmNsb3N1cmVfbG9naWNhbF9pZCwgOCk7CkBAIC03NTEsNyArNzU0LDEwIEBACiAgb3V0X2xpc3RfZGVsOgogCXNhc19ycGh5X2ZyZWUoY2hpbGQtPnJwaHkpOwogCWNoaWxkLT5ycGh5ID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnEoJnBhcmVudC0+cG9ydC0+ZGV2X2xpc3RfbG9jayk7CiAJbGlzdF9kZWwoJmNoaWxkLT5kZXZfbGlzdF9ub2RlKTsKKwlzcGluX3VubG9ja19pcnEoJnBhcmVudC0+cG9ydC0+ZGV2X2xpc3RfbG9jayk7CiAgb3V0X2ZyZWU6CiAJc2FzX3BvcnRfZGVsZXRlKHBoeS0+cG9ydCk7CiAgb3V0X2VycjoKQEAgLTExMzMsMTUgKzExMzksMTcgQEAKIAl9OwogCXN0cnVjdCBkb21haW5fZGV2aWNlICpwYXJlbnQgPSBjaGlsZC0+cGFyZW50OwogCi0Jc2FzX3ByaW50aygiJXMgZXggJTAxNmxseCBwaHkgMHgleCA8LS0+ICVzIGV4ICUwMTZsbHggcGh5IDB4JXggIgotCQkgICAiaGFzICVjOiVjIHJvdXRpbmcgbGluayFcbiIsCisJc2FzX3ByaW50aygiJXMgZXggJTAxNmxseCAoVDJUIHN1cHA6JWQpIHBoeSAweCV4IDwtLT4gJXMgZXggJTAxNmxseCAiCisJCSAgICIoVDJUIHN1cHA6JWQpIHBoeSAweCV4IGhhcyAlYzolYyByb3V0aW5nIGxpbmshXG4iLAogCiAJCSAgIGV4X3R5cGVbcGFyZW50LT5kZXZfdHlwZV0sCiAJCSAgIFNBU19BRERSKHBhcmVudC0+c2FzX2FkZHIpLAorCQkgICBwYXJlbnQtPmV4X2Rldi50MnRfc3VwcCwKIAkJICAgcGFyZW50X3BoeS0+cGh5X2lkLAogCiAJCSAgIGV4X3R5cGVbY2hpbGQtPmRldl90eXBlXSwKIAkJICAgU0FTX0FERFIoY2hpbGQtPnNhc19hZGRyKSwKKwkJICAgY2hpbGQtPmV4X2Rldi50MnRfc3VwcCwKIAkJICAgY2hpbGRfcGh5LT5waHlfaWQsCiAKIAkJICAgcmFfY2hhcltwYXJlbnRfcGh5LT5yb3V0aW5nX2F0dHJdLApAQCAtMTIzOCwxMCArMTI0NiwxNSBAQAogCQkJCQlzYXNfcHJpbnRfcGFyZW50X3RvcG9sb2d5X2J1ZyhjaGlsZCwgcGFyZW50X3BoeSwgY2hpbGRfcGh5KTsKIAkJCQkJcmVzID0gLUVOT0RFVjsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcmVudF9waHktPnJvdXRpbmdfYXR0ciA9PSBUQUJMRV9ST1VUSU5HICYmCi0JCQkJICAgY2hpbGRfcGh5LT5yb3V0aW5nX2F0dHIgIT0gU1VCVFJBQ1RJVkVfUk9VVElORykgewotCQkJCXNhc19wcmludF9wYXJlbnRfdG9wb2xvZ3lfYnVnKGNoaWxkLCBwYXJlbnRfcGh5LCBjaGlsZF9waHkpOwotCQkJCXJlcyA9IC1FTk9ERVY7CisJCQl9IGVsc2UgaWYgKHBhcmVudF9waHktPnJvdXRpbmdfYXR0ciA9PSBUQUJMRV9ST1VUSU5HKSB7CisJCQkJaWYgKGNoaWxkX3BoeS0+cm91dGluZ19hdHRyID09IFNVQlRSQUNUSVZFX1JPVVRJTkcgfHwKKwkJCQkgICAgKGNoaWxkX3BoeS0+cm91dGluZ19hdHRyID09IFRBQkxFX1JPVVRJTkcgJiYKKwkJCQkgICAgIGNoaWxkX2V4LT50MnRfc3VwcCAmJiBwYXJlbnRfZXgtPnQydF9zdXBwKSkgeworCQkJCQkvKiBBbGwgZ29vZCAqLzsKKwkJCQl9IGVsc2UgeworCQkJCQlzYXNfcHJpbnRfcGFyZW50X3RvcG9sb2d5X2J1ZyhjaGlsZCwgcGFyZW50X3BoeSwgY2hpbGRfcGh5KTsKKwkJCQkJcmVzID0gLUVOT0RFVjsKKwkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBGQU5PVVRfREVWOgpAQCAtMTcyOSw3ICsxNzQyLDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgdm9pZCBzYXNfdW5yZWdpc3Rlcl9leF90cmVlKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBzYXNfdW5yZWdpc3Rlcl9leF90cmVlKHN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQsIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV4cGFuZGVyX2RldmljZSAqZXggPSAmZGV2LT5leF9kZXY7CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmNoaWxkLCAqbjsKQEAgLTE3MzgsMTEgKzE3NTEsMTEgQEAKIAkJY2hpbGQtPmdvbmUgPSAxOwogCQlpZiAoY2hpbGQtPmRldl90eXBlID09IEVER0VfREVWIHx8CiAJCSAgICBjaGlsZC0+ZGV2X3R5cGUgPT0gRkFOT1VUX0RFVikKLQkJCXNhc191bnJlZ2lzdGVyX2V4X3RyZWUoY2hpbGQpOworCQkJc2FzX3VucmVnaXN0ZXJfZXhfdHJlZShwb3J0LCBjaGlsZCk7CiAJCWVsc2UKLQkJCXNhc191bnJlZ2lzdGVyX2RldihjaGlsZCk7CisJCQlzYXNfdW5yZWdpc3Rlcl9kZXYocG9ydCwgY2hpbGQpOwogCX0KLQlzYXNfdW5yZWdpc3Rlcl9kZXYoZGV2KTsKKwlzYXNfdW5yZWdpc3Rlcl9kZXYocG9ydCwgZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgc2FzX3VucmVnaXN0ZXJfZGV2c19zYXNfYWRkcihzdHJ1Y3QgZG9tYWluX2RldmljZSAqcGFyZW50LApAQCAtMTc1OSw5ICsxNzcyLDkgQEAKIAkJCQljaGlsZC0+Z29uZSA9IDE7CiAJCQkJaWYgKGNoaWxkLT5kZXZfdHlwZSA9PSBFREdFX0RFViB8fAogCQkJCSAgICBjaGlsZC0+ZGV2X3R5cGUgPT0gRkFOT1VUX0RFVikKLQkJCQkJc2FzX3VucmVnaXN0ZXJfZXhfdHJlZShjaGlsZCk7CisJCQkJCXNhc191bnJlZ2lzdGVyX2V4X3RyZWUocGFyZW50LT5wb3J0LCBjaGlsZCk7CiAJCQkJZWxzZQotCQkJCQlzYXNfdW5yZWdpc3Rlcl9kZXYoY2hpbGQpOworCQkJCQlzYXNfdW5yZWdpc3Rlcl9kZXYocGFyZW50LT5wb3J0LCBjaGlsZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCmluZGV4IDA0YWQ4ZGQuLmJiOGY0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAic2FzX2ludGVybmFsLmgiCiAKQEAgLTUxLDYgKzUyLDkxIEBACiAJcmVzcF9kYXRhWzE1XSA9IHJwaHktPmlkZW50aWZ5LnRhcmdldF9wb3J0X3Byb3RvY29sczsKIH0KIAorLyoqCisgKiB0b19zYXNfZ3Bpb19ncF9iaXQgLSBnaXZlbiB0aGUgZ3BpbyBmcmFtZSBkYXRhIGZpbmQgdGhlIGJ5dGUvYml0IHBvc2l0aW9uIG9mICdvZCcKKyAqIEBvZDogb2QgYml0IHRvIGZpbmQKKyAqIEBkYXRhOiBpbmNvbWluZyBiaXRzdHJlYW0gKGZyb20gZnJhbWUpCisgKiBAaW5kZXg6IHJlcXVlc3RlZCBkYXRhIHJlZ2lzdGVyIGluZGV4IChmcm9tIGZyYW1lKQorICogQGNvdW50OiB0b3RhbCBudW1iZXIgb2YgcmVnaXN0ZXJzIGluIHRoZSBiaXRzdHJlYW0gKGZyb20gZnJhbWUpCisgKiBAYml0OiBiaXQgcG9zaXRpb24gb2YgJ29kJyBpbiB0aGUgcmV0dXJuZWQgYnl0ZQorICoKKyAqIHJldHVybnMgTlVMTCBpZiAnb2QnIGlzIG5vdCBpbiAnZGF0YScKKyAqCisgKiBGcm9tIFNGRi04NDg1IHYwLjc6CisgKiAiSW4gR1BJT19UWFsxXSwgYml0IDAgb2YgYnl0ZSAzIGNvbnRhaW5zIHRoZSBmaXJzdCBiaXQgKGkuZS4sIE9EMC4wKQorICogIGFuZCBiaXQgNyBvZiBieXRlIDAgY29udGFpbnMgdGhlIDMybmQgYml0IChpLmUuLCBPRDEwLjEpLgorICoKKyAqICBJbiBHUElPX1RYWzJdLCBiaXQgMCBvZiBieXRlIDMgY29udGFpbnMgdGhlIDMzcmQgYml0IChpLmUuLCBPRDEwLjIpCisgKiAgYW5kIGJpdCA3IG9mIGJ5dGUgMCBjb250YWlucyB0aGUgNjR0aCBiaXQgKGkuZS4sIE9EMjEuMCkuIgorICoKKyAqIFRoZSBnZW5lcmFsLXB1cnBvc2UgKHJhdy1iaXRzdHJlYW0pIFJYIHJlZ2lzdGVycyBoYXZlIHRoZSBzYW1lIGxheW91dAorICogYWx0aG91Z2ggJ29kJyBpcyByZW5hbWVkICdpZCcgZm9yICdpbnB1dCBkYXRhJy4KKyAqCisgKiBTRkYtODQ4OSBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgTEVEcyBpbiByZXNwb25zZSB0byB0aGUgJ29kJyB2YWx1ZXMuCisgKi8KK3N0YXRpYyB1OCAqdG9fc2FzX2dwaW9fZ3BfYml0KHVuc2lnbmVkIGludCBvZCwgdTggKmRhdGEsIHU4IGluZGV4LCB1OCBjb3VudCwgdTggKmJpdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCXU4IGJ5dGU7CisKKwkvKiBncCByZWdpc3RlcnMgc3RhcnQgYXQgaW5kZXggMSAqLworCWlmIChpbmRleCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWluZGV4LS07IC8qIG1ha2UgaW5kZXggMC1iYXNlZCAqLworCWlmIChvZCA8IGluZGV4ICogMzIpCisJCXJldHVybiBOVUxMOworCisJb2QgLT0gaW5kZXggKiAzMjsKKwlyZWcgPSBvZCA+PiA1OworCisJaWYgKHJlZyA+PSBjb3VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlvZCAmPSAoMSA8PCA1KSAtIDE7CisJYnl0ZSA9IDMgLSAob2QgPj4gMyk7CisJKmJpdCA9IG9kICYgKCgxIDw8IDMpIC0gMSk7CisKKwlyZXR1cm4gJmRhdGFbcmVnICogNCArIGJ5dGVdOworfQorCitpbnQgdHJ5X3Rlc3Rfc2FzX2dwaW9fZ3BfYml0KHVuc2lnbmVkIGludCBvZCwgdTggKmRhdGEsIHU4IGluZGV4LCB1OCBjb3VudCkKK3sKKwl1OCAqYnl0ZTsKKwl1OCBiaXQ7CisKKwlieXRlID0gdG9fc2FzX2dwaW9fZ3BfYml0KG9kLCBkYXRhLCBpbmRleCwgY291bnQsICZiaXQpOworCWlmICghYnl0ZSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuICgqYnl0ZSA+PiBiaXQpICYgMTsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3Rlc3Rfc2FzX2dwaW9fZ3BfYml0KTsKKworc3RhdGljIGludCBzYXNfaG9zdF9zbXBfd3JpdGVfZ3BpbyhzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhLCB1OCAqcmVzcF9kYXRhLAorCQkJCSAgIHU4IHJlZ190eXBlLCB1OCByZWdfaW5kZXgsIHU4IHJlZ19jb3VudCwKKwkJCQkgICB1OCAqcmVxX2RhdGEpCit7CisJc3RydWN0IHNhc19pbnRlcm5hbCAqaSA9IHRvX3Nhc19pbnRlcm5hbChzYXNfaGEtPmNvcmUuc2hvc3QtPnRyYW5zcG9ydHQpOworCWludCB3cml0dGVuOworCisJaWYgKGktPmRmdC0+bGxkZF93cml0ZV9ncGlvID09IE5VTEwpIHsKKwkJcmVzcF9kYXRhWzJdID0gU01QX1JFU1BfRlVOQ19VTks7CisJCXJldHVybiAwOworCX0KKworCXdyaXR0ZW4gPSBpLT5kZnQtPmxsZGRfd3JpdGVfZ3BpbyhzYXNfaGEsIHJlZ190eXBlLCByZWdfaW5kZXgsCisJCQkJCSAgcmVnX2NvdW50LCByZXFfZGF0YSk7CisKKwlpZiAod3JpdHRlbiA8IDApIHsKKwkJcmVzcF9kYXRhWzJdID0gU01QX1JFU1BfRlVOQ19GQUlMRUQ7CisJCXdyaXR0ZW4gPSAwOworCX0gZWxzZQorCQlyZXNwX2RhdGFbMl0gPSBTTVBfUkVTUF9GVU5DX0FDQzsKKworCXJldHVybiB3cml0dGVuOworfQorCiBzdGF0aWMgdm9pZCBzYXNfcmVwb3J0X3BoeV9zYXRhKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEsIHU4ICpyZXNwX2RhdGEsCiAJCQkJdTggcGh5X2lkKQogewpAQCAtMjMwLDkgKzMxNiwyMyBAQAogCQkvKiBDYW4ndCBpbXBsZW1lbnQ7IGhvc3RzIGhhdmUgbm8gcm91dGVzICovCiAJCWJyZWFrOwogCi0JY2FzZSBTTVBfV1JJVEVfR1BJT19SRUc6Ci0JCS8qIEZJWE1FOiBuZWVkIEdQSU8gc3VwcG9ydCBpbiB0aGUgdHJhbnNwb3J0IGNsYXNzICovCisJY2FzZSBTTVBfV1JJVEVfR1BJT19SRUc6IHsKKwkJLyogU0ZGLTg0ODUgdjAuNyAqLworCQljb25zdCBpbnQgYmFzZV9mcmFtZV9zaXplID0gMTE7CisJCWludCB0b193cml0ZSA9IHJlcV9kYXRhWzRdOworCisJCWlmIChibGtfcnFfYnl0ZXMocmVxKSA8IGJhc2VfZnJhbWVfc2l6ZSArIHRvX3dyaXRlICogNCB8fAorCQkgICAgcmVxLT5yZXNpZF9sZW4gPCBiYXNlX2ZyYW1lX3NpemUgKyB0b193cml0ZSAqIDQpIHsKKwkJCXJlc3BfZGF0YVsyXSA9IFNNUF9SRVNQX0lOVl9GUk1fTEVOOworCQkJYnJlYWs7CisJCX0KKworCQl0b193cml0ZSA9IHNhc19ob3N0X3NtcF93cml0ZV9ncGlvKHNhc19oYSwgcmVzcF9kYXRhLCByZXFfZGF0YVsyXSwKKwkJCQkJCSAgIHJlcV9kYXRhWzNdLCB0b193cml0ZSwgJnJlcV9kYXRhWzhdKTsKKwkJcmVxLT5yZXNpZF9sZW4gLT0gYmFzZV9mcmFtZV9zaXplICsgdG9fd3JpdGUgKiA0OworCQlyc3AtPnJlc2lkX2xlbiAtPSA4OwogCQlicmVhazsKKwl9CiAKIAljYXNlIFNNUF9DT05GX1JPVVRFX0lORk86CiAJCS8qIENhbid0IGltcGxlbWVudDsgaG9zdHMgaGF2ZSBubyByb3V0ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2luaXQuYwppbmRleCAyZGM1NTM0Li5kODFjM2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW5pdC5jCkBAIC0zNyw3ICszNywzMiBAQAogCiAjaW5jbHVkZSAiLi4vc2NzaV9zYXNfaW50ZXJuYWwuaCIKIAotc3RydWN0IGttZW1fY2FjaGUgKnNhc190YXNrX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzYXNfdGFza19jYWNoZTsKKworc3RydWN0IHNhc190YXNrICpzYXNfYWxsb2NfdGFzayhnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBrbWVtX2NhY2hlX3phbGxvYyhzYXNfdGFza19jYWNoZSwgZmxhZ3MpOworCisJaWYgKHRhc2spIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhc2stPmxpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyA9IFNBU19UQVNLX1NUQVRFX1BFTkRJTkc7CisJCWluaXRfdGltZXIoJnRhc2stPnRpbWVyKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZ0YXNrLT5jb21wbGV0aW9uKTsKKwl9CisKKwlyZXR1cm4gdGFzazsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNhc19hbGxvY190YXNrKTsKKwordm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwlpZiAodGFzaykgeworCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKKwkJa21lbV9jYWNoZV9mcmVlKHNhc190YXNrX2NhY2hlLCB0YXNrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYXNfZnJlZV90YXNrKTsKIAogLyotLS0tLS0tLS0tLS0gU0FTIGFkZHIgaGFzaCAtLS0tLS0tLS0tLSovCiB2b2lkIHNhc19oYXNoX2FkZHIodTggKmhhc2hlZCwgY29uc3QgdTggKnNhc19hZGRyKQpAQCAtMTUyLDEwICsxNzcsMTUgQEAKIAogc3RhdGljIGludCBzYXNfZ2V0X2xpbmtlcnJvcnMoc3RydWN0IHNhc19waHkgKnBoeSkKIHsKLQlpZiAoc2NzaV9pc19zYXNfcGh5X2xvY2FsKHBoeSkpCi0JCS8qIEZJWE1FOiB3ZSBoYXZlIG5vIGxvY2FsIHBoeSBzdGF0cwotCQkgKiBnYXRoZXJpbmcgYXQgdGhpcyB0aW1lICovCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChzY3NpX2lzX3Nhc19waHlfbG9jYWwocGh5KSkgeworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChwaHktPmRldi5wYXJlbnQpOworCQlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwkJc3RydWN0IGFzZF9zYXNfcGh5ICphc2RfcGh5ID0gc2FzX2hhLT5zYXNfcGh5W3BoeS0+bnVtYmVyXTsKKwkJc3RydWN0IHNhc19pbnRlcm5hbCAqaSA9CisJCQl0b19zYXNfaW50ZXJuYWwoc2FzX2hhLT5jb3JlLnNob3N0LT50cmFuc3BvcnR0KTsKKworCQlyZXR1cm4gaS0+ZGZ0LT5sbGRkX2NvbnRyb2xfcGh5KGFzZF9waHksIFBIWV9GVU5DX0dFVF9FVkVOVFMsIE5VTEwpOworCX0KIAogCXJldHVybiBzYXNfc21wX2dldF9waHlfZXZlbnRzKHBoeSk7CiB9CkBAIC0yOTMsOCArMzIzLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2FzX2NsYXNzX2luaXQodm9pZCkKIHsKLQlzYXNfdGFza19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzYXNfdGFzayIsIHNpemVvZihzdHJ1Y3Qgc2FzX3Rhc2spLAotCQkJCQkgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCXNhc190YXNrX2NhY2hlID0gS01FTV9DQUNIRShzYXNfdGFzaywgU0xBQl9IV0NBQ0hFX0FMSUdOKTsKIAlpZiAoIXNhc190YXNrX2NhY2hlKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwppbmRleCBlZWJhNzZjLi5iNmUyMzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgInNhc19pbnRlcm5hbC5oIgpAQCAtMTgyLDc4ICsxODMsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBzYXNfcXVldWVjb21tYW5kIC0tIEVucXVldWUgYSBjb21tYW5kIGZvciBwcm9jZXNzaW5nCi0gKiBAcGFyYW1ldGVyczogU2VlIFNDU0kgQ29yZSBkb2N1bWVudGF0aW9uCi0gKgotICogTm90ZTogWFhYOiBSZW1vdmUgdGhlIGhvc3QgdW5sb2NrL2xvY2sgcGFpciB3aGVuIFNDU0kgQ29yZSBjYW4KLSAqIGNhbGwgdXMgd2l0aG91dCBob2xkaW5nIGFuIElSUSBzcGlubG9jay4uLgotICovCi1zdGF0aWMgaW50IHNhc19xdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJICAgICB2b2lkICgqc2NzaV9kb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQotCV9fcmVsZWFzZXMoaG9zdC0+aG9zdF9sb2NrKQotCV9fYWNxdWlyZXMoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaykKLQlfX3JlbGVhc2VzKGRldi0+c2F0YV9kZXYuYXAtPmxvY2spCi0JX19hY3F1aXJlcyhob3N0LT5ob3N0X2xvY2spCitpbnQgc2FzX3F1ZXVlY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7Ci0JaW50IHJlcyA9IDA7Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGNtZF90b19kb21haW5fZGV2KGNtZCk7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OwogCXN0cnVjdCBzYXNfaW50ZXJuYWwgKmkgPSB0b19zYXNfaW50ZXJuYWwoaG9zdC0+dHJhbnNwb3J0dCk7CisJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IGNtZF90b19kb21haW5fZGV2KGNtZCk7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IGRldi0+cG9ydC0+aGE7CisJc3RydWN0IHNhc190YXNrICp0YXNrOworCWludCByZXMgPSAwOwogCi0Jc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7Ci0KLQl7Ci0JCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBkZXYtPnBvcnQtPmhhOwotCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7Ci0KLQkJLyogSWYgdGhlIGRldmljZSBmZWxsIG9mZiwgbm8gc2Vuc2UgaW4gaXNzdWluZyBjb21tYW5kcyAqLwotCQlpZiAoZGV2LT5nb25lKSB7Ci0JCQljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OwotCQkJc2NzaV9kb25lKGNtZCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWlmIChkZXZfaXNfc2F0YShkZXYpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPnNhdGFfZGV2LmFwLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXMgPSBhdGFfc2FzX3F1ZXVlY21kKGNtZCwgZGV2LT5zYXRhX2Rldi5hcCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+c2F0YV9kZXYuYXAtPmxvY2ssIGZsYWdzKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVzID0gLUVOT01FTTsKLQkJdGFzayA9IHNhc19jcmVhdGVfdGFzayhjbWQsIGRldiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghdGFzaykKLQkJCWdvdG8gb3V0OwotCi0JCWNtZC0+c2NzaV9kb25lID0gc2NzaV9kb25lOwotCQkvKiBRdWV1ZSB1cCwgRGlyZWN0IE1vZGUgb3IgVGFzayBDb2xsZWN0b3IgTW9kZS4gKi8KLQkJaWYgKHNhc19oYS0+bGxkZF9tYXhfZXhlY3V0ZV9udW0gPCAyKQotCQkJcmVzID0gaS0+ZGZ0LT5sbGRkX2V4ZWN1dGVfdGFzayh0YXNrLCAxLCBHRlBfQVRPTUlDKTsKLQkJZWxzZQotCQkJcmVzID0gc2FzX3F1ZXVlX3VwKHRhc2spOwotCi0JCS8qIEV4YW1pbmUgKi8KLQkJaWYgKHJlcykgewotCQkJU0FTX0RQUklOVEsoImxsZGRfZXhlY3V0ZV90YXNrIHJldHVybmVkOiAlZFxuIiwgcmVzKTsKLQkJCUFTU0lHTl9TQVNfVEFTSyhjbWQsIE5VTEwpOwotCQkJc2FzX2ZyZWVfdGFzayh0YXNrKTsKLQkJCWlmIChyZXMgPT0gLVNBU19RVUVVRV9GVUxMKSB7Ci0JCQkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsgLyogcmV0cnkgKi8KLQkJCQlyZXMgPSAwOwotCQkJCXNjc2lfZG9uZShjbWQpOwotCQkJfQotCQkJZ290byBvdXQ7Ci0JCX0KKwkvKiBJZiB0aGUgZGV2aWNlIGZlbGwgb2ZmLCBubyBzZW5zZSBpbiBpc3N1aW5nIGNvbW1hbmRzICovCisJaWYgKGRldi0+Z29uZSkgeworCQljbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQlnb3RvIG91dF9kb25lOwogCX0KLW91dDoKLQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7Ci0JcmV0dXJuIHJlczsKLX0KIAotREVGX1NDU0lfUUNNRChzYXNfcXVldWVjb21tYW5kKQorCWlmIChkZXZfaXNfc2F0YShkZXYpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOworCQlyZXMgPSBhdGFfc2FzX3F1ZXVlY21kKGNtZCwgZGV2LT5zYXRhX2Rldi5hcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmVzOworCX0KKworCXRhc2sgPSBzYXNfY3JlYXRlX3Rhc2soY21kLCBkZXYsIEdGUF9BVE9NSUMpOworCWlmICghdGFzaykKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwkvKiBRdWV1ZSB1cCwgRGlyZWN0IE1vZGUgb3IgVGFzayBDb2xsZWN0b3IgTW9kZS4gKi8KKwlpZiAoc2FzX2hhLT5sbGRkX21heF9leGVjdXRlX251bSA8IDIpCisJCXJlcyA9IGktPmRmdC0+bGxkZF9leGVjdXRlX3Rhc2sodGFzaywgMSwgR0ZQX0FUT01JQyk7CisJZWxzZQorCQlyZXMgPSBzYXNfcXVldWVfdXAodGFzayk7CisKKwlpZiAocmVzKQorCQlnb3RvIG91dF9mcmVlX3Rhc2s7CisJcmV0dXJuIDA7CisKK291dF9mcmVlX3Rhc2s6CisJU0FTX0RQUklOVEsoImxsZGRfZXhlY3V0ZV90YXNrIHJldHVybmVkOiAlZFxuIiwgcmVzKTsKKwlBU1NJR05fU0FTX1RBU0soY21kLCBOVUxMKTsKKwlzYXNfZnJlZV90YXNrKHRhc2spOworCWlmIChyZXMgPT0gLVNBU19RVUVVRV9GVUxMKQorCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OyAvKiByZXRyeSAqLworCWVsc2UKKwkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CitvdXRfZG9uZToKKwljbWQtPnNjc2lfZG9uZShjbWQpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgdm9pZCBzYXNfZWhfZmluaXNoX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CkBAIC03ODQsOCArNzYyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTQVNfREVGX1FEIDMyCi0jZGVmaW5lIFNBU19NQVhfUUQgNjQKKyNkZWZpbmUgU0FTX0RFRl9RRCAyNTYKIAogaW50IHNhc19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldikKIHsKQEAgLTgyNSwzNCArODAyLDQxIEBACiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzY3NpX2Rldik7CiAKIAlpZiAoZGV2X2lzX3NhdGEoZGV2KSkKLQkJZGV2LT5zYXRhX2Rldi5hcC0+bGluay5kZXZpY2VbMF0uY2xhc3MgPSBBVEFfREVWX05PTkU7CisJCXNhc190b19hdGFfZGV2KGRldiktPmNsYXNzID0gQVRBX0RFVl9OT05FOwogfQogCi1pbnQgc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2LCBpbnQgbmV3X2RlcHRoLAotCQkJICAgaW50IHJlYXNvbikKK2ludCBzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGRlcHRoLCBpbnQgcmVhc29uKQogewotCWludCByZXMgPSBtaW4obmV3X2RlcHRoLCBTQVNfTUFYX1FEKTsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNkZXYpOwogCi0JaWYgKHJlYXNvbiAhPSBTQ1NJX1FERVBUSF9ERUZBVUxUKQorCWlmIChkZXZfaXNfc2F0YShkZXYpKQorCQlyZXR1cm4gX19hdGFfY2hhbmdlX3F1ZXVlX2RlcHRoKGRldi0+c2F0YV9kZXYuYXAsIHNkZXYsIGRlcHRoLAorCQkJCQkJcmVhc29uKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTQ1NJX1FERVBUSF9ERUZBVUxUOgorCWNhc2UgU0NTSV9RREVQVEhfUkFNUF9VUDoKKwkJaWYgKCFzZGV2LT50YWdnZWRfc3VwcG9ydGVkKQorCQkJZGVwdGggPSAxOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwgZGVwdGgpOworCQlicmVhazsKKwljYXNlIFNDU0lfUURFUFRIX1FGVUxMOgorCQlzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoc2RldiwgZGVwdGgpOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCi0JCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNjc2lfZGV2LCBzY3NpX2dldF90YWdfdHlwZShzY3NpX2RldiksCi0JCQkJCXJlcyk7Ci0JZWxzZSB7Ci0JCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoc2NzaV9kZXYpOwotCQlzYXNfcHJpbnRrKCJkZXZpY2UgJWxseCBMVU4gJXggcXVldWUgZGVwdGggY2hhbmdlZCB0byAxXG4iLAotCQkJICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCi0JCQkgICBzY3NpX2Rldi0+bHVuKTsKLQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2NzaV9kZXYsIDAsIDEpOwotCQlyZXMgPSAxOwogCX0KIAotCXJldHVybiByZXM7CisJcmV0dXJuIGRlcHRoOwogfQogCiBpbnQgc2FzX2NoYW5nZV9xdWV1ZV90eXBlKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYsIGludCBxdCkKIHsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gc2Rldl90b19kb21haW5fZGV2KHNjc2lfZGV2KTsKKworCWlmIChkZXZfaXNfc2F0YShkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICghc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc190YXNrLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc190YXNrLmMKaW5kZXggYjEzYTMzNC4uYTc4ZTViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfdGFzay5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Rhc2suYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzY3NpL3Nhcy5oPgogI2luY2x1ZGUgPHNjc2kvbGlic2FzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzcnAuYyBiL2RyaXZlcnMvc2NzaS9saWJzcnAuYwppbmRleCBmZjZhMjhjLi4wNzA3ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic3JwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNycC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggYzA4OGEzNi4uYmI0YzhlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtODQ2LDggKzg0NiwyNCBAQAogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2hicWluZm87CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZHVtcEhvc3RTbGltOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBIQkFTbGltOwotCXN0cnVjdCBkZW50cnkgKmRlYnVnX2R1bXBEYXRhOyAgIC8qIEJsb2NrR3VhcmQgQlBMKi8KLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kdW1wRGlmOyAgICAvKiBCbG9ja0d1YXJkIEJQTCovCisJc3RydWN0IGRlbnRyeSAqZGVidWdfZHVtcERhdGE7ICAgLyogQmxvY2tHdWFyZCBCUEwgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kdW1wRGlmOyAgICAvKiBCbG9ja0d1YXJkIEJQTCAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX0luakVyckxCQTsgIC8qIExCQSB0byBpbmplY3QgZXJyb3JzIGF0ICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdfd3JpdGVHdWFyZDsgLyogaW5qZWN0IHdyaXRlIGd1YXJkX3RhZyBlcnJvcnMgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z193cml0ZUFwcDsgICAvKiBpbmplY3Qgd3JpdGUgYXBwX3RhZyBlcnJvcnMgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z193cml0ZVJlZjsgICAvKiBpbmplY3Qgd3JpdGUgcmVmX3RhZyBlcnJvcnMgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19yZWFkQXBwOyAgICAvKiBpbmplY3QgcmVhZCBhcHBfdGFnIGVycm9ycyAqLworCXN0cnVjdCBkZW50cnkgKmRlYnVnX3JlYWRSZWY7ICAgIC8qIGluamVjdCByZWFkIHJlZl90YWcgZXJyb3JzICovCisKKwkvKiBUMTAgRElGIGVycm9yIGluamVjdGlvbiAqLworCXVpbnQzMl90IGxwZmNfaW5qZXJyX3dncmRfY250OworCXVpbnQzMl90IGxwZmNfaW5qZXJyX3dhcHBfY250OworCXVpbnQzMl90IGxwZmNfaW5qZXJyX3dyZWZfY250OworCXVpbnQzMl90IGxwZmNfaW5qZXJyX3JhcHBfY250OworCXVpbnQzMl90IGxwZmNfaW5qZXJyX3JyZWZfY250OworCXNlY3Rvcl90IGxwZmNfaW5qZXJyX2xiYTsKKyNkZWZpbmUgTFBGQ19JTkpFUlJfTEJBX09GRgkoc2VjdG9yX3QpMHhmZmZmZmZmZmZmZmZmZmZmCisKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19zbG93X3JpbmdfdHJjOwogCXN0cnVjdCBscGZjX2RlYnVnZnNfdHJjICpzbG93X3JpbmdfdHJjOwogCWF0b21pY190IHNsb3dfcmluZ190cmNfY250OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCAyNTQyZjFmLi5kMGViYWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC01Miw2ICs1MywxMyBAQAogI2RlZmluZSBMUEZDX01JTl9ERVZMT1NTX1RNTyAxCiAjZGVmaW5lIExQRkNfTUFYX0RFVkxPU1NfVE1PIDI1NQogCisvKgorICogV3JpdGUga2V5IHNpemUgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDQuIElmIHdyaXRlIGtleSBpcyBjaGFuZ2VkCisgKiBtYWtlIHN1cmUgdGhhdCBsaWJyYXJ5IHdyaXRlIGtleSBpcyBhbHNvIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgTFBGQ19SRUdfV1JJVEVfS0VZX1NJWkUJNAorI2RlZmluZSBMUEZDX1JFR19XUklURV9LRVkJIkVNTFgiCisKIC8qKgogICogbHBmY19qZWRlY190b19hc2NpaSAtIEhleCB0byBhc2NpaSBjb252ZXJ0b3IgYWNjb3JkaW5nIHRvIEpFREVDIHJ1bGVzCiAgKiBAaW5jcjogaW50ZWdlciB0byBjb252ZXJ0LgpAQCAtNjkzLDcgKzcwMSw3IEBACiAJaW50IHJjOwogCiAJaWYgKCFwaGJhLT5jZmdfZW5hYmxlX2hiYV9yZXNldCkKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRUFDQ0VTOwogCiAJc3RhdHVzID0gbHBmY19kb19vZmZsaW5lKHBoYmEsIExQRkNfRVZUX09GRkxJTkUpOwogCkBAIC03NDIsOSArNzUwLDExIEBACiAJc3RydWN0IFNjc2lfSG9zdCAgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAgICpwaGJhID0gdnBvcnQtPnBoYmE7Ci0KIAlpbnQgc3RhdHVzID0gLUVJTlZBTDsKIAorCWlmICghcGhiYS0+Y2ZnX2VuYWJsZV9oYmFfcmVzZXQpCisJCXJldHVybiAtRUFDQ0VTOworCiAJaWYgKHN0cm5jbXAoYnVmLCAic2VsZWN0aXZlIiwgc2l6ZW9mKCJzZWxlY3RpdmUiKSAtIDEpID09IDApCiAJCXN0YXR1cyA9IHBoYmEtPmxwZmNfc2VsZWN0aXZlX3Jlc2V0KHBoYmEpOwogCkBAIC03NjUsMTYgKzc3NSwyMSBAQAogICogUmV0dXJuczoKICAqIHplcm8gZm9yIHN1Y2Nlc3MKICAqKi8KLXN0YXRpYyBpbnQKK2ludAogbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKLQlzdHJ1Y3QgbHBmY19yZWdpc3RlciBwb3J0c3RhdF9yZWc7CisJc3RydWN0IGxwZmNfcmVnaXN0ZXIgcG9ydHN0YXRfcmVnID0gezB9OwogCWludCBpOwogCi0KKwltc2xlZXAoMTAwKTsKIAlscGZjX3JlYWRsKHBoYmEtPnNsaTRfaGJhLnUuaWZfdHlwZTIuU1RBVFVTcmVnYWRkciwKIAkJICAgJnBvcnRzdGF0X3JlZy53b3JkMCk7CiAKKwkvKiB2ZXJpZnkgaWYgcHJpdmlsYWdlZCBmb3IgdGhlIHJlcXVlc3Qgb3BlcmF0aW9uICovCisJaWYgKCFiZl9nZXQobHBmY19zbGlwb3J0X3N0YXR1c19ybiwgJnBvcnRzdGF0X3JlZykgJiYKKwkgICAgIWJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX2VyciwgJnBvcnRzdGF0X3JlZykpCisJCXJldHVybiAtRVBFUk07CisKIAkvKiB3YWl0IGZvciB0aGUgU0xJIHBvcnQgZmlybXdhcmUgcmVhZHkgYWZ0ZXIgZmlybXdhcmUgcmVzZXQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTFBGQ19GV19SRVNFVF9NQVhJTVVNX1dBSVRfMTBNU19DTlQ7IGkrKykgewogCQltc2xlZXAoMTApOwpAQCAtODE2LDE2ICs4MzEsMTMgQEAKIAlpbnQgcmM7CiAKIAlpZiAoIXBoYmEtPmNmZ19lbmFibGVfaGJhX3Jlc2V0KQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FQUNDRVM7CiAKIAlpZiAoKHBoYmEtPnNsaV9yZXYgPCBMUEZDX1NMSV9SRVY0KSB8fAogCSAgICAoYmZfZ2V0KGxwZmNfc2xpX2ludGZfaWZfdHlwZSwgJnBoYmEtPnNsaTRfaGJhLnNsaV9pbnRmKSAhPQogCSAgICAgTFBGQ19TTElfSU5URl9JRl9UWVBFXzIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCFwZGV2LT5pc19waHlzZm4pCi0JCXJldHVybiAtRVBFUk07Ci0KIAkvKiBEaXNhYmxlIFNSLUlPViB2aXJ0dWFsIGZ1bmN0aW9ucyBpZiBlbmFibGVkICovCiAJaWYgKHBoYmEtPmNmZ19zcmlvdl9ucl92aXJ0Zm4pIHsKIAkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CkBAIC04NTgsNyArODcwLDcgQEAKIAlyYyA9IGxwZmNfc2xpNF9wZGV2X3N0YXR1c19yZWdfd2FpdChwaGJhKTsKIAogCWlmIChyYykKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByYzsKIAogCWluaXRfY29tcGxldGlvbigmb25saW5lX2NvbXBsKTsKIAlyYyA9IGxwZmNfd29ya3FfcG9zdF9ldmVudChwaGJhLCAmc3RhdHVzLCAmb25saW5lX2NvbXBsLApAQCAtOTg0LDcgKzk5Niw3IEBACiAJaWYgKCFzdGF0dXMpCiAJCXJldHVybiBzdHJsZW4oYnVmKTsKIAllbHNlCi0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKQEAgLTM4ODUsMTggKzM4OTcsMjMgQEAKIAlpZiAoKG9mZiArIGNvdW50KSA+IEZGX1JFR19BUkVBX1NJWkUpCiAJCXJldHVybiAtRVJBTkdFOwogCi0JaWYgKGNvdW50ID09IDApIHJldHVybiAwOworCWlmIChjb3VudCA8PSBMUEZDX1JFR19XUklURV9LRVlfU0laRSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAob2ZmICUgNCB8fCBjb3VudCAlIDQgfHwgKHVuc2lnbmVkIGxvbmcpYnVmICUgNCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoISh2cG9ydC0+ZmNfZmxhZyAmIEZDX09GRkxJTkVfTU9ERSkpIHsKKwkvKiBUaGlzIGlzIHRvIHByb3RlY3QgSEJBIHJlZ2lzdGVycyBmcm9tIGFjY2lkZW50YWwgd3JpdGVzLiAqLworCWlmIChtZW1jbXAoYnVmLCBMUEZDX1JFR19XUklURV9LRVksIExQRkNfUkVHX1dSSVRFX0tFWV9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoISh2cG9ydC0+ZmNfZmxhZyAmIEZDX09GRkxJTkVfTU9ERSkpCiAJCXJldHVybiAtRVBFUk07Ci0JfQogCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JZm9yIChidWZfb2ZmID0gMDsgYnVmX29mZiA8IGNvdW50OyBidWZfb2ZmICs9IHNpemVvZih1aW50MzJfdCkpCi0JCXdyaXRlbCgqKCh1aW50MzJfdCAqKShidWYgKyBidWZfb2ZmKSksCisJZm9yIChidWZfb2ZmID0gMDsgYnVmX29mZiA8IGNvdW50IC0gTFBGQ19SRUdfV1JJVEVfS0VZX1NJWkU7CisJCQlidWZfb2ZmICs9IHNpemVvZih1aW50MzJfdCkpCisJCXdyaXRlbCgqKCh1aW50MzJfdCAqKShidWYgKyBidWZfb2ZmICsgTFBGQ19SRUdfV1JJVEVfS0VZX1NJWkUpKSwKIAkJICAgICAgIHBoYmEtPmN0cmxfcmVnc19tZW1tYXBfcCArIG9mZiArIGJ1Zl9vZmYpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKQEAgLTQwOTcsOCArNDExNCwxMCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gKHN0cnVjdCBscGZjX3Zwb3J0ICopIHNob3N0LT5ob3N0ZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgICAqcGhiYSA9IHZwb3J0LT5waGJhOwotCWludCByYzsKKwlMUEZDX01CT1hRX3QgKm1ib3hxOwogCU1BSUxCT1hfdCAqcG1iOworCXVpbnQzMl90IG1ib3hfdG1vOworCWludCByYzsKIAogCWlmIChvZmYgPiBNQUlMQk9YX0NNRF9TSVpFKQogCQlyZXR1cm4gLUVSQU5HRTsKQEAgLTQxMjMsNyArNDE0Miw4IEBACiAJaWYgKG9mZiA9PSAwICYmCiAJICAgIHBoYmEtPnN5c2ZzX21ib3guc3RhdGUgID09IFNNQk9YX1dSSVRJTkcgJiYKIAkgICAgcGhiYS0+c3lzZnNfbWJveC5vZmZzZXQgPj0gMiAqIHNpemVvZih1aW50MzJfdCkpIHsKLQkJcG1iID0gJnBoYmEtPnN5c2ZzX21ib3gubWJveC0+dS5tYjsKKwkJbWJveHEgPSAoTFBGQ19NQk9YUV90ICopJnBoYmEtPnN5c2ZzX21ib3gubWJveDsKKwkJcG1iID0gJm1ib3hxLT51Lm1iOwogCQlzd2l0Y2ggKHBtYi0+bWJ4Q29tbWFuZCkgewogCQkJLyogT2ZmbGluZSBvbmx5ICovCiAJCWNhc2UgTUJYX0lOSVRfTElOSzoKQEAgLTQyMzMsOSArNDI1Myw4IEBACiAKIAkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdCAocGhiYSwKLQkJCQkJCSAgICAgICBwaGJhLT5zeXNmc19tYm94Lm1ib3gsCi0JCQkJbHBmY19tYm94X3Rtb192YWwocGhiYSwgcG1iLT5tYnhDb21tYW5kKSAqIEhaKTsKKwkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpOworCQkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsIG1ib3hfdG1vKTsKIAkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCQl9CiAKQEAgLTQ0ODAsOSArNDQ5OSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAotCWlmICgodnBvcnQtPmZjX2ZsYWcgJiBGQ19GQUJSSUMpIHx8Ci0JICAgICgocGhiYS0+ZmNfdG9wb2xvZ3kgPT0gTFBGQ19UT1BPTE9HWV9MT09QKSAmJgotCSAgICAgKHZwb3J0LT5mY19mbGFnICYgRkNfUFVCTElDX0xPT1ApKSkKKwlpZiAoKHZwb3J0LT5wb3J0X3N0YXRlID4gTFBGQ19GTE9HSSkgJiYKKwkgICAgKCh2cG9ydC0+ZmNfZmxhZyAmIEZDX0ZBQlJJQykgfHwKKwkgICAgICgocGhiYS0+ZmNfdG9wb2xvZ3kgPT0gTFBGQ19UT1BPTE9HWV9MT09QKSAmJgorCSAgICAgICh2cG9ydC0+ZmNfZmxhZyAmIEZDX1BVQkxJQ19MT09QKSkpKQogCQlub2RlX25hbWUgPSB3d25fdG9fdTY0KHBoYmEtPmZjX2ZhYnBhcmFtLm5vZGVOYW1lLnUud3duKTsKIAllbHNlCiAJCS8qIGZhYnJpYyBpcyBsb2NhbCBwb3J0IGlmIHRoZXJlIGlzIG5vIEYvRkxfUG9ydCAqLwpAQCAtNDU1NSw5ICs0NTc1LDE3IEBACiAJbWVtc2V0KGhzLCAwLCBzaXplb2YgKHN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MpKTsKIAogCWhzLT50eF9mcmFtZXMgPSBwbWItPnVuLnZhclJkU3RhdHVzLnhtaXRGcmFtZUNudDsKLQlocy0+dHhfd29yZHMgPSAocG1iLT51bi52YXJSZFN0YXR1cy54bWl0Qnl0ZUNudCAqIDI1Nik7CisJLyoKKwkgKiBUaGUgTUJYX1JFQURfU1RBVFVTIHJldHVybnMgdHhfa19ieXRlcyB3aGljaCBoYXMgdG8KKwkgKiBjb252ZXJ0ZWQgdG8gd29yZHMKKwkgKi8KKwlocy0+dHhfd29yZHMgPSAodWludDY0X3QpCisJCQkoKHVpbnQ2NF90KXBtYi0+dW4udmFyUmRTdGF0dXMueG1pdEJ5dGVDbnQKKwkJCSogKHVpbnQ2NF90KTI1Nik7CiAJaHMtPnJ4X2ZyYW1lcyA9IHBtYi0+dW4udmFyUmRTdGF0dXMucmN2RnJhbWVDbnQ7Ci0JaHMtPnJ4X3dvcmRzID0gKHBtYi0+dW4udmFyUmRTdGF0dXMucmN2Qnl0ZUNudCAqIDI1Nik7CisJaHMtPnJ4X3dvcmRzID0gKHVpbnQ2NF90KQorCQkJKCh1aW50NjRfdClwbWItPnVuLnZhclJkU3RhdHVzLnJjdkJ5dGVDbnQKKwkJCSAqICh1aW50NjRfdCkyNTYpOwogCiAJbWVtc2V0KHBtYm94cSwgMCwgc2l6ZW9mIChMUEZDX01CT1hRX3QpKTsKIAlwbWItPm1ieENvbW1hbmQgPSBNQlhfUkVBRF9MTktfU1RBVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKaW5kZXggYTZkYjZhZS4uNjBmOTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKQEAgLTIwOSw3ICsyMDksNyBAQAogdm9pZCBscGZjX21ib3hfY21wbF9wdXQoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIGludCBscGZjX21ib3hfY21kX2NoZWNrKHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKik7CiBpbnQgbHBmY19tYm94X2Rldl9jaGVjayhzdHJ1Y3QgbHBmY19oYmEgKik7Ci1pbnQgbHBmY19tYm94X3Rtb192YWwoc3RydWN0IGxwZmNfaGJhICosIGludCk7CitpbnQgbHBmY19tYm94X3Rtb192YWwoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKIHZvaWQgbHBmY19pbml0X3ZmaShzdHJ1Y3QgbHBmY01ib3hxICosIHN0cnVjdCBscGZjX3Zwb3J0ICopOwogdm9pZCBscGZjX3JlZ192Zmkoc3RydWN0IGxwZmNNYm94cSAqLCBzdHJ1Y3QgbHBmY192cG9ydCAqLCBkbWFfYWRkcl90KTsKIHZvaWQgbHBmY19pbml0X3ZwaShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNNYm94cSAqLCB1aW50MTZfdCk7CkBAIC00NTEsMyArNDUxLDUgQEAKIC8qIGZ1bmN0aW9ucyB0byBzdXBwb3J0IFNSLUlPViAqLwogaW50IGxwZmNfc2xpX3Byb2JlX3NyaW92X25yX3ZpcnRmbihzdHJ1Y3QgbHBmY19oYmEgKiwgaW50KTsKIHVpbnQxNl90IGxwZmNfc2xpX3NyaW92X25yX3ZpcnRmbl9nZXQoc3RydWN0IGxwZmNfaGJhICopOworaW50IGxwZmNfc2xpNF9xdWV1ZV9jcmVhdGUoc3RydWN0IGxwZmNfaGJhICopOwordm9pZCBscGZjX3NsaTRfcXVldWVfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKaW5kZXggNzc5Yjg4ZS4uNzA3MDgxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwpAQCAtMTg1Niw2ICsxODU2LDkgQEAKIAkJY2FzZSAyOgogCQkJYyA9ICdCJzsKIAkJCWJyZWFrOworCQljYXNlIDM6CisJCQljID0gJ1gnOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQljID0gMDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwppbmRleCBhMDQyNGRkLi4yODM4MjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtOTk2LDYgKzk5Nyw4NSBAQAogCXJldHVybiBuYnl0ZXM7CiB9CiAKK3N0YXRpYyBpbnQKK2xwZmNfZGVidWdmc19kaWZfZXJyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2xwZmNfZGVidWdmc19kaWZfZXJyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBjYnVmWzE2XTsKKwlpbnQgY250ID0gMDsKKworCWlmIChkZW50ID09IHBoYmEtPmRlYnVnX3dyaXRlR3VhcmQpCisJCWNudCA9IHNucHJpbnRmKGNidWYsIDE2LCAiJXVcbiIsIHBoYmEtPmxwZmNfaW5qZXJyX3dncmRfY250KTsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX3dyaXRlQXBwKQorCQljbnQgPSBzbnByaW50ZihjYnVmLCAxNiwgIiV1XG4iLCBwaGJhLT5scGZjX2luamVycl93YXBwX2NudCk7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z193cml0ZVJlZikKKwkJY250ID0gc25wcmludGYoY2J1ZiwgMTYsICIldVxuIiwgcGhiYS0+bHBmY19pbmplcnJfd3JlZl9jbnQpOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfcmVhZEFwcCkKKwkJY250ID0gc25wcmludGYoY2J1ZiwgMTYsICIldVxuIiwgcGhiYS0+bHBmY19pbmplcnJfcmFwcF9jbnQpOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfcmVhZFJlZikKKwkJY250ID0gc25wcmludGYoY2J1ZiwgMTYsICIldVxuIiwgcGhiYS0+bHBmY19pbmplcnJfcnJlZl9jbnQpOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfSW5qRXJyTEJBKQorCQljbnQgPSBzbnByaW50ZihjYnVmLCAxNiwgIjB4JWx4XG4iLAorCQkJCSAodW5zaWduZWQgbG9uZykgcGhiYS0+bHBmY19pbmplcnJfbGJhKTsKKwllbHNlCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkgIjA1NDcgVW5rbm93biBkZWJ1Z2ZzIGVycm9yIGluamVjdGlvbiBlbnRyeVxuIik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsICZjYnVmLCBjbnQpOworfQorCitzdGF0aWMgc3NpemVfdAorbHBmY19kZWJ1Z2ZzX2RpZl9lcnJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBkc3RidWZbMzJdOworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBzaXplOworCisJbWVtc2V0KGRzdGJ1ZiwgMCwgMzIpOworCXNpemUgPSAobmJ5dGVzIDwgMzIpID8gbmJ5dGVzIDogMzI7CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdGJ1ZiwgYnVmLCBzaXplKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoZHN0YnVmLCAwLCAmdG1wKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z193cml0ZUd1YXJkKQorCQlwaGJhLT5scGZjX2luamVycl93Z3JkX2NudCA9ICh1aW50MzJfdCl0bXA7CisJZWxzZSBpZiAoZGVudCA9PSBwaGJhLT5kZWJ1Z193cml0ZUFwcCkKKwkJcGhiYS0+bHBmY19pbmplcnJfd2FwcF9jbnQgPSAodWludDMyX3QpdG1wOworCWVsc2UgaWYgKGRlbnQgPT0gcGhiYS0+ZGVidWdfd3JpdGVSZWYpCisJCXBoYmEtPmxwZmNfaW5qZXJyX3dyZWZfY250ID0gKHVpbnQzMl90KXRtcDsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX3JlYWRBcHApCisJCXBoYmEtPmxwZmNfaW5qZXJyX3JhcHBfY250ID0gKHVpbnQzMl90KXRtcDsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX3JlYWRSZWYpCisJCXBoYmEtPmxwZmNfaW5qZXJyX3JyZWZfY250ID0gKHVpbnQzMl90KXRtcDsKKwllbHNlIGlmIChkZW50ID09IHBoYmEtPmRlYnVnX0luakVyckxCQSkKKwkJcGhiYS0+bHBmY19pbmplcnJfbGJhID0gKHNlY3Rvcl90KXRtcDsKKwllbHNlCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkgIjA1NDggVW5rbm93biBkZWJ1Z2ZzIGVycm9yIGluamVjdGlvbiBlbnRyeVxuIik7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50CitscGZjX2RlYnVnZnNfZGlmX2Vycl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCiAvKioKICAqIGxwZmNfZGVidWdmc19ub2RlbGlzdF9vcGVuIC0gT3BlbiB0aGUgbm9kZWxpc3QgZGVidWdmcyBmaWxlCiAgKiBAaW5vZGU6IFRoZSBpbm9kZSBwb2ludGVyIHRoYXQgY29udGFpbnMgYSB2cG9ydCBwb2ludGVyLgpAQCAtMzM4MCw2ICszNDYwLDE2IEBACiAJLnJlbGVhc2UgPSAgICAgIGxwZmNfZGVidWdmc19kdW1wRGF0YURpZl9yZWxlYXNlLAogfTsKIAorI3VuZGVmIGxwZmNfZGVidWdmc19vcF9kaWZfZXJyCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2RlYnVnZnNfb3BfZGlmX2VyciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlscGZjX2RlYnVnZnNfZGlmX2Vycl9vcGVuLAorCS5sbHNlZWsgPQlscGZjX2RlYnVnZnNfbHNlZWssCisJLnJlYWQgPQkJbHBmY19kZWJ1Z2ZzX2RpZl9lcnJfcmVhZCwKKwkud3JpdGUgPQlscGZjX2RlYnVnZnNfZGlmX2Vycl93cml0ZSwKKwkucmVsZWFzZSA9CWxwZmNfZGVidWdmc19kaWZfZXJyX3JlbGVhc2UsCit9OworCiAjdW5kZWYgbHBmY19kZWJ1Z2ZzX29wX3Nsb3dfcmluZ190cmMKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfZGVidWdmc19vcF9zbG93X3JpbmdfdHJjID0gewogCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKQEAgLTM3ODgsNiArMzg3OCw3NCBAQAogCQkJZ290byBkZWJ1Z19mYWlsZWQ7CiAJCX0KIAorCQkvKiBTZXR1cCBESUYgRXJyb3IgSW5qZWN0aW9ucyAqLworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJJbmpFcnJMQkEiKTsKKwkJcGhiYS0+ZGVidWdfSW5qRXJyTEJBID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQlwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJcGhiYSwgJmxwZmNfZGVidWdmc19vcF9kaWZfZXJyKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z19JbmpFcnJMQkEpIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDgwNyBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgSW5qRXJyTEJBXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisJCXBoYmEtPmxwZmNfaW5qZXJyX2xiYSA9IExQRkNfSU5KRVJSX0xCQV9PRkY7CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAid3JpdGVHdWFyZEluakVyciIpOworCQlwaGJhLT5kZWJ1Z193cml0ZUd1YXJkID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQlwaGJhLT5oYmFfZGVidWdmc19yb290LAorCQkJcGhiYSwgJmxwZmNfZGVidWdmc19vcF9kaWZfZXJyKTsKKwkJaWYgKCFwaGJhLT5kZWJ1Z193cml0ZUd1YXJkKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjA4MDIgQ2Fubm90IGNyZWF0ZSBkZWJ1Z2ZzIHdyaXRlR3VhcmRcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ3cml0ZUFwcEluakVyciIpOworCQlwaGJhLT5kZWJ1Z193cml0ZUFwcCA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCwKKwkJCXBoYmEsICZscGZjX2RlYnVnZnNfb3BfZGlmX2Vycik7CisJCWlmICghcGhiYS0+ZGVidWdfd3JpdGVBcHApIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDgwMyBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgd3JpdGVBcHBcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ3cml0ZVJlZkluakVyciIpOworCQlwaGJhLT5kZWJ1Z193cml0ZVJlZiA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCwKKwkJCXBoYmEsICZscGZjX2RlYnVnZnNfb3BfZGlmX2Vycik7CisJCWlmICghcGhiYS0+ZGVidWdfd3JpdGVSZWYpIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDgwNCBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgd3JpdGVSZWZcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJyZWFkQXBwSW5qRXJyIik7CisJCXBoYmEtPmRlYnVnX3JlYWRBcHAgPQorCQkJZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwKKwkJCXBoYmEtPmhiYV9kZWJ1Z2ZzX3Jvb3QsCisJCQlwaGJhLCAmbHBmY19kZWJ1Z2ZzX29wX2RpZl9lcnIpOworCQlpZiAoIXBoYmEtPmRlYnVnX3JlYWRBcHApIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkiMDgwNSBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgcmVhZEFwcFxuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInJlYWRSZWZJbmpFcnIiKTsKKwkJcGhiYS0+ZGVidWdfcmVhZFJlZiA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJcGhiYS0+aGJhX2RlYnVnZnNfcm9vdCwKKwkJCXBoYmEsICZscGZjX2RlYnVnZnNfb3BfZGlmX2Vycik7CisJCWlmICghcGhiYS0+ZGVidWdfcmVhZFJlZikgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIwODA2IENhbm5vdCBjcmVhdGUgZGVidWdmcyByZWFkQXBwXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisKIAkJLyogU2V0dXAgc2xvdyByaW5nIHRyYWNlICovCiAJCWlmIChscGZjX2RlYnVnZnNfbWF4X3Nsb3dfcmluZ190cmMpIHsKIAkJCW51bSA9IGxwZmNfZGVidWdmc19tYXhfc2xvd19yaW5nX3RyYyAtIDE7CkBAIC00MDkwLDYgKzQyNDgsMzAgQEAKIAkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX2R1bXBEaWYpOyAvKiBkdW1wRGlmICovCiAJCQlwaGJhLT5kZWJ1Z19kdW1wRGlmID0gTlVMTDsKIAkJfQorCQlpZiAocGhiYS0+ZGVidWdfSW5qRXJyTEJBKSB7CisJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5kZWJ1Z19JbmpFcnJMQkEpOyAvKiBJbmpFcnJMQkEgKi8KKwkJCXBoYmEtPmRlYnVnX0luakVyckxCQSA9IE5VTEw7CisJCX0KKwkJaWYgKHBoYmEtPmRlYnVnX3dyaXRlR3VhcmQpIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX3dyaXRlR3VhcmQpOyAvKiB3cml0ZUd1YXJkICovCisJCQlwaGJhLT5kZWJ1Z193cml0ZUd1YXJkID0gTlVMTDsKKwkJfQorCQlpZiAocGhiYS0+ZGVidWdfd3JpdGVBcHApIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX3dyaXRlQXBwKTsgLyogd3JpdGVBcHAgKi8KKwkJCXBoYmEtPmRlYnVnX3dyaXRlQXBwID0gTlVMTDsKKwkJfQorCQlpZiAocGhiYS0+ZGVidWdfd3JpdGVSZWYpIHsKKwkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmRlYnVnX3dyaXRlUmVmKTsgLyogd3JpdGVSZWYgKi8KKwkJCXBoYmEtPmRlYnVnX3dyaXRlUmVmID0gTlVMTDsKKwkJfQorCQlpZiAocGhiYS0+ZGVidWdfcmVhZEFwcCkgeworCQkJZGVidWdmc19yZW1vdmUocGhiYS0+ZGVidWdfcmVhZEFwcCk7IC8qIHJlYWRBcHAgKi8KKwkJCXBoYmEtPmRlYnVnX3JlYWRBcHAgPSBOVUxMOworCQl9CisJCWlmIChwaGJhLT5kZWJ1Z19yZWFkUmVmKSB7CisJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5kZWJ1Z19yZWFkUmVmKTsgLyogcmVhZFJlZiAqLworCQkJcGhiYS0+ZGVidWdfcmVhZFJlZiA9IE5VTEw7CisJCX0KIAogCQlpZiAocGhiYS0+c2xvd19yaW5nX3RyYykgewogCQkJa2ZyZWUocGhiYS0+c2xvd19yaW5nX3RyYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwppbmRleCAwMjNkYTBlLi40NDU4MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTMzODYsNyArMzM4NiwxNCBAQAogCQkJY21kaW9jYi0+Y29udGV4dDEgPSBOVUxMOwogCQl9CiAJfQorCisJLyoKKwkgKiBUaGUgZHJpdmVyIHJlY2VpdmVkIGEgTE9HTyBmcm9tIHRoZSBycG9ydCBhbmQgaGFzIEFDSydkIGl0LgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBkcml2ZXIgaXMgZG9uZSBzbyByZWxlYXNlIHRoZSBJT0NCIGFuZAorCSAqIHJlbW92ZSB0aGUgbmRscCByZWZlcmVuY2UuCisJICovCiAJbHBmY19lbHNfZnJlZV9pb2NiKHBoYmEsIGNtZGlvY2IpOworCWxwZmNfbmxwX3B1dChuZGxwKTsKIAlyZXR1cm47CiB9CiAKQEAgLTQwODIsOSArNDA4OSw2IEBACiAKIAlwaGJhLT5mY19zdGF0LmVsc1htaXRBQ0MrKzsKIAllbHNpb2NiLT5pb2NiX2NtcGwgPSBscGZjX2NtcGxfZWxzX3JzcDsKLQlscGZjX25scF9wdXQobmRscCk7Ci0JZWxzaW9jYi0+Y29udGV4dDEgPSBOVUxMOyAgLyogRG9uJ3QgbmVlZCBuZGxwIGZvciBjbXBsLAotCQkJCSAgICAqIGl0IGNvdWxkIGJlIGZyZWVkICovCiAKIAlyYyA9IGxwZmNfc2xpX2lzc3VlX2lvY2IocGhiYSwgTFBGQ19FTFNfUklORywgZWxzaW9jYiwgMCk7CiAJaWYgKHJjID09IElPQ0JfRVJST1IpIHsKQEAgLTQxNjYsNiArNDE3MCwxMSBAQAogCXBzbGkgPSAmcGhiYS0+c2xpOwogCWNtZHNpemUgPSBvbGRpb2NiLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLmFjY19sZW47CiAKKwkvKiBUaGUgYWNjdW11bGF0ZWQgbGVuZ3RoIGNhbiBleGNlZWQgdGhlIEJQTF9TSVpFLiAgRm9yCisJICogbm93LCB1c2UgdGhpcyBhcyB0aGUgbGltaXQKKwkgKi8KKwlpZiAoY21kc2l6ZSA+IExQRkNfQlBMX1NJWkUpCisJCWNtZHNpemUgPSBMUEZDX0JQTF9TSVpFOwogCWVsc2lvY2IgPSBscGZjX3ByZXBfZWxzX2lvY2IodnBvcnQsIDAsIGNtZHNpemUsIG9sZGlvY2ItPnJldHJ5LCBuZGxwLAogCQkJCSAgICAgbmRscC0+bmxwX0RJRCwgRUxTX0NNRF9BQ0MpOwogCWlmICghZWxzaW9jYikKQEAgLTQxODksOSArNDE5OCw2IEBACiAKIAlwaGJhLT5mY19zdGF0LmVsc1htaXRBQ0MrKzsKIAllbHNpb2NiLT5pb2NiX2NtcGwgPSBscGZjX2NtcGxfZWxzX3JzcDsKLQlscGZjX25scF9wdXQobmRscCk7Ci0JZWxzaW9jYi0+Y29udGV4dDEgPSBOVUxMOyAgLyogRG9uJ3QgbmVlZCBuZGxwIGZvciBjbXBsLAotCQkJCSAgICAqIGl0IGNvdWxkIGJlIGZyZWVkICovCiAKIAlyYyA9IGxwZmNfc2xpX2lzc3VlX2lvY2IocGhiYSwgTFBGQ19FTFNfUklORywgZWxzaW9jYiwgMCk7CiAJaWYgKHJjID09IElPQ0JfRVJST1IpIHsKQEAgLTcyNTgsMTYgKzcyNjQsMTEgQEAKIAlpY21kLT51bi5lbHNyZXE2NC5teUlEID0gMDsKIAlpY21kLT51bi5lbHNyZXE2NC5mbCA9IDE7CiAKLQlpZiAgKChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpICYmCi0JICAgICAoYmZfZ2V0KGxwZmNfc2xpX2ludGZfaWZfdHlwZSwgJnBoYmEtPnNsaTRfaGJhLnNsaV9pbnRmKSA9PQotCSAgICAgIExQRkNfU0xJX0lOVEZfSUZfVFlQRV8wKSkgewotCQkvKiBGRElTQyBuZWVkcyB0byBiZSAxIGZvciBXUUUgVlBJICovCi0JCWVsc2lvY2ItPmlvY2IudWxwQ3RfaCA9IChTTEk0X0NUX1ZQSSA+PiAxKSAmIDE7Ci0JCWVsc2lvY2ItPmlvY2IudWxwQ3RfbCA9IFNMSTRfQ1RfVlBJICYgMSA7Ci0JCS8qIFNldCB0aGUgdWxwQ29udGV4dCB0byB0aGUgdnBpICovCi0JCWVsc2lvY2ItPmlvY2IudWxwQ29udGV4dCA9IHBoYmEtPnZwaV9pZHNbdnBvcnQtPnZwaV07Ci0JfSBlbHNlIHsKLQkJLyogRm9yIEZESVNDLCBMZXQgRkRJU0MgcnNwIHNldCB0aGUgTlBvcnRJRCBmb3IgdGhpcyBWUEkgKi8KKwkvKgorCSAqIFNMSTMgcG9ydHMgcmVxdWlyZSBhIGRpZmZlcmVudCBjb250ZXh0IHR5cGUgdmFsdWUgdGhhbiBTTEk0LgorCSAqIENhdGNoIFNMSTMgcG9ydHMgaGVyZSBhbmQgb3ZlcnJpZGUgdGhlIHByZXAuCisJICovCisJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWMykgewogCQlpY21kLT51bHBDdF9oID0gMTsKIAkJaWNtZC0+dWxwQ3RfbCA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCAwYjQ3YWRmLi4wOTFmNjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAkJaWYgKHBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlICE9IExQRkNfRkxPR0kpIHsKIAkJCXBoYmEtPmhiYV9mbGFnIHw9IEZDRl9SUl9JTlBST0c7CiAJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwotCQkJbHBmY19pc3N1ZV9pbml0X3ZmaShwaGJhLT5wcG9ydCk7CisJCQlscGZjX2luaXRpYWxfZmxvZ2kocGhiYS0+cHBvcnQpOwogCQkJcmV0dXJuOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CkBAIC0yNjQ2LDcgKzI2NDYsOSBAQAogewogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IG1ib3hxLT52cG9ydDsKIAotCWlmIChtYm94cS0+dS5tYi5tYnhTdGF0dXMgJiYgKG1ib3hxLT51Lm1iLm1ieFN0YXR1cyAhPSAweDQwMDIpKSB7CisJLyogVkZJIG5vdCBzdXBwb3J0ZWQgb24gaW50ZXJmYWNlIHR5cGUgMCwganVzdCBkbyB0aGUgZmxvZ2kgKi8KKwlpZiAobWJveHEtPnUubWIubWJ4U3RhdHVzICYmIChiZl9nZXQobHBmY19zbGlfaW50Zl9pZl90eXBlLAorCSAgICAmcGhiYS0+c2xpNF9oYmEuc2xpX2ludGYpICE9IExQRkNfU0xJX0lOVEZfSUZfVFlQRV8wKSkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwKIAkJCQlMT0dfTUJPWCwKIAkJCQkiMjg5MSBJbml0IFZGSSBtYWlsYm94IGZhaWxlZCAweCV4XG4iLApAQCAtMjY1NSw2ICsyNjU3LDcgQEAKIAkJbHBmY192cG9ydF9zZXRfc3RhdGUodnBvcnQsIEZDX1ZQT1JUX0ZBSUxFRCk7CiAJCXJldHVybjsKIAl9CisKIAlscGZjX2luaXRpYWxfZmxvZ2kodnBvcnQpOwogCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKaW5kZXggN2Y4MDAzYi4uOThkMjE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCkBAIC00MSw2ICs0MSw4IEBACiAgKiBPciBjbGVhciB0aGF0IGJpdCBmaWVsZDoKICAqCWJmX3NldChleGFtcGxlX2JpdF9maWVsZCwgJnQxLCAwKTsKICAqLworI2RlZmluZSBiZl9nZXRfYmUzMihuYW1lLCBwdHIpIFwKKwkoKGJlMzJfdG9fY3B1KChwdHIpLT5uYW1lIyNfV09SRCkgPj4gbmFtZSMjX1NISUZUKSAmIG5hbWUjI19NQVNLKQogI2RlZmluZSBiZl9nZXRfbGUzMihuYW1lLCBwdHIpIFwKIAkoKGxlMzJfdG9fY3B1KChwdHIpLT5uYW1lIyNfV09SRCkgPj4gbmFtZSMjX1NISUZUKSAmIG5hbWUjI19NQVNLKQogI2RlZmluZSBiZl9nZXQobmFtZSwgcHRyKSBcCkBAIC02NzgsNyArNjgwLDYgQEAKICNkZWZpbmUgbHBmY19ycV9kb29yYmVsbF9udW1fcG9zdGVkX1NISUZUCTE2CiAjZGVmaW5lIGxwZmNfcnFfZG9vcmJlbGxfbnVtX3Bvc3RlZF9NQVNLCTB4M0ZGRgogI2RlZmluZSBscGZjX3JxX2Rvb3JiZWxsX251bV9wb3N0ZWRfV09SRAl3b3JkMAotI2RlZmluZSBMUEZDX1JRX1BPU1RfQkFUQ0gJCTgJLyogUlFFcyB0byBwb3N0IGF0IG9uZSB0aW1lICovCiAjZGVmaW5lIGxwZmNfcnFfZG9vcmJlbGxfaWRfU0hJRlQJCTAKICNkZWZpbmUgbHBmY19ycV9kb29yYmVsbF9pZF9NQVNLCQkweEZGRkYKICNkZWZpbmUgbHBmY19ycV9kb29yYmVsbF9pZF9XT1JECQl3b3JkMApAQCAtNzg0LDYgKzc4NSw4IEBACiAjZGVmaW5lIExQRkNfUV9DUkVBVEVfVkVSU0lPTl8yCTIKICNkZWZpbmUgTFBGQ19RX0NSRUFURV9WRVJTSU9OXzEJMQogI2RlZmluZSBMUEZDX1FfQ1JFQVRFX1ZFUlNJT05fMAkwCisjZGVmaW5lIExQRkNfT1BDT0RFX1ZFUlNJT05fMAkwCisjZGVmaW5lIExQRkNfT1BDT0RFX1ZFUlNJT05fMQkxCiAJfSByZXF1ZXN0OwogCXN0cnVjdCB7CiAJCXVpbnQzMl90IHdvcmQ2OwpAQCAtODI1LDYgKzgyOCw3IEBACiAjZGVmaW5lIExQRkNfRVhURU5UX1ZFUlNJT05fREVGQVVMVAkwCiAKIC8qIFN1YnN5c3RlbSBEZWZpbml0aW9ucyAqLworI2RlZmluZSBMUEZDX01CT1hfU1VCU1lTVEVNX05BCQkweDAKICNkZWZpbmUgTFBGQ19NQk9YX1NVQlNZU1RFTV9DT01NT04JMHgxCiAjZGVmaW5lIExQRkNfTUJPWF9TVUJTWVNURU1fRkNPRQkweEMKIApAQCAtODM1LDI1ICs4MzksMzQgQEAKICNkZWZpbmUgSE9TVF9FTkRJQU5fSElHSF9XT1JEMQkweEZGNzg1NkZGCiAKIC8qIENvbW1vbiBPcGNvZGVzICovCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfQ1FfQ1JFQVRFCQkweDBDCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRVFfQ1JFQVRFCQkweDBECi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTVFfQ1JFQVRFCQkweDE1Ci0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX0NOVExfQVRUUklCVVRFUwkweDIwCi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTk9QCQkJMHgyMQotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX01RX0RFU1RST1kJCTB4MzUKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9DUV9ERVNUUk9ZCQkweDM2Ci0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRVFfREVTVFJPWQkJMHgzNwotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1FVRVJZX0ZXX0NGRwkJMHgzQQotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0ZVTkNUSU9OX1JFU0VUCQkweDNECi0jZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTVFfQ1JFQVRFX0VYVAkJMHg1QQotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9SU1JDX0VYVEVOVF9JTkZPCTB4OUEKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfQUxMT0NfUlNSQ19FWFRFTlQJMHg5QgotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0FMTE9DX1JTUkNfRVhURU5UCTB4OUMKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9ERUFMTE9DX1JTUkNfRVhURU5UCTB4OUQKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfRlVOQ1RJT05fQ09ORklHICAgIDB4QTAKLSNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfUFJPRklMRV9DT05GSUcJMHhBNAotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1dSSVRFX09CSkVDVAkJMHhBQwotI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9TTEk0X1BBUkFNRVRFUlMJMHhCNQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX05BCQkJCTB4MDAKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9DUV9DUkVBVEUJCQkweDBDCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRVFfQ1JFQVRFCQkJMHgwRAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX01RX0NSRUFURQkJCTB4MTUKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfQ05UTF9BVFRSSUJVVEVTCQkweDIwCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfTk9QCQkJCTB4MjEKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9NUV9ERVNUUk9ZCQkJMHgzNQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0NRX0RFU1RST1kJCQkweDM2CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRVFfREVTVFJPWQkJCTB4MzcKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9RVUVSWV9GV19DRkcJCQkweDNBCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRlVOQ1RJT05fUkVTRVQJCQkweDNECisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX1BPUlRfTkFNRQkJCTB4NEQKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9NUV9DUkVBVEVfRVhUCQkJMHg1QQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9SU1JDX0VYVEVOVF9JTkZPCQkweDlBCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX0FMTE9DX1JTUkNfRVhURU5UCQkweDlCCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfQUxMT0NfUlNSQ19FWFRFTlQJCTB4OUMKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9ERUFMTE9DX1JTUkNfRVhURU5UCQkweDlECisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfR0VUX0ZVTkNUSU9OX0NPTkZJRwkJMHhBMAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9QUk9GSUxFX0NPTkZJRwkJMHhBNAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1NFVF9QUk9GSUxFX0NPTkZJRwkJMHhBNQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9QUk9GSUxFX0xJU1QJCTB4QTYKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9TRVRfQUNUX1BST0ZJTEUJCTB4QTgKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9HRVRfRkFDVE9SWV9QUk9GSUxFX0NPTkZJRwkweEE5CisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfUkVBRF9PQkpFQ1QJCQkweEFCCisjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfV1JJVEVfT0JKRUNUCQkJMHhBQworI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX1JFQURfT0JKRUNUX0xJU1QJCTB4QUQKKyNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9ERUxFVEVfT0JKRUNUCQkJMHhBRQorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9TTEk0X1BBUkFNRVRFUlMJCTB4QjUKIAogLyogRkNvRSBPcGNvZGVzICovCiAjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRkNPRV9XUV9DUkVBVEUJCQkweDAxCkBAIC04NjcsNiArODgwLDcgQEAKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX0RFTEVURV9GQ0YJCTB4MEEKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX1BPU1RfSERSX1RFTVBMQVRFCQkweDBCCiAjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRkNPRV9SRURJU0NPVkVSX0ZDRgkJMHgxMAorI2RlZmluZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfU0VUX0ZDTElOS19TRVRUSU5HUwkweDIxCiAjZGVmaW5lIExQRkNfTUJPWF9PUENPREVfRkNPRV9MSU5LX0RJQUdfU1RBVEUJCTB4MjIKICNkZWZpbmUgTFBGQ19NQk9YX09QQ09ERV9GQ09FX0xJTktfRElBR19MT09QQkFDSwkweDIzCiAKQEAgLTE0NzAsMTYgKzE0ODQsODEgQEAKIAl1aW50MzJfdCBhZGRyX2xvOwogCiAJdWludDMyX3Qgd29yZDI7Ci0jZGVmaW5lIGxwZmNfc2xpNF9zZ2Vfb2Zmc2V0X1NISUZUCTAgLyogT2Zmc2V0IG9mIGJ1ZmZlciAtIE5vdCB1c2VkKi8KLSNkZWZpbmUgbHBmY19zbGk0X3NnZV9vZmZzZXRfTUFTSwkweDFGRkZGRkZGCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2Vfb2Zmc2V0X1NISUZUCTAKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9vZmZzZXRfTUFTSwkweDA3RkZGRkZGCiAjZGVmaW5lIGxwZmNfc2xpNF9zZ2Vfb2Zmc2V0X1dPUkQJd29yZDIKLSNkZWZpbmUgbHBmY19zbGk0X3NnZV9sYXN0X1NISUZUCTMxIC8qIExhc3QgU0VHIGluIHRoZSBTR0wgc2V0cwotCQkJCQkJdGhpcyAgZmxhZyAhISAqLworI2RlZmluZSBscGZjX3NsaTRfc2dlX3R5cGVfU0hJRlQJMjcKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV90eXBlX01BU0sJCTB4MDAwMDAwMEYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV90eXBlX1dPUkQJCXdvcmQyCisjZGVmaW5lIExQRkNfU0dFX1RZUEVfREFUQQkJMHgwCisjZGVmaW5lIExQRkNfU0dFX1RZUEVfRElGCQkweDQKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9MU1AJCTB4NQorI2RlZmluZSBMUEZDX1NHRV9UWVBFX1BFRElGCQkweDYKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9QRVNFRUQJCTB4NworI2RlZmluZSBMUEZDX1NHRV9UWVBFX0RJU0VFRAkJMHg4CisjZGVmaW5lIExQRkNfU0dFX1RZUEVfRU5DCQkweDkKKyNkZWZpbmUgTFBGQ19TR0VfVFlQRV9BVE0JCTB4QQorI2RlZmluZSBMUEZDX1NHRV9UWVBFX1NLSVAJCTB4QworI2RlZmluZSBscGZjX3NsaTRfc2dlX2xhc3RfU0hJRlQJMzEgLyogTGFzdCBTRUcgaW4gdGhlIFNHTCBzZXRzIGl0ICovCiAjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfbGFzdF9NQVNLCQkweDAwMDAwMDAxCiAjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfbGFzdF9XT1JECQl3b3JkMgogCXVpbnQzMl90IHNnZV9sZW47CiB9OwogCitzdHJ1Y3Qgc2xpNF9zZ2VfZGlzZWVkIHsJLyogU0xJLTQgKi8KKwl1aW50MzJfdCByZWZfdGFnOworCXVpbnQzMl90IHJlZl90YWdfdHJhbjsKKworCXVpbnQzMl90IHdvcmQyOworI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hcHB0cmFuX1NISUZUCTAKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYXBwdHJhbl9NQVNLCTB4MDAwMEZGRkYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfYXBwdHJhbl9XT1JECXdvcmQyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FmX1NISUZUCTI0CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FmX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hZl9XT1JECXdvcmQyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25hX1NISUZUCTI1CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25hX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9uYV9XT1JECXdvcmQyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2hpX1NISUZUCTI2CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2hpX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9oaV9XT1JECXdvcmQyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX3R5cGVfU0hJRlQJMjcKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfdHlwZV9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfdHlwZV9XT1JECXdvcmQyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2xhc3RfU0hJRlQJMzEgLyogTGFzdCBTRUcgaW4gdGhlIFNHTCBzZXRzIGl0ICovCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2xhc3RfTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2xhc3RfV09SRAl3b3JkMgorCXVpbnQzMl90IHdvcmQzOworI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hcHB0YWdfU0hJRlQJMAorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9hcHB0YWdfTUFTSwkweDAwMDBGRkZGCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FwcHRhZ19XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2JzX1NISUZUCTE2CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2JzX01BU0sJMHgwMDAwMDAwNworI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9ic19XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FpX1NISUZUCTE5CisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2FpX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9haV9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX21lX1NISUZUCTIwCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX21lX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9tZV9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX3JlX1NISUZUCTIxCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX3JlX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9yZV9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2NlX1NISUZUCTIyCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX2NlX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9jZV9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25yX1NISUZUCTIzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX25yX01BU0sJMHgwMDAwMDAwMQorI2RlZmluZSBscGZjX3NsaTRfc2dlX2RpZl9ucl9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX29wcnhfU0hJRlQJMjQKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3ByeF9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3ByeF9XT1JECXdvcmQzCisjZGVmaW5lIGxwZmNfc2xpNF9zZ2VfZGlmX29wdHhfU0hJRlQJMjgKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3B0eF9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgbHBmY19zbGk0X3NnZV9kaWZfb3B0eF9XT1JECXdvcmQzCisvKiBvcHR4IGFuZCBvcHJ4IHVzZSBCR19PUF9JTiBkZWZpbmVzIGluIGxwZmNfaHcuaCAqLworfTsKKwogc3RydWN0IGZjZl9yZWNvcmQgewogCXVpbnQzMl90IG1heF9yY3Zfc2l6ZTsKIAl1aW50MzJfdCBma2FfYWR2X3BlcmlvZDsKQEAgLTIwMTksNiArMjA5OCwxNSBAQAogI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2V4dG50c19pbnVzZV9NQVNLCTB4MDAwMDAwMDEKICNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9leHRudHNfaW51c2VfV09SRAl3b3JkMQogCXVpbnQzMl90IHdvcmQyOworI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2xua19udW1iX1NISUZUCQkwCisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX251bWJfTUFTSwkJMHgwMDAwMDAzRgorI2RlZmluZSBscGZjX21ieF9yZF9jb25mX2xua19udW1iX1dPUkQJCXdvcmQyCisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX3R5cGVfU0hJRlQJCTYKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfdHlwZV9NQVNLCQkweDAwMDAwMDAzCisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX3R5cGVfV09SRAkJd29yZDIKKyNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl9sbmtfbGR2X1NISUZUCQk4CisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX2xkdl9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIGxwZmNfbWJ4X3JkX2NvbmZfbG5rX2xkdl9XT1JECQl3b3JkMgogI2RlZmluZSBscGZjX21ieF9yZF9jb25mX3RvcG9sb2d5X1NISUZUCQkyNAogI2RlZmluZSBscGZjX21ieF9yZF9jb25mX3RvcG9sb2d5X01BU0sJCTB4MDAwMDAwRkYKICNkZWZpbmUgbHBmY19tYnhfcmRfY29uZl90b3BvbG9neV9XT1JECQl3b3JkMgpAQCAtMjU1Miw4ICsyNjQwLDE1MiBAQAogCX0gdTsKIH07CiAKK3N0cnVjdCBscGZjX2NvbnRyb2xsZXJfYXR0cmlidXRlIHsKKwl1aW50MzJfdCB2ZXJzaW9uX3N0cmluZ1s4XTsKKwl1aW50MzJfdCBtYW51ZmFjdHVyZXJfbmFtZVs4XTsKKwl1aW50MzJfdCBzdXBwb3J0ZWRfbW9kZXM7CisJdWludDMyX3Qgd29yZDE3OworI2RlZmluZSBscGZjX2NudGxfYXR0cl9lcHJvbV92ZXJfbG9fU0hJRlQJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9lcHJvbV92ZXJfbG9fTUFTSwkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9sb19XT1JECXdvcmQxNworI2RlZmluZSBscGZjX2NudGxfYXR0cl9lcHJvbV92ZXJfaGlfU0hJRlQJOAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9lcHJvbV92ZXJfaGlfTUFTSwkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2Vwcm9tX3Zlcl9oaV9XT1JECXdvcmQxNworCXVpbnQzMl90IG1ieF9kYV9zdHJ1Y3RfdmVyOworCXVpbnQzMl90IGVwX2Z3X2RhX3N0cnVjdF92ZXI7CisJdWludDMyX3QgbmNzaV92ZXJfc3RyWzNdOworCXVpbnQzMl90IGRmbHRfZXh0X3RpbWVvdXQ7CisJdWludDMyX3QgbW9kZWxfbnVtYmVyWzhdOworCXVpbnQzMl90IGRlc2NyaXB0aW9uWzE2XTsKKwl1aW50MzJfdCBzZXJpYWxfbnVtYmVyWzhdOworCXVpbnQzMl90IGlwX3Zlcl9zdHJbOF07CisJdWludDMyX3QgZndfdmVyX3N0cls4XTsKKwl1aW50MzJfdCBiaW9zX3Zlcl9zdHJbOF07CisJdWludDMyX3QgcmVkYm9vdF92ZXJfc3RyWzhdOworCXVpbnQzMl90IGRyaXZlcl92ZXJfc3RyWzhdOworCXVpbnQzMl90IGZsYXNoX2Z3X3Zlcl9zdHJbOF07CisJdWludDMyX3QgZnVuY3Rpb25hbGl0eTsKKwl1aW50MzJfdCB3b3JkMTA1OworI2RlZmluZSBscGZjX2NudGxfYXR0cl9tYXhfY2JkX2xlbl9TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX21heF9jYmRfbGVuX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbWF4X2NiZF9sZW5fV09SRAkJd29yZDEwNQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9hc2ljX3Jldl9TSElGVAkJMTYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfYXNpY19yZXZfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9hc2ljX3Jldl9XT1JECQl3b3JkMTA1CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMF9TSElGVAkJMjQKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQwX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQwX1dPUkQJCXdvcmQxMDUKKwl1aW50MzJfdCBnZW5fZ3VpZDFfMTJbM107CisJdWludDMyX3Qgd29yZDEwOTsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZ2VuX2d1aWQxM18xNF9TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMTNfMTRfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMTNfMTRfV09SRAl3b3JkMTA5CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMTVfU0hJRlQJCTE2CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2dlbl9ndWlkMTVfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9nZW5fZ3VpZDE1X1dPUkQJCXdvcmQxMDkKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaGJhX3BvcnRfY250X1NISUZUCTI0CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2hiYV9wb3J0X2NudF9NQVNLCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaGJhX3BvcnRfY250X1dPUkQJd29yZDEwOQorCXVpbnQzMl90IHdvcmQxMTA7CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2RmbHRfbG5rX3Rtb19TSElGVAkwCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2RmbHRfbG5rX3Rtb19NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfZGZsdF9sbmtfdG1vX1dPUkQJd29yZDExMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9tdWx0aV9mdW5jX2Rldl9TSElGVAkyNAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9tdWx0aV9mdW5jX2Rldl9NQVNLCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbXVsdGlfZnVuY19kZXZfV09SRAl3b3JkMTEwCisJdWludDMyX3Qgd29yZDExMTsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfY2FjaGVfdmFsaWRfU0hJRlQJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9jYWNoZV92YWxpZF9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2NhY2hlX3ZhbGlkX1dPUkQJCXdvcmQxMTEKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaGJhX3N0YXR1c19TSElGVAkJOAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9oYmFfc3RhdHVzX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfaGJhX3N0YXR1c19XT1JECQl3b3JkMTExCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX21heF9kb21haW5fU0hJRlQJCTE2CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX21heF9kb21haW5fTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9tYXhfZG9tYWluX1dPUkQJCXdvcmQxMTEKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbG5rX251bWJfU0hJRlQJCTI0CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2xua19udW1iX01BU0sJCTB4MDAwMDAwM2YKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbG5rX251bWJfV09SRAkJd29yZDExMQorI2RlZmluZSBscGZjX2NudGxfYXR0cl9sbmtfdHlwZV9TSElGVAkJMzAKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbG5rX3R5cGVfTUFTSwkJMHgwMDAwMDAwMworI2RlZmluZSBscGZjX2NudGxfYXR0cl9sbmtfdHlwZV9XT1JECQl3b3JkMTExCisJdWludDMyX3QgZndfcG9zdF9zdGF0dXM7CisJdWludDMyX3QgaGJhX210dVs4XTsKKwl1aW50MzJfdCB3b3JkMTIxOworCXVpbnQzMl90IHJlc2VydmVkMVszXTsKKwl1aW50MzJfdCB3b3JkMTI1OworI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfdmVuZG9yX2lkX1NISUZUCTAKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX3ZlbmRvcl9pZF9NQVNLCTB4MDAwMGZmZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX3ZlbmRvcl9pZF9XT1JECXdvcmQxMjUKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2RldmljZV9pZF9TSElGVAkxNgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZGV2aWNlX2lkX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZGV2aWNlX2lkX1dPUkQJd29yZDEyNQorCXVpbnQzMl90IHdvcmQxMjY7CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJ2ZHJfaWRfU0hJRlQJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfc3VidmRyX2lkX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfc3VidmRyX2lkX1dPUkQJd29yZDEyNgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfc3Vic3lzX2lkX1NISUZUCTE2CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJzeXNfaWRfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9zdWJzeXNfaWRfV09SRAl3b3JkMTI2CisJdWludDMyX3Qgd29yZDEyNzsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2J1c19udW1fU0hJRlQJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfYnVzX251bV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9idXNfbnVtX1dPUkQJCXdvcmQxMjcKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2Rldl9udW1fU0hJRlQJOAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZGV2X251bV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX3BjaV9kZXZfbnVtX1dPUkQJCXdvcmQxMjcKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2ZuY19udW1fU0hJRlQJMTYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfcGNpX2ZuY19udW1fTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBscGZjX2NudGxfYXR0cl9wY2lfZm5jX251bV9XT1JECQl3b3JkMTI3CisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2luZl90eXBlX1NISUZUCQkyNAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9pbmZfdHlwZV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIGxwZmNfY250bF9hdHRyX2luZl90eXBlX1dPUkQJCXdvcmQxMjcKKwl1aW50MzJfdCB1bmlxdWVfaWRbMl07CisJdWludDMyX3Qgd29yZDEzMDsKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbnVtX25ldGZpbF9TSElGVAkJMAorI2RlZmluZSBscGZjX2NudGxfYXR0cl9udW1fbmV0ZmlsX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgbHBmY19jbnRsX2F0dHJfbnVtX25ldGZpbF9XT1JECQl3b3JkMTMwCisJdWludDMyX3QgcmVzZXJ2ZWQyWzRdOworfTsKKworc3RydWN0IGxwZmNfbWJ4X2dldF9jbnRsX2F0dHJpYnV0ZXMgeworCXVuaW9uICBscGZjX3NsaTRfY2ZnX3NoZHIgY2ZnX3NoZHI7CisJc3RydWN0IGxwZmNfY29udHJvbGxlcl9hdHRyaWJ1dGUgY250bF9hdHRyOworfTsKKworc3RydWN0IGxwZmNfbWJ4X2dldF9wb3J0X25hbWUgeworCXN0cnVjdCBtYm94X2hlYWRlciBoZWFkZXI7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3Qgd29yZDQ7CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbG5rX3R5cGVfU0hJRlQJMAorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX2xua190eXBlX01BU0sJMHgwMDAwMDAwMworI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX2xua190eXBlX1dPUkQJd29yZDQKKwkJfSByZXF1ZXN0OworCQlzdHJ1Y3QgeworCQkJdWludDMyX3Qgd29yZDQ7CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTBfU0hJRlQJMAorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUwX01BU0sJMHgwMDAwMDBGRgorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUwX1dPUkQJd29yZDQKKyNkZWZpbmUgbHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMV9TSElGVAk4CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTFfTUFTSwkweDAwMDAwMEZGCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTFfV09SRAl3b3JkNAorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUyX1NISUZUCTE2CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTJfTUFTSwkweDAwMDAwMEZGCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTJfV09SRAl3b3JkNAorI2RlZmluZSBscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUzX1NISUZUCTI0CisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTNfTUFTSwkweDAwMDAwMEZGCisjZGVmaW5lIGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTNfV09SRAl3b3JkNAorI2RlZmluZSBMUEZDX0xJTktfTlVNQkVSXzAJCQkwCisjZGVmaW5lIExQRkNfTElOS19OVU1CRVJfMQkJCTEKKyNkZWZpbmUgTFBGQ19MSU5LX05VTUJFUl8yCQkJMgorI2RlZmluZSBMUEZDX0xJTktfTlVNQkVSXzMJCQkzCisJCX0gcmVzcG9uc2U7CisJfSB1OworfTsKKwogLyogTWFpbGJveCBDb21wbGV0aW9uIFF1ZXVlIEVycm9yIE1lc3NhZ2VzICovCi0jZGVmaW5lIE1CX0NRRV9TVEFUVVNfU1VDQ0VTUyAJCQkweDAKKyNkZWZpbmUgTUJfQ1FFX1NUQVRVU19TVUNDRVNTCQkJMHgwCiAjZGVmaW5lIE1CX0NRRV9TVEFUVVNfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRVMJMHgxCiAjZGVmaW5lIE1CX0NRRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIJCTB4MgogI2RlZmluZSBNQl9DUUVfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMJMHgzCkBAIC0yNjM3LDggKzI4NjksOSBAQAogCQlzdHJ1Y3QgbHBmY19tYnhfcnVuX2xpbmtfZGlhZ190ZXN0IGxpbmtfZGlhZ190ZXN0OwogCQlzdHJ1Y3QgbHBmY19tYnhfZ2V0X2Z1bmNfY2ZnIGdldF9mdW5jX2NmZzsKIAkJc3RydWN0IGxwZmNfbWJ4X2dldF9wcm9mX2NmZyBnZXRfcHJvZl9jZmc7Ci0JCXN0cnVjdCBscGZjX21ieF9ub3Agbm9wOwogCQlzdHJ1Y3QgbHBmY19tYnhfd3Jfb2JqZWN0IHdyX29iamVjdDsKKwkJc3RydWN0IGxwZmNfbWJ4X2dldF9wb3J0X25hbWUgZ2V0X3BvcnRfbmFtZTsKKwkJc3RydWN0IGxwZmNfbWJ4X25vcCBub3A7CiAJfSB1bjsKIH07CiAKQEAgLTI4NTUsNiArMzA4OCw5IEBACiAjZGVmaW5lIHdxZV9jdHh0X3RhZ19NQVNLICAgICAweDAwMDBGRkZGCiAjZGVmaW5lIHdxZV9jdHh0X3RhZ19XT1JEICAgICB3b3JkNgogCXVpbnQzMl90IHdvcmQ3OworI2RlZmluZSB3cWVfZGlmX1NISUZUICAgICAgICAgMAorI2RlZmluZSB3cWVfZGlmX01BU0sgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSB3cWVfZGlmX1dPUkQgICAgICAgICAgd29yZDcKICNkZWZpbmUgd3FlX2N0X1NISUZUICAgICAgICAgIDIKICNkZWZpbmUgd3FlX2N0X01BU0sgICAgICAgICAgIDB4MDAwMDAwMDMKICNkZWZpbmUgd3FlX2N0X1dPUkQgICAgICAgICAgIHdvcmQ3CkBAIC0yODY3LDEyICszMTAzLDIxIEBACiAjZGVmaW5lIHdxZV9jbGFzc19TSElGVCAgICAgICAxNgogI2RlZmluZSB3cWVfY2xhc3NfTUFTSyAgICAgICAgMHgwMDAwMDAwNwogI2RlZmluZSB3cWVfY2xhc3NfV09SRCAgICAgICAgd29yZDcKKyNkZWZpbmUgd3FlX2FyX1NISUZUICAgICAgICAgIDE5CisjZGVmaW5lIHdxZV9hcl9NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHdxZV9hcl9XT1JEICAgICAgICAgICB3b3JkNworI2RlZmluZSB3cWVfYWdfU0hJRlQgICAgICAgICAgd3FlX2FyX1NISUZUCisjZGVmaW5lIHdxZV9hZ19NQVNLICAgICAgICAgICB3cWVfYXJfTUFTSworI2RlZmluZSB3cWVfYWdfV09SRCAgICAgICAgICAgd3FlX2FyX1dPUkQKICNkZWZpbmUgd3FlX3B1X1NISUZUICAgICAgICAgIDIwCiAjZGVmaW5lIHdxZV9wdV9NQVNLICAgICAgICAgICAweDAwMDAwMDAzCiAjZGVmaW5lIHdxZV9wdV9XT1JEICAgICAgICAgICB3b3JkNwogI2RlZmluZSB3cWVfZXJwX1NISUZUICAgICAgICAgMjIKICNkZWZpbmUgd3FlX2VycF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgd3FlX2VycF9XT1JEICAgICAgICAgIHdvcmQ3CisjZGVmaW5lIHdxZV9jb25mX1NISUZUICAgICAgICB3cWVfZXJwX1NISUZUCisjZGVmaW5lIHdxZV9jb25mX01BU0sgICAgICAgICB3cWVfZXJwX01BU0sKKyNkZWZpbmUgd3FlX2NvbmZfV09SRCAgICAgICAgIHdxZV9lcnBfV09SRAogI2RlZmluZSB3cWVfbG5rX1NISUZUICAgICAgICAgMjMKICNkZWZpbmUgd3FlX2xua19NQVNLICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgd3FlX2xua19XT1JEICAgICAgICAgIHdvcmQ3CkBAIC0yOTMxLDYgKzMxNzYsOSBAQAogI2RlZmluZSB3cWVfeGNfU0hJRlQgICAgICAgICAgMjEKICNkZWZpbmUgd3FlX3hjX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgd3FlX3hjX1dPUkQgICAgICAgICAgIHdvcmQxMAorI2RlZmluZSB3cWVfc3JfU0hJRlQgICAgICAgICAgMjIKKyNkZWZpbmUgd3FlX3NyX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgd3FlX3NyX1dPUkQgICAgICAgICAgIHdvcmQxMAogI2RlZmluZSB3cWVfY2NwZV9TSElGVCAgICAgICAgMjMKICNkZWZpbmUgd3FlX2NjcGVfTUFTSyAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgd3FlX2NjcGVfV09SRCAgICAgICAgIHdvcmQxMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCBhM2M4MjAwLi41NWJjNGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC01OCw4ICs1OSw3IEBACiAKIHN0YXRpYyB2b2lkIGxwZmNfZ2V0X2hiYV9tb2RlbF9kZXNjKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50OF90ICosIHVpbnQ4X3QgKik7CiBzdGF0aWMgaW50IGxwZmNfcG9zdF9yY3ZfYnVmKHN0cnVjdCBscGZjX2hiYSAqKTsKLXN0YXRpYyBpbnQgbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKik7Ci1zdGF0aWMgdm9pZCBscGZjX3NsaTRfcXVldWVfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKik7CitzdGF0aWMgaW50IGxwZmNfc2xpNF9xdWV1ZV92ZXJpZnkoc3RydWN0IGxwZmNfaGJhICopOwogc3RhdGljIGludCBscGZjX2NyZWF0ZV9ib290c3RyYXBfbWJveChzdHJ1Y3QgbHBmY19oYmEgKik7CiBzdGF0aWMgaW50IGxwZmNfc2V0dXBfZW5kaWFuX29yZGVyKHN0cnVjdCBscGZjX2hiYSAqKTsKIHN0YXRpYyBpbnQgbHBmY19zbGk0X3JlYWRfY29uZmlnKHN0cnVjdCBscGZjX2hiYSAqKTsKQEAgLTE0MzgsNiArMTQzOCw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJdWludDMyX3QgaWZfdHlwZTsKIAlzdHJ1Y3QgbHBmY19yZWdpc3RlciBwb3J0c3RhdF9yZWc7CisJaW50IHJjOwogCiAJLyogSWYgdGhlIHBjaSBjaGFubmVsIGlzIG9mZmxpbmUsIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMsIHNpbmNlCiAJICogd2UgY2Fubm90IGNvbW11bmljYXRlIHdpdGggdGhlIHBjaSBjYXJkIGFueXdheS4KQEAgLTE0ODAsMTYgKzE0ODEsMjQgQEAKIAkJCWxwZmNfc2xpNF9vZmZsaW5lX2VyYXR0KHBoYmEpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChiZl9nZXQobHBmY19zbGlwb3J0X3N0YXR1c19ybiwgJnBvcnRzdGF0X3JlZykpIHsKLQkJCS8qCi0JCQkgKiBUT0RPOiBBdHRlbXB0IHBvcnQgcmVjb3ZlcnkgdmlhIGEgcG9ydCByZXNldC4KLQkJCSAqIFdoZW4gZnVsbHkgaW1wbGVtZW50ZWQsIHRoZSBkcml2ZXIgc2hvdWxkCi0JCQkgKiBhdHRlbXB0IHRvIHJlY292ZXIgdGhlIHBvcnQgaGVyZSBhbmQgcmV0dXJuLgotCQkJICogRm9yIG5vdywgbG9nIGFuIGVycm9yIGFuZCB0YWtlIHRoZSBwb3J0IG9mZmxpbmUuCi0JCQkgKi8KKwkJLyoKKwkJICogT24gZXJyb3Igc3RhdHVzIGNvbmRpdGlvbiwgZHJpdmVyIG5lZWQgdG8gd2FpdCBmb3IgcG9ydAorCQkgKiByZWFkeSBiZWZvcmUgcGVyZm9ybWluZyByZXNldC4KKwkJICovCisJCXJjID0gbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHBoYmEpOworCQlpZiAoIXJjKSB7CisJCQkvKiBuZWVkIHJlc2V0OiBhdHRlbXB0IGZvciBwb3J0IHJlY292ZXJ5ICovCiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCQkiMjg4NyBQb3J0IEVycm9yOiBBdHRlbXB0aW5nICIKIAkJCQkJIlBvcnQgUmVjb3ZlcnlcbiIpOworCQkJbHBmY19vZmZsaW5lX3ByZXAocGhiYSk7CisJCQlscGZjX29mZmxpbmUocGhiYSk7CisJCQlscGZjX3NsaV9icmRyZXN0YXJ0KHBoYmEpOworCQkJaWYgKGxwZmNfb25saW5lKHBoYmEpID09IDApIHsKKwkJCQlscGZjX3VuYmxvY2tfbWdtdF9pbyhwaGJhKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggZm9yIG5vdCBhYmxlIHRvIHJlY292ZXIgKi8KIAkJfQogCQlscGZjX3NsaTRfb2ZmbGluZV9lcmF0dChwaGJhKTsKIAkJYnJlYWs7CkBAIC0xNzI0LDExICsxNzMzLDIwIEBACiAJCQkJaiA9IDA7CiAJCQkJTGVuZ3RoIC09ICgzK2kpOwogCQkJCXdoaWxlKGktLSkgewotCQkJCXBoYmEtPlBvcnRbaisrXSA9IHZwZFtpbmRleCsrXTsKLQkJCQlpZiAoaiA9PSAxOSkKLQkJCQkJYnJlYWs7CisJCQkJCWlmICgocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSAmJgorCQkJCQkgICAgKHBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID09CisJCQkJCSAgICAgTFBGQ19TTEk0X1BQTkFNRV9HRVQpKSB7CisJCQkJCQlqKys7CisJCQkJCQlpbmRleCsrOworCQkJCQl9IGVsc2UKKwkJCQkJCXBoYmEtPlBvcnRbaisrXSA9IHZwZFtpbmRleCsrXTsKKwkJCQkJaWYgKGogPT0gMTkpCisJCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJcGhiYS0+UG9ydFtqXSA9IDA7CisJCQkJaWYgKChwaGJhLT5zbGlfcmV2ICE9IExQRkNfU0xJX1JFVjQpIHx8CisJCQkJICAgIChwaGJhLT5zbGk0X2hiYS5wcG9ydF9uYW1lX3N0YSA9PQorCQkJCSAgICAgTFBGQ19TTEk0X1BQTkFNRV9OT04pKQorCQkJCQlwaGJhLT5Qb3J0W2pdID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWVsc2UgewpAQCAtMTk1OCw3ICsxOTc2LDcgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfTEFOQ0VSX0ZDT0U6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xBTkNFUl9GQ09FX1ZGOgogCQlvbmVDb25uZWN0ID0gMTsKLQkJbSA9ICh0eXBlb2YobSkpeyJPQ2U1MDEwMCIsICJQQ0llIiwgIkZDb0UifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJPQ2UxNTEwMCIsICJQQ0llIiwgIkZDb0UifTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbSA9ICh0eXBlb2YobSkpeyJVbmtub3duIiwgIiIsICIifTsKQEAgLTI0MzIsMTcgKzI0NTAsMTkgQEAKIAl1aW50OF90IGFjdGNtZCA9IE1CWF9IRUFSVEJFQVQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0KKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhMUEZDX01CT1hfVE1PICogMTAwMCkgKyBqaWZmaWVzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJcGhiYS0+c2xpLnNsaV9mbGFnIHw9IExQRkNfQkxPQ0tfTUdNVF9JTzsKLQlpZiAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKQorCWlmIChwaGJhLT5zbGkubWJveF9hY3RpdmUpIHsKIAkJYWN0Y21kID0gcGhiYS0+c2xpLm1ib3hfYWN0aXZlLT51Lm1iLm1ieENvbW1hbmQ7CisJCS8qIERldGVybWluZSBob3cgbG9uZyB3ZSBtaWdodCB3YWl0IGZvciB0aGUgYWN0aXZlIG1haWxib3gKKwkJICogY29tbWFuZCB0byBiZSBncmFjZWZ1bGx5IGNvbXBsZXRlZCBieSBmaXJtd2FyZS4KKwkJICovCisJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsCisJCQkJcGhiYS0+c2xpLm1ib3hfYWN0aXZlKSAqIDEwMDApICsgamlmZmllczsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwotCS8qIERldGVybWluZSBob3cgbG9uZyB3ZSBtaWdodCB3YWl0IGZvciB0aGUgYWN0aXZlIG1haWxib3gKLQkgKiBjb21tYW5kIHRvIGJlIGdyYWNlZnVsbHkgY29tcGxldGVkIGJ5IGZpcm13YXJlLgotCSAqLwotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIGFjdGNtZCkgKiAxMDAwKSArCi0JCQlqaWZmaWVzOworCiAJLyogV2FpdCBmb3IgdGhlIG91dHN0bmFkaW5nIG1haWxib3ggY29tbWFuZCB0byBjb21wbGV0ZSAqLwogCXdoaWxlIChwaGJhLT5zbGkubWJveF9hY3RpdmUpIHsKIAkJLyogQ2hlY2sgYWN0aXZlIG1haWxib3ggY29tcGxldGUgc3RhdHVzIGV2ZXJ5IDJtcyAqLwpAQCAtMzk0OSw3ICszOTY5LDcgQEAKIGxwZmNfZW5hYmxlX3BjaV9kZXYoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCWludCBiYXJzOworCWludCBiYXJzID0gMDsKIAogCS8qIE9idGFpbiBQQ0kgZGV2aWNlIHJlZmVyZW5jZSAqLwogCWlmICghcGhiYS0+cGNpZGV2KQpAQCAtMzk3OCw2ICszOTk4LDggQEAKIG91dF9kaXNhYmxlX2RldmljZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBvdXRfZXJyb3I6CisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSIxNDAxIEZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZSwgYmFyczp4JXhcbiIsIGJhcnMpOwogCXJldHVybiAtRU5PREVWOwogfQogCkBAIC00MDUxLDkgKzQwNzMsNiBAQAogCXVpbnQxNl90IG5yX3ZpcnRmbjsKIAlpbnQgcG9zOwogCi0JaWYgKCFwZGV2LT5pc19waHlzZm4pCi0JCXJldHVybiAwOwotCiAJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX0VYVF9DQVBfSURfU1JJT1YpOwogCWlmIChwb3MgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC00NDc0LDE1ICs0NDkzLDE1IEBACiAJCX0KIAl9CiAJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKLQkvKiBDcmVhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcyAqLwotCXJjID0gbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZShwaGJhKTsKKwkvKiBWZXJpZnkgYWxsIHRoZSBTTEk0IHF1ZXVlcyAqLworCXJjID0gbHBmY19zbGk0X3F1ZXVlX3ZlcmlmeShwaGJhKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2ZyZWVfYnNtYng7CiAKIAkvKiBDcmVhdGUgZHJpdmVyIGludGVybmFsIENRRSBldmVudCBwb29sICovCiAJcmMgPSBscGZjX3NsaTRfY3FfZXZlbnRfcG9vbF9jcmVhdGUocGhiYSk7CiAJaWYgKHJjKQotCQlnb3RvIG91dF9kZXN0cm95X3F1ZXVlOworCQlnb3RvIG91dF9mcmVlX2JzbWJ4OwogCiAJLyogSW5pdGlhbGl6ZSBhbmQgcG9wdWxhdGUgdGhlIGlvY2IgbGlzdCBwZXIgaG9zdCAqLwogCXJjID0gbHBmY19pbml0X3NnbF9saXN0KHBoYmEpOwpAQCAtNDUxNiwxNCArNDUzNSwyMSBAQAogCQlnb3RvIG91dF9yZW1vdmVfcnBpX2hkcnM7CiAJfQogCi0JcGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsKSAqCisJLyoKKwkgKiBUaGUgY2ZnX2ZjcF9lcV9jb3VudCBjYW4gYmUgemVybyB3aGVuZXZlciB0aGVyZSBpcyBleGFjdGx5IG9uZQorCSAqIGludGVycnVwdCB2ZWN0b3IuICBUaGlzIGlzIG5vdCBhbiBlcnJvcgorCSAqLworCWlmIChwaGJhLT5jZmdfZmNwX2VxX2NvdW50KSB7CisJCXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwgPQorCQkJCWt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbHBmY19mY3BfZXFfaGRsKSAqCiAJCQkJICAgIHBoYmEtPmNmZ19mY3BfZXFfY291bnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMjU3MiBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciBmYXN0LXBhdGggIgotCQkJCSJwZXItRVEgaGFuZGxlIGFycmF5XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX2ZjZl9ycl9ibWFzazsKKwkJaWYgKCFwaGJhLT5zbGk0X2hiYS5mY3BfZXFfaGRsKSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkiMjU3MiBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkJCSJmYXN0LXBhdGggcGVyLUVRIGhhbmRsZSBhcnJheVxuIik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX2ZjZl9ycl9ibWFzazsKKwkJfQogCX0KIAogCXBoYmEtPnNsaTRfaGJhLm1zaXhfZW50cmllcyA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkgKgpAQCAtNDU2Nyw4ICs0NTkzLDYgQEAKIAlscGZjX2ZyZWVfc2dsX2xpc3QocGhiYSk7CiBvdXRfZGVzdHJveV9jcV9ldmVudF9wb29sOgogCWxwZmNfc2xpNF9jcV9ldmVudF9wb29sX2Rlc3Ryb3kocGhiYSk7Ci1vdXRfZGVzdHJveV9xdWV1ZToKLQlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIG91dF9mcmVlX2JzbWJ4OgogCWxwZmNfZGVzdHJveV9ib290c3RyYXBfbWJveChwaGJhKTsKIG91dF9mcmVlX21lbToKQEAgLTQ2MDgsOSArNDYzMiw2IEBACiAJLyogRnJlZSB0aGUgU0NTSSBzZ2wgbWFuYWdlbWVudCBhcnJheSAqLwogCWtmcmVlKHBoYmEtPnNsaTRfaGJhLmxwZmNfc2NzaV9wc2JfYXJyYXkpOwogCi0JLyogRnJlZSB0aGUgU0xJNCBxdWV1ZXMgKi8KLQlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKLQogCS8qIEZyZWUgdGhlIGNvbXBsZXRpb24gcXVldWUgRVEgZXZlbnQgcG9vbCAqLwogCWxwZmNfc2xpNF9jcV9ldmVudF9yZWxlYXNlX2FsbChwaGJhKTsKIAlscGZjX3NsaTRfY3FfZXZlbnRfcG9vbF9kZXN0cm95KHBoYmEpOwpAQCAtNjEzOSwyNCArNjE2MCwyMSBAQAogfQogCiAvKioKLSAqIGxwZmNfc2xpNF9xdWV1ZV9jcmVhdGUgLSBDcmVhdGUgYWxsIHRoZSBTTEk0IHF1ZXVlcworICogbHBmY19zbGk0X3F1ZXVlX3ZlcmlmeSAtIFZlcmlmeSBhbmQgdXBkYXRlIEVRIGFuZCBDUSBjb3VudHMKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICoKLSAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGFsbG9jYXRlIGFsbCB0aGUgU0xJNCBxdWV1ZXMgZm9yIHRoZSBGQ29FIEhCQQotICogb3BlcmF0aW9uLiBGb3IgZWFjaCBTTEk0IHF1ZXVlIHR5cGUsIHRoZSBwYXJhbWV0ZXJzIHN1Y2ggYXMgcXVldWUgZW50cnkKLSAqIGNvdW50IChxdWV1ZSBkZXB0aCkgc2hhbGwgYmUgdGFrZW4gZnJvbSB0aGUgbW9kdWxlIHBhcmFtZXRlci4gRm9yIG5vdywKLSAqIHdlIGp1c3QgdXNlIHNvbWUgY29uc3RhbnQgbnVtYmVyIGFzIHBsYWNlIGhvbGRlci4KKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGNoZWNrIHRoZSB1c2VyIHNldHRhYmxlIHF1ZXVlIGNvdW50cyBmb3IgRVFzIGFuZAorICogQ1FzLiBhZnRlciB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRoZSBjb3VudHMgd2lsbCBiZSBzZXQgdG8gdmFsaWQgdmFsdWVzIHRoYXQKKyAqIGFkaGVyZSB0byB0aGUgY29uc3RyYWludHMgb2YgdGhlIHN5c3RlbSdzIGludGVycnVwdCB2ZWN0b3JzIGFuZCB0aGUgcG9ydCdzCisgKiBxdWV1ZSByZXNvdXJjZXMuCiAgKgogICogUmV0dXJuIGNvZGVzCiAgKiAgICAgIDAgLSBzdWNjZXNzZnVsCiAgKiAgICAgIC1FTk9NRU0gLSBObyBhdmFpbGFibGUgbWVtb3J5Ci0gKiAgICAgIC1FSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICoqLwogc3RhdGljIGludAotbHBmY19zbGk0X3F1ZXVlX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCitscGZjX3NsaTRfcXVldWVfdmVyaWZ5KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKLQlzdHJ1Y3QgbHBmY19xdWV1ZSAqcWRlc2M7Ci0JaW50IGZjcF9lcWlkeCwgZmNwX2NxaWR4LCBmY3Bfd3FpZHg7CiAJaW50IGNmZ19mY3Bfd3FfY291bnQ7CiAJaW50IGNmZ19mY3BfZXFfY291bnQ7CiAKQEAgLTYyMjksMTQgKzYyNDcsNDMgQEAKIAkvKiBUaGUgb3ZlcmFsbCBudW1iZXIgb2YgZXZlbnQgcXVldWVzIHVzZWQgKi8KIAlwaGJhLT5zbGk0X2hiYS5jZmdfZXFuID0gcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCArIExQRkNfU1BfRVFOX0RFRjsKIAotCS8qCi0JICogQ3JlYXRlIEV2ZW50IFF1ZXVlcyAoRVFzKQotCSAqLwotCiAJLyogR2V0IEVRIGRlcHRoIGZyb20gbW9kdWxlIHBhcmFtZXRlciwgZmFrZSB0aGUgZGVmYXVsdCBmb3Igbm93ICovCiAJcGhiYS0+c2xpNF9oYmEuZXFfZXNpemUgPSBMUEZDX0VRRV9TSVpFXzRCOwogCXBoYmEtPnNsaTRfaGJhLmVxX2Vjb3VudCA9IExQRkNfRVFFX0RFRl9DT1VOVDsKIAorCS8qIEdldCBDUSBkZXB0aCBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIsIGZha2UgdGhlIGRlZmF1bHQgZm9yIG5vdyAqLworCXBoYmEtPnNsaTRfaGJhLmNxX2VzaXplID0gTFBGQ19DUUVfU0laRTsKKwlwaGJhLT5zbGk0X2hiYS5jcV9lY291bnQgPSBMUEZDX0NRRV9ERUZfQ09VTlQ7CisKKwlyZXR1cm4gMDsKK291dF9lcnJvcjoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfcXVldWVfY3JlYXRlIC0gQ3JlYXRlIGFsbCB0aGUgU0xJNCBxdWV1ZXMKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIGFsbG9jYXRlIGFsbCB0aGUgU0xJNCBxdWV1ZXMgZm9yIHRoZSBGQ29FIEhCQQorICogb3BlcmF0aW9uLiBGb3IgZWFjaCBTTEk0IHF1ZXVlIHR5cGUsIHRoZSBwYXJhbWV0ZXJzIHN1Y2ggYXMgcXVldWUgZW50cnkKKyAqIGNvdW50IChxdWV1ZSBkZXB0aCkgc2hhbGwgYmUgdGFrZW4gZnJvbSB0aGUgbW9kdWxlIHBhcmFtZXRlci4gRm9yIG5vdywKKyAqIHdlIGp1c3QgdXNlIHNvbWUgY29uc3RhbnQgbnVtYmVyIGFzIHBsYWNlIGhvbGRlci4KKyAqCisgKiBSZXR1cm4gY29kZXMKKyAqICAgICAgMCAtIHN1Y2Vzc2Z1bAorICogICAgICAtRU5PTUVNIC0gTm8gYXZhaWxibGUgbWVtb3J5CisgKiAgICAgIC1FSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgorICoqLworaW50CitscGZjX3NsaTRfcXVldWVfY3JlYXRlKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19xdWV1ZSAqcWRlc2M7CisJaW50IGZjcF9lcWlkeCwgZmNwX2NxaWR4LCBmY3Bfd3FpZHg7CisKKwkvKgorCSAqIENyZWF0ZSBFdmVudCBRdWV1ZXMgKEVRcykKKwkgKi8KKwogCS8qIENyZWF0ZSBzbG93IHBhdGggZXZlbnQgcXVldWUgKi8KIAlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS5lcV9lc2l6ZSwKIAkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS5lcV9lY291bnQpOwpAQCAtNjI0NywxNCArNjI5NCwyMCBAQAogCX0KIAlwaGJhLT5zbGk0X2hiYS5zcF9lcSA9IHFkZXNjOwogCi0JLyogQ3JlYXRlIGZhc3QtcGF0aCBGQ1AgRXZlbnQgUXVldWUocykgKi8KLQlwaGJhLT5zbGk0X2hiYS5mcF9lcSA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgbHBmY19xdWV1ZSAqKSAqCi0JCQkgICAgICAgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCksIEdGUF9LRVJORUwpOwotCWlmICghcGhiYS0+c2xpNF9oYmEuZnBfZXEpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMjU3NiBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciBmYXN0LXBhdGggIgotCQkJCSJFUSByZWNvcmQgYXJyYXlcbiIpOwotCQlnb3RvIG91dF9mcmVlX3NwX2VxOworCS8qCisJICogQ3JlYXRlIGZhc3QtcGF0aCBGQ1AgRXZlbnQgUXVldWUocykuICBUaGUgY2ZnX2ZjcF9lcV9jb3VudCBjYW4gYmUKKwkgKiB6ZXJvIHdoZW5ldmVyIHRoZXJlIGlzIGV4YWN0bHkgb25lIGludGVycnVwdCB2ZWN0b3IuICBUaGlzIGlzIG5vdAorCSAqIGFuIGVycm9yLgorCSAqLworCWlmIChwaGJhLT5jZmdfZmNwX2VxX2NvdW50KSB7CisJCXBoYmEtPnNsaTRfaGJhLmZwX2VxID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX3F1ZXVlICopICoKKwkJCQkgICAgICAgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCksIEdGUF9LRVJORUwpOworCQlpZiAoIXBoYmEtPnNsaTRfaGJhLmZwX2VxKSB7CisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkiMjU3NiBGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkJCSJmYXN0LXBhdGggRVEgcmVjb3JkIGFycmF5XG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfc3BfZXE7CisJCX0KIAl9CiAJZm9yIChmY3BfZXFpZHggPSAwOyBmY3BfZXFpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OyBmY3BfZXFpZHgrKykgewogCQlxZGVzYyA9IGxwZmNfc2xpNF9xdWV1ZV9hbGxvYyhwaGJhLCBwaGJhLT5zbGk0X2hiYS5lcV9lc2l6ZSwKQEAgLTYyNzEsMTAgKzYzMjQsNiBAQAogCSAqIENyZWF0ZSBDb21wbGV0ZSBRdWV1ZXMgKENRcykKIAkgKi8KIAotCS8qIEdldCBDUSBkZXB0aCBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIsIGZha2UgdGhlIGRlZmF1bHQgZm9yIG5vdyAqLwotCXBoYmEtPnNsaTRfaGJhLmNxX2VzaXplID0gTFBGQ19DUUVfU0laRTsKLQlwaGJhLT5zbGk0X2hiYS5jcV9lY291bnQgPSBMUEZDX0NRRV9ERUZfQ09VTlQ7Ci0KIAkvKiBDcmVhdGUgc2xvdy1wYXRoIE1haWxib3ggQ29tbWFuZCBDb21wbGV0ZSBRdWV1ZSAqLwogCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmNxX2VzaXplLAogCQkJCSAgICAgIHBoYmEtPnNsaTRfaGJhLmNxX2Vjb3VudCk7CkBAIC02Mjk2LDE2ICs2MzQ1LDI1IEBACiAJcGhiYS0+c2xpNF9oYmEuZWxzX2NxID0gcWRlc2M7CiAKIAotCS8qIENyZWF0ZSBmYXN0LXBhdGggRkNQIENvbXBsZXRpb24gUXVldWUocyksIG9uZS10by1vbmUgd2l0aCBFUXMgKi8KLQlwaGJhLT5zbGk0X2hiYS5mY3BfY3EgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGxwZmNfcXVldWUgKikgKgotCQkJCXBoYmEtPmNmZ19mY3BfZXFfY291bnQpLCBHRlBfS0VSTkVMKTsKKwkvKgorCSAqIENyZWF0ZSBmYXN0LXBhdGggRkNQIENvbXBsZXRpb24gUXVldWUocyksIG9uZS10by1vbmUgd2l0aCBGQ1AgRVFzLgorCSAqIElmIHRoZXJlIGFyZSBubyBGQ1AgRVFzIHRoZW4gY3JlYXRlIGV4YWN0bHkgb25lIEZDUCBDUS4KKwkgKi8KKwlpZiAocGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCkKKwkJcGhiYS0+c2xpNF9oYmEuZmNwX2NxID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBscGZjX3F1ZXVlICopICoKKwkJCQkJCSBwaGJhLT5jZmdfZmNwX2VxX2NvdW50KSwKKwkJCQkJCUdGUF9LRVJORUwpOworCWVsc2UKKwkJcGhiYS0+c2xpNF9oYmEuZmNwX2NxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxwZmNfcXVldWUgKiksCisJCQkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmZjcF9jcSkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAogCQkJCSIyNTc3IEZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZhc3QtcGF0aCAiCiAJCQkJIkNRIHJlY29yZCBhcnJheVxuIik7CiAJCWdvdG8gb3V0X2ZyZWVfZWxzX2NxOwogCX0KLQlmb3IgKGZjcF9jcWlkeCA9IDA7IGZjcF9jcWlkeCA8IHBoYmEtPmNmZ19mY3BfZXFfY291bnQ7IGZjcF9jcWlkeCsrKSB7CisJZmNwX2NxaWR4ID0gMDsKKwlkbyB7CiAJCXFkZXNjID0gbHBmY19zbGk0X3F1ZXVlX2FsbG9jKHBoYmEsIHBoYmEtPnNsaTRfaGJhLmNxX2VzaXplLAogCQkJCQkgICAgICBwaGJhLT5zbGk0X2hiYS5jcV9lY291bnQpOwogCQlpZiAoIXFkZXNjKSB7CkBAIC02MzE1LDcgKzYzNzMsNyBAQAogCQkJZ290byBvdXRfZnJlZV9mY3BfY3E7CiAJCX0KIAkJcGhiYS0+c2xpNF9oYmEuZmNwX2NxW2ZjcF9jcWlkeF0gPSBxZGVzYzsKLQl9CisJfSB3aGlsZSAoKytmY3BfY3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50KTsKIAogCS8qIENyZWF0ZSBNYWlsYm94IENvbW1hbmQgUXVldWUgKi8KIAlwaGJhLT5zbGk0X2hiYS5tcV9lc2l6ZSA9IExQRkNfTVFFX1NJWkU7CkBAIC02NDQ3LDcgKzY1MDUsNyBAQAogICogICAgICAtRU5PTUVNIC0gTm8gYXZhaWxhYmxlIG1lbW9yeQogICogICAgICAtRUlPIC0gVGhlIG1haWxib3ggZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KICAqKi8KLXN0YXRpYyB2b2lkCit2b2lkCiBscGZjX3NsaTRfcXVldWVfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJaW50IGZjcF9xaWR4OwpAQCAtNjcyMyw2ICs2NzgxLDEwIEBACiAJCQkJIjA1NDAgUmVjZWl2ZSBRdWV1ZSBub3QgYWxsb2NhdGVkXG4iKTsKIAkJZ290byBvdXRfZGVzdHJveV9mY3Bfd3E7CiAJfQorCisJbHBmY19ycV9hZGp1c3RfcmVwb3N0KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmhkcl9ycSwgTFBGQ19FTFNfSEJRKTsKKwlscGZjX3JxX2FkanVzdF9yZXBvc3QocGhiYSwgcGhiYS0+c2xpNF9oYmEuZGF0X3JxLCBMUEZDX0VMU19IQlEpOworCiAJcmMgPSBscGZjX3JxX2NyZWF0ZShwaGJhLCBwaGJhLT5zbGk0X2hiYS5oZHJfcnEsIHBoYmEtPnNsaTRfaGJhLmRhdF9ycSwKIAkJCSAgICBwaGJhLT5zbGk0X2hiYS5lbHNfY3EsIExQRkNfVVNPTCk7CiAJaWYgKHJjKSB7CkBAIC02NzMxLDYgKzY3OTMsNyBAQAogCQkJCSJyYyA9IDB4JXhcbiIsIHJjKTsKIAkJZ290byBvdXRfZGVzdHJveV9mY3Bfd3E7CiAJfQorCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsCiAJCQkiMjU5MiBVU0wgUlEgc2V0dXA6IGhkci1ycS1pZD0lZCwgZGF0LXJxLWlkPSVkICIKIAkJCSJwYXJlbnQgY3EtaWQ9JWRcbiIsCkBAIC02NzkwLDggKzY4NTMsMTAgQEAKIAkvKiBVbnNldCBFTFMgY29tcGxldGUgcXVldWUgKi8KIAlscGZjX2NxX2Rlc3Ryb3kocGhiYSwgcGhiYS0+c2xpNF9oYmEuZWxzX2NxKTsKIAkvKiBVbnNldCBGQ1AgcmVzcG9uc2UgY29tcGxldGUgcXVldWUgKi8KLQlmb3IgKGZjcF9xaWR4ID0gMDsgZmNwX3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OyBmY3BfcWlkeCsrKQorCWZjcF9xaWR4ID0gMDsKKwlkbyB7CiAJCWxwZmNfY3FfZGVzdHJveShwaGJhLCBwaGJhLT5zbGk0X2hiYS5mY3BfY3FbZmNwX3FpZHhdKTsKKwl9IHdoaWxlICgrK2ZjcF9xaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCk7CiAJLyogVW5zZXQgZmFzdC1wYXRoIGV2ZW50IHF1ZXVlICovCiAJZm9yIChmY3BfcWlkeCA9IDA7IGZjcF9xaWR4IDwgcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudDsgZmNwX3FpZHgrKykKIAkJbHBmY19lcV9kZXN0cm95KHBoYmEsIHBoYmEtPnNsaTRfaGJhLmZwX2VxW2ZjcF9xaWR4XSk7CkBAIC03MDQwLDEwICs3MTA1LDExIEBACiAJCQkgKiB0aGUgbG9vcCBhZ2Fpbi4KIAkJCSAqLwogCQkJZm9yIChyZHlfY2hrID0gMDsgcmR5X2NoayA8IDEwMDA7IHJkeV9jaGsrKykgeworCQkJCW1zbGVlcCgxMCk7CiAJCQkJaWYgKGxwZmNfcmVhZGwocGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi4KIAkJCQkJICAgICAgU1RBVFVTcmVnYWRkciwgJnJlZ19kYXRhLndvcmQwKSkgewogCQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQkJCWJyZWFrOworCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJaWYgKGJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX3JkeSwgJnJlZ19kYXRhKSkKIAkJCQkJYnJlYWs7CkBAIC03MDUxLDcgKzcxMTcsNiBAQAogCQkJCQlyZXNldF9hZ2FpbisrOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJbXNsZWVwKDEwKTsKIAkJCX0KIAogCQkJLyoKQEAgLTcwNjUsMTEgKzcxMzAsNiBAQAogCQkJfQogCiAJCQkvKiBEZXRlY3QgYW55IHBvcnQgZXJyb3JzLiAqLwotCQkJaWYgKGxwZmNfcmVhZGwocGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5TVEFUVVNyZWdhZGRyLAotCQkJCSAmcmVnX2RhdGEud29yZDApKSB7Ci0JCQkJcmMgPSAtRU5PREVWOwotCQkJCWJyZWFrOwotCQkJfQogCQkJaWYgKChiZl9nZXQobHBmY19zbGlwb3J0X3N0YXR1c19lcnIsICZyZWdfZGF0YSkpIHx8CiAJCQkgICAgKHJkeV9jaGsgPj0gMTAwMCkpIHsKIAkJCQlwaGJhLT53b3JrX3N0YXR1c1swXSA9IHJlYWRsKApAQCAtNzEwMiw2ICs3MTYyLDcgQEAKIAkJYnJlYWs7CiAJfQogCitvdXQ6CiAJLyogQ2F0Y2ggdGhlIG5vdC1yZWFkeSBwb3J0IGZhaWx1cmUgYWZ0ZXIgYSBwb3J0IHJlc2V0LiAqLwogCWlmIChudW1fcmVzZXRzID49IE1BWF9JRl9UWVBFXzJfUkVTRVRTKQogCQlyYyA9IC1FTk9ERVY7CkBAIC03MTQ5LDEyICs3MjEwLDEzIEBACiAJbHBmY19zbGk0X2NvbmZpZyhwaGJhLCBtYm94cSwgTFBGQ19NQk9YX1NVQlNZU1RFTV9DT01NT04sCiAJCQkgTFBGQ19NQk9YX09QQ09ERV9OT1AsIGxlbmd0aCwgTFBGQ19TTEk0X01CWF9FTUJFRCk7CiAKLQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CiAJZm9yIChjbWRzZW50ID0gMDsgY21kc2VudCA8IGNudDsgY21kc2VudCsrKSB7CiAJCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKLQkJZWxzZQorCQllbHNlIHsKKwkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpOwogCQkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsIG1ib3hfdG1vKTsKKwkJfQogCQlpZiAocmMgPT0gTUJYX1RJTUVPVVQpCiAJCQlicmVhazsKIAkJLyogQ2hlY2sgcmV0dXJuIHN0YXR1cyAqLwpAQCAtNzk3NCw2ICs4MDM2LDcgQEAKIAogCS8qIFJlc2V0IFNMSTQgSEJBIEZDb0UgZnVuY3Rpb24gKi8KIAlscGZjX3BjaV9mdW5jdGlvbl9yZXNldChwaGJhKTsKKwlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIAogCXJldHVybjsKIH0KQEAgLTgwODcsNiArODE1MCw3IEBACiAKIAkvKiBSZXNldCBTTEk0IEhCQSBGQ29FIGZ1bmN0aW9uICovCiAJbHBmY19wY2lfZnVuY3Rpb25fcmVzZXQocGhiYSk7CisJbHBmY19zbGk0X3F1ZXVlX2Rlc3Ryb3kocGhiYSk7CiAKIAkvKiBTdG9wIHRoZSBTTEk0IGRldmljZSBwb3J0ICovCiAJcGhiYS0+cHBvcnQtPndvcmtfcG9ydF9ldmVudHMgPSAwOwpAQCAtODEyMCw3ICs4MTg0LDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfUE9SVF9DQVBBQklMSVRJRVMpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3hxKTsKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsIG1ib3hfdG1vKTsKIAl9CiAKQEAgLTgxODIsNiArODI0Niw3IEBACiAJaW50IHJjOwogCXN0cnVjdCBscGZjX21xZSAqbXFlID0gJm1ib3hxLT51Lm1xZTsKIAlzdHJ1Y3QgbHBmY19wY19zbGk0X3BhcmFtcyAqc2xpNF9wYXJhbXM7CisJdWludDMyX3QgbWJveF90bW87CiAJaW50IGxlbmd0aDsKIAlzdHJ1Y3QgbHBmY19zbGk0X3BhcmFtZXRlcnMgKm1ieF9zbGk0X3BhcmFtZXRlcnM7CiAKQEAgLTgyMDAsOSArODI2NSwxMCBAQAogCQkJIGxlbmd0aCwgTFBGQ19TTEk0X01CWF9FTUJFRCk7CiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3hxLCBNQlhfUE9MTCk7Ci0JZWxzZQotCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwKLQkJCWxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRykpOworCWVsc2UgeworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3hxKTsKKwkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsIG1ib3hfdG1vKTsKKwl9CiAJaWYgKHVubGlrZWx5KHJjKSkKIAkJcmV0dXJuIHJjOwogCXNsaTRfcGFyYW1zID0gJnBoYmEtPnNsaTRfaGJhLnBjX3NsaTRfcGFyYW1zOwpAQCAtODI3MSwxMSArODMzNyw4IEBACiAKIAkvKiBQZXJmb3JtIGdlbmVyaWMgUENJIGRldmljZSBlbmFibGluZyBvcGVyYXRpb24gKi8KIAllcnJvciA9IGxwZmNfZW5hYmxlX3BjaV9kZXYocGhiYSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJIjE0MDEgRmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlLlxuIik7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX3BoYmE7Ci0JfQogCiAJLyogU2V0IHVwIFNMSSBBUEkgZnVuY3Rpb24ganVtcCB0YWJsZSBmb3IgUENJLWRldmljZSBncm91cC0wIEhCQXMgKi8KIAllcnJvciA9IGxwZmNfYXBpX3RhYmxlX3NldHVwKHBoYmEsIExQRkNfUENJX0RFVl9MUCk7CkBAIC04MzIyLDYgKzgzODUsOSBAQAogCQlnb3RvIG91dF9mcmVlX2lvY2JfbGlzdDsKIAl9CiAKKwkvKiBHZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBNb2RlbCBOYW1lIGFuZCBEZXNjcmlwdGlvbiAqLworCWxwZmNfZ2V0X2hiYV9tb2RlbF9kZXNjKHBoYmEsIHBoYmEtPk1vZGVsTmFtZSwgcGhiYS0+TW9kZWxEZXNjKTsKKwogCS8qIENyZWF0ZSBTQ1NJIGhvc3QgdG8gdGhlIHBoeXNpY2FsIHBvcnQgKi8KIAllcnJvciA9IGxwZmNfY3JlYXRlX3Nob3N0KHBoYmEpOwogCWlmIChlcnJvcikgewpAQCAtODg4NSwxNiArODk1MSwxNyBAQAogCXVpbnQzMl90IG9mZnNldCA9IDAsIHRlbXBfb2Zmc2V0ID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZkbWFfYnVmZmVyX2xpc3QpOwotCWlmICgoaW1hZ2UtPm1hZ2ljX251bWJlciAhPSBMUEZDX0dST1VQX09KRUNUX01BR0lDX05VTSkgfHwKLQkgICAgKGJmX2dldChscGZjX2dycF9oZHJfZmlsZV90eXBlLCBpbWFnZSkgIT0gTFBGQ19GSUxFX1RZUEVfR1JPVVApIHx8Ci0JICAgIChiZl9nZXQobHBmY19ncnBfaGRyX2lkLCBpbWFnZSkgIT0gTFBGQ19GSUxFX0lEX0dST1VQKSB8fAotCSAgICAoaW1hZ2UtPnNpemUgIT0gZnctPnNpemUpKSB7CisJaWYgKChiZTMyX3RvX2NwdShpbWFnZS0+bWFnaWNfbnVtYmVyKSAhPSBMUEZDX0dST1VQX09KRUNUX01BR0lDX05VTSkgfHwKKwkgICAgKGJmX2dldF9iZTMyKGxwZmNfZ3JwX2hkcl9maWxlX3R5cGUsIGltYWdlKSAhPQorCSAgICAgTFBGQ19GSUxFX1RZUEVfR1JPVVApIHx8CisJICAgIChiZl9nZXRfYmUzMihscGZjX2dycF9oZHJfaWQsIGltYWdlKSAhPSBMUEZDX0ZJTEVfSURfR1JPVVApIHx8CisJICAgIChiZTMyX3RvX2NwdShpbWFnZS0+c2l6ZSkgIT0gZnctPnNpemUpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjMwMjIgSW52YWxpZCBGVyBpbWFnZSBmb3VuZC4gIgotCQkJCSJNYWdpYzolZCBUeXBlOiV4IElEOiV4XG4iLAotCQkJCWltYWdlLT5tYWdpY19udW1iZXIsCi0JCQkJYmZfZ2V0KGxwZmNfZ3JwX2hkcl9maWxlX3R5cGUsIGltYWdlKSwKLQkJCQliZl9nZXQobHBmY19ncnBfaGRyX2lkLCBpbWFnZSkpOworCQkJCSJNYWdpYzoleCBUeXBlOiV4IElEOiV4XG4iLAorCQkJCWJlMzJfdG9fY3B1KGltYWdlLT5tYWdpY19udW1iZXIpLAorCQkJCWJmX2dldF9iZTMyKGxwZmNfZ3JwX2hkcl9maWxlX3R5cGUsIGltYWdlKSwKKwkJCQliZl9nZXRfYmUzMihscGZjX2dycF9oZHJfaWQsIGltYWdlKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlscGZjX2RlY29kZV9maXJtd2FyZV9yZXYocGhiYSwgZndyZXYsIDEpOwpAQCAtODkyNCwxMSArODk5MSwxMSBAQAogCQl3aGlsZSAob2Zmc2V0IDwgZnctPnNpemUpIHsKIAkJCXRlbXBfb2Zmc2V0ID0gb2Zmc2V0OwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkbWFidWYsICZkbWFfYnVmZmVyX2xpc3QsIGxpc3QpIHsKLQkJCQlpZiAob2Zmc2V0ICsgU0xJNF9QQUdFX1NJWkUgPiBmdy0+c2l6ZSkgewotCQkJCQl0ZW1wX29mZnNldCArPSBmdy0+c2l6ZSAtIG9mZnNldDsKKwkJCQlpZiAodGVtcF9vZmZzZXQgKyBTTEk0X1BBR0VfU0laRSA+IGZ3LT5zaXplKSB7CiAJCQkJCW1lbWNweShkbWFidWYtPnZpcnQsCiAJCQkJCSAgICAgICBmdy0+ZGF0YSArIHRlbXBfb2Zmc2V0LAotCQkJCQkgICAgICAgZnctPnNpemUgLSBvZmZzZXQpOworCQkJCQkgICAgICAgZnctPnNpemUgLSB0ZW1wX29mZnNldCk7CisJCQkJCXRlbXBfb2Zmc2V0ID0gZnctPnNpemU7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQltZW1jcHkoZG1hYnVmLT52aXJ0LCBmdy0+ZGF0YSArIHRlbXBfb2Zmc2V0LApAQCAtODk4NCw3ICs5MDUxLDYgQEAKIAl1aW50MzJfdCBjZmdfbW9kZSwgaW50cl9tb2RlOwogCWludCBtY250OwogCWludCBhZGp1c3RlZF9mY3BfZXFfY291bnQ7Ci0JaW50IGZjcF9xaWR4OwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJdWludDhfdCBmaWxlX25hbWVbMTZdOwogCkBAIC04OTk1LDExICs5MDYxLDggQEAKIAogCS8qIFBlcmZvcm0gZ2VuZXJpYyBQQ0kgZGV2aWNlIGVuYWJsaW5nIG9wZXJhdGlvbiAqLwogCWVycm9yID0gbHBmY19lbmFibGVfcGNpX2RldihwaGJhKTsKLQlpZiAoZXJyb3IpIHsKLQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkiMTQwOSBGYWlsZWQgdG8gZW5hYmxlIHBjaSBkZXZpY2UuXG4iKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfcGhiYTsKLQl9CiAKIAkvKiBTZXQgdXAgU0xJIEFQSSBmdW5jdGlvbiBqdW1wIHRhYmxlIGZvciBQQ0ktZGV2aWNlIGdyb3VwLTEgSEJBcyAqLwogCWVycm9yID0gbHBmY19hcGlfdGFibGVfc2V0dXAocGhiYSwgTFBGQ19QQ0lfREVWX09DKTsKQEAgLTkwNTQsNiArOTExNyw5IEBACiAJCWdvdG8gb3V0X2ZyZWVfaW9jYl9saXN0OwogCX0KIAorCS8qIEdldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIE1vZGVsIE5hbWUgYW5kIERlc2NyaXB0aW9uICovCisJbHBmY19nZXRfaGJhX21vZGVsX2Rlc2MocGhiYSwgcGhiYS0+TW9kZWxOYW1lLCBwaGJhLT5Nb2RlbERlc2MpOworCiAJLyogQ3JlYXRlIFNDU0kgaG9zdCB0byB0aGUgcGh5c2ljYWwgcG9ydCAqLwogCWVycm9yID0gbHBmY19jcmVhdGVfc2hvc3QocGhiYSk7CiAJaWYgKGVycm9yKSB7CkBAIC05MDkzLDE2ICs5MTU5LDYgQEAKIAkJCWFkanVzdGVkX2ZjcF9lcV9jb3VudCA9IHBoYmEtPnNsaTRfaGJhLm1zaXhfdmVjX25yIC0gMTsKIAkJZWxzZQogCQkJYWRqdXN0ZWRfZmNwX2VxX2NvdW50ID0gcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudDsKLQkJLyogRnJlZSB1bnVzZWQgRVFzICovCi0JCWZvciAoZmNwX3FpZHggPSBhZGp1c3RlZF9mY3BfZXFfY291bnQ7Ci0JCSAgICAgZmNwX3FpZHggPCBwaGJhLT5jZmdfZmNwX2VxX2NvdW50OwotCQkgICAgIGZjcF9xaWR4KyspIHsKLQkJCWxwZmNfc2xpNF9xdWV1ZV9mcmVlKHBoYmEtPnNsaTRfaGJhLmZwX2VxW2ZjcF9xaWR4XSk7Ci0JCQkvKiBkbyBub3QgZGVsZXRlIHRoZSBmaXJzdCBmY3BfY3EgKi8KLQkJCWlmIChmY3BfcWlkeCkKLQkJCQlscGZjX3NsaTRfcXVldWVfZnJlZSgKLQkJCQkJcGhiYS0+c2xpNF9oYmEuZmNwX2NxW2ZjcF9xaWR4XSk7Ci0JCX0KIAkJcGhiYS0+Y2ZnX2ZjcF9lcV9jb3VudCA9IGFkanVzdGVkX2ZjcF9lcV9jb3VudDsKIAkJLyogU2V0IHVwIFNMSS00IEhCQSAqLwogCQlpZiAobHBmY19zbGk0X2hiYV9zZXR1cChwaGJhKSkgewpAQCAtOTI4NSw2ICs5MzQxLDcgQEAKIAogCS8qIERpc2FibGUgaW50ZXJydXB0IGZyb20gZGV2aWNlICovCiAJbHBmY19zbGk0X2Rpc2FibGVfaW50cihwaGJhKTsKKwlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIAogCS8qIFNhdmUgZGV2aWNlIHN0YXRlIHRvIFBDSSBjb25maWcgc3BhY2UgKi8KIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKQEAgLTk0MTQsNiArOTQ3MSw3IEBACiAKIAkvKiBEaXNhYmxlIGludGVycnVwdCBhbmQgcGNpIGRldmljZSAqLwogCWxwZmNfc2xpNF9kaXNhYmxlX2ludHIocGhiYSk7CisJbHBmY19zbGk0X3F1ZXVlX2Rlc3Ryb3kocGhiYSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBoYmEtPnBjaWRldik7CiAKIAkvKiBGbHVzaCBhbGwgZHJpdmVyJ3Mgb3V0c3RhbmRpbmcgU0NTSSBJL09zIGFzIHdlIGFyZSB0byByZXNldCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbG9nbXNnLmgKaW5kZXggZTNiNzkwZS4uYmFmNTNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oCkBAIC0zNiw2ICszNiw3IEBACiAjZGVmaW5lIExPR19TRUNVUklUWQkweDAwMDA4MDAwCS8qIFNlY3VyaXR5IGV2ZW50cyAqLwogI2RlZmluZSBMT0dfRVZFTlQJMHgwMDAxMDAwMAkvKiBDVCxURU1QLERVTVAsIGxvZ2dpbmcgKi8KICNkZWZpbmUgTE9HX0ZJUAkJMHgwMDAyMDAwMAkvKiBGSVAgZXZlbnRzICovCisjZGVmaW5lIExPR19GQ1BfVU5ERVIJMHgwMDA0MDAwMAkvKiBGQ1AgdW5kZXJydW5zIGVycm9ycyAqLwogI2RlZmluZSBMT0dfQUxMX01TRwkweGZmZmZmZmZmCS8qIExPRyBhbGwgbWVzc2FnZXMgKi8KIAogI2RlZmluZSBscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBsZXZlbCwgbWFzaywgZm10LCBhcmcuLi4pIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKaW5kZXggODM0NTBjYy4uMmViYzdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKQEAgLTE1OTgsOSArMTU5OCwxMiBAQAogICogICAgVGltZW91dCB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gbWFpbGJveCBjb21tYW5kCiAgKiovCiBpbnQKLWxwZmNfbWJveF90bW9fdmFsKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IGNtZCkKK2xwZmNfbWJveF90bW9fdmFsKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICptYm94cSkKIHsKLQlzd2l0Y2ggKGNtZCkgeworCU1BSUxCT1hfdCAqbWJveCA9ICZtYm94cS0+dS5tYjsKKwl1aW50OF90IHN1YnN5cywgb3Bjb2RlOworCisJc3dpdGNoIChtYm94LT5tYnhDb21tYW5kKSB7CiAJY2FzZSBNQlhfV1JJVEVfTlY6CS8qIDB4MDMgKi8KIAljYXNlIE1CWF9VUERBVEVfQ0ZHOgkvKiAweDFCICovCiAJY2FzZSBNQlhfRE9XTl9MT0FEOgkvKiAweDFDICovCkBAIC0xNjEwLDYgKzE2MTMsMjggQEAKIAljYXNlIE1CWF9MT0FEX0VYUF9ST006CS8qIDB4OUMgKi8KIAkJcmV0dXJuIExQRkNfTUJPWF9UTU9fRkxBU0hfQ01EOwogCWNhc2UgTUJYX1NMSTRfQ09ORklHOgkvKiAweDliICovCisJCXN1YnN5cyA9IGxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpOworCQlvcGNvZGUgPSBscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKTsKKwkJaWYgKHN1YnN5cyA9PSBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTikgeworCQkJc3dpdGNoIChvcGNvZGUpIHsKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9SRUFEX09CSkVDVDoKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9XUklURV9PQkpFQ1Q6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfUkVBRF9PQkpFQ1RfTElTVDoKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9ERUxFVEVfT0JKRUNUOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9GVU5DVElPTl9DT05GSUc6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfR0VUX1BST0ZJTEVfTElTVDoKKwkJCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9TRVRfQUNUX1BST0ZJTEU6CisJCQljYXNlIExQRkNfTUJPWF9PUENPREVfU0VUX1BST0ZJTEVfQ09ORklHOgorCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0dFVF9GQUNUT1JZX1BST0ZJTEVfQ09ORklHOgorCQkJCXJldHVybiBMUEZDX01CT1hfU0xJNF9DT05GSUdfRVhURU5ERURfVE1POworCQkJfQorCQl9CisJCWlmIChzdWJzeXMgPT0gTFBGQ19NQk9YX1NVQlNZU1RFTV9GQ09FKSB7CisJCQlzd2l0Y2ggKG9wY29kZSkgeworCQkJY2FzZSBMUEZDX01CT1hfT1BDT0RFX0ZDT0VfU0VUX0ZDTElOS19TRVRUSU5HUzoKKwkJCQlyZXR1cm4gTFBGQ19NQk9YX1NMSTRfQ09ORklHX0VYVEVOREVEX1RNTzsKKwkJCX0KKwkJfQogCQlyZXR1cm4gTFBGQ19NQk9YX1NMSTRfQ09ORklHX1RNTzsKIAl9CiAJcmV0dXJuIExQRkNfTUJPWF9UTU87CkBAIC0xODU5LDcgKzE4ODQsNyBAQAogCX0KIAogCS8qIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHBhcnRpY3VsYXIgT3Bjb2RlLiAqLwotCW9wY29kZSA9IGxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveCk7CisJb3Bjb2RlID0gbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94KTsKIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgTFBGQ19NQk9YX09QQ09ERV9BTExPQ19SU1JDX0VYVEVOVDoKIAkJaWYgKGVtYiA9PSBMUEZDX1NMSTRfTUJYX0VNQkVEKQpAQCAtMTg4NiwyMyArMTkxMSw1NiBAQAogfQogCiAvKioKLSAqIGxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQgLSBHZXQgdGhlIG9wY29kZSBmcm9tIGEgc2xpNCBtYWlsYm94IGNvbW1hbmQKKyAqIGxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQgLSBHZXQgc3Vic3lzdGVtIGZyb20gYSBzbGlfY29uZmlnIG1ib3ggY21kCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KLSAqIEBtYm94OiBwb2ludGVyIHRvIGxwZmMgbWJveCBjb21tYW5kLgorICogQG1ib3g6IHBvaW50ZXIgdG8gbHBmYyBtYm94IGNvbW1hbmQgcXVldWUgZW50cnkuCiAgKgotICogVGhpcyByb3V0aW5lIGdldHMgdGhlIG9wY29kZSBmcm9tIGEgU0xJNCBzcGVjaWZpYyBtYWlsYm94IGNvbW1hbmQgZm9yCi0gKiBzZW5kaW5nIElPQ1RMIGNvbW1hbmQuIElmIHRoZSBtYWlsYm94IGNvbW1hbmQgaXMgbm90IE1CWF9TTEk0X0NPTkZJRwotICogKDB4OUIpIG9yIGlmIHRoZSBJT0NUTCBzdWItaGVhZGVyIGlzIG5vdCBwcmVzZW50LCBvcGNvZGUgMHgwIHNoYWxsIGJlCi0gKiByZXR1cm5lZC4KKyAqIFRoaXMgcm91dGluZSBnZXRzIHRoZSBzdWJzeXN0ZW0gZnJvbSBhIFNMSTQgc3BlY2lmaWMgU0xJX0NPTkZJRyBtYWlsYm94CisgKiBjb21tYW5kLiBJZiB0aGUgbWFpbGJveCBjb21tYW5kIGlzIG5vdCBNQlhfU0xJNF9DT05GSUcgKDB4OUIpIG9yIGlmIHRoZQorICogc3ViLWhlYWRlciBpcyBub3QgcHJlc2VudCwgc3Vic3lzdGVtIExQRkNfTUJPWF9TVUJTWVNURU1fTkEgKDB4MCkgc2hhbGwKKyAqIGJlIHJldHVybmVkLgogICoqLwogdWludDhfdAotbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjTWJveHEgKm1ib3gpCitscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICptYm94KQogewogCXN0cnVjdCBscGZjX21ieF9zbGk0X2NvbmZpZyAqc2xpNF9jZmc7CiAJdW5pb24gbHBmY19zbGk0X2NmZ19zaGRyICpjZmdfc2hkcjsKIAogCWlmIChtYm94LT51Lm1iLm1ieENvbW1hbmQgIT0gTUJYX1NMSTRfQ09ORklHKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIExQRkNfTUJPWF9TVUJTWVNURU1fTkE7CisJc2xpNF9jZmcgPSAmbWJveC0+dS5tcWUudW4uc2xpNF9jb25maWc7CisKKwkvKiBGb3IgZW1iZWRkZWQgbWJveCBjb21tYW5kLCBnZXQgb3Bjb2RlIGZyb20gZW1iZWRkZWQgc3ViLWhlYWRlciovCisJaWYgKGJmX2dldChscGZjX21ib3hfaGRyX2VtYiwgJnNsaTRfY2ZnLT5oZWFkZXIuY2ZnX21oZHIpKSB7CisJCWNmZ19zaGRyID0gJm1ib3gtPnUubXFlLnVuLnNsaTRfY29uZmlnLmhlYWRlci5jZmdfc2hkcjsKKwkJcmV0dXJuIGJmX2dldChscGZjX21ib3hfaGRyX3N1YnN5c3RlbSwgJmNmZ19zaGRyLT5yZXF1ZXN0KTsKKwl9CisKKwkvKiBGb3Igbm9uLWVtYmVkZGVkIG1ib3ggY29tbWFuZCwgZ2V0IG9wY29kZSBmcm9tIGZpcnN0IGRtYSBwYWdlICovCisJaWYgKHVubGlrZWx5KCFtYm94LT5zZ2VfYXJyYXkpKQorCQlyZXR1cm4gTFBGQ19NQk9YX1NVQlNZU1RFTV9OQTsKKwljZmdfc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKiltYm94LT5zZ2VfYXJyYXktPmFkZHJbMF07CisJcmV0dXJuIGJmX2dldChscGZjX21ib3hfaGRyX3N1YnN5c3RlbSwgJmNmZ19zaGRyLT5yZXF1ZXN0KTsKK30KKworLyoqCisgKiBscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0IC0gR2V0IG9wY29kZSBmcm9tIGEgc2xpX2NvbmZpZyBtYm94IGNtZAorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAbWJveDogcG9pbnRlciB0byBscGZjIG1ib3ggY29tbWFuZCBxdWV1ZSBlbnRyeS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyB0aGUgb3Bjb2RlIGZyb20gYSBTTEk0IHNwZWNpZmljIFNMSV9DT05GSUcgbWFpbGJveAorICogY29tbWFuZC4gSWYgdGhlIG1haWxib3ggY29tbWFuZCBpcyBub3QgTUJYX1NMSTRfQ09ORklHICgweDlCKSBvciBpZgorICogdGhlIHN1Yi1oZWFkZXIgaXMgbm90IHByZXNlbnQsIG9wY29kZSBMUEZDX01CT1hfT1BDT0RFX05BICgweDApIGJlCisgKiByZXR1cm5lZC4KKyAqKi8KK3VpbnQ4X3QKK2xwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKm1ib3gpCit7CisJc3RydWN0IGxwZmNfbWJ4X3NsaTRfY29uZmlnICpzbGk0X2NmZzsKKwl1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKmNmZ19zaGRyOworCisJaWYgKG1ib3gtPnUubWIubWJ4Q29tbWFuZCAhPSBNQlhfU0xJNF9DT05GSUcpCisJCXJldHVybiBMUEZDX01CT1hfT1BDT0RFX05BOwogCXNsaTRfY2ZnID0gJm1ib3gtPnUubXFlLnVuLnNsaTRfY29uZmlnOwogCiAJLyogRm9yIGVtYmVkZGVkIG1ib3ggY29tbWFuZCwgZ2V0IG9wY29kZSBmcm9tIGVtYmVkZGVkIHN1Yi1oZWFkZXIqLwpAQCAtMTkxMyw3ICsxOTcxLDcgQEAKIAogCS8qIEZvciBub24tZW1iZWRkZWQgbWJveCBjb21tYW5kLCBnZXQgb3Bjb2RlIGZyb20gZmlyc3QgZG1hIHBhZ2UgKi8KIAlpZiAodW5saWtlbHkoIW1ib3gtPnNnZV9hcnJheSkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTFBGQ19NQk9YX09QQ09ERV9OQTsKIAljZmdfc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKiltYm94LT5zZ2VfYXJyYXktPmFkZHJbMF07CiAJcmV0dXJuIGJmX2dldChscGZjX21ib3hfaGRyX29wY29kZSwgJmNmZ19zaGRyLT5yZXF1ZXN0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggZWFkZDI0MS4uMmUxZTU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTU4LDYgKzU5LDEzIEBACiAJIlNDU0lfUFJPVF9SRUFEX1BBU1MiLAogCSJTQ1NJX1BST1RfV1JJVEVfUEFTUyIsCiB9OworCitzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgeworCV9fYmUxNiBndWFyZF90YWc7ICAgICAgIC8qIENoZWNrc3VtICovCisJX19iZTE2IGFwcF90YWc7ICAgICAgICAgLyogT3BhcXVlIHN0b3JhZ2UgKi8KKwlfX2JlMzIgcmVmX3RhZzsgICAgICAgICAvKiBUYXJnZXQgTEJBIG9yIGluZGlyZWN0IExCQSAqLworfTsKKwogc3RhdGljIHZvaWQKIGxwZmNfcmVsZWFzZV9zY3NpX2J1Zl9zNChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBscGZjX3Njc2lfYnVmICpwc2IpOwogc3RhdGljIHZvaWQKQEAgLTEyNjMsNiArMTI3MSwxNzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZAorbHBmY19jbWRfYmxrc2l6ZShzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK3sKKwlyZXR1cm4gc2MtPmRldmljZS0+c2VjdG9yX3NpemU7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCisvKgorICogR2l2ZW4gYSBzY3NpIGNtbmQsIGRldGVybWluZSB0aGUgQmxvY2tHdWFyZCB0YWdzIHRvIGJlIHVzZWQgd2l0aCBpdAorICogQHNjOiBUaGUgU0NTSSBjb21tYW5kIHRvIGV4YW1pbmUKKyAqIEByZWZ0YWc6IChvdXQpIEJsb2NrR3VhcmQgcmVmZXJlbmNlIHRhZyBmb3IgdHJhbnNtaXR0ZWQgZGF0YQorICogQGFwcHRhZzogKG91dCkgQmxvY2tHdWFyZCBhcHBsaWNhdGlvbiB0YWcgZm9yIHRyYW5zbWl0dGVkIGRhdGEKKyAqIEBuZXdfZ3VhcmQgKGluKSBWYWx1ZSB0byByZXBsYWNlIENSQyB3aXRoIGlmIG5lZWRlZAorICoKKyAqIFJldHVybnMgKDEpIGlmIGVycm9yIGluamVjdGlvbiB3YXMgcGVyZm9ybWVkLCAoMCkgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK2xwZmNfYmdfZXJyX2luamVjdChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHN0cnVjdCBzY3NpX2NtbmQgKnNjLAorCQl1aW50MzJfdCAqcmVmdGFnLCB1aW50MTZfdCAqYXBwdGFnLCB1aW50MzJfdCBuZXdfZ3VhcmQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3BlOyAvKiBzL2cgcHJvdCBlbnRyeSAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dkZTsgLyogcy9nIGRhdGEgZW50cnkgKi8KKwlzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgKnNyYzsKKwl1aW50MzJfdCBvcCA9IHNjc2lfZ2V0X3Byb3Rfb3Aoc2MpOworCXVpbnQzMl90IGJsa3NpemU7CisJdWludDMyX3QgbnVtYmxrczsKKwlzZWN0b3JfdCBsYmE7CisJaW50IHJjID0gMDsKKworCWlmIChvcCA9PSBTQ1NJX1BST1RfTk9STUFMKQorCQlyZXR1cm4gMDsKKworCWxiYSA9IHNjc2lfZ2V0X2xiYShzYyk7CisJaWYgKHBoYmEtPmxwZmNfaW5qZXJyX2xiYSAhPSBMUEZDX0lOSkVSUl9MQkFfT0ZGKSB7CisJCWJsa3NpemUgPSBscGZjX2NtZF9ibGtzaXplKHNjKTsKKwkJbnVtYmxrcyA9IChzY3NpX2J1ZmZsZW4oc2MpICsgYmxrc2l6ZSAtIDEpIC8gYmxrc2l6ZTsKKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgTEJBIGlmIG9uZSBpcyBzcGVjaWZpZWQgKi8KKwkJaWYgKChwaGJhLT5scGZjX2luamVycl9sYmEgPCBsYmEpIHx8CisJCQkocGhiYS0+bHBmY19pbmplcnJfbGJhID49IChsYmEgKyBudW1ibGtzKSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzZ3BlID0gc2NzaV9wcm90X3NnbGlzdChzYyk7CisJc2dkZSA9IHNjc2lfc2dsaXN0KHNjKTsKKworCS8qIFNob3VsZCB3ZSBjaGFuZ2UgdGhlIFJlZmVyZW5jZSBUYWcgKi8KKwlpZiAocmVmdGFnKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBTQ1NJX1BST1RfV1JJVEVfU1RSSVAsIHRoZSBwcm90ZWN0aW9uIGRhdGEgaXMKKwkJICogYmVpbmcgc3RyaXBwZWQgZnJvbSB0aGUgd2lyZSwgdGh1cyBpdCBkb2Vzbid0IG1hdHRlci4KKwkJICovCisJCWlmICgob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpIHx8CisJCQkob3AgPT0gU0NTSV9QUk9UX1dSSVRFX0lOU0VSVCkpIHsKKwkJCWlmIChwaGJhLT5scGZjX2luamVycl93cmVmX2NudCkgeworCisJCQkJLyogREVBREJFRUYgd2lsbCBiZSB0aGUgcmVmdGFnIG9uIHRoZSB3aXJlICovCisJCQkJKnJlZnRhZyA9IDB4REVBREJFRUY7CisJCQkJcGhiYS0+bHBmY19pbmplcnJfd3JlZl9jbnQtLTsKKwkJCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSBMUEZDX0lOSkVSUl9MQkFfT0ZGOworCQkJCXJjID0gMTsKKworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA4MSBCTEtHUkQ6IEluamVjdGluZyByZWZ0YWcgZXJyb3I6ICIKKwkJCQkJIndyaXRlIGxiYSB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylsYmEpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBoYmEtPmxwZmNfaW5qZXJyX3JyZWZfY250KSB7CisJCQkJKnJlZnRhZyA9IDB4REVBREJFRUY7CisJCQkJcGhiYS0+bHBmY19pbmplcnJfcnJlZl9jbnQtLTsKKwkJCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSBMUEZDX0lOSkVSUl9MQkFfT0ZGOworCQkJCXJjID0gMTsKKworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA3NiBCTEtHUkQ6IEluamVjdGluZyByZWZ0YWcgZXJyb3I6ICIKKwkJCQkJInJlYWQgbGJhIHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWxiYSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTaG91bGQgd2UgY2hhbmdlIHRoZSBBcHBsaWNhdGlvbiBUYWcgKi8KKwlpZiAoYXBwdGFnKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBTQ1NJX1BST1RfV1JJVEVfU1RSSVAsIHRoZSBwcm90ZWN0aW9uIGRhdGEgaXMKKwkJICogYmVpbmcgc3RyaXBwZWQgZnJvbSB0aGUgd2lyZSwgdGh1cyBpdCBkb2Vzbid0IG1hdHRlci4KKwkJICovCisJCWlmICgob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpIHx8CisJCQkob3AgPT0gU0NTSV9QUk9UX1dSSVRFX0lOU0VSVCkpIHsKKwkJCWlmIChwaGJhLT5scGZjX2luamVycl93YXBwX2NudCkgeworCisJCQkJLyogREVBRCB3aWxsIGJlIHRoZSBhcHB0YWcgb24gdGhlIHdpcmUgKi8KKwkJCQkqYXBwdGFnID0gMHhERUFEOworCQkJCXBoYmEtPmxwZmNfaW5qZXJyX3dhcHBfY250LS07CisJCQkJcGhiYS0+bHBmY19pbmplcnJfbGJhID0gTFBGQ19JTkpFUlJfTEJBX09GRjsKKwkJCQlyYyA9IDE7CisKKwkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKKwkJCQkJIjkwNzcgQkxLR1JEOiBJbmplY3RpbmcgYXBwdGFnIGVycm9yOiAiCisJCQkJCSJ3cml0ZSBsYmEgeCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpbGJhKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwaGJhLT5scGZjX2luamVycl9yYXBwX2NudCkgeworCQkJCSphcHB0YWcgPSAweERFQUQ7CisJCQkJcGhiYS0+bHBmY19pbmplcnJfcmFwcF9jbnQtLTsKKwkJCQlwaGJhLT5scGZjX2luamVycl9sYmEgPSBMUEZDX0lOSkVSUl9MQkFfT0ZGOworCQkJCXJjID0gMTsKKworCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCQkiOTA3OCBCTEtHUkQ6IEluamVjdGluZyBhcHB0YWcgZXJyb3I6ICIKKwkJCQkJInJlYWQgbGJhIHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWxiYSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTaG91bGQgd2UgY2hhbmdlIHRoZSBHdWFyZCBUYWcgKi8KKworCS8qCisJICogSWYgd2UgYXJlIFNDU0lfUFJPVF9XUklURV9JTlNFUlQsIHRoZSBwcm90ZWN0aW9uIGRhdGEgaXMKKwkgKiBiZWluZyBvbiB0aGUgd2lyZSBpcyBiZWluZyBmdWxseSBnZW5lcmF0ZWQgb24gdGhlIEhCQS4KKwkgKiBUaGUgaG9zdCBjYW5ub3QgY2hhbmdlIGl0IG9yIGZvcmNlIGFuIGVycm9yLgorCSAqLworCWlmICgoKG9wID09IFNDU0lfUFJPVF9XUklURV9TVFJJUCkgfHwKKwkJKG9wID09IFNDU0lfUFJPVF9XUklURV9QQVNTKSkgJiYKKwkJcGhiYS0+bHBmY19pbmplcnJfd2dyZF9jbnQpIHsKKwkJaWYgKHNncGUpIHsKKwkJCXNyYyA9IChzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgKilzZ192aXJ0KHNncGUpOworCQkJLyoKKwkJCSAqIEp1c3QgaW5qZWN0IGFuIGVycm9yIGluIHRoZSBmaXJzdAorCQkJICogcHJvdCBibG9jay4KKwkJCSAqLworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCisJCQkJIjkwNzkgQkxLR1JEOiBJbmplY3RpbmcgZ3VhcmQgZXJyb3I6ICIKKwkJCQkid3JpdGUgbGJhIHglbHggb2xkR3VhcmQgeCV4IHJlZlRhZyB4JXhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGJhLCBzcmMtPmd1YXJkX3RhZywKKwkJCQlzcmMtPnJlZl90YWcpOworCisJCQlzcmMtPmd1YXJkX3RhZyA9ICh1aW50MTZfdCluZXdfZ3VhcmQ7CisJCQlwaGJhLT5scGZjX2luamVycl93Z3JkX2NudC0tOworCQkJcGhiYS0+bHBmY19pbmplcnJfbGJhID0gTFBGQ19JTkpFUlJfTEJBX09GRjsKKwkJCXJjID0gMTsKKworCQl9IGVsc2UgeworCQkJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2MpOworCQkJLyoKKwkJCSAqIEp1bXAgcGFzdCB0aGUgZmlyc3QgZGF0YSBibG9jaworCQkJICogYW5kIGluamVjdCBhbiBlcnJvciBpbiB0aGUKKwkJCSAqIHByb3QgZGF0YS4gVGhlIHByb3QgZGF0YSBpcyBhbHJlYWR5CisJCQkgKiBlbWJlZGRlZCBhZnRlciB0aGUgcmVndWxhciBkYXRhLgorCQkJICovCisJCQlzcmMgPSAoc3RydWN0IHNjc2lfZGlmX3R1cGxlICopCisJCQkJCShzZ192aXJ0KHNnZGUpICsgYmxrc2l6ZSk7CisKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAorCQkJCSI5MDgwIEJMS0dSRDogSW5qZWN0aW5nIGd1YXJkIGVycm9yOiAiCisJCQkJIndyaXRlIGxiYSB4JWx4IG9sZEd1YXJkIHgleCByZWZUYWcgeCV4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWxiYSwgc3JjLT5ndWFyZF90YWcsCisJCQkJc3JjLT5yZWZfdGFnKTsKKworCQkJc3JjLT5ndWFyZF90YWcgPSAodWludDE2X3QpbmV3X2d1YXJkOworCQkJcGhiYS0+bHBmY19pbmplcnJfd2dyZF9jbnQtLTsKKwkJCXBoYmEtPmxwZmNfaW5qZXJyX2xiYSA9IExQRkNfSU5KRVJSX0xCQV9PRkY7CisJCQlyYyA9IDE7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKIC8qCiAgKiBHaXZlbiBhIHNjc2kgY21uZCwgZGV0ZXJtaW5lIHRoZSBCbG9ja0d1YXJkIG9wY29kZXMgdG8gYmUgdXNlZCB3aXRoIGl0CiAgKiBAc2M6IFRoZSBTQ1NJIGNvbW1hbmQgdG8gZXhhbWluZQpAQCAtMTM0MSwxOCArMTUxNyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IHNjc2lfZGlmX3R1cGxlIHsKLQlfX2JlMTYgZ3VhcmRfdGFnOyAgICAgICAvKiBDaGVja3N1bSAqLwotCV9fYmUxNiBhcHBfdGFnOyAgICAgICAgIC8qIE9wYXF1ZSBzdG9yYWdlICovCi0JX19iZTMyIHJlZl90YWc7ICAgICAgICAgLyogVGFyZ2V0IExCQSBvciBpbmRpcmVjdCBMQkEgKi8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQKLWxwZmNfY21kX2Jsa3NpemUoc3RydWN0IHNjc2lfY21uZCAqc2MpCi17Ci0JcmV0dXJuIHNjLT5kZXZpY2UtPnNlY3Rvcl9zaXplOwotfQotCiAvKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGJ1ZmZlciBsaXN0IGZvciBwcm90ZWN0aW9uIGdyb3VwcyBvZgogICogdHlwZSBMUEZDX1BHX1RZUEVfTk9fRElGCkBAIC0xNDAxLDYgKzE1NjUsMTEgQEAKIAlibGtzaXplID0gbHBmY19jbWRfYmxrc2l6ZShzYyk7CiAJcmVmdGFnID0gc2NzaV9nZXRfbGJhKHNjKSAmIDB4ZmZmZmZmZmY7CiAKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCisJLyogcmVmdGFnIGlzIHRoZSBvbmx5IGVycm9yIHdlIGNhbiBpbmplY3QgaGVyZSAqLworCWxwZmNfYmdfZXJyX2luamVjdChwaGJhLCBzYywgJnJlZnRhZywgMCwgMCk7CisjZW5kaWYKKwogCS8qIHNldHVwIFBERTUgd2l0aCB3aGF0IHdlIGhhdmUgKi8KIAlwZGU1ID0gKHN0cnVjdCBscGZjX3BkZTUgKikgYnBsOwogCW1lbXNldChwZGU1LCAwLCBzaXplb2Yoc3RydWN0IGxwZmNfcGRlNSkpOwpAQCAtMTUzMiw2ICsxNzAxLDExIEBACiAJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2MpOwogCXJlZnRhZyA9IHNjc2lfZ2V0X2xiYShzYykgJiAweGZmZmZmZmZmOwogCisjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUworCS8qIHJlZnRhZyAvIGd1YXJkIHRhZyBhcmUgdGhlIG9ubHkgZXJyb3JzIHdlIGNhbiBpbmplY3QgaGVyZSAqLworCWxwZmNfYmdfZXJyX2luamVjdChwaGJhLCBzYywgJnJlZnRhZywgMCwgMHhERUFEKTsKKyNlbmRpZgorCiAJc3BsaXRfb2Zmc2V0ID0gMDsKIAlkbyB7CiAJCS8qIHNldHVwIFBERTUgd2l0aCB3aGF0IHdlIGhhdmUgKi8KQEAgLTE2NzEsNyArMTg0NSw2IEBACiAJCX0KIAogCX0gd2hpbGUgKCFhbGxkb25lKTsKLQogb3V0OgogCiAJcmV0dXJuIG51bV9iZGU7CkBAIC0yMDc1LDYgKzIyNDgsNyBAQAogCQkJZWxzZQogCQkJCWJmX3NldChscGZjX3NsaTRfc2dlX2xhc3QsIHNnbCwgMCk7CiAJCQliZl9zZXQobHBmY19zbGk0X3NnZV9vZmZzZXQsIHNnbCwgZG1hX29mZnNldCk7CisJCQliZl9zZXQobHBmY19zbGk0X3NnZV90eXBlLCBzZ2wsIExQRkNfU0dFX1RZUEVfREFUQSk7CiAJCQlzZ2wtPndvcmQyID0gY3B1X3RvX2xlMzIoc2dsLT53b3JkMik7CiAJCQlzZ2wtPnNnZV9sZW4gPSBjcHVfdG9fbGUzMihkbWFfbGVuKTsKIAkJCWRtYV9vZmZzZXQgKz0gZG1hX2xlbjsKQEAgLTIzMjUsOCArMjQ5OSw5IEBACiAJfQogCWxwID0gKHVpbnQzMl90ICopY21uZC0+c2Vuc2VfYnVmZmVyOwogCi0JaWYgKCFzY3NpX3N0YXR1cyAmJiAocmVzcF9pbmZvICYgUkVTSURfVU5ERVIpKQotCQlsb2dpdCA9IExPR19GQ1A7CisJaWYgKCFzY3NpX3N0YXR1cyAmJiAocmVzcF9pbmZvICYgUkVTSURfVU5ERVIpICYmCisJCXZwb3J0LT5jZmdfbG9nX3ZlcmJvc2UgJiBMT0dfRkNQX1VOREVSKQorCQlsb2dpdCA9IExPR19GQ1BfVU5ERVI7CiAKIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIGxvZ2l0LAogCQkJICI5MDI0IEZDUCBjb21tYW5kIHgleCBmYWlsZWQ6IHgleCBTTlMgeCV4IHgleCAiCkBAIC0yMzQyLDcgKzI1MTcsNyBAQAogCWlmIChyZXNwX2luZm8gJiBSRVNJRF9VTkRFUikgewogCQlzY3NpX3NldF9yZXNpZChjbW5kLCBiZTMyX3RvX2NwdShmY3Byc3AtPnJzcFJlc0lkKSk7CiAKLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRkNQLAorCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19GQ1BfVU5ERVIsCiAJCQkJICI5MDI1IEZDUCBSZWFkIFVuZGVycnVuLCBleHBlY3RlZCAlZCwgIgogCQkJCSAicmVzaWR1YWwgJWQgRGF0YTogeCV4IHgleCB4JXhcbiIsCiAJCQkJIGJlMzJfdG9fY3B1KGZjcGNtZC0+ZmNwRGwpLApAQCAtMjQ0OSw2ICsyNjI0LDcgQEAKIAlzdHJ1Y3QgbHBmY19mYXN0X3BhdGhfZXZlbnQgKmZhc3RfcGF0aF9ldnQ7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAJdWludDMyX3QgcXVldWVfZGVwdGgsIHNjc2lfaWQ7CisJdWludDMyX3QgbG9naXQgPSBMT0dfRkNQOwogCiAJLyogU2FuaXR5IGNoZWNrIG9uIHJldHVybiBvZiBvdXRzdGFuZGluZyBjb21tYW5kICovCiAJaWYgKCEobHBmY19jbWQtPnBDbWQpKQpAQCAtMjQ3MCwxNiArMjY0NiwyMiBAQAogCQkJbHBmY19jbWQtPnN0YXR1cyA9IElPU1RBVF9EUklWRVJfUkVKRUNUOwogCQllbHNlIGlmIChscGZjX2NtZC0+c3RhdHVzID49IElPU1RBVF9DTlQpCiAJCQlscGZjX2NtZC0+c3RhdHVzID0gSU9TVEFUX0RFRkFVTFQ7Ci0KLQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQLAotCQkJCSAiOTAzMCBGQ1AgY21kIHgleCBmYWlsZWQgPCVkLyVkPiAiCi0JCQkJICJzdGF0dXM6IHgleCByZXN1bHQ6IHgleCBEYXRhOiB4JXggeCV4XG4iLAotCQkJCSBjbWQtPmNtbmRbMF0sCi0JCQkJIGNtZC0+ZGV2aWNlID8gY21kLT5kZXZpY2UtPmlkIDogMHhmZmZmLAotCQkJCSBjbWQtPmRldmljZSA/IGNtZC0+ZGV2aWNlLT5sdW4gOiAweGZmZmYsCi0JCQkJIGxwZmNfY21kLT5zdGF0dXMsIGxwZmNfY21kLT5yZXN1bHQsCi0JCQkJIHBJb2NiT3V0LT5pb2NiLnVscENvbnRleHQsCi0JCQkJIGxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYi51bHBJb1RhZyk7CisJCWlmIChscGZjX2NtZC0+c3RhdHVzID09IElPU1RBVF9GQ1BfUlNQX0VSUk9SCisJCQkmJiAhbHBmY19jbWQtPmZjcF9yc3AtPnJzcFN0YXR1czMKKwkJCSYmIChscGZjX2NtZC0+ZmNwX3JzcC0+cnNwU3RhdHVzMiAmIFJFU0lEX1VOREVSKQorCQkJJiYgIShwaGJhLT5jZmdfbG9nX3ZlcmJvc2UgJiBMT0dfRkNQX1VOREVSKSkKKwkJCWxvZ2l0ID0gMDsKKwkJZWxzZQorCQkJbG9naXQgPSBMT0dfRkNQIHwgTE9HX0ZDUF9VTkRFUjsKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9XQVJOSU5HLCBsb2dpdCwKKwkJCSAiOTAzMCBGQ1AgY21kIHgleCBmYWlsZWQgPCVkLyVkPiAiCisJCQkgInN0YXR1czogeCV4IHJlc3VsdDogeCV4IERhdGE6IHgleCB4JXhcbiIsCisJCQkgY21kLT5jbW5kWzBdLAorCQkJIGNtZC0+ZGV2aWNlID8gY21kLT5kZXZpY2UtPmlkIDogMHhmZmZmLAorCQkJIGNtZC0+ZGV2aWNlID8gY21kLT5kZXZpY2UtPmx1biA6IDB4ZmZmZiwKKwkJCSBscGZjX2NtZC0+c3RhdHVzLCBscGZjX2NtZC0+cmVzdWx0LAorCQkJIHBJb2NiT3V0LT5pb2NiLnVscENvbnRleHQsCisJCQkgbHBmY19jbWQtPmN1cl9pb2NicS5pb2NiLnVscElvVGFnKTsKIAogCQlzd2l0Y2ggKGxwZmNfY21kLT5zdGF0dXMpIHsKIAkJY2FzZSBJT1NUQVRfRkNQX1JTUF9FUlJPUjoKQEAgLTMwNTYsOCArMzIzOCw5IEBACiAJfQogCW5kbHAgPSByZGF0YS0+cG5vZGU7CiAKLQlpZiAoIShwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfQkdfRU5BQkxFRCkgJiYKLQkJc2NzaV9nZXRfcHJvdF9vcChjbW5kKSAhPSBTQ1NJX1BST1RfTk9STUFMKSB7CisJaWYgKChzY3NpX2dldF9wcm90X29wKGNtbmQpICE9IFNDU0lfUFJPVF9OT1JNQUwpICYmCisJCSghKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19CR19FTkFCTEVEKSB8fAorCQkocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSkpIHsKIAogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKIAkJCQkiOTA1OCBCTEtHUkQ6IEVSUk9SOiByY3ZkIHByb3RlY3RlZCBjbWQ6JTAyeCIKQEAgLTM2OTEsOSArMzg3NCw5IEBACiAJZmNfaG9zdF9wb3N0X3ZlbmRvcl9ldmVudChzaG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQlzaXplb2Yoc2NzaV9ldmVudCksIChjaGFyICopJnNjc2lfZXZlbnQsIExQRkNfTkxfVkVORE9SX0lEKTsKIAotCXJldCA9IGZjX2Jsb2NrX3Njc2lfZWgoY21uZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzdGF0dXMgPSBmY19ibG9ja19zY3NpX2VoKGNtbmQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CiAKIAkvKgogCSAqIFNpbmNlIHRoZSBkcml2ZXIgbWFuYWdlcyBhIHNpbmdsZSBidXMgZGV2aWNlLCByZXNldCBhbGwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDhiNzk5ZjAuLjRkNDEwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtMzc5LDEwICszNzksMTAgQEAKIAlkcS0+aG9zdF9pbmRleCA9ICgoZHEtPmhvc3RfaW5kZXggKyAxKSAlIGRxLT5lbnRyeV9jb3VudCk7CiAKIAkvKiBSaW5nIFRoZSBIZWFkZXIgUmVjZWl2ZSBRdWV1ZSBEb29yYmVsbCAqLwotCWlmICghKGhxLT5ob3N0X2luZGV4ICUgTFBGQ19SUV9QT1NUX0JBVENIKSkgeworCWlmICghKGhxLT5ob3N0X2luZGV4ICUgaHEtPmVudHJ5X3JlcG9zdCkpIHsKIAkJZG9vcmJlbGwud29yZDAgPSAwOwogCQliZl9zZXQobHBmY19ycV9kb29yYmVsbF9udW1fcG9zdGVkLCAmZG9vcmJlbGwsCi0JCSAgICAgICBMUEZDX1JRX1BPU1RfQkFUQ0gpOworCQkgICAgICAgaHEtPmVudHJ5X3JlcG9zdCk7CiAJCWJmX3NldChscGZjX3JxX2Rvb3JiZWxsX2lkLCAmZG9vcmJlbGwsIGhxLT5xdWV1ZV9pZCk7CiAJCXdyaXRlbChkb29yYmVsbC53b3JkMCwgaHEtPnBoYmEtPnNsaTRfaGJhLlJRREJyZWdhZGRyKTsKIAl9CkBAIC0xODY0LDcgKzE4NjQsNyBAQAogewogCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCiAJCXJldHVybiBscGZjX3NsaV9oYnFidWZfZmlsbF9oYnFzKHBoYmEsIHFubywKLQkJCQkJIGxwZmNfaGJxX2RlZnNbcW5vXS0+ZW50cnlfY291bnQpOworCQkJCQlscGZjX2hicV9kZWZzW3Fub10tPmVudHJ5X2NvdW50KTsKIAllbHNlCiAJCXJldHVybiBscGZjX3NsaV9oYnFidWZfZmlsbF9oYnFzKHBoYmEsIHFubywKIAkJCQkJIGxwZmNfaGJxX2RlZnNbcW5vXS0+aW5pdF9jb3VudCk7CkBAIC0yMjAwLDEwICsyMjAwLDEzIEBACiAJCQkvKiBVbmtub3duIG1haWxib3ggY29tbWFuZCBjb21wbCAqLwogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8IExPR19TTEksCiAJCQkJCSIoJWQpOjAzMjMgVW5rbm93biBNYWlsYm94IGNvbW1hbmQgIgotCQkJCQkieCV4ICh4JXgpIENtcGxcbiIsCisJCQkJCSJ4JXggKHgleC94JXgpIENtcGxcbiIsCiAJCQkJCXBtYi0+dnBvcnQgPyBwbWItPnZwb3J0LT52cGkgOiAwLAogCQkJCQlwbWJveC0+bWJ4Q29tbWFuZCwKLQkJCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBwbWIpKTsKKwkJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLAorCQkJCQkJCQkJcG1iKSwKKwkJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLAorCQkJCQkJCQkJcG1iKSk7CiAJCQlwaGJhLT5saW5rX3N0YXRlID0gTFBGQ19IQkFfRVJST1I7CiAJCQlwaGJhLT53b3JrX2hzID0gSFNfRkZFUjM7CiAJCQlscGZjX2hhbmRsZV9lcmF0dChwaGJhKTsKQEAgLTIyMTUsMTcgKzIyMTgsMTkgQEAKIAkJCWlmIChwbWJveC0+bWJ4U3RhdHVzID09IE1CWEVSUl9OT19SRVNPVVJDRVMpIHsKIAkJCQkvKiBNYm94IGNtZCBjbXBsIGVycm9yIC0gUkVUUllpbmcgKi8KIAkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLAotCQkJCQkJTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCQkJIiglZCk6MDMwNSBNYm94IGNtZCBjbXBsICIKLQkJCQkJCSJlcnJvciAtIFJFVFJZaW5nIERhdGE6IHgleCAiCi0JCQkJCQkiKHgleCkgeCV4IHgleCB4JXhcbiIsCi0JCQkJCQlwbWItPnZwb3J0ID8gcG1iLT52cG9ydC0+dnBpIDowLAotCQkJCQkJcG1ib3gtPm1ieENvbW1hbmQsCi0JCQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsCi0JCQkJCQkJCQkgIHBtYiksCi0JCQkJCQlwbWJveC0+bWJ4U3RhdHVzLAotCQkJCQkJcG1ib3gtPnVuLnZhcldvcmRzWzBdLAotCQkJCQkJcG1iLT52cG9ydC0+cG9ydF9zdGF0ZSk7CisJCQkJCUxPR19NQk9YIHwgTE9HX1NMSSwKKwkJCQkJIiglZCk6MDMwNSBNYm94IGNtZCBjbXBsICIKKwkJCQkJImVycm9yIC0gUkVUUllpbmcgRGF0YTogeCV4ICIKKwkJCQkJIih4JXgveCV4KSB4JXggeCV4IHgleFxuIiwKKwkJCQkJcG1iLT52cG9ydCA/IHBtYi0+dnBvcnQtPnZwaSA6IDAsCisJCQkJCXBtYm94LT5tYnhDb21tYW5kLAorCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsCisJCQkJCQkJCQlwbWIpLAorCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsCisJCQkJCQkJCQlwbWIpLAorCQkJCQlwbWJveC0+bWJ4U3RhdHVzLAorCQkJCQlwbWJveC0+dW4udmFyV29yZHNbMF0sCisJCQkJCXBtYi0+dnBvcnQtPnBvcnRfc3RhdGUpOwogCQkJCXBtYm94LT5tYnhTdGF0dXMgPSAwOwogCQkJCXBtYm94LT5tYnhPd25lciA9IE9XTl9IT1NUOwogCQkJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBwbWIsIE1CWF9OT1dBSVQpOwpAQCAtMjIzNiwxMSArMjI0MSwxMiBAQAogCiAJCS8qIE1haWxib3ggY21kIDxjbWQ+IENtcGwgPGNtcGw+ICovCiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkiKCVkKTowMzA3IE1haWxib3ggY21kIHgleCAoeCV4KSBDbXBsIHglcCAiCisJCQkJIiglZCk6MDMwNyBNYWlsYm94IGNtZCB4JXggKHgleC94JXgpIENtcGwgeCVwICIKIAkJCQkiRGF0YTogeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXhcbiIsCiAJCQkJcG1iLT52cG9ydCA/IHBtYi0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJcG1ib3gtPm1ieENvbW1hbmQsCi0JCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBwbWIpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgcG1iKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIHBtYiksCiAJCQkJcG1iLT5tYm94X2NtcGwsCiAJCQkJKigodWludDMyX3QgKikgcG1ib3gpLAogCQkJCXBtYm94LT51bi52YXJXb3Jkc1swXSwKQEAgLTQ2ODYsNiArNDY5MiwxNzUgQEAKIH0KIAogLyoqCisgKiBscGZjX3NsaTRfcmV0cmlldmVfcHBvcnRfbmFtZSAtIFJldHJpZXZlIFNMSTQgZGV2aWNlIHBoeXNpY2FsIHBvcnQgbmFtZQorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyByb3V0aW5lIHJldHJpZXZlcyBTTEk0IGRldmljZSBwaHlzaWNhbCBwb3J0IG5hbWUgdGhpcyBQQ0kgZnVuY3Rpb24KKyAqIGlzIGF0dGFjaGVkIHRvLgorICoKKyAqIFJldHVybiBjb2RlcworICogICAgICAwIC0gc3VjZXNzZnVsCisgKiAgICAgIG90aGVyd2lzZSAtIGZhaWxlZCB0byByZXRyaWV2ZSBwaHlzaWNhbCBwb3J0IG5hbWUKKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfc2xpNF9yZXRyaWV2ZV9wcG9ydF9uYW1lKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlMUEZDX01CT1hRX3QgKm1ib3hxOworCXN0cnVjdCBscGZjX21ieF9yZWFkX2NvbmZpZyAqcmRfY29uZmlnOworCXN0cnVjdCBscGZjX21ieF9nZXRfY250bF9hdHRyaWJ1dGVzICptYnhfY250bF9hdHRyOworCXN0cnVjdCBscGZjX2NvbnRyb2xsZXJfYXR0cmlidXRlICpjbnRsX2F0dHI7CisJc3RydWN0IGxwZmNfbWJ4X2dldF9wb3J0X25hbWUgKmdldF9wb3J0X25hbWU7CisJdm9pZCAqdmlydGFkZHIgPSBOVUxMOworCXVpbnQzMl90IGFsbG9jbGVuLCByZXFsZW47CisJdWludDMyX3Qgc2hkcl9zdGF0dXMsIHNoZHJfYWRkX3N0YXR1czsKKwl1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKnNoZHI7CisJY2hhciBjcG9ydF9uYW1lID0gMDsKKwlpbnQgcmM7CisKKwkvKiBXZSBhc3N1bWUgbm90aGluZyBhdCB0aGlzIHBvaW50ICovCisJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX2R2ID0gTFBGQ19MTktfREFUX0lOVkFMOworCXBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID0gTFBGQ19TTEk0X1BQTkFNRV9OT047CisKKwltYm94cSA9IChMUEZDX01CT1hRX3QgKiltZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9LRVJORUwpOworCWlmICghbWJveHEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogb2J0YWluIGxpbmsgdHlwZSBhbmQgbGluayBudW1iZXIgdmlhIFJFQURfQ09ORklHICovCisJbHBmY19yZWFkX2NvbmZpZyhwaGJhLCBtYm94cSk7CisJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3hxLCBNQlhfUE9MTCk7CisJaWYgKHJjID09IE1CWF9TVUNDRVNTKSB7CisJCXJkX2NvbmZpZyA9ICZtYm94cS0+dS5tcWUudW4ucmRfY29uZmlnOworCQlpZiAoYmZfZ2V0KGxwZmNfbWJ4X3JkX2NvbmZfbG5rX2xkdiwgcmRfY29uZmlnKSkgeworCQkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX2R2ID0gTFBGQ19MTktfREFUX1ZBTDsKKwkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua190cCA9CisJCQkJYmZfZ2V0KGxwZmNfbWJ4X3JkX2NvbmZfbG5rX3R5cGUsIHJkX2NvbmZpZyk7CisJCQlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfbm8gPQorCQkJCWJmX2dldChscGZjX21ieF9yZF9jb25mX2xua19udW1iLCByZF9jb25maWcpOworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX1NMSSwKKwkJCQkJIjMwODEgbG5rX3R5cGU6JWQsIGxua19udW1iOiVkXG4iLAorCQkJCQlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfdHAsCisJCQkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua19ubyk7CisJCQlnb3RvIHJldHJpZXZlX3BwbmFtZTsKKwkJfSBlbHNlCisJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAorCQkJCQkiMzA4MiBNYWlsYm94ICh4JXgpIHJldHVybmVkIGxkdjp4MFxuIiwKKwkJCQkJYmZfZ2V0KGxwZmNfbXFlX2NvbW1hbmQsCisJCQkJCSAgICAgICAmbWJveHEtPnUubXFlKSk7CisJfSBlbHNlCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19TTEksCisJCQkJIjMwODMgTWFpbGJveCAoeCV4KSBmYWlsZWQsIHN0YXR1czp4JXhcbiIsCisJCQkJYmZfZ2V0KGxwZmNfbXFlX2NvbW1hbmQsICZtYm94cS0+dS5tcWUpLAorCQkJCWJmX2dldChscGZjX21xZV9zdGF0dXMsICZtYm94cS0+dS5tcWUpKTsKKworCS8qIG9idGFpbiBsaW5rIHR5cGUgYW5kIGxpbmsgbnVtYmVyIHZpYSBDT01NT05fR0VUX0NOVExfQVRUUklCVVRFUyAqLworCXJlcWxlbiA9IHNpemVvZihzdHJ1Y3QgbHBmY19tYnhfZ2V0X2NudGxfYXR0cmlidXRlcyk7CisJYWxsb2NsZW4gPSBscGZjX3NsaTRfY29uZmlnKHBoYmEsIG1ib3hxLCBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCUxQRkNfTUJPWF9PUENPREVfR0VUX0NOVExfQVRUUklCVVRFUywgcmVxbGVuLAorCQkJTFBGQ19TTEk0X01CWF9ORU1CRUQpOworCWlmIChhbGxvY2xlbiA8IHJlcWxlbikgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCisJCQkJIjMwODQgQWxsb2NhdGVkIERNQSBtZW1vcnkgc2l6ZSAoJWQpIGlzICIKKwkJCQkibGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgRE1BIG1lbW9yeSBzaXplICIKKwkJCQkiKCVkKVxuIiwgYWxsb2NsZW4sIHJlcWxlbik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tYm94cTsKKwl9CisJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3hxLCBNQlhfUE9MTCk7CisJdmlydGFkZHIgPSBtYm94cS0+c2dlX2FycmF5LT5hZGRyWzBdOworCW1ieF9jbnRsX2F0dHIgPSAoc3RydWN0IGxwZmNfbWJ4X2dldF9jbnRsX2F0dHJpYnV0ZXMgKil2aXJ0YWRkcjsKKwlzaGRyID0gJm1ieF9jbnRsX2F0dHItPmNmZ19zaGRyOworCXNoZHJfc3RhdHVzID0gYmZfZ2V0KGxwZmNfbWJveF9oZHJfc3RhdHVzLCAmc2hkci0+cmVzcG9uc2UpOworCXNoZHJfYWRkX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX2FkZF9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSk7CisJaWYgKHNoZHJfc3RhdHVzIHx8IHNoZHJfYWRkX3N0YXR1cyB8fCByYykgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfU0xJLAorCQkJCSIzMDg1IE1haWxib3ggeCV4ICh4JXgveCV4KSBmYWlsZWQsICIKKwkJCQkicmM6eCV4LCBzdGF0dXM6eCV4LCBhZGRfc3RhdHVzOngleFxuIiwKKwkJCQliZl9nZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3hxLT51Lm1xZSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJcmMsIHNoZHJfc3RhdHVzLCBzaGRyX2FkZF9zdGF0dXMpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBvdXRfZnJlZV9tYm94cTsKKwl9CisJY250bF9hdHRyID0gJm1ieF9jbnRsX2F0dHItPmNudGxfYXR0cjsKKwlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfZHYgPSBMUEZDX0xOS19EQVRfVkFMOworCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua190cCA9CisJCWJmX2dldChscGZjX2NudGxfYXR0cl9sbmtfdHlwZSwgY250bF9hdHRyKTsKKwlwaGJhLT5zbGk0X2hiYS5sbmtfaW5mby5sbmtfbm8gPQorCQliZl9nZXQobHBmY19jbnRsX2F0dHJfbG5rX251bWIsIGNudGxfYXR0cik7CisJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX1NMSSwKKwkJCSIzMDg2IGxua190eXBlOiVkLCBsbmtfbnVtYjolZFxuIiwKKwkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua190cCwKKwkJCXBoYmEtPnNsaTRfaGJhLmxua19pbmZvLmxua19ubyk7CisKK3JldHJpZXZlX3BwbmFtZToKKwlscGZjX3NsaTRfY29uZmlnKHBoYmEsIG1ib3hxLCBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTiwKKwkJTFBGQ19NQk9YX09QQ09ERV9HRVRfUE9SVF9OQU1FLAorCQlzaXplb2Yoc3RydWN0IGxwZmNfbWJ4X2dldF9wb3J0X25hbWUpIC0KKwkJc2l6ZW9mKHN0cnVjdCBscGZjX3NsaTRfY2ZnX21oZHIpLAorCQlMUEZDX1NMSTRfTUJYX0VNQkVEKTsKKwlnZXRfcG9ydF9uYW1lID0gJm1ib3hxLT51Lm1xZS51bi5nZXRfcG9ydF9uYW1lOworCXNoZHIgPSAodW5pb24gbHBmY19zbGk0X2NmZ19zaGRyICopJmdldF9wb3J0X25hbWUtPmhlYWRlci5jZmdfc2hkcjsKKwliZl9zZXQobHBmY19tYm94X2hkcl92ZXJzaW9uLCAmc2hkci0+cmVxdWVzdCwgTFBGQ19PUENPREVfVkVSU0lPTl8xKTsKKwliZl9zZXQobHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9sbmtfdHlwZSwgJmdldF9wb3J0X25hbWUtPnUucmVxdWVzdCwKKwkJcGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX3RwKTsKKwlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveHEsIE1CWF9QT0xMKTsKKwlzaGRyX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX3N0YXR1cywgJnNoZHItPnJlc3BvbnNlKTsKKwlzaGRyX2FkZF9zdGF0dXMgPSBiZl9nZXQobHBmY19tYm94X2hkcl9hZGRfc3RhdHVzLCAmc2hkci0+cmVzcG9uc2UpOworCWlmIChzaGRyX3N0YXR1cyB8fCBzaGRyX2FkZF9zdGF0dXMgfHwgcmMpIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX1NMSSwKKwkJCQkiMzA4NyBNYWlsYm94IHgleCAoeCV4L3gleCkgZmFpbGVkOiAiCisJCQkJInJjOngleCwgc3RhdHVzOngleCwgYWRkX3N0YXR1czp4JXhcbiIsCisJCQkJYmZfZ2V0KGxwZmNfbXFlX2NvbW1hbmQsICZtYm94cS0+dS5tcWUpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCXJjLCBzaGRyX3N0YXR1cywgc2hkcl9hZGRfc3RhdHVzKTsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gb3V0X2ZyZWVfbWJveHE7CisJfQorCXN3aXRjaCAocGhiYS0+c2xpNF9oYmEubG5rX2luZm8ubG5rX25vKSB7CisJY2FzZSBMUEZDX0xJTktfTlVNQkVSXzA6CisJCWNwb3J0X25hbWUgPSBiZl9nZXQobHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMCwKKwkJCQkmZ2V0X3BvcnRfbmFtZS0+dS5yZXNwb25zZSk7CisJCXBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID0gTFBGQ19TTEk0X1BQTkFNRV9HRVQ7CisJCWJyZWFrOworCWNhc2UgTFBGQ19MSU5LX05VTUJFUl8xOgorCQljcG9ydF9uYW1lID0gYmZfZ2V0KGxwZmNfbWJ4X2dldF9wb3J0X25hbWVfbmFtZTEsCisJCQkJJmdldF9wb3J0X25hbWUtPnUucmVzcG9uc2UpOworCQlwaGJhLT5zbGk0X2hiYS5wcG9ydF9uYW1lX3N0YSA9IExQRkNfU0xJNF9QUE5BTUVfR0VUOworCQlicmVhazsKKwljYXNlIExQRkNfTElOS19OVU1CRVJfMjoKKwkJY3BvcnRfbmFtZSA9IGJmX2dldChscGZjX21ieF9nZXRfcG9ydF9uYW1lX25hbWUyLAorCQkJCSZnZXRfcG9ydF9uYW1lLT51LnJlc3BvbnNlKTsKKwkJcGhiYS0+c2xpNF9oYmEucHBvcnRfbmFtZV9zdGEgPSBMUEZDX1NMSTRfUFBOQU1FX0dFVDsKKwkJYnJlYWs7CisJY2FzZSBMUEZDX0xJTktfTlVNQkVSXzM6CisJCWNwb3J0X25hbWUgPSBiZl9nZXQobHBmY19tYnhfZ2V0X3BvcnRfbmFtZV9uYW1lMywKKwkJCQkmZ2V0X3BvcnRfbmFtZS0+dS5yZXNwb25zZSk7CisJCXBoYmEtPnNsaTRfaGJhLnBwb3J0X25hbWVfc3RhID0gTFBGQ19TTEk0X1BQTkFNRV9HRVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChwaGJhLT5zbGk0X2hiYS5wcG9ydF9uYW1lX3N0YSA9PSBMUEZDX1NMSTRfUFBOQU1FX0dFVCkgeworCQlwaGJhLT5Qb3J0WzBdID0gY3BvcnRfbmFtZTsKKwkJcGhiYS0+UG9ydFsxXSA9ICdcMCc7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19TTEksCisJCQkJIjMwOTEgU0xJIGdldCBwb3J0IG5hbWU6ICVzXG4iLCBwaGJhLT5Qb3J0KTsKKwl9CisKK291dF9mcmVlX21ib3hxOgorCWlmIChyYyAhPSBNQlhfVElNRU9VVCkgeworCQlpZiAoYmZfZ2V0KGxwZmNfbXFlX2NvbW1hbmQsICZtYm94cS0+dS5tcWUpID09IE1CWF9TTEk0X0NPTkZJRykKKwkJCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3hxKTsKKwkJZWxzZQorCQkJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKICAqIGxwZmNfc2xpNF9hcm1fY3FlcV9pbnRyIC0gQXJtIHNsaS00IGRldmljZSBjb21wbGV0aW9uIGFuZCBldmVudCBxdWV1ZXMKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICoKQEAgLTQ3NTQsNyArNDkyOSw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCWlmICh1bmxpa2VseShyYykpIHsKQEAgLTQ5MTEsNyArNTA4Niw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCkBAIC01MTk0LDcgKzUzNjksNyBAQAogCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94LCBNQlhfUE9MTCk7CiAJZWxzZSB7Ci0JCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveF90bW8pOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCWlmICh1bmxpa2VseShyYykpIHsKQEAgLTU2MTksNyArNTc5NCw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCkBAIC01NzQ4LDYgKzU5MjMsMTcgQEAKIAkJa2ZyZWUodnBkKTsKIAkJZ290byBvdXRfZnJlZV9tYm94OwogCX0KKworCS8qCisJICogUmV0cmlldmUgc2xpNCBkZXZpY2UgcGh5c2ljYWwgcG9ydCBuYW1lLCBmYWlsdXJlIG9mIGRvaW5nIGl0CisJICogaXMgY29uc2lkZXJlZCBhcyBub24tZmF0YWwuCisJICovCisJcmMgPSBscGZjX3NsaTRfcmV0cmlldmVfcHBvcnRfbmFtZShwaGJhKTsKKwlpZiAoIXJjKQorCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTUJPWCB8IExPR19TTEksCisJCQkJIjMwODAgU3VjY2Vzc2Z1bCByZXRyaWV2aW5nIFNMSTQgZGV2aWNlICIKKwkJCQkicGh5c2ljYWwgcG9ydCBuYW1lOiAlcy5cbiIsIHBoYmEtPlBvcnQpOworCiAJLyoKIAkgKiBFdmFsdWF0ZSB0aGUgcmVhZCByZXYgYW5kIHZwZCBkYXRhLiBQb3B1bGF0ZSB0aGUgZHJpdmVyCiAJICogc3RhdGUgd2l0aCB0aGUgcmVzdWx0cy4gSWYgdGhpcyByb3V0aW5lIGZhaWxzLCB0aGUgZmFpbHVyZQpAQCAtNTgxOCw5ICs2MDA0LDEzIEBACiAJICogdGhlbiB0dXJuIG9mZiB0aGUgZ2xvYmFsIGNvbmZpZyBwYXJhbWV0ZXJzIHRvIGRpc2FibGUgdGhlCiAJICogZmVhdHVyZSBpbiB0aGUgZHJpdmVyLiAgVGhpcyBpcyBub3QgYSBmYXRhbCBlcnJvci4KIAkgKi8KLQlpZiAoKHBoYmEtPmNmZ19lbmFibGVfYmcpICYmCi0JICAgICEoYmZfZ2V0KGxwZmNfbWJ4X3JxX2Z0cl9yc3BfZGlmLCAmbXFlLT51bi5yZXFfZnRycykpKQotCQlmdHJfcnNwKys7CisJcGhiYS0+c2xpM19vcHRpb25zICY9IH5MUEZDX1NMSTNfQkdfRU5BQkxFRDsKKwlpZiAocGhiYS0+Y2ZnX2VuYWJsZV9iZykgeworCQlpZiAoYmZfZ2V0KGxwZmNfbWJ4X3JxX2Z0cl9yc3BfZGlmLCAmbXFlLT51bi5yZXFfZnRycykpCisJCQlwaGJhLT5zbGkzX29wdGlvbnMgfD0gTFBGQ19TTEkzX0JHX0VOQUJMRUQ7CisJCWVsc2UKKwkJCWZ0cl9yc3ArKzsKKwl9CiAKIAlpZiAocGhiYS0+bWF4X3ZwaSAmJiBwaGJhLT5jZmdfZW5hYmxlX25waXYgJiYKIAkgICAgIShiZl9nZXQobHBmY19tYnhfcnFfZnRyX3JzcF9ucGl2LCAmbXFlLT51bi5yZXFfZnRycykpKQpAQCAtNTkzNywxMiArNjEyNywyMCBAQAogCQlnb3RvIG91dF9mcmVlX21ib3g7CiAJfQogCisJLyogQ3JlYXRlIGFsbCB0aGUgU0xJNCBxdWV1ZXMgKi8KKwlyYyA9IGxwZmNfc2xpNF9xdWV1ZV9jcmVhdGUocGhiYSk7CisJaWYgKHJjKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjMwODkgRmFpbGVkIHRvIGFsbG9jYXRlIHF1ZXVlc1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBvdXRfc3RvcF90aW1lcnM7CisJfQogCS8qIFNldCB1cCBhbGwgdGhlIHF1ZXVlcyB0byB0aGUgZGV2aWNlICovCiAJcmMgPSBscGZjX3NsaTRfcXVldWVfc2V0dXAocGhiYSk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCQkiMDM4MSBFcnJvciAlZCBkdXJpbmcgcXVldWUgc2V0dXAuXG4gIiwgcmMpOwotCQlnb3RvIG91dF9zdG9wX3RpbWVyczsKKwkJZ290byBvdXRfZGVzdHJveV9xdWV1ZTsKIAl9CiAKIAkvKiBBcm0gdGhlIENRcyBhbmQgdGhlbiBFUXMgb24gZGV2aWNlICovCkBAIC02MDE1LDE1ICs2MjEzLDIwIEBACiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJcGhiYS0+bGlua19zdGF0ZSA9IExQRkNfTElOS19ET1dOOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JaWYgKHBoYmEtPmNmZ19zdXBwcmVzc19saW5rX3VwID09IExQRkNfSU5JVElBTElaRV9MSU5LKQorCWlmIChwaGJhLT5jZmdfc3VwcHJlc3NfbGlua191cCA9PSBMUEZDX0lOSVRJQUxJWkVfTElOSykgewogCQlyYyA9IHBoYmEtPmxwZmNfaGJhX2luaXRfbGluayhwaGJhLCBNQlhfTk9XQUlUKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfdW5zZXRfcXVldWU7CisJfQorCW1lbXBvb2xfZnJlZShtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CisJcmV0dXJuIHJjOwogb3V0X3Vuc2V0X3F1ZXVlOgogCS8qIFVuc2V0IGFsbCB0aGUgcXVldWVzIHNldCB1cCBpbiB0aGlzIHJvdXRpbmUgd2hlbiBlcnJvciBvdXQgKi8KLQlpZiAocmMpCi0JCWxwZmNfc2xpNF9xdWV1ZV91bnNldChwaGJhKTsKKwlscGZjX3NsaTRfcXVldWVfdW5zZXQocGhiYSk7CitvdXRfZGVzdHJveV9xdWV1ZToKKwlscGZjX3NsaTRfcXVldWVfZGVzdHJveShwaGJhKTsKIG91dF9zdG9wX3RpbWVyczoKLQlpZiAocmMpCi0JCWxwZmNfc3RvcF9oYmFfdGltZXJzKHBoYmEpOworCWxwZmNfc3RvcF9oYmFfdGltZXJzKHBoYmEpOwogb3V0X2ZyZWVfbWJveDoKIAltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCXJldHVybiByYzsKQEAgLTYzMTgsNyArNjUyMSw3IEBACiAJCX0KIAkJLyogdGltZW91dCBhY3RpdmUgbWJveCBjb21tYW5kICovCiAJCW1vZF90aW1lcigmcHNsaS0+bWJveF90bW8sIChqaWZmaWVzICsKLQkJCSAgICAgICAoSFogKiBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYi0+bWJ4Q29tbWFuZCkpKSk7CisJCQkgICAgICAgKEhaICogbHBmY19tYm94X3Rtb192YWwocGhiYSwgcG1ib3gpKSkpOwogCX0KIAogCS8qIE1haWxib3ggY21kIDxjbWQ+IGlzc3VlICovCkBAIC02NDQyLDkgKzY2NDUsOCBAQAogCQkJCQkJICAgICAgIGRydnJfZmxhZyk7CiAJCQlnb3RvIG91dF9ub3RfZmluaXNoZWQ7CiAJCX0KLQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwKLQkJCQkJCQkgICAgIG1iLT5tYnhDb21tYW5kKSAqCi0JCQkJCSAgIDEwMDApICsgamlmZmllczsKKwkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgcG1ib3gpICoKKwkJCQkJCQkxMDAwKSArIGppZmZpZXM7CiAJCWkgPSAwOwogCQkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJCXdoaWxlICgoKHdvcmQwICYgT1dOX0NISVApID09IE9XTl9DSElQKSB8fApAQCAtNjU1NSwyMSArNjc1NywyMSBAQAogbHBmY19zbGk0X2FzeW5jX21ib3hfYmxvY2soc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewogCXN0cnVjdCBscGZjX3NsaSAqcHNsaSA9ICZwaGJhLT5zbGk7Ci0JdWludDhfdCBhY3RjbWQgPSBNQlhfSEVBUlRCRUFUOwogCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDA7CiAKIAkvKiBNYXJrIHRoZSBhc3luY2hyb25vdXMgbWFpbGJveCBjb21tYW5kIHBvc3RpbmcgYXMgYmxvY2tlZCAqLwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCXBzbGktPnNsaV9mbGFnIHw9IExQRkNfU0xJX0FTWU5DX01CWF9CTEs7Ci0JaWYgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkKLQkJYWN0Y21kID0gcGhiYS0+c2xpLm1ib3hfYWN0aXZlLT51Lm1iLm1ieENvbW1hbmQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkvKiBEZXRlcm1pbmUgaG93IGxvbmcgd2UgbWlnaHQgd2FpdCBmb3IgdGhlIGFjdGl2ZSBtYWlsYm94CiAJICogY29tbWFuZCB0byBiZSBncmFjZWZ1bGx5IGNvbXBsZXRlZCBieSBmaXJtd2FyZS4KIAkgKi8KLQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBhY3RjbWQpICogMTAwMCkgKwotCQkJCSAgIGppZmZpZXM7CisJaWYgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkKKwkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwKKwkJCQkJCXBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgKgorCQkJCQkJMTAwMCkgKyBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisKIAkvKiBXYWl0IGZvciB0aGUgb3V0c3RuYWRpbmcgbWFpbGJveCBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJd2hpbGUgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkgewogCQkvKiBDaGVjayBhY3RpdmUgbWFpbGJveCBjb21wbGV0ZSBzdGF0dXMgZXZlcnkgMm1zICovCkBAIC02NjY0LDExICs2ODY2LDEyIEBACiAJaWYgKHBzbGktPnNsaV9mbGFnICYgTFBGQ19TTElfTUJPWF9BQ1RJVkUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkiKCVkKToyNTMyIE1haWxib3ggY29tbWFuZCB4JXggKHgleCkgIgorCQkJCSIoJWQpOjI1MzIgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4L3gleCkgIgogCQkJCSJjYW5ub3QgaXNzdWUgRGF0YTogeCV4IHgleFxuIiwKIAkJCQltYm94cS0+dnBvcnQgPyBtYm94cS0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJbWJveHEtPnUubWIubWJ4Q29tbWFuZCwKLQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKIAkJCQlwc2xpLT5zbGlfZmxhZywgTUJYX1BPTEwpOwogCQlyZXR1cm4gTUJYRVJSX0VSUk9SOwogCX0KQEAgLTY2OTEsNyArNjg5NCw3IEBACiAJZG1hX2FkZHJlc3MgPSAmcGhiYS0+c2xpNF9oYmEuYm1ieC5kbWFfYWRkcmVzczsKIAl3cml0ZWwoZG1hX2FkZHJlc3MtPmFkZHJfaGksIHBoYmEtPnNsaTRfaGJhLkJNQlhyZWdhZGRyKTsKIAotCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ieF9jbW5kKQorCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3hxKQogCQkJCSAgICogMTAwMCkgKyBqaWZmaWVzOwogCWRvIHsKIAkJYm1ieF9yZWcud29yZDAgPSByZWFkbChwaGJhLT5zbGk0X2hiYS5CTUJYcmVnYWRkcik7CkBAIC02NzA3LDcgKzY5MTAsNyBAQAogCiAJLyogUG9zdCB0aGUgbG93IG1haWxib3ggZG1hIGFkZHJlc3MgdG8gdGhlIHBvcnQuICovCiAJd3JpdGVsKGRtYV9hZGRyZXNzLT5hZGRyX2xvLCBwaGJhLT5zbGk0X2hiYS5CTUJYcmVnYWRkcik7Ci0JdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJ4X2NtbmQpCisJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpCiAJCQkJICAgKiAxMDAwKSArIGppZmZpZXM7CiAJZG8gewogCQlibWJ4X3JlZy53b3JkMCA9IHJlYWRsKHBoYmEtPnNsaTRfaGJhLkJNQlhyZWdhZGRyKTsKQEAgLTY3NDYsMTEgKzY5NDksMTIgQEAKIAkJbHBmY19zbGk0X3N3YXBfc3RyKHBoYmEsIG1ib3hxKTsKIAogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19NQk9YIHwgTE9HX1NMSSwKLQkJCSIoJWQpOjAzNTYgTWFpbGJveCBjbWQgeCV4ICh4JXgpIFN0YXR1cyB4JXggIgorCQkJIiglZCk6MDM1NiBNYWlsYm94IGNtZCB4JXggKHgleC94JXgpIFN0YXR1cyB4JXggIgogCQkJIkRhdGE6IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXggeCV4IHgleCB4JXgiCiAJCQkiIHgleCB4JXggQ1E6IHgleCB4JXggeCV4IHgleFxuIiwKLQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKLQkJCW1ieF9jbW5kLCBscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwgbWJ4X2NtbmQsCisJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJYmZfZ2V0KGxwZmNfbXFlX3N0YXR1cywgbWIpLAogCQkJbWItPnVuLm1iX3dvcmRzWzBdLCBtYi0+dW4ubWJfd29yZHNbMV0sCiAJCQltYi0+dW4ubWJfd29yZHNbMl0sIG1iLT51bi5tYl93b3Jkc1szXSwKQEAgLTY3OTYsMTEgKzcwMDAsMTIgQEAKIAlyYyA9IGxwZmNfbWJveF9kZXZfY2hlY2socGhiYSk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkiKCVkKToyNTQ0IE1haWxib3ggY29tbWFuZCB4JXggKHgleCkgIgorCQkJCSIoJWQpOjI1NDQgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4L3gleCkgIgogCQkJCSJjYW5ub3QgaXNzdWUgRGF0YTogeCV4IHgleFxuIiwKIAkJCQltYm94cS0+dnBvcnQgPyBtYm94cS0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJbWJveHEtPnUubWIubWJ4Q29tbWFuZCwKLQkJCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKIAkJCQlwc2xpLT5zbGlfZmxhZywgZmxhZyk7CiAJCWdvdG8gb3V0X25vdF9maW5pc2hlZDsKIAl9CkBAIC02ODE0LDIwICs3MDE5LDI1IEBACiAJCWlmIChyYyAhPSBNQlhfU1VDQ0VTUykKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCQkJIiglZCk6MjU0MSBNYWlsYm94IGNvbW1hbmQgeCV4ICIKLQkJCQkJIih4JXgpIGNhbm5vdCBpc3N1ZSBEYXRhOiB4JXggeCV4XG4iLAorCQkJCQkiKHgleC94JXgpIGNhbm5vdCBpc3N1ZSBEYXRhOiAiCisJCQkJCSJ4JXggeCV4XG4iLAogCQkJCQltYm94cS0+dnBvcnQgPyBtYm94cS0+dnBvcnQtPnZwaSA6IDAsCiAJCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCi0JCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsCisJCQkJCQkJCQltYm94cSksCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwKKwkJCQkJCQkJCW1ib3hxKSwKIAkJCQkJcHNsaS0+c2xpX2ZsYWcsIGZsYWcpOwogCQlyZXR1cm4gcmM7CiAJfSBlbHNlIGlmIChmbGFnID09IE1CWF9QT0xMKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCQkiKCVkKToyNTQyIFRyeSB0byBpc3N1ZSBtYWlsYm94IGNvbW1hbmQgIgotCQkJCSJ4JXggKHgleCkgc3luY2hyb25vdXNseSBhaGVhZCBvZiBhc3luYyIKKwkJCQkieCV4ICh4JXgveCV4KSBzeW5jaHJvbm91c2x5IGFoZWFkIG9mIGFzeW5jIgogCQkJCSJtYWlsYm94IGNvbW1hbmQgcXVldWU6IHgleCB4JXhcbiIsCiAJCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLAogCQkJCW1ib3hxLT51Lm1iLm1ieENvbW1hbmQsCi0JCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCiAJCQkJcHNsaS0+c2xpX2ZsYWcsIGZsYWcpOwogCQkvKiBUcnkgdG8gYmxvY2sgdGhlIGFzeW5jaHJvbm91cyBtYWlsYm94IHBvc3RpbmcgKi8KIAkJcmMgPSBscGZjX3NsaTRfYXN5bmNfbWJveF9ibG9jayhwaGJhKTsKQEAgLTY4MzYsMTYgKzcwNDYsMTggQEAKIAkJCXJjID0gbHBmY19zbGk0X3Bvc3Rfc3luY19tYm94KHBoYmEsIG1ib3hxKTsKIAkJCWlmIChyYyAhPSBNQlhfU1VDQ0VTUykKIAkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsCi0JCQkJCQlMT0dfTUJPWCB8IExPR19TTEksCi0JCQkJCQkiKCVkKToyNTk3IE1haWxib3ggY29tbWFuZCAiCi0JCQkJCQkieCV4ICh4JXgpIGNhbm5vdCBpc3N1ZSAiCi0JCQkJCQkiRGF0YTogeCV4IHgleFxuIiwKLQkJCQkJCW1ib3hxLT52cG9ydCA/Ci0JCQkJCQltYm94cS0+dnBvcnQtPnZwaSA6IDAsCi0JCQkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAotCQkJCQkJbHBmY19zbGk0X21ib3hfb3Bjb2RlX2dldChwaGJhLAotCQkJCQkJCQltYm94cSksCi0JCQkJCQlwc2xpLT5zbGlfZmxhZywgZmxhZyk7CisJCQkJCUxPR19NQk9YIHwgTE9HX1NMSSwKKwkJCQkJIiglZCk6MjU5NyBNYWlsYm94IGNvbW1hbmQgIgorCQkJCQkieCV4ICh4JXgveCV4KSBjYW5ub3QgaXNzdWUgIgorCQkJCQkiRGF0YTogeCV4IHgleFxuIiwKKwkJCQkJbWJveHEtPnZwb3J0ID8KKwkJCQkJbWJveHEtPnZwb3J0LT52cGkgOiAwLAorCQkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAorCQkJCQlscGZjX3NsaV9jb25maWdfbWJveF9zdWJzeXNfZ2V0KHBoYmEsCisJCQkJCQkJCQltYm94cSksCisJCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwKKwkJCQkJCQkJCW1ib3hxKSwKKwkJCQkJcHNsaS0+c2xpX2ZsYWcsIGZsYWcpOwogCQkJLyogVW5ibG9jayB0aGUgYXN5bmMgbWFpbGJveCBwb3N0aW5nIGFmdGVyd2FyZCAqLwogCQkJbHBmY19zbGk0X2FzeW5jX21ib3hfdW5ibG9jayhwaGJhKTsKIAkJfQpAQCAtNjg1NiwxMSArNzA2OCwxMiBAQAogCXJjID0gbHBmY19tYm94X2NtZF9jaGVjayhwaGJhLCBtYm94cSk7CiAJaWYgKHJjKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCSIoJWQpOjI1NDMgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4KSAiCisJCQkJIiglZCk6MjU0MyBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgveCV4KSAiCiAJCQkJImNhbm5vdCBpc3N1ZSBEYXRhOiB4JXggeCV4XG4iLAogCQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKIAkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAotCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJCXBzbGktPnNsaV9mbGFnLCBmbGFnKTsKIAkJZ290byBvdXRfbm90X2ZpbmlzaGVkOwogCX0KQEAgLTY4NzIsMTAgKzcwODUsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZ3MpOwogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19NQk9YIHwgTE9HX1NMSSwKIAkJCSIoJWQpOjAzNTQgTWJveCBjbWQgaXNzdWUgLSBFbnF1ZXVlIERhdGE6ICIKLQkJCSJ4JXggKHgleCkgeCV4IHgleCB4JXhcbiIsCisJCQkieCV4ICh4JXgveCV4KSB4JXggeCV4IHgleFxuIiwKIAkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMHhmZmZmZmYsCiAJCQliZl9nZXQobHBmY19tcWVfY29tbWFuZCwgJm1ib3hxLT51Lm1xZSksCi0JCQlscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKKwkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChwaGJhLCBtYm94cSksCiAJCQlwaGJhLT5wcG9ydC0+cG9ydF9zdGF0ZSwKIAkJCXBzbGktPnNsaV9mbGFnLCBNQlhfTk9XQUlUKTsKIAkvKiBXYWtlIHVwIHdvcmtlciB0aHJlYWQgdG8gdHJhbnNwb3J0IG1haWxib3ggY29tbWFuZCBmcm9tIGhlYWQgKi8KQEAgLTY5NTIsMTMgKzcxNjYsMTQgQEAKIAogCS8qIFN0YXJ0IHRpbWVyIGZvciB0aGUgbWJveF90bW8gYW5kIGxvZyBzb21lIG1haWxib3ggcG9zdCBtZXNzYWdlcyAqLwogCW1vZF90aW1lcigmcHNsaS0+bWJveF90bW8sIChqaWZmaWVzICsKLQkJICAoSFogKiBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYnhfY21uZCkpKSk7CisJCSAgKEhaICogbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveHEpKSkpOwogCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJIiglZCk6MDM1NSBNYWlsYm94IGNtZCB4JXggKHgleCkgaXNzdWUgRGF0YTogIgorCQkJIiglZCk6MDM1NSBNYWlsYm94IGNtZCB4JXggKHgleC94JXgpIGlzc3VlIERhdGE6ICIKIAkJCSJ4JXggeCV4XG4iLAogCQkJbWJveHEtPnZwb3J0ID8gbWJveHEtPnZwb3J0LT52cGkgOiAwLCBtYnhfY21uZCwKLQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJbHBmY19zbGlfY29uZmlnX21ib3hfc3Vic3lzX2dldChwaGJhLCBtYm94cSksCisJCQlscGZjX3NsaV9jb25maWdfbWJveF9vcGNvZGVfZ2V0KHBoYmEsIG1ib3hxKSwKIAkJCXBoYmEtPnBwb3J0LT5wb3J0X3N0YXRlLCBwc2xpLT5zbGlfZmxhZyk7CiAKIAlpZiAobWJ4X2NtbmQgIT0gTUJYX0hFQVJUQkVBVCkgewpAQCAtNjk4MiwxMSArNzE5NywxMiBAQAogCXJjID0gbHBmY19zbGk0X21xX3B1dChwaGJhLT5zbGk0X2hiYS5tYnhfd3EsIG1xZSk7CiAJaWYgKHJjICE9IE1CWF9TVUNDRVNTKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLAotCQkJCSIoJWQpOjI1MzMgTWFpbGJveCBjb21tYW5kIHgleCAoeCV4KSAiCisJCQkJIiglZCk6MjUzMyBNYWlsYm94IGNvbW1hbmQgeCV4ICh4JXgveCV4KSAiCiAJCQkJImNhbm5vdCBpc3N1ZSBEYXRhOiB4JXggeCV4XG4iLAogCQkJCW1ib3hxLT52cG9ydCA/IG1ib3hxLT52cG9ydC0+dnBpIDogMCwKIAkJCQltYm94cS0+dS5tYi5tYnhDb21tYW5kLAotCQkJCWxwZmNfc2xpNF9tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQocGhiYSwgbWJveHEpLAorCQkJCWxwZmNfc2xpX2NvbmZpZ19tYm94X29wY29kZV9nZXQocGhiYSwgbWJveHEpLAogCQkJCXBzbGktPnNsaV9mbGFnLCBNQlhfTk9XQUlUKTsKIAkJZ290byBvdXRfbm90X2ZpbmlzaGVkOwogCX0KQEAgLTczMjIsNiArNzUzOCw4IEBACiAJCQkJaWYgKGluYm91bmQgPT0gMSkKIAkJCQkJb2Zmc2V0ID0gMDsKIAkJCQliZl9zZXQobHBmY19zbGk0X3NnZV9vZmZzZXQsIHNnbCwgb2Zmc2V0KTsKKwkJCQliZl9zZXQobHBmY19zbGk0X3NnZV90eXBlLCBzZ2wsCisJCQkJCUxQRkNfU0dFX1RZUEVfREFUQSk7CiAJCQkJb2Zmc2V0ICs9IGJkZS50dXMuZi5iZGVTaXplOwogCQkJfQogCQkJc2dsLT53b3JkMiA9IGNwdV90b19sZTMyKHNnbC0+d29yZDIpOwpAQCAtOTM1OSw3ICs5NTc3LDYgQEAKIAogCS8qIG5vdyBpc3N1ZSB0aGUgY29tbWFuZCAqLwogCXJldHZhbCA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgcG1ib3hxLCBNQlhfTk9XQUlUKTsKLQogCWlmIChyZXR2YWwgPT0gTUJYX0JVU1kgfHwgcmV0dmFsID09IE1CWF9TVUNDRVNTKSB7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRvbmVfcSwKIAkJCQlwbWJveHEtPm1ib3hfZmxhZyAmIExQRkNfTUJYX1dBS0UsCkBAIC05NDAzLDIzICs5NjIwLDI0IEBACiBscGZjX3NsaV9tYm94X3N5c19zaHV0ZG93bihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGxwZmNfc2xpICpwc2xpID0gJnBoYmEtPnNsaTsKLQl1aW50OF90IGFjdGNtZCA9IE1CWF9IRUFSVEJFQVQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCisJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoTFBGQ19NQk9YX1RNTyAqIDEwMDApICsgamlmZmllczsKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAlwc2xpLT5zbGlfZmxhZyB8PSBMUEZDX1NMSV9BU1lOQ19NQlhfQkxLOwogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAlpZiAocHNsaS0+c2xpX2ZsYWcgJiBMUEZDX1NMSV9BQ1RJVkUpIHsKIAkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCWlmIChwaGJhLT5zbGkubWJveF9hY3RpdmUpCi0JCQlhY3RjbWQgPSBwaGJhLT5zbGkubWJveF9hY3RpdmUtPnUubWIubWJ4Q29tbWFuZDsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJLyogRGV0ZXJtaW5lIGhvdyBsb25nIHdlIG1pZ2h0IHdhaXQgZm9yIHRoZSBhY3RpdmUgbWFpbGJveAogCQkgKiBjb21tYW5kIHRvIGJlIGdyYWNlZnVsbHkgY29tcGxldGVkIGJ5IGZpcm13YXJlLgogCQkgKi8KLQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMobHBmY19tYm94X3Rtb192YWwocGhiYSwgYWN0Y21kKSAqCi0JCQkJCSAgIDEwMDApICsgamlmZmllczsKKwkJaWYgKHBoYmEtPnNsaS5tYm94X2FjdGl2ZSkKKwkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKGxwZmNfbWJveF90bW9fdmFsKHBoYmEsCisJCQkJCQlwaGJhLT5zbGkubWJveF9hY3RpdmUpICoKKwkJCQkJCTEwMDApICsgamlmZmllczsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwogCQl3aGlsZSAocGhiYS0+c2xpLm1ib3hfYWN0aXZlKSB7CiAJCQkvKiBDaGVjayBhY3RpdmUgbWFpbGJveCBjb21wbGV0ZSBzdGF0dXMgZXZlcnkgMm1zICovCiAJCQltc2xlZXAoMik7CkBAIC0xMDQxNSwxMiArMTA2MzMsMTcgQEAKIAkvKiBNb3ZlIG1ib3ggZGF0YSB0byBjYWxsZXIncyBtYWlsYm94IHJlZ2lvbiwgZG8gZW5kaWFuIHN3YXBwaW5nICovCiAJaWYgKHBtYi0+bWJveF9jbXBsICYmIG1ib3gpCiAJCWxwZmNfc2xpX3BjaW1lbV9iY29weShtYm94LCBtcWUsIHNpemVvZihzdHJ1Y3QgbHBmY19tcWUpKTsKLQkvKiBTZXQgdGhlIG1haWxib3ggc3RhdHVzIHdpdGggU0xJNCByYW5nZSAweDQwMDAgKi8KLQltY3FlX3N0YXR1cyA9IGJmX2dldChscGZjX21jcWVfc3RhdHVzLCBtY3FlKTsKLQlpZiAobWNxZV9zdGF0dXMgIT0gTUJfQ1FFX1NUQVRVU19TVUNDRVNTKQotCQliZl9zZXQobHBmY19tcWVfc3RhdHVzLCBtcWUsCi0JCSAgICAgICAoTFBGQ19NQlhfRVJST1JfUkFOR0UgfCBtY3FlX3N0YXR1cykpOwogCisJLyoKKwkgKiBGb3IgbWNxZSBlcnJvcnMsIGNvbmRpdGlvbmFsbHkgbW92ZSBhIG1vZGlmaWVkIGVycm9yIGNvZGUgdG8KKwkgKiB0aGUgbWJveCBzbyB0aGF0IHRoZSBlcnJvciB3aWxsIG5vdCBiZSBtaXNzZWQuCisJICovCisJbWNxZV9zdGF0dXMgPSBiZl9nZXQobHBmY19tY3FlX3N0YXR1cywgbWNxZSk7CisJaWYgKG1jcWVfc3RhdHVzICE9IE1CX0NRRV9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAoYmZfZ2V0KGxwZmNfbXFlX3N0YXR1cywgbXFlKSA9PSBNQlhfU1VDQ0VTUykKKwkJCWJmX3NldChscGZjX21xZV9zdGF0dXMsIG1xZSwKKwkJCSAgICAgICAoTFBGQ19NQlhfRVJST1JfUkFOR0UgfCBtY3FlX3N0YXR1cykpOworCX0KIAlpZiAocG1iLT5tYm94X2ZsYWcgJiBMUEZDX01CWF9JTUVEX1VOUkVHKSB7CiAJCXBtYi0+bWJveF9mbGFnICY9IH5MUEZDX01CWF9JTUVEX1VOUkVHOwogCQlscGZjX2RlYnVnZnNfZGlzY190cmModnBvcnQsIExQRkNfRElTQ19UUkNfTUJPWF9WUE9SVCwKQEAgLTEwNzk2LDcgKzExMDE5LDcgQEAKIAljYXNlIExQRkNfTUNROgogCQl3aGlsZSAoKGNxZSA9IGxwZmNfc2xpNF9jcV9nZXQoY3EpKSkgewogCQkJd29ya3Bvc3RlZCB8PSBscGZjX3NsaTRfc3BfaGFuZGxlX21jcWUocGhiYSwgY3FlKTsKLQkJCWlmICghKCsrZWNvdW50ICUgTFBGQ19HRVRfUUVfUkVMX0lOVCkpCisJCQlpZiAoISgrK2Vjb3VudCAlIGNxLT5lbnRyeV9yZXBvc3QpKQogCQkJCWxwZmNfc2xpNF9jcV9yZWxlYXNlKGNxLCBMUEZDX1FVRVVFX05PQVJNKTsKIAkJfQogCQlicmVhazsKQEAgLTEwODA4LDcgKzExMDMxLDcgQEAKIAkJCWVsc2UKIAkJCQl3b3JrcG9zdGVkIHw9IGxwZmNfc2xpNF9zcF9oYW5kbGVfY3FlKHBoYmEsIGNxLAogCQkJCQkJCQkgICAgICBjcWUpOwotCQkJaWYgKCEoKytlY291bnQgJSBMUEZDX0dFVF9RRV9SRUxfSU5UKSkKKwkJCWlmICghKCsrZWNvdW50ICUgY3EtPmVudHJ5X3JlcG9zdCkpCiAJCQkJbHBmY19zbGk0X2NxX3JlbGVhc2UoY3EsIExQRkNfUVVFVUVfTk9BUk0pOwogCQl9CiAJCWJyZWFrOwpAQCAtMTEwNDAsNyArMTEyNjMsNyBAQAogCS8qIFByb2Nlc3MgYWxsIHRoZSBlbnRyaWVzIHRvIHRoZSBDUSAqLwogCXdoaWxlICgoY3FlID0gbHBmY19zbGk0X2NxX2dldChjcSkpKSB7CiAJCXdvcmtwb3N0ZWQgfD0gbHBmY19zbGk0X2ZwX2hhbmRsZV93Y3FlKHBoYmEsIGNxLCBjcWUpOwotCQlpZiAoISgrK2Vjb3VudCAlIExQRkNfR0VUX1FFX1JFTF9JTlQpKQorCQlpZiAoISgrK2Vjb3VudCAlIGNxLT5lbnRyeV9yZXBvc3QpKQogCQkJbHBmY19zbGk0X2NxX3JlbGVhc2UoY3EsIExQRkNfUVVFVUVfTk9BUk0pOwogCX0KIApAQCAtMTExMTAsNiArMTEzMzMsOCBAQAogCiAJLyogR2V0IHRvIHRoZSBFUSBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmVjdG9yICovCiAJc3BlcSA9IHBoYmEtPnNsaTRfaGJhLnNwX2VxOworCWlmICh1bmxpa2VseSghc3BlcSkpCisJCXJldHVybiBJUlFfTk9ORTsKIAogCS8qIENoZWNrIGRldmljZSBzdGF0ZSBmb3IgaGFuZGxpbmcgaW50ZXJydXB0ICovCiAJaWYgKHVubGlrZWx5KGxwZmNfaW50cl9zdGF0ZV9jaGVjayhwaGJhKSkpIHsKQEAgLTExMTI3LDcgKzExMzUyLDcgQEAKIAkgKi8KIAl3aGlsZSAoKGVxZSA9IGxwZmNfc2xpNF9lcV9nZXQoc3BlcSkpKSB7CiAJCWxwZmNfc2xpNF9zcF9oYW5kbGVfZXFlKHBoYmEsIGVxZSk7Ci0JCWlmICghKCsrZWNvdW50ICUgTFBGQ19HRVRfUUVfUkVMX0lOVCkpCisJCWlmICghKCsrZWNvdW50ICUgc3BlcS0+ZW50cnlfcmVwb3N0KSkKIAkJCWxwZmNfc2xpNF9lcV9yZWxlYXNlKHNwZXEsIExQRkNfUVVFVUVfTk9BUk0pOwogCX0KIApAQCAtMTExODcsNiArMTE0MTIsOCBAQAogCiAJaWYgKHVubGlrZWx5KCFwaGJhKSkKIAkJcmV0dXJuIElSUV9OT05FOworCWlmICh1bmxpa2VseSghcGhiYS0+c2xpNF9oYmEuZnBfZXEpKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAkvKiBHZXQgdG8gdGhlIEVRIHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyB2ZWN0b3IgKi8KIAlmcGVxID0gcGhiYS0+c2xpNF9oYmEuZnBfZXFbZmNwX2VxaWR4XTsKQEAgLTExMjA3LDcgKzExNDM0LDcgQEAKIAkgKi8KIAl3aGlsZSAoKGVxZSA9IGxwZmNfc2xpNF9lcV9nZXQoZnBlcSkpKSB7CiAJCWxwZmNfc2xpNF9mcF9oYW5kbGVfZXFlKHBoYmEsIGVxZSwgZmNwX2VxaWR4KTsKLQkJaWYgKCEoKytlY291bnQgJSBMUEZDX0dFVF9RRV9SRUxfSU5UKSkKKwkJaWYgKCEoKytlY291bnQgJSBmcGVxLT5lbnRyeV9yZXBvc3QpKQogCQkJbHBmY19zbGk0X2VxX3JlbGVhc2UoZnBlcSwgTFBGQ19RVUVVRV9OT0FSTSk7CiAJfQogCkBAIC0xMTM1OSw2ICsxMTU4NiwxNSBAQAogCX0KIAlxdWV1ZS0+ZW50cnlfc2l6ZSA9IGVudHJ5X3NpemU7CiAJcXVldWUtPmVudHJ5X2NvdW50ID0gZW50cnlfY291bnQ7CisKKwkvKgorCSAqIGVudHJ5X3JlcG9zdCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUKKwkgKiBxdWV1ZS4gVGhpcyB3b3JrcyBvdXQgZXhjZXB0IGZvciBSUXMuIElmIGJ1ZmZlcnMgYXJlIE5PVCBpbml0aWFsbHkKKwkgKiBwb3N0ZWQgZm9yIGV2ZXJ5IFJRRSwgZW50cnlfcmVwb3N0IHNob3VsZCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4KKwkgKi8KKwlxdWV1ZS0+ZW50cnlfcmVwb3N0ID0gKGVudHJ5X2NvdW50ID4+IDMpOworCWlmIChxdWV1ZS0+ZW50cnlfcmVwb3N0IDwgTFBGQ19RVUVVRV9NSU5fUkVQT1NUKQorCQlxdWV1ZS0+ZW50cnlfcmVwb3N0ID0gTFBGQ19RVUVVRV9NSU5fUkVQT1NUOwogCXF1ZXVlLT5waGJhID0gcGhiYTsKIAogCXJldHVybiBxdWV1ZTsKQEAgLTExOTI0LDYgKzEyMTYwLDMxIEBACiB9CiAKIC8qKgorICogbHBmY19ycV9hZGp1c3RfcmVwb3N0IC0gQWRqdXN0IGVudHJ5X3JlcG9zdCBmb3IgYW4gUlEKKyAqIEBwaGJhOiBIQkEgc3RydWN0dXJlIHRoYXQgaW5kaWNhdGVzIHBvcnQgdG8gY3JlYXRlIGEgcXVldWUgb24uCisgKiBAcnE6ICAgVGhlIHF1ZXVlIHN0cnVjdHVyZSB0byB1c2UgZm9yIHRoZSByZWNlaXZlIHF1ZXVlLgorICogQHFubzogIFRoZSBhc3NvY2lhdGVkIEhCUSBudW1iZXIKKyAqCisgKgorICogRm9yIFNMSTQgd2UgbmVlZCB0byBhZGp1c3QgdGhlIFJRIHJlcG9zdCB2YWx1ZSBiYXNlZCBvbgorICogdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYXJlIGluaXRpYWxseSBwb3N0ZWQgdG8gdGhlIFJRLgorICovCit2b2lkCitscGZjX3JxX2FkanVzdF9yZXBvc3Qoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqcnEsIGludCBxbm8pCit7CisJdWludDMyX3QgY250OworCisJY250ID0gbHBmY19oYnFfZGVmc1txbm9dLT5lbnRyeV9jb3VudDsKKworCS8qIFJlY2FsYyByZXBvc3QgZm9yIFJRcyBiYXNlZCBvbiBidWZmZXJzIGluaXRpYWxseSBwb3N0ZWQgKi8KKwljbnQgPSAoY250ID4+IDMpOworCWlmIChjbnQgPCBMUEZDX1FVRVVFX01JTl9SRVBPU1QpCisJCWNudCA9IExQRkNfUVVFVUVfTUlOX1JFUE9TVDsKKworCXJxLT5lbnRyeV9yZXBvc3QgPSBjbnQ7Cit9CisKKy8qKgogICogbHBmY19ycV9jcmVhdGUgLSBDcmVhdGUgYSBSZWNlaXZlIFF1ZXVlIG9uIHRoZSBIQkEKICAqIEBwaGJhOiBIQkEgc3RydWN0dXJlIHRoYXQgaW5kaWNhdGVzIHBvcnQgdG8gY3JlYXRlIGEgcXVldWUgb24uCiAgKiBAaHJxOiBUaGUgcXVldWUgc3RydWN0dXJlIHRvIHVzZSB0byBjcmVhdGUgdGhlIGhlYWRlciByZWNlaXZlIHF1ZXVlLgpAQCAtMTI0ODksNyArMTI3NTAsNyBAQAogCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveChwaGJhLCBtYm94LCBNQlhfUE9MTCk7CiAJZWxzZSB7Ci0JCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKKwkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBtYm94KTsKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveCwgbWJveF90bW8pOwogCX0KIAkvKiBUaGUgSU9DVEwgc3RhdHVzIGlzIGVtYmVkZGVkIGluIHRoZSBtYWlsYm94IHN1YmhlYWRlci4gKi8KQEAgLTEyNzA0LDcgKzEyOTY1LDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAJc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikgJnNnbC0+Y2ZnX3NoZHI7CkBAIC0xMjg2Nyw3ICsxMzEyOCw3IEBACiAJCWlmICghcGhiYS0+c2xpNF9oYmEuaW50cl9lbmFibGUpCiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCQllbHNlIHsKLQkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKTsKKwkJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJCX0KIAkJc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikgJnNnbC0+Y2ZnX3NoZHI7CkBAIC0xMjk5MSw3ICsxMzI1Miw3IEBACiAJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKIAkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAllbHNlIHsKLQkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CiAJfQogCXNoZHIgPSAodW5pb24gbHBmY19zbGk0X2NmZ19zaGRyICopICZzZ2wtPmNmZ19zaGRyOwpAQCAtMTMxNDcsNyArMTM0MDgsNyBAQAogCQlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKIAkJZWxzZSB7Ci0JCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3gpOwogCQkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveCwgbWJveF90bW8pOwogCQl9CiAJCXNoZHIgPSAodW5pb24gbHBmY19zbGk0X2NmZ19zaGRyICopICZzZ2wtPmNmZ19zaGRyOwpAQCAtMTMyOTYsNyArMTM1NTcsOCBAQAogCXVpbnQzMl90IGRpZCA9IChmY19oZHItPmZoX2RfaWRbMF0gPDwgMTYgfAogCQkJZmNfaGRyLT5maF9kX2lkWzFdIDw8IDggfAogCQkJZmNfaGRyLT5maF9kX2lkWzJdKTsKLQorCWlmIChkaWQgPT0gRmFicmljX0RJRCkKKwkJcmV0dXJuIHBoYmEtPnBwb3J0OwogCXZwb3J0cyA9IGxwZmNfY3JlYXRlX3Zwb3J0X3dvcmtfYXJyYXkocGhiYSk7CiAJaWYgKHZwb3J0cyAhPSBOVUxMKQogCQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm1heF92cGkgJiYgdnBvcnRzW2ldICE9IE5VTEw7IGkrKykgewpAQCAtMTQzMTIsNyArMTQ1NzQsNyBAQAogCWlmICghbWJveHEpCiAJCXJldHVybiAtRU5PTUVNOwogCWxwZmNfaW5pdF92cGkocGhiYSwgbWJveHEsIHZwb3J0LT52cGkpOwotCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX0lOSVRfVlBJKTsKKwltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIG1ib3hxKTsKIAlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94cSwgbWJveF90bW8pOwogCWlmIChyYyAhPSBNQlhfU1VDQ0VTUykgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX1NMSSwKQEAgLTE1MTg4LDcgKzE1NDUwLDcgQEAKIAlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQogCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOwogCWVsc2UgewotCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCW1ib3hfdG1vID0gbHBmY19tYm94X3Rtb192YWwocGhiYSwgbWJveCk7CiAJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKIAl9CiAJLyogVGhlIElPQ1RMIHN0YXR1cyBpcyBlbWJlZGRlZCBpbiB0aGUgbWFpbGJveCBzdWJoZWFkZXIuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaAppbmRleCBhMDA3NWIwLi4yOWMxM2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKQEAgLTI5MywxMyArMjkzLDExIEBACiAJc3RydWN0IGxwZmNfbG5rX3N0YXQgbG5rX3N0YXRfb2Zmc2V0czsKIH07CiAKLSNkZWZpbmUgTFBGQ19NQk9YX1RNTyAgICAgICAgICAgMzAJLyogU2VjIHRtbyBmb3Igb3V0c3RhbmRpbmcgbWJveAotCQkJCQkgICBjb21tYW5kICovCi0jZGVmaW5lIExQRkNfTUJPWF9TTEk0X0NPTkZJR19UTU8gNjAJLyogU2VjIHRtbyBmb3Igb3V0c3RhbmRpbmcgbWJveAotCQkJCQkgICBjb21tYW5kICovCi0jZGVmaW5lIExQRkNfTUJPWF9UTU9fRkxBU0hfQ01EIDMwMCAgICAgLyogU2VjIHRtbyBmb3Igb3V0c3RhbmRpbmcgRkxBU0ggd3JpdGUKLQkJCQkJICogb3IgZXJhc2UgY21kcy4gVGhpcyBpcyBlc3BlY2lhbGx5Ci0JCQkJCSAqIGxvbmcgYmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIG9mCi0JCQkJCSAqIG11bHRpcGxlIGZsYXNoIGVyYXNlcyB0aGF0IGNhbiBiZQotCQkJCQkgKiBzcGF3bmVkLgotCQkJCQkgKi8KKy8qIFRpbWVvdXQgZm9yIG5vcm1hbCBvdXRzdGFuZGluZyBtYm94IGNvbW1hbmQgKFNlY29uZHMpICovCisjZGVmaW5lIExQRkNfTUJPWF9UTU8JCQkJMzAKKy8qIFRpbWVvdXQgZm9yIG5vbi1mbGFzaC1iYXNlZCBvdXRzdGFuZGluZyBzbGlfY29uZmlnIG1ib3ggY29tbWFuZCAoU2Vjb25kcykgKi8KKyNkZWZpbmUgTFBGQ19NQk9YX1NMSTRfQ09ORklHX1RNTwkJNjAKKy8qIFRpbWVvdXQgZm9yIGZsYXNoLWJhc2VkIG91dHN0YW5kaW5nIHNsaV9jb25maWcgbWJveCBjb21tYW5kIChTZWNvbmRzKSAqLworI2RlZmluZSBMUEZDX01CT1hfU0xJNF9DT05GSUdfRVhURU5ERURfVE1PCTMwMAorLyogVGltZW91dCBmb3Igb3RoZXIgZmxhc2gtYmFzZWQgb3V0c3RhbmRpbmcgbWJveCBjb21tYW5kIChTZWNvbmRzKSAqLworI2RlZmluZSBMUEZDX01CT1hfVE1PX0ZMQVNIX0NNRAkJCTMwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAppbmRleCAxOWJiODdhLi5kNWNmZmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaApAQCAtMjMsNyArMjMsNiBAQAogI2RlZmluZSBMUEZDX1hSSV9FWENIX0JVU1lfV0FJVF9UMSAgIAkJMTAKICNkZWZpbmUgTFBGQ19YUklfRVhDSF9CVVNZX1dBSVRfVDIgICAgICAgICAgICAgIDMwMDAwCiAjZGVmaW5lIExQRkNfUkVMRUFTRV9OT1RJRklDQVRJT05fSU5URVJWQUwJMzIKLSNkZWZpbmUgTFBGQ19HRVRfUUVfUkVMX0lOVAkJCTMyCiAjZGVmaW5lIExQRkNfUlBJX0xPV19XQVRFUl9NQVJLCQkJMTAKIAogI2RlZmluZSBMUEZDX1VOUkVHX0ZDRiAgICAgICAgICAgICAgICAgICAgICAgICAgMQpAQCAtMTI2LDYgKzEyNSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBjaGlsZF9saXN0OwogCXVpbnQzMl90IGVudHJ5X2NvdW50OwkvKiBOdW1iZXIgb2YgZW50cmllcyB0byBzdXBwb3J0IG9uIHRoZSBxdWV1ZSAqLwogCXVpbnQzMl90IGVudHJ5X3NpemU7CS8qIFNpemUgb2YgZWFjaCBxdWV1ZSBlbnRyeS4gKi8KKwl1aW50MzJfdCBlbnRyeV9yZXBvc3Q7CS8qIENvdW50IG9mIGVudHJpZXMgYmVmb3JlIGRvb3JiZWxsIGlzIHJ1bmcgKi8KKyNkZWZpbmUgTFBGQ19RVUVVRV9NSU5fUkVQT1NUCTgKIAl1aW50MzJfdCBxdWV1ZV9pZDsJLyogUXVldWUgSUQgYXNzaWduZWQgYnkgdGhlIGhhcmR3YXJlICovCiAJdWludDMyX3QgYXNzb2NfcWlkOyAgICAgLyogUXVldWUgSUQgYXNzb2NpYXRlZCB3aXRoLCBmb3IgQ1EvV1EvTVEgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHBhZ2VfbGlzdDsKQEAgLTM4OCw2ICszODksMTYgQEAKIAl1aW50MzJfdCB2Zl9udW1iZXI7CiB9OwogCitzdHJ1Y3QgbHBmY19zbGk0X2xua19pbmZvIHsKKwl1aW50OF90IGxua19kdjsKKyNkZWZpbmUgTFBGQ19MTktfREFUX0lOVkFMCTAKKyNkZWZpbmUgTFBGQ19MTktfREFUX1ZBTAkxCisJdWludDhfdCBsbmtfdHA7CisjZGVmaW5lIExQRkNfTE5LX0dFCTB4MCAvKiBGQ29FICovCisjZGVmaW5lIExQRkNfTE5LX0ZDCTB4MSAvKiBGQyAgICovCisJdWludDhfdCBsbmtfbm87Cit9OworCiAvKiBTTEk0IEhCQSBkYXRhIHN0cnVjdHVyZSBlbnRyaWVzICovCiBzdHJ1Y3QgbHBmY19zbGk0X2hiYSB7CiAJdm9pZCBfX2lvbWVtICpjb25mX3JlZ3NfbWVtbWFwX3A7IC8qIEtlcm5lbCBtZW1vcnkgbWFwcGVkIGFkZHJlc3MgZm9yCkBAIC01MDMsNiArNTE0LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZCBzcF9lbHNfeHJpX2Fib3J0ZWRfd29ya19xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNwX3Vuc29sX3dvcmtfcXVldWU7CiAJc3RydWN0IGxwZmNfc2xpNF9saW5rIGxpbmtfc3RhdGU7CisJc3RydWN0IGxwZmNfc2xpNF9sbmtfaW5mbyBsbmtfaW5mbzsKKwl1aW50MzJfdCBwcG9ydF9uYW1lX3N0YTsKKyNkZWZpbmUgTFBGQ19TTEk0X1BQTkFNRV9OT04JMAorI2RlZmluZSBMUEZDX1NMSTRfUFBOQU1FX0dFVAkxCiAJc3RydWN0IGxwZmNfaW92IGlvdjsKIAlzcGlubG9ja190IGFidHNfc2NzaV9idWZfbGlzdF9sb2NrOyAvKiBsaXN0IG9mIGFib3J0ZWQgU0NTSSBJT3MgKi8KIAlzcGlubG9ja190IGFidHNfc2dsX2xpc3RfbG9jazsgLyogbGlzdCBvZiBhYm9ydGVkIGVscyBJT3MgKi8KQEAgLTU1Myw2ICs1NjgsNyBAQAogICogU0xJNCBzcGVjaWZpYyBmdW5jdGlvbiBwcm90b3R5cGVzCiAgKi8KIGludCBscGZjX3BjaV9mdW5jdGlvbl9yZXNldChzdHJ1Y3QgbHBmY19oYmEgKik7CitpbnQgbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaTRfaGJhX3NldHVwKHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaTRfY29uZmlnKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY01ib3hxICosIHVpbnQ4X3QsCiAJCSAgICAgdWludDhfdCwgdWludDMyX3QsIGJvb2wpOwpAQCAtNTc2LDYgKzU5Miw3IEBACiAJCQlzdHJ1Y3QgbHBmY19xdWV1ZSAqLCB1aW50MzJfdCk7CiB1aW50MzJfdCBscGZjX3JxX2NyZWF0ZShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfcXVldWUgKiwKIAkJCXN0cnVjdCBscGZjX3F1ZXVlICosIHN0cnVjdCBscGZjX3F1ZXVlICosIHVpbnQzMl90KTsKK3ZvaWQgbHBmY19ycV9hZGp1c3RfcmVwb3N0KHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqLCBpbnQpOwogdWludDMyX3QgbHBmY19lcV9kZXN0cm95KHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19xdWV1ZSAqKTsKIHVpbnQzMl90IGxwZmNfY3FfZGVzdHJveShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfcXVldWUgKik7CiB1aW50MzJfdCBscGZjX21xX2Rlc3Ryb3koc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBscGZjX3F1ZXVlICopOwpAQCAtNjMyLDUgKzY0OSw1IEBACiB2b2lkIGxwZmNfbWJ4X2NtcGxfcmVhZF9mY2ZfcmVjKHN0cnVjdCBscGZjX2hiYSAqLCBMUEZDX01CT1hRX3QgKik7CiBpbnQgbHBmY19zbGk0X3VucmVnaXN0ZXJfZmNmKHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaTRfcG9zdF9zdGF0dXNfY2hlY2soc3RydWN0IGxwZmNfaGJhICopOwotdWludDhfdCBscGZjX3NsaTRfbWJveF9vcGNvZGVfZ2V0KHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY01ib3hxICopOwotCit1aW50OF90IGxwZmNfc2xpX2NvbmZpZ19tYm94X3N1YnN5c19nZXQoc3RydWN0IGxwZmNfaGJhICosIExQRkNfTUJPWFFfdCAqKTsKK3VpbnQ4X3QgbHBmY19zbGlfY29uZmlnX21ib3hfb3Bjb2RlX2dldChzdHJ1Y3QgbHBmY19oYmEgKiwgTFBGQ19NQk9YUV90ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAppbmRleCBjMWUwYWU5Li5iMDYzMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaApAQCAtMTgsNyArMTgsNyBAQAogICogaW5jbHVkZWQgd2l0aCB0aGlzIHBhY2thZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy4yNSIKKyNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjI3IgogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FCQkibHBmYyIKICNkZWZpbmUgTFBGQ19TUF9EUklWRVJfSEFORExFUl9OQU1FCSJscGZjOnNwIgogI2RlZmluZSBMUEZDX0ZQX0RSSVZFUl9IQU5ETEVSX05BTUUJImxwZmM6ZnAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Zwb3J0LmMKaW5kZXggMWZlYjU1MS4uY2ZmNmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192cG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdnBvcnQuYwpAQCAtNjkyLDEzICs2OTIsMTQgQEAKIAkJCS8qIEluZGljYXRlIGZyZWUgbWVtb3J5IHdoZW4gcmVsZWFzZSAqLwogCQkJTkxQX1NFVF9GUkVFX1JFUShuZGxwKTsKIAkJfSBlbHNlIHsKLQkJCWlmICghTkxQX0NIS19OT0RFX0FDVChuZGxwKSkKKwkJCWlmICghTkxQX0NIS19OT0RFX0FDVChuZGxwKSkgewogCQkJCW5kbHAgPSBscGZjX2VuYWJsZV9ub2RlKHZwb3J0LCBuZGxwLAogCQkJCQkJTkxQX1NURV9VTlVTRURfTk9ERSk7CiAJCQkJaWYgKCFuZGxwKQogCQkJCQlnb3RvIHNraXBfbG9nbzsKKwkJCX0KIAotCQkJLyogUmVtb3ZlIG5kbHAgZnJvbSB2cG9ydCBucGxkIGxpc3QgKi8KKwkJCS8qIFJlbW92ZSBuZGxwIGZyb20gdnBvcnQgbGlzdCAqLwogCQkJbHBmY19kZXF1ZXVlX25vZGUodnBvcnQsIG5kbHApOwogCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+bmRscF9sb2NrKTsKIAkJCWlmICghTkxQX0NIS19GUkVFX1JFUShuZGxwKSkKQEAgLTcxMSw4ICs3MTIsMTcgQEAKIAkJCX0KIAkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+bmRscF9sb2NrKTsKIAkJfQotCQlpZiAoISh2cG9ydC0+dnBpX3N0YXRlICYgTFBGQ19WUElfUkVHSVNURVJFRCkpCisKKwkJLyoKKwkJICogSWYgdGhlIHZwaSBpcyBub3QgcmVnaXN0ZXJlZCwgdGhlbiBhIHZhbGlkIEZESVNDIGRvZXNuJ3QKKwkJICogZXhpc3QgYW5kIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgRUxTIExPR08uICBKdXN0IGNsZWFudXAKKwkJICogdGhlIG5kbHAuCisJCSAqLworCQlpZiAoISh2cG9ydC0+dnBpX3N0YXRlICYgTFBGQ19WUElfUkVHSVNURVJFRCkpIHsKKwkJCWxwZmNfbmxwX3B1dChuZGxwKTsKIAkJCWdvdG8gc2tpcF9sb2dvOworCQl9CisKIAkJdnBvcnQtPnVucmVnX3ZwaV9jbXBsID0gVlBPUlRfSU5WQUw7CiAJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHBoYmEtPmZjX3JhdG92ICogMjAwMCk7CiAJCWlmICghbHBmY19pc3N1ZV9lbHNfbnBpdl9sb2dvKHZwb3J0LCBuZGxwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKaW5kZXggNmM0MmRmZi4uZTYxNzMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKKysrIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZGJkbWEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hY19lc3AuYyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKaW5kZXggMzg5MzMzNy4uNTkwY2UxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hY19lc3AuYworKysgYi9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCkBAIC0yMzAsOSArMjMwLDYgQEAKIAkJCQkgIHUzMiBkbWFfY291bnQsIGludCB3cml0ZSwgdTggY21kKQogewogCXN0cnVjdCBtYWNfZXNwX3ByaXYgKm1lcCA9IE1BQ19FU1BfR0VUX1BSSVYoZXNwKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJbWVwLT5lcnJvciA9IDA7CiAKQEAgLTI3MCw4ICsyNjcsNiBAQAogCQkJZXNwX2NvdW50ID0gbjsKIAkJfQogCX0gd2hpbGUgKGVzcF9jb3VudCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCkBAIC0zNTMsOCArMzQ4LDYgQEAKIAlzdHJ1Y3QgbWFjX2VzcF9wcml2ICptZXAgPSBNQUNfRVNQX0dFVF9QUklWKGVzcCk7CiAJdTggKmZpZm8gPSBlc3AtPnJlZ3MgKyBFU1BfRkRBVEEgKiAxNjsKIAotCWRpc2FibGVfaXJxKGVzcC0+aG9zdC0+aXJxKTsKLQogCWNtZCAmPSB+RVNQX0NNRF9ETUE7CiAJbWVwLT5lcnJvciA9IDA7CiAKQEAgLTQzMSw4ICs0MjQsNiBAQAogCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CiAJCX0KIAl9Ci0KLQllbmFibGVfaXJxKGVzcC0+aG9zdC0+aXJxKTsKIH0KIAogc3RhdGljIGludCBtYWNfZXNwX2lycV9wZW5kaW5nKHN0cnVjdCBlc3AgKmVzcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCmluZGV4IDg4ODNjYTMuLjM1YmQxMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtNzEsNiArNzEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAibWVnYXJhaWRfbWJveC5oIgogCiBzdGF0aWMgaW50IG1lZ2FyYWlkX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKaW5kZXggMzk0OGEwMC4uZGQ5NGM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaApAQCAtMzMsOSArMzMsOSBAQAogLyoKICAqIE1lZ2FSQUlEIFNBUyBEcml2ZXIgbWV0YSBkYXRhCiAgKi8KLSNkZWZpbmUgTUVHQVNBU19WRVJTSU9OCQkJCSIwMC4wMC4wNS40MC1yYzEiCi0jZGVmaW5lIE1FR0FTQVNfUkVMREFURQkJCQkiSnVsLiAyNiwgMjAxMSIKLSNkZWZpbmUgTUVHQVNBU19FWFRfVkVSU0lPTgkJCSJUdWUuIEp1bC4gMjYgMTc6MDA6MDAgUERUIDIwMTEiCisjZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDAuMDAuMDYuMTItcmMxIgorI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIk9jdC4gNSwgMjAxMSIKKyNkZWZpbmUgTUVHQVNBU19FWFRfVkVSU0lPTgkJCSJXZWQuIE9jdC4gNSAxNzowMDowMCBQRFQgMjAxMSIKIAogLyoKICAqIERldmljZSBJRHMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUJUENJX0RFVklDRV9JRF9MU0lfU0FTMDA3M1NLSU5OWQkJMHgwMDczCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkJCTB4MDA3MQogI2RlZmluZQlQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04JCTB4MDA1YgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSCQkweDAwNWQKIAogLyoKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEzOCw2ICsxMzksNyBAQAogI2RlZmluZSBNRklfQ01EX0FCT1JUCQkJCTB4MDYKICNkZWZpbmUgTUZJX0NNRF9TTVAJCQkJMHgwNwogI2RlZmluZSBNRklfQ01EX1NUUAkJCQkweDA4CisjZGVmaW5lIE1GSV9DTURfSU5WQUxJRAkJCQkweGZmCiAKICNkZWZpbmUgTVJfRENNRF9DVFJMX0dFVF9JTkZPCQkJMHgwMTAxMDAwMAogI2RlZmluZSBNUl9EQ01EX0xEX0dFVF9MSVNUCQkJMHgwMzAxMDAwMApAQCAtMjIxLDYgKzIyMyw3IEBACiAJTUZJX1NUQVRfUkVTRVJWQVRJT05fSU5fUFJPR1JFU1MgPSAweDM2LAogCU1GSV9TVEFUX0kyQ19FUlJPUlNfREVURUNURUQgPSAweDM3LAogCU1GSV9TVEFUX1BDSV9FUlJPUlNfREVURUNURUQgPSAweDM4LAorCU1GSV9TVEFUX0NPTkZJR19TRVFfTUlTTUFUQ0ggPSAweDY3LAogCiAJTUZJX1NUQVRfSU5WQUxJRF9TVEFUVVMgPSAweEZGCiB9OwpAQCAtNzE2LDcgKzcxOSw3IEBACiAjZGVmaW5lIE1FR0FTQVNfREVGQVVMVF9JTklUX0lECQkJLTEKICNkZWZpbmUgTUVHQVNBU19NQVhfTFVOCQkJCTgKICNkZWZpbmUgTUVHQVNBU19NQVhfTEQJCQkJNjQKLSNkZWZpbmUgTUVHQVNBU19ERUZBVUxUX0NNRF9QRVJfTFVOCQkxMjgKKyNkZWZpbmUgTUVHQVNBU19ERUZBVUxUX0NNRF9QRVJfTFVOCQkyNTYKICNkZWZpbmUgTUVHQVNBU19NQVhfUEQgICAgICAgICAgICAgICAgICAgICAgICAgIChNRUdBU0FTX01BWF9QRF9DSEFOTkVMUyAqIFwKIAkJCQkJCU1FR0FTQVNfTUFYX0RFVl9QRVJfQ0hBTk5FTCkKICNkZWZpbmUgTUVHQVNBU19NQVhfTERfSURTCQkJKE1FR0FTQVNfTUFYX0xEX0NIQU5ORUxTICogXApAQCAtNzU1LDYgKzc1OCw3IEBACiAjZGVmaW5lIE1FR0FTQVNfSU5UX0NNRFMJCQkzMgogI2RlZmluZSBNRUdBU0FTX1NLSU5OWV9JTlRfQ01EUwkJCTUKIAorI2RlZmluZSBNRUdBU0FTX01BWF9NU0lYX1FVRVVFUwkJCTE2CiAvKgogICogRlcgY2FuIGFjY2VwdCBib3RoIDMyIGFuZCA2NCBiaXQgU0dMcy4gV2Ugd2FudCB0byBhbGxvY2F0ZSAzMi82NCBiaXQKICAqIFNHTHMgYmFzZWQgb24gdGhlIHNpemUgb2YgZG1hX2FkZHJfdApAQCAtMTI3Niw2ICsxMjgwLDExIEBACiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOwogfTsKIAorc3RydWN0IG1lZ2FzYXNfaXJxX2NvbnRleHQgeworCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKKwl1MzIgTVNJeEluZGV4OworfTsKKwogc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgewogCiAJdTMyICpwcm9kdWNlcjsKQEAgLTEzNDksOCArMTM1OCw5IEBACiAKIAkvKiBQdHIgdG8gaGJhIHNwZWNpZmljIGluZm9ybWF0aW9uICovCiAJdm9pZCAqY3RybF9jb250ZXh0OwotCXU4CW1zaV9mbGFnOwotCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhlbnRyeTsKKwl1bnNpZ25lZCBpbnQgbXNpeF92ZWN0b3JzOworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhlbnRyeVtNRUdBU0FTX01BWF9NU0lYX1FVRVVFU107CisJc3RydWN0IG1lZ2FzYXNfaXJxX2NvbnRleHQgaXJxX2NvbnRleHRbTUVHQVNBU19NQVhfTVNJWF9RVUVVRVNdOwogCXU2NCBtYXBfaWQ7CiAJc3RydWN0IG1lZ2FzYXNfY21kICptYXBfdXBkYXRlX2NtZDsKIAl1bnNpZ25lZCBsb25nIGJhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKaW5kZXggNzc2ZDAxOS4uMjlhOTk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICoKICAqICBGSUxFOiBtZWdhcmFpZF9zYXNfYmFzZS5jCi0gKiAgVmVyc2lvbiA6IHYwMC4wMC4wNS40MC1yYzEKKyAqICBWZXJzaW9uIDogdjAwLjAwLjA2LjEyLXJjMQogICoKICAqICBBdXRob3JzOiBMU0kgQ29ycG9yYXRpb24KICAqICAgICAgICAgICBTcmVlbml2YXMgQmFnYWxrb3RlCkBAIC04NCw3ICs4NCw3IEBACiBNT0RVTEVfQVVUSE9SKCJtZWdhcmFpZGxpbnV4QGxzaS5jb20iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTFNJIE1lZ2FSQUlEIFNBUyBEcml2ZXIiKTsKIAotaW50IG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIGludCBvY3IpOwogc3RhdGljIGludCBtZWdhc2FzX2dldF9wZF9saXN0KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiBzdGF0aWMgaW50IG1lZ2FzYXNfaXNzdWVfaW5pdF9tZmkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIHN0YXRpYyBpbnQgbWVnYXNhc19yZWdpc3Rlcl9hZW4oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLApAQCAtMTE0LDYgKzExNCw4IEBACiAJLyogeHNjYWxlIElPUCAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pfSwKIAkvKiBGdXNpb24gKi8KKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUil9LAorCS8qIEludmFkZXIgKi8KIAl7fQogfTsKIApAQCAtMjEzLDYgKzIxNSwxMCBAQAogCiAJY21kLT5zY21kID0gTlVMTDsKIAljbWQtPmZyYW1lX2NvdW50ID0gMDsKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSAmJgorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSAmJgorCSAgICAocmVzZXRfZGV2aWNlcykpCisJCWNtZC0+ZnJhbWUtPmhkci5jbWQgPSBNRklfQ01EX0lOVkFMSUQ7CiAJbGlzdF9hZGRfdGFpbCgmY21kLT5saXN0LCAmaW5zdGFuY2UtPmNtZF9wb29sKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5jbWRfcG9vbF9sb2NrLCBmbGFncyk7CkBAIC0xNTgzLDcgKzE1ODksOCBAQAogewogCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDczU0tJTk5ZKSB8fAogCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9TQVMwMDcxU0tJTk5ZKSB8fAotCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pKSB7CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpIHsKIAkJd3JpdGVsKE1GSV9TVE9QX0FEUCwgJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7CiAJfSBlbHNlIHsKIAkJd3JpdGVsKE1GSV9TVE9QX0FEUCwgJmluc3RhbmNlLT5yZWdfc2V0LT5pbmJvdW5kX2Rvb3JiZWxsKTsKQEAgLTE5MDcsNyArMTkxNCw2IEBACiBzdGF0aWMgZW51bQogYmxrX2VoX3RpbWVyX3JldHVybiBtZWdhc2FzX3Jlc2V0X3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7Ci0Jc3RydWN0IG1lZ2FzYXNfY21kICpjbWQgPSAoc3RydWN0IG1lZ2FzYXNfY21kICopc2NtZC0+U0NwLnB0cjsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTkxNiw3ICsxOTIyLDcgQEAKIAkJcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKIAl9CiAKLQlpbnN0YW5jZSA9IGNtZC0+aW5zdGFuY2U7CisJaW5zdGFuY2UgPSAoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKilzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCWlmICghKGluc3RhbmNlLT5mbGFnICYgTUVHQVNBU19GV19CVVNZKSkgewogCQkvKiBGVyBpcyBidXN5LCB0aHJvdHRsZSBJTyAqLwogCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CkBAIC0xOTU3LDcgKzE5NjMsOCBAQAogCS8qCiAJICogRmlyc3Qgd2FpdCBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlCiAJICovCi0JaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKQorCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJICAgIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKQogCQlyZXQgPSBtZWdhc2FzX3Jlc2V0X2Z1c2lvbihzY21kLT5kZXZpY2UtPmhvc3QpOwogCWVsc2UKIAkJcmV0ID0gbWVnYXNhc19nZW5lcmljX3Jlc2V0KHNjbWQpOwpAQCAtMjE2MSw3ICsyMTY4LDE2IEBACiAJCWNtZC0+c2NtZC0+U0NwLnB0ciA9IE5VTEw7CiAKIAlzd2l0Y2ggKGhkci0+Y21kKSB7Ci0KKwljYXNlIE1GSV9DTURfSU5WQUxJRDoKKwkJLyogU29tZSBvbGRlciAxMDY4IGNvbnRyb2xsZXIgRlcgbWF5IGtlZXAgYSBwZW5kZWQKKwkJICAgTVJfRENNRF9DVFJMX0VWRU5UX0dFVF9JTkZPIGxlZnQgb3ZlciBmcm9tIHRoZSBtYWluIGtlcm5lbAorCQkgICB3aGVuIGJvb3RpbmcgdGhlIGtkdW1wIGtlcm5lbC4gIElnbm9yZSB0aGlzIGNvbW1hbmQgdG8KKwkJICAgcHJldmVudCBhIGtlcm5lbCBwYW5pYyBvbiBzaHV0ZG93biBvZiB0aGUga2R1bXAga2VybmVsLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZWdhcmFpZF9zYXM6IE1GSV9DTURfSU5WQUxJRCBjb21tYW5kICIKKwkJICAgICAgICJjb21wbGV0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBJZiB5b3UgaGF2ZSBhIGNvbnRyb2xsZXIgIgorCQkgICAgICAgIm90aGVyIHRoYW4gUEVSQzUsIHBsZWFzZSB1cGdyYWRlIHlvdXIgZmlybXdhcmUuXG4iKTsKKwkJYnJlYWs7CiAJY2FzZSBNRklfQ01EX1BEX1NDU0lfSU86CiAJY2FzZSBNRklfQ01EX0xEX1NDU0lfSU86CiAKQEAgLTI0NzcsNyArMjQ5Myw3IEBACiAJCQltc2xlZXAoMTAwMCk7CiAJCX0KIAotCQlpZiAobWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KGluc3RhbmNlKSkgeworCQlpZiAobWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KGluc3RhbmNlLCAxKSkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJtZWdhcmFpZF9zYXM6YWRhcHRlciBub3QgcmVhZHlcbiIpOwogCiAJCQltZWdhcmFpZF9zYXNfa2lsbF9oYmEoaW5zdGFuY2UpOwpAQCAtMjUzMiw3ICsyNTQ4LDcgQEAKIAkJCQkJCWluc3RhbmNlLT5yZWdfc2V0KQogCQkJCQkJKSA9PSAwKSB7CiAJCS8qIEhhcmR3YXJlIG1heSBub3Qgc2V0IG91dGJvdW5kX2ludHJfc3RhdHVzIGluIE1TSS1YIG1vZGUgKi8KLQkJaWYgKCFpbnN0YW5jZS0+bXNpX2ZsYWcpCisJCWlmICghaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKIAkJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTI1OTAsMTYgKzI2MDYsMTQgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IG1lZ2FzYXNfaXNyKGludCBpcnEsIHZvaWQgKmRldnApCiB7Ci0Jc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlOworCXN0cnVjdCBtZWdhc2FzX2lycV9jb250ZXh0ICppcnFfY29udGV4dCA9IGRldnA7CisJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0gaXJxX2NvbnRleHQtPmluc3RhbmNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaXJxcmV0dXJuX3QJcmM7CiAKLQlpZiAoYXRvbWljX3JlYWQoCi0JCSYoKChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKWRldnApLT5md19yZXNldF9ub19wY2lfYWNjZXNzKSkpCisJaWYgKGF0b21pY19yZWFkKCZpbnN0YW5jZS0+ZndfcmVzZXRfbm9fcGNpX2FjY2VzcykpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAotCWluc3RhbmNlID0gKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICopZGV2cDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+aGJhX2xvY2ssIGZsYWdzKTsKIAlyYyA9ICBtZWdhc2FzX2RlcGxldGVfcmVwbHlfcXVldWUoaW5zdGFuY2UsIERJRF9PSyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CkBAIC0yNjE3LDcgKzI2MzEsNyBAQAogICogaGFzIHRvIHdhaXQgZm9yIHRoZSByZWFkeSBzdGF0ZS4KICAqLwogaW50Ci1tZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UqIGluc3RhbmNlKQorbWVnYXNhc190cmFuc2l0aW9uX3RvX3JlYWR5KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgaW50IG9jcikKIHsKIAlpbnQgaTsKIAl1OCBtYXhfd2FpdDsKQEAgLTI2MzksMTEgKzI2NTMsMTMgQEAKIAkJc3dpdGNoIChmd19zdGF0ZSkgewogCiAJCWNhc2UgTUZJX1NUQVRFX0ZBVUxUOgotCiAJCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRlcgaW4gRkFVTFQgc3RhdGUhIVxuIik7Ci0JCQltYXhfd2FpdCA9IE1FR0FTQVNfUkVTRVRfV0FJVF9USU1FOwotCQkJY3VyX3N0YXRlID0gTUZJX1NUQVRFX0ZBVUxUOwotCQkJYnJlYWs7CisJCQlpZiAob2NyKSB7CisJCQkJbWF4X3dhaXQgPSBNRUdBU0FTX1JFU0VUX1dBSVRfVElNRTsKKwkJCQljdXJfc3RhdGUgPSBNRklfU1RBVEVfRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQljYXNlIE1GSV9TVEFURV9XQUlUX0hBTkRTSEFLRToKIAkJCS8qCkBAIC0yNjU0LDcgKzI2NzAsOSBAQAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJIFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpIHx8CiAJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KLQkJCQkgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSkgeworCQkJCSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJCQkJKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQlQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkgewogCQkJCXdyaXRlbCgKIAkJCQkgIE1GSV9JTklUX0NMRUFSX0hBTkRTSEFLRXxNRklfSU5JVF9IT1RQTFVHLAogCQkJCSAgJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7CkBAIC0yNjc0LDcgKzI2OTIsOSBAQAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CiAJCQkJIFBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpIHx8CiAJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KLQkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSkgeworCQkJICAgICBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHx8CisJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCSAgICAgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpIHsKIAkJCQl3cml0ZWwoTUZJX0lOSVRfSE9UUExVRywKIAkJCQkgICAgICAgJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7CiAJCQl9IGVsc2UKQEAgLTI2OTUsMTEgKzI3MTUsMTUgQEAKIAkJCQkoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PQogCQkJCVBDSV9ERVZJQ0VfSURfTFNJX1NBUzAwNzFTS0lOTlkpICB8fAogCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCi0JCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikpIHsKKwkJCQkJPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCQkJCShpbnN0YW5jZS0+cGRldi0+ZGV2aWNlCisJCQkJCT09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKSB7CiAJCQkJd3JpdGVsKE1GSV9SRVNFVF9GTEFHUywKIAkJCQkJJmluc3RhbmNlLT5yZWdfc2V0LT5kb29yYmVsbCk7Ci0JCQkJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KLQkJCQkgICAgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB7CisJCQkJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkJICAgIFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkJCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0KKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpKSB7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCAoMTAgKiAxMDAwKTsgaSArPSAyMCkgewogCQkJCQkJaWYgKHJlYWRsKAogCQkJCQkJCSAgICAmaW5zdGFuY2UtPgpAQCAtMjkyMiw2ICsyOTQ2LDEwIEBACiAJCW1lbXNldChjbWQtPmZyYW1lLCAwLCB0b3RhbF9zeik7CiAJCWNtZC0+ZnJhbWUtPmlvLmNvbnRleHQgPSBjbWQtPmluZGV4OwogCQljbWQtPmZyYW1lLT5pby5wYWRfMCA9IDA7CisJCWlmICgoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pICYmCisJCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSAmJgorCQkgICAgKHJlc2V0X2RldmljZXMpKQorCQkJY21kLT5mcmFtZS0+aGRyLmNtZCA9IE1GSV9DTURfSU5WQUxJRDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM0NzQsNiArMzUwMiw3IEBACiAJc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ19zZXQ7CiAJc3RydWN0IG1lZ2FzYXNfY3RybF9pbmZvICpjdHJsX2luZm87CiAJdW5zaWduZWQgbG9uZyBiYXJfbGlzdDsKKwlpbnQgaTsKIAogCS8qIEZpbmQgZmlyc3QgbWVtb3J5IGJhciAqLwogCWJhcl9saXN0ID0gcGNpX3NlbGVjdF9iYXJzKGluc3RhbmNlLT5wZGV2LCBJT1JFU09VUkNFX01FTSk7CkBAIC0zNDk2LDYgKzM1MjUsNyBAQAogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCQlpbnN0YW5jZS0+aW5zdGFuY2V0ID0gJm1lZ2FzYXNfaW5zdGFuY2VfdGVtcGxhdGVfZnVzaW9uOwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTFNJX1NBUzEwNzhSOgpAQCAtMzUyMCwxNSArMzU1MCwzOSBAQAogCS8qCiAJICogV2UgZXhwZWN0IHRoZSBGVyBzdGF0ZSB0byBiZSBSRUFEWQogCSAqLwotCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UpKQorCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UsIDApKQogCQlnb3RvIGZhaWxfcmVhZHlfc3RhdGU7CiAKIAkvKiBDaGVjayBpZiBNU0ktWCBpcyBzdXBwb3J0ZWQgd2hpbGUgaW4gcmVhZHkgc3RhdGUgKi8KIAltc2l4X2VuYWJsZSA9IChpbnN0YW5jZS0+aW5zdGFuY2V0LT5yZWFkX2Z3X3N0YXR1c19yZWcocmVnX3NldCkgJgogCQkgICAgICAgMHg0MDAwMDAwKSA+PiAweDFhOwotCWlmIChtc2l4X2VuYWJsZSAmJiAhbXNpeF9kaXNhYmxlICYmCi0JICAgICFwY2lfZW5hYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYsICZpbnN0YW5jZS0+bXNpeGVudHJ5LCAxKSkKLQkJaW5zdGFuY2UtPm1zaV9mbGFnID0gMTsKKwlpZiAobXNpeF9lbmFibGUgJiYgIW1zaXhfZGlzYWJsZSkgeworCQkvKiBDaGVjayBtYXggTVNJLVggdmVjdG9ycyAqLworCQlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpIHsKKwkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSAocmVhZGwoJmluc3RhbmNlLT5yZWdfc2V0LT4KKwkJCQkJCQlvdXRib3VuZF9zY3JhdGNoX3BhZF8yCisJCQkJCQkJICApICYgMHgxRikgKyAxOworCQl9IGVsc2UKKwkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSAxOworCQkvKiBEb24ndCBib3RoZXIgYWxsb2NhdGluZyBtb3JlIE1TSS1YIHZlY3RvcnMgdGhhbiBjcHVzICovCisJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSBtaW4oaW5zdGFuY2UtPm1zaXhfdmVjdG9ycywKKwkJCQkJICAgICAodW5zaWduZWQgaW50KW51bV9vbmxpbmVfY3B1cygpKTsKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnM7IGkrKykKKwkJCWluc3RhbmNlLT5tc2l4ZW50cnlbaV0uZW50cnkgPSBpOworCQlpID0gcGNpX2VuYWJsZV9tc2l4KGluc3RhbmNlLT5wZGV2LCBpbnN0YW5jZS0+bXNpeGVudHJ5LAorCQkJCSAgICBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKTsKKwkJaWYgKGkgPj0gMCkgeworCQkJaWYgKGkpIHsKKwkJCQlpZiAoIXBjaV9lbmFibGVfbXNpeChpbnN0YW5jZS0+cGRldiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPm1zaXhlbnRyeSwgaSkpCisJCQkJCWluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPSBpOworCQkJCWVsc2UKKwkJCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IDA7CisJCQl9CisJCX0gZWxzZQorCQkJaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA9IDA7CisJfQogCiAJLyogR2V0IG9wZXJhdGlvbmFsIHBhcmFtcywgc2dlIGZsYWdzLCBzZW5kIGluaXQgY21kIHRvIGNvbnRyb2xsZXIgKi8KIAlpZiAoaW5zdGFuY2UtPmluc3RhbmNldC0+aW5pdF9hZGFwdGVyKGluc3RhbmNlKSkKQEAgLTM4OTIsNyArMzk0Niw4IEBACiAJaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKIAogCS8qIEZ1c2lvbiBvbmx5IHN1cHBvcnRzIGhvc3QgcmVzZXQgKi8KLQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pIHsKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkgewogCQlob3N0LT5ob3N0dC0+ZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBOVUxMOwogCQlob3N0LT5ob3N0dC0+ZWhfYnVzX3Jlc2V0X2hhbmRsZXIgPSBOVUxMOwogCX0KQEAgLTM5NDIsNyArMzk5Nyw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogbWVnYXNhc19wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcnZhbCwgcG9zOworCWludCBydmFsLCBwb3MsIGksIGo7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CiAJdTE2IGNvbnRyb2wgPSAwOwpAQCAtNDAwMiw2ICs0MDU3LDcgQEAKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAl7CiAJCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwogCkBAIC00MDk0LDcgKzQxNTAsOCBAQAogCWluc3RhbmNlLT5sYXN0X3RpbWUgPSAwOwogCWluc3RhbmNlLT5kaXNhYmxlT25saW5lQ3RybFJlc2V0ID0gMTsKIAotCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikKKwlpZiAoKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OKSB8fAorCSAgICAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSkKIAkJSU5JVF9XT1JLKCZpbnN0YW5jZS0+d29ya19pbml0LCBtZWdhc2FzX2Z1c2lvbl9vY3Jfd3EpOwogCWVsc2UKIAkJSU5JVF9XT1JLKCZpbnN0YW5jZS0+d29ya19pbml0LCBwcm9jZXNzX2Z3X3N0YXRlX2NoYW5nZV93cSk7CkBAIC00MTA4LDExICs0MTY1LDMyIEBACiAJLyoKIAkgKiBSZWdpc3RlciBJUlEKIAkgKi8KLQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPm1zaV9mbGFnID8gaW5zdGFuY2UtPm1zaXhlbnRyeS52ZWN0b3IgOgotCQkJcGRldi0+aXJxLCBpbnN0YW5jZS0+aW5zdGFuY2V0LT5zZXJ2aWNlX2lzciwKLQkJCUlSUUZfU0hBUkVELCAibWVnYXNhcyIsIGluc3RhbmNlKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7Ci0JCWdvdG8gZmFpbF9pcnE7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLk1TSXhJbmRleCA9IGk7CisJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLCAwLAorCQkJCQkibWVnYXNhcyIsCisJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byAiCisJCQkJICAgICAgICJyZWdpc3RlciBJUlEgZm9yIHZlY3RvciAlZC5cbiIsIGkpOworCQkJCWZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKwkJCQkJZnJlZV9pcnEoCisJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwKKwkJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbal0pOworCQkJCWdvdG8gZmFpbF9pcnE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKKwkJaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdLk1TSXhJbmRleCA9IDA7CisJCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLAorCQkJCUlSUUZfU0hBUkVELCAibWVnYXNhcyIsCisJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJCWdvdG8gZmFpbF9pcnE7CisJCX0KIAl9CiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7CkBAIC00MTU2LDE1ICs0MjM0LDIwIEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW5zdGFuY2UtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKLQlmcmVlX2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCSBpbnN0YW5jZS0+cGRldi0+aXJxLCBpbnN0YW5jZSk7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCisJCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCWVsc2UKKwkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CiBmYWlsX2lycToKLQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT04pCisJaWYgKChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0ZVU0lPTikgfHwKKwkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpCiAJCW1lZ2FzYXNfcmVsZWFzZV9mdXNpb24oaW5zdGFuY2UpOwogCWVsc2UKIAkJbWVnYXNhc19yZWxlYXNlX21maShpbnN0YW5jZSk7CiAgICAgICBmYWlsX2luaXRfbWZpOgotCWlmIChpbnN0YW5jZS0+bXNpX2ZsYWcpCisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCiAJCXBjaV9kaXNhYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYpOwogICAgICAgZmFpbF9hbGxvY19kbWFfYnVmOgogCWlmIChpbnN0YW5jZS0+ZXZ0X2RldGFpbCkKQEAgLTQyODAsNiArNDM2Myw3IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2U7CisJaW50IGk7CiAKIAlpbnN0YW5jZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlob3N0ID0gaW5zdGFuY2UtPmhvc3Q7CkBAIC00MzAzLDkgKzQzODcsMTQgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UpOwogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7Ci0JZnJlZV9pcnEoaW5zdGFuY2UtPm1zaV9mbGFnID8gaW5zdGFuY2UtPm1zaXhlbnRyeS52ZWN0b3IgOgotCQkgaW5zdGFuY2UtPnBkZXYtPmlycSwgaW5zdGFuY2UpOwotCWlmIChpbnN0YW5jZS0+bXNpX2ZsYWcpCisKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspCisJCQlmcmVlX2lycShpbnN0YW5jZS0+bXNpeGVudHJ5W2ldLnZlY3RvciwKKwkJCQkgJmluc3RhbmNlLT5pcnFfY29udGV4dFtpXSk7CisJZWxzZQorCQlmcmVlX2lycShpbnN0YW5jZS0+cGRldi0+aXJxLCAmaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdKTsKKwlpZiAoaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykKIAkJcGNpX2Rpc2FibGVfbXNpeChpbnN0YW5jZS0+cGRldik7CiAKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKQEAgLTQzMjMsNyArNDQxMiw3IEBACiBzdGF0aWMgaW50CiBtZWdhc2FzX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpbnQgcnZhbDsKKwlpbnQgcnZhbCwgaSwgajsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZTsKIApAQCAtNDM1NywxNSArNDQ0NiwxNyBAQAogCS8qCiAJICogV2UgZXhwZWN0IHRoZSBGVyBzdGF0ZSB0byBiZSBSRUFEWQogCSAqLwotCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UpKQorCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UsIDApKQogCQlnb3RvIGZhaWxfcmVhZHlfc3RhdGU7CiAKIAkvKiBOb3cgcmUtZW5hYmxlIE1TSS1YICovCi0JaWYgKGluc3RhbmNlLT5tc2lfZmxhZykKLQkJcGNpX2VuYWJsZV9tc2l4KGluc3RhbmNlLT5wZGV2LCAmaW5zdGFuY2UtPm1zaXhlbnRyeSwgMSk7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCisJCXBjaV9lbmFibGVfbXNpeChpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UtPm1zaXhlbnRyeSwKKwkJCQlpbnN0YW5jZS0+bXNpeF92ZWN0b3JzKTsKIAogCXN3aXRjaCAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfRlVTSU9OOgorCWNhc2UgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUjoKIAl7CiAJCW1lZ2FzYXNfcmVzZXRfcmVwbHlfZGVzYyhpbnN0YW5jZSk7CiAJCWlmIChtZWdhc2FzX2lvY19pbml0X2Z1c2lvbihpbnN0YW5jZSkpIHsKQEAgLTQzOTEsMTEgKzQ0ODIsMzIgQEAKIAkvKgogCSAqIFJlZ2lzdGVyIElSUQogCSAqLwotCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+bXNpX2ZsYWcgPyBpbnN0YW5jZS0+bXNpeGVudHJ5LnZlY3RvciA6Ci0JCQlwZGV2LT5pcnEsIGluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLAotCQkJSVJRRl9TSEFSRUQsICJtZWdhc2FzIiwgaW5zdGFuY2UpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWVnYXNhczogRmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7Ci0JCWdvdG8gZmFpbF9pcnE7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzOyBpKyspIHsKKwkJCWluc3RhbmNlLT5pcnFfY29udGV4dFtpXS5pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJaW5zdGFuY2UtPmlycV9jb250ZXh0W2ldLk1TSXhJbmRleCA9IGk7CisJCQlpZiAocmVxdWVzdF9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLCAwLAorCQkJCQkibWVnYXNhcyIsCisJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1lZ2FzYXM6IEZhaWxlZCB0byAiCisJCQkJICAgICAgICJyZWdpc3RlciBJUlEgZm9yIHZlY3RvciAlZC5cbiIsIGkpOworCQkJCWZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykKKwkJCQkJZnJlZV9pcnEoCisJCQkJCQlpbnN0YW5jZS0+bXNpeGVudHJ5W2pdLnZlY3RvciwKKwkJCQkJCSZpbnN0YW5jZS0+aXJxX2NvbnRleHRbal0pOworCQkJCWdvdG8gZmFpbF9pcnE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+aXJxX2NvbnRleHRbMF0uaW5zdGFuY2UgPSBpbnN0YW5jZTsKKwkJaW5zdGFuY2UtPmlycV9jb250ZXh0WzBdLk1TSXhJbmRleCA9IDA7CisJCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIGluc3RhbmNlLT5pbnN0YW5jZXQtPnNlcnZpY2VfaXNyLAorCQkJCUlSUUZfU0hBUkVELCAibWVnYXNhcyIsCisJCQkJJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtZWdhc2FzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJCWdvdG8gZmFpbF9pcnE7CisJCX0KIAl9CiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5lbmFibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7CkBAIC00NDkyLDEzICs0NjA0LDE4IEBACiAKIAlpbnN0YW5jZS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCi0JZnJlZV9pcnEoaW5zdGFuY2UtPm1zaV9mbGFnID8gaW5zdGFuY2UtPm1zaXhlbnRyeS52ZWN0b3IgOgotCQkgaW5zdGFuY2UtPnBkZXYtPmlycSwgaW5zdGFuY2UpOwotCWlmIChpbnN0YW5jZS0+bXNpX2ZsYWcpCisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCisJCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCWVsc2UKKwkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCiAJCXBjaV9kaXNhYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYpOwogCiAJc3dpdGNoIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9GVVNJT046CisJY2FzZSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSOgogCQltZWdhc2FzX3JlbGVhc2VfZnVzaW9uKGluc3RhbmNlKTsKIAkJZm9yIChpID0gMDsgaSA8IDIgOyBpKyspCiAJCQlpZiAoZnVzaW9uLT5sZF9tYXBbaV0pCkBAIC00NTM5LDE0ICs0NjU2LDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIG1lZ2FzYXNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CisJaW50IGk7CiAJc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCiAJaW5zdGFuY2UtPnVubG9hZCA9IDE7CiAJbWVnYXNhc19mbHVzaF9jYWNoZShpbnN0YW5jZSk7CiAJbWVnYXNhc19zaHV0ZG93bl9jb250cm9sbGVyKGluc3RhbmNlLCBNUl9EQ01EX0NUUkxfU0hVVERPV04pOwogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmRpc2FibGVfaW50cihpbnN0YW5jZS0+cmVnX3NldCk7Ci0JZnJlZV9pcnEoaW5zdGFuY2UtPm1zaV9mbGFnID8gaW5zdGFuY2UtPm1zaXhlbnRyeS52ZWN0b3IgOgotCQkgaW5zdGFuY2UtPnBkZXYtPmlycSwgaW5zdGFuY2UpOwotCWlmIChpbnN0YW5jZS0+bXNpX2ZsYWcpCisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCisJCWZvciAoaSA9IDAgOyBpIDwgaW5zdGFuY2UtPm1zaXhfdmVjdG9yczsgaSsrKQorCQkJZnJlZV9pcnEoaW5zdGFuY2UtPm1zaXhlbnRyeVtpXS52ZWN0b3IsCisJCQkJICZpbnN0YW5jZS0+aXJxX2NvbnRleHRbaV0pOworCWVsc2UKKwkJZnJlZV9pcnEoaW5zdGFuY2UtPnBkZXYtPmlycSwgJmluc3RhbmNlLT5pcnFfY29udGV4dFswXSk7CisJaWYgKGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMpCiAJCXBjaV9kaXNhYmxlX21zaXgoaW5zdGFuY2UtPnBkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKaW5kZXggNWE1YWYxZi4uNTI1NWRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKICNpbmNsdWRlICJtZWdhcmFpZF9zYXNfZnVzaW9uLmgiCisjaW5jbHVkZSAibWVnYXJhaWRfc2FzLmgiCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNkZWZpbmUgQUJTX0RJRkYoYSwgYikgICAoKChhKSA+IChiKSkgPyAoKGEpIC0gKGIpKSA6ICgoYikgLSAoYSkpKQpAQCAtMjI2LDggKzIyNyw5IEBACiAqICAgIHNwYW4gICAgICAgICAgLSBTcGFuIG51bWJlcgogKiAgICBibG9jayAgICAgICAgIC0gQWJzb2x1dGUgQmxvY2sgbnVtYmVyIGluIHRoZSBwaHlzaWNhbCBkaXNrCiAqLwotdTggTVJfR2V0UGh5UGFyYW1zKHUzMiBsZCwgdTY0IHN0cmlwUm93LCB1MTYgc3RyaXBSZWYsIHU2NCAqcGRCbG9jaywKLQkJICAgdTE2ICpwRGV2SGFuZGxlLCBzdHJ1Y3QgUkFJRF9DT05URVhUICpwUkFJRF9Db250ZXh0LAordTggTVJfR2V0UGh5UGFyYW1zKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgdTMyIGxkLCB1NjQgc3RyaXBSb3csCisJCSAgIHUxNiBzdHJpcFJlZiwgdTY0ICpwZEJsb2NrLCB1MTYgKnBEZXZIYW5kbGUsCisJCSAgIHN0cnVjdCBSQUlEX0NPTlRFWFQgKnBSQUlEX0NvbnRleHQsCiAJCSAgIHN0cnVjdCBNUl9GV19SQUlEX01BUF9BTEwgKm1hcCkKIHsKIAlzdHJ1Y3QgTVJfTERfUkFJRCAgKnJhaWQgPSBNUl9MZFJhaWRHZXQobGQsIG1hcCk7CkBAIC0yNzksNyArMjgxLDggQEAKIAkJKnBEZXZIYW5kbGUgPSBNUl9QZERldkhhbmRsZUdldChwZCwgbWFwKTsKIAllbHNlIHsKIAkJKnBEZXZIYW5kbGUgPSBNUl9QRF9JTlZBTElEOyAvKiBzZXQgZGV2IGhhbmRsZSBhcyBpbnZhbGlkLiAqLwotCQlpZiAocmFpZC0+bGV2ZWwgPj0gNSkKKwkJaWYgKChyYWlkLT5sZXZlbCA+PSA1KSAmJgorCQkgICAgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikpCiAJCQlwUkFJRF9Db250ZXh0LT5yZWdMb2NrRmxhZ3MgPSBSRUdJT05fVFlQRV9FWENMVVNJVkU7CiAJCWVsc2UgaWYgKHJhaWQtPmxldmVsID09IDEpIHsKIAkJCS8qIEdldCBhbHRlcm5hdGUgUGQuICovCkBAIC0zMDYsNyArMzA5LDggQEAKICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwIGlmIHJlZ2lvbiBsb2NrIHdhcyBhY3F1aXJlZCBPUiByZXR1cm4gbnVtIHN0cmlwcwogKi8KIHU4Ci1NUl9CdWlsZFJhaWRDb250ZXh0KHN0cnVjdCBJT19SRVFVRVNUX0lORk8gKmlvX2luZm8sCitNUl9CdWlsZFJhaWRDb250ZXh0KHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKKwkJICAgIHN0cnVjdCBJT19SRVFVRVNUX0lORk8gKmlvX2luZm8sCiAJCSAgICBzdHJ1Y3QgUkFJRF9DT05URVhUICpwUkFJRF9Db250ZXh0LAogCQkgICAgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKQogewpAQCAtMzk0LDggKzM5OCwxMiBAQAogCX0KIAogCXBSQUlEX0NvbnRleHQtPnRpbWVvdXRWYWx1ZSAgICAgPSBtYXAtPnJhaWRNYXAuZnBQZElvVGltZW91dFNlYzsKLQlwUkFJRF9Db250ZXh0LT5yZWdMb2NrRmxhZ3MgICAgID0gKGlzUmVhZCkgPyBSRUdJT05fVFlQRV9TSEFSRURfUkVBRCA6Ci0JCXJhaWQtPnJlZ1R5cGVSZXFPbldyaXRlOworCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpCisJCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tGbGFncyA9IChpc1JlYWQpID8KKwkJCXJhaWQtPnJlZ1R5cGVSZXFPblJlYWQgOiByYWlkLT5yZWdUeXBlUmVxT25Xcml0ZTsKKwllbHNlCisJCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tGbGFncyA9IChpc1JlYWQpID8KKwkJCVJFR0lPTl9UWVBFX1NIQVJFRF9SRUFEIDogcmFpZC0+cmVnVHlwZVJlcU9uV3JpdGU7CiAJcFJBSURfQ29udGV4dC0+VmlydHVhbERpc2tUZ3RJZCA9IHJhaWQtPnRhcmdldElkOwogCXBSQUlEX0NvbnRleHQtPnJlZ0xvY2tSb3dMQkEgICAgPSByZWdTdGFydDsKIAlwUkFJRF9Db250ZXh0LT5yZWdMb2NrTGVuZ3RoICAgID0gcmVnU2l6ZTsKQEAgLTQwNCw3ICs0MTIsOCBAQAogCS8qR2V0IFBoeSBQYXJhbXMgb25seSBpZiBGUCBjYXBhYmxlLCBvciBlbHNlIGxlYXZlIGl0IHRvIE1SIGZpcm13YXJlCiAJICB0byBkbyB0aGUgY2FsY3VsYXRpb24uKi8KIAlpZiAoaW9faW5mby0+ZnBPa0ZvcklvKSB7Ci0JCXJldHZhbCA9IE1SX0dldFBoeVBhcmFtcyhsZCwgc3RhcnRfc3RyaXAsIHJlZl9pbl9zdGFydF9zdHJpcGUsCisJCXJldHZhbCA9IE1SX0dldFBoeVBhcmFtcyhpbnN0YW5jZSwgbGQsIHN0YXJ0X3N0cmlwLAorCQkJCQkgcmVmX2luX3N0YXJ0X3N0cmlwZSwKIAkJCQkJICZpb19pbmZvLT5wZEJsb2NrLAogCQkJCQkgJmlvX2luZm8tPmRldkhhbmRsZSwgcFJBSURfQ29udGV4dCwKIAkJCQkJIG1hcCk7CkBAIC00MTUsNyArNDI0LDggQEAKIAl9IGVsc2UgaWYgKGlzUmVhZCkgewogCQl1aW50IHN0cmlwSWR4OwogCQlmb3IgKHN0cmlwSWR4ID0gMDsgc3RyaXBJZHggPCBudW1fc3RyaXBzOyBzdHJpcElkeCsrKSB7Ci0JCQlpZiAoIU1SX0dldFBoeVBhcmFtcyhsZCwgc3RhcnRfc3RyaXAgKyBzdHJpcElkeCwKKwkJCWlmICghTVJfR2V0UGh5UGFyYW1zKGluc3RhbmNlLCBsZCwKKwkJCQkJICAgICBzdGFydF9zdHJpcCArIHN0cmlwSWR4LAogCQkJCQkgICAgIHJlZl9pbl9zdGFydF9zdHJpcGUsCiAJCQkJCSAgICAgJmlvX2luZm8tPnBkQmxvY2ssCiAJCQkJCSAgICAgJmlvX2luZm8tPmRldkhhbmRsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCmluZGV4IGYxM2U3YWIuLmJmZDg3ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYwpAQCAtNzQsNyArNzQsOCBAQAogCQkgICAgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKTsKIAogdTgKLU1SX0J1aWxkUmFpZENvbnRleHQoc3RydWN0IElPX1JFUVVFU1RfSU5GTyAqaW9faW5mbywKK01SX0J1aWxkUmFpZENvbnRleHQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICAgc3RydWN0IElPX1JFUVVFU1RfSU5GTyAqaW9faW5mbywKIAkJICAgIHN0cnVjdCBSQUlEX0NPTlRFWFQgKnBSQUlEX0NvbnRleHQsCiAJCSAgICBzdHJ1Y3QgTVJfRldfUkFJRF9NQVBfQUxMICptYXApOwogdTE2IE1SX1RhcmdldElkVG9MZEdldCh1MzIgbGRUZ3RJZCwgc3RydWN0IE1SX0ZXX1JBSURfTUFQX0FMTCAqbWFwKTsKQEAgLTg5LDcgKzkwLDcgQEAKIAkJICAgICAgc3RydWN0IExEX0xPQURfQkFMQU5DRV9JTkZPICpsYkluZm8pOwogdTE2IGdldF91cGRhdGVkX2Rldl9oYW5kbGUoc3RydWN0IExEX0xPQURfQkFMQU5DRV9JTkZPICpsYkluZm8sCiAJCQkgICBzdHJ1Y3QgSU9fUkVRVUVTVF9JTkZPICppbl9pbmZvKTsKLWludCBtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKK2ludCBtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLCBpbnQgb2NyKTsKIHZvaWQgbWVnYXJhaWRfc2FzX2tpbGxfaGJhKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiAKIGV4dGVybiB1MzIgbWVnYXNhc19kYmdfbHZsOwpAQCAtMTAxLDYgKzEwMiwxMCBAQAogdm9pZAogbWVnYXNhc19lbmFibGVfaW50cl9mdXNpb24oc3RydWN0IG1lZ2FzYXNfcmVnaXN0ZXJfc2V0IF9faW9tZW0gKnJlZ3MpCiB7CisJLyogRm9yIFRodW5kZXJib2x0L0ludmFkZXIgYWxzbyBjbGVhciBpbnRyIG9uIGVuYWJsZSAqLworCXdyaXRlbCh+MCwgJnJlZ3MtPm91dGJvdW5kX2ludHJfc3RhdHVzKTsKKwlyZWFkbCgmcmVncy0+b3V0Ym91bmRfaW50cl9zdGF0dXMpOworCiAJd3JpdGVsKH5NRklfRlVTSU9OX0VOQUJMRV9JTlRFUlJVUFRfTUFTSywgJihyZWdzKS0+b3V0Ym91bmRfaW50cl9tYXNrKTsKIAogCS8qIER1bW15IHJlYWRsIHRvIGZvcmNlIHBjaSBmbHVzaCAqLwpAQCAtMTM5LDExICsxNDQsNiBAQAogCWlmICghKHN0YXR1cyAmIE1GSV9GVVNJT05fRU5BQkxFX0lOVEVSUlVQVF9NQVNLKSkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIGR1bW15IHJlYWQgdG8gZmx1c2ggUENJCi0JICovCi0JcmVhZGwoJnJlZ3MtPm91dGJvdW5kX2ludHJfc3RhdHVzKTsKLQogCXJldHVybiAxOwogfQogCkBAIC0zODUsNyArMzg1LDcgQEAKIGludAogbWVnYXNhc19hbGxvY19jbWRzX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpCiB7Ci0JaW50IGksIGo7CisJaW50IGksIGosIGNvdW50OwogCXUzMiBtYXhfY21kLCBpb19mcmFtZXNfc3o7CiAJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247CiAJc3RydWN0IG1lZ2FzYXNfY21kX2Z1c2lvbiAqY21kOwpAQCAtNDA5LDkgKzQwOSwxMCBAQAogCQlnb3RvIGZhaWxfcmVxX2Rlc2M7CiAJfQogCisJY291bnQgPSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID4gMCA/IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAxOwogCWZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2NfcG9vbCA9CiAJCXBjaV9wb29sX2NyZWF0ZSgicmVwbHlfZnJhbWVzIHBvb2wiLCBpbnN0YW5jZS0+cGRldiwKLQkJCQlmdXNpb24tPnJlcGx5X2FsbG9jX3N6LCAxNiwgMCk7CisJCQkJZnVzaW9uLT5yZXBseV9hbGxvY19zeiAqIGNvdW50LCAxNiwgMCk7CiAKIAlpZiAoIWZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2NfcG9vbCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1lZ2FzYXM7IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKQEAgLTQzMCw3ICs0MzEsNyBAQAogCX0KIAogCXJlcGx5X2Rlc2MgPSBmdXNpb24tPnJlcGx5X2ZyYW1lc19kZXNjOwotCWZvciAoaSA9IDA7IGkgPCBmdXNpb24tPnJlcGx5X3FfZGVwdGg7IGkrKywgcmVwbHlfZGVzYysrKQorCWZvciAoaSA9IDA7IGkgPCBmdXNpb24tPnJlcGx5X3FfZGVwdGggKiBjb3VudDsgaSsrLCByZXBseV9kZXNjKyspCiAJCXJlcGx5X2Rlc2MtPldvcmRzID0gVUxMT05HX01BWDsKIAogCWlvX2ZyYW1lc19zeiA9IGZ1c2lvbi0+aW9fZnJhbWVzX2FsbG9jX3N6OwpAQCAtNTkwLDcgKzU5MSw2IEBACiAJc3RydWN0IG1lZ2FzYXNfaW5pdF9mcmFtZSAqaW5pdF9mcmFtZTsKIAlzdHJ1Y3QgTVBJMl9JT0NfSU5JVF9SRVFVRVNUICpJT0NJbml0TWVzc2FnZTsKIAlkbWFfYWRkcl90CWlvY19pbml0X2hhbmRsZTsKLQl1MzIgY29udGV4dDsKIAlzdHJ1Y3QgbWVnYXNhc19jbWQgKmNtZDsKIAl1OCByZXQ7CiAJc3RydWN0IGZ1c2lvbl9jb250ZXh0ICpmdXNpb247CkBAIC02MzQsMTQgKzYzNCwxMyBAQAogCQlmdXNpb24tPnJlcGx5X2ZyYW1lc19kZXNjX3BoeXM7CiAJSU9DSW5pdE1lc3NhZ2UtPlN5c3RlbVJlcXVlc3RGcmFtZUJhc2VBZGRyZXNzID0KIAkJZnVzaW9uLT5pb19yZXF1ZXN0X2ZyYW1lc19waHlzOwotCisJLyogU2V0IHRvIDAgZm9yIG5vbmUgb3IgMSBNU0ktWCB2ZWN0b3JzICovCisJSU9DSW5pdE1lc3NhZ2UtPkhvc3RNU0l4VmVjdG9ycyA9IChpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID4gMCA/CisJCQkJCSAgIGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAwKTsKIAlpbml0X2ZyYW1lID0gKHN0cnVjdCBtZWdhc2FzX2luaXRfZnJhbWUgKiljbWQtPmZyYW1lOwogCW1lbXNldChpbml0X2ZyYW1lLCAwLCBNRUdBTUZJX0ZSQU1FX1NJWkUpOwogCiAJZnJhbWVfaGRyID0gJmNtZC0+ZnJhbWUtPmhkcjsKLQljb250ZXh0ID0gaW5pdF9mcmFtZS0+Y29udGV4dDsKLQlpbml0X2ZyYW1lLT5jb250ZXh0ID0gY29udGV4dDsKLQogCWZyYW1lX2hkci0+Y21kX3N0YXR1cyA9IDB4RkY7CiAJZnJhbWVfaGRyLT5mbGFncyB8PSBNRklfRlJBTUVfRE9OVF9QT1NUX0lOX1JFUExZX1FVRVVFOwogCkBAIC04ODEsNyArODgwLDcgQEAKIAlzdHJ1Y3QgbWVnYXNhc19yZWdpc3Rlcl9zZXQgX19pb21lbSAqcmVnX3NldDsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKIAl1MzIgbWF4X2NtZDsKLQlpbnQgaSA9IDA7CisJaW50IGkgPSAwLCBjb3VudDsKIAogCWZ1c2lvbiA9IGluc3RhbmNlLT5jdHJsX2NvbnRleHQ7CiAKQEAgLTkzMyw3ICs5MzIsOSBAQAogCQkoTUVHQV9NUEkyX1JBSURfREVGQVVMVF9JT19GUkFNRV9TSVpFIC0KIAkJIHNpemVvZih1bmlvbiBNUEkyX1NHRV9JT19VTklPTikpLzE2OwogCi0JZnVzaW9uLT5sYXN0X3JlcGx5X2lkeCA9IDA7CisJY291bnQgPSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzID4gMCA/IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgOiAxOworCWZvciAoaSA9IDAgOyBpIDwgY291bnQ7IGkrKykKKwkJZnVzaW9uLT5sYXN0X3JlcGx5X2lkeFtpXSA9IDA7CiAKIAkvKgogCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGVzY3JpcHRvcnMKQEAgLTEwNDMsNyArMTA0NCw5IEBACiAJY2FzZSBNRklfU1RBVF9ERVZJQ0VfTk9UX0ZPVU5EOgogCQljbWQtPnNjbWQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OwogCQlicmVhazsKLQorCWNhc2UgTUZJX1NUQVRfQ09ORklHX1NFUV9NSVNNQVRDSDoKKwkJY21kLT5zY21kLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9ERUJVRyAibWVnYXNhczogRlcgc3RhdHVzICUjeFxuIiwgc3RhdHVzKTsKIAkJY21kLT5zY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CkBAIC0xMDY2LDE0ICsxMDY5LDE3IEBACiAJCQlzdHJ1Y3QgTVBJMjVfSUVFRV9TR0VfQ0hBSU42NCAqc2dsX3B0ciwKIAkJCXN0cnVjdCBtZWdhc2FzX2NtZF9mdXNpb24gKmNtZCkKIHsKLQlpbnQgaSwgc2dfcHJvY2Vzc2VkOwotCWludCBzZ2VfY291bnQsIHNnZV9pZHg7CisJaW50IGksIHNnX3Byb2Nlc3NlZCwgc2dlX2NvdW50OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqb3Nfc2dsOwogCXN0cnVjdCBmdXNpb25fY29udGV4dCAqZnVzaW9uOwogCiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKIAotCWNtZC0+aW9fcmVxdWVzdC0+Q2hhaW5PZmZzZXQgPSAwOworCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTFNJX0lOVkFERVIpIHsKKwkJc3RydWN0IE1QSTI1X0lFRUVfU0dFX0NIQUlONjQgKnNnbF9wdHJfZW5kID0gc2dsX3B0cjsKKwkJc2dsX3B0cl9lbmQgKz0gZnVzaW9uLT5tYXhfc2dlX2luX21haW5fbXNnIC0gMTsKKwkJc2dsX3B0cl9lbmQtPkZsYWdzID0gMDsKKwl9CiAKIAlzZ2VfY291bnQgPSBzY3NpX2RtYV9tYXAoc2NwKTsKIApAQCAtMTA4MiwxNiArMTA4OCwxNCBAQAogCWlmIChzZ2VfY291bnQgPiBpbnN0YW5jZS0+bWF4X251bV9zZ2UgfHwgIXNnZV9jb3VudCkKIAkJcmV0dXJuIHNnZV9jb3VudDsKIAotCWlmIChzZ2VfY291bnQgPiBmdXNpb24tPm1heF9zZ2VfaW5fbWFpbl9tc2cpIHsKLQkJLyogT25lIGVsZW1lbnQgdG8gc3RvcmUgdGhlIGNoYWluIGluZm8gKi8KLQkJc2dlX2lkeCA9IGZ1c2lvbi0+bWF4X3NnZV9pbl9tYWluX21zZyAtIDE7Ci0JfSBlbHNlCi0JCXNnZV9pZHggPSBzZ2VfY291bnQ7Ci0KIAlzY3NpX2Zvcl9lYWNoX3NnKHNjcCwgb3Nfc2dsLCBzZ2VfY291bnQsIGkpIHsKIAkJc2dsX3B0ci0+TGVuZ3RoID0gc2dfZG1hX2xlbihvc19zZ2wpOwogCQlzZ2xfcHRyLT5BZGRyZXNzID0gc2dfZG1hX2FkZHJlc3Mob3Nfc2dsKTsKIAkJc2dsX3B0ci0+RmxhZ3MgPSAwOworCQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB7CisJCQlpZiAoaSA9PSBzZ2VfY291bnQgLSAxKQorCQkJCXNnbF9wdHItPkZsYWdzID0gSUVFRV9TR0VfRkxBR1NfRU5EX09GX0xJU1Q7CisJCX0KIAkJc2dsX3B0cisrOwogCiAJCXNnX3Byb2Nlc3NlZCA9IGkgKyAxOwpAQCAtMTEwMCwxMyArMTEwNCwzMCBAQAogCQkgICAgKHNnZV9jb3VudCA+IGZ1c2lvbi0+bWF4X3NnZV9pbl9tYWluX21zZykpIHsKIAogCQkJc3RydWN0IE1QSTI1X0lFRUVfU0dFX0NIQUlONjQgKnNnX2NoYWluOwotCQkJY21kLT5pb19yZXF1ZXN0LT5DaGFpbk9mZnNldCA9Ci0JCQkJZnVzaW9uLT5jaGFpbl9vZmZzZXRfaW9fcmVxdWVzdDsKKwkJCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkgICAgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgeworCQkJCWlmICgoY21kLT5pb19yZXF1ZXN0LT5Jb0ZsYWdzICYKKwkJCQlNUEkyNV9TQVNfREVWSUNFMF9GTEFHU19FTkFCTEVEX0ZBU1RfUEFUSCkgIT0KKwkJCQlNUEkyNV9TQVNfREVWSUNFMF9GTEFHU19FTkFCTEVEX0ZBU1RfUEFUSCkKKwkJCQkJY21kLT5pb19yZXF1ZXN0LT5DaGFpbk9mZnNldCA9CisJCQkJCQlmdXNpb24tPgorCQkJCQkJY2hhaW5fb2Zmc2V0X2lvX3JlcXVlc3Q7CisJCQkJZWxzZQorCQkJCQljbWQtPmlvX3JlcXVlc3QtPkNoYWluT2Zmc2V0ID0gMDsKKwkJCX0gZWxzZQorCQkJCWNtZC0+aW9fcmVxdWVzdC0+Q2hhaW5PZmZzZXQgPQorCQkJCQlmdXNpb24tPmNoYWluX29mZnNldF9pb19yZXF1ZXN0OworCiAJCQlzZ19jaGFpbiA9IHNnbF9wdHI7CiAJCQkvKiBQcmVwYXJlIGNoYWluIGVsZW1lbnQgKi8KIAkJCXNnX2NoYWluLT5OZXh0Q2hhaW5PZmZzZXQgPSAwOwotCQkJc2dfY2hhaW4tPkZsYWdzID0gKElFRUVfU0dFX0ZMQUdTX0NIQUlOX0VMRU1FTlQgfAotCQkJCQkgICBNUEkyX0lFRUVfU0dFX0ZMQUdTX0lPQ1BMQk5UQV9BRERSKTsKKwkJCWlmIChpbnN0YW5jZS0+cGRldi0+ZGV2aWNlID09CisJCQkgICAgUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikKKwkJCQlzZ19jaGFpbi0+RmxhZ3MgPSBJRUVFX1NHRV9GTEFHU19DSEFJTl9FTEVNRU5UOworCQkJZWxzZQorCQkJCXNnX2NoYWluLT5GbGFncyA9CisJCQkJCShJRUVFX1NHRV9GTEFHU19DSEFJTl9FTEVNRU5UIHwKKwkJCQkJIE1QSTJfSUVFRV9TR0VfRkxBR1NfSU9DUExCTlRBX0FERFIpOwogCQkJc2dfY2hhaW4tPkxlbmd0aCA9ICAoc2l6ZW9mKHVuaW9uIE1QSTJfU0dFX0lPX1VOSU9OKQogCQkJCQkgICAgICooc2dlX2NvdW50IC0gc2dfcHJvY2Vzc2VkKSk7CiAJCQlzZ19jaGFpbi0+QWRkcmVzcyA9IGNtZC0+c2dfZnJhbWVfcGh5c19hZGRyOwpAQCAtMTM5OSwxMSArMTQyMCwxOCBAQAogCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5yZWdMb2NrRmxhZ3MgID0gMDsKIAkJZnBfcG9zc2libGUgPSAwOwogCX0gZWxzZSB7Ci0JCWlmIChNUl9CdWlsZFJhaWRDb250ZXh0KCZpb19pbmZvLCAmaW9fcmVxdWVzdC0+UmFpZENvbnRleHQsCisJCWlmIChNUl9CdWlsZFJhaWRDb250ZXh0KGluc3RhbmNlLCAmaW9faW5mbywKKwkJCQkJJmlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LAogCQkJCQlsb2NhbF9tYXBfcHRyKSkKIAkJCWZwX3Bvc3NpYmxlID0gaW9faW5mby5mcE9rRm9ySW87CiAJfQogCisJLyogVXNlIHNtcF9wcm9jZXNzb3JfaWQoKSBmb3Igbm93IHVudGlsIGNtZC0+cmVxdWVzdC0+Y3B1IGlzIENQVQorCSAgIGlkIGJ5IGRlZmF1bHQsIG5vdCBDUFUgZ3JvdXAgaWQsIG90aGVyd2lzZSBhbGwgTVNJLVggcXVldWVzIHdvbid0CisJICAgYmUgdXRpbGl6ZWQgKi8KKwljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLk1TSXhJbmRleCA9IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPworCQlzbXBfcHJvY2Vzc29yX2lkKCkgJSBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzIDogMDsKKwogCWlmIChmcF9wb3NzaWJsZSkgewogCQltZWdhc2FzX3NldF9wZF9sYmEoaW9fcmVxdWVzdCwgc2NwLT5jbWRfbGVuLCAmaW9faW5mbywgc2NwLAogCQkJCSAgIGxvY2FsX21hcF9wdHIsIHN0YXJ0X2xiYV9sbyk7CkBAIC0xNDEyLDYgKzE0NDAsMjAgQEAKIAkJY21kLT5yZXF1ZXN0X2Rlc2MtPlNDU0lJTy5SZXF1ZXN0RmxhZ3MgPQogCQkJKE1QSTJfUkVRX0RFU0NSSVBUX0ZMQUdTX0hJR0hfUFJJT1JJVFkKIAkJCSA8PCBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19UWVBFX1NISUZUKTsKKwkJaWYgKGluc3RhbmNlLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MU0lfSU5WQURFUikgeworCQkJaWYgKGlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LnJlZ0xvY2tGbGFncyA9PQorCQkJICAgIFJFR0lPTl9UWVBFX1VOVVNFRCkKKwkJCQljbWQtPnJlcXVlc3RfZGVzYy0+U0NTSUlPLlJlcXVlc3RGbGFncyA9CisJCQkJCShNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19OT19MT0NLIDw8CisJCQkJCU1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX1RZUEVfU0hJRlQpOworCQkJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQuVHlwZSA9IE1QSTJfVFlQRV9DVURBOworCQkJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQubnNlZyA9IDB4MTsKKwkJCWlvX3JlcXVlc3QtPklvRmxhZ3MgfD0KKwkJCSAgTVBJMjVfU0FTX0RFVklDRTBfRkxBR1NfRU5BQkxFRF9GQVNUX1BBVEg7CisJCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5yZWdMb2NrRmxhZ3MgfD0KKwkJCSAgKE1SX1JMX0ZMQUdTX0dSQU5UX0RFU1RJTkFUSU9OX0NVREEgfAorCQkJICAgTVJfUkxfRkxBR1NfU0VRX05VTV9FTkFCTEUpOworCQl9CiAJCWlmICgoZnVzaW9uLT5sb2FkX2JhbGFuY2VfaW5mb1tkZXZpY2VfaWRdLmxvYWRCYWxhbmNlRmxhZykgJiYKIAkJICAgIChpb19pbmZvLmlzUmVhZCkpIHsKIAkJCWlvX2luZm8uZGV2SGFuZGxlID0KQEAgLTE0MjYsMTEgKzE0NjgsMjMgQEAKIAl9IGVsc2UgewogCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC50aW1lb3V0VmFsdWUgPQogCQkJbG9jYWxfbWFwX3B0ci0+cmFpZE1hcC5mcFBkSW9UaW1lb3V0U2VjOwotCQlpb19yZXF1ZXN0LT5GdW5jdGlvbiA9IE1FR0FTQVNfTVBJMl9GVU5DVElPTl9MRF9JT19SRVFVRVNUOwotCQlpb19yZXF1ZXN0LT5EZXZIYW5kbGUgPSBkZXZpY2VfaWQ7CiAJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uUmVxdWVzdEZsYWdzID0KIAkJCShNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19MRF9JTwogCQkJIDw8IE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX1RZUEVfU0hJRlQpOworCQlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB7CisJCQlpZiAoaW9fcmVxdWVzdC0+UmFpZENvbnRleHQucmVnTG9ja0ZsYWdzID09CisJCQkgICAgUkVHSU9OX1RZUEVfVU5VU0VEKQorCQkJCWNtZC0+cmVxdWVzdF9kZXNjLT5TQ1NJSU8uUmVxdWVzdEZsYWdzID0KKwkJCQkJKE1FR0FTQVNfUkVRX0RFU0NSSVBUX0ZMQUdTX05PX0xPQ0sgPDwKKwkJCQkJTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCk7CisJCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5UeXBlID0gTVBJMl9UWVBFX0NVREE7CisJCQlpb19yZXF1ZXN0LT5SYWlkQ29udGV4dC5yZWdMb2NrRmxhZ3MgfD0KKwkJCQkoTVJfUkxfRkxBR1NfR1JBTlRfREVTVElOQVRJT05fQ1BVMCB8CisJCQkJIE1SX1JMX0ZMQUdTX1NFUV9OVU1fRU5BQkxFKTsKKwkJCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0Lm5zZWcgPSAweDE7CisJCX0KKwkJaW9fcmVxdWVzdC0+RnVuY3Rpb24gPSBNRUdBU0FTX01QSTJfRlVOQ1RJT05fTERfSU9fUkVRVUVTVDsKKwkJaW9fcmVxdWVzdC0+RGV2SGFuZGxlID0gZGV2aWNlX2lkOwogCX0gLyogTm90IEZQICovCiB9CiAKQEAgLTE1MTMsOCArMTU2NywxMCBAQAogCWlvX3JlcXVlc3QtPkVFRFBGbGFncyA9IDA7CiAJaW9fcmVxdWVzdC0+Q29udHJvbCA9IDA7CiAJaW9fcmVxdWVzdC0+RUVEUEJsb2NrU2l6ZSA9IDA7Ci0JaW9fcmVxdWVzdC0+SW9GbGFncyA9IDA7CisJaW9fcmVxdWVzdC0+Q2hhaW5PZmZzZXQgPSAwOwogCWlvX3JlcXVlc3QtPlJhaWRDb250ZXh0LlJBSURGbGFncyA9IDA7CisJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQuVHlwZSA9IDA7CisJaW9fcmVxdWVzdC0+UmFpZENvbnRleHQubnNlZyA9IDA7CiAKIAltZW1jcHkoaW9fcmVxdWVzdC0+Q0RCLkNEQjMyLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CiAJLyoKQEAgLTE2MTIsNyArMTY2OCw2IEBACiAKIAlyZXFfZGVzYy0+V29yZHMgPSAwOwogCWNtZC0+cmVxdWVzdF9kZXNjID0gcmVxX2Rlc2M7Ci0JY21kLT5yZXF1ZXN0X2Rlc2MtPldvcmRzID0gMDsKIAogCWlmIChtZWdhc2FzX2J1aWxkX2lvX2Z1c2lvbihpbnN0YW5jZSwgc2NtZCwgY21kKSkgewogCQltZWdhc2FzX3JldHVybl9jbWRfZnVzaW9uKGluc3RhbmNlLCBjbWQpOwpAQCAtMTY0Nyw3ICsxNzAyLDcgQEAKICAqIENvbXBsZXRlcyBhbGwgY29tbWFuZHMgdGhhdCBpcyBpbiByZXBseSBkZXNjcmlwdG9yIHF1ZXVlCiAgKi8KIGludAotY29tcGxldGVfY21kX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpCitjb21wbGV0ZV9jbWRfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgdTMyIE1TSXhJbmRleCkKIHsKIAl1bmlvbiBNUEkyX1JFUExZX0RFU0NSSVBUT1JTX1VOSU9OICpkZXNjOwogCXN0cnVjdCBNUEkyX1NDU0lfSU9fU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SICpyZXBseV9kZXNjOwpAQCAtMTY2Nyw3ICsxNzIyLDkgQEAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJZGVzYyA9IGZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2M7Ci0JZGVzYyArPSBmdXNpb24tPmxhc3RfcmVwbHlfaWR4OworCWRlc2MgKz0gKChNU0l4SW5kZXggKiBmdXNpb24tPnJlcGx5X2FsbG9jX3N6KS8KKwkJIHNpemVvZih1bmlvbiBNUEkyX1JFUExZX0RFU0NSSVBUT1JTX1VOSU9OKSkgKworCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4W01TSXhJbmRleF07CiAKIAlyZXBseV9kZXNjID0gKHN0cnVjdCBNUEkyX1NDU0lfSU9fU1VDQ0VTU19SRVBMWV9ERVNDUklQVE9SICopZGVzYzsKIApAQCAtMTc0MCwxNiArMTc5NywxOSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4Kys7Ci0JCWlmIChmdXNpb24tPmxhc3RfcmVwbHlfaWR4ID49IGZ1c2lvbi0+cmVwbHlfcV9kZXB0aCkKLQkJCWZ1c2lvbi0+bGFzdF9yZXBseV9pZHggPSAwOworCQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4W01TSXhJbmRleF0rKzsKKwkJaWYgKGZ1c2lvbi0+bGFzdF9yZXBseV9pZHhbTVNJeEluZGV4XSA+PQorCQkgICAgZnVzaW9uLT5yZXBseV9xX2RlcHRoKQorCQkJZnVzaW9uLT5sYXN0X3JlcGx5X2lkeFtNU0l4SW5kZXhdID0gMDsKIAogCQlkZXNjLT5Xb3JkcyA9IFVMTE9OR19NQVg7CiAJCW51bV9jb21wbGV0ZWQrKzsKIAogCQkvKiBHZXQgdGhlIG5leHQgcmVwbHkgZGVzY3JpcHRvciAqLwotCQlpZiAoIWZ1c2lvbi0+bGFzdF9yZXBseV9pZHgpCi0JCQlkZXNjID0gZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzYzsKKwkJaWYgKCFmdXNpb24tPmxhc3RfcmVwbHlfaWR4W01TSXhJbmRleF0pCisJCQlkZXNjID0gZnVzaW9uLT5yZXBseV9mcmFtZXNfZGVzYyArCisJCQkJKChNU0l4SW5kZXggKiBmdXNpb24tPnJlcGx5X2FsbG9jX3N6KS8KKwkJCQkgc2l6ZW9mKHVuaW9uIE1QSTJfUkVQTFlfREVTQ1JJUFRPUlNfVU5JT04pKTsKIAkJZWxzZQogCQkJZGVzYysrOwogCkBAIC0xNzY5LDcgKzE4MjksNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAl3bWIoKTsKLQl3cml0ZWwoZnVzaW9uLT5sYXN0X3JlcGx5X2lkeCwKKwl3cml0ZWwoKE1TSXhJbmRleCA8PCAyNCkgfCBmdXNpb24tPmxhc3RfcmVwbHlfaWR4W01TSXhJbmRleF0sCiAJICAgICAgICZpbnN0YW5jZS0+cmVnX3NldC0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KTsKIAltZWdhc2FzX2NoZWNrX2FuZF9yZXN0b3JlX3F1ZXVlX2RlcHRoKGluc3RhbmNlKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xNzg3LDYgKzE4NDcsOSBAQAogCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA9CiAJCShzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKWluc3RhbmNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgY291bnQsIE1TSXhJbmRleDsKKworCWNvdW50ID0gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA+IDAgPyBpbnN0YW5jZS0+bXNpeF92ZWN0b3JzIDogMTsKIAogCS8qIElmIHdlIGhhdmUgYWxyZWFkeSBkZWNsYXJlZCBhZGFwdGVyIGRlYWQsIGRvbm90IGNvbXBsZXRlIGNtZHMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPmhiYV9sb2NrLCBmbGFncyk7CkBAIC0xNzk3LDcgKzE4NjAsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5oYmFfbG9jaywgZmxhZ3MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5jb21wbGV0aW9uX2xvY2ssIGZsYWdzKTsKLQljb21wbGV0ZV9jbWRfZnVzaW9uKGluc3RhbmNlKTsKKwlmb3IgKE1TSXhJbmRleCA9IDAgOyBNU0l4SW5kZXggPCBjb3VudDsgTVNJeEluZGV4KyspCisJCWNvbXBsZXRlX2NtZF9mdXNpb24oaW5zdGFuY2UsIE1TSXhJbmRleCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPmNvbXBsZXRpb25fbG9jaywgZmxhZ3MpOwogfQogCkBAIC0xODA2LDIwICsxODcwLDI0IEBACiAgKi8KIGlycXJldHVybl90IG1lZ2FzYXNfaXNyX2Z1c2lvbihpbnQgaXJxLCB2b2lkICpkZXZwKQogewotCXN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSA9IChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqKWRldnA7CisJc3RydWN0IG1lZ2FzYXNfaXJxX2NvbnRleHQgKmlycV9jb250ZXh0ID0gZGV2cDsKKwlzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UgPSBpcnFfY29udGV4dC0+aW5zdGFuY2U7CiAJdTMyIG1maVN0YXR1cywgZndfc3RhdGU7CiAKLQlpZiAoIWluc3RhbmNlLT5tc2lfZmxhZykgeworCWlmICghaW5zdGFuY2UtPm1zaXhfdmVjdG9ycykgewogCQltZmlTdGF0dXMgPSBpbnN0YW5jZS0+aW5zdGFuY2V0LT5jbGVhcl9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKIAkJaWYgKCFtZmlTdGF0dXMpCiAJCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCiAJLyogSWYgd2UgYXJlIHJlc2V0dGluZywgYmFpbCAqLwotCWlmICh0ZXN0X2JpdChNRUdBU0FTX0ZVU0lPTl9JTl9SRVNFVCwgJmluc3RhbmNlLT5yZXNldF9mbGFncykpCisJaWYgKHRlc3RfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULCAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKSkgeworCQlpbnN0YW5jZS0+aW5zdGFuY2V0LT5jbGVhcl9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KIAotCWlmICghY29tcGxldGVfY21kX2Z1c2lvbihpbnN0YW5jZSkpIHsKKwlpZiAoIWNvbXBsZXRlX2NtZF9mdXNpb24oaW5zdGFuY2UsIGlycV9jb250ZXh0LT5NU0l4SW5kZXgpKSB7CisJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmNsZWFyX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCQkvKiBJZiB3ZSBkaWRuJ3QgY29tcGxldGUgYW55IGNvbW1hbmRzLCBjaGVjayBmb3IgRlcgZmF1bHQgKi8KIAkJZndfc3RhdGUgPSBpbnN0YW5jZS0+aW5zdGFuY2V0LT5yZWFkX2Z3X3N0YXR1c19yZWcoCiAJCQlpbnN0YW5jZS0+cmVnX3NldCkgJiBNRklfU1RBVEVfTUFTSzsKQEAgLTE4NjYsNiArMTkzNCwxNCBAQAogCiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKIAlpb19yZXEgPSBjbWQtPmlvX3JlcXVlc3Q7CisKKwlpZiAoaW5zdGFuY2UtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xTSV9JTlZBREVSKSB7CisJCXN0cnVjdCBNUEkyNV9JRUVFX1NHRV9DSEFJTjY0ICpzZ2xfcHRyX2VuZCA9CisJCQkoc3RydWN0IE1QSTI1X0lFRUVfU0dFX0NIQUlONjQgKikmaW9fcmVxLT5TR0w7CisJCXNnbF9wdHJfZW5kICs9IGZ1c2lvbi0+bWF4X3NnZV9pbl9tYWluX21zZyAtIDE7CisJCXNnbF9wdHJfZW5kLT5GbGFncyA9IDA7CisJfQorCiAJbXBpMjVfaWVlZV9jaGFpbiA9CiAJICAoc3RydWN0IE1QSTI1X0lFRUVfU0dFX0NIQUlONjQgKikmaW9fcmVxLT5TR0wuSWVlZUNoYWluOwogCkBAIC0xOTI4LDE1ICsyMDA0LDEyIEBACiAJCQkgIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kKQogewogCXVuaW9uIE1FR0FTQVNfUkVRVUVTVF9ERVNDUklQVE9SX1VOSU9OICpyZXFfZGVzYzsKLQl1bmlvbiBkZXNjX3ZhbHVlIGRfdmFsOwogCiAJcmVxX2Rlc2MgPSBidWlsZF9tcHRfY21kKGluc3RhbmNlLCBjbWQpOwogCWlmICghcmVxX2Rlc2MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpc3N1ZSBNRkkgcGFzcyB0aHJ1IGNtZFxuIik7CiAJCXJldHVybjsKIAl9Ci0JZF92YWwud29yZCA9IHJlcV9kZXNjLT5Xb3JkczsKLQogCWluc3RhbmNlLT5pbnN0YW5jZXQtPmZpcmVfY21kKGluc3RhbmNlLCByZXFfZGVzYy0+dS5sb3csCiAJCQkJICAgICAgcmVxX2Rlc2MtPnUuaGlnaCwgaW5zdGFuY2UtPnJlZ19zZXQpOwogfQpAQCAtMjAyOSwxNCArMjEwMiwxNiBAQAogCiB2b2lkICBtZWdhc2FzX3Jlc2V0X3JlcGx5X2Rlc2Moc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKQogewotCWludCBpOworCWludCBpLCBjb3VudDsKIAlzdHJ1Y3QgZnVzaW9uX2NvbnRleHQgKmZ1c2lvbjsKIAl1bmlvbiBNUEkyX1JFUExZX0RFU0NSSVBUT1JTX1VOSU9OICpyZXBseV9kZXNjOwogCiAJZnVzaW9uID0gaW5zdGFuY2UtPmN0cmxfY29udGV4dDsKLQlmdXNpb24tPmxhc3RfcmVwbHlfaWR4ID0gMDsKKwljb3VudCA9IGluc3RhbmNlLT5tc2l4X3ZlY3RvcnMgPiAwID8gaW5zdGFuY2UtPm1zaXhfdmVjdG9ycyA6IDE7CisJZm9yIChpID0gMCA7IGkgPCBjb3VudCA7IGkrKykKKwkJZnVzaW9uLT5sYXN0X3JlcGx5X2lkeFtpXSA9IDA7CiAJcmVwbHlfZGVzYyA9IGZ1c2lvbi0+cmVwbHlfZnJhbWVzX2Rlc2M7Ci0JZm9yIChpID0gMCA7IGkgPCBmdXNpb24tPnJlcGx5X3FfZGVwdGg7IGkrKywgcmVwbHlfZGVzYysrKQorCWZvciAoaSA9IDAgOyBpIDwgZnVzaW9uLT5yZXBseV9xX2RlcHRoICogY291bnQ7IGkrKywgcmVwbHlfZGVzYysrKQogCQlyZXBseV9kZXNjLT5Xb3JkcyA9IFVMTE9OR19NQVg7CiB9CiAKQEAgLTIwNTcsOCArMjEzMiw3IEBACiAJaWYgKGluc3RhbmNlLT5hZHByZWNvdmVyeSA9PSBNRUdBU0FTX0hXX0NSSVRJQ0FMX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1lZ2FyYWlkX3NhczogSGFyZHdhcmUgY3JpdGljYWwgZXJyb3IsICIKIAkJICAgICAgICJyZXR1cm5pbmcgRkFJTEVELlxuIik7Ci0JCXJldHZhbCA9IEZBSUxFRDsKLQkJZ290byBvdXQ7CisJCXJldHVybiBGQUlMRUQ7CiAJfQogCiAJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnJlc2V0X211dGV4KTsKQEAgLTIxNzMsNyArMjI0Nyw3IEBACiAJCQl9CiAKIAkJCS8qIFdhaXQgZm9yIEZXIHRvIGJlY29tZSByZWFkeSAqLwotCQkJaWYgKG1lZ2FzYXNfdHJhbnNpdGlvbl90b19yZWFkeShpbnN0YW5jZSkpIHsKKwkJCWlmIChtZWdhc2FzX3RyYW5zaXRpb25fdG9fcmVhZHkoaW5zdGFuY2UsIDEpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWVnYXJhaWRfc2FzOiBGYWlsZWQgdG8gIgogCQkJCSAgICAgICAidHJhbnNpdGlvbiBjb250cm9sbGVyIHRvIHJlYWR5LlxuIik7CiAJCQkJY29udGludWU7CkBAIC0yMTg2LDYgKzIyNjAsOCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCisJCQljbGVhcl9iaXQoTUVHQVNBU19GVVNJT05fSU5fUkVTRVQsCisJCQkJICAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKIAkJCWluc3RhbmNlLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKGluc3RhbmNlLT5yZWdfc2V0KTsKIAkJCWluc3RhbmNlLT5hZHByZWNvdmVyeSA9IE1FR0FTQVNfSEJBX09QRVJBVElPTkFMOwogCkBAIC0yMjQ3LDYgKzIzMjMsNyBAQAogCQltZWdhcmFpZF9zYXNfa2lsbF9oYmEoaW5zdGFuY2UpOwogCQlyZXR2YWwgPSBGQUlMRUQ7CiAJfSBlbHNlIHsKKwkJY2xlYXJfYml0KE1FR0FTQVNfRlVTSU9OX0lOX1JFU0VULCAmaW5zdGFuY2UtPnJlc2V0X2ZsYWdzKTsKIAkJaW5zdGFuY2UtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIoaW5zdGFuY2UtPnJlZ19zZXQpOwogCQlpbnN0YW5jZS0+YWRwcmVjb3ZlcnkgPSBNRUdBU0FTX0hCQV9PUEVSQVRJT05BTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaAppbmRleCA4MmI1NzdhLi4wODhjOWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKQEAgLTQzLDYgKzQzLDE1IEBACiAjZGVmaW5lIEhPU1RfRElBR19XUklURV9FTkFCTEUJCQkgICAgMHg4MAogI2RlZmluZSBIT1NUX0RJQUdfUkVTRVRfQURBUFRFUgkJCSAgICAweDQKICNkZWZpbmUgTUVHQVNBU19GVVNJT05fTUFYX1JFU0VUX1RSSUVTCQkgICAgMworI2RlZmluZSBNQVhfTVNJWF9RVUVVRVNfRlVTSU9OCQkJICAgIDE2CisKKy8qIEludmFkZXIgZGVmaW5lcyAqLworI2RlZmluZSBNUEkyX1RZUEVfQ1VEQQkJCQkgICAgMHgyCisjZGVmaW5lIE1QSTI1X1NBU19ERVZJQ0UwX0ZMQUdTX0VOQUJMRURfRkFTVF9QQVRIICAgMHg0MDAwCisjZGVmaW5lCU1SX1JMX0ZMQUdTX0dSQU5UX0RFU1RJTkFUSU9OX0NQVTAJICAgIDB4MDAKKyNkZWZpbmUJTVJfUkxfRkxBR1NfR1JBTlRfREVTVElOQVRJT05fQ1BVMQkgICAgMHgxMAorI2RlZmluZQlNUl9STF9GTEFHU19HUkFOVF9ERVNUSU5BVElPTl9DVURBCSAgICAweDgwCisjZGVmaW5lIE1SX1JMX0ZMQUdTX1NFUV9OVU1fRU5BQkxFCQkgICAgMHg4CiAKIC8qIFQxMCBQSSBkZWZpbmVzICovCiAjZGVmaW5lIE1SX1BST1RfSU5GT19UWVBFX0NPTlRST0xMRVIgICAgICAgICAgICAgICAgMHg4CkBAIC03MCw3ICs3OSw3IEBACiAgKi8KICNkZWZpbmUgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfTERfSU8gICAgICAgICAgIDB4NwogI2RlZmluZSBNRUdBU0FTX1JFUV9ERVNDUklQVF9GTEFHU19NRkEgICAgICAgICAgICAgMHgxCi0KKyNkZWZpbmUgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfTk9fTE9DSwkgICAweDIKICNkZWZpbmUgTUVHQVNBU19SRVFfREVTQ1JJUFRfRkxBR1NfVFlQRV9TSElGVCAgICAgIDEKIAogI2RlZmluZSBNRUdBU0FTX0ZQX0NNRF9MRU4JMTYKQEAgLTgyLDcgKzkxLDkgQEAKICAqLwogCiBzdHJ1Y3QgUkFJRF9DT05URVhUIHsKLQl1MTYgICAgIHJlc3ZkMDsKKwl1OAlUeXBlOjQ7CisJdTgJbnNlZzo0OworCXU4CXJlc3ZkMDsKIAl1MTYgICAgIHRpbWVvdXRWYWx1ZTsKIAl1OCAgICAgIHJlZ0xvY2tGbGFnczsKIAl1OCAgICAgIHJlc3ZkMTsKQEAgLTUyNyw3ICs1MzgsNyBAQAogCXU4ICAgICAgbGRTdGF0ZTsKIAl1OCAgICAgIHJlZ1R5cGVSZXFPbldyaXRlOwogCXU4ICAgICAgbW9kRmFjdG9yOwotCXU4ICAgICAgcmVzZXJ2ZWQyWzFdOworCXU4CXJlZ1R5cGVSZXFPblJlYWQ7CiAJdTE2ICAgICBzZXFOdW07CiAKIAlzdHJ1Y3QgewpAQCAtNjYzLDcgKzY3NCw3IEBACiAJdW5pb24gTVBJMl9SRVBMWV9ERVNDUklQVE9SU19VTklPTiAqcmVwbHlfZnJhbWVzX2Rlc2M7CiAJc3RydWN0IGRtYV9wb29sICpyZXBseV9mcmFtZXNfZGVzY19wb29sOwogCi0JdTE2IGxhc3RfcmVwbHlfaWR4OworCXUxNiBsYXN0X3JlcGx5X2lkeFtNQVhfTVNJWF9RVUVVRVNfRlVTSU9OXTsKIAogCXUzMiByZXBseV9xX2RlcHRoOwogCXUzMiByZXF1ZXN0X2FsbG9jX3N6OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyLmgKaW5kZXggMzEwNWQ1ZS4uOGRjMWIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTIuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMCBMU0kgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgTFNJIENvcnBvcmF0aW9uLgogICoKICAqCiAgKiAgICAgICAgICAgTmFtZTogIG1waTIuaApAQCAtOCw3ICs4LDcgQEAKICAqICAgICAgICAgICAgICAgICAgc2NhdHRlci9nYXRoZXIgZm9ybWF0cy4KICAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSAyMSwgMjAwNgogICoKLSAqICBtcGkyLmggVmVyc2lvbjogIDAyLjAwLjE4CisgKiAgbXBpMi5oIFZlcnNpb246ICAwMi4wMC4yMAogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTY2LDYgKzY2LDkgQEAKICAqICAwOC0xMS0xMCAgMDIuMDAuMTcgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCiAgKiAgMTEtMTAtMTAgIDAyLjAwLjE4ICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9JRUVFX1NHRV9GTEFHU19TWVNURU1QTEJDUElfQUREUiBkZWZpbmUuCisgKiAgMDItMjMtMTEgIDAyLjAwLjE5ICBCdW1wZWQgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklULgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9GVU5DVElPTl9TRU5EX0hPU1RfTUVTU0FHRS4KKyAqICAwMy0wOS0xMSAgMDIuMDAuMjAgIEJ1bXBlZCBNUEkyX0hFQURFUl9WRVJTSU9OX1VOSVQuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC05MSw3ICs5NCw3IEBACiAjZGVmaW5lIE1QSTJfVkVSU0lPTl8wMl8wMCAgICAgICAgICAgICAgICAgICgweDAyMDApCiAKIC8qIHZlcnNpb25pbmcgZm9yIHRoaXMgTVBJIGhlYWRlciBzZXQgKi8KLSNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgKDB4MTIpCisjZGVmaW5lIE1QSTJfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICgweDE0KQogI2RlZmluZSBNUEkyX0hFQURFUl9WRVJTSU9OX0RFViAgICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUX01BU0sgICAgICAgKDB4RkYwMCkKICNkZWZpbmUgTVBJMl9IRUFERVJfVkVSU0lPTl9VTklUX1NISUZUICAgICAgKDgpCkBAIC01MTUsNiArNTE4LDggQEAKICNkZWZpbmUgTVBJMl9GVU5DVElPTl9IT1NUX0JBU0VEX0RJU0NPVkVSWV9BQ1RJT04gICAoMHgyRikKIC8qIFBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCAqLwogI2RlZmluZSBNUEkyX0ZVTkNUSU9OX1BXUl9NR01UX0NPTlRST0wgICAgICAgICAgICAgICgweDMwKQorLyogU2VuZCBIb3N0IE1lc3NhZ2UgKi8KKyNkZWZpbmUgTVBJMl9GVU5DVElPTl9TRU5EX0hPU1RfTUVTU0FHRSAgICAgICAgICAgICAoMHgzMSkKIC8qIGJlZ2lubmluZyBvZiBwcm9kdWN0LXNwZWNpZmljIHJhbmdlICovCiAjZGVmaW5lIE1QSTJfRlVOQ1RJT05fTUlOX1BST0RVQ1RfU1BFQ0lGSUMgICAgICAgICAgKDB4RjApCiAvKiBlbmQgb2YgcHJvZHVjdC1zcGVjaWZpYyByYW5nZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXBpL21waTJfY25mZy5oCmluZGV4IDYxNDc1YTYuLmNmZDk1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2NuZmcuaAorKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9jbmZnLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMTAgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDExIExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGkyX2NuZmcuaAogICogICAgICAgICAgVGl0bGU6ICBNUEkgQ29uZmlndXJhdGlvbiBtZXNzYWdlcyBhbmQgcGFnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgTm92ZW1iZXIgMTAsIDIwMDYKICAqCi0gKiAgICBtcGkyX2NuZmcuaCBWZXJzaW9uOiAgMDIuMDAuMTcKKyAqICAgIG1waTJfY25mZy5oIFZlcnNpb246ICAwMi4wMC4xOQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTEzNCw2ICsxMzQsMTIgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIHRvIE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF83LgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJMl9DT05GSUdfRVhUUEFHRVRZUEVfRVhUX01BTlVGQUNUVVJJTkcgZGVmaW5lCiAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgTVBJMl9DT05GSUdfUEFHRV9FWFRfTUFOX1BTIHN0cnVjdHVyZS4KKyAqICAwMi0yMy0xMSAgMDIuMDAuMTggIEFkZGVkIFByb3h5VkZfSUQgZmllbGQgdG8gTVBJMl9DT05GSUdfUkVRVUVTVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIElPIFVuaXQgUGFnZSA4LCBJTyBVbml0IFBhZ2UgOSwKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBJTyBVbml0IFBhZ2UgMTAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTQVNOb3RpZnlQcmltaXRpdmVNYXNrcyBmaWVsZCB0bworICogICAgICAgICAgICAgICAgICAgICAgTVBJMl9DT05GSUdfUEFHRV9JT0NfNy4KKyAqICAwMy0wOS0xMSAgMDIuMDAuMTkgIEZpeGVkIElPIFVuaXQgUGFnZSAxMCAodG8gbWF0Y2ggdGhlIHNwZWMpLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtMzI5LDcgKzMzNSw5IEBACiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgVlBfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgwOSAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDBBICovCi0gICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMHgwQyAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFByb3h5VkZfSUQ7ICAgICAgICAgICAgICAgICAvKiAweDBEICovCisJVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MEUgKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLwogICAgIE1QSTJfQ09ORklHX1BBR0VfSEVBREVSIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAweDE0ICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUGFnZUFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qIDB4MTggKi8KQEAgLTkxNSw2ICs5MjMsMTIwIEBACiAjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfQk9BUkRfVEVNUF9GQUhSRU5IRUlUICAgICAgKDB4MDEpCiAjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTdfQk9BUkRfVEVNUF9DRUxTSVVTICAgICAgICAgKDB4MDIpCiAKKy8qIElPIFVuaXQgUGFnZSA4ICovCisKKyNkZWZpbmUgTVBJMl9JT1VOSVQ4X05VTV9USFJFU0hPTERTICAgICAoNCkKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfSU9VTklUOF9TRU5TT1IgeworCVUxNiAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVMTYKKwkJVGhyZXNob2xkW01QSTJfSU9VTklUOF9OVU1fVEhSRVNIT0xEU107IC8qIDB4MDQgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgLyogMHgwQyAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAvKiAweDEwICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgIC8qIDB4MTQgKi8KK30gTVBJMl9JT1VOSVQ4X1NFTlNPUiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0lPVU5JVDhfU0VOU09SLAorTXBpMklPVW5pdDhTZW5zb3JfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0OFNlbnNvcl90OworCisvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgOCBTZW5zb3IgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9JT1VOSVQ4X1NFTlNPUl9GTEFHU19UM19FTkFCTEUgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUEkyX0lPVU5JVDhfU0VOU09SX0ZMQUdTX1QyX0VOQUJMRSAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSTJfSU9VTklUOF9TRU5TT1JfRkxBR1NfVDFfRU5BQkxFICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJMl9JT1VOSVQ4X1NFTlNPUl9GTEFHU19UMF9FTkFCTEUgICAgICAgICAoMHgwMDAxKQorCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGZvciBOdW1TZW5zb3JzIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJMl9JT1VOSVRQQUdFOF9TRU5TT1JfRU5UUklFUworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0U4X1NFTlNPUl9FTlRSSUVTICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzggeworCU1QSTJfQ09ORklHX1BBR0VfSEVBREVSIEhlYWRlcjsgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgIC8qIDB4MDQgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgLyogMHgwOCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE51bVNlbnNvcnM7ICAgICAgICAgICAvKiAweDBDICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUG9sbGluZ0ludGVydmFsOyAgICAgIC8qIDB4MEQgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgLyogMHgwRSAqLworCU1QSTJfSU9VTklUOF9TRU5TT1IKKwkJCVNlbnNvcltNUEkyX0lPVU5JVFBBR0U4X1NFTlNPUl9FTlRSSUVTXTsvKiAweDEwICovCit9IE1QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF84LCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF84LAorTXBpMklPVW5pdFBhZ2U4X3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPVW5pdFBhZ2U4X3Q7CisKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFOF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKworLyogSU8gVW5pdCBQYWdlIDkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfSU9VTklUOV9TRU5TT1IgeworCVUxNiAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRUZW1wZXJhdHVyZTsgICAgIC8qIDB4MDAgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAweDAyICovCisJVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDB4MDUgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAvKiAweDA2ICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAgICAgLyogMHgwOCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgIC8qIDB4MEMgKi8KK30gTVBJMl9JT1VOSVQ5X1NFTlNPUiwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0lPVU5JVDlfU0VOU09SLAorTXBpMklPVW5pdDlTZW5zb3JfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0OVNlbnNvcl90OworCisvKiBkZWZpbmVzIGZvciBJTyBVbml0IFBhZ2UgOSBTZW5zb3IgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9JT1VOSVQ5X1NFTlNPUl9GTEFHU19URU1QX1ZBTElEICAgICAgICAoMHgwMSkKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtU2Vuc29ycyBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSTJfSU9VTklUUEFHRTlfU0VOU09SX0VOVFJJRVMKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFOV9TRU5TT1JfRU5UUklFUyAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF85IHsKKwlNUEkyX0NPTkZJR19QQUdFX0hFQURFUiBIZWFkZXI7ICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgIC8qIDB4MDQgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgIC8qIDB4MDggKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBOdW1TZW5zb3JzOyAgICAgICAgICAgIC8qIDB4MEMgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgIC8qIDB4MEQgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgIC8qIDB4MEUgKi8KKwlNUEkyX0lPVU5JVDlfU0VOU09SCisJCQlTZW5zb3JbTVBJMl9JT1VOSVRQQUdFOV9TRU5TT1JfRU5UUklFU107LyogMHgxMCAqLworfSBNUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfOSwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0NPTkZJR19QQUdFX0lPX1VOSVRfOSwKK01waTJJT1VuaXRQYWdlOV90LCBNUEkyX1BPSU5URVIgcE1waTJJT1VuaXRQYWdlOV90OworCisjZGVmaW5lIE1QSTJfSU9VTklUUEFHRTlfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICgweDAwKQorCisKKy8qIElPIFVuaXQgUGFnZSAxMCAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9JT1VOSVQxMF9GVU5DVElPTiB7CisJVTggICAgICAgICAgICAgICAgICAgICAgQ3JlZGl0UGVyY2VudDsgICAgICAvKiAweDAwICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAweDAxICovCisJVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAweDAyICovCit9IE1QSTJfSU9VTklUMTBfRlVOQ1RJT04sIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9JT1VOSVQxMF9GVU5DVElPTiwKK01waTJJT1VuaXQxMEZ1bmN0aW9uX3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPVW5pdDEwRnVuY3Rpb25fdDsKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgTnVtRnVuY3Rpb25zIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJMl9JT1VOSVRQQUdFMTBfRlVOQ1RJT05fRU5UUklFUworI2RlZmluZSBNUEkyX0lPVU5JVFBBR0UxMF9GVU5DVElPTl9FTlRSSUVTICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF8xMCB7CisJTVBJMl9DT05GSUdfUEFHRV9IRUFERVIgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIE51bUZ1bmN0aW9uczsgICAgICAgICAgICAgLyogMHgwNCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDB4MDUgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAweDA2ICovCisJVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogMHgwOCAqLworCVUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsJCS8qIDB4MEMgKi8KKwlNUEkyX0lPVU5JVDEwX0ZVTkNUSU9OCisJCUZ1bmN0aW9uW01QSTJfSU9VTklUUEFHRTEwX0ZVTkNUSU9OX0VOVFJJRVNdOy8qIDB4MTAgKi8KK30gTVBJMl9DT05GSUdfUEFHRV9JT19VTklUXzEwLCBNUEkyX1BPSU5URVIgUFRSX01QSTJfQ09ORklHX1BBR0VfSU9fVU5JVF8xMCwKK01waTJJT1VuaXRQYWdlMTBfdCwgTVBJMl9QT0lOVEVSIHBNcGkySU9Vbml0UGFnZTEwX3Q7CisKKyNkZWZpbmUgTVBJMl9JT1VOSVRQQUdFMTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgKDB4MDEpCisKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTAyMiwxMiArMTE0NCwxMiBAQAogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAweDA0ICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRXZlbnRNYXNrc1tNUEkyX0lPQ1BBR0U3X0VWRU5UTUFTS19XT1JEU107LyogMHgwOCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFNBU0Jyb2FkY2FzdFByaW1pdGl2ZU1hc2tzOyAvKiAweDE4ICovCi0gICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDB4MUEgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBTQVNOb3RpZnlQcmltaXRpdmVNYXNrczsgICAgLyogMHgxQSAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAweDFDICovCiB9IE1QSTJfQ09ORklHX1BBR0VfSU9DXzcsIE1QSTJfUE9JTlRFUiBQVFJfTVBJMl9DT05GSUdfUEFHRV9JT0NfNywKICAgTXBpMklPQ1BhZ2U3X3QsIE1QSTJfUE9JTlRFUiBwTXBpMklPQ1BhZ2U3X3Q7CiAKLSNkZWZpbmUgTVBJMl9JT0NQQUdFN19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSTJfSU9DUEFHRTdfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICgweDAyKQogCiAKIC8qIElPQyBQYWdlIDggKi8KQEAgLTIwNzAsMTYgKzIxOTIsMTYgQEAKICNkZWZpbmUgTVBJMl9TQVNJT1VOSVRQQUdFOF9QQUdFVkVSU0lPTiAgICAgKDB4MDApCiAKIC8qIGRlZmluZXMgZm9yIFBvd2VyTWFuYWdlbWVudENhcGFiaWxpdGllcyBmaWVsZCAqLwotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9QT1JUX1dJRFRIX01PRCAgICAgICAgICAoMHgwMDAwMDEwMDApCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBU19TTFVNQkVSX01PREUgICAgICAgICgweDAwMDAwMDgwMCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FTX1BBUlRJQUxfTU9ERSAgICAgICAgKDB4MDAwMDAwNDAwKQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVRBX1NMVU1CRVJfTU9ERSAgICAgICAoMHgwMDAwMDAyMDApCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBVEFfUEFSVElBTF9NT0RFICAgICAgICgweDAwMDAwMDEwMCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9QT1JUX1dJRFRIX01PRCAgICAgICAgKDB4MDAwMDAwMDEwKQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBU19TTFVNQkVSX01PREUgICAgICAoMHgwMDAwMDAwMDgpCi0jZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FTX1BBUlRJQUxfTU9ERSAgICAgICgweDAwMDAwMDAwNCkKLSNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVRBX1NMVU1CRVJfTU9ERSAgICAgKDB4MDAwMDAwMDAyKQotI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBVEFfUEFSVElBTF9NT0RFICAgICAoMHgwMDAwMDAwMDEpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1BPUlRfV0lEVEhfTU9EICAgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVNfU0xVTUJFUl9NT0RFICAgICAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0hPU1RfU0FTX1BBUlRJQUxfTU9ERSAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9IT1NUX1NBVEFfU0xVTUJFUl9NT0RFICAgICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSE9TVF9TQVRBX1BBUlRJQUxfTU9ERSAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9QT1JUX1dJRFRIX01PRCAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FTX1NMVU1CRVJfTU9ERSAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUEkyX1NBU0lPVU5JVDhfUE1fSU9VTklUX1NBU19QQVJUSUFMX01PREUgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJMl9TQVNJT1VOSVQ4X1BNX0lPVU5JVF9TQVRBX1NMVU1CRVJfTU9ERSAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSTJfU0FTSU9VTklUOF9QTV9JT1VOSVRfU0FUQV9QQVJUSUFMX01PREUgICAgICgweDAwMDAwMDAxKQogCiAKIApAQCAtMjI2Niw2ICsyMzg4LDcgQEAKIC8qIHNlZSBtcGkyX3Nhcy5oIGZvciB2YWx1ZXMgZm9yIFNBUyBEZXZpY2UgUGFnZSAwIERldmljZUluZm8gdmFsdWVzICovCiAKIC8qIHZhbHVlcyBmb3IgU0FTIERldmljZSBQYWdlIDAgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19VTkFVVEhPUklaRURfREVWSUNFICAgICAgICAgICgweDgwMDApCiAjZGVmaW5lIE1QSTJfU0FTX0RFVklDRTBfRkxBR1NfU0xVTUJFUl9QTV9DQVBBQkxFICAgICAgICAgICAoMHgxMDAwKQogI2RlZmluZSBNUEkyX1NBU19ERVZJQ0UwX0ZMQUdTX1BBUlRJQUxfUE1fQ0FQQUJMRSAgICAgICAgICAgKDB4MDgwMCkKICNkZWZpbmUgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19TQVRBX0FTWU5DSFJPTk9VU19OT1RJRlkgICAgICgweDA0MDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcGkvbXBpMl9pb2MuaCBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCmluZGV4IDFmMGMxOTAuLjkzZDliNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21waS9tcGkyX2lvYy5oCkBAIC0xLDEyICsxLDEyIEBACiAvKgotICogIENvcHlyaWdodCAoYykgMjAwMC0yMDEwIExTSSBDb3Jwb3JhdGlvbi4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBMU0kgQ29ycG9yYXRpb24uCiAgKgogICoKICAqICAgICAgICAgICBOYW1lOiAgbXBpMl9pb2MuaAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgT2N0b2JlciAxMSwgMjAwNgogICoKLSAqICBtcGkyX2lvYy5oIFZlcnNpb246ICAwMi4wMC4xNgorICogIG1waTJfaW9jLmggVmVyc2lvbjogIDAyLjAwLjE3CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMTA0LDYgKzEwNCwxMiBAQAogICogIDA1LTEyLTEwICAwMi4wMC4xNSAgTWFya2VkIFRhc2sgU2V0IEZ1bGwgRXZlbnQgYXMgb2Jzb2xldGUuCiAgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUEkyX0VWRU5UX1NBU19UT1BPX0xSX1VOU1VQUE9SVEVEX1BIWSBkZWZpbmUuCiAgKiAgMTEtMTAtMTAgIDAyLjAwLjE2ICBBZGRlZCBNUEkyX0ZXX0RPV05MT0FEX0lUWVBFX01JTl9QUk9EVUNUX1NQRUNJRklDLgorICogIDAyLTIzLTExICAwMi4wMC4xNyAgQWRkZWQgU0FTIE5PVElGWSBQcmltaXRpdmUgZXZlbnQsIGFuZCBhZGRlZAorICogICAgICAgICAgICAgICAgICAgICAgU0FTTm90aWZ5UHJpbWl0aXZlTWFza3MgZmllbGQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSTJfRVZFTlRfTk9USUZJQ0FUSU9OX1JFUVVFU1QuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBUZW1wZXJhdHVyZSBUaHJlc2hvbGQgRXZlbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBIb3N0IE1lc3NhZ2UgRXZlbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTZW5kIEhvc3QgTWVzc2FnZSByZXF1ZXN0IGFuZCByZXBseS4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTQyMSw3ICs0MjcsNyBAQAogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNjsgICAgICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEV2ZW50TWFza3NbTVBJMl9FVkVOVF9OT1RJRllfRVZFTlRNQVNLX1dPUkRTXTsvKiAweDE0ICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgU0FTQnJvYWRjYXN0UHJpbWl0aXZlTWFza3M7ICAgICAvKiAweDI0ICovCi0gICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ3OyAgICAgICAgICAgICAgICAgICAgICAvKiAweDI2ICovCisJIFUxNiAgICAgICAgICAgICAgICAgICAgIFNBU05vdGlmeVByaW1pdGl2ZU1hc2tzOyAgICAgICAgLyogMHgyNiAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkODsgICAgICAgICAgICAgICAgICAgICAgLyogMHgyOCAqLwogfSBNUEkyX0VWRU5UX05PVElGSUNBVElPTl9SRVFVRVNULAogICBNUEkyX1BPSU5URVIgUFRSX01QSTJfRVZFTlRfTk9USUZJQ0FUSU9OX1JFUVVFU1QsCkBAIC00NzYsNiArNDgyLDkgQEAKICNkZWZpbmUgTVBJMl9FVkVOVF9HUElPX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAoMHgwMDIzKQogI2RlZmluZSBNUEkyX0VWRU5UX0hPU1RfQkFTRURfRElTQ09WRVJZX1BIWSAgICAgICAgICgweDAwMjQpCiAjZGVmaW5lIE1QSTJfRVZFTlRfU0FTX1FVSUVTQ0UgICAgICAgICAgICAgICAgICAgICAgKDB4MDAyNSkKKyNkZWZpbmUgTVBJMl9FVkVOVF9TQVNfTk9USUZZX1BSSU1JVElWRSAgICAgICAgICAgICAoMHgwMDI2KQorI2RlZmluZSBNUEkyX0VWRU5UX1RFTVBfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICgweDAwMjcpCisjZGVmaW5lIE1QSTJfRVZFTlRfSE9TVF9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAgKDB4MDAyOCkKIAogCiAvKiBMb2cgRW50cnkgQWRkZWQgRXZlbnQgZGF0YSAqLwpAQCAtNTA3LDYgKzUxNiwzOSBAQAogICBNUEkyX1BPSU5URVIgUFRSX01QSTJfRVZFTlRfREFUQV9HUElPX0lOVEVSUlVQVCwKICAgTXBpMkV2ZW50RGF0YUdwaW9JbnRlcnJ1cHRfdCwgTVBJMl9QT0lOVEVSIHBNcGkyRXZlbnREYXRhR3Bpb0ludGVycnVwdF90OwogCisvKiBUZW1wZXJhdHVyZSBUaHJlc2hvbGQgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9FVkVOVF9EQVRBX1RFTVBFUkFUVVJFIHsKKwlVMTYgICAgICAgICBTdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICovCisJVTggICAgICAgICAgU2Vuc29yTnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMiAqLworCVU4ICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KKwlVMTYgICAgICAgICBDdXJyZW50VGVtcGVyYXR1cmU7ICAgICAgICAgICAgICAgICAvKiAweDA0ICovCisJVTE2ICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNiAqLworCVUzMiAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8KKwlVMzIgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDBDICovCit9IE1QSTJfRVZFTlRfREFUQV9URU1QRVJBVFVSRSwKK01QSTJfUE9JTlRFUiBQVFJfTVBJMl9FVkVOVF9EQVRBX1RFTVBFUkFUVVJFLAorTXBpMkV2ZW50RGF0YVRlbXBlcmF0dXJlX3QsIE1QSTJfUE9JTlRFUiBwTXBpMkV2ZW50RGF0YVRlbXBlcmF0dXJlX3Q7CisKKy8qIFRlbXBlcmF0dXJlIFRocmVzaG9sZCBFdmVudCBkYXRhIFN0YXR1cyBiaXRzICovCisjZGVmaW5lIE1QSTJfRVZFTlRfVEVNUEVSQVRVUkUzX0VYQ0VFREVEICAgICAgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTVBJMl9FVkVOVF9URU1QRVJBVFVSRTJfRVhDRUVERUQgICAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUEkyX0VWRU5UX1RFTVBFUkFUVVJFMV9FWENFRURFRCAgICAgICAgICAgICgweDAwMDIpCisjZGVmaW5lIE1QSTJfRVZFTlRfVEVNUEVSQVRVUkUwX0VYQ0VFREVEICAgICAgICAgICAgKDB4MDAwMSkKKworCisvKiBIb3N0IE1lc3NhZ2UgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9FVkVOVF9EQVRBX0hPU1RfTUVTU0FHRSB7CisJVTggICAgICAgICAgU291cmNlVkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVU4ICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDEgKi8KKwlVMTYgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAyICovCisJVTMyICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLworCVUzMiAgICAgICAgIEhvc3REYXRhWzFdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8KK30gTVBJMl9FVkVOVF9EQVRBX0hPU1RfTUVTU0FHRSwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX0VWRU5UX0RBVEFfSE9TVF9NRVNTQUdFLAorTXBpMkV2ZW50RGF0YUhvc3RNZXNzYWdlX3QsIE1QSTJfUE9JTlRFUiBwTXBpMkV2ZW50RGF0YUhvc3RNZXNzYWdlX3Q7CisKKwogLyogSGFyZCBSZXNldCBSZWNlaXZlZCBFdmVudCBkYXRhICovCiAKIHR5cGVkZWYgc3RydWN0IF9NUEkyX0VWRU5UX0RBVEFfSEFSRF9SRVNFVF9SRUNFSVZFRApAQCAtNzQ5LDYgKzc5MSwyNCBAQAogI2RlZmluZSBNUEkyX0VWRU5UX1BSSU1JVElWRV9DSEFOR0UwX1JFU0VSVkVEICAgICAgICAgICAgICAgKDB4MDcpCiAjZGVmaW5lIE1QSTJfRVZFTlRfUFJJTUlUSVZFX0NIQU5HRTFfUkVTRVJWRUQgICAgICAgICAgICAgICAoMHgwOCkKIAorLyogU0FTIE5vdGlmeSBQcmltaXRpdmUgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9FVkVOVF9EQVRBX1NBU19OT1RJRllfUFJJTUlUSVZFIHsKKwlVOCAgICAgICAgICAgICAgICAgICAgICBQaHlOdW07ICAgICAgICAgICAgICAgICAgICAgLyogMHgwMCAqLworCVU4ICAgICAgICAgICAgICAgICAgICAgIFBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAxICovCisJVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmU7ICAgICAgICAgICAgICAgICAgLyogMHgwMyAqLworfSBNUEkyX0VWRU5UX0RBVEFfU0FTX05PVElGWV9QUklNSVRJVkUsCitNUEkyX1BPSU5URVIgUFRSX01QSTJfRVZFTlRfREFUQV9TQVNfTk9USUZZX1BSSU1JVElWRSwKK01waTJFdmVudERhdGFTYXNOb3RpZnlQcmltaXRpdmVfdCwKK01QSTJfUE9JTlRFUiBwTXBpMkV2ZW50RGF0YVNhc05vdGlmeVByaW1pdGl2ZV90OworCisvKiBkZWZpbmVzIGZvciB0aGUgUHJpbWl0aXZlIGZpZWxkICovCisjZGVmaW5lIE1QSTJfRVZFTlRfTk9USUZZX0VOQUJMRV9TUElOVVAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJMl9FVkVOVF9OT1RJRllfUE9XRVJfTE9TU19FWFBFQ1RFRCAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUEkyX0VWRU5UX05PVElGWV9SRVNFUlZFRDEgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSTJfRVZFTlRfTk9USUZZX1JFU0VSVkVEMiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNCkKKwogCiAvKiBTQVMgSW5pdGlhdG9yIERldmljZSBTdGF0dXMgQ2hhbmdlIEV2ZW50IGRhdGEgKi8KIApAQCAtMTAwMSw2ICsxMDYxLDUzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNlbmRIb3N0TWVzc2FnZSBtZXNzYWdlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTZW5kSG9zdE1lc3NhZ2UgUmVxdWVzdCBtZXNzYWdlICovCit0eXBlZGVmIHN0cnVjdCBfTVBJMl9TRU5EX0hPU1RfTUVTU0FHRV9SRVFVRVNUIHsKKwlVMTYgICAgICAgICAgICAgICAgICAgICBIb3N0RGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBWUF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEEgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBEZXN0VkZfSUQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEQgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEUgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDY7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDc7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTQgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDg7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTggKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDk7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MUMgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDEwOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MjAgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBIb3N0RGF0YVsxXTsgICAgICAgICAgICAgICAgICAgIC8qIDB4MjQgKi8KK30gTVBJMl9TRU5EX0hPU1RfTUVTU0FHRV9SRVFVRVNULAorTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUVVFU1QsCitNcGkyU2VuZEhvc3RNZXNzYWdlUmVxdWVzdF90LCBNUEkyX1BPSU5URVIgcE1waTJTZW5kSG9zdE1lc3NhZ2VSZXF1ZXN0X3Q7CisKKworLyogU2VuZEhvc3RNZXNzYWdlIFJlcGx5IG1lc3NhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IF9NUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUExZIHsKKwlVMTYgICAgICAgICAgICAgICAgICAgICBIb3N0RGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIDB4MDAgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDIgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDMgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDQgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDYgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDcgKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBWUF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8KKwlVOCAgICAgICAgICAgICAgICAgICAgICBWRl9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDkgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEEgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEMgKi8KKwlVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MEUgKi8KKwlVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MTAgKi8KK30gTVBJMl9TRU5EX0hPU1RfTUVTU0FHRV9SRVBMWSwgTVBJMl9QT0lOVEVSIFBUUl9NUEkyX1NFTkRfSE9TVF9NRVNTQUdFX1JFUExZLAorTXBpMlNlbmRIb3N0TWVzc2FnZVJlcGx5X3QsIE1QSTJfUE9JTlRFUiBwTXBpMlNlbmRIb3N0TWVzc2FnZVJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIEZXRG93bmxvYWQgbWVzc2FnZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwppbmRleCA2ODI1NzcyLi5iZWRhMDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2Jhc2UuYwpAQCAtODEsNiArODEsMTUgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShtaXNzaW5nX2RlbGF5LCBpbnQsIE5VTEwsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtaXNzaW5nX2RlbGF5LCAiIGRldmljZSBtaXNzaW5nIGRlbGF5ICwgaW8gbWlzc2luZyBkZWxheSIpOwogCitzdGF0aWMgaW50IG1wdDJzYXNfZndmYXVsdF9kZWJ1ZzsKK01PRFVMRV9QQVJNX0RFU0MobXB0MnNhc19md2ZhdWx0X2RlYnVnLCAiIGVuYWJsZSBkZXRlY3Rpb24gb2YgZmlybXdhcmUgZmF1bHQgIgorCSJhbmQgaGFsdCBmaXJtd2FyZSAtIChkZWZhdWx0PTApIik7CisKK3N0YXRpYyBpbnQgZGlzYWJsZV9kaXNjb3ZlcnkgPSAtMTsKK21vZHVsZV9wYXJhbShkaXNhYmxlX2Rpc2NvdmVyeSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9kaXNjb3ZlcnksICIgZGlzYWJsZSBkaXNjb3ZlcnkgIik7CisKKwogLyogZGlhZ19idWZmZXJfZW5hYmxlIGlzIGJpdHdpc2UKICAqIGJpdCAwIHNldCA9IFRSQUNFCiAgKiBiaXQgMSBzZXQgPSBTTkFQU0hPVApAQCAtOTMsMTQgKzEwMiw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRpYWdfYnVmZmVyX2VuYWJsZSwgIiBwb3N0IGRpYWcgYnVmZmVycyAiCiAgICAgIihUUkFDRT0xL1NOQVBTSE9UPTIvRVhURU5ERUQ9NC9kZWZhdWx0PTApIik7CiAKLXN0YXRpYyBpbnQgbXB0MnNhc19md2ZhdWx0X2RlYnVnOwotTU9EVUxFX1BBUk1fREVTQyhtcHQyc2FzX2Z3ZmF1bHRfZGVidWcsICIgZW5hYmxlIGRldGVjdGlvbiBvZiBmaXJtd2FyZSBmYXVsdCAiCi0gICAgImFuZCBoYWx0IGZpcm13YXJlIC0gKGRlZmF1bHQ9MCkiKTsKLQotc3RhdGljIGludCBkaXNhYmxlX2Rpc2NvdmVyeSA9IC0xOwotbW9kdWxlX3BhcmFtKGRpc2FibGVfZGlzY292ZXJ5LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2Rpc2NvdmVyeSwgIiBkaXNhYmxlIGRpc2NvdmVyeSAiKTsKLQogLyoqCiAgKiBfc2NzaWhfc2V0X2Z3ZmF1bHRfZGVidWcgLSBnbG9iYWwgc2V0dGluZyBvZiBpb2MtPmZ3ZmF1bHRfZGVidWcuCiAgKgpAQCAtNjkxLDYgKzY5Miw3IEBACiAJCW1lbWNweShpb2MtPmJhc2VfY21kcy5yZXBseSwgbXBpX3JlcGx5LCBtcGlfcmVwbHktPk1zZ0xlbmd0aCo0KTsKIAl9CiAJaW9jLT5iYXNlX2NtZHMuc3RhdHVzICY9IH5NUFQyX0NNRF9QRU5ESU5HOworCiAJY29tcGxldGUoJmlvYy0+YmFzZV9jbWRzLmRvbmUpOwogCXJldHVybiAxOwogfQpAQCAtODMzLDI1ICs4MzUsMzEgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdAogX2Jhc2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmJ1c19pZCkKIHsKKwlzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSAqcmVwbHlfcSA9IGJ1c19pZDsKIAl1bmlvbiByZXBseV9kZXNjcmlwdG9yIHJkOwogCXUzMiBjb21wbGV0ZWRfY21kczsKIAl1OCByZXF1ZXN0X2Rlc3JpcHRfdHlwZTsKIAl1MTYgc21pZDsKIAl1OCBjYl9pZHg7CiAJdTMyIHJlcGx5OwotCXU4IG1zaXhfaW5kZXg7Ci0Jc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gYnVzX2lkOworCXU4IG1zaXhfaW5kZXggPSByZXBseV9xLT5tc2l4X2luZGV4OworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHJlcGx5X3EtPmlvYzsKIAlNcGkyUmVwbHlEZXNjcmlwdG9yc1VuaW9uX3QgKnJwZjsKIAl1OCByYzsKIAogCWlmIChpb2MtPm1hc2tfaW50ZXJydXB0cykKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JcnBmID0gJmlvYy0+cmVwbHlfcG9zdF9mcmVlW2lvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4XTsKKwlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZyZXBseV9xLT5idXN5LCAxLCAxKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcnBmID0gJnJlcGx5X3EtPnJlcGx5X3Bvc3RfZnJlZVtyZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhdOwogCXJlcXVlc3RfZGVzcmlwdF90eXBlID0gcnBmLT5EZWZhdWx0LlJlcGx5RmxhZ3MKIAkgICAgICYgTVBJMl9SUFlfREVTQ1JJUFRfRkxBR1NfVFlQRV9NQVNLOwotCWlmIChyZXF1ZXN0X2Rlc3JpcHRfdHlwZSA9PSBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19VTlVTRUQpCisJaWYgKHJlcXVlc3RfZGVzcmlwdF90eXBlID09IE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1VOVVNFRCkgeworCQlhdG9taWNfZGVjKCZyZXBseV9xLT5idXN5KTsKIAkJcmV0dXJuIElSUV9OT05FOworCX0KIAogCWNvbXBsZXRlZF9jbWRzID0gMDsKIAljYl9pZHggPSAweEZGOwpAQCAtODYwLDkgKzg2OCw3IEBACiAJCWlmIChyZC51LmxvdyA9PSBVSU5UX01BWCB8fCByZC51LmhpZ2ggPT0gVUlOVF9NQVgpCiAJCQlnb3RvIG91dDsKIAkJcmVwbHkgPSAwOwotCQljYl9pZHggPSAweEZGOwogCQlzbWlkID0gbGUxNl90b19jcHUocnBmLT5EZWZhdWx0LkRlc2NyaXB0b3JUeXBlRGVwZW5kZW50MSk7Ci0JCW1zaXhfaW5kZXggPSBycGYtPkRlZmF1bHQuTVNJeEluZGV4OwogCQlpZiAocmVxdWVzdF9kZXNyaXB0X3R5cGUgPT0KIAkJICAgIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX0FERFJFU1NfUkVQTFkpIHsKIAkJCXJlcGx5ID0gbGUzMl90b19jcHUKQEAgLTkwNiwzMiArOTEyLDg2IEBACiAgbmV4dDoKIAogCQlycGYtPldvcmRzID0gY3B1X3RvX2xlNjQoVUxMT05HX01BWCk7Ci0JCWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID0gKGlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID09CisJCXJlcGx5X3EtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCA9CisJCSAgICAocmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4ID09CiAJCSAgICAoaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoIC0gMSkpID8gMCA6Ci0JCSAgICBpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCArIDE7CisJCSAgICByZXBseV9xLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggKyAxOwogCQlyZXF1ZXN0X2Rlc3JpcHRfdHlwZSA9Ci0JCSAgICBpb2MtPnJlcGx5X3Bvc3RfZnJlZVtpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleF0uRGVmYXVsdC4KLQkJICAgIFJlcGx5RmxhZ3MgJiBNUEkyX1JQWV9ERVNDUklQVF9GTEFHU19UWVBFX01BU0s7CisJCSAgICByZXBseV9xLT5yZXBseV9wb3N0X2ZyZWVbcmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4XS4KKwkJICAgIERlZmF1bHQuUmVwbHlGbGFncyAmIE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1RZUEVfTUFTSzsKIAkJY29tcGxldGVkX2NtZHMrKzsKIAkJaWYgKHJlcXVlc3RfZGVzcmlwdF90eXBlID09IE1QSTJfUlBZX0RFU0NSSVBUX0ZMQUdTX1VOVVNFRCkKIAkJCWdvdG8gb3V0OwotCQlpZiAoIWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KQotCQkJcnBmID0gaW9jLT5yZXBseV9wb3N0X2ZyZWU7CisJCWlmICghcmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KQorCQkJcnBmID0gcmVwbHlfcS0+cmVwbHlfcG9zdF9mcmVlOwogCQllbHNlCiAJCQlycGYrKzsKIAl9IHdoaWxlICgxKTsKIAogIG91dDoKIAotCWlmICghY29tcGxldGVkX2NtZHMpCisJaWYgKCFjb21wbGV0ZWRfY21kcykgeworCQlhdG9taWNfZGVjKCZyZXBseV9xLT5idXN5KTsKIAkJcmV0dXJuIElSUV9OT05FOwotCisJfQogCXdtYigpOwotCXdyaXRlbChpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCwgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4KTsKKwlpZiAoaW9jLT5pc193YXJwZHJpdmUpIHsKKwkJd3JpdGVsKHJlcGx5X3EtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCwKKwkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbbXNpeF9pbmRleF0pOworCQlhdG9taWNfZGVjKCZyZXBseV9xLT5idXN5KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwl3cml0ZWwocmVwbHlfcS0+cmVwbHlfcG9zdF9ob3N0X2luZGV4IHwgKG1zaXhfaW5kZXggPDwKKwkgICAgTVBJMl9SUEhJX01TSVhfSU5ERVhfU0hJRlQpLCAmaW9jLT5jaGlwLT5SZXBseVBvc3RIb3N0SW5kZXgpOworCWF0b21pY19kZWMoJnJlcGx5X3EtPmJ1c3kpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogLyoqCisgKiBfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZCAtIGlzIGNvbnRyb2xsZXIgc3VwcG9ydCBtdWxpLXJlcGx5IHF1ZXVlcworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICovCitzdGF0aWMgaW5saW5lIGludAorX2Jhc2VfaXNfY29udHJvbGxlcl9tc2l4X2VuYWJsZWQoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXJldHVybiAoaW9jLT5mYWN0cy5JT0NDYXBhYmlsaXRpZXMgJgorCSAgICBNUEkyX0lPQ0ZBQ1RTX0NBUEFCSUxJVFlfTVNJX1hfSU5ERVgpICYmIGlvYy0+bXNpeF9lbmFibGU7Cit9CisKKy8qKgorICogbXB0MnNhc19iYXNlX2ZsdXNoX3JlcGx5X3F1ZXVlcyAtIGZsdXNoaW5nIHRoZSBNU0lYIHJlcGx5IHF1ZXVlcworICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBDb250ZXh0OiBJU1IgY29uZXh0CisgKgorICogQ2FsbGVkIHdoZW4gYSBUYXNrIE1hbmFnZW1lbnQgcmVxdWVzdCBoYXMgY29tcGxldGVkLiBXZSB3YW50CisgKiB0byBmbHVzaCB0aGUgb3RoZXIgcmVwbHkgcXVldWVzIHNvIGFsbCB0aGUgb3V0c3RhbmRpbmcgSU8gaGFzIGJlZW4KKyAqIGNvbXBsZXRlZCBiYWNrIHRvIE9TIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZSBUTSBjb21wbGV0ZXRpb24uCisgKgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3ZvaWQKK21wdDJzYXNfYmFzZV9mbHVzaF9yZXBseV9xdWV1ZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlICpyZXBseV9xOworCisJLyogSWYgTVNJWCBjYXBhYmlsaXR5IGlzIHR1cm5lZCBvZmYKKwkgKiB0aGVuIG11bHRpLXF1ZXVlcyBhcmUgbm90IGVuYWJsZWQKKwkgKi8KKwlpZiAoIV9iYXNlX2lzX2NvbnRyb2xsZXJfbXNpeF9lbmFibGVkKGlvYykpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwbHlfcSwgJmlvYy0+cmVwbHlfcXVldWVfbGlzdCwgbGlzdCkgeworCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJCXJldHVybjsKKwkJLyogVE1zIGFyZSBvbiBtc2l4X2luZGV4ID09IDAgKi8KKwkJaWYgKHJlcGx5X3EtPm1zaXhfaW5kZXggPT0gMCkKKwkJCWNvbnRpbnVlOworCQlfYmFzZV9pbnRlcnJ1cHQocmVwbHlfcS0+dmVjdG9yLCAodm9pZCAqKXJlcGx5X3EpOworCX0KK30KKworLyoqCiAgKiBtcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyIC0gY2xlYXIgaW50ZXJydXB0IGNhbGxiYWNrIGhhbmRsZXIKICAqIEBjYl9pZHg6IGNhbGxiYWNrIGluZGV4CiAgKgpAQCAtMTA4MSw0MSArMTE0MSw2IEBACiB9CiAKIC8qKgotICogX2Jhc2Vfc2F2ZV9tc2l4X3RhYmxlIC0gYmFja3VwIG1zaXggdmVjdG9yIHRhYmxlCi0gKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqCi0gKiBUaGlzIGFkZHJlc3MgYW4gZXJyYXRhIHdoZXJlIGRpYWcgcmVzZXQgY2xlYXJzIG91dCB0aGUgdGFibGUKLSAqLwotc3RhdGljIHZvaWQKLV9iYXNlX3NhdmVfbXNpeF90YWJsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCi17Ci0JaW50IGk7Ci0KLQlpZiAoIWlvYy0+bXNpeF9lbmFibGUgfHwgaW9jLT5tc2l4X3RhYmxlX2JhY2t1cCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudDsgaSsrKQotCQlpb2MtPm1zaXhfdGFibGVfYmFja3VwW2ldID0gaW9jLT5tc2l4X3RhYmxlW2ldOwotfQotCi0vKioKLSAqIF9iYXNlX3Jlc3RvcmVfbXNpeF90YWJsZSAtIHRoaXMgcmVzdG9yZXMgdGhlIG1zaXggdmVjdG9yIHRhYmxlCi0gKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqCi0gKi8KLXN0YXRpYyB2b2lkCi1fYmFzZV9yZXN0b3JlX21zaXhfdGFibGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQotewotCWludCBpOwotCi0JaWYgKCFpb2MtPm1zaXhfZW5hYmxlIHx8IGlvYy0+bXNpeF90YWJsZV9iYWNrdXAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IGlvYy0+bXNpeF92ZWN0b3JfY291bnQ7IGkrKykKLQkJaW9jLT5tc2l4X3RhYmxlW2ldID0gaW9jLT5tc2l4X3RhYmxlX2JhY2t1cFtpXTsKLX0KLQotLyoqCiAgKiBfYmFzZV9jaGVja19lbmFibGVfbXNpeCAtIGNoZWNrcyBNU0lYIGNhcGFiYWJsZS4KICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICoKQEAgLTExMjcsNyArMTE1Miw3IEBACiB7CiAJaW50IGJhc2U7CiAJdTE2IG1lc3NhZ2VfY29udHJvbDsKLQl1MzIgbXNpeF90YWJsZV9vZmZzZXQ7CisKIAogCWJhc2UgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGlvYy0+cGRldiwgUENJX0NBUF9JRF9NU0lYKTsKIAlpZiAoIWJhc2UpIHsKQEAgLTExMzcsMjEgKzExNjIsMTUzIEBACiAJfQogCiAJLyogZ2V0IG1zaXggdmVjdG9yIGNvdW50ICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoaW9jLT5wZGV2LCBiYXNlICsgMiwgJm1lc3NhZ2VfY29udHJvbCk7Ci0JaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCA9IChtZXNzYWdlX2NvbnRyb2wgJiAweDNGRikgKyAxOwotCi0JLyogZ2V0IG1zaXggdGFibGUgICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlvYy0+cGRldiwgYmFzZSArIDQsICZtc2l4X3RhYmxlX29mZnNldCk7Ci0JbXNpeF90YWJsZV9vZmZzZXQgJj0gMHhGRkZGRkZGODsKLQlpb2MtPm1zaXhfdGFibGUgPSAodTMyICopKCh2b2lkICopaW9jLT5jaGlwICsgbXNpeF90YWJsZV9vZmZzZXQpOwotCisJLyogTlVNQV9JTyBub3Qgc3VwcG9ydGVkIGZvciBvbGRlciBjb250cm9sbGVycyAqLworCWlmIChpb2MtPnBkZXYtPmRldmljZSA9PSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjAwNCB8fAorCSAgICBpb2MtPnBkZXYtPmRldmljZSA9PSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjAwOCB8fAorCSAgICBpb2MtPnBkZXYtPmRldmljZSA9PSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjEwOF8xIHx8CisJICAgIGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMTA4XzIgfHwKKwkgICAgaW9jLT5wZGV2LT5kZXZpY2UgPT0gTVBJMl9NRkdQQUdFX0RFVklEX1NBUzIxMDhfMyB8fAorCSAgICBpb2MtPnBkZXYtPmRldmljZSA9PSBNUEkyX01GR1BBR0VfREVWSURfU0FTMjExNl8xIHx8CisJICAgIGlvYy0+cGRldi0+ZGV2aWNlID09IE1QSTJfTUZHUEFHRV9ERVZJRF9TQVMyMTE2XzIpCisJCWlvYy0+bXNpeF92ZWN0b3JfY291bnQgPSAxOworCWVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfd29yZChpb2MtPnBkZXYsIGJhc2UgKyAyLCAmbWVzc2FnZV9jb250cm9sKTsKKwkJaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudCA9IChtZXNzYWdlX2NvbnRyb2wgJiAweDNGRikgKyAxOworCX0KIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJtc2l4IGlzIHN1cHBvcnRlZCwgIgotCSAgICAidmVjdG9yX2NvdW50KCVkKSwgdGFibGVfb2Zmc2V0KDB4JTA4eCksIHRhYmxlKCVwKVxuIiwgaW9jLT5uYW1lLAotCSAgICBpb2MtPm1zaXhfdmVjdG9yX2NvdW50LCBtc2l4X3RhYmxlX29mZnNldCwgaW9jLT5tc2l4X3RhYmxlKSk7CisJICAgICJ2ZWN0b3JfY291bnQoJWQpXG4iLCBpb2MtPm5hbWUsIGlvYy0+bXNpeF92ZWN0b3JfY291bnQpKTsKKwogCXJldHVybiAwOwogfQogCiAvKioKKyAqIF9iYXNlX2ZyZWVfaXJxIC0gZnJlZSBpcnEKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICoKKyAqIEZyZWVpbmcgcmVzcGVjdGl2ZSByZXBseV9xdWV1ZSBmcm9tIHRoZSBsaXN0LgorICovCitzdGF0aWMgdm9pZAorX2Jhc2VfZnJlZV9pcnEoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlICpyZXBseV9xLCAqbmV4dDsKKworCWlmIChsaXN0X2VtcHR5KCZpb2MtPnJlcGx5X3F1ZXVlX2xpc3QpKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVwbHlfcSwgbmV4dCwgJmlvYy0+cmVwbHlfcXVldWVfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVwbHlfcS0+bGlzdCk7CisJCXN5bmNocm9uaXplX2lycShyZXBseV9xLT52ZWN0b3IpOworCQlmcmVlX2lycShyZXBseV9xLT52ZWN0b3IsIHJlcGx5X3EpOworCQlrZnJlZShyZXBseV9xKTsKKwl9Cit9CisKKy8qKgorICogX2Jhc2VfcmVxdWVzdF9pcnEgLSByZXF1ZXN0IGlycQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAaW5kZXg6IG1zaXggaW5kZXggaW50byB2ZWN0b3IgdGFibGUKKyAqIEB2ZWN0b3I6IGlycSB2ZWN0b3IKKyAqCisgKiBJbnNlcnRpbmcgcmVzcGVjdGl2ZSByZXBseV9xdWV1ZSBpbnRvIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW50CitfYmFzZV9yZXF1ZXN0X2lycShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGluZGV4LCB1MzIgdmVjdG9yKQoreworCXN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlICpyZXBseV9xOworCWludCByOworCisJcmVwbHlfcSA9ICBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSksIEdGUF9LRVJORUwpOworCWlmICghcmVwbHlfcSkgeworCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICVkIVxuIiwKKwkJICAgIGlvYy0+bmFtZSwgKGludClzaXplb2Yoc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlcGx5X3EtPmlvYyA9IGlvYzsKKwlyZXBseV9xLT5tc2l4X2luZGV4ID0gaW5kZXg7CisJcmVwbHlfcS0+dmVjdG9yID0gdmVjdG9yOworCWF0b21pY19zZXQoJnJlcGx5X3EtPmJ1c3ksIDApOworCWlmIChpb2MtPm1zaXhfZW5hYmxlKQorCQlzbnByaW50ZihyZXBseV9xLT5uYW1lLCBNUFRfTkFNRV9MRU5HVEgsICIlcyVkLW1zaXglZCIsCisJCSAgICBNUFQyU0FTX0RSSVZFUl9OQU1FLCBpb2MtPmlkLCBpbmRleCk7CisJZWxzZQorCQlzbnByaW50ZihyZXBseV9xLT5uYW1lLCBNUFRfTkFNRV9MRU5HVEgsICIlcyVkIiwKKwkJICAgIE1QVDJTQVNfRFJJVkVSX05BTUUsIGlvYy0+aWQpOworCXIgPSByZXF1ZXN0X2lycSh2ZWN0b3IsIF9iYXNlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIHJlcGx5X3EtPm5hbWUsCisJICAgIHJlcGx5X3EpOworCWlmIChyKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgInVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQgJWQhXG4iLAorCQkgICAgcmVwbHlfcS0+bmFtZSwgdmVjdG9yKTsKKwkJa2ZyZWUocmVwbHlfcSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnJlcGx5X3EtPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJnJlcGx5X3EtPmxpc3QsICZpb2MtPnJlcGx5X3F1ZXVlX2xpc3QpOworCXJldHVybiAwOworfQorCisvKioKKyAqIF9iYXNlX2Fzc2lnbl9yZXBseV9xdWV1ZXMgLSBhc3NpZ25pbmcgbXNpeCBpbmRleCBmb3IgZWFjaCBjcHUKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICoKKyAqIFRoZSBlbmR1c2VyIHdvdWxkIG5lZWQgdG8gc2V0IHRoZSBhZmZpbml0eSB2aWEgL3Byb2MvaXJxLyMvc21wX2FmZmluaXR5CisgKgorICogSXQgd291bGQgbmljZSBpZiB3ZSBjb3VsZCBjYWxsIGlycV9zZXRfYWZmaW5pdHksIGhvd2V2ZXIgaXQgaXMgbm90CisgKiBhbiBleHBvcnRlZCBzeW1ib2wKKyAqLworc3RhdGljIHZvaWQKK19iYXNlX2Fzc2lnbl9yZXBseV9xdWV1ZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlICpyZXBseV9xOworCWludCBjcHVfaWQ7CisJaW50IGNwdV9ncm91cGluZywgbG9vcCwgZ3JvdXBpbmcsIGdyb3VwaW5nX21vZDsKKworCWlmICghX2Jhc2VfaXNfY29udHJvbGxlcl9tc2l4X2VuYWJsZWQoaW9jKSkKKwkJcmV0dXJuOworCisJbWVtc2V0KGlvYy0+Y3B1X21zaXhfdGFibGUsIDAsIGlvYy0+Y3B1X21zaXhfdGFibGVfc3opOworCS8qIHdoZW4gdGhlcmUgYXJlIG1vcmUgY3B1cyB0aGFuIGF2YWlsYWJsZSBtc2l4IHZlY3RvcnMsCisJICogdGhlbiBncm91cCBjcHVzIHRvZ2VhdGhlciBvbiBzYW1lIGlycQorCSAqLworCWlmIChpb2MtPmNwdV9jb3VudCA+IGlvYy0+bXNpeF92ZWN0b3JfY291bnQpIHsKKwkJZ3JvdXBpbmcgPSBpb2MtPmNwdV9jb3VudCAvIGlvYy0+bXNpeF92ZWN0b3JfY291bnQ7CisJCWdyb3VwaW5nX21vZCA9IGlvYy0+Y3B1X2NvdW50ICUgaW9jLT5tc2l4X3ZlY3Rvcl9jb3VudDsKKwkJaWYgKGdyb3VwaW5nIDwgMiB8fCAoZ3JvdXBpbmcgPT0gMiAmJiAhZ3JvdXBpbmdfbW9kKSkKKwkJCWNwdV9ncm91cGluZyA9IDI7CisJCWVsc2UgaWYgKGdyb3VwaW5nIDwgNCB8fCAoZ3JvdXBpbmcgPT0gNCAmJiAhZ3JvdXBpbmdfbW9kKSkKKwkJCWNwdV9ncm91cGluZyA9IDQ7CisJCWVsc2UgaWYgKGdyb3VwaW5nIDwgOCB8fCAoZ3JvdXBpbmcgPT0gOCAmJiAhZ3JvdXBpbmdfbW9kKSkKKwkJCWNwdV9ncm91cGluZyA9IDg7CisJCWVsc2UKKwkJCWNwdV9ncm91cGluZyA9IDE2OworCX0gZWxzZQorCQljcHVfZ3JvdXBpbmcgPSAwOworCisJbG9vcCA9IDA7CisJcmVwbHlfcSA9IGxpc3RfZW50cnkoaW9jLT5yZXBseV9xdWV1ZV9saXN0Lm5leHQsCisJICAgICBzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSwgbGlzdCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHVfaWQpIHsKKwkJaWYgKCFjcHVfZ3JvdXBpbmcpIHsKKwkJCWlvYy0+Y3B1X21zaXhfdGFibGVbY3B1X2lkXSA9IHJlcGx5X3EtPm1zaXhfaW5kZXg7CisJCQlyZXBseV9xID0gbGlzdF9lbnRyeShyZXBseV9xLT5saXN0Lm5leHQsCisJCQkgICAgc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUsIGxpc3QpOworCQl9IGVsc2UgeworCQkJaWYgKGxvb3AgPCBjcHVfZ3JvdXBpbmcpIHsKKwkJCQlpb2MtPmNwdV9tc2l4X3RhYmxlW2NwdV9pZF0gPQorCQkJCQlyZXBseV9xLT5tc2l4X2luZGV4OworCQkJCWxvb3ArKzsKKwkJCX0gZWxzZSB7CisJCQkJcmVwbHlfcSA9IGxpc3RfZW50cnkocmVwbHlfcS0+bGlzdC5uZXh0LAorCQkJCSAgICBzdHJ1Y3QgYWRhcHRlcl9yZXBseV9xdWV1ZSwgbGlzdCk7CisJCQkJaW9jLT5jcHVfbXNpeF90YWJsZVtjcHVfaWRdID0KKwkJCQkJcmVwbHlfcS0+bXNpeF9pbmRleDsKKwkJCQlsb29wID0gMTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCiAgKiBfYmFzZV9kaXNhYmxlX21zaXggLSBkaXNhYmxlcyBtc2l4CiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqCkBAIC0xMTYxLDggKzEzMTgsNiBAQAogewogCWlmIChpb2MtPm1zaXhfZW5hYmxlKSB7CiAJCXBjaV9kaXNhYmxlX21zaXgoaW9jLT5wZGV2KTsKLQkJa2ZyZWUoaW9jLT5tc2l4X3RhYmxlX2JhY2t1cCk7Ci0JCWlvYy0+bXNpeF90YWJsZV9iYWNrdXAgPSBOVUxMOwogCQlpb2MtPm1zaXhfZW5hYmxlID0gMDsKIAl9CiB9CkBAIC0xMTc1LDEwICsxMzMwLDEzIEBACiBzdGF0aWMgaW50CiBfYmFzZV9lbmFibGVfbXNpeChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCiB7Ci0Jc3RydWN0IG1zaXhfZW50cnkgZW50cmllczsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgKmE7CiAJaW50IHI7CisJaW50IGk7CiAJdTggdHJ5X21zaXggPSAwOwogCisJSU5JVF9MSVNUX0hFQUQoJmlvYy0+cmVwbHlfcXVldWVfbGlzdCk7CisKIAlpZiAobXNpeF9kaXNhYmxlID09IC0xIHx8IG1zaXhfZGlzYWJsZSA9PSAwKQogCQl0cnlfbXNpeCA9IDE7CiAKQEAgLTExODgsNTEgKzEzNDYsNDggQEAKIAlpZiAoX2Jhc2VfY2hlY2tfZW5hYmxlX21zaXgoaW9jKSAhPSAwKQogCQlnb3RvIHRyeV9pb2FwaWM7CiAKLQlpb2MtPm1zaXhfdGFibGVfYmFja3VwID0ga2NhbGxvYyhpb2MtPm1zaXhfdmVjdG9yX2NvdW50LAotCSAgICBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpb2MtPm1zaXhfdGFibGVfYmFja3VwKSB7Ci0JCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImFsbG9jYXRpb24gZm9yICIKLQkJICAgICJtc2l4X3RhYmxlX2JhY2t1cCBmYWlsZWQhISFcbiIsIGlvYy0+bmFtZSkpOworCWlvYy0+cmVwbHlfcXVldWVfY291bnQgPSBtaW5fdCh1OCwgaW9jLT5jcHVfY291bnQsCisJICAgIGlvYy0+bXNpeF92ZWN0b3JfY291bnQpOworCisJZW50cmllcyA9IGtjYWxsb2MoaW9jLT5yZXBseV9xdWV1ZV9jb3VudCwgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKKwkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyaWVzKSB7CisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImtjYWxsb2MgIgorCQkgICAgImZhaWxlZCBAIGF0ICVzOiVkLyVzKCkgISEhXG4iLCBpb2MtPm5hbWUsIF9fRklMRV9fLAorCQkgICAgX19MSU5FX18sIF9fZnVuY19fKSk7CiAJCWdvdG8gdHJ5X2lvYXBpYzsKIAl9CiAKLQltZW1zZXQoJmVudHJpZXMsIDAsIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkpOwotCXIgPSBwY2lfZW5hYmxlX21zaXgoaW9jLT5wZGV2LCAmZW50cmllcywgMSk7CisJZm9yIChpID0gMCwgYSA9IGVudHJpZXM7IGkgPCBpb2MtPnJlcGx5X3F1ZXVlX2NvdW50OyBpKyssIGErKykKKwkJYS0+ZW50cnkgPSBpOworCisJciA9IHBjaV9lbmFibGVfbXNpeChpb2MtPnBkZXYsIGVudHJpZXMsIGlvYy0+cmVwbHlfcXVldWVfY291bnQpOwogCWlmIChyKSB7CiAJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBjaV9lbmFibGVfbXNpeCAiCiAJCSAgICAiZmFpbGVkIChyPSVkKSAhISFcbiIsIGlvYy0+bmFtZSwgcikpOworCQlrZnJlZShlbnRyaWVzKTsKIAkJZ290byB0cnlfaW9hcGljOwogCX0KIAotCXIgPSByZXF1ZXN0X2lycShlbnRyaWVzLnZlY3RvciwgX2Jhc2VfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkgICAgaW9jLT5uYW1lLCBpb2MpOwotCWlmIChyKSB7Ci0JCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInVuYWJsZSB0byBhbGxvY2F0ZSAiCi0JCSAgICAiaW50ZXJydXB0ICVkICEhIVxuIiwgaW9jLT5uYW1lLCBlbnRyaWVzLnZlY3RvcikpOwotCQlwY2lfZGlzYWJsZV9tc2l4KGlvYy0+cGRldik7Ci0JCWdvdG8gdHJ5X2lvYXBpYzsKLQl9Ci0KLQlpb2MtPnBjaV9pcnEgPSBlbnRyaWVzLnZlY3RvcjsKIAlpb2MtPm1zaXhfZW5hYmxlID0gMTsKKwlmb3IgKGkgPSAwLCBhID0gZW50cmllczsgaSA8IGlvYy0+cmVwbHlfcXVldWVfY291bnQ7IGkrKywgYSsrKSB7CisJCXIgPSBfYmFzZV9yZXF1ZXN0X2lycShpb2MsIGksIGEtPnZlY3Rvcik7CisJCWlmIChyKSB7CisJCQlfYmFzZV9mcmVlX2lycShpb2MpOworCQkJX2Jhc2VfZGlzYWJsZV9tc2l4KGlvYyk7CisJCQlrZnJlZShlbnRyaWVzKTsKKwkJCWdvdG8gdHJ5X2lvYXBpYzsKKwkJfQorCX0KKworCWtmcmVlKGVudHJpZXMpOwogCXJldHVybiAwOwogCiAvKiBmYWlsYmFjayB0byBpb19hcGljIGludGVycnVwdCByb3V0aW5nICovCiAgdHJ5X2lvYXBpYzoKIAotCXIgPSByZXF1ZXN0X2lycShpb2MtPnBkZXYtPmlycSwgX2Jhc2VfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkgICAgaW9jLT5uYW1lLCBpb2MpOwotCWlmIChyKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgInVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQgJWQhXG4iLAotCQkgICAgaW9jLT5uYW1lLCBpb2MtPnBkZXYtPmlycSk7Ci0JCXIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X2ZhaWw7Ci0JfQorCXIgPSBfYmFzZV9yZXF1ZXN0X2lycShpb2MsIDAsIGlvYy0+cGRldi0+aXJxKTsKIAotCWlvYy0+cGNpX2lycSA9IGlvYy0+cGRldi0+aXJxOwotCXJldHVybiAwOwotCi0gb3V0X2ZhaWw6CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTEyNTEsNiArMTQwNiw3IEBACiAJaW50IGksIHIgPSAwOwogCXU2NCBwaW9fY2hpcCA9IDA7CiAJdTY0IGNoaXBfcGh5cyA9IDA7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3E7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwKIAkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOwpAQCAtMTMxMyw5ICsxNDY5LDExIEBACiAJaWYgKHIpCiAJCWdvdG8gb3V0X2ZhaWw7CiAKLQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IElSUSAlZFxuIiwKLQkgICAgaW9jLT5uYW1lLCAgKChpb2MtPm1zaXhfZW5hYmxlKSA/ICJQQ0ktTVNJLVggZW5hYmxlZCIgOgotCSAgICAiSU8tQVBJQyBlbmFibGVkIiksIGlvYy0+cGNpX2lycSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBseV9xLCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KQorCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IElSUSAlZFxuIiwKKwkJICAgIHJlcGx5X3EtPm5hbWUsICAoKGlvYy0+bXNpeF9lbmFibGUpID8gIlBDSS1NU0ktWCBlbmFibGVkIiA6CisJCSAgICAiSU8tQVBJQyBlbmFibGVkIiksIHJlcGx5X3EtPnZlY3Rvcik7CisKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiaW9tZW0oMHglMDE2bGx4KSwgbWFwcGVkKDB4JXApLCBzaXplKCVkKVxuIiwKIAkgICAgaW9jLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWNoaXBfcGh5cywgaW9jLT5jaGlwLCBtZW1hcF9zeik7CiAJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgImlvcG9ydCgweCUwMTZsbHgpLCBzaXplKCVkKVxuIiwKQEAgLTEzMzAsNyArMTQ4OCw2IEBACiAJaWYgKGlvYy0+Y2hpcF9waHlzKQogCQlpb3VubWFwKGlvYy0+Y2hpcCk7CiAJaW9jLT5jaGlwX3BoeXMgPSAwOwotCWlvYy0+cGNpX2lycSA9IC0xOwogCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoaW9jLT5wZGV2LCBpb2MtPmJhcnMpOwogCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTE1NzcsNiArMTczNCwxMiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdTgKK19iYXNlX2dldF9tc2l4X2luZGV4KHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKK3sKKwlyZXR1cm4gaW9jLT5jcHVfbXNpeF90YWJsZVtzbXBfcHJvY2Vzc29yX2lkKCldOworfQorCiAvKioKICAqIG1wdDJzYXNfYmFzZV9wdXRfc21pZF9zY3NpX2lvIC0gc2VuZCBTQ1NJX0lPIHJlcXVlc3QgdG8gZmlybXdhcmUKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdApAQCAtMTU5Myw3ICsxNzU2LDcgQEAKIAogCiAJZGVzY3JpcHRvci5TQ1NJSU8uUmVxdWVzdEZsYWdzID0gTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfU0NTSV9JTzsKLQlkZXNjcmlwdG9yLlNDU0lJTy5NU0l4SW5kZXggPSAwOyAvKiBUT0RPICovCisJZGVzY3JpcHRvci5TQ1NJSU8uTVNJeEluZGV4ID0gIF9iYXNlX2dldF9tc2l4X2luZGV4KGlvYyk7CiAJZGVzY3JpcHRvci5TQ1NJSU8uU01JRCA9IGNwdV90b19sZTE2KHNtaWQpOwogCWRlc2NyaXB0b3IuU0NTSUlPLkRldkhhbmRsZSA9IGNwdV90b19sZTE2KGhhbmRsZSk7CiAJZGVzY3JpcHRvci5TQ1NJSU8uTE1JRCA9IDA7CkBAIC0xNjE3LDcgKzE3ODAsNyBAQAogCiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuUmVxdWVzdEZsYWdzID0KIAkgICAgTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfSElHSF9QUklPUklUWTsKLQlkZXNjcmlwdG9yLkhpZ2hQcmlvcml0eS5NU0l4SW5kZXggPSAwOyAvKiBUT0RPICovCisJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuTVNJeEluZGV4ID0gIDA7CiAJZGVzY3JpcHRvci5IaWdoUHJpb3JpdHkuU01JRCA9IGNwdV90b19sZTE2KHNtaWQpOwogCWRlc2NyaXB0b3IuSGlnaFByaW9yaXR5LkxNSUQgPSAwOwogCWRlc2NyaXB0b3IuSGlnaFByaW9yaXR5LlJlc2VydmVkMSA9IDA7CkBAIC0xNjM5LDcgKzE4MDIsNyBAQAogCXU2NCAqcmVxdWVzdCA9ICh1NjQgKikmZGVzY3JpcHRvcjsKIAogCWRlc2NyaXB0b3IuRGVmYXVsdC5SZXF1ZXN0RmxhZ3MgPSBNUEkyX1JFUV9ERVNDUklQVF9GTEFHU19ERUZBVUxUX1RZUEU7Ci0JZGVzY3JpcHRvci5EZWZhdWx0Lk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KKwlkZXNjcmlwdG9yLkRlZmF1bHQuTVNJeEluZGV4ID0gIF9iYXNlX2dldF9tc2l4X2luZGV4KGlvYyk7CiAJZGVzY3JpcHRvci5EZWZhdWx0LlNNSUQgPSBjcHVfdG9fbGUxNihzbWlkKTsKIAlkZXNjcmlwdG9yLkRlZmF1bHQuTE1JRCA9IDA7CiAJZGVzY3JpcHRvci5EZWZhdWx0LkRlc2NyaXB0b3JUeXBlRGVwZW5kZW50ID0gMDsKQEAgLTE2NjQsNyArMTgyNyw3IEBACiAKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuUmVxdWVzdEZsYWdzID0KIAkgICAgTVBJMl9SRVFfREVTQ1JJUFRfRkxBR1NfU0NTSV9UQVJHRVQ7Ci0JZGVzY3JpcHRvci5TQ1NJVGFyZ2V0Lk1TSXhJbmRleCA9IDA7IC8qIFRPRE8gKi8KKwlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuTVNJeEluZGV4ID0gIF9iYXNlX2dldF9tc2l4X2luZGV4KGlvYyk7CiAJZGVzY3JpcHRvci5TQ1NJVGFyZ2V0LlNNSUQgPSBjcHVfdG9fbGUxNihzbWlkKTsKIAlkZXNjcmlwdG9yLlNDU0lUYXJnZXQuTE1JRCA9IDA7CiAJZGVzY3JpcHRvci5TQ1NJVGFyZ2V0LklvSW5kZXggPSBjcHVfdG9fbGUxNihpb19pbmRleCk7CkBAIC0yMTcxLDcgKzIzMzQsNyBAQAogCXUxNiBtYXhfc2dlX2VsZW1lbnRzOwogCXUxNiBudW1fb2ZfcmVwbHlfZnJhbWVzOwogCXUxNiBjaGFpbnNfbmVlZGVkX3Blcl9pbzsKLQl1MzIgc3osIHRvdGFsX3N6OworCXUzMiBzeiwgdG90YWxfc3osIHJlcGx5X3Bvc3RfZnJlZV9zejsKIAl1MzIgcmV0cnlfc3o7CiAJdTE2IG1heF9yZXF1ZXN0X2NyZWRpdDsKIAlpbnQgaTsKQEAgLTI0OTgsNyArMjY2MSwxMiBAQAogCXRvdGFsX3N6ICs9IHN6OwogCiAJLyogcmVwbHkgcG9zdCBxdWV1ZSwgMTYgYnl0ZSBhbGlnbiAqLwotCXN6ID0gaW9jLT5yZXBseV9wb3N0X3F1ZXVlX2RlcHRoICogc2l6ZW9mKE1waTJEZWZhdWx0UmVwbHlEZXNjcmlwdG9yX3QpOworCXJlcGx5X3Bvc3RfZnJlZV9zeiA9IGlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aCAqCisJICAgIHNpemVvZihNcGkyRGVmYXVsdFJlcGx5RGVzY3JpcHRvcl90KTsKKwlpZiAoX2Jhc2VfaXNfY29udHJvbGxlcl9tc2l4X2VuYWJsZWQoaW9jKSkKKwkJc3ogPSByZXBseV9wb3N0X2ZyZWVfc3ogKiBpb2MtPnJlcGx5X3F1ZXVlX2NvdW50OworCWVsc2UKKwkJc3ogPSByZXBseV9wb3N0X2ZyZWVfc3o7CiAJaW9jLT5yZXBseV9wb3N0X2ZyZWVfZG1hX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoInJlcGx5X3Bvc3RfZnJlZSBwb29sIiwKIAkgICAgaW9jLT5wZGV2LCBzeiwgMTYsIDApOwogCWlmICghaW9jLT5yZXBseV9wb3N0X2ZyZWVfZG1hX3Bvb2wpIHsKQEAgLTMxODYsNiArMzM1NCw3IEBACiAJZmFjdHMtPk1heENoYWluRGVwdGggPSBtcGlfcmVwbHkuTWF4Q2hhaW5EZXB0aDsKIAlmYWN0cy0+V2hvSW5pdCA9IG1waV9yZXBseS5XaG9Jbml0OwogCWZhY3RzLT5OdW1iZXJPZlBvcnRzID0gbXBpX3JlcGx5Lk51bWJlck9mUG9ydHM7CisJZmFjdHMtPk1heE1TSXhWZWN0b3JzID0gbXBpX3JlcGx5Lk1heE1TSXhWZWN0b3JzOwogCWZhY3RzLT5SZXF1ZXN0Q3JlZGl0ID0gbGUxNl90b19jcHUobXBpX3JlcGx5LlJlcXVlc3RDcmVkaXQpOwogCWZhY3RzLT5NYXhSZXBseURlc2NyaXB0b3JQb3N0UXVldWVEZXB0aCA9CiAJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS5NYXhSZXBseURlc2NyaXB0b3JQb3N0UXVldWVEZXB0aCk7CkBAIC0zMjQzLDcgKzM0MTIsOCBAQAogCW1waV9yZXF1ZXN0Lk1zZ1ZlcnNpb24gPSBjcHVfdG9fbGUxNihNUEkyX1ZFUlNJT04pOwogCW1waV9yZXF1ZXN0LkhlYWRlclZlcnNpb24gPSBjcHVfdG9fbGUxNihNUEkyX0hFQURFUl9WRVJTSU9OKTsKIAotCisJaWYgKF9iYXNlX2lzX2NvbnRyb2xsZXJfbXNpeF9lbmFibGVkKGlvYykpCisJCW1waV9yZXF1ZXN0Lkhvc3RNU0l4VmVjdG9ycyA9IGlvYy0+cmVwbHlfcXVldWVfY291bnQ7CiAJbXBpX3JlcXVlc3QuU3lzdGVtUmVxdWVzdEZyYW1lU2l6ZSA9IGNwdV90b19sZTE2KGlvYy0+cmVxdWVzdF9zei80KTsKIAltcGlfcmVxdWVzdC5SZXBseURlc2NyaXB0b3JQb3N0UXVldWVEZXB0aCA9CiAJICAgIGNwdV90b19sZTE2KGlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aCk7CkBAIC0zMzAyLDYgKzM0NzIsNTggQEAKIH0KIAogLyoqCisgKiBtcHQyc2FzX3BvcnRfZW5hYmxlX2RvbmUgLSBjb21tYW5kIGNvbXBsZXRpb24gcm91dGluZSBmb3IgcG9ydCBlbmFibGUKKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICogQHNtaWQ6IHN5c3RlbSByZXF1ZXN0IG1lc3NhZ2UgaW5kZXgKKyAqIEBtc2l4X2luZGV4OiBNU0lYIHRhYmxlIGluZGV4IHN1cHBsaWVkIGJ5IHRoZSBPUworICogQHJlcGx5OiByZXBseSBtZXNzYWdlIGZyYW1lKGxvd2VyIDMyYml0IGFkZHIpCisgKgorICogUmV0dXJuIDEgbWVhbmluZyBtZiBzaG91bGQgYmUgZnJlZWQgZnJvbSBfYmFzZV9pbnRlcnJ1cHQKKyAqICAgICAgICAwIG1lYW5zIHRoZSBtZiBpcyBmcmVlZCBmcm9tIHRoaXMgZnVuY3Rpb24uCisgKi8KK3U4CittcHQyc2FzX3BvcnRfZW5hYmxlX2RvbmUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTggbXNpeF9pbmRleCwKKwl1MzIgcmVwbHkpCit7CisJTVBJMkRlZmF1bHRSZXBseV90ICptcGlfcmVwbHk7CisJdTE2IGlvY19zdGF0dXM7CisKKwltcGlfcmVwbHkgPSBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKKwlpZiAobXBpX3JlcGx5ICYmIG1waV9yZXBseS0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9FVkVOVF9BQ0spCisJCXJldHVybiAxOworCisJaWYgKGlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgPT0gTVBUMl9DTURfTk9UX1VTRUQpCisJCXJldHVybiAxOworCisJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9DT01QTEVURTsKKwlpZiAobXBpX3JlcGx5KSB7CisJCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgfD0gTVBUMl9DTURfUkVQTFlfVkFMSUQ7CisJCW1lbWNweShpb2MtPnBvcnRfZW5hYmxlX2NtZHMucmVwbHksIG1waV9yZXBseSwKKwkJICAgIG1waV9yZXBseS0+TXNnTGVuZ3RoKjQpOworCX0KKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzICY9IH5NUFQyX0NNRF9QRU5ESU5HOworCisJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS0+SU9DU3RhdHVzKSAmIE1QSTJfSU9DU1RBVFVTX01BU0s7CisKKwlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKQorCQlpb2MtPnBvcnRfZW5hYmxlX2ZhaWxlZCA9IDE7CisKKwlpZiAoaW9jLT5pc19kcml2ZXJfbG9hZGluZykgeworCQlpZiAoaW9jX3N0YXR1cyA9PSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKSB7CisJCQltcHQyc2FzX3BvcnRfZW5hYmxlX2NvbXBsZXRlKGlvYyk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCWlvYy0+c3RhcnRfc2Nhbl9mYWlsZWQgPSBpb2Nfc3RhdHVzOworCQkJaW9jLT5zdGFydF9zY2FuID0gMDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWNvbXBsZXRlKCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSk7CisJcmV0dXJuIDE7Cit9CisKKworLyoqCiAgKiBfYmFzZV9zZW5kX3BvcnRfZW5hYmxlIC0gc2VuZCBwb3J0X2VuYWJsZShkaXNjb3Zlcnkgc3R1ZmYpIHRvIGZpcm13YXJlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKQEAgLTMzMTIsNjcgKzM1MzQsMTUxIEBACiBfYmFzZV9zZW5kX3BvcnRfZW5hYmxlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCiB7CiAJTXBpMlBvcnRFbmFibGVSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwotCXUzMiBpb2Nfc3RhdGU7CisJTXBpMlBvcnRFbmFibGVSZXBseV90ICptcGlfcmVwbHk7CiAJdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAlpbnQgciA9IDA7CiAJdTE2IHNtaWQ7CisJdTE2IGlvY19zdGF0dXM7CiAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VuZGluZyBwb3J0IGVuYWJsZSAhIVxuIiwgaW9jLT5uYW1lKTsKIAotCWlmIChpb2MtPmJhc2VfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CisJaWYgKGlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CiAJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBpbnRlcm5hbCBjb21tYW5kIGFscmVhZHkgaW4gdXNlXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQoaW9jLCBpb2MtPmJhc2VfY2JfaWR4KTsKKwlzbWlkID0gbXB0MnNhc19iYXNlX2dldF9zbWlkKGlvYywgaW9jLT5wb3J0X2VuYWJsZV9jYl9pZHgpOwogCWlmICghc21pZCkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogZmFpbGVkIG9idGFpbmluZyBhIHNtaWRcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKIAltcGlfcmVxdWVzdCA9IG1wdDJzYXNfYmFzZV9nZXRfbXNnX2ZyYW1lKGlvYywgc21pZCk7Ci0JaW9jLT5iYXNlX2NtZHMuc21pZCA9IHNtaWQ7CisJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnNtaWQgPSBzbWlkOwogCW1lbXNldChtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJQb3J0RW5hYmxlUmVxdWVzdF90KSk7CiAJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9QT1JUX0VOQUJMRTsKLQltcGlfcmVxdWVzdC0+VkZfSUQgPSAwOyAvKiBUT0RPICovCi0JbXBpX3JlcXVlc3QtPlZQX0lEID0gMDsKIAorCWluaXRfY29tcGxldGlvbigmaW9jLT5wb3J0X2VuYWJsZV9jbWRzLmRvbmUpOwogCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZpb2MtPmJhc2VfY21kcy5kb25lKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwKKwl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5wb3J0X2VuYWJsZV9jbWRzLmRvbmUsCiAJICAgIDMwMCpIWik7Ci0JaWYgKCEoaW9jLT5iYXNlX2NtZHMuc3RhdHVzICYgTVBUMl9DTURfQ09NUExFVEUpKSB7CisJaWYgKCEoaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyAmIE1QVDJfQ01EX0NPTVBMRVRFKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICIlczogdGltZW91dFxuIiwKIAkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOwogCQlfZGVidWdfZHVtcF9tZihtcGlfcmVxdWVzdCwKIAkJICAgIHNpemVvZihNcGkyUG9ydEVuYWJsZVJlcXVlc3RfdCkvNCk7Ci0JCWlmIChpb2MtPmJhc2VfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9SRVNFVCkKKwkJaWYgKGlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9SRVNFVCkKIAkJCXIgPSAtRUZBVUxUOwogCQllbHNlCiAJCQlyID0gLUVUSU1FOwogCQlnb3RvIG91dDsKLQl9IGVsc2UKLQkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGNvbXBsZXRlXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXykpOworCX0KKwltcGlfcmVwbHkgPSBpb2MtPnBvcnRfZW5hYmxlX2NtZHMucmVwbHk7CiAKLQlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfT1BFUkFUSU9OQUwsCi0JICAgIDYwLCBzbGVlcF9mbGFnKTsKLQlpZiAoaW9jX3N0YXRlKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgZ29pbmcgdG8gb3BlcmF0aW9uYWwgc3RhdGUgIgotCQkgICAgIiAoaW9jX3N0YXRlPTB4JXgpXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fLCBpb2Nfc3RhdGUpOworCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cykgJiBNUEkyX0lPQ1NUQVRVU19NQVNLOworCWlmIChpb2Nfc3RhdHVzICE9IE1QSTJfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IGZhaWxlZCB3aXRoIChpb2Nfc3RhdHVzPTB4JTA4eClcbiIsCisJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBpb2Nfc3RhdHVzKTsKIAkJciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCX0KICBvdXQ6Ci0JaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7Ci0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBvcnQgZW5hYmxlOiAlc1xuIiwKLQkgICAgaW9jLT5uYW1lLCAoKHIgPT0gMCkgPyAiU1VDQ0VTUyIgOiAiRkFJTEVEIikpOworCWlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6ICVzXG4iLCBpb2MtPm5hbWUsICgociA9PSAwKSA/CisJICAgICJTVUNDRVNTIiA6ICJGQUlMRUQiKSk7CiAJcmV0dXJuIHI7CiB9CiAKIC8qKgorICogbXB0MnNhc19wb3J0X2VuYWJsZSAtIGluaXRpYXRlIGZpcm13YXJlIGRpc2NvdmVyeSAoZG9uJ3Qgd2FpdCBmb3IgcmVwbHkpCisgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICovCitpbnQKK21wdDJzYXNfcG9ydF9lbmFibGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCU1waTJQb3J0RW5hYmxlUmVxdWVzdF90ICptcGlfcmVxdWVzdDsKKwl1MTYgc21pZDsKKworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZW5kaW5nIHBvcnQgZW5hYmxlICEhXG4iLCBpb2MtPm5hbWUpOworCisJaWYgKGlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBpbnRlcm5hbCBjb21tYW5kIGFscmVhZHkgaW4gdXNlXG4iLAorCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNtaWQgPSBtcHQyc2FzX2Jhc2VfZ2V0X3NtaWQoaW9jLCBpb2MtPnBvcnRfZW5hYmxlX2NiX2lkeCk7CisJaWYgKCFzbWlkKSB7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgIiVzOiBmYWlsZWQgb2J0YWluaW5nIGEgc21pZFxuIiwKKwkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfUEVORElORzsKKwltcGlfcmVxdWVzdCA9IG1wdDJzYXNfYmFzZV9nZXRfbXNnX2ZyYW1lKGlvYywgc21pZCk7CisJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnNtaWQgPSBzbWlkOworCW1lbXNldChtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJQb3J0RW5hYmxlUmVxdWVzdF90KSk7CisJbXBpX3JlcXVlc3QtPkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9QT1JUX0VOQUJMRTsKKworCW1wdDJzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogX2Jhc2VfZGV0ZXJtaW5lX3dhaXRfb25fZGlzY292ZXJ5IC0gZGVzcG9zaXRpb24KKyAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAorICoKKyAqIERlY2lkZSB3aGV0aGVyIHRvIHdhaXQgb24gZGlzY292ZXJ5IHRvIGNvbXBsZXRlLiBVc2VkIHRvIGVpdGhlcgorICogbG9jYXRlIGJvb3QgZGV2aWNlLCBvciByZXBvcnQgdm9sdW1lcyBhaGVhZCBvZiBwaHlzaWNhbCBkZXZpY2VzLgorICoKKyAqIFJldHVybnMgMSBmb3Igd2FpdCwgMCBmb3IgZG9uJ3Qgd2FpdAorICovCitzdGF0aWMgaW50CitfYmFzZV9kZXRlcm1pbmVfd2FpdF9vbl9kaXNjb3Zlcnkoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCS8qIFdlIHdhaXQgZm9yIGRpc2NvdmVyeSB0byBjb21wbGV0ZSBpZiBJUiBmaXJtd2FyZSBpcyBsb2FkZWQuCisJICogVGhlIHNhcyB0b3BvbG9neSBldmVudHMgYXJyaXZlIGJlZm9yZSBQRCBldmVudHMsIHNvIHdlIG5lZWQgdGltZSB0bworCSAqIHR1cm4gb24gdGhlIGJpdCBpbiBpb2MtPnBkX2hhbmRsZXMgdG8gaW5kaWNhdGUgUEQKKwkgKiBBbHNvLCBpdCBtYXliZSByZXF1aXJlZCB0byByZXBvcnQgVm9sdW1lcyBhaGVhZCBvZiBwaHlzaWNhbAorCSAqIGRldmljZXMgd2hlbiBNUEkyX0lPQ1BBR0U4X0lSRkxBR1NfTE9XX1ZPTFVNRV9NQVBQSU5HIGlzIHNldC4KKwkgKi8KKwlpZiAoaW9jLT5pcl9maXJtd2FyZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBpZiBubyBCaW9zLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gd2FpdCAqLworCWlmICghaW9jLT5iaW9zX3BnMy5CaW9zVmVyc2lvbikKKwkJcmV0dXJuIDA7CisKKwkvKiBCaW9zIGlzIHByZXNlbnQsIHRoZW4gd2UgZHJvcCBkb3duIGhlcmUuCisJICoKKwkgKiBJZiB0aGVyZSBhbnkgZW50cmllcyBpbiB0aGUgQmlvcyBQYWdlIDIsIHRoZW4gd2Ugd2FpdAorCSAqIGZvciBkaXNjb3ZlcnkgdG8gY29tcGxldGUuCisJICovCisKKwkvKiBDdXJyZW50IEJvb3QgRGV2aWNlICovCisJaWYgKChpb2MtPmJpb3NfcGcyLkN1cnJlbnRCb290RGV2aWNlRm9ybSAmCisJICAgIE1QSTJfQklPU1BBR0UyX0ZPUk1fTUFTSykgPT0KKwkgICAgTVBJMl9CSU9TUEFHRTJfRk9STV9OT19ERVZJQ0VfU1BFQ0lGSUVEICYmCisJLyogUmVxdWVzdCBCb290IERldmljZSAqLworCSAgIChpb2MtPmJpb3NfcGcyLlJlcUJvb3REZXZpY2VGb3JtICYKKwkgICAgTVBJMl9CSU9TUEFHRTJfRk9STV9NQVNLKSA9PQorCSAgICBNUEkyX0JJT1NQQUdFMl9GT1JNX05PX0RFVklDRV9TUEVDSUZJRUQgJiYKKwkvKiBBbHRlcm5hdGUgUmVxdWVzdCBCb290IERldmljZSAqLworCSAgIChpb2MtPmJpb3NfcGcyLlJlcUFsdEJvb3REZXZpY2VGb3JtICYKKwkgICAgTVBJMl9CSU9TUEFHRTJfRk9STV9NQVNLKSA9PQorCSAgICBNUEkyX0JJT1NQQUdFMl9GT1JNX05PX0RFVklDRV9TUEVDSUZJRUQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKworLyoqCiAgKiBfYmFzZV91bm1hc2tfZXZlbnRzIC0gdHVybiBvbiBub3RpZmljYXRpb24gZm9yIHRoaXMgZXZlbnQKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQGV2ZW50OiBmaXJtd2FyZSBldmVudApAQCAtMzUxMiw5ICszODE4LDYgQEAKIAl1MzIgaGNiX3NpemU7CiAKIAlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VuZGluZyBkaWFnIHJlc2V0ICEhXG4iLCBpb2MtPm5hbWUpOwotCi0JX2Jhc2Vfc2F2ZV9tc2l4X3RhYmxlKGlvYyk7Ci0KIAlkcnNwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiY2xlYXIgaW50ZXJydXB0c1xuIiwKIAkgICAgaW9jLT5uYW1lKSk7CiAKQEAgLTM2MTAsNyArMzkxMyw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCV9iYXNlX3Jlc3RvcmVfbXNpeF90YWJsZShpb2MpOwogCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJkaWFnIHJlc2V0OiBTVUNDRVNTXG4iLCBpb2MtPm5hbWUpOwogCXJldHVybiAwOwogCkBAIC0zNjkxLDYgKzM5OTMsOSBAQAogCXUxNiBzbWlkOwogCXN0cnVjdCBfdHJfbGlzdCAqZGVsYXllZF90ciwgKmRlbGF5ZWRfdHJfbmV4dDsKIAl1OCBoaWRlX2ZsYWc7CisJc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgKnJlcGx5X3E7CisJbG9uZyByZXBseV9wb3N0X2ZyZWU7CisJdTMyIHJlcGx5X3Bvc3RfZnJlZV9zejsKIAogCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CkBAIC0zNzU2LDIxICs0MDYxLDQ2IEBACiAJICAgIGlvYy0+cmVwbHlfc3opCiAJCWlvYy0+cmVwbHlfZnJlZVtpXSA9IGNwdV90b19sZTMyKHJlcGx5X2FkZHJlc3MpOwogCisJLyogaW5pdGlhbGl6ZSByZXBseSBxdWV1ZXMgKi8KKwlfYmFzZV9hc3NpZ25fcmVwbHlfcXVldWVzKGlvYyk7CisKIAkvKiBpbml0aWFsaXplIFJlcGx5IFBvc3QgRnJlZSBRdWV1ZSAqLwotCWZvciAoaSA9IDA7IGkgPCBpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGg7IGkrKykKLQkJaW9jLT5yZXBseV9wb3N0X2ZyZWVbaV0uV29yZHMgPSBjcHVfdG9fbGU2NChVTExPTkdfTUFYKTsKKwlyZXBseV9wb3N0X2ZyZWUgPSAobG9uZylpb2MtPnJlcGx5X3Bvc3RfZnJlZTsKKwlyZXBseV9wb3N0X2ZyZWVfc3ogPSBpb2MtPnJlcGx5X3Bvc3RfcXVldWVfZGVwdGggKgorCSAgICBzaXplb2YoTXBpMkRlZmF1bHRSZXBseURlc2NyaXB0b3JfdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBseV9xLCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KSB7CisJCXJlcGx5X3EtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCA9IDA7CisJCXJlcGx5X3EtPnJlcGx5X3Bvc3RfZnJlZSA9IChNcGkyUmVwbHlEZXNjcmlwdG9yc1VuaW9uX3QgKikKKwkJICAgIHJlcGx5X3Bvc3RfZnJlZTsKKwkJZm9yIChpID0gMDsgaSA8IGlvYy0+cmVwbHlfcG9zdF9xdWV1ZV9kZXB0aDsgaSsrKQorCQkJcmVwbHlfcS0+cmVwbHlfcG9zdF9mcmVlW2ldLldvcmRzID0KKwkJCQkJCQljcHVfdG9fbGU2NChVTExPTkdfTUFYKTsKKwkJaWYgKCFfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZChpb2MpKQorCQkJZ290byBza2lwX2luaXRfcmVwbHlfcG9zdF9mcmVlX3F1ZXVlOworCQlyZXBseV9wb3N0X2ZyZWUgKz0gcmVwbHlfcG9zdF9mcmVlX3N6OworCX0KKyBza2lwX2luaXRfcmVwbHlfcG9zdF9mcmVlX3F1ZXVlOgogCiAJciA9IF9iYXNlX3NlbmRfaW9jX2luaXQoaW9jLCBzbGVlcF9mbGFnKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQkvKiBpbml0aWFsaXplIHRoZSBpbmRleCdzICovCisJLyogaW5pdGlhbGl6ZSByZXBseSBmcmVlIGhvc3QgaW5kZXggKi8KIAlpb2MtPnJlcGx5X2ZyZWVfaG9zdF9pbmRleCA9IGlvYy0+cmVwbHlfZnJlZV9xdWV1ZV9kZXB0aCAtIDE7Ci0JaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXggPSAwOwogCXdyaXRlbChpb2MtPnJlcGx5X2ZyZWVfaG9zdF9pbmRleCwgJmlvYy0+Y2hpcC0+UmVwbHlGcmVlSG9zdEluZGV4KTsKLQl3cml0ZWwoMCwgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4KTsKKworCS8qIGluaXRpYWxpemUgcmVwbHkgcG9zdCBob3N0IGluZGV4ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBseV9xLCAmaW9jLT5yZXBseV9xdWV1ZV9saXN0LCBsaXN0KSB7CisJCXdyaXRlbChyZXBseV9xLT5tc2l4X2luZGV4IDw8IE1QSTJfUlBISV9NU0lYX0lOREVYX1NISUZULAorCQkgICAgJmlvYy0+Y2hpcC0+UmVwbHlQb3N0SG9zdEluZGV4KTsKKwkJaWYgKCFfYmFzZV9pc19jb250cm9sbGVyX21zaXhfZW5hYmxlZChpb2MpKQorCQkJZ290byBza2lwX2luaXRfcmVwbHlfcG9zdF9ob3N0X2luZGV4OworCX0KKworIHNraXBfaW5pdF9yZXBseV9wb3N0X2hvc3RfaW5kZXg6CiAKIAlfYmFzZV91bm1hc2tfaW50ZXJydXB0cyhpb2MpOworCiAJciA9IF9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihpb2MsIHNsZWVwX2ZsYWcpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTM3NzgsNyArNDEwOCwxOCBAQAogCWlmIChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkKIAkJX2Jhc2Vfc3RhdGljX2NvbmZpZ19wYWdlcyhpb2MpOwogCi0JaWYgKGlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUgJiYgaW9jLT5pc193YXJwZHJpdmUpIHsKKworCWlmIChpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKSB7CisKKworCisJCWlvYy0+d2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlID0KKwkJICAgIF9iYXNlX2RldGVybWluZV93YWl0X29uX2Rpc2NvdmVyeShpb2MpOworCQlyZXR1cm4gcjsgLyogc2Nhbl9zdGFydCBhbmQgc2Nhbl9maW5pc2hlZCBzdXBwb3J0ICovCisJfQorCisKKwlpZiAoaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUgJiYgaW9jLT5pc193YXJwZHJpdmUpIHsKIAkJaWYgKGlvYy0+bWFudV9wZzEwLk9FTUlkZW50aWZpZXIgID09IDB4ODApIHsKIAkJCWhpZGVfZmxhZyA9ICh1OCkgKGlvYy0+bWFudV9wZzEwLk9FTVNwZWNpZmljRmxhZ3MwICYKIAkJCSAgICBNRkdfUEFHRTEwX0hJREVfU1NEU19NQVNLKTsKQEAgLTM3ODcsMTMgKzQxMjgsNiBAQAogCQl9CiAJfQogCi0JaWYgKGlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUpIHsKLQkJaWYgKGRpYWdfYnVmZmVyX2VuYWJsZSAhPSAwKQotCQkJbXB0MnNhc19lbmFibGVfZGlhZ19idWZmZXIoaW9jLCBkaWFnX2J1ZmZlcl9lbmFibGUpOwotCQlpZiAoZGlzYWJsZV9kaXNjb3ZlcnkgPiAwKQotCQkJcmV0dXJuIHI7Ci0JfQotCiAJciA9IF9iYXNlX3NlbmRfcG9ydF9lbmFibGUoaW9jLCBzbGVlcF9mbGFnKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CkBAIC0zODE5LDE0ICs0MTUzLDEwIEBACiAJaW9jLT5zaG9zdF9yZWNvdmVyeSA9IDE7CiAJX2Jhc2VfbWFrZV9pb2NfcmVhZHkoaW9jLCBDQU5fU0xFRVAsIFNPRlRfUkVTRVQpOwogCWlvYy0+c2hvc3RfcmVjb3ZlcnkgPSAwOwotCWlmIChpb2MtPnBjaV9pcnEpIHsKLQkJc3luY2hyb25pemVfaXJxKHBkZXYtPmlycSk7Ci0JCWZyZWVfaXJxKGlvYy0+cGNpX2lycSwgaW9jKTsKLQl9CisJX2Jhc2VfZnJlZV9pcnEoaW9jKTsKIAlfYmFzZV9kaXNhYmxlX21zaXgoaW9jKTsKIAlpZiAoaW9jLT5jaGlwX3BoeXMpCiAJCWlvdW5tYXAoaW9jLT5jaGlwKTsKLQlpb2MtPnBjaV9pcnEgPSAtMTsKIAlpb2MtPmNoaXBfcGh5cyA9IDA7CiAJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpb2MtPnBkZXYsIGlvYy0+YmFycyk7CiAJcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7CkBAIC0zODQ0LDE0ICs0MTc0LDUwIEBACiBtcHQyc2FzX2Jhc2VfYXR0YWNoKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKIHsKIAlpbnQgciwgaTsKKwlpbnQgY3B1X2lkLCBsYXN0X2NwdV9pZCA9IDA7CiAKIAlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlc1xuIiwgaW9jLT5uYW1lLAogCSAgICBfX2Z1bmNfXykpOwogCisJLyogc2V0dXAgY3B1X21zaXhfdGFibGUgKi8KKwlpb2MtPmNwdV9jb3VudCA9IG51bV9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X2lkKQorCQlsYXN0X2NwdV9pZCA9IGNwdV9pZDsKKwlpb2MtPmNwdV9tc2l4X3RhYmxlX3N6ID0gbGFzdF9jcHVfaWQgKyAxOworCWlvYy0+Y3B1X21zaXhfdGFibGUgPSBremFsbG9jKGlvYy0+Y3B1X21zaXhfdGFibGVfc3osIEdGUF9LRVJORUwpOworCWlvYy0+cmVwbHlfcXVldWVfY291bnQgPSAxOworCWlmICghaW9jLT5jcHVfbXNpeF90YWJsZSkgeworCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJhbGxvY2F0aW9uIGZvciAiCisJCSAgICAiY3B1X21zaXhfdGFibGUgZmFpbGVkISEhXG4iLCBpb2MtPm5hbWUpKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOworCX0KKworCWlmIChpb2MtPmlzX3dhcnBkcml2ZSkgeworCQlpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCA9IGtjYWxsb2MoaW9jLT5jcHVfbXNpeF90YWJsZV9zeiwKKwkJICAgIHNpemVvZihyZXNvdXJjZV9zaXplX3QgKiksIEdGUF9LRVJORUwpOworCQlpZiAoIWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4KSB7CisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICJhbGxvY2F0aW9uICIKKwkJCQkiZm9yIGNwdV9tc2l4X3RhYmxlIGZhaWxlZCEhIVxuIiwgaW9jLT5uYW1lKSk7CisJCQlyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOworCQl9CisJfQorCiAJciA9IG1wdDJzYXNfYmFzZV9tYXBfcmVzb3VyY2VzKGlvYyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKGlvYy0+aXNfd2FycGRyaXZlKSB7CisJCWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4WzBdID0KKwkJICAgIChyZXNvdXJjZV9zaXplX3QgKikmaW9jLT5jaGlwLT5SZXBseVBvc3RIb3N0SW5kZXg7CisKKwkJZm9yIChpID0gMTsgaSA8IGlvYy0+Y3B1X21zaXhfdGFibGVfc3o7IGkrKykKKwkJCWlvYy0+cmVwbHlfcG9zdF9ob3N0X2luZGV4W2ldID0gKHJlc291cmNlX3NpemVfdCAqKQorCQkJKCh1OCAqKSZpb2MtPmNoaXAtPkRvb3JiZWxsICsgKDB4NDAwMCArICgoaSAtIDEpCisJCQkqIDQpKSk7CisJfQorCiAJcGNpX3NldF9kcnZkYXRhKGlvYy0+cGRldiwgaW9jLT5zaG9zdCk7CiAJciA9IF9iYXNlX2dldF9pb2NfZmFjdHMoaW9jLCBDQU5fU0xFRVApOwogCWlmIChyKQpAQCAtMzg5OCw2ICs0MjY0LDEwIEBACiAJaW9jLT5iYXNlX2NtZHMucmVwbHkgPSBremFsbG9jKGlvYy0+cmVwbHlfc3osIEdGUF9LRVJORUwpOwogCWlvYy0+YmFzZV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOwogCisJLyogcG9ydF9lbmFibGUgY29tbWFuZCBiaXRzICovCisJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnJlcGx5ID0ga3phbGxvYyhpb2MtPnJlcGx5X3N6LCBHRlBfS0VSTkVMKTsKKwlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzID0gTVBUMl9DTURfTk9UX1VTRUQ7CisKIAkvKiB0cmFuc3BvcnQgaW50ZXJuYWwgY29tbWFuZCBiaXRzICovCiAJaW9jLT50cmFuc3BvcnRfY21kcy5yZXBseSA9IGt6YWxsb2MoaW9jLT5yZXBseV9zeiwgR0ZQX0tFUk5FTCk7CiAJaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgPSBNUFQyX0NNRF9OT1RfVVNFRDsKQEAgLTM5MzksOCArNDMwOSw2IEBACiAJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwogCX0KIAotCWluaXRfY29tcGxldGlvbigmaW9jLT5zaG9zdF9yZWNvdmVyeV9kb25lKTsKLQogCWZvciAoaSA9IDA7IGkgPCBNUEkyX0VWRU5UX05PVElGWV9FVkVOVE1BU0tfV09SRFM7IGkrKykKIAkJaW9jLT5ldmVudF9tYXNrc1tpXSA9IC0xOwogCkBAIC0zOTYzLDcgKzQzMzEsNiBAQAogCQlfYmFzZV91cGRhdGVfbWlzc2luZ19kZWxheShpb2MsIG1pc3NpbmdfZGVsYXlbMF0sCiAJCSAgICBtaXNzaW5nX2RlbGF5WzFdKTsKIAotCW1wdDJzYXNfYmFzZV9zdGFydF93YXRjaGRvZyhpb2MpOwogCXJldHVybiAwOwogCiAgb3V0X2ZyZWVfcmVzb3VyY2VzOgpAQCAtMzk3MiwxMiArNDMzOSwxNiBAQAogCW1wdDJzYXNfYmFzZV9mcmVlX3Jlc291cmNlcyhpb2MpOwogCV9iYXNlX3JlbGVhc2VfbWVtb3J5X3Bvb2xzKGlvYyk7CiAJcGNpX3NldF9kcnZkYXRhKGlvYy0+cGRldiwgTlVMTCk7CisJa2ZyZWUoaW9jLT5jcHVfbXNpeF90YWJsZSk7CisJaWYgKGlvYy0+aXNfd2FycGRyaXZlKQorCQlrZnJlZShpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCk7CiAJa2ZyZWUoaW9jLT5wZF9oYW5kbGVzKTsKIAlrZnJlZShpb2MtPnRtX2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+dHJhbnNwb3J0X2NtZHMucmVwbHkpOwogCWtmcmVlKGlvYy0+c2NzaWhfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5jb25maWdfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5iYXNlX2NtZHMucmVwbHkpOworCWtmcmVlKGlvYy0+cG9ydF9lbmFibGVfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5jdGxfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5jdGxfY21kcy5zZW5zZSk7CiAJa2ZyZWUoaW9jLT5wZmFjdHMpOwpAQCAtNDAwOSwxMSArNDM4MCwxNSBAQAogCW1wdDJzYXNfYmFzZV9mcmVlX3Jlc291cmNlcyhpb2MpOwogCV9iYXNlX3JlbGVhc2VfbWVtb3J5X3Bvb2xzKGlvYyk7CiAJcGNpX3NldF9kcnZkYXRhKGlvYy0+cGRldiwgTlVMTCk7CisJa2ZyZWUoaW9jLT5jcHVfbXNpeF90YWJsZSk7CisJaWYgKGlvYy0+aXNfd2FycGRyaXZlKQorCQlrZnJlZShpb2MtPnJlcGx5X3Bvc3RfaG9zdF9pbmRleCk7CiAJa2ZyZWUoaW9jLT5wZF9oYW5kbGVzKTsKIAlrZnJlZShpb2MtPnBmYWN0cyk7CiAJa2ZyZWUoaW9jLT5jdGxfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT5jdGxfY21kcy5zZW5zZSk7CiAJa2ZyZWUoaW9jLT5iYXNlX2NtZHMucmVwbHkpOworCWtmcmVlKGlvYy0+cG9ydF9lbmFibGVfY21kcy5yZXBseSk7CiAJa2ZyZWUoaW9jLT50bV9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnRyYW5zcG9ydF9jbWRzLnJlcGx5KTsKIAlrZnJlZShpb2MtPnNjc2loX2NtZHMucmVwbHkpOwpAQCAtNDA1NSw2ICs0NDMwLDIwIEBACiAJCQltcHQyc2FzX2Jhc2VfZnJlZV9zbWlkKGlvYywgaW9jLT5iYXNlX2NtZHMuc21pZCk7CiAJCQljb21wbGV0ZSgmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJCX0KKwkJaWYgKGlvYy0+cG9ydF9lbmFibGVfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CisJCQlpb2MtPnBvcnRfZW5hYmxlX2ZhaWxlZCA9IDE7CisJCQlpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX1JFU0VUOworCQkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIGlvYy0+cG9ydF9lbmFibGVfY21kcy5zbWlkKTsKKwkJCWlmIChpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKSB7CisJCQkJaW9jLT5zdGFydF9zY2FuX2ZhaWxlZCA9CisJCQkJICAgIE1QSTJfSU9DU1RBVFVTX0lOVEVSTkFMX0VSUk9SOworCQkJCWlvYy0+c3RhcnRfc2NhbiA9IDA7CisJCQkJaW9jLT5wb3J0X2VuYWJsZV9jbWRzLnN0YXR1cyA9CisJCQkJCQlNUFQyX0NNRF9OT1RfVVNFRDsKKwkJCX0gZWxzZQorCQkJCWNvbXBsZXRlKCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSk7CisKKwkJfQogCQlpZiAoaW9jLT5jb25maWdfY21kcy5zdGF0dXMgJiBNUFQyX0NNRF9QRU5ESU5HKSB7CiAJCQlpb2MtPmNvbmZpZ19jbWRzLnN0YXR1cyB8PSBNUFQyX0NNRF9SRVNFVDsKIAkJCW1wdDJzYXNfYmFzZV9mcmVlX3NtaWQoaW9jLCBpb2MtPmNvbmZpZ19jbWRzLnNtaWQpOwpAQCAtNDEyMCw3ICs0NTA5LDYgQEAKIHsKIAlpbnQgcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IHBlX2NvbXBsZXRlID0gaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZTsKIAogCWR0bXByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKQEAgLTQxNjcsNyArNDU1NSw4IEBACiAJLyogSWYgdGhpcyBoYXJkIHJlc2V0IGlzIGNhbGxlZCB3aGlsZSBwb3J0IGVuYWJsZSBpcyBhY3RpdmUsIHRoZW4KIAkgKiB0aGVyZSBpcyBubyByZWFzb24gdG8gY2FsbCBtYWtlX2lvY19vcGVyYXRpb25hbAogCSAqLwotCWlmIChwZV9jb21wbGV0ZSkgeworCWlmIChpb2MtPmlzX2RyaXZlcl9sb2FkaW5nICYmIGlvYy0+cG9ydF9lbmFibGVfZmFpbGVkKSB7CisJCWlvYy0+cmVtb3ZlX2hvc3QgPSAxOwogCQlyID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDE4MSw3ICs0NTcwLDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwogCWlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1cyA9IHI7CiAJaW9jLT5zaG9zdF9yZWNvdmVyeSA9IDA7Ci0JY29tcGxldGUoJmlvYy0+c2hvc3RfcmVjb3ZlcnlfZG9uZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwogCW11dGV4X3VubG9jaygmaW9jLT5yZXNldF9pbl9wcm9ncmVzc19tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfYmFzZS5oIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKaW5kZXggOGQ1YmUyMS4uM2MzYmFiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19iYXNlLmgKQEAgLTY5LDggKzY5LDggQEAKICNkZWZpbmUgTVBUMlNBU19EUklWRVJfTkFNRQkJIm1wdDJzYXMiCiAjZGVmaW5lIE1QVDJTQVNfQVVUSE9SCSJMU0kgQ29ycG9yYXRpb24gPERMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20+IgogI2RlZmluZSBNUFQyU0FTX0RFU0NSSVBUSU9OCSJMU0kgTVBUIEZ1c2lvbiBTQVMgMi4wIERldmljZSBEcml2ZXIiCi0jZGVmaW5lIE1QVDJTQVNfRFJJVkVSX1ZFUlNJT04JCSIwOS4xMDAuMDAuMDAiCi0jZGVmaW5lIE1QVDJTQVNfTUFKT1JfVkVSU0lPTgkJMDkKKyNkZWZpbmUgTVBUMlNBU19EUklWRVJfVkVSU0lPTgkJIjEwLjEwMC4wMC4wMCIKKyNkZWZpbmUgTVBUMlNBU19NQUpPUl9WRVJTSU9OCQkxMAogI2RlZmluZSBNUFQyU0FTX01JTk9SX1ZFUlNJT04JCTEwMAogI2RlZmluZSBNUFQyU0FTX0JVSUxEX1ZFUlNJT04JCTAwCiAjZGVmaW5lIE1QVDJTQVNfUkVMRUFTRV9WRVJTSU9OCQkwMApAQCAtNTQ0LDYgKzU0NCwyOCBAQAogCiB0eXBlZGVmIHZvaWQgKCpNUFRfQUREX1NHRSkodm9pZCAqcGFkZHIsIHUzMiBmbGFnc19sZW5ndGgsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwogCisvKioKKyAqIHN0cnVjdCBhZGFwdGVyX3JlcGx5X3F1ZXVlIC0gdGhlIHJlcGx5IHF1ZXVlIHN0cnVjdAorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKiBAbXNpeF9pbmRleDogbXNpeCBpbmRleCBpbnRvIHZlY3RvciB0YWJsZQorICogQHZlY3RvcjogaXJxIHZlY3RvcgorICogQHJlcGx5X3Bvc3RfaG9zdF9pbmRleDogaGVhZCBpbmRleCBpbiB0aGUgcG9vbCB3aGVyZSBGVyBjb21wbGV0ZXMgSU8KKyAqIEByZXBseV9wb3N0X2ZyZWU6IHJlcGx5IHBvc3QgYmFzZSB2aXJ0IGFkZHJlc3MKKyAqIEBuYW1lOiB0aGUgbmFtZSByZWdpc3RlcmVkIHRvIHJlcXVlc3RfaXJxKCkKKyAqIEBidXN5OiBpc3IgaXMgYWN0aXZlbHkgcHJvY2Vzc2luZyByZXBsaWVzIG9uIGFub3RoZXIgY3B1CisgKiBAbGlzdDogdGhpcyBsaXN0CisqLworc3RydWN0IGFkYXB0ZXJfcmVwbHlfcXVldWUgeworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIJKmlvYzsKKwl1OAkJCW1zaXhfaW5kZXg7CisJdW5zaWduZWQgaW50CQl2ZWN0b3I7CisJdTMyCQkJcmVwbHlfcG9zdF9ob3N0X2luZGV4OworCU1waTJSZXBseURlc2NyaXB0b3JzVW5pb25fdCAqcmVwbHlfcG9zdF9mcmVlOworCWNoYXIJCQluYW1lW01QVF9OQU1FX0xFTkdUSF07CisJYXRvbWljX3QJCWJ1c3k7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworfTsKKwogLyogSU9DIEZhY3RzIGFuZCBQb3J0IEZhY3RzIGNvbnZlcnRlZCBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gY3B1ICovCiB1bmlvbiBtcGkyX3ZlcnNpb25fdW5pb24gewogCU1QSTJfVkVSU0lPTl9TVFJVQ1QJCVN0cnVjdDsKQEAgLTYwNiw3ICs2MjgsNyBAQAogICogQGxpc3Q6IGlvY19saXN0CiAgKiBAc2hvc3Q6IHNob3N0IG9iamVjdAogICogQGlkOiB1bmlxdWUgYWRhcHRlciBpZAotICogQHBjaV9pcnE6IGlycSBudW1iZXIKKyAqIEBjcHVfY291bnQ6IG51bWJlciBvbmxpbmUgY3B1cwogICogQG5hbWU6IGdlbmVyaWMgaW9jIHN0cmluZwogICogQHRtcF9zdHJpbmc6IHRtcCBzdHJpbmcgdXNlZCBmb3IgbG9nZ2luZwogICogQHBkZXY6IHBjaSBwZGV2IG9iamVjdApAQCAtNjMzLDExICs2NTUsMTYgQEAKICAqIEBpZ25vcmVfbG9naW5mb3M6IGlnbm9yZSBsb2dpbmZvcyBkdXJpbmcgdGFzayBtYW5hZ2VtZW50CiAgKiBAcmVtb3ZlX2hvc3Q6IGZsYWcgZm9yIHdoZW4gZHJpdmVyIHVubG9hZHMsIHRvIGF2b2lkIHNlbmRpbmcgZGV2IHJlc2V0cwogICogQHBjaV9lcnJvcl9yZWNvdmVyeTogZmxhZyB0byBwcmV2ZW50IGlvYyBhY2Nlc3MgdW50aWwgc2xvdCByZXNldCBjb21wbGV0ZXMKLSAqIEB3YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZToKKyAqIEB3YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGU6IGZsYWcgc2V0IGF0IGRyaXZlciBsb2FkIHRpbWUgd2hlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgb24gcmVwb3J0aW5nIGRldmljZXMKKyAqIEBpc19kcml2ZXJfbG9hZGluZzogZmxhZyBzZXQgYXQgZHJpdmVyIGxvYWQgdGltZQorICogQHBvcnRfZW5hYmxlX2ZhaWxlZDogZmxhZyBzZXQgd2hlbiBwb3J0IGVuYWJsZSBoYXMgZmFpbGVkCisgKiBAc3RhcnRfc2NhbjogZmxhZyBzZXQgZnJvbSBzY2FuX3N0YXJ0IGNhbGxiYWNrLCBjbGVhcmVkIGZyb20gX21wdDJzYXNfZndfd29yaworICogQHN0YXJ0X3NjYW5fZmFpbGVkOiBtZWFucyBwb3J0IGVuYWJsZSBmYWlsZWQsIHJldHVybidzIHRoZSBpb2Nfc3RhdHVzCiAgKiBAbXNpeF9lbmFibGU6IGZsYWcgaW5kaWNhdGluZyBtc2l4IGlzIGVuYWJsZWQKICAqIEBtc2l4X3ZlY3Rvcl9jb3VudDogbnVtYmVyIG1zaXggdmVjdG9ycwotICogQG1zaXhfdGFibGU6IHZpcnQgYWRkcmVzcyB0byB0aGUgbXNpeCB0YWJsZQotICogQG1zaXhfdGFibGVfYmFja3VwOiBiYWNrdXAgbXNpeCB0YWJsZQorICogQGNwdV9tc2l4X3RhYmxlOiB0YWJsZSBmb3IgbWFwcGluZyBjcHVzIHRvIG1zaXggaW5kZXgKKyAqIEBjcHVfbXNpeF90YWJsZV9zejogdGFibGUgc2l6ZQogICogQHNjc2lfaW9fY2JfaWR4OiBzaG9zdCBnZW5lcmF0ZWQgY29tbWFuZHMKICAqIEB0bV9jYl9pZHg6IHRhc2sgbWFuYWdlbWVudCBjb21tYW5kcwogICogQHNjc2loX2NiX2lkeDogc2NzaWggaW50ZXJuYWwgY29tbWFuZHMKQEAgLTcyOCw3ICs3NTUsOCBAQAogICogQHJlcGx5X3Bvc3RfcXVldWVfZGVwdGg6IHJlcGx5IHBvc3QgcXVldWUgZGVwdGgKICAqIEByZXBseV9wb3N0X2ZyZWU6IHBvb2wgZm9yIHJlcGx5IHBvc3QgKDY0Yml0IGRlc2NyaXB0b3IpCiAgKiBAcmVwbHlfcG9zdF9mcmVlX2RtYToKLSAqIEByZXBseV9wb3N0X2ZyZWVfZG1hX3Bvb2w6CisgKiBAcmVwbHlfcXVldWVfY291bnQ6IG51bWJlciBvZiByZXBseSBxdWV1ZSdzCisgKiBAcmVwbHlfcXVldWVfbGlzdDogbGluayBsaXN0IGNvbnRhbmluZyB0aGUgcmVwbHkgcXVldWUgaW5mbwogICogQHJlcGx5X3Bvc3RfaG9zdF9pbmRleDogaGVhZCBpbmRleCBpbiB0aGUgcG9vbCB3aGVyZSBGVyBjb21wbGV0ZXMgSU8KICAqIEBkZWxheWVkX3RyX2xpc3Q6IHRhcmdldCByZXNldCBsaW5rIGxpc3QKICAqIEBkZWxheWVkX3RyX3ZvbHVtZV9saXN0OiB2b2x1bWUgdGFyZ2V0IHJlc2V0IGxpbmsgbGlzdApAQCAtNzM3LDcgKzc2NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCXU4CQlpZDsKLQl1MzIJCXBjaV9pcnE7CisJaW50CQljcHVfY291bnQ7CiAJY2hhcgkJbmFtZVtNUFRfTkFNRV9MRU5HVEhdOwogCWNoYXIJCXRtcF9zdHJpbmdbTVBUX1NUUklOR19MRU5HVEhdOwogCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwpAQCAtNzY3LDIwICs3OTUsMjYgQEAKIAl1OAkJc2hvc3RfcmVjb3Zlcnk7CiAKIAlzdHJ1Y3QgbXV0ZXgJcmVzZXRfaW5fcHJvZ3Jlc3NfbXV0ZXg7Ci0Jc3RydWN0IGNvbXBsZXRpb24Jc2hvc3RfcmVjb3ZlcnlfZG9uZTsKIAlzcGlubG9ja190IAlpb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jazsKIAl1OAkJaW9jX2xpbmtfcmVzZXRfaW5fcHJvZ3Jlc3M7Ci0JaW50CQlpb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzOworCXU4CQlpb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzOwogCiAJdTgJCWlnbm9yZV9sb2dpbmZvczsKIAl1OAkJcmVtb3ZlX2hvc3Q7CiAJdTgJCXBjaV9lcnJvcl9yZWNvdmVyeTsKLQl1OAkJd2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGU7CisJdTgJCXdhaXRfZm9yX2Rpc2NvdmVyeV90b19jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglwb3J0X2VuYWJsZV9kb25lOworCXU4CQlpc19kcml2ZXJfbG9hZGluZzsKKwl1OAkJcG9ydF9lbmFibGVfZmFpbGVkOworCisJdTgJCXN0YXJ0X3NjYW47CisJdTE2CQlzdGFydF9zY2FuX2ZhaWxlZDsKIAogCXU4CQltc2l4X2VuYWJsZTsKIAl1MTYJCW1zaXhfdmVjdG9yX2NvdW50OwotCXUzMgkJKm1zaXhfdGFibGU7Ci0JdTMyCQkqbXNpeF90YWJsZV9iYWNrdXA7CisJdTgJCSpjcHVfbXNpeF90YWJsZTsKKwlyZXNvdXJjZV9zaXplX3QJKipyZXBseV9wb3N0X2hvc3RfaW5kZXg7CisJdTE2CQljcHVfbXNpeF90YWJsZV9zejsKIAl1MzIJCWlvY19yZXNldF9jb3VudDsKIAogCS8qIGludGVybmFsIGNvbW1hbmRzLCBjYWxsYmFjayBpbmRleCAqLwpAQCAtNzkwLDExICs4MjQsMTMgQEAKIAl1OAkJc2NzaWhfY2JfaWR4OwogCXU4CQljdGxfY2JfaWR4OwogCXU4CQliYXNlX2NiX2lkeDsKKwl1OAkJcG9ydF9lbmFibGVfY2JfaWR4OwogCXU4CQljb25maWdfY2JfaWR4OwogCXU4CQl0bV90cl9jYl9pZHg7CiAJdTgJCXRtX3RyX3ZvbHVtZV9jYl9pZHg7CiAJdTgJCXRtX3Nhc19jb250cm9sX2NiX2lkeDsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCBiYXNlX2NtZHM7CisJc3RydWN0IF9pbnRlcm5hbF9jbWQgcG9ydF9lbmFibGVfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCB0cmFuc3BvcnRfY21kczsKIAlzdHJ1Y3QgX2ludGVybmFsX2NtZCBzY3NpaF9jbWRzOwogCXN0cnVjdCBfaW50ZXJuYWxfY21kIHRtX2NtZHM7CkBAIC05MTEsNyArOTQ3LDggQEAKIAlNcGkyUmVwbHlEZXNjcmlwdG9yc1VuaW9uX3QgKnJlcGx5X3Bvc3RfZnJlZTsKIAlkbWFfYWRkcl90CXJlcGx5X3Bvc3RfZnJlZV9kbWE7CiAJc3RydWN0IGRtYV9wb29sICpyZXBseV9wb3N0X2ZyZWVfZG1hX3Bvb2w7Ci0JdTMyCQlyZXBseV9wb3N0X2hvc3RfaW5kZXg7CisJdTgJCXJlcGx5X3F1ZXVlX2NvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgcmVwbHlfcXVldWVfbGlzdDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgZGVsYXllZF90cl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgZGVsYXllZF90cl92b2x1bWVfbGlzdDsKQEAgLTk1NSw2ICs5OTIsNyBAQAogdm9pZCBtcHQyc2FzX2Jhc2VfYnVpbGRfemVyb19sZW5fc2dlKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdm9pZCAqcGFkZHIpOwogX19sZTMyIG1wdDJzYXNfYmFzZV9nZXRfc2Vuc2VfYnVmZmVyX2RtYShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsCiAgICAgdTE2IHNtaWQpOwordm9pZCBtcHQyc2FzX2Jhc2VfZmx1c2hfcmVwbHlfcXVldWVzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyk7CiAKIC8qIGhpLXByaW9yaXR5IHF1ZXVlICovCiB1MTYgbXB0MnNhc19iYXNlX2dldF9zbWlkX2hwcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHU4IGNiX2lkeCk7CkBAIC05NzUsNiArMTAxMyw4IEBACiAKIHU4IG1wdDJzYXNfYmFzZV9kb25lKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQsIHU4IG1zaXhfaW5kZXgsCiAgICAgdTMyIHJlcGx5KTsKK3U4IG1wdDJzYXNfcG9ydF9lbmFibGVfZG9uZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUxNiBzbWlkLAorCXU4IG1zaXhfaW5kZXgsCXUzMiByZXBseSk7CiB2b2lkICptcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIHUzMiBwaHlzX2FkZHIpOwogCiB1MzIgbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MsIGludCBjb29rZWQpOwpAQCAtOTg5LDYgKzEwMjksOCBAQAogCiB2b2lkIG1wdDJzYXNfaGFsdF9maXJtd2FyZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpOwogCitpbnQgbXB0MnNhc19wb3J0X2VuYWJsZShzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpOworCiAvKiBzY3NpaCBzaGFyZWQgQVBJICovCiB1OCBtcHQyc2FzX3Njc2loX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTggbXNpeF9pbmRleCwKICAgICB1MzIgcmVwbHkpOwpAQCAtMTAwNiw2ICsxMDQ4LDggQEAKIHN0cnVjdCBfc2FzX2RldmljZSAqbXB0MnNhc19zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoCiAgICAgc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCB1NjQgc2FzX2FkZHJlc3MpOwogCit2b2lkIG1wdDJzYXNfcG9ydF9lbmFibGVfY29tcGxldGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKTsKKwogdm9pZCBtcHQyc2FzX3Njc2loX3Jlc2V0X2hhbmRsZXIoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLCBpbnQgcmVzZXRfcGhhc2UpOwogCiAvKiBjb25maWcgc2hhcmVkIEFQSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jb25maWcuYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY29uZmlnLmMKaW5kZXggMmIxMTAxMC4uMzZlYTBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jb25maWcuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2NvbmZpZy5jCkBAIC0xMzU2LDYgKzEzNTYsOSBAQAogCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKIAlpbnQgciwgaSwgY29uZmlnX3BhZ2Vfc3o7CiAJdTE2IGlvY19zdGF0dXM7CisJaW50IGNvbmZpZ19udW07CisJdTE2IGVsZW1lbnRfdHlwZTsKKwl1MTYgcGh5c19kaXNrX2Rldl9oYW5kbGU7CiAKIAkqdm9sdW1lX2hhbmRsZSA9IDA7CiAJbWVtc2V0KCZtcGlfcmVxdWVzdCwgMCwgc2l6ZW9mKE1waTJDb25maWdSZXF1ZXN0X3QpKTsKQEAgLTEzNzEsMzUgKzEzNzQsNTMgQEAKIAlpZiAocikKIAkJZ290byBvdXQ7CiAKLQltcGlfcmVxdWVzdC5QYWdlQWRkcmVzcyA9Ci0JICAgIGNwdV90b19sZTMyKE1QSTJfUkFJRF9QR0FEX0ZPUk1fQUNUSVZFX0NPTkZJRyk7CiAJbXBpX3JlcXVlc3QuQWN0aW9uID0gTVBJMl9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwogCWNvbmZpZ19wYWdlX3N6ID0gKGxlMTZfdG9fY3B1KG1waV9yZXBseS5FeHRQYWdlTGVuZ3RoKSAqIDQpOwogCWNvbmZpZ19wYWdlID0ga21hbGxvYyhjb25maWdfcGFnZV9zeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb25maWdfcGFnZSkKKwlpZiAoIWNvbmZpZ19wYWdlKSB7CisJCXIgPSAtMTsKIAkJZ290byBvdXQ7Ci0JciA9IF9jb25maWdfcmVxdWVzdChpb2MsICZtcGlfcmVxdWVzdCwgJm1waV9yZXBseSwKLQkgICAgTVBUMl9DT05GSUdfUEFHRV9ERUZBVUxUX1RJTUVPVVQsIGNvbmZpZ19wYWdlLAotCSAgICBjb25maWdfcGFnZV9zeik7Ci0JaWYgKHIpCi0JCWdvdG8gb3V0OwotCi0JciA9IC0xOwotCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmIE1QSTJfSU9DU1RBVFVTX01BU0s7Ci0JaWYgKGlvY19zdGF0dXMgIT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykKLQkJZ290byBvdXQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvbmZpZ19wYWdlLT5OdW1FbGVtZW50czsgaSsrKSB7Ci0JCWlmICgobGUxNl90b19jcHUoY29uZmlnX3BhZ2UtPkNvbmZpZ0VsZW1lbnRbaV0uRWxlbWVudEZsYWdzKSAmCi0JCSAgICBNUEkyX1JBSURDT05GSUcwX0VGTEFHU19NQVNLX0VMRU1FTlRfVFlQRSkgIT0KLQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX1ZPTF9QSFlTX0RJU0tfRUxFTUVOVCkKLQkJCWNvbnRpbnVlOwotCQlpZiAobGUxNl90b19jcHUoY29uZmlnX3BhZ2UtPkNvbmZpZ0VsZW1lbnRbaV0uCi0JCSAgICBQaHlzRGlza0RldkhhbmRsZSkgPT0gcGRfaGFuZGxlKSB7Ci0JCQkqdm9sdW1lX2hhbmRsZSA9IGxlMTZfdG9fY3B1KGNvbmZpZ19wYWdlLT4KLQkJCSAgICBDb25maWdFbGVtZW50W2ldLlZvbERldkhhbmRsZSk7Ci0JCQlyID0gMDsKKwl9CisJY29uZmlnX251bSA9IDB4ZmY7CisJd2hpbGUgKDEpIHsKKwkJbXBpX3JlcXVlc3QuUGFnZUFkZHJlc3MgPSBjcHVfdG9fbGUzMihjb25maWdfbnVtICsKKwkJICAgIE1QSTJfUkFJRF9QR0FEX0ZPUk1fR0VUX05FWFRfQ09ORklHTlVNKTsKKwkJciA9IF9jb25maWdfcmVxdWVzdChpb2MsICZtcGlfcmVxdWVzdCwgJm1waV9yZXBseSwKKwkJICAgIE1QVDJfQ09ORklHX1BBR0VfREVGQVVMVF9USU1FT1VULCBjb25maWdfcGFnZSwKKwkJICAgIGNvbmZpZ19wYWdlX3N6KTsKKwkJaWYgKHIpCiAJCQlnb3RvIG91dDsKKwkJciA9IC0xOworCQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgorCQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY19zdGF0dXMgIT0gTVBJMl9JT0NTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gb3V0OworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnX3BhZ2UtPk51bUVsZW1lbnRzOyBpKyspIHsKKwkJCWVsZW1lbnRfdHlwZSA9IGxlMTZfdG9fY3B1KGNvbmZpZ19wYWdlLT4KKwkJCSAgICBDb25maWdFbGVtZW50W2ldLkVsZW1lbnRGbGFncykgJgorCQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX01BU0tfRUxFTUVOVF9UWVBFOworCQkJaWYgKGVsZW1lbnRfdHlwZSA9PQorCQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX1ZPTF9QSFlTX0RJU0tfRUxFTUVOVCB8fAorCQkJICAgIGVsZW1lbnRfdHlwZSA9PQorCQkJICAgIE1QSTJfUkFJRENPTkZJRzBfRUZMQUdTX09DRV9FTEVNRU5UKSB7CisJCQkJcGh5c19kaXNrX2Rldl9oYW5kbGUgPQorCQkJCSAgICBsZTE2X3RvX2NwdShjb25maWdfcGFnZS0+Q29uZmlnRWxlbWVudFtpXS4KKwkJCQkgICAgUGh5c0Rpc2tEZXZIYW5kbGUpOworCQkJCWlmIChwaHlzX2Rpc2tfZGV2X2hhbmRsZSA9PSBwZF9oYW5kbGUpIHsKKwkJCQkJKnZvbHVtZV9oYW5kbGUgPQorCQkJCQkgICAgbGUxNl90b19jcHUoY29uZmlnX3BhZ2UtPgorCQkJCQkgICAgQ29uZmlnRWxlbWVudFtpXS5Wb2xEZXZIYW5kbGUpOworCQkJCQlyID0gMDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlbGVtZW50X3R5cGUgPT0KKwkJCSAgICBNUEkyX1JBSURDT05GSUcwX0VGTEFHU19IT1RfU1BBUkVfRUxFTUVOVCkgeworCQkJCSp2b2x1bWVfaGFuZGxlID0gMDsKKwkJCQlyID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQorCQljb25maWdfbnVtID0gY29uZmlnX3BhZ2UtPkNvbmZpZ051bTsKIAl9CiAgb3V0OgogCWtmcmVlKGNvbmZpZ19wYWdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX2N0bC5jCmluZGV4IDI0NmQ1ZmIuLmFhYmNiOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19jdGwuYwpAQCAtMTIwNyw2ICsxMjA3LDkgQEAKIAlpZiAoX2N0bF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5IHx8CisJCWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpCisJCXJldHVybiAtRUFHQUlOOwogCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGVudGVyXG4iLCBpb2MtPm5hbWUsCiAJICAgIF9fZnVuY19fKSk7CiAKQEAgLTIxNzgsNyArMjE4MSw4IEBACiAJCSAgICAhaW9jKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpCisJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5IHx8CisJCQkJaW9jLT5pc19kcml2ZXJfbG9hZGluZykKIAkJCXJldHVybiAtRUFHQUlOOwogCiAJCWlmIChfSU9DX1NJWkUoY21kKSA9PSBzaXplb2Yoc3RydWN0IG1wdDJfaW9jdGxfY29tbWFuZCkpIHsKQEAgLTIyOTcsNyArMjMwMSw4IEBACiAJaWYgKF9jdGxfdmVyaWZ5X2FkYXB0ZXIoa2FyZzMyLmhkci5pb2NfbnVtYmVyLCAmaW9jKSA9PSAtMSB8fCAhaW9jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KQorCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5IHx8CisJCQlpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCW1lbXNldCgma2FyZywgMCwgc2l6ZW9mKHN0cnVjdCBtcHQyX2lvY3RsX2NvbW1hbmQpKTsKQEAgLTI3MDQsNiArMjcwOSwzMyBAQAogc3RhdGljIERFVklDRV9BVFRSKGlvY19yZXNldF9jb3VudCwgU19JUlVHTywKICAgICBfY3RsX2lvY19yZXNldF9jb3VudF9zaG93LCBOVUxMKTsKIAorLyoqCisgKiBfY3RsX2lvY19yZXBseV9xdWV1ZV9jb3VudF9zaG93IC0gbnVtYmVyIG9mIHJlcGx5IHF1ZXVlcworICogQGNkZXYgLSBwb2ludGVyIHRvIGVtYmVkZGVkIGNsYXNzIGRldmljZQorICogQGJ1ZiAtIHRoZSBidWZmZXIgcmV0dXJuZWQKKyAqCisgKiBUaGlzIGlzIG51bWJlciBvZiByZXBseSBxdWV1ZXMKKyAqCisgKiBBIHN5c2ZzICdyZWFkLW9ubHknIHNob3N0IGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QKK19jdGxfaW9jX3JlcGx5X3F1ZXVlX2NvdW50X3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1OCByZXBseV9xdWV1ZV9jb3VudDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJaWYgKChpb2MtPmZhY3RzLklPQ0NhcGFiaWxpdGllcyAmCisJICAgIE1QSTJfSU9DRkFDVFNfQ0FQQUJJTElUWV9NU0lfWF9JTkRFWCkgJiYgaW9jLT5tc2l4X2VuYWJsZSkKKwkJcmVwbHlfcXVldWVfY291bnQgPSBpb2MtPnJlcGx5X3F1ZXVlX2NvdW50OworCWVsc2UKKwkJcmVwbHlfcXVldWVfY291bnQgPSAxOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByZXBseV9xdWV1ZV9jb3VudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocmVwbHlfcXVldWVfY291bnQsIFNfSVJVR08sCisJIF9jdGxfaW9jX3JlcGx5X3F1ZXVlX2NvdW50X3Nob3csIE5VTEwpOworCiBzdHJ1Y3QgRElBR19CVUZGRVJfU1RBUlQgewogCV9fbGUzMiBTaXplOwogCV9fbGUzMiBEaWFnVmVyc2lvbjsKQEAgLTI5MTQsNiArMjk0Niw3IEBACiAJJmRldl9hdHRyX2hvc3RfdHJhY2VfYnVmZmVyX3NpemUsCiAJJmRldl9hdHRyX2hvc3RfdHJhY2VfYnVmZmVyLAogCSZkZXZfYXR0cl9ob3N0X3RyYWNlX2J1ZmZlcl9lbmFibGUsCisJJmRldl9hdHRyX3JlcGx5X3F1ZXVlX2NvdW50LAogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKaW5kZXggNTIwMmRlMy4uODg4OWIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwpAQCAtNzEsNiArNzEsOSBAQAogCiBzdGF0aWMgdTggX3Njc2loX2NoZWNrX2Zvcl9wZW5kaW5nX3RtKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywgdTE2IHNtaWQpOwogCitzdGF0aWMgdm9pZCBfc2NzaWhfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CitzdGF0aWMgaW50IF9zY3NpaF9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpOworCiAvKiBnbG9iYWwgcGFyYW1ldGVycyAqLwogTElTVF9IRUFEKG1wdDJzYXNfaW9jX2xpc3QpOwogCkBAIC03OSw2ICs4Miw3IEBACiBzdGF0aWMgdTggdG1fY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggY3RsX2NiX2lkeCA9IC0xOwogc3RhdGljIHU4IGJhc2VfY2JfaWR4ID0gLTE7CitzdGF0aWMgdTggcG9ydF9lbmFibGVfY2JfaWR4ID0gLTE7CiBzdGF0aWMgdTggdHJhbnNwb3J0X2NiX2lkeCA9IC0xOwogc3RhdGljIHU4IHNjc2loX2NiX2lkeCA9IC0xOwogc3RhdGljIHU4IGNvbmZpZ19jYl9pZHggPSAtMTsKQEAgLTEwMyw2ICsxMDcsMTggQEAKIG1vZHVsZV9wYXJhbShtYXhfbHVuLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfbHVuLCAiIG1heCBsdW4sIGRlZmF1bHQ9MTY4OTUgIik7CiAKKy8qIGRpYWdfYnVmZmVyX2VuYWJsZSBpcyBiaXR3aXNlCisgKiBiaXQgMCBzZXQgPSBUUkFDRQorICogYml0IDEgc2V0ID0gU05BUFNIT1QKKyAqIGJpdCAyIHNldCA9IEVYVEVOREVECisgKgorICogRWl0aGVyIGJpdCBjYW4gYmUgc2V0LCBvciBib3RoCisgKi8KK3N0YXRpYyBpbnQgZGlhZ19idWZmZXJfZW5hYmxlID0gLTE7Cittb2R1bGVfcGFyYW0oZGlhZ19idWZmZXJfZW5hYmxlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkaWFnX2J1ZmZlcl9lbmFibGUsICIgcG9zdCBkaWFnIGJ1ZmZlcnMgIgorCSIoVFJBQ0U9MS9TTkFQU0hPVD0yL0VYVEVOREVEPTQvZGVmYXVsdD0wKSIpOworCiAvKioKICAqIHN0cnVjdCBzZW5zZV9pbmZvIC0gY29tbW9uIHN0cnVjdHVyZSBmb3Igb2J0YWluaW5nIHNlbnNlIGtleXMKICAqIEBza2V5OiBzZW5zZSBrZXkKQEAgLTExNyw4ICsxMzMsOCBAQAogCiAKICNkZWZpbmUgTVBUMlNBU19UVVJOX09OX0ZBVUxUX0xFRCAoMHhGRkZDKQotI2RlZmluZSBNUFQyU0FTX1JFU0NBTl9BRlRFUl9IT1NUX1JFU0VUICgweEZGRkYpCi0KKyNkZWZpbmUgTVBUMlNBU19QT1JUX0VOQUJMRV9DT01QTEVURSAoMHhGRkZEKQorI2RlZmluZSBNUFQyU0FTX1JFTU9WRV9VTlJFU1BPTkRJTkdfREVWSUNFUyAoMHhGRkZGKQogLyoqCiAgKiBzdHJ1Y3QgZndfZXZlbnRfd29yayAtIGZpcm13YXJlIGV2ZW50IHN0cnVjdAogICogQGxpc3Q6IGxpbmsgbGlzdCBmcmFtZXdvcmsKQEAgLTM3MiwzMSArMzg4LDM0IEBACiAJTXBpMlNhc0RldmljZVBhZ2UwX3Qgc2FzX2RldmljZV9wZzA7CiAJTXBpMkNvbmZpZ1JlcGx5X3QgbXBpX3JlcGx5OwogCXUzMiBpb2Nfc3RhdHVzOworCSpzYXNfYWRkcmVzcyA9IDA7CiAKIAlpZiAoaGFuZGxlIDw9IGlvYy0+c2FzX2hiYS5udW1fcGh5cykgewogCQkqc2FzX2FkZHJlc3MgPSBpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3M7CiAJCXJldHVybiAwOwotCX0gZWxzZQotCQkqc2FzX2FkZHJlc3MgPSAwOworCX0KIAogCWlmICgobXB0MnNhc19jb25maWdfZ2V0X3Nhc19kZXZpY2VfcGcwKGlvYywgJm1waV9yZXBseSwgJnNhc19kZXZpY2VfcGcwLAogCSAgICBNUEkyX1NBU19ERVZJQ0VfUEdBRF9GT1JNX0hBTkRMRSwgaGFuZGxlKSkpIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwKKwkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYKLQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKLQlpZiAoaW9jX3N0YXR1cyAhPSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKSB7Ci0JCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImhhbmRsZSgweCUwNHgpLCBpb2Nfc3RhdHVzKDB4JTA0eCkiCi0JCSAgICAiXG5mYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSwgaW9jX3N0YXR1cywKLQkJICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU87CisJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwlpZiAoaW9jX3N0YXR1cyA9PSBNUEkyX0lPQ1NUQVRVU19TVUNDRVNTKSB7CisJCSpzYXNfYWRkcmVzcyA9IGxlNjRfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlNBU0FkZHJlc3MpOworCQlyZXR1cm4gMDsKIAl9CiAKLQkqc2FzX2FkZHJlc3MgPSBsZTY0X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5TQVNBZGRyZXNzKTsKLQlyZXR1cm4gMDsKKwkvKiB3ZSBoaXQgdGhpcyBiZWN1YXNlIHRoZSBnaXZlbiBwYXJlbnQgaGFuZGxlIGRvZXNuJ3QgZXhpc3QgKi8KKwlpZiAoaW9jX3N0YXR1cyA9PSBNUEkyX0lPQ1NUQVRVU19DT05GSUdfSU5WQUxJRF9QQUdFKQorCQlyZXR1cm4gLUVOWElPOworCS8qIGVsc2UgZXJyb3IgY2FzZSAqLworCXByaW50ayhNUFQyU0FTX0VSUl9GTVQgImhhbmRsZSgweCUwNHgpLCBpb2Nfc3RhdHVzKDB4JTA0eCksICIKKwkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgaGFuZGxlLCBpb2Nfc3RhdHVzLAorCSAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU87CiB9CiAKIC8qKgpAQCAtNDI0LDcgKzQ0MywxMSBAQAogCXUxNiBzbG90OwogCiAJIC8qIG9ubHkgcHJvY2VzcyB0aGlzIGZ1bmN0aW9uIHdoZW4gZHJpdmVyIGxvYWRzICovCi0JaWYgKCFpb2MtPndhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlKQorCWlmICghaW9jLT5pc19kcml2ZXJfbG9hZGluZykKKwkJcmV0dXJuOworCisJIC8qIG5vIEJpb3MsIHJldHVybiBpbW1lZGlhdGVseSAqLworCWlmICghaW9jLT5iaW9zX3BnMy5CaW9zVmVyc2lvbikKIAkJcmV0dXJuOwogCiAJaWYgKCFpc19yYWlkKSB7CkBAIC01ODcsOCArNjEwLDE1IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghbXB0MnNhc190cmFuc3BvcnRfcG9ydF9hZGQoaW9jLCBzYXNfZGV2aWNlLT5oYW5kbGUsCi0JICAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpKQorCSAgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3NfcGFyZW50KSkgewogCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKKwkJfSBlbHNlIGlmICghc2FzX2RldmljZS0+c3RhcmdldCkgeworCQkJaWYgKCFpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQorCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywKKwkJCQlzYXNfZGV2aWNlLT5zYXNfYWRkcmVzcywKKwkJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpOworCQkJX3Njc2loX3Nhc19kZXZpY2VfcmVtb3ZlKGlvYywgc2FzX2RldmljZSk7CisJCX0KIH0KIAogLyoqCkBAIC0xNDAwLDYgKzE0MzAsMTAgQEAKIHsKIAlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnNhc190YXJnZXRfcHJpdl9kYXRhOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2M7CisJc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXNkZXYtPmhvc3RkYXRhKQogCQlyZXR1cm47CkBAIC0xNDA3LDYgKzE0NDEsMTkgQEAKIAlzdGFyZ2V0ID0gc2NzaV90YXJnZXQoc2Rldik7CiAJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKIAlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+bnVtX2x1bnMtLTsKKworCXNob3N0ID0gZGV2X3RvX3Nob3N0KCZzdGFyZ2V0LT5kZXYpOworCWlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJaWYgKCEoc2FzX3RhcmdldF9wcml2X2RhdGEtPmZsYWdzICYgTVBUX1RBUkdFVF9GTEFHU19WT0xVTUUpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCQlzYXNfZGV2aWNlID0gbXB0MnNhc19zY3NpaF9zYXNfZGV2aWNlX2ZpbmRfYnlfc2FzX2FkZHJlc3MoaW9jLAorCQkgICBzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+c2FzX2FkZHJlc3MpOworCQlpZiAoc2FzX2RldmljZSkKKwkJCXNhc19kZXZpY2UtPnN0YXJnZXQgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCX0KKwogCWtmcmVlKHNkZXYtPmhvc3RkYXRhKTsKIAlzZGV2LT5ob3N0ZGF0YSA9IE5VTEw7CiB9CkBAIC0xNTk4LDggKzE2NDUsMTAgQEAKICAqIF9zY3NpaF9nZXRfdm9sdW1lX2NhcGFiaWxpdGllcyAtIHZvbHVtZSBjYXBhYmlsaXRpZXMKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHNhc19kZXZpY2U6IHRoZSByYWlkX2RldmljZSBvYmplY3QKKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIGVsc2UgMQogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogX3Njc2loX2dldF92b2x1bWVfY2FwYWJpbGl0aWVzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYywKICAgICBzdHJ1Y3QgX3JhaWRfZGV2aWNlICpyYWlkX2RldmljZSkKIHsKQEAgLTE2MTIsOSArMTY2MSwxMCBAQAogCiAJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfbnVtYmVyX3Bkcyhpb2MsIHJhaWRfZGV2aWNlLT5oYW5kbGUsCiAJICAgICZudW1fcGRzKSkgfHwgIW51bV9wZHMpIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgX19mdW5jX18pKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJcmFpZF9kZXZpY2UtPm51bV9wZHMgPSBudW1fcGRzOwpAQCAtMTYyMiwxNyArMTY3MiwxOSBAQAogCSAgICBzaXplb2YoTXBpMlJhaWRWb2wwUGh5c0Rpc2tfdCkpOwogCXZvbF9wZzAgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZvbF9wZzApIHsKLQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgX19mdW5jX18pKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfcmFpZF92b2x1bWVfcGcwKGlvYywgJm1waV9yZXBseSwgdm9sX3BnMCwKIAkgICAgIE1QSTJfUkFJRF9WT0xVTUVfUEdBRF9GT1JNX0hBTkRMRSwgcmFpZF9kZXZpY2UtPmhhbmRsZSwgc3opKSkgewotCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAotCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgX19mdW5jX18pKTsKIAkJa2ZyZWUodm9sX3BnMCk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAJfQogCiAJcmFpZF9kZXZpY2UtPnZvbHVtZV90eXBlID0gdm9sX3BnMC0+Vm9sdW1lVHlwZTsKQEAgLTE2NTIsNiArMTcwNCw3IEBACiAJfQogCiAJa2ZyZWUodm9sX3BnMCk7CisJcmV0dXJuIDA7CiB9CiAvKioKICAqIF9zY3NpaF9kaXNhYmxlX2RkaW8gLSBEaXNhYmxlIGRpcmVjdCBJL08gZm9yIGFsbCB0aGUgdm9sdW1lcwpAQCAtMTkyMiwxMyArMTk3NSwyMCBAQAogCQkgICAgIHNhc190YXJnZXRfcHJpdl9kYXRhLT5oYW5kbGUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnJhaWRfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJaWYgKCFyYWlkX2RldmljZSkgewotCQkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwKLQkJCSAgICBpb2MtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwotCQkJcmV0dXJuIDA7CisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sCisJCQkgICAgX19MSU5FX18sIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gMTsKIAkJfQogCiAJCV9zY3NpaF9nZXRfdm9sdW1lX2NhcGFiaWxpdGllcyhpb2MsIHJhaWRfZGV2aWNlKTsKIAorCQlpZiAoX3Njc2loX2dldF92b2x1bWVfY2FwYWJpbGl0aWVzKGlvYywgcmFpZF9kZXZpY2UpKSB7CisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sCisJCQkgICAgX19MSU5FX18sIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gMTsKKwkJfQogCQkvKgogCQkgKiBXQVJQRFJJVkU6IEluaXRpYWxpemUgdGhlIHJlcXVpcmVkIGRhdGEgZm9yIERpcmVjdCBJTwogCQkgKi8KQEAgLTIwMDIsMTEgKzIwNjIsMjIgQEAKIAlpZiAoc2FzX2RldmljZSkgewogCQlpZiAoc2FzX3RhcmdldF9wcml2X2RhdGEtPmZsYWdzICYKIAkJICAgIE1QVF9UQVJHRVRfRkxBR1NfUkFJRF9DT01QT05FTlQpIHsKLQkJCW1wdDJzYXNfY29uZmlnX2dldF92b2x1bWVfaGFuZGxlKGlvYywKLQkJCSAgICBzYXNfZGV2aWNlLT5oYW5kbGUsICZzYXNfZGV2aWNlLT52b2x1bWVfaGFuZGxlKTsKLQkJCW1wdDJzYXNfY29uZmlnX2dldF92b2x1bWVfd3dpZChpb2MsCisJCQlpZiAobXB0MnNhc19jb25maWdfZ2V0X3ZvbHVtZV9oYW5kbGUoaW9jLAorCQkJICAgIHNhc19kZXZpY2UtPmhhbmRsZSwgJnNhc19kZXZpY2UtPnZvbHVtZV9oYW5kbGUpKSB7CisJCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkJCSAgICAiZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgaW9jLT5uYW1lLAorCQkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlpZiAoc2FzX2RldmljZS0+dm9sdW1lX2hhbmRsZSAmJgorCQkJICAgIG1wdDJzYXNfY29uZmlnX2dldF92b2x1bWVfd3dpZChpb2MsCiAJCQkgICAgc2FzX2RldmljZS0+dm9sdW1lX2hhbmRsZSwKLQkJCSAgICAmc2FzX2RldmljZS0+dm9sdW1lX3d3aWQpOworCQkJICAgICZzYXNfZGV2aWNlLT52b2x1bWVfd3dpZCkpIHsKKwkJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX1dBUk5fRk1UCisJCQkJICAgICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBpb2MtPm5hbWUsCisJCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJfQogCQlpZiAoc2FzX2RldmljZS0+ZGV2aWNlX2luZm8gJiBNUEkyX1NBU19ERVZJQ0VfSU5GT19TU1BfVEFSR0VUKSB7CiAJCQlxZGVwdGggPSBNUFQyU0FTX1NBU19RVUVVRV9ERVBUSDsKQEAgLTIwMzUsNiArMjEwNiwxMSBAQAogCiAJCWlmICghc3NwX3RhcmdldCkKIAkJCV9zY3NpaF9kaXNwbGF5X3NhdGFfY2FwYWJpbGl0aWVzKGlvYywgc2FzX2RldmljZSwgc2Rldik7CisJfSBlbHNlIHsKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19XQVJOX0ZNVAorCQkgICAgImZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLAorCQkgICAgX19mdW5jX18pKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJX3Njc2loX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LCBxZGVwdGgsIFNDU0lfUURFUFRIX0RFRkFVTFQpOwpAQCAtMjE2MSw2ICsyMjM3LDcgQEAKIAkJcmV0dXJuIDE7CiAJaWYgKGlvYy0+dG1fY21kcy5zbWlkICE9IHNtaWQpCiAJCXJldHVybiAxOworCW1wdDJzYXNfYmFzZV9mbHVzaF9yZXBseV9xdWV1ZXMoaW9jKTsKIAlpb2MtPnRtX2NtZHMuc3RhdHVzIHw9IE1QVDJfQ01EX0NPTVBMRVRFOwogCW1waV9yZXBseSA9ICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlpZiAobXBpX3JlcGx5KSB7CkBAIC0yNzEzLDIyICsyNzkwLDM4IEBACiAKIAogLyoqCi0gKiBfc2NzaWhfcXVldWVfcmVzY2FuIC0gcXVldWUgYSB0b3BvbG9neSByZXNjYW4gZnJvbSB1c2VyIGNvbnRleHQKKyAqIF9zY3NpaF9lcnJvcl9yZWNvdmVyeV9kZWxldGVfZGV2aWNlcyAtIHJlbW92ZSBkZXZpY2VzIG5vdCByZXNwb25kaW5nCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogc3RhdGljIHZvaWQKLV9zY3NpaF9xdWV1ZV9yZXNjYW4oc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQorX3Njc2loX2Vycm9yX3JlY292ZXJ5X2RlbGV0ZV9kZXZpY2VzKHN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYykKIHsKIAlzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQ7CiAKLQlpZiAoaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSkKKwlpZiAoaW9jLT5pc19kcml2ZXJfbG9hZGluZykKIAkJcmV0dXJuOworCWZ3X2V2ZW50LT5ldmVudCA9IE1QVDJTQVNfUkVNT1ZFX1VOUkVTUE9ORElOR19ERVZJQ0VTOworCWZ3X2V2ZW50LT5pb2MgPSBpb2M7CisJX3Njc2loX2Z3X2V2ZW50X2FkZChpb2MsIGZ3X2V2ZW50KTsKK30KKworLyoqCisgKiBtcHQyc2FzX3BvcnRfZW5hYmxlX2NvbXBsZXRlIC0gcG9ydCBlbmFibGUgY29tcGxldGVkIChmYWtlIGV2ZW50KQorICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CisgKgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3ZvaWQKK21wdDJzYXNfcG9ydF9lbmFibGVfY29tcGxldGUoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQoreworCXN0cnVjdCBmd19ldmVudF93b3JrICpmd19ldmVudDsKKwogCWZ3X2V2ZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ3X2V2ZW50X3dvcmspLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWZ3X2V2ZW50KQogCQlyZXR1cm47Ci0JZndfZXZlbnQtPmV2ZW50ID0gTVBUMlNBU19SRVNDQU5fQUZURVJfSE9TVF9SRVNFVDsKKwlmd19ldmVudC0+ZXZlbnQgPSBNUFQyU0FTX1BPUlRfRU5BQkxFX0NPTVBMRVRFOwogCWZ3X2V2ZW50LT5pb2MgPSBpb2M7CiAJX3Njc2loX2Z3X2V2ZW50X2FkZChpb2MsIGZ3X2V2ZW50KTsKIH0KQEAgLTI5NzYsMTQgKzMwNjksMjcgQEAKIAlNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAl1MTYgc21pZDsKIAlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7Ci0Jc3RydWN0IE1QVDJTQVNfVEFSR0VUICpzYXNfdGFyZ2V0X3ByaXZfZGF0YTsKKwlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnNhc190YXJnZXRfcHJpdl9kYXRhID0gTlVMTDsKKwl1NjQgc2FzX2FkZHJlc3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IF90cl9saXN0ICpkZWxheWVkX3RyOworCXUzMiBpb2Nfc3RhdGU7CiAKLQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8Ci0JICAgIGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7Ci0JCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgcmVzZXQgaW4gIgotCQkgICAicHJvZ3Jlc3MhXG4iLCBfX2Z1bmNfXywgaW9jLT5uYW1lKSk7CisJaWYgKGlvYy0+cmVtb3ZlX2hvc3QpIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCBoYXMgYmVlbiAiCisJCSAgICAicmVtb3ZlZDogaGFuZGxlKDB4JTA0eClcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUsIGhhbmRsZSkpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IGluIHBjaSAiCisJCSAgICAiZXJyb3IgcmVjb3Zlcnk6IGhhbmRsZSgweCUwNHgpXG4iLCBfX2Z1bmNfXywgaW9jLT5uYW1lLAorCQkgICAgaGFuZGxlKSk7CisJCXJldHVybjsKKwl9CisJaW9jX3N0YXRlID0gbXB0MnNhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDEpOworCWlmIChpb2Nfc3RhdGUgIT0gTVBJMl9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKKwkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCBpcyBub3QgIgorCQkgICAib3BlcmF0aW9uYWw6IGhhbmRsZSgweCUwNHgpXG4iLCBfX2Z1bmNfXywgaW9jLT5uYW1lLAorCQkgICBoYW5kbGUpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjk5NywxMyArMzEwMywxOCBAQAogCSAgICAgc2FzX2RldmljZS0+c3RhcmdldC0+aG9zdGRhdGEpIHsKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzYXNfZGV2aWNlLT5zdGFyZ2V0LT5ob3N0ZGF0YTsKIAkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmRlbGV0ZWQgPSAxOwotCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQKLQkJICAgICJzZXR0aW5nIGRlbGV0ZSBmbGFnOiBoYW5kbGUoMHglMDR4KSwgIgotCQkgICAgInNhc19hZGRyKDB4JTAxNmxseClcbiIsIGlvYy0+bmFtZSwgaGFuZGxlLAotCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MpKTsKKwkJc2FzX2FkZHJlc3MgPSBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzczsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAorCWlmIChzYXNfdGFyZ2V0X3ByaXZfZGF0YSkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInNldHRpbmcgZGVsZXRlIGZsYWc6ICIKKwkJImhhbmRsZSgweCUwNHgpLCBzYXNfYWRkcigweCUwMTZsbHgpXG4iLCBpb2MtPm5hbWUsIGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2FzX2FkZHJlc3MpKTsKKwkJX3Njc2loX3VibG9ja19pb19kZXZpY2UoaW9jLCBoYW5kbGUpOworCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+aGFuZGxlID0gTVBUMlNBU19JTlZBTElEX0RFVklDRV9IQU5ETEU7CisJfQorCiAJc21pZCA9IG1wdDJzYXNfYmFzZV9nZXRfc21pZF9ocHIoaW9jLCBpb2MtPnRtX3RyX2NiX2lkeCk7CiAJaWYgKCFzbWlkKSB7CiAJCWRlbGF5ZWRfdHIgPSBremFsbG9jKHNpemVvZigqZGVsYXllZF90ciksIEdGUF9BVE9NSUMpOwpAQCAtMzE4NCwxMSArMzI5NSwyMSBAQAogCSAgICBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlNcGkyU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CiAJdTE2IHNtaWRfc2FzX2N0cmw7CisJdTMyIGlvY19zdGF0ZTsKIAotCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5IHx8IGlvYy0+cmVtb3ZlX2hvc3QgfHwKLQkgICAgaW9jLT5wY2lfZXJyb3JfcmVjb3ZlcnkpIHsKLQkJZGV3dHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0lORk9fRk1UICIlczogaG9zdCByZXNldCBpbiAiCi0JCSAgICJwcm9ncmVzcyFcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUpKTsKKwlpZiAoaW9jLT5yZW1vdmVfaG9zdCkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IGhhcyBiZWVuICIKKwkJICAgInJlbW92ZWRcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkgeworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzOiBob3N0IGluIHBjaSAiCisJCSAgICAiZXJyb3IgcmVjb3ZlcnlcbiIsIF9fZnVuY19fLCBpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIDE7CisJfQorCWlvY19zdGF0ZSA9IG1wdDJzYXNfYmFzZV9nZXRfaW9jc3RhdGUoaW9jLCAxKTsKKwlpZiAoaW9jX3N0YXRlICE9IE1QSTJfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCWRld3RwcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6IGhvc3QgaXMgbm90ICIKKwkJICAgICJvcGVyYXRpb25hbFxuIiwgX19mdW5jX18sIGlvYy0+bmFtZSkpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTUwOTgsNyArNTIxOSw3IEBACiAJLyogZ2V0IGRldmljZSBuYW1lICovCiAJc2FzX2RldmljZS0+ZGV2aWNlX25hbWUgPSBsZTY0X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5EZXZpY2VOYW1lKTsKIAotCWlmIChpb2MtPndhaXRfZm9yX3BvcnRfZW5hYmxlX3RvX2NvbXBsZXRlKQorCWlmIChpb2MtPndhaXRfZm9yX2Rpc2NvdmVyeV90b19jb21wbGV0ZSkKIAkJX3Njc2loX3Nhc19kZXZpY2VfaW5pdF9hZGQoaW9jLCBzYXNfZGV2aWNlKTsKIAllbHNlCiAJCV9zY3NpaF9zYXNfZGV2aWNlX2FkZChpb2MsIHNhc19kZXZpY2UpOwpAQCAtNTEzNCw2ICs1MjU1LDkgQEAKIAlpZiAoc2FzX2RldmljZV9iYWNrdXAuc3RhcmdldCAmJiBzYXNfZGV2aWNlX2JhY2t1cC5zdGFyZ2V0LT5ob3N0ZGF0YSkgewogCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHNhc19kZXZpY2VfYmFja3VwLnN0YXJnZXQtPmhvc3RkYXRhOwogCQlzYXNfdGFyZ2V0X3ByaXZfZGF0YS0+ZGVsZXRlZCA9IDE7CisJCV9zY3NpaF91YmxvY2tfaW9fZGV2aWNlKGlvYywgc2FzX2RldmljZV9iYWNrdXAuaGFuZGxlKTsKKwkJc2FzX3RhcmdldF9wcml2X2RhdGEtPmhhbmRsZSA9CisJCSAgICAgTVBUMlNBU19JTlZBTElEX0RFVklDRV9IQU5ETEU7CiAJfQogCiAJX3Njc2loX3VibG9ja19pb19kZXZpY2UoaW9jLCBzYXNfZGV2aWNlX2JhY2t1cC5oYW5kbGUpOwpAQCAtNTI4Nyw3ICs1NDExLDcgQEAKIAkJX3Njc2loX3Nhc190b3BvbG9neV9jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLCBldmVudF9kYXRhKTsKICNlbmRpZgogCi0JaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkgfHwgaW9jLT5yZW1vdmVfaG9zdCB8fCBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkKKwlpZiAoaW9jLT5yZW1vdmVfaG9zdCB8fCBpb2MtPnBjaV9lcnJvcl9yZWNvdmVyeSkKIAkJcmV0dXJuOwogCiAJaWYgKCFpb2MtPnNhc19oYmEubnVtX3BoeXMpCkBAIC01MzQ4LDYgKzU0NzIsOSBAQAogCQlzd2l0Y2ggKHJlYXNvbl9jb2RlKSB7CiAJCWNhc2UgTVBJMl9FVkVOVF9TQVNfVE9QT19SQ19QSFlfQ0hBTkdFRDoKIAorCQkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCisJCQkJYnJlYWs7CisKIAkJCWlmIChsaW5rX3JhdGUgPT0gcHJldl9saW5rX3JhdGUpCiAJCQkJYnJlYWs7CiAKQEAgLTUzNjEsNiArNTQ4OCw5IEBACiAJCQlicmVhazsKIAkJY2FzZSBNUEkyX0VWRU5UX1NBU19UT1BPX1JDX1RBUkdfQURERUQ6CiAKKwkJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQorCQkJCWJyZWFrOworCiAJCQltcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3MoaW9jLCBzYXNfYWRkcmVzcywKIAkJCSAgICBoYW5kbGUsIHBoeV9udW1iZXIsIGxpbmtfcmF0ZSk7CiAKQEAgLTU2MjEsNyArNTc1MSw3IEBACiAJdGVybWluYXRpb25fY291bnQgPSAwOwogCXF1ZXJ5X2NvdW50ID0gMDsKIAlmb3IgKHNtaWQgPSAxOyBzbWlkIDw9IGlvYy0+c2NzaWlvX2RlcHRoOyBzbWlkKyspIHsKLQkJaWYgKGlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1cykKKwkJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCiAJCQlnb3RvIG91dDsKIAkJc2NtZCA9IF9zY3NpaF9zY3NpX2xvb2t1cF9nZXQoaW9jLCBzbWlkKTsKIAkJaWYgKCFzY21kKQpAQCAtNTY0Myw3ICs1NzczLDcgQEAKIAkJbHVuID0gc2FzX2RldmljZV9wcml2X2RhdGEtPmx1bjsKIAkJcXVlcnlfY291bnQrKzsKIAotCQlpZiAoaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3Nfc3RhdHVzKQorCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKIAkJCWdvdG8gb3V0OwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwpAQCAtNTY4NSw3ICs1ODE1LDcgQEAKIAkJCWdvdG8gYnJvYWRjYXN0X2Flbl9yZXRyeTsKIAkJfQogCi0JCWlmIChpb2MtPmlvY19yZXNldF9pbl9wcm9ncmVzc19zdGF0dXMpCisJCWlmIChpb2MtPnNob3N0X3JlY292ZXJ5KQogCQkJZ290byBvdXRfbm9fbG9jazsKIAogCQlyID0gbXB0MnNhc19zY3NpaF9pc3N1ZV90bShpb2MsIGhhbmRsZSwgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsCkBAIC01NzI0LDcgKzU4NTQsNyBAQAogCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fLCBxdWVyeV9jb3VudCwgdGVybWluYXRpb25fY291bnQpKTsKIAogCWlvYy0+YnJvYWRjYXN0X2Flbl9idXN5ID0gMDsKLQlpZiAoIWlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX3N0YXR1cykKKwlpZiAoIWlvYy0+c2hvc3RfcmVjb3ZlcnkpCiAJCV9zY3NpaF91YmxvY2tfaW9fYWxsX2RldmljZShpb2MpOwogCW11dGV4X3VubG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKIH0KQEAgLTU3ODgsOCArNTkxOCwxMSBAQAogc3RhdGljIHZvaWQKIF9zY3NpaF9yZXByb2JlX3RhcmdldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIGludCBub191bGRfYXR0YWNoKQogewotCXN0cnVjdCBNUFQyU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGEgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKKwlzdHJ1Y3QgTVBUMlNBU19UQVJHRVQgKnNhc190YXJnZXRfcHJpdl9kYXRhOwogCisJaWYgKHN0YXJnZXQgPT0gTlVMTCkKKwkJcmV0dXJuOworCXNhc190YXJnZXRfcHJpdl9kYXRhID0gc3RhcmdldC0+aG9zdGRhdGE7CiAJaWYgKG5vX3VsZF9hdHRhY2gpCiAJCXNhc190YXJnZXRfcHJpdl9kYXRhLT5mbGFncyB8PSBNUFRfVEFSR0VUX0ZMQUdTX1JBSURfQ09NUE9ORU5UOwogCWVsc2UKQEAgLTU4NDQsNyArNTk3Nyw3IEBACiAJcmFpZF9kZXZpY2UtPmhhbmRsZSA9IGhhbmRsZTsKIAlyYWlkX2RldmljZS0+d3dpZCA9IHd3aWQ7CiAJX3Njc2loX3JhaWRfZGV2aWNlX2FkZChpb2MsIHJhaWRfZGV2aWNlKTsKLQlpZiAoIWlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUpIHsKKwlpZiAoIWlvYy0+d2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlKSB7CiAJCXJjID0gc2NzaV9hZGRfZGV2aWNlKGlvYy0+c2hvc3QsIFJBSURfQ0hBTk5FTCwKIAkJICAgIHJhaWRfZGV2aWNlLT5pZCwgMCk7CiAJCWlmIChyYykKQEAgLTYxMjYsNiArNjI1OSwxMCBAQAogCQlfc2NzaWhfc2FzX2lyX2NvbmZpZ19jaGFuZ2VfZXZlbnRfZGVidWcoaW9jLCBldmVudF9kYXRhKTsKIAogI2VuZGlmCisKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJcmV0dXJuOworCiAJZm9yZWlnbl9jb25maWcgPSAobGUzMl90b19jcHUoZXZlbnRfZGF0YS0+RmxhZ3MpICYKIAkgICAgTVBJMl9FVkVOVF9JUl9DSEFOR0VfRkxBR1NfRk9SRUlHTl9DT05GSUcpID8gMSA6IDA7CiAKQEAgLTYxODQsNiArNjMyMSw5IEBACiAJaW50IHJjOwogCU1waTJFdmVudERhdGFJclZvbHVtZV90ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAKKwlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkKKwkJcmV0dXJuOworCiAJaWYgKGV2ZW50X2RhdGEtPlJlYXNvbkNvZGUgIT0gTVBJMl9FVkVOVF9JUl9WT0xVTUVfUkNfU1RBVEVfQ0hBTkdFRCkKIAkJcmV0dXJuOwogCkBAIC02MjY2LDYgKzY0MDYsOSBAQAogCU1waTJFdmVudERhdGFJclBoeXNpY2FsRGlza190ICpldmVudF9kYXRhID0gZndfZXZlbnQtPmV2ZW50X2RhdGE7CiAJdTY0IHNhc19hZGRyZXNzOwogCisJaWYgKGlvYy0+c2hvc3RfcmVjb3ZlcnkpCisJCXJldHVybjsKKwogCWlmIChldmVudF9kYXRhLT5SZWFzb25Db2RlICE9IE1QSTJfRVZFTlRfSVJfUEhZU0RJU0tfUkNfU1RBVEVfQ0hBTkdFRCkKIAkJcmV0dXJuOwogCkBAIC02NTA5LDEwICs2NjUyLDEwIEBACiAJdTMyIGRldmljZV9pbmZvOwogCXUxNiBzbG90OwogCi0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VhcmNoIGZvciBlbmQtZGV2aWNlczogc3RhcnRcbiIsIGlvYy0+bmFtZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmaW9jLT5zYXNfZGV2aWNlX2xpc3QpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJaGFuZGxlID0gMHhGRkZGOwogCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9zYXNfZGV2aWNlX3BnMChpb2MsICZtcGlfcmVwbHksCkBAIC02NTMxLDYgKzY2NzQsOSBAQAogCQlfc2NzaWhfbWFya19yZXNwb25kaW5nX3Nhc19kZXZpY2UoaW9jLCBzYXNfYWRkcmVzcywgc2xvdCwKIAkJICAgIGhhbmRsZSk7CiAJfQorb3V0OgorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIGVuZC1kZXZpY2VzOiBjb21wbGV0ZVxuIiwKKwkgICAgaW9jLT5uYW1lKTsKIH0KIAogLyoqCkBAIC02NjA2LDEwICs2NzUyLDE0IEBACiAJdTE2IGhhbmRsZTsKIAl1OCBwaHlzX2Rpc2tfbnVtOwogCi0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwlpZiAoIWlvYy0+aXJfZmlybXdhcmUpCisJCXJldHVybjsKKworCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJzZWFyY2ggZm9yIHJhaWQgdm9sdW1lczogc3RhcnRcbiIsCisJICAgIGlvYy0+bmFtZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmaW9jLT5yYWlkX2RldmljZV9saXN0KSkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAogCWhhbmRsZSA9IDB4RkZGRjsKIAl3aGlsZSAoIShtcHQyc2FzX2NvbmZpZ19nZXRfcmFpZF92b2x1bWVfcGcxKGlvYywgJm1waV9yZXBseSwKQEAgLTY2NDgsNiArNjc5OCw5IEBACiAJCQlzZXRfYml0KGhhbmRsZSwgaW9jLT5wZF9oYW5kbGVzKTsKIAkJfQogCX0KK291dDoKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VhcmNoIGZvciByZXNwb25kaW5nIHJhaWQgdm9sdW1lczogIgorCSAgICAiY29tcGxldGVcbiIsIGlvYy0+bmFtZSk7CiB9CiAKIC8qKgpAQCAtNjcwNywxMCArNjg2MCwxMCBAQAogCXU2NCBzYXNfYWRkcmVzczsKIAl1MTYgaGFuZGxlOwogCi0JcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgIiVzXG4iLCBpb2MtPm5hbWUsIF9fZnVuY19fKTsKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VhcmNoIGZvciBleHBhbmRlcnM6IHN0YXJ0XG4iLCBpb2MtPm5hbWUpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmlvYy0+c2FzX2V4cGFuZGVyX2xpc3QpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJaGFuZGxlID0gMHhGRkZGOwogCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9leHBhbmRlcl9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmZXhwYW5kZXJfcGcwLApAQCAtNjcyOSw2ICs2ODgyLDggQEAKIAkJX3Njc2loX21hcmtfcmVzcG9uZGluZ19leHBhbmRlcihpb2MsIHNhc19hZGRyZXNzLCBoYW5kbGUpOwogCX0KIAorIG91dDoKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2VhcmNoIGZvciBleHBhbmRlcnM6IGNvbXBsZXRlXG4iLCBpb2MtPm5hbWUpOwogfQogCiAvKioKQEAgLTY3NDQsNiArNjg5OSw4IEBACiAJc3RydWN0IF9zYXNfbm9kZSAqc2FzX2V4cGFuZGVyOwogCXN0cnVjdCBfcmFpZF9kZXZpY2UgKnJhaWRfZGV2aWNlLCAqcmFpZF9kZXZpY2VfbmV4dDsKIAorCXByaW50ayhNUFQyU0FTX0lORk9fRk1UICJyZW1vdmluZyB1bnJlc3BvbmRpbmcgZGV2aWNlczogc3RhcnRcbiIsCisJICAgIGlvYy0+bmFtZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2FzX2RldmljZSwgc2FzX2RldmljZV9uZXh0LAogCSAgICAmaW9jLT5zYXNfZGV2aWNlX2xpc3QsIGxpc3QpIHsKQEAgLTY3NjMsNiArNjkyMCw5IEBACiAJCV9zY3NpaF9yZW1vdmVfZGV2aWNlKGlvYywgc2FzX2RldmljZSk7CiAJfQogCisJaWYgKCFpb2MtPmlyX2Zpcm13YXJlKQorCQlnb3RvIHJldHJ5X2V4cGFuZGVyX3NlYXJjaDsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyYWlkX2RldmljZSwgcmFpZF9kZXZpY2VfbmV4dCwKIAkgICAgJmlvYy0+cmFpZF9kZXZpY2VfbGlzdCwgbGlzdCkgewogCQlpZiAocmFpZF9kZXZpY2UtPnJlc3BvbmRpbmcpIHsKQEAgLTY3ODksNTIgKzY5NDksMTcwIEBACiAJCW1wdDJzYXNfZXhwYW5kZXJfcmVtb3ZlKGlvYywgc2FzX2V4cGFuZGVyLT5zYXNfYWRkcmVzcyk7CiAJCWdvdG8gcmV0cnlfZXhwYW5kZXJfc2VhcmNoOwogCX0KKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicmVtb3ZpbmcgdW5yZXNwb25kaW5nIGRldmljZXM6IGNvbXBsZXRlXG4iLAorCSAgICBpb2MtPm5hbWUpOworCS8qIHVuYmxvY2sgZGV2aWNlcyAqLworCV9zY3NpaF91YmxvY2tfaW9fYWxsX2RldmljZShpb2MpOworfQorCitzdGF0aWMgdm9pZAorX3Njc2loX3JlZnJlc2hfZXhwYW5kZXJfbGlua3Moc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jLAorCXN0cnVjdCBfc2FzX25vZGUgKnNhc19leHBhbmRlciwgdTE2IGhhbmRsZSkKK3sKKwlNcGkyRXhwYW5kZXJQYWdlMV90IGV4cGFuZGVyX3BnMTsKKwlNcGkyQ29uZmlnUmVwbHlfdCBtcGlfcmVwbHk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IHNhc19leHBhbmRlci0+bnVtX3BoeXMgOyBpKyspIHsKKwkJaWYgKChtcHQyc2FzX2NvbmZpZ19nZXRfZXhwYW5kZXJfcGcxKGlvYywgJm1waV9yZXBseSwKKwkJICAgICZleHBhbmRlcl9wZzEsIGksIGhhbmRsZSkpKSB7CisJCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAorCQkJICAgIGlvYy0+bmFtZSwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKworCQltcHQyc2FzX3RyYW5zcG9ydF91cGRhdGVfbGlua3MoaW9jLCBzYXNfZXhwYW5kZXItPnNhc19hZGRyZXNzLAorCQkgICAgbGUxNl90b19jcHUoZXhwYW5kZXJfcGcxLkF0dGFjaGVkRGV2SGFuZGxlKSwgaSwKKwkJICAgIGV4cGFuZGVyX3BnMS5OZWdvdGlhdGVkTGlua1JhdGUgPj4gNCk7CisJfQogfQogCiAvKioKLSAqIF9zY3NpaF9oaWRlX3VuaGlkZV9zYXNfZGV2aWNlcyAtIGFkZC9yZW1vdmUgZGV2aWNlIHRvL2Zyb20gT1MKKyAqIF9zY3NpaF9zY2FuX2Zvcl9kZXZpY2VzX2FmdGVyX3Jlc2V0IC0gc2NhbiBmb3IgZGV2aWNlcyBhZnRlciBob3N0IHJlc2V0CiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwogc3RhdGljIHZvaWQKLV9zY3NpaF9oaWRlX3VuaGlkZV9zYXNfZGV2aWNlcyhzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCitfc2NzaWhfc2Nhbl9mb3JfZGV2aWNlc19hZnRlcl9yZXNldChzdHJ1Y3QgTVBUMlNBU19BREFQVEVSICppb2MpCiB7Ci0Jc3RydWN0IF9zYXNfZGV2aWNlICpzYXNfZGV2aWNlLCAqc2FzX2RldmljZV9uZXh0OworCU1waTJFeHBhbmRlclBhZ2UwX3QgZXhwYW5kZXJfcGcwOworCU1waTJTYXNEZXZpY2VQYWdlMF90IHNhc19kZXZpY2VfcGcwOworCU1waTJSYWlkVm9sUGFnZTFfdCB2b2x1bWVfcGcxOworCU1waTJSYWlkVm9sUGFnZTBfdCB2b2x1bWVfcGcwOworCU1waTJSYWlkUGh5c0Rpc2tQYWdlMF90IHBkX3BnMDsKKwlNcGkyRXZlbnRJckNvbmZpZ0VsZW1lbnRfdCBlbGVtZW50OworCU1waTJDb25maWdSZXBseV90IG1waV9yZXBseTsKKwl1OCBwaHlzX2Rpc2tfbnVtOworCXUxNiBpb2Nfc3RhdHVzOworCXUxNiBoYW5kbGUsIHBhcmVudF9oYW5kbGU7CisJdTY0IHNhc19hZGRyZXNzOworCXN0cnVjdCBfc2FzX2RldmljZSAqc2FzX2RldmljZTsKKwlzdHJ1Y3QgX3Nhc19ub2RlICpleHBhbmRlcl9kZXZpY2U7CisJc3RhdGljIHN0cnVjdCBfcmFpZF9kZXZpY2UgKnJhaWRfZGV2aWNlOwogCi0JaWYgKCFpb2MtPmlzX3dhcnBkcml2ZSB8fCBpb2MtPm1mZ19wZzEwX2hpZGVfZmxhZyAhPQotCSAgICBNRkdfUEFHRTEwX0hJREVfSUZfVk9MX1BSRVNFTlQpCi0JCXJldHVybjsKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2NhbiBkZXZpY2VzOiBzdGFydFxuIiwgaW9jLT5uYW1lKTsKIAotCWlmIChpb2MtPmhpZGVfZHJpdmVzKSB7Ci0JCWlmIChfc2NzaWhfZ2V0X251bV92b2x1bWVzKGlvYykpCi0JCQlyZXR1cm47Ci0JCWlvYy0+aGlkZV9kcml2ZXMgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2FzX2RldmljZSwgc2FzX2RldmljZV9uZXh0LAotCQkgICAgJmlvYy0+c2FzX2RldmljZV9saXN0LCBsaXN0KSB7Ci0JCQlpZiAoIW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfYWRkKGlvYywgc2FzX2RldmljZS0+aGFuZGxlLAotCQkJCXNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpIHsKLQkJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKLQkJCX0gZWxzZSBpZiAoIXNhc19kZXZpY2UtPnN0YXJnZXQpIHsKLQkJCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsCi0JCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAotCQkJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpOwotCQkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFfc2NzaWhfZ2V0X251bV92b2x1bWVzKGlvYykpCi0JCQlyZXR1cm47Ci0JCWlvYy0+aGlkZV9kcml2ZXMgPSAxOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2FzX2RldmljZSwgc2FzX2RldmljZV9uZXh0LAotCQkgICAgJmlvYy0+c2FzX2RldmljZV9saXN0LCBsaXN0KSB7Ci0JCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsCi0JCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3MsCi0JCQkgICAgc2FzX2RldmljZS0+c2FzX2FkZHJlc3NfcGFyZW50KTsKKwlfc2NzaWhfc2FzX2hvc3RfcmVmcmVzaChpb2MpOworCisJLyogZXhwYW5kZXJzICovCisJaGFuZGxlID0gMHhGRkZGOworCXdoaWxlICghKG1wdDJzYXNfY29uZmlnX2dldF9leHBhbmRlcl9wZzAoaW9jLCAmbXBpX3JlcGx5LCAmZXhwYW5kZXJfcGcwLAorCSAgICBNUEkyX1NBU19FWFBBTkRfUEdBRF9GT1JNX0dFVF9ORVhUX0hOREwsIGhhbmRsZSkpKSB7CisJCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHkuSU9DU3RhdHVzKSAmCisJCSAgICBNUEkyX0lPQ1NUQVRVU19NQVNLOworCQlpZiAoaW9jX3N0YXR1cyA9PSBNUEkyX0lPQ1NUQVRVU19DT05GSUdfSU5WQUxJRF9QQUdFKQorCQkJYnJlYWs7CisJCWhhbmRsZSA9IGxlMTZfdG9fY3B1KGV4cGFuZGVyX3BnMC5EZXZIYW5kbGUpOworCQlleHBhbmRlcl9kZXZpY2UgPSBtcHQyc2FzX3Njc2loX2V4cGFuZGVyX2ZpbmRfYnlfc2FzX2FkZHJlc3MoCisJCSAgICBpb2MsIGxlNjRfdG9fY3B1KGV4cGFuZGVyX3BnMC5TQVNBZGRyZXNzKSk7CisJCWlmIChleHBhbmRlcl9kZXZpY2UpCisJCQlfc2NzaWhfcmVmcmVzaF9leHBhbmRlcl9saW5rcyhpb2MsIGV4cGFuZGVyX2RldmljZSwKKwkJCSAgICBoYW5kbGUpOworCQllbHNlCisJCQlfc2NzaWhfZXhwYW5kZXJfYWRkKGlvYywgaGFuZGxlKTsKKwl9CisKKwlpZiAoIWlvYy0+aXJfZmlybXdhcmUpCisJCWdvdG8gc2tpcF90b19zYXM7CisKKwkvKiBwaHlzIGRpc2sgKi8KKwlwaHlzX2Rpc2tfbnVtID0gMHhGRjsKKwl3aGlsZSAoIShtcHQyc2FzX2NvbmZpZ19nZXRfcGh5c19kaXNrX3BnMChpb2MsICZtcGlfcmVwbHksCisJICAgICZwZF9wZzAsIE1QSTJfUEhZU0RJU0tfUEdBRF9GT1JNX0dFVF9ORVhUX1BIWVNESVNLTlVNLAorCSAgICBwaHlzX2Rpc2tfbnVtKSkpIHsKKwkJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYKKwkJICAgIE1QSTJfSU9DU1RBVFVTX01BU0s7CisJCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1BBR0UpCisJCQlicmVhazsKKwkJcGh5c19kaXNrX251bSA9IHBkX3BnMC5QaHlzRGlza051bTsKKwkJaGFuZGxlID0gbGUxNl90b19jcHUocGRfcGcwLkRldkhhbmRsZSk7CisJCXNhc19kZXZpY2UgPSBfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X2hhbmRsZShpb2MsIGhhbmRsZSk7CisJCWlmIChzYXNfZGV2aWNlKQorCQkJY29udGludWU7CisJCWlmIChtcHQyc2FzX2NvbmZpZ19nZXRfc2FzX2RldmljZV9wZzAoaW9jLCAmbXBpX3JlcGx5LAorCQkgICAgJnNhc19kZXZpY2VfcGcwLCBNUEkyX1NBU19ERVZJQ0VfUEdBRF9GT1JNX0hBTkRMRSwKKwkJICAgIGhhbmRsZSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlwYXJlbnRfaGFuZGxlID0gbGUxNl90b19jcHUoc2FzX2RldmljZV9wZzAuUGFyZW50RGV2SGFuZGxlKTsKKwkJaWYgKCFfc2NzaWhfZ2V0X3Nhc19hZGRyZXNzKGlvYywgcGFyZW50X2hhbmRsZSwKKwkJICAgICZzYXNfYWRkcmVzcykpIHsKKwkJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhpb2MsIHNhc19hZGRyZXNzLAorCQkJICAgIGhhbmRsZSwgc2FzX2RldmljZV9wZzAuUGh5TnVtLAorCQkJICAgIE1QSTJfU0FTX05FR19MSU5LX1JBVEVfMV81KTsKKwkJCXNldF9iaXQoaGFuZGxlLCBpb2MtPnBkX2hhbmRsZXMpOworCQkJX3Njc2loX2FkZF9kZXZpY2UoaW9jLCBoYW5kbGUsIDAsIDEpOwogCQl9CiAJfQorCisJLyogdm9sdW1lcyAqLworCWhhbmRsZSA9IDB4RkZGRjsKKwl3aGlsZSAoIShtcHQyc2FzX2NvbmZpZ19nZXRfcmFpZF92b2x1bWVfcGcxKGlvYywgJm1waV9yZXBseSwKKwkgICAgJnZvbHVtZV9wZzEsIE1QSTJfUkFJRF9WT0xVTUVfUEdBRF9GT1JNX0dFVF9ORVhUX0hBTkRMRSwgaGFuZGxlKSkpIHsKKwkJaW9jX3N0YXR1cyA9IGxlMTZfdG9fY3B1KG1waV9yZXBseS5JT0NTdGF0dXMpICYKKwkJICAgIE1QSTJfSU9DU1RBVFVTX01BU0s7CisJCWlmIChpb2Nfc3RhdHVzID09IE1QSTJfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1BBR0UpCisJCQlicmVhazsKKwkJaGFuZGxlID0gbGUxNl90b19jcHUodm9sdW1lX3BnMS5EZXZIYW5kbGUpOworCQlyYWlkX2RldmljZSA9IF9zY3NpaF9yYWlkX2RldmljZV9maW5kX2J5X3d3aWQoaW9jLAorCQkgICAgbGU2NF90b19jcHUodm9sdW1lX3BnMS5XV0lEKSk7CisJCWlmIChyYWlkX2RldmljZSkKKwkJCWNvbnRpbnVlOworCQlpZiAobXB0MnNhc19jb25maWdfZ2V0X3JhaWRfdm9sdW1lX3BnMChpb2MsICZtcGlfcmVwbHksCisJCSAgICAmdm9sdW1lX3BnMCwgTVBJMl9SQUlEX1ZPTFVNRV9QR0FEX0ZPUk1fSEFORExFLCBoYW5kbGUsCisJCSAgICAgc2l6ZW9mKE1waTJSYWlkVm9sUGFnZTBfdCkpKQorCQkJY29udGludWU7CisJCWlmICh2b2x1bWVfcGcwLlZvbHVtZVN0YXRlID09IE1QSTJfUkFJRF9WT0xfU1RBVEVfT1BUSU1BTCB8fAorCQkgICAgdm9sdW1lX3BnMC5Wb2x1bWVTdGF0ZSA9PSBNUEkyX1JBSURfVk9MX1NUQVRFX09OTElORSB8fAorCQkgICAgdm9sdW1lX3BnMC5Wb2x1bWVTdGF0ZSA9PSBNUEkyX1JBSURfVk9MX1NUQVRFX0RFR1JBREVEKSB7CisJCQltZW1zZXQoJmVsZW1lbnQsIDAsIHNpemVvZihNcGkyRXZlbnRJckNvbmZpZ0VsZW1lbnRfdCkpOworCQkJZWxlbWVudC5SZWFzb25Db2RlID0gTVBJMl9FVkVOVF9JUl9DSEFOR0VfUkNfQURERUQ7CisJCQllbGVtZW50LlZvbERldkhhbmRsZSA9IHZvbHVtZV9wZzEuRGV2SGFuZGxlOworCQkJX3Njc2loX3Nhc192b2x1bWVfYWRkKGlvYywgJmVsZW1lbnQpOworCQl9CisJfQorCisgc2tpcF90b19zYXM6CisKKwkvKiBzYXMgZGV2aWNlcyAqLworCWhhbmRsZSA9IDB4RkZGRjsKKwl3aGlsZSAoIShtcHQyc2FzX2NvbmZpZ19nZXRfc2FzX2RldmljZV9wZzAoaW9jLCAmbXBpX3JlcGx5LAorCSAgICAmc2FzX2RldmljZV9wZzAsIE1QSTJfU0FTX0RFVklDRV9QR0FEX0ZPUk1fR0VUX05FWFRfSEFORExFLAorCSAgICBoYW5kbGUpKSkgeworCQlpb2Nfc3RhdHVzID0gbGUxNl90b19jcHUobXBpX3JlcGx5LklPQ1N0YXR1cykgJgorCQkgICAgTVBJMl9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY19zdGF0dXMgPT0gTVBJMl9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSkKKwkJCWJyZWFrOworCQloYW5kbGUgPSBsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5EZXZIYW5kbGUpOworCQlpZiAoIShfc2NzaWhfaXNfZW5kX2RldmljZSgKKwkJICAgIGxlMzJfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkRldmljZUluZm8pKSkpCisJCQljb250aW51ZTsKKwkJc2FzX2RldmljZSA9IG1wdDJzYXNfc2NzaWhfc2FzX2RldmljZV9maW5kX2J5X3Nhc19hZGRyZXNzKGlvYywKKwkJICAgIGxlNjRfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlNBU0FkZHJlc3MpKTsKKwkJaWYgKHNhc19kZXZpY2UpCisJCQljb250aW51ZTsKKwkJcGFyZW50X2hhbmRsZSA9IGxlMTZfdG9fY3B1KHNhc19kZXZpY2VfcGcwLlBhcmVudERldkhhbmRsZSk7CisJCWlmICghX3Njc2loX2dldF9zYXNfYWRkcmVzcyhpb2MsIHBhcmVudF9oYW5kbGUsICZzYXNfYWRkcmVzcykpIHsKKwkJCW1wdDJzYXNfdHJhbnNwb3J0X3VwZGF0ZV9saW5rcyhpb2MsIHNhc19hZGRyZXNzLCBoYW5kbGUsCisJCQkgICAgc2FzX2RldmljZV9wZzAuUGh5TnVtLCBNUEkyX1NBU19ORUdfTElOS19SQVRFXzFfNSk7CisJCQlfc2NzaWhfYWRkX2RldmljZShpb2MsIGhhbmRsZSwgMCwgMCk7CisJCX0KKwl9CisKKwlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAic2NhbiBkZXZpY2VzOiBjb21wbGV0ZVxuIiwgaW9jLT5uYW1lKTsKIH0KIAorCiAvKioKICAqIG1wdDJzYXNfc2NzaWhfcmVzZXRfaGFuZGxlciAtIHJlc2V0IGNhbGxiYWNrIGhhbmRsZXIgKGZvciBzY3NpaCkKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdApAQCAtNjg3MCw3ICs3MTQ4LDYgQEAKIAkJfQogCQlfc2NzaWhfZndfZXZlbnRfY2xlYW51cF9xdWV1ZShpb2MpOwogCQlfc2NzaWhfZmx1c2hfcnVubmluZ19jbWRzKGlvYyk7Ci0JCV9zY3NpaF9xdWV1ZV9yZXNjYW4oaW9jKTsKIAkJYnJlYWs7CiAJY2FzZSBNUFQyX0lPQ19ET05FX1JFU0VUOgogCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAiJXM6ICIKQEAgLTY4ODAsNiArNzE1NywxMyBAQAogCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfc2FzX2RldmljZXMoaW9jKTsKIAkJX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX3JhaWRfZGV2aWNlcyhpb2MpOwogCQlfc2NzaWhfc2VhcmNoX3Jlc3BvbmRpbmdfZXhwYW5kZXJzKGlvYyk7CisJCWlmICghaW9jLT5pc19kcml2ZXJfbG9hZGluZykgeworCQkJX3Njc2loX3ByZXBfZGV2aWNlX3NjYW4oaW9jKTsKKwkJCV9zY3NpaF9zZWFyY2hfcmVzcG9uZGluZ19zYXNfZGV2aWNlcyhpb2MpOworCQkJX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX3JhaWRfZGV2aWNlcyhpb2MpOworCQkJX3Njc2loX3NlYXJjaF9yZXNwb25kaW5nX2V4cGFuZGVycyhpb2MpOworCQkJX3Njc2loX2Vycm9yX3JlY292ZXJ5X2RlbGV0ZV9kZXZpY2VzKGlvYyk7CisJCX0KIAkJYnJlYWs7CiAJfQogfQpAQCAtNjg5Nyw3ICs3MTgxLDYgQEAKIHsKIAlzdHJ1Y3QgZndfZXZlbnRfd29yayAqZndfZXZlbnQgPSBjb250YWluZXJfb2Yod29yaywKIAkgICAgc3RydWN0IGZ3X2V2ZW50X3dvcmssIGRlbGF5ZWRfd29yay53b3JrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IGZ3X2V2ZW50LT5pb2M7CiAKIAkvKiB0aGUgcXVldWUgaXMgYmVpbmcgZmx1c2hlZCBzbyBpZ25vcmUgdGhpcyBldmVudCAqLwpAQCAtNjkwNywyMyArNzE5MCwyMSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGZ3X2V2ZW50LT5ldmVudCA9PSBNUFQyU0FTX1JFU0NBTl9BRlRFUl9IT1NUX1JFU0VUKSB7Ci0JCV9zY3NpaF9md19ldmVudF9mcmVlKGlvYywgZndfZXZlbnQpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywgZmxhZ3MpOwotCQlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSkgewotCQkJaW5pdF9jb21wbGV0aW9uKCZpb2MtPnNob3N0X3JlY292ZXJ5X2RvbmUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5pb2NfcmVzZXRfaW5fcHJvZ3Jlc3NfbG9jaywKLQkJCSAgICBmbGFncyk7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpb2MtPnNob3N0X3JlY292ZXJ5X2RvbmUpOwotCQl9IGVsc2UKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+aW9jX3Jlc2V0X2luX3Byb2dyZXNzX2xvY2ssCi0JCQkgICAgZmxhZ3MpOwotCQlfc2NzaWhfcmVtb3ZlX3VucmVzcG9uZGluZ19zYXNfZGV2aWNlcyhpb2MpOwotCQlfc2NzaWhfaGlkZV91bmhpZGVfc2FzX2RldmljZXMoaW9jKTsKLQkJcmV0dXJuOwotCX0KLQogCXN3aXRjaCAoZndfZXZlbnQtPmV2ZW50KSB7CisJY2FzZSBNUFQyU0FTX1JFTU9WRV9VTlJFU1BPTkRJTkdfREVWSUNFUzoKKwkJd2hpbGUgKHNjc2lfaG9zdF9pbl9yZWNvdmVyeShpb2MtPnNob3N0KSkKKwkJCXNzbGVlcCgxKTsKKwkJX3Njc2loX3JlbW92ZV91bnJlc3BvbmRpbmdfc2FzX2RldmljZXMoaW9jKTsKKwkJX3Njc2loX3NjYW5fZm9yX2RldmljZXNfYWZ0ZXJfcmVzZXQoaW9jKTsKKwkJYnJlYWs7CisJY2FzZSBNUFQyU0FTX1BPUlRfRU5BQkxFX0NPTVBMRVRFOgorCQlpb2MtPnN0YXJ0X3NjYW4gPSAwOworCisKKworCQlkZXd0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBvcnQgZW5hYmxlOiBjb21wbGV0ZSAiCisJCSAgICAiZnJvbSB3b3JrZXIgdGhyZWFkXG4iLCBpb2MtPm5hbWUpKTsKKwkJYnJlYWs7CiAJY2FzZSBNUFQyU0FTX1RVUk5fT05fRkFVTFRfTEVEOgogCQlfc2NzaWhfdHVybl9vbl9mYXVsdF9sZWQoaW9jLCBmd19ldmVudC0+ZGV2aWNlX2hhbmRsZSk7CiAJCWJyZWFrOwpAQCAtNzEyMCw2ICs3NDAxLDggQEAKIAkuc2xhdmVfY29uZmlndXJlCQk9IF9zY3NpaF9zbGF2ZV9jb25maWd1cmUsCiAJLnRhcmdldF9kZXN0cm95CQkJPSBfc2NzaWhfdGFyZ2V0X2Rlc3Ryb3ksCiAJLnNsYXZlX2Rlc3Ryb3kJCQk9IF9zY3NpaF9zbGF2ZV9kZXN0cm95LAorCS5zY2FuX2ZpbmlzaGVkCQkJPSBfc2NzaWhfc2Nhbl9maW5pc2hlZCwKKwkuc2Nhbl9zdGFydAkJCT0gX3Njc2loX3NjYW5fc3RhcnQsCiAJLmNoYW5nZV9xdWV1ZV9kZXB0aCAJCT0gX3Njc2loX2NoYW5nZV9xdWV1ZV9kZXB0aCwKIAkuY2hhbmdlX3F1ZXVlX3R5cGUJCT0gX3Njc2loX2NoYW5nZV9xdWV1ZV90eXBlLAogCS5laF9hYm9ydF9oYW5kbGVyCQk9IF9zY3NpaF9hYm9ydCwKQEAgLTczNTMsNiArNzYzNiw3IEBACiAJfQogCiAJc2FzX3JlbW92ZV9ob3N0KHNob3N0KTsKKwltcHQyc2FzX2Jhc2VfZGV0YWNoKGlvYyk7CiAJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CiAJc2NzaV9ob3N0X3B1dChzaG9zdCk7CkBAIC03Mzc5LDcgKzc2NjMsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAorCSAvKiBubyBCaW9zLCByZXR1cm4gaW1tZWRpYXRlbHkgKi8KKwlpZiAoIWlvYy0+Ymlvc19wZzMuQmlvc1ZlcnNpb24pCisJCXJldHVybjsKKwogCWRldmljZSA9IE5VTEw7CisJaXNfcmFpZCA9IDA7CiAJaWYgKGlvYy0+cmVxX2Jvb3RfZGV2aWNlLmRldmljZSkgewogCQlkZXZpY2UgPSAgaW9jLT5yZXFfYm9vdF9kZXZpY2UuZGV2aWNlOwogCQlpc19yYWlkID0gaW9jLT5yZXFfYm9vdF9kZXZpY2UuaXNfcmFpZDsKQEAgLTc0MTUsOCArNzcwNCw5IEBACiAJCSAgICBzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpKSB7CiAJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKIAkJfSBlbHNlIGlmICghc2FzX2RldmljZS0+c3RhcmdldCkgewotCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLCBzYXNfYWRkcmVzcywKLQkJCSAgICBzYXNfYWRkcmVzc19wYXJlbnQpOworCQkJaWYgKCFpb2MtPmlzX2RyaXZlcl9sb2FkaW5nKQorCQkJCW1wdDJzYXNfdHJhbnNwb3J0X3BvcnRfcmVtb3ZlKGlvYywgc2FzX2FkZHJlc3MsCisJCQkJCXNhc19hZGRyZXNzX3BhcmVudCk7CiAJCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKIAkJfQogCX0KQEAgLTc0NjAsMjIgKzc3NTAsMjggQEAKIAkvKiBTQVMgRGV2aWNlIExpc3QgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2FzX2RldmljZSwgbmV4dCwgJmlvYy0+c2FzX2RldmljZV9pbml0X2xpc3QsCiAJICAgIGxpc3QpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+c2FzX2RldmljZV9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfbW92ZV90YWlsKCZzYXNfZGV2aWNlLT5saXN0LCAmaW9jLT5zYXNfZGV2aWNlX2xpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChpb2MtPmhpZGVfZHJpdmVzKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFtcHQyc2FzX3RyYW5zcG9ydF9wb3J0X2FkZChpb2MsIHNhc19kZXZpY2UtPmhhbmRsZSwKIAkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCkpIHsKLQkJCV9zY3NpaF9zYXNfZGV2aWNlX3JlbW92ZShpb2MsIHNhc19kZXZpY2UpOworCQkJbGlzdF9kZWwoJnNhc19kZXZpY2UtPmxpc3QpOworCQkJa2ZyZWUoc2FzX2RldmljZSk7CisJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmICghc2FzX2RldmljZS0+c3RhcmdldCkgewotCQkJbXB0MnNhc190cmFuc3BvcnRfcG9ydF9yZW1vdmUoaW9jLAotCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAotCQkJICAgIHNhc19kZXZpY2UtPnNhc19hZGRyZXNzX3BhcmVudCk7Ci0JCQlfc2NzaWhfc2FzX2RldmljZV9yZW1vdmUoaW9jLCBzYXNfZGV2aWNlKTsKKwkJCWlmICghaW9jLT5pc19kcml2ZXJfbG9hZGluZykKKwkJCQltcHQyc2FzX3RyYW5zcG9ydF9wb3J0X3JlbW92ZShpb2MsCisJCQkJCXNhc19kZXZpY2UtPnNhc19hZGRyZXNzLAorCQkJCQlzYXNfZGV2aWNlLT5zYXNfYWRkcmVzc19wYXJlbnQpOworCQkJbGlzdF9kZWwoJnNhc19kZXZpY2UtPmxpc3QpOworCQkJa2ZyZWUoc2FzX2RldmljZSk7CisJCQljb250aW51ZTsKKwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOworCQlsaXN0X21vdmVfdGFpbCgmc2FzX2RldmljZS0+bGlzdCwgJmlvYy0+c2FzX2RldmljZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5zYXNfZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTc0ODgsOSArNzc4NCw3IEBACiBzdGF0aWMgdm9pZAogX3Njc2loX3Byb2JlX2RldmljZXMoc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jKQogewotCXUxNiB2b2x1bWVfbWFwcGluZ19mbGFncyA9Ci0JICAgIGxlMTZfdG9fY3B1KGlvYy0+aW9jX3BnOC5JUlZvbHVtZU1hcHBpbmdGbGFncykgJgotCSAgICBNUEkyX0lPQ1BBR0U4X0lSRkxBR1NfTUFTS19WT0xVTUVfTUFQUElOR19NT0RFOworCXUxNiB2b2x1bWVfbWFwcGluZ19mbGFnczsKIAogCWlmICghKGlvYy0+ZmFjdHMuUHJvdG9jb2xGbGFncyAmIE1QSTJfSU9DRkFDVFNfUFJPVE9DT0xfU0NTSV9JTklUSUFUT1IpKQogCQlyZXR1cm47ICAvKiByZXR1cm4gd2hlbiBJT0MgZG9lc24ndCBzdXBwb3J0IGluaXRpYXRvciBtb2RlICovCkBAIC03NDk4LDE4ICs3NzkyLDkzIEBACiAJX3Njc2loX3Byb2JlX2Jvb3RfZGV2aWNlcyhpb2MpOwogCiAJaWYgKGlvYy0+aXJfZmlybXdhcmUpIHsKLQkJaWYgKCh2b2x1bWVfbWFwcGluZ19mbGFncyAmCi0JCSAgICAgTVBJMl9JT0NQQUdFOF9JUkZMQUdTX0hJR0hfVk9MVU1FX01BUFBJTkcpKSB7Ci0JCQlfc2NzaWhfcHJvYmVfc2FzKGlvYyk7CisJCXZvbHVtZV9tYXBwaW5nX2ZsYWdzID0KKwkJICAgIGxlMTZfdG9fY3B1KGlvYy0+aW9jX3BnOC5JUlZvbHVtZU1hcHBpbmdGbGFncykgJgorCQkgICAgTVBJMl9JT0NQQUdFOF9JUkZMQUdTX01BU0tfVk9MVU1FX01BUFBJTkdfTU9ERTsKKwkJaWYgKHZvbHVtZV9tYXBwaW5nX2ZsYWdzID09CisJCSAgICBNUEkyX0lPQ1BBR0U4X0lSRkxBR1NfTE9XX1ZPTFVNRV9NQVBQSU5HKSB7CiAJCQlfc2NzaWhfcHJvYmVfcmFpZChpb2MpOworCQkJX3Njc2loX3Byb2JlX3Nhcyhpb2MpOwogCQl9IGVsc2UgewotCQkJX3Njc2loX3Byb2JlX3JhaWQoaW9jKTsKIAkJCV9zY3NpaF9wcm9iZV9zYXMoaW9jKTsKKwkJCV9zY3NpaF9wcm9iZV9yYWlkKGlvYyk7CiAJCX0KIAl9IGVsc2UKIAkJX3Njc2loX3Byb2JlX3Nhcyhpb2MpOwogfQogCisKKy8qKgorICogX3Njc2loX3NjYW5fc3RhcnQgLSBzY3NpIGxsZCBjYWxsYmFjayBmb3IgLnNjYW5fc3RhcnQKKyAqIEBzaG9zdDogU0NTSSBob3N0IHBvaW50ZXIKKyAqCisgKiBUaGUgc2hvc3QgaGFzIHRoZSBhYmlsaXR5IHRvIGRpc2NvdmVyIHRhcmdldHMgb24gaXRzIG93biBpbnN0ZWFkCisgKiBvZiBzY2FubmluZyB0aGUgZW50aXJlIGJ1cy4gIEluIG91ciBpbXBsZW1lbnRpb24sIHdlIHdpbGwga2ljayBvZmYKKyAqIGZpcm13YXJlIGRpc2NvdmVyeS4KKyAqLworc3RhdGljIHZvaWQKK19zY3NpaF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBNUFQyU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOworCWludCByYzsKKworCWlmIChkaWFnX2J1ZmZlcl9lbmFibGUgIT0gLTEgJiYgZGlhZ19idWZmZXJfZW5hYmxlICE9IDApCisJCW1wdDJzYXNfZW5hYmxlX2RpYWdfYnVmZmVyKGlvYywgZGlhZ19idWZmZXJfZW5hYmxlKTsKKworCWlvYy0+c3RhcnRfc2NhbiA9IDE7CisJcmMgPSBtcHQyc2FzX3BvcnRfZW5hYmxlKGlvYyk7CisKKwlpZiAocmMgIT0gMCkKKwkJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBvcnQgZW5hYmxlOiBGQUlMRURcbiIsIGlvYy0+bmFtZSk7Cit9CisKKy8qKgorICogX3Njc2loX3NjYW5fZmluaXNoZWQgLSBzY3NpIGxsZCBjYWxsYmFjayBmb3IgLnNjYW5fZmluaXNoZWQKKyAqIEBzaG9zdDogU0NTSSBob3N0IHBvaW50ZXIKKyAqIEB0aW1lOiBlbGFwc2VkIHRpbWUgb2YgdGhlIHNjYW4gaW4gamlmZmllcworICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IHVudGlsIGl0IHJldHVybnMgMSB3aXRoIHRoZQorICogc2NzaV9ob3N0IGFuZCB0aGUgZWxhcHNlZCB0aW1lIG9mIHRoZSBzY2FuIGluIGppZmZpZXMuIEluIG91ciBpbXBsZW1lbnRpb24sCisgKiB3ZSB3YWl0IGZvciBmaXJtd2FyZSBkaXNjb3ZlcnkgdG8gY29tcGxldGUsIHRoZW4gcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQKK19zY3NpaF9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpCit7CisJc3RydWN0IE1QVDJTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CisKKwlpZiAodGltZSA+PSAoMzAwICogSFopKSB7CisJCWlvYy0+YmFzZV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6IEZBSUxFRCB3aXRoIHRpbWVvdXQgIgorCQkgICAgIih0aW1lb3V0PTMwMHMpXG4iLCBpb2MtPm5hbWUpOworCQlpb2MtPmlzX2RyaXZlcl9sb2FkaW5nID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGlvYy0+c3RhcnRfc2NhbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW9jLT5zdGFydF9zY2FuX2ZhaWxlZCkgeworCQlwcmludGsoTVBUMlNBU19JTkZPX0ZNVCAicG9ydCBlbmFibGU6IEZBSUxFRCB3aXRoICIKKwkJICAgICIoaW9jX3N0YXR1cz0weCUwOHgpXG4iLCBpb2MtPm5hbWUsIGlvYy0+c3RhcnRfc2Nhbl9mYWlsZWQpOworCQlpb2MtPmlzX2RyaXZlcl9sb2FkaW5nID0gMDsKKwkJaW9jLT53YWl0X2Zvcl9kaXNjb3ZlcnlfdG9fY29tcGxldGUgPSAwOworCQlpb2MtPnJlbW92ZV9ob3N0ID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJpbnRrKE1QVDJTQVNfSU5GT19GTVQgInBvcnQgZW5hYmxlOiBTVUNDRVNTXG4iLCBpb2MtPm5hbWUpOworCWlvYy0+YmFzZV9jbWRzLnN0YXR1cyA9IE1QVDJfQ01EX05PVF9VU0VEOworCisJaWYgKGlvYy0+d2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlKSB7CisJCWlvYy0+d2FpdF9mb3JfZGlzY292ZXJ5X3RvX2NvbXBsZXRlID0gMDsKKwkJX3Njc2loX3Byb2JlX2RldmljZXMoaW9jKTsKKwl9CisJbXB0MnNhc19iYXNlX3N0YXJ0X3dhdGNoZG9nKGlvYyk7CisJaW9jLT5pc19kcml2ZXJfbG9hZGluZyA9IDA7CisJcmV0dXJuIDE7Cit9CisKKwogLyoqCiAgKiBfc2NzaWhfcHJvYmUgLSBhdHRhY2ggYW5kIGFkZCBzY3NpIGhvc3QKICAqIEBwZGV2OiBQQ0kgZGV2aWNlIHN0cnVjdApAQCAtNzU0Niw2ICs3OTE1LDcgQEAKIAlpb2MtPnRtX2NiX2lkeCA9IHRtX2NiX2lkeDsKIAlpb2MtPmN0bF9jYl9pZHggPSBjdGxfY2JfaWR4OwogCWlvYy0+YmFzZV9jYl9pZHggPSBiYXNlX2NiX2lkeDsKKwlpb2MtPnBvcnRfZW5hYmxlX2NiX2lkeCA9IHBvcnRfZW5hYmxlX2NiX2lkeDsKIAlpb2MtPnRyYW5zcG9ydF9jYl9pZHggPSB0cmFuc3BvcnRfY2JfaWR4OwogCWlvYy0+c2NzaWhfY2JfaWR4ID0gc2NzaWhfY2JfaWR4OwogCWlvYy0+Y29uZmlnX2NiX2lkeCA9IGNvbmZpZ19jYl9pZHg7CkBAIC03NjE4LDE0ICs3OTg4LDE0IEBACiAJCWdvdG8gb3V0X3RocmVhZF9mYWlsOwogCX0KIAotCWlvYy0+d2FpdF9mb3JfcG9ydF9lbmFibGVfdG9fY29tcGxldGUgPSAxOworCWlvYy0+aXNfZHJpdmVyX2xvYWRpbmcgPSAxOwogCWlmICgobXB0MnNhc19iYXNlX2F0dGFjaChpb2MpKSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAkJZ290byBvdXRfYXR0YWNoX2ZhaWw7CiAJfQogCi0JaW9jLT53YWl0X2Zvcl9wb3J0X2VuYWJsZV90b19jb21wbGV0ZSA9IDA7CisJc2NzaV9zY2FuX2hvc3Qoc2hvc3QpOwogCWlmIChpb2MtPmlzX3dhcnBkcml2ZSkgewogCQlpZiAoaW9jLT5tZmdfcGcxMF9oaWRlX2ZsYWcgPT0gIE1GR19QQUdFMTBfRVhQT1NFX0FMTF9ESVNLUykKIAkJCWlvYy0+aGlkZV9kcml2ZXMgPSAwOwpAQCAtNzY0OCw2ICs4MDE4LDcgQEAKICBvdXRfdGhyZWFkX2ZhaWw6CiAJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiAgb3V0X2FkZF9zaG9zdF9mYWlsOgogCXJldHVybiAtRU5PREVWOwogfQpAQCAtNzg5NCw2ICs4MjY1LDggQEAKIAogCS8qIGJhc2UgaW50ZXJuYWwgY29tbWFuZHMgY2FsbGJhY2sgaGFuZGxlciAqLwogCWJhc2VfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIobXB0MnNhc19iYXNlX2RvbmUpOworCXBvcnRfZW5hYmxlX2NiX2lkeCA9IG1wdDJzYXNfYmFzZV9yZWdpc3Rlcl9jYWxsYmFja19oYW5kbGVyKAorCQltcHQyc2FzX3BvcnRfZW5hYmxlX2RvbmUpOwogCiAJLyogdHJhbnNwb3J0IGludGVybmFsIGNvbW1hbmRzIGNhbGxiYWNrIGhhbmRsZXIgKi8KIAl0cmFuc3BvcnRfY2JfaWR4ID0gbXB0MnNhc19iYXNlX3JlZ2lzdGVyX2NhbGxiYWNrX2hhbmRsZXIoCkBAIC03OTQ4LDYgKzgzMjEsNyBAQAogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIoc2NzaV9pb19jYl9pZHgpOwogCW1wdDJzYXNfYmFzZV9yZWxlYXNlX2NhbGxiYWNrX2hhbmRsZXIodG1fY2JfaWR4KTsKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKGJhc2VfY2JfaWR4KTsKKwltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHBvcnRfZW5hYmxlX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcih0cmFuc3BvcnRfY2JfaWR4KTsKIAltcHQyc2FzX2Jhc2VfcmVsZWFzZV9jYWxsYmFja19oYW5kbGVyKHNjc2loX2NiX2lkeCk7CiAJbXB0MnNhc19iYXNlX3JlbGVhc2VfY2FsbGJhY2tfaGFuZGxlcihjb25maWdfY2JfaWR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCmluZGV4IDE1Yzc5ODAuLjIzMDczMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCW1lbXNldChpZGVudGlmeSwgMCwgc2l6ZW9mKGlkZW50aWZ5KSk7CisJbWVtc2V0KGlkZW50aWZ5LCAwLCBzaXplb2YoKmlkZW50aWZ5KSk7CiAJZGV2aWNlX2luZm8gPSBsZTMyX3RvX2NwdShzYXNfZGV2aWNlX3BnMC5EZXZpY2VJbmZvKTsKIAogCS8qIHNhc19hZGRyZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jIGIvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYwppbmRleCAzNTAxMjkxLi43ZTQyM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMKQEAgLTM5OCw2ICszOTgsMTYgQEAKIAkvKiBpbml0IHBoeXMgKi8KIAltdnNfcGh5X2hhY2tzKG12aSk7CiAKKwkvKiBkaXNhYmxlIG5vbiBkYXRhIGZyYW1lIHJldHJ5ICovCisJdG1wID0gbXZzX2NyMzIobXZpLCBDTURfU0FTX0NUTDEpOworCWlmICgocmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWKSB8fAorCQkocmV2aXNpb24gPT0gVkFOSVJfQjBfUkVWKSB8fAorCQkocmV2aXNpb24gPT0gVkFOSVJfQzBfUkVWKSkgeworCQl0bXAgJj0gfjB4ZmZmZjsKKwkJdG1wIHw9IDB4MDA3ZjsKKwkJbXZzX2N3MzIobXZpLCBDTURfU0FTX0NUTDEsIHRtcCk7CisJfQorCiAJLyogc2V0IExFRCBibGluayB3aGVuIElPKi8KIAltdzMyKE1WU19QQV9WU1JfQUREUiwgVlNSX1BIWV9BQ1RfTEVEKTsKIAl0bXAgPSBtcjMyKE1WU19QQV9WU1JfUE9SVCk7CkBAIC01MDAsNiArNTEwLDI3IEBACiAJdG1wIHw9IENJTlRfUEhZX01BU0s7CiAJbXczMihNVlNfSU5UX01BU0ssIHRtcCk7CiAKKwl0bXAgPSBtdnNfY3IzMihtdmksIENNRF9MSU5LX1RJTUVSKTsKKwl0bXAgfD0gMHhGRkZGMDAwMDsKKwltdnNfY3czMihtdmksIENNRF9MSU5LX1RJTUVSLCB0bXApOworCisJLyogdHVuZSBTVFAgcGVyZm9ybWFuY2UgKi8KKwl0bXAgPSAweDAwM0YwMDNGOworCW12c19jdzMyKG12aSwgQ01EX1BMX1RJTUVSLCB0bXApOworCisJLyogVGhpcyBjYW4gaW1wcm92ZSBleHBhbmRlciBsYXJnZSBibG9jayBzaXplIHNlcSB3cml0ZSBwZXJmb3JtYW5jZSAqLworCXRtcCA9IG12c19jcjMyKG12aSwgQ01EX1BPUlRfTEFZRVJfVElNRVIxKTsKKwl0bXAgfD0gMHhGRkZGMDA3RjsKKwltdnNfY3czMihtdmksIENNRF9QT1JUX0xBWUVSX1RJTUVSMSwgdG1wKTsKKworCS8qIGNoYW5nZSB0aGUgY29ubmVjdGlvbiBvcGVuLWNsb3NlIGJlaGF2aW9yIChiaXQgOSkKKwkgKiBzZXQgYml0OCB0byAxIGZvciBwZXJmb3JtYW5jZSB0dW5pbmcgKi8KKwl0bXAgPSBtdnNfY3IzMihtdmksIENNRF9TTF9NT0RFMCk7CisJdG1wIHw9IDB4MDAwMDAzMDA7CisJLyogc2V0IGJpdDAgdG8gMCB0byBlbmFibGUgcmV0cnkgZm9yIG5vX2Rlc3QgcmVqZWN0IGNhc2UgKi8KKwl0bXAgJj0gMHhGRkZGRkZGRTsKKwltdnNfY3czMihtdmksIENNRF9TTF9NT0RFMCwgdG1wKTsKKwogCS8qIEVuYWJsZSBTUlMgaW50ZXJydXB0ICovCiAJbXczMihNVlNfSU5UX01BU0tfU1JTXzAsIDB4RkZGRik7CiAKQEAgLTgyMyw2ICs4NTQsMTAgQEAKIAkJcGh5LT5hdHRfZGV2X2luZm8gPSBQT1JUX0RFVl9TVFBfVFJHVCB8IDE7CiAJfQogCisJLyogZW5hYmxlIHNwaW4gdXAgYml0ICovCisJbXZzX3dyaXRlX3BvcnRfY2ZnX2FkZHIobXZpLCBpLCBQSFlSX1BIWV9TVEFUKTsKKwltdnNfd3JpdGVfcG9ydF9jZmdfZGF0YShtdmksIGksIDB4MDQpOworCiB9CiAKIHZvaWQgbXZzXzk0eHhfcGh5X3NldF9saW5rX3JhdGUoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfaWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oIGIvZHJpdmVycy9zY3NpL212c2FzL212X2RlZnMuaAppbmRleCBkZWM3Y2FkLi5mNTQ1MTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmgKQEAgLTM4Nyw2ICszODcsOCBAQAogCUNNRF9TTF9NT0RFMAkJPSAweDFCQywgLyogU0wgTW9kZSAwICovCiAJQ01EX1NMX01PREUxCQk9IDB4MUMwLCAvKiBTTCBNb2RlIDEgKi8KIAlDTURfUE5EX0ZJRk9fQ1RMMQk9IDB4MUM0LCAvKiBQZW5kaW5nIEZJRk8gQ29udHJvbCAxICovCisJQ01EX1BPUlRfTEFZRVJfVElNRVIxCT0gMHgxRTAsIC8qIFBvcnQgTGF5ZXIgVGltZXIgMSAqLworCUNNRF9MSU5LX1RJTUVSCQk9IDB4MUU0LCAvKiBMaW5rIFRpbWVyICovCiB9OwogCiBlbnVtIG12c19pbmZvX2ZsYWdzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jCmluZGV4IDRlOWFmNjYuLjZmNTg5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYwpAQCAtNTksNyArNTksNyBAQAogCS5uYW1lCQkJPSBEUlZfTkFNRSwKIAkucXVldWVjb21tYW5kCQk9IHNhc19xdWV1ZWNvbW1hbmQsCiAJLnRhcmdldF9hbGxvYwkJPSBzYXNfdGFyZ2V0X2FsbG9jLAotCS5zbGF2ZV9jb25maWd1cmUJPSBtdnNfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9jb25maWd1cmUJPSBzYXNfc2xhdmVfY29uZmlndXJlLAogCS5zbGF2ZV9kZXN0cm95CQk9IHNhc19zbGF2ZV9kZXN0cm95LAogCS5zY2FuX2ZpbmlzaGVkCQk9IG12c19zY2FuX2ZpbmlzaGVkLAogCS5zY2FuX3N0YXJ0CQk9IG12c19zY2FuX3N0YXJ0LApAQCAtNzQsNyArNzQsNyBAQAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBzYXNfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCiAJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gc2FzX2VoX2J1c19yZXNldF9oYW5kbGVyLAotCS5zbGF2ZV9hbGxvYwkJPSBtdnNfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2FsbG9jCQk9IHNhc19zbGF2ZV9hbGxvYywKIAkudGFyZ2V0X2Rlc3Ryb3kJCT0gc2FzX3RhcmdldF9kZXN0cm95LAogCS5pb2N0bAkJCT0gc2FzX2lvY3RsLAogCS5zaG9zdF9hdHRycwkJPSBtdnN0X2hvc3RfYXR0cnMsCkBAIC03MDcsNiArNzA3LDE1IEBACiAJeyBQQ0lfVkRFVklDRShUVEksIDB4Mjc2MCksIGNoaXBfOTQ4MCB9LAogCXsKIAkJLnZlbmRvcgkJPSAweDFiNGIsCisJCS5kZXZpY2UJCT0gMHg5NDgwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IDB4OTQ4MCwKKwkJLmNsYXNzCQk9IDAsCisJCS5jbGFzc19tYXNrCT0gMCwKKwkJLmRyaXZlcl9kYXRhCT0gY2hpcF85NDgwLAorCX0sCisJeworCQkudmVuZG9yCQk9IDB4MWI0YiwKIAkJLmRldmljZQkJPSAweDk0NDUsCiAJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlCT0gMHg5NDgwLApAQCAtNzIzLDYgKzczMiwxNiBAQAogCQkuY2xhc3NfbWFzawk9IDAsCiAJCS5kcml2ZXJfZGF0YQk9IGNoaXBfOTQ4NSwKIAl9LAorCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwMjEpLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMyAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwMjIpLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDQwKSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTA0MSksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwNDIpLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDQzKSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTA0NCksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLworCXsgUENJX1ZERVZJQ0UoT0NaLCAweDEwODApLCBjaGlwXzk0ODV9LCAvKiBPQ1ogUmV2b0RyaXZlMy96RHJpdmVSNCAoZXhhY3QgbW9kZWwgdW5rbm93bikgKi8KKwl7IFBDSV9WREVWSUNFKE9DWiwgMHgxMDgzKSwgY2hpcF85NDg1fSwgLyogT0NaIFJldm9Ecml2ZTMvekRyaXZlUjQgKGV4YWN0IG1vZGVsIHVua25vd24pICovCisJeyBQQ0lfVkRFVklDRShPQ1osIDB4MTA4NCksIGNoaXBfOTQ4NX0sIC8qIE9DWiBSZXZvRHJpdmUzL3pEcml2ZVI0IChleGFjdCBtb2RlbCB1bmtub3duKSAqLwogCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCmluZGV4IDQ5NThmZWYuLmE0ODg0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlicmVhazsKIAljYXNlIFBIWV9GVU5DX1JFTEVBU0VfU1BJTlVQX0hPTEQ6CiAJZGVmYXVsdDoKLQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJcmMgPSAtRU5PU1lTOwogCX0KIAltc2xlZXAoMjAwKTsKIAlyZXR1cm4gcmM7CkBAIC0yNjUsNiArMjY1LDEyIEBACiAJCWlkLT5kZXZfdHlwZSA9IHBoeS0+aWRlbnRpZnkuZGV2aWNlX3R5cGU7CiAJCWlkLT5pbml0aWF0b3JfYml0cyA9IFNBU19QUk9UT0NPTF9BTEw7CiAJCWlkLT50YXJnZXRfYml0cyA9IHBoeS0+aWRlbnRpZnkudGFyZ2V0X3BvcnRfcHJvdG9jb2xzOworCisJCS8qIGRpcmVjdCBhdHRhY2hlZCBTQVMgZGV2aWNlICovCisJCWlmIChwaHktPmF0dF9kZXZfaW5mbyAmIFBPUlRfU1NQX1RSR1RfTUFTSykgeworCQkJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfUEhZX1NUQVQpOworCQkJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfZGF0YShtdmksIGksIDB4MDApOworCQl9CiAJfSBlbHNlIGlmIChwaHktPnBoeV90eXBlICYgUE9SVF9UWVBFX1NBVEEpIHsKIAkJLypOb3RoaW5nKi8KIAl9CkBAIC0yNzYsMzYgKzI4Miw2IEBACiAJCQkJICAgUE9SVEVfQllURVNfRE1BRUQpOwogfQogCi1pbnQgbXZzX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYpCi17Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzY3NpX2Rldik7Ci0JaWYgKGRldl9pc19zYXRhKGRldikpIHsKLQkJLyogV2UgZG9uJ3QgbmVlZCB0byByZXNjYW4gdGFyZ2V0cwotCQkgKiBpZiBSRVBPUlRfTFVOUyByZXF1ZXN0IGlzIGZhaWxlZAotCQkgKi8KLQkJaWYgKHNjc2lfZGV2LT5sdW4gPiAwKQotCQkJcmV0dXJuIC1FTlhJTzsKLQkJc2NzaV9kZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAxOwotCX0KLQotCXJldHVybiBzYXNfc2xhdmVfYWxsb2Moc2NzaV9kZXYpOwotfQotCi1pbnQgbXZzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCi17Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzZGV2KTsKLQlpbnQgcmV0ID0gc2FzX3NsYXZlX2NvbmZpZ3VyZShzZGV2KTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JaWYgKCFkZXZfaXNfc2F0YShkZXYpKSB7Ci0JCXNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwKLQkJCU1WU19RVUVVRV9TSVpFLAotCQkJU0NTSV9RREVQVEhfREVGQVVMVCk7Ci0JfQotCXJldHVybiAwOwotfQotCiB2b2lkIG12c19zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewogCWludCBpLCBqOwpAQCAtNDI2LDcgKzQwMiw3IEBACiAJLyogZ2VuZXJhdGUgb3BlbiBhZGRyZXNzIGZyYW1lIGhkciAoZmlyc3QgMTIgYnl0ZXMpICovCiAJLyogaW5pdGlhdG9yLCBTTVAsIGZ0eXBlIDFoICovCiAJYnVmX29hZlswXSA9ICgxIDw8IDcpIHwgKFBST1RPQ09MX1NNUCA8PCA0KSB8IDB4MDE7Ci0JYnVmX29hZlsxXSA9IGRldi0+bGlua3JhdGUgJiAweGY7CisJYnVmX29hZlsxXSA9IG1pbihzYXNfcG9ydC0+bGlua3JhdGUsIGRldi0+bGlua3JhdGUpICYgMHhmOwogCSoodTE2ICopKGJ1Zl9vYWYgKyAyKSA9IDB4RkZGRjsJCS8qIFNBUyBTUEVDICovCiAJbWVtY3B5KGJ1Zl9vYWYgKyA0LCBkZXYtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKIApAQCAtNTcxLDcgKzU0Nyw3IEBACiAJLyogZ2VuZXJhdGUgb3BlbiBhZGRyZXNzIGZyYW1lIGhkciAoZmlyc3QgMTIgYnl0ZXMpICovCiAJLyogaW5pdGlhdG9yLCBTVFAsIGZ0eXBlIDFoICovCiAJYnVmX29hZlswXSA9ICgxIDw8IDcpIHwgKFBST1RPQ09MX1NUUCA8PCA0KSB8IDB4MTsKLQlidWZfb2FmWzFdID0gZGV2LT5saW5rcmF0ZSAmIDB4ZjsKKwlidWZfb2FmWzFdID0gbWluKHNhc19wb3J0LT5saW5rcmF0ZSwgZGV2LT5saW5rcmF0ZSkgJiAweGY7CiAJKih1MTYgKikoYnVmX29hZiArIDIpID0gY3B1X3RvX2JlMTYobXZpX2Rldi0+ZGV2aWNlX2lkICsgMSk7CiAJbWVtY3B5KGJ1Zl9vYWYgKyA0LCBkZXYtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKIApAQCAtNjc5LDcgKzY1NSw3IEBACiAJLyogZ2VuZXJhdGUgb3BlbiBhZGRyZXNzIGZyYW1lIGhkciAoZmlyc3QgMTIgYnl0ZXMpICovCiAJLyogaW5pdGlhdG9yLCBTU1AsIGZ0eXBlIDFoICovCiAJYnVmX29hZlswXSA9ICgxIDw8IDcpIHwgKFBST1RPQ09MX1NTUCA8PCA0KSB8IDB4MTsKLQlidWZfb2FmWzFdID0gZGV2LT5saW5rcmF0ZSAmIDB4ZjsKKwlidWZfb2FmWzFdID0gbWluKHNhc19wb3J0LT5saW5rcmF0ZSwgZGV2LT5saW5rcmF0ZSkgJiAweGY7CiAJKih1MTYgKikoYnVmX29hZiArIDIpID0gY3B1X3RvX2JlMTYobXZpX2Rldi0+ZGV2aWNlX2lkICsgMSk7CiAJbWVtY3B5KGJ1Zl9vYWYgKyA0LCBkZXYtPnNhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKIApAQCAtMTI0MSw2ICsxMjE3LDEyIEBACiAJCXBvcnQtPndpZGVfcG9ydF9waHltYXAgPSBzYXNfcG9ydC0+cGh5X21hc2s7CiAJCW12X3ByaW50aygic2V0IHdpZGUgcG9ydCBwaHkgbWFwICV4XG4iLCBzYXNfcG9ydC0+cGh5X21hc2spOwogCQltdnNfdXBkYXRlX3dpZGVwb3J0KG12aSwgc2FzX3BoeS0+aWQpOworCisJCS8qIGRpcmVjdCBhdHRhY2hlZCBTQVMgZGV2aWNlICovCisJCWlmIChwaHktPmF0dF9kZXZfaW5mbyAmIFBPUlRfU1NQX1RSR1RfTUFTSykgeworCQkJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfUEhZX1NUQVQpOworCQkJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfZGF0YShtdmksIGksIDB4MDQpOworCQl9CiAJfQogCWlmIChsb2NrKQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdmktPmxvY2ssIGZsYWdzKTsKQEAgLTEzODcsMjggKzEzNjksNiBAQAogCW12c19kZXZfZ29uZV9ub3RpZnkoZGV2KTsKIH0KIAotc3RhdGljICBzdHJ1Y3Qgc2FzX3Rhc2sgKm12c19hbGxvY190YXNrKHZvaWQpCi17Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhc190YXNrKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAodGFzaykgewotCQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7Ci0JCXNwaW5fbG9ja19pbml0KCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOwotCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzID0gU0FTX1RBU0tfU1RBVEVfUEVORElORzsKLQkJaW5pdF90aW1lcigmdGFzay0+dGltZXIpOwotCQlpbml0X2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOwotCX0KLQlyZXR1cm4gdGFzazsKLX0KLQotc3RhdGljICB2b2lkIG12c19mcmVlX3Rhc2soc3RydWN0IHNhc190YXNrICp0YXNrKQotewotCWlmICh0YXNrKSB7Ci0JCUJVR19PTighbGlzdF9lbXB0eSgmdGFzay0+bGlzdCkpOwotCQlrZnJlZSh0YXNrKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIG12c190YXNrX2RvbmUoc3RydWN0IHNhc190YXNrICp0YXNrKQogewogCWlmICghZGVsX3RpbWVyKCZ0YXNrLT50aW1lcikpCkBAIC0xNDMyLDcgKzEzOTIsNyBAQAogCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IE5VTEw7CiAKIAlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7Ci0JCXRhc2sgPSBtdnNfYWxsb2NfdGFzaygpOworCQl0YXNrID0gc2FzX2FsbG9jX3Rhc2soR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFzaykKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDkwLDE1ICsxNDUwLDE0IEBACiAJCQkJICAgIFNBU19BRERSKGRldi0+c2FzX2FkZHIpLAogCQkJCSAgICB0YXNrLT50YXNrX3N0YXR1cy5yZXNwLAogCQkJCSAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKLQkJCW12c19mcmVlX3Rhc2sodGFzayk7CisJCQlzYXNfZnJlZV90YXNrKHRhc2spOwogCQkJdGFzayA9IE5VTEw7CiAKIAkJfQogCX0KIGV4X2VycjoKIAlCVUdfT04ocmV0cnkgPT0gMyAmJiB0YXNrICE9IE5VTEwpOwotCWlmICh0YXNrICE9IE5VTEwpCi0JCW12c19mcmVlX3Rhc2sodGFzayk7CisJc2FzX2ZyZWVfdGFzayh0YXNrKTsKIAlyZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmggYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmgKaW5kZXggNDRiNDc0NS4uYzA0YTRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaApAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgIm12X2RlZnMuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkJIm12c2FzIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuOC4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuOC4xNiIKICNkZWZpbmUgTVZTX0lEX05PVF9NQVBQRUQJMHg3ZgogI2RlZmluZSBXSURFX1BPUlRfTUFYX1BIWQkJNAogI2RlZmluZSBtdl9wcmludGsoZm10LCBhcmcgLi4uKQlcCkBAIC00NTgsOCArNDU4LDYgQEAKIAkJCXZvaWQgKmZ1bmNkYXRhKTsKIHZvaWQgX19kZXZpbml0IG12c19zZXRfc2FzX2FkZHIoc3RydWN0IG12c19pbmZvICptdmksIGludCBwb3J0X2lkLAogCQkJCXUzMiBvZmZfbG8sIHUzMiBvZmZfaGksIHU2NCBzYXNfYWRkcik7Ci1pbnQgbXZzX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYpOwotaW50IG12c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKIHZvaWQgbXZzX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogaW50IG12c19zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpOwogaW50IG12c19xdWV1ZV9jb21tYW5kKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgY29uc3QgaW50IG51bSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnVtaS5jIGIvZHJpdmVycy9zY3NpL212dW1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjZjFkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9tdnVtaS5jCkBAIC0wLDAgKzEsMjAxOCBAQAorLyoKKyAqIE1hcnZlbGwgVU1JIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDExIE1hcnZlbGwuIDxqeWxpQG1hcnZlbGwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIm12dW1pLmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoImp5bGlAbWFydmVsbC5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBVTUkgRHJpdmVyIik7CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtdnVtaV9wY2lfdGFibGUpID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTExfMiwgUENJX0RFVklDRV9JRF9NQVJWRUxMX01WOTE0MykgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG12dW1pX3BjaV90YWJsZSk7CisKK3N0YXRpYyB2b2lkIHRhZ19pbml0KHN0cnVjdCBtdnVtaV90YWcgKnN0LCB1bnNpZ25lZCBzaG9ydCBzaXplKQoreworCXVuc2lnbmVkIHNob3J0IGk7CisJQlVHX09OKHNpemUgIT0gc3QtPnNpemUpOworCXN0LT50b3AgPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXN0LT5zdGFja1tpXSA9IHNpemUgLSAxIC0gaTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHRhZ19nZXRfb25lKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHN0cnVjdCBtdnVtaV90YWcgKnN0KQoreworCUJVR19PTihzdC0+dG9wIDw9IDApOworCXJldHVybiBzdC0+c3RhY2tbLS1zdC0+dG9wXTsKK30KKworc3RhdGljIHZvaWQgdGFnX3JlbGVhc2Vfb25lKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHN0cnVjdCBtdnVtaV90YWcgKnN0LAorCQkJCQkJCXVuc2lnbmVkIHNob3J0IHRhZykKK3sKKwlCVUdfT04oc3QtPnRvcCA+PSBzdC0+c2l6ZSk7CisJc3QtPnN0YWNrW3N0LT50b3ArK10gPSB0YWc7Cit9CisKK3N0YXRpYyBib29sIHRhZ19pc19lbXB0eShzdHJ1Y3QgbXZ1bWlfdGFnICpzdCkKK3sKKwlpZiAoc3QtPnRvcCA9PSAwKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV91bm1hcF9wY2lfYWRkcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICoqYWRkcl9hcnJheSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkFTRV9BRERSRVNTOyBpKyspCisJCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgaSkgJiBJT1JFU09VUkNFX01FTSkgJiYKKwkJCQkJCQkJYWRkcl9hcnJheVtpXSkKKwkJCXBjaV9pb3VubWFwKGRldiwgYWRkcl9hcnJheVtpXSk7Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfbWFwX3BjaV9hZGRyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKiphZGRyX2FycmF5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9CQVNFX0FERFJFU1M7IGkrKykgeworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgaSkgJiBJT1JFU09VUkNFX01FTSkgeworCQkJYWRkcl9hcnJheVtpXSA9IHBjaV9pb21hcChkZXYsIGksIDApOworCQkJaWYgKCFhZGRyX2FycmF5W2ldKSB7CisJCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIEJhclslZF1cbiIsCisJCQkJCQkJCQlpKTsKKwkJCQltdnVtaV91bm1hcF9wY2lfYWRkcihkZXYsIGFkZHJfYXJyYXkpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9IGVsc2UKKwkJCWFkZHJfYXJyYXlbaV0gPSBOVUxMOworCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiQmFyICVkIDogJXAuXG4iLCBpLCBhZGRyX2FycmF5W2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBtdnVtaV9yZXMgKm12dW1pX2FsbG9jX21lbV9yZXNvdXJjZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCWVudW0gcmVzb3VyY2VfdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfcmVzICpyZXMgPSBremFsbG9jKHNpemVvZigqcmVzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzb3VjZSBtYW5hZ2VyLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUkVTT1VSQ0VfQ0FDSEVEX01FTU9SWToKKwkJcmVzLT52aXJ0X2FkZHIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXJlcy0+dmlydF9hZGRyKSB7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnksc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CisJCQlrZnJlZShyZXMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJFU09VUkNFX1VOQ0FDSEVEX01FTU9SWToKKwkJc2l6ZSA9IHJvdW5kX3VwKHNpemUsIDgpOworCQlyZXMtPnZpcnRfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG1oYmEtPnBkZXYsIHNpemUsCisJCQkJCQkJJnJlcy0+YnVzX2FkZHIpOworCQlpZiAoIXJlcy0+dmlydF9hZGRyKSB7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsCisJCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgY29uc2lzdGVudCBtZW0sIgorCQkJCQkJCSJzaXplID0gJWQuXG4iLCBzaXplKTsKKwkJCWtmcmVlKHJlcyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQltZW1zZXQocmVzLT52aXJ0X2FkZHIsIDAsIHNpemUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInVua25vd24gcmVzb3VyY2UgdHlwZSAlZC5cbiIsIHR5cGUpOworCQlrZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXMtPnR5cGUgPSB0eXBlOworCXJlcy0+c2l6ZSA9IHNpemU7CisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+ZW50cnkpOworCWxpc3RfYWRkX3RhaWwoJnJlcy0+ZW50cnksICZtaGJhLT5yZXNfbGlzdCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9yZWxlYXNlX21lbV9yZXNvdXJjZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBtdnVtaV9yZXMgKnJlcywgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIHRtcCwgJm1oYmEtPnJlc19saXN0LCBlbnRyeSkgeworCQlzd2l0Y2ggKHJlcy0+dHlwZSkgeworCQljYXNlIFJFU09VUkNFX1VOQ0FDSEVEX01FTU9SWToKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobWhiYS0+cGRldiwgcmVzLT5zaXplLAorCQkJCQkJcmVzLT52aXJ0X2FkZHIsIHJlcy0+YnVzX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgUkVTT1VSQ0VfQ0FDSEVEX01FTU9SWToKKwkJCWtmcmVlKHJlcy0+dmlydF9hZGRyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJ1bmtub3duIHJlc291cmNlIHR5cGUgJWRcbiIsIHJlcy0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlsaXN0X2RlbCgmcmVzLT5lbnRyeSk7CisJCWtmcmVlKHJlcyk7CisJfQorCW1oYmEtPmZ3X2ZsYWcgJj0gfk1WVU1JX0ZXX0FMTE9DOworfQorCisvKioKKyAqIG12dW1pX21ha2Vfc2dsIC0JUHJlcGFyZXMgIFNHTAorICogQG1oYmE6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEBzY21kOgkJU0NTSSBjb21tYW5kIGZyb20gdGhlIG1pZC1sYXllcgorICogQHNnbF9wOgkJU0dMIHRvIGJlIGZpbGxlZCBpbgorICogQHNnX2NvdW50CQlyZXR1cm4gdGhlIG51bWJlciBvZiBTRyBlbGVtZW50cworICoKKyAqIElmIHN1Y2Nlc3NmdWwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLiBvdGhlcndpc2UsIGl0IHJldHVybnMgLTEuCisgKi8KK3N0YXRpYyBpbnQgbXZ1bWlfbWFrZV9zZ2woc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IHNjc2lfY21uZCAqc2NtZCwKKwkJCQkJdm9pZCAqc2dsX3AsIHVuc2lnbmVkIGNoYXIgKnNnX2NvdW50KQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IG12dW1pX3NnbCAqbV9zZyA9IChzdHJ1Y3QgbXZ1bWlfc2dsICopIHNnbF9wOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBzZ251bSA9IHNjc2lfc2dfY291bnQoc2NtZCk7CisJZG1hX2FkZHJfdCBidXNhZGRyOworCisJaWYgKHNnbnVtKSB7CisJCXNnID0gc2NzaV9zZ2xpc3Qoc2NtZCk7CisJCSpzZ19jb3VudCA9IHBjaV9tYXBfc2cobWhiYS0+cGRldiwgc2csIHNnbnVtLAorCQkJCShpbnQpIHNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJaWYgKCpzZ19jb3VudCA+IG1oYmEtPm1heF9zZ2UpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInNnIGNvdW50WzB4JXhdIGlzIGJpZ2dlciAiCisJCQkJCQkidGhhbiBtYXggc2dbMHgleF0uXG4iLAorCQkJCQkJKnNnX2NvdW50LCBtaGJhLT5tYXhfc2dlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgKnNnX2NvdW50OyBpKyspIHsKKwkJCWJ1c2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmc2dbaV0pOworCQkJbV9zZy0+YmFzZWFkZHJfbCA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoYnVzYWRkcikpOworCQkJbV9zZy0+YmFzZWFkZHJfaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoYnVzYWRkcikpOworCQkJbV9zZy0+ZmxhZ3MgPSAwOworCQkJbV9zZy0+c2l6ZSA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oJnNnW2ldKSk7CisJCQlpZiAoKGkgKyAxKSA9PSAqc2dfY291bnQpCisJCQkJbV9zZy0+ZmxhZ3MgfD0gU0dEX0VPVDsKKworCQkJbV9zZysrOworCQl9CisJfSBlbHNlIHsKKwkJc2NtZC0+U0NwLmRtYV9oYW5kbGUgPSBzY3NpX2J1ZmZsZW4oc2NtZCkgPworCQkJcGNpX21hcF9zaW5nbGUobWhiYS0+cGRldiwgc2NzaV9zZ2xpc3Qoc2NtZCksCisJCQkJc2NzaV9idWZmbGVuKHNjbWQpLAorCQkJCShpbnQpIHNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKQorCQkJOiAwOworCQlidXNhZGRyID0gc2NtZC0+U0NwLmRtYV9oYW5kbGU7CisJCW1fc2ctPmJhc2VhZGRyX2wgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGJ1c2FkZHIpKTsKKwkJbV9zZy0+YmFzZWFkZHJfaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoYnVzYWRkcikpOworCQltX3NnLT5mbGFncyA9IFNHRF9FT1Q7CisJCW1fc2ctPnNpemUgPSBjcHVfdG9fbGUzMihzY3NpX2J1ZmZsZW4oc2NtZCkpOworCQkqc2dfY291bnQgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12dW1pX2ludGVybmFsX2NtZF9zZ2woc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgc3RydWN0IG12dW1pX2NtZCAqY21kLAorCQkJCQkJCXVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBtdnVtaV9zZ2wgKm1fc2c7CisJdm9pZCAqdmlydF9hZGRyOworCWRtYV9hZGRyX3QgcGh5X2FkZHI7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXZpcnRfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG1oYmEtPnBkZXYsIHNpemUsICZwaHlfYWRkcik7CisJaWYgKCF2aXJ0X2FkZHIpCisJCXJldHVybiAtMTsKKworCW1lbXNldCh2aXJ0X2FkZHIsIDAsIHNpemUpOworCisJbV9zZyA9IChzdHJ1Y3QgbXZ1bWlfc2dsICopICZjbWQtPmZyYW1lLT5wYXlsb2FkWzBdOworCWNtZC0+ZnJhbWUtPnNnX2NvdW50cyA9IDE7CisJY21kLT5kYXRhX2J1ZiA9IHZpcnRfYWRkcjsKKworCW1fc2ctPmJhc2VhZGRyX2wgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHBoeV9hZGRyKSk7CisJbV9zZy0+YmFzZWFkZHJfaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMocGh5X2FkZHIpKTsKKwltX3NnLT5mbGFncyA9IFNHRF9FT1Q7CisJbV9zZy0+c2l6ZSA9IGNwdV90b19sZTMyKHNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXZ1bWlfY21kICptdnVtaV9jcmVhdGVfaW50ZXJuYWxfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJdW5zaWduZWQgaW50IGJ1Zl9zaXplKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGEgaW50ZXJuYWwgY21kXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUlOSVRfTElTVF9IRUFEKCZjbWQtPnF1ZXVlX3BvaW50ZXIpOworCisJY21kLT5mcmFtZSA9IGt6YWxsb2MobWhiYS0+aWJfbWF4X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghY21kLT5mcmFtZSkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBGVyIKKwkJCSIgZnJhbWUsc2l6ZSA9ICVkLlxuIiwgbWhiYS0+aWJfbWF4X3NpemUpOworCQlrZnJlZShjbWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoYnVmX3NpemUpIHsKKwkJaWYgKG12dW1pX2ludGVybmFsX2NtZF9zZ2wobWhiYSwgY21kLCBidWZfc2l6ZSkpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkiCisJCQkJCQkiIGZvciBpbnRlcm5hbCBmcmFtZVxuIik7CisJCQlrZnJlZShjbWQtPmZyYW1lKTsKKwkJCWtmcmVlKGNtZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZQorCQljbWQtPmZyYW1lLT5zZ19jb3VudHMgPSAwOworCisJcmV0dXJuIGNtZDsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfZGVsZXRlX2ludGVybmFsX2NtZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCQkJc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCXN0cnVjdCBtdnVtaV9zZ2wgKm1fc2c7CisJdW5zaWduZWQgaW50IHNpemU7CisJZG1hX2FkZHJfdCBwaHlfYWRkcjsKKworCWlmIChjbWQgJiYgY21kLT5mcmFtZSkgeworCQlpZiAoY21kLT5mcmFtZS0+c2dfY291bnRzKSB7CisJCQltX3NnID0gKHN0cnVjdCBtdnVtaV9zZ2wgKikgJmNtZC0+ZnJhbWUtPnBheWxvYWRbMF07CisJCQlzaXplID0gbV9zZy0+c2l6ZTsKKworCQkJcGh5X2FkZHIgPSAoZG1hX2FkZHJfdCkgbV9zZy0+YmFzZWFkZHJfbCB8CisJCQkJKGRtYV9hZGRyX3QpICgobV9zZy0+YmFzZWFkZHJfaCA8PCAxNikgPDwgMTYpOworCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG1oYmEtPnBkZXYsIHNpemUsIGNtZC0+ZGF0YV9idWYsCisJCQkJCQkJCXBoeV9hZGRyKTsKKwkJfQorCQlrZnJlZShjbWQtPmZyYW1lKTsKKwkJa2ZyZWUoY21kKTsKKwl9Cit9CisKKy8qKgorICogbXZ1bWlfZ2V0X2NtZCAtCUdldCBhIGNvbW1hbmQgZnJvbSB0aGUgZnJlZSBwb29sCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICoKKyAqIFJldHVybnMgYSBmcmVlIGNvbW1hbmQgZnJvbSB0aGUgcG9vbAorICovCitzdGF0aWMgc3RydWN0IG12dW1pX2NtZCAqbXZ1bWlfZ2V0X2NtZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZCA9IE5VTEw7CisKKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZtaGJhLT5jbWRfcG9vbCkpKSB7CisJCWNtZCA9IGxpc3RfZW50cnkoKCZtaGJhLT5jbWRfcG9vbCktPm5leHQsCisJCQkJc3RydWN0IG12dW1pX2NtZCwgcXVldWVfcG9pbnRlcik7CisJCWxpc3RfZGVsX2luaXQoJmNtZC0+cXVldWVfcG9pbnRlcik7CisJfSBlbHNlCisJCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsICJjb21tYW5kIHBvb2wgaXMgZW1wdHkhXG4iKTsKKworCXJldHVybiBjbWQ7Cit9CisKKy8qKgorICogbXZ1bWlfcmV0dXJuX2NtZCAtCVJldHVybiBhIGNtZCB0byBmcmVlIGNvbW1hbmQgcG9vbAorICogQG1oYmE6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEBjbWQ6CQlDb21tYW5kIHBhY2tldCB0byBiZSByZXR1cm5lZCB0byBmcmVlIGNvbW1hbmQgcG9vbAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbXZ1bWlfcmV0dXJuX2NtZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCQkJc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCWNtZC0+c2NtZCA9IE5VTEw7CisJbGlzdF9hZGRfdGFpbCgmY21kLT5xdWV1ZV9wb2ludGVyLCAmbWhiYS0+Y21kX3Bvb2wpOworfQorCisvKioKKyAqIG12dW1pX2ZyZWVfY21kcyAtCUZyZWUgYWxsIHRoZSBjbWRzIGluIHRoZSBmcmVlIGNtZCBwb29sCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBtdnVtaV9mcmVlX2NtZHMoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1oYmEtPmNtZF9wb29sKSkgeworCQljbWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtaGJhLT5jbWRfcG9vbCwgc3RydWN0IG12dW1pX2NtZCwKKwkJCQkJCQlxdWV1ZV9wb2ludGVyKTsKKwkJbGlzdF9kZWwoJmNtZC0+cXVldWVfcG9pbnRlcik7CisJCWtmcmVlKGNtZC0+ZnJhbWUpOworCQlrZnJlZShjbWQpOworCX0KK30KKworLyoqCisgKiBtdnVtaV9hbGxvY19jbWRzIC0JQWxsb2NhdGVzIHRoZSBjb21tYW5kIHBhY2tldHMKKyAqIEBtaGJhOgkJQWRhcHRlciBzb2Z0IHN0YXRlCisgKgorICovCitzdGF0aWMgaW50IG12dW1pX2FsbG9jX2NtZHMoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWhiYS0+bWF4X2lvOyBpKyspIHsKKwkJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNtZCkKKwkJCWdvdG8gZXJyX2V4aXQ7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmNtZC0+cXVldWVfcG9pbnRlcik7CisJCWxpc3RfYWRkX3RhaWwoJmNtZC0+cXVldWVfcG9pbnRlciwgJm1oYmEtPmNtZF9wb29sKTsKKwkJY21kLT5mcmFtZSA9IGt6YWxsb2MobWhiYS0+aWJfbWF4X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNtZC0+ZnJhbWUpCisJCQlnb3RvIGVycl9leGl0OworCX0KKwlyZXR1cm4gMDsKKworZXJyX2V4aXQ6CisJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNtZFsweCV4XS5cbiIsIGkpOworCXdoaWxlICghbGlzdF9lbXB0eSgmbWhiYS0+Y21kX3Bvb2wpKSB7CisJCWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJm1oYmEtPmNtZF9wb29sLCBzdHJ1Y3QgbXZ1bWlfY21kLAorCQkJCQkJcXVldWVfcG9pbnRlcik7CisJCWxpc3RfZGVsKCZjbWQtPnF1ZXVlX3BvaW50ZXIpOworCQlrZnJlZShjbWQtPmZyYW1lKTsKKwkJa2ZyZWUoY21kKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfZ2V0X2liX2xpc3RfZW50cnkoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgdm9pZCAqKmliX2VudHJ5KQoreworCXVuc2lnbmVkIGludCBpYl9ycF9yZWcsIGN1cl9pYl9lbnRyeTsKKworCWlmIChhdG9taWNfcmVhZCgmbWhiYS0+Zndfb3V0c3RhbmRpbmcpID49IG1oYmEtPm1heF9pbykgeworCQlkZXZfd2FybigmbWhiYS0+cGRldi0+ZGV2LCAiZmlybXdhcmUgaW8gb3ZlcmZsb3cuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpYl9ycF9yZWcgPSBpb3JlYWQzMihtaGJhLT5tbWlvICsgQ0xBX0lOQl9SRUFEX1BPSU5URVIpOworCisJaWYgKHVubGlrZWx5KCgoaWJfcnBfcmVnICYgQ0xfU0xPVF9OVU1fTUFTSykgPT0KKwkJCShtaGJhLT5pYl9jdXJfc2xvdCAmIENMX1NMT1RfTlVNX01BU0spKSAmJgorCQkJKChpYl9ycF9yZWcgJiBDTF9QT0lOVEVSX1RPR0dMRSkgIT0KKwkJCShtaGJhLT5pYl9jdXJfc2xvdCAmIENMX1BPSU5URVJfVE9HR0xFKSkpKSB7CisJCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsICJubyBmcmVlIHNsb3QgdG8gdXNlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljdXJfaWJfZW50cnkgPSBtaGJhLT5pYl9jdXJfc2xvdCAmIENMX1NMT1RfTlVNX01BU0s7CisJY3VyX2liX2VudHJ5Kys7CisJaWYgKGN1cl9pYl9lbnRyeSA+PSBtaGJhLT5saXN0X251bV9pbykgeworCQljdXJfaWJfZW50cnkgLT0gbWhiYS0+bGlzdF9udW1faW87CisJCW1oYmEtPmliX2N1cl9zbG90IF49IENMX1BPSU5URVJfVE9HR0xFOworCX0KKwltaGJhLT5pYl9jdXJfc2xvdCAmPSB+Q0xfU0xPVF9OVU1fTUFTSzsKKwltaGJhLT5pYl9jdXJfc2xvdCB8PSAoY3VyX2liX2VudHJ5ICYgQ0xfU0xPVF9OVU1fTUFTSyk7CisJKmliX2VudHJ5ID0gbWhiYS0+aWJfbGlzdCArIGN1cl9pYl9lbnRyeSAqIG1oYmEtPmliX21heF9zaXplOworCWF0b21pY19pbmMoJm1oYmEtPmZ3X291dHN0YW5kaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9zZW5kX2liX2xpc3RfZW50cnkoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlpb3dyaXRlMzIoMHhmZmYsIG1oYmEtPmliX3NoYWRvdyk7CisJaW93cml0ZTMyKG1oYmEtPmliX2N1cl9zbG90LCBtaGJhLT5tbWlvICsgQ0xBX0lOQl9XUklURV9QT0lOVEVSKTsKK30KKworc3RhdGljIGNoYXIgbXZ1bWlfY2hlY2tfb2JfZnJhbWUoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJdW5zaWduZWQgaW50IGN1cl9vYmYsIHN0cnVjdCBtdnVtaV9yc3BfZnJhbWUgKnBfb3V0Yl9mcmFtZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCB0YWcsIHJlcXVlc3RfaWQ7CisKKwl1ZGVsYXkoMSk7CisJcF9vdXRiX2ZyYW1lID0gbWhiYS0+b2JfbGlzdCArIGN1cl9vYmYgKiBtaGJhLT5vYl9tYXhfc2l6ZTsKKwlyZXF1ZXN0X2lkID0gcF9vdXRiX2ZyYW1lLT5yZXF1ZXN0X2lkOworCXRhZyA9IHBfb3V0Yl9mcmFtZS0+dGFnOworCWlmICh0YWcgPiBtaGJhLT50YWdfcG9vbC5zaXplKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgIm9iIGZyYW1lIGRhdGEgZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtaGJhLT50YWdfY21kW3RhZ10gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJ0YWdbMHgleF0gd2l0aCBOTyBjb21tYW5kXG4iLCB0YWcpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChtaGJhLT50YWdfY21kW3RhZ10tPnJlcXVlc3RfaWQgIT0gcmVxdWVzdF9pZCAmJgorCQkJCQkJbWhiYS0+cmVxdWVzdF9pZF9lbmFibGVkKSB7CisJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJyZXF1ZXN0IElEIGZyb20gRlc6MHgleCwiCisJCQkJCSJjbWQgcmVxdWVzdCBJRDoweCV4XG4iLCByZXF1ZXN0X2lkLAorCQkJCQltaGJhLT50YWdfY21kW3RhZ10tPnJlcXVlc3RfaWQpOworCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9yZWNlaXZlX29iX2xpc3RfZW50cnkoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwl1bnNpZ25lZCBpbnQgb2Jfd3JpdGVfcmVnLCBvYl93cml0ZV9zaGFkb3dfcmVnOworCXVuc2lnbmVkIGludCBjdXJfb2JmLCBhc3NpZ25fb2JmX2VuZCwgaTsKKwlzdHJ1Y3QgbXZ1bWlfb2JfZGF0YSAqb2JfZGF0YTsKKwlzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lICpwX291dGJfZnJhbWU7CisKKwlkbyB7CisJCW9iX3dyaXRlX3JlZyA9IGlvcmVhZDMyKG1oYmEtPm1taW8gKyBDTEFfT1VUQl9DT1BZX1BPSU5URVIpOworCQlvYl93cml0ZV9zaGFkb3dfcmVnID0gaW9yZWFkMzIobWhiYS0+b2Jfc2hhZG93KTsKKwl9IHdoaWxlICgob2Jfd3JpdGVfcmVnICYgQ0xfU0xPVF9OVU1fTUFTSykgIT0gb2Jfd3JpdGVfc2hhZG93X3JlZyk7CisKKwljdXJfb2JmID0gbWhiYS0+b2JfY3VyX3Nsb3QgJiBDTF9TTE9UX05VTV9NQVNLOworCWFzc2lnbl9vYmZfZW5kID0gb2Jfd3JpdGVfcmVnICYgQ0xfU0xPVF9OVU1fTUFTSzsKKworCWlmICgob2Jfd3JpdGVfcmVnICYgQ0xfUE9JTlRFUl9UT0dHTEUpICE9CisJCQkJKG1oYmEtPm9iX2N1cl9zbG90ICYgQ0xfUE9JTlRFUl9UT0dHTEUpKSB7CisJCWFzc2lnbl9vYmZfZW5kICs9IG1oYmEtPmxpc3RfbnVtX2lvOworCX0KKworCWZvciAoaSA9IChhc3NpZ25fb2JmX2VuZCAtIGN1cl9vYmYpOyBpICE9IDA7IGktLSkgeworCQljdXJfb2JmKys7CisJCWlmIChjdXJfb2JmID49IG1oYmEtPmxpc3RfbnVtX2lvKSB7CisJCQljdXJfb2JmIC09IG1oYmEtPmxpc3RfbnVtX2lvOworCQkJbWhiYS0+b2JfY3VyX3Nsb3QgXj0gQ0xfUE9JTlRFUl9UT0dHTEU7CisJCX0KKworCQlwX291dGJfZnJhbWUgPSBtaGJhLT5vYl9saXN0ICsgY3VyX29iZiAqIG1oYmEtPm9iX21heF9zaXplOworCisJCS8qIENvcHkgcG9pbnRlciBtYXkgcG9pbnQgdG8gZW50cnkgaW4gb3V0Ym91bmQgbGlzdAorCQkqICBiZWZvcmUgZW50cnkgaGFzIHZhbGlkIGRhdGEKKwkJKi8KKwkJaWYgKHVubGlrZWx5KHBfb3V0Yl9mcmFtZS0+dGFnID4gbWhiYS0+dGFnX3Bvb2wuc2l6ZSB8fAorCQkJbWhiYS0+dGFnX2NtZFtwX291dGJfZnJhbWUtPnRhZ10gPT0gTlVMTCB8fAorCQkJcF9vdXRiX2ZyYW1lLT5yZXF1ZXN0X2lkICE9CisJCQkJbWhiYS0+dGFnX2NtZFtwX291dGJfZnJhbWUtPnRhZ10tPnJlcXVlc3RfaWQpKQorCQkJaWYgKG12dW1pX2NoZWNrX29iX2ZyYW1lKG1oYmEsIGN1cl9vYmYsIHBfb3V0Yl9mcmFtZSkpCisJCQkJY29udGludWU7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZtaGJhLT5vYl9kYXRhX2xpc3QpKSB7CisJCQlvYl9kYXRhID0gKHN0cnVjdCBtdnVtaV9vYl9kYXRhICopCisJCQkJbGlzdF9maXJzdF9lbnRyeSgmbWhiYS0+b2JfZGF0YV9saXN0LAorCQkJCQlzdHJ1Y3QgbXZ1bWlfb2JfZGF0YSwgbGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZvYl9kYXRhLT5saXN0KTsKKwkJfSBlbHNlIHsKKwkJCW9iX2RhdGEgPSBOVUxMOworCQkJaWYgKGN1cl9vYmYgPT0gMCkgeworCQkJCWN1cl9vYmYgPSBtaGJhLT5saXN0X251bV9pbyAtIDE7CisJCQkJbWhiYS0+b2JfY3VyX3Nsb3QgXj0gQ0xfUE9JTlRFUl9UT0dHTEU7CisJCQl9IGVsc2UKKwkJCQljdXJfb2JmIC09IDE7CisJCQlicmVhazsKKwkJfQorCisJCW1lbWNweShvYl9kYXRhLT5kYXRhLCBwX291dGJfZnJhbWUsIG1oYmEtPm9iX21heF9zaXplKTsKKwkJcF9vdXRiX2ZyYW1lLT50YWcgPSAweGZmOworCisJCWxpc3RfYWRkX3RhaWwoJm9iX2RhdGEtPmxpc3QsICZtaGJhLT5mcmVlX29iX2xpc3QpOworCX0KKwltaGJhLT5vYl9jdXJfc2xvdCAmPSB+Q0xfU0xPVF9OVU1fTUFTSzsKKwltaGJhLT5vYl9jdXJfc2xvdCB8PSAoY3VyX29iZiAmIENMX1NMT1RfTlVNX01BU0spOworCWlvd3JpdGUzMihtaGJhLT5vYl9jdXJfc2xvdCwgbWhiYS0+bW1pbyArIENMQV9PVVRCX1JFQURfUE9JTlRFUik7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3Jlc2V0KHZvaWQgKnJlZ3MpCit7CisJaW93cml0ZTMyKDAsIHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworCWlmIChpb3JlYWQzMihyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NU0cxKSAhPSBIQU5EU0hBS0VfRE9ORVNUQVRFKQorCQlyZXR1cm47CisKKwlpb3dyaXRlMzIoRFJCTF9TT0ZUX1JFU0VULCByZWdzICsgQ1BVX1BDSUVBX1RPX0FSTV9EUkJMX1JFRyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG12dW1pX3N0YXJ0KHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpOworCitzdGF0aWMgaW50IG12dW1pX3dhaXRfZm9yX291dHN0YW5kaW5nKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJbWhiYS0+Zndfc3RhdGUgPSBGV19TVEFURV9BQk9SVDsKKwltdnVtaV9yZXNldChtaGJhLT5tbWlvKTsKKworCWlmIChtdnVtaV9zdGFydChtaGJhKSkKKwkJcmV0dXJuIEZBSUxFRDsKKwllbHNlCisJCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IG12dW1pX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhOworCisJbWhiYSA9IChzdHJ1Y3QgbXZ1bWlfaGJhICopIHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisKKwlzY21kX3ByaW50ayhLRVJOX05PVElDRSwgc2NtZCwgIlJFU0VUIC0lbGQgY21kPSV4IHJldHJpZXM9JXhcbiIsCisJCQlzY21kLT5zZXJpYWxfbnVtYmVyLCBzY21kLT5jbW5kWzBdLCBzY21kLT5yZXRyaWVzKTsKKworCXJldHVybiBtdnVtaV93YWl0X2Zvcl9vdXRzdGFuZGluZyhtaGJhKTsKK30KKworc3RhdGljIGludCBtdnVtaV9pc3N1ZV9ibG9ja2VkX2NtZChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCQkJc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljbWQtPmNtZF9zdGF0dXMgPSBSRVFfU1RBVFVTX1BFTkRJTkc7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNtZC0+c3luY19jbWQpKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCSJsYXN0IGJsb2NrZWQgY21kIG5vdCBmaW5pc2hlZCwgc3luY19jbWQgPSAlZFxuIiwKKwkJCQkJCWF0b21pY19yZWFkKCZjbWQtPnN5bmNfY21kKSk7CisJCUJVR19PTigxKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdG9taWNfaW5jKCZjbWQtPnN5bmNfY21kKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShtaGJhLT5zaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJbWhiYS0+aW5zdGFuY2V0LT5maXJlX2NtZChtaGJhLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobWhiYS0+c2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJd2FpdF9ldmVudF90aW1lb3V0KG1oYmEtPmludF9jbWRfd2FpdF9xLAorCQkoY21kLT5jbWRfc3RhdHVzICE9IFJFUV9TVEFUVVNfUEVORElORyksCisJCU1WVU1JX0lOVEVSTkFMX0NNRF9XQUlUX1RJTUUgKiBIWik7CisKKwkvKiBjb21tYW5kIHRpbWVvdXQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNtZC0+c3luY19jbWQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwkJYXRvbWljX2RlYygmY21kLT5zeW5jX2NtZCk7CisJCWlmIChtaGJhLT50YWdfY21kW2NtZC0+ZnJhbWUtPnRhZ10pIHsKKwkJCW1oYmEtPnRhZ19jbWRbY21kLT5mcmFtZS0+dGFnXSA9IDA7CisJCQlkZXZfd2FybigmbWhiYS0+cGRldi0+ZGV2LCAiVElNRU9VVDpyZWxlYXNlIHRhZyBbJWRdXG4iLAorCQkJCQkJCWNtZC0+ZnJhbWUtPnRhZyk7CisJCQl0YWdfcmVsZWFzZV9vbmUobWhiYSwgJm1oYmEtPnRhZ19wb29sLCBjbWQtPmZyYW1lLT50YWcpOworCQl9CisJCWlmICghbGlzdF9lbXB0eSgmY21kLT5xdWV1ZV9wb2ludGVyKSkgeworCQkJZGV2X3dhcm4oJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkiVElNRU9VVDpBIGludGVybmFsIGNvbW1hbmQgZG9lc24ndCBzZW5kIVxuIik7CisJCQlsaXN0X2RlbF9pbml0KCZjbWQtPnF1ZXVlX3BvaW50ZXIpOworCQl9IGVsc2UKKwkJCWF0b21pY19kZWMoJm1oYmEtPmZ3X291dHN0YW5kaW5nKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3JlbGVhc2VfZncoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwltdnVtaV9mcmVlX2NtZHMobWhiYSk7CisJbXZ1bWlfcmVsZWFzZV9tZW1fcmVzb3VyY2UobWhiYSk7CisJbXZ1bWlfdW5tYXBfcGNpX2FkZHIobWhiYS0+cGRldiwgbWhiYS0+YmFzZV9hZGRyKTsKKwlrZnJlZShtaGJhLT5oYW5kc2hha2VfcGFnZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhtaGJhLT5wZGV2KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXZ1bWlfZmx1c2hfY2FjaGUoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQ7CisJc3RydWN0IG12dW1pX21zZ19mcmFtZSAqZnJhbWU7CisJdW5zaWduZWQgY2hhciBkZXZpY2VfaWQsIHJldHJ5ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJpdGNvdW50ID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogODsKKworCWZvciAoZGV2aWNlX2lkID0gMDsgZGV2aWNlX2lkIDwgbWhiYS0+bWF4X3RhcmdldF9pZDsgZGV2aWNlX2lkKyspIHsKKwkJaWYgKCEobWhiYS0+dGFyZ2V0X21hcFtkZXZpY2VfaWQgLyBiaXRjb3VudF0gJgorCQkJCSgxIDw8IChkZXZpY2VfaWQgJSBiaXRjb3VudCkpKSkKKwkJCWNvbnRpbnVlOworZ2V0X2NtZDoJY21kID0gbXZ1bWlfY3JlYXRlX2ludGVybmFsX2NtZChtaGJhLCAwKTsKKwkJaWYgKCFjbWQpIHsKKwkJCWlmIChyZXRyeSsrID49IDUpIHsKKwkJCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSIKKwkJCQkJIiBmb3IgaW50ZXJuYWwgZmx1c2ggY2FjaGUgY21kIGZvciAiCisJCQkJCSJkZXZpY2UgJWQiLCBkZXZpY2VfaWQpOworCQkJCXJldHJ5ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCWdvdG8gZ2V0X2NtZDsKKwkJfQorCQljbWQtPnNjbWQgPSBOVUxMOworCQljbWQtPmNtZF9zdGF0dXMgPSBSRVFfU1RBVFVTX1BFTkRJTkc7CisJCWF0b21pY19zZXQoJmNtZC0+c3luY19jbWQsIDApOworCQlmcmFtZSA9IGNtZC0+ZnJhbWU7CisJCWZyYW1lLT5yZXFfZnVuY3Rpb24gPSBDTF9GVU5fU0NTSV9DTUQ7CisJCWZyYW1lLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisJCWZyYW1lLT5jbWRfZmxhZyA9IENNRF9GTEFHX05PTl9EQVRBOworCQlmcmFtZS0+ZGF0YV90cmFuc2Zlcl9sZW5ndGggPSAwOworCQlmcmFtZS0+Y2RiX2xlbmd0aCA9IE1BWF9DT01NQU5EX1NJWkU7CisJCW1lbXNldChmcmFtZS0+Y2RiLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKKwkJZnJhbWUtPmNkYlswXSA9IFNDU0lfQ01EX01BUlZFTExfU1BFQ0lGSUM7CisJCWZyYW1lLT5jZGJbMl0gPSBDREJfQ09SRV9TSFVURE9XTjsKKworCQltdnVtaV9pc3N1ZV9ibG9ja2VkX2NtZChtaGJhLCBjbWQpOworCQlpZiAoY21kLT5jbWRfc3RhdHVzICE9IFNBTV9TVEFUX0dPT0QpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkiZGV2aWNlICVkIGZsdXNoIGNhY2hlIGZhaWxlZCwgc3RhdHVzPTB4JXguXG4iLAorCQkJCWRldmljZV9pZCwgY21kLT5jbWRfc3RhdHVzKTsKKwkJfQorCisJCW12dW1pX2RlbGV0ZV9pbnRlcm5hbF9jbWQobWhiYSwgY21kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCittdnVtaV9jYWxjdWxhdGVfY2hlY2tzdW0oc3RydWN0IG12dW1pX2hzX2hlYWRlciAqcF9oZWFkZXIsCisJCQkJCQkJdW5zaWduZWQgc2hvcnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBjaGFyIHJldCA9IDAsIGk7CisKKwlwdHIgPSAodW5zaWduZWQgY2hhciAqKSBwX2hlYWRlci0+ZnJhbWVfY29udGVudDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJcmV0IF49ICpwdHI7CisJCXB0cisrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbXZ1bWlfaHNfYnVpbGRfcGFnZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCXN0cnVjdCBtdnVtaV9oc19oZWFkZXIgKmhzX2hlYWRlcikKK3sKKwlzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTIgKmhzX3BhZ2UyOworCXN0cnVjdCBtdnVtaV9oc19wYWdlNCAqaHNfcGFnZTQ7CisJc3RydWN0IG12dW1pX2hzX3BhZ2UzICpoc19wYWdlMzsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCXVuc2lnbmVkIGludCBsb2NhbF90aW1lOworCisJc3dpdGNoIChoc19oZWFkZXItPnBhZ2VfY29kZSkgeworCWNhc2UgSFNfUEFHRV9IT1NUX0lORk86CisJCWhzX3BhZ2UyID0gKHN0cnVjdCBtdnVtaV9oc19wYWdlMiAqKSBoc19oZWFkZXI7CisJCWhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoID0gc2l6ZW9mKCpoc19wYWdlMikgLSA0OworCQltZW1zZXQoaHNfaGVhZGVyLT5mcmFtZV9jb250ZW50LCAwLCBoc19oZWFkZXItPmZyYW1lX2xlbmd0aCk7CisJCWhzX3BhZ2UyLT5ob3N0X3R5cGUgPSAzOyAvKiAzIG1lYW4gbGludXgqLworCQloc19wYWdlMi0+aG9zdF92ZXIudmVyX21ham9yID0gVkVSX01BSk9SOworCQloc19wYWdlMi0+aG9zdF92ZXIudmVyX21pbm9yID0gVkVSX01JTk9SOworCQloc19wYWdlMi0+aG9zdF92ZXIudmVyX29lbSA9IFZFUl9PRU07CisJCWhzX3BhZ2UyLT5ob3N0X3Zlci52ZXJfYnVpbGQgPSBWRVJfQlVJTEQ7CisJCWhzX3BhZ2UyLT5zeXN0ZW1faW9fYnVzID0gMDsKKwkJaHNfcGFnZTItPnNsb3RfbnVtYmVyID0gMDsKKwkJaHNfcGFnZTItPmludHJfbGV2ZWwgPSAwOworCQloc19wYWdlMi0+aW50cl92ZWN0b3IgPSAwOworCQlkb19nZXR0aW1lb2ZkYXkoJnRpbWUpOworCQlsb2NhbF90aW1lID0gKHVuc2lnbmVkIGludCkgKHRpbWUudHZfc2VjIC0KKwkJCQkJCShzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkpOworCQloc19wYWdlMi0+c2Vjb25kc19zaW5jZTE5NzAgPSBsb2NhbF90aW1lOworCQloc19oZWFkZXItPmNoZWNrc3VtID0gbXZ1bWlfY2FsY3VsYXRlX2NoZWNrc3VtKGhzX2hlYWRlciwKKwkJCQkJCWhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEhTX1BBR0VfRklSTV9DVEw6CisJCWhzX3BhZ2UzID0gKHN0cnVjdCBtdnVtaV9oc19wYWdlMyAqKSBoc19oZWFkZXI7CisJCWhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoID0gc2l6ZW9mKCpoc19wYWdlMykgLSA0OworCQltZW1zZXQoaHNfaGVhZGVyLT5mcmFtZV9jb250ZW50LCAwLCBoc19oZWFkZXItPmZyYW1lX2xlbmd0aCk7CisJCWhzX2hlYWRlci0+Y2hlY2tzdW0gPSBtdnVtaV9jYWxjdWxhdGVfY2hlY2tzdW0oaHNfaGVhZGVyLAorCQkJCQkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSFNfUEFHRV9DTF9JTkZPOgorCQloc19wYWdlNCA9IChzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTQgKikgaHNfaGVhZGVyOworCQloc19oZWFkZXItPmZyYW1lX2xlbmd0aCA9IHNpemVvZigqaHNfcGFnZTQpIC0gNDsKKwkJbWVtc2V0KGhzX2hlYWRlci0+ZnJhbWVfY29udGVudCwgMCwgaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGgpOworCQloc19wYWdlNC0+aWJfYmFzZWFkZHJfbCA9IGxvd2VyXzMyX2JpdHMobWhiYS0+aWJfbGlzdF9waHlzKTsKKwkJaHNfcGFnZTQtPmliX2Jhc2VhZGRyX2ggPSB1cHBlcl8zMl9iaXRzKG1oYmEtPmliX2xpc3RfcGh5cyk7CisKKwkJaHNfcGFnZTQtPm9iX2Jhc2VhZGRyX2wgPSBsb3dlcl8zMl9iaXRzKG1oYmEtPm9iX2xpc3RfcGh5cyk7CisJCWhzX3BhZ2U0LT5vYl9iYXNlYWRkcl9oID0gdXBwZXJfMzJfYml0cyhtaGJhLT5vYl9saXN0X3BoeXMpOworCQloc19wYWdlNC0+aWJfZW50cnlfc2l6ZSA9IG1oYmEtPmliX21heF9zaXplX3NldHRpbmc7CisJCWhzX3BhZ2U0LT5vYl9lbnRyeV9zaXplID0gbWhiYS0+b2JfbWF4X3NpemVfc2V0dGluZzsKKwkJaHNfcGFnZTQtPm9iX2RlcHRoID0gbWhiYS0+bGlzdF9udW1faW87CisJCWhzX3BhZ2U0LT5pYl9kZXB0aCA9IG1oYmEtPmxpc3RfbnVtX2lvOworCQloc19oZWFkZXItPmNoZWNrc3VtID0gbXZ1bWlfY2FsY3VsYXRlX2NoZWNrc3VtKGhzX2hlYWRlciwKKwkJCQkJCWhzX2hlYWRlci0+ZnJhbWVfbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJjYW5ub3QgYnVpbGQgcGFnZSwgY29kZVsweCV4XVxuIiwKKwkJCWhzX2hlYWRlci0+cGFnZV9jb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIG12dW1pX2luaXRfZGF0YSAtCUluaXRpYWxpemUgcmVxdWVzdGVkIGRhdGUgZm9yIEZXCisgKiBAbWhiYToJCQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqLworc3RhdGljIGludCBtdnVtaV9pbml0X2RhdGEoc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlzdHJ1Y3QgbXZ1bWlfb2JfZGF0YSAqb2JfcG9vbDsKKwlzdHJ1Y3QgbXZ1bWlfcmVzICpyZXNfbWdudDsKKwl1bnNpZ25lZCBpbnQgdG1wX3NpemUsIG9mZnNldCwgaTsKKwl2b2lkICp2aXJtZW0sICp2OworCWRtYV9hZGRyX3QgcDsKKworCWlmIChtaGJhLT5md19mbGFnICYgTVZVTUlfRldfQUxMT0MpCisJCXJldHVybiAwOworCisJdG1wX3NpemUgPSBtaGJhLT5pYl9tYXhfc2l6ZSAqIG1oYmEtPm1heF9pbzsKKwl0bXBfc2l6ZSArPSAxMjggKyBtaGJhLT5vYl9tYXhfc2l6ZSAqIG1oYmEtPm1heF9pbzsKKwl0bXBfc2l6ZSArPSA4ICsgc2l6ZW9mKHUzMikgKyAxNjsKKworCXJlc19tZ250ID0gbXZ1bWlfYWxsb2NfbWVtX3Jlc291cmNlKG1oYmEsCisJCQkJCVJFU09VUkNFX1VOQ0FDSEVEX01FTU9SWSwgdG1wX3NpemUpOworCWlmICghcmVzX21nbnQpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluYm91bmQgbGlzdFxuIik7CisJCWdvdG8gZmFpbF9hbGxvY19kbWFfYnVmOworCX0KKworCXAgPSByZXNfbWdudC0+YnVzX2FkZHI7CisJdiA9IHJlc19tZ250LT52aXJ0X2FkZHI7CisJLyogaWJfbGlzdCAqLworCW9mZnNldCA9IHJvdW5kX3VwKHAsIDEyOCkgLSBwOworCXAgKz0gb2Zmc2V0OworCXYgKz0gb2Zmc2V0OworCW1oYmEtPmliX2xpc3QgPSB2OworCW1oYmEtPmliX2xpc3RfcGh5cyA9IHA7CisJdiArPSBtaGJhLT5pYl9tYXhfc2l6ZSAqIG1oYmEtPm1heF9pbzsKKwlwICs9IG1oYmEtPmliX21heF9zaXplICogbWhiYS0+bWF4X2lvOworCS8qIGliIHNoYWRvdyAqLworCW9mZnNldCA9IHJvdW5kX3VwKHAsIDgpIC0gcDsKKwlwICs9IG9mZnNldDsKKwl2ICs9IG9mZnNldDsKKwltaGJhLT5pYl9zaGFkb3cgPSB2OworCW1oYmEtPmliX3NoYWRvd19waHlzID0gcDsKKwlwICs9IHNpemVvZih1MzIpOworCXYgKz0gc2l6ZW9mKHUzMik7CisJLyogb2Igc2hhZG93ICovCisJb2Zmc2V0ID0gcm91bmRfdXAocCwgOCkgLSBwOworCXAgKz0gb2Zmc2V0OworCXYgKz0gb2Zmc2V0OworCW1oYmEtPm9iX3NoYWRvdyA9IHY7CisJbWhiYS0+b2Jfc2hhZG93X3BoeXMgPSBwOworCXAgKz0gODsKKwl2ICs9IDg7CisKKwkvKiBvYiBsaXN0ICovCisJb2Zmc2V0ID0gcm91bmRfdXAocCwgMTI4KSAtIHA7CisJcCArPSBvZmZzZXQ7CisJdiArPSBvZmZzZXQ7CisKKwltaGJhLT5vYl9saXN0ID0gdjsKKwltaGJhLT5vYl9saXN0X3BoeXMgPSBwOworCisJLyogb2IgZGF0YSBwb29sICovCisJdG1wX3NpemUgPSBtaGJhLT5tYXhfaW8gKiAobWhiYS0+b2JfbWF4X3NpemUgKyBzaXplb2YoKm9iX3Bvb2wpKTsKKwl0bXBfc2l6ZSA9IHJvdW5kX3VwKHRtcF9zaXplLCA4KTsKKworCXJlc19tZ250ID0gbXZ1bWlfYWxsb2NfbWVtX3Jlc291cmNlKG1oYmEsCisJCQkJUkVTT1VSQ0VfQ0FDSEVEX01FTU9SWSwgdG1wX3NpemUpOworCWlmICghcmVzX21nbnQpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91dGJvdW5kIGRhdGEgYnVmZmVyXG4iKTsKKwkJZ290byBmYWlsX2FsbG9jX2RtYV9idWY7CisJfQorCXZpcm1lbSA9IHJlc19tZ250LT52aXJ0X2FkZHI7CisKKwlmb3IgKGkgPSBtaGJhLT5tYXhfaW87IGkgIT0gMDsgaS0tKSB7CisJCW9iX3Bvb2wgPSAoc3RydWN0IG12dW1pX29iX2RhdGEgKikgdmlybWVtOworCQlsaXN0X2FkZF90YWlsKCZvYl9wb29sLT5saXN0LCAmbWhiYS0+b2JfZGF0YV9saXN0KTsKKwkJdmlybWVtICs9IG1oYmEtPm9iX21heF9zaXplICsgc2l6ZW9mKCpvYl9wb29sKTsKKwl9CisKKwl0bXBfc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiBtaGJhLT5tYXhfaW8gKworCQkJCXNpemVvZihzdHJ1Y3QgbXZ1bWlfY21kICopICogbWhiYS0+bWF4X2lvOworCXRtcF9zaXplICs9IHJvdW5kX3VwKG1oYmEtPm1heF90YXJnZXRfaWQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDgpIC8KKwkJCQkJCShzaXplb2YodW5zaWduZWQgY2hhcikgKiA4KTsKKworCXJlc19tZ250ID0gbXZ1bWlfYWxsb2NfbWVtX3Jlc291cmNlKG1oYmEsCisJCQkJUkVTT1VSQ0VfQ0FDSEVEX01FTU9SWSwgdG1wX3NpemUpOworCWlmICghcmVzX21nbnQpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhZyBhbmQgdGFyZ2V0IG1hcFxuIik7CisJCWdvdG8gZmFpbF9hbGxvY19kbWFfYnVmOworCX0KKworCXZpcm1lbSA9IHJlc19tZ250LT52aXJ0X2FkZHI7CisJbWhiYS0+dGFnX3Bvb2wuc3RhY2sgPSB2aXJtZW07CisJbWhiYS0+dGFnX3Bvb2wuc2l6ZSA9IG1oYmEtPm1heF9pbzsKKwl0YWdfaW5pdCgmbWhiYS0+dGFnX3Bvb2wsIG1oYmEtPm1heF9pbyk7CisJdmlybWVtICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiBtaGJhLT5tYXhfaW87CisKKwltaGJhLT50YWdfY21kID0gdmlybWVtOworCXZpcm1lbSArPSBzaXplb2Yoc3RydWN0IG12dW1pX2NtZCAqKSAqIG1oYmEtPm1heF9pbzsKKworCW1oYmEtPnRhcmdldF9tYXAgPSB2aXJtZW07CisKKwltaGJhLT5md19mbGFnIHw9IE1WVU1JX0ZXX0FMTE9DOworCXJldHVybiAwOworCitmYWlsX2FsbG9jX2RtYV9idWY6CisJbXZ1bWlfcmVsZWFzZV9tZW1fcmVzb3VyY2UobWhiYSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG12dW1pX2hzX3Byb2Nlc3NfcGFnZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLAorCQkJCXN0cnVjdCBtdnVtaV9oc19oZWFkZXIgKmhzX2hlYWRlcikKK3sKKwlzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTEgKmhzX3BhZ2UxOworCXVuc2lnbmVkIGNoYXIgcGFnZV9jaGVja3N1bTsKKworCXBhZ2VfY2hlY2tzdW0gPSBtdnVtaV9jYWxjdWxhdGVfY2hlY2tzdW0oaHNfaGVhZGVyLAorCQkJCQkJaHNfaGVhZGVyLT5mcmFtZV9sZW5ndGgpOworCWlmIChwYWdlX2NoZWNrc3VtICE9IGhzX2hlYWRlci0+Y2hlY2tzdW0pIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAiY2hlY2tzdW0gZXJyb3JcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoIChoc19oZWFkZXItPnBhZ2VfY29kZSkgeworCWNhc2UgSFNfUEFHRV9GSVJNX0NBUDoKKwkJaHNfcGFnZTEgPSAoc3RydWN0IG12dW1pX2hzX3BhZ2UxICopIGhzX2hlYWRlcjsKKworCQltaGJhLT5tYXhfaW8gPSBoc19wYWdlMS0+bWF4X2lvX3N1cHBvcnQ7CisJCW1oYmEtPmxpc3RfbnVtX2lvID0gaHNfcGFnZTEtPmNsX2lub3V0X2xpc3RfZGVwdGg7CisJCW1oYmEtPm1heF90cmFuc2Zlcl9zaXplID0gaHNfcGFnZTEtPm1heF90cmFuc2Zlcl9zaXplOworCQltaGJhLT5tYXhfdGFyZ2V0X2lkID0gaHNfcGFnZTEtPm1heF9kZXZpY2VzX3N1cHBvcnQ7CisJCW1oYmEtPmhiYV9jYXBhYmlsaXR5ID0gaHNfcGFnZTEtPmNhcGFiaWxpdHk7CisJCW1oYmEtPmliX21heF9zaXplX3NldHRpbmcgPSBoc19wYWdlMS0+Y2xfaW5fbWF4X2VudHJ5X3NpemU7CisJCW1oYmEtPmliX21heF9zaXplID0gKDEgPDwgaHNfcGFnZTEtPmNsX2luX21heF9lbnRyeV9zaXplKSA8PCAyOworCisJCW1oYmEtPm9iX21heF9zaXplX3NldHRpbmcgPSBoc19wYWdlMS0+Y2xfb3V0X21heF9lbnRyeV9zaXplOworCQltaGJhLT5vYl9tYXhfc2l6ZSA9ICgxIDw8IGhzX3BhZ2UxLT5jbF9vdXRfbWF4X2VudHJ5X3NpemUpIDw8IDI7CisKKwkJZGV2X2RiZygmbWhiYS0+cGRldi0+ZGV2LCAiRlcgdmVyc2lvbjolZFxuIiwKKwkJCQkJCWhzX3BhZ2UxLT5md192ZXIudmVyX2J1aWxkKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJoYW5kc2hha2U6IHBhZ2UgY29kZSBlcnJvclxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXZ1bWlfaGFuZHNoYWtlIC0JTW92ZSB0aGUgRlcgdG8gUkVBRFkgc3RhdGUKKyAqIEBtaGJhOgkJCQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqCisgKiBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBGVyBwYXNzZXMgY2FuIHBvdGVudGlhbGx5IGJlIGluIGFueSBvbmUgb2YKKyAqIHNldmVyYWwgcG9zc2libGUgc3RhdGVzLiBJZiB0aGUgRlcgaW4gb3BlcmF0aW9uYWwsIHdhaXRpbmctZm9yLWhhbmRzaGFrZQorICogc3RhdGVzLCBkcml2ZXIgbXVzdCB0YWtlIHN0ZXBzIHRvIGJyaW5nIGl0IHRvIHJlYWR5IHN0YXRlLiBPdGhlcndpc2UsIGl0CisgKiBoYXMgdG8gd2FpdCBmb3IgdGhlIHJlYWR5IHN0YXRlLgorICovCitzdGF0aWMgaW50IG12dW1pX2hhbmRzaGFrZShzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXVuc2lnbmVkIGludCBoc19zdGF0ZSwgdG1wLCBoc19mdW47CisJc3RydWN0IG12dW1pX2hzX2hlYWRlciAqaHNfaGVhZGVyOworCXZvaWQgKnJlZ3MgPSBtaGJhLT5tbWlvOworCisJaWYgKG1oYmEtPmZ3X3N0YXRlID09IEZXX1NUQVRFX1NUQVJUSU5HKQorCQloc19zdGF0ZSA9IEhTX1NfU1RBUlQ7CisJZWxzZSB7CisJCXRtcCA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX01TRzApOworCQloc19zdGF0ZSA9IEhTX0dFVF9TVEFURSh0bXApOworCQlkZXZfZGJnKCZtaGJhLT5wZGV2LT5kZXYsICJoYW5kc2hha2Ugc3RhdGVbMHgleF0uXG4iLCBoc19zdGF0ZSk7CisJCWlmIChIU19HRVRfU1RBVFVTKHRtcCkgIT0gSFNfU1RBVFVTX09LKSB7CisJCQltaGJhLT5md19zdGF0ZSA9IEZXX1NUQVRFX1NUQVJUSU5HOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaHNfZnVuID0gMDsKKwlzd2l0Y2ggKGhzX3N0YXRlKSB7CisJY2FzZSBIU19TX1NUQVJUOgorCQltaGJhLT5md19zdGF0ZSA9IEZXX1NUQVRFX0hBTkRTSEFLSU5HOworCQlIU19TRVRfU1RBVFVTKGhzX2Z1biwgSFNfU1RBVFVTX09LKTsKKwkJSFNfU0VUX1NUQVRFKGhzX2Z1biwgSFNfU19SRVNFVCk7CisJCWlvd3JpdGUzMihIQU5EU0hBS0VfU0lHTkFUVVJFLCByZWdzICsgQ1BVX1BDSUVBX1RPX0FSTV9NU0cxKTsKKwkJaW93cml0ZTMyKGhzX2Z1biwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fTVNHMCk7CisJCWlvd3JpdGUzMihEUkJMX0hBTkRTSEFLRSwgcmVncyArIENQVV9QQ0lFQV9UT19BUk1fRFJCTF9SRUcpOworCQlicmVhazsKKworCWNhc2UgSFNfU19SRVNFVDoKKwkJaW93cml0ZTMyKGxvd2VyXzMyX2JpdHMobWhiYS0+aGFuZHNoYWtlX3BhZ2VfcGh5cyksCisJCQkJCXJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX01TRzEpOworCQlpb3dyaXRlMzIodXBwZXJfMzJfYml0cyhtaGJhLT5oYW5kc2hha2VfcGFnZV9waHlzKSwKKwkJCQkJcmVncyArIENQVV9BUk1fVE9fUENJRUFfTVNHMSk7CisJCUhTX1NFVF9TVEFUVVMoaHNfZnVuLCBIU19TVEFUVVNfT0spOworCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX1BBR0VfQUREUik7CisJCWlvd3JpdGUzMihoc19mdW4sIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX01TRzApOworCQlpb3dyaXRlMzIoRFJCTF9IQU5EU0hBS0UsIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX0RSQkxfUkVHKTsKKworCQlicmVhazsKKworCWNhc2UgSFNfU19QQUdFX0FERFI6CisJY2FzZSBIU19TX1FVRVJZX1BBR0U6CisJY2FzZSBIU19TX1NFTkRfUEFHRToKKwkJaHNfaGVhZGVyID0gKHN0cnVjdCBtdnVtaV9oc19oZWFkZXIgKikgbWhiYS0+aGFuZHNoYWtlX3BhZ2U7CisJCWlmIChoc19oZWFkZXItPnBhZ2VfY29kZSA9PSBIU19QQUdFX0ZJUk1fQ0FQKSB7CisJCQltaGJhLT5oYmFfdG90YWxfcGFnZXMgPQorCQkJKChzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTEgKikgaHNfaGVhZGVyKS0+dG90YWxfcGFnZXM7CisKKwkJCWlmIChtaGJhLT5oYmFfdG90YWxfcGFnZXMgPT0gMCkKKwkJCQltaGJhLT5oYmFfdG90YWxfcGFnZXMgPSBIU19QQUdFX1RPVEFMLTE7CisJCX0KKworCQlpZiAoaHNfc3RhdGUgPT0gSFNfU19RVUVSWV9QQUdFKSB7CisJCQlpZiAobXZ1bWlfaHNfcHJvY2Vzc19wYWdlKG1oYmEsIGhzX2hlYWRlcikpIHsKKwkJCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX0FCT1JUKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlpZiAobXZ1bWlfaW5pdF9kYXRhKG1oYmEpKSB7CisJCQkJSFNfU0VUX1NUQVRFKGhzX2Z1biwgSFNfU19BQk9SVCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKGhzX3N0YXRlID09IEhTX1NfUEFHRV9BRERSKSB7CisJCQloc19oZWFkZXItPnBhZ2VfY29kZSA9IDA7CisJCQltaGJhLT5oYmFfdG90YWxfcGFnZXMgPSBIU19QQUdFX1RPVEFMLTE7CisJCX0KKworCQlpZiAoKGhzX2hlYWRlci0+cGFnZV9jb2RlICsgMSkgPD0gbWhiYS0+aGJhX3RvdGFsX3BhZ2VzKSB7CisJCQloc19oZWFkZXItPnBhZ2VfY29kZSsrOworCQkJaWYgKGhzX2hlYWRlci0+cGFnZV9jb2RlICE9IEhTX1BBR0VfRklSTV9DQVApIHsKKwkJCQltdnVtaV9oc19idWlsZF9wYWdlKG1oYmEsIGhzX2hlYWRlcik7CisJCQkJSFNfU0VUX1NUQVRFKGhzX2Z1biwgSFNfU19TRU5EX1BBR0UpOworCQkJfSBlbHNlCisJCQkJSFNfU0VUX1NUQVRFKGhzX2Z1biwgSFNfU19RVUVSWV9QQUdFKTsKKwkJfSBlbHNlCisJCQlIU19TRVRfU1RBVEUoaHNfZnVuLCBIU19TX0VORCk7CisKKwkJSFNfU0VUX1NUQVRVUyhoc19mdW4sIEhTX1NUQVRVU19PSyk7CisJCWlvd3JpdGUzMihoc19mdW4sIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX01TRzApOworCQlpb3dyaXRlMzIoRFJCTF9IQU5EU0hBS0UsIHJlZ3MgKyBDUFVfUENJRUFfVE9fQVJNX0RSQkxfUkVHKTsKKwkJYnJlYWs7CisKKwljYXNlIEhTX1NfRU5EOgorCQkvKiBTZXQgY29tbXVuaWNhdGlvbiBsaXN0IElTUiAqLworCQl0bXAgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKTsKKwkJdG1wIHw9IElOVF9NQVBfQ09NQU9VVCB8IElOVF9NQVBfQ09NQUVSUjsKKwkJaW93cml0ZTMyKHRtcCwgcmVncyArIENQVV9FTlBPSU5UQV9NQVNLX1JFRyk7CisJCWlvd3JpdGUzMihtaGJhLT5saXN0X251bV9pbywgbWhiYS0+aWJfc2hhZG93KTsKKwkJLyogU2V0IEluQm91bmQgTGlzdCBBdmFsaWFibGUgY291bnQgc2hhZG93ICovCisJCWlvd3JpdGUzMihsb3dlcl8zMl9iaXRzKG1oYmEtPmliX3NoYWRvd19waHlzKSwKKwkJCQkJcmVncyArIENMQV9JTkJfQVZBTF9DT1VOVF9CQVNFTCk7CisJCWlvd3JpdGUzMih1cHBlcl8zMl9iaXRzKG1oYmEtPmliX3NoYWRvd19waHlzKSwKKwkJCQkJcmVncyArIENMQV9JTkJfQVZBTF9DT1VOVF9CQVNFSCk7CisKKwkJLyogU2V0IE91dEJvdW5kIExpc3QgQXZhbGlhYmxlIGNvdW50IHNoYWRvdyAqLworCQlpb3dyaXRlMzIoKG1oYmEtPmxpc3RfbnVtX2lvLTEpIHwgQ0xfUE9JTlRFUl9UT0dHTEUsCisJCQkJCQltaGJhLT5vYl9zaGFkb3cpOworCQlpb3dyaXRlMzIobG93ZXJfMzJfYml0cyhtaGJhLT5vYl9zaGFkb3dfcGh5cyksIHJlZ3MgKyAweDVCMCk7CisJCWlvd3JpdGUzMih1cHBlcl8zMl9iaXRzKG1oYmEtPm9iX3NoYWRvd19waHlzKSwgcmVncyArIDB4NUI0KTsKKworCQltaGJhLT5pYl9jdXJfc2xvdCA9IChtaGJhLT5saXN0X251bV9pbyAtIDEpIHwgQ0xfUE9JTlRFUl9UT0dHTEU7CisJCW1oYmEtPm9iX2N1cl9zbG90ID0gKG1oYmEtPmxpc3RfbnVtX2lvIC0gMSkgfCBDTF9QT0lOVEVSX1RPR0dMRTsKKwkJbWhiYS0+Zndfc3RhdGUgPSBGV19TVEFURV9TVEFSVEVEOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInVua25vd24gaGFuZHNoYWtlIHN0YXRlIFsweCV4XS5cbiIsCisJCQkJCQkJCWhzX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXZ1bWlfaGFuZHNoYWtlX2V2ZW50KHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJdW5zaWduZWQgaW50IGlzcl9zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBiZWZvcmU7CisKKwliZWZvcmUgPSBqaWZmaWVzOworCW12dW1pX2hhbmRzaGFrZShtaGJhKTsKKwlkbyB7CisJCWlzcl9zdGF0dXMgPSBtaGJhLT5pbnN0YW5jZXQtPnJlYWRfZndfc3RhdHVzX3JlZyhtaGJhLT5tbWlvKTsKKworCQlpZiAobWhiYS0+Zndfc3RhdGUgPT0gRldfU1RBVEVfU1RBUlRFRCkKKwkJCXJldHVybiAwOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBiZWZvcmUgKyBGV19NQVhfREVMQVkgKiBIWikpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkibm8gaGFuZHNoYWtlIHJlc3BvbnNlIGF0IHN0YXRlIDB4JXguXG4iLAorCQkJCSAgbWhiYS0+Zndfc3RhdGUpOworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJpc3IgOiBnbG9iYWw9MHgleCxzdGF0dXM9MHgleC5cbiIsCisJCQkJCW1oYmEtPmdsb2JhbF9pc3IsIGlzcl9zdGF0dXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJtYigpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfSB3aGlsZSAoIShpc3Jfc3RhdHVzICYgRFJCTF9IQU5EU0hBS0VfSVNSKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXZ1bWlfY2hlY2tfaGFuZHNoYWtlKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJdm9pZCAqcmVncyA9IG1oYmEtPm1taW87CisJdW5zaWduZWQgaW50IHRtcDsKKwl1bnNpZ25lZCBsb25nIGJlZm9yZTsKKworCWJlZm9yZSA9IGppZmZpZXM7CisJdG1wID0gaW9yZWFkMzIocmVncyArIENQVV9BUk1fVE9fUENJRUFfTVNHMSk7CisJd2hpbGUgKCh0bXAgIT0gSEFORFNIQUtFX1JFQURZU1RBVEUpICYmICh0bXAgIT0gSEFORFNIQUtFX0RPTkVTVEFURSkpIHsKKwkJaWYgKHRtcCAhPSBIQU5EU0hBS0VfUkVBRFlTVEFURSkKKwkJCWlvd3JpdGUzMihEUkJMX01VX1JFU0VULAorCQkJCQlyZWdzICsgQ1BVX1BDSUVBX1RPX0FSTV9EUkJMX1JFRyk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEZXX01BWF9ERUxBWSAqIEhaKSkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LAorCQkJCSJpbnZhbGlkIHNpZ25hdHVyZSBbMHgleF0uXG4iLCB0bXApOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJcm1iKCk7CisJCXRtcCA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX01TRzEpOworCX0KKworCW1oYmEtPmZ3X3N0YXRlID0gRldfU1RBVEVfU1RBUlRJTkc7CisJZGV2X2RiZygmbWhiYS0+cGRldi0+ZGV2LCAic3RhcnQgZmlybXdhcmUgaGFuZHNoYWtlLi4uXG4iKTsKKwlkbyB7CisJCWlmIChtdnVtaV9oYW5kc2hha2VfZXZlbnQobWhiYSkpIHsKKwkJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCQkJImhhbmRzaGFrZSBmYWlsZWQgYXQgc3RhdGUgMHgleC5cbiIsCisJCQkJCQltaGJhLT5md19zdGF0ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IHdoaWxlIChtaGJhLT5md19zdGF0ZSAhPSBGV19TVEFURV9TVEFSVEVEKTsKKworCWRldl9kYmcoJm1oYmEtPnBkZXYtPmRldiwgImZpcm13YXJlIGhhbmRzaGFrZSBkb25lXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtdnVtaV9zdGFydChzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhKQoreworCXZvaWQgKnJlZ3MgPSBtaGJhLT5tbWlvOworCXVuc2lnbmVkIGludCB0bXA7CisJLyogY2xlYXIgRG9vciBiZWxsICovCisJdG1wID0gaW9yZWFkMzIocmVncyArIENQVV9BUk1fVE9fUENJRUFfRFJCTF9SRUcpOworCWlvd3JpdGUzMih0bXAsIHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX0RSQkxfUkVHKTsKKworCWlvd3JpdGUzMigweDNGRkZGRkZGLCByZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NQVNLX1JFRyk7CisJdG1wID0gaW9yZWFkMzIocmVncyArIENQVV9FTlBPSU5UQV9NQVNLX1JFRykgfCBJTlRfTUFQX0RMX0NQVTJQQ0lFQTsKKwlpb3dyaXRlMzIodG1wLCByZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKTsKKwlpZiAobXZ1bWlfY2hlY2tfaGFuZHNoYWtlKG1oYmEpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtdnVtaV9jb21wbGV0ZV9jbWQgLQlDb21wbGV0ZXMgYSBjb21tYW5kCisgKiBAbWhiYToJCQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEBjbWQ6CQkJQ29tbWFuZCB0byBiZSBjb21wbGV0ZWQKKyAqLworc3RhdGljIHZvaWQgbXZ1bWlfY29tcGxldGVfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHN0cnVjdCBtdnVtaV9jbWQgKmNtZCwKKwkJCQkJc3RydWN0IG12dW1pX3JzcF9mcmFtZSAqb2JfZnJhbWUpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IGNtZC0+c2NtZDsKKworCWNtZC0+c2NtZC0+U0NwLnB0ciA9IE5VTEw7CisJc2NtZC0+cmVzdWx0ID0gb2JfZnJhbWUtPnJlcV9zdGF0dXM7CisKKwlzd2l0Y2ggKG9iX2ZyYW1lLT5yZXFfc3RhdHVzKSB7CisJY2FzZSBTQU1fU1RBVF9HT09EOgorCQlzY21kLT5yZXN1bHQgfD0gRElEX09LIDw8IDE2OworCQlicmVhazsKKwljYXNlIFNBTV9TVEFUX0JVU1k6CisJCXNjbWQtPnJlc3VsdCB8PSBESURfQlVTX0JVU1kgPDwgMTY7CisJCWJyZWFrOworCWNhc2UgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOgorCQlzY21kLT5yZXN1bHQgfD0gKERJRF9PSyA8PCAxNik7CisJCWlmIChvYl9mcmFtZS0+cnNwX2ZsYWcgJiBDTF9SU1BfRkxBR19TRU5TRURBVEEpIHsKKwkJCW1lbWNweShjbWQtPnNjbWQtPnNlbnNlX2J1ZmZlciwgb2JfZnJhbWUtPnBheWxvYWQsCisJCQkJc2l6ZW9mKHN0cnVjdCBtdnVtaV9zZW5zZV9kYXRhKSk7CisJCQlzY21kLT5yZXN1bHQgfD0gIChEUklWRVJfU0VOU0UgPDwgMjQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNjbWQtPnJlc3VsdCB8PSAoRFJJVkVSX0lOVkFMSUQgPDwgMjQpIHwgKERJRF9BQk9SVCA8PCAxNik7CisJCWJyZWFrOworCX0KKworCWlmIChzY3NpX2J1ZmZsZW4oc2NtZCkpIHsKKwkJaWYgKHNjc2lfc2dfY291bnQoc2NtZCkpIHsKKwkJCXBjaV91bm1hcF9zZyhtaGJhLT5wZGV2LAorCQkJCXNjc2lfc2dsaXN0KHNjbWQpLAorCQkJCXNjc2lfc2dfY291bnQoc2NtZCksCisJCQkJKGludCkgc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJcGNpX3VubWFwX3NpbmdsZShtaGJhLT5wZGV2LAorCQkJCXNjbWQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCXNjc2lfYnVmZmxlbihzY21kKSwKKwkJCQkoaW50KSBzY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJCXNjbWQtPlNDcC5kbWFfaGFuZGxlID0gMDsKKwkJfQorCX0KKwljbWQtPnNjbWQtPnNjc2lfZG9uZShzY21kKTsKKwltdnVtaV9yZXR1cm5fY21kKG1oYmEsIGNtZCk7Cit9CitzdGF0aWMgdm9pZCBtdnVtaV9jb21wbGV0ZV9pbnRlcm5hbF9jbWQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJCQkJCXN0cnVjdCBtdnVtaV9jbWQgKmNtZCwKKwkJCQkJc3RydWN0IG12dW1pX3JzcF9mcmFtZSAqb2JfZnJhbWUpCit7CisJaWYgKGF0b21pY19yZWFkKCZjbWQtPnN5bmNfY21kKSkgeworCQljbWQtPmNtZF9zdGF0dXMgPSBvYl9mcmFtZS0+cmVxX3N0YXR1czsKKworCQlpZiAoKG9iX2ZyYW1lLT5yZXFfc3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgJiYKKwkJCQkob2JfZnJhbWUtPnJzcF9mbGFnICYgQ0xfUlNQX0ZMQUdfU0VOU0VEQVRBKSAmJgorCQkJCWNtZC0+ZGF0YV9idWYpIHsKKwkJCW1lbWNweShjbWQtPmRhdGFfYnVmLCBvYl9mcmFtZS0+cGF5bG9hZCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtdnVtaV9zZW5zZV9kYXRhKSk7CisJCX0KKwkJYXRvbWljX2RlYygmY21kLT5zeW5jX2NtZCk7CisJCXdha2VfdXAoJm1oYmEtPmludF9jbWRfd2FpdF9xKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX3Nob3dfZXZlbnQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJCXN0cnVjdCBtdnVtaV9kcml2ZXJfZXZlbnQgKnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRldl93YXJuKCZtaGJhLT5wZGV2LT5kZXYsCisJCSJFdmVudFsweCV4XSBpZFsweCV4XSBzZXZlcml0eVsweCV4XSBkZXZpY2UgaWRbMHgleF1cbiIsCisJCXB0ci0+c2VxdWVuY2Vfbm8sIHB0ci0+ZXZlbnRfaWQsIHB0ci0+c2V2ZXJpdHksIHB0ci0+ZGV2aWNlX2lkKTsKKwlpZiAocHRyLT5wYXJhbV9jb3VudCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFdmVudCBwYXJhbShsZW4gMHgleCk6ICIsCisJCQkJCQlwdHItPnBhcmFtX2NvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IHB0ci0+cGFyYW1fY291bnQ7IGkrKykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjB4JXggIiwgcHRyLT5wYXJhbXNbaV0pOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlxuIik7CisJfQorCisJaWYgKHB0ci0+c2Vuc2VfZGF0YV9sZW5ndGgpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXZlbnQgc2Vuc2UgZGF0YShsZW4gMHgleCk6ICIsCisJCQkJCQlwdHItPnNlbnNlX2RhdGFfbGVuZ3RoKTsKKwkJZm9yIChpID0gMDsgaSA8IHB0ci0+c2Vuc2VfZGF0YV9sZW5ndGg7IGkrKykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIjB4JXggIiwgcHRyLT5zZW5zZV9kYXRhW2ldKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX25vdGlmaWNhdGlvbihzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhLCB1OCBtc2csIHZvaWQgKmJ1ZmZlcikKK3sKKwlpZiAobXNnID09IEFQSUNEQjFfRVZFTlRfR0VURVZFTlQpIHsKKwkJaW50IGksIGNvdW50OworCQlzdHJ1Y3QgbXZ1bWlfZHJpdmVyX2V2ZW50ICpwYXJhbSA9IE5VTEw7CisJCXN0cnVjdCBtdnVtaV9ldmVudF9yZXEgKmVyID0gYnVmZmVyOworCQljb3VudCA9IGVyLT5jb3VudDsKKwkJaWYgKGNvdW50ID4gTUFYX0VWRU5UU19SRVRVUk5FRCkgeworCQkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAiZXZlbnQgY291bnRbMHgleF0gaXMgYmlnZ2VyIgorCQkJCQkiIHRoYW4gbWF4IGV2ZW50IGNvdW50WzB4JXhdLlxuIiwKKwkJCQkJY291bnQsIE1BWF9FVkVOVFNfUkVUVVJORUQpOworCQkJcmV0dXJuOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlwYXJhbSA9ICZlci0+ZXZlbnRzW2ldOworCQkJbXZ1bWlfc2hvd19ldmVudChtaGJhLCBwYXJhbSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgbXZ1bWlfZ2V0X2V2ZW50KHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHVuc2lnbmVkIGNoYXIgbXNnKQoreworCXN0cnVjdCBtdnVtaV9jbWQgKmNtZDsKKwlzdHJ1Y3QgbXZ1bWlfbXNnX2ZyYW1lICpmcmFtZTsKKworCWNtZCA9IG12dW1pX2NyZWF0ZV9pbnRlcm5hbF9jbWQobWhiYSwgNTEyKTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIC0xOworCWNtZC0+c2NtZCA9IE5VTEw7CisJY21kLT5jbWRfc3RhdHVzID0gUkVRX1NUQVRVU19QRU5ESU5HOworCWF0b21pY19zZXQoJmNtZC0+c3luY19jbWQsIDApOworCWZyYW1lID0gY21kLT5mcmFtZTsKKwlmcmFtZS0+ZGV2aWNlX2lkID0gMDsKKwlmcmFtZS0+Y21kX2ZsYWcgPSBDTURfRkxBR19EQVRBX0lOOworCWZyYW1lLT5yZXFfZnVuY3Rpb24gPSBDTF9GVU5fU0NTSV9DTUQ7CisJZnJhbWUtPmNkYl9sZW5ndGggPSBNQVhfQ09NTUFORF9TSVpFOworCWZyYW1lLT5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbXZ1bWlfZXZlbnRfcmVxKTsKKwltZW1zZXQoZnJhbWUtPmNkYiwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CisJZnJhbWUtPmNkYlswXSA9IEFQSUNEQjBfRVZFTlQ7CisJZnJhbWUtPmNkYlsxXSA9IG1zZzsKKwltdnVtaV9pc3N1ZV9ibG9ja2VkX2NtZChtaGJhLCBjbWQpOworCisJaWYgKGNtZC0+Y21kX3N0YXR1cyAhPSBTQU1fU1RBVF9HT09EKQorCQlkZXZfZXJyKCZtaGJhLT5wZGV2LT5kZXYsICJnZXQgZXZlbnQgZmFpbGVkLCBzdGF0dXM9MHgleC5cbiIsCisJCQkJCQkJY21kLT5jbWRfc3RhdHVzKTsKKwllbHNlCisJCW12dW1pX25vdGlmaWNhdGlvbihtaGJhLCBjbWQtPmZyYW1lLT5jZGJbMV0sIGNtZC0+ZGF0YV9idWYpOworCisJbXZ1bWlfZGVsZXRlX2ludGVybmFsX2NtZChtaGJhLCBjbWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdnVtaV9zY2FuX2V2ZW50cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG12dW1pX2V2ZW50c193cSAqbXVfZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG12dW1pX2V2ZW50c193cSwgd29ya19xKTsKKworCW12dW1pX2dldF9ldmVudChtdV9ldi0+bWhiYSwgbXVfZXYtPmV2ZW50KTsKKwlrZnJlZShtdV9ldik7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX2xhdW5jaF9ldmVudHMoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwgdTggbXNnKQoreworCXN0cnVjdCBtdnVtaV9ldmVudHNfd3EgKm11X2V2OworCisJbXVfZXYgPSBremFsbG9jKHNpemVvZigqbXVfZXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAobXVfZXYpIHsKKwkJSU5JVF9XT1JLKCZtdV9ldi0+d29ya19xLCBtdnVtaV9zY2FuX2V2ZW50cyk7CisJCW11X2V2LT5taGJhID0gbWhiYTsKKwkJbXVfZXYtPmV2ZW50ID0gbXNnOworCQltdV9ldi0+cGFyYW0gPSBOVUxMOworCQlzY2hlZHVsZV93b3JrKCZtdV9ldi0+d29ya19xKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX2hhbmRsZV9jbG9iKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJc3RydWN0IG12dW1pX3JzcF9mcmFtZSAqb2JfZnJhbWU7CisJc3RydWN0IG12dW1pX2NtZCAqY21kOworCXN0cnVjdCBtdnVtaV9vYl9kYXRhICpwb29sOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtaGJhLT5mcmVlX29iX2xpc3QpKSB7CisJCXBvb2wgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtaGJhLT5mcmVlX29iX2xpc3QsCisJCQkJCQlzdHJ1Y3QgbXZ1bWlfb2JfZGF0YSwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnBvb2wtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwb29sLT5saXN0LCAmbWhiYS0+b2JfZGF0YV9saXN0KTsKKworCQlvYl9mcmFtZSA9IChzdHJ1Y3QgbXZ1bWlfcnNwX2ZyYW1lICopICZwb29sLT5kYXRhWzBdOworCQljbWQgPSBtaGJhLT50YWdfY21kW29iX2ZyYW1lLT50YWddOworCisJCWF0b21pY19kZWMoJm1oYmEtPmZ3X291dHN0YW5kaW5nKTsKKwkJbWhiYS0+dGFnX2NtZFtvYl9mcmFtZS0+dGFnXSA9IDA7CisJCXRhZ19yZWxlYXNlX29uZShtaGJhLCAmbWhiYS0+dGFnX3Bvb2wsIG9iX2ZyYW1lLT50YWcpOworCQlpZiAoY21kLT5zY21kKQorCQkJbXZ1bWlfY29tcGxldGVfY21kKG1oYmEsIGNtZCwgb2JfZnJhbWUpOworCQllbHNlCisJCQltdnVtaV9jb21wbGV0ZV9pbnRlcm5hbF9jbWQobWhiYSwgY21kLCBvYl9mcmFtZSk7CisJfQorCW1oYmEtPmluc3RhbmNldC0+ZmlyZV9jbWQobWhiYSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdnVtaV9pc3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZwKQoreworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmEgPSAoc3RydWN0IG12dW1pX2hiYSAqKSBkZXZwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtaGJhLT5zaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KG1oYmEtPmluc3RhbmNldC0+Y2xlYXJfaW50cihtaGJhKSB8fCAhbWhiYS0+Z2xvYmFsX2lzcikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtaGJhLT5zaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAobWhiYS0+Z2xvYmFsX2lzciAmIElOVF9NQVBfRExfQ1BVMlBDSUVBKSB7CisJCWlmIChtaGJhLT5pc3Jfc3RhdHVzICYgRFJCTF9IQU5EU0hBS0VfSVNSKSB7CisJCQlkZXZfd2FybigmbWhiYS0+cGRldi0+ZGV2LCAiZW50ZXIgaGFuZHNoYWtlIGFnYWluIVxuIik7CisJCQltdnVtaV9oYW5kc2hha2UobWhiYSk7CisJCX0KKwkJaWYgKG1oYmEtPmlzcl9zdGF0dXMgJiBEUkJMX0VWRU5UX05PVElGWSkKKwkJCW12dW1pX2xhdW5jaF9ldmVudHMobWhiYSwgQVBJQ0RCMV9FVkVOVF9HRVRFVkVOVCk7CisJfQorCisJaWYgKG1oYmEtPmdsb2JhbF9pc3IgJiBJTlRfTUFQX0NPTUFPVVQpCisJCW12dW1pX3JlY2VpdmVfb2JfbGlzdF9lbnRyeShtaGJhKTsKKworCW1oYmEtPmdsb2JhbF9pc3IgPSAwOworCW1oYmEtPmlzcl9zdGF0dXMgPSAwOworCWlmIChtaGJhLT5md19zdGF0ZSA9PSBGV19TVEFURV9TVEFSVEVEKQorCQltdnVtaV9oYW5kbGVfY2xvYihtaGJhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBlbnVtIG12dW1pX3FjX3Jlc3VsdCBtdnVtaV9zZW5kX2NvbW1hbmQoc3RydWN0IG12dW1pX2hiYSAqbWhiYSwKKwkJCQkJCXN0cnVjdCBtdnVtaV9jbWQgKmNtZCkKK3sKKwl2b2lkICppYl9lbnRyeTsKKwlzdHJ1Y3QgbXZ1bWlfbXNnX2ZyYW1lICppYl9mcmFtZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfbGVuOworCisJaWJfZnJhbWUgPSBjbWQtPmZyYW1lOworCWlmICh1bmxpa2VseShtaGJhLT5md19zdGF0ZSAhPSBGV19TVEFURV9TVEFSVEVEKSkgeworCQlkZXZfZGJnKCZtaGJhLT5wZGV2LT5kZXYsICJmaXJtd2FyZSBub3QgcmVhZHkuXG4iKTsKKwkJcmV0dXJuIE1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX05PX1JFU09VUkNFOworCX0KKwlpZiAodGFnX2lzX2VtcHR5KCZtaGJhLT50YWdfcG9vbCkpIHsKKwkJZGV2X2RiZygmbWhiYS0+cGRldi0+ZGV2LCAibm8gZnJlZSB0YWcuXG4iKTsKKwkJcmV0dXJuIE1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX05PX1JFU09VUkNFOworCX0KKwlpZiAobXZ1bWlfZ2V0X2liX2xpc3RfZW50cnkobWhiYSwgJmliX2VudHJ5KSkKKwkJcmV0dXJuIE1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX05PX1JFU09VUkNFOworCisJY21kLT5mcmFtZS0+dGFnID0gdGFnX2dldF9vbmUobWhiYSwgJm1oYmEtPnRhZ19wb29sKTsKKwljbWQtPmZyYW1lLT5yZXF1ZXN0X2lkID0gbWhiYS0+aW9fc2VxKys7CisJY21kLT5yZXF1ZXN0X2lkID0gY21kLT5mcmFtZS0+cmVxdWVzdF9pZDsKKwltaGJhLT50YWdfY21kW2NtZC0+ZnJhbWUtPnRhZ10gPSBjbWQ7CisJZnJhbWVfbGVuID0gc2l6ZW9mKCppYl9mcmFtZSkgLSA0ICsKKwkJCQlpYl9mcmFtZS0+c2dfY291bnRzICogc2l6ZW9mKHN0cnVjdCBtdnVtaV9zZ2wpOworCW1lbWNweShpYl9lbnRyeSwgaWJfZnJhbWUsIGZyYW1lX2xlbik7CisJcmV0dXJuIE1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX1NFTlQ7Cit9CisKK3N0YXRpYyB2b2lkIG12dW1pX2ZpcmVfY21kKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsIHN0cnVjdCBtdnVtaV9jbWQgKmNtZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBudW1fb2ZfY2xfc2VudCA9IDA7CisJZW51bSBtdnVtaV9xY19yZXN1bHQgcmVzdWx0OworCisJaWYgKGNtZCkKKwkJbGlzdF9hZGRfdGFpbCgmY21kLT5xdWV1ZV9wb2ludGVyLCAmbWhiYS0+d2FpdGluZ19yZXFfbGlzdCk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1oYmEtPndhaXRpbmdfcmVxX2xpc3QpKSB7CisJCWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJm1oYmEtPndhaXRpbmdfcmVxX2xpc3QsCisJCQkJCSBzdHJ1Y3QgbXZ1bWlfY21kLCBxdWV1ZV9wb2ludGVyKTsKKwkJbGlzdF9kZWxfaW5pdCgmY21kLT5xdWV1ZV9wb2ludGVyKTsKKwkJcmVzdWx0ID0gbXZ1bWlfc2VuZF9jb21tYW5kKG1oYmEsIGNtZCk7CisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgTVZfUVVFVUVfQ09NTUFORF9SRVNVTFRfU0VOVDoKKwkJCW51bV9vZl9jbF9zZW50Kys7CisJCQlicmVhazsKKwkJY2FzZSBNVl9RVUVVRV9DT01NQU5EX1JFU1VMVF9OT19SRVNPVVJDRToKKwkJCWxpc3RfYWRkKCZjbWQtPnF1ZXVlX3BvaW50ZXIsICZtaGJhLT53YWl0aW5nX3JlcV9saXN0KTsKKwkJCWlmIChudW1fb2ZfY2xfc2VudCA+IDApCisJCQkJbXZ1bWlfc2VuZF9pYl9saXN0X2VudHJ5KG1oYmEpOworCisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKG51bV9vZl9jbF9zZW50ID4gMCkKKwkJbXZ1bWlfc2VuZF9pYl9saXN0X2VudHJ5KG1oYmEpOworfQorCisvKioKKyAqIG12dW1pX2VuYWJsZV9pbnRyIC0JRW5hYmxlcyBpbnRlcnJ1cHRzCisgKiBAcmVnczoJCQlGVyByZWdpc3RlciBzZXQKKyAqLworc3RhdGljIHZvaWQgbXZ1bWlfZW5hYmxlX2ludHIodm9pZCAqcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCWlvd3JpdGUzMigweDNGRkZGRkZGLCByZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9NQVNLX1JFRyk7CisJbWFzayA9IGlvcmVhZDMyKHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworCW1hc2sgfD0gSU5UX01BUF9ETF9DUFUyUENJRUEgfCBJTlRfTUFQX0NPTUFPVVQgfCBJTlRfTUFQX0NPTUFFUlI7CisJaW93cml0ZTMyKG1hc2ssIHJlZ3MgKyBDUFVfRU5QT0lOVEFfTUFTS19SRUcpOworfQorCisvKioKKyAqIG12dW1pX2Rpc2FibGVfaW50ciAtRGlzYWJsZXMgaW50ZXJydXB0CisgKiBAcmVnczoJCQlGVyByZWdpc3RlciBzZXQKKyAqLworc3RhdGljIHZvaWQgbXZ1bWlfZGlzYWJsZV9pbnRyKHZvaWQgKnJlZ3MpCit7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlpb3dyaXRlMzIoMCwgcmVncyArIENQVV9BUk1fVE9fUENJRUFfTUFTS19SRUcpOworCW1hc2sgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKTsKKwltYXNrICY9IH4oSU5UX01BUF9ETF9DUFUyUENJRUEgfCBJTlRfTUFQX0NPTUFPVVQgfCBJTlRfTUFQX0NPTUFFUlIpOworCWlvd3JpdGUzMihtYXNrLCByZWdzICsgQ1BVX0VOUE9JTlRBX01BU0tfUkVHKTsKK30KKworc3RhdGljIGludCBtdnVtaV9jbGVhcl9pbnRyKHZvaWQgKmV4dGVuZCkKK3sKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhID0gKHN0cnVjdCBtdnVtaV9oYmEgKikgZXh0ZW5kOworCXVuc2lnbmVkIGludCBzdGF0dXMsIGlzcl9zdGF0dXMgPSAwLCB0bXAgPSAwOworCXZvaWQgKnJlZ3MgPSBtaGJhLT5tbWlvOworCisJc3RhdHVzID0gaW9yZWFkMzIocmVncyArIENQVV9NQUlOX0lOVF9DQVVTRV9SRUcpOworCWlmICghKHN0YXR1cyAmIElOVF9NQVBfTVUpIHx8IHN0YXR1cyA9PSAweEZGRkZGRkZGKQorCQlyZXR1cm4gMTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgSU5UX01BUF9DT01BRVJSKSkgeworCQl0bXAgPSBpb3JlYWQzMihyZWdzICsgQ0xBX0lTUl9DQVVTRSk7CisJCWlmICh0bXAgJiAoQ0xJQ19JTl9FUlJfSVJRIHwgQ0xJQ19PVVRfRVJSX0lSUSkpCisJCQlpb3dyaXRlMzIodG1wICYgKENMSUNfSU5fRVJSX0lSUSB8IENMSUNfT1VUX0VSUl9JUlEpLAorCQkJCQlyZWdzICsgQ0xBX0lTUl9DQVVTRSk7CisJCXN0YXR1cyBePSBJTlRfTUFQX0NPTUFFUlI7CisJCS8qIGluYm91bmQgb3Igb3V0Ym91bmQgcGFyaXR5IGVycm9yLCBjb21tYW5kIHdpbGwgdGltZW91dCAqLworCX0KKwlpZiAoc3RhdHVzICYgSU5UX01BUF9DT01BT1VUKSB7CisJCXRtcCA9IGlvcmVhZDMyKHJlZ3MgKyBDTEFfSVNSX0NBVVNFKTsKKwkJaWYgKHRtcCAmIENMSUNfT1VUX0lSUSkKKwkJCWlvd3JpdGUzMih0bXAgJiBDTElDX09VVF9JUlEsIHJlZ3MgKyBDTEFfSVNSX0NBVVNFKTsKKwl9CisJaWYgKHN0YXR1cyAmIElOVF9NQVBfRExfQ1BVMlBDSUVBKSB7CisJCWlzcl9zdGF0dXMgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9EUkJMX1JFRyk7CisJCWlmIChpc3Jfc3RhdHVzKQorCQkJaW93cml0ZTMyKGlzcl9zdGF0dXMsIHJlZ3MgKyBDUFVfQVJNX1RPX1BDSUVBX0RSQkxfUkVHKTsKKwl9CisKKwltaGJhLT5nbG9iYWxfaXNyID0gc3RhdHVzOworCW1oYmEtPmlzcl9zdGF0dXMgPSBpc3Jfc3RhdHVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbXZ1bWlfcmVhZF9md19zdGF0dXNfcmVnIC0gcmV0dXJucyB0aGUgY3VycmVudCBGVyBzdGF0dXMgdmFsdWUKKyAqIEByZWdzOgkJCUZXIHJlZ2lzdGVyIHNldAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG12dW1pX3JlYWRfZndfc3RhdHVzX3JlZyh2b2lkICpyZWdzKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpb3JlYWQzMihyZWdzICsgQ1BVX0FSTV9UT19QQ0lFQV9EUkJMX1JFRyk7CisJaWYgKHN0YXR1cykKKwkJaW93cml0ZTMyKHN0YXR1cywgcmVncyArIENQVV9BUk1fVE9fUENJRUFfRFJCTF9SRUcpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXZ1bWlfaW5zdGFuY2VfdGVtcGxhdGUgbXZ1bWlfaW5zdGFuY2VfdGVtcGxhdGUgPSB7CisJLmZpcmVfY21kID0gbXZ1bWlfZmlyZV9jbWQsCisJLmVuYWJsZV9pbnRyID0gbXZ1bWlfZW5hYmxlX2ludHIsCisJLmRpc2FibGVfaW50ciA9IG12dW1pX2Rpc2FibGVfaW50ciwKKwkuY2xlYXJfaW50ciA9IG12dW1pX2NsZWFyX2ludHIsCisJLnJlYWRfZndfc3RhdHVzX3JlZyA9IG12dW1pX3JlYWRfZndfc3RhdHVzX3JlZywKK307CisKK3N0YXRpYyBpbnQgbXZ1bWlfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhOworCXVuc2lnbmVkIGNoYXIgYml0Y291bnQgPSBzaXplb2YodW5zaWduZWQgY2hhcikgKiA4OworCisJbWhiYSA9IChzdHJ1Y3QgbXZ1bWlfaGJhICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCWlmIChzZGV2LT5pZCA+PSBtaGJhLT5tYXhfdGFyZ2V0X2lkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1oYmEtPnRhcmdldF9tYXBbc2Rldi0+aWQgLyBiaXRjb3VudF0gfD0gKDEgPDwgKHNkZXYtPmlkICUgYml0Y291bnQpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtdnVtaV9idWlsZF9mcmFtZSAtCVByZXBhcmVzIGEgZGlyZWN0IGNkYiAoRENEQikgY29tbWFuZAorICogQG1oYmE6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqIEBzY21kOgkJU0NTSSBjb21tYW5kCisgKiBAY21kOgkJQ29tbWFuZCB0byBiZSBwcmVwYXJlZCBpbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgQ0RCIGNvbW1hbmRzLiBUaGVzZSBhcmUgdHlwY2lhbGx5IHBhc3MtdGhyb3VnaAorICogY29tbWFuZHMgdG8gdGhlIGRldmljZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG12dW1pX2J1aWxkX2ZyYW1lKHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEsCisJCQkJc3RydWN0IHNjc2lfY21uZCAqc2NtZCwgc3RydWN0IG12dW1pX2NtZCAqY21kKQoreworCXN0cnVjdCBtdnVtaV9tc2dfZnJhbWUgKnBmcmFtZTsKKworCWNtZC0+c2NtZCA9IHNjbWQ7CisJY21kLT5jbWRfc3RhdHVzID0gUkVRX1NUQVRVU19QRU5ESU5HOworCXBmcmFtZSA9IGNtZC0+ZnJhbWU7CisJcGZyYW1lLT5kZXZpY2VfaWQgPSAoKHVuc2lnbmVkIHNob3J0KSBzY21kLT5kZXZpY2UtPmlkKSB8CisJCQkJKCgodW5zaWduZWQgc2hvcnQpIHNjbWQtPmRldmljZS0+bHVuKSA8PCA4KTsKKwlwZnJhbWUtPmNtZF9mbGFnID0gMDsKKworCXN3aXRjaCAoc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwljYXNlIERNQV9OT05FOgorCQlwZnJhbWUtPmNtZF9mbGFnIHw9IENNRF9GTEFHX05PTl9EQVRBOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJcGZyYW1lLT5jbWRfZmxhZyB8PSBDTURfRkxBR19EQVRBX0lOOworCQlicmVhazsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCXBmcmFtZS0+Y21kX2ZsYWcgfD0gQ01EX0ZMQUdfREFUQV9PVVQ7CisJCWJyZWFrOworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJm1oYmEtPnBkZXYtPmRldiwgInVuZXhwZWN0ZWQgZGF0YSBkaXJlY3Rpb25bJWRdICIKKwkJCSJjbWRbMHgleF1cbiIsIHNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uLCBzY21kLT5jbW5kWzBdKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwZnJhbWUtPmNkYl9sZW5ndGggPSBzY21kLT5jbWRfbGVuOworCW1lbWNweShwZnJhbWUtPmNkYiwgc2NtZC0+Y21uZCwgcGZyYW1lLT5jZGJfbGVuZ3RoKTsKKwlwZnJhbWUtPnJlcV9mdW5jdGlvbiA9IENMX0ZVTl9TQ1NJX0NNRDsKKwlpZiAoc2NzaV9idWZmbGVuKHNjbWQpKSB7CisJCWlmIChtdnVtaV9tYWtlX3NnbChtaGJhLCBzY21kLCAmcGZyYW1lLT5wYXlsb2FkWzBdLAorCQkJJnBmcmFtZS0+c2dfY291bnRzKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJcGZyYW1lLT5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IHNjc2lfYnVmZmxlbihzY21kKTsKKwl9IGVsc2UgeworCQlwZnJhbWUtPnNnX2NvdW50cyA9IDA7CisJCXBmcmFtZS0+ZGF0YV90cmFuc2Zlcl9sZW5ndGggPSAwOworCX0KKwlyZXR1cm4gMDsKKworZXJyb3I6CisJc2NtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8CisJCVNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwlzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcigwLCBzY21kLT5zZW5zZV9idWZmZXIsIElMTEVHQUxfUkVRVUVTVCwgMHgyNCwKKwkJCQkJCQkJCTApOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBtdnVtaV9xdWV1ZV9jb21tYW5kIC0JUXVldWUgZW50cnkgcG9pbnQKKyAqIEBzY21kOgkJCVNDU0kgY29tbWFuZCB0byBiZSBxdWV1ZWQKKyAqIEBkb25lOgkJCUNhbGxiYWNrIGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyBpbnQgbXZ1bWlfcXVldWVfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzdHJ1Y3QgbXZ1bWlfY21kICpjbWQ7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYTsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGlycV9mbGFncyk7CisJc2NzaV9jbWRfZ2V0X3NlcmlhbChzaG9zdCwgc2NtZCk7CisKKwltaGJhID0gKHN0cnVjdCBtdnVtaV9oYmEgKikgc2hvc3QtPmhvc3RkYXRhOworCXNjbWQtPnJlc3VsdCA9IDA7CisJY21kID0gbXZ1bWlfZ2V0X2NtZChtaGJhKTsKKwlpZiAodW5saWtlbHkoIWNtZCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBpcnFfZmxhZ3MpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CisKKwlpZiAodW5saWtlbHkobXZ1bWlfYnVpbGRfZnJhbWUobWhiYSwgc2NtZCwgY21kKSkpCisJCWdvdG8gb3V0X3JldHVybl9jbWQ7CisKKwljbWQtPnNjbWQgPSBzY21kOworCXNjbWQtPlNDcC5wdHIgPSAoY2hhciAqKSBjbWQ7CisJbWhiYS0+aW5zdGFuY2V0LT5maXJlX2NtZChtaGJhLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKKworb3V0X3JldHVybl9jbWQ6CisJbXZ1bWlfcmV0dXJuX2NtZChtaGJhLCBjbWQpOworCXNjbWQtPnNjc2lfZG9uZShzY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gbXZ1bWlfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCit7CisJc3RydWN0IG12dW1pX2NtZCAqY21kID0gKHN0cnVjdCBtdnVtaV9jbWQgKikgc2NtZC0+U0NwLnB0cjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2NtZC0+ZGV2aWNlLT5ob3N0OworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmEgPSBzaG9zdF9wcml2KGhvc3QpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtaGJhLT5zaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAobWhiYS0+dGFnX2NtZFtjbWQtPmZyYW1lLT50YWddKSB7CisJCW1oYmEtPnRhZ19jbWRbY21kLT5mcmFtZS0+dGFnXSA9IDA7CisJCXRhZ19yZWxlYXNlX29uZShtaGJhLCAmbWhiYS0+dGFnX3Bvb2wsIGNtZC0+ZnJhbWUtPnRhZyk7CisJfQorCWlmICghbGlzdF9lbXB0eSgmY21kLT5xdWV1ZV9wb2ludGVyKSkKKwkJbGlzdF9kZWxfaW5pdCgmY21kLT5xdWV1ZV9wb2ludGVyKTsKKwllbHNlCisJCWF0b21pY19kZWMoJm1oYmEtPmZ3X291dHN0YW5kaW5nKTsKKworCXNjbWQtPnJlc3VsdCA9IChEUklWRVJfSU5WQUxJRCA8PCAyNCkgfCAoRElEX0FCT1JUIDw8IDE2KTsKKwlzY21kLT5TQ3AucHRyID0gTlVMTDsKKwlpZiAoc2NzaV9idWZmbGVuKHNjbWQpKSB7CisJCWlmIChzY3NpX3NnX2NvdW50KHNjbWQpKSB7CisJCQlwY2lfdW5tYXBfc2cobWhiYS0+cGRldiwKKwkJCQlzY3NpX3NnbGlzdChzY21kKSwKKwkJCQlzY3NpX3NnX2NvdW50KHNjbWQpLAorCQkJCShpbnQpc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJcGNpX3VubWFwX3NpbmdsZShtaGJhLT5wZGV2LAorCQkJCXNjbWQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCXNjc2lfYnVmZmxlbihzY21kKSwKKwkJCQkoaW50KXNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQkJc2NtZC0+U0NwLmRtYV9oYW5kbGUgPSAwOworCQl9CisJfQorCW12dW1pX3JldHVybl9jbWQobWhiYSwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1oYmEtPnNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBCTEtfRUhfTk9UX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK212dW1pX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pCit7CisJaW50IGhlYWRzLCBzZWN0b3JzOworCXNlY3Rvcl90IGN5bGluZGVyczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWhlYWRzID0gNjQ7CisJc2VjdG9ycyA9IDMyOworCXRtcCA9IGhlYWRzICogc2VjdG9yczsKKwljeWxpbmRlcnMgPSBjYXBhY2l0eTsKKwlzZWN0b3JfZGl2KGN5bGluZGVycywgdG1wKTsKKworCWlmIChjYXBhY2l0eSA+PSAweDIwMDAwMCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQl0bXAgPSBoZWFkcyAqIHNlY3RvcnM7CisJCWN5bGluZGVycyA9IGNhcGFjaXR5OworCQlzZWN0b3JfZGl2KGN5bGluZGVycywgdG1wKTsKKwl9CisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXZ1bWlfdGVtcGxhdGUgPSB7CisKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiTWFydmVsbCBTdG9yYWdlIENvbnRyb2xsZXIiLAorCS5zbGF2ZV9jb25maWd1cmUgPSBtdnVtaV9zbGF2ZV9jb25maWd1cmUsCisJLnF1ZXVlY29tbWFuZCA9IG12dW1pX3F1ZXVlX2NvbW1hbmQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlciA9IG12dW1pX2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0gPSBtdnVtaV9iaW9zX3BhcmFtLAorCS50aGlzX2lkID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIG12dW1pX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHsKKwkuZWhfdGltZWRfb3V0ID0gbXZ1bWlfdGltZWRfb3V0LAorfTsKKworLyoqCisgKiBtdnVtaV9pbml0X2Z3IC0JSW5pdGlhbGl6ZXMgdGhlIEZXCisgKiBAbWhiYToJCUFkYXB0ZXIgc29mdCBzdGF0ZQorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gZm9yIGluaXRpYWxpemluZyBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludCBtdnVtaV9pbml0X2Z3KHN0cnVjdCBtdnVtaV9oYmEgKm1oYmEpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhtaGJhLT5wZGV2LCBNVl9EUklWRVJfTkFNRSkpIHsKKwkJZGV2X2VycigmbWhiYS0+cGRldi0+ZGV2LCAiSU8gbWVtb3J5IHJlZ2lvbiBidXN5IVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldCA9IG12dW1pX21hcF9wY2lfYWRkcihtaGJhLT5wZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9pb3JlbWFwOworCisJbWhiYS0+bW1pbyA9IG1oYmEtPmJhc2VfYWRkclswXTsKKworCXN3aXRjaCAobWhiYS0+cGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfTVY5MTQzOgorCQltaGJhLT5pbnN0YW5jZXQgPSAmbXZ1bWlfaW5zdGFuY2VfdGVtcGxhdGU7CisJCW1oYmEtPmlvX3NlcSA9IDA7CisJCW1oYmEtPm1heF9zZ2UgPSBNVlVNSV9NQVhfU0dfRU5UUlk7CisJCW1oYmEtPnJlcXVlc3RfaWRfZW5hYmxlZCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgImRldmljZSAweCV4IG5vdCBzdXBwb3J0ZWQhXG4iLAorCQkJCQkJCW1oYmEtPnBkZXYtPmRldmljZSk7CisJCW1oYmEtPmluc3RhbmNldCA9IE5VTEw7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9hbGxvY19tZW07CisJfQorCWRldl9kYmcoJm1oYmEtPnBkZXYtPmRldiwgImRldmljZSBpZCA6ICUwNFggaXMgZm91bmQuXG4iLAorCQkJCQkJCW1oYmEtPnBkZXYtPmRldmljZSk7CisKKwltaGJhLT5oYW5kc2hha2VfcGFnZSA9IGt6YWxsb2MoSFNQX01BWF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1oYmEtPmhhbmRzaGFrZV9wYWdlKSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBoYW5kc2hha2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2NfbWVtOworCX0KKwltaGJhLT5oYW5kc2hha2VfcGFnZV9waHlzID0gdmlydF90b19waHlzKG1oYmEtPmhhbmRzaGFrZV9wYWdlKTsKKworCWlmIChtdnVtaV9zdGFydChtaGJhKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfcmVhZHlfc3RhdGU7CisJfQorCXJldCA9IG12dW1pX2FsbG9jX2NtZHMobWhiYSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3JlYWR5X3N0YXRlOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcmVhZHlfc3RhdGU6CisJbXZ1bWlfcmVsZWFzZV9tZW1fcmVzb3VyY2UobWhiYSk7CisJa2ZyZWUobWhiYS0+aGFuZHNoYWtlX3BhZ2UpOworZmFpbF9hbGxvY19tZW06CisJbXZ1bWlfdW5tYXBfcGNpX2FkZHIobWhiYS0+cGRldiwgbWhiYS0+YmFzZV9hZGRyKTsKK2ZhaWxfaW9yZW1hcDoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKG1oYmEtPnBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtdnVtaV9pb19hdHRhY2ggLQlBdHRhY2hlcyB0aGlzIGRyaXZlciB0byBTQ1NJIG1pZC1sYXllcgorICogQG1oYmE6CQlBZGFwdGVyIHNvZnQgc3RhdGUKKyAqLworc3RhdGljIGludCBtdnVtaV9pb19hdHRhY2goc3RydWN0IG12dW1pX2hiYSAqbWhiYSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gbWhiYS0+c2hvc3Q7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NnID0gKG1oYmEtPmliX21heF9zaXplICsgNCAtCisJCXNpemVvZihzdHJ1Y3QgbXZ1bWlfbXNnX2ZyYW1lKSkgLyBzaXplb2Yoc3RydWN0IG12dW1pX3NnbCk7CisKKwlob3N0LT5pcnEgPSBtaGJhLT5wZGV2LT5pcnE7CisJaG9zdC0+dW5pcXVlX2lkID0gbWhiYS0+dW5pcXVlX2lkOworCWhvc3QtPmNhbl9xdWV1ZSA9IChtaGJhLT5tYXhfaW8gLSAxKSA/IChtaGJhLT5tYXhfaW8gLSAxKSA6IDE7CisJaG9zdC0+c2dfdGFibGVzaXplID0gbWhiYS0+bWF4X3NnZSA+IG1heF9zZyA/IG1heF9zZyA6IG1oYmEtPm1heF9zZ2U7CisJaG9zdC0+bWF4X3NlY3RvcnMgPSBtaGJhLT5tYXhfdHJhbnNmZXJfc2l6ZSAvIDUxMjsKKwlob3N0LT5jbWRfcGVyX2x1biA9ICAobWhiYS0+bWF4X2lvIC0gMSkgPyAobWhiYS0+bWF4X2lvIC0gMSkgOiAxOworCWhvc3QtPm1heF9pZCA9IG1oYmEtPm1heF90YXJnZXRfaWQ7CisJaG9zdC0+bWF4X2NtZF9sZW4gPSBNQVhfQ09NTUFORF9TSVpFOworCWhvc3QtPnRyYW5zcG9ydHQgPSAmbXZ1bWlfdHJhbnNwb3J0X3RlbXBsYXRlOworCisJcmV0ID0gc2NzaV9hZGRfaG9zdChob3N0LCAmbWhiYS0+cGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJm1oYmEtPnBkZXYtPmRldiwgInNjc2lfYWRkX2hvc3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbWhiYS0+ZndfZmxhZyB8PSBNVlVNSV9GV19BVFRBQ0g7CisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBtdnVtaV9wcm9iZV9vbmUgLQlQQ0kgaG90cGx1ZyBlbnRyeSBwb2ludAorICogQHBkZXY6CQlQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICogQGlkOgkJCVBDSSBpZHMgb2Ygc3VwcG9ydGVkIGhvdHBsdWdnZWQgYWRhcHRlcgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtdnVtaV9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmE7CisJaW50IHJldDsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiAlIzQuMDR4OiUjNC4wNHg6JSM0LjA0eDolIzQuMDR4OiAiLAorCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCisJCQlwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChJU19ETUE2NCkgeworCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGZhaWxfc2V0X2RtYV9tYXNrOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbF9zZXRfZG1hX21hc2s7CisJfQorCisJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmbXZ1bWlfdGVtcGxhdGUsIHNpemVvZigqbWhiYSkpOworCWlmICghaG9zdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzY3NpX2hvc3RfYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jX2luc3RhbmNlOworCX0KKwltaGJhID0gc2hvc3RfcHJpdihob3N0KTsKKworCUlOSVRfTElTVF9IRUFEKCZtaGJhLT5jbWRfcG9vbCk7CisJSU5JVF9MSVNUX0hFQUQoJm1oYmEtPm9iX2RhdGFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm1oYmEtPmZyZWVfb2JfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm1oYmEtPnJlc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWhiYS0+d2FpdGluZ19yZXFfbGlzdCk7CisJYXRvbWljX3NldCgmbWhiYS0+Zndfb3V0c3RhbmRpbmcsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1oYmEtPmludF9jbWRfd2FpdF9xKTsKKworCW1oYmEtPnBkZXYgPSBwZGV2OworCW1oYmEtPnNob3N0ID0gaG9zdDsKKwltaGJhLT51bmlxdWVfaWQgPSBwZGV2LT5idXMtPm51bWJlciA8PCA4IHwgcGRldi0+ZGV2Zm47CisKKwlyZXQgPSBtdnVtaV9pbml0X2Z3KG1oYmEpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9pbml0X2Z3OworCisJcmV0ID0gcmVxdWVzdF9pcnEobWhiYS0+cGRldi0+aXJxLCBtdnVtaV9pc3JfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJIm12dW1pIiwgbWhiYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJZ290byBmYWlsX2luaXRfaXJxOworCX0KKwltaGJhLT5pbnN0YW5jZXQtPmVuYWJsZV9pbnRyKG1oYmEtPm1taW8pOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBtaGJhKTsKKworCXJldCA9IG12dW1pX2lvX2F0dGFjaChtaGJhKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfaW9fYXR0YWNoOworCWRldl9kYmcoJnBkZXYtPmRldiwgInByb2JlIG12dW1pIGRyaXZlciBzdWNjZXNzZnVsbHkuXG4iKTsKKworCXJldHVybiAwOworCitmYWlsX2lvX2F0dGFjaDoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJbWhiYS0+aW5zdGFuY2V0LT5kaXNhYmxlX2ludHIobWhiYS0+bW1pbyk7CisJZnJlZV9pcnEobWhiYS0+cGRldi0+aXJxLCBtaGJhKTsKK2ZhaWxfaW5pdF9pcnE6CisJbXZ1bWlfcmVsZWFzZV9mdyhtaGJhKTsKK2ZhaWxfaW5pdF9mdzoKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCitmYWlsX2FsbG9jX2luc3RhbmNlOgorZmFpbF9zZXRfZG1hX21hc2s6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXZ1bWlfZGV0YWNoX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmE7CisKKwltaGJhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWhvc3QgPSBtaGJhLT5zaG9zdDsKKwlzY3NpX3JlbW92ZV9ob3N0KG1oYmEtPnNob3N0KTsKKwltdnVtaV9mbHVzaF9jYWNoZShtaGJhKTsKKworCW1oYmEtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKG1oYmEtPm1taW8pOworCWZyZWVfaXJxKG1oYmEtPnBkZXYtPmlycSwgbWhiYSk7CisJbXZ1bWlfcmVsZWFzZV9mdyhtaGJhKTsKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiZHJpdmVyIGlzIHJlbW92ZWQhXG4iKTsKK30KKworLyoqCisgKiBtdnVtaV9zaHV0ZG93biAtCVNodXRkb3duIGVudHJ5IHBvaW50CisgKiBAZGV2aWNlOgkJR2VuZXJpYyBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG12dW1pX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmEgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwltdnVtaV9mbHVzaF9jYWNoZShtaGJhKTsKK30KKworc3RhdGljIGludCBtdnVtaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG12dW1pX2hiYSAqbWhiYSA9IE5VTEw7CisKKwltaGJhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW12dW1pX2ZsdXNoX2NhY2hlKG1oYmEpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG1oYmEpOworCW1oYmEtPmluc3RhbmNldC0+ZGlzYWJsZV9pbnRyKG1oYmEtPm1taW8pOworCWZyZWVfaXJxKG1oYmEtPnBkZXYtPmlycSwgbWhiYSk7CisJbXZ1bWlfdW5tYXBfcGNpX2FkZHIocGRldiwgbWhiYS0+YmFzZV9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12dW1pX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtdnVtaV9oYmEgKm1oYmEgPSBOVUxMOworCisJbWhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hYmxlIGRldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlpZiAoSVNfRE1BNjQpIHsKKwkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhtaGJhLT5wZGV2LCBNVl9EUklWRVJfTkFNRSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCXJldCA9IG12dW1pX21hcF9wY2lfYWRkcihtaGJhLT5wZGV2LCBtaGJhLT5iYXNlX2FkZHIpOworCWlmIChyZXQpCisJCWdvdG8gcmVsZWFzZV9yZWdpb25zOworCisJbWhiYS0+bW1pbyA9IG1oYmEtPmJhc2VfYWRkclswXTsKKwltdnVtaV9yZXNldChtaGJhLT5tbWlvKTsKKworCWlmIChtdnVtaV9zdGFydChtaGJhKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubWFwX3BjaV9hZGRyOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKG1oYmEtPnBkZXYtPmlycSwgbXZ1bWlfaXNyX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJCSJtdnVtaSIsIG1oYmEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7CisJCWdvdG8gdW5tYXBfcGNpX2FkZHI7CisJfQorCW1oYmEtPmluc3RhbmNldC0+ZW5hYmxlX2ludHIobWhiYS0+bW1pbyk7CisKKwlyZXR1cm4gMDsKKwordW5tYXBfcGNpX2FkZHI6CisJbXZ1bWlfdW5tYXBfcGNpX2FkZHIocGRldiwgbWhiYS0+YmFzZV9hZGRyKTsKK3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZmFpbDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbXZ1bWlfcGNpX2RyaXZlciA9IHsKKworCS5uYW1lID0gTVZfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0gbXZ1bWlfcGNpX3RhYmxlLAorCS5wcm9iZSA9IG12dW1pX3Byb2JlX29uZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXZ1bWlfZGV0YWNoX29uZSksCisJLnNodXRkb3duID0gbXZ1bWlfc2h1dGRvd24sCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBtdnVtaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBtdnVtaV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qKgorICogbXZ1bWlfaW5pdCAtIERyaXZlciBsb2FkIGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG12dW1pX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXZ1bWlfcGNpX2RyaXZlcik7Cit9CisKKy8qKgorICogbXZ1bWlfZXhpdCAtIERyaXZlciB1bmxvYWQgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IG12dW1pX2V4aXQodm9pZCkKK3sKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbXZ1bWlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG12dW1pX2luaXQpOworbW9kdWxlX2V4aXQobXZ1bWlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZ1bWkuaCBiL2RyaXZlcnMvc2NzaS9tdnVtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjkyMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL212dW1pLmgKQEAgLTAsMCArMSw1MDUgQEAKKy8qCisgICogTWFydmVsbCBVTUkgaGVhZCBmaWxlCisgICoKKyAgKiBDb3B5cmlnaHQgMjAxMSBNYXJ2ZWxsLiA8anlsaUBtYXJ2ZWxsLmNvbT4KKyAgKgorICAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciBHUEx2Mi4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCisgICogTGljZW5zZS4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICoKKyAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICAqIFVTQQorICovCisKKyNpZm5kZWYgTVZVTUlfSAorI2RlZmluZSBNVlVNSV9ICisKKyNkZWZpbmUgTUFYX0JBU0VfQUREUkVTUwk2CisKKyNkZWZpbmUgVkVSX01BSk9SCQkxCisjZGVmaW5lIFZFUl9NSU5PUgkJMQorI2RlZmluZSBWRVJfT0VNCQkJMAorI2RlZmluZSBWRVJfQlVJTEQJCTE1MDAKKworI2RlZmluZSBNVl9EUklWRVJfTkFNRQkJCSJtdnVtaSIKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQVJWRUxMXzIJCTB4MWI0YgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfTVY5MTQzCTB4OTE0MworCisjZGVmaW5lIE1WVU1JX0lOVEVSTkFMX0NNRF9XQUlUX1RJTUUJNDUKKworI2RlZmluZSBJU19ETUE2NAkJCShzaXplb2YoZG1hX2FkZHJfdCkgPT0gOCkKKworZW51bSBtdnVtaV9xY19yZXN1bHQgeworCU1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX1NFTlQJPSAwLAorCU1WX1FVRVVFX0NPTU1BTkRfUkVTVUxUX05PX1JFU09VUkNFLAorfTsKKworZW51bSB7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBBUk0gTWJ1cyBSZWdpc3RlcnMgTWFwCSovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlDUFVfTUFJTl9JTlRfQ0FVU0VfUkVHCT0gMHgyMDIwMCwKKwlDUFVfTUFJTl9JUlFfTUFTS19SRUcJPSAweDIwMjA0LAorCUNQVV9NQUlOX0ZJUV9NQVNLX1JFRwk9IDB4MjAyMDgsCisJQ1BVX0VOUE9JTlRBX01BU0tfUkVHCT0gMHgyMDIwQywKKwlDUFVfRU5QT0lOVEJfTUFTS19SRUcJPSAweDIwMjEwLAorCisJSU5UX01BUF9DT01BRVJSCQk9IDEgPDwgNiwKKwlJTlRfTUFQX0NPTUFJTgkJPSAxIDw8IDcsCisJSU5UX01BUF9DT01BT1VUCQk9IDEgPDwgOCwKKwlJTlRfTUFQX0NPTUJFUlIJCT0gMSA8PCA5LAorCUlOVF9NQVBfQ09NQklOCQk9IDEgPDwgMTAsCisJSU5UX01BUF9DT01CT1VUCQk9IDEgPDwgMTEsCisKKwlJTlRfTUFQX0NPTUFJTlQJPSAoSU5UX01BUF9DT01BT1VUIHwgSU5UX01BUF9DT01BRVJSKSwKKwlJTlRfTUFQX0NPTUJJTlQJPSAoSU5UX01BUF9DT01CT1VUIHwgSU5UX01BUF9DT01CSU4gfCBJTlRfTUFQX0NPTUJFUlIpLAorCisJSU5UX01BUF9ETF9QQ0lFQTJDUFUJPSAxIDw8IDAsCisJSU5UX01BUF9ETF9DUFUyUENJRUEJPSAxIDw8IDEsCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogQVJNIERvb3JiZWxsIFJlZ2lzdGVycyBNYXAJCSovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCUNQVV9QQ0lFQV9UT19BUk1fRFJCTF9SRUcJPSAweDIwNDAwLAorCUNQVV9QQ0lFQV9UT19BUk1fTUFTS19SRUcJPSAweDIwNDA0LAorCUNQVV9BUk1fVE9fUENJRUFfRFJCTF9SRUcJPSAweDIwNDA4LAorCUNQVV9BUk1fVE9fUENJRUFfTUFTS19SRUcJPSAweDIwNDBDLAorCisJRFJCTF9IQU5EU0hBS0UJCQk9IDEgPDwgMCwKKwlEUkJMX1NPRlRfUkVTRVQJCQk9IDEgPDwgMSwKKwlEUkJMX0JVU19DSEFOR0UJCQk9IDEgPDwgMiwKKwlEUkJMX0VWRU5UX05PVElGWQkJPSAxIDw8IDMsCisJRFJCTF9NVV9SRVNFVAkJCT0gMSA8PCA0LAorCURSQkxfSEFORFNIQUtFX0lTUgkJPSBEUkJMX0hBTkRTSEFLRSwKKworCUNQVV9QQ0lFQV9UT19BUk1fTVNHMAkJPSAweDIwNDMwLAorCUNQVV9QQ0lFQV9UT19BUk1fTVNHMQkJPSAweDIwNDM0LAorCUNQVV9BUk1fVE9fUENJRUFfTVNHMAkJPSAweDIwNDM4LAorCUNQVV9BUk1fVE9fUENJRUFfTVNHMQkJPSAweDIwNDNDLAorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBBUk0gQ29tbXVuaWNhdGlvbiBMaXN0IFJlZ2lzdGVycyBNYXAgICAgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCUNMQV9JTkJfTElTVF9CQVNFTAkJPSAweDUwMCwKKwlDTEFfSU5CX0xJU1RfQkFTRUgJCT0gMHg1MDQsCisJQ0xBX0lOQl9BVkFMX0NPVU5UX0JBU0VMCT0gMHg1MDgsCisJQ0xBX0lOQl9BVkFMX0NPVU5UX0JBU0VICT0gMHg1MEMsCisJQ0xBX0lOQl9ERVNUSV9MSVNUX0JBU0VMCT0gMHg1MTAsCisJQ0xBX0lOQl9ERVNUSV9MSVNUX0JBU0VICT0gMHg1MTQsCisJQ0xBX0lOQl9XUklURV9QT0lOVEVSCQk9IDB4NTE4LAorCUNMQV9JTkJfUkVBRF9QT0lOVEVSCQk9IDB4NTFDLAorCisJQ0xBX09VVEJfTElTVF9CQVNFTAkJPSAweDUzMCwKKwlDTEFfT1VUQl9MSVNUX0JBU0VICQk9IDB4NTM0LAorCUNMQV9PVVRCX1NPVVJDRV9MSVNUX0JBU0VMCT0gMHg1MzgsCisJQ0xBX09VVEJfU09VUkNFX0xJU1RfQkFTRUgJPSAweDUzQywKKwlDTEFfT1VUQl9DT1BZX1BPSU5URVIJCT0gMHg1NDQsCisJQ0xBX09VVEJfUkVBRF9QT0lOVEVSCQk9IDB4NTQ4LAorCisJQ0xBX0lTUl9DQVVTRQkJCT0gMHg1NjAsCisJQ0xBX0lTUl9NQVNLCQkJPSAweDU2NCwKKworCUlOVF9NQVBfTVUJCT0gKElOVF9NQVBfRExfQ1BVMlBDSUVBIHwgSU5UX01BUF9DT01BSU5UKSwKKworCUNMX1BPSU5URVJfVE9HR0xFCQk9IDEgPDwgMTIsCisKKwlDTElDX0lOX0lSUQkJCT0gMSA8PCAwLAorCUNMSUNfT1VUX0lSUQkJCT0gMSA8PCAxLAorCUNMSUNfSU5fRVJSX0lSUQkJCT0gMSA8PCA4LAorCUNMSUNfT1VUX0VSUl9JUlEJCT0gMSA8PCAxMiwKKworCUNMX1NMT1RfTlVNX01BU0sJCT0gMHhGRkYsCisKKwkvKgorCSogQ29tbWFuZCBmbGFnIGlzIHRoZSBmbGFnIGZvciB0aGUgQ0RCIGNvbW1hbmQgaXRzZWxmCisJKi8KKwkvKiAxLW5vbiBkYXRhOyAwLWRhdGEgY29tbWFuZCAqLworCUNNRF9GTEFHX05PTl9EQVRBCQk9IDEgPDwgMCwKKwlDTURfRkxBR19ETUEJCQk9IDEgPDwgMSwKKwlDTURfRkxBR19QSU8JCQk9IDEgPDwgMiwKKwkvKiAxLWhvc3QgcmVhZCBkYXRhICovCisJQ01EX0ZMQUdfREFUQV9JTgkJPSAxIDw8IDMsCisJLyogMS1ob3N0IHdyaXRlIGRhdGEgKi8KKwlDTURfRkxBR19EQVRBX09VVAkJPSAxIDw8IDQsCisKKwlTQ1NJX0NNRF9NQVJWRUxMX1NQRUNJRklDCT0gMHhFMSwKKwlDREJfQ09SRV9TSFVURE9XTgkJPSAweEIsCit9OworCisjZGVmaW5lIEFQSUNEQjBfRVZFTlQJCQkweEY0CisjZGVmaW5lIEFQSUNEQjFfRVZFTlRfR0VURVZFTlQJCTAKKyNkZWZpbmUgTUFYX0VWRU5UU19SRVRVUk5FRAkJNgorCitzdHJ1Y3QgbXZ1bWlfZHJpdmVyX2V2ZW50IHsKKwl1MzIJdGltZV9zdGFtcDsKKwl1MzIJc2VxdWVuY2Vfbm87CisJdTMyCWV2ZW50X2lkOworCXU4CXNldmVyaXR5OworCXU4CXBhcmFtX2NvdW50OworCXUxNglkZXZpY2VfaWQ7CisJdTMyCXBhcmFtc1s0XTsKKwl1OAlzZW5zZV9kYXRhX2xlbmd0aDsKKwl1OAlSZXNlcnZlZDE7CisJdTgJc2Vuc2VfZGF0YVszMF07Cit9OworCitzdHJ1Y3QgbXZ1bWlfZXZlbnRfcmVxIHsKKwl1bnNpZ25lZCBjaGFyCWNvdW50OworCXVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWRbM107CisJc3RydWN0IG12dW1pX2RyaXZlcl9ldmVudCAgZXZlbnRzW01BWF9FVkVOVFNfUkVUVVJORURdOworfTsKKworc3RydWN0IG12dW1pX2V2ZW50c193cSB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfcTsKKwlzdHJ1Y3QgbXZ1bWlfaGJhICptaGJhOworCXVuc2lnbmVkIGludCBldmVudDsKKwl2b2lkICpwYXJhbTsKK307CisKKyNkZWZpbmUgTVZVTUlfTUFYX1NHX0VOVFJZCTMyCisjZGVmaW5lIFNHRF9FT1QJCQkoMUwgPDwgMjcpCisKK3N0cnVjdCBtdnVtaV9zZ2wgeworCXUzMgliYXNlYWRkcl9sOworCXUzMgliYXNlYWRkcl9oOworCXUzMglmbGFnczsKKwl1MzIJc2l6ZTsKK307CisKK3N0cnVjdCBtdnVtaV9yZXMgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJZG1hX2FkZHJfdCBidXNfYWRkcjsKKwl2b2lkICp2aXJ0X2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsJLyogZW51bSBSZXNvdXJjZV9UeXBlICovCit9OworCisvKiBSZXNvdXJjZSB0eXBlICovCitlbnVtIHJlc291cmNlX3R5cGUgeworCVJFU09VUkNFX0NBQ0hFRF9NRU1PUlkgPSAwLAorCVJFU09VUkNFX1VOQ0FDSEVEX01FTU9SWQorfTsKKworc3RydWN0IG12dW1pX3NlbnNlX2RhdGEgeworCXU4IGVycm9yX2VvZGU6NzsKKwl1OCB2YWxpZDoxOworCXU4IHNlZ21lbnRfbnVtYmVyOworCXU4IHNlbnNlX2tleTo0OworCXU4IHJlc2VydmVkOjE7CisJdTggaW5jb3JyZWN0X2xlbmd0aDoxOworCXU4IGVuZF9vZl9tZWRpYToxOworCXU4IGZpbGVfbWFyazoxOworCXU4IGluZm9ybWF0aW9uWzRdOworCXU4IGFkZGl0aW9uYWxfc2Vuc2VfbGVuZ3RoOworCXU4IGNvbW1hbmRfc3BlY2lmaWNfaW5mb3JtYXRpb25bNF07CisJdTggYWRkaXRpb25hbF9zZW5zZV9jb2RlOworCXU4IGFkZGl0aW9uYWxfc2Vuc2VfY29kZV9xdWFsaWZpZXI7CisJdTggZmllbGRfcmVwbGFjZWFibGVfdW5pdF9jb2RlOworCXU4IHNlbnNlX2tleV9zcGVjaWZpY1szXTsKK307CisKKy8qIFJlcXVlc3QgaW5pdGlhdG9yIG11c3Qgc2V0IHRoZSBzdGF0dXMgdG8gUkVRX1NUQVRVU19QRU5ESU5HLiAqLworI2RlZmluZSBSRVFfU1RBVFVTX1BFTkRJTkcJCTB4ODAKKworc3RydWN0IG12dW1pX2NtZCB7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9wb2ludGVyOworCXN0cnVjdCBtdnVtaV9tc2dfZnJhbWUgKmZyYW1lOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisJYXRvbWljX3Qgc3luY19jbWQ7CisJdm9pZCAqZGF0YV9idWY7CisJdW5zaWduZWQgc2hvcnQgcmVxdWVzdF9pZDsKKwl1bnNpZ25lZCBjaGFyIGNtZF9zdGF0dXM7Cit9OworCisvKgorICogdGhlIGZ1bmN0aW9uIHR5cGUgb2YgdGhlIGluIGJvdW5kIGZyYW1lCisgKi8KKyNkZWZpbmUgQ0xfRlVOX1NDU0lfQ01ECQkJMHgxCisKK3N0cnVjdCBtdnVtaV9tc2dfZnJhbWUgeworCXUxNiBkZXZpY2VfaWQ7CisJdTE2IHRhZzsKKwl1OCBjbWRfZmxhZzsKKwl1OCByZXFfZnVuY3Rpb247CisJdTggY2RiX2xlbmd0aDsKKwl1OCBzZ19jb3VudHM7CisJdTMyIGRhdGFfdHJhbnNmZXJfbGVuZ3RoOworCXUxNiByZXF1ZXN0X2lkOworCXUxNiByZXNlcnZlZDE7CisJdTggY2RiW01BWF9DT01NQU5EX1NJWkVdOworCXUzMiBwYXlsb2FkWzFdOworfTsKKworLyoKKyAqIHRoZSByZXNwb25kIGZsYWcgZm9yIGRhdGFfcGF5bG9hZCBvZiB0aGUgb3V0IGJvdW5kIGZyYW1lCisgKi8KKyNkZWZpbmUgQ0xfUlNQX0ZMQUdfTk9EQVRBCQkweDAKKyNkZWZpbmUgQ0xfUlNQX0ZMQUdfU0VOU0VEQVRBCQkweDEKKworc3RydWN0IG12dW1pX3JzcF9mcmFtZSB7CisJdTE2IGRldmljZV9pZDsKKwl1MTYgdGFnOworCXU4IHJlcV9zdGF0dXM7CisJdTggcnNwX2ZsYWc7CS8qIEluZGljYXRlcyB0aGUgdHlwZSBvZiBEYXRhX1BheWxvYWQuKi8KKwl1MTYgcmVxdWVzdF9pZDsKKwl1MzIgcGF5bG9hZFsxXTsKK307CisKK3N0cnVjdCBtdnVtaV9vYl9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgY2hhciBkYXRhWzBdOworfTsKKworc3RydWN0IHZlcnNpb25faW5mbyB7CisJdTMyIHZlcl9tYWpvcjsKKwl1MzIgdmVyX21pbm9yOworCXUzMiB2ZXJfb2VtOworCXUzMiB2ZXJfYnVpbGQ7Cit9OworCisjZGVmaW5lIEZXX01BWF9ERUxBWQkJCTMwCisjZGVmaW5lIE1WVU1JX0ZXX0JVU1kJCQkoMVUgPDwgMCkKKyNkZWZpbmUgTVZVTUlfRldfQVRUQUNICQkJKDFVIDw8IDEpCisjZGVmaW5lIE1WVU1JX0ZXX0FMTE9DCQkJKDFVIDw8IDIpCisKKy8qCisgKiBTdGF0ZSBpcyB0aGUgc3RhdGUgb2YgdGhlIE1VCisgKi8KKyNkZWZpbmUgRldfU1RBVEVfSURMRQkJCTAKKyNkZWZpbmUgRldfU1RBVEVfU1RBUlRJTkcJCTEKKyNkZWZpbmUgRldfU1RBVEVfSEFORFNIQUtJTkcJCTIKKyNkZWZpbmUgRldfU1RBVEVfU1RBUlRFRAkJMworI2RlZmluZSBGV19TVEFURV9BQk9SVAkJCTQKKworI2RlZmluZSBIQU5EU0hBS0VfU0lHTkFUVVJFCQkweDVBNUE1QTVBTAorI2RlZmluZSBIQU5EU0hBS0VfUkVBRFlTVEFURQkJMHg1NUFBNUFBNUwKKyNkZWZpbmUgSEFORFNIQUtFX0RPTkVTVEFURQkJMHg1NUFBQTU1QUwKKworLyogSGFuZFNoYWtlIFN0YXR1cyBkZWZpbml0aW9uICovCisjZGVmaW5lIEhTX1NUQVRVU19PSwkJCTEKKyNkZWZpbmUgSFNfU1RBVFVTX0VSUgkJCTIKKyNkZWZpbmUgSFNfU1RBVFVTX0lOVkFMSUQJCTMKKworLyogSGFuZFNoYWtlIFN0YXRlL0NtZCBkZWZpbml0aW9uICovCisjZGVmaW5lIEhTX1NfU1RBUlQJCQkxCisjZGVmaW5lIEhTX1NfUkVTRVQJCQkyCisjZGVmaW5lIEhTX1NfUEFHRV9BRERSCQkJMworI2RlZmluZSBIU19TX1FVRVJZX1BBR0UJCQk0CisjZGVmaW5lIEhTX1NfU0VORF9QQUdFCQkJNQorI2RlZmluZSBIU19TX0VORAkJCTYKKyNkZWZpbmUgSFNfU19BQk9SVAkJCTcKKyNkZWZpbmUgSFNfUEFHRV9WRVJJRllfU0laRQkJMTI4CisKKyNkZWZpbmUgSFNfR0VUX1NUQVRFKGEpCQkJKGEgJiAweEZGRkYpCisjZGVmaW5lIEhTX0dFVF9TVEFUVVMoYSkJCSgoYSAmIDB4RkZGRjAwMDApID4+IDE2KQorI2RlZmluZSBIU19TRVRfU1RBVEUoYSwgYikJCShhIHw9IChiICYgMHhGRkZGKSkKKyNkZWZpbmUgSFNfU0VUX1NUQVRVUyhhLCBiKQkJKGEgfD0gKChiICYgMHhGRkZGKSA8PCAxNikpCisKKy8qIGhhbmRzaGFrZSBmcmFtZSAqLworc3RydWN0IG12dW1pX2hzX2ZyYW1lIHsKKwl1MTYgc2l6ZTsKKwkvKiBob3N0IGluZm9ybWF0aW9uICovCisJdTggaG9zdF90eXBlOworCXU4IHJlc2VydmVkXzFbMV07CisJc3RydWN0IHZlcnNpb25faW5mbyBob3N0X3ZlcjsgLyogYmlvcyBvciBkcml2ZXIgdmVyc2lvbiAqLworCisJLyogY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCXUzMiBzeXN0ZW1faW9fYnVzOworCXUzMiBzbG90X251bWJlcjsKKwl1MzIgaW50cl9sZXZlbDsKKwl1MzIgaW50cl92ZWN0b3I7CisKKwkvKiBjb21tdW5pY2F0aW9uIGxpc3QgY29uZmlndXJhdGlvbiAqLworCXUzMiBpYl9iYXNlYWRkcl9sOworCXUzMiBpYl9iYXNlYWRkcl9oOworCXUzMiBvYl9iYXNlYWRkcl9sOworCXUzMiBvYl9iYXNlYWRkcl9oOworCisJdTggaWJfZW50cnlfc2l6ZTsKKwl1OCBvYl9lbnRyeV9zaXplOworCXU4IG9iX2RlcHRoOworCXU4IGliX2RlcHRoOworCisJLyogc3lzdGVtIHRpbWUgKi8KKwl1NjQgc2Vjb25kc19zaW5jZTE5NzA7Cit9OworCitzdHJ1Y3QgbXZ1bWlfaHNfaGVhZGVyIHsKKwl1OAlwYWdlX2NvZGU7CisJdTgJY2hlY2tzdW07CisJdTE2CWZyYW1lX2xlbmd0aDsKKwl1MzIJZnJhbWVfY29udGVudFsxXTsKK307CisKKy8qCisgKiB0aGUgcGFnZSBjb2RlIHR5cGUgb2YgdGhlIGhhbmRzaGFrZSBoZWFkZXIKKyAqLworI2RlZmluZSBIU19QQUdFX0ZJUk1fQ0FQCTB4MQorI2RlZmluZSBIU19QQUdFX0hPU1RfSU5GTwkweDIKKyNkZWZpbmUgSFNfUEFHRV9GSVJNX0NUTAkweDMKKyNkZWZpbmUgSFNfUEFHRV9DTF9JTkZPCQkweDQKKyNkZWZpbmUgSFNfUEFHRV9UT1RBTAkJMHg1CisKKyNkZWZpbmUgSFNQX1NJWkUoaSkJc2l6ZW9mKHN0cnVjdCBtdnVtaV9oc19wYWdlIyNpKQorCisjZGVmaW5lIEhTUF9NQVhfU0laRSAoewkJCQkJXAorCWludCBzaXplLCBtMSwgbTI7CQkJCVwKKwltMSA9IG1heChIU1BfU0laRSgxKSwgSFNQX1NJWkUoMykpOwkJXAorCW0yID0gbWF4KEhTUF9TSVpFKDIpLCBIU1BfU0laRSg0KSk7CQlcCisJc2l6ZSA9IG1heChtMSwgbTIpOwkJCQlcCisJc2l6ZTsJCQkJCQlcCit9KQorCisvKiBUaGUgZm9ybWF0IG9mIHRoZSBwYWdlIGNvZGUgZm9yIEZpcm13YXJlIGNhcGFiaWxpdHkgKi8KK3N0cnVjdCBtdnVtaV9oc19wYWdlMSB7CisJdTggcGFnZWNvZGU7CisJdTggY2hlY2tzdW07CisJdTE2IGZyYW1lX2xlbmd0aDsKKworCXUxNiBudW1iZXJfb2ZfcG9ydHM7CisJdTE2IG1heF9kZXZpY2VzX3N1cHBvcnQ7CisJdTE2IG1heF9pb19zdXBwb3J0OworCXUxNiB1bWlfdmVyOworCXUzMiBtYXhfdHJhbnNmZXJfc2l6ZTsKKwlzdHJ1Y3QgdmVyc2lvbl9pbmZvIGZ3X3ZlcjsKKwl1OCBjbF9pbl9tYXhfZW50cnlfc2l6ZTsKKwl1OCBjbF9vdXRfbWF4X2VudHJ5X3NpemU7CisJdTggY2xfaW5vdXRfbGlzdF9kZXB0aDsKKwl1OCB0b3RhbF9wYWdlczsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgcmVzZXJ2ZWQxOworfTsKKworLyogVGhlIGZvcm1hdCBvZiB0aGUgcGFnZSBjb2RlIGZvciBIb3N0IGluZm9ybWF0aW9uICovCitzdHJ1Y3QgbXZ1bWlfaHNfcGFnZTIgeworCXU4IHBhZ2Vjb2RlOworCXU4IGNoZWNrc3VtOworCXUxNiBmcmFtZV9sZW5ndGg7CisKKwl1OCBob3N0X3R5cGU7CisJdTggcmVzZXJ2ZWRbM107CisJc3RydWN0IHZlcnNpb25faW5mbyBob3N0X3ZlcjsKKwl1MzIgc3lzdGVtX2lvX2J1czsKKwl1MzIgc2xvdF9udW1iZXI7CisJdTMyIGludHJfbGV2ZWw7CisJdTMyIGludHJfdmVjdG9yOworCXU2NCBzZWNvbmRzX3NpbmNlMTk3MDsKK307CisKKy8qIFRoZSBmb3JtYXQgb2YgdGhlIHBhZ2UgY29kZSBmb3IgZmlybXdhcmUgY29udHJvbCAgKi8KK3N0cnVjdCBtdnVtaV9oc19wYWdlMyB7CisJdTgJcGFnZWNvZGU7CisJdTgJY2hlY2tzdW07CisJdTE2CWZyYW1lX2xlbmd0aDsKKwl1MTYJY29udHJvbDsKKwl1OAlyZXNlcnZlZFsyXTsKKwl1MzIJaG9zdF9idWZmZXJhZGRyX2w7CisJdTMyCWhvc3RfYnVmZmVyYWRkcl9oOworCXUzMglob3N0X2V2ZW50YWRkcl9sOworCXUzMglob3N0X2V2ZW50YWRkcl9oOworfTsKKworc3RydWN0IG12dW1pX2hzX3BhZ2U0IHsKKwl1OAlwYWdlY29kZTsKKwl1OAljaGVja3N1bTsKKwl1MTYJZnJhbWVfbGVuZ3RoOworCXUzMglpYl9iYXNlYWRkcl9sOworCXUzMglpYl9iYXNlYWRkcl9oOworCXUzMglvYl9iYXNlYWRkcl9sOworCXUzMglvYl9iYXNlYWRkcl9oOworCXU4CWliX2VudHJ5X3NpemU7CisJdTgJb2JfZW50cnlfc2l6ZTsKKwl1OAlvYl9kZXB0aDsKKwl1OAlpYl9kZXB0aDsKK307CisKK3N0cnVjdCBtdnVtaV90YWcgeworCXVuc2lnbmVkIHNob3J0ICpzdGFjazsKKwl1bnNpZ25lZCBzaG9ydCB0b3A7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKK307CisKK3N0cnVjdCBtdnVtaV9oYmEgeworCXZvaWQgKmJhc2VfYWRkcltNQVhfQkFTRV9BRERSRVNTXTsKKwl2b2lkICptbWlvOworCXN0cnVjdCBsaXN0X2hlYWQgY21kX3Bvb2w7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaW50X2NtZF93YWl0X3E7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdW5zaWduZWQgaW50IHVuaXF1ZV9pZDsKKwlhdG9taWNfdCBmd19vdXRzdGFuZGluZzsKKwlzdHJ1Y3QgbXZ1bWlfaW5zdGFuY2VfdGVtcGxhdGUgKmluc3RhbmNldDsKKworCXZvaWQgKmliX2xpc3Q7CisJZG1hX2FkZHJfdCBpYl9saXN0X3BoeXM7CisKKwl2b2lkICpvYl9saXN0OworCWRtYV9hZGRyX3Qgb2JfbGlzdF9waHlzOworCisJdm9pZCAqaWJfc2hhZG93OworCWRtYV9hZGRyX3QgaWJfc2hhZG93X3BoeXM7CisKKwl2b2lkICpvYl9zaGFkb3c7CisJZG1hX2FkZHJfdCBvYl9zaGFkb3dfcGh5czsKKworCXZvaWQgKmhhbmRzaGFrZV9wYWdlOworCWRtYV9hZGRyX3QgaGFuZHNoYWtlX3BhZ2VfcGh5czsKKworCXVuc2lnbmVkIGludCBnbG9iYWxfaXNyOworCXVuc2lnbmVkIGludCBpc3Jfc3RhdHVzOworCisJdW5zaWduZWQgc2hvcnQgbWF4X3NnZTsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfdGFyZ2V0X2lkOworCXVuc2lnbmVkIGNoYXIgKnRhcmdldF9tYXA7CisJdW5zaWduZWQgaW50IG1heF9pbzsKKwl1bnNpZ25lZCBpbnQgbGlzdF9udW1faW87CisJdW5zaWduZWQgaW50IGliX21heF9zaXplOworCXVuc2lnbmVkIGludCBvYl9tYXhfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaWJfbWF4X3NpemVfc2V0dGluZzsKKwl1bnNpZ25lZCBpbnQgb2JfbWF4X3NpemVfc2V0dGluZzsKKwl1bnNpZ25lZCBpbnQgbWF4X3RyYW5zZmVyX3NpemU7CisJdW5zaWduZWQgY2hhciBoYmFfdG90YWxfcGFnZXM7CisJdW5zaWduZWQgY2hhciBmd19mbGFnOworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9pZF9lbmFibGVkOworCXVuc2lnbmVkIHNob3J0IGhiYV9jYXBhYmlsaXR5OworCXVuc2lnbmVkIHNob3J0IGlvX3NlcTsKKworCXVuc2lnbmVkIGludCBpYl9jdXJfc2xvdDsKKwl1bnNpZ25lZCBpbnQgb2JfY3VyX3Nsb3Q7CisJdW5zaWduZWQgaW50IGZ3X3N0YXRlOworCisJc3RydWN0IGxpc3RfaGVhZCBvYl9kYXRhX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX29iX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCByZXNfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfcmVxX2xpc3Q7CisKKwlzdHJ1Y3QgbXZ1bWlfdGFnIHRhZ19wb29sOworCXN0cnVjdCBtdnVtaV9jbWQgKip0YWdfY21kOworfTsKKworc3RydWN0IG12dW1pX2luc3RhbmNlX3RlbXBsYXRlIHsKKwl2b2lkICgqZmlyZV9jbWQpKHN0cnVjdCBtdnVtaV9oYmEgKiwgc3RydWN0IG12dW1pX2NtZCAqKTsKKwl2b2lkICgqZW5hYmxlX2ludHIpKHZvaWQgKikgOworCXZvaWQgKCpkaXNhYmxlX2ludHIpKHZvaWQgKik7CisJaW50ICgqY2xlYXJfaW50cikodm9pZCAqKTsKKwl1bnNpZ25lZCBpbnQgKCpyZWFkX2Z3X3N0YXR1c19yZWcpKHZvaWQgKik7Cit9OworCitleHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zZC9vc2RfaW5pdGlhdG9yLmMgYi9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYwppbmRleCA4NmFmYjEzZi4uYzA2YjhlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zZC9vc2RfaW5pdGlhdG9yLmMKKysrIGIvZHJpdmVycy9zY3NpL29zZC9vc2RfaW5pdGlhdG9yLmMKQEAgLTQwLDYgKzQwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c2NzaS9vc2RfaW5pdGlhdG9yLmg+CiAjaW5jbHVkZSA8c2NzaS9vc2Rfc2VjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCmluZGV4IDhiN2RiMWUuLmI3YjkyZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2h3aS5jCkBAIC01NjcsMTEgKzU2NywxMSBAQAogCXZhbHVlID0gcG04MDAxX2NyMzIocG04MDAxX2hhLCAwLCAweDQ0KTsKIAlvZmZzZXQgPSB2YWx1ZSAmIDB4MDNGRkZGRkY7CiAJUE04MDAxX0lOSVRfREJHKHBtODAwMV9oYSwKLQkJcG04MDAxX3ByaW50aygiU2NyYXRjaHBhZCAwIE9mZnNldDogJXggXG4iLCBvZmZzZXQpKTsKKwkJcG04MDAxX3ByaW50aygiU2NyYXRjaHBhZCAwIE9mZnNldDogJXhcbiIsIG9mZnNldCkpOwogCXBjaWxvZ2ljID0gKHZhbHVlICYgMHhGQzAwMDAwMCkgPj4gMjY7CiAJcGNpYmFyID0gZ2V0X3BjaV9iYXJfaW5kZXgocGNpbG9naWMpOwogCVBNODAwMV9JTklUX0RCRyhwbTgwMDFfaGEsCi0JCXBtODAwMV9wcmludGsoIlNjcmF0Y2hwYWQgMCBQQ0kgQkFSOiAlZCBcbiIsIHBjaWJhcikpOworCQlwbTgwMDFfcHJpbnRrKCJTY3JhdGNocGFkIDAgUENJIEJBUjogJWRcbiIsIHBjaWJhcikpOwogCXBtODAwMV9oYS0+bWFpbl9jZmdfdGJsX2FkZHIgPSBiYXNlX2FkZHIgPQogCQlwbTgwMDFfaGEtPmlvX21lbVtwY2liYXJdLm1lbXZpcnRhZGRyICsgb2Zmc2V0OwogCXBtODAwMV9oYS0+Z2VuZXJhbF9zdGF0X3RibF9hZGRyID0KQEAgLTEyNDUsNyArMTI0NSw3IEBACiAKIAlpZiAobXBpX21zZ19mcmVlX2dldChjaXJjdWxhclEsIDY0LCAmcE1lc3NhZ2UpIDwgMCkgewogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk5vIGZyZWUgbXBpIGJ1ZmZlciBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIk5vIGZyZWUgbXBpIGJ1ZmZlclxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCUJVR19PTighcGF5bG9hZCk7CkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCXBtODAwMV9jdzMyKHBtODAwMV9oYSwgY2lyY3VsYXJRLT5waV9wY2lfYmFyLAogCQljaXJjdWxhclEtPnBpX29mZnNldCwgY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHgpOwogCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQlwbTgwMDFfcHJpbnRrKCJhZnRlciBQST0gJWQgQ0k9ICVkIFxuIiwgY2lyY3VsYXJRLT5wcm9kdWNlcl9pZHgsCisJCXBtODAwMV9wcmludGsoImFmdGVyIFBJPSAlZCBDST0gJWRcbiIsIGNpcmN1bGFyUS0+cHJvZHVjZXJfaWR4LAogCQljaXJjdWxhclEtPmNvbnN1bWVyX2luZGV4KSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBJT19TVUNDRVNTOgogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fU1VDQ0VTUyIKLQkJCSIscGFyYW0gPSAlZCBcbiIsIHBhcmFtKSk7CisJCQkiLHBhcmFtID0gJWRcbiIsIHBhcmFtKSk7CiAJCWlmIChwYXJhbSA9PSAwKSB7CiAJCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQkJdHMtPnN0YXQgPSBTQU1fU1RBVF9HT09EOwpAQCAtMTQ5MCwxNCArMTQ5MCwxNCBAQAogCQlicmVhazsKIAljYXNlIElPX0FCT1JURUQ6CiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiSU9fQUJPUlRFRCBJT01CIFRhZyBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIklPX0FCT1JURUQgSU9NQiBUYWdcbiIpKTsKIAkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJdHMtPnN0YXQgPSBTQVNfQUJPUlRFRF9UQVNLOwogCQlicmVhazsKIAljYXNlIElPX1VOREVSRkxPVzoKIAkJLyogU1NQIENvbXBsZXRpb24gd2l0aCBlcnJvciAqLwogCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiSU9fVU5ERVJGTE9XIgotCQkJIixwYXJhbSA9ICVkIFxuIiwgcGFyYW0pKTsKKwkJCSIscGFyYW0gPSAlZFxuIiwgcGFyYW0pKTsKIAkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJdHMtPnN0YXQgPSBTQVNfREFUQV9VTkRFUlJVTjsKIAkJdHMtPnJlc2lkdWFsID0gcGFyYW07CkBAIC0xNjQ5LDYgKzE2NDksNyBAQAogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQl0cy0+c3RhdCA9IFNBU19PUEVOX1JFSkVDVDsKIAkJdHMtPm9wZW5fcmVqX3JlYXNvbiA9IFNBU19PUkVKX1JTVkRfUkVUUlk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAogCQkJcG04MDAxX3ByaW50aygiVW5rbm93biBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKSk7CkBAIC0xOTM3LDE0ICsxOTM4LDE0IEBACiAJCQkJdHMtPmJ1Zl92YWxpZF9zaXplID0gc2l6ZW9mKCpyZXNwKTsKIAkJCX0gZWxzZQogCQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLAotCQkJCQlwbTgwMDFfcHJpbnRrKCJyZXNwb25zZSB0byBsYXJnZSBcbiIpKTsKKwkJCQkJcG04MDAxX3ByaW50aygicmVzcG9uc2UgdG8gbGFyZ2VcbiIpKTsKIAkJfQogCQlpZiAocG04MDAxX2RldikKIAkJCXBtODAwMV9kZXYtPnJ1bm5pbmdfcmVxLS07CiAJCWJyZWFrOwogCWNhc2UgSU9fQUJPUlRFRDoKIAkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJJT19BQk9SVEVEIElPTUIgVGFnIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSU9fQUJPUlRFRCBJT01CIFRhZ1xuIikpOwogCQl0cy0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQl0cy0+c3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CiAJCWlmIChwbTgwMDFfZGV2KQpAQCAtMjcyOCwxMSArMjcyOSwxMSBAQAogCXUzMiBwaHlfb3AgPSBsZTMyX3RvX2NwdShwUGF5bG9hZC0+cGh5b3BfcGh5aWQpICYgT1BfQklUUzsKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiJXggcGh5IGV4ZWN1dGUgJXggcGh5IG9wIGZhaWxlZCEgXG4iLAorCQkJcG04MDAxX3ByaW50aygiJXggcGh5IGV4ZWN1dGUgJXggcGh5IG9wIGZhaWxlZCFcbiIsCiAJCQlwaHlfaWQsIHBoeV9vcCkpOwogCX0gZWxzZQogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCIleCBwaHkgZXhlY3V0ZSAleCBwaHkgb3Agc3VjY2VzcyEgXG4iLAorCQkJcG04MDAxX3ByaW50aygiJXggcGh5IGV4ZWN1dGUgJXggcGh5IG9wIHN1Y2Nlc3MhXG4iLAogCQkJcGh5X2lkLCBwaHlfb3ApKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMTgsNyArMzAxOSw3IEBACiAJCWJyZWFrOwogCWNhc2UgUE9SVF9JTlZBTElEOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCIgUG9ydEludmFsaWQgcG9ydElEICVkIFxuIiwgcG9ydF9pZCkpOworCQkJcG04MDAxX3ByaW50aygiIFBvcnRJbnZhbGlkIHBvcnRJRCAlZFxuIiwgcG9ydF9pZCkpOwogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCiAJCQlwbTgwMDFfcHJpbnRrKCIgTGFzdCBwaHkgRG93biBhbmQgcG9ydCBpbnZhbGlkXG4iKSk7CiAJCXBvcnQtPnBvcnRfYXR0YWNoZWQgPSAwOwpAQCAtMzAyNyw3ICszMDI4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBQT1JUX0lOX1JFU0VUOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCIgUG9ydCBJbiBSZXNldCBwb3J0SUQgJWQgXG4iLCBwb3J0X2lkKSk7CisJCQlwbTgwMDFfcHJpbnRrKCIgUG9ydCBJbiBSZXNldCBwb3J0SUQgJWRcbiIsIHBvcnRfaWQpKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1JUX05PVF9FU1RBQkxJU0hFRDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLApAQCAtMzIyMCw3ICszMjIxLDcgQEAKIAkJcG04MDAxX3ByaW50aygiIHN0YXR1cyA9IDB4JXhcbiIsIHN0YXR1cykpOwogCWZvciAoaSA9IDA7IGkgPCBHRU5FUkFMX0VWRU5UX1BBWUxPQUQ7IGkrKykKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiaW5iX0lPTUJfcGF5bG9hZFsweCV4XSAweCV4LCBcbiIsIGksCisJCQlwbTgwMDFfcHJpbnRrKCJpbmJfSU9NQl9wYXlsb2FkWzB4JXhdIDB4JXgsXG4iLCBpLAogCQkJcFBheWxvYWQtPmluYl9JT01CX3BheWxvYWRbaV0pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMzMTIsMTIgKzMzMTMsMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9TQVNfUEhZX1VQOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QSFlfU1RBUlRfU1RBVFVTIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUEhZX1NUQVJUX1NUQVRVU1xuIikpOwogCQlod19ldmVudF9zYXNfcGh5X3VwKHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIEhXX0VWRU5UX1NBVEFfUEhZX1VQOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9TQVRBX1BIWV9VUCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1NBVEFfUEhZX1VQXG4iKSk7CiAJCWh3X2V2ZW50X3NhdGFfcGh5X3VwKHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIEhXX0VWRU5UX1BIWV9TVE9QX1NUQVRVUzoKQEAgLTMzMjksMTIgKzMzMzAsMTIgQEAKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9TQVRBX1NQSU5VUF9IT0xEOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9TQVRBX1NQSU5VUF9IT0xEIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfU0FUQV9TUElOVVBfSE9MRFxuIikpOwogCQlzYXNfaGEtPm5vdGlmeV9waHlfZXZlbnQoJnBoeS0+c2FzX3BoeSwgUEhZRV9TUElOVVBfSE9MRCk7CiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfUEhZX0RPV046CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BIWV9ET1dOIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUEhZX0RPV05cbiIpKTsKIAkJc2FzX2hhLT5ub3RpZnlfcGh5X2V2ZW50KCZwaHktPnNhc19waHksIFBIWUVfTE9TU19PRl9TSUdOQUwpOwogCQlwaHktPnBoeV9hdHRhY2hlZCA9IDA7CiAJCXBoeS0+cGh5X3N0YXRlID0gMDsKQEAgLTM0NDYsNyArMzQ0Nyw3IEBACiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfTElOS19FUlJfUEhZX1JFU0VUX0ZBSUxFRDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfTElOS19FUlJfUEhZX1JFU0VUX0ZBSUxFRCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX0xJTktfRVJSX1BIWV9SRVNFVF9GQUlMRURcbiIpKTsKIAkJcG04MDAxX2h3X2V2ZW50X2Fja19yZXEocG04MDAxX2hhLCAwLAogCQkJSFdfRVZFTlRfTElOS19FUlJfUEhZX1JFU0VUX0ZBSUxFRCwKIAkJCXBvcnRfaWQsIHBoeV9pZCwgMCwgMCk7CkBAIC0zNDU2LDI1ICszNDU3LDI1IEBACiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfUE9SVF9SRVNFVF9USU1FUl9UTU86CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BPUlRfUkVTRVRfVElNRVJfVE1PIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRVNFVF9USU1FUl9UTU9cbiIpKTsKIAkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CiAJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKIAkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfUE9SVF9SRUNPVkVSWV9USU1FUl9UTU86CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIkhXX0VWRU5UX1BPUlRfUkVDT1ZFUllfVElNRVJfVE1PIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRUNPVkVSWV9USU1FUl9UTU9cbiIpKTsKIAkJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CiAJCXBoeS0+cGh5X2F0dGFjaGVkID0gMDsKIAkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9MSU5LX1JFU0VUX0VSUik7CiAJCWJyZWFrOwogCWNhc2UgSFdfRVZFTlRfUE9SVF9SRUNPVkVSOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFQ09WRVIgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFQ09WRVJcbiIpKTsKIAkJYnJlYWs7CiAJY2FzZSBIV19FVkVOVF9QT1JUX1JFU0VUX0NPTVBMRVRFOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJIV19FVkVOVF9QT1JUX1JFU0VUX0NPTVBMRVRFIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiSFdfRVZFTlRfUE9SVF9SRVNFVF9DT01QTEVURVxuIikpOwogCQlicmVhazsKIAljYXNlIEVWRU5UX0JST0FEQ0FTVF9BU1lOQ0hfRVZFTlQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKQEAgLTM1MDIsMjEgKzM1MDMsMjEgQEAKIAogCXN3aXRjaCAob3BjKSB7CiAJY2FzZSBPUENfT1VCX0VDSE86Ci0JCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiT1BDX09VQl9FQ0hPIFxuIikpOworCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIk9QQ19PVUJfRUNIT1xuIikpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfSFdfRVZFTlQ6CiAJCVBNODAwMV9NU0dfREJHKHBtODAwMV9oYSwKLQkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfSFdfRVZFTlQgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0hXX0VWRU5UXG4iKSk7CiAJCW1waV9od19ldmVudChwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX1NTUF9DT01QOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NTUF9DT01QIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TU1BfQ09NUFxuIikpOwogCQltcGlfc3NwX2NvbXBsZXRpb24ocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9TTVBfQ09NUDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9TTVBfQ09NUCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU01QX0NPTVBcbiIpKTsKIAkJbXBpX3NtcF9jb21wbGV0aW9uKHBtODAwMV9oYSwgcGlvbWIpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfTE9DQUxfUEhZX0NOVFJMOgpAQCAtMzUyNiwyNiArMzUyNywyNiBAQAogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfREVWX1JFR0lTVDoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9ERVZfUkVHSVNUIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9ERVZfUkVHSVNUXG4iKSk7CiAJCW1waV9yZWdfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX0RFUkVHX0RFVjoKIAkJUE04MDAxX01TR19EQkcocG04MDAxX2hhLAotCQkJcG04MDAxX3ByaW50aygidW5yZXNnaXN0ZXIgdGhlIGRldmllY2UgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJ1bnJlc2dpc3RlciB0aGUgZGV2aWVjZVxuIikpOwogCQltcGlfZGVyZWdfcmVzcChwbTgwMDFfaGEsIHBpb21iKTsKIAkJYnJlYWs7CiAJY2FzZSBPUENfT1VCX0dFVF9ERVZfSEFORExFOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX0dFVF9ERVZfSEFORExFIFxuIikpOworCQkJcG04MDAxX3ByaW50aygiT1BDX09VQl9HRVRfREVWX0hBTkRMRVxuIikpOwogCQlicmVhazsKIAljYXNlIE9QQ19PVUJfU0FUQV9DT01QOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NBVEFfQ09NUCBcbiIpKTsKKwkJCXBtODAwMV9wcmludGsoIk9QQ19PVUJfU0FUQV9DT01QXG4iKSk7CiAJCW1waV9zYXRhX2NvbXBsZXRpb24ocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9TQVRBX0VWRU5UOgogCQlQTTgwMDFfTVNHX0RCRyhwbTgwMDFfaGEsCi0JCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NBVEFfRVZFTlQgXG4iKSk7CisJCQlwbTgwMDFfcHJpbnRrKCJPUENfT1VCX1NBVEFfRVZFTlRcbiIpKTsKIAkJbXBpX3NhdGFfZXZlbnQocG04MDAxX2hhLCBwaW9tYik7CiAJCWJyZWFrOwogCWNhc2UgT1BDX09VQl9TU1BfRVZFTlQ6CkBAIC0zODU4LDE5ICszODU5LDE5IEBACiAJY2lyY3VsYXJRID0gJnBtODAwMV9oYS0+aW5ibmRfcV90YmxbMF07CiAJaWYgKHRhc2stPmRhdGFfZGlyID09IFBDSV9ETUFfTk9ORSkgewogCQlBVEFQID0gMHgwNDsgIC8qIG5vIGRhdGEqLwotCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygibm8gZGF0YSBcbiIpKTsKKwkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIm5vIGRhdGFcbiIpKTsKIAl9IGVsc2UgaWYgKGxpa2VseSghdGFzay0+YXRhX3Rhc2suZGV2aWNlX2NvbnRyb2xfcmVnX3VwZGF0ZSkpIHsKIAkJaWYgKHRhc2stPmF0YV90YXNrLmRtYV94ZmVyKSB7CiAJCQlBVEFQID0gMHgwNjsgLyogRE1BICovCi0JCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRE1BIFxuIikpOworCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIkRNQVxuIikpOwogCQl9IGVsc2UgewogCQkJQVRBUCA9IDB4MDU7IC8qIFBJTyovCi0JCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiUElPIFxuIikpOworCQkJUE04MDAxX0lPX0RCRyhwbTgwMDFfaGEsIHBtODAwMV9wcmludGsoIlBJT1xuIikpOwogCQl9CiAJCWlmICh0YXNrLT5hdGFfdGFzay51c2VfbmNxICYmCiAJCQlkZXYtPnNhdGFfZGV2LmNvbW1hbmRfc2V0ICE9IEFUQVBJX0NPTU1BTkRfU0VUKSB7CiAJCQlBVEFQID0gMHgwNzsgLyogRlBETUEgKi8KLQkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJGUERNQSBcbiIpKTsKKwkJCVBNODAwMV9JT19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJGUERNQVxuIikpOwogCQl9CiAJfQogCWlmICh0YXNrLT5hdGFfdGFzay51c2VfbmNxICYmIHBtODAwMV9nZXRfbmNxX3RhZyh0YXNrLCAmaGRyX3RhZykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9pbml0LmMKaW5kZXggMTcyY2VmYi4uYzIxYTIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwpAQCAtNjEsNyArNjEsNyBAQAogCS5uYW1lCQkJPSBEUlZfTkFNRSwKIAkucXVldWVjb21tYW5kCQk9IHNhc19xdWV1ZWNvbW1hbmQsCiAJLnRhcmdldF9hbGxvYwkJPSBzYXNfdGFyZ2V0X2FsbG9jLAotCS5zbGF2ZV9jb25maWd1cmUJPSBwbTgwMDFfc2xhdmVfY29uZmlndXJlLAorCS5zbGF2ZV9jb25maWd1cmUJPSBzYXNfc2xhdmVfY29uZmlndXJlLAogCS5zbGF2ZV9kZXN0cm95CQk9IHNhc19zbGF2ZV9kZXN0cm95LAogCS5zY2FuX2ZpbmlzaGVkCQk9IHBtODAwMV9zY2FuX2ZpbmlzaGVkLAogCS5zY2FuX3N0YXJ0CQk9IHBtODAwMV9zY2FuX3N0YXJ0LApAQCAtNzYsNyArNzYsNyBAQAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBzYXNfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCiAJLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gc2FzX2VoX2J1c19yZXNldF9oYW5kbGVyLAotCS5zbGF2ZV9hbGxvYwkJPSBwbTgwMDFfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2FsbG9jCQk9IHNhc19zbGF2ZV9hbGxvYywKIAkudGFyZ2V0X2Rlc3Ryb3kJCT0gc2FzX3RhcmdldF9kZXN0cm95LAogCS5pb2N0bAkJCT0gc2FzX2lvY3RsLAogCS5zaG9zdF9hdHRycwkJPSBwbTgwMDFfaG9zdF9hdHRycywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5jIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKaW5kZXggNmFlMDU5ZS4uZmIzZGM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMKQEAgLTIxMCwyNiArMjEwLDEyIEBACiAJCVBNODAwMV9DSElQX0RJU1AtPnBoeV9zdG9wX3JlcShwbTgwMDFfaGEsIHBoeV9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJjID0gLUVPUE5PVFNVUFA7CisJCXJjID0gLUVOT1NZUzsKIAl9CiAJbXNsZWVwKDMwMCk7CiAJcmV0dXJuIHJjOwogfQogCi1pbnQgcG04MDAxX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYpCi17Ci0Jc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiA9IHNkZXZfdG9fZG9tYWluX2RldihzY3NpX2Rldik7Ci0JaWYgKGRldl9pc19zYXRhKGRldikpIHsKLQkJLyogV2UgZG9uJ3QgbmVlZCB0byByZXNjYW4gdGFyZ2V0cwotCQkqIGlmIFJFUE9SVF9MVU5TIHJlcXVlc3QgaXMgZmFpbGVkCi0JCSovCi0JCWlmIChzY3NpX2Rldi0+bHVuID4gMCkKLQkJCXJldHVybiAtRU5YSU87Ci0JCXNjc2lfZGV2LT50YWdnZWRfc3VwcG9ydGVkID0gMTsKLQl9Ci0JcmV0dXJuIHNhc19zbGF2ZV9hbGxvYyhzY3NpX2Rldik7Ci19Ci0KIC8qKgogICAqIHBtODAwMV9zY2FuX3N0YXJ0IC0gd2Ugc2hvdWxkIGVuYWJsZSBhbGwgSEJBIHBoeXMgYnkgc2VuZGluZyB0aGUgcGh5X3N0YXJ0CiAgICogY29tbWFuZCB0byBIQkEuCkBAIC0zMTQsMjIgKzMwMCw3IEBACiB7CiAJcmV0dXJuIFBNODAwMV9DSElQX0RJU1AtPnNzcF9pb19yZXEocG04MDAxX2hhLCBjY2IpOwogfQotaW50IHBtODAwMV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQotewotCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoc2Rldik7Ci0JaW50IHJldCA9IHNhc19zbGF2ZV9jb25maWd1cmUoc2Rldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgewotCSNpZmRlZiBQTTgwMDFfRElTQUJMRV9OQ1EKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+c2F0YV9kZXYuYXA7Ci0JCXN0cnVjdCBhdGFfZGV2aWNlICphZGV2ID0gYXAtPmxpbmsuZGV2aWNlOwotCQlhZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfTkNRX09GRjsKLQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX1NJTVBMRV9UQUcsIDEpOwotCSNlbmRpZgotCX0KLQlyZXR1cm4gMDsKLX0KKwogIC8qIEZpbmQgdGhlIGxvY2FsIHBvcnQgaWQgdGhhdCdzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlICovCiBzdGF0aWMgaW50IHNhc19maW5kX2xvY2FsX3BvcnRfaWQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKQEAgLTM4NSwyMSArMzU2LDggQEAKIAlkbyB7CiAJCWRldiA9IHQtPmRldjsKIAkJcG04MDAxX2RldiA9IGRldi0+bGxkZF9kZXY7Ci0JCWlmIChERVZfSVNfR09ORShwbTgwMDFfZGV2KSkgewotCQkJaWYgKHBtODAwMV9kZXYpIHsKLQkJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKLQkJCQkJcG04MDAxX3ByaW50aygiZGV2aWNlICVkIG5vdCByZWFkeS5cbiIsCi0JCQkJCXBtODAwMV9kZXYtPmRldmljZV9pZCkpOwotCQkJfSBlbHNlIHsKLQkJCQlQTTgwMDFfSU9fREJHKHBtODAwMV9oYSwKLQkJCQkJcG04MDAxX3ByaW50aygiZGV2aWNlICUwMTZsbHggbm90ICIKLQkJCQkJInJlYWR5LlxuIiwgU0FTX0FERFIoZGV2LT5zYXNfYWRkcikpKTsKLQkJCX0KLQkJCXJjID0gU0FTX1BIWV9ET1dOOwotCQkJZ290byBvdXRfZG9uZTsKLQkJfQogCQlwb3J0ID0gJnBtODAwMV9oYS0+cG9ydFtzYXNfZmluZF9sb2NhbF9wb3J0X2lkKGRldildOwotCQlpZiAoIXBvcnQtPnBvcnRfYXR0YWNoZWQpIHsKKwkJaWYgKERFVl9JU19HT05FKHBtODAwMV9kZXYpIHx8ICFwb3J0LT5wb3J0X2F0dGFjaGVkKSB7CiAJCQlpZiAoc2FzX3Byb3RvY29sX2F0YSh0LT50YXNrX3Byb3RvKSkgewogCQkJCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzID0gJnQtPnRhc2tfc3RhdHVzOwogCQkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7CkBAIC02NTEsNyArNjA5LDcgQEAKIAkJCQlmbGFnID0gMTsgLyogZGlyZWN0bHkgc2F0YSovCiAJCX0KIAl9IC8qcmVnaXN0ZXIgdGhpcyBkZXZpY2UgdG8gSEJBKi8KLQlQTTgwMDFfRElTQ19EQkcocG04MDAxX2hhLCBwbTgwMDFfcHJpbnRrKCJGb3VuZCBkZXZpY2UgXG4iKSk7CisJUE04MDAxX0RJU0NfREJHKHBtODAwMV9oYSwgcG04MDAxX3ByaW50aygiRm91bmQgZGV2aWNlXG4iKSk7CiAJUE04MDAxX0NISVBfRElTUC0+cmVnX2Rldl9yZXEocG04MDAxX2hhLCBwbTgwMDFfZGV2aWNlLCBmbGFnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbTgwMDFfaGEtPmxvY2ssIGZsYWdzKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0aW9uKTsKQEAgLTY2OSwzMCArNjI3LDYgQEAKIAlyZXR1cm4gcG04MDAxX2Rldl9mb3VuZF9ub3RpZnkoZGV2KTsKIH0KIAotLyoqCi0gICogcG04MDAxX2FsbG9jX3Rhc2sgLSBhbGxvY2F0ZSBhIHRhc2sgc3RydWN0dXJlIGZvciBUTUYKLSAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2FzX3Rhc2sgKnBtODAwMV9hbGxvY190YXNrKHZvaWQpCi17Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0ga3phbGxvYyhzaXplb2YoKnRhc2spLCBHRlBfS0VSTkVMKTsKLQlpZiAodGFzaykgewotCQlJTklUX0xJU1RfSEVBRCgmdGFzay0+bGlzdCk7Ci0JCXNwaW5fbG9ja19pbml0KCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOwotCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzID0gU0FTX1RBU0tfU1RBVEVfUEVORElORzsKLQkJaW5pdF90aW1lcigmdGFzay0+dGltZXIpOwotCQlpbml0X2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOwotCX0KLQlyZXR1cm4gdGFzazsKLX0KLQotc3RhdGljIHZvaWQgcG04MDAxX2ZyZWVfdGFzayhzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCi17Ci0JaWYgKHRhc2spIHsKLQkJQlVHX09OKCFsaXN0X2VtcHR5KCZ0YXNrLT5saXN0KSk7Ci0JCWtmcmVlKHRhc2spOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcG04MDAxX3Rhc2tfZG9uZShzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2spCiB7CiAJaWYgKCFkZWxfdGltZXIoJnRhc2stPnRpbWVyKSkKQEAgLTcyOCw3ICs2NjIsNyBAQAogCXN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSA9IHBtODAwMV9maW5kX2hhX2J5X2RldihkZXYpOwogCiAJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgcmV0cnkrKykgewotCQl0YXNrID0gcG04MDAxX2FsbG9jX3Rhc2soKTsKKwkJdGFzayA9IHNhc19hbGxvY190YXNrKEdGUF9LRVJORUwpOwogCQlpZiAoIXRhc2spCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzg5LDE0ICs3MjMsMTMgQEAKIAkJCQlTQVNfQUREUihkZXYtPnNhc19hZGRyKSwKIAkJCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLAogCQkJCXRhc2stPnRhc2tfc3RhdHVzLnN0YXQpKTsKLQkJCXBtODAwMV9mcmVlX3Rhc2sodGFzayk7CisJCQlzYXNfZnJlZV90YXNrKHRhc2spOwogCQkJdGFzayA9IE5VTEw7CiAJCX0KIAl9CiBleF9lcnI6CiAJQlVHX09OKHJldHJ5ID09IDMgJiYgdGFzayAhPSBOVUxMKTsKLQlpZiAodGFzayAhPSBOVUxMKQotCQlwbTgwMDFfZnJlZV90YXNrKHRhc2spOworCXNhc19mcmVlX3Rhc2sodGFzayk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtODExLDcgKzc0NCw3IEBACiAJc3RydWN0IHNhc190YXNrICp0YXNrID0gTlVMTDsKIAogCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDM7IHJldHJ5KyspIHsKLQkJdGFzayA9IHBtODAwMV9hbGxvY190YXNrKCk7CisJCXRhc2sgPSBzYXNfYWxsb2NfdGFzayhHRlBfS0VSTkVMKTsKIAkJaWYgKCF0YXNrKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTg2NCwxNCArNzk3LDEzIEBACiAJCQkJU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCiAJCQkJdGFzay0+dGFza19zdGF0dXMucmVzcCwKIAkJCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0KSk7Ci0JCQlwbTgwMDFfZnJlZV90YXNrKHRhc2spOworCQkJc2FzX2ZyZWVfdGFzayh0YXNrKTsKIAkJCXRhc2sgPSBOVUxMOwogCQl9CiAJfQogZXhfZXJyOgogCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7Ci0JaWYgKHRhc2sgIT0gTlVMTCkKLQkJcG04MDAxX2ZyZWVfdGFzayh0YXNrKTsKKwlzYXNfZnJlZV90YXNrKHRhc2spOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTEwMjYsMTMgKzk1OCwxNCBAQAogCQkvKiBUaGUgdGFzayBpcyBzdGlsbCBpbiBMdW4sIHJlbGVhc2UgaXQgdGhlbiAqLwogCQljYXNlIFRNRl9SRVNQX0ZVTkNfU1VDQzoKIAkJCVBNODAwMV9FSF9EQkcocG04MDAxX2hhLAotCQkJCXBtODAwMV9wcmludGsoIlRoZSB0YXNrIGlzIHN0aWxsIGluIEx1biBcbiIpKTsKKwkJCQlwbTgwMDFfcHJpbnRrKCJUaGUgdGFzayBpcyBzdGlsbCBpbiBMdW5cbiIpKTsKKwkJCWJyZWFrOwogCQkvKiBUaGUgdGFzayBpcyBub3QgaW4gTHVuIG9yIGZhaWxlZCwgcmVzZXQgdGhlIHBoeSAqLwogCQljYXNlIFRNRl9SRVNQX0ZVTkNfRkFJTEVEOgogCQljYXNlIFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU6CiAJCQlQTTgwMDFfRUhfREJHKHBtODAwMV9oYSwKIAkJCXBtODAwMV9wcmludGsoIlRoZSB0YXNrIGlzIG5vdCBpbiBMdW4gb3IgZmFpbGVkLCIKLQkJCSIgcmVzZXQgdGhlIHBoeSBcbiIpKTsKKwkJCSIgcmVzZXQgdGhlIHBoeVxuIikpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuaCBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCmluZGV4IGI5N2M4YWIuLjkzOTU5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX3Nhcy5oCkBAIC00NzEsOCArNDcxLDYgQEAKIAlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssIHN0cnVjdCBwbTgwMDFfY2NiX2luZm8gKmNjYiwgdTMyIGNjYl9pZHgpOwogaW50IHBtODAwMV9waHlfY29udHJvbChzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHksIGVudW0gcGh5X2Z1bmMgZnVuYywKIAl2b2lkICpmdW5jZGF0YSk7Ci1pbnQgcG04MDAxX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXYpOwotaW50IHBtODAwMV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKIHZvaWQgcG04MDAxX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogaW50IHBtODAwMV9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpOwogaW50IHBtODAwMV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgY29uc3QgaW50IG51bSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IGI4NmRiODQuLjUxNjNlZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtNDEwMiw3ICs0MTAyLDcgQEAKIAlzdHJ1Y3QgcG1jcmFpZF9pb2N0bF9oZWFkZXIgKmhkciA9IE5VTEw7CiAJaW50IHJldHZhbCA9IC1FTk9UVFk7CiAKLQloZHIgPSBrbWFsbG9jKEdGUF9LRVJORUwsIHNpemVvZihzdHJ1Y3QgcG1jcmFpZF9pb2N0bF9oZWFkZXIpKTsKKwloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG1jcmFpZF9pb2N0bF9oZWFkZXIpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghaGRyKSB7CiAJCXBtY3JhaWRfZXJyKCJmYWlsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGlvY3RsIGhlYWRlclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcHMzcm9tLmMgYi9kcml2ZXJzL3Njc2kvcHMzcm9tLmMKaW5kZXggY2QxNzhiOS4uOTU5ZjEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BzM3JvbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wczNyb20uYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCBhMzFlMDVmLi5hYzMyNmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTIzLDExICsyMywyMyBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzaG9zdF9wcml2KGRldl90b19zaG9zdChjb250YWluZXJfb2Yoa29iaiwKIAkgICAgc3RydWN0IGRldmljZSwga29iaikpKTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlpbnQgcnZhbCA9IDA7CiAKIAlpZiAoaGEtPmZ3X2R1bXBfcmVhZGluZyA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLCBoYS0+ZndfZHVtcCwKKwlpZiAoSVNfUUxBODJYWChoYSkpIHsKKwkJaWYgKG9mZiA8IGhhLT5tZF90ZW1wbGF0ZV9zaXplKSB7CisJCQlydmFsID0gbWVtb3J5X3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwKKwkJCSAgICAmb2ZmLCBoYS0+bWRfdG1wbHRfaGRyLCBoYS0+bWRfdGVtcGxhdGVfc2l6ZSk7CisJCQlyZXR1cm4gcnZhbDsKKwkJfQorCQlvZmYgLT0gaGEtPm1kX3RlbXBsYXRlX3NpemU7CisJCXJ2YWwgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LAorCQkgICAgJm9mZiwgaGEtPm1kX2R1bXAsIGhhLT5tZF9kdW1wX3NpemUpOworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UKKwkJcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIGhhLT5md19kdW1wLAogCQkJCQloYS0+ZndfZHVtcF9sZW4pOwogfQogCkBAIC00MSwxMiArNTMsNiBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCByZWFkaW5nOwogCi0JaWYgKElTX1FMQTgyWFgoaGEpKSB7Ci0JCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNWIsCi0JCSAgICAiRmlybXdhcmUgZHVtcCBub3Qgc3VwcG9ydGVkIGZvciBJU1A4Mnh4XG4iKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQogCWlmIChvZmYgIT0gMCkKIAkJcmV0dXJuICgwKTsKIApAQCAtNTksNiArNjUsMTAgQEAKIAkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA1ZCwKIAkJICAgICJGaXJtd2FyZSBkdW1wIGNsZWFyZWQgb24gKCVsZCkuXG4iLCB2aGEtPmhvc3Rfbm8pOwogCisJCWlmIChJU19RTEE4MlhYKHZoYS0+aHcpKSB7CisJCQlxbGE4Mnh4X21kX2ZyZWUodmhhKTsKKwkJCXFsYTgyeHhfbWRfcHJlcCh2aGEpOworCQl9CiAJCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOwogCQloYS0+ZndfZHVtcGVkID0gMDsKIAkJYnJlYWs7CkBAIC03NSwxMCArODUsMjkgQEAKIAkJcWxhMngwMF9hbGxvY19md19kdW1wKHZoYSk7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQkJcWxhMngwMF9zeXN0ZW1fZXJyb3IodmhhKTsKKwkJaWYgKElTX1FMQTgyWFgoaGEpKSB7CisJCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwkJCXFsYTgyeHhfc2V0X3Jlc2V0X293bmVyKHZoYSk7CisJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOworCQl9IGVsc2UKKwkJCXFsYTJ4MDBfc3lzdGVtX2Vycm9yKHZoYSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKElTX1FMQTgyWFgoaGEpKSB7CisJCQlpZiAoaGEtPm1kX3RtcGx0X2hkcikKKwkJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDViLAorCQkJCSAgICAiTWluaUR1bXAgc3VwcG9ydGVkIHdpdGggdGhpcyBmaXJtd2FyZS5cbiIpOworCQkJZWxzZQorCQkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwOWQsCisJCQkJICAgICJNaW5pRHVtcCBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBmaXJtd2FyZS5cbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgNToKKwkJaWYgKElTX1FMQTgyWFgoaGEpKQorCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIChjb3VudCk7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNmc19md19kdW1wX2F0dHIgPSB7CkBAIC0xMjIsNyArMTUxLDcgQEAKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBvZmYgIT0gMCB8fCBjb3VudCAhPSBoYS0+bnZyYW1fc2l6ZSB8fAogCSAgICAhaGEtPmlzcF9vcHMtPndyaXRlX252cmFtKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBDaGVja3N1bSBOVlJBTS4gKi8KIAlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewpAQCAtMTY1LDcgKzE5NCw3IEBACiAJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCXFsYTJ4MDBfd2FpdF9mb3JfY2hpcF9yZXNldCh2aGEpOwogCi0JcmV0dXJuIChjb3VudCk7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgc3lzZnNfbnZyYW1fYXR0ciA9IHsKQEAgLTIzOSwxMCArMjY4LDEwIEBACiAJaW50IHZhbCwgdmFsaWQ7CiAKIAlpZiAob2ZmKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVkOiV4OiV4IiwgJnZhbCwgJnN0YXJ0LCAmc2l6ZSkgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI1Myw3ICsyODIsNyBAQAogCWNhc2UgMDoKIAkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NSRUFESU5HICYmCiAJCSAgICBoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykKLQkJCWJyZWFrOworCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKIApAQCAtMjY2LDcgKzI5NSw3IEBACiAJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQloYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCA9IHN0YXJ0OwogCQloYS0+b3B0cm9tX3JlZ2lvbl9zaXplID0gc3RhcnQgKyBzaXplID4gaGEtPm9wdHJvbV9zaXplID8KQEAgLTI4MCw3ICszMDksNyBAQAogCQkJICAgICIoJXgpLlxuIiwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7Ci0JCQlyZXR1cm4gY291bnQ7CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewpAQCAtMjk5LDcgKzMyOCw3IEBACiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkvKgogCQkgKiBXZSBuZWVkIHRvIGJlIG1vcmUgcmVzdHJpY3RpdmUgb24gd2hpY2ggRkxBU0ggcmVnaW9ucyBhcmUKQEAgLTM0Nyw3ICszNzYsNyBAQAogCQkJICAgICIoJXgpXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKLQkJCXJldHVybiBjb3VudDsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKIAkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2NywKQEAgLTM1OCw3ICszODcsNyBAQAogCQlicmVhazsKIAljYXNlIDM6CiAJCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV1JJVElORykKLQkJCWJyZWFrOworCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY4LApAQCAtMzc0LDcgKzQwMyw3IEBACiAJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWNvdW50ID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTM5OCwxMCArNDI3LDEwIEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChJU19OT0NBQ0hFX1ZQRF9UWVBFKGhhKSkKIAkJaGEtPmlzcF9vcHMtPnJlYWRfb3B0cm9tKHZoYSwgaGEtPnZwZCwgaGEtPmZsdF9yZWdpb25fdnBkIDw8IDIsCkBAIC00MzgsMTcgKzQ2NywxNyBAQAogCiAJLyogVXBkYXRlIGZsYXNoIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIDRHYiAmIGFib3ZlLiAqLwogCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSkKLQkJZ290byBkb25lOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRtcF9kYXRhID0gdm1hbGxvYygyNTYpOwogCWlmICghdG1wX2RhdGEpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2YiwKIAkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBWUEQgaW5mb3JtYXRpb24gdXBkYXRlLlxuIik7Ci0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbih2aGEsIHRtcF9kYXRhKTsKIAl2ZnJlZSh0bXBfZGF0YSk7Ci1kb25lOgorCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC01MDUsOCArNTM0LDcgQEAKIAkJCSAgICAiVW5hYmxlIHRvIHJlYWQgU0ZQIGRhdGEgKCV4LyV4LyV4KS5cbiIsIHJ2YWwsCiAJCQkgICAgYWRkciwgb2Zmc2V0KTsKIAotCQkJY291bnQgPSAwOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQltZW1jcHkoYnVmLCBoYS0+c2ZwX2RhdGEsIFNGUF9CTE9DS19TSVpFKTsKIAkJYnVmICs9IFNGUF9CTE9DS19TSVpFOwpAQCAtNTM2LDcgKzU2NCw3IEBACiAJaW50IHR5cGU7CiAKIAlpZiAob2ZmICE9IDApCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXR5cGUgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwogCXN3aXRjaCAodHlwZSkgewpAQCAtNTQ2LDEzICs1NzQsMTggQEAKIAogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJaWYgKElTX1FMQTgyWFgoaGEpKSB7CisJCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwkJCXFsYTgyeHhfc2V0X3Jlc2V0X293bmVyKHZoYSk7CisJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOworCQl9CiAJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAkJcWxhMngwMF93YWl0X2Zvcl9jaGlwX3Jlc2V0KHZoYSk7CiAJCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOwogCQlicmVhazsKIAljYXNlIDB4MjAyNWQ6CiAJCWlmICghSVNfUUxBODFYWChoYSkpCi0JCQlicmVhazsKKwkJCXJldHVybiAtRVBFUk07CiAKIAkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA2ZiwKIAkJICAgICJJc3N1aW5nIE1QSSByZXNldC5cbiIpOwpAQCAtNTcxLDcgKzYwNCw3IEBACiAJCWlmICghSVNfUUxBODJYWChoYSkgfHwgdmhhICE9IGJhc2VfdmhhKSB7CiAJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDcxLAogCQkJICAgICJGQ29FIGN0eCByZXNldCBubyBzdXBwb3J0ZWQuXG4iKTsKLQkJCXJldHVybiBjb3VudDsKKwkJCXJldHVybiAtRVBFUk07CiAJCX0KIAogCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDcyLApAQCAtNjA3LDcgKzY0MCw3IEBACiAJaGEtPmVkY19kYXRhX2xlbiA9IDA7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgPCA4KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWhhLT5lZGNfZGF0YSkgewogCQloYS0+ZWRjX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKQEAgLTYxNSw3ICs2NDgsNyBAQAogCQlpZiAoIWhhLT5lZGNfZGF0YSkgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3MywKIAkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRURDIHdyaXRlLlxuIik7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQogCkBAIC02MzQsOSArNjY3LDkgQEAKIAkgICAgZGV2LCBhZHIsIGxlbiwgb3B0KTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc0LAotCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgKCV4KSAlMDJ4OiUwNHg6JTAyeDolMDJ4XG4iLAorCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgKCV4KSAlMDJ4OiUwNHg6JTAyeDolMDJoaHhcbiIsCiAJCSAgICBydmFsLCBkZXYsIGFkciwgb3B0LCBsZW4sIGJ1Zls4XSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC02NjUsNyArNjk4LDcgQEAKIAloYS0+ZWRjX2RhdGFfbGVuID0gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBvZmYgIT0gMCB8fCBjb3VudCA8IDgpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghaGEtPmVkY19kYXRhKSB7CiAJCWhhLT5lZGNfZGF0YSA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLApAQCAtNjczLDcgKzcwNiw3IEBACiAJCWlmICghaGEtPmVkY19kYXRhKSB7CiAJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDhjLAogCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFREMgc3RhdHVzLlxuIik7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQogCkBAIC02OTMsNyArNzI2LDcgQEAKIAkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA3NSwKIAkJICAgICJVbmFibGUgdG8gd3JpdGUgRURDIHN0YXR1cyAoJXgpICUwMng6JTA0eDolMDJ4LlxuIiwKIAkJICAgIHJ2YWwsIGRldiwgYWRyLCBvcHQsIGxlbik7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAloYS0+ZWRjX2RhdGFfbGVuID0gbGVuOwpAQCAtODA1LDcgKzgzOCw3IEBACiAJaWYgKCFoYS0+ZGNieF90bHYpIHsKIAkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3OCwKIAkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBEQ0JYIFRMViByZWFkLWRhdGEuXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogZG9fcmVhZDoKQEAgLTgxNyw3ICs4NTAsNyBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzksCiAJCSAgICAiVW5hYmxlIHRvIHJlYWQgRENCWCBUTFYgKCV4KS5cbiIsIHJ2YWwpOwotCQljb3VudCA9IDA7CisJCXJldHVybiAtRUlPOwogCX0KIAogCW1lbWNweShidWYsIGhhLT5kY2J4X3RsdiwgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCmluZGV4IDA3ZDE3NjcuLjhiNjQxYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKQEAgLTcwNCw2ICs3MDQsNyBAQAogCWVscmVxLm9wdGlvbnMgPSBic2dfam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKIAogCWlmICgoaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPT0gSVNQX0NGR19GIHx8CisJICAgIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04pIHx8CiAJICAgIChJU19RTEE4MVhYKGhhKSAmJgogCSAgICBsZTMyX3RvX2NwdSgqKHVpbnQzMl90ICopcmVxX2RhdGEpID09IEVMU19PUENPREVfQllURQogCSAgICAmJiByZXFfZGF0YV9sZW4gPT0gTUFYX0VMU19GUkFNRV9QQVlMT0FEKSkgJiYKQEAgLTE0NDcsNiArMTQ0OCwxNDggQEAKIH0KIAogc3RhdGljIGludAorcWxhMngwMF91cGRhdGVfZnJ1X3ZlcnNpb25zKHN0cnVjdCBmY19ic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBic2dfam9iLT5zaG9zdDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoaG9zdCk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJaW50IHJ2YWwgPSAwOworCXVpbnQ4X3QgYnNnW0RNQV9QT09MX1NJWkVdOworCXN0cnVjdCBxbGFfaW1hZ2VfdmVyc2lvbl9saXN0ICpsaXN0ID0gKHZvaWQgKilic2c7CisJc3RydWN0IHFsYV9pbWFnZV92ZXJzaW9uICppbWFnZTsKKwl1aW50MzJfdCBjb3VudDsKKwlkbWFfYWRkcl90IHNmcF9kbWE7CisJdm9pZCAqc2ZwID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZzZnBfZG1hKTsKKwlpZiAoIXNmcCkgeworCQlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9CisJCSAgICBFWFRfU1RBVFVTX05PX01FTU9SWTsKKwkJZ290byBkb25lOworCX0KKworCXNnX2NvcHlfdG9fYnVmZmVyKGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAorCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBsaXN0LCBzaXplb2YoYnNnKSk7CisKKwlpbWFnZSA9IGxpc3QtPnZlcnNpb247CisJY291bnQgPSBsaXN0LT5jb3VudDsKKwl3aGlsZSAoY291bnQtLSkgeworCQltZW1jcHkoc2ZwLCAmaW1hZ2UtPmZpZWxkX2luZm8sIHNpemVvZihpbWFnZS0+ZmllbGRfaW5mbykpOworCQlydmFsID0gcWxhMngwMF93cml0ZV9zZnAodmhhLCBzZnBfZG1hLCBzZnAsCisJCSAgICBpbWFnZS0+ZmllbGRfYWRkcmVzcy5kZXZpY2UsIGltYWdlLT5maWVsZF9hZGRyZXNzLm9mZnNldCwKKwkJICAgIHNpemVvZihpbWFnZS0+ZmllbGRfaW5mbyksIGltYWdlLT5maWVsZF9hZGRyZXNzLm9wdGlvbik7CisJCWlmIChydmFsKSB7CisJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfZGF0YS52ZW5kb3JfcmVwbHkudmVuZG9yX3JzcFswXSA9CisJCQkgICAgRVhUX1NUQVRVU19NQUlMQk9YOworCQkJZ290byBkZWFsbG9jOworCQl9CisJCWltYWdlKys7CisJfQorCisJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPSAwOworCitkZWFsbG9jOgorCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHNmcCwgc2ZwX2RtYSk7CisKK2RvbmU6CisJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOworCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWxhMngwMF9yZWFkX2ZydV9zdGF0dXMoc3RydWN0IGZjX2JzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGJzZ19qb2ItPnNob3N0OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlpbnQgcnZhbCA9IDA7CisJdWludDhfdCBic2dbRE1BX1BPT0xfU0laRV07CisJc3RydWN0IHFsYV9zdGF0dXNfcmVnICpzciA9ICh2b2lkICopYnNnOworCWRtYV9hZGRyX3Qgc2ZwX2RtYTsKKwl1aW50OF90ICpzZnAgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnNmcF9kbWEpOworCWlmICghc2ZwKSB7CisJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9kYXRhLnZlbmRvcl9yZXBseS52ZW5kb3JfcnNwWzBdID0KKwkJICAgIEVYVF9TVEFUVVNfTk9fTUVNT1JZOworCQlnb3RvIGRvbmU7CisJfQorCisJc2dfY29weV90b19idWZmZXIoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIHNyLCBzaXplb2YoKnNyKSk7CisKKwlydmFsID0gcWxhMngwMF9yZWFkX3NmcCh2aGEsIHNmcF9kbWEsIHNmcCwKKwkgICAgc3ItPmZpZWxkX2FkZHJlc3MuZGV2aWNlLCBzci0+ZmllbGRfYWRkcmVzcy5vZmZzZXQsCisJICAgIHNpemVvZihzci0+c3RhdHVzX3JlZyksIHNyLT5maWVsZF9hZGRyZXNzLm9wdGlvbik7CisJc3ItPnN0YXR1c19yZWcgPSAqc2ZwOworCisJaWYgKHJ2YWwpIHsKKwkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPQorCQkgICAgRVhUX1NUQVRVU19NQUlMQk9YOworCQlnb3RvIGRlYWxsb2M7CisJfQorCisJc2dfY29weV9mcm9tX2J1ZmZlcihic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCisJICAgIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LCBzciwgc2l6ZW9mKCpzcikpOworCisJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPSAwOworCitkZWFsbG9jOgorCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHNmcCwgc2ZwX2RtYSk7CisKK2RvbmU6CisJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOworCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSBzaXplb2YoKnNyKTsKKwlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCWJzZ19qb2ItPmpvYl9kb25lKGJzZ19qb2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTJ4MDBfd3JpdGVfZnJ1X3N0YXR1cyhzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gYnNnX2pvYi0+c2hvc3Q7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGhvc3QpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBydmFsID0gMDsKKwl1aW50OF90IGJzZ1tETUFfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgcWxhX3N0YXR1c19yZWcgKnNyID0gKHZvaWQgKilic2c7CisJZG1hX2FkZHJfdCBzZnBfZG1hOworCXVpbnQ4X3QgKnNmcCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmc2ZwX2RtYSk7CisJaWYgKCFzZnApIHsKKwkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPQorCQkgICAgRVhUX1NUQVRVU19OT19NRU1PUlk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZ19jb3B5X3RvX2J1ZmZlcihic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwKKwkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgc3IsIHNpemVvZigqc3IpKTsKKworCSpzZnAgPSBzci0+c3RhdHVzX3JlZzsKKwlydmFsID0gcWxhMngwMF93cml0ZV9zZnAodmhhLCBzZnBfZG1hLCBzZnAsCisJICAgIHNyLT5maWVsZF9hZGRyZXNzLmRldmljZSwgc3ItPmZpZWxkX2FkZHJlc3Mub2Zmc2V0LAorCSAgICBzaXplb2Yoc3ItPnN0YXR1c19yZWcpLCBzci0+ZmllbGRfYWRkcmVzcy5vcHRpb24pOworCisJaWYgKHJ2YWwpIHsKKwkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPQorCQkgICAgRVhUX1NUQVRVU19NQUlMQk9YOworCQlnb3RvIGRlYWxsb2M7CisJfQorCisJYnNnX2pvYi0+cmVwbHktPnJlcGx5X2RhdGEudmVuZG9yX3JlcGx5LnZlbmRvcl9yc3BbMF0gPSAwOworCitkZWFsbG9jOgorCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHNmcCwgc2ZwX2RtYSk7CisKK2RvbmU6CisJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOworCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJYnNnX2pvYi0+am9iX2RvbmUoYnNnX2pvYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAogcWxhMngwMF9wcm9jZXNzX3ZlbmRvcl9zcGVjaWZpYyhzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYikKIHsKIAlzd2l0Y2ggKGJzZ19qb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzBdKSB7CkBAIC0xNDc0LDYgKzE2MTcsMTUgQEAKIAljYXNlIFFMX1ZORF9VUERBVEVfRkxBU0g6CiAJCXJldHVybiBxbGEyeDAwX3VwZGF0ZV9vcHRyb20oYnNnX2pvYik7CiAKKwljYXNlIFFMX1ZORF9TRVRfRlJVX1ZFUlNJT046CisJCXJldHVybiBxbGEyeDAwX3VwZGF0ZV9mcnVfdmVyc2lvbnMoYnNnX2pvYik7CisKKwljYXNlIFFMX1ZORF9SRUFEX0ZSVV9TVEFUVVM6CisJCXJldHVybiBxbGEyeDAwX3JlYWRfZnJ1X3N0YXR1cyhic2dfam9iKTsKKworCWNhc2UgUUxfVk5EX1dSSVRFX0ZSVV9TVEFUVVM6CisJCXJldHVybiBxbGEyeDAwX3dyaXRlX2ZydV9zdGF0dXMoYnNnX2pvYik7CisKIAlkZWZhdWx0OgogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAJCWJzZ19qb2ItPmpvYl9kb25lKGJzZ19qb2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5oCmluZGV4IDBmMGY1NGUuLjcwY2FhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmgKQEAgLTE2LDYgKzE2LDE2IEBACiAjZGVmaW5lIFFMX1ZORF9GQ1BfUFJJT19DRkdfQ01ECTB4MDYKICNkZWZpbmUgUUxfVk5EX1JFQURfRkxBU0gJMHgwNwogI2RlZmluZSBRTF9WTkRfVVBEQVRFX0ZMQVNICTB4MDgKKyNkZWZpbmUgUUxfVk5EX1NFVF9GUlVfVkVSU0lPTgkweDBCCisjZGVmaW5lIFFMX1ZORF9SRUFEX0ZSVV9TVEFUVVMJMHgwQworI2RlZmluZSBRTF9WTkRfV1JJVEVfRlJVX1NUQVRVUwkweDBECisKKy8qIEJTRyBWZW5kb3Igc3BlY2lmaWMgc3ViY29kZSByZXR1cm5zICovCisjZGVmaW5lIEVYVF9TVEFUVVNfT0sJCQkwCisjZGVmaW5lIEVYVF9TVEFUVVNfRVJSCQkJMQorI2RlZmluZSBFWFRfU1RBVFVTX0lOVkFMSURfUEFSQU0JNgorI2RlZmluZSBFWFRfU1RBVFVTX01BSUxCT1gJCTExCisjZGVmaW5lIEVYVF9TVEFUVVNfTk9fTUVNT1JZCQkxNwogCiAvKiBCU0cgZGVmaW5hdGlvbnMgZm9yIGludGVycHJldGluZyBDb21tYW5kU2VudCBmaWVsZCAqLwogI2RlZmluZSBJTlRfREVGX0xCX0xPT1BCQUNLX0NNRCAgICAgICAgIDAKQEAgLTE0MSw0ICsxNTEsMzYgQEAKIAl1aW50MTZfdCBtb2RlOwogCXVpbnQxNl90IHNwZWVkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogRlJVIFZQRCAqLworCisjZGVmaW5lIE1BWF9GUlVfU0laRQkzNgorCitzdHJ1Y3QgcWxhX2ZpZWxkX2FkZHJlc3MgeworCXVpbnQxNl90IG9mZnNldDsKKwl1aW50MTZfdCBkZXZpY2U7CisJdWludDE2X3Qgb3B0aW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IHFsYV9maWVsZF9pbmZvIHsKKwl1aW50OF90IHZlcnNpb25bTUFYX0ZSVV9TSVpFXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxbGFfaW1hZ2VfdmVyc2lvbiB7CisJc3RydWN0IHFsYV9maWVsZF9hZGRyZXNzIGZpZWxkX2FkZHJlc3M7CisJc3RydWN0IHFsYV9maWVsZF9pbmZvIGZpZWxkX2luZm87Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcWxhX2ltYWdlX3ZlcnNpb25fbGlzdCB7CisJdWludDMyX3QgY291bnQ7CisJc3RydWN0IHFsYV9pbWFnZV92ZXJzaW9uIHZlcnNpb25bMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcWxhX3N0YXR1c19yZWcgeworCXN0cnVjdCBxbGFfZmllbGRfYWRkcmVzcyBmaWVsZF9hZGRyZXNzOworCXVpbnQ4X3Qgc3RhdHVzX3JlZzsKKwl1aW50OF90IHJlc2VydmVkWzddOworfSBfX3BhY2tlZDsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKaW5kZXggZDc5Y2Q4YS4uOWRmNDc4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwpAQCAtMTIsNyArMTIsNyBAQAogICogfCAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgIHwgICBMYXN0IFZhbHVlIFVzZWQgIHwgICAgIEhvbGVzCXwKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIHwgTW9kdWxlIEluaXQgYW5kIFByb2JlICAgICAgICB8ICAgICAgIDB4MDExNiAgICAgICB8ICAJCXwKLSAqIHwgTWFpbGJveCBjb21tYW5kcyAgICAgICAgICAgICB8ICAgICAgIDB4MTEyNiAgICAgICB8CQl8CisgKiB8IE1haWxib3ggY29tbWFuZHMgICAgICAgICAgICAgfCAgICAgICAweDExMjkgICAgICAgfAkJfAogICogfCBEZXZpY2UgRGlzY292ZXJ5ICAgICAgICAgICAgIHwgICAgICAgMHgyMDgzICAgICAgIHwJCXwKICAqIHwgUXVldWUgQ29tbWFuZCBhbmQgSU8gdHJhY2luZyB8ICAgICAgIDB4MzAyZSAgICAgICB8ICAgICAweDMwMDggICAgIHwKICAqIHwgRFBDIFRocmVhZCAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4NDAxYyAgICAgICB8CQl8CkBAIC0yMiw3ICsyMiw3IEBACiAgKiB8IFRhc2sgTWFuYWdlbWVudCAgICAgICAgICAgICAgfCAgICAgICAweDgwNDEgICAgICAgfCAgICAJCXwKICAqIHwgQUVSL0VFSCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4OTAwZiAgICAgICB8CQl8CiAgKiB8IFZpcnR1YWwgUG9ydCAgICAgICAgICAgICAgICAgfCAgICAgICAweGEwMDcgICAgICAgfAkJfAotICogfCBJU1A4MlhYIFNwZWNpZmljICAgICAgICAgICAgIHwgICAgICAgMHhiMDRmICAgICAgIHwgICAgCQl8CisgKiB8IElTUDgyWFggU3BlY2lmaWMgICAgICAgICAgICAgfCAgICAgICAweGIwNTEgICAgICAgfCAgICAJCXwKICAqIHwgTXVsdGlRICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4YzAwYiAgICAgICB8CQl8CiAgKiB8IE1pc2MgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGQwMGIgICAgICAgfAkJfAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDAzLDcgKzQwMyw3IEBACiAJcmV0dXJuIHB0ciArIHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBxbGEyeHh4X2R1bXBfcG9zdF9wcm9jZXNzKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgcnZhbCkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCBhMDNlYWY0Li5mY2YwNTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yNDM4LDcgKzI0MzgsOCBAQAogCQl1aW50MzJfdAlxdWllc2NlX293bmVyOjE7CiAJCXVpbnQzMl90CXRoZXJtYWxfc3VwcG9ydGVkOjE7CiAJCXVpbnQzMl90CWlzcDgyeHhfcmVzZXRfaGRscl9hY3RpdmU6MTsKLQkJLyogMjYgYml0cyAqLworCQl1aW50MzJfdAlpc3A4Mnh4X3Jlc2V0X293bmVyOjE7CisJCS8qIDI4IGJpdHMgKi8KIAl9IGZsYWdzOwogCiAJLyogVGhpcyBzcGlubG9jayBpcyB1c2VkIHRvIHByb3RlY3QgImlvIHRyYW5zYWN0aW9ucyIsIHlvdSBtdXN0CkBAIC0yODIyLDYgKzI4MjMsMTIgQEAKIAogCXVpbnQ4X3QgZndfdHlwZTsKIAlfX2xlMzIgZmlsZV9wcmRfb2ZmOwkvKiBGaWxlIGZpcm13YXJlIHByb2R1Y3Qgb2Zmc2V0ICovCisKKwl1aW50MzJfdAltZF90ZW1wbGF0ZV9zaXplOworCXZvaWQJCSptZF90bXBsdF9oZHI7CisJZG1hX2FkZHJfdCAgICAgIG1kX3RtcGx0X2hkcl9kbWE7CisJdm9pZCAgICAgICAgICAgICptZF9kdW1wOworCXVpbnQzMl90CW1kX2R1bXBfc2l6ZTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggMjliMWEzZS4uY2UzMmQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMTA0LDYgKzEwNCw4IEBACiBleHRlcm4gaW50IHFsMnh0YXJnZXRyZXNldDsKIGV4dGVybiBpbnQgcWwyeGRvbnRyZXNldGhiYTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcWwyeG1heGx1bjsKK2V4dGVybiBpbnQgcWwyeG1kY2FwbWFzazsKK2V4dGVybiBpbnQgcWwyeG1kZW5hYmxlOwogCiBleHRlcm4gaW50IHFsYTJ4MDBfbG9vcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwpAQCAtNDA3LDYgKzQwOSw4IEBACiBleHRlcm4gaW50IHFsYTI0eHhfYmVhY29uX29uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogZXh0ZXJuIGludCBxbGEyNHh4X2JlYWNvbl9vZmYoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gdm9pZCBxbGEyNHh4X2JlYWNvbl9ibGluayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKK2V4dGVybiBpbnQgcWxhODJ4eF9iZWFjb25fb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitleHRlcm4gaW50IHFsYTgyeHhfYmVhY29uX29mZihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIAogZXh0ZXJuIHVpbnQ4X3QgKnFsYTJ4MDBfcmVhZF9vcHRyb21fZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50OF90ICosCiAgICAgdWludDMyX3QsIHVpbnQzMl90KTsKQEAgLTQ0Miw2ICs0NDYsNyBAQAogZXh0ZXJuIHZvaWQgcWxfZHVtcF9yZWdzKHVpbnQzMl90LCBzY3NpX3FsYV9ob3N0X3QgKiwgaW50MzJfdCk7CiBleHRlcm4gdm9pZCBxbF9kdW1wX2J1ZmZlcih1aW50MzJfdCwgc2NzaV9xbGFfaG9zdF90ICosIGludDMyX3QsCiAJdWludDhfdCAqLCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBxbGEyeHh4X2R1bXBfcG9zdF9wcm9jZXNzKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2dzLmMgc291cmNlIGZpbGUuCkBAIC01NjksNyArNTc0LDEwIEBACiBleHRlcm4gaW50IHFsYTgyeHhfbWJ4X2ludHJfZGlzYWJsZShzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGE4Mnh4X3N0YXJ0X2lvY2JzKHNyYl90ICopOwogZXh0ZXJuIGludCBxbGE4Mnh4X2Zjb2VfY3R4X3Jlc2V0KHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBpbnQgcWxhODJ4eF9jaGVja19tZF9uZWVkZWQoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIHZvaWQgcWxhODJ4eF9jaGlwX3Jlc2V0X2NsZWFudXAoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGE4Mnh4X21ieF9iZWFjb25fY3RsKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOworZXh0ZXJuIGNoYXIgKnFkZXZfc3RhdGUodWludDMyX3QpOwogCiAvKiBCU0cgcmVsYXRlZCBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgcWxhMjR4eF9ic2dfcmVxdWVzdChzdHJ1Y3QgZmNfYnNnX2pvYiAqKTsKQEAgLTU3OSw0ICs1ODcsMTQgQEAKIAlkbWFfYWRkcl90LCBzaXplX3QsIHVpbnQzMl90KTsKIGV4dGVybiBpbnQgcWxhMngwMF9nZXRfaWRtYV9zcGVlZChzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QsCiAJdWludDE2X3QgKiwgdWludDE2X3QgKik7CisKKy8qIE1pbmlkdW1wIHJlbGF0ZWQgZnVuY3Rpb25zICovCitleHRlcm4gaW50IHFsYTgyeHhfbWRfZ2V0X3RlbXBsYXRlX3NpemUoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIGludCBxbGE4Mnh4X21kX2dldF90ZW1wbGF0ZShzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gaW50IHFsYTgyeHhfbWRfYWxsb2Moc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhODJ4eF9tZF9mcmVlKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiBpbnQgcWxhODJ4eF9tZF9jb2xsZWN0KHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTgyeHhfbWRfcHJlcChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGE4Mnh4X3NldF9yZXNldF9vd25lcihzY3NpX3FsYV9ob3N0X3QgKik7CisKICNlbmRpZiAvKiBfUUxBX0dCTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCAzN2RhMDRkLi5mMDNlOTE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0xNDgwLDEzICsxNDgwLDE5IEBACiAJCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewogZW5hYmxlXzgyeHhfbnBpdjoKIAkJCQlmd19tYWpvcl92ZXJzaW9uID0gaGEtPmZ3X21ham9yX3ZlcnNpb247Ci0JCQkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24odmhhLAotCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCi0JCQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwKLQkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAotCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUsCi0JCQkJICAgIGhhLT5tcGlfdmVyc2lvbiwgJmhhLT5tcGlfY2FwYWJpbGl0aWVzLAotCQkJCSAgICBoYS0+cGh5X3ZlcnNpb24pOworCQkJCWlmIChJU19RTEE4MlhYKGhhKSkKKwkJCQkJcWxhODJ4eF9jaGVja19tZF9uZWVkZWQodmhhKTsKKwkJCQllbHNlIHsKKwkJCQkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24odmhhLAorCQkJCQkgICAgJmhhLT5md19tYWpvcl92ZXJzaW9uLAorCQkJCQkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLAorCQkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAorCQkJCQkgICAgJmhhLT5md19hdHRyaWJ1dGVzLAorCQkJCQkgICAgJmhhLT5md19tZW1vcnlfc2l6ZSwKKwkJCQkJICAgIGhhLT5tcGlfdmVyc2lvbiwKKwkJCQkJICAgICZoYS0+bXBpX2NhcGFiaWxpdGllcywKKwkJCQkJICAgIGhhLT5waHlfdmVyc2lvbik7CisJCQkJfQogCQkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQkJCQlnb3RvIGZhaWxlZDsKIAkJCQloYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgPSAwOwpAQCAtMTUwMywxMCArMTUwOSw4IEBACiAJCQkJICAgICZoYS0+ZndfeGNiX2NvdW50LCBOVUxMLCBOVUxMLAogCQkJCSAgICAmaGEtPm1heF9ucGl2X3Zwb3J0cywgTlVMTCk7CiAKLQkJCQlpZiAoIWZ3X21ham9yX3ZlcnNpb24gJiYgcWwyeGFsbG9jZndkdW1wKSB7Ci0JCQkJCWlmICghSVNfUUxBODJYWChoYSkpCi0JCQkJCQlxbGEyeDAwX2FsbG9jX2Z3X2R1bXAodmhhKTsKLQkJCQl9CisJCQkJaWYgKCFmd19tYWpvcl92ZXJzaW9uICYmIHFsMnhhbGxvY2Z3ZHVtcCkKKwkJCQkJcWxhMngwMF9hbGxvY19md19kdW1wKHZoYSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBjZCwKQEAgLTE5MjQsNyArMTkyOCw3IEBACiAJCQkJCXJ2YWwgPSBxbGE4NHh4X2luaXRfY2hpcCh2aGEpOwogCQkJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLAotCQkJCQkJICAgIHZoYSwgMHg4MDQzLAorCQkJCQkJICAgIHZoYSwgMHg4MDI2LAogCQkJCQkJICAgICJJbml0IGNoaXAgZmFpbGVkLlxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtMTkzMyw3ICsxOTM3LDcgQEAKIAkJCQkJY3M4NHh4X3RpbWUgPSBqaWZmaWVzIC0gY3M4NHh4X3RpbWU7CiAJCQkJCXd0aW1lICs9IGNzODR4eF90aW1lOwogCQkJCQltdGltZSArPSBjczg0eHhfdGltZTsKLQkJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwNDIsCisJCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDI1LAogCQkJCQkgICAgIkluY3JlYXNpbmcgd2FpdCB0aW1lIGJ5ICVsZC4gIgogCQkJCQkgICAgIk5ldyB0aW1lICVsZC5cbiIsIGNzODR4eF90aW1lLAogCQkJCQkgICAgd3RpbWUpOwpAQCAtNTQ0MywxMSArNTQ0Nyw3IEBACiAJCWNsZWFyX2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncyk7CiAKIAkJLyogVXBkYXRlIHRoZSBmaXJtd2FyZSB2ZXJzaW9uICovCi0JCXFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24odmhhLCAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCi0JCSAgICAmaGEtPmZ3X21pbm9yX3ZlcnNpb24sICZoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwKLQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSwKLQkJICAgIGhhLT5tcGlfdmVyc2lvbiwgJmhhLT5tcGlfY2FwYWJpbGl0aWVzLAotCQkgICAgaGEtPnBoeV92ZXJzaW9uKTsKKwkJc3RhdHVzID0gcWxhODJ4eF9jaGVja19tZF9uZWVkZWQodmhhKTsKIAogCQlpZiAoaGEtPmZjZSkgewogCQkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCA4YTc1OTFmLi4yNTE2YWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCkBAIC0yMDYwLDYgKzIwNjAsMTEgQEAKICAgICAgICAgICAgICAgICBjYXNlIEVMU19JT0NCX1RZUEU6CiAJCQlxbGEyNHh4X2Vsc19jdF9lbnRyeSh2aGEsIHJzcC0+cmVxLCBwa3QsIEVMU19JT0NCX1RZUEUpOwogCQkJYnJlYWs7CisJCWNhc2UgTUFSS0VSX1RZUEU6CisJCQkvKiBEbyBub3RoaW5nIGluIHRoaXMgY2FzZSwgdGhpcyBjaGVjayBpcyB0byBwcmV2ZW50IGl0CisJCQkgKiBmcm9tIGZhbGxpbmcgaW50byBkZWZhdWx0IGNhc2UKKwkJCSAqLworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQkvKiBUeXBlIE5vdCBTdXBwb3J0ZWQuICovCiAJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0MiwKQEAgLTIyNzQsNyArMjI3OSw3IEBACiAJaGEgPSByc3AtPmh3OwogCiAJLyogQ2xlYXIgdGhlIGludGVycnVwdCwgaWYgZW5hYmxlZCwgZm9yIHRoaXMgcmVzcG9uc2UgcXVldWUgKi8KLQlpZiAocnNwLT5vcHRpb25zICYgfkJJVF82KSB7CisJaWYgKCFoYS0+ZmxhZ3MuZGlzYWJsZV9tc2l4X2hhbmRzaGFrZSkgewogCQlyZWcgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX0NMUl9SSVNDX0lOVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggZjc2MDRlYS4uM2IzY2VjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtNDE4NiwzICs0MTg2LDEzMCBAQAogCiAJcmV0dXJuIHJ2YWw7CiB9CisKK2ludAorcWxhODJ4eF9tZF9nZXRfdGVtcGxhdGVfc2l6ZShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwltYnhfY21kX3QgbWM7CisJbWJ4X2NtZF90ICptY3AgPSAmbWM7CisJaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTFmLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKworCW1lbXNldChtY3AtPm1iLCAwICwgc2l6ZW9mKG1jcC0+bWIpKTsKKwltY3AtPm1iWzBdID0gTFNXKE1CQ19ESUFHTk9TVElDX01JTklEVU1QX1RFTVBMQVRFKTsKKwltY3AtPm1iWzFdID0gTVNXKE1CQ19ESUFHTk9TVElDX01JTklEVU1QX1RFTVBMQVRFKTsKKwltY3AtPm1iWzJdID0gTFNXKFJRU1RfVE1QTFRfU0laRSk7CisJbWNwLT5tYlszXSA9IE1TVyhSUVNUX1RNUExUX1NJWkUpOworCisJbWNwLT5vdXRfbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwltY3AtPmluX21iID0gTUJYXzE0fE1CWF8xM3xNQlhfMTJ8TUJYXzExfE1CWF8xMHxNQlhfOXxNQlhfOHwKKwkgICAgTUJYXzd8TUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisKKwltY3AtPmZsYWdzID0gTUJYX0RNQV9PVVR8TUJYX0RNQV9JTnxJT0NUTF9DTUQ7CisJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKworCS8qIEFsd2F5cyBjb3B5IGJhY2sgcmV0dXJuIG1haWxib3ggdmFsdWVzLiAqLworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyMCwKKwkJICAgICJtYWlsYm94IGNvbW1hbmQgRkFJTEVEPTB4JXgsIHN1YmNvZGU9JXguXG4iLAorCQkgICAgKG1jcC0+bWJbMV0gPDwgMTYpIHwgbWNwLT5tYlswXSwKKwkJICAgIChtY3AtPm1iWzNdIDw8IDE2KSB8IG1jcC0+bWJbMl0pOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyMSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CisJCWhhLT5tZF90ZW1wbGF0ZV9zaXplID0gKChtY3AtPm1iWzNdIDw8IDE2KSB8IG1jcC0+bWJbMl0pOworCQlpZiAoIWhhLT5tZF90ZW1wbGF0ZV9zaXplKSB7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjIsCisJCQkgICAgIk51bGwgdGVtcGxhdGUgc2l6ZSBvYnRhaW5lZC5cbiIpOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KKwl9CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhODJ4eF9tZF9nZXRfdGVtcGxhdGUoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCWludCBydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEyMywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKKwloYS0+bWRfdG1wbHRfaGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCSAgIGhhLT5tZF90ZW1wbGF0ZV9zaXplLCAmaGEtPm1kX3RtcGx0X2hkcl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghaGEtPm1kX3RtcGx0X2hkcikgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMTI0LAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1pbmlkdW1wIHRlbXBsYXRlLlxuIik7CisJCXJldHVybiBydmFsOworCX0KKworCW1lbXNldChtY3AtPm1iLCAwICwgc2l6ZW9mKG1jcC0+bWIpKTsKKwltY3AtPm1iWzBdID0gTFNXKE1CQ19ESUFHTk9TVElDX01JTklEVU1QX1RFTVBMQVRFKTsKKwltY3AtPm1iWzFdID0gTVNXKE1CQ19ESUFHTk9TVElDX01JTklEVU1QX1RFTVBMQVRFKTsKKwltY3AtPm1iWzJdID0gTFNXKFJRU1RfVE1QTFQpOworCW1jcC0+bWJbM10gPSBNU1coUlFTVF9UTVBMVCk7CisJbWNwLT5tYls0XSA9IExTVyhMU0QoaGEtPm1kX3RtcGx0X2hkcl9kbWEpKTsKKwltY3AtPm1iWzVdID0gTVNXKExTRChoYS0+bWRfdG1wbHRfaGRyX2RtYSkpOworCW1jcC0+bWJbNl0gPSBMU1coTVNEKGhhLT5tZF90bXBsdF9oZHJfZG1hKSk7CisJbWNwLT5tYls3XSA9IE1TVyhNU0QoaGEtPm1kX3RtcGx0X2hkcl9kbWEpKTsKKwltY3AtPm1iWzhdID0gTFNXKGhhLT5tZF90ZW1wbGF0ZV9zaXplKTsKKwltY3AtPm1iWzldID0gTVNXKGhhLT5tZF90ZW1wbGF0ZV9zaXplKTsKKworCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVHxNQlhfRE1BX0lOfElPQ1RMX0NNRDsKKwltY3AtPnRvdiA9IE1CWF9UT1ZfU0VDT05EUzsKKwltY3AtPm91dF9tYiA9IE1CWF8xMXxNQlhfMTB8TUJYXzl8TUJYXzh8CisJICAgIE1CWF83fE1CWF82fE1CWF81fE1CWF80fE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfM3xNQlhfMnxNQlhfMXxNQlhfMDsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOworCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTI1LAorCQkgICAgIm1haWxib3ggY29tbWFuZCBGQUlMRUQ9MHgleCwgc3ViY29kZT0leC5cbiIsCisJCSAgICAoKG1jcC0+bWJbMV0gPDwgMTYpIHwgbWNwLT5tYlswXSksCisJCSAgICAoKG1jcC0+bWJbM10gPDwgMTYpIHwgbWNwLT5tYlsyXSkpOworCX0gZWxzZQorCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjYsICJEb25lICVzLlxuIiwgX19mdW5jX18pOworCXJldHVybiBydmFsOworfQorCitpbnQKK3FsYTgyeHhfbWJ4X2JlYWNvbl9jdGwoc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludCBlbmFibGUpCit7CisJaW50IHJ2YWw7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJbWJ4X2NtZF90IG1jOworCW1ieF9jbWRfdCAqbWNwID0gJm1jOworCisJaWYgKCFJU19RTEE4MlhYKGhhKSkKKwkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjcsCisJCSJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCisJbWVtc2V0KG1jcCwgMCwgc2l6ZW9mKG1ieF9jbWRfdCkpOworCW1jcC0+bWJbMF0gPSBNQkNfU0VUX0xFRF9DT05GSUc7CisJaWYgKGVuYWJsZSkKKwkJbWNwLT5tYls3XSA9IDB4RTsKKwllbHNlCisJCW1jcC0+bWJbN10gPSAweEQ7CisKKwltY3AtPm91dF9tYiA9IE1CWF83fE1CWF8wOworCW1jcC0+aW5fbWIgPSBNQlhfMDsKKwltY3AtPnRvdiA9IDMwOworCW1jcC0+ZmxhZ3MgPSAwOworCisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMjgsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTI5LAorCQkgICAgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIHJ2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCmluZGV4IDA0OTgwN2MuLjk0YmRlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCkBAIC03LDYgKzcsOCBAQAogI2luY2x1ZGUgInFsYV9kZWYuaCIKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAKICNkZWZpbmUgTUFTSyhuKQkJCSgoMVVMTDw8KG4pKS0xKQpAQCAtMzI4LDcgKzMzMCw3IEBACiB9OwogCiAvKiBEZXZpY2Ugc3RhdGVzICovCi1jaGFyICpxZGV2X3N0YXRlW10gPSB7CitjaGFyICpxX2Rldl9zdGF0ZVtdID0gewogCSAiVW5rbm93biIsCiAJIkNvbGQiLAogCSJJbml0aWFsaXppbmciLApAQCAtMzM5LDYgKzM0MSwxMSBAQAogCSJRdWllc2NlbnQiLAogfTsKIAorY2hhciAqcWRldl9zdGF0ZSh1aW50MzJfdCBkZXZfc3RhdGUpCit7CisJcmV0dXJuIHFfZGV2X3N0YXRlW2Rldl9zdGF0ZV07Cit9CisKIC8qCiAgKiBJbjogJ29mZicgaXMgb2Zmc2V0IGZyb20gQ1JCIHNwYWNlIGluIDEyOE0gcGNpIG1hcAogICogT3V0OiAnb2ZmJyBpcyAyTSBwY2kgbWFwIGFkZHIKQEAgLTIzNTUsOSArMjM2MiwxMyBAQAogCXVpbnQzMl90IGRydl9zdGF0ZTsKIAlpbnQgcnZhbDsKIAotCWRydl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSk7Ci0JcnZhbCA9IGRydl9zdGF0ZSAmIChRTEE4MlhYX0RSVlNUX1JTVF9SRFkgPDwgKGhhLT5wb3J0bnVtICogNCkpOwotCXJldHVybiBydmFsOworCWlmIChoYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9vd25lcikKKwkJcmV0dXJuIDE7CisJZWxzZSB7CisJCWRydl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSk7CisJCXJ2YWwgPSBkcnZfc3RhdGUgJiAoUUxBODJYWF9EUlZTVF9SU1RfUkRZIDw8IChoYS0+cG9ydG51bSAqIDQpKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTIzNzQsOCArMjM4NSw4IEBACiAJCWRydl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9TVEFURSk7CiAJfQogCWRydl9zdGF0ZSB8PSAoUUxBODJYWF9EUlZTVF9SU1RfUkRZIDw8IChoYS0+cG9ydG51bSAqIDQpKTsKLQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGJiLAotCSAgICAiZHJ2X3N0YXRlID0gMHgleC5cbiIsIGRydl9zdGF0ZSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBiYiwKKwkgICAgImRydl9zdGF0ZSA9IDB4JTA4eC5cbiIsIGRydl9zdGF0ZSk7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFLCBkcnZfc3RhdGUpOwogfQogCkBAIC0yNTk4LDcgKzI2MDksNyBAQAogCQkJZHNkX3NlZyA9ICh1aW50MzJfdCAqKSZjbWRfcGt0LT5mY3BfZGF0YV9kc2VnX2FkZHJlc3M7CiAJCQkqZHNkX3NlZysrID0gY3B1X3RvX2xlMzIoTFNEKGRzZF9wdHItPmRzZF9saXN0X2RtYSkpOwogCQkJKmRzZF9zZWcrKyA9IGNwdV90b19sZTMyKE1TRChkc2RfcHRyLT5kc2RfbGlzdF9kbWEpKTsKLQkJCSpkc2Rfc2VnKysgPSBjcHVfdG9fbGUzMihkc2RfbGlzdF9sZW4pOworCQkJY21kX3BrdC0+ZmNwX2RhdGFfZHNlZ19sZW4gPSBjcHVfdG9fbGUzMihkc2RfbGlzdF9sZW4pOwogCQl9IGVsc2UgewogCQkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKExTRChkc2RfcHRyLT5kc2RfbGlzdF9kbWEpKTsKIAkJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0QoZHNkX3B0ci0+ZHNkX2xpc3RfZG1hKSk7CkBAIC0zNTI5LDYgKzM1NDAsNyBAQAogcWxhODJ4eF9uZWVkX3Jlc2V0X2hhbmRsZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDMyX3QgZGV2X3N0YXRlLCBkcnZfc3RhdGUsIGRydl9hY3RpdmU7CisJdWludDMyX3QgYWN0aXZlX21hc2sgPSAwOwogCXVuc2lnbmVkIGxvbmcgcmVzZXRfdGltZW91dDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKQEAgLTM1NDEsMTUgKzM1NTMsMzIgQEAKIAkJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAJfQogCi0JcWxhODJ4eF9zZXRfcnN0X3JlYWR5KGhhKTsKKwlkcnZfYWN0aXZlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX0FDVElWRSk7CisJaWYgKCFoYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9vd25lcikgeworCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMjgsCisJCSAgICAicmVzZXRfYWNrbm93bGVkZ2VkIGJ5IDB4JXhcbiIsIGhhLT5wb3J0bnVtKTsKKwkJcWxhODJ4eF9zZXRfcnN0X3JlYWR5KGhhKTsKKwl9IGVsc2UgeworCQlhY3RpdmVfbWFzayA9IH4oUUxBODJYWF9EUlZfQUNUSVZFIDw8IChoYS0+cG9ydG51bSAqIDQpKTsKKwkJZHJ2X2FjdGl2ZSAmPSBhY3RpdmVfbWFzazsKKwkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDI5LAorCQkgICAgImFjdGl2ZV9tYXNrOiAweCUwOHhcbiIsIGFjdGl2ZV9tYXNrKTsKKwl9CiAKIAkvKiB3YWl0IGZvciAxMCBzZWNvbmRzIGZvciByZXNldCBhY2sgZnJvbSBhbGwgZnVuY3Rpb25zICovCiAJcmVzZXRfdGltZW91dCA9IGppZmZpZXMgKyAoaGEtPm54X3Jlc2V0X3RpbWVvdXQgKiBIWik7CiAKIAlkcnZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOwogCWRydl9hY3RpdmUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKKwlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCi0Jd2hpbGUgKGRydl9zdGF0ZSAhPSBkcnZfYWN0aXZlKSB7CisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDJhLAorCSAgICAiZHJ2X3N0YXRlOiAweCUwOHgsIGRydl9hY3RpdmU6IDB4JTA4eCwgIgorCSAgICAiZGV2X3N0YXRlOiAweCUwOHgsIGFjdGl2ZV9tYXNrOiAweCUwOHhcbiIsCisJICAgIGRydl9zdGF0ZSwgZHJ2X2FjdGl2ZSwgZGV2X3N0YXRlLCBhY3RpdmVfbWFzayk7CisKKwl3aGlsZSAoZHJ2X3N0YXRlICE9IGRydl9hY3RpdmUgJiYKKwkgICAgZGV2X3N0YXRlICE9IFFMQTgyWFhfREVWX0lOSVRJQUxJWklORykgewogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCByZXNldF90aW1lb3V0KSkgewogCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBiNSwKIAkJCSAgICAiUmVzZXQgdGltZW91dC5cbiIpOwpAQCAtMzU2MCwyMyArMzU4OSw4NyBAQAogCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAkJZHJ2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKIAkJZHJ2X2FjdGl2ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9BQ1RJVkUpOworCQlpZiAoaGEtPmZsYWdzLmlzcDgyeHhfcmVzZXRfb3duZXIpCisJCQlkcnZfYWN0aXZlICY9IGFjdGl2ZV9tYXNrOworCQlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCX0KIAotCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7CisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDJiLAorCSAgICAiZHJ2X3N0YXRlOiAweCUwOHgsIGRydl9hY3RpdmU6IDB4JTA4eCwgIgorCSAgICAiZGV2X3N0YXRlOiAweCUwOHgsIGFjdGl2ZV9tYXNrOiAweCUwOHhcbiIsCisJICAgIGRydl9zdGF0ZSwgZHJ2X2FjdGl2ZSwgZGV2X3N0YXRlLCBhY3RpdmVfbWFzayk7CisKIAlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGI2LAogCSAgICAiRGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlcy5cbiIsCiAJICAgIGRldl9zdGF0ZSwKLQkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisJICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlKGRldl9zdGF0ZSkgOiAiVW5rbm93biIpOwogCiAJLyogRm9yY2UgdG8gREVWX0NPTEQgdW5sZXNzIHNvbWVvbmUgZWxzZSBpcyBzdGFydGluZyBhIHJlc2V0ICovCi0JaWYgKGRldl9zdGF0ZSAhPSBRTEE4MlhYX0RFVl9JTklUSUFMSVpJTkcpIHsKKwlpZiAoZGV2X3N0YXRlICE9IFFMQTgyWFhfREVWX0lOSVRJQUxJWklORyAmJgorCSAgICBkZXZfc3RhdGUgIT0gUUxBODJYWF9ERVZfQ09MRCkgewogCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGI3LAogCQkgICAgIkhXIFN0YXRlOiBDT0xEL1JFLUlOSVQuXG4iKTsKIAkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9DT0xEKTsKKwkJaWYgKHFsMnhtZGVuYWJsZSkgeworCQkJaWYgKHFsYTgyeHhfbWRfY29sbGVjdCh2aGEpKQorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMmMsCisJCQkJICAgICJOb3QgYWJsZSB0byBjb2xsZWN0IG1pbmlkdW1wLlxuIik7CisJCX0gZWxzZQorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA0ZiwKKwkJCSAgICAiTWluaWR1bXAgZGlzYWJsZWQuXG4iKTsKIAl9CiB9CiAKIGludAorcWxhODJ4eF9jaGVja19tZF9uZWVkZWQoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDE2X3QgZndfbWFqb3JfdmVyc2lvbiwgZndfbWlub3JfdmVyc2lvbiwgZndfc3VibWlub3JfdmVyc2lvbjsKKwlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOworCisJZndfbWFqb3JfdmVyc2lvbiA9IGhhLT5md19tYWpvcl92ZXJzaW9uOworCWZ3X21pbm9yX3ZlcnNpb24gPSBoYS0+ZndfbWlub3JfdmVyc2lvbjsKKwlmd19zdWJtaW5vcl92ZXJzaW9uID0gaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb247CisKKwlydmFsID0gcWxhMngwMF9nZXRfZndfdmVyc2lvbih2aGEsICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKKwkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLCAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCisJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSwKKwkgICAgaGEtPm1waV92ZXJzaW9uLCAmaGEtPm1waV9jYXBhYmlsaXRpZXMsCisJICAgIGhhLT5waHlfdmVyc2lvbik7CisKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAocWwyeG1kZW5hYmxlKSB7CisJCWlmICghaGEtPmZ3X2R1bXBlZCkgeworCQkJaWYgKGZ3X21ham9yX3ZlcnNpb24gIT0gaGEtPmZ3X21ham9yX3ZlcnNpb24gfHwKKwkJCSAgICBmd19taW5vcl92ZXJzaW9uICE9IGhhLT5md19taW5vcl92ZXJzaW9uIHx8CisJCQkgICAgZndfc3VibWlub3JfdmVyc2lvbiAhPSBoYS0+Zndfc3VibWlub3JfdmVyc2lvbikgeworCisJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyZCwKKwkJCQkgICAgIkZpcm13YXJlIHZlcnNpb24gZGlmZmVycyAiCisJCQkJICAgICJQcmV2aW91cyB2ZXJzaW9uOiAlZDolZDolZCAtICIKKwkJCQkgICAgIk5ldyB2ZXJzaW9uOiAlZDolZDolZFxuIiwKKwkJCQkgICAgaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJCQkJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLAorCQkJCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwKKwkJCQkgICAgZndfbWFqb3JfdmVyc2lvbiwgZndfbWlub3JfdmVyc2lvbiwKKwkJCQkgICAgZndfc3VibWlub3JfdmVyc2lvbik7CisJCQkJLyogUmVsZWFzZSBNaW5pRHVtcCByZXNvdXJjZXMgKi8KKwkJCQlxbGE4Mnh4X21kX2ZyZWUodmhhKTsKKwkJCQkvKiBBTGxvY2F0ZSBNaW5pRHVtcCByZXNvdXJjZXMgKi8KKwkJCQlxbGE4Mnh4X21kX3ByZXAodmhhKTsKKwkJCX0gZWxzZQorCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMmUsCisJCQkJICAgICJGaXJtd2FyZSBkdW1wIGF2YWlsYWJsZSB0byByZXRyaWV2ZVxuIiwKKwkJCQkgICAgdmhhLT5ob3N0X25vKTsKKwkJfQorCX0KKwlyZXR1cm4gcnZhbDsKK30KKworCitpbnQKIHFsYTgyeHhfY2hlY2tfZndfYWxpdmUoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDMyX3QgZndfaGVhcnRiZWF0X2NvdW50ZXI7CkBAIC0zNjM3LDcgKzM3MzAsNyBAQAogCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOWIsCiAJICAgICJEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzLlxuIiwKIAkgICAgZGV2X3N0YXRlLAotCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKwkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGUoZGV2X3N0YXRlKSA6ICJVbmtub3duIik7CiAKIAkvKiB3YWl0IGZvciAzMCBzZWNvbmRzIGZvciBkZXZpY2UgdG8gZ28gcmVhZHkgKi8KIAlkZXZfaW5pdF90aW1lb3V0ID0gamlmZmllcyArIChoYS0+bnhfZGV2X2luaXRfdGltZW91dCAqIEhaKTsKQEAgLTM2NTksMjYgKzM3NTIsMzMgQEAKIAkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOWQsCiAJCQkgICAgIkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXMuXG4iLAogCQkJICAgIGRldl9zdGF0ZSwKLQkJCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDoKKwkJCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZShkZXZfc3RhdGUpIDoKIAkJCSAgICAiVW5rbm93biIpOwogCQl9CiAKIAkJc3dpdGNoIChkZXZfc3RhdGUpIHsKIAkJY2FzZSBRTEE4MlhYX0RFVl9SRUFEWToKKwkJCXFsYTgyeHhfY2hlY2tfbWRfbmVlZGVkKHZoYSk7CisJCQloYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9vd25lciA9IDA7CiAJCQlnb3RvIGV4aXQ7CiAJCWNhc2UgUUxBODJYWF9ERVZfQ09MRDoKIAkJCXJ2YWwgPSBxbGE4Mnh4X2RldmljZV9ib290c3RyYXAodmhhKTsKLQkJCWdvdG8gZXhpdDsKKwkJCWJyZWFrOwogCQljYXNlIFFMQTgyWFhfREVWX0lOSVRJQUxJWklORzoKIAkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJCQltc2xlZXAoMTAwMCk7CiAJCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAkJCWJyZWFrOwogCQljYXNlIFFMQTgyWFhfREVWX05FRURfUkVTRVQ6Ci0JCSAgICBpZiAoIXFsMnhkb250cmVzZXRoYmEpCi0JCQlxbGE4Mnh4X25lZWRfcmVzZXRfaGFuZGxlcih2aGEpOworCQkJaWYgKCFxbDJ4ZG9udHJlc2V0aGJhKQorCQkJCXFsYTgyeHhfbmVlZF9yZXNldF9oYW5kbGVyKHZoYSk7CisJCQllbHNlIHsKKwkJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOworCQkJCW1zbGVlcCgxMDAwKTsKKwkJCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKKwkJCX0KIAkJCWRldl9pbml0X3RpbWVvdXQgPSBqaWZmaWVzICsKLQkJCQkoaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgKiBIWik7CisJCQkgICAgKGhhLT5ueF9kZXZfaW5pdF90aW1lb3V0ICogSFopOwogCQkJYnJlYWs7CiAJCWNhc2UgUUxBODJYWF9ERVZfTkVFRF9RVUlFU0NFTlQ6CiAJCQlxbGE4Mnh4X25lZWRfcXNudF9oYW5kbGVyKHZoYSk7CkBAIC0zNzkxLDYgKzM4OTEsMjggQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAordm9pZAorcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3QgZGV2X3N0YXRlOworCisJZGV2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKKwlpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX1JFQURZKSB7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMmYsCisJCSAgICAiSFcgU3RhdGU6IE5FRUQgUkVTRVRcbiIpOworCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCisJCQlRTEE4MlhYX0RFVl9ORUVEX1JFU0VUKTsKKwkJaGEtPmZsYWdzLmlzcDgyeHhfcmVzZXRfb3duZXIgPSAxOworCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMzAsCisJCSAgICAicmVzZXRfb3duZXIgaXMgMHgleFxuIiwgaGEtPnBvcnRudW0pOworCX0gZWxzZQorCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDMxLAorCQkgICAgIkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXMuXG4iLAorCQkgICAgZGV2X3N0YXRlLAorCQkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGUoZGV2X3N0YXRlKSA6ICJVbmtub3duIik7Cit9CisKIC8qCiAgKiAgcWxhODJ4eF9hYm9ydF9pc3AKICAqICAgICAgUmVzZXRzIElTUCBhbmQgYWJvcnRzIGFsbCBvdXRzdGFuZGluZyBjb21tYW5kcy4KQEAgLTM4MDYsNyArMzkyOCw2IEBACiB7CiAJaW50IHJ2YWw7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0JdWludDMyX3QgZGV2X3N0YXRlOwogCiAJaWYgKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19ERVZfRkFJTEVEKSB7CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMjQsCkBAIC0zODE2LDE2ICszOTM3LDcgQEAKIAloYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9oZGxyX2FjdGl2ZSA9IDE7CiAKIAlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKLQlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwotCWlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfUkVBRFkpIHsKLQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAyNSwKLQkJICAgICJIVyBTdGF0ZTogTkVFRCBSRVNFVC5cbiIpOwotCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCi0JCQlRTEE4MlhYX0RFVl9ORUVEX1JFU0VUKTsKLQl9IGVsc2UKLQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAyNiwKLQkJICAgICJIdyBTdGF0ZTogJXMuXG4iLCBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8KLQkJICAgIHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisJcWxhODJ4eF9zZXRfcmVzZXRfb3duZXIodmhhKTsKIAlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCiAJcnZhbCA9IHFsYTgyeHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIodmhhKTsKQEAgLTQwMTYsMyArNDEyOCw4MDMgQEAKIAkJfQogCX0KIH0KKworLyogTWluaWR1bXAgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK2ludAorcWxhODJ4eF9tZF9yd18zMihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCBvZmYsIHUzMiBkYXRhLCB1aW50OF90IGZsYWcpCit7CisJdWludDMyX3QgIG9mZl92YWx1ZSwgcnZhbCA9IDA7CisKKwlXUlRfUkVHX0RXT1JEKCh2b2lkICopKENSQl9XSU5ET1dfMk0gKyBoYS0+bnhfcGNpYmFzZSksCisJICAgIChvZmYgJiAweEZGRkYwMDAwKSk7CisKKwkvKiBSZWFkIGJhY2sgdmFsdWUgdG8gbWFrZSBzdXJlIHdyaXRlIGhhcyBnb25lIHRocm91Z2ggKi8KKwlSRF9SRUdfRFdPUkQoKHZvaWQgKikoQ1JCX1dJTkRPV18yTSArIGhhLT5ueF9wY2liYXNlKSk7CisJb2ZmX3ZhbHVlICA9IChvZmYgJiAweDAwMDBGRkZGKTsKKworCWlmIChmbGFnKQorCQlXUlRfUkVHX0RXT1JEKCh2b2lkICopCisJCSAgICAob2ZmX3ZhbHVlICsgQ1JCX0lORElSRUNUXzJNICsgaGEtPm54X3BjaWJhc2UpLAorCQkgICAgZGF0YSk7CisJZWxzZQorCQlydmFsID0gUkRfUkVHX0RXT1JEKCh2b2lkICopCisJCSAgICAob2ZmX3ZhbHVlICsgQ1JCX0lORElSRUNUXzJNICsgaGEtPm54X3BjaWJhc2UpKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfY29udHJvbChzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY3JiICpjcmJfZW50cnk7CisJdWludDMyX3QgcmVhZF92YWx1ZSwgb3Bjb2RlLCBwb2xsX3RpbWU7CisJdWludDMyX3QgYWRkciwgaW5kZXgsIGNyYl9hZGRyOworCXVuc2lnbmVkIGxvbmcgd3RpbWU7CisJc3RydWN0IHFsYTgyeHhfbWRfdGVtcGxhdGVfaGRyICp0bXBsdF9oZHI7CisJdWludDMyX3QgcnZhbCA9IFFMQV9TVUNDRVNTOworCWludCBpOworCisJdG1wbHRfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciAqKWhhLT5tZF90bXBsdF9oZHI7CisJY3JiX2VudHJ5ID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NyYiAqKWVudHJ5X2hkcjsKKwljcmJfYWRkciA9IGNyYl9lbnRyeS0+YWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBjcmJfZW50cnktPm9wX2NvdW50OyBpKyspIHsKKwkJb3Bjb2RlID0gY3JiX2VudHJ5LT5jcmJfY3RybC5vcGNvZGU7CisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfV1IpIHsKKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNyYl9hZGRyLAorCQkJICAgIGNyYl9lbnRyeS0+dmFsdWVfMSwgMSk7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9XUjsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfUlcpIHsKKwkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgMCwgMCk7CisJCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgcmVhZF92YWx1ZSwgMSk7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9SVzsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfQU5EKSB7CisJCQlyZWFkX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgY3JiX2FkZHIsIDAsIDApOworCQkJcmVhZF92YWx1ZSAmPSBjcmJfZW50cnktPnZhbHVlXzI7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9BTkQ7CisJCQlpZiAob3Bjb2RlICYgUUxBODJYWF9EQkdfT1BDT0RFX09SKSB7CisJCQkJcmVhZF92YWx1ZSB8PSBjcmJfZW50cnktPnZhbHVlXzM7CisJCQkJb3Bjb2RlICY9IH5RTEE4MlhYX0RCR19PUENPREVfT1I7CisJCQl9CisJCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgcmVhZF92YWx1ZSwgMSk7CisJCX0KKworCQlpZiAob3Bjb2RlICYgUUxBODJYWF9EQkdfT1BDT0RFX09SKSB7CisJCQlyZWFkX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgY3JiX2FkZHIsIDAsIDApOworCQkJcmVhZF92YWx1ZSB8PSBjcmJfZW50cnktPnZhbHVlXzM7CisJCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBjcmJfYWRkciwgcmVhZF92YWx1ZSwgMSk7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9PUjsKKwkJfQorCisJCWlmIChvcGNvZGUgJiBRTEE4MlhYX0RCR19PUENPREVfUE9MTCkgeworCQkJcG9sbF90aW1lID0gY3JiX2VudHJ5LT5jcmJfc3RyZC5wb2xsX3RpbWVvdXQ7CisJCQl3dGltZSA9IGppZmZpZXMgKyBwb2xsX3RpbWU7CisJCQlyZWFkX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgY3JiX2FkZHIsIDAsIDApOworCisJCQlkbyB7CisJCQkJaWYgKChyZWFkX3ZhbHVlICYgY3JiX2VudHJ5LT52YWx1ZV8yKQorCQkJCSAgICA9PSBjcmJfZW50cnktPnZhbHVlXzEpCisJCQkJCWJyZWFrOworCQkJCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd3RpbWUpKSB7CisJCQkJCS8qIGNhcHR1cmluZyBkdW1wIGZhaWxlZCAqLworCQkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlCisJCQkJCXJlYWRfdmFsdWUgPSBxbGE4Mnh4X21kX3J3XzMyKGhhLAorCQkJCQkgICAgY3JiX2FkZHIsIDAsIDApOworCQkJfSB3aGlsZSAoMSk7CisJCQlvcGNvZGUgJj0gflFMQTgyWFhfREJHX09QQ09ERV9QT0xMOworCQl9CisKKwkJaWYgKG9wY29kZSAmIFFMQTgyWFhfREJHX09QQ09ERV9SRFNUQVRFKSB7CisJCQlpZiAoY3JiX2VudHJ5LT5jcmJfc3RyZC5zdGF0ZV9pbmRleF9hKSB7CisJCQkJaW5kZXggPSBjcmJfZW50cnktPmNyYl9zdHJkLnN0YXRlX2luZGV4X2E7CisJCQkJYWRkciA9IHRtcGx0X2hkci0+c2F2ZWRfc3RhdGVfYXJyYXlbaW5kZXhdOworCQkJfSBlbHNlCisJCQkJYWRkciA9IGNyYl9hZGRyOworCisJCQlyZWFkX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgYWRkciwgMCwgMCk7CisJCQlpbmRleCA9IGNyYl9lbnRyeS0+Y3JiX2N0cmwuc3RhdGVfaW5kZXhfdjsKKwkJCXRtcGx0X2hkci0+c2F2ZWRfc3RhdGVfYXJyYXlbaW5kZXhdID0gcmVhZF92YWx1ZTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX1JEU1RBVEU7CisJCX0KKworCQlpZiAob3Bjb2RlICYgUUxBODJYWF9EQkdfT1BDT0RFX1dSU1RBVEUpIHsKKwkJCWlmIChjcmJfZW50cnktPmNyYl9zdHJkLnN0YXRlX2luZGV4X2EpIHsKKwkJCQlpbmRleCA9IGNyYl9lbnRyeS0+Y3JiX3N0cmQuc3RhdGVfaW5kZXhfYTsKKwkJCQlhZGRyID0gdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF07CisJCQl9IGVsc2UKKwkJCQlhZGRyID0gY3JiX2FkZHI7CisKKwkJCWlmIChjcmJfZW50cnktPmNyYl9jdHJsLnN0YXRlX2luZGV4X3YpIHsKKwkJCQlpbmRleCA9IGNyYl9lbnRyeS0+Y3JiX2N0cmwuc3RhdGVfaW5kZXhfdjsKKwkJCQlyZWFkX3ZhbHVlID0KKwkJCQkgICAgdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF07CisJCQl9IGVsc2UKKwkJCQlyZWFkX3ZhbHVlID0gY3JiX2VudHJ5LT52YWx1ZV8xOworCisJCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBhZGRyLCByZWFkX3ZhbHVlLCAxKTsKKwkJCW9wY29kZSAmPSB+UUxBODJYWF9EQkdfT1BDT0RFX1dSU1RBVEU7CisJCX0KKworCQlpZiAob3Bjb2RlICYgUUxBODJYWF9EQkdfT1BDT0RFX01EU1RBVEUpIHsKKwkJCWluZGV4ID0gY3JiX2VudHJ5LT5jcmJfY3RybC5zdGF0ZV9pbmRleF92OworCQkJcmVhZF92YWx1ZSA9IHRtcGx0X2hkci0+c2F2ZWRfc3RhdGVfYXJyYXlbaW5kZXhdOworCQkJcmVhZF92YWx1ZSA8PD0gY3JiX2VudHJ5LT5jcmJfY3RybC5zaGw7CisJCQlyZWFkX3ZhbHVlID4+PSBjcmJfZW50cnktPmNyYl9jdHJsLnNocjsKKwkJCWlmIChjcmJfZW50cnktPnZhbHVlXzIpCisJCQkJcmVhZF92YWx1ZSAmPSBjcmJfZW50cnktPnZhbHVlXzI7CisJCQlyZWFkX3ZhbHVlIHw9IGNyYl9lbnRyeS0+dmFsdWVfMzsKKwkJCXJlYWRfdmFsdWUgKz0gY3JiX2VudHJ5LT52YWx1ZV8xOworCQkJdG1wbHRfaGRyLT5zYXZlZF9zdGF0ZV9hcnJheVtpbmRleF0gPSByZWFkX3ZhbHVlOworCQkJb3Bjb2RlICY9IH5RTEE4MlhYX0RCR19PUENPREVfTURTVEFURTsKKwkJfQorCQljcmJfYWRkciArPSBjcmJfZW50cnktPmNyYl9zdHJkLmFkZHJfc3RyaWRlOworCX0KKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG9jbShzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgcl9hZGRyLCByX3N0cmlkZSwgbG9vcF9jbnQsIGksIHJfdmFsdWU7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRvY20gKm9jbV9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJb2NtX2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9yZG9jbSAqKWVudHJ5X2hkcjsKKwlyX2FkZHIgPSBvY21faGRyLT5yZWFkX2FkZHI7CisJcl9zdHJpZGUgPSBvY21faGRyLT5yZWFkX2FkZHJfc3RyaWRlOworCWxvb3BfY250ID0gb2NtX2hkci0+b3BfY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jbnQ7IGkrKykgeworCQlyX3ZhbHVlID0gUkRfUkVHX0RXT1JEKCh2b2lkICopKHJfYWRkciArIGhhLT5ueF9wY2liYXNlKSk7CisJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCXJfYWRkciArPSByX3N0cmlkZTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkCitxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfcmRtdXgoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCB1aW50MzJfdCAqKmRfcHRyKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IHJfYWRkciwgc19zdHJpZGUsIHNfYWRkciwgc192YWx1ZSwgbG9vcF9jbnQsIGksIHJfdmFsdWU7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfbXV4ICptdXhfaGRyOworCXVpbnQzMl90ICpkYXRhX3B0ciA9ICpkX3B0cjsKKworCW11eF9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfbXV4ICopZW50cnlfaGRyOworCXJfYWRkciA9IG11eF9oZHItPnJlYWRfYWRkcjsKKwlzX2FkZHIgPSBtdXhfaGRyLT5zZWxlY3RfYWRkcjsKKwlzX3N0cmlkZSA9IG11eF9oZHItPnNlbGVjdF92YWx1ZV9zdHJpZGU7CisJc192YWx1ZSA9IG11eF9oZHItPnNlbGVjdF92YWx1ZTsKKwlsb29wX2NudCA9IG11eF9oZHItPm9wX2NvdW50OworCisJZm9yIChpID0gMDsgaSA8IGxvb3BfY250OyBpKyspIHsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgc19hZGRyLCBzX3ZhbHVlLCAxKTsKKwkJcl92YWx1ZSA9IHFsYTgyeHhfbWRfcndfMzIoaGEsIHJfYWRkciwgMCwgMCk7CisJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIoc192YWx1ZSk7CisJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCXNfdmFsdWUgKz0gc19zdHJpZGU7CisJfQorCSpkX3B0ciA9IGRhdGFfcHRyOworfQorCitzdGF0aWMgdm9pZAorcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3JkY3JiKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCByX2FkZHIsIHJfc3RyaWRlLCBsb29wX2NudCwgaSwgcl92YWx1ZTsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jcmIgKmNyYl9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJY3JiX2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9jcmIgKillbnRyeV9oZHI7CisJcl9hZGRyID0gY3JiX2hkci0+YWRkcjsKKwlyX3N0cmlkZSA9IGNyYl9oZHItPmNyYl9zdHJkLmFkZHJfc3RyaWRlOworCWxvb3BfY250ID0gY3JiX2hkci0+b3BfY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jbnQ7IGkrKykgeworCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgcl9hZGRyLCAwLCAwKTsKKwkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX2FkZHIpOworCQkqZGF0YV9wdHIrKyA9IGNwdV90b19sZTMyKHJfdmFsdWUpOworCQlyX2FkZHIgKz0gcl9zdHJpZGU7CisJfQorCSpkX3B0ciA9IGRhdGFfcHRyOworfQorCitzdGF0aWMgaW50CitxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfbDJ0YWcoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCB1aW50MzJfdCAqKmRfcHRyKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IGFkZHIsIHJfYWRkciwgY19hZGRyLCB0X3JfYWRkcjsKKwl1aW50MzJfdCBpLCBrLCBsb29wX2NvdW50LCB0X3ZhbHVlLCByX2NudCwgcl92YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHBfd2FpdCwgd190aW1lLCBwX21hc2s7CisJdWludDMyX3QgY192YWx1ZV93LCBjX3ZhbHVlX3I7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY2FjaGUgKmNhY2hlX2hkcjsKKwlpbnQgcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJY2FjaGVfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NhY2hlICopZW50cnlfaGRyOworCWxvb3BfY291bnQgPSBjYWNoZV9oZHItPm9wX2NvdW50OworCXJfYWRkciA9IGNhY2hlX2hkci0+cmVhZF9hZGRyOworCWNfYWRkciA9IGNhY2hlX2hkci0+Y29udHJvbF9hZGRyOworCWNfdmFsdWVfdyA9IGNhY2hlX2hkci0+Y2FjaGVfY3RybC53cml0ZV92YWx1ZTsKKworCXRfcl9hZGRyID0gY2FjaGVfaGRyLT50YWdfcmVnX2FkZHI7CisJdF92YWx1ZSA9IGNhY2hlX2hkci0+YWRkcl9jdHJsLmluaXRfdGFnX3ZhbHVlOworCXJfY250ID0gY2FjaGVfaGRyLT5yZWFkX2N0cmwucmVhZF9hZGRyX2NudDsKKwlwX3dhaXQgPSBjYWNoZV9oZHItPmNhY2hlX2N0cmwucG9sbF93YWl0OworCXBfbWFzayA9IGNhY2hlX2hkci0+Y2FjaGVfY3RybC5wb2xsX21hc2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jb3VudDsgaSsrKSB7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIHRfcl9hZGRyLCB0X3ZhbHVlLCAxKTsKKwkJaWYgKGNfdmFsdWVfdykKKwkJCXFsYTgyeHhfbWRfcndfMzIoaGEsIGNfYWRkciwgY192YWx1ZV93LCAxKTsKKworCQlpZiAocF9tYXNrKSB7CisJCQl3X3RpbWUgPSBqaWZmaWVzICsgcF93YWl0OworCQkJZG8geworCQkJCWNfdmFsdWVfciA9IHFsYTgyeHhfbWRfcndfMzIoaGEsIGNfYWRkciwgMCwgMCk7CisJCQkJaWYgKChjX3ZhbHVlX3IgJiBwX21hc2spID09IDApCisJCQkJCWJyZWFrOworCQkJCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd190aW1lKSkgeworCQkJCQkvKiBjYXB0dXJpbmcgZHVtcCBmYWlsZWQgKi8KKwkJCQkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDMyLAorCQkJCQkgICAgImNfdmFsdWVfcjogMHgleCwgcG9sbF9tYXNrOiAweCVseCwgIgorCQkJCQkgICAgIndfdGltZTogMHglbHhcbiIsCisJCQkJCSAgICBjX3ZhbHVlX3IsIHBfbWFzaywgd190aW1lKTsKKwkJCQkJcmV0dXJuIHJ2YWw7CisJCQkJfQorCQkJfSB3aGlsZSAoMSk7CisJCX0KKworCQlhZGRyID0gcl9hZGRyOworCQlmb3IgKGsgPSAwOyBrIDwgcl9jbnQ7IGsrKykgeworCQkJcl92YWx1ZSA9IHFsYTgyeHhfbWRfcndfMzIoaGEsIGFkZHIsIDAsIDApOworCQkJKmRhdGFfcHRyKysgPSBjcHVfdG9fbGUzMihyX3ZhbHVlKTsKKwkJCWFkZHIgKz0gY2FjaGVfaGRyLT5yZWFkX2N0cmwucmVhZF9hZGRyX3N0cmlkZTsKKwkJfQorCQl0X3ZhbHVlICs9IGNhY2hlX2hkci0+YWRkcl9jdHJsLnRhZ192YWx1ZV9zdHJpZGU7CisJfQorCSpkX3B0ciA9IGRhdGFfcHRyOworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19sMWNhY2hlKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgdWludDMyX3QgKipkX3B0cikKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwl1aW50MzJfdCBhZGRyLCByX2FkZHIsIGNfYWRkciwgdF9yX2FkZHI7CisJdWludDMyX3QgaSwgaywgbG9vcF9jb3VudCwgdF92YWx1ZSwgcl9jbnQsIHJfdmFsdWU7CisJdWludDMyX3QgY192YWx1ZV93OworCXN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NhY2hlICpjYWNoZV9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJY2FjaGVfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2NhY2hlICopZW50cnlfaGRyOworCWxvb3BfY291bnQgPSBjYWNoZV9oZHItPm9wX2NvdW50OworCXJfYWRkciA9IGNhY2hlX2hkci0+cmVhZF9hZGRyOworCWNfYWRkciA9IGNhY2hlX2hkci0+Y29udHJvbF9hZGRyOworCWNfdmFsdWVfdyA9IGNhY2hlX2hkci0+Y2FjaGVfY3RybC53cml0ZV92YWx1ZTsKKworCXRfcl9hZGRyID0gY2FjaGVfaGRyLT50YWdfcmVnX2FkZHI7CisJdF92YWx1ZSA9IGNhY2hlX2hkci0+YWRkcl9jdHJsLmluaXRfdGFnX3ZhbHVlOworCXJfY250ID0gY2FjaGVfaGRyLT5yZWFkX2N0cmwucmVhZF9hZGRyX2NudDsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NvdW50OyBpKyspIHsKKwkJcWxhODJ4eF9tZF9yd18zMihoYSwgdF9yX2FkZHIsIHRfdmFsdWUsIDEpOworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBjX2FkZHIsIGNfdmFsdWVfdywgMSk7CisJCWFkZHIgPSByX2FkZHI7CisJCWZvciAoayA9IDA7IGsgPCByX2NudDsgaysrKSB7CisJCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgYWRkciwgMCwgMCk7CisJCQkqZGF0YV9wdHIrKyA9IGNwdV90b19sZTMyKHJfdmFsdWUpOworCQkJYWRkciArPSBjYWNoZV9oZHItPnJlYWRfY3RybC5yZWFkX2FkZHJfc3RyaWRlOworCQl9CisJCXRfdmFsdWUgKz0gY2FjaGVfaGRyLT5hZGRyX2N0cmwudGFnX3ZhbHVlX3N0cmlkZTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkCitxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfcXVldWUoc2NzaV9xbGFfaG9zdF90ICp2aGEsCisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCAqZW50cnlfaGRyLCB1aW50MzJfdCAqKmRfcHRyKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXVpbnQzMl90IHNfYWRkciwgcl9hZGRyOworCXVpbnQzMl90IHJfc3RyaWRlLCByX3ZhbHVlLCByX2NudCwgcWlkID0gMDsKKwl1aW50MzJfdCBpLCBrLCBsb29wX2NudDsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9xdWV1ZSAqcV9oZHI7CisJdWludDMyX3QgKmRhdGFfcHRyID0gKmRfcHRyOworCisJcV9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcXVldWUgKillbnRyeV9oZHI7CisJc19hZGRyID0gcV9oZHItPnNlbGVjdF9hZGRyOworCXJfY250ID0gcV9oZHItPnJkX3N0cmQucmVhZF9hZGRyX2NudDsKKwlyX3N0cmlkZSA9IHFfaGRyLT5yZF9zdHJkLnJlYWRfYWRkcl9zdHJpZGU7CisJbG9vcF9jbnQgPSBxX2hkci0+b3BfY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jbnQ7IGkrKykgeworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBzX2FkZHIsIHFpZCwgMSk7CisJCXJfYWRkciA9IHFfaGRyLT5yZWFkX2FkZHI7CisJCWZvciAoayA9IDA7IGsgPCByX2NudDsgaysrKSB7CisJCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwgcl9hZGRyLCAwLCAwKTsKKwkJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl92YWx1ZSk7CisJCQlyX2FkZHIgKz0gcl9zdHJpZGU7CisJCX0KKwkJcWlkICs9IHFfaGRyLT5xX3N0cmQucXVldWVfaWRfc3RyaWRlOworCX0KKwkqZF9wdHIgPSBkYXRhX3B0cjsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZHJvbShzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgcl9hZGRyLCByX3ZhbHVlOworCXVpbnQzMl90IGksIGxvb3BfY250OworCXN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3Jkcm9tICpyb21faGRyOworCXVpbnQzMl90ICpkYXRhX3B0ciA9ICpkX3B0cjsKKworCXJvbV9oZHIgPSAoc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRyb20gKillbnRyeV9oZHI7CisJcl9hZGRyID0gcm9tX2hkci0+cmVhZF9hZGRyOworCWxvb3BfY250ID0gcm9tX2hkci0+cmVhZF9kYXRhX3NpemUvc2l6ZW9mKHVpbnQzMl90KTsKKworCWZvciAoaSA9IDA7IGkgPCBsb29wX2NudDsgaSsrKSB7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIE1EX0RJUkVDVF9ST01fV0lORE9XLAorCQkgICAgKHJfYWRkciAmIDB4RkZGRjAwMDApLCAxKTsKKwkJcl92YWx1ZSA9IHFsYTgyeHhfbWRfcndfMzIoaGEsCisJCSAgICBNRF9ESVJFQ1RfUk9NX1JFQURfQkFTRSArCisJCSAgICAocl9hZGRyICYgMHgwMDAwRkZGRiksIDAsIDApOworCQkqZGF0YV9wdHIrKyA9IGNwdV90b19sZTMyKHJfdmFsdWUpOworCQlyX2FkZHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisJKmRfcHRyID0gZGF0YV9wdHI7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG1lbShzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90ICplbnRyeV9oZHIsIHVpbnQzMl90ICoqZF9wdHIpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDMyX3Qgcl9hZGRyLCByX3ZhbHVlLCByX2RhdGE7CisJdWludDMyX3QgaSwgaiwgbG9vcF9jbnQ7CisJc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRtZW0gKm1faGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCXVpbnQzMl90ICpkYXRhX3B0ciA9ICpkX3B0cjsKKworCW1faGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3JkbWVtICopZW50cnlfaGRyOworCXJfYWRkciA9IG1faGRyLT5yZWFkX2FkZHI7CisJbG9vcF9jbnQgPSBtX2hkci0+cmVhZF9kYXRhX3NpemUvMTY7CisKKwlpZiAocl9hZGRyICYgMHhmKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMzMsCisJCSAgICAiUmVhZCBhZGRyIDB4JXggbm90IDE2IGJ5dGVzIGFsbGlnbmVkXG4iLCByX2FkZHIpOworCQlyZXR1cm4gcnZhbDsKKwl9CisKKwlpZiAobV9oZHItPnJlYWRfZGF0YV9zaXplICUgMTYpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAzNCwKKwkJICAgICJSZWFkIGRhdGFbMHgleF0gbm90IG11bHRpcGxlIG9mIDE2IGJ5dGVzXG4iLAorCQkgICAgbV9oZHItPnJlYWRfZGF0YV9zaXplKTsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDM1LAorCSAgICAiWyVzXTogcmRtZW1fYWRkcjogMHgleCwgcmVhZF9kYXRhX3NpemU6IDB4JXgsIGxvb3BfY250OiAweCV4XG4iLAorCSAgICBfX2Z1bmNfXywgcl9hZGRyLCBtX2hkci0+cmVhZF9kYXRhX3NpemUsIGxvb3BfY250KTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbG9vcF9jbnQ7IGkrKykgeworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBNRF9NSVVfVEVTVF9BR1RfQUREUl9MTywgcl9hZGRyLCAxKTsKKwkJcl92YWx1ZSA9IDA7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIE1EX01JVV9URVNUX0FHVF9BRERSX0hJLCByX3ZhbHVlLCAxKTsKKwkJcl92YWx1ZSA9IE1JVV9UQV9DVExfRU5BQkxFOworCQlxbGE4Mnh4X21kX3J3XzMyKGhhLCBNRF9NSVVfVEVTVF9BR1RfQ1RSTCwgcl92YWx1ZSwgMSk7CisJCXJfdmFsdWUgPSBNSVVfVEFfQ1RMX1NUQVJUIHwgTUlVX1RBX0NUTF9FTkFCTEU7CisJCXFsYTgyeHhfbWRfcndfMzIoaGEsIE1EX01JVV9URVNUX0FHVF9DVFJMLCByX3ZhbHVlLCAxKTsKKworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NUTF9DSEVDSzsgaisrKSB7CisJCQlyX3ZhbHVlID0gcWxhODJ4eF9tZF9yd18zMihoYSwKKwkJCSAgICBNRF9NSVVfVEVTVF9BR1RfQ1RSTCwgMCwgMCk7CisJCQlpZiAoKHJfdmFsdWUgJiBNSVVfVEFfQ1RMX0JVU1kpID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaiA+PSBNQVhfQ1RMX0NIRUNLKSB7CisJCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIKKwkJCSAgICAiZmFpbGVkIHRvIHJlYWQgdGhyb3VnaCBhZ2VudFxuIik7CisJCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBydmFsOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJcl9kYXRhID0gcWxhODJ4eF9tZF9yd18zMihoYSwKKwkJCSAgICBNRF9NSVVfVEVTVF9BR1RfUkREQVRBW2pdLCAwLCAwKTsKKwkJCSpkYXRhX3B0cisrID0gY3B1X3RvX2xlMzIocl9kYXRhKTsKKwkJfQorCQlyX2FkZHIgKz0gMTY7CisJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOworCSpkX3B0ciA9IGRhdGFfcHRyOworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworc3RhdGljIGludAorcWxhODJ4eF92YWxpZGF0ZV90ZW1wbGF0ZV9jaGtzdW0oc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJdWludDY0X3QgY2hrc3VtID0gMDsKKwl1aW50MzJfdCAqZF9wdHIgPSAodWludDMyX3QgKiloYS0+bWRfdG1wbHRfaGRyOworCWludCBjb3VudCA9IGhhLT5tZF90ZW1wbGF0ZV9zaXplL3NpemVvZih1aW50MzJfdCk7CisKKwl3aGlsZSAoY291bnQtLSA+IDApCisJCWNoa3N1bSArPSAqZF9wdHIrKzsKKwl3aGlsZSAoY2hrc3VtID4+IDMyKQorCQljaGtzdW0gPSAoY2hrc3VtICYgMHhGRkZGRkZGRikgKyAoY2hrc3VtID4+IDMyKTsKKwlyZXR1cm4gfmNoa3N1bTsKK30KKworc3RhdGljIHZvaWQKK3FsYTgyeHhfbWFya19lbnRyeV9za2lwcGVkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkciwgaW50IGluZGV4KQoreworCWVudHJ5X2hkci0+ZF9jdHJsLmRyaXZlcl9mbGFncyB8PSBRTEE4MlhYX0RCR19TS0lQUEVEX0ZMQUc7CisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDM2LAorCSAgICAiU2tpcHBpbmcgZW50cnlbJWRdOiAiCisJICAgICJFVFlQRVsweCV4XS1FTEVWRUxbMHgleF1cbiIsCisJICAgIGluZGV4LCBlbnRyeV9oZHItPmVudHJ5X3R5cGUsCisJICAgIGVudHJ5X2hkci0+ZF9jdHJsLmVudHJ5X2NhcHR1cmVfbWFzayk7Cit9CisKK2ludAorcWxhODJ4eF9tZF9jb2xsZWN0KHNjc2lfcWxhX2hvc3RfdCAqdmhhKQoreworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCWludCBub19lbnRyeV9oZHIgPSAwOworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKmVudHJ5X2hkcjsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF90ZW1wbGF0ZV9oZHIgKnRtcGx0X2hkcjsKKwl1aW50MzJfdCAqZGF0YV9wdHI7CisJdWludDMyX3QgdG90YWxfZGF0YV9zaXplID0gMCwgZl9jYXB0dXJlX21hc2ssIGRhdGFfY29sbGVjdGVkID0gMDsKKwlpbnQgaSA9IDAsIHJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCisJdG1wbHRfaGRyID0gKHN0cnVjdCBxbGE4Mnh4X21kX3RlbXBsYXRlX2hkciAqKWhhLT5tZF90bXBsdF9oZHI7CisJZGF0YV9wdHIgPSAodWludDMyX3QgKiloYS0+bWRfZHVtcDsKKworCWlmIChoYS0+ZndfZHVtcGVkKSB7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMzcsCisJCSAgICAiRmlybXdhcmUgZHVtcCBhdmFpbGFibGUgdG8gcmV0cml2ZVxuIik7CisJCWdvdG8gbWRfZmFpbGVkOworCX0KKworCWhhLT5md19kdW1wZWQgPSAwOworCisJaWYgKCFoYS0+bWRfdG1wbHRfaGRyIHx8ICFoYS0+bWRfZHVtcCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDM4LAorCQkgICAgIk1lbW9yeSBub3QgYWxsb2NhdGVkIGZvciBtaW5pZHVtcCBjYXB0dXJlXG4iKTsKKwkJZ290byBtZF9mYWlsZWQ7CisJfQorCisJaWYgKHFsYTgyeHhfdmFsaWRhdGVfdGVtcGxhdGVfY2hrc3VtKHZoYSkpIHsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAzOSwKKwkJICAgICJUZW1wbGF0ZSBjaGVja3N1bSB2YWxpZGF0aW9uIGVycm9yXG4iKTsKKwkJZ290byBtZF9mYWlsZWQ7CisJfQorCisJbm9fZW50cnlfaGRyID0gdG1wbHRfaGRyLT5udW1fb2ZfZW50cmllczsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwM2EsCisJICAgICJObyBvZiBlbnRyeSBoZWFkZXJzIGluIFRlbXBsYXRlOiAweCV4XG4iLCBub19lbnRyeV9oZHIpOworCisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDNiLAorCSAgICAiQ2FwdHVyZSBNYXNrIG9idGFpbmVkOiAweCV4XG4iLCB0bXBsdF9oZHItPmNhcHR1cmVfZGVidWdfbGV2ZWwpOworCisJZl9jYXB0dXJlX21hc2sgPSB0bXBsdF9oZHItPmNhcHR1cmVfZGVidWdfbGV2ZWwgJiAweEZGOworCisJLyogVmFsaWRhdGUgd2hldGhlciByZXF1aXJlZCBkZWJ1ZyBsZXZlbCBpcyBzZXQgKi8KKwlpZiAoKGZfY2FwdHVyZV9tYXNrICYgMHgzKSAhPSAweDMpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAzYywKKwkJICAgICJNaW5pbXVtIHJlcXVpcmVkIGNhcHR1cmUgbWFza1sweCV4XSBsZXZlbCBub3Qgc2V0XG4iLAorCQkgICAgZl9jYXB0dXJlX21hc2spOworCQlnb3RvIG1kX2ZhaWxlZDsKKwl9CisJdG1wbHRfaGRyLT5kcml2ZXJfY2FwdHVyZV9tYXNrID0gcWwyeG1kY2FwbWFzazsKKworCXRtcGx0X2hkci0+ZHJpdmVyX2luZm9bMF0gPSB2aGEtPmhvc3Rfbm87CisJdG1wbHRfaGRyLT5kcml2ZXJfaW5mb1sxXSA9IChRTEFfRFJJVkVSX01BSk9SX1ZFUiA8PCAyNCkgfAorCSAgICAoUUxBX0RSSVZFUl9NSU5PUl9WRVIgPDwgMTYpIHwgKFFMQV9EUklWRVJfUEFUQ0hfVkVSIDw8IDgpIHwKKwkgICAgUUxBX0RSSVZFUl9CRVRBX1ZFUjsKKworCXRvdGFsX2RhdGFfc2l6ZSA9IGhhLT5tZF9kdW1wX3NpemU7CisKKwlxbF9kYmcocWxfbG9nX2luZm8sIHZoYSwgMHhiMDNkLAorCSAgICAiVG90YWwgbWluaWR1bXAgZGF0YV9zaXplIDB4JXggdG8gYmUgY2FwdHVyZWRcbiIsIHRvdGFsX2RhdGFfc2l6ZSk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRlbXBsYXRlIG9idGFpbmVkIGlzIHZhbGlkICovCisJaWYgKHRtcGx0X2hkci0+ZW50cnlfdHlwZSAhPSBRTEE4MlhYX1RMSERSKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwNGUsCisJCSAgICAiQmFkIHRlbXBsYXRlIGhlYWRlciBlbnRyeSB0eXBlOiAweCV4IG9idGFpbmVkXG4iLAorCQkgICAgdG1wbHRfaGRyLT5lbnRyeV90eXBlKTsKKwkJZ290byBtZF9mYWlsZWQ7CisJfQorCisJZW50cnlfaGRyID0gKHFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKikgXAorCSAgICAoKCh1aW50OF90ICopaGEtPm1kX3RtcGx0X2hkcikgKyB0bXBsdF9oZHItPmZpcnN0X2VudHJ5X29mZnNldCk7CisKKwkvKiBXYWxrIHRocm91Z2ggdGhlIGVudHJ5IGhlYWRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbm9fZW50cnlfaGRyOyBpKyspIHsKKworCQlpZiAoZGF0YV9jb2xsZWN0ZWQgPiB0b3RhbF9kYXRhX3NpemUpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwM2UsCisJCQkgICAgIk1vcmUgTWluaUR1bXAgZGF0YSBjb2xsZWN0ZWQ6IFsweCV4XVxuIiwKKwkJCSAgICBkYXRhX2NvbGxlY3RlZCk7CisJCQlnb3RvIG1kX2ZhaWxlZDsKKwkJfQorCisJCWlmICghKGVudHJ5X2hkci0+ZF9jdHJsLmVudHJ5X2NhcHR1cmVfbWFzayAmCisJCSAgICBxbDJ4bWRjYXBtYXNrKSkgeworCQkJZW50cnlfaGRyLT5kX2N0cmwuZHJpdmVyX2ZsYWdzIHw9CisJCQkgICAgUUxBODJYWF9EQkdfU0tJUFBFRF9GTEFHOworCQkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDNmLAorCQkJICAgICJTa2lwcGluZyBlbnRyeVslZF06ICIKKwkJCSAgICAiRVRZUEVbMHgleF0tRUxFVkVMWzB4JXhdXG4iLAorCQkJICAgIGksIGVudHJ5X2hkci0+ZW50cnlfdHlwZSwKKwkJCSAgICBlbnRyeV9oZHItPmRfY3RybC5lbnRyeV9jYXB0dXJlX21hc2spOworCQkJZ290byBza2lwX254dF9lbnRyeTsKKwkJfQorCisJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjA0MCwKKwkJICAgICJbJXNdOiBkYXRhIHB0clslZF06ICVwLCBlbnRyeV9oZHI6ICVwXG4iCisJCSAgICAiZW50cnlfdHlwZTogMHgleCwgY2FwdHJ1ZV9tYXNrOiAweCV4XG4iLAorCQkgICAgX19mdW5jX18sIGksIGRhdGFfcHRyLCBlbnRyeV9oZHIsCisJCSAgICBlbnRyeV9oZHItPmVudHJ5X3R5cGUsCisJCSAgICBlbnRyeV9oZHItPmRfY3RybC5lbnRyeV9jYXB0dXJlX21hc2spOworCisJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjA0MSwKKwkJICAgICJEYXRhIGNvbGxlY3RlZDogWzB4JXhdLCBEdW1wIHNpemUgbGVmdDpbMHgleF1cbiIsCisJCSAgICBkYXRhX2NvbGxlY3RlZCwgKGhhLT5tZF9kdW1wX3NpemUgLSBkYXRhX2NvbGxlY3RlZCkpOworCisJCS8qIERlY29kZSB0aGUgZW50cnkgdHlwZSBhbmQgdGFrZQorCQkgKiByZXF1aXJlZCBhY3Rpb24gdG8gY2FwdHVyZSBkZWJ1ZyBkYXRhICovCisJCXN3aXRjaCAoZW50cnlfaGRyLT5lbnRyeV90eXBlKSB7CisJCWNhc2UgUUxBODJYWF9SREVORDoKKwkJCXFsYTgyeHhfbWFya19lbnRyeV9za2lwcGVkKHZoYSwgZW50cnlfaGRyLCBpKTsKKwkJCWJyZWFrOworCQljYXNlIFFMQTgyWFhfQ05UUkw6CisJCQlydmFsID0gcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX2NvbnRyb2wodmhhLAorCQkJICAgIGVudHJ5X2hkciwgJmRhdGFfcHRyKTsKKwkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJcWxhODJ4eF9tYXJrX2VudHJ5X3NraXBwZWQodmhhLCBlbnRyeV9oZHIsIGkpOworCQkJCWdvdG8gbWRfZmFpbGVkOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9SRENSQjoKKwkJCXFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZGNyYih2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9SRE1FTToKKwkJCXJ2YWwgPSBxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfcmRtZW0odmhhLAorCQkJICAgIGVudHJ5X2hkciwgJmRhdGFfcHRyKTsKKwkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJcWxhODJ4eF9tYXJrX2VudHJ5X3NraXBwZWQodmhhLCBlbnRyeV9oZHIsIGkpOworCQkJCWdvdG8gbWRfZmFpbGVkOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9CT0FSRDoKKwkJY2FzZSBRTEE4MlhYX1JEUk9NOgorCQkJcWxhODJ4eF9taW5pZHVtcF9wcm9jZXNzX3Jkcm9tKHZoYSwKKwkJCSAgICBlbnRyeV9oZHIsICZkYXRhX3B0cik7CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX0wyRFRHOgorCQljYXNlIFFMQTgyWFhfTDJJVEc6CisJCWNhc2UgUUxBODJYWF9MMkRBVDoKKwkJY2FzZSBRTEE4MlhYX0wySU5TOgorCQkJcnZhbCA9IHFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19sMnRhZyh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlxbGE4Mnh4X21hcmtfZW50cnlfc2tpcHBlZCh2aGEsIGVudHJ5X2hkciwgaSk7CisJCQkJZ290byBtZF9mYWlsZWQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBRTEE4MlhYX0wxREFUOgorCQljYXNlIFFMQTgyWFhfTDFJTlM6CisJCQlxbGE4Mnh4X21pbmlkdW1wX3Byb2Nlc3NfbDFjYWNoZSh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9SRE9DTToKKwkJCXFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG9jbSh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9SRE1VWDoKKwkJCXFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19yZG11eCh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9RVUVVRToKKwkJCXFsYTgyeHhfbWluaWR1bXBfcHJvY2Vzc19xdWV1ZSh2aGEsCisJCQkgICAgZW50cnlfaGRyLCAmZGF0YV9wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgUUxBODJYWF9SRE5PUDoKKwkJZGVmYXVsdDoKKwkJCXFsYTgyeHhfbWFya19lbnRyeV9za2lwcGVkKHZoYSwgZW50cnlfaGRyLCBpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDQyLAorCQkgICAgIlslc106IGRhdGEgcHRyWyVkXTogJXBcbiIsIF9fZnVuY19fLCBpLCBkYXRhX3B0cik7CisKKwkJZGF0YV9jb2xsZWN0ZWQgPSAodWludDhfdCAqKWRhdGFfcHRyIC0KKwkJICAgICh1aW50OF90ICopaGEtPm1kX2R1bXA7Citza2lwX254dF9lbnRyeToKKwkJZW50cnlfaGRyID0gKHFsYTgyeHhfbWRfZW50cnlfaGRyX3QgKikgXAorCQkgICAgKCgodWludDhfdCAqKWVudHJ5X2hkcikgKyBlbnRyeV9oZHItPmVudHJ5X3NpemUpOworCX0KKworCWlmIChkYXRhX2NvbGxlY3RlZCAhPSB0b3RhbF9kYXRhX3NpemUpIHsKKwkJcWxfZGJnKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA0MywKKwkJICAgICJNaW5pRHVtcCBkYXRhIG1pc21hdGNoOiBEYXRhIGNvbGxlY3RlZDogWzB4JXhdLCIKKwkJICAgICJ0b3RhbF9kYXRhX3NpemU6WzB4JXhdXG4iLAorCQkgICAgZGF0YV9jb2xsZWN0ZWQsIHRvdGFsX2RhdGFfc2l6ZSk7CisJCWdvdG8gbWRfZmFpbGVkOworCX0KKworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwNDQsCisJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXAgJWxkLyVwKS5cbiIsCisJICAgIHZoYS0+aG9zdF9ubywgaGEtPm1kX3RtcGx0X2hkciwgdmhhLT5ob3N0X25vLCBoYS0+bWRfZHVtcCk7CisJaGEtPmZ3X2R1bXBlZCA9IDE7CisJcWxhMngwMF9wb3N0X3VldmVudF93b3JrKHZoYSwgUUxBX1VFVkVOVF9DT0RFX0ZXX0RVTVApOworCittZF9mYWlsZWQ6CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAorcWxhODJ4eF9tZF9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlpbnQgaSwgazsKKwlzdHJ1Y3QgcWxhODJ4eF9tZF90ZW1wbGF0ZV9oZHIgKnRtcGx0X2hkcjsKKworCXRtcGx0X2hkciA9IChzdHJ1Y3QgcWxhODJ4eF9tZF90ZW1wbGF0ZV9oZHIgKiloYS0+bWRfdG1wbHRfaGRyOworCisJaWYgKHFsMnhtZGNhcG1hc2sgPCAweDMgfHwgcWwyeG1kY2FwbWFzayA+IDB4N0YpIHsKKwkJcWwyeG1kY2FwbWFzayA9IHRtcGx0X2hkci0+Y2FwdHVyZV9kZWJ1Z19sZXZlbCAmIDB4RkY7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwNDUsCisJCSAgICAiRm9yY2luZyBkcml2ZXIgY2FwdHVyZSBtYXNrIHRvIGZpcm13YXJlIGRlZmF1bHQgY2FwdHVyZSBtYXNrOiAweCV4LlxuIiwKKwkJICAgIHFsMnhtZGNhcG1hc2spOworCX0KKworCWZvciAoaSA9IDB4MiwgayA9IDE7IChpICYgUUxBODJYWF9ERUZBVUxUX0NBUF9NQVNLKTsgaSA8PD0gMSwgaysrKSB7CisJCWlmIChpICYgcWwyeG1kY2FwbWFzaykKKwkJCWhhLT5tZF9kdW1wX3NpemUgKz0gdG1wbHRfaGRyLT5jYXB0dXJlX3NpemVfYXJyYXlba107CisJfQorCisJaWYgKGhhLT5tZF9kdW1wKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwNDYsCisJCSAgICAiRmlybXdhcmUgZHVtcCBwcmV2aW91c2x5IGFsbG9jYXRlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwloYS0+bWRfZHVtcCA9IHZtYWxsb2MoaGEtPm1kX2R1bXBfc2l6ZSk7CisJaWYgKGhhLT5tZF9kdW1wID09IE5VTEwpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjA0NywKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBNaW5pZHVtcCBzaXplICIKKwkJICAgICIoMHgleCkuXG4iLCBoYS0+bWRfZHVtcF9zaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitxbGE4Mnh4X21kX2ZyZWUoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwkvKiBSZWxlYXNlIHRoZSB0ZW1wbGF0ZSBoZWFkZXIgYWxsb2NhdGVkICovCisJaWYgKGhhLT5tZF90bXBsdF9oZHIpIHsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjA0OCwKKwkJICAgICJGcmVlIE1pbmlEdW1wIHRlbXBsYXRlOiAlcCwgc2l6ZSAoJWQgS0IpXG4iLAorCQkgICAgaGEtPm1kX3RtcGx0X2hkciwgaGEtPm1kX3RlbXBsYXRlX3NpemUgLyAxMDI0KTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGhhLT5tZF90ZW1wbGF0ZV9zaXplLAorCQkgICAgaGEtPm1kX3RtcGx0X2hkciwgaGEtPm1kX3RtcGx0X2hkcl9kbWEpOworCQloYS0+bWRfdG1wbHRfaGRyID0gMDsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSB0ZW1wbGF0ZSBkYXRhIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KKwlpZiAoaGEtPm1kX2R1bXApIHsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjA0OSwKKwkJICAgICJGcmVlIE1pbmlEdW1wIG1lbW9yeTogJXAsIHNpemUgKCVkIEtCKVxuIiwKKwkJICAgIGhhLT5tZF9kdW1wLCBoYS0+bWRfZHVtcF9zaXplIC8gMTAyNCk7CisJCXZmcmVlKGhhLT5tZF9kdW1wKTsKKwkJaGEtPm1kX2R1bXBfc2l6ZSA9IDA7CisJCWhhLT5tZF9kdW1wID0gMDsKKwl9Cit9CisKK3ZvaWQKK3FsYTgyeHhfbWRfcHJlcChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3sKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlpbnQgcnZhbDsKKworCS8qIEdldCBNaW5pZHVtcCB0ZW1wbGF0ZSBzaXplICovCisJcnZhbCA9IHFsYTgyeHhfbWRfZ2V0X3RlbXBsYXRlX3NpemUodmhhKTsKKwlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDRhLAorCQkgICAgIk1pbmlEdW1wIFRlbXBsYXRlIHNpemUgb2J0YWluZWQgKCVkIEtCKVxuIiwKKwkJICAgIGhhLT5tZF90ZW1wbGF0ZV9zaXplIC8gMTAyNCk7CisKKwkJLyogR2V0IE1pbmlkdW1wIHRlbXBsYXRlICovCisJCXJ2YWwgPSBxbGE4Mnh4X21kX2dldF90ZW1wbGF0ZSh2aGEpOworCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgeworCQkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDRiLAorCQkJICAgICJNaW5pRHVtcCBUZW1wbGF0ZSBvYnRhaW5lZFxuIik7CisKKwkJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgbWluaWR1bXAgKi8KKwkJCXJ2YWwgPSBxbGE4Mnh4X21kX2FsbG9jKHZoYSk7CisJCQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykKKwkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDRjLAorCQkJCSAgICAiTWluaUR1bXAgbWVtb3J5IGFsbG9jYXRlZCAoJWQgS0IpXG4iLAorCQkJCSAgICBoYS0+bWRfZHVtcF9zaXplIC8gMTAyNCk7CisJCQllbHNlIHsKKwkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDRkLAorCQkJCSAgICAiRnJlZSBNaW5pRHVtcCB0ZW1wbGF0ZTogJXAsIHNpemU6ICglZCBLQilcbiIsCisJCQkJICAgIGhhLT5tZF90bXBsdF9oZHIsCisJCQkJICAgIGhhLT5tZF90ZW1wbGF0ZV9zaXplIC8gMTAyNCk7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkJICAgIGhhLT5tZF90ZW1wbGF0ZV9zaXplLAorCQkJCSAgICBoYS0+bWRfdG1wbHRfaGRyLCBoYS0+bWRfdG1wbHRfaGRyX2RtYSk7CisJCQkJaGEtPm1kX3RtcGx0X2hkciA9IDA7CisJCQl9CisKKwkJfQorCX0KK30KKworaW50CitxbGE4Mnh4X2JlYWNvbl9vbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQoreworCisJaW50IHJ2YWw7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisJcWxhODJ4eF9pZGNfbG9jayhoYSk7CisJcnZhbCA9IHFsYTgyeHhfbWJ4X2JlYWNvbl9jdGwodmhhLCAxKTsKKworCWlmIChydmFsKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwNTAsCisJCSAgICAibWJ4IHNldCBsZWQgY29uZmlnIGZhaWxlZCBpbiAlc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXQ7CisJfQorCWhhLT5iZWFjb25fYmxpbmtfbGVkID0gMTsKK2V4aXQ6CisJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKKwlyZXR1cm4gcnZhbDsKK30KKworaW50CitxbGE4Mnh4X2JlYWNvbl9vZmYoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKK3sKKworCWludCBydmFsOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXFsYTgyeHhfaWRjX2xvY2soaGEpOworCXJ2YWwgPSBxbGE4Mnh4X21ieF9iZWFjb25fY3RsKHZoYSwgMCk7CisKKwlpZiAocnZhbCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDUxLAorCQkgICAgIm1ieCBzZXQgbGVkIGNvbmZpZyBmYWlsZWQgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJZ290byBleGl0OworCX0KKwloYS0+YmVhY29uX2JsaW5rX2xlZCA9IDA7CitleGl0OgorCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CisJcmV0dXJuIHJ2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCmluZGV4IDhhMjE4MzIuLjU3ODIwYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCkBAIC00ODQsOCArNDg0LDYgQEAKICNkZWZpbmUgUUxBODJYWF9BRERSX09DTTEJCSgweDAwMDAwMDAyMDA0MDAwMDBVTEwpCiAjZGVmaW5lIFFMQTgyWFhfQUREUl9PQ00xX01BWAkJKDB4MDAwMDAwMDIwMDRmZmZmZlVMTCkKICNkZWZpbmUgUUxBODJYWF9BRERSX1FEUl9ORVQJCSgweDAwMDAwMDAzMDAwMDAwMDBVTEwpCi0KLSNkZWZpbmUgUUxBODJYWF9QMl9BRERSX1FEUl9ORVRfTUFYCSgweDAwMDAwMDAzMDAxZmZmZmZVTEwpCiAjZGVmaW5lIFFMQTgyWFhfUDNfQUREUl9RRFJfTkVUX01BWAkoMHgwMDAwMDAwMzAzZmZmZmZmVUxMKQogCiAjZGVmaW5lIFFMQTgyWFhfUENJX0NSQlNQQUNFCQkodW5zaWduZWQgbG9uZykweDA2MDAwMDAwCkBAIC04OTAsNiArODg4LDcgQEAKIH07CiAKICNkZWZpbmUgTUJDX1RPR0dMRV9JTlRFUlJVUFQJMHgxMAorI2RlZmluZSBNQkNfU0VUX0xFRF9DT05GSUcJMHgxMjUKIAogLyogRmxhc2ggIG9mZnNldCAqLwogI2RlZmluZSBGTFRfUkVHX0JPT1RMT0FEXzgyWFgJMHg3MgpAQCAtOTIyLDQgKzkyMSwyNTYgQEAKICNkZWZpbmUgTTI1UF9JTlNUUl9EUAkJMHhiOQogI2RlZmluZSBNMjVQX0lOU1RSX1JFUwkJMHhhYgogCisvKiBNaW5pZHVtcCByZWxhdGVkICovCisKKy8qCisgKiBWZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZQorICogNCBCeXRlcworICogWC5NYWpvci5NaW5vci5SRUxFQVNFCisgKi8KKyNkZWZpbmUgUUxBODJYWF9NSU5JRFVNUF9WRVJTSU9OICAgICAgICAgMHgxMDEwMQorCisvKgorICogRW50cnkgVHlwZSBEZWZpbmVzCisgKi8KKyNkZWZpbmUgUUxBODJYWF9SRE5PUCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFFMQTgyWFhfUkRDUkIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBRTEE4MlhYX1JETVVYICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUUxBODJYWF9RVUVVRSAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFFMQTgyWFhfQk9BUkQgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBRTEE4MlhYX1JEU1JFICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUUxBODJYWF9SRE9DTSAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFFMQTgyWFhfQ0FDSEUgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBRTEE4MlhYX0wxREFUICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgUUxBODJYWF9MMUlOUyAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFFMQTgyWFhfTDJEVEcgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBRTEE4MlhYX0wySVRHICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgUUxBODJYWF9MMkRBVCAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFFMQTgyWFhfTDJJTlMgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBRTEE4MlhYX1JEUk9NICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgUUxBODJYWF9SRE1FTSAgICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFFMQTgyWFhfQ05UUkwgICAgICAgICAgICAgICAgICA5OAorI2RlZmluZSBRTEE4MlhYX1RMSERSICAgICAgICAgICAgICAgICAgOTkKKyNkZWZpbmUgUUxBODJYWF9SREVORCAgICAgICAgICAgICAgICAgIDI1NQorCisvKgorICogT3Bjb2RlcyBmb3IgQ29udHJvbCBFbnRyaWVzLgorICogVGhlc2UgRmxhZ3MgYXJlIGJpdCBmaWVsZHMuCisgKi8KKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX1dSICAgICAgICAweDAxCisjZGVmaW5lIFFMQTgyWFhfREJHX09QQ09ERV9SVyAgICAgICAgMHgwMgorI2RlZmluZSBRTEE4MlhYX0RCR19PUENPREVfQU5EICAgICAgIDB4MDQKKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX09SICAgICAgICAweDA4CisjZGVmaW5lIFFMQTgyWFhfREJHX09QQ09ERV9QT0xMICAgICAgMHgxMAorI2RlZmluZSBRTEE4MlhYX0RCR19PUENPREVfUkRTVEFURSAgIDB4MjAKKyNkZWZpbmUgUUxBODJYWF9EQkdfT1BDT0RFX1dSU1RBVEUgICAweDQwCisjZGVmaW5lIFFMQTgyWFhfREJHX09QQ09ERV9NRFNUQVRFICAgMHg4MAorCisvKgorICogVGVtcGxhdGUgSGVhZGVyIGFuZCBFbnRyeSBIZWFkZXIgZGVmaW5pdGlvbnMgc3RhcnQgaGVyZS4KKyAqLworCisvKgorICogVGVtcGxhdGUgSGVhZGVyCisgKiBQYXJ0cyBvZiB0aGUgdGVtcGxhdGUgaGVhZGVyIGNhbiBiZSBtb2RpZmllZCBieSB0aGUgZHJpdmVyLgorICogVGhlc2UgaW5jbHVkZSB0aGUgc2F2ZWRfc3RhdGVfYXJyYXksIGNhcHR1cmVfZGVidWdfbGV2ZWwsIGRyaXZlcl90aW1lc3RhbXAKKyAqLworCisjZGVmaW5lIFFMQTgyWFhfREJHX1NUQVRFX0FSUkFZX0xFTiAgICAgICAgMTYKKyNkZWZpbmUgUUxBODJYWF9EQkdfQ0FQX1NJWkVfQVJSQVlfTEVOICAgICA4CisjZGVmaW5lIFFMQTgyWFhfREJHX1JTVkRfQVJSQVlfTEVOICAgICAgICAgOAorCisvKgorICogRHJpdmVyIEZsYWdzCisgKi8KKyNkZWZpbmUgUUxBODJYWF9EQkdfU0tJUFBFRF9GTEFHCTB4ODAJLyogZHJpdmVyIHNraXBwZWQgdGhpcyBlbnRyeSAqLworI2RlZmluZQlRTEE4MlhYX0RFRkFVTFRfQ0FQX01BU0sJMHhGRgkvKiBkZWZhdWx0IGNhcHR1cmUgbWFzayAqLworCitzdHJ1Y3QgcWxhODJ4eF9tZF90ZW1wbGF0ZV9oZHIgeworCXVpbnQzMl90IGVudHJ5X3R5cGU7CisJdWludDMyX3QgZmlyc3RfZW50cnlfb2Zmc2V0OworCXVpbnQzMl90IHNpemVfb2ZfdGVtcGxhdGU7CisJdWludDMyX3QgY2FwdHVyZV9kZWJ1Z19sZXZlbDsKKworCXVpbnQzMl90IG51bV9vZl9lbnRyaWVzOworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgZHJpdmVyX3RpbWVzdGFtcDsKKwl1aW50MzJfdCB0ZW1wbGF0ZV9jaGVja3N1bTsKKworCXVpbnQzMl90IGRyaXZlcl9jYXB0dXJlX21hc2s7CisJdWludDMyX3QgZHJpdmVyX2luZm9bM107CisKKwl1aW50MzJfdCBzYXZlZF9zdGF0ZV9hcnJheVtRTEE4MlhYX0RCR19TVEFURV9BUlJBWV9MRU5dOworCXVpbnQzMl90IGNhcHR1cmVfc2l6ZV9hcnJheVtRTEE4MlhYX0RCR19DQVBfU0laRV9BUlJBWV9MRU5dOworCisJLyogIG1hcmtlcnNfYXJyYXkgdXNlZCB0byBjYXB0dXJlIHNvbWUgc3BlY2lhbCBsb2NhdGlvbnMgb24gYm9hcmQgKi8KKwl1aW50MzJfdCBtYXJrZXJzX2FycmF5W1FMQTgyWFhfREJHX1JTVkRfQVJSQVlfTEVOXTsKKwl1aW50MzJfdCBudW1fb2ZfZnJlZV9lbnRyaWVzOwkvKiBGb3IgaW50ZXJuYWwgdXNlICovCisJdWludDMyX3QgZnJlZV9lbnRyeV9vZmZzZXQ7CS8qIEZvciBpbnRlcm5hbCB1c2UgKi8KKwl1aW50MzJfdCB0b3RhbF90YWJsZV9zaXplOwkvKiAgRm9yIGludGVybmFsIHVzZSAqLworCXVpbnQzMl90IGJrdXBfdGFibGVfb2Zmc2V0OwkvKiAgRm9yIGludGVybmFsIHVzZSAqLworfSBfX3BhY2tlZDsKKworLyoKKyAqIEVudHJ5IEhlYWRlcjogIENvbW1vbiB0byBBbGwgRW50cnkgVHlwZXMKKyAqLworCisvKgorICogRHJpdmVyIENvZGUgaXMgZm9yIGRyaXZlciB0byB3cml0ZSBzb21lIGluZm8gYWJvdXQgdGhlIGVudHJ5LgorICogQ3VycmVudGx5IG5vdCB1c2VkLgorICovCit0eXBlZGVmIHN0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X2hkciB7CisJdWludDMyX3QgZW50cnlfdHlwZTsKKwl1aW50MzJfdCBlbnRyeV9zaXplOworCXVpbnQzMl90IGVudHJ5X2NhcHR1cmVfc2l6ZTsKKwlzdHJ1Y3QgeworCQl1aW50OF90IGVudHJ5X2NhcHR1cmVfbWFzazsKKwkJdWludDhfdCBlbnRyeV9jb2RlOworCQl1aW50OF90IGRyaXZlcl9jb2RlOworCQl1aW50OF90IGRyaXZlcl9mbGFnczsKKwl9IGRfY3RybDsKK30gX19wYWNrZWQgcWxhODJ4eF9tZF9lbnRyeV9oZHJfdDsKKworLyoKKyAqICBSZWFkIENSQiBlbnRyeSBoZWFkZXIKKyAqLworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY3JiIHsKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90IGg7CisJdWludDMyX3QgYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50OF90IGFkZHJfc3RyaWRlOworCQl1aW50OF90IHN0YXRlX2luZGV4X2E7CisJCXVpbnQxNl90IHBvbGxfdGltZW91dDsKKwl9IGNyYl9zdHJkOworCisJdWludDMyX3QgZGF0YV9zaXplOworCXVpbnQzMl90IG9wX2NvdW50OworCisJc3RydWN0IHsKKwkJdWludDhfdCBvcGNvZGU7CisJCXVpbnQ4X3Qgc3RhdGVfaW5kZXhfdjsKKwkJdWludDhfdCBzaGw7CisJCXVpbnQ4X3Qgc2hyOworCX0gY3JiX2N0cmw7CisKKwl1aW50MzJfdCB2YWx1ZV8xOworCXVpbnQzMl90IHZhbHVlXzI7CisJdWludDMyX3QgdmFsdWVfMzsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBDYWNoZSBlbnRyeSBoZWFkZXIKKyAqLworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfY2FjaGUgeworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgaDsKKworCXVpbnQzMl90IHRhZ19yZWdfYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCB0YWdfdmFsdWVfc3RyaWRlOworCQl1aW50MTZfdCBpbml0X3RhZ192YWx1ZTsKKwl9IGFkZHJfY3RybDsKKworCXVpbnQzMl90IGRhdGFfc2l6ZTsKKwl1aW50MzJfdCBvcF9jb3VudDsKKworCXVpbnQzMl90IGNvbnRyb2xfYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdCB3cml0ZV92YWx1ZTsKKwkJdWludDhfdCBwb2xsX21hc2s7CisJCXVpbnQ4X3QgcG9sbF93YWl0OworCX0gY2FjaGVfY3RybDsKKworCXVpbnQzMl90IHJlYWRfYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50OF90IHJlYWRfYWRkcl9zdHJpZGU7CisJCXVpbnQ4X3QgcmVhZF9hZGRyX2NudDsKKwkJdWludDE2X3QgcnN2ZF8xOworCX0gcmVhZF9jdHJsOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFJlYWQgT0NNCisgKi8KK3N0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3Jkb2NtIHsKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90IGg7CisKKwl1aW50MzJfdCByc3ZkXzA7CisJdWludDMyX3QgcnN2ZF8xOworCXVpbnQzMl90IGRhdGFfc2l6ZTsKKwl1aW50MzJfdCBvcF9jb3VudDsKKworCXVpbnQzMl90IHJzdmRfMjsKKwl1aW50MzJfdCByc3ZkXzM7CisJdWludDMyX3QgcmVhZF9hZGRyOworCXVpbnQzMl90IHJlYWRfYWRkcl9zdHJpZGU7CisJdWludDMyX3QgcmVhZF9hZGRyX2NudHJsOworfSBfX3BhY2tlZDsKKworLyoKKyAqIFJlYWQgTWVtb3J5CisgKi8KK3N0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X3JkbWVtIHsKKwlxbGE4Mnh4X21kX2VudHJ5X2hkcl90IGg7CisJdWludDMyX3QgcnN2ZFs2XTsKKwl1aW50MzJfdCByZWFkX2FkZHI7CisJdWludDMyX3QgcmVhZF9kYXRhX3NpemU7Cit9IF9fcGFja2VkOworCisvKgorICogUmVhZCBST00KKyAqLworc3RydWN0IHFsYTgyeHhfbWRfZW50cnlfcmRyb20geworCXFsYTgyeHhfbWRfZW50cnlfaGRyX3QgaDsKKwl1aW50MzJfdCByc3ZkWzZdOworCXVpbnQzMl90IHJlYWRfYWRkcjsKKwl1aW50MzJfdCByZWFkX2RhdGFfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxbGE4Mnh4X21kX2VudHJ5X211eCB7CisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCBoOworCisJdWludDMyX3Qgc2VsZWN0X2FkZHI7CisJdWludDMyX3QgcnN2ZF8wOworCXVpbnQzMl90IGRhdGFfc2l6ZTsKKwl1aW50MzJfdCBvcF9jb3VudDsKKworCXVpbnQzMl90IHNlbGVjdF92YWx1ZTsKKwl1aW50MzJfdCBzZWxlY3RfdmFsdWVfc3RyaWRlOworCXVpbnQzMl90IHJlYWRfYWRkcjsKKwl1aW50MzJfdCByc3ZkXzE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcWxhODJ4eF9tZF9lbnRyeV9xdWV1ZSB7CisJcWxhODJ4eF9tZF9lbnRyeV9oZHJfdCBoOworCisJdWludDMyX3Qgc2VsZWN0X2FkZHI7CisJc3RydWN0IHsKKwkJdWludDE2X3QgcXVldWVfaWRfc3RyaWRlOworCQl1aW50MTZfdCByc3ZkXzA7CisJfSBxX3N0cmQ7CisKKwl1aW50MzJfdCBkYXRhX3NpemU7CisJdWludDMyX3Qgb3BfY291bnQ7CisJdWludDMyX3QgcnN2ZF8xOworCXVpbnQzMl90IHJzdmRfMjsKKworCXVpbnQzMl90IHJlYWRfYWRkcjsKKwlzdHJ1Y3QgeworCQl1aW50OF90IHJlYWRfYWRkcl9zdHJpZGU7CisJCXVpbnQ4X3QgcmVhZF9hZGRyX2NudDsKKwkJdWludDE2X3QgcnN2ZF8zOworCX0gcmRfc3RyZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUJDX0RJQUdOT1NUSUNfTUlOSURVTVBfVEVNUExBVEUgMHgxMjkKKyNkZWZpbmUgUlFTVF9UTVBMVF9TSVpFCTB4MAorI2RlZmluZSBSUVNUX1RNUExUIDB4MQorI2RlZmluZSBNRF9ESVJFQ1RfUk9NX1dJTkRPVwkweDQyMTEwMDMwCisjZGVmaW5lIE1EX0RJUkVDVF9ST01fUkVBRF9CQVNFCTB4NDIxNTAwMDAKKyNkZWZpbmUgTURfTUlVX1RFU1RfQUdUX0NUUkwJCTB4NDEwMDAwOTAKKyNkZWZpbmUgTURfTUlVX1RFU1RfQUdUX0FERFJfTE8JCTB4NDEwMDAwOTQKKyNkZWZpbmUgTURfTUlVX1RFU1RfQUdUX0FERFJfSEkJCTB4NDEwMDAwOTgKKworc3RhdGljIGNvbnN0IGludCBNRF9NSVVfVEVTVF9BR1RfUkREQVRBW10gPSB7IDB4NDEwMDAwQTgsIDB4NDEwMDAwQUMsCisJMHg0MTAwMDBCOCwgMHg0MTAwMDBCQyB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCmluZGV4IDFlNjk1MjcuLmZkMTRjN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJIlNldCBpdCB0byAxIHRvIHR1cm4gb24gdGhlIGNwdSBhZmZpbml0eS4iKTsKIAogaW50IHFsMnhmd2xvYWRiaW47Ci1tb2R1bGVfcGFyYW0ocWwyeGZ3bG9hZGJpbiwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShxbDJ4Zndsb2FkYmluLCBpbnQsIFNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhmd2xvYWRiaW4sCiAJCSJPcHRpb24gdG8gc3BlY2lmeSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRvIGxvYWQgSVNQIGZpcm13YXJlOi5cbiIKIAkJIiAyIC0tIGxvYWQgZmlybXdhcmUgdmlhIHRoZSByZXF1ZXN0X2Zpcm13YXJlKCkgKGhvdHBsdWcpLlxuIgpAQCAtMTU4LDExICsxNTgsMTEgQEAKIAkJIkRlZmF1bHQgaXMgMCAtIHNraXAgRVRTIGVuYWJsZW1lbnQuIik7CiAKIGludCBxbDJ4ZGJ3ciA9IDE7Ci1tb2R1bGVfcGFyYW0ocWwyeGRid3IsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0ocWwyeGRid3IsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGRid3IsCi0JIk9wdGlvbiB0byBzcGVjaWZ5IHNjaGVtZSBmb3IgcmVxdWVzdCBxdWV1ZSBwb3N0aW5nLlxuIgotCSIgMCAtLSBSZWd1bGFyIGRvb3JiZWxsLlxuIgotCSIgMSAtLSBDQU1SQU0gZG9vcmJlbGwgKGZhc3RlcikuXG4iKTsKKwkJIk9wdGlvbiB0byBzcGVjaWZ5IHNjaGVtZSBmb3IgcmVxdWVzdCBxdWV1ZSBwb3N0aW5nLlxuIgorCQkiIDAgLS0gUmVndWxhciBkb29yYmVsbC5cbiIKKwkJIiAxIC0tIENBTVJBTSBkb29yYmVsbCAoZmFzdGVyKS5cbiIpOwogCiBpbnQgcWwyeHRhcmdldHJlc2V0ID0gMTsKIG1vZHVsZV9wYXJhbShxbDJ4dGFyZ2V0cmVzZXQsIGludCwgU19JUlVHTyk7CkBAIC0xODMsMTEgKzE4MywxMSBAQAogCQkiRGVmYXVsdCBpcyAwIC0gSXNzdWUgVE0gSU9DQnMgdmlhIG1haWxib3ggbWVjaGFuaXNtLiIpOwogCiBpbnQgcWwyeGRvbnRyZXNldGhiYTsKLW1vZHVsZV9wYXJhbShxbDJ4ZG9udHJlc2V0aGJhLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKHFsMnhkb250cmVzZXRoYmEsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGRvbnRyZXNldGhiYSwKLQkiT3B0aW9uIHRvIHNwZWNpZnkgcmVzZXQgYmVoYXZpb3VyLlxuIgotCSIgMCAoRGVmYXVsdCkgLS0gUmVzZXQgb24gZmFpbHVyZS5cbiIKLQkiIDEgLS0gRG8gbm90IHJlc2V0IG9uIGZhaWx1cmUuXG4iKTsKKwkJIk9wdGlvbiB0byBzcGVjaWZ5IHJlc2V0IGJlaGF2aW91ci5cbiIKKwkJIiAwIChEZWZhdWx0KSAtLSBSZXNldCBvbiBmYWlsdXJlLlxuIgorCQkiIDEgLS0gRG8gbm90IHJlc2V0IG9uIGZhaWx1cmUuXG4iKTsKIAogdWludCBxbDJ4bWF4bHVuID0gTUFYX0xVTlM7CiBtb2R1bGVfcGFyYW0ocWwyeG1heGx1biwgdWludCwgU19JUlVHTyk7CkBAIC0xOTUsNiArMTk1LDE5IEBACiAJCSJEZWZpbmVzIHRoZSBtYXhpbXVtIExVIG51bWJlciB0byByZWdpc3RlciB3aXRoIHRoZSBTQ1NJICIKIAkJIm1pZGxheWVyLiBEZWZhdWx0IGlzIDY1NTM1LiIpOwogCitpbnQgcWwyeG1kY2FwbWFzayA9IDB4MUY7Cittb2R1bGVfcGFyYW0ocWwyeG1kY2FwbWFzaywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeG1kY2FwbWFzaywKKwkJIlNldCB0aGUgTWluaWR1bXAgZHJpdmVyIGNhcHR1cmUgbWFzayBsZXZlbC4gIgorCQkiRGVmYXVsdCBpcyAweDdGIC0gQ2FuIGJlIHNldCB0byAweDMsIDB4NywgMHhGLCAweDFGLCAweDdGLiIpOworCitpbnQgcWwyeG1kZW5hYmxlOworbW9kdWxlX3BhcmFtKHFsMnhtZGVuYWJsZSwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeG1kZW5hYmxlLAorCQkiRW5hYmxlL2Rpc2FibGUgTWluaUR1bXAuICIKKwkJIjAgKERlZmF1bHQpIC0gTWluaUR1bXAgZGlzYWJsZWQuICIKKwkJIjEgLSBNaW5pRHVtcCBlbmFibGVkLiIpOworCiAvKgogICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCkBAIC0xNzUwLDkgKzE3NjMsOSBAQAogCS5yZWFkX252cmFtCQk9IHFsYTI0eHhfcmVhZF9udnJhbV9kYXRhLAogCS53cml0ZV9udnJhbQkJPSBxbGEyNHh4X3dyaXRlX252cmFtX2RhdGEsCiAJLmZ3X2R1bXAJCT0gcWxhMjR4eF9md19kdW1wLAotCS5iZWFjb25fb24JCT0gcWxhMjR4eF9iZWFjb25fb24sCi0JLmJlYWNvbl9vZmYJCT0gcWxhMjR4eF9iZWFjb25fb2ZmLAotCS5iZWFjb25fYmxpbmsJCT0gcWxhMjR4eF9iZWFjb25fYmxpbmssCisJLmJlYWNvbl9vbgkJPSBxbGE4Mnh4X2JlYWNvbl9vbiwKKwkuYmVhY29uX29mZgkJPSBxbGE4Mnh4X2JlYWNvbl9vZmYsCisJLmJlYWNvbl9ibGluawkJPSBOVUxMLAogCS5yZWFkX29wdHJvbQkJPSBxbGE4Mnh4X3JlYWRfb3B0cm9tX2RhdGEsCiAJLndyaXRlX29wdHJvbQkJPSBxbGE4Mnh4X3dyaXRlX29wdHJvbV9kYXRhLAogCS5nZXRfZmxhc2hfdmVyc2lvbgk9IHFsYTI0eHhfZ2V0X2ZsYXNoX3ZlcnNpb24sCkBAIC0yNjcwLDYgKzI2ODMsOCBAQAogCiAJcWxhMngwMF9tZW1fZnJlZShoYSk7CiAKKwlxbGE4Mnh4X21kX2ZyZWUodmhhKTsKKwogCXFsYTJ4MDBfZnJlZV9xdWV1ZXMoaGEpOwogfQogCkBAIC0zOTAzLDggKzM5MTgsMTEgQEAKIAogCS8qIENoZWNrIGlmIGJlYWNvbiBMRUQgbmVlZHMgdG8gYmUgYmxpbmtlZCBmb3IgcGh5c2ljYWwgaG9zdCBvbmx5ICovCiAJaWYgKCF2aGEtPnZwX2lkeCAmJiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkpIHsKLQkJc2V0X2JpdChCRUFDT05fQkxJTktfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwotCQlzdGFydF9kcGMrKzsKKwkJLyogVGhlcmUgaXMgbm8gYmVhY29uX2JsaW5rIGZ1bmN0aW9uIGZvciBJU1A4Mnh4ICovCisJCWlmICghSVNfUUxBODJYWChoYSkpIHsKKwkJCXNldF9iaXQoQkVBQ09OX0JMSU5LX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXN0YXJ0X2RwYysrOworCQl9CiAJfQogCiAJLyogUHJvY2VzcyBhbnkgZGVmZXJyZWQgd29yay4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnCmluZGV4IDBmNTU5OWUuLmYxYWQwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZSAiUUxvZ2ljIElTUDRYWFggYW5kIElTUDgyWFggaG9zdCBhZGFwdGVyIGZhbWlseSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kgJiYgTkVUCiAJc2VsZWN0IFNDU0lfSVNDU0lfQVRUUlMKKwlzZWxlY3QgSVNDU0lfQk9PVF9TWVNGUwogCS0tLWhlbHAtLS0KIAlUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUUxvZ2ljIDQweHggKElTUDRYWFgpIGFuZCA4MDIyIChJU1A4MlhYKQogCWlTQ1NJIGhvc3QgYWRhcHRlciBmYW1pbHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L01ha2VmaWxlCmluZGV4IDI1MjUyM2QuLjViNDQxMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogcWxhNHh4eC15IDo9IHFsNF9vcy5vIHFsNF9pbml0Lm8gcWw0X21ieC5vIHFsNF9pb2NiLm8gcWw0X2lzci5vIFwKLQkJcWw0X254Lm8gcWw0X252cmFtLm8gcWw0X2RiZy5vIHFsNF9hdHRyLm8KKwkJcWw0X254Lm8gcWw0X252cmFtLm8gcWw0X2RiZy5vIHFsNF9hdHRyLm8gcWw0X2JzZy5vCiAKIG9iai0kKENPTkZJR19TQ1NJX1FMQV9JU0NTSSkgKz0gcWxhNHh4eC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfYXR0ci5jCmluZGV4IDg2NGQwMTguLjBiMGE3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2F0dHIuYwpAQCAtNTUsMTUgKzU1LDkxIEBACiAJCQloYS0+Ym9vdGxvYWRfcGF0Y2gsIGhhLT5ib290bG9hZF9idWlsZCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitxbGE0eHh4X2JvYXJkX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4WFxuIiwgaGEtPmJvYXJkX2lkKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfZndfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisKKwlxbGE0eHh4X2dldF9maXJtd2FyZV9zdGF0ZShoYSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDhYJThYXG4iLCBoYS0+ZmlybXdhcmVfc3RhdGUsCisJCQloYS0+YWRkbF9md19zdGF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGE0eHh4X3BoeV9wb3J0X2NudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChkZXYpKTsKKworCWlmICghaXNfcWxhODAyMihoYSkpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDRYXG4iLCBoYS0+cGh5X3BvcnRfY250KTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfcGh5X3BvcnRfbnVtX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGNsYXNzX3RvX3Nob3N0KGRldikpOworCisJaWYgKCFpc19xbGE4MDIyKGhhKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwNFhcbiIsIGhhLT5waHlfcG9ydF9udW0pOworfQorCitzdGF0aWMgc3NpemVfdAorcWxhNHh4eF9pc2NzaV9mdW5jX2NudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChkZXYpKTsKKworCWlmICghaXNfcWxhODAyMihoYSkpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDRYXG4iLCBoYS0+aXNjc2lfcGNpX2Z1bmNfY250KTsKK30KKworc3RhdGljIHNzaXplX3QKK3FsYTR4eHhfaGJhX21vZGVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbGFzc190b19zaG9zdChkZXYpKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBoYS0+bW9kZWxfbmFtZSk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihmd192ZXJzaW9uLCBTX0lSVUdPLCBxbGE0eHh4X2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsX251bSwgU19JUlVHTywgcWxhNHh4eF9zZXJpYWxfbnVtX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGlzY3NpX3ZlcnNpb24sIFNfSVJVR08sIHFsYTR4eHhfaXNjc2lfdmVyc2lvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihvcHRyb21fdmVyc2lvbiwgU19JUlVHTywgcWxhNHh4eF9vcHRyb21fdmVyc2lvbl9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihib2FyZF9pZCwgU19JUlVHTywgcWxhNHh4eF9ib2FyZF9pZF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmd19zdGF0ZSwgU19JUlVHTywgcWxhNHh4eF9md19zdGF0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaHlfcG9ydF9jbnQsIFNfSVJVR08sIHFsYTR4eHhfcGh5X3BvcnRfY250X3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHBoeV9wb3J0X251bSwgU19JUlVHTywgcWxhNHh4eF9waHlfcG9ydF9udW1fc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaXNjc2lfZnVuY19jbnQsIFNfSVJVR08sIHFsYTR4eHhfaXNjc2lfZnVuY19jbnRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaGJhX21vZGVsLCBTX0lSVUdPLCBxbGE0eHh4X2hiYV9tb2RlbF9zaG93LCBOVUxMKTsKIAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnFsYTR4eHhfaG9zdF9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9md192ZXJzaW9uLAogCSZkZXZfYXR0cl9zZXJpYWxfbnVtLAogCSZkZXZfYXR0cl9pc2NzaV92ZXJzaW9uLAogCSZkZXZfYXR0cl9vcHRyb21fdmVyc2lvbiwKKwkmZGV2X2F0dHJfYm9hcmRfaWQsCisJJmRldl9hdHRyX2Z3X3N0YXRlLAorCSZkZXZfYXR0cl9waHlfcG9ydF9jbnQsCisJJmRldl9hdHRyX3BoeV9wb3J0X251bSwKKwkmZGV2X2F0dHJfaXNjc2lfZnVuY19jbnQsCisJJmRldl9hdHRyX2hiYV9tb2RlbCwKIAlOVUxMLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9ic2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNkYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5jCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogUUxvZ2ljIGlTQ1NJIEhCQSBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBTZWUgTElDRU5TRS5xbGE0eHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJxbDRfZGVmLmgiCisjaW5jbHVkZSAicWw0X2dsYmwuaCIKKyNpbmNsdWRlICJxbDRfYnNnLmgiCisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfcmVhZF9mbGFzaChzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKmJzZ19yZXBseSA9IGJzZ19qb2ItPnJlcGx5OworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqYnNnX3JlcSA9IGJzZ19qb2ItPnJlcXVlc3Q7CisJdWludDMyX3Qgb2Zmc2V0ID0gMDsKKwl1aW50MzJfdCBsZW5ndGggPSAwOworCWRtYV9hZGRyX3QgZmxhc2hfZG1hOworCXVpbnQ4X3QgKmZsYXNoID0gTlVMTDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCWlmIChoYS0+Zmxhc2hfc3RhdGUgIT0gUUxGTEFTSF9XQUlUSU5HKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGFub3RoZXIgZmxhc2ggb3BlcmF0aW9uICIKKwkJCSAgICJhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwloYS0+Zmxhc2hfc3RhdGUgPSBRTEZMQVNIX1JFQURJTkc7CisJb2Zmc2V0ID0gYnNnX3JlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMV07CisJbGVuZ3RoID0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKworCWZsYXNoID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW5ndGgsICZmbGFzaF9kbWEsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFmbGFzaCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBkbWEgYWxsb2MgZmFpbGVkIGZvciBmbGFzaCAiCisJCQkgICAiZGF0YVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlydmFsID0gcWxhNHh4eF9nZXRfZmxhc2goaGEsIGZsYXNoX2RtYSwgb2Zmc2V0LCBsZW5ndGgpOworCWlmIChydmFsKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGdldCBmbGFzaCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZSB7CisJCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KKwkJCXNnX2NvcHlfZnJvbV9idWZmZXIoYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCQkJCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCisJCQkJCSAgICBmbGFzaCwgbGVuZ3RoKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJfQorCisJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkgICAgIGJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgbGVuZ3RoLCBmbGFzaCwgZmxhc2hfZG1hKTsKK2xlYXZlOgorCWhhLT5mbGFzaF9zdGF0ZSA9IFFMRkxBU0hfV0FJVElORzsKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludAorcWxhNHh4eF91cGRhdGVfZmxhc2goc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChic2dfam9iKTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChob3N0KTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXVpbnQzMl90IGxlbmd0aCA9IDA7CisJdWludDMyX3Qgb2Zmc2V0ID0gMDsKKwl1aW50MzJfdCBvcHRpb25zID0gMDsKKwlkbWFfYWRkcl90IGZsYXNoX2RtYTsKKwl1aW50OF90ICpmbGFzaCA9IE5VTEw7CisJaW50IHJ2YWwgPSAtRUlOVkFMOworCisJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkKKwkJZ290byBsZWF2ZTsKKworCWlmIChxbDR4eHhfcmVzZXRfYWN0aXZlKGhhKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiByZXNldCBhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAoaGEtPmZsYXNoX3N0YXRlICE9IFFMRkxBU0hfV0FJVElORykgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBhbm90aGVyIGZsYXNoIG9wZXJhdGlvbiAiCisJCQkgICAiYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gbGVhdmU7CisJfQorCisJaGEtPmZsYXNoX3N0YXRlID0gUUxGTEFTSF9XUklUSU5HOworCWxlbmd0aCA9IGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwlvZmZzZXQgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlvcHRpb25zID0gYnNnX3JlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMl07CisKKwlmbGFzaCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgbGVuZ3RoLCAmZmxhc2hfZG1hLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghZmxhc2gpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZG1hIGFsbG9jIGZhaWxlZCBmb3IgZmxhc2ggIgorCQkJICAgImRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FTk9NRU07CisJCWdvdG8gbGVhdmU7CisJfQorCisJc2dfY29weV90b19idWZmZXIoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCQkgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIGZsYXNoLCBsZW5ndGgpOworCisJcnZhbCA9IHFsYTR4eHhfc2V0X2ZsYXNoKGhhLCBmbGFzaF9kbWEsIG9mZnNldCwgbGVuZ3RoLCBvcHRpb25zKTsKKwlpZiAocnZhbCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBzZXQgZmxhc2ggZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlydmFsID0gLUVJTzsKKwl9IGVsc2UKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwlic2dfam9iX2RvbmUoYnNnX2pvYiwgYnNnX3JlcGx5LT5yZXN1bHQsCisJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW5ndGgsIGZsYXNoLCBmbGFzaF9kbWEpOworbGVhdmU6CisJaGEtPmZsYXNoX3N0YXRlID0gUUxGTEFTSF9XQUlUSU5HOworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE0eHh4X2dldF9hY2Jfc3RhdGUoc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChic2dfam9iKTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChob3N0KTsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcXVlc3QgKmJzZ19yZXEgPSBic2dfam9iLT5yZXF1ZXN0OworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKmJzZ19yZXBseSA9IGJzZ19qb2ItPnJlcGx5OworCXVpbnQzMl90IHN0YXR1c1tNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgYWNiX2lkeDsKKwl1aW50MzJfdCBpcF9pZHg7CisJaW50IHJ2YWwgPSAtRUlOVkFMOworCisJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkKKwkJZ290byBsZWF2ZTsKKworCS8qIE9ubHkgNDAyMiBhbmQgYWJvdmUgYWRhcHRlcnMgYXJlIHN1cHBvcnRlZCAqLworCWlmIChpc19xbGE0MDEwKGhhKSkKKwkJZ290byBsZWF2ZTsKKworCWlmIChxbDR4eHhfcmVzZXRfYWN0aXZlKGhhKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiByZXNldCBhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAoYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbiA8IHNpemVvZihzdGF0dXMpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGludmFsaWQgcGF5bG9hZCBsZW4gJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbik7CisJCXJ2YWwgPSAtRUlOVkFMOworCQlnb3RvIGxlYXZlOworCX0KKworCWFjYl9pZHggPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlpcF9pZHggPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsyXTsKKworCXJ2YWwgPSBxbGE0eHh4X2dldF9pcF9zdGF0ZShoYSwgYWNiX2lkeCwgaXBfaWR4LCBzdGF0dXMpOworCWlmIChydmFsKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGdldCBpcCBzdGF0ZSBmYWlsZWRcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlydmFsID0gLUVJTzsKKwl9IGVsc2UgeworCQlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9CisJCQlzZ19jb3B5X2Zyb21fYnVmZmVyKGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKKwkJCQkJICAgIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LAorCQkJCQkgICAgc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCX0KKworCWJzZ19qb2JfZG9uZShic2dfam9iLCBic2dfcmVwbHktPnJlc3VsdCwKKwkJICAgICBic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CitsZWF2ZToKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludAorcWxhNHh4eF9yZWFkX252cmFtKHN0cnVjdCBic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwl1aW50MzJfdCBvZmZzZXQgPSAwOworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDMyX3QgdG90YWxfbGVuID0gMDsKKwlkbWFfYWRkcl90IG52cmFtX2RtYTsKKwl1aW50OF90ICpudnJhbSA9IE5VTEw7CisJaW50IHJ2YWwgPSAtRUlOVkFMOworCisJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkKKwkJZ290byBsZWF2ZTsKKworCS8qIE9ubHkgNDB4eCBhZGFwdGVycyBhcmUgc3VwcG9ydGVkICovCisJaWYgKCEoaXNfcWxhNDAxMChoYSkgfHwgaXNfcWxhNDAyMihoYSkgfHwgaXNfcWxhNDAzMihoYSkpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCW9mZnNldCA9IGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzFdOworCWxlbiA9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQucGF5bG9hZF9sZW47CisJdG90YWxfbGVuID0gb2Zmc2V0ICsgbGVuOworCisJLyogdG90YWwgbGVuIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIG1heCBOVlJBTSBzaXplICovCisJaWYgKChpc19xbGE0MDEwKGhhKSAmJiB0b3RhbF9sZW4gPiBRTDQwMTBfTlZSQU1fU0laRSkgfHwKKwkgICAgKChpc19xbGE0MDIyKGhhKSB8fCBpc19xbGE0MDMyKGhhKSkgJiYKKwkgICAgIHRvdGFsX2xlbiA+IFFMNDBYMl9OVlJBTV9TSVpFKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBvZmZzZXQrbGVuIGdyZWF0ZXIgdGhhbiBtYXgiCisJCQkgICAiIG52cmFtIHNpemUsIG9mZnNldD0lZCBsZW49JWRcbiIsCisJCQkgICBfX2Z1bmNfXywgb2Zmc2V0LCBsZW4pOworCQlnb3RvIGxlYXZlOworCX0KKworCW52cmFtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW4sICZudnJhbV9kbWEsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFudnJhbSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBkbWEgYWxsb2MgZmFpbGVkIGZvciBudnJhbSAiCisJCQkgICAiZGF0YVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVOT01FTTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlydmFsID0gcWxhNHh4eF9nZXRfbnZyYW0oaGEsIG52cmFtX2RtYSwgb2Zmc2V0LCBsZW4pOworCWlmIChydmFsKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGdldCBudnJhbSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZSB7CisJCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KKwkJCXNnX2NvcHlfZnJvbV9idWZmZXIoYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCQkJCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCisJCQkJCSAgICBudnJhbSwgbGVuKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisJfQorCisJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkgICAgIGJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgbGVuLCBudnJhbSwgbnZyYW1fZG1hKTsKK2xlYXZlOgorCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE0eHh4X3VwZGF0ZV9udnJhbShzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqYnNnX3JlcSA9IGJzZ19qb2ItPnJlcXVlc3Q7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqYnNnX3JlcGx5ID0gYnNnX2pvYi0+cmVwbHk7CisJdWludDMyX3Qgb2Zmc2V0ID0gMDsKKwl1aW50MzJfdCBsZW4gPSAwOworCXVpbnQzMl90IHRvdGFsX2xlbiA9IDA7CisJZG1hX2FkZHJfdCBudnJhbV9kbWE7CisJdWludDhfdCAqbnZyYW0gPSBOVUxMOworCWludCBydmFsID0gLUVJTlZBTDsKKworCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKKworCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKGhhLT5wZGV2KSkpCisJCWdvdG8gbGVhdmU7CisKKwlpZiAoIShpc19xbGE0MDEwKGhhKSB8fCBpc19xbGE0MDIyKGhhKSB8fCBpc19xbGE0MDMyKGhhKSkpCisJCWdvdG8gbGVhdmU7CisKKwlpZiAocWw0eHh4X3Jlc2V0X2FjdGl2ZShoYSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogcmVzZXQgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUJVU1k7CisJCWdvdG8gbGVhdmU7CisJfQorCisJb2Zmc2V0ID0gYnNnX3JlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMV07CisJbGVuID0gYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuOworCXRvdGFsX2xlbiA9IG9mZnNldCArIGxlbjsKKworCS8qIHRvdGFsIGxlbiBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXggTlZSQU0gc2l6ZSAqLworCWlmICgoaXNfcWxhNDAxMChoYSkgJiYgdG90YWxfbGVuID4gUUw0MDEwX05WUkFNX1NJWkUpIHx8CisJICAgICgoaXNfcWxhNDAyMihoYSkgfHwgaXNfcWxhNDAzMihoYSkpICYmCisJICAgICB0b3RhbF9sZW4gPiBRTDQwWDJfTlZSQU1fU0laRSkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogb2Zmc2V0K2xlbiBncmVhdGVyIHRoYW4gbWF4IgorCQkJICAgIiBudnJhbSBzaXplLCBvZmZzZXQ9JWQgbGVuPSVkXG4iLAorCQkJICAgX19mdW5jX18sIG9mZnNldCwgbGVuKTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwludnJhbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgbGVuLCAmbnZyYW1fZG1hLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghbnZyYW0pIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZG1hIGFsbG9jIGZhaWxlZCBmb3IgZmxhc2ggIgorCQkJICAgImRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FTk9NRU07CisJCWdvdG8gbGVhdmU7CisJfQorCisJc2dfY29weV90b19idWZmZXIoYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCisJCQkgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIG52cmFtLCBsZW4pOworCisJcnZhbCA9IHFsYTR4eHhfc2V0X252cmFtKGhhLCBudnJhbV9kbWEsIG9mZnNldCwgbGVuKTsKKwlpZiAocnZhbCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBzZXQgbnZyYW0gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlydmFsID0gLUVJTzsKKwl9IGVsc2UKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CisKKwlic2dfam9iX2RvbmUoYnNnX2pvYiwgYnNnX3JlcGx5LT5yZXN1bHQsCisJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW4sIG52cmFtLCBudnJhbV9kbWEpOworbGVhdmU6CisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfcmVzdG9yZV9kZWZhdWx0cyhzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqYnNnX3JlcSA9IGJzZ19qb2ItPnJlcXVlc3Q7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqYnNnX3JlcGx5ID0gYnNnX2pvYi0+cmVwbHk7CisJdWludDMyX3QgcmVnaW9uID0gMDsKKwl1aW50MzJfdCBmaWVsZDAgPSAwOworCXVpbnQzMl90IGZpZWxkMSA9IDA7CisJaW50IHJ2YWwgPSAtRUlOVkFMOworCisJYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCisJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSkKKwkJZ290byBsZWF2ZTsKKworCWlmIChpc19xbGE0MDEwKGhhKSkKKwkJZ290byBsZWF2ZTsKKworCWlmIChxbDR4eHhfcmVzZXRfYWN0aXZlKGhhKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiByZXNldCBhY3RpdmVcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FQlVTWTsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlyZWdpb24gPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKKwlmaWVsZDAgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsyXTsKKwlmaWVsZDEgPSBic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFszXTsKKworCXJ2YWwgPSBxbGE0eHh4X3Jlc3RvcmVfZmFjdG9yeV9kZWZhdWx0cyhoYSwgcmVnaW9uLCBmaWVsZDAsIGZpZWxkMSk7CisJaWYgKHJ2YWwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogc2V0IG52cmFtIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlic2dfcmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJcnZhbCA9IC1FSU87CisJfSBlbHNlCisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCisJYnNnX2pvYl9kb25lKGJzZ19qb2IsIGJzZ19yZXBseS0+cmVzdWx0LAorCQkgICAgIGJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKTsKK2xlYXZlOgorCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50CitxbGE0eHh4X2JzZ19nZXRfYWNiKHN0cnVjdCBic2dfam9iICpic2dfam9iKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBpc2NzaV9qb2JfdG9fc2hvc3QoYnNnX2pvYik7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoaG9zdCk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgaXNjc2lfYnNnX3JlcGx5ICpic2dfcmVwbHkgPSBic2dfam9iLT5yZXBseTsKKwl1aW50MzJfdCBhY2JfdHlwZSA9IDA7CisJdWludDMyX3QgbGVuID0gMDsKKwlkbWFfYWRkcl90IGFjYl9kbWE7CisJdWludDhfdCAqYWNiID0gTlVMTDsKKwlpbnQgcnZhbCA9IC1FSU5WQUw7CisKKwlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisKKwlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpKQorCQlnb3RvIGxlYXZlOworCisJLyogT25seSA0MDIyIGFuZCBhYm92ZSBhZGFwdGVycyBhcmUgc3VwcG9ydGVkICovCisJaWYgKGlzX3FsYTQwMTAoaGEpKQorCQlnb3RvIGxlYXZlOworCisJaWYgKHFsNHh4eF9yZXNldF9hY3RpdmUoaGEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHJlc2V0IGFjdGl2ZVxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVCVVNZOworCQlnb3RvIGxlYXZlOworCX0KKworCWFjYl90eXBlID0gYnNnX3JlcS0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMV07CisJbGVuID0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5wYXlsb2FkX2xlbjsKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrKSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBpbnZhbGlkIGFjYiBsZW4gJWRcbiIsCisJCQkgICBfX2Z1bmNfXywgbGVuKTsKKwkJcnZhbCA9IC1FSU5WQUw7CisJCWdvdG8gbGVhdmU7CisJfQorCisJYWNiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBsZW4sICZhY2JfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjYikgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBkbWEgYWxsb2MgZmFpbGVkIGZvciBhY2IgIgorCQkJICAgImRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FTk9NRU07CisJCWdvdG8gbGVhdmU7CisJfQorCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2FjYihoYSwgYWNiX2RtYSwgYWNiX3R5cGUsIGxlbik7CisJaWYgKHJ2YWwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZ2V0IGFjYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJYnNnX3JlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCXJ2YWwgPSAtRUlPOworCX0gZWxzZSB7CisJCWJzZ19yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KKwkJCXNnX2NvcHlfZnJvbV9idWZmZXIoYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAorCQkJCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCisJCQkJCSAgICBhY2IsIGxlbik7CisJCWJzZ19yZXBseS0+cmVzdWx0ID0gRElEX09LIDw8IDE2OworCX0KKworCWJzZ19qb2JfZG9uZShic2dfam9iLCBic2dfcmVwbHktPnJlc3VsdCwKKwkJICAgICBic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGxlbiwgYWNiLCBhY2JfZG1hKTsKK2xlYXZlOgorCXJldHVybiBydmFsOworfQorCisvKioKKyAqIHFsYTR4eHhfcHJvY2Vzc192ZW5kb3Jfc3BlY2lmaWMgLSBoYW5kbGUgdmVuZG9yIHNwZWNpZmljIGJzZyByZXF1ZXN0CisgKiBAam9iOiBpc2NzaV9ic2dfam9iIHRvIGhhbmRsZQorICoqLworaW50IHFsYTR4eHhfcHJvY2Vzc192ZW5kb3Jfc3BlY2lmaWMoc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IGlzY3NpX2JzZ19yZXBseSAqYnNnX3JlcGx5ID0gYnNnX2pvYi0+cmVwbHk7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCisJc3dpdGNoIChic2dfcmVxLT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFswXSkgeworCWNhc2UgUUxJU0NTSV9WTkRfUkVBRF9GTEFTSDoKKwkJcmV0dXJuIHFsYTR4eHhfcmVhZF9mbGFzaChic2dfam9iKTsKKworCWNhc2UgUUxJU0NTSV9WTkRfVVBEQVRFX0ZMQVNIOgorCQlyZXR1cm4gcWxhNHh4eF91cGRhdGVfZmxhc2goYnNnX2pvYik7CisKKwljYXNlIFFMSVNDU0lfVk5EX0dFVF9BQ0JfU1RBVEU6CisJCXJldHVybiBxbGE0eHh4X2dldF9hY2Jfc3RhdGUoYnNnX2pvYik7CisKKwljYXNlIFFMSVNDU0lfVk5EX1JFQURfTlZSQU06CisJCXJldHVybiBxbGE0eHh4X3JlYWRfbnZyYW0oYnNnX2pvYik7CisKKwljYXNlIFFMSVNDU0lfVk5EX1VQREFURV9OVlJBTToKKwkJcmV0dXJuIHFsYTR4eHhfdXBkYXRlX252cmFtKGJzZ19qb2IpOworCisJY2FzZSBRTElTQ1NJX1ZORF9SRVNUT1JFX0RFRkFVTFRTOgorCQlyZXR1cm4gcWxhNHh4eF9yZXN0b3JlX2RlZmF1bHRzKGJzZ19qb2IpOworCisJY2FzZSBRTElTQ1NJX1ZORF9HRVRfQUNCOgorCQlyZXR1cm4gcWxhNHh4eF9ic2dfZ2V0X2FjYihic2dfam9iKTsKKworCWRlZmF1bHQ6CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGludmFsaWQgQlNHIHZlbmRvciBjb21tYW5kOiAiCisJCQkgICAiMHgleFxuIiwgX19mdW5jX18sIGJzZ19yZXEtPm1zZ2NvZGUpOworCQlic2dfcmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQlic2dfcmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CisJCWJzZ19qb2JfZG9uZShic2dfam9iLCBic2dfcmVwbHktPnJlc3VsdCwKKwkJCSAgICAgYnNnX3JlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKKy8qKgorICogcWxhNHh4eF9ic2dfcmVxdWVzdCAtIGhhbmRsZSBic2cgcmVxdWVzdCBmcm9tIElTQ1NJIHRyYW5zcG9ydAorICogQGpvYjogaXNjc2lfYnNnX2pvYiB0byBoYW5kbGUKKyAqLworaW50IHFsYTR4eHhfYnNnX3JlcXVlc3Qoc3RydWN0IGJzZ19qb2IgKmJzZ19qb2IpCit7CisJc3RydWN0IGlzY3NpX2JzZ19yZXF1ZXN0ICpic2dfcmVxID0gYnNnX2pvYi0+cmVxdWVzdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaXNjc2lfam9iX3RvX3Nob3N0KGJzZ19qb2IpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KGhvc3QpOworCisJc3dpdGNoIChic2dfcmVxLT5tc2djb2RlKSB7CisJY2FzZSBJU0NTSV9CU0dfSFNUX1ZFTkRPUjoKKwkJcmV0dXJuIHFsYTR4eHhfcHJvY2Vzc192ZW5kb3Jfc3BlY2lmaWMoYnNnX2pvYik7CisKKwlkZWZhdWx0OgorCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBpbnZhbGlkIEJTRyBjb21tYW5kOiAweCV4XG4iLAorCQkJICAgX19mdW5jX18sIGJzZ19yZXEtPm1zZ2NvZGUpOworCX0KKworCXJldHVybiAtRU5PU1lTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTAzNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2JzZy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBRTG9naWMgaVNDU0kgSEJBIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDExIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19RTDRfQlNHX0gKKyNkZWZpbmUgX19RTDRfQlNHX0gKKworLyogQlNHIFZlbmRvciBzcGVjaWZpYyBjb21tYW5kcyAqLworI2RlZmluZSBRTElTQ1NJX1ZORF9SRUFEX0ZMQVNICQkxCisjZGVmaW5lIFFMSVNDU0lfVk5EX1VQREFURV9GTEFTSAkyCisjZGVmaW5lIFFMSVNDU0lfVk5EX0dFVF9BQ0JfU1RBVEUJMworI2RlZmluZSBRTElTQ1NJX1ZORF9SRUFEX05WUkFNCQk0CisjZGVmaW5lIFFMSVNDU0lfVk5EX1VQREFURV9OVlJBTQk1CisjZGVmaW5lIFFMSVNDU0lfVk5EX1JFU1RPUkVfREVGQVVMVFMJNgorI2RlZmluZSBRTElTQ1NJX1ZORF9HRVRfQUNCCQk3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCmluZGV4IDQ3M2M1YzguLmFjZTYzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Flci5oPgorI2luY2x1ZGUgPGxpbnV4L2JzZy1saWIuaD4KIAogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTMzLDkgKzM0LDE0IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ic2dfaXNjc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfbmV0bGluay5oPgorI2luY2x1ZGUgPHNjc2kvbGliaXNjc2kuaD4KIAogI2luY2x1ZGUgInFsNF9kYmcuaCIKICNpbmNsdWRlICJxbDRfbnguaCIKKyNpbmNsdWRlICJxbDRfZncuaCIKKyNpbmNsdWRlICJxbDRfbnZyYW0uaCIKIAogI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDEwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDQwMTAJMHg0MDEwCkBAIC0xMDksNyArMTE1LDcgQEAKICNkZWZpbmUgTUFYX0JVU0VTCQkxCiAjZGVmaW5lIE1BWF9UQVJHRVRTCQlNQVhfREVWX0RCX0VOVFJJRVMKICNkZWZpbmUgTUFYX0xVTlMJCTB4ZmZmZgotI2RlZmluZSBNQVhfQUVOX0VOVFJJRVMJCTI1NiAvKiBzaG91bGQgYmUgPiBFWFRfREVGX01BWF9BRU5fUVVFVUUgKi8KKyNkZWZpbmUgTUFYX0FFTl9FTlRSSUVTCQlNQVhfREVWX0RCX0VOVFJJRVMKICNkZWZpbmUgTUFYX0REQl9FTlRSSUVTCQlNQVhfREVWX0RCX0VOVFJJRVMKICNkZWZpbmUgTUFYX1BEVV9FTlRSSUVTCQkzMgogI2RlZmluZSBJTlZBTElEX0VOVFJZCQkweEZGRkYKQEAgLTE2Niw2ICsxNzIsNyBAQAogI2RlZmluZSBSRUxPR0lOX1RPVgkJCTE4CiAjZGVmaW5lIElTTlNfREVSRUdfVE9WCQkJNQogI2RlZmluZSBIQkFfT05MSU5FX1RPVgkJCTMwCisjZGVmaW5lIERJU0FCTEVfQUNCX1RPVgkJCTMwCiAKICNkZWZpbmUgTUFYX1JFU0VUX0hBX1JFVFJJRVMJCTIKIApAQCAtMjI3LDUyICsyMzQsMTIgQEAKICAqIERldmljZSBEYXRhYmFzZSAoRERCKSBzdHJ1Y3R1cmUKICAqLwogc3RydWN0IGRkYl9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBkZGIgbGlzdCAqLwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3M7CiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogCi0JYXRvbWljX3Qgc3RhdGU7CQkvKiBEREIgU3RhdGUgKi8KLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIEREQiBGbGFncyAqLwotCiAJdWludDE2X3QgZndfZGRiX2luZGV4OwkvKiBEREIgZmlybXdhcmUgaW5kZXggKi8KLQl1aW50MTZfdCBvcHRpb25zOwogCXVpbnQzMl90IGZ3X2RkYl9kZXZpY2Vfc3RhdGU7IC8qIEYvVyBEZXZpY2UgU3RhdGUgIC0tIHNlZSBxbDRfZncuaCAqLwotCi0JdWludDMyX3QgQ21kU247Ci0JdWludDE2X3QgdGFyZ2V0X3Nlc3Npb25faWQ7Ci0JdWludDE2X3QgY29ubmVjdGlvbl9pZDsKLQl1aW50MTZfdCBleGVfdGhyb3R0bGU7CS8qIE1heCBtdW1iZXIgb2YgY21kcyBvdXRzdGFuZGluZwotCQkJCSAqIHNpbXVsdGFuZW91c2x5ICovCi0JdWludDE2X3QgdGFza19tZ210X3RpbWVvdXQ7IC8qIE1pbiB0aW1lIGZvciB0YXNrIG1nbXQgY21kcyB0bwotCQkJCSAgICAgKiBjb21wbGV0ZSAqLwotCXVpbnQxNl90IGRlZmF1bHRfcmVsb2dpbl90aW1lb3V0OyAvKiAgTWF4IHRpbWUgdG8gd2FpdCBmb3IKLQkJCQkJICAgKiAgcmVsb2dpbiB0byBjb21wbGV0ZSAqLwotCXVpbnQxNl90IHRjcF9zb3VyY2VfcG9ydF9udW07Ci0JdWludDMyX3QgZGVmYXVsdF90aW1lMndhaXQ7IC8qIERlZmF1bHQgTWluIHRpbWUgYmV0d2VlbgotCQkJCSAgICAgKiByZWxvZ2lucyAoK2FlbnMpICovCi0KLQlhdG9taWNfdCByZXRyeV9yZWxvZ2luX3RpbWVyOyAvKiBNaW4gVGltZSBiZXR3ZWVuIHJlbG9naW5zCi0JCQkJICAgICAgICogKDQwMDAgb25seSkgKi8KLQlhdG9taWNfdCByZWxvZ2luX3RpbWVyOwkvKiBNYXggVGltZSB0byB3YWl0IGZvciByZWxvZ2luIHRvIGNvbXBsZXRlICovCi0JYXRvbWljX3QgcmVsb2dpbl9yZXRyeV9jb3VudDsgLyogTnVtIG9mIHRpbWVzIHJlbG9naW4gaGFzIGJlZW4KLQkJCQkgICAgICAgKiByZXRyaWVkICovCi0KLQl1aW50MTZfdCBwb3J0OwotCXVpbnQzMl90IHRwZ3Q7Ci0JdWludDhfdCBpcF9hZGRyW0lQX0FERFJfTEVOXTsKLQl1aW50OF90IGlzY3NpX25hbWVbSVNDU0lfTkFNRV9TSVpFXTsJLyogNzIgeDQ4ICovCi0JdWludDhfdCBpc2NzaV9hbGlhc1sweDIwXTsKLQl1aW50OF90IGlzaWRbNl07Ci0JdWludDE2X3QgaXNjc2lfbWF4X2J1cnN0X2xlbjsKLQl1aW50MTZfdCBpc2NzaV9tYXhfb3V0c25kX3IydDsKLQl1aW50MTZfdCBpc2NzaV9maXJzdF9idXJzdF9sZW47Ci0JdWludDE2X3QgaXNjc2lfbWF4X3Jjdl9kYXRhX3NlZ19sZW47Ci0JdWludDE2X3QgaXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW47Ci0KLQlzdHJ1Y3QgaW42X2FkZHIgcmVtb3RlX2lwdjZfYWRkcjsKLQlzdHJ1Y3QgaW42X2FkZHIgbGlua19sb2NhbF9pcHY2X2FkZHI7CiB9OwogCiAvKgpAQCAtMjkzLDggKzI2MCw2IEBACiAjZGVmaW5lIERGX0ZPX01BU0tFRAkJMwogCiAKLSNpbmNsdWRlICJxbDRfZncuaCIKLSNpbmNsdWRlICJxbDRfbnZyYW0uaCIKIAogc3RydWN0IHFsODJ4eF9od19kYXRhIHsKIAkvKiBPZmZzZXRzIGZvciBmbGFzaC9udnJhbSBhY2Nlc3MgKHNldCB0byB+MCBpZiBub3QgdXNlZCkuICovCkBAIC0zMTIsNyArMjc3LDEwIEBACiAJdWludDMyX3QgZmx0X3JlZ2lvbl9ib290OwogCXVpbnQzMl90IGZsdF9yZWdpb25fYm9vdGxvYWQ7CiAJdWludDMyX3QgZmx0X3JlZ2lvbl9mdzsKLQl1aW50MzJfdCByZXNlcnZlZDsKKworCXVpbnQzMl90IGZsdF9pc2NzaV9wYXJhbTsKKwl1aW50MzJfdCBmbHRfcmVnaW9uX2NoYXA7CisJdWludDMyX3QgZmx0X2NoYXBfc2l6ZTsKIH07CiAKIHN0cnVjdCBxbGE0Xzh4eHhfbGVnYWN5X2ludHJfc2V0IHsKQEAgLTM1Nyw2ICszMjUsNjggQEAKIAlpbnQgKCpnZXRfc3lzX2luZm8pIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIH07CiAKKy8qcWxhNHh4eCBpcGFkZHJlc3MgY29uZmlndXJhdGlvbiBkZXRhaWxzICovCitzdHJ1Y3QgaXBhZGRyZXNzX2NvbmZpZyB7CisJdWludDE2X3QgaXB2NF9vcHRpb25zOworCXVpbnQxNl90IHRjcF9vcHRpb25zOworCXVpbnQxNl90IGlwdjRfdmxhbl90YWc7CisJdWludDhfdCBpcHY0X2FkZHJfc3RhdGU7CisJdWludDhfdCBpcF9hZGRyZXNzW0lQX0FERFJfTEVOXTsKKwl1aW50OF90IHN1Ym5ldF9tYXNrW0lQX0FERFJfTEVOXTsKKwl1aW50OF90IGdhdGV3YXlbSVBfQUREUl9MRU5dOworCXVpbnQzMl90IGlwdjZfb3B0aW9uczsKKwl1aW50MzJfdCBpcHY2X2FkZGxfb3B0aW9uczsKKwl1aW50OF90IGlwdjZfbGlua19sb2NhbF9zdGF0ZTsKKwl1aW50OF90IGlwdjZfYWRkcjBfc3RhdGU7CisJdWludDhfdCBpcHY2X2FkZHIxX3N0YXRlOworCXVpbnQ4X3QgaXB2Nl9kZWZhdWx0X3JvdXRlcl9zdGF0ZTsKKwl1aW50MTZfdCBpcHY2X3ZsYW5fdGFnOworCXN0cnVjdCBpbjZfYWRkciBpcHY2X2xpbmtfbG9jYWxfYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9hZGRyMDsKKwlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9hZGRyMTsKKwlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyOworCXVpbnQxNl90IGV0aF9tdHVfc2l6ZTsKKwl1aW50MTZfdCBpcHY0X3BvcnQ7CisJdWludDE2X3QgaXB2Nl9wb3J0OworfTsKKworI2RlZmluZSBRTDRfQ0hBUF9NQVhfTkFNRV9MRU4gMjU2CisjZGVmaW5lIFFMNF9DSEFQX01BWF9TRUNSRVRfTEVOIDEwMAorI2RlZmluZSBMT0NBTF9DSEFQCTAKKyNkZWZpbmUgQklESV9DSEFQCTEKKworc3RydWN0IHFsNF9jaGFwX2Zvcm1hdCB7CisJdTggIGludHJfY2hhcF9uYW1lW1FMNF9DSEFQX01BWF9OQU1FX0xFTl07CisJdTggIGludHJfc2VjcmV0W1FMNF9DSEFQX01BWF9TRUNSRVRfTEVOXTsKKwl1OCAgdGFyZ2V0X2NoYXBfbmFtZVtRTDRfQ0hBUF9NQVhfTkFNRV9MRU5dOworCXU4ICB0YXJnZXRfc2VjcmV0W1FMNF9DSEFQX01BWF9TRUNSRVRfTEVOXTsKKwl1MTYgaW50cl9jaGFwX25hbWVfbGVuZ3RoOworCXUxNiBpbnRyX3NlY3JldF9sZW5ndGg7CisJdTE2IHRhcmdldF9jaGFwX25hbWVfbGVuZ3RoOworCXUxNiB0YXJnZXRfc2VjcmV0X2xlbmd0aDsKK307CisKK3N0cnVjdCBpcF9hZGRyZXNzX2Zvcm1hdCB7CisJdTggaXBfdHlwZTsKKwl1OCBpcF9hZGRyZXNzWzE2XTsKK307CisKK3N0cnVjdAlxbDRfY29ubl9pbmZvIHsKKwl1MTYJZGVzdF9wb3J0OworCXN0cnVjdAlpcF9hZGRyZXNzX2Zvcm1hdCBkZXN0X2lwYWRkcjsKKwlzdHJ1Y3QJcWw0X2NoYXBfZm9ybWF0IGNoYXA7Cit9OworCitzdHJ1Y3QgcWw0X2Jvb3Rfc2Vzc2lvbl9pbmZvIHsKKwl1OAl0YXJnZXRfbmFtZVsyMjRdOworCXN0cnVjdAlxbDRfY29ubl9pbmZvIGNvbm5fbGlzdFsxXTsKK307CisKK3N0cnVjdCBxbDRfYm9vdF90Z3RfaW5mbyB7CisJc3RydWN0IHFsNF9ib290X3Nlc3Npb25faW5mbyBib290X3ByaV9zZXNzOworCXN0cnVjdCBxbDRfYm9vdF9zZXNzaW9uX2luZm8gYm9vdF9zZWNfc2VzczsKK307CisKIC8qCiAgKiBMaW51eCBIb3N0IEFkYXB0ZXIgc3RydWN0dXJlCiAgKi8KQEAgLTQ1MSwxMCArNDgxLDYgQEAKIAkvKiAtLS0gRnJvbSBJbml0X0ZXIC0tLSAqLwogCS8qIGluaXRfY2JfdCAqaW5pdF9jYjsgKi8KIAl1aW50MTZfdCBmaXJtd2FyZV9vcHRpb25zOwotCXVpbnQxNl90IHRjcF9vcHRpb25zOwotCXVpbnQ4X3QgaXBfYWRkcmVzc1tJUF9BRERSX0xFTl07Ci0JdWludDhfdCBzdWJuZXRfbWFza1tJUF9BRERSX0xFTl07Ci0JdWludDhfdCBnYXRld2F5W0lQX0FERFJfTEVOXTsKIAl1aW50OF90IGFsaWFzWzMyXTsKIAl1aW50OF90IG5hbWVfc3RyaW5nWzI1Nl07CiAJdWludDhfdCBoZWFydGJlYXRfaW50ZXJ2YWw7CkBAIC00NjIsNyArNDg4LDcgQEAKIAkvKiAtLS0gRnJvbSBGbGFzaFN5c0luZm8gLS0tICovCiAJdWludDhfdCBteV9tYWNbTUFDX0FERFJfTEVOXTsKIAl1aW50OF90IHNlcmlhbF9udW1iZXJbMTZdOwotCisJdWludDE2X3QgcG9ydF9udW07CiAJLyogLS0tIEZyb20gR2V0RndTdGF0ZSAtLS0gKi8KIAl1aW50MzJfdCBmaXJtd2FyZV9zdGF0ZTsKIAl1aW50MzJfdCBhZGRsX2Z3X3N0YXRlOwpAQCAtNTI0LDMxICs1NTAsMTMgQEAKIAl2b2xhdGlsZSB1aW50OF90IG1ib3hfc3RhdHVzX2NvdW50OwogCXZvbGF0aWxlIHVpbnQzMl90IG1ib3hfc3RhdHVzW01CT1hfUkVHX0NPVU5UXTsKIAotCS8qIGxvY2FsIGRldmljZSBkYXRhYmFzZSBsaXN0IChjb250YWlucyBpbnRlcm5hbCBkZGIgZW50cmllcykgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGRkYl9saXN0OwotCi0JLyogTWFwIGRkYl9saXN0IGVudHJ5IGJ5IEZXIGRkYiBpbmRleCAqLworCS8qIEZXIGRkYiBpbmRleCBtYXAgKi8KIAlzdHJ1Y3QgZGRiX2VudHJ5ICpmd19kZGJfaW5kZXhfbWFwW01BWF9EREJfRU5UUklFU107CiAKIAkvKiBTYXZlZCBzcmIgZm9yIHN0YXR1cyBjb250aW51YXRpb24gZW50cnkgcHJvY2Vzc2luZyAqLwogCXN0cnVjdCBzcmIgKnN0YXR1c19zcmI7CiAKLQkvKiBJUHY2IHN1cHBvcnQgaW5mbyBmcm9tIEluaXRGVyAqLwogCXVpbnQ4X3QgYWNiX3ZlcnNpb247Ci0JdWludDhfdCBpcHY0X2FkZHJfc3RhdGU7Ci0JdWludDE2X3QgaXB2NF9vcHRpb25zOwotCi0JdWludDMyX3QgcmVzdmQyOwotCXVpbnQzMl90IGlwdjZfb3B0aW9uczsKLQl1aW50MzJfdCBpcHY2X2FkZGxfb3B0aW9uczsKLQl1aW50OF90IGlwdjZfbGlua19sb2NhbF9zdGF0ZTsKLQl1aW50OF90IGlwdjZfYWRkcjBfc3RhdGU7Ci0JdWludDhfdCBpcHY2X2FkZHIxX3N0YXRlOwotCXVpbnQ4X3QgaXB2Nl9kZWZhdWx0X3JvdXRlcl9zdGF0ZTsKLQlzdHJ1Y3QgaW42X2FkZHIgaXB2Nl9saW5rX2xvY2FsX2FkZHI7Ci0Jc3RydWN0IGluNl9hZGRyIGlwdjZfYWRkcjA7Ci0Jc3RydWN0IGluNl9hZGRyIGlwdjZfYWRkcjE7Ci0Jc3RydWN0IGluNl9hZGRyIGlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkcjsKIAogCS8qIHFsYTgyeHggc3BlY2lmaWMgZmllbGRzICovCiAJc3RydWN0IGRldmljZV9yZWdfODJ4eCAgX19pb21lbSAqcWxhNF84eHh4X3JlZzsgLyogQmFzZSBJL08gYWRkcmVzcyAqLwpAQCAtNTg0LDYgKzU5MiwxMSBAQAogCiAJc3RydWN0IGNvbXBsZXRpb24gbWJ4X2ludHJfY29tcDsKIAorCXN0cnVjdCBpcGFkZHJlc3NfY29uZmlnIGlwX2NvbmZpZzsKKwlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlX2lwdjQ7CisJc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZV9pcHY2XzA7CisJc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZV9pcHY2XzE7CisKIAkvKiAtLS0gRnJvbSBBYm91dCBGaXJtd2FyZSAtLS0gKi8KIAl1aW50MTZfdCBpc2NzaV9tYWpvcjsKIAl1aW50MTZfdCBpc2NzaV9taW5vcjsKQEAgLTU5MSwxNiArNjA0LDYwIEBACiAJdWludDE2X3QgYm9vdGxvYWRfbWlub3I7CiAJdWludDE2X3QgYm9vdGxvYWRfcGF0Y2g7CiAJdWludDE2X3QgYm9vdGxvYWRfYnVpbGQ7CisKKwl1aW50MzJfdCBmbGFzaF9zdGF0ZTsKKyNkZWZpbmUJUUxGTEFTSF9XQUlUSU5HCQkwCisjZGVmaW5lCVFMRkxBU0hfUkVBRElORwkJMQorI2RlZmluZQlRTEZMQVNIX1dSSVRJTkcJCTIKKwlzdHJ1Y3QgZG1hX3Bvb2wgKmNoYXBfZG1hX3Bvb2w7CisJdWludDhfdCAqY2hhcF9saXN0OyAvKiBDSEFQIHRhYmxlIGNhY2hlICovCisJc3RydWN0IG11dGV4ICBjaGFwX3NlbTsKKyNkZWZpbmUgQ0hBUF9ETUFfQkxPQ0tfU0laRSAgICA1MTIKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGFza193cTsKKwl1bnNpZ25lZCBsb25nIGRkYl9pZHhfbWFwW01BWF9EREJfRU5UUklFUyAvIEJJVFNfUEVSX0xPTkddOworI2RlZmluZSBTWVNGU19GTEFHX0ZXX1NFTF9CT09UIDIKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rc2V0ICpib290X2tzZXQ7CisJc3RydWN0IHFsNF9ib290X3RndF9pbmZvIGJvb3RfdGd0OworCXVpbnQxNl90IHBoeV9wb3J0X251bTsKKwl1aW50MTZfdCBwaHlfcG9ydF9jbnQ7CisJdWludDE2X3QgaXNjc2lfcGNpX2Z1bmNfY250OworCXVpbnQ4X3QgbW9kZWxfbmFtZVsxNl07CisJc3RydWN0IGNvbXBsZXRpb24gZGlzYWJsZV9hY2JfY29tcDsKK307CisKK3N0cnVjdCBxbDRfdGFza19kYXRhIHsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJdWludDhfdCBpb2NiX3JlcV9jbnQ7CisJZG1hX2FkZHJfdCBkYXRhX2RtYTsKKwl2b2lkICpyZXFfYnVmZmVyOworCWRtYV9hZGRyX3QgcmVxX2RtYTsKKwl1aW50MzJfdCByZXFfbGVuOworCXZvaWQgKnJlc3BfYnVmZmVyOworCWRtYV9hZGRyX3QgcmVzcF9kbWE7CisJdWludDMyX3QgcmVzcF9sZW47CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisJc3RydWN0IHBhc3N0aHJ1X3N0YXR1cyBzdHM7CisJc3RydWN0IHdvcmtfc3RydWN0IHRhc2tfd29yazsKK307CisKK3N0cnVjdCBxbGFfZW5kcG9pbnQgeworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHNvY2thZGRyIGRzdF9hZGRyOworfTsKKworc3RydWN0IHFsYV9jb25uIHsKKwlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXA7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBpc19pcHY0X2VuYWJsZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCXJldHVybiAoKGhhLT5pcHY0X29wdGlvbnMgJiBJUE9QVF9JUHY0X1BST1RPQ09MX0VOQUJMRSkgIT0gMCk7CisJcmV0dXJuICgoaGEtPmlwX2NvbmZpZy5pcHY0X29wdGlvbnMgJiBJUE9QVF9JUFY0X1BST1RPQ09MX0VOQUJMRSkgIT0gMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2lwdjZfZW5hYmxlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JcmV0dXJuICgoaGEtPmlwdjZfb3B0aW9ucyAmIElQVjZfT1BUX0lQVjZfUFJPVE9DT0xfRU5BQkxFKSAhPSAwKTsKKwlyZXR1cm4gKChoYS0+aXBfY29uZmlnLmlwdjZfb3B0aW9ucyAmCisJCUlQVjZfT1BUX0lQVjZfUFJPVE9DT0xfRU5BQkxFKSAhPSAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXNfcWxhNDAxMChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCkBAIC02MTgsNiArNjc1LDExIEBACiAJcmV0dXJuIGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAzMjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfcWxhNDBYWChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcmV0dXJuIGlzX3FsYTQwMzIoaGEpIHx8IGlzX3FsYTQwMjIoaGEpIHx8IGlzX3FsYTQwMTAoaGEpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19xbGE4MDIyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlyZXR1cm4gaGEtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDIyOwpAQCAtNjQwLDcgKzcwMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfcWxhX2hvc3QqIHRvX3FsYV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXJldHVybiAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKilzaG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKWlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtKiBpc3Bfc2VtYXBob3JlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKQEAgLTc2MCw2ICs4MjIsMTYgQEAKIAkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDIyX0RSVlJfU0VNX01BU0spOwogfQogCitzdGF0aWMgaW5saW5lIGludCBxbDR4eHhfcmVzZXRfYWN0aXZlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoRFBDX1JFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICAgIHRlc3RfYml0KERQQ19SRVRSWV9SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncykgfHwKKwkgICAgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0hBX0ZXX0NPTlRFWFQsICZoYS0+ZHBjX2ZsYWdzKSB8fAorCSAgICAgICB0ZXN0X2JpdChEUENfSEFfVU5SRUNPVkVSQUJMRSwgJmhhLT5kcGNfZmxhZ3MpOworCit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIERlZmluZXMgZm9yIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKCkgYW5kIHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKaW5kZXggMDEwODJhYS4uY2JkNWEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKQEAgLTE0Niw2ICsxNDYsMTMgQEAKICNkZWZpbmUgUUw0MDIyX05WUkFNX1NFTV9NQVNLCShRTDQwMjJfUkVTT1VSQ0VfTUFTS19CQVNFX0NPREUgPDwgKDEwKzE2KSkKICNkZWZpbmUgUUw0MDIyX0ZMQVNIX1NFTV9NQVNLCShRTDQwMjJfUkVTT1VSQ0VfTUFTS19CQVNFX0NPREUgPDwgKDEzKzE2KSkKIAorLyogbnZyYW0gYWRkcmVzcyBmb3IgNDAzMiAqLworI2RlZmluZSBOVlJBTV9QT1JUMF9CT09UX01PREUJCTB4MDNiMQorI2RlZmluZSBOVlJBTV9QT1JUMF9CT09UX1BSSV9UR1QJMHgwM2IyCisjZGVmaW5lIE5WUkFNX1BPUlQwX0JPT1RfU0VDX1RHVAkweDAzYmIKKyNkZWZpbmUgTlZSQU1fUE9SVDFfQk9PVF9NT0RFCQkweDA3YjEKKyNkZWZpbmUgTlZSQU1fUE9SVDFfQk9PVF9QUklfVEdUCTB4MDdiMgorI2RlZmluZSBOVlJBTV9QT1JUMV9CT09UX1NFQ19UR1QJMHgwN2JiCiAKIAogLyogUGFnZSAjIGRlZmluZXMgZm9yIDQwMjIgKi8KQEAgLTE5NCw2ICsyMDEsOSBAQAogLyogSVNQIDQwMjIgbnZyYW0gZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTlZSX1dSSVRFX0VOQUJMRQkJCTB4MDAwMDAwMTAJLyogNDAyMiAqLwogCisjZGVmaW5lIFFMNDAxMF9OVlJBTV9TSVpFCQkJMHgyMDAKKyNkZWZpbmUgUUw0MFgyX05WUkFNX1NJWkUJCQkweDgwMAorCiAvKiAgSVNQIHBvcnRfc3RhdHVzIGRlZmluaXRpb25zICovCiAKIC8qICBJU1AgU2VtYXBob3JlIGRlZmluaXRpb25zICovCkBAIC0yNDEsNiArMjUxLDggQEAKICNkZWZpbmUgRkFfQk9PVF9DT0RFX0FERFJfODIJCTB4MjAwMDAKICNkZWZpbmUgRkFfUklTQ19DT0RFX0FERFJfODIJCTB4NDAwMDAKICNkZWZpbmUgRkFfR09MRF9SSVNDX0NPREVfQUREUl84MgkweDgwMDAwCisjZGVmaW5lIEZBX0ZMQVNIX0lTQ1NJX0NIQVAJCTB4NTQwMDAwCisjZGVmaW5lIEZBX0ZMQVNIX0NIQVBfU0laRQkJMHhDMDAwMAogCiAvKiBGbGFzaCBEZXNjcmlwdGlvbiBUYWJsZSAqLwogc3RydWN0IHFsYV9mZHRfbGF5b3V0IHsKQEAgLTI5Niw4ICszMDgsMTEgQEAKICNkZWZpbmUgRkxUX1JFR19GTFQJCTB4MWMKICNkZWZpbmUgRkxUX1JFR19CT09UTE9BRF84MgkweDcyCiAjZGVmaW5lIEZMVF9SRUdfRldfODIJCTB4NzQKKyNkZWZpbmUgRkxUX1JFR19GV184Ml8xCQkweDk3CiAjZGVmaW5lIEZMVF9SRUdfR09MRF9GV184MgkweDc1CiAjZGVmaW5lIEZMVF9SRUdfQk9PVF9DT0RFXzgyCTB4NzgKKyNkZWZpbmUgRkxUX1JFR19JU0NTSV9QQVJBTQkweDY1CisjZGVmaW5lIEZMVF9SRUdfSVNDU0lfQ0hBUAkweDYzCiAKIHN0cnVjdCBxbGFfZmx0X3JlZ2lvbiB7CiAJdWludDMyX3QgY29kZTsKQEAgLTMzMSw5ICszNDYsMTEgQEAKICNkZWZpbmUgTUJPWF9DTURfV1JJVEVfRkxBU0gJCQkweDAwMjUKICNkZWZpbmUgTUJPWF9DTURfUkVBRF9GTEFTSAkJCTB4MDAyNgogI2RlZmluZSBNQk9YX0NNRF9DTEVBUl9EQVRBQkFTRV9FTlRSWQkJMHgwMDMxCisjZGVmaW5lIE1CT1hfQ01EX0NPTk5fT1BFTgkJCTB4MDA3NAogI2RlZmluZSBNQk9YX0NNRF9DT05OX0NMT1NFX1NFU1NfTE9HT1VUCQkweDAwNTYKLSNkZWZpbmUgTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OCQkweDAxCi0jZGVmaW5lIExPR09VVF9PUFRJT05fUkVMT0dJTgkJCTB4MDIKKyNkZWZpbmUgTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OCQkweDAwMDIKKyNkZWZpbmUgTE9HT1VUX09QVElPTl9SRUxPR0lOCQkJMHgwMDA0CisjZGVmaW5lIExPR09VVF9PUFRJT05fRlJFRV9EREIJCQkweDAwMDgKICNkZWZpbmUgTUJPWF9DTURfRVhFQ1VURV9JT0NCX0E2NAkJMHgwMDVBCiAjZGVmaW5lIE1CT1hfQ01EX0lOSVRJQUxJWkVfRklSTVdBUkUJCTB4MDA2MAogI2RlZmluZSBNQk9YX0NNRF9HRVRfSU5JVF9GV19DVFJMX0JMT0NLCQkweDAwNjEKQEAgLTM0MiwxMiArMzU5LDE1IEBACiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9EQVRBQkFTRV9FTlRSWQkJMHgwMDY0CiAjZGVmaW5lIEREQl9EU19VTkFTU0lHTkVECQkJMHgwMAogI2RlZmluZSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkUJCTB4MDEKKyNkZWZpbmUgRERCX0RTX0RJU0NPVkVSWQkJCTB4MDIKICNkZWZpbmUgRERCX0RTX1NFU1NJT05fQUNUSVZFCQkJMHgwNAogI2RlZmluZSBEREJfRFNfU0VTU0lPTl9GQUlMRUQJCQkweDA2CiAjZGVmaW5lIEREQl9EU19MT0dJTl9JTl9QUk9DRVNTCQkJMHgwNwogI2RlZmluZSBNQk9YX0NNRF9HRVRfRldfU1RBVEUJCQkweDAwNjkKICNkZWZpbmUgTUJPWF9DTURfR0VUX0lOSVRfRldfQ1RSTF9CTE9DS19ERUZBVUxUUyAweDAwNkEKICNkZWZpbmUgTUJPWF9DTURfR0VUX1NZU19JTkZPCQkJMHgwMDc4CisjZGVmaW5lIE1CT1hfQ01EX0dFVF9OVlJBTQkJCTB4MDA3OAkvKiBGb3IgNDB4eCAqLworI2RlZmluZSBNQk9YX0NNRF9TRVRfTlZSQU0JCQkweDAwNzkJLyogRm9yIDQweHggKi8KICNkZWZpbmUgTUJPWF9DTURfUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTCTB4MDA4NwogI2RlZmluZSBNQk9YX0NNRF9TRVRfQUNCCQkJMHgwMDg4CiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9BQ0IJCQkweDAwODkKQEAgLTM3NSw3ICszOTUsMTAgQEAKICNkZWZpbmUgRldfQUREU1RBVEVfREhDUHY0X0xFQVNFX0VYUElSRUQJMHgwMDA4CiAjZGVmaW5lIEZXX0FERFNUQVRFX0xJTktfVVAJCQkweDAwMTAKICNkZWZpbmUgRldfQUREU1RBVEVfSVNOU19TVkNfRU5BQkxFRAkJMHgwMDIwCisKICNkZWZpbmUgTUJPWF9DTURfR0VUX0RBVEFCQVNFX0VOVFJZX0RFRkFVTFRTCTB4MDA2QgorI2RlZmluZSBJUFY2X0RFRkFVTFRfRERCX0VOVFJZCQkJMHgwMDAxCisKICNkZWZpbmUgTUJPWF9DTURfQ09OTl9PUEVOX1NFU1NfTE9HSU4JCTB4MDA3NAogI2RlZmluZSBNQk9YX0NNRF9HRVRfQ1JBU0hfUkVDT1JECQkweDAwNzYJLyogNDAxMCBvbmx5ICovCiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9DT05OX0VWRU5UX0xPRwkJMHgwMDc3CkBAIC00MzQsNiArNDU3LDE0IEBACiAjZGVmaW5lIEFDQl9TVEFURV9WQUxJRAkJMHgwNQogI2RlZmluZSBBQ0JfU1RBVEVfRElTQUJMSU5HCTB4MDYKIAorLyogRkxBU0ggb2Zmc2V0cyAqLworI2RlZmluZSBGTEFTSF9TRUdNRU5UX0lGQ0IJMHgwNDAwMDAwMAorCisjZGVmaW5lIEZMQVNIX09QVF9STVdfSE9MRAkwCisjZGVmaW5lIEZMQVNIX09QVF9STVdfSU5JVAkxCisjZGVmaW5lIEZMQVNIX09QVF9DT01NSVQJMgorI2RlZmluZSBGTEFTSF9PUFRfUk1XX0NPTU1JVAkzCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBIb3N0IEFkYXB0ZXIgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBCbG9jayAoZnJvbSBob3N0KSAqLwpAQCAtNDU1LDcgKzQ4Niw4IEBACiAJdWludDhfdCByZXMwOwkvKiAwNyAqLwogCXVpbnQxNl90IGV0aF9tdHVfc2l6ZTsJLyogMDgtMDkgKi8KIAl1aW50MTZfdCBhZGRfZndfb3B0aW9uczsJLyogMEEtMEIgKi8KLSNkZWZpbmUgU0VSSUFMSVpFX1RBU0tfTUdNVAkJMHgwNDAwCisjZGVmaW5lIEFERldPUFRfU0VSSUFMSVpFX1RBU0tfTUdNVAkweDA0MDAKKyNkZWZpbmUgQURGV09QVF9BVVRPQ09OTl9ESVNBQkxFCTB4MDAwMgogCiAJdWludDhfdCBoYl9pbnRlcnZhbDsJLyogMEMgKi8KIAl1aW50OF90IGluc3RfbnVtOyAvKiAwRCAqLwpAQCAtNDczLDggKzUwNSwxMCBAQAogCiAJdWludDE2X3QgaXNjc2lfb3B0czsJLyogMzAtMzEgKi8KIAl1aW50MTZfdCBpcHY0X3RjcF9vcHRzOwkvKiAzMi0zMyAqLworI2RlZmluZSBUQ1BPUFRfREhDUF9FTkFCTEUJCTB4MDIwMAogCXVpbnQxNl90IGlwdjRfaXBfb3B0czsJLyogMzQtMzUgKi8KLSNkZWZpbmUgIElQT1BUX0lQdjRfUFJPVE9DT0xfRU5BQkxFCTB4ODAwMAorI2RlZmluZSBJUE9QVF9JUFY0X1BST1RPQ09MX0VOQUJMRQkweDgwMDAKKyNkZWZpbmUgSVBPUFRfVkxBTl9UQUdHSU5HX0VOQUJMRQkweDIwMDAKIAogCXVpbnQxNl90IGlzY3NpX21heF9wZHVfc2l6ZTsJLyogMzYtMzcgKi8KIAl1aW50OF90IGlwdjRfdG9zOwkvKiAzOCAqLwpAQCAtNTI2LDYgKzU2MCw3IEBACiAJdWludDE2X3QgaXB2Nl9wb3J0OwkvKiAyMDQtMjA1ICovCiAJdWludDE2X3QgaXB2Nl9vcHRzOwkvKiAyMDYtMjA3ICovCiAjZGVmaW5lIElQVjZfT1BUX0lQVjZfUFJPVE9DT0xfRU5BQkxFCTB4ODAwMAorI2RlZmluZSBJUFY2X09QVF9WTEFOX1RBR0dJTkdfRU5BQkxFCTB4MjAwMAogCiAJdWludDE2X3QgaXB2Nl9hZGR0bF9vcHRzOwkvKiAyMDgtMjA5ICovCiAjZGVmaW5lIElQVjZfQURET1BUX05FSUdIQk9SX0RJU0NPVkVSWV9BRERSX0VOQUJMRQkweDAwMDIgLyogUHJpIEFDQgpAQCAtNTc0LDEzICs2MDksMTA1IEBACiAvKglzdHJ1Y3QgYWRkcl9jdHJsX2JsayBzZWM7Ki8KIH07CiAKKyNkZWZpbmUgUFJJTUFSSV9BQ0IJCTAKKyNkZWZpbmUgU0VDT05EQVJZX0FDQgkJMQorCitzdHJ1Y3QgYWRkcl9jdHJsX2Jsa19kZWYgeworCXVpbnQ4X3QgcmVzZXJ2ZWQxWzFdOwkvKiAwMCAqLworCXVpbnQ4X3QgY29udHJvbDsJLyogMDEgKi8KKwl1aW50OF90IHJlc2VydmVkMlsxMV07CS8qIDAyLTBDICovCisJdWludDhfdCBpbnN0X251bTsJLyogMEQgKi8KKwl1aW50OF90IHJlc2VydmVkM1szNF07CS8qIDBFLTJGICovCisJdWludDE2X3QgaXNjc2lfb3B0czsJLyogMzAtMzEgKi8KKwl1aW50MTZfdCBpcHY0X3RjcF9vcHRzOwkvKiAzMi0zMyAqLworCXVpbnQxNl90IGlwdjRfaXBfb3B0czsJLyogMzQtMzUgKi8KKwl1aW50MTZfdCBpc2NzaV9tYXhfcGR1X3NpemU7CS8qIDM2LTM3ICovCisJdWludDhfdCBpcHY0X3RvczsJLyogMzggKi8KKwl1aW50OF90IGlwdjRfdHRsOwkvKiAzOSAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQ0WzJdOwkvKiAzQS0zQiAqLworCXVpbnQxNl90IGRlZl90aW1lb3V0OwkvKiAzQy0zRCAqLworCXVpbnQxNl90IGlzY3NpX2ZidXJzdF9sZW47CS8qIDNFLTNGICovCisJdWludDhfdCByZXNlcnZlZDVbNF07CS8qIDQwLTQzICovCisJdWludDE2X3QgaXNjc2lfbWF4X291dHN0bmRfcjJ0OwkvKiA0NC00NSAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQ2WzJdOwkvKiA0Ni00NyAqLworCXVpbnQxNl90IGlwdjRfcG9ydDsJLyogNDgtNDkgKi8KKwl1aW50MTZfdCBpc2NzaV9tYXhfYnVyc3RfbGVuOwkvKiA0QS00QiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQ3WzRdOwkvKiA0Qy00RiAqLworCXVpbnQ4X3QgaXB2NF9hZGRyWzRdOwkvKiA1MC01MyAqLworCXVpbnQxNl90IGlwdjRfdmxhbl90YWc7CS8qIDU0LTU1ICovCisJdWludDhfdCBpcHY0X2FkZHJfc3RhdGU7CS8qIDU2ICovCisJdWludDhfdCBpcHY0X2NhY2hlaWQ7CS8qIDU3ICovCisJdWludDhfdCByZXNlcnZlZDhbOF07CS8qIDU4LTVGICovCisJdWludDhfdCBpcHY0X3N1Ym5ldFs0XTsJLyogNjAtNjMgKi8KKwl1aW50OF90IHJlc2VydmVkOVsxMl07CS8qIDY0LTZGICovCisJdWludDhfdCBpcHY0X2d3X2FkZHJbNF07CS8qIDcwLTczICovCisJdWludDhfdCByZXNlcnZlZDEwWzg0XTsJLyogNzQtQzcgKi8KKwl1aW50OF90IGFib3J0X3RpbWVyOwkvKiBDOCAgICAqLworCXVpbnQ4X3QgaXB2NF90Y3Bfd3NmOwkvKiBDOSAgICAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxMVsxMF07CS8qIENBLUQzICovCisJdWludDhfdCBpcHY0X2RoY3BfdmlkX2xlbjsJLyogRDQgKi8KKwl1aW50OF90IGlwdjRfZGhjcF92aWRbMTFdOwkvKiBENS1ERiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWQxMlsyMF07CS8qIEUwLUYzICovCisJdWludDhfdCBpcHY0X2RoY3BfYWx0X2NpZF9sZW47CS8qIEY0ICovCisJdWludDhfdCBpcHY0X2RoY3BfYWx0X2NpZFsxMV07CS8qIEY1LUZGICovCisJdWludDhfdCBpc2NzaV9uYW1lWzIyNF07CS8qIDEwMC0xREYgKi8KKwl1aW50OF90IHJlc2VydmVkMTNbMzJdOwkvKiAxRTAtMUZGICovCisJdWludDMyX3QgY29va2llOwkvKiAyMDAtMjAzICovCisJdWludDE2X3QgaXB2Nl9wb3J0OwkvKiAyMDQtMjA1ICovCisJdWludDE2X3QgaXB2Nl9vcHRzOwkvKiAyMDYtMjA3ICovCisJdWludDE2X3QgaXB2Nl9hZGR0bF9vcHRzOwkvKiAyMDgtMjA5ICovCisJdWludDE2X3QgaXB2Nl90Y3Bfb3B0czsJCS8qIDIwQS0yMEIgKi8KKwl1aW50OF90IGlwdjZfdGNwX3dzZjsJCS8qIDIwQyAqLworCXVpbnQxNl90IGlwdjZfZmxvd19sYmw7CQkvKiAyMEQtMjBGICovCisJdWludDhfdCBpcHY2X2RmbHRfcnRyX2FkZHJbMTZdOwkvKiAyMTAtMjFGICovCisJdWludDE2X3QgaXB2Nl92bGFuX3RhZzsJCS8qIDIyMC0yMjEgKi8KKwl1aW50OF90IGlwdjZfbG5rX2xjbF9hZGRyX3N0YXRlOwkvKiAyMjIgKi8KKwl1aW50OF90IGlwdjZfYWRkcjBfc3RhdGU7CS8qIDIyMyAqLworCXVpbnQ4X3QgaXB2Nl9hZGRyMV9zdGF0ZTsJLyogMjI0ICovCisJdWludDhfdCBpcHY2X2RmbHRfcnRyX3N0YXRlOwkvKiAyMjUgKi8KKwl1aW50OF90IGlwdjZfdHJhZmZpY19jbGFzczsJLyogMjI2ICovCisJdWludDhfdCBpcHY2X2hvcF9saW1pdDsJCS8qIDIyNyAqLworCXVpbnQ4X3QgaXB2Nl9pZl9pZFs4XTsJCS8qIDIyOC0yMkYgKi8KKwl1aW50OF90IGlwdjZfYWRkcjBbMTZdOwkJLyogMjMwLTIzRiAqLworCXVpbnQ4X3QgaXB2Nl9hZGRyMVsxNl07CQkvKiAyNDAtMjRGICovCisJdWludDMyX3QgaXB2Nl9uZF9yZWFjaF90aW1lOwkvKiAyNTAtMjUzICovCisJdWludDMyX3QgaXB2Nl9uZF9yZXhtaXRfdGltZXI7CS8qIDI1NC0yNTcgKi8KKwl1aW50MzJfdCBpcHY2X25kX3N0YWxlX3RpbWVvdXQ7CS8qIDI1OC0yNUIgKi8KKwl1aW50OF90IGlwdjZfZHVwX2FkZHJfZGV0ZWN0X2NvdW50OwkvKiAyNUMgKi8KKwl1aW50OF90IGlwdjZfY2FjaGVfaWQ7CQkvKiAyNUQgKi8KKwl1aW50OF90IHJlc2VydmVkMTRbMThdOwkJLyogMjVFLTI2RiAqLworCXVpbnQzMl90IGlwdjZfZ3dfYWR2cnRfbXR1OwkvKiAyNzAtMjczICovCisJdWludDhfdCByZXNlcnZlZDE1WzE0MF07CS8qIDI3NC0yRkYgKi8KK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIE1BWF9DSEFQX0VOVFJJRVNfNDBYWAkxMjgKKyNkZWZpbmUgTUFYX0NIQVBfRU5UUklFU184MlhYCTEwMjQKKyNkZWZpbmUgTUFYX1JFU1JWX0NIQVBfSURYCTMKKyNkZWZpbmUgRkxBU0hfQ0hBUF9PRkZTRVQJMHgwNjAwMDAwMAorCitzdHJ1Y3QgcWw0X2NoYXBfdGFibGUgeworCXVpbnQxNl90IGxpbms7CisJdWludDhfdCBmbGFnczsKKwl1aW50OF90IHNlY3JldF9sZW47CisjZGVmaW5lIE1JTl9DSEFQX1NFQ1JFVF9MRU4JMTIKKyNkZWZpbmUgTUFYX0NIQVBfU0VDUkVUX0xFTgkxMDAKKwl1aW50OF90IHNlY3JldFtNQVhfQ0hBUF9TRUNSRVRfTEVOXTsKKyNkZWZpbmUgTUFYX0NIQVBfTkFNRV9MRU4JMjU2CisJdWludDhfdCBuYW1lW01BWF9DSEFQX05BTUVfTEVOXTsKKwl1aW50MTZfdCByZXNlcnZlZDsKKyNkZWZpbmUgQ0hBUF9WQUxJRF9DT09LSUUJMHg0MDkyCisjZGVmaW5lIENIQVBfSU5WQUxJRF9DT09LSUUJMHhGRkVFCisJdWludDE2X3QgY29va2llOworfTsKKwogc3RydWN0IGRldl9kYl9lbnRyeSB7CiAJdWludDE2X3Qgb3B0aW9uczsJLyogMDAtMDEgKi8KICNkZWZpbmUgRERCX09QVF9ESVNDX1NFU1NJT04gIDB4MTAKICNkZWZpbmUgRERCX09QVF9UQVJHRVQJICAgICAgMHgwMiAvKiBkZXZpY2UgaXMgYSB0YXJnZXQgKi8KICNkZWZpbmUgRERCX09QVF9JUFY2X0RFVklDRQkweDEwMAorI2RlZmluZSBEREJfT1BUX0FVVE9fU0VORFRHVFNfRElTQUJMRQkJMHg0MAogI2RlZmluZSBEREJfT1BUX0lQVjZfTlVMTF9MSU5LX0xPQ0FMCQkweDgwMCAvKiBwb3N0IGNvbm5lY3Rpb24gKi8KICNkZWZpbmUgRERCX09QVF9JUFY2X0ZXX0RFRklORURfTElOS19MT0NBTAkweDgwMCAvKiBwcmUgY29ubmVjdGlvbiAqLwogCkBAIC01OTEsNiArNzE4LDcgQEAKIAl1aW50MTZfdCB0Y3Bfb3B0aW9uczsJLyogMEEtMEIgKi8KIAl1aW50MTZfdCBpcF9vcHRpb25zOwkvKiAwQy0wRCAqLwogCXVpbnQxNl90IGlzY3NpX21heF9yY3ZfZGF0YV9zZWdfbGVuOwkvKiAwRS0wRiAqLworI2RlZmluZSBCWVRFX1VOSVRTCTUxMgogCXVpbnQzMl90IHJlczE7CS8qIDEwLTEzICovCiAJdWludDE2X3QgaXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW47CS8qIDE0LTE1ICovCiAJdWludDE2X3QgaXNjc2lfZmlyc3RfYnVyc3RfbGVuOwkvKiAxNi0xNyAqLwpAQCAtNjI3LDcgKzc1NSwxMCBAQAogCXVpbnQ4X3QgdGNwX3Jjdl93c2Y7CS8qIDFDNyAqLwogCXVpbnQzMl90IHN0YXRfc247CS8qIDFDOC0xQ0IgKi8KIAl1aW50MzJfdCBleHBfc3RhdF9zbjsJLyogMUNDLTFDRiAqLwotCXVpbnQ4X3QgcmVzNlsweDMwXTsJLyogMUQwLTFGRiAqLworCXVpbnQ4X3QgcmVzNlsweDJiXTsJLyogMUQwLTFGQiAqLworI2RlZmluZSBEREJfVkFMSURfQ09PS0lFCTB4OTAzNAorCXVpbnQxNl90IGNvb2tpZTsJLyogMUZDLTFGRCAqLworCXVpbnQxNl90IGxlbjsJCS8qIDFGRS0xRkYgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjM5LDYgKzc3MCwxNCBAQAogI2RlZmluZSBGTEFTSF9FT0ZfT0ZGU0VUCShGTEFTSF9ERUZBVUxUQkxPQ0tTSVpFLTgpIC8qIDQgYnl0ZXMKIAkJCQkJCQkgICAgKiBmb3IgRU9GCiAJCQkJCQkJICAgICogc2lnbmF0dXJlICovCisjZGVmaW5lIEZMQVNIX1JBV19BQ0NFU1NfQUREUgkweDhlMDAwMDAwCisKKyNkZWZpbmUgQk9PVF9QQVJBTV9PRkZTRVRfUE9SVDAgMHgzYjAKKyNkZWZpbmUgQk9PVF9QQVJBTV9PRkZTRVRfUE9SVDEgMHg3YjAKKworI2RlZmluZSBGTEFTSF9PRkZTRVRfREJfSU5GTwkweDA1MDAwMDAwCisjZGVmaW5lIEZMQVNIX09GRlNFVF9EQl9FTkQJKEZMQVNIX09GRlNFVF9EQl9JTkZPICsgMHg3ZmZmKQorCiAKIHN0cnVjdCBzeXNfaW5mb19waHlzX2FkZHIgewogCXVpbnQ4X3QgYWRkcmVzc1s2XTsJLyogMDAtMDUgKi8KQEAgLTc3NCw2ICs5MTMsNyBAQAogCiAJdWludDhfdCBlbnRyeVN0YXR1czsKIAl1aW50OF90IHN5c3RlbURlZmluZWQ7CisjZGVmaW5lIFNEX0lTQ1NJX1BEVQkweDAxCiAJdWludDhfdCBlbnRyeUNvdW50OwogCiAJLyogU3lldGVtRGVmaW5lZCBkZWZpbml0aW9uICovCkBAIC05MzEsMjEgKzEwNzEsMjIgQEAKIAlzdHJ1Y3QgcWxhNF9oZWFkZXIgaGRyOwkJICAgICAgIC8qIDAwLTAzICovCiAJdWludDMyX3QgaGFuZGxlOwkvKiAwNC0wNyAqLwogCXVpbnQxNl90IHRhcmdldDsJLyogMDgtMDkgKi8KLQl1aW50MTZfdCBjb25uZWN0aW9uSUQ7CS8qIDBBLTBCICovCisJdWludDE2X3QgY29ubmVjdGlvbl9pZDsJLyogMEEtMEIgKi8KICNkZWZpbmUgSVNOU19ERUZBVUxUX1NFUlZFUl9DT05OX0lECSgodWludDE2X3QpMHg4MDAwKQogCi0JdWludDE2X3QgY29udHJvbEZsYWdzOwkvKiAwQy0wRCAqLworCXVpbnQxNl90IGNvbnRyb2xfZmxhZ3M7CS8qIDBDLTBEICovCiAjZGVmaW5lIFBUX0ZMQUdfRVRIRVJORVRfRlJBTUUJCTB4ODAwMAogI2RlZmluZSBQVF9GTEFHX0lTTlNfUERVCQkweDgwMDAKICNkZWZpbmUgUFRfRkxBR19TRU5EX0JVRkZFUgkJMHgwMjAwCiAjZGVmaW5lIFBUX0ZMQUdfV0FJVF80X1JFU1BPTlNFCQkweDAxMDAKKyNkZWZpbmUgUFRfRkxBR19JU0NTSV9QRFUJCTB4MTAwMAogCiAJdWludDE2X3QgdGltZW91dDsJLyogMEUtMEYgKi8KICNkZWZpbmUgUFRfREVGQVVMVF9USU1FT1VUCQkzMCAvKiBzZWNvbmRzICovCiAKLQlzdHJ1Y3QgZGF0YV9zZWdfYTY0IG91dERhdGFTZWc2NDsJLyogMTAtMUIgKi8KKwlzdHJ1Y3QgZGF0YV9zZWdfYTY0IG91dF9kc2Q7ICAgIC8qIDEwLTFCICovCiAJdWludDMyX3QgcmVzMTsJCS8qIDFDLTFGICovCi0Jc3RydWN0IGRhdGFfc2VnX2E2NCBpbkRhdGFTZWc2NDsJLyogMjAtMkIgKi8KKwlzdHJ1Y3QgZGF0YV9zZWdfYTY0IGluX2RzZDsgICAgIC8qIDIwLTJCICovCiAJdWludDhfdCByZXMyWzIwXTsJLyogMkMtM0YgKi8KIH07CiAKQEAgLTk3OCw0ICsxMTE5LDQzIEBACiAjZGVmaW5lIFJFU1BPTlNFX1BST0NFU1NFRAkweERFQURERUFECS8qIFNpZ25hdHVyZSAqLwogfTsKIAorc3RydWN0IHFsX2lzY3NpX3N0YXRzIHsKKwl1aW50OF90IHJlc2VydmVkMVs2NTZdOyAvKiAwMDAwLTAyOEYgKi8KKwl1aW50MzJfdCB0eF9jbWRfcGR1OyAvKiAwMjkwLTAyOTMgKi8KKwl1aW50MzJfdCB0eF9yZXNwX3BkdTsgLyogMDI5NC0wMjk3ICovCisJdWludDMyX3QgcnhfY21kX3BkdTsgLyogMDI5OC0wMjlCICovCisJdWludDMyX3QgcnhfcmVzcF9wZHU7IC8qIDAyOUMtMDI5RiAqLworCisJdWludDY0X3QgdHhfZGF0YV9vY3RldHM7IC8qIDAyQTAtMDJBNyAqLworCXVpbnQ2NF90IHJ4X2RhdGFfb2N0ZXRzOyAvKiAwMkE4LTAyQUYgKi8KKworCXVpbnQzMl90IGhkcl9kaWdlc3RfZXJyOyAvKiAwMkIw4oCTMDJCMyAqLworCXVpbnQzMl90IGRhdGFfZGlnZXN0X2VycjsgLyogMDJCNOKAkzAyQjcgKi8KKwl1aW50MzJfdCBjb25uX3RpbWVvdXRfZXJyOyAvKiAwMkI44oCTMDJCQiAqLworCXVpbnQzMl90IGZyYW1pbmdfZXJyOyAvKiAwMkJD4oCTMDJCRiAqLworCisJdWludDMyX3QgdHhfbm9wb3V0X3BkdXM7IC8qIDAyQzDigJMwMkMzICovCisJdWludDMyX3QgdHhfc2NzaV9jbWRfcGR1czsgIC8qIDAyQzTigJMwMkM3ICovCisJdWludDMyX3QgdHhfdG1mX2NtZF9wZHVzOyAvKiAwMkM44oCTMDJDQiAqLworCXVpbnQzMl90IHR4X2xvZ2luX2NtZF9wZHVzOyAvKiAwMkND4oCTMDJDRiAqLworCXVpbnQzMl90IHR4X3RleHRfY21kX3BkdXM7IC8qIDAyRDDigJMwMkQzICovCisJdWludDMyX3QgdHhfc2NzaV93cml0ZV9wZHVzOyAvKiAwMkQ04oCTMDJENyAqLworCXVpbnQzMl90IHR4X2xvZ291dF9jbWRfcGR1czsgLyogMDJEOOKAkzAyREIgKi8KKwl1aW50MzJfdCB0eF9zbmFja19yZXFfcGR1czsgLyogMDJEQ+KAkzAyREYgKi8KKworCXVpbnQzMl90IHJ4X25vcGluX3BkdXM7IC8qIDAyRTDigJMwMkUzICovCisJdWludDMyX3Qgcnhfc2NzaV9yZXNwX3BkdXM7IC8qIDAyRTTigJMwMkU3ICovCisJdWludDMyX3QgcnhfdG1mX3Jlc3BfcGR1czsgLyogMDJFOOKAkzAyRUIgKi8KKwl1aW50MzJfdCByeF9sb2dpbl9yZXNwX3BkdXM7IC8qIDAyRUPigJMwMkVGICovCisJdWludDMyX3QgcnhfdGV4dF9yZXNwX3BkdXM7IC8qIDAyRjDigJMwMkYzICovCisJdWludDMyX3Qgcnhfc2NzaV9yZWFkX3BkdXM7IC8qIDAyRjTigJMwMkY3ICovCisJdWludDMyX3QgcnhfbG9nb3V0X3Jlc3BfcGR1czsgLyogMDJGOOKAkzAyRkIgKi8KKworCXVpbnQzMl90IHJ4X3IydF9wZHVzOyAvKiAwMkZD4oCTMDJGRiAqLworCXVpbnQzMl90IHJ4X2FzeW5jX3BkdXM7IC8qIDAzMDDigJMwMzAzICovCisJdWludDMyX3QgcnhfcmVqZWN0X3BkdXM7IC8qIDAzMDTigJMwMzA3ICovCisKKwl1aW50OF90IHJlc2VydmVkMlsyNjRdOyAvKiAweDAzMDggLSAweDA0MEYgKi8KK307CisKICNlbmRpZiAvKiAgX1FMQTRYX0ZXX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCmluZGV4IGE1M2EyNTYuLjE2MGRiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaApAQCAtMTIsMjAgKzEyLDE1IEBACiAKIGludCBxbGE0eHh4X2h3X3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpbnQgcWw0eHh4X2xvY2tfZHJ2cl93YWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKTsKLWludCBxbGE0eHh4X3NlbmRfdGd0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKmlwLCB1aW50MTZfdCBwb3J0KTsKIGludCBxbGE0eHh4X3NlbmRfY29tbWFuZF90b19pc3Aoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICpzcmIpOwotaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCSAgICAgICB1aW50OF90IHJlbmV3X2RkYl9saXN0KTsKK2ludCBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaW50IHFsYTR4eHhfc29mdF9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaXJxcmV0dXJuX3QgcWxhNHh4eF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAotdm9pZCBxbGE0eHh4X2ZyZWVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIHZvaWQgcWxhNHh4eF9mcmVlX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CiB2b2lkIHFsYTR4eHhfcHJvY2Vzc19hZW4oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50OF90IHByb2Nlc3NfYWVuKTsKIAogaW50IHFsYTR4eHhfZ2V0X2RoY3BfaXBfYWRkcmVzcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwotaW50IHFsYTR4eHhfcmVsb2dpbl9kZXZpY2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KTsKIGludCBxbGE0eHh4X2Fib3J0X3Rhc2soc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICpzcmIpOwogaW50IHFsYTR4eHhfcmVzZXRfbHVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAogCQkgICAgICBpbnQgbHVuKTsKQEAgLTUxLDE1ICs0NiwyNCBAQAogCQkJICAgIHVpbnQxNl90ICpjb25uZWN0aW9uX2lkKTsKIAogaW50IHFsYTR4eHhfc2V0X2RkYl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCB1aW50MTZfdCBmd19kZGJfaW5kZXgsCi0JCQkgIGRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYSk7Ci0KLXZvaWQgcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KTsKKwkJCSAgZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hLCB1aW50MzJfdCAqbWJ4X3N0cyk7Cit1aW50OF90IHFsYTR4eHhfZ2V0X2lmY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCAqbWJveF9jbWQsCisJCQkgdWludDMyX3QgKm1ib3hfc3RzLCBkbWFfYWRkcl90IGluaXRfZndfY2JfZG1hKTsKK2ludCBxbGE0eHh4X2Nvbm5fY2xvc2Vfc2Vzc19sb2dvdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCSAgIHVpbnQxNl90IGZ3X2RkYl9pbmRleCwKKwkJCQkgICB1aW50MTZfdCBjb25uZWN0aW9uX2lkLAorCQkJCSAgIHVpbnQxNl90IG9wdGlvbik7CitpbnQgcWxhNHh4eF9kaXNhYmxlX2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTR4eHhfc2V0X2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICptYm94X2NtZCwKKwkJICAgIHVpbnQzMl90ICptYm94X3N0cywgZG1hX2FkZHJfdCBhY2JfZG1hKTsKK2ludCBxbGE0eHh4X2dldF9hY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IGFjYl9kbWEsCisJCSAgICB1aW50MzJfdCBhY2JfdHlwZSwgdWludDMyX3QgbGVuKTsKK2ludCBxbGE0eHh4X2dldF9pcF9zdGF0ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGFjYl9pZHgsCisJCQkgdWludDMyX3QgaXBfaWR4LCB1aW50MzJfdCAqc3RzKTsKK3ZvaWQgcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pOwogdTE2IHJkX252cmFtX3dvcmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgb2Zmc2V0KTsKK3U4IHJkX252cmFtX2J5dGUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgb2Zmc2V0KTsKIHZvaWQgcWxhNHh4eF9nZXRfY3Jhc2hfcmVjb3JkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Ci1zdHJ1Y3QgZGRiX2VudHJ5ICpxbGE0eHh4X2FsbG9jX3Nlc3Moc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKLWludCBxbGE0eHh4X2FkZF9zZXNzKHN0cnVjdCBkZGJfZW50cnkgKik7Ci12b2lkIHFsYTR4eHhfZGVzdHJveV9zZXNzKHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CiBpbnQgcWxhNHh4eF9pc19udnJhbV9jb25maWd1cmF0aW9uX3ZhbGlkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpbnQgcWxhNHh4eF9hYm91dF9maXJtd2FyZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogdm9pZCBxbGE0eHh4X2ludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLApAQCAtNjgsMTQgKzcyLDEzIEBACiB2b2lkIHFsYTR4eHhfc3JiX2NvbXBsKHN0cnVjdCBrcmVmICpyZWYpOwogc3RydWN0IHNyYiAqcWxhNHh4eF9kZWxfZnJvbV9hY3RpdmVfYXJyYXkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCQl1aW50MzJfdCBpbmRleCk7Ci1pbnQgcWxhNHh4eF9yZWluaXRpYWxpemVfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIGludCBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCiAJCXVpbnQzMl90IHN0YXRlLCB1aW50MzJfdCBjb25uX2Vycm9yKTsKIHZvaWQgcWxhNHh4eF9kdW1wX2J1ZmZlcih2b2lkICpiLCB1aW50MzJfdCBzaXplKTsKIGludCBxbGE0eHh4X3NlbmRfbWFya2VyX2lvY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgaW50IGx1biwgdWludDE2X3QgbXJrcl9tb2QpOwotaW50IHFsYTRfaXNfcmVsb2dpbl9hbGxvd2VkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgY29ubl9lcnIpOwotCitpbnQgcWxhNHh4eF9zZXRfZmxhc2goc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbmd0aCwgdWludDMyX3Qgb3B0aW9ucyk7CiBpbnQgcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50OF90IGluQ291bnQsCiAJCXVpbnQ4X3Qgb3V0Q291bnQsIHVpbnQzMl90ICptYnhfY21kLCB1aW50MzJfdCAqbWJ4X3N0cyk7CiAKQEAgLTk1LDYgKzk4LDExIEBACiB2b2lkIHFsYTR4eHhfZ2V0X2Nvbm5fZXZlbnRfbG9nKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiB2b2lkIHFsYTR4eHhfbWFpbGJveF9wcmVtYXR1cmVfY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogdm9pZCBxbGE0eHh4X2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7Cit1aW50OF90IHFsYTR4eHhfdXBkYXRlX2xvY2FsX2lmY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCSAgdWludDMyX3QgKm1ib3hfY21kLAorCQkJCSAgdWludDMyX3QgKm1ib3hfc3RzLAorCQkJCSAgc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IsCisJCQkJICBkbWFfYWRkcl90IGluaXRfZndfY2JfZG1hKTsKIAogdm9pZCBxbGE0Xzh4eHhfcGNpX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGludCBxbGE0Xzh4eHhfaW9zcGFjZV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKQEAgLTEzNCw2ICsxNDIsMzcgQEAKIHZvaWQgcWxhNF84eHh4X25lZWRfcXNudF9oYW5kbGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiB2b2lkIHFsYTRfOHh4eF9jbGVhcl9kcnZfYWN0aXZlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiB2b2lkIHFsYTRfOHh4eF9zZXRfZHJ2X2FjdGl2ZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOworaW50IHFsYTR4eHhfY29ubl9vcGVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgZndfZGRiX2luZGV4KTsKK2ludCBxbGE0eHh4X3NldF9wYXJhbV9kZGJlbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAorCQkJICAgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkgICAgICAgdWludDMyX3QgKm1ieF9zdHMpOworaW50IHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksIGludCBvcHRpb25zKTsKK2ludCBxbGE0eHh4X3JlcV9kZGJfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCisJCQkgIHVpbnQzMl90ICptYnhfc3RzKTsKK2ludCBxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZ3X2RkYl9pbmRleCk7CitpbnQgcWxhNHh4eF9zZW5kX3Bhc3N0aHJ1MChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzayk7CitpbnQgcWxhNHh4eF9nZXRfbWdtdF9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgZndfZGRiX2luZGV4LAorCQkJICB1aW50MTZfdCBzdGF0c19zaXplLCBkbWFfYWRkcl90IHN0YXRzX2RtYSk7Cit2b2lkIHFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CitpbnQgcWxhNHh4eF9ib290ZGJfYnlfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgIHN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeSwKKwkJCSAgICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEsIHVpbnQxNl90IGRkYl9pbmRleCk7CitpbnQgcWxhNHh4eF9nZXRfY2hhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnVzZXJuYW1lLAorCQkgICAgIGNoYXIgKnBhc3N3b3JkLCB1aW50MTZfdCBpZHgpOworaW50IHFsYTR4eHhfZ2V0X252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgZG1hX2FkZHJfdCBudnJhbV9kbWEsCisJCSAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSk7CitpbnQgcWxhNHh4eF9zZXRfbnZyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IG52cmFtX2RtYSwKKwkJICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKK2ludCBxbGE0eHh4X3Jlc3RvcmVfZmFjdG9yeV9kZWZhdWx0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICB1aW50MzJfdCByZWdpb24sIHVpbnQzMl90IGZpZWxkMCwKKwkJCQkgICAgIHVpbnQzMl90IGZpZWxkMSk7CisKKy8qIEJTRyBGdW5jdGlvbnMgKi8KK2ludCBxbGE0eHh4X2JzZ19yZXF1ZXN0KHN0cnVjdCBic2dfam9iICpic2dfam9iKTsKK2ludCBxbGE0eHh4X3Byb2Nlc3NfdmVuZG9yX3NwZWNpZmljKHN0cnVjdCBic2dfam9iICpic2dfam9iKTsKIAogZXh0ZXJuIGludCBxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKIGV4dGVybiBpbnQgcWw0eGRvbnRyZXNldGhiYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCmluZGV4IDQyZWQ1ZGIuLjMwNzVmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwpAQCAtMTEsOSArMTEsNiBAQAogI2luY2x1ZGUgInFsNF9kYmcuaCIKICNpbmNsdWRlICJxbDRfaW5saW5lLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgZGRiX2VudHJ5ICpxbGE0eHh4X2FsbG9jX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkJCSAgIHVpbnQzMl90IGZ3X2RkYl9pbmRleCk7Ci0KIHN0YXRpYyB2b2lkIHFsNHh4eF9zZXRfbWFjX251bWJlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdWludDMyX3QgdmFsdWU7CkBAIC00OCw0MSArNDUsMTUgQEAKICAqIEBoYTogcG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICogQGRkYl9lbnRyeTogcG9pbnRlciB0byBkZXZpY2UgZGF0YWJhc2UgZW50cnkKICAqCi0gKiBUaGlzIHJvdXRpbmUgZGVhbGxvY2F0ZXMgYW5kIHVubGlua3MgdGhlIHNwZWNpZmllZCBkZGJfZW50cnkgZnJvbSB0aGUKLSAqIGFkYXB0ZXIncworICogVGhpcyByb3V0aW5lIG1hcmtzIGEgRERCIGVudHJ5IElOVkFMSUQKICAqKi8KIHZvaWQgcWxhNHh4eF9mcmVlX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCiAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQogewotCS8qIFJlbW92ZSBkZXZpY2UgZW50cnkgZnJvbSBsaXN0ICovCi0JbGlzdF9kZWxfaW5pdCgmZGRiX2VudHJ5LT5saXN0KTsKLQogCS8qIFJlbW92ZSBkZXZpY2UgcG9pbnRlciBmcm9tIGluZGV4IG1hcHBpbmcgYXJyYXlzICovCiAJaGEtPmZ3X2RkYl9pbmRleF9tYXBbZGRiX2VudHJ5LT5md19kZGJfaW5kZXhdID0KIAkJKHN0cnVjdCBkZGJfZW50cnkgKikgSU5WQUxJRF9FTlRSWTsKIAloYS0+dG90X2RkYnMtLTsKLQotCS8qIEZyZWUgbWVtb3J5IGFuZCBzY3NpLW1sIHN0cnVjdCBmb3IgZGV2aWNlIGVudHJ5ICovCi0JcWxhNHh4eF9kZXN0cm95X3Nlc3MoZGRiX2VudHJ5KTsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X2ZyZWVfZGRiX2xpc3QgLSBkZWFsbG9jYXRlIGFsbCBkZGJzCi0gKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgZGVhbGxvY2F0ZXMgYW5kIHJlbW92ZXMgYWxsIGRldmljZXMgb24gdGhlIHNwcGVjaWZpZWQgYWRhcHRlci4KLSAqKi8KLXZvaWQgcWxhNHh4eF9mcmVlX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZoYS0+ZGRiX2xpc3QpKSB7Ci0JCXB0ciA9IGhhLT5kZGJfbGlzdC5uZXh0OwotCQkvKiBGcmVlIG1lbW9yeSBmb3IgZGV2aWNlIGVudHJ5IGFuZCByZW1vdmUgKi8KLQkJZGRiX2VudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBkZGJfZW50cnksIGxpc3QpOwotCQlxbGE0eHh4X2ZyZWVfZGRiKGhhLCBkZGJfZW50cnkpOwotCX0KIH0KIAogLyoqCkBAIC0yMzYsMzggKzIwNyw0NCBAQAogCQkJCSAgICBGV19BRERTVEFURV9ESENQdjRfTEVBU0VfQUNRVUlSRUQpID09IDApKSB7CiAJCQlpcHY0X3dhaXQgPSAxOwogCQl9Ci0JCWlmICgoKGhhLT5pcHY2X2FkZGxfb3B0aW9ucyAmCi0JCQkgICAgSVBWNl9BRERPUFRfTkVJR0hCT1JfRElTQ09WRVJZX0FERFJfRU5BQkxFKSAhPSAwKSAmJgotCQkgICAgKChoYS0+aXB2Nl9saW5rX2xvY2FsX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpIHx8Ci0JCSAgICAgKGhhLT5pcHY2X2FkZHIwX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpIHx8Ci0JCSAgICAgKGhhLT5pcHY2X2FkZHIxX3N0YXRlID09IElQX0FERFJTVEFURV9BQ1FVSVJJTkcpKSkgeworCQlpZiAoKChoYS0+aXBfY29uZmlnLmlwdjZfYWRkbF9vcHRpb25zICYKKwkJICAgICAgSVBWNl9BRERPUFRfTkVJR0hCT1JfRElTQ09WRVJZX0FERFJfRU5BQkxFKSAhPSAwKSAmJgorCQkgICAgKChoYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9PQorCQkgICAgICBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKSB8fAorCQkgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjBfc3RhdGUgPT0KKwkJICAgICAgSVBfQUREUlNUQVRFX0FDUVVJUklORykgfHwKKwkJICAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxX3N0YXRlID09CisJCSAgICAgIElQX0FERFJTVEFURV9BQ1FVSVJJTkcpKSkgewogCiAJCQlpcHY2X3dhaXQgPSAxOwogCi0JCQlpZiAoKGhhLT5pcHY2X2xpbmtfbG9jYWxfc3RhdGUgPT0KLQkJCQkJCSAgICAgSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkgfHwKLQkJCSAgICAoaGEtPmlwdjZfYWRkcjBfc3RhdGUgPT0gSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkgfHwKLQkJCSAgICAoaGEtPmlwdjZfYWRkcjFfc3RhdGUgPT0gSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkpIHsKKwkJCWlmICgoaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfc3RhdGUgPT0KKwkJCSAgICAgSVBfQUREUlNUQVRFX1BSRUZFUlJFRCkgfHwKKwkJCSAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIwX3N0YXRlID09CisJCQkgICAgIElQX0FERFJTVEFURV9QUkVGRVJSRUQpIHx8CisJCQkgICAgKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMV9zdGF0ZSA9PQorCQkJICAgICBJUF9BRERSU1RBVEVfUFJFRkVSUkVEKSkgewogCQkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJzY3NpJWxkOiAlczogIgogCQkJCQkgICAgICAiUHJlZmVycmVkIElQIGNvbmZpZ3VyZWQuIgogCQkJCQkgICAgICAiIERvbid0IHdhaXQhXG4iLCBoYS0+aG9zdF9ubywKIAkJCQkJICAgICAgX19mdW5jX18pKTsKIAkJCQlpcHY2X3dhaXQgPSAwOwogCQkJfQotCQkJaWYgKG1lbWNtcCgmaGEtPmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkciwgaXBfYWRkcmVzcywKLQkJCQlJUHY2X0FERFJfTEVOKSA9PSAwKSB7CisJCQlpZiAobWVtY21wKCZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkciwKKwkJCQkgICBpcF9hZGRyZXNzLCBJUHY2X0FERFJfTEVOKSA9PSAwKSB7CiAJCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8gInNjc2klbGQ6ICVzOiAiCiAJCQkJCSAgICAgICJObyBSb3V0ZXIgY29uZmlndXJlZC4gIgogCQkJCQkgICAgICAiRG9uJ3Qgd2FpdCFcbiIsIGhhLT5ob3N0X25vLAogCQkJCQkgICAgICBfX2Z1bmNfXykpOwogCQkJCWlwdjZfd2FpdCA9IDA7CiAJCQl9Ci0JCQlpZiAoKGhhLT5pcHY2X2RlZmF1bHRfcm91dGVyX3N0YXRlID09Ci0JCQkJCQlJUFY2X1JUUlNUQVRFX01BTlVBTCkgJiYKLQkJCSAgICAoaGEtPmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9PQotCQkJCQkJSVBfQUREUlNUQVRFX1RFTlRBVElWRSkgJiYKLQkJCSAgICAobWVtY21wKCZoYS0+aXB2Nl9saW5rX2xvY2FsX2FkZHIsCi0JCQkJICAgICZoYS0+aXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLCA0KSA9PSAwKSkgeworCQkJaWYgKChoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfc3RhdGUgPT0KKwkJCSAgICAgSVBWNl9SVFJTVEFURV9NQU5VQUwpICYmCisJCQkgICAgKGhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX3N0YXRlID09CisJCQkgICAgIElQX0FERFJTVEFURV9URU5UQVRJVkUpICYmCisJCQkgICAgKG1lbWNtcCgmaGEtPmlwX2NvbmZpZy5pcHY2X2xpbmtfbG9jYWxfYWRkciwKKwkJCSAgICAgJmhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyLCA0KSA9PQorCQkJICAgICAwKSkgewogCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBMaW5rTG9jYWwgUm91dGVyICYgIgogCQkJCQkiSVAgY29uZmlndXJlZC4gRG9uJ3Qgd2FpdCFcbiIsCiAJCQkJCWhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwpAQCAtMjc5LDExICsyNTYsMTQgQEAKIAkJCQkgICAgICAiSVAocykgXCIiLCBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKIAkJCWlmIChpcHY0X3dhaXQpCiAJCQkJREVCVUcyKHByaW50aygiSVB2NCAiKSk7Ci0JCQlpZiAoaGEtPmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKQorCQkJaWYgKGhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX3N0YXRlID09CisJCQkgICAgSVBfQUREUlNUQVRFX0FDUVVJUklORykKIAkJCQlERUJVRzIocHJpbnRrKCJJUHY2TGlua0xvY2FsICIpKTsKLQkJCWlmIChoYS0+aXB2Nl9hZGRyMF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKQorCQkJaWYgKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMF9zdGF0ZSA9PQorCQkJICAgIElQX0FERFJTVEFURV9BQ1FVSVJJTkcpCiAJCQkJREVCVUcyKHByaW50aygiSVB2NkFkZHIwICIpKTsKLQkJCWlmIChoYS0+aXB2Nl9hZGRyMV9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfQUNRVUlSSU5HKQorCQkJaWYgKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMV9zdGF0ZSA9PQorCQkJICAgIElQX0FERFJTVEFURV9BQ1FVSVJJTkcpCiAJCQkJREVCVUcyKHByaW50aygiSVB2NkFkZHIxICIpKTsKIAkJCURFQlVHMihwcmludGsoIlwiXG4iKSk7CiAJCX0KQEAgLTQ2Niw0ODYgKzQ0NiwxOSBAQAogCXJldHVybiBxbGE0eHh4X2dldF9maXJtd2FyZV9zdGF0dXMoaGEpOwogfQogCi1zdGF0aWMgc3RydWN0IGRkYl9lbnRyeSogcWxhNHh4eF9nZXRfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkJCXVpbnQzMl90IGZ3X2RkYl9pbmRleCwKLQkJCQkJCXVpbnQzMl90ICpuZXdfdGd0KQorc3RhdGljIHZvaWQgcWxhNHh4eF9zZXRfbW9kZWxfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0Jc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5ID0gTlVMTDsKLQlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gTlVMTDsKLQlpbnQgZm91bmQgPSAwOwotCXVpbnQzMl90IGRldmljZV9zdGF0ZTsKKwl1aW50MTZfdCBib2FyZF9pZF9zdHJpbmdbOF07CisJaW50IGk7CisJaW50IHNpemUgPSBzaXplb2YoaGEtPm52cmFtLT5pc3A0MDIyLmJvYXJkSWRTdHIpOworCWludCBvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZWVwcm9tX2RhdGEsIGlzcDQwMjIuYm9hcmRJZFN0cikgLyAyOwogCi0JKm5ld190Z3QgPSAwOwotCS8qIE1ha2Ugc3VyZSB0aGUgZG1hIGJ1ZmZlciBpcyB2YWxpZCAqLwotCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJCQkJICBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCi0JCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwotCWlmIChmd19kZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIuXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXhpdF9nZXRfZGRiX2VudHJ5X25vX2ZyZWU7CisJZm9yIChpID0gMDsgaSA8IChzaXplIC8gMikgOyBpKyspIHsKKwkJYm9hcmRfaWRfc3RyaW5nW2ldID0gcmRfbnZyYW1fd29yZChoYSwgb2Zmc2V0KTsKKwkJb2Zmc2V0ICs9IDE7CiAJfQogCi0JaWYgKHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsIGZ3X2RkYl9lbnRyeSwKLQkJCQkgICAgZndfZGRiX2VudHJ5X2RtYSwgTlVMTCwgTlVMTCwKLQkJCQkgICAgJmRldmljZV9zdGF0ZSwgTlVMTCwgTlVMTCwgTlVMTCkgPT0KLQkJCQkgICAgUUxBX0VSUk9SKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBmYWlsZWQgZ2V0X2RkYl9lbnRyeSBmb3IgIgotCQkJICAgICAgImZ3X2RkYl9pbmRleCAlZFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkJICAgICAgZndfZGRiX2luZGV4KSk7Ci0JCWdvdG8gZXhpdF9nZXRfZGRiX2VudHJ5OwotCX0KLQotCS8qIEFsbG9jYXRlIEREQiBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQuICovCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IExvb2tpbmcgZm9yIGRkYlslZF1cbiIsIGhhLT5ob3N0X25vLAotCQkgICAgICBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZGJfZW50cnksICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChtZW1jbXAoZGRiX2VudHJ5LT5pc2NzaV9uYW1lLCBmd19kZGJfZW50cnktPmlzY3NpX25hbWUsCi0JCQkgICBJU0NTSV9OQU1FX1NJWkUpID09IDApICYmCi0JCQkoZGRiX2VudHJ5LT50cGd0ID09Ci0JCQkJbGUzMl90b19jcHUoZndfZGRiX2VudHJ5LT50Z3RfcG9ydGFsX2dycCkpICYmCi0JCQkobWVtY21wKGRkYl9lbnRyeS0+aXNpZCwgZndfZGRiX2VudHJ5LT5pc2lkLAotCQkJCXNpemVvZihkZGJfZW50cnktPmlzaWQpKSA9PSAwKSkgewotCQkJZm91bmQrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogaWYgbm90IGZvdW5kIGFsbG9jYXRlIG5ldyBkZGIgKi8KLQlpZiAoIWZvdW5kKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBkZGJbJWRdIG5vdCBmb3VuZCAtIGFsbG9jYXRpbmcgIgotCQkJICAgICAgIm5ldyBkZGJcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICAgIGZ3X2RkYl9pbmRleCkpOwotCQkqbmV3X3RndCA9IDE7Ci0JCWRkYl9lbnRyeSA9IHFsYTR4eHhfYWxsb2NfZGRiKGhhLCBmd19kZGJfaW5kZXgpOwotCX0KLQotZXhpdF9nZXRfZGRiX2VudHJ5OgotCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksIGZ3X2RkYl9lbnRyeSwKLQkJCSAgZndfZGRiX2VudHJ5X2RtYSk7Ci0KLWV4aXRfZ2V0X2RkYl9lbnRyeV9ub19mcmVlOgotCXJldHVybiBkZGJfZW50cnk7Ci19Ci0KLS8qKgotICogcWxhNHh4eF91cGRhdGVfZGRiX2VudHJ5IC0gdXBkYXRlIGRyaXZlcidzIGludGVybmFsIGRkYgotICogQGhhOiBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKiBAZGRiX2VudHJ5OiBwb2ludGVyIHRvIGRldmljZSBkYXRhYmFzZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCi0gKiBAZndfZGRiX2luZGV4OiBpbmRleCBvZiB0aGUgZGRiIGVudHJ5IGluIGZ3IGRkYiB0YWJsZQotICoKLSAqIFRoaXMgcm91dGluZSB1cGRhdGVzIHRoZSBkcml2ZXIncyBpbnRlcm5hbCBkZXZpY2UgZGF0YWJhc2UgZW50cnkKLSAqIHdpdGggaW5mb3JtYXRpb24gcmV0cmlldmVkIGZyb20gdGhlIGZpcm13YXJlJ3MgZGV2aWNlIGRhdGFiYXNlCi0gKiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UuIFRoZSBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCBmaWVsZAotICogbXVzdCBiZSBpbml0aWFsaXplZCBwcmlvciB0bwljYWxsaW5nIHRoaXMgcm91dGluZQotICoKLSAqKi8KLXN0YXRpYyBpbnQgcWxhNHh4eF91cGRhdGVfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKLQkJCQkgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAotCQkJCSAgICB1aW50MzJfdCBmd19kZGJfaW5kZXgpCi17Ci0Jc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5ID0gTlVMTDsKLQlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7Ci0JaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKLQl1aW50MzJfdCBjb25uX2VycjsKLQotCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiX2VudHJ5IGlzIE5VTExcbiIsIGhhLT5ob3N0X25vLAotCQkJICAgICAgX19mdW5jX18pKTsKLQotCQlnb3RvIGV4aXRfdXBkYXRlX2RkYl9ub19mcmVlOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgZG1hIGJ1ZmZlciBpcyB2YWxpZCAqLwotCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJCQkJICBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCi0JCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwotCWlmIChmd19kZGJfZW50cnkgPT0gTlVMTCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIuXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7Ci0KLQkJZ290byBleGl0X3VwZGF0ZV9kZGJfbm9fZnJlZTsKLQl9Ci0KLQlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGZ3X2RkYl9pbmRleCwgZndfZGRiX2VudHJ5LAotCQkJCSAgICBmd19kZGJfZW50cnlfZG1hLCBOVUxMLCBOVUxMLAotCQkJCSAgICAmZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLCAmY29ubl9lcnIsCi0JCQkJICAgICZkZGJfZW50cnktPnRjcF9zb3VyY2VfcG9ydF9udW0sCi0JCQkJICAgICZkZGJfZW50cnktPmNvbm5lY3Rpb25faWQpID09Ci0JCQkJICAgIFFMQV9FUlJPUikgewotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZmFpbGVkIGdldF9kZGJfZW50cnkgZm9yICIKLQkJCSAgICAgICJmd19kZGJfaW5kZXggJWRcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICAgIGZ3X2RkYl9pbmRleCkpOwotCi0JCWdvdG8gZXhpdF91cGRhdGVfZGRiOwotCX0KLQotCXN0YXR1cyA9IFFMQV9TVUNDRVNTOwotCWRkYl9lbnRyeS0+b3B0aW9ucyA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+b3B0aW9ucyk7Ci0JZGRiX2VudHJ5LT50YXJnZXRfc2Vzc2lvbl9pZCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+dHNpZCk7Ci0JZGRiX2VudHJ5LT50YXNrX21nbXRfdGltZW91dCA9Ci0JCWxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+ZGVmX3RpbWVvdXQpOwotCWRkYl9lbnRyeS0+Q21kU24gPSAwOwotCWRkYl9lbnRyeS0+ZXhlX3Rocm90dGxlID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5leGVjX3Rocm90dGxlKTsKLQlkZGJfZW50cnktPmRlZmF1bHRfcmVsb2dpbl90aW1lb3V0ID0KLQkJbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5kZWZfdGltZW91dCk7Ci0JZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUyd2FpdCk7Ci0KLQkvKiBVcGRhdGUgaW5kZXggaW4gY2FzZSBpdCBjaGFuZ2VkICovCi0JZGRiX2VudHJ5LT5md19kZGJfaW5kZXggPSBmd19kZGJfaW5kZXg7Ci0JaGEtPmZ3X2RkYl9pbmRleF9tYXBbZndfZGRiX2luZGV4XSA9IGRkYl9lbnRyeTsKLQotCWRkYl9lbnRyeS0+cG9ydCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+cG9ydCk7Ci0JZGRiX2VudHJ5LT50cGd0ID0gbGUzMl90b19jcHUoZndfZGRiX2VudHJ5LT50Z3RfcG9ydGFsX2dycCk7Ci0JbWVtY3B5KGRkYl9lbnRyeS0+aXNpZCwgZndfZGRiX2VudHJ5LT5pc2lkLCBzaXplb2YoZGRiX2VudHJ5LT5pc2lkKSk7Ci0KLQltZW1jcHkoJmRkYl9lbnRyeS0+aXNjc2lfbmFtZVswXSwgJmZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZVswXSwKLQkgICAgICAgbWluKHNpemVvZihkZGJfZW50cnktPmlzY3NpX25hbWUpLAotCQkgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSkpOwotCW1lbWNweSgmZGRiX2VudHJ5LT5pc2NzaV9hbGlhc1swXSwgJmZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXNbMF0sCi0JICAgICAgIG1pbihzaXplb2YoZGRiX2VudHJ5LT5pc2NzaV9hbGlhcyksCi0JCSAgIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzKSkpOwotCW1lbWNweSgmZGRiX2VudHJ5LT5pcF9hZGRyWzBdLCAmZndfZGRiX2VudHJ5LT5pcF9hZGRyWzBdLAotCSAgICAgICBtaW4oc2l6ZW9mKGRkYl9lbnRyeS0+aXBfYWRkciksIHNpemVvZihmd19kZGJfZW50cnktPmlwX2FkZHIpKSk7Ci0KLQlkZGJfZW50cnktPmlzY3NpX21heF9idXJzdF9sZW4gPSBmd19kZGJfZW50cnktPmlzY3NpX21heF9idXJzdF9sZW47Ci0JZGRiX2VudHJ5LT5pc2NzaV9tYXhfb3V0c25kX3IydCA9IGZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X291dHNuZF9yMnQ7Ci0JZGRiX2VudHJ5LT5pc2NzaV9maXJzdF9idXJzdF9sZW4gPSBmd19kZGJfZW50cnktPmlzY3NpX2ZpcnN0X2J1cnN0X2xlbjsKLQlkZGJfZW50cnktPmlzY3NpX21heF9yY3ZfZGF0YV9zZWdfbGVuID0KLQkJCQlmd19kZGJfZW50cnktPmlzY3NpX21heF9yY3ZfZGF0YV9zZWdfbGVuOwotCWRkYl9lbnRyeS0+aXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW4gPQotCQkJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW47Ci0KLQlpZiAoZGRiX2VudHJ5LT5vcHRpb25zICYgRERCX09QVF9JUFY2X0RFVklDRSkgewotCQltZW1jcHkoJmRkYl9lbnRyeS0+cmVtb3RlX2lwdjZfYWRkciwKLQkJCWZ3X2RkYl9lbnRyeS0+aXBfYWRkciwKLQkJCW1pbihzaXplb2YoZGRiX2VudHJ5LT5yZW1vdGVfaXB2Nl9hZGRyKSwKLQkJCXNpemVvZihmd19kZGJfZW50cnktPmlwX2FkZHIpKSk7Ci0JCW1lbWNweSgmZGRiX2VudHJ5LT5saW5rX2xvY2FsX2lwdjZfYWRkciwKLQkJCWZ3X2RkYl9lbnRyeS0+bGlua19sb2NhbF9pcHY2X2FkZHIsCi0JCQltaW4oc2l6ZW9mKGRkYl9lbnRyeS0+bGlua19sb2NhbF9pcHY2X2FkZHIpLAotCQkJc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+bGlua19sb2NhbF9pcHY2X2FkZHIpKSk7Ci0KLQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBEREJbJWRdIFN0YXRlICUwNHgiCi0JCQkJCSIgQ29ubkVyciAlMDh4IElQICVwSTYgIgotCQkJCQkiOiUwNGQgXCIlc1wiXG4iLAotCQkJCQlfX2Z1bmNfXywgZndfZGRiX2luZGV4LAotCQkJCQlkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsCi0JCQkJCWNvbm5fZXJyLCBmd19kZGJfZW50cnktPmlwX2FkZHIsCi0JCQkJCWxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+cG9ydCksCi0JCQkJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSkpOwotCX0gZWxzZQotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IEREQlslZF0gU3RhdGUgJTA0eCIKLQkJCQkJIiBDb25uRXJyICUwOHggSVAgJXBJNCAiCi0JCQkJCSI6JTA0ZCBcIiVzXCJcbiIsCi0JCQkJCV9fZnVuY19fLCBmd19kZGJfaW5kZXgsCi0JCQkJCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSwKLQkJCQkJY29ubl9lcnIsIGZ3X2RkYl9lbnRyeS0+aXBfYWRkciwKLQkJCQkJbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5wb3J0KSwKLQkJCQkJZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSk7Ci1leGl0X3VwZGF0ZV9kZGI6Ci0JaWYgKGZ3X2RkYl9lbnRyeSkKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKLQkJCQkgIGZ3X2RkYl9lbnRyeSwgZndfZGRiX2VudHJ5X2RtYSk7Ci0KLWV4aXRfdXBkYXRlX2RkYl9ub19mcmVlOgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKgotICogcWxhNHh4eF9hbGxvY19kZGIgLSBhbGxvY2F0ZSBkZXZpY2UgZGF0YWJhc2UgZW50cnkKLSAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICogQGZ3X2RkYl9pbmRleDogRmlybXdhcmUncyBkZXZpY2UgZGF0YWJhc2UgaW5kZXgKLSAqCi0gKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGEgZGRiX2VudHJ5LCBpdGl0aWFsaXplcyBzb21lIHZhbHVlcywgYW5kCi0gKiBpbnNlcnRzIGl0IGludG8gdGhlIGRkYiBsaXN0LgotICoqLwotc3RhdGljIHN0cnVjdCBkZGJfZW50cnkgKiBxbGE0eHh4X2FsbG9jX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkJCSAgICB1aW50MzJfdCBmd19kZGJfaW5kZXgpCi17Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGZ3X2RkYl9pbmRleCBbJWRdXG4iLCBoYS0+aG9zdF9ubywKLQkJICAgICAgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCi0JZGRiX2VudHJ5ID0gcWxhNHh4eF9hbGxvY19zZXNzKGhhKTsKLQlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgotCQkJICAgICAgInRvIGFkZCBmd19kZGJfaW5kZXggWyVkXVxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCXJldHVybiBkZGJfZW50cnk7Ci0JfQotCi0JZGRiX2VudHJ5LT5md19kZGJfaW5kZXggPSBmd19kZGJfaW5kZXg7Ci0JYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyLCBJTlZBTElEX0VOVFJZKTsKLQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIDApOwotCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl9yZXRyeV9jb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmZGRiX2VudHJ5LT5zdGF0ZSwgRERCX1NUQVRFX09OTElORSk7Ci0JbGlzdF9hZGRfdGFpbCgmZGRiX2VudHJ5LT5saXN0LCAmaGEtPmRkYl9saXN0KTsKLQloYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdID0gZGRiX2VudHJ5OwotCWhhLT50b3RfZGRicysrOwotCi0JcmV0dXJuIGRkYl9lbnRyeTsKLX0KLQotLyoqCi0gKiBxbGE0X2lzX3JlbG9naW5fYWxsb3dlZCAtIEFyZSB3ZSBhbGxvd2VkIHRvIGxvZ2luPwotICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKiBAY29ubl9lcnI6IExhc3QgY29ubmVjdGlvbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRkYgotICoKLSAqIFRoaXMgcm91dGluZSB0ZXN0cyB0aGUgZ2l2ZW4gY29ubmVjdGlvbiBlcnJvciB0byBkZXRlcm1pbmUgaWYKLSAqIHdlIGFyZSBhbGxvd2VkIHRvIGxvZ2luLgotICoqLwotaW50IHFsYTRfaXNfcmVsb2dpbl9hbGxvd2VkKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgY29ubl9lcnIpCi17Ci0JdWludDMyX3QgZXJyX2NvZGUsIGxvZ2luX3JzcF9zdHNfY2xhc3M7Ci0JaW50IHJlbG9naW4gPSAxOwotCi0JZXJyX2NvZGUgPSAoKGNvbm5fZXJyICYgMHgwMGZmMDAwMCkgPj4gMTYpOwotCWxvZ2luX3JzcF9zdHNfY2xhc3MgPSAoKGNvbm5fZXJyICYgMHgwMDAwZmYwMCkgPj4gOCk7Ci0JaWYgKGVycl9jb2RlID09IDB4MWMgfHwgZXJyX2NvZGUgPT0gMHgwNikgewotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIjogY29ubl9lcnI9MHglMDh4LCBzZW5kIHRhcmdldCBjb21wbGV0ZWQiCi0JCSAgICAiIG9yIGFjY2VzcyBkZW5pZWQgZmFpbHVyZVxuIiwgY29ubl9lcnIpKTsKLQkJcmVsb2dpbiA9IDA7Ci0JfQotCWlmICgoZXJyX2NvZGUgPT0gMHgwOCkgJiYgKGxvZ2luX3JzcF9zdHNfY2xhc3MgPT0gMHgwMikpIHsKLQkJLyogTG9naW4gUmVzcG9uc2UgUERVIHJldHVybmVkIGFuIGVycm9yLgotCQkgICBMb2dpbiBSZXNwb25zZSBTdGF0dXMgaW4gRXJyb3IgQ29kZSBEZXRhaWwKLQkJICAgaW5kaWNhdGVzIGxvZ2luIHNob3VsZCBub3QgYmUgcmV0cmllZC4qLwotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIjogY29ubl9lcnI9MHglMDh4LCBkbyBub3QgcmV0cnkgcmVsb2dpblxuIiwKLQkJICAgIGNvbm5fZXJyKSk7Ci0JCXJlbG9naW4gPSAwOwotCX0KLQotCXJldHVybiByZWxvZ2luOwotfQotCi1zdGF0aWMgdm9pZCBxbGE0eHh4X2ZsdXNoX0FFTlMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXVuc2lnbmVkIGxvbmcgd3RpbWU7Ci0KLQkvKiBGbHVzaCB0aGUgMHg4MDE0IEFFTiBmcm9tIHRoZSBmaXJtd2FyZSBhcyBhIHJlc3VsdCBvZgotCSAqIEF1dG8gY29ubmVjdC4gV2UgYXJlIGJhc2ljYWxseSBkb2luZyBnZXRfZmlybXdhcmVfZGRiKCkKLQkgKiB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGxvZyBiYWNrIGluIG9yIG5vdC4KLQkgKiBUcnlpbmcgdG8gZG8gYSBzZXQgZGRiIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCAweDgwMTQKLQkgKiB3aWxsIHJlc3VsdCBpbiBhbm90aGVyIHNldF9kZGIoKSBmb3IgdGhlIHNhbWUgZGRiLiBJbiBvdGhlcgotCSAqIHdvcmRzIHRoZXJlIHdpbGwgYmUgc3RhbGUgZW50cmllcyBpbiB0aGUgYWVuX3EuCi0JICovCi0Jd3RpbWUgPSBqaWZmaWVzICsgKDIgKiBIWik7Ci0JZG8gewotCQlpZiAocWxhNHh4eF9nZXRfZmlybXdhcmVfc3RhdGUoaGEpID09IFFMQV9TVUNDRVNTKQotCQkJaWYgKGhhLT5maXJtd2FyZV9zdGF0ZSAmIChCSVRfMiB8IEJJVF8wKSkKLQkJCQlyZXR1cm47Ci0KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEUENfQUVOLCAmaGEtPmRwY19mbGFncykpCi0JCQlxbGE0eHh4X3Byb2Nlc3NfYWVuKGhhLCBGTFVTSF9EREJfQ0hBTkdFRF9BRU5TKTsKLQotCQltc2xlZXAoMTAwMCk7Ci0JfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgd3RpbWUpKTsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X2J1aWxkX2RkYl9saXN0IC0gYnVpbGRzIGRyaXZlciBkZGIgbGlzdAotICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCi0gKgotICogVGhpcyByb3V0aW5lIHNlYXJjaGVzIGZvciBhbGwgdmFsaWQgZmlybXdhcmUgZGRiIGVudHJpZXMgYW5kIGJ1aWxkcwotICogYW4gaW50ZXJuYWwgZGRiIGxpc3QuIERkYnMgdGhhdCBhcmUgY29uc2lkZXJlZCB2YWxpZCBhcmUgdGhvc2Ugd2l0aAotICogYSBkZXZpY2Ugc3RhdGUgb2YgU0VTU0lPTl9BQ1RJVkUuCi0gKiBBIHJlbG9naW4gKHNldF9kZGIpIGlzIGlzc3VlZCBmb3IgRERCcyB0aGF0IGFyZSBub3Qgb25saW5lLgotICoqLwotc3RhdGljIGludCBxbGE0eHh4X2J1aWxkX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKLXsKLQlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwotCXVpbnQzMl90IGZ3X2RkYl9pbmRleCA9IDA7Ci0JdWludDMyX3QgbmV4dF9md19kZGJfaW5kZXggPSAwOwotCXVpbnQzMl90IGRkYl9zdGF0ZTsKLQl1aW50MzJfdCBjb25uX2VycjsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0Jc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5ID0gTlVMTDsKLQlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7Ci0JdWludDMyX3QgaXB2Nl9kZXZpY2U7Ci0JdWludDMyX3QgbmV3X3RndDsKLQotCXFsYTR4eHhfZmx1c2hfQUVOUyhoYSk7Ci0KLQlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKLQkJCSZmd19kZGJfZW50cnlfZG1hLCBHRlBfS0VSTkVMKTsKLQlpZiAoZndfZGRiX2VudHJ5ID09IE5VTEwpIHsKLQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBETUEgYWxsb2MgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKSk7Ci0KLQkJZ290byBleGl0X2J1aWxkX2RkYl9saXN0X25vX2ZyZWU7Ci0JfQotCi0JcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5pdGlhbGl6aW5nIEREQnMgLi4uXG4iKTsKLQlmb3IgKGZ3X2RkYl9pbmRleCA9IDA7IGZ3X2RkYl9pbmRleCA8IE1BWF9EREJfRU5UUklFUzsKLQkgICAgIGZ3X2RkYl9pbmRleCA9IG5leHRfZndfZGRiX2luZGV4KSB7Ci0JCS8qIEZpcnN0LCBsZXQncyBzZWUgaWYgYSBkZXZpY2UgZXhpc3RzIGhlcmUgKi8KLQkJaWYgKHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsIGZ3X2RkYl9lbnRyeSwKLQkJCQkJICAgIDAsIE5VTEwsICZuZXh0X2Z3X2RkYl9pbmRleCwKLQkJCQkJICAgICZkZGJfc3RhdGUsICZjb25uX2VyciwKLQkJCQkJICAgIE5VTEwsIE5VTEwpID09Ci0JCQkJCSAgICBRTEFfRVJST1IpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBnZXRfZGRiX2VudHJ5LCAiCi0JCQkJICAgICAgImZ3X2RkYl9pbmRleCAlZCBmYWlsZWQiLCBoYS0+aG9zdF9ubywKLQkJCQkgICAgICBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Q7Ci0JCX0KLQotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogR2V0dGluZyBEREJbJWRdIGRkYnN0YXRlPTB4JXgsICIKLQkJCSAgICAgICJuZXh0X2Z3X2RkYl9pbmRleD0lZC5cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICAgIGZ3X2RkYl9pbmRleCwgZGRiX3N0YXRlLCBuZXh0X2Z3X2RkYl9pbmRleCkpOwotCi0JCS8qIElzc3VlIHJlbG9naW4sIGlmIG5lY2Vzc2FyeS4gKi8KLQkJaWYgKGRkYl9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9GQUlMRUQgfHwKLQkJICAgIGRkYl9zdGF0ZSA9PSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkUpIHsKLQkJCS8qIFRyeSBhbmQgbG9naW4gdG8gZGV2aWNlICovCi0JCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogTG9naW4gdG8gRERCWyVkXVxuIiwKLQkJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCQkJaXB2Nl9kZXZpY2UgPSBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPm9wdGlvbnMpICYKLQkJCQkJRERCX09QVF9JUFY2X0RFVklDRTsKLQkJCWlmIChxbGE0X2lzX3JlbG9naW5fYWxsb3dlZChoYSwgY29ubl9lcnIpICYmCi0JCQkJCSgoIWlwdjZfZGV2aWNlICYmCi0JCQkJCSAgKigodWludDMyX3QgKilmd19kZGJfZW50cnktPmlwX2FkZHIpKQotCQkJCQkgfHwgaXB2Nl9kZXZpY2UpKSB7Ci0JCQkJcWxhNHh4eF9zZXRfZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsIDApOwotCQkJCWlmIChxbGE0eHh4X2dldF9md2RkYl9lbnRyeShoYSwgZndfZGRiX2luZGV4LAotCQkJCQkJCU5VTEwsIDAsIE5VTEwsCi0JCQkJCQkJJm5leHRfZndfZGRiX2luZGV4LAotCQkJCQkJCSZkZGJfc3RhdGUsICZjb25uX2VyciwKLQkJCQkJCQlOVUxMLCBOVUxMKQotCQkJCQkJPT0gUUxBX0VSUk9SKSB7Ci0JCQkJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiIKLQkJCQkJCSJnZXRfZGRiX2VudHJ5ICVkIGZhaWxlZFxuIiwKLQkJCQkJCWhhLT5ob3N0X25vLAotCQkJCQkJX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCQkJCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRkYl9zdGF0ZSAhPSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpCi0JCQlnb3RvIG5leHRfb25lOwotCQkvKgotCQkgKiBpZiBmd19kZGIgd2l0aCBzZXNzaW9uIGFjdGl2ZSBzdGF0ZSBmb3VuZCwKLQkJICogYWRkIHRvIGRkYl9saXN0Ci0JCSAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRERCWyVkXSBhZGRlZCB0byBsaXN0XG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpKTsKLQotCQkvKiBBZGQgRERCIHRvIGludGVybmFsIG91ciBkZGIgbGlzdC4gKi8KLQkJZGRiX2VudHJ5ID0gcWxhNHh4eF9nZXRfZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsICZuZXdfdGd0KTsKLQkJaWYgKGRkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCi0JCQkJICAgICAgImZvciBkZXZpY2UgYXQgZndfZGRiX2luZGV4ICVkXG4iLAotCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZndfZGRiX2luZGV4KSk7Ci0JCQlnb3RvIGV4aXRfYnVpbGRfZGRiX2xpc3Q7Ci0JCX0KLQkJLyogRmlsbCBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLwotCQlpZiAocWxhNHh4eF91cGRhdGVfZGRiX2VudHJ5KGhhLCBkZGJfZW50cnksIGZ3X2RkYl9pbmRleCkgPT0KLQkJICAgIFFMQV9FUlJPUikgewotCQkJaGEtPmZ3X2RkYl9pbmRleF9tYXBbZndfZGRiX2luZGV4XSA9Ci0JCQkJKHN0cnVjdCBkZGJfZW50cnkgKilJTlZBTElEX0VOVFJZOwotCi0JCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogdXBkYXRlX2RkYl9lbnRyeSBmYWlsZWQgIgotCQkJCSAgICAgICJmb3IgZndfZGRiX2luZGV4ICVkLlxuIiwKLQkJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGZ3X2RkYl9pbmRleCkpOwotCQkJZ290byBleGl0X2J1aWxkX2RkYl9saXN0OwotCQl9Ci0KLW5leHRfb25lOgotCQkvKiBXZSBrbm93IHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3QgZGV2aWNlIHdoZW4KLQkJICogbmV4dF9md19kZGJfaW5kZXggaXMgMCAqLwotCQlpZiAobmV4dF9md19kZGJfaW5kZXggPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCXN0YXR1cyA9IFFMQV9TVUNDRVNTOwotCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkREQiBsaXN0IGRvbmUuLlxuIik7Ci0KLWV4aXRfYnVpbGRfZGRiX2xpc3Q6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwgZndfZGRiX2VudHJ5LAotCQlmd19kZGJfZW50cnlfZG1hKTsKLQotZXhpdF9idWlsZF9kZGJfbGlzdF9ub19mcmVlOgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgcWxhNHh4eF9pbml0aWFsaXplX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKLXsKLQl1aW50MTZfdCBmd19kZGJfaW5kZXg7Ci0JaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOwotCi0JLyogZnJlZSB0aGUgZGRiIGxpc3QgaWYgaXMgbm90IGVtcHR5ICovCi0JaWYgKCFsaXN0X2VtcHR5KCZoYS0+ZGRiX2xpc3QpKQotCQlxbGE0eHh4X2ZyZWVfZGRiX2xpc3QoaGEpOwotCi0JZm9yIChmd19kZGJfaW5kZXggPSAwOyBmd19kZGJfaW5kZXggPCBNQVhfRERCX0VOVFJJRVM7IGZ3X2RkYl9pbmRleCsrKQotCQloYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdID0KLQkJICAgIChzdHJ1Y3QgZGRiX2VudHJ5ICopSU5WQUxJRF9FTlRSWTsKLQotCWhhLT50b3RfZGRicyA9IDA7Ci0KLQkvKiBQZXJmb3JtIGRldmljZSBkaXNjb3ZlcnkgYW5kIGJ1aWxkIGRkYiBsaXN0LiAqLwotCXN0YXR1cyA9IHFsYTR4eHhfYnVpbGRfZGRiX2xpc3QoaGEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X3JlaW5pdGlhbGl6ZV9kZGJfbGlzdCAtIHVwZGF0ZSB0aGUgZHJpdmVyIGRkYiBsaXN0Ci0gKiBAaGE6IHBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgb2J0YWlucyBkZXZpY2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgRi9XIGRhdGFiYXNlIGFmdGVyCi0gKiBmaXJtd2FyZSBvciBhZGFwdGVyIHJlc2V0cy4gIFRoZSBkZXZpY2UgdGFibGUgaXMgcHJlc2VydmVkLgotICoqLwotaW50IHFsYTR4eHhfcmVpbml0aWFsaXplX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKLXsKLQlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCAqZGV0ZW1wOwotCi0JLyogVXBkYXRlIHRoZSBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIGFsbCBkZXZpY2VzLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGRldGVtcCwgJmhhLT5kZGJfbGlzdCwgbGlzdCkgewotCQlxbGE0eHh4X3VwZGF0ZV9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeSwKLQkJCQkJIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKLQkJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKLQkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9PTkxJTkUpOwotCQkJREVCVUcyKHByaW50ayAoInNjc2klbGQ6ICVzOiBkZGIgaW5kZXggWyVkXSBtYXJrZWQgIgotCQkJCSAgICAgICAiT05MSU5FXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkJICAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7Ci0JCQlpc2NzaV91bmJsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKLQkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgPT0gRERCX1NUQVRFX09OTElORSkKLQkJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhoYSwgZGRiX2VudHJ5KTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBxbGE0eHh4X3JlbG9naW5fZGV2aWNlIC0gcmUtZXN0YWJsaXNoIHNlc3Npb24KLSAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICogQGRkYl9lbnRyeTogUG9pbnRlciB0byBkZXZpY2UgZGF0YWJhc2UgZW50cnkKLSAqCi0gKiBUaGlzIHJvdXRpbmUgZG9lcyBhIHNlc3Npb24gcmVsb2dpbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgotICogVGhlIGRkYiBlbnRyeSBtdXN0IGJlIGFzc2lnbmVkIHByaW9yIHRvIG1ha2luZyB0aGlzIGNhbGwuCi0gKiovCi1pbnQgcWxhNHh4eF9yZWxvZ2luX2RldmljZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkgICBzdHJ1Y3QgZGRiX2VudHJ5ICogZGRiX2VudHJ5KQotewotCXVpbnQxNl90IHJlbG9naW5fdGltZXI7Ci0KLQlyZWxvZ2luX3RpbWVyID0gbWF4KGRkYl9lbnRyeS0+ZGVmYXVsdF9yZWxvZ2luX3RpbWVvdXQsCi0JCQkgICAgKHVpbnQxNl90KVJFTE9HSU5fVE9WKTsKLQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIHJlbG9naW5fdGltZXIpOwotCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogUmVsb2dpbiBkZGIgWyVkXS4gVE9WPSVkXG4iLCBoYS0+aG9zdF9ubywKLQkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIHJlbG9naW5fdGltZXIpKTsKLQotCXFsYTR4eHhfc2V0X2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIDApOwotCi0JcmV0dXJuIFFMQV9TVUNDRVNTOworCW1lbWNweShoYS0+bW9kZWxfbmFtZSwgYm9hcmRfaWRfc3RyaW5nLCBzaXplKTsKIH0KIAogc3RhdGljIGludCBxbGE0eHh4X2NvbmZpZ19udnJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCkBAIC05ODMsNiArNDk2LDEyIEBACiAJCWVsc2UKIAkJCXJldHVybiBRTEFfRVJST1I7CiAJfQorCisJaWYgKGlzX3FsYTQwMjIoaGEpIHx8IGlzX3FsYTQwMzIoaGEpKQorCQlxbGE0eHh4X3NldF9tb2RlbF9pbmZvKGhhKTsKKwllbHNlCisJCXN0cmNweShoYS0+bW9kZWxfbmFtZSwgIlFMQTQwMTAiKTsKKwogCURFQlVHKHByaW50aygic2NzaSVsZDogJXM6IFNldHRpbmcgZXh0SHdDb25maWcgdG8gMHhGRkZGJTA0eFxuIiwKIAkJICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGV4dEh3Q29uZmlnLkFzdWludDMyX3QpKTsKIApAQCAtMTI0NiwyMyArNzY1LDU2IEBACiAJfQogCXJldHVybiBzdGF0dXM7CiB9CisvKioKKyAqIHFsYTR4eHhfZnJlZV9kZGJfaW5kZXggLSBGcmVlIEREQnMgcmVzZXJ2ZWQgYnkgZmlybXdhcmUKKyAqIEBoYTogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFNpbmNlIGZpcm13YXJlIGlzIG5vdCBydW5uaW5nIGluIGF1dG9jb25uZWN0IG1vZGUgdGhlIEREQiBpbmRpY2VzIHNob3VsZAorICogYmUgZnJlZWQgc28gdGhhdCB3aGVuIGxvZ2luIGhhcHBlbnMgZnJvbSB1c2VyIHNwYWNlIHRoZXJlIGFyZSBmcmVlIEREQgorICogaW5kaWNlcyBhdmFpbGFibGUuCisgKiovCitzdGF0aWMgdm9pZCBxbGE0eHh4X2ZyZWVfZGRiX2luZGV4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpbnQgbWF4X2RkYnM7CisJaW50IHJldDsKKwl1aW50MzJfdCBpZHggPSAwLCBuZXh0X2lkeCA9IDA7CisJdWludDMyX3Qgc3RhdGUgPSAwLCBjb25uX2VyciA9IDA7CisKKwltYXhfZGRicyA9ICBpc19xbGE0MFhYKGhhKSA/IE1BWF9QUlNUX0RFVl9EQl9FTlRSSUVTIDoKKwkJCQkgICAgIE1BWF9ERVZfREJfRU5UUklFUzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWF4X2RkYnM7IGlkeCA9IG5leHRfaWR4KSB7CisJCXJldCA9IHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBpZHgsIE5VTEwsIDAsIE5VTEwsCisJCQkJCSAgICAgICZuZXh0X2lkeCwgJnN0YXRlLCAmY29ubl9lcnIsCisJCQkJCQlOVUxMLCBOVUxMKTsKKwkJaWYgKHJldCA9PSBRTEFfRVJST1IpCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXRlID09IEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRSB8fAorCQkgICAgc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fRkFJTEVEKSB7CisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQkgICJGcmVlaW5nIEREQiBpbmRleCA9IDB4JXhcbiIsIGlkeCkpOworCQkJcmV0ID0gcWxhNHh4eF9jbGVhcl9kZGJfZW50cnkoaGEsIGlkeCk7CisJCQlpZiAocmV0ID09IFFMQV9FUlJPUikKKwkJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkJICAgIlVuYWJsZSB0byBjbGVhciBEREIgaW5kZXggPSAiCisJCQkJCSAgICIweCV4XG4iLCBpZHgpOworCQl9CisJCWlmIChuZXh0X2lkeCA9PSAwKQorCQkJYnJlYWs7CisJfQorfQogCiAKIC8qKgogICogcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIgLSBpbml0aWFpbGl6ZXMgaGJhCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEByZW5ld19kZGJfbGlzdDogSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWRhcHRlcidzIGRkYiBsaXN0Ci0gKglhZnRlciBhZGFwdGVyIHJlY292ZXJ5IGhhcyBjb21wbGV0ZWQuCi0gKgkwPXByZXNlcnZlIGRkYiBsaXN0LCAxPWRlc3Ryb3kgYW5kIHJlYnVpbGQgZGRiIGxpc3QKICAqCiAgKiBUaGlzIHJvdXRpbmUgcGFyZm9ybXMgYWxsIG9mIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlci4KICAqCiAgKiovCi1pbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJICAgICAgIHVpbnQ4X3QgcmVuZXdfZGRiX2xpc3QpCitpbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7Ci0JaW50OF90IGlwX2FkZHJlc3NbSVBfQUREUl9MRU5dID0gezB9IDsKIAogCWhhLT5lZXByb21fY21kX2RhdGEgPSAwOwogCkBAIC0xMjg4LDQ3ICs4NDAsOCBAQAogCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKQogCQlnb3RvIGV4aXRfaW5pdF9oYmE7CiAKLQkvKgotCSAqIEZXIGlzIHdhaXRpbmcgdG8gZ2V0IGFuIElQIGFkZHJlc3MgZnJvbSBESENQIHNlcnZlcjogU2tpcCBidWlsZGluZwotCSAqIHRoZSBkZGJfbGlzdCBhbmQgd2FpdCBmb3IgREhDUCBsZWFzZSBhY3F1aXJlZCBhZW4gdG8gY29tZSBpbgotCSAqIGZvbGxvd2VkIGJ5IDB4ODAxNCBhZW4iIHRvIHRyaWdnZXIgdGhlIHRndCBkaXNjb3ZlcnkgcHJvY2Vzcy4KLQkgKi8KLQlpZiAoaGEtPmZpcm13YXJlX3N0YXRlICYgRldfU1RBVEVfQ09ORklHVVJJTkdfSVApCi0JCWdvdG8gZXhpdF9pbml0X29ubGluZTsKKwlxbGE0eHh4X2ZyZWVfZGRiX2luZGV4KGhhKTsKIAotCS8qIFNraXAgZGV2aWNlIGRpc2NvdmVyeSBpZiBpcCBhbmQgc3VibmV0IGlzIHplcm8gKi8KLQlpZiAobWVtY21wKGhhLT5pcF9hZGRyZXNzLCBpcF9hZGRyZXNzLCBJUF9BRERSX0xFTikgPT0gMCB8fAotCSAgICBtZW1jbXAoaGEtPnN1Ym5ldF9tYXNrLCBpcF9hZGRyZXNzLCBJUF9BRERSX0xFTikgPT0gMCkKLQkJZ290byBleGl0X2luaXRfb25saW5lOwotCi0JaWYgKHJlbmV3X2RkYl9saXN0ID09IFBSRVNFUlZFX0REQl9MSVNUKSB7Ci0JCS8qCi0JCSAqIFdlIHdhbnQgdG8gcHJlc2VydmUgbHVuIHN0YXRlcyAoaS5lLiBzdXNwZW5kZWQsIGV0Yy4pCi0JCSAqIGZvciByZWNvdmVyeSBpbml0aWF0ZWQgYnkgdGhlIGRyaXZlci4gIFNvIGp1c3QgdXBkYXRlCi0JCSAqIHRoZSBkZXZpY2Ugc3RhdGVzIGZvciB0aGUgZXhpc3RpbmcgZGRiX2xpc3QuCi0JCSAqLwotCQlxbGE0eHh4X3JlaW5pdGlhbGl6ZV9kZGJfbGlzdChoYSk7Ci0JfSBlbHNlIGlmIChyZW5ld19kZGJfbGlzdCA9PSBSRUJVSUxEX0REQl9MSVNUKSB7Ci0JCS8qCi0JCSAqIFdlIHdhbnQgdG8gYnVpbGQgdGhlIGRkYl9saXN0IGZyb20gc2NyYXRjaCBkdXJpbmcKLQkJICogZHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCByZWNvdmVyeSBpbml0aWF0ZWQgYnkgdGhlCi0JCSAqIElOVF9IQkFfUkVTRVQgSU9DVEwuCi0JCSAqLwotCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfZGRiX2xpc3QoaGEpOwotCQlpZiAoc3RhdHVzID09IFFMQV9FUlJPUikgewotCQkJREVCVUcyKHByaW50aygiJXMoJWxkKSBFcnJvciBvY2N1cnJlZCBkdXJpbmcgYnVpbGQiCi0JCQkJICAgICAgImRkYiBsaXN0XG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKLQkJCWdvdG8gZXhpdF9pbml0X2hiYTsKLQkJfQotCi0JfQotCWlmICghaGEtPnRvdF9kZGJzKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6IEZhaWxlZCB0byBpbml0aWFsaXplIGRldmljZXMgb3Igbm9uZSAiCi0JCQkgICAgICAicHJlc2VudCBpbiBGaXJtd2FyZSBkZXZpY2UgZGF0YWJhc2VcbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubykpOwotCX0KLQotZXhpdF9pbml0X29ubGluZToKIAlzZXRfYml0KEFGX09OTElORSwgJmhhLT5mbGFncyk7CiBleGl0X2luaXRfaGJhOgogCWlmIChpc19xbGE4MDIyKGhhKSAmJiAoc3RhdHVzID09IFFMQV9FUlJPUikpIHsKQEAgLTEzNDMsNjEgKzg1Niw2IEBACiB9CiAKIC8qKgotICogcWxhNHh4eF9hZGRfZGV2aWNlX2R5bmFtaWNhbGx5IC0gZGRiIGFkZGl0aW9uIGR1ZSB0byBhbiBBRU4KLSAqIEBoYTogIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEBmd19kZGJfaW5kZXg6ICBGaXJtd2FyZSdzIGRldmljZSBkYXRhYmFzZSBpbmRleAotICoKLSAqIFRoaXMgcm91dGluZSBwcm9jZXNzZXMgYWRkcyBhIGRldmljZSBhcyBhIHJlc3VsdCBvZiBhbiA4MDE0aCBBRU4uCi0gKiovCi1zdGF0aWMgdm9pZCBxbGE0eHh4X2FkZF9kZXZpY2VfZHluYW1pY2FsbHkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJCQkgICB1aW50MzJfdCBmd19kZGJfaW5kZXgpCi17Ci0Jc3RydWN0IGRkYl9lbnRyeSAqIGRkYl9lbnRyeTsKLQl1aW50MzJfdCBuZXdfdGd0OwotCi0JLyogRmlyc3QgYWxsb2NhdGUgYSBkZXZpY2Ugc3RydWN0dXJlICovCi0JZGRiX2VudHJ5ID0gcWxhNHh4eF9nZXRfZGRiX2VudHJ5KGhhLCBmd19kZGJfaW5kZXgsICZuZXdfdGd0KTsKLQlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICJzY3NpJWxkOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIGFkZCAiCi0JCQkgICAgICAiZndfZGRiX2luZGV4ICVkXG4iLCBoYS0+aG9zdF9ubywgZndfZGRiX2luZGV4KSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIW5ld190Z3QgJiYgKGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4ICE9IGZ3X2RkYl9pbmRleCkpIHsKLQkJLyogVGFyZ2V0IGhhcyBiZWVuIGJvdW5kIHRvIGEgbmV3IGZ3X2RkYl9pbmRleCAqLwotCQlxbGE0eHh4X2ZyZWVfZGRiKGhhLCBkZGJfZW50cnkpOwotCQlkZGJfZW50cnkgPSBxbGE0eHh4X2FsbG9jX2RkYihoYSwgZndfZGRiX2luZGV4KTsKLQkJaWYgKGRkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJzY3NpJWxkOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IgotCQkJCSIgdG8gYWRkIGZ3X2RkYl9pbmRleCAlZFxuIiwKLQkJCQloYS0+aG9zdF9ubywgZndfZGRiX2luZGV4KSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JaWYgKHFsYTR4eHhfdXBkYXRlX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LCBmd19kZGJfaW5kZXgpID09Ci0JCQkJICAgIFFMQV9FUlJPUikgewotCQloYS0+ZndfZGRiX2luZGV4X21hcFtmd19kZGJfaW5kZXhdID0KLQkJCQkJKHN0cnVjdCBkZGJfZW50cnkgKilJTlZBTElEX0VOVFJZOwotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgInNjc2klbGQ6IGZhaWxlZCB0byBhZGQgbmV3IGRldmljZSBhdCBpbmRleCAiCi0JCQkgICAgICAiWyVkXVxuIFVuYWJsZSB0byByZXRyaWV2ZSBmdyBkZGIgZW50cnlcbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgZndfZGRiX2luZGV4KSk7Ci0JCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocWxhNHh4eF9hZGRfc2VzcyhkZGJfZW50cnkpKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAic2NzaSVsZDogZmFpbGVkIHRvIGFkZCBuZXcgZGV2aWNlIGF0IGluZGV4ICIKLQkJCSAgICAgICJbJWRdXG4gVW5hYmxlIHRvIGFkZCBjb25uZWN0aW9uIGFuZCBzZXNzaW9uXG4iLAotCQkJICAgICAgaGEtPmhvc3Rfbm8sIGZ3X2RkYl9pbmRleCkpOwotCQlxbGE0eHh4X2ZyZWVfZGRiKGhhLCBkZGJfZW50cnkpOwotCX0KLX0KLQotLyoqCiAgKiBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQgLSBwcm9jZXNzIGRkYiBzdGF0ZSBjaGFuZ2UKICAqIEBoYSAtIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KICAqIEBmd19kZGJfaW5kZXggLSBGaXJtd2FyZSdzIGRldmljZSBkYXRhYmFzZSBpbmRleApAQCAtMTQwOSw4OCArODY3LDk0IEBACiAJCXVpbnQzMl90IHN0YXRlLCB1aW50MzJfdCBjb25uX2VycikKIHsKIAlzdHJ1Y3QgZGRiX2VudHJ5ICogZGRiX2VudHJ5OworCXVpbnQzMl90IG9sZF9md19kZGJfZGV2aWNlX3N0YXRlOworCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CiAKIAkvKiBjaGVjayBmb3Igb3V0IG9mIHJhbmdlIGluZGV4ICovCiAJaWYgKGZ3X2RkYl9pbmRleCA+PSBNQVhfRERCX0VOVFJJRVMpCi0JCXJldHVybiBRTEFfRVJST1I7CisJCWdvdG8gZXhpdF9kZGJfZXZlbnQ7CiAKIAkvKiBHZXQgdGhlIGNvcnJlc3BvbmdpbmcgZGRiIGVudHJ5ICovCiAJZGRiX2VudHJ5ID0gcWxhNHh4eF9sb29rdXBfZGRiX2J5X2Z3X2luZGV4KGhhLCBmd19kZGJfaW5kZXgpOwogCS8qIERldmljZSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QgaW4gb3VyIGRhdGFiYXNlLiAqLwogCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgewotCQlpZiAoc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fQUNUSVZFKQotCQkJcWxhNHh4eF9hZGRfZGV2aWNlX2R5bmFtaWNhbGx5KGhhLCBmd19kZGJfaW5kZXgpOwotCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IE5vIGRkYl9lbnRyeSBhdCBGVyBpbmRleCBbJWRdXG4iLAorCQkJICAgX19mdW5jX18sIGZ3X2RkYl9pbmRleCk7CisKKwkJaWYgKHN0YXRlID09IEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRSkKKwkJCWNsZWFyX2JpdChmd19kZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCk7CisKKwkJZ290byBleGl0X2RkYl9ldmVudDsKIAl9CiAKLQkvKiBEZXZpY2UgYWxyZWFkeSBleGlzdHMgaW4gb3VyIGRhdGFiYXNlLiAqLwotCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzIEREQiAtIG9sZCBzdGF0ZT0gMHgleCwgbmV3IHN0YXRlPTB4JXggZm9yICIKLQkJICAgICAgImluZGV4IFslZF1cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLCBzdGF0ZSwgZndfZGRiX2luZGV4KSk7CisJb2xkX2Z3X2RkYl9kZXZpY2Vfc3RhdGUgPSBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGU7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgIiVzOiBEREIgLSBvbGQgc3RhdGUgPSAweCV4LCBuZXcgc3RhdGUgPSAweCV4IGZvciAiCisJCQkgICJpbmRleCBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlLCBzdGF0ZSwgZndfZGRiX2luZGV4KSk7CiAKIAlkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPSBzdGF0ZTsKLQkvKiBEZXZpY2UgaXMgYmFjayBvbmxpbmUuICovCi0JaWYgKChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fQUNUSVZFKSAmJgotCSAgIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX09OTElORSkpIHsKLQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5zdGF0ZSwgRERCX1NUQVRFX09OTElORSk7Ci0JCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl9yZXRyeV9jb3VudCwgMCk7Ci0JCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lciwgMCk7Ci0JCWNsZWFyX2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncyk7Ci0JCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCQlpc2NzaV9zZXNzaW9uX2V2ZW50KGRkYl9lbnRyeS0+c2VzcywKLQkJCQkgICAgSVNDU0lfS0VWRU5UX0NSRUFURV9TRVNTSU9OKTsKLQkJLyoKLQkJICogQ2hhbmdlIHRoZSBsdW4gc3RhdGUgdG8gUkVBRFkgaW4gY2FzZSB0aGUgbHVuIFRJTUVPVVQgYmVmb3JlCi0JCSAqIHRoZSBkZXZpY2UgY2FtZSBiYWNrLgotCQkgKi8KLQl9IGVsc2UgaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSAhPSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKLQkJLyogRGV2aWNlIHdlbnQgYXdheSwgbWFyayBkZXZpY2UgbWlzc2luZyAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9PTkxJTkUpIHsKLQkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlcyBtYXJrIG1pc3NpbmcgIgotCQkJCQkiZGRiX2VudHJ5IDB4JXAgc2VzcyAweCVwIGNvbm4gMHglcFxuIiwKLQkJCQkJX19mdW5jX18sIGRkYl9lbnRyeSwKLQkJCQkJZGRiX2VudHJ5LT5zZXNzLCBkZGJfZW50cnktPmNvbm4pKTsKLQkJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhoYSwgZGRiX2VudHJ5KTsKLQkJfQogCi0JCS8qCi0JCSAqIFJlbG9naW4gaWYgZGV2aWNlIHN0YXRlIGNoYW5nZWQgdG8gYSBub3QgYWN0aXZlIHN0YXRlLgotCQkgKiBIb3dldmVyLCBkbyBub3QgcmVsb2dpbiBpZiBhIFJFTE9HSU4gaXMgaW4gcHJvY2Vzcywgb3IKLQkJICogd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlbG9naW4gdG8gdGhpcyBEREIuCi0JCSAqLwotCQlpZiAoZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID09IEREQl9EU19TRVNTSU9OX0ZBSUxFRCAmJgotCQkgICAgIXRlc3RfYml0KERGX1JFTE9HSU4sICZkZGJfZW50cnktPmZsYWdzKSAmJgotCQkgICAgcWxhNF9pc19yZWxvZ2luX2FsbG93ZWQoaGEsIGNvbm5fZXJyKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgdHJpZ2dlcnMgYSByZWxvZ2luLiAgQWZ0ZXIgdGhlIHJlbG9naW5fdGltZXIKLQkJCSAqIGV4cGlyZXMsIHRoZSByZWxvZ2luIGdldHMgc2NoZWR1bGVkLgkgV2UgbXVzdCB3YWl0IGEKLQkJCSAqIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgc2luY2UgcmVjZWl2aW5nIGFuIDB4ODAxNCBBRU4KLQkJCSAqIHdpdGggZmFpbGVkIGRldmljZV9zdGF0ZSBvciBhIGxvZ291dCByZXNwb25zZSBiZWZvcmUKLQkJCSAqIHdlIGNhbiBpc3N1ZSBhbm90aGVyIHJlbG9naW4uCi0JCQkgKi8KLQkJCS8qIEZpcm13YXJlIHBhZHMgdGhpcyB0aW1lb3V0OiAodGltZTJ3YWl0ICsxKS4KLQkJCSAqIERyaXZlciByZXRyeSB0byBsb2dpbiBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gRi9XLgotCQkJICogT3RoZXJ3aXNlIEYvVyB3aWxsIGZhaWwKLQkJCSAqIHNldF9kZGIoKSBtYnggY21kIHdpdGggMHg0MDA1IHNpbmNlIGl0IHN0aWxsCi0JCQkgKiBjb3VudGluZyBkb3duIGl0cyB0aW1lMndhaXQuCi0JCQkgKi8KLQkJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl90aW1lciwgMCk7Ci0JCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIsCi0JCQkJICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpOwotCQkJREVCVUcocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiWyVkXSAiCi0JCQkgICAgImluaXRpYXRlIHJlbG9naW4gYWZ0ZXIgJWQgc2Vjb25kc1xuIiwKLQkJCSAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCi0JCQkgICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpKTsKLQkJfSBlbHNlIHsKLQkJCURFQlVHKHByaW50aygic2NzaSVsZDogJXM6IGRkYlslZF0gIgotCQkJICAgICJyZWxvZ2luIG5vdCBpbml0aWF0ZWQsIHN0YXRlID0gJWQsICIKLQkJCSAgICAiZGRiX2VudHJ5LT5mbGFncyA9IDB4JWx4XG4iLAotCQkJICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKLQkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUsCi0JCQkgICAgZGRiX2VudHJ5LT5mbGFncykpOworCXN3aXRjaCAob2xkX2Z3X2RkYl9kZXZpY2Vfc3RhdGUpIHsKKwljYXNlIEREQl9EU19MT0dJTl9JTl9QUk9DRVNTOgorCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fQUNUSVZFOgorCQljYXNlIEREQl9EU19ESVNDT1ZFUlk6CisJCQlpc2NzaV9jb25uX3N0YXJ0KGRkYl9lbnRyeS0+Y29ubik7CisJCQlpc2NzaV9jb25uX2xvZ2luX2V2ZW50KGRkYl9lbnRyeS0+Y29ubiwKKwkJCQkJICAgICAgIElTQ1NJX0NPTk5fU1RBVEVfTE9HR0VEX0lOKTsKKwkJCXFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShoYSwgZGRiX2VudHJ5KTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fRkFJTEVEOgorCQljYXNlIEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRToKKwkJCWlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoZGRiX2VudHJ5LT5jb25uLAorCQkJCQkgICAgICAgSVNDU0lfQ09OTl9TVEFURV9GUkVFKTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CiAJCX0KKwkJYnJlYWs7CisJY2FzZSBEREJfRFNfU0VTU0lPTl9BQ1RJVkU6CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBEREJfRFNfU0VTU0lPTl9GQUlMRUQ6CisJCQkvKgorCQkJICogaXNjc2lfc2Vzc2lvbiBmYWlsdXJlICB3aWxsIGNhdXNlIHVzZXJzcGFjZSB0bworCQkJICogc3RvcCB0aGUgY29ubmVjdGlvbiB3aGljaCBpbiB0dXJuIHdvdWxkIGJsb2NrIHRoZQorCQkJICogaXNjc2lfc2Vzc2lvbiBhbmQgc3RhcnQgcmVsb2dpbgorCQkJICovCisJCQlpc2NzaV9zZXNzaW9uX2ZhaWx1cmUoZGRiX2VudHJ5LT5zZXNzLT5kZF9kYXRhLAorCQkJCQkgICAgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJY2FzZSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkU6CisJCQljbGVhcl9iaXQoZndfZGRiX2luZGV4LCBoYS0+ZGRiX2lkeF9tYXApOworCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEREQl9EU19TRVNTSU9OX0ZBSUxFRDoKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEREQl9EU19TRVNTSU9OX0FDVElWRToKKwkJY2FzZSBEREJfRFNfRElTQ09WRVJZOgorCQkJaXNjc2lfY29ubl9zdGFydChkZGJfZW50cnktPmNvbm4pOworCQkJaXNjc2lfY29ubl9sb2dpbl9ldmVudChkZGJfZW50cnktPmNvbm4sCisJCQkJCSAgICAgICBJU0NTSV9DT05OX1NUQVRFX0xPR0dFRF9JTik7CisJCQlxbGE0eHh4X3VwZGF0ZV9zZXNzaW9uX2Nvbm5fcGFyYW0oaGEsIGRkYl9lbnRyeSk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQljYXNlIEREQl9EU19TRVNTSU9OX0ZBSUxFRDoKKwkJCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShkZGJfZW50cnktPnNlc3MtPmRkX2RhdGEsCisJCQkJCSAgICAgIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogVW5rbm93biBFdmVudFxuIiwKKwkJCQlfX2Z1bmNfXykpOworCQlicmVhazsKIAl9Ci0JcmV0dXJuIFFMQV9TVUNDRVNTOworCitleGl0X2RkYl9ldmVudDoKKwlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lvY2IuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMKaW5kZXggNzVmY2Q4Mi4uNDEwNjY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lvY2IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW9jYi5jCkBAIC0zMTMsMTAgKzMxMyw4IEBACiAJY21kX2VudHJ5LT5oZHIuZW50cnlUeXBlID0gRVRfQ09NTUFORDsKIAljbWRfZW50cnktPmhhbmRsZSA9IGNwdV90b19sZTMyKGluZGV4KTsKIAljbWRfZW50cnktPnRhcmdldCA9IGNwdV90b19sZTE2KGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKLQljbWRfZW50cnktPmNvbm5lY3Rpb25faWQgPSBjcHVfdG9fbGUxNihkZGJfZW50cnktPmNvbm5lY3Rpb25faWQpOwogCiAJaW50X3RvX3Njc2lsdW4oY21kLT5kZXZpY2UtPmx1biwgJmNtZF9lbnRyeS0+bHVuKTsKLQljbWRfZW50cnktPmNtZFNlcU51bSA9IGNwdV90b19sZTMyKGRkYl9lbnRyeS0+Q21kU24pOwogCWNtZF9lbnRyeS0+dHRsQnl0ZUNudCA9IGNwdV90b19sZTMyKHNjc2lfYnVmZmxlbihjbWQpKTsKIAltZW1jcHkoY21kX2VudHJ5LT5jZGIsIGNtZC0+Y21uZCwgY21kLT5jbWRfbGVuKTsKIAljbWRfZW50cnktPmRhdGFTZWdDbnQgPSBjcHVfdG9fbGUxNih0b3RfZHNkcyk7CkBAIC0zODEsMyArMzc5LDY5IEBACiAJcmV0dXJuIFFMQV9FUlJPUjsKIH0KIAoraW50IHFsYTR4eHhfc2VuZF9wYXNzdGhydTAoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHBhc3N0aHJ1MCAqcGFzc3RocnVfaW9jYjsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzcyA9IHRhc2stPmNvbm4tPnNlc3Npb247CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkZGJfZW50cnktPmhhOworCXN0cnVjdCBxbDRfdGFza19kYXRhICp0YXNrX2RhdGEgPSB0YXNrLT5kZF9kYXRhOworCXVpbnQxNl90IGN0cmxfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IFFMQV9FUlJPUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXRhc2tfZGF0YS0+aW9jYl9yZXFfY250ID0gMTsKKwkvKiBQdXQgdGhlIElPQ0Igb24gdGhlIHJlcXVlc3QgcXVldWUgKi8KKwlpZiAoIXFsYTR4eHhfc3BhY2VfaW5fcmVxX3JpbmcoaGEsIHRhc2tfZGF0YS0+aW9jYl9yZXFfY250KSkKKwkJZ290byBxdWV1aW5nX2Vycm9yOworCisJcGFzc3RocnVfaW9jYiA9IChzdHJ1Y3QgcGFzc3RocnUwICopIGhhLT5yZXF1ZXN0X3B0cjsKKworCW1lbXNldChwYXNzdGhydV9pb2NiLCAwLCBzaXplb2Yoc3RydWN0IHBhc3N0aHJ1MCkpOworCXBhc3N0aHJ1X2lvY2ItPmhkci5lbnRyeVR5cGUgPSBFVF9QQVNTVEhSVTA7CisJcGFzc3RocnVfaW9jYi0+aGRyLnN5c3RlbURlZmluZWQgPSBTRF9JU0NTSV9QRFU7CisJcGFzc3RocnVfaW9jYi0+aGRyLmVudHJ5Q291bnQgPSB0YXNrX2RhdGEtPmlvY2JfcmVxX2NudDsKKwlwYXNzdGhydV9pb2NiLT5oYW5kbGUgPSB0YXNrLT5pdHQ7CisJcGFzc3RocnVfaW9jYi0+dGFyZ2V0ID0gY3B1X3RvX2xlMTYoZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCXBhc3N0aHJ1X2lvY2ItPnRpbWVvdXQgPSBjcHVfdG9fbGUxNihQVF9ERUZBVUxUX1RJTUVPVVQpOworCisJLyogU2V0dXAgdGhlIG91dCAmIGluIERTRHMgKi8KKwlpZiAodGFza19kYXRhLT5yZXFfbGVuKSB7CisJCW1lbWNweSgodWludDhfdCAqKXRhc2tfZGF0YS0+cmVxX2J1ZmZlciArCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlzY3NpX2hkciksIHRhc2stPmRhdGEsIHRhc2stPmRhdGFfY291bnQpOworCQljdHJsX2ZsYWdzIHw9IFBUX0ZMQUdfU0VORF9CVUZGRVI7CisJCXBhc3N0aHJ1X2lvY2ItPm91dF9kc2QuYmFzZS5hZGRyTG93ID0KKwkJCQkJY3B1X3RvX2xlMzIoTFNEVyh0YXNrX2RhdGEtPnJlcV9kbWEpKTsKKwkJcGFzc3RocnVfaW9jYi0+b3V0X2RzZC5iYXNlLmFkZHJIaWdoID0KKwkJCQkJY3B1X3RvX2xlMzIoTVNEVyh0YXNrX2RhdGEtPnJlcV9kbWEpKTsKKwkJcGFzc3RocnVfaW9jYi0+b3V0X2RzZC5jb3VudCA9CisJCQkJCWNwdV90b19sZTMyKHRhc2stPmRhdGFfY291bnQgKworCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CisJfQorCWlmICh0YXNrX2RhdGEtPnJlc3BfbGVuKSB7CisJCXBhc3N0aHJ1X2lvY2ItPmluX2RzZC5iYXNlLmFkZHJMb3cgPQorCQkJCQljcHVfdG9fbGUzMihMU0RXKHRhc2tfZGF0YS0+cmVzcF9kbWEpKTsKKwkJcGFzc3RocnVfaW9jYi0+aW5fZHNkLmJhc2UuYWRkckhpZ2ggPQorCQkJCQljcHVfdG9fbGUzMihNU0RXKHRhc2tfZGF0YS0+cmVzcF9kbWEpKTsKKwkJcGFzc3RocnVfaW9jYi0+aW5fZHNkLmNvdW50ID0KKwkJCWNwdV90b19sZTMyKHRhc2tfZGF0YS0+cmVzcF9sZW4pOworCX0KKworCWN0cmxfZmxhZ3MgfD0gKFBUX0ZMQUdfSVNDU0lfUERVIHwgUFRfRkxBR19XQUlUXzRfUkVTUE9OU0UpOworCXBhc3N0aHJ1X2lvY2ItPmNvbnRyb2xfZmxhZ3MgPSBjcHVfdG9fbGUxNihjdHJsX2ZsYWdzKTsKKworCS8qIFVwZGF0ZSB0aGUgcmVxdWVzdCBwb2ludGVyICovCisJcWxhNHh4eF9hZHZhbmNlX3JlcV9yaW5nX3B0cihoYSk7CisJd21iKCk7CisKKwkvKiBUcmFjayBJT0NCIHVzZWQgKi8KKwloYS0+aW9jYl9jbnQgKz0gdGFza19kYXRhLT5pb2NiX3JlcV9jbnQ7CisJaGEtPnJlcV9xX2NvdW50IC09IHRhc2tfZGF0YS0+aW9jYl9yZXFfY250OworCWhhLT5pc3Bfb3BzLT5xdWV1ZV9pb2NiKGhhKTsKKwlyZXQgPSBRTEFfU1VDQ0VTUzsKKworcXVldWluZ19lcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKaW5kZXggMGU3MjkyMS4uODI3ZTkzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYwpAQCAtMjI0LDggKzIyNCw4IEBACiAJCSAqIEkvTyB0byB0aGlzIGRldmljZS4JV2Ugc2hvdWxkIGdldCBhIGRkYiBzdGF0ZSBjaGFuZ2UKIAkJICogQUVOIHNvb24uCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9PTkxJTkUpCi0JCQlxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcoaGEsIGRkYl9lbnRyeSk7CisJCWlmIChpc2NzaV9pc19zZXNzaW9uX29ubGluZShkZGJfZW50cnktPnNlc3MpKQorCQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGRkYl9lbnRyeS0+c2Vzcyk7CiAJCWJyZWFrOwogCiAJY2FzZSBTQ1NfREFUQV9VTkRFUlJVTjoKQEAgLTMwNiw4ICszMDYsOCBAQAogCQkgKiBzZW5kIEkvTyB0byB0aGlzIGRldmljZS4gIFdlIHNob3VsZCBnZXQgYSBkZGIKIAkJICogc3RhdGUgY2hhbmdlIEFFTiBzb29uLgogCQkgKi8KLQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSA9PSBEREJfU1RBVEVfT05MSU5FKQotCQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGhhLCBkZGJfZW50cnkpOworCQlpZiAoaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUoZGRiX2VudHJ5LT5zZXNzKSkKKwkJCXFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhkZGJfZW50cnktPnNlc3MpOwogCiAJCWNtZC0+cmVzdWx0ID0gRElEX1RSQU5TUE9SVF9ESVNSVVBURUQgPDwgMTY7CiAJCWJyZWFrOwpAQCAtMzQxLDYgKzM0MSw1MSBAQAogfQogCiAvKioKKyAqIHFsYTR4eHhfcGFzc3RocnVfc3RhdHVzX2VudHJ5IC0gcHJvY2Vzc2VzIHBhc3N0aHJ1IHN0YXR1cyBJT0NCcyAoMHgzQykKKyAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgorICogQHN0c19lbnRyeTogUG9pbnRlciB0byBzdGF0dXMgZW50cnkgc3RydWN0dXJlLgorICoqLworc3RhdGljIHZvaWQgcWxhNHh4eF9wYXNzdGhydV9zdGF0dXNfZW50cnkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCQkgIHN0cnVjdCBwYXNzdGhydV9zdGF0dXMgKnN0c19lbnRyeSkKK3sKKwlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHFsNF90YXNrX2RhdGEgKnRhc2tfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCWl0dF90IGl0dDsKKwl1aW50MzJfdCBmd19kZGJfaW5kZXg7CisKKwlpdHQgPSBzdHNfZW50cnktPmhhbmRsZTsKKwlmd19kZGJfaW5kZXggPSBsZTMyX3RvX2NwdShzdHNfZW50cnktPnRhcmdldCk7CisKKwlkZGJfZW50cnkgPSBxbGE0eHh4X2xvb2t1cF9kZGJfYnlfZndfaW5kZXgoaGEsIGZ3X2RkYl9pbmRleCk7CisKKwlpZiAoZGRiX2VudHJ5ID09IE5VTEwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogSW52YWxpZCB0YXJnZXQgaW5kZXggPSAweCV4XG4iLAorCQkJICAgX19mdW5jX18sIHN0c19lbnRyeS0+dGFyZ2V0KTsKKwkJcmV0dXJuOworCX0KKworCWNsc19jb25uID0gZGRiX2VudHJ5LT5jb25uOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKwlzcGluX2xvY2soJmNvbm4tPnNlc3Npb24tPmxvY2spOworCXRhc2sgPSBpc2NzaV9pdHRfdG9fdGFzayhjb25uLCBpdHQpOworCXNwaW5fdW5sb2NrKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKKworCWlmICh0YXNrID09IE5VTEwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogVGFzayBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl0YXNrX2RhdGEgPSB0YXNrLT5kZF9kYXRhOworCW1lbWNweSgmdGFza19kYXRhLT5zdHMsIHN0c19lbnRyeSwgc2l6ZW9mKHN0cnVjdCBwYXNzdGhydV9zdGF0dXMpKTsKKwloYS0+cmVxX3FfY291bnQgKz0gdGFza19kYXRhLT5pb2NiX3JlcV9jbnQ7CisJaGEtPmlvY2JfY250IC09IHRhc2tfZGF0YS0+aW9jYl9yZXFfY250OworCXF1ZXVlX3dvcmsoaGEtPnRhc2tfd3EsICZ0YXNrX2RhdGEtPnRhc2tfd29yayk7Cit9CisKKy8qKgogICogcWxhNHh4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlIC0gcHJvY2VzcyByZXNwb25zZSBxdWV1ZSBjb21wbGV0aW9ucwogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCiAgKgpAQCAtMzc1LDYgKzQyMCwxNCBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBFVF9QQVNTVEhSVV9TVEFUVVM6CisJCQlpZiAoc3RzX2VudHJ5LT5oZHIuc3lzdGVtRGVmaW5lZCA9PSBTRF9JU0NTSV9QRFUpCisJCQkJcWxhNHh4eF9wYXNzdGhydV9zdGF0dXNfZW50cnkoaGEsCisJCQkJCShzdHJ1Y3QgcGFzc3RocnVfc3RhdHVzICopc3RzX2VudHJ5KTsKKwkJCWVsc2UKKwkJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkJICAgIiVzOiBJbnZhbGlkIHN0YXR1cyByZWNlaXZlZFxuIiwKKwkJCQkJICAgX19mdW5jX18pOworCiAJCQlicmVhazsKIAogCQljYXNlIEVUX1NUQVRVU19DT05USU5VQVRJT046CkBAIC01NjYsNiArNjE5LDggQEAKIAkJCWVsc2UgaWYgKChtYm94X3N0c1szXSA9PSBBQ0JfU1RBVEVfQUNRVUlSSU5HKSAmJgogCQkJICAgIChtYm94X3N0c1syXSA9PSBBQ0JfU1RBVEVfVkFMSUQpKQogCQkJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCQllbHNlIGlmICgobWJveF9zdHNbM10gPT0gQUNCX1NUQVRFX1VOQ09ORklHVVJFRCkpCisJCQkJY29tcGxldGUoJmhhLT5kaXNhYmxlX2FjYl9jb21wKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUJPWF9BU1RTX01BQ19BRERSRVNTX0NIQU5HRUQ6CkBAIC0xMDA5LDIzICsxMDY0LDIzIEBACiAKIAkJc3dpdGNoIChtYm94X3N0c1swXSkgewogCQljYXNlIE1CT1hfQVNUU19EQVRBQkFTRV9DSEFOR0VEOgotCQkJaWYgKHByb2Nlc3NfYWVuID09IEZMVVNIX0REQl9DSEFOR0VEX0FFTlMpIHsKKwkJCXN3aXRjaCAocHJvY2Vzc19hZW4pIHsKKwkJCWNhc2UgRkxVU0hfRERCX0NIQU5HRURfQUVOUzoKIAkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBBRU5bJWRdICUwNHgsIGluZGV4ICIKIAkJCQkJICAgICAgIlslZF0gc3RhdGU9JTA0eCBGTFVTSEVEIVxuIiwKIAkJCQkJICAgICAgaGEtPmhvc3Rfbm8sIGhhLT5hZW5fb3V0LAogCQkJCQkgICAgICBtYm94X3N0c1swXSwgbWJveF9zdHNbMl0sCiAJCQkJCSAgICAgIG1ib3hfc3RzWzNdKSk7CiAJCQkJYnJlYWs7CisJCQljYXNlIFBST0NFU1NfQUxMX0FFTlM6CisJCQlkZWZhdWx0OgorCQkJCS8qIFNwZWNpZmljIGRldmljZS4gKi8KKwkJCQlpZiAobWJveF9zdHNbMV0gPT0gMSkKKwkJCQkJcWxhNHh4eF9wcm9jZXNzX2RkYl9jaGFuZ2VkKGhhLAorCQkJCQkJbWJveF9zdHNbMl0sIG1ib3hfc3RzWzNdLAorCQkJCQkJbWJveF9zdHNbNF0pOworCQkJCWJyZWFrOwogCQkJfQotCQljYXNlIFBST0NFU1NfQUxMX0FFTlM6Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAobWJveF9zdHNbMV0gPT0gMCkgewkvKiBHbG9iYWwgREIgY2hhbmdlLiAqLwotCQkJCXFsYTR4eHhfcmVpbml0aWFsaXplX2RkYl9saXN0KGhhKTsKLQkJCX0gZWxzZSBpZiAobWJveF9zdHNbMV0gPT0gMSkgewkvKiBTcGVjaWZpYyBkZXZpY2UuICovCi0JCQkJcWxhNHh4eF9wcm9jZXNzX2RkYl9jaGFuZ2VkKGhhLCBtYm94X3N0c1syXSwKLQkJCQkJCW1ib3hfc3RzWzNdLCBtYm94X3N0c1s0XSk7Ci0JCQl9Ci0JCQlicmVhazsKIAkJfQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKaW5kZXggZmNlODI4OS4uNGMyYjg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQogCi1zdGF0aWMgdWludDhfdAordWludDhfdAogcWxhNHh4eF9nZXRfaWZjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICptYm94X2NtZCwKIAkJIHVpbnQzMl90ICptYm94X3N0cywgZG1hX2FkZHJfdCBpbml0X2Z3X2NiX2RtYSkKIHsKQEAgLTMyNyw0MyArMzI3LDY5IEBACiAKIHN0YXRpYyB2b2lkCiBxbGE0eHh4X3VwZGF0ZV9sb2NhbF9pcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCi0JCQkgc3RydWN0IGFkZHJfY3RybF9ibGsgICppbml0X2Z3X2NiKQorCQkJc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IpCiB7CisJaGEtPmlwX2NvbmZpZy50Y3Bfb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfdGNwX29wdHMpOworCWhhLT5pcF9jb25maWcuaXB2NF9vcHRpb25zID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF9pcF9vcHRzKTsKKwloYS0+aXBfY29uZmlnLmlwdjRfYWRkcl9zdGF0ZSA9CisJCQkJbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2NF9hZGRyX3N0YXRlKTsKKwloYS0+aXBfY29uZmlnLmV0aF9tdHVfc2l6ZSA9CisJCQkJbGUxNl90b19jcHUoaW5pdF9md19jYi0+ZXRoX210dV9zaXplKTsKKwloYS0+aXBfY29uZmlnLmlwdjRfcG9ydCA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfcG9ydCk7CisKKwlpZiAoaGEtPmFjYl92ZXJzaW9uID09IEFDQl9TVVBQT1JURUQpIHsKKwkJaGEtPmlwX2NvbmZpZy5pcHY2X29wdGlvbnMgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X29wdHMpOworCQloYS0+aXBfY29uZmlnLmlwdjZfYWRkbF9vcHRpb25zID0KKwkJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X2FkZHRsX29wdHMpOworCX0KKwogCS8qIFNhdmUgSVB2NCBBZGRyZXNzIEluZm8gKi8KLQltZW1jcHkoaGEtPmlwX2FkZHJlc3MsIGluaXRfZndfY2ItPmlwdjRfYWRkciwKLQkJbWluKHNpemVvZihoYS0+aXBfYWRkcmVzcyksIHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X2FkZHIpKSk7Ci0JbWVtY3B5KGhhLT5zdWJuZXRfbWFzaywgaW5pdF9md19jYi0+aXB2NF9zdWJuZXQsCi0JCW1pbihzaXplb2YoaGEtPnN1Ym5ldF9tYXNrKSwgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfc3VibmV0KSkpOwotCW1lbWNweShoYS0+Z2F0ZXdheSwgaW5pdF9md19jYi0+aXB2NF9nd19hZGRyLAotCQltaW4oc2l6ZW9mKGhhLT5nYXRld2F5KSwgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfZ3dfYWRkcikpKTsKKwltZW1jcHkoaGEtPmlwX2NvbmZpZy5pcF9hZGRyZXNzLCBpbml0X2Z3X2NiLT5pcHY0X2FkZHIsCisJICAgICAgIG1pbihzaXplb2YoaGEtPmlwX2NvbmZpZy5pcF9hZGRyZXNzKSwKKwkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfYWRkcikpKTsKKwltZW1jcHkoaGEtPmlwX2NvbmZpZy5zdWJuZXRfbWFzaywgaW5pdF9md19jYi0+aXB2NF9zdWJuZXQsCisJICAgICAgIG1pbihzaXplb2YoaGEtPmlwX2NvbmZpZy5zdWJuZXRfbWFzayksCisJCSAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X3N1Ym5ldCkpKTsKKwltZW1jcHkoaGEtPmlwX2NvbmZpZy5nYXRld2F5LCBpbml0X2Z3X2NiLT5pcHY0X2d3X2FkZHIsCisJICAgICAgIG1pbihzaXplb2YoaGEtPmlwX2NvbmZpZy5nYXRld2F5KSwKKwkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjRfZ3dfYWRkcikpKTsKKworCWhhLT5pcF9jb25maWcuaXB2NF92bGFuX3RhZyA9IGJlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfdmxhbl90YWcpOwogCiAJaWYgKGlzX2lwdjZfZW5hYmxlZChoYSkpIHsKIAkJLyogU2F2ZSBJUHY2IEFkZHJlc3MgKi8KLQkJaGEtPmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9IGluaXRfZndfY2ItPmlwdjZfbG5rX2xjbF9hZGRyX3N0YXRlOwotCQloYS0+aXB2Nl9hZGRyMF9zdGF0ZSA9IGluaXRfZndfY2ItPmlwdjZfYWRkcjBfc3RhdGU7Ci0JCWhhLT5pcHY2X2FkZHIxX3N0YXRlID0gaW5pdF9md19jYi0+aXB2Nl9hZGRyMV9zdGF0ZTsKLQkJaGEtPmlwdjZfZGVmYXVsdF9yb3V0ZXJfc3RhdGUgPSBpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX3N0YXRlOwotCQloYS0+aXB2Nl9saW5rX2xvY2FsX2FkZHIuaW42X3UudTZfYWRkcjhbMF0gPSAweEZFOwotCQloYS0+aXB2Nl9saW5rX2xvY2FsX2FkZHIuaW42X3UudTZfYWRkcjhbMV0gPSAweDgwOworCQloYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9zdGF0ZSA9CisJCQlsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY2X2xua19sY2xfYWRkcl9zdGF0ZSk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMF9zdGF0ZSA9CisJCQkJbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2Nl9hZGRyMF9zdGF0ZSk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9hZGRyMV9zdGF0ZSA9CisJCQkJbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2Nl9hZGRyMV9zdGF0ZSk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9zdGF0ZSA9CisJCQkJbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2Nl9kZmx0X3J0cl9zdGF0ZSk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX2FkZHIuaW42X3UudTZfYWRkcjhbMF0gPSAweEZFOworCQloYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9hZGRyLmluNl91LnU2X2FkZHI4WzFdID0gMHg4MDsKIAotCQltZW1jcHkoJmhhLT5pcHY2X2xpbmtfbG9jYWxfYWRkci5pbjZfdS51Nl9hZGRyOFs4XSwKLQkJCWluaXRfZndfY2ItPmlwdjZfaWZfaWQsCi0JCQltaW4oc2l6ZW9mKGhhLT5pcHY2X2xpbmtfbG9jYWxfYWRkcikvMiwKLQkJCXNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2lmX2lkKSkpOwotCQltZW1jcHkoJmhhLT5pcHY2X2FkZHIwLCBpbml0X2Z3X2NiLT5pcHY2X2FkZHIwLAotCQkJbWluKHNpemVvZihoYS0+aXB2Nl9hZGRyMCksCi0JCQlzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9hZGRyMCkpKTsKLQkJbWVtY3B5KCZoYS0+aXB2Nl9hZGRyMSwgaW5pdF9md19jYi0+aXB2Nl9hZGRyMSwKLQkJCW1pbihzaXplb2YoaGEtPmlwdjZfYWRkcjEpLAotCQkJc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfYWRkcjEpKSk7Ci0JCW1lbWNweSgmaGEtPmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkciwKLQkJCWluaXRfZndfY2ItPmlwdjZfZGZsdF9ydHJfYWRkciwKLQkJCW1pbihzaXplb2YoaGEtPmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkciksCi0JCQlzaXplb2YoaW5pdF9md19jYi0+aXB2Nl9kZmx0X3J0cl9hZGRyKSkpOworCQltZW1jcHkoJmhhLT5pcF9jb25maWcuaXB2Nl9saW5rX2xvY2FsX2FkZHIuaW42X3UudTZfYWRkcjhbOF0sCisJCSAgICAgICBpbml0X2Z3X2NiLT5pcHY2X2lmX2lkLAorCQkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9hZGRyKS8yLAorCQkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfaWZfaWQpKSk7CisJCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIwLCBpbml0X2Z3X2NiLT5pcHY2X2FkZHIwLAorCQkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjApLAorCQkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfYWRkcjApKSk7CisJCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxLCBpbml0X2Z3X2NiLT5pcHY2X2FkZHIxLAorCQkgICAgICAgbWluKHNpemVvZihoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjEpLAorCQkJICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfYWRkcjEpKSk7CisJCW1lbWNweSgmaGEtPmlwX2NvbmZpZy5pcHY2X2RlZmF1bHRfcm91dGVyX2FkZHIsCisJCSAgICAgICBpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIsCisJCSAgICAgICBtaW4oc2l6ZW9mKGhhLT5pcF9jb25maWcuaXB2Nl9kZWZhdWx0X3JvdXRlcl9hZGRyKSwKKwkJCSAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIpKSk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl92bGFuX3RhZyA9CisJCQkJYmUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2Nl92bGFuX3RhZyk7CisJCWhhLT5pcF9jb25maWcuaXB2Nl9wb3J0ID0gbGUxNl90b19jcHUoaW5pdF9md19jYi0+aXB2Nl9wb3J0KTsKIAl9CiB9CiAKLXN0YXRpYyB1aW50OF90Cit1aW50OF90CiBxbGE0eHh4X3VwZGF0ZV9sb2NhbF9pZmNiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCSAgdWludDMyX3QgKm1ib3hfY21kLAogCQkJICB1aW50MzJfdCAqbWJveF9zdHMsCkBAIC0zODMsOSArNDA5LDYgQEAKIAkvKiBTYXZlIHNvbWUgaW5mbyBpbiBhZGFwdGVyIHN0cnVjdHVyZS4gKi8KIAloYS0+YWNiX3ZlcnNpb24gPSBpbml0X2Z3X2NiLT5hY2JfdmVyc2lvbjsKIAloYS0+ZmlybXdhcmVfb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmZ3X29wdGlvbnMpOwotCWhhLT50Y3Bfb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGluaXRfZndfY2ItPmlwdjRfdGNwX29wdHMpOwotCWhhLT5pcHY0X29wdGlvbnMgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY0X2lwX29wdHMpOwotCWhhLT5pcHY0X2FkZHJfc3RhdGUgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5pcHY0X2FkZHJfc3RhdGUpOwogCWhhLT5oZWFydGJlYXRfaW50ZXJ2YWwgPSBpbml0X2Z3X2NiLT5oYl9pbnRlcnZhbDsKIAltZW1jcHkoaGEtPm5hbWVfc3RyaW5nLCBpbml0X2Z3X2NiLT5pc2NzaV9uYW1lLAogCQltaW4oc2l6ZW9mKGhhLT5uYW1lX3N0cmluZyksCkBAIC0zOTMsMTAgKzQxNiw2IEBACiAJLyptZW1jcHkoaGEtPmFsaWFzLCBpbml0X2Z3X2NiLT5BbGlhcywKIAkgICAgICAgbWluKHNpemVvZihoYS0+YWxpYXMpLCBzaXplb2YoaW5pdF9md19jYi0+QWxpYXMpKSk7Ki8KIAotCWlmIChoYS0+YWNiX3ZlcnNpb24gPT0gQUNCX1NVUFBPUlRFRCkgewotCQloYS0+aXB2Nl9vcHRpb25zID0gaW5pdF9md19jYi0+aXB2Nl9vcHRzOwotCQloYS0+aXB2Nl9hZGRsX29wdGlvbnMgPSBpbml0X2Z3X2NiLT5pcHY2X2FkZHRsX29wdHM7Ci0JfQogCXFsYTR4eHhfdXBkYXRlX2xvY2FsX2lwKGhhLCBpbml0X2Z3X2NiKTsKIAogCXJldHVybiBRTEFfU1VDQ0VTUzsKQEAgLTQ2MiwxMCArNDgxLDExIEBACiAKIAlpbml0X2Z3X2NiLT5md19vcHRpb25zICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYofkZXT1BUX1RBUkdFVF9NT0RFKTsKIAotCS8qIFNldCBiaXQgZm9yICJzZXJpYWxpemUgdGFzayBtZ210IiBhbGwgb3RoZXIgYml0cyBuZWVkIHRvIGJlIHplcm8gKi8KIAlpbml0X2Z3X2NiLT5hZGRfZndfb3B0aW9ucyA9IDA7CiAJaW5pdF9md19jYi0+YWRkX2Z3X29wdGlvbnMgfD0KLQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUxNihTRVJJQUxJWkVfVEFTS19NR01UKTsKKwkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQURGV09QVF9TRVJJQUxJWkVfVEFTS19NR01UKTsKKwlpbml0X2Z3X2NiLT5hZGRfZndfb3B0aW9ucyB8PQorCQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihBREZXT1BUX0FVVE9DT05OX0RJU0FCTEUpOwogCiAJaWYgKHFsYTR4eHhfc2V0X2lmY2IoaGEsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdLCBpbml0X2Z3X2NiX2RtYSkKIAkJIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTY5MSwxOSArNzExLDM4IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IHFsYTR4eHhfY29ubl9vcGVuKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgZndfZGRiX2luZGV4KQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJaW50IHN0YXR1czsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9DT05OX09QRU47CisJbWJveF9jbWRbMV0gPSBmd19kZGJfaW5kZXg7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDIsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgIiVzOiBzdGF0dXMgPSAlZCBtYngwID0gMHgleCBtYngxID0gMHgleFxuIiwKKwkJCSAgX19mdW5jX18sIHN0YXR1cywgbWJveF9zdHNbMF0sIG1ib3hfc3RzWzFdKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoqCiAgKiBxbGE0eHh4X3NldF9md2RkYl9lbnRyeSAtIHNldHMgYSBkZGIgZW50cnkuCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KICAqIEBmd19kZGJfaW5kZXg6IEZpcm13YXJlJ3MgZGV2aWNlIGRhdGFiYXNlIGluZGV4Ci0gKiBAZndfZGRiX2VudHJ5OiBQb2ludGVyIHRvIGZpcm13YXJlJ3MgZGRiIGVudHJ5IHN0cnVjdHVyZSwgb3IgTlVMTC4KKyAqIEBmd19kZGJfZW50cnlfZG1hOiBkbWEgYWRkcmVzcyBvZiBkZGIgZW50cnkKKyAqIEBtYnhfc3RzOiBtYWlsYm94IDAgdG8gYmUgcmV0dXJuZWQgb3IgTlVMTAogICoKICAqIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBvciB1cGRhdGVzIHRoZSBhZGFwdGVyJ3MgZGV2aWNlIGRhdGFiYXNlCi0gKiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UuIEl0IGFsc28gdHJpZ2dlcnMgYSBsb2dpbiBmb3IgdGhlCi0gKiBzcGVjaWZpZWQgZGV2aWNlLiBUaGVyZWZvcmUsIGl0IG1heSBhbHNvIGJlIHVzZWQgYXMgYSBzZWNvbmRhcnkKLSAqIGxvZ2luIHJvdXRpbmUgd2hlbiBhIE5VTEwgcG9pbnRlciBpcyBzcGVjaWZpZWQgZm9yIHRoZSBmd19kZGJfZW50cnkuCisgKiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UuCiAgKiovCiBpbnQgcWxhNHh4eF9zZXRfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICogaGEsIHVpbnQxNl90IGZ3X2RkYl9pbmRleCwKLQkJCSAgZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hKQorCQkJICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEsIHVpbnQzMl90ICptYnhfc3RzKQogewogCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKIAl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CkBAIC03MjIsMTMgKzc2MSw0MSBAQAogCW1ib3hfY21kWzRdID0gc2l6ZW9mKHN0cnVjdCBkZXZfZGJfZW50cnkpOwogCiAJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIE1CT1hfUkVHX0NPVU5ULCA1LCAmbWJveF9jbWRbMF0sCi0JICAgICZtYm94X3N0c1swXSk7CisJCQkJCSAmbWJveF9zdHNbMF0pOworCWlmIChtYnhfc3RzKQorCQkqbWJ4X3N0cyA9IG1ib3hfc3RzWzBdOwogCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBzdGF0dXM9JWQgbWJ4MD0weCV4IG1ieDQ9MHgleFxuIiwKIAkgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBzdGF0dXMsIG1ib3hfc3RzWzBdLCBtYm94X3N0c1s0XSk7KQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IHFsYTR4eHhfc2Vzc2lvbl9sb2dvdXRfZGRiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksIGludCBvcHRpb25zKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9DT05OX0NMT1NFX1NFU1NfTE9HT1VUOworCW1ib3hfY21kWzFdID0gZGRiX2VudHJ5LT5md19kZGJfaW5kZXg7CisJbWJveF9jbWRbM10gPSBvcHRpb25zOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIE1CT1hfUkVHX0NPVU5ULCAyLCAmbWJveF9jbWRbMF0sCisJCQkJCSAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICIlczogTUJPWF9DTURfQ09OTl9DTE9TRV9TRVNTX0xPR09VVCAiCisJCQkJICAiZmFpbGVkIHN0cyAlMDRYICUwNFgiLCBfX2Z1bmNfXywKKwkJCQkgIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSkpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKIC8qKgogICogcWxhNHh4eF9nZXRfY3Jhc2hfcmVjb3JkIC0gcmV0cmlldmVzIGNyYXNoIHJlY29yZC4KICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgpAQCAtODA1LDcgKzg3Miw2IEBACiAJdWludDMyX3QJbWF4X2V2ZW50X2xvZ19lbnRyaWVzOwogCXVpbnQ4X3QJCWk7CiAKLQogCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOwogCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X2NtZCkpOwogCkBAIC0xMTA0LDcgKzExNzAsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgcWxhNHh4eF9nZXRfZGVmYXVsdF9kZGIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorc3RhdGljIGludCBxbGE0eHh4X2dldF9kZWZhdWx0X2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IG9wdGlvbnMsCiAJCQkJICAgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKIAl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CkBAIC0xMTE0LDYgKzExODAsNyBAQAogCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOwogCiAJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9HRVRfREFUQUJBU0VfRU5UUllfREVGQVVMVFM7CisJbWJveF9jbWRbMV0gPSBvcHRpb25zOwogCW1ib3hfY21kWzJdID0gTFNEVyhkbWFfYWRkcik7CiAJbWJveF9jbWRbM10gPSBNU0RXKGRtYV9hZGRyKTsKIApAQCAtMTEyNiw4ICsxMTkzLDEwIEBACiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IHFsYTR4eHhfcmVxX2RkYl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICpkZGJfaW5kZXgpCitpbnQgcWxhNHh4eF9yZXFfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgZGRiX2luZGV4LAorCQkJICB1aW50MzJfdCAqbWJ4X3N0cykKIHsKKwlpbnQgc3RhdHVzOwogCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKIAl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CiAKQEAgLTExMzUsNzUgKzEyMDQsNjQ2IEBACiAJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CiAKIAltYm94X2NtZFswXSA9IE1CT1hfQ01EX1JFUVVFU1RfREFUQUJBU0VfRU5UUlk7Ci0JbWJveF9jbWRbMV0gPSBNQVhfUFJTVF9ERVZfREJfRU5UUklFUzsKKwltYm94X2NtZFsxXSA9IGRkYl9pbmRleDsKIAotCWlmIChxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDMsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKSAhPQotCSAgICBRTEFfU1VDQ0VTUykgewotCQlpZiAobWJveF9zdHNbMF0gPT0gTUJPWF9TVFNfQ09NTUFORF9FUlJPUikgewotCQkJKmRkYl9pbmRleCA9IG1ib3hfc3RzWzJdOwotCQl9IGVsc2UgewotCQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGZhaWxlZCBzdGF0dXMgJTA0WFxuIiwKLQkJCSAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBtYm94X3N0c1swXSkpOwotCQkJcmV0dXJuIFFMQV9FUlJPUjsKLQkJfQotCX0gZWxzZSB7Ci0JCSpkZGJfaW5kZXggPSBNQVhfUFJTVF9ERVZfREJfRU5UUklFUzsKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDEsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogZmFpbGVkIHN0YXR1cyAlMDRYXG4iLAorCQkJCSAgIF9fZnVuY19fLCBtYm94X3N0c1swXSkpOwogCX0KIAotCXJldHVybiBRTEFfU1VDQ0VTUzsKKwkqbWJ4X3N0cyA9IG1ib3hfc3RzWzBdOworCXJldHVybiBzdGF0dXM7CiB9CiAKK2ludCBxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGRkYl9pbmRleCkKK3sKKwlpbnQgc3RhdHVzOworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CiAKLWludCBxbGE0eHh4X3NlbmRfdGd0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKmlwLCB1aW50MTZfdCBwb3J0KQorCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9DTEVBUl9EQVRBQkFTRV9FTlRSWTsKKwltYm94X2NtZFsxXSA9IGRkYl9pbmRleDsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCAyLCAxLCAmbWJveF9jbWRbMF0sCisJCQkJCSAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGZhaWxlZCBzdGF0dXMgJTA0WFxuIiwKKwkJCQkgICBfX2Z1bmNfXywgbWJveF9zdHNbMF0pKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9zZXRfZmxhc2goc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkgICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbmd0aCwgdWludDMyX3Qgb3B0aW9ucykKK3sKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9XUklURV9GTEFTSDsKKwltYm94X2NtZFsxXSA9IExTRFcoZG1hX2FkZHIpOworCW1ib3hfY21kWzJdID0gTVNEVyhkbWFfYWRkcik7CisJbWJveF9jbWRbM10gPSBvZmZzZXQ7CisJbWJveF9jbWRbNF0gPSBsZW5ndGg7CisJbWJveF9jbWRbNV0gPSBvcHRpb25zOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDYsIDIsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogTUJPWF9DTURfV1JJVEVfRkxBU0ggIgorCQkJCSAgImZhaWxlZCB3LyBzdGF0dXMgJTA0WCwgbWJ4MSAlMDRYXG4iLAorCQkJCSAgX19mdW5jX18sIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSkpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9ib290ZGJfYnlfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgIHN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeSwKKwkJCSAgICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEsIHVpbnQxNl90IGRkYl9pbmRleCkKK3sKKwl1aW50MzJfdCBkZXZfZGJfc3RhcnRfb2Zmc2V0ID0gRkxBU0hfT0ZGU0VUX0RCX0lORk87CisJdWludDMyX3QgZGV2X2RiX2VuZF9vZmZzZXQ7CisJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKKworCW1lbXNldChmd19kZGJfZW50cnksIDAsIHNpemVvZigqZndfZGRiX2VudHJ5KSk7CisKKwlkZXZfZGJfc3RhcnRfb2Zmc2V0ICs9IChkZGJfaW5kZXggKiBzaXplb2YoKmZ3X2RkYl9lbnRyeSkpOworCWRldl9kYl9lbmRfb2Zmc2V0ID0gRkxBU0hfT0ZGU0VUX0RCX0VORDsKKworCWlmIChkZXZfZGJfc3RhcnRfb2Zmc2V0ID4gZGV2X2RiX2VuZF9vZmZzZXQpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCSAgIiVzOkludmFsaWQgRERCIGluZGV4ICVkIiwgX19mdW5jX18sCisJCQkJICBkZGJfaW5kZXgpKTsKKwkJZ290byBleGl0X2Jvb3RkYl9mYWlsZWQ7CisJfQorCisJaWYgKHFsYTR4eHhfZ2V0X2ZsYXNoKGhhLCBmd19kZGJfZW50cnlfZG1hLCBkZXZfZGJfc3RhcnRfb2Zmc2V0LAorCQkJICAgICAgc2l6ZW9mKCpmd19kZGJfZW50cnkpKSAhPSBRTEFfU1VDQ0VTUykgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgInNjc2klbGQ6ICVzOiBHZXQgRmxhc2giCisJCQkgICAiZmFpbGVkXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQlnb3RvIGV4aXRfYm9vdGRiX2ZhaWxlZDsKKwl9CisKKwlpZiAoZndfZGRiX2VudHJ5LT5jb29raWUgPT0gRERCX1ZBTElEX0NPT0tJRSkKKwkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKK2V4aXRfYm9vdGRiX2ZhaWxlZDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9nZXRfY2hhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnVzZXJuYW1lLCBjaGFyICpwYXNzd29yZCwKKwkJICAgICB1aW50MTZfdCBpZHgpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJ2YWwgPSBRTEFfRVJST1I7CisJdWludDMyX3Qgb2Zmc2V0ID0gMCwgY2hhcF9zaXplOworCXN0cnVjdCBxbDRfY2hhcF90YWJsZSAqY2hhcF90YWJsZTsKKwlkbWFfYWRkcl90IGNoYXBfZG1hOworCisJY2hhcF90YWJsZSA9IGRtYV9wb29sX2FsbG9jKGhhLT5jaGFwX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmY2hhcF9kbWEpOworCWlmIChjaGFwX3RhYmxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0X2dldF9jaGFwOworCX0KKworCWNoYXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpOworCW1lbXNldChjaGFwX3RhYmxlLCAwLCBjaGFwX3NpemUpOworCisJaWYgKGlzX3FsYTQwWFgoaGEpKQorCQlvZmZzZXQgPSBGTEFTSF9DSEFQX09GRlNFVCB8IChpZHggKiBjaGFwX3NpemUpOworCWVsc2UgeworCQlvZmZzZXQgPSBGTEFTSF9SQVdfQUNDRVNTX0FERFIgKyAoaGEtPmh3LmZsdF9yZWdpb25fY2hhcCA8PCAyKTsKKwkJLyogZmx0X2NoYXBfc2l6ZSBpcyBDSEFQIHRhYmxlIHNpemUgZm9yIGJvdGggcG9ydHMKKwkJICogc28gZGl2aWRlIGl0IGJ5IDIgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIHNlY29uZCBwb3J0CisJCSAqLworCQlpZiAoaGEtPnBvcnRfbnVtID09IDEpCisJCQlvZmZzZXQgKz0gKGhhLT5ody5mbHRfY2hhcF9zaXplIC8gMik7CisJCW9mZnNldCArPSAoaWR4ICogY2hhcF9zaXplKTsKKwl9CisKKwlydmFsID0gcWxhNHh4eF9nZXRfZmxhc2goaGEsIGNoYXBfZG1hLCBvZmZzZXQsIGNoYXBfc2l6ZSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0X2dldF9jaGFwOworCX0KKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJDaGFwIENvb2tpZTogeCV4XG4iLAorCQlfX2xlMTZfdG9fY3B1KGNoYXBfdGFibGUtPmNvb2tpZSkpKTsKKworCWlmIChfX2xlMTZfdG9fY3B1KGNoYXBfdGFibGUtPmNvb2tpZSkgIT0gQ0hBUF9WQUxJRF9DT09LSUUpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJObyB2YWxpZCBjaGFwIGVudHJ5IGZvdW5kXG4iKTsKKwkJZ290byBleGl0X2dldF9jaGFwOworCX0KKworCXN0cm5jcHkocGFzc3dvcmQsIGNoYXBfdGFibGUtPnNlY3JldCwgUUw0X0NIQVBfTUFYX1NFQ1JFVF9MRU4pOworCXN0cm5jcHkodXNlcm5hbWUsIGNoYXBfdGFibGUtPm5hbWUsIFFMNF9DSEFQX01BWF9OQU1FX0xFTik7CisJY2hhcF90YWJsZS0+Y29va2llID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDSEFQX1ZBTElEX0NPT0tJRSk7CisKK2V4aXRfZ2V0X2NoYXA6CisJZG1hX3Bvb2xfZnJlZShoYS0+Y2hhcF9kbWFfcG9vbCwgY2hhcF90YWJsZSwgY2hhcF9kbWEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9zZXRfY2hhcChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKnVzZXJuYW1lLAorCQkJICAgIGNoYXIgKnBhc3N3b3JkLCB1aW50MTZfdCBpZHgsIGludCBiaWRpKQoreworCWludCByZXQgPSAwOworCWludCBydmFsID0gUUxBX0VSUk9SOworCXVpbnQzMl90IG9mZnNldCA9IDA7CisJc3RydWN0IHFsNF9jaGFwX3RhYmxlICpjaGFwX3RhYmxlOworCWRtYV9hZGRyX3QgY2hhcF9kbWE7CisKKwljaGFwX3RhYmxlID0gZG1hX3Bvb2xfYWxsb2MoaGEtPmNoYXBfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZjaGFwX2RtYSk7CisJaWYgKGNoYXBfdGFibGUgPT0gTlVMTCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBleGl0X3NldF9jaGFwOworCX0KKworCW1lbXNldChjaGFwX3RhYmxlLCAwLCBzaXplb2Yoc3RydWN0IHFsNF9jaGFwX3RhYmxlKSk7CisJaWYgKGJpZGkpCisJCWNoYXBfdGFibGUtPmZsYWdzIHw9IEJJVF82OyAvKiBwZWVyICovCisJZWxzZQorCQljaGFwX3RhYmxlLT5mbGFncyB8PSBCSVRfNzsgLyogbG9jYWwgKi8KKwljaGFwX3RhYmxlLT5zZWNyZXRfbGVuID0gc3RybGVuKHBhc3N3b3JkKTsKKwlzdHJuY3B5KGNoYXBfdGFibGUtPnNlY3JldCwgcGFzc3dvcmQsIE1BWF9DSEFQX1NFQ1JFVF9MRU4pOworCXN0cm5jcHkoY2hhcF90YWJsZS0+bmFtZSwgdXNlcm5hbWUsIE1BWF9DSEFQX05BTUVfTEVOKTsKKwljaGFwX3RhYmxlLT5jb29raWUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENIQVBfVkFMSURfQ09PS0lFKTsKKwlvZmZzZXQgPSBGTEFTSF9DSEFQX09GRlNFVCB8IChpZHggKiBzaXplb2Yoc3RydWN0IHFsNF9jaGFwX3RhYmxlKSk7CisJcnZhbCA9IHFsYTR4eHhfc2V0X2ZsYXNoKGhhLCBjaGFwX2RtYSwgb2Zmc2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpLAorCQkJCUZMQVNIX09QVF9STVdfQ09NTUlUKTsKKworCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmIGhhLT5jaGFwX2xpc3QpIHsKKwkJLyogVXBkYXRlIGhhIGNoYXBfbGlzdCBjYWNoZSAqLworCQltZW1jcHkoKHN0cnVjdCBxbDRfY2hhcF90YWJsZSAqKWhhLT5jaGFwX2xpc3QgKyBpZHgsCisJCSAgICAgICBjaGFwX3RhYmxlLCBzaXplb2Yoc3RydWN0IHFsNF9jaGFwX3RhYmxlKSk7CisJfQorCWRtYV9wb29sX2ZyZWUoaGEtPmNoYXBfZG1hX3Bvb2wsIGNoYXBfdGFibGUsIGNoYXBfZG1hKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0ID0gIC1FSU5WQUw7CisKK2V4aXRfc2V0X2NoYXA6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBxbGE0eHh4X2dldF9jaGFwX2luZGV4IC0gR2V0IGNoYXAgaW5kZXggZ2l2ZW4gdXNlcm5hbWUgYW5kIHNlY3JldAorICogQGhhOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAdXNlcm5hbWU6IENIQVAgdXNlcm5hbWUgdG8gYmUgc2VhcmNoZWQKKyAqIEBwYXNzd29yZDogQ0hBUCBwYXNzd29yZCB0byBiZSBzZWFyY2hlZAorICogQGJpZGk6IElzIHRoaXMgYSBCSURJIENIQVAKKyAqIEBjaGFwX2luZGV4OiBDSEFQIGluZGV4IHRvIGJlIHJldHVybmVkCisgKgorICogTWF0Y2ggdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgY2hhcF9saXN0LCByZXR1cm4gdGhlIGluZGV4IGlmIGEKKyAqIG1hdGNoIGlzIGZvdW5kLiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCB0aGVuIGFkZCB0aGUgZW50cnkgaW4gRkxBU0ggYW5kCisgKiByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIGVudHJ5IGlzIHdyaXR0ZW4gaW4gdGhlIEZMQVNILgorICoqLworc3RhdGljIGludCBxbGE0eHh4X2dldF9jaGFwX2luZGV4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqdXNlcm5hbWUsCisJCQkgICAgY2hhciAqcGFzc3dvcmQsIGludCBiaWRpLCB1aW50MTZfdCAqY2hhcF9pbmRleCkKK3sKKwlpbnQgaSwgcnZhbDsKKwlpbnQgZnJlZV9pbmRleCA9IC0xOworCWludCBmb3VuZF9pbmRleCA9IDA7CisJaW50IG1heF9jaGFwX2VudHJpZXMgPSAwOworCXN0cnVjdCBxbDRfY2hhcF90YWJsZSAqY2hhcF90YWJsZTsKKworCWlmIChpc19xbGE4MDIyKGhhKSkKKwkJbWF4X2NoYXBfZW50cmllcyA9IChoYS0+aHcuZmx0X2NoYXBfc2l6ZSAvIDIpIC8KKwkJCQkJCXNpemVvZihzdHJ1Y3QgcWw0X2NoYXBfdGFibGUpOworCWVsc2UKKwkJbWF4X2NoYXBfZW50cmllcyA9IE1BWF9DSEFQX0VOVFJJRVNfNDBYWDsKKworCWlmICghaGEtPmNoYXBfbGlzdCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkRvIG5vdCBoYXZlIENIQVAgdGFibGUgY2FjaGVcbiIpOworCQlyZXR1cm4gUUxBX0VSUk9SOworCX0KKworCW11dGV4X2xvY2soJmhhLT5jaGFwX3NlbSk7CisJZm9yIChpID0gMDsgaSA8IG1heF9jaGFwX2VudHJpZXM7IGkrKykgeworCQljaGFwX3RhYmxlID0gKHN0cnVjdCBxbDRfY2hhcF90YWJsZSAqKWhhLT5jaGFwX2xpc3QgKyBpOworCQlpZiAoY2hhcF90YWJsZS0+Y29va2llICE9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KENIQVBfVkFMSURfQ09PS0lFKSkgeworCQkJaWYgKGkgPiBNQVhfUkVTUlZfQ0hBUF9JRFggJiYgZnJlZV9pbmRleCA9PSAtMSkKKwkJCQlmcmVlX2luZGV4ID0gaTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChiaWRpKSB7CisJCQlpZiAoY2hhcF90YWJsZS0+ZmxhZ3MgJiBCSVRfNykKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjaGFwX3RhYmxlLT5mbGFncyAmIEJJVF82KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChjaGFwX3RhYmxlLT5zZWNyZXQsIHBhc3N3b3JkLAorCQkJICAgICBNQVhfQ0hBUF9TRUNSRVRfTEVOKSAmJgorCQkgICAgIXN0cm5jbXAoY2hhcF90YWJsZS0+bmFtZSwgdXNlcm5hbWUsCisJCQkgICAgIE1BWF9DSEFQX05BTUVfTEVOKSkgeworCQkJKmNoYXBfaW5kZXggPSBpOworCQkJZm91bmRfaW5kZXggPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBjaGFwIGVudHJ5IGlzIG5vdCBwcmVzZW50IGFuZCBhIGZyZWUgaW5kZXggaXMgYXZhaWxhYmxlIHRoZW4KKwkgKiB3cml0ZSB0aGUgZW50cnkgaW4gZmxhc2gKKwkgKi8KKwlpZiAoIWZvdW5kX2luZGV4ICYmIGZyZWVfaW5kZXggIT0gLTEpIHsKKwkJcnZhbCA9IHFsYTR4eHhfc2V0X2NoYXAoaGEsIHVzZXJuYW1lLCBwYXNzd29yZCwKKwkJCQkJZnJlZV9pbmRleCwgYmlkaSk7CisJCWlmICghcnZhbCkgeworCQkJKmNoYXBfaW5kZXggPSBmcmVlX2luZGV4OworCQkJZm91bmRfaW5kZXggPSAxOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZoYS0+Y2hhcF9zZW0pOworCisJaWYgKGZvdW5kX2luZGV4KQorCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJcmV0dXJuIFFMQV9FUlJPUjsKK30KKworaW50IHFsYTR4eHhfY29ubl9jbG9zZV9zZXNzX2xvZ291dChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgdWludDE2X3QgZndfZGRiX2luZGV4LAorCQkJCSAgIHVpbnQxNl90IGNvbm5lY3Rpb25faWQsCisJCQkJICAgdWludDE2X3Qgb3B0aW9uKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0NPTk5fQ0xPU0VfU0VTU19MT0dPVVQ7CisJbWJveF9jbWRbMV0gPSBmd19kZGJfaW5kZXg7CisJbWJveF9jbWRbMl0gPSBjb25uZWN0aW9uX2lkOworCW1ib3hfY21kWzNdID0gb3B0aW9uOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDQsIDIsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogTUJPWF9DTURfQ09OTl9DTE9TRSAiCisJCQkJICAib3B0aW9uICUwNHggZmFpbGVkIHcvIHN0YXR1cyAlMDRYICUwNFhcbiIsCisJCQkJICBfX2Z1bmNfXywgb3B0aW9uLCBtYm94X3N0c1swXSwgbWJveF9zdHNbMV0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfZGlzYWJsZV9hY2Ioc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJaW50IHN0YXR1cyA9IFFMQV9TVUNDRVNTOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0RJU0FCTEVfQUNCOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIDgsIDUsICZtYm94X2NtZFswXSwgJm1ib3hfc3RzWzBdKTsKKwlpZiAoc3RhdHVzICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlczogTUJPWF9DTURfRElTQUJMRV9BQ0IgIgorCQkJCSAgImZhaWxlZCB3LyBzdGF0dXMgJTA0WCAlMDRYICUwNFgiLCBfX2Z1bmNfXywKKwkJCQkgIG1ib3hfc3RzWzBdLCBtYm94X3N0c1sxXSwgbWJveF9zdHNbMl0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfZ2V0X2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGRtYV9hZGRyX3QgYWNiX2RtYSwKKwkJICAgIHVpbnQzMl90IGFjYl90eXBlLCB1aW50MzJfdCBsZW4pCit7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKworCW1ib3hfY21kWzBdID0gTUJPWF9DTURfR0VUX0FDQjsKKwltYm94X2NtZFsxXSA9IGFjYl90eXBlOworCW1ib3hfY21kWzJdID0gTFNEVyhhY2JfZG1hKTsKKwltYm94X2NtZFszXSA9IE1TRFcoYWNiX2RtYSk7CisJbWJveF9jbWRbNF0gPSBsZW47CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgNSwgNSwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzOiBNQk9YX0NNRF9HRVRfQUNCICIKKwkJCQkgICJmYWlsZWQgdy8gc3RhdHVzICUwNFhcbiIsIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfc2V0X2FjYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90ICptYm94X2NtZCwKKwkJICAgIHVpbnQzMl90ICptYm94X3N0cywgZG1hX2FkZHJfdCBhY2JfZG1hKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKworCW1lbXNldChtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kWzBdKSAqIE1CT1hfUkVHX0NPVU5UKTsKKwltZW1zZXQobWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0c1swXSkgKiBNQk9YX1JFR19DT1VOVCk7CisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9TRVRfQUNCOworCW1ib3hfY21kWzFdID0gMDsgLyogUHJpbWFyeSBBQ0IgKi8KKwltYm94X2NtZFsyXSA9IExTRFcoYWNiX2RtYSk7CisJbWJveF9jbWRbM10gPSBNU0RXKGFjYl9kbWEpOworCW1ib3hfY21kWzRdID0gc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrKTsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCA1LCA1LCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAgIiVzOiBNQk9YX0NNRF9TRVRfQUNCICIKKwkJCQkgICJmYWlsZWQgdy8gc3RhdHVzICUwNFhcbiIsIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfc2V0X3BhcmFtX2RkYmVudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksCisJCQkgICAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCSAgICAgICB1aW50MzJfdCAqbWJ4X3N0cykKIHsKIAlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnk7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IHFsYV9jb25uICpxbGFfY29ubjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyOwogCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKLQl1aW50MzJfdCBkZGJfaW5kZXg7Ci0JaW50IHJldF92YWwgPSBRTEFfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJaW50IHJ2YWwgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNjsKKwljaGFyICppcDsKKwl1aW50MTZfdCBpc2NzaV9vcHRzID0gMDsKKwl1aW50MzJfdCBvcHRpb25zID0gMDsKKwl1aW50MTZfdCBpZHg7CiAKLQotCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJCQkJICBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCiAJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghZndfZGRiX2VudHJ5KSB7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlci5cbiIsCi0JCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKLQkJcmV0X3ZhbCA9IFFMQV9FUlJPUjsKLQkJZ290byBleGl0X3NlbmRfdGd0c19ub19mcmVlOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyLlxuIiwKKwkJCQkgIF9fZnVuY19fKSk7CisJCXJ2YWwgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfc2V0X3BhcmFtX25vX2ZyZWU7CiAJfQogCi0JcmV0X3ZhbCA9IHFsYTR4eHhfZ2V0X2RlZmF1bHRfZGRiKGhhLCBmd19kZGJfZW50cnlfZG1hKTsKLQlpZiAocmV0X3ZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJZ290byBleGl0X3NlbmRfdGd0czsKKwljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJcWxhX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXNlc3MgPSBjb25uLT5zZXNzaW9uOworCWRzdF9hZGRyID0gJnFsYV9jb25uLT5xbGFfZXAtPmRzdF9hZGRyOwogCi0JcmV0X3ZhbCA9IHFsYTR4eHhfcmVxX2RkYl9lbnRyeShoYSwgJmRkYl9pbmRleCk7Ci0JaWYgKHJldF92YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCWdvdG8gZXhpdF9zZW5kX3RndHM7CisJaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCW9wdGlvbnMgfD0gSVBWNl9ERUZBVUxUX0REQl9FTlRSWTsKIAotCW1lbXNldChmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzLCAwLAotCSAgICAgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9hbGlhcykpOworCXN0YXR1cyA9IHFsYTR4eHhfZ2V0X2RlZmF1bHRfZGRiKGhhLCBvcHRpb25zLCBmd19kZGJfZW50cnlfZG1hKTsKKwlpZiAoc3RhdHVzID09IFFMQV9FUlJPUikgeworCQlydmFsID0gLUVJTlZBTDsKKwkJZ290byBleGl0X3NldF9wYXJhbTsKKwl9CiAKLQltZW1zZXQoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lLCAwLAotCSAgICAgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSk7CisJaXNjc2lfb3B0cyA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfb3B0aW9ucyk7CisJbWVtc2V0KGZ3X2RkYl9lbnRyeS0+aXNjc2lfYWxpYXMsIDAsIHNpemVvZihmd19kZGJfZW50cnktPmlzY3NpX2FsaWFzKSk7CisKKwltZW1zZXQoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lLCAwLCBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSk7CisKKwlpZiAoc2Vzcy0+dGFyZ2V0bmFtZSAhPSBOVUxMKSB7CisJCW1lbWNweShmd19kZGJfZW50cnktPmlzY3NpX25hbWUsIHNlc3MtPnRhcmdldG5hbWUsCisJCSAgICAgICBtaW4oc3RybGVuKHNlc3MtPnRhcmdldG5hbWUpLAorCQkgICAgICAgc2l6ZW9mKGZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSkpKTsKKwl9CiAKIAltZW1zZXQoZndfZGRiX2VudHJ5LT5pcF9hZGRyLCAwLCBzaXplb2YoZndfZGRiX2VudHJ5LT5pcF9hZGRyKSk7Ci0JbWVtc2V0KGZ3X2RkYl9lbnRyeS0+dGd0X2FkZHIsIDAsCi0JICAgICAgIHNpemVvZihmd19kZGJfZW50cnktPnRndF9hZGRyKSk7CisJbWVtc2V0KGZ3X2RkYl9lbnRyeS0+dGd0X2FkZHIsIDAsIHNpemVvZihmd19kZGJfZW50cnktPnRndF9hZGRyKSk7CiAKLQlmd19kZGJfZW50cnktPm9wdGlvbnMgPSAoRERCX09QVF9ESVNDX1NFU1NJT04gfCBEREJfT1BUX1RBUkdFVCk7Ci0JZndfZGRiX2VudHJ5LT5wb3J0ID0gY3B1X3RvX2xlMTYobnRvaHMocG9ydCkpOworCWZ3X2RkYl9lbnRyeS0+b3B0aW9ucyA9ICBEREJfT1BUX1RBUkdFVCB8IEREQl9PUFRfQVVUT19TRU5EVEdUU19ESVNBQkxFOwogCi0JZndfZGRiX2VudHJ5LT5pcF9hZGRyWzBdID0gKmlwOwotCWZ3X2RkYl9lbnRyeS0+aXBfYWRkclsxXSA9ICooaXAgKyAxKTsKLQlmd19kZGJfZW50cnktPmlwX2FkZHJbMl0gPSAqKGlwICsgMik7Ci0JZndfZGRiX2VudHJ5LT5pcF9hZGRyWzNdID0gKihpcCArIDMpOworCWlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilkc3RfYWRkcjsKKwkJaXAgPSAoY2hhciAqKSZhZGRyLT5zaW5fYWRkcjsKKwkJbWVtY3B5KGZ3X2RkYl9lbnRyeS0+aXBfYWRkciwgaXAsIElQX0FERFJfTEVOKTsKKwkJZndfZGRiX2VudHJ5LT5wb3J0ID0gY3B1X3RvX2xlMTYobnRvaHMoYWRkci0+c2luX3BvcnQpKTsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICIlczogRGVzdGluYXRpb24gQWRkcmVzcyBbJXBJNF06IGluZGV4IFslZF1cbiIsCisJCQkJICAgX19mdW5jX18sIGZ3X2RkYl9lbnRyeS0+aXBfYWRkciwKKwkJCQkgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7CisJfSBlbHNlIGlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilkc3RfYWRkcjsKKwkJaXAgPSAoY2hhciAqKSZhZGRyNi0+c2luNl9hZGRyOworCQltZW1jcHkoZndfZGRiX2VudHJ5LT5pcF9hZGRyLCBpcCwgSVB2Nl9BRERSX0xFTik7CisJCWZ3X2RkYl9lbnRyeS0+cG9ydCA9IGNwdV90b19sZTE2KG50b2hzKGFkZHI2LT5zaW42X3BvcnQpKTsKKwkJZndfZGRiX2VudHJ5LT5vcHRpb25zIHw9IEREQl9PUFRfSVBWNl9ERVZJQ0U7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiJXM6IERlc3RpbmF0aW9uIEFkZHJlc3MgWyVwSTZdOiBpbmRleCBbJWRdXG4iLAorCQkJCSAgIF9fZnVuY19fLCBmd19kZGJfZW50cnktPmlwX2FkZHIsCisJCQkJICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpOworCX0gZWxzZSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJICAgIiVzOiBGYWlsZWQgdG8gZ2V0IElQIEFkZHJlc3NcbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCXJ2YWwgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfc2V0X3BhcmFtOworCX0KIAotCXJldF92YWwgPSBxbGE0eHh4X3NldF9kZGJfZW50cnkoaGEsIGRkYl9pbmRleCwgZndfZGRiX2VudHJ5X2RtYSk7CisJLyogQ0hBUCAqLworCWlmIChzZXNzLT51c2VybmFtZSAhPSBOVUxMICYmIHNlc3MtPnBhc3N3b3JkICE9IE5VTEwpIHsKKwkJaWYgKHN0cmxlbihzZXNzLT51c2VybmFtZSkgJiYgc3RybGVuKHNlc3MtPnBhc3N3b3JkKSkgeworCQkJaXNjc2lfb3B0cyB8PSBCSVRfNzsKIAotZXhpdF9zZW5kX3RndHM6CisJCQlydmFsID0gcWxhNHh4eF9nZXRfY2hhcF9pbmRleChoYSwgc2Vzcy0+dXNlcm5hbWUsCisJCQkJCQlzZXNzLT5wYXNzd29yZCwKKwkJCQkJCUxPQ0FMX0NIQVAsICZpZHgpOworCQkJaWYgKHJ2YWwpCisJCQkJZ290byBleGl0X3NldF9wYXJhbTsKKworCQkJZndfZGRiX2VudHJ5LT5jaGFwX3RibF9pZHggPSBjcHVfdG9fbGUxNihpZHgpOworCQl9CisJfQorCisJaWYgKHNlc3MtPnVzZXJuYW1lX2luICE9IE5VTEwgJiYgc2Vzcy0+cGFzc3dvcmRfaW4gIT0gTlVMTCkgeworCQkvKiBDaGVjayBpZiBCSURJIENIQVAgKi8KKwkJaWYgKHN0cmxlbihzZXNzLT51c2VybmFtZV9pbikgJiYgc3RybGVuKHNlc3MtPnBhc3N3b3JkX2luKSkgeworCQkJaXNjc2lfb3B0cyB8PSBCSVRfNDsKKworCQkJcnZhbCA9IHFsYTR4eHhfZ2V0X2NoYXBfaW5kZXgoaGEsIHNlc3MtPnVzZXJuYW1lX2luLAorCQkJCQkJICAgICAgc2Vzcy0+cGFzc3dvcmRfaW4sCisJCQkJCQkgICAgICBCSURJX0NIQVAsICZpZHgpOworCQkJaWYgKHJ2YWwpCisJCQkJZ290byBleGl0X3NldF9wYXJhbTsKKwkJfQorCX0KKworCWlmIChzZXNzLT5pbml0aWFsX3IydF9lbikKKwkJaXNjc2lfb3B0cyB8PSBCSVRfMTA7CisKKwlpZiAoc2Vzcy0+aW1tX2RhdGFfZW4pCisJCWlzY3NpX29wdHMgfD0gQklUXzExOworCisJZndfZGRiX2VudHJ5LT5pc2NzaV9vcHRpb25zID0gY3B1X3RvX2xlMTYoaXNjc2lfb3B0cyk7CisKKwlpZiAoY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCkKKwkJZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfcmN2X2RhdGFfc2VnX2xlbiA9CisJCSAgX19jb25zdGFudF9jcHVfdG9fbGUxNigoY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCAvIEJZVEVfVU5JVFMpKTsKKworCWlmIChzZXNzLT5tYXhfcjJ0KQorCQlmd19kZGJfZW50cnktPmlzY3NpX21heF9vdXRzbmRfcjJ0ID0gY3B1X3RvX2xlMTYoc2Vzcy0+bWF4X3IydCk7CisKKwlpZiAoc2Vzcy0+Zmlyc3RfYnVyc3QpCisJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfZmlyc3RfYnVyc3RfbGVuID0KKwkJICAgICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoKHNlc3MtPmZpcnN0X2J1cnN0IC8gQllURV9VTklUUykpOworCisJaWYgKHNlc3MtPm1heF9idXJzdCkKKwkJZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfYnVyc3RfbGVuID0KKwkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoKHNlc3MtPm1heF9idXJzdCAvIEJZVEVfVU5JVFMpKTsKKworCWlmIChzZXNzLT50aW1lMndhaXQpCisJCWZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUyd2FpdCA9CisJCQljcHVfdG9fbGUxNihzZXNzLT50aW1lMndhaXQpOworCisJaWYgKHNlc3MtPnRpbWUycmV0YWluKQorCQlmd19kZGJfZW50cnktPmlzY3NpX2RlZl90aW1lMnJldGFpbiA9CisJCQljcHVfdG9fbGUxNihzZXNzLT50aW1lMnJldGFpbik7CisKKwlzdGF0dXMgPSBxbGE0eHh4X3NldF9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAorCQkJCSAgICAgICBmd19kZGJfZW50cnlfZG1hLCBtYnhfc3RzKTsKKworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpCisJCXJ2YWwgPSAtRUlOVkFMOworZXhpdF9zZXRfcGFyYW06CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKIAkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKLWV4aXRfc2VuZF90Z3RzX25vX2ZyZWU6Ci0JcmV0dXJuIHJldF92YWw7CitleGl0X3NldF9wYXJhbV9ub19mcmVlOgorCXJldHVybiBydmFsOwogfQogCitpbnQgcWxhNHh4eF9nZXRfbWdtdF9kYXRhKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgZndfZGRiX2luZGV4LAorCQkJICB1aW50MTZfdCBzdGF0c19zaXplLCBkbWFfYWRkcl90IHN0YXRzX2RtYSkKK3sKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKworCW1lbXNldChtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kWzBdKSAqIE1CT1hfUkVHX0NPVU5UKTsKKwltZW1zZXQobWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0c1swXSkgKiBNQk9YX1JFR19DT1VOVCk7CisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9HRVRfTUFOQUdFTUVOVF9EQVRBOworCW1ib3hfY21kWzFdID0gZndfZGRiX2luZGV4OworCW1ib3hfY21kWzJdID0gTFNEVyhzdGF0c19kbWEpOworCW1ib3hfY21kWzNdID0gTVNEVyhzdGF0c19kbWEpOworCW1ib3hfY21kWzRdID0gc3RhdHNfc2l6ZTsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCA1LCAxLCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgIiVzOiBNQk9YX0NNRF9HRVRfTUFOQUdFTUVOVF9EQVRBICIKKwkJCQkgICJmYWlsZWQgdy8gc3RhdHVzICUwNFhcbiIsIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfZ2V0X2lwX3N0YXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgYWNiX2lkeCwKKwkJCSB1aW50MzJfdCBpcF9pZHgsIHVpbnQzMl90ICpzdHMpCit7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0dFVF9JUF9BRERSX1NUQVRFOworCW1ib3hfY21kWzFdID0gYWNiX2lkeDsKKwltYm94X2NtZFsyXSA9IGlwX2lkeDsKKworCXN0YXR1cyA9IHFsYTR4eHhfbWFpbGJveF9jb21tYW5kKGhhLCAzLCA4LCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAgIiVzOiAiCisJCQkJICAiTUJPWF9DTURfR0VUX0lQX0FERFJfU1RBVEUgZmFpbGVkIHcvICIKKwkJCQkgICJzdGF0dXMgJTA0WFxuIiwgX19mdW5jX18sIG1ib3hfc3RzWzBdKSk7CisJfQorCW1lbWNweShzdHMsIG1ib3hfc3RzLCBzaXplb2YobWJveF9zdHMpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgcWxhNHh4eF9nZXRfbnZyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBkbWFfYWRkcl90IG52cmFtX2RtYSwKKwkJICAgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQoreworCWludCBzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCisJbWVtc2V0KCZtYm94X2NtZCwgMCwgc2l6ZW9mKG1ib3hfY21kKSk7CisJbWVtc2V0KCZtYm94X3N0cywgMCwgc2l6ZW9mKG1ib3hfc3RzKSk7CisKKwltYm94X2NtZFswXSA9IE1CT1hfQ01EX0dFVF9OVlJBTTsKKwltYm94X2NtZFsxXSA9IExTRFcobnZyYW1fZG1hKTsKKwltYm94X2NtZFsyXSA9IE1TRFcobnZyYW1fZG1hKTsKKwltYm94X2NtZFszXSA9IG9mZnNldDsKKwltYm94X2NtZFs0XSA9IHNpemU7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDEsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJzY3NpJWxkOiAlczogZmFpbGVkICIKKwkJCQkgICJzdGF0dXMgJTA0WFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IHFsYTR4eHhfc2V0X252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgZG1hX2FkZHJfdCBudnJhbV9kbWEsCisJCSAgICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9TRVRfTlZSQU07CisJbWJveF9jbWRbMV0gPSBMU0RXKG52cmFtX2RtYSk7CisJbWJveF9jbWRbMl0gPSBNU0RXKG52cmFtX2RtYSk7CisJbWJveF9jbWRbM10gPSBvZmZzZXQ7CisJbWJveF9jbWRbNF0gPSBzaXplOworCisJc3RhdHVzID0gcWxhNHh4eF9tYWlsYm94X2NvbW1hbmQoaGEsIE1CT1hfUkVHX0NPVU5ULCAxLCAmbWJveF9jbWRbMF0sCisJCQkJCSAmbWJveF9zdHNbMF0pOworCWlmIChzdGF0dXMgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAic2NzaSVsZDogJXM6IGZhaWxlZCAiCisJCQkJICAic3RhdHVzICUwNFhcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJCQkgIG1ib3hfc3RzWzBdKSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBxbGE0eHh4X3Jlc3RvcmVfZmFjdG9yeV9kZWZhdWx0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICB1aW50MzJfdCByZWdpb24sIHVpbnQzMl90IGZpZWxkMCwKKwkJCQkgICAgIHVpbnQzMl90IGZpZWxkMSkKK3sKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJdWludDMyX3QgbWJveF9jbWRbTUJPWF9SRUdfQ09VTlRdOworCXVpbnQzMl90IG1ib3hfc3RzW01CT1hfUkVHX0NPVU5UXTsKKworCW1lbXNldCgmbWJveF9jbWQsIDAsIHNpemVvZihtYm94X2NtZCkpOworCW1lbXNldCgmbWJveF9zdHMsIDAsIHNpemVvZihtYm94X3N0cykpOworCisJbWJveF9jbWRbMF0gPSBNQk9YX0NNRF9SRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFM7CisJbWJveF9jbWRbM10gPSByZWdpb247CisJbWJveF9jbWRbNF0gPSBmaWVsZDA7CisJbWJveF9jbWRbNV0gPSBmaWVsZDE7CisKKwlzdGF0dXMgPSBxbGE0eHh4X21haWxib3hfY29tbWFuZChoYSwgTUJPWF9SRUdfQ09VTlQsIDMsICZtYm94X2NtZFswXSwKKwkJCQkJICZtYm94X3N0c1swXSk7CisJaWYgKHN0YXR1cyAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJzY3NpJWxkOiAlczogZmFpbGVkICIKKwkJCQkgICJzdGF0dXMgJTA0WFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fLAorCQkJCSAgbWJveF9zdHNbMF0pKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9udnJhbS5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKaW5kZXggYjRiODU5Yi4uNzg1MWYzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMKQEAgLTE1Niw2ICsxNTYsMjcgQEAKIAlyZXR1cm4gdmFsOwogfQogCit1OCByZF9udnJhbV9ieXRlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IG9mZnNldCkKK3sKKwl1MTYgdmFsID0gMDsKKwl1OCBydmFsID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKG9mZnNldCAmIDB4MSkKKwkJaW5kZXggPSAob2Zmc2V0IC0gMSkgLyAyOworCWVsc2UKKwkJaW5kZXggPSBvZmZzZXQgLyAyOworCisJdmFsID0gbGUxNl90b19jcHUocmRfbnZyYW1fd29yZChoYSwgaW5kZXgpKTsKKworCWlmIChvZmZzZXQgJiAweDEpCisJCXJ2YWwgPSAodTgpKCh2YWwgJiAweGZmMDApID4+IDgpOworCWVsc2UKKwkJcnZhbCA9ICh1OCkoKHZhbCAmIDB4MDBmZikpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKIGludCBxbGE0eHh4X2lzX252cmFtX2NvbmZpZ3VyYXRpb25fdmFsaWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSkKIHsKIAlpbnQgc3RhdHVzID0gUUxBX0VSUk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwppbmRleCBmZGZlMjdiLi5mNDg0ZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwpAQCAtMjAxNSwxMSArMjAxNSwxOSBAQAogCQkJaHctPmZsdF9yZWdpb25fYm9vdCA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19GV184MjoKKwkJY2FzZSBGTFRfUkVHX0ZXXzgyXzE6CiAJCQlody0+Zmx0X3JlZ2lvbl9mdyA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19CT09UTE9BRF84MjoKIAkJCWh3LT5mbHRfcmVnaW9uX2Jvb3Rsb2FkID0gc3RhcnQ7CiAJCQlicmVhazsKKwkJY2FzZSBGTFRfUkVHX0lTQ1NJX1BBUkFNOgorCQkJaHctPmZsdF9pc2NzaV9wYXJhbSA9ICBzdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEZMVF9SRUdfSVNDU0lfQ0hBUDoKKwkJCWh3LT5mbHRfcmVnaW9uX2NoYXAgPSAgc3RhcnQ7CisJCQlody0+Zmx0X2NoYXBfc2l6ZSA9ICBsZTMyX3RvX2NwdShyZWdpb24tPnNpemUpOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJZ290byBkb25lOwpAQCAtMjAzMiw2ICsyMDQwLDkgQEAKIAlody0+Zmx0X3JlZ2lvbl9ib290ICAgICA9IEZBX0JPT1RfQ09ERV9BRERSXzgyOwogCWh3LT5mbHRfcmVnaW9uX2Jvb3Rsb2FkID0gRkFfQk9PVF9MT0FEX0FERFJfODI7CiAJaHctPmZsdF9yZWdpb25fZncgICAgICAgPSBGQV9SSVNDX0NPREVfQUREUl84MjsKKwlody0+Zmx0X3JlZ2lvbl9jaGFwCT0gRkFfRkxBU0hfSVNDU0lfQ0hBUDsKKwlody0+Zmx0X2NoYXBfc2l6ZQk9IEZBX0ZMQVNIX0NIQVBfU0laRTsKKwogZG9uZToKIAlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRkxUWyVzXTogZmx0PTB4JXggZmR0PTB4JXggIgogCSAgICAiYm9vdD0weCV4IGJvb3Rsb2FkPTB4JXggZnc9MHgleFxuIiwgbG9jLCBody0+Zmx0X3JlZ2lvbl9mbHQsCkBAIC0yMjU4LDEwICsyMjY5LDE2IEBACiAJfQogCiAJLyogU2F2ZSBNLkEuQy4gYWRkcmVzcyAmIHNlcmlhbF9udW1iZXIgKi8KKwloYS0+cG9ydF9udW0gPSBzeXNfaW5mby0+cG9ydF9udW07CiAJbWVtY3B5KGhhLT5teV9tYWMsICZzeXNfaW5mby0+bWFjX2FkZHJbMF0sCiAJICAgIG1pbihzaXplb2YoaGEtPm15X21hYyksIHNpemVvZihzeXNfaW5mby0+bWFjX2FkZHIpKSk7CiAJbWVtY3B5KGhhLT5zZXJpYWxfbnVtYmVyLCAmc3lzX2luZm8tPnNlcmlhbF9udW1iZXIsCiAJICAgIG1pbihzaXplb2YoaGEtPnNlcmlhbF9udW1iZXIpLCBzaXplb2Yoc3lzX2luZm8tPnNlcmlhbF9udW1iZXIpKSk7CisJbWVtY3B5KGhhLT5tb2RlbF9uYW1lLCAmc3lzX2luZm8tPmJvYXJkX2lkX3N0ciwKKwkgICAgICAgbWluKHNpemVvZihoYS0+bW9kZWxfbmFtZSksIHNpemVvZihzeXNfaW5mby0+Ym9hcmRfaWRfc3RyKSkpOworCWhhLT5waHlfcG9ydF9jbnQgPSBzeXNfaW5mby0+cGh5c19wb3J0X2NudDsKKwloYS0+cGh5X3BvcnRfbnVtID0gc3lzX2luZm8tPnBvcnRfbnVtOworCWhhLT5pc2NzaV9wY2lfZnVuY19jbnQgPSBzeXNfaW5mby0+aXNjc2lfcGNpX2Z1bmNfY250OwogCiAJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6ICIKIAkgICAgIm1hYyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCmluZGV4IGYyMzY0ZWMuLjMwZjMxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCkBAIC02LDYgKzYsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaXNjc2lfYm9vdF9zeXNmcy5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaWNhbS5oPgpAQCAtNjMsNiArNjUsNyBAQAogCQkiVGFyZ2V0IFNlc3Npb24gUmVjb3ZlcnkgVGltZW91dC5cbiIKIAkJIiBEZWZhdWx0OiAzMCBzZWMuIik7CiAKK3N0YXRpYyBpbnQgcWxhNHh4eF93YWl0X2Zvcl9oYmFfb25saW5lKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiAvKgogICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCkBAIC03MSwxOCArNzQsNDEgQEAKIC8qCiAgKiBpU0NTSSB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMKICAqLwotc3RhdGljIGludCBxbGE0eHh4X3RndF9kc2N2cihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCSAgICAgZW51bSBpc2NzaV90Z3RfZHNjdnIgdHlwZSwgdWludDMyX3QgZW5hYmxlLAotCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyKTsKIHN0YXRpYyBpbnQgcWxhNHh4eF9jb25uX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4sCiAJCQkJICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYpOwotc3RhdGljIGludCBxbGE0eHh4X3Nlc3NfZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzcywKLQkJCQkgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1Zik7CiBzdGF0aWMgaW50IHFsYTR4eHhfaG9zdF9nZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJICBlbnVtIGlzY3NpX2hvc3RfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1Zik7Ci1zdGF0aWMgdm9pZCBxbGE0eHh4X3JlY292ZXJ5X3RpbWVkb3V0KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbik7CitzdGF0aWMgaW50IHFsYTR4eHhfaWZhY2Vfc2V0X3BhcmFtKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkYXRhLAorCQkJCSAgIHVpbnQzMl90IGxlbik7CitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2lmYWNlX3BhcmFtKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsCisJCQkJICAgZW51bSBpc2NzaV9wYXJhbV90eXBlIHBhcmFtX3R5cGUsCisJCQkJICAgaW50IHBhcmFtLCBjaGFyICpidWYpOwogc3RhdGljIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBxbGE0eHh4X2VoX2NtZF90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqc2MpOwotCitzdGF0aWMgc3RydWN0IGlzY3NpX2VuZHBvaW50ICpxbGE0eHh4X2VwX2Nvbm5lY3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkJCQkgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKKwkJCQkJCSBpbnQgbm9uX2Jsb2NraW5nKTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9lcF9wb2xsKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsIGludCB0aW1lb3V0X21zKTsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZXBfZGlzY29ubmVjdChzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwKTsKK3N0YXRpYyBpbnQgcWxhNHh4eF9nZXRfZXBfcGFyYW0oc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKKwkJCQllbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYpOworc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fc3RhcnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uKTsKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKgorcWxhNHh4eF9jb25uX2NyZWF0ZShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzLCB1aW50MzJfdCBjb25uX2lkeCk7CitzdGF0aWMgaW50IHFsYTR4eHhfY29ubl9iaW5kKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24sCisJCQkgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkgICAgIHVpbnQ2NF90IHRyYW5zcG9ydF9mZCwgaW50IGlzX2xlYWRpbmcpOworc3RhdGljIHZvaWQgcWxhNHh4eF9jb25uX2Rlc3Ryb3koc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uKTsKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKgorcWxhNHh4eF9zZXNzaW9uX2NyZWF0ZShzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwLCB1aW50MTZfdCBjbWRzX21heCwKKwkJCXVpbnQxNl90IHFkZXB0aCwgdWludDMyX3QgaW5pdGlhbF9jbWRzbik7CitzdGF0aWMgdm9pZCBxbGE0eHh4X3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3MpOworc3RhdGljIHZvaWQgcWxhNHh4eF90YXNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3ZGF0YSk7CitzdGF0aWMgaW50IHFsYTR4eHhfYWxsb2NfcGR1KHN0cnVjdCBpc2NzaV90YXNrICosIHVpbnQ4X3QpOworc3RhdGljIGludCBxbGE0eHh4X3Rhc2tfeG1pdChzdHJ1Y3QgaXNjc2lfdGFzayAqKTsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfdGFza19jbGVhbnVwKHN0cnVjdCBpc2NzaV90YXNrICopOworc3RhdGljIHZvaWQgcWxhNHh4eF9mYWlsX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbik7CitzdGF0aWMgdm9pZCBxbGE0eHh4X2Nvbm5fZ2V0X3N0YXRzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkJICAgc3RydWN0IGlzY3NpX3N0YXRzICpzdGF0cyk7CiAvKgogICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCkBAIC05NCw3ICsxMjAsOCBAQAogc3RhdGljIGludCBxbGE0eHh4X3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgcWxhNHh4eF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIHZvaWQgcWxhNHh4eF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7Ci1zdGF0aWMgdm9pZCBxbGE0eHh4X3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOworc3RhdGljIG1vZGVfdCBxbDRfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pOworc3RhdGljIGludCBxbGE0eHh4X2hvc3RfcmVzZXQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCByZXNldF90eXBlKTsKIAogc3RhdGljIHN0cnVjdCBxbGE0Xzh4eHhfbGVnYWN5X2ludHJfc2V0IGxlZ2FjeV9pbnRyW10gPQogICAgIFFMQTgyWFhfTEVHQUNZX0lOVFJfQ09ORklHOwpAQCAtMTE1LDkgKzE0Miw2IEBACiAJLnNsYXZlX2FsbG9jCQk9IHFsYTR4eHhfc2xhdmVfYWxsb2MsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gcWxhNHh4eF9zbGF2ZV9kZXN0cm95LAogCi0JLnNjYW5fZmluaXNoZWQJCT0gaXNjc2lfc2Nhbl9maW5pc2hlZCwKLQkuc2Nhbl9zdGFydAkJPSBxbGE0eHh4X3NjYW5fc3RhcnQsCi0KIAkudGhpc19pZAkJPSAtMSwKIAkuY21kX3Blcl9sdW4JCT0gMywKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCkBAIC0xMjUsNTYgKzE0OSwzOTQgQEAKIAogCS5tYXhfc2VjdG9ycwkJPSAweEZGRkYsCiAJLnNob3N0X2F0dHJzCQk9IHFsYTR4eHhfaG9zdF9hdHRycywKKwkuaG9zdF9yZXNldAkJPSBxbGE0eHh4X2hvc3RfcmVzZXQsCisJLnZlbmRvcl9pZAkJPSBTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfUUxPR0lDLAogfTsKIAogc3RhdGljIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCT0gRFJJVkVSX05BTUUsCi0JLmNhcHMJCQk9IENBUF9GV19EQiB8IENBUF9TRU5EVEFSR0VUU19PRkZMT0FEIHwKLQkJCQkgIENBUF9EQVRBX1BBVEhfT0ZGTE9BRCwKLQkucGFyYW1fbWFzawkJPSBJU0NTSV9DT05OX1BPUlQgfCBJU0NTSV9DT05OX0FERFJFU1MgfAotCQkJCSAgSVNDU0lfVEFSR0VUX05BTUUgfCBJU0NTSV9UUEdUIHwKLQkJCQkgIElTQ1NJX1RBUkdFVF9BTElBUywKLQkuaG9zdF9wYXJhbV9tYXNrCT0gSVNDU0lfSE9TVF9IV0FERFJFU1MgfAotCQkJCSAgSVNDU0lfSE9TVF9JUEFERFJFU1MgfAotCQkJCSAgSVNDU0lfSE9TVF9JTklUSUFUT1JfTkFNRSwKLQkudGd0X2RzY3ZyCQk9IHFsYTR4eHhfdGd0X2RzY3ZyLAorCS5jYXBzCQkJPSBDQVBfVEVYVF9ORUdPIHwKKwkJCQkgIENBUF9EQVRBX1BBVEhfT0ZGTE9BRCB8IENBUF9IRFJER1NUIHwKKwkJCQkgIENBUF9EQVRBREdTVCB8IENBUF9MT0dJTl9PRkZMT0FEIHwKKwkJCQkgIENBUF9NVUxUSV9SMlQsCisJLmF0dHJfaXNfdmlzaWJsZQk9IHFsNF9hdHRyX2lzX3Zpc2libGUsCisJLmNyZWF0ZV9zZXNzaW9uICAgICAgICAgPSBxbGE0eHh4X3Nlc3Npb25fY3JlYXRlLAorCS5kZXN0cm95X3Nlc3Npb24gICAgICAgID0gcWxhNHh4eF9zZXNzaW9uX2Rlc3Ryb3ksCisJLnN0YXJ0X2Nvbm4gICAgICAgICAgICAgPSBxbGE0eHh4X2Nvbm5fc3RhcnQsCisJLmNyZWF0ZV9jb25uICAgICAgICAgICAgPSBxbGE0eHh4X2Nvbm5fY3JlYXRlLAorCS5iaW5kX2Nvbm4gICAgICAgICAgICAgID0gcWxhNHh4eF9jb25uX2JpbmQsCisJLnN0b3BfY29ubiAgICAgICAgICAgICAgPSBpc2NzaV9jb25uX3N0b3AsCisJLmRlc3Ryb3lfY29ubiAgICAgICAgICAgPSBxbGE0eHh4X2Nvbm5fZGVzdHJveSwKKwkuc2V0X3BhcmFtICAgICAgICAgICAgICA9IGlzY3NpX3NldF9wYXJhbSwKIAkuZ2V0X2Nvbm5fcGFyYW0JCT0gcWxhNHh4eF9jb25uX2dldF9wYXJhbSwKLQkuZ2V0X3Nlc3Npb25fcGFyYW0JPSBxbGE0eHh4X3Nlc3NfZ2V0X3BhcmFtLAorCS5nZXRfc2Vzc2lvbl9wYXJhbQk9IGlzY3NpX3Nlc3Npb25fZ2V0X3BhcmFtLAorCS5nZXRfZXBfcGFyYW0gICAgICAgICAgID0gcWxhNHh4eF9nZXRfZXBfcGFyYW0sCisJLmVwX2Nvbm5lY3QJCT0gcWxhNHh4eF9lcF9jb25uZWN0LAorCS5lcF9wb2xsCQk9IHFsYTR4eHhfZXBfcG9sbCwKKwkuZXBfZGlzY29ubmVjdAkJPSBxbGE0eHh4X2VwX2Rpc2Nvbm5lY3QsCisJLmdldF9zdGF0cwkJPSBxbGE0eHh4X2Nvbm5fZ2V0X3N0YXRzLAorCS5zZW5kX3BkdQkJPSBpc2NzaV9jb25uX3NlbmRfcGR1LAorCS54bWl0X3Rhc2sJCT0gcWxhNHh4eF90YXNrX3htaXQsCisJLmNsZWFudXBfdGFzawkJPSBxbGE0eHh4X3Rhc2tfY2xlYW51cCwKKwkuYWxsb2NfcGR1CQk9IHFsYTR4eHhfYWxsb2NfcGR1LAorCiAJLmdldF9ob3N0X3BhcmFtCQk9IHFsYTR4eHhfaG9zdF9nZXRfcGFyYW0sCi0JLnNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQgPSBxbGE0eHh4X3JlY292ZXJ5X3RpbWVkb3V0LAorCS5zZXRfaWZhY2VfcGFyYW0JPSBxbGE0eHh4X2lmYWNlX3NldF9wYXJhbSwKKwkuZ2V0X2lmYWNlX3BhcmFtCT0gcWxhNHh4eF9nZXRfaWZhY2VfcGFyYW0sCisJLmJzZ19yZXF1ZXN0CQk9IHFsYTR4eHhfYnNnX3JlcXVlc3QsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICpxbGE0eHh4X3Njc2lfdHJhbnNwb3J0OwogCitzdGF0aWMgbW9kZV90IHFsNF9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSkKK3sKKwlzd2l0Y2ggKHBhcmFtX3R5cGUpIHsKKwljYXNlIElTQ1NJX0hPU1RfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0lOSVRJQVRPUl9OQU1FOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgSVNDU0lfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9QQVJBTV9QRVJTSVNURU5UX0FERFJFU1M6CisJCWNhc2UgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9QT1JUOgorCQljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJY2FzZSBJU0NTSV9QQVJBTV9DT05OX1BPUlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUU6CisJCWNhc2UgSVNDU0lfUEFSQU1fVFBHVDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9UQVJHRVRfQUxJQVM6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX0JVUlNUOgorCQljYXNlIElTQ1NJX1BBUkFNX01BWF9SMlQ6CisJCWNhc2UgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1Q6CisJCWNhc2UgSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDoKKwkJY2FzZSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOgorCQljYXNlIElTQ1NJX1BBUkFNX0lGQUNFX05BTUU6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBJU0NTSV9ORVRfUEFSQU06CisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVDoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9HVzoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9CT09UUFJPVE86CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUw6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUjoKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVI6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUl9BVVRPQ0ZHOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTF9BVVRPQ0ZHOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0lEOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZOgorCQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX01UVToKKwkJY2FzZSBJU0NTSV9ORVRfUEFSQU1fUE9SVDoKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2dldF9pZmFjZV9wYXJhbShzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlLAorCQkJCSAgIGVudW0gaXNjc2lfcGFyYW1fdHlwZSBwYXJhbV90eXBlLAorCQkJCSAgIGludCBwYXJhbSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfaWZhY2VfdG9fc2hvc3QoaWZhY2UpOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IHRvX3FsYV9ob3N0KHNob3N0KTsKKwlpbnQgbGVuID0gLUVOT1NZUzsKKworCWlmIChwYXJhbV90eXBlICE9IElTQ1NJX05FVF9QQVJBTSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSOgorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTRcbiIsICZoYS0+aXBfY29uZmlnLmlwX2FkZHJlc3MpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVDoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlcEk0XG4iLCAmaGEtPmlwX2NvbmZpZy5zdWJuZXRfbWFzayk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfR1c6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwgJmhhLT5pcF9jb25maWcuZ2F0ZXdheSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKKwkJaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkJICAgICAgKGhhLT5pcF9jb25maWcuaXB2NF9vcHRpb25zICYKKwkJCQkgICAgICAgSVBPUFRfSVBWNF9QUk9UT0NPTF9FTkFCTEUpID8KKwkJCQkgICAgICAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJZWxzZSBpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY2KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X29wdGlvbnMgJgorCQkJCSAgICAgICBJUFY2X09QVF9JUFY2X1BST1RPQ09MX0VOQUJMRSkgPworCQkJCSAgICAgICAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9CT09UUFJPVE86CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkgICAgICAoaGEtPmlwX2NvbmZpZy50Y3Bfb3B0aW9ucyAmIFRDUE9QVF9ESENQX0VOQUJMRSkgPworCQkJICAgICAgImRoY3AiIDogInN0YXRpYyIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFI6CisJCWlmIChpZmFjZS0+aWZhY2VfbnVtID09IDApCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTZcbiIsICZoYS0+aXBfY29uZmlnLmlwdjZfYWRkcjApOworCQlpZiAoaWZhY2UtPmlmYWNlX251bSA9PSAxKQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlcEk2XG4iLCAmaGEtPmlwX2NvbmZpZy5pcHY2X2FkZHIxKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUw6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNlxuIiwKKwkJCSAgICAgICZoYS0+aXBfY29uZmlnLmlwdjZfbGlua19sb2NhbF9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVI6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNlxuIiwKKwkJCSAgICAgICZoYS0+aXBfY29uZmlnLmlwdjZfZGVmYXVsdF9yb3V0ZXJfYWRkcik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUl9BVVRPQ0ZHOgorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkJICAgICAgKGhhLT5pcF9jb25maWcuaXB2Nl9hZGRsX29wdGlvbnMgJgorCQkJICAgICAgIElQVjZfQURET1BUX05FSUdIQk9SX0RJU0NPVkVSWV9BRERSX0VOQUJMRSkgPworCQkJICAgICAgICJuZCIgOiAic3RhdGljIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkc6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X2FkZGxfb3B0aW9ucyAmCisJCQkgICAgICAgSVBWNl9BRERPUFRfQVVUT0NPTkZJR19MSU5LX0xPQ0FMX0FERFIpID8KKwkJCSAgICAgICAiYXV0byIgOiAic3RhdGljIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQ6CisJCWlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJCSAgICAgIChoYS0+aXBfY29uZmlnLmlwdjRfdmxhbl90YWcgJgorCQkJCSAgICAgICBJU0NTSV9NQVhfVkxBTl9JRCkpOworCQllbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJCSAgICAgIChoYS0+aXBfY29uZmlnLmlwdjZfdmxhbl90YWcgJgorCQkJCSAgICAgICBJU0NTSV9NQVhfVkxBTl9JRCkpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZOgorCQlpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY0KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCQkgICAgICAoKGhhLT5pcF9jb25maWcuaXB2NF92bGFuX3RhZyA+PiAxMykgJgorCQkJCQlJU0NTSV9NQVhfVkxBTl9QUklPUklUWSkpOworCQllbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpCisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJCSAgICAgICgoaGEtPmlwX2NvbmZpZy5pcHY2X3ZsYW5fdGFnID4+IDEzKSAmCisJCQkJCUlTQ1NJX01BWF9WTEFOX1BSSU9SSVRZKSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fRU5BQkxFRDoKKwkJaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkJICAgICAgKGhhLT5pcF9jb25maWcuaXB2NF9vcHRpb25zICYKKwkJCQkgICAgICAgSVBPUFRfVkxBTl9UQUdHSU5HX0VOQUJMRSkgPworCQkJCSAgICAgICAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJZWxzZSBpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY2KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCQkgICAgICAoaGEtPmlwX2NvbmZpZy5pcHY2X29wdGlvbnMgJgorCQkJCSAgICAgICBJUFY2X09QVF9WTEFOX1RBR0dJTkdfRU5BQkxFKSA/CisJCQkJICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9NVFU6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGhhLT5pcF9jb25maWcuZXRoX210dV9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fUE9SVDoKKwkJaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGhhLT5pcF9jb25maWcuaXB2NF9wb3J0KTsKKwkJZWxzZSBpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY2KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgaGEtPmlwX2NvbmZpZy5pcHY2X3BvcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZW4gPSAtRU5PU1lTOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKgorcWxhNHh4eF9lcF9jb25uZWN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAorCQkgICBpbnQgbm9uX2Jsb2NraW5nKQoreworCWludCByZXQ7CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXA7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNjsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlpZiAoIXNob3N0KSB7CisJCXJldCA9IC1FTlhJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2hvc3QgaXMgTlVMTFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwloYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisKKwllcCA9IGlzY3NpX2NyZWF0ZV9lbmRwb2ludChzaXplb2Yoc3RydWN0IHFsYV9lbmRwb2ludCkpOworCWlmICghZXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKKwltZW1zZXQocWxhX2VwLCAwLCBzaXplb2Yoc3RydWN0IHFsYV9lbmRwb2ludCkpOworCWlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJbWVtY3B5KCZxbGFfZXAtPmRzdF9hZGRyLCBkc3RfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZxbGFfZXAtPmRzdF9hZGRyOworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6ICVwSTRcbiIsIF9fZnVuY19fLAorCQkJCSAgKGNoYXIgKikmYWRkci0+c2luX2FkZHIpKTsKKwl9IGVsc2UgaWYgKGRzdF9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJbWVtY3B5KCZxbGFfZXAtPmRzdF9hZGRyLCBkc3RfYWRkciwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJCWFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmcWxhX2VwLT5kc3RfYWRkcjsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiAlcEk2XG4iLCBfX2Z1bmNfXywKKwkJCQkgIChjaGFyICopJmFkZHI2LT5zaW42X2FkZHIpKTsKKwl9CisKKwlxbGFfZXAtPmhvc3QgPSBzaG9zdDsKKworCXJldHVybiBlcDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2VwX3BvbGwoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwgaW50IHRpbWVvdXRfbXMpCit7CisJc3RydWN0IHFsYV9lbmRwb2ludCAqcWxhX2VwOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlpbnQgcmV0ID0gMDsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKKwloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisKKwlpZiAoYWRhcHRlcl91cChoYSkpCisJCXJldCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X2VwX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCkKK3sKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJaXNjc2lfZGVzdHJveV9lbmRwb2ludChlcCk7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9nZXRfZXBfcGFyYW0oc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKKwkJCQllbnVtIGlzY3NpX3BhcmFtIHBhcmFtLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgorCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOgorCQlpZiAoIXFsYV9lcCkKKwkJCXJldHVybiAtRU5PVENPTk47CisKKwkJZHN0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnFsYV9lcC0+ZHN0X2FkZHI7CisJCWlmICghZHN0X2FkZHIpCisJCQlyZXR1cm4gLUVOT1RDT05OOworCisJCXJldHVybiBpc2NzaV9jb25uX2dldF9hZGRyX3BhcmFtKChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKQorCQkJCQkJICZxbGFfZXAtPmRzdF9hZGRyLCBwYXJhbSwgYnVmKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfY29ubl9nZXRfc3RhdHMoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwKKwkJCQkgICBzdHJ1Y3QgaXNjc2lfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgcWxfaXNjc2lfc3RhdHMgKnFsX2lzY3NpX3N0YXRzOworCWludCBzdGF0c19zaXplOworCWludCByZXQ7CisJZG1hX2FkZHJfdCBpc2NzaV9zdGF0c19kbWE7CisKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisKKwljbHNfc2VzcyA9IGlzY3NpX2Nvbm5fdG9fc2Vzc2lvbihjbHNfY29ubik7CisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSBkZGJfZW50cnktPmhhOworCisJc3RhdHNfc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZW9mKHN0cnVjdCBxbF9pc2NzaV9zdGF0cykpOworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCXFsX2lzY3NpX3N0YXRzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzdGF0c19zaXplLAorCQkJCQkgICAgJmlzY3NpX3N0YXRzX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxbF9pc2NzaV9zdGF0cykgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpc2NzaSBzdGF0c1xuIik7CisJCWdvdG8gZXhpdF9nZXRfc3RhdHM7CisJfQorCisJcmV0ID0gIHFsYTR4eHhfZ2V0X21nbXRfZGF0YShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIHN0YXRzX3NpemUsCisJCQkJICAgICBpc2NzaV9zdGF0c19kbWEpOworCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkgICAiVW5hYmxlIHRvIHJldHJlaXZlIGlzY3NpIHN0YXRzXG4iKTsKKwkJZ290byBmcmVlX3N0YXRzOworCX0KKworCS8qIG9jdGV0cyAqLworCXN0YXRzLT50eGRhdGFfb2N0ZXRzID0gbGU2NF90b19jcHUocWxfaXNjc2lfc3RhdHMtPnR4X2RhdGFfb2N0ZXRzKTsKKwlzdGF0cy0+cnhkYXRhX29jdGV0cyA9IGxlNjRfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF9kYXRhX29jdGV0cyk7CisJLyogeG1pdCBwZHVzICovCisJc3RhdHMtPm5vcHR4X3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfbm9wb3V0X3BkdXMpOworCXN0YXRzLT5zY3NpY21kX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfc2NzaV9jbWRfcGR1cyk7CisJc3RhdHMtPnRtZmNtZF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnR4X3RtZl9jbWRfcGR1cyk7CisJc3RhdHMtPmxvZ2luX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfbG9naW5fY21kX3BkdXMpOworCXN0YXRzLT50ZXh0X3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+dHhfdGV4dF9jbWRfcGR1cyk7CisJc3RhdHMtPmRhdGFvdXRfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF9zY3NpX3dyaXRlX3BkdXMpOworCXN0YXRzLT5sb2dvdXRfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT50eF9sb2dvdXRfY21kX3BkdXMpOworCXN0YXRzLT5zbmFja19wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnR4X3NuYWNrX3JlcV9wZHVzKTsKKwkvKiByZWN2IHBkdXMgKi8KKwlzdGF0cy0+bm9wcnhfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF9ub3Bpbl9wZHVzKTsKKwlzdGF0cy0+c2NzaXJzcF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X3Njc2lfcmVzcF9wZHVzKTsKKwlzdGF0cy0+dG1mcnNwX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfdG1mX3Jlc3BfcGR1cyk7CisJc3RhdHMtPnRleHRyc3BfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF90ZXh0X3Jlc3BfcGR1cyk7CisJc3RhdHMtPmRhdGFpbl9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X3Njc2lfcmVhZF9wZHVzKTsKKwlzdGF0cy0+bG9nb3V0cnNwX3BkdXMgPQorCQkJbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X2xvZ291dF9yZXNwX3BkdXMpOworCXN0YXRzLT5yMnRfcGR1cyA9IGxlMzJfdG9fY3B1KHFsX2lzY3NpX3N0YXRzLT5yeF9yMnRfcGR1cyk7CisJc3RhdHMtPmFzeW5jX3BkdXMgPSBsZTMyX3RvX2NwdShxbF9pc2NzaV9zdGF0cy0+cnhfYXN5bmNfcGR1cyk7CisJc3RhdHMtPnJqdF9wZHVzID0gbGUzMl90b19jcHUocWxfaXNjc2lfc3RhdHMtPnJ4X3JlamVjdF9wZHVzKTsKKworZnJlZV9zdGF0czoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc3RhdHNfc2l6ZSwgcWxfaXNjc2lfc3RhdHMsCisJCQkgIGlzY3NpX3N0YXRzX2RtYSk7CitleGl0X2dldF9zdGF0czoKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBlbnVtIGJsa19laF90aW1lcl9yZXR1cm4gcWxhNHh4eF9laF9jbWRfdGltZWRfb3V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjKQogewogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbnVtIGJsa19laF90aW1lcl9yZXR1cm4gcmV0ID0gQkxLX0VIX05PVF9IQU5ETEVEOwogCiAJc2Vzc2lvbiA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzY3NpX3RhcmdldChzYy0+ZGV2aWNlKSk7Ci0JZGRiX2VudHJ5ID0gc2Vzc2lvbi0+ZGRfZGF0YTsKKwlzZXNzID0gc2Vzc2lvbi0+ZGRfZGF0YTsKIAotCS8qIGlmIHdlIGFyZSBub3QgbG9nZ2VkIGluIHRoZW4gdGhlIExMRCBpcyBnb2luZyB0byBjbGVhbiB1cCB0aGUgY21kICovCi0JaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKQotCQlyZXR1cm4gQkxLX0VIX1JFU0VUX1RJTUVSOwotCWVsc2UKLQkJcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKLX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TRVNTSU9OX0ZBSUxFRCkKKwkJcmV0ID0gQkxLX0VIX1JFU0VUX1RJTUVSOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKIAotc3RhdGljIHZvaWQgcWxhNHh4eF9yZWNvdmVyeV90aW1lZG91dChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gc2Vzc2lvbi0+ZGRfZGF0YTsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkZGJfZW50cnktPmhhOwotCi0JaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKSB7Ci0JCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9ERUFEKTsKLQotCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiIFslZF0gc2Vzc2lvbiByZWNvdmVyeSB0aW1lb3V0ICIKLQkJCSAgICAgICJvZiAoJWQpIHNlY3MgZXhoYXVzdGVkLCBtYXJraW5nIGRldmljZSBERUFELlxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCi0JCQkgICAgICBkZGJfZW50cnktPnNlc3MtPnJlY292ZXJ5X3RtbykpOwotCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHFsYTR4eHhfaG9zdF9nZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCkBAIC0xODgsOSArNTUwLDcgQEAKIAkJbGVuID0gc3lzZnNfZm9ybWF0X21hYyhidWYsIGhhLT5teV9tYWMsIE1BQ19BRERSX0xFTik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M6Ci0JCWxlbiA9IHNwcmludGYoYnVmLCAiJWQuJWQuJWQuJWRcbiIsIGhhLT5pcF9hZGRyZXNzWzBdLAotCQkJICAgICAgaGEtPmlwX2FkZHJlc3NbMV0sIGhhLT5pcF9hZGRyZXNzWzJdLAotCQkJICAgICAgaGEtPmlwX2FkZHJlc3NbM10pOworCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVwSTRcbiIsICZoYS0+aXBfY29uZmlnLmlwX2FkZHJlc3MpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUU6CiAJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsIGhhLT5uYW1lX3N0cmluZyk7CkBAIC0yMDIsMTU0ICs1NjIsODUxIEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBxbGE0eHh4X3Nlc3NfZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzcywKLQkJCQkgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIHFsYTR4eHhfY3JlYXRlX2lwdjRfaWZhY2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7Ci0JaW50IGxlbjsKLQotCXN3aXRjaCAocGFyYW0pIHsKLQljYXNlIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FOgotCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlc1xuIiwKLQkJCSAgICAgICBkZGJfZW50cnktPmlzY3NpX25hbWUpOwotCQlicmVhazsKLQljYXNlIElTQ1NJX1BBUkFNX1RQR1Q6Ci0JCWxlbiA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGRkYl9lbnRyeS0+dHBndCk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfUEFSQU1fVEFSR0VUX0FMSUFTOgotCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlc1xuIiwKLQkJICAgIGRkYl9lbnRyeS0+aXNjc2lfYWxpYXMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1NZUzsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHFsYTR4eHhfY29ubl9nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAotCQkJCSAgZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0JaW50IGxlbjsKLQotCXNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihjb25uLT5kZXYucGFyZW50KTsKLQlkZGJfZW50cnkgPSBzZXNzaW9uLT5kZF9kYXRhOwotCi0Jc3dpdGNoIChwYXJhbSkgewotCWNhc2UgSVNDU0lfUEFSQU1fQ09OTl9QT1JUOgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVodVxuIiwgZGRiX2VudHJ5LT5wb3J0KTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9QQVJBTV9DT05OX0FERFJFU1M6Ci0JCS8qIFRPRE86IHdoYXQgYXJlIHRoZSBpcHY2IGJpdHMgKi8KLQkJbGVuID0gc3ByaW50ZihidWYsICIlcEk0XG4iLCAmZGRiX2VudHJ5LT5pcF9hZGRyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBxbGE0eHh4X3RndF9kc2N2cihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCSAgICAgZW51bSBpc2NzaV90Z3RfZHNjdnIgdHlwZSwgdWludDMyX3QgZW5hYmxlLAotCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyKQotewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI7Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjY7Ci0JaW50IHJldCA9IDA7Ci0KLQloYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSBzaG9zdC0+aG9zdGRhdGE7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElTQ1NJX1RHVF9EU0NWUl9TRU5EX1RBUkdFVFM6Ci0JCWlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopZHN0X2FkZHI7Ci0JCQlpZiAocWxhNHh4eF9zZW5kX3RndHMoaGEsIChjaGFyICopJmFkZHItPnNpbl9hZGRyLAotCQkJCQkgICAgICBhZGRyLT5zaW5fcG9ydCkgIT0gUUxBX1NVQ0NFU1MpCi0JCQkJcmV0ID0gLUVJTzsKLQkJfSBlbHNlIGlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCQkvKgotCQkJICogVE9ETzogZml4IHFsYTR4eHhfc2VuZF90Z3RzCi0JCQkgKi8KLQkJCWFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilkc3RfYWRkcjsKLQkJCWlmIChxbGE0eHh4X3NlbmRfdGd0cyhoYSwgKGNoYXIgKikmYWRkcjYtPnNpbjZfYWRkciwKLQkJCQkJICAgICAgYWRkcjYtPnNpbjZfcG9ydCkgIT0gUUxBX1NVQ0NFU1MpCi0JCQkJcmV0ID0gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtRU5PU1lTOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PU1lTOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHFsYTR4eHhfZGVzdHJveV9zZXNzKHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKLXsKLQlpZiAoIWRkYl9lbnRyeS0+c2VzcykKKwlpZiAoaGEtPmlmYWNlX2lwdjQpCiAJCXJldHVybjsKIAotCWlmIChkZGJfZW50cnktPmNvbm4pIHsKLQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5zdGF0ZSwgRERCX1NUQVRFX0RFQUQpOwotCQlpc2NzaV9yZW1vdmVfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCX0KLQlpc2NzaV9mcmVlX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKKwkvKiBJUHY0ICovCisJaGEtPmlmYWNlX2lwdjQgPSBpc2NzaV9jcmVhdGVfaWZhY2UoaGEtPmhvc3QsCisJCQkJCSAgICAmcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQsCisJCQkJCSAgICBJU0NTSV9JRkFDRV9UWVBFX0lQVjQsIDAsIDApOworCWlmICghaGEtPmlmYWNlX2lwdjQpCisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiQ291bGQgbm90IGNyZWF0ZSBJUHY0IGlTQ1NJICIKKwkJCSAgICJpZmFjZTAuXG4iKTsKIH0KIAotaW50IHFsYTR4eHhfYWRkX3Nlc3Moc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQorc3RhdGljIHZvaWQgcWxhNHh4eF9jcmVhdGVfaXB2Nl9pZmFjZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JaW50IGVycjsKKwlpZiAoIWhhLT5pZmFjZV9pcHY2XzApCisJCS8qIElQdjYgaWZhY2UtMCAqLworCQloYS0+aWZhY2VfaXB2Nl8wID0gaXNjc2lfY3JlYXRlX2lmYWNlKGhhLT5ob3N0LAorCQkJCQkJICAgICAgJnFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0LAorCQkJCQkJICAgICAgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2LCAwLAorCQkJCQkJICAgICAgMCk7CisJaWYgKCFoYS0+aWZhY2VfaXB2Nl8wKQorCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkNvdWxkIG5vdCBjcmVhdGUgSVB2NiBpU0NTSSAiCisJCQkgICAiaWZhY2UwLlxuIik7CiAKLQlkZGJfZW50cnktPnNlc3MtPnJlY292ZXJ5X3RtbyA9IHFsNHhzZXNzX3JlY292ZXJ5X3RtbzsKKwlpZiAoIWhhLT5pZmFjZV9pcHY2XzEpCisJCS8qIElQdjYgaWZhY2UtMSAqLworCQloYS0+aWZhY2VfaXB2Nl8xID0gaXNjc2lfY3JlYXRlX2lmYWNlKGhhLT5ob3N0LAorCQkJCQkJICAgICAgJnFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0LAorCQkJCQkJICAgICAgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2LCAxLAorCQkJCQkJICAgICAgMCk7CisJaWYgKCFoYS0+aWZhY2VfaXB2Nl8xKQorCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkNvdWxkIG5vdCBjcmVhdGUgSVB2NiBpU0NTSSAiCisJCQkgICAiaWZhY2UxLlxuIik7Cit9CiAKLQllcnIgPSBpc2NzaV9hZGRfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKLQlpZiAoZXJyKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBhZGQgc2Vzc2lvbi5cbiIpKTsKLQkJcmV0dXJuIGVycjsKK3N0YXRpYyB2b2lkIHFsYTR4eHhfY3JlYXRlX2lmYWNlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaWYgKGhhLT5pcF9jb25maWcuaXB2NF9vcHRpb25zICYgSVBPUFRfSVBWNF9QUk9UT0NPTF9FTkFCTEUpCisJCXFsYTR4eHhfY3JlYXRlX2lwdjRfaWZhY2UoaGEpOworCisJaWYgKGhhLT5pcF9jb25maWcuaXB2Nl9vcHRpb25zICYgSVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUpCisJCXFsYTR4eHhfY3JlYXRlX2lwdjZfaWZhY2UoaGEpOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfaXB2NF9pZmFjZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaWYgKGhhLT5pZmFjZV9pcHY0KSB7CisJCWlzY3NpX2Rlc3Ryb3lfaWZhY2UoaGEtPmlmYWNlX2lwdjQpOworCQloYS0+aWZhY2VfaXB2NCA9IE5VTEw7CiAJfQorfQogCi0JZGRiX2VudHJ5LT5jb25uID0gaXNjc2lfY3JlYXRlX2Nvbm4oZGRiX2VudHJ5LT5zZXNzLCAwLCAwKTsKLQlpZiAoIWRkYl9lbnRyeS0+Y29ubikgewotCQlpc2NzaV9yZW1vdmVfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWRkIGNvbm5lY3Rpb24uXG4iKSk7CitzdGF0aWMgdm9pZCBxbGE0eHh4X2Rlc3Ryb3lfaXB2Nl9pZmFjZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJaWYgKGhhLT5pZmFjZV9pcHY2XzApIHsKKwkJaXNjc2lfZGVzdHJveV9pZmFjZShoYS0+aWZhY2VfaXB2Nl8wKTsKKwkJaGEtPmlmYWNlX2lwdjZfMCA9IE5VTEw7CisJfQorCWlmIChoYS0+aWZhY2VfaXB2Nl8xKSB7CisJCWlzY3NpX2Rlc3Ryb3lfaWZhY2UoaGEtPmlmYWNlX2lwdjZfMSk7CisJCWhhLT5pZmFjZV9pcHY2XzEgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9kZXN0cm95X2lmYWNlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcWxhNHh4eF9kZXN0cm95X2lwdjRfaWZhY2UoaGEpOworCXFsYTR4eHhfZGVzdHJveV9pcHY2X2lmYWNlKGhhKTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9zZXRfaXB2NihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkgICAgIHN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppZmFjZV9wYXJhbSwKKwkJCSAgICAgc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IpCit7CisJLyoKKwkgKiBpZmFjZV9udW0gMCBpcyB2YWxpZCBmb3IgSVB2NiBBZGRyLCBsaW5rbG9jYWwsIHJvdXRlciwgYXV0b2NmZy4KKwkgKiBpZmFjZV9udW0gMSBpcyB2YWxpZCBvbmx5IGZvciBJUHY2IEFkZHIuCisJICovCisJc3dpdGNoIChpZmFjZV9wYXJhbS0+cGFyYW0pIHsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFI6CisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJLyogSVB2NiBBZGRyIDEgKi8KKwkJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY2X2FkZHIxLCBpZmFjZV9wYXJhbS0+dmFsdWUsCisJCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfYWRkcjEpKTsKKwkJZWxzZQorCQkJLyogSVB2NiBBZGRyIDAgKi8KKwkJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY2X2FkZHIwLCBpZmFjZV9wYXJhbS0+dmFsdWUsCisJCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfYWRkcjApKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUw6CisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJYnJlYWs7CisJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY2X2lmX2lkLCAmaWZhY2VfcGFyYW0tPnZhbHVlWzhdLAorCQkgICAgICAgc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfaWZfaWQpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVI6CisJCWlmIChpZmFjZV9wYXJhbS0+aWZhY2VfbnVtICYgMHgxKQorCQkJYnJlYWs7CisJCW1lbWNweShpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIsIGlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJICAgICAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSX0FVVE9DRkc6CisJCS8qIEF1dG9jZmcgYXBwbGllcyB0byBldmVuIGludGVyZmFjZSAqLworCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKKwkJCWJyZWFrOworCisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfSVBWNl9BVVRPQ0ZHX0RJU0FCTEUpCisJCQlpbml0X2Z3X2NiLT5pcHY2X2FkZHRsX29wdHMgJj0KKwkJCQljcHVfdG9fbGUxNigKKwkJCQkgIH5JUFY2X0FERE9QVF9ORUlHSEJPUl9ESVNDT1ZFUllfQUREUl9FTkFCTEUpOworCQllbHNlIGlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfSVBWNl9BVVRPQ0ZHX05EX0VOQUJMRSkKKwkJCWluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0cyB8PQorCQkJCWNwdV90b19sZTE2KAorCQkJCSAgSVBWNl9BRERPUFRfTkVJR0hCT1JfRElTQ09WRVJZX0FERFJfRU5BQkxFKTsKKwkJZWxzZQorCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIGF1dG9jZmcgc2V0dGluZyBmb3IgIgorCQkJCSAgICJJUHY2IGFkZHJcbiIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTF9BVVRPQ0ZHOgorCQkvKiBBdXRvY2ZnIGFwcGxpZXMgdG8gZXZlbiBpbnRlcmZhY2UgKi8KKwkJaWYgKGlmYWNlX3BhcmFtLT5pZmFjZV9udW0gJiAweDEpCisJCQlicmVhazsKKworCQlpZiAoaWZhY2VfcGFyYW0tPnZhbHVlWzBdID09CisJCSAgICBJU0NTSV9JUFY2X0xJTktMT0NBTF9BVVRPQ0ZHX0VOQUJMRSkKKwkJCWluaXRfZndfY2ItPmlwdjZfYWRkdGxfb3B0cyB8PSBjcHVfdG9fbGUxNigKKwkJCQkJSVBWNl9BRERPUFRfQVVUT0NPTkZJR19MSU5LX0xPQ0FMX0FERFIpOworCQllbHNlIGlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0KKwkJCSBJU0NTSV9JUFY2X0xJTktMT0NBTF9BVVRPQ0ZHX0RJU0FCTEUpCisJCQlpbml0X2Z3X2NiLT5pcHY2X2FkZHRsX29wdHMgJj0gY3B1X3RvX2xlMTYoCisJCQkJICAgICAgIH5JUFY2X0FERE9QVF9BVVRPQ09ORklHX0xJTktfTE9DQUxfQUREUik7CisJCWVsc2UKKwkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiSW52YWxpZCBhdXRvY2ZnIHNldHRpbmcgZm9yICIKKwkJCQkgICAiSVB2NiBsaW5rbG9jYWwgYWRkclxuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfUk9VVEVSX0FVVE9DRkc6CisJCS8qIEF1dG9jZmcgYXBwbGllcyB0byBldmVuIGludGVyZmFjZSAqLworCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKKwkJCWJyZWFrOworCisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfSVBWNl9ST1VURVJfQVVUT0NGR19FTkFCTEUpCisJCQltZW1zZXQoaW5pdF9md19jYi0+aXB2Nl9kZmx0X3J0cl9hZGRyLCAwLAorCQkJICAgICAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY2X2RmbHRfcnRyX2FkZHIpKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSUZBQ0VfRU5BQkxFOgorCQlpZiAoaWZhY2VfcGFyYW0tPnZhbHVlWzBdID09IElTQ1NJX0lGQUNFX0VOQUJMRSkgeworCQkJaW5pdF9md19jYi0+aXB2Nl9vcHRzIHw9CisJCQkJY3B1X3RvX2xlMTYoSVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUpOworCQkJcWxhNHh4eF9jcmVhdGVfaXB2Nl9pZmFjZShoYSk7CisJCX0gZWxzZSB7CisJCQlpbml0X2Z3X2NiLT5pcHY2X29wdHMgJj0KKwkJCQljcHVfdG9fbGUxNih+SVBWNl9PUFRfSVBWNl9QUk9UT0NPTF9FTkFCTEUgJgorCQkJCQkgICAgMHhGRkZGKTsKKwkJCXFsYTR4eHhfZGVzdHJveV9pcHY2X2lmYWNlKGhhKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1RBRzoKKwkJaWYgKGlmYWNlX3BhcmFtLT5sZW4gIT0gc2l6ZW9mKGluaXRfZndfY2ItPmlwdjZfdmxhbl90YWcpKQorCQkJYnJlYWs7CisJCWluaXRfZndfY2ItPmlwdjZfdmxhbl90YWcgPQorCQkJCWNwdV90b19iZTE2KCoodWludDE2X3QgKilpZmFjZV9wYXJhbS0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6CisJCWlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfVkxBTl9FTkFCTEUpCisJCQlpbml0X2Z3X2NiLT5pcHY2X29wdHMgfD0KKwkJCQljcHVfdG9fbGUxNihJUFY2X09QVF9WTEFOX1RBR0dJTkdfRU5BQkxFKTsKKwkJZWxzZQorCQkJaW5pdF9md19jYi0+aXB2Nl9vcHRzICY9CisJCQkJY3B1X3RvX2xlMTYofklQVjZfT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9NVFU6CisJCWluaXRfZndfY2ItPmV0aF9tdHVfc2l6ZSA9CisJCQkJY3B1X3RvX2xlMTYoKih1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1BPUlQ6CisJCS8qIEF1dG9jZmcgYXBwbGllcyB0byBldmVuIGludGVyZmFjZSAqLworCQlpZiAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSAmIDB4MSkKKwkJCWJyZWFrOworCisJCWluaXRfZndfY2ItPmlwdjZfcG9ydCA9CisJCQkJY3B1X3RvX2xlMTYoKih1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiVW5rbm93biBJUHY2IHBhcmFtID0gJWRcbiIsCisJCQkgICBpZmFjZV9wYXJhbS0+cGFyYW0pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfc2V0X2lwdjQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJICAgICBzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaWZhY2VfcGFyYW0sCisJCQkgICAgIHN0cnVjdCBhZGRyX2N0cmxfYmxrICppbml0X2Z3X2NiKQoreworCXN3aXRjaCAoaWZhY2VfcGFyYW0tPnBhcmFtKSB7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSOgorCQltZW1jcHkoaW5pdF9md19jYi0+aXB2NF9hZGRyLCBpZmFjZV9wYXJhbS0+dmFsdWUsCisJCSAgICAgICBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9hZGRyKSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUOgorCQltZW1jcHkoaW5pdF9md19jYi0+aXB2NF9zdWJuZXQsCWlmYWNlX3BhcmFtLT52YWx1ZSwKKwkJICAgICAgIHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X3N1Ym5ldCkpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0dXOgorCQltZW1jcHkoaW5pdF9md19jYi0+aXB2NF9nd19hZGRyLCBpZmFjZV9wYXJhbS0+dmFsdWUsCisJCSAgICAgICBzaXplb2YoaW5pdF9md19jYi0+aXB2NF9nd19hZGRyKSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfQk9PVFBST1RPOgorCQlpZiAoaWZhY2VfcGFyYW0tPnZhbHVlWzBdID09IElTQ1NJX0JPT1RQUk9UT19ESENQKQorCQkJaW5pdF9md19jYi0+aXB2NF90Y3Bfb3B0cyB8PQorCQkJCQljcHVfdG9fbGUxNihUQ1BPUFRfREhDUF9FTkFCTEUpOworCQllbHNlIGlmIChpZmFjZV9wYXJhbS0+dmFsdWVbMF0gPT0gSVNDU0lfQk9PVFBST1RPX1NUQVRJQykKKwkJCWluaXRfZndfY2ItPmlwdjRfdGNwX29wdHMgJj0KKwkJCQkJY3B1X3RvX2xlMTYoflRDUE9QVF9ESENQX0VOQUJMRSk7CisJCWVsc2UKKwkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiSW52YWxpZCBJUHY0IGJvb3Rwcm90b1xuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKKwkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JRkFDRV9FTkFCTEUpIHsKKwkJCWluaXRfZndfY2ItPmlwdjRfaXBfb3B0cyB8PQorCQkJCWNwdV90b19sZTE2KElQT1BUX0lQVjRfUFJPVE9DT0xfRU5BQkxFKTsKKwkJCXFsYTR4eHhfY3JlYXRlX2lwdjRfaWZhY2UoaGEpOworCQl9IGVsc2UgeworCQkJaW5pdF9md19jYi0+aXB2NF9pcF9vcHRzICY9CisJCQkJY3B1X3RvX2xlMTYofklQT1BUX0lQVjRfUFJPVE9DT0xfRU5BQkxFICYKKwkJCQkJICAgIDB4RkZGRik7CisJCQlxbGE0eHh4X2Rlc3Ryb3lfaXB2NF9pZmFjZShoYSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9UQUc6CisJCWlmIChpZmFjZV9wYXJhbS0+bGVuICE9IHNpemVvZihpbml0X2Z3X2NiLT5pcHY0X3ZsYW5fdGFnKSkKKwkJCWJyZWFrOworCQlpbml0X2Z3X2NiLT5pcHY0X3ZsYW5fdGFnID0KKwkJCQljcHVfdG9fYmUxNigqKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9FTkFCTEVEOgorCQlpZiAoaWZhY2VfcGFyYW0tPnZhbHVlWzBdID09IElTQ1NJX1ZMQU5fRU5BQkxFKQorCQkJaW5pdF9md19jYi0+aXB2NF9pcF9vcHRzIHw9CisJCQkJCWNwdV90b19sZTE2KElQT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUpOworCQllbHNlCisJCQlpbml0X2Z3X2NiLT5pcHY0X2lwX29wdHMgJj0KKwkJCQkJY3B1X3RvX2xlMTYofklQT1BUX1ZMQU5fVEFHR0lOR19FTkFCTEUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX05FVF9QQVJBTV9NVFU6CisJCWluaXRfZndfY2ItPmV0aF9tdHVfc2l6ZSA9CisJCQkJY3B1X3RvX2xlMTYoKih1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1BPUlQ6CisJCWluaXRfZndfY2ItPmlwdjRfcG9ydCA9CisJCQkJY3B1X3RvX2xlMTYoKih1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiVW5rbm93biBJUHY0IHBhcmFtID0gJWRcbiIsCisJCQkgICBpZmFjZV9wYXJhbS0+cGFyYW0pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitxbGE0eHh4X2luaXRjYl90b19hY2Ioc3RydWN0IGFkZHJfY3RybF9ibGsgKmluaXRfZndfY2IpCit7CisJc3RydWN0IGFkZHJfY3RybF9ibGtfZGVmICphY2I7CisJYWNiID0gKHN0cnVjdCBhZGRyX2N0cmxfYmxrX2RlZiAqKWluaXRfZndfY2I7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQxLCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDEpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDIsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMikpOworCW1lbXNldChhY2ItPnJlc2VydmVkMywgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQzKSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQ0LCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDQpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDUsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkNSkpOworCW1lbXNldChhY2ItPnJlc2VydmVkNiwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQ2KSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQ3LCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDcpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDgsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkOCkpOworCW1lbXNldChhY2ItPnJlc2VydmVkOSwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQ5KSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQxMCwgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQxMCkpOworCW1lbXNldChhY2ItPnJlc2VydmVkMTEsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMTEpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDEyLCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDEyKSk7CisJbWVtc2V0KGFjYi0+cmVzZXJ2ZWQxMywgMCwgc2l6ZW9mKGFjYi0+cmVzZXJ2ZWQxMykpOworCW1lbXNldChhY2ItPnJlc2VydmVkMTQsIDAsIHNpemVvZihhY2ItPnJlc2VydmVkMTQpKTsKKwltZW1zZXQoYWNiLT5yZXNlcnZlZDE1LCAwLCBzaXplb2YoYWNiLT5yZXNlcnZlZDE1KSk7Cit9CisKK3N0YXRpYyBpbnQKK3FsYTR4eHhfaWZhY2Vfc2V0X3BhcmFtKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3Qoc2hvc3QpOworCWludCBydmFsID0gMDsKKwlzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaWZhY2VfcGFyYW0gPSBOVUxMOworCXN0cnVjdCBhZGRyX2N0cmxfYmxrICppbml0X2Z3X2NiID0gTlVMTDsKKwlkbWFfYWRkcl90IGluaXRfZndfY2JfZG1hOworCXVpbnQzMl90IG1ib3hfY21kW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBtYm94X3N0c1tNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgcmVtID0gbGVuOworCXN0cnVjdCBubGF0dHIgKmF0dHI7CisKKwlpbml0X2Z3X2NiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJCQlzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspLAorCQkJCQkmaW5pdF9md19jYl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghaW5pdF9md19jYikgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBVbmFibGUgdG8gYWxsb2MgaW5pdF9jYlxuIiwKKwkJCSAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogZmluYWxseSByZWFkeSB0byBnbyAqLwotCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOworCW1lbXNldChpbml0X2Z3X2NiLCAwLCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspKTsKKwltZW1zZXQoJm1ib3hfY21kLCAwLCBzaXplb2YobWJveF9jbWQpKTsKKwltZW1zZXQoJm1ib3hfc3RzLCAwLCBzaXplb2YobWJveF9zdHMpKTsKKworCWlmIChxbGE0eHh4X2dldF9pZmNiKGhhLCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSwgaW5pdF9md19jYl9kbWEpKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IGdldCBpZmNiIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlydmFsID0gLUVJTzsKKwkJZ290byBleGl0X2luaXRfZndfY2I7CisJfQorCisJbmxhX2Zvcl9lYWNoX2F0dHIoYXR0ciwgZGF0YSwgbGVuLCByZW0pIHsKKwkJaWZhY2VfcGFyYW0gPSBubGFfZGF0YShhdHRyKTsKKworCQlpZiAoaWZhY2VfcGFyYW0tPnBhcmFtX3R5cGUgIT0gSVNDU0lfTkVUX1BBUkFNKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChpZmFjZV9wYXJhbS0+aWZhY2VfdHlwZSkgeworCQljYXNlIElTQ1NJX0lGQUNFX1RZUEVfSVBWNDoKKwkJCXN3aXRjaCAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSkgeworCQkJY2FzZSAwOgorCQkJCXFsYTR4eHhfc2V0X2lwdjQoaGEsIGlmYWNlX3BhcmFtLCBpbml0X2Z3X2NiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogQ2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBJUHY0IGludGVyZmFjZSAqLworCQkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiSW52YWxpZCBJUHY0IGlmYWNlICIKKwkJCQkJICAgIm51bWJlciA9ICVkXG4iLAorCQkJCQkgICBpZmFjZV9wYXJhbS0+aWZhY2VfbnVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElTQ1NJX0lGQUNFX1RZUEVfSVBWNjoKKwkJCXN3aXRjaCAoaWZhY2VfcGFyYW0tPmlmYWNlX251bSkgeworCQkJY2FzZSAwOgorCQkJY2FzZSAxOgorCQkJCXFsYTR4eHhfc2V0X2lwdjYoaGEsIGlmYWNlX3BhcmFtLCBpbml0X2Z3X2NiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogQ2Fubm90IGhhdmUgbW9yZSB0aGFuIHR3byBJUHY2IGludGVyZmFjZSAqLworCQkJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiSW52YWxpZCBJUHY2IGlmYWNlICIKKwkJCQkJICAgIm51bWJlciA9ICVkXG4iLAorCQkJCQkgICBpZmFjZV9wYXJhbS0+aWZhY2VfbnVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJJbnZhbGlkIGlmYWNlIHR5cGVcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpbml0X2Z3X2NiLT5jb29raWUgPSBjcHVfdG9fbGUzMigweDExQkVBRDVBKTsKKworCXJ2YWwgPSBxbGE0eHh4X3NldF9mbGFzaChoYSwgaW5pdF9md19jYl9kbWEsIEZMQVNIX1NFR01FTlRfSUZDQiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrKSwKKwkJCQkgRkxBU0hfT1BUX1JNV19DT01NSVQpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHNldCBmbGFzaCBtYnggZmFpbGVkXG4iLAorCQkJICAgX19mdW5jX18pOworCQlydmFsID0gLUVJTzsKKwkJZ290byBleGl0X2luaXRfZndfY2I7CisJfQorCisJcWxhNHh4eF9kaXNhYmxlX2FjYihoYSk7CisKKwlxbGE0eHh4X2luaXRjYl90b19hY2IoaW5pdF9md19jYik7CisKKwlydmFsID0gcWxhNHh4eF9zZXRfYWNiKGhhLCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSwgaW5pdF9md19jYl9kbWEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IHNldCBhY2IgbWJ4IGZhaWxlZFxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FSU87CisJCWdvdG8gZXhpdF9pbml0X2Z3X2NiOworCX0KKworCW1lbXNldChpbml0X2Z3X2NiLCAwLCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspKTsKKwlxbGE0eHh4X3VwZGF0ZV9sb2NhbF9pZmNiKGhhLCAmbWJveF9jbWRbMF0sICZtYm94X3N0c1swXSwgaW5pdF9md19jYiwKKwkJCQkgIGluaXRfZndfY2JfZG1hKTsKKworZXhpdF9pbml0X2Z3X2NiOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGspLAorCQkJICBpbml0X2Z3X2NiLCBpbml0X2Z3X2NiX2RtYSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCisJCQkJICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJc3RydWN0IHFsYV9jb25uICpxbGFfY29ubjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyOworCWludCBsZW4gPSAwOworCisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCXFsYV9jb25uID0gY29ubi0+ZGRfZGF0YTsKKwlkc3RfYWRkciA9ICZxbGFfY29ubi0+cWxhX2VwLT5kc3RfYWRkcjsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIElTQ1NJX1BBUkFNX0NPTk5fUE9SVDoKKwljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKKwkJcmV0dXJuIGlzY3NpX2Nvbm5fZ2V0X2FkZHJfcGFyYW0oKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICopCisJCQkJCQkgZHN0X2FkZHIsIHBhcmFtLCBidWYpOworCWRlZmF1bHQ6CisJCXJldHVybiBpc2NzaV9jb25uX2dldF9wYXJhbShjbHNfY29ubiwgcGFyYW0sIGJ1Zik7CisJfQorCisJcmV0dXJuIGxlbjsKKworfQorCitzdGF0aWMgc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICoKK3FsYTR4eHhfc2Vzc2lvbl9jcmVhdGUoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKKwkJCXVpbnQxNl90IGNtZHNfbWF4LCB1aW50MTZfdCBxZGVwdGgsCisJCQl1aW50MzJfdCBpbml0aWFsX2NtZHNuKQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3M7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXN0cnVjdCBxbGFfZW5kcG9pbnQgKnFsYV9lcDsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJdWludDMyX3QgZGRiX2luZGV4OworCXVpbnQzMl90IG1ieF9zdHMgPSAwOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CisJaW50IHJldDsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlpZiAoIWVwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicWxhNHh4eDogbWlzc2luZyBlcC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKKwlkc3RfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmcWxhX2VwLT5kc3RfYWRkcjsKKwloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CisKK2dldF9kZGJfaW5kZXg6CisJZGRiX2luZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdChoYS0+ZGRiX2lkeF9tYXAsIE1BWF9EREJfRU5UUklFUyk7CisKKwlpZiAoZGRiX2luZGV4ID49IE1BWF9EREJfRU5UUklFUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIkZyZWUgRERCIGluZGV4IG5vdCBhdmFpbGFibGVcbiIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoZGRiX2luZGV4LCBoYS0+ZGRiX2lkeF9tYXApKQorCQlnb3RvIGdldF9kZGJfaW5kZXg7CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAiRm91bmQgYSBmcmVlIEREQiBpbmRleCBhdCAlZFxuIiwgZGRiX2luZGV4KSk7CisJcmV0ID0gcWxhNHh4eF9yZXFfZGRiX2VudHJ5KGhhLCBkZGJfaW5kZXgsICZtYnhfc3RzKTsKKwlpZiAocmV0ID09IFFMQV9FUlJPUikgeworCQlpZiAobWJ4X3N0cyA9PSBNQk9YX1NUU19DT01NQU5EX0VSUk9SKSB7CisJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgIkREQiBpbmRleCA9ICVkIG5vdCBhdmFpbGFibGUgdHJ5aW5nIG5leHRcbiIsCisJCQkJICAgZGRiX2luZGV4KTsKKwkJCWdvdG8gZ2V0X2RkYl9pbmRleDsKKwkJfQorCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIkZyZWUgRlcgRERCIG5vdCBhdmFpbGFibGVcbiIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2xzX3Nlc3MgPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCwgcWxhX2VwLT5ob3N0LAorCQkJCSAgICAgICBjbWRzX21heCwgc2l6ZW9mKHN0cnVjdCBkZGJfZW50cnkpLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHFsNF90YXNrX2RhdGEpLAorCQkJCSAgICAgICBpbml0aWFsX2NtZHNuLCBkZGJfaW5kZXgpOworCWlmICghY2xzX3Nlc3MpCisJCXJldHVybiBOVUxMOworCisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5LT5md19kZGJfaW5kZXggPSBkZGJfaW5kZXg7CisJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFOworCWRkYl9lbnRyeS0+aGEgPSBoYTsKKwlkZGJfZW50cnktPnNlc3MgPSBjbHNfc2VzczsKKwljbHNfc2Vzcy0+cmVjb3ZlcnlfdG1vID0gcWw0eHNlc3NfcmVjb3ZlcnlfdG1vOworCWhhLT5md19kZGJfaW5kZXhfbWFwW2RkYl9lbnRyeS0+ZndfZGRiX2luZGV4XSA9IGRkYl9lbnRyeTsKKwloYS0+dG90X2RkYnMrKzsKKworCXJldHVybiBjbHNfc2VzczsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9zZXNzaW9uX2Rlc3Ryb3koc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzcykKK3sKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUJVRzIocHJpbnRrKEtFUk5fSU5GTyAiRnVuYzogJXNcbiIsIF9fZnVuY19fKSk7CisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSBkZGJfZW50cnktPmhhOworCisJcWxhNHh4eF9jbGVhcl9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCXFsYTR4eHhfZnJlZV9kZGIoaGEsIGRkYl9lbnRyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlpc2NzaV9zZXNzaW9uX3RlYXJkb3duKGNsc19zZXNzKTsKK30KKworc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqCitxbGE0eHh4X2Nvbm5fY3JlYXRlKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3MsIHVpbnQzMl90IGNvbm5faWR4KQoreworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2Vzcywgc2l6ZW9mKHN0cnVjdCBxbGFfY29ubiksCisJCQkJICAgIGNvbm5faWR4KTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwlkZGJfZW50cnktPmNvbm4gPSBjbHNfY29ubjsKKworCXJldHVybiBjbHNfY29ubjsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fYmluZChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uLAorCQkJICAgICBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uLAorCQkJICAgICB1aW50NjRfdCB0cmFuc3BvcnRfZmQsIGludCBpc19sZWFkaW5nKQoreworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCXN0cnVjdCBxbGFfY29ubiAqcWxhX2Nvbm47CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKworCWlmIChpc2NzaV9jb25uX2JpbmQoY2xzX3Nlc3Npb24sIGNsc19jb25uLCBpc19sZWFkaW5nKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXAgPSBpc2NzaV9sb29rdXBfZW5kcG9pbnQodHJhbnNwb3J0X2ZkKTsKKwljb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJcWxhX2Nvbm4gPSBjb25uLT5kZF9kYXRhOworCXFsYV9jb25uLT5xbGFfZXAgPSBlcC0+ZGRfZGF0YTsKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGRkYl9lbnRyeSAqcWxhNHh4eF9hbGxvY19zZXNzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3N0YXRpYyBpbnQgcWxhNHh4eF9jb25uX3N0YXJ0KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4pCiB7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzcyA9IGlzY3NpX2Nvbm5fdG9fc2Vzc2lvbihjbHNfY29ubik7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5OworCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKKwl1aW50MzJfdCBtYnhfc3RzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1M7CiAKLQlzZXNzID0gaXNjc2lfYWxsb2Nfc2Vzc2lvbihoYS0+aG9zdCwgJnFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0LAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgZGRiX2VudHJ5KSk7Ci0JaWYgKCFzZXNzKQotCQlyZXR1cm4gTlVMTDsKLQorCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKLQltZW1zZXQoZGRiX2VudHJ5LCAwLCBzaXplb2YoKmRkYl9lbnRyeSkpOwotCWRkYl9lbnRyeS0+aGEgPSBoYTsKLQlkZGJfZW50cnktPnNlc3MgPSBzZXNzOwotCXJldHVybiBkZGJfZW50cnk7CisJaGEgPSBkZGJfZW50cnktPmhhOworCisJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOworCWlmICghZndfZGRiX2VudHJ5KSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBxbGE0eHh4X3NldF9wYXJhbV9kZGJlbnRyeShoYSwgZGRiX2VudHJ5LCBjbHNfY29ubiwgJm1ieF9zdHMpOworCWlmIChyZXQpIHsKKwkJLyogSWYgaXNjc2lkIGlzIHN0b3BwZWQgYW5kIHN0YXJ0ZWQgdGhlbiBubyBuZWVkIHRvIGRvCisJCSogc2V0IHBhcmFtIGFnYWluIHNpbmNlIGRkYiBzdGF0ZSB3aWxsIGJlIGFscmVhZHkKKwkJKiBhY3RpdmUgYW5kIEZXIGRvZXMgbm90IGFsbG93IHNldCBkZGIgdG8gYW4KKwkJKiBhY3RpdmUgc2Vzc2lvbi4KKwkJKi8KKwkJaWYgKG1ieF9zdHMpCisJCQlpZiAoZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID09CisJCQkJCQlEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKKwkJCQlpc2NzaV9jb25uX3N0YXJ0KGRkYl9lbnRyeS0+Y29ubik7CisJCQkJaXNjc2lfY29ubl9sb2dpbl9ldmVudChkZGJfZW50cnktPmNvbm4sCisJCQkJCQlJU0NTSV9DT05OX1NUQVRFX0xPR0dFRF9JTik7CisJCQkJZ290byBleGl0X3NldF9wYXJhbTsKKwkJCX0KKworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBGYWlsZWQgc2V0IHBhcmFtIGZvciBpbmRleFslZF1cbiIsCisJCQkgICBfX2Z1bmNfXywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCQlnb3RvIGV4aXRfY29ubl9zdGFydDsKKwl9CisKKwlzdGF0dXMgPSBxbGE0eHh4X2Nvbm5fb3BlbihoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IExvZ2luIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJICAgc2Vzcy0+dGFyZ2V0bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9jb25uX3N0YXJ0OworCX0KKworCWlmIChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFKQorCQlkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPSBEREJfRFNfTE9HSU5fSU5fUFJPQ0VTUzsKKworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICIlczogRERCIHN0YXRlIFslZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUpKTsKKworZXhpdF9zZXRfcGFyYW06CisJcmV0ID0gMDsKKworZXhpdF9jb25uX3N0YXJ0OgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkgIGZ3X2RkYl9lbnRyeSwgZndfZGRiX2VudHJ5X2RtYSk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcWxhNHh4eF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQorc3RhdGljIHZvaWQgcWxhNHh4eF9jb25uX2Rlc3Ryb3koc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubikKIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBzaG9zdF9wcml2KHNob3N0KTsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksICpkZGJ0ZW1wOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3MgPSBpc2NzaV9jb25uX3RvX3Nlc3Npb24oY2xzX2Nvbm4pOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJaW50IG9wdGlvbnM7CiAKLQkvKiBmaW5pc2ggc2V0dXAgb2Ygc2Vzc2lvbnMgdGhhdCB3ZXJlIGFscmVhZHkgc2V0dXAgaW4gZmlybXdhcmUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGRiX2VudHJ5LCBkZGJ0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7Ci0JCWlmIChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fQUNUSVZFKQotCQkJcWxhNHh4eF9hZGRfc2VzcyhkZGJfZW50cnkpOworCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlvcHRpb25zID0gTE9HT1VUX09QVElPTl9DTE9TRV9TRVNTSU9OOworCWlmIChxbGE0eHh4X3Nlc3Npb25fbG9nb3V0X2RkYihoYSwgZGRiX2VudHJ5LCBvcHRpb25zKSA9PSBRTEFfRVJST1IpCisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IExvZ291dCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF90YXNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3ZGF0YSkKK3sKKwlzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSAqdGFza19kYXRhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgcGFzc3RocnVfc3RhdHVzICpzdHM7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisJc3RydWN0IGlzY3NpX2hkciAqaGRyOworCXVpbnQ4X3QgKmRhdGE7CisJdWludDMyX3QgZGF0YV9sZW47CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJaW50IGhkcl9sZW47CisJaXR0X3QgaXR0OworCisJdGFza19kYXRhID0gY29udGFpbmVyX29mKHdkYXRhLCBzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSwgdGFza193b3JrKTsKKwloYSA9IHRhc2tfZGF0YS0+aGE7CisJdGFzayA9IHRhc2tfZGF0YS0+dGFzazsKKwlzdHMgPSAmdGFza19kYXRhLT5zdHM7CisJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKTsKKworCURFQlVHMyhwcmludGsoS0VSTl9JTkZPICJTdGF0dXMgcmV0dXJuZWRcbiIpKTsKKwlERUJVRzMocWxhNHh4eF9kdW1wX2J1ZmZlcihzdHMsIDY0KSk7CisJREVCVUczKHByaW50ayhLRVJOX0lORk8gIlJlc3BvbnNlIGJ1ZmZlciIpKTsKKwlERUJVRzMocWxhNHh4eF9kdW1wX2J1ZmZlcih0YXNrX2RhdGEtPnJlc3BfYnVmZmVyLCA2NCkpOworCisJY29ubiA9IHRhc2stPmNvbm47CisKKwlzd2l0Y2ggKHN0cy0+Y29tcGxldGlvblN0YXR1cykgeworCWNhc2UgUEFTU1RIUlVfU1RBVFVTX0NPTVBMRVRFOgorCQloZHIgPSAoc3RydWN0IGlzY3NpX2hkciAqKXRhc2tfZGF0YS0+cmVzcF9idWZmZXI7CisJCS8qIEFzc2lnbiBiYWNrIHRoZSBpdHQgaW4gaGRyLCB1bnRpbCB3ZSB1c2UgdGhlIFBSRUFTU0lHTl9UQUcgKi8KKwkJaXR0ID0gc3RzLT5oYW5kbGU7CisJCWhkci0+aXR0ID0gaXR0OworCQlkYXRhID0gdGFza19kYXRhLT5yZXNwX2J1ZmZlciArIGhkcl9sZW47CisJCWRhdGFfbGVuID0gdGFza19kYXRhLT5yZXNwX2xlbiAtIGhkcl9sZW47CisJCWlzY3NpX2NvbXBsZXRlX3BkdShjb25uLCBoZHIsIGRhdGEsIGRhdGFfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJQYXNzdGhydSBmYWlsZWQgc3RhdHVzID0gMHgleFxuIiwKKwkJCSAgIHN0cy0+Y29tcGxldGlvblN0YXR1cyk7CisJCWJyZWFrOwogCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9hbGxvY19wZHUoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2ssIHVpbnQ4X3Qgb3Bjb2RlKQoreworCXN0cnVjdCBxbDRfdGFza19kYXRhICp0YXNrX2RhdGE7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlpbnQgaGRyX2xlbjsKKworCXNlc3MgPSB0YXNrLT5jb25uLT5zZXNzaW9uOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSBkZGJfZW50cnktPmhhOworCXRhc2tfZGF0YSA9IHRhc2stPmRkX2RhdGE7CisJbWVtc2V0KHRhc2tfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBxbDRfdGFza19kYXRhKSk7CisKKwlpZiAodGFzay0+c2MpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAgIiVzOiBTQ1NJIENvbW1hbmRzIG5vdCBpbXBsZW1lbnRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpc2NzaV9oZHIpOworCXRhc2tfZGF0YS0+aGEgPSBoYTsKKwl0YXNrX2RhdGEtPnRhc2sgPSB0YXNrOworCisJaWYgKHRhc2stPmRhdGFfY291bnQpIHsKKwkJdGFza19kYXRhLT5kYXRhX2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZoYS0+cGRldi0+ZGV2LCB0YXNrLT5kYXRhLAorCQkJCQkJICAgICB0YXNrLT5kYXRhX2NvdW50LAorCQkJCQkJICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IE1heFJlY3ZMZW4gJXUsIGlzY3NpIGhyZCAlZFxuIiwKKwkJICAgICAgX19mdW5jX18sIHRhc2stPmNvbm4tPm1heF9yZWN2X2RsZW5ndGgsIGhkcl9sZW4pKTsKKworCXRhc2tfZGF0YS0+cmVzcF9sZW4gPSB0YXNrLT5jb25uLT5tYXhfcmVjdl9kbGVuZ3RoICsgaGRyX2xlbjsKKwl0YXNrX2RhdGEtPnJlc3BfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJCQkJICAgIHRhc2tfZGF0YS0+cmVzcF9sZW4sCisJCQkJCQkgICAgJnRhc2tfZGF0YS0+cmVzcF9kbWEsCisJCQkJCQkgICAgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrX2RhdGEtPnJlc3BfYnVmZmVyKQorCQlnb3RvIGV4aXRfYWxsb2NfcGR1OworCisJdGFza19kYXRhLT5yZXFfbGVuID0gdGFzay0+ZGF0YV9jb3VudCArIGhkcl9sZW47CisJdGFza19kYXRhLT5yZXFfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCQkJCQkJICAgdGFza19kYXRhLT5yZXFfbGVuLAorCQkJCQkJICAgJnRhc2tfZGF0YS0+cmVxX2RtYSwKKwkJCQkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghdGFza19kYXRhLT5yZXFfYnVmZmVyKQorCQlnb3RvIGV4aXRfYWxsb2NfcGR1OworCisJdGFzay0+aGRyID0gdGFza19kYXRhLT5yZXFfYnVmZmVyOworCisJSU5JVF9XT1JLKCZ0YXNrX2RhdGEtPnRhc2tfd29yaywgcWxhNHh4eF90YXNrX3dvcmspOworCisJcmV0dXJuIDA7CisKK2V4aXRfYWxsb2NfcGR1OgorCWlmICh0YXNrX2RhdGEtPnJlc3BfYnVmZmVyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgdGFza19kYXRhLT5yZXNwX2xlbiwKKwkJCQkgIHRhc2tfZGF0YS0+cmVzcF9idWZmZXIsIHRhc2tfZGF0YS0+cmVzcF9kbWEpOworCisJaWYgKHRhc2tfZGF0YS0+cmVxX2J1ZmZlcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHRhc2tfZGF0YS0+cmVxX2xlbiwKKwkJCQkgIHRhc2tfZGF0YS0+cmVxX2J1ZmZlciwgdGFza19kYXRhLT5yZXFfZG1hKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF90YXNrX2NsZWFudXAoc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHFsNF90YXNrX2RhdGEgKnRhc2tfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhOworCWludCBoZHJfbGVuOworCisJaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKTsKKwlzZXNzID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKwl0YXNrX2RhdGEgPSB0YXNrLT5kZF9kYXRhOworCisJaWYgKHRhc2stPmRhdGFfY291bnQpIHsKKwkJZG1hX3VubWFwX3NpbmdsZSgmaGEtPnBkZXYtPmRldiwgdGFza19kYXRhLT5kYXRhX2RtYSwKKwkJCQkgdGFzay0+ZGF0YV9jb3VudCwgUENJX0RNQV9UT0RFVklDRSk7CisJfQorCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBNYXhSZWN2TGVuICV1LCBpc2NzaSBocmQgJWRcbiIsCisJCSAgICAgIF9fZnVuY19fLCB0YXNrLT5jb25uLT5tYXhfcmVjdl9kbGVuZ3RoLCBoZHJfbGVuKSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgdGFza19kYXRhLT5yZXNwX2xlbiwKKwkJCSAgdGFza19kYXRhLT5yZXNwX2J1ZmZlciwgdGFza19kYXRhLT5yZXNwX2RtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHRhc2tfZGF0YS0+cmVxX2xlbiwKKwkJCSAgdGFza19kYXRhLT5yZXFfYnVmZmVyLCB0YXNrX2RhdGEtPnJlcV9kbWEpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBxbGE0eHh4X3Rhc2tfeG1pdChzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRhc2stPnNjOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzID0gdGFzay0+Y29ubi0+c2Vzc2lvbjsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlpZiAoIXNjKQorCQlyZXR1cm4gcWxhNHh4eF9zZW5kX3Bhc3N0aHJ1MCh0YXNrKTsKKworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBzY3NpIGNtZCB4bWl0IG5vdCBpbXBsZW1lbnRlZFxuIiwKKwkJICAgX19mdW5jX18pOworCXJldHVybiAtRU5PU1lTOworfQorCit2b2lkIHFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm47CisJdWludDMyX3QgZGRiX3N0YXRlOworCWRtYV9hZGRyX3QgZndfZGRiX2VudHJ5X2RtYTsKKwlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnk7CisKKwlmd19kZGJfZW50cnkgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCQkJICAmZndfZGRiX2VudHJ5X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kZGJfZW50cnkpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LCBmd19kZGJfZW50cnksCisJCQkJICAgIGZ3X2RkYl9lbnRyeV9kbWEsIE5VTEwsIE5VTEwsICZkZGJfc3RhdGUsCisJCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpID09IFFMQV9FUlJPUikgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJzY3NpJWxkOiAlczogZmFpbGVkICIKKwkJCQkgICJnZXRfZGRiX2VudHJ5IGZvciBmd19kZGJfaW5kZXggJWRcbiIsCisJCQkJICBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkJICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpOworCQlyZXR1cm47CisJfQorCisJY2xzX3Nlc3MgPSBkZGJfZW50cnktPnNlc3M7CisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCisJY2xzX2Nvbm4gPSBkZGJfZW50cnktPmNvbm47CisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCisJLyogVXBkYXRlIHBhcmFtcyAqLworCWNvbm4tPm1heF9yZWN2X2RsZW5ndGggPSBCWVRFX1VOSVRTICoKKwkJCSAgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfcmN2X2RhdGFfc2VnX2xlbik7CisKKwljb25uLT5tYXhfeG1pdF9kbGVuZ3RoID0gQllURV9VTklUUyAqCisJCQkgIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW4pOworCisJc2Vzcy0+aW5pdGlhbF9yMnRfZW4gPQorCQkJICAgIChCSVRfMTAgJiBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX29wdGlvbnMpKTsKKworCXNlc3MtPm1heF9yMnQgPSBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX21heF9vdXRzbmRfcjJ0KTsKKworCXNlc3MtPmltbV9kYXRhX2VuID0gKEJJVF8xMSAmIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfb3B0aW9ucykpOworCisJc2Vzcy0+Zmlyc3RfYnVyc3QgPSBCWVRFX1VOSVRTICoKKwkJCSAgICAgICBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX2ZpcnN0X2J1cnN0X2xlbik7CisKKwlzZXNzLT5tYXhfYnVyc3QgPSBCWVRFX1VOSVRTICoKKwkJCQkgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfYnVyc3RfbGVuKTsKKworCXNlc3MtPnRpbWUyd2FpdCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUyd2FpdCk7CisKKwlzZXNzLT50aW1lMnJldGFpbiA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUycmV0YWluKTsKKworCXNlc3MtPnRwZ3QgPSBsZTMyX3RvX2NwdShmd19kZGJfZW50cnktPnRndF9wb3J0YWxfZ3JwKTsKKworCW1lbWNweShzZXNzLT5pbml0aWF0b3JuYW1lLCBoYS0+bmFtZV9zdHJpbmcsCisJICAgICAgIG1pbihzaXplb2YoaGEtPm5hbWVfc3RyaW5nKSwgc2l6ZW9mKHNlc3MtPmluaXRpYXRvcm5hbWUpKSk7CiB9CiAKIC8qCkBAIC0zNzYsMjUgKzE0MzMsMTUgQEAKIH0KIAogLyoqKgotICogcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nIC0gbWFyayBhIGRldmljZSBhcyBtaXNzaW5nLgotICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3NpbmcgLSBibG9ja3MgdGhlIHNlc3Npb24KKyAqIEBjbHNfc2Vzc2lvbjogUG9pbnRlciB0byB0aGUgc2Vzc2lvbiB0byBiZSBibG9ja2VkCiAgKiBAZGRiX2VudHJ5OiBQb2ludGVyIHRvIGRldmljZSBkYXRhYmFzZSBlbnRyeQogICoKICAqIFRoaXMgcm91dGluZSBtYXJrcyBhIGRldmljZSBtaXNzaW5nIGFuZCBjbG9zZSBjb25uZWN0aW9uLgogICoqLwotdm9pZCBxbGE0eHh4X21hcmtfZGV2aWNlX21pc3Npbmcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAotCQkJCSBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCit2b2lkIHFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyhzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQogewotCWlmICgoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9IEREQl9TVEFURV9ERUFEKSkgewotCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfTUlTU0lORyk7Ci0JCURFQlVHMihwcmludGsoInNjc2klbGQ6IGRkYiBbJWRdIG1hcmtlZCBNSVNTSU5HXG4iLAotCQkgICAgaGEtPmhvc3Rfbm8sIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7Ci0JfSBlbHNlCi0JCURFQlVHMihwcmludGsoInNjc2klbGQ6IGRkYiBbJWRdIERFQURcbiIsIGhhLT5ob3N0X25vLAotCQkgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKQotCi0JaXNjc2lfYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCWlzY3NpX2Nvbm5fZXJyb3JfZXZlbnQoZGRiX2VudHJ5LT5jb25uLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworCWlzY3NpX2Jsb2NrX3Nlc3Npb24oY2xzX3Nlc3Npb24pOwogfQogCiAvKioKQEAgLTQwNSwxMCArMTQ1Miw3IEBACiAgKiovCiB2b2lkIHFsYTR4eHhfbWFya19hbGxfZGV2aWNlc19taXNzaW5nKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksICpkZGJ0ZW1wOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGRkYnRlbXAsICZoYS0+ZGRiX2xpc3QsIGxpc3QpIHsKLQkJcWxhNHh4eF9tYXJrX2RldmljZV9taXNzaW5nKGhhLCBkZGJfZW50cnkpOwotCX0KKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfbWFya19kZXZpY2VfbWlzc2luZyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3JiKiBxbGE0eHh4X2dldF9uZXdfc3JiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKQEAgLTQ5NSwyMCArMTUzOSwxMyBAQAogCQlnb3RvIHFjX2ZhaWxfY29tbWFuZDsKIAl9CiAKLQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpICE9IEREQl9TVEFURV9PTkxJTkUpIHsKLQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSA9PSBEREJfU1RBVEVfREVBRCkgewotCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKLQkJCWdvdG8gcWNfZmFpbF9jb21tYW5kOwotCQl9Ci0JCXJldHVybiBTQ1NJX01MUVVFVUVfVEFSR0VUX0JVU1k7Ci0JfQotCiAJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9JTlRSLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX1JFU0VUX0FDVElWRSwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQSwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KERQQ19IQV9VTlJFQ09WRVJBQkxFLCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRFBDX0hBX05FRURfUVVJRVNDRU5ULCAmaGEtPmRwY19mbGFncykgfHwKIAkgICAgIXRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykgfHwKKwkgICAgIXRlc3RfYml0KEFGX0xJTktfVVAsICZoYS0+ZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQV9GV19DT05URVhULCAmaGEtPmRwY19mbGFncykpCiAJCWdvdG8gcWNfaG9zdF9idXN5OwogCkBAIC01NjMsNiArMTYwMCwxMyBAQAogCiAJaGEtPnNyYl9tZW1wb29sID0gTlVMTDsKIAorCWlmIChoYS0+Y2hhcF9kbWFfcG9vbCkKKwkJZG1hX3Bvb2xfZGVzdHJveShoYS0+Y2hhcF9kbWFfcG9vbCk7CisKKwlpZiAoaGEtPmNoYXBfbGlzdCkKKwkJdmZyZWUoaGEtPmNoYXBfbGlzdCk7CisJaGEtPmNoYXBfbGlzdCA9IE5VTEw7CisKIAkvKiByZWxlYXNlIGlvIHNwYWNlIHJlZ2lzdGVycyAgKi8KIAlpZiAoaXNfcWxhODAyMihoYSkpIHsKIAkJaWYgKGhhLT5ueF9wY2liYXNlKQpAQCAtNjM2LDYgKzE2ODAsMTUgQEAKIAkJZ290byBtZW1fYWxsb2NfZXJyb3JfZXhpdDsKIAl9CiAKKwloYS0+Y2hhcF9kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgicWw0X2NoYXAiLCAmaGEtPnBkZXYtPmRldiwKKwkJCQkJICAgIENIQVBfRE1BX0JMT0NLX1NJWkUsIDgsIDApOworCisJaWYgKGhhLT5jaGFwX2RtYV9wb29sID09IE5VTEwpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIiVzOiBjaGFwX2RtYV9wb29sIGFsbG9jYXRpb24gZmFpbGVkLi5cbiIsIF9fZnVuY19fKTsKKwkJZ290byBtZW1fYWxsb2NfZXJyb3JfZXhpdDsKKwl9CisKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAKIG1lbV9hbGxvY19lcnJvcl9leGl0OgpAQCAtNzUzLDcgKzE4MDYsNiBAQAogICoqLwogc3RhdGljIHZvaWQgcWxhNHh4eF90aW1lcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCAqZHRlbXA7CiAJaW50IHN0YXJ0X2RwYyA9IDA7CiAJdWludDE2X3QgdzsKIApAQCAtNzczLDY5ICsxODI1LDYgQEAKIAkJcWxhNF84eHh4X3dhdGNoZG9nKGhhKTsKIAl9CiAKLQkvKiBTZWFyY2ggZm9yIHJlbG9naW4ncyB0byB0aW1lLW91dCBhbmQgcG9ydCBkb3duIHJldHJ5LiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGR0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7Ci0JCS8qIENvdW50IGRvd24gdGltZSBiZXR3ZWVuIHNlbmRpbmcgcmVsb2dpbnMgKi8KLQkJaWYgKGFkYXB0ZXJfdXAoaGEpICYmCi0JCSAgICAhdGVzdF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpICYmCi0JCSAgICBhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX09OTElORSkgewotCQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIpICE9Ci0JCQkgICAgSU5WQUxJRF9FTlRSWSkgewotCQkJCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyKQotCQkJCSAgICAJCT09IDApIHsKLQkJCQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT4KLQkJCQkJCXJldHJ5X3JlbG9naW5fdGltZXIsCi0JCQkJCQlJTlZBTElEX0VOVFJZKTsKLQkJCQkJc2V0X2JpdChEUENfUkVMT0dJTl9ERVZJQ0UsCi0JCQkJCQkmaGEtPmRwY19mbGFncyk7Ci0JCQkJCXNldF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpOwotCQkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogZGRiIFslZF0iCi0JCQkJCQkgICAgICAiIGxvZ2luIGRldmljZVxuIiwKLQkJCQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJCQkJCSAgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWF0b21pY19kZWMoJmRkYl9lbnRyeS0+Ci0JCQkJCQkJcmV0cnlfcmVsb2dpbl90aW1lcik7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXYWl0IGZvciByZWxvZ2luIHRvIHRpbWVvdXQgKi8KLQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIpICYmCi0JCSAgICAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyKSAhPSAwKSkgewotCQkJLyoKLQkJCSAqIElmIHRoZSByZWxvZ2luIHRpbWVzIG91dCBhbmQgdGhlIGRldmljZSBpcwotCQkJICogc3RpbGwgTk9UIE9OTElORSB0aGVuIHRyeSBhbmQgcmVsb2dpbiBhZ2Fpbi4KLQkJCSAqLwotCQkJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPQotCQkJICAgIEREQl9TVEFURV9PTkxJTkUgJiYKLQkJCSAgICBkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0KLQkJCSAgICBEREJfRFNfU0VTU0lPTl9GQUlMRUQpIHsKLQkJCQkvKiBSZXNldCByZXRyeSByZWxvZ2luIHRpbWVyICovCi0JCQkJYXRvbWljX2luYygmZGRiX2VudHJ5LT5yZWxvZ2luX3JldHJ5X2NvdW50KTsKLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiBkZGIgWyVkXSByZWxvZ2luIgotCQkJCQkgICAgICAiIHRpbWVkIG91dC1yZXRyeWluZyIKLQkJCQkJICAgICAgIiByZWxvZ2luICglZClcbiIsCi0JCQkJCSAgICAgIGhhLT5ob3N0X25vLAotCQkJCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCwKLQkJCQkJICAgICAgYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+Ci0JCQkJCQkJICByZWxvZ2luX3JldHJ5X2NvdW50KSkKLQkJCQkJKTsKLQkJCQlzdGFydF9kcGMrKzsKLQkJCQlERUJVRyhwcmludGsoInNjc2klbGQ6JWQ6JWQ6IGRkYiBbJWRdICIKLQkJCQkJICAgICAiaW5pdGlhdGUgcmVsb2dpbiBhZnRlciIKLQkJCQkJICAgICAiICVkIHNlY29uZHNcbiIsCi0JCQkJCSAgICAgaGEtPmhvc3Rfbm8sIGRkYl9lbnRyeS0+YnVzLAotCQkJCQkgICAgIGRkYl9lbnRyeS0+dGFyZ2V0LAotCQkJCQkgICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAotCQkJCQkgICAgIGRkYl9lbnRyeS0+ZGVmYXVsdF90aW1lMndhaXQgKyA0KQotCQkJCQkpOwotCi0JCQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyLAotCQkJCQkgICBkZGJfZW50cnktPmRlZmF1bHRfdGltZTJ3YWl0ICsgNCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KIAlpZiAoIWlzX3FsYTgwMjIoaGEpKSB7CiAJCS8qIENoZWNrIGZvciBoZWFydGJlYXQgaW50ZXJ2YWwuICovCiAJCWlmIChoYS0+ZmlybXdhcmVfb3B0aW9ucyAmIEZXT1BUX0hFQVJUQkVBVF9FTkFCTEUgJiYKQEAgLTEwODEsNiArMjA3MCwxNyBAQAogCWNsZWFyX2JpdChBRl9JTklUX0RPTkUsICZoYS0+ZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBxbGE0eHh4X2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKworCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9IEREQl9EU19TRVNTSU9OX0ZBSUxFRDsKKwlpc2NzaV9zZXNzaW9uX2ZhaWx1cmUoY2xzX3Nlc3Npb24tPmRkX2RhdGEsIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7Cit9CisKIC8qKgogICogcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIgLSByZWNvdmVycyBhZGFwdGVyIGFmdGVyIGEgZmF0YWwgZXJyb3IKICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgpAQCAtMTA5MywxMSArMjA5MywxNCBAQAogCS8qIFN0YWxsIGluY29taW5nIEkvTyB1bnRpbCB3ZSBhcmUgZG9uZSAqLwogCXNjc2lfYmxvY2tfcmVxdWVzdHMoaGEtPmhvc3QpOwogCWNsZWFyX2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpOworCWNsZWFyX2JpdChBRl9MSU5LX1VQLCAmaGEtPmZsYWdzKTsKIAogCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogYWRhcHRlciBPRkZMSU5FXG4iLCBfX2Z1bmNfXykpOwogCiAJc2V0X2JpdChEUENfUkVTRVRfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CiAKKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfZmFpbF9zZXNzaW9uKTsKKwogCWlmICh0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkKIAkJcmVzZXRfY2hpcCA9IDE7CiAKQEAgLTExNjAsNyArMjE2Myw3IEBACiAKIAkJLyogTk9URTogQUZfT05MSU5FIGZsYWcgc2V0IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mCiAJCSAqICAgICAgIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyICovCi0JCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBQUkVTRVJWRV9EREJfTElTVCk7CisJCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKIAl9CiAKIAkvKiBSZXRyeSBmYWlsZWQgYWRhcHRlciBpbml0aWFsaXphdGlvbiwgaWYgbmVjZXNzYXJ5CkBAIC0xMjI1LDI3ICsyMjI4LDM0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgcWxhNHh4eF9yZWxvZ2luX2FsbF9kZXZpY2VzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3N0YXRpYyB2b2lkIHFsYTR4eHhfcmVsb2dpbl9kZXZpY2VzKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCiB7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCAqZHRlbXA7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZGJfZW50cnksIGR0ZW1wLCAmaGEtPmRkYl9saXN0LCBsaXN0KSB7Ci0JCWlmICgoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9NSVNTSU5HKSB8fAotCQkgICAgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSA9PSBEREJfU1RBVEVfREVBRCkpIHsKLQkJCWlmIChkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPT0KLQkJCSAgICBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKLQkJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnN0YXRlLCBEREJfU1RBVEVfT05MSU5FKTsKLQkJCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogZGRiWyVkXSIKLQkJCQkgICAgIiBtYXJrZWQgT05MSU5FXG4iLAloYS0+aG9zdF9ubywgX19mdW5jX18sCi0JCQkJICAgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KTsKLQotCQkJCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihkZGJfZW50cnktPnNlc3MpOwotCQkJfSBlbHNlCi0JCQkJcWxhNHh4eF9yZWxvZ2luX2RldmljZShoYSwgZGRiX2VudHJ5KTsKKwlzZXNzID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisJaWYgKCFpc2NzaV9pc19zZXNzaW9uX29ubGluZShjbHNfc2Vzc2lvbikpIHsKKwkJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9BQ1RJVkUpIHsKKwkJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBkZGJbJWRdIgorCQkJCSAgICIgdW5ibG9jayBzZXNzaW9uXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkJICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCQkJaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CisJCX0gZWxzZSB7CisJCQkvKiBUcmlnZ2VyIHJlbG9naW4gKi8KKwkJCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShjbHNfc2Vzc2lvbi0+ZGRfZGF0YSwKKwkJCQkJICAgICAgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKIAkJfQogCX0KIH0KIAorc3RhdGljIHZvaWQgcWxhNHh4eF9yZWxvZ2luX2FsbF9kZXZpY2VzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfcmVsb2dpbl9kZXZpY2VzKTsKK30KKwogdm9pZCBxbGE0eHh4X3dha2VfZHBjKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAlpZiAoaGEtPmRwY190aHJlYWQpCkBAIC0xMjY3LDcgKzIyNzcsNiBAQAogewogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCwgZHBjX3dvcmspOwotCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmR0ZW1wOwogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CiAKIAlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRFBDIGhhbmRsZXIgd2FraW5nIHVwLiIKQEAgLTEzNjMsMzEgKzIzNzIsNiBAQAogCQkJcWxhNHh4eF9yZWxvZ2luX2FsbF9kZXZpY2VzKGhhKTsKIAkJfQogCX0KLQotCS8qIC0tLS0gcmVsb2dpbiBkZXZpY2U/IC0tLSAqLwotCWlmIChhZGFwdGVyX3VwKGhhKSAmJgotCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoRFBDX1JFTE9HSU5fREVWSUNFLCAmaGEtPmRwY19mbGFncykpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRkYl9lbnRyeSwgZHRlbXAsCi0JCQkJCSAmaGEtPmRkYl9saXN0LCBsaXN0KSB7Ci0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KERGX1JFTE9HSU4sICZkZGJfZW50cnktPmZsYWdzKSAmJgotCQkJICAgIGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKQotCQkJCXFsYTR4eHhfcmVsb2dpbl9kZXZpY2UoaGEsIGRkYl9lbnRyeSk7Ci0KLQkJCS8qCi0JCQkgKiBJZiBtYnggY21kIHRpbWVzIG91dCB0aGVyZSBpcyBubyBwb2ludAotCQkJICogaW4gY29udGludWluZyBmdXJ0aGVyLgotCQkJICogV2l0aCBsYXJnZSBubyBvZiB0YXJnZXRzIHRoaXMgY2FuIGhhbmcKLQkJCSAqIHRoZSBzeXN0ZW0uCi0JCQkgKi8KLQkJCWlmICh0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klbGQ6ICVzOiAiCi0JCQkJICAgICAgICJuZWVkIHRvIHJlc2V0IGhiYVxuIiwKLQkJCQkgICAgICAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQogfQogCiAvKioKQEAgLTE0MTAsNiArMjM5NCwxMCBAQAogCWlmIChoYS0+ZHBjX3RocmVhZCkKIAkJZGVzdHJveV93b3JrcXVldWUoaGEtPmRwY190aHJlYWQpOwogCisJLyogS2lsbCB0aGUga2VybmVsIHRocmVhZCBmb3IgdGhpcyBob3N0ICovCisJaWYgKGhhLT50YXNrX3dxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+dGFza193cSk7CisKIAkvKiBQdXQgZmlybXdhcmUgaW4ga25vd24gc3RhdGUgKi8KIAloYS0+aXNwX29wcy0+cmVzZXRfZmlybXdhcmUoaGEpOwogCkBAIC0xNjAxLDYgKzI1ODksNTk0IEBACiAJcmV0dXJuICh1aW50MTZfdClsZTMyX3RvX2NwdShyZWFkbCgmaGEtPnFsYTRfOHh4eF9yZWctPnJzcF9xX2luKSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHFsYTR4eHhfc2hvd19ib290X2V0aF9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gZGF0YTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX0VUSF9GTEFHUzoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCBTWVNGU19GTEFHX0ZXX1NFTF9CT09UKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX0VUSF9JTkRFWDoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIjBcbiIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX01BQzoKKwkJcmMgPSBzeXNmc19mb3JtYXRfbWFjKHN0ciwgaGEtPm15X21hYywKKwkJCQkgICAgICBNQUNfQUREUl9MRU4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBtb2RlX3QgcWxhNHh4eF9ldGhfZ2V0X2F0dHJfdmlzaWJpbGl0eSh2b2lkICpkYXRhLCBpbnQgdHlwZSkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0ZMQUdTOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfSU5ERVg6CisJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBxbGE0eHh4X3Nob3dfYm9vdF9pbmlfaW5mbyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRhdGE7CisJY2hhciAqc3RyID0gYnVmOworCWludCByYzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9JTklfSU5JVElBVE9SX05BTUU6CisJCXJjID0gc3ByaW50ZihzdHIsICIlc1xuIiwgaGEtPm5hbWVfc3RyaW5nKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbW9kZV90IHFsYTR4eHhfaW5pX2dldF9hdHRyX3Zpc2liaWxpdHkodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJaW50IHJjOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRToKKwkJcmMgPSBTX0lSVUdPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxbGE0eHh4X3Nob3dfYm9vdF90Z3RfaW5mbyhzdHJ1Y3QgcWw0X2Jvb3Rfc2Vzc2lvbl9pbmZvICpib290X3Nlc3MsIGludCB0eXBlLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBxbDRfY29ubl9pbmZvICpib290X2Nvbm4gPSAmYm9vdF9zZXNzLT5jb25uX2xpc3RbMF07CisJY2hhciAqc3RyID0gYnVmOworCWludCByYzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9UR1RfTkFNRToKKwkJcmMgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAoY2hhciAqKSZib290X3Nlc3MtPnRhcmdldF9uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9JUF9BRERSOgorCQlpZiAoYm9vdF9zZXNzLT5jb25uX2xpc3RbMF0uZGVzdF9pcGFkZHIuaXBfdHlwZSA9PSAweDEpCisJCQlyYyA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwKKwkJCQkgICAgICZib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX2FkZHJlc3MpOworCQllbHNlCisJCQlyYyA9IHNwcmludGYoc3RyLCAiJXBJNlxuIiwKKwkJCQkgICAgICZib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX2FkZHJlc3MpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1BPUlQ6CisJCQlyYyA9IHNwcmludGYoc3RyLCAiJWRcbiIsIGJvb3RfY29ubi0+ZGVzdF9wb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX05BTUU6CisJCXJjID0gc3ByaW50ZihzdHIsICAiJS4qc1xuIiwKKwkJCSAgICAgYm9vdF9jb25uLT5jaGFwLnRhcmdldF9jaGFwX25hbWVfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAudGFyZ2V0X2NoYXBfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9TRUNSRVQ6CisJCXJjID0gc3ByaW50ZihzdHIsICAiJS4qc1xuIiwKKwkJCSAgICAgYm9vdF9jb25uLT5jaGFwLnRhcmdldF9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAudGFyZ2V0X3NlY3JldCk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRToKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPmNoYXAuaW50cl9jaGFwX25hbWVfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAuaW50cl9jaGFwX25hbWUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVDoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPmNoYXAuaW50cl9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAuaW50cl9zZWNyZXQpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgorCQlyYyA9IHNwcmludGYoc3RyLCAiJWRcbiIsIFNZU0ZTX0ZMQUdfRldfU0VMX0JPT1QpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX05JQ19BU1NPQzoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIjBcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFsYTR4eHhfc2hvd19ib290X3RndF9wcmlfaW5mbyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRhdGE7CisJc3RydWN0IHFsNF9ib290X3Nlc3Npb25faW5mbyAqYm9vdF9zZXNzID0gJihoYS0+Ym9vdF90Z3QuYm9vdF9wcmlfc2Vzcyk7CisKKwlyZXR1cm4gcWxhNHh4eF9zaG93X2Jvb3RfdGd0X2luZm8oYm9vdF9zZXNzLCB0eXBlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBxbGE0eHh4X3Nob3dfYm9vdF90Z3Rfc2VjX2luZm8odm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkYXRhOworCXN0cnVjdCBxbDRfYm9vdF9zZXNzaW9uX2luZm8gKmJvb3Rfc2VzcyA9ICYoaGEtPmJvb3RfdGd0LmJvb3Rfc2VjX3Nlc3MpOworCisJcmV0dXJuIHFsYTR4eHhfc2hvd19ib290X3RndF9pbmZvKGJvb3Rfc2VzcywgdHlwZSwgYnVmKTsKK30KKworc3RhdGljIG1vZGVfdCBxbGE0eHh4X3RndF9nZXRfYXR0cl92aXNpYmlsaXR5KHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCWludCByYzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVNDU0lfQk9PVF9UR1RfTkFNRToKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0lQX0FERFI6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9QT1JUOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9OQU1FOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9TRUNSRVQ6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9OQU1FOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfU0VDUkVUOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfTklDX0FTU09DOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfRkxBR1M6CisJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBxbGE0eHh4X2Jvb3RfcmVsZWFzZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IGRhdGE7CisKKwlzY3NpX2hvc3RfcHV0KGhhLT5ob3N0KTsKK30KKworc3RhdGljIGludCBnZXRfZndfYm9vdF9pbmZvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgZGRiX2luZGV4W10pCit7CisJZG1hX2FkZHJfdCBidWZfZG1hOworCXVpbnQzMl90IGFkZHIsIHByaV9hZGRyLCBzZWNfYWRkcjsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDE2X3QgZnVuY19udW07CisJdWludDhfdCB2YWw7CisJdWludDhfdCAqYnVmID0gTlVMTDsKKwlzaXplX3Qgc2l6ZSA9IDEzICogc2l6ZW9mKHVpbnQ4X3QpOworCWludCByZXQgPSBRTEFfU1VDQ0VTUzsKKworCWZ1bmNfbnVtID0gUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKworCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiBHZXQgRlcgYm9vdCBpbmZvIGZvciAweCV4IGZ1bmMgJWRcbiIsCisJCSAgIF9fZnVuY19fLCBoYS0+cGRldi0+ZGV2aWNlLCBmdW5jX251bSk7CisKKwlpZiAoaXNfcWxhNDBYWChoYSkpIHsKKwkJaWYgKGZ1bmNfbnVtID09IDEpIHsKKwkJCWFkZHIgPSBOVlJBTV9QT1JUMF9CT09UX01PREU7CisJCQlwcmlfYWRkciA9IE5WUkFNX1BPUlQwX0JPT1RfUFJJX1RHVDsKKwkJCXNlY19hZGRyID0gTlZSQU1fUE9SVDBfQk9PVF9TRUNfVEdUOworCQl9IGVsc2UgaWYgKGZ1bmNfbnVtID09IDMpIHsKKwkJCWFkZHIgPSBOVlJBTV9QT1JUMV9CT09UX01PREU7CisJCQlwcmlfYWRkciA9IE5WUkFNX1BPUlQxX0JPT1RfUFJJX1RHVDsKKwkJCXNlY19hZGRyID0gTlZSQU1fUE9SVDFfQk9PVF9TRUNfVEdUOworCQl9IGVsc2UgeworCQkJcmV0ID0gUUxBX0VSUk9SOworCQkJZ290byBleGl0X2Jvb3RfaW5mbzsKKwkJfQorCisJCS8qIENoZWNrIEJvb3QgTW9kZSAqLworCQl2YWwgPSByZF9udnJhbV9ieXRlKGhhLCBhZGRyKTsKKwkJaWYgKCEodmFsICYgMHgwNykpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkJICAiJXM6IEZhaWxlZCBCb290IG9wdGlvbnMgOiAweCV4XG4iLAorCQkJCQkgIF9fZnVuY19fLCB2YWwpKTsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X2luZm87CisJCX0KKworCQkvKiBnZXQgcHJpbWFyeSB2YWxpZCB0YXJnZXQgaW5kZXggKi8KKwkJdmFsID0gcmRfbnZyYW1fYnl0ZShoYSwgcHJpX2FkZHIpOworCQlpZiAodmFsICYgQklUXzcpCisJCQlkZGJfaW5kZXhbMF0gPSAodmFsICYgMHg3Zik7CisKKwkJLyogZ2V0IHNlY29uZGFyeSB2YWxpZCB0YXJnZXQgaW5kZXggKi8KKwkJdmFsID0gcmRfbnZyYW1fYnl0ZShoYSwgc2VjX2FkZHIpOworCQlpZiAodmFsICYgQklUXzcpCisJCQlkZGJfaW5kZXhbMV0gPSAodmFsICYgMHg3Zik7CisKKwl9IGVsc2UgaWYgKGlzX3FsYTgwMjIoaGEpKSB7CisJCWJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZSwKKwkJCQkJICZidWZfZG1hLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkJICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iLAorCQkJCQkgICBfX2Z1bmNfXykpOworCQkJcmV0ID0gUUxBX0VSUk9SOworCQkJZ290byBleGl0X2Jvb3RfaW5mbzsKKwkJfQorCisJCWlmIChoYS0+cG9ydF9udW0gPT0gMCkKKwkJCW9mZnNldCA9IEJPT1RfUEFSQU1fT0ZGU0VUX1BPUlQwOworCQllbHNlIGlmIChoYS0+cG9ydF9udW0gPT0gMSkKKwkJCW9mZnNldCA9IEJPT1RfUEFSQU1fT0ZGU0VUX1BPUlQxOworCQllbHNlIHsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X2luZm9fZnJlZTsKKwkJfQorCQlhZGRyID0gRkxBU0hfUkFXX0FDQ0VTU19BRERSICsgKGhhLT5ody5mbHRfaXNjc2lfcGFyYW0gKiA0KSArCisJCSAgICAgICBvZmZzZXQ7CisJCWlmIChxbGE0eHh4X2dldF9mbGFzaChoYSwgYnVmX2RtYSwgYWRkciwKKwkJCQkgICAgICAxMyAqIHNpemVvZih1aW50OF90KSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgInNjc2klbGQ6ICVzOiBHZXQgRmxhc2giCisJCQkJCSAgImZhaWxlZFxuIiwgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCQlyZXQgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYm9vdF9pbmZvX2ZyZWU7CisJCX0KKwkJLyogQ2hlY2sgQm9vdCBNb2RlICovCisJCWlmICghKGJ1ZlsxXSAmIDB4MDcpKSB7CisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQkgICJGYWlsZWQ6IEJvb3Qgb3B0aW9ucyA6IDB4JXhcbiIsCisJCQkJCSAgYnVmWzFdKSk7CisJCQlyZXQgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYm9vdF9pbmZvX2ZyZWU7CisJCX0KKworCQkvKiBnZXQgcHJpbWFyeSB2YWxpZCB0YXJnZXQgaW5kZXggKi8KKwkJaWYgKGJ1ZlsyXSAmIEJJVF83KQorCQkJZGRiX2luZGV4WzBdID0gYnVmWzJdICYgMHg3ZjsKKworCQkvKiBnZXQgc2Vjb25kYXJ5IHZhbGlkIHRhcmdldCBpbmRleCAqLworCQlpZiAoYnVmWzExXSAmIEJJVF83KQorCQkJZGRiX2luZGV4WzFdID0gYnVmWzExXSAmIDB4N2Y7CisJfSBlbHNlIHsKKwkJcmV0ID0gUUxBX0VSUk9SOworCQlnb3RvIGV4aXRfYm9vdF9pbmZvOworCX0KKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogUHJpbWFyeSB0YXJnZXQgSUQgJWQsIFNlY29uZGFyeSIKKwkJCSAgIiB0YXJnZXQgSUQgJWRcbiIsIF9fZnVuY19fLCBkZGJfaW5kZXhbMF0sCisJCQkgIGRkYl9pbmRleFsxXSkpOworCitleGl0X2Jvb3RfaW5mb19mcmVlOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplLCBidWYsIGJ1Zl9kbWEpOworZXhpdF9ib290X2luZm86CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBxbGE0eHh4X2dldF9iaWRpX2NoYXAgLSBHZXQgYSBCSURJIENIQVAgdXNlciBhbmQgcGFzc3dvcmQKKyAqIEBoYTogcG9pbnRlciB0byBhZGFwdGVyIHN0cnVjdHVyZQorICogQHVzZXJuYW1lOiBDSEFQIHVzZXJuYW1lIHRvIGJlIHJldHVybmVkCisgKiBAcGFzc3dvcmQ6IENIQVAgcGFzc3dvcmQgdG8gYmUgcmV0dXJuZWQKKyAqCisgKiBJZiBhIGJvb3QgZW50cnkgaGFzIEJJREkgQ0hBUCBlbmFibGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIEJJREkgQ0hBUAorICogdXNlciBhbmQgcGFzc3dvcmQgaW4gdGhlIHN5c2ZzIGVudHJ5IGluIC9zeXMvZmlybXdhcmUvaXNjc2lfYm9vdCMvLgorICogU28gZnJvbSB0aGUgQ0hBUCBjYWNoZSBmaW5kIHRoZSBmaXJzdCBCSURJIENIQVAgZW50cnkgYW5kIHNldCBpdAorICogdG8gdGhlIGJvb3QgcmVjb3JkIGluIHN5c2ZzLgorICoqLworc3RhdGljIGludCBxbGE0eHh4X2dldF9iaWRpX2NoYXAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBjaGFyICp1c2VybmFtZSwKKwkJCSAgICBjaGFyICpwYXNzd29yZCkKK3sKKwlpbnQgaSwgcmV0ID0gLUVJTlZBTDsKKwlpbnQgbWF4X2NoYXBfZW50cmllcyA9IDA7CisJc3RydWN0IHFsNF9jaGFwX3RhYmxlICpjaGFwX3RhYmxlOworCisJaWYgKGlzX3FsYTgwMjIoaGEpKQorCQltYXhfY2hhcF9lbnRyaWVzID0gKGhhLT5ody5mbHRfY2hhcF9zaXplIC8gMikgLworCQkJCQkJc2l6ZW9mKHN0cnVjdCBxbDRfY2hhcF90YWJsZSk7CisJZWxzZQorCQltYXhfY2hhcF9lbnRyaWVzID0gTUFYX0NIQVBfRU5UUklFU180MFhYOworCisJaWYgKCFoYS0+Y2hhcF9saXN0KSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiRG8gbm90IGhhdmUgQ0hBUCB0YWJsZSBjYWNoZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmaGEtPmNoYXBfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2NoYXBfZW50cmllczsgaSsrKSB7CisJCWNoYXBfdGFibGUgPSAoc3RydWN0IHFsNF9jaGFwX3RhYmxlICopaGEtPmNoYXBfbGlzdCArIGk7CisJCWlmIChjaGFwX3RhYmxlLT5jb29raWUgIT0KKwkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ0hBUF9WQUxJRF9DT09LSUUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjaGFwX3RhYmxlLT5mbGFncyAmIEJJVF83KSAvKiBsb2NhbCAqLworCQkJY29udGludWU7CisKKwkJaWYgKCEoY2hhcF90YWJsZS0+ZmxhZ3MgJiBCSVRfNikpIC8qIE5vdCBCSURJICovCisJCQljb250aW51ZTsKKworCQlzdHJuY3B5KHBhc3N3b3JkLCBjaGFwX3RhYmxlLT5zZWNyZXQsIFFMNF9DSEFQX01BWF9TRUNSRVRfTEVOKTsKKwkJc3RybmNweSh1c2VybmFtZSwgY2hhcF90YWJsZS0+bmFtZSwgUUw0X0NIQVBfTUFYX05BTUVfTEVOKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmaGEtPmNoYXBfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBxbGE0eHh4X2dldF9ib290X3RhcmdldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgc3RydWN0IHFsNF9ib290X3Nlc3Npb25faW5mbyAqYm9vdF9zZXNzLAorCQkJCSAgIHVpbnQxNl90IGRkYl9pbmRleCkKK3sKKwlzdHJ1Y3QgcWw0X2Nvbm5faW5mbyAqYm9vdF9jb25uID0gJmJvb3Rfc2Vzcy0+Y29ubl9saXN0WzBdOworCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeTsKKwlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7CisJdWludDE2X3QgaWR4OworCXVpbnQxNl90IG9wdGlvbnM7CisJaW50IHJldCA9IFFMQV9TVUNDRVNTOworCisJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOworCWlmICghZndfZGRiX2VudHJ5KSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIuXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJcmV0ID0gUUxBX0VSUk9SOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChxbGE0eHh4X2Jvb3RkYl9ieV9pbmRleChoYSwgZndfZGRiX2VudHJ5LAorCQkJCSAgIGZ3X2RkYl9lbnRyeV9kbWEsIGRkYl9pbmRleCkpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCSAgIiVzOiBGbGFzaCBEREIgcmVhZCBGYWlsZWRcbiIsIF9fZnVuY19fKSk7CisJCXJldCA9IFFMQV9FUlJPUjsKKwkJZ290byBleGl0X2Jvb3RfdGFyZ2V0OworCX0KKworCS8qIFVwZGF0ZSB0YXJnZXQgbmFtZSBhbmQgSVAgZnJvbSBEREIgKi8KKwltZW1jcHkoYm9vdF9zZXNzLT50YXJnZXRfbmFtZSwgZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lLAorCSAgICAgICBtaW4oc2l6ZW9mKGJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpLAorCQkgICBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSkpOworCisJb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+b3B0aW9ucyk7CisJaWYgKG9wdGlvbnMgJiBEREJfT1BUX0lQVjZfREVWSUNFKSB7CisJCW1lbWNweSgmYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF9hZGRyZXNzLAorCQkgICAgICAgJmZ3X2RkYl9lbnRyeS0+aXBfYWRkclswXSwgSVB2Nl9BRERSX0xFTik7CisJfSBlbHNlIHsKKwkJYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF90eXBlID0gMHgxOworCQltZW1jcHkoJmJvb3RfY29ubi0+ZGVzdF9pcGFkZHIuaXBfYWRkcmVzcywKKwkJICAgICAgICZmd19kZGJfZW50cnktPmlwX2FkZHJbMF0sIElQX0FERFJfTEVOKTsKKwl9CisKKwlib290X2Nvbm4tPmRlc3RfcG9ydCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+cG9ydCk7CisKKwkvKiB1cGRhdGUgY2hhcCBpbmZvcm1hdGlvbiAqLworCWlkeCA9IF9fbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5jaGFwX3RibF9pZHgpOworCisJaWYgKEJJVF83ICYgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9vcHRpb25zKSkJeworCisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJTZXR0aW5nIGNoYXBcbiIpKTsKKworCQlyZXQgPSBxbGE0eHh4X2dldF9jaGFwKGhhLCAoY2hhciAqKSZib290X2Nvbm4tPmNoYXAuCisJCQkJICAgICAgIHRhcmdldF9jaGFwX25hbWUsCisJCQkJICAgICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC50YXJnZXRfc2VjcmV0LAorCQkJCSAgICAgICBpZHgpOworCQlpZiAocmV0KSB7CisJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZhaWxlZCB0byBzZXQgY2hhcFxuIik7CisJCQlyZXQgPSBRTEFfRVJST1I7CisJCQlnb3RvIGV4aXRfYm9vdF90YXJnZXQ7CisJCX0KKworCQlib290X2Nvbm4tPmNoYXAudGFyZ2V0X2NoYXBfbmFtZV9sZW5ndGggPSBRTDRfQ0hBUF9NQVhfTkFNRV9MRU47CisJCWJvb3RfY29ubi0+Y2hhcC50YXJnZXRfc2VjcmV0X2xlbmd0aCA9IFFMNF9DSEFQX01BWF9TRUNSRVRfTEVOOworCX0KKworCWlmIChCSVRfNCAmIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfb3B0aW9ucykpIHsKKworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiU2V0dGluZyBCSURJIGNoYXBcbiIpKTsKKworCQlyZXQgPSBxbGE0eHh4X2dldF9iaWRpX2NoYXAoaGEsCisJCQkJICAgIChjaGFyICopJmJvb3RfY29ubi0+Y2hhcC5pbnRyX2NoYXBfbmFtZSwKKwkJCQkgICAgKGNoYXIgKikmYm9vdF9jb25uLT5jaGFwLmludHJfc2VjcmV0KTsKKworCQlpZiAocmV0KSB7CisJCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZhaWxlZCB0byBzZXQgQklESSBjaGFwXG4iKTsKKwkJCXJldCA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gZXhpdF9ib290X3RhcmdldDsKKwkJfQorCisJCWJvb3RfY29ubi0+Y2hhcC5pbnRyX2NoYXBfbmFtZV9sZW5ndGggPSBRTDRfQ0hBUF9NQVhfTkFNRV9MRU47CisJCWJvb3RfY29ubi0+Y2hhcC5pbnRyX3NlY3JldF9sZW5ndGggPSBRTDRfQ0hBUF9NQVhfU0VDUkVUX0xFTjsKKwl9CisKK2V4aXRfYm9vdF90YXJnZXQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKKwkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfZ2V0X2Jvb3RfaW5mbyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJdWludDE2X3QgZGRiX2luZGV4WzJdOworCWludCByZXQgPSBRTEFfRVJST1I7CisJaW50IHJ2YWw7CisKKwltZW1zZXQoZGRiX2luZGV4LCAwLCBzaXplb2YoZGRiX2luZGV4KSk7CisJZGRiX2luZGV4WzBdID0gMHhmZmZmOworCWRkYl9pbmRleFsxXSA9IDB4ZmZmZjsKKwlyZXQgPSBnZXRfZndfYm9vdF9pbmZvKGhhLCBkZGJfaW5kZXgpOworCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJCSAgIiVzOiBGYWlsZWQgdG8gc2V0IGJvb3QgaW5mby5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRkYl9pbmRleFswXSA9PSAweGZmZmYpCisJCWdvdG8gc2VjX3RhcmdldDsKKworCXJ2YWwgPSBxbGE0eHh4X2dldF9ib290X3RhcmdldChoYSwgJihoYS0+Ym9vdF90Z3QuYm9vdF9wcmlfc2VzcyksCisJCQkJICAgICAgZGRiX2luZGV4WzBdKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogRmFpbGVkIHRvIGdldCAiCisJCQkJICAicHJpbWFyeSB0YXJnZXRcbiIsIF9fZnVuY19fKSk7CisJfSBlbHNlCisJCXJldCA9IFFMQV9TVUNDRVNTOworCitzZWNfdGFyZ2V0OgorCWlmIChkZGJfaW5kZXhbMV0gPT0gMHhmZmZmKQorCQlnb3RvIGV4aXRfZ2V0X2Jvb3RfaW5mbzsKKworCXJ2YWwgPSBxbGE0eHh4X2dldF9ib290X3RhcmdldChoYSwgJihoYS0+Ym9vdF90Z3QuYm9vdF9zZWNfc2VzcyksCisJCQkJICAgICAgZGRiX2luZGV4WzFdKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogRmFpbGVkIHRvIGdldCAiCisJCQkJICAic2Vjb25kYXJ5IHRhcmdldFxuIiwgX19mdW5jX18pKTsKKwl9IGVsc2UKKwkJcmV0ID0gUUxBX1NVQ0NFU1M7CisKK2V4aXRfZ2V0X2Jvb3RfaW5mbzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfc2V0dXBfYm9vdF9pbmZvKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwlzdHJ1Y3QgaXNjc2lfYm9vdF9rb2JqICpib290X2tvYmo7CisKKwlpZiAocWxhNHh4eF9nZXRfYm9vdF9pbmZvKGhhKSAhPSBRTEFfU1VDQ0VTUykKKwkJcmV0dXJuIDA7CisKKwloYS0+Ym9vdF9rc2V0ID0gaXNjc2lfYm9vdF9jcmVhdGVfaG9zdF9rc2V0KGhhLT5ob3N0LT5ob3N0X25vKTsKKwlpZiAoIWhhLT5ib290X2tzZXQpCisJCWdvdG8ga3NldF9mcmVlOworCisJaWYgKCFzY3NpX2hvc3RfZ2V0KGhhLT5ob3N0KSkKKwkJZ290byBrc2V0X2ZyZWU7CisJYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfdGFyZ2V0KGhhLT5ib290X2tzZXQsIDAsIGhhLAorCQkJCQkgICAgIHFsYTR4eHhfc2hvd19ib290X3RndF9wcmlfaW5mbywKKwkJCQkJICAgICBxbGE0eHh4X3RndF9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkgICAgIHFsYTR4eHhfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfaG9zdDsKKworCWlmICghc2NzaV9ob3N0X2dldChoYS0+aG9zdCkpCisJCWdvdG8ga3NldF9mcmVlOworCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChoYS0+Ym9vdF9rc2V0LCAxLCBoYSwKKwkJCQkJICAgICBxbGE0eHh4X3Nob3dfYm9vdF90Z3Rfc2VjX2luZm8sCisJCQkJCSAgICAgcWxhNHh4eF90Z3RfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKKwkJCQkJICAgICBxbGE0eHh4X2Jvb3RfcmVsZWFzZSk7CisJaWYgKCFib290X2tvYmopCisJCWdvdG8gcHV0X2hvc3Q7CisKKwlpZiAoIXNjc2lfaG9zdF9nZXQoaGEtPmhvc3QpKQorCQlnb3RvIGtzZXRfZnJlZTsKKwlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9pbml0aWF0b3IoaGEtPmJvb3Rfa3NldCwgMCwgaGEsCisJCQkJCSAgICAgICBxbGE0eHh4X3Nob3dfYm9vdF9pbmlfaW5mbywKKwkJCQkJICAgICAgIHFsYTR4eHhfaW5pX2dldF9hdHRyX3Zpc2liaWxpdHksCisJCQkJCSAgICAgICBxbGE0eHh4X2Jvb3RfcmVsZWFzZSk7CisJaWYgKCFib290X2tvYmopCisJCWdvdG8gcHV0X2hvc3Q7CisKKwlpZiAoIXNjc2lfaG9zdF9nZXQoaGEtPmhvc3QpKQorCQlnb3RvIGtzZXRfZnJlZTsKKwlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChoYS0+Ym9vdF9rc2V0LCAwLCBoYSwKKwkJCQkJICAgICAgIHFsYTR4eHhfc2hvd19ib290X2V0aF9pbmZvLAorCQkJCQkgICAgICAgcWxhNHh4eF9ldGhfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKKwkJCQkJICAgICAgIHFsYTR4eHhfYm9vdF9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfaG9zdDsKKworCXJldHVybiAwOworCitwdXRfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KGhhLT5ob3N0KTsKK2tzZXRfZnJlZToKKwlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChoYS0+Ym9vdF9rc2V0KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKioKKyAqIHFsYTR4eHhfY3JlYXRlIGNoYXBfbGlzdCAtIENyZWF0ZSBDSEFQIGxpc3QgZnJvbSBGTEFTSAorICogQGhhOiBwb2ludGVyIHRvIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogUmVhZCBmbGFzaCBhbmQgbWFrZSBhIGxpc3Qgb2YgQ0hBUCBlbnRyaWVzLCBkdXJpbmcgbG9naW4gd2hlbiBhIENIQVAgZW50cnkKKyAqIGlzIHJlY2VpdmVkLCBpdCB3aWxsIGJlIGNoZWNrZWQgaW4gdGhpcyBsaXN0LiBJZiBlbnRyeSBleGlzdCB0aGVuIHRoZSBDSEFQCisgKiBlbnRyeSBpbmRleCBpcyBzZXQgaW4gdGhlIEREQi4gSWYgQ0hBUCBlbnRyeSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGxpc3QKKyAqIHRoZW4gYSBuZXcgZW50cnkgaXMgYWRkZWQgaW4gRkxBU0ggaW4gQ0hBUCB0YWJsZSBhbmQgdGhlIGluZGV4IG9idGFpbmVkIGlzCisgKiB1c2VkIGluIHRoZSBEREIuCisgKiovCitzdGF0aWMgdm9pZCBxbGE0eHh4X2NyZWF0ZV9jaGFwX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoreworCWludCBydmFsID0gMDsKKwl1aW50OF90ICpjaGFwX2ZsYXNoX2RhdGEgPSBOVUxMOworCXVpbnQzMl90IG9mZnNldDsKKwlkbWFfYWRkcl90IGNoYXBfZG1hOworCXVpbnQzMl90IGNoYXBfc2l6ZSA9IDA7CisKKwlpZiAoaXNfcWxhNDBYWChoYSkpCisJCWNoYXBfc2l6ZSA9IE1BWF9DSEFQX0VOVFJJRVNfNDBYWCAgKgorCQkJCQlzaXplb2Yoc3RydWN0IHFsNF9jaGFwX3RhYmxlKTsKKwllbHNlCS8qIFNpbmdsZSByZWdpb24gY29udGFpbnMgQ0hBUCBpbmZvIGZvciBib3RoCisJCSAqIHBvcnRzIHdoaWNoIGlzIGRpdmlkZWQgaW50byBoYWxmIGZvciBlYWNoIHBvcnQuCisJCSAqLworCQljaGFwX3NpemUgPSBoYS0+aHcuZmx0X2NoYXBfc2l6ZSAvIDI7CisKKwljaGFwX2ZsYXNoX2RhdGEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGNoYXBfc2l6ZSwKKwkJCQkJICAmY2hhcF9kbWEsIEdGUF9LRVJORUwpOworCWlmICghY2hhcF9mbGFzaF9kYXRhKSB7CisJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiTm8gbWVtb3J5IGZvciBjaGFwX2ZsYXNoX2RhdGFcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChpc19xbGE0MFhYKGhhKSkKKwkJb2Zmc2V0ID0gRkxBU0hfQ0hBUF9PRkZTRVQ7CisJZWxzZSB7CisJCW9mZnNldCA9IEZMQVNIX1JBV19BQ0NFU1NfQUREUiArIChoYS0+aHcuZmx0X3JlZ2lvbl9jaGFwIDw8IDIpOworCQlpZiAoaGEtPnBvcnRfbnVtID09IDEpCisJCQlvZmZzZXQgKz0gY2hhcF9zaXplOworCX0KKworCXJ2YWwgPSBxbGE0eHh4X2dldF9mbGFzaChoYSwgY2hhcF9kbWEsIG9mZnNldCwgY2hhcF9zaXplKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBleGl0X2NoYXBfbGlzdDsKKworCWlmIChoYS0+Y2hhcF9saXN0ID09IE5VTEwpCisJCWhhLT5jaGFwX2xpc3QgPSB2bWFsbG9jKGNoYXBfc2l6ZSk7CisJaWYgKGhhLT5jaGFwX2xpc3QgPT0gTlVMTCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIk5vIG1lbW9yeSBmb3IgaGEtPmNoYXBfbGlzdFxuIik7CisJCWdvdG8gZXhpdF9jaGFwX2xpc3Q7CisJfQorCisJbWVtY3B5KGhhLT5jaGFwX2xpc3QsIGNoYXBfZmxhc2hfZGF0YSwgY2hhcF9zaXplKTsKKworZXhpdF9jaGFwX2xpc3Q6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGNoYXBfc2l6ZSwKKwkJCWNoYXBfZmxhc2hfZGF0YSwgY2hhcF9kbWEpOworCXJldHVybjsKK30KKwogLyoqCiAgKiBxbGE0eHh4X3Byb2JlX2FkYXB0ZXIgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9iZSBIQkEKICAqIEBwZGV2OiBwb2ludGVyIHRvIHBjaV9kZXYgc3RydWN0dXJlCkBAIC0xNjI0LDcgKzMyMDAsNyBAQAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKIAkJcmV0dXJuIC0xOwogCi0JaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmcWxhNHh4eF9kcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaGEpKTsKKwlob3N0ID0gaXNjc2lfaG9zdF9hbGxvYygmcWxhNHh4eF9kcml2ZXJfdGVtcGxhdGUsIHNpemVvZigqaGEpLCAwKTsKIAlpZiAoaG9zdCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJxbGE0eHh4OiBDb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGZyb20gc2NzaSBsYXllciFcbiIpOwpAQCAtMTYzMiw3ICszMjA4LDcgQEAKIAl9CiAKIAkvKiBDbGVhciBvdXIgZGF0YSBhcmVhICovCi0JaGEgPSAoc3RydWN0IHNjc2lfcWxhX2hvc3QgKikgaG9zdC0+aG9zdGRhdGE7CisJaGEgPSB0b19xbGFfaG9zdChob3N0KTsKIAltZW1zZXQoaGEsIDAsIHNpemVvZigqaGEpKTsKIAogCS8qIFNhdmUgdGhlIGluZm9ybWF0aW9uIGZyb20gUENJIEJJT1MuCSovCkBAIC0xNjc1LDExICszMjUxLDEyIEBACiAJcWxhNHh4eF9jb25maWdfZG1hX2FkZHJlc3NpbmcoaGEpOwogCiAJLyogSW5pdGlhbGl6ZSBsaXN0cyBhbmQgc3BpbmxvY2tzLiAqLwotCUlOSVRfTElTVF9IRUFEKCZoYS0+ZGRiX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZoYS0+ZnJlZV9zcmJfcSk7CiAKIAltdXRleF9pbml0KCZoYS0+bWJveF9zZW0pOworCW11dGV4X2luaXQoJmhhLT5jaGFwX3NlbSk7CiAJaW5pdF9jb21wbGV0aW9uKCZoYS0+bWJ4X2ludHJfY29tcCk7CisJaW5pdF9jb21wbGV0aW9uKCZoYS0+ZGlzYWJsZV9hY2JfY29tcCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaGEtPmhhcmR3YXJlX2xvY2spOwogCkBAIC0xNjkyLDYgKzMyNjksMjcgQEAKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaG9zdC0+Y21kX3Blcl9sdW4gPSAzOworCWhvc3QtPm1heF9jaGFubmVsID0gMDsKKwlob3N0LT5tYXhfbHVuID0gTUFYX0xVTlMgLSAxOworCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOworCWhvc3QtPm1heF9jbWRfbGVuID0gSU9DQl9NQVhfQ0RCX0xFTjsKKwlob3N0LT5jYW5fcXVldWUgPSBNQVhfU1JCUyA7CisJaG9zdC0+dHJhbnNwb3J0dCA9IHFsYTR4eHhfc2NzaV90cmFuc3BvcnQ7CisKKwlyZXQgPSBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAoaG9zdCwgTUFYX1NSQlMpOworCWlmIChyZXQpIHsKKwkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJICAgIiVzOiBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoYSk7CisKKwlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gcHJvYmVfZmFpbGVkOworCiAJaWYgKGlzX3FsYTgwMjIoaGEpKQogCQkodm9pZCkgcWxhNF84eHh4X2dldF9mbGFzaF9pbmZvKGhhKTsKIApAQCAtMTcwMCw3ICszMjk4LDcgQEAKIAkgKiBmaXJtd2FyZQogCSAqIE5PVEU6IGludGVycnVwdHMgZW5hYmxlZCB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbgogCSAqLwotCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBSRUJVSUxEX0REQl9MSVNUKTsKKwlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSk7CiAJd2hpbGUgKCghdGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSkgJiYKIAkgICAgaW5pdF9yZXRyeV9jb3VudCsrIDwgTUFYX0lOSVRfUkVUUklFUykgewogCkBAIC0xNzIxLDcgKzMzMTksNyBAQAogCQlpZiAoaGEtPmlzcF9vcHMtPnJlc2V0X2NoaXAoaGEpID09IFFMQV9FUlJPUikKIAkJCWNvbnRpbnVlOwogCi0JCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBSRUJVSUxEX0REQl9MSVNUKTsKKwkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpOwogCX0KIAogCWlmICghdGVzdF9iaXQoQUZfT05MSU5FLCAmaGEtPmZsYWdzKSkgewpAQCAtMTczNiwyNCArMzMzNCw5IEBACiAJCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CiAJCX0KIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBwcm9iZV9mYWlsZWQ7CisJCWdvdG8gcmVtb3ZlX2hvc3Q7CiAJfQogCi0JaG9zdC0+Y21kX3Blcl9sdW4gPSAzOwotCWhvc3QtPm1heF9jaGFubmVsID0gMDsKLQlob3N0LT5tYXhfbHVuID0gTUFYX0xVTlMgLSAxOwotCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOwotCWhvc3QtPm1heF9jbWRfbGVuID0gSU9DQl9NQVhfQ0RCX0xFTjsKLQlob3N0LT5jYW5fcXVldWUgPSBNQVhfU1JCUyA7Ci0JaG9zdC0+dHJhbnNwb3J0dCA9IHFsYTR4eHhfc2NzaV90cmFuc3BvcnQ7Ci0KLSAgICAgICAgcmV0ID0gc2NzaV9pbml0X3NoYXJlZF90YWdfbWFwKGhvc3QsIE1BWF9TUkJTKTsKLSAgICAgICAgaWYgKHJldCkgewotCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAic2NzaV9pbml0X3NoYXJlZF90YWdfbWFwIGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbGVkOwotICAgICAgICB9Ci0KIAkvKiBTdGFydHVwIHRoZSBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGhvc3QgYWRhcHRlci4gKi8KIAlERUJVRzIocHJpbnRrKCJzY3NpOiAlczogU3RhcnRpbmcga2VybmVsIHRocmVhZCBmb3IgIgogCQkgICAgICAicWxhNHh4eF9kcGNcbiIsIF9fZnVuY19fKSk7CkBAIC0xNzYyLDEwICszMzQ1LDE4IEBACiAJaWYgKCFoYS0+ZHBjX3RocmVhZCkgewogCQlxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gc3RhcnQgRFBDIHRocmVhZCFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIHByb2JlX2ZhaWxlZDsKKwkJZ290byByZW1vdmVfaG9zdDsKIAl9CiAJSU5JVF9XT1JLKCZoYS0+ZHBjX3dvcmssIHFsYTR4eHhfZG9fZHBjKTsKIAorCXNwcmludGYoYnVmLCAicWxhNHh4eF8lbHVfdGFzayIsIGhhLT5ob3N0X25vKTsKKwloYS0+dGFza193cSA9IGFsbG9jX3dvcmtxdWV1ZShidWYsIFdRX01FTV9SRUNMQUlNLCAxKTsKKwlpZiAoIWhhLT50YXNrX3dxKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBzdGFydCB0YXNrIHRocmVhZCFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHJlbW92ZV9ob3N0OworCX0KKwogCS8qIEZvciBJU1AtODJYWCwgcmVxdWVzdF9pcnFzIGlzIGNhbGxlZCBpbiBxbGE0Xzh4eHhfbG9hZF9yaXNjCiAJICogKHdoaWNoIGlzIGNhbGxlZCBpbmRpcmVjdGx5IGJ5IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKSwKIAkgKiBzbyB0aGF0IGlycXMgd2lsbCBiZSByZWdpc3RlcmVkIGFmdGVyIGNyYmluaXQgYnV0IGJlZm9yZQpAQCAtMTc3Niw3ICszMzY3LDcgQEAKIAkJaWYgKHJldCkgewogCQkJcWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFpbGVkIHRvIHJlc2VydmUgIgogCQkJICAgICJpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBwZGV2LT5pcnEpOwotCQkJZ290byBwcm9iZV9mYWlsZWQ7CisJCQlnb3RvIHJlbW92ZV9ob3N0OwogCQl9CiAJfQogCkBAIC0xNzg4LDIxICszMzc5LDI1IEBACiAKIAlzZXRfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncyk7CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaGEpOwotCi0JcmV0ID0gc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIHByb2JlX2ZhaWxlZDsKLQogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgIiBRTG9naWMgaVNDU0kgSEJBIERyaXZlciB2ZXJzaW9uOiAlc1xuIgogCSAgICAgICAiICBRTG9naWMgSVNQJTA0eCBAICVzLCBob3N0Iz0lbGQsIGZ3PSUwMmQuJTAyZC4lMDJkLiUwMmRcbiIsCiAJICAgICAgIHFsYTR4eHhfdmVyc2lvbl9zdHIsIGhhLT5wZGV2LT5kZXZpY2UsIHBjaV9uYW1lKGhhLT5wZGV2KSwKIAkgICAgICAgaGEtPmhvc3Rfbm8sIGhhLT5maXJtd2FyZV92ZXJzaW9uWzBdLCBoYS0+ZmlybXdhcmVfdmVyc2lvblsxXSwKIAkgICAgICAgaGEtPnBhdGNoX251bWJlciwgaGEtPmJ1aWxkX251bWJlcik7Ci0Jc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKKwlxbGE0eHh4X2NyZWF0ZV9jaGFwX2xpc3QoaGEpOworCisJaWYgKHFsYTR4eHhfc2V0dXBfYm9vdF9pbmZvKGhhKSkKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczpJU0NTSSBib290IGluZm8gc2V0dXAgZmFpbGVkXG4iLAorCQkJICAgX19mdW5jX18pOworCisJcWxhNHh4eF9jcmVhdGVfaWZhY2VzKGhhKTsKIAlyZXR1cm4gMDsKIAorcmVtb3ZlX2hvc3Q6CisJc2NzaV9yZW1vdmVfaG9zdChoYS0+aG9zdCk7CisKIHByb2JlX2ZhaWxlZDoKIAlxbGE0eHh4X2ZyZWVfYWRhcHRlcihoYSk7CiAKQEAgLTE4NjcsOCArMzQ2MiwxMSBAQAogCWlmICghaXNfcWxhODAyMihoYSkpCiAJCXFsYTR4eHhfcHJldmVudF9vdGhlcl9wb3J0X3JlaW5pdChoYSk7CiAKLQkvKiByZW1vdmUgZGV2cyBmcm9tIGlzY3NpX3Nlc3Npb25zIHRvIHNjc2lfZGV2aWNlcyAqLwotCXFsYTR4eHhfZnJlZV9kZGJfbGlzdChoYSk7CisJLyogZGVzdHJveSBpZmFjZSBmcm9tIHN5c2ZzICovCisJcWxhNHh4eF9kZXN0cm95X2lmYWNlcyhoYSk7CisKKwlpZiAoaGEtPmJvb3Rfa3NldCkKKwkJaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQoaGEtPmJvb3Rfa3NldCk7CiAKIAlzY3NpX3JlbW92ZV9ob3N0KGhhLT5ob3N0KTsKIApAQCAtMTkwNywxMCArMzUwNSwxNSBAQAogCiBzdGF0aWMgaW50IHFsYTR4eHhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzcyA9IHN0YXJnZXRfdG9fc2Vzc2lvbihzZGV2LT5zZGV2X3RhcmdldCk7Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiID0gc2Vzcy0+ZGRfZGF0YTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYjsKIAlpbnQgcXVldWVfZGVwdGggPSBRTDRfREVGX1FERVBUSDsKIAorCWNsc19zZXNzID0gc3RhcmdldF90b19zZXNzaW9uKHNkZXYtPnNkZXZfdGFyZ2V0KTsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiID0gc2Vzcy0+ZGRfZGF0YTsKKwogCXNkZXYtPmhvc3RkYXRhID0gZGRiOwogCXNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQgPSAxOwogCkBAIC0yMjQ4LDcgKzM4NTEsNyBAQAogCWludCByZXR1cm5fc3RhdHVzID0gRkFJTEVEOwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAotCWhhID0gKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKKwloYSA9IHRvX3FsYV9ob3N0KGNtZC0+ZGV2aWNlLT5ob3N0KTsKIAogCWlmIChxbDR4ZG9udHJlc2V0aGJhKSB7CiAJCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBEb24ndCBSZXNldCBIQkFcbiIsCkBAIC0yMjg0LDYgKzM4ODcsMTEwIEBACiAJcmV0dXJuIHJldHVybl9zdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgcWxhNHh4eF9jb250ZXh0X3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MzJfdCBtYm94X2NtZFtNQk9YX1JFR19DT1VOVF07CisJdWludDMyX3QgbWJveF9zdHNbTUJPWF9SRUdfQ09VTlRdOworCXN0cnVjdCBhZGRyX2N0cmxfYmxrX2RlZiAqYWNiID0gTlVMTDsKKwl1aW50MzJfdCBhY2JfbGVuID0gc2l6ZW9mKHN0cnVjdCBhZGRyX2N0cmxfYmxrX2RlZik7CisJaW50IHJ2YWwgPSBRTEFfU1VDQ0VTUzsKKwlkbWFfYWRkcl90IGFjYl9kbWE7CisKKwlhY2IgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCQkJIHNpemVvZihzdHJ1Y3QgYWRkcl9jdHJsX2Jsa19kZWYpLAorCQkJCSAmYWNiX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY2IpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogVW5hYmxlIHRvIGFsbG9jIGFjYlxuIiwKKwkJCSAgIF9fZnVuY19fKTsKKwkJcnZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9wb3J0X3Jlc2V0OworCX0KKworCW1lbXNldChhY2IsIDAsIGFjYl9sZW4pOworCisJcnZhbCA9IHFsYTR4eHhfZ2V0X2FjYihoYSwgYWNiX2RtYSwgUFJJTUFSSV9BQ0IsIGFjYl9sZW4pOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfZnJlZV9hY2I7CisJfQorCisJcnZhbCA9IHFsYTR4eHhfZGlzYWJsZV9hY2IoaGEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfZnJlZV9hY2I7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZoYS0+ZGlzYWJsZV9hY2JfY29tcCwKKwkJCQkgICAgRElTQUJMRV9BQ0JfVE9WICogSFopOworCisJcnZhbCA9IHFsYTR4eHhfc2V0X2FjYihoYSwgJm1ib3hfY21kWzBdLCAmbWJveF9zdHNbMF0sIGFjYl9kbWEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfZnJlZV9hY2I7CisJfQorCitleGl0X2ZyZWVfYWNiOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGFkZHJfY3RybF9ibGtfZGVmKSwKKwkJCSAgYWNiLCBhY2JfZG1hKTsKK2V4aXRfcG9ydF9yZXNldDoKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXMgJXNcbiIsIF9fZnVuY19fLAorCQkJICBydmFsID09IFFMQV9TVUNDRVNTID8gIlNVQ0NFRURFRCIgOiAiRkFJTEVEIikpOworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgaW50IHFsYTR4eHhfaG9zdF9yZXNldChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IHJlc2V0X3R5cGUpCit7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3Qoc2hvc3QpOworCWludCBydmFsID0gUUxBX1NVQ0NFU1M7CisKKwlpZiAocWw0eGRvbnRyZXNldGhiYSkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IERvbid0IFJlc2V0IEhCQVxuIiwKKwkJCQkgIF9fZnVuY19fKSk7CisJCXJ2YWwgPSAtRVBFUk07CisJCWdvdG8gZXhpdF9ob3N0X3Jlc2V0OworCX0KKworCXJ2YWwgPSBxbGE0eHh4X3dhaXRfZm9yX2hiYV9vbmxpbmUoaGEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogVW5hYmxlIHRvIHJlc2V0IGhvc3QgIgorCQkJCSAgImFkYXB0ZXJcbiIsIF9fZnVuY19fKSk7CisJCXJ2YWwgPSAtRUlPOworCQlnb3RvIGV4aXRfaG9zdF9yZXNldDsKKwl9CisKKwlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykpCisJCWdvdG8gcmVjb3Zlcl9hZGFwdGVyOworCisJc3dpdGNoIChyZXNldF90eXBlKSB7CisJY2FzZSBTQ1NJX0FEQVBURVJfUkVTRVQ6CisJCXNldF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0NTSV9GSVJNV0FSRV9SRVNFVDoKKwkJaWYgKCF0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQkJaWYgKGlzX3FsYTgwMjIoaGEpKQorCQkJCS8qIHNldCBmaXJtd2FyZSBjb250ZXh0IHJlc2V0ICovCisJCQkJc2V0X2JpdChEUENfUkVTRVRfSEFfRldfQ09OVEVYVCwKKwkJCQkJJmhhLT5kcGNfZmxhZ3MpOworCQkJZWxzZSB7CisJCQkJcnZhbCA9IHFsYTR4eHhfY29udGV4dF9yZXNldChoYSk7CisJCQkJZ290byBleGl0X2hvc3RfcmVzZXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCityZWNvdmVyX2FkYXB0ZXI6CisJcnZhbCA9IHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlY292ZXIgYWRhcHRlciBmYWlsXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJcnZhbCA9IC1FSU87CisJfQorCitleGl0X2hvc3RfcmVzZXQ6CisJcmV0dXJuIHJ2YWw7Cit9CisKIC8qIFBDSSBBRVIgZHJpdmVyIHJlY292ZXJzIGZyb20gYWxsIGNvcnJlY3RhYmxlIGVycm9ycyB3L28KICAqIGRyaXZlciBpbnRlcnZlbnRpb24uIEZvciB1bmNvcnJlY3RhYmxlIGVycm9ycyBQQ0kgQUVSCiAgKiBkcml2ZXIgY2FsbHMgdGhlIGZvbGxvd2luZyBkZXZpY2UgZHJpdmVyJ3MgY2FsbGJhY2tzCkBAIC0yMzYwLDcgKzQwNjcsOCBAQAogCiAJaWYgKHRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykpIHsKIAkJY2xlYXJfYml0KEFGX09OTElORSwgJmhhLT5mbGFncyk7Ci0JCXFsYTR4eHhfbWFya19hbGxfZGV2aWNlc19taXNzaW5nKGhhKTsKKwkJY2xlYXJfYml0KEFGX0xJTktfVVAsICZoYS0+ZmxhZ3MpOworCQlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfZmFpbF9zZXNzaW9uKTsKIAkJcWxhNHh4eF9wcm9jZXNzX2FlbihoYSwgRkxVU0hfRERCX0NIQU5HRURfQUVOUyk7CiAJfQogCkBAIC0yNDA3LDcgKzQxMTUsNyBAQAogCiAJCXFsYTRfOHh4eF9pZGNfdW5sb2NrKGhhKTsKIAkJY2xlYXJfYml0KEFGX0ZXX1JFQ09WRVJZLCAmaGEtPmZsYWdzKTsKLQkJcnZhbCA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBQUkVTRVJWRV9EREJfTElTVCk7CisJCXJ2YWwgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSk7CiAJCXFsYTRfOHh4eF9pZGNfbG9jayhoYSk7CiAKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTI0NDMsOCArNDE1MSw3IEBACiAJCWlmICgocWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpID09CiAJCSAgICBRTEE4MlhYX0RFVl9SRUFEWSkpIHsKIAkJCWNsZWFyX2JpdChBRl9GV19SRUNPVkVSWSwgJmhhLT5mbGFncyk7Ci0JCQlydmFsID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsCi0JCQkgICAgUFJFU0VSVkVfRERCX0xJU1QpOworCQkJcnZhbCA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKIAkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCQkJcmV0ID0gcWxhNHh4eF9yZXF1ZXN0X2lycXMoaGEpOwogCQkJCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCmluZGV4IDYxMDQ5MjguLmMxNTM0N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaApAQCAtNSw0ICs1LDQgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KIAotI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAyLjAwLWs3IgorI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAyLjAwLWs4IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCmluZGV4IDk2ODlkNDFjLi5lNDBkYzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCkBAIC04ODAsNyArODgwLDcgQEAKIAkJY21kLT5jb250cm9sX2ZsYWdzIHw9IENGTEFHX1dSSVRFOwogCWVsc2UKIAkJY21kLT5jb250cm9sX2ZsYWdzIHw9IENGTEFHX1JFQUQ7Ci0JY21kLT50aW1lX291dCA9IDMwOworCWNtZC0+dGltZV9vdXQgPSBDbW5kLT5yZXF1ZXN0LT50aW1lb3V0L0haOwogCW1lbWNweShjbWQtPmNkYiwgQ21uZC0+Y21uZCwgQ21uZC0+Y21kX2xlbik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IGE0YjljZGIuLmRjNjEzMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMjkzLDggKzI5MywxNiBAQAogCQkgKiBzbyB0aGF0IHdlIGNhbiBkZWFsIHdpdGggaXQgdGhlcmUuCiAJCSAqLwogCQlpZiAoc2NtZC0+ZGV2aWNlLT5leHBlY3RpbmdfY2NfdWEpIHsKLQkJCXNjbWQtPmRldmljZS0+ZXhwZWN0aW5nX2NjX3VhID0gMDsKLQkJCXJldHVybiBORUVEU19SRVRSWTsKKwkJCS8qCisJCQkgKiBCZWNhdXNlIHNvbWUgZGV2aWNlIGRvZXMgbm90IHF1ZXVlIHVuaXQKKwkJCSAqIGF0dGVudGlvbnMgY29ycmVjdGx5LCB3ZSBjYXJlZnVsbHkgY2hlY2sKKwkJCSAqIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBhbmQgcXVhbGlmaWVyIHNvIGFzCisJCQkgKiBub3QgdG8gc3F1YXNoIG1lZGlhIGNoYW5nZSB1bml0IGF0dGVudGlvbi4KKwkJCSAqLworCQkJaWYgKHNzaGRyLmFzYyAhPSAweDI4IHx8IHNzaGRyLmFzY3EgIT0gMHgwMCkgeworCQkJCXNjbWQtPmRldmljZS0+ZXhwZWN0aW5nX2NjX3VhID0gMDsKKwkJCQlyZXR1cm4gTkVFRFNfUkVUUlk7CisJCQl9CiAJCX0KIAkJLyoKIAkJICogaWYgdGhlIGRldmljZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWNvbWluZyByZWFkeSwgd2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggZmMzZjE2OC4uMDZiYzI2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTY5OCw2ICsxNjk5LDE1IEBACiAKIHZvaWQgc2NzaV9mcmVlX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXQVJOX09OKHEtPnF1ZXVlZGF0YSk7CisKKwkvKiBjYXVzZSBzY3NpX3JlcXVlc3RfZm4oKSB0byBraWxsIGFsbCBub24tZmluaXNoZWQgcmVxdWVzdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJcS0+cmVxdWVzdF9mbihxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwogCWJsa19jbGVhbnVwX3F1ZXVlKHEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWJfZG1hLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWJfZG1hLmMKaW5kZXggZGNkMTI4NS4uMmFjM2YzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliX2RtYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYl9kbWEuYwpAQCAtNCw2ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKaW5kZXggMjZhOGE0NS4uNDRmNzZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfcG0uYwppbmRleCBkODJhMDIzYS4uZDMyOWY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcG0uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wbS5jCkBAIC02LDYgKzYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggNDRlOGNhMy4uNzIyNzNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMzIyLDYgKzMyMiw3IEBACiAJc2NzaV9kZXZpY2Vfc2V0X3N0YXRlKHNkZXYsIFNERVZfREVMKTsKIAl0cmFuc3BvcnRfZGVzdHJveV9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2Rldik7CisJc2NzaV9mcmVlX3F1ZXVlKHNkZXYtPnJlcXVlc3RfcXVldWUpOwogCXB1dF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIG91dDoKIAlpZiAoZGlzcGxheV9mYWlsdXJlX21zZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGUwYmQzZjcuLjA0YzJhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMjQ2LDYgKzI0Niw0MyBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoYWN0aXZlX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3Nob3N0X2FjdGl2ZV9tb2RlLCBOVUxMKTsKIAorc3RhdGljIGludCBjaGVja19yZXNldF90eXBlKGNoYXIgKnN0cikKK3sKKwlpZiAoc3RybmNtcChzdHIsICJhZGFwdGVyIiwgMTApID09IDApCisJCXJldHVybiBTQ1NJX0FEQVBURVJfUkVTRVQ7CisJZWxzZSBpZiAoc3RybmNtcChzdHIsICJmaXJtd2FyZSIsIDEwKSA9PSAwKQorCQlyZXR1cm4gU0NTSV9GSVJNV0FSRV9SRVNFVDsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfaG9zdF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0ID0gc2hvc3QtPmhvc3R0OworCWludCByZXQgPSAtRUlOVkFMOworCWNoYXIgc3RyWzEwXTsKKwlpbnQgdHlwZTsKKworCXNzY2FuZihidWYsICIlcyIsIHN0cik7CisJdHlwZSA9IGNoZWNrX3Jlc2V0X3R5cGUoc3RyKTsKKworCWlmICghdHlwZSkKKwkJZ290byBleGl0X3N0b3JlX2hvc3RfcmVzZXQ7CisKKwlpZiAoc2h0LT5ob3N0X3Jlc2V0KQorCQlyZXQgPSBzaHQtPmhvc3RfcmVzZXQoc2hvc3QsIHR5cGUpOworCitleGl0X3N0b3JlX2hvc3RfcmVzZXQ6CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjb3VudDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaG9zdF9yZXNldCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfaG9zdF9yZXNldCk7CisKIHNob3N0X3JkX2F0dHIodW5pcXVlX2lkLCAiJXVcbiIpOwogc2hvc3RfcmRfYXR0cihob3N0X2J1c3ksICIlaHVcbiIpOwogc2hvc3RfcmRfYXR0cihjbWRfcGVyX2x1biwgIiVoZFxuIik7CkBAIC0yNzIsNiArMzA5LDcgQEAKIAkmZGV2X2F0dHJfYWN0aXZlX21vZGUuYXR0ciwKIAkmZGV2X2F0dHJfcHJvdF9jYXBhYmlsaXRpZXMuYXR0ciwKIAkmZGV2X2F0dHJfcHJvdF9ndWFyZF90eXBlLmF0dHIsCisJJmRldl9hdHRyX2hvc3RfcmVzZXQuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfaWYuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jCmluZGV4IDAxNzJkZTEuLjYyMDkxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggM2ZkMTZkNy4uOTYwMjllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ic2ctbGliLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CkBAIC0zMSwxMCArMzMsNyBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KICNpbmNsdWRlIDxzY3NpL2lzY3NpX2lmLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLQotI2RlZmluZSBJU0NTSV9TRVNTSU9OX0FUVFJTIDIzCi0jZGVmaW5lIElTQ1NJX0NPTk5fQVRUUlMgMTMKLSNkZWZpbmUgSVNDU0lfSE9TVF9BVFRSUyA0CisjaW5jbHVkZSA8c2NzaS9zY3NpX2JzZ19pc2NzaS5oPgogCiAjZGVmaW5lIElTQ1NJX1RSQU5TUE9SVF9WRVJTSU9OICIyLjAtODcwIgogCkBAIC03NiwxNiArNzUsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGRldmljZSBkZXY7CiAKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqaG9zdF9hdHRyc1tJU0NTSV9IT1NUX0FUVFJTICsgMV07CiAJc3RydWN0IHRyYW5zcG9ydF9jb250YWluZXIgY29ubl9jb250OwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpjb25uX2F0dHJzW0lTQ1NJX0NPTk5fQVRUUlMgKyAxXTsKIAlzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciBzZXNzaW9uX2NvbnQ7Ci0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnNlc3Npb25fYXR0cnNbSVNDU0lfU0VTU0lPTl9BVFRSUyArIDFdOwogfTsKIAogc3RhdGljIGF0b21pY190IGlzY3NpX3Nlc3Npb25fbnI7IC8qIHN5c2ZzIHNlc3Npb24gaWQgZm9yIG5leHQgbmV3IHNlc3Npb24gKi8KIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqaXNjc2lfZWhfdGltZXJfd29ya3E7CiAKK3N0YXRpYyBERUZJTkVfSURBKGlzY3NpX3Nlc3NfaWRhKTsKIC8qCiAgKiBsaXN0IG9mIHJlZ2lzdGVyZWQgdHJhbnNwb3J0cyBhbmQgbG9jayB0aGF0IG11c3QKICAqIGJlIGhlbGQgd2hpbGUgYWNjZXNzaW5nIGxpc3QuIFRoZSBpc2NzaV90cmFuc3BvcnRfbG9jayBtdXN0CkBAIC0yNzAsNiArMjY3LDI5MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfbG9va3VwX2VuZHBvaW50KTsKIAorLyoKKyAqIEludGVyZmFjZSB0byBkaXNwbGF5IG5ldHdvcmsgcGFyYW0gdG8gc3lzZnMKKyAqLworCitzdGF0aWMgdm9pZCBpc2NzaV9pZmFjZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlID0gaXNjc2lfZGV2X3RvX2lmYWNlKGRldik7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gaWZhY2UtPmRldi5wYXJlbnQ7CisKKwlrZnJlZShpZmFjZSk7CisJcHV0X2RldmljZShwYXJlbnQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgaXNjc2lfaWZhY2VfY2xhc3MgPSB7CisJLm5hbWUgPSAiaXNjc2lfaWZhY2UiLAorCS5kZXZfcmVsZWFzZSA9IGlzY3NpX2lmYWNlX3JlbGVhc2UsCit9OworCisjZGVmaW5lIElTQ1NJX0lGQUNFX0FUVFIoX3ByZWZpeCwgX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQlcCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl8jI19wcmVmaXgjI18jI19uYW1lID0JCVwKKwlfX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQorCisvKiBpZmFjZSBhdHRycyBzaG93ICovCisjZGVmaW5lIGlzY3NpX2lmYWNlX2F0dHJfc2hvdyh0eXBlLCBuYW1lLCBwYXJhbV90eXBlLCBwYXJhbSkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93XyMjdHlwZSMjXyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCSAgICAgY2hhciAqYnVmKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSA9IGlzY3NpX2Rldl90b19pZmFjZShkZXYpOwkJXAorCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQgPSBpZmFjZS0+dHJhbnNwb3J0OwkJCVwKKwlyZXR1cm4gdC0+Z2V0X2lmYWNlX3BhcmFtKGlmYWNlLCBwYXJhbV90eXBlLCBwYXJhbSwgYnVmKTsJXAorfQkJCQkJCQkJCVwKKworI2RlZmluZSBpc2NzaV9pZmFjZV9uZXRfYXR0cih0eXBlLCBuYW1lLCBwYXJhbSkJCQkJXAorCWlzY3NpX2lmYWNlX2F0dHJfc2hvdyh0eXBlLCBuYW1lLCBJU0NTSV9ORVRfUEFSQU0sIHBhcmFtKQlcCitzdGF0aWMgSVNDU0lfSUZBQ0VfQVRUUih0eXBlLCBuYW1lLCBTX0lSVUdPLCBzaG93XyMjdHlwZSMjXyMjbmFtZSwgTlVMTCk7CisKKy8qIGdlbmVyaWMgcmVhZCBvbmx5IGlwdmk0IGF0dHJpYnV0ZSAqLworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaXB2NF9pZmFjZSwgaXBhZGRyZXNzLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjRfaWZhY2UsIGdhdGV3YXksIElTQ1NJX05FVF9QQVJBTV9JUFY0X0dXKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjRfaWZhY2UsIHN1Ym5ldCwgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjRfaWZhY2UsIGJvb3Rwcm90bywgSVNDU0lfTkVUX1BBUkFNX0lQVjRfQk9PVFBST1RPKTsKKworLyogZ2VuZXJpYyByZWFkIG9ubHkgaXB2NiBhdHRyaWJ1dGUgKi8KK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjZfaWZhY2UsIGlwYWRkcmVzcywgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUik7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpcHY2X2lmYWNlLCBsaW5rX2xvY2FsX2FkZHIsIElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTCk7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpcHY2X2lmYWNlLCByb3V0ZXJfYWRkciwgSVNDU0lfTkVUX1BBUkFNX0lQVjZfUk9VVEVSKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlwdjZfaWZhY2UsIGlwYWRkcl9hdXRvY2ZnLAorCQkgICAgIElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFJfQVVUT0NGRyk7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpcHY2X2lmYWNlLCBsaW5rX2xvY2FsX2F1dG9jZmcsCisJCSAgICAgSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkcpOworCisvKiBjb21tb24gcmVhZCBvbmx5IGlmYWNlIGF0dHJpYnV0ZSAqLworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaWZhY2UsIGVuYWJsZWQsIElTQ1NJX05FVF9QQVJBTV9JRkFDRV9FTkFCTEUpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaWZhY2UsIHZsYW5faWQsIElTQ1NJX05FVF9QQVJBTV9WTEFOX0lEKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlmYWNlLCB2bGFuX3ByaW9yaXR5LCBJU0NTSV9ORVRfUEFSQU1fVkxBTl9QUklPUklUWSk7Citpc2NzaV9pZmFjZV9uZXRfYXR0cihpZmFjZSwgdmxhbl9lbmFibGVkLCBJU0NTSV9ORVRfUEFSQU1fVkxBTl9FTkFCTEVEKTsKK2lzY3NpX2lmYWNlX25ldF9hdHRyKGlmYWNlLCBtdHUsIElTQ1NJX05FVF9QQVJBTV9NVFUpOworaXNjc2lfaWZhY2VfbmV0X2F0dHIoaWZhY2UsIHBvcnQsIElTQ1NJX05FVF9QQVJBTV9QT1JUKTsKKworc3RhdGljIG1vZGVfdCBpc2NzaV9pZmFjZV9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGkpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UgPSBpc2NzaV9kZXZfdG9faWZhY2UoZGV2KTsKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0ID0gaWZhY2UtPnRyYW5zcG9ydDsKKwlpbnQgcGFyYW07CisKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaWZhY2VfZW5hYmxlZC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JRkFDRV9FTkFCTEU7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaWZhY2Vfdmxhbl9pZC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9WTEFOX0lEOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lmYWNlX3ZsYW5fcHJpb3JpdHkuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9QUklPUklUWTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pZmFjZV92bGFuX2VuYWJsZWQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9FTkFCTEVEOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lmYWNlX210dS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9NVFU7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaWZhY2VfcG9ydC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9QT1JUOworCWVsc2UgaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkgeworCQlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2NF9pZmFjZV9pcGFkZHJlc3MuYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjRfQUREUjsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2NF9pZmFjZV9nYXRld2F5LmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY0X0dXOworCQllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pcHY0X2lmYWNlX3N1Ym5ldC5hdHRyKQorCQkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9TVUJORVQ7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjRfaWZhY2VfYm9vdHByb3RvLmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTzsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpZmFjZS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjYpIHsKKwkJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjZfaWZhY2VfaXBhZGRyZXNzLmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFI7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjZfaWZhY2VfbGlua19sb2NhbF9hZGRyLmF0dHIpCisJCQlwYXJhbSA9IElTQ1NJX05FVF9QQVJBTV9JUFY2X0xJTktMT0NBTDsKKwkJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaXB2Nl9pZmFjZV9yb3V0ZXJfYWRkci5hdHRyKQorCQkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVI7CisJCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2lwdjZfaWZhY2VfaXBhZGRyX2F1dG9jZmcuYXR0cikKKwkJCXBhcmFtID0gSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUl9BVVRPQ0ZHOworCQllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9pcHY2X2lmYWNlX2xpbmtfbG9jYWxfYXV0b2NmZy5hdHRyKQorCQkJcGFyYW0gPSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9MSU5LTE9DQUxfQVVUT0NGRzsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIGlmYWNlIGF0dHIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHQtPmF0dHJfaXNfdmlzaWJsZShJU0NTSV9ORVRfUEFSQU0sIHBhcmFtKTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlzY3NpX2lmYWNlX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2lmYWNlX2VuYWJsZWQuYXR0ciwKKwkmZGV2X2F0dHJfaWZhY2Vfdmxhbl9pZC5hdHRyLAorCSZkZXZfYXR0cl9pZmFjZV92bGFuX3ByaW9yaXR5LmF0dHIsCisJJmRldl9hdHRyX2lmYWNlX3ZsYW5fZW5hYmxlZC5hdHRyLAorCSZkZXZfYXR0cl9pcHY0X2lmYWNlX2lwYWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9pcHY0X2lmYWNlX2dhdGV3YXkuYXR0ciwKKwkmZGV2X2F0dHJfaXB2NF9pZmFjZV9zdWJuZXQuYXR0ciwKKwkmZGV2X2F0dHJfaXB2NF9pZmFjZV9ib290cHJvdG8uYXR0ciwKKwkmZGV2X2F0dHJfaXB2Nl9pZmFjZV9pcGFkZHJlc3MuYXR0ciwKKwkmZGV2X2F0dHJfaXB2Nl9pZmFjZV9saW5rX2xvY2FsX2FkZHIuYXR0ciwKKwkmZGV2X2F0dHJfaXB2Nl9pZmFjZV9yb3V0ZXJfYWRkci5hdHRyLAorCSZkZXZfYXR0cl9pcHY2X2lmYWNlX2lwYWRkcl9hdXRvY2ZnLmF0dHIsCisJJmRldl9hdHRyX2lwdjZfaWZhY2VfbGlua19sb2NhbF9hdXRvY2ZnLmF0dHIsCisJJmRldl9hdHRyX2lmYWNlX210dS5hdHRyLAorCSZkZXZfYXR0cl9pZmFjZV9wb3J0LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlzY3NpX2lmYWNlX2dyb3VwID0geworCS5hdHRycyA9IGlzY3NpX2lmYWNlX2F0dHJzLAorCS5pc192aXNpYmxlID0gaXNjc2lfaWZhY2VfYXR0cl9pc192aXNpYmxlLAorfTsKKworc3RydWN0IGlzY3NpX2lmYWNlICoKK2lzY3NpX2NyZWF0ZV9pZmFjZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkgICB1aW50MzJfdCBpZmFjZV90eXBlLCB1aW50MzJfdCBpZmFjZV9udW0sIGludCBkZF9zaXplKQoreworCXN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2U7CisJaW50IGVycjsKKworCWlmYWNlID0ga3phbGxvYyhzaXplb2YoKmlmYWNlKSArIGRkX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghaWZhY2UpCisJCXJldHVybiBOVUxMOworCisJaWZhY2UtPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKwlpZmFjZS0+aWZhY2VfdHlwZSA9IGlmYWNlX3R5cGU7CisJaWZhY2UtPmlmYWNlX251bSA9IGlmYWNlX251bTsKKwlpZmFjZS0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9pZmFjZV9yZWxlYXNlOworCWlmYWNlLT5kZXYuY2xhc3MgPSAmaXNjc2lfaWZhY2VfY2xhc3M7CisJLyogcGFyZW50IHJlZmVyZW5jZSByZWxlYXNlZCBpbiBpc2NzaV9pZmFjZV9yZWxlYXNlICovCisJaWZhY2UtPmRldi5wYXJlbnQgPSBnZXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlpZiAoaWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQpCisJCWRldl9zZXRfbmFtZSgmaWZhY2UtPmRldiwgImlwdjQtaWZhY2UtJXUtJXUiLCBzaG9zdC0+aG9zdF9ubywKKwkJCSAgICAgaWZhY2VfbnVtKTsKKwllbHNlCisJCWRldl9zZXRfbmFtZSgmaWZhY2UtPmRldiwgImlwdjYtaWZhY2UtJXUtJXUiLCBzaG9zdC0+aG9zdF9ubywKKwkJCSAgICAgaWZhY2VfbnVtKTsKKworCWVyciA9IGRldmljZV9yZWdpc3RlcigmaWZhY2UtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2lmYWNlOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpZmFjZS0+ZGV2LmtvYmosICZpc2NzaV9pZmFjZV9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byB1bnJlZ19pZmFjZTsKKworCWlmIChkZF9zaXplKQorCQlpZmFjZS0+ZGRfZGF0YSA9ICZpZmFjZVsxXTsKKwlyZXR1cm4gaWZhY2U7CisKK3VucmVnX2lmYWNlOgorCWRldmljZV91bnJlZ2lzdGVyKCZpZmFjZS0+ZGV2KTsKKwlyZXR1cm4gTlVMTDsKKworZnJlZV9pZmFjZToKKwlwdXRfZGV2aWNlKGlmYWNlLT5kZXYucGFyZW50KTsKKwlrZnJlZShpZmFjZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jcmVhdGVfaWZhY2UpOworCit2b2lkIGlzY3NpX2Rlc3Ryb3lfaWZhY2Uoc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSkKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmlmYWNlLT5kZXYua29iaiwgJmlzY3NpX2lmYWNlX2dyb3VwKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmaWZhY2UtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9kZXN0cm95X2lmYWNlKTsKKworLyoKKyAqIEJTRyBzdXBwb3J0CisgKi8KKy8qKgorICogaXNjc2lfYnNnX2hvc3RfZGlzcGF0Y2ggLSBEaXNwYXRjaCBjb21tYW5kIHRvIExMRC4KKyAqIEBqb2I6IGJzZyBqb2IgdG8gYmUgcHJvY2Vzc2VkCisgKi8KK3N0YXRpYyBpbnQgaXNjc2lfYnNnX2hvc3RfZGlzcGF0Y2goc3RydWN0IGJzZ19qb2IgKmpvYikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChqb2IpOworCXN0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCAqcmVxID0gam9iLT5yZXF1ZXN0OworCXN0cnVjdCBpc2NzaV9ic2dfcmVwbHkgKnJlcGx5ID0gam9iLT5yZXBseTsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKmkgPSB0b19pc2NzaV9pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CisJaW50IGNtZGxlbiA9IHNpemVvZih1aW50MzJfdCk7CS8qIHN0YXJ0IHdpdGggbGVuZ3RoIG9mIG1zZ2NvZGUgKi8KKwlpbnQgcmV0OworCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGUgbXNnY29kZSB2YWx1ZSBhdCBsZWFzdCAqLworCWlmIChqb2ItPnJlcXVlc3RfbGVuIDwgc2l6ZW9mKHVpbnQzMl90KSkgeworCQlyZXQgPSAtRU5PTVNHOworCQlnb3RvIGZhaWxfaG9zdF9tc2c7CisJfQorCisJLyogVmFsaWRhdGUgdGhlIGhvc3QgY29tbWFuZCAqLworCXN3aXRjaCAocmVxLT5tc2djb2RlKSB7CisJY2FzZSBJU0NTSV9CU0dfSFNUX1ZFTkRPUjoKKwkJY21kbGVuICs9IHNpemVvZihzdHJ1Y3QgaXNjc2lfYnNnX2hvc3RfdmVuZG9yKTsKKwkJaWYgKChzaG9zdC0+aG9zdHQtPnZlbmRvcl9pZCA9PSAwTCkgfHwKKwkJICAgIChyZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfaWQgIT0KKwkJCXNob3N0LT5ob3N0dC0+dmVuZG9yX2lkKSkgeworCQkJcmV0ID0gLUVTUkNIOworCQkJZ290byBmYWlsX2hvc3RfbXNnOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FQkFEUjsKKwkJZ290byBmYWlsX2hvc3RfbXNnOworCX0KKworCS8qIGNoZWNrIGlmIHdlIHJlYWxseSBoYXZlIGFsbCB0aGUgcmVxdWVzdCBkYXRhIG5lZWRlZCAqLworCWlmIChqb2ItPnJlcXVlc3RfbGVuIDwgY21kbGVuKSB7CisJCXJldCA9IC1FTk9NU0c7CisJCWdvdG8gZmFpbF9ob3N0X21zZzsKKwl9CisKKwlyZXQgPSBpLT5pc2NzaV90cmFuc3BvcnQtPmJzZ19yZXF1ZXN0KGpvYik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCitmYWlsX2hvc3RfbXNnOgorCS8qIHJldHVybiB0aGUgZXJybm8gZmFpbHVyZSBjb2RlIGFzIHRoZSBvbmx5IHN0YXR1cyAqLworCUJVR19PTihqb2ItPnJlcGx5X2xlbiA8IHNpemVvZih1aW50MzJfdCkpOworCXJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOworCXJlcGx5LT5yZXN1bHQgPSByZXQ7CisJam9iLT5yZXBseV9sZW4gPSBzaXplb2YodWludDMyX3QpOworCWJzZ19qb2JfZG9uZShqb2IsIHJldCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNjc2lfYnNnX2hvc3RfYWRkIC0gQ3JlYXRlIGFuZCBhZGQgdGhlIGJzZyBob29rcyB0byByZWNlaXZlIHJlcXVlc3RzCisgKiBAc2hvc3Q6IHNob3N0IGZvciBpc2NzaV9ob3N0CisgKiBAaWhvc3Q6IGlzY3NpX2Nsc19ob3N0IGFkZGluZyB0aGUgc3RydWN0dXJlcyB0bworICovCitzdGF0aWMgaW50Citpc2NzaV9ic2dfaG9zdF9hZGQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBpc2NzaV9jbHNfaG9zdCAqaWhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICppID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCWNoYXIgYnNnX25hbWVbMjBdOworCWludCByZXQ7CisKKwlpZiAoIWktPmlzY3NpX3RyYW5zcG9ydC0+YnNnX3JlcXVlc3QpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlzbnByaW50Zihic2dfbmFtZSwgc2l6ZW9mKGJzZ19uYW1lKSwgImlzY3NpX2hvc3QlZCIsIHNob3N0LT5ob3N0X25vKTsKKworCXEgPSBfX3Njc2lfYWxsb2NfcXVldWUoc2hvc3QsIGJzZ19yZXF1ZXN0X2ZuKTsKKwlpZiAoIXEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYnNnX3NldHVwX3F1ZXVlKGRldiwgcSwgYnNnX25hbWUsIGlzY3NpX2JzZ19ob3N0X2Rpc3BhdGNoLCAwKTsKKwlpZiAocmV0KSB7CisJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgc2hvc3QsICJic2cgaW50ZXJmYWNlIGZhaWxlZCB0byAiCisJCQkgICAgICJpbml0aWFsaXplIC0gbm8gcmVxdWVzdCBxdWV1ZVxuIik7CisJCWJsa19jbGVhbnVwX3F1ZXVlKHEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlob3N0LT5ic2dfcSA9IHE7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaXNjc2lfc2V0dXBfaG9zdChzdHJ1Y3QgdHJhbnNwb3J0X2NvbnRhaW5lciAqdGMsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlICpjZGV2KQogewpAQCAtMjc5LDEzICs1NjEsMzAgQEAKIAltZW1zZXQoaWhvc3QsIDAsIHNpemVvZigqaWhvc3QpKTsKIAlhdG9taWNfc2V0KCZpaG9zdC0+bnJfc2NhbnMsIDApOwogCW11dGV4X2luaXQoJmlob3N0LT5tdXRleCk7CisKKwlpc2NzaV9ic2dfaG9zdF9hZGQoc2hvc3QsIGlob3N0KTsKKwkvKiBpZ25vcmUgYW55IGJzZyBhZGQgZXJyb3IgLSB3ZSBqdXN0IGNhbid0IGRvIHNnaW8gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzY3NpX3JlbW92ZV9ob3N0KHN0cnVjdCB0cmFuc3BvcnRfY29udGFpbmVyICp0YywKKwkJCSAgICAgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpjZGV2KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CisJc3RydWN0IGlzY3NpX2Nsc19ob3N0ICppaG9zdCA9IHNob3N0LT5zaG9zdF9kYXRhOworCisJaWYgKGlob3N0LT5ic2dfcSkgeworCQlic2dfcmVtb3ZlX3F1ZXVlKGlob3N0LT5ic2dfcSk7CisJCWJsa19jbGVhbnVwX3F1ZXVlKGlob3N0LT5ic2dfcSk7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoaXNjc2lfaG9zdF9jbGFzcywKIAkJCSAgICAgICAiaXNjc2lfaG9zdCIsCiAJCQkgICAgICAgaXNjc2lfc2V0dXBfaG9zdCwKLQkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIGlzY3NpX3JlbW92ZV9ob3N0LAogCQkJICAgICAgIE5VTEwpOwogCiBzdGF0aWMgREVDTEFSRV9UUkFOU1BPUlRfQ0xBU1MoaXNjc2lfc2Vzc2lvbl9jbGFzcywKQEAgLTQwNCw2ICs3MDMsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3Nlc3Npb25fY2hrcmVhZHkpOwogCitpbnQgaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCWlmIChzZXNzaW9uLT5zdGF0ZSA9PSBJU0NTSV9TRVNTSU9OX0xPR0dFRF9JTikKKwkJcmV0ID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2lzX3Nlc3Npb25fb25saW5lKTsKKwogc3RhdGljIHZvaWQgaXNjc2lfc2Vzc2lvbl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYpOwpAQCAtNjgwLDYgKzk5Miw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOwogCXN0cnVjdCBpc2NzaV9jbHNfaG9zdCAqaWhvc3QgPSBzaG9zdC0+c2hvc3RfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB0YXJnZXRfaWQ7CiAKIAlJU0NTSV9EQkdfVFJBTlNfU0VTU0lPTihzZXNzaW9uLCAiVW5iaW5kaW5nIHNlc3Npb25cbiIpOwogCkBAIC02OTEsMTAgKzEwMDQsMTUgQEAKIAkJbXV0ZXhfdW5sb2NrKCZpaG9zdC0+bXV0ZXgpOwogCQlyZXR1cm47CiAJfQorCisJdGFyZ2V0X2lkID0gc2Vzc2lvbi0+dGFyZ2V0X2lkOwogCXNlc3Npb24tPnRhcmdldF9pZCA9IElTQ1NJX01BWF9UQVJHRVQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOwogCW11dGV4X3VubG9jaygmaWhvc3QtPm11dGV4KTsKIAorCWlmIChzZXNzaW9uLT5pZGFfdXNlZCkKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmlzY3NpX3Nlc3NfaWRhLCB0YXJnZXRfaWQpOworCiAJc2NzaV9yZW1vdmVfdGFyZ2V0KCZzZXNzaW9uLT5kZXYpOwogCWlzY3NpX3Nlc3Npb25fZXZlbnQoc2Vzc2lvbiwgSVNDU0lfS0VWRU5UX1VOQklORF9TRVNTSU9OKTsKIAlJU0NTSV9EQkdfVFJBTlNfU0VTU0lPTihzZXNzaW9uLCAiQ29tcGxldGVkIHRhcmdldCByZW1vdmFsXG4iKTsKQEAgLTczNSw1OSArMTA1MywzNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfYWxsb2Nfc2Vzc2lvbik7CiAKLXN0YXRpYyBpbnQgaXNjc2lfZ2V0X25leHRfdGFyZ2V0X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghaXNjc2lfaXNfc2Vzc2lvbl9kZXYoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlzZXNzaW9uID0gaXNjc2lfZGV2X3RvX3Nlc3Npb24oZGV2KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOwotCWlmICgqKCh1bnNpZ25lZCBpbnQgKikgZGF0YSkgPT0gc2Vzc2lvbi0+dGFyZ2V0X2lkKQotCQllcnIgPSAtRUVYSVNUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZXJyOwotfQotCiBpbnQgaXNjc2lfYWRkX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uLCB1bnNpZ25lZCBpbnQgdGFyZ2V0X2lkKQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKIAlzdHJ1Y3QgaXNjc2lfY2xzX2hvc3QgKmlob3N0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGlkID0gdGFyZ2V0X2lkOworCWludCBpZCA9IDA7CiAJaW50IGVycjsKIAogCWlob3N0ID0gc2hvc3QtPnNob3N0X2RhdGE7CiAJc2Vzc2lvbi0+c2lkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmlzY3NpX3Nlc3Npb25fbnIpOwogCi0JaWYgKGlkID09IElTQ1NJX01BWF9UQVJHRVQpIHsKLQkJZm9yIChpZCA9IDA7IGlkIDwgSVNDU0lfTUFYX1RBUkdFVDsgaWQrKykgewotCQkJZXJyID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAmaWQsCi0JCQkJCQkgICAgaXNjc2lfZ2V0X25leHRfdGFyZ2V0X2lkKTsKLQkJCWlmICghZXJyKQotCQkJCWJyZWFrOwotCQl9CisJaWYgKHRhcmdldF9pZCA9PSBJU0NTSV9NQVhfVEFSR0VUKSB7CisJCWlkID0gaWRhX3NpbXBsZV9nZXQoJmlzY3NpX3Nlc3NfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKIAotCQlpZiAoaWQgPT0gSVNDU0lfTUFYX1RBUkdFVCkgeworCQlpZiAoaWQgPCAwKSB7CiAJCQlpc2NzaV9jbHNfc2Vzc2lvbl9wcmludGsoS0VSTl9FUlIsIHNlc3Npb24sCi0JCQkJCQkgIlRvbyBtYW55IGlzY3NpIHRhcmdldHMuIE1heCAiCi0JCQkJCQkgIm51bWJlciBvZiB0YXJnZXRzIGlzICVkLlxuIiwKLQkJCQkJCSBJU0NTSV9NQVhfVEFSR0VUIC0gMSk7Ci0JCQllcnIgPSAtRU9WRVJGTE9XOwotCQkJZ290byByZWxlYXNlX2hvc3Q7CisJCQkJCSJGYWlsdXJlIGluIFRhcmdldCBJRCBBbGxvY2F0aW9uXG4iKTsKKwkJCXJldHVybiBpZDsKIAkJfQotCX0KLQlzZXNzaW9uLT50YXJnZXRfaWQgPSBpZDsKKwkJc2Vzc2lvbi0+dGFyZ2V0X2lkID0gKHVuc2lnbmVkIGludClpZDsKKwkJc2Vzc2lvbi0+aWRhX3VzZWQgPSB0cnVlOworCX0gZWxzZQorCQlzZXNzaW9uLT50YXJnZXRfaWQgPSB0YXJnZXRfaWQ7CiAKIAlkZXZfc2V0X25hbWUoJnNlc3Npb24tPmRldiwgInNlc3Npb24ldSIsIHNlc3Npb24tPnNpZCk7CiAJZXJyID0gZGV2aWNlX2FkZCgmc2Vzc2lvbi0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKIAkJCQkJICJjb3VsZCBub3QgcmVnaXN0ZXIgc2Vzc2lvbidzIGRldlxuIik7Ci0JCWdvdG8gcmVsZWFzZV9ob3N0OworCQlnb3RvIHJlbGVhc2VfaWRhOwogCX0KIAl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZzZXNzaW9uLT5kZXYpOwogCkBAIC03OTksOCArMTA5NCwxMCBAQAogCUlTQ1NJX0RCR19UUkFOU19TRVNTSU9OKHNlc3Npb24sICJDb21wbGV0ZWQgc2Vzc2lvbiBhZGRpbmdcbiIpOwogCXJldHVybiAwOwogCi1yZWxlYXNlX2hvc3Q6Ci0Jc2NzaV9ob3N0X3B1dChzaG9zdCk7CityZWxlYXNlX2lkYToKKwlpZiAoc2Vzc2lvbi0+aWRhX3VzZWQpCisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZpc2NzaV9zZXNzX2lkYSwgc2Vzc2lvbi0+dGFyZ2V0X2lkKTsKKwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9hZGRfc2Vzc2lvbik7CkBAIC0xMTQ0LDYgKzE0NDEsNDAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Nvbm5fZXJyb3JfZXZlbnQpOwogCit2b2lkIGlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAorCQkJICAgIGVudW0gaXNjc2lfY29ubl9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsKKwlzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldjsKKwlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CisJaW50IGxlbiA9IE5MTVNHX1NQQUNFKHNpemVvZigqZXYpKTsKKworCXByaXYgPSBpc2NzaV9pZl90cmFuc3BvcnRfbG9va3VwKGNvbm4tPnRyYW5zcG9ydCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm47CisKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlpc2NzaV9jbHNfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJncmFjZWZ1bGx5IGlnbm9yZWQgIgorCQkJCSAgICAgICJjb25uIGxvZ2luICglZClcbiIsIHN0YXRlKTsKKwkJcmV0dXJuOworCX0KKworCW5saCA9IF9fbmxtc2dfcHV0KHNrYiwgMCwgMCwgMCwgKGxlbiAtIHNpemVvZigqbmxoKSksIDApOworCWV2ID0gTkxNU0dfREFUQShubGgpOworCWV2LT50cmFuc3BvcnRfaGFuZGxlID0gaXNjc2lfaGFuZGxlKGNvbm4tPnRyYW5zcG9ydCk7CisJZXYtPnR5cGUgPSBJU0NTSV9LRVZFTlRfQ09OTl9MT0dJTl9TVEFURTsKKwlldi0+ci5jb25uX2xvZ2luLnN0YXRlID0gc3RhdGU7CisJZXYtPnIuY29ubl9sb2dpbi5jaWQgPSBjb25uLT5jaWQ7CisJZXYtPnIuY29ubl9sb2dpbi5zaWQgPSBpc2NzaV9jb25uX2dldF9zaWQoY29ubik7CisJaXNjc2lfbXVsdGljYXN0X3NrYihza2IsIElTQ1NJX05MX0dSUF9JU0NTSUQsIEdGUF9BVE9NSUMpOworCisJaXNjc2lfY2xzX2Nvbm5fcHJpbnRrKEtFUk5fSU5GTywgY29ubiwgImRldGVjdGVkIGNvbm4gbG9naW4gKCVkKVxuIiwKKwkJCSAgICAgIHN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Nvbm5fbG9naW5fZXZlbnQpOworCiBzdGF0aWMgaW50CiBpc2NzaV9pZl9zZW5kX3JlcGx5KHVpbnQzMl90IGdyb3VwLCBpbnQgc2VxLCBpbnQgdHlwZSwgaW50IGRvbmUsIGludCBtdWx0aSwKIAkJICAgIHZvaWQgKnBheWxvYWQsIGludCBzaXplKQpAQCAtMTU1OCw2ICsxODg5LDI5IEBACiB9CiAKIHN0YXRpYyBpbnQKK2lzY3NpX3NldF9pZmFjZV9wYXJhbXMoc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LAorCQkgICAgICAgc3RydWN0IGlzY3NpX3VldmVudCAqZXYsIHVpbnQzMl90IGxlbikKK3sKKwljaGFyICpkYXRhID0gKGNoYXIgKilldiArIHNpemVvZigqZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWludCBlcnI7CisKKwlpZiAoIXRyYW5zcG9ydC0+c2V0X2lmYWNlX3BhcmFtKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXNob3N0ID0gc2NzaV9ob3N0X2xvb2t1cChldi0+dS5zZXRfaWZhY2VfcGFyYW1zLmhvc3Rfbm8pOworCWlmICghc2hvc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZXRfaWZhY2VfcGFyYW1zIGNvdWxkIG5vdCBmaW5kIGhvc3Qgbm8gJXVcbiIsCisJCSAgICAgICBldi0+dS5zZXRfaWZhY2VfcGFyYW1zLmhvc3Rfbm8pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSB0cmFuc3BvcnQtPnNldF9pZmFjZV9wYXJhbShzaG9zdCwgZGF0YSwgbGVuKTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CiBpc2NzaV9pZl9yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdWludDMyX3QgKmdyb3VwKQogewogCWludCBlcnIgPSAwOwpAQCAtMTY5Niw2ICsyMDUwLDEwIEBACiAJY2FzZSBJU0NTSV9VRVZFTlRfUEFUSF9VUERBVEU6CiAJCWVyciA9IGlzY3NpX3NldF9wYXRoKHRyYW5zcG9ydCwgZXYpOwogCQlicmVhazsKKwljYXNlIElTQ1NJX1VFVkVOVF9TRVRfSUZBQ0VfUEFSQU1TOgorCQllcnIgPSBpc2NzaV9zZXRfaWZhY2VfcGFyYW1zKHRyYW5zcG9ydCwgZXYsCisJCQkJCSAgICAgbmxtc2dfYXR0cmxlbihubGgsIHNpemVvZigqZXYpKSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9TWVM7CiAJCWJyZWFrOwpAQCAtMTgyNCw2ICsyMTgyLDcwIEBACiBpc2NzaV9jb25uX2VwX2F0dHIoYWRkcmVzcywgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTKTsKIGlzY3NpX2Nvbm5fZXBfYXR0cihwb3J0LCBJU0NTSV9QQVJBTV9DT05OX1BPUlQpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXNjc2lfY29ubl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9jb25uX21heF9yZWN2X2RsZW5ndGguYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9tYXhfeG1pdF9kbGVuZ3RoLmF0dHIsCisJJmRldl9hdHRyX2Nvbm5faGVhZGVyX2RpZ2VzdC5hdHRyLAorCSZkZXZfYXR0cl9jb25uX2RhdGFfZGlnZXN0LmF0dHIsCisJJmRldl9hdHRyX2Nvbm5faWZtYXJrZXIuYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9vZm1hcmtlci5hdHRyLAorCSZkZXZfYXR0cl9jb25uX2FkZHJlc3MuYXR0ciwKKwkmZGV2X2F0dHJfY29ubl9wb3J0LmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fZXhwX3N0YXRzbi5hdHRyLAorCSZkZXZfYXR0cl9jb25uX3BlcnNpc3RlbnRfYWRkcmVzcy5hdHRyLAorCSZkZXZfYXR0cl9jb25uX3BlcnNpc3RlbnRfcG9ydC5hdHRyLAorCSZkZXZfYXR0cl9jb25uX3BpbmdfdG1vLmF0dHIsCisJJmRldl9hdHRyX2Nvbm5fcmVjdl90bW8uYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIG1vZGVfdCBpc2NzaV9jb25uX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpKQoreworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uID0gdHJhbnNwb3J0X2NsYXNzX3RvX2Nvbm4oY2Rldik7CisJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCA9IGNvbm4tPnRyYW5zcG9ydDsKKwlpbnQgcGFyYW07CisKKwlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9tYXhfcmVjdl9kbGVuZ3RoLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fTUFYX1JFQ1ZfRExFTkdUSDsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX21heF94bWl0X2RsZW5ndGguYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9NQVhfWE1JVF9ETEVOR1RIOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5faGVhZGVyX2RpZ2VzdC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0hEUkRHU1RfRU47CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9kYXRhX2RpZ2VzdC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0RBVEFER1NUX0VOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5faWZtYXJrZXIuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9JRk1BUktFUl9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX29mbWFya2VyLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fT0ZNQVJLRVJfRU47CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfY29ubl9hZGRyZXNzLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fcG9ydC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0NPTk5fUE9SVDsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX2V4cF9zdGF0c24uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fcGVyc2lzdGVudF9hZGRyZXNzLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fcGVyc2lzdGVudF9wb3J0LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9QT1JUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2Nvbm5fcGluZ190bW8uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9QSU5HX1RNTzsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9jb25uX3JlY3ZfdG1vLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fUkVDVl9UTU87CisJZWxzZSB7CisJCVdBUk5fT05DRSgxLCAiSW52YWxpZCBjb25uIGF0dHIiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHQtPmF0dHJfaXNfdmlzaWJsZShJU0NTSV9QQVJBTSwgcGFyYW0pOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpc2NzaV9jb25uX2dyb3VwID0geworCS5hdHRycyA9IGlzY3NpX2Nvbm5fYXR0cnMsCisJLmlzX3Zpc2libGUgPSBpc2NzaV9jb25uX2F0dHJfaXNfdmlzaWJsZSwKK307CisKIC8qCiAgKiBpU0NTSSBzZXNzaW9uIGF0dHJzCiAgKi8KQEAgLTE4NDUsNyArMjI2Nyw2IEBACiAJaXNjc2lfc2Vzc2lvbl9hdHRyX3Nob3cocGFyYW0sIHBlcm0pCQkJCVwKIHN0YXRpYyBJU0NTSV9DTEFTU19BVFRSKHNlc3MsIGZpZWxkLCBTX0lSVUdPLCBzaG93X3Nlc3Npb25fcGFyYW1fIyNwYXJhbSwgXAogCQkJTlVMTCk7Ci0KIGlzY3NpX3Nlc3Npb25fYXR0cih0YXJnZXRuYW1lLCBJU0NTSV9QQVJBTV9UQVJHRVRfTkFNRSwgMCk7CiBpc2NzaV9zZXNzaW9uX2F0dHIoaW5pdGlhbF9yMnQsIElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOLCAwKTsKIGlzY3NpX3Nlc3Npb25fYXR0cihtYXhfb3V0c3RhbmRpbmdfcjJ0LCBJU0NTSV9QQVJBTV9NQVhfUjJULCAwKTsKQEAgLTE5MjIsNiArMjM0MywxMDAgQEAKIAkJCXN0b3JlX3ByaXZfc2Vzc2lvbl8jI2ZpZWxkKQogaXNjc2lfcHJpdl9zZXNzaW9uX3J3X2F0dHIocmVjb3ZlcnlfdG1vLCAiJWQiKTsKIAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlzY3NpX3Nlc3Npb25fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfc2Vzc19pbml0aWFsX3IydC5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX21heF9vdXRzdGFuZGluZ19yMnQuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19pbW1lZGlhdGVfZGF0YS5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2ZpcnN0X2J1cnN0X2xlbi5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX21heF9idXJzdF9sZW4uYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19kYXRhX3BkdV9pbl9vcmRlci5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2RhdGFfc2VxX2luX29yZGVyLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfZXJsLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfdGFyZ2V0bmFtZS5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3RwZ3QuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19wYXNzd29yZC5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3Bhc3N3b3JkX2luLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfdXNlcm5hbWUuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc191c2VybmFtZV9pbi5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX2Zhc3RfYWJvcnQuYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19hYm9ydF90bW8uYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc19sdV9yZXNldF90bW8uYXR0ciwKKwkmZGV2X2F0dHJfc2Vzc190Z3RfcmVzZXRfdG1vLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfaWZhY2VuYW1lLmF0dHIsCisJJmRldl9hdHRyX3Nlc3NfaW5pdGlhdG9ybmFtZS5hdHRyLAorCSZkZXZfYXR0cl9zZXNzX3RhcmdldGFsaWFzLmF0dHIsCisJJmRldl9hdHRyX3ByaXZfc2Vzc19yZWNvdmVyeV90bW8uYXR0ciwKKwkmZGV2X2F0dHJfcHJpdl9zZXNzX3N0YXRlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBtb2RlX3QgaXNjc2lfc2Vzc2lvbl9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpjZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9IHRyYW5zcG9ydF9jbGFzc190b19zZXNzaW9uKGNkZXYpOworCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnQgPSBzZXNzaW9uLT50cmFuc3BvcnQ7CisJaW50IHBhcmFtOworCisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfaW5pdGlhbF9yMnQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9JTklUSUFMX1IyVF9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX21heF9vdXRzdGFuZGluZ19yMnQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9NQVhfUjJUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfaW1tZWRpYXRlX2RhdGEuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9JTU1fREFUQV9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2ZpcnN0X2J1cnN0X2xlbi5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0ZJUlNUX0JVUlNUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfbWF4X2J1cnN0X2xlbi5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX01BWF9CVVJTVDsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2RhdGFfcGR1X2luX29yZGVyLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fUERVX0lOT1JERVJfRU47CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19kYXRhX3NlcV9pbl9vcmRlci5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0RBVEFTRVFfSU5PUkRFUl9FTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2VybC5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0VSTDsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX3RhcmdldG5hbWUuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9UQVJHRVRfTkFNRTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX3RwZ3QuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9UUEdUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfcGFzc3dvcmQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9VU0VSTkFNRTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX3Bhc3N3b3JkX2luLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU47CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc191c2VybmFtZS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1BBU1NXT1JEOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfdXNlcm5hbWVfaW4uYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTjsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9zZXNzX2Zhc3RfYWJvcnQuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9GQVNUX0FCT1JUOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfYWJvcnRfdG1vLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fQUJPUlRfVE1POworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfbHVfcmVzZXRfdG1vLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1POworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfdGd0X3Jlc2V0X3Rtby5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX1RHVF9SRVNFVF9UTU87CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfc2Vzc19pZmFjZW5hbWUuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfaW5pdGlhdG9ybmFtZS5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX3Nlc3NfdGFyZ2V0YWxpYXMuYXR0cikKKwkJcGFyYW0gPSBJU0NTSV9QQVJBTV9UQVJHRVRfQUxJQVM7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcHJpdl9zZXNzX3JlY292ZXJ5X3Rtby5hdHRyKQorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfcHJpdl9zZXNzX3N0YXRlLmF0dHIpCisJCXJldHVybiBTX0lSVUdPOworCWVsc2UgeworCQlXQVJOX09OQ0UoMSwgIkludmFsaWQgc2Vzc2lvbiBhdHRyIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiB0LT5hdHRyX2lzX3Zpc2libGUoSVNDU0lfUEFSQU0sIHBhcmFtKTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXNjc2lfc2Vzc2lvbl9ncm91cCA9IHsKKwkuYXR0cnMgPSBpc2NzaV9zZXNzaW9uX2F0dHJzLAorCS5pc192aXNpYmxlID0gaXNjc2lfc2Vzc2lvbl9hdHRyX2lzX3Zpc2libGUsCit9OworCiAvKgogICogaVNDU0kgaG9zdCBhdHRycwogICovCkBAIC0xOTQ1LDQxICsyNDYwLDQyIEBACiBpc2NzaV9ob3N0X2F0dHIoaXBhZGRyZXNzLCBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUyk7CiBpc2NzaV9ob3N0X2F0dHIoaW5pdGlhdG9ybmFtZSwgSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRSk7CiAKLSNkZWZpbmUgU0VUVVBfUFJJVl9TRVNTSU9OX1JEX0FUVFIoZmllbGQpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcHJpdi0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSAmZGV2X2F0dHJfcHJpdl9zZXNzXyMjZmllbGQ7IFwKLQljb3VudCsrOwkJCQkJCQlcCi19IHdoaWxlICgwKQorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlzY3NpX2hvc3RfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaG9zdF9uZXRkZXYuYXR0ciwKKwkmZGV2X2F0dHJfaG9zdF9od2FkZHJlc3MuYXR0ciwKKwkmZGV2X2F0dHJfaG9zdF9pcGFkZHJlc3MuYXR0ciwKKwkmZGV2X2F0dHJfaG9zdF9pbml0aWF0b3JuYW1lLmF0dHIsCisJTlVMTCwKK307CiAKLSNkZWZpbmUgU0VUVVBfUFJJVl9TRVNTSU9OX1JXX0FUVFIoZmllbGQpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcHJpdi0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSAmZGV2X2F0dHJfcHJpdl9zZXNzXyMjZmllbGQ7CVwKLQljb3VudCsrOwkJCQkJCQlcCi19IHdoaWxlICgwKQorc3RhdGljIG1vZGVfdCBpc2NzaV9ob3N0X2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpKQoreworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGlzY3NpX2ludGVybmFsICpwcml2ID0gdG9faXNjc2lfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOworCWludCBwYXJhbTsKIAotI2RlZmluZSBTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZmllbGQsIHBhcmFtX2ZsYWcpCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAodHQtPnBhcmFtX21hc2sgJiBwYXJhbV9mbGFnKSB7CQkJCVwKLQkJcHJpdi0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSAmZGV2X2F0dHJfc2Vzc18jI2ZpZWxkOyBcCi0JCWNvdW50Kys7CQkJCQkJXAotCX0JCQkJCQkJCVwKLX0gd2hpbGUgKDApCisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2hvc3RfbmV0ZGV2LmF0dHIpCisJCXBhcmFtID0gSVNDU0lfSE9TVF9QQVJBTV9ORVRERVZfTkFNRTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXR0cl9ob3N0X2h3YWRkcmVzcy5hdHRyKQorCQlwYXJhbSA9IElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9hdHRyX2hvc3RfaXBhZGRyZXNzLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfSE9TVF9QQVJBTV9JUEFERFJFU1M7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F0dHJfaG9zdF9pbml0aWF0b3JuYW1lLmF0dHIpCisJCXBhcmFtID0gSVNDU0lfSE9TVF9QQVJBTV9JTklUSUFUT1JfTkFNRTsKKwllbHNlIHsKKwkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIGhvc3QgYXR0ciIpOworCQlyZXR1cm4gMDsKKwl9CiAKLSNkZWZpbmUgU0VUVVBfQ09OTl9SRF9BVFRSKGZpZWxkLCBwYXJhbV9mbGFnKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmICh0dC0+cGFyYW1fbWFzayAmIHBhcmFtX2ZsYWcpIHsJCQkJXAotCQlwcml2LT5jb25uX2F0dHJzW2NvdW50XSA9ICZkZXZfYXR0cl9jb25uXyMjZmllbGQ7IFwKLQkJY291bnQrKzsJCQkJCQlcCi0JfQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKKwlyZXR1cm4gcHJpdi0+aXNjc2lfdHJhbnNwb3J0LT5hdHRyX2lzX3Zpc2libGUoSVNDU0lfSE9TVF9QQVJBTSwgcGFyYW0pOworfQogCi0jZGVmaW5lIFNFVFVQX0hPU1RfUkRfQVRUUihmaWVsZCwgcGFyYW1fZmxhZykJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAodHQtPmhvc3RfcGFyYW1fbWFzayAmIHBhcmFtX2ZsYWcpIHsJCQkJXAotCQlwcml2LT5ob3N0X2F0dHJzW2NvdW50XSA9ICZkZXZfYXR0cl9ob3N0XyMjZmllbGQ7IFwKLQkJY291bnQrKzsJCQkJCQlcCi0JfQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlzY3NpX2hvc3RfZ3JvdXAgPSB7CisJLmF0dHJzID0gaXNjc2lfaG9zdF9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGlzY3NpX2hvc3RfYXR0cl9pc192aXNpYmxlLAorfTsKIAogc3RhdGljIGludCBpc2NzaV9zZXNzaW9uX21hdGNoKHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyICpjb250LAogCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjA1MSw3ICsyNTY3LDcgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgY291bnQgPSAwLCBlcnI7CisJaW50IGVycjsKIAogCUJVR19PTighdHQpOwogCkBAIC0yMDc4LDc3ICsyNTk0LDI0IEBACiAJCWdvdG8gdW5yZWdpc3Rlcl9kZXY7CiAKIAkvKiBob3N0IHBhcmFtZXRlcnMgKi8KLQlwcml2LT50Lmhvc3RfYXR0cnMuYWMuYXR0cnMgPSAmcHJpdi0+aG9zdF9hdHRyc1swXTsKIAlwcml2LT50Lmhvc3RfYXR0cnMuYWMuY2xhc3MgPSAmaXNjc2lfaG9zdF9jbGFzcy5jbGFzczsKIAlwcml2LT50Lmhvc3RfYXR0cnMuYWMubWF0Y2ggPSBpc2NzaV9ob3N0X21hdGNoOworCXByaXYtPnQuaG9zdF9hdHRycy5hYy5ncnAgPSAmaXNjc2lfaG9zdF9ncm91cDsKIAlwcml2LT50Lmhvc3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNjc2lfY2xzX2hvc3QpOwogCXRyYW5zcG9ydF9jb250YWluZXJfcmVnaXN0ZXIoJnByaXYtPnQuaG9zdF9hdHRycyk7CiAKLQlTRVRVUF9IT1NUX1JEX0FUVFIobmV0ZGV2LCBJU0NTSV9IT1NUX05FVERFVl9OQU1FKTsKLQlTRVRVUF9IT1NUX1JEX0FUVFIoaXBhZGRyZXNzLCBJU0NTSV9IT1NUX0lQQUREUkVTUyk7Ci0JU0VUVVBfSE9TVF9SRF9BVFRSKGh3YWRkcmVzcywgSVNDU0lfSE9TVF9IV0FERFJFU1MpOwotCVNFVFVQX0hPU1RfUkRfQVRUUihpbml0aWF0b3JuYW1lLCBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FKTsKLQlCVUdfT04oY291bnQgPiBJU0NTSV9IT1NUX0FUVFJTKTsKLQlwcml2LT5ob3N0X2F0dHJzW2NvdW50XSA9IE5VTEw7Ci0JY291bnQgPSAwOwotCiAJLyogY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCi0JcHJpdi0+Y29ubl9jb250LmFjLmF0dHJzID0gJnByaXYtPmNvbm5fYXR0cnNbMF07CiAJcHJpdi0+Y29ubl9jb250LmFjLmNsYXNzID0gJmlzY3NpX2Nvbm5lY3Rpb25fY2xhc3MuY2xhc3M7CiAJcHJpdi0+Y29ubl9jb250LmFjLm1hdGNoID0gaXNjc2lfY29ubl9tYXRjaDsKKwlwcml2LT5jb25uX2NvbnQuYWMuZ3JwID0gJmlzY3NpX2Nvbm5fZ3JvdXA7CiAJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmcHJpdi0+Y29ubl9jb250KTsKIAotCVNFVFVQX0NPTk5fUkRfQVRUUihtYXhfcmVjdl9kbGVuZ3RoLCBJU0NTSV9NQVhfUkVDVl9ETEVOR1RIKTsKLQlTRVRVUF9DT05OX1JEX0FUVFIobWF4X3htaXRfZGxlbmd0aCwgSVNDU0lfTUFYX1hNSVRfRExFTkdUSCk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKGhlYWRlcl9kaWdlc3QsIElTQ1NJX0hEUkRHU1RfRU4pOwotCVNFVFVQX0NPTk5fUkRfQVRUUihkYXRhX2RpZ2VzdCwgSVNDU0lfREFUQURHU1RfRU4pOwotCVNFVFVQX0NPTk5fUkRfQVRUUihpZm1hcmtlciwgSVNDU0lfSUZNQVJLRVJfRU4pOwotCVNFVFVQX0NPTk5fUkRfQVRUUihvZm1hcmtlciwgSVNDU0lfT0ZNQVJLRVJfRU4pOwotCVNFVFVQX0NPTk5fUkRfQVRUUihhZGRyZXNzLCBJU0NTSV9DT05OX0FERFJFU1MpOwotCVNFVFVQX0NPTk5fUkRfQVRUUihwb3J0LCBJU0NTSV9DT05OX1BPUlQpOwotCVNFVFVQX0NPTk5fUkRfQVRUUihleHBfc3RhdHNuLCBJU0NTSV9FWFBfU1RBVFNOKTsKLQlTRVRVUF9DT05OX1JEX0FUVFIocGVyc2lzdGVudF9hZGRyZXNzLCBJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MpOwotCVNFVFVQX0NPTk5fUkRfQVRUUihwZXJzaXN0ZW50X3BvcnQsIElTQ1NJX1BFUlNJU1RFTlRfUE9SVCk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKHBpbmdfdG1vLCBJU0NTSV9QSU5HX1RNTyk7Ci0JU0VUVVBfQ09OTl9SRF9BVFRSKHJlY3ZfdG1vLCBJU0NTSV9SRUNWX1RNTyk7Ci0KLQlCVUdfT04oY291bnQgPiBJU0NTSV9DT05OX0FUVFJTKTsKLQlwcml2LT5jb25uX2F0dHJzW2NvdW50XSA9IE5VTEw7Ci0JY291bnQgPSAwOwotCiAJLyogc2Vzc2lvbiBwYXJhbWV0ZXJzICovCi0JcHJpdi0+c2Vzc2lvbl9jb250LmFjLmF0dHJzID0gJnByaXYtPnNlc3Npb25fYXR0cnNbMF07CiAJcHJpdi0+c2Vzc2lvbl9jb250LmFjLmNsYXNzID0gJmlzY3NpX3Nlc3Npb25fY2xhc3MuY2xhc3M7CiAJcHJpdi0+c2Vzc2lvbl9jb250LmFjLm1hdGNoID0gaXNjc2lfc2Vzc2lvbl9tYXRjaDsKKwlwcml2LT5zZXNzaW9uX2NvbnQuYWMuZ3JwID0gJmlzY3NpX3Nlc3Npb25fZ3JvdXA7CiAJdHJhbnNwb3J0X2NvbnRhaW5lcl9yZWdpc3RlcigmcHJpdi0+c2Vzc2lvbl9jb250KTsKIAotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpbml0aWFsX3IydCwgSVNDU0lfSU5JVElBTF9SMlRfRU4pOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihtYXhfb3V0c3RhbmRpbmdfcjJ0LCBJU0NTSV9NQVhfUjJUKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoaW1tZWRpYXRlX2RhdGEsIElTQ1NJX0lNTV9EQVRBX0VOKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoZmlyc3RfYnVyc3RfbGVuLCBJU0NTSV9GSVJTVF9CVVJTVCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKG1heF9idXJzdF9sZW4sIElTQ1NJX01BWF9CVVJTVCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGRhdGFfcGR1X2luX29yZGVyLCBJU0NTSV9QRFVfSU5PUkRFUl9FTik7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGRhdGFfc2VxX2luX29yZGVyLCBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4pOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihlcmwsIElTQ1NJX0VSTCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRhcmdldG5hbWUsIElTQ1NJX1RBUkdFVF9OQU1FKTsKLQlTRVRVUF9TRVNTSU9OX1JEX0FUVFIodHBndCwgSVNDU0lfVFBHVCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHBhc3N3b3JkLCBJU0NTSV9VU0VSTkFNRSk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHBhc3N3b3JkX2luLCBJU0NTSV9VU0VSTkFNRV9JTik7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHVzZXJuYW1lLCBJU0NTSV9QQVNTV09SRCk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHVzZXJuYW1lX2luLCBJU0NTSV9QQVNTV09SRF9JTik7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGZhc3RfYWJvcnQsIElTQ1NJX0ZBU1RfQUJPUlQpOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihhYm9ydF90bW8sIElTQ1NJX0FCT1JUX1RNTyk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKGx1X3Jlc2V0X3RtbyxJU0NTSV9MVV9SRVNFVF9UTU8pOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUih0Z3RfcmVzZXRfdG1vLElTQ1NJX1RHVF9SRVNFVF9UTU8pOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpZmFjZW5hbWUsIElTQ1NJX0lGQUNFX05BTUUpOwotCVNFVFVQX1NFU1NJT05fUkRfQVRUUihpbml0aWF0b3JuYW1lLCBJU0NTSV9JTklUSUFUT1JfTkFNRSk7Ci0JU0VUVVBfU0VTU0lPTl9SRF9BVFRSKHRhcmdldGFsaWFzLCBJU0NTSV9UQVJHRVRfQUxJQVMpOwotCVNFVFVQX1BSSVZfU0VTU0lPTl9SV19BVFRSKHJlY292ZXJ5X3Rtbyk7Ci0JU0VUVVBfUFJJVl9TRVNTSU9OX1JEX0FUVFIoc3RhdGUpOwotCi0JQlVHX09OKGNvdW50ID4gSVNDU0lfU0VTU0lPTl9BVFRSUyk7Ci0JcHJpdi0+c2Vzc2lvbl9hdHRyc1tjb3VudF0gPSBOVUxMOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlzY3NpX3RyYW5zcG9ydF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGQoJnByaXYtPmxpc3QsICZpc2NzaV90cmFuc3BvcnRzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2NzaV90cmFuc3BvcnRfbG9jaywgZmxhZ3MpOwpAQCAtMjIxMCwxMCArMjY3MywxNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gdW5yZWdpc3Rlcl90cmFuc3BvcnRfY2xhc3M7CiAKLQllcnIgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJmlzY3NpX2hvc3RfY2xhc3MpOworCWVyciA9IGNsYXNzX3JlZ2lzdGVyKCZpc2NzaV9pZmFjZV9jbGFzcyk7CiAJaWYgKGVycikKIAkJZ290byB1bnJlZ2lzdGVyX2VuZHBvaW50X2NsYXNzOwogCisJZXJyID0gdHJhbnNwb3J0X2NsYXNzX3JlZ2lzdGVyKCZpc2NzaV9ob3N0X2NsYXNzKTsKKwlpZiAoZXJyKQorCQlnb3RvIHVucmVnaXN0ZXJfaWZhY2VfY2xhc3M7CisKIAllcnIgPSB0cmFuc3BvcnRfY2xhc3NfcmVnaXN0ZXIoJmlzY3NpX2Nvbm5lY3Rpb25fY2xhc3MpOwogCWlmIChlcnIpCiAJCWdvdG8gdW5yZWdpc3Rlcl9ob3N0X2NsYXNzOwpAQCAtMjI0Myw2ICsyNzEwLDggQEAKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfY29ubmVjdGlvbl9jbGFzcyk7CiB1bnJlZ2lzdGVyX2hvc3RfY2xhc3M6CiAJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2hvc3RfY2xhc3MpOwordW5yZWdpc3Rlcl9pZmFjZV9jbGFzczoKKwljbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9pZmFjZV9jbGFzcyk7CiB1bnJlZ2lzdGVyX2VuZHBvaW50X2NsYXNzOgogCWNsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2VuZHBvaW50X2NsYXNzKTsKIHVucmVnaXN0ZXJfdHJhbnNwb3J0X2NsYXNzOgpAQCAtMjI1OCw2ICsyNzI3LDcgQEAKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfc2Vzc2lvbl9jbGFzcyk7CiAJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2hvc3RfY2xhc3MpOwogCWNsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2VuZHBvaW50X2NsYXNzKTsKKwljbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9pZmFjZV9jbGFzcyk7CiAJY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfdHJhbnNwb3J0X2NsYXNzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCmluZGV4IGM2ZmNmNzYuLjlkOTMzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKQEAgLTE1NDUsOCArMTU0NSwxNCBAQAogCiAJaWYgKGlkZW50aWZ5LT5kZXZpY2VfdHlwZSA9PSBTQVNfRU5EX0RFVklDRSAmJgogCSAgICBycGh5LT5zY3NpX3RhcmdldF9pZCAhPSAtMSkgewotCQlzY3NpX3NjYW5fdGFyZ2V0KCZycGh5LT5kZXYsIDAsCi0JCQkJcnBoeS0+c2NzaV90YXJnZXRfaWQsIFNDQU5fV0lMRF9DQVJELCAwKTsKKwkJaW50IGx1bjsKKworCQlpZiAoaWRlbnRpZnktPnRhcmdldF9wb3J0X3Byb3RvY29scyAmIFNBU19QUk9UT0NPTF9TU1ApCisJCQlsdW4gPSBTQ0FOX1dJTERfQ0FSRDsKKwkJZWxzZQorCQkJbHVuID0gMDsKKworCQlzY3NpX3NjYW5fdGFyZ2V0KCZycGh5LT5kZXYsIDAsIHJwaHktPnNjc2lfdGFyZ2V0X2lkLCBsdW4sIDApOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA5NTM3NzNjLi5mYTNhNTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtMTA2NiwxMiArMTA2NiwxMyBAQAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gc2NzaV9kaXNrKGRpc2spLT5kZXZpY2U7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IHNjc2lfZGlzayhkaXNrKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHNka3AtPmRldmljZTsKIAl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyb3I7CiAgICAgCi0JU0NTSV9MT0dfSU9DVEwoMSwgcHJpbnRrKCJzZF9pb2N0bDogZGlzaz0lcywgY21kPTB4JXhcbiIsCi0JCQkJCQlkaXNrLT5kaXNrX25hbWUsIGNtZCkpOworCVNDU0lfTE9HX0lPQ1RMKDEsIHNkX3ByaW50ayhLRVJOX0lORk8sIHNka3AsICJzZF9pb2N0bDogZGlzaz0lcywgIgorCQkJCSAgICAiY21kPTB4JXhcbiIsIGRpc2stPmRpc2tfbmFtZSwgY21kKSk7CiAKIAkvKgogCSAqIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGVycm9yIHJlY292ZXJ5LCBkb24ndCBsZXQgYW55b25lCkBAIC0yNTg5LDE4ICsyNTkwLDE2IEBACiAJCXNwaW5fdW5sb2NrKCZzZF9pbmRleF9sb2NrKTsKIAl9IHdoaWxlIChlcnJvciA9PSAtRUFHQUlOKTsKIAotCWlmIChlcnJvcikKKwlpZiAoZXJyb3IpIHsKKwkJc2Rldl9wcmludGsoS0VSTl9XQVJOSU5HLCBzZHAsICJzZF9wcm9iZTogbWVtb3J5IGV4aGF1c3RlZC5cbiIpOwogCQlnb3RvIG91dF9wdXQ7Ci0KLQlpZiAoaW5kZXggPj0gU0RfTUFYX0RJU0tTKSB7Ci0JCWVycm9yID0gLUVOT0RFVjsKLQkJc2Rldl9wcmludGsoS0VSTl9XQVJOSU5HLCBzZHAsICJTQ1NJIGRpc2sgKHNkKSBuYW1lIHNwYWNlIGV4aGF1c3RlZC5cbiIpOwotCQlnb3RvIG91dF9mcmVlX2luZGV4OwogCX0KIAogCWVycm9yID0gc2RfZm9ybWF0X2Rpc2tfbmFtZSgic2QiLCBpbmRleCwgZ2QtPmRpc2tfbmFtZSwgRElTS19OQU1FX0xFTik7Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkcCwgIlNDU0kgZGlzayAoc2QpIG5hbWUgbGVuZ3RoIGV4Y2VlZGVkLlxuIik7CiAJCWdvdG8gb3V0X2ZyZWVfaW5kZXg7CisJfQogCiAJc2RrcC0+ZGV2aWNlID0gc2RwOwogCXNka3AtPmRyaXZlciA9ICZzZF90ZW1wbGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5oIGIvZHJpdmVycy9zY3NpL3NkLmgKaW5kZXggNmFkNzk4Yi4uNDE2M2YyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmgKKysrIGIvZHJpdmVycy9zY3NpL3NkLmgKQEAgLTksMTIgKzksNiBAQAogI2RlZmluZSBTRF9NQUpPUlMJMTYKIAogLyoKLSAqIFRoaXMgaXMgbGltaXRlZCBieSB0aGUgbmFtaW5nIHNjaGVtZSBlbmZvcmNlZCBpbiBzZF9wcm9iZSwKLSAqIGFkZCBhbm90aGVyIGNoYXJhY3RlciB0byBpdCBpZiB5b3UgcmVhbGx5IG5lZWQgbW9yZSBkaXNrcy4KLSAqLwotI2RlZmluZSBTRF9NQVhfRElTS1MJKCgoMjYgKiAyNikgKyAyNiArIDEpICogMjYpCi0KLS8qCiAgKiBUaW1lIG91dCBpbiBzZWNvbmRzIGZvciBkaXNrcyBhbmQgTWFnbmV0by1vcHRpY2FscyAod2hpY2ggYXJlIHNsb3dlcikuCiAgKi8KICNkZWZpbmUgU0RfVElNRU9VVAkJKDMwICogSFopCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCmluZGV4IDhiZTMwNTUuLmEzOTExYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDE4NzFiOGEuLjliMjhmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC00NjIsMTQgKzQ2MiwxNiBAQAogewogCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudCA9IHJlcS0+ZW5kX2lvX2RhdGE7CiAJc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gU1JwbnQtPnN0cDsKKwlzdHJ1Y3QgYmlvICp0bXA7CiAKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBTUnBudC0+cmVzdWx0ID0gcmVxLT5lcnJvcnM7CiAJU1RwLT5idWZmZXItPmNtZHN0YXQucmVzaWR1YWwgPSByZXEtPnJlc2lkX2xlbjsKIAorCXRtcCA9IFNScG50LT5iaW87CiAJaWYgKFNScG50LT53YWl0aW5nKQogCQljb21wbGV0ZShTUnBudC0+d2FpdGluZyk7CiAKLQlibGtfcnFfdW5tYXBfdXNlcihTUnBudC0+YmlvKTsKKwlibGtfcnFfdW5tYXBfdXNlcih0bXApOwogCV9fYmxrX3B1dF9yZXF1ZXN0KHJlcS0+cSwgcmVxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZmkvc2ZpX2NvcmUuaCBiL2RyaXZlcnMvc2ZpL3NmaV9jb3JlLmgKaW5kZXggYjdjZjIyMC4uMWQ1Y2ZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZmkvc2ZpX2NvcmUuaAorKysgYi9kcml2ZXJzL3NmaS9zZmlfY29yZS5oCkBAIC01NSw2ICs1NSw5IEBACiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCiBzdHJ1Y3Qgc2ZpX3RhYmxlX2tleXsKIAljaGFyCSpzaWc7CiAJY2hhcgkqb2VtX2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9NYWtlZmlsZSBiL2RyaXZlcnMvc2gvTWFrZWZpbGUKaW5kZXggMjRlNmNlYy4uNjdlMjcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NoL01ha2VmaWxlCkBAIC03LDMgKzcsMTEgQEAKIG9iai0kKENPTkZJR19NQVBMRSkJCSs9IG1hcGxlLwogb2JqLSQoQ09ORklHX1NVUEVSSFlXQVkpCSs9IHN1cGVyaHl3YXkvCiBvYmotJChDT05GSUdfR0VORVJJQ19HUElPKQkrPSBwZmMubworCisjCisjIEZvciB0aGUgbW9tZW50IHdlIG9ubHkgdXNlIHRoaXMgZnJhbWV3b3JrIGZvciBBUk0tYmFzZWQgU0gvUi1Nb2JpbGUKKyMgcGxhdGZvcm1zIGFuZCBnZW5lcmljIFNILiBTSC1iYXNlZCBTSC1Nb2JpbGUgcGxhdGZvcm1zIGFyZSBzdGlsbCB1c2luZworIyBhbiBvbGRlciBmcmFtZXdvcmsgdGhhdCBpcyBwZW5kaW5nIHVwLXBvcnRpbmcsIGF0IHdoaWNoIHBvaW50IHRoaXMKKyMgc3BlY2lhbCBjYXNpbmcgY2FuIGdvIGF3YXkuCisjCitvYmotJChDT05GSUdfU1VQRVJIKSQoQ09ORklHX0FSQ0hfU0hNT0JJTEUpCSs9IHBtX3J1bnRpbWUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9jbGsvY29yZS5jIGIvZHJpdmVycy9zaC9jbGsvY29yZS5jCmluZGV4IGRjOGQwMjIuLmRiMjU3YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvY2xrL2NvcmUuYworKysgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zaF9jbGsuaD4KQEAgLTE3Myw2ICsxNzIsMjYgQEAKIAlyZXR1cm4gY2xrX3JhdGVfcm91bmRfaGVscGVyKCZkaXZfcmFuZ2Vfcm91bmQpOwogfQogCitzdGF0aWMgbG9uZyBjbGtfcmF0ZV9tdWx0X3JhbmdlX2l0ZXIodW5zaWduZWQgaW50IHBvcywKKwkJCQkgICAgICBzdHJ1Y3QgY2xrX3JhdGVfcm91bmRfZGF0YSAqcm91bmRlcikKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKHJvdW5kZXItPmFyZykgKiBwb3M7Cit9CisKK2xvbmcgY2xrX3JhdGVfbXVsdF9yYW5nZV9yb3VuZChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGludCBtdWx0X21pbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbXVsdF9tYXgsIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlzdHJ1Y3QgY2xrX3JhdGVfcm91bmRfZGF0YSBtdWx0X3JhbmdlX3JvdW5kID0geworCQkubWluCT0gbXVsdF9taW4sCisJCS5tYXgJPSBtdWx0X21heCwKKwkJLmZ1bmMJPSBjbGtfcmF0ZV9tdWx0X3JhbmdlX2l0ZXIsCisJCS5hcmcJPSBjbGtfZ2V0X3BhcmVudChjbGspLAorCQkucmF0ZQk9IHJhdGUsCisJfTsKKworCXJldHVybiBjbGtfcmF0ZV9yb3VuZF9oZWxwZXIoJm11bHRfcmFuZ2Vfcm91bmQpOworfQorCiBpbnQgY2xrX3JhdGVfdGFibGVfZmluZChzdHJ1Y3QgY2xrICpjbGssCiAJCQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGUsCiAJCQl1bnNpZ25lZCBsb25nIHJhdGUpCkBAIC0yMDUsOSArMjI0LDYgQEAKIAkJbGlzdF9hZGQoJmNoaWxkLT5zaWJsaW5nLCAmcGFyZW50LT5jaGlsZHJlbik7CiAJY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKIAotCS8qIG5vdyBkbyB0aGUgZGVidWdmcyByZW5hbWluZyB0byByZWF0dGFjaCB0aGUgY2hpbGQKLQkgICB0byB0aGUgcHJvcGVyIHBhcmVudCAqLwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY2NSw4OSArNjgxLDYgQEAKIHN1YnN5c19pbml0Y2FsbChjbGtfc3lzY29yZV9pbml0KTsKICNlbmRpZgogCi0vKgotICoJZGVidWdmcyBzdXBwb3J0IHRvIHRyYWNlIGNsb2NrIHRyZWUgaGllcmFyY2h5IGFuZCBhdHRyaWJ1dGVzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjbGtfZGVidWdmc19yb290OwotCi1zdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGRlbnRyeSAqZDsKLQlzdHJ1Y3QgY2xrICpwYSA9IGMtPnBhcmVudDsKLQljaGFyIHNbMjU1XTsKLQljaGFyICpwID0gczsKLQotCXAgKz0gc3ByaW50ZihwLCAiJXAiLCBjKTsKLQlkID0gZGVidWdmc19jcmVhdGVfZGlyKHMsIHBhID8gcGEtPmRlbnRyeSA6IGNsa19kZWJ1Z2ZzX3Jvb3QpOwotCWlmICghZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYy0+ZGVudHJ5ID0gZDsKLQotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgidXNlY291bnQiLCBTX0lSVUdPLCBjLT5kZW50cnksICh1OCAqKSZjLT51c2Vjb3VudCk7Ci0JaWYgKCFkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JZCA9IGRlYnVnZnNfY3JlYXRlX3UzMigicmF0ZSIsIFNfSVJVR08sIGMtPmRlbnRyeSwgKHUzMiAqKSZjLT5yYXRlKTsKLQlpZiAoIWQpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlkID0gZGVidWdmc19jcmVhdGVfeDMyKCJmbGFncyIsIFNfSVJVR08sIGMtPmRlbnRyeSwgKHUzMiAqKSZjLT5mbGFncyk7Ci0JaWYgKCFkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGMtPmRlbnRyeSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBjbGtfZGVidWdmc19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGNsayAqcGEgPSBjLT5wYXJlbnQ7Ci0KLQlpZiAocGEgJiYgIXBhLT5kZW50cnkpIHsKLQkJZXJyID0gY2xrX2RlYnVnZnNfcmVnaXN0ZXIocGEpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoIWMtPmRlbnRyeSkgewotCQllcnIgPSBjbGtfZGVidWdmc19yZWdpc3Rlcl9vbmUoYyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY2xrX2RlYnVnZnNfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmM7Ci0Jc3RydWN0IGRlbnRyeSAqZDsKLQlpbnQgZXJyOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2xvY2siLCBOVUxMKTsKLQlpZiAoIWQpCi0JCXJldHVybiAtRU5PTUVNOwotCWNsa19kZWJ1Z2ZzX3Jvb3QgPSBkOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY2xvY2tfbGlzdCwgbm9kZSkgewotCQllcnIgPSBjbGtfZGVidWdmc19yZWdpc3RlcihjKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQl9Ci0JcmV0dXJuIDA7Ci1lcnJfb3V0OgotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjbGtfZGVidWdmc19yb290KTsKLQlyZXR1cm4gZXJyOwotfQotbGF0ZV9pbml0Y2FsbChjbGtfZGVidWdmc19pbml0KTsKLQogc3RhdGljIGludCBfX2luaXQgY2xrX2xhdGVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2ludGMvY2hpcC5jIGIvZHJpdmVycy9zaC9pbnRjL2NoaXAuYwppbmRleCAzM2IyZWQ0Li43YjI0NmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2ludGMvY2hpcC5jCisrKyBiL2RyaXZlcnMvc2gvaW50Yy9jaGlwLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCiAJW0lSUV9UWVBFX0xFVkVMX0hJR0hdID0gVkFMSUQoMyksCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3MikKKyNpZiBkZWZpbmVkKENPTkZJR19BUk0pIC8qIGFsbCByZWNlbnQgU0gtTW9iaWxlIC8gUi1Nb2JpbGUgQVJNIHN1cHBvcnQgdGhpcyAqLwogCVtJUlFfVFlQRV9FREdFX0JPVEhdID0gVkFMSUQoNCksCiAjZW5kaWYKIH07CkBAIC0yMDIsMTEgKzIwMiwxNiBAQAogCWlmICghdmFsdWUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJdmFsdWUgJj0gflNFTlNFX1ZBTElEX0ZMQUc7CisKIAlpaHAgPSBpbnRjX2ZpbmRfaXJxKGQtPnNlbnNlLCBkLT5ucl9zZW5zZSwgaXJxKTsKIAlpZiAoaWhwKSB7CisJCS8qIFBJTlQgaGFzIDItYml0IHNlbnNlIHJlZ2lzdGVycywgc2hvdWxkIGZhaWwgb24gRURHRV9CT1RIICovCisJCWlmICh2YWx1ZSA+PSAoMSA8PCBfSU5UQ19XSURUSChpaHAtPmhhbmRsZSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJYWRkciA9IElOVENfUkVHKGQsIF9JTlRDX0FERFJfRShpaHAtPmhhbmRsZSksIDApOwotCQlpbnRjX3JlZ19mbnNbX0lOVENfRk4oaWhwLT5oYW5kbGUpXShhZGRyLCBpaHAtPmhhbmRsZSwKLQkJCQkJCSAgICB2YWx1ZSAmIH5TRU5TRV9WQUxJRF9GTEFHKTsKKwkJaW50Y19yZWdfZm5zW19JTlRDX0ZOKGlocC0+aGFuZGxlKV0oYWRkciwgaWhwLT5oYW5kbGUsIHZhbHVlKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvaW50Yy9jb3JlLmMgYi9kcml2ZXJzL3NoL2ludGMvY29yZS5jCmluZGV4IGM2Y2ExMTUuLjhiN2ExNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvaW50Yy9jb3JlLmMKKysrIGIvZHJpdmVycy9zaC9pbnRjL2NvcmUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zaF9pbnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImludGVybmFscy5oIgogCiBMSVNUX0hFQUQoaW50Y19saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvaW50Yy9keW5hbWljLmMgYi9kcml2ZXJzL3NoL2ludGMvZHluYW1pYy5jCmluZGV4IGEzNjc3YzkuLjVmZWExZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvaW50Yy9keW5hbWljLmMKKysrIGIvZHJpdmVycy9zaC9pbnRjL2R5bmFtaWMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiIC8qIG9ubHkgZm9yIGFjdGl2YXRlX2lycSgpIGRhbWFnZS4uICovCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2ludGMvdXNlcmltYXNrLmMgYi9kcml2ZXJzL3NoL2ludGMvdXNlcmltYXNrLmMKaW5kZXggZTMyMzA0Yi4uNTZiZjkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9pbnRjL3VzZXJpbWFzay5jCisrKyBiL2RyaXZlcnMvc2gvaW50Yy91c2VyaW1hc2suYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlICJpbnRlcm5hbHMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9pbnRjL3ZpcnEuYyBiL2RyaXZlcnMvc2gvaW50Yy92aXJxLmMKaW5kZXggMWU2ZTJkMC4uYzdlYzQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9pbnRjL3ZpcnEuYworKysgYi9kcml2ZXJzL3NoL2ludGMvdmlycS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImludGVybmFscy5oIgogCiBzdGF0aWMgc3RydWN0IGludGNfbWFwX2VudHJ5IGludGNfaXJxX3hsYXRlW05SX0lSUVNdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9tYXBsZS9tYXBsZS5jIGIvZHJpdmVycy9zaC9tYXBsZS9tYXBsZS5jCmluZGV4IDFlMjA2MDQuLmJlYzgxYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvbWFwbGUvbWFwbGUuYworKysgYi9kcml2ZXJzL3NoL21hcGxlL21hcGxlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYXBsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvcGZjLmMgYi9kcml2ZXJzL3NoL3BmYy5jCmluZGV4IDc1OTM0ZTMuLmU2N2ZlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvcGZjLmMKKysrIGIvZHJpdmVycy9zaC9wZmMuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkJaWYgKCFyX3dpZHRoKQogCQkJYnJlYWs7Ci0JCWZvciAobiA9IDA7IG4gPCAocl93aWR0aCAvIGZfd2lkdGgpICogMSA8PCBmX3dpZHRoOyBuKyspIHsKKwkJZm9yIChuID0gMDsgbiA8IChyX3dpZHRoIC8gZl93aWR0aCkgKiAoMSA8PCBmX3dpZHRoKTsgbisrKSB7CiAJCQlpZiAoY29uZmlnX3JlZy0+ZW51bV9pZHNbbl0gPT0gZW51bV9pZCkgewogCQkJCSpjcnAgPSBjb25maWdfcmVnOwogCQkJCSppbmRleHAgPSBuOwpAQCAtNTc3LDYgKzU3NywzMiBAQAogCXNoX2dwaW9fc2V0X3ZhbHVlKGNoaXBfdG9fcGlubXV4KGNoaXApLCBvZmZzZXQsIHZhbHVlKTsKIH0KIAorc3RhdGljIGludCBzaF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHBpbm11eF9pbmZvICpncGlvYyA9IGNoaXBfdG9fcGlubXV4KGNoaXApOworCXBpbm11eF9lbnVtX3QgZW51bV9pZDsKKwlwaW5tdXhfZW51bV90ICplbnVtX2lkczsKKwlpbnQgaSwgaywgcG9zOworCisJcG9zID0gMDsKKwllbnVtX2lkID0gMDsKKwl3aGlsZSAoMSkgeworCQlwb3MgPSBnZXRfZ3Bpb19lbnVtX2lkKGdwaW9jLCBvZmZzZXQsIHBvcywgJmVudW1faWQpOworCQlpZiAocG9zIDw9IDAgfHwgIWVudW1faWQpCisJCQlicmVhazsKKworCQlmb3IgKGkgPSAwOyBpIDwgZ3Bpb2MtPmdwaW9faXJxX3NpemU7IGkrKykgeworCQkJZW51bV9pZHMgPSBncGlvYy0+Z3Bpb19pcnFbaV0uZW51bV9pZHM7CisJCQlmb3IgKGsgPSAwOyBlbnVtX2lkc1trXTsgaysrKSB7CisJCQkJaWYgKGVudW1faWRzW2tdID09IGVudW1faWQpCisJCQkJCXJldHVybiBncGlvYy0+Z3Bpb19pcnFbaV0uaXJxOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FTk9TWVM7Cit9CisKIGludCByZWdpc3Rlcl9waW5tdXgoc3RydWN0IHBpbm11eF9pbmZvICpwaXApCiB7CiAJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9ICZwaXAtPmNoaXA7CkBAIC01OTIsNiArNjE4LDcgQEAKIAljaGlwLT5nZXQgPSBzaF9ncGlvX2dldDsKIAljaGlwLT5kaXJlY3Rpb25fb3V0cHV0ID0gc2hfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwogCWNoaXAtPnNldCA9IHNoX2dwaW9fc2V0OworCWNoaXAtPnRvX2lycSA9IHNoX2dwaW9fdG9faXJxOwogCiAJV0FSTl9PTihwaXAtPmZpcnN0X2dwaW8gIT0gMCk7IC8qIG5lZWRzIHRlc3RpbmcgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9wbV9ydW50aW1lLmMgYi9kcml2ZXJzL3NoL3BtX3J1bnRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU5MjgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zaC9wbV9ydW50aW1lLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIFJ1bnRpbWUgUE0gc3VwcG9ydCBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hZ251cyBEYW1tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9kb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisKK3N0YXRpYyBpbnQgZGVmYXVsdF9wbGF0Zm9ybV9ydW50aW1lX2lkbGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIHN1c3BlbmQgc3luY2hyb25vdXNseSB0byBkaXNhYmxlIGNsb2NrcyBpbW1lZGlhdGVseSAqLworCXJldHVybiBwbV9ydW50aW1lX3N1c3BlbmQoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fZG9tYWluIGRlZmF1bHRfcG1fZG9tYWluID0geworCS5vcHMgPSB7CisJCS5ydW50aW1lX3N1c3BlbmQgPSBwbV9jbGtfc3VzcGVuZCwKKwkJLnJ1bnRpbWVfcmVzdW1lID0gcG1fY2xrX3Jlc3VtZSwKKwkJLnJ1bnRpbWVfaWRsZSA9IGRlZmF1bHRfcGxhdGZvcm1fcnVudGltZV9pZGxlLAorCQlVU0VfUExBVEZPUk1fUE1fU0xFRVBfT1BTCisJfSwKK307CisKKyNkZWZpbmUgREVGQVVMVF9QTV9ET01BSU5fUFRSCSgmZGVmYXVsdF9wbV9kb21haW4pCisKKyNlbHNlCisKKyNkZWZpbmUgREVGQVVMVF9QTV9ET01BSU5fUFRSCU5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCisKK3N0YXRpYyBzdHJ1Y3QgcG1fY2xrX25vdGlmaWVyX2Jsb2NrIHBsYXRmb3JtX2J1c19ub3RpZmllciA9IHsKKwkucG1fZG9tYWluID0gREVGQVVMVF9QTV9ET01BSU5fUFRSLAorCS5jb25faWRzID0geyBOVUxMLCB9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfcG1fcnVudGltZV9pbml0KHZvaWQpCit7CisJcG1fY2xrX2FkZF9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZwbGF0Zm9ybV9idXNfbm90aWZpZXIpOworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChzaF9wbV9ydW50aW1lX2luaXQpOworCitzdGF0aWMgaW50IF9faW5pdCBzaF9wbV9ydW50aW1lX2xhdGVfaW5pdCh2b2lkKQoreworCXBtX2dlbnBkX3Bvd2Vyb2ZmX3VudXNlZCgpOworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChzaF9wbV9ydW50aW1lX2xhdGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCA1MmUyOTAwLi5hMWZkNzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTg4LDcgKzg4LDcgQEAKIAogY29uZmlnIFNQSV9BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwL0F1MTJ4MCBTUEkgQ29udHJvbGxlciIKLQlkZXBlbmRzIG9uIChTT0NfQVUxNTUwIHx8IFNPQ19BVTEyMDApICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBTUElfQklUQkFORwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jIGIvZHJpdmVycy9zcGkvc3BpLWFsdGVyYS5jCmluZGV4IDQ4MTNhNjMuLmMwMGQwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hbHRlcmEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYWx0ZXJhLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CkBAIC0zMjAsMTggKzMyMSw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IGFsdGVyYV9zcGlfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFsdGVyYV9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFsdGVyYV9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGFsdGVyYV9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhbHRlcmFfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWx0ZXJhX3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYWx0ZXJhX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWx0ZXJhX3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFsdGVyYSBTUEkgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQ2hvdSA8dGhvbWFzQHd5dHJvbi5jb20udHc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCmluZGV4IDAzMDE5YmYuLjAyNGI0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdGg3OS5jCkBAIC0yNzMsMTggKzI3Myw3IEBACiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwotCi1zdGF0aWMgX19pbml0IGludCBhdGg3OV9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0aDc5X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYXRoNzlfc3BpX2luaXQpOwotCi1zdGF0aWMgX19leGl0IHZvaWQgYXRoNzlfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRoNzlfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhdGg3OV9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGF0aDc5X3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBjb250cm9sbGVyIGRyaXZlciBmb3IgQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCIpOwogTU9EVUxFX0FVVEhPUigiR2Fib3IgSnVob3MgPGp1aG9zZ0BvcGVud3J0Lm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jIGIvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMKaW5kZXggODJkZWU5YS4uMTZkNmE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWF0bWVsLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAKIC8qIFNQSSByZWdpc3RlciBvZmZzZXRzICovCkBAIC05MDcsNyArOTA3LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBfX2luaXQgYXRtZWxfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdG1lbF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSpyZWdzOwogCWludAkJCWlycTsKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgYXRtZWxfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgYXRtZWxfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKQEAgLTEwNzIsMjAgKzEwNzIsMTAgQEAKIAl9LAogCS5zdXNwZW5kCT0gYXRtZWxfc3BpX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBhdG1lbF9zcGlfcmVzdW1lLAorCS5wcm9iZQkJPSBhdG1lbF9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2V4aXRfcChhdG1lbF9zcGlfcmVtb3ZlKSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF0bWVsX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXRtZWxfc3BpX2RyaXZlciwgYXRtZWxfc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KGF0bWVsX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGF0bWVsX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0bWVsX3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYXRtZWxfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhdG1lbF9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBBVDMyL0FUOTEgU1BJIENvbnRyb2xsZXIgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJIYWF2YXJkIFNraW5uZW1vZW4gKEF0bWVsKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jIGIvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jCmluZGV4IGJkZGVlNWY1Li41Nzg0Yzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXUxNTUwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWF1MTU1MC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbi1zcG9ydC5jCmluZGV4IGU1NTdmZjYuLjI0OGEyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluLXNwb3J0LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW4tc3BvcnQuYwpAQCAtOTM4LDE1ICs5MzgsNCBAQAogCS5zdXNwZW5kID0gYmZpbl9zcG9ydF9zcGlfc3VzcGVuZCwKIAkucmVzdW1lICA9IGJmaW5fc3BvcnRfc3BpX3Jlc3VtZSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fc3BvcnRfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZiZmluX3Nwb3J0X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYmZpbl9zcG9ydF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiZmluX3Nwb3J0X3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJmaW5fc3BvcnRfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChiZmluX3Nwb3J0X3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmZpbl9zcG9ydF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCmluZGV4IGI4ZDI1ZjIuLjNiODNmZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYwpAQCAtMTA5OCw3ICsxMDk4LDcgQEAKIAogCWlmIChjaGlwLT5waW9faW50ZXJydXB0ICYmICFkcnZfZGF0YS0+aXJxX3JlcXVlc3RlZCkgewogCQlyZXQgPSByZXF1ZXN0X2lycShkcnZfZGF0YS0+c3BpX2lycSwgYmZpbl9zcGlfcGlvX2lycV9oYW5kbGVyLAotCQkJSVJRRl9ESVNBQkxFRCwgIkJGSU5fU1BJIiwgZHJ2X2RhdGEpOworCQkJMCwgIkJGSU5fU1BJIiwgZHJ2X2RhdGEpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZzcGktPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciBzcGkgSVJRXG4iKTsKIAkJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmcuYwppbmRleCAwMmQ1N2ZiLi5hZWY1OWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaS1idXR0ZXJmbHkuYwppbmRleCA5ZjkwN2VjLi41ZWQwOGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYnV0dGVyZmx5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJ1dHRlcmZseS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWNvbGRmaXJlLXFzcGkuYwppbmRleCBhZTJjZDFjLi42ZWVlNjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktY29sZGZpcmUtcXNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1jb2xkZmlyZS1xc3BpLmMKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCQlnb3RvIGZhaWwyOwogCX0KIAotCXN0YXR1cyA9IHJlcXVlc3RfaXJxKG1jZnFzcGktPmlycSwgbWNmcXNwaV9pcnFfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwlzdGF0dXMgPSByZXF1ZXN0X2lycShtY2Zxc3BpLT5pcnEsIG1jZnFzcGlfaXJxX2hhbmRsZXIsIDAsCiAJCQkgICAgIHBkZXYtPm5hbWUsIG1jZnFzcGkpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKQEAgLTYyMSwyMCArNjIxLDEwIEBACiAJLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCiAJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAogCS5kcml2ZXIucG0JPSBNQ0ZRU1BJX0RFVl9QTV9PUFMsCisJLnByb2JlCQk9IG1jZnFzcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtY2Zxc3BpX3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBtY2Zxc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtY2Zxc3BpX2RyaXZlciwgbWNmcXNwaV9wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChtY2Zxc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbWNmcXNwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1jZnFzcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1jZnFzcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1jZnFzcGlfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiU3RldmVuIEtpbmcgPHNma2luZ0BmZHdkYy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbGRmaXJlIFFTUEkgQ29udHJvbGxlciBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMgYi9kcml2ZXJzL3NwaS9zcGktZGF2aW5jaS5jCmluZGV4IDFmMGVkODAuLjMxYmZiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kYXZpbmNpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWRhdmluY2kuYwpAQCAtNzk5LDcgKzc5OSw3IEBACiAgKiBJdCB3aWxsIGludm9rZSBzcGlfYml0YmFuZ19zdGFydCB0byBjcmVhdGUgd29yayBxdWV1ZSBzbyB0aGF0IGNsaWVudCBkcml2ZXIKICAqIGNhbiByZWdpc3RlciB0cmFuc2ZlciBtZXRob2QgdG8gd29yayBxdWV1ZS4KICAqLwotc3RhdGljIGludCBkYXZpbmNpX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgZGF2aW5jaV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBkYXZpbmNpX3NwaSAqZHNwaTsKQEAgLTk4NCw3ICs5ODQsNyBAQAogICogSXQgd2lsbCBhbHNvIGNhbGwgc3BpX2JpdGJhbmdfc3RvcCB0byBkZXN0cm95IHRoZSB3b3JrIHF1ZXVlIHdoaWNoIHdhcwogICogY3JlYXRlZCBieSBzcGlfYml0YmFuZ19zdGFydC4KICAqLwotc3RhdGljIGludCBfX2V4aXQgZGF2aW5jaV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkYXZpbmNpX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9zcGkgKmRzcGk7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKQEAgLTEwMTEsMjAgKzEwMTEsMTAgQEAKIAkJLm5hbWUgPSAic3BpX2RhdmluY2kiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAotCS5yZW1vdmUgPSBfX2V4aXRfcChkYXZpbmNpX3NwaV9yZW1vdmUpLAorCS5wcm9iZSA9IGRhdmluY2lfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkYXZpbmNpX3NwaV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgZGF2aW5jaV9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmRhdmluY2lfc3BpX2RyaXZlciwgZGF2aW5jaV9zcGlfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoZGF2aW5jaV9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkYXZpbmNpX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRhdmluY2lfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChkYXZpbmNpX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZGF2aW5jaV9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBEYVZpbmNpIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy1taWQuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1taWQuYwppbmRleCAxMzBlNTU1Li5lNzQzYTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHctbWlkLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1pZC5jCkBAIC0xMTYsMTMgKzExNiwxMyBAQAogCS8qIDEuIHNldHVwIERNQSByZWxhdGVkIHJlZ2lzdGVycyAqLwogCWlmIChjc19jaGFuZ2UpIHsKIAkJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7Ci0JCWR3X3dyaXRldyhkd3MsIGRtYXJkbHIsIDB4Zik7Ci0JCWR3X3dyaXRldyhkd3MsIGRtYXRkbHIsIDB4MTApOworCQlkd193cml0ZXcoZHdzLCBEV19TUElfRE1BUkRMUiwgMHhmKTsKKwkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX0RNQVRETFIsIDB4MTApOwogCQlpZiAoZHdzLT50eF9kbWEpCiAJCQlkbWFfY3RybCB8PSAweDI7CiAJCWlmIChkd3MtPnJ4X2RtYSkKIAkJCWRtYV9jdHJsIHw9IDB4MTsKLQkJZHdfd3JpdGV3KGR3cywgZG1hY3IsIGRtYV9jdHJsKTsKKwkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX0RNQUNSLCBkbWFfY3RybCk7CiAJCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOwogCX0KIApAQCAtMjAwLDcgKzIwMCw4IEBACiAKIGludCBkd19zcGlfbWlkX2luaXQoc3RydWN0IGR3X3NwaSAqZHdzKQogewotCXUzMiAqY2xrX3JlZywgY2xrX2NkaXY7CisJdm9pZCBfX2lvbWVtICpjbGtfcmVnOworCXUzMiBjbGtfY2RpdjsKIAogCWNsa19yZWcgPSBpb3JlbWFwX25vY2FjaGUoTVJTVF9DTEtfU1BJMF9SRUcsIDE2KTsKIAlpZiAoIWNsa19yZWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1taW8uYwppbmRleCAzNGViNjY1Li5kYjJmMWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHctbW1pby5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1tbWlvLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJzcGktZHcuaCIKIApAQCAtMTI3LDI0ICsxMjgsMTQgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdfc3BpX21taW9fZHJpdmVyID0geworCS5wcm9iZQkJPSBkd19zcGlfbW1pb19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGR3X3NwaV9tbWlvX3JlbW92ZSksCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gRFJJVkVSX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBkd19zcGlfbW1pb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHdfc3BpX21taW9fZHJpdmVyLCBkd19zcGlfbW1pb19wcm9iZSk7Ci19Ci1tb2R1bGVfaW5pdChkd19zcGlfbW1pb19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGR3X3NwaV9tbWlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHdfc3BpX21taW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGR3X3NwaV9tbWlvX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkd19zcGlfbW1pb19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJKZWFuLUh1Z3VlcyBEZXNjaGVuZXMgPGplYW4taHVndWVzLmRlc2NoZW5lc0BvY3Rhc2ljLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTWVtb3J5LW1hcHBlZCBJL08gaW50ZXJmYWNlIGRyaXZlciBmb3IgRFcgU1BJIENvcmUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy1wY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy1wY2kuYwppbmRleCBjNWYzN2YwLi5mNjQyNTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHctcGNpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LXBjaS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInNwaS1kdy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCmluZGV4IDg1N2NkMzAuLjA4MjQ1OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTg4LDM1ICs4OSwzNSBAQAogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCiAJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIkNUUkwwOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGN0cmwwKSk7CisJCQkiQ1RSTDA6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX0NUUkwwKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJDVFJMMTogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBjdHJsMSkpOworCQkJIkNUUkwxOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9DVFJMMSkpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiU1NJRU5SOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBzc2llbnIpKTsKKwkJCSJTU0lFTlI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9TU0lFTlIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlNFUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBzZXIpKTsKKwkJCSJTRVI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX1NFUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiQkFVRFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgYmF1ZHIpKTsKKwkJCSJCQVVEUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfQkFVRFIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlRYRlRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgdHhmbHRyKSk7CisJCQkiVFhGVExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfVFhGTFRSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJSWEZUTFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHJ4Zmx0cikpOworCQkJIlJYRlRMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX1JYRkxUUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiVFhGTFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgdHhmbHIpKTsKKwkJCSJUWEZMUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfVFhGTFIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIlJYRkxSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIHJ4ZmxyKSk7CisJCQkiUlhGTFI6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX1JYRkxSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJTUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBzcikpOworCQkJIlNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9TUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCi0JCQkiSU1SOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGltcikpOworCQkJIklNUjogXHRcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfSU1SKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJJU1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgaXNyKSk7CisJCQkiSVNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIERXX1NQSV9JU1IpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIkRNQUNSOiBcdFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGRtYWNyKSk7CisJCQkiRE1BQ1I6IFx0XHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX0RNQUNSKSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1BJX1JFR1NfQlVGU0laRSAtIGxlbiwKLQkJCSJETUFURExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBkbWF0ZGxyKSk7CisJCQkiRE1BVERMUjogXHQweCUwOHhcbiIsIGR3X3JlYWRsKGR3cywgRFdfU1BJX0RNQVRETFIpKTsKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBTUElfUkVHU19CVUZTSVpFIC0gbGVuLAotCQkJIkRNQVJETFI6IFx0MHglMDh4XG4iLCBkd19yZWFkbChkd3MsIGRtYXJkbHIpKTsKKwkJCSJETUFSRExSOiBcdDB4JTA4eFxuIiwgZHdfcmVhZGwoZHdzLCBEV19TUElfRE1BUkRMUikpOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFNQSV9SRUdTX0JVRlNJWkUgLSBsZW4sCiAJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIApAQCAtMTY2LDcgKzE2Nyw3IEBACiAJdTMyIHR4X2xlZnQsIHR4X3Jvb20sIHJ4dHhfZ2FwOwogCiAJdHhfbGVmdCA9IChkd3MtPnR4X2VuZCAtIGR3cy0+dHgpIC8gZHdzLT5uX2J5dGVzOwotCXR4X3Jvb20gPSBkd3MtPmZpZm9fbGVuIC0gZHdfcmVhZHcoZHdzLCB0eGZscik7CisJdHhfcm9vbSA9IGR3cy0+Zmlmb19sZW4gLSBkd19yZWFkdyhkd3MsIERXX1NQSV9UWEZMUik7CiAKIAkvKgogCSAqIEFub3RoZXIgY29uY2VybiBpcyBhYm91dCB0aGUgdHgvcnggbWlzbWF0Y2gsIHdlCkBAIC0xODcsNyArMTg4LDcgQEAKIHsKIAl1MzIgcnhfbGVmdCA9IChkd3MtPnJ4X2VuZCAtIGR3cy0+cngpIC8gZHdzLT5uX2J5dGVzOwogCi0JcmV0dXJuIG1pbihyeF9sZWZ0LCAodTMyKWR3X3JlYWR3KGR3cywgcnhmbHIpKTsKKwlyZXR1cm4gbWluKHJ4X2xlZnQsICh1MzIpZHdfcmVhZHcoZHdzLCBEV19TUElfUlhGTFIpKTsKIH0KIAogc3RhdGljIHZvaWQgZHdfd3JpdGVyKHN0cnVjdCBkd19zcGkgKmR3cykKQEAgLTIwMyw3ICsyMDQsNyBAQAogCQkJZWxzZQogCQkJCXR4dyA9ICoodTE2ICopKGR3cy0+dHgpOwogCQl9Ci0JCWR3X3dyaXRldyhkd3MsIGRyLCB0eHcpOworCQlkd193cml0ZXcoZHdzLCBEV19TUElfRFIsIHR4dyk7CiAJCWR3cy0+dHggKz0gZHdzLT5uX2J5dGVzOwogCX0KIH0KQEAgLTIxNCw3ICsyMTUsNyBAQAogCXUxNiByeHc7CiAKIAl3aGlsZSAobWF4LS0pIHsKLQkJcnh3ID0gZHdfcmVhZHcoZHdzLCBkcik7CisJCXJ4dyA9IGR3X3JlYWR3KGR3cywgRFdfU1BJX0RSKTsKIAkJLyogQ2FyZSByeCBvbmx5IGlmIHRoZSB0cmFuc2ZlcidzIG9yaWdpbmFsICJyeCIgaXMgbm90IG51bGwgKi8KIAkJaWYgKGR3cy0+cnhfZW5kIC0gZHdzLT5sZW4pIHsKIAkJCWlmIChkd3MtPm5fYnl0ZXMgPT0gMSkKQEAgLTMyMiwxMyArMzIzLDEzIEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzKQogewotCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBpc3IpOworCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBEV19TUElfSVNSKTsKIAogCS8qIEVycm9yIGhhbmRsaW5nICovCiAJaWYgKGlycV9zdGF0dXMgJiAoU1BJX0lOVF9UWE9JIHwgU1BJX0lOVF9SWE9JIHwgU1BJX0lOVF9SWFVJKSkgewotCQlkd19yZWFkdyhkd3MsIHR4b2ljcik7Ci0JCWR3X3JlYWR3KGR3cywgcnhvaWNyKTsKLQkJZHdfcmVhZHcoZHdzLCByeHVpY3IpOworCQlkd19yZWFkdyhkd3MsIERXX1NQSV9UWE9JQ1IpOworCQlkd19yZWFkdyhkd3MsIERXX1NQSV9SWE9JQ1IpOworCQlkd19yZWFkdyhkd3MsIERXX1NQSV9SWFVJQ1IpOwogCQlpbnRfZXJyb3Jfc3RvcChkd3MsICJpbnRlcnJ1cHRfdHJhbnNmZXI6IGZpZm8gb3ZlcnJ1bi91bmRlcnJ1biIpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtMzUyLDcgKzM1Myw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgZHdfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGR3X3NwaSAqZHdzID0gZGV2X2lkOwotCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBpc3IpICYgMHgzZjsKKwl1MTYgaXJxX3N0YXR1cyA9IGR3X3JlYWR3KGR3cywgRFdfU1BJX0lTUikgJiAweDNmOwogCiAJaWYgKCFpcnFfc3RhdHVzKQogCQlyZXR1cm4gSVJRX05PTkU7CkBAIC01MjAsMTEgKzUyMSwxMSBAQAogCSAqCTIuIGNsa19kaXYgaXMgY2hhbmdlZAogCSAqCTMuIGNvbnRyb2wgdmFsdWUgY2hhbmdlcwogCSAqLwotCWlmIChkd19yZWFkdyhkd3MsIGN0cmwwKSAhPSBjcjAgfHwgY3NfY2hhbmdlIHx8IGNsa19kaXYgfHwgaW1hc2spIHsKKwlpZiAoZHdfcmVhZHcoZHdzLCBEV19TUElfQ1RSTDApICE9IGNyMCB8fCBjc19jaGFuZ2UgfHwgY2xrX2RpdiB8fCBpbWFzaykgewogCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKIAotCQlpZiAoZHdfcmVhZHcoZHdzLCBjdHJsMCkgIT0gY3IwKQotCQkJZHdfd3JpdGV3KGR3cywgY3RybDAsIGNyMCk7CisJCWlmIChkd19yZWFkdyhkd3MsIERXX1NQSV9DVFJMMCkgIT0gY3IwKQorCQkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX0NUUkwwLCBjcjApOwogCiAJCXNwaV9zZXRfY2xrKGR3cywgY2xrX2RpdiA/IGNsa19kaXYgOiBjaGlwLT5jbGtfZGl2KTsKIAkJc3BpX2NoaXBfc2VsKGR3cywgc3BpLT5jaGlwX3NlbGVjdCk7CkBAIC01MzQsNyArNTM1LDcgQEAKIAkJaWYgKGltYXNrKQogCQkJc3BpX3VtYXNrX2ludHIoZHdzLCBpbWFzayk7CiAJCWlmICh0eGludF9sZXZlbCkKLQkJCWR3X3dyaXRldyhkd3MsIHR4Zmx0ciwgdHhpbnRfbGV2ZWwpOworCQkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX1RYRkxUUiwgdHhpbnRfbGV2ZWwpOwogCiAJCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOwogCQlpZiAoY3NfY2hhbmdlKQpAQCAtNzkwLDEzICs3OTEsMTMgQEAKIAlpZiAoIWR3cy0+Zmlmb19sZW4pIHsKIAkJdTMyIGZpZm87CiAJCWZvciAoZmlmbyA9IDI7IGZpZm8gPD0gMjU3OyBmaWZvKyspIHsKLQkJCWR3X3dyaXRldyhkd3MsIHR4Zmx0ciwgZmlmbyk7Ci0JCQlpZiAoZmlmbyAhPSBkd19yZWFkdyhkd3MsIHR4Zmx0cikpCisJCQlkd193cml0ZXcoZHdzLCBEV19TUElfVFhGTFRSLCBmaWZvKTsKKwkJCWlmIChmaWZvICE9IGR3X3JlYWR3KGR3cywgRFdfU1BJX1RYRkxUUikpCiAJCQkJYnJlYWs7CiAJCX0KIAogCQlkd3MtPmZpZm9fbGVuID0gKGZpZm8gPT0gMjU3KSA/IDAgOiBmaWZvOwotCQlkd193cml0ZXcoZHdzLCB0eGZsdHIsIDApOworCQlkd193cml0ZXcoZHdzLCBEV19TUElfVFhGTFRSLCAwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5oIGIvZHJpdmVycy9zcGkvc3BpLWR3LmgKaW5kZXggOGI3YjA3Yi4uOWM1N2MwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmgKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmgKQEAgLTQsNiArNCwzMyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAorLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBEV19TUElfQ1RSTDAJCQkweDAwCisjZGVmaW5lIERXX1NQSV9DVFJMMQkJCTB4MDQKKyNkZWZpbmUgRFdfU1BJX1NTSUVOUgkJCTB4MDgKKyNkZWZpbmUgRFdfU1BJX01XQ1IJCQkweDBjCisjZGVmaW5lIERXX1NQSV9TRVIJCQkweDEwCisjZGVmaW5lIERXX1NQSV9CQVVEUgkJCTB4MTQKKyNkZWZpbmUgRFdfU1BJX1RYRkxUUgkJCTB4MTgKKyNkZWZpbmUgRFdfU1BJX1JYRkxUUgkJCTB4MWMKKyNkZWZpbmUgRFdfU1BJX1RYRkxSCQkJMHgyMAorI2RlZmluZSBEV19TUElfUlhGTFIJCQkweDI0CisjZGVmaW5lIERXX1NQSV9TUgkJCTB4MjgKKyNkZWZpbmUgRFdfU1BJX0lNUgkJCTB4MmMKKyNkZWZpbmUgRFdfU1BJX0lTUgkJCTB4MzAKKyNkZWZpbmUgRFdfU1BJX1JJU1IJCQkweDM0CisjZGVmaW5lIERXX1NQSV9UWE9JQ1IJCQkweDM4CisjZGVmaW5lIERXX1NQSV9SWE9JQ1IJCQkweDNjCisjZGVmaW5lIERXX1NQSV9SWFVJQ1IJCQkweDQwCisjZGVmaW5lIERXX1NQSV9NU1RJQ1IJCQkweDQ0CisjZGVmaW5lIERXX1NQSV9JQ1IJCQkweDQ4CisjZGVmaW5lIERXX1NQSV9ETUFDUgkJCTB4NGMKKyNkZWZpbmUgRFdfU1BJX0RNQVRETFIJCQkweDUwCisjZGVmaW5lIERXX1NQSV9ETUFSRExSCQkJMHg1NAorI2RlZmluZSBEV19TUElfSURSCQkJMHg1OAorI2RlZmluZSBEV19TUElfVkVSU0lPTgkJCTB4NWMKKyNkZWZpbmUgRFdfU1BJX0RSCQkJMHg2MAorCiAvKiBCaXQgZmllbGRzIGluIENUUkxSMCAqLwogI2RlZmluZSBTUElfREZTX09GRlNFVAkJCTAKIApAQCAtNTUsMzUgKzgyLDYgQEAKIAlTU0lfTlNfTUlDUk9XSVJFLAogfTsKIAotc3RydWN0IGR3X3NwaV9yZWcgewotCXUzMgljdHJsMDsKLQl1MzIJY3RybDE7Ci0JdTMyCXNzaWVucjsKLQl1MzIJbXdjcjsKLQl1MzIJc2VyOwotCXUzMgliYXVkcjsKLQl1MzIJdHhmbHRyOwotCXUzMglyeGZsdHI7Ci0JdTMyCXR4ZmxyOwotCXUzMglyeGZscjsKLQl1MzIJc3I7Ci0JdTMyCWltcjsKLQl1MzIJaXNyOwotCXUzMglyaXNyOwotCXUzMgl0eG9pY3I7Ci0JdTMyCXJ4b2ljcjsKLQl1MzIJcnh1aWNyOwotCXUzMgltc3RpY3I7Ci0JdTMyCWljcjsKLQl1MzIJZG1hY3I7Ci0JdTMyCWRtYXRkbHI7Ci0JdTMyCWRtYXJkbHI7Ci0JdTMyCWlkcjsKLQl1MzIJdmVyc2lvbjsKLQl1MzIJZHI7CQkvKiBDdXJyZW50bHkgb3BlciBhcyAzMiBiaXRzLAotCQkJCXRob3VnaCBvbmx5IGxvdyAxNiBiaXRzIG1hdHRlcnMgKi8KLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBkd19zcGk7CiBzdHJ1Y3QgZHdfc3BpX2RtYV9vcHMgewogCWludCAoKmRtYV9pbml0KShzdHJ1Y3QgZHdfc3BpICpkd3MpOwpAQCAtMTYxLDIzICsxNTksMzQgQEAKICNlbmRpZgogfTsKIAotI2RlZmluZSBkd19yZWFkbChkdywgbmFtZSkgXAotCV9fcmF3X3JlYWRsKCYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCi0jZGVmaW5lIGR3X3dyaXRlbChkdywgbmFtZSwgdmFsKSBcCi0JX19yYXdfd3JpdGVsKCh2YWwpLCAmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQotI2RlZmluZSBkd19yZWFkdyhkdywgbmFtZSkgXAotCV9fcmF3X3JlYWR3KCYoKChzdHJ1Y3QgZHdfc3BpX3JlZyAqKWR3LT5yZWdzKS0+bmFtZSkpCi0jZGVmaW5lIGR3X3dyaXRldyhkdywgbmFtZSwgdmFsKSBcCi0JX19yYXdfd3JpdGV3KCh2YWwpLCAmKCgoc3RydWN0IGR3X3NwaV9yZWcgKilkdy0+cmVncyktPm5hbWUpKQorc3RhdGljIGlubGluZSB1MzIgZHdfcmVhZGwoc3RydWN0IGR3X3NwaSAqZHdzLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBfX3Jhd19yZWFkbChkd3MtPnJlZ3MgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHdfd3JpdGVsKHN0cnVjdCBkd19zcGkgKmR3cywgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBkd3MtPnJlZ3MgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBkd19yZWFkdyhzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWR3KGR3cy0+cmVncyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd193cml0ZXcoc3RydWN0IGR3X3NwaSAqZHdzLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGR3cy0+cmVncyArIG9mZnNldCk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfZW5hYmxlX2NoaXAoc3RydWN0IGR3X3NwaSAqZHdzLCBpbnQgZW5hYmxlKQogewotCWR3X3dyaXRlbChkd3MsIHNzaWVuciwgKGVuYWJsZSA/IDEgOiAwKSk7CisJZHdfd3JpdGVsKGR3cywgRFdfU1BJX1NTSUVOUiwgKGVuYWJsZSA/IDEgOiAwKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfc2V0X2NsayhzdHJ1Y3QgZHdfc3BpICpkd3MsIHUxNiBkaXYpCiB7Ci0JZHdfd3JpdGVsKGR3cywgYmF1ZHIsIGRpdik7CisJZHdfd3JpdGVsKGR3cywgRFdfU1BJX0JBVURSLCBkaXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BpX2NoaXBfc2VsKHN0cnVjdCBkd19zcGkgKmR3cywgdTE2IGNzKQpAQCAtMTg4LDcgKzE5Nyw3IEBACiAJaWYgKGR3cy0+Y3NfY29udHJvbCkKIAkJZHdzLT5jc19jb250cm9sKDEpOwogCi0JZHdfd3JpdGVsKGR3cywgc2VyLCAxIDw8IGNzKTsKKwlkd193cml0ZWwoZHdzLCBEV19TUElfU0VSLCAxIDw8IGNzKTsKIH0KIAogLyogRGlzYWJsZSBJUlEgYml0cyAqLwpAQCAtMTk2LDggKzIwNSw4IEBACiB7CiAJdTMyIG5ld19tYXNrOwogCi0JbmV3X21hc2sgPSBkd19yZWFkbChkd3MsIGltcikgJiB+bWFzazsKLQlkd193cml0ZWwoZHdzLCBpbXIsIG5ld19tYXNrKTsKKwluZXdfbWFzayA9IGR3X3JlYWRsKGR3cywgRFdfU1BJX0lNUikgJiB+bWFzazsKKwlkd193cml0ZWwoZHdzLCBEV19TUElfSU1SLCBuZXdfbWFzayk7CiB9CiAKIC8qIEVuYWJsZSBJUlEgYml0cyAqLwpAQCAtMjA1LDggKzIxNCw4IEBACiB7CiAJdTMyIG5ld19tYXNrOwogCi0JbmV3X21hc2sgPSBkd19yZWFkbChkd3MsIGltcikgfCBtYXNrOwotCWR3X3dyaXRlbChkd3MsIGltciwgbmV3X21hc2spOworCW5ld19tYXNrID0gZHdfcmVhZGwoZHdzLCBEV19TUElfSU1SKSB8IG1hc2s7CisJZHdfd3JpdGVsKGR3cywgRFdfU1BJX0lNUiwgbmV3X21hc2spOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jIGIvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCmluZGV4IDFjZjY0NTQ3Li4wYTI4MmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZXA5M3h4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWVwOTN4eC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTEwMjUsNyArMTAyNiw3IEBACiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllc3BpLT56ZXJvcGFnZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVwOTN4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCBlcDkzeHhfc3BpX2luZm8gKmluZm87CkBAIC0xMTUwLDcgKzExNTEsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgZXA5M3h4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGVwOTN4eF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBlcDkzeHhfc3BpICplc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwpAQCAtMTE5NiwyMCArMTE5NywxMCBAQAogCQkubmFtZQk9ICJlcDkzeHgtc3BpIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKGVwOTN4eF9zcGlfcmVtb3ZlKSwKKwkucHJvYmUJCT0gZXA5M3h4X3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVwOTN4eF9zcGlfcmVtb3ZlKSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVwOTN4eF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVwOTN4eF9zcGlfZHJpdmVyLCBlcDkzeHhfc3BpX3Byb2JlKTsKLX0KLW1vZHVsZV9pbml0KGVwOTN4eF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBlcDkzeHhfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXA5M3h4X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoZXA5M3h4X3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZXA5M3h4X3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkVQOTN4eCBTUEkgQ29udHJvbGxlciBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKaW5kZXggNTRlNDk5ZC4uZDc3MGYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKQEAgLTc0NCwxOCArNzQ0LDcgQEAKIAkucHJvYmUJCT0gb2ZfZnNsX2VzcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvZl9mc2xfZXNwaV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgZnNsX2VzcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9lc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChmc2xfZXNwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGZzbF9lc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNsX2VzcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGZzbF9lc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfZXNwaV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJNaW5na2FpIEh1Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVuaGFuY2VkIEZyZWVzY2FsZSBTUEkgRHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jIGIvZHJpdmVycy9zcGkvc3BpLWdwaW8uYwppbmRleCAwZTg4YWI3Li5lMDkzZDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KQEAgLTMxMSw3ICszMTIsNyBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwaV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50CQkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkJKm1hc3RlcjsKQEAgLTM3OSw3ICszODAsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IHNwaV9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgc3BpX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9ncGlvCQkJKnNwaV9ncGlvOwogCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKQEAgLTQwOCwyMSArNDA5LDEwIEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfZ3Bpb19kcml2ZXIgPSB7CiAJLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCiAJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5yZW1vdmUJCT0gX19leGl0X3Aoc3BpX2dwaW9fcmVtb3ZlKSwKKwkucHJvYmUJCT0gc3BpX2dwaW9fcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcGlfZ3Bpb19yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnNwaV9ncGlvX2RyaXZlciwgc3BpX2dwaW9fcHJvYmUpOwotfQotbW9kdWxlX2luaXQoc3BpX2dwaW9faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9ncGlvX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfZ3Bpb19leGl0KTsKLQorbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGlfZ3Bpb19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBtYXN0ZXIgZHJpdmVyIHVzaW5nIGdlbmVyaWMgYml0YmFuZ2VkIEdQSU8gIik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCcm93bmVsbCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlteC5jIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCmluZGV4IGZhNTk0ZDYuLmM2ZTY5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKQEAgLTkyOSwxOSArOTI5LDcgQEAKIAkucHJvYmUgPSBzcGlfaW14X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzcGlfaW14X3JlbW92ZSksCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfaW14X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGlfaW14X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfaW14X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX2lteF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzcGlfaW14X2luaXQpOwotbW9kdWxlX2V4aXQoc3BpX2lteF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BpX2lteF9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBNYXN0ZXIgQ29udHJvbGxlciBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKaW5kZXggNmE1YjQyMy4uNGM2M2Y3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKQEAgLTU1OSwxOCArNTU5LDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTEyeF9wc2Nfc3BpX29mX21hdGNoLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM1MTJ4X3BzY19zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzUxMnhfcHNjX3NwaV9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXBjNTEyeF9wc2Nfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXBjNTEyeF9wc2Nfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjNTEyeF9wc2Nfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtcGM1MTJ4X3BzY19zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1wYzUxMnhfcHNjX3NwaV9vZl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJKb2huIFJpZ2J5Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzUxMnggUFNDIFNQSSBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKaW5kZXggZTMwYmFmMC4uNjYwNDcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHgtcHNjLmMKQEAgLTUxMSwxOCArNTExLDcgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTJ4eF9wc2Nfc3BpX29mX21hdGNoLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM1Mnh4X3BzY19zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzUyeHhfcHNjX3NwaV9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXBjNTJ4eF9wc2Nfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXBjNTJ4eF9wc2Nfc3BpX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjNTJ4eF9wc2Nfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtcGM1Mnh4X3BzY19zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1wYzUyeHhfcHNjX3NwaV9vZl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJEcmFnb3MgQ2FycCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNUEM1Mnh4IFBTQyBTUEkgRHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUyeHguYwppbmRleCAwMTVhOTc0Li41NzYzM2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tcGM1Mnh4LmMKQEAgLTU2NCwxNiArNTY0LDQgQEAKIAkucHJvYmUgPSBtcGM1Mnh4X3NwaV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AobXBjNTJ4eF9zcGlfcmVtb3ZlKSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM1Mnh4X3NwaV9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXBjNTJ4eF9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtcGM1Mnh4X3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1wYzUyeHhfc3BpX29mX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtcGM1Mnh4X3NwaV9leGl0KTsKLQorbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtcGM1Mnh4X3NwaV9vZl9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jIGIvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCmluZGV4IGMwYTZjZTguLmU3NjMyNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKQEAgLTQ4NCwxOSArNDg0LDcgQEAKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG51YzkwMF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm51YzkwMF9zcGlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG51YzkwMF9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZudWM5MDBfc3BpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG51YzkwMF9zcGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChudWM5MDBfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihudWM5MDBfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIldhbiBab25nU2h1biA8bWN1b3MuY29tQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigibnVjOTAwIHNwaSBkcml2ZXIhIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jIGIvZHJpdmVycy9zcGkvc3BpLW9jLXRpbnkuYwppbmRleCBmMWJkZTY2Li42OTgwMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb2MtdGlueS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vYy10aW55LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CkBAIC00MDYsMTggKzQwNyw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHRpbnlfc3BpX21hdGNoLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0aW55X3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGlueV9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHRpbnlfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGlueV9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0aW55X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodGlueV9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRpbnlfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiT3BlbkNvcmVzIHRpbnkgU1BJIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiVGhvbWFzIENob3UgPHRob21hc0B3eXRyb24uY29tLnR3PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYyBiL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKaW5kZXggMDBhOGU5ZC4uNjEwZjczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCkBAIC00NSw2ICs0NSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAyLW1jc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYwppbmRleCBmZGUzYTJkLi4zMjJiZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcDItbWNzcGkuYwpAQCAtMTExNiwxNSArMTExNiwxNiBAQAogCQlzdGF0dXMgPSAtRU5PREVWOwogCQlnb3RvIGVycjE7CiAJfQorCisJci0+c3RhcnQgKz0gcGRhdGEtPnJlZ3Nfb2Zmc2V0OworCXItPmVuZCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7CisJbWNzcGktPnBoeXMgPSByLT5zdGFydDsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwKIAkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSkpIHsKIAkJc3RhdHVzID0gLUVCVVNZOwogCQlnb3RvIGVycjE7CiAJfQogCi0Jci0+c3RhcnQgKz0gcGRhdGEtPnJlZ3Nfb2Zmc2V0OwotCXItPmVuZCArPSBwZGF0YS0+cmVnc19vZmZzZXQ7Ci0JbWNzcGktPnBoeXMgPSByLT5zdGFydDsKIAltY3NwaS0+YmFzZSA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCWlmICghbWNzcGktPmJhc2UpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgaW9yZW1hcCBNQ1NQSVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktb3Jpb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCmluZGV4IDk0MjFhMzkuLjEzNDQ4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1vcmlvbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL29yaW9uX3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRQkJCSJvcmlvbl9zcGkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCmluZGV4IDczMGI0YTMuLmYxMDNlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCkBAIC0xMTMsNyArMTEzLDYgQEAKICNkZWZpbmUgU1NQX0NSMF9NQVNLX0NTU19TVAkoMHgxRlVMIDw8IDE2KQogI2RlZmluZSBTU1BfQ1IwX01BU0tfRlJGX1NUCSgweDNVTCA8PCAyMSkKIAotCiAvKgogICogU1NQIENvbnRyb2wgUmVnaXN0ZXIgMCAgLSBTU1BfQ1IxCiAgKi8KQEAgLTI4Myw3ICsyODIsNiBAQAogCiAjZGVmaW5lIFNQSV9QT0xMSU5HX1RJTUVPVVQgMTAwMAogCi0KIC8qCiAgKiBUaGUgdHlwZSBvZiByZWFkaW5nIGdvaW5nIG9uIG9uIHRoaXMgY2hpcAogICovCkBAIC01MTUsOSArNTEzLDYgQEAKIAlpZiAobXNnLT5jb21wbGV0ZSkKIAkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwogCS8qIFRoaXMgbWVzc2FnZSBpcyBjb21wbGV0ZWQsIHNvIGxldCdzIHR1cm4gb2ZmIHRoZSBjbG9ja3MgJiBwb3dlciAqLwotCWNsa19kaXNhYmxlKHBsMDIyLT5jbGspOwotCWFtYmFfcGNsa19kaXNhYmxlKHBsMDIyLT5hZGV2KTsKLQlhbWJhX3Zjb3JlX2Rpc2FibGUocGwwMjItPmFkZXYpOwogCXBtX3J1bnRpbWVfcHV0KCZwbDAyMi0+YWRldi0+ZGV2KTsKIH0KIApAQCAtNzUyLDcgKzc0Nyw2IEBACiAJICovCiB9CiAKLQogLyoqCiAgKiBuZXh0X3RyYW5zZmVyIC0gTW92ZSB0byB0aGUgTmV4dCB0cmFuc2ZlciBpbiB0aGUgY3VycmVudCBzcGkgbWVzc2FnZQogICogQHBsMDIyOiBTU1AgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKQEAgLTEwMTksMTQgKzEwMTMsMTQgQEAKIAlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHR4Y2hhbiwgJnR4X2NvbmYpOwogCiAJLyogQ3JlYXRlIHNnbGlzdHMgZm9yIHRoZSB0cmFuc2ZlcnMgKi8KLQlwYWdlcyA9IChwbDAyMi0+Y3VyX3RyYW5zZmVyLT5sZW4gPj4gUEFHRV9TSElGVCkgKyAxOworCXBhZ2VzID0gRElWX1JPVU5EX1VQKHBsMDIyLT5jdXJfdHJhbnNmZXItPmxlbiwgUEFHRV9TSVpFKTsKIAlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LCAidXNpbmcgJWQgcGFnZXMgZm9yIHRyYW5zZmVyXG4iLCBwYWdlcyk7CiAKLQlyZXQgPSBzZ19hbGxvY190YWJsZSgmcGwwMjItPnNndF9yeCwgcGFnZXMsIEdGUF9LRVJORUwpOworCXJldCA9IHNnX2FsbG9jX3RhYmxlKCZwbDAyMi0+c2d0X3J4LCBwYWdlcywgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfYWxsb2Nfcnhfc2c7CiAKLQlyZXQgPSBzZ19hbGxvY190YWJsZSgmcGwwMjItPnNndF90eCwgcGFnZXMsIEdGUF9LRVJORUwpOworCXJldCA9IHNnX2FsbG9jX3RhYmxlKCZwbDAyMi0+c2d0X3R4LCBwYWdlcywgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfYWxsb2NfdHhfc2c7CiAKQEAgLTE1MzQsOCArMTUyOCw3IEBACiAJLyogSW5pdGlhbCBtZXNzYWdlIHN0YXRlICovCiAJcGwwMjItPmN1cl9tc2ctPnN0YXRlID0gU1RBVEVfU1RBUlQ7CiAJcGwwMjItPmN1cl90cmFuc2ZlciA9IGxpc3RfZW50cnkocGwwMjItPmN1cl9tc2ctPnRyYW5zZmVycy5uZXh0LAotCQkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciwKLQkJCQkJICAgIHRyYW5zZmVyX2xpc3QpOworCQkJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciwgdHJhbnNmZXJfbGlzdCk7CiAKIAkvKiBTZXR1cCB0aGUgU1BJIHVzaW5nIHRoZSBwZXIgY2hpcCBjb25maWd1cmF0aW9uICovCiAJcGwwMjItPmN1cl9jaGlwID0gc3BpX2dldF9jdGxkYXRhKHBsMDIyLT5jdXJfbXNnLT5zcGkpOwpAQCAtMTU0NSw5ICsxNTM4LDYgQEAKIAkgKiAocG9sbC9pbnRlcnJ1cHQvRE1BKQogCSAqLwogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBsMDIyLT5hZGV2LT5kZXYpOwotCWFtYmFfdmNvcmVfZW5hYmxlKHBsMDIyLT5hZGV2KTsKLQlhbWJhX3BjbGtfZW5hYmxlKHBsMDIyLT5hZGV2KTsKLQljbGtfZW5hYmxlKHBsMDIyLT5jbGspOwogCXJlc3RvcmVfc3RhdGUocGwwMjIpOwogCWZsdXNoKHBsMDIyKTsKIApAQCAtMTU1Nyw3ICsxNTQ3LDYgQEAKIAkJZG9faW50ZXJydXB0X2RtYV90cmFuc2ZlcihwbDAyMik7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgaW5pdF9xdWV1ZShzdHJ1Y3QgcGwwMjIgKnBsMDIyKQogewogCUlOSVRfTElTVF9IRUFEKCZwbDAyMi0+cXVldWUpOwpAQCAtMTU2Niw4ICsxNTU1LDggQEAKIAlwbDAyMi0+cnVubmluZyA9IGZhbHNlOwogCXBsMDIyLT5idXN5ID0gZmFsc2U7CiAKLQl0YXNrbGV0X2luaXQoJnBsMDIyLT5wdW1wX3RyYW5zZmVycywKLQkJCXB1bXBfdHJhbnNmZXJzLAkodW5zaWduZWQgbG9uZylwbDAyMik7CisJdGFza2xldF9pbml0KCZwbDAyMi0+cHVtcF90cmFuc2ZlcnMsIHB1bXBfdHJhbnNmZXJzLAorCQkJKHVuc2lnbmVkIGxvbmcpcGwwMjIpOwogCiAJSU5JVF9XT1JLKCZwbDAyMi0+cHVtcF9tZXNzYWdlcywgcHVtcF9tZXNzYWdlcyk7CiAJcGwwMjItPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKApAQCAtMTU3OCw3ICsxNTY3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgaW50IHN0YXJ0X3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE2MDEsNyArMTU4OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBzdG9wX3F1ZXVlKHN0cnVjdCBwbDAyMiAqcGwwMjIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE3OTcsNzEgKzE3ODQsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjYWxjdWxhdGVfZWZmZWN0aXZlX2ZyZXEoc3RydWN0IHBsMDIyICpwbDAyMiwKLQkJCQkgICAgaW50IGZyZXEsCi0JCQkJICAgIHN0cnVjdCBzc3BfY2xvY2tfcGFyYW1zICpjbGtfZnJlcSkKK3N0YXRpYyBpbmxpbmUgdTMyIHNwaV9yYXRlKHUzMiByYXRlLCB1MTYgY3BzZHZzciwgdTE2IHNjcikKK3sKKwlyZXR1cm4gcmF0ZSAvIChjcHNkdnNyICogKDEgKyBzY3IpKTsKK30KKworc3RhdGljIGludCBjYWxjdWxhdGVfZWZmZWN0aXZlX2ZyZXEoc3RydWN0IHBsMDIyICpwbDAyMiwgaW50IGZyZXEsIHN0cnVjdAorCQkJCSAgICBzc3BfY2xvY2tfcGFyYW1zICogY2xrX2ZyZXEpCiB7CiAJLyogTGV0cyBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzICovCi0JdTE2IGNwc2R2c3IgPSAyOwotCXUxNiBzY3IgPSAwOwotCWJvb2wgZnJlcV9mb3VuZCA9IGZhbHNlOwotCXUzMiByYXRlOwotCXUzMiBtYXhfdGNsazsKLQl1MzIgbWluX3RjbGs7CisJdTE2IGNwc2R2c3IgPSBDUFNEVlJfTUlOLCBzY3IgPSBTQ1JfTUlOOworCXUzMiByYXRlLCBtYXhfdGNsaywgbWluX3RjbGssIGJlc3RfZnJlcSA9IDAsIGJlc3RfY3BzZHZzciA9IDAsCisJCWJlc3Rfc2NyID0gMCwgdG1wLCBmb3VuZCA9IDA7CiAKIAlyYXRlID0gY2xrX2dldF9yYXRlKHBsMDIyLT5jbGspOwogCS8qIGNwc2R2c2NyID0gMiAmIHNjciAwICovCi0JbWF4X3RjbGsgPSAocmF0ZSAvIChDUFNEVlJfTUlOICogKDEgKyBTQ1JfTUlOKSkpOworCW1heF90Y2xrID0gc3BpX3JhdGUocmF0ZSwgQ1BTRFZSX01JTiwgU0NSX01JTik7CiAJLyogY3BzZHZzciA9IDI1NCAmIHNjciA9IDI1NSAqLwotCW1pbl90Y2xrID0gKHJhdGUgLyAoQ1BTRFZSX01BWCAqICgxICsgU0NSX01BWCkpKTsKKwltaW5fdGNsayA9IHNwaV9yYXRlKHJhdGUsIENQU0RWUl9NQVgsIFNDUl9NQVgpOwogCi0JaWYgKChmcmVxIDw9IG1heF90Y2xrKSAmJiAoZnJlcSA+PSBtaW5fdGNsaykpIHsKLQkJd2hpbGUgKGNwc2R2c3IgPD0gQ1BTRFZSX01BWCAmJiAhZnJlcV9mb3VuZCkgewotCQkJd2hpbGUgKHNjciA8PSBTQ1JfTUFYICYmICFmcmVxX2ZvdW5kKSB7Ci0JCQkJaWYgKChyYXRlIC8KLQkJCQkgICAgIChjcHNkdnNyICogKDEgKyBzY3IpKSkgPiBmcmVxKQotCQkJCQlzY3IgKz0gMTsKLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogVGhpcyBib29sIGlzIG1hZGUgdHJ1ZSB3aGVuCi0JCQkJCSAqIGVmZmVjdGl2ZSBmcmVxdWVuY3kgPj0KLQkJCQkJICogdGFyZ2V0IGZyZXF1ZW5jeSBpcyBmb3VuZAotCQkJCQkgKi8KLQkJCQkJZnJlcV9mb3VuZCA9IHRydWU7Ci0JCQkJCWlmICgocmF0ZSAvCi0JCQkJCSAgICAgKGNwc2R2c3IgKiAoMSArIHNjcikpKSAhPSBmcmVxKSB7Ci0JCQkJCQlpZiAoc2NyID09IFNDUl9NSU4pIHsKLQkJCQkJCQljcHNkdnNyIC09IDI7Ci0JCQkJCQkJc2NyID0gU0NSX01BWDsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXNjciAtPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmcmVxX2ZvdW5kKSB7Ci0JCQkJY3BzZHZzciArPSAyOwotCQkJCXNjciA9IFNDUl9NSU47Ci0JCQl9Ci0JCX0KLQkJaWYgKGNwc2R2c3IgIT0gMCkgewotCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiU1NQIEVmZmVjdGl2ZSBGcmVxdWVuY3kgaXMgJXVcbiIsCi0JCQkJKHJhdGUgLyAoY3BzZHZzciAqICgxICsgc2NyKSkpKTsKLQkJCWNsa19mcmVxLT5jcHNkdnNyID0gKHU4KSAoY3BzZHZzciAmIDB4RkYpOwotCQkJY2xrX2ZyZXEtPnNjciA9ICh1OCkgKHNjciAmIDB4RkYpOwotCQkJZGV2X2RiZygmcGwwMjItPmFkZXYtPmRldiwKLQkJCQkiU1NQIGNwc2R2c3IgPSAlZCwgc2NyID0gJWRcbiIsCi0JCQkJY2xrX2ZyZXEtPmNwc2R2c3IsIGNsa19mcmVxLT5zY3IpOwotCQl9Ci0JfSBlbHNlIHsKKwlpZiAoISgoZnJlcSA8PSBtYXhfdGNsaykgJiYgKGZyZXEgPj0gbWluX3RjbGspKSkgewogCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LAogCQkJImNvbnRyb2xsZXIgZGF0YSBpcyBpbmNvcnJlY3Q6IG91dCBvZiByYW5nZSBmcmVxdWVuY3kiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJLyoKKwkgKiBiZXN0X2ZyZXEgd2lsbCBnaXZlIGNsb3Nlc3QgcG9zc2libGUgYXZhaWxhYmxlIHJhdGUgKDw9IHJlcXVlc3RlZAorCSAqIGZyZXEpIGZvciBhbGwgdmFsdWVzIG9mIHNjciAmIGNwc2R2c3IuCisJICovCisJd2hpbGUgKChjcHNkdnNyIDw9IENQU0RWUl9NQVgpICYmICFmb3VuZCkgeworCQl3aGlsZSAoc2NyIDw9IFNDUl9NQVgpIHsKKwkJCXRtcCA9IHNwaV9yYXRlKHJhdGUsIGNwc2R2c3IsIHNjcik7CisKKwkJCWlmICh0bXAgPiBmcmVxKQorCQkJCXNjcisrOworCQkJLyoKKwkJCSAqIElmIGZvdW5kIGV4YWN0IHZhbHVlLCB1cGRhdGUgYW5kIGJyZWFrLgorCQkJICogSWYgZm91bmQgbW9yZSBjbG9zZXIgdmFsdWUsIHVwZGF0ZSBhbmQgY29udGludWUuCisJCQkgKi8KKwkJCWVsc2UgaWYgKCh0bXAgPT0gZnJlcSkgfHwgKHRtcCA+IGJlc3RfZnJlcSkpIHsKKwkJCQliZXN0X2ZyZXEgPSB0bXA7CisJCQkJYmVzdF9jcHNkdnNyID0gY3BzZHZzcjsKKwkJCQliZXN0X3NjciA9IHNjcjsKKworCQkJCWlmICh0bXAgPT0gZnJlcSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzY3IrKzsKKwkJfQorCQljcHNkdnNyICs9IDI7CisJCXNjciA9IFNDUl9NSU47CisJfQorCisJY2xrX2ZyZXEtPmNwc2R2c3IgPSAodTgpIChiZXN0X2Nwc2R2c3IgJiAweEZGKTsKKwljbGtfZnJlcS0+c2NyID0gKHU4KSAoYmVzdF9zY3IgJiAweEZGKTsKKwlkZXZfZGJnKCZwbDAyMi0+YWRldi0+ZGV2LAorCQkiU1NQIFRhcmdldCBGcmVxdWVuY3kgaXM6ICV1LCBFZmZlY3RpdmUgRnJlcXVlbmN5IGlzICV1XG4iLAorCQlmcmVxLCBiZXN0X2ZyZXEpOworCWRldl9kYmcoJnBsMDIyLT5hZGV2LT5kZXYsICJTU1AgY3BzZHZzciA9ICVkLCBzY3IgPSAlZFxuIiwKKwkJY2xrX2ZyZXEtPmNwc2R2c3IsIGNsa19mcmVxLT5zY3IpOworCiAJcmV0dXJuIDA7CiB9CiAKLQogLyoKICAqIEEgcGllY2Ugb2YgZGVmYXVsdCBjaGlwIGluZm8gdW5sZXNzIHRoZSBwbGF0Zm9ybQogICogc3VwcGxpZXMgaXQuCkBAIC0xODc5LDcgKzE4NjUsNiBAQAogCS5jc19jb250cm9sID0gbnVsbF9jc19jb250cm9sLAogfTsKIAotCiAvKioKICAqIHBsMDIyX3NldHVwIC0gc2V0dXAgZnVuY3Rpb24gcmVnaXN0ZXJlZCB0byBTUEkgbWFzdGVyIGZyYW1ld29yawogICogQHNwaTogc3BpIGRldmljZSB3aGljaCBpcyByZXF1ZXN0aW5nIHNldHVwCkBAIC0xOTU2LDcgKzE5NDEsNiBAQAogCQlnb3RvIGVycl9jb25maWdfcGFyYW1zOwogCX0KIAotCiAJc3RhdHVzID0gdmVyaWZ5X2NvbnRyb2xsZXJfcGFyYW1ldGVycyhwbDAyMiwgY2hpcF9pbmZvKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY29udHJvbGxlciBkYXRhIGlzIGluY29ycmVjdCIpOwpAQCAtMjA5Niw3ICsyMDgwLDggQEAKIAl9CiAJU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBTU1BfRElTQUJMRUQsIFNTUF9DUjFfTUFTS19TU0UsIDEpOwogCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgY2hpcF9pbmZvLT5oaWVyYXJjaHksIFNTUF9DUjFfTUFTS19NUywgMik7Ci0JU1NQX1dSSVRFX0JJVFMoY2hpcC0+Y3IxLCBjaGlwX2luZm8tPnNsYXZlX3R4X2Rpc2FibGUsIFNTUF9DUjFfTUFTS19TT0QsIDMpOworCVNTUF9XUklURV9CSVRTKGNoaXAtPmNyMSwgY2hpcF9pbmZvLT5zbGF2ZV90eF9kaXNhYmxlLCBTU1BfQ1IxX01BU0tfU09ELAorCQkzKTsKIAogCS8qIFNhdmUgY29udHJvbGxlcl9zdGF0ZSAqLwogCXNwaV9zZXRfY3RsZGF0YShzcGksIGNoaXApOwpAQCAtMjEyMiw3ICsyMTA3LDYgQEAKIAlrZnJlZShjaGlwKTsKIH0KIAotCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogcGwwMjJfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2LCBjb25zdCBzdHJ1Y3QgYW1iYV9pZCAqaWQpCiB7CkBAIC0yMTg2LDggKzIxNzAsNiBAQAogCX0KIAlwcmludGsoS0VSTl9JTkZPICJwbDAyMjogbWFwcGVkIHJlZ2lzdGVycyBmcm9tIDB4JTA4eCB0byAlcFxuIiwKIAkgICAgICAgYWRldi0+cmVzLnN0YXJ0LCBwbDAyMi0+dmlydGJhc2UpOwotCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKIAogCXBsMDIyLT5jbGsgPSBjbGtfZ2V0KCZhZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIocGwwMjItPmNsaykpIHsKQEAgLTIxOTYsNiArMjE3OCwxMiBAQAogCQlnb3RvIGVycl9ub19jbGs7CiAJfQogCisJc3RhdHVzID0gY2xrX3ByZXBhcmUocGwwMjItPmNsayk7CisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJjb3VsZCBub3QgcHJlcGFyZSBTU1AvU1BJIGJ1cyBjbG9ja1xuIik7CisJCWdvdG8gIGVycl9jbGtfcHJlcDsKKwl9CisKIAkvKiBEaXNhYmxlIFNTUCAqLwogCXdyaXRldygocmVhZHcoU1NQX0NSMShwbDAyMi0+dmlydGJhc2UpKSAmICh+U1NQX0NSMV9NQVNLX1NTRSkpLAogCSAgICAgICBTU1BfQ1IxKHBsMDIyLT52aXJ0YmFzZSkpOwpAQCAtMjIzNSwyMiArMjIyMywyMiBAQAogCQlnb3RvIGVycl9zcGlfcmVnaXN0ZXI7CiAJfQogCWRldl9kYmcoZGV2LCAicHJvYmUgc3VjY2VlZGVkXG4iKTsKLQkvKgotCSAqIERpc2FibGUgdGhlIHNpbGljb24gYmxvY2sgcGNsayBhbmQgYW55IHZvbHRhZ2UgZG9tYWluIGFuZCBqdXN0Ci0JICogcG93ZXIgaXQgdXAgYW5kIGNsb2NrIGl0IHdoZW4gaXQncyBuZWVkZWQKLQkgKi8KLQlhbWJhX3BjbGtfZGlzYWJsZShhZGV2KTsKLQlhbWJhX3Zjb3JlX2Rpc2FibGUoYWRldik7CisKKwkvKiBsZXQgcnVudGltZSBwbSBwdXQgc3VzcGVuZCAqLworCXBtX3J1bnRpbWVfcHV0KGRldik7CiAJcmV0dXJuIDA7CiAKICBlcnJfc3BpX3JlZ2lzdGVyOgogIGVycl9zdGFydF9xdWV1ZToKICBlcnJfaW5pdF9xdWV1ZToKIAlkZXN0cm95X3F1ZXVlKHBsMDIyKTsKLQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKKwlpZiAocGxhdGZvcm1faW5mby0+ZW5hYmxlX2RtYSkKKwkJcGwwMjJfZG1hX3JlbW92ZShwbDAyMik7CisKIAlmcmVlX2lycShhZGV2LT5pcnFbMF0sIHBsMDIyKTsKLQlwbV9ydW50aW1lX2Rpc2FibGUoJmFkZXYtPmRldik7CiAgZXJyX25vX2lycToKKwljbGtfdW5wcmVwYXJlKHBsMDIyLT5jbGspOworIGVycl9jbGtfcHJlcDoKIAljbGtfcHV0KHBsMDIyLT5jbGspOwogIGVycl9ub19jbGs6CiAJaW91bm1hcChwbDAyMi0+dmlydGJhc2UpOwpAQCAtMjI3MSwxMyArMjI1OSwyMiBAQAogCWlmICghcGwwMjIpCiAJCXJldHVybiAwOwogCisJLyoKKwkgKiB1bmRvIHBtX3J1bnRpbWVfcHV0KCkgaW4gcHJvYmUuICBJIGFzc3VtZSB0aGF0IHdlJ3JlIG5vdAorCSAqIGFjY2Vzc2luZyB0aGUgcHJpbWVjZWxsIGhlcmUuCisJICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmFkZXYtPmRldik7CisKIAkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCiAJaWYgKGRlc3Ryb3lfcXVldWUocGwwMjIpICE9IDApCiAJCWRldl9lcnIoJmFkZXYtPmRldiwgInF1ZXVlIHJlbW92ZSBmYWlsZWRcbiIpOwogCWxvYWRfc3NwX2RlZmF1bHRfY29uZmlnKHBsMDIyKTsKLQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKKwlpZiAocGwwMjItPm1hc3Rlcl9pbmZvLT5lbmFibGVfZG1hKQorCQlwbDAyMl9kbWFfcmVtb3ZlKHBsMDIyKTsKKwogCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgcGwwMjIpOwogCWNsa19kaXNhYmxlKHBsMDIyLT5jbGspOworCWNsa191bnByZXBhcmUocGwwMjItPmNsayk7CiAJY2xrX3B1dChwbDAyMi0+Y2xrKTsKIAlpb3VubWFwKHBsMDIyLT52aXJ0YmFzZSk7CiAJYW1iYV9yZWxlYXNlX3JlZ2lvbnMoYWRldik7CkBAIC0yMjg4LDQ2ICsyMjg1LDcwIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcGwwMjJfc3VzcGVuZChzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorc3RhdGljIGludCBwbDAyMl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gYW1iYV9nZXRfZHJ2ZGF0YShhZGV2KTsKKwlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlzdGF0dXMgPSBzdG9wX3F1ZXVlKHBsMDIyKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCWRldl93YXJuKCZhZGV2LT5kZXYsICJzdXNwZW5kIGNhbm5vdCBzdG9wIHF1ZXVlXG4iKTsKKwkJZGV2X3dhcm4oZGV2LCAic3VzcGVuZCBjYW5ub3Qgc3RvcCBxdWV1ZVxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JYW1iYV92Y29yZV9lbmFibGUoYWRldik7Ci0JYW1iYV9wY2xrX2VuYWJsZShhZGV2KTsKKwlhbWJhX3Zjb3JlX2VuYWJsZShwbDAyMi0+YWRldik7CisJYW1iYV9wY2xrX2VuYWJsZShwbDAyMi0+YWRldik7CiAJbG9hZF9zc3BfZGVmYXVsdF9jb25maWcocGwwMjIpOwotCWFtYmFfcGNsa19kaXNhYmxlKGFkZXYpOwotCWFtYmFfdmNvcmVfZGlzYWJsZShhZGV2KTsKLQlkZXZfZGJnKCZhZGV2LT5kZXYsICJzdXNwZW5kZWRcbiIpOworCWFtYmFfcGNsa19kaXNhYmxlKHBsMDIyLT5hZGV2KTsKKwlhbWJhX3Zjb3JlX2Rpc2FibGUocGwwMjItPmFkZXYpOworCWRldl9kYmcoZGV2LCAic3VzcGVuZGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwbDAyMl9yZXN1bWUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQorc3RhdGljIGludCBwbDAyMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBhbWJhX2dldF9kcnZkYXRhKGFkZXYpOworCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgc3RhdHVzID0gMDsKIAogCS8qIFN0YXJ0IHRoZSBxdWV1ZSBydW5uaW5nICovCiAJc3RhdHVzID0gc3RhcnRfcXVldWUocGwwMjIpOwogCWlmIChzdGF0dXMpCi0JCWRldl9lcnIoJmFkZXYtPmRldiwgInByb2JsZW0gc3RhcnRpbmcgcXVldWUgKCVkKVxuIiwgc3RhdHVzKTsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHF1ZXVlICglZClcbiIsIHN0YXR1cyk7CiAJZWxzZQotCQlkZXZfZGJnKCZhZGV2LT5kZXYsICJyZXN1bWVkXG4iKTsKKwkJZGV2X2RiZyhkZXYsICJyZXN1bWVkXG4iKTsKIAogCXJldHVybiBzdGF0dXM7CiB9Ci0jZWxzZQotI2RlZmluZSBwbDAyMl9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgcGwwMjJfcmVzdW1lIE5VTEwKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIAorI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCitzdGF0aWMgaW50IHBsMDIyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsMDIyICpwbDAyMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xrX2Rpc2FibGUocGwwMjItPmNsayk7CisJYW1iYV92Y29yZV9kaXNhYmxlKHBsMDIyLT5hZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDIyX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlhbWJhX3Zjb3JlX2VuYWJsZShwbDAyMi0+YWRldik7CisJY2xrX2VuYWJsZShwbDAyMi0+Y2xrKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbDAyMl9kZXZfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBsMDIyX3N1c3BlbmQsIHBsMDIyX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMocGwwMjJfcnVudGltZV9zdXNwZW5kLCBwbDAyMl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKK307CisKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX2FybSA9IHsKIAkuZmlmb2RlcHRoID0gOCwKIAkubWF4X2JwdyA9IDE2LApAQCAtMjMzNyw3ICsyMzU4LDYgQEAKIAkubG9vcGJhY2sgPSB0cnVlLAogfTsKIAotCiBzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9zdCA9IHsKIAkuZmlmb2RlcHRoID0gMzIsCiAJLm1heF9icHcgPSAzMiwKQEAgLTIzOTIsOSArMjQxMiw5IEBACiAJCSAqIGFuZCAzMiBsb2NhdGlvbnMgZGVlcCBUWC9SWCBGSUZPIGJ1dCBubyBleHRlbmRlZAogCQkgKiBDUjAvQ1IxIHJlZ2lzdGVyCiAJCSAqLwotCQkuaWQgICAgID0gMHgwMDA4MDAyMywKLQkJLm1hc2sgICA9IDB4ZmZmZmZmZmYsCi0JCS5kYXRhICAgPSAmdmVuZG9yX3N0X3BsMDIzLAorCQkuaWQJPSAweDAwMDgwMDIzLAorCQkubWFzawk9IDB4ZmZmZmZmZmYsCisJCS5kYXRhCT0gJnZlbmRvcl9zdF9wbDAyMywKIAl9LAogCXsKIAkJLmlkCT0gMHgxMDA4MDAyMywKQEAgLTI0MDcsMjcgKzI0MjcsMjMgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kcml2ZXIgcGwwMjJfZHJpdmVyID0gewogCS5kcnYgPSB7CiAJCS5uYW1lCT0gInNzcC1wbDAyMiIsCisJCS5wbQk9ICZwbDAyMl9kZXZfcG1fb3BzLAogCX0sCiAJLmlkX3RhYmxlCT0gcGwwMjJfaWRzLAogCS5wcm9iZQkJPSBwbDAyMl9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHBsMDIyX3JlbW92ZSksCi0JLnN1c3BlbmQgICAgICAgID0gcGwwMjJfc3VzcGVuZCwKLQkucmVzdW1lICAgICAgICAgPSBwbDAyMl9yZXN1bWUsCiB9OwogCi0KIHN0YXRpYyBpbnQgX19pbml0IHBsMDIyX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gYW1iYV9kcml2ZXJfcmVnaXN0ZXIoJnBsMDIyX2RyaXZlcik7CiB9Ci0KIHN1YnN5c19pbml0Y2FsbChwbDAyMl9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHBsMDIyX2V4aXQodm9pZCkKIHsKIAlhbWJhX2RyaXZlcl91bnJlZ2lzdGVyKCZwbDAyMl9kcml2ZXIpOwogfQotCiBtb2R1bGVfZXhpdChwbDAyMl9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBzdGVyaWNzc29uLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1wcGM0eHguYwppbmRleCBiMjY3ZmQ5Li45OGVjNTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHBjNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBwYzR4eC5jCkBAIC01MTQsNyArNTE0LDcgQEAKIAkvKiBSZXF1ZXN0IElSUSAqLwogCWh3LT5pcnFudW0gPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJcmV0ID0gcmVxdWVzdF9pcnEoaHctPmlycW51bSwgc3BpX3BwYzR4eF9pbnQsCi0JCQkgIElSUUZfRElTQUJMRUQsICJzcGlfcHBjNHh4X29mIiwgKHZvaWQgKilodyk7CisJCQkgIDAsICJzcGlfcHBjNHh4X29mIiwgKHZvaWQgKilodyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHRcbiIpOwogCQlnb3RvIGZyZWVfZ3Bpb3M7CkBAIC01OTQsMTggKzU5NCw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHNwaV9wcGM0eHhfb2ZfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNwaV9wcGM0eHhfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaV9wcGM0eHhfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHNwaV9wcGM0eHhfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfcHBjNHh4X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX3BwYzR4eF9vZl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoc3BpX3BwYzR4eF9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3BpX3BwYzR4eF9vZl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJHYXJ5IEplbm5lam9obiAmIFN0ZWZhbiBSb2VzZSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTaW1wbGUgUFBDNHh4IFNQSSBEcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXBjaS5jCmluZGV4IDM3OGU1MDQuLjhjYWEwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvcHhhMnh4X3NwaS5oPgogCiBzdHJ1Y3QgY2U0MTAwX2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1zM2MyNHh4LmMKaW5kZXggMTk5NmFjNS4uZmMwNjQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXMzYzI0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktczNjMjR4eC5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGkuaD4KQEAgLTUwNSw3ICs1MDYsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHMzYzI0eHhfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnBkYXRhOwogCXN0cnVjdCBzM2MyNHh4X3NwaSAqaHc7CkBAIC02NjEsNyArNjYyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBzM2MyNHh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgczNjMjR4eF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgczNjMjR4eF9zcGkgKmh3ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtNzE5LDI2ICs3MjAsMTUgQEAKIAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNDEwLXNwaSIpOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9zcGlfZHJpdmVyID0gewotCS5yZW1vdmUJCT0gX19leGl0X3AoczNjMjR4eF9zcGlfcmVtb3ZlKSwKKwkucHJvYmUJCT0gczNjMjR4eF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzM2MyNHh4X3NwaV9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzM2MyNDEwLXNwaSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkucG0JPSBTM0MyNFhYX1NQSV9QTU9QUywKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfaW5pdCh2b2lkKQotewotICAgICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzM2MyNHh4X3NwaV9kcml2ZXIsIHMzYzI0eHhfc3BpX3Byb2JlKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHMzYzI0eHhfc3BpX2V4aXQodm9pZCkKLXsKLSAgICAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0eHhfc3BpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHMzYzI0eHhfc3BpX2luaXQpOwotbW9kdWxlX2V4aXQoczNjMjR4eF9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHMzYzI0eHhfc3BpX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiUzNDMjRYWCBTUEkgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKaW5kZXggNTk1ZGFjYy4uMDE5YTcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCkBAIC0xMzEsNiArMTMxLDEyIEBACiAjZGVmaW5lIFJYQlVTWSAgICAoMTw8MikKICNkZWZpbmUgVFhCVVNZICAgICgxPDwzKQogCitzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgeworCXVuc2lnbmVkCQljaDsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CisJZW51bSBkbWFfY2gJZG1hY2g7Cit9OworCiAvKioKICAqIHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAtIFJ1bnRpbWUgaW5mbyBob2xkZXIgZm9yIFNQSSBkcml2ZXIuCiAgKiBAY2xrOiBQb2ludGVyIHRvIHRoZSBzcGkgY2xvY2suCkBAIC0xNjQsMTMgKzE3MCwxNCBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgICAgICAgICAgd29yazsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgIHF1ZXVlOwogCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICAgICAgbG9jazsKLQllbnVtIGRtYV9jaCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYWNoOwotCWVudW0gZG1hX2NoICAgICAgICAgICAgICAgICAgICAgdHhfZG1hY2g7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICBzZnJfc3RhcnQ7CiAJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICAgICB4ZmVyX2NvbXBsZXRpb247CiAJdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKIAl1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9tb2RlLCBjdXJfYnB3OwogCXVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3NwZWVkOworCXN0cnVjdCBzM2M2NHh4X3NwaV9kbWFfZGF0YQlyeF9kbWE7CisJc3RydWN0IHMzYzY0eHhfc3BpX2RtYV9kYXRhCXR4X2RtYTsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfb3BzCQkqb3BzOwogfTsKIAogc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjNjR4eF9zcGlfZG1hX2NsaWVudCA9IHsKQEAgLTIyNiw2ICsyMzMsNzggQEAKIAl3cml0ZWwodmFsLCByZWdzICsgUzNDNjRYWF9TUElfQ0hfQ0ZHKTsKIH0KIAorc3RhdGljIHZvaWQgczNjNjR4eF9zcGlfZG1hY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkbWEtPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCXNkZCA9IGNvbnRhaW5lcl9vZihkYXRhLAorCQkJc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhLCByeF9kbWEpOworCWVsc2UKKwkJc2RkID0gY29udGFpbmVyX29mKGRhdGEsCisJCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHR4X2RtYSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZG1hLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCXNkZC0+c3RhdGUgJj0gflJYQlVTWTsKKwkJaWYgKCEoc2RkLT5zdGF0ZSAmIFRYQlVTWSkpCisJCQljb21wbGV0ZSgmc2RkLT54ZmVyX2NvbXBsZXRpb24pOworCX0gZWxzZSB7CisJCXNkZC0+c3RhdGUgJj0gflRYQlVTWTsKKwkJaWYgKCEoc2RkLT5zdGF0ZSAmIFJYQlVTWSkpCisJCQljb21wbGV0ZSgmc2RkLT54ZmVyX2NvbXBsZXRpb24pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX2RtYShzdHJ1Y3QgczNjNjR4eF9zcGlfZG1hX2RhdGEgKmRtYSwKKwkJCQkJdW5zaWduZWQgbGVuLCBkbWFfYWRkcl90IGJ1ZikKK3sKKwlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZDsKKwlzdHJ1Y3Qgc2Ftc3VuZ19kbWFfcHJlcF9pbmZvIGluZm87CisKKwlpZiAoZG1hLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQorCQlzZGQgPSBjb250YWluZXJfb2YoKHZvaWQgKilkbWEsCisJCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHJ4X2RtYSk7CisJZWxzZQorCQlzZGQgPSBjb250YWluZXJfb2YoKHZvaWQgKilkbWEsCisJCQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEsIHR4X2RtYSk7CisKKwlpbmZvLmNhcCA9IERNQV9TTEFWRTsKKwlpbmZvLmxlbiA9IGxlbjsKKwlpbmZvLmZwID0gczNjNjR4eF9zcGlfZG1hY2I7CisJaW5mby5mcF9wYXJhbSA9IGRtYTsKKwlpbmZvLmRpcmVjdGlvbiA9IGRtYS0+ZGlyZWN0aW9uOworCWluZm8uYnVmID0gYnVmOworCisJc2RkLT5vcHMtPnByZXBhcmUoZG1hLT5jaCwgJmluZm8pOworCXNkZC0+b3BzLT50cmlnZ2VyKGRtYS0+Y2gpOworfQorCitzdGF0aWMgaW50IGFjcXVpcmVfZG1hKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkKQoreworCXN0cnVjdCBzYW1zdW5nX2RtYV9pbmZvIGluZm87CisKKwlzZGQtPm9wcyA9IHNhbXN1bmdfZG1hX2dldF9vcHMoKTsKKworCWluZm8uY2FwID0gRE1BX1NMQVZFOworCWluZm8uY2xpZW50ID0gJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQ7CisJaW5mby53aWR0aCA9IHNkZC0+Y3VyX2JwdyAvIDg7CisKKwlpbmZvLmRpcmVjdGlvbiA9IHNkZC0+cnhfZG1hLmRpcmVjdGlvbjsKKwlpbmZvLmZpZm8gPSBzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1JYX0RBVEE7CisJc2RkLT5yeF9kbWEuY2ggPSBzZGQtPm9wcy0+cmVxdWVzdChzZGQtPnJ4X2RtYS5kbWFjaCwgJmluZm8pOworCWluZm8uZGlyZWN0aW9uID0gIHNkZC0+dHhfZG1hLmRpcmVjdGlvbjsKKwlpbmZvLmZpZm8gPSBzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1RYX0RBVEE7CisJc2RkLT50eF9kbWEuY2ggPSBzZGQtPm9wcy0+cmVxdWVzdChzZGQtPnR4X2RtYS5kbWFjaCwgJmluZm8pOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyB2b2lkIGVuYWJsZV9kYXRhcGF0aChzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCwKIAkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAogCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIsIGludCBkbWFfbW9kZSkKQEAgLTI1OCwxMCArMzM3LDcgQEAKIAkJY2hjZmcgfD0gUzNDNjRYWF9TUElfQ0hfVFhDSF9PTjsKIAkJaWYgKGRtYV9tb2RlKSB7CiAJCQltb2RlY2ZnIHw9IFMzQzY0WFhfU1BJX01PREVfVFhETUFfT047Ci0JCQlzM2MyNDEwX2RtYV9jb25maWcoc2RkLT50eF9kbWFjaCwgc2RkLT5jdXJfYnB3IC8gOCk7Ci0JCQlzM2MyNDEwX2RtYV9lbnF1ZXVlKHNkZC0+dHhfZG1hY2gsICh2b2lkICopc2RkLAotCQkJCQkJeGZlci0+dHhfZG1hLCB4ZmVyLT5sZW4pOwotCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnR4X2RtYWNoLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKKwkJCXByZXBhcmVfZG1hKCZzZGQtPnR4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT50eF9kbWEpOwogCQl9IGVsc2UgewogCQkJc3dpdGNoIChzZGQtPmN1cl9icHcpIHsKIAkJCWNhc2UgMzI6CkBAIC0yOTMsMTAgKzM2OSw3IEBACiAJCQl3cml0ZWwoKCh4ZmVyLT5sZW4gKiA4IC8gc2RkLT5jdXJfYnB3KSAmIDB4ZmZmZikKIAkJCQkJfCBTM0M2NFhYX1NQSV9QQUNLRVRfQ05UX0VOLAogCQkJCQlyZWdzICsgUzNDNjRYWF9TUElfUEFDS0VUX0NOVCk7Ci0JCQlzM2MyNDEwX2RtYV9jb25maWcoc2RkLT5yeF9kbWFjaCwgc2RkLT5jdXJfYnB3IC8gOCk7Ci0JCQlzM2MyNDEwX2RtYV9lbnF1ZXVlKHNkZC0+cnhfZG1hY2gsICh2b2lkICopc2RkLAotCQkJCQkJeGZlci0+cnhfZG1hLCB4ZmVyLT5sZW4pOwotCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnJ4X2RtYWNoLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKKwkJCXByZXBhcmVfZG1hKCZzZGQtPnJ4X2RtYSwgeGZlci0+bGVuLCB4ZmVyLT5yeF9kbWEpOwogCQl9CiAJfQogCkBAIC00ODIsNDYgKzU1NSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFfcnhjYihzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiwgdm9pZCAqYnVmX2lkLAotCQkJCSBpbnQgc2l6ZSwgZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlcykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGJ1Zl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcyA9PSBTM0MyNDEwX1JFU19PSykKLQkJc2RkLT5zdGF0ZSAmPSB+UlhCVVNZOwotCWVsc2UKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJEbWFBYnJ0UngtJWRcbiIsIHNpemUpOwotCi0JLyogSWYgdGhlIG90aGVyIGRvbmUgKi8KLQlpZiAoIShzZGQtPnN0YXRlICYgVFhCVVNZKSkKLQkJY29tcGxldGUoJnNkZC0+eGZlcl9jb21wbGV0aW9uKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV9kbWFfdHhjYihzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbiwgdm9pZCAqYnVmX2lkLAotCQkJCSBpbnQgc2l6ZSwgZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlcykKLXsKLQlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGJ1Zl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNkZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHJlcyA9PSBTM0MyNDEwX1JFU19PSykKLQkJc2RkLT5zdGF0ZSAmPSB+VFhCVVNZOwotCWVsc2UKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJEbWFBYnJ0VHgtJWQgXG4iLCBzaXplKTsKLQotCS8qIElmIHRoZSBvdGhlciBkb25lICovCi0JaWYgKCEoc2RkLT5zdGF0ZSAmIFJYQlVTWSkpCi0JCWNvbXBsZXRlKCZzZGQtPnhmZXJfY29tcGxldGlvbik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGQtPmxvY2ssIGZsYWdzKTsKLX0KLQogI2RlZmluZSBYRkVSX0RNQUFERFJfSU5WQUxJRCBETUFfQklUX01BU0soMzIpCiAKIHN0YXRpYyBpbnQgczNjNjR4eF9zcGlfbWFwX21zc2coc3RydWN0IHMzYzY0eHhfc3BpX2RyaXZlcl9kYXRhICpzZGQsCkBAIC02OTYsMTIgKzcyOSwxMCBAQAogCQkJaWYgKHVzZV9kbWEpIHsKIAkJCQlpZiAoeGZlci0+dHhfYnVmICE9IE5VTEwKIAkJCQkJCSYmIChzZGQtPnN0YXRlICYgVFhCVVNZKSkKLQkJCQkJczNjMjQxMF9kbWFfY3RybChzZGQtPnR4X2RtYWNoLAotCQkJCQkJCVMzQzI0MTBfRE1BT1BfRkxVU0gpOworCQkJCQlzZGQtPm9wcy0+c3RvcChzZGQtPnR4X2RtYS5jaCk7CiAJCQkJaWYgKHhmZXItPnJ4X2J1ZiAhPSBOVUxMCiAJCQkJCQkmJiAoc2RkLT5zdGF0ZSAmIFJYQlVTWSkpCi0JCQkJCXMzYzI0MTBfZG1hX2N0cmwoc2RkLT5yeF9kbWFjaCwKLQkJCQkJCQlTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKKwkJCQkJc2RkLT5vcHMtPnN0b3Aoc2RkLT5yeF9kbWEuY2gpOwogCQkJfQogCiAJCQlnb3RvIG91dDsKQEAgLTczOSwzMCArNzcwLDYgQEAKIAkJbXNnLT5jb21wbGV0ZShtc2ctPmNvbnRleHQpOwogfQogCi1zdGF0aWMgaW50IGFjcXVpcmVfZG1hKHN0cnVjdCBzM2M2NHh4X3NwaV9kcml2ZXJfZGF0YSAqc2RkKQotewotCWlmIChzM2MyNDEwX2RtYV9yZXF1ZXN0KHNkZC0+cnhfZG1hY2gsCi0JCQkJCSZzM2M2NHh4X3NwaV9kbWFfY2xpZW50LCBOVUxMKSA8IDApIHsKLQkJZGV2X2Vycigmc2RkLT5wZGV2LT5kZXYsICJjYW5ub3QgZ2V0IFJ4RE1BXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihzZGQtPnJ4X2RtYWNoLCBzM2M2NHh4X3NwaV9kbWFfcnhjYik7Ci0JczNjMjQxMF9kbWFfZGV2Y29uZmlnKHNkZC0+cnhfZG1hY2gsIFMzQzI0MTBfRE1BU1JDX0hXLAotCQkJCQlzZGQtPnNmcl9zdGFydCArIFMzQzY0WFhfU1BJX1JYX0RBVEEpOwotCi0JaWYgKHMzYzI0MTBfZG1hX3JlcXVlc3Qoc2RkLT50eF9kbWFjaCwKLQkJCQkJJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQsIE5VTEwpIDwgMCkgewotCQlkZXZfZXJyKCZzZGQtPnBkZXYtPmRldiwgImNhbm5vdCBnZXQgVHhETUFcbiIpOwotCQlzM2MyNDEwX2RtYV9mcmVlKHNkZC0+cnhfZG1hY2gsICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihzZGQtPnR4X2RtYWNoLCBzM2M2NHh4X3NwaV9kbWFfdHhjYik7Ci0JczNjMjQxMF9kbWFfZGV2Y29uZmlnKHNkZC0+dHhfZG1hY2gsIFMzQzI0MTBfRE1BU1JDX01FTSwKLQkJCQkJc2RkLT5zZnJfc3RhcnQgKyBTM0M2NFhYX1NQSV9UWF9EQVRBKTsKLQotCXJldHVybiAxOwotfQotCiBzdGF0aWMgdm9pZCBzM2M2NHh4X3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgczNjNjR4eF9zcGlfZHJpdmVyX2RhdGEgKnNkZCA9IGNvbnRhaW5lcl9vZih3b3JrLApAQCAtNzk5LDggKzgwNiw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RkLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBGcmVlIERNQSBjaGFubmVscyAqLwotCXMzYzI0MTBfZG1hX2ZyZWUoc2RkLT50eF9kbWFjaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOwotCXMzYzI0MTBfZG1hX2ZyZWUoc2RkLT5yeF9kbWFjaCwgJnMzYzY0eHhfc3BpX2RtYV9jbGllbnQpOworCXNkZC0+b3BzLT5yZWxlYXNlKHNkZC0+cnhfZG1hLmNoLCAmczNjNjR4eF9zcGlfZG1hX2NsaWVudCk7CisJc2RkLT5vcHMtPnJlbGVhc2Uoc2RkLT50eF9kbWEuY2gsICZzM2M2NHh4X3NwaV9kbWFfY2xpZW50KTsKIH0KIAogc3RhdGljIGludCBzM2M2NHh4X3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLApAQCAtMTAxNyw4ICsxMDI0LDEwIEBACiAJc2RkLT5jbnRybHJfaW5mbyA9IHNjaTsKIAlzZGQtPnBkZXYgPSBwZGV2OwogCXNkZC0+c2ZyX3N0YXJ0ID0gbWVtX3Jlcy0+c3RhcnQ7Ci0Jc2RkLT50eF9kbWFjaCA9IGRtYXR4X3Jlcy0+c3RhcnQ7Ci0Jc2RkLT5yeF9kbWFjaCA9IGRtYXJ4X3Jlcy0+c3RhcnQ7CisJc2RkLT50eF9kbWEuZG1hY2ggPSBkbWF0eF9yZXMtPnN0YXJ0OworCXNkZC0+dHhfZG1hLmRpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CisJc2RkLT5yeF9kbWEuZG1hY2ggPSBkbWFyeF9yZXMtPnN0YXJ0OworCXNkZC0+cnhfZG1hLmRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAogCXNkZC0+Y3VyX2JwdyA9IDg7CiAKQEAgLTExMDYsNyArMTExNSw3IEBACiAJCQkJCXBkZXYtPmlkLCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0KTsKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJcdElPbWVtPVsweCV4LTB4JXhdXHRETUE9W1J4LSVkLCBUeC0lZF1cbiIsCiAJCQkJCW1lbV9yZXMtPmVuZCwgbWVtX3Jlcy0+c3RhcnQsCi0JCQkJCXNkZC0+cnhfZG1hY2gsIHNkZC0+dHhfZG1hY2gpOworCQkJCQlzZGQtPnJ4X2RtYS5kbWFjaCwgc2RkLT50eF9kbWEuZG1hY2gpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jIGIvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKaW5kZXggZTAwZDk0Yi4uMWY0NjZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXNoLW1zaW9mLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIApAQCAtNjM1LDcgKzYzNiw3IEBACiAJCWdvdG8gZXJyMjsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpLCBzaF9tc2lvZl9zcGlfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGksIHNoX21zaW9mX3NwaV9pcnEsIDAsCiAJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IGlycVxuIik7CkBAIC03MzAsMTggKzczMSw3IEBACiAJCS5wbQkJPSAmc2hfbXNpb2Zfc3BpX2Rldl9wbV9vcHMsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNoX21zaW9mX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hfbXNpb2Zfc3BpX2Rydik7Ci19Ci1tb2R1bGVfaW5pdChzaF9tc2lvZl9zcGlfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzaF9tc2lvZl9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9tc2lvZl9zcGlfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KHNoX21zaW9mX3NwaV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2hfbXNpb2Zfc3BpX2Rydik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIE1TSU9GIFNQSSBNYXN0ZXIgSW50ZXJmYWNlIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWFnbnVzIERhbW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYwppbmRleCBlNzc3OWMwLi4wOTdlNTA2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNoLXNjaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1zY2kuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTg2LDE4ICsxODcsNyBAQAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc2hfc2NpX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hfc2NpX3NwaV9kcnYpOwotfQotbW9kdWxlX2luaXQoc2hfc2NpX3NwaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNoX3NjaV9zcGlfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9zY2lfc3BpX2Rydik7Ci19Ci1tb2R1bGVfZXhpdChzaF9zY2lfc3BpX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaF9zY2lfc3BpX2Rydik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU0ggU0NJIFNQSSBEcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2guYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC5jCmluZGV4IDllZWRkNzEuLjcwYzhhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC5jCkBAIC00ODQsNyArNDg0LDcgQEAKIAkJZ290byBlcnJvcjI7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBzcGlfc2hfaXJxLCBJUlFGX0RJU0FCTEVELCAic3BpX3NoIiwgc3MpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgc3BpX3NoX2lycSwgMCwgInNwaV9zaCIsIHNzKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0X2lycSBlcnJvclxuIik7CiAJCWdvdG8gZXJyb3IzOwpAQCAtNTI0LDE4ICs1MjQsNyBAQAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX3NoX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzcGlfc2hfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHNwaV9zaF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNwaV9zaF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwaV9zaF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoc3BpX3NoX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzcGlfc2hfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTSCBTUEkgYnVzIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXN0bXAuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdG1wLmMKaW5kZXggZmFkZmY3Ni4uNThlMzg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXN0bXAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc3RtcC5jCkBAIC02NTksMTkgKzY1OSw4IEBACiAJLnN1c3BlbmQgPSBzdG1wX3NwaV9zdXNwZW5kLAogCS5yZXN1bWUgID0gc3RtcF9zcGlfcmVzdW1lLAogfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RtcF9zcGlfZHJpdmVyKTsKIAotc3RhdGljIGludCBfX2luaXQgc3RtcF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN0bXBfc3BpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzdG1wX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0bXBfc3BpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHN0bXBfc3BpX2luaXQpOwotbW9kdWxlX2V4aXQoc3RtcF9zcGlfZXhpdCk7CiBtb2R1bGVfcGFyYW0ocGlvLCBpbnQsIFNfSVJVR08pOwogbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX0FVVEhPUigiZG1pdHJ5IHBlcnZ1c2hpbiA8ZHBlcnZ1c2hpbkBlbWJlZGRlZGFsbGV5LmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10ZWdyYS5jIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMKaW5kZXggYTVhNjMwMi4uYWU2ZDc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRlZ3JhLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtNDY0LDcgKzQ2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNwaV90ZWdyYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc3BpX3RlZ3JhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKIAlzdHJ1Y3Qgc3BpX3RlZ3JhX2RhdGEJKnRzcGk7CkBAIC02MTIsMTkgKzYxMyw5IEBACiAJCS5vd25lciA9CVRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBzcGlfdGVncmFfb2ZfbWF0Y2hfdGFibGUsCiAJfSwKKwkucHJvYmUgPQlzcGlfdGVncmFfcHJvYmUsCiAJLnJlbW92ZSA9CV9fZGV2ZXhpdF9wKHNwaV90ZWdyYV9yZW1vdmUpLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgc3BpX3RlZ3JhX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzcGlfdGVncmFfZHJpdmVyLCBzcGlfdGVncmFfcHJvYmUpOwotfQotbW9kdWxlX2luaXQoc3BpX3RlZ3JhX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX3RlZ3JhX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX3RlZ3JhX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfdGVncmFfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNwaV90ZWdyYV9kcml2ZXIpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMgYi9kcml2ZXJzL3NwaS9zcGktdGktc3NwLmMKaW5kZXggZWUyMjc5NS4uM2Y2ZjZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRpLXNzcC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS10aS1zc3AuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdGlfc3NwLmg+CkBAIC0zODMsMTggKzM4NCw3IEBACiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0aV9zc3Bfc3BpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0aV9zc3Bfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdCh0aV9zc3Bfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGlfc3NwX3NwaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpX3NzcF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHRpX3NzcF9zcGlfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRpX3NzcF9zcGlfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTU1AgU1BJIE1hc3RlciIpOwogTU9EVUxFX0FVVEhPUigiQ3lyaWwgQ2hlbXBhcmF0aHkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS10bGU2MngwLmMgYi9kcml2ZXJzL3NwaS9zcGktdGxlNjJ4MC5jCmluZGV4IDk0MGU3M2QuLjBjZTVjMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS10bGU2MngwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXRsZTYyeDAuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKaW5kZXggZjBhMmFiMC4uZDVhM2NiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYyBiL2RyaXZlcnMvc3BpL3NwaS14aWxpbnguYwppbmRleCA0ZDJjNzVkLi40YzVhNjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkteGlsaW54LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXhpbGlueC5jCkBAIC01MzgsMTggKzUzOCw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHhpbGlueF9zcGlfb2ZfbWF0Y2gsCiAJfSwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHhpbGlueF9zcGlfcGx0Zm1faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnhpbGlueF9zcGlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHhpbGlueF9zcGlfcGx0Zm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB4aWxpbnhfc3BpX3BsdGZtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoeGlsaW54X3NwaV9wbHRmbV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGlsaW54X3NwaV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFNQSSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggNGQxYjlmNS4uNzdlYWU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgdm9pZCBzcGlkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9iNDNfcGNpX2JyaWRnZS5jIGIvZHJpdmVycy9zc2IvYjQzX3BjaV9icmlkZ2UuYwppbmRleCBiZjUzZTQ0Li5iYWQ3YmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9iNDNfcGNpX2JyaWRnZS5jCisrKyBiL2RyaXZlcnMvc3NiL2I0M19wY2lfYnJpZGdlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogCiAjaW5jbHVkZSAic3NiX3ByaXZhdGUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfY2hpcGNvbW1vbi5jCmluZGV4IDVkOWM5N2MuLmU5ZDJjYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb24uYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfcmVncy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSAic3NiX3ByaXZhdGUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9jaGlwY29tbW9uX3BtdS5jIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKaW5kZXggNTI5MDFjMS4uZTVhMmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2NoaXBjb21tb25fcG11LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX3JlZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX2RyaXZlcl9jaGlwY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInNzYl9wcml2YXRlLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9naWdlLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfZ2lnZS5jCmluZGV4IDNhZGI5OGQuLmYzMGVhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9naWdlLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX2dpZ2UuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZHJpdmVyX2dpZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCmluZGV4IGU2YWMzMTcuLjUyMGU4MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9lbWJlZGRlZC5oPgogCkBAIC01MTYsMTAgKzUxNywxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc3NiX3BjaWNvcmVfaW5pdF9jbGllbnRtb2RlKHN0cnVjdCBzc2JfcGNpY29yZSAqcGMpCiB7Ci0Jc3NiX3BjaWNvcmVfZml4X3Nwcm9tX2NvcmVfaW5kZXgocGMpOworCXN0cnVjdCBzc2JfZGV2aWNlICpwZGV2ID0gcGMtPmRldjsKKwlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gcGRldi0+YnVzOworCisJaWYgKGJ1cy0+YnVzdHlwZSA9PSBTU0JfQlVTVFlQRV9QQ0kpCisJCXNzYl9wY2ljb3JlX2ZpeF9zcHJvbV9jb3JlX2luZGV4KHBjKTsKIAogCS8qIERpc2FibGUgUENJIGludGVycnVwdHMuICovCi0Jc3NiX3dyaXRlMzIocGMtPmRldiwgU1NCX0lOVFZFQywgMCk7CisJc3NiX3dyaXRlMzIocGRldiwgU1NCX0lOVFZFQywgMCk7CiAKIAkvKiBBZGRpdGlvbmFsIFBDSWUgYWx3YXlzIG9uY2UtZXhlY3V0ZWQgd29ya2Fyb3VuZHMgKi8KIAlpZiAocGMtPmRldi0+aWQuY29yZWlkID09IFNTQl9ERVZfUENJRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvZW1iZWRkZWQuYyBiL2RyaXZlcnMvc3NiL2VtYmVkZGVkLmMKaW5kZXggZWVjM2UyNi4uOWVmMTI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvZW1iZWRkZWQuYworKysgYi9kcml2ZXJzL3NzYi9lbWJlZGRlZC5jCkBAIC04LDYgKzgsNyBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVS9HUEwuIFNlZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9lbWJlZGRlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2JfZHJpdmVyX3BjaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvbWFpbi5jIGIvZHJpdmVycy9zc2IvbWFpbi5jCmluZGV4IGQwY2JkYjAuLmJiNjMxN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL21haW4uYworKysgYi9kcml2ZXJzL3NzYi9tYWluLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9yZWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc3NiL3NzYl9kcml2ZXJfZ2lnZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvcGNpLmMgYi9kcml2ZXJzL3NzYi9wY2kuYwppbmRleCAzNGMzYmFiLi45NzMyMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9wY2kuYworKysgYi9kcml2ZXJzL3NzYi9wY2kuYwpAQCAtNjA3LDYgKzYwNywyOSBAQAogCW1lbWNweSgmb3V0LT5hbnRlbm5hX2dhaW4uZ2h6NSwgJm91dC0+YW50ZW5uYV9nYWluLmdoejI0LAogCSAgICAgICBzaXplb2Yob3V0LT5hbnRlbm5hX2dhaW4uZ2h6NSkpOwogCisJLyogRXh0cmFjdCBGRU0gaW5mbyAqLworCVNQRVgoZmVtLmdoejIudHNzaXBvcywgU1NCX1NQUk9NOF9GRU0yRywKKwkJU1NCX1NST004X0ZFTV9UU1NJUE9TLCBTU0JfU1JPTThfRkVNX1RTU0lQT1NfU0hJRlQpOworCVNQRVgoZmVtLmdoejIuZXh0cGFfZ2FpbiwgU1NCX1NQUk9NOF9GRU0yRywKKwkJU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOLCBTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU5fU0hJRlQpOworCVNQRVgoZmVtLmdoejIucGRldF9yYW5nZSwgU1NCX1NQUk9NOF9GRU0yRywKKwkJU1NCX1NST004X0ZFTV9QREVUX1JBTkdFLCBTU0JfU1JPTThfRkVNX1BERVRfUkFOR0VfU0hJRlQpOworCVNQRVgoZmVtLmdoejIudHJfaXNvLCBTU0JfU1BST004X0ZFTTJHLAorCQlTU0JfU1JPTThfRkVNX1RSX0lTTywgU1NCX1NST004X0ZFTV9UUl9JU09fU0hJRlQpOworCVNQRVgoZmVtLmdoejIuYW50c3dsdXQsIFNTQl9TUFJPTThfRkVNMkcsCisJCVNTQl9TUk9NOF9GRU1fQU5UU1dMVVQsIFNTQl9TUk9NOF9GRU1fQU5UU1dMVVRfU0hJRlQpOworCisJU1BFWChmZW0uZ2h6NS50c3NpcG9zLCBTU0JfU1BST004X0ZFTTVHLAorCQlTU0JfU1JPTThfRkVNX1RTU0lQT1MsIFNTQl9TUk9NOF9GRU1fVFNTSVBPU19TSElGVCk7CisJU1BFWChmZW0uZ2h6NS5leHRwYV9nYWluLCBTU0JfU1BST004X0ZFTTVHLAorCQlTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU4sIFNTQl9TUk9NOF9GRU1fRVhUUEFfR0FJTl9TSElGVCk7CisJU1BFWChmZW0uZ2h6NS5wZGV0X3JhbmdlLCBTU0JfU1BST004X0ZFTTVHLAorCQlTU0JfU1JPTThfRkVNX1BERVRfUkFOR0UsIFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRV9TSElGVCk7CisJU1BFWChmZW0uZ2h6NS50cl9pc28sIFNTQl9TUFJPTThfRkVNNUcsCisJCVNTQl9TUk9NOF9GRU1fVFJfSVNPLCBTU0JfU1JPTThfRkVNX1RSX0lTT19TSElGVCk7CisJU1BFWChmZW0uZ2h6NS5hbnRzd2x1dCwgU1NCX1NQUk9NOF9GRU01RywKKwkJU1NCX1NST004X0ZFTV9BTlRTV0xVVCwgU1NCX1NST004X0ZFTV9BTlRTV0xVVF9TSElGVCk7CisKIAlzcHJvbV9leHRyYWN0X3I0NTgob3V0LCBpbik7CiAKIAkvKiBUT0RPIC0gZ2V0IHJlbWFpbmluZyByZXYgOCBzdHVmZiBuZWVkZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL3BjaWhvc3Rfd3JhcHBlci5jIGIvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKaW5kZXggMTE2YTgxMS4uYWY1NDQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKKysrIGIvZHJpdmVycy9zc2IvcGNpaG9zdF93cmFwcGVyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NzYi9zc2IuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA4OWU1MDM5Li4yNWNkZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtMzAsMTQgKzMwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90bTYwMDAvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy91c2JpcC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWciCkBAIC03NCw4ICs2Niw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2xpbmU2L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29jdGVvbi9LY29uZmlnIgpAQCAtMTA4LDIwICs5OCwxMiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy94Z2lmYi9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9saXJjL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcXVpY2tzdGFydC9LY29uZmlnIgpAQCAtMTQ0LDEwICsxMjYsMTAgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ21hNTAwL0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCBkN2E1YTA0Li5hMjVmM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC00LDEzICs0LDkgQEAKIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy5vCiAKIG9iai15CQkJCSs9IHNlcmlhbC8KK29iai15CQkJCSs9IG1lZGlhLwogb2JqLSQoQ09ORklHX0VUMTMxWCkJCSs9IGV0MTMxeC8KIG9iai0kKENPTkZJR19TTElDT1NTKQkJKz0gc2xpY29zcy8KLW9iai0kKENPTkZJR19WSURFT19HTzcwMDcpCSs9IGdvNzAwNy8KLW9iai0kKENPTkZJR19WSURFT19DWDI1ODIxKQkrPSBjeDI1ODIxLwotb2JqLSQoQ09ORklHX1ZJREVPX1RNNjAwMCkJKz0gdG02MDAwLwotb2JqLSQoQ09ORklHX0RWQl9DWEQyMDk5KQkrPSBjeGQyMDk5Lwotb2JqLSQoQ09ORklHX0xJUkNfU1RBR0lORykJKz0gbGlyYy8KIG9iai0kKENPTkZJR19VU0JJUF9DT1JFKQkrPSB1c2JpcC8KIG9iai0kKENPTkZJR19XMzVVTkQpCQkrPSB3aW5ib25kLwogb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpCSs9IHdsYW4tbmcvCkBAIC00NSwxMiArNDEsOSBAQAogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lwogb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203eHgvCi1vYmotJChDT05GSUdfVklERU9fRFQzMTU1KQkrPSBkdDMxNTV2NGwvCiBvYmotJChDT05GSUdfQ1JZU1RBTEhEKQkJKz0gY3J5c3RhbGhkLwogb2JqLSQoQ09ORklHX0NYVDFFMSkJCSs9IGN4dDFlMS8KIG9iai0kKENPTkZJR19GQl9YR0kpCQkrPSB4Z2lmYi8KLW9iai0kKENPTkZJR19FQVNZQ0FQKQkJKz0gZWFzeWNhcC8KLW9iai0kKENPTkZJR19TT0xPNlgxMCkJCSs9IHNvbG82eDEwLwogb2JqLSQoQ09ORklHX1RJRFNQQlJJREdFKQkrPSB0aWRzcGJyaWRnZS8KIG9iai0kKENPTkZJR19BQ1BJX1FVSUNLU1RBUlQpCSs9IHF1aWNrc3RhcnQvCiBvYmotJChDT05GSUdfU0JFXzJUM0UzKQkJKz0gc2JlLTJ0M2UzLwpAQCAtNTksNyArNTIsNiBAQAogb2JqLSQoQ09ORklHX0ZUMTAwMCkJCSs9IGZ0MTAwMC8KIG9iai0kKENPTkZJR19TTkRfSU5URUxfU1NUKQkrPSBpbnRlbF9zc3QvCiBvYmotJChDT05GSUdfU1BFQUtVUCkJCSs9IHNwZWFrdXAvCi1vYmotJChDT05GSUdfQUxURVJBX1NUQVBMKQkrPWFsdGVyYS1zdGFwbC8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNwdG0xMjE3Lwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NZTkFQVElDU19JMkNfUk1JNCkJKz0gc3RlX3JtaTQvCiBvYmotJChDT05GSUdfRFJNX1BTQikJCSs9IGdtYTUwMC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1MzczMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWNvbmZpZyBBTFRFUkFfU1RBUEwKLQl0cmlzdGF0ZSAiQWx0ZXJhIEZQR0EgZmlybXdhcmUgZG93bmxvYWQgbW9kdWxlIgotCWRlcGVuZHMgb24gSTJDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgQW4gQWx0ZXJhIEZQR0EgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0b29sLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZWVkZTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYWx0ZXJhLXN0YXBsLXkgOj0gYWx0ZXJhLWxwdC5vIGFsdGVyYS1qdGFnLm8gYWx0ZXJhLWNvbXAubyBhbHRlcmEubwotCi1vYmotJChDT05GSUdfQUxURVJBX1NUQVBMKSArPSBhbHRlcmEtc3RhcGwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jIGIvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEtanRhZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjE2MjBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLWp0YWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoKLSAqIGFsdGVyYS1qdGFnLmMKLSAqCi0gKiBhbHRlcmEgRlBHQSBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIEFsdGVyYSBDb3Jwb3JhdGlvbiAxOTk4LTIwMDEKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOZXRVUCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdvciBNLiBMaXBsaWFuaW4gPGxpcGxpYW5pbkBuZXR1cC5ydT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAiYWx0ZXJhLmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKLQotI2RlZmluZQlhbHRfanRhZ19pbyhhLCBiLCBjKVwKLQkJYXN0YXRlLT5jb25maWctPmp0YWdfaW8oYXN0YXRlLT5jb25maWctPmRldiwgYSwgYiwgYyk7Ci0KLSNkZWZpbmUJYWx0X21hbGxvYyhhKQlremFsbG9jKGEsIEdGUF9LRVJORUwpOwotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgc2hvd3MsIGZvciBlYWNoIEpUQUcgc3RhdGUsIHdoaWNoIHN0YXRlIGlzIHJlYWNoZWQgYWZ0ZXIKLSAqIGEgc2luZ2xlIFRDSyBjbG9jayBjeWNsZSB3aXRoIFRNUyBoaWdoIG9yIFRNUyBsb3csIHJlc3BlY3RpdmVseS4gIFRoaXMKLSAqIGRlc2NyaWJlcyBhbGwgcG9zc2libGUgc3RhdGUgdHJhbnNpdGlvbnMgaW4gdGhlIEpUQUcgc3RhdGUgbWFjaGluZS4KLSAqLwotc3RydWN0IGFsdGVyYV9qdGFnX21hY2hpbmUgewotCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgdG1zX2hpZ2g7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB0bXNfbG93OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHRlcmFfanRhZ19tYWNoaW5lIGFsdGVyYV90cmFuc2l0aW9uc1tdID0gewotCS8qIFJFU0VUICAgICAqLwl7IFJFU0VULAlJRExFIH0sCi0JLyogSURMRSAgICAgICovCXsgRFJTRUxFQ1QsCUlETEUgfSwKLQkvKiBEUlNFTEVDVCAgKi8JeyBJUlNFTEVDVCwJRFJDQVBUVVJFIH0sCi0JLyogRFJDQVBUVVJFICovCXsgRFJFWElUMSwJRFJTSElGVCB9LAotCS8qIERSU0hJRlQgICAqLwl7IERSRVhJVDEsCURSU0hJRlQgfSwKLQkvKiBEUkVYSVQxICAgKi8JeyBEUlVQREFURSwJRFJQQVVTRSB9LAotCS8qIERSUEFVU0UgICAqLwl7IERSRVhJVDIsCURSUEFVU0UgfSwKLQkvKiBEUkVYSVQyICAgKi8JeyBEUlVQREFURSwJRFJTSElGVCB9LAotCS8qIERSVVBEQVRFICAqLwl7IERSU0VMRUNULAlJRExFIH0sCi0JLyogSVJTRUxFQ1QgICovCXsgUkVTRVQsCUlSQ0FQVFVSRSB9LAotCS8qIElSQ0FQVFVSRSAqLwl7IElSRVhJVDEsCUlSU0hJRlQgfSwKLQkvKiBJUlNISUZUICAgKi8JeyBJUkVYSVQxLAlJUlNISUZUIH0sCi0JLyogSVJFWElUMSAgICovCXsgSVJVUERBVEUsCUlSUEFVU0UgfSwKLQkvKiBJUlBBVVNFICAgKi8JeyBJUkVYSVQyLAlJUlBBVVNFIH0sCi0JLyogSVJFWElUMiAgICovCXsgSVJVUERBVEUsCUlSU0hJRlQgfSwKLQkvKiBJUlVQREFURSAgKi8JeyBEUlNFTEVDVCwJSURMRSB9Ci19OwotCi0vKgotICogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgVE1TIHZhbHVlIHRvIGJlIHVzZWQgdG8gdGFrZSB0aGUgTkVYVCBTVEVQIG9uCi0gKiB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBzdGF0ZS4gIFRoZSBhcnJheSBpbmRleCBpcyB0aGUgY3VycmVudCBzdGF0ZSwKLSAqIGFuZCB0aGUgYml0IHBvc2l0aW9uIGlzIHRoZSBkZXNpcmVkIGVuZHN0YXRlLiAgVG8gZmluZCBvdXQgd2hpY2ggc3RhdGUKLSAqIGlzIHVzZWQgYXMgdGhlIGludGVybWVkaWF0ZSBzdGF0ZSwgbG9vayB1cCB0aGUgVE1TIHZhbHVlIGluIHRoZQotICogYWx0ZXJhX3RyYW5zaXRpb25zW10gdGFibGUuCi0gKi8KLXN0YXRpYyBjb25zdCB1MTYgYWx0ZXJhX2p0YWdfcGF0aF9tYXBbMTZdID0gewotCS8qIFJTVAlSVEkJU0RSUwlDRFIJU0RSCUUxRFIJUERSCUUyRFIgKi8KLQkweDAwMDEsCTB4RkZGRCwJMHhGRTAxLAkweEZGRTcsCTB4RkZFRiwJMHhGRjBGLAkweEZGQkYsCTB4RkZGRiwKLQkvKiBVRFIJU0lSUwlDSVIJU0lSCUUxSVIJUElSCUUySVIJVUlSICovCi0JMHhGRUZELAkweDAwMDEsCTB4RjNGRiwJMHhGN0ZGLAkweDg3RkYsCTB4REZGRiwJMHhGRkZGLAkweDdGRkQKLX07Ci0KLS8qIEZsYWcgYml0cyBmb3IgYWx0X2p0YWdfaW8oKSBmdW5jdGlvbiAqLwotI2RlZmluZSBUTVNfSElHSCAgIDEKLSNkZWZpbmUgVE1TX0xPVyAgICAwCi0jZGVmaW5lIFRESV9ISUdIICAgMQotI2RlZmluZSBURElfTE9XICAgIDAKLSNkZWZpbmUgUkVBRF9URE8gICAxCi0jZGVmaW5lIElHTk9SRV9URE8gMAotCi1pbnQgYWx0ZXJhX2ppbml0KHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0KLQkvKiBpbml0aWFsIEpUQUcgc3RhdGUgaXMgdW5rbm93biAqLwotCWpzLT5qdGFnX3N0YXRlID0gSUxMRUdBTF9KVEFHX1NUQVRFOwotCi0JLyogaW5pdGlhbGl6ZSB0byBkZWZhdWx0IHN0YXRlICovCi0JanMtPmRyc3RvcF9zdGF0ZSA9IElETEU7Ci0JanMtPmlyc3RvcF9zdGF0ZSA9IElETEU7Ci0JanMtPmRyX3ByZSAgPSAwOwotCWpzLT5kcl9wb3N0ID0gMDsKLQlqcy0+aXJfcHJlICA9IDA7Ci0JanMtPmlyX3Bvc3QgPSAwOwotCWpzLT5kcl9sZW5ndGggICAgPSAwOwotCWpzLT5pcl9sZW5ndGggICAgPSAwOwotCi0JanMtPmRyX3ByZV9kYXRhICA9IE5VTEw7Ci0JanMtPmRyX3Bvc3RfZGF0YSA9IE5VTEw7Ci0JanMtPmlyX3ByZV9kYXRhICA9IE5VTEw7Ci0JanMtPmlyX3Bvc3RfZGF0YSA9IE5VTEw7Ci0JanMtPmRyX2J1ZmZlcgkgPSBOVUxMOwotCWpzLT5pcl9idWZmZXIJID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYWx0ZXJhX3NldF9kcnN0b3Aoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGF0ZSkKLXsKLQlqcy0+ZHJzdG9wX3N0YXRlID0gc3RhdGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGFsdGVyYV9zZXRfaXJzdG9wKHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIGVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhdGUpCi17Ci0JanMtPmlyc3RvcF9zdGF0ZSA9IHN0YXRlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2RyX3ByZShzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLAotCQkJCXUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAotCQkJCXU4ICpwcmVhbWJsZV9kYXRhKQotewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBpOwotCXUzMiBqOwotCi0JaWYgKGNvdW50ID4ganMtPmRyX3ByZSkgewotCQlrZnJlZShqcy0+ZHJfcHJlX2RhdGEpOwotCQlqcy0+ZHJfcHJlX2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOwotCQlpZiAoanMtPmRyX3ByZV9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+ZHJfcHJlID0gY291bnQ7Ci0JfSBlbHNlCi0JCWpzLT5kcl9wcmUgPSBjb3VudDsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaiA9IGkgKyBzdGFydF9pbmRleDsKLQotCQkJaWYgKHByZWFtYmxlX2RhdGEgPT0gTlVMTCkKLQkJCQlqcy0+ZHJfcHJlX2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCWVsc2UgewotCQkJCWlmIChwcmVhbWJsZV9kYXRhW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKLQkJCQkJanMtPmRyX3ByZV9kYXRhW2kgPj4gM10gfD0KLQkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCWpzLT5kcl9wcmVfZGF0YVtpID4+IDNdICY9Ci0JCQkJCQkJfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2lyX3ByZShzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzLCB1MzIgY291bnQsIHUzMiBzdGFydF9pbmRleCwKLQkJCQkJCQl1OCAqcHJlYW1ibGVfZGF0YSkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQl1MzIgaTsKLQl1MzIgajsKLQotCWlmIChjb3VudCA+IGpzLT5pcl9wcmUpIHsKLQkJa2ZyZWUoanMtPmlyX3ByZV9kYXRhKTsKLQkJanMtPmlyX3ByZV9kYXRhID0gKHU4ICopYWx0X21hbGxvYygoY291bnQgKyA3KSA+PiAzKTsKLQkJaWYgKGpzLT5pcl9wcmVfZGF0YSA9PSBOVUxMKQotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZWxzZQotCQkJanMtPmlyX3ByZSA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5pcl9wcmUgPSBjb3VudDsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaiA9IGkgKyBzdGFydF9pbmRleDsKLQkJCWlmIChwcmVhbWJsZV9kYXRhID09IE5VTEwpCi0JCQkJanMtPmlyX3ByZV9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJlYW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJCWpzLT5pcl9wcmVfZGF0YVtpID4+IDNdIHw9Ci0JCQkJCQkJKDEgPDwgKGkgJiA3KSk7Ci0JCQkJZWxzZQotCQkJCQlqcy0+aXJfcHJlX2RhdGFbaSA+PiAzXSAmPQotCQkJCQkJCX4odTMyKSgxIDw8IChpICYgNykpOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3NldF9kcl9wb3N0KHN0cnVjdCBhbHRlcmFfanRhZyAqanMsIHUzMiBjb3VudCwgdTMyIHN0YXJ0X2luZGV4LAotCQkJCQkJdTggKnBvc3RhbWJsZV9kYXRhKQotewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBpOwotCXUzMiBqOwotCi0JaWYgKGNvdW50ID4ganMtPmRyX3Bvc3QpIHsKLQkJa2ZyZWUoanMtPmRyX3Bvc3RfZGF0YSk7Ci0JCWpzLT5kcl9wb3N0X2RhdGEgPSAodTggKilhbHRfbWFsbG9jKChjb3VudCArIDcpID4+IDMpOwotCi0JCWlmIChqcy0+ZHJfcG9zdF9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+ZHJfcG9zdCA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5kcl9wb3N0ID0gY291bnQ7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWogPSBpICsgc3RhcnRfaW5kZXg7Ci0KLQkJCWlmIChwb3N0YW1ibGVfZGF0YSA9PSBOVUxMKQotCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCWVsc2UgewotCQkJCWlmIChwb3N0YW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSB8PQotCQkJCQkJCQkoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCWpzLT5kcl9wb3N0X2RhdGFbaSA+PiAzXSAmPQotCQkJCQkgICAgfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc2V0X2lyX3Bvc3Qoc3RydWN0IGFsdGVyYV9qdGFnICpqcywgdTMyIGNvdW50LCB1MzIgc3RhcnRfaW5kZXgsCi0JCQkJCQl1OCAqcG9zdGFtYmxlX2RhdGEpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0KLQlpZiAoY291bnQgPiBqcy0+aXJfcG9zdCkgewotCQlrZnJlZShqcy0+aXJfcG9zdF9kYXRhKTsKLQkJanMtPmlyX3Bvc3RfZGF0YSA9ICh1OCAqKWFsdF9tYWxsb2MoKGNvdW50ICsgNykgPj4gMyk7Ci0JCWlmIChqcy0+aXJfcG9zdF9kYXRhID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlqcy0+aXJfcG9zdCA9IGNvdW50OwotCi0JfSBlbHNlCi0JCWpzLT5pcl9wb3N0ID0gY291bnQ7Ci0KLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlqID0gaSArIHN0YXJ0X2luZGV4OwotCi0JCWlmIChwb3N0YW1ibGVfZGF0YSA9PSBOVUxMKQotCQkJanMtPmlyX3Bvc3RfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQllbHNlIHsKLQkJCWlmIChwb3N0YW1ibGVfZGF0YVtqID4+IDNdICYgKDEgPDwgKGogJiA3KSkpCi0JCQkJanMtPmlyX3Bvc3RfZGF0YVtpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQkJZWxzZQotCQkJCWpzLT5pcl9wb3N0X2RhdGFbaSA+PiAzXSAmPQotCQkJCSAgICB+KHUzMikoMSA8PCAoaSAmIDcpKTsKLQotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2pyZXNldF9pZGxlKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IGk7Ci0JLyogR28gdG8gVGVzdCBMb2dpYyBSZXNldCAobm8gbWF0dGVyIHdoYXQgdGhlIHN0YXJ0aW5nIHN0YXRlIG1heSBiZSkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNTsgKytpKQotCQlhbHRfanRhZ19pbyhUTVNfSElHSCwgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQkvKiBOb3cgc3RlcCB0byBSdW4gVGVzdCAvIElkbGUgKi8KLQlhbHRfanRhZ19pbyhUTVNfTE9XLCBURElfTE9XLCBJR05PUkVfVERPKTsKLQlqcy0+anRhZ19zdGF0ZSA9IElETEU7Ci19Ci0KLWludCBhbHRlcmFfZ290b19qc3RhdGUoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJCQllbnVtIGFsdGVyYV9qdGFnX3N0YXRlIHN0YXRlKQotewotCXN0cnVjdCBhbHRlcmFfanRhZyAqanMgPSAmYXN0YXRlLT5qczsKLQlpbnQgdG1zOwotCWludCBjb3VudCA9IDA7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgPT0gSUxMRUdBTF9KVEFHX1NUQVRFKQotCQkvKiBpbml0aWFsaXplIEpUQUcgY2hhaW4gdG8ga25vd24gc3RhdGUgKi8KLQkJYWx0ZXJhX2pyZXNldF9pZGxlKGFzdGF0ZSk7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgPT0gc3RhdGUpIHsKLQkJLyoKLQkJICogV2UgYXJlIGFscmVhZHkgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCi0JCSAqIElmIGl0IGlzIGEgc3RhYmxlIHN0YXRlLCBsb29wIGhlcmUuCi0JCSAqIE90aGVyd2lzZSBkbyBub3RoaW5nIChubyBjbG9jayBjeWNsZXMpLgotCQkgKi8KLQkJaWYgKChzdGF0ZSA9PSBJRExFKSB8fCAoc3RhdGUgPT0gRFJTSElGVCkgfHwKLQkJCShzdGF0ZSA9PSBEUlBBVVNFKSB8fCAoc3RhdGUgPT0gSVJTSElGVCkgfHwKLQkJCQkoc3RhdGUgPT0gSVJQQVVTRSkpIHsKLQkJCWFsdF9qdGFnX2lvKFRNU19MT1csIFRESV9MT1csIElHTk9SRV9URE8pOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IFJFU0VUKQotCQkJYWx0X2p0YWdfaW8oVE1TX0hJR0gsIFRESV9MT1csIElHTk9SRV9URE8pOwotCi0JfSBlbHNlIHsKLQkJd2hpbGUgKChqcy0+anRhZ19zdGF0ZSAhPSBzdGF0ZSkgJiYgKGNvdW50IDwgOSkpIHsKLQkJCS8qIEdldCBUTVMgdmFsdWUgdG8gdGFrZSBhIHN0ZXAgdG93YXJkIGRlc2lyZWQgc3RhdGUgKi8KLQkJCXRtcyA9IChhbHRlcmFfanRhZ19wYXRoX21hcFtqcy0+anRhZ19zdGF0ZV0gJgotCQkJCQkJCSgxIDw8IHN0YXRlKSkKLQkJCQkJCQk/IFRNU19ISUdIIDogVE1TX0xPVzsKLQotCQkJLyogVGFrZSBhIHN0ZXAgKi8KLQkJCWFsdF9qdGFnX2lvKHRtcywgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQkJCWlmICh0bXMpCi0JCQkJanMtPmp0YWdfc3RhdGUgPQotCQkJCQlhbHRlcmFfdHJhbnNpdGlvbnNbanMtPmp0YWdfc3RhdGVdLnRtc19oaWdoOwotCQkJZWxzZQotCQkJCWpzLT5qdGFnX3N0YXRlID0KLQkJCQkJYWx0ZXJhX3RyYW5zaXRpb25zW2pzLT5qdGFnX3N0YXRlXS50bXNfbG93OwotCi0JCQkrK2NvdW50OwotCQl9Ci0JfQotCi0JaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXRlKQotCQlzdGF0dXMgPSAtRVJFTU9URUlPOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGFsdGVyYV93YWl0X2N5Y2xlcyhzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsCi0JCQkJCXMzMiBjeWNsZXMsCi0JCQkJCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgd2FpdF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHRtczsKLQlzMzIgY291bnQ7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gd2FpdF9zdGF0ZSkKLQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgd2FpdF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJLyoKLQkJICogU2V0IFRNUyBoaWdoIHRvIGxvb3AgaW4gUkVTRVQgc3RhdGUKLQkJICogU2V0IFRNUyBsb3cgdG8gbG9vcCBpbiBhbnkgb3RoZXIgc3RhYmxlIHN0YXRlCi0JCSAqLwotCQl0bXMgPSAod2FpdF9zdGF0ZSA9PSBSRVNFVCkgPyBUTVNfSElHSCA6IFRNU19MT1c7Ci0KLQkJZm9yIChjb3VudCA9IDBMOyBjb3VudCA8IGN5Y2xlczsgY291bnQrKykKLQkJCWFsdF9qdGFnX2lvKHRtcywgVERJX0xPVywgSUdOT1JFX1RETyk7Ci0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3dhaXRfbXNlY3Moc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJczMyIG1pY3Jvc2Vjb25kcywgZW51bSBhbHRlcmFfanRhZ19zdGF0ZSB3YWl0X3N0YXRlKQotLyoKLSAqIENhdXNlcyBKVEFHIGhhcmR3YXJlIHRvIHNpdCBpbiB0aGUgc3BlY2lmaWVkIHN0YWJsZQotICogc3RhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gb2YgcmVhbCB0aW1lLiAgSWYKLSAqIG5vIEpUQUcgb3BlcmF0aW9ucyBoYXZlIGJlZW4gcGVyZm9ybWVkIHlldCwgdGhlbiBvbmx5Ci0gKiBhIGRlbGF5IGlzIHBlcmZvcm1lZC4gIFRoaXMgcGVybWl0cyB0aGUgV0FJVCBVU0VDUwotICogc3RhdGVtZW50IHRvIGJlIHVzZWQgaW4gVkVDVE9SIHByb2dyYW1zIHdpdGhvdXQgY2F1c2luZwotICogYW55IEpUQUcgb3BlcmF0aW9ucy4KLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgotICovCi17Ci0Jc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOwotCWludCBzdGF0dXMgPSAwOwotCi0JaWYgKChqcy0+anRhZ19zdGF0ZSAhPSBJTExFR0FMX0pUQUdfU1RBVEUpICYmCi0JICAgIChqcy0+anRhZ19zdGF0ZSAhPSB3YWl0X3N0YXRlKSkKLQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgd2FpdF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCS8qIFdhaXQgZm9yIHNwZWNpZmllZCB0aW1lIGludGVydmFsICovCi0JCXVkZWxheShtaWNyb3NlY29uZHMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2NvbmNhdGVuYXRlX2RhdGEodTggKmJ1ZmZlciwKLQkJCQl1OCAqcHJlYW1ibGVfZGF0YSwKLQkJCQl1MzIgcHJlYW1ibGVfY291bnQsCi0JCQkJdTggKnRhcmdldF9kYXRhLAotCQkJCXUzMiBzdGFydF9pbmRleCwKLQkJCQl1MzIgdGFyZ2V0X2NvdW50LAotCQkJCXU4ICpwb3N0YW1ibGVfZGF0YSwKLQkJCQl1MzIgcG9zdGFtYmxlX2NvdW50KQotLyoKLSAqIENvcGllcyBwcmVhbWJsZSBkYXRhLCB0YXJnZXQgZGF0YSwgYW5kIHBvc3RhbWJsZSBkYXRhCi0gKiBpbnRvIG9uZSBidWZmZXIgZm9yIElSIG9yIERSIHNjYW5zLgotICovCi17Ci0JdTMyIGksIGosIGs7Ci0KLQlmb3IgKGkgPSAwTDsgaSA8IHByZWFtYmxlX2NvdW50OyArK2kpIHsKLQkJaWYgKHByZWFtYmxlX2RhdGFbaSA+PiAzTF0gJiAoMUwgPDwgKGkgJiA3TCkpKQotCQkJYnVmZmVyW2kgPj4gM0xdIHw9ICgxTCA8PCAoaSAmIDdMKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlcltpID4+IDNMXSAmPSB+KHUzMikoMUwgPDwgKGkgJiA3TCkpOwotCi0JfQotCi0JaiA9IHN0YXJ0X2luZGV4OwotCWsgPSBwcmVhbWJsZV9jb3VudCArIHRhcmdldF9jb3VudDsKLQlmb3IgKDsgaSA8IGs7ICsraSwgKytqKSB7Ci0JCWlmICh0YXJnZXRfZGF0YVtqID4+IDNMXSAmICgxTCA8PCAoaiAmIDdMKSkpCi0JCQlidWZmZXJbaSA+PiAzTF0gfD0gKDFMIDw8IChpICYgN0wpKTsKLQkJZWxzZQotCQkJYnVmZmVyW2kgPj4gM0xdICY9IH4odTMyKSgxTCA8PCAoaSAmIDdMKSk7Ci0KLQl9Ci0KLQlqID0gMEw7Ci0JayA9IHByZWFtYmxlX2NvdW50ICsgdGFyZ2V0X2NvdW50ICsgcG9zdGFtYmxlX2NvdW50OwotCWZvciAoOyBpIDwgazsgKytpLCArK2opIHsKLQkJaWYgKHBvc3RhbWJsZV9kYXRhW2ogPj4gM0xdICYgKDFMIDw8IChqICYgN0wpKSkKLQkJCWJ1ZmZlcltpID4+IDNMXSB8PSAoMUwgPDwgKGkgJiA3TCkpOwotCQllbHNlCi0JCQlidWZmZXJbaSA+PiAzTF0gJj0gfih1MzIpKDFMIDw8IChpICYgN0wpKTsKLQotCX0KLX0KLQotc3RhdGljIGludCBhbHRfanRhZ19kcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJaW50IHN0YXJ0X3N0YXRlLAotCQkJaW50IGNvdW50LAotCQkJdTggKnRkaSwKLQkJCXU4ICp0ZG8pCi17Ci0JaW50IGkgPSAwOwotCWludCB0ZG9fYml0ID0gMDsKLQlpbnQgc3RhdHVzID0gMTsKLQotCS8qIEZpcnN0IGdvIHRvIERSU0hJRlQgc3RhdGUgKi8KLQlzd2l0Y2ggKHN0YXJ0X3N0YXRlKSB7Ci0JY2FzZSAwOgkJCQkJCS8qIElETEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDE6CQkJCQkJLyogRFJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDI6CQkJCQkJLyogSVJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBEUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIERSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdGF0dXMgPSAwOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJLyogbG9vcCBpbiB0aGUgU0hJRlQtRFIgc3RhdGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCXRkb19iaXQgPSBhbHRfanRhZ19pbygKLQkJCQkJKGkgPT0gY291bnQgLSAxKSwKLQkJCQkJdGRpW2kgPj4gM10gJiAoMSA8PCAoaSAmIDcpKSwKLQkJCQkJKHRkbyAhPSBOVUxMKSk7Ci0KLQkJCWlmICh0ZG8gIT0gTlVMTCkgewotCQkJCWlmICh0ZG9fYml0KQotCQkJCQl0ZG9baSA+PiAzXSB8PSAoMSA8PCAoaSAmIDcpKTsKLQkJCQllbHNlCi0JCQkJCXRkb1tpID4+IDNdICY9IH4odTMyKSgxIDw8IChpICYgNykpOwotCi0JCQl9Ci0JCX0KLQotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogRFJQQVVTRSAqLwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgYWx0X2p0YWdfaXJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJICAgIGludCBzdGFydF9zdGF0ZSwKLQkJICAgIGludCBjb3VudCwKLQkJICAgIHU4ICp0ZGksCi0JCSAgICB1OCAqdGRvKQotewotCWludCBpID0gMDsKLQlpbnQgdGRvX2JpdCA9IDA7Ci0JaW50IHN0YXR1cyA9IDE7Ci0KLQkvKiBGaXJzdCBnbyB0byBJUlNISUZUIHN0YXRlICovCi0Jc3dpdGNoIChzdGFydF9zdGF0ZSkgewotCWNhc2UgMDoJCQkJCQkvKiBJRExFICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlNFTEVDVCAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJTRUxFQ1QgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSQ0FQVFVSRSAqLwotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJTSElGVCAqLwotCQlicmVhazsKLQotCWNhc2UgMToJCQkJCQkvKiBEUlBBVVNFICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUkVYSVQyICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBEUlVQREFURSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogRFJTRUxFQ1QgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIElSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUkNBUFRVUkUgKi8KLQkJYWx0X2p0YWdfaW8oMCwgMCwgMCk7CS8qIElSU0hJRlQgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIDI6CQkJCQkJLyogSVJQQVVTRSAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJFWElUMiAqLwotCQlhbHRfanRhZ19pbygxLCAwLCAwKTsJLyogSVJVUERBVEUgKi8KLQkJYWx0X2p0YWdfaW8oMSwgMCwgMCk7CS8qIERSU0VMRUNUICovCi0JCWFsdF9qdGFnX2lvKDEsIDAsIDApOwkvKiBJUlNFTEVDVCAqLwotCQlhbHRfanRhZ19pbygwLCAwLCAwKTsJLyogSVJDQVBUVVJFICovCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlNISUZUICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gMDsKLQl9Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCS8qIGxvb3AgaW4gdGhlIFNISUZULUlSIHN0YXRlICovCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQl0ZG9fYml0ID0gYWx0X2p0YWdfaW8oCi0JCQkJICAgICAgKGkgPT0gY291bnQgLSAxKSwKLQkJCQkgICAgICB0ZGlbaSA+PiAzXSAmICgxIDw8IChpICYgNykpLAotCQkJCSAgICAgICh0ZG8gIT0gTlVMTCkpOwotCQkJaWYgKHRkbyAhPSBOVUxMKSB7Ci0JCQkJaWYgKHRkb19iaXQpCi0JCQkJCXRkb1tpID4+IDNdIHw9ICgxIDw8IChpICYgNykpOwotCQkJCWVsc2UKLQkJCQkJdGRvW2kgPj4gM10gJj0gfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQkJCX0KLQkJfQotCi0JCWFsdF9qdGFnX2lvKDAsIDAsIDApOwkvKiBJUlBBVVNFICovCi0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEodTggKmJ1ZmZlciwKLQkJCQl1OCAqdGFyZ2V0X2RhdGEsCi0JCQkJdTMyIHN0YXJ0X2luZGV4LAotCQkJCXUzMiBwcmVhbWJsZV9jb3VudCwKLQkJCQl1MzIgdGFyZ2V0X2NvdW50KQotLyoKLSAqIENvcGllcyB0YXJnZXQgZGF0YSBmcm9tIHNjYW4gYnVmZmVyLCBmaWx0ZXJpbmcgb3V0Ci0gKiBwcmVhbWJsZSBhbmQgcG9zdGFtYmxlIGRhdGEuCi0gKi8KLXsKLQl1MzIgaTsKLQl1MzIgajsKLQl1MzIgazsKLQotCWogPSBwcmVhbWJsZV9jb3VudDsKLQlrID0gc3RhcnRfaW5kZXggKyB0YXJnZXRfY291bnQ7Ci0JZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBrOyArK2ksICsraikgewotCQlpZiAoYnVmZmVyW2ogPj4gM10gJiAoMSA8PCAoaiAmIDcpKSkKLQkJCXRhcmdldF9kYXRhW2kgPj4gM10gfD0gKDEgPDwgKGkgJiA3KSk7Ci0JCWVsc2UKLQkJCXRhcmdldF9kYXRhW2kgPj4gM10gJj0gfih1MzIpKDEgPDwgKGkgJiA3KSk7Ci0KLQl9Ci19Ci0KLWludCBhbHRlcmFfaXJzY2FuKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJCQl1MzIgY291bnQsCi0JCQkJdTggKnRkaV9kYXRhLAotCQkJCXUzMiBzdGFydF9pbmRleCkKLS8qIFNoaWZ0cyBkYXRhIGludG8gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmlyX3ByZSArIGNvdW50ICsganMtPmlyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmlyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmlyX2J1ZmZlcik7Ci0JCQlqcy0+aXJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmlyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmlyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgSVIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5pcl9idWZmZXIsCi0JCQkJCWpzLT5pcl9wcmVfZGF0YSwKLQkJCQkJanMtPmlyX3ByZSwKLQkJCQkJdGRpX2RhdGEsCi0JCQkJCXN0YXJ0X2luZGV4LAotCQkJCQljb3VudCwKLQkJCQkJanMtPmlyX3Bvc3RfZGF0YSwKLQkJCQkJanMtPmlyX3Bvc3QpOwotCQkvKiBEbyB0aGUgSVJTQ0FOICovCi0JCWFsdF9qdGFnX2lyc2Nhbihhc3RhdGUsCi0JCQkJc3RhcnRfY29kZSwKLQkJCQlzaGlmdF9jb3VudCwKLQkJCQlqcy0+aXJfYnVmZmVyLAotCQkJCU5VTEwpOwotCi0JCS8qIGFsdF9qdGFnX2lyc2NhbigpIGFsd2F5cyBlbmRzIGluIElSUEFVU0Ugc3RhdGUgKi8KLQkJanMtPmp0YWdfc3RhdGUgPSBJUlBBVVNFOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5pcnN0b3Bfc3RhdGUgIT0gSVJQQVVTRSkKLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5pcnN0b3Bfc3RhdGUpOwotCi0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYWx0ZXJhX3N3YXBfaXIoc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJICAgIHUzMiBjb3VudCwKLQkJCSAgICB1OCAqaW5fZGF0YSwKLQkJCSAgICB1MzIgaW5faW5kZXgsCi0JCQkgICAgdTggKm91dF9kYXRhLAotCQkJICAgIHUzMiBvdXRfaW5kZXgpCi0vKiBTaGlmdHMgZGF0YSBpbnRvIGluc3RydWN0aW9uIHJlZ2lzdGVyLCBjYXB0dXJpbmcgb3V0cHV0IGRhdGEgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmlyX3ByZSArIGNvdW50ICsganMtPmlyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmlyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmlyX2J1ZmZlcik7Ci0JCQlqcy0+aXJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmlyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmlyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgSVIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5pcl9idWZmZXIsCi0JCQkJCWpzLT5pcl9wcmVfZGF0YSwKLQkJCQkJanMtPmlyX3ByZSwKLQkJCQkJaW5fZGF0YSwKLQkJCQkJaW5faW5kZXgsCi0JCQkJCWNvdW50LAotCQkJCQlqcy0+aXJfcG9zdF9kYXRhLAotCQkJCQlqcy0+aXJfcG9zdCk7Ci0KLQkJLyogRG8gdGhlIElSU0NBTiAqLwotCQlhbHRfanRhZ19pcnNjYW4oYXN0YXRlLAotCQkJCXN0YXJ0X2NvZGUsCi0JCQkJc2hpZnRfY291bnQsCi0JCQkJanMtPmlyX2J1ZmZlciwKLQkJCQlqcy0+aXJfYnVmZmVyKTsKLQotCQkvKiBhbHRfanRhZ19pcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBJUlBBVVNFIHN0YXRlICovCi0JCWpzLT5qdGFnX3N0YXRlID0gSVJQQVVTRTsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCWlmIChqcy0+aXJzdG9wX3N0YXRlICE9IElSUEFVU0UpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+aXJzdG9wX3N0YXRlKTsKLQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQkvKiBOb3cgZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSBmcm9tIHRoZSBidWZmZXIgKi8KLQkJYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEoanMtPmlyX2J1ZmZlciwKLQkJCQkJb3V0X2RhdGEsIG91dF9pbmRleCwKLQkJCQkJanMtPmlyX3ByZSwgY291bnQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGFsdGVyYV9kcnNjYW4oc3RydWN0IGFsdGVyYV9zdGF0ZSAqYXN0YXRlLAotCQkJCXUzMiBjb3VudCwKLQkJCQl1OCAqdGRpX2RhdGEsCi0JCQkJdTMyIHN0YXJ0X2luZGV4KQotLyogU2hpZnRzIGRhdGEgaW50byBkYXRhIHJlZ2lzdGVyIChpZ25vcmluZyBvdXRwdXQgZGF0YSkgKi8KLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JaW50IHN0YXJ0X2NvZGUgPSAwOwotCXUzMiBhbGxvY19jaGFycyA9IDA7Ci0JdTMyIHNoaWZ0X2NvdW50ID0ganMtPmRyX3ByZSArIGNvdW50ICsganMtPmRyX3Bvc3Q7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JZW51bSBhbHRlcmFfanRhZ19zdGF0ZSBzdGFydF9zdGF0ZSA9IElMTEVHQUxfSlRBR19TVEFURTsKLQotCXN3aXRjaCAoanMtPmp0YWdfc3RhdGUpIHsKLQljYXNlIElMTEVHQUxfSlRBR19TVEFURToKLQljYXNlIFJFU0VUOgotCWNhc2UgSURMRToKLQkJc3RhcnRfY29kZSA9IDA7Ci0JCXN0YXJ0X3N0YXRlID0gSURMRTsKLQkJYnJlYWs7Ci0KLQljYXNlIERSU0VMRUNUOgotCWNhc2UgRFJDQVBUVVJFOgotCWNhc2UgRFJTSElGVDoKLQljYXNlIERSRVhJVDE6Ci0JY2FzZSBEUlBBVVNFOgotCWNhc2UgRFJFWElUMjoKLQljYXNlIERSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMTsKLQkJc3RhcnRfc3RhdGUgPSBEUlBBVVNFOwotCQlicmVhazsKLQotCWNhc2UgSVJTRUxFQ1Q6Ci0JY2FzZSBJUkNBUFRVUkU6Ci0JY2FzZSBJUlNISUZUOgotCWNhc2UgSVJFWElUMToKLQljYXNlIElSUEFVU0U6Ci0JY2FzZSBJUkVYSVQyOgotCWNhc2UgSVJVUERBVEU6Ci0JCXN0YXJ0X2NvZGUgPSAyOwotCQlzdGFydF9zdGF0ZSA9IElSUEFVU0U7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gc3RhcnRfc3RhdGUpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBzdGFydF9zdGF0ZSk7Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHNoaWZ0X2NvdW50ID4ganMtPmRyX2xlbmd0aCkgewotCQkJYWxsb2NfY2hhcnMgPSAoc2hpZnRfY291bnQgKyA3KSA+PiAzOwotCQkJa2ZyZWUoanMtPmRyX2J1ZmZlcik7Ci0JCQlqcy0+ZHJfYnVmZmVyID0gKHU4ICopYWx0X21hbGxvYyhhbGxvY19jaGFycyk7Ci0JCQlpZiAoanMtPmRyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmRyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgRFIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5kcl9idWZmZXIsCi0JCQkJCWpzLT5kcl9wcmVfZGF0YSwKLQkJCQkJanMtPmRyX3ByZSwKLQkJCQkJdGRpX2RhdGEsCi0JCQkJCXN0YXJ0X2luZGV4LAotCQkJCQljb3VudCwKLQkJCQkJanMtPmRyX3Bvc3RfZGF0YSwKLQkJCQkJanMtPmRyX3Bvc3QpOwotCQkvKiBEbyB0aGUgRFJTQ0FOICovCi0JCWFsdF9qdGFnX2Ryc2Nhbihhc3RhdGUsIHN0YXJ0X2NvZGUsIHNoaWZ0X2NvdW50LAotCQkJCWpzLT5kcl9idWZmZXIsIE5VTEwpOwotCQkvKiBhbHRfanRhZ19kcnNjYW4oKSBhbHdheXMgZW5kcyBpbiBEUlBBVVNFIHN0YXRlICovCi0JCWpzLT5qdGFnX3N0YXRlID0gRFJQQVVTRTsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCWlmIChqcy0+ZHJzdG9wX3N0YXRlICE9IERSUEFVU0UpCi0JCQlzdGF0dXMgPSBhbHRlcmFfZ290b19qc3RhdGUoYXN0YXRlLCBqcy0+ZHJzdG9wX3N0YXRlKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfc3dhcF9kcihzdHJ1Y3QgYWx0ZXJhX3N0YXRlICphc3RhdGUsIHUzMiBjb3VudCwKLQkJCQl1OCAqaW5fZGF0YSwgdTMyIGluX2luZGV4LAotCQkJCXU4ICpvdXRfZGF0YSwgdTMyIG91dF9pbmRleCkKLS8qIFNoaWZ0cyBkYXRhIGludG8gZGF0YSByZWdpc3RlciwgY2FwdHVyaW5nIG91dHB1dCBkYXRhICovCi17Ci0Jc3RydWN0IGFsdGVyYV9qdGFnICpqcyA9ICZhc3RhdGUtPmpzOwotCWludCBzdGFydF9jb2RlID0gMDsKLQl1MzIgYWxsb2NfY2hhcnMgPSAwOwotCXUzMiBzaGlmdF9jb3VudCA9IGpzLT5kcl9wcmUgKyBjb3VudCArIGpzLT5kcl9wb3N0OwotCWludCBzdGF0dXMgPSAwOwotCWVudW0gYWx0ZXJhX2p0YWdfc3RhdGUgc3RhcnRfc3RhdGUgPSBJTExFR0FMX0pUQUdfU1RBVEU7Ci0KLQlzd2l0Y2ggKGpzLT5qdGFnX3N0YXRlKSB7Ci0JY2FzZSBJTExFR0FMX0pUQUdfU1RBVEU6Ci0JY2FzZSBSRVNFVDoKLQljYXNlIElETEU6Ci0JCXN0YXJ0X2NvZGUgPSAwOwotCQlzdGFydF9zdGF0ZSA9IElETEU7Ci0JCWJyZWFrOwotCi0JY2FzZSBEUlNFTEVDVDoKLQljYXNlIERSQ0FQVFVSRToKLQljYXNlIERSU0hJRlQ6Ci0JY2FzZSBEUkVYSVQxOgotCWNhc2UgRFJQQVVTRToKLQljYXNlIERSRVhJVDI6Ci0JY2FzZSBEUlVQREFURToKLQkJc3RhcnRfY29kZSA9IDE7Ci0JCXN0YXJ0X3N0YXRlID0gRFJQQVVTRTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSU0VMRUNUOgotCWNhc2UgSVJDQVBUVVJFOgotCWNhc2UgSVJTSElGVDoKLQljYXNlIElSRVhJVDE6Ci0JY2FzZSBJUlBBVVNFOgotCWNhc2UgSVJFWElUMjoKLQljYXNlIElSVVBEQVRFOgotCQlzdGFydF9jb2RlID0gMjsKLQkJc3RhcnRfc3RhdGUgPSBJUlBBVVNFOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IC1FUkVNT1RFSU87Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5qdGFnX3N0YXRlICE9IHN0YXJ0X3N0YXRlKQotCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgc3RhcnRfc3RhdGUpOwotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChzaGlmdF9jb3VudCA+IGpzLT5kcl9sZW5ndGgpIHsKLQkJCWFsbG9jX2NoYXJzID0gKHNoaWZ0X2NvdW50ICsgNykgPj4gMzsKLQkJCWtmcmVlKGpzLT5kcl9idWZmZXIpOwotCQkJanMtPmRyX2J1ZmZlciA9ICh1OCAqKWFsdF9tYWxsb2MoYWxsb2NfY2hhcnMpOwotCi0JCQlpZiAoanMtPmRyX2J1ZmZlciA9PSBOVUxMKQotCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQllbHNlCi0JCQkJanMtPmRyX2xlbmd0aCA9IGFsbG9jX2NoYXJzICogODsKLQotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qCi0JCSAqIENvcHkgcHJlYW1ibGUgZGF0YSwgRFIgZGF0YSwKLQkJICogYW5kIHBvc3RhbWJsZSBkYXRhIGludG8gYSBidWZmZXIKLQkJICovCi0JCWFsdGVyYV9jb25jYXRlbmF0ZV9kYXRhKGpzLT5kcl9idWZmZXIsCi0JCQkJanMtPmRyX3ByZV9kYXRhLAotCQkJCWpzLT5kcl9wcmUsCi0JCQkJaW5fZGF0YSwKLQkJCQlpbl9pbmRleCwKLQkJCQljb3VudCwKLQkJCQlqcy0+ZHJfcG9zdF9kYXRhLAotCQkJCWpzLT5kcl9wb3N0KTsKLQotCQkvKiBEbyB0aGUgRFJTQ0FOICovCi0JCWFsdF9qdGFnX2Ryc2Nhbihhc3RhdGUsCi0JCQkJc3RhcnRfY29kZSwKLQkJCQlzaGlmdF9jb3VudCwKLQkJCQlqcy0+ZHJfYnVmZmVyLAotCQkJCWpzLT5kcl9idWZmZXIpOwotCi0JCS8qIGFsdF9qdGFnX2Ryc2NhbigpIGFsd2F5cyBlbmRzIGluIERSUEFVU0Ugc3RhdGUgKi8KLQkJanMtPmp0YWdfc3RhdGUgPSBEUlBBVVNFOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJaWYgKGpzLT5kcnN0b3Bfc3RhdGUgIT0gRFJQQVVTRSkKLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGpzLT5kcnN0b3Bfc3RhdGUpOwotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQkvKiBOb3cgZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSBmcm9tIHRoZSBidWZmZXIgKi8KLQkJYWx0ZXJhX2V4dHJhY3RfdGFyZ2V0X2RhdGEoanMtPmRyX2J1ZmZlciwKLQkJCQkJb3V0X2RhdGEsCi0JCQkJCW91dF9pbmRleCwKLQkJCQkJanMtPmRyX3ByZSwKLQkJCQkJY291bnQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBhbHRlcmFfZnJlZV9idWZmZXJzKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSkKLXsKLQlzdHJ1Y3QgYWx0ZXJhX2p0YWcgKmpzID0gJmFzdGF0ZS0+anM7Ci0JLyogSWYgdGhlIEpUQUcgaW50ZXJmYWNlIHdhcyB1c2VkLCByZXNldCBpdCB0byBUTFIgKi8KLQlpZiAoanMtPmp0YWdfc3RhdGUgIT0gSUxMRUdBTF9KVEFHX1NUQVRFKQotCQlhbHRlcmFfanJlc2V0X2lkbGUoYXN0YXRlKTsKLQotCWtmcmVlKGpzLT5kcl9wcmVfZGF0YSk7Ci0JanMtPmRyX3ByZV9kYXRhID0gTlVMTDsKLQotCWtmcmVlKGpzLT5kcl9wb3N0X2RhdGEpOwotCWpzLT5kcl9wb3N0X2RhdGEgPSBOVUxMOwotCi0Ja2ZyZWUoanMtPmRyX2J1ZmZlcik7Ci0JanMtPmRyX2J1ZmZlciA9IE5VTEw7Ci0KLQlrZnJlZShqcy0+aXJfcHJlX2RhdGEpOwotCWpzLT5pcl9wcmVfZGF0YSA9IE5VTEw7Ci0KLQlrZnJlZShqcy0+aXJfcG9zdF9kYXRhKTsKLQlqcy0+aXJfcG9zdF9kYXRhID0gTlVMTDsKLQotCWtmcmVlKGpzLT5pcl9idWZmZXIpOwotCWpzLT5pcl9idWZmZXIgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWZmNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MzcgKzAsMCBAQAotLyoKLSAqIGFsdGVyYS5jCi0gKgotICogYWx0ZXJhIEZQR0EgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSBBbHRlcmEgQ29ycG9yYXRpb24gMTk5OC0yMDAxCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBOZXRVUCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsMjAxMSBJZ29yIE0uIExpcGxpYW5pbiA8bGlwbGlhbmluQG5ldHVwLnJ1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiYWx0ZXJhLmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCi0jaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKLQotc3RhdGljIGludCBkZWJ1ZyA9IDE7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oImFsdGVyYSBGUEdBIGtlcm5lbCBtb2R1bGUiKTsKLU1PRFVMRV9BVVRIT1IoIklnb3IgTS4gTGlwbGlhbmluICA8bGlwbGlhbmluQG5ldHVwLnJ1PiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAotCWlmIChkZWJ1ZykgeyBcCi0JCXByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOyBcCi0JfQotCi1lbnVtIGFsdGVyYV9mcGdhX29wY29kZSB7Ci0JT1BfTk9QID0gMCwKLQlPUF9EVVAsCi0JT1BfU1dQLAotCU9QX0FERCwKLQlPUF9TVUIsCi0JT1BfTVVMVCwKLQlPUF9ESVYsCi0JT1BfTU9ELAotCU9QX1NITCwKLQlPUF9TSFIsCi0JT1BfTk9ULAotCU9QX0FORCwKLQlPUF9PUiwKLQlPUF9YT1IsCi0JT1BfSU5WLAotCU9QX0dULAotCU9QX0xULAotCU9QX1JFVCwKLQlPUF9DTVBTLAotCU9QX1BJTlQsCi0JT1BfUFJOVCwKLQlPUF9EU1MsCi0JT1BfRFNTQywKLQlPUF9JU1MsCi0JT1BfSVNTQywKLQlPUF9EUFIgPSAweDFjLAotCU9QX0RQUkwsCi0JT1BfRFBPLAotCU9QX0RQT0wsCi0JT1BfSVBSLAotCU9QX0lQUkwsCi0JT1BfSVBPLAotCU9QX0lQT0wsCi0JT1BfUENIUiwKLQlPUF9FWElULAotCU9QX0VRVSwKLQlPUF9QT1BULAotCU9QX0FCUyA9IDB4MmMsCi0JT1BfQkNIMCwKLQlPUF9QU0gwID0gMHgyZiwKLQlPUF9QU0hMID0gMHg0MCwKLQlPUF9QU0hWLAotCU9QX0pNUCwKLQlPUF9DQUxMLAotCU9QX05FWFQsCi0JT1BfUFNUUiwKLQlPUF9TSU5UID0gMHg0NywKLQlPUF9TVCwKLQlPUF9JU1RQLAotCU9QX0RTVFAsCi0JT1BfU1dQTiwKLQlPUF9EVVBOLAotCU9QX1BPUFYsCi0JT1BfUE9QRSwKLQlPUF9QT1BBLAotCU9QX0pNUFosCi0JT1BfRFMsCi0JT1BfSVMsCi0JT1BfRFBSQSwKLQlPUF9EUE9BLAotCU9QX0lQUkEsCi0JT1BfSVBPQSwKLQlPUF9FWFBULAotCU9QX1BTSEUsCi0JT1BfUFNIQSwKLQlPUF9EWU5BLAotCU9QX0VYUFYgPSAweDVjLAotCU9QX0NPUFkgPSAweDgwLAotCU9QX1JFVkEsCi0JT1BfRFNDLAotCU9QX0lTQywKLQlPUF9XQUlULAotCU9QX1ZTLAotCU9QX0NNUEEgPSAweGMwLAotCU9QX1ZTQywKLX07Ci0KLXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gewotCWNoYXIJCQkqbmFtZTsKLQl1OAkJCWF0dHJzOwotCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8JKm5leHQ7Ci19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBlbm91Z2ggcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBzdGFjay4gKi8KLXN0YXRpYyBpbnQgYWx0ZXJhX2NoZWNrX3N0YWNrKGludCBzdGFja19wdHIsIGludCBjb3VudCwgaW50ICpzdGF0dXMpCi17Ci0JaWYgKHN0YWNrX3B0ciA8IGNvdW50KSB7Ci0JCSpzdGF0dXMgPSAtRU9WRVJGTE9XOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4cG9ydF9pbnQoY2hhciAqa2V5LCBzMzIgdmFsdWUpCi17Ci0JZHByaW50aygiRXhwb3J0OiBrZXkgPSBcIiVzXCIsIHZhbHVlID0gJWRcbiIsIGtleSwgdmFsdWUpOwotfQotCi0jZGVmaW5lIEhFWF9MSU5FX0NIQVJTIDcyCi0jZGVmaW5lIEhFWF9MSU5FX0JJVFMgKEhFWF9MSU5FX0NIQVJTICogNCkKLQotc3RhdGljIHZvaWQgYWx0ZXJhX2V4cG9ydF9ib29sX2FycmF5KGNoYXIgKmtleSwgdTggKmRhdGEsIHMzMiBjb3VudCkKLXsKLQljaGFyIHN0cmluZ1tIRVhfTElORV9DSEFSUyArIDFdOwotCXMzMiBpLCBvZmZzZXQ7Ci0JdTMyIHNpemUsIGxpbmUsIGxpbmVzLCBsaW5lYml0cywgdmFsdWUsIGosIGs7Ci0KLQlpZiAoY291bnQgPiBIRVhfTElORV9CSVRTKSB7Ci0JCWRwcmludGsoIkV4cG9ydDoga2V5ID0gXCIlc1wiLCAlZCBiaXRzLCB2YWx1ZSA9IEhFWFxuIiwKLQkJCQkJCQlrZXksIGNvdW50KTsKLQkJbGluZXMgPSAoY291bnQgKyAoSEVYX0xJTkVfQklUUyAtIDEpKSAvIEhFWF9MSU5FX0JJVFM7Ci0KLQkJZm9yIChsaW5lID0gMDsgbGluZSA8IGxpbmVzOyArK2xpbmUpIHsKLQkJCWlmIChsaW5lIDwgKGxpbmVzIC0gMSkpIHsKLQkJCQlsaW5lYml0cyA9IEhFWF9MSU5FX0JJVFM7Ci0JCQkJc2l6ZSA9IEhFWF9MSU5FX0NIQVJTOwotCQkJCW9mZnNldCA9IGNvdW50IC0gKChsaW5lICsgMSkgKiBIRVhfTElORV9CSVRTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGluZWJpdHMgPQotCQkJCQljb3VudCAtICgobGluZXMgLSAxKSAqIEhFWF9MSU5FX0JJVFMpOwotCQkJCXNpemUgPSAobGluZWJpdHMgKyAzKSAvIDQ7Ci0JCQkJb2Zmc2V0ID0gMEw7Ci0JCQl9Ci0KLQkJCXN0cmluZ1tzaXplXSA9ICdcMCc7Ci0JCQlqID0gc2l6ZSAtIDE7Ci0JCQl2YWx1ZSA9IDA7Ci0KLQkJCWZvciAoayA9IDA7IGsgPCBsaW5lYml0czsgKytrKSB7Ci0JCQkJaSA9IGsgKyBvZmZzZXQ7Ci0JCQkJaWYgKGRhdGFbaSA+PiAzXSAmICgxIDw8IChpICYgNykpKQotCQkJCQl2YWx1ZSB8PSAoMSA8PCAoaSAmIDMpKTsKLQkJCQlpZiAoKGkgJiAzKSA9PSAzKSB7Ci0JCQkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKLQkJCQkJdmFsdWUgPSAwOwotCQkJCQktLWo7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChrICYgMykgPiAwKQotCQkJCXNwcmludGYoJnN0cmluZ1tqXSwgIiUxeCIsIHZhbHVlKTsKLQotCQkJZHByaW50aygiJXNcbiIsIHN0cmluZyk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCXNpemUgPSAoY291bnQgKyAzKSAvIDQ7Ci0JCXN0cmluZ1tzaXplXSA9ICdcMCc7Ci0JCWogPSBzaXplIC0gMTsKLQkJdmFsdWUgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQlpZiAoZGF0YVtpID4+IDNdICYgKDEgPDwgKGkgJiA3KSkpCi0JCQkJdmFsdWUgfD0gKDEgPDwgKGkgJiAzKSk7Ci0JCQlpZiAoKGkgJiAzKSA9PSAzKSB7Ci0JCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOwotCQkJCXZhbHVlID0gMDsKLQkJCQktLWo7Ci0JCQl9Ci0JCX0KLQkJaWYgKChpICYgMykgPiAwKQotCQkJc3ByaW50Zigmc3RyaW5nW2pdLCAiJTF4IiwgdmFsdWUpOwotCi0JCWRwcmludGsoIkV4cG9ydDoga2V5ID0gXCIlc1wiLCAlZCBiaXRzLCB2YWx1ZSA9IEhFWCAlc1xuIiwKLQkJCWtleSwgY291bnQsIHN0cmluZyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFsdGVyYV9leGVjdXRlKHN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSwKLQkJCQl1OCAqcCwKLQkJCQlzMzIgcHJvZ3JhbV9zaXplLAotCQkJCXMzMiAqZXJyb3JfYWRkcmVzcywKLQkJCQlpbnQgKmV4aXRfY29kZSwKLQkJCQlpbnQgKmZvcm1hdF92ZXJzaW9uKQotewotCXN0cnVjdCBhbHRlcmFfY29uZmlnICphY29uZiA9IGFzdGF0ZS0+Y29uZmlnOwotCWNoYXIgKm1zZ19idWZmID0gYXN0YXRlLT5tc2dfYnVmZjsKLQlsb25nICpzdGFjayA9IGFzdGF0ZS0+c3RhY2s7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGZpcnN0X3dvcmQgPSAwTDsKLQl1MzIgYWN0aW9uX3RhYmxlID0gMEw7Ci0JdTMyIHByb2NfdGFibGUgPSAwTDsKLQl1MzIgc3RyX3RhYmxlID0gMEw7Ci0JdTMyIHN5bV90YWJsZSA9IDBMOwotCXUzMiBkYXRhX3NlY3QgPSAwTDsKLQl1MzIgY29kZV9zZWN0ID0gMEw7Ci0JdTMyIGRlYnVnX3NlY3QgPSAwTDsKLQl1MzIgYWN0aW9uX2NvdW50ID0gMEw7Ci0JdTMyIHByb2NfY291bnQgPSAwTDsKLQl1MzIgc3ltX2NvdW50ID0gMEw7Ci0JbG9uZyAqdmFycyA9IE5VTEw7Ci0JczMyICp2YXJfc2l6ZSA9IE5VTEw7Ci0JY2hhciAqYXR0cnMgPSBOVUxMOwotCXU4ICpwcm9jX2F0dHJpYnV0ZXMgPSBOVUxMOwotCXUzMiBwYzsKLQl1MzIgb3Bjb2RlX2FkZHJlc3M7Ci0JdTMyIGFyZ3NbM107Ci0JdTMyIG9wY29kZTsKLQl1MzIgbmFtZV9pZDsKLQl1OCBjaGFyYnVmWzRdOwotCWxvbmcgbG9uZ190bXA7Ci0JdTMyIHZhcmlhYmxlX2lkOwotCXU4ICpjaGFycHRyX3RtcDsKLQl1OCAqY2hhcnB0cl90bXAyOwotCWxvbmcgKmxvbmdwdHJfdG1wOwotCWludCB2ZXJzaW9uID0gMDsKLQlpbnQgZGVsdGEgPSAwOwotCWludCBzdGFja19wdHIgPSAwOwotCXUzMiBhcmdfY291bnQ7Ci0JaW50IGRvbmUgPSAwOwotCWludCBiYWRfb3Bjb2RlID0gMDsKLQl1MzIgY291bnQ7Ci0JdTMyIGluZGV4OwotCXUzMiBpbmRleDI7Ci0JczMyIGxvbmdfY291bnQ7Ci0JczMyIGxvbmdfaWR4OwotCXMzMiBsb25nX2lkeDI7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0JdTMyIHVuY29tcF9zaXplOwotCXUzMiBvZmZzZXQ7Ci0JdTMyIHZhbHVlOwotCWludCBjdXJyZW50X3Byb2MgPSAwOwotCWludCByZXZlcnNlOwotCi0JY2hhciAqbmFtZTsKLQotCWRwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZWFkIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotCWlmIChwcm9ncmFtX3NpemUgPiA1MkwpIHsKLQkJZmlyc3Rfd29yZCAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFswXSk7Ci0JCXZlcnNpb24gPSAoZmlyc3Rfd29yZCAmIDFMKTsKLQkJKmZvcm1hdF92ZXJzaW9uID0gdmVyc2lvbiArIDE7Ci0JCWRlbHRhID0gdmVyc2lvbiAqIDg7Ci0KLQkJYWN0aW9uX3RhYmxlICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0XSk7Ci0JCXByb2NfdGFibGUgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbOF0pOwotCQlzdHJfdGFibGUgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQgKyBkZWx0YV0pOwotCQlzeW1fdGFibGUgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzE2ICsgZGVsdGFdKTsKLQkJZGF0YV9zZWN0ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsyMCArIGRlbHRhXSk7Ci0JCWNvZGVfc2VjdCAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMjQgKyBkZWx0YV0pOwotCQlkZWJ1Z19zZWN0ID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzI4ICsgZGVsdGFdKTsKLQkJYWN0aW9uX2NvdW50ICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0MCArIGRlbHRhXSk7Ci0JCXByb2NfY291bnQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDQgKyBkZWx0YV0pOwotCQlzeW1fY291bnQgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzQ4ICsgKDIgKiBkZWx0YSldKTsKLQl9Ci0KLQlpZiAoKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMEwpICYmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKSkgewotCQlkb25lID0gMTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBleGl0X2RvbmU7Ci0JfQotCi0JaWYgKHN5bV9jb3VudCA8PSAwKQotCQlnb3RvIGV4aXRfZG9uZTsKLQotCXZhcnMgPSBremFsbG9jKHN5bV9jb3VudCAqIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAodmFycyA9PSBOVUxMKQotCQlzdGF0dXMgPSAtRU5PTUVNOwotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXZhcl9zaXplID0ga3phbGxvYyhzeW1fY291bnQgKiBzaXplb2YoczMyKSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHZhcl9zaXplID09IE5VTEwpCi0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCX0KLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlhdHRycyA9IGt6YWxsb2Moc3ltX2NvdW50LCBHRlBfS0VSTkVMKTsKLQotCQlpZiAoYXR0cnMgPT0gTlVMTCkKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JfQotCi0JaWYgKChzdGF0dXMgPT0gMCkgJiYgKHZlcnNpb24gPiAwKSkgewotCQlwcm9jX2F0dHJpYnV0ZXMgPSBremFsbG9jKHByb2NfY291bnQsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwcm9jX2F0dHJpYnV0ZXMgPT0gTlVMTCkKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGV4aXRfZG9uZTsKLQotCWRlbHRhID0gdmVyc2lvbiAqIDI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3ltX2NvdW50OyArK2kpIHsKLQkJb2Zmc2V0ID0gKHN5bV90YWJsZSArICgoMTEgKyBkZWx0YSkgKiBpKSk7Ci0KLQkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbb2Zmc2V0ICsgMyArIGRlbHRhXSk7Ci0KLQkJYXR0cnNbaV0gPSBwW29mZnNldF07Ci0KLQkJLyoKLQkJICogdXNlIGJpdCA3IG9mIGF0dHJpYnV0ZSBieXRlIHRvIGluZGljYXRlIHRoYXQKLQkJICogdGhpcyBidWZmZXIgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkgKiBhbmQgc2hvdWxkIGJlIGZyZWVkIGxhdGVyCi0JCSAqLwotCQlhdHRyc1tpXSAmPSAweDdmOwotCi0JCXZhcl9zaXplW2ldID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW29mZnNldCArIDcgKyBkZWx0YV0pOwotCi0JCS8qCi0JCSAqIEF0dHJpYnV0ZSBiaXRzOgotCQkgKiBiaXQgMDogMCA9IHJlYWQtb25seSwgMSA9IHJlYWQtd3JpdGUKLQkJICogYml0IDE6IDAgPSBub3QgY29tcHJlc3NlZCwgMSA9IGNvbXByZXNzZWQKLQkJICogYml0IDI6IDAgPSBub3QgaW5pdGlhbGl6ZWQsIDEgPSBpbml0aWFsaXplZAotCQkgKiBiaXQgMzogMCA9IHNjYWxhciwgMSA9IGFycmF5Ci0JCSAqIGJpdCA0OiAwID0gQm9vbGVhbiwgMSA9IGludGVnZXIKLQkJICogYml0IDU6IDAgPSBkZWNsYXJlZCB2YXJpYWJsZSwKLQkJICoJMSA9IGNvbXBpbGVyIGNyZWF0ZWQgdGVtcG9yYXJ5IHZhcmlhYmxlCi0JCSAqLwotCi0JCWlmICgoYXR0cnNbaV0gJiAweDBjKSA9PSAweDA0KQotCQkJLyogaW5pdGlhbGl6ZWQgc2NhbGFyIHZhcmlhYmxlICovCi0JCQl2YXJzW2ldID0gdmFsdWU7Ci0JCWVsc2UgaWYgKChhdHRyc1tpXSAmIDB4MWUpID09IDB4MGUpIHsKLQkJCS8qIGluaXRpYWxpemVkIGNvbXByZXNzZWQgQm9vbGVhbiBhcnJheSAqLwotCQkJdW5jb21wX3NpemUgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBbZGF0YV9zZWN0ICsgdmFsdWVdKTsKLQotCQkJLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotCQkJdmFyc1tpXSA9IChsb25nKWt6YWxsb2ModW5jb21wX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKHZhcnNbaV0gPT0gMEwpCi0JCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWVsc2UgewotCQkJCS8qIHNldCBmbGFnIHNvIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGxhdGVyICovCi0JCQkJYXR0cnNbaV0gfD0gMHg4MDsKLQotCQkJCS8qIHVuY29tcHJlc3MgdGhlIGRhdGEgKi8KLQkJCQlpZiAoYWx0ZXJhX3NocmluaygmcFtkYXRhX3NlY3QgKyB2YWx1ZV0sCi0JCQkJCQl2YXJfc2l6ZVtpXSwKLQkJCQkJCSh1OCAqKXZhcnNbaV0sCi0JCQkJCQl1bmNvbXBfc2l6ZSwKLQkJCQkJCXZlcnNpb24pICE9IHVuY29tcF9zaXplKQotCQkJCQkvKiBkZWNvbXByZXNzaW9uIGZhaWxlZCAqLwotCQkJCQlzdGF0dXMgPSAtRUlPOwotCQkJCWVsc2UKLQkJCQkJdmFyX3NpemVbaV0gPSB1bmNvbXBfc2l6ZSAqIDhMOwotCi0JCQl9Ci0JCX0gZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgxZSkgPT0gMHgwYykgewotCQkJLyogaW5pdGlhbGl6ZWQgQm9vbGVhbiBhcnJheSAqLwotCQkJdmFyc1tpXSA9IHZhbHVlICsgZGF0YV9zZWN0ICsgKGxvbmcpcDsKLQkJfSBlbHNlIGlmICgoYXR0cnNbaV0gJiAweDFjKSA9PSAweDFjKSB7Ci0JCQkvKiBpbml0aWFsaXplZCBpbnRlZ2VyIGFycmF5ICovCi0JCQl2YXJzW2ldID0gdmFsdWUgKyBkYXRhX3NlY3Q7Ci0JCX0gZWxzZSBpZiAoKGF0dHJzW2ldICYgMHgwYykgPT0gMHgwOCkgewotCQkJLyogdW5pbml0aWFsaXplZCBhcnJheSAqLwotCi0JCQkvKiBmbGFnIGF0dHJzIHNvIHRoYXQgbWVtb3J5IGlzIGZyZWVkICovCi0JCQlhdHRyc1tpXSB8PSAweDgwOwotCi0JCQlpZiAodmFyX3NpemVbaV0gPiAwKSB7Ci0JCQkJdTMyIHNpemU7Ci0KLQkJCQlpZiAoYXR0cnNbaV0gJiAweDEwKQotCQkJCQkvKiBpbnRlZ2VyIGFycmF5ICovCi0JCQkJCXNpemUgPSAodmFyX3NpemVbaV0gKiBzaXplb2YoczMyKSk7Ci0JCQkJZWxzZQotCQkJCQkvKiBCb29sZWFuIGFycmF5ICovCi0JCQkJCXNpemUgPSAoKHZhcl9zaXplW2ldICsgN0wpIC8gOEwpOwotCi0JCQkJdmFyc1tpXSA9IChsb25nKWt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJCQlpZiAodmFyc1tpXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogemVybyBvdXQgbWVtb3J5ICovCi0JCQkJCWZvciAoaiA9IDA7IGogPCBzaXplOyArK2opCi0JCQkJCQkoKHU4ICopKHZhcnNbaV0pKVtqXSA9IDA7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQl2YXJzW2ldID0gMDsKLQotCQl9IGVsc2UKLQkJCXZhcnNbaV0gPSAwOwotCi0JfQotCi1leGl0X2RvbmU6Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlkb25lID0gMTsKLQotCWFsdGVyYV9qaW5pdChhc3RhdGUpOwotCi0JcGMgPSBjb2RlX3NlY3Q7Ci0JbXNnX2J1ZmZbMF0gPSAnXDAnOwotCi0JLyoKLQkgKiBGb3IgSkJDIHZlcnNpb24gMiwgd2Ugd2lsbCBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIGNvcnJlc3BvbmRpbmcgdG8KLQkgKiB0aGUgc2VsZWN0ZWQgQUNUSU9OCi0JICovCi0JaWYgKHZlcnNpb24gPiAwKSB7Ci0JCWlmIChhY29uZi0+YWN0aW9uID09IE5VTEwpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlkb25lID0gMTsKLQkJfSBlbHNlIHsKLQkJCWludCBhY3Rpb25fZm91bmQgPSAwOwotCQkJZm9yIChpID0gMDsgKGkgPCBhY3Rpb25fY291bnQpICYmICFhY3Rpb25fZm91bmQ7ICsraSkgewotCQkJCW5hbWVfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbYWN0aW9uX3RhYmxlICsKLQkJCQkJCQkJKDEyICogaSldKTsKLQotCQkJCW5hbWUgPSAmcFtzdHJfdGFibGUgKyBuYW1lX2lkXTsKLQotCQkJCWlmIChzdHJuaWNtcChhY29uZi0+YWN0aW9uLCBuYW1lLCBzdHJsZW4obmFtZSkpID09IDApIHsKLQkJCQkJYWN0aW9uX2ZvdW5kID0gMTsKLQkJCQkJY3VycmVudF9wcm9jID0KLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKwotCQkJCQkJCQkoMTIgKiBpKSArIDhdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghYWN0aW9uX2ZvdW5kKSB7Ci0JCQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJCQlkb25lID0gMTsKLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJaW50IGZpcnN0X3RpbWUgPSAxOwotCQkJaSA9IGN1cnJlbnRfcHJvYzsKLQkJCXdoaWxlICgoaSAhPSAwKSB8fCBmaXJzdF90aW1lKSB7Ci0JCQkJZmlyc3RfdGltZSA9IDA7Ci0JCQkJLyogY2hlY2sgcHJvY2VkdXJlIGF0dHJpYnV0ZSBieXRlICovCi0JCQkJcHJvY19hdHRyaWJ1dGVzW2ldID0KLQkJCQkJCShwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDhdICYKLQkJCQkJCQkJCTB4MDMpOwotCi0JCQkJLyoKLQkJCQkgKiBCSVQwIC0gT1BUSU9OQUwKLQkJCQkgKiBCSVQxIC0gUkVDT01NRU5ERUQKLQkJCQkgKiBCSVQ2IC0gRk9SQ0VEIE9GRgotCQkJCSAqIEJJVDcgLSBGT1JDRUQgT04KLQkJCQkgKi8KLQotCQkJCWkgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcHJvY190YWJsZSArCi0JCQkJCQkJKDEzICogaSkgKyA0XSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBTZXQgY3VycmVudF9wcm9jIHRvIHRoZSBmaXJzdCBwcm9jZWR1cmUKLQkJCSAqIHRvIGJlIGV4ZWN1dGVkCi0JCQkgKi8KLQkJCWkgPSBjdXJyZW50X3Byb2M7Ci0JCQl3aGlsZSAoKGkgIT0gMCkgJiYKLQkJCQkoKHByb2NfYXR0cmlidXRlc1tpXSA9PSAxKSB8fAotCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldICYgMHhjMCkgPT0gMHg0MCkpKSB7Ci0JCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKLQkJCQkJCQkoMTMgKiBpKSArIDRdKTsKLQkJCX0KLQotCQkJaWYgKChpICE9IDApIHx8ICgoaSA9PSAwKSAmJiAoY3VycmVudF9wcm9jID09IDApICYmCi0JCQkJKChwcm9jX2F0dHJpYnV0ZXNbMF0gIT0gMSkgJiYKLQkJCQkoKHByb2NfYXR0cmlidXRlc1swXSAmIDB4YzApICE9IDB4NDApKSkpIHsKLQkJCQljdXJyZW50X3Byb2MgPSBpOwotCQkJCXBjID0gY29kZV9zZWN0ICsKLQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDldKTsKLQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fCAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQl9IGVsc2UKLQkJCQkvKiB0aGVyZSBhcmUgbm8gcHJvY2VkdXJlcyB0byBleGVjdXRlISAqLwotCQkJCWRvbmUgPSAxOwotCi0JCX0KLQl9Ci0KLQltc2dfYnVmZlswXSA9ICdcMCc7Ci0KLQl3aGlsZSAoIWRvbmUpIHsKLQkJb3Bjb2RlID0gKHBbcGNdICYgMHhmZik7Ci0JCW9wY29kZV9hZGRyZXNzID0gcGM7Ci0JCSsrcGM7Ci0KLQkJaWYgKGRlYnVnID4gMSkKLQkJCXByaW50aygib3Bjb2RlOiAlMDJ4XG4iLCBvcGNvZGUpOwotCi0JCWFyZ19jb3VudCA9IChvcGNvZGUgPj4gNikgJiAzOwotCQlmb3IgKGkgPSAwOyBpIDwgYXJnX2NvdW50OyArK2kpIHsKLQkJCWFyZ3NbaV0gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbcGNdKTsKLQkJCXBjICs9IDQ7Ci0JCX0KLQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIE9QX05PUDoKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RVUDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1NXUDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQUREOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gKz0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1NVQjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIC09IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9NVUxUOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gKj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0RJVjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIC89IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9NT0Q6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKLQkJCQktLXN0YWNrX3B0cjsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSAlPSBzdGFja1tzdGFja19wdHJdOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfU0hMOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPDw9IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9TSFI6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpIHsKLQkJCQktLXN0YWNrX3B0cjsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA+Pj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX05PVDoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSBePSAoLTFMKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQU5EOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gJj0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX09SOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJLS1zdGFja19wdHI7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gfD0gc3RhY2tbc3RhY2tfcHRyXTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1hPUjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCS0tc3RhY2tfcHRyOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdIF49IHN0YWNrW3N0YWNrX3B0cl07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JTlY6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBzdGFja1tzdGFja19wdHIgLSAxXSA/IDBMIDogMUw7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9HVDoKLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQktLXN0YWNrX3B0cjsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KLQkJCQkoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPiBzdGFja1tzdGFja19wdHJdKSA/Ci0JCQkJCQkJCQkxTCA6IDBMOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9MVDoKLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQktLXN0YWNrX3B0cjsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0KLQkJCQkoc3RhY2tbc3RhY2tfcHRyIC0gMV0gPCBzdGFja1tzdGFja19wdHJdKSA/Ci0JCQkJCQkJCQkxTCA6IDBMOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9SRVQ6Ci0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJiAoc3RhY2tfcHRyID09IDApKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBjb21wbGV0ZWQgb25lIG9mIHRoZSBtYWluIHByb2NlZHVyZXMKLQkJCQkgKiBvZiBhbiBBQ1RJT04uCi0JCQkJICogRmluZCB0aGUgbmV4dCBwcm9jZWR1cmUKLQkJCQkgKiB0byBiZSBleGVjdXRlZCBhbmQganVtcCB0byBpdC4KLQkJCQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBwcm9jZWR1cmVzLCB0aGVuIEVYSVQuCi0JCQkJICovCi0JCQkJaSA9IGdldF91bmFsaWduZWRfYmUzMigmcFtwcm9jX3RhYmxlICsKLQkJCQkJCSgxMyAqIGN1cnJlbnRfcHJvYykgKyA0XSk7Ci0JCQkJd2hpbGUgKChpICE9IDApICYmCi0JCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldID09IDEpIHx8Ci0JCQkJCSgocHJvY19hdHRyaWJ1dGVzW2ldICYgMHhjMCkgPT0gMHg0MCkpKQotCQkJCQlpID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW3Byb2NfdGFibGUgKwotCQkJCQkJCQkoMTMgKiBpKSArIDRdKTsKLQotCQkJCWlmIChpID09IDApIHsKLQkJCQkJLyogbm8gcHJvY2VkdXJlcyB0byBleGVjdXRlISAqLwotCQkJCQlkb25lID0gMTsKLQkJCQkJKmV4aXRfY29kZSA9IDA7CS8qIHN1Y2Nlc3MgKi8KLQkJCQl9IGVsc2UgewotCQkJCQljdXJyZW50X3Byb2MgPSBpOwotCQkJCQlwYyA9IGNvZGVfc2VjdCArIGdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCQkJJnBbcHJvY190YWJsZSArCi0JCQkJCQkJCSgxMyAqIGkpICsgOV0pOwotCQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fAotCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQotCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQl9Ci0KLQkJCX0gZWxzZQotCQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCQlwYyA9IHN0YWNrWy0tc3RhY2tfcHRyXSArIGNvZGVfc2VjdDsKLQkJCQkJaWYgKChwYyA8PSBjb2RlX3NlY3QpIHx8Ci0JCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCi0JCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9DTVBTOgotCQkJLyoKLQkJCSAqIEFycmF5IHNob3J0IGNvbXBhcmUKLQkJCSAqIC4uLnN0YWNrIDAgaXMgc291cmNlIDEgdmFsdWUKLQkJCSAqIC4uLnN0YWNrIDEgaXMgc291cmNlIDIgdmFsdWUKLQkJCSAqIC4uLnN0YWNrIDIgaXMgbWFzayB2YWx1ZQotCQkJICogLi4uc3RhY2sgMyBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgNCwgJnN0YXR1cykpIHsKLQkJCQlzMzIgYSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzMzIgYiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQljb3VudCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCi0JCQkJaWYgKChjb3VudCA8IDEpIHx8IChjb3VudCA+IDMyKSkKLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQllbHNlIHsKLQkJCQkJbG9uZ190bXAgJj0gKCgtMUwpID4+ICgzMiAtIGNvdW50KSk7Ci0KLQkJCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPQotCQkJCQkoKGEgJiBsb25nX3RtcCkgPT0gKGIgJiBsb25nX3RtcCkpCi0JCQkJCQkJCT8gMUwgOiAwTDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QSU5UOgotCQkJLyoKLQkJCSAqIFBSSU5UIGFkZCBpbnRlZ2VyCi0JCQkgKiAuLi5zdGFjayAwIGlzIGludGVnZXIgdmFsdWUKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCXNwcmludGYoJm1zZ19idWZmW3N0cmxlbihtc2dfYnVmZildLAotCQkJCQkiJWxkIiwgc3RhY2tbLS1zdGFja19wdHJdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1BSTlQ6Ci0JCQkvKiBQUklOVCBmaW5pc2ggKi8KLQkJCWlmIChkZWJ1ZykKLQkJCQlwcmludGsobXNnX2J1ZmYsICJcbiIpOwotCi0JCQltc2dfYnVmZlswXSA9ICdcMCc7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EU1M6Ci0JCQkvKgotCQkJICogRFJTQ0FOIHNob3J0Ci0JCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOwotCQkJc3RhdHVzID0gYWx0ZXJhX2Ryc2Nhbihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RTU0M6Ci0JCQkvKgotCQkJICogRFJTQ0FOIHNob3J0IHdpdGggY2FwdHVyZQotCQkJICogLi4uc3RhY2sgMCBpcyBzY2FuIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJY291bnQgPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCXB1dF91bmFsaWduZWRfbGUzMihsb25nX3RtcCwgJmNoYXJidWZbMF0pOwotCQkJc3RhdHVzID0gYWx0ZXJhX3N3YXBfZHIoYXN0YXRlLCBjb3VudCwgY2hhcmJ1ZiwKLQkJCQkJCQkwLCBjaGFyYnVmLCAwKTsKLQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZjaGFyYnVmWzBdKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0lTUzoKLQkJCS8qCi0JCQkgKiBJUlNDQU4gc2hvcnQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgc2NhbiBkYXRhCi0JCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50Ci0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfaXJzY2FuKGFzdGF0ZSwgY291bnQsIGNoYXJidWYsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVNTQzoKLQkJCS8qCi0JCQkgKiBJUlNDQU4gc2hvcnQgd2l0aCBjYXB0dXJlCi0JCQkgKiAuLi5zdGFjayAwIGlzIHNjYW4gZGF0YQotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc3dhcF9pcihhc3RhdGUsIGNvdW50LCBjaGFyYnVmLAotCQkJCQkJCTAsIGNoYXJidWYsIDApOwotCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBnZXRfdW5hbGlnbmVkX2xlMzIoJmNoYXJidWZbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRFBSOgotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LCAwLCBOVUxMKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQUkw6Ci0JCQkvKgotCQkJICogRFJQUkUgd2l0aCBsaXRlcmFsIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIDAsCi0JCQkJCQljaGFyYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQTzoKLQkJCS8qCi0JCQkgKiBEUlBPU1QKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKSB7Ci0JCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9kcl9wb3N0KCZhc3RhdGUtPmpzLCBjb3VudCwKLQkJCQkJCQkJMCwgTlVMTCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EUE9MOgotCQkJLyoKLQkJCSAqIERSUE9TVCB3aXRoIGxpdGVyYWwgZGF0YQotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlwdXRfdW5hbGlnbmVkX2xlMzIobG9uZ190bXAsICZjaGFyYnVmWzBdKTsKLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIDAsCi0JCQkJCQkJY2hhcmJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JUFI6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsCi0JCQkJCQkJCTAsIE5VTEwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBSTDoKLQkJCS8qCi0JCQkgKiBJUlBSRSB3aXRoIGxpdGVyYWwgZGF0YQotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBsaXRlcmFsIGRhdGEKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQkJc3RhdHVzID0gYWx0ZXJhX3NldF9pcl9wcmUoJmFzdGF0ZS0+anMsIGNvdW50LAotCQkJCQkJCTAsIGNoYXJidWYpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPOgotCQkJLyoKLQkJCSAqIElSUE9TVAotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LAotCQkJCQkJCTAsIE5VTEwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPTDoKLQkJCS8qCi0JCQkgKiBJUlBPU1Qgd2l0aCBsaXRlcmFsIGRhdGEKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgbGl0ZXJhbCBkYXRhCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGxvbmdfdG1wLCAmY2hhcmJ1ZlswXSk7Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCAwLAotCQkJCQkJCWNoYXJidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUENIUjoKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAxLCAmc3RhdHVzKSkgewotCQkJCXU4IGNoOwotCQkJCWNvdW50ID0gc3RybGVuKG1zZ19idWZmKTsKLQkJCQljaCA9IChjaGFyKSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJaWYgKChjaCA8IDEpIHx8IChjaCA+IDEyNykpIHsKLQkJCQkJLyoKLQkJCQkJICogY2hhcmFjdGVyIGNvZGUgb3V0IG9mIHJhbmdlCi0JCQkJCSAqIGluc3RlYWQgb2YgZmxhZ2dpbmcgYW4gZXJyb3IsCi0JCQkJCSAqIGZvcmNlIHRoZSB2YWx1ZSB0byAxMjcKLQkJCQkJICovCi0JCQkJCWNoID0gMTI3OwotCQkJCX0KLQkJCQltc2dfYnVmZltjb3VudF0gPSBjaDsKLQkJCQltc2dfYnVmZltjb3VudCArIDFdID0gJ1wwJzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0VYSVQ6Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCi0JCQkJKmV4aXRfY29kZSA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJZG9uZSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9FUVU6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJLS1zdGFja19wdHI7Ci0JCQlzdGFja1tzdGFja19wdHIgLSAxXSA9Ci0JCQkJKHN0YWNrW3N0YWNrX3B0ciAtIDFdID09IHN0YWNrW3N0YWNrX3B0cl0pID8KLQkJCQkJCQkJCTFMIDogMEw7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QT1BUOgotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCS0tc3RhY2tfcHRyOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9BQlM6Ci0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaWYgKHN0YWNrW3N0YWNrX3B0ciAtIDFdIDwgMCkKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IDAgLSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQkNIMDoKLQkJCS8qCi0JCQkgKiBCYXRjaCBvcGVyYXRpb24gMAotCQkJICogU1dQCi0JCQkgKiBTV1BOIDcKLQkJCSAqIFNXUAotCQkJICogU1dQTiA2Ci0JCQkgKiBEVVBOIDgKLQkJCSAqIFNXUE4gMgotCQkJICogU1dQCi0JCQkgKiBEVVBOIDYKLQkJCSAqIERVUE4gNgotCQkJICovCi0KLQkJCS8qIFNXUCAgKi8KLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBTV1BOIDcgKi8KLQkJCWluZGV4ID0gNyArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdID0gc3RhY2tbc3RhY2tfcHRyIC0gMV07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMV0gPSBsb25nX3RtcDsKLQkJCX0KLQotCQkJLyogU1dQICAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKSB7Ci0JCQkJbG9uZ190bXAgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7Ci0JCQl9Ci0KLQkJCS8qIFNXUE4gNiAqLwotCQkJaW5kZXggPSA2ICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBEVVBOIDggKi8KLQkJCWluZGV4ID0gOCArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQotCQkJLyogU1dQTiAyICovCi0JCQlpbmRleCA9IDIgKyAxOwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XSA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXN0YWNrW3N0YWNrX3B0ciAtIDFdID0gbG9uZ190bXA7Ci0JCQl9Ci0KLQkJCS8qIFNXUCAgKi8KLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkgewotCQkJCWxvbmdfdG1wID0gc3RhY2tbc3RhY2tfcHRyIC0gMl07Ci0JCQkJc3RhY2tbc3RhY2tfcHRyIC0gMl0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCi0JCQkvKiBEVVBOIDYgKi8KLQkJCWluZGV4ID0gNiArIDE7Ci0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgaW5kZXgsICZzdGF0dXMpKSB7Ci0JCQkJc3RhY2tbc3RhY2tfcHRyXSA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQkrK3N0YWNrX3B0cjsKLQkJCX0KLQotCQkJLyogRFVQTiA2ICovCi0JCQlpbmRleCA9IDYgKyAxOwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIGluZGV4LCAmc3RhdHVzKSkgewotCQkJCXN0YWNrW3N0YWNrX3B0cl0gPSBzdGFja1tzdGFja19wdHIgLSBpbmRleF07Ci0JCQkJKytzdGFja19wdHI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QU0gwOgotCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1BTSEw6Ci0JCQlzdGFja1tzdGFja19wdHIrK10gPSAoczMyKSBhcmdzWzBdOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIVjoKLQkJCXN0YWNrW3N0YWNrX3B0cisrXSA9IHZhcnNbYXJnc1swXV07Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9KTVA6Ci0JCQlwYyA9IGFyZ3NbMF0gKyBjb2RlX3NlY3Q7Ci0JCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fCAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0NBTEw6Ci0JCQlzdGFja1tzdGFja19wdHIrK10gPSBwYzsKLQkJCXBjID0gYXJnc1swXSArIGNvZGVfc2VjdDsKLQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8IChwYyA+PSBkZWJ1Z19zZWN0KSkKLQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTkVYVDoKLQkJCS8qCi0JCQkgKiBQcm9jZXNzIEZPUiAvIE5FWFQgbG9vcAotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBzdGVwIHZhbHVlCi0JCQkgKiAuLi5zdGFjayAxIGlzIGVuZCB2YWx1ZQotCQkJICogLi4uc3RhY2sgMiBpcyB0b3AgYWRkcmVzcwotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMywgJnN0YXR1cykpIHsKLQkJCQlzMzIgc3RlcCA9IHN0YWNrW3N0YWNrX3B0ciAtIDFdOwotCQkJCXMzMiBlbmQgPSBzdGFja1tzdGFja19wdHIgLSAyXTsKLQkJCQlzMzIgdG9wID0gc3RhY2tbc3RhY2tfcHRyIC0gM107Ci0JCQkJczMyIGl0ZXJhdG9yID0gdmFyc1thcmdzWzBdXTsKLQkJCQlpbnQgYnJlYWtfb3V0ID0gMDsKLQotCQkJCWlmIChzdGVwIDwgMCkgewotCQkJCQlpZiAoaXRlcmF0b3IgPD0gZW5kKQotCQkJCQkJYnJlYWtfb3V0ID0gMTsKLQkJCQl9IGVsc2UgaWYgKGl0ZXJhdG9yID49IGVuZCkKLQkJCQkJYnJlYWtfb3V0ID0gMTsKLQotCQkJCWlmIChicmVha19vdXQpIHsKLQkJCQkJc3RhY2tfcHRyIC09IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFyc1thcmdzWzBdXSA9IGl0ZXJhdG9yICsgc3RlcDsKLQkJCQkJcGMgPSB0b3AgKyBjb2RlX3NlY3Q7Ci0JCQkJCWlmICgocGMgPCBjb2RlX3NlY3QpIHx8Ci0JCQkJCSAgICAocGMgPj0gZGVidWdfc2VjdCkpCi0JCQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BTVFI6Ci0JCQkvKgotCQkJICogUFJJTlQgYWRkIHN0cmluZwotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdHJpbmcgSUQKLQkJCSAqLwotCQkJY291bnQgPSBzdHJsZW4obXNnX2J1ZmYpOwotCQkJc3RybGNweSgmbXNnX2J1ZmZbY291bnRdLAotCQkJCSZwW3N0cl90YWJsZSArIGFyZ3NbMF1dLAotCQkJCUFMVEVSQV9NRVNTQUdFX0xFTkdUSCAtIGNvdW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1NJTlQ6Ci0JCQkvKgotCQkJICogU1RBVEUgaW50ZXJtZWRpYXRlIHN0YXRlCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHN0YXRlIGNvZGUKLQkJCSAqLwotCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwgYXJnc1swXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9TVDoKLQkJCS8qCi0JCQkgKiBTVEFURSBmaW5hbCBzdGF0ZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFsdGVyYV9nb3RvX2pzdGF0ZShhc3RhdGUsIGFyZ3NbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVNUUDoKLQkJCS8qCi0JCQkgKiBJUlNUT1Agc3RhdGUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RhdGUgY29kZQotCQkJICovCi0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyc3RvcCgmYXN0YXRlLT5qcywgYXJnc1swXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EU1RQOgotCQkJLyoKLQkJCSAqIERSU1RPUCBzdGF0ZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzdGF0ZSBjb2RlCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfZHJzdG9wKCZhc3RhdGUtPmpzLCBhcmdzWzBdKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT1BfU1dQTjoKLQkJCS8qCi0JCQkgKiBFeGNoYW5nZSB0b3Agd2l0aCBOdGggc3RhY2sgdmFsdWUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgMC1iYXNlZCBzdGFjayBlbnRyeQotCQkJICogdG8gc3dhcCB3aXRoIHRvcCBlbGVtZW50Ci0JCQkgKi8KLQkJCWluZGV4ID0gKGFyZ3NbMF0pICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlsb25nX3RtcCA9IHN0YWNrW3N0YWNrX3B0ciAtIGluZGV4XTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSBpbmRleF0gPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRFVQTjoKLQkJCS8qCi0JCQkgKiBEdXBsaWNhdGUgTnRoIHN0YWNrIHZhbHVlCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIDAtYmFzZWQgc3RhY2sgZW50cnkgdG8gZHVwbGljYXRlCi0JCQkgKi8KLQkJCWluZGV4ID0gKGFyZ3NbMF0pICsgMTsKLQkJCWlmIChhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCBpbmRleCwgJnN0YXR1cykpIHsKLQkJCQlzdGFja1tzdGFja19wdHJdID0gc3RhY2tbc3RhY2tfcHRyIC0gaW5kZXhdOwotCQkJCSsrc3RhY2tfcHRyOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUE9QVjoKLQkJCS8qCi0JCQkgKiBQb3Agc3RhY2sgaW50byBzY2FsYXIgdmFyaWFibGUKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgdmFsdWUKLQkJCSAqLwotCQkJaWYgKGFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCXZhcnNbYXJnc1swXV0gPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BPUEU6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGludG8gaW50ZWdlciBhcnJheSBlbGVtZW50Ci0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHZhbHVlCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07Ci0KLQkJCS8qCi0JCQkgKiBJZiB2YXJpYWJsZSBpcyByZWFkLW9ubHksCi0JCQkgKiBjb252ZXJ0IHRvIHdyaXRhYmxlIGFycmF5Ci0JCQkgKi8KLQkJCWlmICgodmVyc2lvbiA+IDApICYmCi0JCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDFjKSkgewotCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCi0JCQkJY291bnQgPSB2YXJfc2l6ZVt2YXJpYWJsZV9pZF07Ci0JCQkJbG9uZ190bXAgPSB2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQlsb25ncHRyX3RtcCA9IGt6YWxsb2MoY291bnQgKiBzaXplb2YobG9uZyksCi0JCQkJCQkJCUdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpbG9uZ3B0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCQkJbG9uZ3B0cl90bXBbaV0gPQotCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2xvbmdfdG1wXSk7Ci0JCQkJCWxvbmdfdG1wICs9IHNpemVvZihsb25nKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIHNldCBiaXQgNyAtIGJ1ZmZlciB3YXMKLQkJCQkgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQKLQkJCQkgKi8KLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHg4MDsKLQotCQkJCS8qIGNsZWFyIGJpdCAyIC0gdmFyaWFibGUgaXMgd3JpdGFibGUgKi8KLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gJj0gfjB4MDQ7Ci0JCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4MDE7Ci0KLQkJCX0KLQotCQkJLyogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcyBhIHdyaXRhYmxlIGludGVnZXIgYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxYykgIT0gMHgxOCkKLQkJCQlzdGF0dXMgPSAtRVJBTkdFOwotCQkJZWxzZSB7Ci0JCQkJbG9uZ3B0cl90bXAgPSAobG9uZyAqKXZhcnNbdmFyaWFibGVfaWRdOwotCi0JCQkJLyogcG9wIHRoZSBhcnJheSBpbmRleCAqLwotCQkJCWluZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJLyogcG9wIHRoZSB2YWx1ZSBhbmQgc3RvcmUgaXQgaW50byB0aGUgYXJyYXkgKi8KLQkJCQlsb25ncHRyX3RtcFtpbmRleF0gPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX1BPUEE6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGludG8gQm9vbGVhbiBhcnJheQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBjb3VudAotCQkJICogLi4uc3RhY2sgMSBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyB2YWx1ZQotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDMsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOwotCi0JCQkvKgotCQkJICogSWYgdmFyaWFibGUgaXMgcmVhZC1vbmx5LAotCQkJICogY29udmVydCB0byB3cml0YWJsZSBhcnJheQotCQkJICovCi0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgwYykpIHsKLQkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0KLQkJCQkJKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSA+PiAzTDsKLQkJCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQljaGFycHRyX3RtcCA9Ci0JCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpY2hhcnB0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiB6ZXJvIHRoZSBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7Ci0JCQkJCWxvbmdfaWR4IDwgbG9uZ190bXA7Ci0JCQkJCSsrbG9uZ19pZHgpIHsKLQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHhdID0gMDsKLQkJCQl9Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChsb25nX2lkeCA9IDBMOwotCQkJCQlsb25nX2lkeCA8IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKLQkJCQkJKytsb25nX2lkeCkgewotCQkJCQlsb25nX2lkeDIgPSBsb25nX2lkeDsKLQotCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfaWR4MiA+PiAzXSAmCi0JCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpKSB7Ci0JCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChsb25nX2lkeCAmIDcpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogc2V0IGJpdCA3IC0gYnVmZmVyIHdhcwotCQkJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKLQotCQkJfQotCi0JCQkvKgotCQkJICogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcwotCQkJICogYSB3cml0YWJsZSBCb29sZWFuIGFycmF5Ci0JCQkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxYykgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07Ci0KLQkJCS8qIHBvcCB0aGUgY291bnQgKG51bWJlciBvZiBiaXRzIHRvIGNvcHkpICovCi0JCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkvKiBwb3AgdGhlIGFycmF5IGluZGV4ICovCi0JCQlsb25nX2lkeCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJcmV2ZXJzZSA9IDA7Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQotCQkJCWlmIChsb25nX2lkeCA+IGxvbmdfY291bnQpIHsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCWxvbmdfdG1wID0gbG9uZ19jb3VudDsKLQkJCQkJbG9uZ19jb3VudCA9IDEgKyBsb25nX2lkeCAtCi0JCQkJCQkJCWxvbmdfY291bnQ7Ci0JCQkJCWxvbmdfaWR4ID0gbG9uZ190bXA7Ci0KLQkJCQkJLyogcmV2ZXJzZSBQT1BBIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlCi0JCQkJCWxvbmdfY291bnQgPSAxICsgbG9uZ19jb3VudCAtCi0JCQkJCQkJCWxvbmdfaWR4OwotCi0JCQl9Ci0KLQkJCS8qIHBvcCB0aGUgZGF0YSAqLwotCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWlmIChsb25nX2NvdW50IDwgMSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBsb25nX2NvdW50OyArK2kpIHsKLQkJCQlpZiAobG9uZ190bXAgJiAoMUwgPDwgKHMzMikgaSkpCi0JCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4ID4+IDNMXSB8PQotCQkJCQkJKDFMIDw8IChsb25nX2lkeCAmIDdMKSk7Ci0JCQkJZWxzZQotCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzTF0gJj0KLQkJCQkJCX4oMUwgPDwgKGxvbmdfaWR4ICYgN0wpKTsKLQotCQkJCSsrbG9uZ19pZHg7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0pNUFo6Ci0JCQkvKgotCQkJICogUG9wIHN0YWNrIGFuZCBicmFuY2ggaWYgemVybwotCQkJICogLi4uYXJndW1lbnQgMCBpcyBhZGRyZXNzCi0JCQkgKiAuLi5zdGFjayAwIGlzIGNvbmRpdGlvbiB2YWx1ZQotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQlpZiAoc3RhY2tbLS1zdGFja19wdHJdID09IDApIHsKLQkJCQkJcGMgPSBhcmdzWzBdICsgY29kZV9zZWN0OwotCQkJCQlpZiAoKHBjIDwgY29kZV9zZWN0KSB8fAotCQkJCQkgICAgKHBjID49IGRlYnVnX3NlY3QpKQotCQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9EUzoKLQkJY2FzZSBPUF9JUzoKLQkJCS8qCi0JCQkgKiBEUlNDQU4KLQkJCSAqIElSU0NBTgotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzY2FuIGRhdGEgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgYXJyYXkgaW5kZXgKLQkJCSAqIC4uLnN0YWNrIDEgaXMgY291bnQKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfaWR4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXJldmVyc2UgPSAwOwotCQkJaWYgKHZlcnNpb24gPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAotCQkJCSAqIHN0YWNrIDIgPSBjb3VudAotCQkJCSAqLwotCQkJCWxvbmdfdG1wID0gbG9uZ19jb3VudDsKLQkJCQlsb25nX2NvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJaWYgKGxvbmdfaWR4ID4gbG9uZ190bXApIHsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCWxvbmdfaWR4ID0gbG9uZ190bXA7Ci0JCQkJfQotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0KLQkJCWlmIChyZXZlcnNlKSB7Ci0JCQkJLyoKLQkJCQkgKiBhbGxvY2F0ZSBhIGJ1ZmZlcgotCQkJCSAqIGFuZCByZXZlcnNlIHRoZSBkYXRhIG9yZGVyCi0JCQkJICovCi0JCQkJY2hhcnB0cl90bXAyID0gY2hhcnB0cl90bXA7Ci0JCQkJY2hhcnB0cl90bXAgPSBremFsbG9jKChsb25nX2NvdW50ID4+IDMpICsgMSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKGNoYXJwdHJfdG1wID09IE5VTEwpIHsKLQkJCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJbG9uZ190bXAgPSBsb25nX2lkeCArIGxvbmdfY291bnQgLSAxOwotCQkJCWxvbmdfaWR4MiA9IDA7Ci0JCQkJd2hpbGUgKGxvbmdfaWR4MiA8IGxvbmdfY291bnQpIHsKLQkJCQkJaWYgKGNoYXJwdHJfdG1wMltsb25nX3RtcCA+PiAzXSAmCi0JCQkJCQkJKDEgPDwgKGxvbmdfdG1wICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHgyID4+IDNdIHw9Ci0JCQkJCQkJKDEgPDwgKGxvbmdfaWR4MiAmIDcpKTsKLQkJCQkJZWxzZQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHgyID4+IDNdICY9Ci0JCQkJCQkJfigxIDw8IChsb25nX2lkeDIgJiA3KSk7Ci0KLQkJCQkJLS1sb25nX3RtcDsKLQkJCQkJKytsb25nX2lkeDI7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob3Bjb2RlID09IDB4NTEpIC8qIERTICovCi0JCQkJc3RhdHVzID0gYWx0ZXJhX2Ryc2Nhbihhc3RhdGUsIGxvbmdfY291bnQsCi0JCQkJCQljaGFycHRyX3RtcCwgbG9uZ19pZHgpOwotCQkJZWxzZSAvKiBJUyAqLwotCQkJCXN0YXR1cyA9IGFsdGVyYV9pcnNjYW4oYXN0YXRlLCBsb25nX2NvdW50LAotCQkJCQkJY2hhcnB0cl90bXAsIGxvbmdfaWR4KTsKLQotCQkJaWYgKHJldmVyc2UpCi0JCQkJa2ZyZWUoY2hhcnB0cl90bXApOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9EUFJBOgotCQkJLyoKLQkJCSAqIERSUFJFIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0RQT0E6Ci0JCQkvKgotCQkJICogRFJQT1NUIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2RyX3Bvc3QoJmFzdGF0ZS0+anMsIGNvdW50LCBpbmRleCwKLQkJCQkJCQljaGFycHRyX3RtcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9JUFJBOgotCQkJLyoKLQkJCSAqIElSUFJFIHdpdGggYXJyYXkgZGF0YQotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICogLi4uc3RhY2sgMSBpcyBjb3VudAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDIsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQlzdGF0dXMgPSBhbHRlcmFfc2V0X2lyX3ByZSgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfSVBPQToKLQkJCS8qCi0JCQkgKiBJUlBPU1Qgd2l0aCBhcnJheSBkYXRhCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGFycmF5IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIGNvdW50Ci0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMiwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQlpbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvdW50ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQlpZiAodmVyc2lvbiA+IDApCi0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gYXJyYXkgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gYXJyYXkgbGVmdCBpbmRleAotCQkJCSAqLwotCQkJCWNvdW50ID0gMSArIGNvdW50IC0gaW5kZXg7Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1thcmdzWzBdXTsKLQkJCXN0YXR1cyA9IGFsdGVyYV9zZXRfaXJfcG9zdCgmYXN0YXRlLT5qcywgY291bnQsIGluZGV4LAotCQkJCQkJCWNoYXJwdHJfdG1wKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfRVhQVDoKLQkJCS8qCi0JCQkgKiBFWFBPUlQKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RyaW5nIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIGludGVnZXIgZXhwcmVzc2lvbgotCQkJICovCi0JCQlpZiAoYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpIHsKLQkJCQluYW1lID0gJnBbc3RyX3RhYmxlICsgYXJnc1swXV07Ci0JCQkJbG9uZ190bXAgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJYWx0ZXJhX2V4cG9ydF9pbnQobmFtZSwgbG9uZ190bXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIRToKLQkJCS8qCi0JCQkgKiBQdXNoIGludGVnZXIgYXJyYXkgZWxlbWVudAotCQkJICogLi4uYXJndW1lbnQgMCBpcyB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBhcnJheSBpbmRleAotCQkJICovCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDEsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCQkJdmFyaWFibGVfaWQgPSBhcmdzWzBdOwotCQkJaW5kZXggPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJLyogY2hlY2sgdmFyaWFibGUgdHlwZSAqLwotCQkJaWYgKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDFmKSA9PSAweDE5KSB7Ci0JCQkJLyogd3JpdGFibGUgaW50ZWdlciBhcnJheSAqLwotCQkJCWxvbmdwdHJfdG1wID0gKGxvbmcgKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdwdHJfdG1wW2luZGV4XTsKLQkJCX0gZWxzZSBpZiAoKGF0dHJzW3ZhcmlhYmxlX2lkXSAmIDB4MWYpID09IDB4MWMpIHsKLQkJCQkvKiByZWFkLW9ubHkgaW50ZWdlciBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0gdmFyc1t2YXJpYWJsZV9pZF0gKwotCQkJCQkJKGluZGV4ICogc2l6ZW9mKGxvbmcpKTsKLQkJCQlzdGFja1tzdGFja19wdHIgLSAxXSA9Ci0JCQkJCWdldF91bmFsaWduZWRfYmUzMigmcFtsb25nX3RtcF0pOwotCQkJfSBlbHNlCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFNIQToKLQkJCS8qCi0JCQkgKiBQdXNoIEJvb2xlYW4gYXJyYXkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgdmFyaWFibGUgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgYXJyYXkgaW5kZXgKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCXZhcmlhYmxlX2lkID0gYXJnc1swXTsKLQotCQkJLyogY2hlY2sgdGhhdCB2YXJpYWJsZSBpcyBhIEJvb2xlYW4gYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxOCkgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNoYXJwdHJfdG1wID0gKHU4ICopdmFyc1t2YXJpYWJsZV9pZF07Ci0KLQkJCS8qIHBvcCB0aGUgY291bnQgKG51bWJlciBvZiBiaXRzIHRvIGNvcHkpICovCi0JCQljb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJLyogcG9wIHRoZSBhcnJheSBpbmRleCAqLwotCQkJaW5kZXggPSBzdGFja1tzdGFja19wdHIgLSAxXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkJICogc3RhY2sgMSA9IGFycmF5IGxlZnQgaW5kZXgKLQkJCQkgKi8KLQkJCQljb3VudCA9IDEgKyBjb3VudCAtIGluZGV4OwotCi0JCQlpZiAoKGNvdW50IDwgMSkgfHwgKGNvdW50ID4gMzIpKSB7Ci0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbG9uZ190bXAgPSAwTDsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCQkJaWYgKGNoYXJwdHJfdG1wWyhpICsgaW5kZXgpID4+IDNdICYKLQkJCQkJCSgxIDw8ICgoaSArIGluZGV4KSAmIDcpKSkKLQkJCQkJbG9uZ190bXAgfD0gKDFMIDw8IGkpOwotCi0JCQlzdGFja1tzdGFja19wdHIgLSAxXSA9IGxvbmdfdG1wOwotCi0JCQlicmVhazsKLQkJY2FzZSBPUF9EWU5BOgotCQkJLyoKLQkJCSAqIER5bmFtaWNhbGx5IGNoYW5nZSBzaXplIG9mIGFycmF5Ci0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIG5ldyBzaXplCi0JCQkgKi8KLQkJCWlmICghYWx0ZXJhX2NoZWNrX3N0YWNrKHN0YWNrX3B0ciwgMSwgJnN0YXR1cykpCi0JCQkJYnJlYWs7Ci0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMF07Ci0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKGxvbmdfdG1wID4gdmFyX3NpemVbdmFyaWFibGVfaWRdKSB7Ci0JCQkJdmFyX3NpemVbdmFyaWFibGVfaWRdID0gbG9uZ190bXA7Ci0KLQkJCQlpZiAoYXR0cnNbdmFyaWFibGVfaWRdICYgMHgxMCkKLQkJCQkJLyogYWxsb2NhdGUgaW50ZWdlciBhcnJheSAqLwotCQkJCQlsb25nX3RtcCAqPSBzaXplb2YobG9uZyk7Ci0JCQkJZWxzZQotCQkJCQkvKiBhbGxvY2F0ZSBCb29sZWFuIGFycmF5ICovCi0JCQkJCWxvbmdfdG1wID0gKGxvbmdfdG1wICsgNykgPj4gMzsKLQotCQkJCS8qCi0JCQkJICogSWYgdGhlIGJ1ZmZlciB3YXMgcHJldmlvdXNseSBhbGxvY2F0ZWQsCi0JCQkJICogZnJlZSBpdAotCQkJCSAqLwotCQkJCWlmIChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDgwKSB7Ci0JCQkJCWtmcmVlKCh2b2lkICopdmFyc1t2YXJpYWJsZV9pZF0pOwotCQkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IDA7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIKLQkJCQkgKiBvZiB0aGUgcmVxdWVzdGVkIHNpemUKLQkJCQkgKi8KLQkJCQl2YXJzW3ZhcmlhYmxlX2lkXSA9IChsb25nKQotCQkJCQlremFsbG9jKGxvbmdfdG1wLCBHRlBfS0VSTkVMKTsKLQotCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogU2V0IHRoZSBhdHRyaWJ1dGUgYml0IHRvIGluZGljYXRlIHRoYXQKLQkJCQkgKiB0aGlzIGJ1ZmZlciB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZAotCQkJCSAqIHNob3VsZCBiZSBmcmVlZCBsYXRlcgotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogemVybyBvdXQgbWVtb3J5ICovCi0JCQkJY291bnQgPSAoKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSAvCi0JCQkJCQkJCQk4TCk7Ci0JCQkJY2hhcnB0cl90bXAgPSAodTggKikodmFyc1t2YXJpYWJsZV9pZF0pOwotCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyArK2luZGV4KQotCQkJCQljaGFycHRyX3RtcFtpbmRleF0gPSAwOwotCi0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIE9QX0VYUFY6Ci0JCQkvKgotCQkJICogRXhwb3J0IEJvb2xlYW4gYXJyYXkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgc3RyaW5nIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIHZhcmlhYmxlIElECi0JCQkgKiAuLi5zdGFjayAxIGlzIGFycmF5IHJpZ2h0IGluZGV4Ci0JCQkgKiAuLi5zdGFjayAyIGlzIGFycmF5IGxlZnQgaW5kZXgKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWlmICh2ZXJzaW9uID09IDApIHsKLQkJCQkvKiBFWFBWIGlzIG5vdCBzdXBwb3J0ZWQgaW4gSkJDIDEuMCAqLwotCQkJCWJhZF9vcGNvZGUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbmFtZSA9ICZwW3N0cl90YWJsZSArIGFyZ3NbMF1dOwotCQkJdmFyaWFibGVfaWQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlsb25nX2lkeCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsvKiByaWdodCBpbmR4ICovCi0JCQlsb25nX2lkeDIgPSBzdGFja1stLXN0YWNrX3B0cl07LyogbGVmdCBpbmR4ICovCi0KLQkJCWlmIChsb25nX2lkeCA+IGxvbmdfaWR4MikgewotCQkJCS8qIHJldmVyc2UgaW5kaWNlcyBub3Qgc3VwcG9ydGVkICovCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbG9uZ19jb3VudCA9IDEgKyBsb25nX2lkeDIgLSBsb25nX2lkeDsKLQotCQkJY2hhcnB0cl90bXAgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCWNoYXJwdHJfdG1wMiA9IE5VTEw7Ci0KLQkJCWlmICgobG9uZ19pZHggJiA3TCkgIT0gMCkgewotCQkJCXMzMiBrID0gbG9uZ19pZHg7Ci0JCQkJY2hhcnB0cl90bXAyID0KLQkJCQkJa3phbGxvYygoKGxvbmdfY291bnQgKyA3TCkgLyA4TCksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKGNoYXJwdHJfdG1wMiA9PSBOVUxMKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWZvciAoaSA9IDA7IGkgPCBsb25nX2NvdW50OyArK2kpIHsKLQkJCQkJaWYgKGNoYXJwdHJfdG1wW2sgPj4gM10gJgotCQkJCQkJCSgxIDw8IChrICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXAyW2kgPj4gM10gfD0KLQkJCQkJCQkJKDEgPDwgKGkgJiA3KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNoYXJwdHJfdG1wMltpID4+IDNdICY9Ci0JCQkJCQkJCX4oMSA8PCAoaSAmIDcpKTsKLQotCQkJCQkrK2s7Ci0JCQkJfQotCQkJCWNoYXJwdHJfdG1wID0gY2hhcnB0cl90bXAyOwotCi0JCQl9IGVsc2UgaWYgKGxvbmdfaWR4ICE9IDApCi0JCQkJY2hhcnB0cl90bXAgPSAmY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM107Ci0KLQkJCWFsdGVyYV9leHBvcnRfYm9vbF9hcnJheShuYW1lLCBjaGFycHRyX3RtcCwKLQkJCQkJCQlsb25nX2NvdW50KTsKLQotCQkJLyogZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCi0JCQlpZiAoKGxvbmdfaWR4ICYgN0wpICE9IDApCi0JCQkJa2ZyZWUoY2hhcnB0cl90bXAyKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQ09QWTogewotCQkJLyoKLQkJCSAqIEFycmF5IGNvcHkKLQkJCSAqIC4uLmFyZ3VtZW50IDAgaXMgZGVzdCBJRAotCQkJICogLi4uYXJndW1lbnQgMSBpcyBzb3VyY2UgSUQKLQkJCSAqIC4uLnN0YWNrIDAgaXMgY291bnQKLQkJCSAqIC4uLnN0YWNrIDEgaXMgZGVzdCBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyBzb3VyY2UgaW5kZXgKLQkJCSAqLwotCQkJczMyIGNvcHlfY291bnQ7Ci0JCQlzMzIgY29weV9pbmRleDsKLQkJCXMzMiBjb3B5X2luZGV4MjsKLQkJCXMzMiBkZXN0bGVmdDsKLQkJCXMzMiBzcmNfY291bnQ7Ci0JCQlzMzIgZGVzdF9jb3VudDsKLQkJCWludCBzcmNfcmV2ZXJzZSA9IDA7Ci0JCQlpbnQgZGVzdF9yZXZlcnNlID0gMDsKLQotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQotCQkJY29weV9jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCWNvcHlfaW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQljb3B5X2luZGV4MiA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXJldmVyc2UgPSAwOwotCi0JCQlpZiAodmVyc2lvbiA+IDApIHsKLQkJCQkvKgotCQkJCSAqIHN0YWNrIDAgPSBzb3VyY2UgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gc291cmNlIGxlZnQgaW5kZXgKLQkJCQkgKiBzdGFjayAyID0gZGVzdGluYXRpb24gcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAzID0gZGVzdGluYXRpb24gbGVmdCBpbmRleAotCQkJCSAqLwotCQkJCWRlc3RsZWZ0ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQkJaWYgKGNvcHlfY291bnQgPiBjb3B5X2luZGV4KSB7Ci0JCQkJCXNyY19yZXZlcnNlID0gMTsKLQkJCQkJcmV2ZXJzZSA9IDE7Ci0JCQkJCXNyY19jb3VudCA9IDEgKyBjb3B5X2NvdW50IC0gY29weV9pbmRleDsKLQkJCQkJLyogY29weV9pbmRleCA9IHNvdXJjZSBzdGFydCBpbmRleCAqLwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNyY19jb3VudCA9IDEgKyBjb3B5X2luZGV4IC0gY29weV9jb3VudDsKLQkJCQkJLyogc291cmNlIHN0YXJ0IGluZGV4ICovCi0JCQkJCWNvcHlfaW5kZXggPSBjb3B5X2NvdW50OwotCQkJCX0KLQotCQkJCWlmIChjb3B5X2luZGV4MiA+IGRlc3RsZWZ0KSB7Ci0JCQkJCWRlc3RfcmV2ZXJzZSA9IDE7Ci0JCQkJCXJldmVyc2UgPSAhcmV2ZXJzZTsKLQkJCQkJZGVzdF9jb3VudCA9IDEgKyBjb3B5X2luZGV4MiAtIGRlc3RsZWZ0OwotCQkJCQkvKiBkZXN0aW5hdGlvbiBzdGFydCBpbmRleCAqLwotCQkJCQljb3B5X2luZGV4MiA9IGRlc3RsZWZ0OwotCQkJCX0gZWxzZQotCQkJCQlkZXN0X2NvdW50ID0gMSArIGRlc3RsZWZ0IC0gY29weV9pbmRleDI7Ci0KLQkJCQljb3B5X2NvdW50ID0gKHNyY19jb3VudCA8IGRlc3RfY291bnQpID8KLQkJCQkJCQlzcmNfY291bnQgOiBkZXN0X2NvdW50OwotCi0JCQkJaWYgKChzcmNfcmV2ZXJzZSB8fCBkZXN0X3JldmVyc2UpICYmCi0JCQkJCShzcmNfY291bnQgIT0gZGVzdF9jb3VudCkpCi0JCQkJCS8qCi0JCQkJCSAqIElmIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uCi0JCQkJCSAqIGlzIHJldmVyc2VkLCB3ZSBjYW4ndCB0b2xlcmF0ZQotCQkJCQkgKiBhIGxlbmd0aCBtaXNtYXRjaCwgYmVjYXVzZSB3ZQotCQkJCQkgKiAibGVmdCBqdXN0aWZ5IiBhcnJheXMgd2hlbiBjb3B5aW5nLgotCQkJCQkgKiBUaGlzIHdvbid0IHdvcmsgY29ycmVjdGx5Ci0JCQkJCSAqIHdpdGggcmV2ZXJzZWQgYXJyYXlzLgotCQkJCQkgKi8KLQkJCQkJc3RhdHVzID0gLUVSQU5HRTsKLQotCQkJfQotCi0JCQljb3VudCA9IGNvcHlfY291bnQ7Ci0JCQlpbmRleCA9IGNvcHlfaW5kZXg7Ci0JCQlpbmRleDIgPSBjb3B5X2luZGV4MjsKLQotCQkJLyoKLQkJCSAqIElmIGRlc3RpbmF0aW9uIGlzIGEgcmVhZC1vbmx5IGFycmF5LAotCQkJICogYWxsb2NhdGUgYSBidWZmZXIgYW5kIGNvbnZlcnQgaXQgdG8gYSB3cml0YWJsZSBhcnJheQotCQkJICovCi0JCQl2YXJpYWJsZV9pZCA9IGFyZ3NbMV07Ci0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCSgoYXR0cnNbdmFyaWFibGVfaWRdICYgMHg5YykgPT0gMHgwYykpIHsKLQkJCQkvKiBBbGxvY2F0ZSBhIHdyaXRhYmxlIGJ1ZmZlciBmb3IgdGhpcyBhcnJheSAqLwotCQkJCWxvbmdfdG1wID0KLQkJCQkJKHZhcl9zaXplW3ZhcmlhYmxlX2lkXSArIDdMKSA+PiAzTDsKLQkJCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW3ZhcmlhYmxlX2lkXTsKLQkJCQljaGFycHRyX3RtcCA9Ci0JCQkJCWt6YWxsb2MobG9uZ190bXAsIEdGUF9LRVJORUwpOwotCQkJCXZhcnNbdmFyaWFibGVfaWRdID0gKGxvbmcpY2hhcnB0cl90bXA7Ci0KLQkJCQlpZiAodmFyc1t2YXJpYWJsZV9pZF0gPT0gMCkgewotCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiB6ZXJvIHRoZSBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7IGxvbmdfaWR4IDwgbG9uZ190bXA7Ci0JCQkJCQkJCSsrbG9uZ19pZHgpCi0JCQkJCWNoYXJwdHJfdG1wW2xvbmdfaWR4XSA9IDA7Ci0KLQkJCQkvKiBjb3B5IHByZXZpb3VzIGNvbnRlbnRzIGludG8gYnVmZmVyICovCi0JCQkJZm9yIChsb25nX2lkeCA9IDBMOwotCQkJCQlsb25nX2lkeCA8IHZhcl9zaXplW3ZhcmlhYmxlX2lkXTsKLQkJCQkJCQkJKytsb25nX2lkeCkgewotCQkJCQlsb25nX2lkeDIgPSBsb25nX2lkeDsKLQotCQkJCQlpZiAoY2hhcnB0cl90bXAyW2xvbmdfaWR4MiA+PiAzXSAmCi0JCQkJCQkoMSA8PCAobG9uZ19pZHgyICYgNykpKQotCQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHggPj4gM10gfD0KLQkJCQkJCQkoMSA8PCAobG9uZ19pZHggJiA3KSk7Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCXNldCBiaXQgNyAtIGJ1ZmZlciB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCi0JCQkJYXR0cnNbdmFyaWFibGVfaWRdIHw9IDB4ODA7Ci0KLQkJCQkvKiBjbGVhciBiaXQgMiAtIHZhcmlhYmxlIGlzIHdyaXRhYmxlICovCi0JCQkJYXR0cnNbdmFyaWFibGVfaWRdICY9IH4weDA0OwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDAxOwotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1sxXV07Ci0JCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW2FyZ3NbMF1dOwotCi0JCQkvKiBjaGVjayBpZiBkZXN0aW5hdGlvbiBpcyBhIHdyaXRhYmxlIEJvb2xlYW4gYXJyYXkgKi8KLQkJCWlmICgoYXR0cnNbYXJnc1sxXV0gJiAweDFjKSAhPSAweDA4KSB7Ci0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvdW50IDwgMSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChyZXZlcnNlKQotCQkJCWluZGV4MiArPSAoY291bnQgLSAxKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCQlpZiAoY2hhcnB0cl90bXAyW2luZGV4ID4+IDNdICYKLQkJCQkJCQkoMSA8PCAoaW5kZXggJiA3KSkpCi0JCQkJCWNoYXJwdHJfdG1wW2luZGV4MiA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChpbmRleDIgJiA3KSk7Ci0JCQkJZWxzZQotCQkJCQljaGFycHRyX3RtcFtpbmRleDIgPj4gM10gJj0KLQkJCQkJCX4oMSA8PCAoaW5kZXgyICYgNykpOwotCi0JCQkJKytpbmRleDsKLQkJCQlpZiAocmV2ZXJzZSkKLQkJCQkJLS1pbmRleDI7Ci0JCQkJZWxzZQotCQkJCQkrK2luZGV4MjsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBPUF9EU0M6Ci0JCWNhc2UgT1BfSVNDOiB7Ci0JCQkvKgotCQkJICogRFJTQ0FOIHdpdGggY2FwdHVyZQotCQkJICogSVJTQ0FOIHdpdGggY2FwdHVyZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzY2FuIGRhdGEgdmFyaWFibGUgSUQKLQkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgY2FwdHVyZSB2YXJpYWJsZSBJRAotCQkJICogLi4uc3RhY2sgMCBpcyBjYXB0dXJlIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHNjYW4gZGF0YSBpbmRleAotCQkJICogLi4uc3RhY2sgMiBpcyBjb3VudAotCQkJICovCi0JCQlzMzIgc2Nhbl9yaWdodCwgc2Nhbl9sZWZ0OwotCQkJczMyIGNhcHR1cmVfY291bnQgPSAwOwotCQkJczMyIHNjYW5fY291bnQgPSAwOwotCQkJczMyIGNhcHR1cmVfaW5kZXg7Ci0JCQlzMzIgc2Nhbl9pbmRleDsKLQotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAzLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQotCQkJY2FwdHVyZV9pbmRleCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCXNjYW5faW5kZXggPSBzdGFja1stLXN0YWNrX3B0cl07Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS8qCi0JCQkJICogc3RhY2sgMCA9IGNhcHR1cmUgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gY2FwdHVyZSBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgMiA9IHNjYW4gcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAzID0gc2NhbiBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgNCA9IGNvdW50Ci0JCQkJICovCi0JCQkJc2Nhbl9yaWdodCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQlzY2FuX2xlZnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJY2FwdHVyZV9jb3VudCA9IDEgKyBzY2FuX2luZGV4IC0gY2FwdHVyZV9pbmRleDsKLQkJCQlzY2FuX2NvdW50ID0gMSArIHNjYW5fbGVmdCAtIHNjYW5fcmlnaHQ7Ci0JCQkJc2Nhbl9pbmRleCA9IHNjYW5fcmlnaHQ7Ci0JCQl9Ci0KLQkJCWxvbmdfY291bnQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkvKgotCQkJICogSWYgY2FwdHVyZSBhcnJheSBpcyByZWFkLW9ubHksIGFsbG9jYXRlIGEgYnVmZmVyCi0JCQkgKiBhbmQgY29udmVydCBpdCB0byBhIHdyaXRhYmxlIGFycmF5Ci0JCQkgKi8KLQkJCXZhcmlhYmxlX2lkID0gYXJnc1sxXTsKLQkJCWlmICgodmVyc2lvbiA+IDApICYmCi0JCQkJKChhdHRyc1t2YXJpYWJsZV9pZF0gJiAweDljKSA9PSAweDBjKSkgewotCQkJCS8qIEFsbG9jYXRlIGEgd3JpdGFibGUgYnVmZmVyIGZvciB0aGlzIGFycmF5ICovCi0JCQkJbG9uZ190bXAgPQotCQkJCQkodmFyX3NpemVbdmFyaWFibGVfaWRdICsgN0wpID4+IDNMOwotCQkJCWNoYXJwdHJfdG1wMiA9ICh1OCAqKXZhcnNbdmFyaWFibGVfaWRdOwotCQkJCWNoYXJwdHJfdG1wID0KLQkJCQkJa3phbGxvYyhsb25nX3RtcCwgR0ZQX0tFUk5FTCk7Ci0JCQkJdmFyc1t2YXJpYWJsZV9pZF0gPSAobG9uZyljaGFycHRyX3RtcDsKLQotCQkJCWlmICh2YXJzW3ZhcmlhYmxlX2lkXSA9PSAwKSB7Ci0JCQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIHplcm8gdGhlIGJ1ZmZlciAqLwotCQkJCWZvciAobG9uZ19pZHggPSAwTDsgbG9uZ19pZHggPCBsb25nX3RtcDsKLQkJCQkJCQkJKytsb25nX2lkeCkKLQkJCQkJY2hhcnB0cl90bXBbbG9uZ19pZHhdID0gMDsKLQotCQkJCS8qIGNvcHkgcHJldmlvdXMgY29udGVudHMgaW50byBidWZmZXIgKi8KLQkJCQlmb3IgKGxvbmdfaWR4ID0gMEw7Ci0JCQkJCWxvbmdfaWR4IDwgdmFyX3NpemVbdmFyaWFibGVfaWRdOwotCQkJCQkJCQkrK2xvbmdfaWR4KSB7Ci0JCQkJCWxvbmdfaWR4MiA9IGxvbmdfaWR4OwotCi0JCQkJCWlmIChjaGFycHRyX3RtcDJbbG9uZ19pZHgyID4+IDNdICYKLQkJCQkJCSgxIDw8IChsb25nX2lkeDIgJiA3KSkpCi0JCQkJCQljaGFycHRyX3RtcFtsb25nX2lkeCA+PiAzXSB8PQotCQkJCQkJCSgxIDw8IChsb25nX2lkeCAmIDcpKTsKLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogc2V0IGJpdCA3IC0gYnVmZmVyIHdhcwotCQkJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAotCQkJCSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSB8PSAweDgwOwotCi0JCQkJLyogY2xlYXIgYml0IDIgLSB2YXJpYWJsZSBpcyB3cml0YWJsZSAqLwotCQkJCWF0dHJzW3ZhcmlhYmxlX2lkXSAmPSB+MHgwNDsKLQkJCQlhdHRyc1t2YXJpYWJsZV9pZF0gfD0gMHgwMTsKLQotCQkJfQotCi0JCQljaGFycHRyX3RtcCA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQljaGFycHRyX3RtcDIgPSAodTggKil2YXJzW2FyZ3NbMV1dOwotCi0JCQlpZiAoKHZlcnNpb24gPiAwKSAmJgotCQkJCQkoKGxvbmdfY291bnQgPiBjYXB0dXJlX2NvdW50KSB8fAotCQkJCQkobG9uZ19jb3VudCA+IHNjYW5fY291bnQpKSkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBjaGVjayB0aGF0IGNhcHR1cmUgYXJyYXkKLQkJCSAqIGlzIGEgd3JpdGFibGUgQm9vbGVhbiBhcnJheQotCQkJICovCi0JCQlpZiAoKGF0dHJzW2FyZ3NbMV1dICYgMHgxYykgIT0gMHgwOCkgewotCQkJCXN0YXR1cyA9IC1FUkFOR0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChzdGF0dXMgPT0gMCkgewotCQkJCWlmIChvcGNvZGUgPT0gMHg4MikgLyogRFNDICovCi0JCQkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2RyKGFzdGF0ZSwKLQkJCQkJCQlsb25nX2NvdW50LAotCQkJCQkJCWNoYXJwdHJfdG1wLAotCQkJCQkJCXNjYW5faW5kZXgsCi0JCQkJCQkJY2hhcnB0cl90bXAyLAotCQkJCQkJCWNhcHR1cmVfaW5kZXgpOwotCQkJCWVsc2UgLyogSVNDICovCi0JCQkJCXN0YXR1cyA9IGFsdGVyYV9zd2FwX2lyKGFzdGF0ZSwKLQkJCQkJCQlsb25nX2NvdW50LAotCQkJCQkJCWNoYXJwdHJfdG1wLAotCQkJCQkJCXNjYW5faW5kZXgsCi0JCQkJCQkJY2hhcnB0cl90bXAyLAotCQkJCQkJCWNhcHR1cmVfaW5kZXgpOwotCi0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgT1BfV0FJVDoKLQkJCS8qCi0JCQkgKiBXQUlUCi0JCQkgKiAuLi5hcmd1bWVudCAwIGlzIHdhaXQgc3RhdGUKLQkJCSAqIC4uLmFyZ3VtZW50IDEgaXMgZW5kIHN0YXRlCi0JCQkgKiAuLi5zdGFjayAwIGlzIGN5Y2xlcwotCQkJICogLi4uc3RhY2sgMSBpcyBtaWNyb3NlY29uZHMKLQkJCSAqLwotCQkJaWYgKCFhbHRlcmFfY2hlY2tfc3RhY2soc3RhY2tfcHRyLCAyLCAmc3RhdHVzKSkKLQkJCQlicmVhazsKLQkJCWxvbmdfdG1wID0gc3RhY2tbLS1zdGFja19wdHJdOwotCi0JCQlpZiAobG9uZ190bXAgIT0gMEwpCi0JCQkJc3RhdHVzID0gYWx0ZXJhX3dhaXRfY3ljbGVzKGFzdGF0ZSwgbG9uZ190bXAsCi0JCQkJCQkJCWFyZ3NbMF0pOwotCi0JCQlsb25nX3RtcCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKChzdGF0dXMgPT0gMCkgJiYgKGxvbmdfdG1wICE9IDBMKSkKLQkJCQlzdGF0dXMgPSBhbHRlcmFfd2FpdF9tc2Vjcyhhc3RhdGUsCi0JCQkJCQkJCWxvbmdfdG1wLAotCQkJCQkJCQlhcmdzWzBdKTsKLQotCQkJaWYgKChzdGF0dXMgPT0gMCkgJiYgKGFyZ3NbMV0gIT0gYXJnc1swXSkpCi0JCQkJc3RhdHVzID0gYWx0ZXJhX2dvdG9fanN0YXRlKGFzdGF0ZSwKLQkJCQkJCQkJYXJnc1sxXSk7Ci0KLQkJCWlmICh2ZXJzaW9uID4gMCkgewotCQkJCS0tc3RhY2tfcHRyOyAvKiB0aHJvdyBhd2F5IE1BWCBjeWNsZXMgKi8KLQkJCQktLXN0YWNrX3B0cjsgLyogdGhyb3cgYXdheSBNQVggbWljcm9zZWNvbmRzICovCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9DTVBBOiB7Ci0JCQkvKgotCQkJICogQXJyYXkgY29tcGFyZQotCQkJICogLi4uYXJndW1lbnQgMCBpcyBzb3VyY2UgMSBJRAotCQkJICogLi4uYXJndW1lbnQgMSBpcyBzb3VyY2UgMiBJRAotCQkJICogLi4uYXJndW1lbnQgMiBpcyBtYXNrIElECi0JCQkgKiAuLi5zdGFjayAwIGlzIHNvdXJjZSAxIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAxIGlzIHNvdXJjZSAyIGluZGV4Ci0JCQkgKiAuLi5zdGFjayAyIGlzIG1hc2sgaW5kZXgKLQkJCSAqIC4uLnN0YWNrIDMgaXMgY291bnQKLQkJCSAqLwotCQkJczMyIGEsIGI7Ci0JCQl1OCAqc291cmNlMSA9ICh1OCAqKXZhcnNbYXJnc1swXV07Ci0JCQl1OCAqc291cmNlMiA9ICh1OCAqKXZhcnNbYXJnc1sxXV07Ci0JCQl1OCAqbWFzayA9ICh1OCAqKXZhcnNbYXJnc1syXV07Ci0JCQl1MzIgaW5kZXgxOwotCQkJdTMyIGluZGV4MjsKLQkJCXUzMiBtYXNrX2luZGV4OwotCi0JCQlpZiAoIWFsdGVyYV9jaGVja19zdGFjayhzdGFja19wdHIsIDQsICZzdGF0dXMpKQotCQkJCWJyZWFrOwotCi0JCQlpbmRleDEgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQlpbmRleDIgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQltYXNrX2luZGV4ID0gc3RhY2tbLS1zdGFja19wdHJdOwotCQkJbG9uZ19jb3VudCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQotCQkJaWYgKHZlcnNpb24gPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBzdGFjayAwID0gc291cmNlIDEgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayAxID0gc291cmNlIDEgbGVmdCBpbmRleAotCQkJCSAqIHN0YWNrIDIgPSBzb3VyY2UgMiByaWdodCBpbmRleAotCQkJCSAqIHN0YWNrIDMgPSBzb3VyY2UgMiBsZWZ0IGluZGV4Ci0JCQkJICogc3RhY2sgNCA9IG1hc2sgcmlnaHQgaW5kZXgKLQkJCQkgKiBzdGFjayA1ID0gbWFzayBsZWZ0IGluZGV4Ci0JCQkJICovCi0JCQkJczMyIG1hc2tfcmlnaHQgPSBzdGFja1stLXN0YWNrX3B0cl07Ci0JCQkJczMyIG1hc2tfbGVmdCA9IHN0YWNrWy0tc3RhY2tfcHRyXTsKLQkJCQkvKiBzb3VyY2UgMSBjb3VudCAqLwotCQkJCWEgPSAxICsgaW5kZXgyIC0gaW5kZXgxOwotCQkJCS8qIHNvdXJjZSAyIGNvdW50ICovCi0JCQkJYiA9IDEgKyBsb25nX2NvdW50IC0gbWFza19pbmRleDsKLQkJCQlhID0gKGEgPCBiKSA/IGEgOiBiOwotCQkJCS8qIG1hc2sgY291bnQgKi8KLQkJCQliID0gMSArIG1hc2tfbGVmdCAtIG1hc2tfcmlnaHQ7Ci0JCQkJYSA9IChhIDwgYikgPyBhIDogYjsKLQkJCQkvKiBzb3VyY2UgMiBzdGFydCBpbmRleCAqLwotCQkJCWluZGV4MiA9IG1hc2tfaW5kZXg7Ci0JCQkJLyogbWFzayBzdGFydCBpbmRleCAqLwotCQkJCW1hc2tfaW5kZXggPSBtYXNrX3JpZ2h0OwotCQkJCWxvbmdfY291bnQgPSBhOwotCQkJfQotCi0JCQlsb25nX3RtcCA9IDFMOwotCi0JCQlpZiAobG9uZ19jb3VudCA8IDEpCi0JCQkJc3RhdHVzID0gLUVSQU5HRTsKLQkJCWVsc2UgewotCQkJCWNvdW50ID0gbG9uZ19jb3VudDsKLQotCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQkJCWlmIChtYXNrW21hc2tfaW5kZXggPj4gM10gJgotCQkJCQkJKDEgPDwgKG1hc2tfaW5kZXggJiA3KSkpIHsKLQkJCQkJCWEgPSBzb3VyY2UxW2luZGV4MSA+PiAzXSAmCi0JCQkJCQkJKDEgPDwgKGluZGV4MSAmIDcpKQotCQkJCQkJCQk/IDEgOiAwOwotCQkJCQkJYiA9IHNvdXJjZTJbaW5kZXgyID4+IDNdICYKLQkJCQkJCQkoMSA8PCAoaW5kZXgyICYgNykpCi0JCQkJCQkJCT8gMSA6IDA7Ci0KLQkJCQkJCWlmIChhICE9IGIpIC8qIGZhaWx1cmUgKi8KLQkJCQkJCQlsb25nX3RtcCA9IDBMOwotCQkJCQl9Ci0JCQkJCSsraW5kZXgxOwotCQkJCQkrK2luZGV4MjsKLQkJCQkJKyttYXNrX2luZGV4OwotCQkJCX0KLQkJCX0KLQotCQkJc3RhY2tbc3RhY2tfcHRyKytdID0gbG9uZ190bXA7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBVbnJlY29nbml6ZWQgb3Bjb2RlIC0tIEVSUk9SISAqLwotCQkJYmFkX29wY29kZSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChiYWRfb3Bjb2RlKQotCQkJc3RhdHVzID0gLUVOT1NZUzsKLQotCQlpZiAoKHN0YWNrX3B0ciA8IDApIHx8IChzdGFja19wdHIgPj0gQUxURVJBX1NUQUNLX1NJWkUpKQotCQkJc3RhdHVzID0gLUVPVkVSRkxPVzsKLQotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRvbmUgPSAxOwotCQkJKmVycm9yX2FkZHJlc3MgPSAoczMyKShvcGNvZGVfYWRkcmVzcyAtIGNvZGVfc2VjdCk7Ci0JCX0KLQl9Ci0KLQlhbHRlcmFfZnJlZV9idWZmZXJzKGFzdGF0ZSk7Ci0KLQkvKiBGcmVlIGFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXJyYXlzICovCi0JaWYgKChhdHRycyAhPSBOVUxMKSAmJiAodmFycyAhPSBOVUxMKSkKLQkJZm9yIChpID0gMDsgaSA8IHN5bV9jb3VudDsgKytpKQotCQkJaWYgKGF0dHJzW2ldICYgMHg4MCkKLQkJCQlrZnJlZSgodm9pZCAqKXZhcnNbaV0pOwotCi0Ja2ZyZWUodmFycyk7Ci0Ja2ZyZWUodmFyX3NpemUpOwotCWtmcmVlKGF0dHJzKTsKLQlrZnJlZShwcm9jX2F0dHJpYnV0ZXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X25vdGUodTggKnAsIHMzMiBwcm9ncmFtX3NpemUsCi0JCQlzMzIgKm9mZnNldCwgY2hhciAqa2V5LCBjaGFyICp2YWx1ZSwgaW50IGxlbmd0aCkKLS8qCi0gKiBHZXRzIGtleSBhbmQgdmFsdWUgb2YgTk9URSBmaWVsZHMgaW4gdGhlIEpCQyBmaWxlLgotICogQ2FuIGJlIGNhbGxlZCBpbiB0d28gbW9kZXM6ICBpZiBvZmZzZXQgcG9pbnRlciBpcyBOVUxMLAotICogdGhlbiB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIG5vdGUgZmllbGRzIHdoaWNoIG1hdGNoCi0gKiB0aGUga2V5IHN0cmluZyBwcm92aWRlZC4gIElmIG9mZnNldCBpcyBub3QgTlVMTCwgdGhlbgotICogdGhlIGZ1bmN0aW9uIGZpbmRzIHRoZSBuZXh0IG5vdGUgZmllbGQgb2YgYW55IGtleSwKLSAqIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQgc3BlY2lmaWVkIGJ5IHRoZSBvZmZzZXQgcG9pbnRlci4KLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZWxzZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlCi0gKi8KLXsKLQlpbnQgc3RhdHVzID0gLUVOT0RBVEE7Ci0JdTMyIG5vdGVfc3RyaW5ncyA9IDBMOwotCXUzMiBub3RlX3RhYmxlID0gMEw7Ci0JdTMyIG5vdGVfY291bnQgPSAwTDsKLQl1MzIgZmlyc3Rfd29yZCA9IDBMOwotCWludCB2ZXJzaW9uID0gMDsKLQlpbnQgZGVsdGEgPSAwOwotCWNoYXIgKmtleV9wdHI7Ci0JY2hhciAqdmFsdWVfcHRyOwotCWludCBpOwotCi0JLyogUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQlpZiAocHJvZ3JhbV9zaXplID4gNTJMKSB7Ci0JCWZpcnN0X3dvcmQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOwotCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7Ci0JCWRlbHRhID0gdmVyc2lvbiAqIDg7Ci0KLQkJbm90ZV9zdHJpbmdzICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs4ICsgZGVsdGFdKTsKLQkJbm90ZV90YWJsZSAgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxMiArIGRlbHRhXSk7Ci0JCW5vdGVfY291bnQgICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbNDQgKyAoMiAqIGRlbHRhKV0pOwotCX0KLQotCWlmICgoZmlyc3Rfd29yZCAhPSAweDRBNDE0RDAwTCkgJiYgKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMUwpKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChub3RlX2NvdW50IDw9IDBMKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JaWYgKG9mZnNldCA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFdlIHdpbGwgc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm90ZSB3aXRoIGEgc3BlY2lmaWMga2V5LAotCQkgKiBhbmQgcmV0dXJuIG9ubHkgdGhlIHZhbHVlCi0JCSAqLwotCQlmb3IgKGkgPSAwOyAoaSA8IG5vdGVfY291bnQpICYmCi0JCQkJCQkoc3RhdHVzICE9IDApOyArK2kpIHsKLQkJCWtleV9wdHIgPSAmcFtub3RlX3N0cmluZ3MgKwotCQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoCi0JCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpXSldOwotCQkJaWYgKChzdHJuaWNtcChrZXksIGtleV9wdHIsIHN0cmxlbihrZXlfcHRyKSkgPT0gMCkgJiYKLQkJCQkJCShrZXkgIT0gTlVMTCkpIHsKLQkJCQlzdGF0dXMgPSAwOwotCi0JCQkJdmFsdWVfcHRyID0gJnBbbm90ZV9zdHJpbmdzICsKLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpICsgNF0pXTsKLQotCQkJCWlmICh2YWx1ZSAhPSBOVUxMKQotCQkJCQlzdHJsY3B5KHZhbHVlLCB2YWx1ZV9wdHIsIGxlbmd0aCk7Ci0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdlIHdpbGwgc2VhcmNoIGZvciB0aGUgbmV4dCBub3RlLCByZWdhcmRsZXNzIG9mIHRoZSBrZXksCi0JCSAqIGFuZCByZXR1cm4gYm90aCB0aGUgdmFsdWUgYW5kIHRoZSBrZXkKLQkJICovCi0KLQkJaSA9ICpvZmZzZXQ7Ci0KLQkJaWYgKChpID49IDApICYmIChpIDwgbm90ZV9jb3VudCkpIHsKLQkJCXN0YXR1cyA9IDA7Ci0KLQkJCWlmIChrZXkgIT0gTlVMTCkKLQkJCQlzdHJsY3B5KGtleSwgJnBbbm90ZV9zdHJpbmdzICsKLQkJCQkJCWdldF91bmFsaWduZWRfYmUzMigKLQkJCQkJCSZwW25vdGVfdGFibGUgKyAoOCAqIGkpXSldLAotCQkJCQlsZW5ndGgpOwotCi0JCQlpZiAodmFsdWUgIT0gTlVMTCkKLQkJCQlzdHJsY3B5KHZhbHVlLCAmcFtub3RlX3N0cmluZ3MgKwotCQkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKAotCQkJCQkJJnBbbm90ZV90YWJsZSArICg4ICogaSkgKyA0XSldLAotCQkJCQlsZW5ndGgpOwotCi0JCQkqb2Zmc2V0ID0gaSArIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGFsdGVyYV9jaGVja19jcmModTggKnAsIHMzMiBwcm9ncmFtX3NpemUpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTE2IGxvY2FsX2V4cGVjdGVkID0gMCwKLQkgICAgbG9jYWxfYWN0dWFsID0gMCwKLQkgICAgc2hpZnRfcmVnID0gMHhmZmZmOwotCWludCBiaXQsIGZlZWRiYWNrOwotCXU4IGRhdGFieXRlOwotCXUzMiBpOwotCXUzMiBjcmNfc2VjdGlvbiA9IDBMOwotCXUzMiBmaXJzdF93b3JkID0gMEw7Ci0JaW50IHZlcnNpb24gPSAwOwotCWludCBkZWx0YSA9IDA7Ci0KLQlpZiAocHJvZ3JhbV9zaXplID4gNTJMKSB7Ci0JCWZpcnN0X3dvcmQgID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKLQkJdmVyc2lvbiA9IChmaXJzdF93b3JkICYgMUwpOwotCQlkZWx0YSA9IHZlcnNpb24gKiA4OwotCi0JCWNyY19zZWN0aW9uID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzMyICsgZGVsdGFdKTsKLQl9Ci0KLQlpZiAoKGZpcnN0X3dvcmQgIT0gMHg0QTQxNEQwMEwpICYmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKSkKLQkJc3RhdHVzID0gLUVJTzsKLQotCWlmIChjcmNfc2VjdGlvbiA+PSBwcm9ncmFtX3NpemUpCi0JCXN0YXR1cyA9IC1FSU87Ci0KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJbG9jYWxfZXhwZWN0ZWQgPSAodTE2KWdldF91bmFsaWduZWRfYmUxNigmcFtjcmNfc2VjdGlvbl0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjcmNfc2VjdGlvbjsgKytpKSB7Ci0JCQlkYXRhYnl0ZSA9IHBbaV07Ci0JCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7Ci0JCQkJZmVlZGJhY2sgPSAoZGF0YWJ5dGUgXiBzaGlmdF9yZWcpICYgMHgwMTsKLQkJCQlzaGlmdF9yZWcgPj49IDE7Ci0JCQkJaWYgKGZlZWRiYWNrKQotCQkJCQlzaGlmdF9yZWcgXj0gMHg4NDA4OwotCi0JCQkJZGF0YWJ5dGUgPj49IDE7Ci0JCQl9Ci0JCX0KLQotCQlsb2NhbF9hY3R1YWwgPSAodTE2KX5zaGlmdF9yZWc7Ci0KLQkJaWYgKGxvY2FsX2V4cGVjdGVkICE9IGxvY2FsX2FjdHVhbCkKLQkJCXN0YXR1cyA9IC1FSUxTRVE7Ci0KLQl9Ci0KLQlpZiAoZGVidWcgfHwgc3RhdHVzKSB7Ci0JCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCWNhc2UgMDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDUkMgbWF0Y2hlZDogJTA0eFxuIiwgX19mdW5jX18sCi0JCQkJbG9jYWxfYWN0dWFsKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FSUxTRVE6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUkMgbWlzbWF0Y2g6IGV4cGVjdGVkICUwNHgsICIKLQkJCQkiYWN0dWFsICUwNHhcbiIsIF9fZnVuY19fLCBsb2NhbF9leHBlY3RlZCwKLQkJCQlsb2NhbF9hY3R1YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVOT0RBVEE6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBleHBlY3RlZCBDUkMgbm90IGZvdW5kLCAiCi0JCQkJImFjdHVhbCBDUkMgPSAlMDR4XG4iLCBfX2Z1bmNfXywKLQkJCQlsb2NhbF9hY3R1YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVJTzoKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yOiBmb3JtYXQgaXNuJ3QgIgotCQkJCSJyZWNvZ25pemVkLlxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUkMgZnVuY3Rpb24gcmV0dXJuZWQgZXJyb3IgIgotCQkJCSJjb2RlICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X2ZpbGVfaW5mbyh1OCAqcCwKLQkJCQkJczMyIHByb2dyYW1fc2l6ZSwKLQkJCQkJaW50ICpmb3JtYXRfdmVyc2lvbiwKLQkJCQkJaW50ICphY3Rpb25fY291bnQsCi0JCQkJCWludCAqcHJvY2VkdXJlX2NvdW50KQotewotCWludCBzdGF0dXMgPSAtRUlPOwotCXUzMiBmaXJzdF93b3JkID0gMDsKLQlpbnQgdmVyc2lvbiA9IDA7Ci0KLQlpZiAocHJvZ3JhbV9zaXplIDw9IDUyTCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWZpcnN0X3dvcmQgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbMF0pOwotCi0JaWYgKChmaXJzdF93b3JkID09IDB4NEE0MTREMDBMKSB8fCAoZmlyc3Rfd29yZCA9PSAweDRBNDE0RDAxTCkpIHsKLQkJc3RhdHVzID0gMDsKLQotCQl2ZXJzaW9uID0gKGZpcnN0X3dvcmQgJiAxTCk7Ci0JCSpmb3JtYXRfdmVyc2lvbiA9IHZlcnNpb24gKyAxOwotCi0JCWlmICh2ZXJzaW9uID4gMCkgewotCQkJKmFjdGlvbl9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0OF0pOwotCQkJKnByb2NlZHVyZV9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs1Ml0pOwotCQl9Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBhbHRlcmFfZ2V0X2FjdF9pbmZvKHU4ICpwLAotCQkJCQlzMzIgcHJvZ3JhbV9zaXplLAotCQkJCQlpbnQgaW5kZXgsCi0JCQkJCWNoYXIgKipuYW1lLAotCQkJCQljaGFyICoqZGVzY3JpcHRpb24sCi0JCQkJCXN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKipwcm9jX2xpc3QpCi17Ci0JaW50IHN0YXR1cyA9IC1FSU87Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqcHJvY3B0ciA9IE5VTEw7Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqdG1wcHRyID0gTlVMTDsKLQl1MzIgZmlyc3Rfd29yZCA9IDBMOwotCXUzMiBhY3Rpb25fdGFibGUgPSAwTDsKLQl1MzIgcHJvY190YWJsZSA9IDBMOwotCXUzMiBzdHJfdGFibGUgPSAwTDsKLQl1MzIgbm90ZV9zdHJpbmdzID0gMEw7Ci0JdTMyIGFjdGlvbl9jb3VudCA9IDBMOwotCXUzMiBwcm9jX2NvdW50ID0gMEw7Ci0JdTMyIGFjdF9uYW1lX2lkID0gMEw7Ci0JdTMyIGFjdF9kZXNjX2lkID0gMEw7Ci0JdTMyIGFjdF9wcm9jX2lkID0gMEw7Ci0JdTMyIGFjdF9wcm9jX25hbWUgPSAwTDsKLQl1OCBhY3RfcHJvY19hdHRyaWJ1dGUgPSAwOwotCi0JaWYgKHByb2dyYW1fc2l6ZSA8PSA1MkwpCi0JCXJldHVybiBzdGF0dXM7Ci0JLyogUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQlmaXJzdF93b3JkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzBdKTsKLQotCWlmIChmaXJzdF93b3JkICE9IDB4NEE0MTREMDFMKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JYWN0aW9uX3RhYmxlID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwWzRdKTsKLQlwcm9jX3RhYmxlICAgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnBbOF0pOwotCXN0cl90YWJsZSA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxMl0pOwotCW5vdGVfc3RyaW5ncyA9IGdldF91bmFsaWduZWRfYmUzMigmcFsxNl0pOwotCWFjdGlvbl9jb3VudCA9IGdldF91bmFsaWduZWRfYmUzMigmcFs0OF0pOwotCXByb2NfY291bnQgICA9IGdldF91bmFsaWduZWRfYmUzMigmcFs1Ml0pOwotCi0JaWYgKGluZGV4ID49IGFjdGlvbl9jb3VudCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWFjdF9uYW1lX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArICgxMiAqIGluZGV4KV0pOwotCWFjdF9kZXNjX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZwW2FjdGlvbl90YWJsZSArICgxMiAqIGluZGV4KSArIDRdKTsKLQlhY3RfcHJvY19pZCA9IGdldF91bmFsaWduZWRfYmUzMigmcFthY3Rpb25fdGFibGUgKyAoMTIgKiBpbmRleCkgKyA4XSk7Ci0KLQkqbmFtZSA9ICZwW3N0cl90YWJsZSArIGFjdF9uYW1lX2lkXTsKLQotCWlmIChhY3RfZGVzY19pZCA8IChub3RlX3N0cmluZ3MgLSBzdHJfdGFibGUpKQotCQkqZGVzY3JpcHRpb24gPSAmcFtzdHJfdGFibGUgKyBhY3RfZGVzY19pZF07Ci0KLQlkbyB7Ci0JCWFjdF9wcm9jX25hbWUgPSBnZXRfdW5hbGlnbmVkX2JlMzIoCi0JCQkJCSZwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCldKTsKLQkJYWN0X3Byb2NfYXR0cmlidXRlID0KLQkJCShwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCkgKyA4XSAmIDB4MDMpOwotCi0JCXByb2NwdHIgPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbHRlcmFfcHJvY2luZm8pLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKLQotCQlpZiAocHJvY3B0ciA9PSBOVUxMKQotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZWxzZSB7Ci0JCQlwcm9jcHRyLT5uYW1lID0gJnBbc3RyX3RhYmxlICsgYWN0X3Byb2NfbmFtZV07Ci0JCQlwcm9jcHRyLT5hdHRycyA9IGFjdF9wcm9jX2F0dHJpYnV0ZTsKLQkJCXByb2NwdHItPm5leHQgPSBOVUxMOwotCi0JCQkvKiBhZGQgcmVjb3JkIHRvIGVuZCBvZiBsaW5rZWQgbGlzdCAqLwotCQkJaWYgKCpwcm9jX2xpc3QgPT0gTlVMTCkKLQkJCQkqcHJvY19saXN0ID0gcHJvY3B0cjsKLQkJCWVsc2UgewotCQkJCXRtcHB0ciA9ICpwcm9jX2xpc3Q7Ci0JCQkJd2hpbGUgKHRtcHB0ci0+bmV4dCAhPSBOVUxMKQotCQkJCQl0bXBwdHIgPSB0bXBwdHItPm5leHQ7Ci0JCQkJdG1wcHRyLT5uZXh0ID0gcHJvY3B0cjsKLQkJCX0KLQkJfQotCi0JCWFjdF9wcm9jX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTMyKAotCQkJCSZwW3Byb2NfdGFibGUgKyAoMTMgKiBhY3RfcHJvY19pZCkgKyA0XSk7Ci0JfSB3aGlsZSAoKGFjdF9wcm9jX2lkICE9IDApICYmIChhY3RfcHJvY19pZCA8IHByb2NfY291bnQpKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBhbHRlcmFfaW5pdChzdHJ1Y3QgYWx0ZXJhX2NvbmZpZyAqY29uZmlnLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQotewotCXN0cnVjdCBhbHRlcmFfc3RhdGUgKmFzdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGFsdGVyYV9wcm9jaW5mbyAqcHJvY19saXN0ID0gTlVMTDsKLQlzdHJ1Y3QgYWx0ZXJhX3Byb2NpbmZvICpwcm9jcHRyID0gTlVMTDsKLQljaGFyICprZXkgPSBOVUxMOwotCWNoYXIgKnZhbHVlID0gTlVMTDsKLQljaGFyICphY3Rpb25fbmFtZSA9IE5VTEw7Ci0JY2hhciAqZGVzY3JpcHRpb24gPSBOVUxMOwotCWludCBleGVjX3Jlc3VsdCA9IDA7Ci0JaW50IGV4aXRfY29kZSA9IDA7Ci0JaW50IGZvcm1hdF92ZXJzaW9uID0gMDsKLQlpbnQgYWN0aW9uX2NvdW50ID0gMDsKLQlpbnQgcHJvY2VkdXJlX2NvdW50ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXMzMiBvZmZzZXQgPSAwTDsKLQlzMzIgZXJyb3JfYWRkcmVzcyA9IDBMOwotCWludCByZXR2YWwgPSAwOwotCi0Ja2V5ID0ga3phbGxvYygzMywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXZhbHVlID0ga3phbGxvYygyNTcsIEdGUF9LRVJORUwpOwotCWlmICghdmFsdWUpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2tleTsKLQl9Ci0JYXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFsdGVyYV9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmICghYXN0YXRlKSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV92YWx1ZTsKLQl9Ci0KLQlhc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKLQlpZiAoIWFzdGF0ZS0+Y29uZmlnLT5qdGFnX2lvKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgYnl0ZWJsYXN0ZXIhXG4iLCBfX2Z1bmNfXyk7Ci0JCWFzdGF0ZS0+Y29uZmlnLT5qdGFnX2lvID0gbmV0dXBfanRhZ19pb19scHQ7Ci0JfQotCi0JYWx0ZXJhX2NoZWNrX2NyYygodTggKilmdy0+ZGF0YSwgZnctPnNpemUpOwotCi0JaWYgKGRlYnVnKSB7Ci0JCWFsdGVyYV9nZXRfZmlsZV9pbmZvKCh1OCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSwgJmZvcm1hdF92ZXJzaW9uLAotCQkJCQkmYWN0aW9uX2NvdW50LCAmcHJvY2VkdXJlX2NvdW50KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpbGUgZm9ybWF0IGlzICVzIEJ5dGVDb2RlIGZvcm1hdFxuIiwKLQkJCV9fZnVuY19fLCAoZm9ybWF0X3ZlcnNpb24gPT0gMikgPyAiSmFtIFNUQVBMIiA6Ci0JCQkJCQkicHJlLXN0YW5kYXJkaXplZCBKYW0gMS4xIik7Ci0JCXdoaWxlIChhbHRlcmFfZ2V0X25vdGUoKHU4ICopZnctPmRhdGEsIGZ3LT5zaXplLAotCQkJCQkmb2Zmc2V0LCBrZXksIHZhbHVlLCAyNTYpID09IDApCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogTk9URSBcIiVzXCIgPSBcIiVzXCJcbiIsCi0JCQkJCV9fZnVuY19fLCBrZXksIHZhbHVlKTsKLQl9Ci0KLQlpZiAoZGVidWcgJiYgKGZvcm1hdF92ZXJzaW9uID09IDIpICYmIChhY3Rpb25fY291bnQgPiAwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogQWN0aW9ucyBhdmFpbGFibGU6XG4iLCBfX2Z1bmNfXyk7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFjdGlvbl9jb3VudDsgKytpbmRleCkgewotCQkJYWx0ZXJhX2dldF9hY3RfaW5mbygodTggKilmdy0+ZGF0YSwgZnctPnNpemUsCi0JCQkJCQlpbmRleCwgJmFjdGlvbl9uYW1lLAotCQkJCQkJJmRlc2NyaXB0aW9uLAotCQkJCQkJJnByb2NfbGlzdCk7Ci0KLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBOVUxMKQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwKLQkJCQkJCV9fZnVuY19fLAotCQkJCQkJYWN0aW9uX25hbWUpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBcIiVzXCJcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCWFjdGlvbl9uYW1lLAotCQkJCQkJZGVzY3JpcHRpb24pOwotCi0JCQlwcm9jcHRyID0gcHJvY19saXN0OwotCQkJd2hpbGUgKHByb2NwdHIgIT0gTlVMTCkgewotCQkJCWlmIChwcm9jcHRyLT5hdHRycyAhPSAwKQotCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogICAgJXMgKCVzKVxuIiwKLQkJCQkJCV9fZnVuY19fLAotCQkJCQkJcHJvY3B0ci0+bmFtZSwKLQkJCQkJCShwcm9jcHRyLT5hdHRycyA9PSAxKSA/Ci0JCQkJCQkib3B0aW9uYWwiIDogInJlY29tbWVuZGVkIik7Ci0KLQkJCQlwcm9jX2xpc3QgPSBwcm9jcHRyLT5uZXh0OwotCQkJCWtmcmVlKHByb2NwdHIpOwotCQkJCXByb2NwdHIgPSBwcm9jX2xpc3Q7Ci0JCQl9Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwotCX0KLQotCWV4ZWNfcmVzdWx0ID0gYWx0ZXJhX2V4ZWN1dGUoYXN0YXRlLCAodTggKilmdy0+ZGF0YSwgZnctPnNpemUsCi0JCQkJJmVycm9yX2FkZHJlc3MsICZleGl0X2NvZGUsICZmb3JtYXRfdmVyc2lvbik7Ci0KLQlpZiAoZXhpdF9jb2RlKQotCQlleGVjX3Jlc3VsdCA9IC1FUkVNT1RFSU87Ci0KLQlpZiAoKGZvcm1hdF92ZXJzaW9uID09IDIpICYmIChleGVjX3Jlc3VsdCA9PSAtRUlOVkFMKSkgewotCQlpZiAoYXN0YXRlLT5jb25maWctPmFjdGlvbiA9PSBOVUxMKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IG5vIGFjdGlvbiBzcGVjaWZpZWQgZm9yICIKLQkJCQkiSmFtIFNUQVBMIGZpbGUuXG5wcm9ncmFtIHRlcm1pbmF0ZWQuXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3I6IGFjdGlvbiBcIiVzXCIiCi0JCQkJIiBpcyBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRoaXMgSmFtIFNUQVBMIGZpbGUuXG4iCi0JCQkJIlByb2dyYW0gdGVybWluYXRlZC5cbiIsIF9fZnVuY19fLAotCQkJCWFzdGF0ZS0+Y29uZmlnLT5hY3Rpb24pOwotCi0JfSBlbHNlIGlmIChleGVjX3Jlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBleGVjX3Jlc3VsdCk7Ci0KLQlrZnJlZShhc3RhdGUpOwotZnJlZV92YWx1ZToKLQlrZnJlZSh2YWx1ZSk7Ci1mcmVlX2tleToKLQlrZnJlZShrZXkpOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGFsdGVyYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliYTUwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVRvZG86Ci0JLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCi0JLSBzcGFyc2UgY2xlYW51cHMKLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRmYzA4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMTIgKzAsMCBAQAotLyoKLSAqICBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDI1ODIxIFBDSWUgYnJpZGdlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOSBDb25leGFudCBTeXN0ZW1zIEluYy4KLSAqICBBdXRob3JzICA8c2h1LmxpbkBjb25leGFudC5jb20+LCA8aGllcC5odXluaEBjb25leGFudC5jb20+Ci0gKiAgQmFzZWQgb24gU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiBjeDIzODg1IGRyaXZlcgotICogIFBhcnRzIGFkYXB0ZWQvdGFrZW4gZnJvbSBFZHVhcmRvIE1vc2Nvc28gUnViaW5vCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IEVkdWFyZG8gTW9zY29zbyBSdWJpbm8gPG1vc2Nvc29AVG9wb0xvZ2ljYS5jb20+Ci0gKgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgImN4MjU4MjEtdmlkZW8uaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIGN4MjU4MjEgYmFzZWQgVFYgY2FyZHMiKTsKLU1PRFVMRV9BVVRIT1IoIkhpZXAgSHV5bmggPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX25yW10gPSB7WzAgLi4uIChDWDI1ODIxX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvX25yW10gPSB7WzAgLi4uIChDWDI1ODIxX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheSh2aWRlb19uciwgaW50LCBOVUxMLCAwNDQ0KTsKLW1vZHVsZV9wYXJhbV9hcnJheShyYWRpb19uciwgaW50LCBOVUxMLCAwNDQ0KTsKLQotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwgInZpZGVvIGRldmljZSBudW1iZXJzIik7Ci1NT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAicmFkaW8gZGV2aWNlIG51bWJlcnMiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19kZWJ1ZyA9IFZJREVPX0RFQlVHOwotbW9kdWxlX3BhcmFtKHZpZGVvX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRlb19kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbdmlkZW9dIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnOwotbW9kdWxlX3BhcmFtKGlycV9kZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtJUlEgaGFuZGxlcl0iKTsKLQotdW5zaWduZWQgaW50IHZpZF9saW1pdCA9IDE2OwotbW9kdWxlX3BhcmFtKHZpZF9saW1pdCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCAiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7Ci0KLXN0YXRpYyB2b2lkIGN4MjU4MjFfaW5pdF9jb250cm9scyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNoYW5fbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzOwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHM7Ci0KLSNkZWZpbmUgRk9STUFUX0ZMQUdTX1BBQ0tFRCAgICAgICAweDAxCi0KLXN0cnVjdCBjeDI1ODIxX2ZtdCBmb3JtYXRzW10gPSB7Ci0JewotCQkubmFtZSA9ICI4IGJwcCwgZ3JheSIsCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfR1JFWSwKLQkJLmRlcHRoID0gOCwKLQkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKLQkgfSwgewotCQkubmFtZSA9ICI0OjE6MSwgcGFja2VkLCBZNDFQIiwKLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZNDFQLAotCQkuZGVwdGggPSAxMiwKLQkJLmZsYWdzID0gRk9STUFUX0ZMQUdTX1BBQ0tFRCwKLQl9LCB7Ci0JCS5uYW1lID0gIjQ6MjoyLCBwYWNrZWQsIFlVWVYiLAotCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5kZXB0aCA9IDE2LAotCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAotCX0sIHsKLQkJLm5hbWUgPSAiNDoyOjIsIHBhY2tlZCwgVVlWWSIsCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfVVlWWSwKLQkJLmRlcHRoID0gMTYsCi0JCS5mbGFncyA9IEZPUk1BVF9GTEFHU19QQUNLRUQsCi0JfSwgewotCQkubmFtZSA9ICI0OjI6MCwgWVVWIiwKLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9ZVVY0MjAsCi0JCS5kZXB0aCA9IDEyLAotCQkuZmxhZ3MgPSBGT1JNQVRfRkxBR1NfUEFDS0VELAotCX0sCi19OwotCi1pbnQgY3gyNTgyMV9nZXRfZm9ybWF0X3NpemUodm9pZCkKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShmb3JtYXRzKTsKLX0KLQotc3RydWN0IGN4MjU4MjFfZm10ICpjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmIChmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1k0MVAgfHwgZm91cmNjID09IFY0TDJfUElYX0ZNVF9ZVVY0MTFQKQotCQlyZXR1cm4gZm9ybWF0cyArIDE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgaSsrKQotCQlpZiAoZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91cmNjKQotCQkJcmV0dXJuIGZvcm1hdHMgKyBpOwotCi0JcHJfZXJyKCIlcygweCUwOHgpIE5PVCBGT1VORFxuIiwgX19mdW5jX18sIGZvdXJjYyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgY3gyNTgyMV9kdW1wX3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJICAgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEpCi17Ci0Jc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+YWN0aXZlKQotCQkgICAgYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQl9Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+cXVldWVkKQotCQkgICAgYnVmID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQl9Ci0KLX0KLQotdm9pZCBjeDI1ODIxX3ZpZGVvX3dha2V1cChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEsCi0JCQkgIHUzMiBjb3VudCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQlpbnQgYmM7Ci0KLQlmb3IgKGJjID0gMDs7IGJjKyspIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJCWRwcmludGsoMSwgImJjPSVkICg9MDogYWN0aXZlIGVtcHR5KVxuIiwgYmMpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlidWYgPQotCQkgICAgbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkJLyogY291bnQgY29tZXMgZnJvbSB0aGUgaHcgYW5kIGl0IGlzIDE2Yml0IHdpZGUgLS0KLQkJICogdGhpcyB0cmljayBoYW5kbGVzIHdyYXAtYXJvdW5kcyBjb3JyZWN0bHkgZm9yCi0JCSAqIHVwIHRvIDMyNzY3IGJ1ZmZlcnMgaW4gZmxpZ2h0Li4uICovCi0JCWlmICgoczE2KSAoY291bnQgLSBidWYtPmNvdW50KSA8IDApCi0JCQlicmVhazsKLQotCQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRE9ORTsKLQkJbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOwotCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCX0KLQotCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQotCQlkZWxfdGltZXIoJnEtPnRpbWVvdXQpOwotCWVsc2UKLQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCWlmIChiYyAhPSAxKQotCQlwcl9lcnIoIiVzOiAlZCBidWZmZXJzIGhhbmRsZWQgKHNob3VsZCBiZSAxKVxuIiwgX19mdW5jX18sIGJjKTsKLX0KLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3NldF90dm5vcm0oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHY0bDJfc3RkX2lkIG5vcm0pCi17Ci0JZHByaW50aygxLCAiJXMobm9ybSA9IDB4JTA4eCkgbmFtZTogWyVzXVxuIiwKLQkJX19mdW5jX18sICh1bnNpZ25lZCBpbnQpbm9ybSwgdjRsMl9ub3JtX3RvX25hbWUobm9ybSkpOwotCi0JZGV2LT50dm5vcm0gPSBub3JtOwotCi0JLyogVGVsbCB0aGUgaW50ZXJuYWwgQS9WIGRlY29kZXIgKi8KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19zdGQsIG5vcm0pOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RydWN0IHZpZGVvX2RldmljZSAqY3gyNTgyMV92ZGV2X2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCQkJICAgICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnRlbXBsYXRlLAotCQkJCSAgICAgICBjaGFyICp0eXBlKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KLQl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQlpZiAoTlVMTCA9PSB2ZmQpCi0JCXJldHVybiBOVUxMOwotCSp2ZmQgPSAqdGVtcGxhdGU7Ci0JdmZkLT52NGwyX2RldiA9ICZkZXYtPnY0bDJfZGV2OwotCXZmZC0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOwotCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcyAlcyAoJXMpIiwgZGV2LT5uYW1lLCB0eXBlLAotCQkgY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7Ci0JdmlkZW9fc2V0X2RydmRhdGEodmZkLCBkZXYpOwotCXJldHVybiB2ZmQ7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IGN4MjU4MjFfY3RybF9xdWVyeShzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQotewotCWludCBpOwotCi0JaWYgKHFjdHJsLT5pZCA8IFY0TDJfQ0lEX0JBU0UgfHwgcWN0cmwtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQotCQlpZiAoY3gyNTgyMV9jdGxzW2ldLnYuaWQgPT0gcWN0cmwtPmlkKQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gQ1gyNTgyMV9DVExTKSB7Ci0JCSpxY3RybCA9IG5vX2N0bDsKLQkJcmV0dXJuIDA7Ci0JfQotCSpxY3RybCA9IGN4MjU4MjFfY3Rsc1tpXS52OwotCXJldHVybiAwOwotfQotKi8KLQotLyogcmVzb3VyY2UgbWFuYWdlbWVudCAqLwotaW50IGN4MjU4MjFfcmVzX2dldChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IGN4MjU4MjFfZmggKmZoLAotCQkgICAgdW5zaWduZWQgaW50IGJpdCkKLXsKLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGZoLT5yZXNvdXJjZXMgJiBiaXQpCi0JCS8qIGhhdmUgaXQgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQkJcmV0dXJuIDE7Ci0KLQkvKiBpcyBpdCBmcmVlPyAqLwotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JaWYgKGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmIGJpdCkgewotCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogaXQncyBmcmVlLCBncmFiIGl0ICovCi0JZmgtPnJlc291cmNlcyB8PSBiaXQ7Ci0JZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzIHw9IGJpdDsKLQlkcHJpbnRrKDEsICJyZXM6IGdldCAlZFxuIiwgYml0KTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBjeDI1ODIxX3Jlc19jaGVjayhzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JcmV0dXJuIGZoLT5yZXNvdXJjZXMgJiBiaXQ7Ci19Ci0KLWludCBjeDI1ODIxX3Jlc19sb2NrZWQoc3RydWN0IGN4MjU4MjFfZmggKmZoLCB1bnNpZ25lZCBpbnQgYml0KQotewotCXJldHVybiBmaC0+ZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICYgYml0OwotfQotCi12b2lkIGN4MjU4MjFfcmVzX2ZyZWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwKLQkJICAgICAgdW5zaWduZWQgaW50IGJpdHMpCi17Ci0JQlVHX09OKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cyk7Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQlmaC0+cmVzb3VyY2VzICY9IH5iaXRzOwotCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmPSB+Yml0czsKLQlkcHJpbnRrKDEsICJyZXM6IHB1dCAlZFxuIiwgYml0cyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotfQotCi1pbnQgY3gyNTgyMV92aWRlb19tdXgoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBpbnB1dCkKLXsKLQlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwotCW1lbXNldCgmcm91dGUsIDAsIHNpemVvZihyb3V0ZSkpOwotCi0JZHByaW50aygxLCAiJXMoKTogdmlkZW9fbXV4OiAlZCBbdm11eD0lZCwgZ3Bpbz0weCV4LDB4JXgsMHgleCwweCV4XVxuIiwKLQkJX19mdW5jX18sIGlucHV0LCBJTlBVVChpbnB1dCktPnZtdXgsIElOUFVUKGlucHV0KS0+Z3BpbzAsCi0JCUlOUFVUKGlucHV0KS0+Z3BpbzEsIElOUFVUKGlucHV0KS0+Z3BpbzIsIElOUFVUKGlucHV0KS0+Z3BpbzMpOwotCWRldi0+aW5wdXQgPSBpbnB1dDsKLQotCXJvdXRlLmlucHV0ID0gSU5QVVQoaW5wdXQpLT52bXV4OwotCi0JLyogVGVsbCB0aGUgaW50ZXJuYWwgQS9WIGRlY29kZXIgKi8KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdmlkZW8sIHNfcm91dGluZywgSU5QVVQoaW5wdXQpLT52bXV4LCAwLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV9zdGFydF92aWRlb19kbWEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEsCi0JCQkgICAgc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYsCi0JCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCkKLXsKLQlpbnQgdG1wID0gMDsKLQotCS8qIHNldHVwIGZpZm8gKyBmb3JtYXQgKi8KLQljeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChkZXYsIGNoYW5uZWwsIGJ1Zi0+YnBsLCBidWYtPnJpc2MuZG1hKTsKLQotCS8qIHJlc2V0IGNvdW50ZXIgKi8KLQljeF93cml0ZShjaGFubmVsLT5ncGNudF9jdGwsIDMpOwotCXEtPmNvdW50ID0gMTsKLQotCS8qIGVuYWJsZSBpcnEgKi8KLQljeF9zZXQoUENJX0lOVF9NU0ssIGN4X3JlYWQoUENJX0lOVF9NU0spIHwgKDEgPDwgY2hhbm5lbC0+aSkpOwotCWN4X3NldChjaGFubmVsLT5pbnRfbXNrLCAweDExKTsKLQotCS8qIHN0YXJ0IGRtYSAqLwotCWN4X3dyaXRlKGNoYW5uZWwtPmRtYV9jdGwsIDB4MTEpOwkvKiBGSUZPIGFuZCBSSVNDIGVuYWJsZSAqLwotCi0JLyogbWFrZSBzdXJlIHVwc3RyZWFtIHNldHRpbmcgaWYgYW55IGlzIHJldmVyc2VkICovCi0JdG1wID0gY3hfcmVhZChWSURfQ0hfTU9ERV9TRUwpOwotCWN4X3dyaXRlKFZJRF9DSF9NT0RFX1NFTCwgdG1wICYgMHhGRkZGRkUwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKLQkJCQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsKQotewotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmLCAqcHJldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWJ1ZiA9Ci0JCSAgICBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5uZXh0LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiLnF1ZXVlKTsKLQotCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwgY2hhbm5lbCk7Ci0KLQkJbGlzdF9mb3JfZWFjaChpdGVtLCAmcS0+YWN0aXZlKSB7Ci0JCQlidWYgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCX0KLQotCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByZXYgPSBOVUxMOwotCWZvciAoOzspIHsKLQkJaWYgKGxpc3RfZW1wdHkoJnEtPnF1ZXVlZCkpCi0JCQlyZXR1cm4gMDsKLQotCQlidWYgPQotCQkgICAgbGlzdF9lbnRyeShxLT5xdWV1ZWQubmV4dCwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkJaWYgKE5VTEwgPT0gcHJldikgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsIGNoYW5uZWwpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOwotCQkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCQl9IGVsc2UgaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGggJiYKLQkJCSAgIHByZXYtPnZiLmhlaWdodCA9PSBidWYtPnZiLmhlaWdodCAmJgotCQkJICAgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X21vdmVfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwotCQkJcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsgLyogQml0cyA2MyAtIDMyICovCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcmV2ID0gYnVmOwotCX0KLX0KLQotdm9pZCBjeDI1ODIxX3ZpZF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kYXRhICp0aW1lb3V0X2RhdGEgPSAoc3RydWN0IGN4MjU4MjFfZGF0YSAqKWRhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSB0aW1lb3V0X2RhdGEtPmRldjsKLQlzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaGFubmVsID0gdGltZW91dF9kYXRhLT5jaGFubmVsOwotCXN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxID0gJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsIGNoYW5uZWwpOyAqLwotCWN4X2NsZWFyKGNoYW5uZWwtPmRtYV9jdGwsIDB4MTEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpIHsKLQkJYnVmID0KLQkJICAgIGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCQlsaXN0X2RlbCgmYnVmLT52Yi5xdWV1ZSk7Ci0KLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOwotCQl3YWtlX3VwKCZidWYtPnZiLmRvbmUpOwotCX0KLQotCWN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShkZXYsIHEsIGNoYW5uZWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkZW9faXJxKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbl9udW0sIHUzMiBzdGF0dXMpCi17Ci0JdTMyIGNvdW50ID0gMDsKLQlpbnQgaGFuZGxlZCA9IDA7Ci0JdTMyIG1hc2s7Ci0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnNyYW1fY2hhbm5lbHM7Ci0KLQltYXNrID0gY3hfcmVhZChjaGFubmVsLT5pbnRfbXNrKTsKLQlpZiAoMCA9PSAoc3RhdHVzICYgbWFzaykpCi0JCXJldHVybiBoYW5kbGVkOwotCi0JY3hfd3JpdGUoY2hhbm5lbC0+aW50X3N0YXQsIHN0YXR1cyk7Ci0KLQkvKiByaXNjIG9wIGNvZGUgZXJyb3IgKi8KLQlpZiAoc3RhdHVzICYgKDEgPDwgMTYpKSB7Ci0JCXByX3dhcm4oIiVzLCAlczogdmlkZW8gcmlzYyBvcCBjb2RlIGVycm9yXG4iLAotCQkJZGV2LT5uYW1lLCBjaGFubmVsLT5uYW1lKTsKLQkJY3hfY2xlYXIoY2hhbm5lbC0+ZG1hX2N0bCwgMHgxMSk7Ci0JCWN4MjU4MjFfc3JhbV9jaGFubmVsX2R1bXAoZGV2LCBjaGFubmVsKTsKLQl9Ci0KLQkvKiByaXNjMSB5ICovCi0JaWYgKHN0YXR1cyAmIEZMRF9WSURfRFNUX1JJU0MxKSB7Ci0JCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JCWNvdW50ID0gY3hfcmVhZChjaGFubmVsLT5ncGNudCk7Ci0JCWN4MjU4MjFfdmlkZW9fd2FrZXVwKGRldiwgJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcSwKLQkJCQljb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKLQkJaGFuZGxlZCsrOwotCX0KLQotCS8qIHJpc2MyIHkgKi8KLQlpZiAoc3RhdHVzICYgMHgxMCkgewotCQlkcHJpbnRrKDIsICJzdG9wcGVyIHZpZGVvXG4iKTsKLQkJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKLQkJY3gyNTgyMV9yZXN0YXJ0X3ZpZGVvX3F1ZXVlKGRldiwKLQkJCQkmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLCBjaGFubmVsKTsKLQkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwotCQloYW5kbGVkKys7Ci0JfQotCXJldHVybiBoYW5kbGVkOwotfQotCi12b2lkIGN4MjU4MjFfdmlkZW9pb2N0bF91bnJlZ2lzdGVyKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KQotewotCWlmIChkZXYtPmlvY3RsX2RldikgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPmlvY3RsX2RldikpCi0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPmlvY3RsX2Rldik7Ci0JCWVsc2UKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+aW9jdGxfZGV2KTsKLQotCQlkZXYtPmlvY3RsX2RldiA9IE5VTEw7Ci0JfQotfQotCi12b2lkIGN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IGNoYW5fbnVtKQotewotCWN4X2NsZWFyKFBDSV9JTlRfTVNLLCAxKTsKLQotCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpIHsKLQkJaWYgKHZpZGVvX2lzX3JlZ2lzdGVyZWQoZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KSkKLQkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKAotCQkJCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOwotCQllbHNlCi0JCQl2aWRlb19kZXZpY2VfcmVsZWFzZSgKLQkJCQkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKLQotCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYgPSBOVUxMOwotCi0JCWJ0Y3hfcmlzY21lbV9mcmVlKGRldi0+cGNpLAotCQkJCSZkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRxLnN0b3BwZXIpOwotCi0JCXByX3dhcm4oImRldmljZSAlZCByZWxlYXNlZCFcbiIsIGNoYW5fbnVtKTsKLQl9Ci0KLX0KLQotaW50IGN4MjU4MjFfdmlkZW9fcmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpCi17Ci0JaW50IGVycjsKLQlpbnQgaTsKLQotCXN0cnVjdCB2aWRlb19kZXZpY2UgY3gyNTgyMV92aWRlb19kZXZpY2UgPSB7Ci0JCS5uYW1lID0gImN4MjU4MjEtdmlkZW8iLAotCQkuZm9wcyA9ICZ2aWRlb19mb3BzLAotCQkubWlub3IgPSAtMSwKLQkJLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKLQkJLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwKLQl9OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU0gLSAxOyArK2kpIHsKLQkJY3gyNTgyMV9pbml0X2NvbnRyb2xzKGRldiwgaSk7Ci0KLQkJY3gyNTgyMV9yaXNjX3N0b3BwZXIoZGV2LT5wY2ksICZkZXYtPmNoYW5uZWxzW2ldLnZpZHEuc3RvcHBlciwKLQkJCQlkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMtPmRtYV9jdGwsCi0JCQkJMHgxMSwgMCk7Ci0KLQkJZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzID0gJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tpXTsKLQkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBOVUxMOwotCQlkZXYtPmNoYW5uZWxzW2ldLnJlc291cmNlcyA9IDA7Ci0KLQkJY3hfd3JpdGUoZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCwgMHhmZmZmZmZmZik7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5hY3RpdmUpOwotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFubmVsc1tpXS52aWRxLnF1ZXVlZCk7Ci0KLQkJZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGEuZGV2ID0gZGV2OwotCQlkZXYtPmNoYW5uZWxzW2ldLnRpbWVvdXRfZGF0YS5jaGFubmVsID0KLQkJCSZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07Ci0JCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmZ1bmN0aW9uID0KLQkJCWN4MjU4MjFfdmlkX3RpbWVvdXQ7Ci0JCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmRhdGEgPQotCQkJKHVuc2lnbmVkIGxvbmcpJmRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhOwotCQlpbml0X3RpbWVyKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEudGltZW91dCk7Ci0KLQkJLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KLQkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBjeDI1ODIxX3ZkZXZfaW5pdChkZXYsCi0JCQkJZGV2LT5wY2ksICZjeDI1ODIxX3ZpZGVvX2RldmljZSwgInZpZGVvIik7Ci0KLQkJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LAotCQkJCVZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yW2Rldi0+bnJdKTsKLQotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZmFpbF91bnJlZzsKLQotCX0KLQotCS8qIHNldCBQQ0kgaW50ZXJydXB0ICovCi0JY3hfc2V0KFBDSV9JTlRfTVNLLCAweGZmKTsKLQotCS8qIGluaXRpYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotI2lmZGVmIFRVTkVSX0ZMQUcKLQlkZXYtPnR2bm9ybSA9IGN4MjU4MjFfdmlkZW9fZGV2aWNlLmN1cnJlbnRfbm9ybTsKLQljeDI1ODIxX3NldF90dm5vcm0oZGV2LCBkZXYtPnR2bm9ybSk7Ci0jZW5kaWYKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQotCXJldHVybiAwOwotCi1mYWlsX3VucmVnOgotCWN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihkZXYsIGkpOwotCXJldHVybiBlcnI7Ci19Ci0KLWludCBjeDI1ODIxX2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqY291bnQsCi0JCSB1bnNpZ25lZCBpbnQgKnNpemUpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcS0+cHJpdl9kYXRhOwotCi0JKnNpemUgPSBmaC0+Zm10LT5kZXB0aCAqIGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgPj4gMzsKLQotCWlmICgwID09ICpjb3VudCkKLQkJKmNvdW50ID0gMzI7Ci0KLQlpZiAoKnNpemUgKiAqY291bnQgPiB2aWRfbGltaXQgKiAxMDI0ICogMTAyNCkKLQkJKmNvdW50ID0gKHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KSAvICpzaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCi0JCSAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KLQkgICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlpbnQgcmMsIGluaXRfYnVmZmVyID0gMDsKLQl1MzIgbGluZTBfb2Zmc2V0LCBsaW5lMV9vZmZzZXQ7Ci0Jc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKTsKLQlpbnQgYnBsX2xvY2FsID0gTElORV9TSVpFX0QxOwotCWludCBjaGFubmVsX29wZW5lZCA9IGZoLT5jaGFubmVsX2lkOwotCi0JQlVHX09OKE5VTEwgPT0gZmgtPmZtdCk7Ci0JaWYgKGZoLT53aWR0aCA8IDQ4IHx8IGZoLT53aWR0aCA+IDcyMCB8fAotCSAgICBmaC0+aGVpZ2h0IDwgMzIgfHwgZmgtPmhlaWdodCA+IDU3NikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlidWYtPnZiLnNpemUgPSAoZmgtPndpZHRoICogZmgtPmhlaWdodCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOwotCi0JaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAmJiBidWYtPnZiLmJzaXplIDwgYnVmLT52Yi5zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChidWYtPmZtdCAhPSBmaC0+Zm10IHx8Ci0JICAgIGJ1Zi0+dmIud2lkdGggIT0gZmgtPndpZHRoIHx8Ci0JICAgIGJ1Zi0+dmIuaGVpZ2h0ICE9IGZoLT5oZWlnaHQgfHwgYnVmLT52Yi5maWVsZCAhPSBmaWVsZCkgewotCQlidWYtPmZtdCA9IGZoLT5mbXQ7Ci0JCWJ1Zi0+dmIud2lkdGggPSBmaC0+d2lkdGg7Ci0JCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKLQkJYnVmLT52Yi5maWVsZCA9IGZpZWxkOwotCQlpbml0X2J1ZmZlciA9IDE7Ci0JfQotCi0JaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgewotCQlpbml0X2J1ZmZlciA9IDE7Ci0JCXJjID0gdmlkZW9idWZfaW9sb2NrKHEsICZidWYtPnZiLCBOVUxMKTsKLQkJaWYgKDAgIT0gcmMpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgidmlkZW9idWZfaW9sb2NrIGZhaWxlZCFcbiIpKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQotCWRwcmludGsoMSwgImluaXRfYnVmZmVyPSVkXG4iLCBpbml0X2J1ZmZlcik7Ci0KLQlpZiAoaW5pdF9idWZmZXIpIHsKLQotCQljaGFubmVsX29wZW5lZCA9IGRldi0+Y2hhbm5lbF9vcGVuZWQ7Ci0JCWlmIChjaGFubmVsX29wZW5lZCA8IDAgfHwgY2hhbm5lbF9vcGVuZWQgPiA3KQotCQkJY2hhbm5lbF9vcGVuZWQgPSA3OwotCi0JCWlmIChkZXYtPmNoYW5uZWxzW2NoYW5uZWxfb3BlbmVkXS5waXhlbF9mb3JtYXRzID09Ci0JCQkJUElYRUxfRlJNVF80MTEpCi0JCQlidWYtPmJwbCA9IChidWYtPmZtdC0+ZGVwdGggKiBidWYtPnZiLndpZHRoKSA+PiAzOwotCQllbHNlCi0JCQlidWYtPmJwbCA9IChidWYtPmZtdC0+ZGVwdGggPj4gMykgKiAoYnVmLT52Yi53aWR0aCk7Ci0KLQkJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLnBpeGVsX2Zvcm1hdHMgPT0KLQkJCQlQSVhFTF9GUk1UXzQxMSkgewotCQkJYnBsX2xvY2FsID0gYnVmLT5icGw7Ci0JCX0gZWxzZSB7Ci0JCQlicGxfbG9jYWwgPSBidWYtPmJwbDsgICAvKiBEZWZhdWx0ICovCi0KLQkJCWlmIChjaGFubmVsX29wZW5lZCA+PSAwICYmIGNoYW5uZWxfb3BlbmVkIDw9IDcpIHsKLQkJCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KLQkJCQkJCS51c2VfY2lmX3Jlc29sdXRpb24pIHsKLQkJCQkJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHCi0JCQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkJCQkJCWJwbF9sb2NhbCA9IDM1MiA8PCAxOwotCQkJCQllbHNlCi0JCQkJCQlicGxfbG9jYWwgPQotCQkJCQkJIGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLgotCQkJCQkJIGNpZl93aWR0aCA8PAotCQkJCQkJIDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3dpdGNoIChidWYtPnZiLmZpZWxkKSB7Ci0JCWNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0JCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAotCQkJCQkgICAgZG1hLT5zZ2xpc3QsIDAsIFVOU0VULAotCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0KTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfRklFTERfQk9UVE9NOgotCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKLQkJCQkJICAgIGRtYS0+c2dsaXN0LCBVTlNFVCwgMCwKLQkJCQkJICAgIGJ1Zi0+YnBsLCAwLCBidWYtPnZiLmhlaWdodCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6Ci0JCQkvKiBBbGwgb3RoZXIgZm9ybWF0cyBhcmUgdG9wIGZpZWxkIGZpcnN0ICovCi0JCQlsaW5lMF9vZmZzZXQgPSAwOwotCQkJbGluZTFfb2Zmc2V0ID0gYnVmLT5icGw7Ci0JCQlkcHJpbnRrKDEsICJ0b3AgZmllbGQgZmlyc3RcbiIpOwotCi0JCQljeDI1ODIxX3Jpc2NfYnVmZmVyKGRldi0+cGNpLCAmYnVmLT5yaXNjLAotCQkJCQkgICAgZG1hLT5zZ2xpc3QsIGxpbmUwX29mZnNldCwKLQkJCQkJICAgIGJwbF9sb2NhbCwgYnBsX2xvY2FsLCBicGxfbG9jYWwsCi0JCQkJCSAgICBidWYtPnZiLmhlaWdodCA+PiAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfRklFTERfU0VRX1RCOgotCQkJY3gyNTgyMV9yaXNjX2J1ZmZlcihkZXYtPnBjaSwgJmJ1Zi0+cmlzYywKLQkJCQkJICAgIGRtYS0+c2dsaXN0LAotCQkJCQkgICAgMCwgYnVmLT5icGwgKiAoYnVmLT52Yi5oZWlnaHQgPj4gMSksCi0JCQkJCSAgICBidWYtPmJwbCwgMCwgYnVmLT52Yi5oZWlnaHQgPj4gMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX0ZJRUxEX1NFUV9CVDoKLQkJCWN4MjU4MjFfcmlzY19idWZmZXIoZGV2LT5wY2ksICZidWYtPnJpc2MsCi0JCQkJCSAgICBkbWEtPnNnbGlzdCwKLQkJCQkJICAgIGJ1Zi0+YnBsICogKGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpLCAwLAotCQkJCQkgICAgYnVmLT5icGwsIDAsIGJ1Zi0+dmIuaGVpZ2h0ID4+IDEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJfQotCX0KLQotCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3ByZXAgLSAlZHglZCAlZGJwcCBcIiVzXCIgLSBkbWE9MHglMDhseFxuIiwKLQkJYnVmLCBidWYtPnZiLmksIGZoLT53aWR0aCwgZmgtPmhlaWdodCwgZmgtPmZtdC0+ZGVwdGgsCi0JCWZoLT5mbXQtPm5hbWUsICh1bnNpZ25lZCBsb25nKWJ1Zi0+cmlzYy5kbWEpOwotCi0JYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JY3gyNTgyMV9mcmVlX2J1ZmZlcihxLCBidWYpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBjeDI1ODIxX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKLQkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yik7Ci0KLQljeDI1ODIxX2ZyZWVfYnVmZmVyKHEsIGJ1Zik7Ci19Ci0KLXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqZ2V0X3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCkKLXsKLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCXJldHVybiAmZmgtPnZpZHE7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLQotaW50IGN4MjU4MjFfZ2V0X3Jlc291cmNlKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgaW50IHJlc291cmNlKQotewotCXN3aXRjaCAoZmgtPnR5cGUpIHsKLQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKLQkJcmV0dXJuIHJlc291cmNlOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcihnZXRfcXVldWUoZmgpLCB2bWEpOwotfQotCi0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKmJ1ZiA9Ci0JICAgY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKnByZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udmlkcTsKLQotCS8qIGFkZCBqdW1wIHRvIHN0b3BwZXIgKi8KLQlidWYtPnJpc2Muam1wWzBdID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QIHwgUklTQ19JUlExIHwgUklTQ19DTlRfSU5DKTsKLQlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIocS0+c3RvcHBlci5kbWEpOwotCWJ1Zi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsgICAgICAvKiBiaXRzIDYzLTMyICovCi0KLQlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJCQlidWYtPnZiLmkpOwotCi0JfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCQljeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwKLQkJCQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5zcmFtX2NoYW5uZWxzKTsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKLQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcyArIEJVRkZFUl9USU1FT1VUKTsKLQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgcS0+Y291bnQgPSAlZFxuIiwKLQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCwgcS0+Y291bnQpOwotCX0gZWxzZSB7Ci0JCXByZXYgPSBsaXN0X2VudHJ5KHEtPmFjdGl2ZS5wcmV2LCBzdHJ1Y3QgY3gyNTgyMV9idWZmZXIsCi0JCQkJdmIucXVldWUpOwotCQlpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAotCQkgICAmJiBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQKLQkJICAgJiYgcHJldi0+Zm10ID09IGJ1Zi0+Zm10KSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKLQkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7Ci0JCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0KLQkJCS8qIDY0IGJpdCBiaXRzIDYzLTMyICovCi0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwotCQkJZHByaW50aygyLCAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlLCBidWYtPmNvdW50PSVkXG4iLAotCQkJCQlidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1FVRVVFRDsKLQkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgcXVldWVkXG4iLCBidWYsCi0JCQkJCWJ1Zi0+dmIuaSk7Ci0JCX0KLQl9Ci0KLQlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKLQkJZHByaW50aygyLCAiYWN0aXZlIHF1ZXVlIGVtcHR5IVxuIik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGN4MjU4MjFfdmlkZW9fcW9wcyA9IHsKLQkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCi0JLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKLQkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAotCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpoLCAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmg7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlpbnQgbWlub3IgPSB2aWRlb19kZXZkYXRhKGZpbGUpLT5taW5vcjsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl1MzIgcGl4X2Zvcm1hdDsKLQlpbnQgY2hfaWQgPSAwOwotCWludCBpOwotCi0JZHByaW50aygxLCAib3BlbiBkZXY9JXMgdHlwZT0lc1xuIiwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwKLQkJCXY0bDJfdHlwZV9uYW1lc1t0eXBlXSk7Ci0KLQkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXV0ZXhfbG9jaygmY3gyNTgyMV9kZXZsaXN0X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmN4MjU4MjFfZGV2bGlzdCkKLQl7Ci0JCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDI1ODIxX2RldiwgZGV2bGlzdCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkJaWYgKGgtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiAmJgotCQkJICAgaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikgewotCQkJCWRldiA9IGg7Ci0JCQkJY2hfaWQgPSBpOwotCQkJCXR5cGUgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKE5VTEwgPT0gZGV2KSB7Ci0JCW11dGV4X3VubG9jaygmY3gyNTgyMV9kZXZsaXN0X211dGV4KTsKLQkJa2ZyZWUoZmgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ID0gZGV2OwotCWZoLT50eXBlID0gdHlwZTsKLQlmaC0+d2lkdGggPSA3MjA7Ci0JZmgtPmNoYW5uZWxfaWQgPSBjaF9pZDsKLQotCWlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRyB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkJZmgtPmhlaWdodCA9IDU3NjsKLQllbHNlCi0JCWZoLT5oZWlnaHQgPSA0ODA7Ci0KLQlkZXYtPmNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7Ci0JaWYgKGRldi0+Y2hhbm5lbHNbY2hfaWRdLnBpeGVsX2Zvcm1hdHMgPT0gUElYRUxfRlJNVF80MTEpCi0JCXBpeF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfWTQxUDsKLQllbHNlCi0JCXBpeF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQlmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKHBpeF9mb3JtYXQpOwotCi0JdjRsMl9wcmlvX29wZW4oJmRldi0+Y2hhbm5lbHNbY2hfaWRdLnByaW8sICZmaC0+cHJpbyk7Ci0KLQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJmN4MjU4MjFfdmlkZW9fcW9wcywKLQkJCSAgICAgICZkZXYtPnBjaS0+ZGV2LCAmZGV2LT5zbG9jaywKLQkJCSAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkJCSAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY3gyNTgyMV9idWZmZXIpLCBmaCwgTlVMTCk7Ci0KLQlkcHJpbnRrKDEsICJwb3N0IHZpZGVvYnVmX3F1ZXVlX2luaXQoKVxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogZGF0YSwgc2l6ZV90IGNvdW50LAotCQkJIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGZoLT50eXBlKSB7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JCWlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgsIFJFU09VUkNFX1ZJREVPMCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAotCQkJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwotCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7Ci0JCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCi0JCQkJc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQoKSBjYXB0dXJlICovCi0JCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkJaWYgKE5VTEwgPT0gYnVmKQotCQkJcmV0dXJuIFBPTExFUlI7Ci0JfQotCi0JcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQkJCWlmIChkZXYgJiYgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkJLnVzZV9jaWZfcmVzb2x1dGlvbikgewotCQkJCXU4IGNhbV9pZCA9ICooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMyk7Ci0JCQkJbWVtY3B5KChjaGFyICopYnVmLT52Yi5iYWRkciwKLQkJCQkgICAgICAoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAoZmgtPndpZHRoICogMiksCi0JCQkJICAgICAgKGZoLT53aWR0aCAqIDIpKTsKLQkJCQkqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpID0gY2FtX2lkOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCi0JLyogc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8gKi8KLQljeF93cml0ZShjaGFubmVsMC0+ZG1hX2N0bCwgMCk7IC8qIEZJRk8gYW5kIFJJU0MgZGlzYWJsZSAqLwotCi0JLyogc3RvcCB2aWRlbyBjYXB0dXJlICovCi0JaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7Ci0JCXZpZGVvYnVmX3F1ZXVlX2NhbmNlbCgmZmgtPnZpZHEpOwotCQljeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIFJFU09VUkNFX1ZJREVPMCk7Ci0JfQotCi0JaWYgKGZoLT52aWRxLnJlYWRfYnVmKSB7Ci0JCWN4MjU4MjFfYnVmZmVyX3JlbGVhc2UoJmZoLT52aWRxLCBmaC0+dmlkcS5yZWFkX2J1Zik7Ci0JCWtmcmVlKGZoLT52aWRxLnJlYWRfYnVmKTsKLQl9Ci0KLQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKLQotCXY0bDJfcHJpb19jbG9zZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywgZmgtPnByaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Ja2ZyZWUoZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQotCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodW5saWtlbHkoIWN4MjU4MjFfcmVzX2dldChkZXYsIGZoLCBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwKLQkJCQkJCVJFU09VUkNFX1ZJREVPMCkpKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihnZXRfcXVldWUoZmgpKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlpbnQgZXJyLCByZXM7Ci0KLQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaSAhPSBmaC0+dHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXMgPSBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8wKTsKLQllcnIgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoZ2V0X3F1ZXVlKGZoKSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCByZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKLQlpbnQgZXJyOwotCWludCBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JZXJyID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbGUsIHByaXYsIGYpOwotCi0JaWYgKDAgIT0gZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZmgtPmZtdCA9IGN4MjU4MjFfZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlmaC0+dmlkcS5maWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0KLQkvKiBjaGVjayBpZiB3aWR0aCBhbmQgaGVpZ2h0IGlzIHZhbGlkIGJhc2VkIG9uIHNldCBzdGFuZGFyZCAqLwotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX3dpZHRoKGYtPmZtdC5waXgud2lkdGgsIGRldi0+dHZub3JtKSkKLQkJZmgtPndpZHRoID0gZi0+Zm10LnBpeC53aWR0aDsKLQotCWlmIChjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodChmLT5mbXQucGl4LmhlaWdodCwgZGV2LT50dm5vcm0pKQotCQlmaC0+aGVpZ2h0ID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0KLQlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKLQkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOwotCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCi0JCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDAwLCBwaXhfZm9ybWF0KTsKLQotCS8qIGNoZWNrIGlmIGNpZiByZXNvbHV0aW9uICovCi0JaWYgKGZoLT53aWR0aCA9PSAzMjAgfHwgZmgtPndpZHRoID09IDM1MikKLQkJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMTsKLQllbHNlCi0JCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnVzZV9jaWZfcmVzb2x1dGlvbiA9IDA7Ci0KLQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jaWZfd2lkdGggPSBmaC0+d2lkdGg7Ci0JbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgZmgtPndpZHRoLCBTUkFNX0NIMDApOwotCi0JZHByaW50aygyLCAiJXMoKTogd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAotCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7Ci0JdjRsMl9maWxsX21idXNfZm9ybWF0KCZtYnVzX2ZtdCwgJmYtPmZtdC5waXgsIFY0TDJfTUJVU19GTVRfRklYRUQpOwotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19tYnVzX2ZtdCwgJm1idXNfZm10KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0KLQlyZXRfdmFsID0gdmlkZW9idWZfZHFidWYoZ2V0X3F1ZXVlKGZoKSwgcCwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JcC0+c2VxdWVuY2UgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxLmNvdW50OwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2xvZ19zdGF0dXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWNoYXIgbmFtZVszMiArIDJdOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCi0JCQkJCQkJCS5zcmFtX2NoYW5uZWxzOwotCXUzMiB0bXAgPSAwOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7Ci0JcHJfaW5mbygiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCi0JCWRldi0+bmFtZSk7Ci0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7Ci0JcHJfaW5mbygiVmlkZW8gaW5wdXQgMCBpcyAlc1xuIiwKLQkJKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwotCXByX2luZm8oIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAotCQlkZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgZmgtPmNoYW5uZWxfaWQpOwotfQotCi0vKiBWSURFTyBJT0NUTFMgKi8KLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQotCWYtPmZtdC5waXgud2lkdGggPSBmaC0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBmaC0+aGVpZ2h0OwotCWYtPmZtdC5waXguZmllbGQgPSBmaC0+dmlkcS5maWVsZDsKLQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZmgtPmZtdC0+Zm91cmNjOwotCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKLQlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7Ci0JZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwotCXVuc2lnbmVkIGludCBtYXh3LCBtYXhoOwotCi0JZm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCWlmIChOVUxMID09IGZtdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmaWVsZCA9IGYtPmZtdC5waXguZmllbGQ7Ci0JbWF4dyA9IDcyMDsKLQltYXhoID0gNTc2OwotCi0JaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7Ci0JCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGggLyAyKQotCQkJZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCWVsc2UKLQkJCWZpZWxkID0gVjRMMl9GSUVMRF9UT1A7Ci0JfQotCi0Jc3dpdGNoIChmaWVsZCkgewotCWNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0JY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKLQkJbWF4aCA9IG1heGggLyAyOwotCQlicmVhazsKLQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZi0+Zm10LnBpeC5maWVsZCA9IGZpZWxkOwotCWlmIChmLT5mbXQucGl4LmhlaWdodCA8IDMyKQotCQlmLT5mbXQucGl4LmhlaWdodCA9IDMyOwotCWlmIChmLT5mbXQucGl4LmhlaWdodCA+IG1heGgpCi0JCWYtPmZtdC5waXguaGVpZ2h0ID0gbWF4aDsKLQlpZiAoZi0+Zm10LnBpeC53aWR0aCA8IDQ4KQotCQlmLT5mbXQucGl4LndpZHRoID0gNDg7Ci0JaWYgKGYtPmZtdC5waXgud2lkdGggPiBtYXh3KQotCQlmLT5mbXQucGl4LndpZHRoID0gbWF4dzsKLQlmLT5mbXQucGl4LndpZHRoICY9IH4weDAzOwotCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gKGYtPmZtdC5waXgud2lkdGggKiBmbXQtPmRlcHRoKSA+PiAzOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDI1ODIxIik7Ci0Jc3RybGNweShjYXAtPmNhcmQsIGN4MjU4MjFfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0llOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDI1ODIxX1ZFUlNJT05fQ09ERTsKLQljYXAtPmNhcGFiaWxpdGllcyA9Ci0JICAgIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7Ci0JaWYgKFVOU0VUICE9IGRldi0+dHVuZXJfdHlwZSkKLQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCi17Ci0JaWYgKHVubGlrZWx5KGYtPmluZGV4ID49IEFSUkFZX1NJWkUoZm9ybWF0cykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZvcm1hdHNbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOwotCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0c1tmLT5pbmRleF0uZm91cmNjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlyZXR1cm4gdmlkZW9idWZfcmVxYnVmcyhnZXRfcXVldWUoZmgpLCBwKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihnZXRfcXVldWUoZmgpLCBwKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXJldHVybiB2aWRlb2J1Zl9xYnVmKGdldF9xdWV1ZShmaCksIHApOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZiwgZW51bSB2NGwyX3ByaW9yaXR5ICpwKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKWYpLT5kZXY7Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZjsKLQotCSpwID0gdjRsMl9wcmlvX21heCgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsCi0JCQkgICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcHJpbykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKWYpLT5kZXY7Ci0KLQlyZXR1cm4gdjRsMl9wcmlvX2NoYW5nZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywgJmZoLT5wcmlvLAotCQkJcHJpbyk7Ci19Ci0KLSNpZmRlZiBUVU5FUl9GTEFHCi1pbnQgY3gyNTgyMV92aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogdHZub3JtcykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQotCWlmIChmaCkgewotCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCi0JCQkJICAgICAgZmgtPnByaW8pOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChkZXYtPnR2bm9ybSA9PSAqdHZub3JtcykKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCWN4MjU4MjFfc2V0X3R2bm9ybShkZXYsICp0dm5vcm1zKTsKLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7Ci0KLQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLWludCBjeDI1ODIxX2VudW1faW5wdXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5hbWVbXSA9IHsKLQkJW0NYMjU4MjFfVk1VWF9DT01QT1NJVEVdID0gIkNvbXBvc2l0ZSIsCi0JCVtDWDI1ODIxX1ZNVVhfU1ZJREVPXSA9ICJTLVZpZGVvIiwKLQkJW0NYMjU4MjFfVk1VWF9ERUJVR10gPSAiZm9yIGRlYnVnIG9ubHkiLAotCX07Ci0JdW5zaWduZWQgaW50IG47Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCi0JbiA9IGktPmluZGV4OwotCWlmIChuID49IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKDAgPT0gSU5QVVQobiktPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0Jc3RyY3B5KGktPm5hbWUsIGluYW1lW0lOUFVUKG4pLT50eXBlXSk7Ci0KLQlpLT5zdGQgPSBDWDI1ODIxX05PUk1TOwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCXJldHVybiBjeDI1ODIxX2VudW1faW5wdXQoZGV2LCBpKTsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JKmkgPSBkZXYtPmlucHV0OwotCWRwcmludGsoMSwgIiVzKCk6IHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCAqaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7Ci0JaW50IGVycjsKLQotCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGkpOwotCi0JaWYgKGZoKSB7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKLQkJCQkgICAgICBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGkgPiAyKSB7Ci0JCWRwcmludGsoMSwgIiVzKCk6IC1FSU5WQUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQljeDI1ODIxX3ZpZGVvX211eChkZXYsIGkpOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0KLQlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7Ci0KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgdHVuZXIsIGdfZnJlcXVlbmN5LCBmKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV9zZXRfZnJlcShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0JZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OwotCi0JY3gyNTgyMV9jYWxsX2FsbChkZXYsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgZik7Ci0KLQkvKiBXaGVuIGNoYW5naW5nIGNoYW5uZWxzIGl0IGlzIHJlcXVpcmVkIHRvIHJlc2V0IFRWQVVESU8gKi8KLQltc2xlZXAoMTApOwotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGZoKSB7Ci0JCWRldiA9IGZoLT5kZXY7Ci0JCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKLQkJCQkgICAgICBmaC0+cHJpbyk7Ci0JCWlmICgwICE9IGVycikKLQkJCXJldHVybiBlcnI7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJJbnZhbGlkIGZoIHBvaW50ZXIhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGN4MjU4MjFfc2V0X2ZyZXEoZGV2LCBmKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotaW50IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilmaCktPmRldjsKLQotCWlmICghdjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKLQkJICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZmgpLT5kZXY7Ci0KLQlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljeDI1ODIxX2NhbGxfYWxsKGRldiwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl90dW5lciAqdCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICgwICE9IHQtPmluZGV4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmNweSh0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOwotCXQtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTk9STTsKLQl0LT5yYW5nZWhpZ2ggPSAweGZmZmZmZmZmVUw7Ci0KLQl0LT5zaWduYWwgPSAweGZmZmY7CS8qIExPQ0tFRCAqLwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfdHVuZXIgKnQpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBub19jdGwgPSB7Ci0JLm5hbWUgPSAiNDIiLAotCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVELAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjeDI1ODIxX2N0bHNbXSA9IHsKLQkvKiAtLS0gdmlkZW8gLS0tICovCi0JewotCSAuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAotCSAubmFtZSA9ICJCcmlnaHRuZXNzIiwKLQkgLm1pbmltdW0gPSAwLAotCSAubWF4aW11bSA9IDEwMDAwLAotCSAuc3RlcCA9IDEsCi0JIC5kZWZhdWx0X3ZhbHVlID0gNjIwMCwKLQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSB9LCB7Ci0JICAgICAuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKLQkgICAgIC5uYW1lID0gIkNvbnRyYXN0IiwKLQkgICAgIC5taW5pbXVtID0gMCwKLQkgICAgIC5tYXhpbXVtID0gMTAwMDAsCi0JICAgICAuc3RlcCA9IDEsCi0JICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCi0JICAgICAudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgICB9LCB7Ci0JCSAuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAotCQkgLm5hbWUgPSAiU2F0dXJhdGlvbiIsCi0JCSAubWluaW11bSA9IDAsCi0JCSAubWF4aW11bSA9IDEwMDAwLAotCQkgLnN0ZXAgPSAxLAotCQkgLmRlZmF1bHRfdmFsdWUgPSA1MDAwLAotCQkgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkgfSwgewotCQkgICAgIC5pZCA9IFY0TDJfQ0lEX0hVRSwKLQkJICAgICAubmFtZSA9ICJIdWUiLAotCQkgICAgIC5taW5pbXVtID0gMCwKLQkJICAgICAubWF4aW11bSA9IDEwMDAwLAotCQkgICAgIC5zdGVwID0gMSwKLQkJICAgICAuZGVmYXVsdF92YWx1ZSA9IDUwMDAsCi0JCSAgICAgLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkgICAgIH0KLX07Ci1zdGF0aWMgY29uc3QgaW50IENYMjU4MjFfQ1RMUyA9IEFSUkFZX1NJWkUoY3gyNTgyMV9jdGxzKTsKLQotc3RhdGljIGludCBjeDI1ODIxX2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKLXsKLQlpbnQgaTsKLQotCWlmIChxY3RybC0+aWQgPCBWNEwyX0NJRF9CQVNFIHx8IHFjdHJsLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWZvciAoaSA9IDA7IGkgPCBDWDI1ODIxX0NUTFM7IGkrKykKLQkJaWYgKGN4MjU4MjFfY3Rsc1tpXS5pZCA9PSBxY3RybC0+aWQpCi0JCQlicmVhazsKLQlpZiAoaSA9PSBDWDI1ODIxX0NUTFMpIHsKLQkJKnFjdHJsID0gbm9fY3RsOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldOwotCXJldHVybiAwOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkgICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCi17Ci0JcmV0dXJuIGN4MjU4MjFfY3RybF9xdWVyeShxY3RybCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogVklERU8gQ1RSTCBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmxfYnlfaWQodW5zaWduZWQgaW50IGlkKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKQotCQlpZiAoY3gyNTgyMV9jdGxzW2ldLmlkID09IGlkKQotCQkJcmV0dXJuIGN4MjU4MjFfY3RscyArIGk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0KLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmw7Ci0KLQljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKLQotCWlmIChOVUxMID09IGN0cmwpCi0JCXJldHVybiAtRUlOVkFMOwotCXN3aXRjaCAoY3RsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9icmlnaHQ7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSFVFOgotCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2h1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX3NhdHVyYXRpb247Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfc2V0X2NvbnRyb2woc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwsIGludCBjaGFuX251bSkKLXsKLQlpbnQgZXJyOwotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKLQotCWVyciA9IC1FSU5WQUw7Ci0KLQljdHJsID0gY3RybF9ieV9pZChjdGwtPmlkKTsKLQotCWlmIChOVUxMID09IGN0cmwpCi0JCXJldHVybiBlcnI7Ci0KLQlzd2l0Y2ggKGN0cmwtPnR5cGUpIHsKLQljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46Ci0JY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgotCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKLQkJaWYgKGN0bC0+dmFsdWUgPCBjdHJsLT5taW5pbXVtKQotCQkJY3RsLT52YWx1ZSA9IGN0cmwtPm1pbmltdW07Ci0JCWlmIChjdGwtPnZhbHVlID4gY3RybC0+bWF4aW11bSkKLQkJCWN0bC0+dmFsdWUgPSBjdHJsLT5tYXhpbXVtOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBub3RoaW5nICovIDsKLQl9Ci0KLQlzd2l0Y2ggKGN0bC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9icmlnaHQgPSBjdGwtPnZhbHVlOwotCQltZWR1c2Ffc2V0X2JyaWdodG5lc3MoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfSFVFOgotCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfaHVlID0gY3RsLT52YWx1ZTsKLQkJbWVkdXNhX3NldF9odWUoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7Ci0JCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX3NhdHVyYXRpb24gPSBjdGwtPnZhbHVlOwotCQltZWR1c2Ffc2V0X3NhdHVyYXRpb24oZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7Ci0JCWJyZWFrOwotCX0KLQotCWVyciA9IDA7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBjeDI1ODIxX2luaXRfY29udHJvbHMoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjaGFuX251bSkKLXsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IENYMjU4MjFfQ1RMUzsgaSsrKSB7Ci0JCWN0cmwuaWQgPSBjeDI1ODIxX2N0bHNbaV0uaWQ7Ci0JCWN0cmwudmFsdWUgPSBjeDI1ODIxX2N0bHNbaV0uZGVmYXVsdF92YWx1ZTsKLQotCQljeDI1ODIxX3NldF9jb250cm9sKGRldiwgJmN0cmwsIGNoYW5fbnVtKTsKLQl9Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotCi0JaWYgKGNyb3BjYXAtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQljcm9wY2FwLT5ib3VuZHMudG9wID0gY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKLQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTc2IDogNDgwOwotCWNyb3BjYXAtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9Ci0JCWRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU5IDogMTA7Ci0JY3JvcGNhcC0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPQotCQlkZXYtPnR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcgPyA1NCA6IDExOwotCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBjeDI1ODIxX3ZpZGlvY19zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCi17Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotCWludCBlcnI7Ci0KLQlpZiAoZmgpIHsKLQkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAotCQkJCSAgICAgIGZoLT5wcmlvKTsKLQkJaWYgKDAgIT0gZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKLXsKLQkvKiBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZCAqLwotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICogbm9ybSkKLXsKLQkvKiBtZWR1c2EgZG9lcyBub3Qgc3VwcG9ydCB2aWRlbyBzdGFuZGFyZCBzZW5zaW5nIG9mIGN1cnJlbnQgaW5wdXQgKi8KLQkqbm9ybSA9IENYMjU4MjFfTk9STVM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgodTMyIHdpZHRoLCB2NGwyX3N0ZF9pZCB0dm5vcm0pCi17Ci0JaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcpIHsKLQkJaWYgKHdpZHRoID09IDM1MiB8fCB3aWR0aCA9PSA3MjApCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHR2bm9ybSA9PSBWNEwyX1NURF9OVFNDX00pIHsKLQkJaWYgKHdpZHRoID09IDMyMCB8fCB3aWR0aCA9PSAzNTIgfHwgd2lkdGggPT0gNzIwKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KHUzMiBoZWlnaHQsIHY0bDJfc3RkX2lkIHR2bm9ybSkKLXsKLQlpZiAodHZub3JtID09IFY0TDJfU1REX1BBTF9CRykgewotCQlpZiAoaGVpZ2h0ID09IDU3NiB8fCBoZWlnaHQgPT0gMjg4KQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQotCWlmICh0dm5vcm0gPT0gVjRMMl9TVERfTlRTQ19NKSB7Ci0JCWlmIChoZWlnaHQgPT0gNDgwIHx8IGhlaWdodCA9PSAyNDApCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLQlpbnQgY29tbWFuZCA9IDA7Ci0Jc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKLQotCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKLQotCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKLQkJcHJfZXJyKCIlcygpOiBVcHN0cmVhbSBkYXRhIGlzIElOVkFMSUQuIFJldHVybmluZ1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlpZiAoY29tbWFuZCAhPSBVUFNUUkVBTV9TVEFSVF9WSURFTyAmJiBjb21tYW5kICE9IFVQU1RSRUFNX1NUT1BfVklERU8pCi0JCXJldHVybiAwOwotCi0JZGV2LT5pbnB1dF9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT52aWRfc3RkbmFtZSA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKLQlkZXYtPnBpeGVsX2Zvcm1hdCA9IGRhdGFfZnJvbV91c2VyLT5waXhlbF9mb3JtYXQ7Ci0JZGV2LT5jaGFubmVsX3NlbGVjdCA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKLQlkZXYtPmNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86Ci0JCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0JaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQotCQlyZXR1cm4gMDsKLQotCWRldi0+aW5wdXRfZmlsZW5hbWVfY2gyID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLQlkZXYtPnZpZF9zdGRuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKLQlkZXYtPnBpeGVsX2Zvcm1hdF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCWRldi0+Y2hhbm5lbF9zZWxlY3RfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OwotCWRldi0+Y29tbWFuZF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86Ci0JCWN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gyKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0JaW50IGNvbW1hbmQgPSAwOwotCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7Ci0KLQlpZiAoIWRhdGFfZnJvbV91c2VyKSB7Ci0JCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOwotCi0JaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfQVVESU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX0FVRElPKQotCQlyZXR1cm4gMDsKLQotCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0JZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7Ci0JZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7Ci0JZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgotCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCQlicmVhazsKLQotCWNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKLQkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2aWRlb19pb2N0bF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKLQlpbnQgY29tbWFuZDsKLQlpbnQgd2lkdGggPSA3MjA7Ci0JaW50IHNlbGVjdGVkX2NoYW5uZWwgPSAwLCBwaXhfZm9ybWF0ID0gMCwgaSA9IDA7Ci0JaW50IGNpZl9lbmFibGUgPSAwLCBjaWZfd2lkdGggPSAwOwotCXUzMiB2YWx1ZSA9IDA7Ci0KLQlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKLQotCWlmICghZGF0YV9mcm9tX3VzZXIpIHsKLQkJcHJfZXJyKCIlcygpOiBVc2VyIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKLQotCWlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCi0JICAgJiYgY29tbWFuZCAhPSBFTkFCTEVfQ0lGX1JFU09MVVRJT04gJiYgY29tbWFuZCAhPSBSRUdfUkVBRAotCSAgICYmIGNvbW1hbmQgIT0gUkVHX1dSSVRFICYmIGNvbW1hbmQgIT0gTUVEVVNBX1JFQUQKLQkgICAmJiBjb21tYW5kICE9IE1FRFVTQV9XUklURSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFNFVF9WSURFT19TVEQ6Ci0JCWlmICghc3RyY21wKGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZSwgIlBBTCIpKQotCQkJZGV2LT50dm5vcm0gPSBWNEwyX1NURF9QQUxfQkc7Ci0JCWVsc2UKLQkJCWRldi0+dHZub3JtID0gVjRMMl9TVERfTlRTQ19NOwotCQltZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFVF9QSVhFTF9GT1JNQVQ6Ci0JCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7Ci0JCXBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotCi0JCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7Ci0JCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7Ci0JCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQotCQkJY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKLQkJCQkJCXBpeF9mb3JtYXQpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBFTkFCTEVfQ0lGX1JFU09MVVRJT046Ci0JCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7Ci0JCWNpZl9lbmFibGUgPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3Jlc29sdXRpb25fZW5hYmxlOwotCQljaWZfd2lkdGggPSBkYXRhX2Zyb21fdXNlci0+Y2lmX3dpZHRoOwotCi0JCWlmIChjaWZfZW5hYmxlKSB7Ci0JCQlpZiAoZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfQkcKLQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykgewotCQkJCXdpZHRoID0gMzUyOwotCQkJfSBlbHNlIHsKLQkJCQl3aWR0aCA9IGNpZl93aWR0aDsKLQkJCQlpZiAoY2lmX3dpZHRoICE9IDMyMCAmJiBjaWZfd2lkdGggIT0gMzUyKQotCQkJCQl3aWR0aCA9IDMyMDsKLQkJCX0KLQkJfQotCi0JCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7Ci0JCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7Ci0JCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkgewotCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS4KLQkJCQl1c2VfY2lmX3Jlc29sdXRpb24gPSBjaWZfZW5hYmxlOwotCQkJZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS5jaWZfd2lkdGggPSB3aWR0aDsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkJCWRldi0+Y2hhbm5lbHNbaV0udXNlX2NpZl9yZXNvbHV0aW9uID0KLQkJCQkJY2lmX2VuYWJsZTsKLQkJCQlkZXYtPmNoYW5uZWxzW2ldLmNpZl93aWR0aCA9IHdpZHRoOwotCQkJfQotCQl9Ci0KLQkJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgd2lkdGgsIHNlbGVjdGVkX2NoYW5uZWwpOwotCQlicmVhazsKLQljYXNlIFJFR19SRUFEOgotCQlkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEgPSBjeF9yZWFkKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcyk7Ci0JCWJyZWFrOwotCWNhc2UgUkVHX1dSSVRFOgotCQljeF93cml0ZShkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgTUVEVVNBX1JFQUQ6Ci0JCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCQkgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCQkgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgTUVEVVNBX1dSSVRFOgotCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAotCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50ICByZXQgPSAwOwotCi0Jc3RydWN0IGN4MjU4MjFfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQkvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KLQlpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7Ci0JCXJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKLQkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKLQkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7Ci19Ci0KLS8qIGV4cG9ydGVkIHN0dWZmICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSB2aWRlb19vcGVuLAotCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLnBvbGwgPSB2aWRlb19wb2xsLAotCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotCS5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKLSNlbmRpZgotCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCi0JLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAotCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCi0JLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKLSNpZmRlZiBUVU5FUl9GTEFHCi0JLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIGN4MjU4MjFfdmlkZW9pb2N0bF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICJjeDI1ODIxLXZpZGVvaW9jdGwiLAotCS5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI2MTViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogIERyaXZlciBmb3IgdGhlIENvbmV4YW50IENYMjU4MjEgUENJZSBicmlkZ2UKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IENvbmV4YW50IFN5c3RlbXMgSW5jLgotICogIEF1dGhvcnMgIDxzaHUubGluQGNvbmV4YW50LmNvbT4sIDxoaWVwLmh1eW5oQGNvbmV4YW50LmNvbT4KLSAqICBCYXNlZCBvbiBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+IGN4MjM4ODUgZHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBDWDI1ODIxX0hfCi0jZGVmaW5lIENYMjU4MjFfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL3R2ZWVwcm9tLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZHZiLmg+Ci0KLSNpbmNsdWRlICJidGN4LXJpc2MuaCIKLSNpbmNsdWRlICJjeDI1ODIxLXJlZy5oIgotI2luY2x1ZGUgImN4MjU4MjEtbWVkdXNhLXJlZy5oIgotI2luY2x1ZGUgImN4MjU4MjEtc3JhbS5oIgotI2luY2x1ZGUgImN4MjU4MjEtYXVkaW8uaCIKLSNpbmNsdWRlICJtZWRpYS9jeDIzNDF4LmgiCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2RlZmluZSBDWDI1ODIxX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAxMDYpCi0KLSNkZWZpbmUgVU5TRVQgKC0xVSkKLSNkZWZpbmUgTk9fU1lOQ19MSU5FICgtMVUpCi0KLSNkZWZpbmUgQ1gyNTgyMV9NQVhCT0FSRFMgMgotCi0jZGVmaW5lIFRSVUUgICAgMQotI2RlZmluZSBGQUxTRSAgIDAKLSNkZWZpbmUgTElORV9TSVpFX0QxICAgIDE0NDAKLQotLyogTnVtYmVyIG9mIGRlY29kZXJzIGFuZCBlbmNvZGVycyAqLwotI2RlZmluZSBNQVhfREVDT0RFUlMgICAgICAgICAgICA4Ci0jZGVmaW5lIE1BWF9FTkNPREVSUyAgICAgICAgICAgIDIKLSNkZWZpbmUgUVVBRF9ERUNPREVSUyAgICAgICAgICAgNAotI2RlZmluZSBNQVhfQ0FNRVJBUyAgICAgICAgICAgICAxNgotCi0vKiBNYXggbnVtYmVyIG9mIGlucHV0cyBieSBjYXJkICovCi0jZGVmaW5lIE1BWF9DWDI1ODIxX0lOUFVUIDgKLSNkZWZpbmUgSU5QVVQobnIpICgmY3gyNTgyMV9ib2FyZHNbZGV2LT5ib2FyZF0uaW5wdXRbbnJdKQotI2RlZmluZSBSRVNPVVJDRV9WSURFTzAgICAgICAgMQotI2RlZmluZSBSRVNPVVJDRV9WSURFTzEgICAgICAgMgotI2RlZmluZSBSRVNPVVJDRV9WSURFTzIgICAgICAgNAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzMgICAgICAgOAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzQgICAgICAgMTYKLSNkZWZpbmUgUkVTT1VSQ0VfVklERU81ICAgICAgIDMyCi0jZGVmaW5lIFJFU09VUkNFX1ZJREVPNiAgICAgICA2NAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzcgICAgICAgMTI4Ci0jZGVmaW5lIFJFU09VUkNFX1ZJREVPOCAgICAgICAyNTYKLSNkZWZpbmUgUkVTT1VSQ0VfVklERU85ICAgICAgIDUxMgotI2RlZmluZSBSRVNPVVJDRV9WSURFTzEwICAgICAgMTAyNAotI2RlZmluZSBSRVNPVVJDRV9WSURFTzExICAgICAgMjA0OAotI2RlZmluZSBSRVNPVVJDRV9WSURFT19JT0NUTCAgNDA5NgotCi0jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICAoSFopCS8qIDAuNSBzZWNvbmRzICovCi0KLSNkZWZpbmUgVU5LTk9XTl9CT0FSRCAgICAgICAwCi0jZGVmaW5lIENYMjU4MjFfQk9BUkQgICAgICAgIDEKLQotLyogQ3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi0jZGVmaW5lIENYMjU4MjFfTk9STVMgKFwKLQlWNEwyX1NURF9OVFNDX00gfCAgVjRMMl9TVERfTlRTQ19NX0pQIHwgVjRMMl9TVERfTlRTQ19NX0tSIHwgXAotCVY0TDJfU1REX1BBTF9CRyB8ICBWNEwyX1NURF9QQUxfREsgICAgfCAgVjRMMl9TVERfUEFMX0kgICAgfCBcCi0JVjRMMl9TVERfUEFMX00gIHwgIFY0TDJfU1REX1BBTF9OICAgICB8ICBWNEwyX1NURF9QQUxfSCAgICB8IFwKLQlWNEwyX1NURF9QQUxfTmMpCi0KLSNkZWZpbmUgQ1gyNTgyMV9CT0FSRF9DT05FWEFOVF9BVEhFTkExMCAxCi0jZGVmaW5lIE1BWF9WSURfQ0hBTk5FTF9OVU0gICAgIDEyCi0jZGVmaW5lIFZJRF9DSEFOTkVMX05VTSA4Ci0KLXN0cnVjdCBjeDI1ODIxX2ZtdCB7Ci0JY2hhciAqbmFtZTsKLQl1MzIgZm91cmNjOwkJLyogdjRsMiBmb3JtYXQgaWQgKi8KLQlpbnQgZGVwdGg7Ci0JaW50IGZsYWdzOwotCXUzMiBjeGZvcm1hdDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2N0cmwgewotCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2OwotCXUzMiBvZmY7Ci0JdTMyIHJlZzsKLQl1MzIgbWFzazsKLQl1MzIgc2hpZnQ7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV90dm5vcm0gewotCWNoYXIgKm5hbWU7Ci0JdjRsMl9zdGRfaWQgaWQ7Ci0JdTMyIGN4aWZvcm1hdDsKLQl1MzIgY3hvZm9ybWF0OwotfTsKLQotc3RydWN0IGN4MjU4MjFfZmggewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2OwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOwotCWludCByYWRpbzsKLQl1MzIgcmVzb3VyY2VzOwotCi0JZW51bSB2NGwyX3ByaW9yaXR5IHByaW87Ci0KLQkvKiB2aWRlbyBvdmVybGF5ICovCi0Jc3RydWN0IHY0bDJfd2luZG93IHdpbjsKLQlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwczsKLQl1bnNpZ25lZCBpbnQgbmNsaXBzOwotCi0JLyogdmlkZW8gY2FwdHVyZSAqLwotCXN0cnVjdCBjeDI1ODIxX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OwotCWludCBjaGFubmVsX2lkOwotCi0JLyogdmJpIGNhcHR1cmUgKi8KLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmlkcTsKLQlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgdmJpcTsKLQotCS8qIEgyNjQgRW5jb2RlciBzcGVjaWZpY3MgT05MWSAqLwotCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSBtcGVncTsKLQlhdG9taWNfdCB2NGxfcmVhZGluZzsKLX07Ci0KLWVudW0gY3gyNTgyMV9pdHlwZSB7Ci0JQ1gyNTgyMV9WTVVYX0NPTVBPU0lURSA9IDEsCi0JQ1gyNTgyMV9WTVVYX1NWSURFTywKLQlDWDI1ODIxX1ZNVVhfREVCVUcsCi0JQ1gyNTgyMV9SQURJTywKLX07Ci0KLWVudW0gY3gyNTgyMV9zcmNfc2VsX3R5cGUgewotCUNYMjU4MjFfU1JDX1NFTF9FWFRfNjU2X1ZJREVPID0gMCwKLQlDWDI1ODIxX1NSQ19TRUxfUEFSQUxMRUxfTVBFR19WSURFTwotfTsKLQotLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KLXN0cnVjdCBjeDI1ODIxX2J1ZmZlciB7Ci0JLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLwotCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7Ci0KLQkvKiBjeDI1ODIxIHNwZWNpZmljICovCi0JdW5zaWduZWQgaW50IGJwbDsKLQlzdHJ1Y3QgYnRjeF9yaXNjbWVtIHJpc2M7Ci0Jc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7Ci0JdTMyIGNvdW50OwotfTsKLQotc3RydWN0IGN4MjU4MjFfaW5wdXQgewotCWVudW0gY3gyNTgyMV9pdHlwZSB0eXBlOwotCXVuc2lnbmVkIGludCB2bXV4OwotCXUzMiBncGlvMCwgZ3BpbzEsIGdwaW8yLCBncGlvMzsKLX07Ci0KLWVudW0gcG9ydCB7Ci0JQ1gyNTgyMV9VTkRFRklORUQgPSAwLAotCUNYMjU4MjFfUkFXLAotCUNYMjU4MjFfMjY0Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9ib2FyZCB7Ci0JY2hhciAqbmFtZTsKLQllbnVtIHBvcnQgcG9ydGE7Ci0JZW51bSBwb3J0IHBvcnRiOwotCWVudW0gcG9ydCBwb3J0YzsKLQl1bnNpZ25lZCBpbnQgdHVuZXJfdHlwZTsKLQl1bnNpZ25lZCBpbnQgcmFkaW9fdHlwZTsKLQl1bnNpZ25lZCBjaGFyIHR1bmVyX2FkZHI7Ci0JdW5zaWduZWQgY2hhciByYWRpb19hZGRyOwotCi0JdTMyIGNsa19mcmVxOwotCXN0cnVjdCBjeDI1ODIxX2lucHV0IGlucHV0WzJdOwotfTsKLQotc3RydWN0IGN4MjU4MjFfc3ViaWQgewotCXUxNiBzdWJ2ZW5kb3I7Ci0JdTE2IHN1YmRldmljZTsKLQl1MzIgY2FyZDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2kyYyB7Ci0Jc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7Ci0KLQlpbnQgbnI7Ci0KLQkvKiBpMmMgaS9vICovCi0Jc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOwotCXN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBpMmNfYWxnbzsKLQlzdHJ1Y3QgaTJjX2NsaWVudCBpMmNfY2xpZW50OwotCXUzMiBpMmNfcmM7Ci0KLQkvKiBjeDI1ODIxIHJlZ2lzdGVycyB1c2VkIGZvciByYXcgYWRkZXNzICovCi0JdTMyIGkyY19wZXJpb2Q7Ci0JdTMyIHJlZ19jdHJsOwotCXUzMiByZWdfc3RhdDsKLQl1MzIgcmVnX2FkZHI7Ci0JdTMyIHJlZ19yZGF0YTsKLQl1MzIgcmVnX3dkYXRhOwotfTsKLQotc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgewotCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVkOwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7Ci0Jc3RydWN0IGJ0Y3hfcmlzY21lbSBzdG9wcGVyOwotCXUzMiBjb3VudDsKLX07Ci0KLXN0cnVjdCBjeDI1ODIxX2RhdGEgewotCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2OwotCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9jaGFubmVsIHsKLQlzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHByaW87Ci0KLQlpbnQgY3RsX2JyaWdodDsKLQlpbnQgY3RsX2NvbnRyYXN0OwotCWludCBjdGxfaHVlOwotCWludCBjdGxfc2F0dXJhdGlvbjsKLQlzdHJ1Y3QgY3gyNTgyMV9kYXRhIHRpbWVvdXRfZGF0YTsKLQotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldjsKLQlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSB2aWRxOwotCi0Jc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaGFubmVsczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCWludCByZXNvdXJjZXM7Ci0KLQlpbnQgcGl4ZWxfZm9ybWF0czsKLQlpbnQgdXNlX2NpZl9yZXNvbHV0aW9uOwotCWludCBjaWZfd2lkdGg7Ci19OwotCi1zdHJ1Y3QgY3gyNTgyMV9kZXYgewotCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKLQlhdG9taWNfdCByZWZjb3VudDsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7Ci0KLQkvKiBwY2kgc3R1ZmYgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpOwotCXVuc2lnbmVkIGNoYXIgcGNpX3JldiwgcGNpX2xhdDsKLQlpbnQgcGNpX2J1cywgcGNpX3Nsb3Q7Ci0JdTMyIGJhc2VfaW9fYWRkcjsKLQl1MzIgX19pb21lbSAqbG1taW87Ci0JdTggX19pb21lbSAqYm1taW87Ci0JaW50IHBjaV9pcnFtYXNrOwotCWludCBod3JldmlzaW9uOwotCi0JdTMyIGNsa19mcmVxOwotCi0JLyogSTJDIGFkYXB0ZXJzOiBNYXN0ZXIgMSAmIDIgKEV4dGVybmFsKSAmIE1hc3RlciAzIChJbnRlcm5hbCBvbmx5KSAqLwotCXN0cnVjdCBjeDI1ODIxX2kyYyBpMmNfYnVzWzNdOwotCi0JaW50IG5yOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCi0Jc3RydWN0IGN4MjU4MjFfY2hhbm5lbCBjaGFubmVsc1tNQVhfVklEX0NIQU5ORUxfTlVNXTsKLQotCS8qIGJvYXJkIGRldGFpbHMgKi8KLQl1bnNpZ25lZCBpbnQgYm9hcmQ7Ci0JY2hhciBuYW1lWzMyXTsKLQotCS8qIEFuYWxvZyB2aWRlbyAqLwotCXUzMiByZXNvdXJjZXM7Ci0JdW5zaWduZWQgaW50IGlucHV0OwotCXUzMiB0dmF1ZGlvOwotCXY0bDJfc3RkX2lkIHR2bm9ybTsKLQl1bnNpZ25lZCBpbnQgdHVuZXJfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIHR1bmVyX2FkZHI7Ci0JdW5zaWduZWQgaW50IHJhZGlvX3R5cGU7Ci0JdW5zaWduZWQgY2hhciByYWRpb19hZGRyOwotCXVuc2lnbmVkIGludCBoYXNfcmFkaW87Ci0JdW5zaWduZWQgaW50IHZpZGVjX3R5cGU7Ci0JdW5zaWduZWQgY2hhciB2aWRlY19hZGRyOwotCXVuc2lnbmVkIHNob3J0IF9tYXhfbnVtX2RlY29kZXJzOwotCi0JLyogQW5hbG9nIEF1ZGlvIFVwc3RyZWFtICovCi0JaW50IF9hdWRpb19pc19ydW5uaW5nOwotCWludCBfYXVkaW9waXhlbF9mb3JtYXQ7Ci0JaW50IF9pc19maXJzdF9hdWRpb19mcmFtZTsKLQlpbnQgX2F1ZGlvZmlsZV9zdGF0dXM7Ci0JaW50IF9hdWRpb19saW5lc19jb3VudDsKLQlpbnQgX2F1ZGlvZnJhbWVfY291bnQ7Ci0JaW50IF9hdWRpb191cHN0cmVhbV9jaGFubmVsOwotCWludCBfbGFzdF9pbmRleF9pcnE7ICAgIC8qIFRoZSBsYXN0IGludGVycnVwdCBpbmRleCBwcm9jZXNzZWQuICovCi0KLQlfX2xlMzIgKl9yaXNjX2F1ZGlvX2ptcF9hZGRyOwotCV9fbGUzMiAqX3Jpc2NfdmlydF9zdGFydF9hZGRyOwotCV9fbGUzMiAqX3Jpc2NfdmlydF9hZGRyOwotCWRtYV9hZGRyX3QgX3Jpc2NfcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgX3Jpc2NfcGh5c19zdGFydF9hZGRyOwotCi0JdW5zaWduZWQgaW50IF9hdWRpb3Jpc2Nfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgX2F1ZGlvZGF0YV9idWZfc2l6ZTsKLQlfX2xlMzIgKl9hdWRpb2RhdGFfYnVmX3ZpcnRfYWRkcjsKLQlkbWFfYWRkcl90IF9hdWRpb2RhdGFfYnVmX3BoeXNfYWRkcjsKLQljaGFyICpfYXVkaW9maWxlbmFtZTsKLQotCS8qIFY0bCAqLwotCXUzMiBmcmVxOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiaV9kZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqcmFkaW9fZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmlvY3RsX2RldjsKLQotCXNwaW5sb2NrX3Qgc2xvY2s7Ci0KLQkvKiBWaWRlbyBVcHN0cmVhbSAqLwotCWludCBfbGluZV9zaXplOwotCWludCBfcHJvZ19jbnQ7Ci0JaW50IF9waXhlbF9mb3JtYXQ7Ci0JaW50IF9pc19maXJzdF9mcmFtZTsKLQlpbnQgX2lzX3J1bm5pbmc7Ci0JaW50IF9maWxlX3N0YXR1czsKLQlpbnQgX2xpbmVzX2NvdW50OwotCWludCBfZnJhbWVfY291bnQ7Ci0JaW50IF9jaGFubmVsX3Vwc3RyZWFtX3NlbGVjdDsKLQl1bnNpZ25lZCBpbnQgX3Jpc2Nfc2l6ZTsKLQotCV9fbGUzMiAqX2RtYV92aXJ0X3N0YXJ0X2FkZHI7Ci0JX19sZTMyICpfZG1hX3ZpcnRfYWRkcjsKLQlkbWFfYWRkcl90IF9kbWFfcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX3N0YXJ0X2FkZHI7Ci0KLQl1bnNpZ25lZCBpbnQgX2RhdGFfYnVmX3NpemU7Ci0JX19sZTMyICpfZGF0YV9idWZfdmlydF9hZGRyOwotCWRtYV9hZGRyX3QgX2RhdGFfYnVmX3BoeXNfYWRkcjsKLQljaGFyICpfZmlsZW5hbWU7Ci0JY2hhciAqX2RlZmF1bHRuYW1lOwotCi0JaW50IF9saW5lX3NpemVfY2gyOwotCWludCBfcHJvZ19jbnRfY2gyOwotCWludCBfcGl4ZWxfZm9ybWF0X2NoMjsKLQlpbnQgX2lzX2ZpcnN0X2ZyYW1lX2NoMjsKLQlpbnQgX2lzX3J1bm5pbmdfY2gyOwotCWludCBfZmlsZV9zdGF0dXNfY2gyOwotCWludCBfbGluZXNfY291bnRfY2gyOwotCWludCBfZnJhbWVfY291bnRfY2gyOwotCWludCBfY2hhbm5lbDJfdXBzdHJlYW1fc2VsZWN0OwotCXVuc2lnbmVkIGludCBfcmlzY19zaXplX2NoMjsKLQotCV9fbGUzMiAqX2RtYV92aXJ0X3N0YXJ0X2FkZHJfY2gyOwotCV9fbGUzMiAqX2RtYV92aXJ0X2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RtYV9waHlzX3N0YXJ0X2FkZHJfY2gyOwotCi0JdW5zaWduZWQgaW50IF9kYXRhX2J1Zl9zaXplX2NoMjsKLQlfX2xlMzIgKl9kYXRhX2J1Zl92aXJ0X2FkZHJfY2gyOwotCWRtYV9hZGRyX3QgX2RhdGFfYnVmX3BoeXNfYWRkcl9jaDI7Ci0JY2hhciAqX2ZpbGVuYW1lX2NoMjsKLQljaGFyICpfZGVmYXVsdG5hbWVfY2gyOwotCi0JLyogTVBFRyBFbmNvZGVyIE9OTFkgc2V0dGluZ3MgKi8KLQl1MzIgY3gyMzQxN19tYWlsYm94OwotCXN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIG1wZWdfcGFyYW1zOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnY0bF9kZXZpY2U7Ci0JYXRvbWljX3QgdjRsX3JlYWRlcl9jb3VudDsKLQlzdHJ1Y3QgY3gyNTgyMV90dm5vcm0gZW5jb2Rlcm5vcm07Ci0KLQl1MzIgdXBzdHJlYW1fcmlzY2J1Zl9zaXplOwotCXUzMiB1cHN0cmVhbV9kYXRhYnVmX3NpemU7Ci0JdTMyIHVwc3RyZWFtX3Jpc2NidWZfc2l6ZV9jaDI7Ci0JdTMyIHVwc3RyZWFtX2RhdGFidWZfc2l6ZV9jaDI7Ci0JdTMyIGF1ZGlvX3Vwc3RyZWFtX3Jpc2NidWZfc2l6ZTsKLQl1MzIgYXVkaW9fdXBzdHJlYW1fZGF0YWJ1Zl9zaXplOwotCWludCBfaXNOVFNDOwotCWludCBfZnJhbWVfaW5kZXg7Ci0JaW50IF9hdWRpb2ZyYW1lX2luZGV4OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpfaXJxX3F1ZXVlczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgX2lycV93b3JrX2VudHJ5OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpfaXJxX3F1ZXVlc19jaDI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IF9pcnFfd29ya19lbnRyeV9jaDI7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9pcnFfYXVkaW9fcXVldWVzOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBfYXVkaW9fd29ya19lbnRyeTsKLQljaGFyICppbnB1dF9maWxlbmFtZTsKLQljaGFyICppbnB1dF9maWxlbmFtZV9jaDI7Ci0JaW50IF9mcmFtZV9pbmRleF9jaDI7Ci0JaW50IF9pc05UU0NfY2gyOwotCWNoYXIgKnZpZF9zdGRuYW1lX2NoMjsKLQlpbnQgcGl4ZWxfZm9ybWF0X2NoMjsKLQlpbnQgY2hhbm5lbF9zZWxlY3RfY2gyOwotCWludCBjb21tYW5kX2NoMjsKLQljaGFyICppbnB1dF9hdWRpb2ZpbGVuYW1lOwotCWNoYXIgKnZpZF9zdGRuYW1lOwotCWludCBwaXhlbF9mb3JtYXQ7Ci0JaW50IGNoYW5uZWxfc2VsZWN0OwotCWludCBjb21tYW5kOwotCWludCBjaGFubmVsX29wZW5lZDsKLX07Ci0KLXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCB7Ci0JY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0JY2hhciAqdmlkX3N0ZG5hbWU7Ci0JaW50IHBpeGVsX2Zvcm1hdDsKLQlpbnQgY2hhbm5lbF9zZWxlY3Q7Ci0JaW50IGNvbW1hbmQ7Ci19OwotCi1zdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCB7Ci0JY2hhciAqdmlkX3N0ZG5hbWU7Ci0JaW50IHBpeGVsX2Zvcm1hdDsKLQlpbnQgY2lmX3Jlc29sdXRpb25fZW5hYmxlOwotCWludCBjaWZfd2lkdGg7Ci0JaW50IGRlY29kZXJfc2VsZWN0OwotCWludCBjb21tYW5kOwotCWludCByZWdfYWRkcmVzczsKLQlpbnQgcmVnX2RhdGE7Ci19OwotCi1leHRlcm4gc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICp1cF9kYXRhOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjeDI1ODIxX2RldiAqZ2V0X2N4MjU4MjEoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3QgY3gyNTgyMV9kZXYsIHY0bDJfZGV2KTsKLX0KLQotI2RlZmluZSBjeDI1ODIxX2NhbGxfYWxsKGRldiwgbywgZiwgYXJncy4uLikgXAotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBvLCBmLCAjI2FyZ3MpCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGN4MjU4MjFfZGV2bGlzdDsKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggY3gyNTgyMV9kZXZsaXN0X211dGV4OwotCi1leHRlcm4gc3RydWN0IGN4MjU4MjFfYm9hcmQgY3gyNTgyMV9ib2FyZHNbXTsKLWV4dGVybiBzdHJ1Y3QgY3gyNTgyMV9zdWJpZCBjeDI1ODIxX3N1Ymlkc1tdOwotCi0jZGVmaW5lIFNSQU1fQ0gwMCAgMAkJLyogVmlkZW8gQSAqLwotI2RlZmluZSBTUkFNX0NIMDEgIDEJCS8qIFZpZGVvIEIgKi8KLSNkZWZpbmUgU1JBTV9DSDAyICAyCQkvKiBWaWRlbyBDICovCi0jZGVmaW5lIFNSQU1fQ0gwMyAgMwkJLyogVmlkZW8gRCAqLwotI2RlZmluZSBTUkFNX0NIMDQgIDQJCS8qIFZpZGVvIEUgKi8KLSNkZWZpbmUgU1JBTV9DSDA1ICA1CQkvKiBWaWRlbyBGICovCi0jZGVmaW5lIFNSQU1fQ0gwNiAgNgkJLyogVmlkZW8gRyAqLwotI2RlZmluZSBTUkFNX0NIMDcgIDcJCS8qIFZpZGVvIEggKi8KLQotI2RlZmluZSBTUkFNX0NIMDggIDgJCS8qIEF1ZGlvIEEgKi8KLSNkZWZpbmUgU1JBTV9DSDA5ICA5CQkvKiBWaWRlbyBVcHN0cmVhbSBJICovCi0jZGVmaW5lIFNSQU1fQ0gxMCAgMTAJCS8qIFZpZGVvIFVwc3RyZWFtIEogKi8KLSNkZWZpbmUgU1JBTV9DSDExICAxMQkJLyogQXVkaW8gVXBzdHJlYW0gQVVEX0NIQU5ORUxfQiAqLwotCi0jZGVmaW5lIFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSSAgICAgU1JBTV9DSDA5Ci0jZGVmaW5lIFZJRF9VUFNUUkVBTV9TUkFNX0NIQU5ORUxfSiAgICAgU1JBTV9DSDEwCi0jZGVmaW5lIEFVRElPX1VQU1RSRUFNX1NSQU1fQ0hBTk5FTF9CICAgU1JBTV9DSDExCi0jZGVmaW5lIFZJREVPX0lPQ1RMX0NIICAxMQotCi1zdHJ1Y3Qgc3JhbV9jaGFubmVsIHsKLQljaGFyICpuYW1lOwotCXUzMiBpOwotCXUzMiBjbWRzX3N0YXJ0OwotCXUzMiBjdHJsX3N0YXJ0OwotCXUzMiBjZHQ7Ci0JdTMyIGZpZm9fc3RhcnQ7Ci0JdTMyIGZpZm9fc2l6ZTsKLQl1MzIgcHRyMV9yZWc7Ci0JdTMyIHB0cjJfcmVnOwotCXUzMiBjbnQxX3JlZzsKLQl1MzIgY250Ml9yZWc7Ci0JdTMyIGludF9tc2s7Ci0JdTMyIGludF9zdGF0OwotCXUzMiBpbnRfbXN0YXQ7Ci0JdTMyIGRtYV9jdGw7Ci0JdTMyIGdwY250X2N0bDsKLQl1MzIgZ3BjbnQ7Ci0JdTMyIGF1ZF9sZW5ndGg7Ci0JdTMyIGF1ZF9jZmc7Ci0JdTMyIGZsZF9hdWRfZmlmb19lbjsKLQl1MzIgZmxkX2F1ZF9yaXNjX2VuOwotCi0JLyogRm9yIFVwc3RyZWFtIFZpZGVvICovCi0JdTMyIHZpZF9mbXRfY3RsOwotCXUzMiB2aWRfYWN0aXZlX2N0bDE7Ci0JdTMyIHZpZF9hY3RpdmVfY3RsMjsKLQl1MzIgdmlkX2NkdF9zaXplOwotCi0JdTMyIHZpcF9jdGw7Ci0JdTMyIHBpeF9mcm10OwotCXUzMiBqdW1wb25seTsKLQl1MzIgaXJxX2JpdDsKLX07Ci1leHRlcm4gc3RydWN0IHNyYW1fY2hhbm5lbCBjeDI1ODIxX3NyYW1fY2hhbm5lbHNbXTsKLQotI2RlZmluZSBTVEFUVVNfU1VDQ0VTUyAgICAgICAgIDAKLSNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAgICAtMQotCi0jZGVmaW5lIGN4X3JlYWQocmVnKSAgICAgICAgICAgICByZWFkbChkZXYtPmxtbWlvICsgKChyZWcpPj4yKSkKLSNkZWZpbmUgY3hfd3JpdGUocmVnLCB2YWx1ZSkgICAgIHdyaXRlbCgodmFsdWUpLCBkZXYtPmxtbWlvICsgKChyZWcpPj4yKSkKLQotI2RlZmluZSBjeF9hbmRvcihyZWcsIG1hc2ssIHZhbHVlKSBcCi0Jd3JpdGVsKChyZWFkbChkZXYtPmxtbWlvKygocmVnKT4+MikpICYgfihtYXNrKSkgfFwKLQkoKHZhbHVlKSAmIChtYXNrKSksIGRldi0+bG1taW8rKChyZWcpPj4yKSkKLQotI2RlZmluZSBjeF9zZXQocmVnLCBiaXQpICAgICAgICAgIGN4X2FuZG9yKChyZWcpLCAoYml0KSwgKGJpdCkpCi0jZGVmaW5lIGN4X2NsZWFyKHJlZywgYml0KSAgICAgICAgY3hfYW5kb3IoKHJlZyksIChiaXQpLCAwKQotCi0jZGVmaW5lIFNldF9HUElPX0JpdChCaXQpICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBCaXQpCi0jZGVmaW5lIENsZWFyX0dQSU9fQml0KEJpdCkgICAgICAgICAgICAgICAgICAgICAofigxIDw8IEJpdCkpCi0KLSNkZWZpbmUgQ1gyNTgyMV9FUlIoZm10LCBhcmdzLi4uKQkJCVwKLQlwcl9lcnIoIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0jZGVmaW5lIENYMjU4MjFfV0FSTihmbXQsIGFyZ3MuLi4pCQkJXAotCXByX3dhcm4oIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0jZGVmaW5lIENYMjU4MjFfSU5GTyhmbXQsIGFyZ3MuLi4pCQkJXAotCXByX2luZm8oIiglZCk6ICIgZm10LCBkZXYtPmJvYXJkLCAjI2FyZ3MpCi0KLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfcmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfaTJjICpidXMpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9jYXJkX3NldHVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pcl9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfcmVhZChzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cywgdTE2IHJlZ19hZGRyLCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfd3JpdGUoc3RydWN0IGN4MjU4MjFfaTJjICpidXMsIHUxNiByZWdfYWRkciwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9pMmMgKmJ1cyk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX2dwaW9faW5pdChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3NldF9ncGlvcGluX2RpcmVjdGlvbihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICBpbnQgcGluX251bWJlciwgaW50IHBpbl9sb2dpY192YWx1ZSk7Ci0KLWV4dGVybiBpbnQgbWVkdXNhX3ZpZGVvX2luaXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIGludCBtZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgbWVkdXNhX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgd2lkdGgsCi0JCQkJICBpbnQgZGVjb2Rlcl9zZWxlY3QpOwotZXh0ZXJuIGludCBtZWR1c2Ffc2V0X2JyaWdodG5lc3Moc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBicmlnaHRuZXNzLAotCQkJCSBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfY29udHJhc3Qoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIGludCBjb250cmFzdCwKLQkJCSAgICAgICBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfaHVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgaHVlLCBpbnQgZGVjb2Rlcik7Ci1leHRlcm4gaW50IG1lZHVzYV9zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgaW50IHNhdHVyYXRpb24sCi0JCQkJIGludCBkZWNvZGVyKTsKLQotZXh0ZXJuIGludCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3Qgc3JhbV9jaGFubmVsICpjaCwgdW5zaWduZWQgaW50IGJwbCwKLQkJCQkgICAgICB1MzIgcmlzYyk7Ci0KLWV4dGVybiBpbnQgY3gyNTgyMV9yaXNjX2J1ZmZlcihzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAotCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCB0b3Bfb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBib3R0b21fb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBicGwsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHBhZGRpbmcsIHVuc2lnbmVkIGludCBsaW5lcyk7Ci1leHRlcm4gaW50IGN4MjU4MjFfcmlzY19kYXRhYnVmZmVyX2F1ZGlvKHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCQkJCSBzdHJ1Y3QgYnRjeF9yaXNjbWVtICpyaXNjLAotCQkJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCQkJCSB1bnNpZ25lZCBpbnQgYnBsLAotCQkJCQkgdW5zaWduZWQgaW50IGxpbmVzLCB1bnNpZ25lZCBpbnQgbHBpKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfZnJlZV9idWZmZXIoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmKTsKLWV4dGVybiBpbnQgY3gyNTgyMV9yaXNjX3N0b3BwZXIoc3RydWN0IHBjaV9kZXYgKnBjaSwgc3RydWN0IGJ0Y3hfcmlzY21lbSAqcmlzYywKLQkJCQl1MzIgcmVnLCB1MzIgbWFzaywgdTMyIHZhbHVlKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfc3JhbV9jaGFubmVsX2R1bXAoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkJICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcF9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoKTsKLQotZXh0ZXJuIHN0cnVjdCBjeDI1ODIxX2RldiAqY3gyNTgyMV9kZXZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpwY2kpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9wcmludF9pcnFiaXRzKGNoYXIgKm5hbWUsIGNoYXIgKnRhZywgY2hhciAqKnN0cmluZ3MsCi0JCQkJICBpbnQgbGVuLCB1MzIgYml0cywgdTMyIG1hc2spOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gaW50IGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqY2gsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgYnBsLCB1MzIgcmlzYyk7Ci0KLWV4dGVybiBpbnQgY3gyNTgyMV92aWR1cHN0cmVhbV9pbml0X2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJaW50IGNoYW5uZWxfc2VsZWN0LCBpbnQgcGl4ZWxfZm9ybWF0KTsKLWV4dGVybiBpbnQgY3gyNTgyMV92aWR1cHN0cmVhbV9pbml0X2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJaW50IGNoYW5uZWxfc2VsZWN0LCBpbnQgcGl4ZWxfZm9ybWF0KTsKLWV4dGVybiBpbnQgY3gyNTgyMV9hdWRpb191cHN0cmVhbV9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCSAgICAgICBpbnQgY2hhbm5lbF9zZWxlY3QpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9jaDEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9jaDIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9mcmVlX21lbV91cHN0cmVhbV9hdWRpbyhzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QKLQkJCQkJICAgICAqdXBfZGF0YSk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QKLQkJCQkJICAgICAqdXBfZGF0YSk7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICp1cF9kYXRhKTsKLWV4dGVybiB2b2lkIGN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDEoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldik7Ci1leHRlcm4gdm9pZCBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fYXVkaW8oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIGludCBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cF91cHN0cmVhbShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGJwbCwgdTMyIHJpc2MpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHUzMiBmb3JtYXQpOwotZXh0ZXJuIHZvaWQgY3gyNTgyMV92aWRlb2lvY3RsX3VucmVnaXN0ZXIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYpOwotZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UgKmN4MjU4MjFfdmRldl9pbml0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpLAotCQkJCQkgICAgICBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp0ZW1wbGF0ZSwKLQkJCQkJICAgICAgY2hhciAqdHlwZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYwppbmRleCAyNGUwMDljLi45MTFjMGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMTJkYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgYnkgTWFyaW4gTWl0b3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgbWl0b3ZAaXNzcC5iYXMuYmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+Ci0KLSNpbmNsdWRlICJkdDMxNTV2NGwuaCIKLQotI2RlZmluZSBEVDMxNTVfVkVORE9SX0lEIDB4ODA4NgotI2RlZmluZSBEVDMxNTVfREVWSUNFX0lEIDB4MTIyMwotCi0vKiBEVDMxNTVfQ0hVTktfU0laRSBpcyA0TSAoMl4yMikgOCBmdWxsIHNpemUgYnVmZmVycyAqLwotI2RlZmluZSBEVDMxNTVfQ0hVTktfU0laRSAoMVUgPDwgMjIpCi0KLSNkZWZpbmUgRFQzMTU1X0NPSF9GTEFHUyAoR0ZQX0tFUk5FTCB8IEdGUF9ETUEzMiB8IF9fR0ZQX0NPTEQgfCBfX0dGUF9OT1dBUk4pCi0KLSNkZWZpbmUgRFQzMTU1X0JVRl9TSVpFICg3NjggKiA1NzYpCi0KLSNpZmRlZiBDT05GSUdfRFQzMTU1X1NUUkVBTUlORwotI2RlZmluZSBEVDMxNTVfQ0FQVFVSRV9NRVRIT0QgVjRMMl9DQVBfU1RSRUFNSU5HCi0jZWxzZQotI2RlZmluZSBEVDMxNTVfQ0FQVFVSRV9NRVRIT0QgVjRMMl9DQVBfUkVBRFdSSVRFCi0jZW5kaWYKLQotLyogIGdsb2JhbCBpbml0aWFsaXplcnMgKGZvciBhbGwgYm9hcmRzKSAgKi8KLSNpZmRlZiBDT05GSUdfRFQzMTU1X0NDSVIKLXN0YXRpYyBjb25zdCB1OCBjc3IyX2luaXQgPSBWVF81MEhaOwotI2RlZmluZSBEVDMxNTVfQ1VSUkVOVF9OT1JNIFY0TDJfU1REXzYyNV81MAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbWdfd2lkdGggPSA3Njg7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ19oZWlnaHQgPSA1NzY7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lc19wZXJfc2VjID0gMjU7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyBmcmFtZV9zdGRbXSA9IHsKLQl7Ci0JLmluZGV4ID0gMCwKLQkudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkuZmxhZ3MgPSAwLAotCS5kZXNjcmlwdGlvbiA9ICJDQ0lSLzUwSHogOCBiaXRzIGdyYXkiLAotCS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZLAotCX0sCi19OwotI2Vsc2UKLXN0YXRpYyBjb25zdCB1OCBjc3IyX2luaXQgPSBWVF82MEhaOwotI2RlZmluZSBEVDMxNTVfQ1VSUkVOVF9OT1JNIFY0TDJfU1REXzUyNV82MAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbWdfd2lkdGggPSA2NDA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ19oZWlnaHQgPSA0ODA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGZyYW1lc19wZXJfc2VjID0gMzA7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm10ZGVzYyBmcmFtZV9zdGRbXSA9IHsKLQl7Ci0JLmluZGV4ID0gMCwKLQkudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKLQkuZmxhZ3MgPSAwLAotCS5kZXNjcmlwdGlvbiA9ICJSUy0xNzAvNjBIeiA4IGJpdHMgZ3JheSIsCi0JLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVksCi0JfSwKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBOVU1fT0ZfRk9STUFUUyBBUlJBWV9TSVpFKGZyYW1lX3N0ZCkKLQotc3RhdGljIHU4IGNvbmZpZ19pbml0ID0gQUNRX01PREVfRVZFTjsKLQotLyoqCi0gKiByZWFkX2kyY19yZWcgLSByZWFkcyBhbiBpbnRlcm5hbCBpMmMgcmVnaXN0ZXIKLSAqCi0gKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCi0gKiBAaW5kZXg6CWluZGV4IChpbnRlcm5hbCBhZGRyZXNzKSBvZiByZWdpc3RlciB0byByZWFkCi0gKiBAZGF0YToJcG9pbnRlciB0byBieXRlIHRoZSByZWFkIGRhdGEgd2lsbCBiZSBwbGFjZWQgaW4KLSAqCi0gKiByZXR1cm5zOgl6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHJlYWRpbmcgdGhlIHNwZWNpZmllZCAoYnkgaW5kZXgpIHJlZ2lzdGVyCi0gKiBhbmQgYnVzeSB3YWl0cyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLiBUaGUgcmVzdWx0IGlzIHBsYWNlZAotICogaW4gYSBieXRlIHBvaW50ZWQgYnkgZGF0YS4KLSAqLwotc3RhdGljIGludAotcmVhZF9pMmNfcmVnKHZvaWQgX19pb21lbSAqYWRkciwgdTggaW5kZXgsIHU4ICpkYXRhKQotewotCXUzMiB0bXAgPSBpbmRleDsKLQotCWlvd3JpdGUzMigodG1wPDwxNykgfCBJSUNfUkVBRCwgYWRkciArIElJQ19DU1IyKTsKLQltbWlvd2IoKTsKLQl1ZGVsYXkoNDUpOyAvKiB3YWl0IGF0IGxlYXN0IDQzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCXRtcCA9IGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSk7Ci0JaWYgKHRtcCAmIERJUkVDVF9BQk9SVCkgewotCQkvKiByZXNldCBESVJFQ1RfQUJPUlQgYml0ICovCi0JCWlvd3JpdGUzMihESVJFQ1RfQUJPUlQsIGFkZHIgKyBJSUNfQ1NSMSk7Ci0JCXJldHVybiAtRUlPOyAvKiBlcnJvcjogRElSRUNUX0FCT1JUIHNldCAqLwotCX0KLQkqZGF0YSA9IHRtcD4+MjQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogd3JpdGVfaTJjX3JlZyAtIHdyaXRlcyB0byBhbiBpbnRlcm5hbCBpMmMgcmVnaXN0ZXIKLSAqCi0gKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCi0gKiBAaW5kZXg6CWluZGV4IChpbnRlcm5hbCBhZGRyZXNzKSBvZiByZWdpc3RlciB0byByZWFkCi0gKiBAZGF0YToJZGF0YSB0byBiZSB3cml0dGVuCi0gKgotICogcmV0dXJuczoJemVybyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB3cml0dGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKLSAqIGFuZCBidXN5IHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCi0gKi8KLXN0YXRpYyBpbnQKLXdyaXRlX2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggZGF0YSkKLXsKLQl1MzIgdG1wID0gaW5kZXg7Ci0KLQlpb3dyaXRlMzIoKHRtcDw8MTcpIHwgSUlDX1dSSVRFIHwgZGF0YSwgYWRkciArIElJQ19DU1IyKTsKLQltbWlvd2IoKTsKLQl1ZGVsYXkoNjUpOyAvKiB3YWl0IGF0IGxlYXN0IDYzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpICYgRElSRUNUX0FCT1JUKSB7Ci0JCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KLQkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKLQkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCi0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHdyaXRlX2kyY19yZWdfbm93YWl0IC0gd3JpdGVzIHRvIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgotICoKLSAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKLSAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKLSAqIEBkYXRhOglkYXRhIHRvIGJlIHdyaXR0ZW4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB3cml0dGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKLSAqIGFuZCB0aGVuIHJldHVybnMuCi0gKi8KLXN0YXRpYyB2b2lkIHdyaXRlX2kyY19yZWdfbm93YWl0KHZvaWQgX19pb21lbSAqYWRkciwgdTggaW5kZXgsIHU4IGRhdGEpCi17Ci0JdTMyIHRtcCA9IGluZGV4OwotCi0JaW93cml0ZTMyKCh0bXA8PDE3KSB8IElJQ19XUklURSB8IGRhdGEsIGFkZHIgKyBJSUNfQ1NSMik7Ci0JbW1pb3diKCk7Ci19Ci0KLS8qKgotICogd2FpdF9pMmNfcmVnIC0gd2FpdHMgdGhlIHJlYWQvd3JpdGUgdG8gZmluaXNoCi0gKgotICogQGFkZHI6CWR0MzE1NSBtbWlvIGJhc2UgYWRkcmVzcwotICoKLSAqIHJldHVybnM6CXplcm8gb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCi0gKgotICogVGhpcyBmdW5jdGlvbiB3YWl0cyByZWFkaW5nL3dyaXR0aW5nIHRvIGZpbmlzaC4KLSAqLwotc3RhdGljIGludCB3YWl0X2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyKQotewotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQl1ZGVsYXkoNjUpOyAvKiB3YWl0IGF0IGxlYXN0IDYzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQotCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpICYgRElSRUNUX0FCT1JUKSB7Ci0JCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KLQkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKLQkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCi0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfc3RhcnRfYWNxKHN0cnVjdCBkdDMxNTVfcHJpdiAqcGQpCi17Ci0Jc3RydWN0IHZiMl9idWZmZXIgKnZiID0gcGQtPmN1cnJfYnVmOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0KLQlkbWFfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOwotCWlvd3JpdGUzMihkbWFfYWRkciArIGltZ193aWR0aCwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoaW1nX3dpZHRoLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7Ci0JaW93cml0ZTMyKGltZ193aWR0aCwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUUklERSk7Ci0JLyogZW5hYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KLQlpb3dyaXRlMzIoRkxEX1NUQVJUX0VOIHwgRkxEX0VORF9PRERfRU4gfCBGTERfU1RBUlQgfAotCQkJRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIHBkLT5yZWdzICsgSU5UX0NTUik7Ci0JaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8Ci0JCSAgRkxEX0ROX09ERCB8IEZMRF9ETl9FVkVOIHwgQ0FQX0NPTlRfRVZFTiB8IENBUF9DT05UX09ERCwKLQkJCQkJCQlwZC0+cmVncyArIENTUjEpOwotCXdhaXRfaTJjX3JlZyhwZC0+cmVncyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsKLQotCS8qICBzdGFydCB0aGUgYm9hcmQgICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgcGQtPmNzcjIgfCBCVVNZX0VWRU4gfCBCVVNZX09ERCk7Ci0JcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgICovCi19Ci0KLS8qCi0gKglkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzICh2YjJfb3BzKQotICovCi1zdGF0aWMgaW50Ci1kdDMxNTVfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywKLQkJCXVuc2lnbmVkIGludCAqbnVtX3BsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAotCQkJCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwotCXZvaWQgKnJldDsKLQotCWlmICgqbnVtX2J1ZmZlcnMgPT0gMCkKLQkJKm51bV9idWZmZXJzID0gMTsKLQkqbnVtX3BsYW5lcyA9IDE7Ci0Jc2l6ZXNbMF0gPSBpbWdfd2lkdGggKiBpbWdfaGVpZ2h0OwotCWlmIChwZC0+cS0+YWxsb2NfY3R4WzBdKQotCQlyZXR1cm4gMDsKLQlyZXQgPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGQtPnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUihyZXQpKQotCQlyZXR1cm4gUFRSX0VSUihyZXQpOwotCXBkLT5xLT5hbGxvY19jdHhbMF0gPSByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdDMxNTVfd2FpdF9wcmVwYXJlKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7Ci0KLQltdXRleF91bmxvY2socGQtPnZkZXYtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZAotZHQzMTU1X3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7Ci0KLQltdXRleF9sb2NrKHBkLT52ZGV2LT5sb2NrKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKLXsKLQl2YjJfc2V0X3BsYW5lX3BheWxvYWQodmIsIDAsIGltZ193aWR0aCAqIGltZ19oZWlnaHQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHEpOwotCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKLQotCXNwaW5fbG9ja19pcnEoJnBkLT5sb2NrKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnBkLT5kbWFxKSkgewotCQl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJnBkLT5kbWFxLCB0eXBlb2YoKnZiKSwgZG9uZV9lbnRyeSk7Ci0JCWxpc3RfZGVsKCZ2Yi0+ZG9uZV9lbnRyeSk7Ci0JCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcGQtPmxvY2spOwotCW1zbGVlcCg0NSk7IC8qIGlycSBoZW5kbGVyIHdpbGwgc3RvcCB0aGUgaGFyZHdhcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWR0MzE1NV9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwotCi0JLyogIHBkLT5xLT5zdHJlYW1pbmcgPSAxIHdoZW4gZHQzMTU1X2J1Zl9xdWV1ZSgpIGlzIGludm9rZWQgICovCi0Jc3Bpbl9sb2NrX2lycSgmcGQtPmxvY2spOwotCWlmIChwZC0+Y3Vycl9idWYpCi0JCWxpc3RfYWRkX3RhaWwoJnZiLT5kb25lX2VudHJ5LCAmcGQtPmRtYXEpOwotCWVsc2UgewotCQlwZC0+Y3Vycl9idWYgPSB2YjsKLQkJZHQzMTU1X3N0YXJ0X2FjcShwZCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcGQtPmxvY2spOwotfQotLyoKLSAqCWVuZCBkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzCi0gKi8KLQotY29uc3Qgc3RydWN0IHZiMl9vcHMgcV9vcHMgPSB7Ci0JLnF1ZXVlX3NldHVwID0gZHQzMTU1X3F1ZXVlX3NldHVwLAotCS53YWl0X3ByZXBhcmUgPSBkdDMxNTVfd2FpdF9wcmVwYXJlLAotCS53YWl0X2ZpbmlzaCA9IGR0MzE1NV93YWl0X2ZpbmlzaCwKLQkuYnVmX3ByZXBhcmUgPSBkdDMxNTVfYnVmX3ByZXBhcmUsCi0JLnN0YXJ0X3N0cmVhbWluZyA9IGR0MzE1NV9zdGFydF9zdHJlYW1pbmcsCi0JLnN0b3Bfc3RyZWFtaW5nID0gZHQzMTU1X3N0b3Bfc3RyZWFtaW5nLAotCS5idWZfcXVldWUgPSBkdDMxNTVfYnVmX3F1ZXVlLAotfTsKLQotc3RhdGljIGlycXJldHVybl90Ci1kdDMxNTVfaXJxX2hhbmRsZXJfZXZlbihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICppcGQgPSBkZXZfaWQ7Ci0Jc3RydWN0IHZiMl9idWZmZXIgKml2YjsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCXUzMiB0bXA7Ci0KLQl0bXAgPSBpb3JlYWQzMihpcGQtPnJlZ3MgKyBJTlRfQ1NSKSAmIChGTERfU1RBUlQgfCBGTERfRU5EX09ERCk7Ci0JaWYgKCF0bXApCi0JCXJldHVybiBJUlFfTk9ORTsgIC8qIG5vdCBvdXIgaXJxICovCi0JaWYgKCh0bXAgJiBGTERfU1RBUlQpICYmICEodG1wICYgRkxEX0VORF9PREQpKSB7Ci0JCWlvd3JpdGUzMihGTERfU1RBUlRfRU4gfCBGTERfRU5EX09ERF9FTiB8IEZMRF9TVEFSVCwKLQkJCQkJCQlpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQkJaXBkLT5maWVsZF9jb3VudCsrOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IC8qIHN0YXJ0IG9mIGZpZWxkIGlycSAqLwotCX0KLQlpZiAoKHRtcCAmIEZMRF9TVEFSVCkgJiYgKHRtcCAmIEZMRF9FTkRfT0REKSkKLQkJaXBkLT5zdGF0cy5zdGFydF9iZWZvcmVfZW5kKys7Ci0JLyoJY2hlY2sgZm9yIGNvcnJ1cHRlZCBmaWVsZHMgICAgICovCi0vKgl3cml0ZV9pMmNfcmVnKGlwZC0+cmVncywgRVZFTl9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsJKi8KLS8qCXdyaXRlX2kyY19yZWcoaXBkLT5yZWdzLCBPRERfQ1NSLCBDU1JfRVJST1IgfCBDU1JfRE9ORSk7CSovCi0JdG1wID0gaW9yZWFkMzIoaXBkLT5yZWdzICsgQ1NSMSkgJiAoRkxEX0NSUFRfRVZFTiB8IEZMRF9DUlBUX09ERCk7Ci0JaWYgKHRtcCkgewotCQlpcGQtPnN0YXRzLmNvcnJ1cHRlZF9maWVsZHMrKzsKLQkJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8Ci0JCQkJCQlGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4gfAotCQkJCQkJQ0FQX0NPTlRfRVZFTiB8IENBUF9DT05UX09ERCwKLQkJCQkJCQlpcGQtPnJlZ3MgKyBDU1IxKTsKLQkJbW1pb3diKCk7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZpcGQtPmxvY2spOwotCWlmIChpcGQtPmN1cnJfYnVmKSB7Ci0JCWRvX2dldHRpbWVvZmRheSgmaXBkLT5jdXJyX2J1Zi0+djRsMl9idWYudGltZXN0YW1wKTsKLQkJaXBkLT5jdXJyX2J1Zi0+djRsMl9idWYuc2VxdWVuY2UgPSAoaXBkLT5maWVsZF9jb3VudCkgPj4gMTsKLQkJdmIyX2J1ZmZlcl9kb25lKGlwZC0+Y3Vycl9idWYsIFZCMl9CVUZfU1RBVEVfRE9ORSk7Ci0JfQotCi0JaWYgKCFpcGQtPnEtPnN0cmVhbWluZyB8fCBsaXN0X2VtcHR5KCZpcGQtPmRtYXEpKQotCQlnb3RvIHN0b3BfZG1hOwotCWl2YiA9IGxpc3RfZmlyc3RfZW50cnkoJmlwZC0+ZG1hcSwgdHlwZW9mKCppdmIpLCBkb25lX2VudHJ5KTsKLQlsaXN0X2RlbCgmaXZiLT5kb25lX2VudHJ5KTsKLQlpcGQtPmN1cnJfYnVmID0gaXZiOwotCWRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoaXZiLCAwKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIsIGlwZC0+cmVncyArIEVWRU5fRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoZG1hX2FkZHIgKyBpbWdfd2lkdGgsIGlwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOwotCWlvd3JpdGUzMihpbWdfd2lkdGgsIGlwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7Ci0JaW93cml0ZTMyKGltZ193aWR0aCwgaXBkLT5yZWdzICsgT0REX0RNQV9TVFJJREUpOwotCW1taW93YigpOwotCS8qIGVuYWJsZSBpbnRlcnJ1cHRzLCBjbGVhciBhbGwgaXJxIGZsYWdzICovCi0JaW93cml0ZTMyKEZMRF9TVEFSVF9FTiB8IEZMRF9FTkRfT0REX0VOIHwgRkxEX1NUQVJUIHwKLQkJCUZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELCBpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQlzcGluX3VubG9jaygmaXBkLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLXN0b3BfZG1hOgotCWlwZC0+Y3Vycl9idWYgPSBOVUxMOwotCS8qIHN0b3AgdGhlIGJvYXJkICovCi0Jd3JpdGVfaTJjX3JlZ19ub3dhaXQoaXBkLT5yZWdzLCBDU1IyLCBpcGQtPmNzcjIpOwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCB8IEZMRF9DUlBUX09ERCB8IEZMRF9DUlBUX0VWRU4gfAotCQkgIEZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiwgaXBkLT5yZWdzICsgQ1NSMSk7Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCBjbGVhciBhbGwgaXJxIGZsYWdzICovCi0JaW93cml0ZTMyKEZMRF9TVEFSVCB8IEZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELCBpcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQlzcGluX3VubG9jaygmaXBkLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JaWYgKCFwZC0+dXNlcnMpIHsKLQkJcGQtPnEgPSBremFsbG9jKHNpemVvZigqcGQtPnEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwZC0+cSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2FsbG9jX3F1ZXVlOwotCQl9Ci0JCXBkLT5xLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlwZC0+cS0+aW9fbW9kZXMgPSBWQjJfUkVBRCB8IFZCMl9NTUFQOwotCQlwZC0+cS0+b3BzID0gJnFfb3BzOwotCQlwZC0+cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7Ci0JCXBkLT5xLT5kcnZfcHJpdiA9IHBkOwotCQlwZC0+Y3Vycl9idWYgPSBOVUxMOwotCQlwZC0+ZmllbGRfY291bnQgPSAwOwotCQl2YjJfcXVldWVfaW5pdChwZC0+cSk7IC8qIGNhbm5vdCBmYWlsICovCi0JCUlOSVRfTElTVF9IRUFEKCZwZC0+ZG1hcSk7Ci0JCXNwaW5fbG9ja19pbml0KCZwZC0+bG9jayk7Ci0JCS8qIGRpc2FibGUgYWxsIGlycXMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KLQkJaW93cml0ZTMyKEZMRF9TVEFSVCB8IEZMRF9FTkRfRVZFTiB8IEZMRF9FTkRfT0RELAotCQkJCQkJcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKLQkJcmV0ID0gcmVxdWVzdF9pcnEocGQtPnBkZXYtPmlycSwgZHQzMTU1X2lycV9oYW5kbGVyX2V2ZW4sCi0JCQkJCQlJUlFGX1NIQVJFRCwgRFQzMTU1X05BTUUsIHBkKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwotCX0KLQlwZC0+dXNlcnMrKzsKLQlyZXR1cm4gMDsgLyogc3VjY2VzcyAqLwotZXJyX3JlcXVlc3RfaXJxOgotCWtmcmVlKHBkLT5xKTsKLQlwZC0+cSA9IE5VTEw7Ci1lcnJfYWxsb2NfcXVldWU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlwZC0+dXNlcnMtLTsKLQlCVUdfT04ocGQtPnVzZXJzIDwgMCk7Ci0JaWYgKCFwZC0+dXNlcnMpIHsKLQkJdmIyX3F1ZXVlX3JlbGVhc2UocGQtPnEpOwotCQlmcmVlX2lycShwZC0+cGRldi0+aXJxLCBwZCk7Ci0JCWlmIChwZC0+cS0+YWxsb2NfY3R4WzBdKQotCQkJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgocGQtPnEtPmFsbG9jX2N0eFswXSk7Ci0JCWtmcmVlKHBkLT5xKTsKLQkJcGQtPnEgPSBOVUxMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWR0MzE1NV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdXNlciwgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKLXsKLQlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKLQotCXJldHVybiB2YjJfcmVhZChwZC0+cSwgdXNlciwgc2l6ZSwgbG9mZiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kdDMxNTVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwb2xsdGJsKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9wb2xsKHBkLT5xLCBmaWxwLCBwb2xsdGJsKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9tbWFwKHBkLT5xLCB2bWEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGR0MzE1NV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gZHQzMTU1X29wZW4sCi0JLnJlbGVhc2UgPSBkdDMxNTVfcmVsZWFzZSwKLQkucmVhZCA9IGR0MzE1NV9yZWFkLAotCS5wb2xsID0gZHQzMTU1X3BvbGwsCi0JLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLCAvKiBWNEwyIGlvY3RsIGhhbmRsZXIgKi8KLQkubW1hcCA9IGR0MzE1NV9tbWFwLAotfTsKLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlyZXR1cm4gdmIyX3N0cmVhbW9uKHBkLT5xLCB0eXBlKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9zdHJlYW1vZmYocGQtPnEsIHR5cGUpOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsIERUMzE1NV9OQU1FKTsKLQlzdHJjcHkoY2FwLT5jYXJkLCBEVDMxNTVfTkFNRSAiIGZyYW1lIGdyYWJiZXIiKTsKLQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShwZC0+cGRldikpOwotCWNhcC0+dmVyc2lvbiA9Ci0JICAgICAgIEtFUk5FTF9WRVJTSU9OKERUMzE1NV9WRVJfTUFKLCBEVDMxNTVfVkVSX01JTiwgRFQzMTU1X1ZFUl9FWFQpOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJRFQzMTU1X0NBUFRVUkVfTUVUSE9EOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCi17Ci0JaWYgKGYtPmluZGV4ID49IE5VTV9PRl9GT1JNQVRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqZiA9IGZyYW1lX3N0ZFtmLT5pbmRleF07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZi0+Zm10LnBpeC53aWR0aCA9IGltZ193aWR0aDsKLQlmLT5mbXQucGl4LmhlaWdodCA9IGltZ19oZWlnaHQ7Ci0JZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOwotCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSBmLT5mbXQucGl4LndpZHRoOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC53aWR0aCAqIGYtPmZtdC5waXguaGVpZ2h0OwotCWYtPmZtdC5waXguY29sb3JzcGFjZSA9IDA7Ci0JZi0+Zm10LnBpeC5wcml2ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChmLT5mbXQucGl4LndpZHRoID09IGltZ193aWR0aCAmJgotCQlmLT5mbXQucGl4LmhlaWdodCA9PSBpbWdfaGVpZ2h0ICYmCi0JCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0dSRVkgJiYKLQkJZi0+Zm10LnBpeC5maWVsZCA9PSBWNEwyX0ZJRUxEX05PTkUgJiYKLQkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPT0gZi0+Zm10LnBpeC53aWR0aCAmJgotCQlmLT5mbXQucGl4LnNpemVpbWFnZSA9PSBmLT5mbXQucGl4LndpZHRoICogZi0+Zm10LnBpeC5oZWlnaHQpCi0JCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlyZXR1cm4gZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwKGZpbHAsIHAsIGYpOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9yZXFidWZzKHBkLT5xLCBiKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9xdWVyeWJ1ZihwZC0+cSwgYik7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9xYnVmKHBkLT5xLCBiKTsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKQotewotCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JcmV0dXJuIHZiMl9kcWJ1ZihwZC0+cSwgYiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3F1ZXJ5c3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB2NGwyX3N0ZF9pZCAqbm9ybSkKLXsKLQkqbm9ybSA9IERUMzE1NV9DVVJSRU5UX05PUk07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZ19zdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHY0bDJfc3RkX2lkICpub3JtKQotewotCSpub3JtID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdjRsMl9zdGRfaWQgKm5vcm0pCi17Ci0JaWYgKCpub3JtICYgRFQzMTU1X0NVUlJFTlRfTk9STSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWR0MzE1NV9pb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQotewotCWlmIChpbnB1dC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCXN0cmNweShpbnB1dC0+bmFtZSwgIkNvYXggaW4iKTsKLQlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JLyoKLQkgKiBGSVhNRTogaW5wdXQtPnN0ZCA9IDAgYWNjb3JkaW5nIHRvIHY0bDIgQVBJCi0JICogVklESU9DX0dfU1RELCBWSURJT0NfU19TVEQsIFZJRElPQ19RVUVSWVNURCBhbmQgVklESU9DX0VOVU1TVEQKLQkgKiBzaG91bGQgcmV0dXJuIC1FSU5WQUwKLQkgKi8KLQlpbnB1dC0+c3RkID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKLQlpbnB1dC0+c3RhdHVzID0gMDsvKiBGSVhNRTogYWRkIHN5bmMgZGV0ZWN0aW9uICYgVjRMMl9JTl9TVF9OT19IX0xPQ0sgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1kdDMxNTVfaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHVuc2lnbmVkIGludCBpKQotewotCWlmIChpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCWlmIChwYXJtcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxMDAxOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnJhbWVzX3Blcl9zZWMgKiAxMDAwOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gMTsgLyogRklYTUU6IDIgYnVmZmVycz8gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZHQzMTU1X2lvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCWlmIChwYXJtcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxMDAxOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0gZnJhbWVzX3Blcl9zZWMgKiAxMDAwOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gMTsgLyogRklYTUU6IDIgYnVmZmVycz8gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBkdDMxNTVfaW9jdGxfb3BzID0gewotCS52aWRpb2Nfc3RyZWFtb24gPSBkdDMxNTVfaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmID0gZHQzMTU1X2lvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19xdWVyeWNhcCA9IGR0MzE1NV9pb2NfcXVlcnljYXAsCi0vKgotCS52aWRpb2NfZ19wcmlvcml0eSA9IGR0MzE1NV9pb2NfZ19wcmlvcml0eSwKLQkudmlkaW9jX3NfcHJpb3JpdHkgPSBkdDMxNTVfaW9jX3NfcHJpb3JpdHksCi0qLwotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2NfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXAgPSBkdDMxNTVfaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19yZXFidWZzID0gZHQzMTU1X2lvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgPSBkdDMxNTVfaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IGR0MzE1NV9pb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmID0gZHQzMTU1X2lvY19kcWJ1ZiwKLQkudmlkaW9jX3F1ZXJ5c3RkID0gZHQzMTU1X2lvY19xdWVyeXN0ZCwKLQkudmlkaW9jX2dfc3RkID0gZHQzMTU1X2lvY19nX3N0ZCwKLQkudmlkaW9jX3Nfc3RkID0gZHQzMTU1X2lvY19zX3N0ZCwKLQkudmlkaW9jX2VudW1faW5wdXQgPSBkdDMxNTVfaW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0ID0gZHQzMTU1X2lvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCA9IGR0MzE1NV9pb2Nfc19pbnB1dCwKLS8qCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBkdDMxNTVfaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybCA9IGR0MzE1NV9pb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsID0gZHQzMTU1X2lvY19zX2N0cmwsCi0JLnZpZGlvY19xdWVyeW1lbnUgPSBkdDMxNTVfaW9jX3F1ZXJ5bWVudSwKLQkudmlkaW9jX2dfZXh0X2N0cmxzID0gZHQzMTU1X2lvY19nX2V4dF9jdHJscywKLQkudmlkaW9jX3NfZXh0X2N0cmxzID0gZHQzMTU1X2lvY19zX2V4dF9jdHJscywKLSovCi0JLnZpZGlvY19nX3Bhcm0gPSBkdDMxNTVfaW9jX2dfcGFybSwKLQkudmlkaW9jX3NfcGFybSA9IGR0MzE1NV9pb2Nfc19wYXJtLAotLyoKLQkudmlkaW9jX2Nyb3BjYXAgPSBkdDMxNTVfaW9jX2Nyb3BjYXAsCi0JLnZpZGlvY19nX2Nyb3AgPSBkdDMxNTVfaW9jX2dfY3JvcCwKLQkudmlkaW9jX3NfY3JvcCA9IGR0MzE1NV9pb2Nfc19jcm9wLAotCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gZHQzMTU1X2lvY19lbnVtX2ZyYW1lc2l6ZXMsCi0JLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gZHQzMTU1X2lvY19lbnVtX2ZyYW1laW50ZXJ2YWxzLAotKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1kdDMxNTVfaW5pdF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgKmJ1Zl9jcHU7Ci0JZG1hX2FkZHJfdCBidWZfZG1hOwotCWludCBpOwotCXU4IHRtcDsKLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOyAvKiBkdDMxNTUgbmVlZHMgaXQgKi8KLQotCS8qICByZXNldHRpbmcgdGhlIGFkYXB0ZXIgICovCi0JaW93cml0ZTMyKEZMRF9DUlBUX09ERCB8IEZMRF9DUlBUX0VWRU4gfCBGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4sCi0JCQkJCQkJcGQtPnJlZ3MgKyBDU1IxKTsKLQltbWlvd2IoKTsKLQltc2xlZXAoMjApOwotCi0JLyogIGluaXRpYWxpemluZyBhZGFwZXIgcmVnaXN0ZXJzICAqLwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCwgcGQtPnJlZ3MgKyBDU1IxKTsKLQltbWlvd2IoKTsKLQlpb3dyaXRlMzIoMHhFRUVFRUUwMSwgcGQtPnJlZ3MgKyBFVkVOX1BJWEVMX0ZNVCk7Ci0JaW93cml0ZTMyKDB4RUVFRUVFMDEsIHBkLT5yZWdzICsgT0REX1BJWEVMX0ZNVCk7Ci0JaW93cml0ZTMyKDB4MDAwMDAwMjAsIHBkLT5yZWdzICsgRklGT19UUklHRVIpOwotCWlvd3JpdGUzMigweDAwMDAwMTAzLCBwZC0+cmVncyArIFhGRVJfTU9ERSk7Ci0JaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgUkVUUllfV0FJVF9DTlQpOwotCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIElOVF9DU1IpOwotCWlvd3JpdGUzMigxLCBwZC0+cmVncyArIEVWRU5fRkxEX01BU0spOwotCWlvd3JpdGUzMigxLCBwZC0+cmVncyArIE9ERF9GTERfTUFTSyk7Ci0JaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgTUFTS19MRU5HVEgpOwotCWlvd3JpdGUzMigweDAwMDUwMDdDLCBwZC0+cmVncyArIEZJRk9fRkxBR19DTlQpOwotCWlvd3JpdGUzMigweDAxMDEwMTAxLCBwZC0+cmVncyArIElJQ19DTEtfRFVSKTsKLQltbWlvd2IoKTsKLQotCS8qIHZlcmlmeWluZyB0aGF0IHdlIGhhdmUgYSBEVDMxNTUgYm9hcmQgKG5vdCBqdXN0IGEgU0FBNzExNiBjaGlwKSAqLwotCXJlYWRfaTJjX3JlZyhwZC0+cmVncywgRFRfSUQsICZ0bXApOwotCWlmICh0bXAgIT0gRFQzMTU1X0lEKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIGluaXRpYWxpemUgQUQgTFVUICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9MVVQsIGkpOwotCi0JLyogaW5pdGlhbGl6ZSBBREMgcmVmZXJlbmNlcyAqLwotCS8qIEZJWE1FOiBwb3NfcmVmICYgbmVnX3JlZiBkZXBlbmQgb24gVlRfNTBIWiAqLwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0FERFIsIEFEX0NNRF9SRUcpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0NNRCwgVklERU9fQ05MXzEgfCBTWU5DX0NOTF8xIHwgU1lOQ19MVkxfMyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfUE9TX1JFRik7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCAzNCk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfTkVHX1JFRik7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCAwKTsKLQotCS8qIGluaXRpYWxpemUgUE0gTFVUICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnIHwgUE1fTFVUX1BHTSk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIFBNX0xVVF9BRERSLCBpKTsKLQkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0RBVEEsIGkpOwotCX0KLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcgfCBQTV9MVVRfUEdNIHwgUE1fTFVUX1NFTCk7Ci0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIFBNX0xVVF9BRERSLCBpKTsKLQkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0RBVEEsIGkpOwotCX0KLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOyAvKiAgQUNRX01PREVfRVZFTiAgKi8KLQotCS8qIHNlbGVjdCBjaGFuZWwgMSBmb3IgaW5wdXQgYW5kIHNldCBzeW5jIGxldmVsICovCi0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfQ01EX1JFRyk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCBWSURFT19DTkxfMSB8IFNZTkNfQ05MXzEgfCBTWU5DX0xWTF8zKTsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSwgYW5kIGluaXRpYWxpemUgdGhlIERNQSBtYWNoaW5lICovCi0JYnVmX2NwdSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQlVGX1NJWkUsICZidWZfZG1hLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1Zl9jcHUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlvd3JpdGUzMihidWZfZG1hLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoYnVmX2RtYSwgcGQtPnJlZ3MgKyBPRERfRE1BX1NUQVJUKTsKLQlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBFVkVOX0RNQV9TVFJJREUpOwotCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIE9ERF9ETUFfU1RSSURFKTsKLQotCS8qICBQZXJmb3JtIGEgcHNldWRvIGV2ZW4gZmllbGQgYWNxdWlyZSAgICAqLwotCWlvd3JpdGUzMihGSUZPX0VOIHwgU1JTVCB8IENBUF9DT05UX09ERCwgcGQtPnJlZ3MgKyBDU1IxKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMiB8IFNZTkNfU05UTCk7Ci0Jd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ09ORklHLCBwZC0+Y29uZmlnKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX1NOR0wpOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyIHwgQlVTWV9FVkVOIHwgU1lOQ19TTlRMKTsKLQltc2xlZXAoMTAwKTsKLQlyZWFkX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsICZ0bXApOwotCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfRVJST1IgfCBDU1JfU05HTCB8IENTUl9ET05FKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBPRERfQ1NSLCBDU1JfRVJST1IgfCBDU1JfU05HTCB8IENTUl9ET05FKTsKLQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMik7Ci0JaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0ROX0VWRU4gfCBGTERfRE5fT0RELCBwZC0+cmVncyArIENTUjEpOwotCi0JLyogIGRlYWxsb2NhdGUgbWVtb3J5ICAqLwotCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9CVUZfU0laRSwgYnVmX2NwdSwgYnVmX2RtYSk7Ci0JaWYgKHRtcCAmIEJVU1lfRVZFTikKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGR0MzE1NV92ZGV2ID0gewotCS5uYW1lID0gRFQzMTU1X05BTUUsCi0JLmZvcHMgPSAmZHQzMTU1X2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZkdDMxNTVfaW9jdGxfb3BzLAotCS5taW5vciA9IC0xLAotCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCi0JLnR2bm9ybXMgPSBEVDMxNTVfQ1VSUkVOVF9OT1JNLAotCS5jdXJyZW50X25vcm0gPSBEVDMxNTVfQ1VSUkVOVF9OT1JNLAotfTsKLQotLyogc2FtZSBhcyBpbiBkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMgKi8KLXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtIHsKLQl2b2lkCQkqdmlydF9iYXNlOwotCWRtYV9hZGRyX3QJZGV2aWNlX2Jhc2U7Ci0JaW50CQlzaXplOwotCWludAkJZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkqYml0bWFwOwotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQKLWR0MzE1NV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbTsKLQlkbWFfYWRkcl90IGRldl9iYXNlOwotCWludCBwYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKLQlpbnQgYml0bWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKHBhZ2VzKSAqIHNpemVvZihsb25nKTsKLQotCWlmICgoZmxhZ3MgJiBETUFfTUVNT1JZX01BUCkgPT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKCFzaXplKQotCQlnb3RvIG91dDsKLQlpZiAoZGV2LT5kbWFfbWVtKQotCQlnb3RvIG91dDsKLQotCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKCptZW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1lbSkKLQkJZ290byBvdXQ7Ci0JbWVtLT52aXJ0X2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCAmZGV2X2Jhc2UsCi0JCQkJCQkJRFQzMTU1X0NPSF9GTEFHUyk7Ci0JaWYgKCFtZW0tPnZpcnRfYmFzZSkKLQkJZ290byBlcnJfYWxsb2NfY29oZXJlbnQ7Ci0JbWVtLT5iaXRtYXAgPSBremFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1lbS0+Yml0bWFwKQotCQlnb3RvIGVycl9iaXRtYXA7Ci0KLQkvKiBjb2hlcmVudF9kbWFfbWFzayBpcyBhbHJlYWR5IHNldCB0byAzMiBiaXRzICovCi0JbWVtLT5kZXZpY2VfYmFzZSA9IGRldl9iYXNlOwotCW1lbS0+c2l6ZSA9IHBhZ2VzOwotCW1lbS0+ZmxhZ3MgPSBmbGFnczsKLQlkZXYtPmRtYV9tZW0gPSBtZW07Ci0JcmV0dXJuIERNQV9NRU1PUllfTUFQOwotCi1lcnJfYml0bWFwOgotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgbWVtLT52aXJ0X2Jhc2UsIGRldl9iYXNlKTsKLWVycl9hbGxvY19jb2hlcmVudDoKLQlrZnJlZShtZW0pOwotb3V0OgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWR0MzE1NV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2LT5kbWFfbWVtOwotCi0JaWYgKCFtZW0pCi0JCXJldHVybjsKLQlkZXYtPmRtYV9tZW0gPSBOVUxMOwotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgbWVtLT5zaXplIDw8IFBBR0VfU0hJRlQsCi0JCQkJCW1lbS0+dmlydF9iYXNlLCBtZW0tPmRldmljZV9iYXNlKTsKLQlrZnJlZShtZW0tPmJpdG1hcCk7Ci0Ja2ZyZWUobWVtKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQKLWR0MzE1NV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZDsKLQotCWVyciA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQllcnIgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcGQgPSBremFsbG9jKHNpemVvZigqcGQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwZC0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmICghcGQtPnZkZXYpCi0JCWdvdG8gZXJyX3ZpZGVvX2RldmljZV9hbGxvYzsKLQkqcGQtPnZkZXYgPSBkdDMxNTVfdmRldjsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcGQpOyAgICAvKiBmb3IgdXNlIGluIGR0MzE1NV9yZW1vdmUoKSAqLwotCXZpZGVvX3NldF9kcnZkYXRhKHBkLT52ZGV2LCBwZCk7ICAvKiBmb3IgdXNlIGluIHZpZGVvX2ZvcHMgKi8KLQlwZC0+dXNlcnMgPSAwOwotCXBkLT5wZGV2ID0gcGRldjsKLQlJTklUX0xJU1RfSEVBRCgmcGQtPmRtYXEpOwotCW11dGV4X2luaXQoJnBkLT5tdXgpOwotCXBkLT52ZGV2LT5sb2NrID0gJnBkLT5tdXg7IC8qIGZvciBsb2NraW5nIHY0bDJfZmlsZV9vcGVyYXRpb25zICovCi0Jc3Bpbl9sb2NrX2luaXQoJnBkLT5sb2NrKTsKLQlwZC0+Y3NyMiA9IGNzcjJfaW5pdDsKLQlwZC0+Y29uZmlnID0gY29uZmlnX2luaXQ7Ci0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZW5hYmxlX2RldjsKLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgcGNpX25hbWUocGRldikpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcV9yZWdpb247Ci0JcGQtPnJlZ3MgPSBwY2lfaW9tYXAocGRldiwgMCwgcGNpX3Jlc291cmNlX2xlbihwZC0+cGRldiwgMCkpOwotCWlmICghcGQtPnJlZ3MpCi0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3BjaV9pb21hcDsKLQllcnIgPSBkdDMxNTVfaW5pdF9ib2FyZChwZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9pbml0X2JvYXJkOwotCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZShwZC0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2luaXRfYm9hcmQ7Ci0JaWYgKGR0MzE1NV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQ0hVTktfU0laRSwKLQkJCQkJCQlETUFfTUVNT1JZX01BUCkpCi0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcmVhbGxvY2F0ZWQgOCBidWZmZXJzXG4iKTsKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiL2Rldi92aWRlbyVpIGlzIHJlYWR5XG4iLCBwZC0+dmRldi0+bWlub3IpOwotCXJldHVybiAwOyAgLyogICBzdWNjZXNzICAgKi8KLQotZXJyX2luaXRfYm9hcmQ6Ci0JcGNpX2lvdW5tYXAocGRldiwgcGQtPnJlZ3MpOwotZXJyX3BjaV9pb21hcDoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7Ci1lcnJfcmVxX3JlZ2lvbjoKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci1lcnJfZW5hYmxlX2RldjoKLQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZC0+dmRldik7Ci1lcnJfdmlkZW9fZGV2aWNlX2FsbG9jOgotCWtmcmVlKHBkKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWR0MzE1NV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWR0MzE1NV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2KTsKLQlwY2lfaW91bm1hcChwZGV2LCBwZC0+cmVncyk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQkvKgotCSAqIHZpZGVvX2RldmljZV9yZWxlYXNlKCkgaXMgaW52b2tlZCBhdXRvbWF0aWNhbGx5Ci0JICogc2VlOiBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGR0MzE1NV92ZGV2Ci0JICovCi0Ja2ZyZWUocGQpOwotfQotCi1zdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocGNpX2lkcykgPSB7Ci0JeyBQQ0lfREVWSUNFKERUMzE1NV9WRU5ET1JfSUQsIERUMzE1NV9ERVZJQ0VfSUQpIH0sCi0JeyAwLCAvKiB6ZXJvIG1hcmtzIHRoZSBlbmQgKi8gfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2lfZHJpdmVyID0gewotCS5uYW1lID0gRFQzMTU1X05BTUUsCi0JLmlkX3RhYmxlID0gcGNpX2lkcywKLQkucHJvYmUgPSBkdDMxNTVfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGR0MzE1NV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQKLWR0MzE1NV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0Ci1kdDMxNTVfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChkdDMxNTVfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZHQzMTU1X2V4aXRfbW9kdWxlKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJ2aWRlbzRsaW51eCBwY2ktZHJpdmVyIGZvciBkdDMxNTUgZnJhbWUgZ3JhYmJlciIpOwotTU9EVUxFX0FVVEhPUigiTWFyaW4gTWl0b3YgPG1pdG92QGlzc3AuYmFzLmJnPiIpOwotTU9EVUxFX1ZFUlNJT04oRFQzMTU1X1ZFUlNJT04pOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9pbnRlbF9pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvaW50ZWxfaTJjLmMKaW5kZXggZTMzNDMyZC4uNTFjYmY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9pbnRlbF9pMmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ludGVsX2kyYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInBzYl9kcnYuaCIKICNpbmNsdWRlICJwc2JfaW50ZWxfcmVnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21kZmxkX2RzaV9vdXRwdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCmluZGV4IDkwNTBjMGYuLjNmOTc5ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfZHNpX291dHB1dC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KICNpbmNsdWRlICJtZGZsZF9kc2lfcGtnX3NlbmRlci5oIgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjZGVmaW5lIE1ERkxEX0RTSV9CUklHSFRORVNTX01BWF9MRVZFTCAxMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9tZGZsZF9vdXRwdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfb3V0cHV0LmMKaW5kZXggZWU1NWY4Ny4uZWFiZjUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9tZGZsZF9vdXRwdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21kZmxkX291dHB1dC5jCkBAIC0yNiw2ICsyNiw3IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSAibWRmbGRfZHNpX2RiaS5oIgogI2luY2x1ZGUgIm1kZmxkX2RzaV9kcGkuaCIKICNpbmNsdWRlICJtZGZsZF9kc2lfb3V0cHV0LmgiCkBAIC0xNjcsNCArMTY4LDQgQEAKIAkJZWxzZQogCQkJbWRmbGRfZGJpX2Rzcl9pbml0KGRldik7CiAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWlkX2Jpb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWlkX2Jpb3MuYwppbmRleCA4Y2ZlMzAxLi5lZTNjMDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21pZF9iaW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9taWRfYmlvcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKiAtIENoZWNrIGlvcmVtYXAgZmFpbHVyZXMKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgPGRybS9kcm0uaD4KICNpbmNsdWRlICJwc2JfZHJtLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21yc3RfaGRtaV9pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCmluZGV4IDM1MWI5ZDguLjM2ZTdlZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9oZG1pX2kyYy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJwc2JfZHJ2LmgiCiAKICNkZWZpbmUgSERNSV9SRUFEKHJlZykJCXJlYWRsKGhkbWlfZGV2LT5yZWdzICsgKHJlZykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCmluZGV4IGRjNjc2YzIuLjk4NmEwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhY3BpL3ZpZGVvLmg+CiAKIHN0YXRpYyBpbnQgZHJtX3BzYl90cmFwX3BhZ2VmYXVsdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKaW5kZXggZTA3MWMxMi4uMGY1NWNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodl90aW1lc291cmNlLm8KIG9iai0kKENPTkZJR19IWVBFUlZfU1RPUkFHRSkJKz0gaHZfc3RvcnZzYy5vCiBvYmotJChDT05GSUdfSFlQRVJWX05FVCkJKz0gaHZfbmV0dnNjLm8KIG9iai0kKENPTkZJR19IWVBFUlZfTU9VU0UpCSs9IGh2X21vdXNlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl90aW1lc291cmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfdGltZXNvdXJjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBmOWFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl90aW1lc291cmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIEEgY2xvY2tzb3VyY2UgZm9yIExpbnV4IHJ1bm5pbmcgb24gSHlwZXJWLgotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE5vdmVsbCwgSW5jLgotICogQXV0aG9yIDogSy4gWS4gU3Jpbml2YXNhbiA8a3NyaW5pdmFzYW5Abm92ZWxsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICovCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+Ci0jaW5jbHVkZSA8YXNtL21zaHlwZXJ2Lmg+Ci0jaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KLQotI2RlZmluZSBIVl9DTE9DS19TSElGVAkyMgotCi1zdGF0aWMgY3ljbGVfdCByZWFkX2h2X2Nsb2NrKHN0cnVjdCBjbG9ja3NvdXJjZSAqYXJnKQotewotCWN5Y2xlX3QgY3VycmVudF90aWNrOwotCS8qCi0JICogUmVhZCB0aGUgcGFydGl0aW9uIGNvdW50ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IHRpY2sgY291bnQuIFRoaXMgY291bnQKLQkgKiBpcyBzZXQgdG8gMCB3aGVuIHRoZSBwYXJ0aXRpb24gaXMgY3JlYXRlZCBhbmQgaXMgaW5jcmVtZW50ZWQgaW4KLQkgKiAxMDAgbmFub3NlY29uZCB1bml0cy4KLQkgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKLQlyZXR1cm4gY3VycmVudF90aWNrOwotfQotCi1zdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGh5cGVydl9jcyA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaHlwZXJ2X2Nsb2Nrc291cmNlIiwKLQkucmF0aW5nICAgICAgICAgPSA0MDAsIC8qIHVzZSB0aGlzIHdoZW4gcnVubmluZyBvbiBIeXBlcnYqLwotCS5yZWFkICAgICAgICAgICA9IHJlYWRfaHZfY2xvY2ssCi0JLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLyoKLQkgKiBUaGUgdGltZSByZWYgY291bnRlciBpbiBIeXBlclYgaXMgaW4gMTAwbnMgdW5pdHMuCi0JICogVGhlIGRlZmluaXRpb24gb2YgbXVsdCBpczoKLQkgKiBtdWx0LzJec2hpZnQgPSBucy9jeWMgPSAxMDAKLQkgKiBtdWx0ID0gKDEwMCA8PCBzaGlmdCkKLQkgKi8KLQkubXVsdCAgICAgICAgICAgPSAoMTAwIDw8IEhWX0NMT0NLX1NISUZUKSwKLQkuc2hpZnQgICAgICAgICAgPSBIVl9DTE9DS19TSElGVCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdAotaHZfdGltZXNvdXJjZV9kbWlfdGFibGVbXSBfX21heWJlX3VudXNlZCAgPSB7Ci0JewotCQkuaWRlbnQgPSAiSHlwZXItViIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTWljcm9zb2Z0IENvcnBvcmF0aW9uIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZpcnR1YWwgTWFjaGluZSIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVmlydHVhbCBNYWNoaW5lIiksCi0JCX0sCi0JfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIGh2X3RpbWVzb3VyY2VfZG1pX3RhYmxlKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGNvbnN0Ci1odl90aW1lc291cmNlX3BjaV90YWJsZVtdIF9fbWF5YmVfdW51c2VkID0gewotCXsgUENJX0RFVklDRSgweDE0MTQsIDB4NTM1MykgfSwgLyogVkdBIGNvbXBhdGlibGUgY29udHJvbGxlciAqLwotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGh2X3RpbWVzb3VyY2VfcGNpX3RhYmxlKTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2h2X2Nsb2Nrc291cmNlKHZvaWQpCi17Ci0JaWYgKCh4ODZfaHlwZXIgIT0gJng4Nl9oeXBlcl9tc19oeXBlcnYpIHx8Ci0JCSEobXNfaHlwZXJ2LmZlYXR1cmVzICYgSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVF9BVkFJTEFCTEUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghZG1pX2NoZWNrX3N5c3RlbShodl90aW1lc291cmNlX2RtaV90YWJsZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJfaW5mbygiUmVnaXN0ZXJpbmcgSHlwZXJWIGNsb2NrIHNvdXJjZVxuIik7Ci0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZoeXBlcnZfY3MpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X2h2X2Nsb2Nrc291cmNlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSHlwZXJWIGJhc2VkIGNsb2Nrc291cmNlIik7Ci1NT0RVTEVfQVVUSE9SKCJLLiBZLiBTcmluaXZhc2FuIDxrc3Jpbml2YXNhbkBub3ZlbGwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCmluZGV4IGRiZDg4MzIuLjAwMTZlZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9yaW5nLmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYwppbmRleCBmNDQ4MjU4Li5iY2U1MDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwppbmRleCA4MzhkMzAxLi4xZmRmZTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfcmluZy5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMKaW5kZXggNTAxNjVmOS4uMjRiY2I4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMKaW5kZXggMDg1NTFiYi4uNmZkM2Q4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCmluZGV4IDU1YjY2MWMuLjZlNTQyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF90cmlnZ2VyLmMKQEAgLTEsNiArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCmluZGV4IGJiNjYzNjQuLmQxN2UzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYwppbmRleCA4ZGY4YTk3Li5jNWQ4MmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfdHJpZ2dlci5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYwppbmRleCAzNGYxZTdlLi5iOTA3Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMKaW5kZXggMTNmMWQxNC4uOGUwY2U1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggNWM1NDJkZC4uODk1MjdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzkzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwppbmRleCBhODMxYjkyLi45OTlmOGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2ODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCmluZGV4IDQ4Mzg5ZTEuLjk3NGM2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYwppbmRleCAzOGNmM2Y0Li5mZjFiNWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYwpAQCAtNiw2ICs2LDcgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYwppbmRleCA2NzljMTUxLi41MmE5ZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYwpAQCAtMSwzICsxLDQgQEAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwppbmRleCAyZjJiMjE2Li44Mjk5Y2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMKaW5kZXggZjBiMzZkMi4uZWRhZDBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9idWZmZXIuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwppbmRleCBjMzY4MjQ1Li5mZDg4NmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jCmluZGV4IGJmOTkxNTMuLjViZjAwMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3RyaWdnZXIuYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IDZkZDVkN2QuLjlkZjBjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAtIEFsdGVybmF0aXZlIGFjY2VzcyB0ZWNobmlxdWVzPwogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwppbmRleCA5OWFkZTY1Li4wMGZhMmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTUsNiArNSw3IEBACiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKaW5kZXggMzkyZGZlMy4uYjY1NjljNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKaW5kZXggNTk4ZmNiMy4uNWNjNDJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmgKQEAgLTExNSw4ICsxMTUsNyBAQAogCiBpcnFyZXR1cm5fdCBpaW9fdHJpZ2dlcl9nZW5lcmljX2RhdGFfcmR5X3BvbGwoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSk7CiAKLXN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIoY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK19fcHJpbnRmKDEsIDIpIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIoY29uc3QgY2hhciAqZm10LCAuLi4pOwogdm9pZCBpaW9fZnJlZV90cmlnZ2VyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKICNlbmRpZiAvKiBfSUlPX1RSSUdHRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCmluZGV4IGMzMDNkODUuLmZmOWFhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jCmluZGV4IDY5ZGFhMTQuLjIyYmQyOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Rydl9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9md19pcGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9hdWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKaW5kZXggNjFkYjFmOS4uOGU3Mzk4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2F1ZGlvLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJhdWRpby5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVjYWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorbWVudWNvbmZpZyBTVEFHSU5HX01FRElBCisgICAgICAgIGJvb2wgIk1lZGlhIHN0YWdpbmcgZHJpdmVycyIKKyAgICAgICAgZGVmYXVsdCBuCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhIG51bWJlciBvZiBtZWRpYSBkcml2ZXJzIHRoYXQKKwkgIGRvbid0IGhhdmUgdGhlICJub3JtYWwiIExpbnV4IGtlcm5lbCBxdWFsaXR5IGxldmVsLgorCSAgTW9zdCBvZiB0aGVtIGRvbid0IGZvbGxvdyBwcm9wZXJseSB0aGUgVjRMLCBEVkIgYW5kL29yIFJDIEFQSSdzLAorCSAgc28sIHRoZXkgd29uJ3QgbGlrZWx5IHdvcmsgZmluZSB3aXRoIHRoZSBleGlzdGluZyBhcHBsaWNhdGlvbnMuCisJICBUaGF0IGFsc28gbWVhbnMgdGhhdCwgb25lIGZpeGVkLCB0aGVpciBBUEkncyB3aWxsIGNoYW5nZSB0byBtYXRjaAorCSAgdGhlIGV4aXN0aW5nIG9uZXMuCisKKyAgICAgICAgICBJZiB5b3Ugd2lzaCB0byB3b3JrIG9uIHRoZXNlIGRyaXZlcnMsIHRvIGhlbHAgaW1wcm92ZSB0aGVtLCBvcgorICAgICAgICAgIHRvIHJlcG9ydCBwcm9ibGVtcyB5b3UgaGF2ZSB3aXRoIHRoZW0sIHBsZWFzZSB1c2UgdGhlCisJICBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcgbWFpbGluZyBsaXN0LgorCisgICAgICAgICAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCisKKworaWYgU1RBR0lOR19NRURJQQorCisjIFBsZWFzZSBrZWVwIHRoZW0gaW4gYWxwaGFiZXRpYyBvcmRlcgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvS2NvbmZpZyIKKworIyBLZWVwIExJUkMgYXQgdGhlIGVuZCwgYXMgaXQgaGFzIHN1Yi1tZW51cworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9LY29uZmlnIgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTEyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACitvYmotJChDT05GSUdfRFZCX0FTMTAyKQkJKz0gYXMxMDIvCitvYmotJChDT05GSUdfRFZCX0NYRDIwOTkpCSs9IGN4ZDIwOTkvCitvYmotJChDT05GSUdfRUFTWUNBUCkJCSs9IGVhc3ljYXAvCitvYmotJChDT05GSUdfTElSQ19TVEFHSU5HKQkrPSBsaXJjLworb2JqLSQoQ09ORklHX1NPTE82WDEwKQkJKz0gc29sbzZ4MTAvCitvYmotJChDT05GSUdfVklERU9fRFQzMTU1KQkrPSBkdDMxNTV2NGwvCitvYmotJChDT05GSUdfVklERU9fR083MDA3KQkrPSBnbzcwMDcvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjUwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBEVkJfQVMxMDIKKwl0cmlzdGF0ZSAiQWJpbGlzIEFTMTAyIERWQiByZWNlaXZlciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFVTQiAmJiBJMkMgJiYgSU5QVVQKKwloZWxwCisJICBDaG9vc2UgWSBvciBNIGhlcmUgaWYgeW91IGhhdmUgYSBkZXZpY2UgY29udGFpbmluZyBhbiBBUzEwMgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYmI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK2R2Yi1hczEwMi1vYmpzIDo9IGFzMTAyX2Rydi5vIGFzMTAyX2Z3Lm8gYXMxMHhfY21kLm8gYXMxMHhfY21kX3N0cmVhbS5vIFwKKwkJYXMxMDJfZmUubyBhczEwMl91c2JfZHJ2Lm8gYXMxMHhfY21kX2NmZy5vCisKK29iai0kKENPTkZJR19EVkJfQVMxMDIpICs9IGR2Yi1hczEwMi5vCisKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19BUzEwMl9VU0IgLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzVjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBoZWFkZXIgZmlsZSBmb3IgVXNiIGRldmljZSBkcml2ZXIqLworI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTAyX2Z3LmgiCisjaW5jbHVkZSAiZHZiZGV2LmgiCisKK2ludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZGVidWdnaW5nIChkZWZhdWx0OiBvZmYpIik7CisKK2ludCBkdWFsX3R1bmVyOworbW9kdWxlX3BhcmFtX25hbWVkKGR1YWxfdHVuZXIsIGR1YWxfdHVuZXIsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1YWxfdHVuZXIsICJBY3RpdmF0ZSBEdWFsLVR1bmVyIGNvbmZpZyAoZGVmYXVsdDogb2ZmKSIpOworCitzdGF0aWMgaW50IGZ3X3VwbG9hZCA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndfdXBsb2FkLCBmd191cGxvYWQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZ3X3VwbG9hZCwgIlR1cm4gb24vb2ZmIGRlZmF1bHQgRlcgdXBsb2FkIChkZWZhdWx0OiBvbikiKTsKKworc3RhdGljIGludCBwaWRfZmlsdGVyaW5nOworbW9kdWxlX3BhcmFtX25hbWVkKHBpZF9maWx0ZXJpbmcsIHBpZF9maWx0ZXJpbmcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBpZF9maWx0ZXJpbmcsICJBY3RpdmF0ZSBIVyBQSUQgZmlsdGVyaW5nIChkZWZhdWx0OiBvZmYpIik7CisKK3N0YXRpYyBpbnQgdHNfYXV0b19kaXNhYmxlOworbW9kdWxlX3BhcmFtX25hbWVkKHRzX2F1dG9fZGlzYWJsZSwgdHNfYXV0b19kaXNhYmxlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0c19hdXRvX2Rpc2FibGUsICJTdHJlYW0gQXV0byBFbmFibGUgb24gRlcgKGRlZmF1bHQ6IG9mZikiKTsKKworaW50IGVsbmFfZW5hYmxlID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChlbG5hX2VuYWJsZSwgZWxuYV9lbmFibGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVsbmFfZW5hYmxlLCAiQWN0aXZhdGUgZUxOQSAoZGVmYXVsdDogb24pIik7CisKKyNpZmRlZiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUgorRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisjZW5kaWYKKworc3RhdGljIHZvaWQgYXMxMDJfc3RvcF9zdHJlYW0oc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpCit7CisJc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwOworCisJaWYgKGRldiAhPSBOVUxMKQorCQlidXNfYWRhcCA9ICZkZXYtPmJ1c19hZGFwOworCWVsc2UKKwkJcmV0dXJuOworCisJaWYgKGJ1c19hZGFwLT5vcHMtPnN0b3Bfc3RyZWFtICE9IE5VTEwpCisJCWJ1c19hZGFwLT5vcHMtPnN0b3Bfc3RyZWFtKGRldik7CisKKwlpZiAodHNfYXV0b19kaXNhYmxlKSB7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCQlyZXR1cm47CisKKwkJaWYgKGFzMTB4X2NtZF9zdG9wX3N0cmVhbWluZyhidXNfYWRhcCkgPCAwKQorCQkJZHByaW50ayhkZWJ1ZywgImFzMTB4X2NtZF9zdG9wX3N0cmVhbWluZyBmYWlsZWRcbiIpOworCisJCW11dGV4X3VubG9jaygmZGV2LT5idXNfYWRhcC5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfc3RhcnRfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KQoreworCXN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcDsKKwlpbnQgcmV0ID0gLUVGQVVMVDsKKworCWlmIChkZXYgIT0gTlVMTCkKKwkJYnVzX2FkYXAgPSAmZGV2LT5idXNfYWRhcDsKKwllbHNlCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnVzX2FkYXAtPm9wcy0+c3RhcnRfc3RyZWFtICE9IE5VTEwpCisJCXJldCA9IGJ1c19hZGFwLT5vcHMtPnN0YXJ0X3N0cmVhbShkZXYpOworCisJaWYgKHRzX2F1dG9fZGlzYWJsZSkgeworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1c19hZGFwLmxvY2spKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gYXMxMHhfY21kX3N0YXJ0X3N0cmVhbWluZyhidXNfYWRhcCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMHhfcGlkX2ZpbHRlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldiwKKwkJCSAgICBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikgeworCisJc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwID0gJmRldi0+YnVzX2FkYXA7CisJaW50IHJldCA9IC1FRkFVTFQ7CisKKwlFTlRFUigpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5idXNfYWRhcC5sb2NrKSkgeworCQlkcHJpbnRrKGRlYnVnLCAibXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGxvY2spIGZhaWxlZCAhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzd2l0Y2ggKG9ub2ZmKSB7CisJY2FzZSAwOgorCSAgICByZXQgPSBhczEweF9jbWRfZGVsX1BJRF9maWx0ZXIoYnVzX2FkYXAsICh1aW50MTZfdCkgcGlkKTsKKwkgICAgZHByaW50ayhkZWJ1ZywgIkRFTF9QSURfRklMVEVSKFslMDJkXSAweCUwNHgpIHJldCA9ICVkXG4iLAorCQkgICAgaW5kZXgsIHBpZCwgcmV0KTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCXsKKwkgICAgc3RydWN0IGFzMTB4X3RzX2ZpbHRlciBmaWx0ZXI7CisKKwkgICAgZmlsdGVyLnR5cGUgPSBUU19QSURfVFlQRV9UUzsKKwkgICAgZmlsdGVyLmlkeCA9IDB4RkY7CisJICAgIGZpbHRlci5waWQgPSBwaWQ7CisKKwkgICAgcmV0ID0gYXMxMHhfY21kX2FkZF9QSURfZmlsdGVyKGJ1c19hZGFwLCAmZmlsdGVyKTsKKwkgICAgZHByaW50ayhkZWJ1ZywgIkFERF9QSURfRklMVEVSKFslMDJkIC0+ICUwMmRdLCAweCUwNHgpIHJldCA9ICVkXG4iLAorCQkgICAgaW5kZXgsIGZpbHRlci5pZHgsIGZpbHRlci5waWQsIHJldCk7CisJICAgIGJyZWFrOworCX0KKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZHZiX2RteF9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGR2YmRteGZlZWQtPmRlbXV4OworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2ID0gZGVtdXgtPnByaXY7CisKKwlFTlRFUigpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYXMxMDJfZGV2LT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKHBpZF9maWx0ZXJpbmcpIHsKKwkJYXMxMHhfcGlkX2ZpbHRlcihhczEwMl9kZXYsCisJCQkJZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgMSk7CisJfQorCisJaWYgKGFzMTAyX2Rldi0+c3RyZWFtaW5nKysgPT0gMCkKKwkJcmV0ID0gYXMxMDJfc3RhcnRfc3RyZWFtKGFzMTAyX2Rldik7CisKKwltdXRleF91bmxvY2soJmFzMTAyX2Rldi0+c2VtKTsKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZHZiX2RteF9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CisJc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXYgPSBkZW11eC0+cHJpdjsKKworCUVOVEVSKCk7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhczEwMl9kZXYtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoLS1hczEwMl9kZXYtPnN0cmVhbWluZyA9PSAwKQorCQlhczEwMl9zdG9wX3N0cmVhbShhczEwMl9kZXYpOworCisJaWYgKHBpZF9maWx0ZXJpbmcpIHsKKwkJYXMxMHhfcGlkX2ZpbHRlcihhczEwMl9kZXYsCisJCQkJZHZiZG14ZmVlZC0+aW5kZXgsIGR2YmRteGZlZWQtPnBpZCwgMCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhczEwMl9kZXYtPnNlbSk7CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFzMTAyX2R2Yl9yZWdpc3RlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmFzMTAyX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlFTlRFUigpOworCisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmFzMTAyX2Rldi0+ZHZiX2FkYXAsCisJCQkJICAgYXMxMDJfZGV2LT5uYW1lLAorCQkJCSAgIFRISVNfTU9EVUxFLAorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKwkJCQkgICAmYXMxMDJfZGV2LT5idXNfYWRhcC51c2JfZGV2LT5kZXYKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwkJCQkgICAmYXMxMDJfZGV2LT5idXNfYWRhcC5zcGlfZGV2LT5kZXYKKyNlbHNlCisjZXJyb3IgPj4+IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyIDw8PAorI2VuZGlmCisjaWZkZWYgRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIKKwkJCQkgICAsIGFkYXB0ZXJfbnIKKyNlbmRpZgorCQkJCSAgICk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCIlczogZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwKKwkJICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlhczEwMl9kZXYtPmR2Yl9kbXgucHJpdiA9IGFzMTAyX2RldjsKKwlhczEwMl9kZXYtPmR2Yl9kbXguZmlsdGVybnVtID0gcGlkX2ZpbHRlcmluZyA/IDE2IDogMjU2OworCWFzMTAyX2Rldi0+ZHZiX2RteC5mZWVkbnVtID0gMjU2OworCWFzMTAyX2Rldi0+ZHZiX2RteC5zdGFydF9mZWVkID0gYXMxMDJfZHZiX2RteF9zdGFydF9mZWVkOworCWFzMTAyX2Rldi0+ZHZiX2RteC5zdG9wX2ZlZWQgPSBhczEwMl9kdmJfZG14X3N0b3BfZmVlZDsKKworCWFzMTAyX2Rldi0+ZHZiX2RteC5kbXguY2FwYWJpbGl0aWVzID0gRE1YX1RTX0ZJTFRFUklORyB8CisJCQkJCSAgICAgIERNWF9TRUNUSU9OX0ZJTFRFUklORzsKKworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5maWx0ZXJudW0gPSBhczEwMl9kZXYtPmR2Yl9kbXguZmlsdGVybnVtOworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5kZW11eCA9ICZhczEwMl9kZXYtPmR2Yl9kbXguZG14OworCWFzMTAyX2Rldi0+ZHZiX2RteGRldi5jYXBhYmlsaXRpZXMgPSAwOworCisJcmV0ID0gZHZiX2RteF9pbml0KCZhczEwMl9kZXYtPmR2Yl9kbXgpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiJXM6IGR2Yl9kbXhfaW5pdCgpIGZhaWxlZCAoZXJybm8gPSAlZCkiLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJcmV0ID0gZHZiX2RteGRldl9pbml0KCZhczEwMl9kZXYtPmR2Yl9kbXhkZXYsICZhczEwMl9kZXYtPmR2Yl9hZGFwKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoIiVzOiBkdmJfZG14ZGV2X2luaXQoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwgX19mdW5jX18sCisJCSAgICByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlyZXQgPSBhczEwMl9kdmJfcmVnaXN0ZXJfZmUoYXMxMDJfZGV2LCAmYXMxMDJfZGV2LT5kdmJfZmUpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiJXM6IGFzMTAyX2R2Yl9yZWdpc3Rlcl9mcm9udGVuZCgpIGZhaWxlZCAoZXJybm8gPSAlZCkiLAorCQkgICAgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIGluaXQgYnVzIG11dGV4IGZvciB0b2tlbiBsb2NraW5nICovCisJbXV0ZXhfaW5pdCgmYXMxMDJfZGV2LT5idXNfYWRhcC5sb2NrKTsKKworCS8qIGluaXQgc3RhcnQgLyBzdG9wIHN0cmVhbSBtdXRleCAqLworCW11dGV4X2luaXQoJmFzMTAyX2Rldi0+c2VtKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUikgfHwgZGVmaW5lZChDT05GSUdfRldfTE9BREVSX01PRFVMRSkKKwkvKgorCSAqIHRyeSB0byBsb2FkIGFzMTAyIGZpcm13YXJlLiBJZiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkLCB3ZSdsbCBiZQorCSAqIGFibGUgdG8gdXBsb2FkIGl0IGxhdGVyLgorCSAqLworCWlmIChmd191cGxvYWQpCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGFzMTAyX2Z3X3VwbG9hZCgmYXMxMDJfZGV2LT5idXNfYWRhcCksCisJCQkJImZpcm13YXJlX2NsYXNzIik7CisjZW5kaWYKKworZmFpbGVkOgorCUxFQVZFKCk7CisJLyogRklYTUU6IGZyZWUgZHZiX1hYWCAqLworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXMxMDJfZHZiX3VucmVnaXN0ZXIoc3RydWN0IGFzMTAyX2Rldl90ICphczEwMl9kZXYpCit7CisJRU5URVIoKTsKKworCS8qIHVucmVnaXN0ZXIgYXMxMDIgZnJvbnRlbmQgKi8KKwlhczEwMl9kdmJfdW5yZWdpc3Rlcl9mZSgmYXMxMDJfZGV2LT5kdmJfZmUpOworCisJLyogdW5yZWdpc3RlciBkZW11eCBkZXZpY2UgKi8KKwlkdmJfZG14ZGV2X3JlbGVhc2UoJmFzMTAyX2Rldi0+ZHZiX2RteGRldik7CisJZHZiX2RteF9yZWxlYXNlKCZhczEwMl9kZXYtPmR2Yl9kbXgpOworCisJLyogdW5yZWdpc3RlciBkdmIgYWRhcHRlciAqLworCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFzMTAyX2Rldi0+ZHZiX2FkYXApOworCisJTEVBVkUoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXMxMDJfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBsb3cgbGV2ZWwgc3Vic3lzdGVtICovCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfVVNCKQorCXJldCA9IHVzYl9yZWdpc3RlcigmYXMxMDJfdXNiX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkIChyZXQgPSAlZCkiLCByZXQpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfU1BJKQorCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFzMTAyX3NwaV9kcml2ZXIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAic3BpX3JlZ2lzdGVyIGZhaWxlZCAocmV0ID0gJWQpIiwgcmV0KTsKKyNlbmRpZgorCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFuZGF0b3J5IGZ1bmN0aW9uIDogQWRkcyBhIHNwZWNpYWwgc2VjdGlvbiB0byB0aGUgbW9kdWxlIGluZGljYXRpbmcKKyAqIHdoZXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyAqLworbW9kdWxlX2luaXQoYXMxMDJfZHJpdmVyX2luaXQpOworCisvKioKKyAqIGFzMTAyX2RyaXZlcl9leGl0IC0gYXMxMDIgZHJpdmVyIGV4aXQgcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRldmljZSBoYXMgdG8gYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFzMTAyX2RyaXZlcl9leGl0KHZvaWQpCit7CisJRU5URVIoKTsKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIGxvdyBsZXZlbCBidXMgc3Vic3lzdGVtICovCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfVVNCKQorCXVzYl9kZXJlZ2lzdGVyKCZhczEwMl91c2JfZHJpdmVyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFzMTAyX3NwaV9kcml2ZXIpOworI2VuZGlmCisJTEVBVkUoKTsKK30KKworLyoKKyAqIHJlcXVpcmVkIGZ1bmN0aW9uIGZvciB1bmxvYWQ6IEFkZHMgYSBzcGVjaWFsIHNlY3Rpb24gdG8gdGhlIG1vZHVsZQorICogaW5kaWNhdGluZyB3aGVyZSB1bmxvYWQgZnVuY3Rpb24gaXMgZGVmaW5lZAorICovCittb2R1bGVfZXhpdChhczEwMl9kcml2ZXJfZXhpdCk7CisvKiBtb2RpbmZvIGRldGFpbHMgKi8KK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfRlVMTF9OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4iKTsKKworLyogRU9GIC0gdmltOiBzZXQgdGV4dHdpZHRoPTgwIHRzPTggc3c9OCBzdHM9OCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZHJ2LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KK2V4dGVybiBzdHJ1Y3QgdXNiX2RyaXZlciBhczEwMl91c2JfZHJpdmVyOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9TUEkpCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworZXh0ZXJuIHN0cnVjdCBzcGlfZHJpdmVyIGFzMTAyX3NwaV9kcml2ZXI7CisjZW5kaWYKKworI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorCisjZGVmaW5lIERSSVZFUl9GVUxMX05BTUUgIkFiaWxpcyBTeXN0ZW1zIGFzMTB4IHVzYiBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9OQU1FICJhczEweF91c2IiCisKK2V4dGVybiBpbnQgZGVidWc7CisKKyNkZWZpbmUgZHByaW50ayhkZWJ1ZywgYXJncy4uLikgXAorCWRvIHsgaWYgKGRlYnVnKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLF9fRlVOQ1RJT05fXyk7CVwKKwkJcHJpbnRrKGFyZ3MpOwlcCisJfSB9IHdoaWxlICgwKQorCisjaWZkZWYgVFJBQ0UKKyNkZWZpbmUgRU5URVIoKSAgICAgICAgICAgICAgICAgcHJpbnRrKCI+PiBlbnRlciAlc1xuIiwgX19GVU5DVElPTl9fKQorI2RlZmluZSBMRUFWRSgpICAgICAgICAgICAgICAgICBwcmludGsoIjw8IGxlYXZlICVzXG4iLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSBFTlRFUigpCisjZGVmaW5lIExFQVZFKCkKKyNlbmRpZgorCisjZGVmaW5lIEFTMTAyX0RFVklDRV9NQUpPUgkxOTIKKworI2RlZmluZSBBUzEwMl9VU0JfQlVGX1NJWkUJNTEyCisjZGVmaW5lIE1BWF9TVFJFQU1fVVJCCQkzMgorCisjaW5jbHVkZSAiYXMxMHhfY21kLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisjaW5jbHVkZSAiYXMxMDJfdXNiX2Rydi5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9TUEkpCisjaW5jbHVkZSAiYXMxMHhfc3BpX2Rydi5oIgorI2VuZGlmCisKKworc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgeworI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1VTQikKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgY2RldiBjZGV2OyAvKiBzcGlkZXYgcmF3IGRldmljZSAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IGNvbXBsZXRpb24geGZlcl9kb25lOworI2VuZGlmCisJLyogYnVzIHRva2VuIGxvY2sgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwkvKiBsb3cgbGV2ZWwgaW50ZXJmYWNlIGZvciBidXMgYWRhcHRlciAqLworCXVuaW9uIGFzMTB4X2J1c190b2tlbl90IHsKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisJCS8qIHVzYiB0b2tlbiAqLworCQlzdHJ1Y3QgYXMxMHhfdXNiX3Rva2VuX2NtZF90IHVzYjsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FTMTAyX1NQSSkKKwkJLyogc3BpIHRva2VuICovCisJCXN0cnVjdCBhczEweF9zcGlfdG9rZW5fY21kX3Qgc3BpOworI2VuZGlmCisJfSB0b2tlbjsKKworCS8qIHRva2VuIGNtZCB4ZmVyIGlkICovCisJdWludDE2X3QgY21kX3hpZDsKKworCS8qIGFzMTB4IGNvbW1hbmQgYW5kIHJlc3BvbnNlIGZvciBkdmIgaW50ZXJmYWNlKi8KKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKmNtZCwgKnJzcDsKKworCS8qIGJ1cyBhZGFwdGVyIHByaXZhdGUgb3BzIGNhbGxiYWNrICovCisJc3RydWN0IGFzMTAyX3ByaXZfb3BzX3QgKm9wczsKK307CisKK3N0cnVjdCBhczEwMl9kZXZfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCBidXNfYWRhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZV9lbnRyeTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXVuc2lnbmVkIGxvbmcgbWlub3I7CisKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXA7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBkdmJfZmU7CisJc3RydWN0IGR2Yl9kZW11eCBkdmJfZG14OworCXN0cnVjdCBkbXhkZXYgZHZiX2RteGRldjsKKworCS8qIGRlbW9kdWxhdG9yIHN0YXRzICovCisJc3RydWN0IGFzMTB4X2RlbW9kX3N0YXRzIGRlbW9kX3N0YXRzOworCS8qIHNpZ25hbCBzdHJlbmd0aCAqLworCXVpbnQxNl90IHNpZ25hbF9zdHJlbmd0aDsKKwkvKiBiaXQgZXJyb3IgcmF0ZSAqLworCXVpbnQzMl90IGJlcjsKKworCS8qIHRpbWVyIGhhbmRsZSB0byB0cmlnIHRzIHN0cmVhbSBkb3dubG9hZCAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2hhbmRsZTsKKworCXN0cnVjdCBtdXRleCBzZW07CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl2b2lkICpzdHJlYW07CisJaW50IHN0cmVhbWluZzsKKwlzdHJ1Y3QgdXJiICpzdHJlYW1fdXJiW01BWF9TVFJFQU1fVVJCXTsKK307CisKK2ludCBhczEwMl9kdmJfcmVnaXN0ZXIoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOwordm9pZCBhczEwMl9kdmJfdW5yZWdpc3RlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisKK2ludCBhczEwMl9kdmJfcmVnaXN0ZXJfZmUoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYsIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKK2ludCBhczEwMl9kdmJfdW5yZWdpc3Rlcl9mZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZXYpOworCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NTBmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZmUuYwpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGtlcm5lbGxhYnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAiYXMxMDJfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworZXh0ZXJuIGludCBlbG5hX2VuYWJsZTsKKworc3RhdGljIHZvaWQgYXMxMHhfZmVfY29weV90cHNfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmRzdCwKKwkJCQkJIHN0cnVjdCBhczEweF90cHMgKnNyYyk7CisKK3N0YXRpYyB2b2lkIGFzMTAyX2ZlX2NvcHlfdHVuZV9wYXJhbWV0ZXJzKHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKmRzdCwKKwkJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnNyYyk7CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzIHR1bmVfYXJncyA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwlhczEwMl9mZV9jb3B5X3R1bmVfcGFyYW1ldGVycygmdHVuZV9hcmdzLCBwYXJhbXMpOworCisJLyogc2VuZCBhYmlsaXMgY29tbWFuZDogU0VUX1RVTkUgKi8KKwlyZXQgPSAgYXMxMHhfY21kX3NldF90dW5lKCZkZXYtPmJ1c19hZGFwLCAmdHVuZV9hcmdzKTsKKwlpZiAocmV0ICE9IDApCisJCWRwcmludGsoZGVidWcsICJhczEweF9jbWRfc2V0X3R1bmUgZmFpbGVkLiAoZXJyID0gJWQpXG4iLCByZXQpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gKHJldCA8IDApID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApIHsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgYXMxMHhfdHBzIHRwcyA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBzZW5kIGFiaWxpcyBjb21tYW5kOiBHRVRfVFBTICovCisJcmV0ID0gYXMxMHhfY21kX2dldF90cHMoJmRldi0+YnVzX2FkYXAsICZ0cHMpOworCisJaWYgKHJldCA9PSAwKQorCQlhczEweF9mZV9jb3B5X3Rwc19wYXJhbWV0ZXJzKHAsICZ0cHMpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1c19hZGFwLmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gKHJldCA8IDApID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnNldHRpbmdzKSB7CisJRU5URVIoKTsKKworI2lmIDAKKwlkcHJpbnRrKGRlYnVnLCAic3RlcF9zaXplICAgID0gJWRcbiIsIHNldHRpbmdzLT5zdGVwX3NpemUpOworCWRwcmludGsoZGVidWcsICJtYXhfZHJpZnQgICAgPSAlZFxuIiwgc2V0dGluZ3MtPm1heF9kcmlmdCk7CisJZHByaW50ayhkZWJ1ZywgIm1pbl9kZWxheV9tcyA9ICVkIC0+ICVkXG4iLCBzZXR0aW5ncy0+bWluX2RlbGF5X21zLAorCQkxMDAwKTsKKyNlbmRpZgorCisJc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CisJc3RydWN0IGFzMTB4X3R1bmVfc3RhdHVzIHRzdGF0ZSA9IHsgMCB9OworCisJRU5URVIoKTsKKworCWRldiA9IChzdHJ1Y3QgYXMxMDJfZGV2X3QgKikgZmUtPnR1bmVyX3ByaXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+YnVzX2FkYXAubG9jaykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBzZW5kIGFiaWxpcyBjb21tYW5kOiBHRVRfVFVORV9TVEFUVVMgKi8KKwlyZXQgPSBhczEweF9jbWRfZ2V0X3R1bmVfc3RhdHVzKCZkZXYtPmJ1c19hZGFwLCAmdHN0YXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkcHJpbnRrKGRlYnVnLCAiYXMxMHhfY21kX2dldF90dW5lX3N0YXR1cyBmYWlsZWQgKGVyciA9ICVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+c2lnbmFsX3N0cmVuZ3RoICA9IHRzdGF0ZS5zaWduYWxfc3RyZW5ndGg7CisJZGV2LT5iZXIgID0gdHN0YXRlLkJFUjsKKworCXN3aXRjaCAodHN0YXRlLnR1bmVfc3RhdGUpIHsKKwljYXNlIFRVTkVfU1RBVFVTX1NJR05BTF9EVkJfT0s6CisJCSpzdGF0dXMgPSBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWNhc2UgVFVORV9TVEFUVVNfU1RSRUFNX0RFVEVDVEVEOgorCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NZTkM7CisJCWJyZWFrOworCWNhc2UgVFVORV9TVEFUVVNfU1RSRUFNX1RVTkVEOgorCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1NZTkMgfAorCQkJRkVfSEFTX0xPQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpzdGF0dXMgPSBUVU5FX1NUQVRVU19OT1RfVFVORUQ7CisJfQorCisJZHByaW50ayhkZWJ1ZywgInR1bmVyIHN0YXR1czogMHglMDJ4LCBzdHJlbmd0aCAlZCwgcGVyOiAlZCwgYmVyOiAlZFxuIiwKKwkJCXRzdGF0ZS50dW5lX3N0YXRlLCB0c3RhdGUuc2lnbmFsX3N0cmVuZ3RoLAorCQkJdHN0YXRlLlBFUiwgdHN0YXRlLkJFUik7CisKKwlpZiAoKnN0YXR1cyAmIEZFX0hBU19MT0NLKSB7CisJCWlmIChhczEweF9jbWRfZ2V0X2RlbW9kX3N0YXRzKCZkZXYtPmJ1c19hZGFwLAorCQkJKHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyAqKSAmZGV2LT5kZW1vZF9zdGF0cykgPCAwKSB7CisJCQltZW1zZXQoJmRldi0+ZGVtb2Rfc3RhdHMsIDAsIHNpemVvZihkZXYtPmRlbW9kX3N0YXRzKSk7CisJCQlkcHJpbnRrKGRlYnVnLCAiYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyBmYWlsZWQgIgorCQkJCSIocHJvYmFibHkgbm90IHR1bmVkKVxuIik7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKGRlYnVnLAorCQkJCSJkZW1vZCBzdGF0dXM6IGZjOiAweCUwOHgsIGJhZCBmYzogMHglMDh4LCAiCisJCQkJImJ5dGVzIGNvcnJlY3RlZDogMHglMDh4ICwgTUVSOiAweCUwNHhcbiIsCisJCQkJZGV2LT5kZW1vZF9zdGF0cy5mcmFtZV9jb3VudCwKKwkJCQlkZXYtPmRlbW9kX3N0YXRzLmJhZF9mcmFtZV9jb3VudCwKKwkJCQlkZXYtPmRlbW9kX3N0YXRzLmJ5dGVzX2ZpeGVkX2J5X3JzLAorCQkJCWRldi0+ZGVtb2Rfc3RhdHMubWVyKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldCgmZGV2LT5kZW1vZF9zdGF0cywgMCwgc2l6ZW9mKGRldi0+ZGVtb2Rfc3RhdHMpKTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTm90ZToKKyAqIC0gaW4gQVMxMDIgU05SPU1FUgorICogICAtIHRoZSBTTlIgd2lsbCBiZSByZXR1cm5lZCBpbiBsaW5lYXIgdGVybXMsIGkuZS4gbm90IGluIGRCCisgKiAgIC0gdGhlIGFjY3VyYWN5IGVxdWFscyDCsTJkQiBmb3IgYSBTTlIgcmFuZ2UgZnJvbSA0ZEIgdG8gMzBkQgorICogICAtIHRoZSBhY2N1cmFjeSBpcyA+MmRCIGZvciBTTlIgdmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZQorICovCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqc25yID0gZGV2LT5kZW1vZF9zdGF0cy5tZXI7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqYmVyID0gZGV2LT5iZXI7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzMTAyX2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqc3RyZW5ndGggPSAoKCgweGZmZmYgKiA0MDApICogZGV2LT5zaWduYWxfc3RyZW5ndGggKyA0MTAwMCkgKiAyKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfZmVfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldjsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGV2LT5kZW1vZF9zdGF0cy5oYXNfc3RhcnRlZCkKKwkJKnVjYmxvY2tzID0gZGV2LT5kZW1vZF9zdGF0cy5iYWRfZnJhbWVfY291bnQ7CisJZWxzZQorCQkqdWNibG9ja3MgPSAwOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhczEwMl9mZV90c19idXNfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFjcXVpcmUpCit7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXY7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlkZXYgPSAoc3RydWN0IGFzMTAyX2Rldl90ICopIGZlLT50dW5lcl9wcml2OworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPmJ1c19hZGFwLmxvY2spKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGFjcXVpcmUpIHsKKwkJaWYgKGVsbmFfZW5hYmxlKQorCQkJYXMxMHhfY21kX3NldF9jb250ZXh0KCZkZXYtPmJ1c19hZGFwLCAxMDEwLCAweEMwKTsKKworCQlyZXQgPSBhczEweF9jbWRfdHVybl9vbigmZGV2LT5idXNfYWRhcCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYXMxMHhfY21kX3R1cm5fb2ZmKCZkZXYtPmJ1c19hZGFwKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+YnVzX2FkYXAubG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBhczEwMl9mZV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiVW5rbm93biBBUzEwMiBkZXZpY2UiLAorCQkudHlwZQkJCT0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4JCT0gMTc0MDAwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSA4NjIwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxNjY2NjcsCisJCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPCisJCQl8IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNAorCQkJfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPCisJCQl8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FQU0sKKwkJCXwgRkVfQ0FOX1FBTV9BVVRPCisJCQl8IEZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPCisJCQl8IEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPCisJCQl8IEZFX0NBTl9ISUVSQVJDSFlfQVVUTworCQkJfCBGRV9DQU5fUkVDT1ZFUgorCQkJfCBGRV9DQU5fTVVURV9UUworCX0sCisKKwkuc2V0X2Zyb250ZW5kCQk9IGFzMTAyX2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kCQk9IGFzMTAyX2ZlX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MJPSBhczEwMl9mZV9nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cwkJPSBhczEwMl9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9zbnIJCT0gYXMxMDJfZmVfcmVhZF9zbnIsCisJLnJlYWRfYmVyCQk9IGFzMTAyX2ZlX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aAk9IGFzMTAyX2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3VjYmxvY2tzCQk9IGFzMTAyX2ZlX3JlYWRfdWNibG9ja3MsCisJLnRzX2J1c19jdHJsCQk9IGFzMTAyX2ZlX3RzX2J1c19jdHJsLAorfTsKKworaW50IGFzMTAyX2R2Yl91bnJlZ2lzdGVyX2ZlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCS8qIHVucmVnaXN0ZXIgZnJvbnRlbmQgKi8KKwlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChmZSk7CisKKwkvKiBkZXRhY2ggZnJvbnRlbmQgKi8KKwlkdmJfZnJvbnRlbmRfZGV0YWNoKGZlKTsKKworCXJldHVybiAwOworfQorCitpbnQgYXMxMDJfZHZiX3JlZ2lzdGVyX2ZlKHN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2LAorCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfZmUpCit7CisJaW50IGVycm5vOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXA7CisKKwlpZiAoYXMxMDJfZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZXh0cmFjdCBkdmJfYWRhcHRlciAqLworCWR2Yl9hZGFwID0gJmFzMTAyX2Rldi0+ZHZiX2FkYXA7CisKKwkvKiBpbml0IGZyb250ZW5kIGNhbGxiYWNrIG9wcyAqLworCW1lbWNweSgmZHZiX2ZlLT5vcHMsICZhczEwMl9mZV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0cm5jcHkoZHZiX2ZlLT5vcHMuaW5mby5uYW1lLCBhczEwMl9kZXYtPm5hbWUsCisJCXNpemVvZihkdmJfZmUtPm9wcy5pbmZvLm5hbWUpKTsKKworCS8qIHJlZ2lzdGVyIGRidmIgZnJvbnRlbmQgKi8KKwllcnJubyA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChkdmJfYWRhcCwgZHZiX2ZlKTsKKwlpZiAoZXJybm8gPT0gMCkKKwkJZHZiX2ZlLT50dW5lcl9wcml2ID0gYXMxMDJfZGV2OworCisJcmV0dXJuIGVycm5vOworfQorCitzdGF0aWMgdm9pZCBhczEweF9mZV9jb3B5X3Rwc19wYXJhbWV0ZXJzKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZHN0LAorCQkJCQkgc3RydWN0IGFzMTB4X3RwcyAqYXMxMHhfdHBzKQoreworCisJc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgKmZlX3RwcyA9ICZkc3QtPnUub2ZkbTsKKworCS8qIGV4dHJhY3QgY29uc3RlYWxsYXRpb24gKi8KKwlzd2l0Y2ggKGFzMTB4X3Rwcy0+Y29uc3RlbGxhdGlvbikgeworCWNhc2UgQ09OU1RfUVBTSzoKKwkJZmVfdHBzLT5jb25zdGVsbGF0aW9uID0gUVBTSzsKKwkJYnJlYWs7CisJY2FzZSBDT05TVF9RQU0xNjoKKwkJZmVfdHBzLT5jb25zdGVsbGF0aW9uID0gUUFNXzE2OworCQlicmVhazsKKwljYXNlIENPTlNUX1FBTTY0OgorCQlmZV90cHMtPmNvbnN0ZWxsYXRpb24gPSBRQU1fNjQ7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgaGllcmFyY2h5ICovCisJc3dpdGNoIChhczEweF90cHMtPmhpZXJhcmNoeSkgeworCWNhc2UgSElFUl9OT05FOgorCQlmZV90cHMtPmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV9OT05FOworCQlicmVhazsKKwljYXNlIEhJRVJfQUxQSEFfMToKKwkJZmVfdHBzLT5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfMTsKKwkJYnJlYWs7CisJY2FzZSBISUVSX0FMUEhBXzI6CisJCWZlX3Rwcy0+aGllcmFyY2h5X2luZm9ybWF0aW9uID0gSElFUkFSQ0hZXzI7CisJCWJyZWFrOworCWNhc2UgSElFUl9BTFBIQV80OgorCQlmZV90cHMtPmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9IEhJRVJBUkNIWV80OworCQlicmVhazsKKwl9CisKKwkvKiBleHRyYWN0IGNvZGUgcmF0ZSBIUCAqLworCXN3aXRjaCAoYXMxMHhfdHBzLT5jb2RlX3JhdGVfSFApIHsKKwljYXNlIENPREVfUkFURV8xXzI6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0hQID0gRkVDXzFfMjsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfMl8zOgorCQlmZV90cHMtPmNvZGVfcmF0ZV9IUCA9IEZFQ18yXzM7CisJCWJyZWFrOworCWNhc2UgQ09ERV9SQVRFXzNfNDoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfSFAgPSBGRUNfM180OworCQlicmVhazsKKwljYXNlIENPREVfUkFURV81XzY6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0hQID0gRkVDXzVfNjsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfN184OgorCQlmZV90cHMtPmNvZGVfcmF0ZV9IUCA9IEZFQ183Xzg7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgY29kZSByYXRlIExQICovCisJc3dpdGNoIChhczEweF90cHMtPmNvZGVfcmF0ZV9MUCkgeworCWNhc2UgQ09ERV9SQVRFXzFfMjoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfTFAgPSBGRUNfMV8yOworCQlicmVhazsKKwljYXNlIENPREVfUkFURV8yXzM6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0xQID0gRkVDXzJfMzsKKwkJYnJlYWs7CisJY2FzZSBDT0RFX1JBVEVfM180OgorCQlmZV90cHMtPmNvZGVfcmF0ZV9MUCA9IEZFQ18zXzQ7CisJCWJyZWFrOworCWNhc2UgQ09ERV9SQVRFXzVfNjoKKwkJZmVfdHBzLT5jb2RlX3JhdGVfTFAgPSBGRUNfNV82OworCQlicmVhazsKKwljYXNlIENPREVfUkFURV83Xzg6CisJCWZlX3Rwcy0+Y29kZV9yYXRlX0xQID0gRkVDXzdfODsKKwkJYnJlYWs7CisJfQorCisJLyogZXh0cmFjdCBndWFyZCBpbnRlcnZhbCAqLworCXN3aXRjaCAoYXMxMHhfdHBzLT5ndWFyZF9pbnRlcnZhbCkgeworCWNhc2UgR1VBUkRfSU5UXzFfMzI6CisJCWZlX3Rwcy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzMyOworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVF8xXzE2OgorCQlmZV90cHMtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV8xNjsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRfMV84OgorCQlmZV90cHMtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV84OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVF8xXzQ6CisJCWZlX3Rwcy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzQ7CisJCWJyZWFrOworCX0KKworCS8qIGV4dHJhY3QgdHJhbnNtaXNzaW9uIG1vZGUgKi8KKwlzd2l0Y2ggKGFzMTB4X3Rwcy0+dHJhbnNtaXNzaW9uX21vZGUpIHsKKwljYXNlIFRSQU5TX01PREVfMks6CisJCWZlX3Rwcy0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsKKwkJYnJlYWs7CisJY2FzZSBUUkFOU19NT0RFXzhLOgorCQlmZV90cHMtPnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfOEs7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShmZV9jb2RlX3JhdGVfdCBhcmcpCit7CisJdWludDhfdCBjOworCisJc3dpdGNoIChhcmcpIHsKKwljYXNlIEZFQ18xXzI6CisJCWMgPSBDT0RFX1JBVEVfMV8yOworCQlicmVhazsKKwljYXNlIEZFQ18yXzM6CisJCWMgPSBDT0RFX1JBVEVfMl8zOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCWMgPSBDT0RFX1JBVEVfM180OworCQlicmVhazsKKwljYXNlIEZFQ181XzY6CisJCWMgPSBDT0RFX1JBVEVfNV82OworCQlicmVhazsKKwljYXNlIEZFQ183Xzg6CisJCWMgPSBDT0RFX1JBVEVfN184OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljID0gQ09ERV9SQVRFX1VOS05PV047CisJCWJyZWFrOworCX0KKworCXJldHVybiBjOworfQorCitzdGF0aWMgdm9pZCBhczEwMl9mZV9jb3B5X3R1bmVfcGFyYW1ldGVycyhzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzICp0dW5lX2FyZ3MsCisJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCisJLyogc2V0IGZyZXF1ZW5jeSAqLworCXR1bmVfYXJncy0+ZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMDsKKworCS8qIGZpeCBpbnRlcmxlYXZpbmdfbW9kZSAqLworCXR1bmVfYXJncy0+aW50ZXJsZWF2aW5nX21vZGUgPSBJTlRMVl9OQVRJVkU7CisKKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQl0dW5lX2FyZ3MtPmJhbmR3aWR0aCA9IEJXXzhfTUhaOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJdHVuZV9hcmdzLT5iYW5kd2lkdGggPSBCV183X01IWjsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCXR1bmVfYXJncy0+YmFuZHdpZHRoID0gQldfNl9NSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXR1bmVfYXJncy0+YmFuZHdpZHRoID0gQldfOF9NSFo7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCkgeworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKKwkJdHVuZV9hcmdzLT5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVF8xXzMyOworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMTY6CisJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRfMV8xNjsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CisJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRfMV84OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfNDoKKwkJdHVuZV9hcmdzLT5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVF8xXzQ7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfQVVUTzoKKwlkZWZhdWx0OgorCQl0dW5lX2FyZ3MtPmd1YXJkX2ludGVydmFsID0gR1VBUkRfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5jb25zdGVsbGF0aW9uKSB7CisJY2FzZSBRUFNLOgorCQl0dW5lX2FyZ3MtPmNvbnN0ZWxsYXRpb24gPSBDT05TVF9RUFNLOworCQlicmVhazsKKwljYXNlIFFBTV8xNjoKKwkJdHVuZV9hcmdzLT5jb25zdGVsbGF0aW9uID0gQ09OU1RfUUFNMTY7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQl0dW5lX2FyZ3MtPmNvbnN0ZWxsYXRpb24gPSBDT05TVF9RQU02NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHVuZV9hcmdzLT5jb25zdGVsbGF0aW9uID0gQ09OU1RfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CisJCXR1bmVfYXJncy0+dHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU19NT0RFXzJLOworCQlicmVhazsKKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgorCQl0dW5lX2FyZ3MtPnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNfTU9ERV84SzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHVuZV9hcmdzLT50cmFuc21pc3Npb25fbW9kZSA9IFRSQU5TX01PREVfVU5LTk9XTjsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbikgeworCWNhc2UgSElFUkFSQ0hZX05PTkU6CisJCXR1bmVfYXJncy0+aGllcmFyY2h5ID0gSElFUl9OT05FOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV8xOgorCQl0dW5lX2FyZ3MtPmhpZXJhcmNoeSA9IEhJRVJfQUxQSEFfMTsKKwkJYnJlYWs7CisJY2FzZSBISUVSQVJDSFlfMjoKKwkJdHVuZV9hcmdzLT5oaWVyYXJjaHkgPSBISUVSX0FMUEhBXzI7CisJCWJyZWFrOworCWNhc2UgSElFUkFSQ0hZXzQ6CisJCXR1bmVfYXJncy0+aGllcmFyY2h5ID0gSElFUl9BTFBIQV80OworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV9BVVRPOgorCQl0dW5lX2FyZ3MtPmhpZXJhcmNoeSA9IEhJRVJfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJZHByaW50ayhkZWJ1ZywgInR1bmVyIHBhcmFtZXRlcnM6IGZyZXE6ICVkICBidzogMHglMDJ4ICBnaTogMHglMDJ4XG4iLAorCQkJcGFyYW1zLT5mcmVxdWVuY3ksCisJCQl0dW5lX2FyZ3MtPmJhbmR3aWR0aCwKKwkJCXR1bmVfYXJncy0+Z3VhcmRfaW50ZXJ2YWwpOworCisJLyoKKwkgKiBEZXRlY3QgYSBoaWVyYXJjaHkgc2VsZWN0aW9uCisJICogaWYgSFAvTFAgYXJlIGJvdGggc2V0IHRvIEZFQ19OT05FLCBIUCB3aWxsIGJlIHNlbGVjdGVkLgorCSAqLworCWlmICgodHVuZV9hcmdzLT5oaWVyYXJjaHkgIT0gSElFUl9OT05FKSAmJgorCQkgICAgICAgKChwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPT0gRkVDX05PTkUpIHx8CisJCQkocGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0hQID09IEZFQ19OT05FKSkpIHsKKworCQlpZiAocGFyYW1zLT51Lm9mZG0uY29kZV9yYXRlX0xQID09IEZFQ19OT05FKSB7CisJCQl0dW5lX2FyZ3MtPmhpZXJfc2VsZWN0ID0gSElFUl9ISUdIX1BSSU9SSVRZOworCQkJdHVuZV9hcmdzLT5jb2RlX3JhdGUgPQorCQkJICAgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfSFApOworCQl9CisKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmNvZGVfcmF0ZV9IUCA9PSBGRUNfTk9ORSkgeworCQkJdHVuZV9hcmdzLT5oaWVyX3NlbGVjdCA9IEhJRVJfTE9XX1BSSU9SSVRZOworCQkJdHVuZV9hcmdzLT5jb2RlX3JhdGUgPQorCQkJICAgYXMxMDJfZmVfZ2V0X2NvZGVfcmF0ZShwYXJhbXMtPnUub2ZkbS5jb2RlX3JhdGVfTFApOworCQl9CisKKwkJZHByaW50ayhkZWJ1ZywgIlx0aGllcmFyY2h5OiAweCUwMnggICIKKwkJCQkic2VsZWN0ZWQ6ICVzICBjb2RlX3JhdGVfJXM6IDB4JTAyeFxuIiwKKwkJCXR1bmVfYXJncy0+aGllcmFyY2h5LAorCQkJdHVuZV9hcmdzLT5oaWVyX3NlbGVjdCA9PSBISUVSX0hJR0hfUFJJT1JJVFkgPworCQkJIkhQIiA6ICJMUCIsCisJCQl0dW5lX2FyZ3MtPmhpZXJfc2VsZWN0ID09IEhJRVJfSElHSF9QUklPUklUWSA/CisJCQkiSFAiIDogIkxQIiwKKwkJCXR1bmVfYXJncy0+Y29kZV9yYXRlKTsKKwl9IGVsc2UgeworCQl0dW5lX2FyZ3MtPmNvZGVfcmF0ZSA9CisJCQlhczEwMl9mZV9nZXRfY29kZV9yYXRlKHBhcmFtcy0+dS5vZmRtLmNvZGVfcmF0ZV9IUCk7CisJfQorfQorCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTlkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGtlcm5lbGxhYnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTAyX2Z3LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCitjaGFyIGFzMTAyX3N0X2Z3MVtdID0gImFzMTAyX2RhdGExX3N0LmhleCI7CitjaGFyIGFzMTAyX3N0X2Z3MltdID0gImFzMTAyX2RhdGEyX3N0LmhleCI7CitjaGFyIGFzMTAyX2R0X2Z3MVtdID0gImFzMTAyX2RhdGExX2R0LmhleCI7CitjaGFyIGFzMTAyX2R0X2Z3MltdID0gImFzMTAyX2RhdGEyX2R0LmhleCI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0b2h4KHVuc2lnbmVkIGNoYXIgKmRzdCwgY2hhciAqc3JjKQoreworCXVuc2lnbmVkIGNoYXIgdmFsdWUgPSAwOworCisJY2hhciBtc2IgPSB0b2xvd2VyKCpzcmMpIC0gJzAnOworCWNoYXIgbHNiID0gdG9sb3dlcigqKHNyYyArIDEpKSAtICcwJzsKKworCWlmIChtc2IgPiA5KQorCQltc2IgLT0gNzsKKwlpZiAobHNiID4gOSkKKwkJbHNiIC09IDc7CisKKwkqZHN0ID0gdmFsdWUgPSAoKG1zYiAmIDB4RikgPDwgNCkgfCAobHNiICYgMHhGKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBQYXJzZSBJTlRFTCBIRVggZmlybXdhcmUgZmlsZSB0byBleHRyYWN0IGFkZHJlc3MgYW5kIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfaGV4X2xpbmUodW5zaWduZWQgY2hhciAqZndfZGF0YSwgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCSAgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50ICpkYXRhTGVuZ3RoLAorCQkJICB1bnNpZ25lZCBjaGFyICphZGRyX2hhc19jaGFuZ2VkKSB7CisKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgKnNyYywgZHN0OworCisJaWYgKCpmd19kYXRhKysgIT0gJzonKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW52YWxpZCBmaXJtd2FyZSBmaWxlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogbG9jYXRlIGVuZCBvZiBsaW5lICovCisJZm9yIChzcmMgPSBmd19kYXRhOyAqc3JjICE9ICdcbic7IHNyYyArPSAyKSB7CisJCWF0b2h4KCZkc3QsIHNyYyk7CisJCS8qIHBhcnNlIGxpbmUgdG8gc3BsaXQgYWRkciAvIGRhdGEgKi8KKwkJc3dpdGNoIChjb3VudCkgeworCQljYXNlIDA6CisJCQkqZGF0YUxlbmd0aCA9IGRzdDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhZGRyWzJdID0gZHN0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWFkZHJbM10gPSBkc3Q7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogY2hlY2sgaWYgZGF0YSBpcyBhbiBhZGRyZXNzICovCisJCQlpZiAoZHN0ID09IDB4MDQpCisJCQkJKmFkZHJfaGFzX2NoYW5nZWQgPSAxOworCQkJZWxzZQorCQkJCSphZGRyX2hhc19jaGFuZ2VkID0gMDsKKwkJCWJyZWFrOworCQljYXNlICA0OgorCQljYXNlICA1OgorCQkJaWYgKCphZGRyX2hhc19jaGFuZ2VkKQorCQkJCWFkZHJbKGNvdW50IC0gNCldID0gZHN0OworCQkJZWxzZQorCQkJCWRhdGFbKGNvdW50IC0gNCldID0gZHN0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYXRhWyhjb3VudCAtIDQpXSA9IGRzdDsKKwkJCWJyZWFrOworCQl9CisJCWNvdW50Kys7CisJfQorCisJLyogcmV0dXJuIHJlYWQgdmFsdWUgKyAnOicgKyAnXG4nICovCisJcmV0dXJuIChjb3VudCAqIDIpICsgMjsKK30KKworc3RhdGljIGludCBhczEwMl9maXJtd2FyZV91cGxvYWQoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCQkJCSB1bnNpZ25lZCBjaGFyICpjbWQsCisJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmUpIHsKKworCXN0cnVjdCBhczEweF9md19wa3RfdCBmd19wa3Q7CisJaW50IHRvdGFsX3JlYWRfYnl0ZXMgPSAwLCBlcnJubyA9IDA7CisJdW5zaWduZWQgY2hhciBhZGRyX2hhc19jaGFuZ2VkID0gMDsKKworCUVOVEVSKCk7CisKKwlmb3IgKHRvdGFsX3JlYWRfYnl0ZXMgPSAwOyB0b3RhbF9yZWFkX2J5dGVzIDwgZmlybXdhcmUtPnNpemU7ICkgeworCQlpbnQgcmVhZF9ieXRlcyA9IDAsIGRhdGFfbGVuID0gMDsKKworCQkvKiBwYXJzZSBpbnRlbCBoZXggbGluZSAqLworCQlyZWFkX2J5dGVzID0gcGFyc2VfaGV4X2xpbmUoCisJCQkJKHU4ICopIChmaXJtd2FyZS0+ZGF0YSArIHRvdGFsX3JlYWRfYnl0ZXMpLAorCQkJCWZ3X3BrdC5yYXcuYWRkcmVzcywKKwkJCQlmd19wa3QucmF3LmRhdGEsCisJCQkJJmRhdGFfbGVuLAorCQkJCSZhZGRyX2hhc19jaGFuZ2VkKTsKKworCQlpZiAocmVhZF9ieXRlcyA8PSAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBkZXRlY3QgdGhlIGVuZCBvZiBmaWxlICovCisJCXRvdGFsX3JlYWRfYnl0ZXMgKz0gcmVhZF9ieXRlczsKKwkJaWYgKHRvdGFsX3JlYWRfYnl0ZXMgPT0gZmlybXdhcmUtPnNpemUpIHsKKwkJCWZ3X3BrdC51LnJlcXVlc3RbMF0gPSAweDAwOworCQkJZndfcGt0LnUucmVxdWVzdFsxXSA9IDB4MDM7CisKKwkJCS8qIHNlbmQgRU9GIGNvbW1hbmQgKi8KKwkJCWVycm5vID0gYnVzX2FkYXAtPm9wcy0+dXBsb2FkX2Z3X3BrdChidXNfYWRhcCwKKwkJCQkJCQkgICAgICh1aW50OF90ICopCisJCQkJCQkJICAgICAmZndfcGt0LCAyLCAwKTsKKwkJCWlmIChlcnJubyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIHsKKwkJCWlmICghYWRkcl9oYXNfY2hhbmdlZCkgeworCQkJCS8qIHByZXBhcmUgY29tbWFuZCB0byBzZW5kICovCisJCQkJZndfcGt0LnUucmVxdWVzdFswXSA9IDB4MDA7CisJCQkJZndfcGt0LnUucmVxdWVzdFsxXSA9IDB4MDE7CisKKwkJCQlkYXRhX2xlbiArPSBzaXplb2YoZndfcGt0LnUucmVxdWVzdCk7CisJCQkJZGF0YV9sZW4gKz0gc2l6ZW9mKGZ3X3BrdC5yYXcuYWRkcmVzcyk7CisKKwkJCQkvKiBzZW5kIGNtZCB0byBkZXZpY2UgKi8KKwkJCQllcnJubyA9IGJ1c19hZGFwLT5vcHMtPnVwbG9hZF9md19wa3QoYnVzX2FkYXAsCisJCQkJCQkJCSAgICAgKHVpbnQ4X3QgKikKKwkJCQkJCQkJICAgICAmZndfcGt0LAorCQkJCQkJCQkgICAgIGRhdGFfbGVuLAorCQkJCQkJCQkgICAgIDApOworCQkJCWlmIChlcnJubyA8IDApCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwl9CitlcnJvcjoKKwlMRUFWRSgpOworCXJldHVybiAoZXJybm8gPT0gMCkgPyB0b3RhbF9yZWFkX2J5dGVzIDogZXJybm87Cit9CisKK2ludCBhczEwMl9md191cGxvYWQoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKQoreworCWludCBlcnJubyA9IC1FRkFVTFQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwl1bnNpZ25lZCBjaGFyICpjbWRfYnVmID0gTlVMTDsKKwljaGFyICpmdzEsICpmdzI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUzEwMl9VU0IpCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGJ1c19hZGFwLT51c2JfZGV2OworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVMxMDJfU1BJKQorCXN0cnVjdCBzcGlfZGV2aWNlICpkZXYgPSBidXNfYWRhcC0+c3BpX2RldjsKKyNlbmRpZgorCUVOVEVSKCk7CisKKwkvKiBzZWxlY3QgZncgZmlsZSB0byB1cGxvYWQgKi8KKwlpZiAoZHVhbF90dW5lcikgeworCQlmdzEgPSBhczEwMl9kdF9mdzE7CisJCWZ3MiA9IGFzMTAyX2R0X2Z3MjsKKwl9IGVsc2UgeworCQlmdzEgPSBhczEwMl9zdF9mdzE7CisJCWZ3MiA9IGFzMTAyX3N0X2Z3MjsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCisJLyogYWxsb2NhdGUgYnVmZmVyIHRvIHN0b3JlIGZpcm13YXJlIHVwbG9hZCBjb21tYW5kIGFuZCBkYXRhICovCisJY21kX2J1ZiA9IGt6YWxsb2MoTUFYX0ZXX1BLVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kX2J1ZiA9PSBOVUxMKSB7CisJCWVycm5vID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiByZXF1ZXN0IGtlcm5lbCB0byBsb2NhdGUgZmlybXdhcmUgZmlsZTogcGFydDEgKi8KKwllcnJubyA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBmdzEsICZkZXYtPmRldik7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gbG9jYXRlIGZpcm13YXJlIGZpbGU6ICVzXG4iLAorCQkJCSBEUklWRVJfTkFNRSwgZncxKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbml0aWF0ZSBmaXJtd2FyZSB1cGxvYWQgKi8KKwllcnJubyA9IGFzMTAyX2Zpcm13YXJlX3VwbG9hZChidXNfYWRhcCwgY21kX2J1ZiwgZmlybXdhcmUpOworCWlmIChlcnJubyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgZHVyaW5nIGZpcm13YXJlIHVwbG9hZCBwYXJ0MVxuIiwKKwkJCQkgRFJJVkVSX05BTUUpOworCQlnb3RvIGVycm9yOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaW1yd2FyZTogJXMgbG9hZGVkIHdpdGggc3VjY2Vzc1xuIiwKKwkJCSBEUklWRVJfTkFNRSwgZncxKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKKworCS8qIHdhaXQgZm9yIGJvb3QgdG8gY29tcGxldGUgKi8KKwltZGVsYXkoMTAwKTsKKworCS8qIHJlcXVlc3Qga2VybmVsIHRvIGxvY2F0ZSBmaXJtd2FyZSBmaWxlOiBwYXJ0MiAqLworCWVycm5vID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3MiwgJmRldi0+ZGV2KTsKKwlpZiAoZXJybm8gPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBsb2NhdGUgZmlybXdhcmUgZmlsZTogJXNcbiIsCisJCQkJIERSSVZFUl9OQU1FLCBmdzIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGluaXRpYXRlIGZpcm13YXJlIHVwbG9hZCAqLworCWVycm5vID0gYXMxMDJfZmlybXdhcmVfdXBsb2FkKGJ1c19hZGFwLCBjbWRfYnVmLCBmaXJtd2FyZSk7CisJaWYgKGVycm5vIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBkdXJpbmcgZmlybXdhcmUgdXBsb2FkIHBhcnQyXG4iLAorCQkJCSBEUklWRVJfTkFNRSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpbXJ3YXJlOiAlcyBsb2FkZWQgd2l0aCBzdWNjZXNzXG4iLAorCQkJRFJJVkVSX05BTUUsIGZ3Mik7CitlcnJvcjoKKwkvKiBmcmVlIGRhdGEgYnVmZmVyICovCisJa2ZyZWUoY21kX2J1Zik7CisJLyogcmVsZWFzZSBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwlpZiAoZmlybXdhcmUgIT0gTlVMTCkKKwkJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CisjZW5kaWYKKwlMRUFWRSgpOworCXJldHVybiBlcnJubzsKK30KKyNlbmRpZgorCisvKiBFT0YgLSB2aW06IHNldCB0ZXh0d2lkdGg9ODAgdHM9OCBzdz04IHN0cz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTUzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfZncuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjZGVmaW5lIE1BWF9GV19QS1RfU0laRQk2NAorCitleHRlcm4gaW50IGR1YWxfdHVuZXI7CisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IGFzMTB4X3Jhd19md19wa3QgeworCXVuc2lnbmVkIGNoYXIgYWRkcmVzc1s0XTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbTUFYX0ZXX1BLVF9TSVpFIC0gNl07Cit9OworCitzdHJ1Y3QgYXMxMHhfZndfcGt0X3QgeworCXVuaW9uIHsKKwkJdW5zaWduZWQgY2hhciByZXF1ZXN0WzJdOworCQl1bnNpZ25lZCBjaGFyIGxlbmd0aFsyXTsKKwl9IHU7CisJc3RydWN0IGFzMTB4X3Jhd19md19wa3QgcmF3OworfTsKKyNwcmFnbWEgcGFjaygpCisKKyNpZmRlZiBfX0tFUk5FTF9fCitpbnQgYXMxMDJfZndfdXBsb2FkKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCk7CisjZW5kaWYKKworLyogRU9GIC0gdmltOiBzZXQgdGV4dHdpZHRoPTgwIHRzPTggc3c9OCBzdHM9OCBub2V0OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTAyX3VzYl9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YmUyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJhczEwMl9kcnYuaCIKKyNpbmNsdWRlICJhczEwMl91c2JfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMDJfZncuaCIKKworc3RhdGljIHZvaWQgYXMxMDJfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CitzdGF0aWMgaW50IGFzMTAyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKKworc3RhdGljIGludCBhczEwMl91c2Jfc3RhcnRfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2KTsKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9zdG9wX3N0cmVhbShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisKK3N0YXRpYyBpbnQgYXMxMDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFzMTAyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXMxMDJfdXNiX2lkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKEFTMTAyX1VTQl9ERVZJQ0VfVkVORE9SX0lELCBBUzEwMl9VU0JfREVWSUNFX1BJRF8wMDAxKSB9LAorCXsgVVNCX0RFVklDRShQQ1RWXzc0RV9VU0JfVklELCBQQ1RWXzc0RV9VU0JfUElEKSB9LAorCXsgVVNCX0RFVklDRShFTEdBVE9fRVlFVFZfRFRUX1VTQl9WSUQsIEVMR0FUT19FWUVUVl9EVFRfVVNCX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoTkJPWF9EVkJUX0RPTkdMRV9VU0JfVklELCBOQk9YX0RWQlRfRE9OR0xFX1VTQl9QSUQpIH0sCisJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCisvKiBOb3RlIHRoYXQgdGhpcyB0YWJsZSBtdXN0IGFsd2F5cyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzIGFzIHRoZQorICAgYXMxMDJfdXNiX2lkX3RhYmxlIHN0cnVjdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFzMTAyX2RldmljZV9uYW1lc1tdID0geworCUFTMTAyX1JFRkVSRU5DRV9ERVNJR04sCisJQVMxMDJfUENUVl83NEUsCisJQVMxMDJfRUxHQVRPX0VZRVRWX0RUVF9OQU1FLAorCUFTMTAyX05CT1hfRFZCVF9ET05HTEVfTkFNRSwKKwlOVUxMIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitzdHJ1Y3QgdXNiX2RyaXZlciBhczEwMl91c2JfZHJpdmVyID0geworCS5uYW1lICAgICAgID0gIERSSVZFUl9GVUxMX05BTUUsCisJLnByb2JlICAgICAgPSAgYXMxMDJfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gIGFzMTAyX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSAgID0gIGFzMTAyX3VzYl9pZF90YWJsZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXMxMDJfZGV2X2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGFzMTAyX29wZW4sCisJLnJlbGVhc2UgPSBhczEwMl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGFzMTAyX3VzYl9jbGFzc19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImF0b24yLSVkIiwKKwkuZm9wcwkJPSAmYXMxMDJfZGV2X2ZvcHMsCisJLm1pbm9yX2Jhc2UJPSBBUzEwMl9ERVZJQ0VfTUFKT1IsCit9OworCitzdGF0aWMgaW50IGFzMTAyX3VzYl94ZmVyX2NtZChzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpzZW5kX2J1ZiwgaW50IHNlbmRfYnVmX2xlbiwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQoreworCWludCByZXQgPSAwOworCUVOVEVSKCk7CisKKwlpZiAoc2VuZF9idWYgIT0gTlVMTCkgeworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coYnVzX2FkYXAtPnVzYl9kZXYsCisJCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAwKSwKKwkJCQkgICAgICBBUzEwMl9VU0JfREVWSUNFX1RYX0NUUkxfQ01ELAorCQkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgICAgICBVU0JfUkVDSVBfREVWSUNFLAorCQkJCSAgICAgIGJ1c19hZGFwLT5jbWRfeGlkLCAvKiB2YWx1ZSAqLworCQkJCSAgICAgIDAsIC8qIGluZGV4ICovCisJCQkJICAgICAgc2VuZF9idWYsIHNlbmRfYnVmX2xlbiwKKwkJCQkgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCAvKiAyMDAgKi8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZHByaW50ayhkZWJ1ZywgInVzYl9jb250cm9sX21zZyhzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwKKwkJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAocmV0ICE9IHNlbmRfYnVmX2xlbikgeworCQkJZHByaW50ayhkZWJ1ZywgIm9ubHkgd3JvdGUgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQkJCXJldCwgc2VuZF9idWZfbGVuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChyZWN2X2J1ZiAhPSBOVUxMKSB7CisjaWZkZWYgVFJBQ0UKKwkJZHByaW50ayhkZWJ1ZywgIndhbnQgdG8gcmVhZDogJWQgYnl0ZXNcbiIsIHJlY3ZfYnVmX2xlbik7CisjZW5kaWYKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShidXNfYWRhcC0+dXNiX2RldiwgMCksCisJCQkJICAgICAgQVMxMDJfVVNCX0RFVklDRV9SWF9DVFJMX0NNRCwKKwkJCQkgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgICAgICBVU0JfUkVDSVBfREVWSUNFLAorCQkJCSAgICAgIGJ1c19hZGFwLT5jbWRfeGlkLCAvKiB2YWx1ZSAqLworCQkJCSAgICAgIDAsIC8qIGluZGV4ICovCisJCQkJICAgICAgcmVjdl9idWYsIHJlY3ZfYnVmX2xlbiwKKwkJCQkgICAgICBVU0JfQ1RSTF9HRVRfVElNRU9VVCAvKiAyMDAgKi8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZHByaW50ayhkZWJ1ZywgInVzYl9jb250cm9sX21zZyhyZWN2KSBmYWlsZWQsIGVyciAlaVxuIiwKKwkJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKyNpZmRlZiBUUkFDRQorCQlkcHJpbnRrKGRlYnVnLCAicmVhZCAlZCBieXRlc1xuIiwgcmVjdl9idWZfbGVuKTsKKyNlbmRpZgorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhczEwMl9zZW5kX2VwMShzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgIHVuc2lnbmVkIGNoYXIgKnNlbmRfYnVmLAorCQkJICBpbnQgc2VuZF9idWZfbGVuLAorCQkJICBpbnQgc3dhcDMyKQoreworCWludCByZXQgPSAwLCBhY3R1YWxfbGVuOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJICAgdXNiX3NuZGJ1bGtwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAxKSwKKwkJCSAgIHNlbmRfYnVmLCBzZW5kX2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAyMDApOworCWlmIChyZXQpIHsKKwkJZHByaW50ayhkZWJ1ZywgInVzYl9idWxrX21zZyhzZW5kKSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWN0dWFsX2xlbiAhPSBzZW5kX2J1Zl9sZW4pIHsKKwkJZHByaW50ayhkZWJ1ZywgIm9ubHkgd3JvdGUgJWQgb2YgJWQgYnl0ZXNcbiIsCisJCQkJYWN0dWFsX2xlbiwgc2VuZF9idWZfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsX2xlbjsKK30KKworc3RhdGljIGludCBhczEwMl9yZWFkX2VwMihzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCSAgIHVuc2lnbmVkIGNoYXIgKnJlY3ZfYnVmLCBpbnQgcmVjdl9idWZfbGVuKQoreworCWludCByZXQgPSAwLCBhY3R1YWxfbGVuOworCisJaWYgKHJlY3ZfYnVmID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGJ1c19hZGFwLT51c2JfZGV2LAorCQkJICAgdXNiX3JjdmJ1bGtwaXBlKGJ1c19hZGFwLT51c2JfZGV2LCAyKSwKKwkJCSAgIHJlY3ZfYnVmLCByZWN2X2J1Zl9sZW4sICZhY3R1YWxfbGVuLCAyMDApOworCWlmIChyZXQpIHsKKwkJZHByaW50ayhkZWJ1ZywgInVzYl9idWxrX21zZyhyZWN2KSBmYWlsZWQsIGVyciAlaVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWN0dWFsX2xlbiAhPSByZWN2X2J1Zl9sZW4pIHsKKwkJZHByaW50ayhkZWJ1ZywgIm9ubHkgcmVhZCAlZCBvZiAlZCBieXRlc1xuIiwKKwkJCQlhY3R1YWxfbGVuLCByZWN2X2J1Zl9sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiByZXQgPyByZXQgOiBhY3R1YWxfbGVuOworfQorCitzdHJ1Y3QgYXMxMDJfcHJpdl9vcHNfdCBhczEwMl9wcml2X29wcyA9IHsKKwkudXBsb2FkX2Z3X3BrdAk9IGFzMTAyX3NlbmRfZXAxLAorCS54ZmVyX2NtZAk9IGFzMTAyX3VzYl94ZmVyX2NtZCwKKwkuYXMxMDJfcmVhZF9lcDIJPSBhczEwMl9yZWFkX2VwMiwKKwkuc3RhcnRfc3RyZWFtCT0gYXMxMDJfdXNiX3N0YXJ0X3N0cmVhbSwKKwkuc3RvcF9zdHJlYW0JPSBhczEwMl91c2Jfc3RvcF9zdHJlYW0sCit9OworCitzdGF0aWMgaW50IGFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKHN0cnVjdCBhczEwMl9kZXZfdCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGVycjsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwKKwkJCSAgZGV2LT5idXNfYWRhcC51c2JfZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUoZGV2LT5idXNfYWRhcC51c2JfZGV2LCAweDIpLAorCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSAgQVMxMDJfVVNCX0JVRl9TSVpFLAorCQkJICBhczEwMl91cmJfc3RyZWFtX2lycSwKKwkJCSAgZGV2KTsKKworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKGVycikKKwkJZHByaW50ayhkZWJ1ZywgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgYXMxMDJfdXJiX3N0cmVhbV9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2ID0gdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJZHZiX2RteF9zd2ZpbHRlcigmYXMxMDJfZGV2LT5kdmJfZG14LAorCQkJCSB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCisJCQltZW1zZXQodXJiLT50cmFuc2Zlcl9idWZmZXIsIDAsIEFTMTAyX1VTQl9CVUZfU0laRSk7CisJfQorCisJLyogaXMgbm90IHN0b3BwZWQsIHJlLXN1Ym1pdCB1cmIgKi8KKwlpZiAoYXMxMDJfZGV2LT5zdHJlYW1pbmcpCisJCWFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKGFzMTAyX2RldiwgdXJiKTsKK30KKworc3RhdGljIHZvaWQgYXMxMDJfZnJlZV91c2Jfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9VUkI7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKGRldi0+c3RyZWFtX3VyYltpXSk7CisKKwl1c2JfZnJlZV9jb2hlcmVudChkZXYtPmJ1c19hZGFwLnVzYl9kZXYsCisJCQlNQVhfU1RSRUFNX1VSQiAqIEFTMTAyX1VTQl9CVUZfU0laRSwKKwkJCWRldi0+c3RyZWFtLAorCQkJZGV2LT5kbWFfYWRkcik7CisJTEVBVkUoKTsKK30KKworc3RhdGljIGludCBhczEwMl9hbGxvY191c2Jfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlkZXYtPnN0cmVhbSA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPmJ1c19hZGFwLnVzYl9kZXYsCisJCQkJICAgICAgIE1BWF9TVFJFQU1fVVJCICogQVMxMDJfVVNCX0JVRl9TSVpFLAorCQkJCSAgICAgICBHRlBfS0VSTkVMLAorCQkJCSAgICAgICAmZGV2LT5kbWFfYWRkcik7CisJaWYgKCFkZXYtPnN0cmVhbSkgeworCQlkcHJpbnRrKGRlYnVnLCAiJXM6IHVzYl9idWZmZXJfYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChkZXYtPnN0cmVhbSwgMCwgTUFYX1NUUkVBTV9VUkIgKiBBUzEwMl9VU0JfQlVGX1NJWkUpOworCisJLyogaW5pdCB1cmIgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX1VSQjsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAodXJiID09IE5VTEwpIHsKKwkJCWRwcmludGsoZGVidWcsICIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWFzMTAyX2ZyZWVfdXNiX3N0cmVhbV9idWZmZXIoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBkZXYtPnN0cmVhbSArIChpICogQVMxMDJfVVNCX0JVRl9TSVpFKTsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gQVMxMDJfVVNCX0JVRl9TSVpFOworCisJCWRldi0+c3RyZWFtX3VyYltpXSA9IHVyYjsKKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhczEwMl91c2Jfc3RvcF9zdHJlYW0oc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9VUkI7IGkrKykKKwkJdXNiX2tpbGxfdXJiKGRldi0+c3RyZWFtX3VyYltpXSk7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfdXNiX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNX1VSQjsgaSsrKSB7CisJCXJldCA9IGFzMTAyX3N1Ym1pdF91cmJfc3RyZWFtKGRldiwgZGV2LT5zdHJlYW1fdXJiW2ldKTsKKwkJaWYgKHJldCkgeworCQkJYXMxMDJfdXNiX3N0b3Bfc3RyZWFtKGRldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCisJRU5URVIoKTsKKworCWFzMTAyX2RldiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYXMxMDJfZGV2X3QsIGtyZWYpOworCWlmIChhczEwMl9kZXYgIT0gTlVMTCkgeworCQl1c2JfcHV0X2RldihhczEwMl9kZXYtPmJ1c19hZGFwLnVzYl9kZXYpOworCQlrZnJlZShhczEwMl9kZXYpOworCX0KKworCUxFQVZFKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzMTAyX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCisJRU5URVIoKTsKKworCS8qIGV4dHJhY3QgYXMxMDJfZGV2X3QgZnJvbSB1c2JfZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCWFzMTAyX2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwkvKiB1bnJlZ2lzdGVyIGR2YiBsYXllciAqLworCWFzMTAyX2R2Yl91bnJlZ2lzdGVyKGFzMTAyX2Rldik7CisKKwkvKiBmcmVlIHVzYiBidWZmZXJzICovCisJYXMxMDJfZnJlZV91c2Jfc3RyZWFtX2J1ZmZlcihhczEwMl9kZXYpOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCS8qIHVzYiB1bnJlZ2lzdGVyIGRldmljZSAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmYXMxMDJfdXNiX2NsYXNzX2RyaXZlcik7CisKKwkvKiBkZWNyZW1lbnQgdXNhZ2UgY291bnRlciAqLworCWtyZWZfcHV0KCZhczEwMl9kZXYtPmtyZWYsIGFzMTAyX3VzYl9yZWxlYXNlKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkXG4iLCBEUklWRVJfTkFNRSk7CisKKwlMRUFWRSgpOworfQorCitzdGF0aWMgaW50IGFzMTAyX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhczEwMl9kZXZfdCAqYXMxMDJfZGV2OworCWludCBpOworCisJRU5URVIoKTsKKworCWFzMTAyX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhczEwMl9kZXZfdCksIEdGUF9LRVJORUwpOworCWlmIChhczEwMl9kZXYgPT0gTlVMTCkgeworCQllcnIoIiVzOiBremFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuICovCisJaWYgKChzaXplb2YoYXMxMDJfdXNiX2lkX3RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCkpICE9CisJICAgIChzaXplb2YoYXMxMDJfZGV2aWNlX25hbWVzKSAvIHNpemVvZihjb25zdCBjaGFyICopKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRldmljZSBuYW1lcyB0YWJsZSBpbnZhbGlkIHNpemUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQXNzaWduIHRoZSB1c2VyLWZyaWVuZGx5IGRldmljZSBuYW1lICovCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YoYXMxMDJfdXNiX2lkX3RhYmxlKSAvCisJCQkgc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKSk7IGkrKykgeworCQlpZiAoaWQgPT0gJmFzMTAyX3VzYl9pZF90YWJsZVtpXSkKKwkJCWFzMTAyX2Rldi0+bmFtZSA9IGFzMTAyX2RldmljZV9uYW1lc1tpXTsKKwl9CisKKwlpZiAoYXMxMDJfZGV2LT5uYW1lID09IE5VTEwpCisJCWFzMTAyX2Rldi0+bmFtZSA9ICJVbmtub3duIEFTMTAyIGRldmljZSI7CisKKwkvKiBzZXQgcHJpdmF0ZSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlhczEwMl9kZXYtPmJ1c19hZGFwLm9wcyA9ICZhczEwMl9wcml2X29wczsKKworCS8qIGluaXQgY21kIHRva2VuIGZvciB1c2IgYnVzICovCisJYXMxMDJfZGV2LT5idXNfYWRhcC5jbWQgPSAmYXMxMDJfZGV2LT5idXNfYWRhcC50b2tlbi51c2IuYzsKKwlhczEwMl9kZXYtPmJ1c19hZGFwLnJzcCA9ICZhczEwMl9kZXYtPmJ1c19hZGFwLnRva2VuLnVzYi5yOworCisJLyogaW5pdCBrZXJuZWwgZGV2aWNlIHJlZmVyZW5jZSAqLworCWtyZWZfaW5pdCgmYXMxMDJfZGV2LT5rcmVmKTsKKworCS8qIHN0b3JlIGFzMTAyIGRldmljZSB0byB1c2JfZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgKHZvaWQgKikgYXMxMDJfZGV2KTsKKworCS8qIHN0b3JlIGluIGFzMTAyIGRldmljZSB0aGUgdXNiX2RldmljZSBwb2ludGVyICovCisJYXMxMDJfZGV2LT5idXNfYWRhcC51c2JfZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJcmV0ID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmYXMxMDJfdXNiX2NsYXNzX2RyaXZlcik7CisJaWYgKHJldCA8IDApIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWVycigiJXM6IHVzYl9yZWdpc3Rlcl9kZXYoKSBmYWlsZWQgKGVycm5vID0gJWQpIiwKKwkJICAgIF9fZnVuY19fLCByZXQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkXG4iLCBEUklWRVJfTkFNRSk7CisKKwkvKiByZXF1ZXN0IGJ1ZmZlciBhbGxvY2F0aW9uIGZvciBzdHJlYW1pbmcgKi8KKwlyZXQgPSBhczEwMl9hbGxvY191c2Jfc3RyZWFtX2J1ZmZlcihhczEwMl9kZXYpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBmYWlsZWQ7CisKKwkvKiByZWdpc3RlciBkdmIgbGF5ZXIgKi8KKwlyZXQgPSBhczEwMl9kdmJfcmVnaXN0ZXIoYXMxMDJfZGV2KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKKworZmFpbGVkOgorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJa2ZyZWUoYXMxMDJfZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzMTAyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IDAsIG1pbm9yID0gMDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IE5VTEw7CisJc3RydWN0IGFzMTAyX2Rldl90ICpkZXYgPSBOVUxMOworCisJRU5URVIoKTsKKworCS8qIHJlYWQgbWlub3IgZnJvbSBpbm9kZSAqLworCW1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCS8qIGZldGNoIGRldmljZSBmcm9tIHVzYiBpbnRlcmZhY2UgKi8KKwlpbnRmID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZhczEwMl91c2JfZHJpdmVyLCBtaW5vcik7CisJaWYgKGludGYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCQkJX19mdW5jX18sIG1pbm9yKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCS8qIGdldCBvdXIgZGV2aWNlICovCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIHNhdmUgb3VyIGRldmljZSBvYmplY3QgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKworZXhpdDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXMxMDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldiA9IE5VTEw7CisKKwlFTlRFUigpOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkZXYgIT0gTlVMTCkgeworCQkvKiBkZWNyZW1lbnQgdGhlIGNvdW50IG9uIG91ciBkZXZpY2UgKi8KKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgYXMxMDJfdXNiX3JlbGVhc2UpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGFzMTAyX3VzYl9pZF90YWJsZSk7CisKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz04IHN3PTggc3RzPTggbm9ldDogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEwMl91c2JfZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfdXNiX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWZjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMDJfdXNiX2Rydi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBfQVMxMDJfVVNCX0RSVl9IXworI2RlZmluZSBfQVMxMDJfVVNCX0RSVl9IXworCisjZGVmaW5lIEFTMTAyX1VTQl9ERVZJQ0VfVFhfQ1RSTF9DTUQJMHhGMQorI2RlZmluZSBBUzEwMl9VU0JfREVWSUNFX1JYX0NUUkxfQ01ECTB4RjIKKworLyogZGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB0aGUgc3VwcG9ydGVkIGRldmljZXMgKi8KKworLyogQWJpbGlzIHN5c3RlbTogIlRJVEFOIiAqLworI2RlZmluZSBBUzEwMl9SRUZFUkVOQ0VfREVTSUdOCQkiQWJpbGlzIFN5c3RlbXMgRFZCLVRpdGFuIgorI2RlZmluZSBBUzEwMl9VU0JfREVWSUNFX1ZFTkRPUl9JRAkweDFCQTYKKyNkZWZpbmUgQVMxMDJfVVNCX0RFVklDRV9QSURfMDAwMQkweDAwMDEKKworLyogUENUViBTeXN0ZW1zOiBQQ1RWIHBpY29TdGljayAoNzRlKSAqLworI2RlZmluZSBBUzEwMl9QQ1RWXzc0RQkJCSJQQ1RWIFN5c3RlbXMgcGljb1N0aWNrICg3NGUpIgorI2RlZmluZSBQQ1RWXzc0RV9VU0JfVklECQkweDIwMTMKKyNkZWZpbmUgUENUVl83NEVfVVNCX1BJRAkJMHgwMjQ2CisKKy8qIEVsZ2F0bzogRXllVFYgRFRUIERlbHV4ZSAqLworI2RlZmluZSBBUzEwMl9FTEdBVE9fRVlFVFZfRFRUX05BTUUJIkVsZ2F0byBFeWVUViBEVFQgRGVsdXhlIgorI2RlZmluZSBFTEdBVE9fRVlFVFZfRFRUX1VTQl9WSUQJMHgwZmQ5CisjZGVmaW5lIEVMR0FUT19FWUVUVl9EVFRfVVNCX1BJRAkweDAwMmMKKworLyogbkJveDogbkJveCBEVkItVCBEb25nbGUgKi8KKyNkZWZpbmUgQVMxMDJfTkJPWF9EVkJUX0RPTkdMRV9OQU1FCSJuQm94IERWQi1UIERvbmdsZSIKKyNkZWZpbmUgTkJPWF9EVkJUX0RPTkdMRV9VU0JfVklECTB4MGI4OQorI2RlZmluZSBOQk9YX0RWQlRfRE9OR0xFX1VTQl9QSUQJMHgwMDA3CisKK3ZvaWQgYXMxMDJfdXJiX3N0cmVhbV9pcnEoc3RydWN0IHVyYiAqdXJiKTsKKworc3RydWN0IGFzMTB4X3VzYl90b2tlbl9jbWRfdCB7CisJLyogdG9rZW4gY21kICovCisJc3RydWN0IGFzMTB4X2NtZF90IGM7CisJLyogdG9rZW4gcmVzcG9uc2UgKi8KKwlzdHJ1Y3QgYXMxMHhfY21kX3QgcjsKK307CisjZW5kaWYKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz04IHN3PTggc3RzPTggbm9ldDogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNiYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZC5jCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIERldmluIEhlaXRtdWVsbGVyIDxkaGVpdG11ZWxsZXJAa2VybmVsbGFicy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTB4X3R5cGVzLmgiCisjaW5jbHVkZSAiYXMxMHhfY21kLmgiCisKKy8qKgorICogYXMxMHhfY21kX3R1cm5fb24gLSBzZW5kIHR1cm4gb24gY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gMCB3aGVuIG5vIGVycm9yLCA8IDAgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF90dXJuX29uKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LnR1cm5fb24ucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LnR1cm5fb24ucmVxLnByb2NfaWQgPSBjcHVfdG9fbGUxNihDT05UUk9MX1BST0NfVFVSTk9OKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLCAodWludDhfdCAqKSBwY21kLAorCQkJCQkgICAgICAgc2l6ZW9mKHBjbWQtPmJvZHkudHVybl9vbi5yZXEpICsKKwkJCQkJICAgICAgIEhFQURFUl9TSVpFLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQkJICAgICAgIHNpemVvZihwcnNwLT5ib2R5LnR1cm5fb24ucnNwKSArCisJCQkJCSAgICAgICBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19UVVJOT05fUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF90dXJuX29mZiAtIHNlbmQgdHVybiBvZmYgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfdHVybl9vZmYoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CisKKwlFTlRFUigpOworCisJcGNtZCA9IHBoYW5kbGUtPmNtZDsKKwlwcnNwID0gcGhhbmRsZS0+cnNwOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJYXMxMHhfY21kX2J1aWxkKHBjbWQsICgrK3BoYW5kbGUtPmNtZF94aWQpLAorCQkJc2l6ZW9mKHBjbWQtPmJvZHkudHVybl9vZmYucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LnR1cm5fb2ZmLnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX1RVUk5PRkYpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKAorCQkJcGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCXNpemVvZihwY21kLT5ib2R5LnR1cm5fb2ZmLnJlcSkgKyBIRUFERVJfU0laRSwKKwkJCSh1aW50OF90ICopIHByc3AsCisJCQlzaXplb2YocHJzcC0+Ym9keS50dXJuX29mZi5yc3ApICsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfVFVSTk9GRl9SU1ApOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYXMxMHhfY21kX3NldF90dW5lIC0gc2VuZCBzZXQgdHVuZSBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEBwdHVuZTogICB0dW5lIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfc2V0X3R1bmUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKnB0dW5lKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnByZXEsICpwcnNwOworCisJRU5URVIoKTsKKworCXByZXEgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwcmVxLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwcmVxLT5ib2R5LnNldF90dW5lLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEucHJvY19pZCA9IGNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TRVRUVU5FKTsKKwlwcmVxLT5ib2R5LnNldF90dW5lLnJlcS5hcmdzLmZyZXEgPSBjcHVfdG9fbGUzMihwdHVuZS0+ZnJlcSk7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5iYW5kd2lkdGggPSBwdHVuZS0+YmFuZHdpZHRoOworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuaGllcl9zZWxlY3QgPSBwdHVuZS0+aGllcl9zZWxlY3Q7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5jb25zdGVsbGF0aW9uID0gcHR1bmUtPmNvbnN0ZWxsYXRpb247CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5oaWVyYXJjaHkgPSBwdHVuZS0+aGllcmFyY2h5OworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuaW50ZXJsZWF2aW5nX21vZGUgID0KKwkJcHR1bmUtPmludGVybGVhdmluZ19tb2RlOworCXByZXEtPmJvZHkuc2V0X3R1bmUucmVxLmFyZ3MuY29kZV9yYXRlICA9IHB0dW5lLT5jb2RlX3JhdGU7CisJcHJlcS0+Ym9keS5zZXRfdHVuZS5yZXEuYXJncy5ndWFyZF9pbnRlcnZhbCA9IHB0dW5lLT5ndWFyZF9pbnRlcnZhbDsKKwlwcmVxLT5ib2R5LnNldF90dW5lLnJlcS5hcmdzLnRyYW5zbWlzc2lvbl9tb2RlICA9CisJCXB0dW5lLT50cmFuc21pc3Npb25fbW9kZTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJlcSwKKwkJCQkJICAgICAgIHNpemVvZihwcmVxLT5ib2R5LnNldF90dW5lLnJlcSkKKwkJCQkJICAgICAgICsgSEVBREVSX1NJWkUsCisJCQkJCSAgICAgICAodWludDhfdCAqKSBwcnNwLAorCQkJCQkgICAgICAgc2l6ZW9mKHByc3AtPmJvZHkuc2V0X3R1bmUucnNwKQorCQkJCQkgICAgICAgKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TRVRUVU5FX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfZ2V0X3R1bmVfc3RhdHVzIC0gc2VuZCBnZXQgdHVuZSBzdGF0dXMgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6IHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAcHN0YXR1czogcG9pbnRlciB0byB1cGRhdGVkIHN0YXR1cyBzdHJ1Y3R1cmUgb2YgdGhlIGN1cnJlbnQgdHVuZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfdHVuZV9zdGF0dXMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgKnBzdGF0dXMpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAgKnByZXEsICpwcnNwOworCisJRU5URVIoKTsKKworCXByZXEgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwcmVxLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwcmVxLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXByZXEtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVFRVTkVTVEFUKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZCgKKwkJCXBoYW5kbGUsCisJCQkodWludDhfdCAqKSBwcmVxLAorCQkJc2l6ZW9mKHByZXEtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJlcSkgKyBIRUFERVJfU0laRSwKKwkJCSh1aW50OF90ICopIHByc3AsCisJCQlzaXplb2YocHJzcC0+Ym9keS5nZXRfdHVuZV9zdGF0dXMucnNwKSArIEhFQURFUl9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IEFTMTBYX0NNRF9FUlJPUjsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHBhcnNlIHJlc3BvbnNlICovCisJZXJyb3IgPSBhczEweF9yc3BfcGFyc2UocHJzcCwgQ09OVFJPTF9QUk9DX0dFVFRVTkVTVEFUX1JTUCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBSZXNwb25zZSBPSyAtPiBnZXQgcmVzcG9uc2UgZGF0YSAqLworCXBzdGF0dXMtPnR1bmVfc3RhdGUgPSBwcnNwLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yc3Auc3RzLnR1bmVfc3RhdGU7CisJcHN0YXR1cy0+c2lnbmFsX3N0cmVuZ3RoICA9CisJCWxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X3R1bmVfc3RhdHVzLnJzcC5zdHMuc2lnbmFsX3N0cmVuZ3RoKTsKKwlwc3RhdHVzLT5QRVIgPSBsZTE2X3RvX2NwdShwcnNwLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yc3Auc3RzLlBFUik7CisJcHN0YXR1cy0+QkVSID0gbGUxNl90b19jcHUocHJzcC0+Ym9keS5nZXRfdHVuZV9zdGF0dXMucnNwLnN0cy5CRVIpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogc2VuZCBnZXQgVFBTIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAcHRwczogICAgICBwb2ludGVyIHRvIFRQUyBwYXJhbWV0ZXJzIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfdHBzKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLCBzdHJ1Y3QgYXMxMHhfdHBzICpwdHBzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF90cHMucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LmdldF90dW5lX3N0YXR1cy5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19HRVRUUFMpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsCisJCQkJCSAgICAgICAodWludDhfdCAqKSBwY21kLAorCQkJCQkgICAgICAgc2l6ZW9mKHBjbWQtPmJvZHkuZ2V0X3Rwcy5yZXEpICsKKwkJCQkJICAgICAgIEhFQURFUl9TSVpFLAorCQkJCQkgICAgICAgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQkJICAgICAgIHNpemVvZihwcnNwLT5ib2R5LmdldF90cHMucnNwKSArCisJCQkJCSAgICAgICBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19HRVRUUFNfUlNQKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJcHRwcy0+Y29uc3RlbGxhdGlvbiA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNvbnN0ZWxsYXRpb247CisJcHRwcy0+aGllcmFyY2h5ID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuaGllcmFyY2h5OworCXB0cHMtPmludGVybGVhdmluZ19tb2RlID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuaW50ZXJsZWF2aW5nX21vZGU7CisJcHRwcy0+Y29kZV9yYXRlX0hQID0gcHJzcC0+Ym9keS5nZXRfdHBzLnJzcC50cHMuY29kZV9yYXRlX0hQOworCXB0cHMtPmNvZGVfcmF0ZV9MUCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNvZGVfcmF0ZV9MUDsKKwlwdHBzLT5ndWFyZF9pbnRlcnZhbCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmd1YXJkX2ludGVydmFsOworCXB0cHMtPnRyYW5zbWlzc2lvbl9tb2RlICA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLnRyYW5zbWlzc2lvbl9tb2RlOworCXB0cHMtPkRWQkhfbWFza19IUCA9IHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLkRWQkhfbWFza19IUDsKKwlwdHBzLT5EVkJIX21hc2tfTFAgPSBwcnNwLT5ib2R5LmdldF90cHMucnNwLnRwcy5EVkJIX21hc2tfTFA7CisJcHRwcy0+Y2VsbF9JRCA9IGxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X3Rwcy5yc3AudHBzLmNlbGxfSUQpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyAtIHNlbmQgZ2V0IGRlbW9kIHN0YXRzIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgICAgICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQHBkZW1vZF9zdGF0czogIHBvaW50ZXIgdG8gZGVtb2Qgc3RhdHMgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBhczEweF9jbWRfZ2V0X2RlbW9kX3N0YXRzKGFzMTB4X2hhbmRsZV90ICAqcGhhbmRsZSwKKwkJCSAgICAgIHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyAqcGRlbW9kX3N0YXRzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXBjbWQtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVF9ERU1PRF9TVEFUUyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwKKwkJCQkodWludDhfdCAqKSBwY21kLAorCQkJCXNpemVvZihwY21kLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwKKwkJCQkodWludDhfdCAqKSBwcnNwLAorCQkJCXNpemVvZihwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19HRVRfREVNT0RfU1RBVFNfUlNQKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJcGRlbW9kX3N0YXRzLT5mcmFtZV9jb3VudCA9CisJCWxlMzJfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJzcC5zdGF0cy5mcmFtZV9jb3VudCk7CisJcGRlbW9kX3N0YXRzLT5iYWRfZnJhbWVfY291bnQgPQorCQlsZTMyX3RvX2NwdShwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3Auc3RhdHMuYmFkX2ZyYW1lX2NvdW50KTsKKwlwZGVtb2Rfc3RhdHMtPmJ5dGVzX2ZpeGVkX2J5X3JzID0KKwkJbGUzMl90b19jcHUocHJzcC0+Ym9keS5nZXRfZGVtb2Rfc3RhdHMucnNwLnN0YXRzLmJ5dGVzX2ZpeGVkX2J5X3JzKTsKKwlwZGVtb2Rfc3RhdHMtPm1lciA9CisJCWxlMTZfdG9fY3B1KHByc3AtPmJvZHkuZ2V0X2RlbW9kX3N0YXRzLnJzcC5zdGF0cy5tZXIpOworCXBkZW1vZF9zdGF0cy0+aGFzX3N0YXJ0ZWQgPQorCQlwcnNwLT5ib2R5LmdldF9kZW1vZF9zdGF0cy5yc3Auc3RhdHMuaGFzX3N0YXJ0ZWQ7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfZ2V0X2ltcHVsc2VfcmVzcCAtIHNlbmQgZ2V0IGltcHVsc2UgcmVzcG9uc2UgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQGlzX3JlYWR5OiBwb2ludGVyIHRvIHZhbHVlIGluZGljYXRpbmcgd2hlbiBpbXB1bHNlCisgKgkgICAgICByZXNwb25zZSBkYXRhIGlzIHJlYWR5CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX2dldF9pbXB1bHNlX3Jlc3AoYXMxMHhfaGFuZGxlX3QgICAgICpwaGFuZGxlLAorCQkJICAgICAgIHVpbnQ4X3QgKmlzX3JlYWR5KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yZXEpKTsKKworCS8qIGZpbGwgY29tbWFuZCAqLworCXBjbWQtPmJvZHkuZ2V0X2ltcHVsc2VfcnNwLnJlcS5wcm9jX2lkID0KKwkJY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0dFVF9JTVBVTFNFX1JFU1ApOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsCisJCQkJCSh1aW50OF90ICopIHBjbWQsCisJCQkJCXNpemVvZihwY21kLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yZXEpCisJCQkJCSsgSEVBREVSX1NJWkUsCisJCQkJCSh1aW50OF90ICopIHByc3AsCisJCQkJCXNpemVvZihwcnNwLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yc3ApCisJCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUF9SU1ApOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogUmVzcG9uc2UgT0sgLT4gZ2V0IHJlc3BvbnNlIGRhdGEgKi8KKwkqaXNfcmVhZHkgPSBwcnNwLT5ib2R5LmdldF9pbXB1bHNlX3JzcC5yc3AuaXNfcmVhZHk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfYnVpbGQgLSBidWlsZCBBUzEweCBjb21tYW5kIGhlYWRlcgorICogQHBjbWQ6ICAgICBwb2ludGVyIHRvIEFTMTB4IGNvbW1hbmQgYnVmZmVyCisgKiBAeGlkOiAgICAgIHNlcXVlbmNlIGlkIG9mIHRoZSBjb21tYW5kCisgKiBAY21kX2xlbjogIGxlbmd0aCBvZiB0aGUgY29tbWFuZAorICovCit2b2lkIGFzMTB4X2NtZF9idWlsZChzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsCisJCSAgICAgdWludDE2X3QgeGlkLCB1aW50MTZfdCBjbWRfbGVuKQoreworCXBjbWQtPmhlYWRlci5yZXFfaWQgPSBjcHVfdG9fbGUxNih4aWQpOworCXBjbWQtPmhlYWRlci5wcm9nID0gY3B1X3RvX2xlMTYoU0VSVklDRV9QUk9HX0lEKTsKKwlwY21kLT5oZWFkZXIudmVyc2lvbiA9IGNwdV90b19sZTE2KFNFUlZJQ0VfUFJPR19WRVJTSU9OKTsKKwlwY21kLT5oZWFkZXIuZGF0YV9sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKK30KKworLyoqCisgKiBhczEweF9yc3BfcGFyc2UgLSBQYXJzZSBjb21tYW5kIHJlc3BvbnNlCisgKiBAcHJzcDogICAgICAgcG9pbnRlciB0byBBUzEweCBjb21tYW5kIGJ1ZmZlcgorICogQHByb2NfaWQ6ICAgIGlkIG9mIHRoZSBjb21tYW5kCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfcnNwX3BhcnNlKHN0cnVjdCBhczEweF9jbWRfdCAqcHJzcCwgdWludDE2X3QgcHJvY19pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBleHRyYWN0IGNvbW1hbmQgZXJyb3IgY29kZSAqLworCWVycm9yID0gcHJzcC0+Ym9keS5jb21tb24ucnNwLmVycm9yOworCisJaWYgKChlcnJvciA9PSAwKSAmJgorCSAgICAobGUxNl90b19jcHUocHJzcC0+Ym9keS5jb21tb24ucnNwLnByb2NfaWQpID09IHByb2NfaWQpKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBBUzEwWF9DTURfRVJST1I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNzE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWQuaApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZiBfQVMxMFhfQ01EX0hfCisjZGVmaW5lIF9BUzEwWF9DTURfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgIE1BQ1JPIERFRklOSVRJT05TICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBUzEwWF9DTURfRVJST1IgLTEKKworI2RlZmluZSBTRVJWSUNFX1BST0dfSUQgICAgICAgIDB4MDAwMgorI2RlZmluZSBTRVJWSUNFX1BST0dfVkVSU0lPTiAgIDB4MDAwMQorCisjZGVmaW5lIEhJRVJfTk9ORSAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBISUVSX0xPV19QUklPUklUWSAgICAgIDB4MDEKKworI2RlZmluZSBIRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpKQorCisvKiBjb250ZXh0IHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0VUX0NPTlRFWFRfREFUQSAgICAgICAgMQorI2RlZmluZSBTRVRfQ09OVEVYVF9EQVRBICAgICAgICAyCisKKy8qIE9EU1Agc3VzcGVuZCBtb2RlcyAqLworI2RlZmluZSBDRkdfTU9ERV9PRFNQX1JFU1VNRSAgMAorI2RlZmluZSBDRkdfTU9ERV9PRFNQX1NVU1BFTkQgMQorCisvKiBEdW1wIG1lbW9yeSBzaXplICovCisjZGVmaW5lIERVTVBfQkxPQ0tfU0laRV9NQVggICAweDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgVFlQRSBERUZJTklUSU9OICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICBDT05UUk9MX1BST0NfVFVSTk9OICAgICAgICAgICAgICAgPSAweDAwMDEsCisgICBDT05UUk9MX1BST0NfVFVSTk9OX1JTUCAgICAgICAgICAgPSAweDAxMDAsCisgICBDT05UUk9MX1BST0NfU0VUX1JFR0lTVEVSICAgICAgICAgPSAweDAwMDIsCisgICBDT05UUk9MX1BST0NfU0VUX1JFR0lTVEVSX1JTUCAgICAgPSAweDAyMDAsCisgICBDT05UUk9MX1BST0NfR0VUX1JFR0lTVEVSICAgICAgICAgPSAweDAwMDMsCisgICBDT05UUk9MX1BST0NfR0VUX1JFR0lTVEVSX1JTUCAgICAgPSAweDAzMDAsCisgICBDT05UUk9MX1BST0NfU0VUVFVORSAgICAgICAgICAgICAgPSAweDAwMEEsCisgICBDT05UUk9MX1BST0NfU0VUVFVORV9SU1AgICAgICAgICAgPSAweDBBMDAsCisgICBDT05UUk9MX1BST0NfR0VUVFVORVNUQVQgICAgICAgICAgPSAweDAwMEIsCisgICBDT05UUk9MX1BST0NfR0VUVFVORVNUQVRfUlNQICAgICAgPSAweDBCMDAsCisgICBDT05UUk9MX1BST0NfR0VUVFBTICAgICAgICAgICAgICAgPSAweDAwMEQsCisgICBDT05UUk9MX1BST0NfR0VUVFBTX1JTUCAgICAgICAgICAgPSAweDBEMDAsCisgICBDT05UUk9MX1BST0NfU0VURklMVEVSICAgICAgICAgICAgPSAweDAwMEUsCisgICBDT05UUk9MX1BST0NfU0VURklMVEVSX1JTUCAgICAgICAgPSAweDBFMDAsCisgICBDT05UUk9MX1BST0NfUkVNT1ZFRklMVEVSICAgICAgICAgPSAweDAwMEYsCisgICBDT05UUk9MX1BST0NfUkVNT1ZFRklMVEVSX1JTUCAgICAgPSAweDBGMDAsCisgICBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUCAgICAgPSAweDAwMTIsCisgICBDT05UUk9MX1BST0NfR0VUX0lNUFVMU0VfUkVTUF9SU1AgPSAweDEyMDAsCisgICBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HICAgICAgPSAweDAwMTMsCisgICBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HX1JTUCAgPSAweDEzMDAsCisgICBDT05UUk9MX1BST0NfU1RPUF9TVFJFQU1JTkcgICAgICAgPSAweDAwMTQsCisgICBDT05UUk9MX1BST0NfU1RPUF9TVFJFQU1JTkdfUlNQICAgPSAweDE0MDAsCisgICBDT05UUk9MX1BST0NfR0VUX0RFTU9EX1NUQVRTICAgICAgPSAweDAwMTUsCisgICBDT05UUk9MX1BST0NfR0VUX0RFTU9EX1NUQVRTX1JTUCAgPSAweDE1MDAsCisgICBDT05UUk9MX1BST0NfRUxOQV9DSEFOR0VfTU9ERSAgICAgPSAweDAwMTYsCisgICBDT05UUk9MX1BST0NfRUxOQV9DSEFOR0VfTU9ERV9SU1AgPSAweDE2MDAsCisgICBDT05UUk9MX1BST0NfT0RTUF9DSEFOR0VfTU9ERSAgICAgPSAweDAwMTcsCisgICBDT05UUk9MX1BST0NfT0RTUF9DSEFOR0VfTU9ERV9SU1AgPSAweDE3MDAsCisgICBDT05UUk9MX1BST0NfQUdDX0NIQU5HRV9NT0RFICAgICAgPSAweDAwMTgsCisgICBDT05UUk9MX1BST0NfQUdDX0NIQU5HRV9NT0RFX1JTUCAgPSAweDE4MDAsCisKKyAgIENPTlRST0xfUFJPQ19DT05URVhUICAgICAgICAgICAgICA9IDB4MDBGQywKKyAgIENPTlRST0xfUFJPQ19DT05URVhUX1JTUCAgICAgICAgICA9IDB4RkMwMCwKKyAgIENPTlRST0xfUFJPQ19EVU1QX01FTU9SWSAgICAgICAgICA9IDB4MDBGRCwKKyAgIENPTlRST0xfUFJPQ19EVU1QX01FTU9SWV9SU1AgICAgICA9IDB4RkQwMCwKKyAgIENPTlRST0xfUFJPQ19EVU1QTE9HX01FTU9SWSAgICAgICA9IDB4MDBGRSwKKyAgIENPTlRST0xfUFJPQ19EVU1QTE9HX01FTU9SWV9SU1AgICA9IDB4RkUwMCwKKyAgIENPTlRST0xfUFJPQ19UVVJOT0ZGICAgICAgICAgICAgICA9IDB4MDBGRiwKKyAgIENPTlRST0xfUFJPQ19UVVJOT0ZGX1JTUCAgICAgICAgICA9IDB4RkYwMAorfSBjb250cm9sX3Byb2M7CisKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IFRVUk5fT047CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyOworICAgfSByc3A7Cit9IFRVUk5fT0ZGOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiB0dW5lIHBhcmFtcyAqLworICAgICAgc3RydWN0IGFzMTB4X3R1bmVfYXJncyBhcmdzOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBTRVRfVFVORTsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIHR1bmUgc3RhdHVzICovCisgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgc3RzOworICAgfSByc3A7Cit9IEdFVF9UVU5FX1NUQVRVUzsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVxdWVzdCBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIHRwcyBkZXRhaWxzICovCisgICAgICBzdHJ1Y3QgYXMxMHhfdHBzIHRwczsKKyAgIH0gcnNwOworfSBHRVRfVFBTOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90ICBwcm9jX2lkOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZXNwb25zZSBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBDT01NT047CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgIHByb2NfaWQ7CisgICAgICAvKiBQSUQgdG8gZmlsdGVyICovCisgICAgICB1aW50MTZfdCAgcGlkOworICAgICAgLyogc3RyZWFtIHR5cGUgKE1QRSwgUFNJL1NJIG9yIFBFUyApKi8KKyAgICAgIHVpbnQ4X3Qgc3RyZWFtX3R5cGU7CisgICAgICAvKiBQSUQgaW5kZXggaW4gZmlsdGVyIHRhYmxlICovCisgICAgICB1aW50OF90IGlkeDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogcmVzcG9uc2UgZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICAgICAvKiBGaWx0ZXIgaWQgKi8KKyAgICAgIHVpbnQ4X3QgZmlsdGVyX2lkOworICAgfSByc3A7Cit9IEFERF9QSURfRklMVEVSOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90ICBwcm9jX2lkOworICAgICAgLyogUElEIHRvIHJlbW92ZSAqLworICAgICAgdWludDE2X3QgIHBpZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogcmVzcG9uc2UgZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gREVMX1BJRF9GSUxURVI7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gU1RBUlRfU1RSRUFNSU5HOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IFNUT1BfU1RSRUFNSU5HOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgICAgLyogZGVtb2Qgc3RhdHMgKi8KKyAgICAgIHN0cnVjdCBhczEweF9kZW1vZF9zdGF0cyBzdGF0czsKKyAgIH0gcnNwOworfSBHRVRfREVNT0RfU1RBVFM7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgIH0gcmVxOworICAgLyogcmVzcG9uc2UgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXNwb25zZSBpZGVudGlmaWVyICovCisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICAgICAvKiBpbXB1bHNlIHJlc3BvbnNlIHJlYWR5ICovCisgICAgICB1aW50OF90IGlzX3JlYWR5OworICAgfSByc3A7Cit9IEdFVF9JTVBVTFNFX1JFU1A7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIHZhbHVlIHRvIHdyaXRlIChmb3Igc2V0IGNvbnRleHQpKi8KKyAgICAgIHN0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSByZWdfdmFsOworICAgICAgLyogY29udGV4dCB0YWcgKi8KKyAgICAgIHVpbnQxNl90IHRhZzsKKyAgICAgIC8qIGNvbnRleHQgcmVxdWVzdCB0eXBlICovCisgICAgICB1aW50MTZfdCB0eXBlOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiB2YWx1ZSByZWFkIChmb3IgZ2V0IGNvbnRleHQpICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfdmFsdWUgcmVnX3ZhbDsKKyAgICAgIC8qIGNvbnRleHQgcmVxdWVzdCB0eXBlICovCisgICAgICB1aW50MTZfdCB0eXBlOworICAgICAgLyogZXJyb3IgKi8KKyAgICAgIHVpbnQ4X3QgZXJyb3I7CisgICB9IHJzcDsKK30gRldfQ09OVEVYVDsKKwordHlwZWRlZiB1bmlvbiB7CisgICAvKiByZXF1ZXN0ICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIHJlZ2lzdGVyIGRlc2NyaXB0aW9uICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfYWRkciByZWdfYWRkcjsKKyAgICAgIC8qIHJlZ2lzdGVyIGNvbnRlbnQgKi8KKyAgICAgIHN0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSByZWdfdmFsOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgIH0gcnNwOworfSBTRVRfUkVHSVNURVI7CisKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiByZWdpc3RlciBkZXNjcmlwdGlvbiAqLworICAgICAgc3RydWN0IGFzMTB4X3JlZ2lzdGVyX2FkZHIgcmVnX2FkZHI7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgICAgLyogcmVnaXN0ZXIgY29udGVudCAqLworICAgICAgc3RydWN0IGFzMTB4X3JlZ2lzdGVyX3ZhbHVlIHJlZ192YWw7CisgICB9IHJzcDsKK30gR0VUX1JFR0lTVEVSOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBtb2RlICovCisgICAgICB1aW50OF90IG1vZGU7CisgICB9IHJlcTsKKyAgIC8qIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgeworICAgICAgLyogcmVzcG9uc2UgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGVycm9yICovCisgICAgICB1aW50OF90IGVycm9yOworICAgfSByc3A7Cit9IENGR19DSEFOR0VfTU9ERTsKKworc3RydWN0IGFzMTB4X2NtZF9oZWFkZXJfdCB7CisgICB1aW50MTZfdCByZXFfaWQ7CisgICB1aW50MTZfdCBwcm9nOworICAgdWludDE2X3QgdmVyc2lvbjsKKyAgIHVpbnQxNl90IGRhdGFfbGVuOworfTsKKworI2RlZmluZSBEVU1QX0JMT0NLX1NJWkUgMTYKK3R5cGVkZWYgdW5pb24geworICAgLyogcmVxdWVzdCAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlcXVlc3QgaWRlbnRpZmllciAqLworICAgICAgdWludDE2X3QgcHJvY19pZDsKKyAgICAgIC8qIGR1bXAgbWVtb3J5IHR5cGUgcmVxdWVzdCAqLworICAgICAgdWludDhfdCBkdW1wX3JlcTsKKyAgICAgIC8qIHJlZ2lzdGVyIGRlc2NyaXB0aW9uICovCisgICAgICBzdHJ1Y3QgYXMxMHhfcmVnaXN0ZXJfYWRkciByZWdfYWRkcjsKKyAgICAgIC8qIG5iIGJsb2NrcyB0byByZWFkICovCisgICAgICB1aW50MTZfdCBudW1fYmxvY2tzOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIC8qIHJlc3BvbnNlIGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIGR1bXAgcmVzcG9uc2UgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yc3A7CisgICAgICAvKiBkYXRhICovCisgICAgICB1bmlvbiB7CisJIHVpbnQ4X3QgIGRhdGE4W0RVTVBfQkxPQ0tfU0laRV07CisJIHVpbnQxNl90IGRhdGExNltEVU1QX0JMT0NLX1NJWkUgLyBzaXplb2YodWludDE2X3QpXTsKKwkgdWludDMyX3QgZGF0YTMyW0RVTVBfQkxPQ0tfU0laRSAvIHNpemVvZih1aW50MzJfdCldOworICAgICAgfSB1OworICAgfSByc3A7Cit9IERVTVBfTUVNT1JZOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBkdW1wIG1lbW9yeSB0eXBlIHJlcXVlc3QgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yZXE7CisgICB9IHJlcTsKKyAgIHN0cnVjdCB7CisgICAgICAvKiByZXF1ZXN0IGlkZW50aWZpZXIgKi8KKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICAvKiBlcnJvciAqLworICAgICAgdWludDhfdCBlcnJvcjsKKyAgICAgIC8qIGR1bXAgcmVzcG9uc2UgKi8KKyAgICAgIHVpbnQ4X3QgZHVtcF9yc3A7CisgICAgICAvKiBkdW1wIGRhdGEgKi8KKyAgICAgIHVpbnQ4X3QgZGF0YVtEVU1QX0JMT0NLX1NJWkVdOworICAgfSByc3A7Cit9IERVTVBMT0dfTUVNT1JZOworCit0eXBlZGVmIHVuaW9uIHsKKyAgIC8qIHJlcXVlc3QgKi8KKyAgIHN0cnVjdCB7CisgICAgICB1aW50MTZfdCBwcm9jX2lkOworICAgICAgdWludDhfdCBkYXRhWzY0IC0gc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpIC0yIC8qIHByb2NfaWQgKi9dOworICAgfSByZXE7CisgICAvKiByZXNwb25zZSAqLworICAgc3RydWN0IHsKKyAgICAgIHVpbnQxNl90IHByb2NfaWQ7CisgICAgICB1aW50OF90IGVycm9yOworICAgICAgdWludDhfdCBkYXRhWzY0IC0gc2l6ZW9mKHN0cnVjdCBhczEweF9jbWRfaGVhZGVyX3QpIC8qIGhlYWRlciAqLworCQkgICAgICAtIDIgLyogcHJvY19pZCAqLyAtIDEgLyogcmMgKi9dOworICAgfSByc3A7Cit9IFJBV19EQVRBOworCitzdHJ1Y3QgYXMxMHhfY21kX3QgeworICAgLyogaGVhZGVyICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX2hlYWRlcl90IGhlYWRlcjsKKyAgIC8qIGJvZHkgKi8KKyAgIHVuaW9uIHsKKyAgICAgIFRVUk5fT04gICAgICAgICAgIHR1cm5fb247CisgICAgICBUVVJOX09GRiAgICAgICAgICB0dXJuX29mZjsKKyAgICAgIFNFVF9UVU5FICAgICAgICAgIHNldF90dW5lOworICAgICAgR0VUX1RVTkVfU1RBVFVTICAgZ2V0X3R1bmVfc3RhdHVzOworICAgICAgR0VUX1RQUyAgICAgICAgICAgZ2V0X3RwczsKKyAgICAgIENPTU1PTiAgICAgICAgICAgIGNvbW1vbjsKKyAgICAgIEFERF9QSURfRklMVEVSICAgIGFkZF9waWRfZmlsdGVyOworICAgICAgREVMX1BJRF9GSUxURVIgICAgZGVsX3BpZF9maWx0ZXI7CisgICAgICBTVEFSVF9TVFJFQU1JTkcgICBzdGFydF9zdHJlYW1pbmc7CisgICAgICBTVE9QX1NUUkVBTUlORyAgICBzdG9wX3N0cmVhbWluZzsKKyAgICAgIEdFVF9ERU1PRF9TVEFUUyAgIGdldF9kZW1vZF9zdGF0czsKKyAgICAgIEdFVF9JTVBVTFNFX1JFU1AgIGdldF9pbXB1bHNlX3JzcDsKKyAgICAgIEZXX0NPTlRFWFQgICAgICAgIGNvbnRleHQ7CisgICAgICBTRVRfUkVHSVNURVIgICAgICBzZXRfcmVnaXN0ZXI7CisgICAgICBHRVRfUkVHSVNURVIgICAgICBnZXRfcmVnaXN0ZXI7CisgICAgICBDRkdfQ0hBTkdFX01PREUgICBjZmdfY2hhbmdlX21vZGU7CisgICAgICBEVU1QX01FTU9SWSAgICAgICBkdW1wX21lbW9yeTsKKyAgICAgIERVTVBMT0dfTUVNT1JZICAgIGR1bXBsb2dfbWVtb3J5OworICAgICAgUkFXX0RBVEEgICAgICAgICAgcmF3X2RhdGE7CisgICB9IGJvZHk7Cit9OworCitzdHJ1Y3QgYXMxMHhfdG9rZW5fY21kX3QgeworICAgLyogdG9rZW4gY21kICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX3QgYzsKKyAgIC8qIHRva2VuIHJlc3BvbnNlICovCisgICBzdHJ1Y3QgYXMxMHhfY21kX3QgcjsKK307CisjcHJhZ21hIHBhY2soKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OIERFQ0xBUkFUSU9OICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhczEweF9jbWRfYnVpbGQoc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCB1aW50MTZfdCBwcm9jX2lkLAorCQkgICAgICB1aW50MTZfdCBjbWRfbGVuKTsKK2ludCBhczEweF9yc3BfcGFyc2Uoc3RydWN0IGFzMTB4X2NtZF90ICpyLCB1aW50MTZfdCBwcm9jX2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBhczEweCBjbWQgKi8KK2ludCBhczEweF9jbWRfdHVybl9vbihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSk7CitpbnQgYXMxMHhfY21kX3R1cm5fb2ZmKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKTsKKworaW50IGFzMTB4X2NtZF9zZXRfdHVuZShhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJICAgICAgIHN0cnVjdCBhczEweF90dW5lX2FyZ3MgKnB0dW5lKTsKKworaW50IGFzMTB4X2NtZF9nZXRfdHVuZV9zdGF0dXMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgKnBzdGF0dXMpOworCitpbnQgYXMxMHhfY21kX2dldF90cHMoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCSAgICAgIHN0cnVjdCBhczEweF90cHMgKnB0cHMpOworCitpbnQgYXMxMHhfY21kX2dldF9kZW1vZF9zdGF0cyhhczEweF9oYW5kbGVfdCAgKnBoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3QgYXMxMHhfZGVtb2Rfc3RhdHMgKnBkZW1vZF9zdGF0cyk7CisKK2ludCBhczEweF9jbWRfZ2V0X2ltcHVsc2VfcmVzcChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgICB1aW50OF90ICppc19yZWFkeSk7CisKKy8qIGFzMTB4IGNtZCBzdHJlYW0gKi8KK2ludCBhczEweF9jbWRfYWRkX1BJRF9maWx0ZXIoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBhczEweF90c19maWx0ZXIgKmZpbHRlcik7CitpbnQgYXMxMHhfY21kX2RlbF9QSURfZmlsdGVyKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLAorCQkJICAgICB1aW50MTZfdCBwaWRfdmFsdWUpOworCitpbnQgYXMxMHhfY21kX3N0YXJ0X3N0cmVhbWluZyhhczEweF9oYW5kbGVfdCAqcGhhbmRsZSk7CitpbnQgYXMxMHhfY21kX3N0b3Bfc3RyZWFtaW5nKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKTsKKworLyogYXMxMHggY21kIGNmZyAqLworaW50IGFzMTB4X2NtZF9zZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCB2YWx1ZSk7CitpbnQgYXMxMHhfY21kX2dldF9jb250ZXh0KGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlLAorCQkJICB1aW50MTZfdCB0YWcsCisJCQkgIHVpbnQzMl90ICpwdmFsdWUpOworCitpbnQgYXMxMHhfY21kX2VMTkFfY2hhbmdlX21vZGUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHVpbnQ4X3QgbW9kZSk7CitpbnQgYXMxMHhfY29udGV4dF9yc3BfcGFyc2Uoc3RydWN0IGFzMTB4X2NtZF90ICpwcnNwLCB1aW50MTZfdCBwcm9jX2lkKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKy8qIEVPRiAtIHZpbTogc2V0IHRleHR3aWR0aD04MCB0cz0zIHN3PTMgc3RzPTMgZXQ6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfY21kX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZmNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9jZmcuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIEFiaWxpcyBTeXN0ZW1zIFNpbmdsZSBEVkItVCBSZWNlaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA4IFBpZXJyaWNrIEhhc2NvZXQgPHBpZXJyaWNrLmhhc2NvZXRAYWJpbGlzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAiYXMxMDJfZHJ2LmgiCisjaW5jbHVkZSAiYXMxMHhfdHlwZXMuaCIKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OIERFRklOSVRJT04gICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGFzMTB4X2NtZF9nZXRfY29udGV4dCAtIFNlbmQgZ2V0IGNvbnRleHQgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEB0YWc6ICAgICAgIGNvbnRleHQgdGFnCisgKiBAcHZhbHVlOiAgICBwb2ludGVyIHdoZXJlIHRvIHN0b3JlIGNvbnRleHQgdmFsdWUgcmVhZAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9nZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCAqcHZhbHVlKQoreworCWludCAgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0NPTlRFWFQpOworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEudGFnID0gY3B1X3RvX2xlMTYodGFnKTsKKwlwY21kLT5ib2R5LmNvbnRleHQucmVxLnR5cGUgPSBjcHVfdG9fbGUxNihHRVRfQ09OVEVYVF9EQVRBKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yICA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwKKwkJCQkJCSh1aW50OF90ICopIHBjbWQsCisJCQkJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkKKwkJCQkJCSsgSEVBREVSX1NJWkUsCisJCQkJCQkodWludDhfdCAqKSBwcnNwLAorCQkJCQkJc2l6ZW9mKHByc3AtPmJvZHkuY29udGV4dC5yc3ApCisJCQkJCQkrIEhFQURFUl9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IEFTMTBYX0NNRF9FUlJPUjsKKwl9CisKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHBhcnNlIHJlc3BvbnNlOiBjb250ZXh0IGNvbW1hbmQgZG8gbm90IGZvbGxvdyB0aGUgY29tbW9uIHJlc3BvbnNlICovCisJLyogc3RydWN0dXJlIC0+IHNwZWNpZmljIGhhbmRsaW5nIHJlc3BvbnNlIHBhcnNlIHJlcXVpcmVkICAgICAgICAgICAgKi8KKwllcnJvciA9IGFzMTB4X2NvbnRleHRfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19DT05URVhUX1JTUCk7CisKKwlpZiAoZXJyb3IgPT0gMCkgeworCQkvKiBSZXNwb25zZSBPSyAtPiBnZXQgcmVzcG9uc2UgZGF0YSAqLworCQkqcHZhbHVlID0gbGUzMl90b19jcHUocHJzcC0+Ym9keS5jb250ZXh0LnJzcC5yZWdfdmFsLnUudmFsdWUzMik7CisJCS8qIHZhbHVlIHJldHVybmVkIGlzIGFsd2F5cyBhIDMyLWJpdCB2YWx1ZSAqLworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9zZXRfY29udGV4dCAtIHNlbmQgc2V0IGNvbnRleHQgY29tbWFuZCB0byBBUzEweAorICogQHBoYW5kbGU6ICAgcG9pbnRlciB0byBBUzEweCBoYW5kbGUKKyAqIEB0YWc6ICAgICAgIGNvbnRleHQgdGFnCisgKiBAdmFsdWU6ICAgICB2YWx1ZSB0byBzZXQgaW4gY29udGV4dAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9zZXRfY29udGV4dChhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwgdWludDE2X3QgdGFnLAorCQkJICB1aW50MzJfdCB2YWx1ZSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jb250ZXh0LnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS5wcm9jX2lkID0gY3B1X3RvX2xlMTYoQ09OVFJPTF9QUk9DX0NPTlRFWFQpOworCS8qIHBjbWQtPmJvZHkuY29udGV4dC5yZXEucmVnX3ZhbC5tb2RlIGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZCAqLworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEucmVnX3ZhbC51LnZhbHVlMzIgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisJcGNtZC0+Ym9keS5jb250ZXh0LnJlcS50YWcgPSBjcHVfdG9fbGUxNih0YWcpOworCXBjbWQtPmJvZHkuY29udGV4dC5yZXEudHlwZSA9IGNwdV90b19sZTE2KFNFVF9DT05URVhUX0RBVEEpOworCisJLyogc2VuZCBjb21tYW5kICovCisJaWYgKHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQpIHsKKwkJZXJyb3IgID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLAorCQkJCQkJKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQkJCXNpemVvZihwY21kLT5ib2R5LmNvbnRleHQucmVxKQorCQkJCQkJKyBIRUFERVJfU0laRSwKKwkJCQkJCSh1aW50OF90ICopIHByc3AsCisJCQkJCQlzaXplb2YocHJzcC0+Ym9keS5jb250ZXh0LnJzcCkKKwkJCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2U6IGNvbnRleHQgY29tbWFuZCBkbyBub3QgZm9sbG93IHRoZSBjb21tb24gcmVzcG9uc2UgKi8KKwkvKiBzdHJ1Y3R1cmUgLT4gc3BlY2lmaWMgaGFuZGxpbmcgcmVzcG9uc2UgcGFyc2UgcmVxdWlyZWQgICAgICAgICAgICAqLworCWVycm9yID0gYXMxMHhfY29udGV4dF9yc3BfcGFyc2UocHJzcCwgQ09OVFJPTF9QUk9DX0NPTlRFWFRfUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9lTE5BX2NoYW5nZV9tb2RlIC0gc2VuZCBlTE5BIGNoYW5nZSBtb2RlIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKiBAbW9kZTogICAgICBtb2RlIHNlbGVjdGVkOgorICoJICAgICAgICAtIE9OICAgIDogMHgwID0+IGVMTkEgYWx3YXlzIE9OCisgKgkgICAgICAgIC0gT0ZGICAgOiAweDEgPT4gZUxOQSBhbHdheXMgT0ZGCisgKgkgICAgICAgIC0gQVVUTyAgOiAweDIgPT4gZUxOQSBmb2xsb3cgaHlzdGVyZXNpcyBwYXJhbWV0ZXJzCisgKgkJCQkgdG8gYmUgT04gb3IgT0ZGCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX2VMTkFfY2hhbmdlX21vZGUoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUsIHVpbnQ4X3QgbW9kZSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGFzMTB4X2NtZF90ICpwY21kLCAqcHJzcDsKKworCUVOVEVSKCk7CisKKwlwY21kID0gcGhhbmRsZS0+Y21kOworCXByc3AgPSBwaGFuZGxlLT5yc3A7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwlhczEweF9jbWRfYnVpbGQocGNtZCwgKCsrcGhhbmRsZS0+Y21kX3hpZCksCisJCQlzaXplb2YocGNtZC0+Ym9keS5jZmdfY2hhbmdlX21vZGUucmVxKSk7CisKKwkvKiBmaWxsIGNvbW1hbmQgKi8KKwlwY21kLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19FTE5BX0NIQU5HRV9NT0RFKTsKKwlwY21kLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yZXEubW9kZSA9IG1vZGU7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciAgPSBwaGFuZGxlLT5vcHMtPnhmZXJfY21kKHBoYW5kbGUsICh1aW50OF90ICopIHBjbWQsCisJCQkJc2l6ZW9mKHBjbWQtPmJvZHkuY2ZnX2NoYW5nZV9tb2RlLnJlcSkKKwkJCQkrIEhFQURFUl9TSVpFLCAodWludDhfdCAqKSBwcnNwLAorCQkJCXNpemVvZihwcnNwLT5ib2R5LmNmZ19jaGFuZ2VfbW9kZS5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19FTE5BX0NIQU5HRV9NT0RFX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jb250ZXh0X3JzcF9wYXJzZSAtIFBhcnNlIGNvbnRleHQgY29tbWFuZCByZXNwb25zZQorICogQHByc3A6ICAgICAgIHBvaW50ZXIgdG8gQVMxMHggY29tbWFuZCByZXNwb25zZSBidWZmZXIKKyAqIEBwcm9jX2lkOiAgICBpZCBvZiB0aGUgY29tbWFuZAorICoKKyAqIFNpbmNlIHRoZSBjb250ZXggY29tbWFuZCByZXBvbnNlIGRvZXMgbm90IGZvbGxvdyB0aGUgY29tbW9uCisgKiByZXNwb25zZSwgYSBzcGVjaWZpYyBwYXJzZSBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NvbnRleHRfcnNwX3BhcnNlKHN0cnVjdCBhczEweF9jbWRfdCAqcHJzcCwgdWludDE2X3QgcHJvY19pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJzcC0+Ym9keS5jb250ZXh0LnJzcC5lcnJvcjsKKworCWlmICgoZXJyID09IDApICYmCisJICAgIChsZTE2X3RvX2NwdShwcnNwLT5ib2R5LmNvbnRleHQucnNwLnByb2NfaWQpID09IHByb2NfaWQpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gQVMxMFhfQ01EX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X2NtZF9zdHJlYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1YzcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9jbWRfc3RyZWFtLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBBYmlsaXMgU3lzdGVtcyBTaW5nbGUgRFZCLVQgUmVjZWl2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQaWVycmljayBIYXNjb2V0IDxwaWVycmljay5oYXNjb2V0QGFiaWxpcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgImFzMTAyX2Rydi5oIgorI2luY2x1ZGUgImFzMTB4X2NtZC5oIgorCisvKioKKyAqIGFzMTB4X2NtZF9hZGRfUElEX2ZpbHRlciAtIHNlbmQgYWRkIGZpbHRlciBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQGZpbHRlcjogICAgVFNGaWx0ZXIgZmlsdGVyIGZvciBEVkItVAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9hZGRfUElEX2ZpbHRlcihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgc3RydWN0IGFzMTB4X3RzX2ZpbHRlciAqZmlsdGVyKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TRVRGSUxURVIpOworCXBjbWQtPmJvZHkuYWRkX3BpZF9maWx0ZXIucmVxLnBpZCA9IGNwdV90b19sZTE2KGZpbHRlci0+cGlkKTsKKwlwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcS5zdHJlYW1fdHlwZSA9IGZpbHRlci0+dHlwZTsKKworCWlmIChmaWx0ZXItPmlkeCA8IDE2KQorCQlwY21kLT5ib2R5LmFkZF9waWRfZmlsdGVyLnJlcS5pZHggPSBmaWx0ZXItPmlkeDsKKwllbHNlCisJCXBjbWQtPmJvZHkuYWRkX3BpZF9maWx0ZXIucmVxLmlkeCA9IDB4RkY7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TRVRGSUxURVJfUlNQKTsKKworCWlmIChlcnJvciA9PSAwKSB7CisJCS8qIFJlc3BvbnNlIE9LIC0+IGdldCByZXNwb25zZSBkYXRhICovCisJCWZpbHRlci0+aWR4ID0gcHJzcC0+Ym9keS5hZGRfcGlkX2ZpbHRlci5yc3AuZmlsdGVyX2lkOworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9kZWxfUElEX2ZpbHRlciAtIFNlbmQgZGVsZXRlIGZpbHRlciBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICAgICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICogQHBpZF92YWx1ZTogICAgUElEIHRvIGRlbGV0ZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9kZWxfUElEX2ZpbHRlcihhczEweF9oYW5kbGVfdCAqcGhhbmRsZSwKKwkJCSAgICAgdWludDE2X3QgcGlkX3ZhbHVlKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LmRlbF9waWRfZmlsdGVyLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19SRU1PVkVGSUxURVIpOworCXBjbWQtPmJvZHkuZGVsX3BpZF9maWx0ZXIucmVxLnBpZCA9IGNwdV90b19sZTE2KHBpZF92YWx1ZSk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5kZWxfcGlkX2ZpbHRlci5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19SRU1PVkVGSUxURVJfUlNQKTsKKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGFzMTB4X2NtZF9zdGFydF9zdHJlYW1pbmcgLSBTZW5kIHN0YXJ0IHN0cmVhbWluZyBjb21tYW5kIHRvIEFTMTB4CisgKiBAcGhhbmRsZTogICBwb2ludGVyIHRvIEFTMTB4IGhhbmRsZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50IGFzMTB4X2NtZF9zdGFydF9zdHJlYW1pbmcoYXMxMHhfaGFuZGxlX3QgKnBoYW5kbGUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBhczEweF9jbWRfdCAqcGNtZCwgKnByc3A7CisKKwlFTlRFUigpOworCisJcGNtZCA9IHBoYW5kbGUtPmNtZDsKKwlwcnNwID0gcGhhbmRsZS0+cnNwOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJYXMxMHhfY21kX2J1aWxkKHBjbWQsICgrK3BoYW5kbGUtPmNtZF94aWQpLAorCQkJc2l6ZW9mKHBjbWQtPmJvZHkuc3RhcnRfc3RyZWFtaW5nLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5zdGFydF9zdHJlYW1pbmcucmVxLnByb2NfaWQgPQorCQljcHVfdG9fbGUxNihDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HKTsKKworCS8qIHNlbmQgY29tbWFuZCAqLworCWlmIChwaGFuZGxlLT5vcHMtPnhmZXJfY21kKSB7CisJCWVycm9yID0gcGhhbmRsZS0+b3BzLT54ZmVyX2NtZChwaGFuZGxlLCAodWludDhfdCAqKSBwY21kLAorCQkJCXNpemVvZihwY21kLT5ib2R5LnN0YXJ0X3N0cmVhbWluZy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5zdGFydF9zdHJlYW1pbmcucnNwKQorCQkJCSsgSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCWVycm9yID0gQVMxMFhfQ01EX0VSUk9SOworCX0KKworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJLyogcGFyc2UgcmVzcG9uc2UgKi8KKwllcnJvciA9IGFzMTB4X3JzcF9wYXJzZShwcnNwLCBDT05UUk9MX1BST0NfU1RBUlRfU1RSRUFNSU5HX1JTUCk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBhczEweF9jbWRfc3RvcF9zdHJlYW1pbmcgLSBTZW5kIHN0b3Agc3RyZWFtaW5nIGNvbW1hbmQgdG8gQVMxMHgKKyAqIEBwaGFuZGxlOiAgIHBvaW50ZXIgdG8gQVMxMHggaGFuZGxlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgYXMxMHhfY21kX3N0b3Bfc3RyZWFtaW5nKGFzMTB4X2hhbmRsZV90ICpwaGFuZGxlKQoreworCWludDhfdCBlcnJvcjsKKwlzdHJ1Y3QgYXMxMHhfY21kX3QgKnBjbWQsICpwcnNwOworCisJRU5URVIoKTsKKworCXBjbWQgPSBwaGFuZGxlLT5jbWQ7CisJcHJzcCA9IHBoYW5kbGUtPnJzcDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWFzMTB4X2NtZF9idWlsZChwY21kLCAoKytwaGFuZGxlLT5jbWRfeGlkKSwKKwkJCXNpemVvZihwY21kLT5ib2R5LnN0b3Bfc3RyZWFtaW5nLnJlcSkpOworCisJLyogZmlsbCBjb21tYW5kICovCisJcGNtZC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yZXEucHJvY19pZCA9CisJCWNwdV90b19sZTE2KENPTlRST0xfUFJPQ19TVE9QX1NUUkVBTUlORyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgKi8KKwlpZiAocGhhbmRsZS0+b3BzLT54ZmVyX2NtZCkgeworCQllcnJvciA9IHBoYW5kbGUtPm9wcy0+eGZlcl9jbWQocGhhbmRsZSwgKHVpbnQ4X3QgKikgcGNtZCwKKwkJCQlzaXplb2YocGNtZC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yZXEpCisJCQkJKyBIRUFERVJfU0laRSwgKHVpbnQ4X3QgKikgcHJzcCwKKwkJCQlzaXplb2YocHJzcC0+Ym9keS5zdG9wX3N0cmVhbWluZy5yc3ApCisJCQkJKyBIRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBBUzEwWF9DTURfRVJST1I7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXJzZSByZXNwb25zZSAqLworCWVycm9yID0gYXMxMHhfcnNwX3BhcnNlKHByc3AsIENPTlRST0xfUFJPQ19TVE9QX1NUUkVBTUlOR19SU1ApOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYXMxMDIvYXMxMHhfaGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMWE3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF9oYW5kbGUuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3Q7CitzdHJ1Y3QgYXMxMDJfZGV2X3Q7CisKKyNkZWZpbmUgYXMxMHhfaGFuZGxlX3Qgc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QKKyNpbmNsdWRlICJhczEweF9jbWQuaCIKKworLyogdmFsdWVzIGZvciAibW9kZSIgZmllbGQgKi8KKyNkZWZpbmUgUkVHTU9ERTggICAgICAgICA4CisjZGVmaW5lIFJFR01PREUxNiAgICAgICAgMTYKKyNkZWZpbmUgUkVHTU9ERTMyICAgICAgICAzMgorCitzdHJ1Y3QgYXMxMDJfcHJpdl9vcHNfdCB7CisJaW50ICgqdXBsb2FkX2Z3X3BrdCkgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHN3YXAzMik7CisKKwlpbnQgKCpzZW5kX2NtZCkgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pOworCisJaW50ICgqeGZlcl9jbWQpIChzdHJ1Y3QgYXMxMDJfYnVzX2FkYXB0ZXJfdCAqYnVzX2FkYXAsCisJCQkgdW5zaWduZWQgY2hhciAqc2VuZF9idWYsIGludCBzZW5kX2J1Zl9sZW4sCisJCQkgdW5zaWduZWQgY2hhciAqcmVjdl9idWYsIGludCByZWN2X2J1Zl9sZW4pOworLyoKKwlpbnQgKCpwaWRfZmlsdGVyKSAoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwLAorCQkJICAgaW50IGluZGV4LCB1MTYgcGlkLCBpbnQgb25vZmYpOworKi8KKwlpbnQgKCpzdGFydF9zdHJlYW0pIChzdHJ1Y3QgYXMxMDJfZGV2X3QgKmRldik7CisJdm9pZCAoKnN0b3Bfc3RyZWFtKSAoc3RydWN0IGFzMTAyX2Rldl90ICpkZXYpOworCisJaW50ICgqcmVzZXRfdGFyZ2V0KSAoc3RydWN0IGFzMTAyX2J1c19hZGFwdGVyX3QgKmJ1c19hZGFwKTsKKworCWludCAoKnJlYWRfd3JpdGUpKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwgdWludDhfdCBtb2RlLAorCQkJICB1aW50MzJfdCByZF9hZGRyLCB1aW50MTZfdCByZF9sZW4sCisJCQkgIHVpbnQzMl90IHdyX2FkZHIsIHVpbnQxNl90IHdyX2xlbik7CisKKwlpbnQgKCphczEwMl9yZWFkX2VwMikgKHN0cnVjdCBhczEwMl9idXNfYWRhcHRlcl90ICpidXNfYWRhcCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpyZWN2X2J1ZiwKKwkJCSAgICAgICBpbnQgcmVjdl9idWZfbGVuKTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2FzMTAyL2FzMTB4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlZGIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9hczEwMi9hczEweF90eXBlcy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQWJpbGlzIFN5c3RlbXMgU2luZ2xlIERWQi1UIFJlY2VpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUGllcnJpY2sgSGFzY29ldCA8cGllcnJpY2suaGFzY29ldEBhYmlsaXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIF9BUzEwWF9UWVBFU19IXworI2RlZmluZSBfQVMxMFhfVFlQRVNfSF8KKworI2luY2x1ZGUgImFzMTB4X2hhbmRsZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgTUFDUk8gREVGSU5JVElPTlMgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGJhbmR3aWR0aCBjb25zdGFudCB2YWx1ZXMgKi8KKyNkZWZpbmUgQldfNV9NSFogICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQldfNl9NSFogICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQldfN19NSFogICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQldfOF9NSFogICAgICAgICAgIDB4MDMKKworLyogaGllcmFyY2h5IHByaW9yaXR5IHNlbGVjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgSElFUl9OT19QUklPUklUWSAgIDB4MDAKKyNkZWZpbmUgSElFUl9MT1dfUFJJT1JJVFkgIDB4MDEKKyNkZWZpbmUgSElFUl9ISUdIX1BSSU9SSVRZIDB4MDIKKworLyogY29uc3RlbGxhdGlvbiBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIENPTlNUX1FQU0sgICAgICAgICAweDAwCisjZGVmaW5lIENPTlNUX1FBTTE2ICAgICAgICAweDAxCisjZGVmaW5lIENPTlNUX1FBTTY0ICAgICAgICAweDAyCisjZGVmaW5lIENPTlNUX1VOS05PV04gICAgICAweEZGCisKKy8qIGhpZXJhcmNoeSBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIEhJRVJfTk9ORSAgICAgICAgIDB4MDAKKyNkZWZpbmUgSElFUl9BTFBIQV8xICAgICAgMHgwMQorI2RlZmluZSBISUVSX0FMUEhBXzIgICAgICAweDAyCisjZGVmaW5lIEhJRVJfQUxQSEFfNCAgICAgIDB4MDMKKyNkZWZpbmUgSElFUl9VTktOT1dOICAgICAgMHhGRgorCisvKiBpbnRlcmxlYXZpbmcgYXZhaWxhYmxlIHZhbHVlcyAqLworI2RlZmluZSBJTlRMVl9OQVRJVkUgICAgICAweDAwCisjZGVmaW5lIElOVExWX0lOX0RFUFRIICAgIDB4MDEKKyNkZWZpbmUgSU5UTFZfVU5LTk9XTiAgICAgMHhGRgorCisvKiBjb2RlIHJhdGUgYXZhaWxhYmxlIHZhbHVlcyAqLworI2RlZmluZSBDT0RFX1JBVEVfMV8yICAgICAweDAwCisjZGVmaW5lIENPREVfUkFURV8yXzMgICAgIDB4MDEKKyNkZWZpbmUgQ09ERV9SQVRFXzNfNCAgICAgMHgwMgorI2RlZmluZSBDT0RFX1JBVEVfNV82ICAgICAweDAzCisjZGVmaW5lIENPREVfUkFURV83XzggICAgIDB4MDQKKyNkZWZpbmUgQ09ERV9SQVRFX1VOS05PV04gMHhGRgorCisvKiBndWFyZCBpbnRlcnZhbCBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIEdVQVJEX0lOVF8xXzMyICAgIDB4MDAKKyNkZWZpbmUgR1VBUkRfSU5UXzFfMTYgICAgMHgwMQorI2RlZmluZSBHVUFSRF9JTlRfMV84ICAgICAweDAyCisjZGVmaW5lIEdVQVJEX0lOVF8xXzQgICAgIDB4MDMKKyNkZWZpbmUgR1VBUkRfVU5LTk9XTiAgICAgMHhGRgorCisvKiB0cmFuc21pc3Npb24gbW9kZSBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIFRSQU5TX01PREVfMksgICAgICAweDAwCisjZGVmaW5lIFRSQU5TX01PREVfOEsgICAgICAweDAxCisjZGVmaW5lIFRSQU5TX01PREVfNEsgICAgICAweDAyCisjZGVmaW5lIFRSQU5TX01PREVfVU5LTk9XTiAweEZGCisKKy8qIERWQkggc2lnbmFsbGluZyBhdmFpbGFibGUgdmFsdWVzICovCisjZGVmaW5lIFRJTUVTTElDSU5HX1BSRVNFTlQgICAweDAxCisjZGVmaW5lIE1QRV9GRUNfUFJFU0VOVCAgICAgICAweDAyCisKKy8qIHR1bmUgc3RhdGUgYXZhaWxhYmxlICovCisjZGVmaW5lIFRVTkVfU1RBVFVTX05PVF9UVU5FRCAgICAgICAweDAwCisjZGVmaW5lIFRVTkVfU1RBVFVTX0lETEUgICAgICAgICAgICAweDAxCisjZGVmaW5lIFRVTkVfU1RBVFVTX0xPQ0tJTkcgICAgICAgICAweDAyCisjZGVmaW5lIFRVTkVfU1RBVFVTX1NJR05BTF9EVkJfT0sgICAweDAzCisjZGVmaW5lIFRVTkVfU1RBVFVTX1NUUkVBTV9ERVRFQ1RFRCAweDA0CisjZGVmaW5lIFRVTkVfU1RBVFVTX1NUUkVBTV9UVU5FRCAgICAweDA1CisjZGVmaW5lIFRVTkVfU1RBVFVTX0VSUk9SICAgICAgICAgICAweEZGCisKKy8qIGF2YWlsYWJsZSBUUyBGSUQgZmlsdGVyIHR5cGVzICovCisjZGVmaW5lIFRTX1BJRF9UWVBFX1RTICAgICAgIDAKKyNkZWZpbmUgVFNfUElEX1RZUEVfUFNJX1NJICAgMQorI2RlZmluZSBUU19QSURfVFlQRV9NUEUgICAgICAyCisKKy8qIG51bWJlciBvZiBlY2hvcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUFYX0VDSE9TICAgMTUKKworLyogQ29udGV4dCB0eXBlcyAqLworI2RlZmluZSBDT05URVhUX0xOQSAgICAgICAgICAgICAgICAgICAxMDEwCisjZGVmaW5lIENPTlRFWFRfRUxOQV9IWVNURVJFU0lTICAgICAgIDQwMDMKKyNkZWZpbmUgQ09OVEVYVF9FTE5BX0dBSU4gICAgICAgICAgICAgNDAwNAorI2RlZmluZSBDT05URVhUX01FUl9USFJFU0hPTEQgICAgICAgICA1MDA1CisjZGVmaW5lIENPTlRFWFRfTUVSX09GRlNFVCAgICAgICAgICAgIDUwMDYKKyNkZWZpbmUgQ09OVEVYVF9JUl9TVEFURSAgICAgICAgICAgICAgNzAwMAorI2RlZmluZSBDT05URVhUX1RTT1VUX01TQl9GSVJTVCAgICAgICA3MDA0CisjZGVmaW5lIENPTlRFWFRfVFNPVVRfRkFMTElOR19FREdFICAgIDcwMDUKKworLyogQ29uZmlndXJhdGlvbiBtb2RlcyAqLworI2RlZmluZSBDRkdfTU9ERV9PTiAgICAgMAorI2RlZmluZSBDRkdfTU9ERV9PRkYgICAgMQorI2RlZmluZSBDRkdfTU9ERV9BVVRPICAgMgorCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBhczEweF90cHMgeworICAgdWludDhfdCBjb25zdGVsbGF0aW9uOworICAgdWludDhfdCBoaWVyYXJjaHk7CisgICB1aW50OF90IGludGVybGVhdmluZ19tb2RlOworICAgdWludDhfdCBjb2RlX3JhdGVfSFA7CisgICB1aW50OF90IGNvZGVfcmF0ZV9MUDsKKyAgIHVpbnQ4X3QgZ3VhcmRfaW50ZXJ2YWw7CisgICB1aW50OF90IHRyYW5zbWlzc2lvbl9tb2RlOworICAgdWludDhfdCBEVkJIX21hc2tfSFA7CisgICB1aW50OF90IERWQkhfbWFza19MUDsKKyAgIHVpbnQxNl90IGNlbGxfSUQ7Cit9OworCitzdHJ1Y3QgYXMxMHhfdHVuZV9hcmdzIHsKKyAgIC8qIGZyZXF1ZW5jeSAqLworICAgdWludDMyX3QgZnJlcTsKKyAgIC8qIGJhbmR3aWR0aCAqLworICAgdWludDhfdCBiYW5kd2lkdGg7CisgICAvKiBoaWVyYXJjaHkgc2VsZWN0aW9uICovCisgICB1aW50OF90IGhpZXJfc2VsZWN0OworICAgLyogY29uc3RlbGxhdGlvbiAqLworICAgdWludDhfdCBjb25zdGVsbGF0aW9uOworICAgLyogaGllcmFyY2h5ICovCisgICB1aW50OF90IGhpZXJhcmNoeTsKKyAgIC8qIGludGVybGVhdmluZyBtb2RlICovCisgICB1aW50OF90IGludGVybGVhdmluZ19tb2RlOworICAgLyogY29kZSByYXRlICovCisgICB1aW50OF90IGNvZGVfcmF0ZTsKKyAgIC8qIGd1YXJkIGludGVydmFsICovCisgICB1aW50OF90IGd1YXJkX2ludGVydmFsOworICAgLyogdHJhbnNtaXNzaW9uIG1vZGUgKi8KKyAgIHVpbnQ4X3QgdHJhbnNtaXNzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYXMxMHhfdHVuZV9zdGF0dXMgeworICAgLyogdHVuZSBzdGF0dXMgKi8KKyAgIHVpbnQ4X3QgdHVuZV9zdGF0ZTsKKyAgIC8qIHNpZ25hbCBzdHJlbmd0aCAqLworICAgaW50MTZfdCBzaWduYWxfc3RyZW5ndGg7CisgICAvKiBwYWNrZXQgZXJyb3IgcmF0ZSAxMF4tNCAqLworICAgdWludDE2X3QgUEVSOworICAgLyogYml0IGVycm9yIHJhdGUgMTBeLTQgKi8KKyAgIHVpbnQxNl90IEJFUjsKK307CisKK3N0cnVjdCBhczEweF9kZW1vZF9zdGF0cyB7CisgICAvKiBmcmFtZSBjb3VudGVyICovCisgICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgIC8qIEJhZCBmcmFtZSBjb3VudGVyICovCisgICB1aW50MzJfdCBiYWRfZnJhbWVfY291bnQ7CisgICAvKiBOdW1iZXIgb2Ygd3JvbmcgYnl0ZXMgZml4ZWQgYnkgUmVlZC1Tb2xvbW9uICovCisgICB1aW50MzJfdCBieXRlc19maXhlZF9ieV9yczsKKyAgIC8qIEF2ZXJhZ2VkIE1FUiAqLworICAgdWludDE2X3QgbWVyOworICAgLyogc3RhdGlzdGljcyBjYWxjdWxhdGlvbiBzdGF0ZSBpbmRpY2F0b3IgKHN0YXJ0ZWQgb3Igbm90KSAqLworICAgdWludDhfdCBoYXNfc3RhcnRlZDsKK307CisKK3N0cnVjdCBhczEweF90c19maWx0ZXIgeworICAgdWludDE2X3QgcGlkOyAgLyoqIHZhbGlkIFBJRCB2YWx1ZSAweDAwIDogMHgyMDAwICovCisgICB1aW50OF90ICB0eXBlOyAvKiogUmVkIFRTX1BJRF9UWVBFXzxOPiB2YWx1ZXMgKi8KKyAgIHVpbnQ4X3QgIGlkeDsgIC8qKiBpbmRleCBpbiBmaWx0ZXJpbmcgdGFibGUgKi8KK307CisKK3N0cnVjdCBhczEweF9yZWdpc3Rlcl92YWx1ZSB7CisgICB1aW50OF90ICAgICAgIG1vZGU7CisgICB1bmlvbiB7CisgICAgICB1aW50OF90ICAgIHZhbHVlODsgICAgLyogOCBiaXQgdmFsdWUgKi8KKyAgICAgIHVpbnQxNl90ICAgdmFsdWUxNjsgICAvKiAxNiBiaXQgdmFsdWUgKi8KKyAgICAgIHVpbnQzMl90ICAgdmFsdWUzMjsgICAvKiAzMiBiaXQgdmFsdWUgKi8KKyAgIH11OworfTsKKworI3ByYWdtYSBwYWNrKCkKKworc3RydWN0IGFzMTB4X3JlZ2lzdGVyX2FkZHIgeworICAgLyogcmVnaXN0ZXIgYWRkciAqLworICAgdWludDMyX3QgYWRkcjsKKyAgIC8qIHJlZ2lzdGVyIG1vZGUgYWNjZXNzICovCisgICB1aW50OF90IG1vZGU7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L1RPRE8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L1RPRE8KcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L1RPRE8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kdDMxNTV2NGwvS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9LY29uZmlnCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZHQzMTU1djRsL2R0MzE1NXY0bC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU5M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuYwpAQCAtMCwwICsxLDk5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBieSBNYXJpbiBNaXRvdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBtaXRvdkBpc3NwLmJhcy5iZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKworI2luY2x1ZGUgImR0MzE1NXY0bC5oIgorCisjZGVmaW5lIERUMzE1NV9WRU5ET1JfSUQgMHg4MDg2CisjZGVmaW5lIERUMzE1NV9ERVZJQ0VfSUQgMHgxMjIzCisKKy8qIERUMzE1NV9DSFVOS19TSVpFIGlzIDRNICgyXjIyKSA4IGZ1bGwgc2l6ZSBidWZmZXJzICovCisjZGVmaW5lIERUMzE1NV9DSFVOS19TSVpFICgxVSA8PCAyMikKKworI2RlZmluZSBEVDMxNTVfQ09IX0ZMQUdTIChHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyIHwgX19HRlBfQ09MRCB8IF9fR0ZQX05PV0FSTikKKworI2RlZmluZSBEVDMxNTVfQlVGX1NJWkUgKDc2OCAqIDU3NikKKworI2lmZGVmIENPTkZJR19EVDMxNTVfU1RSRUFNSU5HCisjZGVmaW5lIERUMzE1NV9DQVBUVVJFX01FVEhPRCBWNEwyX0NBUF9TVFJFQU1JTkcKKyNlbHNlCisjZGVmaW5lIERUMzE1NV9DQVBUVVJFX01FVEhPRCBWNEwyX0NBUF9SRUFEV1JJVEUKKyNlbmRpZgorCisvKiAgZ2xvYmFsIGluaXRpYWxpemVycyAoZm9yIGFsbCBib2FyZHMpICAqLworI2lmZGVmIENPTkZJR19EVDMxNTVfQ0NJUgorc3RhdGljIGNvbnN0IHU4IGNzcjJfaW5pdCA9IFZUXzUwSFo7CisjZGVmaW5lIERUMzE1NV9DVVJSRU5UX05PUk0gVjRMMl9TVERfNjI1XzUwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ193aWR0aCA9IDc2ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1nX2hlaWdodCA9IDU3NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVzX3Blcl9zZWMgPSAyNTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZyYW1lX3N0ZFtdID0geworCXsKKwkuaW5kZXggPSAwLAorCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCS5mbGFncyA9IDAsCisJLmRlc2NyaXB0aW9uID0gIkNDSVIvNTBIeiA4IGJpdHMgZ3JheSIsCisJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVksCisJfSwKK307CisjZWxzZQorc3RhdGljIGNvbnN0IHU4IGNzcjJfaW5pdCA9IFZUXzYwSFo7CisjZGVmaW5lIERUMzE1NV9DVVJSRU5UX05PUk0gVjRMMl9TVERfNTI1XzYwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltZ193aWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1nX2hlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZnJhbWVzX3Blcl9zZWMgPSAzMDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZyYW1lX3N0ZFtdID0geworCXsKKwkuaW5kZXggPSAwLAorCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCS5mbGFncyA9IDAsCisJLmRlc2NyaXB0aW9uID0gIlJTLTE3MC82MEh6IDggYml0cyBncmF5IiwKKwkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfR1JFWSwKKwl9LAorfTsKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9PRl9GT1JNQVRTIEFSUkFZX1NJWkUoZnJhbWVfc3RkKQorCitzdGF0aWMgdTggY29uZmlnX2luaXQgPSBBQ1FfTU9ERV9FVkVOOworCisvKioKKyAqIHJlYWRfaTJjX3JlZyAtIHJlYWRzIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgorICoKKyAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKKyAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBkYXRhOglwb2ludGVyIHRvIGJ5dGUgdGhlIHJlYWQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbgorICoKKyAqIHJldHVybnM6CXplcm8gb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgcmVhZGluZyB0aGUgc3BlY2lmaWVkIChieSBpbmRleCkgcmVnaXN0ZXIKKyAqIGFuZCBidXN5IHdhaXRzIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guIFRoZSByZXN1bHQgaXMgcGxhY2VkCisgKiBpbiBhIGJ5dGUgcG9pbnRlZCBieSBkYXRhLgorICovCitzdGF0aWMgaW50CityZWFkX2kyY19yZWcodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggKmRhdGEpCit7CisJdTMyIHRtcCA9IGluZGV4OworCisJaW93cml0ZTMyKCh0bXA8PDE3KSB8IElJQ19SRUFELCBhZGRyICsgSUlDX0NTUjIpOworCW1taW93YigpOworCXVkZWxheSg0NSk7IC8qIHdhaXQgYXQgbGVhc3QgNDMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJdG1wID0gaW9yZWFkMzIoYWRkciArIElJQ19DU1IxKTsKKwlpZiAodG1wICYgRElSRUNUX0FCT1JUKSB7CisJCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KKwkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKKwkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCisJfQorCSpkYXRhID0gdG1wPj4yNDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3cml0ZV9pMmNfcmVnIC0gd3JpdGVzIHRvIGFuIGludGVybmFsIGkyYyByZWdpc3RlcgorICoKKyAqIEBhZGRyOglkdDMxNTUgbW1pbyBiYXNlIGFkZHJlc3MKKyAqIEBpbmRleDoJaW5kZXggKGludGVybmFsIGFkZHJlc3MpIG9mIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBkYXRhOglkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiByZXR1cm5zOgl6ZXJvIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHdyaXR0aW5nIHRoZSBzcGVjaWZpZWQgKGJ5IGluZGV4KSByZWdpc3RlcgorICogYW5kIGJ1c3kgd2FpdHMgZm9yIHRoZSBwcm9jZXNzIHRvIGZpbmlzaC4KKyAqLworc3RhdGljIGludAord3JpdGVfaTJjX3JlZyh2b2lkIF9faW9tZW0gKmFkZHIsIHU4IGluZGV4LCB1OCBkYXRhKQoreworCXUzMiB0bXAgPSBpbmRleDsKKworCWlvd3JpdGUzMigodG1wPDwxNykgfCBJSUNfV1JJVEUgfCBkYXRhLCBhZGRyICsgSUlDX0NTUjIpOworCW1taW93YigpOworCXVkZWxheSg2NSk7IC8qIHdhaXQgYXQgbGVhc3QgNjMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSkgJiBESVJFQ1RfQUJPUlQpIHsKKwkJLyogcmVzZXQgRElSRUNUX0FCT1JUIGJpdCAqLworCQlpb3dyaXRlMzIoRElSRUNUX0FCT1JULCBhZGRyICsgSUlDX0NTUjEpOworCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd3JpdGVfaTJjX3JlZ19ub3dhaXQgLSB3cml0ZXMgdG8gYW4gaW50ZXJuYWwgaTJjIHJlZ2lzdGVyCisgKgorICogQGFkZHI6CWR0MzE1NSBtbWlvIGJhc2UgYWRkcmVzcworICogQGluZGV4OglpbmRleCAoaW50ZXJuYWwgYWRkcmVzcykgb2YgcmVnaXN0ZXIgdG8gcmVhZAorICogQGRhdGE6CWRhdGEgdG8gYmUgd3JpdHRlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHdyaXR0aW5nIHRoZSBzcGVjaWZpZWQgKGJ5IGluZGV4KSByZWdpc3RlcgorICogYW5kIHRoZW4gcmV0dXJucy4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfaTJjX3JlZ19ub3dhaXQodm9pZCBfX2lvbWVtICphZGRyLCB1OCBpbmRleCwgdTggZGF0YSkKK3sKKwl1MzIgdG1wID0gaW5kZXg7CisKKwlpb3dyaXRlMzIoKHRtcDw8MTcpIHwgSUlDX1dSSVRFIHwgZGF0YSwgYWRkciArIElJQ19DU1IyKTsKKwltbWlvd2IoKTsKK30KKworLyoqCisgKiB3YWl0X2kyY19yZWcgLSB3YWl0cyB0aGUgcmVhZC93cml0ZSB0byBmaW5pc2gKKyAqCisgKiBAYWRkcjoJZHQzMTU1IG1taW8gYmFzZSBhZGRyZXNzCisgKgorICogcmV0dXJuczoJemVybyBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHJlYWRpbmcvd3JpdHRpbmcgdG8gZmluaXNoLgorICovCitzdGF0aWMgaW50IHdhaXRfaTJjX3JlZyh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXVkZWxheSg2NSk7IC8qIHdhaXQgYXQgbGVhc3QgNjMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkICovCisJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMSkgJiBESVJFQ1RfQUJPUlQpIHsKKwkJLyogcmVzZXQgRElSRUNUX0FCT1JUIGJpdCAqLworCQlpb3dyaXRlMzIoRElSRUNUX0FCT1JULCBhZGRyICsgSUlDX0NTUjEpOworCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9zdGFydF9hY3Eoc3RydWN0IGR0MzE1NV9wcml2ICpwZCkKK3sKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSBwZC0+Y3Vycl9idWY7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOworCWlvd3JpdGUzMihkbWFfYWRkciwgcGQtPnJlZ3MgKyBFVkVOX0RNQV9TVEFSVCk7CisJaW93cml0ZTMyKGRtYV9hZGRyICsgaW1nX3dpZHRoLCBwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihpbWdfd2lkdGgsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RSSURFKTsKKwlpb3dyaXRlMzIoaW1nX3dpZHRoLCBwZC0+cmVncyArIE9ERF9ETUFfU1RSSURFKTsKKwkvKiBlbmFibGUgaW50ZXJydXB0cywgY2xlYXIgYWxsIGlycSBmbGFncyAqLworCWlvd3JpdGUzMihGTERfU1RBUlRfRU4gfCBGTERfRU5EX09ERF9FTiB8IEZMRF9TVEFSVCB8CisJCQlGTERfRU5EX0VWRU4gfCBGTERfRU5EX09ERCwgcGQtPnJlZ3MgKyBJTlRfQ1NSKTsKKwlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfQ1JQVF9PREQgfCBGTERfQ1JQVF9FVkVOIHwKKwkJICBGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4gfCBDQVBfQ09OVF9FVkVOIHwgQ0FQX0NPTlRfT0RELAorCQkJCQkJCXBkLT5yZWdzICsgQ1NSMSk7CisJd2FpdF9pMmNfcmVnKHBkLT5yZWdzKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfRVJST1IgfCBDU1JfRE9ORSk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgT0REX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOworCisJLyogIHN0YXJ0IHRoZSBib2FyZCAgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDU1IyLCBwZC0+Y3NyMiB8IEJVU1lfRVZFTiB8IEJVU1lfT0REKTsKKwlyZXR1cm4gMDsgLyogc3VjY2VzcyAgKi8KK30KKworLyoKKyAqCWRyaXZlci1zcGVjaWZpYyBjYWxsYmFja3MgKHZiMl9vcHMpCisgKi8KK3N0YXRpYyBpbnQKK2R0MzE1NV9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgKm51bV9idWZmZXJzLAorCQkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCQkJCQl2b2lkICphbGxvY19jdHhzW10pCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJdm9pZCAqcmV0OworCisJaWYgKCpudW1fYnVmZmVycyA9PSAwKQorCQkqbnVtX2J1ZmZlcnMgPSAxOworCSpudW1fcGxhbmVzID0gMTsKKwlzaXplc1swXSA9IGltZ193aWR0aCAqIGltZ19oZWlnaHQ7CisJaWYgKHBkLT5xLT5hbGxvY19jdHhbMF0pCisJCXJldHVybiAwOworCXJldCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KCZwZC0+cGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHJldCkpCisJCXJldHVybiBQVFJfRVJSKHJldCk7CisJcGQtPnEtPmFsbG9jX2N0eFswXSA9IHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2R0MzE1NV93YWl0X3ByZXBhcmUoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKworCW11dGV4X3VubG9jayhwZC0+dmRldi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitkdDMxNTVfd2FpdF9maW5pc2goc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKworCW11dGV4X2xvY2socGQtPnZkZXYtPmxvY2spOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgaW1nX3dpZHRoICogaW1nX2hlaWdodCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJc3RydWN0IHZiMl9idWZmZXIgKnZiOworCisJc3Bpbl9sb2NrX2lycSgmcGQtPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmcGQtPmRtYXEpKSB7CisJCXZiID0gbGlzdF9maXJzdF9lbnRyeSgmcGQtPmRtYXEsIHR5cGVvZigqdmIpLCBkb25lX2VudHJ5KTsKKwkJbGlzdF9kZWwoJnZiLT5kb25lX2VudHJ5KTsKKwkJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZC0+bG9jayk7CisJbXNsZWVwKDQ1KTsgLyogaXJxIGhlbmRsZXIgd2lsbCBzdG9wIHRoZSBoYXJkd2FyZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHQzMTU1X2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisKKwkvKiAgcGQtPnEtPnN0cmVhbWluZyA9IDEgd2hlbiBkdDMxNTVfYnVmX3F1ZXVlKCkgaXMgaW52b2tlZCAgKi8KKwlzcGluX2xvY2tfaXJxKCZwZC0+bG9jayk7CisJaWYgKHBkLT5jdXJyX2J1ZikKKwkJbGlzdF9hZGRfdGFpbCgmdmItPmRvbmVfZW50cnksICZwZC0+ZG1hcSk7CisJZWxzZSB7CisJCXBkLT5jdXJyX2J1ZiA9IHZiOworCQlkdDMxNTVfc3RhcnRfYWNxKHBkKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZC0+bG9jayk7Cit9CisvKgorICoJZW5kIGRyaXZlci1zcGVjaWZpYyBjYWxsYmFja3MKKyAqLworCitjb25zdCBzdHJ1Y3QgdmIyX29wcyBxX29wcyA9IHsKKwkucXVldWVfc2V0dXAgPSBkdDMxNTVfcXVldWVfc2V0dXAsCisJLndhaXRfcHJlcGFyZSA9IGR0MzE1NV93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoID0gZHQzMTU1X3dhaXRfZmluaXNoLAorCS5idWZfcHJlcGFyZSA9IGR0MzE1NV9idWZfcHJlcGFyZSwKKwkuc3RhcnRfc3RyZWFtaW5nID0gZHQzMTU1X3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcgPSBkdDMxNTVfc3RvcF9zdHJlYW1pbmcsCisJLmJ1Zl9xdWV1ZSA9IGR0MzE1NV9idWZfcXVldWUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2R0MzE1NV9pcnFfaGFuZGxlcl9ldmVuKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKmlwZCA9IGRldl9pZDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqaXZiOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTMyIHRtcDsKKworCXRtcCA9IGlvcmVhZDMyKGlwZC0+cmVncyArIElOVF9DU1IpICYgKEZMRF9TVEFSVCB8IEZMRF9FTkRfT0REKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIElSUV9OT05FOyAgLyogbm90IG91ciBpcnEgKi8KKwlpZiAoKHRtcCAmIEZMRF9TVEFSVCkgJiYgISh0bXAgJiBGTERfRU5EX09ERCkpIHsKKwkJaW93cml0ZTMyKEZMRF9TVEFSVF9FTiB8IEZMRF9FTkRfT0REX0VOIHwgRkxEX1NUQVJULAorCQkJCQkJCWlwZC0+cmVncyArIElOVF9DU1IpOworCQlpcGQtPmZpZWxkX2NvdW50Kys7CisJCXJldHVybiBJUlFfSEFORExFRDsgLyogc3RhcnQgb2YgZmllbGQgaXJxICovCisJfQorCWlmICgodG1wICYgRkxEX1NUQVJUKSAmJiAodG1wICYgRkxEX0VORF9PREQpKQorCQlpcGQtPnN0YXRzLnN0YXJ0X2JlZm9yZV9lbmQrKzsKKwkvKgljaGVjayBmb3IgY29ycnVwdGVkIGZpZWxkcyAgICAgKi8KKy8qCXdyaXRlX2kyY19yZWcoaXBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOwkqLworLyoJd3JpdGVfaTJjX3JlZyhpcGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsJKi8KKwl0bXAgPSBpb3JlYWQzMihpcGQtPnJlZ3MgKyBDU1IxKSAmIChGTERfQ1JQVF9FVkVOIHwgRkxEX0NSUFRfT0REKTsKKwlpZiAodG1wKSB7CisJCWlwZC0+c3RhdHMuY29ycnVwdGVkX2ZpZWxkcysrOworCQlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfQ1JQVF9PREQgfCBGTERfQ1JQVF9FVkVOIHwKKwkJCQkJCUZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiB8CisJCQkJCQlDQVBfQ09OVF9FVkVOIHwgQ0FQX0NPTlRfT0RELAorCQkJCQkJCWlwZC0+cmVncyArIENTUjEpOworCQltbWlvd2IoKTsKKwl9CisKKwlzcGluX2xvY2soJmlwZC0+bG9jayk7CisJaWYgKGlwZC0+Y3Vycl9idWYpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZpcGQtPmN1cnJfYnVmLT52NGwyX2J1Zi50aW1lc3RhbXApOworCQlpcGQtPmN1cnJfYnVmLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IChpcGQtPmZpZWxkX2NvdW50KSA+PiAxOworCQl2YjJfYnVmZmVyX2RvbmUoaXBkLT5jdXJyX2J1ZiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9CisKKwlpZiAoIWlwZC0+cS0+c3RyZWFtaW5nIHx8IGxpc3RfZW1wdHkoJmlwZC0+ZG1hcSkpCisJCWdvdG8gc3RvcF9kbWE7CisJaXZiID0gbGlzdF9maXJzdF9lbnRyeSgmaXBkLT5kbWFxLCB0eXBlb2YoKml2YiksIGRvbmVfZW50cnkpOworCWxpc3RfZGVsKCZpdmItPmRvbmVfZW50cnkpOworCWlwZC0+Y3Vycl9idWYgPSBpdmI7CisJZG1hX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihpdmIsIDApOworCWlvd3JpdGUzMihkbWFfYWRkciwgaXBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihkbWFfYWRkciArIGltZ193aWR0aCwgaXBkLT5yZWdzICsgT0REX0RNQV9TVEFSVCk7CisJaW93cml0ZTMyKGltZ193aWR0aCwgaXBkLT5yZWdzICsgRVZFTl9ETUFfU1RSSURFKTsKKwlpb3dyaXRlMzIoaW1nX3dpZHRoLCBpcGQtPnJlZ3MgKyBPRERfRE1BX1NUUklERSk7CisJbW1pb3diKCk7CisJLyogZW5hYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KKwlpb3dyaXRlMzIoRkxEX1NUQVJUX0VOIHwgRkxEX0VORF9PRERfRU4gfCBGTERfU1RBUlQgfAorCQkJRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIGlwZC0+cmVncyArIElOVF9DU1IpOworCXNwaW5fdW5sb2NrKCZpcGQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKKworc3RvcF9kbWE6CisJaXBkLT5jdXJyX2J1ZiA9IE5VTEw7CisJLyogc3RvcCB0aGUgYm9hcmQgKi8KKwl3cml0ZV9pMmNfcmVnX25vd2FpdChpcGQtPnJlZ3MsIENTUjIsIGlwZC0+Y3NyMik7CisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8CisJCSAgRkxEX0ROX09ERCB8IEZMRF9ETl9FVkVOLCBpcGQtPnJlZ3MgKyBDU1IxKTsKKwkvKiBkaXNhYmxlIGludGVycnVwdHMsIGNsZWFyIGFsbCBpcnEgZmxhZ3MgKi8KKwlpb3dyaXRlMzIoRkxEX1NUQVJUIHwgRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsIGlwZC0+cmVncyArIElOVF9DU1IpOworCXNwaW5fdW5sb2NrKCZpcGQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorZHQzMTU1X29wZW4oc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlpZiAoIXBkLT51c2VycykgeworCQlwZC0+cSA9IGt6YWxsb2Moc2l6ZW9mKCpwZC0+cSksIEdGUF9LRVJORUwpOworCQlpZiAoIXBkLT5xKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfYWxsb2NfcXVldWU7CisJCX0KKwkJcGQtPnEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCXBkLT5xLT5pb19tb2RlcyA9IFZCMl9SRUFEIHwgVkIyX01NQVA7CisJCXBkLT5xLT5vcHMgPSAmcV9vcHM7CisJCXBkLT5xLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKKwkJcGQtPnEtPmRydl9wcml2ID0gcGQ7CisJCXBkLT5jdXJyX2J1ZiA9IE5VTEw7CisJCXBkLT5maWVsZF9jb3VudCA9IDA7CisJCXZiMl9xdWV1ZV9pbml0KHBkLT5xKTsgLyogY2Fubm90IGZhaWwgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJnBkLT5kbWFxKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBkLT5sb2NrKTsKKwkJLyogZGlzYWJsZSBhbGwgaXJxcywgY2xlYXIgYWxsIGlycSBmbGFncyAqLworCQlpb3dyaXRlMzIoRkxEX1NUQVJUIHwgRkxEX0VORF9FVkVOIHwgRkxEX0VORF9PREQsCisJCQkJCQlwZC0+cmVncyArIElOVF9DU1IpOworCQlyZXQgPSByZXF1ZXN0X2lycShwZC0+cGRldi0+aXJxLCBkdDMxNTVfaXJxX2hhbmRsZXJfZXZlbiwKKwkJCQkJCUlSUUZfU0hBUkVELCBEVDMxNTVfTkFNRSwgcGQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCXBkLT51c2VycysrOworCXJldHVybiAwOyAvKiBzdWNjZXNzICovCitlcnJfcmVxdWVzdF9pcnE6CisJa2ZyZWUocGQtPnEpOworCXBkLT5xID0gTlVMTDsKK2Vycl9hbGxvY19xdWV1ZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitkdDMxNTVfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXBkLT51c2Vycy0tOworCUJVR19PTihwZC0+dXNlcnMgPCAwKTsKKwlpZiAoIXBkLT51c2VycykgeworCQl2YjJfcXVldWVfcmVsZWFzZShwZC0+cSk7CisJCWZyZWVfaXJxKHBkLT5wZGV2LT5pcnEsIHBkKTsKKwkJaWYgKHBkLT5xLT5hbGxvY19jdHhbMF0pCisJCQl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChwZC0+cS0+YWxsb2NfY3R4WzBdKTsKKwkJa2ZyZWUocGQtPnEpOworCQlwZC0+cSA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorZHQzMTU1X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1c2VyLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpsb2ZmKQoreworCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOworCisJcmV0dXJuIHZiMl9yZWFkKHBkLT5xLCB1c2VyLCBzaXplLCBsb2ZmLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2R0MzE1NV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnBvbGx0YmwpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3BvbGwocGQtPnEsIGZpbHAsIHBvbGx0YmwpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX21tYXAocGQtPnEsIHZtYSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZHQzMTU1X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBkdDMxNTVfb3BlbiwKKwkucmVsZWFzZSA9IGR0MzE1NV9yZWxlYXNlLAorCS5yZWFkID0gZHQzMTU1X3JlYWQsCisJLnBvbGwgPSBkdDMxNTVfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLworCS5tbWFwID0gZHQzMTU1X21tYXAsCit9OworCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXJldHVybiB2YjJfc3RyZWFtb24ocGQtPnEsIHR5cGUpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3N0cmVhbW9mZihwZC0+cSwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKworCXN0cmNweShjYXAtPmRyaXZlciwgRFQzMTU1X05BTUUpOworCXN0cmNweShjYXAtPmNhcmQsIERUMzE1NV9OQU1FICIgZnJhbWUgZ3JhYmJlciIpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKHBkLT5wZGV2KSk7CisJY2FwLT52ZXJzaW9uID0KKwkgICAgICAgS0VSTkVMX1ZFUlNJT04oRFQzMTU1X1ZFUl9NQUosIERUMzE1NV9WRVJfTUlOLCBEVDMxNTVfVkVSX0VYVCk7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlEVDMxNTVfQ0FQVFVSRV9NRVRIT0Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlpZiAoZi0+aW5kZXggPj0gTlVNX09GX0ZPUk1BVFMpCisJCXJldHVybiAtRUlOVkFMOworCSpmID0gZnJhbWVfc3RkW2YtPmluZGV4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmLT5mbXQucGl4LndpZHRoID0gaW1nX3dpZHRoOworCWYtPmZtdC5waXguaGVpZ2h0ID0gaW1nX2hlaWdodDsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0dSRVk7CisJZi0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGg7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LndpZHRoICogZi0+Zm10LnBpeC5oZWlnaHQ7CisJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gMDsKKwlmLT5mbXQucGl4LnByaXYgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGYtPmZtdC5waXgud2lkdGggPT0gaW1nX3dpZHRoICYmCisJCWYtPmZtdC5waXguaGVpZ2h0ID09IGltZ19oZWlnaHQgJiYKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfR1JFWSAmJgorCQlmLT5mbXQucGl4LmZpZWxkID09IFY0TDJfRklFTERfTk9ORSAmJgorCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9PSBmLT5mbXQucGl4LndpZHRoICYmCisJCWYtPmZtdC5waXguc2l6ZWltYWdlID09IGYtPmZtdC5waXgud2lkdGggKiBmLT5mbXQucGl4LmhlaWdodCkKKwkJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXJldHVybiBkdDMxNTVfaW9jX2dfZm10X3ZpZF9jYXAoZmlscCwgcCwgZik7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3JlcWJ1ZnMocGQtPnEsIGIpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3F1ZXJ5YnVmKHBkLT5xLCBiKTsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX3FidWYocGQtPnEsIGIpOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpCit7CisJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHZpZGVvX2RydmRhdGEoZmlscCk7CisKKwlyZXR1cm4gdmIyX2RxYnVmKHBkLT5xLCBiLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2NfcXVlcnlzdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHY0bDJfc3RkX2lkICpub3JtKQoreworCSpub3JtID0gRFQzMTU1X0NVUlJFTlRfTk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdjRsMl9zdGRfaWQgKm5vcm0pCit7CisJKm5vcm0gPSBEVDMxNTVfQ1VSUkVOVF9OT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlpZiAoKm5vcm0gJiBEVDMxNTVfQ1VSUkVOVF9OT1JNKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorZHQzMTU1X2lvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwLCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJaWYgKGlucHV0LT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyY3B5KGlucHV0LT5uYW1lLCAiQ29heCBpbiIpOworCWlucHV0LT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkvKgorCSAqIEZJWE1FOiBpbnB1dC0+c3RkID0gMCBhY2NvcmRpbmcgdG8gdjRsMiBBUEkKKwkgKiBWSURJT0NfR19TVEQsIFZJRElPQ19TX1NURCwgVklESU9DX1FVRVJZU1REIGFuZCBWSURJT0NfRU5VTVNURAorCSAqIHNob3VsZCByZXR1cm4gLUVJTlZBTAorCSAqLworCWlucHV0LT5zdGQgPSBEVDMxNTVfQ1VSUkVOVF9OT1JNOworCWlucHV0LT5zdGF0dXMgPSAwOy8qIEZJWE1FOiBhZGQgc3luYyBkZXRlY3Rpb24gJiBWNEwyX0lOX1NUX05PX0hfTE9DSyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnAsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2R0MzE1NV9pb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJaWYgKHBhcm1zLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDEwMDE7CisJcGFybXMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBmcmFtZXNfcGVyX3NlYyAqIDEwMDA7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSAxOyAvKiBGSVhNRTogMiBidWZmZXJzPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkdDMxNTVfaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcCwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJaWYgKHBhcm1zLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ID0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOworCXBhcm1zLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDEwMDE7CisJcGFybXMtPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBmcmFtZXNfcGVyX3NlYyAqIDEwMDA7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSAxOyAvKiBGSVhNRTogMiBidWZmZXJzPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGR0MzE1NV9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19zdHJlYW1vbiA9IGR0MzE1NV9pb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSBkdDMxNTVfaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gZHQzMTU1X2lvY19xdWVyeWNhcCwKKy8qCisJLnZpZGlvY19nX3ByaW9yaXR5ID0gZHQzMTU1X2lvY19nX3ByaW9yaXR5LAorCS52aWRpb2Nfc19wcmlvcml0eSA9IGR0MzE1NV9pb2Nfc19wcmlvcml0eSwKKyovCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY190cnlfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwID0gZHQzMTU1X2lvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IGR0MzE1NV9pb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3JlcWJ1ZnMgPSBkdDMxNTVfaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IGR0MzE1NV9pb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmID0gZHQzMTU1X2lvY19xYnVmLAorCS52aWRpb2NfZHFidWYgPSBkdDMxNTVfaW9jX2RxYnVmLAorCS52aWRpb2NfcXVlcnlzdGQgPSBkdDMxNTVfaW9jX3F1ZXJ5c3RkLAorCS52aWRpb2NfZ19zdGQgPSBkdDMxNTVfaW9jX2dfc3RkLAorCS52aWRpb2Nfc19zdGQgPSBkdDMxNTVfaW9jX3Nfc3RkLAorCS52aWRpb2NfZW51bV9pbnB1dCA9IGR0MzE1NV9pb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgPSBkdDMxNTVfaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ID0gZHQzMTU1X2lvY19zX2lucHV0LAorLyoKKwkudmlkaW9jX3F1ZXJ5Y3RybCA9IGR0MzE1NV9pb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsID0gZHQzMTU1X2lvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgPSBkdDMxNTVfaW9jX3NfY3RybCwKKwkudmlkaW9jX3F1ZXJ5bWVudSA9IGR0MzE1NV9pb2NfcXVlcnltZW51LAorCS52aWRpb2NfZ19leHRfY3RybHMgPSBkdDMxNTVfaW9jX2dfZXh0X2N0cmxzLAorCS52aWRpb2Nfc19leHRfY3RybHMgPSBkdDMxNTVfaW9jX3NfZXh0X2N0cmxzLAorKi8KKwkudmlkaW9jX2dfcGFybSA9IGR0MzE1NV9pb2NfZ19wYXJtLAorCS52aWRpb2Nfc19wYXJtID0gZHQzMTU1X2lvY19zX3Bhcm0sCisvKgorCS52aWRpb2NfY3JvcGNhcCA9IGR0MzE1NV9pb2NfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcCA9IGR0MzE1NV9pb2NfZ19jcm9wLAorCS52aWRpb2Nfc19jcm9wID0gZHQzMTU1X2lvY19zX2Nyb3AsCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgPSBkdDMxNTVfaW9jX2VudW1fZnJhbWVzaXplcywKKwkudmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMgPSBkdDMxNTVfaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisqLworfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2R0MzE1NV9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCAqYnVmX2NwdTsKKwlkbWFfYWRkcl90IGJ1Zl9kbWE7CisJaW50IGk7CisJdTggdG1wOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7IC8qIGR0MzE1NSBuZWVkcyBpdCAqLworCisJLyogIHJlc2V0dGluZyB0aGUgYWRhcHRlciAgKi8KKwlpb3dyaXRlMzIoRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8IEZMRF9ETl9PREQgfCBGTERfRE5fRVZFTiwKKwkJCQkJCQlwZC0+cmVncyArIENTUjEpOworCW1taW93YigpOworCW1zbGVlcCgyMCk7CisKKwkvKiAgaW5pdGlhbGl6aW5nIGFkYXBlciByZWdpc3RlcnMgICovCisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNULCBwZC0+cmVncyArIENTUjEpOworCW1taW93YigpOworCWlvd3JpdGUzMigweEVFRUVFRTAxLCBwZC0+cmVncyArIEVWRU5fUElYRUxfRk1UKTsKKwlpb3dyaXRlMzIoMHhFRUVFRUUwMSwgcGQtPnJlZ3MgKyBPRERfUElYRUxfRk1UKTsKKwlpb3dyaXRlMzIoMHgwMDAwMDAyMCwgcGQtPnJlZ3MgKyBGSUZPX1RSSUdFUik7CisJaW93cml0ZTMyKDB4MDAwMDAxMDMsIHBkLT5yZWdzICsgWEZFUl9NT0RFKTsKKwlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBSRVRSWV9XQUlUX0NOVCk7CisJaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgSU5UX0NTUik7CisJaW93cml0ZTMyKDEsIHBkLT5yZWdzICsgRVZFTl9GTERfTUFTSyk7CisJaW93cml0ZTMyKDEsIHBkLT5yZWdzICsgT0REX0ZMRF9NQVNLKTsKKwlpb3dyaXRlMzIoMCwgcGQtPnJlZ3MgKyBNQVNLX0xFTkdUSCk7CisJaW93cml0ZTMyKDB4MDAwNTAwN0MsIHBkLT5yZWdzICsgRklGT19GTEFHX0NOVCk7CisJaW93cml0ZTMyKDB4MDEwMTAxMDEsIHBkLT5yZWdzICsgSUlDX0NMS19EVVIpOworCW1taW93YigpOworCisJLyogdmVyaWZ5aW5nIHRoYXQgd2UgaGF2ZSBhIERUMzE1NSBib2FyZCAobm90IGp1c3QgYSBTQUE3MTE2IGNoaXApICovCisJcmVhZF9pMmNfcmVnKHBkLT5yZWdzLCBEVF9JRCwgJnRtcCk7CisJaWYgKHRtcCAhPSBEVDMxNTVfSUQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogaW5pdGlhbGl6ZSBBRCBMVVQgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEFEX0xVVCwgaSk7CisKKwkvKiBpbml0aWFsaXplIEFEQyByZWZlcmVuY2VzICovCisJLyogRklYTUU6IHBvc19yZWYgJiBuZWdfcmVmIGRlcGVuZCBvbiBWVF81MEhaICovCisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQUREUiwgQURfQ01EX1JFRyk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQURfQ01ELCBWSURFT19DTkxfMSB8IFNZTkNfQ05MXzEgfCBTWU5DX0xWTF8zKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9QT1NfUkVGKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIDM0KTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9ORUdfUkVGKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIDApOworCisJLyogaW5pdGlhbGl6ZSBQTSBMVVQgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcgfCBQTV9MVVRfUEdNKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0FERFIsIGkpOworCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBQTV9MVVRfREFUQSwgaSk7CisJfQorCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENPTkZJRywgcGQtPmNvbmZpZyB8IFBNX0xVVF9QR00gfCBQTV9MVVRfU0VMKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgUE1fTFVUX0FERFIsIGkpOworCQl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBQTV9MVVRfREFUQSwgaSk7CisJfQorCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENPTkZJRywgcGQtPmNvbmZpZyk7IC8qICBBQ1FfTU9ERV9FVkVOICAqLworCisJLyogc2VsZWN0IGNoYW5lbCAxIGZvciBpbnB1dCBhbmQgc2V0IHN5bmMgbGV2ZWwgKi8KKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9BRERSLCBBRF9DTURfUkVHKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBBRF9DTUQsIFZJREVPX0NOTF8xIHwgU1lOQ19DTkxfMSB8IFNZTkNfTFZMXzMpOworCisJLyogYWxsb2NhdGUgbWVtb3J5LCBhbmQgaW5pdGlhbGl6ZSB0aGUgRE1BIG1hY2hpbmUgKi8KKwlidWZfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9CVUZfU0laRSwgJmJ1Zl9kbWEsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghYnVmX2NwdSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW93cml0ZTMyKGJ1Zl9kbWEsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RBUlQpOworCWlvd3JpdGUzMihidWZfZG1hLCBwZC0+cmVncyArIE9ERF9ETUFfU1RBUlQpOworCWlvd3JpdGUzMigwLCBwZC0+cmVncyArIEVWRU5fRE1BX1NUUklERSk7CisJaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgT0REX0RNQV9TVFJJREUpOworCisJLyogIFBlcmZvcm0gYSBwc2V1ZG8gZXZlbiBmaWVsZCBhY3F1aXJlICAgICovCisJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgQ0FQX0NPTlRfT0RELCBwZC0+cmVncyArIENTUjEpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyIHwgU1lOQ19TTlRMKTsKKwl3cml0ZV9pMmNfcmVnKHBkLT5yZWdzLCBDT05GSUcsIHBkLT5jb25maWcpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIEVWRU5fQ1NSLCBDU1JfU05HTCk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgcGQtPmNzcjIgfCBCVVNZX0VWRU4gfCBTWU5DX1NOVEwpOworCW1zbGVlcCgxMDApOworCXJlYWRfaTJjX3JlZyhwZC0+cmVncywgQ1NSMiwgJnRtcCk7CisJd3JpdGVfaTJjX3JlZyhwZC0+cmVncywgRVZFTl9DU1IsIENTUl9FUlJPUiB8IENTUl9TTkdMIHwgQ1NSX0RPTkUpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9TTkdMIHwgQ1NSX0RPTkUpOworCXdyaXRlX2kyY19yZWcocGQtPnJlZ3MsIENTUjIsIHBkLT5jc3IyKTsKKwlpb3dyaXRlMzIoRklGT19FTiB8IFNSU1QgfCBGTERfRE5fRVZFTiB8IEZMRF9ETl9PREQsIHBkLT5yZWdzICsgQ1NSMSk7CisKKwkvKiAgZGVhbGxvY2F0ZSBtZW1vcnkgICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgRFQzMTU1X0JVRl9TSVpFLCBidWZfY3B1LCBidWZfZG1hKTsKKwlpZiAodG1wICYgQlVTWV9FVkVOKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZHQzMTU1X3ZkZXYgPSB7CisJLm5hbWUgPSBEVDMxNTVfTkFNRSwKKwkuZm9wcyA9ICZkdDMxNTVfZm9wcywKKwkuaW9jdGxfb3BzID0gJmR0MzE1NV9pb2N0bF9vcHMsCisJLm1pbm9yID0gLTEsCisJLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkudHZub3JtcyA9IERUMzE1NV9DVVJSRU5UX05PUk0sCisJLmN1cnJlbnRfbm9ybSA9IERUMzE1NV9DVVJSRU5UX05PUk0sCit9OworCisvKiBzYW1lIGFzIGluIGRyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYyAqLworc3RydWN0IGRtYV9jb2hlcmVudF9tZW0geworCXZvaWQJCSp2aXJ0X2Jhc2U7CisJZG1hX2FkZHJfdAlkZXZpY2VfYmFzZTsKKwlpbnQJCXNpemU7CisJaW50CQlmbGFnczsKKwl1bnNpZ25lZCBsb25nCSpiaXRtYXA7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZHQzMTU1X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtOworCWRtYV9hZGRyX3QgZGV2X2Jhc2U7CisJaW50IHBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWludCBiaXRtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MocGFnZXMpICogc2l6ZW9mKGxvbmcpOworCisJaWYgKChmbGFncyAmIERNQV9NRU1PUllfTUFQKSA9PSAwKQorCQlnb3RvIG91dDsKKwlpZiAoIXNpemUpCisJCWdvdG8gb3V0OworCWlmIChkZXYtPmRtYV9tZW0pCisJCWdvdG8gb3V0OworCisJbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlnb3RvIG91dDsKKwltZW0tPnZpcnRfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsICZkZXZfYmFzZSwKKwkJCQkJCQlEVDMxNTVfQ09IX0ZMQUdTKTsKKwlpZiAoIW1lbS0+dmlydF9iYXNlKQorCQlnb3RvIGVycl9hbGxvY19jb2hlcmVudDsKKwltZW0tPmJpdG1hcCA9IGt6YWxsb2MoYml0bWFwX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbWVtLT5iaXRtYXApCisJCWdvdG8gZXJyX2JpdG1hcDsKKworCS8qIGNvaGVyZW50X2RtYV9tYXNrIGlzIGFscmVhZHkgc2V0IHRvIDMyIGJpdHMgKi8KKwltZW0tPmRldmljZV9iYXNlID0gZGV2X2Jhc2U7CisJbWVtLT5zaXplID0gcGFnZXM7CisJbWVtLT5mbGFncyA9IGZsYWdzOworCWRldi0+ZG1hX21lbSA9IG1lbTsKKwlyZXR1cm4gRE1BX01FTU9SWV9NQVA7CisKK2Vycl9iaXRtYXA6CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBtZW0tPnZpcnRfYmFzZSwgZGV2X2Jhc2UpOworZXJyX2FsbG9jX2NvaGVyZW50OgorCWtmcmVlKG1lbSk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZHQzMTU1X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYtPmRtYV9tZW07CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCWRldi0+ZG1hX21lbSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBtZW0tPnNpemUgPDwgUEFHRV9TSElGVCwKKwkJCQkJbWVtLT52aXJ0X2Jhc2UsIG1lbS0+ZGV2aWNlX2Jhc2UpOworCWtmcmVlKG1lbS0+Yml0bWFwKTsKKwlrZnJlZShtZW0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZHQzMTU1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkOworCisJZXJyID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpCisJCXJldHVybiAtRU5PREVWOworCWVyciA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOworCWlmICghcGQpCisJCXJldHVybiAtRU5PTUVNOworCXBkLT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCFwZC0+dmRldikKKwkJZ290byBlcnJfdmlkZW9fZGV2aWNlX2FsbG9jOworCSpwZC0+dmRldiA9IGR0MzE1NV92ZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwZCk7ICAgIC8qIGZvciB1c2UgaW4gZHQzMTU1X3JlbW92ZSgpICovCisJdmlkZW9fc2V0X2RydmRhdGEocGQtPnZkZXYsIHBkKTsgIC8qIGZvciB1c2UgaW4gdmlkZW9fZm9wcyAqLworCXBkLT51c2VycyA9IDA7CisJcGQtPnBkZXYgPSBwZGV2OworCUlOSVRfTElTVF9IRUFEKCZwZC0+ZG1hcSk7CisJbXV0ZXhfaW5pdCgmcGQtPm11eCk7CisJcGQtPnZkZXYtPmxvY2sgPSAmcGQtPm11eDsgLyogZm9yIGxvY2tpbmcgdjRsMl9maWxlX29wZXJhdGlvbnMgKi8KKwlzcGluX2xvY2tfaW5pdCgmcGQtPmxvY2spOworCXBkLT5jc3IyID0gY3NyMl9pbml0OworCXBkLT5jb25maWcgPSBjb25maWdfaW5pdDsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9lbmFibGVfZGV2OworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCBwY2lfbmFtZShwZGV2KSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxX3JlZ2lvbjsKKwlwZC0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkLT5wZGV2LCAwKSk7CisJaWYgKCFwZC0+cmVncykKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcGNpX2lvbWFwOworCWVyciA9IGR0MzE1NV9pbml0X2JvYXJkKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2luaXRfYm9hcmQ7CisJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfaW5pdF9ib2FyZDsKKwlpZiAoZHQzMTU1X2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9DSFVOS19TSVpFLAorCQkJCQkJCURNQV9NRU1PUllfTUFQKSkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgInByZWFsbG9jYXRlZCA4IGJ1ZmZlcnNcbiIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIvZGV2L3ZpZGVvJWkgaXMgcmVhZHlcbiIsIHBkLT52ZGV2LT5taW5vcik7CisJcmV0dXJuIDA7ICAvKiAgIHN1Y2Nlc3MgICAqLworCitlcnJfaW5pdF9ib2FyZDoKKwlwY2lfaW91bm1hcChwZGV2LCBwZC0+cmVncyk7CitlcnJfcGNpX2lvbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK2Vycl9yZXFfcmVnaW9uOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9lbmFibGVfZGV2OgorCXZpZGVvX2RldmljZV9yZWxlYXNlKHBkLT52ZGV2KTsKK2Vycl92aWRlb19kZXZpY2VfYWxsb2M6CisJa2ZyZWUocGQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZHQzMTU1X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZHQzMTU1X2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldik7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGQtPnZkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHBkLT5yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCS8qCisJICogdmlkZW9fZGV2aWNlX3JlbGVhc2UoKSBpcyBpbnZva2VkIGF1dG9tYXRpY2FsbHkKKwkgKiBzZWU6IHN0cnVjdCB2aWRlb19kZXZpY2UgZHQzMTU1X3ZkZXYKKwkgKi8KKwlrZnJlZShwZCk7Cit9CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShwY2lfaWRzKSA9IHsKKwl7IFBDSV9ERVZJQ0UoRFQzMTU1X1ZFTkRPUl9JRCwgRFQzMTU1X0RFVklDRV9JRCkgfSwKKwl7IDAsIC8qIHplcm8gbWFya3MgdGhlIGVuZCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEVDMxNTVfTkFNRSwKKwkuaWRfdGFibGUgPSBwY2lfaWRzLAorCS5wcm9iZSA9IGR0MzE1NV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoZHQzMTU1X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorZHQzMTU1X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2R0MzE1NV9leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGR0MzE1NV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkdDMxNTVfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInZpZGVvNGxpbnV4IHBjaS1kcml2ZXIgZm9yIGR0MzE1NSBmcmFtZSBncmFiYmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJpbiBNaXRvdiA8bWl0b3ZAaXNzcC5iYXMuYmc+Iik7CitNT0RVTEVfVkVSU0lPTihEVDMxNTVfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2R0MzE1NXY0bC9kdDMxNTV2NGwuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL0tjb25maWcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvUkVBRE1FCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL1JFQURNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXAuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9sb3cuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NldHRpbmdzLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvS2NvbmZpZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvTWFrZWZpbGUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9SRUFETUUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvUkVBRE1FCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L1JFQURNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWRyaXZlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctZncuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctZncuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1pMmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LWkyYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy1wcml2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctcHJpdi5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXVzYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDctdXNiLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvZ283MDA3LXY0bDIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy12NGwyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L2dvNzAwNy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9nbzcwMDcudHh0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWJvYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3MyMjUwLWJvYXJkLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1ib2FyZC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWxvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvczIyNTAtbG9hZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvczIyNTAtbG9hZGVyLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc25kLWdvNzAwNy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy9zbmQtZ283MDA3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc25kLWdvNzAwNy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3NuZC1nbzcwMDcuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1pMmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLWkyYy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1vdjc2NDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLW92NzY0MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1vdjc2NDAuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtb3Y3NjQwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNhYTcxMTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNhYTcxMTMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc2FhNzExMy5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zYWE3MTEzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNhYTcxMTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNhYTcxMTUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc2FhNzExNS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zYWE3MTE1LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtdHcyODA0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy10dzI4MDQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtdHc5OTAzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy10dzk5MDMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtdHc5OTAzLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9nbzcwMDcvd2lzLXR3OTkwMy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy11ZGExMzQyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZ283MDA3L3dpcy11ZGExMzQyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXVkYTEzNDIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2dvNzAwNy93aXMtdWRhMTM0Mi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvS2NvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvS2NvbmZpZwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvS2NvbmZpZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvTWFrZWZpbGUKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL01ha2VmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvVE9ETwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvVE9ETy5saXJjX3ppbG9nIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvVE9ETy5saXJjX3ppbG9nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9UT0RPLmxpcmNfemlsb2cKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL1RPRE8ubGlyY196aWxvZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19idDgyOS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2J0ODI5LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfYnQ4MjkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19lbmUwMTAwLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2VuZTAxMDAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19lbmUwMTAwLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfZW5lMDEwMC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2lnb3JwbHVndXNiLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfaWdvcnBsdWd1c2IuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pZ29ycGx1Z3VzYi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19wYXJhbGxlbC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfcGFyYWxsZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19wYXJhbGxlbC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zYXNlbS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY190dHVzYmlyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3R0dXNiaXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY190dHVzYmlyLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfdHR1c2Jpci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3ppbG9nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3ppbG9nLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfemlsb2cuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY196aWxvZy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9LY29uZmlnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL0tjb25maWcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL01ha2VmaWxlCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL1RPRE8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9UT0RPCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvVE9ETwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9jb3JlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9jb3JlLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9kaXNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZGlzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZGlzcC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZGlzcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZW5jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9lbmMuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2VuYy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvZzcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2c3MjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QwZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2c3MjMuYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVkZSAic29sbzZ4MTAuaCIKKyNpbmNsdWRlICJ0dzI4LmgiCisKKyNkZWZpbmUgRzcyM19JTlRSX09SREVSCQkwCisjZGVmaW5lIEc3MjNfRkRNQV9QQUdFUwkJMzIKKyNkZWZpbmUgRzcyM19QRVJJT0RfQllURVMJNDgKKyNkZWZpbmUgRzcyM19QRVJJT0RfQkxPQ0sJMTAyNAorI2RlZmluZSBHNzIzX0ZSQU1FU19QRVJfUEFHRQk0OAorCisvKiBTZXRzIHVwIGNoYW5uZWxzIDE2LTE5IGZvciBkZWNvZGluZyBhbmQgMC0xNSBmb3IgZW5jb2RpbmcgKi8KKyNkZWZpbmUgT1VUTU9ERV9NQVNLCQkweDMwMAorCisjZGVmaW5lIFNBTVBMRVJBVEUJCTgwMDAKKyNkZWZpbmUgQklUUkFURQkJCTI1CisKKy8qIFRoZSBzb2xvIHdyaXRlcyB0byAxayBieXRlIHBhZ2VzLCAzMiBwYWdlcywgaW4gdGhlIGRtYS4gRWFjaCAxayBwYWdlCisgKiBpcyBicm9rZW4gZG93biB0byAyMCAqIDQ4IGJ5dGUgcmVnaW9ucyAob25lIGZvciBlYWNoIGNoYW5uZWwgcG9zc2libGUpCisgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGJlaW5nIGR1bW15IGRhdGEuICovCisjZGVmaW5lIE1BWF9CVUZGRVIJCShHNzIzX1BFUklPRF9CWVRFUyAqIFBFUklPRFNfTUFYKQorI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KKyNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKKyNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUworCitzdHJ1Y3Qgc29sb19zbmRfcGNtIHsKKwlpbnQJCW9uOworCXNwaW5sb2NrX3QJbG9jazsKKwlzdHJ1Y3Qgc29sb19kZXYJKnNvbG9fZGV2OworCXVuc2lnbmVkIGNoYXIJZzcyM19idWZbRzcyM19QRVJJT0RfQllURVNdOworfTsKKworc3RhdGljIHZvaWQgc29sb19nNzIzX2NvbmZpZyhzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCWludCBjbGtfZGl2OworCisJY2xrX2RpdiA9IFNPTE9fQ0xPQ0tfTUhaIC8gKFNBTVBMRVJBVEUgKiAoQklUUkFURSAqIDIpICogMik7CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19BVURJT19TQU1QTEUsCisJCSAgICAgICBTT0xPX0FVRElPX0JJVFJBVEUoQklUUkFURSkgfAorCQkgICAgICAgU09MT19BVURJT19DTEtfRElWKGNsa19kaXYpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0ZETUFfSU5UUiwKKwkJICAgICAgU09MT19BVURJT19GRE1BX0lOVEVSVkFMKElSUV9QQUdFUykgfAorCQkgICAgICBTT0xPX0FVRElPX0lOVFJfT1JERVIoRzcyM19JTlRSX09SREVSKSB8CisJCSAgICAgIFNPTE9fQVVESU9fRkRNQV9CQVNFKFNPTE9fRzcyM19FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKKworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsCisJCSAgICAgICBTT0xPX0FVRElPX0VOQUJMRSB8IFNPTE9fQVVESU9fSTJTX01PREUgfAorCQkgICAgICAgU09MT19BVURJT19JMlNfTVVMVEkoMykgfCBTT0xPX0FVRElPX01PREUoT1VUTU9ERV9NQVNLKSk7Cit9CisKK3ZvaWQgc29sb19nNzIzX2lzcihzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9CisJCSZzb2xvX2Rldi0+c25kX3BjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3M7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207CisKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfRzcyMyk7CisKKwlmb3IgKHNzID0gcHN0ci0+c3Vic3RyZWFtOyBzcyAhPSBOVUxMOyBzcyA9IHNzLT5uZXh0KSB7CisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogVGhpcyBtZWFucyBvcGVuKCkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb25lICovCisJCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBzb2xvX2RldikKKwkJCWNvbnRpbnVlOworCisJCS8qIEhhdmVuJ3QgdHJpZ2dlcmVkIGEgc3RhcnQgeWV0ICovCisJCXNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJCWlmICghc29sb19wY20tPm9uKQorCQkJY29udGludWU7CisKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzcyk7CisJfQorfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzcywgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKK30KKworc3RhdGljIGludCBzbmRfc29sb19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3MpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3NvbG9fcGNtX2h3ID0geworCS5pbmZvCQkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1U4LAorCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMCwKKwkucmF0ZV9taW4JCT0gODAwMCwKKwkucmF0ZV9tYXgJCT0gODAwMCwKKwkuY2hhbm5lbHNfbWluCQk9IDEsCisJLmNoYW5uZWxzX21heAkJPSAxLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gTUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbgk9IEc3MjNfUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gRzcyM19QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluCQk9IFBFUklPRFNfTUlOLAorCS5wZXJpb2RzX21heAkJPSBQRVJJT0RTX01BWCwKK307CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207CisKKwlzb2xvX3BjbSA9IGt6YWxsb2Moc2l6ZW9mKCpzb2xvX3BjbSksIEdGUF9LRVJORUwpOworCWlmIChzb2xvX3BjbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZzb2xvX3BjbS0+bG9jayk7CisJc29sb19wY20tPnNvbG9fZGV2ID0gc29sb19kZXY7CisJc3MtPnJ1bnRpbWUtPmh3ID0gc25kX3NvbG9fcGNtX2h3OworCisJc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQoreworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisKKwlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlrZnJlZShzb2xvX3BjbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29sb19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLCBpbnQgY21kKQoreworCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7CisJc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmc29sb19wY20tPmxvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlpZiAoc29sb19wY20tPm9uID09IDApIHsKKwkJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIsIHN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCisJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNvbG9fZGV2LT5zbmRfdXNlcnMpID09IDEpCisJCQkJc29sb19pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX0c3MjMpOworCQkJc29sb19wY20tPm9uID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWlmIChzb2xvX3BjbS0+b24pIHsKKwkJCS8qIElmIHRoaXMgd2FzIG91ciBsYXN0IHVzZXIsIHN3aXRjaCB0aGVtIG9mZiAqLworCQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzb2xvX2Rldi0+c25kX3VzZXJzKSA9PSAwKQorCQkJCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7CisJCQlzb2xvX3BjbS0+b24gPSAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJc3Bpbl91bmxvY2soJnNvbG9fcGNtLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OworCXNuZF9wY21fdWZyYW1lc190IGlkeCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fQVVESU9fU1RBKSAmIDB4MWY7CisKKwlyZXR1cm4gaWR4ICogRzcyM19GUkFNRVNfUEVSX1BBR0U7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNoYW5uZWwsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCit7CisJc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OworCWludCBlcnIsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGNvdW50IC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpOyBpKyspIHsKKwkJaW50IHBhZ2UgPSAocG9zIC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpICsgaTsKKworCQllcnIgPSBzb2xvX3AybV9kbWEoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9HNzIzRSwgMCwKKwkJCQkgICBzb2xvX3BjbS0+ZzcyM19idWYsCisJCQkJICAgU09MT19HNzIzX0VYVF9BRERSKHNvbG9fZGV2KSArCisJCQkJICAgKHBhZ2UgKiBHNzIzX1BFUklPRF9CTE9DSykgKworCQkJCSAgIChzcy0+bnVtYmVyICogRzcyM19QRVJJT0RfQllURVMpLAorCQkJCSAgIEc3MjNfUEVSSU9EX0JZVEVTKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZXJyID0gY29weV90b191c2VyKGRzdCArIChpICogRzcyM19QRVJJT0RfQllURVMpLAorCQkJCSAgIHNvbG9fcGNtLT5nNzIzX2J1ZiwgRzcyM19QRVJJT0RfQllURVMpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29sb19wY21fb3BzID0geworCS5vcGVuID0gc25kX3NvbG9fcGNtX29wZW4sCisJLmNsb3NlID0gc25kX3NvbG9fcGNtX2Nsb3NlLAorCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPSBzbmRfc29sb19od19wYXJhbXMsCisJLmh3X2ZyZWUgPSBzbmRfc29sb19od19mcmVlLAorCS5wcmVwYXJlID0gc25kX3NvbG9fcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfc29sb19wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9zb2xvX3BjbV9wb2ludGVyLAorCS5jb3B5ID0gc25kX3NvbG9fcGNtX2NvcHksCit9OworCitzdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMTsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxNTsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLnN0ZXAgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKKwl1OCBvbGRfdmFsOworCisJb2xkX3ZhbCA9IHR3MjhfZ2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoKTsKKwlpZiAob2xkX3ZhbCA9PSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJcmV0dXJuIDA7CisKKwl0dzI4X3NldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCwgdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZSA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCisJLmluZm8gPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9pbmZvLAorCS5nZXQgPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9nZXQsCisJLnB1dCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dCwKK307CisKK3N0YXRpYyBpbnQgc29sb19zbmRfcGNtX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBzb2xvX2Rldi0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzOworCWludCByZXQ7CisJaW50IGk7CisKKwlyZXQgPSBzbmRfcGNtX25ldyhjYXJkLCBjYXJkLT5kcml2ZXIsIDAsIDAsIHNvbG9fZGV2LT5ucl9jaGFucywKKwkJCSAgJnBjbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCisJCQkmc25kX3NvbG9fcGNtX29wcyk7CisKKwlzbmRfcGNtX2NoaXAocGNtKSA9IHNvbG9fZGV2OworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RyY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKKworCWZvciAoaSA9IDAsIHNzID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOworCSAgICAgc3M7IHNzID0gc3MtPm5leHQsIGkrKykKKwkJc3ByaW50Zihzcy0+bmFtZSwgIkNhbWVyYSAjJWQgQXVkaW8iLCBpKTsKKworCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAorCQkJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKKwkJCQkJTUFYX0JVRkZFUiwgTUFYX0JVRkZFUik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzb2xvX2Rldi0+c25kX3BjbSA9IHBjbTsKKworCXJldHVybiAwOworfQorCitpbnQgc29sb19nNzIzX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKK3sKKwlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsgTlVMTCB9OworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrY3RsOworCWNoYXIgbmFtZVszMl07CisJaW50IHJldDsKKworCWF0b21pY19zZXQoJnNvbG9fZGV2LT5zbmRfdXNlcnMsIDApOworCisJLyogQWxsb3dzIGZvciBlYXNpZXIgbWFwcGluZyBiZXR3ZWVuIHZpZGVvIGFuZCBhdWRpbyAqLworCXNwcmludGYobmFtZSwgIlNvZnRsb2dpYyVkIiwgc29sb19kZXYtPnZmZC0+bnVtKTsKKworCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAorCQkJICAgICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljYXJkID0gc29sb19kZXYtPnNuZF9jYXJkOworCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgU09MTzZYMTBfTkFNRSk7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNPTE8tNngxMCBBdWRpbyIpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBvbiAlcyBJUlEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCisJCXBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSwgc29sb19kZXYtPnBkZXYtPmlycSk7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmc29sb19kZXYtPnBkZXYtPmRldik7CisKKwlyZXQgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbG9fZGV2LCAmb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBzbmRfZXJyb3I7CisKKwkvKiBNaXhlciBjb250cm9scyAqLworCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJTT0xPLTZ4MTAiKTsKKwlrY3RsID0gc25kX3NvbG9fY2FwdHVyZV92b2x1bWU7CisJa2N0bC5jb3VudCA9IHNvbG9fZGV2LT5ucl9jaGFuczsKKwlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc25kX2Vycm9yOworCisJc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7CisKKwlkZXZfaW5mbygmc29sb19kZXYtPnBkZXYtPmRldiwgIkFsc2Egc291bmQgY2FyZCBhcyAlc1xuIiwgbmFtZSk7CisKKwlyZXR1cm4gMDsKKworc25kX2Vycm9yOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzb2xvX2c3MjNfZXhpdChzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQoreworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsIDApOworCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7CisKKwlzbmRfY2FyZF9mcmVlKHNvbG9fZGV2LT5zbmRfY2FyZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2dwaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2dwaW8uYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2dwaW8uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL2kyYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9pMmMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL2pwZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9qcGVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9qcGVnLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9qcGVnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9vZmZzZXRzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvb2Zmc2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb2Zmc2V0cy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvb2Zmc2V0cy5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb3NkLWZvbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9vc2QtZm9udC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvb3NkLWZvbnQuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL29zZC1mb250LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9wMm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9wMm0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3AybS5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvcDJtLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9yZWdpc3RlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC9yZWdpc3RlcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3JlZ2lzdGVycy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvcmVnaXN0ZXJzLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNngxMC5oIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3NvbG82eDEwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNngxMC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvc29sbzZ4MTAuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3R3MjguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC90dzI4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC90dzI4LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC90dzI4LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC90dzI4LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdHcyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdHcyOC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdHcyOC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zb2xvNngxMC92NGwyLWVuYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi1lbmMuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL21lZGlhL3NvbG82eDEwL3Y0bDItZW5jLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC92NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdjRsMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvdjRsMi5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc29sbzZ4MTAvdjRsMi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvaW5vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCmluZGV4IGYzYzYwNjAuLjdhMTk1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9pbm9kZS5jCkBAIC0xMTk3LDcgKzExOTcsNyBAQAogdm9pZCBwb2htZWxmc19maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZXRmc19pbm9kZV9pbmZvICppbmZvKQogewogCWlub2RlLT5pX21vZGUgPSBpbmZvLT5tb2RlOwotCWlub2RlLT5pX25saW5rID0gaW5mby0+bmxpbms7CisJc2V0X25saW5rKGlub2RlLCBpbmZvLT5ubGluayk7CiAJaW5vZGUtPmlfdWlkID0gaW5mby0+dWlkOwogCWlub2RlLT5pX2dpZCA9IGluZm8tPmdpZDsKIAlpbm9kZS0+aV9ibG9ja3MgPSBpbmZvLT5ibG9ja3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwppbmRleCAzYjMyZjllLi44N2M5Y2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zY3NpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9nNzIzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvZzcyMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI3NGJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9nNzIzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCbHVlY2hlcnJ5LCBMTEMgd3d3LmJsdWVjaGVycnlkdnIuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSAic29sbzZ4MTAuaCIKLSNpbmNsdWRlICJ0dzI4LmgiCi0KLSNkZWZpbmUgRzcyM19JTlRSX09SREVSCQkwCi0jZGVmaW5lIEc3MjNfRkRNQV9QQUdFUwkJMzIKLSNkZWZpbmUgRzcyM19QRVJJT0RfQllURVMJNDgKLSNkZWZpbmUgRzcyM19QRVJJT0RfQkxPQ0sJMTAyNAotI2RlZmluZSBHNzIzX0ZSQU1FU19QRVJfUEFHRQk0OAotCi0vKiBTZXRzIHVwIGNoYW5uZWxzIDE2LTE5IGZvciBkZWNvZGluZyBhbmQgMC0xNSBmb3IgZW5jb2RpbmcgKi8KLSNkZWZpbmUgT1VUTU9ERV9NQVNLCQkweDMwMAotCi0jZGVmaW5lIFNBTVBMRVJBVEUJCTgwMDAKLSNkZWZpbmUgQklUUkFURQkJCTI1Ci0KLS8qIFRoZSBzb2xvIHdyaXRlcyB0byAxayBieXRlIHBhZ2VzLCAzMiBwYWdlcywgaW4gdGhlIGRtYS4gRWFjaCAxayBwYWdlCi0gKiBpcyBicm9rZW4gZG93biB0byAyMCAqIDQ4IGJ5dGUgcmVnaW9ucyAob25lIGZvciBlYWNoIGNoYW5uZWwgcG9zc2libGUpCi0gKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGJlaW5nIGR1bW15IGRhdGEuICovCi0jZGVmaW5lIE1BWF9CVUZGRVIJCShHNzIzX1BFUklPRF9CWVRFUyAqIFBFUklPRFNfTUFYKQotI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KLSNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKLSNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUwotCi1zdHJ1Y3Qgc29sb19zbmRfcGNtIHsKLQlpbnQJCW9uOwotCXNwaW5sb2NrX3QJbG9jazsKLQlzdHJ1Y3Qgc29sb19kZXYJKnNvbG9fZGV2OwotCXVuc2lnbmVkIGNoYXIJZzcyM19idWZbRzcyM19QRVJJT0RfQllURVNdOwotfTsKLQotc3RhdGljIHZvaWQgc29sb19nNzIzX2NvbmZpZyhzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCWludCBjbGtfZGl2OwotCi0JY2xrX2RpdiA9IFNPTE9fQ0xPQ0tfTUhaIC8gKFNBTVBMRVJBVEUgKiAoQklUUkFURSAqIDIpICogMik7Ci0KLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19BVURJT19TQU1QTEUsCi0JCSAgICAgICBTT0xPX0FVRElPX0JJVFJBVEUoQklUUkFURSkgfAotCQkgICAgICAgU09MT19BVURJT19DTEtfRElWKGNsa19kaXYpKTsKLQotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0ZETUFfSU5UUiwKLQkJICAgICAgU09MT19BVURJT19GRE1BX0lOVEVSVkFMKElSUV9QQUdFUykgfAotCQkgICAgICBTT0xPX0FVRElPX0lOVFJfT1JERVIoRzcyM19JTlRSX09SREVSKSB8Ci0JCSAgICAgIFNPTE9fQVVESU9fRkRNQV9CQVNFKFNPTE9fRzcyM19FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKLQotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsCi0JCSAgICAgICBTT0xPX0FVRElPX0VOQUJMRSB8IFNPTE9fQVVESU9fSTJTX01PREUgfAotCQkgICAgICAgU09MT19BVURJT19JMlNfTVVMVEkoMykgfCBTT0xPX0FVRElPX01PREUoT1VUTU9ERV9NQVNLKSk7Ci19Ci0KLXZvaWQgc29sb19nNzIzX2lzcihzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCXN0cnVjdCBzbmRfcGNtX3N0ciAqcHN0ciA9Ci0JCSZzb2xvX2Rldi0+c25kX3BjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3M7Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207Ci0KLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfRzcyMyk7Ci0KLQlmb3IgKHNzID0gcHN0ci0+c3Vic3RyZWFtOyBzcyAhPSBOVUxMOyBzcyA9IHNzLT5uZXh0KSB7Ci0JCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJLyogVGhpcyBtZWFucyBvcGVuKCkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb25lICovCi0JCWlmIChzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9PSBzb2xvX2RldikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEhhdmVuJ3QgdHJpZ2dlcmVkIGEgc3RhcnQgeWV0ICovCi0JCXNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0JCWlmICghc29sb19wY20tPm9uKQotCQkJY29udGludWU7Ci0KLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzcyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNuZF9zb2xvX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzcywgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29sb19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3NvbG9fcGNtX2h3ID0gewotCS5pbmZvCQkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkgICBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEKSwKLQkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1U4LAotCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMCwKLQkucmF0ZV9taW4JCT0gODAwMCwKLQkucmF0ZV9tYXgJCT0gODAwMCwKLQkuY2hhbm5lbHNfbWluCQk9IDEsCi0JLmNoYW5uZWxzX21heAkJPSAxLAotCS5idWZmZXJfYnl0ZXNfbWF4CT0gTUFYX0JVRkZFUiwKLQkucGVyaW9kX2J5dGVzX21pbgk9IEc3MjNfUEVSSU9EX0JZVEVTLAotCS5wZXJpb2RfYnl0ZXNfbWF4CT0gRzcyM19QRVJJT0RfQllURVMsCi0JLnBlcmlvZHNfbWluCQk9IFBFUklPRFNfTUlOLAotCS5wZXJpb2RzX21heAkJPSBQRVJJT0RTX01BWCwKLX07Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY207Ci0KLQlzb2xvX3BjbSA9IGt6YWxsb2Moc2l6ZW9mKCpzb2xvX3BjbSksIEdGUF9LRVJORUwpOwotCWlmIChzb2xvX3BjbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZzb2xvX3BjbS0+bG9jayk7Ci0Jc29sb19wY20tPnNvbG9fZGV2ID0gc29sb19kZXY7Ci0Jc3MtPnJ1bnRpbWUtPmh3ID0gc25kX3NvbG9fcGNtX2h3OwotCi0Jc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQotewotCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0KLQlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKLQlrZnJlZShzb2xvX3BjbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfc29sb19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzLCBpbnQgY21kKQotewotCXN0cnVjdCBzb2xvX3NuZF9wY20gKnNvbG9fcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcyk7Ci0Jc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldiA9IHNvbG9fcGNtLT5zb2xvX2RldjsKLQlpbnQgcmV0ID0gMDsKLQotCXNwaW5fbG9jaygmc29sb19wY20tPmxvY2spOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlpZiAoc29sb19wY20tPm9uID09IDApIHsKLQkJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIsIHN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCi0JCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNvbG9fZGV2LT5zbmRfdXNlcnMpID09IDEpCi0JCQkJc29sb19pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX0c3MjMpOwotCQkJc29sb19wY20tPm9uID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCWlmIChzb2xvX3BjbS0+b24pIHsKLQkJCS8qIElmIHRoaXMgd2FzIG91ciBsYXN0IHVzZXIsIHN3aXRjaCB0aGVtIG9mZiAqLwotCQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzb2xvX2Rldi0+c25kX3VzZXJzKSA9PSAwKQotCQkJCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7Ci0JCQlzb2xvX3BjbS0+b24gPSAwOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnNvbG9fcGNtLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCi17Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OwotCXNuZF9wY21fdWZyYW1lc190IGlkeCA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fQVVESU9fU1RBKSAmIDB4MWY7Ci0KLQlyZXR1cm4gaWR4ICogRzcyM19GUkFNRVNfUEVSX1BBR0U7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNoYW5uZWwsCi0JCQkgICAgIHNuZF9wY21fdWZyYW1lc190IHBvcywgdm9pZCBfX3VzZXIgKmRzdCwKLQkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpCi17Ci0Jc3RydWN0IHNvbG9fc25kX3BjbSAqc29sb19wY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKTsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc29sb19wY20tPnNvbG9fZGV2OwotCWludCBlcnIsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGNvdW50IC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpOyBpKyspIHsKLQkJaW50IHBhZ2UgPSAocG9zIC8gRzcyM19GUkFNRVNfUEVSX1BBR0UpICsgaTsKLQotCQllcnIgPSBzb2xvX3AybV9kbWEoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9HNzIzRSwgMCwKLQkJCQkgICBzb2xvX3BjbS0+ZzcyM19idWYsCi0JCQkJICAgU09MT19HNzIzX0VYVF9BRERSKHNvbG9fZGV2KSArCi0JCQkJICAgKHBhZ2UgKiBHNzIzX1BFUklPRF9CTE9DSykgKwotCQkJCSAgIChzcy0+bnVtYmVyICogRzcyM19QRVJJT0RfQllURVMpLAotCQkJCSAgIEc3MjNfUEVSSU9EX0JZVEVTKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJZXJyID0gY29weV90b191c2VyKGRzdCArIChpICogRzcyM19QRVJJT0RfQllURVMpLAotCQkJCSAgIHNvbG9fcGNtLT5nNzIzX2J1ZiwgRzcyM19QRVJJT0RfQllURVMpOwotCi0JCWlmIChlcnIpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29sb19wY21fb3BzID0gewotCS5vcGVuID0gc25kX3NvbG9fcGNtX29wZW4sCi0JLmNsb3NlID0gc25kX3NvbG9fcGNtX2Nsb3NlLAotCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMgPSBzbmRfc29sb19od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzbmRfc29sb19od19mcmVlLAotCS5wcmVwYXJlID0gc25kX3NvbG9fcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSBzbmRfc29sb19wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IHNuZF9zb2xvX3BjbV9wb2ludGVyLAotCS5jb3B5ID0gc25kX3NvbG9fcGNtX2NvcHksCi19OwotCi1zdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKLXsKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxNTsKLQlpbmZvLT52YWx1ZS5pbnRlZ2VyLnN0ZXAgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKLQotCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXU4IGNoID0gdmFsdWUtPmlkLm51bWlkIC0gMTsKLQl1OCBvbGRfdmFsOwotCi0Jb2xkX3ZhbCA9IHR3MjhfZ2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoKTsKLQlpZiAob2xkX3ZhbCA9PSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJcmV0dXJuIDA7Ci0KLQl0dzI4X3NldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCwgdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZSA9IHsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJDYXB0dXJlIFZvbHVtZSIsCi0JLmluZm8gPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9pbmZvLAotCS5nZXQgPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZV9nZXQsCi0JLnB1dCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dCwKLX07Ci0KLXN0YXRpYyBpbnQgc29sb19zbmRfcGNtX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBzb2xvX2Rldi0+c25kX2NhcmQ7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzOwotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQlyZXQgPSBzbmRfcGNtX25ldyhjYXJkLCBjYXJkLT5kcml2ZXIsIDAsIDAsIHNvbG9fZGV2LT5ucl9jaGFucywKLQkJCSAgJnBjbSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQkmc25kX3NvbG9fcGNtX29wcyk7Ci0KLQlzbmRfcGNtX2NoaXAocGNtKSA9IHNvbG9fZGV2OwotCXBjbS0+aW5mb19mbGFncyA9IDA7Ci0Jc3RyY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKLQotCWZvciAoaSA9IDAsIHNzID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtOwotCSAgICAgc3M7IHNzID0gc3MtPm5leHQsIGkrKykKLQkJc3ByaW50Zihzcy0+bmFtZSwgIkNhbWVyYSAjJWQgQXVkaW8iLCBpKTsKLQotCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAotCQkJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAotCQkJCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCQkJTUFYX0JVRkZFUiwgTUFYX0JVRkZFUik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzb2xvX2Rldi0+c25kX3BjbSA9IHBjbTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgc29sb19nNzIzX2luaXQoc3RydWN0IHNvbG9fZGV2ICpzb2xvX2RldikKLXsKLQlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsgTlVMTCB9OwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBrY3RsOwotCWNoYXIgbmFtZVszMl07Ci0JaW50IHJldDsKLQotCWF0b21pY19zZXQoJnNvbG9fZGV2LT5zbmRfdXNlcnMsIDApOwotCi0JLyogQWxsb3dzIGZvciBlYXNpZXIgbWFwcGluZyBiZXR3ZWVuIHZpZGVvIGFuZCBhdWRpbyAqLwotCXNwcmludGYobmFtZSwgIlNvZnRsb2dpYyVkIiwgc29sb19kZXYtPnZmZC0+bnVtKTsKLQotCXJldCA9IHNuZF9jYXJkX2NyZWF0ZShTTkRSVl9ERUZBVUxUX0lEWDEsIG5hbWUsIFRISVNfTU9EVUxFLCAwLAotCQkJICAgICAgJnNvbG9fZGV2LT5zbmRfY2FyZCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQljYXJkID0gc29sb19kZXYtPnNuZF9jYXJkOwotCi0Jc3RyY3B5KGNhcmQtPmRyaXZlciwgU09MTzZYMTBfTkFNRSk7Ci0Jc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgIlNPTE8tNngxMCBBdWRpbyIpOwotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBvbiAlcyBJUlEgJWQiLCBjYXJkLT5zaG9ydG5hbWUsCi0JCXBjaV9uYW1lKHNvbG9fZGV2LT5wZGV2KSwgc29sb19kZXYtPnBkZXYtPmlycSk7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmc29sb19kZXYtPnBkZXYtPmRldik7Ci0KLQlyZXQgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIHNvbG9fZGV2LCAmb3BzKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBzbmRfZXJyb3I7Ci0KLQkvKiBNaXhlciBjb250cm9scyAqLwotCXN0cmNweShjYXJkLT5taXhlcm5hbWUsICJTT0xPLTZ4MTAiKTsKLQlrY3RsID0gc25kX3NvbG9fY2FwdHVyZV92b2x1bWU7Ci0Ja2N0bC5jb3VudCA9IHNvbG9fZGV2LT5ucl9jaGFuczsKLQlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gc25kX2Vycm9yOwotCi0JcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gc25kX2Vycm9yOwotCi0Jc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7Ci0KLQlkZXZfaW5mbygmc29sb19kZXYtPnBkZXYtPmRldiwgIkFsc2Egc291bmQgY2FyZCBhcyAlc1xuIiwgbmFtZSk7Ci0KLQlyZXR1cm4gMDsKLQotc25kX2Vycm9yOgotCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBzb2xvX2c3MjNfZXhpdChzdHJ1Y3Qgc29sb19kZXYgKnNvbG9fZGV2KQotewotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX0FVRElPX0NPTlRST0wsIDApOwotCXNvbG9faXJxX29mZihzb2xvX2RldiwgU09MT19JUlFfRzcyMyk7Ci0KLQlzbmRfY2FyZF9mcmVlKHNvbG9fZGV2LT5zbmRfY2FyZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbXRkLmMKaW5kZXggMmJkMzQ2Ni4uYTljMzA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX210ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9tdGQuYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAJCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJCWludCByZXQ7CiAKLQkJb3BzLm1vZGUgPSBNVERfT09CX0FVVE87CisJCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAkJb3BzLmRhdGJ1ZiA9IHJlYWRfZGF0YTsKIAkJb3BzLmxlbiA9IERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZTsKIAkJb3BzLm9vYmJ1ZiA9IHJlYWRfZGF0YSArIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSArIEJUU0lHX09GRlNFVDsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCQlpbnQgcmV0OwogCi0JCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5kYXRidWYgPSB3cml0ZV9kYXRhOwogCQlvcHMubGVuID0gRGV2aWNlSW5mby53UGFnZURhdGFTaXplOwogCQlvcHMub29iYnVmID0gd3JpdGVfZGF0YSArIERldmljZUluZm8ud1BhZ2VEYXRhU2l6ZSArIEJUU0lHX09GRlNFVDsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOwogCQlpbnQgcmV0OwogCi0JCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCQlvcHMubW9kZSA9IE1URF9PUFNfQVVUT19PT0I7CiAJCW9wcy5kYXRidWYgPSBOVUxMOwogCQlvcHMubGVuID0gMDsKIAkJb3BzLm9vYmJ1ZiA9IHJlYWRfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDBlYmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1Ub2RvOgotCS0gRml4IHRoZSBsb3NzIG9mIHNvbWUgYmxvY2tzIHdoZW4gcmVjZWl2aW5nIHRoZSB2aWRlbyBVUkIncwotCS0gQWRkIGEgbG9jayBhdCB0bTYwMDBfcmVhZF93cml0ZV91c2IoKSB0byBwcmV2ZW50IHR3byBzaW11bHRhbmVvdXMgYWNjZXNzIHRvIHRoZQotCSAgVVJCIGNvbnRyb2wgdHJhbnNmZXJzCi0JLSBQcm9wZXJseSBhZGQgdGhlIGxvY2tzIGF0IHRtNjAwMC12aWRlbwotCS0gQWRkIGF1ZGlvIHN1cHBvcnQKLQktIEFkZCB2Ymkgc3VwcG9ydAotCS0gQWRkIElSIHN1cHBvcnQKLQktIERvIHNldmVyYWwgY2xlYW51cHMKLQktIEkgdGhpbmsgdGhhdCBmcmFtZTEvZnJhbWUwIGFyZSBpbnZlcnRlZC4gVGhpcyBjYXVzZXMgYSBmdW5ueSBlZmZlY3QgYXQgdGhlIGltYWdlLgotCSAgdGhlIGZpeCBpcyB0cml2aWFsLCBidXQgcmVxdWlyZSBzb21lIHRlc3RzCi0JLSBNeSB0bTYwMTAgZGV2aWNlcyBzb21ldGltZXMgaW5zaXN0IG9uIHN0b3Agd29ya2luZy4gSSBuZWVkIHRvIHR1cm4gdGhlbSBvZmYsIHJlbW92aW5nCi0JICBmcm9tIG15IG1hY2hpbmUgYW5kIHdhaXQgZm9yIGEgd2hpbGUgZm9yIGl0IHRvIHdvcmsgYWdhaW4uIEknbSBzdGFydGluZyB0byB0aGluayB0aGF0Ci0JICBpdCBpcyBhbiBvdmVyaGVhdCBpc3N1ZSAtIGlzIHRoZXJlIGEgd29ya2Fyb3VuZCB0aGF0IHdlIGNvdWxkIGRvPwotCS0gU29tZXRpbWVzLCB0bTYwMTAgZG9lc24ndCByZWFkIGVlcHJvbSBhdCB0aGUgcHJvcGVyIHRpbWUgKGhhcmR3YXJlIGJ1ZykuIFNvLCB0aGUgZGV2aWNlCi0JICBnb3QgbWlzcy1kZXRlY3RlZCBhcyBhICJnZW5lcmljIiB0bTYwMDAuIFRoaXMgY2FuIGJlIHJlYWxseSBiYWQgaWYgdGhlIHR1bmVyIGlzIHRoZQotCSAgTG93IFBvd2VyIG9uZSwgYXMgaXQgbWF5IHJlc3VsdCBvbiBsb2FkaW5nIHRoZSBoaWdoIHBvd2VyIGZpcm13YXJlLCB0aGF0IGNvdWxkIGRhbWFnZQotCSAgdGhlIGRldmljZS4gTWF5YmUgd2UgbWF5IHJlYWQgZWVwcm9tIHRvIGRvdWJsZSBjaGVjaywgd2hlbiB0aGUgZGV2aWNlIGlzIG1hcmtlZCBhcyAiZ2VuZXJpYyIKLQktIENvZGluZyBTdHlsZSBmaXhlcwotCS0gc3BhcnNlIGNsZWFudXBzCi0KLVBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNWQwZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1UaGVyZSBhIGZldyB0aGluZ3MgdG8gZG8gYmVmb3JlIHB1dHRpbmcgdGhpcyBkcml2ZXIgaW4gcHJvZHVjdGlvbjoKLQktIElSIE5FQyB3aXRoIHRtNTYwMC82MDAwIFRWIGNhcmRzCi0JLSBJUiBSQzUgd2l0aCB0bTU2MDAvNjAwMC82MDEwIFRWIGNhcmRzCi0JLSBDb2RpbmdTdHlsZTsKLQktIEZpeCBhdWRpbzsKLQktIEZpeCBzb21lIHBhbmljL09PUFMgY29uZGl0aW9ucy4KLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZmE4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1hbHNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqCi0gKiAgU3VwcG9ydCBmb3IgYXVkaW8gY2FwdHVyZSBmb3IgdG01NjAwLzYwMDAvNjAxMAotICogICAgKGMpIDIwMDctMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KLSAqCi0gKiAgQmFzZWQgb24gY3g4OC1hbHNhLmMKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotCi0KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi0jdW5kZWYgZHByaW50awotCi0jZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJCSAgIFwKLQlpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCQkJICAgXAotCQlwcmludGsoS0VSTl9JTkZPICIlcy8xOiAiIGZtdCwgY2hpcC0+Y29yZS0+bmFtZSAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkJTW9kdWxlIGdsb2JhbCBzdGF0aWMgdmFycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCi0KLXN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IHsxLCBbMSAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdG02MDAweCBzb3VuZGNhcmQuIGRlZmF1bHQgZW5hYmxlZC4iKTsKLQotbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0bTYwMDB4IGNhcHR1cmUgaW50ZXJmYWNlKHMpLiIpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQkJTW9kdWxlIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLU1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBkcml2ZXIgbW9kdWxlIGZvciB0bTU2MDAvdG02MDAwL3RtNjAxMCBiYXNlZCBUViBjYXJkcyIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LHRtNTYwMH0sIgotCQkJInt7VHJpZGVudCx0bTYwMDB9LCIKLQkJCSJ7e1RyaWRlbnQsdG02MDEwfSIpOwotc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCU1vZHVsZSBzcGVjaWZpYyBmdW50aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBCT0FSRCBTcGVjaWZpYzogU2V0cyBhdWRpbyBETUEKLSAqLwotCi1zdGF0aWMgaW50IF90bTYwMDBfc3RhcnRfYXVkaW9fZG1hKHN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXApCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpjb3JlID0gY2hpcC0+Y29yZTsKLQotCWRwcmludGsoMSwgIlN0YXJ0aW5nIGF1ZGlvIERNQVxuIik7Ci0KLQkvKiBFbmFibGVzIGF1ZGlvICovCi0JdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwgMHg0MCwgMHg0MCk7Ci0KLQl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoY29yZSwgNDgwMDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBCT0FSRCBTcGVjaWZpYzogUmVzZXRzIGF1ZGlvIERNQQotICovCi1zdGF0aWMgaW50IF90bTYwMDBfc3RvcF9hdWRpb19kbWEoc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOwotCi0JZHByaW50aygxLCAiU3RvcHBpbmcgYXVkaW8gRE1BXG4iKTsKLQotCS8qIERpc2FibGVzIGF1ZGlvICovCi0JdG02MDAwX3NldF9yZWdfbWFzayhjb3JlLCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwgMHgwMCwgMHg0MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHNwX2J1ZmZlcl9mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQlkcHJpbnRrKDIsICJGcmVlaW5nIGJ1ZmZlclxuIik7Ci0KLQl2ZnJlZShzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKTsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gTlVMTDsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHNwX2J1ZmZlcl9hbGxvYyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCWRwcmludGsoMiwgIkFsbG9jYXRpbmcgYnVmZmVyXG4iKTsKLQotCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKSB7Ci0JCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9ieXRlcyA+IHNpemUpCi0JCQlyZXR1cm4gMDsKLQotCQlkc3BfYnVmZmVyX2ZyZWUoc3Vic3RyZWFtKTsKLQl9Ci0KLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhID0gdm1hbGxvYyhzaXplKTsKLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPSBzaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCQlBTFNBIFBDTSBJbnRlcmZhY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogRGlnaXRhbCBoYXJkd2FyZSBkZWZpbml0aW9uCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9GSUZPX1NJWkUJNDA5NgotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX3RtNjAwMF9kaWdpdGFsX2h3ID0gewotCS5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAotCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0KLQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAotCS5yYXRlX21pbiA9IDQ4MDAwLAotCS5yYXRlX21heCA9IDQ4MDAwLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotCS5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCi0JLnBlcmlvZF9ieXRlc19tYXggPSAxMjU0NCwKLQkucGVyaW9kc19taW4gPSAxLAotCS5wZXJpb2RzX21heCA9IDk4LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjI3MjAgKiA4LAotfTsKLQotLyoKLSAqIGF1ZGlvIHBjbSBjYXB0dXJlIG9wZW4gY2FsbGJhY2sKLSAqLwotc3RhdGljIGludCBzbmRfdG02MDAwX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpbnQgZXJyOwotCi0JZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwKLQkJCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBfZXJyb3I7Ci0KLQljaGlwLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0KLQlydW50aW1lLT5odyA9IHNuZF90bTYwMDBfZGlnaXRhbF9odzsKLQotCXJldHVybiAwOwotX2Vycm9yOgotCWRwcmludGsoMSwgIkVycm9yIG9wZW5pbmcgUENNIVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIGF1ZGlvIGNsb3NlIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyBpbnQgc25kX3RtNjAwMF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmNvcmUtPnN0cmVhbV9zdGFydGVkKSA+IDApIHsKLQkJYXRvbWljX3NldCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQsIDApOwotCQlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IGNvcmUtPmFkZXY7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjaGlwLT5zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOwotCXVuc2lnbmVkIGludCBzdHJpZGUsIGJ1Zl9wb3M7Ci0JaW50IGxlbmd0aDsKLQotCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCFzaXplIHx8ICFzdWJzdHJlYW0pIHsKLQkJZHByaW50aygxLCAic3Vic3RyZWFtIHdhcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpZiAoIXJ1bnRpbWUgfHwgIXJ1bnRpbWUtPmRtYV9hcmVhKSB7Ci0JCWRwcmludGsoMSwgInJ1bnRpbWUgd2FzIE5VTExcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlidWZfcG9zID0gY2hpcC0+YnVmX3BvczsKLQlzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7Ci0KLQlpZiAoc3RyaWRlID09IDApIHsKLQkJZHByaW50aygxLCAic3RyaWRlIGlzIHplcm9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlsZW5ndGggPSBzaXplIC8gc3RyaWRlOwotCWlmIChsZW5ndGggPT0gMCkgewotCQlkcHJpbnRrKDEsICIlczogbGVuZ3RoIHdhcyB6ZXJvXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRwcmludGsoMSwgIkNvcHlpbmcgJWQgYnl0ZXMgYXQgJXBbJWRdIC0gYnVmIHNpemU9JWQgeCAlZFxuIiwgc2l6ZSwKLQkJcnVudGltZS0+ZG1hX2FyZWEsIGJ1Zl9wb3MsCi0JCSh1bnNpZ25lZCBpbnQpcnVudGltZS0+YnVmZmVyX3NpemUsIHN0cmlkZSk7Ci0KLQlpZiAoYnVmX3BvcyArIGxlbmd0aCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkgewotCQl1bnNpZ25lZCBpbnQgY250ID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBidWZfcG9zOwotCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBidWZfcG9zICogc3RyaWRlLCBidWYsIGNudCAqIHN0cmlkZSk7Ci0JCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgYnVmICsgY250ICogc3RyaWRlLAotCQkJbGVuZ3RoICogc3RyaWRlIC0gY250ICogc3RyaWRlKTsKLQl9IGVsc2UKLQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcyAqIHN0cmlkZSwgYnVmLAotCQkJbGVuZ3RoICogc3RyaWRlKTsKLQotCXNuZF9wY21fc3RyZWFtX2xvY2soc3Vic3RyZWFtKTsKLQotCWNoaXAtPmJ1Zl9wb3MgKz0gbGVuZ3RoOwotCWlmIChjaGlwLT5idWZfcG9zID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQljaGlwLT5idWZfcG9zIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwotCi0JY2hpcC0+cGVyaW9kX3BvcyArPSBsZW5ndGg7Ci0JaWYgKGNoaXAtPnBlcmlvZF9wb3MgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJY2hpcC0+cGVyaW9kX3BvcyAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKLQkJcGVyaW9kX2VsYXBzZWQgPSAxOwotCX0KLQotCXNuZF9wY21fc3RyZWFtX3VubG9jayhzdWJzdHJlYW0pOwotCi0JaWYgKHBlcmlvZF9lbGFwc2VkKQotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGh3X3BhcmFtcyBjYWxsYmFjawotICovCi1zdGF0aWMgaW50IHNuZF90bTYwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0JaW50IHNpemUsIHJjOwotCi0Jc2l6ZSA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKSAqIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcyk7Ci0KLQlyYyA9IGRzcF9idWZmZXJfYWxsb2Moc3Vic3RyZWFtLCBzaXplKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGh3IGZyZWUgY2FsbGJhY2sKLSAqLwotc3RhdGljIGludCBzbmRfdG02MDAwX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmNvcmUgPSBjaGlwLT5jb3JlOwotCi0JaWYgKGF0b21pY19yZWFkKCZjb3JlLT5zdHJlYW1fc3RhcnRlZCkgPiAwKSB7Ci0JCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAwKTsKLQkJc2NoZWR1bGVfd29yaygmY29yZS0+d3FfdHJpZ2dlcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcmVwYXJlIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyBpbnQgc25kX3RtNjAwMF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQljaGlwLT5idWZfcG9zID0gMDsKLQljaGlwLT5wZXJpb2RfcG9zID0gMDsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0cmlnZ2VyIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyB2b2lkIGF1ZGlvX3RyaWdnZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdG02MDAwX2NvcmUsCi0JCQkJCQl3cV90cmlnZ2VyKTsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gY29yZS0+YWRldjsKLQotCWlmIChhdG9taWNfcmVhZCgmY29yZS0+c3RyZWFtX3N0YXJ0ZWQpKSB7Ci0JCWRwcmludGsoMSwgInN0YXJ0aW5nIGNhcHR1cmUiKTsKLQkJX3RtNjAwMF9zdGFydF9hdWRpb19kbWEoY2hpcCk7Ci0JfSBlbHNlIHsKLQkJZHByaW50aygxLCAic3RvcHBpbmcgY2FwdHVyZSIpOwotCQlfdG02MDAwX3N0b3BfYXVkaW9fZG1hKGNoaXApOwotCX0KLX0KLQotc3RhdGljIGludCBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3Qgc25kX3RtNjAwMF9jYXJkICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqY29yZSA9IGNoaXAtPmNvcmU7Ci0JaW50IGVyciA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWF0b21pY19zZXQoJmNvcmUtPnN0cmVhbV9zdGFydGVkLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlhdG9taWNfc2V0KCZjb3JlLT5zdHJlYW1fc3RhcnRlZCwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlzY2hlZHVsZV93b3JrKCZjb3JlLT53cV90cmlnZ2VyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0vKgotICogcG9pbnRlciBjYWxsYmFjawotICovCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3RtNjAwMF9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gY2hpcC0+YnVmX3BvczsKLX0KLQotLyoKLSAqIG9wZXJhdG9ycwotICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90bTYwMDBfcGNtX29wcyA9IHsKLQkub3BlbiA9IHNuZF90bTYwMDBfcGNtX29wZW4sCi0JLmNsb3NlID0gc25kX3RtNjAwMF9jbG9zZSwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gc25kX3RtNjAwMF9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzbmRfdG02MDAwX2h3X2ZyZWUsCi0JLnByZXBhcmUgPSBzbmRfdG02MDAwX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSBzbmRfdG02MDAwX2NhcmRfdHJpZ2dlciwKLQkucG9pbnRlciA9IHNuZF90bTYwMDBfcG9pbnRlciwKLX07Ci0KLS8qCi0gKiBjcmVhdGUgYSBQQ00gZGV2aWNlCi0gKi8KLQotLyogRklYTUU6IENvbnRyb2wgaW50ZXJmYWNlIC0gSG93IHRvIGNvbnRyb2wgdm9sdW1lL211dGU/ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQlCYXNpYyBGbG93IGZvciBTb3VuZCBEZXZpY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEFsc2EgQ29uc3RydWN0b3IgLSBDb21wb25lbnQgcHJvYmUKLSAqLwotaW50IHRtNjAwMF9hdWRpb19pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCBzbmRfY2FyZAkJKmNhcmQ7Ci0Jc3RydWN0IHNuZF90bTYwMDBfY2FyZAkqY2hpcDsKLQlpbnQJCQlyYzsKLQlzdGF0aWMgaW50CQlkZXZucjsKLQljaGFyCQkJY29tcG9uZW50WzE0XTsKLQlzdHJ1Y3Qgc25kX3BjbQkJKnBjbTsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gMDsKLQotCWlmIChkZXZuciA+PSBTTkRSVl9DQVJEUykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIWVuYWJsZVtkZXZucl0pCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmMgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAidG02MDAwIiwgVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgY2FyZCBpbnN0YW5jZSAlZFxuIiwgZGV2bnIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXN0cmNweShjYXJkLT5kcml2ZXIsICJ0bTYwMDAtYWxzYSIpOwotCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJUTTU2MDAvNjB4MCIpOwotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJUTTU2MDAvNjB4MCBBdWRpbyBhdCBidXMgJWQgZGV2aWNlICVkIiwKLQkJZGV2LT51ZGV2LT5idXMtPmJ1c251bSwgZGV2LT51ZGV2LT5kZXZudW0pOwotCi0Jc3ByaW50Zihjb21wb25lbnQsICJVU0IlMDR4OiUwNHgiLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7Ci0Jc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgY29tcG9uZW50KTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXYtPnVkZXYtPmRldik7Ci0KLQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF90bTYwMDBfY2FyZCksIEdGUF9LRVJORUwpOwotCWlmICghY2hpcCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JY2hpcC0+Y29yZSA9IGRldjsKLQljaGlwLT5jYXJkID0gY2FyZDsKLQlkZXYtPmFkZXYgPSBjaGlwOwotCXNwaW5fbG9ja19pbml0KCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlyYyA9IHNuZF9wY21fbmV3KGNhcmQsICJUTTYwMDAgQXVkaW8iLCAwLCAwLCAxLCAmcGNtKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yX2NoaXA7Ci0KLQlwY20tPmluZm9fZmxhZ3MgPSAwOwotCXBjbS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlzdHJjcHkocGNtLT5uYW1lLCAiVHJpZGVudCBUTTU2MDAvNjB4MCIpOwotCi0Jc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmc25kX3RtNjAwMF9wY21fb3BzKTsKLQotCUlOSVRfV09SSygmZGV2LT53cV90cmlnZ2VyLCBhdWRpb190cmlnZ2VyKTsKLQlyYyA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyb3JfY2hpcDsKLQotCWRwcmludGsoMSwgIlJlZ2lzdGVyZWQgYXVkaW8gZHJpdmVyIGZvciAlc1xuIiwgY2FyZC0+bG9uZ25hbWUpOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX2NoaXA6Ci0Ja2ZyZWUoY2hpcCk7Ci0JZGV2LT5hZGV2ID0gTlVMTDsKLWVycm9yOgotCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9hdWRpb19maW5pKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQJKmNoaXAgPSBkZXYtPmFkZXY7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAwOwotCi0JaWYgKCFjaGlwLT5jYXJkKQotCQlyZXR1cm4gMDsKLQotCXNuZF9jYXJkX2ZyZWUoY2hpcC0+Y2FyZCk7Ci0JY2hpcC0+Y2FyZCA9IE5VTEw7Ci0Ja2ZyZWUoY2hpcCk7Ci0JZGV2LT5hZGV2ID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgdG02MDAwX29wcyBhdWRpb19vcHMgPSB7Ci0JLnR5cGUJPSBUTTYwMDBfQVVESU8sCi0JLm5hbWUJPSAiVE02MDAwIEF1ZGlvIEV4dGVuc2lvbiIsCi0JLmluaXQJPSB0bTYwMDBfYXVkaW9faW5pdCwKLQkuZmluaQk9IHRtNjAwMF9hdWRpb19maW5pLAotCS5maWxsYnVmID0gdG02MDAwX2ZpbGxidWYsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB0bTYwMDBfYWxzYV9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZhdWRpb19vcHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX2Fsc2FfdW5yZWdpc3Rlcih2b2lkKQotewotCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmYXVkaW9fb3BzKTsKLX0KLQotbW9kdWxlX2luaXQodG02MDAwX2Fsc2FfcmVnaXN0ZXIpOwotbW9kdWxlX2V4aXQodG02MDAwX2Fsc2FfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY2FyZHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyN2RiNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1jYXJkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4MiArMCwwIEBACi0vKgotICogIHRtNjAwMC1jYXJkcy5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgotI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9pMmMtYWRkci5oPgotI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLSNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKLSNpbmNsdWRlICJ4YzUwMDAuaCIKLQotI2RlZmluZSBUTTYwMDBfQk9BUkRfVU5LTk9XTgkJCTAKLSNkZWZpbmUgVE01NjAwX0JPQVJEX0dFTkVSSUMJCQkxCi0jZGVmaW5lIFRNNjAwMF9CT0FSRF9HRU5FUklDCQkJMgotI2RlZmluZSBUTTYwMTBfQk9BUkRfR0VORVJJQwkJCTMKLSNkZWZpbmUgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjEJCTQKLSNkZWZpbmUgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQzMzAJCTUKLSNkZWZpbmUgVE02MDAwX0JPQVJEX0FEU1RFQ0hfRFVBTF9UVgkJNgotI2RlZmluZSBUTTYwMDBfQk9BUkRfRlJFRUNPTV9BTkRfU0lNSUxBUgk3Ci0jZGVmaW5lIFRNNjAwMF9CT0FSRF9BRFNURUNIX01JTklfRFVBTF9UVgk4Ci0jZGVmaW5lIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSAkJOQotI2RlZmluZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUgkJMTAKLSNkZWZpbmUgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSCQkxMQotI2RlZmluZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUJMTIKLSNkZWZpbmUgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEJCTEzCi0jZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEUJCTE0Ci0jZGVmaW5lIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFCTE1Ci0jZGVmaW5lIFRNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUgkJMTYKLQotI2RlZmluZSBpc19nZW5lcmljKG1vZGVsKSAoKG1vZGVsID09IFRNNjAwMF9CT0FSRF9VTktOT1dOKSB8fCBcCi0JCQkgICAobW9kZWwgPT0gVE01NjAwX0JPQVJEX0dFTkVSSUMpIHx8IFwKLQkJCSAgIChtb2RlbCA9PSBUTTYwMDBfQk9BUkRfR0VORVJJQykgfHwgXAotCQkJICAgKG1vZGVsID09IFRNNjAxMF9CT0FSRF9HRU5FUklDKSkKLQotI2RlZmluZSBUTTYwMDBfTUFYQk9BUkRTICAgICAgICAxNgotc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW10gICAgID0ge1swIC4uLiAoVE02MDAwX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07Ci0KLW1vZHVsZV9wYXJhbV9hcnJheShjYXJkLCAgaW50LCBOVUxMLCAwNDQ0KTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdG02MDAwX2RldnVzZWQ7Ci0KLQotc3RydWN0IHRtNjAwMF9ib2FyZCB7Ci0JY2hhciAgICAgICAgICAgICpuYW1lOwotCWNoYXIJCWVlbmFtZVsxNl07CQkvKiBFRVBST00gbmFtZSAqLwotCXVuc2lnbmVkCWVlbmFtZV9zaXplOwkJLyogc2l6ZSBvZiBFRVBST00gbmFtZSAqLwotCXVuc2lnbmVkCWVlbmFtZV9wb3M7CQkvKiBQb3NpdGlvbiB3aGVyZSBpdCBhcHBlYXJzIGF0IFJPTSAqLwotCi0Jc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMgY2FwczsKLQotCWVudW0JCXRtNjAwMF9kZXZ0eXBlIHR5cGU7CS8qIHZhcmlhbnQgb2YgdGhlIGNoaXBzZXQgKi8KLQlpbnQgICAgICAgICAgICAgdHVuZXJfdHlwZTsgICAgIC8qIHR5cGUgb2YgdGhlIHR1bmVyICovCi0JaW50ICAgICAgICAgICAgIHR1bmVyX2FkZHI7ICAgICAvKiB0dW5lciBhZGRyZXNzICovCi0JaW50ICAgICAgICAgICAgIGRlbW9kX2FkZHI7ICAgICAvKiBkZW1vZHVsYXRvciBhZGRyZXNzICovCi0KLQlzdHJ1Y3QgdG02MDAwX2dwaW8gZ3BpbzsKLQotCXN0cnVjdCB0bTYwMDBfaW5wdXQJdmlucHV0WzNdOwotCXN0cnVjdCB0bTYwMDBfaW5wdXQJcmlucHV0OwotCi0JY2hhcgkJKmlyX2NvZGVzOwotfTsKLQotc3RydWN0IHRtNjAwMF9ib2FyZCB0bTYwMDBfYm9hcmRzW10gPSB7Ci0JW1RNNjAwMF9CT0FSRF9VTktOT1dOXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJVbmtub3duIHRtNjAwMCB2aWRlbyBncmFiYmVyIiwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyCT0gMSwKLQkJCS5oYXNfZWVwcm9tCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT18xLAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwKLQkJfSwKLQl9LAotCVtUTTU2MDBfQk9BUkRfR0VORVJJQ10gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiR2VuZXJpYyB0bTU2MDAgYm9hcmQiLAotCQkudHlwZSAgICAgICAgID0gVE01NjAwLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIJPSAxLAotCQkJLmhhc19lZXByb20JPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9HRU5FUklDXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJHZW5lcmljIHRtNjAwMCBib2FyZCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lcgk9IDEsCi0JCQkuaGFzX2VlcHJvbQk9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fMSwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDEwX0JPQVJEX0dFTkVSSUNdID0gewotCQkubmFtZSAgICAgICAgID0gIkdlbmVyaWMgdG02MDEwIGJvYXJkIiwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyCT0gMSwKLQkJCS5oYXNfZHZiCT0gMSwKLQkJCS5oYXNfemwxMDM1Mwk9IDEsCi0JCQkuaGFzX2VlcHJvbQk9IDEsCi0JCQkuaGFzX3JlbW90ZQk9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKLQkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCi0JCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAotCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAotCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAotCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUODIxXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDgyMSIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsCi0JCS5lZW5hbWUgICAgICAgPSB7ICcxJywgJzAnLCAnTScsICdPJywgJ08nLCAnTicsICdTJywgJzUnLCAnNicsICcwJywgJzAnLCAweGZmLCAweDQ1LCAweDVifSwKLQkJLmVlbmFtZV9zaXplICA9IDE0LAotCQkuZWVuYW1lX3BvcyAgID0gMHgxNCwKLQkJLnR5cGUgICAgICAgICA9IFRNNTYwMCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAwMF9HUElPXzEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF8xME1PT05TX1VUMzMwXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICIxME1vb25zIFVUIDMzMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQsCi0JCS50dW5lcl9hZGRyICAgPSAweGM4ID4+IDEsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMCwKLQkJCS5oYXNfemwxMDM1MyAgPSAwLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9BRFNURUNIX0RVQUxfVFZdID0gewotCQkubmFtZSAgICAgICAgID0gIkFEU1RFQ0ggRHVhbCBUViBVU0IiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAotCQkudHVuZXJfYWRkciAgID0gMHhjOCA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc190ZGE5ODc0ICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMSwKLQkJCS5oYXNfemwxMDM1MyAgPSAxLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJGcmVlY29tIEh5YnJpZCBTdGljayAvIE1va2EgRFZCLVQgUmVjZWl2ZXIgRHVhbCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLwotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAwLAotCQkJLmhhc19yZW1vdGUgICA9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDAwX0dQSU9fNCwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJBRFNURUNIIE1pbmkgRHVhbCBUViBVU0IiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KLQkJLnR1bmVyX2FkZHIgICA9IDB4YzggPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICA9IDEsCi0JCQkuaGFzX2VlcHJvbSAgID0gMCwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMDBfR1BJT180LAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0EsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9TVklERU8sCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0FCLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEhdID0gewotCQkubmFtZSAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBIVlItOTAwSCAvIFdpblRWIFVTQjItU3RpY2siLAotCQkuZWVuYW1lICAgICAgID0geyAnSCcsIDAsICdWJywgMCwgJ1InLCAwLCAnOScsIDAsICcwJywgMCwgJzAnLCAwLCAnSCcsIDAgfSwKLQkJLmVlbmFtZV9zaXplICA9IDE0LAotCQkuZWVuYW1lX3BvcyAgID0gMHg0MiwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwgLyogaGFzIGEgWEMzMDI4ICovCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgID0gMSwKLQkJCS5oYXNfemwxMDM1MyAgPSAxLAotCQkJLmhhc19lZXByb20gICA9IDEsCi0JCQkuaGFzX3JlbW90ZSAgID0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18yLAotCQkJLnR1bmVyX29uCT0gVE02MDEwX0dQSU9fMywKLQkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCi0JCQkuZGVtb2Rfb24JPSBUTTYwMTBfR1BJT180LAotCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzcsCi0JCQkuZHZiX2xlZAk9IFRNNjAxMF9HUElPXzUsCi0JCQkuaXIJCT0gVE02MDEwX0dQSU9fMCwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JfSwKLQlbVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBEVkItVC9UVi9GTSBVU0IyLjAiLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEM1MDAwLAotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkudHlwZSAgICAgICAgID0gVE02MDEwLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgICA9IDEsCi0JCQkuaGFzX2R2YiAgICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICAgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgICA9IDEsCi0JCQkuaGFzX3JlbW90ZSAgICAgPSAxLAotCQkJLmhhc19yYWRpbwk9IDEuCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMCwKLQkJCS5kZW1vZF9yZXNldAk9IFRNNjAxMF9HUElPXzEsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFZveWFnZXIgVFYvRk0gVVNCMi4wIiwKLQkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDNTAwMCwKLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICAgID0gMCwKLQkJCS5oYXNfemwxMDM1MyAgICA9IDAsCi0JCQkuaGFzX2VlcHJvbSAgICAgPSAxLAotCQkJLmhhc19yZW1vdGUgICAgID0gMSwKLQkJCS5oYXNfcmFkaW8JPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzAsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNiwKLQkJfSwKLQkJLnZpbnB1dCA9IHsgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfVFYsCi0JCQkudm11eAk9IFRNNjAwMF9WTVVYX1ZJREVPX0IsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX1NJRjEsCi0JCQl9LCB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9DT01QT1NJVEUxLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMyLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfU1ZJREVPLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19BQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEVdID0gewotCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgSHlicmlkIFhFIC8gQ2luZXJneSBIeWJyaWQtU3RpY2siLAotCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LCAvKiBoYXMgYSBYQzMwMjggKi8KLQkJLnR1bmVyX2FkZHIgICA9IDB4YzIgPj4gMSwKLQkJLmRlbW9kX2FkZHIgICA9IDB4MWUgPj4gMSwKLQkJLnR5cGUgICAgICAgICA9IFRNNjAxMCwKLQkJLmNhcHMgPSB7Ci0JCQkuaGFzX3R1bmVyICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgPSAxLAotCQkJLmhhc196bDEwMzUzICA9IDEsCi0JCQkuaGFzX2VlcHJvbSAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgPSAxLAotCQl9LAotCQkuZ3BpbyA9IHsKLQkJCS50dW5lcl9yZXNldAk9IFRNNjAxMF9HUElPXzIsCi0JCQkudHVuZXJfb24JPSBUTTYwMTBfR1BJT18zLAotCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKLQkJCS5kZW1vZF9vbgk9IFRNNjAxMF9HUElPXzQsCi0JCQkucG93ZXJfbGVkCT0gVE02MDEwX0dQSU9fNywKLQkJCS5kdmJfbGVkCT0gVE02MDEwX0dQSU9fNSwKLQkJCS5pcgkJPSBUTTYwMTBfR1BJT18wLAotCQl9LAotCQkuaXJfY29kZXMgPSBSQ19NQVBfTkVDX1RFUlJBVEVDX0NJTkVSR1lfWFMsCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNTYwMF9CT0FSRF9URVJSQVRFQ19HUkFCU1RFUl0gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiVGVycmF0ZWMgR3JhYnN0ZXIgQVYgMTUwLzI1MCBNWCIsCi0JCS50eXBlICAgICAgICAgPSBUTTU2MDAsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9BQlNFTlQsCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxXSA9IHsKLQkJLm5hbWUgICAgICAgICA9ICJUd2luaGFuIFRVNTAxKDcwNEQxKSIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzIwMjgsIC8qIGhhcyBhIFhDMzAyOCAqLwotCQkudHVuZXJfYWRkciAgID0gMHhjMiA+PiAxLAotCQkuZGVtb2RfYWRkciAgID0gMHgxZSA+PiAxLAotCQkudHlwZSAgICAgICAgID0gVE02MDEwLAotCQkuY2FwcyA9IHsKLQkJCS5oYXNfdHVuZXIgICAgPSAxLAotCQkJLmhhc19kdmIgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgID0gMSwKLQkJCS5oYXNfZWVwcm9tICAgPSAxLAotCQkJLmhhc19yZW1vdGUgICA9IDEsCi0JCX0sCi0JCS5ncGlvID0gewotCQkJLnR1bmVyX3Jlc2V0CT0gVE02MDEwX0dQSU9fMiwKLQkJCS50dW5lcl9vbgk9IFRNNjAxMF9HUElPXzMsCi0JCQkuZGVtb2RfcmVzZXQJPSBUTTYwMTBfR1BJT18xLAotCQkJLmRlbW9kX29uCT0gVE02MDEwX0dQSU9fNCwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT183LAotCQkJLmR2Yl9sZWQJPSBUTTYwMTBfR1BJT181LAotCQkJLmlyCQk9IFRNNjAxMF9HUElPXzAsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwgewotCQkJLnR5cGUJPSBUTTYwMDBfSU5QVVRfQ09NUE9TSVRFMSwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQSwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMiwKLQkJCX0sIHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1NWSURFTywKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQUIsCi0JCQkuYW11eAk9IFRNNjAwMF9BTVVYX0FEQzIsCi0JCQl9LAotCQl9LAotCX0sCi0JW1RNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEVdID0gewotCQkubmFtZSAgICAgICAgID0gIkJlaG9sZGVyIFdhbmRlciBMaXRlIERWQi1UL1RWL0ZNIFVTQjIuMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS5kZW1vZF9hZGRyICAgPSAweDFlID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgICA9IDEsCi0JCQkuaGFzX3psMTAzNTMgICAgPSAxLAotCQkJLmhhc19lZXByb20gICAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgICA9IDAsCi0JCQkuaGFzX3JhZGlvCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAotCQkJLmRlbW9kX3Jlc2V0CT0gVE02MDEwX0dQSU9fMSwKLQkJCS5wb3dlcl9sZWQJPSBUTTYwMTBfR1BJT182LAotCQl9LAotCQkudmlucHV0ID0geyB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9UViwKLQkJCS52bXV4CT0gVE02MDAwX1ZNVVhfVklERU9fQiwKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfU0lGMSwKLQkJCX0sCi0JCX0sCi0JCS5yaW5wdXQgPSB7Ci0JCQkudHlwZQk9IFRNNjAwMF9JTlBVVF9SQURJTywKLQkJCS5hbXV4CT0gVE02MDAwX0FNVVhfQURDMSwKLQkJfSwKLQl9LAotCVtUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURV0gPSB7Ci0JCS5uYW1lICAgICAgICAgPSAiQmVob2xkZXIgVm95YWdlciBMaXRlIFRWL0ZNIFVTQjIuMCIsCi0JCS50dW5lcl90eXBlICAgPSBUVU5FUl9YQzUwMDAsCi0JCS50dW5lcl9hZGRyICAgPSAweGMyID4+IDEsCi0JCS50eXBlICAgICAgICAgPSBUTTYwMTAsCi0JCS5jYXBzID0gewotCQkJLmhhc190dW5lciAgICAgID0gMSwKLQkJCS5oYXNfZHZiICAgICAgICA9IDAsCi0JCQkuaGFzX3psMTAzNTMgICAgPSAwLAotCQkJLmhhc19lZXByb20gICAgID0gMSwKLQkJCS5oYXNfcmVtb3RlICAgICA9IDAsCi0JCQkuaGFzX3JhZGlvCT0gMSwKLQkJfSwKLQkJLmdwaW8gPSB7Ci0JCQkudHVuZXJfcmVzZXQJPSBUTTYwMTBfR1BJT18wLAotCQkJLnBvd2VyX2xlZAk9IFRNNjAxMF9HUElPXzYsCi0JCX0sCi0JCS52aW5wdXQgPSB7IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1RWLAotCQkJLnZtdXgJPSBUTTYwMDBfVk1VWF9WSURFT19CLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9TSUYxLAotCQkJfSwKLQkJfSwKLQkJLnJpbnB1dCA9IHsKLQkJCS50eXBlCT0gVE02MDAwX0lOUFVUX1JBRElPLAotCQkJLmFtdXgJPSBUTTYwMDBfQU1VWF9BREMxLAotCQl9LAotCX0sCi19OwotCi0vKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCi1zdHJ1Y3QgdXNiX2RldmljZV9pZCB0bTYwMDBfaWRfdGFibGVbXSA9IHsKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBUTTU2MDBfQk9BUkRfR0VORVJJQyB9LAotCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4MDAwMiksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9HRU5FUklDIH0sCi0JeyBVU0JfREVWSUNFKDB4MDZlMSwgMHhmMzMyKSwgLmRyaXZlcl9pbmZvID0gVE02MDAwX0JPQVJEX0FEU1RFQ0hfRFVBTF9UViB9LAotCXsgVVNCX0RFVklDRSgweDE0YWEsIDB4MDYyMCksIC5kcml2ZXJfaW5mbyA9IFRNNjAwMF9CT0FSRF9GUkVFQ09NX0FORF9TSU1JTEFSIH0sCi0JeyBVU0JfREVWSUNFKDB4MDZlMSwgMHhiMzM5KSwgLmRyaXZlcl9pbmZvID0gVE02MDAwX0JPQVJEX0FEU1RFQ0hfTUlOSV9EVUFMX1RWIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjAwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjAxKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjEwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg2NjExKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIIH0sCi0JeyBVU0JfREVWSUNFKDB4NjAwMCwgMHhkZWMwKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzEpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwODYpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwQTUpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwNzkpLCAuZHJpdmVyX2luZm8gPSBUTTU2MDBfQk9BUkRfVEVSUkFURUNfR1JBQlNURVIgfSwKLQl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNDApLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAotCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzI0MSksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxIH0sCi0JeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzMjQzKSwgLmRyaXZlcl9pbmZvID0gVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDEgfSwKLQl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMyNjQpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMSB9LAotCXsgVVNCX0RFVklDRSgweDYwMDAsIDB4ZGVjMiksIC5kcml2ZXJfaW5mbyA9IFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSX0xJVEUgfSwKLQl7IFVTQl9ERVZJQ0UoMHg2MDAwLCAweGRlYzMpLCAuZHJpdmVyX2luZm8gPSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURSB9LAotCXsgfSwKLX07Ci0KLS8qIENvbnRyb2wgcG93ZXIgbGVkIGZvciBzaG93IHNvbWUgYWN0aXZpdHkgKi8KLXZvaWQgdG02MDAwX2ZsYXNoX2xlZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpCi17Ci0JLyogUG93ZXIgTEVEIHVuY29uZmlndXJlZCAqLwotCWlmICghZGV2LT5ncGlvLnBvd2VyX2xlZCkKLQkJcmV0dXJuOwotCi0JLyogT04gUG93ZXIgTEVEICovCi0JaWYgKHN0YXRlKSB7Ci0JCXN3aXRjaCAoZGV2LT5tb2RlbCkgewotCQljYXNlIFRNNjAxMF9CT0FSRF9IQVVQUEFVR0VfOTAwSDoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV9IWUJSSURfWEU6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJZGV2LT5ncGlvLnBvd2VyX2xlZCwgMHgwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qIE9GRiBQb3dlciBMRUQgKi8KLQllbHNlIHsKLQkJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUl9MSVRFOgotCQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfVk9ZQUdFUl9MSVRFOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCWRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLS8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzUwMDAgKi8KLWludCB0bTYwMDBfeGM1MDAwX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbXBvbmVudCwgaW50IGNvbW1hbmQsIGludCBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHB0cjsKLQotCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfWEM1MDAwKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoY29tbWFuZCkgewotCWNhc2UgWEM1MDAwX1RVTkVSX1JFU0VUOgotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCW1zbGVlcCgxNSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3hjNTAwMF9jYWxsYmFjayk7Ci0KLS8qIFR1bmVyIGNhbGxiYWNrIHRvIHByb3ZpZGUgdGhlIHByb3BlciBncGlvIGNoYW5nZXMgbmVlZGVkIGZvciB4YzIwMjggKi8KLQotaW50IHRtNjAwMF90dW5lcl9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBwdHI7Ci0KLQlpZiAoZGV2LT50dW5lcl90eXBlICE9IFRVTkVSX1hDMjAyOCkKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFhDMjAyOF9SRVNFVF9DTEs6Ci0JCXRtNjAwMF9pcl93YWl0KGRldiwgMCk7Ci0KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULAotCQkJCQkweDAyLCBhcmcpOwotCQltc2xlZXAoMTApOwotCQlyYyA9IHRtNjAwMF9pMmNfcmVzZXQoZGV2LCAxMCk7Ci0JCWJyZWFrOwotCWNhc2UgWEMyMDI4X1RVTkVSX1JFU0VUOgotCQkvKiBSZXNldCBjb2RlcyBkdXJpbmcgbG9hZCBmaXJtd2FyZSAqLwotCQlzd2l0Y2ggKGFyZykgewotCQljYXNlIDA6Ci0JCQkvKiBuZXdlciB0dW5lciBjYW4gZmFzdGVyIHJlc2V0ICovCi0JCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQkJCWNhc2UgVE01NjAwX0JPQVJEXzEwTU9PTlNfVVQ4MjE6Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICAweDMwMCwgMHgwMSk7Ci0JCQkJbXNsZWVwKDEwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIDB4MzAwLCAweDAwKTsKLQkJCQltc2xlZXAoMTApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMSk7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgMHgzMDAsIDB4MDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6Ci0JCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQltc2xlZXAoNjApOwotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQkJbXNsZWVwKDc1KTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQkJCSAgICAgICBkZXYtPmdwaW8udHVuZXJfcmVzZXQsIDB4MDEpOwotCQkJCW1zbGVlcCg2MCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJICAgICAgIGRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQkJbXNsZWVwKDEzMCk7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkgICAgICAgZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCQltc2xlZXAoMTMwKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJdG02MDAwX2lyX3dhaXQoZGV2LCAxKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsCi0JCQkJCQkweDAyLCAweDAxKTsKLQkJCW1zbGVlcCgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcmMgPSB0bTYwMDBfaTJjX3Jlc2V0KGRldiwgMTAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF90dW5lcl9jYWxsYmFjayk7Ci0KLWludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIHJjOwotCi0JLyoKLQkgKiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSGFuZGxlcyBhbGwgR1BJTwotCSAqIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlcyB0aGF0IGFyZSBib2FyZC1zcGVjaWZpYy4KLQkgKiBVcCB0byBub3csIGFsbCBmb3VuZCBkZXZpY2VzIHVzZSBHUElPMSBhbmQgR1BJTzQgYXQgdGhlIHNhbWUgd2F5LgotCSAqIFByb2JhYmx5LCB0aGV5J3JlIGFsbCBiYXNlZCBvbiBzb21lIHJlZmVyZW5jZSBkZXZpY2UuIER1ZSB0byB0aGF0LAotCSAqIHRoZXJlJ3MgYSBjb21tb24gcm91dGluZSBhdCB0aGUgZW5kIHRvIGhhbmRsZSB0aG9zZSBHUElPJ3MuIERldmljZXMKLQkgKiB0aGF0IHVzZSBkaWZmZXJlbnQgcGludXBzIG9yIGluaXQgc2VxdWVuY2VzIGNhbiBqdXN0IHJldHVybiBhdAotCSAqIHRoZSBib2FyZC1zcGVjaWZpYyBzZXNzaW9uLgotCSAqLwotCXN3aXRjaCAoZGV2LT5tb2RlbCkgewotCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgotCWNhc2UgVE02MDEwX0JPQVJEX1RXSU5IQU5fVFU1MDE6Ci0JY2FzZSBUTTYwMTBfQk9BUkRfR0VORVJJQzoKLQkJLyogVHVybiB4Y2VpdmUgMzAyOCBvbiAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby50dW5lcl9vbiwgMHgwMSk7Ci0JCW1zbGVlcCgxNSk7Ci0JCS8qIFR1cm4gemFybGluayB6bDEwMzUzIG9uICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX29uLCAweDAwKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogUmVzZXQgemFybGluayB6bDEwMzUzICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmRlbW9kX3Jlc2V0LCAweDAwKTsKLQkJbXNsZWVwKDUwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBUdXJuIHphcmxpbmsgemwxMDM1MyBvZmYgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBpciA/ICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT5ncGlvLmlyLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDApOwotCQltc2xlZXAoMTUpOwotCQkvKiBEVkIgbGVkIG9mZiAob3JhbmdlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJLyogVHVybiB6YXJsaW5rIHpsMTAzNTMgb24gKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2Rfb24sIDB4MDApOwotCQltc2xlZXAoMTUpOwotCQlicmVhazsKLQljYXNlIFRNNjAxMF9CT0FSRF9CRUhPTERfV0FOREVSOgotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJLyogUG93ZXIgbGVkIG9uIChibHVlKSAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5wb3dlcl9sZWQsIDB4MDEpOwotCQltc2xlZXAoMTUpOwotCQkvKiBSZXNldCB6YXJsaW5rIHpsMTAzNTMgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8uZGVtb2RfcmVzZXQsIDB4MDApOwotCQltc2xlZXAoNTApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sIGRldi0+Z3Bpby5kZW1vZF9yZXNldCwgMHgwMSk7Ci0JCW1zbGVlcCgxNSk7Ci0JCWJyZWFrOwotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSOgotCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9WT1lBR0VSX0xJVEU6Ci0JCS8qIFBvd2VyIGxlZCBvbiAoYmx1ZSkgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJbXNsZWVwKDE1KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uLiBNb3N0IG9mIHRoZSBkZXZpY2VzIHNlZW0gdG8gdXNlIEdQSU8xCi0JICogYW5kIEdQSU80Lm9uIHRoZSBzYW1lIHdheSwgc28sIHRoaXMgaGFuZGxlcyB0aGUgY29tbW9uIHNlcXVlbmNlCi0JICogdXNlZCBieSBtb3N0IGRldmljZXMuCi0JICogSWYgYSBkZXZpY2UgdXNlcyBhIGRpZmZlcmVudCBzZXF1ZW5jZSBvciBkaWZmZXJlbnQgR1BJTyBwaW5zIGZvcgotCSAqIHJlc2V0LCBqdXN0IGFkZCB0aGUgY29kZSBhdCB0aGUgYm9hcmQtc3BlY2lmaWMgcGFydAotCSAqLwotCi0JaWYgKGRldi0+Z3Bpby50dW5lcl9yZXNldCkgewotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQkJCWRldi0+Z3Bpby50dW5lcl9yZXNldCwgMHgwMCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSBkb2luZyB0dW5lciByZXNldFxuIiwgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQotCQkJbXNsZWVwKDEwKTsgLyogSnVzdCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KLQkJCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLAotCQkJCQkJZGV2LT5ncGlvLnR1bmVyX3Jlc2V0LCAweDAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIGRvaW5nIHR1bmVyIHJlc2V0XG4iLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUdW5lciByZXNldCBpcyBub3QgY29uZmlndXJlZFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQltc2xlZXAoNTApOwotCi0JcmV0dXJuIDA7Ci19OwotCi1zdGF0aWMgdm9pZCB0bTYwMDBfY29uZmlnX3R1bmVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7Ci0KLQkvKiBMb2FkIHR1bmVyIG1vZHVsZSAqLwotCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAotCQkidHVuZXIiLCBkZXYtPnR1bmVyX2FkZHIsIE5VTEwpOwotCi0JbWVtc2V0KCZ0dW5fc2V0dXAsIDAsIHNpemVvZih0dW5fc2V0dXApKTsKLQl0dW5fc2V0dXAudHlwZSA9IGRldi0+dHVuZXJfdHlwZTsKLQl0dW5fc2V0dXAuYWRkciA9IGRldi0+dHVuZXJfYWRkcjsKLQotCXR1bl9zZXR1cC5tb2RlX21hc2sgPSAwOwotCWlmIChkZXYtPmNhcHMuaGFzX3R1bmVyKQotCQl0dW5fc2V0dXAubW9kZV9tYXNrIHw9IChUX0FOQUxPR19UViB8IFRfUkFESU8pOwotCi0Jc3dpdGNoIChkZXYtPnR1bmVyX3R5cGUpIHsKLQljYXNlIFRVTkVSX1hDMjAyODoKLQkJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gdG02MDAwX3R1bmVyX2NhbGxiYWNrOwotCQlicmVhazsKLQljYXNlIFRVTkVSX1hDNTAwMDoKLQkJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gdG02MDAwX3hjNTAwMF9jYWxsYmFjazsKLQkJYnJlYWs7Ci0JfQotCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R5cGVfYWRkciwgJnR1bl9zZXR1cCk7Ci0KLQlzd2l0Y2ggKGRldi0+dHVuZXJfdHlwZSkgewotCWNhc2UgVFVORVJfWEMyMDI4OiB7Ci0JCXN0cnVjdCB2NGwyX3ByaXZfdHVuX2NvbmZpZyB4YzIwMjhfY2ZnOwotCQlzdHJ1Y3QgeGMyMDI4X2N0cmwgY3RsOwotCi0JCW1lbXNldCgmeGMyMDI4X2NmZywgMCwgc2l6ZW9mKHhjMjAyOF9jZmcpKTsKLQkJbWVtc2V0KCZjdGwsIDAsIHNpemVvZihjdGwpKTsKLQotCQljdGwuZGVtb2QgPSBYQzMwMjhfRkVfWkFSTElOSzQ1NjsKLQotCQl4YzIwMjhfY2ZnLnR1bmVyID0gVFVORVJfWEMyMDI4OwotCQl4YzIwMjhfY2ZnLnByaXYgID0gJmN0bDsKLQotCQlzd2l0Y2ggKGRldi0+bW9kZWwpIHsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfSEFVUFBBVUdFXzkwMEg6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfSFlCUklEX1hFOgotCQljYXNlIFRNNjAxMF9CT0FSRF9UV0lOSEFOX1RVNTAxOgotCQkJY3RsLmZuYW1lID0gInhjMzAyOEwtdjM2LmZ3IjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKQotCQkJCWN0bC5mbmFtZSA9ICJ4YzMwMjgtdjI3LmZ3IjsKLQkJCWVsc2UKLQkJCQljdGwuZm5hbWUgPSAieGMzMDI4LXYyNC5mdyI7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIGZpcm13YXJlIHBhcmFtZXRlcnMgZm9yIHhjMjAyOFxuIik7Ci0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsCi0JCQkJICAgICAmeGMyMDI4X2NmZyk7Ci0KLQkJfQotCQlicmVhazsKLQljYXNlIFRVTkVSX1hDNTAwMDoKLQkJewotCQlzdHJ1Y3QgdjRsMl9wcml2X3R1bl9jb25maWcgIHhjNTAwMF9jZmc7Ci0JCXN0cnVjdCB4YzUwMDBfY29uZmlnIGN0bCA9IHsKLQkJCS5pMmNfYWRkcmVzcyA9IGRldi0+dHVuZXJfYWRkciwKLQkJCS5pZl9raHogICAgICA9IDQ1NzAsCi0JCQkucmFkaW9faW5wdXQgPSBYQzUwMDBfUkFESU9fRk0xX01PTk8sCi0JCQl9OwotCi0JCXhjNTAwMF9jZmcudHVuZXIgPSBUVU5FUl9YQzUwMDA7Ci0JCXhjNTAwMF9jZmcucHJpdiAgPSAmY3RsOwotCi0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19jb25maWcsCi0JCQkJICAgICAmeGM1MDAwX2NmZyk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biB0dW5lciB0eXBlLiBUdW5lciBpcyBub3QgY29uZmlndXJlZC5cbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZmlsbF9ib2FyZF9zcGVjaWZpY19kYXRhKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByYzsKLQotCWRldi0+ZGV2X3R5cGUgICA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udHlwZTsKLQlkZXYtPnR1bmVyX3R5cGUgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnR1bmVyX3R5cGU7Ci0JZGV2LT50dW5lcl9hZGRyID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS50dW5lcl9hZGRyOwotCi0JZGV2LT5ncGlvID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS5ncGlvOwotCi0JZGV2LT5pcl9jb2RlcyA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0uaXJfY29kZXM7Ci0KLQlkZXYtPmRlbW9kX2FkZHIgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmRlbW9kX2FkZHI7Ci0KLQlkZXYtPmNhcHMgPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLmNhcHM7Ci0KLQlkZXYtPnZpbnB1dFswXSA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0udmlucHV0WzBdOwotCWRldi0+dmlucHV0WzFdID0gdG02MDAwX2JvYXJkc1tkZXYtPm1vZGVsXS52aW5wdXRbMV07Ci0JZGV2LT52aW5wdXRbMl0gPSB0bTYwMDBfYm9hcmRzW2Rldi0+bW9kZWxdLnZpbnB1dFsyXTsKLQlkZXYtPnJpbnB1dCA9IHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0ucmlucHV0OwotCi0JLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwotCXJjID0gdG02MDAwX2luaXQoZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+dWRldi0+ZGV2LCAmZGV2LT52NGwyX2Rldik7Ci19Ci0KLQotc3RhdGljIHZvaWQgdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIG1vZGVsID0gLTE7Ci0KLQlpZiAoIWRldi0+ZWVkYXRhX3NpemUpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9ib2FyZHMpOyBpKyspIHsKLQkJaWYgKCF0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9zaXplKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPmVlZGF0YV9zaXplIDwgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfcG9zICsKLQkJCQkgICAgICAgdG02MDAwX2JvYXJkc1tpXS5lZW5hbWVfc2l6ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbWVtY21wKCZkZXYtPmVlZGF0YVt0bTYwMDBfYm9hcmRzW2ldLmVlbmFtZV9wb3NdLAotCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lLAotCQkJICAgIHRtNjAwMF9ib2FyZHNbaV0uZWVuYW1lX3NpemUpKSB7Ci0JCQltb2RlbCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAobW9kZWwgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRldmljZSBoYXMgZWVwcm9tIGJ1dCBpcyBjdXJyZW50bHkgdW5rbm93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXYtPm1vZGVsID0gbW9kZWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2UgaWRlbnRpZmllZCB2aWEgZWVwcm9tIGFzICVzICh0eXBlID0gJWQpXG4iLAotCSAgICAgICB0bTYwMDBfYm9hcmRzW21vZGVsXS5uYW1lLCBtb2RlbCk7Ci19Ci0KLXN0YXRpYyBpbnQgdG02MDAwX2luaXRfZGV2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSBmOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9pbml0KCZkZXYtPmxvY2spOwotCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0KLQlpZiAoIWlzX2dlbmVyaWMoZGV2LT5tb2RlbCkpIHsKLQkJcmMgPSBmaWxsX2JvYXJkX3NwZWNpZmljX2RhdGEoZGV2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZXJyOwotCi0JCS8qIHJlZ2lzdGVyIGkyYyBidXMgKi8KLQkJcmMgPSB0bTYwMDBfaTJjX3JlZ2lzdGVyKGRldik7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycjsKLQl9IGVsc2UgewotCQkvKiByZWdpc3RlciBpMmMgYnVzICovCi0JCXJjID0gdG02MDAwX2kyY19yZWdpc3RlcihkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0KLQkJdXNlX2FsdGVybmF0aXZlX2RldGVjdGlvbl9tZXRob2QoZGV2KTsKLQotCQlyYyA9IGZpbGxfYm9hcmRfc3BlY2lmaWNfZGF0YShkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0JLyogRGVmYXVsdCB2YWx1ZXMgZm9yIFNURCBhbmQgcmVzb2x1dGlvbnMgKi8KLQlkZXYtPndpZHRoID0gNzIwOwotCWRldi0+aGVpZ2h0ID0gNDgwOwotCWRldi0+bm9ybSA9IFY0TDJfU1REX1BBTF9NOwotCi0JLyogQ29uZmlndXJlIHR1bmVyICovCi0JdG02MDAwX2NvbmZpZ190dW5lcihkZXYpOwotCi0JLyogU2V0IHZpZGVvIHN0YW5kYXJkICovCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIGNvcmUsIHNfc3RkLCBkZXYtPm5vcm0pOwotCi0JLyogU2V0IHR1bmVyIGZyZXF1ZW5jeSAtIGFsc28gbG9hZHMgZmlybXdhcmUgb24geGMyMDI4L3hjMzAyOCAqLwotCWYudHVuZXIgPSAwOwotCWYudHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCWYuZnJlcXVlbmN5ID0gMzA5MjsJLyogMTkzLjI1IE1IeiAqLwotCWRldi0+ZnJlcSA9IGYuZnJlcXVlbmN5OwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksICZmKTsKLQotCWlmIChkZXYtPmNhcHMuaGFzX3RkYTk4NzQpCi0JCXY0bDJfaTJjX25ld19zdWJkZXYoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAotCQkJInR2YXVkaW8iLCBJMkNfQUREUl9UREE5ODc0LCBOVUxMKTsKLQotCS8qIHJlZ2lzdGVyIGFuZCBpbml0aWFsaXplIFY0TDIgKi8KLQlyYyA9IHRtNjAwMF92NGwyX3JlZ2lzdGVyKGRldik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0KLQl0bTYwMDBfYWRkX2ludG9fZGV2bGlzdChkZXYpOwotCXRtNjAwMF9pbml0X2V4dGVuc2lvbihkZXYpOwotCi0JdG02MDAwX2lyX2luaXQoZGV2KTsKLQotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIGhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCi0jZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQotCi1zdGF0aWMgdm9pZCBnZXRfbWF4X2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQsCi0JCQkgICAgIGNoYXIgKm1zZ3R5cGUsCi0JCQkgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqY3Vycl9lLAotCQkJICAgICBzdHJ1Y3QgdG02MDAwX2VuZHBvaW50ICp0bV9lcCkKLXsKLQl1MTYgdG1wID0gbGUxNl90b19jcHUoY3Vycl9lLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRtcCAmIDB4N2ZmOwotCi0JaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlzaXplID0gc2l6ZSAqIGhiX211bHQodG1wKTsKLQotCWlmIChzaXplID4gdG1fZXAtPm1heHNpemUpIHsKLQkJdG1fZXAtPmVuZHAgPSBjdXJyX2U7Ci0JCXRtX2VwLT5tYXhzaXplID0gc2l6ZTsKLQkJdG1fZXAtPmJJbnRlcmZhY2VOdW1iZXIgPSBhbHQtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKLQkJdG1fZXAtPmJBbHRlcm5hdGVTZXR0aW5nID0gYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nOwotCi0JCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogJXMgZW5kcG9pbnQ6IDB4JTAyeCAobWF4IHNpemU9JXUgYnl0ZXMpXG4iLAotCQkJCQltc2d0eXBlLCBjdXJyX2UtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKLQkJCQkJc2l6ZSk7Ci0JfQotfQotCi0vKgotICogdG02MDAwX3VzYl9wcm9iZSgpCi0gKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCi0gKi8KLXN0YXRpYyBpbnQgdG02MDAwX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gTlVMTDsKLQlpbnQgaSwgcmMgPSAwOwotCWludCBuciA9IDA7Ci0JY2hhciAqc3BlZWQ7Ci0KLQl1c2JkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwotCi0JLyogU2VsZWN0cyB0aGUgcHJvcGVyIGludGVyZmFjZSAqLwotCXJjID0gdXNiX3NldF9pbnRlcmZhY2UodXNiZGV2LCAwLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQotCS8qIENoZWNrIHRvIHNlZSBuZXh0IGZyZWUgZGV2aWNlIGFuZCBtYXJrIGFzIHVzZWQgKi8KLQluciA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnRtNjAwMF9kZXZ1c2VkLCBUTTYwMDBfTUFYQk9BUkRTKTsKLQlpZiAobnIgPj0gVE02MDAwX01BWEJPQVJEUykgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogU3VwcG9ydHMgb25seSAlaSB0bTYweHggYm9hcmRzLlxuIiwgVE02MDAwX01BWEJPQVJEUyk7Ci0JCXVzYl9wdXRfZGV2KHVzYmRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBkZXYgc3RydWN0ICovCi0JZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMCIgIjogb3V0IG9mIG1lbW9yeSFcbiIpOwotCQl1c2JfcHV0X2Rldih1c2JkZXYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+c2xvY2spOwotCi0JLyogSW5jcmVtZW50IHVzYWdlIGNvdW50ICovCi0JdG02MDAwX2RldnVzZWQgfD0gMTw8bnI7Ci0Jc25wcmludGYoZGV2LT5uYW1lLCAyOSwgInRtNjAwMCAjJWQiLCBucik7Ci0KLQlkZXYtPm1vZGVsID0gaWQtPmRyaXZlcl9pbmZvOwotCWlmICgoY2FyZFtucl0gPj0gMCkgJiYgKGNhcmRbbnJdIDwgQVJSQVlfU0laRSh0bTYwMDBfYm9hcmRzKSkpCi0JCWRldi0+bW9kZWwgPSBjYXJkW25yXTsKLQotCWRldi0+dWRldiA9IHVzYmRldjsKLQlkZXYtPmRldm5vID0gbnI7Ci0KLQlzd2l0Y2ggKHVzYmRldi0+c3BlZWQpIHsKLQljYXNlIFVTQl9TUEVFRF9MT1c6Ci0JCXNwZWVkID0gIjEuNSI7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NQRUVEX1VOS05PV046Ci0JY2FzZSBVU0JfU1BFRURfRlVMTDoKLQkJc3BlZWQgPSAiMTIiOwotCQlicmVhazsKLQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlzcGVlZCA9ICI0ODAiOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzcGVlZCA9ICJ1bmtub3duIjsKLQl9Ci0KLQotCi0JLyogR2V0IGVuZHBvaW50cyAqLwotCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKLQkJaW50IGVwOwotCi0JCWZvciAoZXAgPSAwOyBlcCA8IGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJOdW1FbmRwb2ludHM7IGVwKyspIHsKLQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludAkqZTsKLQkJCWludCBkaXJfb3V0OwotCi0JCQllID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtlcF07Ci0KLQkJCWRpcl9vdXQgPSAoKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCi0JCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpOwotCi0JCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGFsdCAlZCwgaW50ZXJmYWNlICVpLCBjbGFzcyAlaVxuIiwKLQkJCSAgICAgICBpLAotCQkJICAgICAgIGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkgICAgICAgaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKLQotCQkJc3dpdGNoIChlLT5kZXNjLmJtQXR0cmlidXRlcykgewotCQkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgotCQkJCWlmICghZGlyX291dCkgewotCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKLQkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkgIkJ1bGsgSU4iLCBlLAotCQkJCQkJCSAmZGV2LT5idWxrX2luKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnZXRfbWF4X2VuZHBvaW50KHVzYmRldiwKLQkJCQkJCQkgJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkgIkJ1bGsgT1VUIiwgZSwKLQkJCQkJCQkgJmRldi0+YnVsa19vdXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKLQkJCQlpZiAoIWRpcl9vdXQpIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJICJJU09DIElOIiwgZSwKLQkJCQkJCQkgJmRldi0+aXNvY19pbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJICJJU09DIE9VVCIsIGUsCi0JCQkJCQkJICZkZXYtPmlzb2Nfb3V0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKLQkJCQlpZiAoIWRpcl9vdXQpIHsKLQkJCQkJZ2V0X21heF9lbmRwb2ludCh1c2JkZXYsCi0JCQkJCQkJJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSwKLQkJCQkJCQkiSU5UIElOIiwgZSwKLQkJCQkJCQkmZGV2LT5pbnRfaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldF9tYXhfZW5kcG9pbnQodXNiZGV2LAotCQkJCQkJCSZpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0sCi0JCQkJCQkJIklOVCBPVVQiLCBlLAotCQkJCQkJCSZkZXYtPmludF9vdXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBOZXcgdmlkZW8gZGV2aWNlIEAgJXMgTWJwcyAoJTA0eDolMDR4LCBpZm51bSAlZClcbiIsCi0JCXNwZWVkLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQlsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKLQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotCi0vKiBjaGVjayBpZiB0aGUgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLwotCWlmICghZGV2LT5pc29jX2luLmVuZHApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHByb2JpbmcgZXJyb3I6IG5vIElOIElTT0MgZW5kcG9pbnQhXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCi0JCWdvdG8gZXJyOwotCX0KLQotCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogRm91bmQgJXNcbiIsIHRtNjAwMF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSk7Ci0KLQlyYyA9IHRtNjAwMF9pbml0X2RldihkZXYpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZ1xuIiwgcmMpOwotCi0JdG02MDAwX2RldnVzZWQgJj0gfigxPDxucik7Ci0JdXNiX3B1dF9kZXYodXNiZGV2KTsKLQotCWtmcmVlKGRldik7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogdG02MDAwX3VzYl9kaXNjb25uZWN0KCkKLSAqIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ2V0cyBkaWNvbmVuY3RlZAotICogdmlkZW8gZGV2aWNlIHdpbGwgYmUgdW5yZWdpc3RlcmVkIG9uIHY0bDJfY2xvc2UgaW4gY2FzZSBpdCBpcyBzdGlsbCBvcGVuCi0gKi8KLXN0YXRpYyB2b2lkIHRtNjAwMF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IGRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+bmFtZSk7Ci0KLQl0bTYwMDBfaXJfZmluaShkZXYpOwotCi0JaWYgKGRldi0+Z3Bpby5wb3dlcl9sZWQpIHsKLQkJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0hBVVBQQVVHRV85MDBIOgotCQljYXNlIFRNNjAxMF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZX0hZQlJJRF9YRToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfVFdJTkhBTl9UVTUwMToKLQkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAxKTsKLQkJCW1zbGVlcCgxNSk7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1dBTkRFUjoKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVI6Ci0JCWNhc2UgVE02MDEwX0JPQVJEX0JFSE9MRF9XQU5ERVJfTElURToKLQkJY2FzZSBUTTYwMTBfQk9BUkRfQkVIT0xEX1ZPWUFHRVJfTElURToKLQkJCS8qIFBvd2VyIGxlZCBvZmYgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCQlkZXYtPmdwaW8ucG93ZXJfbGVkLCAweDAwKTsKLQkJCW1zbGVlcCgxNSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQl0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKGRldik7Ci0KLQl0bTYwMDBfaTJjX3VucmVnaXN0ZXIoZGV2KTsKLQotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOwotCi0JZGV2LT5zdGF0ZSB8PSBERVZfRElTQ09OTkVDVEVEOwotCi0JdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKLQotCXRtNjAwMF9jbG9zZV9leHRlbnNpb24oZGV2KTsKLQl0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChkZXYpOwotCi0Ja2ZyZWUoZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHRtNjAwMF91c2JfZHJpdmVyID0gewotCQkubmFtZSA9ICJ0bTYwMDAiLAotCQkucHJvYmUgPSB0bTYwMDBfdXNiX3Byb2JlLAotCQkuZGlzY29ubmVjdCA9IHRtNjAwMF91c2JfZGlzY29ubmVjdCwKLQkJLmlkX3RhYmxlID0gdG02MDAwX2lkX3RhYmxlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdG02MDAwX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMCIgIiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKFRNNjAwMF9WRVJTSU9OICA+PiAxNikgJiAweGZmLAotCSAgICAgICAoVE02MDAwX1ZFUlNJT04gID4+IDgpICYgMHhmZiwgVE02MDAwX1ZFUlNJT04gICYgMHhmZik7Ci0KLQkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZ0bTYwMDBfdXNiX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCkKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDAiCi0JCQkgICAiIHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZC5cbiIsIHJlc3VsdCk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdG02MDAwX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JLyogZGVyZWdpc3RlciBhdCBVU0Igc3Vic3lzdGVtICovCi0JdXNiX2RlcmVnaXN0ZXIoJnRtNjAwMF91c2JfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodG02MDAwX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KHRtNjAwMF9tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGFkYXB0ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ViMmUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi0vKgotICogIHRtNjAwMC1jb3JlLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqICAgICAgLSBEVkItVCBzdXBwb3J0Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KLQotI2RlZmluZSBVU0JfVElNRU9VVAkoNSAqIEhaKSAvKiBtcyAqLwotCi1pbnQgdG02MDAwX3JlYWRfd3JpdGVfdXNiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXFfdHlwZSwgdTggcmVxLAotCQkJICB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlpbnQgICAgICAgICAgcmV0LCBpOwotCXVuc2lnbmVkIGludCBwaXBlOwotCXU4CSAgICAgKmRhdGEgPSBOVUxMOwotCi0JaWYgKGxlbikKLQkJZGF0YSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQotCi0JaWYgKHJlcV90eXBlICYgVVNCX0RJUl9JTikKLQkJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApOwotCWVsc2UgewotCQlwaXBlID0gdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCk7Ci0JCW1lbWNweShkYXRhLCBidWYsIGxlbik7Ci0JfQotCi0JaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7Ci0JCXByaW50aygiKGRldiAlcCwgcGlwZSAlMDh4KTogIiwgZGV2LT51ZGV2LCBwaXBlKTsKLQotCQlwcmludGsoIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKLQkJCShyZXFfdHlwZSAmIFVTQl9ESVJfSU4pID8gIiBJTiIgOiAiT1VUIiwKLQkJCXJlcV90eXBlLCByZXEsIHZhbHVlJjB4ZmYsIHZhbHVlPj44LCBpbmRleCYweGZmLAotCQkJaW5kZXg+PjgsIGxlbiYweGZmLCBsZW4+PjgpOwotCi0JCWlmICghKHJlcV90eXBlICYgVVNCX0RJUl9JTikpIHsKLQkJCXByaW50aygiPj4+ICIpOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCXByaW50aygiICUwMngiLCBidWZbaV0pOwotCQlwcmludGsoIlxuIik7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCBwaXBlLCByZXEsIHJlcV90eXBlLCB2YWx1ZSwgaW5kZXgsCi0JCQkgICAgICBkYXRhLCBsZW4sIFVTQl9USU1FT1VUKTsKLQotCWlmIChyZXFfdHlwZSAmICBVU0JfRElSX0lOKQotCQltZW1jcHkoYnVmLCBkYXRhLCBsZW4pOwotCi0JaWYgKHRtNjAwMF9kZWJ1ZyAmIFY0TDJfREVCVUdfSTJDKSB7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikKLQkJCQlwcmludGsoIjw8PCAobGVuPSVkKVxuIiwgbGVuKTsKLQotCQkJcHJpbnRrKCIlczogRXJyb3IgIyVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0JCX0gZWxzZSBpZiAocmVxX3R5cGUgJiAgVVNCX0RJUl9JTikgewotCQkJcHJpbnRrKCI8PDwgIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSk7Ci0JCQlwcmludGsoIlxuIik7Ci0JCX0KLQl9Ci0KLQlrZnJlZShkYXRhKTsKLQotCW1zbGVlcCg1KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0bTYwMDBfc2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKLXsKLQlyZXR1cm4KLQkJdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IsCi0JCQkJICAgICAgcmVxLCB2YWx1ZSwgaW5kZXgsIE5VTEwsIDApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9yZWcpOwotCi1pbnQgdG02MDAwX2dldF9yZWcoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCi17Ci0JaW50IHJjOwotCXU4IGJ1ZlsxXTsKLQotCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAotCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgMSk7Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gKmJ1ZjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRtNjAwMF9nZXRfcmVnKTsKLQotaW50IHRtNjAwMF9zZXRfcmVnX21hc2soc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHJlcSwgdTE2IHZhbHVlLAotCQkJCQkJdTE2IGluZGV4LCB1MTYgbWFzaykKLXsKLQlpbnQgcmM7Ci0JdTggYnVmWzFdOwotCXU4IG5ld19pbmRleDsKLQotCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwgcmVxLAotCQkJCQl2YWx1ZSwgaW5kZXgsIGJ1ZiwgMSk7Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQluZXdfaW5kZXggPSAoYnVmWzBdICYgfm1hc2spIHwgKGluZGV4ICYgbWFzayk7Ci0KLQlpZiAobmV3X2luZGV4ID09IGluZGV4KQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwKLQkJCQkgICAgICByZXEsIHZhbHVlLCBuZXdfaW5kZXgsIE5VTEwsIDApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9yZWdfbWFzayk7Ci0KLWludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQotewotCWludCByYzsKLQl1OCBidWZbMl07Ci0KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKLQkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDIpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIGJ1ZlsxXXxidWZbMF08PDg7Ci19Ci0KLWludCB0bTYwMDBfZ2V0X3JlZzMyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQotewotCWludCByYzsKLQl1OCBidWZbNF07Ci0KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsIHJlcSwKLQkJCQkJdmFsdWUsIGluZGV4LCBidWYsIDQpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIGJ1ZlszXSB8IGJ1ZlsyXSA8PCA4IHwgYnVmWzFdIDw8IDE2IHwgYnVmWzBdIDw8IDI0OwotfQotCi1pbnQgdG02MDAwX2kyY19yZXNldChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTE2IHRzbGVlcCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgVE02MDAwX0dQSU9fQ0xLLCAwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltc2xlZXAodHNsZWVwKTsKLQotCXJjID0gdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBUTTYwMDBfR1BJT19DTEssIDEpOwotCW1zbGVlcCh0c2xlZXApOwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIHRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJaW50IHZhbDsKLQotCQl2YWwgPSB0bTYwMDBfZ2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLCAwKSAmIDB4ZmM7Ci0JCWlmIChkZXYtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIHZhbCk7Ci0JCWVsc2UKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDQ19BQ1RJVkVfVklERU9fSUYsIHZhbCB8IDEpOwotCX0gZWxzZSB7Ci0JCWlmIChkZXYtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfVVlWWSkKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHhkMCk7Ci0JCWVsc2UKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHg5MCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0bTYwMDBfc2V0X3ZiaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQkvKgotCSAqIEZJWE1FOgotCSAqIFZCSSBsaW5lcyBhbmQgc3RhcnQvZW5kIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiA2MEh6IGFuZCA1MEh6Ci0JICogU28sIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNvbmZpZyB0bwotCSAqIHNvbWV0aGluZyB0aGF0IHRha2VzIGl0IGludG8gYWNjb3VudCwgZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudAotCSAqIGlmIChkZXYtPm5vcm0gJiBWNEwyX1NURF81MjVfNjApCi0JICovCi0KLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQxX1RFTEVURVhUX1ZCSV9DT0RFMSwgMHgyNyk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMLCAweDU1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjQzX1ZCSV9EQVRBX1RZUEVfTElORTcsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDRfVkJJX0RBVEFfVFlQRV9MSU5FOCwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I0NV9WQklfREFUQV9UWVBFX0xJTkU5LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Nl9WQklfREFUQV9UWVBFX0xJTkUxMCwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNDdfVkJJX0RBVEFfVFlQRV9MSU5FMTEsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjQ4X1ZCSV9EQVRBX1RZUEVfTElORTEyLCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0OV9WQklfREFUQV9UWVBFX0xJTkUxMywgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNEFfVkJJX0RBVEFfVFlQRV9MSU5FMTQsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjRCX1ZCSV9EQVRBX1RZUEVfTElORTE1LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Q19WQklfREFUQV9UWVBFX0xJTkUxNiwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNERfVkJJX0RBVEFfVFlQRV9MSU5FMTcsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjRFX1ZCSV9EQVRBX1RZUEVfTElORTE4LCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I0Rl9WQklfREFUQV9UWVBFX0xJTkUxOSwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTBfVkJJX0RBVEFfVFlQRV9MSU5FMjAsIDB4NjYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxLCAweDY2KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I1Ml9WQklfREFUQV9UWVBFX0xJTkUyMiwgMHg2Nik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTNfVkJJX0RBVEFfVFlQRV9MSU5FMjMsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQlUTTYwMTBfUkVRMDdfUjU0X1ZCSV9EQVRBX1RZUEVfUkxJTkVTLCAweDAwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LAotCQkJVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTZfVkJJX0xPT1BfRklMVEVSX0lfR0FJTiwgMHgwMCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCVRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTiwgMHgwMik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1I1OF9WQklfQ0FQVElPTl9EVE8xLCAweDM1KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjU5X1ZCSV9DQVBUSU9OX0RUTzAsIDB4YTApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNUFfVkJJX1RFTEVURVhUX0RUTzEsIDB4MTEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNUJfVkJJX1RFTEVURVhUX0RUTzAsIDB4NGMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SNDBfVEVMRVRFWFRfVkJJX0NPREUwLCAweDAxKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwKTsKLQl9Ci19Ci0KLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgZjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQkvKiBFbmFibGUgdmlkZW8gYW5kIGF1ZGlvICovCi0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDdfUkNDX0FDVElWRV9WSURFT19JRiwKLQkJCQkJCQkweDYwLCAweDYwKTsKLQkJLyogRGlzYWJsZSBUUyBpbnB1dCAqLwotCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLAotCQkJCQkJCTB4MDAsIDB4NDApOwotCX0gZWxzZSB7Ci0JCS8qIEVuYWJsZXMgc29mdCByZXNldCAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOwotCi0JCWlmIChkZXYtPnNjYWxlcikKLQkJCS8qIERpc2FibGUgSGZpbHRlciBhbmQgRW5hYmxlIFRTIERyb3AgZXJyICovCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwgMHgyMCk7Ci0JCWVsc2UJLyogRW5hYmxlIEhmaWx0ZXIgYW5kIGRpc2FibGUgVFMgRHJvcCBlcnIgKi8KLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDgwKTsKLQotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMLCAweDIzKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQxX0FERFJfRk9SX1JFUTEsIDB4YzApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDJfQUREUl9GT1JfUkVRMiwgMHhkOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JENl9FTkRQX1JFUTFfUkVRMiwgMHgwNik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JERl9QV0RPV05fQUNMSywgMHgxZik7Ci0KLQkJLyogQVAgU29mdHdhcmUgcmVzZXQgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDgpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCk7Ci0KLQkJdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KGRldik7Ci0KLQkJLyogRGlzYWJsZXMgc29mdCByZXNldCAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDApOwotCX0KLQltc2xlZXAoMjApOwotCi0JLyogVHVuZXIgZmlybXdhcmUgY2FuIG5vdyBiZSBsb2FkZWQgKi8KLQotCS8qCi0JICogRklYTUU6IFRoaXMgaXMgYSBoYWNrISB4YzMwMjggInNsZWVwcyIgd2hlbiBubyBjaGFubmVsIGlzIGRldGVjdGVkCi0JICogZm9yIG1vcmUgdGhhbiBhIGZldyBzZWNvbmRzLiBOb3Qgc3VyZSB3aHksIGFzIHRoaXMgYmVoYXZpb3IgZG9lcwotCSAqIG5vdCBoYXBwZW4gb24gb3RoZXIgZGV2aWNlcyB3aXRoIHhjMzAyOC4gU28sIEkgc3VzcGVjdCB0aGF0IGl0Ci0JICogaXMgeWV0IGFub3RoZXIgYnVnIGF0IHRtNjAwMC4gQWZ0ZXIgc3RhcnQgc2xlZXBpbmcsIGRlY29kaW5nIAotCSAqIGRvZXNuJ3Qgc3RhcnQgYXV0b21hdGljYWxseS4gSW5zdGVhZCwgaXQgcmVxdWlyZXMgc29tZQotCSAqIEkyQyBjb21tYW5kcyB0byB3YWtlIGl0IHVwLiBBcyB3ZSB3YW50IHRvIGhhdmUgaW1hZ2UgYXQgdGhlCi0JICogYmVnaW5uaW5nLCB3ZSBuZWVkZWQgdG8gYWRkIHRoaXMgaGFjay4gVGhlIGJldHRlciB3b3VsZCBiZSB0bwotCSAqIGRpc2NvdmVyIHNvbWUgd2F5IHRvIG1ha2UgdG02MDAwIHRvIHdha2UgdXAgd2l0aG91dCB0aGlzIGhhY2suCi0JICovCi0JZi5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7Ci0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX2ZyZXF1ZW5jeSwgJmYpOwotCi0JbXNsZWVwKDEwMCk7Ci0JdG02MDAwX3NldF9zdGFuZGFyZChkZXYpOwotCXRtNjAwMF9zZXRfdmJpKGRldik7Ci0JdG02MDAwX3NldF9hdWRpb19iaXRyYXRlKGRldiwgNDgwMDApOwotCi0JLyogc3dpdGNoIGR2YiBsZWQgb2ZmICovCi0JaWYgKGRldi0+Z3Bpby5kdmJfbGVkKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwKLQkJCWRldi0+Z3Bpby5kdmJfbGVkLCAweDAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJLyogRGlzYWJsZSB2aWRlbyBhbmQgYXVkaW8gKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLAotCQkJCTB4MDAsIDB4NjApOwotCQkvKiBFbmFibGUgVFMgaW5wdXQgKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwN19SQzBfQUNUSVZFX1ZJREVPX1NPVVJDRSwKLQkJCQkweDQwLCAweDQwKTsKLQkJLyogYWxsIHBvd2VyIGRvd24sIGJ1dCBub3QgdGhlIGRpZ2l0YWwgZGF0YSBwb3J0ICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOLCAweDI4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZmMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHhmZik7Ci0JfSBlbHNlICB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JGRl9TT0ZUX1JFU0VULCAweDA4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREZfUFdET1dOX0FDTEssIDB4MDgpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTJfVkFEQ19TVEFUVVNfQ1RMLCAweDBjKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHhmZik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHhkOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDQwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMxX1RSRVNIT0xELCAweGQwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkMzX0hTVEFSVDEsIDB4MDkpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgzNyk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEMV9BRERSX0ZPUl9SRVExLCAweGQ4KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQyX0FERFJfRk9SX1JFUTIsIDB4YzApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIsIDB4NjApOwotCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFMl9WQURDX1NUQVRVU19DVEwsIDB4MGMpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweGZmKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLCAweDA4KTsKLQkJbXNsZWVwKDUwKTsKLQotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQsIDB4MDAyMCwgMHgwMCk7Ci0JCW1zbGVlcCg1MCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMDIwLCAweDAxKTsKLQkJbXNsZWVwKDUwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDRfRU5fRElTQUJMRV9NQ1VfSU5ULCAweDAwMjAsIDB4MDApOwotCQltc2xlZXAoMTAwKTsKLQl9Ci0KLQkvKiBzd2l0Y2ggZHZiIGxlZCBvbiAqLwotCWlmIChkZXYtPmdwaW8uZHZiX2xlZCkgewotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV8wM19TRVRfR0VUX01DVV9QSU4sCi0JCQlkZXYtPmdwaW8uZHZiX2xlZCwgMHgwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRtNjAwMF9pbml0X2RpZ2l0YWxfbW9kZSk7Ci0KLXN0cnVjdCByZWdfaW5pdCB7Ci0JdTggcmVxOwotCXU4IHJlZzsKLQl1OCB2YWw7Ci19OwotCi0vKiBUaGUgbWVhbmluZyBvZiB0aG9zZSBpbml0aWFsaXphdGlvbnMgYXJlIHVua25vd24gKi8KLXN0cnVjdCByZWdfaW5pdCB0bTYwMDBfaW5pdF90YWJbXSA9IHsKLQkvKiBSRUcgIFZBTFVFICovCi0JeyBUTTYwMDBfUkVRMDdfUkRGX1BXRE9XTl9BQ0xLLCAweDFmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQsIDB4MDggfSwKLQl7IFRNNjAxMF9SRVEwN19SRkZfU09GVF9SRVNFVCwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA3X1JENV9QT1dFUlNBVkUsIDB4NGYgfSwKLQl7IFRNNjAwMF9SRVEwN19SREFfQ0xLX1NFTCwgMHgyMyB9LAotCXsgVE02MDAwX1JFUTA3X1JEQl9PVVRfU0VMLCAweDA4IH0sCi0JeyBUTTYwMDBfUkVRMDdfUkUyX1ZBRENfU1RBVFVTX0NUTCwgMHgwMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgxMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCB9LAotCXsgVE02MDAwX1JFUTA3X1JFOF9WQURDX1BXRE9XTl9DVEwsIDB4MDAgfSwKLQl7IFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsIDB4NjQgfSwJLyogNDgwMDAgYml0cy9zYW1wbGUsIGV4dGVybmFsIGlucHV0ICovCi0JeyBUTTYwMDBfUkVRMDdfUkVFX1ZBRENfQ1RSTF9TRUxfQ09OVFJPTCwgMHhjMiB9LAotCi0JeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxIH0sCQkvKiBTdGFydCBvZiBzb2Z0IHJlc2V0ICovCi0JeyBUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDA3IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRCwgMHg2NCB9LAotCXsgVE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgwMSB9LAotCXsgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMHg4MiB9LAotCXsgVE02MDEwX1JFUTA3X1IwOV9MVU1BX0JSSUdIVE5FU1NfQURKLCAweDM2IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgMHg1MCB9LAotCXsgVE02MDEwX1JFUTA3X1IwQ19DSFJPTUFfQUdDX0NPTlRST0wsIDB4NmEgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTFfQUdDX1BFQUtfQ09OVFJPTCwgMHhjOSB9LAotCXsgVE02MDEwX1JFUTA3X1IxMl9BR0NfR0FURV9TVEFSVEgsIDB4MDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMLCAweDNiIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE0X0FHQ19HQVRFX1dJRFRILCAweDQ3IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE1X0FHQ19CUF9ERUxBWSwgMHg2ZiB9LAotCXsgVE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHhjZCB9LAotCXsgVE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWUgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhiIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMiB9LAotCXsgVE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTkgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWMgfSwKLQl7IFRNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2QgfSwKLQl7IFRNNjAxMF9SRVEwN19SMjBfSFNZTkNfUklTSU5HX0VER0VfVElNRSwgMHgzYyB9LAotCXsgVE02MDEwX1JFUTA3X1IyMV9IU1lOQ19QSEFTRV9PRkZTRVQsIDB4M2MgfSwKLQl7IFRNNjAxMF9SRVEwN19SMkRfQ0hST01BX0JVUlNUX0VORCwgMHg0OCB9LAotCXsgVE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjIgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHg2MSB9LAotCXsgVE02MDEwX1JFUTA3X1IzMl9WU1lOQ19ITE9DS19NSU4sIDB4NzQgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4sIDB4NzQgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxYyB9LAotCXsgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOLCAweDdhIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgsIDB4MjYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xELCAweDQwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM5X1ZTWU5DX1RJTUVfQ09OU1RBTlQsIDB4MGEgfSwKLQl7IFRNNjAxMF9SRVEwN19SNDJfVkJJX0RBVEFfSElHSF9MRVZFTCwgMHg1NSB9LAotCXsgVE02MDEwX1JFUTA3X1I1MV9WQklfREFUQV9UWVBFX0xJTkUyMSwgMHgxMSB9LAotCXsgVE02MDEwX1JFUTA3X1I1NV9WQklfTE9PUF9GSUxURVJfR0FJTiwgMHgwMSB9LAotCXsgVE02MDEwX1JFUTA3X1I1N19WQklfTE9PUF9GSUxURVJfUF9HQUlOLCAweDAyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEsIDB4MzUgfSwKLQl7IFRNNjAxMF9SRVEwN19SNTlfVkJJX0NBUFRJT05fRFRPMCwgMHhhMCB9LAotCXsgVE02MDEwX1JFUTA3X1I4MF9DT01CX0ZJTFRFUl9UUkVTSE9MRCwgMHgxNSB9LAotCXsgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NDIgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQsIDB4ZDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMSwgMHg4OCB9LAotCXsgVE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMCB9LAkJLyogRW5kIG9mIHRoZSBzb2Z0IHJlc2V0ICovCi0JeyBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNywgMHgwMCB9LAotfTsKLQotc3RydWN0IHJlZ19pbml0IHRtNjAxMF9pbml0X3RhYltdID0gewotCXsgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFLCAweDAwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkM0X0hTVEFSVDAsIDB4YTAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQzZfSEVORDAsIDB4NDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SQ0FfVkVORDAsIDB4MzEgfSwKLQl7IFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGLCAweGUxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkUwX0RWSURFT19TT1VSQ0UsIDB4MDMgfSwKLQl7IFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgMHg3ZiB9LAotCi0JeyBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIDB4ZjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjQgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjggfSwKLQl7IFRNNjAxMF9SRVEwOF9SRTZfUE9XRVJfRE9XTl9DVFJMMiwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYyIH0sCi0JeyBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyIH0sCi0JeyBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsIDB4NjAgfSwKLQl7IFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCAweGZjIH0sCi0KLQl7IFRNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDEgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMDVfTk9JU0VfVEhSRVNIT0xELCAweDY0IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDAxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA4X0xVTUFfQ09OVFJBU1RfQURKLCAweDgyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIDB4MzYgfSwKLQl7IFRNNjAxMF9SRVEwN19SMEFfQ0hST01BX1NBVFVSQVRJT05fQURKLCAweDUwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjBDX0NIUk9NQV9BR0NfQ09OVFJPTCwgMHg2YSB9LAotCXsgVE02MDEwX1JFUTA3X1IxMV9BR0NfUEVBS19DT05UUk9MLCAweGM5IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjEyX0FHQ19HQVRFX1NUQVJUSCwgMHgwNyB9LAotCXsgVE02MDEwX1JFUTA3X1IxM19BR0NfR0FURV9TVEFSVEwsIDB4M2IgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTRfQUdDX0dBVEVfV0lEVEgsIDB4NDcgfSwKLQl7IFRNNjAxMF9SRVEwN19SMTVfQUdDX0JQX0RFTEFZLCAweDZmIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE3X0hMT09QX01BWFNUQVRFLCAweGNkIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZSB9LAotCXsgVE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OGIgfSwKLQl7IFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweGEyIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHhlOSB9LAotCXsgVE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjYyB9LAotCXsgVE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZCB9LAotCXsgVE02MDEwX1JFUTA3X1IyMF9IU1lOQ19SSVNJTkdfRURHRV9USU1FLCAweDNjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjIxX0hTWU5DX1BIQVNFX09GRlNFVCwgMHgzYyB9LAotCXsgVE02MDEwX1JFUTA3X1IyRF9DSFJPTUFfQlVSU1RfRU5ELCAweDQ4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODggfSwKLQl7IFRNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMiB9LAotCXsgVE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjMyX1ZTWU5DX0hMT0NLX01JTiwgMHg3NCB9LAotCXsgVE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MWMgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzRfVlNZTkNfQUdDX01JTiwgMHg3NCB9LAotCXsgVE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjM2X1ZTWU5DX1ZCSV9NSU4sIDB4N2EgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzdfVlNZTkNfVkJJX01BWCwgMHgyNiB9LAotCXsgVE02MDEwX1JFUTA3X1IzOF9WU1lOQ19USFJFU0hPTEQsIDB4NDAgfSwKLQl7IFRNNjAxMF9SRVEwN19SMzlfVlNZTkNfVElNRV9DT05TVEFOVCwgMHgwYSB9LAotCXsgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMLCAweDU1IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxLCAweDExIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU1X1ZCSV9MT09QX0ZJTFRFUl9HQUlOLCAweDAxIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjU3X1ZCSV9MT09QX0ZJTFRFUl9QX0dBSU4sIDB4MDIgfSwKLQl7IFRNNjAxMF9SRVEwN19SNThfVkJJX0NBUFRJT05fRFRPMSwgMHgzNSB9LAotCXsgVE02MDEwX1JFUTA3X1I1OV9WQklfQ0FQVElPTl9EVE8wLCAweGEwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUjgwX0NPTUJfRklMVEVSX1RSRVNIT0xELCAweDE1IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0MiB9LAotCXsgVE02MDEwX1JFUTA3X1JDMV9UUkVTSE9MRCwgMHhkMCB9LAotCXsgVE02MDEwX1JFUTA3X1JDM19IU1RBUlQxLCAweDg4IH0sCi0JeyBUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwIH0sCi0KLQl7IFRNNjAxMF9SRVEwNV9SMThfSU1BU0s3LCAweDAwIH0sCi0KLQl7IFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMSwgMHhhYSB9LAotCXsgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwLCAweDMwIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDEsIDB4MjAgfSwKLQl7IFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMCwgMHhkMCB9LAotCXsgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMHgwMiwgMHgwMCB9LAotCXsgVE02MDEwX1JFUTA3X1JEOF9JUiwgMHgyZiB9LAotCi0JLyogc2V0IHJlbW90ZSB3YWtldXAga2V5OmFueSBrZXkgd2FrZXVwICovCi0JeyBUTTYwMTBfUkVRMDdfUkU1X1JFTU9URV9XQUtFVVAsICAweGZlIH0sCi0JeyBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwsICAweGZmIH0sCi19OwotCi1pbnQgdG02MDAwX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGJvYXJkLCByYyA9IDAsIGksIHNpemU7Ci0Jc3RydWN0IHJlZ19pbml0ICp0YWI7Ci0KLQkvKiBDaGVjayBib2FyZCByZXZpc2lvbiAqLwotCWJvYXJkID0gdG02MDAwX2dldF9yZWczMihkZXYsIFJFUV80MF9HRVRfVkVSU0lPTiwgMCwgMCk7Ci0JaWYgKGJvYXJkID49IDApIHsKLQkJc3dpdGNoIChib2FyZCAmIDB4ZmYpIHsKLQkJY2FzZSAweGYzOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgdG02MDAwXG4iKTsKLQkJCWlmIChkZXYtPmRldl90eXBlICE9IFRNNjAwMCkKLQkJCQlkZXYtPmRldl90eXBlID0gVE02MDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHhmNDoKLQkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIHRtNjAxMFxuIik7Ci0JCQlpZiAoZGV2LT5kZXZfdHlwZSAhPSBUTTYwMTApCi0JCQkJZGV2LT5kZXZfdHlwZSA9IFRNNjAxMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBib2FyZCB2ZXJzaW9uID0gMHglMDh4XG4iLCBib2FyZCk7Ci0JCX0KLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSByZXRyaWV2aW5nIGJvYXJkIHZlcnNpb25cbiIsIGJvYXJkKTsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQl0YWIgPSB0bTYwMTBfaW5pdF90YWI7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHRtNjAxMF9pbml0X3RhYik7Ci0JfSBlbHNlIHsKLQkJdGFiID0gdG02MDAwX2luaXRfdGFiOwotCQlzaXplID0gQVJSQVlfU0laRSh0bTYwMDBfaW5pdF90YWIpOwotCX0KLQotCS8qIExvYWQgYm9hcmQncyBpbml0aWFsaXphdGlvbiB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJcmMgPSB0bTYwMDBfc2V0X3JlZyhkZXYsIHRhYltpXS5yZXEsIHRhYltpXS5yZWcsIHRhYltpXS52YWwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVpIHdoaWxlIHNldHRpbmcgcmVxICVkLCAiCi0JCQkJCSJyZWcgJWQgdG8gdmFsdWUgJWRcbiIsIHJjLAotCQkJCQl0YWJbaV0ucmVxLCB0YWJbaV0ucmVnLCB0YWJbaV0udmFsKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCW1zbGVlcCg1KTsgLyogSnVzdCB0byBiZSBjb25zZXJ2YXRpdmUgKi8KLQotCXJjID0gdG02MDAwX2NhcmRzX3NldHVwKGRldik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKQotewotCWludCB2YWwgPSAwOwotCXU4IGFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLwotCXU4IGFyZWdfMGEgPSAweDkxOyAvKiBTSUYgNDhLSHogKi8KLQotCXN3aXRjaCAoYml0cmF0ZSkgewotCWNhc2UgNDgwMDA6Ci0JCWFyZWdfZjAgPSAweDYwOyAvKiBBREMgTUNMSyA9IDI1MCBGcyAqLwotCQlhcmVnXzBhID0gMHg5MTsgLyogU0lGIDQ4S0h6ICovCi0JCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7Ci0JCWJyZWFrOwotCWNhc2UgMzIwMDA6Ci0JCWFyZWdfZjAgPSAweDAwOyAvKiBBREMgTUNMSyA9IDM3NSBGcyAqLwotCQlhcmVnXzBhID0gMHg5MDsgLyogU0lGIDMyS0h6ICovCi0JCWRldi0+YXVkaW9fYml0cmF0ZSA9IGJpdHJhdGU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCi0JLyogZW5hYmxlIEkyUywgaWYgd2UgdXNlIHNpZiBvciBleHRlcm5hbCBJMlMgZGV2aWNlICovCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXZhbCA9IHRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQV9BX0kyU19NT0QsIGFyZWdfMGEpOwotCQlpZiAodmFsIDwgMCkKLQkJCXJldHVybiB2YWw7Ci0KLQkJdmFsID0gdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKLQkJCQkJCQlhcmVnX2YwLCAweGYwKTsKLQkJaWYgKHZhbCA8IDApCi0JCQlyZXR1cm4gdmFsOwotCX0gZWxzZSB7Ci0JCXZhbCA9IHRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVCX1ZBRENfQUFEQ19NT0RFLAotCQkJCQkJCWFyZWdfZjAsIDB4ZjApOwotCQlpZiAodmFsIDwgMCkKLQkJCXJldHVybiB2YWw7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodG02MDAwX3NldF9hdWRpb19iaXRyYXRlKTsKLQotaW50IHRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQkvKiBBdWRpbyBjcm9zc2JhciBzZXR0aW5nLCBkZWZhdWx0IFNJRjEgKi8KLQkJdTggYXJlZ19mMDsKLQotCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgotCQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCQlhcmVnX2YwID0gMHgwMzsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JCQlhcmVnX2YwID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzI6Ci0JCQlhcmVnX2YwID0gMHgwODsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9BTVVYX0kyUzoKLQkJCWFyZWdfZjAgPSAweDA0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogYXVkaW8gaW5wdXQgZG9zbid0IHN1cHBvcnRcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogU2V0IGF1ZGlvIGlucHV0IGNyb3NzYmFyICovCi0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCi0JCQkJCQkJYXJlZ19mMCwgMHgwZik7Ci0JfSBlbHNlIHsKLQkJdTggYXJlZ19lYjsKLQkJLyogQXVkaW8gc2V0dGluZywgZGVmYXVsdCBMSU5FMSAqLwotCQlzd2l0Y2ggKGRldi0+cmlucHV0LmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCQkJYXJlZ19lYiA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQkJYXJlZ19lYiA9IDB4MDQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdWRpbyBpbnB1dCBkb3NuJ3Qgc3VwcG9ydFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBTZXQgYXVkaW8gaW5wdXQgKi8KLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUsCi0JCQkJCQkJYXJlZ19lYiwgMHgwZik7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIHRtNjAxMF9zZXRfbXV0ZV9zaWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCi17Ci0JdTggbXV0ZV9yZWcgPSAwOwotCi0JaWYgKG11dGUpCi0JCW11dGVfcmVnID0gMHgwODsKLQotCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUjBBX0FfSTJTX01PRCwgbXV0ZV9yZWcsIDB4MDgpOwotfQotCi12b2lkIHRtNjAxMF9zZXRfbXV0ZV9hZGMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpCi17Ci0JdTggbXV0ZV9yZWcgPSAwOwotCi0JaWYgKG11dGUpCi0JCW11dGVfcmVnID0gMHgyMDsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkgewotCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MLAotCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjNfUklHSFRfQ0hBTk5FTF9WT0wsCi0JCQkJCQkJbXV0ZV9yZWcsIDB4MjApOwotCX0gZWxzZSB7Ci0JCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMDBfUkVRMDdfUkVDX1ZBRENfQUFEQ19MVk9MLAotCQkJCQkJCW11dGVfcmVnLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wsCi0JCQkJCQkJbXV0ZV9yZWcsIDB4MjApOwotCX0KLX0KLQotaW50IHRtNjAwMF90dmF1ZGlvX3NldF9tdXRlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBtdXRlKQotewotCWVudW0gdG02MDAwX211eCBtdXg7Ci0KLQlpZiAoZGV2LT5yYWRpbykKLQkJbXV4ID0gZGV2LT5yaW5wdXQuYW11eDsKLQllbHNlCi0JCW11eCA9IGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXg7Ci0KLQlzd2l0Y2ggKG11eCkgewotCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKLQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJCXRtNjAxMF9zZXRfbXV0ZV9zaWYoZGV2LCBtdXRlKTsKLQkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJFUlJPUjogVE01NjAwIGFuZCBUTTYwMDAgZG9uJ3QgaGFzIgotCQkJCQkiIFNJRiBhdWRpbyBpbnB1dHMuIFBsZWFzZSBjaGVjayB0aGUgJXMiCi0JCQkJCSIgY29uZmlndXJhdGlvbi5cbiIsIGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQl0bTYwMTBfc2V0X211dGVfYWRjKGRldiwgbXV0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdG02MDEwX3NldF92b2x1bWVfc2lmKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBpbnQgdm9sKQotewotCXU4IHZvbF9yZWc7Ci0KLQl2b2xfcmVnID0gdm9sICYgMHgwRjsKLQotCWlmICh2b2wgPCAwKQotCQl2b2xfcmVnIHw9IDB4NDA7Ci0KLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDdfQV9MRUZUX1ZPTCwgdm9sX3JlZyk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA4X0FfUklHSFRfVk9MLCB2b2xfcmVnKTsKLX0KLQotdm9pZCB0bTYwMTBfc2V0X3ZvbHVtZV9hZGMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCB2b2wpCi17Ci0JdTggdm9sX3JlZzsKLQotCXZvbF9yZWcgPSAodm9sICsgMHgxMCkgJiAweDFmOwotCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JGMl9MRUZUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkYzX1JJR0hUX0NIQU5ORUxfVk9MLCB2b2xfcmVnKTsKLQl9IGVsc2UgewotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wsIHZvbF9yZWcpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wsIHZvbF9yZWcpOwotCX0KLX0KLQotdm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCkKLXsKLQllbnVtIHRtNjAwMF9tdXggbXV4OwotCi0JaWYgKGRldi0+cmFkaW8pIHsKLQkJbXV4ID0gZGV2LT5yaW5wdXQuYW11eDsKLQkJdm9sICs9IDg7IC8qIE9mZnNldCB0byAwIGRCICovCi0JfSBlbHNlCi0JCW11eCA9IGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXg7Ci0KLQlzd2l0Y2ggKG11eCkgewotCWNhc2UgVE02MDAwX0FNVVhfU0lGMToKLQljYXNlIFRNNjAwMF9BTVVYX1NJRjI6Ci0JCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJCXRtNjAxMF9zZXRfdm9sdW1lX3NpZihkZXYsIHZvbCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBUTTU2MDAgYW5kIFRNNjAwMCBkb24ndCBoYXMiCi0JCQkJCSIgU0lGIGF1ZGlvIGlucHV0cy4gUGxlYXNlIGNoZWNrIHRoZSAlcyIKLQkJCQkJIiBjb25maWd1cmF0aW9uLlxuIiwgZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKLQkJdG02MDEwX3NldF92b2x1bWVfYWRjKGRldiwgdm9sKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgTElTVF9IRUFEKHRtNjAwMF9kZXZsaXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgodG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCi0vKgotICogdG02MDAwX3JlYWxlYXNlX3Jlc291cmNlKCkKLSAqLwotCi12b2lkIHRtNjAwMF9yZW1vdmVfZnJvbV9kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCW11dGV4X2xvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLQlsaXN0X2RlbCgmZGV2LT5kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLXZvaWQgdG02MDAwX2FkZF9pbnRvX2Rldmxpc3Qoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwgJnRtNjAwMF9kZXZsaXN0KTsKLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX07Ci0KLS8qCi0gKiBFeHRlbnNpb24gaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIExJU1RfSEVBRCh0bTYwMDBfZXh0ZW5zaW9uX2Rldmxpc3QpOwotCi1pbnQgdG02MDAwX2NhbGxfZmlsbGJ1ZihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgZW51bSB0bTYwMDBfb3BzX3R5cGUgdHlwZSwKLQkJCWNoYXIgKmJ1ZiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHRtNjAwMF9vcHMgKm9wcyA9IE5VTEw7Ci0KLQkvKiBGSVhNRTogdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0X2xvY2sgc2hvdWxkIGJlIGEgc3BpbmxvY2sgKi8KLQotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+ZmlsbGJ1ZiAmJiBvcHMtPnR5cGUgPT0gdHlwZSkKLQkJCQlvcHMtPmZpbGxidWYoZGV2LCBidWYsIHNpemUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJm9wcy0+bmV4dCwgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ0bTYwMDBfZGV2bGlzdCwgZGV2bGlzdCkgewotCQlvcHMtPmluaXQoZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemVkICglcykgZXh0ZW5zaW9uXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBvcHMtPm5hbWUpOwotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodG02MDAwX3JlZ2lzdGVyX2V4dGVuc2lvbik7Ci0KLXZvaWQgdG02MDAwX3VucmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdG02MDAwX2Rldmxpc3QsIGRldmxpc3QpCi0JCW9wcy0+ZmluaShkZXYpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBSZW1vdmUgKCVzKSBleHRlbnNpb25cbiIsIG9wcy0+bmFtZSk7Ci0JbGlzdF9kZWwoJm9wcy0+bmV4dCk7Ci0JbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZGV2bGlzdF9tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbik7Ci0KLXZvaWQgdG02MDAwX2luaXRfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+aW5pdCkKLQkJCQlvcHMtPmluaXQoZGV2KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX0KLQotdm9pZCB0bTYwMDBfY2xvc2VfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfb3BzICpvcHMgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmdG02MDAwX2Rldmxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmdG02MDAwX2V4dGVuc2lvbl9kZXZsaXN0KSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJnRtNjAwMF9leHRlbnNpb25fZGV2bGlzdCwgbmV4dCkgewotCQkJaWYgKG9wcy0+ZmluaSkKLQkJCQlvcHMtPmZpbmkoZGV2KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRtNjAwMF9kZXZsaXN0X211dGV4KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWR2Yi5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtZHZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGRmY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtZHZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtZHZiLmMgLSBkdmItdCBzdXBwb3J0IGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLQotI2luY2x1ZGUgInpsMTAzNTMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0KLSNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKLSNpbmNsdWRlICJ4YzUwMDAuaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgZHJpdmVyIGV4dGVuc2lvbiBtb2R1bGUgZm9yIHRtNTYwMC82MDAwLzYwMTAgYmFzZWQgVFYgY2FyZHMiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tUcmlkZW50LCB0bTU2MDB9LCIKLQkJCSJ7e1RyaWRlbnQsIHRtNjAwMH0sIgotCQkJInt7VHJpZGVudCwgdG02MDEwfSIpOwotCi1zdGF0aWMgaW50IGRlYnVnOwotCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2UiKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkJICAgIGludCBwYWNrZXQsIGludCBzdGF0dXMpCi17Ci0JY2hhciAqZXJybXNnID0gIlVua25vd24iOwotCi0Jc3dpdGNoIChzdGF0dXMpIHsKLQljYXNlIC1FTk9FTlQ6Ci0JCWVycm1zZyA9ICJ1bmxpbmtlZCBzeW5jaHJvbnVvdXNseSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JCWVycm1zZyA9ICJ1bmxpbmtlZCBhc3luY2hyb251b3VzbHkiOwotCQlicmVhazsKLQljYXNlIC1FTk9TUjoKLQkJZXJybXNnID0gIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiOwotCQlicmVhazsKLQljYXNlIC1FUElQRToKLQkJZXJybXNnID0gIlN0YWxsZWQgKGRldmljZSBub3QgcmVzcG9uZGluZykiOwotCQlicmVhazsKLQljYXNlIC1FT1ZFUkZMT1c6Ci0JCWVycm1zZyA9ICJCYWJibGUgKGJhZCBjYWJsZT8pIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBST1RPOgotCQllcnJtc2cgPSAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVJTFNFUToKLQkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOwotCQlicmVhazsKLQljYXNlIC1FVElNRToKLQkJZXJybXNnID0gIkRldmljZSBkb2VzIG5vdCByZXNwb25kIjsKLQkJYnJlYWs7Ci0JfQotCWlmIChwYWNrZXQgPCAwKSB7Ci0JCWRwcmludGsoZGV2LCAxLCAiVVJCIHN0YXR1cyAlZCBbJXNdLlxuIiwKLQkJCXN0YXR1cywgZXJybXNnKTsKLQl9IGVsc2UgewotCQlkcHJpbnRrKGRldiwgMSwgIlVSQiBwYWNrZXQgJWQsIHN0YXR1cyAlZCBbJXNdLlxuIiwKLQkJCXBhY2tldCwgc3RhdHVzLCBlcnJtc2cpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX3VyYl9yZWNlaXZlZChzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IHVyYi0+Y29udGV4dDsKLQotCWlmICh1cmItPnN0YXR1cyAhPSAwKQotCQlwcmludF9lcnJfc3RhdHVzKGRldiwgMCwgdXJiLT5zdGF0dXMpOwotCWVsc2UgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApCi0JCWR2Yl9kbXhfc3dmaWx0ZXIoJmRldi0+ZHZiLT5kZW11eCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgpOwotCi0JaWYgKGRldi0+ZHZiLT5zdHJlYW1zID4gMCkgewotCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6ICBlcnJvciAlc1xuIiwgX19mdW5jX18pOwotCQkJa2ZyZWUodXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCX0KLQl9Ci19Ci0KLWludCB0bTYwMDBfc3RhcnRfc3RyZWFtKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHBpcGUsIHNpemU7Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgc3RyZWFtIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChkZXYtPm1vZGUgIT0gVE02MDAwX01PREVfRElHSVRBTCkgewotCQl0bTYwMDBfaW5pdF9kaWdpdGFsX21vZGUoZGV2KTsKLQkJZGV2LT5tb2RlID0gVE02MDAwX01PREVfRElHSVRBTDsKLQl9Ci0KLQlkdmItPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB1cmJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5idWxrX2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcwotCQkJCQkJCSAgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwotCi0Jc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0Jc2l6ZSA9IHNpemUgKiAxNTsgLyogNTEyIHggOCBvciAxMiBvciAxNSAqLwotCi0JZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKLQkJdXNiX2ZyZWVfdXJiKGR2Yi0+YnVsa191cmIpOwotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXVzYl9maWxsX2J1bGtfdXJiKGR2Yi0+YnVsa191cmIsIGRldi0+dWRldiwgcGlwZSwKLQkJCQkJCSBkdmItPmJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCQkgc2l6ZSwKLQkJCQkJCSB0bTYwMDBfdXJiX3JlY2VpdmVkLCBkZXYpOwotCi0JcmV0ID0gdXNiX2NsZWFyX2hhbHQoZGV2LT51ZGV2LCBwaXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogZXJyb3IgJWkgaW4gJXMgZHVyaW5nIHBpcGUgcmVzZXRcbiIsCi0JCQkJCQkJcmV0LCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBwaXBlIHJlc2V0dGVkXG4iKTsKLQotLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihkdmItPmJ1bGtfdXJiLCBHRlBfS0VSTkVMKTsKLQotLyoJbXV0ZXhfdW5sb2NrKCZ0bTYwMDBfZHJpdmVyLm9wZW5fY2xvc2VfbXV0ZXgpOyAqLwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IHN1Ym1pdCBvZiB1cmIgZmFpbGVkIChlcnJvcj0laSlcbiIsCi0JCQkJCQkJCQlyZXQpOwotCi0JCWtmcmVlKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB0bTYwMDBfc3RvcF9zdHJlYW0oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JaWYgKGR2Yi0+YnVsa191cmIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidXJiIGtpbGxpbmdcbiIpOwotCQl1c2Jfa2lsbF91cmIoZHZiLT5idWxrX3VyYik7Ci0JCXByaW50ayhLRVJOX0lORk8gInVyYiBidWZmZXIgZnJlZVxuIik7Ci0JCWtmcmVlKGR2Yi0+YnVsa191cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCXVzYl9mcmVlX3VyYihkdmItPmJ1bGtfdXJiKTsKLQkJZHZiLT5idWxrX3VyYiA9IE5VTEw7Ci0JfQotfQotCi1pbnQgdG02MDAwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQotewotCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBkZW11eC0+cHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RhcnQgZmVlZCByZXF1ZXN0ICVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZkdmItPm11dGV4KTsKLQlpZiAoZHZiLT5zdHJlYW1zID09IDApIHsKLQkJZHZiLT5zdHJlYW1zID0gMTsKLS8qCQltdXRleF9pbml0KCZ0bTYwMDBfZGV2LT5zdHJlbWluZ19tdXRleCk7ICovCi0JCXRtNjAwMF9zdGFydF9zdHJlYW0oZGV2KTsKLQl9IGVsc2UKLQkJKysoZHZiLT5zdHJlYW1zKTsKLQltdXRleF91bmxvY2soJmR2Yi0+bXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCkKLXsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkZW11eCA9IGZlZWQtPmRlbXV4OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZGVtdXgtPnByaXY7Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YiA9IGRldi0+ZHZiOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidG02MDAwOiBnb3Qgc3RvcCBmZWVkIHJlcXVlc3QgJXNcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJmR2Yi0+bXV0ZXgpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAic3RyZWFtICUjeFxuIiwgZHZiLT5zdHJlYW1zKTsKLQktLShkdmItPnN0cmVhbXMpOwotCWlmIChkdmItPnN0cmVhbXMgPT0gMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJzdG9wIHN0cmVhbVxuIik7Ci0JCXRtNjAwMF9zdG9wX3N0cmVhbShkZXYpOwotLyoJCW11dGV4X2Rlc3Ryb3koJnRtNjAwMF9kZXYtPnN0cmVhbWluZ19tdXRleCk7ICovCi0JfQotCW11dGV4X3VubG9jaygmZHZiLT5tdXRleCk7Ci0vKgltdXRleF9kZXN0cm95KCZ0bTYwMDBfZGV2LT5zdHJlYW1pbmdfbXV0ZXgpOyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2R2YiAqZHZiID0gZGV2LT5kdmI7Ci0KLQlpZiAoZGV2LT5jYXBzLmhhc196bDEwMzUzKSB7Ci0JCXN0cnVjdCB6bDEwMzUzX2NvbmZpZyBjb25maWcgPSB7Ci0JCQkJICAgICAuZGVtb2RfYWRkcmVzcyA9IGRldi0+ZGVtb2RfYWRkciwKLQkJCQkgICAgIC5ub190dW5lciA9IDEsCi0JCQkJICAgICAucGFyYWxsZWxfdHMgPSAxLAotCQkJCSAgICAgLmlmMiA9IDQ1NzAwLAotCQkJCSAgICAgLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCi0JCQkJICAgIH07Ci0KLQkJZHZiLT5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsICZjb25maWcsCi0JCQkJCQkJICAgJmRldi0+aTJjX2FkYXApOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBkZWZpbmVkIGZvciB0aGUgZGV2aWNlIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gKCFkdmItPmZyb250ZW5kKSA/IC0xIDogMDsKLX0KLQotRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7Ci0KLWludCByZWdpc3Rlcl9kdmIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IHJldCA9IC0xOwotCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKLQotCW11dGV4X2luaXQoJmR2Yi0+bXV0ZXgpOwotCi0JZHZiLT5zdHJlYW1zID0gMDsKLQotCS8qIGF0dGFjaCB0aGUgZnJvbnRlbmQgKi8KLQlyZXQgPSB0bTYwMDBfZHZiX2F0dGFjaF9mcm9udGVuZChkZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhdHRhY2ggdGhlIGZyb250ZW5kIVxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIsICJUcmlkZW50IFRWTWFzdGVyIDYwMDAgRFZCLVQiLAotCQkJCQlUSElTX01PRFVMRSwgJmRldi0+dWRldi0+ZGV2LCBhZGFwdGVyX25yKTsKLQlkdmItPmFkYXB0ZXIucHJpdiA9IGRldjsKLQotCWlmIChkdmItPmZyb250ZW5kKSB7Ci0JCXN3aXRjaCAoZGV2LT50dW5lcl90eXBlKSB7Ci0JCWNhc2UgVFVORVJfWEMyMDI4OiB7Ci0JCQlzdHJ1Y3QgeGMyMDI4X2NvbmZpZyBjZmcgPSB7Ci0JCQkJLmkyY19hZGFwID0gJmRldi0+aTJjX2FkYXAsCi0JCQkJLmkyY19hZGRyID0gZGV2LT50dW5lcl9hZGRyLAotCQkJfTsKLQotCQkJZHZiLT5mcm9udGVuZC0+Y2FsbGJhY2sgPSB0bTYwMDBfdHVuZXJfY2FsbGJhY2s7Ci0JCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7Ci0JCQkJZ290byBhZGFwdGVyX2VycjsKLQkJCX0KLQotCQkJaWYgKCFkdmJfYXR0YWNoKHhjMjAyOF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZjZmcpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJ0bTYwMDA6IGNvdWxkbid0IHJlZ2lzdGVyICIKLQkJCQkJCSJmcm9udGVuZCAoeGMzMDI4KVxuIik7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyb250ZW5kX2VycjsKLQkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogWEMyMDI4LzMwMjggYXNrZWQgdG8gYmUgIgotCQkJCQkgImF0dGFjaGVkIHRvIGZyb250ZW5kIVxuIik7Ci0JCQlicmVhazsKLQkJCX0KLQkJY2FzZSBUVU5FUl9YQzUwMDA6IHsKLQkJCXN0cnVjdCB4YzUwMDBfY29uZmlnIGNmZyA9IHsKLQkJCQkuaTJjX2FkZHJlc3MgPSBkZXYtPnR1bmVyX2FkZHIsCi0JCQl9OwotCi0JCQlkdmItPmZyb250ZW5kLT5jYWxsYmFjayA9IHRtNjAwMF94YzUwMDBfY2FsbGJhY2s7Ci0JCQlyZXQgPSBkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmR2Yi0+YWRhcHRlciwgZHZiLT5mcm9udGVuZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciBmcm9udGVuZFxuIik7Ci0JCQkJZ290byBhZGFwdGVyX2VycjsKLQkJCX0KLQotCQkJaWYgKCFkdmJfYXR0YWNoKHhjNTAwMF9hdHRhY2gsIGR2Yi0+ZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLCAmY2ZnKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCByZWdpc3RlciAiCi0JCQkJCQkiZnJvbnRlbmQgKHhjNTAwMClcbiIpOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBmcm9udGVuZF9lcnI7Ci0JCQl9Ci0JCQlwcmludGsoS0VSTl9JTkZPICJ0bTYwMDA6IFhDNTAwMCBhc2tlZCB0byBiZSAiCi0JCQkJCSAiYXR0YWNoZWQgdG8gZnJvbnRlbmQhXG4iKTsKLQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBubyBmcm9udGVuZCBmb3VuZFxuIik7Ci0KLQlkdmItPmRlbXV4LmRteC5jYXBhYmlsaXRpZXMgPSBETVhfVFNfRklMVEVSSU5HIHwgRE1YX1NFQ1RJT05fRklMVEVSSU5HCi0JCQkJCQkJICAgIHwgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkc7Ci0JZHZiLT5kZW11eC5wcml2ID0gZGV2OwotCWR2Yi0+ZGVtdXguZmlsdGVybnVtID0gODsKLQlkdmItPmRlbXV4LmZlZWRudW0gPSA4OwotCWR2Yi0+ZGVtdXguc3RhcnRfZmVlZCA9IHRtNjAwMF9zdGFydF9mZWVkOwotCWR2Yi0+ZGVtdXguc3RvcF9mZWVkID0gdG02MDAwX3N0b3BfZmVlZDsKLQlkdmItPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwotCXJldCA9IGR2Yl9kbXhfaW5pdCgmZHZiLT5kZW11eCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJ0bTYwMDA6IGR2Yl9kbXhfaW5pdCBmYWlsZWQgKGVycm5vID0gJWQpXG4iLCByZXQpOwotCQlnb3RvIGZyb250ZW5kX2VycjsKLQl9Ci0KLQlkdmItPmRteGRldi5maWx0ZXJudW0gPSBkZXYtPmR2Yi0+ZGVtdXguZmlsdGVybnVtOwotCWR2Yi0+ZG14ZGV2LmRlbXV4ID0gJmRldi0+ZHZiLT5kZW11eC5kbXg7Ci0JZHZiLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKLQotCXJldCA9ICBkdmJfZG14ZGV2X2luaXQoJmR2Yi0+ZG14ZGV2LCAmZHZiLT5hZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoInRtNjAwMDogZHZiX2RteGRldl9pbml0IGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJldCk7Ci0JCWdvdG8gZHZiX2RteF9lcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWR2Yl9kbXhfZXJyOgotCWR2Yl9kbXhfcmVsZWFzZSgmZHZiLT5kZW11eCk7Ci1mcm9udGVuZF9lcnI6Ci0JaWYgKGR2Yi0+ZnJvbnRlbmQpIHsKLQkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZyb250ZW5kKTsKLQkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZHZiLT5mcm9udGVuZCk7Ci0JfQotYWRhcHRlcl9lcnI6Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZHZiLT5hZGFwdGVyKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHVucmVnaXN0ZXJfZHZiKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfZHZiICpkdmIgPSBkZXYtPmR2YjsKLQotCWlmIChkdmItPmJ1bGtfdXJiICE9IE5VTEwpIHsKLQkJc3RydWN0IHVyYiAqYnVsa191cmIgPSBkdmItPmJ1bGtfdXJiOwotCi0JCWtmcmVlKGJ1bGtfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCQlidWxrX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKLQkJdXNiX3VubGlua191cmIoYnVsa191cmIpOwotCQl1c2JfZnJlZV91cmIoYnVsa191cmIpOwotCX0KLQotLyoJbXV0ZXhfbG9jaygmdG02MDAwX2RyaXZlci5vcGVuX2Nsb3NlX211dGV4KTsgKi8KLQlpZiAoZHZiLT5mcm9udGVuZCkgewotCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZnJvbnRlbmQpOwotCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZyb250ZW5kKTsKLQl9Ci0KLQlkdmJfZG14ZGV2X3JlbGVhc2UoJmR2Yi0+ZG14ZGV2KTsKLQlkdmJfZG14X3JlbGVhc2UoJmR2Yi0+ZGVtdXgpOwotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7Ci0JbXV0ZXhfZGVzdHJveSgmZHZiLT5tdXRleCk7Ci0vKgltdXRleF91bmxvY2soJnRtNjAwMF9kcml2ZXIub3Blbl9jbG9zZV9tdXRleCk7ICovCi19Ci0KLXN0YXRpYyBpbnQgZHZiX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9kdmIgKmR2YjsKLQlpbnQgcmM7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWRldi0+Y2Fwcy5oYXNfZHZiKQotCQlyZXR1cm4gMDsKLQotCWR2YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bTYwMDBfZHZiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkdmIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRldi0+ZHZiID0gZHZiOwotCi0JcmMgPSByZWdpc3Rlcl9kdmIoZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCWtmcmVlKGR2Yik7Ci0JCWRldi0+ZHZiID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAwOwotCi0JaWYgKCFkZXYtPmNhcHMuaGFzX2R2YikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGV2LT5kdmIpIHsKLQkJdW5yZWdpc3Rlcl9kdmIoZGV2KTsKLQkJa2ZyZWUoZGV2LT5kdmIpOwotCQlkZXYtPmR2YiA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX29wcyBkdmJfb3BzID0gewotCS50eXBlCT0gVE02MDAwX0RWQiwKLQkubmFtZQk9ICJUTTYwMDAgZHZiIEV4dGVuc2lvbiIsCi0JLmluaXQJPSBkdmJfaW5pdCwKLQkuZmluaQk9IGR2Yl9maW5pLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdG02MDAwX2R2Yl9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKCZkdmJfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRtNjAwMF9kdmJfdW5yZWdpc3Rlcih2b2lkKQotewotCXRtNjAwMF91bnJlZ2lzdGVyX2V4dGVuc2lvbigmZHZiX29wcyk7Ci19Ci0KLW1vZHVsZV9pbml0KHRtNjAwMF9kdmJfcmVnaXN0ZXIpOwotbW9kdWxlX2V4aXQodG02MDAwX2R2Yl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjUxZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtaTJjLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNaWNoZWwgTHVkd2lnIDxtaWNoZWwubHVkd2lnQGdtYWlsLmNvbT4KLSAqCS0gRml4IFNNQnVzIFJlYWQgQnl0ZSBjb21tYW5kCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi0jaW5jbHVkZSAidG02MDAwLmgiCi0jaW5jbHVkZSAidG02MDAwLXJlZ3MuaCIKLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0jaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBpMmNfZGVidWc7Ci1tb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2kyY10iKTsKLQotI2RlZmluZSBpMmNfZHByaW50ayhsdmwsIGZtdCwgYXJncy4uLikgaWYgKGkyY19kZWJ1ZyA+PSBsdmwpIGRvIHsgXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGF0ICVzOiAiIGZtdCwgXAotCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXywgIyNhcmdzKTsgfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCB0bTYwMDBfaTJjX3NlbmRfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAotCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IHJjOwotCXVuc2lnbmVkIGludCB0c2xlZXA7Ci0JdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJaTJjX3BhY2tldF9saW1pdCA9IDY0OwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtMTsKLQotCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAotCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKLQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCi0JCWFkZHIgfCByZWcgPDwgOCwgMCwgYnVmLCBsZW4pOwotCi0JaWYgKHJjIDwgMCkgewotCQkvKiByZWxlYXNlIG11dGV4ICovCi0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgZGVsYXkgdGltZSwgMTQwMDB1cyBmb3IgNjQgYnl0ZXMgKi8KLQl0c2xlZXAgPSAoKGxlbiAqIDIwMCkgKyAyMDAgKyAxMDAwKSAvIDEwMDA7Ci0JbXNsZWVwKHRzbGVlcCk7Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi0vKiBHZW5lcmljIHJlYWQgLSBkb2Vzbid0IHdvcmsgZmluZSB3aXRoIDE2Yml0IHJlZ2lzdGVycyAqLwotc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVncyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyLAotCQkJCV9fdTggcmVnLCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IHJjOwotCXU4IGJbMl07Ci0JdW5zaWduZWQgaW50IGkyY19wYWNrZXRfbGltaXQgPSAxNjsKLQotCWlmIChkZXYtPmRldl90eXBlID09IFRNNjAxMCkKLQkJaTJjX3BhY2tldF9saW1pdCA9IDY0OwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtMTsKLQotCWlmIChsZW4gPCAxIHx8IGxlbiA+IGkyY19wYWNrZXRfbGltaXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgbGVuZ3RoIG9mIGkyYyBwYWNrZXQgPSAlZCwgbGltaXQgc2V0IHRvICVkXG4iLAotCQkJbGVuLCBpMmNfcGFja2V0X2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlpZiAoKGRldi0+Y2Fwcy5oYXNfemwxMDM1MykgJiYgKGRldi0+ZGVtb2RfYWRkciA8PCAxID09IGFkZHIpICYmIChyZWcgJSAyID09IDApKSB7Ci0JCS8qCi0JCSAqIFdvcmthcm91bmQgYW4gSTJDIGJ1ZyB3aGVuIHJlYWRpbmcgZnJvbSB6bDEwMzUzCi0JCSAqLwotCQlyZWcgLT0gMTsKLQkJbGVuICs9IDE7Ci0KLQkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGIsIGxlbik7Ci0KLQkJKmJ1ZiA9IGJbMV07Ci0JfSBlbHNlIHsKLQkJcmMgPSB0bTYwMDBfcmVhZF93cml0ZV91c2IoZGV2LCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCVJFUV8xNl9TRVRfR0VUX0kyQ19XUjFfUkROLCBhZGRyIHwgcmVnIDw8IDgsIDAsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogcmVhZCBmcm9tIGEgMTZiaXQgcmVnaXN0ZXIKLSAqIGZvciBleGFtcGxlIHhjMjAyOCwgeGMzMDI4IG9yIHhjMzAyOEwKLSAqLwotc3RhdGljIGludCB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHIsCi0JCQkJICBfX3UxNiByZWcsIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgcmM7Ci0JdW5zaWduZWQgY2hhciB1cmVnOwotCi0JaWYgKCFidWYgfHwgbGVuICE9IDIpCi0JCXJldHVybiAtMTsKLQotCS8qIGNhcHR1cmUgbXV0ZXggKi8KLQlpZiAoZGV2LT5kZXZfdHlwZSA9PSBUTTYwMTApIHsKLQkJdXJlZyA9IHJlZyAmIDB4RkY7Ci0JCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4sCi0JCQlhZGRyIHwgKHJlZyAmIDB4RkYwMCksIDAsICZ1cmVnLCAxKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQkvKiByZWxlYXNlIG11dGV4ICovCi0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQltc2xlZXAoMTQwMCAvIDEwMDApOwotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQsCi0JCQlyZWcsIDAsIGJ1ZiwgbGVuKTsKLQl9IGVsc2UgewotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfAotCQkJVVNCX1JFQ0lQX0RFVklDRSwgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4sCi0JCQlhZGRyLCByZWcsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQkvKiByZWxlYXNlIG11dGV4ICovCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAotCQkJICAgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKLQlpbnQgYWRkciwgcmMsIGksIGJ5dGU7Ci0KLQlpZiAobnVtIDw9IDApCi0JCXJldHVybiAwOwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlhZGRyID0gKG1zZ3NbaV0uYWRkciA8PCAxKSAmIDB4ZmY7Ci0JCWkyY19kcHJpbnRrKDIsICIlcyAlcyBhZGRyPTB4JXggbGVuPSVkOiIsCi0JCQkgKG1zZ3NbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgPyAicmVhZCIgOiAid3JpdGUiLAotCQkJIGkgPT0gbnVtIC0gMSA/ICJzdG9wIiA6ICJub25zdG9wIiwgYWRkciwgbXNnc1tpXS5sZW4pOwotCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7Ci0JCQkvKiByZWFkIHJlcXVlc3Qgd2l0aG91dCBwcmVjZWRpbmcgcmVnaXN0ZXIgc2VsZWN0aW9uICovCi0JCQkvKgotCQkJICogVGhlIFRNNjAwMCBvbmx5IHN1cHBvcnRzIGEgcmVhZCB0cmFuc2FjdGlvbgotCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYSAxIG9yIDIgYnl0ZSB3cml0ZSB0byBzZWxlY3QKLQkJCSAqIGEgcmVnaXN0ZXIuICBXZSBjYW5ub3QgZnVsZmlsIHRoaXMgcmVxdWVzdC4KLQkJCSAqLwotCQkJaTJjX2RwcmludGsoMiwgIiByZWFkIHdpdGhvdXQgcHJlY2VkaW5nIHdyaXRlIG5vdCIKLQkJCQkgICAgICAgIiBzdXBwb3J0ZWQiKTsKLQkJCXJjID0gLUVPUE5PVFNVUFA7Ci0JCQlnb3RvIGVycjsKLQkJfSBlbHNlIGlmIChpICsgMSA8IG51bSAmJiBtc2dzW2ldLmxlbiA8PSAyICYmCi0JCQkgICAobXNnc1tpICsgMV0uZmxhZ3MgJiBJMkNfTV9SRCkgJiYKLQkJCSAgIG1zZ3NbaV0uYWRkciA9PSBtc2dzW2kgKyAxXS5hZGRyKSB7Ci0JCQkvKiAxIG9yIDIgYnl0ZSB3cml0ZSBmb2xsb3dlZCBieSBhIHJlYWQgKi8KLQkJCWlmIChpMmNfZGVidWcgPj0gMikKLQkJCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbXNnc1tpXS5sZW47IGJ5dGUrKykKLQkJCQkJcHJpbnRrKCIgJTAyeCIsIG1zZ3NbaV0uYnVmW2J5dGVdKTsKLQkJCWkyY19kcHJpbnRrKDIsICI7IGpvaW5lZCB0byByZWFkICVzIGxlbj0lZDoiLAotCQkJCSAgICBpID09IG51bSAtIDIgPyAic3RvcCIgOiAibm9uc3RvcCIsCi0JCQkJICAgIG1zZ3NbaSArIDFdLmxlbik7Ci0KLQkJCWlmIChtc2dzW2ldLmxlbiA9PSAyKSB7Ci0JCQkJcmMgPSB0bTYwMDBfaTJjX3JlY3ZfcmVnczE2KGRldiwgYWRkciwKLQkJCQkJbXNnc1tpXS5idWZbMF0gPDwgOCB8IG1zZ3NbaV0uYnVmWzFdLAotCQkJCQltc2dzW2kgKyAxXS5idWYsIG1zZ3NbaSArIDFdLmxlbik7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gdG02MDAwX2kyY19yZWN2X3JlZ3MoZGV2LCBhZGRyLCBtc2dzW2ldLmJ1ZlswXSwKLQkJCQkJbXNnc1tpICsgMV0uYnVmLCBtc2dzW2kgKyAxXS5sZW4pOwotCQkJfQotCi0JCQlpKys7Ci0KLQkJCWlmIChhZGRyID09IGRldi0+dHVuZXJfYWRkciA8PCAxKSB7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV81MV9TRVRfU1RPUCwgMCwgMCk7Ci0JCQl9Ci0JCQlpZiAoaTJjX2RlYnVnID49IDIpCi0JCQkJZm9yIChieXRlID0gMDsgYnl0ZSA8IG1zZ3NbaV0ubGVuOyBieXRlKyspCi0JCQkJCXByaW50aygiICUwMngiLCBtc2dzW2ldLmJ1ZltieXRlXSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB3cml0ZSBieXRlcyAqLwotCQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQotCQkJCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBtc2dzW2ldLmxlbjsgYnl0ZSsrKQotCQkJCQlwcmludGsoIiAlMDJ4IiwgbXNnc1tpXS5idWZbYnl0ZV0pOwotCQkJcmMgPSB0bTYwMDBfaTJjX3NlbmRfcmVncyhkZXYsIGFkZHIsIG1zZ3NbaV0uYnVmWzBdLAotCQkJCW1zZ3NbaV0uYnVmICsgMSwgbXNnc1tpXS5sZW4gLSAxKTsKLQotCQkJaWYgKGFkZHIgPT0gZGV2LT50dW5lcl9hZGRyICA8PCAxKSB7Ci0JCQkJdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfNTBfU0VUX1NUQVJULCAwLCAwKTsKLQkJCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFJFUV81MV9TRVRfU1RPUCwgMCwgMCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkyY19kZWJ1ZyA+PSAyKQotCQkJcHJpbnRrKCJcbiIpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIG51bTsKLWVycjoKLQlpMmNfZHByaW50aygyLCAiIEVSUk9SOiAlaVxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfaTJjX2VlcHJvbShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpbnQgaSwgcmM7Ci0JdW5zaWduZWQgY2hhciAqcCA9IGRldi0+ZWVkYXRhOwotCXVuc2lnbmVkIGNoYXIgYnl0ZXNbMTddOwotCi0JZGV2LT5pMmNfY2xpZW50LmFkZHIgPSAweGEwID4+IDE7Ci0JZGV2LT5lZWRhdGFfc2l6ZSA9IDA7Ci0KLQlieXRlc1sxNl0gPSAnXDAnOwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGV2LT5lZWRhdGEpOyApIHsKLQkJKnAgPSBpOwotCQlyYyA9IHRtNjAwMF9pMmNfcmVjdl9yZWdzKGRldiwgMHhhMCwgaSwgcCwgMSk7Ci0JCWlmIChyYyA8IDEpIHsKLQkJCWlmIChwID09IGRldi0+ZWVkYXRhKQotCQkJCWdvdG8gbm9lZXByb207Ci0JCQllbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJIiVzOiBpMmMgZWVwcm9tIHJlYWQgZXJyb3IgKGVycj0lZClcbiIsCi0JCQkJZGV2LT5uYW1lLCByYyk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZXYtPmVlZGF0YV9zaXplKys7Ci0JCXArKzsKLQkJaWYgKDAgPT0gKGkgJSAxNikpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogaTJjIGVlcHJvbSAlMDJ4OiIsIGRldi0+bmFtZSwgaSk7Ci0JCXByaW50aygiICUwMngiLCBkZXYtPmVlZGF0YVtpXSk7Ci0JCWlmICgoZGV2LT5lZWRhdGFbaV0gPj0gJyAnKSAmJiAoZGV2LT5lZWRhdGFbaV0gPD0gJ3onKSkKLQkJCWJ5dGVzW2klMTZdID0gZGV2LT5lZWRhdGFbaV07Ci0JCWVsc2UKLQkJCWJ5dGVzW2klMTZdID0gJy4nOwotCi0JCWkrKzsKLQotCQlpZiAoMCA9PSAoaSAlIDE2KSkgewotCQkJYnl0ZXNbMTZdID0gJ1wwJzsKLQkJCXByaW50aygiICAlc1xuIiwgYnl0ZXMpOwotCQl9Ci0JfQotCWlmICgwICE9IChpJTE2KSkgewotCQlieXRlc1tpJTE2XSA9ICdcMCc7Ci0JCWZvciAoaSAlPSAxNjsgaSA8IDE2OyBpKyspCi0JCQlwcmludGsoIiAgICIpOwotCQlwcmludGsoIiAgJXNcbiIsIGJ5dGVzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotbm9lZXByb206Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEh1aCwgbm8gZWVwcm9tIHByZXNlbnQgKGVycj0lZCk/XG4iLAotCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIGZ1bmN0aW9uYWxpdHkoKQotICovCi1zdGF0aWMgdTMyIGZ1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gdG02MDAwX2FsZ28gPSB7Ci0JLm1hc3Rlcl94ZmVyICAgPSB0bTYwMDBfaTJjX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkgPSBmdW5jdGlvbmFsaXR5LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIHRtNjAwMF9pMmNfcmVnaXN0ZXIoKQotICogcmVnaXN0ZXIgaTJjIGJ1cwotICovCi1pbnQgdG02MDAwX2kyY19yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpbnQgcmM7Ci0KLQlkZXYtPmkyY19hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JZGV2LT5pMmNfYWRhcC5hbGdvID0gJnRtNjAwMF9hbGdvOwotCWRldi0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKLQlzdHJsY3B5KGRldi0+aTJjX2FkYXAubmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5pMmNfYWRhcC5uYW1lKSk7Ci0JZGV2LT5pMmNfYWRhcC5hbGdvX2RhdGEgPSBkZXY7Ci0JaTJjX3NldF9hZGFwZGF0YSgmZGV2LT5pMmNfYWRhcCwgJmRldi0+djRsMl9kZXYpOwotCXJjID0gaTJjX2FkZF9hZGFwdGVyKCZkZXYtPmkyY19hZGFwKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWRldi0+aTJjX2NsaWVudC5hZGFwdGVyID0gJmRldi0+aTJjX2FkYXA7Ci0Jc3RybGNweShkZXYtPmkyY19jbGllbnQubmFtZSwgInRtNjAwMCBpbnRlcm5hbCIsIEkyQ19OQU1FX1NJWkUpOwotCXRtNjAwMF9pMmNfZWVwcm9tKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHRtNjAwMF9pMmNfdW5yZWdpc3RlcigpCi0gKiB1bnJlZ2lzdGVyIGkyY19idXMKLSAqLwotaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlpMmNfZGVsX2FkYXB0ZXIoJmRldi0+aTJjX2FkYXApOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWlucHV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTJjNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtaW5wdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKgotICogIHRtNjAwMC1pbnB1dC5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBTdGVmYW4gUmluZ2VsIDxzdGVmYW4ucmluZ2VsQGFyY29yLmRlPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9yYy1jb3JlLmg+Ci0KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlyX2RlYnVnOwotbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlIFtJUl0iKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfaXIgPSAxOwotbW9kdWxlX3BhcmFtKGVuYWJsZV9pciwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2lyLCAiZW5hYmxlIGlyIChkZWZhdWx0IGlzIGVuYWJsZSkiKTsKLQotLyogbnVtYmVyIG9mIDUwbXMgZm9yIE9OLU9GRi1PTiBwb3dlciBsZWQgKi8KLS8qIHNob3cgSVIgYWN0aXZpdHkgKi8KLSNkZWZpbmUgUFdMRURfT0ZGIDIKLQotI3VuZGVmIGRwcmludGsKLQotI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKSBcCi0JaWYgKGlyX2RlYnVnKSB7IFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2lyOiAiIGZtdCwgaXItPm5hbWUgLCAjIyBhcmcpOyBcCi0JfQotCi1zdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHsKLQl1MTYgcmNfZGF0YTsKLX07Ci0KLXN0cnVjdCB0bTYwMDBfSVIgewotCXN0cnVjdCB0bTYwMDBfY29yZQkqZGV2OwotCXN0cnVjdCByY19kZXYJCSpyYzsKLQljaGFyCQkJbmFtZVszMl07Ci0JY2hhcgkJCXBoeXNbMzJdOwotCi0JLyogcG9sbCBleHBlcm5hbCBkZWNvZGVyICovCi0JaW50CQkJcG9sbGluZzsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXdvcms7Ci0JdTgJCQl3YWl0OjE7Ci0JdTgJCQlrZXk6MTsKLQl1OAkJCXB3bGVkOjE7Ci0JdTgJCQlwd2xlZGNudDsKLQl1MTYJCQlrZXlfYWRkcjsKLQlzdHJ1Y3QgdXJiCQkqaW50X3VyYjsKLQl1OAkJCSp1cmJfZGF0YTsKLQotCWludCAoKmdldF9rZXkpIChzdHJ1Y3QgdG02MDAwX0lSICosIHN0cnVjdCB0bTYwMDBfaXJfcG9sbF9yZXN1bHQgKik7Ci0KLQkvKiBJUiBkZXZpY2UgcHJvcGVydGllcyAqLwotCXU2NAkJCXJjX3R5cGU7Ci19OwotCi0KLXZvaWQgdG02MDAwX2lyX3dhaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IHN0YXRlKQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKLQotCWlmICghZGV2LT5pcikKLQkJcmV0dXJuOwotCi0JaWYgKHN0YXRlKQotCQlpci0+d2FpdCA9IDE7Ci0JZWxzZQotCQlpci0+d2FpdCA9IDA7Ci19Ci0KLQotc3RhdGljIGludCB0bTYwMDBfaXJfY29uZmlnKHN0cnVjdCB0bTYwMDBfSVIgKmlyKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gaXItPmRldjsKLQl1OCBidWZbMTBdOwotCWludCByYzsKLQotCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKLQljYXNlIFJDX1RZUEVfTkVDOgotCQkvKiBTZXR1cCBJUiBkZWNvZGVyIGZvciBORUMgc3RhbmRhcmQgMTJNSHogc3lzdGVtIGNsb2NrICovCi0JCS8qIElSX0xFQURFUl9DTlQgPSAwLjltcyAgICAgICAgICAgICAqLwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMSwgMHhhYSk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9MRUFERVIwLCAweDMwKTsKLQkJLyogSVJfUFVMU0VfQ05UID0gMC43bXMgICAgICAgICAgICAgICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxLCAweDIwKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1BVTFNFX0NOVDAsIDB4ZDApOwotCQkvKiBSZW1vdGUgV0FLRVVQID0gZW5hYmxlICovCi0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQLCAweGZlKTsKLQkJLyogSVJfV0tVUF9TRUwgPSBMb3cgYnl0ZSBpbiBkZWNvZGVkIElSIGRhdGEgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwsIDB4ZmYpOwotCQkvKiBJUl9XS1VfQUREIGNvZGUgKi8KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9BREQsIDB4ZmYpOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7Ci0JCW1zbGVlcCgxMDApOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGhhY2sgKi8KLQkJYnVmWzBdID0gMHhmZjsKLQkJYnVmWzFdID0gMHhmZjsKLQkJYnVmWzJdID0gMHhmMjsKLQkJYnVmWzNdID0gMHgyYjsKLQkJYnVmWzRdID0gMHgyMDsKLQkJYnVmWzVdID0gMHgzNTsKLQkJYnVmWzZdID0gMHg2MDsKLQkJYnVmWzddID0gMHgwNDsKLQkJYnVmWzhdID0gMHhjMDsKLQkJYnVmWzldID0gMHgwODsKLQotCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKLQkJCVVTQl9SRUNJUF9ERVZJQ0UsIFJFUV8wMF9TRVRfSVJfVkFMVUUsIDAsIDAsIGJ1ZiwgMHgwYSk7Ci0JCW1zbGVlcCgxMDApOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIklSIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRtNjAwMF9pcl91cmJfcmVjZWl2ZWQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gZGV2LT5pcjsKLQlpbnQgcmM7Ci0KLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibm90IHJlYWR5XG4iKTsKLQllbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7Ci0JCW1lbWNweShpci0+dXJiX2RhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCi0JCWRwcmludGsoImRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgaXItPnVyYl9kYXRhWzBdLAotCQkJaXItPnVyYl9kYXRhWzFdLCBpci0+dXJiX2RhdGFbMl0sIGlyLT51cmJfZGF0YVszXSk7Ci0KLQkJaXItPmtleSA9IDE7Ci0JfQotCi0JcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotfQotCi1zdGF0aWMgaW50IGRlZmF1bHRfcG9sbGluZ19nZXRrZXkoc3RydWN0IHRtNjAwMF9JUiAqaXIsCi0JCQkJc3RydWN0IHRtNjAwMF9pcl9wb2xsX3Jlc3VsdCAqcG9sbF9yZXN1bHQpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBpci0+ZGV2OwotCWludCByYzsKLQl1OCBidWZbMl07Ci0KLQlpZiAoaXItPndhaXQgJiYgISZkZXYtPmludF9pbikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoJmRldi0+aW50X2luKSB7Ci0JCXN3aXRjaCAoaXItPnJjX3R5cGUpIHsKLQkJY2FzZSBSQ19UWVBFX1JDNToKLQkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkNfVFlQRV9ORUM6Ci0JCQlpZiAoaXItPnVyYl9kYXRhWzFdID09ICgoaXItPmtleV9hZGRyID4+IDgpICYgMHhmZikpIHsKLQkJCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGlyLT51cmJfZGF0YVswXQotCQkJCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBvbGxfcmVzdWx0LT5yY19kYXRhID0gaXItPnVyYl9kYXRhWzBdCi0JCQkJCXwgaXItPnVyYl9kYXRhWzFdIDw8IDg7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMCk7Ci0JCW1zbGVlcCgxMCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA0X0VOX0RJU0FCTEVfTUNVX0lOVCwgMiwgMSk7Ci0JCW1zbGVlcCgxMCk7Ci0KLQkJaWYgKGlyLT5yY190eXBlID09IFJDX1RZUEVfUkM1KSB7Ci0JCQlyYyA9IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihkZXYsIFVTQl9ESVJfSU4gfAotCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkJUkVRXzAyX0dFVF9JUl9DT0RFLCAwLCAwLCBidWYsIDEpOwotCi0JCQltc2xlZXAoMTApOwotCi0JCQlkcHJpbnRrKCJyZWFkIGRhdGE9JTAyeFxuIiwgYnVmWzBdKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlwb2xsX3Jlc3VsdC0+cmNfZGF0YSA9IGJ1ZlswXTsKLQkJfSBlbHNlIHsKLQkJCXJjID0gdG02MDAwX3JlYWRfd3JpdGVfdXNiKGRldiwgVVNCX0RJUl9JTiB8Ci0JCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCQlSRVFfMDJfR0VUX0lSX0NPREUsIDAsIDAsIGJ1ZiwgMik7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCWRwcmludGsoInJlYWQgZGF0YT0lMDR4XG4iLCBidWZbMF0gfCBidWZbMV0gPDwgOCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcG9sbF9yZXN1bHQtPnJjX2RhdGEgPSBidWZbMF0gfCBidWZbMV0gPDwgODsKLQkJfQotCQlpZiAoKHBvbGxfcmVzdWx0LT5yY19kYXRhICYgMHgwMGZmKSAhPSAweGZmKQotCQkJaXItPmtleSA9IDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0bTYwMDBfaXJfaGFuZGxlX2tleShzdHJ1Y3QgdG02MDAwX0lSICppcikKLXsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGlyLT5kZXY7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgdG02MDAwX2lyX3BvbGxfcmVzdWx0IHBvbGxfcmVzdWx0OwotCi0JLyogcmVhZCB0aGUgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgdGhlIElSIHN0YXR1cyAqLwotCXJlc3VsdCA9IGlyLT5nZXRfa2V5KGlyLCAmcG9sbF9yZXN1bHQpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImlyLT5nZXRfa2V5KCkgZmFpbGVkICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm47Ci0JfQotCi0JZHByaW50aygiaXItPmdldF9rZXkgcmVzdWx0IGRhdGE9JTA0eFxuIiwgcG9sbF9yZXN1bHQucmNfZGF0YSk7Ci0KLQlpZiAoaXItPnB3bGVkKSB7Ci0JCWlmIChpci0+cHdsZWRjbnQgPj0gUFdMRURfT0ZGKSB7Ci0JCQlpci0+cHdsZWQgPSAwOwotCQkJaXItPnB3bGVkY250ID0gMDsKLQkJCXRtNjAwMF9mbGFzaF9sZWQoZGV2LCAxKTsKLQkJfSBlbHNlCi0JCQlpci0+cHdsZWRjbnQgKz0gMTsKLQl9Ci0KLQlpZiAoaXItPmtleSkgewotCQlyY19rZXlkb3duKGlyLT5yYywgcG9sbF9yZXN1bHQucmNfZGF0YSwgMCk7Ci0JCWlyLT5rZXkgPSAwOwotCQlpci0+cHdsZWQgPSAxOwotCQlpci0+cHdsZWRjbnQgPSAwOwotCQl0bTYwMDBfZmxhc2hfbGVkKGRldiwgMCk7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX2lyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bTYwMDBfSVIsIHdvcmsud29yayk7Ci0KLQl0bTYwMDBfaXJfaGFuZGxlX2tleShpcik7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgbXNlY3NfdG9famlmZmllcyhpci0+cG9sbGluZykpOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9pcl9zdGFydChzdHJ1Y3QgcmNfZGV2ICpyYykKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IHJjLT5wcml2OwotCi0JSU5JVF9ERUxBWUVEX1dPUksoJmlyLT53b3JrLCB0bTYwMDBfaXJfd29yayk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpci0+d29yaywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdG02MDAwX2lyX3N0b3Aoc3RydWN0IHJjX2RldiAqcmMpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaXItPndvcmspOwotfQotCi1pbnQgdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChzdHJ1Y3QgcmNfZGV2ICpyYywgdTY0IHJjX3R5cGUpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSByYy0+cHJpdjsKLQotCWlmICghaXIpCi0JCXJldHVybiAwOwotCi0JaWYgKChyYy0+cmNfbWFwLnNjYW4pICYmIChyY190eXBlID09IFJDX1RZUEVfTkVDKSkKLQkJaXItPmtleV9hZGRyID0gKChyYy0+cmNfbWFwLnNjYW5bMF0uc2NhbmNvZGUgPj4gOCkgJiAweGZmZmYpOwotCi0JaXItPmdldF9rZXkgPSBkZWZhdWx0X3BvbGxpbmdfZ2V0a2V5OwotCWlyLT5yY190eXBlID0gcmNfdHlwZTsKLQotCXRtNjAwMF9pcl9jb25maWcoaXIpOwotCS8qIFRPRE8gKi8KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHRtNjAwMF9JUiAqaXIgPSBkZXYtPmlyOwotCWludCBwaXBlLCBzaXplOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0KLQlpZiAoIWlyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlyLT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlyLT5pbnRfdXJiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCi0JCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcwotCQkmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7Ci0KLQlzaXplID0gdXNiX21heHBhY2tldChkZXYtPnVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKLQlkcHJpbnRrKCJJUiBtYXggc2l6ZTogJWRcbiIsIHNpemUpOwotCi0JaXItPmludF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewotCQl1c2JfZnJlZV91cmIoaXItPmludF91cmIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlkcHJpbnRrKCJpbnQgaW50ZXJ2YWw6ICVkXG4iLCBkZXYtPmludF9pbi5lbmRwLT5kZXNjLmJJbnRlcnZhbCk7Ci0JdXNiX2ZpbGxfaW50X3VyYihpci0+aW50X3VyYiwgZGV2LT51ZGV2LCBwaXBlLAotCQlpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBzaXplLAotCQl0bTYwMDBfaXJfdXJiX3JlY2VpdmVkLCBkZXYsCi0JCWRldi0+aW50X2luLmVuZHAtPmRlc2MuYkludGVydmFsKTsKLQllcnIgPSB1c2Jfc3VibWl0X3VyYihpci0+aW50X3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVycikgewotCQlrZnJlZShpci0+aW50X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJdXNiX2ZyZWVfdXJiKGlyLT5pbnRfdXJiKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JaXItPnVyYl9kYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHRtNjAwMF9pcl9pbnRfc3RvcChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7Ci0KLQlpZiAoIWlyKQotCQlyZXR1cm47Ci0KLQl1c2Jfa2lsbF91cmIoaXItPmludF91cmIpOwotCWtmcmVlKGlyLT5pbnRfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCXVzYl9mcmVlX3VyYihpci0+aW50X3VyYik7Ci0JaXItPmludF91cmIgPSBOVUxMOwotCWtmcmVlKGlyLT51cmJfZGF0YSk7Ci0JaXItPnVyYl9kYXRhID0gTlVMTDsKLX0KLQotaW50IHRtNjAwMF9pcl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXN0cnVjdCB0bTYwMDBfSVIgKmlyOwotCXN0cnVjdCByY19kZXYgKnJjOwotCWludCBlcnIgPSAtRU5PTUVNOwotCi0JaWYgKCFlbmFibGVfaXIpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFkZXYtPmNhcHMuaGFzX3JlbW90ZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWRldi0+aXJfY29kZXMpCi0JCXJldHVybiAwOwotCi0JaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKLQlyYyA9IHJjX2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaXIgfHwgIXJjKQotCQlnb3RvIG91dDsKLQotCS8qIHJlY29yZCBoYW5kbGVzIHRvIG91cnNlbGYgKi8KLQlpci0+ZGV2ID0gZGV2OwotCWRldi0+aXIgPSBpcjsKLQlpci0+cmMgPSByYzsKLQotCS8qIGlucHV0IGVpbnJpY2h0ZW4gKi8KLQlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX1JDNSB8IFJDX1RZUEVfTkVDOwotCXJjLT5wcml2ID0gaXI7Ci0JcmMtPmNoYW5nZV9wcm90b2NvbCA9IHRtNjAwMF9pcl9jaGFuZ2VfcHJvdG9jb2w7Ci0JcmMtPm9wZW4gPSB0bTYwMDBfaXJfc3RhcnQ7Ci0JcmMtPmNsb3NlID0gdG02MDAwX2lyX3N0b3A7Ci0JcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX1NDQU5DT0RFOwotCi0JaXItPnBvbGxpbmcgPSA1MDsKLQlpci0+cHdsZWQgPSAwOwotCWlyLT5wd2xlZGNudCA9IDA7Ci0KLQotCXNucHJpbnRmKGlyLT5uYW1lLCBzaXplb2YoaXItPm5hbWUpLCAidG01NjAwLzYweDAgSVIgKCVzKSIsCi0JCQkJCQlkZXYtPm5hbWUpOwotCi0JdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpKTsKLQlzdHJsY2F0KGlyLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihpci0+cGh5cykpOwotCi0JdG02MDAwX2lyX2NoYW5nZV9wcm90b2NvbChyYywgUkNfVFlQRV9VTktOT1dOKTsKLQotCXJjLT5pbnB1dF9uYW1lID0gaXItPm5hbWU7Ci0JcmMtPmlucHV0X3BoeXMgPSBpci0+cGh5czsKLQlyYy0+aW5wdXRfaWQuYnVzdHlwZSA9IEJVU19VU0I7Ci0JcmMtPmlucHV0X2lkLnZlcnNpb24gPSAxOwotCXJjLT5pbnB1dF9pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCXJjLT5pbnB1dF9pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JcmMtPm1hcF9uYW1lID0gZGV2LT5pcl9jb2RlczsKLQlyYy0+ZHJpdmVyX25hbWUgPSAidG02MDAwIjsKLQlyYy0+ZGV2LnBhcmVudCA9ICZkZXYtPnVkZXYtPmRldjsKLQotCWlmICgmZGV2LT5pbnRfaW4pIHsKLQkJZHByaW50aygiSVIgb3ZlciBpbnRcbiIpOwotCi0JCWVyciA9IHRtNjAwMF9pcl9pbnRfc3RhcnQoZGV2KTsKLQotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyogaXIgcmVnaXN0ZXIgKi8KLQllcnIgPSByY19yZWdpc3Rlcl9kZXZpY2UocmMpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JcmV0dXJuIDA7Ci0KLW91dDoKLQlkZXYtPmlyID0gTlVMTDsKLQlyY19mcmVlX2RldmljZShyYyk7Ci0Ja2ZyZWUoaXIpOwotCXJldHVybiBlcnI7Ci19Ci0KLWludCB0bTYwMDBfaXJfZmluaShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX0lSICppciA9IGRldi0+aXI7Ci0KLQkvKiBza2lwIGRldGFjaCBvbiBub24gYXR0YWNoZWQgYm9hcmQgKi8KLQotCWlmICghaXIpCi0JCXJldHVybiAwOwotCi0JcmNfdW5yZWdpc3Rlcl9kZXZpY2UoaXItPnJjKTsKLQotCWlmIChpci0+aW50X3VyYikKLQkJdG02MDAwX2lyX2ludF9zdG9wKGRldik7Ci0KLQlrZnJlZShpcik7Ci0JZGV2LT5pciA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXJlZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXJlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3NWE4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtcmVncy5oIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLS8qCi0gKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFJlcXVlc3QgY29kZXMKLSAqLwotI2RlZmluZSBSRVFfMDBfU0VUX0lSX1ZBTFVFCQkwCi0jZGVmaW5lIFJFUV8wMV9TRVRfV0FLRVVQX0lSQ09ERQkxCi0jZGVmaW5lIFJFUV8wMl9HRVRfSVJfQ09ERQkJMgotI2RlZmluZSBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOCQkzCi0jZGVmaW5lIFJFUV8wNF9FTl9ESVNBQkxFX01DVV9JTlQJNAotI2RlZmluZSBSRVFfMDVfU0VUX0dFVF9VU0JSRUcJCTUKLQkvKiBXcml0ZTogUmVnTnVtLCBWYWx1ZSwgMCAqLwotCS8qIFJlYWQgOiBSZWdOdW0sIFZhbHVlLCAxLCBSZWdTdGF0dXMgKi8KLSNkZWZpbmUgUkVRXzA2X1NFVF9HRVRfVVNCUkVHX0JJVAk2Ci0jZGVmaW5lIFJFUV8wN19TRVRfR0VUX0FWUkVHCQk3Ci0JLyogV3JpdGU6IFJlZ051bSwgVmFsdWUsIDAgKi8KLQkvKiBSZWFkIDogUmVnTnVtLCBWYWx1ZSwgMSwgUmVnU3RhdHVzICovCi0jZGVmaW5lIFJFUV8wOF9TRVRfR0VUX0FWUkVHX0JJVAk4Ci0jZGVmaW5lIFJFUV8wOV9TRVRfR0VUX1RVTkVSX0ZRCQk5Ci0jZGVmaW5lIFJFUV8xMF9TRVRfVFVORVJfU1lTVEVNCQkxMAotI2RlZmluZSBSRVFfMTFfU0VUX0VFUFJPTV9BRERSCQkxMQotI2RlZmluZSBSRVFfMTJfU0VUX0dFVF9FRVBST01CWVRFCTEyCi0jZGVmaW5lIFJFUV8xM19HRVRfRUVQUk9NX1NFUVJFQUQJMTMKLSNkZWZpbmUgUkVRXzE0X1NFVF9HRVRfSTJDX1dSMl9SRE4JMTQKLSNkZWZpbmUgUkVRXzE1X1NFVF9HRVRfSTJDQllURQkJMTUKLQkvKiBXcml0ZTogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDAgKi8KLQkvKiBSZWFkIDogU3ViYWRkciwgU2xhdmUgQWRkciwgdmFsdWUsIDEgKi8KLSNkZWZpbmUgUkVRXzE2X1NFVF9HRVRfSTJDX1dSMV9SRE4JMTYKLQkvKiBTdWJhZGRyLCBTbGF2ZSBBZGRyLCAwLCBsZW5ndGggKi8KLSNkZWZpbmUgUkVRXzE3X1NFVF9HRVRfSTJDRlAJCTE3Ci0JLyogV3JpdGU6IFNsYXZlIEFkZHIsIHJlZ2lzdGVyLCB2YWx1ZSAqLwotCS8qIFJlYWQgOiBTbGF2ZSBBZGRyLCByZWdpc3RlciwgMiwgZGF0YSAqLwotI2RlZmluZSBSRVFfMjBfREFUQV9UUkFOU0ZFUgkJMjAKLSNkZWZpbmUgUkVRXzMwX0kyQ19XUklURQkJMzAKLSNkZWZpbmUgUkVRXzMxX0kyQ19SRUFECQkJMzEKLSNkZWZpbmUgUkVRXzM1X0FGVEVLX1RVTkVSX1JFQUQJCTM1Ci0jZGVmaW5lIFJFUV80MF9HRVRfVkVSU0lPTgkJNDAKLSNkZWZpbmUgUkVRXzUwX1NFVF9TVEFSVAkJNTAKLSNkZWZpbmUgUkVRXzUxX1NFVF9TVE9QCQkJNTEKLSNkZWZpbmUgUkVRXzUyX1RSQU5TTUlUX0RBVEEJCTUyCi0jZGVmaW5lIFJFUV81M19TUElfSU5JVElBTAkJNTMKLSNkZWZpbmUgUkVRXzU0X1NQSV9TRVRTVEFSVAkJNTQKLSNkZWZpbmUgUkVRXzU1X1NQSV9JTk9VVERBVEEJCTU1Ci0jZGVmaW5lIFJFUV81Nl9TUElfU0VUU1RPUAkJNTYKLQotLyoKLSAqIERlZmluZSBUViBNYXN0ZXIgVE01NjAwL1RNNjAwMC9UTTYwMTAgR1BJTyBsaW5lcwotICovCi0KLSNkZWZpbmUgVE02MDAwX0dQSU9fQ0xLCQkweDEwMQotI2RlZmluZSBUTTYwMDBfR1BJT19EQVRBCTB4MTAwCi0KLSNkZWZpbmUgVE02MDAwX0dQSU9fMQkJMHgxMDIKLSNkZWZpbmUgVE02MDAwX0dQSU9fMgkJMHgxMDMKLSNkZWZpbmUgVE02MDAwX0dQSU9fMwkJMHgxMDQKLSNkZWZpbmUgVE02MDAwX0dQSU9fNAkJMHgzMDAKLSNkZWZpbmUgVE02MDAwX0dQSU9fNQkJMHgzMDEKLSNkZWZpbmUgVE02MDAwX0dQSU9fNgkJMHgzMDQKLSNkZWZpbmUgVE02MDAwX0dQSU9fNwkJMHgzMDUKLQotLyogdG02MDEwIGRlZmluZXMgR1BJTyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKi8KLSNkZWZpbmUgVE02MDEwX0dQSU9fMCAgICAgIDB4MDEwMgotI2RlZmluZSBUTTYwMTBfR1BJT18xICAgICAgMHgwMTAzCi0jZGVmaW5lIFRNNjAxMF9HUElPXzIgICAgICAweDAxMDQKLSNkZWZpbmUgVE02MDEwX0dQSU9fMyAgICAgIDB4MDEwNQotI2RlZmluZSBUTTYwMTBfR1BJT180ICAgICAgMHgwMTA2Ci0jZGVmaW5lIFRNNjAxMF9HUElPXzUgICAgICAweDAxMDcKLSNkZWZpbmUgVE02MDEwX0dQSU9fNiAgICAgIDB4MDMwMAotI2RlZmluZSBUTTYwMTBfR1BJT183ICAgICAgMHgwMzAxCi0jZGVmaW5lIFRNNjAxMF9HUElPXzkgICAgICAweDAzMDUKLS8qCi0gKiBEZWZpbmUgVFYgTWFzdGVyIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVSQiBtZXNzYWdlIGNvZGVzIGFuZCBsZW5ndGgKLSAqLwotCi1lbnVtIHsKLQlUTTYwMDBfVVJCX01TR19WSURFTz0xLAotCVRNNjAwMF9VUkJfTVNHX0FVRElPLAotCVRNNjAwMF9VUkJfTVNHX1ZCSSwKLQlUTTYwMDBfVVJCX01TR19QVFMsCi0JVE02MDAwX1VSQl9NU0dfRVJSLAotfTsKLQotLyogRGVmaW5lIHNwZWNpZmljIFRNNjAwMCBWaWRlbyBkZWNvZGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkQ4X1RFU1RfU0VMCQkJMHgwNywgMHhkOAotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkQ5X0FfU0lNX1NFTAkJCTB4MDcsIDB4ZDkKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JEQV9DTEtfU0VMCQkJMHgwNywgMHhkYQotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRCX09VVF9TRUwJCQkweDA3LCAweGRiCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRENfTlNFTF9JMlMJCQkweDA3LCAweGRjCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRERfR1BJTzJfTURSVgkJCTB4MDcsIDB4ZGQKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JERV9HUElPMV9NRFJWCQkJMHgwNywgMHhkZQotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkRGX1BXRE9XTl9BQ0xLCQkJMHgwNywgMHhkZgotI2RlZmluZSBUTTYwMDBfUkVRMDdfUkUwX1ZBRENfUkVGX0NUTAkJCTB4MDcsIDB4ZTAKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFMV9WQURDX0RBQ0xJTVAJCQkweDA3LCAweGUxCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTJfVkFEQ19TVEFUVVNfQ1RMCQkweDA3LCAweGUyCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTNfVkFEQ19JTlBfTFBGX1NFTDEJCTB4MDcsIDB4ZTMKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFNF9WQURDX1RBUkdFVDEJCQkweDA3LCAweGU0Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIJCTB4MDcsIDB4ZTUKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JFNl9WQURDX1RBUkdFVDIJCQkweDA3LCAweGU2Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTdfVkFEQ19BR0FJTl9DVEwJCQkweDA3LCAweGU3Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMCQkweDA3LCAweGU4Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRTlfVkFEQ19JTlBVVF9DVEwxCQkweDA3LCAweGU5Ci0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUFfVkFEQ19JTlBVVF9DVEwyCQkweDA3LCAweGVhCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUJfVkFEQ19BQURDX01PREUJCQkweDA3LCAweGViCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUNfVkFEQ19BQURDX0xWT0wJCQkweDA3LCAweGVjCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRURfVkFEQ19BQURDX1JWT0wJCQkweDA3LCAweGVkCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUVfVkFEQ19DVFJMX1NFTF9DT05UUk9MCQkweDA3LCAweGVlCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRUZfVkFEQ19HQUlOX01BUF9DVEwJCTB4MDcsIDB4ZWYKLSNkZWZpbmUgVE02MDAwX1JFUTA3X1JGRF9CSVNUX0VSUl9WU1RfTE9XCQkweDA3LCAweGZkCi0jZGVmaW5lIFRNNjAwMF9SRVEwN19SRkVfQklTVF9FUlJfVlNUX0hJR0gJCTB4MDcsIDB4ZmUKLQotLyogRGVmaW5lIFRNNjAwMC9UTTYwMTAgVmlkZW8gZGVjb2RlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMAkJCTB4MDcsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMQkJCTB4MDcsIDB4MDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMgkJCTB4MDcsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTAkJCTB4MDcsIDB4MDMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTAkJMHgwNywgMHgwNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA1X05PSVNFX1RIUkVTSE9MRAkJMHgwNywgMHgwNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA2X0FHQ19HQVRFX1RIUkVTSE9MRAkJMHgwNywgMHgwNgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MCQkJMHgwNywgMHgwNwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjA4X0xVTUFfQ09OVFJBU1RfQURKCQkweDA3LCAweDA4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMDlfTFVNQV9CUklHSFRORVNTX0FESgkJMHgwNywgMHgwOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESgkJMHgwNywgMHgwYQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjBCX0NIUk9NQV9IVUVfUEhBU0VfQURKCQkweDA3LCAweDBiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMENfQ0hST01BX0FHQ19DT05UUk9MCQkweDA3LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwJCTB4MDcsIDB4MGQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IwRl9DSFJPTUFfQVVUT19QT1NJVElPTgkJMHgwNywgMHgwZgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjEwX0FHQ19QRUFLX05PTUlOQUwJCTB4MDcsIDB4MTAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IxMV9BR0NfUEVBS19DT05UUk9MCQkweDA3LCAweDExCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTJfQUdDX0dBVEVfU1RBUlRICQkweDA3LCAweDEyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTNfQUdDX0dBVEVfU1RBUlRMCQkweDA3LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTRfQUdDX0dBVEVfV0lEVEgJCQkweDA3LCAweDE0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTVfQUdDX0JQX0RFTEFZCQkJMHgwNywgMHgxNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjE2X0xPQ0tfQ09VTlQJCQkweDA3LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTdfSExPT1BfTUFYU1RBVEUJCQkweDA3LCAweDE3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzCQkweDA3LCAweDE4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyCQkweDA3LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxCQkweDA3LCAweDFhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwCQkweDA3LCAweDFiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMJCTB4MDcsIDB4MWMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMgkJMHgwNywgMHgxZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxCQkweDA3LCAweDFlCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAJCTB4MDcsIDB4MWYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyMF9IU1lOQ19SSVNJTkdfRURHRV9USU1FCQkweDA3LCAweDIwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMjFfSFNZTkNfUEhBU0VfT0ZGU0VUCQkweDA3LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMjJfSFNZTkNfUExMX1NUQVJUX1RJTUUJCTB4MDcsIDB4MjIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyM19IU1lOQ19QTExfRU5EX1RJTUUJCTB4MDcsIDB4MjMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyNF9IU1lOQ19USVBfU1RBUlRfVElNRQkJMHgwNywgMHgyNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI1X0hTWU5DX1RJUF9FTkRfVElNRQkJMHgwNywgMHgyNQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjI2X0hTWU5DX1JJU0lOR19FREdFX1NUQVJUCTB4MDcsIDB4MjYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyN19IU1lOQ19SSVNJTkdfRURHRV9FTkQJCTB4MDcsIDB4MjcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyOF9CQUNLUE9SQ0hfU1RBUlQJCTB4MDcsIDB4MjgKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyOV9CQUNLUE9SQ0hfRU5ECQkJMHgwNywgMHgyOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJBX0hTWU5DX0ZJTFRFUl9TVEFSVAkJMHgwNywgMHgyYQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJCX0hTWU5DX0ZJTFRFUl9FTkQJCTB4MDcsIDB4MmIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyQ19DSFJPTUFfQlVSU1RfU1RBUlQJCTB4MDcsIDB4MmMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IyRF9DSFJPTUFfQlVSU1RfRU5ECQkweDA3LCAweDJkCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVAkJMHgwNywgMHgyZQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjJGX0FDVElWRV9WSURFT19IV0lEVEgJCTB4MDcsIDB4MmYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJUCQkweDA3LCAweDMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVAkJMHgwNywgMHgzMQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMyX1ZTWU5DX0hMT0NLX01JTgkJMHgwNywgMHgzMgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWAkJMHgwNywgMHgzMwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM0X1ZTWU5DX0FHQ19NSU4JCQkweDA3LCAweDM0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWAkJCTB4MDcsIDB4MzUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzNl9WU1lOQ19WQklfTUlOCQkJMHgwNywgMHgzNgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjM3X1ZTWU5DX1ZCSV9NQVgJCQkweDA3LCAweDM3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzhfVlNZTkNfVEhSRVNIT0xECQkweDA3LCAweDM4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SMzlfVlNZTkNfVElNRV9DT05TVEFOVAkJMHgwNywgMHgzOQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNBX1NUQVRVUzEJCQkweDA3LCAweDNhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SM0JfU1RBVFVTMgkJCTB4MDcsIDB4M2IKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1IzQ19TVEFUVVMzCQkJMHgwNywgMHgzYwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjNGX1JFU0VUCQkJCTB4MDcsIDB4M2YKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0MF9URUxFVEVYVF9WQklfQ09ERTAJCTB4MDcsIDB4NDAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0MV9URUxFVEVYVF9WQklfQ09ERTEJCTB4MDcsIDB4NDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0Ml9WQklfREFUQV9ISUdIX0xFVkVMCQkweDA3LCAweDQyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDNfVkJJX0RBVEFfVFlQRV9MSU5FNwkJMHgwNywgMHg0MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ0X1ZCSV9EQVRBX1RZUEVfTElORTgJCTB4MDcsIDB4NDQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0NV9WQklfREFUQV9UWVBFX0xJTkU5CQkweDA3LCAweDQ1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDZfVkJJX0RBVEFfVFlQRV9MSU5FMTAJCTB4MDcsIDB4NDYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0N19WQklfREFUQV9UWVBFX0xJTkUxMQkJMHgwNywgMHg0NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjQ4X1ZCSV9EQVRBX1RZUEVfTElORTEyCQkweDA3LCAweDQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNDlfVkJJX0RBVEFfVFlQRV9MSU5FMTMJCTB4MDcsIDB4NDkKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0QV9WQklfREFUQV9UWVBFX0xJTkUxNAkJMHgwNywgMHg0YQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRCX1ZCSV9EQVRBX1RZUEVfTElORTE1CQkweDA3LCAweDRiCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNENfVkJJX0RBVEFfVFlQRV9MSU5FMTYJCTB4MDcsIDB4NGMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I0RF9WQklfREFUQV9UWVBFX0xJTkUxNwkJMHgwNywgMHg0ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjRFX1ZCSV9EQVRBX1RZUEVfTElORTE4CQkweDA3LCAweDRlCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNEZfVkJJX0RBVEFfVFlQRV9MSU5FMTkJCTB4MDcsIDB4NGYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1MF9WQklfREFUQV9UWVBFX0xJTkUyMAkJMHgwNywgMHg1MAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjUxX1ZCSV9EQVRBX1RZUEVfTElORTIxCQkweDA3LCAweDUxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTJfVkJJX0RBVEFfVFlQRV9MSU5FMjIJCTB4MDcsIDB4NTIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1M19WQklfREFUQV9UWVBFX0xJTkUyMwkJMHgwNywgMHg1MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU0X1ZCSV9EQVRBX1RZUEVfUkxJTkVTCQkweDA3LCAweDU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTVfVkJJX0xPT1BfRklMVEVSX0dBSU4JCTB4MDcsIDB4NTUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Nl9WQklfTE9PUF9GSUxURVJfSV9HQUlOCQkweDA3LCAweDU2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNTdfVkJJX0xPT1BfRklMVEVSX1BfR0FJTgkJMHgwNywgMHg1NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjU4X1ZCSV9DQVBUSU9OX0RUTzEJCTB4MDcsIDB4NTgKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1OV9WQklfQ0FQVElPTl9EVE8wCQkweDA3LCAweDU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNUFfVkJJX1RFTEVURVhUX0RUTzEJCTB4MDcsIDB4NWEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Ql9WQklfVEVMRVRFWFRfRFRPMAkJMHgwNywgMHg1YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVDX1ZCSV9XU1M2MjVfRFRPMQkJMHgwNywgMHg1YwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVEX1ZCSV9XU1M2MjVfRFRPMAkJMHgwNywgMHg1ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjVFX1ZCSV9DQVBUSU9OX0ZSQU1FX1NUQVJUCTB4MDcsIDB4NWUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I1Rl9WQklfV1NTNjI1X0ZSQU1FX1NUQVJUCQkweDA3LCAweDVmCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjBfVEVMRVRFWFRfRlJBTUVfU1RBUlQJCTB4MDcsIDB4NjAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2MV9WQklfQ0NEQVRBMQkJCTB4MDcsIDB4NjEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2Ml9WQklfQ0NEQVRBMgkJCTB4MDcsIDB4NjIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I2M19WQklfV1NTNjI1X0RBVEExCQkweDA3LCAweDYzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjRfVkJJX1dTUzYyNV9EQVRBMgkJMHgwNywgMHg2NAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY1X1ZCSV9EQVRBX1NUQVRVUwkJMHgwNywgMHg2NQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY2X1ZCSV9DQVBUSU9OX1NUQVJUCQkweDA3LCAweDY2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNjdfVkJJX1dTUzYyNV9TVEFSVAkJMHgwNywgMHg2NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjY4X1ZCSV9URUxFVEVYVF9TVEFSVAkJMHgwNywgMHg2OAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcwX0hTWU5DX0RUT19JTkNfU1RBVFVTMwkJMHgwNywgMHg3MAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcxX0hTWU5DX0RUT19JTkNfU1RBVFVTMgkJMHgwNywgMHg3MQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjcyX0hTWU5DX0RUT19JTkNfU1RBVFVTMQkJMHgwNywgMHg3MgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjczX0hTWU5DX0RUT19JTkNfU1RBVFVTMAkJMHgwNywgMHg3MwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc0X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzMJCTB4MDcsIDB4NzQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3NV9DSFJPTUFfRFRPX0lOQ19TVEFUVVMyCQkweDA3LCAweDc1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNzZfQ0hST01BX0RUT19JTkNfU1RBVFVTMQkJMHgwNywgMHg3NgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjc3X0NIUk9NQV9EVE9fSU5DX1NUQVRVUzAJCTB4MDcsIDB4NzcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3OF9BR0NfQUdBSU5fU1RBVFVTCQkweDA3LCAweDc4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SNzlfQUdDX0RHQUlOX1NUQVRVUwkJMHgwNywgMHg3OQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdBX0NIUk9NQV9NQUdfU1RBVFVTCQkweDA3LCAweDdhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SN0JfQ0hST01BX0dBSU5fU1RBVFVTMQkJMHgwNywgMHg3YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjdDX0NIUk9NQV9HQUlOX1NUQVRVUzAJCTB4MDcsIDB4N2MKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3RF9DT1JESUNfRlJFUV9TVEFUVVMJCTB4MDcsIDB4N2QKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I3Rl9TVEFUVVNfTk9JU0UJCQkweDA3LCAweDdmCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODBfQ09NQl9GSUxURVJfVFJFU0hPTEQJCTB4MDcsIDB4ODAKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcJCTB4MDcsIDB4ODIKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcJCTB4MDcsIDB4ODMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4NF9OT0lTRV9OVFNDX0MJCQkweDA3LCAweDg0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODVfTk9JU0VfUEFMX0MJCQkweDA3LCAweDg1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SODZfTk9JU0VfUEhBU0VfQwkJCTB4MDcsIDB4ODYKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4N19OT0lTRV9QSEFTRV9ZCQkJMHgwNywgMHg4NwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhBX0NIUk9NQV9MT09QRklMVEVSX1NUQVRFCTB4MDcsIDB4OGEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Ql9DSFJPTUFfSFJFU0FNUExFUgkJMHgwNywgMHg4YgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhEX0NQVU1QX0RFTEFZX0FESgkJMHgwNywgMHg4ZAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUjhFX0NQVU1QX0FESgkJCTB4MDcsIDB4OGUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1I4Rl9DUFVNUF9ERUxBWQkJCTB4MDcsIDB4OGYKLQotLyogRGVmaW5lIFRNNjAwMC9UTTYwMTAgTWlzY2VsbGFuZW91cyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDMF9BQ1RJVkVfVklERU9fU09VUkNFCQkweDA3LCAweGMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzFfVFJFU0hPTEQJCQkweDA3LCAweGMxCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzJfSFNZTkNfV0lEVEgJCQkweDA3LCAweGMyCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzNfSFNUQVJUMQkJCTB4MDcsIDB4YzMKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDNF9IU1RBUlQwCQkJMHgwNywgMHhjNAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM1X0hFTkQxCQkJCTB4MDcsIDB4YzUKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDNl9IRU5EMAkJCQkweDA3LCAweGM2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQzdfVlNUQVJUMQkJCTB4MDcsIDB4YzcKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDOF9WU1RBUlQwCQkJMHgwNywgMHhjOAotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkM5X1ZFTkQxCQkJCTB4MDcsIDB4YzkKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JDQV9WRU5EMAkJCQkweDA3LCAweGNhCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0JfREVMQVkJCQkJMHgwNywgMHhjYgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SQ0NfQUNUSVZFX1ZJREVPX0lGCQkweDA3LCAweGNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDBfVVNCX1BFUklQSEVSWV9DT05UUk9MCQkweDA3LCAweGQwCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDFfQUREUl9GT1JfUkVRMQkJCTB4MDcsIDB4ZDEKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEMl9BRERSX0ZPUl9SRVEyCQkJMHgwNywgMHhkMgotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQzX0FERFJfRk9SX1JFUTMJCQkweDA3LCAweGQzCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDRfQUREUl9GT1JfUkVRNAkJCTB4MDcsIDB4ZDQKLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JENV9QT1dFUlNBVkUJCQkweDA3LCAweGQ1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDZfRU5EUF9SRVExX1JFUTIJCQkweDA3LCAweGQ2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDdfRU5EUF9SRVEzX1JFUTQJCQkweDA3LCAweGQ3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUgkJCQkweDA3LCAweGQ4Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9CU0laRQkJCTB4MDcsIDB4ZDkKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX1dBS0VVUF9TRUwJCQkweDA3LCAweGRhCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9XQUtFVVBfQURECQkJMHgwNywgMHhkYgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfTEVBREVSMQkJCTB4MDcsIDB4ZGMKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkQ4X0lSX0xFQURFUjAJCQkweDA3LCAweGRkCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JEOF9JUl9QVUxTRV9DTlQxCQkJMHgwNywgMHhkZQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRDhfSVJfUFVMU0VfQ05UMAkJCTB4MDcsIDB4ZGYKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUwX0RWSURFT19TT1VSQ0UJCQkweDA3LCAweGUwCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFMF9EVklERU9fU09VUkNFX0lGCQkweDA3LCAweGUxCi0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFMl9PVVRfU0VMMgkJCTB4MDcsIDB4ZTIKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkUzX09VVF9TRUwxCQkJMHgwNywgMHhlMwotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRTRfT1VUX1NFTDAJCQkweDA3LCAweGU0Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFNV9SRU1PVEVfV0FLRVVQCQkJMHgwNywgMHhlNQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRTdfUFVCX0dQSU8JCQkweDA3LCAweGU3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JFOF9UWVBFU0VMX01PU19JMlMJCTB4MDcsIDB4ZTgKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkU5X1RZUEVTRUxfTU9TX1RTCQkJMHgwNywgMHhlOQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRUFfVFlQRVNFTF9NT1NfQ0NJUgkJMHgwNywgMHhlYQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjBfQklTVF9DUkNfUkVTVUxUMAkJMHgwNywgMHhmMAotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjFfQklTVF9DUkNfUkVTVUxUMQkJMHgwNywgMHhmMQotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjJfQklTVF9DUkNfUkVTVUxUMgkJMHgwNywgMHhmMgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjNfQklTVF9DUkNfUkVTVUxUMwkJMHgwNywgMHhmMwotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjRfQklTVF9FUlJfVlNUMgkJCTB4MDcsIDB4ZjQKLS8qIE9OTFkgZm9yIFRNNjAxMCAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkY1X0JJU1RfRVJSX1ZTVDEJCQkweDA3LCAweGY1Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JGNl9CSVNUX0VSUl9WU1QwCQkJMHgwNywgMHhmNgotLyogT05MWSBmb3IgVE02MDEwICovCi0jZGVmaW5lIFRNNjAxMF9SRVEwN19SRjdfQklTVAkJCQkweDA3LCAweGY3Ci0vKiBPTkxZIGZvciBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA3X1JGRV9QT1dFUl9ET1dOCQkJMHgwNywgMHhmZQotI2RlZmluZSBUTTYwMTBfUkVRMDdfUkZGX1NPRlRfUkVTRVQJCQkweDA3LCAweGZmCi0KLS8qIERlZmluZSBUTTYwMDAvVE02MDEwIFVTQiByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwMF9NQUlOX0NUUkwJCTB4MDUsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwMV9ERVZBRERSCQkweDA1LCAweDAxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDJfVEVTVAkJCTB4MDUsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNF9TT0ZOMAkJCTB4MDUsIDB4MDQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNV9TT0ZOMQkJCTB4MDUsIDB4MDUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwNl9TT0ZUTTAJCQkweDA1LCAweDA2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDdfU09GVE0xCQkJMHgwNSwgMHgwNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjA4X1BIWV9URVNUCQkweDA1LCAweDA4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMDlfVkNUTAkJCTB4MDUsIDB4MDkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwQV9WU1RBCQkJMHgwNSwgMHgwYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjBCX0NYX0NGRwkJCTB4MDUsIDB4MGIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IwQ19FTkRQMF9SRUcwCQkweDA1LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTBfR01BU0sJCQkweDA1LCAweDEwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTFfSU1BU0swCQkJMHgwNSwgMHgxMQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjEyX0lNQVNLMQkJCTB4MDUsIDB4MTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxM19JTUFTSzIJCQkweDA1LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTRfSU1BU0szCQkJMHgwNSwgMHgxNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE1X0lNQVNLNAkJCTB4MDUsIDB4MTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxNl9JTUFTSzUJCQkweDA1LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMTdfSU1BU0s2CQkJMHgwNSwgMHgxNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjE4X0lNQVNLNwkJCTB4MDUsIDB4MTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IxOV9aRVJPUDAJCQkweDA1LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMUFfWkVST1AxCQkJMHgwNSwgMHgxYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjFDX0ZJRk9fRU1QMAkJMHgwNSwgMHgxYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjFEX0ZJRk9fRU1QMQkJMHgwNSwgMHgxZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIwX0lSUV9HUk9VUAkJMHgwNSwgMHgyMAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjIxX0lSUV9TT1VSQ0UwCQkweDA1LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjJfSVJRX1NPVVJDRTEJCTB4MDUsIDB4MjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyM19JUlFfU09VUkNFMgkJMHgwNSwgMHgyMwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI0X0lSUV9TT1VSQ0UzCQkweDA1LCAweDI0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjVfSVJRX1NPVVJDRTQJCTB4MDUsIDB4MjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyNl9JUlFfU09VUkNFNQkJMHgwNSwgMHgyNgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjI3X0lSUV9TT1VSQ0U2CQkweDA1LCAweDI3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMjhfSVJRX1NPVVJDRTcJCTB4MDUsIDB4MjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyOV9TRVFfRVJSMAkJMHgwNSwgMHgyOQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJBX1NFUV9FUlIxCQkweDA1LCAweDJhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkJfU0VRX0FCT1JUMAkJMHgwNSwgMHgyYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJDX1NFUV9BQk9SVDEJCTB4MDUsIDB4MmMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IyRF9UWF9aRVJPMAkJMHgwNSwgMHgyZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjJFX1RYX1pFUk8xCQkweDA1LCAweDJlCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMkZfSURMRV9DTlQJCTB4MDUsIDB4MmYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEJCQkweDA1LCAweDMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzFfRk5PX1AyCQkJMHgwNSwgMHgzMQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMyX0ZOT19QMwkJCTB4MDUsIDB4MzIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzM19GTk9fUDQJCQkweDA1LCAweDMzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzRfRk5PX1A1CQkJMHgwNSwgMHgzNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM1X0ZOT19QNgkJCTB4MDUsIDB4MzUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzNl9GTk9fUDcJCQkweDA1LCAweDM2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzdfRk5PX1A4CQkJMHgwNSwgMHgzNwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjM4X0ZOT19QOQkJCTB4MDUsIDB4MzgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEwCQkweDA1LCAweDM5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxMQkJMHgwNSwgMHgzYQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTIJCTB4MDUsIDB4M2IKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1IzMF9GTk9fUDEzCQkweDA1LCAweDNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SMzBfRk5PX1AxNAkJMHgwNSwgMHgzZAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjMwX0ZOT19QMTUJCTB4MDUsIDB4M2UKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxCQkweDA1LCAweDQwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEJCTB4MDUsIDB4NDEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Ml9JTl9NQVhQU19MT1cyCQkweDA1LCAweDQyCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDNfSU5fTUFYUFNfSElHSDIJCTB4MDUsIDB4NDMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0NF9JTl9NQVhQU19MT1czCQkweDA1LCAweDQ0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDVfSU5fTUFYUFNfSElHSDMJCTB4MDUsIDB4NDUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Nl9JTl9NQVhQU19MT1c0CQkweDA1LCAweDQ2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDdfSU5fTUFYUFNfSElHSDQJCTB4MDUsIDB4NDcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0OF9JTl9NQVhQU19MT1c1CQkweDA1LCAweDQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDlfSU5fTUFYUFNfSElHSDUJCTB4MDUsIDB4NDkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0QV9JTl9NQVhQU19MT1c2CQkweDA1LCAweDRhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEJfSU5fTUFYUFNfSElHSDYJCTB4MDUsIDB4NGIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0Q19JTl9NQVhQU19MT1c3CQkweDA1LCAweDRjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNERfSU5fTUFYUFNfSElHSDcJCTB4MDUsIDB4NGQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0RV9JTl9NQVhQU19MT1c4CQkweDA1LCAweDRlCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNEZfSU5fTUFYUFNfSElHSDgJCTB4MDUsIDB4NGYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I1MF9JTl9NQVhQU19MT1c5CQkweDA1LCAweDUwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNTFfSU5fTUFYUFNfSElHSDkJCTB4MDUsIDB4NTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMAkJMHgwNSwgMHg1MgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMAkweDA1LCAweDUzCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTEJCTB4MDUsIDB4NTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTEJMHgwNSwgMHg1NQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzEyCQkweDA1LCAweDU2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDEyCTB4MDUsIDB4NTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MF9JTl9NQVhQU19MT1cxMwkJMHgwNSwgMHg1OAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQxX0lOX01BWFBTX0hJR0gxMwkweDA1LCAweDU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDBfSU5fTUFYUFNfTE9XMTQJCTB4MDUsIDB4NWEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I0MV9JTl9NQVhQU19ISUdIMTQJMHgwNSwgMHg1YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjQwX0lOX01BWFBTX0xPVzE1CQkweDA1LCAweDVjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNDFfSU5fTUFYUFNfSElHSDE1CTB4MDUsIDB4NWQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMQkJMHgwNSwgMHg2MAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMQkweDA1LCAweDYxCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjJfT1VUX01BWFBTX0xPVzIJCTB4MDUsIDB4NjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2M19PVVRfTUFYUFNfSElHSDIJMHgwNSwgMHg2MwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY0X09VVF9NQVhQU19MT1czCQkweDA1LCAweDY0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjVfT1VUX01BWFBTX0hJR0gzCTB4MDUsIDB4NjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Nl9PVVRfTUFYUFNfTE9XNAkJMHgwNSwgMHg2NgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjY3X09VVF9NQVhQU19ISUdINAkweDA1LCAweDY3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjhfT1VUX01BWFBTX0xPVzUJCTB4MDUsIDB4NjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2OV9PVVRfTUFYUFNfSElHSDUJMHgwNSwgMHg2OQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZBX09VVF9NQVhQU19MT1c2CQkweDA1LCAweDZhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkJfT1VUX01BWFBTX0hJR0g2CTB4MDUsIDB4NmIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Q19PVVRfTUFYUFNfTE9XNwkJMHgwNSwgMHg2YwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjZEX09VVF9NQVhQU19ISUdINwkweDA1LCAweDZkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNkVfT1VUX01BWFBTX0xPVzgJCTB4MDUsIDB4NmUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2Rl9PVVRfTUFYUFNfSElHSDgJMHgwNSwgMHg2ZgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjcwX09VVF9NQVhQU19MT1c5CQkweDA1LCAweDcwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNzFfT1VUX01BWFBTX0hJR0g5CTB4MDUsIDB4NzEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTAJMHgwNSwgMHg3MgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTAJMHgwNSwgMHg3MwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxMQkweDA1LCAweDc0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxMQkweDA1LCAweDc1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzEyCTB4MDUsIDB4NzYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDEyCTB4MDUsIDB4NzcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MF9PVVRfTUFYUFNfTE9XMTMJMHgwNSwgMHg3OAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYxX09VVF9NQVhQU19ISUdIMTMJMHgwNSwgMHg3OQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjYwX09VVF9NQVhQU19MT1cxNAkweDA1LCAweDdhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjFfT1VUX01BWFBTX0hJR0gxNAkweDA1LCAweDdiCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SNjBfT1VUX01BWFBTX0xPVzE1CTB4MDUsIDB4N2MKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I2MV9PVVRfTUFYUFNfSElHSDE1CTB4MDUsIDB4N2QKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MF9GSUZPMAkJCTB4MDUsIDB4ODAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMQkJCTB4MDUsIDB4ODEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4Ml9GSUZPMgkJCTB4MDUsIDB4ODIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4M19GSUZPMwkJCTB4MDUsIDB4ODMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4NF9GSUZPNAkJCTB4MDUsIDB4ODQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4NV9GSUZPNQkJCTB4MDUsIDB4ODUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4Nl9GSUZPNgkJCTB4MDUsIDB4ODYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4N19GSUZPNwkJCTB4MDUsIDB4ODcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4OF9GSUZPOAkJCTB4MDUsIDB4ODgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4OV9GSUZPOQkJCTB4MDUsIDB4ODkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTAJCQkweDA1LCAweDhhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzExCQkJMHgwNSwgMHg4YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xMgkJCTB4MDUsIDB4OGMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I4MV9GSUZPMTMJCQkweDA1LCAweDhkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SODFfRklGTzE0CQkJMHgwNSwgMHg4ZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjgxX0ZJRk8xNQkJCTB4MDUsIDB4OGYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MF9DRkdfRklGTzAJCTB4MDUsIDB4OTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEJCTB4MDUsIDB4OTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5Ml9DRkdfRklGTzIJCTB4MDUsIDB4OTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5M19DRkdfRklGTzMJCTB4MDUsIDB4OTMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5NF9DRkdfRklGTzQJCTB4MDUsIDB4OTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5NV9DRkdfRklGTzUJCTB4MDUsIDB4OTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5Nl9DRkdfRklGTzYJCTB4MDUsIDB4OTYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5N19DRkdfRklGTzcJCTB4MDUsIDB4OTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5OF9DRkdfRklGTzgJCTB4MDUsIDB4OTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5OV9DRkdfRklGTzkJCTB4MDUsIDB4OTkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEwCQkweDA1LCAweDlhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xMQkJMHgwNSwgMHg5YgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTIJCTB4MDUsIDB4OWMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1I5MV9DRkdfRklGTzEzCQkweDA1LCAweDlkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SOTFfQ0ZHX0ZJRk8xNAkJMHgwNSwgMHg5ZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUjkxX0NGR19GSUZPMTUJCTB4MDUsIDB4OWYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMF9DVExfRklGTzAJCTB4MDUsIDB4YTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEJCTB4MDUsIDB4YTEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMl9DVExfRklGTzIJCTB4MDUsIDB4YTIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBM19DVExfRklGTzMJCTB4MDUsIDB4YTMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNF9DVExfRklGTzQJCTB4MDUsIDB4YTQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNV9DVExfRklGTzUJCTB4MDUsIDB4YTUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBNl9DVExfRklGTzYJCTB4MDUsIDB4YTYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBN19DVExfRklGTzcJCTB4MDUsIDB4YTcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBOF9DVExfRklGTzgJCTB4MDUsIDB4YTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBOV9DVExfRklGTzkJCTB4MDUsIDB4YTkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEwCQkweDA1LCAweGFhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xMQkJMHgwNSwgMHhhYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTIJCTB4MDUsIDB4YWMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JBMV9DVExfRklGTzEzCQkweDA1LCAweGFkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQTFfQ1RMX0ZJRk8xNAkJMHgwNSwgMHhhZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkExX0NUTF9GSUZPMTUJCTB4MDUsIDB4YWYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMF9CQ19MT1dfRklGTzAJCTB4MDUsIDB4YjAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEJCTB4MDUsIDB4YjEKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMl9CQ19MT1dfRklGTzIJCTB4MDUsIDB4YjIKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCM19CQ19MT1dfRklGTzMJCTB4MDUsIDB4YjMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNF9CQ19MT1dfRklGTzQJCTB4MDUsIDB4YjQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNV9CQ19MT1dfRklGTzUJCTB4MDUsIDB4YjUKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCNl9CQ19MT1dfRklGTzYJCTB4MDUsIDB4YjYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCN19CQ19MT1dfRklGTzcJCTB4MDUsIDB4YjcKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCOF9CQ19MT1dfRklGTzgJCTB4MDUsIDB4YjgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCOV9CQ19MT1dfRklGTzkJCTB4MDUsIDB4YjkKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEwCQkweDA1LCAweGJhCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xMQkJMHgwNSwgMHhiYgotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTIJCTB4MDUsIDB4YmMKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JCMV9CQ19MT1dfRklGTzEzCQkweDA1LCAweGJkCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQjFfQkNfTE9XX0ZJRk8xNAkJMHgwNSwgMHhiZQotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkIxX0JDX0xPV19GSUZPMTUJCTB4MDUsIDB4YmYKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDMF9EQVRBX0ZJRk8wCQkweDA1LCAweGMwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMQkJMHgwNSwgMHhjNAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM4X0RBVEFfRklGTzIJCTB4MDUsIDB4YzgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDQ19EQVRBX0ZJRk8zCQkweDA1LCAweGNjCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SRDBfREFUQV9GSUZPNAkJMHgwNSwgMHhkMAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkQ0X0RBVEFfRklGTzUJCTB4MDUsIDB4ZDQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JEOF9EQVRBX0ZJRk82CQkweDA1LCAweGQ4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SRENfREFUQV9GSUZPNwkJMHgwNSwgMHhkYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkUwX0RBVEFfRklGTzgJCTB4MDUsIDB4ZTAKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JFNF9EQVRBX0ZJRk85CQkweDA1LCAweGU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTAJCTB4MDUsIDB4ZTgKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xMQkJMHgwNSwgMHhlYwotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzEyCQkweDA1LCAweGYwCi0jZGVmaW5lIFRNNjAxMF9SRVEwNV9SQzRfREFUQV9GSUZPMTMJCTB4MDUsIDB4ZjQKLSNkZWZpbmUgVE02MDEwX1JFUTA1X1JDNF9EQVRBX0ZJRk8xNAkJMHgwNSwgMHhmOAotI2RlZmluZSBUTTYwMTBfUkVRMDVfUkM0X0RBVEFfRklGTzE1CQkweDA1LCAweGZjCi0KLS8qIERlZmluZSBUTTYwMTAgQXVkaW8gZGVjb2RlciByZWdpc3RlcnMgKi8KLS8qIFRoaXMgY29yZSBhdmFpbGFibGUgb25seSBpbiBUTTYwMTAgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwMF9BX1ZFUlNJT04JCTB4MDgsIDB4MDAKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQJCQkweDA4LCAweDAxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDJfQV9GSVhfR0FJTl9DVFJMCTB4MDgsIDB4MDIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwM19BX0FVVE9fR0FJTl9DVFJMCTB4MDgsIDB4MDMKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTAkJMHgwOCwgMHgwNAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ECQkweDA4LCAweDA1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QJCTB4MDgsIDB4MDYKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MCQkweDA4LCAweDA3Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wJCTB4MDgsIDB4MDgKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MCQkweDA4LCAweDA5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ECQkweDA4LCAweDBhCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEJfQV9BU0RfVEhSRVMxCQkweDA4LCAweDBiCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyCQkweDA4LCAweDBjCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMJCTB4MDgsIDB4MGQKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IwRV9BX01PTk9fVEhSRVMxCQkweDA4LCAweDBlCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMEZfQV9NT05PX1RIUkVTMgkJMHgwOCwgMHgwZgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjEwX0FfTVVURV9USFJFUzEJCTB4MDgsIDB4MTAKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxMV9BX01VVEVfVEhSRVMyCQkweDA4LCAweDExCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTJfQV9BR0NfVQkJMHgwOCwgMHgxMgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjEzX0FfQUdDX0VSUl9UCQkweDA4LCAweDEzCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTRfQV9BR0NfR0FJTl9JTklUCTB4MDgsIDB4MTQKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxNV9BX0FHQ19TVEVQX1RIUgkJMHgwOCwgMHgxNQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjE2X0FfQUdDX0dBSU5fTUFYCQkweDA4LCAweDE2Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMTdfQV9BR0NfR0FJTl9NSU4JCTB4MDgsIDB4MTcKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxOF9BX1RSX0NUUkwJCTB4MDgsIDB4MTgKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxOV9BX0ZIXzJGSF9HQUlOCQkweDA4LCAweDE5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMUFfQV9OSUNBTV9TRVJfTUFYCTB4MDgsIDB4MWEKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxQl9BX05JQ0FNX1NFUl9NSU4JMHgwOCwgMHgxYgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjFFX0FfR0FJTl9ERUVNUEhfT1VUCTB4MDgsIDB4MWUKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IxRl9BX1RFU1RfSU5URl9TRUwJMHgwOCwgMHgxZgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIwX0FfVEVTVF9QSU5fU0VMCQkweDA4LCAweDIwCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjFfQV9BR0NfRVJSCQkweDA4LCAweDIxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjJfQV9BR0NfR0FJTgkJMHgwOCwgMHgyMgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjIzX0FfTklDQU1fSU5GTwkJMHgwOCwgMHgyMwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI0X0FfU0VSCQkJMHgwOCwgMHgyNAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI1X0FfQzFfQU1QCQkweDA4LCAweDI1Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SMjZfQV9DMl9BTVAJCTB4MDgsIDB4MjYKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1IyN19BX05PSVNFX0FNUAkJMHgwOCwgMHgyNwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUjI4X0FfQVVESU9fTU9ERV9SRVMJMHgwOCwgMHgyOAotCi0vKiBEZWZpbmUgVE02MDEwIFZpZGVvIEFEQyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFMF9BRENfUkVGCQkweDA4LCAweGUwCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTFfREFDX0NMTVAJCTB4MDgsIDB4ZTEKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFMl9QT1dFUl9ET1dOX0NUUkwxCTB4MDgsIDB4ZTIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFM19BRENfSU4xX1NFTAkJMHgwOCwgMHhlMwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMCQkweDA4LCAweGU0Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTVfR0FJTl9QQVJBTQkJMHgwOCwgMHhlNQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU2X1BPV0VSX0RPV05fQ1RSTDIJMHgwOCwgMHhlNgotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkU3X1JFR19HQUlOX1kJCTB4MDgsIDB4ZTcKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFOF9SRUdfR0FJTl9DCQkweDA4LCAweGU4Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRTlfQklBU19DVFJMCQkweDA4LCAweGU5Ci0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTAkJMHgwOCwgMHhlYQotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwJCTB4MDgsIDB4ZWIKLSNkZWZpbmUgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwJMHgwOCwgMHhlYwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMCQkweDA4LCAweGVkCi0KLS8qIERlZmluZSBUTTYwMTAgQXVkaW8gQURDIHJlZ2lzdGVycyAqLwotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcJMHgwOCwgMHhmMAotI2RlZmluZSBUTTYwMTBfUkVRMDhfUkYxX0FBRENfUE9XRVJfRE9XTgkweDA4LCAweGYxCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjJfTEVGVF9DSEFOTkVMX1ZPTAkweDA4LCAweGYyCi0jZGVmaW5lIFRNNjAxMF9SRVEwOF9SRjNfUklHSFRfQ0hBTk5FTF9WT0wJMHgwOCwgMHhmMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtc3Rkcy5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtc3Rkcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5ZDczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXN0ZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgotICogIHRtNjAwMC1zdGRzLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlICJ0bTYwMDAuaCIKLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRtNjAxMF9hX21vZGUgPSAwOwotbW9kdWxlX3BhcmFtKHRtNjAxMF9hX21vZGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRtNjAxMF9hX21vZGUsICJzZXQgdG02MDEwIHNpZiBhdWRpbyBtb2RlIik7Ci0KLXN0cnVjdCB0bTYwMDBfcmVnX3NldHRpbmdzIHsKLQl1bnNpZ25lZCBjaGFyIHJlcTsKLQl1bnNpZ25lZCBjaGFyIHJlZzsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotfTsKLQotCi1zdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyB7Ci0JdjRsMl9zdGRfaWQgaWQ7Ci0Jc3RydWN0IHRtNjAwMF9yZWdfc2V0dGluZ3MgY29tbW9uWzI3XTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBjb21wb3NpdGVfc3Rkc1tdID0gewotCXsKLQkJLmlkID0gVjRMMl9TVERfUEFMX00sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwNH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTB9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIwfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQkgfSwgewotCQkuaWQgPSBWNEwyX1NURF9QQUxfTmMsCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzNn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgxZn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4Y30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1BBTCwKLQkJLmNvbW1vbiA9IHsKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDMyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDAyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgyNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4ZDV9LAotCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDYzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHg1MH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDhjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MmN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZGfSwKLQotCQkJe1RNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDd9LAotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDB9LAotCQkJezAsIDAsIDB9LAotCQl9LAotCSB9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1NFQ0FNLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4Mzh9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI0fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg5Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4ZTh9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGVkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgyY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDE4fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4RkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JfSwgewotCQkuaWQgPSBWNEwyX1NURF9OVFNDLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDB9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDFlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHg4Yn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4YTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweGU5fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4ODh9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweDYxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg0Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX3N0ZF9zZXR0aW5ncyBzdmlkZW9fc3Rkc1tdID0gewotCXsKLQkJLmlkID0gVjRMMl9TVERfUEFMX00sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwNH0sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDgzfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHgwYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTB9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDBjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDUyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX1BBTF9OYywKLQkJLmNvbW1vbiA9IHsKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAwX1ZJREVPX0NPTlRST0wwLCAweDM3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAxX1ZJREVPX0NPTlRST0wxLCAweDBlfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAyX1ZJREVPX0NPTlRST0wyLCAweDVmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjAzX1lDX1NFUF9DT05UUk9MLCAweDA0fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjA3X09VVFBVVF9DT05UUk9MLCAweDMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE4X0NIUk9NQV9EVE9fSU5DUkVNRU5UMywgMHgxZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDIsIDB4OTF9LAotCQkJe1RNNjAxMF9SRVEwN19SMUFfQ0hST01BX0RUT19JTkNSRU1FTlQxLCAweDFmfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFCX0NIUk9NQV9EVE9fSU5DUkVNRU5UMCwgMHgwY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxQ19IU1lOQ19EVE9fSU5DUkVNRU5UMywgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRF9IU1lOQ19EVE9fSU5DUkVNRU5UMiwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRV9IU1lOQ19EVE9fSU5DUkVNRU5UMSwgMHhjY30sCi0JCQl7VE02MDEwX1JFUTA3X1IxRl9IU1lOQ19EVE9fSU5DUkVNRU5UMCwgMHhjZH0sCi0JCQl7VE02MDEwX1JFUTA3X1IyRV9BQ1RJVkVfVklERU9fSFNUQVJULCAweDg4fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMwX0FDVElWRV9WSURFT19WU1RBUlQsIDB4MjJ9LAotCQkJe1RNNjAxMF9SRVEwN19SMzFfQUNUSVZFX1ZJREVPX1ZISUdIVCwgMHhjMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzM19WU1lOQ19ITE9DS19NQVgsIDB4MGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzVfVlNZTkNfQUdDX01BWCwgMHgxY30sCi0JCQl7VE02MDEwX1JFUTA3X1I4Ml9DT01CX0ZJTFRFUl9DT05GSUcsIDB4NTJ9LAotCQkJe1RNNjAxMF9SRVEwN19SODNfQ0hST01BX0xPQ0tfQ09ORklHLCAweDZGfSwKLQotCQkJe1RNNjAxMF9SRVEwN19SMDRfTFVNQV9IQUdDX0NPTlRST0wsIDB4ZGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMERfQ0hST01BX0tJTExfTEVWRUwsIDB4MDd9LAotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDB9LAotCQkJezAsIDAsIDB9LAotCQl9LAotCX0sIHsKLQkJLmlkID0gVjRMMl9TVERfUEFMLAotCQkuY29tbW9uID0gewotCQkJe1RNNjAxMF9SRVEwN19SM0ZfUkVTRVQsIDB4MDF9LAotCQkJe1RNNjAxMF9SRVEwN19SMDBfVklERU9fQ09OVFJPTDAsIDB4MzN9LAotCQkJe1RNNjAxMF9SRVEwN19SMDFfVklERU9fQ09OVFJPTDEsIDB4MGV9LAotCQkJe1RNNjAxMF9SRVEwN19SMDJfVklERU9fQ09OVFJPTDIsIDB4NWZ9LAotCQkJe1RNNjAxMF9SRVEwN19SMDNfWUNfU0VQX0NPTlRST0wsIDB4MDR9LAotCQkJe1RNNjAxMF9SRVEwN19SMDdfT1VUUFVUX0NPTlRST0wsIDB4MzB9LAotCQkJe1RNNjAxMF9SRVEwN19SMThfQ0hST01BX0RUT19JTkNSRU1FTlQzLCAweDI1fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjE5X0NIUk9NQV9EVE9fSU5DUkVNRU5UMiwgMHhkNX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQV9DSFJPTUFfRFRPX0lOQ1JFTUVOVDEsIDB4NjN9LAotCQkJe1RNNjAxMF9SRVEwN19SMUJfQ0hST01BX0RUT19JTkNSRU1FTlQwLCAweDUwfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFDX0hTWU5DX0RUT19JTkNSRU1FTlQzLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFEX0hTWU5DX0RUT19JTkNSRU1FTlQyLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFFX0hTWU5DX0RUT19JTkNSRU1FTlQxLCAweGNjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFGX0hTWU5DX0RUT19JTkNSRU1FTlQwLCAweGNkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjJFX0FDVElWRV9WSURFT19IU1RBUlQsIDB4OGN9LAotCQkJe1RNNjAxMF9SRVEwN19SMzBfQUNUSVZFX1ZJREVPX1ZTVEFSVCwgMHgyYX0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMV9BQ1RJVkVfVklERU9fVkhJR0hULCAweGMxfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMzX1ZTWU5DX0hMT0NLX01BWCwgMHgwY30sCi0JCQl7VE02MDEwX1JFUTA3X1IzNV9WU1lOQ19BR0NfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgyX0NPTUJfRklMVEVSX0NPTkZJRywgMHg1Mn0sCi0JCQl7VE02MDEwX1JFUTA3X1I4M19DSFJPTUFfTE9DS19DT05GSUcsIDB4NkZ9LAotCi0JCQl7VE02MDEwX1JFUTA3X1IwNF9MVU1BX0hBR0NfQ09OVFJPTCwgMHhkY30sCi0JCQl7VE02MDEwX1JFUTA3X1IwRF9DSFJPTUFfS0lMTF9MRVZFTCwgMHgwN30sCi0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMH0sCi0JCQl7MCwgMCwgMH0sCi0JCX0sCi0JIH0sIHsKLQkJLmlkID0gVjRMMl9TVERfU0VDQU0sCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgzOX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwM30sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MjR9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDkyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhlOH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZWR9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4Y30sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDJhfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4YzF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDJjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MTh9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHhGRn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LCB7Ci0JCS5pZCA9IFY0TDJfU1REX05UU0MsCi0JCS5jb21tb24gPSB7Ci0JCQl7VE02MDEwX1JFUTA3X1IzRl9SRVNFVCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMF9WSURFT19DT05UUk9MMCwgMHgwMX0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMV9WSURFT19DT05UUk9MMSwgMHgwZn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwMl9WSURFT19DT05UUk9MMiwgMHg1Zn0sCi0JCQl7VE02MDEwX1JFUTA3X1IwM19ZQ19TRVBfQ09OVFJPTCwgMHgwM30sCi0JCQl7VE02MDEwX1JFUTA3X1IwN19PVVRQVVRfQ09OVFJPTCwgMHgzMH0sCi0JCQl7VE02MDEwX1JFUTA3X1IxN19ITE9PUF9NQVhTVEFURSwgMHg4Yn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxOF9DSFJPTUFfRFRPX0lOQ1JFTUVOVDMsIDB4MWV9LAotCQkJe1RNNjAxMF9SRVEwN19SMTlfQ0hST01BX0RUT19JTkNSRU1FTlQyLCAweDhifSwKLQkJCXtUTTYwMTBfUkVRMDdfUjFBX0NIUk9NQV9EVE9fSU5DUkVNRU5UMSwgMHhhMn0sCi0JCQl7VE02MDEwX1JFUTA3X1IxQl9DSFJPTUFfRFRPX0lOQ1JFTUVOVDAsIDB4ZTl9LAotCQkJe1RNNjAxMF9SRVEwN19SMUNfSFNZTkNfRFRPX0lOQ1JFTUVOVDMsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SMURfSFNZTkNfRFRPX0lOQ1JFTUVOVDIsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUVfSFNZTkNfRFRPX0lOQ1JFTUVOVDEsIDB4Y2N9LAotCQkJe1RNNjAxMF9SRVEwN19SMUZfSFNZTkNfRFRPX0lOQ1JFTUVOVDAsIDB4Y2R9LAotCQkJe1RNNjAxMF9SRVEwN19SMkVfQUNUSVZFX1ZJREVPX0hTVEFSVCwgMHg4OH0sCi0JCQl7VE02MDEwX1JFUTA3X1IzMF9BQ1RJVkVfVklERU9fVlNUQVJULCAweDIyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjMxX0FDVElWRV9WSURFT19WSElHSFQsIDB4NjF9LAotCQkJe1RNNjAxMF9SRVEwN19SMzNfVlNZTkNfSExPQ0tfTUFYLCAweDFjfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjM1X1ZTWU5DX0FHQ19NQVgsIDB4MWN9LAotCQkJe1RNNjAxMF9SRVEwN19SODJfQ09NQl9GSUxURVJfQ09ORklHLCAweDQyfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjgzX0NIUk9NQV9MT0NLX0NPTkZJRywgMHg2Rn0sCi0KLQkJCXtUTTYwMTBfUkVRMDdfUjA0X0xVTUFfSEFHQ19DT05UUk9MLCAweGRkfSwKLQkJCXtUTTYwMTBfUkVRMDdfUjBEX0NIUk9NQV9LSUxMX0xFVkVMLCAweDA3fSwKLQkJCXtUTTYwMTBfUkVRMDdfUjNGX1JFU0VULCAweDAwfSwKLQkJCXswLCAwLCAwfSwKLQkJfSwKLQl9LAotfTsKLQotCi1zdGF0aWMgaW50IHRtNjAwMF9zZXRfYXVkaW9fc3RkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXVpbnQ4X3QgYXJlZ18wMiA9IDB4MDQ7IC8qIEdDMSBGaXhlZCBnYWluIDBkQiAqLwotCXVpbnQ4X3QgYXJlZ18wNSA9IDB4MDE7IC8qIEF1dG8gNC41ID0gTSBKYXBhbiwgQXV0byA2LjUgPSBESyAqLwotCXVpbnQ4X3QgYXJlZ18wNiA9IDB4MDI7IC8qIEF1dG8gZGUtZW1waGFzaXMsIG1hbm51YWwgY2hhbm5lbCBtb2RlICovCi0JdWludDhfdCBuaWNhbV9mbGFnID0gMDsgLyogTm8gTklDQU0gKi8KLQotCWlmIChkZXYtPnJhZGlvKSB7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwMV9BX0lOSVQsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDJfQV9GSVhfR0FJTl9DVFJMLCAweDA0KTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwsIDB4MDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDRfQV9TSUZfQU1QX0NUUkwsIDB4ODApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDVfQV9TVEFOREFSRF9NT0QsIDB4MGMpOwotCQkvKiBzZXQgbW9ubyBvciBzdGVyZW8gKi8KLQkJaWYgKGRldi0+YW1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIDB4MDApOwotCQllbHNlIGlmIChkZXYtPmFtb2RlID09IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCi0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIDB4MDIpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDlfQV9NQUlOX1ZPTCwgMHgxOCk7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwQ19BX0FTRF9USFJFUzIsIDB4MGEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMsIDB4NDApOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCAweGZlKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFFX0FfR0FJTl9ERUVNUEhfT1VULCAweDEzKTsKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHg4MCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAodG02MDEwX2FfbW9kZSkgewotCS8qIGF1dG8gKi8KLQljYXNlIDA6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0tSOgotCQkJYXJlZ18wNSB8PSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgotCQkJYXJlZ18wNSB8PSAweDQwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfTlRTQ19NOgotCQljYXNlIFY0TDJfU1REX1BBTF9NOgotCQljYXNlIFY0TDJfU1REX1BBTF9OOgotCQkJYXJlZ18wNSB8PSAweDIwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfUEFMX05jOgotCQkJYXJlZ18wNSB8PSAweDYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKLQkJCWFyZWdfMDUgfD0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSB8PSAweDEwOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JLyogQTIgKi8KLQljYXNlIDE6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCWNhc2UgVjRMMl9TVERfQjoKLQkJY2FzZSBWNEwyX1NURF9HSDoKLQkJCWFyZWdfMDUgPSAweDA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfREs6Ci0JCQlhcmVnXzA1ID0gMHgwOTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCS8qIE5JQ0FNICovCi0JY2FzZSAyOgotCQlzd2l0Y2ggKGRldi0+bm9ybSkgewotCQljYXNlIFY0TDJfU1REX0I6Ci0JCWNhc2UgVjRMMl9TVERfR0g6Ci0JCQlhcmVnXzA1ID0gMHgwNzsKLQkJCWJyZWFrOwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSA9IDB4MDY7Ci0JCQlicmVhazsKLQkJY2FzZSBWNEwyX1NURF9QQUxfSToKLQkJCWFyZWdfMDUgPSAweDA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKLQkJCWFyZWdfMDUgPSAweDBhOwotCQkJYXJlZ18wMiA9IDB4MDI7Ci0JCQlicmVhazsKLQkJfQotCQluaWNhbV9mbGFnID0gMTsKLQkJYnJlYWs7Ci0JLyogb3RoZXIgKi8KLQljYXNlIDM6Ci0JCXN3aXRjaCAoZGV2LT5ub3JtKSB7Ci0JCS8qIERLM19BMiAqLwotCQljYXNlIFY0TDJfU1REX0RLOgotCQkJYXJlZ18wNSA9IDB4MGI7Ci0JCQlicmVhazsKLQkJLyogS29yZWEgKi8KLQkJY2FzZSBWNEwyX1NURF9OVFNDX01fS1I6Ci0JCQlhcmVnXzA1ID0gMHgwNDsKLQkJCWJyZWFrOwotCQkvKiBFSUFKICovCi0JCWNhc2UgVjRMMl9TVERfTlRTQ19NX0pQOgotCQkJYXJlZ18wNSA9IDB4MDM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWFyZWdfMDUgPSAweDAyOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHgwMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAyX0FfRklYX0dBSU5fQ1RSTCwgYXJlZ18wMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAzX0FfQVVUT19HQUlOX0NUUkwsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwNF9BX1NJRl9BTVBfQ1RSTCwgMHhhMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjA1X0FfU1RBTkRBUkRfTU9ELCBhcmVnXzA1KTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDZfQV9TT1VORF9NT0QsIGFyZWdfMDYpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwN19BX0xFRlRfVk9MLCAweDAwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMDhfQV9SSUdIVF9WT0wsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwOV9BX01BSU5fVk9MLCAweDA4KTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEFfQV9JMlNfTU9ELCAweDkxKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEJfQV9BU0RfVEhSRVMxLCAweDIwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMENfQV9BU0RfVEhSRVMyLCAweDEyKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMERfQV9BTURfVEhSRVMsIDB4MjApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IwRV9BX01PTk9fVEhSRVMxLCAweGYwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMEZfQV9NT05PX1RIUkVTMiwgMHg4MCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEwX0FfTVVURV9USFJFUzEsIDB4YzApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxMV9BX01VVEVfVEhSRVMyLCAweDgwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTJfQV9BR0NfVSwgMHgxMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjEzX0FfQUdDX0VSUl9ULCAweGZlKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTRfQV9BR0NfR0FJTl9JTklULCAweDIwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTVfQV9BR0NfU1RFUF9USFIsIDB4MTQpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxNl9BX0FHQ19HQUlOX01BWCwgMHhmZSk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjE3X0FfQUdDX0dBSU5fTUlOLCAweDAxKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMThfQV9UUl9DVFJMLCAweGEwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMTlfQV9GSF8yRkhfR0FJTiwgMHgzMik7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFBX0FfTklDQU1fU0VSX01BWCwgMHg2NCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjFCX0FfTklDQU1fU0VSX01JTiwgMHgyMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBSRVFfMDhfU0VUX0dFVF9BVlJFR19CSVQsIDB4MWMsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgUkVRXzA4X1NFVF9HRVRfQVZSRUdfQklULCAweDFkLCAweDAwKTsKLQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SMUVfQV9HQUlOX0RFRU1QSF9PVVQsIDB4MTMpOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IxRl9BX1RFU1RfSU5URl9TRUwsIDB4MDApOwotCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1IyMF9BX1RFU1RfUElOX1NFTCwgMHgwMCk7Ci0JdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUjAxX0FfSU5JVCwgMHg4MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB0bTYwMDBfZ2V0X3N0ZF9yZXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JLyogQ3VycmVudGx5LCB0aG9zZSBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIHJlc29sdGlvbnMgKi8KLQlpZiAoZGV2LT5ub3JtICYgVjRMMl9TVERfNTI1XzYwKQotCQlkZXYtPmhlaWdodCA9IDQ4MDsKLQllbHNlCi0JCWRldi0+aGVpZ2h0ID0gNTc2OwotCi0JZGV2LT53aWR0aCA9IDcyMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfbG9hZF9zdGQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkgICBzdHJ1Y3QgdG02MDAwX3JlZ19zZXR0aW5ncyAqc2V0LCBpbnQgbWF4X3NpemUpCi17Ci0JaW50IGksIHJjOwotCi0JLyogTG9hZCBib2FyZCdzIGluaXRpYWxpemF0aW9uIHRhYmxlICovCi0JZm9yIChpID0gMDsgbWF4X3NpemU7IGkrKykgewotCQlpZiAoIXNldFtpXS5yZXEpCi0JCQlyZXR1cm4gMDsKLQotCQlyYyA9IHRtNjAwMF9zZXRfcmVnKGRldiwgc2V0W2ldLnJlcSwgc2V0W2ldLnJlZywgc2V0W2ldLnZhbHVlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlaSB3aGlsZSBzZXR0aW5nICIKLQkJCSAgICAgICAicmVxICVkLCByZWcgJWQgdG8gdmFsdWUgJWRcbiIsCi0JCQkgICAgICAgcmMsIHNldFtpXS5yZXEsIHNldFtpXS5yZWcsIHNldFtpXS52YWx1ZSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHRtNjAwMF9zZXRfc3RhbmRhcmQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0JaW50IGksIHJjID0gMDsKLQl1OCByZWdfMDdfZmUgPSAweDhhOwotCXU4IHJlZ18wOF9mMSA9IDB4ZmM7Ci0JdTggcmVnXzA4X2UyID0gMHhmMDsKLQl1OCByZWdfMDhfZTYgPSAweDBmOwotCi0JdG02MDAwX2dldF9zdGRfcmVzKGRldik7Ci0KLQlpZiAoZGV2LT5yYWRpbykgewotCQkvKiB0b2RvICovCi0JfQotCi0JaWYgKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSB7Ci0JCXN3aXRjaCAoZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0udm11eCkgewotCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0E6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZjQpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVBX0JVRkZfRFJWX0NUUkwsIDB4ZjEpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVCX1NJRl9HQUlOX0NUUkwsIDB4ZTApOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVDX1JFVkVSU0VfWUNfQ1RSTCwgMHhjMik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRURfR0FJTl9TRUwsIDB4ZTgpOwotCQkJcmVnXzA3X2ZlIHw9IDB4MDE7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19COgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUzX0FEQ19JTjFfU0VMLCAweGY4KTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQV9CVUZGX0RSVl9DVFJMLCAweGYxKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQl9TSUZfR0FJTl9DVFJMLCAweGUwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFQ19SRVZFUlNFX1lDX0NUUkwsIDB4YzIpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkVEX0dBSU5fU0VMLCAweGU4KTsKLQkJCXJlZ18wN19mZSB8PSAweDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQUI6Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTNfQURDX0lOMV9TRUwsIDB4ZmMpOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkU0X0FEQ19JTjJfU0VMLCAweGY4KTsKLQkJCXJlZ18wOF9lNiA9IDB4MDA7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUFfQlVGRl9EUlZfQ1RSTCwgMHhmMik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUJfU0lGX0dBSU5fQ1RSTCwgMHhmMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRUNfUkVWRVJTRV9ZQ19DVFJMLCAweGMyKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFRF9HQUlOX1NFTCwgMHhlMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXN3aXRjaCAoZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0uYW11eCkgewotCQljYXNlIFRNNjAwMF9BTVVYX0FEQzE6Ci0JCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAotCQkJCTB4MDAsIDB4MGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX0FNVVhfQURDMjoKLQkJCXRtNjAwMF9zZXRfcmVnX21hc2soZGV2LCBUTTYwMTBfUkVRMDhfUkYwX0RBVURJT19JTlBVVF9DT05GSUcsCi0JCQkJMHgwOCwgMHgwZik7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9TSUYxOgotCQkJcmVnXzA4X2UyIHw9IDB4MDI7Ci0JCQlyZWdfMDhfZTYgPSAweDA4OwotCQkJcmVnXzA3X2ZlIHw9IDB4NDA7Ci0JCQlyZWdfMDhfZjEgfD0gMHgwMjsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNF9BRENfSU4yX1NFTCwgMHhmMyk7Ci0JCQl0bTYwMDBfc2V0X3JlZ19tYXNrKGRldiwgVE02MDEwX1JFUTA4X1JGMF9EQVVESU9fSU5QVVRfQ09ORklHLAotCQkJCTB4MDIsIDB4MGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX0FNVVhfU0lGMjoKLQkJCXJlZ18wOF9lMiB8PSAweDAyOwotCQkJcmVnXzA4X2U2ID0gMHgwODsKLQkJCXJlZ18wN19mZSB8PSAweDQwOwotCQkJcmVnXzA4X2YxIHw9IDB4MDI7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRTRfQURDX0lOMl9TRUwsIDB4ZjcpOwotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsIFRNNjAxMF9SRVEwOF9SRjBfREFVRElPX0lOUFVUX0NPTkZJRywKLQkJCQkweDAyLCAweDBmKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDhfUkUyX1BPV0VSX0RPV05fQ1RSTDEsIHJlZ18wOF9lMik7Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA4X1JFNl9QT1dFUl9ET1dOX0NUUkwyLCByZWdfMDhfZTYpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwOF9SRjFfQUFEQ19QT1dFUl9ET1dOLCByZWdfMDhfZjEpOwotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SRkVfUE9XRVJfRE9XTiwgcmVnXzA3X2ZlKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLnZtdXgpIHsKLQkJY2FzZSBUTTYwMDBfVk1VWF9WSURFT19BOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDEwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgwMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDBmKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS52X2dwaW8sIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE02MDAwX1ZNVVhfVklERU9fQjoKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFM19WQURDX0lOUF9MUEZfU0VMMSwgMHgwMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRTVfVkFEQ19JTlBfTFBGX1NFTDIsIDB4MDApOwotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkU4X1ZBRENfUFdET1dOX0NUTCwgMHgwZik7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsCi0JCQkgICAgUkVRXzAzX1NFVF9HRVRfTUNVX1BJTiwgZGV2LT52aW5wdXRbZGV2LT5pbnB1dF0udl9ncGlvLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFRNNjAwMF9WTVVYX1ZJREVPX0FCOgotCQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMDBfUkVRMDdfUkUzX1ZBRENfSU5QX0xQRl9TRUwxLCAweDEwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDAwX1JFUTA3X1JFNV9WQURDX0lOUF9MUEZfU0VMMiwgMHgxMCk7Ci0JCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAwMF9SRVEwN19SRThfVkFEQ19QV0RPV05fQ1RMLCAweDAwKTsKLQkJCXRtNjAwMF9zZXRfcmVnKGRldiwKLQkJCSAgICBSRVFfMDNfU0VUX0dFVF9NQ1VfUElOLCBkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS52X2dwaW8sIDEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlzd2l0Y2ggKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXgpIHsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMxOgotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCi0JCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwMCwgMHgwZik7Ci0JCQlicmVhazsKLQkJY2FzZSBUTTYwMDBfQU1VWF9BREMyOgotCQkJdG02MDAwX3NldF9yZWdfbWFzayhkZXYsCi0JCQkJVE02MDAwX1JFUTA3X1JFQl9WQURDX0FBRENfTU9ERSwgMHgwNCwgMHgwZik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChkZXYtPnZpbnB1dFtkZXYtPmlucHV0XS50eXBlID09IFRNNjAwMF9JTlBVVF9TVklERU8pIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3ZpZGVvX3N0ZHMpOyBpKyspIHsKLQkJCWlmIChkZXYtPm5vcm0gJiBzdmlkZW9fc3Rkc1tpXS5pZCkgewotCQkJCXJjID0gdG02MDAwX2xvYWRfc3RkKGRldiwgc3ZpZGVvX3N0ZHNbaV0uY29tbW9uLAotCQkJCQkJICAgICBzaXplb2Yoc3ZpZGVvX3N0ZHNbaV0uCi0JCQkJCQkJICAgIGNvbW1vbikpOwotCQkJCWdvdG8gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbXBvc2l0ZV9zdGRzKTsgaSsrKSB7Ci0JCQlpZiAoZGV2LT5ub3JtICYgY29tcG9zaXRlX3N0ZHNbaV0uaWQpIHsKLQkJCQlyYyA9IHRtNjAwMF9sb2FkX3N0ZChkZXYsCi0JCQkJCQkgICAgIGNvbXBvc2l0ZV9zdGRzW2ldLmNvbW1vbiwKLQkJCQkJCSAgICAgc2l6ZW9mKGNvbXBvc2l0ZV9zdGRzW2ldLgotCQkJCQkJCSAgICBjb21tb24pKTsKLQkJCQlnb3RvIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLXJldDoKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoKGRldi0+ZGV2X3R5cGUgPT0gVE02MDEwKSAmJgotCSAgICAoKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXggPT0gVE02MDAwX0FNVVhfU0lGMSkgfHwKLQkgICAgKGRldi0+dmlucHV0W2Rldi0+aW5wdXRdLmFtdXggPT0gVE02MDAwX0FNVVhfU0lGMikpKQotCQl0bTYwMDBfc2V0X2F1ZGlvX3N0ZChkZXYpOwotCi0JbXNsZWVwKDQwKTsKLQotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtdXNiLWlzb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0YzJhOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC11c2ItaXNvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICB0bTYwMDAtYnVmLmMgLSBkcml2ZXIgZm9yIFRNNTYwMC9UTTYwMDAvVE02MDEwIFVTQiB2aWRlbyBjYXB0dXJlIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotCi0jZGVmaW5lIFRNNjAwMF9VUkJfTVNHX0xFTiAxODAKLQotc3RydWN0IHVzYl9pc29jX2N0bCB7Ci0JCS8qIG1heCBwYWNrZXQgc2l6ZSBvZiBpc29jIHRyYW5zYWN0aW9uICovCi0JaW50CQkJCW1heF9wa3Rfc2l6ZTsKLQotCQkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHVyYnMgKi8KLQlpbnQJCQkJbnVtX2J1ZnM7Ci0KLQkJLyogdXJiIGZvciBpc29jIHRyYW5zZmVycyAqLwotCXN0cnVjdCB1cmIJCQkqKnVyYjsKLQotCQkvKiB0cmFuc2ZlciBidWZmZXJzIGZvciBpc29jIHRyYW5zZmVyICovCi0JY2hhcgkJCQkqKnRyYW5zZmVyX2J1ZmZlcjsKLQotCQkvKiBMYXN0IGJ1ZmZlciBjb21tYW5kIGFuZCByZWdpb24gKi8KLQl1OAkJCQljbWQ7Ci0JaW50CQkJCXBvcywgc2l6ZSwgcGt0c2l6ZTsKLQotCQkvKiBMYXN0IGZpZWxkOiBPREQgb3IgRVZFTj8gKi8KLQlpbnQJCQkJdmZpZWxkLCBmaWVsZDsKLQotCQkvKiBTdG9yZXMgaW5jb21wbGV0ZSBjb21tYW5kcyAqLwotCXUzMgkJCQl0bXBfYnVmOwotCWludAkJCQl0bXBfYnVmX2xlbjsKLQotCQkvKiBTdG9yZXMgYWxyZWFkeSByZXF1ZXN0ZWQgYnVmZmVycyAqLwotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgIAkqYnVmOwotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC12aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDhiOTM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLXZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODA5ICswLDAgQEAKLS8qCi0gKiAgIHRtNjAwMC12aWRlby5jIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+Ci0gKgktIEZpeGVkIG1vZHVsZSBsb2FkL3VubG9hZAotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0KLSNpbmNsdWRlICJ0bTYwMDAtcmVncy5oIgotI2luY2x1ZGUgInRtNjAwMC5oIgotCi0jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICBtc2Vjc190b19qaWZmaWVzKDIwMDApICAvKiAyIHNlY29uZHMgKi8KLQotLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgVE02MDAwX01JTl9CVUYgNAotI2RlZmluZSBUTTYwMDBfREVGX0JVRiA4Ci0KLSNkZWZpbmUgVE02MDAwX01BWF9JU09fUEFDS0VUUwk0NgkvKiBNYXggbnVtYmVyIG9mIElTTyBwYWNrZXRzICovCi0KLS8qIERlY2xhcmUgc3RhdGljIHZhcnMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyYW1ldGVycyAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2aWRfbGltaXQgPSAxNjsJLyogVmlkZW8gbWVtb3J5IGxpbWl0LCBpbiBNYiAqLwotc3RhdGljIGludCB2aWRlb19uciA9IC0xOwkJLyogL2Rldi92aWRlb04sIC0xIGZvciBhdXRvZGV0ZWN0ICovCi1zdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CQkvKiAvZGV2L3JhZGlvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KLQotLyogRGVidWcgbGV2ZWwgKi8KLWludCB0bTYwMDBfZGVidWc7Ci1FWFBPUlRfU1lNQk9MX0dQTCh0bTYwMDBfZGVidWcpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsIG5vX2N0cmwgPSB7Ci0JLm5hbWUgID0gIjQyIiwKLQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRCwKLX07Ci0KLS8qIHN1cHBvcnRlZCBjb250cm9scyAqLwotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB0bTYwMDBfcWN0cmxbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDI1NSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDU0LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDI1NSwKLQkJLnN0ZXAgICAgICAgICAgPSAweDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMTE5LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAyNTUsCi0JCS5zdGVwICAgICAgICAgID0gMHgxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDExMiwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTI4LAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAweDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sCi0JCS8qIC0tLSBhdWRpbyAtLS0gKi8KLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKLQkJLm5hbWUgICAgICAgICAgPSAiVm9sdW1lIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTUsCi0JCS5tYXhpbXVtICAgICAgID0gMTUsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAwLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBDVFJMUyA9IEFSUkFZX1NJWkUodG02MDAwX3FjdHJsKTsKLXN0YXRpYyBpbnQgcWN0bF9yZWdzW0FSUkFZX1NJWkUodG02MDAwX3FjdHJsKV07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG02MDAwX2ZtdCBmb3JtYXRbXSA9IHsKLQl7Ci0JCS5uYW1lICAgICA9ICI0OjI6MiwgcGFja2VkLCBZVlkyIiwKLQkJLmZvdXJjYyAgID0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5kZXB0aCAgICA9IDE2LAotCX0sIHsKLQkJLm5hbWUgICAgID0gIjQ6MjoyLCBwYWNrZWQsIFVZVlkiLAotCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVVlWWSwKLQkJLmRlcHRoICAgID0gMTYsCi0JfSwgewotCQkubmFtZSAgICAgPSAiQS9WICsgVkJJIG11eCBwYWNrZXQiLAotCQkuZm91cmNjICAgPSBWNEwyX1BJWF9GTVRfVE02MDAwLAotCQkuZGVwdGggICAgPSAxNiwKLQl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsX2J5X2lkKHVuc2lnbmVkIGludCBpZCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDVFJMUzsgaSsrKQotCQlpZiAodG02MDAwX3FjdHJsW2ldLmlkID09IGlkKQotCQkJcmV0dXJuIHRtNjAwMF9xY3RybCtpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCURNQSBhbmQgdGhyZWFkIGZ1bmN0aW9ucwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBub3JtX21heHcoYSkgNzIwCi0jZGVmaW5lIG5vcm1fbWF4aChhKSA1NzYKLQotI2RlZmluZSBub3JtX21pbncoYSkgbm9ybV9tYXh3KGEpCi0jZGVmaW5lIG5vcm1fbWluaChhKSBub3JtX21heGgoYSkKLQotLyoKLSAqIHZpZGVvLWJ1ZiBnZW5lcmljIHJvdXRpbmUgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBidWZmZXIKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGdldF9uZXh0X2J1ZihzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKLQkJCSAgICAgICBzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICoqYnVmKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gY29udGFpbmVyX29mKGRtYV9xLCBzdHJ1Y3QgdG02MDAwX2NvcmUsIHZpZHEpOwotCWNoYXIgKm91dHA7Ci0KLQlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJObyBhY3RpdmUgcXVldWUgdG8gc2VydmVcbiIpOwotCQkqYnVmID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCSpidWYgPSBsaXN0X2VudHJ5KGRtYV9xLT5hY3RpdmUubmV4dCwKLQkJCXN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0KLQkvKiBDbGVhbnMgdXAgYnVmZmVyIC0gVXNlZnVsIGZvciB0ZXN0aW5nIGZvciBmcmFtZS9VUkIgbG9zcyAqLwotCW91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCYoKmJ1ZiktPnZiKTsKLQotCXJldHVybjsKLX0KLQotLyoKLSAqIEFubm91bmNlcyB0aGF0IGEgYnVmZmVyIHdlcmUgZmlsbGVkIGFuZCByZXF1ZXN0IHRoZSBuZXh0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBidWZmZXJfZmlsbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSwKLQkJCQkgc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZikKLXsKLQkvKiBBZHZpY2UgdGhhdCBidWZmZXIgd2FzIGZpbGxlZCAqLwotCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJbJXAvJWRdIHdha2V1cFxuIiwgYnVmLCBidWYtPnZiLmkpOwotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ET05FOwotCWJ1Zi0+dmIuZmllbGRfY291bnQrKzsKLQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwotCi0JbGlzdF9kZWwoJmJ1Zi0+dmIucXVldWUpOwotCXdha2VfdXAoJmJ1Zi0+dmIuZG9uZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnRtNjAwMF9tc2dfdHlwZVtdID0gewotCSJ1bmtub3duKDApIiwgICAvKiAwICovCi0JInZpZGVvIiwgICAgICAgIC8qIDEgKi8KLQkiYXVkaW8iLCAgICAgICAgLyogMiAqLwotCSJ2YmkiLCAgICAgICAgICAvKiAzICovCi0JInB0cyIsICAgICAgICAgIC8qIDQgKi8KLQkiZXJyIiwgICAgICAgICAgLyogNSAqLwotCSJ1bmtub3duKDYpIiwgICAvKiA2ICovCi0JInVua25vd24oNykiLCAgIC8qIDcgKi8KLX07Ci0KLS8qCi0gKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCi0gKi8KLXN0YXRpYyBpbnQgY29weV9zdHJlYW1zKHU4ICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7Ci0JdTggKnB0ciA9IGRhdGEsICplbmRwID0gZGF0YStsZW4sIGM7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXIgPSAwOwotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IGNtZCwgY3B5c2l6ZSwgcGt0c2l6ZSwgc2l6ZSwgZmllbGQsIGJsb2NrLCBsaW5lLCBwb3MgPSAwOwotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICp2YnVmID0gTlVMTDsKLQljaGFyICp2b3V0cCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGxpbmV3aWR0aDsKLQotCWlmICghZGV2LT5yYWRpbykgewotCQkvKiBnZXQgdmlkZW8gYnVmZmVyICovCi0JCWdldF9uZXh0X2J1ZihkbWFfcSwgJnZidWYpOwotCi0JCWlmICghdmJ1ZikKLQkJCXJldHVybiByYzsKLQkJdm91dHAgPSB2aWRlb2J1Zl90b192bWFsbG9jKCZ2YnVmLT52Yik7Ci0KLQkJaWYgKCF2b3V0cCkKLQkJCXJldHVybiAwOwotCX0KLQotCWZvciAocHRyID0gZGF0YTsgcHRyIDwgZW5kcDspIHsKLQkJaWYgKCFkZXYtPmlzb2NfY3RsLmNtZCkgewotCQkJLyogSGVhZGVyICovCi0JCQlpZiAoZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA+IDApIHsKLQkJCQkvKiBmcm9tIGxhc3QgdXJiIG9yIHBhY2tldCAqLwotCQkJCWhlYWRlciA9IGRldi0+aXNvY19jdGwudG1wX2J1ZjsKLQkJCQlpZiAoNCAtIGRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4gPiAwKSB7Ci0JCQkJCW1lbWNweSgodTggKikmaGVhZGVyICsKLQkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4sCi0JCQkJCQlwdHIsCi0JCQkJCQk0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbik7Ci0JCQkJCXB0ciArPSA0IC0gZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbjsKLQkJCQl9Ci0JCQkJZGV2LT5pc29jX2N0bC50bXBfYnVmX2xlbiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwdHIgKyAzID49IGVuZHApIHsKLQkJCQkJLyogaGF2ZSBpbmNvbXBsZXRlIGhlYWRlciAqLwotCQkJCQlkZXYtPmlzb2NfY3RsLnRtcF9idWZfbGVuID0gZW5kcCAtIHB0cjsKLQkJCQkJbWVtY3B5KCZkZXYtPmlzb2NfY3RsLnRtcF9idWYsIHB0ciwKLQkJCQkJCWRldi0+aXNvY19jdGwudG1wX2J1Zl9sZW4pOwotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfQotCQkJCS8qIFNlZWsgZm9yIHN5bmMgKi8KLQkJCQlmb3IgKDsgcHRyIDwgZW5kcCAtIDM7IHB0cisrKSB7Ci0JCQkJCWlmICgqKHB0ciArIDMpID09IDB4NDcpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogR2V0IG1lc3NhZ2UgaGVhZGVyICovCi0JCQkJaGVhZGVyID0gKih1bnNpZ25lZCBsb25nICopcHRyOwotCQkJCXB0ciArPSA0OwotCQkJfQotCi0JCQkvKiBzcGxpdCB0aGUgaGVhZGVyIGZpZWxkcyAqLwotCQkJYyA9IChoZWFkZXIgPj4gMjQpICYgMHhmZjsKLQkJCXNpemUgPSAoKGhlYWRlciAmIDB4N2UpIDw8IDEpOwotCQkJaWYgKHNpemUgPiAwKQotCQkJCXNpemUgLT0gNDsKLQkJCWJsb2NrID0gKGhlYWRlciA+PiA3KSAmIDB4ZjsKLQkJCWZpZWxkID0gKGhlYWRlciA+PiAxMSkgJiAweDE7Ci0JCQlsaW5lICA9IChoZWFkZXIgPj4gMTIpICYgMHgxZmY7Ci0JCQljbWQgICA9IChoZWFkZXIgPj4gMjEpICYgMHg3OwotCQkJLyogVmFsaWRhdGVzIGhhZWRlciBmaWVsZHMgKi8KLQkJCWlmIChzaXplID4gVE02MDAwX1VSQl9NU0dfTEVOKQotCQkJCXNpemUgPSBUTTYwMDBfVVJCX01TR19MRU47Ci0JCQlwa3RzaXplID0gVE02MDAwX1VSQl9NU0dfTEVOOwotCQkJLyogY2FsY3VsYXRlIHBvc2l0aW9uIGluIGJ1ZmZlcgotCQkJICogYW5kIGNoYW5nZSB0aGUgYnVmZmVyCi0JCQkgKi8KLQkJCXN3aXRjaCAoY21kKSB7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgotCQkJCWlmICghZGV2LT5yYWRpbykgewotCQkJCQlpZiAoKGRldi0+aXNvY19jdGwudmZpZWxkICE9IGZpZWxkKSAmJgotCQkJCQkJKGZpZWxkID09IDEpKSB7Ci0JCQkJCS8qIEFubm91bmNlcyB0aGF0IGEgbmV3IGJ1ZmZlcgotCQkJCQkgKiB3ZXJlIGZpbGxlZAotCQkJCQkgKi8KLQkJCQkJCWJ1ZmZlcl9maWxsZWQoZGV2LCBkbWFfcSwgdmJ1Zik7Ci0JCQkJCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLAotCQkJCQkJCSJuZXcgYnVmZmVyIGZpbGxlZFxuIik7Ci0JCQkJCQlnZXRfbmV4dF9idWYoZG1hX3EsICZ2YnVmKTsKLQkJCQkJCWlmICghdmJ1ZikKLQkJCQkJCQlyZXR1cm4gcmM7Ci0JCQkJCQl2b3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJnZidWYtPnZiKTsKLQkJCQkJCWlmICghdm91dHApCi0JCQkJCQkJcmV0dXJuIHJjOwotCQkJCQkJbWVtc2V0KHZvdXRwLCAwLCB2YnVmLT52Yi5zaXplKTsKLQkJCQkJfQotCQkJCQlsaW5ld2lkdGggPSB2YnVmLT52Yi53aWR0aCA8PCAxOwotCQkJCQlwb3MgPSAoKGxpbmUgPDwgMSkgLSBmaWVsZCAtIDEpICoKLQkJCQkJbGluZXdpZHRoICsgYmxvY2sgKiBUTTYwMDBfVVJCX01TR19MRU47Ci0JCQkJCS8qIERvbid0IGFsbG93IHRvIHdyaXRlIG91dCBvZiB0aGUgYnVmZmVyICovCi0JCQkJCWlmIChwb3MgKyBzaXplID4gdmJ1Zi0+dmIuc2l6ZSkKLQkJCQkJCWNtZCA9IFRNNjAwMF9VUkJfTVNHX0VSUjsKLQkJCQkJZGV2LT5pc29jX2N0bC52ZmllbGQgPSBmaWVsZDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKLQkJCQlicmVhazsKLQkJCWNhc2UgVE02MDAwX1VSQl9NU0dfQVVESU86Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1BUUzoKLQkJCQlzaXplID0gcGt0c2l6ZTsJCS8qIFNpemUgaXMgYWx3YXlzIDE4MCBieXRlcyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogQ29udGludWUgdGhlIGxhc3QgY29weSAqLwotCQkJY21kID0gZGV2LT5pc29jX2N0bC5jbWQ7Ci0JCQlzaXplID0gZGV2LT5pc29jX2N0bC5zaXplOwotCQkJcG9zID0gZGV2LT5pc29jX2N0bC5wb3M7Ci0JCQlwa3RzaXplID0gZGV2LT5pc29jX2N0bC5wa3RzaXplOwotCQkJZmllbGQgPSBkZXYtPmlzb2NfY3RsLmZpZWxkOwotCQl9Ci0JCWNweXNpemUgPSAoZW5kcCAtIHB0ciA+IHNpemUpID8gc2l6ZSA6IGVuZHAgLSBwdHI7Ci0JCWlmIChjcHlzaXplKSB7Ci0JCQkvKiBjb3B5IGRhdGEgaW4gZGlmZmVyZW50IGJ1ZmZlcnMgKi8KLQkJCXN3aXRjaCAoY21kKSB7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZJREVPOgotCQkJCS8qIEZpbGxzIHZpZGVvIGJ1ZmZlciAqLwotCQkJCWlmICh2YnVmKQotCQkJCQltZW1jcHkoJnZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX0FVRElPOiB7Ci0JCQkJaW50IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGNweXNpemU7IGkgKz0gMikKLQkJCQkJc3dhYjE2cygodTE2ICopKHB0ciArIGkpKTsKLQotCQkJCXRtNjAwMF9jYWxsX2ZpbGxidWYoZGV2LCBUTTYwMDBfQVVESU8sIHB0ciwgY3B5c2l6ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFRNNjAwMF9VUkJfTVNHX1ZCSToKLQkJCQkvKiBOZWVkIHNvbWUgY29kZSB0byBjb3B5IHZiaSBidWZmZXIgKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgVE02MDAwX1VSQl9NU0dfUFRTOiB7Ci0JCQkJLyogTmVlZCBzb21lIGNvZGUgdG8gY29weSBwdHMgKi8KLQkJCQl1MzIgcHRzOwotCQkJCXB0cyA9ICoodTMyICopcHRyOwotCQkJCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX0lTT0MsICJmaWVsZCAlZCwgUFRTICV4IiwKLQkJCQkJZmllbGQsIHB0cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHB0ciArIHBrdHNpemUgPiBlbmRwKSB7Ci0JCQkvKiBFbmQgb2YgVVJCIHBhY2tldCwgYnV0IGNtZCBwcm9jZXNzaW5nIGlzIG5vdAotCQkJICogY29tcGxldGUuIFByZXNlcnZlIHRoZSBzdGF0ZSBmb3IgYSBuZXh0IHBhY2tldAotCQkJICovCi0JCQlkZXYtPmlzb2NfY3RsLnBvcyA9IHBvcyArIGNweXNpemU7Ci0JCQlkZXYtPmlzb2NfY3RsLnNpemUgPSBzaXplIC0gY3B5c2l6ZTsKLQkJCWRldi0+aXNvY19jdGwuY21kID0gY21kOwotCQkJZGV2LT5pc29jX2N0bC5maWVsZCA9IGZpZWxkOwotCQkJZGV2LT5pc29jX2N0bC5wa3RzaXplID0gcGt0c2l6ZSAtIChlbmRwIC0gcHRyKTsKLQkJCXB0ciArPSBlbmRwIC0gcHRyOwotCQl9IGVsc2UgewotCQkJZGV2LT5pc29jX2N0bC5jbWQgPSAwOwotCQkJcHRyICs9IHBrdHNpemU7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJZGVudGlmeSB0aGUgdG01NjAwLzYwMDAgYnVmZmVyIGhlYWRlciB0eXBlIGFuZCBwcm9wZXJseSBoYW5kbGVzCi0gKi8KLXN0YXRpYyBpbnQgY29weV9tdWx0aXBsZXhlZCh1OCAqcHRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICAqZG1hX3EgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBjb250YWluZXJfb2YoZG1hX3EsIHN0cnVjdCB0bTYwMDBfY29yZSwgdmlkcSk7Ci0JdW5zaWduZWQgaW50IHBvcyA9IGRldi0+aXNvY19jdGwucG9zLCBjcHlzaXplOwotCWludCByYyA9IDE7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgKmJ1ZjsKLQljaGFyICpvdXRwID0gTlVMTDsKLQotCWdldF9uZXh0X2J1ZihkbWFfcSwgJmJ1Zik7Ci0JaWYgKGJ1ZikKLQkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJmJ1Zi0+dmIpOwotCi0JaWYgKCFvdXRwKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCWNweXNpemUgPSBtaW4obGVuLCBidWYtPnZiLnNpemUtcG9zKTsKLQkJbWVtY3B5KCZvdXRwW3Bvc10sIHB0ciwgY3B5c2l6ZSk7Ci0JCXBvcyArPSBjcHlzaXplOwotCQlwdHIgKz0gY3B5c2l6ZTsKLQkJbGVuIC09IGNweXNpemU7Ci0JCWlmIChwb3MgPj0gYnVmLT52Yi5zaXplKSB7Ci0JCQlwb3MgPSAwOwotCQkJLyogQW5ub3VuY2VzIHRoYXQgYSBuZXcgYnVmZmVyIHdlcmUgZmlsbGVkICovCi0JCQlidWZmZXJfZmlsbGVkKGRldiwgZG1hX3EsIGJ1Zik7Ci0JCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JU09DLCAibmV3IGJ1ZmZlciBmaWxsZWRcbiIpOwotCQkJZ2V0X25leHRfYnVmKGRtYV9xLCAmYnVmKTsKLQkJCWlmICghYnVmKQotCQkJCWJyZWFrOwotCQkJb3V0cCA9IHZpZGVvYnVmX3RvX3ZtYWxsb2MoJihidWYtPnZiKSk7Ci0JCQlpZiAoIW91dHApCi0JCQkJcmV0dXJuIHJjOwotCQkJcG9zID0gMDsKLQkJfQotCX0KLQotCWRldi0+aXNvY19jdGwucG9zID0gcG9zOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByaW50X2Vycl9zdGF0dXMoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsCi0JCQkJICAgICBpbnQgcGFja2V0LCBpbnQgc3RhdHVzKQotewotCWNoYXIgKmVycm1zZyA9ICJVbmtub3duIjsKLQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSAtRU5PRU5UOgotCQllcnJtc2cgPSAidW5saW5rZWQgc3luY2hyb251b3VzbHkiOwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgotCQllcnJtc2cgPSAidW5saW5rZWQgYXN5bmNocm9udW91c2x5IjsKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PU1I6Ci0JCWVycm1zZyA9ICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBJUEU6Ci0JCWVycm1zZyA9ICJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRU9WRVJGTE9XOgotCQllcnJtc2cgPSAiQmFiYmxlIChiYWQgY2FibGU/KSI7Ci0JCWJyZWFrOwotCWNhc2UgLUVQUk9UTzoKLQkJZXJybXNnID0gIkJpdC1zdHVmZiBlcnJvciAoYmFkIGNhYmxlPykiOwotCQlicmVhazsKLQljYXNlIC1FSUxTRVE6Ci0JCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsKLQkJYnJlYWs7Ci0JY2FzZSAtRVRJTUU6Ci0JCWVycm1zZyA9ICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCI7Ci0JCWJyZWFrOwotCX0KLQlpZiAocGFja2V0IDwgMCkgewotCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIlVSQiBzdGF0dXMgJWQgWyVzXS5cbiIsCi0JCQlzdGF0dXMsIGVycm1zZyk7Ci0JfSBlbHNlIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUVVFVUUsICJVUkIgcGFja2V0ICVkLCBzdGF0dXMgJWQgWyVzXS5cbiIsCi0JCQlwYWNrZXQsIHN0YXR1cywgZXJybXNnKTsKLQl9Ci19Ci0KLQotLyoKLSAqIENvbnRyb2xzIHRoZSBpc29jIGNvcHkgb2YgZWFjaCB1cmIgcGFja2V0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRtNjAwMF9pc29jX2NvcHkoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKLQlpbnQgaSwgbGVuID0gMCwgcmMgPSAxLCBzdGF0dXM7Ci0JY2hhciAqcDsKLQotCWlmICh1cmItPnN0YXR1cyA8IDApIHsKLQkJcHJpbnRfZXJyX3N0YXR1cyhkZXYsIC0xLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJc3RhdHVzID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7Ci0KLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXByaW50X2Vycl9zdGF0dXMoZGV2LCBpLCBzdGF0dXMpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7Ci0KLQkJaWYgKGxlbiA+IDApIHsKLQkJCXAgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OwotCQkJaWYgKCF1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgewotCQkJCWlmICgoZGV2LT5mb3VyY2MpID09IFY0TDJfUElYX0ZNVF9UTTYwMDApIHsKLQkJCQkJcmMgPSBjb3B5X211bHRpcGxleGVkKHAsIGxlbiwgdXJiKTsKLQkJCQkJaWYgKHJjIDw9IDApCi0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29weV9zdHJlYW1zKHAsIGxlbiwgdXJiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVVSQiBjb250cm9sCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKgotICogSVJRIGNhbGxiYWNrLCBjYWxsZWQgYnkgVVJCIGNhbGxiYWNrCi0gKi8KLXN0YXRpYyB2b2lkIHRtNjAwMF9pcnFfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICpkbWFfcSA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGNvbnRhaW5lcl9vZihkbWFfcSwgc3RydWN0IHRtNjAwMF9jb3JlLCB2aWRxKTsKLQlpbnQgaTsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJmRldi0+c2xvY2spOwotCXRtNjAwMF9pc29jX2NvcHkodXJiKTsKLQlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7Ci0KLQkvKiBSZXNldCB1cmIgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggPSAwOwotCX0KLQotCXVyYi0+c3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAodXJiLT5zdGF0dXMpCi0JCXRtNjAwMF9lcnIoInVyYiByZXN1Ym1pdCBmYWlsZWQgKGVycm9yPSVpKVxuIiwKLQkJCXVyYi0+c3RhdHVzKTsKLX0KLQotLyoKLSAqIFN0b3AgYW5kIERlYWxsb2NhdGUgVVJCcwotICovCi1zdGF0aWMgdm9pZCB0bTYwMDBfdW5pbml0X2lzb2Moc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpCi17Ci0Jc3RydWN0IHVyYiAqdXJiOwotCWludCBpOwotCi0JZGV2LT5pc29jX2N0bC5idWYgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBkZXYtPmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKLQkJdXJiID0gZGV2LT5pc29jX2N0bC51cmJbaV07Ci0JCWlmICh1cmIpIHsKLQkJCXVzYl9raWxsX3VyYih1cmIpOwotCQkJdXNiX3VubGlua191cmIodXJiKTsKLQkJCWlmIChkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcltpXSkgewotCQkJCXVzYl9mcmVlX2NvaGVyZW50KGRldi0+dWRldiwKLQkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQkJCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldLAotCQkJCQkJdXJiLT50cmFuc2Zlcl9kbWEpOwotCQkJfQotCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCQlkZXYtPmlzb2NfY3RsLnVyYltpXSA9IE5VTEw7Ci0JCX0KLQkJZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0gPSBOVUxMOwotCX0KLQotCWtmcmVlKGRldi0+aXNvY19jdGwudXJiKTsKLQlrZnJlZShkZXYtPmlzb2NfY3RsLnRyYW5zZmVyX2J1ZmZlcik7Ci0KLQlkZXYtPmlzb2NfY3RsLnVyYiA9IE5VTEw7Ci0JZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwotCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSAwOwotfQotCi0vKgotICogQWxsb2NhdGUgVVJCcyBhbmQgc3RhcnQgSVJRCi0gKi8KLXN0YXRpYyBpbnQgdG02MDAwX3ByZXBhcmVfaXNvYyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7Ci0JaW50IGksIGosIHNiX3NpemUsIHBpcGUsIHNpemUsIG1heF9wYWNrZXRzLCBudW1fYnVmcyA9IDg7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCi0JLyogRGUtYWxsb2NhdGVzIGFsbCBwZW5kaW5nIHN0dWZmICovCi0JdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JLyogU3RvcCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KLQl0bTYwMDBfaXJfaW50X3N0b3AoZGV2KTsKLQotCXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwKLQkJCSAgZGV2LT5pc29jX2luLmJJbnRlcmZhY2VOdW1iZXIsCi0JCQkgIGRldi0+aXNvY19pbi5iQWx0ZXJuYXRlU2V0dGluZyk7Ci0KLQkvKiBTdGFydCBpbnRlcnJ1cHQgVVNCIHBpcGUgKi8KLQl0bTYwMDBfaXJfaW50X3N0YXJ0KGRldik7Ci0KLQlwaXBlID0gdXNiX3Jjdmlzb2NwaXBlKGRldi0+dWRldiwKLQkJCSAgICAgICBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKLQkJCSAgICAgICBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwotCi0Jc2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LT51ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7Ci0KLQlpZiAoc2l6ZSA+IGRldi0+aXNvY19pbi5tYXhzaXplKQotCQlzaXplID0gZGV2LT5pc29jX2luLm1heHNpemU7Ci0KLQlkZXYtPmlzb2NfY3RsLm1heF9wa3Rfc2l6ZSA9IHNpemU7Ci0KLQltYXhfcGFja2V0cyA9IFRNNjAwMF9NQVhfSVNPX1BBQ0tFVFM7Ci0Jc2Jfc2l6ZSA9IG1heF9wYWNrZXRzICogc2l6ZTsKLQotCWRldi0+aXNvY19jdGwubnVtX2J1ZnMgPSBudW1fYnVmczsKLQotCWRldi0+aXNvY19jdGwudXJiID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmlzb2NfY3RsLnVyYikgewotCQl0bTYwMDBfZXJyKCJjYW5ub3QgYWxsb2MgbWVtb3J5IGZvciB1c2IgYnVmZmVyc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSpudW1fYnVmcywKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyKSB7Ci0JCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHVzYnRyYW5zZmVyXG4iKTsKLQkJa2ZyZWUoZGV2LT5pc29jX2N0bC51cmIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19RVUVVRSwgIkFsbG9jYXRpbmcgJWQgeCAlZCBwYWNrZXRzIgotCQkgICAgIiAoJWQgYnl0ZXMpIG9mICVkIGJ5dGVzIGVhY2ggdG8gaGFuZGxlICV1IHNpemVcbiIsCi0JCSAgICBtYXhfcGFja2V0cywgbnVtX2J1ZnMsIHNiX3NpemUsCi0JCSAgICBkZXYtPmlzb2NfaW4ubWF4c2l6ZSwgc2l6ZSk7Ci0KLQkvKiBhbGxvY2F0ZSB1cmJzIGFuZCB0cmFuc2ZlciBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewotCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwotCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWRldi0+aXNvY19jdGwudXJiW2ldID0gdXJiOwotCi0JCWRldi0+aXNvY19jdGwudHJhbnNmZXJfYnVmZmVyW2ldID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwKLQkJCXNiX3NpemUsIEdGUF9LRVJORUwsICZ1cmItPnRyYW5zZmVyX2RtYSk7Ci0JCWlmICghZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0pIHsKLQkJCXRtNjAwMF9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSAlaSBieXRlcyBmb3IgdHJhbnNmZXIiCi0JCQkJCSIgYnVmZmVyICVpJXNcbiIsCi0JCQkJCXNiX3NpemUsIGksCi0JCQkJCWluX2ludGVycnVwdCgpID8gIiB3aGlsZSBpbiBpbnQiIDogIiIpOwotCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltZW1zZXQoZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIDAsIHNiX3NpemUpOwotCi0JCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCBwaXBlLAotCQkJCSAgZGV2LT5pc29jX2N0bC50cmFuc2Zlcl9idWZmZXJbaV0sIHNiX3NpemUsCi0JCQkJICB0bTYwMDBfaXJxX2NhbGxiYWNrLCBkbWFfcSk7Ci0JCXVyYi0+aW50ZXJ2YWwgPSBkZXYtPmlzb2NfaW4uZW5kcC0+ZGVzYy5iSW50ZXJ2YWw7Ci0JCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBtYXhfcGFja2V0czsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwotCi0JCWZvciAoaiA9IDA7IGogPCBtYXhfcGFja2V0czsgaisrKSB7Ci0JCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IHNpemUgKiBqOwotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBzaXplOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdG02MDAwX3N0YXJ0X3RocmVhZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldikKLXsKLQlzdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlICpkbWFfcSA9ICZkZXYtPnZpZHE7Ci0JaW50IGk7Ci0KLQlkbWFfcS0+ZnJhbWUgPSAwOwotCWRtYV9xLT5pbmlfamlmZmllcyA9IGppZmZpZXM7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcS0+d3EpOwotCi0JLyogc3VibWl0IHVyYnMgYW5kIGVuYWJsZXMgSVJRICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewotCQlpbnQgcmMgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmlzb2NfY3RsLnVyYltpXSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyYykgewotCQkJdG02MDAwX2Vycigic3VibWl0IG9mIHVyYiAlaSBmYWlsZWQgKGVycm9yPSVpKVxuIiwgaSwKLQkJCQkgICByYyk7Ci0JCQl0bTYwMDBfdW5pbml0X2lzb2MoZGV2KTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVZpZGVvYnVmIG9wZXJhdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQKLWJ1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgKnNpemUpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCi0JKnNpemUgPSBmaC0+Zm10LT5kZXB0aCAqIGZoLT53aWR0aCAqIGZoLT5oZWlnaHQgPj4gMzsKLQlpZiAoMCA9PSAqY291bnQpCi0JCSpjb3VudCA9IFRNNjAwMF9ERUZfQlVGOwotCi0JaWYgKCpjb3VudCA8IFRNNjAwMF9NSU5fQlVGKQotCQkqY291bnQgPSBUTTYwMDBfTUlOX0JVRjsKLQotCXdoaWxlICgqc2l6ZSAqICpjb3VudCA+IHZpZF9saW1pdCAqIDEwMjQgKiAxMDI0KQotCQkoKmNvdW50KS0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB0bTYwMDBfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoaW5faW50ZXJydXB0KCkpCi0JCUJVRygpOwotCi0JLyogV2UgdXNlZCB0byB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGZpbmlzaCBoZXJlLCBidXQgdGhpcyBkaWRuJ3Qgd29yawotCSAgIGJlY2F1c2UsIGFzIHdlIHdlcmUga2VlcGluZyB0aGUgc3RhdGUgYXMgVklERU9CVUZfUVVFVUVELAotCSAgIHZpZGVvYnVmX3F1ZXVlX2NhbmNlbCBtYXJrZWQgaXQgYXMgZmluaXNoZWQgZm9yIHVzLgotCSAgIChBbHNvLCBpdCBjb3VsZCB3ZWRnZSBmb3JldmVyIGlmIHRoZSBoYXJkd2FyZSB3YXMgbWlzY29uZmlndXJlZC4pCi0KLQkgICBUaGlzIHNob3VsZCBiZSBzYWZlOyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgdGhlIGJ1ZmZlciBpc24ndAotCSAgIHF1ZXVlZCBhbnltb3JlLiBJZiB3ZSBldmVyIHN0YXJ0IG1hcmtpbmcgdGhlIGJ1ZmZlcnMgYXMKLQkgICBWSURFT0JVRl9BQ1RJVkUsIGl0IHdvbid0IGJlLCB0aG91Z2guCi0JKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwotCWlmIChkZXYtPmlzb2NfY3RsLmJ1ZiA9PSBidWYpCi0JCWRldi0+aXNvY19jdGwuYnVmID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLCBmbGFncyk7Ci0KLQl2aWRlb2J1Zl92bWFsbG9jX2ZyZWUoJmJ1Zi0+dmIpOwotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOwotfQotCi1zdGF0aWMgaW50Ci1idWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKLQkJCQkJCWVudW0gdjRsMl9maWVsZCBmaWVsZCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAqZmggID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgdG02MDAwX2J1ZmZlciwgdmIpOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICpkZXYgPSBmaC0+ZGV2OwotCWludCByYyA9IDAsIHVyYl9pbml0ID0gMDsKLQotCUJVR19PTihOVUxMID09IGZoLT5mbXQpOwotCi0KLQkvKiBGSVhNRTogSXQgYXNzdW1lcyBkZXB0aD0yICovCi0JLyogVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBmb3JtYXQgaXMgMTYgYml0cy9waXhlbCAqLwotCWJ1Zi0+dmIuc2l6ZSA9IGZoLT5mbXQtPmRlcHRoKmZoLT53aWR0aCpmaC0+aGVpZ2h0ID4+IDM7Ci0JaWYgKDAgIT0gYnVmLT52Yi5iYWRkciAgJiYgIGJ1Zi0+dmIuYnNpemUgPCBidWYtPnZiLnNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGJ1Zi0+Zm10ICAgICAgICE9IGZoLT5mbXQgICAgfHwKLQkgICAgYnVmLT52Yi53aWR0aCAgIT0gZmgtPndpZHRoICB8fAotCSAgICBidWYtPnZiLmhlaWdodCAhPSBmaC0+aGVpZ2h0IHx8Ci0JICAgIGJ1Zi0+dmIuZmllbGQgICE9IGZpZWxkKSB7Ci0JCWJ1Zi0+Zm10ICAgICAgID0gZmgtPmZtdDsKLQkJYnVmLT52Yi53aWR0aCAgPSBmaC0+d2lkdGg7Ci0JCWJ1Zi0+dmIuaGVpZ2h0ID0gZmgtPmhlaWdodDsKLQkJYnVmLT52Yi5maWVsZCAgPSBmaWVsZDsKLQkJYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7Ci0JfQotCi0JaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gYnVmLT52Yi5zdGF0ZSkgewotCQlyYyA9IHZpZGVvYnVmX2lvbG9jayh2cSwgJmJ1Zi0+dmIsIE5VTEwpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gZmFpbDsKLQkJdXJiX2luaXQgPSAxOwotCX0KLQotCWlmICghZGV2LT5pc29jX2N0bC5udW1fYnVmcykKLQkJdXJiX2luaXQgPSAxOwotCi0JaWYgKHVyYl9pbml0KSB7Ci0JCXJjID0gdG02MDAwX3ByZXBhcmVfaXNvYyhkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCi0JCXJjID0gdG02MDAwX3N0YXJ0X3RocmVhZChkZXYpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCi0JfQotCi0JYnVmLT52Yi5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOwotCXJldHVybiAwOwotCi1mYWlsOgotCWZyZWVfYnVmZmVyKHZxLCBidWYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQKLWJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgdG02MDAwX2J1ZmZlciAgICAqYnVmICAgICA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiKTsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggICAgICA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICAgICAgKmRldiAgICAgPSBmaC0+ZGV2OwotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUgICp2aWRxICAgID0gJmRldi0+dmlkcTsKLQotCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnZpZHEtPmFjdGl2ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQotewotCXN0cnVjdCB0bTYwMDBfYnVmZmVyICAgKmJ1ZiAgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCB0bTYwMDBfYnVmZmVyLCB2Yik7Ci0KLQlmcmVlX2J1ZmZlcih2cSwgYnVmKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgdG02MDAwX3ZpZGVvX3FvcHMgPSB7Ci0JLmJ1Zl9zZXR1cCAgICAgID0gYnVmZmVyX3NldHVwLAotCS5idWZfcHJlcGFyZSAgICA9IGJ1ZmZlcl9wcmVwYXJlLAotCS5idWZfcXVldWUgICAgICA9IGJ1ZmZlcl9xdWV1ZSwKLQkuYnVmX3JlbGVhc2UgICAgPSBidWZmZXJfcmVsZWFzZSwKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJSU9DVEwgaGFuZGxpbmcKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBib29sIGlzX3Jlc19yZWFkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaXNfcmVzX3N0cmVhbWluZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgc3RydWN0IHRtNjAwMF9maCAqZmgpCi17Ci0JLyogSXMgdGhlIGN1cnJlbnQgZmggaGFuZGxpbmcgaXQ/IGlmIHNvLCB0aGF0J3MgT0sgKi8KLQlpZiAoZGV2LT5yZXNvdXJjZXMgPT0gZmgpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCByZXNfZ2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCwKLQkJICAgYm9vbCBpc19yZXNfcmVhZCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyA9PSBmaCAmJiBkZXYtPmlzX3Jlc19yZWFkID09IGlzX3Jlc19yZWFkKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIGlzIGl0IGZyZWU/ICovCi0JaWYgKGRldi0+cmVzb3VyY2VzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBncmFiIGl0ICovCi0JZGV2LT5yZXNvdXJjZXMgPSBmaDsKLQlkZXYtPmlzX3Jlc19yZWFkID0gaXNfcmVzX3JlYWQ7Ci0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfUkVTX0xPQ0ssICJyZXM6IGdldFxuIik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCBzdHJ1Y3QgdG02MDAwX2ZoICpmaCkKLXsKLQkvKiBJcyB0aGUgY3VycmVudCBmaCBoYW5kbGluZyBpdD8gaWYgc28sIHRoYXQncyBPSyAqLwotCWlmIChkZXYtPnJlc291cmNlcyAhPSBmaCkKLQkJcmV0dXJuOwotCi0JZGV2LT5yZXNvdXJjZXMgPSBOVUxMOwotCWRwcmludGsoZGV2LCBWNEwyX0RFQlVHX1JFU19MT0NLLCAicmVzOiBwdXRcbiIpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUlPQ1RMIHZpZGlvYyBoYW5kbGluZwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gKChzdHJ1Y3QgdG02MDAwX2ZoICopcHJpdiktPmRldjsKLQotCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgIlRyaWRlbnQgVFZNYXN0ZXIgVE01NjAwLzYwMDAvNjAxMCIsIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBUTTYwMDBfVkVSU0lPTjsKLQljYXAtPmNhcGFiaWxpdGllcyA9CVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAotCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAotCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfAotCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKLQotCWlmIChkZXYtPnR1bmVyX3R5cGUgIT0gVFVORVJfQUJTRU5UKQotCQljYXAtPmNhcGFiaWxpdGllcyB8PSBWNEwyX0NBUF9UVU5FUjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKLXsKLQlpZiAodW5saWtlbHkoZi0+aW5kZXggPj0gQVJSQVlfU0laRShmb3JtYXQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCBmb3JtYXRbZi0+aW5kZXhdLm5hbWUsIHNpemVvZihmLT5kZXNjcmlwdGlvbikpOwotCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0W2YtPmluZGV4XS5mb3VyY2M7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCi0JZi0+Zm10LnBpeC53aWR0aCAgICAgICAgPSBmaC0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OwotCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gZmgtPnZiX3ZpZHEuZmllbGQ7Ci0JZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBmaC0+Zm10LT5mb3VyY2M7Ci0JZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQotCQkoZi0+Zm10LnBpeC53aWR0aCAqIGZoLT5mbXQtPmRlcHRoKSA+PiAzOwotCWYtPmZtdC5waXguc2l6ZWltYWdlID0KLQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHRtNjAwMF9mbXQgKmZvcm1hdF9ieV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdCk7IGkrKykKLQkJaWYgKGZvcm1hdFtpXS5mb3VyY2MgPT0gZm91cmNjKQotCQkJcmV0dXJuIGZvcm1hdCtpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSAoKHN0cnVjdCB0bTYwMDBfZmggKilwcml2KS0+ZGV2OwotCXN0cnVjdCB0bTYwMDBfZm10ICpmbXQ7Ci0JZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwotCi0JZm10ID0gZm9ybWF0X2J5X2ZvdXJjYyhmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQlpZiAoTlVMTCA9PSBmbXQpIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfSU9DVExfQVJHLCAiRm91cmNjIGZvcm1hdCAoMHglMDh4KSIKLQkJCQkiIGludmFsaWQuXG4iLCBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCi0JaWYgKGZpZWxkID09IFY0TDJfRklFTERfQU5ZKQotCQlmaWVsZCA9IFY0TDJfRklFTERfU0VRX1RCOwotCWVsc2UgaWYgKFY0TDJfRklFTERfSU5URVJMQUNFRCAhPSBmaWVsZCkgewotCQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19JT0NUTF9BUkcsICJGaWVsZCB0eXBlIGludmFsaWQuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdG02MDAwX2dldF9zdGRfcmVzKGRldik7Ci0KLQlmLT5mbXQucGl4LndpZHRoICA9IGRldi0+d2lkdGg7Ci0JZi0+Zm10LnBpeC5oZWlnaHQgPSBkZXYtPmhlaWdodDsKLQotCWYtPmZtdC5waXgud2lkdGggJj0gfjB4MDE7Ci0KLQlmLT5mbXQucGl4LmZpZWxkID0gZmllbGQ7Ci0KLQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9Ci0JCShmLT5mbXQucGl4LndpZHRoICogZm10LT5kZXB0aCkgPj4gMzsKLQlmLT5mbXQucGl4LnNpemVpbWFnZSA9Ci0JCWYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLypGSVhNRTogVGhpcyBzZWVtcyB0byBiZSBnZW5lcmljIGVub3VnaCB0byBiZSBhdCB2aWRlb2RldjIgKi8KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQlpbnQgcmV0ID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBmaCwgZik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlmaC0+Zm10ICAgICAgICAgICA9IGZvcm1hdF9ieV9mb3VyY2MoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0JZmgtPndpZHRoICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOwotCWZoLT5oZWlnaHQgICAgICAgID0gZi0+Zm10LnBpeC5oZWlnaHQ7Ci0JZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCWZoLT50eXBlICAgICAgICAgID0gZi0+dHlwZTsKLQotCWRldi0+Zm91cmNjICAgICAgID0gZi0+Zm10LnBpeC5waXhlbGZvcm1hdDsKLQotCXRtNjAwMF9zZXRfZm91cmNjX2Zvcm1hdChkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCi0JcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoJmZoLT52Yl92aWRxLCBwKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfcXVlcnlidWYoJmZoLT52Yl92aWRxLCBwKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfcWJ1ZigmZmgtPnZiX3ZpZHEsIHApOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0KLQlyZXR1cm4gdmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAotCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgICAgPSBmaC0+ZGV2OwotCi0JaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGkgIT0gZmgtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFyZXNfZ2V0KGRldiwgZmgsIGZhbHNlKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlyZXR1cm4gdmlkZW9idWZfc3RyZWFtb24oJmZoLT52Yl92aWRxKTsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ICAgID0gZmgtPmRldjsKLQotCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpICE9IGZoLT50eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOwotCXJlc19mcmVlKGRldiwgZmgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqbm9ybSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWRldi0+bm9ybSA9ICpub3JtOwotCXJjID0gdG02MDAwX2luaXRfYW5hbG9nX21vZGUoZGV2KTsKLQotCWZoLT53aWR0aCAgPSBkZXYtPndpZHRoOwotCWZoLT5oZWlnaHQgPSBkZXYtPmhlaWdodDsKLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCBjb3JlLCBzX3N0ZCwgZGV2LT5ub3JtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKLQlbVE02MDAwX0lOUFVUX1RWXSA9ICJUZWxldmlzaW9uIiwKLQlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTFdID0gIkNvbXBvc2l0ZSAxIiwKLQlbVE02MDAwX0lOUFVUX0NPTVBPU0lURTJdID0gIkNvbXBvc2l0ZSAyIiwKLQlbVE02MDAwX0lOUFVUX1NWSURFT10gPSAiUy1WaWRlbyIsCi19OwotCi1zdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQl1bnNpZ25lZCBpbnQgbjsKLQotCW4gPSBpLT5pbmRleDsKLQlpZiAobiA+PSAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGV2LT52aW5wdXRbbl0udHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpLT5pbmRleCA9IG47Ci0KLQlpZiAoZGV2LT52aW5wdXRbbl0udHlwZSA9PSBUTTYwMDBfSU5QVVRfVFYpCi0JCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7Ci0JZWxzZQotCQlpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQotCXN0cmNweShpLT5uYW1lLCBpbmFtZVtkZXYtPnZpbnB1dFtuXS50eXBlXSk7Ci0KLQlpLT5zdGQgPSBUTTYwMDBfU1REOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQkqaSA9IGRldi0+aW5wdXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAgICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCWludCByYyA9IDA7Ci0KLQlpZiAoaSA+PSAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWRldi0+dmlucHV0W2ldLnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2LT5pbnB1dCA9IGk7Ci0KLQlyYyA9IHZpZGlvY19zX3N0ZChmaWxlLCBwcml2LCAmZGV2LT52ZmQtPmN1cnJlbnRfbm9ybSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRtNjAwMF9xY3RybCk7IGkrKykKLQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdG02MDAwX3FjdHJsW2ldLmlkKSB7Ci0JCQltZW1jcHkocWMsICYodG02MDAwX3FjdHJsW2ldKSwKLQkJCQlzaXplb2YoKnFjKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCB0bTYwMDBfZmggICpmaCA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgICAgPSBmaC0+ZGV2OwotCWludCAgdmFsOwotCi0JLyogRklYTUU6IFByb2JhYmx5LCB0aG9zZSB3b24ndCB3b3JrISBNYXliZSB3ZSBuZWVkIHNoYWRvdyByZWdzICovCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwOF9MVU1BX0NPTlRSQVNUX0FESiwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCXZhbCA9IHRtNjAwMF9nZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQV9DSFJPTUFfU0FUVVJBVElPTl9BREosIDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJdmFsID0gdG02MDAwX2dldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBCX0NIUk9NQV9IVUVfUEhBU0VfQURKLCAwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQl2YWwgPSBkZXYtPmN0bF9tdXRlOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJdmFsID0gZGV2LT5jdGxfdm9sdW1lOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQotCWN0cmwtPnZhbHVlID0gdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCXU4ICB2YWwgPSBjdHJsLT52YWx1ZTsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQl0bTYwMDBfc2V0X3JlZyhkZXYsIFRNNjAxMF9SRVEwN19SMDhfTFVNQV9DT05UUkFTVF9BREosIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjA5X0xVTUFfQlJJR0hUTkVTU19BREosIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJdG02MDAwX3NldF9yZWcoZGV2LCBUTTYwMTBfUkVRMDdfUjBBX0NIUk9NQV9TQVRVUkFUSU9OX0FESiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9IVUU6Ci0JCXRtNjAwMF9zZXRfcmVnKGRldiwgVE02MDEwX1JFUTA3X1IwQl9DSFJPTUFfSFVFX1BIQVNFX0FESiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlkZXYtPmN0bF9tdXRlID0gdmFsOwotCQl0bTYwMDBfdHZhdWRpb19zZXRfbXV0ZShkZXYsIHZhbCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQlkZXYtPmN0bF92b2x1bWUgPSB2YWw7Ci0JCXRtNjAwMF9zZXRfdm9sdW1lKGRldiwgdmFsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RyY3B5KHQtPm5hbWUsICJUZWxldmlzaW9uIik7Ci0JdC0+dHlwZSAgICAgICA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCXQtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9OT1JNOwotCXQtPnJhbmdlaGlnaCAgPSAweGZmZmZmZmZmVUw7Ci0JdC0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ190dW5lciwgdCk7Ci0KLQl0LT5hdWRtb2RlID0gZGV2LT5hbW9kZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoMCAhPSB0LT5pbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYtPmFtb2RlID0gdC0+YXVkbW9kZTsKLQlkcHJpbnRrKGRldiwgMywgImF1ZGlvIG1vZGU6ICV4XG4iLCB0LT5hdWRtb2RlKTsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc190dW5lciwgdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAqZmggID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAodW5saWtlbHkoVU5TRVQgPT0gZGV2LT50dW5lcl90eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwotCWYtPmZyZXF1ZW5jeSA9IGRldi0+ZnJlcTsKLQotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgZ19mcmVxdWVuY3ksIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgKmZoICA9IHByaXY7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKHVubGlrZWx5KFVOU0VUID09IGRldi0+dHVuZXJfdHlwZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh1bmxpa2VseShmLT50dW5lciAhPSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKDAgPT0gZmgtPnJhZGlvICYmIFY0TDJfVFVORVJfQU5BTE9HX1RWICE9IGYtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICgxID09IGZoLT5yYWRpbyAmJiBWNEwyX1RVTkVSX1JBRElPICE9IGYtPnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2LT5mcmVxID0gZi0+ZnJlcXVlbmN5OwotCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19mcmVxdWVuY3ksIGYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlzdHJjcHkoY2FwLT5kcml2ZXIsICJ0bTYwMDAiKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSk7Ci0Jc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiVVNCJTA0eDolMDR4IiwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJbGUxNl90b19jcHUoZGV2LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwotCWNhcC0+dmVyc2lvbiA9IGRldi0+ZGV2X3R5cGU7Ci0JY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8Ci0JCQlWNEwyX0NBUF9BVURJTyAgICAgfAotCQkJVjRMMl9DQVBfUkFESU8gICAgIHwKLQkJCVY0TDJfQ0FQX1JFQURXUklURSB8Ci0JCQlWNEwyX0NBUF9TVFJFQU1JTkc7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoMCAhPSB0LT5pbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7Ci0Jc3RyY3B5KHQtPm5hbWUsICJSYWRpbyIpOwotCXQtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0KLQl2NGwyX2RldmljZV9jYWxsX2FsbCgmZGV2LT52NGwyX2RldiwgMCwgdHVuZXIsIGdfdHVuZXIsIHQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9jb3JlICpkZXYgPSBmaC0+ZGV2OwotCi0JaWYgKDAgIT0gdC0+aW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdjRsMl9kZXZpY2VfY2FsbF9hbGwoJmRldi0+djRsMl9kZXYsIDAsIHR1bmVyLCBzX3R1bmVyLCB0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppKQotewotCXN0cnVjdCB0bTYwMDBfZmggKmZoID0gcHJpdjsKLQlzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiA9IGZoLT5kZXY7Ci0KLQlpZiAoaS0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWRldi0+cmlucHV0LnR5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RyY3B5KGktPm5hbWUsICJSYWRpbyIpOwotCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWlmIChkZXYtPmlucHV0ICE9IDUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JKmkgPSBkZXYtPmlucHV0IC0gNTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQotewotCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKLQlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmFkaW9fc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAqZmggPSBwcml2OwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gZmgtPmRldjsKLQotCWlmIChpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGV2LT5yaW5wdXQudHlwZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYtPmlucHV0ID0gaSArIDU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByYWRpb19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpub3JtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhZGlvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjKQotewotCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKLQotCWlmIChjLT5pZCA8ICBWNEwyX0NJRF9CQVNFIHx8Ci0JICAgIGMtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGMtPmlkID09IFY0TDJfQ0lEX0FVRElPX01VVEUpIHsKLQkJY3RybCA9IGN0cmxfYnlfaWQoYy0+aWQpOwotCQkqYyA9ICpjdHJsOwotCX0gZWxzZQotCQkqYyA9IG5vX2N0cmw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRmlsZSBvcGVyYXRpb25zIGZvciB0aGUgZGV2aWNlCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHRtNjAwMF9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCB0bTYwMDBfY29yZSAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdG02MDAwX2ZoICpmaDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlpbnQgaSwgcmM7Ci0JaW50IHJhZGlvID0gMDsKLQotCXByaW50ayhLRVJOX0lORk8gInRtNjAwMDogb3BlbiBjYWxsZWQgKGRldj0lcylcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInRtNjAwMDogb3BlbiBjYWxsZWQgKGRldj0lcylcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOwotCi0Jc3dpdGNoICh2ZGV2LT52ZmxfdHlwZSkgewotCWNhc2UgVkZMX1RZUEVfR1JBQkJFUjoKLQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkxfVFlQRV9WQkk6Ci0JCXR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOwotCQlicmVhazsKLQljYXNlIFZGTF9UWVBFX1JBRElPOgotCQlyYWRpbyA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCS8qIElmIG1vcmUgdGhhbiBvbmUgdXNlciwgbXV0ZXggc2hvdWxkIGJlIGFkZGVkICovCi0JZGV2LT51c2VycysrOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgIm9wZW4gZGV2PSVzIHR5cGU9JXMgdXNlcnM9JWRcbiIsCi0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldiksIHY0bDJfdHlwZV9uYW1lc1t0eXBlXSwKLQkJZGV2LT51c2Vycyk7Ci0KLQkvKiBhbGxvY2F0ZSArIGluaXRpYWxpemUgcGVyIGZpbGVoYW5kbGUgZGF0YSAqLwotCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpIHsKLQkJZGV2LT51c2Vycy0tOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQlmaC0+ZGV2ICAgICAgPSBkZXY7Ci0JZmgtPnJhZGlvICAgID0gcmFkaW87Ci0JZGV2LT5yYWRpbyAgID0gcmFkaW87Ci0JZmgtPnR5cGUgICAgID0gdHlwZTsKLQlkZXYtPmZvdXJjYyAgPSBmb3JtYXRbMF0uZm91cmNjOwotCi0JZmgtPmZtdCAgICAgID0gZm9ybWF0X2J5X2ZvdXJjYyhkZXYtPmZvdXJjYyk7Ci0KLQl0bTYwMDBfZ2V0X3N0ZF9yZXMoZGV2KTsKLQotCWZoLT53aWR0aCAgICA9IGRldi0+d2lkdGg7Ci0JZmgtPmhlaWdodCAgID0gZGV2LT5oZWlnaHQ7Ci0KLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogZmg9MHglMDhseCwgZGV2PTB4JTA4bHgsICIKLQkJCQkJCSJkZXYtPnZpZHE9MHglMDhseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcpZmgsICh1bnNpZ25lZCBsb25nKWRldiwgKHVuc2lnbmVkIGxvbmcpJmRldi0+dmlkcSk7Ci0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgIk9wZW46IGxpc3RfZW1wdHkgIgotCQkJCSJxdWV1ZWQ9JWRcbiIsIGxpc3RfZW1wdHkoJmRldi0+dmlkcS5xdWV1ZWQpKTsKLQlkcHJpbnRrKGRldiwgVjRMMl9ERUJVR19PUEVOLCAiT3BlbjogbGlzdF9lbXB0eSAiCi0JCQkJImFjdGl2ZT0lZFxuIiwgbGlzdF9lbXB0eSgmZGV2LT52aWRxLmFjdGl2ZSkpOwotCi0JLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSBvbiBhbmFsb2cgbW9kZSAqLwotCXJjID0gdG02MDAwX2luaXRfYW5hbG9nX21vZGUoZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoZGV2LT5tb2RlICE9IFRNNjAwMF9NT0RFX0FOQUxPRykgewotCQkvKiBQdXQgYWxsIGNvbnRyb2xzIGF0IGEgc2FuZSBzdGF0ZSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0bTYwMDBfcWN0cmwpOyBpKyspCi0JCQlxY3RsX3JlZ3NbaV0gPSB0bTYwMDBfcWN0cmxbaV0uZGVmYXVsdF92YWx1ZTsKLQotCQlkZXYtPm1vZGUgPSBUTTYwMDBfTU9ERV9BTkFMT0c7Ci0JfQotCi0JdmlkZW9idWZfcXVldWVfdm1hbGxvY19pbml0KCZmaC0+dmJfdmlkcSwgJnRtNjAwMF92aWRlb19xb3BzLAotCQkJTlVMTCwgJmRldi0+c2xvY2ssCi0JCQlmaC0+dHlwZSwKLQkJCVY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCXNpemVvZihzdHJ1Y3QgdG02MDAwX2J1ZmZlciksIGZoLCAmZGV2LT5sb2NrKTsKLQotCWlmIChmaC0+cmFkaW8pIHsKLQkJZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInZpZGVvX29wZW46IHNldHRpbmcgcmFkaW8gZGV2aWNlXG4iKTsKLQkJZGV2LT5pbnB1dCA9IDU7Ci0JCXRtNjAwMF9zZXRfYXVkaW9fcmlucHV0KGRldik7Ci0JCXY0bDJfZGV2aWNlX2NhbGxfYWxsKCZkZXYtPnY0bDJfZGV2LCAwLCB0dW5lciwgc19yYWRpbyk7Ci0JCXRtNjAwMF9wcmVwYXJlX2lzb2MoZGV2KTsKLQkJdG02MDAwX3N0YXJ0X3RocmVhZChkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdAotdG02MDAwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCB0bTYwMDBfZmggICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJaWYgKCFyZXNfZ2V0KGZoLT5kZXYsIGZoLCB0cnVlKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJcmV0dXJuIHZpZGVvYnVmX3JlYWRfc3RyZWFtKCZmaC0+dmJfdmlkcSwgZGF0YSwgY291bnQsIHBvcywgMCwKLQkJCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdG02MDAwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHRtNjAwMF9idWZmZXIgICAgKmJ1ZjsKLQotCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgIT0gZmgtPnR5cGUpCi0JCXJldHVybiBQT0xMRVJSOwotCi0JaWYgKCEhaXNfcmVzX3N0cmVhbWluZyhmaC0+ZGV2LCBmaCkpCi0JCXJldHVybiBQT0xMRVJSOwotCi0JaWYgKCFpc19yZXNfcmVhZChmaC0+ZGV2LCBmaCkpIHsKLQkJLyogc3RyZWFtaW5nIGNhcHR1cmUgKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmZoLT52Yl92aWRxLnN0cmVhbSkpCi0JCQlyZXR1cm4gUE9MTEVSUjsKLQkJYnVmID0gbGlzdF9lbnRyeShmaC0+dmJfdmlkcS5zdHJlYW0ubmV4dCwgc3RydWN0IHRtNjAwMF9idWZmZXIsIHZiLnN0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJLyogcmVhZCgpIGNhcHR1cmUgKi8KLQkJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGUsICZmaC0+dmJfdmlkcSwKLQkJCQkJICAgIHdhaXQpOwotCX0KLQlwb2xsX3dhaXQoZmlsZSwgJmJ1Zi0+dmIuZG9uZSwgd2FpdCk7Ci0JaWYgKGJ1Zi0+dmIuc3RhdGUgPT0gVklERU9CVUZfRE9ORSB8fAotCSAgICBidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0VSUk9SKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0bTYwMDBfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdG02MDAwX2ZoICAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICpkZXYgPSBmaC0+ZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCi0JZHByaW50ayhkZXYsIFY0TDJfREVCVUdfT1BFTiwgInRtNjAwMDogY2xvc2UgY2FsbGVkIChkZXY9JXMsIHVzZXJzPSVkKVxuIiwKLQkJdmlkZW9fZGV2aWNlX25vZGVfbmFtZSh2ZGV2KSwgZGV2LT51c2Vycyk7Ci0KLQlkZXYtPnVzZXJzLS07Ci0KLQlyZXNfZnJlZShkZXYsIGZoKTsKLQlpZiAoIWRldi0+dXNlcnMpIHsKLQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7Ci0JCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZiX3ZpZHEpOwotCX0KLQotCWtmcmVlKGZoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRtNjAwMF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCi17Ci0Jc3RydWN0IHRtNjAwMF9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSB2aWRlb2J1Zl9tbWFwX21hcHBlcigmZmgtPnZiX3ZpZHEsIHZtYSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHRtNjAwMF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSB0bTYwMDBfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSB0bTYwMDBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLwotCS5yZWFkICAgICAgICAgICA9IHRtNjAwMF9yZWFkLAotCS5wb2xsCQk9IHRtNjAwMF9wb2xsLAotCS5tbWFwCQk9IHRtNjAwMF9tbWFwLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcCAgICAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAgPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgID0gdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfZW51bV9pbnB1dCAgICAgICAgPSB2aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQgICAgICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19zX2lucHV0LAotCS52aWRpb2NfcXVlcnljdHJsICAgICAgICAgPSB2aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsICAgICAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsICAgICAgICAgICAgPSB2aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfZ190dW5lciAgICAgICAgICAgPSB2aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgICAgICAgICAgID0gdmlkaW9jX3NfdHVuZXIsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSAgICAgICA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX3NfZnJlcXVlbmN5LAotCS52aWRpb2Nfc3RyZWFtb24gICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgICAgICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19yZXFidWZzICAgICAgICAgICA9IHZpZGlvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYgICAgICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmICAgICAgICAgICAgICA9IHZpZGlvY19xYnVmLAotCS52aWRpb2NfZHFidWYgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCi19OwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB0bTYwMDBfdGVtcGxhdGUgPSB7Ci0JLm5hbWUJCT0gInRtNjAwMCIsCi0JLmZvcHMgICAgICAgICAgID0gJnRtNjAwMF9mb3BzLAotCS5pb2N0bF9vcHMgICAgICA9ICZ2aWRlb19pb2N0bF9vcHMsCi0JLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKLQkudHZub3JtcyAgICAgICAgPSBUTTYwMDBfU1RELAotCS5jdXJyZW50X25vcm0gICA9IFY0TDJfU1REX05UU0NfTSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgcmFkaW9fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gdG02MDAwX29wZW4sCi0JLnJlbGVhc2UJPSB0bTYwMDBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHJhZGlvX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwCT0gcmFkaW9fcXVlcnljYXAsCi0JLnZpZGlvY19nX3R1bmVyCQk9IHJhZGlvX2dfdHVuZXIsCi0JLnZpZGlvY19lbnVtX2lucHV0CT0gcmFkaW9fZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfYXVkaW8JCT0gcmFkaW9fZ19hdWRpbywKLQkudmlkaW9jX3NfdHVuZXIJCT0gcmFkaW9fc190dW5lciwKLQkudmlkaW9jX3NfYXVkaW8JCT0gcmFkaW9fc19hdWRpbywKLQkudmlkaW9jX3NfaW5wdXQJCT0gcmFkaW9fc19pbnB1dCwKLQkudmlkaW9jX3Nfc3RkCQk9IHJhZGlvX3Nfc3RkLAotCS52aWRpb2NfcXVlcnljdHJsCT0gcmFkaW9fcXVlcnljdHJsLAotCS52aWRpb2NfZ19pbnB1dAkJPSByYWRpb19nX2lucHV0LAotCS52aWRpb2NfZ19jdHJsCQk9IHZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCT0gdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX2dfZnJlcXVlbmN5CT0gdmlkaW9jX2dfZnJlcXVlbmN5LAotCS52aWRpb2Nfc19mcmVxdWVuY3kJPSB2aWRpb2Nfc19mcmVxdWVuY3ksCi19OwotCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlIHRtNjAwMF9yYWRpb190ZW1wbGF0ZSA9IHsKLQkubmFtZQkJCT0gInRtNjAwMCIsCi0JLmZvcHMJCQk9ICZyYWRpb19mb3BzLAotCS5pb2N0bF9vcHMJCT0gJnJhZGlvX2lvY3RsX29wcywKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglJbml0aWFsaXphdGlvbiBhbmQgbW9kdWxlIHN0dWZmCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldl9pbml0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LAotCQljb25zdCBzdHJ1Y3QgdmlkZW9fZGV2aWNlCi0JCSp0ZW1wbGF0ZSwgY29uc3QgY2hhciAqdHlwZV9uYW1lKQotewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKLQotCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmIChOVUxMID09IHZmZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkqdmZkID0gKnRlbXBsYXRlOwotCXZmZC0+djRsMl9kZXYgPSAmZGV2LT52NGwyX2RldjsKLQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKLQl2ZmQtPmRlYnVnID0gdG02MDAwX2RlYnVnOwotCXZmZC0+bG9jayA9ICZkZXYtPmxvY2s7Ci0KLQlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMgJXMiLCBkZXYtPm5hbWUsIHR5cGVfbmFtZSk7Ci0KLQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7Ci0JcmV0dXJuIHZmZDsKLX0KLQotaW50IHRtNjAwMF92NGwyX3JlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCWludCByZXQgPSAtMTsKLQotCWRldi0+dmZkID0gdmRldl9pbml0KGRldiwgJnRtNjAwMF90ZW1wbGF0ZSwgInZpZGVvIik7Ci0KLQlpZiAoIWRldi0+dmZkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBpbml0IHZpZGVvIGRtYSBxdWV1ZXMgKi8KLQlJTklUX0xJU1RfSEVBRCgmZGV2LT52aWRxLmFjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+dmlkcS5xdWV1ZWQpOwotCi0JcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkLCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgdmlkZW9fZGV2aWNlX25vZGVfbmFtZShkZXYtPnZmZCkpOwotCi0JaWYgKGRldi0+Y2Fwcy5oYXNfcmFkaW8pIHsKLQkJZGV2LT5yYWRpb19kZXYgPSB2ZGV2X2luaXQoZGV2LCAmdG02MDAwX3JhZGlvX3RlbXBsYXRlLAotCQkJCQkJCSAgICJyYWRpbyIpOwotCQlpZiAoIWRldi0+cmFkaW9fZGV2KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcmVnaXN0ZXIgcmFkaW8gZGV2aWNlXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gcmV0OyAvKiBGSVhNRSByZWxlYXNlIHJlc291cmNlICovCi0JCX0KLQotCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZGV2LT5yYWRpb19kZXYsIFZGTF9UWVBFX1JBRElPLAotCQkJCQkgICAgcmFkaW9fbnIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IHJlZ2lzdGVyIHJhZGlvIGRldmljZVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQkJcmV0dXJuIHJldDsgLyogRklYTUUgcmVsZWFzZSByZXNvdXJjZSAqLwotCQl9Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKGRldi0+cmFkaW9fZGV2KSk7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCBUVk1hc3RlciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IyIGJvYXJkIChMb2FkIHN0YXR1czogJWQpXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0bTYwMDBfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KQotewotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkKTsKLQotCWlmIChkZXYtPnJhZGlvX2RldikgewotCQlpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPnJhZGlvX2RldikpCi0JCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnJhZGlvX2Rldik7Ci0JCWVsc2UKLQkJCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+cmFkaW9fZGV2KTsKLQkJZGV2LT5yYWRpb19kZXYgPSBOVUxMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1tb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHZpZGVvX25yLCAiQWxsb3cgY2hhbmdpbmcgdmlkZW8gZGV2aWNlIG51bWJlciIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHRtNjAwMF9kZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJhY3RpdmF0ZXMgZGVidWcgaW5mbyIpOwotCi1tb2R1bGVfcGFyYW0odmlkX2xpbWl0LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh2aWRfbGltaXQsICJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmRhNjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKgotICogIHRtNjAwMC5oIC0gZHJpdmVyIGZvciBUTTU2MDAvVE02MDAwL1RNNjAxMCBVU0IgdmlkZW8gY2FwdHVyZSBkZXZpY2VzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGVsIEx1ZHdpZyA8bWljaGVsLmx1ZHdpZ0BnbWFpbC5jb20+Ci0gKgktIERWQi1UIHN1cHBvcnQKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0vKiBVc2UgdGhlIHRtNjAwMC1oYWNrLCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gY29kZSBpKi8KLS8qICNkZWZpbmUgSEFDSyAxICovCi0KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLXZtYWxsb2MuaD4KLSNpbmNsdWRlICJ0bTYwMDAtdXNiLWlzb2MuaCIKLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgotI2luY2x1ZGUgImR2Yl9kZW11eC5oIgotI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotI2luY2x1ZGUgImRteGRldi5oIgotCi0jZGVmaW5lIFRNNjAwMF9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KLS8qIElucHV0cyAqLwotZW51bSB0bTYwMDBfaXR5cGUgewotCVRNNjAwMF9JTlBVVF9UVgk9IDEsCi0JVE02MDAwX0lOUFVUX0NPTVBPU0lURTEsCi0JVE02MDAwX0lOUFVUX0NPTVBPU0lURTIsCi0JVE02MDAwX0lOUFVUX1NWSURFTywKLQlUTTYwMDBfSU5QVVRfRFZCLAotCVRNNjAwMF9JTlBVVF9SQURJTywKLX07Ci0KLWVudW0gdG02MDAwX211eCB7Ci0JVE02MDAwX1ZNVVhfVklERU9fQSA9IDEsCi0JVE02MDAwX1ZNVVhfVklERU9fQiwKLQlUTTYwMDBfVk1VWF9WSURFT19BQiwKLQlUTTYwMDBfQU1VWF9BREMxLAotCVRNNjAwMF9BTVVYX0FEQzIsCi0JVE02MDAwX0FNVVhfU0lGMSwKLQlUTTYwMDBfQU1VWF9TSUYyLAotCVRNNjAwMF9BTVVYX0kyUywKLX07Ci0KLWVudW0gdG02MDAwX2RldnR5cGUgewotCVRNNjAwMCA9IDAsCi0JVE01NjAwLAotCVRNNjAxMCwKLX07Ci0KLXN0cnVjdCB0bTYwMDBfaW5wdXQgewotCWVudW0gdG02MDAwX2l0eXBlCXR5cGU7Ci0JZW51bSB0bTYwMDBfbXV4CQl2bXV4OwotCWVudW0gdG02MDAwX211eAkJYW11eDsKLQl1bnNpZ25lZCBpbnQJCXZfZ3BpbzsKLQl1bnNpZ25lZCBpbnQJCWFfZ3BpbzsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJQmFzaWMgc3RydWN0dXJlcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotc3RydWN0IHRtNjAwMF9mbXQgewotCWNoYXIgICpuYW1lOwotCXUzMiAgIGZvdXJjYzsgICAgICAgICAgLyogdjRsMiBmb3JtYXQgaWQgKi8KLQlpbnQgICBkZXB0aDsKLX07Ci0KLS8qIGJ1ZmZlciBmb3Igb25lIHZpZGVvIGZyYW1lICovCi1zdHJ1Y3QgdG02MDAwX2J1ZmZlciB7Ci0JLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLwotCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgdmI7Ci0KLQlzdHJ1Y3QgdG02MDAwX2ZtdCAgICAgICpmbXQ7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2RtYXF1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIGFjdGl2ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgIHF1ZXVlZDsKLQotCS8qIHRocmVhZCBmb3IgZ2VuZXJhdGluZyB2aWRlbyBzdHJlYW0qLwotCXN0cnVjdCB0YXNrX3N0cnVjdCAgICAgICAgICprdGhyZWFkOwotCXdhaXRfcXVldWVfaGVhZF90ICAgICAgICAgIHdxOwotCS8qIENvdW50ZXJzIHRvIGNvbnRyb2wgZnBzIHJhdGUgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICBpbmlfamlmZmllczsKLX07Ci0KLS8qIGRldmljZSBzdGF0ZXMgKi8KLWVudW0gdG02MDAwX2NvcmVfc3RhdGUgewotCURFVl9JTklUSUFMSVpFRCAgID0gMHgwMSwKLQlERVZfRElTQ09OTkVDVEVEICA9IDB4MDIsCi0JREVWX01JU0NPTkZJR1VSRUQgPSAweDA0LAotfTsKLQotLyogaW8gbWV0aG9kcyAqLwotZW51bSB0bTYwMDBfaW9fbWV0aG9kIHsKLQlJT19OT05FLAotCUlPX1JFQUQsCi0JSU9fTU1BUCwKLX07Ci0KLWVudW0gdG02MDAwX21vZGUgewotCVRNNjAwMF9NT0RFX1VOS05PV04gPSAwLAotCVRNNjAwMF9NT0RFX0FOQUxPRywKLQlUTTYwMDBfTU9ERV9ESUdJVEFMLAotfTsKLQotc3RydWN0IHRtNjAwMF9ncGlvIHsKLQlpbnQJCXR1bmVyX3Jlc2V0OwotCWludAkJdHVuZXJfb247Ci0JaW50CQlkZW1vZF9yZXNldDsKLQlpbnQJCWRlbW9kX29uOwotCWludAkJcG93ZXJfbGVkOwotCWludAkJZHZiX2xlZDsKLQlpbnQJCWlyOwotfTsKLQotc3RydWN0IHRtNjAwMF9jYXBhYmlsaXRpZXMgewotCXVuc2lnbmVkIGludCAgICBoYXNfdHVuZXI6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX3RkYTk4NzQ6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX2R2YjoxOwotCXVuc2lnbmVkIGludCAgICBoYXNfemwxMDM1MzoxOwotCXVuc2lnbmVkIGludCAgICBoYXNfZWVwcm9tOjE7Ci0JdW5zaWduZWQgaW50ICAgIGhhc19yZW1vdGU6MTsKLQl1bnNpZ25lZCBpbnQgICAgaGFzX3JhZGlvOjE7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2R2YiB7Ci0Jc3RydWN0IGR2Yl9hZGFwdGVyCWFkYXB0ZXI7Ci0Jc3RydWN0IGR2Yl9kZW11eAlkZW11eDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kCSpmcm9udGVuZDsKLQlzdHJ1Y3QgZG14ZGV2CQlkbXhkZXY7Ci0JdW5zaWduZWQgaW50CQlzdHJlYW1zOwotCXN0cnVjdCB1cmIJCSpidWxrX3VyYjsKLQlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwotfTsKLQotc3RydWN0IHNuZF90bTYwMDBfY2FyZCB7Ci0Jc3RydWN0IHNuZF9jYXJkCQkJKmNhcmQ7Ci0Jc3BpbmxvY2tfdAkJCXJlZ19sb2NrOwotCXN0cnVjdCB0bTYwMDBfY29yZQkJKmNvcmU7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtCSpzdWJzdHJlYW07Ci0KLQkvKiB0ZW1wb3JhcnkgZGF0YSBmb3IgYnVmZmVyIGZpbGwgcHJvY2Vzc2luZyAqLwotCXVuc2lnbmVkCQkJYnVmX3BvczsKLQl1bnNpZ25lZAkJCXBlcmlvZF9wb3M7Ci19OwotCi1zdHJ1Y3QgdG02MDAwX2VuZHBvaW50IHsKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVuZHA7Ci0JX191OAkJCQliSW50ZXJmYWNlTnVtYmVyOwotCV9fdTgJCQkJYkFsdGVybmF0ZVNldHRpbmc7Ci0JdW5zaWduZWQJCQltYXhzaXplOwotfTsKLQotc3RydWN0IHRtNjAwMF9jb3JlIHsKLQkvKiBnZW5lcmljIGRldmljZSBwcm9wZXJ0aWVzICovCi0JY2hhcgkJCQluYW1lWzMwXTsJLyogbmFtZSAoaW5jbHVkaW5nIG1pbm9yKSBvZiB0aGUgZGV2aWNlICovCi0JaW50CQkJCW1vZGVsOwkJLyogaW5kZXggaW4gdGhlIGRldmljZV9kYXRhIHN0cnVjdCAqLwotCWludAkJCQlkZXZubzsJCS8qIG1hcmtzIHRoZSBudW1iZXIgb2YgdGhpcyBkZXZpY2UgKi8KLQllbnVtIHRtNjAwMF9kZXZ0eXBlCQlkZXZfdHlwZTsJLyogdHlwZSBvZiBkZXZpY2UgKi8KLQl1bnNpZ25lZCBjaGFyCQkJZWVkYXRhWzI1Nl07CS8qIEVlcHJvbSBkYXRhICovCi0JdW5zaWduZWQJCQllZWRhdGFfc2l6ZTsJLyogU2l6ZSBvZiB0aGUgZWVwcm9tIGluZm8gKi8KLQotCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgICAgICAgbm9ybTsgICAgICAgICAgIC8qIEN1cnJlbnQgbm9ybSAqLwotCWludAkJCQl3aWR0aCwgaGVpZ2h0OwkvKiBTZWxlY3RlZCByZXNvbHV0aW9uICovCi0KLQllbnVtIHRtNjAwMF9jb3JlX3N0YXRlCQlzdGF0ZTsKLQotCS8qIERldmljZSBDYXBhYmlsaXRpZXMqLwotCXN0cnVjdCB0bTYwMDBfY2FwYWJpbGl0aWVzCWNhcHM7Ci0KLQkvKiBUdW5lciBjb25maWd1cmF0aW9uICovCi0JaW50CQkJCXR1bmVyX3R5cGU7CQkvKiB0eXBlIG9mIHRoZSB0dW5lciAqLwotCWludAkJCQl0dW5lcl9hZGRyOwkJLyogdHVuZXIgYWRkcmVzcyAqLwotCi0Jc3RydWN0IHRtNjAwMF9ncGlvCQlncGlvOwotCi0JY2hhcgkJCQkqaXJfY29kZXM7Ci0KLQlfX3U4CQkJCXJhZGlvOwotCi0JLyogRGVtb2R1bGF0b3IgY29uZmlndXJhdGlvbiAqLwotCWludAkJCQlkZW1vZF9hZGRyOwkvKiBkZW1vZHVsYXRvciBhZGRyZXNzICovCi0KLQlpbnQJCQkJYXVkaW9fYml0cmF0ZTsKLQkvKiBpMmMgaS9vICovCi0Jc3RydWN0IGkyY19hZGFwdGVyCQlpMmNfYWRhcDsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkJaTJjX2NsaWVudDsKLQotCi0JLyogZXh0ZW5zaW9uICovCi0Jc3RydWN0IGxpc3RfaGVhZAkJZGV2bGlzdDsKLQotCS8qIHZpZGVvIGZvciBsaW51eCAqLwotCWludAkJCQl1c2VyczsKLQotCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KLQlzdHJ1Y3QgdG02MDAwX2ZoCQkqcmVzb3VyY2VzOwkvKiBQb2ludHMgdG8gZmggdGhhdCBpcyBzdHJlYW1pbmcgKi8KLQlib29sCQkJCWlzX3Jlc19yZWFkOwotCi0Jc3RydWN0IHZpZGVvX2RldmljZQkJKnZmZDsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlCQkqcmFkaW9fZGV2OwotCXN0cnVjdCB0bTYwMDBfZG1hcXVldWUJCXZpZHE7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlCQl2NGwyX2RldjsKLQotCWludAkJCQlpbnB1dDsKLQlzdHJ1Y3QgdG02MDAwX2lucHV0CQl2aW5wdXRbM107CS8qIHZpZGVvIGlucHV0ICovCi0Jc3RydWN0IHRtNjAwMF9pbnB1dAkJcmlucHV0OwkJLyogcmFkaW8gaW5wdXQgKi8KLQotCWludAkJCQlmcmVxOwotCXVuc2lnbmVkIGludAkJCWZvdXJjYzsKLQotCWVudW0gdG02MDAwX21vZGUJCW1vZGU7Ci0KLQlpbnQJCQkJY3RsX211dGU7ICAgICAgICAgICAgIC8qIGF1ZGlvICovCi0JaW50CQkJCWN0bF92b2x1bWU7Ci0JaW50CQkJCWFtb2RlOwotCi0JLyogRFZCLVQgc3VwcG9ydCAqLwotCXN0cnVjdCB0bTYwMDBfZHZiCQkqZHZiOwotCi0JLyogYXVkaW8gc3VwcG9ydCAqLwotCXN0cnVjdCBzbmRfdG02MDAwX2NhcmQJCSphZGV2OwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJd3FfdHJpZ2dlcjsgICAvKiBUcmlnZ2VyIHRvIHN0YXJ0L3N0b3AgYXVkaW8gZm9yIGFsc2EgbW9kdWxlICovCi0JYXRvbWljX3QJCQlzdHJlYW1fc3RhcnRlZDsgIC8qIHN0cmVhbSBzaG91bGQgYmUgcnVubmluZyBpZiB0cnVlICovCi0KLQlzdHJ1Y3QgdG02MDAwX0lSCQkqaXI7Ci0KLQkvKiBsb2NrcyAqLwotCXN0cnVjdCBtdXRleAkJCWxvY2s7Ci0KLQkvKiB1c2IgdHJhbnNmZXIgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZQkJKnVkZXY7CQkvKiB0aGUgdXNiIGRldmljZSAqLwotCi0Jc3RydWN0IHRtNjAwMF9lbmRwb2ludAkJYnVsa19pbiwgYnVsa19vdXQsIGlzb2NfaW4sIGlzb2Nfb3V0OwotCXN0cnVjdCB0bTYwMDBfZW5kcG9pbnQJCWludF9pbiwgaW50X291dDsKLQotCS8qIHNjYWxlciE9MCBpZiBzY2FsZXIgaXMgYWN0aXZlKi8KLQlpbnQJCQkJc2NhbGVyOwotCi0JCS8qIElzb2MgY29udHJvbCBzdHJ1Y3QgKi8KLQlzdHJ1Y3QgdXNiX2lzb2NfY3RsICAgICAgICAgIGlzb2NfY3RsOwotCi0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICBzbG9jazsKLX07Ci0KLWVudW0gdG02MDAwX29wc190eXBlIHsKLQlUTTYwMDBfQVVESU8gPSAweDEwLAotCVRNNjAwMF9EVkIgPSAweDIwLAotfTsKLQotc3RydWN0IHRtNjAwMF9vcHMgewotCXN0cnVjdCBsaXN0X2hlYWQJbmV4dDsKLQljaGFyCQkJKm5hbWU7Ci0JZW51bSB0bTYwMDBfb3BzX3R5cGUJdHlwZTsKLQlpbnQgKCppbml0KShzdHJ1Y3QgdG02MDAwX2NvcmUgKik7Ci0JaW50ICgqZmluaSkoc3RydWN0IHRtNjAwMF9jb3JlICopOwotCWludCAoKmZpbGxidWYpKHN0cnVjdCB0bTYwMDBfY29yZSAqLCBjaGFyICpidWYsIGludCBzaXplKTsKLX07Ci0KLXN0cnVjdCB0bTYwMDBfZmggewotCXN0cnVjdCB0bTYwMDBfY29yZSAgICAgICAgICAgKmRldjsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHJhZGlvOwotCi0JLyogdmlkZW8gY2FwdHVyZSAqLwotCXN0cnVjdCB0bTYwMDBfZm10ICAgICAgICAgICAgKmZtdDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7Ci0Jc3RydWN0IHZpZGVvYnVmX3F1ZXVlICAgICAgICB2Yl92aWRxOwotCi0JZW51bSB2NGwyX2J1Zl90eXBlICAgICAgICAgICB0eXBlOwotfTsKLQotI2RlZmluZSBUTTYwMDBfU1RECShWNEwyX1NURF9QQUx8VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfCAgICBcCi0JCQlWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfNjB8VjRMMl9TVERfTlRTQ19NfCBcCi0JCQlWNEwyX1NURF9OVFNDX01fSlB8VjRMMl9TVERfU0VDQU0pCi0KLS8qIEluIHRtNjAwMC1jYXJkcy5jICovCi0KLWludCB0bTYwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHRyLCBpbnQgY29tcG9uZW50LCBpbnQgY29tbWFuZCwgaW50IGFyZyk7Ci1pbnQgdG02MDAwX3hjNTAwMF9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21wb25lbnQsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKLWludCB0bTYwMDBfY2FyZHNfc2V0dXAoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfZmxhc2hfbGVkKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCBzdGF0ZSk7Ci0KLS8qIEluIHRtNjAwMC1jb3JlLmMgKi8KLQotaW50IHRtNjAwMF9yZWFkX3dyaXRlX3VzYihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxdHlwZSwgdTggcmVxLAotCQkJICAgdTE2IHZhbHVlLCB1MTYgaW5kZXgsIHU4ICpidWYsIHUxNiBsZW4pOwotaW50IHRtNjAwMF9nZXRfcmVnKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfZ2V0X3JlZzE2KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfZ2V0X3JlZzMyKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KTsKLWludCB0bTYwMDBfc2V0X3JlZyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCk7Ci1pbnQgdG02MDAwX3NldF9yZWdfbWFzayhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggcmVxLCB1MTYgdmFsdWUsCi0JCQkJCQl1MTYgaW5kZXgsIHUxNiBtYXNrKTsKLWludCB0bTYwMDBfaTJjX3Jlc2V0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2LCB1MTYgdHNsZWVwKTsKLWludCB0bTYwMDBfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLWludCB0bTYwMDBfaW5pdF9hbmFsb2dfbW9kZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX2luaXRfZGlnaXRhbF9tb2RlKHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLWludCB0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGludCBiaXRyYXRlKTsKLWludCB0bTYwMDBfc2V0X2F1ZGlvX3JpbnB1dChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3R2YXVkaW9fc2V0X211dGUoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIHU4IG11dGUpOwotdm9pZCB0bTYwMDBfc2V0X3ZvbHVtZShzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IHZvbCk7Ci0KLWludCB0bTYwMDBfdjRsMl9yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3Y0bDJfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3Y0bDJfZXhpdCh2b2lkKTsKLXZvaWQgdG02MDAwX3NldF9mb3VyY2NfZm9ybWF0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLQotdm9pZCB0bTYwMDBfcmVtb3ZlX2Zyb21fZGV2bGlzdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci12b2lkIHRtNjAwMF9hZGRfaW50b19kZXZsaXN0KHN0cnVjdCB0bTYwMDBfY29yZSAqZGV2KTsKLWludCB0bTYwMDBfcmVnaXN0ZXJfZXh0ZW5zaW9uKHN0cnVjdCB0bTYwMDBfb3BzICpvcHMpOwotdm9pZCB0bTYwMDBfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9vcHMgKm9wcyk7Ci12b2lkIHRtNjAwMF9pbml0X2V4dGVuc2lvbihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci12b2lkIHRtNjAwMF9jbG9zZV9leHRlbnNpb24oc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9jYWxsX2ZpbGxidWYoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYsIGVudW0gdG02MDAwX29wc190eXBlIHR5cGUsCi0JCQljaGFyICpidWYsIGludCBzaXplKTsKLQotCi0vKiBJbiB0bTYwMDAtc3Rkcy5jICovCi12b2lkIHRtNjAwMF9nZXRfc3RkX3JlcyhzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX3NldF9zdGFuZGFyZChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLS8qIEluIHRtNjAwMC1pMmMuYyAqLwotaW50IHRtNjAwMF9pMmNfcmVnaXN0ZXIoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotaW50IHRtNjAwMF9pMmNfdW5yZWdpc3RlcihzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci0KLS8qIEluIHRtNjAwMC1xdWV1ZS5jICovCi0KLWludCB0bTYwMDBfdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KLWludCB0bTYwMDBfdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIGkpOwotaW50IHRtNjAwMF92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSBpKTsKLWludCB0bTYwMDBfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYik7Ci1pbnQgdG02MDAwX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Ci1pbnQgdG02MDAwX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwotaW50IHRtNjAwMF92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7Ci1zc2l6ZV90IHRtNjAwMF92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICpmX3Bvcyk7Ci11bnNpZ25lZCBpbnQgdG02MDAwX3Y0bDJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Ci1pbnQgdG02MDAwX3F1ZXVlX2luaXQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotCi0vKiBJbiB0bTYwMDAtYWxzYS5jICovCi0vKmludCB0bTYwMDBfYXVkaW9faW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgaW50IGlkeCk7Ki8KLQotLyogSW4gdG02MDAwLWlucHV0LmMgKi8KLWludCB0bTYwMDBfaXJfaW5pdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldik7Ci1pbnQgdG02MDAwX2lyX2Zpbmkoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfaXJfd2FpdChzdHJ1Y3QgdG02MDAwX2NvcmUgKmRldiwgdTggc3RhdGUpOwotaW50IHRtNjAwMF9pcl9pbnRfc3RhcnQoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotdm9pZCB0bTYwMDBfaXJfaW50X3N0b3Aoc3RydWN0IHRtNjAwMF9jb3JlICpkZXYpOwotCi0vKiBEZWJ1ZyBzdHVmZiAqLwotCi1leHRlcm4gaW50IHRtNjAwMF9kZWJ1ZzsKLQotI2RlZmluZSBkcHJpbnRrKGRldiwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7XAotCWlmICh0bTYwMDBfZGVidWcgJiBsZXZlbCkgXAotCQlwcmludGsoS0VSTl9JTkZPICIoJWx1KSAlcyAlcyA6ImZtdCwgamlmZmllcywgXAotCQkJIGRldi0+bmFtZSwgX19GVU5DVElPTl9fICwgIyNhcmcpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFY0TDJfREVCVUdfUkVHCQkweDAwMDQKLSNkZWZpbmUgVjRMMl9ERUJVR19JMkMJCTB4MDAwOAotI2RlZmluZSBWNEwyX0RFQlVHX1FVRVVFCTB4MDAxMAotI2RlZmluZSBWNEwyX0RFQlVHX0lTT0MJCTB4MDAyMAotI2RlZmluZSBWNEwyX0RFQlVHX1JFU19MT0NLCTB4MDA0MAkvKiBSZXNvdXJjZSBsb2NraW5nICovCi0jZGVmaW5lIFY0TDJfREVCVUdfT1BFTgkJMHgwMDgwCS8qIHZpZGVvIG9wZW4vY2xvc2UgZGVidWcgKi8KLQotI2RlZmluZSB0bTYwMDBfZXJyKGZtdCwgYXJnLi4uKSBkbyB7XAotCXByaW50ayhLRVJOX0VSUiAidG02MDAwICVzIDoiZm10LCBcCi0JCV9fRlVOQ1RJT05fXyAsICMjYXJnKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uYwppbmRleCBmNGI1M2QxLi4zYjdhODQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYwppbmRleCBlY2QxODYyLi5kMzMyYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfZXZlbnQuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKaW5kZXggYTJlOGJkNC4uZjk1OGViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJtZHNfZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKaW5kZXggMzIxNTgwMi4uMmZhZWUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCkBAIC04Miw2ICs4Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCAzNmRiMjMxLi4yNzdlNDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtMTMwMCwyNyArMTMwMCwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IFhHSWZiX3Bhbl92YXIoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8sCi0JCQkgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCitzdGF0aWMgaW50IFhHSWZiX3Bhbl92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogeworCXN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvID0gaW5mby0+cGFyOwogCXVuc2lnbmVkIGludCBiYXNlOwogCiAJLyogcHJpbnRrKCJJbnNpZGUgcGFuX3ZhciIpOyAqLwogCi0JaWYgKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKLQkJLyogcHJpbnRrKCJQYW46IHhvOiAlZCB4diAlZCB4ciAlZFxuIiwKLQkJCXZhci0+eG9mZnNldCwgdmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eHJlcyk7ICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkgewotCQkvKiBwcmludGsoIlBhbjogeW86ICVkIHl2ICVkIHlyICVkXG4iLAotCQkJdmFyLT55b2Zmc2V0LCB2YXItPnlyZXNfdmlydHVhbCwgdmFyLT55cmVzKTsgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWJhc2UgPSB2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldDsKKwliYXNlID0gdmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldDsKIAogCS8qIGNhbGN1bGF0ZSBiYXNlIGJwcCBkZXAuICovCi0Jc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDE2OgogCQliYXNlID4+PSAxOwogCQlicmVhazsKQEAgLTE2MTUsMTMgKzE2MDUsMTIgQEAKIAkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbyA9IGluZm8tPnBhcjsKIAogCS8qIHByaW50aygiXG5JbnNpZGUgcGFuX2Rpc3BsYXk6XG4iKTsgKi8KIAotCWlmICh2YXItPnhvZmZzZXQgPiAodmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMpKQorCWlmICh2YXItPnhvZmZzZXQgPiAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAtIGluZm8tPnZhci54cmVzKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhci0+eW9mZnNldCA+ICh2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcykpCisJaWYgKHZhci0+eW9mZnNldCA+IChpbmZvLT52YXIueXJlc192aXJ0dWFsIC0gaW5mby0+dmFyLnlyZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKQEAgLTE2MzQsNyArMTYyMyw3IEBACiAJCQkJCQk+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZXJyID0gWEdJZmJfcGFuX3Zhcih4Z2lmYl9pbmZvLCB2YXIpOworCWVyciA9IFhHSWZiX3Bhbl92YXIodmFyLCBpbmZvKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKaW5kZXggYjk5MjZlZS4uMDlkZTk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCkBAIC01NTYsNyArNTU2LDcgQEAKIC8qCiAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBhbGwgenJhbSBJL08gcmVxdWVzdHMuCiAgKi8KLXN0YXRpYyBpbnQgenJhbV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCB6cmFtX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IHF1ZXVlLT5xdWV1ZWRhdGE7CiAKQEAgLTU3NSwxMyArNTc1LDEyIEBACiAJX196cmFtX21ha2VfcmVxdWVzdCh6cmFtLCBiaW8sIGJpb19kYXRhX2RpcihiaW8pKTsKIAl1cF9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogCiBlcnJvcl91bmxvY2s6CiAJdXBfcmVhZCgmenJhbS0+aW5pdF9sb2NrKTsKIGVycm9yOgogCWJpb19pb19lcnJvcihiaW8pOwotCXJldHVybiAwOwogfQogCiB2b2lkIF9fenJhbV9yZXNldF9kZXZpY2Uoc3RydWN0IHpyYW0gKnpyYW0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCmluZGV4IDRkMDE3NjguLjBmZDk2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KQEAgLTEwNzksNyArMTA4MCw5IEBACiAJICovCiAJaWYgKCFjbWQtPmltbWVkaWF0ZV9kYXRhKSB7CiAJCWNtZHNuX3JldCA9IGlzY3NpdF9zZXF1ZW5jZV9jbWQoY29ubiwgY21kLCBoZHItPmNtZHNuKTsKLQkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9FUlJPUl9DQU5OT1RfUkVDT1ZFUikKKwkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9MT1dFUl9USEFOX0VYUCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChjbWRzbl9yZXQgPT0gQ01EU05fRVJST1JfQ0FOTk9UX1JFQ09WRVIpCiAJCQlyZXR1cm4gaXNjc2l0X2FkZF9yZWplY3RfZnJvbV9jbWQoCiAJCQkJSVNDU0lfUkVBU09OX1BST1RPQ09MX0VSUk9SLAogCQkJCTEsIDAsIGJ1ZiwgY21kKTsKQEAgLTE4MTksMTcgKzE4MjIsMTYgQEAKIAkJaW50IGNtZHNuX3JldCA9IGlzY3NpdF9zZXF1ZW5jZV9jbWQoY29ubiwgY21kLCBoZHItPmNtZHNuKTsKIAkJaWYgKGNtZHNuX3JldCA9PSBDTURTTl9ISUdIRVJfVEhBTl9FWFApCiAJCQlvdXRfb2Zfb3JkZXJfY21kc24gPSAxOwotCQllbHNlIGlmIChjbWRzbl9yZXQgPT0gQ01EU05fTE9XRVJfVEhBTl9FWFApIHsKKwkJZWxzZSBpZiAoY21kc25fcmV0ID09IENNRFNOX0xPV0VSX1RIQU5fRVhQKQogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7IC8qIChjbWRzbl9yZXQgPT0gQ01EU05fRVJST1JfQ0FOTk9UX1JFQ09WRVIpICovCisJCWVsc2UgaWYgKGNtZHNuX3JldCA9PSBDTURTTl9FUlJPUl9DQU5OT1RfUkVDT1ZFUikKIAkJCXJldHVybiBpc2NzaXRfYWRkX3JlamVjdF9mcm9tX2NtZCgKIAkJCQkJSVNDU0lfUkVBU09OX1BST1RPQ09MX0VSUk9SLAogCQkJCQkxLCAwLCBidWYsIGNtZCk7Ci0JCX0KIAl9CiAJaXNjc2l0X2Fja19mcm9tX2V4cHN0YXRzbihjb25uLCBoZHItPmV4cF9zdGF0c24pOwogCi0JaWYgKG91dF9vZl9vcmRlcl9jbWRzbikKKwlpZiAob3V0X29mX29yZGVyX2NtZHNuIHx8ICEoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUF9JTU1FRElBVEUpKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIEZvdW5kIHRoZSByZWZlcmVuY2VkIHRhc2ssIHNlbmQgdG8gdHJhbnNwb3J0IGZvciBwcm9jZXNzaW5nLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwppbmRleCBmMTY0M2RiLi5kYjMyNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9iYXNlLmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfc3RhdC5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X3N0YXQuYwppbmRleCBiYmRiZTkzLi5mMWRiODMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfc3RhdC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9zdGF0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfcHJvdG8uaD4KICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oPgogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IGIxNWQ4Y2IuLjNkZjFjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwpAQCAtMTc0LDYgKzE3NCwyNCBAQAogCQlzZ2xfYmlkaSA9IHNkYi0+dGFibGUuc2dsOwogCQlzZ2xfYmlkaV9jb3VudCA9IHNkYi0+dGFibGUubmVudHM7CiAJfQorCS8qCisJICogQmVjYXVzZSBzb21lIHVzZXJzcGFjZSBjb2RlIHZpYSBzY3NpLWdlbmVyaWMgZG8gbm90IG1lbXNldCB0aGVpcgorCSAqIGFzc29jaWF0ZWQgcmVhZCBidWZmZXJzLCBnbyBhaGVhZCBhbmQgZG8gdGhhdCBoZXJlIGZvciB0eXBlCisJICogU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIuICBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseQorCSAqIGd1YXJhbnRlZWQgdG8gYmUgYSBzaW5nbGUgU0dMIGZvciBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQgorCSAqIGJ5IHRhcmdldCBjb3JlIGluIHRyYW5zcG9ydF9nZW5lcmljX2FsbG9jYXRlX3Rhc2tzKCkgLT4KKwkgKiB0cmFuc3BvcnRfZ2VuZXJpY19jbWRfc2VxdWVuY2VyKCkuCisJICovCisJaWYgKHNlX2NtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIgJiYKKwkgICAgc2VfY21kLT5kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjc2lfc2dsaXN0KHNjKTsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0ga21hcChzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0OworCisJCWlmIChidWYgIT0gTlVMTCkgeworCQkJbWVtc2V0KGJ1ZiwgMCwgc2ctPmxlbmd0aCk7CisJCQlrdW5tYXAoc2dfcGFnZShzZykpOworCQl9CisJfQogCiAJLyogVGVsbCB0aGUgY29yZSBhYm91dCBvdXIgcHJlYWxsb2NhdGVkIG1lbW9yeSAqLwogCXJldCA9IHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKHNlX2NtZCwgc2NzaV9zZ2xpc3Qoc2MpLApAQCAtMTg3LDcgKzIwNSw3IEBACiAvKgogICogQ2FsbGVkIGZyb20gc3RydWN0IHRhcmdldF9jb3JlX2ZhYnJpY19vcHMtPmNoZWNrX3N0b3BfZnJlZSgpCiAgKi8KLXN0YXRpYyB2b2lkIHRjbV9sb29wX2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCitzdGF0aWMgaW50IHRjbV9sb29wX2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCiB7CiAJLyoKIAkgKiBEbyBub3QgcmVsZWFzZSBzdHJ1Y3Qgc2VfY21kJ3MgY29udGFpbmluZyBhIHZhbGlkIFRNUgpAQCAtMTk1LDEyICsyMTMsMTMgQEAKIAkgKiB3aXRoIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCkuCiAJICovCiAJaWYgKHNlX2NtZC0+c2VfdG1yX3JlcSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAkvKgogCSAqIFJlbGVhc2UgdGhlIHN0cnVjdCBzZV9jbWQsIHdoaWNoIHdpbGwgbWFrZSBhIGNhbGxiYWNrIHRvIHJlbGVhc2UKIAkgKiBzdHJ1Y3QgdGNtX2xvb3BfY21kICogaW4gdGNtX2xvb3BfZGVhbGxvY2F0ZV9jb3JlX2NtZCgpCiAJICovCiAJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoc2VfY21kLCAwKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgdGNtX2xvb3BfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqc2VfY21kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jCmluZGV4IDhmNDQ0NzcuLjg4ZjJhZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKQEAgLTU4LDggKzU5LDkgQEAKICAqCiAgKiBTZWUgc3BjNHIxNyBzZWN0aW9uIDYuMjcKICAqLwotaW50IGNvcmVfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzKHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fZGV2ICpzdV9kZXYgPSBjbWQtPnNlX2Rldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdDEwX2FsdWFfdGdfcHRfZ3AgKnRnX3B0X2dwOwpAQCAtMTY0LDYgKzE2Niw4IEBACiAKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3Miw4ICsxNzYsOSBAQAogICoKICAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNi4zNQogICovCi1pbnQgY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqY21kKQoraW50IHRhcmdldF9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJc3RydWN0IHNlX3N1YnN5c3RlbV9kZXYgKnN1X2RldiA9IGRldi0+c2Vfc3ViX2RldjsKIAlzdHJ1Y3Qgc2VfcG9ydCAqcG9ydCwgKmxfcG9ydCA9IGNtZC0+c2VfbHVuLT5sdW5fc2VwOwpAQCAtMzQxLDcgKzM0Niw4IEBACiAKIG91dDoKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwotCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaCBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuaAppbmRleCBjODZmOTdhLi5jNWI0ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5oCkBAIC02Niw4ICs2Niw4IEBACiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnQxMF9hbHVhX3RnX3B0X2dwX2NhY2hlOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICp0MTBfYWx1YV90Z19wdF9ncF9tZW1fY2FjaGU7CiAKLWV4dGVybiBpbnQgY29yZV9lbXVsYXRlX3JlcG9ydF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqKTsKLWV4dGVybiBpbnQgY29yZV9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHMoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X2VtdWxhdGVfcmVwb3J0X3RhcmdldF9wb3J0X2dyb3VwcyhzdHJ1Y3Qgc2VfdGFzayAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X2VtdWxhdGVfc2V0X3RhcmdldF9wb3J0X2dyb3VwcyhzdHJ1Y3Qgc2VfdGFzayAqKTsKIGV4dGVybiBpbnQgY29yZV9hbHVhX2NoZWNrX25vbm9wX2RlbGF5KHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IGNvcmVfYWx1YV9kb19wb3J0X3RyYW5zaXRpb24oc3RydWN0IHQxMF9hbHVhX3RnX3B0X2dwICosCiAJCQkJc3RydWN0IHNlX2RldmljZSAqLCBzdHJ1Y3Qgc2VfcG9ydCAqLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYwppbmRleCAzODUzNWViMS4uNjgzYmEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDx0YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19vcHMuaD4KICNpbmNsdWRlICJ0YXJnZXRfY29yZV91YS5oIgorI2luY2x1ZGUgInRhcmdldF9jb3JlX2NkYi5oIgogCiBzdGF0aWMgdm9pZAogdGFyZ2V0X2ZpbGxfYWx1YV9kYXRhKHN0cnVjdCBzZV9wb3J0ICpwb3J0LCB1bnNpZ25lZCBjaGFyICpidWYpCkBAIC02NzksMTYgKzY4MCwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyICpjZGIgPSBjbWQtPnRfdGFza19jZGI7CiAJaW50IHAsIHJldDsKIAotCWlmICghKGNkYlsxXSAmIDB4MSkpCi0JCXJldHVybiB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5X3N0ZChjbWQpOworCWlmICghKGNkYlsxXSAmIDB4MSkpIHsKKwkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfaW5xdWlyeV9zdGQoY21kKTsKKwkJZ290byBvdXQ7CisJfQogCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSA0IGJ5dGVzIG9mIElOUVVJUlkgcmVzcG9uc2UKQEAgLTcwNywyMiArNzEwLDMwIEBACiAKIAlidWZbMF0gPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2RldmljZV90eXBlKGRldik7CiAKLQlmb3IgKHAgPSAwOyBwIDwgQVJSQVlfU0laRShldnBkX2hhbmRsZXJzKTsgKytwKQorCWZvciAocCA9IDA7IHAgPCBBUlJBWV9TSVpFKGV2cGRfaGFuZGxlcnMpOyArK3ApIHsKIAkJaWYgKGNkYlsyXSA9PSBldnBkX2hhbmRsZXJzW3BdLnBhZ2UpIHsKIAkJCWJ1ZlsxXSA9IGNkYlsyXTsKIAkJCXJldCA9IGV2cGRfaGFuZGxlcnNbcF0uZW11bGF0ZShjbWQsIGJ1Zik7Ci0JCQl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0X3VubWFwOwogCQl9CisJfQogCi0JdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAlwcl9lcnIoIlVua25vd24gVlBEIENvZGU6IDB4JTAyeFxuIiwgY2RiWzJdKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSAtRUlOVkFMOworCitvdXRfdW5tYXA6CisJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKK291dDoKKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLXRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eShzdHJ1Y3Qgc2VfY21kICpjbWQpCitpbnQgdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5KHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tzX2xvbmcgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpOwpAQCAtNzUxLDEyICs3NjIsMTQgQEAKIAogCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CiAKKwl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZWFkY2FwYWNpdHlfMTYoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja3MgPSBkZXYtPnRyYW5zcG9ydC0+Z2V0X2Jsb2NrcyhkZXYpOwpAQCAtNzg0LDYgKzc5Nyw4IEBACiAKIAl0cmFuc3BvcnRfa3VubWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyMiwxNCArOTM3LDE1IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9tb2Rlc2Vuc2Uoc3RydWN0IHNlX2NtZCAqY21kLCBpbnQgdGVuKQoraW50IHRhcmdldF9lbXVsYXRlX21vZGVzZW5zZShzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAljaGFyICpjZGIgPSBjbWQtPnRfdGFza19jZGI7CiAJdW5zaWduZWQgY2hhciAqcmJ1ZjsKIAlpbnQgdHlwZSA9IGRldi0+dHJhbnNwb3J0LT5nZXRfZGV2aWNlX3R5cGUoZGV2KTsKLQlpbnQgb2Zmc2V0ID0gKHRlbikgPyA4IDogNDsKKwlpbnQgdGVuID0gKGNtZC0+dF90YXNrX2NkYlswXSA9PSBNT0RFX1NFTlNFXzEwKTsKKwlpbnQgb2Zmc2V0ID0gdGVuID8gOCA6IDQ7CiAJaW50IGxlbmd0aCA9IDA7CiAJdW5zaWduZWQgY2hhciBidWZbU0VfTU9ERV9QQUdFX0JVRl07CiAKQEAgLTk5NSwxMiArMTAxMSwxNCBAQAogCW1lbWNweShyYnVmLCBidWYsIG9mZnNldCk7CiAJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAorCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV9yZXF1ZXN0X3NlbnNlKHN0cnVjdCBzZV9jbWQgKmNtZCkKK2ludCB0YXJnZXRfZW11bGF0ZV9yZXF1ZXN0X3NlbnNlKHN0cnVjdCBzZV90YXNrICp0YXNrKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXVuc2lnbmVkIGNoYXIgKmNkYiA9IGNtZC0+dF90YXNrX2NkYjsKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTggdWFfYXNjID0gMCwgdWFfYXNjcSA9IDA7CkBAIC0xMDU5LDcgKzEwNzcsOCBAQAogCiBlbmQ6CiAJdHJhbnNwb3J0X2t1bm1hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKLQorCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDY3LDggKzEwODYsNyBAQAogICogVXNlZCBmb3IgVENNL0lCTE9DSyBhbmQgVENNL0ZJTEVJTyBmb3IgYmxvY2svYmxrLWxpYi5jIGxldmVsIGRpc2NhcmQgc3VwcG9ydC4KICAqIE5vdGUgdGhpcyBpcyBub3QgdXNlZCBmb3IgVENNL3BTQ1NJIHBhc3N0aHJvdWdoCiAgKi8KLXN0YXRpYyBpbnQKLXRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKQoraW50IHRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwpAQCAtMTA3OSw2ICsxMDk3LDEyIEBACiAJaW50IHJldCA9IDAsIG9mZnNldDsKIAl1bnNpZ25lZCBzaG9ydCBkbCwgYmRfZGw7CiAKKwlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7CisJCXByX2VycigiVU5NQVAgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKKwkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwl9CisKIAkvKiBGaXJzdCBVTk1BUCBibG9jayBkZXNjcmlwdG9yIHN0YXJ0cyBhdCA4IGJ5dGUgb2Zmc2V0ICovCiAJb2Zmc2V0ID0gODsKIAlzaXplIC09IDg7CkBAIC0xMTEwLDcgKzExMzQsMTAgQEAKIAogZXJyOgogCXRyYW5zcG9ydF9rdW5tYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7Ci0KKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMTgsMTQgKzExNDUsMjggQEAKICAqIFVzZWQgZm9yIFRDTS9JQkxPQ0sgYW5kIFRDTS9GSUxFSU8gZm9yIGJsb2NrL2Jsay1saWIuYyBsZXZlbCBkaXNjYXJkIHN1cHBvcnQuCiAgKiBOb3RlIHRoaXMgaXMgbm90IHVzZWQgZm9yIFRDTS9wU0NTSSBwYXNzdGhyb3VnaAogICovCi1zdGF0aWMgaW50Ci10YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrLCB1MzIgbnVtX2Jsb2NrcykKK2ludCB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrKQogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OwogCXNlY3Rvcl90IHJhbmdlOwogCXNlY3Rvcl90IGxiYSA9IGNtZC0+dF90YXNrX2xiYTsKKwl1MzIgbnVtX2Jsb2NrczsKIAlpbnQgcmV0OworCisJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgeworCQlwcl9lcnIoIldSSVRFX1NBTUUgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCisJCQkJIiBmb3I6ICVzXG4iLCBkZXYtPnRyYW5zcG9ydC0+bmFtZSk7CisJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwl9CisKKwlpZiAoY21kLT50X3Rhc2tfY2RiWzBdID09IFdSSVRFX1NBTUUpCisJCW51bV9ibG9ja3MgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNtZC0+dF90YXNrX2NkYls3XSk7CisJZWxzZSBpZiAoY21kLT50X3Rhc2tfY2RiWzBdID09IFdSSVRFX1NBTUVfMTYpCisJCW51bV9ibG9ja3MgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmNtZC0+dF90YXNrX2NkYlsxMF0pOworCWVsc2UgLyogV1JJVEVfU0FNRV8zMiB2aWEgVkFSSUFCTEVfTEVOR1RIX0NNRCAqLworCQludW1fYmxvY2tzID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZjbWQtPnRfdGFza19jZGJbMjhdKTsKKwogCS8qCiAJICogVXNlIHRoZSBleHBsaWNpdCByYW5nZSB3aGVuIG5vbiB6ZXJvIGlzIHN1cHBsaWVkLCBvdGhlcndpc2UgY2FsY3VsYXRlCiAJICogdGhlIHJlbWFpbmluZyByYW5nZSBiYXNlZCBvbiAtPmdldF9ibG9ja3MoKSAtIHN0YXJ0aW5nIExCQS4KQEAgLTExNDQsMTI3ICsxMTg1LDMwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotdHJhbnNwb3J0X2VtdWxhdGVfY29udHJvbF9jZGIoc3RydWN0IHNlX3Rhc2sgKnRhc2spCitpbnQgdGFyZ2V0X2VtdWxhdGVfc3luY2hyb25pemVfY2FjaGUoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7Ci0Jc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0JdW5zaWduZWQgc2hvcnQgc2VydmljZV9hY3Rpb247Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gdGFzay0+dGFza19zZV9jbWQtPnNlX2RldjsKIAotCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzBdKSB7Ci0JY2FzZSBJTlFVSVJZOgotCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5KGNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgUkVBRF9DQVBBQ0lUWToKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5KGNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV9TRU5TRToKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlKGNtZCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV9TRU5TRV8xMDoKLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlKGNtZCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VSVklDRV9BQ1RJT05fSU46Ci0JCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgewotCQljYXNlIFNBSV9SRUFEX0NBUEFDSVRZXzE2OgotCQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KGNtZCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiVW5zdXBwb3J0ZWQgU0E6IDB4JTAyeFxuIiwKLQkJCQljbWQtPnRfdGFza19jZGJbMV0gJiAweDFmKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKLQkJfQotCQlicmVhazsKLQljYXNlIFJFUVVFU1RfU0VOU0U6Ci0JCXJldCA9IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2UoY21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBVTk1BUDoKLQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJcHJfZXJyKCJVTk1BUCBlbXVsYXRpb24gbm90IHN1cHBvcnRlZCBmb3I6ICVzXG4iLAotCQkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7Ci0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7Ci0JCX0KLQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfdW5tYXAodGFzayk7Ci0JCWJyZWFrOwotCWNhc2UgV1JJVEVfU0FNRToKLQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJcHJfZXJyKCJXUklURV9TQU1FIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgotCQkJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKLQkJfQotCQlyZXQgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHRhc2ssCi0JCQkJZ2V0X3VuYWxpZ25lZF9iZTE2KCZjbWQtPnRfdGFza19jZGJbN10pKTsKLQkJYnJlYWs7Ci0JY2FzZSBXUklURV9TQU1FXzE2OgotCQlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7Ci0JCQlwcl9lcnIoIldSSVRFX1NBTUVfMTYgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCi0JCQkJCSIgZm9yOiAlc1xuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQl9Ci0JCXJldCA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWUodGFzaywKLQkJCQlnZXRfdW5hbGlnbmVkX2JlMzIoJmNtZC0+dF90YXNrX2NkYlsxMF0pKTsKLQkJYnJlYWs7Ci0JY2FzZSBWQVJJQUJMRV9MRU5HVEhfQ01EOgotCQlzZXJ2aWNlX2FjdGlvbiA9Ci0JCQlnZXRfdW5hbGlnbmVkX2JlMTYoJmNtZC0+dF90YXNrX2NkYls4XSk7Ci0JCXN3aXRjaCAoc2VydmljZV9hY3Rpb24pIHsKLQkJY2FzZSBXUklURV9TQU1FXzMyOgotCQkJaWYgKCFkZXYtPnRyYW5zcG9ydC0+ZG9fZGlzY2FyZCkgewotCQkJCXByX2VycigiV1JJVEVfU0FNRV8zMiBTQSBlbXVsYXRpb24gbm90IgotCQkJCQkiIHN1cHBvcnRlZCBmb3I6ICVzXG4iLAotCQkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7Ci0JCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQkJfQotCQkJcmV0ID0gdGFyZ2V0X2VtdWxhdGVfd3JpdGVfc2FtZSh0YXNrLAotCQkJCWdldF91bmFsaWduZWRfYmUzMigmY21kLT50X3Rhc2tfY2RiWzI4XSkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIlVuc3VwcG9ydGVkIFZBUklBQkxFX0xFTkdUSF9DTUQgU0E6IgotCQkJCQkiIDB4JTAyeFxuIiwgc2VydmljZV9hY3Rpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKLQljYXNlIDB4OTE6IC8qIFNZTkNIUk9OSVpFX0NBQ0hFXzE2OiAqLwotCQlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKSB7Ci0JCQlwcl9lcnIoIlNZTkNIUk9OSVpFX0NBQ0hFIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkIgotCQkJCSIgZm9yOiAlc1xuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwotCQl9Ci0JCWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKHRhc2spOwotCQlicmVhazsKLQljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgotCWNhc2UgRVJBU0U6Ci0JY2FzZSBSRVpFUk9fVU5JVDoKLQljYXNlIFNFRUtfMTA6Ci0JY2FzZSBTUEFDRToKLQljYXNlIFNUQVJUX1NUT1A6Ci0JY2FzZSBURVNUX1VOSVRfUkVBRFk6Ci0JY2FzZSBWRVJJRlk6Ci0JY2FzZSBXUklURV9GSUxFTUFSS1M6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiVW5zdXBwb3J0ZWQgU0NTSSBPcGNvZGU6IDB4JTAyeCBmb3IgJXNcbiIsCi0JCQljbWQtPnRfdGFza19jZGJbMF0sIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKKwlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKSB7CisJCXByX2VycigiU1lOQ0hST05JWkVfQ0FDSEUgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQiCisJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKIAkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOwogCX0KIAotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCS8qCi0JICogSGFuZGxlIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaGVyZSB1bmxlc3MgYSBjYWxsZXIKLQkgKiBoYXMgZXhwbGljdGx5IHJlcXVlc3RlZCBhbiBhc3ljaHJvbm91cyBjb21wbGV0aW9uLgotCSAqLwotCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DKSkgewotCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKLQkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7Ci0JfQorCWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKHRhc2spOworCXJldHVybiAwOworfQogCi0JcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CitpbnQgdGFyZ2V0X2VtdWxhdGVfbm9vcChzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKK3sKKwl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY2RiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2YjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgVEFSR0VUX0NPUkVfQ0RCX0gKKyNkZWZpbmUgVEFSR0VUX0NPUkVfQ0RCX0gKKworaW50IHRhcmdldF9lbXVsYXRlX2lucXVpcnkoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitpbnQgdGFyZ2V0X2VtdWxhdGVfcmVhZGNhcGFjaXR5XzE2KHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV9tb2Rlc2Vuc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spOworaW50IHRhcmdldF9lbXVsYXRlX3VubWFwKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKK2ludCB0YXJnZXRfZW11bGF0ZV9zeW5jaHJvbml6ZV9jYWNoZShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitpbnQgdGFyZ2V0X2VtdWxhdGVfbm9vcChzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CisKKyNlbmRpZiAvKiBUQVJHRVRfQ09SRV9DREJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwppbmRleCBmODcwYzNiLi5iYTVlZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CkBAIC02NTEsMjMgKzY1MiwxNSBAQAogCWx1bi0+bHVuX3NlX2RldiA9IE5VTEw7CiB9CiAKLWludCB0cmFuc3BvcnRfY29yZV9yZXBvcnRfbHVuX3Jlc3BvbnNlKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKK2ludCB0YXJnZXRfcmVwb3J0X2x1bnMoc3RydWN0IHNlX3Rhc2sgKnNlX3Rhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqc2VfY21kID0gc2VfdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHNlX2Rldl9lbnRyeSAqZGV2ZTsKIAlzdHJ1Y3Qgc2VfbHVuICpzZV9sdW47CiAJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MgPSBzZV9jbWQtPnNlX3Nlc3M7Ci0Jc3RydWN0IHNlX3Rhc2sgKnNlX3Rhc2s7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCXUzMiBjZGJfb2Zmc2V0ID0gMCwgbHVuX2NvdW50ID0gMCwgb2Zmc2V0ID0gOCwgaTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VfdGFzaywgJnNlX2NtZC0+dF90YXNrX2xpc3QsIHRfbGlzdCkKLQkJYnJlYWs7Ci0KLQlpZiAoIXNlX3Rhc2spIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlIHN0cnVjdCBzZV90YXNrIGZvciBzdHJ1Y3Qgc2VfY21kXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwotCX0KLQogCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShzZV9jbWQpOwogCiAJLyoKQEAgLTcxMyw2ICs3MDYsOCBAQAogCWJ1ZlsyXSA9ICgobHVuX2NvdW50ID4+IDgpICYgMHhmZik7CiAJYnVmWzNdID0gKGx1bl9jb3VudCAmIDB4ZmYpOwogCisJc2VfdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2soc2VfdGFzaywgMSk7CiAJcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19saWIuYwppbmRleCAzOWYwMjFiLi5lYzQyNDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfbGliLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX2xpYi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYwppbmRleCAxOWEwYmU5Li42N2NkNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaGJhLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYwppbmRleCAwNjM5Yjk3Li5jNjgwMTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9oYmEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKaW5kZXggNDFhZDAyYi4uNzY5OGVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwppbmRleCAwYzRmNzgzLi41YTRlYmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKQEAgLTExNiwxMTQgKzExNiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY29yZV9zY3NpMl9yZXNlcnZhdGlvbl9yZWxlYXNlKHN0cnVjdCBzZV9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKLQlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2VzcyA9IGNtZC0+c2Vfc2VzczsKLQlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICp0cGcgPSBzZXNzLT5zZV90cGc7Ci0KLQlpZiAoIXNlc3MgfHwgIXRwZykKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCWlmICghZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgfHwgIXNlc3MpIHsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgIT0gc2Vzcy0+c2Vfbm9kZV9hY2wpIHsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgPSBOVUxMOwotCWRldi0+ZGV2X2ZsYWdzICY9IH5ERl9TUEMyX1JFU0VSVkFUSU9OUzsKLQlpZiAoZGV2LT5kZXZfZmxhZ3MgJiBERl9TUEMyX1JFU0VSVkFUSU9OU19XSVRIX0lTSUQpIHsKLQkJZGV2LT5kZXZfcmVzX2Jpbl9pc2lkID0gMDsKLQkJZGV2LT5kZXZfZmxhZ3MgJj0gfkRGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRDsKLQl9Ci0JcHJfZGVidWcoIlNDU0ktMiBSZWxlYXNlZCByZXNlcnZhdGlvbiBmb3IgJXMgTFVOOiAldSAtPiIKLQkJIiBNQVBQRUQgTFVOOiAldSBmb3IgJXNcbiIsIHRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCksCi0JCWNtZC0+c2VfbHVuLT51bnBhY2tlZF9sdW4sIGNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKLQkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOwotCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZShzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0Jc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7Ci0Jc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7Ci0Jc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnID0gc2Vzcy0+c2VfdHBnOwotCi0JaWYgKChjbWQtPnRfdGFza19jZGJbMV0gJiAweDAxKSAmJgotCSAgICAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgwMikpIHsKLQkJcHJfZXJyKCJMb25nSU8gYW5kIE9ic2VsZXRlIEJpdHMgc2V0LCByZXR1cm5pbmciCi0JCQkJIiBJTExFR0FMX1JFUVVFU1RcbiIpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7Ci0JfQotCS8qCi0JICogVGhpcyBpcyBjdXJyZW50bHkgdGhlIGNhc2UgZm9yIHRhcmdldF9jb3JlX21vZCBwYXNzdGhyb3VnaCBzdHJ1Y3Qgc2VfY21kCi0JICogb3BzCi0JICovCi0JaWYgKCFzZXNzIHx8ICF0cGcpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQlpZiAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgJiYKLQkgICAoZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgIT0gc2Vzcy0+c2Vfbm9kZV9hY2wpKSB7Ci0JCXByX2VycigiU0NTSS0yIFJFU0VSVkFUSU9OIENPTkZMSUZUIGZvciAlcyBmYWJyaWNcbiIsCi0JCQl0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpKTsKLQkJcHJfZXJyKCJPcmlnaW5hbCByZXNlcnZlciBMVU46ICV1ICVzXG4iLAotCQkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKLQkJCWRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJcHJfZXJyKCJDdXJyZW50IGF0dGVtcHQgLSBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgotCQkJIiBmcm9tICVzIFxuIiwgY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwKLQkJCWNtZC0+c2VfZGV2ZS0+bWFwcGVkX2x1biwKLQkJCXNlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKLQl9Ci0KLQlkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCA9IHNlc3MtPnNlX25vZGVfYWNsOwotCWRldi0+ZGV2X2ZsYWdzIHw9IERGX1NQQzJfUkVTRVJWQVRJT05TOwotCWlmIChzZXNzLT5zZXNzX2Jpbl9pc2lkICE9IDApIHsKLQkJZGV2LT5kZXZfcmVzX2Jpbl9pc2lkID0gc2Vzcy0+c2Vzc19iaW5faXNpZDsKLQkJZGV2LT5kZXZfZmxhZ3MgfD0gREZfU1BDMl9SRVNFUlZBVElPTlNfV0lUSF9JU0lEOwotCX0KLQlwcl9kZWJ1ZygiU0NTSS0yIFJlc2VydmVkICVzIExVTjogJXUgLT4gTUFQUEVEIExVTjogJXUiCi0JCSIgZm9yICVzXG4iLCB0cGctPnNlX3RwZ190Zm8tPmdldF9mYWJyaWNfbmFtZSgpLAotCQljbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLCBjbWQtPnNlX2RldmUtPm1hcHBlZF9sdW4sCi0JCXNlc3MtPnNlX25vZGVfYWNsLT5pbml0aWF0b3JuYW1lKTsKLQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpjb3JlX3Njc2kzX2xvY2F0ZV9wcl9yZWcoc3RydWN0IHNlX2RldmljZSAqLAogCQkJCQlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKiwgc3RydWN0IHNlX3Nlc3Npb24gKik7CiBzdGF0aWMgdm9pZCBjb3JlX3Njc2kzX3B1dF9wcl9yZWcoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKik7CiAKLS8qCi0gKiBTZXR1cCBpbiB0YXJnZXRfY29yZV90cmFuc3BvcnQuYzp0cmFuc3BvcnRfZ2VuZXJpY19jbWRfc2VxdWVuY2VyKCkKLSAqIGFuZCBjYWxsZWQgdmlhIHN0cnVjdCBzZV9jbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpIGluIFRDTSBwcm9jZXNzaW5nCi0gKiB0aHJlYWQgY29udGV4dC4KLSAqLwotaW50IGNvcmVfc2NzaTJfZW11bGF0ZV9jcmgoc3RydWN0IHNlX2NtZCAqY21kKQorc3RhdGljIGludCB0YXJnZXRfY2hlY2tfc2NzaTJfcmVzZXJ2YXRpb25fY29uZmxpY3Qoc3RydWN0IHNlX2NtZCAqY21kLCBpbnQgKnJldCkKIHsKIAlzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2VzcyA9IGNtZC0+c2Vfc2VzczsKIAlzdHJ1Y3Qgc2Vfc3Vic3lzdGVtX2RldiAqc3VfZGV2ID0gY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXY7CiAJc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKnByX3JlZzsKIAlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICpwcl90bXBsID0gJnN1X2Rldi0+dDEwX3ByOwotCXVuc2lnbmVkIGNoYXIgKmNkYiA9ICZjbWQtPnRfdGFza19jZGJbMF07CiAJaW50IGNyaCA9IChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKTsKIAlpbnQgY29uZmxpY3QgPSAwOwogCi0JaWYgKCFzZV9zZXNzKQotCQlyZXR1cm4gMDsKLQogCWlmICghY3JoKQotCQlnb3RvIGFmdGVyX2NyaDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJcHJfcmVnID0gY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGNtZC0+c2VfZGV2LCBzZV9zZXNzLT5zZV9ub2RlX2FjbCwKIAkJCXNlX3Nlc3MpOwpAQCAtMjUxLDE0ICsxNTgsMTYgQEAKIAkJICovCiAJCWlmIChwcl9yZWctPnByX3Jlc19ob2xkZXIpIHsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJcmV0dXJuIDA7CisJCQkqcmV0ID0gMDsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlpZiAoKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9XUklURV9FWENMVVNJVkVfUkVHT05MWSkgfHwKIAkJICAgIChwcl9yZWctPnByX3Jlc190eXBlID09IFBSX1RZUEVfRVhDTFVTSVZFX0FDQ0VTU19SRUdPTkxZKSB8fAogCQkgICAgKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9XUklURV9FWENMVVNJVkVfQUxMUkVHKSB8fAogCQkgICAgKHByX3JlZy0+cHJfcmVzX3R5cGUgPT0gUFJfVFlQRV9FWENMVVNJVkVfQUNDRVNTX0FMTFJFRykpIHsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJcmV0dXJuIDA7CisJCQkqcmV0ID0gMDsKKwkJCXJldHVybiB0cnVlOwogCQl9CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwogCQljb25mbGljdCA9IDE7CkBAIC0yODIsMTggKzE5MSwxMTggQEAKIAkJcHJfZXJyKCJSZWNlaXZlZCBsZWdhY3kgU1BDLTIgUkVTRVJWRS9SRUxFQVNFIgogCQkJIiB3aGlsZSBhY3RpdmUgU1BDLTMgcmVnaXN0cmF0aW9ucyBleGlzdCwiCiAJCQkiIHJldHVybmluZyBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkqcmV0ID0gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJcmV0dXJuIHRydWU7CiAJfQogCi1hZnRlcl9jcmg6Ci0JaWYgKChjZGJbMF0gPT0gUkVTRVJWRSkgfHwgKGNkYlswXSA9PSBSRVNFUlZFXzEwKSkKLQkJcmV0dXJuIGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZShjbWQpOwotCWVsc2UgaWYgKChjZGJbMF0gPT0gUkVMRUFTRSkgfHwgKGNkYlswXSA9PSBSRUxFQVNFXzEwKSkKLQkJcmV0dXJuIGNvcmVfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZShjbWQpOwotCWVsc2UKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJcmV0dXJuIGZhbHNlOwogfQogCitpbnQgdGFyZ2V0X3Njc2kyX3Jlc2VydmF0aW9uX3JlbGVhc2Uoc3RydWN0IHNlX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CisJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gY21kLT5zZV9kZXY7CisJc3RydWN0IHNlX3Nlc3Npb24gKnNlc3MgPSBjbWQtPnNlX3Nlc3M7CisJc3RydWN0IHNlX3BvcnRhbF9ncm91cCAqdHBnID0gc2Vzcy0+c2VfdHBnOworCWludCByZXQgPSAwOworCisJaWYgKCFzZXNzIHx8ICF0cGcpCisJCWdvdG8gb3V0OworCWlmICh0YXJnZXRfY2hlY2tfc2NzaTJfcmVzZXJ2YXRpb25fY29uZmxpY3QoY21kLCAmcmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAwOworCXNwaW5fbG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CisJaWYgKCFkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCB8fCAhc2VzcykKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKGRldi0+ZGV2X3Jlc2VydmVkX25vZGVfYWNsICE9IHNlc3MtPnNlX25vZGVfYWNsKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCA9IE5VTEw7CisJZGV2LT5kZXZfZmxhZ3MgJj0gfkRGX1NQQzJfUkVTRVJWQVRJT05TOworCWlmIChkZXYtPmRldl9mbGFncyAmIERGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRCkgeworCQlkZXYtPmRldl9yZXNfYmluX2lzaWQgPSAwOworCQlkZXYtPmRldl9mbGFncyAmPSB+REZfU1BDMl9SRVNFUlZBVElPTlNfV0lUSF9JU0lEOworCX0KKwlwcl9kZWJ1ZygiU0NTSS0yIFJlbGVhc2VkIHJlc2VydmF0aW9uIGZvciAlcyBMVU46ICV1IC0+IgorCQkiIE1BUFBFRCBMVU46ICV1IGZvciAlc1xuIiwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQlzZXNzLT5zZV9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworb3V0OgorCWlmICghcmV0KSB7CisJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCQl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlKHN0cnVjdCBzZV90YXNrICp0YXNrKQoreworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOworCXN0cnVjdCBzZV9kZXZpY2UgKmRldiA9IGNtZC0+c2VfZGV2OworCXN0cnVjdCBzZV9zZXNzaW9uICpzZXNzID0gY21kLT5zZV9zZXNzOworCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnRwZyA9IHNlc3MtPnNlX3RwZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgwMSkgJiYKKwkgICAgKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MDIpKSB7CisJCXByX2VycigiTG9uZ0lPIGFuZCBPYnNlbGV0ZSBCaXRzIHNldCwgcmV0dXJuaW5nIgorCQkJCSIgSUxMRUdBTF9SRVFVRVNUXG4iKTsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIFRoaXMgaXMgY3VycmVudGx5IHRoZSBjYXNlIGZvciB0YXJnZXRfY29yZV9tb2QgcGFzc3Rocm91Z2ggc3RydWN0IHNlX2NtZAorCSAqIG9wcworCSAqLworCWlmICghc2VzcyB8fCAhdHBnKQorCQlnb3RvIG91dDsKKwlpZiAodGFyZ2V0X2NoZWNrX3Njc2kyX3Jlc2VydmF0aW9uX2NvbmZsaWN0KGNtZCwgJnJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKwlzcGluX2xvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworCWlmIChkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCAmJgorCSAgIChkZXYtPmRldl9yZXNlcnZlZF9ub2RlX2FjbCAhPSBzZXNzLT5zZV9ub2RlX2FjbCkpIHsKKwkJcHJfZXJyKCJTQ1NJLTIgUkVTRVJWQVRJT04gQ09ORkxJRlQgZm9yICVzIGZhYnJpY1xuIiwKKwkJCXRwZy0+c2VfdHBnX3Rmby0+Z2V0X2ZhYnJpY19uYW1lKCkpOworCQlwcl9lcnIoIk9yaWdpbmFsIHJlc2VydmVyIExVTjogJXUgJXNcbiIsCisJCQljbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAorCQkJZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOworCQlwcl9lcnIoIkN1cnJlbnQgYXR0ZW1wdCAtIExVTjogJXUgLT4gTUFQUEVEIExVTjogJXUiCisJCQkiIGZyb20gJXMgXG4iLCBjbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAorCQkJY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZGV2LT5kZXZfcmVzZXJ2ZWRfbm9kZV9hY2wgPSBzZXNzLT5zZV9ub2RlX2FjbDsKKwlkZXYtPmRldl9mbGFncyB8PSBERl9TUEMyX1JFU0VSVkFUSU9OUzsKKwlpZiAoc2Vzcy0+c2Vzc19iaW5faXNpZCAhPSAwKSB7CisJCWRldi0+ZGV2X3Jlc19iaW5faXNpZCA9IHNlc3MtPnNlc3NfYmluX2lzaWQ7CisJCWRldi0+ZGV2X2ZsYWdzIHw9IERGX1NQQzJfUkVTRVJWQVRJT05TX1dJVEhfSVNJRDsKKwl9CisJcHJfZGVidWcoIlNDU0ktMiBSZXNlcnZlZCAlcyBMVU46ICV1IC0+IE1BUFBFRCBMVU46ICV1IgorCQkiIGZvciAlc1xuIiwgdHBnLT5zZV90cGdfdGZvLT5nZXRfZmFicmljX25hbWUoKSwKKwkJY21kLT5zZV9sdW4tPnVucGFja2VkX2x1biwgY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAorCQlzZXNzLT5zZV9ub2RlX2FjbC0+aW5pdGlhdG9ybmFtZSk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOworb3V0OgorCWlmICghcmV0KSB7CisJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOworCQl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCiAvKgogICogQmVnaW4gU1BDLTMvU1BDLTQgUGVyc2lzdGVudCBSZXNlcnZhdGlvbnMgZW11bGF0aW9uIHN1cHBvcnQKICAqCkBAIC00MTgsMTIgKzQyNywxMiBAQAogCQlicmVhazsKIAljYXNlIFJFTEVBU0U6CiAJY2FzZSBSRUxFQVNFXzEwOgotCQkvKiBIYW5kbGVkIGJ5IENSSD0xIGluIGNvcmVfc2NzaTJfZW11bGF0ZV9jcmgoKSAqLworCQkvKiBIYW5kbGVkIGJ5IENSSD0xIGluIHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZWxlYXNlKCkgKi8KIAkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBSRVNFUlZFOgogCWNhc2UgUkVTRVJWRV8xMDoKLQkJLyogSGFuZGxlZCBieSBDUkg9MSBpbiBjb3JlX3Njc2kyX2VtdWxhdGVfY3JoKCkgKi8KKwkJLyogSGFuZGxlZCBieSBDUkg9MSBpbiB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVzZXJ2ZSgpICovCiAJCXJldCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgVEVTVF9VTklUX1JFQURZOgpAQCAtMzczOSwxMiArMzc0OCwzMyBAQAogLyoKICAqIFNlZSBzcGM0cjE3IHNlY3Rpb24gNi4xNCBUYWJsZSAxNzAKICAqLwotc3RhdGljIGludCBjb3JlX3Njc2kzX2VtdWxhdGVfcHJfb3V0KHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqY2RiKQoraW50IHRhcmdldF9zY3NpM19lbXVsYXRlX3ByX291dChzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKKwl1bnNpZ25lZCBjaGFyICpjZGIgPSAmY21kLT50X3Rhc2tfY2RiWzBdOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1NjQgcmVzX2tleSwgc2FfcmVzX2tleTsKIAlpbnQgc2EsIHNjb3BlLCB0eXBlLCBhcHRwbDsKIAlpbnQgc3BlY19pX3B0ID0gMCwgYWxsX3RnX3B0ID0gMCwgdW5yZWcgPSAwOworCWludCByZXQ7CisKKwkvKgorCSAqIEZvbGxvd2luZyBzcGMycjIwIDUuNS4xIFJlc2VydmF0aW9ucyBvdmVydmlldzoKKwkgKgorCSAqIElmIGEgbG9naWNhbCB1bml0IGhhcyBiZWVuIHJlc2VydmVkIGJ5IGFueSBSRVNFUlZFIGNvbW1hbmQgYW5kIGlzCisJICogc3RpbGwgcmVzZXJ2ZWQgYnkgYW55IGluaXRpYXRvciwgYWxsIFBFUlNJU1RFTlQgUkVTRVJWRSBJTiBhbmQgYWxsCisJICogUEVSU0lTVEVOVCBSRVNFUlZFIE9VVCBjb21tYW5kcyBzaGFsbCBjb25mbGljdCByZWdhcmRsZXNzIG9mCisJICogaW5pdGlhdG9yIG9yIHNlcnZpY2UgYWN0aW9uIGFuZCBzaGFsbCB0ZXJtaW5hdGUgd2l0aCBhIFJFU0VSVkFUSU9OCisJICogQ09ORkxJQ1Qgc3RhdHVzLgorCSAqLworCWlmIChjbWQtPnNlX2Rldi0+ZGV2X2ZsYWdzICYgREZfU1BDMl9SRVNFUlZBVElPTlMpIHsKKwkJcHJfZXJyKCJSZWNlaXZlZCBQRVJTSVNURU5UX1JFU0VSVkUgQ0RCIHdoaWxlIGxlZ2FjeSIKKwkJCSIgU1BDLTIgcmVzZXJ2YXRpb24gaXMgaGVsZCwgcmV0dXJuaW5nIgorCQkJIiBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7CisJCXJldCA9IFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogRklYTUU6IEEgTlVMTCBzdHJ1Y3Qgc2Vfc2Vzc2lvbiBwb2ludGVyIG1lYW5zIGFuIHRoaXMgaXMgbm90IGNvbWluZyBmcm9tCiAJICogYSAkRkFCUklDX01PRCdzIG5leHVzLCBidXQgZnJvbSBpbnRlcm5hbCBwYXNzdGhyb3VnaCBvcHMuCkBAIC0zNzU1LDcgKzM3ODUsOCBAQAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgMjQpIHsKIAkJcHJfd2FybigiU1BDLVBSOiBSZWNlaXZlZCBQUiBPVVQgcGFyYW1ldGVyIGxpc3QiCiAJCQkiIGxlbmd0aCB0b28gc21hbGw6ICV1XG4iLCBjbWQtPmRhdGFfbGVuZ3RoKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlnb3RvIG91dDsKIAl9CiAJLyoKIAkgKiBGcm9tIHRoZSBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIGNvbW1hbmQgZGVzY3JpcHRvciBibG9jayAoQ0RCKQpAQCAtMzc4OCw4ICszODE5LDExIEBACiAJLyoKIAkgKiBTUEVDX0lfUFQ9MSBpcyBvbmx5IHZhbGlkIGZvciBTZXJ2aWNlIGFjdGlvbjogUkVHSVNURVIKIAkgKi8KLQlpZiAoc3BlY19pX3B0ICYmICgoY2RiWzFdICYgMHgxZikgIT0gUFJPX1JFR0lTVEVSKSkKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwlpZiAoc3BlY19pX3B0ICYmICgoY2RiWzFdICYgMHgxZikgIT0gUFJPX1JFR0lTVEVSKSkgeworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogRnJvbSBzcGM0cjE3IHNlY3Rpb24gNi4xNDoKIAkgKgpAQCAtMzgwMyw3ICszODM3LDggQEAKIAkgICAgKGNtZC0+ZGF0YV9sZW5ndGggIT0gMjQpKSB7CiAJCXByX3dhcm4oIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIGlsbGVnYWwgcGFyYW1ldGVyIgogCQkJIiBsaXN0IGxlbmd0aDogJXVcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWdvdG8gb3V0OwogCX0KIAkvKgogCSAqIChjb3JlX3Njc2kzX2VtdWxhdGVfcHJvXyogZnVuY3Rpb24gcGFyYW1ldGVycwpAQCAtMzgxMiwzNSArMzg0Nyw0NyBAQAogCSAqLwogCXN3aXRjaCAoc2EpIHsKIAljYXNlIFBST19SRUdJU1RFUjoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcmVnaXN0ZXIoY21kLAorCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlZ2lzdGVyKGNtZCwKIAkJCXJlc19rZXksIHNhX3Jlc19rZXksIGFwdHBsLCBhbGxfdGdfcHQsIHNwZWNfaV9wdCwgMCk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFU0VSVkU6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3Jlc2VydmUoY21kLAotCQkJdHlwZSwgc2NvcGUsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3Jlc2VydmUoY21kLCB0eXBlLCBzY29wZSwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFTEVBU0U6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlbGVhc2UoY21kLAotCQkJdHlwZSwgc2NvcGUsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlbGVhc2UoY21kLCB0eXBlLCBzY29wZSwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX0NMRUFSOgotCQlyZXR1cm4gY29yZV9zY3NpM19lbXVsYXRlX3Byb19jbGVhcihjbWQsIHJlc19rZXkpOworCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX2NsZWFyKGNtZCwgcmVzX2tleSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1BSRUVNUFQ6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3ByZWVtcHQoY21kLCB0eXBlLCBzY29wZSwKKwkJcmV0ID0gY29yZV9zY3NpM19lbXVsYXRlX3Byb19wcmVlbXB0KGNtZCwgdHlwZSwgc2NvcGUsCiAJCQkJCXJlc19rZXksIHNhX3Jlc19rZXksIDApOworCQlicmVhazsKIAljYXNlIFBST19QUkVFTVBUX0FORF9BQk9SVDoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcHJlZW1wdChjbWQsIHR5cGUsIHNjb3BlLAorCQlyZXQgPSBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3ByZWVtcHQoY21kLCB0eXBlLCBzY29wZSwKIAkJCQkJcmVzX2tleSwgc2FfcmVzX2tleSwgMSk7CisJCWJyZWFrOwogCWNhc2UgUFJPX1JFR0lTVEVSX0FORF9JR05PUkVfRVhJU1RJTkdfS0VZOgotCQlyZXR1cm4gY29yZV9zY3NpM19lbXVsYXRlX3Byb19yZWdpc3RlcihjbWQsCisJCXJldCA9IGNvcmVfc2NzaTNfZW11bGF0ZV9wcm9fcmVnaXN0ZXIoY21kLAogCQkJMCwgc2FfcmVzX2tleSwgYXB0cGwsIGFsbF90Z19wdCwgc3BlY19pX3B0LCAxKTsKKwkJYnJlYWs7CiAJY2FzZSBQUk9fUkVHSVNURVJfQU5EX01PVkU6Ci0JCXJldHVybiBjb3JlX3Njc2kzX2VtdWxhdGVfcHJvX3JlZ2lzdGVyX2FuZF9tb3ZlKGNtZCwgcmVzX2tleSwKKwkJcmV0ID0gY29yZV9zY3NpM19lbXVsYXRlX3Byb19yZWdpc3Rlcl9hbmRfbW92ZShjbWQsIHJlc19rZXksCiAJCQkJc2FfcmVzX2tleSwgYXB0cGwsIHVucmVnKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJVbmtub3duIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQgc2VydmljZSIKIAkJCSIgYWN0aW9uOiAweCUwMnhcbiIsIGNkYlsxXSAmIDB4MWYpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CitvdXQ6CisJaWYgKCFyZXQpIHsKKwkJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CisJCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNDE5MCwyOSArNDIzNywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNvcmVfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfY21kICpjbWQsIHVuc2lnbmVkIGNoYXIgKmNkYikKK2ludCB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfdGFzayAqdGFzaykKIHsKLQlzd2l0Y2ggKGNkYlsxXSAmIDB4MWYpIHsKLQljYXNlIFBSSV9SRUFEX0tFWVM6Ci0JCXJldHVybiBjb3JlX3Njc2kzX3ByaV9yZWFkX2tleXMoY21kKTsKLQljYXNlIFBSSV9SRUFEX1JFU0VSVkFUSU9OOgotCQlyZXR1cm4gY29yZV9zY3NpM19wcmlfcmVhZF9yZXNlcnZhdGlvbihjbWQpOwotCWNhc2UgUFJJX1JFUE9SVF9DQVBBQklMSVRJRVM6Ci0JCXJldHVybiBjb3JlX3Njc2kzX3ByaV9yZXBvcnRfY2FwYWJpbGl0aWVzKGNtZCk7Ci0JY2FzZSBQUklfUkVBRF9GVUxMX1NUQVRVUzoKLQkJcmV0dXJuIGNvcmVfc2NzaTNfcHJpX3JlYWRfZnVsbF9zdGF0dXMoY21kKTsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIlVua25vd24gUEVSU0lTVEVOVF9SRVNFUlZFX0lOIHNlcnZpY2UiCi0JCQkiIGFjdGlvbjogMHglMDJ4XG4iLCBjZGJbMV0gJiAweDFmKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7Ci0JfQorCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOworCWludCByZXQ7CiAKLX0KLQotaW50IGNvcmVfc2NzaTNfZW11bGF0ZV9wcihzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0JdW5zaWduZWQgY2hhciAqY2RiID0gJmNtZC0+dF90YXNrX2NkYlswXTsKLQlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSBjbWQtPnNlX2RldjsKIAkvKgogCSAqIEZvbGxvd2luZyBzcGMycjIwIDUuNS4xIFJlc2VydmF0aW9ucyBvdmVydmlldzoKIAkgKgpAQCAtNDIyMiwxNiArNDI1MSwzOCBAQAogCSAqIGluaXRpYXRvciBvciBzZXJ2aWNlIGFjdGlvbiBhbmQgc2hhbGwgdGVybWluYXRlIHdpdGggYSBSRVNFUlZBVElPTgogCSAqIENPTkZMSUNUIHN0YXR1cy4KIAkgKi8KLQlpZiAoZGV2LT5kZXZfZmxhZ3MgJiBERl9TUEMyX1JFU0VSVkFUSU9OUykgeworCWlmIChjbWQtPnNlX2Rldi0+ZGV2X2ZsYWdzICYgREZfU1BDMl9SRVNFUlZBVElPTlMpIHsKIAkJcHJfZXJyKCJSZWNlaXZlZCBQRVJTSVNURU5UX1JFU0VSVkUgQ0RCIHdoaWxlIGxlZ2FjeSIKIAkJCSIgU1BDLTIgcmVzZXJ2YXRpb24gaXMgaGVsZCwgcmV0dXJuaW5nIgogCQkJIiBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7CiAJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOwogCX0KIAotCXJldHVybiAoY2RiWzBdID09IFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQpID8KLQkgICAgICAgY29yZV9zY3NpM19lbXVsYXRlX3ByX291dChjbWQsIGNkYikgOgotCSAgICAgICBjb3JlX3Njc2kzX2VtdWxhdGVfcHJfaW4oY21kLCBjZGIpOworCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgeworCWNhc2UgUFJJX1JFQURfS0VZUzoKKwkJcmV0ID0gY29yZV9zY3NpM19wcmlfcmVhZF9rZXlzKGNtZCk7CisJCWJyZWFrOworCWNhc2UgUFJJX1JFQURfUkVTRVJWQVRJT046CisJCXJldCA9IGNvcmVfc2NzaTNfcHJpX3JlYWRfcmVzZXJ2YXRpb24oY21kKTsKKwkJYnJlYWs7CisJY2FzZSBQUklfUkVQT1JUX0NBUEFCSUxJVElFUzoKKwkJcmV0ID0gY29yZV9zY3NpM19wcmlfcmVwb3J0X2NhcGFiaWxpdGllcyhjbWQpOworCQlicmVhazsKKwljYXNlIFBSSV9SRUFEX0ZVTExfU1RBVFVTOgorCQlyZXQgPSBjb3JlX3Njc2kzX3ByaV9yZWFkX2Z1bGxfc3RhdHVzKGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiVW5rbm93biBQRVJTSVNURU5UX1JFU0VSVkVfSU4gc2VydmljZSIKKwkJCSIgYWN0aW9uOiAweCUwMnhcbiIsIGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MWYpOworCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOworCQlicmVhazsKKwl9CisKKwlpZiAoIXJldCkgeworCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKKwkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgY29yZV9wdF9yZXNlcnZhdGlvbl9jaGVjayhzdHJ1Y3Qgc2VfY21kICpjbWQsIHUzMiAqcHJfcmVzX3R5cGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuaAppbmRleCBjOGY0N2QwLi5iOTdmNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmgKQEAgLTQ3LDcgKzQ3LDggQEAKIAogZXh0ZXJuIGludCBjb3JlX3ByX2R1bXBfaW5pdGlhdG9yX3BvcnQoc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb24gKiwKIAkJCWNoYXIgKiwgdTMyKTsKLWV4dGVybiBpbnQgY29yZV9zY3NpMl9lbXVsYXRlX2NyaChzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGludCB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZShzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitleHRlcm4gaW50IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlKHN0cnVjdCBzZV90YXNrICp0YXNrKTsKIGV4dGVybiBpbnQgY29yZV9zY3NpM19hbGxvY19hcHRwbF9yZWdpc3RyYXRpb24oCiAJCQlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uICosIHU2NCwKIAkJCXVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1MzIsCkBAIC02MSw3ICs2Miw5IEBACiBleHRlcm4gdW5zaWduZWQgY2hhciAqY29yZV9zY3NpM19wcl9kdW1wX3R5cGUoaW50KTsKIGV4dGVybiBpbnQgY29yZV9zY3NpM19jaGVja19jZGJfYWJvcnRfYW5kX3ByZWVtcHQoc3RydWN0IGxpc3RfaGVhZCAqLAogCQkJCQkJICBzdHJ1Y3Qgc2VfY21kICopOwotZXh0ZXJuIGludCBjb3JlX3Njc2kzX2VtdWxhdGVfcHIoc3RydWN0IHNlX2NtZCAqKTsKKworZXh0ZXJuIGludCB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbihzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CitleHRlcm4gaW50IHRhcmdldF9zY3NpM19lbXVsYXRlX3ByX291dChzdHJ1Y3Qgc2VfdGFzayAqdGFzayk7CiBleHRlcm4gaW50IGNvcmVfc2V0dXBfcmVzZXJ2YXRpb25zKHN0cnVjdCBzZV9kZXZpY2UgKiwgaW50KTsKIAogI2VuZGlmIC8qIFRBUkdFVF9DT1JFX1BSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jCmluZGV4IGRhZDY3MWQuLmVkMzJlMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0xMDkxLDcgKzEwOTIsNyBAQAogCiAJCXJlcSA9IGJsa19tYWtlX3JlcXVlc3QocGR2LT5wZHZfc2QtPnJlcXVlc3RfcXVldWUsIGhiaW8sCiAJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXJlcSkgeworCQlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJCXByX2VycigicFNDU0k6IGJsa19tYWtlX3JlcXVlc3QoKSBmYWlsZWRcbiIpOwogCQkJZ290byBmYWlsOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCmluZGV4IDU3MGIxNDQuLjIxN2UyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3Rtci5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKQEAgLTExOCw3ICsxMTksNyBAQAogCQkvKgogCQkgKiBBbGxvdyB0aGUgcmVjZWl2ZWQgVE1SIHRvIHJldHVybiB3aXRoIEZVTkNUSU9OX0NPTVBMRVRFLgogCQkgKi8KLQkJaWYgKHRtciAmJiAodG1yX3AgPT0gdG1yKSkKKwkJaWYgKHRtcl9wID09IHRtcikKIAkJCWNvbnRpbnVlOwogCiAJCWNtZCA9IHRtcl9wLT50YXNrX2NtZDsKQEAgLTE0NywxOSArMTQ4LDE4IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKIAotCQlsaXN0X21vdmVfdGFpbCgmdG1yLT50bXJfbGlzdCwgJmRyYWluX3Rtcl9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnRtcl9wLT50bXJfbGlzdCwgJmRyYWluX3Rtcl9saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zZV90bXJfbG9jaywgZmxhZ3MpOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcmFpbl90bXJfbGlzdCkpIHsKLQkJdG1yID0gbGlzdF9lbnRyeShkcmFpbl90bXJfbGlzdC5uZXh0LCBzdHJ1Y3Qgc2VfdG1yX3JlcSwgdG1yX2xpc3QpOwotCQlsaXN0X2RlbCgmdG1yLT50bXJfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcl9wLCB0bXJfcHAsICZkcmFpbl90bXJfbGlzdCwgdG1yX2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmdG1yX3AtPnRtcl9saXN0KTsKIAkJY21kID0gdG1yX3AtPnRhc2tfY21kOwogCiAJCXByX2RlYnVnKCJMVU5fUkVTRVQ6ICVzIHJlbGVhc2luZyBUTVIgJXAgRnVuY3Rpb246IDB4JTAyeCwiCiAJCQkiIFJlc3BvbnNlOiAweCUwMngsIHRfc3RhdGU6ICVkXG4iLAotCQkJKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QpID8gIlByZWVtcHQiIDogIiIsIHRtciwKLQkJCXRtci0+ZnVuY3Rpb24sIHRtci0+cmVzcG9uc2UsIGNtZC0+dF9zdGF0ZSk7CisJCQkocHJlZW1wdF9hbmRfYWJvcnRfbGlzdCkgPyAiUHJlZW1wdCIgOiAiIiwgdG1yX3AsCisJCQl0bXJfcC0+ZnVuY3Rpb24sIHRtcl9wLT5yZXNwb25zZSwgY21kLT50X3N0YXRlKTsKIAogCQl0cmFuc3BvcnRfY21kX2ZpbmlzaF9hYm9ydChjbWQsIDEpOwogCX0KQEAgLTMzMCwxNiArMzMwLDYgQEAKIAkJICovCiAJCWlmIChwcm91dF9jbWQgPT0gY21kKQogCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIFNraXAgZGlyZWN0IHByb2Nlc3Npbmcgb2YgVFJBTlNQT1JUX0ZSRUVfQ01EX0lOVFIgZm9yCi0JCSAqIEhXIHRhcmdldCBtb2RlIGZhYnJpY3MuCi0JCSAqLwotCQlzcGluX2xvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKLQkJaWYgKGNtZC0+dF9zdGF0ZSA9PSBUUkFOU1BPUlRfRlJFRV9DTURfSU5UUikgewotCQkJc3Bpbl91bmxvY2soJmNtZC0+dF9zdGF0ZV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjbWQtPnRfc3RhdGVfbG9jayk7CiAKIAkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9xdWV1ZV9hY3RpdmUsIDApOwogCQlhdG9taWNfZGVjKCZxb2JqLT5xdWV1ZV9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHBnLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwppbmRleCA0OWZkMGE5Li44ZGRkMTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCmluZGV4IGQ3NTI1NTguLjM0MDBhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC01Miw2ICs1Myw3IEBACiAjaW5jbHVkZSA8dGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmg+CiAKICNpbmNsdWRlICJ0YXJnZXRfY29yZV9hbHVhLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NvcmVfY2RiLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfaGJhLmgiCiAjaW5jbHVkZSAidGFyZ2V0X2NvcmVfcHIuaCIKICNpbmNsdWRlICJ0YXJnZXRfY29yZV91YS5oIgpAQCAtMjY4LDYgKzI3MCw5IEBACiAJfQogCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX2FjbF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc2Vfc2Vzcy0+c2Vzc19jbWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNlX3Nlc3MtPnNlc3Nfd2FpdF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jayk7CiAKIAlyZXR1cm4gc2Vfc2VzczsKIH0KQEAgLTUxNCwxMyArNTE5LDE2IEBACiAJCQkgKiBTb21lIGZhYnJpYyBtb2R1bGVzIGxpa2UgdGNtX2xvb3AgY2FuIHJlbGVhc2UKIAkJCSAqIHRoZWlyIGludGVybmFsbHkgYWxsb2NhdGVkIEkvTyByZWZlcmVuY2Ugbm93IGFuZAogCQkJICogc3RydWN0IHNlX2NtZCBub3cuCisJCQkgKgorCQkJICogRmFicmljIG1vZHVsZXMgYXJlIGV4cGVjdGVkIHRvIHJldHVybiAnMScgaGVyZSBpZiB0aGUKKwkJCSAqIHNlX2NtZCBiZWluZyBwYXNzZWQgaXMgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCwKKwkJCSAqIG9yIHplcm8gaWYgbm90IGJlaW5nIHJlbGVhc2VkLgogCQkJICovCiAJCQlpZiAoY21kLT5zZV90Zm8tPmNoZWNrX3N0b3BfZnJlZSAhPSBOVUxMKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKIAkJCQkJJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CiAKLQkJCQljbWQtPnNlX3Rmby0+Y2hlY2tfc3RvcF9mcmVlKGNtZCk7Ci0JCQkJcmV0dXJuIDE7CisJCQkJcmV0dXJuIGNtZC0+c2VfdGZvLT5jaGVja19zdG9wX2ZyZWUoY21kKTsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwpAQCAtNzMwLDYgKzczOCwxMCBAQAogCQljb21wbGV0ZSgmdGFzay0+dGFza19zdG9wX2NvbXApOwogCQlyZXR1cm47CiAJfQorCisJaWYgKCFzdWNjZXNzKQorCQljbWQtPnRfdGFza3NfZmFpbGVkID0gMTsKKwogCS8qCiAJICogRGVjcmVtZW50IHRoZSBvdXRzdGFuZGluZyB0X3Rhc2tfY2Ric19sZWZ0IGNvdW50LiAgVGhlIGxhc3QKIAkgKiBzdHJ1Y3Qgc2VfdGFzayBmcm9tIHN0cnVjdCBzZV9jbWQgd2lsbCBjb21wbGV0ZSBpdHNlbGYgaW50byB0aGUKQEAgLTc0MCw3ICs3NTIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFzdWNjZXNzIHx8IGNtZC0+dF90YXNrc19mYWlsZWQpIHsKKwlpZiAoY21kLT50X3Rhc2tzX2ZhaWxlZCkgewogCQlpZiAoIXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzKSB7CiAJCQl0YXNrLT50YXNrX2Vycm9yX3N0YXR1cyA9CiAJCQkJUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7CkBAIC05MDgsNyArOTIwLDcgQEAKIH0KIAogLyoKLSAqIEhhbmRsZSBRVUVVRV9GVUxMIC8gLUVBR0FJTiBzdGF0dXMKKyAqIEhhbmRsZSBRVUVVRV9GVUxMIC8gLUVBR0FJTiBhbmQgLUVOT01FTSBzdGF0dXMKICAqLwogCiBzdGF0aWMgdm9pZCB0YXJnZXRfcWZfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xNDk4LDExICsxNTEwLDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xZl9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xdWV1ZV9ub2RlKTsKLQorCUlOSVRfTElTVF9IRUFEKCZjbWQtPnNlX2NtZF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT50X3Rhc2tfbGlzdCk7CiAJaW5pdF9jb21wbGV0aW9uKCZjbWQtPnRyYW5zcG9ydF9sdW5fZmVfc3RvcF9jb21wKTsKIAlpbml0X2NvbXBsZXRpb24oJmNtZC0+dHJhbnNwb3J0X2x1bl9zdG9wX2NvbXApOwogCWluaXRfY29tcGxldGlvbigmY21kLT50X3RyYW5zcG9ydF9zdG9wX2NvbXApOworCWluaXRfY29tcGxldGlvbigmY21kLT5jbWRfd2FpdF9jb21wKTsKIAlzcGluX2xvY2tfaW5pdCgmY21kLT50X3N0YXRlX2xvY2spOwogCWF0b21pY19zZXQoJmNtZC0+dHJhbnNwb3J0X2Rldl9hY3RpdmUsIDEpOwogCkBAIC0xNjQ1LDkgKzE2NTgsNyBAQAogCSAqIGFuZCBjYWxsIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZSgpIGlmIG5lY2Vzc2FyeS4uCiAJICovCiAJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZChjbWQpOwotCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKIAkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgMCwKIAkJCQkoY21kLT5kYXRhX2RpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKSk7CkBAIC0xNzE3LDEzICsxNzI4LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX3Rtcik7CiAKLXZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWRfaW50cigKLQlzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0JdHJhbnNwb3J0X2FkZF9jbWRfdG9fcXVldWUoY21kLCBUUkFOU1BPUlRfRlJFRV9DTURfSU5UUiwgZmFsc2UpOwotfQotRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZF9pbnRyKTsKLQogLyoKICAqIElmIHRoZSB0YXNrIGlzIGFjdGl2ZSwgcmVxdWVzdCBpdCB0byBiZSBzdG9wcGVkIGFuZCBzbGVlcCB1bnRpbCBpdAogICogaGFzIGNvbXBsZXRlZC4KQEAgLTE4ODYsNyArMTg5MCw3IEBACiAJCQkJQVNDUV8yQ0hfUFJFVklPVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1RfU1RBVFVTKTsKIAogCQlyZXQgPSBjbWQtPnNlX3Rmby0+cXVldWVfc3RhdHVzKGNtZCk7Ci0JCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQogCQkJZ290byBxdWV1ZV9mdWxsOwogCQlnb3RvIGNoZWNrX3N0b3A7CiAJY2FzZSBQWVhfVFJBTlNQT1JUX1VTRV9TRU5TRV9SRUFTT046CkBAIC0xOTEzLDcgKzE5MTcsNyBAQAogCWVsc2UgewogCQlyZXQgPSB0cmFuc3BvcnRfc2VuZF9jaGVja19jb25kaXRpb25fYW5kX3NlbnNlKGNtZCwKIAkJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uLCAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHF1ZXVlX2Z1bGw7CiAJfQogCkBAIC0yMTUzLDYyICsyMTU3LDIwIEBACiAJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfc2VudCwgMSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogVGhlIHN0cnVjdCBzZV9jbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpIGZ1bmN0aW9uIHBvaW50ZXIgaXMgdXNlZAotCSAqIHRvIGdyYWIgUkVQT1JUX0xVTlMgYW5kIG90aGVyIENEQnMgd2Ugd2FudCB0byBoYW5kbGUgYmVmb3JlIHRoZXkgaGl0IHRoZQotCSAqIHN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpLT5kb190YXNrKCkgY2FsbGVyIGJlbG93LgotCSAqLwotCWlmIChjbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYikgewotCQllcnJvciA9IGNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiKGNtZCk7Ci0JCWlmIChlcnJvciAhPSAwKSB7Ci0JCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBlcnJvcjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQkJdGFzay0+dGFza19mbGFncyAmPSB+VEZfQUNUSVZFOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCWF0b21pY19zZXQoJmNtZC0+dF90cmFuc3BvcnRfc2VudCwgMCk7Ci0JCQl0cmFuc3BvcnRfc3RvcF90YXNrc19mb3JfY21kKGNtZCk7Ci0JCQlhdG9taWNfaW5jKCZkZXYtPmRlcHRoX2xlZnQpOwotCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgMCwgMSk7Ci0JCQlnb3RvIGNoZWNrX2RlcHRoOwotCQl9Ci0JCS8qCi0JCSAqIEhhbmRsZSB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGZvciB0cmFuc3BvcnRfZW11bGF0ZV9jZGIoKQotCQkgKiBmb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uLCBmb2xsb3dpbmcgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DCi0JCSAqIE90aGVyd2lzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrIHdpdGgKLQkJICogcHJvcGVyIHN0YXR1cy4KLQkJICovCi0JCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0VNVUxBVEVfQ0RCX0FTWU5DKSkgewotCQkJY21kLT5zY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0dPT0Q7Ci0JCQl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKLQkJCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQ3VycmVudGx5IGZvciBhbGwgdmlydHVhbCBUQ00gcGx1Z2lucyBpbmNsdWRpbmcgSUJMT0NLLCBGSUxFSU8gYW5kCi0JCSAqIFJBTURJU0sgd2UgdXNlIHRoZSBpbnRlcm5hbCB0cmFuc3BvcnRfZW11bGF0ZV9jb250cm9sX2NkYigpIGxvZ2ljCi0JCSAqIHdpdGggc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgY2FsbGVycyBmb3IgdGhlIHByaW1hcnkgU1BDLTMgVFlQRV9ESVNLCi0JCSAqIExVTiBlbXVsYXRpb24gY29kZS4KLQkJICoKLQkJICogRm9yIFRDTS9wU0NTSSBhbmQgYWxsIG90aGVyIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCIEkvTyB0YXNrcyB3ZQotCQkgKiBjYWxsIC0+ZG9fdGFzaygpIGRpcmVjdGx5IGFuZCBsZXQgdGhlIHVuZGVybHlpbmcgVENNIHN1YnN5c3RlbSBwbHVnaW4KLQkJICogY29kZSBoYW5kbGUgdGhlIENEQiBlbXVsYXRpb24uCi0JCSAqLwotCQlpZiAoKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSAhPSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVikgJiYKLQkJICAgICghKHRhc2stPnRhc2tfc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikpKQotCQkJZXJyb3IgPSB0cmFuc3BvcnRfZW11bGF0ZV9jb250cm9sX2NkYih0YXNrKTsKLQkJZWxzZQotCQkJZXJyb3IgPSBkZXYtPnRyYW5zcG9ydC0+ZG9fdGFzayh0YXNrKTsKIAotCQlpZiAoZXJyb3IgIT0gMCkgewotCQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0gZXJyb3I7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJCXRhc2stPnRhc2tfZmxhZ3MgJj0gflRGX0FDVElWRTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci0JCQlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X3NlbnQsIDApOwotCQkJdHJhbnNwb3J0X3N0b3BfdGFza3NfZm9yX2NtZChjbWQpOwotCQkJYXRvbWljX2luYygmZGV2LT5kZXB0aF9sZWZ0KTsKLQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIDAsIDEpOwotCQl9CisJaWYgKGNtZC0+ZXhlY3V0ZV90YXNrKQorCQllcnJvciA9IGNtZC0+ZXhlY3V0ZV90YXNrKHRhc2spOworCWVsc2UKKwkJZXJyb3IgPSBkZXYtPnRyYW5zcG9ydC0+ZG9fdGFzayh0YXNrKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBlcnJvcjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXRhc2stPnRhc2tfZmxhZ3MgJj0gflRGX0FDVElWRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9zZW50LCAwKTsKKwkJdHJhbnNwb3J0X3N0b3BfdGFza3NfZm9yX2NtZChjbWQpOworCQlhdG9taWNfaW5jKCZkZXYtPmRlcHRoX2xlZnQpOworCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLCAwLCAxKTsKIAl9CiAKIAlnb3RvIGNoZWNrX2RlcHRoOwpAQCAtMjY0Miw2ICsyNjA0LDEzIEBACiAJCSAqLwogCX0KIAorCS8qCisJICogSWYgd2Ugb3BlcmF0ZSBpbiBwYXNzdGhyb3VnaCBtb2RlIHdlIHNraXAgbW9zdCBDREIgZW11bGF0aW9uIGFuZAorCSAqIGluc3RlYWQgaGFuZCB0aGUgY29tbWFuZHMgZG93biB0byB0aGUgcGh5c2ljYWwgU0NTSSBkZXZpY2UuCisJICovCisJcGFzc3Rocm91Z2ggPQorCQkoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKTsKKwogCXN3aXRjaCAoY2RiWzBdKSB7CiAJY2FzZSBSRUFEXzY6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwpAQCAtMjcyMSw5ICsyNjkwLDEyIEBACiAJCWNtZC0+dF90YXNrX2xiYSA9IHRyYW5zcG9ydF9sYmFfMzIoY2RiKTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfREFUQV9TR19JT19DREI7CiAKLQkJaWYgKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PQotCQkJCVRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKQorCQkvKgorCQkgKiBEbyBub3cgYWxsb3cgQklESSBjb21tYW5kcyBmb3IgcGFzc3Rocm91Z2ggbW9kZS4KKwkJICovCisJCWlmIChwYXNzdGhyb3VnaCkKIAkJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKKwogCQkvKgogCQkgKiBTZXR1cCBCSURJIFhPUiBjYWxsYmFjayB0byBiZSBydW4gYWZ0ZXIgSS9PIGNvbXBsZXRpb24uCiAJCSAqLwpAQCAtMjczMiwxMyArMjcwNCw2IEBACiAJCWJyZWFrOwogCWNhc2UgVkFSSUFCTEVfTEVOR1RIX0NNRDoKIAkJc2VydmljZV9hY3Rpb24gPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYls4XSk7Ci0JCS8qCi0JCSAqIERldGVybWluZSBpZiB0aGlzIGlzIFRDTS9QU0NTSSBkZXZpY2UgYW5kIHdlIHNob3VsZCBkaXNhYmxlCi0JCSAqIGludGVybmFsIGVtdWxhdGlvbiBmb3IgdGhpcyBDREIuCi0JCSAqLwotCQlwYXNzdGhyb3VnaCA9IChkZXYtPnRyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0KLQkJCQkJVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpOwotCiAJCXN3aXRjaCAoc2VydmljZV9hY3Rpb24pIHsKIAkJY2FzZSBYRFdSSVRFUkVBRF8zMjoKIAkJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMzIoY2RiLCBjbWQsICZzZWN0b3JfcmV0KTsKQEAgLTI3NTIsOCArMjcxNywxMiBAQAogCQkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NF9leHQoY2RiKTsKIAkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCisJCQkvKgorCQkJICogRG8gbm93IGFsbG93IEJJREkgY29tbWFuZHMgZm9yIHBhc3N0aHJvdWdoIG1vZGUuCisJCQkgKi8KIAkJCWlmIChwYXNzdGhyb3VnaCkKIAkJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CisKIAkJCS8qCiAJCQkgKiBTZXR1cCBCSURJIFhPUiBjYWxsYmFjayB0byBiZSBydW4gZHVyaW5nIGFmdGVyIEkvTwogCQkJICogY29tcGxldGlvbi4KQEAgLTI3NzksNyArMjc0OCw4IEBACiAKIAkJCWlmICh0YXJnZXRfY2hlY2tfd3JpdGVfc2FtZV9kaXNjYXJkKCZjZGJbMTBdLCBkZXYpIDwgMCkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKLQorCQkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX2VycigiVkFSSUFCTEVfTEVOR1RIX0NNRCBzZXJ2aWNlIGFjdGlvbiIKQEAgLTI3OTMsMTIgKzI3NjMsMTAgQEAKIAkJCS8qCiAJCQkgKiBDaGVjayBmb3IgZW11bGF0ZWQgTUlfUkVQT1JUX1RBUkdFVF9QR1MuCiAJCQkgKi8KLQkJCWlmIChjZGJbMV0gPT0gTUlfUkVQT1JUX1RBUkdFVF9QR1MpIHsKLQkJCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJKHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09Ci0JCQkJIFNQQzNfQUxVQV9FTVVMQVRFRCkgPwotCQkJCWNvcmVfZW11bGF0ZV9yZXBvcnRfdGFyZ2V0X3BvcnRfZ3JvdXBzIDoKLQkJCQlOVUxMOworCQkJaWYgKGNkYlsxXSA9PSBNSV9SRVBPUlRfVEFSR0VUX1BHUyAmJgorCQkJICAgIHN1X2Rldi0+dDEwX2FsdWEuYWx1YV90eXBlID09IFNQQzNfQUxVQV9FTVVMQVRFRCkgeworCQkJCWNtZC0+ZXhlY3V0ZV90YXNrID0KKwkJCQkJdGFyZ2V0X2VtdWxhdGVfcmVwb3J0X3RhcmdldF9wb3J0X2dyb3VwczsKIAkJCX0KIAkJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwKIAkJCSAgICAgICAoY2RiWzhdIDw8IDgpIHwgY2RiWzldOwpAQCAtMjgxOSw4ICsyNzg3LDE1IEBACiAJY2FzZSBNT0RFX1NFTlNFOgogCQlzaXplID0gY2RiWzRdOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlOwogCQlicmVhazsKIAljYXNlIE1PREVfU0VOU0VfMTA6CisJCXNpemUgPSAoY2RiWzddIDw8IDgpICsgY2RiWzhdOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfbW9kZXNlbnNlOworCQlicmVhazsKIAljYXNlIEdQQ01EX1JFQURfQlVGRkVSX0NBUEFDSVRZOgogCWNhc2UgR1BDTURfU0VORF9PUEM6CiAJY2FzZSBMT0dfU0VMRUNUOgpAQCAtMjg0MCwxMSArMjgxNSwxNCBAQAogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBQRVJTSVNURU5UX1JFU0VSVkVfSU46CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9pbjsKKwkJc2l6ZSA9IChjZGJbN10gPDwgOCkgKyBjZGJbOF07CisJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlicmVhazsKIAljYXNlIFBFUlNJU1RFTlRfUkVTRVJWRV9PVVQ6Ci0JCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCShzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PQotCQkJIFNQQzNfUEVSU0lTVEVOVF9SRVNFUlZBVElPTlMpID8KLQkJCWNvcmVfc2NzaTNfZW11bGF0ZV9wciA6IE5VTEw7CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSA9PSBTUEMzX1BFUlNJU1RFTlRfUkVTRVJWQVRJT05TKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTNfZW11bGF0ZV9wcl9vdXQ7CiAJCXNpemUgPSAoY2RiWzddIDw8IDgpICsgY2RiWzhdOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKIAkJYnJlYWs7CkBAIC0yODYzLDEyICsyODQxLDEwIEBACiAJCQkgKgogCQkJICogQ2hlY2sgZm9yIGVtdWxhdGVkIE1PX1NFVF9UQVJHRVRfUEdTLgogCQkJICovCi0JCQlpZiAoY2RiWzFdID09IE1PX1NFVF9UQVJHRVRfUEdTKSB7Ci0JCQkJY21kLT50cmFuc3BvcnRfZW11bGF0ZV9jZGIgPQotCQkJCShzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PQotCQkJCQlTUEMzX0FMVUFfRU1VTEFURUQpID8KLQkJCQljb3JlX2VtdWxhdGVfc2V0X3RhcmdldF9wb3J0X2dyb3VwcyA6Ci0JCQkJTlVMTDsKKwkJCWlmIChjZGJbMV0gPT0gTU9fU0VUX1RBUkdFVF9QR1MgJiYKKwkJCSAgICBzdV9kZXYtPnQxMF9hbHVhLmFsdWFfdHlwZSA9PSBTUEMzX0FMVUFfRU1VTEFURUQpIHsKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9CisJCQkJCXRhcmdldF9lbXVsYXRlX3NldF90YXJnZXRfcG9ydF9ncm91cHM7CiAJCQl9CiAKIAkJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwKQEAgLTI4ODgsNiArMjg2NCw4IEBACiAJCWlmIChjbWQtPnNlX2Rldi0+ZGV2X3Rhc2tfYXR0cl90eXBlID09IFNBTV9UQVNLX0FUVFJfRU1VTEFURUQpCiAJCQljbWQtPnNhbV90YXNrX2F0dHIgPSBNU0dfSEVBRF9UQUc7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV9pbnF1aXJ5OwogCQlicmVhazsKIAljYXNlIFJFQURfQlVGRkVSOgogCQlzaXplID0gKGNkYls2XSA8PCAxNikgKyAoY2RiWzddIDw8IDgpICsgY2RiWzhdOwpAQCAtMjg5Niw2ICsyODc0LDggQEAKIAljYXNlIFJFQURfQ0FQQUNJVFk6CiAJCXNpemUgPSBSRUFEX0NBUF9MRU47CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NPTlRST0xfU0dfSU9fQ0RCOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV9yZWFkY2FwYWNpdHk7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9NRURJQV9TRVJJQUxfTlVNQkVSOgogCWNhc2UgU0VDVVJJVFlfUFJPVE9DT0xfSU46CkBAIC0yOTA0LDYgKzI4ODQsMjEgQEAKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CiAJCWJyZWFrOwogCWNhc2UgU0VSVklDRV9BQ1RJT05fSU46CisJCXN3aXRjaCAoY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZikgeworCQljYXNlIFNBSV9SRUFEX0NBUEFDSVRZXzE2OgorCQkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCQljbWQtPmV4ZWN1dGVfdGFzayA9CisJCQkJCXRhcmdldF9lbXVsYXRlX3JlYWRjYXBhY2l0eV8xNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHBhc3N0aHJvdWdoKQorCQkJCWJyZWFrOworCisJCQlwcl9lcnIoIlVuc3VwcG9ydGVkIFNBOiAweCUwMnhcbiIsCisJCQkJY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZik7CisJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CisJCX0KKwkJLypGQUxMVEhST1VHSCovCiAJY2FzZSBBQ0NFU1NfQ09OVFJPTF9JTjoKIAljYXNlIEFDQ0VTU19DT05UUk9MX09VVDoKIAljYXNlIEVYVEVOREVEX0NPUFk6CkBAIC0yOTM0LDYgKzI5MjksOCBAQAogCWNhc2UgUkVRVUVTVF9TRU5TRToKIAkJc2l6ZSA9IGNkYls0XTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREI7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3JlcXVlc3Rfc2Vuc2U7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9FTEVNRU5UX1NUQVRVUzoKIAkJc2l6ZSA9IDY1NTM2ICogY2RiWzddICsgMjU2ICogY2RiWzhdICsgY2RiWzldOwpAQCAtMjk2MSwxMCArMjk1OCw4IEBACiAJCSAqIGlzIHJ1bm5pbmcgaW4gU1BDX1BBU1NUSFJPVUdILCBhbmQgd2FudHMgcmVzZXJ2YXRpb25zCiAJCSAqIGVtdWxhdGlvbiBkaXNhYmxlZC4KIAkJICovCi0JCWNtZC0+dHJhbnNwb3J0X2VtdWxhdGVfY2RiID0KLQkJCQkoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUgIT0KLQkJCQkgU1BDX1BBU1NUSFJPVUdIKSA/Ci0JCQkJY29yZV9zY3NpMl9lbXVsYXRlX2NyaCA6IE5VTEw7CisJCWlmIChzdV9kZXYtPnQxMF9wci5yZXNfdHlwZSAhPSBTUENfUEFTU1RIUk9VR0gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9zY3NpMl9yZXNlcnZhdGlvbl9yZXNlcnZlOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CiAJCWJyZWFrOwogCWNhc2UgUkVMRUFTRToKQEAgLTI5NzgsMTAgKzI5NzMsOCBAQAogCQllbHNlCiAJCQlzaXplID0gY21kLT5kYXRhX2xlbmd0aDsKIAotCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJKHN1X2Rldi0+dDEwX3ByLnJlc190eXBlICE9Ci0JCQkJIFNQQ19QQVNTVEhST1VHSCkgPwotCQkJCWNvcmVfc2NzaTJfZW11bGF0ZV9jcmggOiBOVUxMOworCQlpZiAoc3VfZGV2LT50MTBfcHIucmVzX3R5cGUgIT0gU1BDX1BBU1NUSFJPVUdIKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfc2NzaTJfcmVzZXJ2YXRpb25fcmVsZWFzZTsKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfTk9OX0RBVEFfQ0RCOwogCQlicmVhazsKIAljYXNlIFNZTkNIUk9OSVpFX0NBQ0hFOgpAQCAtMzAwMiwxNiArMjk5NSw5IEBACiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CiAKLQkJLyoKLQkJICogRm9yIFRDTS9wU0NTSSBwYXNzdGhyb3VnaCwgc2tpcCBjbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYigpCi0JCSAqLwotCQlpZiAoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09IFRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKQorCQlpZiAocGFzc3Rocm91Z2gpCiAJCQlicmVhazsKLQkJLyoKLQkJICogU2V0IFNDRl9FTVVMQVRFX0NEQl9BU1lOQyB0byBlbnN1cmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotCQkgKiBmb3IgU1lOQ0hST05JWkVfQ0FDSEUqIEltbWVkPTEgY2FzZSBpbiBfX3RyYW5zcG9ydF9leGVjdXRlX3Rhc2tzKCkKLQkJICovCi0JCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9FTVVMQVRFX0NEQl9BU1lOQzsKKwogCQkvKgogCQkgKiBDaGVjayB0byBlbnN1cmUgdGhhdCBMQkEgKyBSYW5nZSBkb2VzIG5vdCBleGNlZWQgcGFzdCBlbmQgb2YKIAkJICogZGV2aWNlIGZvciBJQkxPQ0sgYW5kIEZJTEVJTyAtPmRvX3N5bmNfY2FjaGUoKSBiYWNrZW5kIGNhbGxzCkBAIC0zMDIwLDEwICszMDA2LDEzIEBACiAJCQlpZiAodHJhbnNwb3J0X2NtZF9nZXRfdmFsaWRfc2VjdG9ycyhjbWQpIDwgMCkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAkJfQorCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3N5bmNocm9uaXplX2NhY2hlOwogCQlicmVhazsKIAljYXNlIFVOTUFQOgogCQlzaXplID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbN10pOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQjsKKwkJaWYgKCFwYXNzdGhyb3VnaCkKKwkJCWNtZC0+ZXhlY3V0ZV90YXNrID0gdGFyZ2V0X2VtdWxhdGVfdW5tYXA7CiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfU0FNRV8xNjoKIAkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xNihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwpAQCAtMzA0Miw2ICszMDMxLDggQEAKIAogCQlpZiAodGFyZ2V0X2NoZWNrX3dyaXRlX3NhbWVfZGlzY2FyZCgmY2RiWzFdLCBkZXYpIDwgMCkKIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOworCQlpZiAoIXBhc3N0aHJvdWdoKQorCQkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfZW11bGF0ZV93cml0ZV9zYW1lOwogCQlicmVhazsKIAljYXNlIFdSSVRFX1NBTUU6CiAJCXNlY3RvcnMgPSB0cmFuc3BvcnRfZ2V0X3NlY3RvcnNfMTAoY2RiLCBjbWQsICZzZWN0b3JfcmV0KTsKQEAgLTMwNjMsMjYgKzMwNTQsMzEgQEAKIAkJICovCiAJCWlmICh0YXJnZXRfY2hlY2tfd3JpdGVfc2FtZV9kaXNjYXJkKCZjZGJbMV0sIGRldikgPCAwKQogCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX3dyaXRlX3NhbWU7CiAJCWJyZWFrOwogCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6Ci0JY2FzZSBHUENNRF9DTE9TRV9UUkFDSzoKIAljYXNlIEVSQVNFOgotCWNhc2UgSU5JVElBTElaRV9FTEVNRU5UX1NUQVRVUzoKLQljYXNlIEdQQ01EX0xPQURfVU5MT0FEOgogCWNhc2UgUkVaRVJPX1VOSVQ6CiAJY2FzZSBTRUVLXzEwOgotCWNhc2UgR1BDTURfU0VUX1NQRUVEOgogCWNhc2UgU1BBQ0U6CiAJY2FzZSBTVEFSVF9TVE9QOgogCWNhc2UgVEVTVF9VTklUX1JFQURZOgogCWNhc2UgVkVSSUZZOgogCWNhc2UgV1JJVEVfRklMRU1BUktTOgorCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9OT05fREFUQV9DREI7CisJCWlmICghcGFzc3Rocm91Z2gpCisJCQljbWQtPmV4ZWN1dGVfdGFzayA9IHRhcmdldF9lbXVsYXRlX25vb3A7CisJCWJyZWFrOworCWNhc2UgR1BDTURfQ0xPU0VfVFJBQ0s6CisJY2FzZSBJTklUSUFMSVpFX0VMRU1FTlRfU1RBVFVTOgorCWNhc2UgR1BDTURfTE9BRF9VTkxPQUQ6CisJY2FzZSBHUENNRF9TRVRfU1BFRUQ6CiAJY2FzZSBNT1ZFX01FRElVTToKIAkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfTk9OX0RBVEFfQ0RCOwogCQlicmVhazsKIAljYXNlIFJFUE9SVF9MVU5TOgotCQljbWQtPnRyYW5zcG9ydF9lbXVsYXRlX2NkYiA9Ci0JCQkJdHJhbnNwb3J0X2NvcmVfcmVwb3J0X2x1bl9yZXNwb25zZTsKKwkJY21kLT5leGVjdXRlX3Rhc2sgPSB0YXJnZXRfcmVwb3J0X2x1bnM7CiAJCXNpemUgPSAoY2RiWzZdIDw8IDI0KSB8IChjZGJbN10gPDwgMTYpIHwgKGNkYls4XSA8PCA4KSB8IGNkYls5XTsKIAkJLyoKIAkJICogRG8gaW1wbGljdCBIRUFEX09GX1FVRVVFIHByb2Nlc3NpbmcgZm9yIFJFUE9SVF9MVU5TCkBAIC0zMTM0LDYgKzMxMzAsMTEgQEAKIAkJY21kLT5kYXRhX2xlbmd0aCA9IHNpemU7CiAJfQogCisJLyogcmVqZWN0IGFueSBjb21tYW5kIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhhbmRsZXIgZm9yICovCisJaWYgKCEocGFzc3Rocm91Z2ggfHwgY21kLT5leGVjdXRlX3Rhc2sgfHwKKwkgICAgIChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCKSkpCisJCWdvdG8gb3V0X3Vuc3VwcG9ydGVkX2NkYjsKKwogCS8qIExldCdzIGxpbWl0IGNvbnRyb2wgY2RicyB0byBhIHBhZ2UsIGZvciBzaW1wbGljaXR5J3Mgc2FrZS4gKi8KIAlpZiAoKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ09OVFJPTF9TR19JT19DREIpICYmCiAJICAgIHNpemUgPiBQQUdFX1NJWkUpCkBAIC0zMzA4LDcgKzMzMDksNyBAQAogCQlpZiAoY21kLT5zY3NpX3N0YXR1cykgewogCQkJcmV0ID0gdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgKIAkJCQkJY21kLCByZWFzb24sIDEpOwotCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQogCQkJCWdvdG8gcXVldWVfZnVsbDsKIAogCQkJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CkBAIC0zMzMzLDcgKzMzMzQsNyBAQAogCQlzcGluX3VubG9jaygmY21kLT5zZV9sdW4tPmx1bl9zZXBfbG9jayk7CiAKIAkJcmV0ID0gY21kLT5zZV90Zm8tPnF1ZXVlX2RhdGFfaW4oY21kKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHF1ZXVlX2Z1bGw7CiAJCWJyZWFrOwogCWNhc2UgRE1BX1RPX0RFVklDRToKQEAgLTMzNTQsMTQgKzMzNTUsMTQgQEAKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKCZjbWQtPnNlX2x1bi0+bHVuX3NlcF9sb2NrKTsKIAkJCXJldCA9IGNtZC0+c2VfdGZvLT5xdWV1ZV9kYXRhX2luKGNtZCk7Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCQkJZ290byBxdWV1ZV9mdWxsOwogCQkJYnJlYWs7CiAJCX0KIAkJLyogRmFsbCB0aHJvdWdoIGZvciBETUFfVE9fREVWSUNFICovCiAJY2FzZSBETUFfTk9ORToKIAkJcmV0ID0gY21kLT5zZV90Zm8tPnF1ZXVlX3N0YXR1cyhjbWQpOwotCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCWlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVOT01FTSkKIAkJCWdvdG8gcXVldWVfZnVsbDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM4OTAsNyArMzg5MSwxMCBAQAogCiBzdGF0aWMgdm9pZCB0cmFuc3BvcnRfd3JpdGVfcGVuZGluZ19xZihzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7Ci0JaWYgKGNtZC0+c2VfdGZvLT53cml0ZV9wZW5kaW5nKGNtZCkgPT0gLUVBR0FJTikgeworCWludCByZXQ7CisKKwlyZXQgPSBjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZyhjbWQpOworCWlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVOT01FTSkgewogCQlwcl9kZWJ1ZygiSGFuZGxpbmcgd3JpdGVfcGVuZGluZyBRVUVVRV9fRlVMTDogc2VfY21kOiAlcFxuIiwKIAkJCSBjbWQpOwogCQl0cmFuc3BvcnRfaGFuZGxlX3F1ZXVlX2Z1bGwoY21kLCBjbWQtPnNlX2Rldik7CkBAIC0zOTIwLDcgKzM5MjQsNyBAQAogCSAqIGZyb250ZW5kIGtub3cgdGhhdCBXUklURSBidWZmZXJzIGFyZSByZWFkeS4KIAkgKi8KIAlyZXQgPSBjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZyhjbWQpOwotCWlmIChyZXQgPT0gLUVBR0FJTikKKwlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCiAJCWdvdG8gcXVldWVfZnVsbDsKIAllbHNlIGlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtMzkzMSw3ICszOTM1LDcgQEAKIAlwcl9kZWJ1ZygiSGFuZGxpbmcgd3JpdGVfcGVuZGluZyBRVUVVRV9fRlVMTDogc2VfY21kOiAlcFxuIiwgY21kKTsKIAljbWQtPnRfc3RhdGUgPSBUUkFOU1BPUlRfQ09NUExFVEVfUUZfV1A7CiAJdHJhbnNwb3J0X2hhbmRsZV9xdWV1ZV9mdWxsKGNtZCwgY21kLT5zZV9kZXYpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzk0OSw2ICszOTUzLDE0IEBACiAJCWNvcmVfdG1yX3JlbGVhc2VfcmVxKGNtZC0+c2VfdG1yX3JlcSk7CiAJaWYgKGNtZC0+dF90YXNrX2NkYiAhPSBjbWQtPl9fdF90YXNrX2NkYikKIAkJa2ZyZWUoY21kLT50X3Rhc2tfY2RiKTsKKwkvKgorCSAqIENoZWNrIGlmIHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMoKSBpcyBleHBlY3RpbmcgdG8KKwkgKiByZWxlYXNlIHNlX2NtZCBkaXJlY3RseSBoZXJlLi4KKwkgKi8KKwlpZiAoY21kLT5jaGVja19yZWxlYXNlICE9IDAgJiYgY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKQorCQlpZiAoY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKGNtZCkgIT0gMCkKKwkJCXJldHVybjsKKwogCWNtZC0+c2VfdGZvLT5yZWxlYXNlX2NtZChjbWQpOwogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfcmVsZWFzZV9jbWQpOwpAQCAtMzk3Niw2ICszOTg4LDExNCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCk7CiAKKy8qIHRhcmdldF9nZXRfc2Vzc19jbWQgLSBBZGQgY29tbWFuZCB0byBhY3RpdmUgLT5zZXNzX2NtZF9saXN0CisgKiBAc2Vfc2VzczoJc2Vzc2lvbiB0byByZWZlcmVuY2UKKyAqIEBzZV9jbWQ6CWNvbW1hbmQgZGVzY3JpcHRvciB0byBhZGQKKyAqLwordm9pZCB0YXJnZXRfZ2V0X3Nlc3NfY21kKHN0cnVjdCBzZV9zZXNzaW9uICpzZV9zZXNzLCBzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmc2VfY21kLT5zZV9jbWRfbGlzdCwgJnNlX3Nlc3MtPnNlc3NfY21kX2xpc3QpOworCXNlX2NtZC0+Y2hlY2tfcmVsZWFzZSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfZ2V0X3Nlc3NfY21kKTsKKworLyogdGFyZ2V0X3B1dF9zZXNzX2NtZCAtIENoZWNrIGZvciBhY3RpdmUgSS9PIHNodXRkb3duIG9yIGxpc3QgZGVsZXRlCisgKiBAc2Vfc2VzczogCXNlc3Npb24gdG8gcmVmZXJlbmNlCisgKiBAc2VfY21kOgljb21tYW5kIGRlc2NyaXB0b3IgdG8gZHJvcAorICovCitpbnQgdGFyZ2V0X3B1dF9zZXNzX2NtZChzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqc2Vfc2Vzcywgc3RydWN0IHNlX2NtZCAqc2VfY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZzZV9jbWQtPnNlX2NtZF9saXN0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzZV9zZXNzLT5zZXNzX3RlYXJpbmdfZG93biAmJiBzZV9jbWQtPmNtZF93YWl0X3NldCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZXNzX2NtZF9sb2NrLCBmbGFncyk7CisJCWNvbXBsZXRlKCZzZV9jbWQtPmNtZF93YWl0X2NvbXApOworCQlyZXR1cm4gMTsKKwl9CisJbGlzdF9kZWwoJnNlX2NtZC0+c2VfY21kX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX3Nlc3MtPnNlc3NfY21kX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfcHV0X3Nlc3NfY21kKTsKKworLyogdGFyZ2V0X3NwbGljZV9zZXNzX2NtZF9saXN0IC0gU3BsaXQgYWN0aXZlIGNtZHMgaW50byBzZXNzX3dhaXRfbGlzdAorICogQHNlX3Nlc3M6CXNlc3Npb24gdG8gc3BsaXQKKyAqLwordm9pZCB0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3Qoc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MpCit7CisJc3RydWN0IHNlX2NtZCAqc2VfY21kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCkpOworCUlOSVRfTElTVF9IRUFEKCZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworCXNlX3Nlc3MtPnNlc3NfdGVhcmluZ19kb3duID0gMTsKKworCWxpc3Rfc3BsaWNlX2luaXQoJnNlX3Nlc3MtPnNlc3NfY21kX2xpc3QsICZzZV9zZXNzLT5zZXNzX3dhaXRfbGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlX2NtZCwgJnNlX3Nlc3MtPnNlc3Nfd2FpdF9saXN0LCBzZV9jbWRfbGlzdCkKKwkJc2VfY21kLT5jbWRfd2FpdF9zZXQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vzc19jbWRfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3QpOworCisvKiB0YXJnZXRfd2FpdF9mb3Jfc2Vzc19jbWRzIC0gV2FpdCBmb3Igb3V0c3RhbmRpbmcgZGVzY3JpcHRvcnMKKyAqIEBzZV9zZXNzOiAgICBzZXNzaW9uIHRvIHdhaXQgZm9yIGFjdGl2ZSBJL08KKyAqIEB3YWl0X2Zvcl90YXNrczoJTWFrZSBleHRyYSB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3MgY2FsbAorICovCit2b2lkIHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMoCisJc3RydWN0IHNlX3Nlc3Npb24gKnNlX3Nlc3MsCisJaW50IHdhaXRfZm9yX3Rhc2tzKQoreworCXN0cnVjdCBzZV9jbWQgKnNlX2NtZCwgKnRtcF9jbWQ7CisJYm9vbCByYyA9IGZhbHNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlX2NtZCwgdG1wX2NtZCwKKwkJCQkmc2Vfc2Vzcy0+c2Vzc193YWl0X2xpc3QsIHNlX2NtZF9saXN0KSB7CisJCWxpc3RfZGVsKCZzZV9jbWQtPnNlX2NtZF9saXN0KTsKKworCQlwcl9kZWJ1ZygiV2FpdGluZyBmb3Igc2VfY21kOiAlcCB0X3N0YXRlOiAlZCwgZmFicmljIHN0YXRlOiIKKwkJCSIgJWRcbiIsIHNlX2NtZCwgc2VfY21kLT50X3N0YXRlLAorCQkJc2VfY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoc2VfY21kKSk7CisKKwkJaWYgKHdhaXRfZm9yX3Rhc2tzKSB7CisJCQlwcl9kZWJ1ZygiQ2FsbGluZyB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3Mgc2VfY21kOiAlcCB0X3N0YXRlOiAlZCwiCisJCQkJIiBmYWJyaWMgc3RhdGU6ICVkXG4iLCBzZV9jbWQsIHNlX2NtZC0+dF9zdGF0ZSwKKwkJCQlzZV9jbWQtPnNlX3Rmby0+Z2V0X2NtZF9zdGF0ZShzZV9jbWQpKTsKKworCQkJcmMgPSB0cmFuc3BvcnRfd2FpdF9mb3JfdGFza3Moc2VfY21kKTsKKworCQkJcHJfZGVidWcoIkFmdGVyIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyBzZV9jbWQ6ICVwIHRfc3RhdGU6ICVkLCIKKwkJCQkiIGZhYnJpYyBzdGF0ZTogJWRcbiIsIHNlX2NtZCwgc2VfY21kLT50X3N0YXRlLAorCQkJCXNlX2NtZC0+c2VfdGZvLT5nZXRfY21kX3N0YXRlKHNlX2NtZCkpOworCQl9CisKKwkJaWYgKCFyYykgeworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmc2VfY21kLT5jbWRfd2FpdF9jb21wKTsKKwkJCXByX2RlYnVnKCJBZnRlciBjbWRfd2FpdF9jb21wOiBzZV9jbWQ6ICVwIHRfc3RhdGU6ICVkIgorCQkJCSIgZmFicmljIHN0YXRlOiAlZFxuIiwgc2VfY21kLCBzZV9jbWQtPnRfc3RhdGUsCisJCQkJc2VfY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoc2VfY21kKSk7CisJCX0KKworCQlzZV9jbWQtPnNlX3Rmby0+cmVsZWFzZV9jbWQoc2VfY21kKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRhcmdldF93YWl0X2Zvcl9zZXNzX2NtZHMpOworCiAvKgl0cmFuc3BvcnRfbHVuX3dhaXRfZm9yX3Rhc2tzKCk6CiAgKgogICoJQ2FsbGVkIGZyb20gQ29uZmlnRlMgY29udGV4dCB0byBzdG9wIHRoZSBwYXNzZWQgc3RydWN0IHNlX2NtZCB0byBhbGxvdwpAQCAtNDE1MiwxNCArNDI3MiwxNCBAQAogICogQ2FsbGVkIGZyb20gZnJvbnRlbmQgZmFicmljIGNvbnRleHQgdG8gd2FpdCBmb3Igc3RvcmFnZSBlbmdpbmUKICAqIHRvIHBhdXNlIGFuZC9vciByZWxlYXNlIGZyb250ZW5kIGdlbmVyYXRlZCBzdHJ1Y3Qgc2VfY21kLgogICovCi12b2lkIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQpCitib29sIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCWlmICghKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NFX0xVTl9DTUQpICYmICEoY21kLT5zZV90bXJfcmVxKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAl9CiAJLyoKIAkgKiBPbmx5IHBlcmZvcm0gYSBwb3NzaWJsZSB3YWl0X2Zvcl90YXNrcyBpZiBTQ0ZfU1VQUE9SVEVEX1NBTV9PUENPREUKQEAgLTQxNjcsNyArNDI4Nyw3IEBACiAJICovCiAJaWYgKCEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU1VQUE9SVEVEX1NBTV9PUENPREUpICYmICFjbWQtPnNlX3Rtcl9yZXEpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCS8qCiAJICogSWYgd2UgYXJlIGFscmVhZHkgc3RvcHBlZCBkdWUgdG8gYW4gZXh0ZXJuYWwgZXZlbnQgKGllOiBMVU4gc2h1dGRvd24pCkBAIC00MjEwLDcgKzQzMzAsNyBAQAogCWlmICghYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfYWN0aXZlKSB8fAogCSAgICAgYXRvbWljX3JlYWQoJmNtZC0+dF90cmFuc3BvcnRfYWJvcnRlZCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9zdG9wLCAxKTsKQEAgLTQyMzUsNiArNDM1NSw4IEBACiAJCWNtZC0+c2VfdGZvLT5nZXRfdGFza190YWcoY21kKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRydWU7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyk7CiAKQEAgLTQ1ODMsOSArNDcwNSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCi0JCQkJYnJlYWs7Ci0JCQllbHNlIGlmIChyZXQgPCAwKSB7CisJCQlpZiAocmV0IDwgMCkgewogCQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKIAkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLAogCQkJCQkwLCAoY21kLT5kYXRhX2RpcmVjdGlvbiAhPQpAQCAtNDU5NSw5ICs0NzE1LDYgQEAKIAkJY2FzZSBUUkFOU1BPUlRfUFJPQ0VTU19XUklURToKIAkJCXRyYW5zcG9ydF9nZW5lcmljX3Byb2Nlc3Nfd3JpdGUoY21kKTsKIAkJCWJyZWFrOwotCQljYXNlIFRSQU5TUE9SVF9GUkVFX0NNRF9JTlRSOgotCQkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoY21kLCAwKTsKLQkJCWJyZWFrOwogCQljYXNlIFRSQU5TUE9SVF9QUk9DRVNTX1RNUjoKIAkJCXRyYW5zcG9ydF9nZW5lcmljX2RvX3RtcihjbWQpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmggYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKaW5kZXggMzc0OWQ4Yi4uZTA1YzU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAvKgogICogSU8gbWV0aG9kcy4KICAqLwotdm9pZCBmdF9jaGVja19zdG9wX2ZyZWUoc3RydWN0IHNlX2NtZCAqKTsKK2ludCBmdF9jaGVja19zdG9wX2ZyZWUoc3RydWN0IHNlX2NtZCAqKTsKIHZvaWQgZnRfcmVsZWFzZV9jbWQoc3RydWN0IHNlX2NtZCAqKTsKIGludCBmdF9xdWV1ZV9zdGF0dXMoc3RydWN0IHNlX2NtZCAqKTsKIGludCBmdF9xdWV1ZV9kYXRhX2luKHN0cnVjdCBzZV9jbWQgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwppbmRleCA2MTk1MDI2Li40ZmFjMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTExMiw5ICsxMTIsMTAgQEAKIAlmdF9mcmVlX2NtZChjbWQpOwogfQogCi12b2lkIGZ0X2NoZWNrX3N0b3BfZnJlZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCitpbnQgZnRfY2hlY2tfc3RvcF9mcmVlKHN0cnVjdCBzZV9jbWQgKnNlX2NtZCkKIHsKIAl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZChzZV9jbWQsIDApOworCXJldHVybiAxOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwppbmRleCA3MDhmOGU5Li5kZDlhNTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwpAQCAtNjc4LDEwICs2NzgsMTAgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGRlbGF5ID4gMTAwMCkKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCYodHotPnBvbGxfcXVldWUpLAorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2ZyZWV6YWJsZV93cSwgJih0ei0+cG9sbF9xdWV1ZSksCiAJCQkJICAgICAgcm91bmRfamlmZmllcyhtc2Vjc190b19qaWZmaWVzKGRlbGF5KSkpOwogCWVsc2UKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCYodHotPnBvbGxfcXVldWUpLAorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2ZyZWV6YWJsZV93cSwgJih0ei0+cG9sbF9xdWV1ZSksCiAJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9LY29uZmlnIGIvZHJpdmVycy90dHkvS2NvbmZpZwppbmRleCA4ODE2ZjUzLi5iM2QxNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVlQKIAlib29sICJWaXJ0dWFsIHRlcm1pbmFsIiBpZiBFWFBFUlQKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiAhUzM5MCAmJiAhVU1MCiAJc2VsZWN0IElOUFVUCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaHZjL0tjb25maWcgYi9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZwppbmRleCBlMzcxNzUzLi40MjIyMDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9odmMvS2NvbmZpZwpAQCAtMzQsNiArMzQsMTUgQEAKIAloZWxwCiAJICBpU2VyaWVzIG1hY2hpbmVzIHN1cHBvcnQgYSBoeXBlcnZpc29yIHZpcnR1YWwgY29uc29sZS4KIAorY29uZmlnIEhWQ19PUEFMCisJYm9vbCAiT1BBTCBDb25zb2xlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUENfUE9XRVJOVgorCXNlbGVjdCBIVkNfRFJJVkVSCisJc2VsZWN0IEhWQ19JUlEKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQb3dlck5WIG1hY2hpbmVzIHJ1bm5pbmcgdW5kZXIgT1BBTCBuZWVkIHRoYXQgZHJpdmVyIHRvIGdldCBhIGNvbnNvbGUKKwogY29uZmlnIEhWQ19SVEFTCiAJYm9vbCAiSUJNIFJUQVMgQ29uc29sZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUFBDX1JUQVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZSBiL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZQppbmRleCBlMjkyMDUzLi44OWFiZjQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIG9iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjX3Zpby5vIGh2c2lfbGliLm8KK29iai0kKENPTkZJR19IVkNfT1BBTCkJCSs9IGh2Y19vcGFsLm8gaHZzaV9saWIubwogb2JqLSQoQ09ORklHX0hWQ19PTERfSFZTSSkJKz0gaHZzaS5vCiBvYmotJChDT05GSUdfSFZDX0lTRVJJRVMpCSs9IGh2Y19pc2VyaWVzLm8KIG9iai0kKENPTkZJR19IVkNfUlRBUykJCSs9IGh2Y19ydGFzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfY29uc29sZS5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKaW5kZXggNzQzMGJjMy4uYjZiMmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2Y19jb25zb2xlLmMKQEAgLTg1Miw3ICs4NTIsNyBAQAogCSAqIGZpbmQgaW5kZXggdG8gdXNlOgogCSAqIHNlZSBpZiB0aGlzIHZ0ZXJtIGlkIG1hdGNoZXMgb25lIHJlZ2lzdGVyZWQgZm9yIGNvbnNvbGUuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKKwlmb3IgKGk9MDsgaSA8IE1BWF9OUl9IVkNfQ09OU09MRVM7IGkrKykKIAkJaWYgKHZ0ZXJtbm9zW2ldID09IGhwLT52dGVybW5vICYmCiAJCSAgICBjb25zX29wc1tpXSA9PSBocC0+b3BzKQogCQkJYnJlYWs7CkBAIC04NjIsMTMgKzg2Miw5IEBACiAJCWkgPSArK2xhc3RfaHZjOwogCiAJaHAtPmluZGV4ID0gaTsKLQlodmNfY29uc29sZS5pbmRleCA9IGk7Ci0JdnRlcm1ub3NbaV0gPSB2dGVybW5vOwotCWNvbnNfb3BzW2ldID0gb3BzOwogCiAJbGlzdF9hZGRfdGFpbCgmKGhwLT5uZXh0KSwgJmh2Y19zdHJ1Y3RzKTsKIAlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7Ci0JcmVnaXN0ZXJfY29uc29sZSgmaHZjX2NvbnNvbGUpOwogCiAJcmV0dXJuIGhwOwogfQpAQCAtODc5LDcgKzg3NSw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCi0JdW5yZWdpc3Rlcl9jb25zb2xlKCZodmNfY29uc29sZSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhwLT5sb2NrLCBmbGFncyk7CiAJdHR5ID0gdHR5X2tyZWZfZ2V0KGhwLT50dHkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX2lzZXJpZXMuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCmluZGV4IDIxYzU0OTUuLjNmNGE4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfaXNlcmllcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odmNfb3BhbC5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y19vcGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkMjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfb3BhbC5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogb3BhbCBkcml2ZXIgaW50ZXJmYWNlIHRvIGh2Y19jb25zb2xlLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2h2c2kuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CisKKyNpbmNsdWRlICJodmNfY29uc29sZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBodmNfb3BhbF9uYW1lW10gPSAiaHZjX29wYWwiOworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBodmNfb3BhbF9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAubmFtZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJpYm0sb3BhbC1jb25zb2xlLXJhdyIgfSwKKwl7IC5uYW1lID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gImlibSxvcGFsLWNvbnNvbGUtaHZzaSIgfSwKKwl7IH0sCit9OworCit0eXBlZGVmIGVudW0gaHZfcHJvdG9jb2wgeworCUhWX1BST1RPQ09MX1JBVywKKwlIVl9QUk9UT0NPTF9IVlNJCit9IGh2X3Byb3RvY29sX3Q7CisKK3N0cnVjdCBodmNfb3BhbF9wcml2IHsKKwlodl9wcm90b2NvbF90CQlwcm90bzsJLyogUmF3IGRhdGEgb3IgSFZTSSBwYWNrZXRzICovCisJc3RydWN0IGh2c2lfcHJpdglodnNpOwkvKiBIVlNJIHNwZWNpZmljIGRhdGEgKi8KK307CitzdGF0aWMgc3RydWN0IGh2Y19vcGFsX3ByaXYgKmh2Y19vcGFsX3ByaXZzW01BWF9OUl9IVkNfQ09OU09MRVNdOworCisvKiBGb3IgZWFybHkgYm9vdCBjb25zb2xlICovCitzdGF0aWMgc3RydWN0IGh2Y19vcGFsX3ByaXYgaHZjX29wYWxfYm9vdF9wcml2Oworc3RhdGljIHUzMiBodmNfb3BhbF9ib290X3Rlcm1ubzsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9vcHMgaHZjX29wYWxfcmF3X29wcyA9IHsKKwkuZ2V0X2NoYXJzID0gb3BhbF9nZXRfY2hhcnMsCisJLnB1dF9jaGFycyA9IG9wYWxfcHV0X2NoYXJzLAorCS5ub3RpZmllcl9hZGQgPSBub3RpZmllcl9hZGRfaXJxLAorCS5ub3RpZmllcl9kZWwgPSBub3RpZmllcl9kZWxfaXJxLAorCS5ub3RpZmllcl9oYW5ndXAgPSBub3RpZmllcl9oYW5ndXBfaXJxLAorfTsKKworc3RhdGljIGludCBodmNfb3BhbF9odnNpX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1t2dGVybW5vXTsKKworCWlmIChXQVJOX09OKCFwdikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGh2c2lsaWJfZ2V0X2NoYXJzKCZwdi0+aHZzaSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgaHZjX29wYWxfaHZzaV9wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGh2Y19vcGFsX3ByaXYgKnB2ID0gaHZjX29wYWxfcHJpdnNbdnRlcm1ub107CisKKwlpZiAoV0FSTl9PTighcHYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBodnNpbGliX3B1dF9jaGFycygmcHYtPmh2c2ksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW50IGh2Y19vcGFsX2h2c2lfb3BlbihzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKwlpbnQgcmM7CisKKwlwcl9kZXZlbCgiSFZTSUAleDogZG8gb3BlbiAhXG4iLCBocC0+dnRlcm1ubyk7CisKKwlyYyA9IG5vdGlmaWVyX2FkZF9pcnEoaHAsIGRhdGEpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGh2c2lsaWJfb3BlbigmcHYtPmh2c2ksIGhwKTsKK30KKworc3RhdGljIHZvaWQgaHZjX29wYWxfaHZzaV9jbG9zZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBkYXRhKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBkbyBjbG9zZSAhXG4iLCBocC0+dnRlcm1ubyk7CisKKwlodnNpbGliX2Nsb3NlKCZwdi0+aHZzaSwgaHApOworCisJbm90aWZpZXJfZGVsX2lycShocCwgZGF0YSk7Cit9CisKK3ZvaWQgaHZjX29wYWxfaHZzaV9oYW5ndXAoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1tocC0+dnRlcm1ub107CisKKwlwcl9kZXZlbCgiSFZTSUAleDogZG8gaGFuZ3VwICFcbiIsIGhwLT52dGVybW5vKTsKKworCWh2c2lsaWJfY2xvc2UoJnB2LT5odnNpLCBocCk7CisKKwlub3RpZmllcl9oYW5ndXBfaXJxKGhwLCBkYXRhKTsKK30KKworc3RhdGljIGludCBodmNfb3BhbF9odnNpX3Rpb2NtZ2V0KHN0cnVjdCBodmNfc3RydWN0ICpocCkKK3sKKwlzdHJ1Y3QgaHZjX29wYWxfcHJpdiAqcHYgPSBodmNfb3BhbF9wcml2c1tocC0+dnRlcm1ub107CisKKwlpZiAoIXB2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcHYtPmh2c2kubWN0cmw7Cit9CisKK3N0YXRpYyBpbnQgaHZjX29wYWxfaHZzaV90aW9jbXNldChzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIHVuc2lnbmVkIGludCBzZXQsCisJCQkJdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBodmNfb3BhbF9wcml2ICpwdiA9IGh2Y19vcGFsX3ByaXZzW2hwLT52dGVybW5vXTsKKworCXByX2RldmVsKCJIVlNJQCV4OiBTZXQgbW9kZW0gY29udHJvbCwgc2V0PSV4LGNscj0leFxuIiwKKwkJIGhwLT52dGVybW5vLCBzZXQsIGNsZWFyKTsKKworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWh2c2lsaWJfd3JpdGVfbWN0cmwoJnB2LT5odnNpLCAxKTsKKwllbHNlIGlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaHZzaWxpYl93cml0ZV9tY3RybCgmcHYtPmh2c2ksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfb3BzIGh2Y19vcGFsX2h2c2lfb3BzID0geworCS5nZXRfY2hhcnMgPSBodmNfb3BhbF9odnNpX2dldF9jaGFycywKKwkucHV0X2NoYXJzID0gaHZjX29wYWxfaHZzaV9wdXRfY2hhcnMsCisJLm5vdGlmaWVyX2FkZCA9IGh2Y19vcGFsX2h2c2lfb3BlbiwKKwkubm90aWZpZXJfZGVsID0gaHZjX29wYWxfaHZzaV9jbG9zZSwKKwkubm90aWZpZXJfaGFuZ3VwID0gaHZjX29wYWxfaHZzaV9oYW5ndXAsCisJLnRpb2NtZ2V0ID0gaHZjX29wYWxfaHZzaV90aW9jbWdldCwKKwkudGlvY21zZXQgPSBodmNfb3BhbF9odnNpX3Rpb2Ntc2V0LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaHZjX29wYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBodl9vcHMgKm9wczsKKwlzdHJ1Y3QgaHZjX3N0cnVjdCAqaHA7CisJc3RydWN0IGh2Y19vcGFsX3ByaXYgKnB2OworCWh2X3Byb3RvY29sX3QgcHJvdG87CisJdW5zaWduZWQgaW50IHRlcm1ubywgYm9vdCA9IDA7CisJY29uc3QgX19iZTMyICpyZWc7CisKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYub2Zfbm9kZSwgImlibSxvcGFsLWNvbnNvbGUtcmF3IikpIHsKKwkJcHJvdG8gPSBIVl9QUk9UT0NPTF9SQVc7CisJCW9wcyA9ICZodmNfb3BhbF9yYXdfb3BzOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJICAgImlibSxvcGFsLWNvbnNvbGUtaHZzaSIpKSB7CisJCXByb3RvID0gSFZfUFJPVE9DT0xfSFZTSTsKKwkJb3BzID0gJmh2Y19vcGFsX2h2c2lfb3BzOworCX0gZWxzZSB7CisJCXByX2VycigiaHZjX29wYWw6IFVua293biBwcm90b2NvbCBmb3IgJXNcbiIsCisJCSAgICAgICBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPmRldi5vZl9ub2RlLCAicmVnIiwgTlVMTCk7CisJdGVybW5vID0gcmVnID8gYmUzMl90b19jcHVwKHJlZykgOiAwOworCisJLyogSXMgaXQgb3VyIGJvb3Qgb25lID8gKi8KKwlpZiAoaHZjX29wYWxfcHJpdnNbdGVybW5vXSA9PSAmaHZjX29wYWxfYm9vdF9wcml2KSB7CisJCXB2ID0gaHZjX29wYWxfcHJpdnNbdGVybW5vXTsKKwkJYm9vdCA9IDE7CisJfSBlbHNlIGlmIChodmNfb3BhbF9wcml2c1t0ZXJtbm9dID09IE5VTEwpIHsKKwkJcHYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaHZjX29wYWxfcHJpdiksIEdGUF9LRVJORUwpOworCQlpZiAoIXB2KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXB2LT5wcm90byA9IHByb3RvOworCQlodmNfb3BhbF9wcml2c1t0ZXJtbm9dID0gcHY7CisJCWlmIChwcm90byA9PSBIVl9QUk9UT0NPTF9IVlNJKQorCQkJaHZzaWxpYl9pbml0KCZwdi0+aHZzaSwgb3BhbF9nZXRfY2hhcnMsIG9wYWxfcHV0X2NoYXJzLAorCQkJCSAgICAgdGVybW5vLCAwKTsKKworCQkvKiBJbnN0YW5jaWF0ZSBub3cgdG8gZXN0YWJsaXNoIGEgbWFwcGluZyBpbmRleD09dnRlcm1ubyAqLworCQlodmNfaW5zdGFudGlhdGUodGVybW5vLCB0ZXJtbm8sIG9wcyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJodmNfb3BhbDogRGV2aWNlICVzIGhhcyBkdXBsaWNhdGUgdGVybWluYWwgbnVtYmVyICMlZFxuIiwKKwkJICAgICAgIGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgdGVybW5vKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcl9pbmZvKCJodmMlZDogJXMgcHJvdG9jb2wgb24gJXMlc1xuIiwgdGVybW5vLAorCQlwcm90byA9PSBIVl9QUk9UT0NPTF9SQVcgPyAicmF3IiA6ICJodnNpIiwKKwkJZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLAorCQlib290ID8gIiAoYm9vdCBjb25zb2xlKSIgOiAiIik7CisKKwkvKiBXZSBkb24ndCBkbyBJUlEgeWV0ICovCisJaHAgPSBodmNfYWxsb2ModGVybW5vLCAwLCBvcHMsIE1BWF9WSU9fUFVUX0NIQVJTKTsKKwlpZiAoSVNfRVJSKGhwKSkKKwkJcmV0dXJuIFBUUl9FUlIoaHApOworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNfb3BhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCWludCByYywgdGVybW5vOworCisJdGVybW5vID0gaHAtPnZ0ZXJtbm87CisJcmMgPSBodmNfcmVtb3ZlKGhwKTsKKwlpZiAocmMgPT0gMCkgeworCQlpZiAoaHZjX29wYWxfcHJpdnNbdGVybW5vXSAhPSAmaHZjX29wYWxfYm9vdF9wcml2KQorCQkJa2ZyZWUoaHZjX29wYWxfcHJpdnNbdGVybW5vXSk7CisJCWh2Y19vcGFsX3ByaXZzW3Rlcm1ub10gPSBOVUxMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGh2Y19vcGFsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaHZjX29wYWxfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChodmNfb3BhbF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IGh2Y19vcGFsX25hbWUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBodmNfb3BhbF9tYXRjaCwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBodmNfb3BhbF9pbml0KHZvaWQpCit7CisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX09QQUwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmh2Y19vcGFsX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChodmNfb3BhbF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGh2Y19vcGFsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHZjX29wYWxfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGh2Y19vcGFsX2V4aXQpOworCitzdGF0aWMgdm9pZCB1ZGJnX29wYWxfcHV0YyhjaGFyIGMpCit7CisJdW5zaWduZWQgaW50IHRlcm1ubyA9IGh2Y19vcGFsX2Jvb3RfdGVybW5vOworCWludCBjb3VudCA9IC0xOworCisJaWYgKGMgPT0gJ1xuJykKKwkJdWRiZ19vcGFsX3B1dGMoJ1xyJyk7CisKKwlkbyB7CisJCXN3aXRjaChodmNfb3BhbF9ib290X3ByaXYucHJvdG8pIHsKKwkJY2FzZSBIVl9QUk9UT0NPTF9SQVc6CisJCQljb3VudCA9IG9wYWxfcHV0X2NoYXJzKHRlcm1ubywgJmMsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgSFZfUFJPVE9DT0xfSFZTSToKKwkJCWNvdW50ID0gaHZjX29wYWxfaHZzaV9wdXRfY2hhcnModGVybW5vLCAmYywgMSk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoY291bnQgPT0gMCB8fCBjb3VudCA9PSAtRUFHQUlOKTsKK30KKworc3RhdGljIGludCB1ZGJnX29wYWxfZ2V0Y19wb2xsKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRlcm1ubyA9IGh2Y19vcGFsX2Jvb3RfdGVybW5vOworCWludCByYyA9IDA7CisJY2hhciBjOworCisJc3dpdGNoKGh2Y19vcGFsX2Jvb3RfcHJpdi5wcm90bykgeworCWNhc2UgSFZfUFJPVE9DT0xfUkFXOgorCQlyYyA9IG9wYWxfZ2V0X2NoYXJzKHRlcm1ubywgJmMsIDEpOworCQlicmVhazsKKwljYXNlIEhWX1BST1RPQ09MX0hWU0k6CisJCXJjID0gaHZjX29wYWxfaHZzaV9nZXRfY2hhcnModGVybW5vLCAmYywgMSk7CisJCWJyZWFrOworCX0KKwlpZiAoIXJjKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgdWRiZ19vcGFsX2dldGModm9pZCkKK3sKKwlpbnQgY2g7CisJZm9yICg7OykgeworCQljaCA9IHVkYmdfb3BhbF9nZXRjX3BvbGwoKTsKKwkJaWYgKGNoID09IC0xKSB7CisJCQkvKiBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQuLi5idXQuLi4gKi8KKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGVsYXk7CisJCQlmb3IgKGRlbGF5PTA7IGRlbGF5IDwgMjAwMDAwMDsgZGVsYXkrKykKKwkJCQk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY2g7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkYmdfaW5pdF9vcGFsX2NvbW1vbih2b2lkKQoreworCXVkYmdfcHV0YyA9IHVkYmdfb3BhbF9wdXRjOworCXVkYmdfZ2V0YyA9IHVkYmdfb3BhbF9nZXRjOworCXVkYmdfZ2V0Y19wb2xsID0gdWRiZ19vcGFsX2dldGNfcG9sbDsKKwl0Yl90aWNrc19wZXJfdXNlYyA9IDB4MjAwOyAvKiBNYWtlIHVkZWxheSBub3Qgc3VjayAqLworfQorCit2b2lkIF9faW5pdCBodmNfb3BhbF9pbml0X2Vhcmx5KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzdGRvdXRfbm9kZSA9IE5VTEw7CisJY29uc3QgdTMyICp0ZXJtbm87CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGh2X29wcyAqb3BzOworCXUzMiBpbmRleDsKKworCS8qIGZpbmQgdGhlIGJvb3QgY29uc29sZSBmcm9tIC9jaG9zZW4vc3Rkb3V0ICovCisJaWYgKG9mX2Nob3NlbikKKwkJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOworCWlmIChuYW1lKSB7CisJCXN0ZG91dF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7CisJCWlmICghc3Rkb3V0X25vZGUpIHsKKwkJCXByX2VycigiaHZjX29wYWw6IEZhaWxlZCB0byBsb2NhdGUgZGVmYXVsdCBjb25zb2xlIVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucDsKKworCQkvKiBDdXJyZW50IE9QQUwgdGFrZW92ZXIgZG9lc24ndCBwcm92aWRlIHRoZSBzdGRvdXQKKwkJICogcGF0aCwgc28gd2UgaGFyZCB3aXJlIGl0CisJCSAqLworCQlvcGFsID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbC9jb25zb2xlcyIpOworCQlpZiAob3BhbCkKKwkJCXByX2RldmVsKCJodmNfb3BhbDogRm91bmQgY29uc29sZXMgaW4gbmV3IGxvY2F0aW9uXG4iKTsKKwkJaWYgKCFvcGFsKSB7CisJCQlvcGFsID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9pYm0sb3BhbCIpOworCQkJaWYgKG9wYWwpCisJCQkJcHJfZGV2ZWwoImh2Y19vcGFsOiAiCisJCQkJCSAiRm91bmQgY29uc29sZXMgaW4gb2xkIGxvY2F0aW9uXG4iKTsKKwkJfQorCQlpZiAoIW9wYWwpCisJCQlyZXR1cm47CisJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUob3BhbCwgbnApIHsKKwkJCWlmICghc3RyY21wKG5wLT5uYW1lLCAic2VyaWFsIikpIHsKKwkJCQlzdGRvdXRfbm9kZSA9IG5wOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW9mX25vZGVfcHV0KG9wYWwpOworCX0KKwlpZiAoIXN0ZG91dF9ub2RlKQorCQlyZXR1cm47CisJdGVybW5vID0gb2ZfZ2V0X3Byb3BlcnR5KHN0ZG91dF9ub2RlLCAicmVnIiwgTlVMTCk7CisJaW5kZXggPSB0ZXJtbm8gPyAqdGVybW5vIDogMDsKKwlpZiAoaW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuOworCWh2Y19vcGFsX3ByaXZzW2luZGV4XSA9ICZodmNfb3BhbF9ib290X3ByaXY7CisKKwkvKiBDaGVjayB0aGUgcHJvdG9jb2wgKi8KKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoc3Rkb3V0X25vZGUsICJpYm0sb3BhbC1jb25zb2xlLXJhdyIpKSB7CisJCWh2Y19vcGFsX2Jvb3RfcHJpdi5wcm90byA9IEhWX1BST1RPQ09MX1JBVzsKKwkJb3BzID0gJmh2Y19vcGFsX3Jhd19vcHM7CisJCXByX2RldmVsKCJodmNfb3BhbDogRm91bmQgUkFXIGNvbnNvbGVcbiIpOworCX0KKwllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdGRvdXRfbm9kZSwiaWJtLG9wYWwtY29uc29sZS1odnNpIikpIHsKKwkJaHZjX29wYWxfYm9vdF9wcml2LnByb3RvID0gSFZfUFJPVE9DT0xfSFZTSTsKKwkJb3BzID0gJmh2Y19vcGFsX2h2c2lfb3BzOworCQlodnNpbGliX2luaXQoJmh2Y19vcGFsX2Jvb3RfcHJpdi5odnNpLCBvcGFsX2dldF9jaGFycywKKwkJCSAgICAgb3BhbF9wdXRfY2hhcnMsIGluZGV4LCAxKTsKKwkJLyogSFZTSSwgcGVyZm9ybSB0aGUgaGFuZHNoYWtlIG5vdyAqLworCQlodnNpbGliX2VzdGFibGlzaCgmaHZjX29wYWxfYm9vdF9wcml2Lmh2c2kpOworCQlwcl9kZXZlbCgiaHZjX29wYWw6IEZvdW5kIEhWU0kgY29uc29sZVxuIik7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7CisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCBpbmRleCwgTlVMTCk7CisJaHZjX2luc3RhbnRpYXRlKGluZGV4LCBpbmRleCwgb3BzKTsKK291dDoKKwlvZl9ub2RlX3B1dChzdGRvdXRfbm9kZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfUkFXCit2b2lkIF9faW5pdCB1ZGJnX2luaXRfZGVidWdfb3BhbCh2b2lkKQoreworCXUzMiBpbmRleCA9IENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTF9WVEVSTU5POworCWh2Y19vcGFsX3ByaXZzW2luZGV4XSA9ICZodmNfb3BhbF9ib290X3ByaXY7CisJaHZjX29wYWxfYm9vdF9wcml2LnByb3RvID0gSFZfUFJPVE9DT0xfUkFXOworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX1JBVyAqLworCisjaWZkZWYgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19PUEFMX0hWU0kKK3ZvaWQgX19pbml0IHVkYmdfaW5pdF9kZWJ1Z19vcGFsX2h2c2kodm9pZCkKK3sKKwl1MzIgaW5kZXggPSBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX09QQUxfVlRFUk1OTzsKKwlodmNfb3BhbF9wcml2c1tpbmRleF0gPSAmaHZjX29wYWxfYm9vdF9wcml2OworCWh2Y19vcGFsX2Jvb3RfdGVybW5vID0gaW5kZXg7CisJdWRiZ19pbml0X29wYWxfY29tbW9uKCk7CisJaHZzaWxpYl9pbml0KCZodmNfb3BhbF9ib290X3ByaXYuaHZzaSwgb3BhbF9nZXRfY2hhcnMsIG9wYWxfcHV0X2NoYXJzLAorCQkgICAgIGluZGV4LCAxKTsKKwlodnNpbGliX2VzdGFibGlzaCgmaHZjX29wYWxfYm9vdF9wcml2Lmh2c2kpOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfRUFSTFlfREVCVUdfT1BBTF9IVlNJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9odmMvaHZjX3Zpby5jIGIvZHJpdmVycy90dHkvaHZjL2h2Y192aW8uYwppbmRleCAxMzBhYWNlLi5mYzNjM2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9odmMvaHZjX3Zpby5jCisrKyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNfdmlvLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+CiAjaW5jbHVkZSA8YXNtL3Zpby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaHZjL2h2Y3MuYyBiL2RyaXZlcnMvdHR5L2h2Yy9odmNzLmMKaW5kZXggNTU4ODJiNS4uYjkwNDBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2Y3MuYworKysgYi9kcml2ZXJzL3R0eS9odmMvaHZjcy5jCkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogCQlnb3RvIHJlZ2lzdGVyX2ZhaWw7CiAJfQogCi0JaHZjc19waV9idWZmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWh2Y3NfcGlfYnVmZiA9ICh1bnNpZ25lZCBsb25nICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWh2Y3NfcGlfYnVmZikgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYnVmZl9hbGxvY19mYWlsOwpAQCAtMTU0OCw3ICsxNTQ4LDcgQEAKIAlyZXR1cm4gMDsKIAoga3RocmVhZF9mYWlsOgotCWtmcmVlKGh2Y3NfcGlfYnVmZik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWh2Y3NfcGlfYnVmZik7CiBidWZmX2FsbG9jX2ZhaWw6CiAJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7CiByZWdpc3Rlcl9mYWlsOgpAQCAtMTU5Nyw3ICsxNTk3LDcgQEAKIAlrdGhyZWFkX3N0b3AoaHZjc190YXNrKTsKIAogCXNwaW5fbG9jaygmaHZjc19waV9sb2NrKTsKLQlrZnJlZShodmNzX3BpX2J1ZmYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylodmNzX3BpX2J1ZmYpOwogCWh2Y3NfcGlfYnVmZiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2h2Yy9odnNpX2xpYi5jIGIvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKaW5kZXggYmQ5YjA5OC4uNmY0ZGQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKKysrIGIvZHJpdmVycy90dHkvaHZjL2h2c2lfbGliLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXVuc2lnbmVkIGludCB0cmllcywgcmVhZCA9IDA7CiAKIAlpZiAoV0FSTl9PTighcHYpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIElmIHdlIGFyZW4ndCBvcGVuLCBkb24ndCBkbyBhbnl0aGluZyBpbiBvcmRlciB0byBhdm9pZCByYWNlcwogCSAqIHdpdGggY29ubmVjdGlvbiBlc3RhYmxpc2htZW50LiBUaGUgaHZjIGNvcmUgd2lsbCBjYWxsIHRoaXMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCWludCByYywgYWRqY291bnQgPSBtaW4oY291bnQsIEhWU0lfTUFYX09VVEdPSU5HX0RBVEEpOwogCiAJaWYgKFdBUk5fT04oIXB2KSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOwogCiAJZHAuaGRyLnR5cGUgPSBWU19EQVRBX1BBQ0tFVF9IRUFERVI7CiAJZHAuaGRyLmxlbiA9IGFkamNvdW50ICsgc2l6ZW9mKHN0cnVjdCBodnNpX2hlYWRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9uX2dzbS5jIGIvZHJpdmVycy90dHkvbl9nc20uYwppbmRleCA0Y2IwZDBhLi5mYzdiYmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9uX2dzbS5jCisrKyBiL2RyaXZlcnMvdHR5L25fZ3NtLmMKQEAgLTY2LDE0ICs2NiwxNiBAQAogc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjAwKTsKIAotI2RlZmluZSBUMQkoSFovMTApCi0jZGVmaW5lIFQyCShIWi8zKQotI2RlZmluZSBOMgkzCisvKiBEZWZhdWx0czogdGhlc2UgYXJlIGZyb20gdGhlIHNwZWNpZmljYXRpb24gKi8KKworI2RlZmluZSBUMQkxMAkJLyogMTAwbVMgKi8KKyNkZWZpbmUgVDIJMzQJCS8qIDMzM21TICovCisjZGVmaW5lIE4yCTMJCS8qIFJldHJ5IDMgdGltZXMgKi8KIAogLyogVXNlIGxvbmcgdGltZXJzIGZvciB0ZXN0aW5nIGF0IGxvdyBzcGVlZCB3aXRoIGRlYnVnIG9uICovCiAjaWZkZWYgREVCVUdfVElNSU5HCi0jZGVmaW5lIFQxCUhaCi0jZGVmaW5lIFQyCSgyICogSFopCisjZGVmaW5lIFQxCTEwMAorI2RlZmluZSBUMgkyMDAKICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKaW5kZXggYTg3YTU2Yy4uZWVhZGYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCkBAIC00NTAsMjQgKzQ1MCw2IEBACiAJX19yYXdfd3JpdGVsKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB0c2lfc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlvZmZzZXQgPSBtYXBfODI1MF9pbl9yZWcocCwgb2Zmc2V0KSA8PCBwLT5yZWdzaGlmdDsKLQlpZiAob2Zmc2V0ID09IFVBUlRfSUlSKSB7Ci0JCXRtcCA9IHJlYWRsKHAtPm1lbWJhc2UgKyAoVUFSVF9JSVIgJiB+MykpOwotCQlyZXR1cm4gKHRtcCA+PiAxNikgJiAweGZmOyAvKiBVQVJUX0lJUiAlIDQgPT0gMiAqLwotCX0gZWxzZQotCQlyZXR1cm4gcmVhZGIocC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRzaV9zZXJpYWxfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlvZmZzZXQgPSBtYXBfODI1MF9vdXRfcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7Ci0JaWYgKCEoKG9mZnNldCA9PSBVQVJUX0lFUikgJiYgKHZhbHVlICYgVUFSVF9JRVJfVVVFKSkpCi0JCXdyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW9fc2VyaWFsX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIGludCBvZmZzZXQpCiB7CiAJb2Zmc2V0ID0gbWFwXzgyNTBfaW5fcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7CkBAIC01MDgsMTEgKzQ5MCw2IEBACiAJCXAtPnNlcmlhbF9vdXQgPSBhdV9zZXJpYWxfb3V0OwogCQlicmVhazsKIAotCWNhc2UgVVBJT19UU0k6Ci0JCXAtPnNlcmlhbF9pbiA9IHRzaV9zZXJpYWxfaW47Ci0JCXAtPnNlcmlhbF9vdXQgPSB0c2lfc2VyaWFsX291dDsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlwLT5zZXJpYWxfaW4gPSBpb19zZXJpYWxfaW47CiAJCXAtPnNlcmlhbF9vdXQgPSBpb19zZXJpYWxfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jCmluZGV4IDAwYTczZWMuLjUzMDE4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtNDcyLDggKzQ3Myw2IEBACiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWx0ZXJhX2p0YWd1YXJ0X21hdGNoKTsKLSNlbHNlCi0jZGVmaW5lIGFsdGVyYV9qdGFndWFydF9tYXRjaCBOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsdGVyYV9qdGFndWFydF9wbGF0Zm9ybV9kcml2ZXIgPSB7CkBAIC00ODIsNyArNDgxLDcgQEAKIAkuZHJpdmVyCT0gewogCQkubmFtZQkJPSBEUlZfTkFNRSwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUJPSBhbHRlcmFfanRhZ3VhcnRfbWF0Y2gsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihhbHRlcmFfanRhZ3VhcnRfbWF0Y2gpLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCmluZGV4IGQ5MDI1NTguLjFkMDRjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCkBAIC02MTYsOCArNjE2LDYgQEAKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhbHRlcmFfdWFydF9tYXRjaCk7Ci0jZWxzZQotI2RlZmluZSBhbHRlcmFfdWFydF9tYXRjaCBOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsdGVyYV91YXJ0X3BsYXRmb3JtX2RyaXZlciA9IHsKQEAgLTYyNiw3ICs2MjQsNyBAQAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lCQk9IERSVl9OQU1FLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZQk9IGFsdGVyYV91YXJ0X21hdGNoLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIoYWx0ZXJhX3VhcnRfbWF0Y2gpLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTAuYwppbmRleCBjMGQxMGM0Li5lZmRmOTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDEwLmMKQEAgLTMxMiwxMiArMzEyLDE2IEBACiAJc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXAgPSAoc3RydWN0IHVhcnRfYW1iYV9wb3J0ICopcG9ydDsKIAlpbnQgcmV0dmFsOwogCisJcmV0dmFsID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCiAJLyoKIAkgKiBUcnkgdG8gZW5hYmxlIHRoZSBjbG9jayBwcm9kdWNlci4KIAkgKi8KIAlyZXR2YWwgPSBjbGtfZW5hYmxlKHVhcC0+Y2xrKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJZ290byBjbGtfdW5wcmVwOwogCiAJdWFwLT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUodWFwLT5jbGspOwogCkBAIC0zNDMsNiArMzQ3LDggQEAKIAogIGNsa19kaXM6CiAJY2xrX2Rpc2FibGUodWFwLT5jbGspOworIGNsa191bnByZXA6CisJY2xrX3VucHJlcGFyZSh1YXAtPmNsayk7CiAgb3V0OgogCXJldHVybiByZXR2YWw7CiB9CkBAIC0zNzAsNiArMzc2LDcgQEAKIAkgKiBTaHV0IGRvd24gdGhlIGNsb2NrIHByb2R1Y2VyCiAJICovCiAJY2xrX2Rpc2FibGUodWFwLT5jbGspOworCWNsa191bnByZXBhcmUodWFwLT5jbGspOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjI2LDYgKzYzMyw3IEBACiAJaW50IGJpdHMgPSA4OwogCWludCBwYXJpdHkgPSAnbic7CiAJaW50IGZsb3cgPSAnbic7CisJaW50IHJldDsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciBhbiBpbnZhbGlkIHVhcnQgbnVtYmVyIGhhcyBiZWVuIHNwZWNpZmllZCwgYW5kCkBAIC02MzgsNiArNjQ2LDEwIEBACiAJaWYgKCF1YXApCiAJCXJldHVybiAtRU5PREVWOwogCisJcmV0ID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAl1YXAtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZSh1YXAtPmNsayk7CiAKIAlpZiAob3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCmluZGV4IGY1ZjY4MzEuLjAwMjMzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwpAQCAtMTM2NywxMiArMTM2NywxNiBAQAogCXVuc2lnbmVkIGludCBjcjsKIAlpbnQgcmV0dmFsOwogCisJcmV0dmFsID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCiAJLyoKIAkgKiBUcnkgdG8gZW5hYmxlIHRoZSBjbG9jayBwcm9kdWNlci4KIAkgKi8KIAlyZXR2YWwgPSBjbGtfZW5hYmxlKHVhcC0+Y2xrKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJZ290byBjbGtfdW5wcmVwOwogCiAJdWFwLT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUodWFwLT5jbGspOwogCkBAIC0xNDQ2LDYgKzE0NTAsOCBAQAogCiAgY2xrX2RpczoKIAljbGtfZGlzYWJsZSh1YXAtPmNsayk7CisgY2xrX3VucHJlcDoKKwljbGtfdW5wcmVwYXJlKHVhcC0+Y2xrKTsKICBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE0OTcsNiArMTUwMyw3IEBACiAJICogU2h1dCBkb3duIHRoZSBjbG9jayBwcm9kdWNlcgogCSAqLwogCWNsa19kaXNhYmxlKHVhcC0+Y2xrKTsKKwljbGtfdW5wcmVwYXJlKHVhcC0+Y2xrKTsKIAogCWlmICh1YXAtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhKSB7CiAJCXN0cnVjdCBhbWJhX3BsMDExX2RhdGEgKnBsYXQ7CkBAIC0xODAwLDYgKzE4MDcsNyBAQAogCWludCBiaXRzID0gODsKIAlpbnQgcGFyaXR5ID0gJ24nOwogCWludCBmbG93ID0gJ24nOworCWludCByZXQ7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZApAQCAtMTgxMiw2ICsxODIwLDEwIEBACiAJaWYgKCF1YXApCiAJCXJldHVybiAtRU5PREVWOwogCisJcmV0ID0gY2xrX3ByZXBhcmUodWFwLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAodWFwLT5wb3J0LmRldi0+cGxhdGZvcm1fZGF0YSkgewogCQlzdHJ1Y3QgYW1iYV9wbDAxMV9kYXRhICpwbGF0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggOTk4OGMwYy4uNGEwZjg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FSTQogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNlbmRpZgogCiAjZGVmaW5lIFBEQ19CVUZGRVJfU0laRQkJNTEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKaW5kZXggNTRmZmRjNi4uMTYzZmM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwpAQCAtMTI5MCwxNyArMTI5MCwyMCBAQAogc3RhdGljIGludCBzZXJpYWxfaW14X3Byb2JlX2R0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQsCiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RhdGljIGludCBwb3J0bnVtID0gMDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQogCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF91YXJ0X2R0X2lkcywgJnBkZXYtPmRldik7CisJaW50IHJldDsKIAogCWlmICghbnApCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3BvcnQtPnBvcnQubGluZSA9IHBvcnRudW0rKzsKLQlpZiAoc3BvcnQtPnBvcnQubGluZSA+PSBVQVJUX05SKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBvZl9hbGlhc19nZXRfaWQobnAsICJzZXJpYWwiKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFsaWFzIGlkLCBlcnJubyAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXNwb3J0LT5wb3J0LmxpbmUgPSByZXQ7CiAKIAlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLHVhcnQtaGFzLXJ0c2N0cyIsIE5VTEwpKQogCQlzcG9ydC0+aGF2ZV9ydHNjdHMgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fZHJpdmVyLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwppbmRleCA2NDhiNmEzLi43Yzg2N2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV9kcml2ZXIuYwpAQCAtMjQsNyArMjQsNyBAQAogICoKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9rZ2Rib2MuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9rZ2Rib2MuYwppbmRleCA4N2U3ZTZjLi4yYjQyYTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwva2dkYm9jLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2tnZGJvYy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9DT05GSUdfTEVOCQk0MAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYwppbmRleCAyYWY1YWE1Li44YTZjYzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LWFhdmEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LWFhdmEuYwppbmRleCBkNzNhYWRkLi45MGM0MGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy1hYXZhLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDctYWF2YS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CiAjaW5jbHVkZSAibWF4MzEwNy5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDcuYwppbmRleCBkYjAwYjU5Li43ODI3MDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwNy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTA3LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJtYXgzMTA3LmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmF1ZF90YWJsZSBicmcyNl9leHRbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbC5jCmluZGV4IDI5Y2JmZDguLjgxMzFlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWwuYwpAQCAtMTksNiArMTksNyBAQAogIyBkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTMzLDYgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlICJtc21fc2VyaWFsLmgiCiAKQEAgLTU4OSw5ICs1OTIsOCBAQAogCQlpb3dyaXRlMzIoR1NCSV9QUk9UT0NPTF9JRExFLCBtc21fcG9ydC0+Z3NiaV9iYXNlICsKIAkJCSAgR1NCSV9DT05UUk9MKTsKIAotCQlnc2JpX3Jlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQkJCSAgICAgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkJICAgICAiZ3NiaV9yZXNvdXJjZSIpOworCQlnc2JpX3Jlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsCisJCQkJCQkJSU9SRVNPVVJDRV9NRU0sIDEpOwogCiAJCWlmICh1bmxpa2VseSghZ3NiaV9yZXNvdXJjZSkpCiAJCQlyZXR1cm47CkBAIC02MTIsOCArNjE0LDcgQEAKIAlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsKIAlpbnQgcmV0OwogCi0JdWFydF9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJ1YXJ0X3Jlc291cmNlIik7CisJdWFydF9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHVubGlrZWx5KCF1YXJ0X3Jlc291cmNlKSkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtNjI4LDggKzYyOSw3IEBACiAJCWdvdG8gZmFpbF9yZWxlYXNlX3BvcnQ7CiAJfQogCi0JZ3NiaV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJnc2JpX3Jlc291cmNlIik7CisJZ3NiaV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CiAJLyogSXMgdGhpcyBhIEdTQkktYmFzZWQgcG9ydD8gKi8KIAlpZiAoZ3NiaV9yZXNvdXJjZSkgewogCQlzaXplID0gcmVzb3VyY2Vfc2l6ZShnc2JpX3Jlc291cmNlKTsKQEAgLTg1Nyw2ICs4NTcsOCBAQAogCS5jb25zID0gTVNNX0NPTlNPTEUsCiB9OwogCitzdGF0aWMgYXRvbWljX3QgbXNtX3VhcnRfbmV4dF9pZCA9IEFUT01JQ19JTklUKDApOworCiBzdGF0aWMgaW50IF9faW5pdCBtc21fc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG1zbV9wb3J0ICptc21fcG9ydDsKQEAgLTg2NCw2ICs4NjYsOSBAQAogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAJaW50IGlycTsKIAorCWlmIChwZGV2LT5pZCA9PSAtMSkKKwkJcGRldi0+aWQgPSBhdG9taWNfaW5jX3JldHVybigmbXNtX3VhcnRfbmV4dF9pZCkgLSAxOworCiAJaWYgKHVubGlrZWx5KHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBVQVJUX05SKSkKIAkJcmV0dXJuIC1FTlhJTzsKIApAQCAtODczLDcgKzg3OCw3IEBACiAJcG9ydC0+ZGV2ID0gJnBkZXYtPmRldjsKIAltc21fcG9ydCA9IFVBUlRfVE9fTVNNKHBvcnQpOwogCi0JaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJnc2JpX3Jlc291cmNlIikpCisJaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSkpCiAJCW1zbV9wb3J0LT5pc191YXJ0ZG0gPSAxOwogCWVsc2UKIAkJbXNtX3BvcnQtPmlzX3VhcnRkbSA9IDA7CkBAIC04OTcsOCArOTAyLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJ1YXJ0Y2xrID0gJWRcbiIsIHBvcnQtPnVhcnRjbGspOwogCiAKLQlyZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkgICAgICJ1YXJ0X3Jlc291cmNlIik7CisJcmVzb3VyY2UgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICh1bmxpa2VseSghcmVzb3VyY2UpKQogCQlyZXR1cm4gLUVOWElPOwogCXBvcnQtPm1hcGJhc2UgPSByZXNvdXJjZS0+c3RhcnQ7CkBAIC05MjIsMTEgKzkyNiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtc21fbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLXVhcnQiIH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wbGF0Zm9ybV9kcml2ZXIgPSB7CiAJLnJlbW92ZSA9IG1zbV9zZXJpYWxfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIm1zbV9zZXJpYWwiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtX21hdGNoX3RhYmxlLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbndwc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbndwc2VyaWFsLmMKaW5kZXggOWJlYWZmMS4uZGQ0YzMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL253cHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9ud3BzZXJpYWwuYwpAQCAtMTAsNiArMTAsNyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL29mX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IGU1OGNlY2UuLmU4YzljZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvb2Zfc2VyaWFsLmMKQEAgLTIwMCwxNyArMjAwLDcgQEAKIAkucmVtb3ZlID0gb2ZfcGxhdGZvcm1fc2VyaWFsX3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG9mX3BsYXRmb3JtX3NlcmlhbF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb2ZfcGxhdGZvcm1fc2VyaWFsX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChvZl9wbGF0Zm9ybV9zZXJpYWxfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvZl9wbGF0Zm9ybV9zZXJpYWxfZXhpdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb2ZfcGxhdGZvcm1fc2VyaWFsX2RyaXZlcik7Ci19OwotbW9kdWxlX2V4aXQob2ZfcGxhdGZvcm1fc2VyaWFsX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihvZl9wbGF0Zm9ybV9zZXJpYWxfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwppbmRleCA5ODcxYzU3Li5hZmY5ZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCkBAIC0yMDcsNiArMjA3LDI1IEBACiAJfSwKIAogCS8qCisJICogQ29tbW9uIFNILTIoQSkgU0NJRiBkZWZpbml0aW9ucyBmb3IgcG9ydHMgd2l0aCBGSUZPIGRhdGEKKwkgKiBjb3VudCByZWdpc3RlcnMuCisJICovCisJW1NDSXhfU0gyX1NDSUZfRklGT0RBVEFfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAxNiB9LAorCQlbU0NCUlJdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDgsIDE2IH0sCisJCVtTQ3hURFJdCT0geyAweDBjLCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgxMCwgMTYgfSwKKwkJW1NDeFJEUl0JPSB7IDB4MTQsICA4IH0sCisJCVtTQ0ZDUl0JCT0geyAweDE4LCAxNiB9LAorCQlbU0NGRFJdCQk9IHsgMHgxYywgMTYgfSwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHsgMHgyMCwgMTYgfSwKKwkJW1NDTFNSXQkJPSB7IDB4MjQsIDE2IH0sCisJfSwKKworCS8qCiAJICogQ29tbW9uIFNILTMgU0NJRiBkZWZpbml0aW9ucy4KIAkgKi8KIAlbU0NJeF9TSDNfU0NJRl9SRUdUWVBFXSA9IHsKQEAgLTE0NDYsMTIgKzE0NjUsOCBAQAogCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogc2xhdmUgSUQgJWRcbiIsIF9fZnVuY19fLAogCQlwYXJhbS0+c2xhdmVfaWQpOwogCi0JaWYgKHBhcmFtLT5kbWFfZGV2ID09IGNoYW4tPmRldmljZS0+ZGV2KSB7Ci0JCWNoYW4tPnByaXZhdGUgPSBwYXJhbTsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKwljaGFuLT5wcml2YXRlID0gcGFyYW07CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIHJ4X3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtMTQ3NywxMCArMTQ5MiwxMCBAQAogCWRtYV9jYXBfbWFza190IG1hc2s7CiAJaW50IG5lbnQ7CiAKLQlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBwb3J0ICVkIERNQSAlcFxuIiwgX19mdW5jX18sCi0JCXBvcnQtPmxpbmUsIHMtPmNmZy0+ZG1hX2Rldik7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlczogcG9ydCAlZFxuIiwgX19mdW5jX18sCisJCXBvcnQtPmxpbmUpOwogCi0JaWYgKCFzLT5jZmctPmRtYV9kZXYpCisJaWYgKHMtPmNmZy0+ZG1hX3NsYXZlX3R4IDw9IDAgfHwgcy0+Y2ZnLT5kbWFfc2xhdmVfcnggPD0gMCkKIAkJcmV0dXJuOwogCiAJZG1hX2NhcF96ZXJvKG1hc2spOwpAQCAtMTQ5MCw3ICsxNTA1LDYgQEAKIAogCS8qIFNsYXZlIElELCBlLmcuLCBTSERNQV9TTEFWRV9TQ0lGMF9UWCAqLwogCXBhcmFtLT5zbGF2ZV9pZCA9IHMtPmNmZy0+ZG1hX3NsYXZlX3R4OwotCXBhcmFtLT5kbWFfZGV2ID0gcy0+Y2ZnLT5kbWFfZGV2OwogCiAJcy0+Y29va2llX3R4ID0gLUVJTlZBTDsKIAljaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIHBhcmFtKTsKQEAgLTE1MTksNyArMTUzMyw2IEBACiAKIAkvKiBTbGF2ZSBJRCwgZS5nLiwgU0hETUFfU0xBVkVfU0NJRjBfUlggKi8KIAlwYXJhbS0+c2xhdmVfaWQgPSBzLT5jZmctPmRtYV9zbGF2ZV9yeDsKLQlwYXJhbS0+ZG1hX2RldiA9IHMtPmNmZy0+ZG1hX2RldjsKIAogCWNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGZpbHRlciwgcGFyYW0pOwogCWRldl9kYmcocG9ydC0+ZGV2LCAiJXM6IFJYOiBnb3QgY2hhbm5lbCAlcFxuIiwgX19mdW5jX18sIGNoYW4pOwpAQCAtMTU2NCw5ICsxNTc3LDYgQEAKIHsKIAlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAotCWlmICghcy0+Y2ZnLT5kbWFfZGV2KQotCQlyZXR1cm47Ci0KIAlpZiAocy0+Y2hhbl90eCkKIAkJc2NpX3R4X2RtYV9yZWxlYXNlKHMsIGZhbHNlKTsKIAlpZiAocy0+Y2hhbl9yeCkKQEAgLTE5ODEsOSArMTk5MSw5IEBACiAJcG9ydC0+c2VyaWFsX2luCQk9IHNjaV9zZXJpYWxfaW47CiAJcG9ydC0+c2VyaWFsX291dAk9IHNjaV9zZXJpYWxfb3V0OwogCi0JaWYgKHAtPmRtYV9kZXYpCi0JCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIGRldmljZSAlcCwgdHggJWQsIHJ4ICVkXG4iLAotCQkJcC0+ZG1hX2RldiwgcC0+ZG1hX3NsYXZlX3R4LCBwLT5kbWFfc2xhdmVfcngpOworCWlmIChwLT5kbWFfc2xhdmVfdHggPiAwICYmIHAtPmRtYV9zbGF2ZV9yeCA+IDApCisJCWRldl9kYmcocG9ydC0+ZGV2LCAiRE1BIHR4ICVkLCByeCAlZFxuIiwKKwkJCXAtPmRtYV9zbGF2ZV90eCwgcC0+ZG1hX3NsYXZlX3J4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwppbmRleCBhNGI2M2JmLi5lNzZjOGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInRpbWJ1YXJ0LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKaW5kZXggYjkwODYxNS4uNmNkNDE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKQEAgLTU2OSw4ICs1NjksNiBAQAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdWxpdGVfb2ZfbWF0Y2gpOwotI2Vsc2UgLyogQ09ORklHX09GICovCi0jZGVmaW5lIHVsaXRlX29mX21hdGNoIE5VTEwKICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGludCBfX2RldmluaXQgdWxpdGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTYxMCw3ICs2MDgsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSAgPSAidWFydGxpdGUiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSB1bGl0ZV9vZl9tYXRjaCwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHVsaXRlX29mX21hdGNoKSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMKaW5kZXggOGMwM2IxMi4uYjYyNzM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIFhVQVJUUFNfVFRZX05BTUUJInR0eVBTIgogI2RlZmluZSBYVUFSVFBTX05BTUUJCSJ4dWFydHBzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvdnQvdmNfc2NyZWVuLmMgYi9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYwppbmRleCA2NjgyNWM5Li43YTM2N2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYworKysgYi9kcml2ZXJzL3R0eS92dC92Y19zY3JlZW4uYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2LmMKaW5kZXggYmRjM2RiOS4uZmY1MDU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3BkcnYuYworKysgYi9kcml2ZXJzL3Vpby91aW9fcGRydi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAidWlvX3BkcnYiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCmluZGV4IDBiMmVkNzEuLjI1ZGUzMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggNGFjMjc1MC4uNzkxZjExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC02Miw3ICs2Miw2IEBACiAJYm9vbGVhbgogCWRlZmF1bHQgeSBpZiBGU0xfU09DCiAJZGVmYXVsdCB5IGlmIFBQQ19NUEM1MTJ4Ci0JZGVmYXVsdCB5IGlmIFNPQ19BVTEyMDAKIAlkZWZhdWx0IHkgaWYgQVJDSF9JWFA0WFgKIAlkZWZhdWx0IHkgaWYgQVJDSF9XOTBYOTAwCiAJZGVmYXVsdCB5IGlmIEFSQ0hfQVQ5MVNBTTlHNDUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtZHJ2LmMgYi9kcml2ZXJzL3VzYi9jNjd4MDAvYzY3eDAwLWRydi5jCmluZGV4IDYyMDUwZjcuLjU3YWU0NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtZHJ2LmMKKysrIGIvZHJpdmVycy91c2IvYzY3eDAwL2M2N3gwMC1kcnYuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvYzY3eDAwLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IDNiMDI5YTAuLjQ1ODg3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9xdWlya3MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CkBAIC0xNjY3LDYgKzE2NjgsMTEgQEAKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfQVVUT19TVVNQRU5EKTsKKworCS8qIEFsbG93IGEgcmV0cnkgaWYgYXV0b3N1c3BlbmQgZmFpbGVkIHRlbXBvcmFyaWx5ICovCisJaWYgKHN0YXR1cyA9PSAtRUFHQUlOIHx8IHN0YXR1cyA9PSAtRUJVU1kpCisJCXVzYl9tYXJrX2xhc3RfYnVzeSh1ZGV2KTsKKwogCS8qIFRoZSBQTSBjb3JlIHJlYWN0cyBiYWRseSB1bmxlc3MgdGhlIHJldHVybiBjb2RlIGlzIDAsCiAJICogLUVBR0FJTiwgb3IgLUVCVVNZLCBzbyBhbHdheXMgcmV0dXJuIC1FQlVTWSBvbiBhbiBlcnJvci4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbm90aWZ5LmMgYi9kcml2ZXJzL3VzYi9jb3JlL25vdGlmeS5jCmluZGV4IDc1NDJkY2UuLjc3MjhjOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbm90aWZ5LmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9ub3RpZnkuYwpAQCAtMTAsNiArMTAsNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NkYzIuYwppbmRleCA2NzI2NzRjLi43MjU1NTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2RjMi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jZGMyLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInVfZXRoZXIuaCIKICNpbmNsdWRlICJ1X3NlcmlhbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCmluZGV4IDhhNTUyOWQuLmY3MWIwNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9kYmdwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZGJncC5jCmluZGV4IGY4NTVlY2YuLjYyNTY0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9kYmdwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2RiZ3AuYwpAQCAtOSw2ICs5LDcgQEAKIC8qIHZlcmJvc2UgbWVzc2FnZXMgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfZnMuYwppbmRleCA2YjFjMjBiLi5hY2IzODAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9mcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX2ZzLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IvY29tcG9zaXRlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9vYmV4LmMKaW5kZXggZTNmNzRiZi4uNWY0MDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfb2JleC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX29iZXguYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInVfc2VyaWFsLmgiCiAjaW5jbHVkZSAiZ2FkZ2V0X2NoaXBzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zb3VyY2VzaW5rLmMKaW5kZXggMTY4OTA2ZC4uN2FhN2FjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Zfc291cmNlc2luay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NvdXJjZXNpbmsuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImdfemVyby5oIgogI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDNhYzRmNTEuLmY3ZTM5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdXNiMzAwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKaW5kZXggZTU5M2YyOC4uNzRkYTIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1c2IzMDBfdWRjLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jCmluZGV4IDhmY2RlMzdhLi42ODFiZDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCmluZGV4IDNhNGE2NjQuLjY1OTdhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X3NlcmlhbC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1X3NlcmlhbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQppbmRleCBlZDQ4YTVkLi43Y2EyOTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKQEAgLTM2LDMgKzM2LDQgQEAKIG9iai0kKENPTkZJR19VU0JfSU1YMjFfSENEKQkrPSBpbXgyMS1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9GU0xfTVBIX0RSX09GKQkrPSBmc2wtbXBoLWRyLW9mLm8KIG9iai0kKENPTkZJR19VU0JfT0NURU9OMl9DT01NT04pICs9IG9jdGVvbjItY29tbW9uLm8KK29iai0kKENPTkZJR19NSVBTX0FMQ0hFTVkpCSs9IGFsY2hlbXktY29tbW9uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvYWxjaGVteS1jb21tb24uYyBiL2RyaXZlcnMvdXNiL2hvc3QvYWxjaGVteS1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE5MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9hbGNoZW15LWNvbW1vbi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogVVNCIGJsb2NrIHBvd2VyL2FjY2VzcyBtYW5hZ2VtZW50IGFic3RyYWN0aW9uLgorICoKKyAqIEF1MTAwMCs6IFRoZSBPSENJIGJsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgaXMgYXQgdGhlIGZhciBlbmQgb2YgdGhlIE9IQ0kgbWVtb3J5CisgKgkgICAgYXJlYS4gQXUxNTUwIGhhcyBPSENJIG9uIGRpZmZlcmVudCBiYXNlIGFkZHJlc3MuIE5vIG5lZWQgdG8gaGFuZGxlCisgKgkgICAgVURDIGhlcmUuCisgKiBBdTEyMDA6ICBvbmUgcmVnaXN0ZXIgdG8gY29udHJvbCBhY2Nlc3MgYW5kIGNsb2NrcyB0byBPL0VIQ0ksIFVEQyBhbmQgT1RHCisgKgkgICAgYXMgd2VsbCBhcyB0aGUgUEhZIGZvciBFSENJIGFuZCBVREMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisvKiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQVUxMDAwX09IQ0lDRkcJMHg3ZmZmYworI2RlZmluZSBBVTE1NTBfT0hDSUNGRwkweDA3ZmZjCisjZGVmaW5lIEFVMTIwMF9VU0JDRkcJMHgwNAorCisvKiBBdTEwMDAgVVNCIGJsb2NrIGNvbmZpZyBiaXRzICovCisjZGVmaW5lIFVTQkhFTl9SRAkoMSA8PCA0KQkJLyogT0hDSSByZXNldC1kb25lIGluZGljYXRvciAqLworI2RlZmluZSBVU0JIRU5fQ0UJKDEgPDwgMykJCS8qIE9IQ0kgYmxvY2sgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFVTQkhFTl9FCSgxIDw8IDIpCQkvKiBPSENJIGJsb2NrIGVuYWJsZSAqLworI2RlZmluZSBVU0JIRU5fQwkoMSA8PCAxKQkJLyogT0hDSSBibG9jayBjb2hlcmVuY3kgYml0ICovCisjZGVmaW5lIFVTQkhFTl9CRQkoMSA8PCAwKQkJLyogT0hDSSBCaWctRW5kaWFuICovCisKKy8qIEF1MTIwMCBVU0IgY29uZmlnIGJpdHMgKi8KKyNkZWZpbmUgVVNCQ0ZHX1BGRU4JKDEgPDwgMzEpCQkvKiBwcmVmZXRjaCBlbmFibGUgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfUkRDT01CCSgxIDw8IDMwKQkJLyogcmVhZCBjb21iaW5pbmcgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfVU5LTk9XTgkoNSA8PCAyMCkJCS8qIHVua25vd24sIGxlYXZlIHRoaXMgd2F5ICovCisjZGVmaW5lIFVTQkNGR19TU0QJKDEgPDwgMjMpCQkvKiBzZXJpYWwgc2hvcnQgZGV0ZWN0IGVuICovCisjZGVmaW5lIFVTQkNGR19QUEUJKDEgPDwgMTkpCQkvKiBIUyBQSFkgUExMICovCisjZGVmaW5lIFVTQkNGR19VQ0UJKDEgPDwgMTgpCQkvKiBVREMgY2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFVTQkNGR19FQ0UJKDEgPDwgMTcpCQkvKiBFSENJIGNsb2NrIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfT0NFCSgxIDw8IDE2KQkJLyogT0hDSSBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0ZMQSh4KQkoKCh4KSAmIDB4M2YpIDw8IDgpCisjZGVmaW5lIFVTQkNGR19VQ0FNCSgxIDw8IDcpCQkvKiBjb2hlcmVudCBhY2Nlc3MgKHVuZG9jKSAqLworI2RlZmluZSBVU0JDRkdfR01FCSgxIDw8IDYpCQkvKiBPVEcgbWVtIGFjY2VzcyAqLworI2RlZmluZSBVU0JDRkdfREJFCSgxIDw8IDUpCQkvKiBVREMgYnVzbWFzdGVyIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfRE1FCSgxIDw8IDQpCQkvKiBVREMgbWVtIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfRUJFCSgxIDw8IDMpCQkvKiBFSENJIGJ1c21hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0VNRQkoMSA8PCAyKQkJLyogRUhDSSBtZW0gZW5hYmxlICovCisjZGVmaW5lIFVTQkNGR19PQkUJKDEgPDwgMSkJCS8qIE9IQ0kgYnVzbWFzdGVyIGVuYWJsZSAqLworI2RlZmluZSBVU0JDRkdfT01FCSgxIDw8IDApCQkvKiBPSENJIG1lbSBlbmFibGUgKi8KKyNkZWZpbmUgVVNCQ0ZHX0lOSVRfQVUxMjAwCShVU0JDRkdfUEZFTiB8IFVTQkNGR19SRENPTUIgfCBVU0JDRkdfVU5LTk9XTiB8XAorCQkJCSBVU0JDRkdfU1NEIHwgVVNCQ0ZHX0ZMQSgweDIwKSB8IFVTQkNGR19VQ0FNIHwgXAorCQkJCSBVU0JDRkdfR01FIHwgVVNCQ0ZHX0RCRSB8IFVTQkNGR19ETUUgfAkgICAgICAgXAorCQkJCSBVU0JDRkdfRUJFIHwgVVNCQ0ZHX0VNRSB8IFVTQkNGR19PQkUgfAkgICAgICAgXAorCQkJCSBVU0JDRkdfT01FKQorCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxjaGVteV91c2JfbG9jayk7CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxMjAwX29oY2lfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfT0NFLCBiYXNlICsgQVUxMjAwX1VTQkNGRyk7CisJCXdtYigpOworCQl1ZGVsYXkoMjAwMCk7CisJfSBlbHNlIHsKKwkJX19yYXdfd3JpdGVsKHIgJiB+VVNCQ0ZHX09DRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwkJdWRlbGF5KDEwMDApOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxMjAwX2VoY2lfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfRUNFIHwgVVNCQ0ZHX1BQRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwkJdWRlbGF5KDEwMDApOworCX0gZWxzZSB7CisJCWlmICghKHIgJiBVU0JDRkdfVUNFKSkJCS8qIFVEQyBhbHNvIG9mZj8gKi8KKwkJCXIgJj0gflVTQkNGR19QUEU7CS8qIHllczogZGlzYWJsZSBIUyBQSFkgUExMICovCisJCV9fcmF3X3dyaXRlbChyICYgflVTQkNGR19FQ0UsIGJhc2UgKyBBVTEyMDBfVVNCQ0ZHKTsKKwkJd21iKCk7CisJCXVkZWxheSgxMDAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F1MTIwMF91ZGNfY29udHJvbCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyByID0gX19yYXdfcmVhZGwoYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCWlmIChlbmFibGUpIHsKKwkJX19yYXdfd3JpdGVsKHIgfCBVU0JDRkdfVUNFIHwgVVNCQ0ZHX1BQRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwl9IGVsc2UgeworCQlpZiAoIShyICYgVVNCQ0ZHX0VDRSkpCQkvKiBFSENJIGFsc28gb2ZmPyAqLworCQkJciAmPSB+VVNCQ0ZHX1BQRTsJLyogeWVzOiBkaXNhYmxlIEhTIFBIWSBQTEwgKi8KKwkJX19yYXdfd3JpdGVsKHIgJiB+VVNCQ0ZHX1VDRSwgYmFzZSArIEFVMTIwMF9VU0JDRkcpOworCQl3bWIoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1MTIwMF9jb2hlcmVuY3lfYnVnKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfRE1BX0NPSEVSRU5UKQorCS8qIEF1MTIwMCBBQiBVU0IgZG9lcyBub3Qgc3VwcG9ydCBjb2hlcmVudCBtZW1vcnkgKi8KKwlpZiAoIShyZWFkX2MwX3ByaWQoKSAmIDB4ZmYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkF1MTIwMCBVU0I6IHRoaXMgaXMgY2hpcCByZXZpc2lvbiBBQiAhIVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkF1MTIwMCBVU0I6IHVwZGF0ZSB5b3VyIGJvYXJkIG9yIHJlLWNvbmZpZ3VyZSIKKwkJCQkgIiB0aGUga2VybmVsXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF1MTIwMF91c2JfY29udHJvbChpbnQgYmxvY2ssIGludCBlbmFibGUpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlID0KKwkJCSh2b2lkIF9faW9tZW0gKilLU0VHMUFERFIoQVUxMjAwX1VTQl9DVExfUEhZU19BRERSKTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoYmxvY2spIHsKKwljYXNlIEFMQ0hFTVlfVVNCX09IQ0kwOgorCQlyZXQgPSBhdTEyMDBfY29oZXJlbmN5X2J1ZygpOworCQlpZiAocmV0ICYmIGVuYWJsZSkKKwkJCWdvdG8gb3V0OworCQlfX2F1MTIwMF9vaGNpX2NvbnRyb2woYmFzZSwgZW5hYmxlKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX1VTQl9VREMwOgorCQlfX2F1MTIwMF91ZGNfY29udHJvbChiYXNlLCBlbmFibGUpOworCQlicmVhazsKKwljYXNlIEFMQ0hFTVlfVVNCX0VIQ0kwOgorCQlyZXQgPSBhdTEyMDBfY29oZXJlbmN5X2J1ZygpOworCQlpZiAocmV0ICYmIGVuYWJsZSkKKwkJCWdvdG8gb3V0OworCQlfX2F1MTIwMF9laGNpX2NvbnRyb2woYmFzZSwgZW5hYmxlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCisvKiBpbml0aWFsaXplIFVTQiBibG9jayhzKSB0byBhIGtub3duIHdvcmtpbmcgc3RhdGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdTEyMDBfdXNiX2luaXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPQorCQkJKHZvaWQgX19pb21lbSAqKUtTRUcxQUREUihBVTEyMDBfVVNCX0NUTF9QSFlTX0FERFIpOworCV9fcmF3X3dyaXRlbChVU0JDRkdfSU5JVF9BVTEyMDAsIGJhc2UgKyBBVTEyMDBfVVNCQ0ZHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdTEwMDBfdXNiX2luaXQodW5zaWduZWQgbG9uZyByYiwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHJiICsgcmVnKTsKKwl1bnNpZ25lZCBsb25nIHIgPSBfX3Jhd19yZWFkbChiYXNlKTsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXIgfD0gVVNCSEVOX0JFOworI2VuZGlmCisJciB8PSBVU0JIRU5fQzsKKworCV9fcmF3X3dyaXRlbChyLCBiYXNlKTsKKwl3bWIoKTsKKwl1ZGVsYXkoMTAwMCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXUxeHgwX29oY2lfY29udHJvbChpbnQgZW5hYmxlLCB1bnNpZ25lZCBsb25nIHJiLCBpbnQgY3JlZykKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKHJiKTsKKwl1bnNpZ25lZCBsb25nIHIgPSBfX3Jhd19yZWFkbChiYXNlICsgY3JlZyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCV9fcmF3X3dyaXRlbChyIHwgVVNCSEVOX0NFLCBiYXNlICsgY3JlZyk7CisJCXdtYigpOworCQl1ZGVsYXkoMTAwMCk7CisJCV9fcmF3X3dyaXRlbChyIHwgVVNCSEVOX0NFIHwgVVNCSEVOX0UsIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJCXVkZWxheSgxMDAwKTsKKworCQkvKiB3YWl0IGZvciByZXNldCBjb21wbGV0ZSAocmVhZCByZWcgdHdpY2U6IGF1MTUwMCBlcnJhdHVtKSAqLworCQl3aGlsZSAoX19yYXdfcmVhZGwoYmFzZSArIGNyZWcpLAorCQkJIShfX3Jhd19yZWFkbChiYXNlICsgY3JlZykgJiBVU0JIRU5fUkQpKQorCQkJdWRlbGF5KDEwMDApOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChyICYgfihVU0JIRU5fQ0UgfCBVU0JIRU5fRSksIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBhdTEwMDBfdXNiX2NvbnRyb2woaW50IGJsb2NrLCBpbnQgZW5hYmxlLCB1bnNpZ25lZCBsb25nIHJiLAorCQkJCSAgICAgaW50IGNyZWcpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGJsb2NrKSB7CisJY2FzZSBBTENIRU1ZX1VTQl9PSENJMDoKKwkJX19hdTF4eDBfb2hjaV9jb250cm9sKGVuYWJsZSwgcmIsIGNyZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWxjaGVteV91c2JfY29udHJvbCAtIGNvbnRyb2wgQWxjaGVteSBvbi1jaGlwIFVTQiBibG9ja3MKKyAqIEBibG9jazoJVVNCIGJsb2NrIHRvIHRhcmdldAorICogQGVuYWJsZToJc2V0IDEgdG8gZW5hYmxlIGEgYmxvY2ssIDAgdG8gZGlzYWJsZQorICovCitpbnQgYWxjaGVteV91c2JfY29udHJvbChpbnQgYmxvY2ssIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFsY2hlbXlfdXNiX2xvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGFsY2hlbXlfZ2V0X2NwdXR5cGUoKSkgeworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMDAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTAwOgorCWNhc2UgQUxDSEVNWV9DUFVfQVUxMTAwOgorCQlyZXQgPSBhdTEwMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSwKKwkJCQlBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTEwMDBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlyZXQgPSBhdTEwMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSwKKwkJCQlBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTE1NTBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlyZXQgPSBhdTEyMDBfdXNiX2NvbnRyb2woYmxvY2ssIGVuYWJsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsY2hlbXlfdXNiX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWxjaGVteV91c2JfY29udHJvbCk7CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxjaGVteV91c2JfcG1kYXRhWzJdOworCitzdGF0aWMgdm9pZCBhdTEwMDBfdXNiX3BtKHVuc2lnbmVkIGxvbmcgYnIsIGludCBjcmVnLCBpbnQgc3VzcCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKGJyKTsKKworCWlmIChzdXNwKSB7CisJCWFsY2hlbXlfdXNiX3BtZGF0YVswXSA9IF9fcmF3X3JlYWRsKGJhc2UgKyBjcmVnKTsKKwkJLyogVGhlcmUgYXBwZWFycyB0byBiZSBzb21lIHVuZG9jdW1lbnRlZCByZXNldCByZWdpc3Rlci4uLi4gKi8KKwkJX19yYXdfd3JpdGVsKDAsIGJhc2UgKyAweDA0KTsKKwkJd21iKCk7CisJCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgY3JlZyk7CisJCXdtYigpOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChhbGNoZW15X3VzYl9wbWRhdGFbMF0sIGJhc2UgKyBjcmVnKTsKKwkJd21iKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdTEyMDBfdXNiX3BtKGludCBzdXNwKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9CisJCQkodm9pZCBfX2lvbWVtICopS1NFRzFBRERSKEFVMTIwMF9VU0JfT1RHX1BIWVNfQUREUik7CisJaWYgKHN1c3ApIHsKKwkJLyogc2F2ZSBPVEdfQ0FQL01VWCByZWdpc3RlcnMgd2hpY2ggaW5kaWNhdGUgcG9ydCByb3V0aW5nICovCisJCS8qIEZJWE1FOiB3cml0ZSBhbiBPVEcgZHJpdmVyIHRvIGRvIHRoYXQgKi8KKwkJYWxjaGVteV91c2JfcG1kYXRhWzBdID0gX19yYXdfcmVhZGwoYmFzZSArIDB4MDApOworCQlhbGNoZW15X3VzYl9wbWRhdGFbMV0gPSBfX3Jhd19yZWFkbChiYXNlICsgMHgwNCk7CisJfSBlbHNlIHsKKwkJLyogcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIE1NSU8gYXJlYXMgKi8KKwkJYXUxMjAwX3VzYl9pbml0KCk7CisKKwkJLyogcmVzdG9yZSBPVEdfQ0FQL01VWCByZWdpc3RlcnMgKi8KKwkJX19yYXdfd3JpdGVsKGFsY2hlbXlfdXNiX3BtZGF0YVswXSwgYmFzZSArIDB4MDApOworCQlfX3Jhd193cml0ZWwoYWxjaGVteV91c2JfcG1kYXRhWzFdLCBiYXNlICsgMHgwNCk7CisJCXdtYigpOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjaGVteV91c2JfcG0oaW50IHN1c3ApCit7CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTEwMDoKKwkJYXUxMDAwX3VzYl9wbShBVTEwMDBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTEwMDBfT0hDSUNGRywgc3VzcCk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxNTUwOgorCQlhdTEwMDBfdXNiX3BtKEFVMTU1MF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTU1MF9PSENJQ0ZHLCBzdXNwKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTEyMDA6CisJCWF1MTIwMF91c2JfcG0oc3VzcCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBhbGNoZW15X3VzYl9zdXNwZW5kKHZvaWQpCit7CisJYWxjaGVteV91c2JfcG0oMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsY2hlbXlfdXNiX3Jlc3VtZSh2b2lkKQoreworCWFsY2hlbXlfdXNiX3BtKDApOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGFsY2hlbXlfdXNiX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGFsY2hlbXlfdXNiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhbGNoZW15X3VzYl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X3VzYl9pbml0KHZvaWQpCit7CisJc3dpdGNoIChhbGNoZW15X2dldF9jcHV0eXBlKCkpIHsKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTAwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTUwMDoKKwljYXNlIEFMQ0hFTVlfQ1BVX0FVMTEwMDoKKwkJYXUxMDAwX3VzYl9pbml0KEFVMTAwMF9VU0JfT0hDSV9QSFlTX0FERFIsIEFVMTAwMF9PSENJQ0ZHKTsKKwkJYnJlYWs7CisJY2FzZSBBTENIRU1ZX0NQVV9BVTE1NTA6CisJCWF1MTAwMF91c2JfaW5pdChBVTE1NTBfVVNCX09IQ0lfUEhZU19BRERSLCBBVTE1NTBfT0hDSUNGRyk7CisJCWJyZWFrOworCWNhc2UgQUxDSEVNWV9DUFVfQVUxMjAwOgorCQlhdTEyMDBfdXNiX2luaXQoKTsKKwkJYnJlYWs7CisJfQorCisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmFsY2hlbXlfdXNiX3BtX29wcyk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYWxjaGVteV91c2JfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMKaW5kZXggNjU3MTllOC4uMThiYWZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF1MXh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYwpAQCAtMTQsNjEgKzE0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAKLSNkZWZpbmUgVVNCX0hPU1RfQ09ORklHICAgKFVTQl9NU1JfQkFTRSArIFVTQl9NU1JfTUNGRykKLSNkZWZpbmUgVVNCX01DRkdfUEZFTiAgICAgKDE8PDMxKQotI2RlZmluZSBVU0JfTUNGR19SRENPTUIgICAoMTw8MzApCi0jZGVmaW5lIFVTQl9NQ0ZHX1NTREVOICAgICgxPDwyMykKLSNkZWZpbmUgVVNCX01DRkdfUEhZUExMRU4gKDE8PDE5KQotI2RlZmluZSBVU0JfTUNGR19VQ0VDTEtFTiAoMTw8MTgpCi0jZGVmaW5lIFVTQl9NQ0ZHX0VIQ0NMS0VOICgxPDwxNykKLSNpZmRlZiBDT05GSUdfRE1BX0NPSEVSRU5UCi0jZGVmaW5lIFVTQl9NQ0ZHX1VDQU0gICAgICgxPDw3KQotI2Vsc2UKLSNkZWZpbmUgVVNCX01DRkdfVUNBTSAgICAgKDApCi0jZW5kaWYKLSNkZWZpbmUgVVNCX01DRkdfRUJNRU4gICAgKDE8PDMpCi0jZGVmaW5lIFVTQl9NQ0ZHX0VNRU1FTiAgICgxPDwyKQotCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0NFCShVU0JfTUNGR19QSFlQTExFTiB8IFVTQl9NQ0ZHX0VIQ0NMS0VOKQotI2RlZmluZSBVU0JIX0VOQUJMRV9JTklUIChVU0JfTUNGR19QRkVOICB8IFVTQl9NQ0ZHX1JEQ09NQiB8CVwKLQkJCSAgVVNCSF9FTkFCTEVfQ0UgfCBVU0JfTUNGR19TU0RFTiAgfAlcCi0JCQkgIFVTQl9NQ0ZHX1VDQU0gIHwgVVNCX01DRkdfRUJNRU4gIHwJXAotCQkJICBVU0JfTUNGR19FTUVNRU4pCi0KLSNkZWZpbmUgVVNCSF9ESVNBQkxFICAgICAgKFVTQl9NQ0ZHX0VCTUVOIHwgVVNCX01DRkdfRU1FTUVOKQogCiBleHRlcm4gaW50IHVzYl9kaXNhYmxlZCh2b2lkKTsKIAotc3RhdGljIHZvaWQgYXUxeHh4X3N0YXJ0X2VoYyh2b2lkKQotewotCS8qIGVuYWJsZSBjbG9jayB0byBFSENJIGJsb2NrIGFuZCBIUyBQSFkgUExMKi8KLQlhdV93cml0ZWwoYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKSB8IFVTQkhfRU5BQkxFX0NFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiBlbmFibGUgRUhDSSBtbWlvICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgfCBVU0JIX0VOQUJMRV9JTklULCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1MXh4eF9zdG9wX2VoYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYzsKLQotCS8qIERpc2FibGUgbWVtICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgJiB+VVNCSF9ESVNBQkxFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiBEaXNhYmxlIEVIQyBjbG9jay4gSWYgdGhlIEhTIFBIWSBpcyB1bnVzZWQgZGlzYWJsZSBpdCB0b28uICovCi0JYyA9IGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgJiB+VVNCX01DRkdfRUhDQ0xLRU47Ci0JaWYgKCEoYyAmIFVTQl9NQ0ZHX1VDRUNMS0VOKSkJCS8qIFVEQyBkaXNhYmxlZD8gKi8KLQkJYyAmPSB+VVNCX01DRkdfUEhZUExMRU47CS8qIHllczogZGlzYWJsZSBIUyBQSFkgUExMICovCi0JYXVfd3JpdGVsKGMsIFVTQl9IT1NUX0NPTkZJRyk7Ci0JYXVfc3luYygpOwotfQotCiBzdGF0aWMgaW50IGF1MXh4eF9laGNpX3NldHVwKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IGVoY2lfaGNkICplaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKQEAgLTEzNiwxNiArODQsNiBAQAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMjAwKSAmJiBkZWZpbmVkKENPTkZJR19ETUFfQ09IRVJFTlQpCi0JLyogQXUxMjAwIEFCIFVTQiBkb2VzIG5vdCBzdXBwb3J0IGNvaGVyZW50IG1lbW9yeSAqLwotCWlmICghKHJlYWRfYzBfcHJpZCgpICYgMHhmZikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRoaXMgaXMgY2hpcCByZXZpc2lvbiBBQiFcbiIsIHBkZXYtPm5hbWUpOwotCQlwcmludGsoS0VSTl9JTkZPICIlczogdXBkYXRlIHlvdXIgYm9hcmQgb3IgcmUtY29uZmlndXJlIgotCQkJCSAiIHRoZSBrZXJuZWxcbiIsIHBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0jZW5kaWYKLQogCWlmIChwZGV2LT5yZXNvdXJjZVsxXS5mbGFncyAhPSBJT1JFU09VUkNFX0lSUSkgewogCQlwcl9kZWJ1ZygicmVzb3VyY2VbMV0gaXMgbm90IElPUkVTT1VSQ0VfSVJRIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTcxLDcgKzEwOSwxMSBAQAogCQlnb3RvIGVycjI7CiAJfQogCi0JYXUxeHh4X3N0YXJ0X2VoYygpOworCWlmIChhbGNoZW15X3VzYl9jb250cm9sKEFMQ0hFTVlfVVNCX0VIQ0kwLCAxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29udHJvbGxlciBpbml0IGZhaWxlZCFcbiIsIHBkZXYtPm5hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQogCiAJZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAJZWhjaS0+Y2FwcyA9IGhjZC0+cmVnczsKQEAgLTE4Nyw3ICsxMjksOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWF1MXh4eF9zdG9wX2VoYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOworZXJyMzoKIAlpb3VubWFwKGhjZC0+cmVncyk7CiBlcnIyOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwpAQCAtMjAxLDEwICsxNDQsMTAgQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwotCWF1MXh4eF9zdG9wX2VoYygpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCiAJcmV0dXJuIDA7CkBAIC0yMzYsNyArMTc5LDcgQEAKIAkvLyBjb3VsZCBzYXZlIEZMQURKIGluIGNhc2Ugb2YgVmF1eCBwb3dlciBsb3NzCiAJLy8gLi4uIHdlJ2Qgb25seSB1c2UgaXQgdG8gaGFuZGxlIGNsb2NrIHNrZXcKIAotCWF1MXh4eF9zdG9wX2VoYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfRUhDSTAsIDApOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjQ2LDcgKzE4OSw3IEBACiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAKLQlhdTF4eHhfc3RhcnRfZWhjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9FSENJMCwgMSk7CiAKIAkvLyBtYXliZSByZXN0b3JlIEZMQURKCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwppbmRleCA1OWU4MTYxLi4zZmY5ZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCkBAIC0xMjI0LDcgKzEyMjQsNyBAQAogI2RlZmluZSBQTEFURk9STV9EUklWRVIJCWVoY2lfaGNkX3NoX2RyaXZlcgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU09DX0FVMTIwMAorI2lmZGVmIENPTkZJR19NSVBTX0FMQ0hFTVkKICNpbmNsdWRlICJlaGNpLWF1MXh4eC5jIgogI2RlZmluZQlQTEFURk9STV9EUklWRVIJCWVoY2lfaGNkX2F1MXh4eF9kcml2ZXIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwppbmRleCA3OWE2NmQ2Li45MDM3MDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGZzbF91c2IyX2Rldl9kYXRhIHsKIAljaGFyICpkcl9tb2RlOwkJLyogY29udHJvbGxlciBtb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCmluZGV4IDJjN2ZjODMuLmE3ZGMxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKaW5kZXggOTQ0MjkxZS4uYmEzYTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCkBAIC0zNSw4ICszNSw3IEBACiAKIHN0YXRpYyB2b2lkIGF0OTFfc3RhcnRfY2xvY2sodm9pZCkKIHsKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCi0JCWNsa19lbmFibGUoaGNsayk7CisJY2xrX2VuYWJsZShoY2xrKTsKIAljbGtfZW5hYmxlKGljbGspOwogCWNsa19lbmFibGUoZmNsayk7CiAJY2xvY2tlZCA9IDE7CkBAIC00Niw4ICs0NSw3IEBACiB7CiAJY2xrX2Rpc2FibGUoZmNsayk7CiAJY2xrX2Rpc2FibGUoaWNsayk7Ci0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfZGlzYWJsZShoY2xrKTsKKwljbGtfZGlzYWJsZShoY2xrKTsKIAljbG9ja2VkID0gMDsKIH0KIApAQCAtMTQyLDggKzE0MCw3IEBACiAKIAlpY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAib2hjaV9jbGsiKTsKIAlmY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidWhwY2siKTsKLQlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0OTFzYW05ZzEwKCkpCi0JCWhjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJoY2swIik7CisJaGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKIAogCWF0OTFfc3RhcnRfaGMocGRldik7CiAJb2hjaV9oY2RfaW5pdChoY2RfdG9fb2hjaShoY2QpKTsKQEAgLTE1NSw4ICsxNTIsNyBAQAogCS8qIEVycm9yIGhhbmRsaW5nICovCiAJYXQ5MV9zdG9wX2hjKHBkZXYpOwogCi0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfcHV0KGhjbGspOworCWNsa19wdXQoaGNsayk7CiAJY2xrX3B1dChmY2xrKTsKIAljbGtfcHV0KGljbGspOwogCkBAIC0xOTIsOCArMTg4LDcgQEAKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwogCi0JaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpIHx8IGNwdV9pc19hdDkxc2FtOWcxMCgpKQotCQljbGtfcHV0KGhjbGspOworCWNsa19wdXQoaGNsayk7CiAJY2xrX3B1dChmY2xrKTsKIAljbGtfcHV0KGljbGspOwogCWZjbGsgPSBpY2xrID0gaGNsayA9IE5VTEw7CkBAIC0yMjMsNiArMjE4LDE1NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBvaGNpX2F0OTFfdXNiX3NldF9wb3dlcihzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKnBkYXRhLCBpbnQgcG9ydCwgaW50IGVuYWJsZSkKK3sKKwlpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSAyKQorCQlyZXR1cm47CisKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+dmJ1c19waW5bcG9ydF0sICFwZGF0YS0+dmJ1c19waW5faW52ZXJ0ZWQgXiBlbmFibGUpOworfQorCitzdGF0aWMgaW50IG9oY2lfYXQ5MV91c2JfZ2V0X3Bvd2VyKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqcGRhdGEsIGludCBwb3J0KQoreworCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT52YnVzX3Bpbltwb3J0XSkgXiAhcGRhdGEtPnZidXNfcGluX2ludmVydGVkOworfQorCisvKgorICogVXBkYXRlIHRoZSBzdGF0dXMgZGF0YSBmcm9tIHRoZSBodWIgd2l0aCB0aGUgb3Zlci1jdXJyZW50IGluZGljYXRvciBjaGFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgb2hjaV9hdDkxX2h1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOworCWludCBsZW5ndGggPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YShoY2QsIGJ1Zik7CisJaW50IHBvcnQ7CisKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgQVJSQVlfU0laRShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluKTsgcG9ydCsrKSB7CisJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfY2hhbmdlZFtwb3J0XSkgeworCQkJaWYgKCEgbGVuZ3RoKQorCQkJCWxlbmd0aCA9IDE7CisJCQlidWZbMF0gfD0gMSA8PCAocG9ydCArIDEpOworCQl9CisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoKKyAqIExvb2sgYXQgdGhlIGNvbnRyb2wgcmVxdWVzdHMgdG8gdGhlIHJvb3QgaHViIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBvdmVycmlkZS4KKyAqLworc3RhdGljIGludCBvaGNpX2F0OTFfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsCisJCQkJIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2M7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdTMyICpkYXRhID0gKHUzMiAqKWJ1ZjsKKworCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCSJvaGNpX2F0OTFfaHViX2NvbnRyb2woJXAsMHglMDR4LDB4JTA0eCwweCUwNHgsJXAsJTA0eClcbiIsCisJCWhjZCwgdHlwZVJlcSwgd1ZhbHVlLCB3SW5kZXgsIGJ1Ziwgd0xlbmd0aCk7CisKKwlzd2l0Y2ggKHR5cGVSZXEpIHsKKwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlpZiAod1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfUE9XRVIpIHsKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJTZXRQb3J0RmVhdDogUE9XRVJcbiIpOworCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCAtIDEsIDEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJIkNsZWFyUG9ydEZlYXR1cmU6IENfT1ZFUl9DVVJSRU5UXG4iKTsKKworCQkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQkJcGRhdGEtPm92ZXJjdXJyZW50X2NoYW5nZWRbd0luZGV4LTFdID0gMDsKKwkJCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3dJbmRleC0xXSA9IDA7CisJCQl9CisKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9PVkVSX0NVUlJFTlQ6CisJCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCSJDbGVhclBvcnRGZWF0dXJlOiBPVkVSX0NVUlJFTlRcbiIpOworCisJCQlpZiAod0luZGV4ID09IDEgfHwgd0luZGV4ID09IDIpIHsKKwkJCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3dJbmRleC0xXSA9IDA7CisJCQl9CisKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJIkNsZWFyUG9ydEZlYXR1cmU6IFBPV0VSXG4iKTsKKworCQkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCAtIDEsIDApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldCA9IG9oY2lfaHViX2NvbnRyb2woaGNkLCB0eXBlUmVxLCB3VmFsdWUsIHdJbmRleCwgYnVmLCB3TGVuZ3RoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKKworCQkvKiB1cGRhdGUgdGhlIGh1YidzIGRlc2NyaXB0b3IgKi8KKworCQlkZXNjID0gKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKilidWY7CisKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIndIdWJDaGFyYWN0ZXJpc3RpY3MgMHglMDR4XG4iLAorCQkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyk7CisKKwkJLyogcmVtb3ZlIHRoZSBvbGQgY29uZmlndXJhdGlvbnMgZm9yIHBvd2VyLXN3aXRjaGluZywgYW5kCisJCSAqIG92ZXItY3VycmVudCBwcm90ZWN0aW9uLCBhbmQgaW5zZXJ0IG91ciBuZXcgY29uZmlndXJhdGlvbgorCQkgKi8KKworCQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzICY9IH5jcHVfdG9fbGUxNihIVUJfQ0hBUl9MUFNNKTsKKwkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyB8PSBjcHVfdG9fbGUxNigweDAwMDEpOworCisJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfc3VwcG9ydGVkKSB7CisJCQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzICY9IH5jcHVfdG9fbGUxNihIVUJfQ0hBUl9PQ1BNKTsKKwkJCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgfD0gIGNwdV90b19sZTE2KDB4MDAwOHwweDAwMDEpOworCQl9CisKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIndIdWJDaGFyYWN0ZXJpc3RpY3MgYWZ0ZXIgMHglMDR4XG4iLAorCQkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyk7CisKKwkJcmV0dXJuIHJldDsKKworCWNhc2UgR2V0UG9ydFN0YXR1czoKKwkJLyogY2hlY2sgcG9ydCBzdGF0dXMgKi8KKworCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiR2V0UG9ydFN0YXR1cyglZClcbiIsIHdJbmRleCk7CisKKwkJaWYgKHdJbmRleCA9PSAxIHx8IHdJbmRleCA9PSAyKSB7CisJCQlpZiAoISBvaGNpX2F0OTFfdXNiX2dldF9wb3dlcihwZGF0YSwgd0luZGV4LTEpKSB7CisJCQkJKmRhdGEgJj0gfmNwdV90b19sZTMyKFJIX1BTX1BQUyk7CisJCQl9CisKKwkJCWlmIChwZGF0YS0+b3ZlcmN1cnJlbnRfY2hhbmdlZFt3SW5kZXgtMV0pIHsKKwkJCQkqZGF0YSB8PSBjcHVfdG9fbGUzMihSSF9QU19PQ0lDKTsKKwkJCX0KKworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9zdGF0dXNbd0luZGV4LTFdKSB7CisJCQkJKmRhdGEgfD0gY3B1X3RvX2xlMzIoUkhfUFNfUE9DSSk7CisJCQl9CisJCX0KKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgb2hjaV9hdDkxX2hjX2RyaXZlciA9IHsKQEAgLTI1OCw4ICs0MDMsOCBAQAogCS8qCiAJICogcm9vdCBodWIgc3VwcG9ydAogCSAqLwotCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKLQkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKKwkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9hdDkxX2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPQkJb2hjaV9hdDkxX2h1Yl9jb250cm9sLAogI2lmZGVmIENPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKQEAgLTI2OSwyMiArNDE0LDcxIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBvaGNpX2hjZF9hdDkxX292ZXJjdXJyZW50X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkYXRhOworCXN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgdmFsLCBncGlvLCBwb3J0OworCisJLyogRnJvbSB0aGUgR1BJTyBub3RpZnlpbmcgdGhlIG92ZXItY3VycmVudCBzaXR1YXRpb24sIGZpbmQKKwkgKiBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgcG9ydCAqLworCWdwaW8gPSBpcnFfdG9fZ3BpbyhpcnEpOworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBBUlJBWV9TSVpFKHBkYXRhLT5vdmVyY3VycmVudF9waW4pOyBwb3J0KyspIHsKKwkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5bcG9ydF0gPT0gZ3BpbykKKwkJCWJyZWFrOworCX0KKworCWlmIChwb3J0ID09IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3BpbikpIHsKKwkJZGV2X2VycigmIHBkZXYtPmRldiwgIm92ZXJjdXJyZW50IGludGVycnVwdCBmcm9tIHVua25vd24gR1BJT1xuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwl2YWwgPSBncGlvX2dldF92YWx1ZShncGlvKTsKKworCS8qIFdoZW4gbm90aWZpZWQgb2YgYW4gb3Zlci1jdXJyZW50IHNpdHVhdGlvbiwgZGlzYWJsZSBwb3dlcgorCSAgIG9uIHRoZSBjb3JyZXNwb25kaW5nIHBvcnQsIGFuZCBtYXJrIHRoaXMgcG9ydCBpbgorCSAgIG92ZXItY3VycmVudC4gKi8KKwlpZiAoISB2YWwpIHsKKwkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHBvcnQsIDApOworCQlwZGF0YS0+b3ZlcmN1cnJlbnRfc3RhdHVzW3BvcnRdICA9IDE7CisJCXBkYXRhLT5vdmVyY3VycmVudF9jaGFuZ2VkW3BvcnRdID0gMTsKKwl9CisKKwlkZXZfZGJnKCYgcGRldi0+ZGV2LCAib3ZlcmN1cnJlbnQgc2l0dWF0aW9uICVzXG4iLAorCQl2YWwgPyAiZXhpdGVkIiA6ICJub3RpZmllZCIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiBzdGF0aWMgaW50IG9oY2lfaGNkX2F0OTFfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF0OTFfdXNiaF9kYXRhCSpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludAkJCWk7CiAKIAlpZiAocGRhdGEpIHsKLQkJLyogUkVWSVNJVCBtYWtlIHRoZSBkcml2ZXIgc3VwcG9ydCBwZXItcG9ydCBwb3dlciBzd2l0Y2hpbmcsCi0JCSAqIGFuZCBhbHNvIG92ZXJjdXJyZW50IGRldGVjdGlvbi4gIEhlcmUgd2UgYXNzdW1lIHRoZSBwb3J0cwotCQkgKiBhcmUgYWx3YXlzIHBvd2VyZWQgd2hpbGUgdGhpcyBkcml2ZXIgaXMgYWN0aXZlLCBhbmQgdXNlCi0JCSAqIGFjdGl2ZS1sb3cgcG93ZXIgc3dpdGNoZXMuCi0JCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwZGF0YS0+dmJ1c19waW4pOyBpKyspIHsKIAkJCWlmIChwZGF0YS0+dmJ1c19waW5baV0gPD0gMCkKIAkJCQljb250aW51ZTsKIAkJCWdwaW9fcmVxdWVzdChwZGF0YS0+dmJ1c19waW5baV0sICJvaGNpX3ZidXMiKTsKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+dmJ1c19waW5baV0sIDApOworCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIGksIDEpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3Bpbik7IGkrKykgeworCQkJaW50IHJldDsKKworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0gPD0gMCkKKwkJCQljb250aW51ZTsKKwkJCWdwaW9fcmVxdWVzdChwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldLCAib2hjaV9vdmVyY3VycmVudCIpOworCisJCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKSwKKwkJCQkJICBvaGNpX2hjZF9hdDkxX292ZXJjdXJyZW50X2lycSwKKwkJCQkJICBJUlFGX1NIQVJFRCwgIm9oY2lfb3ZlcmN1cnJlbnQiLCBwZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlncGlvX2ZyZWUocGRhdGEtPm92ZXJjdXJyZW50X3BpbltpXSk7CisJCQkJZGV2X3dhcm4oJiBwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IEdQSU8gSVJRIGZvciBvdmVyY3VycmVudFxuIik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTMwMSw5ICs0OTUsMTYgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPnZidXNfcGluKTsgaSsrKSB7CiAJCQlpZiAocGRhdGEtPnZidXNfcGluW2ldIDw9IDApCiAJCQkJY29udGludWU7Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnZidXNfcGluW2ldLCAxKTsKKwkJCW9oY2lfYXQ5MV91c2Jfc2V0X3Bvd2VyKHBkYXRhLCBpLCAwKTsKIAkJCWdwaW9fZnJlZShwZGF0YS0+dmJ1c19waW5baV0pOwogCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPm92ZXJjdXJyZW50X3Bpbik7IGkrKykgeworCQkJaWYgKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0gPD0gMCkKKwkJCQljb250aW51ZTsKKwkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5vdmVyY3VycmVudF9waW5baV0pLCBwZGV2KTsKKwkJCWdwaW9fZnJlZShwZGF0YS0+b3ZlcmN1cnJlbnRfcGluW2ldKTsKKwkJfQogCX0KIAogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYwppbmRleCA2YjdiYzUwLi45YjY2ZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCkBAIC0yMyw5MiArMjMsOSBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCi0jaWZuZGVmCUNPTkZJR19TT0NfQVUxMjAwCi0KLSNkZWZpbmUgVVNCSF9FTkFCTEVfQkUgKDE8PDApCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0MgICgxPDwxKQotI2RlZmluZSBVU0JIX0VOQUJMRV9FICAoMTw8MikKLSNkZWZpbmUgVVNCSF9FTkFCTEVfQ0UgKDE8PDMpCi0jZGVmaW5lIFVTQkhfRU5BQkxFX1JEICgxPDw0KQotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0lOSVQgKFVTQkhfRU5BQkxFX0NFIHwgVVNCSF9FTkFCTEVfRSB8IFVTQkhfRU5BQkxFX0MpCi0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLSNkZWZpbmUgVVNCSF9FTkFCTEVfSU5JVCAoVVNCSF9FTkFCTEVfQ0UgfCBVU0JIX0VOQUJMRV9FIHwgVVNCSF9FTkFCTEVfQyB8IFwKLQkJCSAgVVNCSF9FTkFCTEVfQkUpCi0jZWxzZQotI2Vycm9yIG5vdCBieXRlIG9yZGVyIGRlZmluZWQKLSNlbmRpZgotCi0jZWxzZSAgIC8qIEF1MTIwMCAqLwotCi0jZGVmaW5lIFVTQl9IT1NUX0NPTkZJRyAgICAoVVNCX01TUl9CQVNFICsgVVNCX01TUl9NQ0ZHKQotI2RlZmluZSBVU0JfTUNGR19QRkVOICAgICAoMTw8MzEpCi0jZGVmaW5lIFVTQl9NQ0ZHX1JEQ09NQiAgICgxPDwzMCkKLSNkZWZpbmUgVVNCX01DRkdfU1NERU4gICAgKDE8PDIzKQotI2RlZmluZSBVU0JfTUNGR19PSENDTEtFTiAoMTw8MTYpCi0jaWZkZWYgQ09ORklHX0RNQV9DT0hFUkVOVAotI2RlZmluZSBVU0JfTUNGR19VQ0FNICAgICAoMTw8NykKLSNlbHNlCi0jZGVmaW5lIFVTQl9NQ0ZHX1VDQU0gICAgICgwKQotI2VuZGlmCi0jZGVmaW5lIFVTQl9NQ0ZHX09CTUVOICAgICgxPDwxKQotI2RlZmluZSBVU0JfTUNGR19PTUVNRU4gICAoMTw8MCkKLQotI2RlZmluZSBVU0JIX0VOQUJMRV9DRSAgICBVU0JfTUNGR19PSENDTEtFTgotCi0jZGVmaW5lIFVTQkhfRU5BQkxFX0lOSVQgIChVU0JfTUNGR19QRkVOICB8IFVTQl9NQ0ZHX1JEQ09NQiAJfAlcCi0JCQkgICBVU0JIX0VOQUJMRV9DRSB8IFVTQl9NQ0ZHX1NTREVOCXwJXAotCQkJICAgVVNCX01DRkdfVUNBTSAgfAkJCQlcCi0JCQkgICBVU0JfTUNGR19PQk1FTiB8IFVTQl9NQ0ZHX09NRU1FTikKLQotI2RlZmluZSBVU0JIX0RJU0FCTEUgICAgICAoVVNCX01DRkdfT0JNRU4gfCBVU0JfTUNGR19PTUVNRU4pCi0KLSNlbmRpZiAgLyogQXUxMjAwICovCiAKIGV4dGVybiBpbnQgdXNiX2Rpc2FibGVkKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBhdTF4eHhfc3RhcnRfb2hjKHZvaWQpCi17Ci0JLyogZW5hYmxlIGhvc3QgY29udHJvbGxlciAqLwotI2lmbmRlZiBDT05GSUdfU09DX0FVMTIwMAotCWF1X3dyaXRlbChVU0JIX0VOQUJMRV9DRSwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDEwMDApOwotCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRykgfCBVU0JIX0VOQUJMRV9JTklULCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiB3YWl0IGZvciByZXNldCBjb21wbGV0ZSAocmVhZCByZWdpc3RlciB0d2ljZTsgc2VlIGF1MTUwMCBlcnJhdGEpICovCi0Jd2hpbGUgKGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRyksCi0JCSEoYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKSAmIFVTQkhfRU5BQkxFX1JEKSkKLQkJdWRlbGF5KDEwMDApOwotCi0jZWxzZSAgIC8qIEF1MTIwMCAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpIHwgVVNCSF9FTkFCTEVfQ0UsIFVTQl9IT1NUX0NPTkZJRyk7Ci0JYXVfc3luYygpOwotCXVkZWxheSgxMDAwKTsKLQotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpIHwgVVNCSF9FTkFCTEVfSU5JVCwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDIwMDApOwotI2VuZGlmICAvKiBBdTEyMDAgKi8KLX0KLQotc3RhdGljIHZvaWQgYXUxeHh4X3N0b3Bfb2hjKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NPQ19BVTEyMDAKLQkvKiBEaXNhYmxlIG1lbSAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpICYgflVTQkhfRElTQUJMRSwgVVNCX0hPU1RfQ09ORklHKTsKLQlhdV9zeW5jKCk7Ci0JdWRlbGF5KDEwMDApOwotI2VuZGlmCi0JLyogRGlzYWJsZSBjbG9jayAqLwotCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfSE9TVF9DT05GSUcpICYgflVTQkhfRU5BQkxFX0NFLCBVU0JfSE9TVF9DT05GSUcpOwotCWF1X3N5bmMoKTsKLX0KLQogc3RhdGljIGludCBfX2RldmluaXQgb2hjaV9hdTF4eHhfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwpAQCAtMTc4LDE3ICs5NSw2IEBACiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApICYmIGRlZmluZWQoQ09ORklHX0RNQV9DT0hFUkVOVCkKLQkvKiBBdTEyMDAgQUIgVVNCIGRvZXMgbm90IHN1cHBvcnQgY29oZXJlbnQgbWVtb3J5ICovCi0JaWYgKCEocmVhZF9jMF9wcmlkKCkgJiAweGZmKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogdGhpcyBpcyBjaGlwIHJldmlzaW9uIEFCICEhXG4iLAotCQkJcGRldi0+bmFtZSk7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiB1cGRhdGUgeW91ciBib2FyZCBvciByZS1jb25maWd1cmUgIgotCQkJCSAidGhlIGtlcm5lbFxuIiwgcGRldi0+bmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLSNlbmRpZgotCiAJaWYgKHBkZXYtPnJlc291cmNlWzFdLmZsYWdzICE9IElPUkVTT1VSQ0VfSVJRKSB7CiAJCXByX2RlYnVnKCJyZXNvdXJjZVsxXSBpcyBub3QgSU9SRVNPVVJDRV9JUlFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxNCw3ICsxMjAsMTIgQEAKIAkJZ290byBlcnIyOwogCX0KIAotCWF1MXh4eF9zdGFydF9vaGMoKTsKKwlpZiAoYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbnRyb2xsZXIgaW5pdCBmYWlsZWQhXG4iLCBwZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKwogCW9oY2lfaGNkX2luaXQoaGNkX3RvX29oY2koaGNkKSk7CiAKIAlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0LApAQCAtMjI0LDcgKzEzNSw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXUxeHh4X3N0b3Bfb2hjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMCk7CitlcnIzOgogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIGVycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CkBAIC0yMzgsNyArMTUwLDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOwotCWF1MXh4eF9zdG9wX29oYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfT0hDSTAsIDApOwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAl1c2JfcHV0X2hjZChoY2QpOwpAQCAtMjc1LDcgKzE4Nyw3IEBACiAKIAljbGVhcl9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwogCi0JYXUxeHh4X3N0b3Bfb2hjKCk7CisJYWxjaGVteV91c2JfY29udHJvbChBTENIRU1ZX1VTQl9PSENJMCwgMCk7CiBiYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPmxvY2ssIGZsYWdzKTsKIApAQCAtMjg2LDcgKzE5OCw3IEBACiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JYXUxeHh4X3N0YXJ0X29oYygpOworCWFsY2hlbXlfdXNiX2NvbnRyb2woQUxDSEVNWV9VU0JfT0hDSTAsIDEpOwogCiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiAJb2hjaV9maW5pc2hfY29udHJvbGxlcl9yZXN1bWUoaGNkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCmluZGV4IDlhZDhiZWUuLjAwMTNkYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwpAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNkZWZpbmUgVVNCX0NUUkwJSU9fQUREUkVTUyhQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHg2NCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYwppbmRleCA2MjlhOTY4Li4yN2EzZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlICJwY2ktcXVpcmtzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCmluZGV4IDc2N2FmMjYuLmJhNjFkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9kZWJ1Zy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICIuLi8uLi93dXNiY29yZS93dXNiaGMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jCmluZGV4IDk1NDZmNmMuLjFlMTQxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91d2IvdW1jLmg+CiAKICNpbmNsdWRlICIuLi8uLi93dXNiY29yZS93dXNiaGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwppbmRleCA0MzFlZmU3Li40MzBlODhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAieGhjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IDlmNTFmODguLmVmOThiMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInhoY2kuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKaW5kZXggYTA0YjJmZi4uOTFjZDg1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCmluZGV4IGU1Y2U0MmIuLmViZDYxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fc3RhdC5jCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKaW5kZXggMWMzYWZjYy4uYWQ0MDgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwppbmRleCA4YmRmMjVhLi5mOWEzZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2NwdXR5cGUuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYwppbmRleCBiMDE3NmU0Li42MWY0ZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMKQEAgLTQxLDEyICs0MSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLSNpZmRlZglDT05GSUdfQVJNCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgIm11c2JfY29yZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL2dwaW9fdmJ1cy5jIGIvZHJpdmVycy91c2Ivb3RnL2dwaW9fdmJ1cy5jCmluZGV4IDUyNzMzZDkuLmZiNjQ0YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL290Zy5jIGIvZHJpdmVycy91c2Ivb3RnL290Zy5jCmluZGV4IGZiN2FkZWYuLjMwN2MyN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL290Zy9vdGcuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvb3RnLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jIGIvZHJpdmVycy91c2Ivb3RnL3VscGkuYwppbmRleCA3NzBkNzk5Li4wYjA0NjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9vdGcvdWxwaS5jCisrKyBiL2RyaXZlcnMvdXNiL290Zy91bHBpLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3VscGkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKaW5kZXggYWJhMjAxYy4uYjQzZDA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Fjc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYwppbmRleCBiOWJiMjQ3Li5hYTkzNjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcWNzZXJpYWwuYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmMKaW5kZXggODk0NjAxOC4uZTBmNzZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJ1c2IuaCIKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYwppbmRleCBmYzMxMGY3Li45M2MxYTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5jCkBAIC00Myw2ICs0Myw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NpZXJyYV9tcy5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zaWVycmFfbXMuYwppbmRleCAxZGVjYTA3Li4zNzUzOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NpZXJyYV9tcy5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2llcnJhX21zLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAidXNiLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwppbmRleCBmZjMyMzkwLi4wZTVjOTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC91c2IvcXVpcmtzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Vhcy5jCmluZGV4IDIzZjBkZDkuLjFkMTBkNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdWFzLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91YXMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zdG9yYWdlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2RldmNvbm5lY3QuYwppbmRleCA3ZWMyNGU0Li4yMzEwMDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9kZXZjb25uZWN0LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvZGV2Y29ubmVjdC5jCkBAIC05MCw2ICs5MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAKIHN0YXRpYyB2b2lkIHd1c2JoY19kZXZjb25uZWN0X2Fja2VkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL21tYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKaW5kZXggMGE1N2ZmMC4uYjhjNzI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvbW1jLmMKQEAgLTM4LDYgKzM4LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3VzYi93dXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInd1c2JoYy5oIgogCiAvKiBJbml0aWFsaXplIHRoZSBNTUNJRXMgaGFuZGxpbmcgbWVjaGFuaXNtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYwppbmRleCAzOWRlMzkwLi41OWZmMjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKQEAgLTcwLDYgKzcwLDcgQEAKICAqIHd1c2JoY19yaF9zdGFydF9wb3J0X3Jlc2V0KCkgPz8/IHVuaW1wbGVtZW50ZWQKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3dXNiaGMuaCIKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCmluZGV4IGI2MDc5OWIuLjM3MWY2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAKIHN0YXRpYyB2b2lkIHd1c2JoY19zZXRfZ3RrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtaGMuYwppbmRleCAwZDE4NjNjLi45ZTRhOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1oYy5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLWhjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqIEZJWE1FOiBkb2NzCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAid3VzYmhjLmgiCiAjaW5jbHVkZSAid2EtaGMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKaW5kZXggMmFjYzdmNS4uZjBkNTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAid3VzYmhjLmgiCiAjaW5jbHVkZSAid2EtaGMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXhmZXIuYwppbmRleCA0MTkzMzQ1Li41N2MwMWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC04NCw2ICs4NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIndhLWhjLmgiCiAjaW5jbHVkZSAid3VzYmhjLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9lc3QuYyBiL2RyaXZlcnMvdXdiL2VzdC5jCmluZGV4IGEyZWFhM2MuLmRlODFlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2VzdC5jCisrKyBiL2RyaXZlcnMvdXdiL2VzdC5jCkBAIC00MSw2ICs0MSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvZGZ1LmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvZGZ1LmMKaW5kZXggZGE3YjFkMC4uYjA4ZDFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvZGZ1L2RmdS5jCisrKyBiL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS9kZnUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V3Yi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKgogICogaTE0ODBfcmNlYl9jaGVjayAtIENoZWNrIFJDRUIgZm9yIGV4cGVjdGVkIGZpZWxkIHZhbHVlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaWUuYyBiL2RyaXZlcnMvdXdiL2llLmMKaW5kZXggMzBhY2VjNy4uOTAyYjBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaWUuYworKysgYi9kcml2ZXJzL3V3Yi9pZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9sYy1kZXYuYyBiL2RyaXZlcnMvdXdiL2xjLWRldi5jCmluZGV4IDkwMTEzYmEuLjUyNDFmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2xjLWRldi5jCisrKyBiL2RyaXZlcnMvdXdiL2xjLWRldi5jCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKIC8qIFdlIGluaXRpYWxpemUgYWRkcmVzc2VzIHRvIDB4ZmYgKGludmFsaWQsIGFzIGl0IGlzIGJjYXN0KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvbGMtcmMuYyBiL2RyaXZlcnMvdXdiL2xjLXJjLmMKaW5kZXggYjQzOTVmNC4uNGQ2ODhjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvbGMtcmMuYworKysgYi9kcml2ZXJzL3V3Yi9sYy1yYy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvbmVoLmMgYi9kcml2ZXJzL3V3Yi9uZWguYwppbmRleCA2OTdlNTZhLi5hMjY5OTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9uZWguYworKysgYi9kcml2ZXJzL3V3Yi9uZWguYwpAQCAtODUsNiArODUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3BhbC5jIGIvZHJpdmVycy91d2IvcGFsLmMKaW5kZXggOTlhMTljMS4uOGVlN2Q5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvcGFsLmMKKysrIGIvZHJpdmVycy91d2IvcGFsLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdXdiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvcmFkaW8uYyBiL2RyaXZlcnMvdXdiL3JhZGlvLmMKaW5kZXggZjBkNTU0OS4uZDU4ZGZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvcmFkaW8uYworKysgYi9kcml2ZXJzL3V3Yi9yYWRpby5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC91d2IuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9yZXNldC5jIGIvZHJpdmVycy91d2IvcmVzZXQuYwppbmRleCAzZGU2MzBiLi43MDMyMjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9yZXNldC5jCisrKyBiL2RyaXZlcnMvdXdiL3Jlc2V0LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInV3Yi1pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi9yc3YuYyBiL2RyaXZlcnMvdXdiL3Jzdi5jCmluZGV4IDc4Yzg5MjIuLjBiMGQ4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3Jzdi5jCisrKyBiL2RyaXZlcnMvdXdiL3Jzdi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXdiLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAidXdiLWludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3NjYW4uYyBiL2RyaXZlcnMvdXdiL3NjYW4uYwppbmRleCAzNjdhYTEyLi5jYmI2YTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9zY2FuLmMKKysrIGIvZHJpdmVycy91d2Ivc2Nhbi5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlICJ1d2ItaW50ZXJuYWwuaCIKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi91bWMtYnVzLmMgYi9kcml2ZXJzL3V3Yi91bWMtYnVzLmMKaW5kZXggNWZhZDRlNy4uODJhODRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvdW1jLWJ1cy5jCisrKyBiL2RyaXZlcnMvdXdiL3VtYy1idXMuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V3Yi91bWMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvdW1jLWRldi5jIGIvZHJpdmVycy91d2IvdW1jLWRldi5jCmluZGV4IGIyOTQ4ZWMuLjQ2MTNjMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3VtYy1kZXYuYworKysgYi9kcml2ZXJzL3V3Yi91bWMtZGV2LmMKQEAgLTYsNiArNiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHUEwgdjIuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXdiL3VtYy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMgYi9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMKaW5kZXggMzY3YjVlYjguLjI2ZDBhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3VtYy1kcnYuYworKysgYi9kcml2ZXJzL3V3Yi91bWMtZHJ2LmMKQEAgLTYsNiArNiw3IEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHUEwgdjIuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91d2IvdW1jLmg+CiAKIGludCBfX3VtY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHVtY19kcml2ZXIgKnVtY19kcnYsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL3doY2kuYyBiL2RyaXZlcnMvdXdiL3doY2kuYwppbmRleCBiMjIxMTQyLi5mNDgwOTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi93aGNpLmMKKysrIGIvZHJpdmVycy91d2Ivd2hjaS5jCkBAIC03LDYgKzcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKaW5kZXggNzVhMzllYS4uYTQyNWQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKQEAgLTM3OCw4ICszNzgsOCBAQAogCQkgICAgfHwgdmFyLT54b2Zmc2V0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKLQkJICAgIHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCWlmICh2YXItPnhvZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKKwkJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA1NDliOTYwNi4uZDgzZTk2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMjU5LDYgKzI1OSwxNSBAQAogY29tbWVudCAiRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBGQgogCitjb25maWcgRkJfR1JWR0EKKwl0cmlzdGF0ZSAiQWVyb2ZsZXggR2Fpc2xlciBmcmFtZWJ1ZmZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkIgJiYgU1BBUkMKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJLS0taGVscC0tLQorCVRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU1ZHQUNUUkwgZnJhbWVidWZmZXIgaW4gdGhlIEdSTElCIElQIGxpYnJhcnkgZnJvbSBBZXJvZmxleCBHYWlzbGVyLgorCiBjb25maWcgRkJfQ0lSUlVTCiAJdHJpc3RhdGUgIkNpcnJ1cyBMb2dpYyBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgKFpPUlJPIHx8IFBDSSkKQEAgLTE3NDQsNyArMTc1Myw3IEBACiAKIGNvbmZpZyBGQl9BVTExMDAKIAlib29sICJBdTExMDAgTENEIERyaXZlciIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIE1JUFMgJiYgU09DX0FVMTEwMAorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgTUlQU19BTENIRU1ZCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApAQCAtMTc1NSwxMCArMTc2NCwxMSBAQAogCiBjb25maWcgRkJfQVUxMjAwCiAJYm9vbCAiQXUxMjAwIExDRCBEcml2ZXIiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBNSVBTICYmIFNPQ19BVTEyMDAKLQlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCi0Jc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQotCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBNSVBTX0FMQ0hFTVkKKwlzZWxlY3QgRkJfU1lTX0ZJTExSRUNUCisJc2VsZWN0IEZCX1NZU19DT1BZQVJFQQorCXNlbGVjdCBGQl9TWVNfSU1BR0VCTElUCisJc2VsZWN0IEZCX1NZU19GT1BTCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZnJhbWVidWZmZXIgZHJpdmVyIGZvciB0aGUgQU1EIEF1MTIwMCBTT0MuICBJdCBjYW4gZHJpdmUKIAkgIHZhcmlvdXMgcGFuZWxzIGFuZCBDUlRzIGJ5IHBhc3NpbmcgaW4ga2VybmVsIGNtZCBsaW5lIG9wdGlvbgpAQCAtMjAyNyw3ICsyMDM3LDcgQEAKIAogY29uZmlnIEZCX1MzQwogCXRyaXN0YXRlICJTYW1zdW5nIFMzQyBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gRkIgJiYgUzNDX0RFVl9GQgorCWRlcGVuZHMgb24gRkIgJiYgKFMzQ19ERVZfRkIgfHwgUzVQX0RFVl9GSU1EMCkKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCkBAIC0yMTEwLDYgKzIxMjAsMjIgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEZCX1NNU0NVRlgKKwl0cmlzdGF0ZSAiU01TQyBVRlg2MDAwLzcwMDAgVVNCIEZyYW1lYnVmZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQiAmJiBVU0IKKwlzZWxlY3QgRkJfTU9ERV9IRUxQRVJTCisJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAorCXNlbGVjdCBGQl9TWVNfQ09QWUFSRUEKKwlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVAorCXNlbGVjdCBGQl9TWVNfRk9QUworCXNlbGVjdCBGQl9ERUZFUlJFRF9JTworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBrZXJuZWwgZnJhbWVidWZmZXIgZHJpdmVyIGZvciBTTVNDIFVGWCBVU0IgZGV2aWNlcy4KKwkgIFN1cHBvcnRzIGZiZGV2IGNsaWVudHMgbGlrZSB4Zjg2LXZpZGVvLWZiZGV2LCBrZHJpdmUsIGZiaSwgYW5kCisJICBtcGxheWVyIC12byBmYmRldi4gU3VwcG9ydHMgYm90aCBVRlg2MDAwIChVU0IgMi4wKSBhbmQgVUZYNzAwMAorCSAgKFVTQiAzLjApIGRldmljZXMuCisJICBUbyBjb21waWxlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIG5hbWUgaXMgc21zY3VmeC4KKwogY29uZmlnIEZCX1VETAogCXRyaXN0YXRlICJEaXNwbGF5bGluayBVU0IgRnJhbWVidWZmZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggOGI4MzEyOS4uOWI5ZDhmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC0zMyw2ICszMyw3IEBACiBvYmotJChDT05GSUdfRkJfQVJDKSAgICAgICAgICAgICAgKz0gYXJjZmIubwogb2JqLSQoQ09ORklHX0ZCX0NMUFM3MTFYKSAgICAgICAgICs9IGNscHM3MTF4ZmIubwogb2JqLSQoQ09ORklHX0ZCX0NZQkVSMjAwMCkgICAgICAgICs9IGN5YmVyMjAwMGZiLm8KK29iai0kKENPTkZJR19GQl9HUlZHQSkgICAgICAgICAgICArPSBncnZnYS5vCiBvYmotJChDT05GSUdfRkJfUE0yKSAgICAgICAgICAgICAgKz0gcG0yZmIubwogb2JqLSQoQ09ORklHX0ZCX1BNMykJCSAgKz0gcG0zZmIubwogCkBAIC0xMjcsNiArMTI4LDcgQEAKIG9iai0kKENPTkZJR19GQl9QUzMpCQkgICs9IHBzM2ZiLm8KIG9iai0kKENPTkZJR19GQl9TTTUwMSkgICAgICAgICAgICArPSBzbTUwMWZiLm8KIG9iai0kKENPTkZJR19GQl9VREwpCQkgICs9IHVkbGZiLm8KK29iai0kKENPTkZJR19GQl9TTVNDVUZYKQkgICs9IHNtc2N1Zngubwogb2JqLSQoQ09ORklHX0ZCX1hJTElOWCkgICAgICAgICAgICs9IHhpbGlueGZiLm8KIG9iai0kKENPTkZJR19TSF9NSVBJX0RTSSkJICArPSBzaF9taXBpX2RzaS5vCiBvYmotJChDT05GSUdfRkJfU0hfTU9CSUxFX0hETUkpCSAgKz0gc2hfbW9iaWxlX2hkbWkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hY29ybmZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYwppbmRleCA2MTgzYTU3Li5iMzAzZjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Fjb3JuZmIuYwpAQCAtODUwLDkgKzg1MCwxMCBAQAogCXVfaW50IHlfYm90dG9tID0gdmFyLT55b2Zmc2V0OwogCiAJaWYgKCEodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSkKLQkJeV9ib3R0b20gKz0gdmFyLT55cmVzOworCQl5X2JvdHRvbSArPSBpbmZvLT52YXIueXJlczsKIAotCUJVR19PTih5X2JvdHRvbSA+IHZhci0+eXJlc192aXJ0dWFsKTsKKwlpZiAoeV9ib3R0b20gPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWFjb3JuZmJfdXBkYXRlX2RtYShpbmZvLCB2YXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwppbmRleCBjZjAzYWQwLi4yY2RhNmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKQEAgLTQ0Nyw2ICs0NDcsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmUoZmItPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2NsazsKKwogCWZiLT5mYi5kZXZpY2UJCT0gJmZiLT5kZXYtPmRldjsKIAogCWZiLT5mYi5maXgubW1pb19zdGFydAk9IGZiLT5kZXYtPnJlcy5zdGFydDsKQEAgLTQ1Niw3ICs0NjAsNyBAQAogCWlmICghZmItPnJlZ3MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDTENEOiB1bmFibGUgdG8gcmVtYXAgcmVnaXN0ZXJzXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX2NsazsKKwkJZ290byBjbGtfdW5wcmVwOwogCX0KIAogCWZiLT5mYi5mYm9wcwkJPSAmY2xjZGZiX29wczsKQEAgLTUzMCw2ICs1MzQsOCBAQAogCWZiX2RlYWxsb2NfY21hcCgmZmItPmZiLmNtYXApOwogIHVubWFwOgogCWlvdW5tYXAoZmItPnJlZ3MpOworIGNsa191bnByZXA6CisJY2xrX3VucHJlcGFyZShmYi0+Y2xrKTsKICBmcmVlX2NsazoKIAljbGtfcHV0KGZiLT5jbGspOwogIG91dDoKQEAgLTU5NSw2ICs2MDEsNyBAQAogCWlmIChmYi0+ZmIuY21hcC5sZW4pCiAJCWZiX2RlYWxsb2NfY21hcCgmZmItPmZiLmNtYXApOwogCWlvdW5tYXAoZmItPnJlZ3MpOworCWNsa191bnByZXBhcmUoZmItPmNsayk7CiAJY2xrX3B1dChmYi0+Y2xrKTsKIAogCWZiLT5ib2FyZC0+cmVtb3ZlKGZiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXJrZmIuYyBiL2RyaXZlcnMvdmlkZW8vYXJrZmIuYwppbmRleCA4Njg2NDI5Li41NTVkZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Fya2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hcmtmYi5jCkBAIC05MDgsMTMgKzkwOCwxNCBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAKIAkvKiBDYWxjdWxhdGUgdGhlIG9mZnNldCAqLwotCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDApIHsKLQkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAvIDE2KSAqICh2YXItPnhyZXNfdmlydHVhbCAvIDIpICsgKHZhci0+eG9mZnNldCAvIDIpOworCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMCkgeworCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgLyAyKQorCQkgICAgICAgKyAodmFyLT54b2Zmc2V0IC8gMik7CiAJCW9mZnNldCA9IG9mZnNldCA+PiAyOwogCX0gZWxzZSB7CiAJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgpICsKLQkJCSAodmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOwotCQlvZmZzZXQgPSBvZmZzZXQgPj4gKCh2YXItPmJpdHNfcGVyX3BpeGVsID09IDQpID8gMiA6IDMpOworCQkJICh2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KTsKKwkJb2Zmc2V0ID0gb2Zmc2V0ID4+ICgoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDQpID8gMiA6IDMpOwogCX0KIAogCS8qIFNldCB0aGUgb2Zmc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKaW5kZXggODE3YWI2MC4uNjM0MDljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYwpAQCAtMTgsMTAgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKQEAgLTM5LDcgKzQwLDggQEAKIAkJCQkJIHwgRkJJTkZPX0hXQUNDRUxfWVBBTikKIAogc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX2xjZGZiX3VwZGF0ZV9kbWEyZChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8sCi0JCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAKIH0KQEAgLTUwLDE0ICs1MiwxNiBAQAogCQkJCQl8IEZCSU5GT19IV0FDQ0VMX1lQQU4pCiAKIHN0YXRpYyB2b2lkIGF0bWVsX2xjZGZiX3VwZGF0ZV9kbWEyZChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8sCi0JCQkJICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKKwkJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJdTMyIGRtYTJkY2ZnOwogCXUzMiBwaXhlbG9mZjsKIAotCXBpeGVsb2ZmID0gKHZhci0+eG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwpICYgMHgxZjsKKwlwaXhlbG9mZiA9ICh2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpICYgMHgxZjsKIAotCWRtYTJkY2ZnID0gKCh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSAvIDg7CisJZG1hMmRjZmcgPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAtIGluZm8tPnZhci54cmVzKQorCQkgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4OwogCWRtYTJkY2ZnIHw9IHBpeGVsb2ZmIDw8IEFUTUVMX0xDRENfUElYRUxPRkZfT0ZGU0VUOwogCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQTJEQ0ZHLCBkbWEyZGNmZyk7CiAKQEAgLTI0OSwxNCArMjUzLDE0IEBACiAJdW5zaWduZWQgbG9uZyBkbWFfYWRkcjsKIAogCWRtYV9hZGRyID0gKGZpeC0+c21lbV9zdGFydCArIHZhci0+eW9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGgKLQkJICAgICsgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCQkgICAgKyB2YXItPnhvZmZzZXQgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KTsKIAogCWRtYV9hZGRyICY9IH4zVUw7CiAKIAkvKiBTZXQgZnJhbWVidWZmZXIgRE1BIGJhc2UgYWRkcmVzcyBhbmQgcGl4ZWwgb2Zmc2V0ICovCiAJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRE1BQkFERFIxLCBkbWFfYWRkcik7CiAKLQlhdG1lbF9sY2RmYl91cGRhdGVfZG1hMmQoc2luZm8sIHZhcik7CisJYXRtZWxfbGNkZmJfdXBkYXRlX2RtYTJkKHNpbmZvLCB2YXIsIGluZm8pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfbGNkZmJfZnJlZV92aWRlb19tZW1vcnkoc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggMzJmOGNmNi4uMTUwNjg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC04NDUsMTYgKzg0NSwxNiBAQAogewogICAgICAgICBzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBpbmZvLT5wYXI7CiAKLSAgICAgICAgaWYgKCh2YXItPnhvZmZzZXQgKyB2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkKLQkgICAgfHwgKHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKSkKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmICgodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsKQorCSAgICB8fCAodmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgIGlmIChyaW5mby0+YXNsZWVwKQogICAgICAgICAJcmV0dXJuIDA7CiAKIAlyYWRlb25fZmlmb193YWl0KDIpOwotICAgICAgICBPVVRSRUcoQ1JUQ19PRkZTRVQsICgodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpCi0JCQkgICAgICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpICYgfjcpOworCU9VVFJFRyhDUlRDX09GRlNFVCwgKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCArCisJCQkgICAgIHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpICYgfjcpOwogICAgICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdTExMDBmYi5jIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCmluZGV4IDAxYThmZGUuLjY0OWNiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKQEAgLTExMCwxMiArMTEwLDYgQEAKIAkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXUxMTAwZmJfZHJ2X2luZm8gZHJ2X2luZm87Ci0KLXN0YXRpYyBpbnQgbm9jdXJzb3IgPSAwOwotbW9kdWxlX3BhcmFtKG5vY3Vyc29yLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhub2N1cnNvciwgImN1cnNvciBlbmFibGUvZGlzYWJsZSIpOwotCiAvKiBmYl9ibGFuawogICogQmxhbmsgdGhlIHNjcmVlbi4gRGVwZW5kaW5nIG9uIHRoZSBtb2RlLCB0aGUgc2NyZWVuIHdpbGwgYmUKICAqIGFjdGl2YXRlZCB3aXRoIHRoZSBiYWNrbGlnaHQgY29sb3IsIG9yIGRlc2FjdGl2YXRlZApAQCAtMTMyLDcgKzEyNiw3IEBACiAJCQkvKiBUdXJuIG9uIHBhbmVsICovCiAJCQlmYmRldi0+cmVncy0+bGNkX2NvbnRyb2wgfD0gTENEX0NPTlRST0xfR087CiAjaWZkZWYgQ09ORklHX01JUFNfUEIxMTAwCi0JCQlpZiAoZHJ2X2luZm8ucGFuZWxfaWR4ID09IDEpIHsKKwkJCWlmIChmYmRldi0+cGFuZWxfaWR4ID09IDEpIHsKIAkJCQlhdV93cml0ZXcoYXVfcmVhZHcoUEIxMTAwX0dfQ09OVFJPTCkKIAkJCQkJICB8IChQQjExMDBfR19DT05UUk9MX0JMIHwgUEIxMTAwX0dfQ09OVFJPTF9WREQpLAogCQkJUEIxMTAwX0dfQ09OVFJPTCk7CkBAIC0xNDcsNyArMTQxLDcgQEAKIAkJCS8qIFR1cm4gb2ZmIHBhbmVsICovCiAJCQlmYmRldi0+cmVncy0+bGNkX2NvbnRyb2wgJj0gfkxDRF9DT05UUk9MX0dPOwogI2lmZGVmIENPTkZJR19NSVBTX1BCMTEwMAotCQkJaWYgKGRydl9pbmZvLnBhbmVsX2lkeCA9PSAxKSB7CisJCQlpZiAoZmJkZXYtPnBhbmVsX2lkeCA9PSAxKSB7CiAJCQkJYXVfd3JpdGV3KGF1X3JlYWR3KFBCMTEwMF9HX0NPTlRST0wpCiAJCQkJICAJICAmIH4oUEIxMTAwX0dfQ09OVFJPTF9CTCB8IFBCMTEwMF9HX0NPTlRST0xfVkREKSwKIAkJCVBCMTEwMF9HX0NPTlRST0wpOwpAQCAtNDI4LDE3ICs0MjIsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBmYl9jdXJzb3IKLSAqIFVzZWQgdG8gZGlzYWJsZSBjdXJzb3IgZHJhd2luZy4uLgotICovCi1pbnQgYXUxMTAwZmJfZmJfY3Vyc29yKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfY3Vyc29yICpjdXJzb3IpCi17Ci0JaWYgKG5vY3Vyc29yKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwkvKiBqdXN0IHRvIGZvcmNlIHNvZnRfY3Vyc29yKCkgY2FsbCAqLwotfQotCiBzdGF0aWMgc3RydWN0IGZiX29wcyBhdTExMDBmYl9vcHMgPQogewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCkBAIC00NTAsMTMgKzQzMyw1MyBAQAogCS5mYl9pbWFnZWJsaXQJCT0gY2ZiX2ltYWdlYmxpdCwKIAkuZmJfcm90YXRlCQk9IGF1MTEwMGZiX2ZiX3JvdGF0ZSwKIAkuZmJfbW1hcAkJPSBhdTExMDBmYl9mYl9tbWFwLAotCS5mYl9jdXJzb3IJCT0gYXUxMTAwZmJfZmJfY3Vyc29yLAogfTsKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBBVTExMDAgTENEIGNvbnRyb2xsZXIgZGV2aWNlIGRyaXZlciAqLworc3RhdGljIGludCBhdTExMDBmYl9zZXR1cChzdHJ1Y3QgYXUxMTAwZmJfZGV2aWNlICpmYmRldikKK3sKKwljaGFyICp0aGlzX29wdCwgKm9wdGlvbnM7CisJaW50IG51bV9wYW5lbHMgPSBBUlJBWV9TSVpFKGtub3duX2xjZF9wYW5lbHMpOworCisJaWYgKG51bV9wYW5lbHMgPD0gMCkgeworCQlwcmludF9lcnIoIk5vIExDRCBwYW5lbHMgc3VwcG9ydGVkIGJ5IGRyaXZlciEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGZiX2dldF9vcHRpb25zKERSSVZFUl9OQU1FLCAmb3B0aW9ucykpCisJCXJldHVybiAtRU5PREVWOworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCS8qIFBhbmVsIG9wdGlvbiAqLworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwYW5lbDoiLCA2KSkgeworCQkJaW50IGk7CisJCQl0aGlzX29wdCArPSA2OworCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYW5lbHM7IGkrKykgeworCQkJCWlmICghc3RybmNtcCh0aGlzX29wdCwga25vd25fbGNkX3BhbmVsc1tpXS5uYW1lLAorCQkJCQkgICAgIHN0cmxlbih0aGlzX29wdCkpKSB7CisJCQkJCWZiZGV2LT5wYW5lbCA9ICZrbm93bl9sY2RfcGFuZWxzW2ldOworCQkJCQlmYmRldi0+cGFuZWxfaWR4ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGkgPj0gbnVtX3BhbmVscykgeworCQkJCXByaW50X3dhcm4oIlBhbmVsICclcycgbm90IHN1cHBvcnRlZCEiLCB0aGlzX29wdCk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCX0KKwkJLyogVW5zdXBwb3J0ZWQgb3B0aW9uICovCisJCWVsc2UKKwkJCXByaW50X3dhcm4oIlVuc3VwcG9ydGVkIG9wdGlvbiBcIiVzXCIiLCB0aGlzX29wdCk7CisJfQorCisJcHJpbnRfaW5mbygiUGFuZWw9JXMiLCBmYmRldi0+cGFuZWwtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1MTEwMGZiX2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CkBAIC00NjUsMjIgKzQ4OCwyMSBAQAogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAl1MzIgc3lzX2Nsa3NyYzsKIAotCWlmICghZGV2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKiBBbGxvY2F0ZSBuZXcgZGV2aWNlIHByaXZhdGUgKi8KLQlpZiAoIShmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdTExMDBmYl9kZXZpY2UpLCBHRlBfS0VSTkVMKSkpIHsKKwlmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdTExMDBmYl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZiZGV2KSB7CiAJCXByaW50X2VycigiZmFpbCB0byBhbGxvY2F0ZSBkZXZpY2UgcHJpdmF0ZSByZWNvcmQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZmJkZXYtPnBhbmVsID0gJmtub3duX2xjZF9wYW5lbHNbZHJ2X2luZm8ucGFuZWxfaWR4XTsKKwlpZiAoYXUxMTAwZmJfc2V0dXAoZmJkZXYpKQorCQlnb3RvIGZhaWxlZDsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKilmYmRldik7CiAKIAkvKiBBbGxvY2F0ZSByZWdpb24gZm9yIG91ciByZWdpc3RlcnMgYW5kIG1hcCB0aGVtICovCi0JaWYgKCEocmVnc19yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UodG9fcGxhdGZvcm1fZGV2aWNlKGRldiksCi0JCQkJCUlPUkVTT1VSQ0VfTUVNLCAwKSkpIHsKKwlyZWdzX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3NfcmVzKSB7CiAJCXByaW50X2VycigiZmFpbCB0byByZXRyaWV2ZSByZWdpc3RlcnMgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtNTAwLDEzICs1MjIsMTEgQEAKIAlwcmludF9kYmcoIlJlZ2lzdGVyIG1lbW9yeSBtYXAgYXQgJXAiLCBmYmRldi0+cmVncyk7CiAJcHJpbnRfZGJnKCJwaHlzPTB4JTA4eCwgc2l6ZT0lZCIsIGZiZGV2LT5yZWdzX3BoeXMsIGZiZGV2LT5yZWdzX2xlbik7CiAKLQotCiAJLyogQWxsb2NhdGUgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYXhpbXVtIHNjcmVlbiBzaXplICogbmJyIG9mIHZpZGVvIGJ1ZmZlcnMgKi8KIAlmYmRldi0+ZmJfbGVuID0gZmJkZXYtPnBhbmVsLT54cmVzICogZmJkZXYtPnBhbmVsLT55cmVzICoKIAkJICAJKGZiZGV2LT5wYW5lbC0+YnBwID4+IDMpICogQVUxMTAwRkJfTkJSX1ZJREVPX0JVRkZFUlM7CiAKLQlmYmRldi0+ZmJfbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKKwlmYmRldi0+ZmJfbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKIAkJCQkJJmZiZGV2LT5mYl9waHlzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZiZGV2LT5mYl9tZW0pIHsKIAkJcHJpbnRfZXJyKCJmYWlsIHRvIGFsbG9jYXRlIGZyYW1idWZmZXIgKHNpemU6ICVkSykpIiwKQEAgLTUyNSw3ICs1NDUsNyBAQAogCSAgICAgcGFnZSA8IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpZmJkZXYtPmZiX21lbSArIGZiZGV2LT5mYl9sZW4pOwogCSAgICAgcGFnZSArPSBQQUdFX1NJWkUpIHsKICNpZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCi0JCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoQ0FDX0FERFIocGFnZSkpKTsKKwkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShDQUNfQUREUigodm9pZCAqKXBhZ2UpKSk7CiAjZWxzZQogCQlTZXRQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBhZ2UpKTsKICNlbmRpZgpAQCAtNTc4LDcgKzU5OCw4IEBACiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihmYmRldi0+cmVnc19waHlzLCBmYmRldi0+cmVnc19sZW4pOwogCX0KIAlpZiAoZmJkZXYtPmZiX21lbSkgewotCQlkbWFfZnJlZV9ub25jb2hlcmVudChkZXYsIGZiZGV2LT5mYl9sZW4sIGZiZGV2LT5mYl9tZW0sIGZiZGV2LT5mYl9waHlzKTsKKwkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoJmRldi0+ZGV2LCBmYmRldi0+ZmJfbGVuLCBmYmRldi0+ZmJfbWVtLAorCQkJCSAgICAgZmJkZXYtPmZiX3BoeXMpOwogCX0KIAlpZiAoZmJkZXYtPmluZm8uY21hcC5sZW4gIT0gMCkgewogCQlmYl9kZWFsbG9jX2NtYXAoJmZiZGV2LT5pbmZvLmNtYXApOwpAQCAtNjA4LDcgKzYyOSw4IEBACiAKIAlyZWxlYXNlX21lbV9yZWdpb24oZmJkZXYtPnJlZ3NfcGh5cywgZmJkZXYtPnJlZ3NfbGVuKTsKIAotCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwgZmJkZXYtPmZiX21lbSwgZmJkZXYtPmZiX3BoeXMpOworCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwgZmJkZXYtPmZiX21lbSwKKwkJCSAgZmJkZXYtPmZiX3BoeXMpOwogCiAJZmJfZGVhbGxvY19jbWFwKCZmYmRldi0+aW5mby5jbWFwKTsKIAlrZnJlZShmYmRldi0+aW5mby5wc2V1ZG9fcGFsZXR0ZSk7CkBAIC02NzUsMTAxICs2OTcsMTggQEAKICAgICAgICAgLnJlc3VtZQkJPSBhdTExMDBmYl9kcnZfcmVzdW1lLAogfTsKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogS2VybmVsIGRyaXZlciAqLwotCi1pbnQgYXUxMTAwZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IGF1MTEwMGZiX2xvYWQodm9pZCkKIHsKLQljaGFyKiB0aGlzX29wdDsKLQlpbnQgbnVtX3BhbmVscyA9IEFSUkFZX1NJWkUoa25vd25fbGNkX3BhbmVscyk7Ci0JY2hhciogbW9kZSA9IE5VTEw7Ci0JaW50IHBhbmVsX2lkeCA9IDA7Ci0KLQlpZiAobnVtX3BhbmVscyA8PSAwKSB7Ci0JCXByaW50X2VycigiTm8gTENEIHBhbmVscyBzdXBwb3J0ZWQgYnkgZHJpdmVyISIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCWlmIChvcHRpb25zKSB7Ci0JCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsIiwiKSkgIT0gTlVMTCkgewotCQkJLyogUGFuZWwgb3B0aW9uICovCi0JCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwYW5lbDoiLCA2KSkgewotCQkJCWludCBpOwotCQkJCXRoaXNfb3B0ICs9IDY7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYW5lbHM7IGkrKykgewotCQkJCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsCi0JCQkJCSAgICAgIAkgICAgIGtub3duX2xjZF9wYW5lbHNbaV0ubmFtZSwKLQkJCQkJCQlzdHJsZW4odGhpc19vcHQpKSkgewotCQkJCQkJcGFuZWxfaWR4ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpID49IG51bV9wYW5lbHMpIHsKLSAJCQkJCXByaW50X3dhcm4oIlBhbmVsICVzIG5vdCBzdXBwb3J0ZWQhIiwgdGhpc19vcHQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vY3Vyc29yIiwgOCkpIHsKLQkJCQl0aGlzX29wdCArPSA4OwotCQkJCW5vY3Vyc29yID0gMTsKLQkJCQlwcmludF9pbmZvKCJDdXJzb3IgZGlzYWJsZWQiKTsKLQkJCX0KLQkJCS8qIE1vZGUgb3B0aW9uIChvbmx5IG9wdGlvbiB0aGF0IHN0YXJ0IHdpdGggZGlnaXQpICovCi0JCQllbHNlIGlmIChpc2RpZ2l0KHRoaXNfb3B0WzBdKSkgewotCQkJCW1vZGUgPSBrc3RyZHVwKHRoaXNfb3B0LCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoIW1vZGUpIHsKLQkJCQkJcHJpbnRfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJfQotCQkJfQotCQkJLyogVW5zdXBwb3J0ZWQgb3B0aW9uICovCi0JCQllbHNlIHsKLQkJCQlwcmludF93YXJuKCJVbnN1cHBvcnRlZCBvcHRpb24gXCIlc1wiIiwgdGhpc19vcHQpOwotCQkJfQotCQl9Ci0JfQotCi0JZHJ2X2luZm8ucGFuZWxfaWR4ID0gcGFuZWxfaWR4OwotCWRydl9pbmZvLm9wdF9tb2RlID0gbW9kZTsKLQotCXByaW50X2luZm8oIlBhbmVsPSVzIE1vZGU9JXMiLAotCQkJa25vd25fbGNkX3BhbmVsc1tkcnZfaW5mby5wYW5lbF9pZHhdLm5hbWUsCi0JCSAgICAgIAlkcnZfaW5mby5vcHRfbW9kZSA/IGRydl9pbmZvLm9wdF9tb2RlIDogImRlZmF1bHQiKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX19pbml0IGF1MTEwMGZiX2luaXQodm9pZCkKLXsKLQljaGFyKiBvcHRpb25zOwotCWludCByZXQ7Ci0KLQlwcmludF9pbmZvKCIiIERSSVZFUl9ERVNDICIiKTsKLQotCW1lbXNldCgmZHJ2X2luZm8sIDAsIHNpemVvZihkcnZfaW5mbykpOwotCi0JaWYgKGZiX2dldF9vcHRpb25zKERSSVZFUl9OQU1FLCAmb3B0aW9ucykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogU2V0dXAgZHJpdmVyIHdpdGggb3B0aW9ucyAqLwotCXJldCA9IGF1MTEwMGZiX3NldHVwKG9wdGlvbnMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50X2VycigiRmFpbCB0byBzZXR1cCBkcml2ZXIiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTExMDBmYl9kcml2ZXIpOwogfQogCi12b2lkIF9fZXhpdCBhdTExMDBmYl9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYXUxMTAwZmJfdW5sb2FkKHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MTEwMGZiX2RyaXZlcik7Ci0KLQlrZnJlZShkcnZfaW5mby5vcHRfbW9kZSk7CiB9CiAKLW1vZHVsZV9pbml0KGF1MTEwMGZiX2luaXQpOwotbW9kdWxlX2V4aXQoYXUxMTAwZmJfY2xlYW51cCk7Cittb2R1bGVfaW5pdChhdTExMDBmYl9sb2FkKTsKK21vZHVsZV9leGl0KGF1MTEwMGZiX3VubG9hZCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmggYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmgKaW5kZXggMTY0ZmUyZi4uMTJkOTY0MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmgKQEAgLTEwOCw2ICsxMDgsNyBAQAogCXVuc2lnbmVkIGNoYXIqIAkJZmJfbWVtOwkJLyogRnJhbWVCdWZmZXIgbWVtb3J5IG1hcCAqLwogCXNpemVfdAkgICAgICAJCWZiX2xlbjsKIAlkbWFfYWRkcl90ICAgIAkJZmJfcGh5czsKKwlpbnQJCQlwYW5lbF9pZHg7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNjQsMTEgKzM2NSw2IEBACiAJfSwKIH07CiAKLXN0cnVjdCBhdTExMDBmYl9kcnZfaW5mbyB7Ci0JaW50CXBhbmVsX2lkeDsKLQljaGFyIAkqb3B0X21vZGU7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIElubGluZSBoZWxwZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F1MTIwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F1MTIwMGZiLmMKaW5kZXggNWRmZjMyYS4uNzIwMDU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdTEyMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXUxMjAwZmIuYwpAQCAtNDYsMTggKzQ2LDEwIEBACiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgImF1MTIwMGZiLmgiCiAKLSNpZmRlZiBDT05GSUdfUE0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BtLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfRkJfQVUxMjAwX0RFVlMKLSNkZWZpbmUgQ09ORklHX0ZCX0FVMTIwMF9ERVZTIDQKLSNlbmRpZgotCiAjZGVmaW5lIERSSVZFUl9OQU1FICJhdTEyMDBmYiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkxDRCBjb250cm9sbGVyIGRyaXZlciBmb3IgQVUxMjAwIHByb2Nlc3NvcnMiCiAKLSNkZWZpbmUgREVCVUcgMQorI2RlZmluZSBERUJVRyAwCiAKICNkZWZpbmUgcHJpbnRfZXJyKGYsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAjZGVmaW5lIHByaW50X3dhcm4oZiwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6ICIgZiAiXG4iLCAjIyBhcmcpCkBAIC0xNTAsNyArMTQyLDcgQEAKIAogLyogUHJpdmF0ZSwgcGVyLWZyYW1lYnVmZmVyIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24gKGluZGVwZW5kZW50IG9mIHRoZSBwYW5lbCBpdHNlbGYpICovCiBzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlIHsKLQlzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvOwkJCS8qIEZCIGRyaXZlciBpbmZvIHJlY29yZCAqLworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvOwkJLyogRkIgZHJpdmVyIGluZm8gcmVjb3JkICovCiAKIAlpbnQJCQkJCXBsYW5lOwogCXVuc2lnbmVkIGNoYXIqIAkJZmJfbWVtOwkJLyogRnJhbWVCdWZmZXIgbWVtb3J5IG1hcCAqLwpAQCAtMTU4LDcgKzE1MCw2IEBACiAJZG1hX2FkZHJfdCAgICAJCWZiX3BoeXM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGF1MTIwMGZiX2RldmljZSBfYXUxMjAwZmJfZGV2aWNlc1tDT05GSUdfRkJfQVUxMjAwX0RFVlNdOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMQ0QgY29udHJvbGxlciByZXN0cmljdGlvbnMgKi8KQEAgLTE3MSwxMCArMTYyLDE4IEBACiAvKiBEZWZhdWx0IG51bWJlciBvZiB2aXNpYmxlIHNjcmVlbiBidWZmZXIgdG8gYWxsb2NhdGUgKi8KICNkZWZpbmUgQVUxMjAwRkJfTkJSX1ZJREVPX0JVRkZFUlMgMQogCisvKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGZiIGRldmljZXMgdG8gY3JlYXRlICovCisjZGVmaW5lIE1BWF9ERVZJQ0VfQ09VTlQJNAorCisvKiBEZWZhdWx0IHdpbmRvdyBjb25maWd1cmF0aW9uIGVudHJ5IHRvIHVzZSAoc2VlIHdpbmRvd3NbXSkgKi8KKyNkZWZpbmUgREVGQVVMVF9XSU5ET1dfSU5ERVgJMgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqX2F1MTIwMGZiX2luZm9zW01BWF9ERVZJQ0VfQ09VTlRdOwogc3RhdGljIHN0cnVjdCBhdTEyMDBfbGNkICpsY2QgPSAoc3RydWN0IGF1MTIwMF9sY2QgKikgQVUxMjAwX0xDRF9BRERSOwotc3RhdGljIGludCB3aW5kb3dfaW5kZXggPSAyOyAvKiBkZWZhdWx0IGlzIHplcm8gKi8KK3N0YXRpYyBpbnQgZGV2aWNlX2NvdW50ID0gTUFYX0RFVklDRV9DT1VOVDsKK3N0YXRpYyBpbnQgd2luZG93X2luZGV4ID0gREVGQVVMVF9XSU5ET1dfSU5ERVg7CS8qIGRlZmF1bHQgaXMgemVybyAqLwogc3RhdGljIGludCBwYW5lbF9pbmRleCA9IDI7IC8qIGRlZmF1bHQgaXMgemVybyAqLwogc3RhdGljIHN0cnVjdCB3aW5kb3dfc2V0dGluZ3MgKndpbjsKIHN0YXRpYyBzdHJ1Y3QgcGFuZWxfc2V0dGluZ3MgKnBhbmVsOwpAQCAtMjA1LDEyICsyMDQsNiBAQAogZXh0ZXJuIGludCBib2FyZF9hdTEyMDBmYl9wYW5lbF9pbml0ICh2b2lkKTsKIGV4dGVybiBpbnQgYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24gKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1BNCi1pbnQgYXUxMjAwZmJfcG1fY2FsbGJhY2soYXUxeHh4X3Bvd2VyX2Rldl90ICpkZXYsCi0JCWF1MXh4eF9yZXF1ZXN0X3QgcmVxdWVzdCwgdm9pZCAqZGF0YSk7Ci1hdTF4eHhfcG93ZXJfZGV2X3QgKkxDRF9wbV9kZXY7Ci0jZW5kaWYKLQogLyoKICAqIERlZmF1bHQgd2luZG93IGNvbmZpZ3VyYXRpb25zCiAgKi8KQEAgLTY1MiwyNSArNjQ1LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNldF9icmlnaHRuZXNzKHVuc2lnbmVkIGludCBicmlnaHRuZXNzKQotewotCXVuc2lnbmVkIGludCBoaTEsIGRpdmlkZXI7Ci0KLQkvKiBsaW1pdCBicmlnaHRuZXNzIHB3bSBkdXR5IHRvID49IDMwLzE2MDAgKi8KLQlpZiAoYnJpZ2h0bmVzcyA8IDMwKSB7Ci0JCWJyaWdodG5lc3MgPSAzMDsKLQl9Ci0JZGl2aWRlciA9IChsY2QtPnB3bWRpdiAmIDB4M0ZGRkYpICsgMTsKLQloaTEgPSAobGNkLT5wd21oaSA+PiAxNikgKyAxOwotCWhpMSA9ICgoKGJyaWdodG5lc3MgJiAweEZGKSArIDEpICogZGl2aWRlciA+PiA4KTsKLQlsY2QtPnB3bWhpICY9IDB4RkZGRjsKLQlsY2QtPnB3bWhpIHw9IChoaTEgPDwgMTYpOwotCi0JcmV0dXJuIGJyaWdodG5lc3M7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KIHN0YXRpYyBpbnQgd2luYnBwICh1bnNpZ25lZCBpbnQgd2luY3RybDEpCiB7CiAJaW50IGJpdHMgPSAwOwpAQCAtNzEyLDggKzY4Niw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0ZCX0FVMTIwMF9ERVZTOyArK2kpIHsKLQkJaWYgKGZiX2luZm8gPT0gKHN0cnVjdCBmYl9pbmZvICopKCZfYXUxMjAwZmJfZGV2aWNlc1tpXS5mYl9pbmZvKSkKKwlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlX2NvdW50OyArK2kpIHsKKwkJaWYgKGZiX2luZm8gPT0gX2F1MTIwMGZiX2luZm9zW2ldKQogCQkJcmV0dXJuIGk7CiAJfQogCXByaW50aygiYXUxMjAwZmI6IEVSUk9SOiBmYmluZm8yaW5kZXggZmFpbGVkIVxuIik7CkBAIC05NjIsNyArOTM2LDcgQEAKIAlsY2QtPndpbmRvd1twbGFuZV0ud2luY3RybDIgPSAoIDAKIAkJfCBMQ0RfV0lOQ1RSTDJfQ0tNT0RFXzAwCiAJCXwgTENEX1dJTkNUUkwyX0RCTQotCQl8IExDRF9XSU5DVFJMMl9CWF9OKCBmYmRldi0+ZmJfaW5mby5maXgubGluZV9sZW5ndGgpCisJCXwgTENEX1dJTkNUUkwyX0JYX04oZmJkZXYtPmZiX2luZm8tPmZpeC5saW5lX2xlbmd0aCkKIAkJfCBMQ0RfV0lOQ1RSTDJfU0NYXzEKIAkJfCBMQ0RfV0lOQ1RSTDJfU0NZXzEKIAkJKSA7CkBAIC0xMDUwLDcgKzEwMjQsNyBAQAogc3RhdGljIGludCBhdTEyMDBmYl9mYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJc3RydWN0IGZiX2luZm8gKmZiaSkKIHsKLQlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICopZmJpOworCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gZmJpLT5wYXI7CiAJdTMyIHBpeGNsb2NrOwogCWludCBzY3JlZW5fc2l6ZSwgcGxhbmU7CiAKQEAgLTExNDIsNyArMTExNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYXUxMjAwZmJfZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQogewotCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKilmYmk7CisJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXYgPSBmYmktPnBhcjsKIAogCWF1MTIwMGZiX3VwZGF0ZV9mYmluZm8oZmJpKTsKIAlhdTEyMDBfc2V0bW9kZShmYmRldik7CkBAIC0xMjQ2LDExICsxMjIwLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ9MCwgb2ZmOwotCXN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBhdTEyMDBmYl9kZXZpY2UgKikgaW5mbzsKLQotI2lmZGVmIENPTkZJR19QTQotCWF1MXh4eF9wbV9hY2Nlc3MoTENEX3BtX2Rldik7Ci0jZW5kaWYKKwlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldiA9IGluZm8tPnBhcjsKIAogCWlmICh2bWEtPnZtX3Bnb2ZmID4gKH4wVUwgPj4gUEFHRV9TSElGVCkpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDYxLDEwICsxNDMxLDYgQEAKIAlpbnQgcGxhbmU7CiAJaW50IHZhbDsKIAotI2lmZGVmIENPTkZJR19QTQotCWF1MXh4eF9wbV9hY2Nlc3MoTENEX3BtX2Rldik7Ci0jZW5kaWYKLQogCXBsYW5lID0gZmJpbmZvMmluZGV4KGluZm8pOwogCXByaW50X2RiZygiYXUxMjAwZmI6IGlvY3RsICVkIG9uIHBsYW5lICVkXG4iLCBjbWQsIHBsYW5lKTsKIApAQCAtMTUzNiw5ICsxNTAyLDExIEBACiAJLmZiX3NldF9wYXIJPSBhdTEyMDBmYl9mYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcJPSBhdTEyMDBmYl9mYl9zZXRjb2xyZWcsCiAJLmZiX2JsYW5rCT0gYXUxMjAwZmJfZmJfYmxhbmssCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKLQkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfZmlsbHJlY3QJPSBzeXNfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gc3lzX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBzeXNfaW1hZ2VibGl0LAorCS5mYl9yZWFkCT0gZmJfc3lzX3JlYWQsCisJLmZiX3dyaXRlCT0gZmJfc3lzX3dyaXRlLAogCS5mYl9zeW5jCT0gTlVMTCwKIAkuZmJfaW9jdGwJPSBhdTEyMDBmYl9pb2N0bCwKIAkuZmJfbW1hcAk9IGF1MTIwMGZiX2ZiX21tYXAsCkBAIC0xNTYxLDEwICsxNTI5LDkgQEAKIAogc3RhdGljIGludCBhdTEyMDBmYl9pbml0X2ZiaW5mbyhzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gJmZiZGV2LT5mYl9pbmZvOworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBmYmRldi0+ZmJfaW5mbzsKIAlpbnQgYnBwOwogCi0JbWVtc2V0KGZiaSwgMCwgc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSk7CiAJZmJpLT5mYm9wcyA9ICZhdTEyMDBmYl9mYl9vcHM7CiAKIAlicHAgPSB3aW5icHAod2luLT53W2ZiZGV2LT5wbGFuZV0ubW9kZV93aW5jdHJsMSk7CkBAIC0xNjIzLDI0ICsxNTkwLDM2IEBACiAKIC8qIEFVMTIwMCBMQ0QgY29udHJvbGxlciBkZXZpY2UgZHJpdmVyICovCiAKLXN0YXRpYyBpbnQgYXUxMjAwZmJfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF1MTIwMGZiX2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGZiX2luZm8gKmZiaSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwYWdlOwotCWludCBicHAsIHBsYW5lLCByZXQ7CisJaW50IGJwcCwgcGxhbmUsIHJldCwgaXJxOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOworCS8qIHNodXQgZ2NjIHVwICovCisJcmV0ID0gMDsKKwlmYmRldiA9IE5VTEw7CiAKLQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBDT05GSUdfRkJfQVUxMjAwX0RFVlM7ICsrcGxhbmUpIHsKKwkvKiBLaWNrc3RhcnQgdGhlIHBhbmVsICovCisJYXUxMjAwX3NldHBhbmVsKHBhbmVsKTsKKworCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IGRldmljZV9jb3VudDsgKytwbGFuZSkgewogCQlicHAgPSB3aW5icHAod2luLT53W3BsYW5lXS5tb2RlX3dpbmN0cmwxKTsKIAkJaWYgKHdpbi0+d1twbGFuZV0ueHJlcyA9PSAwKQogCQkJd2luLT53W3BsYW5lXS54cmVzID0gcGFuZWwtPlhyZXM7CiAJCWlmICh3aW4tPndbcGxhbmVdLnlyZXMgPT0gMCkKIAkJCXdpbi0+d1twbGFuZV0ueXJlcyA9IHBhbmVsLT5ZcmVzOwogCi0JCWZiZGV2ID0gJl9hdTEyMDBmYl9kZXZpY2VzW3BsYW5lXTsKLQkJbWVtc2V0KGZiZGV2LCAwLCBzaXplb2Yoc3RydWN0IGF1MTIwMGZiX2RldmljZSkpOworCQlmYmkgPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF1MTIwMGZiX2RldmljZSksCisJCQkJCSZkZXYtPmRldik7CisJCWlmICghZmJpKQorCQkJZ290byBmYWlsZWQ7CisKKwkJX2F1MTIwMGZiX2luZm9zW3BsYW5lXSA9IGZiaTsKKwkJZmJkZXYgPSBmYmktPnBhcjsKKwkJZmJkZXYtPmZiX2luZm8gPSBmYmk7CisKIAkJZmJkZXYtPnBsYW5lID0gcGxhbmU7CiAKIAkJLyogQWxsb2NhdGUgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBtYXhpbXVtIHNjcmVlbiBzaXplICovCkBAIC0xNjczLDMwICsxNjUyLDMxIEBACiAJCQlnb3RvIGZhaWxlZDsKIAogCQkvKiBSZWdpc3RlciBuZXcgZnJhbWVidWZmZXIgKi8KLQkJaWYgKChyZXQgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJkZXYtPmZiX2luZm8pKSA8IDApIHsKKwkJcmV0ID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJpKTsKKwkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50X2VycigiY2Fubm90IHJlZ2lzdGVyIG5ldyBmcmFtZWJ1ZmZlciIpOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAotCQlhdTEyMDBmYl9mYl9zZXRfcGFyKCZmYmRldi0+ZmJfaW5mbyk7CisJCWF1MTIwMGZiX2ZiX3NldF9wYXIoZmJpKTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19MT0dPKQogCQlpZiAocGxhbmUgPT0gMCkKLQkJCWlmIChmYl9wcmVwYXJlX2xvZ28oJmZiZGV2LT5mYl9pbmZvLCBGQl9ST1RBVEVfVVIpKSB7CisJCQlpZiAoZmJfcHJlcGFyZV9sb2dvKGZiaSwgRkJfUk9UQVRFX1VSKSkgewogCQkJCS8qIFN0YXJ0IGRpc3BsYXkgYW5kIHNob3cgbG9nbyBvbiBib290ICovCi0JCQkJZmJfc2V0X2NtYXAoJmZiZGV2LT5mYl9pbmZvLmNtYXAsCi0JCQkJCQkmZmJkZXYtPmZiX2luZm8pOwotCi0JCQkJZmJfc2hvd19sb2dvKCZmYmRldi0+ZmJfaW5mbywgRkJfUk9UQVRFX1VSKTsKKwkJCQlmYl9zZXRfY21hcCgmZmJpLT5jbWFwLCBmYmkpOworCQkJCWZiX3Nob3dfbG9nbyhmYmksIEZCX1JPVEFURV9VUik7CiAJCQl9CiAjZW5kaWYKIAl9CiAKIAkvKiBOb3cgaG9vayBpbnRlcnJ1cHQgdG9vICovCi0JaWYgKChyZXQgPSByZXF1ZXN0X2lycShBVTEyMDBfTENEX0lOVCwgYXUxMjAwZmJfaGFuZGxlX2lycSwKLQkJIAkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwgImxjZCIsICh2b2lkICopZGV2KSkgPCAwKSB7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXUxMjAwZmJfaGFuZGxlX2lycSwKKwkJCSAgSVJRRl9TSEFSRUQsICJsY2QiLCAodm9pZCAqKWRldik7CisJaWYgKHJldCkgewogCQlwcmludF9lcnIoImZhaWwgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgbGluZSAlZCAoZXJyOiAlZCkiLAotCQkJICBBVTEyMDBfTENEX0lOVCwgcmV0KTsKKwkJCSAgaXJxLCByZXQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTE3MDUsODQgKzE2ODUsMTA4IEBACiBmYWlsZWQ6CiAJLyogTk9URTogVGhpcyBvbmx5IGRvZXMgdGhlIGN1cnJlbnQgcGxhbmUvd2luZG93IHRoYXQgZmFpbGVkOyBvdGhlcnMgYXJlIHN0aWxsIGFjdGl2ZSAqLwogCWlmIChmYmRldi0+ZmJfbWVtKQotCQlkbWFfZnJlZV9ub25jb2hlcmVudChkZXYsIFBBR0VfQUxJR04oZmJkZXYtPmZiX2xlbiksCisJCWRtYV9mcmVlX25vbmNvaGVyZW50KCZkZXYtPmRldiwgUEFHRV9BTElHTihmYmRldi0+ZmJfbGVuKSwKIAkJCQlmYmRldi0+ZmJfbWVtLCBmYmRldi0+ZmJfcGh5cyk7Ci0JaWYgKGZiZGV2LT5mYl9pbmZvLmNtYXAubGVuICE9IDApCi0JCWZiX2RlYWxsb2NfY21hcCgmZmJkZXYtPmZiX2luZm8uY21hcCk7Ci0JaWYgKGZiZGV2LT5mYl9pbmZvLnBzZXVkb19wYWxldHRlKQotCQlrZnJlZShmYmRldi0+ZmJfaW5mby5wc2V1ZG9fcGFsZXR0ZSk7CisJaWYgKGZiaSkgeworCQlpZiAoZmJpLT5jbWFwLmxlbiAhPSAwKQorCQkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworCQlrZnJlZShmYmktPnBzZXVkb19wYWxldHRlKTsKKwl9CiAJaWYgKHBsYW5lID09IDApCiAJCWZyZWVfaXJxKEFVMTIwMF9MQ0RfSU5ULCAodm9pZCopZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF1MTIwMGZiX2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgYXUxMjAwZmJfZHJ2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF1MTIwMGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKIAlpbnQgcGxhbmU7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAkvKiBUdXJuIG9mZiB0aGUgcGFuZWwgKi8KIAlhdTEyMDBfc2V0cGFuZWwoTlVMTCk7CiAKLQlmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBDT05GSUdfRkJfQVUxMjAwX0RFVlM7ICsrcGxhbmUpCi0JewotCQlmYmRldiA9ICZfYXUxMjAwZmJfZGV2aWNlc1twbGFuZV07CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZGV2aWNlX2NvdW50OyArK3BsYW5lKQl7CisJCWZiaSA9IF9hdTEyMDBmYl9pbmZvc1twbGFuZV07CisJCWZiZGV2ID0gZmJpLT5wYXI7CiAKIAkJLyogQ2xlYW4gdXAgYWxsIHByb2JlIGRhdGEgKi8KLQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJkZXYtPmZiX2luZm8pOworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiaSk7CiAJCWlmIChmYmRldi0+ZmJfbWVtKQogCQkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoJmRldi0+ZGV2LAogCQkJCQlQQUdFX0FMSUdOKGZiZGV2LT5mYl9sZW4pLAogCQkJCQlmYmRldi0+ZmJfbWVtLCBmYmRldi0+ZmJfcGh5cyk7Ci0JCWlmIChmYmRldi0+ZmJfaW5mby5jbWFwLmxlbiAhPSAwKQotCQkJZmJfZGVhbGxvY19jbWFwKCZmYmRldi0+ZmJfaW5mby5jbWFwKTsKLQkJaWYgKGZiZGV2LT5mYl9pbmZvLnBzZXVkb19wYWxldHRlKQotCQkJa2ZyZWUoZmJkZXYtPmZiX2luZm8ucHNldWRvX3BhbGV0dGUpOworCQlpZiAoZmJpLT5jbWFwLmxlbiAhPSAwKQorCQkJZmJfZGVhbGxvY19jbWFwKCZmYmktPmNtYXApOworCQlrZnJlZShmYmktPnBzZXVkb19wYWxldHRlKTsKKworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiaSk7CisJCV9hdTEyMDBmYl9pbmZvc1twbGFuZV0gPSBOVUxMOwogCX0KIAotCWZyZWVfaXJxKEFVMTIwMF9MQ0RfSU5ULCAodm9pZCAqKWRldik7CisJZnJlZV9pcnEocGxhdGZvcm1fZ2V0X2lycShkZXYsIDApLCAodm9pZCAqKWRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdTEyMDBmYl9kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgYXUxMjAwZmJfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCS8qIFRPRE8gKi8KKwlhdTEyMDBfc2V0cGFuZWwoTlVMTCk7CisKKwlsY2QtPm91dG1hc2sgPSAwOworCWF1X3N5bmMoKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF1MTIwMGZiX2Rydl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdTEyMDBmYl9kcnZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQkvKiBUT0RPICovCisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlpbnQgaTsKKworCS8qIEtpY2tzdGFydCB0aGUgcGFuZWwgKi8KKwlhdTEyMDBfc2V0cGFuZWwocGFuZWwpOworCisJZm9yIChpID0gMDsgaSA8IGRldmljZV9jb3VudDsgaSsrKSB7CisJCWZiaSA9IF9hdTEyMDBmYl9pbmZvc1tpXTsKKwkJYXUxMjAwZmJfZmJfc2V0X3BhcihmYmkpOworCX0KKwogCXJldHVybiAwOwogfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYXUxMjAwZmJfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF1MTIwMGZiX2Rydl9yZXN1bWUsCisJLmZyZWV6ZQkJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKKwkudGhhdwkJPSBhdTEyMDBmYl9kcnZfcmVzdW1lLAorfTsKKworI2RlZmluZSBBVTEyMDBGQl9QTU9QUwkoJmF1MTIwMGZiX3Btb3BzKQorCisjZWxzZQorI2RlZmluZSBBVTEyMDBGQl9QTU9QUwlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1MTIwMGZiX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQkJPSAiYXUxMjAwLWxjZCIsCi0JCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJhdTEyMDAtbGNkIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9IEFVMTIwMEZCX1BNT1BTLAogCX0sCiAJLnByb2JlCQk9IGF1MTIwMGZiX2Rydl9wcm9iZSwKLQkucmVtb3ZlCQk9IGF1MTIwMGZiX2Rydl9yZW1vdmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBhdTEyMDBmYl9kcnZfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGF1MTIwMGZiX2Rydl9yZXN1bWUsCi0jZW5kaWYKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MTIwMGZiX2Rydl9yZW1vdmUpLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogS2VybmVsIGRyaXZlciAqLwogCi1zdGF0aWMgdm9pZCBhdTEyMDBmYl9zZXR1cCh2b2lkKQorc3RhdGljIGludCBhdTEyMDBmYl9zZXR1cCh2b2lkKQogewotCWNoYXIqIG9wdGlvbnMgPSBOVUxMOwotCWNoYXIqIHRoaXNfb3B0OworCWNoYXIgKm9wdGlvbnMgPSBOVUxMOworCWNoYXIgKnRoaXNfb3B0LCAqZW5kcHRyOwogCWludCBudW1fcGFuZWxzID0gQVJSQVlfU0laRShrbm93bl9sY2RfcGFuZWxzKTsKIAlpbnQgcGFuZWxfaWR4ID0gLTE7CiAKQEAgLTE4MjcsNzAgKzE4MzEsNDIgQEAKIAkJCQlub2h3Y3Vyc29yID0gMTsKIAkJCX0KIAorCQkJZWxzZSBpZiAoc3RybmNtcCh0aGlzX29wdCwgImRldmljZXM6IiwgOCkgPT0gMCkgeworCQkJCXRoaXNfb3B0ICs9IDg7CisJCQkJZGV2aWNlX2NvdW50ID0gc2ltcGxlX3N0cnRvbCh0aGlzX29wdCwKKwkJCQkJCQkgICAgICZlbmRwdHIsIDApOworCQkJCWlmICgoZGV2aWNlX2NvdW50IDwgMCkgfHwKKwkJCQkgICAgKGRldmljZV9jb3VudCA+IE1BWF9ERVZJQ0VfQ09VTlQpKQorCQkJCQlkZXZpY2VfY291bnQgPSBNQVhfREVWSUNFX0NPVU5UOworCQkJfQorCisJCQllbHNlIGlmIChzdHJuY21wKHRoaXNfb3B0LCAid2luY2ZnOiIsIDcpID09IDApIHsKKwkJCQl0aGlzX29wdCArPSA3OworCQkJCXdpbmRvd19pbmRleCA9IHNpbXBsZV9zdHJ0b2wodGhpc19vcHQsCisJCQkJCQkJICAgICAmZW5kcHRyLCAwKTsKKwkJCQlpZiAoKHdpbmRvd19pbmRleCA8IDApIHx8CisJCQkJICAgICh3aW5kb3dfaW5kZXggPj0gQVJSQVlfU0laRSh3aW5kb3dzKSkpCisJCQkJCXdpbmRvd19pbmRleCA9IERFRkFVTFRfV0lORE9XX0lOREVYOworCQkJfQorCisJCQllbHNlIGlmIChzdHJuY21wKHRoaXNfb3B0LCAib2ZmIiwgMykgPT0gMCkKKwkJCQlyZXR1cm4gMTsKIAkJCS8qIFVuc3VwcG9ydGVkIG9wdGlvbiAqLwogCQkJZWxzZSB7CiAJCQkJcHJpbnRfd2FybigiVW5zdXBwb3J0ZWQgb3B0aW9uIFwiJXNcIiIsIHRoaXNfb3B0KTsKIAkJCX0KIAkJfQogCX0KKwlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdTEyMDBmYl9wbV9jYWxsYmFjayhhdTF4eHhfcG93ZXJfZGV2X3QgKmRldiwKLQkJYXUxeHh4X3JlcXVlc3RfdCByZXF1ZXN0LCB2b2lkICpkYXRhKSB7Ci0JaW50IHJldHZhbCA9IC0xOwotCXVuc2lnbmVkIGludCBkID0gMDsKLQl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzcyA9IDA7Ci0KLQlpZiAocmVxdWVzdCA9PSBBVTFYWFhfUE1fU0xFRVApIHsKLQkJYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24oKTsKLQl9Ci0JZWxzZSBpZiAocmVxdWVzdCA9PSBBVTFYWFhfUE1fV0FLRVVQKSB7Ci0JCWlmKGRldi0+cHJldl9zdGF0ZSA9PSBTTEVFUF9TVEFURSkKLQkJewotCQkJaW50IHBsYW5lOwotCQkJYXUxMjAwX3NldHBhbmVsKHBhbmVsKTsKLQkJCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IENPTkZJR19GQl9BVTEyMDBfREVWUzsgKytwbGFuZSkgCXsKLQkJCQlzdHJ1Y3QgYXUxMjAwZmJfZGV2aWNlICpmYmRldjsKLQkJCQlmYmRldiA9ICZfYXUxMjAwZmJfZGV2aWNlc1twbGFuZV07Ci0JCQkJYXUxMjAwZmJfZmJfc2V0X3BhcigmZmJkZXYtPmZiX2luZm8pOwotCQkJfQotCQl9Ci0KLQkJZCA9ICooKHVuc2lnbmVkIGludCopZGF0YSk7Ci0JCWlmKGQgPD0xMCkgYnJpZ2h0bmVzcyA9IDI2OwotCQllbHNlIGlmKGQ8PTIwKSBicmlnaHRuZXNzID0gNTE7Ci0JCWVsc2UgaWYoZDw9MzApIGJyaWdodG5lc3MgPSA3NzsKLQkJZWxzZSBpZihkPD00MCkgYnJpZ2h0bmVzcyA9IDEwMjsKLQkJZWxzZSBpZihkPD01MCkgYnJpZ2h0bmVzcyA9IDEyODsKLQkJZWxzZSBpZihkPD02MCkgYnJpZ2h0bmVzcyA9IDE1MzsKLQkJZWxzZSBpZihkPD03MCkgYnJpZ2h0bmVzcyA9IDE3OTsKLQkJZWxzZSBpZihkPD04MCkgYnJpZ2h0bmVzcyA9IDIwNDsKLQkJZWxzZSBpZihkPD05MCkgYnJpZ2h0bmVzcyA9IDIzMDsKLQkJZWxzZSBicmlnaHRuZXNzID0gMjU1OwotCQlzZXRfYnJpZ2h0bmVzcyhicmlnaHRuZXNzKTsKLQl9IGVsc2UgaWYgKHJlcXVlc3QgPT0gQVUxWFhYX1BNX0dFVFNUQVRVUykgewotCQlyZXR1cm4gZGV2LT5jdXJfc3RhdGU7Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9BQ0NFU1MpIHsKLQkJaWYgKGRldi0+Y3VyX3N0YXRlICE9IFNMRUVQX1NUQVRFKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJZWxzZSB7Ci0JCQlhdTEyMDBfc2V0cGFuZWwocGFuZWwpOwotCQl9Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9JRExFKSB7Ci0JfSBlbHNlIGlmIChyZXF1ZXN0ID09IEFVMVhYWF9QTV9DTEVBTlVQKSB7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBhdTEyMDBmYl9pbml0KHZvaWQpCiB7CiAJcHJpbnRfaW5mbygiIiBEUklWRVJfREVTQyAiIik7CiAKIAkvKiBTZXR1cCBkcml2ZXIgd2l0aCBvcHRpb25zICovCi0JYXUxMjAwZmJfc2V0dXAoKTsKKwlpZiAoYXUxMjAwZmJfc2V0dXAoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBQb2ludCB0byB0aGUgcGFuZWwgc2VsZWN0ZWQgKi8KIAlwYW5lbCA9ICZrbm93bl9sY2RfcGFuZWxzW3BhbmVsX2luZGV4XTsKQEAgLTE4OTksMTcgKzE4NzUsNiBAQAogCXByaW50ayhEUklWRVJfTkFNRSAiOiBQYW5lbCAlZCAlc1xuIiwgcGFuZWxfaW5kZXgsIHBhbmVsLT5uYW1lKTsKIAlwcmludGsoRFJJVkVSX05BTUUgIjogV2luICVkICVzXG4iLCB3aW5kb3dfaW5kZXgsIHdpbi0+bmFtZSk7CiAKLQkvKiBLaWNrc3RhcnQgdGhlIHBhbmVsLCB0aGUgZnJhbWVidWZmZXJzL3dpbmRvd3MgY29tZSBzb29uIGVub3VnaCAqLwotCWF1MTIwMF9zZXRwYW5lbChwYW5lbCk7Ci0KLQkjaWZkZWYgQ09ORklHX1BNCi0JTENEX3BtX2RldiA9IG5ld19hdTF4eHhfcG93ZXJfZGV2aWNlKCJMQ0QiLCAmYXUxMjAwZmJfcG1fY2FsbGJhY2ssIE5VTEwpOwotCWlmICggTENEX3BtX2RldiA9PSBOVUxMKQotCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gY3JlYXRlIGEgcG93ZXIgbWFuYWdlbWVudCBkZXZpY2UgZW50cnkgZm9yIHRoZSBhdTEyMDBmYi5cbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXIgbWFuYWdlbWVudCBkZXZpY2UgZW50cnkgZm9yIHRoZSBhdTEyMDBmYiBsb2FkZWQuXG4iKTsKLQkjZW5kaWYKLQogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF1MTIwMGZiX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC84OHBtODYweF9ibC5jCmluZGV4IGMwNGI5NGQuLjExMDVmYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvODhwbTg2MHhfYmwuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjZGVmaW5lIE1BWF9CUklHSFRORVNTCQkoMHhGRikKICNkZWZpbmUgTUlOX0JSSUdIVE5FU1MJCSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwNTUyMF9ibC5jCmluZGV4IGQxYWVlNzMuLmRmYjc2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWRwNTUyMC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGFkcDU1MjBfYmwgewogCXN0cnVjdCBkZXZpY2UgKm1hc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYwppbmRleCAxODNiNmY2Li42NmJjNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg2MF9ibC5jCkBAIC03LDcgKzcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYwppbmRleCBkMDY4ODZhLi42YzY4YTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODcwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg3MF9ibC5jCkBAIC03LDcgKzcsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KQEAgLTkzMiw3ICs5MzEsNiBAQAogb3V0MToKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmwpOwogb3V0MjoKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiByZXQ7CkBAIC05NTIsNyArOTUwLDYgQEAKIAkJCSZhZHA4ODcwX2JsX2F0dHJfZ3JvdXApOwogCiAJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmJsKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jCmluZGV4IDlmMGE0OTFlLi43ODM4YTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hbXMzNjlmZzA2LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYW1zMzY5ZmcwNi5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDN4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYwppbmRleCA2MjA0M2YxLi5kNjhmMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwM3hfYmwuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwM3guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgREE5MDMwX1dMRURfQ09OVFJPTAkweDI1CiAjZGVmaW5lIERBOTAzMF9XTEVEX0NQX0VOCSgxIDw8IDYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9lcDkzeHhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCmluZGV4IGIwNTgyOTEuLmM3NGE2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMKaW5kZXggOGM2YmVmZC4uYWRiMTkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZ2VuZXJpY19ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2dlbmVyaWNfYmwuYwpAQCAtNTYsNyArNTYsNyBAQAogICogQ2FsbGVkIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IHRvIGxpbWl0IHRoZSBiYWNrbGlnaHQgaW50ZW5zaXR5LgogICogSWYgbGltaXQ9PTAgY2xlYXIgYW55IGxpbWl0LCBvdGhlcndpc2UgbGltaXQgdGhlIGludGVuc2l0eQogICovCi12b2lkIGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KGludCBsaW1pdCkKK3ZvaWQgZ2VuZXJpY2JsX2xpbWl0X2ludGVuc2l0eShpbnQgbGltaXQpCiB7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gZ2VuZXJpY19iYWNrbGlnaHRfZGV2aWNlOwogCkBAIC02OCw3ICs2OCw3IEBACiAJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoZ2VuZXJpY19iYWNrbGlnaHRfZGV2aWNlKTsKIAltdXRleF91bmxvY2soJmJkLT5vcHNfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY2JsX2xpbWl0X2ludGVuc2l0eSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBnZW5lcmljYmxfb3BzID0gewogCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2w0ZjAwMjQydDAzLmMKaW5kZXggOThhZDNlNS4uNGY1ZDFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sNGYwMDI0MnQwMy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTIsMTUgKzUzLDExIEBACiAKIAlkZXZfZGJnKCZzcGktPmRldiwgImluaXRpYWxpemluZyBMQ0RcbiIpOwogCi0JaWYgKHByaXYtPmlvX3JlZykgewotCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UocHJpdi0+aW9fcmVnLCAxODAwMDAwLCAxODAwMDAwKTsKLQkJcmVndWxhdG9yX2VuYWJsZShwcml2LT5pb19yZWcpOwotCX0KKwlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UocHJpdi0+aW9fcmVnLCAxODAwMDAwLCAxODAwMDAwKTsKKwlyZWd1bGF0b3JfZW5hYmxlKHByaXYtPmlvX3JlZyk7CiAKLQlpZiAocHJpdi0+Y29yZV9yZWcpIHsKLQkJcmVndWxhdG9yX3NldF92b2x0YWdlKHByaXYtPmNvcmVfcmVnLCAyODAwMDAwLCAyODAwMDAwKTsKLQkJcmVndWxhdG9yX2VuYWJsZShwcml2LT5jb3JlX3JlZyk7Ci0JfQorCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShwcml2LT5jb3JlX3JlZywgMjgwMDAwMCwgMjgwMDAwMCk7CisJcmVndWxhdG9yX2VuYWJsZShwcml2LT5jb3JlX3JlZyk7CiAKIAlsNGYwMDI0MnQwM19yZXNldChwZGF0YS0+cmVzZXRfZ3Bpbyk7CiAKQEAgLTc4LDExICs3NSw4IEBACiAKIAlncGlvX3NldF92YWx1ZShwZGF0YS0+ZGF0YV9lbmFibGVfZ3BpbywgMCk7CiAKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5pb19yZWcpOwotCi0JaWYgKHByaXYtPmNvcmVfcmVnKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5jb3JlX3JlZyk7CisJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+aW9fcmVnKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2LT5jb3JlX3JlZyk7CiB9CiAKIHN0YXRpYyBpbnQgbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX2dldChzdHJ1Y3QgbGNkX2RldmljZSAqbGQpCkBAIC0xNzgsNDcgKzE3MiwzNCBAQAogCiAJcHJpdi0+c3BpID0gc3BpOwogCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5yZXNldF9ncGlvLCAibGNkIGw0ZjAwMjQydDAzIHJlc2V0Iik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShwZGF0YS0+cmVzZXRfZ3BpbywgR1BJT0ZfT1VUX0lOSVRfSElHSCwKKwkJCQkJCSJsY2QgbDRmMDAyNDJ0MDMgcmVzZXQiKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LAogCQkJIlVuYWJsZSB0byBnZXQgdGhlIGxjZCBsNGYwMDI0MnQwMyByZXNldCBncGlvLlxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+cmVzZXRfZ3BpbywgMSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnIyOwotCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5kYXRhX2VuYWJsZV9ncGlvLAotCQkJCSJsY2QgbDRmMDAyNDJ0MDMgZGF0YSBlbmFibGUiKTsKKwlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHBkYXRhLT5kYXRhX2VuYWJsZV9ncGlvLCBHUElPRl9PVVRfSU5JVF9MT1csCisJCQkJCQkibGNkIGw0ZjAwMjQydDAzIGRhdGEgZW5hYmxlIik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCSJVbmFibGUgdG8gZ2V0IHRoZSBsY2QgbDRmMDAyNDJ0MDMgZGF0YSBlbiBncGlvLlxuIik7CiAJCWdvdG8gZXJyMjsKIAl9CiAKLQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8sIDApOwotCWlmIChyZXQpCisJcHJpdi0+aW9fcmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2ZGQiKTsKKwlpZiAoSVNfRVJSKHByaXYtPmlvX3JlZykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5hYmxlIHRvIGdldCB0aGUgSU8gcmVndWxhdG9yXG4iLAorCQkgICAgICAgX19mdW5jX18pOwogCQlnb3RvIGVycjM7Ci0KLQlpZiAocGRhdGEtPmlvX3N1cHBseSkgewotCQlwcml2LT5pb19yZWcgPSByZWd1bGF0b3JfZ2V0KE5VTEwsIHBkYXRhLT5pb19zdXBwbHkpOwotCi0JCWlmIChJU19FUlIocHJpdi0+aW9fcmVnKSkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCB0aGUgSU8gcmVndWxhdG9yXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycjM7Ci0JCX0KIAl9CiAKLQlpZiAocGRhdGEtPmNvcmVfc3VwcGx5KSB7Ci0JCXByaXYtPmNvcmVfcmVnID0gcmVndWxhdG9yX2dldChOVUxMLCBwZGF0YS0+Y29yZV9zdXBwbHkpOwotCi0JCWlmIChJU19FUlIocHJpdi0+Y29yZV9yZWcpKSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHRoZSBjb3JlIHJlZ3VsYXRvclxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJZ290byBlcnI0OwotCQl9CisJcHJpdi0+Y29yZV9yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjb3JlIik7CisJaWYgKElTX0VSUihwcml2LT5jb3JlX3JlZykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5hYmxlIHRvIGdldCB0aGUgY29yZSByZWd1bGF0b3JcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyNDsKIAl9CiAKIAlwcml2LT5sZCA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoImw0ZjAwMjQydDAzIiwKQEAgLTIzOCwxMSArMjE5LDkgQEAKIAlyZXR1cm4gMDsKIAogZXJyNToKLQlpZiAocHJpdi0+Y29yZV9yZWcpCi0JCXJlZ3VsYXRvcl9wdXQocHJpdi0+Y29yZV9yZWcpOworCXJlZ3VsYXRvcl9wdXQocHJpdi0+Y29yZV9yZWcpOwogZXJyNDoKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7CisJcmVndWxhdG9yX3B1dChwcml2LT5pb19yZWcpOwogZXJyMzoKIAlncGlvX2ZyZWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8pOwogZXJyMjoKQEAgLTI2NiwxMCArMjQ1LDggQEAKIAlncGlvX2ZyZWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8pOwogCWdwaW9fZnJlZShwZGF0YS0+cmVzZXRfZ3Bpbyk7CiAKLQlpZiAocHJpdi0+aW9fcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7Ci0JaWYgKHByaXYtPmNvcmVfcmVnKQotCQlyZWd1bGF0b3JfcHV0KHByaXYtPmNvcmVfcmVnKTsKKwlyZWd1bGF0b3JfcHV0KHByaXYtPmlvX3JlZyk7CisJcmVndWxhdG9yX3B1dChwcml2LT5jb3JlX3JlZyk7CiAKIAlrZnJlZShwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYwppbmRleCA1OTM0NjU1Li5kYTlhNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAibGQ5MDQwX2dhbW1hLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYwppbmRleCA1ZDNjZjMzLi40ZWM3OGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbXMyODNnZjA1LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG1zMjgzZ2YwNS5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2xtczI4M2dmMDUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IGxtczI4M2dmMDVfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMKaW5kZXggMDdlOGUyNy4uN2JiYzgwMjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWF4ODkyNV9ibC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDg5MjUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTUFYX0JSSUdIVE5FU1MJCSgweGZmKQogI2RlZmluZSBNSU5fQlJJR0hUTkVTUwkJKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9zNmU2M20wLmMKaW5kZXggNjk0ZTVhYS4uZTEzMjE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNtMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3M2ZTYzbTAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiczZlNjNtMF9nYW1tYS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC93bTgzMXhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCmluZGV4IGQ0YzZlYjIuLmZiZTllOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMxeF9ibC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZjU0eC1scTA0M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwppbmRleCAyNDY0YjkxLi41NjcyMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2JmNTR4X2lycV9lcnJvciwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2JmNTR4X2lycV9lcnJvciwgMCwKIAkJCSJQUEkgRVJST1IiLCBpbmZvKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCiAJCSAgICAgICAiOiB1bmFibGUgdG8gcmVxdWVzdCBQUEkgRVJST1IgSVJRXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmZpbi1scTAzNXExLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tbHEwMzVxMS1mYi5jCmluZGV4IDIzYjZjNGIuLmM2MzMwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmZpbi1scTAzNXExLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9iZmluLWxxMDM1cTEtZmIuYwpAQCAtNjk1LDcgKzY5NSw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIGJmaW5fbHEwMzVxMV9pcnFfZXJyb3IsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaW5mby0+aXJxLCBiZmluX2xxMDM1cTFfaXJxX2Vycm9yLCAwLAogCQkJRFJJVkVSX05BTUUiIFBQSSBFUlJPUiIsIGluZm8pOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IFBQSSBFUlJPUiBJUlFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwppbmRleCBkOGRlMjlmLi5kNWUxMjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJCWdvdG8gb3V0NzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpbmZvLT5pcnEsIGJmaW5fdDM1MG1jcWJfaXJxX2Vycm9yLCBJUlFGX0RJU0FCTEVELAorCXJldCA9IHJlcXVlc3RfaXJxKGluZm8tPmlycSwgYmZpbl90MzUwbWNxYl9pcnFfZXJyb3IsIDAsCiAJCQkiUFBJIEVSUk9SIiwgaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JmaW5fYWR2NzM5M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW5fYWR2NzM5M2ZiLmMKaW5kZXggODQ4NmY1NC4uODExZGQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iZmluX2FkdjczOTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmZpbl9hZHY3MzkzZmIuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJCWdvdG8gb3V0XzQ7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKElSUV9QUElfRVJST1IsIHBwaV9pcnFfZXJyb3IsIElSUUZfRElTQUJMRUQsCisJaWYgKHJlcXVlc3RfaXJxKElSUV9QUElfRVJST1IsIHBwaV9pcnFfZXJyb3IsIDAsCiAJCQkiUFBJIEVSUk9SIiwgZmJkZXYpIDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZXF1ZXN0IFBQSSBFUlJPUiBJUlFcbiIpOwogCQlyZXQgPSAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKaW5kZXggY2FhYTI3ZC4uMmM3NmZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiY2FybWluZWZiLmgiCiAjaW5jbHVkZSAiY2FybWluZWZiX3JlZ3MuaCIKQEAgLTMyLDExICszMywxMSBAQAogI2RlZmluZSBDQVJNSU5FRkJfREVGQVVMVF9WSURFT19NT0RFCTEKIAogc3RhdGljIHVuc2lnbmVkIGludCBmYl9tb2RlID0gQ0FSTUlORUZCX0RFRkFVTFRfVklERU9fTU9ERTsKLW1vZHVsZV9wYXJhbShmYl9tb2RlLCB1aW50LCA0NDQpOworbW9kdWxlX3BhcmFtKGZiX21vZGUsIHVpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmYl9tb2RlLCAiSW5pdGlhbCB2aWRlbyBtb2RlIGFzIGludGVnZXIuIik7CiAKIHN0YXRpYyBjaGFyICpmYl9tb2RlX3N0cjsKLW1vZHVsZV9wYXJhbShmYl9tb2RlX3N0ciwgY2hhcnAsIDQ0NCk7Cittb2R1bGVfcGFyYW0oZmJfbW9kZV9zdHIsIGNoYXJwLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZmJfbW9kZV9zdHIsICJJbml0aWFsIHZpZGVvIG1vZGUgaW4gY2hhcmFjdGVycy4iKTsKIAogLyoKQEAgLTQ2LDcgKzQ3LDcgQEAKICAqIDBiMDEwIERpc3BsYXkgMQogICovCiBzdGF0aWMgaW50IGZiX2Rpc3BsYXlzID0gQ0FSTUlORV9VU0VfRElTUExBWTAgfCBDQVJNSU5FX1VTRV9ESVNQTEFZMTsKLW1vZHVsZV9wYXJhbShmYl9kaXNwbGF5cywgaW50LCA0NDQpOworbW9kdWxlX3BhcmFtKGZiX2Rpc3BsYXlzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmYl9kaXNwbGF5cywgIkJpdCBtb2RlLCB3aGljaCBkaXNwbGF5cyBhcmUgdXNlZCIpOwogCiBzdHJ1Y3QgY2FybWluZV9odyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jIGIvZHJpdmVycy92aWRlby9jb2JhbHRfbGNkZmIuYwppbmRleCBlMDI3NjQzLi5mNTY2OTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvYmFsdF9sY2RmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29iYWx0X2xjZGZiLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIC8qCiAgKiBDdXJzb3IgcG9zaXRpb24gYWRkcmVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb250cm9sZmIuYyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKaW5kZXggOTA3NWJlYTUuLjdiMmM0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAKIAogLyoKLSAqIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz1jb250cm9sZmI6JykKKyAqIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMgKGB2aWRlbz1jb250cm9sZmI6JykKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGNvbnRyb2xfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZGE4eHgtZmIuYwppbmRleCBmY2RhYzg3Li41NWY5MWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2RhOHh4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9kYTh4eC1mYi5jCkBAIC0zNSw2ICszNSw5IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImRhOHh4X2xjZGMiCiAKKyNkZWZpbmUgTENEX1ZFUlNJT05fMQkxCisjZGVmaW5lIExDRF9WRVJTSU9OXzIJMgorCiAvKiBMQ0QgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIExDRF9FTkRfT0ZfRlJBTUUxCQlCSVQoOSkKICNkZWZpbmUgTENEX0VORF9PRl9GUkFNRTAJCUJJVCg4KQpAQCAtNDksNyArNTIsOSBAQAogI2RlZmluZSBMQ0RfRE1BX0JVUlNUXzQJCQkweDIKICNkZWZpbmUgTENEX0RNQV9CVVJTVF84CQkJMHgzCiAjZGVmaW5lIExDRF9ETUFfQlVSU1RfMTYJCTB4NAotI2RlZmluZSBMQ0RfRU5EX09GX0ZSQU1FX0lOVF9FTkEJQklUKDIpCisjZGVmaW5lIExDRF9WMV9FTkRfT0ZfRlJBTUVfSU5UX0VOQQlCSVQoMikKKyNkZWZpbmUgTENEX1YyX0VORF9PRl9GUkFNRTBfSU5UX0VOQQlCSVQoOCkKKyNkZWZpbmUgTENEX1YyX0VORF9PRl9GUkFNRTFfSU5UX0VOQQlCSVQoOSkKICNkZWZpbmUgTENEX0RVQUxfRlJBTUVfQlVGRkVSX0VOQUJMRQlCSVQoMCkKIAogLyogTENEIENvbnRyb2wgUmVnaXN0ZXIgKi8KQEAgLTY1LDEyICs3MCwxOCBAQAogI2RlZmluZSBMQ0RfTU9OT184QklUX01PREUJCUJJVCg5KQogI2RlZmluZSBMQ0RfUkFTVEVSX09SREVSCQlCSVQoOCkKICNkZWZpbmUgTENEX1RGVF9NT0RFCQkJQklUKDcpCi0jZGVmaW5lIExDRF9VTkRFUkZMT1dfSU5UX0VOQQkJQklUKDYpCi0jZGVmaW5lIExDRF9QTF9FTkFCTEUJCQlCSVQoNCkKKyNkZWZpbmUgTENEX1YxX1VOREVSRkxPV19JTlRfRU5BCUJJVCg2KQorI2RlZmluZSBMQ0RfVjJfVU5ERVJGTE9XX0lOVF9FTkEJQklUKDUpCisjZGVmaW5lIExDRF9WMV9QTF9JTlRfRU5BCQlCSVQoNCkKKyNkZWZpbmUgTENEX1YyX1BMX0lOVF9FTkEJCUJJVCg2KQogI2RlZmluZSBMQ0RfTU9OT0NIUk9NRV9NT0RFCQlCSVQoMSkKICNkZWZpbmUgTENEX1JBU1RFUl9FTkFCTEUJCUJJVCgwKQogI2RlZmluZSBMQ0RfVEZUX0FMVF9FTkFCTEUJCUJJVCgyMykKICNkZWZpbmUgTENEX1NUTl81NjVfRU5BQkxFCQlCSVQoMjQpCisjZGVmaW5lIExDRF9WMl9ETUFfQ0xLX0VOCQlCSVQoMikKKyNkZWZpbmUgTENEX1YyX0xJRERfQ0xLX0VOCQlCSVQoMSkKKyNkZWZpbmUgTENEX1YyX0NPUkVfQ0xLX0VOCQlCSVQoMCkKKyNkZWZpbmUgTENEX1YyX0xQUF9CMTAJCQkyNgogCiAvKiBMQ0QgUmFzdGVyIFRpbWluZyAyIFJlZ2lzdGVyICovCiAjZGVmaW5lIExDRF9BQ19CSUFTX1RSQU5TSVRJT05TX1BFUl9JTlQoeCkJKCh4KSA8PCAxNikKQEAgLTgyLDYgKzkzLDcgQEAKICNkZWZpbmUgTENEX0lOVkVSVF9GUkFNRV9DTE9DSwkJCUJJVCgyMCkKIAogLyogTENEIEJsb2NrICovCisjZGVmaW5lICBMQ0RfUElEX1JFRwkJCQkweDAKICNkZWZpbmUgIExDRF9DVFJMX1JFRwkJCQkweDQKICNkZWZpbmUgIExDRF9TVEFUX1JFRwkJCQkweDgKICNkZWZpbmUgIExDRF9SQVNURVJfQ1RSTF9SRUcJCQkweDI4CkBAIC05NCw2ICsxMDYsMTcgQEAKICNkZWZpbmUgIExDRF9ETUFfRlJNX0JVRl9CQVNFX0FERFJfMV9SRUcJMHg0QwogI2RlZmluZSAgTENEX0RNQV9GUk1fQlVGX0NFSUxJTkdfQUREUl8xX1JFRwkweDUwCiAKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgYXZhaWxhYmxlIG9ubHkgaW4gVmVyc2lvbiAyICovCisjZGVmaW5lICBMQ0RfUkFXX1NUQVRfUkVHCQkJMHg1OAorI2RlZmluZSAgTENEX01BU0tFRF9TVEFUX1JFRwkJCTB4NWMKKyNkZWZpbmUgIExDRF9JTlRfRU5BQkxFX1NFVF9SRUcJCQkweDYwCisjZGVmaW5lICBMQ0RfSU5UX0VOQUJMRV9DTFJfUkVHCQkJMHg2NAorI2RlZmluZSAgTENEX0VORF9PRl9JTlRfSU5EX1JFRwkJCTB4NjgKKworLyogQ2xvY2sgcmVnaXN0ZXJzIGF2YWlsYWJsZSBvbmx5IG9uIFZlcnNpb24gMiAqLworI2RlZmluZSAgTENEX0NMS19FTkFCTEVfUkVHCQkJMHg2YworI2RlZmluZSAgTENEX0NMS19SRVNFVF9SRUcJCQkweDcwCisKICNkZWZpbmUgTENEX05VTV9CVUZGRVJTCTIKIAogI2RlZmluZSBXU0lfVElNRU9VVAk1MApAQCAtMTA1LDYgKzEyOCw4IEBACiAKIHN0YXRpYyByZXNvdXJjZV9zaXplX3QgZGE4eHhfZmJfcmVnX2Jhc2U7CiBzdGF0aWMgc3RydWN0IHJlc291cmNlICpsY2RjX3JlZ3M7CitzdGF0aWMgdW5zaWduZWQgaW50IGxjZF9yZXZpc2lvbjsKK3N0YXRpYyBpcnFfaGFuZGxlcl90IGxjZGNfaXJxX2hhbmRsZXI7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGxjZGNfcmVhZCh1bnNpZ25lZCBpbnQgYWRkcikKIHsKQEAgLTI0MCw2ICsyNjUsNyBAQAogCXUzMiBlbmQ7CiAJdTMyIHJlZ19yYXM7CiAJdTMyIHJlZ19kbWE7CisJdTMyIHJlZ19pbnQ7CiAKIAkvKiBpbml0IHJlZyB0byBjbGVhciBQTE0gKGxvYWRpbmcgbW9kZSkgZmllbGRzICovCiAJcmVnX3JhcyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX0NUUkxfUkVHKTsKQEAgLTI1Miw3ICsyNzgsMTQgQEAKIAkJZW5kICAgICAgPSBwYXItPmRtYV9lbmQ7CiAKIAkJcmVnX3JhcyB8PSBMQ0RfUEFMRVRURV9MT0FEX01PREUoREFUQV9PTkxZKTsKLQkJcmVnX2RtYSB8PSBMQ0RfRU5EX09GX0ZSQU1FX0lOVF9FTkE7CisJCWlmIChsY2RfcmV2aXNpb24gPT0gTENEX1ZFUlNJT05fMSkgeworCQkJcmVnX2RtYSB8PSBMQ0RfVjFfRU5EX09GX0ZSQU1FX0lOVF9FTkE7CisJCX0gZWxzZSB7CisJCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCQlMQ0RfVjJfRU5EX09GX0ZSQU1FMF9JTlRfRU5BIHwKKwkJCQlMQ0RfVjJfRU5EX09GX0ZSQU1FMV9JTlRfRU5BOworCQkJbGNkY193cml0ZShyZWdfaW50LCBMQ0RfSU5UX0VOQUJMRV9TRVRfUkVHKTsKKwkJfQogCQlyZWdfZG1hIHw9IExDRF9EVUFMX0ZSQU1FX0JVRkZFUl9FTkFCTEU7CiAKIAkJbGNkY193cml0ZShzdGFydCwgTENEX0RNQV9GUk1fQlVGX0JBU0VfQUREUl8wX1JFRyk7CkBAIC0yNjQsNyArMjk3LDE0IEBACiAJCWVuZCAgICAgID0gc3RhcnQgKyBwYXItPnBhbGV0dGVfc3ogLSAxOwogCiAJCXJlZ19yYXMgfD0gTENEX1BBTEVUVEVfTE9BRF9NT0RFKFBBTEVUVEVfT05MWSk7Ci0JCXJlZ19yYXMgfD0gTENEX1BMX0VOQUJMRTsKKworCQlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzEpIHsKKwkJCXJlZ19yYXMgfD0gTENEX1YxX1BMX0lOVF9FTkE7CisJCX0gZWxzZSB7CisJCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCQlMQ0RfVjJfUExfSU5UX0VOQTsKKwkJCWxjZGNfd3JpdGUocmVnX2ludCwgTENEX0lOVF9FTkFCTEVfU0VUX1JFRyk7CisJCX0KIAogCQlsY2RjX3dyaXRlKHN0YXJ0LCBMQ0RfRE1BX0ZSTV9CVUZfQkFTRV9BRERSXzBfUkVHKTsKIAkJbGNkY193cml0ZShlbmQsIExDRF9ETUFfRlJNX0JVRl9DRUlMSU5HX0FERFJfMF9SRUcpOwpAQCAtMzQ4LDYgKzM4OCw3IEBACiBzdGF0aWMgaW50IGxjZF9jZmdfZGlzcGxheShjb25zdCBzdHJ1Y3QgbGNkX2N0cmxfY29uZmlnICpjZmcpCiB7CiAJdTMyIHJlZzsKKwl1MzIgcmVnX2ludDsKIAogCXJlZyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX0NUUkxfUkVHKSAmIH4oTENEX1RGVF9NT0RFIHwKIAkJCQkJCUxDRF9NT05PXzhCSVRfTU9ERSB8CkBAIC0zNzUsNyArNDE2LDEzIEBACiAJfQogCiAJLyogZW5hYmxlIGFkZGl0aW9uYWwgaW50ZXJydXB0cyBoZXJlICovCi0JcmVnIHw9IExDRF9VTkRFUkZMT1dfSU5UX0VOQTsKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzEpIHsKKwkJcmVnIHw9IExDRF9WMV9VTkRFUkZMT1dfSU5UX0VOQTsKKwl9IGVsc2UgeworCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX1NFVF9SRUcpIHwKKwkJCUxDRF9WMl9VTkRFUkZMT1dfSU5UX0VOQTsKKwkJbGNkY193cml0ZShyZWdfaW50LCBMQ0RfSU5UX0VOQUJMRV9TRVRfUkVHKTsKKwl9CiAKIAlsY2RjX3dyaXRlKHJlZywgTENEX1JBU1RFUl9DVFJMX1JFRyk7CiAKQEAgLTQxMywxOCArNDYwLDQzIEBACiAKIAkvKiBTZXQgdGhlIFBhbmVsIFdpZHRoICovCiAJLyogUGl4ZWxzIHBlciBsaW5lID0gKFBQTCArIDEpKjE2ICovCi0JLyoweDNGIGluIGJpdHMgNC4uOSBnaXZlcyBtYXggaG9yaXNvbnRhbCByZXNvbHV0aW9uID0gMTAyNCBwaXhlbHMqLwotCXdpZHRoICY9IDB4M2YwOworCWlmIChsY2RfcmV2aXNpb24gPT0gTENEX1ZFUlNJT05fMSkgeworCQkvKgorCQkgKiAweDNGIGluIGJpdHMgNC4uOSBnaXZlcyBtYXggaG9yaXpvbnRhbCByZXNvbHV0aW9uID0gMTAyNAorCQkgKiBwaXhlbHMuCisJCSAqLworCQl3aWR0aCAmPSAweDNmMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAweDdGIGluIGJpdHMgNC4uMTAgZ2l2ZXMgbWF4IGhvcml6b250YWwgcmVzb2x1dGlvbiA9IDIwNDgKKwkJICogcGl4ZWxzLgorCQkgKi8KKwkJd2lkdGggJj0gMHg3ZjA7CisJfQorCiAJcmVnID0gbGNkY19yZWFkKExDRF9SQVNURVJfVElNSU5HXzBfUkVHKTsKIAlyZWcgJj0gMHhmZmZmZmMwMDsKLQlyZWcgfD0gKCh3aWR0aCA+PiA0KSAtIDEpIDw8IDQ7CisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8xKSB7CisJCXJlZyB8PSAoKHdpZHRoID4+IDQpIC0gMSkgPDwgNDsKKwl9IGVsc2UgeworCQl3aWR0aCA9ICh3aWR0aCA+PiA0KSAtIDE7CisJCXJlZyB8PSAoKHdpZHRoICYgMHgzZikgPDwgNCkgfCAoKHdpZHRoICYgMHg0MCkgPj4gMyk7CisJfQogCWxjZGNfd3JpdGUocmVnLCBMQ0RfUkFTVEVSX1RJTUlOR18wX1JFRyk7CiAKIAkvKiBTZXQgdGhlIFBhbmVsIEhlaWdodCAqLworCS8qIFNldCBiaXRzIDk6MCBvZiBMaW5lcyBQZXIgUGl4ZWwgKi8KIAlyZWcgPSBsY2RjX3JlYWQoTENEX1JBU1RFUl9USU1JTkdfMV9SRUcpOwogCXJlZyA9ICgoaGVpZ2h0IC0gMSkgJiAweDNmZikgfCAocmVnICYgMHhmZmZmZmMwMCk7CiAJbGNkY193cml0ZShyZWcsIExDRF9SQVNURVJfVElNSU5HXzFfUkVHKTsKIAorCS8qIFNldCBiaXQgMTAgb2YgTGluZXMgUGVyIFBpeGVsICovCisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8yKSB7CisJCXJlZyA9IGxjZGNfcmVhZChMQ0RfUkFTVEVSX1RJTUlOR18yX1JFRyk7CisJCXJlZyB8PSAoKGhlaWdodCAtIDEpICYgMHg0MDApIDw8IDE2OworCQlsY2RjX3dyaXRlKHJlZywgTENEX1JBU1RFUl9USU1JTkdfMl9SRUcpOworCX0KKwogCS8qIFNldCB0aGUgUmFzdGVyIE9yZGVyIG9mIHRoZSBGcmFtZSBCdWZmZXIgKi8KIAlyZWcgPSBsY2RjX3JlYWQoTENEX1JBU1RFUl9DVFJMX1JFRykgJiB+KDEgPDwgOCk7CiAJaWYgKHJhc3Rlcl9vcmRlcikKQEAgLTUxMSw2ICs1ODMsOSBAQAogCS8qIERNQSBoYXMgdG8gYmUgZGlzYWJsZWQgKi8KIAlsY2RjX3dyaXRlKDAsIExDRF9ETUFfQ1RSTF9SRUcpOwogCWxjZGNfd3JpdGUoMCwgTENEX1JBU1RFUl9DVFJMX1JFRyk7CisKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzIpCisJCWxjZGNfd3JpdGUoMCwgTENEX0lOVF9FTkFCTEVfU0VUX1JFRyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxjZF9jYWxjX2Nsa19kaXZpZGVyKHN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhcikKQEAgLTUyMyw2ICs1OTgsMTEgQEAKIAkvKiBDb25maWd1cmUgdGhlIExDRCBjbG9jayBkaXZpc29yLiAqLwogCWxjZGNfd3JpdGUoTENEX0NMS19ESVZJU09SKGRpdikgfAogCQkJKExDRF9SQVNURVJfTU9ERSAmIDB4MSksIExDRF9DVFJMX1JFRyk7CisKKwlpZiAobGNkX3JldmlzaW9uID09IExDRF9WRVJTSU9OXzIpCisJCWxjZGNfd3JpdGUoTENEX1YyX0RNQV9DTEtfRU4gfCBMQ0RfVjJfTElERF9DTEtfRU4gfAorCQkJCUxDRF9WMl9DT1JFX0NMS19FTiwgTENEX0NMS19FTkFCTEVfUkVHKTsKKwogfQogCiBzdGF0aWMgaW50IGxjZF9pbml0KHN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGxjZF9jdHJsX2NvbmZpZyAqY2ZnLApAQCAtNTgzLDcgKzY2Myw2MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbGNkY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCisvKiBJUlEgaGFuZGxlciBmb3IgdmVyc2lvbiAyIG9mIExDREMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBsY2RjX2lycV9oYW5kbGVyX3JldjAyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZGE4eHhfZmJfcGFyICpwYXIgPSBhcmc7CisJdTMyIHN0YXQgPSBsY2RjX3JlYWQoTENEX01BU0tFRF9TVEFUX1JFRyk7CisJdTMyIHJlZ19pbnQ7CisKKwlpZiAoKHN0YXQgJiBMQ0RfU1lOQ19MT1NUKSAmJiAoc3RhdCAmIExDRF9GSUZPX1VOREVSRkxPVykpIHsKKwkJbGNkX2Rpc2FibGVfcmFzdGVyKCk7CisJCWxjZGNfd3JpdGUoc3RhdCwgTENEX01BU0tFRF9TVEFUX1JFRyk7CisJCWxjZF9lbmFibGVfcmFzdGVyKCk7CisJfSBlbHNlIGlmIChzdGF0ICYgTENEX1BMX0xPQURfRE9ORSkgeworCQkvKgorCQkgKiBNdXN0IGRpc2FibGUgcmFzdGVyIGJlZm9yZSBjaGFuZ2luZyBzdGF0ZSBvZiBhbnkgY29udHJvbCBiaXQuCisJCSAqIEFuZCBhbHNvIG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIGNsZWFyaW5nIHRoZSBQTCBsb2FkaW5nCisJCSAqIGludGVycnVwdCB2aWEgdGhlIGZvbGxvd2luZyB3cml0ZSB0byB0aGUgc3RhdHVzIHJlZ2lzdGVyLiBJZgorCQkgKiB0aGlzIGlzIGRvbmUgYWZ0ZXIgdGhlbiBvbmUgZ2V0cyBtdWx0aXBsZSBQTCBkb25lIGludGVycnVwdHMuCisJCSAqLworCQlsY2RfZGlzYWJsZV9yYXN0ZXIoKTsKKworCQlsY2RjX3dyaXRlKHN0YXQsIExDRF9NQVNLRURfU1RBVF9SRUcpOworCisJCS8qIERpc2FibGUgUEwgY29tcGxldGlvbiBpbmVycnVwdCAqLworCQlyZWdfaW50ID0gbGNkY19yZWFkKExDRF9JTlRfRU5BQkxFX0NMUl9SRUcpIHwKKwkJICAgICAgIChMQ0RfVjJfUExfSU5UX0VOQSk7CisJCWxjZGNfd3JpdGUocmVnX2ludCwgTENEX0lOVF9FTkFCTEVfQ0xSX1JFRyk7CisKKwkJLyogU2V0dXAgYW5kIHN0YXJ0IGRhdGEgbG9hZGluZyBtb2RlICovCisJCWxjZF9ibGl0KExPQURfREFUQSwgcGFyKTsKKwl9IGVsc2UgeworCQlsY2RjX3dyaXRlKHN0YXQsIExDRF9NQVNLRURfU1RBVF9SRUcpOworCisJCWlmIChzdGF0ICYgTENEX0VORF9PRl9GUkFNRTApIHsKKwkJCWxjZGNfd3JpdGUocGFyLT5kbWFfc3RhcnQsCisJCQkJICAgTENEX0RNQV9GUk1fQlVGX0JBU0VfQUREUl8wX1JFRyk7CisJCQlsY2RjX3dyaXRlKHBhci0+ZG1hX2VuZCwKKwkJCQkgICBMQ0RfRE1BX0ZSTV9CVUZfQ0VJTElOR19BRERSXzBfUkVHKTsKKwkJCXBhci0+dnN5bmNfZmxhZyA9IDE7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBhci0+dnN5bmNfd2FpdCk7CisJCX0KKworCQlpZiAoc3RhdCAmIExDRF9FTkRfT0ZfRlJBTUUxKSB7CisJCQlsY2RjX3dyaXRlKHBhci0+ZG1hX3N0YXJ0LAorCQkJCSAgIExDRF9ETUFfRlJNX0JVRl9CQVNFX0FERFJfMV9SRUcpOworCQkJbGNkY193cml0ZShwYXItPmRtYV9lbmQsCisJCQkJICAgTENEX0RNQV9GUk1fQlVGX0NFSUxJTkdfQUREUl8xX1JFRyk7CisJCQlwYXItPnZzeW5jX2ZsYWcgPSAxOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYXItPnZzeW5jX3dhaXQpOworCQl9CisJfQorCisJbGNkY193cml0ZSgwLCBMQ0RfRU5EX09GX0lOVF9JTkRfUkVHKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIElSUSBoYW5kbGVyIGZvciB2ZXJzaW9uIDEgTENEQyAqLworc3RhdGljIGlycXJldHVybl90IGxjZGNfaXJxX2hhbmRsZXJfcmV2MDEoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBkYTh4eF9mYl9wYXIgKnBhciA9IGFyZzsKIAl1MzIgc3RhdCA9IGxjZGNfcmVhZChMQ0RfU1RBVF9SRUcpOwpAQCAtNjA2LDcgKzc0Miw3IEBACiAKIAkJLyogRGlzYWJsZSBQTCBjb21wbGV0aW9uIGluZXJydXB0ICovCiAJCXJlZ19yYXMgID0gbGNkY19yZWFkKExDRF9SQVNURVJfQ1RSTF9SRUcpOwotCQlyZWdfcmFzICY9IH5MQ0RfUExfRU5BQkxFOworCQlyZWdfcmFzICY9IH5MQ0RfVjFfUExfSU5UX0VOQTsKIAkJbGNkY193cml0ZShyZWdfcmFzLCBMQ0RfUkFTVEVSX0NUUkxfUkVHKTsKIAogCQkvKiBTZXR1cCBhbmQgc3RhcnQgZGF0YSBsb2FkaW5nIG1vZGUgKi8KQEAgLTg3Nyw4ICsxMDEzLDggQEAKIAogCQkJc3RhcnQJPSBmaXgtPnNtZW1fc3RhcnQgKwogCQkJCW5ld192YXIueW9mZnNldCAqIGZpeC0+bGluZV9sZW5ndGggKwotCQkJCW5ld192YXIueG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OwotCQkJZW5kCT0gc3RhcnQgKyB2YXItPnlyZXMgKiBmaXgtPmxpbmVfbGVuZ3RoIC0gMTsKKwkJCQluZXdfdmFyLnhvZmZzZXQgKiBmYmktPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CisJCQllbmQJPSBzdGFydCArIGZiaS0+dmFyLnlyZXMgKiBmaXgtPmxpbmVfbGVuZ3RoIC0gMTsKIAkJCXBhci0+ZG1hX3N0YXJ0CT0gc3RhcnQ7CiAJCQlwYXItPmRtYV9lbmQJPSBlbmQ7CiAJCX0KQEAgLTk0NSw2ICsxMDgxLDIyIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfY2xrX3B1dDsKIAorCS8qIERldGVybWluZSBMQ0QgSVAgVmVyc2lvbiAqLworCXN3aXRjaCAobGNkY19yZWFkKExDRF9QSURfUkVHKSkgeworCWNhc2UgMHg0QzEwMDEwMjoKKwkJbGNkX3JldmlzaW9uID0gTENEX1ZFUlNJT05fMTsKKwkJYnJlYWs7CisJY2FzZSAweDRGMjAwODAwOgorCQlsY2RfcmV2aXNpb24gPSBMQ0RfVkVSU0lPTl8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybigmZGV2aWNlLT5kZXYsICJVbmtub3duIFBJRCBSZWcgdmFsdWUgMHgleCwgIgorCQkJCSJkZWZhdWx0aW5nIHRvIExDRCByZXZpc2lvbiAxXG4iLAorCQkJCWxjZGNfcmVhZChMQ0RfUElEX1JFRykpOworCQlsY2RfcmV2aXNpb24gPSBMQ0RfVkVSU0lPTl8xOworCQlicmVhazsKKwl9CisKIAlmb3IgKGkgPSAwLCBsY2RjX2luZm8gPSBrbm93bl9sY2RfcGFuZWxzOwogCQlpIDwgQVJSQVlfU0laRShrbm93bl9sY2RfcGFuZWxzKTsKIAkJaSsrLCBsY2RjX2luZm8rKykgewpAQCAtMTA4NSw3ICsxMjM3LDEzIEBACiAJfQogI2VuZGlmCiAKLQlyZXQgPSByZXF1ZXN0X2lycShwYXItPmlycSwgbGNkY19pcnFfaGFuZGxlciwgMCwgRFJJVkVSX05BTUUsIHBhcik7CisJaWYgKGxjZF9yZXZpc2lvbiA9PSBMQ0RfVkVSU0lPTl8xKQorCQlsY2RjX2lycV9oYW5kbGVyID0gbGNkY19pcnFfaGFuZGxlcl9yZXYwMTsKKwllbHNlCisJCWxjZGNfaXJxX2hhbmRsZXIgPSBsY2RjX2lycV9oYW5kbGVyX3JldjAyOworCisJcmV0ID0gcmVxdWVzdF9pcnEocGFyLT5pcnEsIGxjZGNfaXJxX2hhbmRsZXIsIDAsCisJCQlEUklWRVJfTkFNRSwgcGFyKTsKIAlpZiAocmV0KQogCQlnb3RvIGlycV9mcmVxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lcDkzeHgtZmIuYyBiL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMKaW5kZXggNDBlNWYxNy4uMmU4MzBlYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXA5M3h4LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9lcDkzeHgtZmIuYwpAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmItcHV2My5jIGIvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKaW5kZXggMjdmMmM1Ny4uNjBhNzg3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYi1wdXYzLmMKQEAgLTYyNCw4ICs2MjQsOCBAQAogCQkgICAgfHwgdmFyLT54b2Zmc2V0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKLQkJICAgIHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCWlmICh2YXItPnhvZmZzZXQgKyBpbmZvLT52YXIueHJlcyA+IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgfHwKKwkJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RkYy5jCmluZGV4IDRhODc0YzguLjJiMTA2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMKKysrIGIvZHJpdmVycy92aWRlby9mYl9kZGMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBkcml2ZXIvdmlkZS9mYl9kZGMuYyAtIEREQy9FRElEIHJlYWQgc3VwcG9ydC4KKyAqIGRyaXZlcnMvdmlkZW8vZmJfZGRjLmMgLSBEREMvRURJRCByZWFkIHN1cHBvcnQuCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiBEZW5uaXMgTXVuc2llIDxkbXVuc2llQGNlY3JvcGlhLmNvbT4KICAqCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9kZWZpby5jIGIvZHJpdmVycy92aWRlby9mYl9kZWZpby5jCmluZGV4IDMyODE0ZTguLmMyN2UxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGVmaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RlZmlvLmMKQEAgLTIyMyw4ICsyMjMsNyBAQAogCWludCBpOwogCiAJQlVHX09OKCFmYmRlZmlvKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZpbmZvLT5kZWZlcnJlZF93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaW5mby0+ZGVmZXJyZWRfd29yayk7CiAKIAkvKiBjbGVhciBvdXQgdGhlIG1hcHBpbmcgdGhhdCB3ZSBzZXR1cCAqLwogCWZvciAoaSA9IDAgOyBpIDwgaW5mby0+Zml4LnNtZW1fbGVuOyBpICs9IFBBR0VfU0laRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYl9ub3RpZnkuYyBiL2RyaXZlcnMvdmlkZW8vZmJfbm90aWZ5LmMKaW5kZXggOGMwMjAzOC4uNzRjMmRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYl9ub3RpZnkuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiX25vdGlmeS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKGZiX25vdGlmaWVyX2xpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggNWFhYzAwZS4uYWQ5MzYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtMTczOCw4ICsxNzM4LDYgQEAKIHsKIAlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7CiAKLQlpZiAoIWxvY2tfZmJfaW5mbyhpbmZvKSkKLQkJcmV0dXJuOwogCWV2ZW50LmluZm8gPSBpbmZvOwogCWlmIChzdGF0ZSkgewogCQlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX1NVU1BFTkQsICZldmVudCk7CkBAIC0xNzQ4LDcgKzE3NDYsNiBAQAogCQlpbmZvLT5zdGF0ZSA9IEZCSU5GT19TVEFURV9SVU5OSU5HOwogCQlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX1JFU1VNRSwgJmV2ZW50KTsKIAl9Ci0JdW5sb2NrX2ZiX2luZm8oaW5mbyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IDRmNTc0ODUuLmNlZjY1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTQ5Myw3ICs0OTMsOCBAQAogCXJldHVybiBudW07CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3N0ZF90aW1pbmcodW5zaWduZWQgY2hhciAqYmxvY2ssIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpCitzdGF0aWMgaW50IGdldF9zdGRfdGltaW5nKHVuc2lnbmVkIGNoYXIgKmJsb2NrLCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLAorCQlpbnQgdmVyLCBpbnQgcmV2KQogewogCWludCB4cmVzLCB5cmVzID0gMCwgcmVmcmVzaCwgcmF0aW8sIGk7CiAKQEAgLTUwNCw3ICs1MDUsMTEgQEAKIAlyYXRpbyA9IChibG9ja1sxXSAmIDB4YzApID4+IDY7CiAJc3dpdGNoIChyYXRpbykgewogCWNhc2UgMDoKLQkJeXJlcyA9IHhyZXM7CisJCS8qIGluIEVESUQgMS4zIHRoZSBtZWFuaW5nIG9mIDAgY2hhbmdlZCB0byAxNjoxMCAocHJpb3IgMToxKSAqLworCQlpZiAodmVyIDwgMSB8fCAodmVyID09IDEgJiYgcmV2IDwgMykpCisJCQl5cmVzID0geHJlczsKKwkJZWxzZQorCQkJeXJlcyA9ICh4cmVzICogMTApLzE2OwogCQlicmVhazsKIAljYXNlIDE6CiAJCXlyZXMgPSAoeHJlcyAqIDMpLzQ7CkBAIC01MzMsMTIgKzUzOCwxMiBAQAogfQogCiBzdGF0aWMgaW50IGdldF9kc3RfdGltaW5nKHVuc2lnbmVkIGNoYXIgKmJsb2NrLAotCQkJICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlKQorCQkJICBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLCBpbnQgdmVyLCBpbnQgcmV2KQogewogCWludCBqLCBudW0gPSAwOwogCiAJZm9yIChqID0gMDsgaiA8IDY7IGorKywgYmxvY2sgKz0gU1REX1RJTUlOR19ERVNDUklQVElPTl9TSVpFKQotCQludW0gKz0gZ2V0X3N0ZF90aW1pbmcoYmxvY2ssICZtb2RlW251bV0pOworCQludW0gKz0gZ2V0X3N0ZF90aW1pbmcoYmxvY2ssICZtb2RlW251bV0sIHZlciwgcmV2KTsKIAogCXJldHVybiBudW07CiB9CkBAIC01OTksNiArNjA0LDEwIEBACiAJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSwgKm07CiAJdW5zaWduZWQgY2hhciAqYmxvY2s7CiAJaW50IG51bSA9IDAsIGksIGZpcnN0ID0gMTsKKwlpbnQgdmVyLCByZXY7CisKKwl2ZXIgPSBlZGlkW0VESURfU1RSVUNUX1ZFUlNJT05dOworCXJldiA9IGVkaWRbRURJRF9TVFJVQ1RfUkVWSVNJT05dOwogCiAJbW9kZSA9IGt6YWxsb2MoNTAgKiBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSksIEdGUF9LRVJORUwpOwogCWlmIChtb2RlID09IE5VTEwpCkBAIC02MzIsMTIgKzY0MSwxMiBAQAogCURQUklOVEsoIiAgIFN0YW5kYXJkIFRpbWluZ3NcbiIpOwogCWJsb2NrID0gZWRpZCArIFNURF9USU1JTkdfREVTQ1JJUFRJT05TX1NUQVJUOwogCWZvciAoaSA9IDA7IGkgPCBTVERfVElNSU5HOyBpKyssIGJsb2NrICs9IFNURF9USU1JTkdfREVTQ1JJUFRJT05fU0laRSkKLQkJbnVtICs9IGdldF9zdGRfdGltaW5nKGJsb2NrLCAmbW9kZVtudW1dKTsKKwkJbnVtICs9IGdldF9zdGRfdGltaW5nKGJsb2NrLCAmbW9kZVtudW1dLCB2ZXIsIHJldik7CiAKIAlibG9jayA9IGVkaWQgKyBERVRBSUxFRF9USU1JTkdfREVTQ1JJUFRJT05TX1NUQVJUOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGJsb2NrKz0gREVUQUlMRURfVElNSU5HX0RFU0NSSVBUSU9OX1NJWkUpIHsKIAkJaWYgKGJsb2NrWzBdID09IDB4MDAgJiYgYmxvY2tbMV0gPT0gMHgwMCAmJiBibG9ja1szXSA9PSAweGZhKQotCQkJbnVtICs9IGdldF9kc3RfdGltaW5nKGJsb2NrICsgNSwgJm1vZGVbbnVtXSk7CisJCQludW0gKz0gZ2V0X2RzdF90aW1pbmcoYmxvY2sgKyA1LCAmbW9kZVtudW1dLCB2ZXIsIHJldik7CiAJfQogCiAJLyogWWlrZXMsIEVESUQgZGF0YSBpcyB0b3RhbGx5IHVzZWxlc3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggMDQyNTFjZS4uNjdhZmE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTM5OSw5ICszOTksMTIgQEAKIAogCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmbGFzdCwgMCk7CiAKKwlpZiAoIWxvY2tfZmJfaW5mbyhmYl9pbmZvKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJY29uc29sZV9sb2NrKCk7CiAJZmJfc2V0X3N1c3BlbmQoZmJfaW5mbywgKGludClzdGF0ZSk7CiAJY29uc29sZV91bmxvY2soKTsKKwl1bmxvY2tfZmJfaW5mbyhmYl9pbmZvKTsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZnNsLWRpdS1mYi5jIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKaW5kZXggMGFjYzdkNi4uYTE2YmVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mc2wtZGl1LWZiLmMKQEAgLTMwLDM3ICszMCw0MCBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbC1kaXUtZmIuaD4KICNpbmNsdWRlICJlZGlkLmgiCiAKLS8qCi0gKiBUaGVzZSBwYXJhbWV0ZXJzIGdpdmUgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKiBmb3IgdmlkZW8gb3V0cHV0IDEwMjR4NzY4LAotICogRklYTUUgLSBjaGFuZ2UgdGltaW5nIHRvIHByb3BlciBhbW91bnRzCi0gKiBoc3luYyAzMS41a0h6LCB2c3luYyA2MEh6Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9fZGV2aW5pdGRhdGEgZnNsX2RpdV9kZWZhdWx0X21vZGUgPSB7Ci0JLnJlZnJlc2gJPSA2MCwKLQkueHJlcwkJPSAxMDI0LAotCS55cmVzCQk9IDc2OCwKLQkucGl4Y2xvY2sJPSAxNTM4NSwKLQkubGVmdF9tYXJnaW4JPSAxNjAsCi0JLnJpZ2h0X21hcmdpbgk9IDI0LAotCS51cHBlcl9tYXJnaW4JPSAyOSwKLQkubG93ZXJfbWFyZ2luCT0gMywKLQkuaHN5bmNfbGVuCT0gMTM2LAotCS52c3luY19sZW4JPSA2LAotCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorI2RlZmluZSBGU0xfQU9JX05VTQk2CS8qIDUgQU9JcyBhbmQgb25lIGR1bW15IEFPSSAqLworCQkJCS8qIDEgZm9yIHBsYW5lIDAsIDIgZm9yIHBsYW5lIDEmMiBlYWNoICovCisKKy8qIEhXIGN1cnNvciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1BWF9DVVJTCQkzMgorCisvKiBJTlRfU1RBVFVTL0lOVF9NQVNLIGZpZWxkIGRlc2NyaXB0aW9ucyAqLworI2RlZmluZSBJTlRfVlNZTkMJMHgwMQkvKiBWc3luYyBpbnRlcnJ1cHQgICovCisjZGVmaW5lIElOVF9WU1lOQ19XQgkweDAyCS8qIFZzeW5jIGludGVycnVwdCBmb3Igd3JpdGUgYmFjayBvcGVyYXRpb24gKi8KKyNkZWZpbmUgSU5UX1VORFJVTgkweDA0CS8qIFVuZGVyIHJ1biBleGNlcHRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lIElOVF9QQVJFUlIJMHgwOAkvKiBEaXNwbGF5IHBhcmFtZXRlcnMgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lIElOVF9MU19CRl9WUwkweDEwCS8qIExpbmVzIGJlZm9yZSB2c3luYy4gaW50ZXJydXB0ICovCisKK3N0cnVjdCBkaXVfYWRkciB7CisJdm9pZCAqdmFkZHI7CQkvKiBWaXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IHBhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzICovCisJX191MzIgb2Zmc2V0OwogfTsKIAorLyoKKyAqIExpc3Qgb2Ygc3VwcG9ydGVkIHZpZGVvIG1vZGVzCisgKgorICogVGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0IHZpZGVvIG1vZGUuICBUaGUgcmVtYWluIGVudHJpZXMgYXJlIGluCisgKiBvcmRlciBpZiBpbmNyZWFzaW5nIHJlc29sdXRpb24gYW5kIGZyZXF1ZW5jeS4gIFRoZSAzMjB4MjQwLTYwIG1vZGUgaXMKKyAqIHRoZSBpbml0aWFsIEFPSSBmb3IgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGxhbmVzLgorICovCiBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2RldmluaXRkYXRhIGZzbF9kaXVfbW9kZV9kYltdID0gewogCXsKLQkJLm5hbWUJCT0gIjEwMjR4NzY4LTYwIiwKIAkJLnJlZnJlc2gJPSA2MCwKIAkJLnhyZXMJCT0gMTAyNCwKIAkJLnlyZXMJCT0gNzY4LApAQCAtNzUsNyArNzgsMTMyIEBACiAJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICIxMDI0eDc2OC03MCIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDMyMCwKKwkJLnlyZXMJCT0gMjQwLAorCQkucGl4Y2xvY2sJPSA3OTQ0MCwKKwkJLmxlZnRfbWFyZ2luCT0gMTYsCisJCS5yaWdodF9tYXJnaW4JPSAxNiwKKwkJLnVwcGVyX21hcmdpbgk9IDE2LAorCQkubG93ZXJfbWFyZ2luCT0gNSwKKwkJLmhzeW5jX2xlbgk9IDQ4LAorCQkudnN5bmNfbGVuCT0gMSwKKwkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA2MCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDM5NzIyLAorCQkubGVmdF9tYXJnaW4gICAgPSA0OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gMTYsCisJCS51cHBlcl9tYXJnaW4gICA9IDMzLAorCQkubG93ZXJfbWFyZ2luICAgPSAxMCwKKwkJLmhzeW5jX2xlbiAgICAgID0gOTYsCisJCS52c3luY19sZW4gICAgICA9IDIsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA3MiwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDMyMDUyLAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjgsCisJCS5yaWdodF9tYXJnaW4gICA9IDI0LAorCQkudXBwZXJfbWFyZ2luICAgPSAyOCwKKwkJLmxvd2VyX21hcmdpbiAgID0gOSwKKwkJLmhzeW5jX2xlbiAgICAgID0gNDAsCisJCS52c3luY19sZW4gICAgICA9IDMsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA3NSwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDMxNzQ3LAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjAsCisJCS5yaWdodF9tYXJnaW4gICA9IDE2LAorCQkudXBwZXJfbWFyZ2luICAgPSAxNiwKKwkJLmxvd2VyX21hcmdpbiAgID0gMSwKKwkJLmhzeW5jX2xlbiAgICAgID0gNjQsCisJCS52c3luY19sZW4gICAgICA9IDMsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA5MCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDI1MDU3LAorCQkubGVmdF9tYXJnaW4gICAgPSAxMjAsCisJCS5yaWdodF9tYXJnaW4gICA9IDMyLAorCQkudXBwZXJfbWFyZ2luICAgPSAxNCwKKwkJLmxvd2VyX21hcmdpbiAgID0gMjUsCisJCS5oc3luY19sZW4gICAgICA9IDQwLAorCQkudnN5bmNfbGVuICAgICAgPSAxNCwKKwkJLnN5bmMgICAgICAgICAgID0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUgICAgICAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CisJCS5yZWZyZXNoICAgICAgICA9IDEwMCwKKwkJLnhyZXMgICAgICAgICAgID0gNjQwLAorCQkueXJlcyAgICAgICAgICAgPSA0ODAsCisJCS5waXhjbG9jayAgICAgICA9IDIyMjcyLAorCQkubGVmdF9tYXJnaW4gICAgPSA0OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gMzIsCisJCS51cHBlcl9tYXJnaW4gICA9IDE3LAorCQkubG93ZXJfbWFyZ2luICAgPSAyMiwKKwkJLmhzeW5jX2xlbiAgICAgID0gMTI4LAorCQkudnN5bmNfbGVuICAgICAgPSAxMiwKKwkJLnN5bmMgICAgICAgICAgID0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUgICAgICAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDgwMCwKKwkJLnlyZXMJCT0gNDgwLAorCQkucGl4Y2xvY2sJPSAzMzgwNSwKKwkJLmxlZnRfbWFyZ2luCT0gOTYsCisJCS5yaWdodF9tYXJnaW4JPSAyNCwKKwkJLnVwcGVyX21hcmdpbgk9IDEwLAorCQkubG93ZXJfbWFyZ2luCT0gMywKKwkJLmhzeW5jX2xlbgk9IDcyLAorCQkudnN5bmNfbGVuCT0gNywKKwkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaCAgICAgICAgPSA2MCwKKwkJLnhyZXMgICAgICAgICAgID0gODAwLAorCQkueXJlcyAgICAgICAgICAgPSA2MDAsCisJCS5waXhjbG9jayAgICAgICA9IDI1MDAwLAorCQkubGVmdF9tYXJnaW4gICAgPSA4OCwKKwkJLnJpZ2h0X21hcmdpbiAgID0gNDAsCisJCS51cHBlcl9tYXJnaW4gICA9IDIzLAorCQkubG93ZXJfbWFyZ2luICAgPSAxLAorCQkuaHN5bmNfbGVuICAgICAgPSAxMjgsCisJCS52c3luY19sZW4gICAgICA9IDQsCisJCS5zeW5jICAgICAgICAgICA9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlICAgICAgICAgID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCX0sCisJeworCQkucmVmcmVzaAk9IDYwLAorCQkueHJlcwkJPSA4NTQsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMzE1MTgsCisJCS5sZWZ0X21hcmdpbgk9IDEwNCwKKwkJLnJpZ2h0X21hcmdpbgk9IDE2LAorCQkudXBwZXJfbWFyZ2luCT0gMTMsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gODgsCisJCS52c3luY19sZW4JPSAzLAorCQkuc3luYwkJPSBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CiAJCS5yZWZyZXNoCT0gNzAsCiAJCS54cmVzCQk9IDEwMjQsCiAJCS55cmVzCQk9IDc2OCwKQEAgLTkwLDcgKzIxOCw2IEBACiAJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICIxMDI0eDc2OC03NSIsCiAJCS5yZWZyZXNoCT0gNzUsCiAJCS54cmVzCQk9IDEwMjQsCiAJCS55cmVzCQk9IDc2OCwKQEAgLTEwNSw3ICsyMzIsMzQgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC02MCIsCisJCS5yZWZyZXNoCT0gNjAsCisJCS54cmVzCQk9IDEyODAsCisJCS55cmVzCQk9IDQ4MCwKKwkJLnBpeGNsb2NrCT0gMTg5MzksCisJCS5sZWZ0X21hcmdpbgk9IDM1MywKKwkJLnJpZ2h0X21hcmdpbgk9IDQ3LAorCQkudXBwZXJfbWFyZ2luCT0gMzksCisJCS5sb3dlcl9tYXJnaW4JPSA0LAorCQkuaHN5bmNfbGVuCT0gOCwKKwkJLnZzeW5jX2xlbgk9IDIsCisJCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwl9LAorCXsKKwkJLnJlZnJlc2gJPSA2MCwKKwkJLnhyZXMJCT0gMTI4MCwKKwkJLnlyZXMJCT0gNzIwLAorCQkucGl4Y2xvY2sJPSAxMzQyNiwKKwkJLmxlZnRfbWFyZ2luCT0gMTkyLAorCQkucmlnaHRfbWFyZ2luCT0gNjQsCisJCS51cHBlcl9tYXJnaW4JPSAyMiwKKwkJLmxvd2VyX21hcmdpbgk9IDEsCisJCS5oc3luY19sZW4JPSAxMzYsCisJCS52c3luY19sZW4JPSAzLAorCQkuc3luYwkJPSBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisJfSwKKwl7CiAJCS5yZWZyZXNoCT0gNjAsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xMjAsNyArMjc0LDYgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC03MCIsCiAJCS5yZWZyZXNoCT0gNzAsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xMzUsNyArMjg4LDYgQEAKIAkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIAl9LAogCXsKLQkJLm5hbWUJCT0gIjEyODB4MTAyNC03NSIsCiAJCS5yZWZyZXNoCT0gNzUsCiAJCS54cmVzCQk9IDEyODAsCiAJCS55cmVzCQk9IDEwMjQsCkBAIC0xNTAsNDAgKzMwMiwyNSBAQAogCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAogCX0sCiAJewotCQkubmFtZQkJPSAiMzIweDI0MCIsCQkvKiBmb3IgQU9JIG9ubHkgKi8KIAkJLnJlZnJlc2gJPSA2MCwKLQkJLnhyZXMJCT0gMzIwLAotCQkueXJlcwkJPSAyNDAsCi0JCS5waXhjbG9jawk9IDE1Mzg1LAotCQkubGVmdF9tYXJnaW4JPSAwLAotCQkucmlnaHRfbWFyZ2luCT0gMCwKLQkJLnVwcGVyX21hcmdpbgk9IDAsCi0JCS5sb3dlcl9tYXJnaW4JPSAwLAotCQkuaHN5bmNfbGVuCT0gMCwKLQkJLnZzeW5jX2xlbgk9IDAsCi0JCS5zeW5jCQk9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKLQkJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLQl9LAotCXsKLQkJLm5hbWUJCT0gIjEyODB4NDgwLTYwIiwKLQkJLnJlZnJlc2gJPSA2MCwKLQkJLnhyZXMJCT0gMTI4MCwKLQkJLnlyZXMJCT0gNDgwLAotCQkucGl4Y2xvY2sJPSAxODkzOSwKLQkJLmxlZnRfbWFyZ2luCT0gMzUzLAotCQkucmlnaHRfbWFyZ2luCT0gNDcsCi0JCS51cHBlcl9tYXJnaW4JPSAzOSwKLQkJLmxvd2VyX21hcmdpbgk9IDQsCi0JCS5oc3luY19sZW4JPSA4LAotCQkudnN5bmNfbGVuCT0gMiwKKwkJLnhyZXMJCT0gMTkyMCwKKwkJLnlyZXMJCT0gMTA4MCwKKwkJLnBpeGNsb2NrCT0gNTc4NywKKwkJLmxlZnRfbWFyZ2luCT0gMzI4LAorCQkucmlnaHRfbWFyZ2luCT0gMTIwLAorCQkudXBwZXJfbWFyZ2luCT0gMzQsCisJCS5sb3dlcl9tYXJnaW4JPSAxLAorCQkuaHN5bmNfbGVuCT0gMjA4LAorCQkudnN5bmNfbGVuCT0gMywKIAkJLnN5bmMJCT0gRkJfU1lOQ19DT01QX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAogCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRAogCX0sCiB9OwogCi1zdGF0aWMgY2hhciAqZmJfbW9kZSA9ICIxMDI0eDc2OC0zMkA2MCI7CitzdGF0aWMgY2hhciAqZmJfbW9kZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfYnBwID0gMzI7Ci1zdGF0aWMgaW50IG1vbml0b3JfcG9ydDsKK3N0YXRpYyBlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IG1vbml0b3JfcG9ydDsKK3N0YXRpYyBjaGFyICptb25pdG9yX3N0cmluZzsKIAogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIHN0YXRpYyB1OCAqY29oZXJlbmNlX2RhdGE7CkBAIC0yMDEsMTUgKzMzOCwyNyBAQAogCXZvaWQgKmR1bW15X2FvaV92aXJ0OwogCXVuc2lnbmVkIGludCBpcnE7CiAJaW50IGZiX2VuYWJsZWQ7Ci0JaW50IG1vbml0b3JfcG9ydDsKKwllbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IG1vbml0b3JfcG9ydDsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmRpdV9yZWc7CisJc3BpbmxvY2tfdCByZWdfbG9jazsKKwlzdHJ1Y3QgZGl1X2FkZHIgYWQ7CisJc3RydWN0IGRpdV9hZGRyIGdhbW1hOworCXN0cnVjdCBkaXVfYWRkciBwYWxsZXRlOworCXN0cnVjdCBkaXVfYWRkciBjdXJzb3I7Cit9OworCitlbnVtIG1mYl9pbmRleCB7CisJUExBTkUwID0gMCwJLyogUGxhbmUgMCwgb25seSBvbmUgQU9JIHRoYXQgZmlsbHMgdGhlIHNjcmVlbiAqLworCVBMQU5FMV9BT0kwLAkvKiBQbGFuZSAxLCBmaXJzdCBBT0kgKi8KKwlQTEFORTFfQU9JMSwJLyogUGxhbmUgMSwgc2Vjb25kIEFPSSAqLworCVBMQU5FMl9BT0kwLAkvKiBQbGFuZSAyLCBmaXJzdCBBT0kgKi8KKwlQTEFORTJfQU9JMSwJLyogUGxhbmUgMiwgc2Vjb25kIEFPSSAqLwogfTsKIAogc3RydWN0IG1mYl9pbmZvIHsKLQlpbnQgaW5kZXg7Ci0JaW50IHR5cGU7CisJZW51bSBtZmJfaW5kZXggaW5kZXg7CiAJY2hhciAqaWQ7CiAJaW50IHJlZ2lzdGVyZWQ7Ci0JaW50IGJsYW5rOwogCXVuc2lnbmVkIGxvbmcgcHNldWRvX3BhbGV0dGVbMTZdOwogCXN0cnVjdCBkaXVfYWQgKmFkOwogCWludCBjdXJzb3JfcmVzZXQ7CkBAIC0yMjMsNjMgKzM3Miw4MiBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgbWZiX2luZm8gbWZiX3RlbXBsYXRlW10gPSB7Ci0JewkJLyogQU9JIDAgZm9yIHBsYW5lIDAgKi8KLQkuaW5kZXggPSAwLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDAiLAotCS5yZWdpc3RlcmVkID0gMCwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTAsCisJCS5pZCA9ICJQYW5lbDAiLAorCQkucmVnaXN0ZXJlZCA9IDAsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gMCwKKwkJLnlfYW9pX2QgPSAwLAogCX0sCi0JewkJLyogQU9JIDAgZm9yIHBsYW5lIDEgKi8KLQkuaW5kZXggPSAxLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDEgQU9JMCIsCi0JLnJlZ2lzdGVyZWQgPSAwLAotCS5nX2FscGhhID0gMHhmZiwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTFfQU9JMCwKKwkJLmlkID0gIlBhbmVsMSBBT0kwIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gMCwKKwkJLnlfYW9pX2QgPSAwLAogCX0sCi0JewkJLyogQU9JIDEgZm9yIHBsYW5lIDEgKi8KLQkuaW5kZXggPSAyLAotCS50eXBlID0gTUZCX1RZUEVfT1VUUFVULAotCS5pZCA9ICJQYW5lbDEgQU9JMSIsCi0JLnJlZ2lzdGVyZWQgPSAwLAotCS5nX2FscGhhID0gMHhmZiwKLQkuY291bnQgPSAwLAotCS54X2FvaV9kID0gMCwKLQkueV9hb2lfZCA9IDQ4MCwKKwl7CisJCS5pbmRleCA9IFBMQU5FMV9BT0kxLAorCQkuaWQgPSAiUGFuZWwxIEFPSTEiLAorCQkucmVnaXN0ZXJlZCA9IDAsCisJCS5nX2FscGhhID0gMHhmZiwKKwkJLmNvdW50ID0gMCwKKwkJLnhfYW9pX2QgPSAwLAorCQkueV9hb2lfZCA9IDQ4MCwKIAl9LAotCXsJCS8qIEFPSSAwIGZvciBwbGFuZSAyICovCi0JLmluZGV4ID0gMywKLQkudHlwZSA9IE1GQl9UWVBFX09VVFBVVCwKLQkuaWQgPSAiUGFuZWwyIEFPSTAiLAotCS5yZWdpc3RlcmVkID0gMCwKLQkuZ19hbHBoYSA9IDB4ZmYsCi0JLmNvdW50ID0gMCwKLQkueF9hb2lfZCA9IDY0MCwKLQkueV9hb2lfZCA9IDAsCisJeworCQkuaW5kZXggPSBQTEFORTJfQU9JMCwKKwkJLmlkID0gIlBhbmVsMiBBT0kwIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gNjQwLAorCQkueV9hb2lfZCA9IDAsCiAJfSwKLQl7CQkvKiBBT0kgMSBmb3IgcGxhbmUgMiAqLwotCS5pbmRleCA9IDQsCi0JLnR5cGUgPSBNRkJfVFlQRV9PVVRQVVQsCi0JLmlkID0gIlBhbmVsMiBBT0kxIiwKLQkucmVnaXN0ZXJlZCA9IDAsCi0JLmdfYWxwaGEgPSAweGZmLAotCS5jb3VudCA9IDAsCi0JLnhfYW9pX2QgPSA2NDAsCi0JLnlfYW9pX2QgPSA0ODAsCisJeworCQkuaW5kZXggPSBQTEFORTJfQU9JMSwKKwkJLmlkID0gIlBhbmVsMiBBT0kxIiwKKwkJLnJlZ2lzdGVyZWQgPSAwLAorCQkuZ19hbHBoYSA9IDB4ZmYsCisJCS5jb3VudCA9IDAsCisJCS54X2FvaV9kID0gNjQwLAorCQkueV9hb2lfZCA9IDQ4MCwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBkaXVfaHcgZHIgPSB7Ci0JLm1vZGUgPSBNRkJfTU9ERTEsCi0JLnJlZ19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoZGl1X2h3LnJlZ19sb2NrKSwKLX07CisvKioKKyAqIGZzbF9kaXVfbmFtZV90b19wb3J0IC0gY29udmVydCBhIHBvcnQgbmFtZSB0byBhIG1vbml0b3IgcG9ydCBlbnVtCisgKgorICogVGFrZXMgdGhlIG5hbWUgb2YgYSBtb25pdG9yIHBvcnQgKCJkdmkiLCAibHZkcyIsIG9yICJkbHZkcyIpIGFuZCByZXR1cm5zCisgKiB0aGUgZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgc3RyaW5nLgorICoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMsIGEgbnVtYmVyICgiMCIsICIxIiwgb3IgIjIiKSBpcyBhbHNvCisgKiBzdXBwb3J0ZWQuCisgKgorICogSWYgdGhlIHN0cmluZyBpcyB1bmtub3duLCBEVkkgaXMgYXNzdW1lZC4KKyAqCisgKiBJZiB0aGUgcGFydGljdWxhciBwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCBhbm90aGVyIHBvcnQKKyAqIChwbGF0Zm9ybS1zcGVjaWZpYykgaXMgY2hvc2VuIGluc3RlYWQuCisgKi8KK3N0YXRpYyBlbnVtIGZzbF9kaXVfbW9uaXRvcl9wb3J0IGZzbF9kaXVfbmFtZV90b19wb3J0KGNvbnN0IGNoYXIgKnMpCit7CisJZW51bSBmc2xfZGl1X21vbml0b3JfcG9ydCBwb3J0ID0gRlNMX0RJVV9QT1JUX0RWSTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAotc3RhdGljIHN0cnVjdCBkaXVfcG9vbCBwb29sOworCWlmIChzKSB7CisJCWlmICghc3RyaWN0X3N0cnRvdWwocywgMTAsICZ2YWwpICYmICh2YWwgPD0gMikpCisJCQlwb3J0ID0gKGVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQpIHZhbDsKKwkJZWxzZSBpZiAoc3RybmNtcChzLCAibHZkcyIsIDQpID09IDApCisJCQlwb3J0ID0gRlNMX0RJVV9QT1JUX0xWRFM7CisJCWVsc2UgaWYgKHN0cm5jbXAocywgImRsdmRzIiwgNSkgPT0gMCkKKwkJCXBvcnQgPSBGU0xfRElVX1BPUlRfRExWRFM7CisJfQorCisJcmV0dXJuIGRpdV9vcHMudmFsaWRfbW9uaXRvcl9wb3J0KHBvcnQpOworfQogCiAvKioKICAqIGZzbF9kaXVfYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBESVUKQEAgLTI5MiwxNCArNDYwLDkgQEAKIHsKIAl2b2lkICp2aXJ0OwogCi0JcHJfZGVidWcoInNpemU9JXp1XG4iLCBzaXplKTsKLQogCXZpcnQgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfRE1BIHwgX19HRlBfWkVSTyk7Ci0JaWYgKHZpcnQpIHsKKwlpZiAodmlydCkKIAkJKnBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7Ci0JCXByX2RlYnVnKCJ2aXJ0PSVwIHBoeXM9JWxseFxuIiwgdmlydCwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKnBoeXMpOwotCX0KIAogCXJldHVybiB2aXJ0OwogfQpAQCAtMzEzLDggKzQ3Niw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZzbF9kaXVfZnJlZSh2b2lkICp2aXJ0LCBzaXplX3Qgc2l6ZSkKIHsKLQlwcl9kZWJ1ZygidmlydD0lcCBzaXplPSV6dVxuIiwgdmlydCwgc2l6ZSk7Ci0KIAlpZiAodmlydCAmJiBzaXplKQogCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpOwogfQpAQCAtMzMwLDgyICs0OTEsNzIgQEAKIAl9IHdoaWxlIChpbl9iZTMyKHJlZykgIT0gdmFsKTsKIH0KIAotc3RhdGljIGludCBmc2xfZGl1X2VuYWJsZV9wYW5lbChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIGZzbF9kaXVfZW5hYmxlX3BhbmVsKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBtZmJfaW5mbyAqcG1mYmksICpjbWZiaSwgKm1mYmkgPSBpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpdSAqaHcgPSBkci5kaXVfcmVnOwogCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OwotCWludCByZXMgPSAwOwotCi0JcHJfZGVidWcoImVuYWJsZV9wYW5lbCBpbmRleCAlZFxuIiwgbWZiaS0+aW5kZXgpOwotCWlmIChtZmJpLT50eXBlICE9IE1GQl9UWVBFX09GRikgewotCQlzd2l0Y2ggKG1mYmktPmluZGV4KSB7Ci0JCWNhc2UgMDoJCQkJLyogcGxhbmUgMCAqLwotCQkJaWYgKGh3LT5kZXNjWzBdICE9IGFkLT5wYWRkcikKLQkJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzBdLCBhZC0+cGFkZHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToJCQkJLyogcGxhbmUgMSBBT0kgMCAqLwotCQkJY21mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1syXS0+cGFyOwotCQkJaWYgKGh3LT5kZXNjWzFdICE9IGFkLT5wYWRkcikgewkvKiBBT0kwIGNsb3NlZCAqLwotCQkJCWlmIChjbWZiaS0+Y291bnQgPiAwKQkvKiBBT0kxIG9wZW4gKi8KLQkJCQkJYWQtPm5leHRfYWQgPQotCQkJCQkJY3B1X3RvX2xlMzIoY21mYmktPmFkLT5wYWRkcik7Ci0JCQkJZWxzZQotCQkJCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6CQkJCS8qIHBsYW5lIDIgQU9JIDAgKi8KLQkJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKLQkJCWlmIChody0+ZGVzY1syXSAhPSBhZC0+cGFkZHIpIHsJLyogQU9JMCBjbG9zZWQgKi8KLQkJCQlpZiAoY21mYmktPmNvdW50ID4gMCkJLyogQU9JMSBvcGVuICovCi0JCQkJCWFkLT5uZXh0X2FkID0KLQkJCQkJCWNwdV90b19sZTMyKGNtZmJpLT5hZC0+cGFkZHIpOwotCQkJCWVsc2UKLQkJCQkJYWQtPm5leHRfYWQgPSAwOwotCQkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIGFkLT5wYWRkcik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgkJCQkvKiBwbGFuZSAxIEFPSSAxICovCi0JCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzFdLT5wYXI7Ci0JCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQlpZiAoaHctPmRlc2NbMV0gPT0gbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpCi0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKLQkJCWVsc2UJCQkJCS8qIEFPSTAgb3BlbiAqLwotCQkJCXBtZmJpLT5hZC0+bmV4dF9hZCA9IGNwdV90b19sZTMyKGFkLT5wYWRkcik7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgkJCQkvKiBwbGFuZSAyIEFPSSAxICovCi0JCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzNdLT5wYXI7Ci0JCQlhZC0+bmV4dF9hZCA9IDA7Ci0JCQlpZiAoaHctPmRlc2NbMl0gPT0gbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpCi0JCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKLQkJCWVsc2UJCQkJLyogQU9JMCB3YXMgb3BlbiAqLwotCQkJCXBtZmJpLT5hZC0+bmV4dF9hZCA9IGNwdV90b19sZTMyKGFkLT5wYWRkcik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZQotCQlyZXMgPSAtRUlOVkFMOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2RpdV9kaXNhYmxlX3BhbmVsKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0cnVjdCBtZmJfaW5mbyAqcG1mYmksICpjbWZiaSwgKm1mYmkgPSBpbmZvLT5wYXI7Ci0Jc3RydWN0IGRpdSAqaHcgPSBkci5kaXVfcmVnOwotCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7Ci0Jc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OwotCWludCByZXMgPSAwOworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlzd2l0Y2ggKG1mYmktPmluZGV4KSB7Ci0JY2FzZSAwOgkJCQkJLyogcGxhbmUgMCAqLworCWNhc2UgUExBTkUwOgorCQlpZiAoaHctPmRlc2NbMF0gIT0gYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1swXSwgYWQtPnBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBQTEFORTFfQU9JMDoKKwkJY21mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1syXS0+cGFyOworCQlpZiAoaHctPmRlc2NbMV0gIT0gYWQtPnBhZGRyKSB7CS8qIEFPSTAgY2xvc2VkICovCisJCQlpZiAoY21mYmktPmNvdW50ID4gMCkJLyogQU9JMSBvcGVuICovCisJCQkJYWQtPm5leHRfYWQgPQorCQkJCQljcHVfdG9fbGUzMihjbWZiaS0+YWQtPnBhZGRyKTsKKwkJCWVsc2UKKwkJCQlhZC0+bmV4dF9hZCA9IDA7CisJCQl3cl9yZWdfd2EoJmh3LT5kZXNjWzFdLCBhZC0+cGFkZHIpOworCQl9CisJCWJyZWFrOworCWNhc2UgUExBTkUyX0FPSTA6CisJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKKwkJaWYgKGh3LT5kZXNjWzJdICE9IGFkLT5wYWRkcikgewkvKiBBT0kwIGNsb3NlZCAqLworCQkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgb3BlbiAqLworCQkJCWFkLT5uZXh0X2FkID0KKwkJCQkJY3B1X3RvX2xlMzIoY21mYmktPmFkLT5wYWRkcik7CisJCQllbHNlCisJCQkJYWQtPm5leHRfYWQgPSAwOworCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBMQU5FMV9BT0kxOgorCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzFdLT5wYXI7CisJCWFkLT5uZXh0X2FkID0gMDsKKwkJaWYgKGh3LT5kZXNjWzFdID09IG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgYWQtPnBhZGRyKTsKKwkJZWxzZQkJCQkJLyogQU9JMCBvcGVuICovCisJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSBjcHVfdG9fbGUzMihhZC0+cGFkZHIpOworCQlicmVhazsKKwljYXNlIFBMQU5FMl9BT0kxOgorCQlwbWZiaSA9IG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzNdLT5wYXI7CisJCWFkLT5uZXh0X2FkID0gMDsKKwkJaWYgKGh3LT5kZXNjWzJdID09IG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKQorCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgYWQtPnBhZGRyKTsKKwkJZWxzZQkJCQkvKiBBT0kwIHdhcyBvcGVuICovCisJCQlwbWZiaS0+YWQtPm5leHRfYWQgPSBjcHVfdG9fbGUzMihhZC0+cGFkZHIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9kaXVfZGlzYWJsZV9wYW5lbChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbWZiX2luZm8gKnBtZmJpLCAqY21mYmksICptZmJpID0gaW5mby0+cGFyOworCXN0cnVjdCBkaXVfYWQgKmFkID0gbWZiaS0+YWQ7CisJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CisKKwlzd2l0Y2ggKG1mYmktPmluZGV4KSB7CisJY2FzZSBQTEFORTA6CiAJCWlmIChody0+ZGVzY1swXSAhPSBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcikKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMF0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJYnJlYWs7Ci0JY2FzZSAxOgkJCQkJLyogcGxhbmUgMSBBT0kgMCAqLworCWNhc2UgUExBTkUxX0FPSTA6CiAJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMl0tPnBhcjsKIAkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgaXMgb3BlbiAqLwogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgY21mYmktPmFkLT5wYWRkcik7CkBAIC00MTQsNyArNTY1LDcgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMV0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkJLyogY2xvc2UgQU9JIDAgKi8KIAkJYnJlYWs7Ci0JY2FzZSAzOgkJCQkJLyogcGxhbmUgMiBBT0kgMCAqLworCWNhc2UgUExBTkUyX0FPSTA6CiAJCWNtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bNF0tPnBhcjsKIAkJaWYgKGNtZmJpLT5jb3VudCA+IDApCS8qIEFPSTEgaXMgb3BlbiAqLwogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1syXSwgY21mYmktPmFkLT5wYWRkcik7CkBAIC00MjMsNyArNTc0LDcgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkJLyogY2xvc2UgQU9JIDAgKi8KIAkJYnJlYWs7Ci0JY2FzZSAyOgkJCQkJLyogcGxhbmUgMSBBT0kgMSAqLworCWNhc2UgUExBTkUxX0FPSTE6CiAJCXBtZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMV0tPnBhcjsKIAkJaWYgKGh3LT5kZXNjWzFdICE9IGFkLT5wYWRkcikgewogCQkJCS8qIEFPSTEgaXMgbm90IHRoZSBmaXJzdCBpbiB0aGUgY2hhaW4gKi8KQEAgLTQzNCw3ICs1ODUsNyBAQAogCQkJd3JfcmVnX3dhKCZody0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOwogCQkJCQkvKiBjbG9zZSBBT0kgMSAqLwogCQlicmVhazsKLQljYXNlIDQ6CQkJCQkvKiBwbGFuZSAyIEFPSSAxICovCisJY2FzZSBQTEFORTJfQU9JMToKIAkJcG1mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1szXS0+cGFyOwogCQlpZiAoaHctPmRlc2NbMl0gIT0gYWQtPnBhZGRyKSB7CiAJCQkJLyogQU9JMSBpcyBub3QgdGhlIGZpcnN0IGluIHRoZSBjaGFpbiAqLwpAQCAtNDQ1LDMxICs1OTYsMjYgQEAKIAkJCXdyX3JlZ193YSgmaHctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAkJCQkvKiBjbG9zZSBBT0kgMSAqLwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXMgPSAtRUlOVkFMOwotCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfbGNkYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOwogCiAJaWYgKCFtYWNoaW5lX2RhdGEtPmZiX2VuYWJsZWQpIHsKLQkJb3V0X2JlMzIoJmh3LT5kaXVfbW9kZSwgZHIubW9kZSk7CisJCW91dF9iZTMyKCZody0+ZGl1X21vZGUsIE1GQl9NT0RFMSk7CiAJCW1hY2hpbmVfZGF0YS0+ZmJfZW5hYmxlZCsrOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9sY2RjKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBkaXUgKmh3ID0gZHIuZGl1X3JlZzsKIAlzdHJ1Y3QgbWZiX2luZm8gKm1mYmkgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhID0gbWZiaS0+cGFyZW50OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlpZiAobWFjaGluZV9kYXRhLT5mYl9lbmFibGVkKSB7CiAJCW91dF9iZTMyKCZody0+ZGl1X21vZGUsIDApOwpAQCAtNDgyLDcgKzYyOCw4IEBACiB7CiAJc3RydWN0IG1mYl9pbmZvICpsb3dlcl9hb2lfbWZiaSwgKnVwcGVyX2FvaV9tZmJpLCAqbWZiaSA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGEgPSBtZmJpLT5wYXJlbnQ7Ci0JaW50IGF2YWlsYWJsZV9oZWlnaHQsIHVwcGVyX2FvaV9ib3R0b20sIGluZGV4ID0gbWZiaS0+aW5kZXg7CisJaW50IGF2YWlsYWJsZV9oZWlnaHQsIHVwcGVyX2FvaV9ib3R0b207CisJZW51bSBtZmJfaW5kZXggaW5kZXggPSBtZmJpLT5pbmRleDsKIAlpbnQgbG93ZXJfYW9pX2lzX29wZW4sIHVwcGVyX2FvaV9pc19vcGVuOwogCV9fdTMyIGJhc2VfcGxhbmVfd2lkdGgsIGJhc2VfcGxhbmVfaGVpZ2h0LCB1cHBlcl9hb2lfaGVpZ2h0OwogCkBAIC00OTQsMTQgKzY0MSwxNCBAQAogCWlmIChtZmJpLT55X2FvaV9kIDwgMCkKIAkJbWZiaS0+eV9hb2lfZCA9IDA7CiAJc3dpdGNoIChpbmRleCkgewotCWNhc2UgMDoKKwljYXNlIFBMQU5FMDoKIAkJaWYgKG1mYmktPnhfYW9pX2QgIT0gMCkKIAkJCW1mYmktPnhfYW9pX2QgPSAwOwogCQlpZiAobWZiaS0+eV9hb2lfZCAhPSAwKQogCQkJbWZiaS0+eV9hb2lfZCA9IDA7CiAJCWJyZWFrOwotCWNhc2UgMToJCQkvKiBBT0kgMCAqLwotCWNhc2UgMzoKKwljYXNlIFBMQU5FMV9BT0kwOgorCWNhc2UgUExBTkUyX0FPSTA6CiAJCWxvd2VyX2FvaV9tZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgrMV0tPnBhcjsKIAkJbG93ZXJfYW9pX2lzX29wZW4gPSBsb3dlcl9hb2lfbWZiaS0+Y291bnQgPiAwID8gMSA6IDA7CiAJCWlmICh2YXItPnhyZXMgPiBiYXNlX3BsYW5lX3dpZHRoKQpAQCAtNTE4LDggKzY2NSw4IEBACiAJCWlmICgobWZiaS0+eV9hb2lfZCArIHZhci0+eXJlcykgPiBhdmFpbGFibGVfaGVpZ2h0KQogCQkJbWZiaS0+eV9hb2lfZCA9IGF2YWlsYWJsZV9oZWlnaHQgLSB2YXItPnlyZXM7CiAJCWJyZWFrOwotCWNhc2UgMjoJCQkvKiBBT0kgMSAqLwotCWNhc2UgNDoKKwljYXNlIFBMQU5FMV9BT0kxOgorCWNhc2UgUExBTkUyX0FPSTE6CiAJCXVwcGVyX2FvaV9tZmJpID0gbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgtMV0tPnBhcjsKIAkJdXBwZXJfYW9pX2hlaWdodCA9CiAJCQkJbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baW5kZXgtMV0tPnZhci55cmVzOwpAQCAtNTU1LDkgKzcwMiw2IEBACiBzdGF0aWMgaW50IGZzbF9kaXVfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXByX2RlYnVnKCJjaGVja192YXIgeHJlczogJWRcbiIsIHZhci0+eHJlcyk7Ci0JcHJfZGVidWcoImNoZWNrX3ZhciB5cmVzOiAlZFxuIiwgdmFyLT55cmVzKTsKLQogCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKIAkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CiAJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQpAQCAtNjUyLDcgKzc5Niw3IEBACiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwogCXN0cnVjdCBtZmJfaW5mbyAqbWZiaSA9IGluZm8tPnBhcjsKIAotCXN0cm5jcHkoZml4LT5pZCwgbWZiaS0+aWQsIHN0cmxlbihtZmJpLT5pZCkpOworCXN0cm5jcHkoZml4LT5pZCwgbWZiaS0+aWQsIHNpemVvZihmaXgtPmlkKSk7CiAJZml4LT5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CiAJZml4LT50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwogCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9OT05FOwpAQCAtNjY2LDQ1ICs4MTAsMzcgQEAKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKLQlzdHJ1Y3QgZGl1ICpodzsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3OwogCWludCBpLCBqOwogCWNoYXIgX19pb21lbSAqY3Vyc29yX2Jhc2UsICpnYW1tYV90YWJsZV9iYXNlOwogCiAJdTMyIHRlbXA7CiAKLQlodyA9IGRyLmRpdV9yZWc7Ci0KLQlpZiAobWZiaS0+dHlwZSA9PSBNRkJfVFlQRV9PRkYpIHsKLQkJZnNsX2RpdV9kaXNhYmxlX3BhbmVsKGluZm8pOwotCQlyZXR1cm47Ci0JfQorCWh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOwogCiAJZGl1X29wcy5zZXRfbW9uaXRvcl9wb3J0KG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KTsKLQlnYW1tYV90YWJsZV9iYXNlID0gcG9vbC5nYW1tYS52YWRkcjsKLQljdXJzb3JfYmFzZSA9IHBvb2wuY3Vyc29yLnZhZGRyOworCWdhbW1hX3RhYmxlX2Jhc2UgPSBtYWNoaW5lX2RhdGEtPmdhbW1hLnZhZGRyOworCWN1cnNvcl9iYXNlID0gbWFjaGluZV9kYXRhLT5jdXJzb3IudmFkZHI7CiAJLyogUHJlcCBmb3IgRElVIGluaXQgIC0gZ2FtbWEgdGFibGUsIGN1cnNvciB0YWJsZSAqLwogCiAJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspCi0JICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykKLQkgICAgICAqZ2FtbWFfdGFibGVfYmFzZSsrID0gajsKKwkJZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykKKwkJCSpnYW1tYV90YWJsZV9iYXNlKysgPSBqOwogCi0JZGl1X29wcy5zZXRfZ2FtbWFfdGFibGUobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsIHBvb2wuZ2FtbWEudmFkZHIpOworCWRpdV9vcHMuc2V0X2dhbW1hX3RhYmxlKG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0LAorCQkJCW1hY2hpbmVfZGF0YS0+Z2FtbWEudmFkZHIpOwogCi0JcHJfZGVidWcoInVwZGF0ZS1sY2RjOiBIVyAtICVwXG4gRGlzYWJsaW5nIERJVVxuIiwgaHcpOwogCWRpc2FibGVfbGNkYyhpbmZvKTsKIAogCS8qIFByb2dyYW0gRElVIHJlZ2lzdGVycyAqLwogCi0Jb3V0X2JlMzIoJmh3LT5nYW1tYSwgcG9vbC5nYW1tYS5wYWRkcik7Ci0Jb3V0X2JlMzIoJmh3LT5jdXJzb3IsIHBvb2wuY3Vyc29yLnBhZGRyKTsKKwlvdXRfYmUzMigmaHctPmdhbW1hLCBtYWNoaW5lX2RhdGEtPmdhbW1hLnBhZGRyKTsKKwlvdXRfYmUzMigmaHctPmN1cnNvciwgbWFjaGluZV9kYXRhLT5jdXJzb3IucGFkZHIpOwogCiAJb3V0X2JlMzIoJmh3LT5iZ25kLCAweDAwN0Y3RjdGKTsgCS8qIEJHTkQgKi8KIAlvdXRfYmUzMigmaHctPmJnbmRfd2IsIDApOyAJCS8qIEJHTkRfV0IgKi8KIAlvdXRfYmUzMigmaHctPmRpc3Bfc2l6ZSwgKHZhci0+eXJlcyA8PCAxNiB8IHZhci0+eHJlcykpOwogCQkJCQkJLyogRElTUCBTSVpFICovCi0JcHJfZGVidWcoIkRJVSB4cmVzOiAlZFxuIiwgdmFyLT54cmVzKTsKLQlwcl9kZWJ1ZygiRElVIHlyZXM6ICVkXG4iLCB2YXItPnlyZXMpOwotCiAJb3V0X2JlMzIoJmh3LT53Yl9zaXplLCAwKTsgLyogV0IgU0laRSAqLwogCW91dF9iZTMyKCZody0+d2JfbWVtX2FkZHIsIDApOyAvKiBXQiBNRU0gQUREUiAqLwogCkBAIC03MjEsMTUgKzg1Nyw2IEBACiAKIAlvdXRfYmUzMigmaHctPnZzeW5fcGFyYSwgdGVtcCk7CiAKLQlwcl9kZWJ1ZygiRElVIHJpZ2h0X21hcmdpbiAtICVkXG4iLCB2YXItPnJpZ2h0X21hcmdpbik7Ci0JcHJfZGVidWcoIkRJVSBsZWZ0X21hcmdpbiAtICVkXG4iLCB2YXItPmxlZnRfbWFyZ2luKTsKLQlwcl9kZWJ1ZygiRElVIGhzeW5jX2xlbiAtICVkXG4iLCB2YXItPmhzeW5jX2xlbik7Ci0JcHJfZGVidWcoIkRJVSB1cHBlcl9tYXJnaW4gLSAlZFxuIiwgdmFyLT51cHBlcl9tYXJnaW4pOwotCXByX2RlYnVnKCJESVUgbG93ZXJfbWFyZ2luIC0gJWRcbiIsIHZhci0+bG93ZXJfbWFyZ2luKTsKLQlwcl9kZWJ1ZygiRElVIHZzeW5jX2xlbiAtICVkXG4iLCB2YXItPnZzeW5jX2xlbik7Ci0JcHJfZGVidWcoIkRJVSBIU1lOQyAtIDB4JTA4eFxuIiwgaHctPmhzeW5fcGFyYSk7Ci0JcHJfZGVidWcoIkRJVSBWU1lOQyAtIDB4JTA4eFxuIiwgaHctPnZzeW5fcGFyYSk7Ci0KIAlkaXVfb3BzLnNldF9waXhlbF9jbG9jayh2YXItPnBpeGNsb2NrKTsKIAogCW91dF9iZTMyKCZody0+c3luX3BvbCwgMCk7CS8qIFNZTkMgU0lHTkFMUyBQT0xBUklUWSAqLwpAQCAtNzQ2LDE0ICs4NzMsOSBAQAogCXBoeXNfYWRkcl90IHBoeXM7CiAJdTMyIHNtZW1fbGVuID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoICogaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKIAotCXByX2RlYnVnKCJpbmZvLT52YXIueHJlc192aXJ0dWFsID0gJWRcbiIsIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOwotCXByX2RlYnVnKCJpbmZvLT52YXIueXJlc192aXJ0dWFsID0gJWRcbiIsIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOwotCXByX2RlYnVnKCJpbmZvLT5maXgubGluZV9sZW5ndGggID0gJWRcbiIsIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7Ci0JcHJfZGVidWcoIk1BUF9WSURFT19NRU1PUlk6IHNtZW1fbGVuID0gJXVcbiIsIHNtZW1fbGVuKTsKLQogCWluZm8tPnNjcmVlbl9iYXNlID0gZnNsX2RpdV9hbGxvYyhzbWVtX2xlbiwgJnBoeXMpOwogCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGZiIG1lbW9yeVxuIik7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGZiIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltdXRleF9sb2NrKCZpbmZvLT5tbV9sb2NrKTsKQEAgLTc2MiwxMCArODg0LDYgQEAKIAltdXRleF91bmxvY2soJmluZm8tPm1tX2xvY2spOwogCWluZm8tPnNjcmVlbl9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwogCi0JcHJfZGVidWcoIkFsbG9jYXRlZCBmYiBAIHBhZGRyPTB4JTA4bHgsIHNpemU9JWQuXG4iLAotCQkgaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7Ci0JcHJfZGVidWcoInNjcmVlbiBiYXNlICVwXG4iLCBpbmZvLT5zY3JlZW5fYmFzZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODEwLDkgKzkyOCw5IEBACiAJc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9IG1mYmktPnBhcmVudDsKIAlzdHJ1Y3QgZGl1X2FkICphZCA9IG1mYmktPmFkOwotCXN0cnVjdCBkaXUgKmh3OworCXN0cnVjdCBkaXUgX19pb21lbSAqaHc7CiAKLQlodyA9IGRyLmRpdV9yZWc7CisJaHcgPSBtYWNoaW5lX2RhdGEtPmRpdV9yZWc7CiAKIAlzZXRfZml4KGluZm8pOwogCW1mYmktPmN1cnNvcl9yZXNldCA9IDE7CkBAIC04MjIsMTggKzk0MCwxNiBAQAogCWlmIChsZW4gIT0gaW5mby0+Zml4LnNtZW1fbGVuKSB7CiAJCWlmIChpbmZvLT5maXguc21lbV9zdGFydCkKIAkJCXVubWFwX3ZpZGVvX21lbW9yeShpbmZvKTsKLQkJcHJfZGVidWcoIlNFVCBQQVI6IHNtZW1fbGVuID0gJWRcbiIsIGluZm8tPmZpeC5zbWVtX2xlbik7CiAKIAkJLyogTWVtb3J5IGFsbG9jYXRpb24gZm9yIGZyYW1lYnVmZmVyICovCiAJCWlmIChtYXBfdmlkZW9fbWVtb3J5KGluZm8pKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBmYiBtZW1vcnkgMVxuIik7CisJCQlkZXZfZXJyKGluZm8tPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBmYiBtZW1vcnkgMVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAotCWFkLT5waXhfZm10ID0KLQkJZGl1X29wcy5nZXRfcGl4ZWxfZm9ybWF0KHZhci0+Yml0c19wZXJfcGl4ZWwsCi0JCQkJCSBtYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydCk7CisJYWQtPnBpeF9mbXQgPSBkaXVfb3BzLmdldF9waXhlbF9mb3JtYXQobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsCisJCQkJCSAgICAgICB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAlhZC0+YWRkciAgICA9IGNwdV90b19sZTMyKGluZm8tPmZpeC5zbWVtX3N0YXJ0KTsKIAlhZC0+c3JjX3NpemVfZ19hbHBoYSA9IGNwdV90b19sZTMyKCh2YXItPnlyZXNfdmlydHVhbCA8PCAxMikgfAogCQkJCXZhci0+eHJlc192aXJ0dWFsKSB8IG1mYmktPmdfYWxwaGE7CkBAIC04NTEsMTQgKzk2NywxNCBAQAogCWFkLT5ja21pbl9nID0gMjU1OwogCWFkLT5ja21pbl9iID0gMjU1OwogCi0JaWYgKG1mYmktPmluZGV4ID09IDApCisJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkKIAkJdXBkYXRlX2xjZGMoaW5mbyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MzIgQ05WVF9UT0hXKF9fdTMyIHZhbCwgX191MzIgd2lkdGgpCiB7Ci0JcmV0dXJuICgodmFsPDx3aWR0aCkgKyAweDdGRkYgLSB2YWwpPj4xNjsKKwlyZXR1cm4gKCh2YWwgPDwgd2lkdGgpICsgMHg3RkZGIC0gdmFsKSA+PiAxNjsKIH0KIAogLyoKQEAgLTg3MCw4ICs5ODYsOSBAQAogICogcHNldWRvX3BhbGV0dGUgaW4gc3RydWN0IGZiX2luZm8uIEZvciBwc2V1ZG9jb2xvciBtb2RlIHdlIGhhdmUgYSBsaW1pdGVkCiAgKiBjb2xvciBwYWxldHRlLgogICovCi1zdGF0aWMgaW50IGZzbF9kaXVfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLAotCQkJICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgZnNsX2RpdV9zZXRjb2xyZWcodW5zaWduZWQgaW50IHJlZ25vLCB1bnNpZ25lZCBpbnQgcmVkLAorCQkJICAgICB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0ID0gMTsKIApAQCAtOTA2LDkgKzEwMjMsNiBAQAogCQkJcmV0ID0gMDsKIAkJfQogCQlicmVhazsKLQljYXNlIEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1I6Ci0JY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6Ci0JCWJyZWFrOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC05NDQsMzcgKzEwNTgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYgYmxhbmtpbmcKLSAqIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkLgotICogYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCi0gKiBibGFua19tb2RlID09IDM6IHN1c3BlbmQgaHN5bmMKLSAqIGJsYW5rX21vZGUgPT0gNDogcG93ZXJkb3duCi0gKi8KLXN0YXRpYyBpbnQgZnNsX2RpdV9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IG1mYl9pbmZvICptZmJpID0gaW5mby0+cGFyOwotCi0JbWZiaS0+YmxhbmsgPSBibGFua19tb2RlOwotCi0Jc3dpdGNoIChibGFua19tb2RlKSB7Ci0JY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgotCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKLQkvKiBGSVhNRTogZml4ZXMgdG8gZW5hYmxlX3BhbmVsIGFuZCBlbmFibGUgbGNkYyBuZWVkZWQgKi8KLQljYXNlIEZCX0JMQU5LX05PUk1BTDoKLQkvKglmc2xfZGl1X2Rpc2FibGVfcGFuZWwoaW5mbyk7Ki8KLQkJYnJlYWs7Ci0JY2FzZSBGQl9CTEFOS19QT1dFUkRPV046Ci0JLyoJZGlzYWJsZV9sY2RjKGluZm8pOwkqLwotCQlicmVhazsKLQljYXNlIEZCX0JMQU5LX1VOQkxBTks6Ci0JLyoJZnNsX2RpdV9lbmFibGVfcGFuZWwoaW5mbyk7Ki8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZnNsX2RpdV9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtOTg5LDI1ICsxMDcyLDI5IEBACiAJaWYgKCFhcmcpCiAJCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNRkJfU0VUX1BJWEZNVF9PTEQ6CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCSAiTUZCX1NFVF9QSVhGTVQgdmFsdWUgb2YgMHglMDh4IGlzIGRlcHJlY2F0ZWQuXG4iLAorCQkJIE1GQl9TRVRfUElYRk1UX09MRCk7CiAJY2FzZSBNRkJfU0VUX1BJWEZNVDoKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZwaXhfZm10LCBidWYsIHNpemVvZihwaXhfZm10KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJYWQtPnBpeF9mbXQgPSBwaXhfZm10OwotCQlwcl9kZWJ1ZygiU2V0IHBpeGVsIGZvcm1hdCB0byAweCUwOHhcbiIsIGFkLT5waXhfZm10KTsKIAkJYnJlYWs7CisJY2FzZSBNRkJfR0VUX1BJWEZNVF9PTEQ6CisJCWRldl93YXJuKGluZm8tPmRldiwKKwkJCSAiTUZCX0dFVF9QSVhGTVQgdmFsdWUgb2YgMHglMDh4IGlzIGRlcHJlY2F0ZWQuXG4iLAorCQkJIE1GQl9HRVRfUElYRk1UX09MRCk7CiAJY2FzZSBNRkJfR0VUX1BJWEZNVDoKIAkJcGl4X2ZtdCA9IGFkLT5waXhfZm10OwogCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnBpeF9mbXQsIHNpemVvZihwaXhfZm10KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHJfZGVidWcoImdldCBwaXhlbCBmb3JtYXQgMHglMDh4XG4iLCBhZC0+cGl4X2ZtdCk7CiAJCWJyZWFrOwogCWNhc2UgTUZCX1NFVF9BT0lEOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmFvaV9kLCBidWYsIHNpemVvZihhb2lfZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCW1mYmktPnhfYW9pX2QgPSBhb2lfZC54X2FvaV9kOwogCQltZmJpLT55X2FvaV9kID0gYW9pX2QueV9hb2lfZDsKLQkJcHJfZGVidWcoInNldCBBT0kgZGlzcGxheSBvZmZzZXQgb2YgaW5kZXggJWQgdG8gKCVkLCVkKVxuIiwKLQkJCQkgbWZiaS0+aW5kZXgsIGFvaV9kLnhfYW9pX2QsIGFvaV9kLnlfYW9pX2QpOwogCQlmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKIAkJZnNsX2RpdV9zZXRfYW9pKGluZm8pOwogCQlicmVhazsKQEAgLTEwMTYsMTQgKzExMDMsMTEgQEAKIAkJYW9pX2QueV9hb2lfZCA9IG1mYmktPnlfYW9pX2Q7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmYW9pX2QsIHNpemVvZihhb2lfZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJnZXQgQU9JIGRpc3BsYXkgb2Zmc2V0IG9mIGluZGV4ICVkICglZCwlZClcbiIsCi0JCQkJbWZiaS0+aW5kZXgsIGFvaV9kLnhfYW9pX2QsIGFvaV9kLnlfYW9pX2QpOwogCQlicmVhazsKIAljYXNlIE1GQl9HRVRfQUxQSEE6CiAJCWdsb2JhbF9hbHBoYSA9IG1mYmktPmdfYWxwaGE7CiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZ2xvYmFsX2FscGhhLCBzaXplb2YoZ2xvYmFsX2FscGhhKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHJfZGVidWcoImdldCBnbG9iYWwgYWxwaGEgb2YgaW5kZXggJWRcbiIsIG1mYmktPmluZGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBNRkJfU0VUX0FMUEhBOgogCQkvKiBzZXQgcGFuZWwgaW5mb3JtYXRpb24gKi8KQEAgLTEwMzIsNyArMTExNiw2IEBACiAJCWFkLT5zcmNfc2l6ZV9nX2FscGhhID0gKGFkLT5zcmNfc2l6ZV9nX2FscGhhICYgKH4weGZmKSkgfAogCQkJCQkJCShnbG9iYWxfYWxwaGEgJiAweGZmKTsKIAkJbWZiaS0+Z19hbHBoYSA9IGdsb2JhbF9hbHBoYTsKLQkJcHJfZGVidWcoInNldCBnbG9iYWwgYWxwaGEgZm9yIGluZGV4ICVkXG4iLCBtZmJpLT5pbmRleCk7CiAJCWJyZWFrOwogCWNhc2UgTUZCX1NFVF9DSFJPTUFfS0VZOgogCQkvKiBzZXQgcGFuZWwgd2luZm9ybWF0aW9uICovCkBAIC0xMDYwLDI3ICsxMTQzLDkgQEAKIAkJCWFkLT5ja21pbl9nID0gY2suZ3JlZW5fbWluOwogCQkJYWQtPmNrbWluX2IgPSBjay5ibHVlX21pbjsKIAkJfQotCQlwcl9kZWJ1Zygic2V0IGNocm9tYSBrZXlcbiIpOwogCQlicmVhazsKLQljYXNlIEZCSU9HRVRfR1dJTkZPOgotCQlpZiAobWZiaS0+dHlwZSA9PSBNRkJfVFlQRV9PRkYpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJLyogZ2V0IGdyYXBoaWMgd2luZG93IGluZm9ybWF0aW9uICovCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBhZCwgc2l6ZW9mKCphZCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgRkJJT0dFVF9IV0NJTkZPOgotCQlwcl9kZWJ1ZygiRkJJT0dFVF9IV0NJTkZPOjB4JTA4eFxuIiwgRkJJT0dFVF9IV0NJTkZPKTsKLQkJYnJlYWs7Ci0JY2FzZSBGQklPUFVUX01PREVJTkZPOgotCQlwcl9kZWJ1ZygiRkJJT1BVVF9NT0RFSU5GTzoweCUwOHhcbiIsIEZCSU9QVVRfTU9ERUlORk8pOwotCQlicmVhazsKLQljYXNlIEZCSU9HRVRfRElTUElORk86Ci0JCXByX2RlYnVnKCJGQklPR0VUX0RJU1BJTkZPOjB4JTA4eFxuIiwgRkJJT0dFVF9ESVNQSU5GTyk7Ci0JCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIGlvY3RsIGNvbW1hbmQgKDB4JTA4WClcbiIsIGNtZCk7CisJCWRldl9lcnIoaW5mby0+ZGV2LCAidW5rbm93biBpb2N0bCBjb21tYW5kICgweCUwOFgpXG4iLCBjbWQpOwogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIApAQCAtMTA5NSwyMiArMTE2MCwxOCBAQAogCWludCByZXMgPSAwOwogCiAJLyogZnJlZSBib290IHNwbGFzaCBtZW1vcnkgb24gZmlyc3QgL2Rldi9mYjAgb3BlbiAqLwotCWlmICghbWZiaS0+aW5kZXggJiYgZGl1X29wcy5yZWxlYXNlX2Jvb3RtZW0pCisJaWYgKChtZmJpLT5pbmRleCA9PSBQTEFORTApICYmIGRpdV9vcHMucmVsZWFzZV9ib290bWVtKQogCQlkaXVfb3BzLnJlbGVhc2VfYm9vdG1lbSgpOwogCiAJc3Bpbl9sb2NrKCZkaXVfbG9jayk7CiAJbWZiaS0+Y291bnQrKzsKIAlpZiAobWZiaS0+Y291bnQgPT0gMSkgewotCQlwcl9kZWJ1Zygib3BlbiBwbGFuZSBpbmRleCAlZFxuIiwgbWZiaS0+aW5kZXgpOwogCQlmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKIAkJcmVzID0gZnNsX2RpdV9zZXRfcGFyKGluZm8pOwogCQlpZiAocmVzIDwgMCkKIAkJCW1mYmktPmNvdW50LS07Ci0JCWVsc2UgewotCQkJcmVzID0gZnNsX2RpdV9lbmFibGVfcGFuZWwoaW5mbyk7Ci0JCQlpZiAocmVzIDwgMCkKLQkJCQltZmJpLT5jb3VudC0tOwotCQl9CisJCWVsc2UKKwkJCWZzbF9kaXVfZW5hYmxlX3BhbmVsKGluZm8pOwogCX0KIAogCXNwaW5fdW5sb2NrKCZkaXVfbG9jayk7CkBAIC0xMTI2LDEyICsxMTg3LDkgQEAKIAogCXNwaW5fbG9jaygmZGl1X2xvY2spOwogCW1mYmktPmNvdW50LS07Ci0JaWYgKG1mYmktPmNvdW50ID09IDApIHsKLQkJcHJfZGVidWcoInJlbGVhc2UgcGxhbmUgaW5kZXggJWRcbiIsIG1mYmktPmluZGV4KTsKLQkJcmVzID0gZnNsX2RpdV9kaXNhYmxlX3BhbmVsKGluZm8pOwotCQlpZiAocmVzIDwgMCkKLQkJCW1mYmktPmNvdW50Kys7Ci0JfQorCWlmIChtZmJpLT5jb3VudCA9PSAwKQorCQlmc2xfZGl1X2Rpc2FibGVfcGFuZWwoaW5mbyk7CisKIAlzcGluX3VubG9jaygmZGl1X2xvY2spOwogCXJldHVybiByZXM7CiB9CkBAIC0xMTQxLDcgKzExOTksNiBAQAogCS5mYl9jaGVja192YXIgPSBmc2xfZGl1X2NoZWNrX3ZhciwKIAkuZmJfc2V0X3BhciA9IGZzbF9kaXVfc2V0X3BhciwKIAkuZmJfc2V0Y29scmVnID0gZnNsX2RpdV9zZXRjb2xyZWcsCi0JLmZiX2JsYW5rID0gZnNsX2RpdV9ibGFuaywKIAkuZmJfcGFuX2Rpc3BsYXkgPSBmc2xfZGl1X3Bhbl9kaXNwbGF5LAogCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCkBAIC0xMTc4LDcgKzEyMzUsNyBAQAogCWlmIChpbml0X2ZiaW5mbyhpbmZvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAobWZiaS0+aW5kZXggPT0gMCkgewkvKiBwbGFuZSAwICovCisJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkgewogCQlpZiAobWZiaS0+ZWRpZF9kYXRhKSB7CiAJCQkvKiBOb3cgYnVpbGQgbW9kZWRiIGZyb20gRURJRCAqLwogCQkJZmJfZWRpZF90b19tb25zcGVjcyhtZmJpLT5lZGlkX2RhdGEsICZpbmZvLT5tb25zcGVjcyk7CkBAIC0xMTkyLDQzICsxMjQ5LDIzIEBACiAJfSBlbHNlIHsKIAkJYW9pX21vZGUgPSBpbml0X2FvaV9tb2RlOwogCX0KLQlwcl9kZWJ1ZygibW9kZSB1c2VkID0gJXNcbiIsIGFvaV9tb2RlKTsKLQlyYyA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBhb2lfbW9kZSwgZGIsIGRic2l6ZSwKLQkJCSAgJmZzbF9kaXVfZGVmYXVsdF9tb2RlLCBkZWZhdWx0X2JwcCk7Ci0Jc3dpdGNoIChyYykgewotCWNhc2UgMToKLQkJcHJfZGVidWcoInVzaW5nIG1vZGUgc3BlY2lmaWVkIGluIEBtb2RlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwcl9kZWJ1ZygidXNpbmcgbW9kZSBzcGVjaWZpZWQgaW4gQG1vZGUgIgotCQkJIndpdGggaWdub3JlZCByZWZyZXNoIHJhdGVcbiIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXByX2RlYnVnKCJ1c2luZyBtb2RlIGRlZmF1bHQgbW9kZVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJcHJfZGVidWcoInVzaW5nIG1vZGUgZnJvbSBsaXN0XG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoInJjID0gJWRcbiIsIHJjKTsKLQkJcHJfZGVidWcoImZhaWxlZCB0byBmaW5kIG1vZGVcbiIpOworCXJjID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIGFvaV9tb2RlLCBkYiwgZGJzaXplLCBOVUxMLAorCQkJICBkZWZhdWx0X2JwcCk7CisJaWYgKCFyYykgewogCQkvKgogCQkgKiBGb3IgcGxhbmUgMCB3ZSBjb250aW51ZSBhbmQgbG9vayBpbnRvCiAJCSAqIGRyaXZlcidzIGludGVybmFsIG1vZGVkYi4KIAkJICovCi0JCWlmIChtZmJpLT5pbmRleCA9PSAwICYmIG1mYmktPmVkaWRfZGF0YSkKKwkJaWYgKChtZmJpLT5pbmRleCA9PSBQTEFORTApICYmIG1mYmktPmVkaWRfZGF0YSkKIAkJCWhhc19kZWZhdWx0X21vZGUgPSAwOwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7CiAJfQogCiAJaWYgKCFoYXNfZGVmYXVsdF9tb2RlKSB7CiAJCXJjID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIGFvaV9tb2RlLCBmc2xfZGl1X21vZGVfZGIsCi0JCQkJICBBUlJBWV9TSVpFKGZzbF9kaXVfbW9kZV9kYiksCi0JCQkJICAmZnNsX2RpdV9kZWZhdWx0X21vZGUsCi0JCQkJICBkZWZhdWx0X2JwcCk7Ci0JCWlmIChyYyA+IDAgJiYgcmMgPCA1KQorCQkJQVJSQVlfU0laRShmc2xfZGl1X21vZGVfZGIpLCBOVUxMLCBkZWZhdWx0X2JwcCk7CisJCWlmIChyYykKIAkJCWhhc19kZWZhdWx0X21vZGUgPSAxOwogCX0KIApAQCAtMTI1NiwzMyArMTI5MywyMiBAQAogCQlmYl92aWRlb21vZGVfdG9fdmFyKCZpbmZvLT52YXIsIG1vZGVkYik7CiAJfQogCi0JcHJfZGVidWcoInhyZXNfdmlydHVhbCAlZFxuIiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7Ci0JcHJfZGVidWcoImJpdHNfcGVyX3BpeGVsICVkXG4iLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwotCi0JcHJfZGVidWcoImluZm8tPnZhci55cmVzX3ZpcnR1YWwgPSAlZFxuIiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7Ci0JcHJfZGVidWcoImluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICVkXG4iLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOwotCi0JaWYgKG1mYmktPnR5cGUgPT0gTUZCX1RZUEVfT0ZGKQotCQltZmJpLT5ibGFuayA9IEZCX0JMQU5LX05PUk1BTDsKLQllbHNlCi0JCW1mYmktPmJsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKLQogCWlmIChmc2xfZGl1X2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKSkgewotCQlwcmludGsoS0VSTl9FUlIgImZiX2NoZWNrX3ZhciBmYWlsZWQiKTsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJmc2xfZGl1X2NoZWNrX3ZhciBmYWlsZWRcbiIpOworCQl1bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CiAJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWQiKTsKKwkJZGV2X2VycihpbmZvLT5kZXYsICJyZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWRcbiIpOwogCQl1bm1hcF92aWRlb19tZW1vcnkoaW5mbyk7CiAJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCW1mYmktPnJlZ2lzdGVyZWQgPSAxOwotCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZiIGRldmljZSByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseS5cbiIsCi0JCSBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOworCWRldl9pbmZvKGluZm8tPmRldiwgIiVzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4iLCBtZmJpLT5pZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyOTQsNyArMTMyMCw3IEBACiAJaWYgKCFtZmJpLT5yZWdpc3RlcmVkKQogCQlyZXR1cm47CiAKLQlpZiAobWZiaS0+aW5kZXggPT0gMCkKKwlpZiAobWZiaS0+aW5kZXggPT0gUExBTkUwKQogCQlrZnJlZShtZmJpLT5lZGlkX2RhdGEpOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKQEAgLTEzMDcsMjAgKzEzMzMsMjAgQEAKIAogc3RhdGljIGlycXJldHVybl90IGZzbF9kaXVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CisJc3RydWN0IGRpdSBfX2lvbWVtICpodyA9IGRldl9pZDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzID0gaW5fYmUzMigmaHctPmludF9zdGF0dXMpOwogCiAJaWYgKHN0YXR1cykgewogCQkvKiBUaGlzIGlzIHRoZSB3b3JrYXJvdW5kIGZvciB1bmRlcnJ1biAqLwogCQlpZiAoc3RhdHVzICYgSU5UX1VORFJVTikgewogCQkJb3V0X2JlMzIoJmh3LT5kaXVfbW9kZSwgMCk7Ci0JCQlwcl9kZWJ1ZygiRXJyOiBESVUgb2NjdXJzIHVuZGVycnVuIVxuIik7CiAJCQl1ZGVsYXkoMSk7CiAJCQlvdXRfYmUzMigmaHctPmRpdV9tb2RlLCAxKTsKIAkJfQogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIAkJZWxzZSBpZiAoc3RhdHVzICYgSU5UX1ZTWU5DKSB7CiAJCQl1bnNpZ25lZCBpbnQgaTsKKwogCQkJZm9yIChpID0gMDsgaSA8IGNvaGVyZW5jZV9kYXRhX3NpemU7CiAJCQkJaSArPSBkX2NhY2hlX2xpbmVfc2l6ZSkKIAkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCkBAIC0xMzMzLDQzICsxMzU5LDM4IEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfaXJxX2xvY2FsKGludCBpcnEpCitzdGF0aWMgaW50IHJlcXVlc3RfaXJxX2xvY2FsKHN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cywgaW50czsKLQlzdHJ1Y3QgZGl1ICpodzsKKwlzdHJ1Y3QgZGl1IF9faW9tZW0gKmh3ID0gbWFjaGluZV9kYXRhLT5kaXVfcmVnOworCXUzMiBpbnRzOwogCWludCByZXQ7CiAKLQlodyA9IGRyLmRpdV9yZWc7Ci0KIAkvKiBSZWFkIHRvIGNsZWFyIHRoZSBzdGF0dXMgKi8KLQlzdGF0dXMgPSBpbl9iZTMyKCZody0+aW50X3N0YXR1cyk7CisJaW5fYmUzMigmaHctPmludF9zdGF0dXMpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBmc2xfZGl1X2lzciwgMCwgImRpdSIsIE5VTEwpOwotCWlmIChyZXQpCi0JCXByX2luZm8oIlJlcXVlc3QgZGl1IElSUSBmYWlsZWQuXG4iKTsKLQllbHNlIHsKKwlyZXQgPSByZXF1ZXN0X2lycShtYWNoaW5lX2RhdGEtPmlycSwgZnNsX2RpdV9pc3IsIDAsICJmc2wtZGl1LWZiIiwgaHcpOworCWlmICghcmV0KSB7CiAJCWludHMgPSBJTlRfUEFSRVJSIHwgSU5UX0xTX0JGX1ZTOwogI2lmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWludHMgfD0JSU5UX1ZTWU5DOwogI2VuZGlmCi0JCWlmIChkci5tb2RlID09IE1GQl9NT0RFMiB8fCBkci5tb2RlID09IE1GQl9NT0RFMykKLQkJCWludHMgfD0gSU5UX1ZTWU5DX1dCOwogCiAJCS8qIFJlYWQgdG8gY2xlYXIgdGhlIHN0YXR1cyAqLwotCQlzdGF0dXMgPSBpbl9iZTMyKCZody0+aW50X3N0YXR1cyk7CisJCWluX2JlMzIoJmh3LT5pbnRfc3RhdHVzKTsKIAkJb3V0X2JlMzIoJmh3LT5pbnRfbWFzaywgaW50cyk7CiAJfQorCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9pcnFfbG9jYWwoaW50IGlycSkKK3N0YXRpYyB2b2lkIGZyZWVfaXJxX2xvY2FsKHN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSkKIHsKLQlzdHJ1Y3QgZGl1ICpodyA9IGRyLmRpdV9yZWc7CisJc3RydWN0IGRpdSBfX2lvbWVtICpodyA9IG1hY2hpbmVfZGF0YS0+ZGl1X3JlZzsKIAogCS8qIERpc2FibGUgYWxsIExDREMgaW50ZXJydXB0ICovCiAJb3V0X2JlMzIoJmh3LT5pbnRfbWFzaywgMHgxZik7CiAKLQlmcmVlX2lycShpcnEsIE5VTEwpOworCWZyZWVfaXJxKG1hY2hpbmVfZGF0YS0+aXJxLCBOVUxMKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTQwNiw0OSArMTQyNyw0MiBAQAogc3RhdGljIGludCBhbGxvY2F0ZV9idWYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGl1X2FkZHIgKmJ1ZiwgdTMyIHNpemUsCiAJCQl1MzIgYnl0ZXNfYWxpZ24pCiB7Ci0JdTMyIG9mZnNldCwgc3NpemU7Ci0JdTMyIG1hc2s7Ci0JZG1hX2FkZHJfdCBwYWRkciA9IDA7CisJdTMyIG9mZnNldDsKKwlkbWFfYWRkcl90IG1hc2s7CiAKLQlzc2l6ZSA9IHNpemUgKyBieXRlc19hbGlnbjsKLQlidWYtPnZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc3NpemUsICZwYWRkciwgR0ZQX0RNQSB8Ci0JCQkJCQkJICAgICBfX0dGUF9aRVJPKTsKKwlidWYtPnZhZGRyID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSArIGJ5dGVzX2FsaWduLCAmYnVmLT5wYWRkciwKKwkJCQkgICBHRlBfRE1BIHwgX19HRlBfWkVSTyk7CiAJaWYgKCFidWYtPnZhZGRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWJ1Zi0+cGFkZHIgPSAoX191MzIpIHBhZGRyOwotCiAJbWFzayA9IGJ5dGVzX2FsaWduIC0gMTsKLQlvZmZzZXQgPSAodTMyKWJ1Zi0+cGFkZHIgJiBtYXNrOworCW9mZnNldCA9IGJ1Zi0+cGFkZHIgJiBtYXNrOwogCWlmIChvZmZzZXQpIHsKIAkJYnVmLT5vZmZzZXQgPSBieXRlc19hbGlnbiAtIG9mZnNldDsKLQkJYnVmLT5wYWRkciA9ICh1MzIpYnVmLT5wYWRkciArIG9mZnNldDsKKwkJYnVmLT5wYWRkciA9IGJ1Zi0+cGFkZHIgKyBvZmZzZXQ7CiAJfSBlbHNlCiAJCWJ1Zi0+b2Zmc2V0ID0gMDsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX2J1ZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkaXVfYWRkciAqYnVmLCB1MzIgc2l6ZSwKIAkJICAgICB1MzIgYnl0ZXNfYWxpZ24pCiB7Ci0JZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplICsgYnl0ZXNfYWxpZ24sCi0JCQkJYnVmLT52YWRkciwgKGJ1Zi0+cGFkZHIgLSBidWYtPm9mZnNldCkpOwotCXJldHVybjsKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNpemUgKyBieXRlc19hbGlnbiwgYnVmLT52YWRkciwKKwkJCSAgYnVmLT5wYWRkciAtIGJ1Zi0+b2Zmc2V0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfbW9uaXRvcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCBvbGRfbW9uaXRvcl9wb3J0OwotCXVuc2lnbmVkIGxvbmcgdmFsOworCWVudW0gZnNsX2RpdV9tb25pdG9yX3BvcnQgb2xkX21vbml0b3JfcG9ydDsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGEgPQogCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGZzbF9kaXVfZGF0YSwgZGV2X2F0dHIpOwogCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpKQotCQlyZXR1cm4gMDsKLQogCW9sZF9tb25pdG9yX3BvcnQgPSBtYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydDsKLQltYWNoaW5lX2RhdGEtPm1vbml0b3JfcG9ydCA9IGRpdV9vcHMuc2V0X3N5c2ZzX21vbml0b3JfcG9ydCh2YWwpOworCW1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0ID0gZnNsX2RpdV9uYW1lX3RvX3BvcnQoYnVmKTsKIAogCWlmIChvbGRfbW9uaXRvcl9wb3J0ICE9IG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KSB7CiAJCS8qIEFsbCBBT0lzIG5lZWQgYWRqdXN0IHBpeGVsIGZvcm1hdApAQCAtMTQ2OCwxNiArMTQ4MiwyNSBAQAogewogCXN0cnVjdCBmc2xfZGl1X2RhdGEgKm1hY2hpbmVfZGF0YSA9CiAJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZnNsX2RpdV9kYXRhLCBkZXZfYXR0cik7Ci0JcmV0dXJuIGRpdV9vcHMuc2hvd19tb25pdG9yX3BvcnQobWFjaGluZV9kYXRhLT5tb25pdG9yX3BvcnQsIGJ1Zik7CisKKwlzd2l0Y2ggKG1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0KSB7CisJY2FzZSBGU0xfRElVX1BPUlRfRFZJOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEVklcbiIpOworCWNhc2UgRlNMX0RJVV9QT1JUX0xWRFM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlNpbmdsZS1saW5rIExWRFNcbiIpOworCWNhc2UgRlNMX0RJVV9QT1JUX0RMVkRTOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEdWFsLWxpbmsgTFZEU1xuIik7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGZzbF9kaXVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfZGl1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IG1mYl9pbmZvICptZmJpOwotCXBoeXNfYWRkcl90IGR1bW15X2FkX2FkZHI7CisJcGh5c19hZGRyX3QgZHVtbXlfYWRfYWRkciA9IDA7CiAJaW50IHJldCwgaSwgZXJyb3IgPSAwOwotCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IGZzbF9kaXVfZGF0YSAqbWFjaGluZV9kYXRhOwogCWludCBkaXVfbW9kZTsKIApAQCAtMTQ4NSwxMSArMTUwOCwxMyBAQAogCWlmICghbWFjaGluZV9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNwaW5fbG9ja19pbml0KCZtYWNoaW5lX2RhdGEtPnJlZ19sb2NrKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKSB7CiAJCW1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldID0KLQkJCWZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgbWZiX2luZm8pLCAmb2ZkZXYtPmRldik7CisJCQlmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG1mYl9pbmZvKSwgJnBkZXYtPmRldik7CiAJCWlmICghbWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pIHsKLQkJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3IyOwogCQl9CkBAIC0xNDk3LDcgKzE1MjIsNyBAQAogCQltZW1jcHkobWZiaSwgJm1mYl90ZW1wbGF0ZVtpXSwgc2l6ZW9mKHN0cnVjdCBtZmJfaW5mbykpOwogCQltZmJpLT5wYXJlbnQgPSBtYWNoaW5lX2RhdGE7CiAKLQkJaWYgKG1mYmktPmluZGV4ID09IDApIHsKKwkJaWYgKG1mYmktPmluZGV4ID09IFBMQU5FMCkgewogCQkJY29uc3QgdTggKnByb3A7CiAJCQlpbnQgbGVuOwogCkBAIC0xNTA5LDYwICsxNTM0LDQ5IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjb3VsZCBub3Qgb2J0YWluIERJVSBhZGRyZXNzXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKCFyZXMuc3RhcnQpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImludmFsaWQgRElVIGFkZHJlc3NcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAiJXMsIHJlcy5zdGFydDogMHglMDh4XG4iLCBfX2Z1bmNfXywgcmVzLnN0YXJ0KTsKLQotCWRyLmRpdV9yZWcgPSBpb3JlbWFwKHJlcy5zdGFydCwgc2l6ZW9mKHN0cnVjdCBkaXUpKTsKLQlpZiAoIWRyLmRpdV9yZWcpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgIkVycjogY2FuJ3QgbWFwIERJVSByZWdpc3RlcnMhXG4iKTsKKwltYWNoaW5lX2RhdGEtPmRpdV9yZWcgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFtYWNoaW5lX2RhdGEtPmRpdV9yZWcpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBESVUgcmVnaXN0ZXJzXG4iKTsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBlcnJvcjI7CiAJfQogCi0JZGl1X21vZGUgPSBpbl9iZTMyKCZkci5kaXVfcmVnLT5kaXVfbW9kZSk7Ci0JaWYgKGRpdV9tb2RlICE9IE1GQl9NT0RFMSkKLQkJb3V0X2JlMzIoJmRyLmRpdV9yZWctPmRpdV9tb2RlLCAwKTsJLyogZGlzYWJsZSBESVUgKi8KKwlkaXVfbW9kZSA9IGluX2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGl1X21vZGUpOworCWlmIChkaXVfbW9kZSA9PSBNRkJfTU9ERTApCisJCW91dF9iZTMyKCZtYWNoaW5lX2RhdGEtPmRpdV9yZWctPmRpdV9tb2RlLCAwKTsgLyogZGlzYWJsZSBESVUgKi8KIAogCS8qIEdldCB0aGUgSVJRIG9mIHRoZSBESVUgKi8KIAltYWNoaW5lX2RhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAogCWlmICghbWFjaGluZV9kYXRhLT5pcnEpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgRElVIElSUVxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgRElVIElSUVxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3I7CiAJfQogCW1hY2hpbmVfZGF0YS0+bW9uaXRvcl9wb3J0ID0gbW9uaXRvcl9wb3J0OwogCiAJLyogQXJlYSBkZXNjcmlwdG9yIG1lbW9yeSBwb29sIGFsaWducyB0byA2NC1iaXQgYm91bmRhcnkgKi8KLQlpZiAoYWxsb2NhdGVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5hZCwKKwlpZiAoYWxsb2NhdGVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmFkLAogCQkJIHNpemVvZihzdHJ1Y3QgZGl1X2FkKSAqIEZTTF9BT0lfTlVNLCA4KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBHZXQgbWVtb3J5IGZvciBHYW1tYSBUYWJsZSAgLSAzMi1ieXRlIGFsaWduZWQgbWVtb3J5ICovCi0JaWYgKGFsbG9jYXRlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuZ2FtbWEsIDc2OCwgMzIpKSB7CisJaWYgKGFsbG9jYXRlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5nYW1tYSwgNzY4LCAzMikpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CiAKIAkvKiBGb3IgcGVyZm9ybWFuY2UsIGN1cnNvciBiaXRtYXAgYnVmZmVyIGFsaWducyB0byAzMi1ieXRlIGJvdW5kYXJ5ICovCi0JaWYgKGFsbG9jYXRlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuY3Vyc29yLCBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwKLQkJCSAzMikpIHsKKwlpZiAoYWxsb2NhdGVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmN1cnNvciwKKwkJCSBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwgMzIpKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQogCiAJaSA9IEFSUkFZX1NJWkUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm8pOwotCW1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQgPSAoc3RydWN0IGRpdV9hZCAqKQotCQkJKCh1MzIpcG9vbC5hZC52YWRkciArIHBvb2wuYWQub2Zmc2V0KSArIGk7Ci0JbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIgPSBwb29sLmFkLnBhZGRyICsKKwltYWNoaW5lX2RhdGEtPmR1bW15X2FkID0gKHN0cnVjdCBkaXVfYWQgKikoKHUzMiltYWNoaW5lX2RhdGEtPmFkLnZhZGRyICsKKwkJCW1hY2hpbmVfZGF0YS0+YWQub2Zmc2V0KSArIGk7CisJbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIgPSBtYWNoaW5lX2RhdGEtPmFkLnBhZGRyICsKIAkJCWkgKiBzaXplb2Yoc3RydWN0IGRpdV9hZCk7CiAJbWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCA9IGZzbF9kaXVfYWxsb2MoNjQsICZkdW1teV9hZF9hZGRyKTsKIAlpZiAoIW1hY2hpbmVfZGF0YS0+ZHVtbXlfYW9pX3ZpcnQpIHsKQEAgLTE1ODEsMzAgKzE1OTUsMjkgQEAKIAkgKiBMZXQgRElVIGRpc3BsYXkgc3BsYXNoIHNjcmVlbiBpZiBpdCB3YXMgcHJlLWluaXRpYWxpemVkCiAJICogYnkgdGhlIGJvb3Rsb2FkZXIsIHNldCBkdW1teSBhcmVhIGRlc2NyaXB0b3Igb3RoZXJ3aXNlLgogCSAqLwotCWlmIChkaXVfbW9kZSAhPSBNRkJfTU9ERTEpCi0JCW91dF9iZTMyKCZkci5kaXVfcmVnLT5kZXNjWzBdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJaWYgKGRpdV9tb2RlID09IE1GQl9NT0RFMCkKKwkJb3V0X2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGVzY1swXSwKKwkJCSBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CiAKLQlvdXRfYmUzMigmZHIuZGl1X3JlZy0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOwotCW91dF9iZTMyKCZkci5kaXVfcmVnLT5kZXNjWzJdLCBtYWNoaW5lX2RhdGEtPmR1bW15X2FkLT5wYWRkcik7CisJb3V0X2JlMzIoJm1hY2hpbmVfZGF0YS0+ZGl1X3JlZy0+ZGVzY1sxXSwgbWFjaGluZV9kYXRhLT5kdW1teV9hZC0+cGFkZHIpOworCW91dF9iZTMyKCZtYWNoaW5lX2RhdGEtPmRpdV9yZWctPmRlc2NbMl0sIG1hY2hpbmVfZGF0YS0+ZHVtbXlfYWQtPnBhZGRyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKSB7CiAJCW1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldLT5maXguc21lbV9zdGFydCA9IDA7CiAJCW1mYmkgPSBtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXS0+cGFyOwotCQltZmJpLT5hZCA9IChzdHJ1Y3QgZGl1X2FkICopKCh1MzIpcG9vbC5hZC52YWRkcgotCQkJCQkrIHBvb2wuYWQub2Zmc2V0KSArIGk7Ci0JCW1mYmktPmFkLT5wYWRkciA9IHBvb2wuYWQucGFkZHIgKyBpICogc2l6ZW9mKHN0cnVjdCBkaXVfYWQpOworCQltZmJpLT5hZCA9IChzdHJ1Y3QgZGl1X2FkICopKCh1MzIpbWFjaGluZV9kYXRhLT5hZC52YWRkcgorCQkJCQkrIG1hY2hpbmVfZGF0YS0+YWQub2Zmc2V0KSArIGk7CisJCW1mYmktPmFkLT5wYWRkciA9CisJCQltYWNoaW5lX2RhdGEtPmFkLnBhZGRyICsgaSAqIHNpemVvZihzdHJ1Y3QgZGl1X2FkKTsKIAkJcmV0ID0gaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXSk7CiAJCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJm9mZGV2LT5kZXYsCi0JCQkJIkZhaWxlZCB0byByZWdpc3RlciBmcmFtZWJ1ZmZlciAlZFxuIiwKLQkJCQlpKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBmYiAlZFxuIiwgaSk7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YS0+aXJxKSkgewotCQlkZXZfZXJyKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvWzBdLT5kZXYsCi0JCQkiY291bGQgbm90IHJlcXVlc3QgaXJxIGZvciBkaXUuIik7CisJaWYgKHJlcXVlc3RfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNsYWltIGlycVxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0xNjE2LDI5ICsxNjI5LDI4IEBACiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMF0tPmRldiwKIAkJCQkgICZtYWNoaW5lX2RhdGEtPmRldl9hdHRyKTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1swXS0+ZGV2LAotCQkJImNvdWxkIG5vdCBjcmVhdGUgc3lzZnMgJXMgZmlsZVxuIiwKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyBmaWxlICVzXG4iLAogCQkJbWFjaGluZV9kYXRhLT5kZXZfYXR0ci5hdHRyLm5hbWUpOwogCX0KIAotCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgbWFjaGluZV9kYXRhKTsKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFjaGluZV9kYXRhKTsKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0JZm9yIChpID0gQVJSQVlfU0laRShtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mbyk7Ci0JCWkgPiAwOyBpLS0pCi0JCXVuaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpIC0gMV0pOwotCWlmIChwb29sLmFkLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuYWQsCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm8pOyBpKyspCisJCXVuaW5zdGFsbF9mYihtYWNoaW5lX2RhdGEtPmZzbF9kaXVfaW5mb1tpXSk7CisKKwlpZiAobWFjaGluZV9kYXRhLT5hZC52YWRkcikKKwkJZnJlZV9idWYoJnBkZXYtPmRldiwgJm1hY2hpbmVfZGF0YS0+YWQsCiAJCQkgc2l6ZW9mKHN0cnVjdCBkaXVfYWQpICogRlNMX0FPSV9OVU0sIDgpOwotCWlmIChwb29sLmdhbW1hLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuZ2FtbWEsIDc2OCwgMzIpOwotCWlmIChwb29sLmN1cnNvci52YWRkcikKLQkJZnJlZV9idWYoJm9mZGV2LT5kZXYsICZwb29sLmN1cnNvciwgTUFYX0NVUlMgKiBNQVhfQ1VSUyAqIDIsCi0JCQkgMzIpOworCWlmIChtYWNoaW5lX2RhdGEtPmdhbW1hLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5nYW1tYSwgNzY4LCAzMik7CisJaWYgKG1hY2hpbmVfZGF0YS0+Y3Vyc29yLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5jdXJzb3IsCisJCQkgTUFYX0NVUlMgKiBNQVhfQ1VSUyAqIDIsIDMyKTsKIAlpZiAobWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCkKIAkJZnNsX2RpdV9mcmVlKG1hY2hpbmVfZGF0YS0+ZHVtbXlfYW9pX3ZpcnQsIDY0KTsKLQlpb3VubWFwKGRyLmRpdV9yZWcpOworCWlvdW5tYXAobWFjaGluZV9kYXRhLT5kaXVfcmVnKTsKIAogZXJyb3IyOgogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQpAQCAtMTY0OSwyOCArMTY2MSwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIGludCBmc2xfZGl1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKK3N0YXRpYyBpbnQgZnNsX2RpdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZnNsX2RpdV9kYXRhICptYWNoaW5lX2RhdGE7CiAJaW50IGk7CiAKLQltYWNoaW5lX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOworCW1hY2hpbmVfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAlkaXNhYmxlX2xjZGMobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9bMF0pOwotCWZyZWVfaXJxX2xvY2FsKG1hY2hpbmVfZGF0YS0+aXJxKTsKLQlmb3IgKGkgPSBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSA+IDA7IGktLSkKLQkJdW5pbnN0YWxsX2ZiKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2kgLSAxXSk7Ci0JaWYgKHBvb2wuYWQudmFkZHIpCi0JCWZyZWVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5hZCwKKwlmcmVlX2lycV9sb2NhbChtYWNoaW5lX2RhdGEpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQorCQl1bmluc3RhbGxfZmIobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pOworCWlmIChtYWNoaW5lX2RhdGEtPmFkLnZhZGRyKQorCQlmcmVlX2J1ZigmcGRldi0+ZGV2LCAmbWFjaGluZV9kYXRhLT5hZCwKIAkJCSBzaXplb2Yoc3RydWN0IGRpdV9hZCkgKiBGU0xfQU9JX05VTSwgOCk7Ci0JaWYgKHBvb2wuZ2FtbWEudmFkZHIpCi0JCWZyZWVfYnVmKCZvZmRldi0+ZGV2LCAmcG9vbC5nYW1tYSwgNzY4LCAzMik7Ci0JaWYgKHBvb2wuY3Vyc29yLnZhZGRyKQotCQlmcmVlX2J1Zigmb2ZkZXYtPmRldiwgJnBvb2wuY3Vyc29yLCBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwKLQkJCSAzMik7CisJaWYgKG1hY2hpbmVfZGF0YS0+Z2FtbWEudmFkZHIpCisJCWZyZWVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmdhbW1hLCA3NjgsIDMyKTsKKwlpZiAobWFjaGluZV9kYXRhLT5jdXJzb3IudmFkZHIpCisJCWZyZWVfYnVmKCZwZGV2LT5kZXYsICZtYWNoaW5lX2RhdGEtPmN1cnNvciwKKwkJCSBNQVhfQ1VSUyAqIE1BWF9DVVJTICogMiwgMzIpOwogCWlmIChtYWNoaW5lX2RhdGEtPmR1bW15X2FvaV92aXJ0KQogCQlmc2xfZGl1X2ZyZWUobWFjaGluZV9kYXRhLT5kdW1teV9hb2lfdmlydCwgNjQpOwotCWlvdW5tYXAoZHIuZGl1X3JlZyk7CisJaW91bm1hcChtYWNoaW5lX2RhdGEtPmRpdV9yZWcpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvKTsgaSsrKQogCQlpZiAobWFjaGluZV9kYXRhLT5mc2xfZGl1X2luZm9baV0pCiAJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKG1hY2hpbmVfZGF0YS0+ZnNsX2RpdV9pbmZvW2ldKTsKQEAgLTE2OTIsOCArMTcwMyw3IEBACiAJCWlmICghKm9wdCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXN0cm5jbXAob3B0LCAibW9uaXRvcj0iLCA4KSkgewotCQkJaWYgKCFzdHJpY3Rfc3RydG91bChvcHQgKyA4LCAxMCwgJnZhbCkgJiYgKHZhbCA8PSAyKSkKLQkJCQltb25pdG9yX3BvcnQgPSB2YWw7CisJCQltb25pdG9yX3BvcnQgPSBmc2xfZGl1X25hbWVfdG9fcG9ydChvcHQgKyA4KTsKIAkJfSBlbHNlIGlmICghc3RybmNtcChvcHQsICJicHA9IiwgNCkpIHsKIAkJCWlmICghc3RyaWN0X3N0cnRvdWwob3B0ICsgNCwgMTAsICZ2YWwpKQogCQkJCWRlZmF1bHRfYnBwID0gdmFsOwpAQCAtMTcyMCw3ICsxNzMwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX2RpdV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZnNsX2RpdSIsCisJCS5uYW1lID0gImZzbC1kaXUtZmIiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gZnNsX2RpdV9tYXRjaCwKIAl9LApAQCAtMTc0Niw0OCArMTc1Niw1NCBAQAogCWlmIChmYl9nZXRfb3B0aW9ucygiZnNsZmIiLCAmb3B0aW9uKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZnNsX2RpdV9zZXR1cChvcHRpb24pOworI2Vsc2UKKwltb25pdG9yX3BvcnQgPSBmc2xfZGl1X25hbWVfdG9fcG9ydChtb25pdG9yX3N0cmluZyk7CiAjZW5kaWYKLQlwcmludGsoS0VSTl9JTkZPICJGcmVlc2NhbGUgRElVIGRyaXZlclxuIik7CisJcHJfaW5mbygiRnJlZXNjYWxlIERpc3BsYXkgSW50ZXJmYWNlIFVuaXQgKERJVSkgZnJhbWVidWZmZXIgZHJpdmVyXG4iKTsKIAogI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAlpZiAoIW5wKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyOiBjYW4ndCBmaW5kIGRldmljZSBub2RlICdjcHUnXG4iKTsKKwkJcHJfZXJyKCJmc2wtZGl1LWZiOiBjYW4ndCBmaW5kICdjcHUnIGRldmljZSBub2RlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImQtY2FjaGUtc2l6ZSIsIE5VTEwpOwogCWlmIChwcm9wID09IE5VTEwpIHsKKwkJcHJfZXJyKCJmc2wtZGl1LWZiOiBtaXNzaW5nICdkLWNhY2hlLXNpemUnIHByb3BlcnR5JyAiCisJCSAgICAgICAiaW4gJ2NwdScgbm9kZVxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogRnJlZXNjYWxlIFBMUlUgcmVxdWlyZXMgMTMvOCB0aW1lcyB0aGUgY2FjaGUgc2l6ZSB0byBkbyBhIHByb3BlcgotCSAgIGRpc3BsYWNlbWVudCBmbHVzaAorCS8qCisJICogRnJlZXNjYWxlIFBMUlUgcmVxdWlyZXMgMTMvOCB0aW1lcyB0aGUgY2FjaGUgc2l6ZSB0byBkbyBhIHByb3BlcgorCSAqIGRpc3BsYWNlbWVudCBmbHVzaAogCSAqLwotCWNvaGVyZW5jZV9kYXRhX3NpemUgPSAqcHJvcCAqIDEzOworCWNvaGVyZW5jZV9kYXRhX3NpemUgPSBiZTMyX3RvX2NwdXAocHJvcCkgKiAxMzsKIAljb2hlcmVuY2VfZGF0YV9zaXplIC89IDg7CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1saW5lLXNpemUiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKSB7CisJCXByX2VycigiZnNsLWRpdS1mYjogbWlzc2luZyAnZC1jYWNoZS1saW5lLXNpemUnIHByb3BlcnR5JyAiCisJCSAgICAgICAiaW4gJ2NwdScgbm9kZVxuIik7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWRfY2FjaGVfbGluZV9zaXplID0gKnByb3A7CisJZF9jYWNoZV9saW5lX3NpemUgPSBiZTMyX3RvX2NwdXAocHJvcCk7CiAKIAlvZl9ub2RlX3B1dChucCk7CiAJY29oZXJlbmNlX2RhdGEgPSB2bWFsbG9jKGNvaGVyZW5jZV9kYXRhX3NpemUpOwogCWlmICghY29oZXJlbmNlX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogI2VuZGlmCisKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9kaXVfZHJpdmVyKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJImZzbC1kaXU6IGZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkcml2ZXJcbiIpOworCQlwcl9lcnIoImZzbC1kaXUtZmI6IGZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybSBkcml2ZXJcbiIpOwogI2lmIGRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIAkJdmZyZWUoY29oZXJlbmNlX2RhdGEpOwogI2VuZGlmCi0JCWlvdW5tYXAoZHIuZGl1X3JlZyk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xODExLDggKzE4MjcsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhtb2RlLAogCSJTcGVjaWZ5IHJlc29sdXRpb24gYXMgXCI8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl1cIiAiKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChicHAsIGRlZmF1bHRfYnBwLCB1bG9uZywgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGJwcCwgIlNwZWNpZnkgYml0LXBlci1waXhlbCBpZiBub3Qgc3BlY2lmaWVkIG1vZGUiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChtb25pdG9yLCBtb25pdG9yX3BvcnQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1vbml0b3IsCi0JIlNwZWNpZnkgdGhlIG1vbml0b3IgcG9ydCAoMCwgMSBvciAyKSBpZiBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIik7CitNT0RVTEVfUEFSTV9ERVNDKGJwcCwgIlNwZWNpZnkgYml0LXBlci1waXhlbCBpZiBub3Qgc3BlY2lmaWVkIGluICdtb2RlJyIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1vbml0b3IsIG1vbml0b3Jfc3RyaW5nLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vbml0b3IsICJTcGVjaWZ5IHRoZSBtb25pdG9yIHBvcnQgIgorCSIoXCJkdmlcIiwgXCJsdmRzXCIsIG9yIFwiZGx2ZHNcIikgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2czNjRmYi5jIGIvZHJpdmVycy92aWRlby9nMzY0ZmIuYwppbmRleCBkNjYyMzE3Li4yMjM4OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2czNjRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZzM2NGZiLmMKQEAgLTE0OSwxMCArMTQ5LDExIEBACiBzdGF0aWMgaW50IGczNjRmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgCiAJCQkgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKQorCWlmICh2YXItPnhvZmZzZXQgfHwKKwkgICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSoodW5zaWduZWQgaW50ICopIFRPUF9SRUcgPSB2YXItPnlvZmZzZXQgKiB2YXItPnhyZXM7CisJKih1bnNpZ25lZCBpbnQgKikgVE9QX1JFRyA9IHZhci0+eW9mZnNldCAqIGluZm8tPnZhci54cmVzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dydmdhLmMgYi9kcml2ZXJzL3ZpZGVvL2dydmdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZTAyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vZ3J2Z2EuYwpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIERyaXZlciBmb3IgQWVyb2ZsZXggR2Fpc2xlciBTVkdBQ1RSTCBmcmFtZWJ1ZmZlciBkZXZpY2UuCisgKgorICogMjAxMSAoYykgQWVyb2ZsZXggR2Fpc2xlciBBQgorICoKKyAqIEZ1bGwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29yZSBjYW4gYmUgZm91bmQgaGVyZToKKyAqIGh0dHA6Ly93d3cuZ2Fpc2xlci5jb20vcHJvZHVjdHMvZ3JsaWIvZ3JpcC5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENvbnRyaWJ1dG9yczogS3Jpc3RvZmZlciBHbGVtYm8gPGtyaXN0b2ZmZXJAZ2Fpc2xlci5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKK3N0cnVjdCBncnZnYV9yZWdzIHsKKwl1MzIgc3RhdHVzOyAJCS8qIDB4MDAgKi8KKwl1MzIgdmlkZW9fbGVuZ3RoOyAJLyogMHgwNCAqLworCXUzMiBmcm9udF9wb3JjaDsJLyogMHgwOCAqLworCXUzMiBzeW5jX2xlbmd0aDsJLyogMHgwQyAqLworCXUzMiBsaW5lX2xlbmd0aDsJLyogMHgxMCAqLworCXUzMiBmYl9wb3M7CQkvKiAweDE0ICovCisJdTMyIGNsa192ZWN0b3JbNF07CS8qIDB4MTggKi8KKwl1MzIgY2x1dDsJICAgICAgICAvKiAweDIwICovCit9OworCitzdHJ1Y3QgZ3J2Z2FfcGFyIHsKKwlzdHJ1Y3QgZ3J2Z2FfcmVncyAqcmVnczsKKwl1MzIgY29sb3JfcGFsZXR0ZVsxNl07ICAvKiAxNiBlbnRyeSBwc2V1ZG8gcGFsZXR0ZSB1c2VkIGJ5IGZiY29uIGluIHRydWUgY29sb3IgbW9kZSAqLworCWludCBjbGtfc2VsOworCWludCBmYl9hbGxvY2VkOyAgICAgICAgIC8qID0gMSBpZiBmcmFtZWJ1ZmZlciBpcyBhbGxvY2F0ZWQgaW4gbWFpbiBtZW1vcnkgKi8KK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgZ3J2Z2FfbW9kZWRiW10gPSB7CisgICAgeworCS8qIDY0MHg0ODAgQCA2MCBIeiAqLworCU5VTEwsIDYwLCA2NDAsIDQ4MCwgNDAwMDAsIDQ4LCAxNiwgMzksIDExLCA5NiwgMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA2MCBIeiAqLworCU5VTEwsIDYwLCA4MDAsIDYwMCwgMjUwMDAsIDg4LCA0MCwgMjMsIDEsIDEyOCwgNCwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA3MiBIeiAqLworCU5VTEwsIDcyLCA4MDAsIDYwMCwgMjAwMDAsIDY0LCA1NiwgMjMsIDM3LCAxMjAsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDYwIEh6ICovCisJTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODUsIDE2MCwgMjQsIDI5LCAzLCAxMzYsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0KKyB9OworCitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGdydmdhX2ZpeCBfX2luaXRkYXRhID0geworCS5pZCA9CQkiQUcgU1ZHQUNUUkwiLAorCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKKwkudmlzdWFsID0gICAgICAgRkJfVklTVUFMX1BTRVVET0NPTE9SLAorCS54cGFuc3RlcCA9CTAsCisJLnlwYW5zdGVwID0JMSwKKwkueXdyYXBzdGVwID0JMCwKKwkuYWNjZWwgPQlGQl9BQ0NFTF9OT05FLAorfTsKKworc3RhdGljIGludCBncnZnYV9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJaW50IGk7CisKKwlpZiAoIXZhci0+eHJlcykKKwkJdmFyLT54cmVzID0gMTsKKwlpZiAoIXZhci0+eXJlcykKKwkJdmFyLT55cmVzID0gMTsKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4KQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gODsKKwllbHNlIGlmICh2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDE2KQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAyNCkKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDI0OworCWVsc2UgaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gMzIpCisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAzMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSAyKnZhci0+eXJlczsKKworCWlmIChpbmZvLT5maXguc21lbV9sZW4pIHsKKwkJaWYgKCh2YXItPnlyZXNfdmlydHVhbCp2YXItPnhyZXNfdmlydHVhbCp2YXItPmJpdHNfcGVyX3BpeGVsLzgpID4gaW5mby0+Zml4LnNtZW1fbGVuKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogV2hpY2ggY2xvY2tzIHRoYXQgYXJlIGF2YWlsYWJsZSBjYW4gYmUgcmVhZCBvdXQgaW4gdGhlc2UgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8PSAzIDsgaSsrKSB7CisJCWlmICh2YXItPnBpeGNsb2NrID09IHBhci0+cmVncy0+Y2xrX3ZlY3RvcltpXSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8PSAzKQorCQlwYXItPmNsa19zZWwgPSBpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJdmFyLT5yZWQgICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHswLCA4LCAwfTsgICAgICAvKiBvZmZzZXQsIGxlbmd0aCwgbXNiLXJpZ2h0ICovCisJCXZhci0+Z3JlZW4gPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+Ymx1ZSAgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+dHJhbnNwID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezAsIDAsIDB9OworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZCAgID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezExLCA1LCAwfTsKKwkJdmFyLT5ncmVlbiA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHs1LCA2LCAwfTsKKwkJdmFyLT5ibHVlICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHswLCA1LCAwfTsKKwkJdmFyLT50cmFuc3AgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgMCwgMH07CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJdmFyLT5yZWQgICA9IChzdHJ1Y3QgZmJfYml0ZmllbGQpIHsxNiwgOCwgMH07CisJCXZhci0+Z3JlZW4gPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7OCwgOCwgMH07CisJCXZhci0+Ymx1ZSAgPSAoc3RydWN0IGZiX2JpdGZpZWxkKSB7MCwgOCwgMH07CisJCXZhci0+dHJhbnNwID0gKHN0cnVjdCBmYl9iaXRmaWVsZCkgezI0LCA4LCAwfTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3J2Z2Ffc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKworCXUzMiBmdW5jID0gMDsKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlfX3Jhd193cml0ZWwoKChpbmZvLT52YXIueXJlcyAtIDEpIDw8IDE2KSB8IChpbmZvLT52YXIueHJlcyAtIDEpLAorCQkgICAgICZwYXItPnJlZ3MtPnZpZGVvX2xlbmd0aCk7CisKKwlfX3Jhd193cml0ZWwoKGluZm8tPnZhci5sb3dlcl9tYXJnaW4gPDwgMTYpIHwgKGluZm8tPnZhci5yaWdodF9tYXJnaW4pLAorCQkgICAgICZwYXItPnJlZ3MtPmZyb250X3BvcmNoKTsKKworCV9fcmF3X3dyaXRlbCgoaW5mby0+dmFyLnZzeW5jX2xlbiA8PCAxNikgfCAoaW5mby0+dmFyLmhzeW5jX2xlbiksCisJCSAgICAgJnBhci0+cmVncy0+c3luY19sZW5ndGgpOworCisJX19yYXdfd3JpdGVsKCgoaW5mby0+dmFyLnlyZXMgKyBpbmZvLT52YXIubG93ZXJfbWFyZ2luICsgaW5mby0+dmFyLnVwcGVyX21hcmdpbiArIGluZm8tPnZhci52c3luY19sZW4gLSAxKSA8PCAxNikgfAorCQkgICAgIChpbmZvLT52YXIueHJlcyArIGluZm8tPnZhci5yaWdodF9tYXJnaW4gKyBpbmZvLT52YXIubGVmdF9tYXJnaW4gKyBpbmZvLT52YXIuaHN5bmNfbGVuIC0gMSksCisJCSAgICAgJnBhci0+cmVncy0+bGluZV9sZW5ndGgpOworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCWZ1bmMgPSAxOworCQlicmVhazsKKwljYXNlIDE2OgorCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJZnVuYyA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWZ1bmMgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlfX3Jhd193cml0ZWwoKHBhci0+Y2xrX3NlbCA8PCA2KSB8IChmdW5jIDw8IDQpIHwgMSwKKwkJICAgICAmcGFyLT5yZWdzLT5zdGF0dXMpOworCisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwqaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKS84OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdydmdhX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXI7CisJcGFyID0gaW5mby0+cGFyOworCisJaWYgKHJlZ25vID49IDI1NikJLyogU2l6ZSBvZiBDTFVUICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluZm8tPnZhci5ncmF5c2NhbGUpIHsKKwkJLyogZ3JheXNjYWxlID0gMC4zMCpSICsgMC41OSpHICsgMC4xMSpCICovCisJCXJlZCA9IGdyZWVuID0gYmx1ZSA9IChyZWQgKiA3NyArIGdyZWVuICogMTUxICsgYmx1ZSAqIDI4KSA+PiA4OworCX0KKworCisKKyNkZWZpbmUgQ05WVF9UT0hXKHZhbCwgd2lkdGgpICgoKCh2YWwpPDwod2lkdGgpKSsweDdGRkYtKHZhbCkpPj4xNikKKworCXJlZCAgICA9IENOVlRfVE9IVyhyZWQsICAgaW5mby0+dmFyLnJlZC5sZW5ndGgpOworCWdyZWVuICA9IENOVlRfVE9IVyhncmVlbiwgaW5mby0+dmFyLmdyZWVuLmxlbmd0aCk7CisJYmx1ZSAgID0gQ05WVF9UT0hXKGJsdWUsICBpbmZvLT52YXIuYmx1ZS5sZW5ndGgpOworCXRyYW5zcCA9IENOVlRfVE9IVyh0cmFuc3AsIGluZm8tPnZhci50cmFuc3AubGVuZ3RoKTsKKworI3VuZGVmIENOVlRfVE9IVworCisJLyogSW4gUFNFVURPQ09MT1Igd2UgdXNlIHRoZSBoYXJkd2FyZSBDTFVUICovCisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1BTRVVET0NPTE9SKQorCQlfX3Jhd193cml0ZWwoKHJlZ25vIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZSwKKwkJCSAgICAgJnBhci0+cmVncy0+Y2x1dCk7CisKKwkvKiBUcnVlY29sb3IgdXNlcyB0aGUgcHNldWRvIHBhbGV0dGUgKi8KKwllbHNlIGlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpIHsKKwkJdTMyIHY7CisJCWlmIChyZWdubyA+PSAxNikKKwkJCXJldHVybiAtRUlOVkFMOworCisKKwkJdiA9ICAgICAocmVkICAgIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCShncmVlbiAgPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJKGJsdWUgICA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpICB8CisJCQkodHJhbnNwIDw8IGluZm8tPnZhci50cmFuc3Aub2Zmc2V0KTsKKworCQkoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB2OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncnZnYV9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGdydmdhX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmluZm8tPmZpeDsKKwl1MzIgYmFzZV9hZGRyOworCisJaWYgKHZhci0+eG9mZnNldCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJhc2VfYWRkciA9IGZpeC0+c21lbV9zdGFydCArICh2YXItPnlvZmZzZXQgKiBmaXgtPmxpbmVfbGVuZ3RoKTsKKwliYXNlX2FkZHIgJj0gfjNVTDsKKworCS8qIFNldCBmcmFtZWJ1ZmZlciBiYXNlIGFkZHJlc3MgICovCisJX19yYXdfd3JpdGVsKGJhc2VfYWRkciwKKwkJICAgICAmcGFyLT5yZWdzLT5mYl9wb3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGdydmdhX29wcyA9IHsKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyICAgPSBncnZnYV9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBncnZnYV9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcgICA9IGdydmdhX3NldGNvbHJlZywKKwkuZmJfcGFuX2Rpc3BsYXkgPSBncnZnYV9wYW5fZGlzcGxheSwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBncnZnYV9wYXJzZV9jdXN0b20oY2hhciAqb3B0aW9ucywKKwkJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqc2NyZWVuZGF0YSkKK3sKKwljaGFyICp0aGlzX29wdDsKKwlpbnQgY291bnQgPSAwOworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAtMTsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIgIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNvdW50KSB7CisJCWNhc2UgMDoKKwkJCXNjcmVlbmRhdGEtPnBpeGNsb2NrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzY3JlZW5kYXRhLT54cmVzID0gc2NyZWVuZGF0YS0+eHJlc192aXJ0dWFsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzY3JlZW5kYXRhLT5yaWdodF9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXNjcmVlbmRhdGEtPmhzeW5jX2xlbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0LCBOVUxMLCAwKTsKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJc2NyZWVuZGF0YS0+bGVmdF9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXNjcmVlbmRhdGEtPnlyZXMgPSBzY3JlZW5kYXRhLT55cmVzX3ZpcnR1YWwgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXNjcmVlbmRhdGEtPmxvd2VyX21hcmdpbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0LCBOVUxMLCAwKTsKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJc2NyZWVuZGF0YS0+dnN5bmNfbGVuID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlzY3JlZW5kYXRhLT51cHBlcl9tYXJnaW4gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCwgTlVMTCwgMCk7CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCXNjcmVlbmRhdGEtPmJpdHNfcGVyX3BpeGVsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQsIE5VTEwsIDApOworCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXNjcmVlbmRhdGEtPmFjdGl2YXRlICA9IEZCX0FDVElWQVRFX05PVzsKKwlzY3JlZW5kYXRhLT52bW9kZSAgICAgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncnZnYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyB2aXJ0dWFsX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZ3J2Z2FfZml4X2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgcGh5c2ljYWxfc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZ3J2Z2FfbWVtX3NpemUgPSAwOworCXN0cnVjdCBncnZnYV9wYXIgKnBhciA9IE5VTEw7CisJY2hhciAqb3B0aW9ucyA9IE5VTEwsICptb2RlX29wdCA9IE5VTEw7CisKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBncnZnYV9wYXIpLCAmZGV2LT5kZXYpOworCWlmICghaW5mbykgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZyYW1lYnVmZmVyX2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEV4cGVjdGluZzogImdydmdhOiBtb2Rlc3RyaW5nLCBbYWRkcjo8ZnJhbWVidWZmZXIgcGh5c2ljYWwgYWRkcmVzcz5dLCBbc2l6ZTo8ZnJhbWVidWZmZXIgc2l6ZT5dCisJICoKKwkgKiBJZiBtb2Rlc3RyaW5nIGlzIGN1c3RvbTo8Y3VzdG9tIG1vZGUgc3RyaW5nPiB3ZSBwYXJzZSB0aGUgc3RyaW5nIHdoaWNoIHRoZW4gY29udGFpbnMgYWxsIHZpZGVvcGFyYW1ldGVycworCSAqIElmIGFkZHJlc3MgaXMgbGVmdCBvdXQsIHdlIGFsbG9jYXRlIG1lbW9yeSwKKwkgKiBpZiBzaXplIGlzIGxlZnQgb3V0IHdlIG9ubHkgYWxsb2NhdGUgZW5vdWdoIHRvIHN1cHBvcnQgdGhlIGdpdmVuIG1vZGUuCisJICovCisJaWYgKGZiX2dldF9vcHRpb25zKCJncnZnYSIsICZvcHRpb25zKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlvcHRpb25zID0gICI2NDB4NDgwLThANjAiOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqdGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIik7CisKKwkJaWYgKCF0aGlzX29wdCkKKwkJCWJyZWFrOworCisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgImN1c3RvbSIsIDYpKSB7CisJCQlpZiAoZ3J2Z2FfcGFyc2VfY3VzdG9tKHRoaXNfb3B0LCAmaW5mby0+dmFyKSA8IDApIHsKKwkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBwYXJzZSBjdXN0b20gbW9kZSAoJXMpLlxuIiwgdGhpc19vcHQpOworCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnIxOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiYWRkciIsIDQpKQorCQkJZ3J2Z2FfZml4X2FkZHIgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDE2KTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJzaXplIiwgNCkpCisJCQlncnZnYV9tZW1fc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CisJCWVsc2UKKwkJCW1vZGVfb3B0ID0gdGhpc19vcHQ7CisJfQorCisJcGFyID0gaW5mby0+cGFyOworCWluZm8tPmZib3BzID0gJmdydmdhX29wczsKKwlpbmZvLT5maXggPSBncnZnYV9maXg7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPmNvbG9yX3BhbGV0dGU7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19QQVJUSUFMX1BBTl9PSyB8IEZCSU5GT19IV0FDQ0VMX1lQQU47CisJaW5mby0+Zml4LnNtZW1fbGVuID0gZ3J2Z2FfbWVtX3NpemU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSwgImdybGliLXN2Z2FjdHJsIHJlZ3MiKSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgInJlZ2lzdGVycyBhbHJlYWR5IG1hcHBlZFxuIik7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcGFyLT5yZWdzID0gb2ZfaW9yZW1hcCgmZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCSAgICAgICByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSwKKwkJCSAgICAgICAiZ3JsaWItc3ZnYWN0cmwgcmVncyIpOworCisJaWYgKCFwYXItPnJlZ3MpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwlyZXR2YWwgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSB3aXRoIGZiX2FsbG9jX2NtYXBcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjI7CisJfQorCisJaWYgKG1vZGVfb3B0KSB7CisJCXJldHZhbCA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlX29wdCwKKwkJCQkgICAgICBncnZnYV9tb2RlZGIsIHNpemVvZihncnZnYV9tb2RlZGIpLCAmZ3J2Z2FfbW9kZWRiWzBdLCA4KTsKKwkJaWYgKCFyZXR2YWwgfHwgcmV0dmFsID09IDQpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjM7CisJCX0KKwl9CisKKwlpZiAoIWdydmdhX21lbV9zaXplKQorCQlncnZnYV9tZW1fc2l6ZSA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKiBpbmZvLT52YXIueXJlc192aXJ0dWFsICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLzg7CisKKwlpZiAoZ3J2Z2FfZml4X2FkZHIpIHsKKwkJLyogR290IGZyYW1lYnVmZmVyIGJhc2UgYWRkcmVzcyBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKworCQlwaHlzaWNhbF9zdGFydCA9IGdydmdhX2ZpeF9hZGRyOworCisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNpY2FsX3N0YXJ0LCBncnZnYV9tZW1fc2l6ZSwgZGV2LT5uYW1lKSkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycjM7CisJCX0KKworCQl2aXJ0dWFsX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGh5c2ljYWxfc3RhcnQsIGdydmdhX21lbV9zaXplKTsKKworCQlpZiAoIXZpcnR1YWxfc3RhcnQpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiZXJyb3IgbWFwcGluZyBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyNDsKKwkJfQorCX0gZWxzZSB7CS8qIEFsbG9jYXRlIGZyYW1idWZmZXIgbWVtb3J5ICovCisKKwkJdW5zaWduZWQgbG9uZyBwYWdlOworCisJCXZpcnR1YWxfc3RhcnQgPSAodW5zaWduZWQgbG9uZykgX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BLAorCQkJCQkJCQkgZ2V0X29yZGVyKGdydmdhX21lbV9zaXplKSk7CisJCWlmICghdmlydHVhbF9zdGFydCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBtZW1vcnkgKCVsdSBieXRlcylcbiIsCisJCQkJZ3J2Z2FfbWVtX3NpemUpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyMzsKKwkJfQorCisJCXBoeXNpY2FsX3N0YXJ0ID0gZG1hX21hcF9zaW5nbGUoJmRldi0+ZGV2LCAodm9pZCAqKXZpcnR1YWxfc3RhcnQsIGdydmdhX21lbV9zaXplLCBETUFfVE9fREVWSUNFKTsKKworCQkvKiBTZXQgcGFnZSByZXNlcnZlZCBzbyB0aGF0IG1tYXAgd2lsbCB3b3JrLiBUaGlzIGlzIG5lY2Vzc2FyeQorCQkgKiBzaW5jZSB3ZSdsbCBiZSByZW1hcHBpbmcgbm9ybWFsIG1lbW9yeS4KKwkJICovCisJCWZvciAocGFnZSA9IHZpcnR1YWxfc3RhcnQ7CisJCSAgICAgcGFnZSA8IFBBR0VfQUxJR04odmlydHVhbF9zdGFydCArIGdydmdhX21lbV9zaXplKTsKKwkJICAgICBwYWdlICs9IFBBR0VfU0laRSkgeworCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwYWdlKSk7CisJCX0KKworCQlwYXItPmZiX2FsbG9jZWQgPSAxOworCX0KKworCW1lbXNldCgodW5zaWduZWQgbG9uZyAqKSB2aXJ0dWFsX3N0YXJ0LCAwLCBncnZnYV9tZW1fc2l6ZSk7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyIF9faW9tZW0gKikgdmlydHVhbF9zdGFydDsKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IHBoeXNpY2FsX3N0YXJ0OworCWluZm8tPmZpeC5zbWVtX2xlbiAgID0gZ3J2Z2FfbWVtX3NpemU7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBpbmZvKTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwKKwkJICJBZXJvZmxleCBHYWlzbGVyIGZyYW1lYnVmZmVyIGRldmljZSAoZmIlZCksICVkeCVkLSVkLCB1c2luZyAlbHVLIG9mIHZpZGVvIG1lbW9yeSBAICVwXG4iLAorCQkgaW5mby0+bm9kZSwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCisJCSBncnZnYV9tZW1fc2l6ZSA+PiAxMCwgaW5mby0+c2NyZWVuX2Jhc2UpOworCisJcmV0dmFsID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZnJhbWVidWZmZXJcbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisJX19yYXdfd3JpdGVsKHBoeXNpY2FsX3N0YXJ0LCAmcGFyLT5yZWdzLT5mYl9wb3MpOworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbCgmcGFyLT5yZWdzLT5zdGF0dXMpIHwgMSwgIC8qIEVuYWJsZSBmcmFtZWJ1ZmZlciAqLworCQkgICAgICZwYXItPnJlZ3MtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKKworZXJyNDoKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoZ3J2Z2FfZml4X2FkZHIpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBoeXNpY2FsX3N0YXJ0LCBncnZnYV9tZW1fc2l6ZSk7CisJCWlvdW5tYXAoKHZvaWQgKil2aXJ0dWFsX3N0YXJ0KTsKKwl9IGVsc2UKKwkJa2ZyZWUoKHZvaWQgKil2aXJ0dWFsX3N0YXJ0KTsKK2VycjM6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKK2VycjI6CisJb2ZfaW91bm1hcCgmZGV2LT5yZXNvdXJjZVswXSwgcGFyLT5yZWdzLAorCQkgICByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSk7CitlcnIxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZkZXYtPnJlc291cmNlWzBdKSk7CitlcnI6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGdydmdhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJmRldmljZS0+ZGV2KTsKKwlzdHJ1Y3QgZ3J2Z2FfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlpZiAoaW5mbykgeworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCisJCW9mX2lvdW5tYXAoJmRldmljZS0+cmVzb3VyY2VbMF0sIHBhci0+cmVncywKKwkJCSAgIHJlc291cmNlX3NpemUoJmRldmljZS0+cmVzb3VyY2VbMF0pKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldmljZS0+cmVzb3VyY2VbMF0uc3RhcnQsIHJlc291cmNlX3NpemUoJmRldmljZS0+cmVzb3VyY2VbMF0pKTsKKworCQlpZiAoIXBhci0+ZmJfYWxsb2NlZCkgeworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGluZm8tPmZpeC5zbWVtX3N0YXJ0LCBpbmZvLT5maXguc21lbV9sZW4pOworCQkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisJCX0gZWxzZQorCQkJa2ZyZWUoKHZvaWQgKilpbmZvLT5zY3JlZW5fYmFzZSk7CisKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZkZXZpY2UtPmRldiwgTlVMTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN2Z2FjdHJsX29mX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJHQUlTTEVSX1NWR0FDVFJMIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiMDFfMDYzIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN2Z2FjdHJsX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3J2Z2FfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImdybGliLXN2Z2FjdHJsIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHN2Z2FjdHJsX29mX21hdGNoLAorCX0sCisJLnByb2JlCQk9IGdydmdhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3J2Z2FfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgZ3J2Z2FfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdydmdhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncnZnYV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdydmdhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdydmdhX2luaXQpOworbW9kdWxlX2V4aXQoZ3J2Z2FfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFlcm9mbGV4IEdhaXNsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWVyb2ZsZXggR2Fpc2xlciBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYyBiL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCmluZGV4IDg5NmU1M2QuLjBmYWQyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCkBAIC01NDMsOCArNTQzLDggQEAKIAogCWlmICh2YXItPnhvZmZzZXQgJiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwgfHwKLQkgICAgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpCisJaWYgKHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAorCSAgICB2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd3JpdGVyZWcocGFyLCBSRUZSRVNIX1NUQVJULCAodmFyLT54b2Zmc2V0IDw8IDE2KSB8IHZhci0+eW9mZnNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hnYWZiLmMKaW5kZXggNDA1MjcxOC4uNDM5NDM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oZ2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGdhZmIuYwpAQCAtNDIyLDggKzQyMiw4IEBACiAJCSAgICB2YXItPnhvZmZzZXQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbAotCQkgfHwgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbAorCQlpZiAodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsCisJCSB8fCB2YXItPnlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwKIAkJIHx8IHZhci0+eW9mZnNldCAlIDgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ltc3R0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCmluZGV4IGVmYjJjMTAuLjgxNDkzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW1zdHRmYi5jCkBAIC03NDksNyArNzQ5LDcgQEAKIHsKIAlzdHJ1Y3QgaW1zdHRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAJX191MzIgb2ZmID0gdmFyLT55b2Zmc2V0ICogKGluZm8tPmZpeC5saW5lX2xlbmd0aCA+PiAzKQotCQkgICAgKyAoKHZhci0+eG9mZnNldCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpKSA+PiAzKTsKKwkJICAgICsgKCh2YXItPnhvZmZzZXQgKiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDMpKSA+PiAzKTsKIAl3cml0ZV9yZWdfbGUzMihwYXItPmRjX3JlZ3MsIFNTUiwgb2ZmKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCmluZGV4IDM4MDY1Y2YuLmZiYWQ2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTM5MCwxMiArMzkwLDEyIEBACiAJeG9mZnNldCA9IFJPVU5EX0RPV05fVE8odmFyLT54b2Zmc2V0LCA4KTsKIAl5b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwogCi0JaWYgKCh4b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwpIHx8Ci0JICAgICh5b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpKQorCWlmICgoeG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCkgfHwKKwkgICAgKHlvZmZzZXQgKyBpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9mZnNldCA9ICh5b2Zmc2V0ICogZGluZm8tPnBpdGNoKSArCi0JCSAoeG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwpIC8gODsKKwkJICh4b2Zmc2V0ICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSAvIDg7CiAKIAlvZmZzZXQgKz0gZGluZm8tPmZiLm9mZnNldCA8PCAxMjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHgtaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYwppbmRleCBiOTUzMDk5Li4yNzM3NjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eC1pMmMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgIm1iODYyeHhmYi5oIgogI2luY2x1ZGUgIm1iODYyeHhfcmVnLmgiCkBAIC0yMyw3ICsyNCw3IEBACiAJdTMyIHJlZzsKIAogCWRvIHsKLQkJdWRlbGF5KDEpOworCQl1ZGVsYXkoMTApOwogCQlyZWcgPSBpbnJlZyhpMmMsIEdDX0kyQ19CQ1IpOwogCQlpZiAocmVnICYgKEkyQ19JTlQgfCBJMkNfQkVSKSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jIGIvZHJpdmVycy92aWRlby9tYjg2Mnh4L21iODYyeHhmYmRydi5jCmluZGV4IGVlMWRlM2UuLjExYTdhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWI4NjJ4eC9tYjg2Mnh4ZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL21iODYyeHgvbWI4NjJ4eGZiZHJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTI3OCw3ICsyNzksNyBAQAogCXJlZyA9IHBhY2sodmFyLT55b2Zmc2V0LCB2YXItPnhvZmZzZXQpOwogCW91dHJlZyhkaXNwLCBHQ19MMFdZX0wwV1gsIHJlZyk7CiAKLQlyZWcgPSBwYWNrKHZhci0+eXJlc192aXJ0dWFsLCB2YXItPnhyZXNfdmlydHVhbCk7CisJcmVnID0gcGFjayhpbmZvLT52YXIueXJlc192aXJ0dWFsLCBpbmZvLT52YXIueHJlc192aXJ0dWFsKTsKIAlvdXRyZWcoZGlzcCwgR0NfTDBXSF9MMFdXLCByZWcpOwogCXJldHVybiAwOwogfQpAQCAtNzM3LDcgKzczOCw3IEBACiAJaWYgKG1iODYyeHhfZ2RjX2luaXQocGFyKSkKIAkJZ290byBpb191bm1hcDsKIAotCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgbWI4NjJ4eF9pbnRyLCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgbWI4NjJ4eF9pbnRyLCAwLAogCQkJRFJWX05BTUUsICh2b2lkICopcGFyKSkgewogCQlkZXZfZXJyKGRldiwgIkNhbm5vdCByZXF1ZXN0IGlycVxuIik7CiAJCWdvdG8gaW9fdW5tYXA7CkBAIC0xMDczLDcgKzEwNzQsNyBAQAogCWlmIChtYjg2Mnh4X3BjaV9nZGNfaW5pdChwYXIpKQogCQlnb3RvIGlvX3VubWFwOwogCi0JaWYgKHJlcXVlc3RfaXJxKHBhci0+aXJxLCBtYjg2Mnh4X2ludHIsIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKwlpZiAocmVxdWVzdF9pcnEocGFyLT5pcnEsIG1iODYyeHhfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQlEUlZfTkFNRSwgKHZvaWQgKilwYXIpKSB7CiAJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlcXVlc3QgaXJxXG4iKTsKIAkJZ290byBpb191bm1hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGZiLmMgYi9kcml2ZXJzL3ZpZGVvL21ieC9tYnhmYi5jCmluZGV4IGFmZWE5YWIuLjZjZTM0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9tYngvbWJ4ZmIuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgInJlZ3MuaCIKICNpbmNsdWRlICJyZWdfYml0cy5oIgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0X2Jhc2VfMjcwMDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnZpcnRfYmFzZV8yNzAwOwogCiAjZGVmaW5lIHdyaXRlX3JlZyh2YWwsIHJlZykgZG8geyB3cml0ZWwoKHZhbCksIChyZWcpKTsgfSB3aGlsZSgwKQogCkBAIC04NTAsNyArODUwLDcgQEAKIHsKIAkvKiBtYWtlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgZW50ZXIgc2VsZi1yZWZyZXNoIG1vZGUgKi8KIAl3cml0ZV9yZWdfZGx5KExNUFdSX01DX1BXUl9TUk0sIExNUFdSKTsKLQl3aGlsZSAoTE1QV1JTVEFUICE9IExNUFdSU1RBVF9NQ19QV1JfU1JNKQorCXdoaWxlIChyZWFkbChMTVBXUlNUQVQpICE9IExNUFdSU1RBVF9NQ19QV1JfU1JNKQogCQk7IC8qIGVtcHR5IHN0YXRlbWVudCAqLwogCiAJLyogcmVzZXQgdGhlIGRldmljZSwgc2luY2UgaXQncyBpbml0aWFsIHN0YXRlIGlzICdtb3N0bHkgc2xlZXBpbmcnICovCkBAIC05NDYsNyArOTQ2LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnIzOwogCX0KLQl2aXJ0X2Jhc2VfMjcwMCA9ICh1bnNpZ25lZCBsb25nKW1mYmktPnJlZ192aXJ0X2FkZHI7CisJdmlydF9iYXNlXzI3MDAgPSBtZmJpLT5yZWdfdmlydF9hZGRyOwogCiAJbWZiaS0+ZmJfdmlydF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1mYmktPmZiX3BoeXNfYWRkciwKIAkJCQkJICAgICByZXNfc2l6ZShtZmJpLT5mYl9yZXEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IGNiMTc1ZmUuLmE5YTkwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtNDkxLDU1ICs0OTEsNTYgQEAKIHN0YXRpYyBpbnQgZmJfdHJ5X21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSwgdW5zaWduZWQgaW50IGJwcCkKIHsKLSAgICBpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gMDsKIAotICAgIERQUklOVEsoIlRyeWluZyBtb2RlICVzICVkeCVkLSVkQCVkXG4iLCBtb2RlLT5uYW1lID8gbW9kZS0+bmFtZSA6ICJub25hbWUiLAotCSAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCBicHAsIG1vZGUtPnJlZnJlc2gpOwotICAgIHZhci0+eHJlcyA9IG1vZGUtPnhyZXM7Ci0gICAgdmFyLT55cmVzID0gbW9kZS0+eXJlczsKLSAgICB2YXItPnhyZXNfdmlydHVhbCA9IG1vZGUtPnhyZXM7Ci0gICAgdmFyLT55cmVzX3ZpcnR1YWwgPSBtb2RlLT55cmVzOwotICAgIHZhci0+eG9mZnNldCA9IDA7Ci0gICAgdmFyLT55b2Zmc2V0ID0gMDsKLSAgICB2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOwotICAgIHZhci0+YWN0aXZhdGUgfD0gRkJfQUNUSVZBVEVfVEVTVDsKLSAgICB2YXItPnBpeGNsb2NrID0gbW9kZS0+cGl4Y2xvY2s7Ci0gICAgdmFyLT5sZWZ0X21hcmdpbiA9IG1vZGUtPmxlZnRfbWFyZ2luOwotICAgIHZhci0+cmlnaHRfbWFyZ2luID0gbW9kZS0+cmlnaHRfbWFyZ2luOwotICAgIHZhci0+dXBwZXJfbWFyZ2luID0gbW9kZS0+dXBwZXJfbWFyZ2luOwotICAgIHZhci0+bG93ZXJfbWFyZ2luID0gbW9kZS0+bG93ZXJfbWFyZ2luOwotICAgIHZhci0+aHN5bmNfbGVuID0gbW9kZS0+aHN5bmNfbGVuOwotICAgIHZhci0+dnN5bmNfbGVuID0gbW9kZS0+dnN5bmNfbGVuOwotICAgIHZhci0+c3luYyA9IG1vZGUtPnN5bmM7Ci0gICAgdmFyLT52bW9kZSA9IG1vZGUtPnZtb2RlOwotICAgIGlmIChpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKQotICAgIAllcnIgPSBpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKHZhciwgaW5mbyk7Ci0gICAgdmFyLT5hY3RpdmF0ZSAmPSB+RkJfQUNUSVZBVEVfVEVTVDsKLSAgICByZXR1cm4gZXJyOworCURQUklOVEsoIlRyeWluZyBtb2RlICVzICVkeCVkLSVkQCVkXG4iLAorCQltb2RlLT5uYW1lID8gbW9kZS0+bmFtZSA6ICJub25hbWUiLAorCQltb2RlLT54cmVzLCBtb2RlLT55cmVzLCBicHAsIG1vZGUtPnJlZnJlc2gpOworCXZhci0+eHJlcyA9IG1vZGUtPnhyZXM7CisJdmFyLT55cmVzID0gbW9kZS0+eXJlczsKKwl2YXItPnhyZXNfdmlydHVhbCA9IG1vZGUtPnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBtb2RlLT55cmVzOworCXZhci0+eG9mZnNldCA9IDA7CisJdmFyLT55b2Zmc2V0ID0gMDsKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOworCXZhci0+YWN0aXZhdGUgfD0gRkJfQUNUSVZBVEVfVEVTVDsKKwl2YXItPnBpeGNsb2NrID0gbW9kZS0+cGl4Y2xvY2s7CisJdmFyLT5sZWZ0X21hcmdpbiA9IG1vZGUtPmxlZnRfbWFyZ2luOworCXZhci0+cmlnaHRfbWFyZ2luID0gbW9kZS0+cmlnaHRfbWFyZ2luOworCXZhci0+dXBwZXJfbWFyZ2luID0gbW9kZS0+dXBwZXJfbWFyZ2luOworCXZhci0+bG93ZXJfbWFyZ2luID0gbW9kZS0+bG93ZXJfbWFyZ2luOworCXZhci0+aHN5bmNfbGVuID0gbW9kZS0+aHN5bmNfbGVuOworCXZhci0+dnN5bmNfbGVuID0gbW9kZS0+dnN5bmNfbGVuOworCXZhci0+c3luYyA9IG1vZGUtPnN5bmM7CisJdmFyLT52bW9kZSA9IG1vZGUtPnZtb2RlOworCWlmIChpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKQorCQllcnIgPSBpbmZvLT5mYm9wcy0+ZmJfY2hlY2tfdmFyKHZhciwgaW5mbyk7CisJdmFyLT5hY3RpdmF0ZSAmPSB+RkJfQUNUSVZBVEVfVEVTVDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKLSAqCWZiX2ZpbmRfbW9kZSAtIGZpbmRzIGEgdmFsaWQgdmlkZW8gbW9kZQotICoJQHZhcjogZnJhbWUgYnVmZmVyIHVzZXIgZGVmaW5lZCBwYXJ0IG9mIGRpc3BsYXkKLSAqCUBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKLSAqCUBtb2RlX29wdGlvbjogc3RyaW5nIHZpZGVvIG1vZGUgdG8gZmluZAotICoJQGRiOiB2aWRlbyBtb2RlIGRhdGFiYXNlCi0gKglAZGJzaXplOiBzaXplIG9mIEBkYgotICoJQGRlZmF1bHRfbW9kZTogZGVmYXVsdCB2aWRlbyBtb2RlIHRvIGZhbGwgYmFjayB0bwotICoJQGRlZmF1bHRfYnBwOiBkZWZhdWx0IGNvbG9yIGRlcHRoIGluIGJpdHMgcGVyIHBpeGVsCisgKiAgICAgZmJfZmluZF9tb2RlIC0gZmluZHMgYSB2YWxpZCB2aWRlbyBtb2RlCisgKiAgICAgQHZhcjogZnJhbWUgYnVmZmVyIHVzZXIgZGVmaW5lZCBwYXJ0IG9mIGRpc3BsYXkKKyAqICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCisgKiAgICAgQG1vZGVfb3B0aW9uOiBzdHJpbmcgdmlkZW8gbW9kZSB0byBmaW5kCisgKiAgICAgQGRiOiB2aWRlbyBtb2RlIGRhdGFiYXNlCisgKiAgICAgQGRic2l6ZTogc2l6ZSBvZiBAZGIKKyAqICAgICBAZGVmYXVsdF9tb2RlOiBkZWZhdWx0IHZpZGVvIG1vZGUgdG8gZmFsbCBiYWNrIHRvCisgKiAgICAgQGRlZmF1bHRfYnBwOiBkZWZhdWx0IGNvbG9yIGRlcHRoIGluIGJpdHMgcGVyIHBpeGVsCiAgKgotICoJRmluZHMgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZQotICoJaW4gQG1vZGVfb3B0aW9uIHdpdGggZmFsbGJhY2sgdG8gQGRlZmF1bHRfbW9kZS4gIElmCi0gKglAZGVmYXVsdF9tb2RlIGZhaWxzLCBhbGwgbW9kZXMgaW4gdGhlIHZpZGVvIG1vZGUgZGF0YWJhc2Ugd2lsbAotICoJYmUgdHJpZWQuCisgKiAgICAgRmluZHMgYSBzdWl0YWJsZSB2aWRlbyBtb2RlLCBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZQorICogICAgIGluIEBtb2RlX29wdGlvbiB3aXRoIGZhbGxiYWNrIHRvIEBkZWZhdWx0X21vZGUuICBJZgorICogICAgIEBkZWZhdWx0X21vZGUgZmFpbHMsIGFsbCBtb2RlcyBpbiB0aGUgdmlkZW8gbW9kZSBkYXRhYmFzZSB3aWxsCisgKiAgICAgYmUgdHJpZWQuCiAgKgotICoJVmFsaWQgbW9kZSBzcGVjaWZpZXJzIGZvciBAbW9kZV9vcHRpb246CisgKiAgICAgVmFsaWQgbW9kZSBzcGVjaWZpZXJzIGZvciBAbW9kZV9vcHRpb246CiAgKgotICoJPHhyZXM+eDx5cmVzPltNXVtSXVstPGJwcD5dW0A8cmVmcmVzaD5dW2ldW21dIG9yCi0gKgk8bmFtZT5bLTxicHA+XVtAPHJlZnJlc2g+XQorICogICAgIDx4cmVzPng8eXJlcz5bTV1bUl1bLTxicHA+XVtAPHJlZnJlc2g+XVtpXVttXSBvcgorICogICAgIDxuYW1lPlstPGJwcD5dW0A8cmVmcmVzaD5dCiAgKgotICoJd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kCi0gKgk8bmFtZT4gYSBzdHJpbmcuCisgKiAgICAgd2l0aCA8eHJlcz4sIDx5cmVzPiwgPGJwcD4gYW5kIDxyZWZyZXNoPiBkZWNpbWFsIG51bWJlcnMgYW5kCisgKiAgICAgPG5hbWU+IGEgc3RyaW5nLgogICoKICAqICAgICAgSWYgJ00nIGlzIHByZXNlbnQgYWZ0ZXIgeXJlcyAoYW5kIGJlZm9yZSByZWZyZXNoL2JwcCBpZiBwcmVzZW50KSwKICAqICAgICAgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgdGltaW5ncyB1c2luZyBWRVNBKHRtKSBDb29yZGluYXRlZApAQCAtNTUxLDEyICs1NTIsMTIgQEAKICAqCiAgKiAgICAgIDEwMjR4NzY4TVItOEA2MG0gLSBSZWR1Y2VkIGJsYW5rIHdpdGggbWFyZ2lucyBhdCA2MEh6LgogICoKLSAqCU5PVEU6IFRoZSBwYXNzZWQgc3RydWN0IEB2YXIgaXMgX25vdF8gY2xlYXJlZCEgIFRoaXMgYWxsb3dzIHlvdQotICoJdG8gc3VwcGx5IHZhbHVlcyBmb3IgZS5nLiB0aGUgZ3JheXNjYWxlIGFuZCBhY2NlbF9mbGFncyBmaWVsZHMuCisgKiAgICAgTk9URTogVGhlIHBhc3NlZCBzdHJ1Y3QgQHZhciBpcyBfbm90XyBjbGVhcmVkISAgVGhpcyBhbGxvd3MgeW91CisgKiAgICAgdG8gc3VwcGx5IHZhbHVlcyBmb3IgZS5nLiB0aGUgZ3JheXNjYWxlIGFuZCBhY2NlbF9mbGFncyBmaWVsZHMuCiAgKgotICoJUmV0dXJucyB6ZXJvIGZvciBmYWlsdXJlLCAxIGlmIHVzaW5nIHNwZWNpZmllZCBAbW9kZV9vcHRpb24sCi0gKgkyIGlmIHVzaW5nIHNwZWNpZmllZCBAbW9kZV9vcHRpb24gd2l0aCBhbiBpZ25vcmVkIHJlZnJlc2ggcmF0ZSwKLSAqCTMgaWYgZGVmYXVsdCBtb2RlIGlzIHVzZWQsIDQgaWYgZmFsbCBiYWNrIHRvIGFueSB2YWxpZCBtb2RlLgorICogICAgIFJldHVybnMgemVybyBmb3IgZmFpbHVyZSwgMSBpZiB1c2luZyBzcGVjaWZpZWQgQG1vZGVfb3B0aW9uLAorICogICAgIDIgaWYgdXNpbmcgc3BlY2lmaWVkIEBtb2RlX29wdGlvbiB3aXRoIGFuIGlnbm9yZWQgcmVmcmVzaCByYXRlLAorICogICAgIDMgaWYgZGVmYXVsdCBtb2RlIGlzIHVzZWQsIDQgaWYgZmFsbCBiYWNrIHRvIGFueSB2YWxpZCBtb2RlLgogICoKICAqLwogCkBAIC01NjYsMTk4ICs1NjcsMjAzIEBACiAJCSBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpkZWZhdWx0X21vZGUsCiAJCSB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCiB7Ci0gICAgaW50IGk7CisJaW50IGk7CiAKLSAgICAvKiBTZXQgdXAgZGVmYXVsdHMgKi8KLSAgICBpZiAoIWRiKSB7Ci0JZGIgPSBtb2RlZGI7Ci0JZGJzaXplID0gQVJSQVlfU0laRShtb2RlZGIpOwotICAgIH0KLQotICAgIGlmICghZGVmYXVsdF9tb2RlKQotCWRlZmF1bHRfbW9kZSA9ICZkYlswXTsKLQotICAgIGlmICghZGVmYXVsdF9icHApCi0JZGVmYXVsdF9icHAgPSA4OwotCi0gICAgLyogRGlkIHRoZSB1c2VyIHNwZWNpZnkgYSB2aWRlbyBtb2RlPyAqLwotICAgIGlmICghbW9kZV9vcHRpb24pCi0JbW9kZV9vcHRpb24gPSBmYl9tb2RlX29wdGlvbjsKLSAgICBpZiAobW9kZV9vcHRpb24pIHsKLQljb25zdCBjaGFyICpuYW1lID0gbW9kZV9vcHRpb247Ci0JdW5zaWduZWQgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JaW50IHJlc19zcGVjaWZpZWQgPSAwLCBicHBfc3BlY2lmaWVkID0gMCwgcmVmcmVzaF9zcGVjaWZpZWQgPSAwOwotCXVuc2lnbmVkIGludCB4cmVzID0gMCwgeXJlcyA9IDAsIGJwcCA9IGRlZmF1bHRfYnBwLCByZWZyZXNoID0gMDsKLQlpbnQgeXJlc19zcGVjaWZpZWQgPSAwLCBjdnQgPSAwLCByYiA9IDAsIGludGVybGFjZSA9IDAsIG1hcmdpbnMgPSAwOwotCXUzMiBiZXN0LCBkaWZmLCB0ZGlmZjsKLQotCWZvciAoaSA9IG5hbWVsZW4tMTsgaSA+PSAwOyBpLS0pIHsKLQkgICAgc3dpdGNoIChuYW1lW2ldKSB7Ci0JCWNhc2UgJ0AnOgotCQkgICAgbmFtZWxlbiA9IGk7Ci0JCSAgICBpZiAoIXJlZnJlc2hfc3BlY2lmaWVkICYmICFicHBfc3BlY2lmaWVkICYmCi0JCQkheXJlc19zcGVjaWZpZWQpIHsKLQkJCXJlZnJlc2ggPSBzaW1wbGVfc3RydG9sKCZuYW1lW2krMV0sIE5VTEwsIDEwKTsKLQkJCXJlZnJlc2hfc3BlY2lmaWVkID0gMTsKLQkJCWlmIChjdnQgfHwgcmIpCi0JCQkgICAgY3Z0ID0gMDsKLQkJICAgIH0gZWxzZQotCQkJZ290byBkb25lOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkgICAgbmFtZWxlbiA9IGk7Ci0JCSAgICBpZiAoIWJwcF9zcGVjaWZpZWQgJiYgIXlyZXNfc3BlY2lmaWVkKSB7Ci0JCQlicHAgPSBzaW1wbGVfc3RydG9sKCZuYW1lW2krMV0sIE5VTEwsIDEwKTsKLQkJCWJwcF9zcGVjaWZpZWQgPSAxOwotCQkJaWYgKGN2dCB8fCByYikKLQkJCSAgICBjdnQgPSAwOwotCQkgICAgfSBlbHNlCi0JCQlnb3RvIGRvbmU7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAneCc6Ci0JCSAgICBpZiAoIXlyZXNfc3BlY2lmaWVkKSB7Ci0JCQl5cmVzID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLCAxMCk7Ci0JCQl5cmVzX3NwZWNpZmllZCA9IDE7Ci0JCSAgICB9IGVsc2UKLQkJCWdvdG8gZG9uZTsKLQkJICAgIGJyZWFrOwotCQljYXNlICcwJyAuLi4gJzknOgotCQkgICAgYnJlYWs7Ci0JCWNhc2UgJ00nOgotCQkgICAgaWYgKCF5cmVzX3NwZWNpZmllZCkKLQkJCWN2dCA9IDE7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgICBpZiAoIWN2dCkKLQkJCXJiID0gMTsKLQkJICAgIGJyZWFrOwotCQljYXNlICdtJzoKLQkJICAgIGlmICghY3Z0KQotCQkJbWFyZ2lucyA9IDE7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAnaSc6Ci0JCSAgICBpZiAoIWN2dCkKLQkJCWludGVybGFjZSA9IDE7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGdvdG8gZG9uZTsKLQkgICAgfQotCX0KLQlpZiAoaSA8IDAgJiYgeXJlc19zcGVjaWZpZWQpIHsKLQkgICAgeHJlcyA9IHNpbXBsZV9zdHJ0b2wobmFtZSwgTlVMTCwgMTApOwotCSAgICByZXNfc3BlY2lmaWVkID0gMTsKLQl9Ci1kb25lOgotCWlmIChjdnQpIHsKLQkgICAgc3RydWN0IGZiX3ZpZGVvbW9kZSBjdnRfbW9kZTsKLQkgICAgaW50IHJldDsKLQotCSAgICBEUFJJTlRLKCJDVlQgbW9kZSAlZHglZEAlZEh6JXMlcyVzXG4iLCB4cmVzLCB5cmVzLAotCQkgICAgKHJlZnJlc2gpID8gcmVmcmVzaCA6IDYwLCAocmIpID8gIiByZWR1Y2VkIGJsYW5raW5nIiA6Ci0JCSAgICAiIiwgKG1hcmdpbnMpID8gIiB3aXRoIG1hcmdpbnMiIDogIiIsIChpbnRlcmxhY2UpID8KLQkJICAgICIgaW50ZXJsYWNlZCIgOiAiIik7Ci0KLQkgICAgbWVtc2V0KCZjdnRfbW9kZSwgMCwgc2l6ZW9mKGN2dF9tb2RlKSk7Ci0JICAgIGN2dF9tb2RlLnhyZXMgPSB4cmVzOwotCSAgICBjdnRfbW9kZS55cmVzID0geXJlczsKLQkgICAgY3Z0X21vZGUucmVmcmVzaCA9IChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MDsKLQotCSAgICBpZiAoaW50ZXJsYWNlKQotCQljdnRfbW9kZS52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOwotCSAgICBlbHNlCi0JCWN2dF9tb2RlLnZtb2RlICY9IH5GQl9WTU9ERV9JTlRFUkxBQ0VEOwotCi0JICAgIHJldCA9IGZiX2ZpbmRfbW9kZV9jdnQoJmN2dF9tb2RlLCBtYXJnaW5zLCByYik7Ci0KLQkgICAgaWYgKCFyZXQgJiYgIWZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmN2dF9tb2RlLCBicHApKSB7Ci0JCURQUklOVEsoIm1vZGVkYiBDVlQ6IENWVCBtb2RlIG9rXG4iKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLQotCSAgICBEUFJJTlRLKCJDVlQgbW9kZSBpbnZhbGlkLCBnZXR0aW5nIG1vZGUgZnJvbSBkYXRhYmFzZVxuIik7CisJLyogU2V0IHVwIGRlZmF1bHRzICovCisJaWYgKCFkYikgeworCQlkYiA9IG1vZGVkYjsKKwkJZGJzaXplID0gQVJSQVlfU0laRShtb2RlZGIpOwogCX0KIAotCURQUklOVEsoIlRyeWluZyBzcGVjaWZpZWQgdmlkZW8gbW9kZSVzICVpeCVpXG4iLAotCSAgICByZWZyZXNoX3NwZWNpZmllZCA/ICIiIDogIiAoaWdub3JpbmcgcmVmcmVzaCByYXRlKSIsIHhyZXMsIHlyZXMpOworCWlmICghZGVmYXVsdF9tb2RlKQorCQlkZWZhdWx0X21vZGUgPSAmZGJbMF07CiAKLQlpZiAoIXJlZnJlc2hfc3BlY2lmaWVkKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIG1vZGUgZGF0YWJhc2UgYW5kIGEKLQkJICogdmFsaWQgbW9uc3BlY3Mgc3RydWN0dXJlLCB3ZSBsb29rIGZvciB0aGUgbW9kZSB3aXRoIHRoZQotCQkgKiBoaWdoZXN0IHJlZnJlc2ggcmF0ZS4gIE90aGVyd2lzZSB3ZSBwbGF5IGl0IHNhZmUgaXQgYW5kCi0JCSAqIHRyeSB0byBmaW5kIGEgbW9kZSB3aXRoIGEgcmVmcmVzaCByYXRlIGNsb3Nlc3QgdG8gdGhlCi0JCSAqIHN0YW5kYXJkIDYwIEh6LgotCQkgKi8KLQkJaWYgKGRiICE9IG1vZGVkYiAmJgotCQkgICAgaW5mby0+bW9uc3BlY3MudmZtaW4gJiYgaW5mby0+bW9uc3BlY3MudmZtYXggJiYKLQkJICAgIGluZm8tPm1vbnNwZWNzLmhmbWluICYmIGluZm8tPm1vbnNwZWNzLmhmbWF4ICYmCi0JCSAgICBpbmZvLT5tb25zcGVjcy5kY2xrbWF4KSB7Ci0JCQlyZWZyZXNoID0gMTAwMDsKLQkJfSBlbHNlIHsKLQkJCXJlZnJlc2ggPSA2MDsKKwlpZiAoIWRlZmF1bHRfYnBwKQorCQlkZWZhdWx0X2JwcCA9IDg7CisKKwkvKiBEaWQgdGhlIHVzZXIgc3BlY2lmeSBhIHZpZGVvIG1vZGU/ICovCisJaWYgKCFtb2RlX29wdGlvbikKKwkJbW9kZV9vcHRpb24gPSBmYl9tb2RlX29wdGlvbjsKKwlpZiAobW9kZV9vcHRpb24pIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IG1vZGVfb3B0aW9uOworCQl1bnNpZ25lZCBpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaW50IHJlc19zcGVjaWZpZWQgPSAwLCBicHBfc3BlY2lmaWVkID0gMCwgcmVmcmVzaF9zcGVjaWZpZWQgPSAwOworCQl1bnNpZ25lZCBpbnQgeHJlcyA9IDAsIHlyZXMgPSAwLCBicHAgPSBkZWZhdWx0X2JwcCwgcmVmcmVzaCA9IDA7CisJCWludCB5cmVzX3NwZWNpZmllZCA9IDAsIGN2dCA9IDAsIHJiID0gMCwgaW50ZXJsYWNlID0gMDsKKwkJaW50IG1hcmdpbnMgPSAwOworCQl1MzIgYmVzdCwgZGlmZiwgdGRpZmY7CisKKwkJZm9yIChpID0gbmFtZWxlbi0xOyBpID49IDA7IGktLSkgeworCQkJc3dpdGNoIChuYW1lW2ldKSB7CisJCQljYXNlICdAJzoKKwkJCQluYW1lbGVuID0gaTsKKwkJCQlpZiAoIXJlZnJlc2hfc3BlY2lmaWVkICYmICFicHBfc3BlY2lmaWVkICYmCisJCQkJICAgICF5cmVzX3NwZWNpZmllZCkgeworCQkJCQlyZWZyZXNoID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCQkxMCk7CisJCQkJCXJlZnJlc2hfc3BlY2lmaWVkID0gMTsKKwkJCQkJaWYgKGN2dCB8fCByYikKKwkJCQkJCWN2dCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCW5hbWVsZW4gPSBpOworCQkJCWlmICghYnBwX3NwZWNpZmllZCAmJiAheXJlc19zcGVjaWZpZWQpIHsKKwkJCQkJYnBwID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCSAgICAxMCk7CisJCQkJCWJwcF9zcGVjaWZpZWQgPSAxOworCQkJCQlpZiAoY3Z0IHx8IHJiKQorCQkJCQkJY3Z0ID0gMDsKKwkJCQl9IGVsc2UKKwkJCQkJZ290byBkb25lOworCQkJCWJyZWFrOworCQkJY2FzZSAneCc6CisJCQkJaWYgKCF5cmVzX3NwZWNpZmllZCkgeworCQkJCQl5cmVzID0gc2ltcGxlX3N0cnRvbCgmbmFtZVtpKzFdLCBOVUxMLAorCQkJCQkJCSAgICAgMTApOworCQkJCQl5cmVzX3NwZWNpZmllZCA9IDE7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzAnIC4uLiAnOSc6CisJCQkJYnJlYWs7CisJCQljYXNlICdNJzoKKwkJCQlpZiAoIXlyZXNfc3BlY2lmaWVkKQorCQkJCQljdnQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnUic6CisJCQkJaWYgKCFjdnQpCisJCQkJCXJiID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJCWlmICghY3Z0KQorCQkJCQltYXJnaW5zID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2knOgorCQkJCWlmICghY3Z0KQorCQkJCQlpbnRlcmxhY2UgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGRvbmU7CisJCQl9CiAJCX0KLQl9CisJCWlmIChpIDwgMCAmJiB5cmVzX3NwZWNpZmllZCkgeworCQkJeHJlcyA9IHNpbXBsZV9zdHJ0b2wobmFtZSwgTlVMTCwgMTApOworCQkJcmVzX3NwZWNpZmllZCA9IDE7CisJCX0KK2RvbmU6CisJCWlmIChjdnQpIHsKKwkJCXN0cnVjdCBmYl92aWRlb21vZGUgY3Z0X21vZGU7CisJCQlpbnQgcmV0OwogCi0JZGlmZiA9IC0xOwotCWJlc3QgPSAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspIHsKLQkJaWYgKChuYW1lX21hdGNoZXMoZGJbaV0sIG5hbWUsIG5hbWVsZW4pIHx8Ci0JCSAgICAocmVzX3NwZWNpZmllZCAmJiByZXNfbWF0Y2hlcyhkYltpXSwgeHJlcywgeXJlcykpKSAmJgotCQkgICAgIWZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmRiW2ldLCBicHApKSB7Ci0JCQlpZiAocmVmcmVzaF9zcGVjaWZpZWQgJiYgZGJbaV0ucmVmcmVzaCA9PSByZWZyZXNoKSB7CisJCQlEUFJJTlRLKCJDVlQgbW9kZSAlZHglZEAlZEh6JXMlcyVzXG4iLCB4cmVzLCB5cmVzLAorCQkJCShyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MCwKKwkJCQkocmIpID8gIiByZWR1Y2VkIGJsYW5raW5nIiA6ICIiLAorCQkJCShtYXJnaW5zKSA/ICIgd2l0aCBtYXJnaW5zIiA6ICIiLAorCQkJCShpbnRlcmxhY2UpID8gIiBpbnRlcmxhY2VkIiA6ICIiKTsKKworCQkJbWVtc2V0KCZjdnRfbW9kZSwgMCwgc2l6ZW9mKGN2dF9tb2RlKSk7CisJCQljdnRfbW9kZS54cmVzID0geHJlczsKKwkJCWN2dF9tb2RlLnlyZXMgPSB5cmVzOworCQkJY3Z0X21vZGUucmVmcmVzaCA9IChyZWZyZXNoKSA/IHJlZnJlc2ggOiA2MDsKKworCQkJaWYgKGludGVybGFjZSkKKwkJCQljdnRfbW9kZS52bW9kZSB8PSBGQl9WTU9ERV9JTlRFUkxBQ0VEOworCQkJZWxzZQorCQkJCWN2dF9tb2RlLnZtb2RlICY9IH5GQl9WTU9ERV9JTlRFUkxBQ0VEOworCisJCQlyZXQgPSBmYl9maW5kX21vZGVfY3Z0KCZjdnRfbW9kZSwgbWFyZ2lucywgcmIpOworCisJCQlpZiAoIXJldCAmJiAhZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmY3Z0X21vZGUsIGJwcCkpIHsKKwkJCQlEUFJJTlRLKCJtb2RlZGIgQ1ZUOiBDVlQgbW9kZSBva1xuIik7CiAJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCURQUklOVEsoIkNWVCBtb2RlIGludmFsaWQsIGdldHRpbmcgbW9kZSBmcm9tIGRhdGFiYXNlXG4iKTsKKwkJfQorCisJCURQUklOVEsoIlRyeWluZyBzcGVjaWZpZWQgdmlkZW8gbW9kZSVzICVpeCVpXG4iLAorCQkJcmVmcmVzaF9zcGVjaWZpZWQgPyAiIiA6ICIgKGlnbm9yaW5nIHJlZnJlc2ggcmF0ZSkiLAorCQkJeHJlcywgeXJlcyk7CisKKwkJaWYgKCFyZWZyZXNoX3NwZWNpZmllZCkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBjYWxsZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIG1vZGUgZGF0YWJhc2UgYW5kCisJCQkgKiBhIHZhbGlkIG1vbnNwZWNzIHN0cnVjdHVyZSwgd2UgbG9vayBmb3IgdGhlIG1vZGUgd2l0aAorCQkJICogdGhlIGhpZ2hlc3QgcmVmcmVzaCByYXRlLiAgT3RoZXJ3aXNlIHdlIHBsYXkgaXQgc2FmZQorCQkJICogaXQgYW5kIHRyeSB0byBmaW5kIGEgbW9kZSB3aXRoIGEgcmVmcmVzaCByYXRlIGNsb3Nlc3QKKwkJCSAqIHRvIHRoZSBzdGFuZGFyZCA2MCBIei4KKwkJCSAqLworCQkJaWYgKGRiICE9IG1vZGVkYiAmJgorCQkJICAgIGluZm8tPm1vbnNwZWNzLnZmbWluICYmIGluZm8tPm1vbnNwZWNzLnZmbWF4ICYmCisJCQkgICAgaW5mby0+bW9uc3BlY3MuaGZtaW4gJiYgaW5mby0+bW9uc3BlY3MuaGZtYXggJiYKKwkJCSAgICBpbmZvLT5tb25zcGVjcy5kY2xrbWF4KSB7CisJCQkJcmVmcmVzaCA9IDEwMDA7CiAJCQl9IGVsc2UgeworCQkJCXJlZnJlc2ggPSA2MDsKKwkJCX0KKwkJfQorCisJCWRpZmYgPSAtMTsKKwkJYmVzdCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspIHsKKwkJCWlmICgobmFtZV9tYXRjaGVzKGRiW2ldLCBuYW1lLCBuYW1lbGVuKSB8fAorCQkJICAgICAocmVzX3NwZWNpZmllZCAmJiByZXNfbWF0Y2hlcyhkYltpXSwgeHJlcywgeXJlcykpKSAmJgorCQkJICAgICFmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltpXSwgYnBwKSkgeworCQkJCWlmIChyZWZyZXNoX3NwZWNpZmllZCAmJiBkYltpXS5yZWZyZXNoID09IHJlZnJlc2gpCisJCQkJCXJldHVybiAxOworCiAJCQkJaWYgKGFicyhkYltpXS5yZWZyZXNoIC0gcmVmcmVzaCkgPCBkaWZmKSB7CiAJCQkJCWRpZmYgPSBhYnMoZGJbaV0ucmVmcmVzaCAtIHJlZnJlc2gpOwogCQkJCQliZXN0ID0gaTsKIAkJCQl9CiAJCQl9CiAJCX0KLQl9Ci0JaWYgKGJlc3QgIT0gLTEpIHsKLQkJZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbYmVzdF0sIGJwcCk7Ci0JCXJldHVybiAocmVmcmVzaF9zcGVjaWZpZWQpID8gMiA6IDE7Ci0JfQorCQlpZiAoYmVzdCAhPSAtMSkgeworCQkJZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbYmVzdF0sIGJwcCk7CisJCQlyZXR1cm4gKHJlZnJlc2hfc3BlY2lmaWVkKSA/IDIgOiAxOworCQl9CiAKLQlkaWZmID0gMiAqICh4cmVzICsgeXJlcyk7Ci0JYmVzdCA9IC0xOwotCURQUklOVEsoIlRyeWluZyBiZXN0LWZpdCBtb2Rlc1xuIik7Ci0JZm9yIChpID0gMDsgaSA8IGRic2l6ZTsgaSsrKSB7Ci0JCURQUklOVEsoIlRyeWluZyAlaXglaVxuIiwgZGJbaV0ueHJlcywgZGJbaV0ueXJlcyk7Ci0JCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGJwcCkpIHsKLQkJCXRkaWZmID0gYWJzKGRiW2ldLnhyZXMgLSB4cmVzKSArCi0JCQkJYWJzKGRiW2ldLnlyZXMgLSB5cmVzKTsKKwkJZGlmZiA9IDIgKiAoeHJlcyArIHlyZXMpOworCQliZXN0ID0gLTE7CisJCURQUklOVEsoIlRyeWluZyBiZXN0LWZpdCBtb2Rlc1xuIik7CisJCWZvciAoaSA9IDA7IGkgPCBkYnNpemU7IGkrKykgeworCQkJRFBSSU5USygiVHJ5aW5nICVpeCVpXG4iLCBkYltpXS54cmVzLCBkYltpXS55cmVzKTsKKwkJCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGJwcCkpIHsKKwkJCQl0ZGlmZiA9IGFicyhkYltpXS54cmVzIC0geHJlcykgKworCQkJCQlhYnMoZGJbaV0ueXJlcyAtIHlyZXMpOwogCi0JCQkvKgotCQkJICogUGVuYWxpemUgbW9kZXMgd2l0aCByZXNvbHV0aW9ucyBzbWFsbGVyCi0JCQkgKiB0aGFuIHJlcXVlc3RlZC4KLQkJCSAqLwotCQkJaWYgKHhyZXMgPiBkYltpXS54cmVzIHx8IHlyZXMgPiBkYltpXS55cmVzKQotCQkJCXRkaWZmICs9IHhyZXMgKyB5cmVzOworCQkJCS8qCisJCQkJICogUGVuYWxpemUgbW9kZXMgd2l0aCByZXNvbHV0aW9ucyBzbWFsbGVyCisJCQkJICogdGhhbiByZXF1ZXN0ZWQuCisJCQkJICovCisJCQkJaWYgKHhyZXMgPiBkYltpXS54cmVzIHx8IHlyZXMgPiBkYltpXS55cmVzKQorCQkJCQl0ZGlmZiArPSB4cmVzICsgeXJlczsKIAotCQkJaWYgKGRpZmYgPiB0ZGlmZikgewotCQkJCWRpZmYgPSB0ZGlmZjsKLQkJCQliZXN0ID0gaTsKKwkJCQlpZiAoZGlmZiA+IHRkaWZmKSB7CisJCQkJCWRpZmYgPSB0ZGlmZjsKKwkJCQkJYmVzdCA9IGk7CisJCQkJfQogCQkJfQogCQl9CisJCWlmIChiZXN0ICE9IC0xKSB7CisJCQlmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltiZXN0XSwgYnBwKTsKKwkJCXJldHVybiA1OworCQl9CiAJfQotCWlmIChiZXN0ICE9IC0xKSB7Ci0JICAgIGZiX3RyeV9tb2RlKHZhciwgaW5mbywgJmRiW2Jlc3RdLCBicHApOwotCSAgICByZXR1cm4gNTsKLQl9Ci0gICAgfQogCi0gICAgRFBSSU5USygiVHJ5aW5nIGRlZmF1bHQgdmlkZW8gbW9kZVxuIik7Ci0gICAgaWYgKCFmYl90cnlfbW9kZSh2YXIsIGluZm8sIGRlZmF1bHRfbW9kZSwgZGVmYXVsdF9icHApKQotCXJldHVybiAzOworCURQUklOVEsoIlRyeWluZyBkZWZhdWx0IHZpZGVvIG1vZGVcbiIpOworCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCBkZWZhdWx0X21vZGUsIGRlZmF1bHRfYnBwKSkKKwkJcmV0dXJuIDM7CiAKLSAgICBEUFJJTlRLKCJUcnlpbmcgYWxsIG1vZGVzXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspCi0JaWYgKCFmYl90cnlfbW9kZSh2YXIsIGluZm8sICZkYltpXSwgZGVmYXVsdF9icHApKQotCSAgICByZXR1cm4gNDsKKwlEUFJJTlRLKCJUcnlpbmcgYWxsIG1vZGVzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJzaXplOyBpKyspCisJCWlmICghZmJfdHJ5X21vZGUodmFyLCBpbmZvLCAmZGJbaV0sIGRlZmF1bHRfYnBwKSkKKwkJCXJldHVybiA0OwogCi0gICAgRFBSSU5USygiTm8gdmFsaWQgbW9kZSBmb3VuZFxuIik7Ci0gICAgcmV0dXJuIDA7CisJRFBSSU5USygiTm8gdmFsaWQgbW9kZSBmb3VuZFxuIik7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRkaS5jIGIvZHJpdmVycy92aWRlby9tc20vbWRkaS5jCmluZGV4IDE3OGIwNzIuLjQ1MjdjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kZGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZGRpLmMKQEAgLTcxNSw3ICs3MTUsNyBAQAogCiAJbWRkaS0+aW50X2VuYWJsZSA9IDA7CiAJbWRkaV93cml0ZWwobWRkaS0+aW50X2VuYWJsZSwgSU5URU4pOwotCXJldCA9IHJlcXVlc3RfaXJxKG1kZGktPmlycSwgbWRkaV9pc3IsIElSUUZfRElTQUJMRUQsICJtZGRpIiwKKwlyZXQgPSByZXF1ZXN0X2lycShtZGRpLT5pcnEsIG1kZGlfaXNyLCAwLCAibWRkaSIsCiAJCQkgICZtZGRpLT5jbGllbnRfZGF0YSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1kZGk6IGZhaWxlZCB0byByZXF1ZXN0IGVuYWJsZSBpcnEhXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kcC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKaW5kZXggMjQzZDE2Zi4uY2IyZGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJtZHBfaHcuaCIKIApAQCAtNDIxLDEwICs0MjIsMTEgQEAKIAljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtZHBfY2xrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIm1kcDogZmFpbGVkIHRvIGdldCBtZHAgY2xrIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBlcnJvcl9nZXRfY2xrOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKG1kcC0+aXJxLCBtZHBfaXNyLCBJUlFGX0RJU0FCTEVELCAibXNtX21kcCIsIG1kcCk7CisJcmV0ID0gcmVxdWVzdF9pcnEobWRwLT5pcnEsIG1kcF9pc3IsIDAsICJtc21fbWRwIiwgbWRwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JlcXVlc3RfaXJxOwogCWRpc2FibGVfaXJxKG1kcC0+aXJxKTsKQEAgLTQ5NSw2ICs0OTcsNyBAQAogZXJyb3JfZGV2aWNlX3JlZ2lzdGVyOgogCWZyZWVfaXJxKG1kcC0+aXJxLCBtZHApOwogZXJyb3JfcmVxdWVzdF9pcnE6CitlcnJvcl9nZXRfY2xrOgogCWlvdW5tYXAobWRwLT5iYXNlKTsKIGVycm9yX2dldF9pcnE6CiBlcnJvcl9pb3JlbWFwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9teDNmYi5jIGIvZHJpdmVycy92aWRlby9teDNmYi5jCmluZGV4IDdlM2E0OTAuLmUzNDA2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXgzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL214M2ZiLmMKQEAgLTM4Miw2ICszODIsOSBAQAogCXVpbnQzMl90IGVuYWJsZWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmIChteDNfZmJpLT50eGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm14M2ZiLT5sb2NrLCBmbGFncyk7CiAKIAllbmFibGVkID0gc2RjX2ZiX3VuaW5pdChteDNfZmJpKTsKQEAgLTk4Niw5ICs5ODksMTkgQEAKIHsKIAlzdHJ1Y3QgbXgzZmJfaW5mbyAqbXgzX2ZiaSA9IGZiaS0+cGFyOwogCXN0cnVjdCBteDNmYl9kYXRhICpteDNmYiA9IG14M19mYmktPm14M2ZiOworCWludCB3YXNfYmxhbmsgPSBteDNfZmJpLT5ibGFuazsKIAogCW14M19mYmktPmJsYW5rID0gYmxhbms7CiAKKwkvKiBBdHRlbnRpb24hCisJICogRG8gbm90IGNhbGwgc2RjX2Rpc2FibGVfY2hhbm5lbCgpIGZvciBhIGNoYW5uZWwgdGhhdCBpcyBkaXNhYmxlZAorCSAqIGFscmVhZHkhIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBrZXJuZWwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlCisJICogKG14M19mYmktPnR4ZCBpcyBOVUxMKS4gSGlkZSB0aGUgZmFjdCwgdGhhdCBhbGwgYmxhbmsgbW9kZXMgYXJlCisJICogaGFuZGxlZCBlcXVhbGx5IGJ5IHRoaXMgZHJpdmVyLgorCSAqLworCWlmIChibGFuayA+IEZCX0JMQU5LX1VOQkxBTksgJiYgd2FzX2JsYW5rID4gRkJfQkxBTktfVU5CTEFOSykKKwkJcmV0dXJuOworCiAJc3dpdGNoIChibGFuaykgewogCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgogCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKQEAgLTEwNjIsMTUgKzEwNzUsMTUgQEAKIAl5X2JvdHRvbSA9IHZhci0+eW9mZnNldDsKIAogCWlmICghKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkpCi0JCXlfYm90dG9tICs9IHZhci0+eXJlczsKKwkJeV9ib3R0b20gKz0gZmJpLT52YXIueXJlczsKIAogCWlmICh5X2JvdHRvbSA+IGZiaS0+dmFyLnlyZXNfdmlydHVhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZteDNfZmJpLT5tdXRleCk7CiAKLQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpICoKLQkJKHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKKwlvZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBmYmktPmZpeC5saW5lX2xlbmd0aAorCSAgICAgICArIHZhci0+eG9mZnNldCAqIChmYmktPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCWJhc2UgPSBmYmktPmZpeC5zbWVtX3N0YXJ0ICsgb2Zmc2V0OwogCiAJZGV2X2RiZyhmYmktPmRldmljZSwgIlVwZGF0aW5nIFNEQyBCRyBidWYgJWQgYWRkcmVzcz0weCUwOGxYXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9teHNmYi5jIGIvZHJpdmVycy92aWRlby9teHNmYi5jCmluZGV4IDBiMmYyZGQuLmQ4MzdkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXhzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL214c2ZiLmMKQEAgLTM5LDYgKzM5LDcgQEAKICAqIHRoZSByZXF1aXJlZCB2YWx1ZSBpbiB0aGUgaW14X2ZiX3ZpZGVvbW9kZSBzdHJ1Y3R1cmUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9uZW9mYi5jIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCmluZGV4IDU4ODUyN2EuLmZlZWE3YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKQEAgLTExODUsOCArMTE4NSw4IEBACiAKIAlEQkcoIm5lb2ZiX3VwZGF0ZV9zdGFydCIpOwogCi0JQmFzZSA9ICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldCkgPj4gMjsKLQlCYXNlICo9ICh2YXItPmJpdHNfcGVyX3BpeGVsICsgNykgLyA4OworCUJhc2UgPSAodmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIHZhci0+eG9mZnNldCkgPj4gMjsKKwlCYXNlICo9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAvIDg7CiAKIAluZW9VbmxvY2soKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udWM5MDBmYi5jIGIvZHJpdmVycy92aWRlby9udWM5MDBmYi5jCmluZGV4IDBmZmY1OTcuLmQxZmJiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnVjOTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL251YzkwMGZiLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGRtLmg+CiAjaW5jbHVkZSA8bWFjaC9mYi5oPgotI2luY2x1ZGUgPG1hY2gvY2xrZGV2Lmg+CiAKICNpbmNsdWRlICJudWM5MDBmYi5oIgogCkBAIC01ODgsNyArNTg3LDcgQEAKIAlmYmluZm8tPmZsYWdzCQkJPSBGQklORk9fRkxBR19ERUZBVUxUOwogCWZiaW5mby0+cHNldWRvX3BhbGV0dGUJCT0gJmZiaS0+cHNldWRvX3BhbDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgbnVjOTAwZmJfaXJxaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIG51YzkwMGZiX2lycWhhbmRsZXIsIDAsCiAJCQkgIHBkZXYtPm5hbWUsIGZiaW5mbyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVnaXN0ZXIgaXJxIGhhbmRsZXIgJWQgLWVyciAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKaW5kZXggMTk2ZmEyZS4uODRmZjIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKQEAgLTksMzUgKzksNiBAQAogCWhlbHAKICAgICAgICAgICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciBPTUFQIGJhc2VkIGJvYXJkcy4KIAotY29uZmlnIEZCX09NQVBfTENEX1ZHQQotICAgICAgICBib29sICJVc2UgTENEIGluIFZHQSBtb2RlIgotCSAgICAgICAgZGVwZW5kcyBvbiBNQUNIX09NQVBfMzQzMFNEUCB8fCBNQUNIX09NQVBfTERQCi0JCWhlbHAKLQkJICBTZXQgTENEIHJlc29sdXRpb24gYXMgVkdBICg2NDAgWCA0ODApLgotCQkgIERlZmF1bHQgcmVzb2x1dGlvbiB3aXRob3V0IHRoaXMgb3B0aW9uIGlzIFFWR0EoMzIwIFggMjQwKS4KLQkJICBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYyBmaWxlCi0JCSAgZm9yIGxjZCBkcml2ZXIgY29kZS4KLWNob2ljZQotCWRlcGVuZHMgb24gRkJfT01BUCAmJiBNQUNIX09WRVJPCi0JcHJvbXB0ICJTY3JlZW4gcmVzb2x1dGlvbiIKLQlkZWZhdWx0IEZCX09NQVBfMDc5TTNSCi0JaGVscAotCSAgU2VsZWN0ZWQgZGVzaXJlZCBzY3JlZW4gcmVzb2x1dGlvbgotCi1jb25maWcgRkJfT01BUF8wMzFNM1IKLQlib29sZWFuICI2NDAgeCA0ODAgQCA2MCBIeiBSZWR1Y2VkIGJsYW5raW5nIgotCi1jb25maWcgRkJfT01BUF8wNDhNM1IKLQlib29sZWFuICI4MDAgeCA2MDAgQCA2MCBIeiBSZWR1Y2VkIGJsYW5raW5nIgotCi1jb25maWcgRkJfT01BUF8wNzlNM1IKLQlib29sZWFuICIxMDI0IHggNzY4IEAgNjAgSHogUmVkdWNlZCBibGFua2luZyIKLQotY29uZmlnIEZCX09NQVBfMDkyTTlSCi0JYm9vbGVhbiAiMTI4MCB4IDcyMCBAIDYwIEh6IFJlZHVjZWQgYmxhbmtpbmciCi0KLWVuZGNob2ljZQotCiBjb25maWcgRkJfT01BUF9MQ0RDX0VYVEVSTkFMCiAJYm9vbCAiRXh0ZXJuYWwgTENEIGNvbnRyb2xsZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCX09NQVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQppbmRleCAyNWRiNTU2Li5lZjc4NTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCkBAIC0xNyw3ICsxNyw2IEBACiBvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQpICs9IGJsaXp6YXJkLm8KIAogb2Jqcy15JChDT05GSUdfTUFDSF9BTVNfREVMVEEpICs9IGxjZF9hbXNfZGVsdGEubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0g0KSArPSBsY2RfaDQubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0gzKSArPSBsY2RfaDMubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1URSkgKz0gbGNkX3BhbG10ZS5vCiBvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVRUKSArPSBsY2RfcGFsbXR0Lm8KQEAgLTI2LDE0ICsyNSw3IEBACiBvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDE1WFgpJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGNkX2lubjE1MTAubwogb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX09TSykgKz0gbGNkX29zay5vCiAKLW9ianMteSQoQ09ORklHX01BQ0hfT01BUF9BUE9MTE9OKSArPSBsY2RfYXBvbGxvbi5vCi1vYmpzLXkkKENPTkZJR19NQUNIX09NQVBfMjQzMFNEUCkgKz0gbGNkXzI0MzBzZHAubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQXzM0MzBTRFApICs9IGxjZF8yNDMwc2RwLm8KLW9ianMteSQoQ09ORklHX01BQ0hfT01BUF9MRFApICs9IGxjZF9sZHAubwotb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQM0VWTSkgKz0gbGNkX29tYXAzZXZtLm8KLW9ianMteSQoQ09ORklHX01BQ0hfT01BUDNfQkVBR0xFKSArPSBsY2Rfb21hcDNiZWFnbGUubwogb2Jqcy15JChDT05GSUdfRkJfT01BUF9MQ0RfTUlQSUQpICs9IGxjZF9taXBpZC5vCi1vYmpzLXkkKENPTkZJR19NQUNIX09WRVJPKSArPSBsY2Rfb3Zlcm8ubwogb2Jqcy15JChDT05GSUdfTUFDSF9IRVJBTEQpICs9IGxjZF9odGNoZXJhbGQubwogCiBvbWFwZmItb2JqcyA6PSAkKG9ianMteXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkXzI0MzBzZHAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VjY2M5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfMjQzMHNkcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIDI0MzBTRFAgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YQotICogQXV0aG9yOiBIdW55dWUgWWF1IDxoeWF1QG12aXN0YS5jb20+Ci0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC9sY2QtYXBvbGxvbi5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLQotI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0jZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCTkxCi0jZGVmaW5lIFNEUDI0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPCQkxNTQKLSNkZWZpbmUgU0RQMzQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8JMjQKLSNkZWZpbmUgU0RQMzQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU8JCTI4Ci0KLXN0YXRpYyB1bnNpZ25lZCBiYWNrbGlnaHRfZ3BpbzsKLXN0YXRpYyB1bnNpZ25lZCBlbmFibGVfZ3BpbzsKLQotI2RlZmluZSBMQ0RfUElYQ0xPQ0tfTUFYCQk1NDAwIC8qIGZyZXEgNS40IE1IeiAqLwotI2RlZmluZSBQTV9SRUNFSVZFUiAgICAgICAgICAgICBUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUgotI2RlZmluZSBFTkFCTEVfVkFVWDJfREVESUNBVEVEICAweDA5Ci0jZGVmaW5lIEVOQUJMRV9WQVVYMl9ERVZfR1JQICAgIDB4MjAKLSNkZWZpbmUgRU5BQkxFX1ZBVVgzX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WQVVYM19ERVZfR1JQCTB4MjAKLQotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVEICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAgICAgICAgICAgICAweEUwCi0jZGVmaW5lIFRXTDQwMzBfVlBMTDJfREVWX0dSUCAgICAgICAgICAgMHgzMwotI2RlZmluZSBUV0w0MDMwX1ZQTEwyX0RFRElDQVRFRCAgICAgICAgIDB4MzYKLQotI2RlZmluZSB0Ml9vdXQoYywgciwgdikgdHdsX2kyY193cml0ZV91OChjLCByLCB2KQotCi0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAotCQkJCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKLXsKLQlpZiAobWFjaGluZV9pc19vbWFwXzM0MzBzZHAoKSkgewotCQllbmFibGVfZ3BpbyAgICA9IFNEUDM0MzBfTENEX1BBTkVMX0VOQUJMRV9HUElPOwotCQliYWNrbGlnaHRfZ3BpbyA9IFNEUDM0MzBfTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPOwotCX0gZWxzZSB7Ci0JCWVuYWJsZV9ncGlvICAgID0gU0RQMjQzMF9MQ0RfUEFORUxfRU5BQkxFX0dQSU87Ci0JCWJhY2tsaWdodF9ncGlvID0gU0RQMjQzMF9MQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU87Ci0JfQotCi0JZ3Bpb19yZXF1ZXN0KGVuYWJsZV9ncGlvLCAiTENEIGVuYWJsZSIpOwkvKiBMQ0QgcGFuZWwgKi8KLQlncGlvX3JlcXVlc3QoYmFja2xpZ2h0X2dwaW8sICJMQ0QgYmwiKTsJCS8qIExDRCBiYWNrbGlnaHQgKi8KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZW5hYmxlX2dwaW8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChiYWNrbGlnaHRfZ3BpbywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2RwMjQzMF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZnJlZShiYWNrbGlnaHRfZ3Bpbyk7Ci0JZ3Bpb19mcmVlKGVuYWJsZV9ncGlvKTsKLX0KLQotc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQl1OCBkZWRfdmFsLCBkZWRfcmVnOwotCXU4IGdycF92YWwsIGdycF9yZWc7Ci0KLQlpZiAobWFjaGluZV9pc19vbWFwXzM0MzBzZHAoKSkgewotCQlkZWRfcmVnID0gVFdMNDAzMF9WQVVYM19ERURJQ0FURUQ7Ci0JCWRlZF92YWwgPSBFTkFCTEVfVkFVWDNfREVESUNBVEVEOwotCQlncnBfcmVnID0gVFdMNDAzMF9WQVVYM19ERVZfR1JQOwotCQlncnBfdmFsID0gRU5BQkxFX1ZBVVgzX0RFVl9HUlA7Ci0KLQkJaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApIHsKLQkJCXQyX291dChQTV9SRUNFSVZFUiwgRU5BQkxFX1ZQTEwyX0RFRElDQVRFRCwKLQkJCQkJVFdMNDAzMF9WUExMMl9ERURJQ0FURUQpOwotCQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCBFTkFCTEVfVlBMTDJfREVWX0dSUCwKLQkJCQkJVFdMNDAzMF9WUExMMl9ERVZfR1JQKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRlZF9yZWcgPSBUV0w0MDMwX1ZBVVgyX0RFRElDQVRFRDsKLQkJZGVkX3ZhbCA9IEVOQUJMRV9WQVVYMl9ERURJQ0FURUQ7Ci0JCWdycF9yZWcgPSBUV0w0MDMwX1ZBVVgyX0RFVl9HUlA7Ci0JCWdycF92YWwgPSBFTkFCTEVfVkFVWDJfREVWX0dSUDsKLQl9Ci0KLQlncGlvX3NldF92YWx1ZShlbmFibGVfZ3BpbywgMSk7Ci0JZ3Bpb19zZXRfdmFsdWUoYmFja2xpZ2h0X2dwaW8sIDEpOwotCi0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBkZWRfdmFsLCBkZWRfcmVnKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBncnBfdmFsLCBncnBfcmVnKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2RwMjQzMF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKGVuYWJsZV9ncGlvLCAwKTsKLQlncGlvX3NldF92YWx1ZShiYWNrbGlnaHRfZ3BpbywgMCk7Ci0JaWYgKG9tYXBfcmV2KCkgPiBPTUFQMzQzMF9SRVZfRVMxXzApIHsKLQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVESUNBVEVEKTsKLQkJdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVWX0dSUCk7Ci0JCW1zbGVlcCg0KTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNkcDI0MzBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBsY2RfcGFuZWwgc2RwMjQzMF9wYW5lbCA9IHsKLQkubmFtZQkJPSAic2RwMjQzMCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTYsCi0JLnhfcmVzCQk9IDI0MCwKLQkueV9yZXMJCT0gMzIwLAotCS5oc3cJCT0gMywJCS8qIGhzeW5jX2xlbiAoNCkgLSAxICovCi0JLmhmcAkJPSAzLAkJLyogcmlnaHRfbWFyZ2luICg0KSAtIDEgKi8KLQkuaGJwCQk9IDM5LAkJLyogbGVmdF9tYXJnaW4gKDQwKSAtIDEgKi8KLQkudnN3CQk9IDEsCQkvKiB2c3luY19sZW4gKDIpIC0gMSAqLwotCS52ZnAJCT0gMiwJCS8qIGxvd2VyX21hcmdpbiAqLwotCS52YnAJCT0gNywJCS8qIHVwcGVyX21hcmdpbiAoOCkgLSAxICovCi0KLQkucGl4ZWxfY2xvY2sJPSBMQ0RfUElYQ0xPQ0tfTUFYLAotCi0JLmluaXQJCT0gc2RwMjQzMF9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gc2RwMjQzMF9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gc2RwMjQzMF9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBzZHAyNDMwX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gc2RwMjQzMF9wYW5lbF9nZXRfY2FwcywKLX07Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmc2RwMjQzMF9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZHAyNDMwX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkJcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RwMjQzMF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZHAyNDMwX3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gc2RwMjQzMF9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IHNkcDI0MzBfcGFuZWxfcmVtb3ZlLAotCS5zdXNwZW5kCT0gc2RwMjQzMF9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2RwMjQzMF9wYW5lbF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInNkcDI0MzBfbGNkIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNkcDI0MzBfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZHAyNDMwX3BhbmVsX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzZHAyNDMwX3BhbmVsX2Rydl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkcDI0MzBfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2RwMjQzMF9wYW5lbF9kcnZfaW5pdCk7Ci1tb2R1bGVfZXhpdChzZHAyNDMwX3BhbmVsX2Rydl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfYXBvbGxvbi5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hcG9sbG9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDU5ZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9hcG9sbG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgU2Ftc3VuZyBPTUFQMiBBcG9sbG9uIGJvYXJkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1LDIwMDYgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogQXV0aG9yOiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkLWg0LmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0vKiAjZGVmaW5lIFVTRV8zNUlOQ0hfTENEIDEgKi8KLQotc3RhdGljIGludCBhcG9sbG9uX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhcG9sbG9uX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci19Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwb2xsb25fcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBvbGxvbl9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGxjZF9wYW5lbCBhcG9sbG9uX3BhbmVsID0gewotCS5uYW1lCQk9ICJhcG9sbG9uIiwKLQkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKLQkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQywKLQotCS5icHAJCT0gMTYsCi0JLmRhdGFfbGluZXMJPSAxOCwKLSNpZmRlZiBVU0VfMzVJTkNIX0xDRAotCS54X3JlcwkJPSAyNDAsCi0JLnlfcmVzCQk9IDMyMCwKLQkuaHN3CQk9IDIsCi0JLmhmcAkJPSAzLAotCS5oYnAJCT0gOSwKLQkudnN3CQk9IDQsCi0JLnZmcAkJPSAzLAotCS52YnAJCT0gNSwKLSNlbHNlCi0JLnhfcmVzCQk9IDQ4MCwKLQkueV9yZXMJCT0gMjcyLAotCS5oc3cJCT0gNDEsCi0JLmhmcAkJPSAyLAotCS5oYnAJCT0gMiwKLQkudnN3CQk9IDEwLAotCS52ZnAJCT0gMiwKLQkudmJwCQk9IDIsCi0jZW5kaWYKLQkucGl4ZWxfY2xvY2sJPSA2MjUwLAotCi0JLmluaXQJCT0gYXBvbGxvbl9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gYXBvbGxvbl9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gYXBvbGxvbl9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBhcG9sbG9uX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gYXBvbGxvbl9wYW5lbF9nZXRfY2FwcywKLX07Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmYXBvbGxvbl9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXBvbGxvbl9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhcG9sbG9uX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFwb2xsb25fcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXBvbGxvbl9wYW5lbF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGFwb2xsb25fcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBhcG9sbG9uX3BhbmVsX3JlbW92ZSwKLQkuc3VzcGVuZAk9IGFwb2xsb25fcGFuZWxfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGFwb2xsb25fcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhcG9sbG9uX2xjZCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhcG9sbG9uX3BhbmVsX2Rydl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXBvbGxvbl9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXBvbGxvbl9wYW5lbF9kcnZfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcG9sbG9uX3BhbmVsX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGFwb2xsb25fcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoYXBvbGxvbl9wYW5lbF9kcnZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKaW5kZXggOGRmNjg4Ny4uNjIyYWQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oMy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy90cHM2NTAxMC5oPgogCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlICJvbWFwZmIuaCIKIAogI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiLWxjZF9oMyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhMDZhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2g0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBINCBib2FyZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLXN0YXRpYyBpbnQgaDRfcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoNF9wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaDRfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaDRfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGNkX3BhbmVsIGg0X3BhbmVsID0gewotCS5uYW1lCQk9ICJoNCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAotCi0JLmJwcAkJPSAxNiwKLQkuZGF0YV9saW5lcwk9IDE2LAotCS54X3JlcwkJPSAyNDAsCi0JLnlfcmVzCQk9IDMyMCwKLQkucGl4ZWxfY2xvY2sJPSA2MjUwLAotCS5oc3cJCT0gMTUsCi0JLmhmcAkJPSAxNSwKLQkuaGJwCQk9IDYwLAotCS52c3cJCT0gMSwKLQkudmZwCQk9IDEsCi0JLnZicAkJPSAxLAotCi0JLmluaXQJCT0gaDRfcGFuZWxfaW5pdCwKLQkuY2xlYW51cAk9IGg0X3BhbmVsX2NsZWFudXAsCi0JLmVuYWJsZQkJPSBoNF9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBoNF9wYW5lbF9kaXNhYmxlLAotCS5nZXRfY2Fwcwk9IGg0X3BhbmVsX2dldF9jYXBzLAotfTsKLQotc3RhdGljIGludCBoNF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaDRfcGFuZWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGg0X3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaDRfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGg0X3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaDRfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBoNF9wYW5lbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBoNF9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gaDRfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJsY2RfaDQiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaDRfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoNF9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaDRfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaDRfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaDRfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoaDRfcGFuZWxfZHJ2X2NsZWFudXApOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE2MTAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCmluZGV4IDlmZmY4NmYuLjEyY2M1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgIm9tYXBmYi5oIgogCiAjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmItbGNkX2gzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbGRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTk1MmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9sZHAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBMRFAgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgV2luZFJpdmVyCi0gKiBBdXRob3I6IFN0YW5sZXkgTWlhbyA8c3RhbmxleS5taWFvQHdpbmRyaXZlci5jb20+Ci0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmlkZW8vb21hcC9sY2QtMjQzMHNkcC5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPCSgxNSArIE9NQVBfTUFYX0dQSU9fTElORVMpCi0jZGVmaW5lIExDRF9QQU5FTF9FTkFCTEVfR1BJTwkJKDcgKyBPTUFQX01BWF9HUElPX0xJTkVTKQotCi0jZGVmaW5lIExDRF9QQU5FTF9SRVNFVF9HUElPCQk1NQotI2RlZmluZSBMQ0RfUEFORUxfUVZHQV9HUElPCQk1NgotCi0jaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEX1ZHQQotI2RlZmluZSBMQ0RfWFJFUwkJNDgwCi0jZGVmaW5lIExDRF9ZUkVTCQk2NDAKLSNkZWZpbmUgTENEX1BJWENMT0NLX01BWAk0MTcwMAotI2Vsc2UKLSNkZWZpbmUgTENEX1hSRVMJCTI0MAotI2RlZmluZSBMQ0RfWVJFUwkJMzIwCi0jZGVmaW5lIExDRF9QSVhDTE9DS19NQVgJMTg1MTg2Ci0jZW5kaWYKLQotI2RlZmluZSBQTV9SRUNFSVZFUiAgICAgICAgICAgICBUV0w0MDMwX01PRFVMRV9QTV9SRUNFSVZFUgotI2RlZmluZSBFTkFCTEVfVkFVWDJfREVESUNBVEVEICAweDA5Ci0jZGVmaW5lIEVOQUJMRV9WQVVYMl9ERVZfR1JQICAgIDB4MjAKLSNkZWZpbmUgRU5BQkxFX1ZBVVgzX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WQVVYM19ERVZfR1JQCTB4MjAKLQotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVEICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAgICAgICAgICAgICAweEUwCi0jZGVmaW5lIFRXTDQwMzBfVlBMTDJfREVWX0dSUCAgICAgICAgICAgMHgzMwotI2RlZmluZSBUV0w0MDMwX1ZQTEwyX0RFRElDQVRFRCAgICAgICAgIDB4MzYKLQotI2RlZmluZSB0Ml9vdXQoYywgciwgdikgdHdsX2kyY193cml0ZV91OChjLCByLCB2KQotCi0KLXN0YXRpYyBpbnQgbGRwX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUkVTRVRfR1BJTywgImxjZCByZXNldCIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUVZHQV9HUElPLCAibGNkIHF2Z2EiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX0VOQUJMRV9HUElPLCAibGNkIHBhbmVsIik7Ci0JZ3Bpb19yZXF1ZXN0KExDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgImxjZCBiYWNrbGlnaHQiKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfUVZHQV9HUElPLCAwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1JFU0VUX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIDApOwotCi0jaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEX1ZHQQotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9RVkdBX0dQSU8sIDApOwotI2Vsc2UKLQlncGlvX3NldF92YWx1ZShMQ0RfUEFORUxfUVZHQV9HUElPLCAxKTsKLSNlbmRpZgotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9SRVNFVF9HUElPLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBsZHBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX0JBQ0tMSUdIVF9HUElPKTsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX0VOQUJMRV9HUElPKTsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX1FWR0FfR1BJTyk7Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9SRVNFVF9HUElPKTsKLX0KLQotc3RhdGljIGludCBsZHBfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWlmICgwICE9IHQyX291dChQTV9SRUNFSVZFUiwgRU5BQkxFX1ZQTEwyX0RFRElDQVRFRCwKLQkJCVRXTDQwMzBfVlBMTDJfREVESUNBVEVEKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKDAgIT0gdDJfb3V0KFBNX1JFQ0VJVkVSLCBFTkFCTEVfVlBMTDJfREVWX0dSUCwKLQkJCVRXTDQwMzBfVlBMTDJfREVWX0dSUCkpCi0JCXJldHVybiAtRUlPOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9QQU5FTF9CQUNLTElHSFRfR1BJTywgMSk7Ci0KLQlpZiAoMCAhPSB0Ml9vdXQoUE1fUkVDRUlWRVIsIEVOQUJMRV9WQVVYM19ERURJQ0FURUQsCi0JCQkJVFdMNDAzMF9WQVVYM19ERURJQ0FURUQpKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoMCAhPSB0Ml9vdXQoUE1fUkVDRUlWRVIsIEVOQUJMRV9WQVVYM19ERVZfR1JQLAotCQkJCVRXTDQwMzBfVkFVWDNfREVWX0dSUCkpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxkcF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfQkFDS0xJR0hUX0dQSU8sIDApOwotCi0JdDJfb3V0KFBNX1JFQ0VJVkVSLCAweDAsIFRXTDQwMzBfVlBMTDJfREVESUNBVEVEKTsKLQl0Ml9vdXQoUE1fUkVDRUlWRVIsIDB4MCwgVFdMNDAzMF9WUExMMl9ERVZfR1JQKTsKLQltc2xlZXAoNCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxkcF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGxjZF9wYW5lbCBsZHBfcGFuZWwgPSB7Ci0JLm5hbWUJCT0gImxkcCIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTgsCi0JLnhfcmVzCQk9IExDRF9YUkVTLAotCS55X3JlcwkJPSBMQ0RfWVJFUywKLQkuaHN3CQk9IDMsCQkvKiBoc3luY19sZW4gKDQpIC0gMSAqLwotCS5oZnAJCT0gMywJCS8qIHJpZ2h0X21hcmdpbiAoNCkgLSAxICovCi0JLmhicAkJPSAzOSwJCS8qIGxlZnRfbWFyZ2luICg0MCkgLSAxICovCi0JLnZzdwkJPSAxLAkJLyogdnN5bmNfbGVuICgyKSAtIDEgKi8KLQkudmZwCQk9IDIsCQkvKiBsb3dlcl9tYXJnaW4gKi8KLQkudmJwCQk9IDcsCQkvKiB1cHBlcl9tYXJnaW4gKDgpIC0gMSAqLwotCi0JLnBpeGVsX2Nsb2NrCT0gTENEX1BJWENMT0NLX01BWCwKLQotCS5pbml0CQk9IGxkcF9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gbGRwX3BhbmVsX2NsZWFudXAsCi0JLmVuYWJsZQkJPSBsZHBfcGFuZWxfZW5hYmxlLAotCS5kaXNhYmxlCT0gbGRwX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gbGRwX3BhbmVsX2dldF9jYXBzLAotfTsKLQotc3RhdGljIGludCBsZHBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmxkcF9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGRwX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkcF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkcF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsZHBfcGFuZWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBsZHBfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBsZHBfcGFuZWxfcmVtb3ZlLAotCS5zdXNwZW5kCT0gbGRwX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBsZHBfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJsZHBfbGNkIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxkcF9wYW5lbF9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmxkcF9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbGRwX3BhbmVsX2Rydl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmxkcF9wYW5lbF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChsZHBfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQobGRwX3BhbmVsX2Rydl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfbWlwaWQuYwppbmRleCA5MGUzYmRkLi5lYjM4MWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX21pcGlkLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9taXBpZC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHBsYXQvbGNkX21pcGlkLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNiZWFnbGUuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNiZWFnbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNmMzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29tYXAzYmVhZ2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUDMgQmVhZ2xlIGJvYXJkCi0gKgotICogQXV0aG9yOiBLb2VuIEtvb2kgPGtvZW5Ab3BlbmVtYmVkZGVkLm9yZz4KLSAqCi0gKiBEZXJpdmVkIGZyb20gZHJpdmVycy92aWRlby9vbWFwL2xjZC1vbWFwM2V2bS5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0VOQUJMRV9HUElPICAgICAgIDE3MAotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQotewotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sICJMQ0QgZW5hYmxlIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAzYmVhZ2xlX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTyk7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXAzYmVhZ2xlX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX1BBTkVMX0VOQUJMRV9HUElPLCAwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcDNiZWFnbGVfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBsY2RfcGFuZWwgb21hcDNiZWFnbGVfcGFuZWwgPSB7Ci0JLm5hbWUJCT0gIm9tYXAzYmVhZ2xlIiwKLQkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMjQsCi0JLnhfcmVzCQk9IDEwMjQsCi0JLnlfcmVzCQk9IDc2OCwKLQkuaHN3CQk9IDMsCQkvKiBoc3luY19sZW4gKDQpIC0gMSAqLwotCS5oZnAJCT0gMywJCS8qIHJpZ2h0X21hcmdpbiAoNCkgLSAxICovCi0JLmhicAkJPSAzOSwJCS8qIGxlZnRfbWFyZ2luICg0MCkgLSAxICovCi0JLnZzdwkJPSAxLAkJLyogdnN5bmNfbGVuICgyKSAtIDEgKi8KLQkudmZwCQk9IDIsCQkvKiBsb3dlcl9tYXJnaW4gKi8KLQkudmJwCQk9IDcsCQkvKiB1cHBlcl9tYXJnaW4gKDgpIC0gMSAqLwotCi0JLnBpeGVsX2Nsb2NrCT0gNjQwMDAsCi0KLQkuaW5pdAkJPSBvbWFwM2JlYWdsZV9wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gb21hcDNiZWFnbGVfcGFuZWxfY2xlYW51cCwKLQkuZW5hYmxlCQk9IG9tYXAzYmVhZ2xlX3BhbmVsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG9tYXAzYmVhZ2xlX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gb21hcDNiZWFnbGVfcGFuZWxfZ2V0X2NhcHMsCi19OwotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvbWFwM2JlYWdsZV9wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNiZWFnbGVfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCSAgIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXAzYmVhZ2xlX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXAzYmVhZ2xlX3BhbmVsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gb21hcDNiZWFnbGVfcGFuZWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBvbWFwM2JlYWdsZV9wYW5lbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBvbWFwM2JlYWdsZV9wYW5lbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gb21hcDNiZWFnbGVfcGFuZWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvbWFwM2JlYWdsZV9sY2QiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb21hcDNiZWFnbGVfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwM2JlYWdsZV9wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb21hcDNiZWFnbGVfcGFuZWxfZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcDNiZWFnbGVfcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob21hcDNiZWFnbGVfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQob21hcDNiZWFnbGVfcGFuZWxfZHJ2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vbWFwM2V2bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg0MGRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb21hcDNldm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMyBFVk0gYm9hcmQKLSAqCi0gKiBBdXRob3I6IFN0ZXZlIFNha29tYW4gPHN0ZXZlQHNha29tYW4uY29tPgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkLWFwb2xsb24uYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotCi0jaW5jbHVkZSA8cGxhdC9tdXguaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSAib21hcGZiLmgiCi0KLSNkZWZpbmUgTENEX1BBTkVMX0VOQUJMRV9HUElPICAgICAgIDE1MwotI2RlZmluZSBMQ0RfUEFORUxfTFIgICAgICAgICAgICAgICAgMgotI2RlZmluZSBMQ0RfUEFORUxfVUQgICAgICAgICAgICAgICAgMwotI2RlZmluZSBMQ0RfUEFORUxfSU5JICAgICAgICAgICAgICAgMTUyCi0jZGVmaW5lIExDRF9QQU5FTF9RVkdBICAgICAgICAgICAgICAxNTQKLSNkZWZpbmUgTENEX1BBTkVMX1JFU0IgICAgICAgICAgICAgIDE1NQotCi0jZGVmaW5lIEVOQUJMRV9WREFDX0RFRElDQVRFRAkweDAzCi0jZGVmaW5lIEVOQUJMRV9WREFDX0RFVl9HUlAJMHgyMAotI2RlZmluZSBFTkFCTEVfVlBMTDJfREVESUNBVEVECTB4MDUKLSNkZWZpbmUgRU5BQkxFX1ZQTEwyX0RFVl9HUlAJMHhFMAotCi0jZGVmaW5lIFRXTF9MRURfTEVERU4JCTB4MDAKLSNkZWZpbmUgVFdMX1BXTUFfUFdNQU9OCQkweDAwCi0jZGVmaW5lIFRXTF9QV01BX1BXTUFPRkYJMHgwMQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGJrbGlnaHRfbGV2ZWw7Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKLQkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCi17Ci0JZ3Bpb19yZXF1ZXN0KExDRF9QQU5FTF9MUiwgIkxDRCBsciIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfVUQsICJMQ0QgdWQiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX0lOSSwgIkxDRCBpbmkiKTsKLQlncGlvX3JlcXVlc3QoTENEX1BBTkVMX1JFU0IsICJMQ0QgcmVzYiIpOwotCWdwaW9fcmVxdWVzdChMQ0RfUEFORUxfUVZHQSwgIkxDRCBxdmdhIik7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1JFU0IsIDEpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfSU5JLCAxKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1FWR0EsIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfTFIsIDEpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfVUQsIDEpOwotCi0JdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9MRUQsIDB4MTEsIFRXTF9MRURfTEVERU4pOwotCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUFdNQSwgMHgwMSwgVFdMX1BXTUFfUFdNQU9OKTsKLQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTUEsIDB4MDIsIFRXTF9QV01BX1BXTUFPRkYpOwotCWJrbGlnaHRfbGV2ZWwgPSAxMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgb21hcDNldm1fcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX2ZyZWUoTENEX1BBTkVMX1FWR0EpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfUkVTQik7Ci0JZ3Bpb19mcmVlKExDRF9QQU5FTF9JTkkpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfVUQpOwotCWdwaW9fZnJlZShMQ0RfUEFORUxfTFIpOwotfQotCi1zdGF0aWMgaW50IG9tYXAzZXZtX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlncGlvX3NldF92YWx1ZShMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwM2V2bV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fc2V0X3ZhbHVlKExDRF9QQU5FTF9FTkFCTEVfR1BJTywgMSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXAzZXZtX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXAzZXZtX2JrbGlnaHRfc2V0bGV2ZWwoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCi0JCQkJCQl1bnNpZ25lZCBpbnQgbGV2ZWwpCi17Ci0JdTggYzsKLQlpZiAoKGxldmVsID49IDApICYmIChsZXZlbCA8PSAxMDApKSB7Ci0JCWMgPSAoMTI1ICogKDEwMCAtIGxldmVsKSkgLyAxMDAgKyAyOwotCQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTUEsIGMsIFRXTF9QV01BX1BXTUFPRkYpOwotCQlia2xpZ2h0X2xldmVsID0gbGV2ZWw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG9tYXAzZXZtX2JrbGlnaHRfZ2V0bGV2ZWwoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JcmV0dXJuIGJrbGlnaHRfbGV2ZWw7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgb21hcDNldm1fYmtsaWdodF9nZXRtYXhsZXZlbChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKLXsKLQlyZXR1cm4gMTAwOwotfQotCi1zdHJ1Y3QgbGNkX3BhbmVsIG9tYXAzZXZtX3BhbmVsID0gewotCS5uYW1lCQk9ICJvbWFwM2V2bSIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8Ci0JCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMsCi0KLQkuYnBwCQk9IDE2LAotCS5kYXRhX2xpbmVzCT0gMTgsCi0JLnhfcmVzCQk9IDQ4MCwKLQkueV9yZXMJCT0gNjQwLAotCS5oc3cJCT0gMywJCS8qIGhzeW5jX2xlbiAoNCkgLSAxICovCi0JLmhmcAkJPSAzLAkJLyogcmlnaHRfbWFyZ2luICg0KSAtIDEgKi8KLQkuaGJwCQk9IDM5LAkJLyogbGVmdF9tYXJnaW4gKDQwKSAtIDEgKi8KLQkudnN3CQk9IDEsCQkvKiB2c3luY19sZW4gKDIpIC0gMSAqLwotCS52ZnAJCT0gMiwJCS8qIGxvd2VyX21hcmdpbiAqLwotCS52YnAJCT0gNywJCS8qIHVwcGVyX21hcmdpbiAoOCkgLSAxICovCi0KLQkucGl4ZWxfY2xvY2sJPSAyNjAwMCwKLQotCS5pbml0CQk9IG9tYXAzZXZtX3BhbmVsX2luaXQsCi0JLmNsZWFudXAJPSBvbWFwM2V2bV9wYW5lbF9jbGVhbnVwLAotCS5lbmFibGUJCT0gb21hcDNldm1fcGFuZWxfZW5hYmxlLAotCS5kaXNhYmxlCT0gb21hcDNldm1fcGFuZWxfZGlzYWJsZSwKLQkuZ2V0X2NhcHMJPSBvbWFwM2V2bV9wYW5lbF9nZXRfY2FwcywKLQkuc2V0X2JrbGlnaHRfbGV2ZWwgICAgICA9IG9tYXAzZXZtX2JrbGlnaHRfc2V0bGV2ZWwsCi0JLmdldF9ia2xpZ2h0X2xldmVsICAgICAgPSBvbWFwM2V2bV9ia2xpZ2h0X2dldGxldmVsLAotCS5nZXRfYmtsaWdodF9tYXggICAgICAgID0gb21hcDNldm1fYmtsaWdodF9nZXRtYXhsZXZlbCwKLX07Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJm9tYXAzZXZtX3BhbmVsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwM2V2bV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvbWFwM2V2bV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJICAgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcDNldm1fcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDNldm1fcGFuZWxfZHJpdmVyID0gewotCS5wcm9iZQkJPSBvbWFwM2V2bV9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IG9tYXAzZXZtX3BhbmVsX3JlbW92ZSwKLQkuc3VzcGVuZAk9IG9tYXAzZXZtX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBvbWFwM2V2bV9wYW5lbF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIm9tYXAzZXZtX2xjZCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwM2V2bV9wYW5lbF9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXAzZXZtX3BhbmVsX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwM2V2bV9wYW5lbF9kcnZfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwM2V2bV9wYW5lbF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChvbWFwM2V2bV9wYW5lbF9kcnZfaW5pdCk7Ci1tb2R1bGVfZXhpdChvbWFwM2V2bV9wYW5lbF9kcnZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwppbmRleCBiODdlOGI4Li42ZjhkMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3NrLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9tdXguaD4KICNpbmNsdWRlICJvbWFwZmIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vdmVyby5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vdmVyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ5MzNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfb3Zlcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBHdW1zdGl4IE92ZXJvCi0gKgotICogQXV0aG9yOiBTdGV2ZSBTYWtvbWFuIDxzdGV2ZUBzYWtvbWFuLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLQotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPHBsYXQvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLQotI2luY2x1ZGUgIm9tYXBmYi5oIgotCi0jZGVmaW5lIExDRF9FTkFCTEUgICAgICAgMTQ0Ci0KLXN0YXRpYyBpbnQgb3Zlcm9fcGFuZWxfaW5pdChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCwKLQkJCQlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCi17Ci0JaWYgKChncGlvX3JlcXVlc3QoTENEX0VOQUJMRSwgIkxDRF9FTkFCTEUiKSA9PSAwKSAmJgotCSAgICAoZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KExDRF9FTkFCTEUsIDEpID09IDApKQotCQlncGlvX2V4cG9ydChMQ0RfRU5BQkxFLCAwKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IG9idGFpbiBncGlvIGZvciBMQ0RfRU5BQkxFXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvdmVyb19wYW5lbF9jbGVhbnVwKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCWdwaW9fZnJlZShMQ0RfRU5BQkxFKTsKLX0KLQotc3RhdGljIGludCBvdmVyb19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX0VOQUJMRSwgMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG92ZXJvX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoTENEX0VOQUJMRSwgMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG92ZXJvX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQotewotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgbGNkX3BhbmVsIG92ZXJvX3BhbmVsID0gewotCS5uYW1lCQk9ICJvdmVybyIsCi0JLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAotCS5icHAJCT0gMTYsCi0JLmRhdGFfbGluZXMJPSAyNCwKLQotI2lmIGRlZmluZWQgQ09ORklHX0ZCX09NQVBfMDMxTTNSCi0KLQkvKiA2NDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLwotCS54X3JlcwkJPSA2NDAsCi0JLnlfcmVzCQk9IDQ4MCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA0LAotCS52YnAJCT0gNywKLQkucGl4ZWxfY2xvY2sJPSAyMzUwMCwKLQotI2VsaWYgZGVmaW5lZCBDT05GSUdfRkJfT01BUF8wNDhNM1IKLQotCS8qIDgwMCB4IDYwMCBAIDYwIEh6ICBSZWR1Y2VkIGJsYW5raW5nIFZFU0EgQ1ZUIDAuNDhNMy1SICovCi0JLnhfcmVzCQk9IDgwMCwKLQkueV9yZXMJCT0gNjAwLAotCS5oZnAJCT0gNDgsCi0JLmhzdwkJPSAzMiwKLQkuaGJwCQk9IDgwLAotCS52ZnAJCT0gMywKLQkudnN3CQk9IDQsCi0JLnZicAkJPSAxMSwKLQkucGl4ZWxfY2xvY2sJPSAzNTUwMCwKLQotI2VsaWYgZGVmaW5lZCBDT05GSUdfRkJfT01BUF8wNzlNM1IKLQotCS8qIDEwMjQgeCA3NjggQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjc5TTMtUiAqLwotCS54X3JlcwkJPSAxMDI0LAotCS55X3JlcwkJPSA3NjgsCi0JLmhmcAkJPSA0OCwKLQkuaHN3CQk9IDMyLAotCS5oYnAJCT0gODAsCi0JLnZmcAkJPSAzLAotCS52c3cJCT0gNCwKLQkudmJwCQk9IDE1LAotCS5waXhlbF9jbG9jawk9IDU2MDAwLAotCi0jZWxpZiBkZWZpbmVkIENPTkZJR19GQl9PTUFQXzA5Mk05UgotCi0JLyogMTI4MCB4IDcyMCBAIDYwIEh6ICBSZWR1Y2VkIGJsYW5raW5nIFZFU0EgQ1ZUIDAuOTJNOS1SICovCi0JLnhfcmVzCQk9IDEyODAsCi0JLnlfcmVzCQk9IDcyMCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA1LAotCS52YnAJCT0gMTMsCi0JLnBpeGVsX2Nsb2NrCT0gNjQwMDAsCi0KLSNlbHNlCi0KLQkvKiB1c2UgNjQwIHggNDgwIGlmIG5vIGNvbmZpZyBvcHRpb24gKi8KLQkvKiA2NDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLwotCS54X3JlcwkJPSA2NDAsCi0JLnlfcmVzCQk9IDQ4MCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA0LAotCS52YnAJCT0gNywKLQkucGl4ZWxfY2xvY2sJPSAyMzUwMCwKLQotI2VuZGlmCi0KLQkuaW5pdAkJPSBvdmVyb19wYW5lbF9pbml0LAotCS5jbGVhbnVwCT0gb3Zlcm9fcGFuZWxfY2xlYW51cCwKLQkuZW5hYmxlCQk9IG92ZXJvX3BhbmVsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG92ZXJvX3BhbmVsX2Rpc2FibGUsCi0JLmdldF9jYXBzCT0gb3Zlcm9fcGFuZWxfZ2V0X2NhcHMsCi19OwotCi1zdGF0aWMgaW50IG92ZXJvX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZvdmVyb19wYW5lbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Zlcm9fcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JLyogb21hcGZiIGRvZXMgbm90IGhhdmUgdW5yZWdpc3Rlcl9wYW5lbCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvdmVyb19wYW5lbF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG92ZXJvX3BhbmVsX3Byb2JlLAotCS5yZW1vdmUJCT0gb3Zlcm9fcGFuZWxfcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJvdmVyb19sY2QiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgb3Zlcm9fcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvdmVyb19wYW5lbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgb3Zlcm9fcGFuZWxfZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3Zlcm9fcGFuZWxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob3Zlcm9fcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQob3Zlcm9fcGFuZWxfZHJ2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXR0LmMKaW5kZXggZmYwZTZkNy4uYjUxYjMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSAib21hcGZiLmgiCiAKIHN0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCmluZGV4IGIzZGRkNzQuLjI1ZDhlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9LY29uZmlnCmluZGV4IDYwOWEyODAuLjhkOGUxZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcKQEAgLTEwLDYgKzEwLDEzIEBACiAJICBTdXBwb3J0cyBMQ0QgUGFuZWwgdXNlZCBpbiBUSSBTRFAzNDMwIGFuZCBFVk0gYm9hcmRzLAogCSAgT01BUDM1MTcgRVZNIGJvYXJkcyBhbmQgQ00tVDM1LgogCitjb25maWcgUEFORUxfRFZJCisJdHJpc3RhdGUgIkRWSSBvdXRwdXQiCisJZGVwZW5kcyBvbiBPTUFQMl9EU1NfRFBJCisJaGVscAorCSAgRHJpdmVyIGZvciBleHRlcm5hbCBtb25pdG9ycywgY29ubmVjdGVkIHZpYSBEVkkuIFRoZSBkcml2ZXIgdXNlcyBpMmMKKwkgIHRvIHJlYWQgRURJRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb25pdG9yLgorCiBjb25maWcgUEFORUxfTEdQSElMSVBTX0xCMDM1UTAyCiAJdHJpc3RhdGUgIkxHLlBoaWxpcHMgTEIwMzVRMDIgTENEIFBhbmVsIgogCWRlcGVuZHMgb24gT01BUDJfRFNTX0RQSSAmJiBTUEkKQEAgLTE5LDIwICsyNiwzMCBAQAogY29uZmlnIFBBTkVMX1NIQVJQX0xTMDM3VjdEVzAxCiAgICAgICAgIHRyaXN0YXRlICJTaGFycCBMUzAzN1Y3RFcwMSBMQ0QgUGFuZWwiCiAgICAgICAgIGRlcGVuZHMgb24gT01BUDJfRFNTX0RQSQotICAgICAgICBzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorICAgICAgICBkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKICAgICAgICAgaGVscAogICAgICAgICAgIExDRCBQYW5lbCB1c2VkIGluIFRJJ3MgU0RQMzQzMCBhbmQgRVZNIGJvYXJkcwogCiBjb25maWcgUEFORUxfTkVDX05MODA0OEhMMTFfMDFCCiAJdHJpc3RhdGUgIk5FQyBOTDgwNDhITDExLTAxQiBQYW5lbCIKIAlkZXBlbmRzIG9uIE9NQVAyX0RTU19EUEkKKwlkZXBlbmRzIG9uIFNQSQorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWhlbHAKIAkJVGhpcyBORUMgTkw4MDQ4SEwxMS0wMUIgcGFuZWwgaXMgVEZUIExDRAogCQl1c2VkIGluIHRoZSBab29tMi8zLzM2MzAgc2RwIGJvYXJkcy4KIAorY29uZmlnIFBBTkVMX1BJQ09ETFAKKwl0cmlzdGF0ZSAiVEkgUElDTyBETFAgbWluaS1wcm9qZWN0b3IiCisJZGVwZW5kcyBvbiBPTUFQMl9EU1MgJiYgSTJDCisJaGVscAorCQlBIG1pbmktcHJvamVjdG9yIHVzZWQgaW4gVEkncyBTRFA0NDMwIGFuZCBFVk0gYm9hcmRzCisJCUZvciBtb3JlIGluZm8gcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cuZGxwLmNvbS9wcm9qZWN0b3IvCisKIGNvbmZpZyBQQU5FTF9UQUFMCiAgICAgICAgIHRyaXN0YXRlICJUYWFsIERTSSBQYW5lbCIKICAgICAgICAgZGVwZW5kcyBvbiBPTUFQMl9EU1NfRFNJCisgICAgICAgIGRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogICAgICAgICBoZWxwCiAgICAgICAgICAgVGFhbCBEU0kgY29tbWFuZCBtb2RlIHBhbmVsIGZyb20gVFBPLgogCkBAIC00NSw3ICs2MiwxNCBAQAogY29uZmlnIFBBTkVMX0FDWDU2NUFLTQogCXRyaXN0YXRlICJBQ1g1NjVBS00gUGFuZWwiCiAJZGVwZW5kcyBvbiBPTUFQMl9EU1NfU0RJICYmIFNQSQotCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgTENEIHBhbmVsIHVzZWQgb24gTm9raWEgTjkwMAorCitjb25maWcgUEFORUxfTjhYMAorCXRyaXN0YXRlICJOOFgwIFBhbmVsIgorCWRlcGVuZHMgb24gT01BUDJfRFNTX1JGQkkgJiYgU1BJCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJaGVscAorCSAgVGhpcyBpcyB0aGUgTENEIHBhbmVsIHVzZWQgb24gTm9raWEgTjh4MAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUKaW5kZXggMGY2MDFhYjNhLi5mYmZhZmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUKQEAgLTEsOCArMSwxMSBAQAogb2JqLSQoQ09ORklHX1BBTkVMX0dFTkVSSUNfRFBJKSArPSBwYW5lbC1nZW5lcmljLWRwaS5vCitvYmotJChDT05GSUdfUEFORUxfRFZJKSArPSBwYW5lbC1kdmkubwogb2JqLSQoQ09ORklHX1BBTkVMX0xHUEhJTElQU19MQjAzNVEwMikgKz0gcGFuZWwtbGdwaGlsaXBzLWxiMDM1cTAyLm8KIG9iai0kKENPTkZJR19QQU5FTF9TSEFSUF9MUzAzN1Y3RFcwMSkgKz0gcGFuZWwtc2hhcnAtbHMwMzd2N2R3MDEubwogb2JqLSQoQ09ORklHX1BBTkVMX05FQ19OTDgwNDhITDExXzAxQikgKz0gcGFuZWwtbmVjLW5sODA0OGhsMTEtMDFiLm8KIAogb2JqLSQoQ09ORklHX1BBTkVMX1RBQUwpICs9IHBhbmVsLXRhYWwubworb2JqLSQoQ09ORklHX1BBTkVMX1BJQ09ETFApICs9ICBwYW5lbC1waWNvZGxwLm8KIG9iai0kKENPTkZJR19QQU5FTF9UUE9fVEQwNDNNVEVBMSkgKz0gcGFuZWwtdHBvLXRkMDQzbXRlYTEubwogb2JqLSQoQ09ORklHX1BBTkVMX0FDWDU2NUFLTSkgKz0gcGFuZWwtYWN4NTY1YWttLm8KK29iai0kKENPTkZJR19QQU5FTF9OOFgwKSArPSBwYW5lbC1uOHgwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZHZpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWR2aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWIxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWR2aS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogRFZJIG91dHB1dCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYworICogQXV0aG9yOiBUb21pIFZhbGtlaW5lbiA8dG9taS52YWxrZWluZW5AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9lZGlkLmg+CisKKyNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWR2aS5oPgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBwYW5lbF9kdmlfZGVmYXVsdF90aW1pbmdzID0geworCS54X3JlcwkJPSA2NDAsCisJLnlfcmVzCQk9IDQ4MCwKKworCS5waXhlbF9jbG9jawk9IDIzNTAwLAorCisJLmhmcAkJPSA0OCwKKwkuaHN3CQk9IDMyLAorCS5oYnAJCT0gODAsCisKKwkudmZwCQk9IDMsCisJLnZzdwkJPSA0LAorCS52YnAJCT0gNywKK307CisKK3N0cnVjdCBwYW5lbF9kcnZfZGF0YSB7CisJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OworCisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YQorKmdldF9wZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIGRzc2Rldi0+ZGF0YTsKK30KKworc3RhdGljIGludCBwYW5lbF9kdmlfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kdmlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBnZXRfcGRhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjA7CisKKwlpZiAocGRhdGEtPnBsYXRmb3JtX2VuYWJsZSkgeworCQlyID0gcGRhdGEtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyMTsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjE6CisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnIwOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9kdmlfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZ2V0X3BkYXRhKGRzc2Rldik7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKHBkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKQorCQlwZGF0YS0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhOworCisJZGRhdGEgPSBremFsbG9jKHNpemVvZigqZGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IHBhbmVsX2R2aV9kZWZhdWx0X3RpbWluZ3M7CisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOworCisJZGRhdGEtPmRzc2RldiA9IGRzc2RldjsKKwltdXRleF9pbml0KCZkZGF0YS0+bG9jayk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBkZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBhbmVsX2R2aV9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYsIE5VTEwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlrZnJlZShkZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJciA9IHBhbmVsX2R2aV9wb3dlcl9vbihkc3NkZXYpOworCWlmIChyID09IDApCisJCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2R2aV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlwYW5lbF9kdmlfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworfQorCitzdGF0aWMgaW50IHBhbmVsX2R2aV9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlwYW5lbF9kdmlfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbmVsX2R2aV9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXIgPSBwYW5lbF9kdmlfcG93ZXJfb24oZHNzZGV2KTsKKwlpZiAociA9PSAwKQorCQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9kdmlfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKwlkcGlfc2V0X3RpbWluZ3MoZHNzZGV2LCB0aW1pbmdzKTsKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcGFuZWxfZHZpX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisJKnRpbWluZ3MgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3M7CisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2NoZWNrX3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKwlyID0gZHBpX2NoZWNrX3RpbWluZ3MoZHNzZGV2LCB0aW1pbmdzKTsKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByOworfQorCisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX2RkY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJdW5zaWduZWQgY2hhciAqYnVmLCB1MTYgY291bnQsIHU4IG9mZnNldCkKK3sKKwlpbnQgciwgcmV0cmllczsKKworCWZvciAocmV0cmllcyA9IDM7IHJldHJpZXMgPiAwOyByZXRyaWVzLS0pIHsKKwkJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQkJeworCQkJCS5hZGRyICAgPSBERENfQUREUiwKKwkJCQkuZmxhZ3MgID0gMCwKKwkJCQkubGVuICAgID0gMSwKKwkJCQkuYnVmICAgID0gJm9mZnNldCwKKwkJCX0sIHsKKwkJCQkuYWRkciAgID0gRERDX0FERFIsCisJCQkJLmZsYWdzICA9IEkyQ19NX1JELAorCQkJCS5sZW4gICAgPSBjb3VudCwKKwkJCQkuYnVmICAgID0gYnVmLAorCQkJfQorCQl9OworCisJCXIgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMik7CisJCWlmIChyID09IDIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAociAhPSAtRUFHQUlOKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHIgPCAwID8gciA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcGFuZWxfZHZpX3JlYWRfZWRpZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXU4ICplZGlkLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZ2V0X3BkYXRhKGRzc2Rldik7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCWludCByLCBsLCBieXRlc19yZWFkOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJaWYgKHBkYXRhLT5pMmNfYnVzX251bSA9PSAwKSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBkYXRhLT5pMmNfYnVzX251bSk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBJMkMgYWRhcHRlciwgYnVzICVkXG4iLAorCQkJCXBkYXRhLT5pMmNfYnVzX251bSk7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlsID0gbWluKEVESURfTEVOR1RILCBsZW4pOworCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgZWRpZCwgbCwgMCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJYnl0ZXNfcmVhZCA9IGw7CisKKwkvKiBpZiB0aGVyZSBhcmUgZXh0ZW5zaW9ucywgcmVhZCBzZWNvbmQgYmxvY2sgKi8KKwlpZiAobGVuID4gRURJRF9MRU5HVEggJiYgZWRpZFsweDdlXSA+IDApIHsKKwkJbCA9IG1pbihFRElEX0xFTkdUSCwgbGVuIC0gRURJRF9MRU5HVEgpOworCisJCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgZWRpZCArIEVESURfTEVOR1RILAorCQkJCWwsIEVESURfTEVOR1RIKTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKworCQlieXRlc19yZWFkICs9IGw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gYnl0ZXNfcmVhZDsKKworZXJyOgorCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgYm9vbCBwYW5lbF9kdmlfZGV0ZWN0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJc3RydWN0IHBhbmVsX2R2aV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGdldF9wZGF0YShkc3NkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwl1bnNpZ25lZCBjaGFyIG91dDsKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCWlmIChwZGF0YS0+aTJjX2J1c19udW0gPT0gMCkKKwkJZ290byBvdXQ7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBkYXRhLT5pMmNfYnVzX251bSk7CisJaWYgKCFhZGFwdGVyKQorCQlnb3RvIG91dDsKKworCXIgPSBwYW5lbF9kdmlfZGRjX3JlYWQoYWRhcHRlciwgJm91dCwgMSwgMCk7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiByID09IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgcGFuZWxfZHZpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFuZWxfZHZpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19leGl0X3AocGFuZWxfZHZpX3JlbW92ZSksCisKKwkuZW5hYmxlCQk9IHBhbmVsX2R2aV9lbmFibGUsCisJLmRpc2FibGUJPSBwYW5lbF9kdmlfZGlzYWJsZSwKKwkuc3VzcGVuZAk9IHBhbmVsX2R2aV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFuZWxfZHZpX3Jlc3VtZSwKKworCS5zZXRfdGltaW5ncwk9IHBhbmVsX2R2aV9zZXRfdGltaW5ncywKKwkuZ2V0X3RpbWluZ3MJPSBwYW5lbF9kdmlfZ2V0X3RpbWluZ3MsCisJLmNoZWNrX3RpbWluZ3MJPSBwYW5lbF9kdmlfY2hlY2tfdGltaW5ncywKKworCS5yZWFkX2VkaWQJPSBwYW5lbF9kdmlfcmVhZF9lZGlkLAorCS5kZXRlY3QJCT0gcGFuZWxfZHZpX2RldGVjdCwKKworCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJkdmkiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBhbmVsX2R2aV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHZpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYW5lbF9kdmlfZXhpdCh2b2lkKQoreworCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kdmlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFuZWxfZHZpX2luaXQpOworbW9kdWxlX2V4aXQocGFuZWxfZHZpX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jCmluZGV4IDljOTBmNzUuLjUxOWM0N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZ2VuZXJpYy1kcGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMtZHBpLmMKQEAgLTU4LDMwICs1OCw2IEBACiAKIC8qIFBhbmVsIGNvbmZpZ3VyYXRpb25zICovCiBzdGF0aWMgc3RydWN0IHBhbmVsX2NvbmZpZyBnZW5lcmljX2RwaV9wYW5lbHNbXSA9IHsKLQkvKiBHZW5lcmljIFBhbmVsICovCi0JewotCQl7Ci0JCQkueF9yZXMJCT0gNjQwLAotCQkJLnlfcmVzCQk9IDQ4MCwKLQotCQkJLnBpeGVsX2Nsb2NrCT0gMjM1MDAsCi0KLQkJCS5oZnAJCT0gNDgsCi0JCQkuaHN3CQk9IDMyLAotCQkJLmhicAkJPSA4MCwKLQotCQkJLnZmcAkJPSAzLAotCQkJLnZzdwkJPSA0LAotCQkJLnZicAkJPSA3LAotCQl9LAotCQkuYWNiaQkJCT0gMHgwLAotCQkuYWNiCQkJPSAweDAsCi0JCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQsCi0JCS5wb3dlcl9vbl9kZWxheQkJPSAwLAotCQkucG93ZXJfb2ZmX2RlbGF5CT0gMCwKLQkJLm5hbWUJCQk9ICJnZW5lcmljIiwKLQl9LAotCiAJLyogU2hhcnAgTFEwNDNUMURHMDEgKi8KIAl7CiAJCXsKQEAgLTIzMiw2ICsyMDgsOTUgQEAKIAkJLnBvd2VyX29mZl9kZWxheQk9IDAsCiAJCS5uYW1lCQkJPSAicG93ZXJ0aXBfcGg0ODAyNzJ0IiwKIAl9LAorCisJLyogSW5ub2x1eCBBVDA3MFROODMgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSA4MDAsCisJCQkueV9yZXMJCT0gNDgwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA0MDAwMCwKKworCQkJLmhzdwkJPSA0OCwKKwkJCS5oZnAJCT0gMSwKKwkJCS5oYnAJCT0gMSwKKworCQkJLnZzdwkJPSAzLAorCQkJLnZmcAkJPSAxMiwKKwkJCS52YnAJCT0gMjUsCisJCX0sCisJCS5hY2JpCQkJPSAweDAsCisJCS5hY2IJCQk9IDB4MjgsCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJICBPTUFQX0RTU19MQ0RfSUhTLAorCQkucG93ZXJfb25fZGVsYXkJCT0gMCwKKwkJLnBvd2VyX29mZl9kZWxheQk9IDAsCisJCS5uYW1lCQkJPSAiaW5ub2x1eF9hdDA3MHRuODMiLAorCX0sCisKKwkvKiBORUMgTkwyNDMyRFIyMi0xMUIgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSAyNDAsCisJCQkueV9yZXMJCT0gMzIwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA1NDAwLAorCisJCQkuaHN3CQk9IDMsCisJCQkuaGZwCQk9IDMsCisJCQkuaGJwCQk9IDM5LAorCisJCQkudnN3CQk9IDEsCisJCQkudmZwCQk9IDIsCisJCQkudmJwCQk9IDcsCisJCX0sCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJCU9NQVBfRFNTX0xDRF9JSFMsCisJCS5uYW1lCQkJPSAibmVjX25sMjQzMmRyMjItMTFiIiwKKwl9LAorCisJLyogVW5rbm93biBwYW5lbCB1c2VkIGluIE9NQVAgSDQgKi8KKwl7CisJCXsKKwkJCS54X3JlcwkJPSAyNDAsCisJCQkueV9yZXMJCT0gMzIwLAorCisJCQkucGl4ZWxfY2xvY2sJPSA2MjUwLAorCisJCQkuaHN3CQk9IDE1LAorCQkJLmhmcAkJPSAxNSwKKwkJCS5oYnAJCT0gNjAsCisKKwkJCS52c3cJCT0gMSwKKwkJCS52ZnAJCT0gMSwKKwkJCS52YnAJCT0gMSwKKwkJfSwKKwkJLmNvbmZpZwkJCT0gT01BUF9EU1NfTENEX1RGVCwKKworCQkubmFtZQkJCT0gImg0IiwKKwl9LAorCisJLyogVW5rbm93biBwYW5lbCB1c2VkIGluIFNhbXN1bmcgT01BUDIgQXBvbGxvbiAqLworCXsKKwkJeworCQkJLnhfcmVzCQk9IDQ4MCwKKwkJCS55X3JlcwkJPSAyNzIsCisKKwkJCS5waXhlbF9jbG9jawk9IDYyNTAsCisKKwkJCS5oc3cJCT0gNDEsCisJCQkuaGZwCQk9IDIsCisJCQkuaGJwCQk9IDIsCisKKwkJCS52c3cJCT0gMTAsCisJCQkudmZwCQk9IDIsCisJCQkudmJwCQk9IDIsCisJCX0sCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJCU9NQVBfRFNTX0xDRF9JSFMsCisKKwkJLm5hbWUJCQk9ICJhcG9sbG9uIiwKKwl9LAogfTsKIAogc3RydWN0IHBhbmVsX2Rydl9kYXRhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtbjh4MC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1uOHgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwZThiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtbjh4MC5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1uOHgwLmg+CisKKyNkZWZpbmUgQkxJWlpBUkRfUkVWX0NPREUgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCTElaWkFSRF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJMSVpaQVJEX1BMTF9ESVYgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0xPQ0tfUkFOR0UgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBCTElaWkFSRF9QTExfQ0xPQ0tfU1lOVEhfMCAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgQkxJWlpBUkRfUExMX01PREUgICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBCTElaWkFSRF9DTEtfU1JDICAgICAgICAgICAgICAgICAgICAgICAweDBlCisjZGVmaW5lIEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUyAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBCTElaWkFSRF9QQU5FTF9DT05GSUdVUkFUSU9OICAgICAgICAgICAweDI4CisjZGVmaW5lIEJMSVpaQVJEX0hESVNQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmEKKyNkZWZpbmUgQkxJWlpBUkRfSE5EUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYworI2RlZmluZSBCTElaWkFSRF9WRElTUDAgICAgICAgICAgICAgICAgICAgICAgICAweDJlCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQkxJWlpBUkRfVk5EUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBCTElaWkFSRF9IU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIEJMSVpaQVJEX1ZTVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgQkxJWlpBUkRfRElTUExBWV9NT0RFICAgICAgICAgICAgICAgICAgMHg2OAorI2RlZmluZSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wICAgICAgICAgICAweDZjCisjZGVmaW5lIEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVCAgICAgICAgICAgIDB4OGUKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fREFUQV9QT1JUICAgICAgICAgICAgMHg5MAorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9SRUFEX0FERFIwICAgICAgICAgICAweDkyCisjZGVmaW5lIEJMSVpaQVJEX1BPV0VSX1NBVkUgICAgICAgICAgICAgICAgICAgIDB4RTYKKyNkZWZpbmUgQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMgICAgICAgICAgICAgMHhFOAorCisvKiBEYXRhIHNvdXJjZSBzZWxlY3QgKi8KKy8qIEZvciBTMUQxMzc0NSAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JBQ0tHUk9VTkQJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZFCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFCTB4MDQKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWQkJMHgwNQorLyogRm9yIFMxRDEzNzQ0ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0QJCQkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19CTFRfTENECQkJMHgwNgorCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1JHQjU2NQkJCTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfWVVWNDIwCQkJMHgwOQorCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUJCTB4MDEJLyogSGFpbHN0b3JtICovCisjZGVmaW5lIEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQJCTB4MDIJLyogQmxpenphcmQgKi8KKworI2RlZmluZSBNSVBJRF9DTURfUkVBRF9ESVNQX0lECQkweDA0CisjZGVmaW5lIE1JUElEX0NNRF9SRUFEX1JFRAkJMHgwNgorI2RlZmluZSBNSVBJRF9DTURfUkVBRF9HUkVFTgkJMHgwNworI2RlZmluZSBNSVBJRF9DTURfUkVBRF9CTFVFCQkweDA4CisjZGVmaW5lIE1JUElEX0NNRF9SRUFEX0RJU1BfU1RBVFVTCTB4MDkKKyNkZWZpbmUgTUlQSURfQ01EX1JERFNEUgkJMHgwRgorI2RlZmluZSBNSVBJRF9DTURfU0xFRVBfSU4JCTB4MTAKKyNkZWZpbmUgTUlQSURfQ01EX1NMRUVQX09VVAkJMHgxMQorI2RlZmluZSBNSVBJRF9DTURfRElTUF9PRkYJCTB4MjgKKyNkZWZpbmUgTUlQSURfQ01EX0RJU1BfT04JCTB4MjkKKworc3RhdGljIHN0cnVjdCBwYW5lbF9kcnZfZGF0YSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaWRldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisKKwlpbnQgYmxpenphcmRfdmVyOworfSBzX2Rydl9kYXRhOworCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmdldF9ib2FyZF9kYXRhKGNvbnN0IHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlyZXR1cm4gZHNzZGV2LT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmdldF9kcnZfZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuICZzX2Rydl9kYXRhOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibGl6emFyZF9jbWQodTggY21kKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxpenphcmRfd3JpdGUodTggY21kLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCW9tYXBfcmZiaV93cml0ZV9kYXRhKGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJsaXp6YXJkX3JlYWQodTggY21kLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW9tYXBfcmZiaV93cml0ZV9jb21tYW5kKCZjbWQsIDEpOworCW9tYXBfcmZiaV9yZWFkX2RhdGEoYnVmLCBsZW4pOworfQorCitzdGF0aWMgdTggYmxpenphcmRfcmVhZF9yZWcodTggY21kKQoreworCXU4IGRhdGE7CisJYmxpenphcmRfcmVhZChjbWQsICZkYXRhLCAxKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfY3RybF9zZXR1cF91cGRhdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZ2V0X2Rydl9kYXRhKGRzc2Rldik7CisJdTggdG1wWzE4XTsKKwlpbnQgeF9lbmQsIHlfZW5kOworCisJeF9lbmQgPSB4ICsgdyAtIDE7CisJeV9lbmQgPSB5ICsgaCAtIDE7CisKKwl0bXBbMF0gPSB4OworCXRtcFsxXSA9IHggPj4gODsKKwl0bXBbMl0gPSB5OworCXRtcFszXSA9IHkgPj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwkvKiBzY2FsaW5nPyAqLworCXRtcFs4XSA9IHg7CisJdG1wWzldID0geCA+PiA4OworCXRtcFsxMF0gPSB5OworCXRtcFsxMV0gPSB5ID4+IDg7CisJdG1wWzEyXSA9IHhfZW5kOworCXRtcFsxM10gPSB4X2VuZCA+PiA4OworCXRtcFsxNF0gPSB5X2VuZDsKKwl0bXBbMTVdID0geV9lbmQgPj4gODsKKworCXRtcFsxNl0gPSBCTElaWkFSRF9DT0xPUl9SR0I1NjU7CisKKwlpZiAoZGRhdGEtPmJsaXp6YXJkX3ZlciA9PSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1KQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9CQUNLR1JPVU5EOworCWVsc2UKKwkJdG1wWzE3XSA9IGRkYXRhLT5ibGl6emFyZF92ZXIgPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NCA/CisJCQlCTElaWkFSRF9TUkNfV1JJVEVfTENEIDoKKwkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkU7CisKKwlvbWFwX3JmYmlfY29uZmlndXJlKGRzc2RldiwgMTYsIDgpOworCisJYmxpenphcmRfd3JpdGUoQkxJWlpBUkRfSU5QVVRfV0lOX1hfU1RBUlRfMCwgdG1wLCAxOCk7CisKKwlvbWFwX3JmYmlfY29uZmlndXJlKGRzc2RldiwgMTYsIDE2KTsKK30KKworc3RhdGljIHZvaWQgbWlwaWRfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGNtZCwgY29uc3QgdTggKndidWYsCisJCWludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlCW07CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqeCwgeGZlcls0XTsKKwl1MTYJCQl3OworCWludAkJCXI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKworCW1lbXNldCh4ZmVyLCAwLCBzaXplb2YoeGZlcikpOworCXggPSAmeGZlclswXTsKKworCWNtZCAmPSAgMHhmZjsKKwl4LT50eF9idWYJCT0gJmNtZDsKKwl4LT5iaXRzX3Blcl93b3JkCT0gOTsKKwl4LT5sZW4JCQk9IDI7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCisJaWYgKHdsZW4pIHsKKwkJeCsrOworCQl4LT50eF9idWYJCT0gd2J1ZjsKKwkJeC0+bGVuCQkJPSB3bGVuOworCQl4LT5iaXRzX3Blcl93b3JkCT0gOTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCX0KKworCWlmIChybGVuKSB7CisJCXgrKzsKKwkJeC0+cnhfYnVmCT0gJnc7CisJCXgtPmxlbgkJPSAxOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4LCAmbSk7CisKKwkJaWYgKHJsZW4gPiAxKSB7CisJCQkvKiBBcnJhbmdlIGZvciB0aGUgZXh0cmEgY2xvY2sgYmVmb3JlIHRoZSBmaXJzdAorCQkJICogZGF0YSBiaXQuCisJCQkgKi8KKwkJCXgtPmJpdHNfcGVyX3dvcmQgPSA5OworCQkJeC0+bGVuCQkgPSAyOworCisJCQl4Kys7CisJCQl4LT5yeF9idWYJID0gJnJidWZbMV07CisJCQl4LT5sZW4JCSA9IHJsZW4gLSAxOworCQkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgJm0pOworCQl9CisJfQorCisJciA9IHNwaV9zeW5jKHNwaSwgJm0pOworCWlmIChyIDwgMCkKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzcGlfc3luYyAlZFxuIiwgcik7CisKKwlpZiAocmxlbikKKwkJcmJ1ZlswXSA9IHcgJiAweGZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfY21kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjbWQpCit7CisJbWlwaWRfdHJhbnNmZXIoc3BpLCBjbWQsIE5VTEwsIDAsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJaW50IHJlZywgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwltaXBpZF90cmFuc2ZlcihzcGksIHJlZywgYnVmLCBsZW4sIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWlwaWRfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgcmVnLCB1OCAqYnVmLCBpbnQgbGVuKQoreworCW1pcGlkX3RyYW5zZmVyKHNwaSwgcmVnLCBOVUxMLCAwLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kYXRhX2xpbmVzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBkYXRhX2xpbmVzKQoreworCXUxNiBwYXI7CisKKwlzd2l0Y2ggKGRhdGFfbGluZXMpIHsKKwljYXNlIDE2OgorCQlwYXIgPSAweDE1MDsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJcGFyID0gMHgxNjA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXBhciA9IDB4MTcwOworCQlicmVhazsKKwl9CisKKwltaXBpZF93cml0ZShzcGksIDB4M2EsICh1OCAqKSZwYXIsIDIpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2luaXRfc3RyaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdTE2IGluaXRwYXJbXSA9IHsgMHgwMTAyLCAweDAxMDAsIDB4MDEwMCB9OworCW1pcGlkX3dyaXRlKHNwaSwgMHhjMiwgKHU4ICopaW5pdHBhciwgc2l6ZW9mKGluaXRwYXIpKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9kaXNwbGF5X29uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJbWlwaWRfY21kKHNwaSwgTUlQSURfQ01EX0RJU1BfT04pOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2Rpc3BsYXlfb2ZmKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJbWlwaWRfY21kKHNwaSwgTUlQSURfQ01EX0RJU1BfT0ZGKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zbGVlcF9vdXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwltaXBpZF9jbWQoc3BpLCBNSVBJRF9DTURfU0xFRVBfT1VUKTsKKwltc2xlZXAoMTIwKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9zbGVlcF9pbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCW1pcGlkX2NtZChzcGksIE1JUElEX0NNRF9TTEVFUF9JTik7CisJbXNsZWVwKDUwKTsKK30KKworc3RhdGljIGludCBuOHgwX3BhbmVsX3Bvd2VyX29uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhICpiZGF0YSA9IGdldF9ib2FyZF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBkZGF0YS0+c3BpZGV2OworCXU4IHJldiwgY29uZjsKKwl1OCBkaXNwbGF5X2lkWzNdOworCWNvbnN0IGNoYXIgKnBhbmVsX25hbWU7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuIDA7CisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPmN0cmxfcHdyZG93biwgMSk7CisKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2VuYWJsZSkgeworCQlyID0gYmRhdGEtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyX3BsYXRfZW47CisJfQorCisJciA9IG9tYXBkc3NfcmZiaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycl9yZmJpX2VuOworCisJcmV2ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUkVWX0NPREUpOworCWNvbmYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9DT05GSUcpOworCisJc3dpdGNoIChyZXYgJiAweGZjKSB7CisJY2FzZSAweDljOgorCQlkZGF0YS0+YmxpenphcmRfdmVyID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NDsKKwkJZGV2X2luZm8oJmRzc2Rldi0+ZGV2LCAiczFkMTM3NDQgTENEIGNvbnRyb2xsZXIgcmV2ICVkICIKKwkJCSJpbml0aWFsaXplZCAoQ05GIHBpbnMgJXgpXG4iLCByZXYgJiAweDAzLCBjb25mICYgMHgwNyk7CisJCWJyZWFrOworCWNhc2UgMHhhNDoKKwkJZGRhdGEtPmJsaXp6YXJkX3ZlciA9IEJMSVpaQVJEX1ZFUlNJT05fUzFEMTM3NDU7CisJCWRldl9pbmZvKCZkc3NkZXYtPmRldiwgInMxZDEzNzQ1IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImludmFsaWQgczFkMTM3NHggcmV2aXNpb24gJTAyeFxuIiwgcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ludl9jaGlwOworCX0KKworCS8qIHBhbmVsICovCisKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPnBhbmVsX3Jlc2V0LCAxKTsKKworCW1pcGlkX3JlYWQoc3BpLCBNSVBJRF9DTURfUkVBRF9ESVNQX0lELCBkaXNwbGF5X2lkLCAzKTsKKwlkZXZfZGJnKCZzcGktPmRldiwgIk1JUEkgZGlzcGxheSBJRDogJTAyeCUwMnglMDJ4XG4iLAorCQkJZGlzcGxheV9pZFswXSwgZGlzcGxheV9pZFsxXSwgZGlzcGxheV9pZFsyXSk7CisKKwlzd2l0Y2ggKGRpc3BsYXlfaWRbMF0pIHsKKwljYXNlIDB4NDU6CisJCXBhbmVsX25hbWUgPSAibHBoODkyMyI7CisJCWJyZWFrOworCWNhc2UgMHg4MzoKKwkJcGFuZWxfbmFtZSA9ICJsczA0MXkzIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJpbnZhbGlkIGRpc3BsYXkgSUQgMHgleFxuIiwKKwkJCQlkaXNwbGF5X2lkWzBdKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ludl9wYW5lbDsKKwl9CisKKwlkZXZfaW5mbygmZHNzZGV2LT5kZXYsICIlcyByZXYgJTAyeCBMQ0QgZGV0ZWN0ZWRcbiIsCisJCQlwYW5lbF9uYW1lLCBkaXNwbGF5X2lkWzFdKTsKKworCXNlbmRfc2xlZXBfb3V0KHNwaSk7CisJc2VuZF9pbml0X3N0cmluZyhzcGkpOworCXNldF9kYXRhX2xpbmVzKHNwaSwgMjQpOworCXNlbmRfZGlzcGxheV9vbihzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycl9pbnZfcGFuZWw6CisJLyoKKwkgKiBIQUNLOiB3ZSBzaG91bGQgdHVybiBvZmYgdGhlIHBhbmVsIGhlcmUsIGJ1dCB0aGVyZSBpcyBzb21lIHByb2JsZW0KKwkgKiB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSwgYW5kIHdlIGZhaWwgdG8gaW5pdCB0aGUgcGFuZWwgaWYgd2UKKwkgKiBoYXZlIHR1cm5lZCBpdCBvZmYKKwkgKi8KKwkvKiBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPnBhbmVsX3Jlc2V0LCAwKTsgKi8KK2Vycl9pbnZfY2hpcDoKKwlvbWFwZHNzX3JmYmlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnJfcmZiaV9lbjoKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWJkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7CitlcnJfcGxhdF9lbjoKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYmRhdGEtPmN0cmxfcHdyZG93biwgMCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG44eDBfcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhICpiZGF0YSA9IGdldF9ib2FyZF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBkZGF0YS0+c3BpZGV2OworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCXJldHVybjsKKworCXNlbmRfZGlzcGxheV9vZmYoc3BpKTsKKwlzZW5kX3NsZWVwX2luKHNwaSk7CisKKwlpZiAoYmRhdGEtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWJkYXRhLT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7CisKKwkvKgorCSAqIEhBQ0s6IHdlIHNob3VsZCB0dXJuIG9mZiB0aGUgcGFuZWwgaGVyZSwgYnV0IHRoZXJlIGlzIHNvbWUgcHJvYmxlbQorCSAqIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLCBhbmQgd2UgZmFpbCB0byBpbml0IHRoZSBwYW5lbCBpZiB3ZQorCSAqIGhhdmUgdHVybmVkIGl0IG9mZgorCSAqLworCS8qIGdwaW9fZGlyZWN0aW9uX291dHB1dChiZGF0YS0+cGFuZWxfcmVzZXQsIDApOyAqLworCWdwaW9fZGlyZWN0aW9uX291dHB1dChiZGF0YS0+Y3RybF9wd3Jkb3duLCAwKTsKKwlvbWFwZHNzX3JmYmlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmZiaV90aW1pbmdzIG44eDBfcGFuZWxfdGltaW5ncyA9IHsKKwkuY3Nfb25fdGltZSAgICAgPSAwLAorCisJLndlX29uX3RpbWUgICAgID0gOTAwMCwKKwkud2Vfb2ZmX3RpbWUgICAgPSAxODAwMCwKKwkud2VfY3ljbGVfdGltZSAgPSAzNjAwMCwKKworCS5yZV9vbl90aW1lICAgICA9IDkwMDAsCisJLnJlX29mZl90aW1lICAgID0gMjcwMDAsCisJLnJlX2N5Y2xlX3RpbWUgID0gMzYwMDAsCisKKwkuYWNjZXNzX3RpbWUgICAgPSAyNzAwMCwKKwkuY3Nfb2ZmX3RpbWUgICAgPSAzNjAwMCwKKworCS5jc19wdWxzZV93aWR0aCA9IDAsCit9OworCitzdGF0aWMgaW50IG44eDBfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCXN0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmJkYXRhID0gZ2V0X2JvYXJkX2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhID0gZ2V0X2Rydl9kYXRhKGRzc2Rldik7CisJaW50IHI7CisJaW50IGxldmVsOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCisJaWYgKGRldi0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgorCQkJZGV2LT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlsZXZlbCA9IGRldi0+cHJvcHMuYnJpZ2h0bmVzczsKKwllbHNlCisJCWxldmVsID0gMDsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAidXBkYXRlIGJyaWdodG5lc3MgdG8gJWRcbiIsIGxldmVsKTsKKworCWlmICghYmRhdGEtPnNldF9iYWNrbGlnaHQpCisJCXIgPSAtRUlOVkFMOworCWVsc2UKKwkJciA9IGJkYXRhLT5zZXRfYmFja2xpZ2h0KGRzc2RldiwgbGV2ZWwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBuOHgwX2JsX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5wcm9wcy5mYl9ibGFuayA9PSBGQl9CTEFOS19VTkJMQU5LICYmCisJCQlkZXYtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspCisJCXJldHVybiBkZXYtPnByb3BzLmJyaWdodG5lc3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG44eDBfYmxfb3BzID0geworCS5nZXRfYnJpZ2h0bmVzcyA9IG44eDBfYmxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBuOHgwX2JsX3VwZGF0ZV9zdGF0dXMsCit9OworCitzdGF0aWMgaW50IG44eDBfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9uOHgwX2RhdGEgKmJkYXRhID0gZ2V0X2JvYXJkX2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRkYXRhOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibGRldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJaW50IHI7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInByb2JlXG4iKTsKKworCWlmICghYmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJc19kcnZfZGF0YS5kc3NkZXYgPSBkc3NkZXY7CisKKwlkZGF0YSA9ICZzX2Rydl9kYXRhOworCisJbXV0ZXhfaW5pdCgmZGRhdGEtPmxvY2spOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOworCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyA9IDgwMDsKKwlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXMgPSA0ODA7CisJZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPSAxNjsKKwlkc3NkZXYtPmN0cmwucmZiaV90aW1pbmdzID0gbjh4MF9wYW5lbF90aW1pbmdzOworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHByb3BzKSk7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSAxMjc7CisJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKKwlibGRldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2X25hbWUoJmRzc2Rldi0+ZGV2KSwgJmRzc2Rldi0+ZGV2LAorCQkJZHNzZGV2LCAmbjh4MF9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihibGRldikpIHsKKwkJciA9IFBUUl9FUlIoYmxkZXYpOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInJlZ2lzdGVyIGJhY2tsaWdodCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlkZGF0YS0+YmxkZXYgPSBibGRldjsKKworCWJsZGV2LT5wcm9wcy5mYl9ibGFuayA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwlibGRldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDEyNzsKKworCW44eDBfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbjh4MF9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInJlbW92ZVxuIik7CisKKwlibGRldiA9IGRkYXRhLT5ibGRldjsKKwlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJbjh4MF9ibF91cGRhdGVfc3RhdHVzKGJsZGV2KTsKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZkc3NkZXYtPmRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgbjh4MF9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAiZW5hYmxlXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCXIgPSBuOHgwX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWlmIChyKSB7CisJCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuOHgwX3BhbmVsX2Rpc2FibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAiZGlzYWJsZVxuIik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZmJpX2J1c19sb2NrKCk7CisKKwluOHgwX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOworCisJcmZiaV9idXNfdW5sb2NrKCk7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworfQorCitzdGF0aWMgaW50IG44eDBfcGFuZWxfc3VzcGVuZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJzdXNwZW5kXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCW44eDBfcGFuZWxfcG93ZXJfb2ZmKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX1NVU1BFTkRFRDsKKworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbjh4MF9wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKwlpbnQgcjsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicmVzdW1lXG4iKTsKKworCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKKworCXJmYmlfYnVzX2xvY2soKTsKKworCXIgPSBuOHgwX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7CisKKwlyZmJpX2J1c191bmxvY2soKTsKKworCWlmIChyKSB7CisJCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCQlyZXR1cm4gcjsKKwl9CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuOHgwX3BhbmVsX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKK30KKworc3RhdGljIHZvaWQgbjh4MF9wYW5lbF9nZXRfcmVzb2x1dGlvbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXUxNiAqeHJlcywgdTE2ICp5cmVzKQoreworCSp4cmVzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzLnhfcmVzOworCSp5cmVzID0gZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZG9uZSh2b2lkICpkYXRhKQoreworCXJmYmlfYnVzX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IG44eDBfcGFuZWxfdXBkYXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCit7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkZGF0YSA9IGdldF9kcnZfZGF0YShkc3NkZXYpOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJ1cGRhdGVcbiIpOworCisJbXV0ZXhfbG9jaygmZGRhdGEtPmxvY2spOworCXJmYmlfYnVzX2xvY2soKTsKKworCW9tYXBfcmZiaV9wcmVwYXJlX3VwZGF0ZShkc3NkZXYsICZ4LCAmeSwgJncsICZoKTsKKworCWJsaXp6YXJkX2N0cmxfc2V0dXBfdXBkYXRlKGRzc2RldiwgeCwgeSwgdywgaCk7CisKKwlvbWFwX3JmYmlfdXBkYXRlKGRzc2RldiwgeCwgeSwgdywgaCwgdXBkYXRlX2RvbmUsIE5VTEwpOworCisJbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuOHgwX3BhbmVsX3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwYW5lbF9kcnZfZGF0YSAqZGRhdGEgPSBnZXRfZHJ2X2RhdGEoZHNzZGV2KTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAic3luY1xuIik7CisKKwltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7CisJcmZiaV9idXNfbG9jaygpOworCXJmYmlfYnVzX3VubG9jaygpOworCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIG44eDBfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBuOHgwX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gbjh4MF9wYW5lbF9yZW1vdmUsCisKKwkuZW5hYmxlCQk9IG44eDBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gbjh4MF9wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gbjh4MF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbjh4MF9wYW5lbF9yZXN1bWUsCisKKwkudXBkYXRlCQk9IG44eDBfcGFuZWxfdXBkYXRlLAorCS5zeW5jCQk9IG44eDBfcGFuZWxfc3luYywKKworCS5nZXRfcmVzb2x1dGlvbgk9IG44eDBfcGFuZWxfZ2V0X3Jlc29sdXRpb24sCisJLmdldF9yZWNvbW1lbmRlZF9icHAgPSBvbWFwZHNzX2RlZmF1bHRfZ2V0X3JlY29tbWVuZGVkX2JwcCwKKworCS5nZXRfdGltaW5ncwk9IG44eDBfcGFuZWxfZ2V0X3RpbWluZ3MsCisKKwkuZHJpdmVyICAgICAgICAgPSB7CisJCS5uYW1lICAgPSAibjh4MF9wYW5lbCIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworLyogUEFORUwgKi8KKworc3RhdGljIGludCBtaXBpZF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlkZXZfZGJnKCZzcGktPmRldiwgIm1pcGlkX3NwaV9wcm9iZVxuIik7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCisJc19kcnZfZGF0YS5zcGlkZXYgPSBzcGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXBpZF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJZGV2X2RiZygmc3BpLT5kZXYsICJtaXBpZF9zcGlfcmVtb3ZlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1pcGlkX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibGNkX21pcGlkIiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gbWlwaWRfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChtaXBpZF9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG44eDBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKworCXIgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtaXBpZF9zcGlfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcl9lcnIoIm44eDBfcGFuZWw6IHNwaSBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByOworCX0KKworCXIgPSBvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJm44eDBfcGFuZWxfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcl9lcnIoIm44eDBfcGFuZWw6IGRzcyBkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWlwaWRfc3BpX2RyaXZlcik7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbjh4MF9wYW5lbF9kcnZfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbWlwaWRfc3BpX2RyaXZlcik7CisKKwlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmbjh4MF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChuOHgwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KG44eDBfcGFuZWxfZHJ2X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1waWNvZGxwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGViZGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1waWNvZGxwLmMKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBwaWNvZGxwIHBhbmVsIGRyaXZlcgorICogcGljb2RscF9pMmNfZHJpdmVyOiBpMmNfY2xpZW50IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRleGFzIEluc3RydW1lbnRzCisgKiBBdXRob3I6IE15dGhyaSBQIEsgPG15dGhyaXBrQHRpLmNvbT4KKyAqIE1heXVyZXNoIEphbm9ya2FyIDxtYXl1ckB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oPgorCisjaW5jbHVkZSAicGFuZWwtcGljb2RscC5oIgorCitzdHJ1Y3QgcGljb2RscF9kYXRhIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcGljb2RscF9pMmNfY2xpZW50OworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBwaWNvZGxwX2kyY19ib2FyZF9pbmZvID0geworCUkyQ19CT0FSRF9JTkZPKCJwaWNvZGxwX2kyY19kcml2ZXIiLCAweDFiKSwKK307CisKK3N0cnVjdCBwaWNvZGxwX2kyY19kYXRhIHsKKwlzdHJ1Y3QgbXV0ZXggeGZlcl9sb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBpY29kbHBfaTJjX2lkW10gPSB7CisJeyAicGljb2RscF9pMmNfZHJpdmVyIiwgMCB9LAorfTsKKworc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgeworCXU4IHJlZzsKKwl1MzIgdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBwaWNvX2xzX3RpbWluZ3MgPSB7CisJLnhfcmVzCQk9IDg2NCwKKwkueV9yZXMJCT0gNDgwLAorCS5oc3cJCT0gNywKKwkuaGZwCQk9IDExLAorCS5oYnAJCT0gNywKKworCS5waXhlbF9jbG9jawk9IDE5MjAwLAorCisJLnZzdwkJPSAyLAorCS52ZnAJCT0gMywKKwkudmJwCQk9IDE0LAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhCisJCSpnZXRfcGFuZWxfZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhICopIGRzc2Rldi0+ZGF0YTsKK30KKworc3RhdGljIHUzMiBwaWNvZGxwX2kyY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwl1OCByZWFkX2NtZFtdID0ge1JFQURfUkVHX1NFTEVDVCwgcmVnfSwgZGF0YVs0XTsKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKworCW11dGV4X2xvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisKKwltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAyOworCW1zZ1swXS5idWYgPSByZWFkX2NtZDsKKworCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSA0OworCW1zZ1sxXS5idWYgPSBkYXRhOworCisJaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwltdXRleF91bmxvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisJcmV0dXJuIChkYXRhWzNdIHwgKGRhdGFbMl0gPDwgOCkgfCAoZGF0YVsxXSA8PCAxNikgfCAoZGF0YVswXSA8PCAyNCkpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfaTJjX3dyaXRlX2Jsb2NrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJCXU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZzsKKwlpbnQgaSwgciwgbXNnX2NvdW50ID0gMTsKKworCXN0cnVjdCBwaWNvZGxwX2kyY19kYXRhICpwaWNvZGxwX2kyY19kYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAobGVuIDwgMSB8fCBsZW4gPiAzMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJ0b28gbG9uZyBzeW5fd3JpdGVfYmxvY2sgbGVuICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXV0ZXhfbG9jaygmcGljb2RscF9pMmNfZGF0YS0+eGZlcl9sb2NrKTsKKworCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOworCW1zZy5mbGFncyA9IDA7CisJbXNnLmxlbiA9IGxlbjsKKwltc2cuYnVmID0gZGF0YTsKKwlyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZywgbXNnX2NvdW50KTsKKwltdXRleF91bmxvY2soJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisKKwkvKgorCSAqIGkyY190cmFuc2ZlciByZXR1cm5zOgorCSAqIG51bWJlciBvZiBtZXNzYWdlcyBzZW50IGluIGNhc2Ugb2Ygc3VjY2VzcworCSAqIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIGluIGNhc2Ugb2YgZmFpbHVyZQorCSAqLworCWlmIChyICE9IG1zZ19jb3VudCkKKwkJZ290byBlcnI7CisKKwkvKiBJbiBjYXNlIG9mIHN1Y2Nlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJImFkZHIgJXggYncgMHglMDJ4WyVkXTogMHglMDJ4XG4iLAorCQkJY2xpZW50LT5hZGRyLCBkYXRhWzBdICsgaSwgaSwgZGF0YVtpXSk7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBpY29kbHBfaTJjX3dyaXRlIGVycm9yXG4iKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1OCBkYXRhWzVdOworCWludCBpOworCisJZGF0YVswXSA9IHJlZzsKKwlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorCQlkYXRhW2ldID0gKHZhbHVlID4+ICgzMiAtIChpKSAqIDgpKSAmIDB4RkY7CisKKwlyZXR1cm4gcGljb2RscF9pMmNfd3JpdGVfYmxvY2soY2xpZW50LCBkYXRhLCA1KTsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY193cml0ZV9hcnJheShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgY29tbWFuZHNbXSwKKwkJCWludCBjb3VudCkKK3sKKwlpbnQgaSwgciA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJciA9IHBpY29kbHBfaTJjX3dyaXRlKGNsaWVudCwgY29tbWFuZHNbaV0ucmVnLAorCQkJCQkJY29tbWFuZHNbaV0udmFsdWUpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwaWNvZGxwX3dhaXRfZm9yX2RtYV9kb25lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggdHJpYWwgPSAxMDA7CisKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJaWYgKCF0cmlhbC0tKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJfSB3aGlsZSAocGljb2RscF9pMmNfcmVhZChjbGllbnQsIE1BSU5fU1RBVFVTKSAmIERNQV9TVEFUVVMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGljb2RscF9pMmNfaW5pdDoJaTJjX2luaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqIGNsaWVudDoJaTJjX2NsaWVudCBmb3IgY29tbXVuaWNhdGlvbgorICoKKyAqIHJldHVybgorICoJCTAJOiBTdWNjZXNzLCBubyBlcnJvcgorICoJZXJyb3IgY29kZQk6IEZhaWx1cmUKKyAqLworc3RhdGljIGludCBwaWNvZGxwX2kyY19pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwaWNvZGxwX2kyY19jb21tYW5kIGluaXRfY21kX3NldDFbXSA9IHsKKwkJe1NPRlRfUkVTRVQsIDF9LAorCQl7RE1EX1BBUktfVFJJR0dFUiwgMX0sCisJCXtNSVNDX1JFRywgNX0sCisJCXtTRVFfQ09OVFJPTCwgMH0sCisJCXtTRVFfVkVDVE9SLCAweDEwMH0sCisJCXtETURfQkxPQ0tfQ09VTlQsIDd9LAorCQl7RE1EX1ZDQ19DT05UUk9MLCAweDEwOX0sCisJCXtETURfUEFSS19QVUxTRV9DT1VOVCwgMHhBfSwKKwkJe0RNRF9QQVJLX1BVTFNFX1dJRFRILCAweEJ9LAorCQl7RE1EX1BBUktfREVMQVksIDB4MkVEfSwKKwkJe0RNRF9TSEFET1dfRU5BQkxFLCAwfSwKKwkJe0ZMQVNIX09QQ09ERSwgMHhCfSwKKwkJe0ZMQVNIX0RVTU1ZX0JZVEVTLCAxfSwKKwkJe0ZMQVNIX0FERFJfQllURVMsIDN9LAorCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7RkxBU0hfU1RBUlRfQUREUiwgQ01UX0xVVF8wX1NUQVJUX0FERFJ9LAorCQl7RkxBU0hfUkVBRF9CWVRFUywgQ01UX0xVVF8wX1NJWkV9LAorCQl7Q01UX1NQTEFTSF9MVVRfU1RBUlRfQUREUiwgMH0sCisJCXtDTVRfU1BMQVNIX0xVVF9ERVNUX1NFTEVDVCwgQ01UX0xVVF9BTEx9LAorCQl7UEJDX0NPTlRST0wsIDF9LAorCX07CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgaW5pdF9jbWRfc2V0MltdID0geworCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7Q01UX1NQTEFTSF9MVVRfREVTVF9TRUxFQ1QsIDB9LAorCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7RkxBU0hfU1RBUlRfQUREUiwgU0VRVUVOQ0VfMF9TVEFSVF9BRERSfSwKKwkJe0ZMQVNIX1JFQURfQllURVMsIFNFUVVFTkNFXzBfU0laRX0sCisJCXtTRVFfUkVTRVRfTFVUX1NUQVJUX0FERFIsIDB9LAorCQl7U0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVCwgU0VRX1NFUV9MVVR9LAorCQl7UEJDX0NPTlRST0wsIDF9LAorCX07CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBpY29kbHBfaTJjX2NvbW1hbmQgaW5pdF9jbWRfc2V0M1tdID0geworCQl7UEJDX0NPTlRST0wsIDB9LAorCQl7U0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVCwgMH0sCisJCXtQQkNfQ09OVFJPTCwgMH0sCisJCXtGTEFTSF9TVEFSVF9BRERSLCBEUkNfVEFCTEVfMF9TVEFSVF9BRERSfSwKKwkJe0ZMQVNIX1JFQURfQllURVMsIERSQ19UQUJMRV8wX1NJWkV9LAorCQl7U0VRX1JFU0VUX0xVVF9TVEFSVF9BRERSLCAwfSwKKwkJe1NFUV9SRVNFVF9MVVRfREVTVF9TRUxFQ1QsIFNFUV9EUkNfTFVUX0FMTH0sCisJCXtQQkNfQ09OVFJPTCwgMX0sCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGljb2RscF9pMmNfY29tbWFuZCBpbml0X2NtZF9zZXQ0W10gPSB7CisJCXtQQkNfQ09OVFJPTCwgMH0sCisJCXtTRVFfUkVTRVRfTFVUX0RFU1RfU0VMRUNULCAwfSwKKwkJe1NEQ19FTkFCTEUsIDF9LAorCQl7QUdDX0NUUkwsIDd9LAorCQl7Q0NBX0MxQSwgMHgxMDB9LAorCQl7Q0NBX0MxQiwgMHgwfSwKKwkJe0NDQV9DMUMsIDB4MH0sCisJCXtDQ0FfQzJBLCAweDB9LAorCQl7Q0NBX0MyQiwgMHgxMDB9LAorCQl7Q0NBX0MyQywgMHgwfSwKKwkJe0NDQV9DM0EsIDB4MH0sCisJCXtDQ0FfQzNCLCAweDB9LAorCQl7Q0NBX0MzQywgMHgxMDB9LAorCQl7Q0NBX0M3QSwgMHgxMDB9LAorCQl7Q0NBX0M3QiwgMHgxMDB9LAorCQl7Q0NBX0M3QywgMHgxMDB9LAorCQl7Q0NBX0VOQUJMRSwgMX0sCisJCXtDUFVfSUZfTU9ERSwgMX0sCisJCXtTSE9SVF9GTElQLCAxfSwKKwkJe0NVUlRBSU5fQ09OVFJPTCwgMH0sCisJCXtETURfUEFSS19UUklHR0VSLCAwfSwKKwkJe1JfRFJJVkVfQ1VSUkVOVCwgMHgyOTh9LAorCQl7R19EUklWRV9DVVJSRU5ULCAweDI5OH0sCisJCXtCX0RSSVZFX0NVUlJFTlQsIDB4Mjk4fSwKKwkJe1JHQl9EUklWRVJfRU5BQkxFLCA3fSwKKwkJe1NFUV9DT05UUk9MLCAwfSwKKwkJe0FDVEdFTl9DT05UUk9MLCAweDEwfSwKKwkJe1NFUVVFTkNFX01PREUsIFNFUV9MT0NLfSwKKwkJe0RBVEFfRk9STUFULCBSR0I4ODh9LAorCQl7SU5QVVRfUkVTT0xVVElPTiwgV1ZHQV84NjRfTEFORFNDQVBFfSwKKwkJe0lOUFVUX1NPVVJDRSwgUEFSQUxMRUxfUkdCfSwKKwkJe0NQVV9JRl9TWU5DX01FVEhPRCwgMX0sCisJCXtTRVFfQ09OVFJPTCwgMX0KKwl9OworCisJciA9IHBpY29kbHBfaTJjX3dyaXRlX2FycmF5KGNsaWVudCwgaW5pdF9jbWRfc2V0MSwKKwkJCQkJCUFSUkFZX1NJWkUoaW5pdF9jbWRfc2V0MSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBwaWNvZGxwX3dhaXRfZm9yX2RtYV9kb25lKGNsaWVudCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBpY29kbHBfaTJjX3dyaXRlX2FycmF5KGNsaWVudCwgaW5pdF9jbWRfc2V0MiwKKwkJCQkJQVJSQVlfU0laRShpbml0X2NtZF9zZXQyKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHBpY29kbHBfd2FpdF9mb3JfZG1hX2RvbmUoY2xpZW50KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcGljb2RscF9pMmNfd3JpdGVfYXJyYXkoY2xpZW50LCBpbml0X2NtZF9zZXQzLAorCQkJCQlBUlJBWV9TSVpFKGluaXRfY21kX3NldDMpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gcGljb2RscF93YWl0X2Zvcl9kbWFfZG9uZShjbGllbnQpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBwaWNvZGxwX2kyY193cml0ZV9hcnJheShjbGllbnQsIGluaXRfY21kX3NldDQsCisJCQkJCUFSUkFZX1NJWkUoaW5pdF9jbWRfc2V0NCkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YTsKKworCXBpY29kbHBfaTJjX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFwaWNvZGxwX2kyY19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnBpY29kbHBfaTJjX2RhdGEtPnhmZXJfbG9jayk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGljb2RscF9pMmNfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWNvZGxwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGljb2RscF9pMmNfZGF0YSAqcGljb2RscF9pMmNfZGF0YSA9CisJCQkJCWkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWtmcmVlKHBpY29kbHBfaTJjX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGljb2RscF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInBpY29kbHBfaTJjX2RyaXZlciIsCisJfSwKKwkucHJvYmUJCT0gcGljb2RscF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBwaWNvZGxwX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gcGljb2RscF9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByLCB0cmlhbCA9IDEwMDsKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBwaWNvZGxwX3BhbmVsX2RhdGEgKnBpY29kbHBfcGRhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKSB7CisJCXIgPSBkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCWdwaW9fc2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPnB3cmdvb2RfZ3BpbywgMCk7CisJbXNsZWVwKDEpOworCWdwaW9fc2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPnB3cmdvb2RfZ3BpbywgMSk7CisKKwl3aGlsZSAoIWdwaW9fZ2V0X3ZhbHVlKHBpY29kbHBfcGRhdGEtPmVtdV9kb25lX2dwaW8pKSB7CisJCWlmICghdHJpYWwtLSkgeworCQkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJlbXVfZG9uZSBzaWduYWwgbm90IgorCQkJCQkJIiBnb2luZyBoaWdoXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCW1zbGVlcCg1KTsKKwl9CisJLyoKKwkgKiBBcyBwZXIgZHBwMjYwMCBwcm9ncmFtbWluZyBndWlkZSwKKwkgKiBpdCBpcyByZXF1aXJlZCB0byBzbGVlcCBmb3IgMTAwMG1zIGFmdGVyIGVtdV9kb25lIHNpZ25hbCBnb2VzIGhpZ2gKKwkgKiB0aGVuIG9ubHkgaTJjIGNvbW1hbmRzIGNhbiBiZSBzdWNjZXNzZnVsbHkgc2VudCB0byBkcHAyNjAwCisJICovCisJbXNsZWVwKDEwMDApOworCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBEUElcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJciA9IHBpY29kbHBfaTJjX2luaXQocGljb2QtPnBpY29kbHBfaTJjX2NsaWVudCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOworCisJcmV0dXJuIHI7CitlcnI6CisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnIxOgorCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhICpwaWNvZGxwX3BkYXRhID0gZ2V0X3BhbmVsX2RhdGEoZHNzZGV2KTsKKworCW9tYXBkc3NfZHBpX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworCisJZ3Bpb19zZXRfdmFsdWUocGljb2RscF9wZGF0YS0+ZW11X2RvbmVfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUocGljb2RscF9wZGF0YS0+cHdyZ29vZF9ncGlvLCAwKTsKKworCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCisJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwaWNvZGxwX2RhdGEgKnBpY29kOworCXN0cnVjdCBwaWNvZGxwX3BhbmVsX2RhdGEgKnBpY29kbHBfcGRhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcGljb2RscF9pMmNfY2xpZW50OworCWludCByID0gMCwgcGljb2RscF9hZGFwdGVyX2lkOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwgT01BUF9EU1NfTENEX09OT0ZGIHwKKwkJCQlPTUFQX0RTU19MQ0RfSUhTIHwgT01BUF9EU1NfTENEX0lWUzsKKwlkc3NkZXYtPnBhbmVsLmFjYiA9IDB4MDsKKwlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBwaWNvX2xzX3RpbWluZ3M7CisKKwlwaWNvZCA9ICBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGljb2RscF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaWNvZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZwaWNvZC0+bG9jayk7CisKKwlwaWNvZGxwX2FkYXB0ZXJfaWQgPSBwaWNvZGxwX3BkYXRhLT5waWNvZGxwX2FkYXB0ZXJfaWQ7CisKKwlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKHBpY29kbHBfYWRhcHRlcl9pZCk7CisJaWYgKCFhZGFwdGVyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiY2FuJ3QgZ2V0IGkyYyBhZGFwdGVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCXBpY29kbHBfaTJjX2NsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsICZwaWNvZGxwX2kyY19ib2FyZF9pbmZvKTsKKwlpZiAoIXBpY29kbHBfaTJjX2NsaWVudCkgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImNhbid0IGFkZCBpMmMgZGV2aWNlOjoiCisJCQkJCSAiIHBpY29kbHBfaTJjX2NsaWVudCBpcyBOVUxMXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCXBpY29kLT5waWNvZGxwX2kyY19jbGllbnQgPSBwaWNvZGxwX2kyY19jbGllbnQ7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBwaWNvZCk7CisJcmV0dXJuIHI7CitlcnI6CisJa2ZyZWUocGljb2QpOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBwaWNvZGxwX3BhbmVsX3JlbW92ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBpY29kbHBfZGF0YSAqcGljb2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCWkyY191bnJlZ2lzdGVyX2RldmljZShwaWNvZC0+cGljb2RscF9pMmNfY2xpZW50KTsKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBOVUxMKTsKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInJlbW92aW5nIHBpY29kbHAgcGFuZWxcbiIpOworCisJa2ZyZWUocGljb2QpOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJlbmFibGluZyBwaWNvZGxwIHBhbmVsXG4iKTsKKworCW11dGV4X2xvY2soJnBpY29kLT5sb2NrKTsKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gcGljb2RscF9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJc3RydWN0IHBpY29kbHBfZGF0YSAqcGljb2QgPSBkZXZfZ2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2KTsKKworCW11dGV4X2xvY2soJnBpY29kLT5sb2NrKTsKKwkvKiBUdXJuIG9mZiBETFAgUG93ZXIgKi8KKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcGljb2RscF9wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJkaXNhYmxpbmcgcGljb2RscCBwYW5lbFxuIik7Cit9CisKK3N0YXRpYyBpbnQgcGljb2RscF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCisJbXV0ZXhfbG9jaygmcGljb2QtPmxvY2spOworCS8qIFR1cm4gb2ZmIERMUCBQb3dlciAqLworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInVuYWJsZSB0byBzdXNwZW5kIHBpY29kbHAgcGFuZWwsIgorCQkJCQkiIHBhbmVsIGlzIG5vdCBBQ1RJVkVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaWNvZGxwX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCisJZGV2X2RiZygmZHNzZGV2LT5kZXYsICJzdXNwZW5kaW5nIHBpY29kbHAgcGFuZWxcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpY29kbHBfcGFuZWxfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGljb2RscF9kYXRhICpwaWNvZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCWludCByOworCisJbXV0ZXhfbG9jaygmcGljb2QtPmxvY2spOworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKSB7CisJCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgInVuYWJsZSB0byByZXN1bWUgcGljb2RscCBwYW5lbCwiCisJCQkiIHBhbmVsIGlzIG5vdCBBQ1RJVkVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0gcGljb2RscF9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOworCW11dGV4X3VubG9jaygmcGljb2QtPmxvY2spOworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicmVzdW1pbmcgcGljb2RscCBwYW5lbFxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBpY29kbHBfZ2V0X3Jlc29sdXRpb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJCQl1MTYgKnhyZXMsIHUxNiAqeXJlcykKK3sKKwkqeHJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlczsKKwkqeXJlcyA9IGRzc2Rldi0+cGFuZWwudGltaW5ncy55X3JlczsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgcGljb2RscF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBpY29kbHBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBwaWNvZGxwX3BhbmVsX3JlbW92ZSwKKworCS5lbmFibGUJCT0gcGljb2RscF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwaWNvZGxwX3BhbmVsX2Rpc2FibGUsCisKKwkuZ2V0X3Jlc29sdXRpb24JPSBwaWNvZGxwX2dldF9yZXNvbHV0aW9uLAorCisJLnN1c3BlbmQJPSBwaWNvZGxwX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwaWNvZGxwX3BhbmVsX3Jlc3VtZSwKKworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJwaWNvZGxwX3BhbmVsIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBpY29kbHBfaW5pdCh2b2lkKQoreworCWludCByID0gMDsKKworCXIgPSBpMmNfYWRkX2RyaXZlcigmcGljb2RscF9pMmNfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwaWNvZGxwX2kyY19kcml2ZXIiIFwKKwkJCSIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByOworCX0KKworCXIgPSBvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJnBpY29kbHBfZHJpdmVyKTsKKwlpZiAocikKKwkJaTJjX2RlbF9kcml2ZXIoJnBpY29kbHBfaTJjX2RyaXZlcik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBpY29kbHBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwaWNvZGxwX2kyY19kcml2ZXIpOworCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZwaWNvZGxwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBpY29kbHBfaW5pdCk7Cittb2R1bGVfZXhpdChwaWNvZGxwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNeXRocmkgUCBLIDxteXRocmlwa0B0aS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInBpY29kbHAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtcGljb2RscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXBpY29kbHAuaApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIEhlYWRlciBmaWxlIHJlcXVpcmVkIGJ5IHBpY29kbHAgcGFuZWwgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEF1dGhvcjogTXl0aHJpIFAgSyA8bXl0aHJpcGtAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworCisjaWZuZGVmIF9fT01BUDJfRElTUExBWV9QQU5FTF9QSUNPRExQX0gKKyNkZWZpbmUgX19PTUFQMl9ESVNQTEFZX1BBTkVMX1BJQ09ETFBfSAorCisvKiBDb21tYW5kcyB1c2VkIGZvciBjb25maWd1cmluZyBwaWNvZGxwIHBhbmVsICovCisKKyNkZWZpbmUgTUFJTl9TVEFUVVMJCQkweDAzCisjZGVmaW5lIFBCQ19DT05UUk9MCQkJMHgwOAorI2RlZmluZSBJTlBVVF9TT1VSQ0UJCQkweDBCCisjZGVmaW5lIElOUFVUX1JFU09MVVRJT04JCTB4MEMKKyNkZWZpbmUgREFUQV9GT1JNQVQJCQkweDBECisjZGVmaW5lIElNR19ST1RBVElPTgkJCTB4MEUKKyNkZWZpbmUgTE9OR19GTElQCQkJMHgwRgorI2RlZmluZSBTSE9SVF9GTElQCQkJMHgxMAorI2RlZmluZSBURVNUX1BBVF9TRUxFQ1QJCQkweDExCisjZGVmaW5lIFJfRFJJVkVfQ1VSUkVOVAkJCTB4MTIKKyNkZWZpbmUgR19EUklWRV9DVVJSRU5UCQkJMHgxMworI2RlZmluZSBCX0RSSVZFX0NVUlJFTlQJCQkweDE0CisjZGVmaW5lIFJFQURfUkVHX1NFTEVDVAkJCTB4MTUKKyNkZWZpbmUgUkdCX0RSSVZFUl9FTkFCTEUJCTB4MTYKKworI2RlZmluZSBDUFVfSUZfTU9ERQkJCTB4MTgKKyNkZWZpbmUgRlJBTUVfUkFURQkJCTB4MTkKKyNkZWZpbmUgQ1BVX0lGX1NZTkNfTUVUSE9ECQkweDFBCisjZGVmaW5lIENQVV9JRl9TT0YJCQkweDFCCisjZGVmaW5lIENQVV9JRl9FT0YJCQkweDFDCisjZGVmaW5lIENQVV9JRl9TTEVFUAkJCTB4MUQKKworI2RlZmluZSBTRVFVRU5DRV9NT0RFCQkJMHgxRQorI2RlZmluZSBTT0ZUX1JFU0VUCQkJMHgxRgorI2RlZmluZSBGUk9OVF9FTkRfUkVTRVQJCQkweDIxCisjZGVmaW5lIEFVVE9fUFdSX0VOQUJMRQkJCTB4MjIKKworI2RlZmluZSBWU1lOQ19MSU5FX0RFTEFZCQkweDIzCisjZGVmaW5lIENQVV9QSV9IT1JJWl9TVEFSVAkJMHgyNAorI2RlZmluZSBDUFVfUElfVkVSVF9TVEFSVAkJMHgyNQorI2RlZmluZSBDUFVfUElfSE9SSVpfV0lEVEgJCTB4MjYKKyNkZWZpbmUgQ1BVX1BJX1ZFUlRfSEVJR0hUCQkweDI3CisKKyNkZWZpbmUgUElYRUxfTUFTS19DUk9QCQkJMHgyOAorI2RlZmluZSBDUk9QX0ZJUlNUX0xJTkUJCQkweDI5CisjZGVmaW5lIENST1BfTEFTVF9MSU5FCQkJMHgyQQorI2RlZmluZSBDUk9QX0ZJUlNUX1BJWEVMCQkweDJCCisjZGVmaW5lIENST1BfTEFTVF9QSVhFTAkJCTB4MkMKKyNkZWZpbmUgRE1EX1BBUktfVFJJR0dFUgkJMHgyRAorCisjZGVmaW5lIE1JU0NfUkVHCQkJMHgzMAorCisvKiBBR0MgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFHQ19DVFJMCQkJMHg1MAorI2RlZmluZSBBR0NfQ0xJUFBFRF9QSVhTCQkweDU1CisjZGVmaW5lIEFHQ19CUklHSFRfUElYUwkJCTB4NTYKKyNkZWZpbmUgQUdDX0JHX1BJWFMJCQkweDU3CisjZGVmaW5lIEFHQ19TQUZFVFlfTUFSR0lOCQkweDE3CisKKy8qIENvbG9yIENvb3JkaW5hdGUgQWRqdXN0bWVudCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0NBX0VOQUJMRQkJMHg1RQorI2RlZmluZSBDQ0FfQzFBCQkJMHg1RgorI2RlZmluZSBDQ0FfQzFCCQkJMHg2MAorI2RlZmluZSBDQ0FfQzFDCQkJMHg2MQorI2RlZmluZSBDQ0FfQzJBCQkJMHg2MgorI2RlZmluZSBDQ0FfQzJCCQkJMHg2MworI2RlZmluZSBDQ0FfQzJDCQkJMHg2NAorI2RlZmluZSBDQ0FfQzNBCQkJMHg2NQorI2RlZmluZSBDQ0FfQzNCCQkJMHg2NgorI2RlZmluZSBDQ0FfQzNDCQkJMHg2NworI2RlZmluZSBDQ0FfQzdBCQkJMHg3MQorI2RlZmluZSBDQ0FfQzdCCQkJMHg3MgorI2RlZmluZSBDQ0FfQzdDCQkJMHg3MworCisvKioKKyAqIERMUCBQaWNvIFByb2Nlc3NvciAyNjAwIGNvbWVzIHdpdGggZmxhc2gKKyAqIFdlIGNhbiBkbyBETUEgb3BlcmF0aW9ucyBmcm9tIGZsYXNoIGZvciBhY2Nlc3NpbmcgTG9vayBVcCBUYWJsZXMKKyAqLworI2RlZmluZSBETUFfU1RBVFVTCQkJMHgxMDAKKyNkZWZpbmUgRkxBU0hfQUREUl9CWVRFUwkJMHg3NAorI2RlZmluZSBGTEFTSF9EVU1NWV9CWVRFUwkJMHg3NQorI2RlZmluZSBGTEFTSF9XUklURV9CWVRFUwkJMHg3NgorI2RlZmluZSBGTEFTSF9SRUFEX0JZVEVTCQkweDc3CisjZGVmaW5lIEZMQVNIX09QQ09ERQkJCTB4NzgKKyNkZWZpbmUgRkxBU0hfU1RBUlRfQUREUgkJMHg3OQorI2RlZmluZSBGTEFTSF9EVU1NWTIJCQkweDdBCisjZGVmaW5lIEZMQVNIX1dSSVRFX0RBVEEJCTB4N0IKKworI2RlZmluZSBURU1QT1JBTF9ESVRIX0RJU0FCTEUJCTB4N0UKKyNkZWZpbmUgU0VRX0NPTlRST0wJCQkweDgyCisjZGVmaW5lIFNFUV9WRUNUT1IJCQkweDgzCisKKy8qIERNRCBpcyBEaWdpdGFsIE1pY3JvbWlycm9yIERldmljZSAqLworI2RlZmluZSBETURfQkxPQ0tfQ09VTlQJCQkweDg0CisjZGVmaW5lIERNRF9WQ0NfQ09OVFJPTAkJCTB4ODYKKyNkZWZpbmUgRE1EX1BBUktfUFVMU0VfQ09VTlQJCTB4ODcKKyNkZWZpbmUgRE1EX1BBUktfUFVMU0VfV0lEVEgJCTB4ODgKKyNkZWZpbmUgRE1EX1BBUktfREVMQVkJCQkweDg5CisjZGVmaW5lIERNRF9TSEFET1dfRU5BQkxFCQkweDhFCisjZGVmaW5lIFNFUV9TVEFUVVMJCQkweDhGCisjZGVmaW5lIEZMQVNIX0NMT0NLX0NPTlRST0wJCTB4OTgKKyNkZWZpbmUgRE1EX1BBUksJCQkweDJECisKKyNkZWZpbmUgU0RSQU1fQklTVF9FTkFCTEUJCTB4NDYKKyNkZWZpbmUgRERSX0RSSVZFUl9TVFJFTkdUSAkJMHg5QQorI2RlZmluZSBTRENfRU5BQkxFCQkJMHg5RAorI2RlZmluZSBTRENfQlVGRl9TV0FQX0RJU0FCTEUJCTB4QTMKKyNkZWZpbmUgQ1VSVEFJTl9DT05UUk9MCQkJMHhBNgorI2RlZmluZSBERFJfQlVTX1NXQVBfRU5BQkxFCQkweEE3CisjZGVmaW5lIERNRF9UUkNfRU5BQkxFCQkJMHhBOAorI2RlZmluZSBETURfQlVTX1NXQVBfRU5BQkxFCQkweEE5CisKKyNkZWZpbmUgQUNUR0VOX0VOQUJMRQkJCTB4QUUKKyNkZWZpbmUgQUNUR0VOX0NPTlRST0wJCQkweEFGCisjZGVmaW5lIEFDVEdFTl9IT1JJWl9CUAkJCTB4QjAKKyNkZWZpbmUgQUNUR0VOX1ZFUlRfQlAJCQkweEIxCisKKy8qIExvb2sgVXAgVGFibGUgYWNjZXNzICovCisjZGVmaW5lIENNVF9TUExBU0hfTFVUX1NUQVJUX0FERFIJMHhGQQorI2RlZmluZSBDTVRfU1BMQVNIX0xVVF9ERVNUX1NFTEVDVAkweEZCCisjZGVmaW5lIENNVF9TUExBU0hfTFVUX0RBVEEJCTB4RkMKKyNkZWZpbmUgU0VRX1JFU0VUX0xVVF9TVEFSVF9BRERSCTB4RkQKKyNkZWZpbmUgU0VRX1JFU0VUX0xVVF9ERVNUX1NFTEVDVAkweEZFCisjZGVmaW5lIFNFUV9SRVNFVF9MVVRfREFUQQkJMHhGRgorCisvKiBJbnB1dCBzb3VyY2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUEFSQUxMRUxfUkdCCQkwCisjZGVmaW5lIElOVF9URVNUX1BBVFRFUk4JMQorI2RlZmluZSBTUExBU0hfU0NSRUVOCQkyCisjZGVmaW5lIENQVV9JTlRGCQkzCisjZGVmaW5lIEJUNjU2CQkJNAorCisvKiBTdGFuZGFyZCBpbnB1dCByZXNvbHV0aW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lIFFXVkdBX0xBTkRTQ0FQRQkJMwkvKiAoNDI3aCoyNDB2KSAqLworI2RlZmluZSBXVkdBXzg2NF9MQU5EU0NBUEUJMjEJLyogKDg2NGgqNDgwdikgKi8KKyNkZWZpbmUgV1ZHQV9ETURfT1BUSUNBTF9URVNUCTM1CS8qICg2MDhoKjY4NHYpICovCisKKy8qIFN0YW5kYXJkIGRhdGEgZm9ybWF0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFJHQjU2NQkJCTAKKyNkZWZpbmUgUkdCNjY2CQkJMQorI2RlZmluZSBSR0I4ODgJCQkyCisKKy8qIFRlc3QgUGF0dGVybiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBUUEdfQ0hFQ0tFUkJPQVJECTAKKyNkZWZpbmUgVFBHX0JMQUNLCQkxCisjZGVmaW5lIFRQR19XSElURQkJMgorI2RlZmluZSBUUEdfUkVECQkJMworI2RlZmluZSBUUEdfQkxVRQkJNAorI2RlZmluZSBUUEdfR1JFRU4JCTUKKyNkZWZpbmUgVFBHX1ZMSU5FU19CTEFDSwk2CisjZGVmaW5lIFRQR19ITElORVNfQkxBQ0sJNworI2RlZmluZSBUUEdfVkxJTkVTX0FMVAkJOAorI2RlZmluZSBUUEdfSExJTkVTX0FMVAkJOQorI2RlZmluZSBUUEdfRElBR19MSU5FUwkJMTAKKyNkZWZpbmUgVFBHX0dSRVlSQU1QX1ZFUlQJMTEKKyNkZWZpbmUgVFBHX0dSRVlSQU1QX0hPUklaCTEyCisjZGVmaW5lIFRQR19BTlNJX0NIRUNLRVJCT0FSRAkxMworCisvKiBzZXF1ZW5jZSBtb2RlIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNFUV9GUkVFX1JVTgkJMAorI2RlZmluZSBTRVFfTE9DSwkJMQorCisvKiBjdXJ0YWluIGNvbG9yIGRlZmluaXRpb25zICovCisjZGVmaW5lIENVUlRBSU5fQkxBQ0sJCTAKKyNkZWZpbmUgQ1VSVEFJTl9SRUQJCTEKKyNkZWZpbmUgQ1VSVEFJTl9HUkVFTgkJMgorI2RlZmluZSBDVVJUQUlOX0JMVUUJCTMKKyNkZWZpbmUgQ1VSVEFJTl9ZRUxMT1cJCTQKKyNkZWZpbmUgQ1VSVEFJTl9NQUdFTlRBCQk1CisjZGVmaW5lIENVUlRBSU5fQ1lBTgkJNgorI2RlZmluZSBDVVJUQUlOX1dISVRFCQk3CisKKy8qIExVVCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDTVRfTFVUX05PTkUJCTAKKyNkZWZpbmUgQ01UX0xVVF9HUkVFTgkJMQorI2RlZmluZSBDTVRfTFVUX1JFRAkJMgorI2RlZmluZSBDTVRfTFVUX0JMVUUJCTMKKyNkZWZpbmUgQ01UX0xVVF9BTEwJCTQKKyNkZWZpbmUgU1BMQVNIX0xVVAkJNQorCisjZGVmaW5lIFNFUV9MVVRfTk9ORQkJMAorI2RlZmluZSBTRVFfRFJDX0xVVF8wCQkxCisjZGVmaW5lIFNFUV9EUkNfTFVUXzEJCTIKKyNkZWZpbmUgU0VRX0RSQ19MVVRfMgkJMworI2RlZmluZSBTRVFfRFJDX0xVVF8zCQk0CisjZGVmaW5lIFNFUV9TRVFfTFVUCQk1CisjZGVmaW5lIFNFUV9EUkNfTFVUX0FMTAkJNgorI2RlZmluZSBXUENfUFJPR1JBTV9MVVQJCTcKKworI2RlZmluZSBCSVRTVFJFQU1fU1RBUlRfQUREUgkJMHgwMDAwMDAwMAorI2RlZmluZSBCSVRTVFJFQU1fU0laRQkJCTB4MDAwNDAwMDAKKworI2RlZmluZSBXUENfRldfMF9TVEFSVF9BRERSCQkweDAwMDQwMDAwCisjZGVmaW5lIFdQQ19GV18wX1NJWkUJCQkweDAwMDAwY2U4CisKKyNkZWZpbmUgU0VRVUVOQ0VfMF9TVEFSVF9BRERSCQkweDAwMDQ0MDAwCisjZGVmaW5lIFNFUVVFTkNFXzBfU0laRQkJCTB4MDAwMDEwMDAKKworI2RlZmluZSBTRVFVRU5DRV8xX1NUQVJUX0FERFIJCTB4MDAwNDUwMDAKKyNkZWZpbmUgU0VRVUVOQ0VfMV9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzJfU1RBUlRfQUREUgkJMHgwMDA0NjAwMAorI2RlZmluZSBTRVFVRU5DRV8yX1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgU0VRVUVOQ0VfM19TVEFSVF9BRERSCQkweDAwMDQ3MDAwCisjZGVmaW5lIFNFUVVFTkNFXzNfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBTRVFVRU5DRV80X1NUQVJUX0FERFIJCTB4MDAwNDgwMDAKKyNkZWZpbmUgU0VRVUVOQ0VfNF9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzVfU1RBUlRfQUREUgkJMHgwMDA0OTAwMAorI2RlZmluZSBTRVFVRU5DRV81X1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgU0VRVUVOQ0VfNl9TVEFSVF9BRERSCQkweDAwMDRhMDAwCisjZGVmaW5lIFNFUVVFTkNFXzZfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBDTVRfTFVUXzBfU1RBUlRfQUREUgkJMHgwMDA0YjIwMAorI2RlZmluZSBDTVRfTFVUXzBfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzFfU1RBUlRfQUREUgkJMHgwMDA0YjgwMAorI2RlZmluZSBDTVRfTFVUXzFfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzJfU1RBUlRfQUREUgkJMHgwMDA0YmUwMAorI2RlZmluZSBDTVRfTFVUXzJfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzNfU1RBUlRfQUREUgkJMHgwMDA0YzQwMAorI2RlZmluZSBDTVRfTFVUXzNfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzRfU1RBUlRfQUREUgkJMHgwMDA0Y2EwMAorI2RlZmluZSBDTVRfTFVUXzRfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzVfU1RBUlRfQUREUgkJMHgwMDA0ZDAwMAorI2RlZmluZSBDTVRfTFVUXzVfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBDTVRfTFVUXzZfU1RBUlRfQUREUgkJMHgwMDA0ZDYwMAorI2RlZmluZSBDTVRfTFVUXzZfU0laRQkJCTB4MDAwMDA2MDAKKworI2RlZmluZSBEUkNfVEFCTEVfMF9TVEFSVF9BRERSCQkweDAwMDRkYzAwCisjZGVmaW5lIERSQ19UQUJMRV8wX1NJWkUJCTB4MDAwMDAxMDAKKworI2RlZmluZSBTUExBU0hfMF9TVEFSVF9BRERSCQkweDAwMDRkZDAwCisjZGVmaW5lIFNQTEFTSF8wX1NJWkUJCQkweDAwMDMyMjgwCisKKyNkZWZpbmUgU0VRVUVOQ0VfN19TVEFSVF9BRERSCQkweDAwMDgwMDAwCisjZGVmaW5lIFNFUVVFTkNFXzdfU0laRQkJCTB4MDAwMDBkMTAKKworI2RlZmluZSBTRVFVRU5DRV84X1NUQVJUX0FERFIJCTB4MDAwODE4MDAKKyNkZWZpbmUgU0VRVUVOQ0VfOF9TSVpFCQkJMHgwMDAwMGQxMAorCisjZGVmaW5lIFNFUVVFTkNFXzlfU1RBUlRfQUREUgkJMHgwMDA4MzAwMAorI2RlZmluZSBTRVFVRU5DRV85X1NJWkUJCQkweDAwMDAwZDEwCisKKyNkZWZpbmUgQ01UX0xVVF83X1NUQVJUX0FERFIJCTB4MDAwOGUwMDAKKyNkZWZpbmUgQ01UX0xVVF83X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgQ01UX0xVVF84X1NUQVJUX0FERFIJCTB4MDAwOGU4MDAKKyNkZWZpbmUgQ01UX0xVVF84X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgQ01UX0xVVF85X1NUQVJUX0FERFIJCTB4MDAwOGYwMDAKKyNkZWZpbmUgQ01UX0xVVF85X1NJWkUJCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgU1BMQVNIXzFfU1RBUlRfQUREUgkJMHgwMDA5YTAwMAorI2RlZmluZSBTUExBU0hfMV9TSVpFCQkJMHgwMDAzMjI4MAorCisjZGVmaW5lIFNQTEFTSF8yX1NUQVJUX0FERFIJCTB4MDAwY2QwMDAKKyNkZWZpbmUgU1BMQVNIXzJfU0laRQkJCTB4MDAwMzIyODAKKworI2RlZmluZSBTUExBU0hfM19TVEFSVF9BRERSCQkweDAwMTAwMDAwCisjZGVmaW5lIFNQTEFTSF8zX1NJWkUJCQkweDAwMDMyMjgwCisKKyNkZWZpbmUgT1BUX1NQTEFTSF8wX1NUQVJUX0FERFIJCTB4MDAxMzQwMDAKKyNkZWZpbmUgT1BUX1NQTEFTSF8wX1NJWkUJCTB4MDAwY2IxMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCmluZGV4IDRlODg4YWMuLjgwYzNmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCkBAIC0zNSwyNiArMzUsMTIgQEAKIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLW5va2lhLWRzaS5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlzcGxheS5oPgogCiAvKiBEU0kgVmlydHVhbCBjaGFubmVsLiBIYXJkY29kZWQgZm9yIG5vdy4gKi8KICNkZWZpbmUgVENIIDAKIAogI2RlZmluZSBEQ1NfUkVBRF9OVU1fRVJST1JTCTB4MDUKLSNkZWZpbmUgRENTX1JFQURfUE9XRVJfTU9ERQkweDBhCi0jZGVmaW5lIERDU19SRUFEX01BRENUTAkJMHgwYgotI2RlZmluZSBEQ1NfUkVBRF9QSVhFTF9GT1JNQVQJMHgwYwotI2RlZmluZSBEQ1NfUkREU0RSCQkweDBmCi0jZGVmaW5lIERDU19TTEVFUF9JTgkJMHgxMAotI2RlZmluZSBEQ1NfU0xFRVBfT1VUCQkweDExCi0jZGVmaW5lIERDU19ESVNQTEFZX09GRgkJMHgyOAotI2RlZmluZSBEQ1NfRElTUExBWV9PTgkJMHgyOQotI2RlZmluZSBEQ1NfQ09MVU1OX0FERFIJCTB4MmEKLSNkZWZpbmUgRENTX1BBR0VfQUREUgkJMHgyYgotI2RlZmluZSBEQ1NfTUVNT1JZX1dSSVRFCTB4MmMKLSNkZWZpbmUgRENTX1RFQVJfT0ZGCQkweDM0Ci0jZGVmaW5lIERDU19URUFSX09OCQkweDM1Ci0jZGVmaW5lIERDU19NRU1fQUNDX0NUUkwJMHgzNgotI2RlZmluZSBEQ1NfUElYRUxfRk9STUFUCTB4M2EKICNkZWZpbmUgRENTX0JSSUdIVE5FU1MJCTB4NTEKICNkZWZpbmUgRENTX0NUUkxfRElTUExBWQkweDUzCiAjZGVmaW5lIERDU19XUklURV9DQUJDCQkweDU1CkBAIC0yMjIsOCArMjA4LDYgQEAKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgdGVfdGltZW91dF93b3JrOwogCi0JYm9vbCB1c2VfZHNpX2JsOwotCiAJYm9vbCBjYWJjX2Jyb2tlbjsKIAl1bnNpZ25lZCBjYWJjX21vZGU7CiAKQEAgLTMwMiw3ICsyODYsNyBAQAogCiAJaHdfZ3VhcmRfd2FpdCh0ZCk7CiAKLQljbWQgPSBEQ1NfU0xFRVBfSU47CisJY21kID0gTUlQSV9EQ1NfRU5URVJfU0xFRVBfTU9ERTsKIAlyID0gZHNpX3ZjX2Rjc193cml0ZV9ub3N5bmModGQtPmRzc2RldiwgdGQtPmNoYW5uZWwsICZjbWQsIDEpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTMyMSw3ICszMDUsNyBAQAogCiAJaHdfZ3VhcmRfd2FpdCh0ZCk7CiAKLQlyID0gdGFhbF9kY3Nfd3JpdGVfMCh0ZCwgRENTX1NMRUVQX09VVCk7CisJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIE1JUElfRENTX0VYSVRfU0xFRVBfTU9ERSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0zNTYsNyArMzQwLDcgQEAKIAl1OCBtb2RlOwogCWludCBiNSwgYjYsIGI3OwogCi0JciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgRENTX1JFQURfTUFEQ1RMLCAmbW9kZSk7CisJciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgTUlQSV9EQ1NfR0VUX0FERFJFU1NfTU9ERSwgJm1vZGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIApAQCAtMzkwLDcgKzM3NCw3IEBACiAJbW9kZSAmPSB+KCgxPDw3KSB8ICgxPDw2KSB8ICgxPDw1KSk7CiAJbW9kZSB8PSAoYjcgPDwgNykgfCAoYjYgPDwgNikgfCAoYjUgPDwgNSk7CiAKLQlyZXR1cm4gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX01FTV9BQ0NfQ1RSTCwgbW9kZSk7CisJcmV0dXJuIHRhYWxfZGNzX3dyaXRlXzEodGQsIE1JUElfRENTX1NFVF9BRERSRVNTX01PREUsIG1vZGUpOwogfQogCiBzdGF0aWMgaW50IHRhYWxfc2V0X3VwZGF0ZV93aW5kb3coc3RydWN0IHRhYWxfZGF0YSAqdGQsCkBAIC00MDMsNyArMzg3LDcgQEAKIAl1MTYgeTIgPSB5ICsgaCAtIDE7CiAKIAl1OCBidWZbNV07Ci0JYnVmWzBdID0gRENTX0NPTFVNTl9BRERSOworCWJ1ZlswXSA9IE1JUElfRENTX1NFVF9DT0xVTU5fQUREUkVTUzsKIAlidWZbMV0gPSAoeDEgPj4gOCkgJiAweGZmOwogCWJ1ZlsyXSA9ICh4MSA+PiAwKSAmIDB4ZmY7CiAJYnVmWzNdID0gKHgyID4+IDgpICYgMHhmZjsKQEAgLTQxMyw3ICszOTcsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWJ1ZlswXSA9IERDU19QQUdFX0FERFI7CisJYnVmWzBdID0gTUlQSV9EQ1NfU0VUX1BBR0VfQUREUkVTUzsKIAlidWZbMV0gPSAoeTEgPj4gOCkgJiAweGZmOwogCWJ1ZlsyXSA9ICh5MSA+PiAwKSAmIDB4ZmY7CiAJYnVmWzNdID0gKHkyID4+IDgpICYgMHhmZjsKQEAgLTU1NSw3ICs1MzksNiBAQAogewogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOwogCXN0cnVjdCB0YWFsX2RhdGEgKnRkID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7Ci0Jc3RydWN0IG5va2lhX2RzaV9wYW5lbF9kYXRhICpwYW5lbF9kYXRhID0gZ2V0X3BhbmVsX2RhdGEoZHNzZGV2KTsKIAlpbnQgcjsKIAlpbnQgbGV2ZWw7CiAKQEAgLTU2OSwyMyArNTUyLDE2IEBACiAKIAltdXRleF9sb2NrKCZ0ZC0+bG9jayk7CiAKLQlpZiAodGQtPnVzZV9kc2lfYmwpIHsKLQkJaWYgKHRkLT5lbmFibGVkKSB7Ci0JCQlkc2lfYnVzX2xvY2soZHNzZGV2KTsKKwlpZiAodGQtPmVuYWJsZWQpIHsKKwkJZHNpX2J1c19sb2NrKGRzc2Rldik7CiAKLQkJCXIgPSB0YWFsX3dha2VfdXAoZHNzZGV2KTsKLQkJCWlmICghcikKLQkJCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX0JSSUdIVE5FU1MsIGxldmVsKTsKKwkJciA9IHRhYWxfd2FrZV91cChkc3NkZXYpOworCQlpZiAoIXIpCisJCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX0JSSUdIVE5FU1MsIGxldmVsKTsKIAotCQkJZHNpX2J1c191bmxvY2soZHNzZGV2KTsKLQkJfSBlbHNlIHsKLQkJCXIgPSAwOwotCQl9CisJCWRzaV9idXNfdW5sb2NrKGRzc2Rldik7CiAJfSBlbHNlIHsKLQkJaWYgKCFwYW5lbF9kYXRhLT5zZXRfYmFja2xpZ2h0KQotCQkJciA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXIgPSBwYW5lbF9kYXRhLT5zZXRfYmFja2xpZ2h0KGRzc2RldiwgbGV2ZWwpOworCQlyID0gMDsKIAl9CiAKIAltdXRleF91bmxvY2soJnRkLT5sb2NrKTsKQEAgLTk2NCw3ICs5NDAsNyBAQAogewogCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKIAlzdHJ1Y3QgdGFhbF9kYXRhICp0ZDsKLQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxkZXY7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsZGV2ID0gTlVMTDsKIAlzdHJ1Y3Qgbm9raWFfZHNpX3BhbmVsX2RhdGEgKnBhbmVsX2RhdGEgPSBnZXRfcGFuZWxfZGF0YShkc3NkZXYpOwogCXN0cnVjdCBwYW5lbF9jb25maWcgKnBhbmVsX2NvbmZpZyA9IE5VTEw7CiAJaW50IHIsIGk7CkBAIC05OTAsNyArOTY2LDcgQEAKIAogCWRzc2Rldi0+cGFuZWwuY29uZmlnID0gT01BUF9EU1NfTENEX1RGVDsKIAlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBwYW5lbF9jb25maWctPnRpbWluZ3M7Ci0JZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPSAyNDsKKwlkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10ID0gT01BUF9EU1NfRFNJX0ZNVF9SR0I4ODg7CiAKIAl0ZCA9IGt6YWxsb2Moc2l6ZW9mKCp0ZCksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKQEAgLTEwMjUsMzUgKzEwMDEsMjYgQEAKIAogCXRhYWxfaHdfcmVzZXQoZHNzZGV2KTsKIAotCS8qIGlmIG5vIHBsYXRmb3JtIHNldF9iYWNrbGlnaHQoKSBkZWZpbmVkLCBwcmVzdW1lIERTSSBiYWNrbGlnaHQKLQkgKiBjb250cm9sICovCi0JbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwotCWlmICghcGFuZWxfZGF0YS0+c2V0X2JhY2tsaWdodCkKLQkJdGQtPnVzZV9kc2lfYmwgPSB0cnVlOwotCi0JaWYgKHRkLT51c2VfZHNpX2JsKQorCWlmIChwYW5lbF9kYXRhLT51c2VfZHNpX2JhY2tsaWdodCkgeworCQltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CiAJCXByb3BzLm1heF9icmlnaHRuZXNzID0gMjU1OwotCWVsc2UKLQkJcHJvcHMubWF4X2JyaWdodG5lc3MgPSAxMjc7CiAKLQlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKLQlibGRldiA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2X25hbWUoJmRzc2Rldi0+ZGV2KSwgJmRzc2Rldi0+ZGV2LAotCQkJCQlkc3NkZXYsICZ0YWFsX2JsX29wcywgJnByb3BzKTsKLQlpZiAoSVNfRVJSKGJsZGV2KSkgewotCQlyID0gUFRSX0VSUihibGRldik7Ci0JCWdvdG8gZXJyX2JsOwotCX0KKwkJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CisJCWJsZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihkZXZfbmFtZSgmZHNzZGV2LT5kZXYpLAorCQkJCSZkc3NkZXYtPmRldiwgZHNzZGV2LCAmdGFhbF9ibF9vcHMsICZwcm9wcyk7CisJCWlmIChJU19FUlIoYmxkZXYpKSB7CisJCQlyID0gUFRSX0VSUihibGRldik7CisJCQlnb3RvIGVycl9ibDsKKwkJfQogCi0JdGQtPmJsZGV2ID0gYmxkZXY7CisJCXRkLT5ibGRldiA9IGJsZGV2OwogCi0JYmxkZXYtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKLQlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOwotCWlmICh0ZC0+dXNlX2RzaV9ibCkKKwkJYmxkZXYtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKKwkJYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKIAkJYmxkZXYtPnByb3BzLmJyaWdodG5lc3MgPSAyNTU7Ci0JZWxzZQotCQlibGRldi0+cHJvcHMuYnJpZ2h0bmVzcyA9IDEyNzsKIAotCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJfQogCiAJaWYgKHBhbmVsX2RhdGEtPnVzZV9leHRfdGUpIHsKIAkJaW50IGdwaW8gPSBwYW5lbF9kYXRhLT5leHRfdGVfZ3BpbzsKQEAgLTEwNjcsNyArMTAzNCw3IEBACiAJCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOwogCiAJCXIgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShncGlvKSwgdGFhbF90ZV9pc3IsCi0JCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKIAkJCQkidGFhbCB2c3luYyIsIGRzc2Rldik7CiAKIAkJaWYgKHIpIHsKQEAgLTExMTEsNyArMTA3OCw4IEBACiAJaWYgKHBhbmVsX2RhdGEtPnVzZV9leHRfdGUpCiAJCWdwaW9fZnJlZShwYW5lbF9kYXRhLT5leHRfdGVfZ3Bpbyk7CiBlcnJfZ3BpbzoKLQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOworCWlmIChibGRldiAhPSBOVUxMKQorCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmxkZXYpOwogZXJyX2JsOgogCWRlc3Ryb3lfd29ya3F1ZXVlKHRkLT53b3JrcXVldWUpOwogZXJyX3dxOgpAQCAtMTE0MCw5ICsxMTA4LDExIEBACiAJfQogCiAJYmxkZXYgPSB0ZC0+YmxkZXY7Ci0JYmxkZXYtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOwotCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7Ci0JYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJsZGV2KTsKKwlpZiAoYmxkZXYgIT0gTlVMTCkgeworCQlibGRldi0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJCXRhYWxfYmxfdXBkYXRlX3N0YXR1cyhibGRldik7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibGRldik7CisJfQogCiAJdGFhbF9jYW5jZWxfdWxwc193b3JrKGRzc2Rldik7CiAJdGFhbF9jYW5jZWxfZXNkX3dvcmsoZHNzZGV2KTsKQEAgLTExOTUsNyArMTE2NSw4IEBACiAJaWYgKHIpCiAJCWdvdG8gZXJyOwogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzEodGQsIERDU19QSVhFTF9GT1JNQVQsIDB4Nyk7IC8qIDI0Yml0L3BpeGVsICovCisJciA9IHRhYWxfZGNzX3dyaXRlXzEodGQsIE1JUElfRENTX1NFVF9QSVhFTF9GT1JNQVQsCisJCU1JUElfRENTX1BJWEVMX0ZNVF8yNEJJVCk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyOwogCkBAIC0xMjA5LDcgKzExODAsNyBAQAogCQkJZ290byBlcnI7CiAJfQogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19ESVNQTEFZX09OKTsKKwlyID0gdGFhbF9kY3Nfd3JpdGVfMCh0ZCwgTUlQSV9EQ1NfU0VUX0RJU1BMQVlfT04pOwogCWlmIChyKQogCQlnb3RvIGVycjsKIApAQCAtMTI0Niw3ICsxMjE3LDcgQEAKIAlzdHJ1Y3QgdGFhbF9kYXRhICp0ZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOwogCWludCByOwogCi0JciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19ESVNQTEFZX09GRik7CisJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIE1JUElfRENTX1NFVF9ESVNQTEFZX09GRik7CiAJaWYgKCFyKQogCQlyID0gdGFhbF9zbGVlcF9pbih0ZCk7CiAKQEAgLTE1MjksOSArMTUwMCw5IEBACiAJaW50IHI7CiAKIAlpZiAoZW5hYmxlKQotCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgRENTX1RFQVJfT04sIDApOworCQlyID0gdGFhbF9kY3Nfd3JpdGVfMSh0ZCwgTUlQSV9EQ1NfU0VUX1RFQVJfT04sIDApOwogCWVsc2UKLQkJciA9IHRhYWxfZGNzX3dyaXRlXzAodGQsIERDU19URUFSX09GRik7CisJCXIgPSB0YWFsX2Rjc193cml0ZV8wKHRkLCBNSVBJX0RDU19TRVRfVEVBUl9PRkYpOwogCiAJaWYgKCFwYW5lbF9kYXRhLT51c2VfZXh0X3RlKQogCQlvbWFwZHNzX2RzaV9lbmFibGVfdGUoZHNzZGV2LCBlbmFibGUpOwpAQCAtMTg1MSw3ICsxODIyLDcgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgRENTX1JERFNEUiwgJnN0YXRlMSk7CisJciA9IHRhYWxfZGNzX3JlYWRfMSh0ZCwgTUlQSV9EQ1NfR0VUX0RJQUdOT1NUSUNfUkVTVUxULCAmc3RhdGUxKTsKIAlpZiAocikgewogCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byByZWFkIFRhYWwgc3RhdHVzXG4iKTsKIAkJZ290byBlcnI7CkBAIC0xODY0LDcgKzE4MzUsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlyID0gdGFhbF9kY3NfcmVhZF8xKHRkLCBEQ1NfUkREU0RSLCAmc3RhdGUyKTsKKwlyID0gdGFhbF9kY3NfcmVhZF8xKHRkLCBNSVBJX0RDU19HRVRfRElBR05PU1RJQ19SRVNVTFQsICZzdGF0ZTIpOwogCWlmIChyKSB7CiAJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgVGFhbCBzdGF0dXNcbiIpOwogCQlnb3RvIGVycjsKQEAgLTE4ODAsNyArMTg1MSw3IEBACiAJLyogU2VsZi1kaWFnbm9zdGljcyByZXN1bHQgaXMgYWxzbyBzaG93biBvbiBURSBHUElPIGxpbmUuIFdlIG5lZWQKIAkgKiB0byByZS1lbmFibGUgVEUgYWZ0ZXIgc2VsZiBkaWFnbm9zdGljcyAqLwogCWlmICh0ZC0+dGVfZW5hYmxlZCAmJiBwYW5lbF9kYXRhLT51c2VfZXh0X3RlKSB7Ci0JCXIgPSB0YWFsX2Rjc193cml0ZV8xKHRkLCBEQ1NfVEVBUl9PTiwgMCk7CisJCXIgPSB0YWFsX2Rjc193cml0ZV8xKHRkLCBNSVBJX0RDU19TRVRfVEVBUl9PTiwgMCk7CiAJCWlmIChyKQogCQkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKaW5kZXggMGQxMjUyNC4uN2JlN2MwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogbWVudWNvbmZpZyBPTUFQMl9EU1MKLSAgICAgICAgdHJpc3RhdGUgIk9NQVAyKyBEaXNwbGF5IFN1YnN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIERpc3BsYXkgU3Vic3lzdGVtIHN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKICAgICAgICAgaGVscAogCSAgT01BUDIrIERpc3BsYXkgU3Vic3lzdGVtIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCmluZGV4IDEwZDlkM2IuLmJkMzRhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL01ha2VmaWxlCkBAIC02LDQgKzYsNCBAQAogb21hcGRzcy0kKENPTkZJR19PTUFQMl9EU1NfU0RJKSArPSBzZGkubwogb21hcGRzcy0kKENPTkZJR19PTUFQMl9EU1NfRFNJKSArPSBkc2kubwogb21hcGRzcy0kKENPTkZJR19PTUFQNF9EU1NfSERNSSkgKz0gaGRtaS5vIFwKLQkJCQkgICAgaGRtaV9vbWFwNF9wYW5lbC5vCisJCQkJICAgIGhkbWlfcGFuZWwubyB0aV9oZG1pXzR4eHhfaXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCmluZGV4IDc2ODIxZmUuLjg2ZWMxMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9jb3JlLmMKQEAgLTE0NSw2ICsxNDUsMTAgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ2ZW5jIiwgU19JUlVHTywgZHNzX2RlYnVnZnNfZGlyLAogCQkJJnZlbmNfZHVtcF9yZWdzLCAmZHNzX2RlYnVnX2ZvcHMpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX09NQVA0X0RTU19IRE1JCisJZGVidWdmc19jcmVhdGVfZmlsZSgiaGRtaSIsIFNfSVJVR08sIGRzc19kZWJ1Z2ZzX2RpciwKKwkJCSZoZG1pX2R1bXBfcmVncywgJmRzc19kZWJ1Z19mb3BzKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwppbmRleCAwZjM5NjFhLi4zNTMyNzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KQEAgLTEwNiw3ICsxMDcsNyBAQAogCWludCBpcnE7CiAJc3RydWN0IGNsayAqZHNzX2NsazsKIAotCXUzMglmaWZvX3NpemVbM107CisJdTMyCWZpZm9fc2l6ZVtNQVhfRFNTX09WRVJMQVlTXTsKIAogCXNwaW5sb2NrX3QgaXJxX2xvY2s7CiAJdTMyIGlycV9lcnJvcl9tYXNrOwpAQCAtMTcxLDE3MyArMTcyLDk5IEBACiAKIHN0YXRpYyB2b2lkIGRpc3BjX3NhdmVfY29udGV4dCh2b2lkKQogewotCWludCBpOworCWludCBpLCBqOwogCiAJRFNTREJHKCJkaXNwY19zYXZlX2NvbnRleHRcbiIpOwogCiAJU1IoSVJRRU5BQkxFKTsKIAlTUihDT05UUk9MKTsKIAlTUihDT05GSUcpOwotCVNSKERFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKLQlTUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKFRSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKIAlTUihMSU5FX05VTUJFUik7Ci0JU1IoVElNSU5HX0goT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKFBPTF9GUkVRKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JU1IoRElWSVNPUm8oT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRklYRURfWk9SREVSKSB8fAorCQkJZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpKQogCQlTUihHTE9CQUxfQUxQSEEpOwotCVNSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKLQlTUihTSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJU1IoQ09OVFJPTDIpOwotCQlTUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKFRJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKERJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlTUihDT05GSUcyKTsKIAl9CiAKLQlTUihPVkxfQkEwKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfR0ZYKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX0dGWCkpOwotCVNSKE9WTF9XSU5ET1dfU0tJUChPTUFQX0RTU19HRlgpKTsKLQlTUihPVkxfVEFCTEVfQkEoT01BUF9EU1NfR0ZYKSk7CisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fbWdycygpOyBpKyspIHsKKwkJU1IoREVGQVVMVF9DT0xPUihpKSk7CisJCVNSKFRSQU5TX0NPTE9SKGkpKTsKKwkJU1IoU0laRV9NR1IoaSkpOworCQlpZiAoaSA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQorCQkJY29udGludWU7CisJCVNSKFRJTUlOR19IKGkpKTsKKwkJU1IoVElNSU5HX1YoaSkpOworCQlTUihQT0xfRlJFUShpKSk7CisJCVNSKERJVklTT1JvKGkpKTsKIAotCVNSKERBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlTUihEQVRBX0NZQ0xFMShpKSk7CisJCVNSKERBVEFfQ1lDTEUyKGkpKTsKKwkJU1IoREFUQV9DWUNMRTMoaSkpOwogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKLQkJU1IoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCQlTUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JCVNSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewogCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQkJU1IoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJU1IoQ1BSX0NPRUZfUihpKSk7CisJCQlTUihDUFJfQ09FRl9HKGkpKTsKKwkJCVNSKENQUl9DT0VGX0IoaSkpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fb3ZscygpOyBpKyspIHsKKwkJU1IoT1ZMX0JBMChpKSk7CisJCVNSKE9WTF9CQTEoaSkpOworCQlTUihPVkxfUE9TSVRJT04oaSkpOworCQlTUihPVkxfU0laRShpKSk7CisJCVNSKE9WTF9BVFRSSUJVVEVTKGkpKTsKKwkJU1IoT1ZMX0ZJRk9fVEhSRVNIT0xEKGkpKTsKKwkJU1IoT1ZMX1JPV19JTkMoaSkpOworCQlTUihPVkxfUElYRUxfSU5DKGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQkJU1IoT1ZMX1BSRUxPQUQoaSkpOworCQlpZiAoaSA9PSBPTUFQX0RTU19HRlgpIHsKKwkJCVNSKE9WTF9XSU5ET1dfU0tJUChpKSk7CisJCQlTUihPVkxfVEFCTEVfQkEoaSkpOworCQkJY29udGludWU7CisJCX0KKwkJU1IoT1ZMX0ZJUihpKSk7CisJCVNSKE9WTF9QSUNUVVJFX1NJWkUoaSkpOworCQlTUihPVkxfQUNDVTAoaSkpOworCQlTUihPVkxfQUNDVTEoaSkpOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlTUihPVkxfRklSX0NPRUZfSChpLCBqKSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCVNSKE9WTF9GSVJfQ09FRl9IVihpLCBqKSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCVNSKE9WTF9DT05WX0NPRUYoaSwgaikpOworCisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlTUihPVkxfRklSX0NPRUZfVihpLCBqKSk7CiAJCX0KIAotCQlTUihEQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKERBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgeworCQkJU1IoT1ZMX0JBMF9VVihpKSk7CisJCQlTUihPVkxfQkExX1VWKGkpKTsKKwkJCVNSKE9WTF9GSVIyKGkpKTsKKwkJCVNSKE9WTF9BQ0NVMl8wKGkpKTsKKwkJCVNSKE9WTF9BQ0NVMl8xKGkpKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlTUihPVkxfRklSX0NPRUZfSDIoaSwgaikpOworCisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoaSwgaikpOworCisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVNSKE9WTF9GSVJfQ09FRl9WMihpLCBqKSk7CisJCX0KKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKKwkJCVNSKE9WTF9BVFRSSUJVVEVTMihpKSk7CiAJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKLQotCS8qIFZJRDEgKi8KLQlTUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMSkpOwotCVNSKE9WTF9GSVIoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX1BJQ1RVUkVfU0laRShPTUFQX0RTU19WSURFTzEpKTsKLQlTUihPVkxfQUNDVTAoT01BUF9EU1NfVklERU8xKSk7Ci0JU1IoT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlTUihPVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQl9Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewotCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlTUihPVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlTUihPVkxfRklSMihPTUFQX0RTU19WSURFTzEpKTsKLQkJU1IoT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8xKSk7Ci0JCVNSKE9WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKLQkJU1IoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKLQotCS8qIFZJRDIgKi8KLQlTUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9CQTEoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9BVFRSSUJVVEVTKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfUk9XX0lOQyhPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCVNSKE9WTF9GSVIoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX1BJQ1RVUkVfU0laRShPTUFQX0RTU19WSURFTzIpKTsKLQlTUihPVkxfQUNDVTAoT01BUF9EU1NfVklERU8yKSk7Ci0JU1IoT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlTUihPVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQl9Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewotCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlTUihPVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlTUihPVkxfRklSMihPTUFQX0RTU19WSURFTzIpKTsKLQkJU1IoT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8yKSk7Ci0JCVNSKE9WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlTUihPVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVNSKE9WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQl9Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKLQkJU1IoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMikpOwotCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzIpKTsKLQogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DT1JFX0NMS19ESVYpKQogCQlTUihESVZJU09SKTsKIApAQCAtMzQ5LDcgKzI3Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKQogewotCWludCBpLCBjdHg7CisJaW50IGksIGosIGN0eDsKIAogCURTU0RCRygiZGlzcGNfcmVzdG9yZV9jb250ZXh0XG4iKTsKIApAQCAtMzY3LDE2NiArMjk0LDkwIEBACiAJLypSUihJUlFFTkFCTEUpOyovCiAJLypSUihDT05UUk9MKTsqLwogCVJSKENPTkZJRyk7Ci0JUlIoREVGQVVMVF9DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKERFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCVJSKFRSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwogCVJSKExJTkVfTlVNQkVSKTsKLQlSUihUSU1JTkdfSChPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKFRJTUlOR19WKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlSUihESVZJU09SbyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpIHx8CisJCQlkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GUkVFX1pPUkRFUikpCiAJCVJSKEdMT0JBTF9BTFBIQSk7Ci0JUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCVJSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewotCQlSUihERUZBVUxUX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihUUkFOU19DT0xPUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKFRJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKERJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpCiAJCVJSKENPTkZJRzIpOwotCX0KIAotCVJSKE9WTF9CQTAoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0JBMShPTUFQX0RTU19HRlgpKTsKLQlSUihPVkxfUE9TSVRJT04oT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX1NJWkUoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX0ZJRk9fVEhSRVNIT0xEKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9ST1dfSU5DKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9QSVhFTF9JTkMoT01BUF9EU1NfR0ZYKSk7Ci0JUlIoT1ZMX1dJTkRPV19TS0lQKE9NQVBfRFNTX0dGWCkpOwotCVJSKE9WTF9UQUJMRV9CQShPTUFQX0RTU19HRlgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9tZ3JzKCk7IGkrKykgeworCQlSUihERUZBVUxUX0NPTE9SKGkpKTsKKwkJUlIoVFJBTlNfQ09MT1IoaSkpOworCQlSUihTSVpFX01HUihpKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCQljb250aW51ZTsKKwkJUlIoVElNSU5HX0goaSkpOworCQlSUihUSU1JTkdfVihpKSk7CisJCVJSKFBPTF9GUkVRKGkpKTsKKwkJUlIoRElWSVNPUm8oaSkpOwogCi0KLQlSUihEQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7Ci0JCVJSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQkJUlIoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCQlSUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JfQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKLQkJUlIoREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJUlIoREFUQV9DWUNMRTEoaSkpOworCQlSUihEQVRBX0NZQ0xFMihpKSk7CisJCVJSKERBVEFfQ1lDTEUzKGkpKTsKIAogCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQkJUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCVJSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJUlIoQ1BSX0NPRUZfUihpKSk7CisJCQlSUihDUFJfQ09FRl9HKGkpKTsKKwkJCVJSKENQUl9DT0VGX0IoaSkpOwogCQl9CiAJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQotCQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7IGkrKykgeworCQlSUihPVkxfQkEwKGkpKTsKKwkJUlIoT1ZMX0JBMShpKSk7CisJCVJSKE9WTF9QT1NJVElPTihpKSk7CisJCVJSKE9WTF9TSVpFKGkpKTsKKwkJUlIoT1ZMX0FUVFJJQlVURVMoaSkpOworCQlSUihPVkxfRklGT19USFJFU0hPTEQoaSkpOworCQlSUihPVkxfUk9XX0lOQyhpKSk7CisJCVJSKE9WTF9QSVhFTF9JTkMoaSkpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCQlSUihPVkxfUFJFTE9BRChpKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0dGWCkgeworCQkJUlIoT1ZMX1dJTkRPV19TS0lQKGkpKTsKKwkJCVJSKE9WTF9UQUJMRV9CQShpKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlSUihPVkxfRklSKGkpKTsKKwkJUlIoT1ZMX1BJQ1RVUkVfU0laRShpKSk7CisJCVJSKE9WTF9BQ0NVMChpKSk7CisJCVJSKE9WTF9BQ0NVMShpKSk7CiAKLQkvKiBWSUQxICovCi0JUlIoT1ZMX0JBMChPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfQkExKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9QT1NJVElPTihPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfU0laRShPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfQVRUUklCVVRFUyhPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX1JPV19JTkMoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlSUihPVkxfRklSKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9QSUNUVVJFX1NJWkUoT01BUF9EU1NfVklERU8xKSk7Ci0JUlIoT1ZMX0FDQ1UwKE9NQVBfRFNTX1ZJREVPMSkpOwotCVJSKE9WTF9BQ0NVMShPTUFQX0RTU19WSURFTzEpKTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCVJSKE9WTF9GSVJfQ09FRl9IKGksIGopKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgaSkpOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWKGksIGopKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCVJSKE9WTF9DT05WX0NPRUYoaSwgaikpOwogCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJUlIoT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCVJSKE9WTF9GSVJfQ09FRl9WKGksIGopKTsKKwkJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlSUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKKwkJCVJSKE9WTF9CQTBfVVYoaSkpOworCQkJUlIoT1ZMX0JBMV9VVihpKSk7CisJCQlSUihPVkxfRklSMihpKSk7CisJCQlSUihPVkxfQUNDVTJfMChpKSk7CisJCQlSUihPVkxfQUNDVTJfMShpKSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQkJUlIoT1ZMX0ZJUl9DT0VGX0gyKGksIGopKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlSUihPVkxfRklSX0NPRUZfSFYyKGksIGopKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlSUihPVkxfRklSX0NPRUZfVjIoaSwgaikpOworCQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCisJCQlSUihPVkxfQVRUUklCVVRFUzIoaSkpOwogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8xKSk7Ci0JCVJSKE9WTF9CQTFfVVYoT01BUF9EU1NfVklERU8xKSk7Ci0JCVJSKE9WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlSUihPVkxfQUNDVTJfMChPTUFQX0RTU19WSURFTzEpKTsKLQkJUlIoT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8xKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8xKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCi0JCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwotCi0JLyogVklEMiAqLwotCVJSKE9WTF9CQTAoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0JBMShPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfUE9TSVRJT04oT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0ZJRk9fVEhSRVNIT0xEKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9ST1dfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9QSVhFTF9JTkMoT01BUF9EU1NfVklERU8yKSk7Ci0JUlIoT1ZMX0ZJUihPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfUElDVFVSRV9TSVpFKE9NQVBfRFNTX1ZJREVPMikpOwotCVJSKE9WTF9BQ0NVMChPTUFQX0RTU19WSURFTzIpKTsKLQlSUihPVkxfQUNDVTEoT01BUF9EU1NfVklERU8yKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlSUihPVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCVJSKE9WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCBpKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCX0KLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCVJSKE9WTF9CQTFfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCVJSKE9WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMikpOwotCQlSUihPVkxfQUNDVTJfMChPTUFQX0RTU19WSURFTzIpKTsKLQkJUlIoT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8yKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCVJSKE9WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIGkpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJUlIoT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8yKSk7Ci0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCi0JCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOwotCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NPUkVfQ0xLX0RJVikpCiAJCVJSKERJVklTT1IpOwogCkBAIC01NzAsMTMgKzQyMSwyOCBAQAogCVdBUk5fT04ociA8IDApOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgZGlzcGNfbWdyX2lzX2xjZChlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQoreworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8CisJCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CiAKLWJvb2wgZGlzcGNfZ29fYnVzeShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BjX21ncl9nZXRfZGV2aWNlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCit7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IgPQorCQlvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGNoYW5uZWwpOworCisJcmV0dXJuIG1nciA/IG1nci0+ZGV2aWNlIDogTlVMTDsKK30KKworYm9vbCBkaXNwY19tZ3JfZ29fYnVzeShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCWludCBiaXQ7CiAKLQlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCB8fAotCQkJY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJaWYgKGRpc3BjX21ncl9pc19sY2QoY2hhbm5lbCkpCiAJCWJpdCA9IDU7IC8qIEdPTENEICovCiAJZWxzZQogCQliaXQgPSA2OyAvKiBHT0RJR0lUICovCkBAIC01ODcsMTMgKzQ1MywxMiBAQAogCQlyZXR1cm4gUkVHX0dFVChESVNQQ19DT05UUk9MLCBiaXQsIGJpdCkgPT0gMTsKIH0KIAotdm9pZCBkaXNwY19nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordm9pZCBkaXNwY19tZ3JfZ28oZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgYml0OwogCWJvb2wgZW5hYmxlX2JpdCwgZ29fYml0OwogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKLQkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQliaXQgPSAwOyAvKiBMQ0RFTkFCTEUgKi8KIAllbHNlCiAJCWJpdCA9IDE7IC8qIERJR0lUQUxFTkFCTEUgKi8KQEAgLTYwNyw4ICs0NzIsNyBAQAogCWlmICghZW5hYmxlX2JpdCkKIAkJcmV0dXJuOwogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKLQkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQliaXQgPSA1OyAvKiBHT0xDRCAqLwogCWVsc2UKIAkJYml0ID0gNjsgLyogR09ESUdJVCAqLwpAQCAtNjMyLDQzICs0OTYsNDQgQEAKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgMSwgYml0LCBiaXQpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfd3JpdGVfZmlyaF9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaF9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCiB7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9GSVJfQ09FRl9IKHBsYW5lLCByZWcpLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJodl9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaHZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSFYocGxhbmUsIHJlZyksIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2ZpcnZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3dyaXRlX2ZpcnZfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfVihwbGFuZSwgcmVnKSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfd3JpdGVfZmlyaDJfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3dyaXRlX2ZpcmgyX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSDIocGxhbmUsIHJlZyksIHZhbHVlKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2Zpcmh2Ml9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlyaHYyX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsCisJCXUzMiB2YWx1ZSkKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKHBsYW5lLCByZWcpLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJ2Ml9yZWcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfd3JpdGVfZmlydjJfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQogewogCUJVR19PTihwbGFuZSA9PSBPTUFQX0RTU19HRlgpOwogCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9GSVJfQ09FRl9WMihwbGFuZSwgcmVnKSwgdmFsdWUpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3NjYWxlX2NvZWYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaHNjYWxldXAsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3NjYWxlX2NvZWYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaHNjYWxldXAsCiAJCQkJICBpbnQgdnNjYWxldXAsIGludCBmaXZlX3RhcHMsCiAJCQkJICBlbnVtIG9tYXBfY29sb3JfY29tcG9uZW50IGNvbG9yX2NvbXApCiB7CkBAIC03NjksMTEgKzYzNCwxMSBAQAogCQkJfCBGTERfVkFMKHZfY29lZltpXS52YzIsIDMxLCAyNCk7CiAKIAkJaWYgKGNvbG9yX2NvbXAgPT0gRElTUENfQ09MT1JfQ09NUE9ORU5UX1JHQl9ZKSB7Ci0JCQlfZGlzcGNfd3JpdGVfZmlyaF9yZWcocGxhbmUsIGksIGgpOwotCQkJX2Rpc3BjX3dyaXRlX2Zpcmh2X3JlZyhwbGFuZSwgaSwgaHYpOworCQkJZGlzcGNfb3ZsX3dyaXRlX2ZpcmhfcmVnKHBsYW5lLCBpLCBoKTsKKwkJCWRpc3BjX292bF93cml0ZV9maXJodl9yZWcocGxhbmUsIGksIGh2KTsKIAkJfSBlbHNlIHsKLQkJCV9kaXNwY193cml0ZV9maXJoMl9yZWcocGxhbmUsIGksIGgpOwotCQkJX2Rpc3BjX3dyaXRlX2Zpcmh2Ml9yZWcocGxhbmUsIGksIGh2KTsKKwkJCWRpc3BjX292bF93cml0ZV9maXJoMl9yZWcocGxhbmUsIGksIGgpOworCQkJZGlzcGNfb3ZsX3dyaXRlX2Zpcmh2Ml9yZWcocGxhbmUsIGksIGh2KTsKIAkJfQogCiAJfQpAQCAtNzg0LDE1ICs2NDksMTYgQEAKIAkJCXYgPSBGTERfVkFMKHZfY29lZltpXS52YzAwLCA3LCAwKQogCQkJCXwgRkxEX1ZBTCh2X2NvZWZbaV0udmMyMiwgMTUsIDgpOwogCQkJaWYgKGNvbG9yX2NvbXAgPT0gRElTUENfQ09MT1JfQ09NUE9ORU5UX1JHQl9ZKQotCQkJCV9kaXNwY193cml0ZV9maXJ2X3JlZyhwbGFuZSwgaSwgdik7CisJCQkJZGlzcGNfb3ZsX3dyaXRlX2ZpcnZfcmVnKHBsYW5lLCBpLCB2KTsKIAkJCWVsc2UKLQkJCQlfZGlzcGNfd3JpdGVfZmlydjJfcmVnKHBsYW5lLCBpLCB2KTsKKwkJCQlkaXNwY19vdmxfd3JpdGVfZmlydjJfcmVnKHBsYW5lLCBpLCB2KTsKIAkJfQogCX0KIH0KIAogc3RhdGljIHZvaWQgX2Rpc3BjX3NldHVwX2NvbG9yX2NvbnZfY29lZih2b2lkKQogeworCWludCBpOwogCWNvbnN0IHN0cnVjdCBjb2xvcl9jb252X2NvZWYgewogCQlpbnQgIHJ5LCAgcmNyLCAgcmNiLCAgIGd5LCAgZ2NyLCAgZ2NiLCAgIGJ5LCAgYmNyLCAgYmNiOwogCQlpbnQgIGZ1bGxfcmFuZ2U7CkBAIC04MDYsNjUgKzY3Miw1NCBAQAogCiAJY3QgPSAmY3RibF9idDYwMV81OwogCi0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAwKSwKLQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDEpLAotCQlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDIpLAotCQlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDMpLAotCQlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgNCksCi0JCUNWQUwoMCwgY3QtPmJjYikpOworCWZvciAoaSA9IDE7IGkgPCBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsgaSsrKSB7CisJCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKGksIDApLAorCQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMSksCisJCQlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMiksCisJCQlDVkFMKGN0LT5nY2IsIGN0LT5nY3IpKTsKKwkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoaSwgMyksCisJCQlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihpLCA0KSwKKwkJCUNWQUwoMCwgY3QtPmJjYikpOwogCi0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCAwKSwKLQkJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDEpLAotCQlDVkFMKGN0LT5neSwgY3QtPnJjYikpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMiksCi0JCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMyksCi0JCUNWQUwoY3QtPmJjciwgY3QtPmJ5KSk7Ci0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCA0KSwKLQkJQ1ZBTCgwLCBjdC0+YmNiKSk7CisJCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKGkpLCBjdC0+ZnVsbF9yYW5nZSwKKwkJCTExLCAxMSk7CisJfQogCiAjdW5kZWYgQ1ZBTAotCi0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8xKSwKLQkJY3QtPmZ1bGxfcmFuZ2UsIDExLCAxMSk7Ci0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8yKSwKLQkJY3QtPmZ1bGxfcmFuZ2UsIDExLCAxMSk7CiB9CiAKIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMChwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMShwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTBfdXYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMF91dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMF9VVihwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9iYTFfdXYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2JhMV91dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcikKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0JBMV9VVihwbGFuZSksIHBhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wbGFuZV9wb3MoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgeCwgaW50IHkpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3BvcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCB4LCBpbnQgeSkKIHsKIAl1MzIgdmFsID0gRkxEX1ZBTCh5LCAyNiwgMTYpIHwgRkxEX1ZBTCh4LCAxMCwgMCk7CiAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BPU0lUSU9OKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9waWNfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcGljX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAJdTMyIHZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7CiAKQEAgLTg3NCw3ICs3MjksNyBAQAogCQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BJQ1RVUkVfU0laRShwbGFuZSksIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfdmlkX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3ZpZF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogCXUzMiB2YWw7CiAKQEAgLTg4NSw0NCArNzQwLDYxIEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9TSVpFKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wcmVfbXVsdF9hbHBoYShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF96b3JkZXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCB6b3JkZXIpCiB7Ci0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVfTVVMVF9BTFBIQSkpCisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKLQkJcGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQorCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgem9yZGVyLCAyNywgMjYpOworfQorCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfZW5hYmxlX3pvcmRlcl9wbGFuZXModm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7IGkrKykKKwkJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMoaSksIDEsIDI1LCAyNSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcHJlX211bHRfYWxwaGEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShwbGFuZSk7CisKKwlpZiAoKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEpID09IDApCiAJCXJldHVybjsKIAogCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgZW5hYmxlID8gMSA6IDAsIDI4LCAyOCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCBnbG9iYWxfYWxwaGEpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0dXBfZ2xvYmFsX2FscGhhKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTggZ2xvYmFsX2FscGhhKQogewotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hpZnRzW10gPSB7IDAsIDgsIDE2LCAyNCwgfTsKKwlpbnQgc2hpZnQ7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSkgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKLQkJcGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQotCQlyZXR1cm47Ci0KLQlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKQotCQlSRUdfRkxEX01PRChESVNQQ19HTE9CQUxfQUxQSEEsIGdsb2JhbF9hbHBoYSwgNywgMCk7Ci0JZWxzZSBpZiAocGxhbmUgPT0gT01BUF9EU1NfVklERU8yKQotCQlSRUdfRkxEX01PRChESVNQQ19HTE9CQUxfQUxQSEEsIGdsb2JhbF9hbHBoYSwgMjMsIDE2KTsKKwlzaGlmdCA9IHNoaWZ0c1twbGFuZV07CisJUkVHX0ZMRF9NT0QoRElTUENfR0xPQkFMX0FMUEhBLCBnbG9iYWxfYWxwaGEsIHNoaWZ0ICsgNywgc2hpZnQpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3BpeF9pbmMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBzMzIgaW5jKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9waXhfaW5jKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgczMyIGluYykKIHsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX1BJWEVMX0lOQyhwbGFuZSksIGluYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfcm93X2luYyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHMzMiBpbmMpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3Jvd19pbmMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBzMzIgaW5jKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfUk9XX0lOQyhwbGFuZSksIGluYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfY29sb3JfbW9kZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2NvbG9yX21vZGUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQogewogCXUzMiBtID0gMDsKQEAgLTEwMDMsNyArODc1LDcgQEAKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIG0sIDQsIDEpOwogfQogCi12b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2NoYW5uZWxfb3V0KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgc2hpZnQ7CkBAIC0xMDE2LDYgKzg4OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgT01BUF9EU1NfVklERU8xOgogCWNhc2UgT01BUF9EU1NfVklERU8yOgorCWNhc2UgT01BUF9EU1NfVklERU8zOgogCQlzaGlmdCA9IDE2OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTA1MCwyNCArOTIzLDEzIEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzcGNfc2V0X2J1cnN0X3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2J1cnN0X3NpemUgYnVyc3Rfc2l6ZSkKIHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hpZnRzW10gPSB7IDYsIDE0LCAxNCwgMTQsIH07CiAJaW50IHNoaWZ0OwogCi0Jc3dpdGNoIChwbGFuZSkgewotCWNhc2UgT01BUF9EU1NfR0ZYOgotCQlzaGlmdCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9EU1NfVklERU8xOgotCWNhc2UgT01BUF9EU1NfVklERU8yOgotCQlzaGlmdCA9IDE0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuOwotCX0KLQorCXNoaWZ0ID0gc2hpZnRzW3BsYW5lXTsKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIGJ1cnN0X3NpemUsIHNoaWZ0ICsgMSwgc2hpZnQpOwogfQogCkBAIC0xMDc4LDEwICs5NDAsMTAgQEAKIAogCS8qIENvbmZpZ3VyZSBidXJzdCBzaXplIGFsd2F5cyB0byBtYXhpbXVtIHNpemUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpCi0JCWRpc3BjX3NldF9idXJzdF9zaXplKGksIGJ1cnN0X3NpemUpOworCQlkaXNwY19vdmxfc2V0X2J1cnN0X3NpemUoaSwgYnVyc3Rfc2l6ZSk7CiB9CiAKLXUzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCit1MzIgZGlzcGNfb3ZsX2dldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSkKIHsKIAl1bnNpZ25lZCB1bml0ID0gZHNzX2ZlYXRfZ2V0X2J1cnN0X3NpemVfdW5pdCgpOwogCS8qIGJ1cnN0IG11bHRpcGxpZXIgaXMgYWx3YXlzIHg4IChzZWUgZGlzcGNfY29uZmlndXJlX2J1cnN0X3NpemVzKCkpICovCkBAIC0xMTAyLDcgKzk2NCw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDksIDkpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9jcHIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewogCXUxNiByZWc7CiAKQEAgLTExMTYsMTIgKzk3OCwxMiBAQAogCVJFR19GTERfTU9EKHJlZywgZW5hYmxlLCAxNSwgMTUpOwogfQogCi12b2lkIGRpc3BjX3NldF9jcHJfY29lZihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAordm9pZCBkaXNwY19tZ3Jfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCiAJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKQogewogCXUzMiBjb2VmX3IsIGNvZWZfZywgY29lZl9iOwogCi0JaWYgKGNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgJiYgY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJaWYgKCFkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKQogCQlyZXR1cm47CiAKIAljb2VmX3IgPSBGTERfVkFMKGNvZWZzLT5yciwgMzEsIDIyKSB8IEZMRF9WQUwoY29lZnMtPnJnLCAyMCwgMTEpIHwKQEAgLTExMzYsNyArOTk4LDcgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfQ1BSX0NPRUZfQihjaGFubmVsKSwgY29lZl9iKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfY29sb3JfY29udihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfY29sb3JfY29udihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewogCXUzMiB2YWw7CiAKQEAgLTExNDcsMTkgKzEwMDksMTYgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCB2YWwpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX2VuYWJsZV9yZXBsaWNhdGlvbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewotCWludCBiaXQ7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNoaWZ0c1tdID0geyA1LCAxMCwgMTAsIDEwIH07CisJaW50IHNoaWZ0OwogCi0JaWYgKHBsYW5lID09IE9NQVBfRFNTX0dGWCkKLQkJYml0ID0gNTsKLQllbHNlCi0JCWJpdCA9IDEwOwotCi0JUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUsIGJpdCwgYml0KTsKKwlzaGlmdCA9IHNoaWZ0c1twbGFuZV07CisJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUsIHNoaWZ0LCBzaGlmdCk7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2xjZF9zaXplKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCkKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCiB7CiAJdTMyIHZhbDsKIAlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CkBAIC0xMTg2LDE5ICsxMDQ1LDIwIEBACiAKIAlkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKEZFQVRfUkVHX0ZJRk9TSVpFLCAmc3RhcnQsICZlbmQpOwogCi0JZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgQVJSQVlfU0laRShkaXNwYy5maWZvX3NpemUpOyArK3BsYW5lKSB7CisJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7ICsrcGxhbmUpIHsKIAkJc2l6ZSA9IFJFR19HRVQoRElTUENfT1ZMX0ZJRk9fU0laRV9TVEFUVVMocGxhbmUpLCBzdGFydCwgZW5kKTsKIAkJc2l6ZSAqPSB1bml0OwogCQlkaXNwYy5maWZvX3NpemVbcGxhbmVdID0gc2l6ZTsKIAl9CiB9CiAKLXUzMiBkaXNwY19nZXRfcGxhbmVfZmlmb19zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSkKK3UzMiBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCiB7CiAJcmV0dXJuIGRpc3BjLmZpZm9fc2l6ZVtwbGFuZV07CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywKKwkJdTMyIGhpZ2gpCiB7CiAJdTggaGlfc3RhcnQsIGhpX2VuZCwgbG9fc3RhcnQsIGxvX2VuZDsKIAl1MzIgdW5pdDsKQEAgLTEyMzMsNyArMTA5Myw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUgPyAxIDogMCwgMTQsIDE0KTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQkJCWludCBoaW5jLCBpbnQgdmluYywKIAkJCQllbnVtIG9tYXBfY29sb3JfY29tcG9uZW50IGNvbG9yX2NvbXApCiB7CkBAIC0xMjU2LDcgKzExMTYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfdmlkX2FjY3UwKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IGhhY2N1LCBpbnQgdmFjY3UpCiB7CiAJdTMyIHZhbDsKIAl1OCBob3Jfc3RhcnQsIGhvcl9lbmQsIHZlcnRfc3RhcnQsIHZlcnRfZW5kOwpAQCAtMTI3MCw3ICsxMTMwLDcgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FDQ1UwKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTEoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBpbnQgaGFjY3UsIGludCB2YWNjdSkKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfdmlkX2FjY3UxKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IGhhY2N1LCBpbnQgdmFjY3UpCiB7CiAJdTMyIHZhbDsKIAl1OCBob3Jfc3RhcnQsIGhvcl9lbmQsIHZlcnRfc3RhcnQsIHZlcnRfZW5kOwpAQCAtMTI4NCw3ICsxMTQ0LDggQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FDQ1UxKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTJfMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwgaW50IHZhY2N1KQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfYWNjdTJfMChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwKKwkJaW50IHZhY2N1KQogewogCXUzMiB2YWw7CiAKQEAgLTEyOTIsNyArMTE1Myw4IEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BQ0NVMl8wKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF92aWRfYWNjdTJfMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwgaW50IHZhY2N1KQorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF92aWRfYWNjdTJfMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCBoYWNjdSwKKwkJaW50IHZhY2N1KQogewogCXUzMiB2YWw7CiAKQEAgLTEzMDAsNyArMTE2Miw3IEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9BQ0NVMl8xKHBsYW5lKSwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsZV9wYXJhbShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCitzdGF0aWMgdm9pZCBkaXNwY19vdmxfc2V0X3NjYWxlX3BhcmFtKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJdTE2IG9yaWdfd2lkdGgsIHUxNiBvcmlnX2hlaWdodCwKIAkJdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQsCiAJCWJvb2wgZml2ZV90YXBzLCB1OCByb3RhdGlvbiwKQEAgLTEzMTIsMTUgKzExNzQsMTYgQEAKIAloc2NhbGV1cCA9IG9yaWdfd2lkdGggPD0gb3V0X3dpZHRoOwogCXZzY2FsZXVwID0gb3JpZ19oZWlnaHQgPD0gb3V0X2hlaWdodDsKIAotCV9kaXNwY19zZXRfc2NhbGVfY29lZihwbGFuZSwgaHNjYWxldXAsIHZzY2FsZXVwLCBmaXZlX3RhcHMsIGNvbG9yX2NvbXApOworCWRpc3BjX292bF9zZXRfc2NhbGVfY29lZihwbGFuZSwgaHNjYWxldXAsIHZzY2FsZXVwLCBmaXZlX3RhcHMsCisJCQljb2xvcl9jb21wKTsKIAogCWZpcl9oaW5jID0gMTAyNCAqIG9yaWdfd2lkdGggLyBvdXRfd2lkdGg7CiAJZmlyX3ZpbmMgPSAxMDI0ICogb3JpZ19oZWlnaHQgLyBvdXRfaGVpZ2h0OwogCi0JX2Rpc3BjX3NldF9maXIocGxhbmUsIGZpcl9oaW5jLCBmaXJfdmluYywgY29sb3JfY29tcCk7CisJZGlzcGNfb3ZsX3NldF9maXIocGxhbmUsIGZpcl9oaW5jLCBmaXJfdmluYywgY29sb3JfY29tcCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfc2NhbGluZ19jb21tb24oZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfb3ZsX3NldF9zY2FsaW5nX2NvbW1vbihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTEzMzEsNyArMTE5NCw3IEBACiAJaW50IGFjY3UxID0gMDsKIAl1MzIgbDsKIAotCV9kaXNwY19zZXRfc2NhbGVfcGFyYW0ocGxhbmUsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAorCWRpc3BjX292bF9zZXRfc2NhbGVfcGFyYW0ocGxhbmUsIG9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgZml2ZV90YXBzLAogCQkJCXJvdGF0aW9uLCBESVNQQ19DT0xPUl9DT01QT05FTlRfUkdCX1kpOwogCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSkpOwpAQCAtMTM3MCwxMSArMTIzMywxMSBAQAogCQl9CiAJfQogCi0JX2Rpc3BjX3NldF92aWRfYWNjdTAocGxhbmUsIDAsIGFjY3UwKTsKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1MShwbGFuZSwgMCwgYWNjdTEpOworCWRpc3BjX292bF9zZXRfdmlkX2FjY3UwKHBsYW5lLCAwLCBhY2N1MCk7CisJZGlzcGNfb3ZsX3NldF92aWRfYWNjdTEocGxhbmUsIDAsIGFjY3UxKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsaW5nX3V2KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfc2NhbGluZ191dihlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTE0MjIsNyArMTI4NSw3IEBACiAJaWYgKG91dF9oZWlnaHQgIT0gb3JpZ19oZWlnaHQpCiAJCXNjYWxlX3kgPSB0cnVlOwogCi0JX2Rpc3BjX3NldF9zY2FsZV9wYXJhbShwbGFuZSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCisJZGlzcGNfb3ZsX3NldF9zY2FsZV9wYXJhbShwbGFuZSwgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQsCiAJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGZpdmVfdGFwcywKIAkJCQlyb3RhdGlvbiwgRElTUENfQ09MT1JfQ09NUE9ORU5UX1VWKTsKIApAQCAtMTQzMywxMSArMTI5NiwxMSBAQAogCS8qIHNldCBWIHNjYWxpbmcgKi8KIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIHNjYWxlX3kgPyAxIDogMCwgNiwgNik7CiAKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1Ml8wKHBsYW5lLCAweDgwLCAwKTsKLQlfZGlzcGNfc2V0X3ZpZF9hY2N1Ml8xKHBsYW5lLCAweDgwLCAwKTsKKwlkaXNwY19vdmxfc2V0X3ZpZF9hY2N1Ml8wKHBsYW5lLCAweDgwLCAwKTsKKwlkaXNwY19vdmxfc2V0X3ZpZF9hY2N1Ml8xKHBsYW5lLCAweDgwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9zY2FsaW5nKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfc2NhbGluZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUxNiBvcmlnX3dpZHRoLCB1MTYgb3JpZ19oZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAogCQlib29sIGlsYWNlLCBib29sIGZpdmVfdGFwcywKQEAgLTE0NDYsMTQgKzEzMDksMTQgQEAKIHsKIAlCVUdfT04ocGxhbmUgPT0gT01BUF9EU1NfR0ZYKTsKIAotCV9kaXNwY19zZXRfc2NhbGluZ19jb21tb24ocGxhbmUsCisJZGlzcGNfb3ZsX3NldF9zY2FsaW5nX2NvbW1vbihwbGFuZSwKIAkJCW9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAogCQkJaWxhY2UsIGZpdmVfdGFwcywKIAkJCWZpZWxkbW9kZSwgY29sb3JfbW9kZSwKIAkJCXJvdGF0aW9uKTsKIAotCV9kaXNwY19zZXRfc2NhbGluZ191dihwbGFuZSwKKwlkaXNwY19vdmxfc2V0X3NjYWxpbmdfdXYocGxhbmUsCiAJCW9yaWdfd2lkdGgsIG9yaWdfaGVpZ2h0LAogCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsCiAJCWlsYWNlLCBmaXZlX3RhcHMsCkBAIC0xNDYxLDcgKzEzMjQsNyBAQAogCQlyb3RhdGlvbik7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfcm90YXRpb25fYXR0cnMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCByb3RhdGlvbiwKK3N0YXRpYyB2b2lkIGRpc3BjX292bF9zZXRfcm90YXRpb25fYXR0cnMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1OCByb3RhdGlvbiwKIAkJYm9vbCBtaXJyb3JpbmcsIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCiB7CiAJYm9vbCByb3dfcmVwZWF0ID0gZmFsc2U7CkBAIC0xNzg5LDEyICsxNjUyLDExIEBACiAJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpCiB7CiAJdTMyIGZjbGsgPSAwOwotCS8qIEZJWE1FIHZlbmMgcGNsaz8gKi8KLQl1NjQgdG1wLCBwY2xrID0gZGlzcGNfcGNsa19yYXRlKGNoYW5uZWwpOworCXU2NCB0bXAsIHBjbGsgPSBkaXNwY19tZ3JfcGNsa19yYXRlKGNoYW5uZWwpOwogCiAJaWYgKGhlaWdodCA+IG91dF9oZWlnaHQpIHsKLQkJLyogRklYTUUgZ2V0IHJlYWwgZGlzcGxheSBQUEwgKi8KLQkJdW5zaWduZWQgaW50IHBwbCA9IDgwMDsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gZGlzcGNfbWdyX2dldF9kZXZpY2UoY2hhbm5lbCk7CisJCXVuc2lnbmVkIGludCBwcGwgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3MueF9yZXM7CiAKIAkJdG1wID0gcGNsayAqIGhlaWdodCAqIG91dF93aWR0aDsKIAkJZG9fZGl2KHRtcCwgMiAqIG91dF9oZWlnaHQgKiBwcGwpOwpAQCAtMTg0NiwxMTQgKzE3MDgsMTIwIEBACiAJZWxzZQogCQl2ZiA9IDE7CiAKLQkvKiBGSVhNRSB2ZW5jIHBjbGs/ICovCi0JcmV0dXJuIGRpc3BjX3BjbGtfcmF0ZShjaGFubmVsKSAqIHZmICogaGY7CisJcmV0dXJuIGRpc3BjX21ncl9wY2xrX3JhdGUoY2hhbm5lbCkgKiB2ZiAqIGhmOwogfQogCi1pbnQgZGlzcGNfc2V0dXBfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQl1MzIgcGFkZHIsIHUxNiBzY3JlZW5fd2lkdGgsCi0JCXUxNiBwb3NfeCwgdTE2IHBvc195LAotCQl1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCitzdGF0aWMgaW50IGRpc3BjX292bF9jYWxjX3NjYWxpbmcoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCiAJCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAotCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlLAotCQlib29sIGlsYWNlLAotCQllbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZSwKLQkJdTggcm90YXRpb24sIGJvb2wgbWlycm9yLAotCQl1OCBnbG9iYWxfYWxwaGEsIHU4IHByZV9tdWx0X2FscGhhLAotCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MzIgcHV2X2FkZHIpCisJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUsIGJvb2wgKmZpdmVfdGFwcykKIHsKLQljb25zdCBpbnQgbWF4ZG93bnNjYWxlID0gY3B1X2lzX29tYXAzNHh4KCkgPyA0IDogMjsKLQlib29sIGZpdmVfdGFwcyA9IDA7CisJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkocGxhbmUpOworCWNvbnN0IGludCBtYXhkb3duc2NhbGUgPSBkc3NfZmVhdF9nZXRfcGFyYW1fbWF4KEZFQVRfUEFSQU1fRE9XTlNDQUxFKTsKKwl1bnNpZ25lZCBsb25nIGZjbGsgPSAwOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFKSA9PSAwKSB7CisJCWlmICh3aWR0aCAhPSBvdXRfd2lkdGggfHwgaGVpZ2h0ICE9IG91dF9oZWlnaHQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKG91dF93aWR0aCA8IHdpZHRoIC8gbWF4ZG93bnNjYWxlIHx8CisJCQlvdXRfd2lkdGggPiB3aWR0aCAqIDgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG91dF9oZWlnaHQgPCBoZWlnaHQgLyBtYXhkb3duc2NhbGUgfHwKKwkJCW91dF9oZWlnaHQgPiBoZWlnaHQgKiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE11c3QgdXNlIDUtdGFwIGZpbHRlcj8gKi8KKwkqZml2ZV90YXBzID0gaGVpZ2h0ID4gb3V0X2hlaWdodCAqIDI7CisKKwlpZiAoISpmaXZlX3RhcHMpIHsKKwkJZmNsayA9IGNhbGNfZmNsayhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LCBvdXRfd2lkdGgsCisJCQkJb3V0X2hlaWdodCk7CisKKwkJLyogVHJ5IDUtdGFwIGZpbHRlciBpZiAzLXRhcCBmY2xrIGlzIHRvbyBoaWdoICovCisJCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBoZWlnaHQgPiBvdXRfaGVpZ2h0ICYmCisJCQkJZmNsayA+IGRpc3BjX2ZjbGtfcmF0ZSgpKQorCQkJKmZpdmVfdGFwcyA9IHRydWU7CisJfQorCisJaWYgKHdpZHRoID4gKDIwNDggPj4gKmZpdmVfdGFwcykpIHsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gc2V0IHVwIHNjYWxpbmcsIGZjbGsgdG9vIGxvd1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqZml2ZV90YXBzKQorCQlmY2xrID0gY2FsY19mY2xrX2ZpdmVfdGFwcyhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LAorCQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCwgY29sb3JfbW9kZSk7CisKKwlEU1NEQkcoInJlcXVpcmVkIGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZmNsayk7CisJRFNTREJHKCJjdXJyZW50IGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZGlzcGNfZmNsa19yYXRlKCkpOworCisJaWYgKCFmY2xrIHx8IGZjbGsgPiBkaXNwY19mY2xrX3JhdGUoKSkgeworCQlEU1NFUlIoImZhaWxlZCB0byBzZXQgdXAgc2NhbGluZywgIgorCQkJInJlcXVpcmVkIGZjbGsgcmF0ZSA9ICVsdSBIeiwgIgorCQkJImN1cnJlbnQgZmNsayByYXRlID0gJWx1IEh6XG4iLAorCQkJZmNsaywgZGlzcGNfZmNsa19yYXRlKCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRpc3BjX292bF9zZXR1cChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2ksCisJCWJvb2wgaWxhY2UsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgcmVwbGljYXRpb24sCisJCXUzMiBmaWZvX2xvdywgdTMyIGZpZm9faGlnaCkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShwbGFuZSk7CisJYm9vbCBmaXZlX3RhcHMgPSBmYWxzZTsKIAlib29sIGZpZWxkbW9kZSA9IDA7Ci0JaW50IGNjb252ID0gMDsKKwlpbnQgciwgY2NvbnYgPSAwOwogCXVuc2lnbmVkIG9mZnNldDAsIG9mZnNldDE7CiAJczMyIHJvd19pbmM7CiAJczMyIHBpeF9pbmM7Ci0JdTE2IGZyYW1lX2hlaWdodCA9IGhlaWdodDsKKwl1MTYgZnJhbWVfaGVpZ2h0ID0gb2ktPmhlaWdodDsKIAl1bnNpZ25lZCBpbnQgZmllbGRfb2Zmc2V0ID0gMDsKIAotCURTU0RCRygiZGlzcGNfc2V0dXBfcGxhbmUgJWQsIHBhICV4LCBzdyAlZCwgJWQsJWQsICVkeCVkIC0+ICIKLQkgICAgICAgIiVkeCVkLCBpbGFjZSAlZCwgY21vZGUgJXgsIHJvdCAlZCwgbWlyICVkIGNoYW4gJWRcbiIsCi0JICAgICAgIHBsYW5lLCBwYWRkciwgc2NyZWVuX3dpZHRoLCBwb3NfeCwgcG9zX3ksCi0JICAgICAgIHdpZHRoLCBoZWlnaHQsCi0JICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwKLQkgICAgICAgaWxhY2UsIGNvbG9yX21vZGUsCi0JICAgICAgIHJvdGF0aW9uLCBtaXJyb3IsIGNoYW5uZWwpOworCURTU0RCRygiZGlzcGNfb3ZsX3NldHVwICVkLCBwYSAleCwgcGFfdXYgJXgsIHN3ICVkLCAlZCwlZCwgJWR4JWQgLT4gIgorCQkiJWR4JWQsIGNtb2RlICV4LCByb3QgJWQsIG1pciAlZCwgaWxhY2UgJWQgY2hhbiAlZCByZXBsICVkICIKKwkJImZpZm9fbG93ICVkIGZpZm8gaGlnaCAlZFxuIiwgcGxhbmUsIG9pLT5wYWRkciwgb2ktPnBfdXZfYWRkciwKKwkJb2ktPnNjcmVlbl93aWR0aCwgb2ktPnBvc194LCBvaS0+cG9zX3ksIG9pLT53aWR0aCwgb2ktPmhlaWdodCwKKwkJb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQsIG9pLT5jb2xvcl9tb2RlLCBvaS0+cm90YXRpb24sCisJCW9pLT5taXJyb3IsIGlsYWNlLCBjaGFubmVsLCByZXBsaWNhdGlvbiwgZmlmb19sb3csIGZpZm9faGlnaCk7CiAKLQlpZiAocGFkZHIgPT0gMCkKKwlpZiAob2ktPnBhZGRyID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGlsYWNlICYmIGhlaWdodCA9PSBvdXRfaGVpZ2h0KQorCWlmIChpbGFjZSAmJiBvaS0+aGVpZ2h0ID09IG9pLT5vdXRfaGVpZ2h0KQogCQlmaWVsZG1vZGUgPSAxOwogCiAJaWYgKGlsYWNlKSB7CiAJCWlmIChmaWVsZG1vZGUpCi0JCQloZWlnaHQgLz0gMjsKLQkJcG9zX3kgLz0gMjsKLQkJb3V0X2hlaWdodCAvPSAyOworCQkJb2ktPmhlaWdodCAvPSAyOworCQlvaS0+cG9zX3kgLz0gMjsKKwkJb2ktPm91dF9oZWlnaHQgLz0gMjsKIAogCQlEU1NEQkcoImFkanVzdGluZyBmb3IgaWxhY2U6IGhlaWdodCAlZCwgcG9zX3kgJWQsICIKIAkJCQkib3V0X2hlaWdodCAlZFxuIiwKLQkJCQloZWlnaHQsIHBvc195LCBvdXRfaGVpZ2h0KTsKKwkJCQlvaS0+aGVpZ2h0LCBvaS0+cG9zX3ksIG9pLT5vdXRfaGVpZ2h0KTsKIAl9CiAKLQlpZiAoIWRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKHBsYW5lLCBjb2xvcl9tb2RlKSkKKwlpZiAoIWRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKHBsYW5lLCBvaS0+Y29sb3JfbW9kZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBsYW5lID09IE9NQVBfRFNTX0dGWCkgewotCQlpZiAod2lkdGggIT0gb3V0X3dpZHRoIHx8IGhlaWdodCAhPSBvdXRfaGVpZ2h0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJLyogdmlkZW8gcGxhbmUgKi8KKwlyID0gZGlzcGNfb3ZsX2NhbGNfc2NhbGluZyhwbGFuZSwgY2hhbm5lbCwgb2ktPndpZHRoLCBvaS0+aGVpZ2h0LAorCQkJb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQsIG9pLT5jb2xvcl9tb2RlLAorCQkJJmZpdmVfdGFwcyk7CisJaWYgKHIpCisJCXJldHVybiByOwogCi0JCXVuc2lnbmVkIGxvbmcgZmNsayA9IDA7Ci0KLQkJaWYgKG91dF93aWR0aCA8IHdpZHRoIC8gbWF4ZG93bnNjYWxlIHx8Ci0JCSAgIG91dF93aWR0aCA+IHdpZHRoICogOCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChvdXRfaGVpZ2h0IDwgaGVpZ2h0IC8gbWF4ZG93bnNjYWxlIHx8Ci0JCSAgIG91dF9oZWlnaHQgPiBoZWlnaHQgKiA4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAotCQkJY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZIHx8Ci0JCQljb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX05WMTIpCi0JCQljY29udiA9IDE7Ci0KLQkJLyogTXVzdCB1c2UgNS10YXAgZmlsdGVyPyAqLwotCQlmaXZlX3RhcHMgPSBoZWlnaHQgPiBvdXRfaGVpZ2h0ICogMjsKLQotCQlpZiAoIWZpdmVfdGFwcykgewotCQkJZmNsayA9IGNhbGNfZmNsayhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LCBvdXRfd2lkdGgsCi0JCQkJCW91dF9oZWlnaHQpOwotCi0JCQkvKiBUcnkgNS10YXAgZmlsdGVyIGlmIDMtdGFwIGZjbGsgaXMgdG9vIGhpZ2ggKi8KLQkJCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBoZWlnaHQgPiBvdXRfaGVpZ2h0ICYmCi0JCQkJCWZjbGsgPiBkaXNwY19mY2xrX3JhdGUoKSkKLQkJCQlmaXZlX3RhcHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKHdpZHRoID4gKDIwNDggPj4gZml2ZV90YXBzKSkgewotCQkJRFNTRVJSKCJmYWlsZWQgdG8gc2V0IHVwIHNjYWxpbmcsIGZjbGsgdG9vIGxvd1xuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChmaXZlX3RhcHMpCi0JCQlmY2xrID0gY2FsY19mY2xrX2ZpdmVfdGFwcyhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LAotCQkJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGNvbG9yX21vZGUpOwotCi0JCURTU0RCRygicmVxdWlyZWQgZmNsayByYXRlID0gJWx1IEh6XG4iLCBmY2xrKTsKLQkJRFNTREJHKCJjdXJyZW50IGZjbGsgcmF0ZSA9ICVsdSBIelxuIiwgZGlzcGNfZmNsa19yYXRlKCkpOwotCi0JCWlmICghZmNsayB8fCBmY2xrID4gZGlzcGNfZmNsa19yYXRlKCkpIHsKLQkJCURTU0VSUigiZmFpbGVkIHRvIHNldCB1cCBzY2FsaW5nLCAiCi0JCQkJCSJyZXF1aXJlZCBmY2xrIHJhdGUgPSAlbHUgSHosICIKLQkJCQkJImN1cnJlbnQgZmNsayByYXRlID0gJWx1IEh6XG4iLAotCQkJCQlmY2xrLCBkaXNwY19mY2xrX3JhdGUoKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KKwlpZiAob2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAorCQkJb2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfVVlWWSB8fAorCQkJb2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfTlYxMikKKwkJY2NvbnYgPSAxOwogCiAJaWYgKGlsYWNlICYmICFmaWVsZG1vZGUpIHsKIAkJLyoKQEAgLTE5NjMsNjkgKzE4MzEsNzYgQEAKIAkJICogc28gdGhlIGludGVnZXIgcGFydCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCiAJCSAqIGJvdHRvbSBmaWVsZC4KIAkJICovCi0JCWlmICghaGVpZ2h0IHx8IGhlaWdodCA9PSBvdXRfaGVpZ2h0KQorCQlpZiAoIW9pLT5oZWlnaHQgfHwgb2ktPmhlaWdodCA9PSBvaS0+b3V0X2hlaWdodCkKIAkJCWZpZWxkX29mZnNldCA9IDA7CiAJCWVsc2UKLQkJCWZpZWxkX29mZnNldCA9IGhlaWdodCAvIG91dF9oZWlnaHQgLyAyOworCQkJZmllbGRfb2Zmc2V0ID0gb2ktPmhlaWdodCAvIG9pLT5vdXRfaGVpZ2h0IC8gMjsKIAl9CiAKIAkvKiBGaWVsZHMgYXJlIGluZGVwZW5kZW50IGJ1dCBpbnRlcmxlYXZlZCBpbiBtZW1vcnkuICovCiAJaWYgKGZpZWxkbW9kZSkKIAkJZmllbGRfb2Zmc2V0ID0gMTsKIAotCWlmIChyb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9ETUEpCi0JCWNhbGNfZG1hX3JvdGF0aW9uX29mZnNldChyb3RhdGlvbiwgbWlycm9yLAotCQkJCXNjcmVlbl93aWR0aCwgd2lkdGgsIGZyYW1lX2hlaWdodCwgY29sb3JfbW9kZSwKLQkJCQlmaWVsZG1vZGUsIGZpZWxkX29mZnNldCwKKwlpZiAob2ktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX0RNQSkKKwkJY2FsY19kbWFfcm90YXRpb25fb2Zmc2V0KG9pLT5yb3RhdGlvbiwgb2ktPm1pcnJvciwKKwkJCQlvaS0+c2NyZWVuX3dpZHRoLCBvaS0+d2lkdGgsIGZyYW1lX2hlaWdodCwKKwkJCQlvaS0+Y29sb3JfbW9kZSwgZmllbGRtb2RlLCBmaWVsZF9vZmZzZXQsCiAJCQkJJm9mZnNldDAsICZvZmZzZXQxLCAmcm93X2luYywgJnBpeF9pbmMpOwogCWVsc2UKLQkJY2FsY192cmZiX3JvdGF0aW9uX29mZnNldChyb3RhdGlvbiwgbWlycm9yLAotCQkJCXNjcmVlbl93aWR0aCwgd2lkdGgsIGZyYW1lX2hlaWdodCwgY29sb3JfbW9kZSwKLQkJCQlmaWVsZG1vZGUsIGZpZWxkX29mZnNldCwKKwkJY2FsY192cmZiX3JvdGF0aW9uX29mZnNldChvaS0+cm90YXRpb24sIG9pLT5taXJyb3IsCisJCQkJb2ktPnNjcmVlbl93aWR0aCwgb2ktPndpZHRoLCBmcmFtZV9oZWlnaHQsCisJCQkJb2ktPmNvbG9yX21vZGUsIGZpZWxkbW9kZSwgZmllbGRfb2Zmc2V0LAogCQkJCSZvZmZzZXQwLCAmb2Zmc2V0MSwgJnJvd19pbmMsICZwaXhfaW5jKTsKIAogCURTU0RCRygib2Zmc2V0MCAldSwgb2Zmc2V0MSAldSwgcm93X2luYyAlZCwgcGl4X2luYyAlZFxuIiwKIAkJCW9mZnNldDAsIG9mZnNldDEsIHJvd19pbmMsIHBpeF9pbmMpOwogCi0JX2Rpc3BjX3NldF9jb2xvcl9tb2RlKHBsYW5lLCBjb2xvcl9tb2RlKTsKKwlkaXNwY19vdmxfc2V0X2NvbG9yX21vZGUocGxhbmUsIG9pLT5jb2xvcl9tb2RlKTsKIAotCV9kaXNwY19zZXRfcGxhbmVfYmEwKHBsYW5lLCBwYWRkciArIG9mZnNldDApOwotCV9kaXNwY19zZXRfcGxhbmVfYmExKHBsYW5lLCBwYWRkciArIG9mZnNldDEpOworCWRpc3BjX292bF9zZXRfYmEwKHBsYW5lLCBvaS0+cGFkZHIgKyBvZmZzZXQwKTsKKwlkaXNwY19vdmxfc2V0X2JhMShwbGFuZSwgb2ktPnBhZGRyICsgb2Zmc2V0MSk7CiAKLQlpZiAoT01BUF9EU1NfQ09MT1JfTlYxMiA9PSBjb2xvcl9tb2RlKSB7Ci0JCV9kaXNwY19zZXRfcGxhbmVfYmEwX3V2KHBsYW5lLCBwdXZfYWRkciArIG9mZnNldDApOwotCQlfZGlzcGNfc2V0X3BsYW5lX2JhMV91dihwbGFuZSwgcHV2X2FkZHIgKyBvZmZzZXQxKTsKKwlpZiAoT01BUF9EU1NfQ09MT1JfTlYxMiA9PSBvaS0+Y29sb3JfbW9kZSkgeworCQlkaXNwY19vdmxfc2V0X2JhMF91dihwbGFuZSwgb2ktPnBfdXZfYWRkciArIG9mZnNldDApOworCQlkaXNwY19vdmxfc2V0X2JhMV91dihwbGFuZSwgb2ktPnBfdXZfYWRkciArIG9mZnNldDEpOwogCX0KIAogCi0JX2Rpc3BjX3NldF9yb3dfaW5jKHBsYW5lLCByb3dfaW5jKTsKLQlfZGlzcGNfc2V0X3BpeF9pbmMocGxhbmUsIHBpeF9pbmMpOworCWRpc3BjX292bF9zZXRfcm93X2luYyhwbGFuZSwgcm93X2luYyk7CisJZGlzcGNfb3ZsX3NldF9waXhfaW5jKHBsYW5lLCBwaXhfaW5jKTsKIAotCURTU0RCRygiJWQsJWQgJWR4JWQgLT4gJWR4JWRcbiIsIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwKLQkJCW91dF93aWR0aCwgb3V0X2hlaWdodCk7CisJRFNTREJHKCIlZCwlZCAlZHglZCAtPiAlZHglZFxuIiwgb2ktPnBvc194LCBvaS0+cG9zX3ksIG9pLT53aWR0aCwKKwkJCW9pLT5oZWlnaHQsIG9pLT5vdXRfd2lkdGgsIG9pLT5vdXRfaGVpZ2h0KTsKIAotCV9kaXNwY19zZXRfcGxhbmVfcG9zKHBsYW5lLCBwb3NfeCwgcG9zX3kpOworCWRpc3BjX292bF9zZXRfcG9zKHBsYW5lLCBvaS0+cG9zX3gsIG9pLT5wb3NfeSk7CiAKLQlfZGlzcGNfc2V0X3BpY19zaXplKHBsYW5lLCB3aWR0aCwgaGVpZ2h0KTsKKwlkaXNwY19vdmxfc2V0X3BpY19zaXplKHBsYW5lLCBvaS0+d2lkdGgsIG9pLT5oZWlnaHQpOwogCi0JaWYgKHBsYW5lICE9IE9NQVBfRFNTX0dGWCkgewotCQlfZGlzcGNfc2V0X3NjYWxpbmcocGxhbmUsIHdpZHRoLCBoZWlnaHQsCi0JCQkJICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAorCWlmIChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFKSB7CisJCWRpc3BjX292bF9zZXRfc2NhbGluZyhwbGFuZSwgb2ktPndpZHRoLCBvaS0+aGVpZ2h0LAorCQkJCSAgIG9pLT5vdXRfd2lkdGgsIG9pLT5vdXRfaGVpZ2h0LAogCQkJCSAgIGlsYWNlLCBmaXZlX3RhcHMsIGZpZWxkbW9kZSwKLQkJCQkgICBjb2xvcl9tb2RlLCByb3RhdGlvbik7Ci0JCV9kaXNwY19zZXRfdmlkX3NpemUocGxhbmUsIG91dF93aWR0aCwgb3V0X2hlaWdodCk7Ci0JCV9kaXNwY19zZXRfdmlkX2NvbG9yX2NvbnYocGxhbmUsIGNjb252KTsKKwkJCQkgICBvaS0+Y29sb3JfbW9kZSwgb2ktPnJvdGF0aW9uKTsKKwkJZGlzcGNfb3ZsX3NldF92aWRfc2l6ZShwbGFuZSwgb2ktPm91dF93aWR0aCwgb2ktPm91dF9oZWlnaHQpOworCQlkaXNwY19vdmxfc2V0X3ZpZF9jb2xvcl9jb252KHBsYW5lLCBjY29udik7CiAJfQogCi0JX2Rpc3BjX3NldF9yb3RhdGlvbl9hdHRycyhwbGFuZSwgcm90YXRpb24sIG1pcnJvciwgY29sb3JfbW9kZSk7CisJZGlzcGNfb3ZsX3NldF9yb3RhdGlvbl9hdHRycyhwbGFuZSwgb2ktPnJvdGF0aW9uLCBvaS0+bWlycm9yLAorCQkJb2ktPmNvbG9yX21vZGUpOwogCi0JX2Rpc3BjX3NldF9wcmVfbXVsdF9hbHBoYShwbGFuZSwgcHJlX211bHRfYWxwaGEpOwotCV9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEocGxhbmUsIGdsb2JhbF9hbHBoYSk7CisJZGlzcGNfb3ZsX3NldF96b3JkZXIocGxhbmUsIG9pLT56b3JkZXIpOworCWRpc3BjX292bF9zZXRfcHJlX211bHRfYWxwaGEocGxhbmUsIG9pLT5wcmVfbXVsdF9hbHBoYSk7CisJZGlzcGNfb3ZsX3NldHVwX2dsb2JhbF9hbHBoYShwbGFuZSwgb2ktPmdsb2JhbF9hbHBoYSk7CisKKwlkaXNwY19vdmxfc2V0X2NoYW5uZWxfb3V0KHBsYW5lLCBjaGFubmVsKTsKKworCWRpc3BjX292bF9lbmFibGVfcmVwbGljYXRpb24ocGxhbmUsIHJlcGxpY2F0aW9uKTsKKwlkaXNwY19vdmxfc2V0X2ZpZm9fdGhyZXNob2xkKHBsYW5lLCBmaWZvX2xvdywgZmlmb19oaWdoKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCitpbnQgZGlzcGNfb3ZsX2VuYWJsZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQogewogCURTU0RCRygiZGlzcGNfZW5hYmxlX3BsYW5lICVkLCAlZFxuIiwgcGxhbmUsIGVuYWJsZSk7CiAKQEAgLTIwNDgsNyArMTkyMyw3IEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSA/IDEgOiAwLCAwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzcGNfZW5hYmxlX2xjZF9vdXQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCitzdGF0aWMgdm9pZCBkaXNwY19tZ3JfZW5hYmxlX2xjZF9vdXQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOwogCWJvb2wgaXNfb247CkBAIC0yMDk1LDE0ICsxOTcwLDE5IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDEsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwY19lbmFibGVfZGlnaXRfb3V0KGJvb2wgZW5hYmxlKQorc3RhdGljIHZvaWQgZGlzcGNfbWdyX2VuYWJsZV9kaWdpdF9vdXQoYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gZnJhbWVfZG9uZV9jb21wbGV0aW9uOwotCWludCByOworCWVudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBzcmM7CisJaW50IHIsIGk7CisJdTMyIGlycV9tYXNrOworCWludCBudW1faXJxczsKIAogCWlmIChSRUdfR0VUKERJU1BDX0NPTlRST0wsIDEsIDEpID09IGVuYWJsZSkKIAkJcmV0dXJuOwogCisJc3JjID0gZHNzX2dldF9oZG1pX3ZlbmNfY2xrX3NvdXJjZSgpOworCiAJaWYgKGVuYWJsZSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQkvKiBXaGVuIHdlIGVuYWJsZSBkaWdpdCBvdXRwdXQsIHdlJ2xsIGdldCBhbiBleHRyYSBkaWdpdApAQCAtMjExOSw0MyArMTk5OSw0NyBAQAogCSAqIHdhaXQgZm9yIHRoZSBleHRyYSBzeW5jIGxvc3RzICovCiAJaW5pdF9jb21wbGV0aW9uKCZmcmFtZV9kb25lX2NvbXBsZXRpb24pOwogCisJaWYgKHNyYyA9PSBEU1NfSERNSV9NX1BDTEsgJiYgZW5hYmxlID09IGZhbHNlKSB7CisJCWlycV9tYXNrID0gRElTUENfSVJRX0ZSQU1FRE9ORVRWOworCQludW1faXJxcyA9IDE7CisJfSBlbHNlIHsKKwkJaXJxX21hc2sgPSBESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERDsKKwkJLyogWFhYIEkgdW5kZXJzdGFuZCBmcm9tIFRSTSB0aGF0IHdlIHNob3VsZCBvbmx5IHdhaXQgZm9yIHRoZQorCQkgKiBjdXJyZW50IGZpZWxkIHRvIGNvbXBsZXRlLiBCdXQgaXQgc2VlbXMgd2UgaGF2ZSB0byB3YWl0IGZvcgorCQkgKiBib3RoIGZpZWxkcyAqLworCQludW1faXJxcyA9IDI7CisJfQorCiAJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLCAmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQpOworCQkJaXJxX21hc2spOwogCWlmIChyKQotCQlEU1NFUlIoImZhaWxlZCB0byByZWdpc3RlciBFVlNZTkMgaXNyXG4iKTsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgJXggaXNyXG4iLCBpcnFfbWFzayk7CiAKIAlfZW5hYmxlX2RpZ2l0X291dChlbmFibGUpOwogCi0JLyogWFhYIEkgdW5kZXJzdGFuZCBmcm9tIFRSTSB0aGF0IHdlIHNob3VsZCBvbmx5IHdhaXQgZm9yIHRoZQotCSAqIGN1cnJlbnQgZmllbGQgdG8gY29tcGxldGUuIEJ1dCBpdCBzZWVtcyB3ZSBoYXZlIHRvIHdhaXQKLQkgKiBmb3IgYm90aCBmaWVsZHMgKi8KLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCi0JCURTU0VSUigidGltZW91dCB3YWl0aW5nIGZvciBFVlNZTkNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBudW1faXJxczsgKytpKSB7CisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmcmFtZV9kb25lX2NvbXBsZXRpb24sCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCisJCQlEU1NFUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgZGlnaXQgb3V0IHRvICVzXG4iLAorCQkJCQllbmFibGUgPyAic3RhcnQiIDogInN0b3AiKTsKKwl9CiAKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSkpCi0JCURTU0VSUigidGltZW91dCB3YWl0aW5nIGZvciBFVlNZTkNcbiIpOwotCi0JciA9IG9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZGlzcGNfZGlzYWJsZV9pc3IsCi0JCQkmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQpOworCXIgPSBvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLCAmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAorCQkJaXJxX21hc2spOwogCWlmIChyKQotCQlEU1NFUlIoImZhaWxlZCB0byB1bnJlZ2lzdGVyIEVWU1lOQyBpc3JcbiIpOworCQlEU1NFUlIoImZhaWxlZCB0byB1bnJlZ2lzdGVyICV4IGlzclxuIiwgaXJxX21hc2spOwogCiAJaWYgKGVuYWJsZSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKLQkJZGlzcGMuaXJxX2Vycm9yX21hc2sgPSBESVNQQ19JUlFfTUFTS19FUlJPUjsKLQkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKLQkJCWRpc3BjLmlycV9lcnJvcl9tYXNrIHw9IERJU1BDX0lSUV9TWU5DX0xPU1QyOworCQlkaXNwYy5pcnFfZXJyb3JfbWFzayB8PSBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUOwogCQlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUKTsKIAkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAl9CiB9CiAKLWJvb2wgZGlzcGNfaXNfY2hhbm5lbF9lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCitib29sIGRpc3BjX21ncl9pc19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7CiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCXJldHVybiAhIVJFR19HRVQoRElTUENfQ09OVFJPTCwgMCwgMCk7CkBAIC0yMTY3LDEzICsyMDUxLDEyIEBACiAJCUJVRygpOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9jaGFubmVsKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQordm9pZCBkaXNwY19tZ3JfZW5hYmxlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewotCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8Ci0JCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKLQkJZGlzcGNfZW5hYmxlX2xjZF9vdXQoY2hhbm5lbCwgZW5hYmxlKTsKKwlpZiAoZGlzcGNfbWdyX2lzX2xjZChjaGFubmVsKSkKKwkJZGlzcGNfbWdyX2VuYWJsZV9sY2Rfb3V0KGNoYW5uZWwsIGVuYWJsZSk7CiAJZWxzZSBpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQotCQlkaXNwY19lbmFibGVfZGlnaXRfb3V0KGVuYWJsZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZGlnaXRfb3V0KGVuYWJsZSk7CiAJZWxzZQogCQlCVUcoKTsKIH0KQEAgLTIyMDIsNyArMjA4NSw3IEBACiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDI3LCAyNyk7CiB9CiAKLXZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSA/IDEgOiAwLCAxNiwgMTYpOwpAQCAtMjIxMSw3ICsyMDk0LDcgQEAKIH0KIAogCi12b2lkIGRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCit2b2lkIGRpc3BjX21ncl9zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQllbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKQogewogCWludCBtb2RlOwpAQCAtMjI0MiwxMiArMjEyNSwxMiBAQAogfQogCiAKLXZvaWQgZGlzcGNfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQordm9pZCBkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQogewogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ERUZBVUxUX0NPTE9SKGNoYW5uZWwpLCBjb2xvcik7CiB9CiAKLXUzMiBkaXNwY19nZXRfZGVmYXVsdF9jb2xvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordTMyIGRpc3BjX21ncl9nZXRfZGVmYXVsdF9jb2xvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCXUzMiBsOwogCkBAIC0yMjYwLDcgKzIxNDMsNyBAQAogCXJldHVybiBsOwogfQogCi12b2lkIGRpc3BjX3NldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCit2b2lkIGRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLAogCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlIHR5cGUsCiAJCXUzMiB0cmFuc19rZXkpCiB7CkBAIC0yMjc0LDcgKzIxNTcsNyBAQAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19UUkFOU19DT0xPUihjaCksIHRyYW5zX2tleSk7CiB9CiAKLXZvaWQgZGlzcGNfZ2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKK3ZvaWQgZGlzcGNfbWdyX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCiAJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCiAJCXUzMiAqdHJhbnNfa2V5KQogewpAQCAtMjI5Myw3ICsyMTc2LDcgQEAKIAkJKnRyYW5zX2tleSA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RSQU5TX0NPTE9SKGNoKSk7CiB9CiAKLXZvaWQgZGlzcGNfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCit2b2lkIGRpc3BjX21ncl9lbmFibGVfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxMCwgMTApOwpAQCAtMjMwMiwzOSArMjE4NSwzNiBAQAogCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9MQ0QyICovCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSwgMTAsIDEwKTsKIH0KLXZvaWQgZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKKwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX2FscGhhX2ZpeGVkX3pvcmRlcihlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCiB7Ci0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRklYRURfWk9SREVSKSkKIAkJcmV0dXJuOwogCiAJaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTgsIDE4KTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTksIDE5KTsKLQllbHNlIC8qIE9NQVBfRFNTX0NIQU5ORUxfTENEMiAqLwotCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUsIDE4LCAxOCk7CiB9Ci1ib29sIGRpc3BjX2FscGhhX2JsZW5kaW5nX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCisKK2Jvb2wgZGlzcGNfbWdyX2FscGhhX2ZpeGVkX3pvcmRlcl9lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKQogewogCWJvb2wgZW5hYmxlZDsKIAotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikpCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOCwgMTgpOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCiAJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTksIDE5KTsKLQllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCi0JCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRzIsIDE4LCAxOCk7CiAJZWxzZQogCQlCVUcoKTsKIAogCXJldHVybiBlbmFibGVkOwogfQogCi0KLWJvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCitib29sIGRpc3BjX21ncl90cmFuc19rZXlfZW5hYmxlZChlbnVtIG9tYXBfY2hhbm5lbCBjaCkKIHsKIAlib29sIGVuYWJsZWQ7CiAKQEAgLTIzNTEsNyArMjIzMSw3IEBACiB9CiAKIAotdm9pZCBkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTggZGF0YV9saW5lcykKK3ZvaWQgZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1OCBkYXRhX2xpbmVzKQogewogCWludCBjb2RlOwogCkBAIC0yMzc5LDQ2ICsyMjU5LDQxIEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGNvZGUsIDksIDgpOwogfQogCi12b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQllbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgbW9kZSkKK3ZvaWQgZGlzcGNfbWdyX3NldF9pb19wYWRfbW9kZShlbnVtIGRzc19pb19wYWRfbW9kZSBtb2RlKQogewogCXUzMiBsOwotCWludCBzdGFsbG1vZGU7Ci0JaW50IGdwb3V0MCA9IDE7Ci0JaW50IGdwb3V0MTsKKwlpbnQgZ3BvdXQwLCBncG91dDE7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9CWVBBU1M6Ci0JCXN0YWxsbW9kZSA9IDA7Ci0JCWdwb3V0MSA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBPTUFQX0RTU19QQVJBTExFTE1PREVfUkZCSToKLQkJc3RhbGxtb2RlID0gMTsKKwljYXNlIERTU19JT19QQURfTU9ERV9SRVNFVDoKKwkJZ3BvdXQwID0gMDsKIAkJZ3BvdXQxID0gMDsKIAkJYnJlYWs7Ci0KLQljYXNlIE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0k6Ci0JCXN0YWxsbW9kZSA9IDE7CisJY2FzZSBEU1NfSU9fUEFEX01PREVfUkZCSToKKwkJZ3BvdXQwID0gMTsKKwkJZ3BvdXQxID0gMDsKKwkJYnJlYWs7CisJY2FzZSBEU1NfSU9fUEFEX01PREVfQllQQVNTOgorCQlncG91dDAgPSAxOwogCQlncG91dDEgPSAxOwogCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSB7Ci0JCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MMik7Ci0JCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKLQkJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wyLCBsKTsKLQl9IGVsc2UgewotCQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7Ci0JCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKLQkJbCA9IEZMRF9NT0QobCwgZ3BvdXQwLCAxNSwgMTUpOwotCQlsID0gRkxEX01PRChsLCBncG91dDEsIDE2LCAxNik7Ci0JCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKLQl9CisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCWwgPSBGTERfTU9EKGwsIGdwb3V0MCwgMTUsIDE1KTsKKwlsID0gRkxEX01PRChsLCBncG91dDEsIDE2LCAxNik7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworfQorCit2b2lkIGRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQoreworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTDIsIGVuYWJsZSwgMTEsIDExKTsKKwllbHNlCisJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSwgMTEsIDExKTsKIH0KIAogc3RhdGljIGJvb2wgX2Rpc3BjX2xjZF90aW1pbmdzX29rKGludCBoc3csIGludCBoZnAsIGludCBoYnAsCkBAIC0yNDUyLDcgKzIzMjcsNyBAQAogCQkJdGltaW5ncy0+dmZwLCB0aW1pbmdzLT52YnApOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCBoc3csCitzdGF0aWMgdm9pZCBfZGlzcGNfbWdyX3NldF9sY2RfdGltaW5ncyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBpbnQgaHN3LAogCQlpbnQgaGZwLCBpbnQgaGJwLCBpbnQgdnN3LCBpbnQgdmZwLCBpbnQgdmJwKQogewogCXUzMiB0aW1pbmdfaCwgdGltaW5nX3Y7CkBAIC0yNDc2LDcgKzIzNTEsNyBAQAogfQogCiAvKiBjaGFuZ2UgbmFtZSB0byBtb2RlPyAqLwotdm9pZCBkaXNwY19zZXRfbGNkX3RpbWluZ3MoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2RfdGltaW5ncyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQogewogCXVuc2lnbmVkIHh0b3QsIHl0b3Q7CkBAIC0yNDg3LDExICsyMzYyLDExIEBACiAJCQkJdGltaW5ncy0+dmZwLCB0aW1pbmdzLT52YnApKQogCQlCVUcoKTsKIAotCV9kaXNwY19zZXRfbGNkX3RpbWluZ3MoY2hhbm5lbCwgdGltaW5ncy0+aHN3LCB0aW1pbmdzLT5oZnAsCisJX2Rpc3BjX21ncl9zZXRfbGNkX3RpbWluZ3MoY2hhbm5lbCwgdGltaW5ncy0+aHN3LCB0aW1pbmdzLT5oZnAsCiAJCQl0aW1pbmdzLT5oYnAsIHRpbWluZ3MtPnZzdywgdGltaW5ncy0+dmZwLAogCQkJdGltaW5ncy0+dmJwKTsKIAotCWRpc3BjX3NldF9sY2Rfc2l6ZShjaGFubmVsLCB0aW1pbmdzLT54X3JlcywgdGltaW5ncy0+eV9yZXMpOworCWRpc3BjX21ncl9zZXRfbGNkX3NpemUoY2hhbm5lbCwgdGltaW5ncy0+eF9yZXMsIHRpbWluZ3MtPnlfcmVzKTsKIAogCXh0b3QgPSB0aW1pbmdzLT54X3JlcyArIHRpbWluZ3MtPmhmcCArIHRpbWluZ3MtPmhzdyArIHRpbWluZ3MtPmhicDsKIAl5dG90ID0gdGltaW5ncy0+eV9yZXMgKyB0aW1pbmdzLT52ZnAgKyB0aW1pbmdzLT52c3cgKyB0aW1pbmdzLT52YnA7CkBAIC0yNTA5LDE3ICsyMzg0LDE3IEBACiAJRFNTREJHKCJoc3luYyAlbHVIeiwgdnN5bmMgJWx1SHpcbiIsIGh0LCB2dCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BjX3NldF9sY2RfZGl2aXNvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgbGNrX2RpdiwKK3N0YXRpYyB2b2lkIGRpc3BjX21ncl9zZXRfbGNkX2Rpdmlzb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IGxja19kaXYsCiAJCXUxNiBwY2tfZGl2KQogewogCUJVR19PTihsY2tfZGl2IDwgMSk7Ci0JQlVHX09OKHBja19kaXYgPCAyKTsKKwlCVUdfT04ocGNrX2RpdiA8IDEpOwogCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1JvKGNoYW5uZWwpLAogCQkJRkxEX1ZBTChsY2tfZGl2LCAyMywgMTYpIHwgRkxEX1ZBTChwY2tfZGl2LCA3LCAwKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BjX2dldF9sY2RfZGl2aXNvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBpbnQgKmxja19kaXYsCitzdGF0aWMgdm9pZCBkaXNwY19tZ3JfZ2V0X2xjZF9kaXZpc29yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCAqbGNrX2RpdiwKIAkJaW50ICpwY2tfZGl2KQogewogCXUzMiBsOwpAQCAtMjU1Miw3ICsyNDI3LDcgQEAKIAlyZXR1cm4gcjsKIH0KIAotdW5zaWduZWQgbG9uZyBkaXNwY19sY2xrX3JhdGUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgZGlzcGNfbWdyX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldjsKIAlpbnQgbGNkOwpAQCAtMjU4MiwxOSArMjQ1NywzNCBAQAogCXJldHVybiByIC8gbGNkOwogfQogCi11bnNpZ25lZCBsb25nIGRpc3BjX3BjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7Ci0JaW50IHBjZDsKIAl1bnNpZ25lZCBsb25nIHI7Ci0JdTMyIGw7CiAKLQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfRElWSVNPUm8oY2hhbm5lbCkpOworCWlmIChkaXNwY19tZ3JfaXNfbGNkKGNoYW5uZWwpKSB7CisJCWludCBwY2Q7CisJCXUzMiBsOwogCi0JcGNkID0gRkxEX0dFVChsLCA3LCAwKTsKKwkJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1JvKGNoYW5uZWwpKTsKIAotCXIgPSBkaXNwY19sY2xrX3JhdGUoY2hhbm5lbCk7CisJCXBjZCA9IEZMRF9HRVQobCwgNywgMCk7CiAKLQlyZXR1cm4gciAvIHBjZDsKKwkJciA9IGRpc3BjX21ncl9sY2xrX3JhdGUoY2hhbm5lbCk7CisKKwkJcmV0dXJuIHIgLyBwY2Q7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0KKwkJCWRpc3BjX21ncl9nZXRfZGV2aWNlKGNoYW5uZWwpOworCisJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CisJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKKwkJCXJldHVybiB2ZW5jX2dldF9waXhlbF9jbG9jaygpOworCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0hETUk6CisJCQlyZXR1cm4gaGRtaV9nZXRfcGl4ZWxfY2xvY2soKTsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQogfQogCiB2b2lkIGRpc3BjX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKQEAgLTI2MzEsMTIgKzI1MjEsMTIgQEAKIAkJZHNzX2dldF9nZW5lcmljX2Nsa19zb3VyY2VfbmFtZShsY2RfY2xrX3NyYyksCiAJCWRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUobGNkX2Nsa19zcmMpKTsKIAotCWRpc3BjX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRCwgJmxjZCwgJnBjZCk7CisJZGlzcGNfbWdyX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRCwgJmxjZCwgJnBjZCk7CiAKIAlzZXFfcHJpbnRmKHMsICJsY2tcdFx0JS0xNmx1bGNrIGRpdlx0JXVcbiIsCi0JCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLCBsY2QpOworCQkJZGlzcGNfbWdyX2xjbGtfcmF0ZShPTUFQX0RTU19DSEFOTkVMX0xDRCksIGxjZCk7CiAJc2VxX3ByaW50ZihzLCAicGNrXHRcdCUtMTZsdXBjayBkaXZcdCV1XG4iLAotCQkJZGlzcGNfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEKSwgcGNkKTsKKwkJCWRpc3BjX21ncl9wY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLCBwY2QpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJc2VxX3ByaW50ZihzLCAiLSBMQ0QyIC1cbiIpOwogCkBAIC0yNjQ2LDEyICsyNTM2LDEyIEBACiAJCQlkc3NfZ2V0X2dlbmVyaWNfY2xrX3NvdXJjZV9uYW1lKGxjZF9jbGtfc3JjKSwKIAkJCWRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUobGNkX2Nsa19zcmMpKTsKIAotCQlkaXNwY19nZXRfbGNkX2Rpdmlzb3IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyLCAmbGNkLCAmcGNkKTsKKwkJZGlzcGNfbWdyX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRDIsICZsY2QsICZwY2QpOwogCiAJCXNlcV9wcmludGYocywgImxja1x0XHQlLTE2bHVsY2sgZGl2XHQldVxuIiwKLQkJCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSwgbGNkKTsKKwkJCQlkaXNwY19tZ3JfbGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEMiksIGxjZCk7CiAJCXNlcV9wcmludGYocywgInBja1x0XHQlLTE2bHVwY2sgZGl2XHQldVxuIiwKLQkJCQlkaXNwY19wY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSwgcGNkKTsKKwkJCQlkaXNwY19tZ3JfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEMiksIHBjZCk7CiAJfQogCiAJZGlzcGNfcnVudGltZV9wdXQoKTsKQEAgLTI2OTIsNiArMjU4MiwxMCBAQAogCVBJUyhWSUQxX0VORF9XSU4pOwogCVBJUyhWSUQyX0ZJRk9fVU5ERVJGTE9XKTsKIAlQSVMoVklEMl9FTkRfV0lOKTsKKwlpZiAoZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCkgPiAzKSB7CisJCVBJUyhWSUQzX0ZJRk9fVU5ERVJGTE9XKTsKKwkJUElTKFZJRDNfRU5EX1dJTik7CisJfQogCVBJUyhTWU5DX0xPU1QpOwogCVBJUyhTWU5DX0xPU1RfRElHSVQpOwogCVBJUyhXQUtFVVApOwpAQCAtMjcwNywxMSArMjYwMSwyNiBAQAogCiB2b2lkIGRpc3BjX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CisJaW50IGksIGo7CisJY29uc3QgY2hhciAqbWdyX25hbWVzW10gPSB7CisJCVtPTUFQX0RTU19DSEFOTkVMX0xDRF0JCT0gIkxDRCIsCisJCVtPTUFQX0RTU19DSEFOTkVMX0RJR0lUXQk9ICJUViIsCisJCVtPTUFQX0RTU19DSEFOTkVMX0xDRDJdCQk9ICJMQ0QyIiwKKwl9OworCWNvbnN0IGNoYXIgKm92bF9uYW1lc1tdID0geworCQlbT01BUF9EU1NfR0ZYXQkJPSAiR0ZYIiwKKwkJW09NQVBfRFNTX1ZJREVPMV0JPSAiVklEMSIsCisJCVtPTUFQX0RTU19WSURFTzJdCT0gIlZJRDIiLAorCQlbT01BUF9EU1NfVklERU8zXQk9ICJWSUQzIiwKKwl9OworCWNvbnN0IGNoYXIgKipwX25hbWVzOworCiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS01MHMgJTA4eFxuIiwgI3IsIGRpc3BjX3JlYWRfcmVnKHIpKQogCiAJaWYgKGRpc3BjX3J1bnRpbWVfZ2V0KCkpCiAJCXJldHVybjsKIAorCS8qIERJU1BDIGNvbW1vbiByZWdpc3RlcnMgKi8KIAlEVU1QUkVHKERJU1BDX1JFVklTSU9OKTsKIAlEVU1QUkVHKERJU1BDX1NZU0NPTkZJRyk7CiAJRFVNUFJFRyhESVNQQ19TWVNTVEFUVVMpOwpAQCAtMjcyMCwyNDcgKzI2MjksMTM5IEBACiAJRFVNUFJFRyhESVNQQ19DT05UUk9MKTsKIAlEVU1QUkVHKERJU1BDX0NPTkZJRyk7CiAJRFVNUFJFRyhESVNQQ19DQVBBQkxFKTsKLQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX1RSQU5TX0NPTE9SKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKIAlEVU1QUkVHKERJU1BDX0xJTkVfU1RBVFVTKTsKIAlEVU1QUkVHKERJU1BDX0xJTkVfTlVNQkVSKTsKLQlEVU1QUkVHKERJU1BDX1RJTUlOR19IKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19USU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlEVU1QUkVHKERJU1BDX0RJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikgfHwKKwkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSkKIAkJRFVNUFJFRyhESVNQQ19HTE9CQUxfQUxQSEEpOwotCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwotCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CiAJCURVTVBSRUcoRElTUENfQ09OVFJPTDIpOwogCQlEVU1QUkVHKERJU1BDX0NPTkZJRzIpOwotCQlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVElNSU5HX0goT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfVElNSU5HX1YoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfRElWSVNPUm8oT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAJfQogCi0JRFVNUFJFRyhESVNQQ19PVkxfQkEwKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0JBMShPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QT1NJVElPTihPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9TSVpFKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfR0ZYKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfR0ZYKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19TSVpFX1NUQVRVUyhPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9ST1dfSU5DKE9NQVBfRFNTX0dGWCkpOwotCURVTVBSRUcoRElTUENfT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9XSU5ET1dfU0tJUChPTUFQX0RTU19HRlgpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9UQUJMRV9CQShPTUFQX0RTU19HRlgpKTsKKyN1bmRlZiBEVU1QUkVHCiAKLQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKyNkZWZpbmUgRElTUENfUkVHKGksIG5hbWUpIG5hbWUoaSkKKyNkZWZpbmUgRFVNUFJFRyhpLCByKSBzZXFfcHJpbnRmKHMsICIlcyglcyklKnMgJTA4eFxuIiwgI3IsIHBfbmFtZXNbaV0sIFwKKwk0OCAtIHN0cmxlbigjcikgLSBzdHJsZW4ocF9uYW1lc1tpXSksICIgIiwgXAorCWRpc3BjX3JlYWRfcmVnKERJU1BDX1JFRyhpLCByKSkpCiAKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgewotCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJcF9uYW1lcyA9IG1ncl9uYW1lczsKKworCS8qIERJU1BDIGNoYW5uZWwgc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IGRzc19mZWF0X2dldF9udW1fbWdycygpOyBpKyspIHsKKwkJRFVNUFJFRyhpLCBESVNQQ19ERUZBVUxUX0NPTE9SKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19UUkFOU19DT0xPUik7CisJCURVTVBSRUcoaSwgRElTUENfU0laRV9NR1IpOworCisJCWlmIChpID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCisJCQljb250aW51ZTsKKworCQlEVU1QUkVHKGksIERJU1BDX0RFRkFVTFRfQ09MT1IpOworCQlEVU1QUkVHKGksIERJU1BDX1RSQU5TX0NPTE9SKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19USU1JTkdfSCk7CisJCURVTVBSRUcoaSwgRElTUENfVElNSU5HX1YpOworCQlEVU1QUkVHKGksIERJU1BDX1BPTF9GUkVRKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19ESVZJU09Sbyk7CisJCURVTVBSRUcoaSwgRElTUENfU0laRV9NR1IpOworCisJCURVTVBSRUcoaSwgRElTUENfREFUQV9DWUNMRTEpOworCQlEVU1QUkVHKGksIERJU1BDX0RBVEFfQ1lDTEUyKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19EQVRBX0NZQ0xFMyk7CiAKIAkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJCURVTVBSRUcoaSwgRElTUENfQ1BSX0NPRUZfUik7CisJCQlEVU1QUkVHKGksIERJU1BDX0NQUl9DT0VGX0cpOworCQkJRFVNUFJFRyhpLCBESVNQQ19DUFJfQ09FRl9CKTsKIAkJfQogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKLQkJRFVNUFJFRyhESVNQQ19PVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlwX25hbWVzID0gb3ZsX25hbWVzOwogCi0JRFVNUFJFRyhESVNQQ19PVkxfQkEwKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0JBMShPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QT1NJVElPTihPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19USFJFU0hPTEQoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklGT19TSVpFX1NUQVRVUyhPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9ST1dfSU5DKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX1BJWEVMX0lOQyhPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVIoT01BUF9EU1NfVklERU8xKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfUElDVFVSRV9TSVpFKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UwKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UxKE9NQVBfRFNTX1ZJREVPMSkpOworCWZvciAoaSA9IDA7IGkgPCBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsgaSsrKSB7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMSk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX1BPU0lUSU9OKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19PVkxfU0laRSk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FUVFJJQlVURVMpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJRk9fU0laRV9TVEFUVVMpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9ST1dfSU5DKTsKKwkJRFVNUFJFRyhpLCBESVNQQ19PVkxfUElYRUxfSU5DKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfUFJFTE9BRCk7CiAKLQlEVU1QUkVHKERJU1BDX09WTF9CQTAoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQkExKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1BPU0lUSU9OKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQVRUUklCVVRFUyhPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRChPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSUZPX1NJWkVfU1RBVFVTKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX1JPV19JTkMoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfUElYRUxfSU5DKE9NQVBfRFNTX1ZJREVPMikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUihPTUFQX0RTU19WSURFTzIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QSUNUVVJFX1NJWkUoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQUNDVTAoT01BUF9EU1NfVklERU8yKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQUNDVTEoT01BUF9EU1NfVklERU8yKSk7CisJCWlmIChpID09IE9NQVBfRFNTX0dGWCkgeworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfV0lORE9XX1NLSVApOworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfVEFCTEVfQkEpOworCQkJY29udGludWU7CisJCX0KIAotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8xLCA2KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzEsIDcpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDApKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDUpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVihPTUFQX0RTU19WSURFTzEsIDcpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgewotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMykpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNykpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVIpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9QSUNUVVJFX1NJWkUpOworCQlEVU1QUkVHKGksIERJU1BDX09WTF9BQ0NVMCk7CisJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FDQ1UxKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0JBMF9VVik7CisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9CQTFfVVYpOworCQkJRFVNUFJFRyhpLCBESVNQQ19PVkxfRklSMik7CisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9BQ0NVMl8wKTsKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0FDQ1UyXzEpOworCQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9BVFRSSUJVVEVTMik7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX1BSRUxPQUQpOwogCX0KIAotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0JBMF9VVihPTUFQX0RTU19WSURFTzEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfQkExX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVIyKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9BQ0NVMl8wKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9BQ0NVMl8xKE9NQVBfRFNTX1ZJREVPMSkpOworI3VuZGVmIERJU1BDX1JFRworI3VuZGVmIERVTVBSRUcKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8xLCA3KSk7CisjZGVmaW5lIERJU1BDX1JFRyhwbGFuZSwgbmFtZSwgaSkgbmFtZShwbGFuZSwgaSkKKyNkZWZpbmUgRFVNUFJFRyhwbGFuZSwgbmFtZSwgaSkgXAorCXNlcV9wcmludGYocywgIiVzXyVkKCVzKSUqcyAlMDh4XG4iLCAjbmFtZSwgaSwgcF9uYW1lc1twbGFuZV0sIFwKKwk0NiAtIHN0cmxlbigjbmFtZSkgLSBzdHJsZW4ocF9uYW1lc1twbGFuZV0pLCAiICIsIFwKKwlkaXNwY19yZWFkX3JlZyhESVNQQ19SRUcocGxhbmUsIG5hbWUsIGkpKSkKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDQpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8xLCA2KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzEsIDcpKTsKKwkvKiBWaWRlbyBwaXBlbGluZSBjb2VmZmljaWVudCByZWdpc3RlcnMgKi8KIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8xLCA3KSk7Ci0JfQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCi0JCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOworCS8qIHN0YXJ0IGZyb20gT01BUF9EU1NfVklERU8xICovCisJZm9yIChpID0gMTsgaSA8IGRzc19mZWF0X2dldF9udW1fb3ZscygpOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0gsIGopOwogCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9IViwgaik7CiAKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSChPTUFQX0RTU19WSURFTzIsIDUpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IKE9NQVBfRFNTX1ZJREVPMiwgNikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0goT01BUF9EU1NfVklERU8yLCA3KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA1KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA2KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYoT01BUF9EU1NfVklERU8yLCA3KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDQpKTsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0NPTlZfQ09FRiwgaik7CiAKLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDEpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDQpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDcpKTsKLQl9CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9WLCBqKTsKKwkJfQogCi0JaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKLQkJRFVNUFJFRyhESVNQQ19PVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9CQTFfVVYoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUjIoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UyXzAoT01BUF9EU1NfVklERU8yKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0FDQ1UyXzEoT01BUF9EU1NfVklERU8yKSk7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0gyLCBqKTsKIAotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDApKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMiwgMikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDMpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0gyKE9NQVBfRFNTX1ZJREVPMiwgNSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IMihPTUFQX0RTU19WSURFTzIsIDYpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSDIoT01BUF9EU1NfVklERU8yLCA3KSk7CisJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJCURVTVBSRUcoaSwgRElTUENfT1ZMX0ZJUl9DT0VGX0hWMiwgaik7CiAKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX0hWMihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfSFYyKE9NQVBfRFNTX1ZJREVPMiwgNikpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9IVjIoT01BUF9EU1NfVklERU8yLCA3KSk7Ci0KLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCAwKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCAzKSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgNCkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WMihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVjIoT01BUF9EU1NfVklERU8yLCA2KSk7Ci0JCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YyKE9NQVBfRFNTX1ZJREVPMiwgNykpOwotCX0KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQotCQlEVU1QUkVHKERJU1BDX09WTF9BVFRSSUJVVEVTMihPTUFQX0RTU19WSURFTzIpKTsKLQotCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkgewotCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwotCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCQlEVU1QUkVHKGksIERJU1BDX09WTF9GSVJfQ09FRl9WMiwgaik7CisJCX0KIAl9CiAKIAlkaXNwY19ydW50aW1lX3B1dCgpOworCisjdW5kZWYgRElTUENfUkVHCiAjdW5kZWYgRFVNUFJFRwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgb25vZmYsIGJvb2wgcmYsCi0JCWJvb2wgaWVvLCBib29sIGlwYywgYm9vbCBpaHMsIGJvb2wgaXZzLCB1OCBhY2JpLCB1OCBhY2IpCitzdGF0aWMgdm9pZCBfZGlzcGNfbWdyX3NldF9wb2xfZnJlcShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIG9ub2ZmLAorCQlib29sIHJmLCBib29sIGllbywgYm9vbCBpcGMsIGJvb2wgaWhzLCBib29sIGl2cywgdTggYWNiaSwKKwkJdTggYWNiKQogewogCXUzMiBsID0gMDsKIApAQCAtMjk3OSwxMCArMjc4MCwxMCBAQAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUShjaGFubmVsKSwgbCk7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCit2b2lkIGRpc3BjX21ncl9zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKIAkJZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYikKIHsKLQlfZGlzcGNfc2V0X3BvbF9mcmVxKGNoYW5uZWwsIChjb25maWcgJiBPTUFQX0RTU19MQ0RfT05PRkYpICE9IDAsCisJX2Rpc3BjX21ncl9zZXRfcG9sX2ZyZXEoY2hhbm5lbCwgKGNvbmZpZyAmIE9NQVBfRFNTX0xDRF9PTk9GRikgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfUkYpICE9IDAsCiAJCQkoY29uZmlnICYgT01BUF9EU1NfTENEX0lFTykgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfSVBDKSAhPSAwLApAQCAtMjk5NSwxMSArMjc5NiwxNyBAQAogdm9pZCBkaXNwY19maW5kX2Nsa19kaXZzKGJvb2wgaXNfdGZ0LCB1bnNpZ25lZCBsb25nIHJlcV9wY2ssIHVuc2lnbmVkIGxvbmcgZmNrLAogCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCiB7Ci0JdTE2IHBjZF9taW4gPSBpc190ZnQgPyAyIDogMzsKKwl1MTYgcGNkX21pbiwgcGNkX21heDsKIAl1bnNpZ25lZCBsb25nIGJlc3RfcGNrOwogCXUxNiBiZXN0X2xkLCBjdXJfbGQ7CiAJdTE2IGJlc3RfcGQsIGN1cl9wZDsKIAorCXBjZF9taW4gPSBkc3NfZmVhdF9nZXRfcGFyYW1fbWluKEZFQVRfUEFSQU1fRFNTX1BDRCk7CisJcGNkX21heCA9IGRzc19mZWF0X2dldF9wYXJhbV9tYXgoRkVBVF9QQVJBTV9EU1NfUENEKTsKKworCWlmICghaXNfdGZ0KQorCQlwY2RfbWluID0gMzsKKwogCWJlc3RfcGNrID0gMDsKIAliZXN0X2xkID0gMDsKIAliZXN0X3BkID0gMDsKQEAgLTMwMDcsNyArMjgxNCw3IEBACiAJZm9yIChjdXJfbGQgPSAxOyBjdXJfbGQgPD0gMjU1OyArK2N1cl9sZCkgewogCQl1bnNpZ25lZCBsb25nIGxjayA9IGZjayAvIGN1cl9sZDsKIAotCQlmb3IgKGN1cl9wZCA9IHBjZF9taW47IGN1cl9wZCA8PSAyNTU7ICsrY3VyX3BkKSB7CisJCWZvciAoY3VyX3BkID0gcGNkX21pbjsgY3VyX3BkIDw9IHBjZF9tYXg7ICsrY3VyX3BkKSB7CiAJCQl1bnNpZ25lZCBsb25nIHBjayA9IGxjayAvIGN1cl9wZDsKIAkJCWxvbmcgb2xkX2RlbHRhID0gYWJzKGJlc3RfcGNrIC0gcmVxX3Bjayk7CiAJCQlsb25nIG5ld19kZWx0YSA9IGFicyhwY2sgLSByZXFfcGNrKTsKQEAgLTMwNDIsNyArMjg0OSw3IEBACiB7CiAJaWYgKGNpbmZvLT5sY2tfZGl2ID4gMjU1IHx8IGNpbmZvLT5sY2tfZGl2ID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjaW5mby0+cGNrX2RpdiA8IDIgfHwgY2luZm8tPnBja19kaXYgPiAyNTUpCisJaWYgKGNpbmZvLT5wY2tfZGl2IDwgMSB8fCBjaW5mby0+cGNrX2RpdiA+IDI1NSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljaW5mby0+bGNrID0gZGlzcGNfZmNsa19yYXRlIC8gY2luZm8tPmxja19kaXY7CkBAIC0zMDUxLDE4ICsyODU4LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkaXNwY19zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCitpbnQgZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKIAkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKQogewogCURTU0RCRygibGNrID0gJWx1ICgldSlcbiIsIGNpbmZvLT5sY2ssIGNpbmZvLT5sY2tfZGl2KTsKIAlEU1NEQkcoInBjayA9ICVsdSAoJXUpXG4iLCBjaW5mby0+cGNrLCBjaW5mby0+cGNrX2Rpdik7CiAKLQlkaXNwY19zZXRfbGNkX2Rpdmlzb3IoY2hhbm5lbCwgY2luZm8tPmxja19kaXYsIGNpbmZvLT5wY2tfZGl2KTsKKwlkaXNwY19tZ3Jfc2V0X2xjZF9kaXZpc29yKGNoYW5uZWwsIGNpbmZvLT5sY2tfZGl2LCBjaW5mby0+cGNrX2Rpdik7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRpc3BjX2dldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKK2ludCBkaXNwY19tZ3JfZ2V0X2Nsb2NrX2RpdihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAogCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBmY2s7CkBAIC0zMjA3LDYgKzMwMTQsOCBAQAogCVBJUyhPQ1BfRVJSKTsKIAlQSVMoVklEMV9GSUZPX1VOREVSRkxPVyk7CiAJUElTKFZJRDJfRklGT19VTkRFUkZMT1cpOworCWlmIChkc3NfZmVhdF9nZXRfbnVtX292bHMoKSA+IDMpCisJCVBJUyhWSUQzX0ZJRk9fVU5ERVJGTE9XKTsKIAlQSVMoU1lOQ19MT1NUKTsKIAlQSVMoU1lOQ19MT1NUX0RJR0lUKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKQpAQCAtMzMwMCwxNzggKzMxMDksNzIgQEAKIAlpbnQgaTsKIAl1MzIgZXJyb3JzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGZpZm9fdW5kZXJmbG93X2JpdHNbXSA9IHsKKwkJRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVywKKwkJRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1csCisJCURJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XLAorCQlESVNQQ19JUlFfVklEM19GSUZPX1VOREVSRkxPVywKKwl9OworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN5bmNfbG9zdF9iaXRzW10gPSB7CisJCURJU1BDX0lSUV9TWU5DX0xPU1QsCisJCURJU1BDX0lSUV9TWU5DX0xPU1RfRElHSVQsCisJCURJU1BDX0lSUV9TWU5DX0xPU1QyLAorCX07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAllcnJvcnMgPSBkaXNwYy5lcnJvcl9pcnFzOwogCWRpc3BjLmVycm9yX2lycXMgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc3BjLmlycV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyb3JzICYgRElTUENfSVJRX0dGWF9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIkdGWF9GSUZPX1VOREVSRkxPVywgZGlzYWJsaW5nIEdGWFxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwotCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CisJZGlzcGNfcnVudGltZV9nZXQoKTsKIAotCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQkJY29udGludWU7CisJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7CisJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKKwkJdW5zaWduZWQgYml0OwogCi0JCQlpZiAob3ZsLT5pZCA9PSAwKSB7Ci0JCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJCWRpc3BjX2dvKG92bC0+bWFuYWdlci0+aWQpOwotCQkJCW1kZWxheSg1MCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCQliaXQgPSBmaWZvX3VuZGVyZmxvd19iaXRzW2ldOworCisJCWlmIChiaXQgJiBlcnJvcnMpIHsKKwkJCURTU0VSUigiRklGTyBVTkRFUkZMT1cgb24gJXMsIGRpc2FibGluZyB0aGUgb3ZlcmxheVxuIiwKKwkJCQkJb3ZsLT5uYW1lKTsKKwkJCWRpc3BjX292bF9lbmFibGUob3ZsLT5pZCwgZmFsc2UpOworCQkJZGlzcGNfbWdyX2dvKG92bC0+bWFuYWdlci0+aWQpOworCQkJbWRlbGF5KDUwKTsKIAkJfQogCX0KIAotCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIlZJRDFfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQxXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKwlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgeworCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJdW5zaWduZWQgYml0OwogCi0JCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQljb250aW51ZTsKKwkJbWdyID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpKTsKKwkJYml0ID0gc3luY19sb3N0X2JpdHNbaV07CiAKLQkJCWlmIChvdmwtPmlkID09IDEpIHsKLQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7Ci0JCQkJZGlzcGNfZ28ob3ZsLT5tYW5hZ2VyLT5pZCk7Ci0JCQkJbWRlbGF5KDUwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwkJaWYgKGJpdCAmIGVycm9ycykgeworCQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gbWdyLT5kZXZpY2U7CisJCQlib29sIGVuYWJsZTsKIAotCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfVklEMl9GSUZPX1VOREVSRkxPVykgewotCQlEU1NFUlIoIlZJRDJfRklGT19VTkRFUkZMT1csIGRpc2FibGluZyBWSUQyXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKKwkJCURTU0VSUigiU1lOQ19MT1NUIG9uIGNoYW5uZWwgJXMsIHJlc3RhcnRpbmcgdGhlIG91dHB1dCAiCisJCQkJCSJ3aXRoIHZpZGVvIG92ZXJsYXlzIGRpc2FibGVkXG4iLAorCQkJCQltZ3ItPm5hbWUpOwogCi0JCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQljb250aW51ZTsKKwkJCWVuYWJsZSA9IGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisJCQlkc3NkZXYtPmRyaXZlci0+ZGlzYWJsZShkc3NkZXYpOwogCi0JCQlpZiAob3ZsLT5pZCA9PSAyKSB7Ci0JCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJCWRpc3BjX2dvKG92bC0+bWFuYWdlci0+aWQpOwotCQkJCW1kZWxheSg1MCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyb3JzICYgRElTUENfSVJRX1NZTkNfTE9TVCkgewotCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1hbmFnZXIgPSBOVUxMOwotCQlib29sIGVuYWJsZSA9IGZhbHNlOwotCi0JCURTU0VSUigiU1lOQ19MT1NULCBkaXNhYmxpbmcgTENEXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgewotCQkJCW1hbmFnZXIgPSBtZ3I7Ci0JCQkJZW5hYmxlID0gbWdyLT5kZXZpY2UtPnN0YXRlID09Ci0JCQkJCQlPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQkJCQltZ3ItPmRldmljZS0+ZHJpdmVyLT5kaXNhYmxlKG1nci0+ZGV2aWNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChtYW5hZ2VyKSB7Ci0JCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBtYW5hZ2VyLT5kZXZpY2U7CiAJCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKIAkJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CiAJCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CiAKLQkJCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAob3ZsLT5pZCAhPSAwICYmIG92bC0+bWFuYWdlciA9PSBtYW5hZ2VyKQotCQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQkJaWYgKG92bC0+aWQgIT0gT01BUF9EU1NfR0ZYICYmCisJCQkJCQlvdmwtPm1hbmFnZXIgPT0gbWdyKQorCQkJCQlkaXNwY19vdmxfZW5hYmxlKG92bC0+aWQsIGZhbHNlKTsKIAkJCX0KIAotCQkJZGlzcGNfZ28obWFuYWdlci0+aWQpOworCQkJZGlzcGNfbWdyX2dvKG1nci0+aWQpOwogCQkJbWRlbGF5KDUwKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJZHNzZGV2LT5kcml2ZXItPmVuYWJsZShkc3NkZXYpOwotCQl9Ci0JfQogCi0JaWYgKGVycm9ycyAmIERJU1BDX0lSUV9TWU5DX0xPU1RfRElHSVQpIHsKLQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyID0gTlVMTDsKLQkJYm9vbCBlbmFibGUgPSBmYWxzZTsKLQotCQlEU1NFUlIoIlNZTkNfTE9TVF9ESUdJVCwgZGlzYWJsaW5nIFRWXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKSB7Ci0JCQkJbWFuYWdlciA9IG1ncjsKLQkJCQllbmFibGUgPSBtZ3ItPmRldmljZS0+c3RhdGUgPT0KLQkJCQkJCU9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOwotCQkJCW1nci0+ZGV2aWNlLT5kcml2ZXItPmRpc2FibGUobWdyLT5kZXZpY2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1hbmFnZXIpIHsKLQkJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IG1hbmFnZXItPmRldmljZTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgewotCQkJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKLQkJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKLQotCQkJCWlmICghKG92bC0+Y2FwcyAmIE9NQVBfRFNTX09WTF9DQVBfRElTUEMpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChvdmwtPmlkICE9IDAgJiYgb3ZsLT5tYW5hZ2VyID09IG1hbmFnZXIpCi0JCQkJCWRpc3BjX2VuYWJsZV9wbGFuZShvdmwtPmlkLCAwKTsKLQkJCX0KLQotCQkJZGlzcGNfZ28obWFuYWdlci0+aWQpOwotCQkJbWRlbGF5KDUwKTsKLQkJCWlmIChlbmFibGUpCi0JCQkJZHNzZGV2LT5kcml2ZXItPmVuYWJsZShkc3NkZXYpOwotCQl9Ci0JfQotCi0JaWYgKGVycm9ycyAmIERJU1BDX0lSUV9TWU5DX0xPU1QyKSB7Ci0JCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlciA9IE5VTEw7Ci0JCWJvb2wgZW5hYmxlID0gZmFsc2U7Ci0KLQkJRFNTRVJSKCJTWU5DX0xPU1QgZm9yIExDRDIsIGRpc2FibGluZyBMQ0QyXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewotCQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCQltZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKGkpOwotCi0JCQlpZiAobWdyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpIHsKLQkJCQltYW5hZ2VyID0gbWdyOwotCQkJCWVuYWJsZSA9IG1nci0+ZGV2aWNlLT5zdGF0ZSA9PQotCQkJCQkJT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7Ci0JCQkJbWdyLT5kZXZpY2UtPmRyaXZlci0+ZGlzYWJsZShtZ3ItPmRldmljZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWFuYWdlcikgewotCQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gbWFuYWdlci0+ZGV2aWNlOwotCQkJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKSB7Ci0JCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwotCQkJCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOwotCi0JCQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKG92bC0+aWQgIT0gMCAmJiBvdmwtPm1hbmFnZXIgPT0gbWFuYWdlcikKLQkJCQkJZGlzcGNfZW5hYmxlX3BsYW5lKG92bC0+aWQsIDApOwotCQkJfQotCi0JCQlkaXNwY19nbyhtYW5hZ2VyLT5pZCk7Ci0JCQltZGVsYXkoNTApOwogCQkJaWYgKGVuYWJsZSkKIAkJCQlkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKGRzc2Rldik7CiAJCX0KQEAgLTM0ODIsOSArMzE4NSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CiAJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKIAkJCW1nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaSk7Ci0KLQkJCWlmIChtZ3ItPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKQotCQkJCW1nci0+ZGV2aWNlLT5kcml2ZXItPmRpc2FibGUobWdyLT5kZXZpY2UpOworCQkJbWdyLT5kZXZpY2UtPmRyaXZlci0+ZGlzYWJsZShtZ3ItPmRldmljZSk7CiAJCX0KIAl9CiAKQEAgLTM0OTIsNiArMzE5Myw4IEBACiAJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gZXJyb3JzOwogCV9vbWFwX2Rpc3BjX3NldF9pcnFzKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiB9CiAKIGludCBvbWFwX2Rpc3BjX3dhaXRfZm9yX2lycV90aW1lb3V0KHUzMiBpcnFtYXNrLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC0zNTg2LDYgKzMyODksOCBAQAogCWRpc3BjLmlycV9lcnJvcl9tYXNrID0gRElTUENfSVJRX01BU0tfRVJST1I7CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKIAkJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gRElTUENfSVJRX1NZTkNfTE9TVDI7CisJaWYgKGRzc19mZWF0X2dldF9udW1fb3ZscygpID4gMykKKwkJZGlzcGMuaXJxX2Vycm9yX21hc2sgfD0gRElTUENfSVJRX1ZJRDNfRklGT19VTkRFUkZMT1c7CiAKIAkvKiB0aGVyZSdzIFNZTkNfTE9TVF9ESUdJVCB3YWl0aW5nIGFmdGVyIGVuYWJsaW5nIHRoZSBEU1MsCiAJICogc28gY2xlYXIgaXQgKi8KQEAgLTM2MzUsNiArMzM0MCw4IEBACiAJZGlzcGNfcmVhZF9wbGFuZV9maWZvX3NpemVzKCk7CiAKIAlkaXNwY19jb25maWd1cmVfYnVyc3Rfc2l6ZXMoKTsKKworCWRpc3BjX292bF9lbmFibGVfem9yZGVyX3BsYW5lcygpOwogfQogCiAvKiBESVNQQyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwpAQCAtMzczNCw3ICszNDQxLDYgQEAKIHN0YXRpYyBpbnQgZGlzcGNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlkaXNwY19zYXZlX2NvbnRleHQoKTsKLQljbGtfZGlzYWJsZShkaXNwYy5kc3NfY2xrKTsKIAlkc3NfcnVudGltZV9wdXQoKTsKIAogCXJldHVybiAwOwpAQCAtMzc0OCw3ICszNDU0LDYgQEAKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCi0JY2xrX2VuYWJsZShkaXNwYy5kc3NfY2xrKTsKIAlkaXNwY19yZXN0b3JlX2NvbnRleHQoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmgKaW5kZXggNmM5ZWUwYS4uYzA2ZWZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5oCkBAIC0yOTEsNiArMjkxLDggQEAKIAkJcmV0dXJuIDB4MDBCQzsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDE0QzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMwMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMDQsNiArMzA2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMTYsNiArMzIwLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zMzAsNiArMzM2LDggQEAKIAkJcmV0dXJuIDB4MDU0NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDRCQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMxMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNDQsNiArMzUyLDggQEAKIAkJcmV0dXJuIDB4MDU0ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDRDMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMxNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNTYsNiArMzY2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5QzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zNjgsNiArMzgwLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAwQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zODEsNiArMzk1LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA3MDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0zOTUsNiArNDExLDggQEAKIAkJcmV0dXJuIDB4MDU2ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDREQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDMyQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MDgsNiArNDI2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA4QzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MjEsNiArNDQxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA4ODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00MzQsNiArNDU2LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAxQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00NDcsNiArNDcxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5ODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC00NTksNiArNDg1LDcgQEAKIAkJcmV0dXJuIDB4MDAzNDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJQlVHKCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC00NzIsNiArNDk5LDcgQEAKIAkJcmV0dXJuIDB4MDAzODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJQlVHKCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC00ODYsNiArNTE0LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyNDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5MDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MDAsNiArNTMwLDggQEAKIAkJcmV0dXJuIDB4MDU4MDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU1QzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MTMsNiArNTQ1LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDA5NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01MjcsNiArNTYxLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAyQzsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NDEsNiArNTc3LDggQEAKIAkJcmV0dXJuIDB4MDU4NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2MDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyODsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NTQsNiArNTkyLDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAzMDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAwNDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01NjgsNiArNjA4LDggQEAKIAkJcmV0dXJuIDB4MDU4ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2NDsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDQyQzsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01ODIsNiArNjI0LDggQEAKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDAzNCArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDAwMTAgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTU5Nyw2ICs2NDEsOCBAQAogCQlyZXR1cm4gMHgwNThDICsgaSAqIDB4ODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2OCArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDA0MzAgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTYxMSw2ICs2NTcsOCBAQAogCWNhc2UgT01BUF9EU1NfVklERU8xOgogCWNhc2UgT01BUF9EU1NfVklERU8yOgogCQlyZXR1cm4gMHgwMDM4ICsgaSAqIDB4ODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDAxNCArIGkgKiAweDg7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtNjI2LDYgKzY3NCw4IEBACiAJCXJldHVybiAweDA1OTAgKyBpICogODsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDU2QyArIGkgKiAweDg7CisJY2FzZSBPTUFQX0RTU19WSURFTzM6CisJCXJldHVybiAweDA0MzQgKyBpICogMHg4OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTYzOSw2ICs2ODksNyBAQAogCQlCVUcoKTsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMToKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKIAkJcmV0dXJuIDB4MDA3NCArIGkgKiAweDQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC02NTUsNiArNzA2LDggQEAKIAkJcmV0dXJuIDB4MDEyNCArIGkgKiAweDQ7CiAJY2FzZSBPTUFQX0RTU19WSURFTzI6CiAJCXJldHVybiAweDAwQjQgKyBpICogMHg0OworCWNhc2UgT01BUF9EU1NfVklERU8zOgorCQlyZXR1cm4gMHgwMDUwICsgaSAqIDB4NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC02NzAsNiArNzIzLDggQEAKIAkJcmV0dXJuIDB4MDVDQyArIGkgKiAweDQ7CiAJY2FzZSBPTUFQX0RTU19WSURFTzI6CiAJCXJldHVybiAweDA1QTggKyBpICogMHg0OworCWNhc2UgT01BUF9EU1NfVklERU8zOgorCQlyZXR1cm4gMHgwNDcwICsgaSAqIDB4NDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC02ODQsNiArNzM5LDggQEAKIAkJcmV0dXJuIDB4MDE3NDsKIAljYXNlIE9NQVBfRFNTX1ZJREVPMjoKIAkJcmV0dXJuIDB4MDBFODsKKwljYXNlIE9NQVBfRFNTX1ZJREVPMzoKKwkJcmV0dXJuIDB4MDBBMDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMKaW5kZXggOTQ0OTVlNC4uYmUzMzFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYwpAQCAtNDUsMTQgKzQ1LDEzIEBACiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWludCByLCBlbmFibGVkOworCWludCByOworCWJvb2wgZW5hYmxlZDsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmZW5hYmxlZCk7CisJciA9IHN0cnRvYm9vbChidWYsICZlbmFibGVkKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQllbmFibGVkID0gISFlbmFibGVkOwotCiAJaWYgKGVuYWJsZWQgIT0gKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkpIHsKIAkJaWYgKGVuYWJsZWQpIHsKIAkJCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlKGRzc2Rldik7CkBAIC03OSwxNyArNzgsMTYgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWludCB0ZSwgcjsKKwlpbnQgcjsKKwlib29sIHRlOwogCiAJaWYgKCFkc3NkZXYtPmRyaXZlci0+ZW5hYmxlX3RlIHx8ICFkc3NkZXYtPmRyaXZlci0+Z2V0X3RlKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdGUpOworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmdGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXRlID0gISF0ZTsKLQogCXIgPSBkc3NkZXYtPmRyaXZlci0+ZW5hYmxlX3RlKGRzc2RldiwgdGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTE5NSwxNyArMTkzLDE2IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKLQlpbnQgbWlycm9yLCByOworCWludCByOworCWJvb2wgbWlycm9yOwogCiAJaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvciB8fCAhZHNzZGV2LT5kcml2ZXItPmdldF9taXJyb3IpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JciA9IGtzdHJ0b2ludChidWYsIDAsICZtaXJyb3IpOworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmbWlycm9yKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQltaXJyb3IgPSAhIW1pcnJvcjsKLQogCXIgPSBkc3NkZXYtPmRyaXZlci0+c2V0X21pcnJvcihkc3NkZXYsIG1pcnJvcik7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMzAyLDExICsyOTksMTUgQEAKIAkJCXJldHVybiAxNjsKIAogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfREJJOgotCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgogCQlpZiAoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgPT0gMjQpCiAJCQlyZXR1cm4gMjQ7CiAJCWVsc2UKIAkJCXJldHVybiAxNjsKKwljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RTSToKKwkJaWYgKGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSA+IDE2KQorCQkJcmV0dXJuIDI0OworCQllbHNlCisJCQlyZXR1cm4gMTY7CiAJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOgogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfU0RJOgogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfSERNSToKQEAgLTM0Miw5ICszNDMsMTEgQEAKIAkJYnBwID0gMjQ7CiAJCWJyZWFrOwogCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfREJJOgotCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgogCQlicHAgPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZTsKIAkJYnJlYWs7CisJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EU0k6CisJCWJwcCA9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYwppbmRleCBmMDUzYjE4Li45NzZhYzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtODIsOSArODMsMTEgQEAKIAogCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShkc3NkZXYtPmNsb2Nrcy5kaXNwYy5kaXNwY19mY2xrX3NyYyk7CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwotCWlmIChyKQorCXIgPSBkaXNwY19tZ3Jfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOworCWlmIChyKSB7CisJCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CiAJCXJldHVybiByOworCX0KIAogCSpmY2sgPSBkc2lfY2luZm8uZHNpX3BsbF9oc2Rpdl9kaXNwY19jbGs7CiAJKmxja19kaXYgPSBkaXNwY19jaW5mby5sY2tfZGl2OwpAQCAtMTA5LDcgKzExMiw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTEyOSw3ICsxMzIsNyBAQAogCWJvb2wgaXNfdGZ0OwogCWludCByID0gMDsKIAotCWRpc3BjX3NldF9wb2xfZnJlcShkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPnBhbmVsLmNvbmZpZywKKwlkaXNwY19tZ3Jfc2V0X3BvbF9mcmVxKGRzc2Rldi0+bWFuYWdlci0+aWQsIGRzc2Rldi0+cGFuZWwuY29uZmlnLAogCQkJZHNzZGV2LT5wYW5lbC5hY2JpLCBkc3NkZXYtPnBhbmVsLmFjYik7CiAKIAlpc190ZnQgPSAoZHNzZGV2LT5wYW5lbC5jb25maWcgJiBPTUFQX0RTU19MQ0RfVEZUKSAhPSAwOwpAQCAtMTUzLDcgKzE1Niw3IEBACiAJCXQtPnBpeGVsX2Nsb2NrID0gcGNrOwogCX0KIAotCWRpc3BjX3NldF9sY2RfdGltaW5ncyhkc3NkZXYtPm1hbmFnZXItPmlkLCB0KTsKKwlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsIHQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjQsMTEgKzE2NywxMiBAQAogCiAJaXNfdGZ0ID0gKGRzc2Rldi0+cGFuZWwuY29uZmlnICYgT01BUF9EU1NfTENEX1RGVCkgIT0gMDsKIAotCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLAotCQkJT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUyk7Ci0JZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgaXNfdGZ0ID8KKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9CWVBBU1MpOworCWRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsIGZhbHNlKTsKKworCWRpc3BjX21ncl9zZXRfbGNkX2Rpc3BsYXlfdHlwZShkc3NkZXYtPm1hbmFnZXItPmlkLCBpc190ZnQgPwogCQkJT01BUF9EU1NfTENEX0RJU1BMQVlfVEZUIDogT01BUF9EU1NfTENEX0RJU1BMQVlfU1ROKTsKLQlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKKwlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCiAJCQlkc3NkZXYtPnBoeS5kcGkuZGF0YV9saW5lcyk7CiB9CiAKQEAgLTE3Niw2ICsxODAsMTEgQEAKIHsKIAlpbnQgcjsKIAorCWlmIChkc3NkZXYtPm1hbmFnZXIgPT0gTlVMTCkgeworCQlEU1NFUlIoImZhaWxlZCB0byBlbmFibGUgZGlzcGxheTogbm8gbWFuYWdlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtMjc3LDcgKzI4Niw3IEBACiAJCX0KIAogCQlkcGlfc2V0X21vZGUoZHNzZGV2KTsKLQkJZGlzcGNfZ28oZHNzZGV2LT5tYW5hZ2VyLT5pZCk7CisJCWRpc3BjX21ncl9nbyhkc3NkZXYtPm1hbmFnZXItPmlkKTsKIAogCQlkaXNwY19ydW50aW1lX3B1dCgpOwogCQlkc3NfcnVudGltZV9wdXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKaW5kZXggN2FkYmJlYi4uNWFiZjhlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHZpZGVvL21pcGlfZGlzcGxheS5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KIAogI2luY2x1ZGUgImRzcy5oIgpAQCAtMTMxLDcgKzEzMyw3IEBACiAjZGVmaW5lIERTSV9JUlFfVEFfVElNRU9VVAkoMSA8PCAyMCkKICNkZWZpbmUgRFNJX0lSUV9FUlJPUl9NQVNLIFwKIAkoRFNJX0lSUV9IU19UWF9USU1FT1VUIHwgRFNJX0lSUV9MUF9SWF9USU1FT1VUIHwgRFNJX0lSUV9TWU5DX0xPU1QgfCBcCi0JRFNJX0lSUV9UQV9USU1FT1VUKQorCURTSV9JUlFfVEFfVElNRU9VVCB8IERTSV9JUlFfU1lOQ19MT1NUKQogI2RlZmluZSBEU0lfSVJRX0NIQU5ORUxfTUFTSwkweGYKIAogLyogVmlydHVhbCBjaGFubmVsIGludGVycnVwdHMgKi8KQEAgLTE5OCwxOCArMjAwLDYgQEAKIAkgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMF80IHwgRFNJX0NJT19JUlFfRVJSQ09OVEVOVElPTkxQMV80IHwgXAogCSBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAwXzUgfCBEU0lfQ0lPX0lSUV9FUlJDT05URU5USU9OTFAxXzUpCiAKLSNkZWZpbmUgRFNJX0RUX0RDU19TSE9SVF9XUklURV8wCTB4MDUKLSNkZWZpbmUgRFNJX0RUX0RDU19TSE9SVF9XUklURV8xCTB4MTUKLSNkZWZpbmUgRFNJX0RUX0RDU19SRUFECQkJMHgwNgotI2RlZmluZSBEU0lfRFRfU0VUX01BWF9SRVRfUEtHX1NJWkUJMHgzNwotI2RlZmluZSBEU0lfRFRfTlVMTF9QQUNLRVQJCTB4MDkKLSNkZWZpbmUgRFNJX0RUX0RDU19MT05HX1dSSVRFCQkweDM5Ci0KLSNkZWZpbmUgRFNJX0RUX1JYX0FDS19XSVRIX0VSUgkJMHgwMgotI2RlZmluZSBEU0lfRFRfUlhfRENTX0xPTkdfUkVBRAkJMHgxYwotI2RlZmluZSBEU0lfRFRfUlhfU0hPUlRfUkVBRF8xCQkweDIxCi0jZGVmaW5lIERTSV9EVF9SWF9TSE9SVF9SRUFEXzIJCTB4MjIKLQogdHlwZWRlZiB2b2lkICgqb21hcF9kc2lfaXNyX3QpICh2b2lkICphcmcsIHUzMiBtYXNrKTsKIAogI2RlZmluZSBEU0lfTUFYX05SX0lTUlMgICAgICAgICAgICAgICAgMgpAQCAtMjI4LDkgKzIxOCw5IEBACiAJRFNJX0ZJRk9fU0laRV8xMjgJPSA0LAogfTsKIAotZW51bSBkc2lfdmNfbW9kZSB7Ci0JRFNJX1ZDX01PREVfTDQgPSAwLAotCURTSV9WQ19NT0RFX1ZQLAorZW51bSBkc2lfdmNfc291cmNlIHsKKwlEU0lfVkNfU09VUkNFX0w0ID0gMCwKKwlEU0lfVkNfU09VUkNFX1ZQLAogfTsKIAogZW51bSBkc2lfbGFuZSB7CkBAIC0yNzQsNyArMjY0LDggQEAKIAlzdHJ1Y3QgY2xrICpkc3NfY2xrOwogCXN0cnVjdCBjbGsgKnN5c19jbGs7CiAKLQl2b2lkICgqZHNpX211eF9wYWRzKShib29sIGVuYWJsZSk7CisJaW50ICgqZW5hYmxlX3BhZHMpKGludCBkc2lfaWQsIHVuc2lnbmVkIGxhbmVfbWFzayk7CisJdm9pZCAoKmRpc2FibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKIAogCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBjdXJyZW50X2NpbmZvOwogCkBAIC0yODIsNyArMjczLDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yICp2ZGRzX2RzaV9yZWc7CiAKIAlzdHJ1Y3QgewotCQllbnVtIGRzaV92Y19tb2RlIG1vZGU7CisJCWVudW0gZHNpX3ZjX3NvdXJjZSBzb3VyY2U7CiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKIAkJZW51bSBmaWZvX3NpemUgZmlmb19zaXplOwogCQlpbnQgdmNfaWQ7CkBAIC0zNjgsMTQgKzM1OSw5IEBACiAJcmV0dXJuIGRzaV9wZGV2X21hcFttb2R1bGVdOwogfQogCi1zdGF0aWMgaW50IGRzaV9nZXRfZHNpZGV2X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRzaV9nZXRfZHNpZGV2X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKLQkvKiBURU1QOiBQYXNzIDAgYXMgdGhlIGRzaSBtb2R1bGUgaW5kZXggdGlsbCB0aGUgdGltZSB0aGUgZHNpIHBsYXRmb3JtCi0JICogZGV2aWNlIG5hbWVzIGFyZW4ndCBjaGFuZ2VkIHRvIHRoZSBmb3JtICJvbWFwZHNzX2RzaS4wIiwKLQkgKiAib21hcGRzc19kc2kuMSIgYW5kIHNvIG9uICovCi0JQlVHX09OKGRzaWRldi0+aWQgIT0gLTEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRzaWRldi0+aWQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkc2lfd3JpdGVfcmVnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKQEAgLTQzNyw2ICs0MjMsMjEgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3U4IGRzaV9nZXRfcGl4ZWxfc2l6ZShlbnVtIG9tYXBfZHNzX2RzaV9waXhlbF9mb3JtYXQgZm10KQoreworCXN3aXRjaCAoZm10KSB7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjg4ODoKKwljYXNlIE9NQVBfRFNTX0RTSV9GTVRfUkdCNjY2OgorCQlyZXR1cm4gMjQ7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJCXJldHVybiAxODsKKwljYXNlIE9NQVBfRFNTX0RTSV9GTVRfUkdCNTY1OgorCQlyZXR1cm4gMTY7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCiAjaWZkZWYgREVCVUcKIHN0YXRpYyB2b2lkIGRzaV9wZXJmX21hcmtfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewpAQCAtNDUzLDYgKzQ1NCw3IEBACiBzdGF0aWMgdm9pZCBkc2lfcGVyZl9zaG93KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBkc2ktPnVwZGF0ZV9yZWdpb24uZGV2aWNlOwogCWt0aW1lX3QgdCwgc2V0dXBfdGltZSwgdHJhbnNfdGltZTsKIAl1MzIgdG90YWxfYnl0ZXM7CiAJdTMyIHNldHVwX3VzLCB0cmFuc191cywgdG90YWxfdXM7CkBAIC00NzYsNyArNDc4LDcgQEAKIAogCXRvdGFsX2J5dGVzID0gZHNpLT51cGRhdGVfcmVnaW9uLncgKgogCQlkc2ktPnVwZGF0ZV9yZWdpb24uaCAqCi0JCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7CisJCWRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSAvIDg7CiAKIAlwcmludGsoS0VSTl9JTkZPICJEU0koJXMpOiAldSB1cyArICV1IHVzID0gJXUgdXMgKCV1SHopLCAiCiAJCQkiJXUgYnl0ZXMsICV1IGtieXRlcy9zZWNcbiIsCkBAIC0xMjg3LDcgKzEyODksNyBAQAogCQkgKiB3aXRoIERTU19TWVNfQ0xLIHNvdXJjZSBhbHNvICovCiAJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CiAJfSBlbHNlIHsKLQkJY2luZm8tPmNsa2luID0gZGlzcGNfcGNsa19yYXRlKGRzc2Rldi0+bWFuYWdlci0+aWQpOworCQljaW5mby0+Y2xraW4gPSBkaXNwY19tZ3JfcGNsa19yYXRlKGRzc2Rldi0+bWFuYWdlci0+aWQpOwogCiAJCWlmIChjaW5mby0+Y2xraW4gPCAzMjAwMDAwMCkKIAkJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CkBAIC0yMzYwLDYgKzIzNjIsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGRzaV9nZXRfbGFuZV9tYXNrKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwl1bnNpZ25lZCBsYW5lcyA9IDA7CisKKwlpZiAoZHNzZGV2LT5waHkuZHNpLmNsa19sYW5lICE9IDApCisJCWxhbmVzIHw9IDEgPDwgKGRzc2Rldi0+cGh5LmRzaS5jbGtfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTFfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTFfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTJfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTJfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTNfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTNfbGFuZSAtIDEpOworCWlmIChkc3NkZXYtPnBoeS5kc2kuZGF0YTRfbGFuZSAhPSAwKQorCQlsYW5lcyB8PSAxIDw8IChkc3NkZXYtPnBoeS5kc2kuZGF0YTRfbGFuZSAtIDEpOworCisJcmV0dXJuIGxhbmVzOworfQorCiBzdGF0aWMgaW50IGRzaV9jaW9faW5pdChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKQEAgLTIzNzAsOCArMjM5MCw5IEBACiAKIAlEU1NEQkdGKCk7CiAKLQlpZiAoZHNpLT5kc2lfbXV4X3BhZHMpCi0JCWRzaS0+ZHNpX211eF9wYWRzKHRydWUpOworCXIgPSBkc2ktPmVuYWJsZV9wYWRzKGRzaWRldi0+aWQsIGRzaV9nZXRfbGFuZV9tYXNrKGRzc2RldikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCWRzaV9lbmFibGVfc2NwX2Nsayhkc2lkZXYpOwogCkBAIC0yNDUyLDYgKzI0NzMsMTIgQEAKIAogCWRzaV9jaW9fdGltaW5ncyhkc2lkZXYpOwogCisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX1ZJREVPX01PREUpIHsKKwkJLyogRERSX0NMS19BTFdBWVNfT04gKi8KKwkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfQ0xLX0NUUkwsCisJCQlkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmRkcl9jbGtfYWx3YXlzX29uLCAxMywgMTMpOworCX0KKwogCWRzaS0+dWxwc19lbmFibGVkID0gZmFsc2U7CiAKIAlEU1NEQkcoIkNJTyBpbml0IGRvbmVcbiIpOwpAQCAtMjQ2NywxOSArMjQ5NCwyMSBAQAogCQlkc2lfY2lvX2Rpc2FibGVfbGFuZV9vdmVycmlkZShkc2lkZXYpOwogZXJyX3NjcF9jbGtfZG9tOgogCWRzaV9kaXNhYmxlX3NjcF9jbGsoZHNpZGV2KTsKLQlpZiAoZHNpLT5kc2lfbXV4X3BhZHMpCi0JCWRzaS0+ZHNpX211eF9wYWRzKGZhbHNlKTsKKwlkc2ktPmRpc2FibGVfcGFkcyhkc2lkZXYtPmlkLCBkc2lfZ2V0X2xhbmVfbWFzayhkc3NkZXYpKTsKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIHZvaWQgZHNpX2Npb191bmluaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQorc3RhdGljIHZvaWQgZHNpX2Npb191bmluaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CiAJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKKwkvKiBERFJfQ0xLX0FMV0FZU19PTiAqLworCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX0NMS19DVFJMLCAwLCAxMywgMTMpOworCiAJZHNpX2Npb19wb3dlcihkc2lkZXYsIERTSV9DT01QTEVYSU9fUE9XRVJfT0ZGKTsKIAlkc2lfZGlzYWJsZV9zY3BfY2xrKGRzaWRldik7Ci0JaWYgKGRzaS0+ZHNpX211eF9wYWRzKQotCQlkc2ktPmRzaV9tdXhfcGFkcyhmYWxzZSk7CisJZHNpLT5kaXNhYmxlX3BhZHMoZHNpZGV2LT5pZCwgZHNpX2dldF9sYW5lX21hc2soZHNzZGV2KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRzaV9jb25maWdfdHhfZmlmbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsCkBAIC0yNjY5LDEwICsyNjk4LDEwIEBACiAJaWYgKCFkc2lfdmNfaXNfZW5hYmxlZChkc2lkZXYsIGNoYW5uZWwpKQogCQlyZXR1cm4gMDsKIAotCXN3aXRjaCAoZHNpLT52Y1tjaGFubmVsXS5tb2RlKSB7Ci0JY2FzZSBEU0lfVkNfTU9ERV9WUDoKKwlzd2l0Y2ggKGRzaS0+dmNbY2hhbm5lbF0uc291cmNlKSB7CisJY2FzZSBEU0lfVkNfU09VUkNFX1ZQOgogCQlyZXR1cm4gZHNpX3N5bmNfdmNfdnAoZHNpZGV2LCBjaGFubmVsKTsKLQljYXNlIERTSV9WQ19NT0RFX0w0OgorCWNhc2UgRFNJX1ZDX1NPVVJDRV9MNDoKIAkJcmV0dXJuIGRzaV9zeW5jX3ZjX2w0KGRzaWRldiwgY2hhbm5lbCk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC0yNzI2LDQzICsyNzU1LDEyIEBACiAJZHNpX3dyaXRlX3JlZyhkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCByKTsKIH0KIAotc3RhdGljIGludCBkc2lfdmNfY29uZmlnX2w0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgaW50IGNoYW5uZWwpCitzdGF0aWMgaW50IGRzaV92Y19jb25maWdfc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgaW50IGNoYW5uZWwsCisJCWVudW0gZHNpX3ZjX3NvdXJjZSBzb3VyY2UpCiB7CiAJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKLQlpZiAoZHNpLT52Y1tjaGFubmVsXS5tb2RlID09IERTSV9WQ19NT0RFX0w0KQotCQlyZXR1cm4gMDsKLQotCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7Ci0KLQlkc2lfc3luY192Yyhkc2lkZXYsIGNoYW5uZWwpOwotCi0JZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIDApOwotCi0JLyogVkNfQlVTWSAqLwotCWlmICh3YWl0X2Zvcl9iaXRfY2hhbmdlKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDE1LCAwKSAhPSAwKSB7Ci0JCURTU0VSUigidmMoJWQpIGJ1c3kgd2hlbiB0cnlpbmcgdG8gY29uZmlnIGZvciBMNFxuIiwgY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCksIDAsIDEsIDEpOyAvKiBTT1VSQ0UsIDAgPSBMNCAqLwotCi0JLyogRENTX0NNRF9FTkFCTEUgKi8KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkKLQkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMCwgMzAsIDMwKTsKLQotCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCAxKTsKLQotCWRzaS0+dmNbY2hhbm5lbF0ubW9kZSA9IERTSV9WQ19NT0RFX0w0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHNpX3ZjX2NvbmZpZ192cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsIGludCBjaGFubmVsKQotewotCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwotCi0JaWYgKGRzaS0+dmNbY2hhbm5lbF0ubW9kZSA9PSBEU0lfVkNfTU9ERV9WUCkKKwlpZiAoZHNpLT52Y1tjaGFubmVsXS5zb3VyY2UgPT0gc291cmNlKQogCQlyZXR1cm4gMDsKIAogCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7CkBAIC0yNzc3LDIxICsyNzc1LDIyIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCS8qIFNPVVJDRSwgMSA9IHZpZGVvIHBvcnQgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAxLCAxLCAxKTsKKwkvKiBTT1VSQ0UsIDAgPSBMNCwgMSA9IHZpZGVvIHBvcnQgKi8KKwlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCBzb3VyY2UsIDEsIDEpOwogCiAJLyogRENTX0NNRF9FTkFCTEUgKi8KLQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkKLQkJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMSwgMzAsIDMwKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkgeworCQlib29sIGVuYWJsZSA9IHNvdXJjZSA9PSBEU0lfVkNfU09VUkNFX1ZQOworCQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCBlbmFibGUsIDMwLCAzMCk7CisJfQogCiAJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIDEpOwogCi0JZHNpLT52Y1tjaGFubmVsXS5tb2RlID0gRFNJX1ZDX01PREVfVlA7CisJZHNpLT52Y1tjaGFubmVsXS5zb3VyY2UgPSBzb3VyY2U7CiAKIAlyZXR1cm4gMDsKIH0KIAotCiB2b2lkIG9tYXBkc3NfZHNpX3ZjX2VuYWJsZV9ocyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAogCQlib29sIGVuYWJsZSkKIHsKQEAgLTI4MTAsNiArMjgwOSwxMCBAQAogCWRzaV9pZl9lbmFibGUoZHNpZGV2LCAxKTsKIAogCWRzaV9mb3JjZV90eF9zdG9wX21vZGVfaW8oZHNpZGV2KTsKKworCS8qIHN0YXJ0IHRoZSBERFIgY2xvY2sgYnkgc2VuZGluZyBhIE5VTEwgcGFja2V0ICovCisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuZGRyX2Nsa19hbHdheXNfb24gJiYgZW5hYmxlKQorCQlkc2lfdmNfc2VuZF9udWxsKGRzc2RldiwgY2hhbm5lbCk7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBkc3NfZHNpX3ZjX2VuYWJsZV9ocyk7CiAKQEAgLTI4NzMsMTYgKzI4NzYsMTYgQEAKIAkJdmFsID0gZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX1NIT1JUX1BBQ0tFVF9IRUFERVIoY2hhbm5lbCkpOwogCQlEU1NFUlIoIlx0cmF3dmFsICUjMDh4XG4iLCB2YWwpOwogCQlkdCA9IEZMRF9HRVQodmFsLCA1LCAwKTsKLQkJaWYgKGR0ID09IERTSV9EVF9SWF9BQ0tfV0lUSF9FUlIpIHsKKwkJaWYgKGR0ID09IE1JUElfRFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQpIHsKIAkJCXUxNiBlcnIgPSBGTERfR0VUKHZhbCwgMjMsIDgpOwogCQkJZHNpX3Nob3dfcnhfYWNrX3dpdGhfZXJyKGVycik7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMSkgeworCQl9IGVsc2UgaWYgKGR0ID09IE1JUElfRFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFKSB7CiAJCQlEU1NFUlIoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUjeFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX1NIT1JUX1JFQURfMikgeworCQl9IGVsc2UgaWYgKGR0ID09IE1JUElfRFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFKSB7CiAJCQlEU1NFUlIoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAyIGJ5dGU6ICUjeFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7Ci0JCX0gZWxzZSBpZiAoZHQgPT0gRFNJX0RUX1JYX0RDU19MT05HX1JFQUQpIHsKKwkJfSBlbHNlIGlmIChkdCA9PSBNSVBJX0RTSV9SWF9EQ1NfTE9OR19SRUFEX1JFU1BPTlNFKSB7CiAJCQlEU1NFUlIoIlx0RENTIGxvbmcgcmVzcG9uc2UsIGxlbiAlZFxuIiwKIAkJCQkJRkxEX0dFVCh2YWwsIDIzLCA4KSk7CiAJCQlkc2lfdmNfZmx1c2hfbG9uZ19kYXRhKGRzaWRldiwgY2hhbm5lbCk7CkBAIC0zMDA3LDcgKzMwMTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkc2lfdmNfY29uZmlnX2w0KGRzaWRldiwgY2hhbm5lbCk7CisJZHNpX3ZjX2NvbmZpZ19zb3VyY2UoZHNpZGV2LCBjaGFubmVsLCBEU0lfVkNfU09VUkNFX0w0KTsKIAogCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIGRhdGFfdHlwZSwgbGVuLCBlY2MpOwogCkBAIC0zMDY2LDcgKzMwNjksNyBAQAogCQkJCWNoYW5uZWwsCiAJCQkJZGF0YV90eXBlLCBkYXRhICYgMHhmZiwgKGRhdGEgPj4gOCkgJiAweGZmKTsKIAotCWRzaV92Y19jb25maWdfbDQoZHNpZGV2LCBjaGFubmVsKTsKKwlkc2lfdmNfY29uZmlnX3NvdXJjZShkc2lkZXYsIGNoYW5uZWwsIERTSV9WQ19TT1VSQ0VfTDQpOwogCiAJaWYgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX0NUUkwoY2hhbm5lbCkpLCAxNiwgMTYpKSB7CiAJCURTU0VSUigiRVJST1IgRklGTyBGVUxMLCBhYm9ydGluZyB0cmFuc2ZlclxuIik7CkBAIC0zMDg1LDQ0ICszMDg4LDY2IEBACiBpbnQgZHNpX3ZjX3NlbmRfbnVsbChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7Ci0JdTggbnVsbHBrZ1tdID0gezAsIDAsIDAsIDB9OwogCi0JcmV0dXJuIGRzaV92Y19zZW5kX2xvbmcoZHNpZGV2LCBjaGFubmVsLCBEU0lfRFRfTlVMTF9QQUNLRVQsIG51bGxwa2csCi0JCTQsIDApOworCXJldHVybiBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwgTUlQSV9EU0lfTlVMTF9QQUNLRVQsIE5VTEwsCisJCTAsIDApOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfc2VuZF9udWxsKTsKIAotaW50IGRzaV92Y19kY3Nfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCi0JCXU4ICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBkc2lfdmNfd3JpdGVfbm9zeW5jX2NvbW1vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCWludCBjaGFubmVsLCB1OCAqZGF0YSwgaW50IGxlbiwgZW51bSBkc3NfZHNpX2NvbnRlbnRfdHlwZSB0eXBlKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CiAJaW50IHI7CiAKLQlCVUdfT04obGVuID09IDApOwotCi0JaWYgKGxlbiA9PSAxKSB7Ci0JCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsIERTSV9EVF9EQ1NfU0hPUlRfV1JJVEVfMCwKLQkJCQlkYXRhWzBdLCAwKTsKKwlpZiAobGVuID09IDApIHsKKwkJQlVHX09OKHR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0RDUyk7CisJCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsCisJCQkJTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8wX1BBUkFNLCAwLCAwKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CisJCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/CisJCQkJTUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8xX1BBUkFNIDoKKwkJCQlNSVBJX0RTSV9EQ1NfU0hPUlRfV1JJVEUsIGRhdGFbMF0sIDApOwogCX0gZWxzZSBpZiAobGVuID09IDIpIHsKLQkJciA9IGRzaV92Y19zZW5kX3Nob3J0KGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19TSE9SVF9XUklURV8xLAorCQlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLAorCQkJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPworCQkJCU1JUElfRFNJX0dFTkVSSUNfU0hPUlRfV1JJVEVfMl9QQVJBTSA6CisJCQkJTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFX1BBUkFNLAogCQkJCWRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSwgMCk7CiAJfSBlbHNlIHsKLQkJLyogMHgzOSA9IERDUyBMb25nIFdyaXRlICovCi0JCXIgPSBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19MT05HX1dSSVRFLAotCQkJCWRhdGEsIGxlbiwgMCk7CisJCXIgPSBkc2lfdmNfc2VuZF9sb25nKGRzaWRldiwgY2hhbm5lbCwKKwkJCQl0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCQlNSVBJX0RTSV9HRU5FUklDX0xPTkdfV1JJVEUgOgorCQkJCU1JUElfRFNJX0RDU19MT05HX1dSSVRFLCBkYXRhLCBsZW4sIDApOwogCX0KIAogCXJldHVybiByOwogfQorCitpbnQgZHNpX3ZjX2Rjc193cml0ZV9ub3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIGRzaV92Y193cml0ZV9ub3N5bmNfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLAorCQkJRFNTX0RTSV9DT05URU5UX0RDUyk7Cit9CiBFWFBPUlRfU1lNQk9MKGRzaV92Y19kY3Nfd3JpdGVfbm9zeW5jKTsKIAotaW50IGRzaV92Y19kY3Nfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCi0JCWludCBsZW4pCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuKQoreworCXJldHVybiBkc2lfdmNfd3JpdGVfbm9zeW5jX2NvbW1vbihkc3NkZXYsIGNoYW5uZWwsIGRhdGEsIGxlbiwKKwkJCURTU19EU0lfQ09OVEVOVF9HRU5FUklDKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKTsKKworc3RhdGljIGludCBkc2lfdmNfd3JpdGVfY29tbW9uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuLCBlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKIAlpbnQgcjsKIAotCXIgPSBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhkc3NkZXYsIGNoYW5uZWwsIGRhdGEsIGxlbik7CisJciA9IGRzaV92Y193cml0ZV9ub3N5bmNfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLCB0eXBlKTsKIAlpZiAocikKIAkJZ290byBlcnI7CiAKQEAgLTMxNDAsMTggKzMxNjUsMzkgQEAKIAogCXJldHVybiAwOwogZXJyOgotCURTU0VSUigiZHNpX3ZjX2Rjc193cml0ZShjaCAlZCwgY21kIDB4JTAyeCwgbGVuICVkKSBmYWlsZWRcbiIsCisJRFNTRVJSKCJkc2lfdmNfd3JpdGVfY29tbW9uKGNoICVkLCBjbWQgMHglMDJ4LCBsZW4gJWQpIGZhaWxlZFxuIiwKIAkJCWNoYW5uZWwsIGRhdGFbMF0sIGxlbik7CiAJcmV0dXJuIHI7CiB9CisKK2ludCBkc2lfdmNfZGNzX3dyaXRlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4ICpkYXRhLAorCQlpbnQgbGVuKQoreworCXJldHVybiBkc2lfdmNfd3JpdGVfY29tbW9uKGRzc2RldiwgY2hhbm5lbCwgZGF0YSwgbGVuLAorCQkJRFNTX0RTSV9DT05URU5UX0RDUyk7Cit9CiBFWFBPUlRfU1lNQk9MKGRzaV92Y19kY3Nfd3JpdGUpOwogCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCisJCWludCBsZW4pCit7CisJcmV0dXJuIGRzaV92Y193cml0ZV9jb21tb24oZHNzZGV2LCBjaGFubmVsLCBkYXRhLCBsZW4sCisJCQlEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyk7Cit9CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3dyaXRlKTsKKwogaW50IGRzaV92Y19kY3Nfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kKQogewogCXJldHVybiBkc2lfdmNfZGNzX3dyaXRlKGRzc2RldiwgY2hhbm5lbCwgJmRjc19jbWQsIDEpOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3dyaXRlXzApOwogCitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsKQoreworCXJldHVybiBkc2lfdmNfZ2VuZXJpY193cml0ZShkc3NkZXYsIGNoYW5uZWwsIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZ2VuZXJpY193cml0ZV8wKTsKKwogaW50IGRzaV92Y19kY3Nfd3JpdGVfMShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAogCQl1OCBwYXJhbSkKIHsKQEAgLTMxNjIsMjYgKzMyMDgsODggQEAKIH0KIEVYUE9SVF9TWU1CT0woZHNpX3ZjX2Rjc193cml0ZV8xKTsKIAotaW50IGRzaV92Y19kY3NfcmVhZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAotCQl1OCAqYnVmLCBpbnQgYnVmbGVuKQoraW50IGRzaV92Y19nZW5lcmljX3dyaXRlXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggcGFyYW0pCit7CisJcmV0dXJuIGRzaV92Y19nZW5lcmljX3dyaXRlKGRzc2RldiwgY2hhbm5lbCwgJnBhcmFtLCAxKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfd3JpdGVfMSk7CisKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtMSwgdTggcGFyYW0yKQoreworCXU4IGJ1ZlsyXTsKKwlidWZbMF0gPSBwYXJhbTE7CisJYnVmWzFdID0gcGFyYW0yOworCXJldHVybiBkc2lfdmNfZ2VuZXJpY193cml0ZShkc3NkZXYsIGNoYW5uZWwsIGJ1ZiwgMik7Cit9CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3dyaXRlXzIpOworCitzdGF0aWMgaW50IGRzaV92Y19kY3Nfc2VuZF9yZWFkX3JlcXVlc3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOwogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCWludCByOworCisJaWYgKGRzaS0+ZGVidWdfcmVhZCkKKwkJRFNTREJHKCJkc2lfdmNfZGNzX3NlbmRfcmVhZF9yZXF1ZXN0KGNoJWQsIGRjc19jbWQgJXgpXG4iLAorCQkJY2hhbm5lbCwgZGNzX2NtZCk7CisKKwlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLCBNSVBJX0RTSV9EQ1NfUkVBRCwgZGNzX2NtZCwgMCk7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZGNzX3NlbmRfcmVhZF9yZXF1ZXN0KGNoICVkLCBjbWQgMHglMDJ4KSIKKwkJCSIgZmFpbGVkXG4iLCBjaGFubmVsLCBkY3NfY21kKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlpbnQgY2hhbm5lbCwgdTggKnJlcWRhdGEsIGludCByZXFsZW4pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKwl1MTYgZGF0YTsKKwl1OCBkYXRhX3R5cGU7CisJaW50IHI7CisKKwlpZiAoZHNpLT5kZWJ1Z19yZWFkKQorCQlEU1NEQkcoImRzaV92Y19nZW5lcmljX3NlbmRfcmVhZF9yZXF1ZXN0KGNoICVkLCByZXFsZW4gJWQpXG4iLAorCQkJY2hhbm5lbCwgcmVxbGVuKTsKKworCWlmIChyZXFsZW4gPT0gMCkgeworCQlkYXRhX3R5cGUgPSBNSVBJX0RTSV9HRU5FUklDX1JFQURfUkVRVUVTVF8wX1BBUkFNOworCQlkYXRhID0gMDsKKwl9IGVsc2UgaWYgKHJlcWxlbiA9PSAxKSB7CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX0dFTkVSSUNfUkVBRF9SRVFVRVNUXzFfUEFSQU07CisJCWRhdGEgPSByZXFkYXRhWzBdOworCX0gZWxzZSBpZiAocmVxbGVuID09IDIpIHsKKwkJZGF0YV90eXBlID0gTUlQSV9EU0lfR0VORVJJQ19SRUFEX1JFUVVFU1RfMl9QQVJBTTsKKwkJZGF0YSA9IHJlcWRhdGFbMF0gfCAocmVxZGF0YVsxXSA8PCA4KTsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisKKwlyID0gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLCBkYXRhX3R5cGUsIGRhdGEsIDApOworCWlmIChyKSB7CisJCURTU0VSUigiZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3QoY2ggJWQsIHJlcWxlbiAlZCkiCisJCQkiIGZhaWxlZFxuIiwgY2hhbm5lbCwgcmVxbGVuKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3ZjX3JlYWRfcnhfZmlmbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsIGludCBjaGFubmVsLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuLCBlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHR5cGUpCit7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAJdTMyIHZhbDsKIAl1OCBkdDsKIAlpbnQgcjsKIAotCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCURTU0RCRygiZHNpX3ZjX2Rjc19yZWFkKGNoJWQsIGRjc19jbWQgJXgpXG4iLCBjaGFubmVsLCBkY3NfY21kKTsKLQotCXIgPSBkc2lfdmNfc2VuZF9zaG9ydChkc2lkZXYsIGNoYW5uZWwsIERTSV9EVF9EQ1NfUkVBRCwgZGNzX2NtZCwgMCk7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCi0JciA9IGRzaV92Y19zZW5kX2J0YV9zeW5jKGRzc2RldiwgY2hhbm5lbCk7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCiAJLyogUlhfRklGT19OT1RfRU1QVFkgKi8KIAlpZiAoUkVHX0dFVChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAyMCwgMjApID09IDApIHsKIAkJRFNTRVJSKCJSWCBmaWZvIGVtcHR5IHdoZW4gdHJ5aW5nIHRvIHJlYWQuXG4iKTsKQEAgLTMxOTMsMTYgKzMzMDEsMjAgQEAKIAlpZiAoZHNpLT5kZWJ1Z19yZWFkKQogCQlEU1NEQkcoIlx0aGVhZGVyOiAlMDh4XG4iLCB2YWwpOwogCWR0ID0gRkxEX0dFVCh2YWwsIDUsIDApOwotCWlmIChkdCA9PSBEU0lfRFRfUlhfQUNLX1dJVEhfRVJSKSB7CisJaWYgKGR0ID09IE1JUElfRFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQpIHsKIAkJdTE2IGVyciA9IEZMRF9HRVQodmFsLCAyMywgOCk7CiAJCWRzaV9zaG93X3J4X2Fja193aXRoX2VycihlcnIpOwogCQlyID0gLUVJTzsKIAkJZ290byBlcnI7CiAKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzEpIHsKKwl9IGVsc2UgaWYgKGR0ID09ICh0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCU1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURSkpIHsKIAkJdTggZGF0YSA9IEZMRF9HRVQodmFsLCAxNSwgOCk7CiAJCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCQlEU1NEQkcoIlx0RENTIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUwMnhcbiIsIGRhdGEpOworCQkJRFNTREJHKCJcdCVzIHNob3J0IHJlc3BvbnNlLCAxIGJ5dGU6ICUwMnhcbiIsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/ICJHRU5FUklDIiA6CisJCQkJIkRDUyIsIGRhdGEpOwogCiAJCWlmIChidWZsZW4gPCAxKSB7CiAJCQlyID0gLUVJTzsKQEAgLTMyMTIsMTAgKzMzMjQsMTQgQEAKIAkJYnVmWzBdID0gZGF0YTsKIAogCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9TSE9SVF9SRUFEXzIpIHsKKwl9IGVsc2UgaWYgKGR0ID09ICh0eXBlID09IERTU19EU0lfQ09OVEVOVF9HRU5FUklDID8KKwkJCU1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURSkpIHsKIAkJdTE2IGRhdGEgPSBGTERfR0VUKHZhbCwgMjMsIDgpOwogCQlpZiAoZHNpLT5kZWJ1Z19yZWFkKQotCQkJRFNTREJHKCJcdERDUyBzaG9ydCByZXNwb25zZSwgMiBieXRlOiAlMDR4XG4iLCBkYXRhKTsKKwkJCURTU0RCRygiXHQlcyBzaG9ydCByZXNwb25zZSwgMiBieXRlOiAlMDR4XG4iLAorCQkJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPyAiR0VORVJJQyIgOgorCQkJCSJEQ1MiLCBkYXRhKTsKIAogCQlpZiAoYnVmbGVuIDwgMikgewogCQkJciA9IC1FSU87CkBAIC0zMjI2LDExICszMzQyLDE1IEBACiAJCWJ1ZlsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKIAogCQlyZXR1cm4gMjsKLQl9IGVsc2UgaWYgKGR0ID09IERTSV9EVF9SWF9EQ1NfTE9OR19SRUFEKSB7CisJfSBlbHNlIGlmIChkdCA9PSAodHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/CisJCQlNSVBJX0RTSV9SWF9HRU5FUklDX0xPTkdfUkVBRF9SRVNQT05TRSA6CisJCQlNSVBJX0RTSV9SWF9EQ1NfTE9OR19SRUFEX1JFU1BPTlNFKSkgewogCQlpbnQgdzsKIAkJaW50IGxlbiA9IEZMRF9HRVQodmFsLCAyMywgOCk7CiAJCWlmIChkc2ktPmRlYnVnX3JlYWQpCi0JCQlEU1NEQkcoIlx0RENTIGxvbmcgcmVzcG9uc2UsIGxlbiAlZFxuIiwgbGVuKTsKKwkJCURTU0RCRygiXHQlcyBsb25nIHJlc3BvbnNlLCBsZW4gJWRcbiIsCisJCQkJdHlwZSA9PSBEU1NfRFNJX0NPTlRFTlRfR0VORVJJQyA/ICJHRU5FUklDIiA6CisJCQkJIkRDUyIsIGxlbik7CiAKIAkJaWYgKGxlbiA+IGJ1ZmxlbikgewogCQkJciA9IC1FSU87CkBAIC0zMjY2LDU4ICszMzg2LDEyNiBAQAogCiAJQlVHKCk7CiBlcnI6Ci0JRFNTRVJSKCJkc2lfdmNfZGNzX3JlYWQoY2ggJWQsIGNtZCAweCUwMngpIGZhaWxlZFxuIiwKLQkJCWNoYW5uZWwsIGRjc19jbWQpOwotCXJldHVybiByOworCURTU0VSUigiZHNpX3ZjX3JlYWRfcnhfZmlmbyhjaCAlZCB0eXBlICVzKSBmYWlsZWRcbiIsIGNoYW5uZWwsCisJCXR5cGUgPT0gRFNTX0RTSV9DT05URU5UX0dFTkVSSUMgPyAiR0VORVJJQyIgOiAiRENTIik7CiAKKwlyZXR1cm4gcjsKK30KKworaW50IGRzaV92Y19kY3NfcmVhZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCBkY3NfY21kLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IHI7CisKKwlyID0gZHNpX3ZjX2Rjc19zZW5kX3JlYWRfcmVxdWVzdChkc3NkZXYsIGNoYW5uZWwsIGRjc19jbWQpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBkc2lfdmNfc2VuZF9idGFfc3luYyhkc3NkZXYsIGNoYW5uZWwpOworCWlmIChyKQorCQlnb3RvIGVycjsKKworCXIgPSBkc2lfdmNfcmVhZF9yeF9maWZvKGRzaWRldiwgY2hhbm5lbCwgYnVmLCBidWZsZW4sCisJCURTU19EU0lfQ09OVEVOVF9EQ1MpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAociAhPSBidWZsZW4pIHsKKwkJciA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCURTU0VSUigiZHNpX3ZjX2Rjc19yZWFkKGNoICVkLCBjbWQgMHglMDJ4KSBmYWlsZWRcbiIsIGNoYW5uZWwsIGRjc19jbWQpOworCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3JlYWQpOwogCi1pbnQgZHNpX3ZjX2Rjc19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGEpCitzdGF0aWMgaW50IGRzaV92Y19nZW5lcmljX3JlYWQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggKnJlcWRhdGEsIGludCByZXFsZW4sIHU4ICpidWYsIGludCBidWZsZW4pCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKIAlpbnQgcjsKIAotCXIgPSBkc2lfdmNfZGNzX3JlYWQoZHNzZGV2LCBjaGFubmVsLCBkY3NfY21kLCBkYXRhLCAxKTsKKwlyID0gZHNpX3ZjX2dlbmVyaWNfc2VuZF9yZWFkX3JlcXVlc3QoZHNzZGV2LCBjaGFubmVsLCByZXFkYXRhLCByZXFsZW4pOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAorCXIgPSBkc2lfdmNfc2VuZF9idGFfc3luYyhkc3NkZXYsIGNoYW5uZWwpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBkc2lfdmNfcmVhZF9yeF9maWZvKGRzaWRldiwgY2hhbm5lbCwgYnVmLCBidWZsZW4sCisJCURTU19EU0lfQ09OVEVOVF9HRU5FUklDKTsKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCi0JaWYgKHIgIT0gMSkKLQkJcmV0dXJuIC1FSU87CisJaWYgKHIgIT0gYnVmbGVuKSB7CisJCXIgPSAtRUlPOworCQlyZXR1cm4gcjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZHNpX3ZjX2Rjc19yZWFkXzEpOwogCi1pbnQgZHNpX3ZjX2Rjc19yZWFkXzIoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGExLCB1OCAqZGF0YTIpCitpbnQgZHNpX3ZjX2dlbmVyaWNfcmVhZF8wKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4ICpidWYsCisJCWludCBidWZsZW4pCiB7Ci0JdTggYnVmWzJdOwogCWludCByOwogCi0JciA9IGRzaV92Y19kY3NfcmVhZChkc3NkZXYsIGNoYW5uZWwsIGRjc19jbWQsIGJ1ZiwgMik7Ci0KLQlpZiAociA8IDApCisJciA9IGRzaV92Y19nZW5lcmljX3JlYWQoZHNzZGV2LCBjaGFubmVsLCBOVUxMLCAwLCBidWYsIGJ1Zmxlbik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZ2VuZXJpY19yZWFkXzAoY2ggJWQpIGZhaWxlZFxuIiwgY2hhbm5lbCk7CiAJCXJldHVybiByOwotCi0JaWYgKHIgIT0gMikKLQkJcmV0dXJuIC1FSU87Ci0KLQkqZGF0YTEgPSBidWZbMF07Ci0JKmRhdGEyID0gYnVmWzFdOworCX0KIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChkc2lfdmNfZGNzX3JlYWRfMik7CitFWFBPUlRfU1lNQk9MKGRzaV92Y19nZW5lcmljX3JlYWRfMCk7CisKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggcGFyYW0sCisJCXU4ICpidWYsIGludCBidWZsZW4pCit7CisJaW50IHI7CisKKwlyID0gZHNpX3ZjX2dlbmVyaWNfcmVhZChkc3NkZXYsIGNoYW5uZWwsICZwYXJhbSwgMSwgYnVmLCBidWZsZW4pOworCWlmIChyKSB7CisJCURTU0VSUigiZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKGNoICVkKSBmYWlsZWRcbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKTsKKworaW50IGRzaV92Y19nZW5lcmljX3JlYWRfMihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAorCQl1OCBwYXJhbTEsIHU4IHBhcmFtMiwgdTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgcjsKKwl1OCByZXFkYXRhWzJdOworCisJcmVxZGF0YVswXSA9IHBhcmFtMTsKKwlyZXFkYXRhWzFdID0gcGFyYW0yOworCisJciA9IGRzaV92Y19nZW5lcmljX3JlYWQoZHNzZGV2LCBjaGFubmVsLCByZXFkYXRhLCAyLCBidWYsIGJ1Zmxlbik7CisJaWYgKHIpIHsKKwkJRFNTRVJSKCJkc2lfdmNfZ2VuZXJpY19yZWFkXzIoY2ggJWQpIGZhaWxlZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkc2lfdmNfZ2VuZXJpY19yZWFkXzIpOwogCiBpbnQgZHNpX3ZjX3NldF9tYXhfcnhfcGFja2V0X3NpemUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKIAkJdTE2IGxlbikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOwogCi0JcmV0dXJuIGRzaV92Y19zZW5kX3Nob3J0KGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX1NFVF9NQVhfUkVUX1BLR19TSVpFLAotCQkJbGVuLCAwKTsKKwlyZXR1cm4gZHNpX3ZjX3NlbmRfc2hvcnQoZHNpZGV2LCBjaGFubmVsLAorCQkJTUlQSV9EU0lfU0VUX01BWElNVU1fUkVUVVJOX1BBQ0tFVF9TSVpFLCBsZW4sIDApOwogfQogRVhQT1JUX1NZTUJPTChkc2lfdmNfc2V0X21heF9yeF9wYWNrZXRfc2l6ZSk7CiAKQEAgLTM1MDgsNiArMzY5Niw3NSBAQAogCQkJdGlja3MsIHg0ID8gIiB4NCIgOiAiIiwgeDE2ID8gIiB4MTYiIDogIiIsCiAJCQkodG90YWxfdGlja3MgKiAxMDAwKSAvIChmY2sgLyAxMDAwIC8gMTAwMCkpOwogfQorCitzdGF0aWMgdm9pZCBkc2lfY29uZmlnX3ZwX251bV9saW5lX2J1ZmZlcnMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IG51bV9saW5lX2J1ZmZlcnM7CisKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfVklERU9fTU9ERSkgeworCQlpbnQgYnBwID0gZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpOworCQl1bnNpZ25lZCBsaW5lX2J1Zl9zaXplID0gZHNpX2dldF9saW5lX2J1Zl9zaXplKGRzaWRldik7CisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MgPSAmZHNzZGV2LT5wYW5lbC50aW1pbmdzOworCQkvKgorCQkgKiBEb24ndCB1c2UgbGluZSBidWZmZXJzIGlmIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmlkZW8KKwkJICogcG9ydCdzIGxpbmUgYnVmZmVyIHNpemUKKwkJICovCisJCWlmIChsaW5lX2J1Zl9zaXplIDw9IHRpbWluZ3MtPnhfcmVzICogYnBwIC8gOCkKKwkJCW51bV9saW5lX2J1ZmZlcnMgPSAwOworCQllbHNlCisJCQludW1fbGluZV9idWZmZXJzID0gMjsKKwl9IGVsc2UgeworCQkvKiBVc2UgbWF4aW11bSBudW1iZXIgb2YgbGluZSBidWZmZXJzIGluIGNvbW1hbmQgbW9kZSAqLworCQludW1fbGluZV9idWZmZXJzID0gMjsKKwl9CisKKwkvKiBMSU5FX0JVRkZFUiAqLworCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX0NUUkwsIG51bV9saW5lX2J1ZmZlcnMsIDEzLCAxMik7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jb25maWdfdnBfc3luY19ldmVudHMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CisJaW50IGRlX3BvbCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudnBfZGVfcG9sOworCWludCBoc3luY19wb2wgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZwX2hzeW5jX3BvbDsKKwlpbnQgdnN5bmNfcG9sID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52cF92c3luY19wb2w7CisJYm9vbCB2c3luY19lbmQgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZwX3ZzeW5jX2VuZDsKKwlib29sIGhzeW5jX2VuZCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudnBfaHN5bmNfZW5kOworCXUzMiByOworCisJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBkZV9wb2wsIDksIDkpOwkJLyogVlBfREVfUE9MICovCisJciA9IEZMRF9NT0QociwgaHN5bmNfcG9sLCAxMCwgMTApOwkvKiBWUF9IU1lOQ19QT0wgKi8KKwlyID0gRkxEX01PRChyLCB2c3luY19wb2wsIDExLCAxMSk7CS8qIFZQX1ZTWU5DX1BPTCAqLworCXIgPSBGTERfTU9EKHIsIDEsIDE1LCAxNSk7CQkvKiBWUF9WU1lOQ19TVEFSVCAqLworCXIgPSBGTERfTU9EKHIsIHZzeW5jX2VuZCwgMTYsIDE2KTsJLyogVlBfVlNZTkNfRU5EICovCisJciA9IEZMRF9NT0QociwgMSwgMTcsIDE3KTsJCS8qIFZQX0hTWU5DX1NUQVJUICovCisJciA9IEZMRF9NT0QociwgaHN5bmNfZW5kLCAxOCwgMTgpOwkvKiBWUF9IU1lOQ19FTkQgKi8KKwlkc2lfd3JpdGVfcmVnKGRzaWRldiwgRFNJX0NUUkwsIHIpOworfQorCitzdGF0aWMgdm9pZCBkc2lfY29uZmlnX2JsYW5raW5nX21vZGVzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOworCWludCBibGFua2luZ19tb2RlID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5ibGFua2luZ19tb2RlOworCWludCBoZnBfYmxhbmtpbmdfbW9kZSA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuaGZwX2JsYW5raW5nX21vZGU7CisJaW50IGhicF9ibGFua2luZ19tb2RlID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5oYnBfYmxhbmtpbmdfbW9kZTsKKwlpbnQgaHNhX2JsYW5raW5nX21vZGUgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmhzYV9ibGFua2luZ19tb2RlOworCXUzMiByOworCisJLyoKKwkgKiAwID0gVFggRklGTyBwYWNrZXRzIHNlbnQgb3IgTFBTIGluIGNvcnJlc3BvbmRpbmcgYmxhbmtpbmcgcGVyaW9kcworCSAqIDEgPSBMb25nIGJsYW5raW5nIHBhY2tldHMgYXJlIHNlbnQgaW4gY29ycmVzcG9uZGluZyBibGFua2luZyBwZXJpb2RzCisJICovCisJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBibGFua2luZ19tb2RlLCAyMCwgMjApOwkJLyogQkxBTktJTkdfTU9ERSAqLworCXIgPSBGTERfTU9EKHIsIGhmcF9ibGFua2luZ19tb2RlLCAyMSwgMjEpOwkvKiBIRlBfQkxBTktJTkcgKi8KKwlyID0gRkxEX01PRChyLCBoYnBfYmxhbmtpbmdfbW9kZSwgMjIsIDIyKTsJLyogSEJQX0JMQU5LSU5HICovCisJciA9IEZMRF9NT0QociwgaHNhX2JsYW5raW5nX21vZGUsIDIzLCAyMyk7CS8qIEhTQV9CTEFOS0lORyAqLworCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfQ1RSTCwgcik7Cit9CisKIHN0YXRpYyBpbnQgZHNpX3Byb3RvX2NvbmZpZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKQEAgLTM1MzAsNyArMzc4Nyw3IEBACiAJZHNpX3NldF9scF9yeF90aW1lb3V0KGRzaWRldiwgMHgxZmZmLCB0cnVlLCB0cnVlKTsKIAlkc2lfc2V0X2hzX3R4X3RpbWVvdXQoZHNpZGV2LCAweDFmZmYsIHRydWUsIHRydWUpOwogCi0Jc3dpdGNoIChkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSkgeworCXN3aXRjaCAoZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpKSB7CiAJY2FzZSAxNjoKIAkJYnVzd2lkdGggPSAwOwogCQlicmVhazsKQEAgLTM1NTEsNyArMzgwOCw2IEBACiAJciA9IEZMRF9NT0QociwgMSwgNCwgNCk7CS8qIFZQX0NMS19SQVRJTywgYWx3YXlzIDEsIHNlZSBlcnJhdGEqLwogCXIgPSBGTERfTU9EKHIsIGJ1c3dpZHRoLCA3LCA2KTsgLyogVlBfREFUQV9CVVNfV0lEVEggKi8KIAlyID0gRkxEX01PRChyLCAwLCA4LCA4KTsJLyogVlBfQ0xLX1BPTCAqLwotCXIgPSBGTERfTU9EKHIsIDIsIDEzLCAxMik7CS8qIExJTkVfQlVGRkVSLCAyIGxpbmVzICovCiAJciA9IEZMRF9NT0QociwgMSwgMTQsIDE0KTsJLyogVFJJR0dFUl9SRVNFVF9NT0RFICovCiAJciA9IEZMRF9NT0QociwgMSwgMTksIDE5KTsJLyogRU9UX0VOQUJMRSAqLwogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDKSkgewpAQCAtMzU2Miw2ICszODE4LDEzIEBACiAKIAlkc2lfd3JpdGVfcmVnKGRzaWRldiwgRFNJX0NUUkwsIHIpOwogCisJZHNpX2NvbmZpZ192cF9udW1fbGluZV9idWZmZXJzKGRzc2Rldik7CisKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfVklERU9fTU9ERSkgeworCQlkc2lfY29uZmlnX3ZwX3N5bmNfZXZlbnRzKGRzc2Rldik7CisJCWRzaV9jb25maWdfYmxhbmtpbmdfbW9kZXMoZHNzZGV2KTsKKwl9CisKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAwKTsKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAxKTsKIAlkc2lfdmNfaW5pdGlhbF9jb25maWcoZHNpZGV2LCAyKTsKQEAgLTM1ODAsNiArMzg0Myw3IEBACiAJdW5zaWduZWQgZGRyX2Nsa19wcmUsIGRkcl9jbGtfcG9zdDsKIAl1bnNpZ25lZCBlbnRlcl9oc19tb2RlX2xhdCwgZXhpdF9oc19tb2RlX2xhdDsKIAl1bnNpZ25lZCB0aHNfZW90OworCWludCBuZGwgPSBkc2lfZ2V0X251bV9kYXRhX2xhbmVzX2Rzc2Rldihkc3NkZXYpOwogCXUzMiByOwogCiAJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9EU0lQSFlfQ0ZHMCk7CkBAIC0zNjAyLDcgKzM4NjYsNyBAQAogCS8qIG1pbiA2MG5zICsgNTIqVUkgKi8KIAl0Y2xrX3Bvc3QgPSBuczJkZHIoZHNpZGV2LCA2MCkgKyAyNjsKIAotCXRoc19lb3QgPSBESVZfUk9VTkRfVVAoNCwgZHNpX2dldF9udW1fZGF0YV9sYW5lc19kc3NkZXYoZHNzZGV2KSk7CisJdGhzX2VvdCA9IERJVl9ST1VORF9VUCg0LCBuZGwpOwogCiAJZGRyX2Nsa19wcmUgPSBESVZfUk9VTkRfVVAodGNsa19wcmUgKyB0bHB4ICsgdGNsa196ZXJvICsgdGNsa19wcmVwYXJlLAogCQkJNCk7CkBAIC0zNjMyLDE2MiArMzg5NiwxMTQgQEAKIAogCURTU0RCRygiZW50ZXJfaHNfbW9kZV9sYXQgJXUsIGV4aXRfaHNfbW9kZV9sYXQgJXVcbiIsCiAJCQllbnRlcl9oc19tb2RlX2xhdCwgZXhpdF9oc19tb2RlX2xhdCk7CisKKwkgaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX1ZJREVPX01PREUpIHsKKwkJLyogVE9ETzogSW1wbGVtZW50IGEgdmlkZW8gbW9kZSBjaGVja190aW1pbmdzIGZ1bmN0aW9uICovCisJCWludCBoc2EgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLmhzYTsKKwkJaW50IGhmcCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEuaGZwOworCQlpbnQgaGJwID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS5oYnA7CisJCWludCB2c2EgPSBkc3NkZXYtPnBhbmVsLmRzaV92bV9kYXRhLnZzYTsKKwkJaW50IHZmcCA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEudmZwOworCQlpbnQgdmJwID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52YnA7CisJCWludCB3aW5kb3dfc3luYyA9IGRzc2Rldi0+cGFuZWwuZHNpX3ZtX2RhdGEud2luZG93X3N5bmM7CisJCWJvb2wgaHN5bmNfZW5kID0gZHNzZGV2LT5wYW5lbC5kc2lfdm1fZGF0YS52cF9oc3luY19lbmQ7CisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MgPSAmZHNzZGV2LT5wYW5lbC50aW1pbmdzOworCQlpbnQgYnBwID0gZHNpX2dldF9waXhlbF9zaXplKGRzc2Rldi0+cGFuZWwuZHNpX3BpeF9mbXQpOworCQlpbnQgdGwsIHRfaGUsIHdpZHRoX2J5dGVzOworCisJCXRfaGUgPSBoc3luY19lbmQgPworCQkJKChoc2EgPT0gMCAmJiBuZGwgPT0gMykgPyAxIDogRElWX1JPVU5EX1VQKDQsIG5kbCkpIDogMDsKKworCQl3aWR0aF9ieXRlcyA9IERJVl9ST1VORF9VUCh0aW1pbmdzLT54X3JlcyAqIGJwcCwgOCk7CisKKwkJLyogVEwgPSB0X0hTICsgSFNBICsgdF9IRSArIEhGUCArIGNlaWwoKFdDICsgNikgLyBOREwpICsgSEJQICovCisJCXRsID0gRElWX1JPVU5EX1VQKDQsIG5kbCkgKyAoaHN5bmNfZW5kID8gaHNhIDogMCkgKyB0X2hlICsgaGZwICsKKwkJCURJVl9ST1VORF9VUCh3aWR0aF9ieXRlcyArIDYsIG5kbCkgKyBoYnA7CisKKwkJRFNTREJHKCJIQlA6ICVkLCBIRlA6ICVkLCBIU0E6ICVkLCBUTDogJWQgVFhCWVRFQ0xLSFNcbiIsIGhicCwKKwkJCWhmcCwgaHN5bmNfZW5kID8gaHNhIDogMCwgdGwpOworCQlEU1NEQkcoIlZCUDogJWQsIFZGUDogJWQsIFZTQTogJWQsIFZBQ1Q6ICVkIGxpbmVzXG4iLCB2YnAsIHZmcCwKKwkJCXZzYSwgdGltaW5ncy0+eV9yZXMpOworCisJCXIgPSBkc2lfcmVhZF9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMSk7CisJCXIgPSBGTERfTU9EKHIsIGhicCwgMTEsIDApOwkvKiBIQlAgKi8KKwkJciA9IEZMRF9NT0QociwgaGZwLCAyMywgMTIpOwkvKiBIRlAgKi8KKwkJciA9IEZMRF9NT0QociwgaHN5bmNfZW5kID8gaHNhIDogMCwgMzEsIDI0KTsJLyogSFNBICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMSwgcik7CisKKwkJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9WTV9USU1JTkcyKTsKKwkJciA9IEZMRF9NT0QociwgdmJwLCA3LCAwKTsJLyogVkJQICovCisJCXIgPSBGTERfTU9EKHIsIHZmcCwgMTUsIDgpOwkvKiBWRlAgKi8KKwkJciA9IEZMRF9NT0QociwgdnNhLCAyMywgMTYpOwkvKiBWU0EgKi8KKwkJciA9IEZMRF9NT0Qociwgd2luZG93X3N5bmMsIDI3LCAyNCk7CS8qIFdJTkRPV19TWU5DICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMiwgcik7CisKKwkJciA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9WTV9USU1JTkczKTsKKwkJciA9IEZMRF9NT0QociwgdGltaW5ncy0+eV9yZXMsIDE0LCAwKTsJLyogVkFDVCAqLworCQlyID0gRkxEX01PRChyLCB0bCwgMzEsIDE2KTsJCS8qIFRMICovCisJCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVk1fVElNSU5HMywgcik7CisJfQogfQogCi0KLSNkZWZpbmUgRFNJX0RFQ0xfVkFSUyBcCi0JaW50IF9fZHNpX2NiID0gMDsgdTMyIF9fZHNpX2N2ID0gMDsKLQotI2RlZmluZSBEU0lfRkxVU0goZHNpZGV2LCBjaCkgXAotCWlmIChfX2RzaV9jYiA+IDApIHsgXAotCQkvKkRTU0RCRygic2VuZGluZyBsb25nIHBhY2tldCAlIzAxMHhcbiIsIF9fZHNpX2N2KTsqLyBcCi0JCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVkNfTE9OR19QQUNLRVRfUEFZTE9BRChjaCksIF9fZHNpX2N2KTsgXAotCQlfX2RzaV9jYiA9IF9fZHNpX2N2ID0gMDsgXAotCX0KLQotI2RlZmluZSBEU0lfUFVTSChkc2lkZXYsIGNoLCBkYXRhKSBcCi0JZG8geyBcCi0JCV9fZHNpX2N2IHw9IChkYXRhKSA8PCAoX19kc2lfY2IgKiA4KTsgXAotCQkvKkRTU0RCRygiY3YgPSAlIzAxMHgsIGNiID0gJWRcbiIsIF9fZHNpX2N2LCBfX2RzaV9jYik7Ki8gXAotCQlpZiAoKytfX2RzaV9jYiA+IDMpIFwKLQkJCURTSV9GTFVTSChkc2lkZXYsIGNoKTsgXAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQgZHNpX3VwZGF0ZV9zY3JlZW5fbDQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQkJaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCitpbnQgZHNpX3ZpZGVvX21vZGVfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpCiB7Ci0JLyogTm90ZTogc3VwcG9ydHMgb25seSAyNGJpdCBjb2xvcnMgaW4gMzJiaXQgY29udGFpbmVyICovCiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKLQlpbnQgZmlyc3QgPSAxOwotCWludCBmaWZvX3N0YWxscyA9IDA7Ci0JaW50IG1heF9kc2lfcGFja2V0X3NpemU7Ci0JaW50IG1heF9kYXRhX3Blcl9wYWNrZXQ7Ci0JaW50IG1heF9waXhlbHNfcGVyX3BhY2tldDsKLQlpbnQgcGl4ZWxzX2xlZnQ7Ci0JaW50IGJ5dGVzcHAgPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7Ci0JaW50IHNjcl93aWR0aDsKLQl1MzIgX19pb21lbSAqZGF0YTsKLQlpbnQgc3RhcnRfb2Zmc2V0OwotCWludCBob3Jpel9pbmM7Ci0JaW50IGN1cnJlbnRfeDsKLQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJaW50IGJwcCA9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KTsKKwl1OCBkYXRhX3R5cGU7CisJdTE2IHdvcmRfY291bnQ7CiAKLQlkZWJ1Z19pcnEgPSAwOworCXN3aXRjaCAoZHNzZGV2LT5wYW5lbC5kc2lfcGl4X2ZtdCkgeworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I4ODg6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMjQ7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I2NjY6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BJWEVMX1NUUkVBTV8zQllURV8xODsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQ6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMTg7CisJCWJyZWFrOworCWNhc2UgT01BUF9EU1NfRFNJX0ZNVF9SR0I1NjU6CisJCWRhdGFfdHlwZSA9IE1JUElfRFNJX1BBQ0tFRF9QSVhFTF9TVFJFQU1fMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX07CiAKLQlEU1NEQkcoImRzaV91cGRhdGVfc2NyZWVuX2w0ICglZCwlZCAlZHglZClcbiIsCi0JCQl4LCB5LCB3LCBoKTsKKwlkc2lfaWZfZW5hYmxlKGRzaWRldiwgZmFsc2UpOworCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCBmYWxzZSk7CiAKLQlvdmwgPSBkc3NkZXYtPm1hbmFnZXItPm92ZXJsYXlzWzBdOworCS8qIE1PREUsIDEgPSB2aWRlbyBtb2RlICovCisJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfVkNfQ1RSTChjaGFubmVsKSwgMSwgNCwgNCk7CiAKLQlpZiAob3ZsLT5pbmZvLmNvbG9yX21vZGUgIT0gT01BUF9EU1NfQ09MT1JfUkdCMjRVKQotCQlyZXR1cm4gLUVJTlZBTDsKKwl3b3JkX2NvdW50ID0gRElWX1JPVU5EX1VQKGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyAqIGJwcCwgOCk7CiAKLQlpZiAoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUgIT0gMjQpCi0JCXJldHVybiAtRUlOVkFMOworCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIGRhdGFfdHlwZSwgd29yZF9jb3VudCwgMCk7CiAKLQlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOwotCWRhdGEgPSBvdmwtPmluZm8udmFkZHI7CisJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIHRydWUpOworCWRzaV9pZl9lbmFibGUoZHNpZGV2LCB0cnVlKTsKIAotCXN0YXJ0X29mZnNldCA9IHNjcl93aWR0aCAqIHkgKyB4OwotCWhvcml6X2luYyA9IHNjcl93aWR0aCAtIHc7Ci0JY3VycmVudF94ID0geDsKLQotCS8qIFdlIG5lZWQgaGVhZGVyKDQpICsgRENTQ01EKDEpICsgcGl4ZWxzKG51bXBpeCpieXRlc3BwKSBieXRlcwotCSAqIGluIGZpZm8gKi8KLQotCS8qIFdoZW4gdXNpbmcgQ1BVLCBtYXggbG9uZyBwYWNrZXQgc2l6ZSBpcyBUWCBidWZmZXIgc2l6ZSAqLwotCW1heF9kc2lfcGFja2V0X3NpemUgPSBkc2ktPnZjWzBdLmZpZm9fc2l6ZSAqIDMyICogNDsKLQotCS8qIHdlIHNlZW0gdG8gZ2V0IGJldHRlciBwZXJmIGlmIHdlIGRpdmlkZSB0aGUgdHggZmlmbyB0byBoYWxmLAotCSAgIGFuZCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBpcyBiZWluZyBzZW50LCB3ZSBmaWxsIHRoZSBvdGhlciBoYWxmCi0JICAgbWF4X2RzaV9wYWNrZXRfc2l6ZSAvPSAyOyAqLwotCi0JbWF4X2RhdGFfcGVyX3BhY2tldCA9IG1heF9kc2lfcGFja2V0X3NpemUgLSA0IC0gMTsKLQotCW1heF9waXhlbHNfcGVyX3BhY2tldCA9IG1heF9kYXRhX3Blcl9wYWNrZXQgLyBieXRlc3BwOwotCi0JRFNTREJHKCJtYXhfcGl4ZWxzX3Blcl9wYWNrZXQgJWRcbiIsIG1heF9waXhlbHNfcGVyX3BhY2tldCk7Ci0KLQlwaXhlbHNfbGVmdCA9IHcgKiBoOwotCi0JRFNTREJHKCJ0b3RhbCBwaXhlbHMgJWRcbiIsIHBpeGVsc19sZWZ0KTsKLQotCWRhdGEgKz0gc3RhcnRfb2Zmc2V0OwotCi0Jd2hpbGUgKHBpeGVsc19sZWZ0ID4gMCkgewotCQkvKiAweDJjID0gd3JpdGVfbWVtb3J5X3N0YXJ0ICovCi0JCS8qIDB4M2MgPSB3cml0ZV9tZW1vcnlfY29udGludWUgKi8KLQkJdTggZGNzX2NtZCA9IGZpcnN0ID8gMHgyYyA6IDB4M2M7Ci0JCWludCBwaXhlbHM7Ci0JCURTSV9ERUNMX1ZBUlM7Ci0JCWZpcnN0ID0gMDsKLQotI2lmIDEKLQkJLyogdXNpbmcgZmlmbyBub3QgZW1wdHkgKi8KLQkJLyogVFhfRklGT19OT1RfRU1QVFkgKi8KLQkJd2hpbGUgKEZMRF9HRVQoZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1ZDX0NUUkwoMCkpLCA1LCA1KSkgewotCQkJZmlmb19zdGFsbHMrKzsKLQkJCWlmIChmaWZvX3N0YWxscyA+IDB4ZmZmZmYpIHsKLQkJCQlEU1NFUlIoImZpZm8gc3RhbGxzIG92ZXJmbG93LCBwaXhlbHMgbGVmdCAlZFxuIiwKLQkJCQkJCXBpeGVsc19sZWZ0KTsKLQkJCQlkc2lfaWZfZW5hYmxlKGRzaWRldiwgMCk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQl1ZGVsYXkoMSk7Ci0JCX0KLSNlbGlmIDEKLQkJLyogdXNpbmcgZmlmbyBlbXB0aW5lc3MgKi8KLQkJd2hpbGUgKChSRUdfR0VUKGRzaWRldiwgRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTLCA3LCAwKSsxKSo0IDwKLQkJCQltYXhfZHNpX3BhY2tldF9zaXplKSB7Ci0JCQlmaWZvX3N0YWxscysrOwotCQkJaWYgKGZpZm9fc3RhbGxzID4gMHhmZmZmZikgewotCQkJCURTU0VSUigiZmlmbyBzdGFsbHMgb3ZlcmZsb3csIHBpeGVscyBsZWZ0ICVkXG4iLAotCQkJCQkgICAgICAgcGl4ZWxzX2xlZnQpOwotCQkJCWRzaV9pZl9lbmFibGUoZHNpZGV2LCAwKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfQotI2Vsc2UKLQkJd2hpbGUgKChSRUdfR0VUKGRzaWRldiwgRFNJX1RYX0ZJRk9fVkNfRU1QVElORVNTLAotCQkJCTcsIDApICsgMSkgKiA0ID09IDApIHsKLQkJCWZpZm9fc3RhbGxzKys7Ci0JCQlpZiAoZmlmb19zdGFsbHMgPiAweGZmZmZmKSB7Ci0JCQkJRFNTRVJSKCJmaWZvIHN0YWxscyBvdmVyZmxvdywgcGl4ZWxzIGxlZnQgJWRcbiIsCi0JCQkJCSAgICAgICBwaXhlbHNfbGVmdCk7Ci0JCQkJZHNpX2lmX2VuYWJsZShkc2lkZXYsIDApOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJcGl4ZWxzID0gbWluKG1heF9waXhlbHNfcGVyX3BhY2tldCwgcGl4ZWxzX2xlZnQpOwotCi0JCXBpeGVsc19sZWZ0IC09IHBpeGVsczsKLQotCQlkc2lfdmNfd3JpdGVfbG9uZ19oZWFkZXIoZHNpZGV2LCAwLCBEU0lfRFRfRENTX0xPTkdfV1JJVEUsCi0JCQkJMSArIHBpeGVscyAqIGJ5dGVzcHAsIDApOwotCi0JCURTSV9QVVNIKGRzaWRldiwgMCwgZGNzX2NtZCk7Ci0KLQkJd2hpbGUgKHBpeGVscy0tID4gMCkgewotCQkJdTMyIHBpeCA9IF9fcmF3X3JlYWRsKGRhdGErKyk7Ci0KLQkJCURTSV9QVVNIKGRzaWRldiwgMCwgKHBpeCA+PiAxNikgJiAweGZmKTsKLQkJCURTSV9QVVNIKGRzaWRldiwgMCwgKHBpeCA+PiA4KSAmIDB4ZmYpOwotCQkJRFNJX1BVU0goZHNpZGV2LCAwLCAocGl4ID4+IDApICYgMHhmZik7Ci0KLQkJCWN1cnJlbnRfeCsrOwotCQkJaWYgKGN1cnJlbnRfeCA9PSB4K3cpIHsKLQkJCQljdXJyZW50X3ggPSB4OwotCQkJCWRhdGEgKz0gaG9yaXpfaW5jOwotCQkJfQotCQl9Ci0KLQkJRFNJX0ZMVVNIKGRzaWRldiwgMCk7Ci0JfQorCWRzc2Rldi0+bWFuYWdlci0+ZW5hYmxlKGRzc2Rldi0+bWFuYWdlcik7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZHNpX3ZpZGVvX21vZGVfZW5hYmxlKTsKKwordm9pZCBkc2lfdmlkZW9fbW9kZV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKKworCWRzaV9pZl9lbmFibGUoZHNpZGV2LCBmYWxzZSk7CisJZHNpX3ZjX2VuYWJsZShkc2lkZXYsIGNoYW5uZWwsIGZhbHNlKTsKKworCS8qIE1PREUsIDAgPSBjb21tYW5kIG1vZGUgKi8KKwlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9WQ19DVFJMKGNoYW5uZWwpLCAwLCA0LCA0KTsKKworCWRzaV92Y19lbmFibGUoZHNpZGV2LCBjaGFubmVsLCB0cnVlKTsKKwlkc2lfaWZfZW5hYmxlKGRzaWRldiwgdHJ1ZSk7CisKKwlkc3NkZXYtPm1hbmFnZXItPmRpc2FibGUoZHNzZGV2LT5tYW5hZ2VyKTsKK30KK0VYUE9SVF9TWU1CT0woZHNpX3ZpZGVvX21vZGVfZGlzYWJsZSk7CiAKIHN0YXRpYyB2b2lkIGRzaV91cGRhdGVfc2NyZWVuX2Rpc3BjKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKIAkJdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpCkBAIC0zODA4LDkgKzQwMjQsOSBAQAogCURTU0RCRygiZHNpX3VwZGF0ZV9zY3JlZW5fZGlzcGMoJWQsJWQgJWR4JWQpXG4iLAogCQkJeCwgeSwgdywgaCk7CiAKLQlkc2lfdmNfY29uZmlnX3ZwKGRzaWRldiwgY2hhbm5lbCk7CisJZHNpX3ZjX2NvbmZpZ19zb3VyY2UoZHNpZGV2LCBjaGFubmVsLCBEU0lfVkNfU09VUkNFX1ZQKTsKIAotCWJ5dGVzcHAJPSBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSAvIDg7CisJYnl0ZXNwcAk9IGRzaV9nZXRfcGl4ZWxfc2l6ZShkc3NkZXYtPnBhbmVsLmRzaV9waXhfZm10KSAvIDg7CiAJYnl0ZXNwbCA9IHcgKiBieXRlc3BwOwogCWJ5dGVzcGYgPSBieXRlc3BsICogaDsKIApAQCAtMzgzMSw3ICs0MDQ3LDcgQEAKIAlsID0gRkxEX1ZBTCh0b3RhbF9sZW4sIDIzLCAwKTsgLyogVEVfU0laRSAqLwogCWRzaV93cml0ZV9yZWcoZHNpZGV2LCBEU0lfVkNfVEUoY2hhbm5lbCksIGwpOwogCi0JZHNpX3ZjX3dyaXRlX2xvbmdfaGVhZGVyKGRzaWRldiwgY2hhbm5lbCwgRFNJX0RUX0RDU19MT05HX1dSSVRFLAorCWRzaV92Y193cml0ZV9sb25nX2hlYWRlcihkc2lkZXYsIGNoYW5uZWwsIE1JUElfRFNJX0RDU19MT05HX1dSSVRFLAogCQlwYWNrZXRfbGVuLCAwKTsKIAogCWlmIChkc2ktPnRlX2VuYWJsZWQpCkBAIC0zOTU2LDExICs0MTcyLDkgQEAKIAogCWRzaV9wZXJmX21hcmtfc2V0dXAoZHNpZGV2KTsKIAotCWlmIChkc3NkZXYtPm1hbmFnZXItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykgewotCQlkc3Nfc2V0dXBfcGFydGlhbF9wbGFuZXMoZHNzZGV2LCB4LCB5LCB3LCBoLAotCQkJCWVubGFyZ2VfdXBkYXRlX2FyZWEpOwotCQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKLQl9CisJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgeCwgeSwgdywgaCwKKwkJCWVubGFyZ2VfdXBkYXRlX2FyZWEpOworCWRpc3BjX21ncl9zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzk4MiwyNyArNDE5NiwxNiBAQAogCSAqIHNlZSByYXRoZXIgb2JzY3VyZSBIVyBlcnJvciBoYXBwZW5pbmcsIGFzIERTUyBoYWx0cy4gKi8KIAlCVUdfT04oeCAlIDIgPT0gMSk7CiAKLQlpZiAoZHNzZGV2LT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKLQkJZHNpLT5mcmFtZWRvbmVfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQkJZHNpLT5mcmFtZWRvbmVfZGF0YSA9IGRhdGE7CisJZHNpLT5mcmFtZWRvbmVfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlkc2ktPmZyYW1lZG9uZV9kYXRhID0gZGF0YTsKIAotCQlkc2ktPnVwZGF0ZV9yZWdpb24ueCA9IHg7Ci0JCWRzaS0+dXBkYXRlX3JlZ2lvbi55ID0geTsKLQkJZHNpLT51cGRhdGVfcmVnaW9uLncgPSB3OwotCQlkc2ktPnVwZGF0ZV9yZWdpb24uaCA9IGg7Ci0JCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UgPSBkc3NkZXY7CisJZHNpLT51cGRhdGVfcmVnaW9uLnggPSB4OworCWRzaS0+dXBkYXRlX3JlZ2lvbi55ID0geTsKKwlkc2ktPnVwZGF0ZV9yZWdpb24udyA9IHc7CisJZHNpLT51cGRhdGVfcmVnaW9uLmggPSBoOworCWRzaS0+dXBkYXRlX3JlZ2lvbi5kZXZpY2UgPSBkc3NkZXY7CiAKLQkJZHNpX3VwZGF0ZV9zY3JlZW5fZGlzcGMoZHNzZGV2LCB4LCB5LCB3LCBoKTsKLQl9IGVsc2UgewotCQlpbnQgcjsKLQotCQlyID0gZHNpX3VwZGF0ZV9zY3JlZW5fbDQoZHNzZGV2LCB4LCB5LCB3LCBoKTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQotCQlkc2lfcGVyZl9zaG93KGRzaWRldiwgIkw0Iik7Ci0JCWNhbGxiYWNrKDAsIGRhdGEpOwotCX0KKwlkc2lfdXBkYXRlX3NjcmVlbl9kaXNwYyhkc3NkZXYsIHgsIHksIHcsIGgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDEzLDI4ICs0MjE2LDkgQEAKIHN0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfaW5pdF9kaXNwYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJaW50IHI7Ci0JdTMyIGlycTsKIAotCWlycSA9IGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgPwotCQlESVNQQ19JUlFfRlJBTUVET05FIDogRElTUENfSVJRX0ZSQU1FRE9ORTI7Ci0KLQlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssICh2b2lkICopIGRzc2RldiwKLQkJCWlycSk7Ci0JaWYgKHIpIHsKLQkJRFNTRVJSKCJjYW4ndCBnZXQgRlJBTUVET05FIGlycVxuIik7Ci0JCXJldHVybiByOwotCX0KLQotCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwotCi0JZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19QQVJBTExFTE1PREVfRFNJKTsKLQlkaXNwY19lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAxKTsKLQotCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7Ci0KLQl7CisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX0NNRF9NT0RFKSB7CisJCXUzMiBpcnE7CiAJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5ncyA9IHsKIAkJCS5oc3cJCT0gMSwKIAkJCS5oZnAJCT0gMSwKQEAgLTQwNDQsMjEgKzQyMjgsNDYgQEAKIAkJCS52YnAJCT0gMCwKIAkJfTsKIAotCQlkaXNwY19zZXRfbGNkX3RpbWluZ3MoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJnRpbWluZ3MpOworCQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KKwkJCURJU1BDX0lSUV9GUkFNRURPTkUgOiBESVNQQ19JUlFfRlJBTUVET05FMjsKKworCQlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssCisJCQkodm9pZCAqKSBkc3NkZXYsIGlycSk7CisJCWlmIChyKSB7CisJCQlEU1NFUlIoImNhbid0IGdldCBGUkFNRURPTkUgaXJxXG4iKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJZGlzcGNfbWdyX2VuYWJsZV9zdGFsbG1vZGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdHJ1ZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAxKTsKKworCQlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsICZ0aW1pbmdzKTsKKwl9IGVsc2UgeworCQlkaXNwY19tZ3JfZW5hYmxlX3N0YWxsbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLCBmYWxzZSk7CisJCWRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhkc3NkZXYtPm1hbmFnZXItPmlkLCAwKTsKKworCQlkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQkmZHNzZGV2LT5wYW5lbC50aW1pbmdzKTsKIAl9CiAKKwkJZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOworCQlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlkc2lfZ2V0X3BpeGVsX3NpemUoZHNzZGV2LT5wYW5lbC5kc2lfcGl4X2ZtdCkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkc2lfZGlzcGxheV91bmluaXRfZGlzcGMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewotCXUzMiBpcnE7CisJaWYgKGRzc2Rldi0+cGFuZWwuZHNpX21vZGUgPT0gT01BUF9EU1NfRFNJX0NNRF9NT0RFKSB7CisJCXUzMiBpcnE7CiAKLQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KLQkJRElTUENfSVJRX0ZSQU1FRE9ORSA6IERJU1BDX0lSUV9GUkFNRURPTkUyOworCQlpcnEgPSBkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8KKwkJCURJU1BDX0lSUV9GUkFNRURPTkUgOiBESVNQQ19JUlFfRlJBTUVET05FMjsKIAotCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssICh2b2lkICopIGRzc2RldiwKLQkJCWlycSk7CisJCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZHNpX2ZyYW1lZG9uZV9pcnFfY2FsbGJhY2ssCisJCQkodm9pZCAqKSBkc3NkZXYsIGlycSk7CisJfQogfQogCiBzdGF0aWMgaW50IGRzaV9jb25maWd1cmVfZHNpX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCkBAIC00MTA2LDcgKzQzMTUsNyBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOworCXIgPSBkaXNwY19tZ3Jfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKSB7CiAJCURTU0VSUigiRmFpbGVkIHRvIHNldCBkaXNwYyBjbG9ja3NcbiIpOwogCQlyZXR1cm4gcjsKQEAgLTQxNjYsMTAgKzQzNzUsMTIgQEAKIAogCXJldHVybiAwOwogZXJyMzoKLQlkc2lfY2lvX3VuaW5pdChkc2lkZXYpOworCWRzaV9jaW9fdW5pbml0KGRzc2Rldik7CiBlcnIyOgogCWRzc19zZWxlY3RfZGlzcGNfY2xrX3NvdXJjZShPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CiAJZHNzX3NlbGVjdF9kc2lfY2xrX3NvdXJjZShkc2lfbW9kdWxlLCBPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CisJZHNzX3NlbGVjdF9sY2RfY2xrX3NvdXJjZShkc3NkZXYtPm1hbmFnZXItPmlkLCBPTUFQX0RTU19DTEtfU1JDX0ZDSyk7CisKIGVycjE6CiAJZHNpX3BsbF91bmluaXQoZHNpZGV2LCB0cnVlKTsKIGVycjA6CkBAIC00MTk1LDcgKzQ0MDYsOCBAQAogCiAJZHNzX3NlbGVjdF9kaXNwY19jbGtfc291cmNlKE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKIAlkc3Nfc2VsZWN0X2RzaV9jbGtfc291cmNlKGRzaV9tb2R1bGUsIE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKLQlkc2lfY2lvX3VuaW5pdChkc2lkZXYpOworCWRzc19zZWxlY3RfbGNkX2Nsa19zb3VyY2UoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgT01BUF9EU1NfQ0xLX1NSQ19GQ0spOworCWRzaV9jaW9fdW5pbml0KGRzc2Rldik7CiAJZHNpX3BsbF91bmluaXQoZHNpZGV2LCBkaXNjb25uZWN0X2xhbmVzKTsKIH0KIApAQCAtNDIxMSw2ICs0NDIzLDEyIEBACiAKIAltdXRleF9sb2NrKCZkc2ktPmxvY2spOwogCisJaWYgKGRzc2Rldi0+bWFuYWdlciA9PSBOVUxMKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5OiBubyBtYW5hZ2VyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3N0YXJ0X2RldjsKKwl9CisKIAlyID0gb21hcF9kc3Nfc3RhcnRfZGV2aWNlKGRzc2Rldik7CiAJaWYgKHIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gc3RhcnQgZGV2aWNlXG4iKTsKQEAgLTQzMDcsOSArNDUyNSwxMCBAQAogCiAJRFNTREJHKCJEU0kgaW5pdFxuIik7CiAKLQkvKiBYWFggdGhlc2Ugc2hvdWxkIGJlIGZpZ3VyZWQgb3V0IGR5bmFtaWNhbGx5ICovCi0JZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSB8Ci0JCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTTsKKwlpZiAoZHNzZGV2LT5wYW5lbC5kc2lfbW9kZSA9PSBPTUFQX0RTU19EU0lfQ01EX01PREUpIHsKKwkJZHNzZGV2LT5jYXBzID0gT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSB8CisJCQlPTUFQX0RTU19ESVNQTEFZX0NBUF9URUFSX0VMSU07CisJfQogCiAJaWYgKGRzaS0+dmRkc19kc2lfcmVnID09IE5VTEwpIHsKIAkJc3RydWN0IHJlZ3VsYXRvciAqdmRkc19kc2k7CkBAIC00NDM1LDEwICs0NjU0LDcgQEAKIAogCWRzaS0+ZHNzX2NsayA9IGNsazsKIAotCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDM2MzAoKSkKLQkJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJkc3MyX2Fsd29uX2ZjayIpOwotCWVsc2UKLQkJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJzeXNfY2xrIik7CisJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJzeXNfY2xrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IHN5c19jbGtcbiIpOwogCQljbGtfcHV0KGRzaS0+ZHNzX2Nsayk7CkBAIC00NDYyLDcgKzQ2NzgsNyBAQAogfQogCiAvKiBEU0kxIEhXIElQIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfZHNpMWh3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgb21hcF9kc2lod19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCiB7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpkc3NfcGxhdF9kYXRhOwogCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9pbmZvOwpAQCAtNDQ4Myw3ICs0Njk5LDggQEAKIAogCWRzc19wbGF0X2RhdGEgPSBkc2lkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWJvYXJkX2luZm8gPSBkc3NfcGxhdF9kYXRhLT5ib2FyZF9kYXRhOwotCWRzaS0+ZHNpX211eF9wYWRzID0gYm9hcmRfaW5mby0+ZHNpX211eF9wYWRzOworCWRzaS0+ZW5hYmxlX3BhZHMgPSBib2FyZF9pbmZvLT5kc2lfZW5hYmxlX3BhZHM7CisJZHNpLT5kaXNhYmxlX3BhZHMgPSBib2FyZF9pbmZvLT5kc2lfZGlzYWJsZV9wYWRzOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRzaS0+aXJxX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkc2ktPmVycm9yc19sb2NrKTsKQEAgLTQ1MzksNyArNDc1Niw3IEBACiAKIAkvKiBEU0kgVkNzIGluaXRpYWxpemF0aW9uICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNpLT52Yyk7IGkrKykgewotCQlkc2ktPnZjW2ldLm1vZGUgPSBEU0lfVkNfTU9ERV9MNDsKKwkJZHNpLT52Y1tpXS5zb3VyY2UgPSBEU0lfVkNfU09VUkNFX0w0OwogCQlkc2ktPnZjW2ldLmRzc2RldiA9IE5VTEw7CiAJCWRzaS0+dmNbaV0udmNfaWQgPSAwOwogCX0KQEAgLTQ1NzIsNyArNDc4OSw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9kc2kxaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgb21hcF9kc2lod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwogCkBAIC00NjAyLDEwICs0ODE5LDYgQEAKIAogc3RhdGljIGludCBkc2lfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwotCi0JY2xrX2Rpc2FibGUoZHNpLT5kc3NfY2xrKTsKLQogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAJZHNzX3J1bnRpbWVfcHV0KCk7CiAKQEAgLTQ2MTQsNyArNDgyNyw2IEBACiAKIHN0YXRpYyBpbnQgZHNpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwogCWludCByOwogCiAJciA9IGRzc19ydW50aW1lX2dldCgpOwpAQCAtNDYyNSw4ICs0ODM3LDYgQEAKIAlpZiAocikKIAkJZ290byBlcnJfZ2V0X2Rpc3BjOwogCi0JY2xrX2VuYWJsZShkc2ktPmRzc19jbGspOwotCiAJcmV0dXJuIDA7CiAKIGVycl9nZXRfZGlzcGM6CkBAIC00NjQwLDExICs0ODUwLDExIEBACiAJLnJ1bnRpbWVfcmVzdW1lID0gZHNpX3J1bnRpbWVfcmVzdW1lLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kc2kxaHdfZHJpdmVyID0gewotCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNpMWh3X3Byb2JlLAotCS5yZW1vdmUgICAgICAgICA9IG9tYXBfZHNpMWh3X3JlbW92ZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfZHNpaHdfZHJpdmVyID0geworCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNpaHdfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gb21hcF9kc2lod19yZW1vdmUsCiAJLmRyaXZlciAgICAgICAgID0gewotCQkubmFtZSAgID0gIm9tYXBkc3NfZHNpMSIsCisJCS5uYW1lICAgPSAib21hcGRzc19kc2kiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCiAJCS5wbQk9ICZkc2lfcG1fb3BzLAogCX0sCkBAIC00NjUyLDEwICs0ODYyLDEwIEBACiAKIGludCBkc2lfaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX2RzaTFod19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfZHNpaHdfZHJpdmVyKTsKIH0KIAogdm9pZCBkc2lfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9kc2kxaHdfZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfZHNpaHdfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKaW5kZXggMGY5YzNhNi4uMTcwMzM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNjM5LDYgKzY0MCwxNyBAQAogCVJFR19GTERfTU9EKERTU19DT05UUk9MLCBoZG1pLCAxNSwgMTUpOwkvKiBWRU5DX0hETUlfU1dJVENIICovCiB9CiAKK2VudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBkc3NfZ2V0X2hkbWlfdmVuY19jbGtfc291cmNlKHZvaWQpCit7CisJZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSBkaXNwbGF5czsKKworCWRpc3BsYXlzID0gZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9kaXNwbGF5cyhPTUFQX0RTU19DSEFOTkVMX0RJR0lUKTsKKwlpZiAoKGRpc3BsYXlzICYgT01BUF9ESVNQTEFZX1RZUEVfSERNSSkgPT0gMCkKKwkJcmV0dXJuIERTU19WRU5DX1RWX0NMSzsKKworCXJldHVybiBSRUdfR0VUKERTU19DT05UUk9MLCAxNSwgMTUpOworfQorCiBzdGF0aWMgaW50IGRzc19nZXRfY2xvY2tzKHZvaWQpCiB7CiAJc3RydWN0IGNsayAqY2xrOwpAQCAtNjkxLDExICs3MDMsNiBAQAogCWNsa19wdXQoZHNzLmRzc19jbGspOwogfQogCi1zdHJ1Y3QgY2xrICpkc3NfZ2V0X2ljayh2b2lkKQotewotCXJldHVybiBjbGtfZ2V0KCZkc3MucGRldi0+ZGV2LCAiaWNrIik7Ci19Ci0KIGludCBkc3NfcnVudGltZV9nZXQodm9pZCkKIHsKIAlpbnQgcjsKQEAgLTgyNCwxMyArODMxLDExIEBACiBzdGF0aWMgaW50IGRzc19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWRzc19zYXZlX2NvbnRleHQoKTsKLQljbGtfZGlzYWJsZShkc3MuZHNzX2Nsayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHNzX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQljbGtfZW5hYmxlKGRzcy5kc3NfY2xrKTsKIAlkc3NfcmVzdG9yZV9jb250ZXh0KCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCmluZGV4IDljOTRiMTEuLjYzMDhmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCkBAIC05NywxMCArOTcsMTAgQEAKICNkZWZpbmUgRkxEX01PRChvcmlnLCB2YWwsIHN0YXJ0LCBlbmQpIFwKIAkoKChvcmlnKSAmIH5GTERfTUFTSyhzdGFydCwgZW5kKSkgfCBGTERfVkFMKHZhbCwgc3RhcnQsIGVuZCkpCiAKLWVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSB7Ci0JT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUywJCS8qIE1JUEkgRFBJICovCi0JT01BUF9EU1NfUEFSQUxMRUxNT0RFX1JGQkksCQkvKiBNSVBJIERCSSAqLwotCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0ksCitlbnVtIGRzc19pb19wYWRfbW9kZSB7CisJRFNTX0lPX1BBRF9NT0RFX1JFU0VULAorCURTU19JT19QQURfTU9ERV9SRkJJLAorCURTU19JT19QQURfTU9ERV9CWVBBU1MsCiB9OwogCiBlbnVtIGRzc19oZG1pX3ZlbmNfY2xrX3NvdXJjZV9zZWxlY3QgewpAQCAtMTA4LDYgKzEwOCwxMSBAQAogCURTU19IRE1JX01fUENMSyA9IDEsCiB9OwogCitlbnVtIGRzc19kc2lfY29udGVudF90eXBlIHsKKwlEU1NfRFNJX0NPTlRFTlRfRENTLAorCURTU19EU0lfQ09OVEVOVF9HRU5FUklDLAorfTsKKwogc3RydWN0IGRzc19jbG9ja19pbmZvIHsKIAkvKiByYXRlcyB0aGF0IHdlIGdldCB3aXRoIGRpdmlkZXJzIGJlbG93ICovCiAJdW5zaWduZWQgbG9uZyBmY2s7CkBAIC0xNTAsMTYgKzE1NSw2IEBACiAJYm9vbCB1c2Vfc3lzX2NsazsKIH07CiAKLS8qIEhETUkgUExMIHN0cnVjdHVyZSAqLwotc3RydWN0IGhkbWlfcGxsX2luZm8gewotCXUxNiByZWduOwotCXUxNiByZWdtOwotCXUzMiByZWdtZjsKLQl1MTYgcmVnbTI7Ci0JdTE2IHJlZ3NkOwotCXUxNiBkY29mcmVxOwotfTsKLQogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIApAQCAtMjA5LDkgKzIwNCw4IEBACiBpbnQgZHNzX3J1bnRpbWVfZ2V0KHZvaWQpOwogdm9pZCBkc3NfcnVudGltZV9wdXQodm9pZCk7CiAKLXN0cnVjdCBjbGsgKmRzc19nZXRfaWNrKHZvaWQpOwotCiB2b2lkIGRzc19zZWxlY3RfaGRtaV92ZW5jX2Nsa19zb3VyY2UoZW51bSBkc3NfaGRtaV92ZW5jX2Nsa19zb3VyY2Vfc2VsZWN0KTsKK2VudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCBkc3NfZ2V0X2hkbWlfdmVuY19jbGtfc291cmNlKHZvaWQpOwogY29uc3QgY2hhciAqZHNzX2dldF9nZW5lcmljX2Nsa19zb3VyY2VfbmFtZShlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgY2xrX3NyYyk7CiB2b2lkIGRzc19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwogCkBAIC0yNzksNiArMjczLDggQEAKIAogaW50IGRzaV9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CiB2b2lkIGRzaV9pcnFfaGFuZGxlcih2b2lkKTsKK3U4IGRzaV9nZXRfcGl4ZWxfc2l6ZShlbnVtIG9tYXBfZHNzX2RzaV9waXhlbF9mb3JtYXQgZm10KTsKKwogdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CiBpbnQgZHNpX3BsbF9zZXRfY2xvY2tfZGl2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKIAkJc3RydWN0IGRzaV9jbG9ja19pbmZvICpjaW5mbyk7CkBAIC0zMDksNiArMzA1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3J1bnRpbWVfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIH0KK3N0YXRpYyBpbmxpbmUgdTggZHNpX2dldF9waXhlbF9zaXplKGVudW0gb21hcF9kc3NfZHNpX3BpeGVsX2Zvcm1hdCBmbXQpCit7CisJV0FSTigiJXM6IERTSSBub3QgY29tcGlsZWQgaW4sIHJldHVybmluZyBwaXhlbF9zaXplIGFzIDBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIAlXQVJOKCIlczogRFNJIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuaW5nIHJhdGUgYXMgMFxuIiwgX19mdW5jX18pOwpAQCAtMzg1LDkwICszODYsNzEgQEAKIHZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWxfcG9sYXJpdHkoYm9vbCBhY3RfaGlnaCk7CiB2b2lkIGRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKGJvb2wgZW5hYmxlKTsKIHZvaWQgZGlzcGNfcGNrX2ZyZWVfZW5hYmxlKGJvb2wgZW5hYmxlKTsKLXZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwotCi12b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwogdm9pZCBkaXNwY19zZXRfZGlnaXRfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwotdTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKTsKLXZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpOwogdm9pZCBkaXNwY19lbmFibGVfZmlmb21lcmdlKGJvb2wgZW5hYmxlKTsKLXUzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwotdm9pZCBkaXNwY19lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKLXZvaWQgZGlzcGNfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKTsKLQotdm9pZCBkaXNwY19zZXRfcGxhbmVfYmEwKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIHBhZGRyKTsKLXZvaWQgZGlzcGNfc2V0X3BsYW5lX2JhMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcik7Ci12b2lkIGRpc3BjX3NldF9wbGFuZV9wb3MoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MTYgeCwgdTE2IHkpOwotdm9pZCBkaXNwY19zZXRfcGxhbmVfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7Ci12b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWxfb3V0KTsKLQogdm9pZCBkaXNwY19lbmFibGVfZ2FtbWFfdGFibGUoYm9vbCBlbmFibGUpOwotaW50IGRpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKLQkJICAgICAgdTMyIHBhZGRyLCB1MTYgc2NyZWVuX3dpZHRoLAotCQkgICAgICB1MTYgcG9zX3gsIHUxNiBwb3NfeSwKLQkJICAgICAgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAotCQkgICAgICB1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCwKLQkJICAgICAgZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKLQkJICAgICAgYm9vbCBpbGFjZSwKLQkJICAgICAgZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGUsCi0JCSAgICAgIHU4IHJvdGF0aW9uLCBib29sIG1pcnJvciwKLQkJICAgICAgdTggZ2xvYmFsX2FscGhhLCB1OCBwcmVfbXVsdF9hbHBoYSwKLQkJICAgICAgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKLQkJICAgICAgdTMyIHB1dl9hZGRyKTsKLQotYm9vbCBkaXNwY19nb19idXN5KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwotdm9pZCBkaXNwY19nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKLXZvaWQgZGlzcGNfZW5hYmxlX2NoYW5uZWwoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwotYm9vbCBkaXNwY19pc19jaGFubmVsX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Ci1pbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19lbmFibGVfcmVwbGljYXRpb24oZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSk7Ci0KLXZvaWQgZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCWVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSBtb2RlKTsKLXZvaWQgZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHU4IGRhdGFfbGluZXMpOwotdm9pZCBkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQllbnVtIG9tYXBfbGNkX2Rpc3BsYXlfdHlwZSB0eXBlKTsKIHZvaWQgZGlzcGNfc2V0X2xvYWRtb2RlKGVudW0gb21hcF9kc3NfbG9hZF9tb2RlIG1vZGUpOwogCi12b2lkIGRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBjb2xvcik7Ci11MzIgZGlzcGNfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Ci12b2lkIGRpc3BjX3NldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCi0JCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHlwZSwKLQkJdTMyIHRyYW5zX2tleSk7Ci12b2lkIGRpc3BjX2dldF90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsCi0JCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgKnR5cGUsCi0JCXUzMiAqdHJhbnNfa2V5KTsKLXZvaWQgZGlzcGNfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoZW51bSBvbWFwX2NoYW5uZWwgY2gsIGJvb2wgZW5hYmxlKTsKLWJvb2wgZGlzcGNfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOwotYm9vbCBkaXNwY19hbHBoYV9ibGVuZGluZ19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKTsKLQogYm9vbCBkaXNwY19sY2RfdGltaW5nc19vayhzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKLXZvaWQgZGlzcGNfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwogdW5zaWduZWQgbG9uZyBkaXNwY19mY2xrX3JhdGUodm9pZCk7Ci11bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZGlzcGNfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwotdm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKLQkJZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYik7CiB2b2lkIGRpc3BjX2ZpbmRfY2xrX2RpdnMoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywgdW5zaWduZWQgbG9uZyBmY2ssCiAJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CiBpbnQgZGlzcGNfY2FsY19jbG9ja19yYXRlcyh1bnNpZ25lZCBsb25nIGRpc3BjX2ZjbGtfcmF0ZSwKIAkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKLWludCBkaXNwY19zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCi0JCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7Ci1pbnQgZGlzcGNfZ2V0X2Nsb2NrX2RpdihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pOwogCiAKK3UzMiBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwordTMyIGRpc3BjX292bF9nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOworaW50IGRpc3BjX292bF9zZXR1cChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2ksCisJCWJvb2wgaWxhY2UsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgcmVwbGljYXRpb24sCisJCXUzMiBmaWZvX2xvdywgdTMyIGZpZm9faGlnaCk7CitpbnQgZGlzcGNfb3ZsX2VuYWJsZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKTsKKworCit2b2lkIGRpc3BjX21ncl9lbmFibGVfZmlmb2hhbmRjaGVjayhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSk7Cit2b2lkIGRpc3BjX21ncl9zZXRfbGNkX3NpemUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0KTsKK3ZvaWQgZGlzcGNfbWdyX2VuYWJsZV9jcHIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKTsKK2Jvb2wgZGlzcGNfbWdyX2dvX2J1c3koZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9nbyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKK3ZvaWQgZGlzcGNfbWdyX2VuYWJsZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSk7Citib29sIGRpc3BjX21ncl9pc19jaGFubmVsX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9zZXRfaW9fcGFkX21vZGUoZW51bSBkc3NfaW9fcGFkX21vZGUgbW9kZSk7Cit2b2lkIGRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1OCBkYXRhX2xpbmVzKTsKK3ZvaWQgZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9sY2RfZGlzcGxheV90eXBlIHR5cGUpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKTsKK3UzMiBkaXNwY19tZ3JfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7Cit2b2lkIGRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLAorCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlIHR5cGUsCisJCXUzMiB0cmFuc19rZXkpOwordm9pZCBkaXNwY19tZ3JfZ2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKKwkJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSAqdHlwZSwKKwkJdTMyICp0cmFuc19rZXkpOwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19tZ3JfZW5hYmxlX2FscGhhX2ZpeGVkX3pvcmRlcihlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpOworYm9vbCBkaXNwY19tZ3JfdHJhbnNfa2V5X2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOworYm9vbCBkaXNwY19tZ3JfYWxwaGFfZml4ZWRfem9yZGVyX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpOwordm9pZCBkaXNwY19tZ3Jfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwordm9pZCBkaXNwY19tZ3Jfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnLCB1OCBhY2JpLCB1OCBhY2IpOwordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfbGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwordW5zaWduZWQgbG9uZyBkaXNwY19tZ3JfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOworaW50IGRpc3BjX21ncl9zZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CitpbnQgZGlzcGNfbWdyX2dldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKKwogLyogVkVOQyAqLwogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfVkVOQwogaW50IHZlbmNfaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCk7CiB2b2lkIHZlbmNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgdmVuY19kdW1wX3JlZ3Moc3RydWN0IHNlcV9maWxlICpzKTsKIGludCB2ZW5jX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKK3Vuc2lnbmVkIGxvbmcgdmVuY19nZXRfcGl4ZWxfY2xvY2sodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgdmVuY19pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewpAQCAtNDc3LDYgKzQ1OSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIHZlbmNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKQogewogfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZlbmNfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpCit7CisJV0FSTigiJXM6IFZFTkMgbm90IGNvbXBpbGVkIGluLCByZXR1cm5pbmcgcGNsayBhcyAwXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogLyogSERNSSAqLwpAQCAtNDg0LDYgKzQ3MSw4IEBACiBpbnQgaGRtaV9pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgaGRtaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpOwogaW50IGhkbWlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit1bnNpZ25lZCBsb25nIGhkbWlfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpOwordm9pZCBoZG1pX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGhkbWlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKQEAgLTQ5NiwxMiArNDg1LDE5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpCiB7CiB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGRtaV9nZXRfcGl4ZWxfY2xvY2sodm9pZCkKK3sKKwlXQVJOKCIlczogSERNSSBub3QgY29tcGlsZWQgaW4sIHJldHVybmluZyBwY2xrIGFzIDBcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogaW50IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogdm9pZCBvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CiB2b2lkIG9tYXBkc3NfaGRtaV9kaXNwbGF5X3NldF90aW1pbmcoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKIGludCBvbWFwZHNzX2hkbWlfZGlzcGxheV9jaGVja190aW1pbmcoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAogCQkJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKK2ludCBvbWFwZHNzX2hkbWlfcmVhZF9lZGlkKHU4ICpidWYsIGludCBsZW4pOworYm9vbCBvbWFwZHNzX2hkbWlfZGV0ZWN0KHZvaWQpOwogaW50IGhkbWlfcGFuZWxfaW5pdCh2b2lkKTsKIHZvaWQgaGRtaV9wYW5lbF9leGl0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCmluZGV4IGI0MTVjNGUuLmI0MDI2OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJY29uc3QgaW50IG51bV9vdmxzOwogCWNvbnN0IGVudW0gb21hcF9kaXNwbGF5X3R5cGUgKnN1cHBvcnRlZF9kaXNwbGF5czsKIAljb25zdCBlbnVtIG9tYXBfY29sb3JfbW9kZSAqc3VwcG9ydGVkX2NvbG9yX21vZGVzOworCWNvbnN0IGVudW0gb21hcF9vdmVybGF5X2NhcHMgKm92ZXJsYXlfY2FwczsKIAljb25zdCBjaGFyICogY29uc3QgKmNsa3NyY19uYW1lczsKIAljb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlICpkc3NfcGFyYW1zOwogCkBAIC0yMDksNiArMjEwLDY4IEBACiAJT01BUF9EU1NfQ09MT1JfQVJHQjE2IHwgT01BUF9EU1NfQ09MT1JfWFJHQjE2XzE1NTUgfAogCU9NQVBfRFNTX0NPTE9SX0FSR0IzMiB8IE9NQVBfRFNTX0NPTE9SX1JHQlgxNiB8CiAJT01BUF9EU1NfQ09MT1JfUkdCWDMyLAorCisJLyogT01BUF9EU1NfVklERU8zICovCisJT01BUF9EU1NfQ09MT1JfUkdCMTYgfCBPTUFQX0RTU19DT0xPUl9SR0IxMlUgfAorCU9NQVBfRFNTX0NPTE9SX1lVVjIgfCBPTUFQX0RTU19DT0xPUl9BUkdCMTZfMTU1NSB8CisJT01BUF9EU1NfQ09MT1JfUkdCQTMyIHwgT01BUF9EU1NfQ09MT1JfTlYxMiB8CisJT01BUF9EU1NfQ09MT1JfUkdCQTE2IHwgT01BUF9EU1NfQ09MT1JfUkdCMjRVIHwKKwlPTUFQX0RTU19DT0xPUl9SR0IyNFAgfCBPTUFQX0RTU19DT0xPUl9VWVZZIHwKKwlPTUFQX0RTU19DT0xPUl9BUkdCMTYgfCBPTUFQX0RTU19DT0xPUl9YUkdCMTZfMTU1NSB8CisJT01BUF9EU1NfQ09MT1JfQVJHQjMyIHwgT01BUF9EU1NfQ09MT1JfUkdCWDE2IHwKKwlPTUFQX0RTU19DT0xPUl9SR0JYMzIsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBvbWFwX292ZXJsYXlfY2FwcyBvbWFwMl9kc3Nfb3ZlcmxheV9jYXBzW10gPSB7CisJLyogT01BUF9EU1NfR0ZYICovCisJMCwKKworCS8qIE9NQVBfRFNTX1ZJREVPMSAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUsCisKKwkvKiBPTUFQX0RTU19WSURFTzIgKi8KKwlPTUFQX0RTU19PVkxfQ0FQX1NDQUxFLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gb21hcF9vdmVybGF5X2NhcHMgb21hcDM0MzBfZHNzX292ZXJsYXlfY2Fwc1tdID0geworCS8qIE9NQVBfRFNTX0dGWCAqLworCU9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBLAorCisJLyogT01BUF9EU1NfVklERU8xICovCisJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSwKKworCS8qIE9NQVBfRFNTX1ZJREVPMiAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIG9tYXAzNjMwX2Rzc19vdmVybGF5X2NhcHNbXSA9IHsKKwkvKiBPTUFQX0RTU19HRlggKi8KKwlPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8IE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEsCisKKwkvKiBPTUFQX0RTU19WSURFTzEgKi8KKwlPTUFQX0RTU19PVkxfQ0FQX1NDQUxFLAorCisJLyogT01BUF9EU1NfVklERU8yICovCisJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSB8IE9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBIHwKKwkJT01BUF9EU1NfT1ZMX0NBUF9QUkVfTVVMVF9BTFBIQSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIG9tYXA0X2Rzc19vdmVybGF5X2NhcHNbXSA9IHsKKwkvKiBPTUFQX0RTU19HRlggKi8KKwlPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8IE9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfAorCQlPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMSAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMiAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKKworCS8qIE9NQVBfRFNTX1ZJREVPMyAqLworCU9NQVBfRFNTX09WTF9DQVBfU0NBTEUgfCBPTUFQX0RTU19PVkxfQ0FQX0dMT0JBTF9BTFBIQSB8CisJCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgfCBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb21hcDJfZHNzX2Nsa19zb3VyY2VfbmFtZXNbXSA9IHsKQEAgLTIzMywzMiArMjk2LDM4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlIG9tYXAyX2Rzc19wYXJhbV9yYW5nZVtdID0gewogCVtGRUFUX1BBUkFNX0RTU19GQ0tdCQkJPSB7IDAsIDE3MzAwMDAwMCB9LAorCVtGRUFUX1BBUkFNX0RTU19QQ0RdCQkJPSB7IDIsIDI1NSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdOXQkJPSB7IDAsIDAgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV0JCT0geyAwLCAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRElTUENdCQk9IHsgMCwgMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdNX0RTSV0JCT0geyAwLCAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0ZJTlRdCQk9IHsgMCwgMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9MUERJVl0JCT0geyAwLCAwIH0sCisJW0ZFQVRfUEFSQU1fRE9XTlNDQUxFXQkJCT0geyAxLCAyIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRzc19wYXJhbV9yYW5nZSBvbWFwM19kc3NfcGFyYW1fcmFuZ2VbXSA9IHsKIAlbRkVBVF9QQVJBTV9EU1NfRkNLXQkJCT0geyAwLCAxNzMwMDAwMDAgfSwKKwlbRkVBVF9QQVJBTV9EU1NfUENEXQkJCT0geyAxLCAyNTUgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTl0JCT0geyAwLCAoMSA8PCA3KSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV0JCT0geyAwLCAoMSA8PCAxMSkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRElTUENdCQk9IHsgMCwgKDEgPDwgNCkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX1JFR01fRFNJXQkJPSB7IDAsICgxIDw8IDQpIC0gMSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9GSU5UXQkJPSB7IDc1MDAwMCwgMjEwMDAwMCB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9MUERJVl0JCT0geyAxLCAoMSA8PCAxMykgLSAxfSwKKwlbRkVBVF9QQVJBTV9ET1dOU0NBTEVdCQkJPSB7IDEsIDQgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlIG9tYXA0X2Rzc19wYXJhbV9yYW5nZVtdID0gewogCVtGRUFUX1BBUkFNX0RTU19GQ0tdCQkJPSB7IDAsIDE4NjAwMDAwMCB9LAorCVtGRUFUX1BBUkFNX0RTU19QQ0RdCQkJPSB7IDEsIDI1NSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdOXQkJPSB7IDAsICgxIDw8IDgpIC0gMSB9LAogCVtGRUFUX1BBUkFNX0RTSVBMTF9SRUdNXQkJPSB7IDAsICgxIDw8IDEyKSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9ESVNQQ10JCT0geyAwLCAoMSA8PCA1KSAtIDEgfSwKIAlbRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9EU0ldCQk9IHsgMCwgKDEgPDwgNSkgLSAxIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0ZJTlRdCQk9IHsgNTAwMDAwLCAyNTAwMDAwIH0sCiAJW0ZFQVRfUEFSQU1fRFNJUExMX0xQRElWXQkJPSB7IDAsICgxIDw8IDEzKSAtIDEgfSwKKwlbRkVBVF9QQVJBTV9ET1dOU0NBTEVdCQkJPSB7IDEsIDQgfSwKIH07CiAKIC8qIE9NQVAyIERTUyBGZWF0dXJlcyAqLwpAQCAtMjc1LDYgKzM0NCw3IEBACiAJLm51bV9vdmxzID0gMywKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDJfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDJfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDJfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDJfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwMl9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxLApAQCAtMjg3LDE4ICszNTcsMTkgQEAKIAkubnVtX3JlZ19maWVsZHMgPSBBUlJBWV9TSVpFKG9tYXAzX2Rzc19yZWdfZmllbGRzKSwKIAogCS5oYXNfZmVhdHVyZQk9Ci0JCUZFQVRfR0xPQkFMX0FMUEhBIHwgRkVBVF9MQ0RFTkFCTEVQT0wgfAorCQlGRUFUX0xDREVOQUJMRVBPTCB8CiAJCUZFQVRfTENERU5BQkxFU0lHTkFMIHwgRkVBVF9QQ0tGUkVFRU5BQkxFIHwKIAkJRkVBVF9GVU5DR0FURUQgfCBGRUFUX1JPV1JFUEVBVEVOQUJMRSB8CiAJCUZFQVRfTElORUJVRkZFUlNQTElUIHwgRkVBVF9SRVNJWkVDT05GIHwKIAkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0RTSV9SRVZFUlNFX1RYQ0xLRVNDIHwKIAkJRkVBVF9WRU5DX1JFUVVJUkVTX1RWX0RBQ19DTEsgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8Ci0JCUZFQVRfRklSX0NPRUZfViwKKwkJRkVBVF9GSVJfQ09FRl9WIHwgRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCiAJLnN1cHBvcnRlZF9kaXNwbGF5cyA9IG9tYXAzNDMwX2Rzc19zdXBwb3J0ZWRfZGlzcGxheXMsCiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXAzX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCisJLm92ZXJsYXlfY2FwcyA9IG9tYXAzNDMwX2Rzc19vdmVybGF5X2NhcHMsCiAJLmNsa3NyY19uYW1lcyA9IG9tYXAzX2Rzc19jbGtfc291cmNlX25hbWVzLAogCS5kc3NfcGFyYW1zID0gb21hcDNfZHNzX3BhcmFtX3JhbmdlLAogCS5idWZmZXJfc2l6ZV91bml0ID0gMSwKQEAgLTMxMCwxOCArMzgxLDE5IEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwM19kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUgICAgPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfTENERU5BQkxFUE9MIHwKKwkJRkVBVF9MQ0RFTkFCTEVQT0wgfAogCQlGRUFUX0xDREVOQUJMRVNJR05BTCB8IEZFQVRfUENLRlJFRUVOQUJMRSB8Ci0JCUZFQVRfUFJFX01VTFRfQUxQSEEgfCBGRUFUX0ZVTkNHQVRFRCB8CisJCUZFQVRfRlVOQ0dBVEVEIHwKIAkJRkVBVF9ST1dSRVBFQVRFTkFCTEUgfCBGRUFUX0xJTkVCVUZGRVJTUExJVCB8CiAJCUZFQVRfUkVTSVpFQ09ORiB8IEZFQVRfRFNJX1BMTF9QV1JfQlVHIHwKIAkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8Ci0JCUZFQVRfRklSX0NPRUZfViwKKwkJRkVBVF9GSVJfQ09FRl9WIHwgRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCiAJLnN1cHBvcnRlZF9kaXNwbGF5cyA9IG9tYXAzNjMwX2Rzc19zdXBwb3J0ZWRfZGlzcGxheXMsCiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXAzX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCisJLm92ZXJsYXlfY2FwcyA9IG9tYXAzNjMwX2Rzc19vdmVybGF5X2NhcHMsCiAJLmNsa3NyY19uYW1lcyA9IG9tYXAzX2Rzc19jbGtfc291cmNlX25hbWVzLAogCS5kc3NfcGFyYW1zID0gb21hcDNfZHNzX3BhcmFtX3JhbmdlLAogCS5idWZmZXJfc2l6ZV91bml0ID0gMSwKQEAgLTMzNSwxNyArNDA3LDE4IEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwNF9kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUJPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfUFJFX01VTFRfQUxQSEEgfAotCQlGRUFUX01HUl9MQ0QyIHwgRkVBVF9HTE9CQUxfQUxQSEFfVklEMSB8CisJCUZFQVRfTUdSX0xDRDIgfAogCQlGRUFUX0NPUkVfQ0xLX0RJViB8IEZFQVRfTENEX0NMS19TUkMgfAogCQlGRUFUX0RTSV9EQ1NfQ01EX0NPTkZJR19WQyB8IEZFQVRfRFNJX1ZDX09DUF9XSURUSCB8CiAJCUZFQVRfRFNJX0dOUSB8IEZFQVRfSEFORExFX1VWX1NFUEFSQVRFIHwgRkVBVF9BVFRSMiB8Ci0JCUZFQVRfQ1BSIHwgRkVBVF9QUkVMT0FEIHwgRkVBVF9GSVJfQ09FRl9WLAorCQlGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8IEZFQVRfRklSX0NPRUZfViB8CisJCUZFQVRfQUxQSEFfRlJFRV9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAzLAotCS5udW1fb3ZscyA9IDMsCisJLm51bV9vdmxzID0gNCwKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDRfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKQEAgLTM1OCwyNCArNDMxLDUwIEBACiAJLm51bV9yZWdfZmllbGRzID0gQVJSQVlfU0laRShvbWFwNF9kc3NfcmVnX2ZpZWxkcyksCiAKIAkuaGFzX2ZlYXR1cmUJPQotCQlGRUFUX0dMT0JBTF9BTFBIQSB8IEZFQVRfUFJFX01VTFRfQUxQSEEgfAotCQlGRUFUX01HUl9MQ0QyIHwgRkVBVF9HTE9CQUxfQUxQSEFfVklEMSB8CisJCUZFQVRfTUdSX0xDRDIgfAogCQlGRUFUX0NPUkVfQ0xLX0RJViB8IEZFQVRfTENEX0NMS19TUkMgfAogCQlGRUFUX0RTSV9EQ1NfQ01EX0NPTkZJR19WQyB8IEZFQVRfRFNJX1ZDX09DUF9XSURUSCB8CiAJCUZFQVRfRFNJX0dOUSB8IEZFQVRfSERNSV9DVFNfU1dNT0RFIHwKIAkJRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUgfCBGRUFUX0FUVFIyIHwgRkVBVF9DUFIgfAotCQlGRUFUX1BSRUxPQUQgfCBGRUFUX0ZJUl9DT0VGX1YsCisJCUZFQVRfUFJFTE9BRCB8IEZFQVRfRklSX0NPRUZfViB8IEZFQVRfQUxQSEFfRlJFRV9aT1JERVIsCiAKIAkubnVtX21ncnMgPSAzLAotCS5udW1fb3ZscyA9IDMsCisJLm51bV9vdmxzID0gNCwKIAkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKKwkub3ZlcmxheV9jYXBzID0gb21hcDRfZHNzX292ZXJsYXlfY2FwcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCiAJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKIAkuYnVyc3Rfc2l6ZV91bml0ID0gMTYsCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDRfRFNTX0hETUkpCisvKiBIRE1JIE9NQVA0IEZ1bmN0aW9ucyovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpX2hkbWlfaXBfb3BzIG9tYXA0X2hkbWlfZnVuY3Rpb25zID0geworCisJLnZpZGVvX2NvbmZpZ3VyZQk9CXRpX2hkbWlfNHh4eF9iYXNpY19jb25maWd1cmUsCisJLnBoeV9lbmFibGUJCT0JdGlfaGRtaV80eHh4X3BoeV9lbmFibGUsCisJLnBoeV9kaXNhYmxlCQk9CXRpX2hkbWlfNHh4eF9waHlfZGlzYWJsZSwKKwkucmVhZF9lZGlkCQk9CXRpX2hkbWlfNHh4eF9yZWFkX2VkaWQsCisJLmRldGVjdAkJCT0JdGlfaGRtaV80eHh4X2RldGVjdCwKKwkucGxsX2VuYWJsZQkJPQl0aV9oZG1pXzR4eHhfcGxsX2VuYWJsZSwKKwkucGxsX2Rpc2FibGUJCT0JdGlfaGRtaV80eHh4X3BsbF9kaXNhYmxlLAorCS52aWRlb19lbmFibGUJCT0JdGlfaGRtaV80eHh4X3dwX3ZpZGVvX3N0YXJ0LAorCS5kdW1wX3dyYXBwZXIJCT0JdGlfaGRtaV80eHh4X3dwX2R1bXAsCisJLmR1bXBfY29yZQkJPQl0aV9oZG1pXzR4eHhfY29yZV9kdW1wLAorCS5kdW1wX3BsbAkJPQl0aV9oZG1pXzR4eHhfcGxsX2R1bXAsCisJLmR1bXBfcGh5CQk9CXRpX2hkbWlfNHh4eF9waHlfZHVtcCwKKworfTsKKwordm9pZCBkc3NfaW5pdF9oZG1pX2lwX29wcyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCWlmIChjcHVfaXNfb21hcDQ0eHgoKSkKKwkJaXBfZGF0YS0+b3BzID0gJm9tYXA0X2hkbWlfZnVuY3Rpb25zOworfQorI2VuZGlmCisKIC8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgdmFsdWVzIHJlbGF0ZWQgdG8gYSBEU1MgZmVhdHVyZSAqLwogaW50IGRzc19mZWF0X2dldF9udW1fbWdycyh2b2lkKQogewpAQCAtNDA3LDYgKzUwNiwxMSBAQAogCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5zdXBwb3J0ZWRfY29sb3JfbW9kZXNbcGxhbmVdOwogfQogCitlbnVtIG9tYXBfb3ZlcmxheV9jYXBzIGRzc19mZWF0X2dldF9vdmVybGF5X2NhcHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lKQoreworCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5vdmVybGF5X2NhcHNbcGxhbmVdOworfQorCiBib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKaW5kZXggYjczOThjYi4uNmE2YzA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2lmbmRlZiBfX09NQVAyX0RTU19GRUFUVVJFU19ICiAjZGVmaW5lIF9fT01BUDJfRFNTX0ZFQVRVUkVTX0gKIAorI2lmIGRlZmluZWQoQ09ORklHX09NQVA0X0RTU19IRE1JKQorI2luY2x1ZGUgInRpX2hkbWkuaCIKKyNlbmRpZgorCiAjZGVmaW5lIE1BWF9EU1NfTUFOQUdFUlMJMwotI2RlZmluZSBNQVhfRFNTX09WRVJMQVlTCTMKKyNkZWZpbmUgTUFYX0RTU19PVkVSTEFZUwk0CiAjZGVmaW5lIE1BWF9EU1NfTENEX01BTkFHRVJTCTIKICNkZWZpbmUgTUFYX05VTV9EU0kJCTIKIAogLyogRFNTIGhhcyBmZWF0dXJlIGlkICovCiBlbnVtIGRzc19mZWF0X2lkIHsKLQlGRUFUX0dMT0JBTF9BTFBIQQkJPSAxIDw8IDAsCi0JRkVBVF9HTE9CQUxfQUxQSEFfVklEMQkJPSAxIDw8IDEsCi0JRkVBVF9QUkVfTVVMVF9BTFBIQQkJPSAxIDw8IDIsCiAJRkVBVF9MQ0RFTkFCTEVQT0wJCT0gMSA8PCAzLAogCUZFQVRfTENERU5BQkxFU0lHTkFMCQk9IDEgPDwgNCwKIAlGRUFUX1BDS0ZSRUVFTkFCTEUJCT0gMSA8PCA1LApAQCAtNTUsNiArNTYsOCBAQAogCUZFQVRfQ1BSCQkJPSAxIDw8IDIzLAogCUZFQVRfUFJFTE9BRAkJCT0gMSA8PCAyNCwKIAlGRUFUX0ZJUl9DT0VGX1YJCQk9IDEgPDwgMjUsCisJRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIJCT0gMSA8PCAyNiwKKwlGRUFUX0FMUEhBX0ZSRUVfWk9SREVSCQk9IDEgPDwgMjcsCiB9OwogCiAvKiBEU1MgcmVnaXN0ZXIgZmllbGQgaWQgKi8KQEAgLTc1LDEyICs3OCwxNCBAQAogCiBlbnVtIGRzc19yYW5nZV9wYXJhbSB7CiAJRkVBVF9QQVJBTV9EU1NfRkNLLAorCUZFQVRfUEFSQU1fRFNTX1BDRCwKIAlGRUFUX1BBUkFNX0RTSVBMTF9SRUdOLAogCUZFQVRfUEFSQU1fRFNJUExMX1JFR00sCiAJRkVBVF9QQVJBTV9EU0lQTExfUkVHTV9ESVNQQywKIAlGRUFUX1BBUkFNX0RTSVBMTF9SRUdNX0RTSSwKIAlGRUFUX1BBUkFNX0RTSVBMTF9GSU5ULAogCUZFQVRfUEFSQU1fRFNJUExMX0xQRElWLAorCUZFQVRfUEFSQU1fRE9XTlNDQUxFLAogfTsKIAogLyogRFNTIEZlYXR1cmUgRnVuY3Rpb25zICovCkBAIC05MCw2ICs5NSw3IEBACiB1bnNpZ25lZCBsb25nIGRzc19mZWF0X2dldF9wYXJhbV9tYXgoZW51bSBkc3NfcmFuZ2VfcGFyYW0gcGFyYW0pOwogZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSBkc3NfZmVhdF9nZXRfc3VwcG9ydGVkX2Rpc3BsYXlzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwogZW51bSBvbWFwX2NvbG9yX21vZGUgZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9jb2xvcl9tb2RlcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOworZW51bSBvbWFwX292ZXJsYXlfY2FwcyBkc3NfZmVhdF9nZXRfb3ZlcmxheV9jYXBzKGVudW0gb21hcF9wbGFuZSBwbGFuZSk7CiBib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSk7CiBjb25zdCBjaGFyICpkc3NfZmVhdF9nZXRfY2xrX3NvdXJjZV9uYW1lKGVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBpZCk7CkBAIC0xMDAsNCArMTA2LDcgQEAKIGJvb2wgZHNzX2hhc19mZWF0dXJlKGVudW0gZHNzX2ZlYXRfaWQgaWQpOwogdm9pZCBkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKGVudW0gZHNzX2ZlYXRfcmVnX2ZpZWxkIGlkLCB1OCAqc3RhcnQsIHU4ICplbmQpOwogdm9pZCBkc3NfZmVhdHVyZXNfaW5pdCh2b2lkKTsKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQNF9EU1NfSERNSSkKK3ZvaWQgZHNzX2luaXRfaGRtaV9pcF9vcHMoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jCmluZGV4IDI1NmYyN2EuLjMyNjJmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmMKQEAgLTM3LDI2ICszNyw0MSBAQAogCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSAidGlfaGRtaV80eHh4X2lwLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgInRpX2hkbWkuaCIKICNpbmNsdWRlICJkc3MuaCIKLSNpbmNsdWRlICJoZG1pLmgiCiAjaW5jbHVkZSAiZHNzX2ZlYXR1cmVzLmgiCiAKKyNkZWZpbmUgSERNSV9XUAkJCTB4MAorI2RlZmluZSBIRE1JX0NPUkVfU1lTCQkweDQwMAorI2RlZmluZSBIRE1JX0NPUkVfQVYJCTB4OTAwCisjZGVmaW5lIEhETUlfUExMQ1RSTAkJMHgyMDAKKyNkZWZpbmUgSERNSV9QSFkJCTB4MzAwCisKKy8qIEhETUkgRURJRCBMZW5ndGggbW92ZSB0aGlzICovCisjZGVmaW5lIEhETUlfRURJRF9NQVhfTEVOR1RICQkJMjU2CisjZGVmaW5lIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRQkJMHgxMgorI2RlZmluZSBFRElEX0RFU0NSSVBUT1JfQkxPQ0swX0FERFJFU1MJCTB4MzYKKyNkZWZpbmUgRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTCQkweDgwCisjZGVmaW5lIEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1IJNAorI2RlZmluZSBFRElEX1NJWkVfQkxPQ0sxX1RJTUlOR19ERVNDUklQVE9SCTQKKworI2RlZmluZSBPTUFQX0hETUlfVElNSU5HU19OQgkJCTM0CisKKyNkZWZpbmUgSERNSV9ERUZBVUxUX1JFR04gMTYKKyNkZWZpbmUgSERNSV9ERUZBVUxUX1JFR00yIDEKKwogc3RhdGljIHN0cnVjdCB7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXZvaWQgX19pb21lbSAqYmFzZV93cDsJLyogSERNSSB3cmFwcGVyICovCisJc3RydWN0IGhkbWlfaXBfZGF0YSBpcF9kYXRhOwogCWludCBjb2RlOwogCWludCBtb2RlOwotCXU4IGVkaWRbSERNSV9FRElEX01BWF9MRU5HVEhdOwotCXU4IGVkaWRfc2V0OwotCWJvb2wgY3VzdG9tX3NldDsKLQlzdHJ1Y3QgaGRtaV9jb25maWcgY2ZnOwogCiAJc3RydWN0IGNsayAqc3lzX2NsazsKLQlzdHJ1Y3QgY2xrICpoZG1pX2NsazsKIH0gaGRtaTsKIAogLyoKQEAgLTE0NCwzMCArMTU5LDYgQEAKIAktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKIAktMSwgMjcsIDI4LCAtMSwgMzN9OwogCi1zdGF0aWMgY29uc3QgdTggZWRpZF9oZWFkZXJbOF0gPSB7MHgwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDB9OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGRtaV93cml0ZV9yZWcoY29uc3Qgc3RydWN0IGhkbWlfcmVnIGlkeCwgdTMyIHZhbCkKLXsKLQlfX3Jhd193cml0ZWwodmFsLCBoZG1pLmJhc2Vfd3AgKyBpZHguaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgaGRtaV9yZWFkX3JlZyhjb25zdCBzdHJ1Y3QgaGRtaV9yZWcgaWR4KQotewotCXJldHVybiBfX3Jhd19yZWFkbChoZG1pLmJhc2Vfd3AgKyBpZHguaWR4KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGNvbnN0IHN0cnVjdCBoZG1pX3JlZyBpZHgsCi0JCQkJaW50IGIyLCBpbnQgYjEsIHUzMiB2YWwpCi17Ci0JdTMyIHQgPSAwOwotCXdoaWxlICh2YWwgIT0gUkVHX0dFVChpZHgsIGIyLCBiMSkpIHsKLQkJdWRlbGF5KDEpOwotCQlpZiAodCsrID4gMTAwMDApCi0JCQlyZXR1cm4gIXZhbDsKLQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQogc3RhdGljIGludCBoZG1pX3J1bnRpbWVfZ2V0KHZvaWQpCiB7CiAJaW50IHI7CkBAIC0xOTMsMzA0ICsxODQsNyBAQAogewogCURTU0RCRygiaW5pdF9kaXNwbGF5XG4iKTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX2luaXQoZW51bSBoZG1pX2Nsa19yZWZzZWwgcmVmc2VsLCBpbnQgZGNvZnJlcSwKLQkJc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCwgdTE2IHNkKQotewotCXUzMiByOwotCi0JLyogUExMIHN0YXJ0IGFsd2F5cyB1c2UgbWFudWFsIG1vZGUgKi8KLQlSRUdfRkxEX01PRChQTExDVFJMX1BMTF9DT05UUk9MLCAweDAsIDAsIDApOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcxKTsKLQlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20sIDIwLCA5KTsgLyogQ0ZHMV9QTExfUkVHTSAqLwotCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbiwgOCwgMSk7ICAvKiBDRkcxX1BMTF9SRUdOICovCi0KLQloZG1pX3dyaXRlX3JlZyhQTExDVFJMX0NGRzEsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcyKTsKLQotCXIgPSBGTERfTU9EKHIsIDB4MCwgMTIsIDEyKTsgLyogUExMX0hJR0hGUkVRIGRpdmlkZSBieSAyICovCi0JciA9IEZMRF9NT0QociwgMHgxLCAxMywgMTMpOyAvKiBQTExfUkVGRU4gKi8KLQlyID0gRkxEX01PRChyLCAweDAsIDE0LCAxNCk7IC8qIFBIWV9DTEtJTkVOIGRlLWFzc2VydCBkdXJpbmcgbG9ja2luZyAqLwotCi0JaWYgKGRjb2ZyZXEpIHsKLQkJLyogZGl2aWRlciBwcm9ncmFtbWluZyBmb3IgZnJlcXVlbmN5IGJleW9uZCAxMDAwTWh6ICovCi0JCVJFR19GTERfTU9EKFBMTENUUkxfQ0ZHMywgc2QsIDE3LCAxMCk7Ci0JCXIgPSBGTERfTU9EKHIsIDB4NCwgMywgMSk7IC8qIDEwMDBNSHogYW5kIDIwMDBNSHogKi8KLQl9IGVsc2UgewotCQlyID0gRkxEX01PRChyLCAweDIsIDMsIDEpOyAvKiA1MDBNSHogYW5kIDEwMDBNSHogKi8KLQl9Ci0KLQloZG1pX3dyaXRlX3JlZyhQTExDVFJMX0NGRzIsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkc0KTsKLQlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20yLCAyNCwgMTgpOwotCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbWYsIDE3LCAwKTsKLQotCWhkbWlfd3JpdGVfcmVnKFBMTENUUkxfQ0ZHNCwgcik7Ci0KLQkvKiBnbyBub3cgKi8KLQlSRUdfRkxEX01PRChQTExDVFJMX1BMTF9HTywgMHgxLCAwLCAwKTsKLQotCS8qIHdhaXQgZm9yIGJpdCBjaGFuZ2UgKi8KLQlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKFBMTENUUkxfUExMX0dPLCAwLCAwLCAxKSAhPSAxKSB7Ci0JCURTU0VSUigiUExMIEdPIGJpdCBub3Qgc2V0XG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JLyogV2FpdCB0aWxsIHRoZSBsb2NrIGJpdCBpcyBzZXQgaW4gUExMIHN0YXR1cyAqLwotCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoUExMQ1RSTF9QTExfU1RBVFVTLCAxLCAxLCAxKSAhPSAxKSB7Ci0JCURTU1dBUk4oImNhbm5vdCBsb2NrIFBMTFxuIik7Ci0JCURTU1dBUk4oIkNGRzEgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcxKSk7Ci0JCURTU1dBUk4oIkNGRzIgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkcyKSk7Ci0JCURTU1dBUk4oIkNGRzQgMHgleFxuIiwKLQkJCWhkbWlfcmVhZF9yZWcoUExMQ1RSTF9DRkc0KSk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCURTU0RCRygiUExMIGxvY2tlZCFcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFBIWV9QV1JfQ01EICovCi1zdGF0aWMgaW50IGhkbWlfc2V0X3BoeV9wd3IoZW51bSBoZG1pX3BoeV9wd3IgdmFsKQotewotCS8qIENvbW1hbmQgZm9yIHBvd2VyIGNvbnRyb2wgb2YgSERNSSBQSFkgKi8KLQlSRUdfRkxEX01PRChIRE1JX1dQX1BXUl9DVFJMLCB2YWwsIDcsIDYpOwotCi0JLyogU3RhdHVzIG9mIHRoZSBwb3dlciBjb250cm9sIG9mIEhETUkgUEhZICovCi0JaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShIRE1JX1dQX1BXUl9DVFJMLCA1LCA0LCB2YWwpICE9IHZhbCkgewotCQlEU1NFUlIoIkZhaWxlZCB0byBzZXQgUEhZIHBvd2VyIG1vZGUgdG8gJWRcbiIsIHZhbCk7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBQTExfUFdSX0NNRCAqLwotc3RhdGljIGludCBoZG1pX3NldF9wbGxfcHdyKGVudW0gaGRtaV9wbGxfcHdyIHZhbCkKLXsKLQkvKiBDb21tYW5kIGZvciBwb3dlciBjb250cm9sIG9mIEhETUkgUExMICovCi0JUkVHX0ZMRF9NT0QoSERNSV9XUF9QV1JfQ1RSTCwgdmFsLCAzLCAyKTsKLQotCS8qIHdhaXQgdGlsbCBQSFlfUFdSX1NUQVRVUyBpcyBzZXQgKi8KLQlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKEhETUlfV1BfUFdSX0NUUkwsIDEsIDAsIHZhbCkgIT0gdmFsKSB7Ci0JCURTU0VSUigiRmFpbGVkIHRvIHNldCBQSFlfUFdSX1NUQVRVU1xuIik7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX3Jlc2V0KHZvaWQpCi17Ci0JLyogU1lTUkVTRVQgIGNvbnRyb2xsZWQgYnkgcG93ZXIgRlNNICovCi0JUkVHX0ZMRF9NT0QoUExMQ1RSTF9QTExfQ09OVFJPTCwgMHgwLCAzLCAzKTsKLQotCS8qIFJFQUQgMHgwIHJlc2V0IGlzIGluIHByb2dyZXNzICovCi0JaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShQTExDVFJMX1BMTF9TVEFUVVMsIDAsIDAsIDEpICE9IDEpIHsKLQkJRFNTRVJSKCJGYWlsZWQgdG8gc3lzcmVzZXQgUExMXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9waHlfaW5pdCh2b2lkKQotewotCXUxNiByID0gMDsKLQotCXIgPSBoZG1pX3NldF9waHlfcHdyKEhETUlfUEhZUFdSQ01EX0xET09OKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0gaGRtaV9zZXRfcGh5X3B3cihIRE1JX1BIWVBXUkNNRF9UWE9OKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQkvKgotCSAqIFJlYWQgYWRkcmVzcyAwIGluIG9yZGVyIHRvIGdldCB0aGUgU0NQIHJlc2V0IGRvbmUgY29tcGxldGVkCi0JICogRHVtbXkgYWNjZXNzIHBlcmZvcm1lZCB0byBtYWtlIHN1cmUgcmVzZXQgaXMgZG9uZQotCSAqLwotCWhkbWlfcmVhZF9yZWcoSERNSV9UWFBIWV9UWF9DVFJMKTsKLQotCS8qCi0JICogV3JpdGUgdG8gcGh5IGFkZHJlc3MgMCB0byBjb25maWd1cmUgdGhlIGNsb2NrCi0JICogdXNlIEhGQklUQ0xLIHdyaXRlIEhETUlfVFhQSFlfVFhfQ09OVFJPTF9GUkVRT1VUIGZpZWxkCi0JICovCi0JUkVHX0ZMRF9NT0QoSERNSV9UWFBIWV9UWF9DVFJMLCAweDEsIDMxLCAzMCk7Ci0KLQkvKiBXcml0ZSB0byBwaHkgYWRkcmVzcyAxIHRvIHN0YXJ0IEhETUkgbGluZSAoVFhWQUxJRCBhbmQgVE1EU0NMS0VOKSAqLwotCWhkbWlfd3JpdGVfcmVnKEhETUlfVFhQSFlfRElHSVRBTF9DVFJMLCAweEYwMDAwMDAwKTsKLQotCS8qIFNldHVwIG1heCBMRE8gdm9sdGFnZSAqLwotCVJFR19GTERfTU9EKEhETUlfVFhQSFlfUE9XRVJfQ1RSTCwgMHhCLCAzLCAwKTsKLQotCS8qIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDMgdG8gY2hhbmdlIHRoZSBwb2xhcml0eSBjb250cm9sICovCi0JUkVHX0ZMRF9NT0QoSERNSV9UWFBIWV9QQURfQ0ZHX0NUUkwsIDB4MSwgMjcsIDI3KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfcGxsX3Byb2dyYW0oc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCkKLXsKLQl1MTYgciA9IDA7Ci0JZW51bSBoZG1pX2Nsa19yZWZzZWwgcmVmc2VsOwotCi0JciA9IGhkbWlfc2V0X3BsbF9wd3IoSERNSV9QTExQV1JDTURfQUxMT0ZGKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyID0gaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9CT1RIT05fQUxMQ0xLUyk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JciA9IGhkbWlfcGxsX3Jlc2V0KCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JcmVmc2VsID0gSERNSV9SRUZTRUxfU1lTQ0xLOwotCi0JciA9IGhkbWlfcGxsX2luaXQocmVmc2VsLCBmbXQtPmRjb2ZyZXEsIGZtdCwgZm10LT5yZWdzZCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfcGh5X29mZih2b2lkKQotewotCWhkbWlfc2V0X3BoeV9wd3IoSERNSV9QSFlQV1JDTURfT0ZGKTsKLX0KLQotc3RhdGljIGludCBoZG1pX2NvcmVfZGRjX2VkaWQodTggKnBlZGlkLCBpbnQgZXh0KQotewotCXUzMiBpLCBqOwotCWNoYXIgY2hlY2tzdW0gPSAwOwotCXUzMiBvZmZzZXQgPSAwOwotCi0JLyogVHVybiBvbiBDTEsgZm9yIEREQyAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9EUEQsIDB4NywgMiwgMCk7Ci0KLQkvKgotCSAqIFNXIEhBQ0sgOiBXaXRob3V0IHRoZSBEZWxheSBEREMoaTJjIGJ1cykgcmVhZHMgMCB2YWx1ZXMgLwotCSAqIHJpZ2h0IHNoaWZ0ZWQgdmFsdWVzKCBUaGUgYmVoYXZpb3IgaXMgbm90IGNvbnNpc3RlbnQgYW5kIHNlZW4gb25seQotCSAqIHdpdGggc29tZSBUVidzKQotCSAqLwotCXVzbGVlcF9yYW5nZSg4MDAsIDEwMDApOwotCi0JaWYgKCFleHQpIHsKLQkJLyogQ2xrIFNDTCBEZXZpY2VzICovCi0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQ01ELCAweEEsIDMsIDApOwotCi0JCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KLQkJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShIRE1JX0NPUkVfRERDX1NUQVRVUywKLQkJCQkJCTQsIDQsIDApICE9IDApIHsKLQkJCURTU0VSUigiRmFpbGVkIHRvIHByb2dyYW0gRERDXG4iKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0KLQkJLyogQ2xlYXIgRklGTyAqLwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NNRCwgMHg5LCAzLCAwKTsKLQotCQkvKiBIRE1JX0NPUkVfRERDX1NUQVRVU19JTl9QUk9HICovCi0JCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoSERNSV9DT1JFX0REQ19TVEFUVVMsCi0JCQkJCQk0LCA0LCAwKSAhPSAwKSB7Ci0JCQlEU1NFUlIoIkZhaWxlZCB0byBwcm9ncmFtIEREQ1xuIik7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCi0JfSBlbHNlIHsKLQkJaWYgKGV4dCAlIDIgIT0gMCkKLQkJCW9mZnNldCA9IDB4ODA7Ci0JfQotCi0JLyogTG9hZCBTZWdtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX1NFR00sIGV4dC8yLCA3LCAwKTsKLQotCS8qIExvYWQgU2xhdmUgQWRkcmVzcyBSZWdpc3RlciAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQUREUiwgMHhBMCA+PiAxLCA3LCAxKTsKLQotCS8qIExvYWQgT2Zmc2V0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX09GRlNFVCwgb2Zmc2V0LCA3LCAwKTsKLQotCS8qIExvYWQgQnl0ZSBDb3VudCAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9ERENfQ09VTlQxLCAweDgwLCA3LCAwKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NPVU5UMiwgMHgwLCAxLCAwKTsKLQotCS8qIFNldCBERENfQ01EICovCi0JaWYgKGV4dCkKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0REQ19DTUQsIDB4NCwgMywgMCk7Ci0JZWxzZQotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfRERDX0NNRCwgMHgyLCAzLCAwKTsKLQotCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0JVU19MT1cgKi8KLQlpZiAoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgNiwgNikgPT0gMSkgewotCQlEU1NXQVJOKCJJMkMgQnVzIExvdz9cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JLyogSERNSV9DT1JFX0REQ19TVEFUVVNfTk9fQUNLICovCi0JaWYgKFJFR19HRVQoSERNSV9DT1JFX0REQ19TVEFUVVMsIDUsIDUpID09IDEpIHsKLQkJRFNTV0FSTigiSTJDIE5vIEFja1xuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWkgPSBleHQgKiAxMjg7Ci0JaiA9IDA7Ci0Jd2hpbGUgKCgoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgNCwgNCkgPT0gMSkgfHwKLQkJCShSRUdfR0VUKEhETUlfQ09SRV9ERENfU1RBVFVTLCAyLCAyKSA9PSAwKSkgJiYKLQkJCWogPCAxMjgpIHsKLQotCQlpZiAoUkVHX0dFVChIRE1JX0NPUkVfRERDX1NUQVRVUywgMiwgMikgPT0gMCkgewotCQkJLyogRklGTyBub3QgZW1wdHkgKi8KLQkJCXBlZGlkW2krK10gPSBSRUdfR0VUKEhETUlfQ09SRV9ERENfREFUQSwgNywgMCk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTI4OyBqKyspCi0JCWNoZWNrc3VtICs9IHBlZGlkW2pdOwotCi0JaWYgKGNoZWNrc3VtICE9IDApIHsKLQkJRFNTRVJSKCJFLUVESUQgY2hlY2tzdW0gZmFpbGVkISFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2VkaWQodTggKnBlZGlkLCB1MTYgbWF4X2xlbmd0aCkKLXsKLQlpbnQgciA9IDAsIG4gPSAwLCBpID0gMDsKLQlpbnQgbWF4X2V4dF9ibG9ja3MgPSAobWF4X2xlbmd0aCAvIDEyOCkgLSAxOwotCi0JciA9IGhkbWlfY29yZV9kZGNfZWRpZChwZWRpZCwgMCk7Ci0JaWYgKHIpIHsKLQkJcmV0dXJuIHI7Ci0JfSBlbHNlIHsKLQkJbiA9IHBlZGlkWzB4N2VdOwotCi0JCS8qCi0JCSAqIFJFQURNRTogbmVlZCB0byBjb21wbHkgd2l0aCBtYXhfbGVuZ3RoIHNldCBieSB0aGUgY2FsbGVyLgotCQkgKiBCZXR0ZXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeQotCQkgKiBtZW1vcnkgdG8gc3RvcmUgRURJRCBhY2NvcmRpbmcgdG8gbmJfYmxvY2sgZmllbGQgZm91bmQKLQkJICogaW4gZmlyc3QgYmxvY2sKLQkJICovCi0JCWlmIChuID4gbWF4X2V4dF9ibG9ja3MpCi0JCQluID0gbWF4X2V4dF9ibG9ja3M7Ci0KLQkJZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsKLQkJCXIgPSBoZG1pX2NvcmVfZGRjX2VkaWQocGVkaWQsIGkpOwotCQkJaWYgKHIpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQl9CisJZHNzX2luaXRfaGRtaV9pcF9vcHMoJmhkbWkuaXBfZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxOCw3ICsyMTIsNyBAQAogewogCWludCBpID0gMCwgY29kZSA9IC0xLCB0ZW1wX3ZzeW5jID0gMCwgdGVtcF9oc3luYyA9IDA7CiAJaW50IHRpbWluZ192c3luYyA9IDAsIHRpbWluZ19oc3luYyA9IDA7Ci0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0ZW1wOworCXN0cnVjdCBoZG1pX3ZpZGVvX3RpbWluZ3MgdGVtcDsKIAlzdHJ1Y3QgaGRtaV9jbSBjbSA9IHstMX07CiAJRFNTREJHKCJoZG1pX2dldF9jb2RlXG4iKTsKIApAQCAtNTU2LDUwMCArMjUwLDYgQEAKIAlyZXR1cm4gY207CiB9CiAKLXN0YXRpYyB2b2lkIGdldF9ob3J6X3ZlcnRfdGltaW5nX2luZm8oaW50IGN1cnJlbnRfZGVzY3JpcHRvcl9hZGRycywgdTggKmVkaWQgLAotCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQotewotCS8qIFggYW5kIFkgcmVzb2x1dGlvbiAqLwotCXRpbWluZ3MtPnhfcmVzID0gKCgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyA0XSAmIDB4RjApIDw8IDQpIHwKLQkJCSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDJdKTsKLQl0aW1pbmdzLT55X3JlcyA9ICgoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgN10gJiAweEYwKSA8PCA0KSB8Ci0JCQkgZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyA1XSk7Ci0KLQl0aW1pbmdzLT5waXhlbF9jbG9jayA9ICgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxXSA8PCA4KSB8Ci0JCQkJZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnNdKTsKLQotCXRpbWluZ3MtPnBpeGVsX2Nsb2NrID0gMTAgKiB0aW1pbmdzLT5waXhlbF9jbG9jazsKLQotCS8qIEhPUklaT05UQUwgRlJPTlQgUE9SQ0ggKi8KLQl0aW1pbmdzLT5oZnAgPSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDhdIHwKLQkJCSgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMV0gJiAweGMwKSA8PCAyKTsKLQkvKiBIT1JJWk9OVEFMIFNZTkMgV0lEVEggKi8KLQl0aW1pbmdzLT5oc3cgPSBlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDldIHwKLQkJCSgoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMV0gJiAweDMwKSA8PCA0KTsKLQkvKiBIT1JJWk9OVEFMIEJBQ0sgUE9SQ0ggKi8KLQl0aW1pbmdzLT5oYnAgPSAoKChlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDRdICYgMHgwRikgPDwgOCkgfAotCQkJZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAzXSkgLQotCQkJKHRpbWluZ3MtPmhmcCArIHRpbWluZ3MtPmhzdyk7Ci0JLyogVkVSVElDQUwgRlJPTlQgUE9SQ0ggKi8KLQl0aW1pbmdzLT52ZnAgPSAoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgMTBdICYgMHhGMCkgPj4gNCkgfAotCQkJKChlZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDExXSAmIDB4MGYpIDw8IDIpOwotCS8qIFZFUlRJQ0FMIFNZTkMgV0lEVEggKi8KLQl0aW1pbmdzLT52c3cgPSAoZWRpZFtjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgKyAxMF0gJiAweDBGKSB8Ci0JCQkoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgMTFdICYgMHgwMykgPDwgNCk7Ci0JLyogVkVSVElDQUwgQkFDSyBQT1JDSCAqLwotCXRpbWluZ3MtPnZicCA9ICgoKGVkaWRbY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzICsgN10gJiAweDBGKSA8PCA4KSB8Ci0JCQllZGlkW2N1cnJlbnRfZGVzY3JpcHRvcl9hZGRycyArIDZdKSAtCi0JCQkodGltaW5ncy0+dmZwICsgdGltaW5ncy0+dnN3KTsKLQotfQotCi0vKiBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBmcm9tIEVESUQgKi8KLXN0YXRpYyB2b2lkIGdldF9lZGlkX3RpbWluZ19kYXRhKHU4ICplZGlkKQotewotCXU4IGNvdW50OwotCXUxNiBjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnM7Ci0Jc3RydWN0IGhkbWlfY20gY207Ci0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBlZGlkX3RpbWluZ3M7Ci0KLQkvKiBzZWFyY2ggYmxvY2sgMCwgdGhlcmUgYXJlIDQgRFREcyBhcnJhbmdlZCBpbiBwcmlvcml0eSBvcmRlciAqLwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1I7IGNvdW50KyspIHsKLQkJY3VycmVudF9kZXNjcmlwdG9yX2FkZHJzID0KLQkJCUVESURfREVTQ1JJUFRPUl9CTE9DSzBfQUREUkVTUyArCi0JCQljb3VudCAqIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRTsKLQkJZ2V0X2hvcnpfdmVydF90aW1pbmdfaW5mbyhjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMsCi0JCQkJZWRpZCwgJmVkaWRfdGltaW5ncyk7Ci0JCWNtID0gaGRtaV9nZXRfY29kZSgmZWRpZF90aW1pbmdzKTsKLQkJRFNTREJHKCJCbG9jazBbJWRdIHZhbHVlIG1hdGNoZXMgY29kZSA9ICVkICwgbW9kZSA9ICVkXG4iLAotCQkJY291bnQsIGNtLmNvZGUsIGNtLm1vZGUpOwotCQlpZiAoY20uY29kZSA9PSAtMSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQloZG1pLmNvZGUgPSBjbS5jb2RlOwotCQkJaGRtaS5tb2RlID0gY20ubW9kZTsKLQkJCURTU0RCRygiY29kZSA9ICVkICwgbW9kZSA9ICVkXG4iLAotCQkJCWhkbWkuY29kZSwgaGRtaS5tb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlpZiAoZWRpZFsweDdlXSAhPSAweDAwKSB7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVESURfU0laRV9CTE9DSzFfVElNSU5HX0RFU0NSSVBUT1I7Ci0JCQljb3VudCsrKSB7Ci0JCQljdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMgPQotCQkJRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTICsKLQkJCWNvdW50ICogRURJRF9USU1JTkdfREVTQ1JJUFRPUl9TSVpFOwotCQkJZ2V0X2hvcnpfdmVydF90aW1pbmdfaW5mbyhjdXJyZW50X2Rlc2NyaXB0b3JfYWRkcnMsCi0JCQkJCQllZGlkLCAmZWRpZF90aW1pbmdzKTsKLQkJCWNtID0gaGRtaV9nZXRfY29kZSgmZWRpZF90aW1pbmdzKTsKLQkJCURTU0RCRygiQmxvY2sxWyVkXSB2YWx1ZSBtYXRjaGVzIGNvZGUgPSAlZCwgbW9kZSA9ICVkIiwKLQkJCQljb3VudCwgY20uY29kZSwgY20ubW9kZSk7Ci0JCQlpZiAoY20uY29kZSA9PSAtMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQloZG1pLmNvZGUgPSBjbS5jb2RlOwotCQkJCWhkbWkubW9kZSA9IGNtLm1vZGU7Ci0JCQkJRFNTREJHKCJjb2RlID0gJWQgLCBtb2RlID0gJWRcbiIsCi0JCQkJCWhkbWkuY29kZSwgaGRtaS5tb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEU1NJTkZPKCJubyB2YWxpZCB0aW1pbmcgZm91bmQgLCBmYWxsaW5nIGJhY2sgdG8gVkdBXG4iKTsKLQloZG1pLmNvZGUgPSA0OyAvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgb2YgNjQwIDQ4MCBWR0EgKi8KLQloZG1pLm1vZGUgPSBIRE1JX0RWSTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9yZWFkX2VkaWQoc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqZHApCi17Ci0JaW50IHJldCA9IDAsIGNvZGU7Ci0KLQltZW1zZXQoaGRtaS5lZGlkLCAwLCBIRE1JX0VESURfTUFYX0xFTkdUSCk7Ci0KLQlpZiAoIWhkbWkuZWRpZF9zZXQpCi0JCXJldCA9IHJlYWRfZWRpZChoZG1pLmVkaWQsIEhETUlfRURJRF9NQVhfTEVOR1RIKTsKLQotCWlmICghcmV0KSB7Ci0JCWlmICghbWVtY21wKGhkbWkuZWRpZCwgZWRpZF9oZWFkZXIsIHNpemVvZihlZGlkX2hlYWRlcikpKSB7Ci0JCQkvKiBzZWFyY2ggZm9yIHRpbWluZ3Mgb2YgZGVmYXVsdCByZXNvbHV0aW9uICovCi0JCQlnZXRfZWRpZF90aW1pbmdfZGF0YShoZG1pLmVkaWQpOwotCQkJaGRtaS5lZGlkX3NldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlEU1NXQVJOKCJmYWlsZWQgdG8gcmVhZCBFLUVESURcbiIpOwotCX0KLQotCWlmICghaGRtaS5lZGlkX3NldCkgewotCQlEU1NJTkZPKCJmYWxsYmFjayB0byBWR0FcbiIpOwotCQloZG1pLmNvZGUgPSA0OyAvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgb2YgNjQwIDQ4MCBWR0EgKi8KLQkJaGRtaS5tb2RlID0gSERNSV9EVkk7Ci0JfQotCi0JY29kZSA9IGdldF90aW1pbmdzX2luZGV4KCk7Ci0KLQkqZHAgPSBjZWFfdmVzYV90aW1pbmdzW2NvZGVdLnRpbWluZ3M7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9pbml0KHN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnICp2aWRlb19jZmcsCi0JCQlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdmkgKmF2aV9jZmcsCi0JCQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0ICpyZXBlYXRfY2ZnKQotewotCURTU0RCRygiRW50ZXIgaGRtaV9jb3JlX2luaXRcbiIpOwotCi0JLyogdmlkZW8gY29yZSAqLwotCXZpZGVvX2NmZy0+aXBfYnVzX3dpZHRoID0gSERNSV9JTlBVVF84QklUOwotCXZpZGVvX2NmZy0+b3BfZGl0aGVyX3RydWMgPSBIRE1JX09VVFBVVFRSVU5DQVRJT05fOEJJVDsKLQl2aWRlb19jZmctPmRlZXBfY29sb3JfcGt0ID0gSERNSV9ERUVQQ09MT1JQQUNLRUNURElTQUJMRTsKLQl2aWRlb19jZmctPnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRTsKLQl2aWRlb19jZmctPmhkbWlfZHZpID0gSERNSV9EVkk7Ci0JdmlkZW9fY2ZnLT50Y2xrX3NlbF9jbGttdWx0ID0gSERNSV9GUExMMTBJRENLOwotCi0JLyogaW5mbyBmcmFtZSAqLwotCWF2aV9jZmctPmRiMV9mb3JtYXQgPSAwOwotCWF2aV9jZmctPmRiMV9hY3RpdmVfaW5mbyA9IDA7Ci0JYXZpX2NmZy0+ZGIxX2Jhcl9pbmZvX2R2ID0gMDsKLQlhdmlfY2ZnLT5kYjFfc2Nhbl9pbmZvID0gMDsKLQlhdmlfY2ZnLT5kYjJfY29sb3JpbWV0cnkgPSAwOwotCWF2aV9jZmctPmRiMl9hc3BlY3RfcmF0aW8gPSAwOwotCWF2aV9jZmctPmRiMl9hY3RpdmVfZm10X2FyID0gMDsKLQlhdmlfY2ZnLT5kYjNfaXRjID0gMDsKLQlhdmlfY2ZnLT5kYjNfZWMgPSAwOwotCWF2aV9jZmctPmRiM19xX3JhbmdlID0gMDsKLQlhdmlfY2ZnLT5kYjNfbnVwX3NjYWxpbmcgPSAwOwotCWF2aV9jZmctPmRiNF92aWRlb2NvZGUgPSAwOwotCWF2aV9jZmctPmRiNV9waXhlbF9yZXBlYXQgPSAwOwotCWF2aV9jZmctPmRiNl83X2xpbmVfZW9mdG9wID0gMCA7Ci0JYXZpX2NmZy0+ZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOwotCWF2aV9jZmctPmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7Ci0JYXZpX2NmZy0+ZGIxMl8xM19waXhlbF9zb2ZyaWdodCA9IDA7Ci0KLQkvKiBwYWNrZXQgZW5hYmxlIGFuZCByZXBlYXQgKi8KLQlyZXBlYXRfY2ZnLT5hdWRpb19wa3QgPSAwOwotCXJlcGVhdF9jZmctPmF1ZGlvX3BrdF9yZXBlYXQgPSAwOwotCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWUgPSAwOwotCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gMDsKLQlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0ID0gMDsKLQlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0X3JlcGVhdCA9IDA7Ci0JcmVwZWF0X2NmZy0+Z2VuZXJpY19wa3QgPSAwOwotCXJlcGVhdF9jZmctPmdlbmVyaWNfcGt0X3JlcGVhdCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9wb3dlcmRvd25fZGlzYWJsZSh2b2lkKQotewotCURTU0RCRygiRW50ZXIgaGRtaV9jb3JlX3Bvd2VyZG93bl9kaXNhYmxlXG4iKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQ1RSTDEsIDB4MCwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2Uodm9pZCkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2VcbiIpOwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfU1JTVCwgMHgwLCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0KHZvaWQpCi17Ci0JRFNTREJHKCJFbnRlciBoZG1pX2NvcmVfc3dyZXNldF9hc3NlcnRcbiIpOwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfU1JTVCwgMHgxLCAwLCAwKTsKLX0KLQotLyogRFNTX0hETUlfQ09SRV9WSURFT19DT05GSUcgKi8KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV92aWRlb19jb25maWcoc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgKmNmZykKLXsKLQl1MzIgciA9IDA7Ci0KLQkvKiBzeXNfY3RybDEgZGVmYXVsdCBjb25maWd1cmF0aW9uIG5vdCB0dW5hYmxlICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX0NUUkwxKTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfVkVOX0ZPTExPV1ZTWU5DLCA1LCA1KTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfSEVOX0ZPTExPV0hTWU5DLCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfQlNFTF8yNEJJVEJVUywgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRSwgMSwgMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0NUUkwxLCByKTsKLQotCVJFR19GTERfTU9EKEhETUlfQ09SRV9TWVNfVklEX0FDRU4sIGNmZy0+aXBfYnVzX3dpZHRoLCA3LCA2KTsKLQotCS8qIFZpZF9Nb2RlICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX1NZU19WSURfTU9ERSk7Ci0KLQkvKiBkaXRoZXIgdHJ1bmNhdGlvbiBjb25maWd1cmF0aW9uICovCi0JaWYgKGNmZy0+b3BfZGl0aGVyX3RydWMgPiBIRE1JX09VVFBVVFRSVU5DQVRJT05fMTJCSVQpIHsKLQkJciA9IEZMRF9NT0QociwgY2ZnLT5vcF9kaXRoZXJfdHJ1YyAtIDMsIDcsIDYpOwotCQlyID0gRkxEX01PRChyLCAxLCA1LCA1KTsKLQl9IGVsc2UgewotCQlyID0gRkxEX01PRChyLCBjZmctPm9wX2RpdGhlcl90cnVjLCA3LCA2KTsKLQkJciA9IEZMRF9NT0QociwgMCwgNSwgNSk7Ci0JfQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9TWVNfVklEX01PREUsIHIpOwotCi0JLyogSERNSV9DdHJsICovCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5kZWVwX2NvbG9yX3BrdCwgNiwgNik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5wa3RfbW9kZSwgNSwgMyk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5oZG1pX2R2aSwgMCwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgcik7Ci0KLQkvKiBUTURTX0NUUkwgKi8KLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfU1lTX1RNRFNfQ1RSTCwKLQkJY2ZnLT50Y2xrX3NlbF9jbGttdWx0LCA2LCA1KTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1eF9pbmZvZnJhbWVfYXZpX2NvbmZpZygKLQkJc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIGluZm9fYXZpKQotewotCXUzMiB2YWw7Ci0JY2hhciBzdW0gPSAwLCBjaGVja3N1bSA9IDA7Ci0KLQlzdW0gKz0gMHg4MiArIDB4MDAyICsgMHgwMEQ7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9UWVBFLCAweDA4Mik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9WRVJTLCAweDAwMik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9MRU4sIDB4MDBEKTsKLQotCXZhbCA9IChpbmZvX2F2aS5kYjFfZm9ybWF0IDw8IDUpIHwKLQkJKGluZm9fYXZpLmRiMV9hY3RpdmVfaW5mbyA8PCA0KSB8Ci0JCShpbmZvX2F2aS5kYjFfYmFyX2luZm9fZHYgPDwgMikgfAotCQkoaW5mb19hdmkuZGIxX3NjYW5faW5mbyk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSgwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKGluZm9fYXZpLmRiMl9jb2xvcmltZXRyeSA8PCA2KSB8Ci0JCShpbmZvX2F2aS5kYjJfYXNwZWN0X3JhdGlvIDw8IDQpIHwKLQkJKGluZm9fYXZpLmRiMl9hY3RpdmVfZm10X2FyKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEpLCB2YWwpOwotCXN1bSArPSB2YWw7Ci0KLQl2YWwgPSAoaW5mb19hdmkuZGIzX2l0YyA8PCA3KSB8Ci0JCShpbmZvX2F2aS5kYjNfZWMgPDwgNCkgfAotCQkoaW5mb19hdmkuZGIzX3FfcmFuZ2UgPDwgMikgfAotCQkoaW5mb19hdmkuZGIzX251cF9zY2FsaW5nKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDIpLCB2YWwpOwotCXN1bSArPSB2YWw7Ci0KLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDMpLCBpbmZvX2F2aS5kYjRfdmlkZW9jb2RlKTsKLQlzdW0gKz0gaW5mb19hdmkuZGI0X3ZpZGVvY29kZTsKLQotCXZhbCA9IGluZm9fYXZpLmRiNV9waXhlbF9yZXBlYXQ7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg0KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGI2XzdfbGluZV9lb2Z0b3AgJiAweDAwRkY7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg1KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjZfN19saW5lX2VvZnRvcCA+PiA4KSAmIDB4MDBGRik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg2KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGI4XzlfbGluZV9zb2Zib3R0b20gJiAweDAwRkY7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg3KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjhfOV9saW5lX3NvZmJvdHRvbSA+PiA4KSAmIDB4MDBGRik7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FWSV9EQllURSg4KSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ICYgMHgwMEZGOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVklfREJZVEUoOSksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCXZhbCA9ICgoaW5mb19hdmkuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ID4+IDgpICYgMHgwMEZGKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gaW5mb19hdmkuZGIxMl8xM19waXhlbF9zb2ZyaWdodCAmIDB4MDBGRjsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDExKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKChpbmZvX2F2aS5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ID4+IDgpICYgMHgwMEZGKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDEyKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JY2hlY2tzdW0gPSAweDEwMCAtIHN1bTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVZJX0NIU1VNLCBjaGVja3N1bSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfY29yZV9hdl9wYWNrZXRfY29uZmlnKAotCQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHJlcGVhdF9jZmcpCi17Ci0JLyogZW5hYmxlL3JlcGVhdCB0aGUgaW5mb2ZyYW1lICovCi0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX1BCX0NUUkwxLAotCQkocmVwZWF0X2NmZy5hdWRpb19wa3QgPDwgNSkgfAotCQkocmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0IDw8IDQpIHwKLQkJKHJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA8PCAxKSB8Ci0JCShyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0KSk7Ci0KLQkvKiBlbmFibGUvcmVwZWF0IHRoZSBwYWNrZXQgKi8KLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfUEJfQ1RSTDIsCi0JCShyZXBlYXRfY2ZnLmdlbl9jbnRybF9wa3QgPDwgMykgfAotCQkocmVwZWF0X2NmZy5nZW5fY250cmxfcGt0X3JlcGVhdCA8PCAyKSB8Ci0JCShyZXBlYXRfY2ZnLmdlbmVyaWNfcGt0IDw8IDEpIHwKLQkJKHJlcGVhdF9jZmcuZ2VuZXJpY19wa3RfcmVwZWF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfaW5pdChzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzLAotCQkJc3RydWN0IGhkbWlfdmlkZW9fZm9ybWF0ICp2aWRlb19mbXQsCi0JCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfaW5pdFxuIik7Ci0KLQl0aW1pbmdzLT5oYnAgPSAwOwotCXRpbWluZ3MtPmhmcCA9IDA7Ci0JdGltaW5ncy0+aHN3ID0gMDsKLQl0aW1pbmdzLT52YnAgPSAwOwotCXRpbWluZ3MtPnZmcCA9IDA7Ci0JdGltaW5ncy0+dnN3ID0gMDsKLQotCXZpZGVvX2ZtdC0+cGFja2luZ19tb2RlID0gSERNSV9QQUNLXzEwYl9SR0JfWVVWNDQ0OwotCXZpZGVvX2ZtdC0+eV9yZXMgPSAwOwotCXZpZGVvX2ZtdC0+eF9yZXMgPSAwOwotCi0JdmlkZW9faW50LT52c3AgPSAwOwotCXZpZGVvX2ludC0+aHNwID0gMDsKLQotCXZpZGVvX2ludC0+aW50ZXJsYWNpbmcgPSAwOwotCXZpZGVvX2ludC0+dG0gPSAwOyAvKiBIRE1JX1RJTUlOR19TTEFWRSAqLwotCi19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fc3RhcnQoYm9vbCBzdGFydCkKLXsKLQlSRUdfRkxEX01PRChIRE1JX1dQX1ZJREVPX0NGRywgc3RhcnQsIDMxLCAzMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoc3RydWN0IGhkbWlfdmlkZW9fZm9ybWF0ICp2aWRlb19mbXQsCi0Jc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncywgc3RydWN0IGhkbWlfY29uZmlnICpwYXJhbSkKLXsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXRcbiIpOwotCi0JdmlkZW9fZm10LT55X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueV9yZXM7Ci0JdmlkZW9fZm10LT54X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueF9yZXM7Ci0KLQl0aW1pbmdzLT5oYnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhicDsKLQl0aW1pbmdzLT5oZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhmcDsKLQl0aW1pbmdzLT5oc3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhzdzsKLQl0aW1pbmdzLT52YnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZicDsKLQl0aW1pbmdzLT52ZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZmcDsKLQl0aW1pbmdzLT52c3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZzdzsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KAotCQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgKnZpZGVvX2ZtdCkKLXsKLQl1MzIgbCA9IDA7Ci0KLQlSRUdfRkxEX01PRChIRE1JX1dQX1ZJREVPX0NGRywgdmlkZW9fZm10LT5wYWNraW5nX21vZGUsIDEwLCA4KTsKLQotCWwgfD0gRkxEX1ZBTCh2aWRlb19mbXQtPnlfcmVzLCAzMSwgMTYpOwotCWwgfD0gRkxEX1ZBTCh2aWRlb19mbXQtPnhfcmVzLCAxNSwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9XUF9WSURFT19TSVpFLCBsKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlKAotCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKLXsKLQl1MzIgcjsKLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZVxuIik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX1dQX1ZJREVPX0NGRyk7Ci0JciA9IEZMRF9NT0QociwgdmlkZW9faW50LT52c3AsIDcsIDcpOwotCXIgPSBGTERfTU9EKHIsIHZpZGVvX2ludC0+aHNwLCA2LCA2KTsKLQlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPmludGVybGFjaW5nLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPnRtLCAxLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX0NGRywgcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZygKLQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKLXsKLQl1MzIgdGltaW5nX2ggPSAwOwotCXUzMiB0aW1pbmdfdiA9IDA7Ci0KLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZ1xuIik7Ci0KLQl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhicCwgMzEsIDIwKTsKLQl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhmcCwgMTksIDgpOwotCXRpbWluZ19oIHw9IEZMRF9WQUwodGltaW5ncy0+aHN3LCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX1RJTUlOR19ILCB0aW1pbmdfaCk7Ci0KLQl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZicCwgMzEsIDIwKTsKLQl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZmcCwgMTksIDgpOwotCXRpbWluZ192IHw9IEZMRF9WQUwodGltaW5ncy0+dnN3LCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX1ZJREVPX1RJTUlOR19WLCB0aW1pbmdfdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfYmFzaWNfY29uZmlndXJlKHN0cnVjdCBoZG1pX2NvbmZpZyAqY2ZnKQotewotCS8qIEhETUkgKi8KLQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHZpZGVvX3RpbWluZzsKLQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgdmlkZW9fZm9ybWF0OwotCXN0cnVjdCBoZG1pX3ZpZGVvX2ludGVyZmFjZSB2aWRlb19pbnRlcmZhY2U7Ci0JLyogSERNSSBjb3JlICovCi0Jc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIGF2aV9jZmc7Ci0Jc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgdl9jb3JlX2NmZzsKLQlzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHJlcGVhdF9jZmc7Ci0KLQloZG1pX3dwX2luaXQoJnZpZGVvX3RpbWluZywgJnZpZGVvX2Zvcm1hdCwKLQkJJnZpZGVvX2ludGVyZmFjZSk7Ci0KLQloZG1pX2NvcmVfaW5pdCgmdl9jb3JlX2NmZywKLQkJJmF2aV9jZmcsCi0JCSZyZXBlYXRfY2ZnKTsKLQotCWhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoJnZpZGVvX2Zvcm1hdCwKLQkJCSZ2aWRlb190aW1pbmcsIGNmZyk7Ci0KLQloZG1pX3dwX3ZpZGVvX2NvbmZpZ190aW1pbmcoJnZpZGVvX3RpbWluZyk7Ci0KLQkvKiB2aWRlbyBjb25maWcgKi8KLQl2aWRlb19mb3JtYXQucGFja2luZ19tb2RlID0gSERNSV9QQUNLXzI0Yl9SR0JfWVVWNDQ0X1lVVjQyMjsKLQotCWhkbWlfd3BfdmlkZW9fY29uZmlnX2Zvcm1hdCgmdmlkZW9fZm9ybWF0KTsKLQotCXZpZGVvX2ludGVyZmFjZS52c3AgPSBjZmctPnRpbWluZ3MudnN5bmNfcG9sOwotCXZpZGVvX2ludGVyZmFjZS5oc3AgPSBjZmctPnRpbWluZ3MuaHN5bmNfcG9sOwotCXZpZGVvX2ludGVyZmFjZS5pbnRlcmxhY2luZyA9IGNmZy0+aW50ZXJsYWNlOwotCXZpZGVvX2ludGVyZmFjZS50bSA9IDEgOyAvKiBIRE1JX1RJTUlOR19NQVNURVJfMjRCSVQgKi8KLQotCWhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZSgmdmlkZW9faW50ZXJmYWNlKTsKLQotCS8qCi0JICogY29uZmlndXJlIGNvcmUgdmlkZW8gcGFydAotCSAqIHNldCBzb2Z0d2FyZSByZXNldCBpbiB0aGUgY29yZQotCSAqLwotCWhkbWlfY29yZV9zd3Jlc2V0X2Fzc2VydCgpOwotCi0JLyogcG93ZXIgZG93biBvZmYgKi8KLQloZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGUoKTsKLQotCXZfY29yZV9jZmcucGt0X21vZGUgPSBIRE1JX1BBQ0tFVE1PREUyNEJJVFBFUlBJWEVMOwotCXZfY29yZV9jZmcuaGRtaV9kdmkgPSBjZmctPmNtLm1vZGU7Ci0KLQloZG1pX2NvcmVfdmlkZW9fY29uZmlnKCZ2X2NvcmVfY2ZnKTsKLQotCS8qIHJlbGVhc2Ugc29mdHdhcmUgcmVzZXQgaW4gdGhlIGNvcmUgKi8KLQloZG1pX2NvcmVfc3dyZXNldF9yZWxlYXNlKCk7Ci0KLQkvKgotCSAqIGNvbmZpZ3VyZSBwYWNrZXQKLQkgKiBpbmZvIGZyYW1lIHZpZGVvIHNlZSBkb2MgQ0VBODYxLUQgcGFnZSA2NQotCSAqLwotCWF2aV9jZmcuZGIxX2Zvcm1hdCA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1JHQjsKLQlhdmlfY2ZnLmRiMV9hY3RpdmVfaW5mbyA9Ci0JCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFBX0FDVElWRV9GT1JNQVRfT0ZGOwotCWF2aV9jZmcuZGIxX2Jhcl9pbmZvX2R2ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfTk87Ci0JYXZpX2NmZy5kYjFfc2Nhbl9pbmZvID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMDsKLQlhdmlfY2ZnLmRiMl9jb2xvcmltZXRyeSA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX05POwotCWF2aV9jZmcuZGIyX2FzcGVjdF9yYXRpbyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNX05POwotCWF2aV9jZmcuZGIyX2FjdGl2ZV9mbXRfYXIgPSBIRE1JX0lORk9GUkFNRV9BVklfREIyUl9TQU1FOwotCWF2aV9jZmcuZGIzX2l0YyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNJVENfTk87Ci0JYXZpX2NmZy5kYjNfZWMgPSBIRE1JX0lORk9GUkFNRV9BVklfREIzRUNfWFZZVVY2MDE7Ci0JYXZpX2NmZy5kYjNfcV9yYW5nZSA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0RFRkFVTFQ7Ci0JYXZpX2NmZy5kYjNfbnVwX3NjYWxpbmcgPSBIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfTk87Ci0JYXZpX2NmZy5kYjRfdmlkZW9jb2RlID0gY2ZnLT5jbS5jb2RlOwotCWF2aV9jZmcuZGI1X3BpeGVsX3JlcGVhdCA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl9OTzsKLQlhdmlfY2ZnLmRiNl83X2xpbmVfZW9mdG9wID0gMDsKLQlhdmlfY2ZnLmRiOF85X2xpbmVfc29mYm90dG9tID0gMDsKLQlhdmlfY2ZnLmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7Ci0JYXZpX2NmZy5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ID0gMDsKLQotCWhkbWlfY29yZV9hdXhfaW5mb2ZyYW1lX2F2aV9jb25maWcoYXZpX2NmZyk7Ci0KLQkvKiBlbmFibGUvcmVwZWF0IHRoZSBpbmZvZnJhbWUgKi8KLQlyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWUgPSBIRE1JX1BBQ0tFVEVOQUJMRTsKLQlyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gSERNSV9QQUNLRVRSRVBFQVRPTjsKLQkvKiB3YWtldXAgKi8KLQlyZXBlYXRfY2ZnLmF1ZGlvX3BrdCA9IEhETUlfUEFDS0VURU5BQkxFOwotCXJlcGVhdF9jZmcuYXVkaW9fcGt0X3JlcGVhdCA9IEhETUlfUEFDS0VUUkVQRUFUT047Ci0JaGRtaV9jb3JlX2F2X3BhY2tldF9jb25maWcocmVwZWF0X2NmZyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVwZGF0ZV9oZG1pX3RpbWluZ3Moc3RydWN0IGhkbWlfY29uZmlnICpjZmcsCiAJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsIGludCBjb2RlKQogewpAQCAtMTA2Niw2ICsyNjYsMTIgQEAKIAljZmctPnRpbWluZ3MuaHN5bmNfcG9sID0gY2VhX3Zlc2FfdGltaW5nc1tjb2RlXS5oc3luY19wb2w7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgaGRtaV9nZXRfcGl4ZWxfY2xvY2sodm9pZCkKK3sKKwkvKiBIRE1JIFBpeGVsIENsb2NrIGluIE1oeiAqLworCXJldHVybiBoZG1pLmlwX2RhdGEuY2ZnLnRpbWluZ3MudGltaW5ncy5waXhlbF9jbG9jayAqIDEwMDAwOworfQorCiBzdGF0aWMgdm9pZCBoZG1pX2NvbXB1dGVfcGxsKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IHBoeSwKIAkJc3RydWN0IGhkbWlfcGxsX2luZm8gKnBpKQogewpAQCAtMTA3NywxNSArMjgzLDIzIEBACiAJICogSW5wdXQgY2xvY2sgaXMgcHJlZGl2aWRlZCBieSBOICsgMQogCSAqIG91dCBwdXQgb2Ygd2hpY2ggaXMgcmVmZXJlbmNlIGNsawogCSAqLwotCXBpLT5yZWduID0gZHNzZGV2LT5jbG9ja3MuaGRtaS5yZWduOwotCXJlZmNsayA9IGNsa2luIC8gKHBpLT5yZWduICsgMSk7CisJaWYgKGRzc2Rldi0+Y2xvY2tzLmhkbWkucmVnbiA9PSAwKQorCQlwaS0+cmVnbiA9IEhETUlfREVGQVVMVF9SRUdOOworCWVsc2UKKwkJcGktPnJlZ24gPSBkc3NkZXYtPmNsb2Nrcy5oZG1pLnJlZ247CisKKwlyZWZjbGsgPSBjbGtpbiAvIHBpLT5yZWduOwogCiAJLyoKIAkgKiBtdWx0aXBsaWVyIGlzIHBpeGVsX2Nsay9yZWZfY2xrCiAJICogTXVsdGlwbHlpbmcgYnkgMTAwIHRvIGF2b2lkIGZyYWN0aW9uYWwgcGFydCByZW1vdmFsCiAJICovCiAJcGktPnJlZ20gPSAocGh5ICogMTAwIC8gKHJlZmNsaykpIC8gMTAwOwotCXBpLT5yZWdtMiA9IGRzc2Rldi0+Y2xvY2tzLmhkbWkucmVnbTI7CisKKwlpZiAoZHNzZGV2LT5jbG9ja3MuaGRtaS5yZWdtMiA9PSAwKQorCQlwaS0+cmVnbTIgPSBIRE1JX0RFRkFVTFRfUkVHTTI7CisJZWxzZQorCQlwaS0+cmVnbTIgPSBkc3NkZXYtPmNsb2Nrcy5oZG1pLnJlZ20yOwogCiAJLyoKIAkgKiBmcmFjdGlvbmFsIG11bHRpcGxpZXIgaXMgcmVtYWluZGVyIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KQEAgLTExMDAsNyArMzE0LDEwIEBACiAJICogaXMgZ3JlYXRlciB0aGFuIDEwMDBNSHoKIAkgKi8KIAlwaS0+ZGNvZnJlcSA9IHBoeSA+IDEwMDAgKiAxMDA7Ci0JcGktPnJlZ3NkID0gKChwaS0+cmVnbSAqIGNsa2luIC8gMTApIC8gKChwaS0+cmVnbiArIDEpICogMjUwKSArIDUpIC8gMTA7CisJcGktPnJlZ3NkID0gKChwaS0+cmVnbSAqIGNsa2luIC8gMTApIC8gKHBpLT5yZWduICogMjUwKSArIDUpIC8gMTA7CisKKwkvKiBTZXQgdGhlIHJlZmVyZW5jZSBjbG9jayB0byBzeXNjbGsgcmVmZXJlbmNlICovCisJcGktPnJlZnNlbCA9IEhETUlfUkVGU0VMX1NZU0NMSzsKIAogCURTU0RCRygiTSA9ICVkIE1mID0gJWRcbiIsIHBpLT5yZWdtLCBwaS0+cmVnbWYpOwogCURTU0RCRygicmFuZ2UgPSAlZCBzZCA9ICVkXG4iLCBwaS0+ZGNvZnJlcSwgcGktPnJlZ3NkKTsKQEAgLTExMDksNyArMzI2LDYgQEAKIHN0YXRpYyBpbnQgaGRtaV9wb3dlcl9vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJaW50IHIsIGNvZGUgPSAwOwotCXN0cnVjdCBoZG1pX3BsbF9pbmZvIHBsbF9kYXRhOwogCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnA7CiAJdW5zaWduZWQgbG9uZyBwaHk7CiAKQEAgLTExMTcsNyArMzMzLDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlkaXNwY19lbmFibGVfY2hhbm5lbChPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAwKTsKKwlkaXNwY19tZ3JfZW5hYmxlKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQsIDApOwogCiAJcCA9ICZkc3NkZXYtPnBhbmVsLnRpbWluZ3M7CiAKQEAgLTExMjUsMzYgKzM0MSwzMSBAQAogCQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueF9yZXMsCiAJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3Jlcyk7CiAKLQlpZiAoIWhkbWkuY3VzdG9tX3NldCkgewotCQlEU1NEQkcoIlJlYWQgRURJRCBhcyBubyBFRElEIGlzIG5vdCBzZXQgb24gcG93ZXJvblxuIik7Ci0JCWhkbWlfcmVhZF9lZGlkKHApOwotCX0KIAljb2RlID0gZ2V0X3RpbWluZ3NfaW5kZXgoKTsKLQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSBjZWFfdmVzYV90aW1pbmdzW2NvZGVdLnRpbWluZ3M7Ci0JdXBkYXRlX2hkbWlfdGltaW5ncygmaGRtaS5jZmcsIHAsIGNvZGUpOworCXVwZGF0ZV9oZG1pX3RpbWluZ3MoJmhkbWkuaXBfZGF0YS5jZmcsIHAsIGNvZGUpOwogCiAJcGh5ID0gcC0+cGl4ZWxfY2xvY2s7CiAKLQloZG1pX2NvbXB1dGVfcGxsKGRzc2RldiwgcGh5LCAmcGxsX2RhdGEpOworCWhkbWlfY29tcHV0ZV9wbGwoZHNzZGV2LCBwaHksICZoZG1pLmlwX2RhdGEucGxsX2RhdGEpOwogCi0JaGRtaV93cF92aWRlb19zdGFydCgwKTsKKwloZG1pLmlwX2RhdGEub3BzLT52aWRlb19lbmFibGUoJmhkbWkuaXBfZGF0YSwgMCk7CiAKLQkvKiBjb25maWcgdGhlIFBMTCBhbmQgUEhZIGZpcnN0ICovCi0JciA9IGhkbWlfcGxsX3Byb2dyYW0oJnBsbF9kYXRhKTsKKwkvKiBjb25maWcgdGhlIFBMTCBhbmQgUEhZIGhkbWlfc2V0X3BsbF9wd3JmaXJzdCAqLworCXIgPSBoZG1pLmlwX2RhdGEub3BzLT5wbGxfZW5hYmxlKCZoZG1pLmlwX2RhdGEpOwogCWlmIChyKSB7CiAJCURTU0RCRygiRmFpbGVkIHRvIGxvY2sgUExMXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCi0JciA9IGhkbWlfcGh5X2luaXQoKTsKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+cGh5X2VuYWJsZSgmaGRtaS5pcF9kYXRhKTsKIAlpZiAocikgewogCQlEU1NEQkcoIkZhaWxlZCB0byBzdGFydCBQSFlcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKLQloZG1pLmNmZy5jbS5tb2RlID0gaGRtaS5tb2RlOwotCWhkbWkuY2ZnLmNtLmNvZGUgPSBoZG1pLmNvZGU7Ci0JaGRtaV9iYXNpY19jb25maWd1cmUoJmhkbWkuY2ZnKTsKKwloZG1pLmlwX2RhdGEuY2ZnLmNtLm1vZGUgPSBoZG1pLm1vZGU7CisJaGRtaS5pcF9kYXRhLmNmZy5jbS5jb2RlID0gaGRtaS5jb2RlOworCWhkbWkuaXBfZGF0YS5vcHMtPnZpZGVvX2NvbmZpZ3VyZSgmaGRtaS5pcF9kYXRhKTsKIAogCS8qIE1ha2Ugc2VsZWN0aW9uIG9mIEhETUkgaW4gRFNTICovCiAJZHNzX3NlbGVjdF9oZG1pX3ZlbmNfY2xrX3NvdXJjZShEU1NfSERNSV9NX1BDTEspOwpAQCAtMTE3NCw5ICszODUsOSBAQAogCWRpc3BjX3NldF9kaWdpdF9zaXplKGRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKIAkJCWRzc2Rldi0+cGFuZWwudGltaW5ncy55X3Jlcyk7CiAKLQlkaXNwY19lbmFibGVfY2hhbm5lbChPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAxKTsKKwloZG1pLmlwX2RhdGEub3BzLT52aWRlb19lbmFibGUoJmhkbWkuaXBfZGF0YSwgMSk7CiAKLQloZG1pX3dwX3ZpZGVvX3N0YXJ0KDEpOworCWRpc3BjX21ncl9lbmFibGUoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCwgMSk7CiAKIAlyZXR1cm4gMDsKIGVycjoKQEAgLTExODYsMTQgKzM5NywxMiBAQAogCiBzdGF0aWMgdm9pZCBoZG1pX3Bvd2VyX29mZihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7Ci0JZGlzcGNfZW5hYmxlX2NoYW5uZWwoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCwgMCk7CisJZGlzcGNfbWdyX2VuYWJsZShPTUFQX0RTU19DSEFOTkVMX0RJR0lULCAwKTsKIAotCWhkbWlfd3BfdmlkZW9fc3RhcnQoMCk7Ci0JaGRtaV9waHlfb2ZmKCk7Ci0JaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9BTExPRkYpOworCWhkbWkuaXBfZGF0YS5vcHMtPnZpZGVvX2VuYWJsZSgmaGRtaS5pcF9kYXRhLCAwKTsKKwloZG1pLmlwX2RhdGEub3BzLT5waHlfZGlzYWJsZSgmaGRtaS5pcF9kYXRhKTsKKwloZG1pLmlwX2RhdGEub3BzLT5wbGxfZGlzYWJsZSgmaGRtaS5pcF9kYXRhKTsKIAloZG1pX3J1bnRpbWVfcHV0KCk7Ci0KLQloZG1pLmVkaWRfc2V0ID0gMDsKIH0KIAogaW50IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2NoZWNrX3RpbWluZyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCkBAIC0xMjAzLDcgKzQxMiw2IEBACiAKIAljbSA9IGhkbWlfZ2V0X2NvZGUodGltaW5ncyk7CiAJaWYgKGNtLmNvZGUgPT0gLTEpIHsKLQkJRFNTRVJSKCJJbnZhbGlkIHRpbWluZyBlbnRlcmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjE1LDEyICs0MjMsNjkgQEAKIHsKIAlzdHJ1Y3QgaGRtaV9jbSBjbTsKIAotCWhkbWkuY3VzdG9tX3NldCA9IDE7CiAJY20gPSBoZG1pX2dldF9jb2RlKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MpOwogCWhkbWkuY29kZSA9IGNtLmNvZGU7CiAJaGRtaS5tb2RlID0gY20ubW9kZTsKLQlvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQloZG1pLmN1c3RvbV9zZXQgPSAwOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJaW50IHI7CisKKwkJaGRtaV9wb3dlcl9vZmYoZHNzZGV2KTsKKworCQlyID0gaGRtaV9wb3dlcl9vbihkc3NkZXYpOworCQlpZiAocikKKwkJCURTU0VSUigiZmFpbGVkIHRvIHBvd2VyIG9uIGRldmljZVxuIik7CisJfQorfQorCit2b2lkIGhkbWlfZHVtcF9yZWdzKHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJaWYgKGhkbWlfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOworCisJaGRtaS5pcF9kYXRhLm9wcy0+ZHVtcF93cmFwcGVyKCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfcGxsKCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfcGh5KCZoZG1pLmlwX2RhdGEsIHMpOworCWhkbWkuaXBfZGF0YS5vcHMtPmR1bXBfY29yZSgmaGRtaS5pcF9kYXRhLCBzKTsKKworCWhkbWlfcnVudGltZV9wdXQoKTsKKwltdXRleF91bmxvY2soJmhkbWkubG9jayk7Cit9CisKK2ludCBvbWFwZHNzX2hkbWlfcmVhZF9lZGlkKHU4ICpidWYsIGludCBsZW4pCit7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJciA9IGhkbWlfcnVudGltZV9nZXQoKTsKKwlCVUdfT04ocik7CisKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+cmVhZF9lZGlkKCZoZG1pLmlwX2RhdGEsIGJ1ZiwgbGVuKTsKKworCWhkbWlfcnVudGltZV9wdXQoKTsKKwltdXRleF91bmxvY2soJmhkbWkubG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworYm9vbCBvbWFwZHNzX2hkbWlfZGV0ZWN0KHZvaWQpCit7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZoZG1pLmxvY2spOworCisJciA9IGhkbWlfcnVudGltZV9nZXQoKTsKKwlCVUdfT04ocik7CisKKwlyID0gaGRtaS5pcF9kYXRhLm9wcy0+ZGV0ZWN0KCZoZG1pLmlwX2RhdGEpOworCisJaGRtaV9ydW50aW1lX3B1dCgpOworCW11dGV4X3VubG9jaygmaGRtaS5sb2NrKTsKKworCXJldHVybiByID09IDE7CiB9CiAKIGludCBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQpAQCAtMTIzMSw2ICs0OTYsMTIgQEAKIAogCW11dGV4X2xvY2soJmhkbWkubG9jayk7CiAKKwlpZiAoZHNzZGV2LT5tYW5hZ2VyID09IE5VTEwpIHsKKwkJRFNTRVJSKCJmYWlsZWQgdG8gZW5hYmxlIGRpc3BsYXk6IG5vIG1hbmFnZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIwOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtMTI4MiwyMTkgKzU1Myw5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAogCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKLXN0YXRpYyB2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2Zvcm1hdCgKLQkJc3RydWN0IGhkbWlfYXVkaW9fZm9ybWF0ICphdWRfZm10KQotewotCXUzMiByOwogCi0JRFNTREJHKCJFbnRlciBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19mb3JtYXRcbiIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9XUF9BVURJT19DRkcpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnN0ZXJlb19jaGFubmVscywgMjYsIDI0KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5hY3RpdmVfY2hubmxzX21zaywgMjMsIDE2KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5lbl9zaWdfYmxrX3N0cnRfZW5kLCA1LCA1KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT50eXBlLCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5qdXN0aWZpY2F0aW9uLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCBhdWRfZm10LT5zYW1wbGVfb3JkZXIsIDIsIDIpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZXNfcGVyX3dvcmQsIDEsIDEpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZV9zaXplLCAwLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX0FVRElPX0NGRywgcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYShzdHJ1Y3QgaGRtaV9hdWRpb19kbWEgKmF1ZF9kbWEpCi17Ci0JdTMyIHI7Ci0KLQlEU1NEQkcoIkVudGVyIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYVxuIik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX1dQX0FVRElPX0NGRzIpOwotCXIgPSBGTERfTU9EKHIsIGF1ZF9kbWEtPnRyYW5zZmVyX3NpemUsIDE1LCA4KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5ibG9ja19zaXplLCA3LCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX1dQX0FVRElPX0NGRzIsIHIpOwotCi0JciA9IGhkbWlfcmVhZF9yZWcoSERNSV9XUF9BVURJT19DVFJMKTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5tb2RlLCA5LCA5KTsKLQlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5maWZvX3RocmVzaG9sZCwgOCwgMCk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9XUF9BVURJT19DVFJMLCByKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyhzdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyAqY2ZnKQotewotCXUzMiByOwotCi0JLyogYXVkaW8gY2xvY2sgcmVjb3ZlcnkgcGFyYW1ldGVycyAqLwotCXIgPSBoZG1pX3JlYWRfcmVnKEhETUlfQ09SRV9BVl9BQ1JfQ1RSTCk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT51c2VfbWNsaywgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5lbl9hY3JfcGt0LCAxLCAxKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmN0c19tb2RlLCAwLCAwKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQUNSX0NUUkwsIHIpOwotCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX05fU1ZBTDEsIGNmZy0+biwgNywgMCk7Ci0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX05fU1ZBTDIsIGNmZy0+biA+PiA4LCA3LCAwKTsKLQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfTl9TVkFMMywgY2ZnLT5uID4+IDE2LCA3LCAwKTsKLQotCWlmIChjZmctPmN0c19tb2RlID09IEhETUlfQVVESU9fQ1RTX01PREVfU1cpIHsKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0NUU19TVkFMMSwgY2ZnLT5jdHMsIDcsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyLCBjZmctPmN0cyA+PiA4LCA3LCAwKTsKLQkJUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0NUU19TVkFMMywgY2ZnLT5jdHMgPj4gMTYsIDcsIDApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEhETUkgSVAgdXNlcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gZGl2aWRlIHRoZSBNQ0xLIHRvCi0JCSAqIHVwZGF0ZSBDVFMgdmFsdWUuCi0JCSAqLwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfRlJFUV9TVkFMLCBjZmctPm1jbGtfbW9kZSwgMiwgMCk7Ci0KLQkJLyogQ29uZmlndXJlIGNsb2NrIGZvciBhdWRpbyBwYWNrZXRzICovCi0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18xLAotCQkJY2ZnLT5hdWRfcGFyX2J1c2NsaywgNywgMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18yLAotCQkJKGNmZy0+YXVkX3Bhcl9idXNjbGsgPj4gOCksIDcsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMywKLQkJCShjZmctPmF1ZF9wYXJfYnVzY2xrID4+IDE2KSwgNywgMCk7Ci0JfQotCi0JLyogT3ZlcnJpZGUgb2YgU1BESUYgc2FtcGxlIGZyZXF1ZW5jeSB3aXRoIHZhbHVlIGluIEkyU19DSFNUNCAqLwotCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9TUERJRl9DVFJMLCBjZmctPmZzX292ZXJyaWRlLCAxLCAxKTsKLQotCS8qIEkyUyBwYXJhbWV0ZXJzICovCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0kyU19DSFNUNCwgY2ZnLT5mcmVxX3NhbXBsZSwgMywgMCk7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5lbl9oaWdoX2JpdHJhdGVfYXVkLCA3LCA3KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuc2NrX2VkZ2VfbW9kZSwgNiwgNik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmNiaXRfb3JkZXIsIDUsIDUpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy52Yml0LCA0LCA0KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcud3NfcG9sYXJpdHksIDMsIDMpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5qdXN0aWZpY2F0aW9uLCAyLCAyKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuZGlyZWN0aW9uLCAxLCAxKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuc2hpZnQsIDAsIDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTCwgcik7Ci0KLQlyID0gaGRtaV9yZWFkX3JlZyhIRE1JX0NPUkVfQVZfSTJTX0NIU1Q1KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmZyZXFfc2FtcGxlLCA3LCA0KTsKLQlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcud29yZF9sZW5ndGgsIDMsIDEpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53b3JkX21heF9sZW5ndGgsIDAsIDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUsIHIpOwotCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0kyU19JTl9MRU4sIGNmZy0+aTJzX2NmZy5pbl9sZW5ndGhfYml0cywgMywgMCk7Ci0KLQkvKiBBdWRpbyBjaGFubmVscyBhbmQgbW9kZSBwYXJhbWV0ZXJzICovCi0JUkVHX0ZMRF9NT0QoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgY2ZnLT5sYXlvdXQsIDIsIDEpOwotCXIgPSBoZG1pX3JlYWRfcmVnKEhETUlfQ09SRV9BVl9BVURfTU9ERSk7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmFjdGl2ZV9zZHMsIDcsIDQpOwotCXIgPSBGTERfTU9EKHIsIGNmZy0+ZW5fZHNkX2F1ZGlvLCAzLCAzKTsKLQlyID0gRkxEX01PRChyLCBjZmctPmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCwgMiwgMik7Ci0JciA9IEZMRF9NT0QociwgY2ZnLT5lbl9zcGRpZiwgMSwgMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRF9NT0RFLCByKTsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F1ZGlvX2luZm9mcmFtZV9jb25maWcoCi0JCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F1ZGlvICppbmZvX2F1ZCkKLXsKLQl1OCB2YWw7Ci0JdTggc3VtID0gMCwgY2hlY2tzdW0gPSAwOwotCi0JLyoKLQkgKiBTZXQgYXVkaW8gaW5mbyBmcmFtZSB0eXBlLCB2ZXJzaW9uIGFuZCBsZW5ndGggYXMKLQkgKiBkZXNjcmliZWQgaW4gSERNSSAxLjRhIFNlY3Rpb24gOC4yLjIgc3BlY2lmaWNhdGlvbi4KLQkgKiBDaGVja3N1bSBjYWxjdWxhdGlvbiBpcyBkZWZpbmVkIGluIFNlY3Rpb24gNS4zLjUuCi0JICovCi0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRElPX1RZUEUsIDB4ODQpOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURJT19WRVJTLCAweDAxKTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVVESU9fTEVOLCAweDBhKTsKLQlzdW0gKz0gMHg4NCArIDB4MDAxICsgMHgwMGE7Ci0KLQl2YWwgPSAoaW5mb19hdWQtPmRiMV9jb2RpbmdfdHlwZSA8PCA0KQotCQkJfCAoaW5mb19hdWQtPmRiMV9jaGFubmVsX2NvdW50IC0gMSk7Ci0JaGRtaV93cml0ZV9yZWcoSERNSV9DT1JFX0FWX0FVRF9EQllURSgwKSwgdmFsKTsKLQlzdW0gKz0gdmFsOwotCi0JdmFsID0gKGluZm9fYXVkLT5kYjJfc2FtcGxlX2ZyZXEgPDwgMikgfCBpbmZvX2F1ZC0+ZGIyX3NhbXBsZV9zaXplOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMSksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMiksIDB4MDApOwotCi0JdmFsID0gaW5mb19hdWQtPmRiNF9jaGFubmVsX2FsbG9jOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoMyksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCXZhbCA9IChpbmZvX2F1ZC0+ZGI1X2Rvd25taXhfaW5oIDw8IDcpIHwgKGluZm9fYXVkLT5kYjVfbHN2IDw8IDMpOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNCksIHZhbCk7Ci0Jc3VtICs9IHZhbDsKLQotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNSksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNiksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoNyksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoOCksIDB4MDApOwotCWhkbWlfd3JpdGVfcmVnKEhETUlfQ09SRV9BVl9BVURfREJZVEUoOSksIDB4MDApOwotCi0JY2hlY2tzdW0gPSAweDEwMCAtIHN1bTsKLQloZG1pX3dyaXRlX3JlZyhIRE1JX0NPUkVfQVZfQVVESU9fQ0hTVU0sIGNoZWNrc3VtKTsKLQotCS8qCi0JICogVE9ETzogQWRkIE1QRUcgYW5kIFNQRCBlbmFibGUgYW5kIHJlcGVhdCBjZmcgd2hlbiBFRElEIHBhcnNpbmcKLQkgKiBpcyBhdmFpbGFibGUuCi0JICovCi19Ci0KLXN0YXRpYyBpbnQgaGRtaV9jb25maWdfYXVkaW9fYWNyKHUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cykKLXsKLQl1MzIgcjsKLQl1MzIgZGVlcF9jb2xvciA9IDA7Ci0JdTMyIHBjbGsgPSBoZG1pLmNmZy50aW1pbmdzLnRpbWluZ3MucGl4ZWxfY2xvY2s7Ci0KLQlpZiAobiA9PSBOVUxMIHx8IGN0cyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKgotCSAqIE9idGFpbiBjdXJyZW50IGRlZXAgY29sb3IgY29uZmlndXJhdGlvbi4gVGhpcyBuZWVkZWQKLQkgKiB0byBjYWxjdWxhdGUgdGhlIFRNRFMgY2xvY2sgYmFzZWQgb24gdGhlIHBpeGVsIGNsb2NrLgotCSAqLwotCXIgPSBSRUdfR0VUKEhETUlfV1BfVklERU9fQ0ZHLCAxLCAwKTsKLQlzd2l0Y2ggKHIpIHsKLQljYXNlIDE6IC8qIE5vIGRlZXAgY29sb3Igc2VsZWN0ZWQgKi8KLQkJZGVlcF9jb2xvciA9IDEwMDsKLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiAxMC1iaXQgZGVlcCBjb2xvciBzZWxlY3RlZCAqLwotCQlkZWVwX2NvbG9yID0gMTI1OwotCQlicmVhazsKLQljYXNlIDM6IC8qIDEyLWJpdCBkZWVwIGNvbG9yIHNlbGVjdGVkICovCi0JCWRlZXBfY29sb3IgPSAxNTA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoc2FtcGxlX2ZyZXEpIHsKLQljYXNlIDMyMDAwOgotCQlpZiAoKGRlZXBfY29sb3IgPT0gMTI1KSAmJiAoKHBjbGsgPT0gNTQwNTQpCi0JCQkJfHwgKHBjbGsgPT0gNzQyNTApKSkKLQkJCSpuID0gODE5MjsKLQkJZWxzZQotCQkJKm4gPSA0MDk2OwotCQlicmVhazsKLQljYXNlIDQ0MTAwOgotCQkqbiA9IDYyNzI7Ci0JCWJyZWFrOwotCWNhc2UgNDgwMDA6Ci0JCWlmICgoZGVlcF9jb2xvciA9PSAxMjUpICYmICgocGNsayA9PSA1NDA1NCkKLQkJCQl8fCAocGNsayA9PSA3NDI1MCkpKQotCQkJKm4gPSA4MTkyOwotCQllbHNlCi0JCQkqbiA9IDYxNDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSpuID0gMDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIENUUy4gU2VlIEhETUkgMS4zYSBvciAxLjRhIHNwZWNpZmljYXRpb25zICovCi0JKmN0cyA9IHBjbGsgKiAoKm4gLyAxMjgpICogZGVlcF9jb2xvciAvIChzYW1wbGVfZnJlcSAvIDEwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhkbWlfYXVkaW9faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBoZG1pX2F1ZGlvX2h3X3BhcmFtcyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewpAQCAtMTU0OCw3ICs2MDksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQllcnIgPSBoZG1pX2NvbmZpZ19hdWRpb19hY3IocGFyYW1zX3JhdGUocGFyYW1zKSwgJm4sICZjdHMpOworCWVyciA9IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihpcF9kYXRhLCBwYXJhbXNfcmF0ZShwYXJhbXMpLCAmbiwgJmN0cyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE1NjQsOCArNjI1LDggQEAKIAlhdWRpb19kbWEubW9kZSA9IEhETUlfQVVESU9fVFJBTlNGX0RNQTsKIAlhdWRpb19kbWEuZmlmb190aHJlc2hvbGQgPSAweDIwOyAvKiBpbiBudW1iZXIgb2Ygc2FtcGxlcyAqLwogCi0JaGRtaV93cF9hdWRpb19jb25maWdfZG1hKCZhdWRpb19kbWEpOwotCWhkbWlfd3BfYXVkaW9fY29uZmlnX2Zvcm1hdCgmYXVkaW9fZm9ybWF0KTsKKwloZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWEoaXBfZGF0YSwgJmF1ZGlvX2RtYSk7CisJaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0KGlwX2RhdGEsICZhdWRpb19mb3JtYXQpOwogCiAJLyoKIAkgKiBJMlMgY29uZmlnCkBAIC0xNjA5LDcgKzY3MCw3IEBACiAJLyogVXNlIHBhcmFsbGVsIGF1ZGlvIGludGVyZmFjZSAqLwogCWNvcmVfY2ZnLmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCA9IHRydWU7CiAKLQloZG1pX2NvcmVfYXVkaW9fY29uZmlnKCZjb3JlX2NmZyk7CisJaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyhpcF9kYXRhLCAmY29yZV9jZmcpOwogCiAJLyoKIAkgKiBDb25maWd1cmUgcGFja2V0CkBAIC0xNjIzLDM2ICs2ODQsMTAgQEAKIAlhdWRfaWZfY2ZnLmRiNV9kb3dubWl4X2luaCA9IGZhbHNlOwogCWF1ZF9pZl9jZmcuZGI1X2xzdiA9IDA7CiAKLQloZG1pX2NvcmVfYXVkaW9faW5mb2ZyYW1lX2NvbmZpZygmYXVkX2lmX2NmZyk7CisJaGRtaV9jb3JlX2F1ZGlvX2luZm9mcmFtZV9jb25maWcoaXBfZGF0YSwgJmF1ZF9pZl9jZmcpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhkbWlfYXVkaW9fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKLQkJCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCBlcnIgPSAwOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCVJFR19GTERfTU9EKEhETUlfQ09SRV9BVl9BVURfTU9ERSwgMSwgMCwgMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfV1BfQVVESU9fQ1RSTCwgMSwgMzEsIDMxKTsKLQkJUkVHX0ZMRF9NT0QoSERNSV9XUF9BVURJT19DVFJMLCAxLCAzMCwgMzApOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlSRUdfRkxEX01PRChIRE1JX0NPUkVfQVZfQVVEX01PREUsIDAsIDAsIDApOwotCQlSRUdfRkxEX01PRChIRE1JX1dQX0FVRElPX0NUUkwsIDAsIDMwLCAzMCk7Ci0JCVJFR19GTERfTU9EKEhETUlfV1BfQVVESU9fQ1RSTCwgMCwgMzEsIDMxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIGludCBoZG1pX2F1ZGlvX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKQEAgLTE2OTgsMTUgKzczMyw2IEBACiAKIAloZG1pLnN5c19jbGsgPSBjbGs7CiAKLQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfNDhtaHpfY2xrIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCURTU0VSUigiY2FuJ3QgZ2V0IGhkbWlfY2xrXG4iKTsKLQkJY2xrX3B1dChoZG1pLnN5c19jbGspOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCX0KLQotCWhkbWkuaGRtaV9jbGsgPSBjbGs7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcxNCw4ICs3NDAsNiBAQAogewogCWlmIChoZG1pLnN5c19jbGspCiAJCWNsa19wdXQoaGRtaS5zeXNfY2xrKTsKLQlpZiAoaGRtaS5oZG1pX2NsaykKLQkJY2xrX3B1dChoZG1pLmhkbWlfY2xrKTsKIH0KIAogLyogSERNSSBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwpAQCAtMTczNiwyMCArNzYwLDI2IEBACiAJfQogCiAJLyogQmFzZSBhZGRyZXNzIHRha2VuIGZyb20gcGxhdGZvcm0gKi8KLQloZG1pLmJhc2Vfd3AgPSBpb3JlbWFwKGhkbWlfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShoZG1pX21lbSkpOwotCWlmICghaGRtaS5iYXNlX3dwKSB7CisJaGRtaS5pcF9kYXRhLmJhc2Vfd3AgPSBpb3JlbWFwKGhkbWlfbWVtLT5zdGFydCwKKwkJCQkJCXJlc291cmNlX3NpemUoaGRtaV9tZW0pKTsKKwlpZiAoIWhkbWkuaXBfZGF0YS5iYXNlX3dwKSB7CiAJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBXUFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXIgPSBoZG1pX2dldF9jbG9ja3MocGRldik7CiAJaWYgKHIpIHsKLQkJaW91bm1hcChoZG1pLmJhc2Vfd3ApOworCQlpb3VubWFwKGhkbWkuaXBfZGF0YS5iYXNlX3dwKTsKIAkJcmV0dXJuIHI7CiAJfQogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKKwloZG1pLmlwX2RhdGEuY29yZV9zeXNfb2Zmc2V0ID0gSERNSV9DT1JFX1NZUzsKKwloZG1pLmlwX2RhdGEuY29yZV9hdl9vZmZzZXQgPSBIRE1JX0NPUkVfQVY7CisJaGRtaS5pcF9kYXRhLnBsbF9vZmZzZXQgPSBIRE1JX1BMTENUUkw7CisJaGRtaS5pcF9kYXRhLnBoeV9vZmZzZXQgPSBIRE1JX1BIWTsKKwogCWhkbWlfcGFuZWxfaW5pdCgpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKQEAgLTE3NzksMTQgKzgwOSwxMyBAQAogCiAJaGRtaV9wdXRfY2xvY2tzKCk7CiAKLQlpb3VubWFwKGhkbWkuYmFzZV93cCk7CisJaW91bm1hcChoZG1pLmlwX2RhdGEuYmFzZV93cCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBoZG1pX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JY2xrX2Rpc2FibGUoaGRtaS5oZG1pX2Nsayk7CiAJY2xrX2Rpc2FibGUoaGRtaS5zeXNfY2xrKTsKIAogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CkBAIC0xODA5LDcgKzgzOCw2IEBACiAKIAogCWNsa19lbmFibGUoaGRtaS5zeXNfY2xrKTsKLQljbGtfZW5hYmxlKGhkbWkuaGRtaV9jbGspOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NWY5Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoKLSAqIGhkbWkuaAotICoKLSAqIEhETUkgZHJpdmVyIGRlZmluaXRpb24gZm9yIFRJIE9NQVA0IHByb2Nlc3NvcnMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaWZuZGVmIF9PTUFQNF9EU1NfSERNSV9IXwotI2RlZmluZSBfT01BUDRfRFNTX0hETUlfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLQotI2RlZmluZSBIRE1JX1dQCQkweDAKLSNkZWZpbmUgSERNSV9DT1JFX1NZUwkJMHg0MDAKLSNkZWZpbmUgSERNSV9DT1JFX0FWCQkweDkwMAotI2RlZmluZSBIRE1JX1BMTENUUkwJCTB4MjAwCi0jZGVmaW5lIEhETUlfUEhZCQkweDMwMAotCi1zdHJ1Y3QgaGRtaV9yZWcgeyB1MTYgaWR4OyB9OwotCi0jZGVmaW5lIEhETUlfUkVHKGlkeCkJCQkoKGNvbnN0IHN0cnVjdCBoZG1pX3JlZykgeyBpZHggfSkKLQotLyogSERNSSBXcmFwcGVyICovCi0jZGVmaW5lIEhETUlfV1BfUkVHKGlkeCkJCQlIRE1JX1JFRyhIRE1JX1dQICsgaWR4KQotCi0jZGVmaW5lIEhETUlfV1BfUkVWSVNJT04JCQlIRE1JX1dQX1JFRygweDApCi0jZGVmaW5lIEhETUlfV1BfU1lTQ09ORklHCQkJSERNSV9XUF9SRUcoMHgxMCkKLSNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVNfUkFXCQkJSERNSV9XUF9SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVMJCQlIRE1JX1dQX1JFRygweDI4KQotI2RlZmluZSBIRE1JX1dQX1BXUl9DVFJMCQkJSERNSV9XUF9SRUcoMHg0MCkKLSNkZWZpbmUgSERNSV9XUF9JUlFFTkFCTEVfU0VUCQkJSERNSV9XUF9SRUcoMHgyQykKLSNkZWZpbmUgSERNSV9XUF9WSURFT19DRkcJCQlIRE1JX1dQX1JFRygweDUwKQotI2RlZmluZSBIRE1JX1dQX1ZJREVPX1NJWkUJCQlIRE1JX1dQX1JFRygweDYwKQotI2RlZmluZSBIRE1JX1dQX1ZJREVPX1RJTUlOR19ICQkJSERNSV9XUF9SRUcoMHg2OCkKLSNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfVgkJCUhETUlfV1BfUkVHKDB4NkMpCi0jZGVmaW5lIEhETUlfV1BfV1BfQ0xLCQkJCUhETUlfV1BfUkVHKDB4NzApCi0jZGVmaW5lIEhETUlfV1BfQVVESU9fQ0ZHCQkJSERNSV9XUF9SRUcoMHg4MCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19DRkcyCQkJSERNSV9XUF9SRUcoMHg4NCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19DVFJMCQkJSERNSV9XUF9SRUcoMHg4OCkKLSNkZWZpbmUgSERNSV9XUF9BVURJT19EQVRBCQkJSERNSV9XUF9SRUcoMHg4QykKLQotLyogSERNSSBJUCBDb3JlIFN5c3RlbSAqLwotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1JFRyhpZHgpCQkJSERNSV9SRUcoSERNSV9DT1JFX1NZUyArIGlkeCkKLQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZORF9JREwJCQlIRE1JX0NPUkVfU1lTX1JFRygweDApCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVWX0lETAkJCUhETUlfQ09SRV9TWVNfUkVHKDB4OCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERVZfSURICQkJSERNSV9DT1JFX1NZU19SRUcoMHhDKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFVl9SRVYJCQlIRE1JX0NPUkVfU1lTX1JFRygweDEwKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NSU1QJCQlIRE1JX0NPUkVfU1lTX1JFRygweDE0KQotI2RlZmluZSBIRE1JX0NPUkVfQ1RSTDEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDIwKQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NZU19TVEFUCQkJSERNSV9DT1JFX1NZU19SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19WSURfQUNFTgkJCUhETUlfQ09SRV9TWVNfUkVHKDB4MTI0KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZJRF9NT0RFCQkJSERNSV9DT1JFX1NZU19SRUcoMHgxMjgpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUl9TVEFURQkJSERNSV9DT1JFX1NZU19SRUcoMHgxQzApCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFDNCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSMgkJCUhETUlfQ09SRV9TWVNfUkVHKDB4MUM4KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0lOVFIzCQkJSERNSV9DT1JFX1NZU19SRUcoMHgxQ0MpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjQJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFEMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19VTUFTSzEJCQlIRE1JX0NPUkVfU1lTX1JFRygweDFENCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19UTURTX0NUUkwJCUhETUlfQ09SRV9TWVNfUkVHKDB4MjA4KQotI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0RMWQkJCUhETUlfQ09SRV9TWVNfUkVHKDB4QzgpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfQ1RSTAkJCUhETUlfQ09SRV9TWVNfUkVHKDB4Q0MpCi0jZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfVE9QCQkJSERNSV9DT1JFX1NZU19SRUcoMHhEMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRMCQkJSERNSV9DT1JFX1NZU19SRUcoMHhEOCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRICQkJSERNSV9DT1JFX1NZU19SRUcoMHhEQykKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5MCQkJSERNSV9DT1JFX1NZU19SRUcoMHhFMCkKLSNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5IXzEJCUhETUlfQ09SRV9TWVNfUkVHKDB4RTQpCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMJMHgxCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMJMHgxCi0jZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTCQkweDEKLSNkZWZpbmUgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRQkweDEKLQotLyogSERNSSBEREMgRS1ESUQgKi8KLSNkZWZpbmUgSERNSV9DT1JFX0REQ19DTUQJCQlIRE1JX0NPUkVfU1lTX1JFRygweDNDQykKLSNkZWZpbmUgSERNSV9DT1JFX0REQ19TVEFUVVMJCQlIRE1JX0NPUkVfU1lTX1JFRygweDNDOCkKLSNkZWZpbmUgSERNSV9DT1JFX0REQ19BRERSCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQjQpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfT0ZGU0VUCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQkMpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfQ09VTlQxCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQzApCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfQ09VTlQyCQkJSERNSV9DT1JFX1NZU19SRUcoMHgzQzQpCi0jZGVmaW5lIEhETUlfQ09SRV9ERENfREFUQQkJCUhETUlfQ09SRV9TWVNfUkVHKDB4M0QwKQotI2RlZmluZSBIRE1JX0NPUkVfRERDX1NFR00JCQlIRE1JX0NPUkVfU1lTX1JFRygweDNCOCkKLQotLyogSERNSSBJUCBDb3JlIEF1ZGlvIFZpZGVvICovCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9SRUcoaWR4KQkJCUhETUlfUkVHKEhETUlfQ09SRV9BViArIGlkeCkKLQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSERNSV9DVFJMCQkJSERNSV9DT1JFX0FWX1JFRygweEJDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfRFBECQkJSERNSV9DT1JFX0FWX1JFRygweEY0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDEJCQlIRE1JX0NPUkVfQVZfUkVHKDB4RjgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9QQl9DVFJMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHhGQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9UWVBFCQkJSERNSV9DT1JFX0FWX1JFRygweDEwMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9WRVJTCQkJSERNSV9DT1JFX0FWX1JFRygweDEwNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9MRU4JCQlIRE1JX0NPUkVfQVZfUkVHKDB4MTA4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0NIU1VNCQkJSERNSV9DT1JFX0FWX1JFRygweDEwQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9EQllURShuKQkJSERNSV9DT1JFX0FWX1JFRyhuICogNCArIDB4MTEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFX05FTEVNUwkJSERNSV9DT1JFX0FWX1JFRygxNSkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9EQllURQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDI3KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX0RCWVRFKG4pCQlIRE1JX0NPUkVfQVZfUkVHKG4gKiA0ICsgMHgyMTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19EQllURQkJSERNSV9DT1JFX0FWX1JFRygweDI5MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfREJZVEVfTkVMRU1TCQlIRE1JX0NPUkVfQVZfUkVHKDI3KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOX0RCWVRFCQkJSERNSV9DT1JFX0FWX1JFRygweDMwMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0dFTl9EQllURV9ORUxFTVMJCUhETUlfQ09SRV9BVl9SRUcoMzEpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFCQlIRE1JX0NPUkVfQVZfUkVHKDB4MzgwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOMl9EQllURV9ORUxFTVMJCUhETUlfQ09SRV9BVl9SRUcoMzEpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BQ1JfQ1RSTAkJCUhETUlfQ09SRV9BVl9SRUcoMHg0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfRlJFUV9TVkFMCQkJSERNSV9DT1JFX0FWX1JFRygweDgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwxCQkJSERNSV9DT1JFX0FWX1JFRygweEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwyCQkJSERNSV9DT1JFX0FWX1JFRygweDEwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTl9TVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHgxQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19TVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgyMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMQkJCUhETUlfQ09SRV9BVl9SRUcoMHgyNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMgkJCUhETUlfQ09SRV9BVl9SRUcoMHgyOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NUU19IVkFMMwkJCUhETUlfQ09SRV9BVl9SRUcoMHgyQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRF9NT0RFCQkJSERNSV9DT1JFX0FWX1JFRygweDUwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfQ1RSTAkJSERNSV9DT1JFX0FWX1JFRygweDU0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMJCUhETUlfQ09SRV9BVl9SRUcoMHg2MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NXQVBfSTJTCQkJSERNSV9DT1JFX0FWX1JFRygweDY0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfRVJUSAkJSERNSV9DT1JFX0FWX1JFRygweDZDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0lOX01BUAkJSERNSV9DT1JFX0FWX1JFRygweDcwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwJCUhETUlfQ09SRV9BVl9SRUcoMHg3NCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMAkJCUhETUlfQ09SRV9BVl9SRUcoMHg3OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMQkJCUhETUlfQ09SRV9BVl9SRUcoMHg3QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUMgkJCUhETUlfQ09SRV9BVl9SRUcoMHg4MCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUNAkJCUhETUlfQ09SRV9BVl9SRUcoMHg4NCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19DSFNUNQkJCUhETUlfQ09SRV9BVl9SRUcoMHg4OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FTUkMJCQlIRE1JX0NPUkVfQVZfUkVHKDB4OEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9JMlNfSU5fTEVOCQlIRE1JX0NPUkVfQVZfUkVHKDB4OTApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQlIRE1JX0NPUkVfQVZfUkVHKDB4QkMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURPX1RYU1RBVAkJSERNSV9DT1JFX0FWX1JFRygweEMwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMQkJSERNSV9DT1JFX0FWX1JFRygweENDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMgkJSERNSV9DT1JFX0FWX1JFRygweEQwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMwkJSERNSV9DT1JFX0FWX1JFRygweEQ0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwJCUhETUlfQ09SRV9BVl9SRUcoMHhGMCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0RQRAkJCUhETUlfQ09SRV9BVl9SRUcoMHhGNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwxCQkJSERNSV9DT1JFX0FWX1JFRygweEY4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDIJCQlIRE1JX0NPUkVfQVZfUkVHKDB4RkMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMDApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVkVSUwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMDQpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfTEVOCQkJSERNSV9DT1JFX0FWX1JFRygweDEwOCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9DSFNVTQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxMEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxODApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVkVSUwkJCUhETUlfQ09SRV9BVl9SRUcoMHgxODQpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfTEVOCQkJSERNSV9DT1JFX0FWX1JFRygweDE4OCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9DSFNVTQkJCUhETUlfQ09SRV9BVl9SRUcoMHgxOEMpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19UWVBFCQlIRE1JX0NPUkVfQVZfUkVHKDB4MjAwKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVESU9fVkVSUwkJSERNSV9DT1JFX0FWX1JFRygweDIwNCkKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX0xFTgkJCUhETUlfQ09SRV9BVl9SRUcoMHgyMDgpCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19DSFNVTQkJSERNSV9DT1JFX0FWX1JFRygweDIwQykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfVFlQRQkJCUhETUlfQ09SRV9BVl9SRUcoMHgyODApCi0jZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX1ZFUlMJCQlIRE1JX0NPUkVfQVZfUkVHKDB4Mjg0KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19MRU4JCQlIRE1JX0NPUkVfQVZfUkVHKDB4Mjg4KQotI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19DSFNVTQkJSERNSV9DT1JFX0FWX1JFRygweDI4QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NQX0JZVEUxCQkJSERNSV9DT1JFX0FWX1JFRygweDM3QykKLSNkZWZpbmUgSERNSV9DT1JFX0FWX0NFQ19BRERSX0lECQlIRE1JX0NPUkVfQVZfUkVHKDB4M0ZDKQotI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX0VMU0laRQkJMHg0Ci0jZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfRUxTSVpFCQkweDQKLQotLyogUExMICovCi0jZGVmaW5lIEhETUlfUExMX1JFRyhpZHgpCQkJSERNSV9SRUcoSERNSV9QTExDVFJMICsgaWR4KQotCi0jZGVmaW5lIFBMTENUUkxfUExMX0NPTlRST0wJCQlIRE1JX1BMTF9SRUcoMHgwKQotI2RlZmluZSBQTExDVFJMX1BMTF9TVEFUVVMJCQlIRE1JX1BMTF9SRUcoMHg0KQotI2RlZmluZSBQTExDVFJMX1BMTF9HTwkJCQlIRE1JX1BMTF9SRUcoMHg4KQotI2RlZmluZSBQTExDVFJMX0NGRzEJCQkJSERNSV9QTExfUkVHKDB4QykKLSNkZWZpbmUgUExMQ1RSTF9DRkcyCQkJCUhETUlfUExMX1JFRygweDEwKQotI2RlZmluZSBQTExDVFJMX0NGRzMJCQkJSERNSV9QTExfUkVHKDB4MTQpCi0jZGVmaW5lIFBMTENUUkxfQ0ZHNAkJCQlIRE1JX1BMTF9SRUcoMHgyMCkKLQotLyogSERNSSBQSFkgKi8KLSNkZWZpbmUgSERNSV9QSFlfUkVHKGlkeCkJCQlIRE1JX1JFRyhIRE1JX1BIWSArIGlkeCkKLQotI2RlZmluZSBIRE1JX1RYUEhZX1RYX0NUUkwJCQlIRE1JX1BIWV9SRUcoMHgwKQotI2RlZmluZSBIRE1JX1RYUEhZX0RJR0lUQUxfQ1RSTAkJSERNSV9QSFlfUkVHKDB4NCkKLSNkZWZpbmUgSERNSV9UWFBIWV9QT1dFUl9DVFJMCQkJSERNSV9QSFlfUkVHKDB4OCkKLSNkZWZpbmUgSERNSV9UWFBIWV9QQURfQ0ZHX0NUUkwJCUhETUlfUEhZX1JFRygweEMpCi0KLS8qIEhETUkgRURJRCBMZW5ndGggICovCi0jZGVmaW5lIEhETUlfRURJRF9NQVhfTEVOR1RICQkJMjU2Ci0jZGVmaW5lIEVESURfVElNSU5HX0RFU0NSSVBUT1JfU0laRQkJMHgxMgotI2RlZmluZSBFRElEX0RFU0NSSVBUT1JfQkxPQ0swX0FERFJFU1MJCTB4MzYKLSNkZWZpbmUgRURJRF9ERVNDUklQVE9SX0JMT0NLMV9BRERSRVNTCQkweDgwCi0jZGVmaW5lIEVESURfU0laRV9CTE9DSzBfVElNSU5HX0RFU0NSSVBUT1IJNAotI2RlZmluZSBFRElEX1NJWkVfQkxPQ0sxX1RJTUlOR19ERVNDUklQVE9SCTQKLQotI2RlZmluZSBPTUFQX0hETUlfVElNSU5HU19OQgkJCTM0Ci0KLSNkZWZpbmUgUkVHX0ZMRF9NT0QoaWR4LCB2YWwsIHN0YXJ0LCBlbmQpIFwKLQloZG1pX3dyaXRlX3JlZyhpZHgsIEZMRF9NT0QoaGRtaV9yZWFkX3JlZyhpZHgpLCB2YWwsIHN0YXJ0LCBlbmQpKQotI2RlZmluZSBSRUdfR0VUKGlkeCwgc3RhcnQsIGVuZCkgXAotCUZMRF9HRVQoaGRtaV9yZWFkX3JlZyhpZHgpLCBzdGFydCwgZW5kKQotCi0vKiBIRE1JIHRpbWluZyBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBoZG1pX3RpbWluZ3MgewotCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5nczsKLQlpbnQgdnN5bmNfcG9sOwotCWludCBoc3luY19wb2w7Ci19OwotCi1lbnVtIGhkbWlfcGh5X3B3ciB7Ci0JSERNSV9QSFlQV1JDTURfT0ZGID0gMCwKLQlIRE1JX1BIWVBXUkNNRF9MRE9PTiA9IDEsCi0JSERNSV9QSFlQV1JDTURfVFhPTiA9IDIKLX07Ci0KLWVudW0gaGRtaV9wbGxfcHdyIHsKLQlIRE1JX1BMTFBXUkNNRF9BTExPRkYgPSAwLAotCUhETUlfUExMUFdSQ01EX1BMTE9OTFkgPSAxLAotCUhETUlfUExMUFdSQ01EX0JPVEhPTl9BTExDTEtTID0gMiwKLQlIRE1JX1BMTFBXUkNNRF9CT1RIT05fTk9QSFlDTEsgPSAzCi19OwotCi1lbnVtIGhkbWlfY2xrX3JlZnNlbCB7Ci0JSERNSV9SRUZTRUxfUENMSyA9IDAsCi0JSERNSV9SRUZTRUxfUkVGMSA9IDEsCi0JSERNSV9SRUZTRUxfUkVGMiA9IDIsCi0JSERNSV9SRUZTRUxfU1lTQ0xLID0gMwotfTsKLQotZW51bSBoZG1pX2NvcmVfaW5wdXRidXNfd2lkdGggewotCUhETUlfSU5QVVRfOEJJVCA9IDAsCi0JSERNSV9JTlBVVF8xMEJJVCA9IDEsCi0JSERNSV9JTlBVVF8xMkJJVCA9IDIKLX07Ci0KLWVudW0gaGRtaV9jb3JlX2RpdGhlcl90cnVuYyB7Ci0JSERNSV9PVVRQVVRUUlVOQ0FUSU9OXzhCSVQgPSAwLAotCUhETUlfT1VUUFVUVFJVTkNBVElPTl8xMEJJVCA9IDEsCi0JSERNSV9PVVRQVVRUUlVOQ0FUSU9OXzEyQklUID0gMiwKLQlIRE1JX09VVFBVVERJVEhFUl84QklUID0gMywKLQlIRE1JX09VVFBVVERJVEhFUl8xMEJJVCA9IDQsCi0JSERNSV9PVVRQVVRESVRIRVJfMTJCSVQgPSA1Ci19OwotCi1lbnVtIGhkbWlfY29yZV9kZWVwY29sb3JfZWQgewotCUhETUlfREVFUENPTE9SUEFDS0VDVERJU0FCTEUgPSAwLAotCUhETUlfREVFUENPTE9SUEFDS0VDVEVOQUJMRSA9IDEKLX07Ci0KLWVudW0gaGRtaV9jb3JlX3BhY2tldF9tb2RlIHsKLQlIRE1JX1BBQ0tFVE1PREVSRVNFUlZFRFZBTFVFID0gMCwKLQlIRE1JX1BBQ0tFVE1PREUyNEJJVFBFUlBJWEVMID0gNCwKLQlIRE1JX1BBQ0tFVE1PREUzMEJJVFBFUlBJWEVMID0gNSwKLQlIRE1JX1BBQ0tFVE1PREUzNkJJVFBFUlBJWEVMID0gNiwKLQlIRE1JX1BBQ0tFVE1PREU0OEJJVFBFUlBJWEVMID0gNwotfTsKLQotZW51bSBoZG1pX2NvcmVfaGRtaV9kdmkgewotCUhETUlfRFZJID0gMCwKLQlIRE1JX0hETUkgPSAxCi19OwotCi1lbnVtIGhkbWlfY29yZV90Y2xrc2VsY2xrbXVsdCB7Ci0JSERNSV9GUExMMDVJRENLID0gMCwKLQlIRE1JX0ZQTEwxMElEQ0sgPSAxLAotCUhETUlfRlBMTDIwSURDSyA9IDIsCi0JSERNSV9GUExMNDBJRENLID0gMwotfTsKLQotZW51bSBoZG1pX2NvcmVfcGFja2V0X2N0cmwgewotCUhETUlfUEFDS0VURU5BQkxFID0gMSwKLQlIRE1JX1BBQ0tFVERJU0FCTEUgPSAwLAotCUhETUlfUEFDS0VUUkVQRUFUT04gPSAxLAotCUhETUlfUEFDS0VUUkVQRUFUT0ZGID0gMAotfTsKLQotLyogSU5GT0ZSQU1FX0FWSV8gYW5kIElORk9GUkFNRV9BVURJT18gZGVmaW5pdGlvbnMgKi8KLWVudW0gaGRtaV9jb3JlX2luZm9mcmFtZSB7Ci0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfUkdCID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIxWV9ZVVY0MjIgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1lVVjQ0NCA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PRkYgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFBX0FDVElWRV9GT1JNQVRfT04gPSAgMSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfVkVSVCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfSE9SSSA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMUJfVkVSVEhPUkkgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzAgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzEgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFTXzIgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX05PID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyQ19JVFU2MDEgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX0lUVTcwOSA9IDIsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfRUNfRVhURU5ERUQgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNX05PID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyTV80MyA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fMTY5ID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyUl9TQU1FID0gOCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIyUl80MyA9IDksCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMlJfMTY5ID0gMTAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCMlJfMTQ5ID0gMTEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19ZRVMgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNFQ19YVllVVjYwMSA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM0VDX1hWWVVWNzA5ID0gMSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9ERUZBVUxUID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9MUiA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM1FfRlIgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX0hPUkkgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19WRVJUID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfSE9SSVZFUlQgPSAzLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl9OTyA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzIgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl8zID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNCA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzUgPSA0LAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl82ID0gNSwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNyA9IDYsCi0JSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzggPSA3LAotCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl85ID0gOCwKLQlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfMTAgPSA5LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0ZST01fU1RSRUFNID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9JRUM2MDk1OCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfQUMzID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUEVHMSA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfTVAzID0gNCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUEVHMl9NVUxUSUNIID0gNSwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BQUMgPSA2LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0RUUyA9IDcsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfQVRSQUMgPSA4LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX09ORUJJVCA9IDksCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRE9MQllfRElHSVRBTF9QTFVTID0gMTAsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFRTX0hEID0gMTEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfTUFUID0gMTIsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFNUID0gMTMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfV01BX1BSTyA9IDE0LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGX0ZST01fU1RSRUFNID0gMCwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl8zMjAwMCA9IDEsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfNDQxMDAgPSAyLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzQ4MDAwID0gMywKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl84ODIwMCA9IDQsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfOTYwMDAgPSA1LAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzE3NjQwMCA9IDYsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfMTkyMDAwID0gNywKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU19GUk9NX1NUUkVBTSA9IDAsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU1NfMTZCSVQgPSAxLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTXzIwQklUID0gMiwKLQlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU18yNEJJVCA9IDMsCi0JSERNSV9JTkZPRlJBTUVfQVVESU9fREI1X0RNX0lOSF9QRVJNSVRURUQgPSAwLAotCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCNV9ETV9JTkhfUFJPSElCSVRFRCA9IDEKLX07Ci0KLWVudW0gaGRtaV9wYWNraW5nX21vZGUgewotCUhETUlfUEFDS18xMGJfUkdCX1lVVjQ0NCA9IDAsCi0JSERNSV9QQUNLXzI0Yl9SR0JfWVVWNDQ0X1lVVjQyMiA9IDEsCi0JSERNSV9QQUNLXzIwYl9ZVVY0MjIgPSAyLAotCUhETUlfUEFDS19BTFJFQURZUEFDS0VEID0gNwotfTsKLQotZW51bSBoZG1pX2NvcmVfYXVkaW9fc2FtcGxlX2ZyZXEgewotCUhETUlfQVVESU9fRlNfMzIwMDAgPSAweDMsCi0JSERNSV9BVURJT19GU180NDEwMCA9IDB4MCwKLQlIRE1JX0FVRElPX0ZTXzQ4MDAwID0gMHgyLAotCUhETUlfQVVESU9fRlNfODgyMDAgPSAweDgsCi0JSERNSV9BVURJT19GU185NjAwMCA9IDB4QSwKLQlIRE1JX0FVRElPX0ZTXzE3NjQwMCA9IDB4QywKLQlIRE1JX0FVRElPX0ZTXzE5MjAwMCA9IDB4RSwKLQlIRE1JX0FVRElPX0ZTX05PVF9JTkRJQ0FURUQgPSAweDEKLX07Ci0KLWVudW0gaGRtaV9jb3JlX2F1ZGlvX2xheW91dCB7Ci0JSERNSV9BVURJT19MQVlPVVRfMkNIID0gMCwKLQlIRE1JX0FVRElPX0xBWU9VVF84Q0ggPSAxCi19OwotCi1lbnVtIGhkbWlfY29yZV9jdHNfbW9kZSB7Ci0JSERNSV9BVURJT19DVFNfTU9ERV9IVyA9IDAsCi0JSERNSV9BVURJT19DVFNfTU9ERV9TVyA9IDEKLX07Ci0KLWVudW0gaGRtaV9zdGVyZW9fY2hhbm5lbHMgewotCUhETUlfQVVESU9fU1RFUkVPX05PQ0hBTk5FTFMgPSAwLAotCUhETUlfQVVESU9fU1RFUkVPX09ORUNIQU5ORUwgPSAxLAotCUhETUlfQVVESU9fU1RFUkVPX1RXT0NIQU5ORUxTID0gMiwKLQlIRE1JX0FVRElPX1NURVJFT19USFJFRUNIQU5ORUxTID0gMywKLQlIRE1JX0FVRElPX1NURVJFT19GT1VSQ0hBTk5FTFMgPSA0Ci19OwotCi1lbnVtIGhkbWlfYXVkaW9fdHlwZSB7Ci0JSERNSV9BVURJT19UWVBFX0xQQ00gPSAwLAotCUhETUlfQVVESU9fVFlQRV9JRUMgPSAxCi19OwotCi1lbnVtIGhkbWlfYXVkaW9fanVzdGlmeSB7Ci0JSERNSV9BVURJT19KVVNUSUZZX0xFRlQgPSAwLAotCUhETUlfQVVESU9fSlVTVElGWV9SSUdIVCA9IDEKLX07Ci0KLWVudW0gaGRtaV9hdWRpb19zYW1wbGVfb3JkZXIgewotCUhETUlfQVVESU9fU0FNUExFX1JJR0hUX0ZJUlNUID0gMCwKLQlIRE1JX0FVRElPX1NBTVBMRV9MRUZUX0ZJUlNUID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX3NhbXBsZXNfcGVyd29yZCB7Ci0JSERNSV9BVURJT19PTkVXT1JEX09ORVNBTVBMRSA9IDAsCi0JSERNSV9BVURJT19PTkVXT1JEX1RXT1NBTVBMRVMgPSAxCi19OwotCi1lbnVtIGhkbWlfYXVkaW9fc2FtcGxlX3NpemUgewotCUhETUlfQVVESU9fU0FNUExFXzE2QklUUyA9IDAsCi0JSERNSV9BVURJT19TQU1QTEVfMjRCSVRTID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX3RyYW5zZl9tb2RlIHsKLQlIRE1JX0FVRElPX1RSQU5TRl9ETUEgPSAwLAotCUhETUlfQVVESU9fVFJBTlNGX0lSUSA9IDEKLX07Ci0KLWVudW0gaGRtaV9hdWRpb19ibGtfc3RydF9lbmRfc2lnIHsKLQlIRE1JX0FVRElPX0JMT0NLX1NJR19TVEFSVEVORF9PTiA9IDAsCi0JSERNSV9BVURJT19CTE9DS19TSUdfU1RBUlRFTkRfT0ZGID0gMQotfTsKLQotZW51bSBoZG1pX2F1ZGlvX2kyc19jb25maWcgewotCUhETUlfQVVESU9fSTJTX1dTX1BPTEFSSVRZX0xPV19JU19MRUZUID0gMCwKLQlIRE1JX0FVRElPX0kyU19XU19QT0xBUklUX1lMT1dfSVNfUklHSFQgPSAxLAotCUhETUlfQVVESU9fSTJTX01TQl9TSElGVEVEX0ZJUlNUID0gMCwKLQlIRE1JX0FVRElPX0kyU19MU0JfU0hJRlRFRF9GSVJTVCA9IDEsCi0JSERNSV9BVURJT19JMlNfTUFYX1dPUkRfMjBCSVRTID0gMCwKLQlIRE1JX0FVRElPX0kyU19NQVhfV09SRF8yNEJJVFMgPSAxLAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF9OT1RfU1BFQ0lGSUVEID0gMCwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTZfQklUUyA9IDEsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzE3X0JJVFMgPSA2LAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xOF9CSVRTID0gMiwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTlfQklUUyA9IDQsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIwX0JJVFNfMjBNQVggPSA1LAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yMF9CSVRTXzI0TUFYID0gMSwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjFfQklUUyA9IDYsCi0JSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIyX0JJVFMgPSAyLAotCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yM19CSVRTID0gNCwKLQlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjRfQklUUyA9IDUsCi0JSERNSV9BVURJT19JMlNfU0NLX0VER0VfRkFMTElORyA9IDAsCi0JSERNSV9BVURJT19JMlNfU0NLX0VER0VfUklTSU5HID0gMSwKLQlIRE1JX0FVRElPX0kyU19WQklUX0ZPUl9QQ00gPSAwLAotCUhETUlfQVVESU9fSTJTX1ZCSVRfRk9SX0NPTVBSRVNTRUQgPSAxLAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF9OQSA9IDAsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzE2ID0gMiwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTcgPSAxMiwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTggPSA0LAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xOSA9IDgsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIwID0gMTAsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIxID0gMTMsCi0JSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzIyID0gNSwKLQlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjMgPSA5LAotCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8yNCA9IDExLAotCUhETUlfQVVESU9fSTJTX0ZJUlNUX0JJVF9TSElGVCA9IDAsCi0JSERNSV9BVURJT19JMlNfRklSU1RfQklUX05PX1NISUZUID0gMSwKLQlIRE1JX0FVRElPX0kyU19TRDBfRU4gPSAxLAotCUhETUlfQVVESU9fSTJTX1NEMV9FTiA9IDEgPDwgMSwKLQlIRE1JX0FVRElPX0kyU19TRDJfRU4gPSAxIDw8IDIsCi0JSERNSV9BVURJT19JMlNfU0QzX0VOID0gMSA8PCAzLAotfTsKLQotZW51bSBoZG1pX2F1ZGlvX21jbGtfbW9kZSB7Ci0JSERNSV9BVURJT19NQ0xLXzEyOEZTID0gMCwKLQlIRE1JX0FVRElPX01DTEtfMjU2RlMgPSAxLAotCUhETUlfQVVESU9fTUNMS18zODRGUyA9IDIsCi0JSERNSV9BVURJT19NQ0xLXzUxMkZTID0gMywKLQlIRE1JX0FVRElPX01DTEtfNzY4RlMgPSA0LAotCUhETUlfQVVESU9fTUNMS18xMDI0RlMgPSA1LAotCUhETUlfQVVESU9fTUNMS18xMTUyRlMgPSA2LAotCUhETUlfQVVESU9fTUNMS18xOTJGUyA9IDcKLX07Ci0KLXN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnIHsKLQllbnVtIGhkbWlfY29yZV9pbnB1dGJ1c193aWR0aAlpcF9idXNfd2lkdGg7Ci0JZW51bSBoZG1pX2NvcmVfZGl0aGVyX3RydW5jCW9wX2RpdGhlcl90cnVjOwotCWVudW0gaGRtaV9jb3JlX2RlZXBjb2xvcl9lZAlkZWVwX2NvbG9yX3BrdDsKLQllbnVtIGhkbWlfY29yZV9wYWNrZXRfbW9kZQlwa3RfbW9kZTsKLQllbnVtIGhkbWlfY29yZV9oZG1pX2R2aQkJaGRtaV9kdmk7Ci0JZW51bSBoZG1pX2NvcmVfdGNsa3NlbGNsa211bHQJdGNsa19zZWxfY2xrbXVsdDsKLX07Ci0KLS8qCi0gKiBSZWZlciB0byBzZWN0aW9uIDguMiBpbiBIRE1JIDEuMyBzcGVjaWZpY2F0aW9uIGZvcgotICogZGV0YWlscyBhYm91dCBpbmZvZnJhbWUgZGF0YWJ5dGVzCi0gKi8KLXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F2aSB7Ci0JdTgJZGIxX2Zvcm1hdDsKLQkJLyogWTAsIFkxIHJnYix5Q2JDciAqLwotCXU4CWRiMV9hY3RpdmVfaW5mbzsKLQkJLyogQTAgIEFjdGl2ZSBpbmZvcm1hdGlvbiBQcmVzZW50ICovCi0JdTgJZGIxX2Jhcl9pbmZvX2R2OwotCQkvKiBCMCwgQjEgQmFyIGluZm8gZGF0YSB2YWxpZCAqLwotCXU4CWRiMV9zY2FuX2luZm87Ci0JCS8qIFMwLCBTMSBzY2FuIGluZm9ybWF0aW9uICovCi0JdTgJZGIyX2NvbG9yaW1ldHJ5OwotCQkvKiBDMCwgQzEgY29sb3JpbWV0cnkgKi8KLQl1OAlkYjJfYXNwZWN0X3JhdGlvOwotCQkvKiBNMCwgTTEgQXNwZWN0IHJhdGlvICg0OjMsIDE2OjkpICovCi0JdTgJZGIyX2FjdGl2ZV9mbXRfYXI7Ci0JCS8qIFIwLi4uUjMgQWN0aXZlIGZvcm1hdCBhc3BlY3QgcmF0aW8gKi8KLQl1OAlkYjNfaXRjOwotCQkvKiBJVEMgSVQgY29udGVudC4gKi8KLQl1OAlkYjNfZWM7Ci0JCS8qIEVDMCwgRUMxLCBFQzIgRXh0ZW5kZWQgY29sb3JpbWV0cnkgKi8KLQl1OAlkYjNfcV9yYW5nZTsKLQkJLyogUTEsIFEwIFF1YW50aXphdGlvbiByYW5nZSAqLwotCXU4CWRiM19udXBfc2NhbGluZzsKLQkJLyogU0MxLCBTQzAgTm9uLXVuaWZvcm0gcGljdHVyZSBzY2FsaW5nICovCi0JdTgJZGI0X3ZpZGVvY29kZTsKLQkJLyogVklDMC4uNiBWaWRlbyBmb3JtYXQgaWRlbnRpZmljYXRpb24gKi8KLQl1OAlkYjVfcGl4ZWxfcmVwZWF0OwotCQkvKiBQUjAuLlBSMyBQaXhlbCByZXBldGl0aW9uIGZhY3RvciAqLwotCXUxNglkYjZfN19saW5lX2VvZnRvcDsKLQkJLyogTGluZSBudW1iZXIgZW5kIG9mIHRvcCBiYXIgKi8KLQl1MTYJZGI4XzlfbGluZV9zb2Zib3R0b207Ci0JCS8qIExpbmUgbnVtYmVyIHN0YXJ0IG9mIGJvdHRvbSBiYXIgKi8KLQl1MTYJZGIxMF8xMV9waXhlbF9lb2ZsZWZ0OwotCQkvKiBQaXhlbCBudW1iZXIgZW5kIG9mIGxlZnQgYmFyICovCi0JdTE2CWRiMTJfMTNfcGl4ZWxfc29mcmlnaHQ7Ci0JCS8qIFBpeGVsIG51bWJlciBzdGFydCBvZiByaWdodCBiYXIgKi8KLX07Ci0vKgotICogUmVmZXIgdG8gc2VjdGlvbiA4LjIgaW4gSERNSSAxLjMgc3BlY2lmaWNhdGlvbiBmb3IKLSAqIGRldGFpbHMgYWJvdXQgaW5mb2ZyYW1lIGRhdGFieXRlcwotICovCi1zdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyB7Ci0JdTggZGIxX2NvZGluZ190eXBlOwotCXU4IGRiMV9jaGFubmVsX2NvdW50OwotCXU4IGRiMl9zYW1wbGVfZnJlcTsKLQl1OCBkYjJfc2FtcGxlX3NpemU7Ci0JdTggZGI0X2NoYW5uZWxfYWxsb2M7Ci0JYm9vbCBkYjVfZG93bm1peF9pbmg7Ci0JdTggZGI1X2xzdjsJLyogTGV2ZWwgc2hpZnQgdmFsdWVzIGZvciBkb3dubWl4ICovCi19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHsKLQl1MzIJYXVkaW9fcGt0OwotCXUzMglhdWRpb19wa3RfcmVwZWF0OwotCXUzMglhdmlfaW5mb2ZyYW1lOwotCXUzMglhdmlfaW5mb2ZyYW1lX3JlcGVhdDsKLQl1MzIJZ2VuX2NudHJsX3BrdDsKLQl1MzIJZ2VuX2NudHJsX3BrdF9yZXBlYXQ7Ci0JdTMyCWdlbmVyaWNfcGt0OwotCXUzMglnZW5lcmljX3BrdF9yZXBlYXQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgewotCWVudW0gaGRtaV9wYWNraW5nX21vZGUJcGFja2luZ19tb2RlOwotCXUzMgkJCXlfcmVzOwkvKiBMaW5lIHBlciBwYW5lbCAqLwotCXUzMgkJCXhfcmVzOwkvKiBwaXhlbCBwZXIgbGluZSAqLwotfTsKLQotc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHsKLQlpbnQJdnNwOwkvKiBWc3luYyBwb2xhcml0eSAqLwotCWludAloc3A7CS8qIEhzeW5jIHBvbGFyaXR5ICovCi0JaW50CWludGVybGFjaW5nOwotCWludAl0bTsJLyogVGltaW5nIG1vZGUgKi8KLX07Ci0KLXN0cnVjdCBoZG1pX2NtIHsKLQlpbnQJY29kZTsKLQlpbnQJbW9kZTsKLX07Ci0KLXN0cnVjdCBoZG1pX2NvbmZpZyB7Ci0Jc3RydWN0IGhkbWlfdGltaW5ncyB0aW1pbmdzOwotCXUxNglpbnRlcmxhY2U7Ci0Jc3RydWN0IGhkbWlfY20gY207Ci19OwotCi1zdHJ1Y3QgaGRtaV9hdWRpb19mb3JtYXQgewotCWVudW0gaGRtaV9zdGVyZW9fY2hhbm5lbHMJCXN0ZXJlb19jaGFubmVsczsKLQl1OAkJCQkJYWN0aXZlX2Nobm5sc19tc2s7Ci0JZW51bSBoZG1pX2F1ZGlvX3R5cGUJCQl0eXBlOwotCWVudW0gaGRtaV9hdWRpb19qdXN0aWZ5CQkJanVzdGlmaWNhdGlvbjsKLQllbnVtIGhkbWlfYXVkaW9fc2FtcGxlX29yZGVyCQlzYW1wbGVfb3JkZXI7Ci0JZW51bSBoZG1pX2F1ZGlvX3NhbXBsZXNfcGVyd29yZAkJc2FtcGxlc19wZXJfd29yZDsKLQllbnVtIGhkbWlfYXVkaW9fc2FtcGxlX3NpemUJCXNhbXBsZV9zaXplOwotCWVudW0gaGRtaV9hdWRpb19ibGtfc3RydF9lbmRfc2lnCWVuX3NpZ19ibGtfc3RydF9lbmQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV9hdWRpb19kbWEgewotCXU4CQkJCXRyYW5zZmVyX3NpemU7Ci0JdTgJCQkJYmxvY2tfc2l6ZTsKLQllbnVtIGhkbWlfYXVkaW9fdHJhbnNmX21vZGUJbW9kZTsKLQl1MTYJCQkJZmlmb190aHJlc2hvbGQ7Ci19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2kyc19jb25maWcgewotCXU4IHdvcmRfbWF4X2xlbmd0aDsKLQl1OCB3b3JkX2xlbmd0aDsKLQl1OCBpbl9sZW5ndGhfYml0czsKLQl1OCBqdXN0aWZpY2F0aW9uOwotCXU4IGVuX2hpZ2hfYml0cmF0ZV9hdWQ7Ci0JdTggc2NrX2VkZ2VfbW9kZTsKLQl1OCBjYml0X29yZGVyOwotCXU4IHZiaXQ7Ci0JdTggd3NfcG9sYXJpdHk7Ci0JdTggZGlyZWN0aW9uOwotCXU4IHNoaWZ0OwotCXU4IGFjdGl2ZV9zZHM7Ci19OwotCi1zdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2NvbmZpZyB7Ci0Jc3RydWN0IGhkbWlfY29yZV9hdWRpb19pMnNfY29uZmlnCWkyc19jZmc7Ci0JZW51bSBoZG1pX2NvcmVfYXVkaW9fc2FtcGxlX2ZyZXEJZnJlcV9zYW1wbGU7Ci0JYm9vbAkJCQkJZnNfb3ZlcnJpZGU7Ci0JdTMyCQkJCQluOwotCXUzMgkJCQkJY3RzOwotCXUzMgkJCQkJYXVkX3Bhcl9idXNjbGs7Ci0JZW51bSBoZG1pX2NvcmVfYXVkaW9fbGF5b3V0CQlsYXlvdXQ7Ci0JZW51bSBoZG1pX2NvcmVfY3RzX21vZGUJCQljdHNfbW9kZTsKLQlib29sCQkJCQl1c2VfbWNsazsKLQllbnVtIGhkbWlfYXVkaW9fbWNsa19tb2RlCQltY2xrX21vZGU7Ci0JYm9vbAkJCQkJZW5fYWNyX3BrdDsKLQlib29sCQkJCQllbl9kc2RfYXVkaW87Ci0JYm9vbAkJCQkJZW5fcGFyYWxsZWxfYXVkX2lucHV0OwotCWJvb2wJCQkJCWVuX3NwZGlmOwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9vbWFwNF9wYW5lbC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9vbWFwNF9wYW5lbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRmMmJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfb21hcDRfcGFuZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogaGRtaV9vbWFwNF9wYW5lbC5jCi0gKgotICogSERNSSBsaWJyYXJ5IHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQNCBwcm9jZXNzb3JzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLwotICogQXV0aG9yczoJTXl0aHJpIFAgayA8bXl0aHJpcGtAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0KLSNpbmNsdWRlICJkc3MuaCIKLQotc3RhdGljIHN0cnVjdCB7Ci0Jc3RydWN0IG11dGV4IGhkbWlfbG9jazsKLX0gaGRtaTsKLQotCi1zdGF0aWMgaW50IGhkbWlfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCURTU0RCRygiRU5URVIgaGRtaV9wYW5lbF9wcm9iZVxuIik7Ci0KLQlkc3NkZXYtPnBhbmVsLmNvbmZpZyA9IE9NQVBfRFNTX0xDRF9URlQgfAotCQkJT01BUF9EU1NfTENEX0lWUyB8IE9NQVBfRFNTX0xDRF9JSFM7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIHRpbWluZ3MgdG8gNjQwICogNDgwCi0JICogVGhpcyBpcyBvbmx5IGZvciBmcmFtZWJ1ZmZlciB1cGRhdGUgbm90IGZvciBUViB0aW1pbmcgc2V0dGluZwotCSAqIFNldHRpbmcgVFYgdGltaW5nIHdpbGwgYmUgZG9uZSBvbmx5IG9uIGVuYWJsZQotCSAqLwotCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcyA9IDY0MDsKLQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MueV9yZXMgPSA0ODA7Ci0KLQlEU1NEQkcoImhkbWlfcGFuZWxfcHJvYmUgeF9yZXM9ICVkIHlfcmVzID0gJWRcbiIsCi0JCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKLQkJZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGRtaV9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCi19Ci0KLXN0YXRpYyBpbnQgaGRtaV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfZW5hYmxlXG4iKTsKLQotCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKLQotCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpIHsKLQkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQlpZiAocikgewotCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCi0JCW9tYXBkc3NfaGRtaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOwotCi0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpbnQgciA9IDA7Ci0KLQltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkgewotCQlyID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOwotCi0Jb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOwotCi1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGludCBoZG1pX3BhbmVsX3Jlc3VtZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaW50IHIgPSAwOwotCi0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKLQkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQlpZiAocikgewotCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkbWlfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKLXsKLQltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci0KLQkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKLQotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBoZG1pX3NldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCi17Ci0JRFNTREJHKCJoZG1pX3NldF90aW1pbmdzXG4iKTsKLQotCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKLQotCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKLQkJLyogdHVybiB0aGUgaGRtaSBvZmYgYW5kIG9uIHRvIGdldCBuZXcgdGltaW5ncyB0byB1c2UgKi8KLQkJb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOwotCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9zZXRfdGltaW5nKGRzc2Rldik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGRtaV9jaGVja190aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCi17Ci0JaW50IHIgPSAwOwotCi0JRFNTREJHKCJoZG1pX2NoZWNrX3RpbWluZ3NcbiIpOwotCi0JbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOwotCi0JciA9IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2NoZWNrX3RpbWluZyhkc3NkZXYsIHRpbWluZ3MpOwotCWlmIChyKSB7Ci0JCURTU0VSUigiVGltaW5nIGNhbm5vdCBiZSBhcHBsaWVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotZXJyOgotCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOwotCXJldHVybiByOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciBoZG1pX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaGRtaV9wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IGhkbWlfcGFuZWxfcmVtb3ZlLAotCS5lbmFibGUJCT0gaGRtaV9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBoZG1pX3BhbmVsX2Rpc2FibGUsCi0JLnN1c3BlbmQJPSBoZG1pX3BhbmVsX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBoZG1pX3BhbmVsX3Jlc3VtZSwKLQkuZ2V0X3RpbWluZ3MJPSBoZG1pX2dldF90aW1pbmdzLAotCS5zZXRfdGltaW5ncwk9IGhkbWlfc2V0X3RpbWluZ3MsCi0JLmNoZWNrX3RpbWluZ3MJPSBoZG1pX2NoZWNrX3RpbWluZ3MsCi0JLmRyaXZlcgkJCT0gewotCQkubmFtZSAgID0gImhkbWlfcGFuZWwiLAotCQkub3duZXIgID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLWludCBoZG1pX3BhbmVsX2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZoZG1pLmhkbWlfbG9jayk7Ci0KLQlvbWFwX2Rzc19yZWdpc3Rlcl9kcml2ZXIoJmhkbWlfZHJpdmVyKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGhkbWlfcGFuZWxfZXhpdCh2b2lkKQotewotCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZoZG1pX2RyaXZlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfcGFuZWwuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWlfcGFuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNkNWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaV9wYW5lbC5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogaGRtaV9wYW5lbC5jCisgKgorICogSERNSSBsaWJyYXJ5IHN1cHBvcnQgZnVuY3Rpb25zIGZvciBUSSBPTUFQNCBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogQXV0aG9yczoJTXl0aHJpIFAgayA8bXl0aHJpcGtAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBtdXRleCBoZG1pX2xvY2s7Cit9IGhkbWk7CisKKworc3RhdGljIGludCBoZG1pX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfcHJvYmVcbiIpOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwKKwkJCU9NQVBfRFNTX0xDRF9JVlMgfCBPTUFQX0RTU19MQ0RfSUhTOworCisJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gKHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MpezY0MCwgNDgwLCAyNTE3NSwgOTYsIDE2LCA0OCwgMiAsIDExLCAzMX07CisKKwlEU1NEQkcoImhkbWlfcGFuZWxfcHJvYmUgeF9yZXM9ICVkIHlfcmVzID0gJWRcbiIsCisJCWRzc2Rldi0+cGFuZWwudGltaW5ncy54X3JlcywKKwkJZHNzZGV2LT5wYW5lbC50aW1pbmdzLnlfcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRtaV9wYW5lbF9yZW1vdmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCit9CisKK3N0YXRpYyBpbnQgaGRtaV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKwlEU1NEQkcoIkVOVEVSIGhkbWlfcGFuZWxfZW5hYmxlXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwlpZiAocikgeworCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworZXJyOgorCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCisJCW9tYXBkc3NfaGRtaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworCisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgciA9IDA7CisKKwltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCisJb21hcGRzc19oZG1pX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBoZG1pX3BhbmVsX3Jlc3VtZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IHIgPSAwOworCisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwlpZiAocikgeworCQlEU1NFUlIoImZhaWxlZCB0byBwb3dlciBvblxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworZXJyOgorCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwltdXRleF9sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3NldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKKwkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJRFNTREJHKCJoZG1pX3NldF90aW1pbmdzXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOworCW9tYXBkc3NfaGRtaV9kaXNwbGF5X3NldF90aW1pbmcoZHNzZGV2KTsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworfQorCitzdGF0aWMgaW50IGhkbWlfY2hlY2tfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCWludCByID0gMDsKKworCURTU0RCRygiaGRtaV9jaGVja190aW1pbmdzXG4iKTsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9jaGVja190aW1pbmcoZHNzZGV2LCB0aW1pbmdzKTsKKworCW11dGV4X3VubG9jaygmaGRtaS5oZG1pX2xvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGhkbWlfcmVhZF9lZGlkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcjsKKworCW11dGV4X2xvY2soJmhkbWkuaGRtaV9sb2NrKTsKKworCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCXIgPSBvbWFwZHNzX2hkbWlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyID0gb21hcGRzc19oZG1pX3JlYWRfZWRpZChidWYsIGxlbik7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEIHx8CisJCQlkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGJvb2wgaGRtaV9kZXRlY3Qoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCisJbXV0ZXhfbG9jaygmaGRtaS5oZG1pX2xvY2spOworCisJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJciA9IG9tYXBkc3NfaGRtaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCWdvdG8gZXJyOworCX0KKworCXIgPSBvbWFwZHNzX2hkbWlfZGV0ZWN0KCk7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEIHx8CisJCQlkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQorCQlvbWFwZHNzX2hkbWlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZoZG1pLmhkbWlfbG9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgaGRtaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGhkbWlfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBoZG1pX3BhbmVsX3JlbW92ZSwKKwkuZW5hYmxlCQk9IGhkbWlfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaGRtaV9wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gaGRtaV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaGRtaV9wYW5lbF9yZXN1bWUsCisJLmdldF90aW1pbmdzCT0gaGRtaV9nZXRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJPSBoZG1pX3NldF90aW1pbmdzLAorCS5jaGVja190aW1pbmdzCT0gaGRtaV9jaGVja190aW1pbmdzLAorCS5yZWFkX2VkaWQJPSBoZG1pX3JlYWRfZWRpZCwKKwkuZGV0ZWN0CQk9IGhkbWlfZGV0ZWN0LAorCS5kcml2ZXIJCQk9IHsKKwkJLm5hbWUgICA9ICJoZG1pX3BhbmVsIiwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitpbnQgaGRtaV9wYW5lbF9pbml0KHZvaWQpCit7CisJbXV0ZXhfaW5pdCgmaGRtaS5oZG1pX2xvY2spOworCisJb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZoZG1pX2RyaXZlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBoZG1pX3BhbmVsX2V4aXQodm9pZCkKK3sKKwlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmaGRtaV9kcml2ZXIpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKaW5kZXggMTNkNzJkNS4uNmU2Mzg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2RlZmF1bHRfY29sb3Jfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKIAkJCQkJICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1nci0+aW5mby5kZWZhdWx0X2NvbG9yKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlI3hcbiIsIG1nci0+aW5mby5kZWZhdWx0X2NvbG9yKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWFuYWdlcl9kZWZhdWx0X2NvbG9yX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLApAQCAtMTE2LDggKzExNiw5IEBACiAJdTMyIGNvbG9yOwogCWludCByOwogCi0JaWYgKHNzY2FuZihidWYsICIlZCIsICZjb2xvcikgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAmY29sb3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKIApAQCAtMTg0LDcgKzE4NSw3IEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV92YWx1ZV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAogCQkJCQkgICAgY2hhciAqYnVmKQogewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtZ3ItPmluZm8udHJhbnNfa2V5KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlI3hcbiIsIG1nci0+aW5mby50cmFuc19rZXkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3RyYW5zX2tleV92YWx1ZV9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKQEAgLTE5NCw4ICsxOTUsOSBAQAogCXUzMiBrZXlfdmFsdWU7CiAJaW50IHI7CiAKLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmtleV92YWx1ZSkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJciA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAma2V5X3ZhbHVlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKIAltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAKQEAgLTIyMiwxNSArMjI0LDE2IEBACiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87Ci0JaW50IGVuYWJsZTsKKwlib29sIGVuYWJsZTsKIAlpbnQgcjsKIAotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZW5hYmxlKSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJmVuYWJsZSk7CisJaWYgKHIpCisJCXJldHVybiByOwogCiAJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOwogCi0JaW5mby50cmFuc19lbmFibGVkID0gZW5hYmxlID8gdHJ1ZSA6IGZhbHNlOworCWluZm8udHJhbnNfZW5hYmxlZCA9IGVuYWJsZTsKIAogCXIgPSBtZ3ItPnNldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAJaWYgKHIpCkBAIC0yNDYsNyArMjQ5LDEwIEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc2hvdygKIAkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbWdyLT5pbmZvLmFscGhhX2VuYWJsZWQpOworCVdBUk5fT04oIWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZJWEVEX1pPUkRFUikpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCW1nci0+aW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQpOwogfQogCiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc3RvcmUoCkBAIC0yNTQsMTUgKzI2MCwxOCBAQAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87Ci0JaW50IGVuYWJsZTsKKwlib29sIGVuYWJsZTsKIAlpbnQgcjsKIAotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmZW5hYmxlKSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlXQVJOX09OKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpKTsKKworCXIgPSBzdHJ0b2Jvb2woYnVmLCAmZW5hYmxlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKIAltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CiAKLQlpbmZvLmFscGhhX2VuYWJsZWQgPSBlbmFibGUgPyB0cnVlIDogZmFsc2U7CisJaW5mby5wYXJ0aWFsX2FscGhhX2VuYWJsZWQgPSBlbmFibGU7CiAKIAlyID0gbWdyLT5zZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOwogCWlmIChyKQpAQCAtMjg1LDE5ICsyOTQsMTYgQEAKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOwotCWludCB2OwogCWludCByOwogCWJvb2wgZW5hYmxlOwogCiAJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdik7CisJciA9IHN0cnRvYm9vbChidWYsICZlbmFibGUpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWVuYWJsZSA9ICEhdjsKLQogCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKIAogCWlmIChpbmZvLmNwcl9lbmFibGUgPT0gZW5hYmxlKQpAQCAtNTg2LDYgKzU5MiwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKgorCSAqIERvbid0IGFsbG93IGN1cnJlbnRseSBlbmFibGVkIGRpc3BsYXlzIHRvIGhhdmUgdGhlIG92ZXJsYXkgbWFuYWdlcgorCSAqIHB1bGxlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHRoZW0KKwkgKi8KKwlpZiAobWdyLT5kZXZpY2UtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpCisJCXJldHVybiAtRUlOVkFMOworCiAJbWdyLT5kZXZpY2UtPm1hbmFnZXIgPSBOVUxMOwogCW1nci0+ZGV2aWNlID0gTlVMTDsKIAltZ3ItPmRldmljZV9jaGFuZ2VkID0gdHJ1ZTsKQEAgLTgwMSw3ICs4MTQsNyBAQAogewogCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKmM7CiAJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7Ci0Jc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gKm9pLCBuZXdfb2k7CiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gKm1pOwogCXUxNiBvdXR3LCBvdXRoOwogCXUxNiB4LCB5LCB3LCBoOwpAQCAtODE1LDcgKzgyOCw3IEBACiAJb2kgPSAmYy0+aW5mbzsKIAogCWlmICghYy0+ZW5hYmxlZCkgewotCQlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDApOworCQlkaXNwY19vdmxfZW5hYmxlKHBsYW5lLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04NDMsNyArODU2LDcgQEAKIAkJLyogSWYgdGhlIG92ZXJsYXkgaXMgb3V0c2lkZSB0aGUgdXBkYXRlIHJlZ2lvbiwgZGlzYWJsZSBpdCAqLwogCQlpZiAoIXJlY3RhbmdsZV9pbnRlcnNlY3RzKG1jLT54LCBtYy0+eSwgbWMtPncsIG1jLT5oLAogCQkJCQl4LCB5LCBvdXR3LCBvdXRoKSkgewotCQkJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAwKTsKKwkJCWRpc3BjX292bF9lbmFibGUocGxhbmUsIDApOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtOTIxLDM0ICs5MzQsMjcgQEAKIAkJfQogCX0KIAotCXIgPSBkaXNwY19zZXR1cF9wbGFuZShwbGFuZSwKLQkJCXBhZGRyLAotCQkJb2ktPnNjcmVlbl93aWR0aCwKLQkJCXgsIHksCi0JCQl3LCBoLAotCQkJb3V0dywgb3V0aCwKLQkJCW9pLT5jb2xvcl9tb2RlLAotCQkJYy0+aWxhY2UsCi0JCQlvaS0+cm90YXRpb25fdHlwZSwKLQkJCW9pLT5yb3RhdGlvbiwKLQkJCW9pLT5taXJyb3IsCi0JCQlvaS0+Z2xvYmFsX2FscGhhLAotCQkJb2ktPnByZV9tdWx0X2FscGhhLAotCQkJYy0+Y2hhbm5lbCwKLQkJCW9pLT5wX3V2X2FkZHIpOworCW5ld19vaSA9ICpvaTsKIAorCS8qIHVwZGF0ZSBuZXdfb2kgbWVtYmVycyB3aGljaCBjb3VsZCBoYXZlIGJlZW4gcG9zc2libHkgdXBkYXRlZCAqLworCW5ld19vaS5wb3NfeCA9IHg7CisJbmV3X29pLnBvc195ID0geTsKKwluZXdfb2kud2lkdGggPSB3OworCW5ld19vaS5oZWlnaHQgPSBoOworCW5ld19vaS5vdXRfd2lkdGggPSBvdXR3OworCW5ld19vaS5vdXRfaGVpZ2h0ID0gb3V0aDsKKwluZXdfb2kucGFkZHIgPSBwYWRkcjsKKworCXIgPSBkaXNwY19vdmxfc2V0dXAocGxhbmUsICZuZXdfb2ksIGMtPmlsYWNlLCBjLT5jaGFubmVsLAorCQljLT5yZXBsaWNhdGlvbiwgYy0+Zmlmb19sb3csIGMtPmZpZm9faGlnaCk7CiAJaWYgKHIpIHsKIAkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCi0JCURTU0VSUigiZGlzcGNfc2V0dXBfcGxhbmUgZmFpbGVkIGZvciBvdmwgJWRcbiIsIHBsYW5lKTsKLQkJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAwKTsKKwkJRFNTRVJSKCJkaXNwY19vdmxfc2V0dXAgZmFpbGVkIGZvciBvdmwgJWRcbiIsIHBsYW5lKTsKKwkJZGlzcGNfb3ZsX2VuYWJsZShwbGFuZSwgMCk7CiAJCXJldHVybiByOwogCX0KIAotCWRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihwbGFuZSwgYy0+cmVwbGljYXRpb24pOwotCi0JZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKHBsYW5lLCBjLT5maWZvX2xvdywgYy0+Zmlmb19oaWdoKTsKLQotCWRpc3BjX2VuYWJsZV9wbGFuZShwbGFuZSwgMSk7CisJZGlzcGNfb3ZsX2VuYWJsZShwbGFuZSwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2MiwxMyArOTY4LDEzIEBACiAJLyogcGlja2luZyBpbmZvIGZyb20gdGhlIGNhY2hlICovCiAJbWkgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbY2hhbm5lbF0uaW5mbzsKIAotCWRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGNoYW5uZWwsIG1pLT5kZWZhdWx0X2NvbG9yKTsKLQlkaXNwY19zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19rZXlfdHlwZSwgbWktPnRyYW5zX2tleSk7Ci0JZGlzcGNfZW5hYmxlX3RyYW5zX2tleShjaGFubmVsLCBtaS0+dHJhbnNfZW5hYmxlZCk7Ci0JZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGNoYW5uZWwsIG1pLT5hbHBoYV9lbmFibGVkKTsKKwlkaXNwY19tZ3Jfc2V0X2RlZmF1bHRfY29sb3IoY2hhbm5lbCwgbWktPmRlZmF1bHRfY29sb3IpOworCWRpc3BjX21ncl9zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19rZXlfdHlwZSwgbWktPnRyYW5zX2tleSk7CisJZGlzcGNfbWdyX2VuYWJsZV90cmFuc19rZXkoY2hhbm5lbCwgbWktPnRyYW5zX2VuYWJsZWQpOworCWRpc3BjX21ncl9lbmFibGVfYWxwaGFfZml4ZWRfem9yZGVyKGNoYW5uZWwsIG1pLT5wYXJ0aWFsX2FscGhhX2VuYWJsZWQpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7Ci0JCWRpc3BjX2VuYWJsZV9jcHIoY2hhbm5lbCwgbWktPmNwcl9lbmFibGUpOwotCQlkaXNwY19zZXRfY3ByX2NvZWYoY2hhbm5lbCwgJm1pLT5jcHJfY29lZnMpOworCQlkaXNwY19tZ3JfZW5hYmxlX2NwcihjaGFubmVsLCBtaS0+Y3ByX2VuYWJsZSk7CisJCWRpc3BjX21ncl9zZXRfY3ByX2NvZWYoY2hhbm5lbCwgJm1pLT5jcHJfY29lZnMpOwogCX0KIH0KIApAQCAtOTkyLDcgKzk5OCw3IEBACiAJYnVzeSA9IGZhbHNlOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspIHsKLQkJbWdyX2J1c3lbaV0gPSBkaXNwY19nb19idXN5KGkpOworCQltZ3JfYnVzeVtpXSA9IGRpc3BjX21ncl9nb19idXN5KGkpOwogCQltZ3JfZ29baV0gPSBmYWxzZTsKIAl9CiAKQEAgLTEwNTMsNyArMTA1OSw3IEBACiAJCSAqIGFsd2F5cyBiZSB0dXJuZWQgb2ZmIGFmdGVyIGZyYW1lLCBhbmQgbmV3IHNldHRpbmdzIHdpbGwgYmUKIAkJICogdGFrZW4gaW4gdG8gdXNlIGF0IG5leHQgdXBkYXRlICovCiAJCWlmICghbWMtPm1hbnVhbF91cGRhdGUpCi0JCQlkaXNwY19nbyhpKTsKKwkJCWRpc3BjX21ncl9nbyhpKTsKIAl9CiAKIAlpZiAoYnVzeSkKQEAgLTEyNTgsNyArMTI2NCw3IEBACiAJdTMyIGlycV9tYXNrOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCi0JCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKKwkJbWdyX2J1c3lbaV0gPSBkaXNwY19tZ3JfZ29fYnVzeShpKTsKIAogCXNwaW5fbG9jaygmZHNzX2NhY2hlLmxvY2spOwogCkBAIC0xMjgwLDcgKzEyODYsNyBAQAogCiAJLyogcmUtcmVhZCBidXN5IGZsYWdzICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCi0JCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKKwkJbWdyX2J1c3lbaV0gPSBkaXNwY19tZ3JfZ29fYnVzeShpKTsKIAogCS8qIGtlZXAgcnVubmluZyBhcyBsb25nIGFzIHRoZXJlIGFyZSBidXN5IG1hbmFnZXJzLCBzbyB0aGF0CiAJICogd2UgY2FuIGNvbGxlY3Qgb3ZlcmxheS1hcHBsaWVkIGluZm9ybWF0aW9uICovCkBAIC0xMzI2LDExICsxMzMyLDEzIEBACiAKIAkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CiAKLQkJaWYgKCEob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9ESVNQQykpCi0JCQljb250aW51ZTsKLQogCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtvdmwtPmlkXTsKIAorCQlpZiAob3ZsLT5tYW5hZ2VyX2NoYW5nZWQpIHsKKwkJCW92bC0+bWFuYWdlcl9jaGFuZ2VkID0gZmFsc2U7CisJCQlvdmwtPmluZm9fZGlydHkgID0gdHJ1ZTsKKwkJfQorCiAJCWlmICghb3ZlcmxheV9lbmFibGVkKG92bCkpIHsKIAkJCWlmIChvYy0+ZW5hYmxlZCkgewogCQkJCW9jLT5lbmFibGVkID0gZmFsc2U7CkBAIC0xMzc1LDkgKzEzODMsNiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkobWdyLCAmbWFuYWdlcl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKIAotCQlpZiAoIShtZ3ItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykpCi0JCQljb250aW51ZTsKLQogCQltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVttZ3ItPmlkXTsKIAogCQlpZiAobWdyLT5kZXZpY2VfY2hhbmdlZCkgewpAQCAtMTQyMyw5ICsxNDI4LDYgQEAKIAogCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKIAotCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKLQkJCWNvbnRpbnVlOwotCiAJCW9jID0gJmRzc19jYWNoZS5vdmVybGF5X2NhY2hlW292bC0+aWRdOwogCiAJCWlmICghb2MtPmVuYWJsZWQpCkBAIC0xNDMzLDExICsxNDM1LDExIEBACiAKIAkJZHNzZGV2ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7CiAKLQkJc2l6ZSA9IGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUob3ZsLT5pZCk7CisJCXNpemUgPSBkaXNwY19vdmxfZ2V0X2ZpZm9fc2l6ZShvdmwtPmlkKTsKIAkJaWYgKHVzZV9maWZvbWVyZ2UpCiAJCQlzaXplICo9IDM7CiAKLQkJYnVyc3Rfc2l6ZSA9IGRpc3BjX2dldF9idXJzdF9zaXplKG92bC0+aWQpOworCQlidXJzdF9zaXplID0gZGlzcGNfb3ZsX2dldF9idXJzdF9zaXplKG92bC0+aWQpOwogCiAJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CiAJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgpAQCAtMTQ4NCwxMiArMTQ4NiwxNyBAQAogCiBzdGF0aWMgaW50IGRzc19jaGVja19tYW5hZ2VyKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKQogewotCS8qIE9NQVAgc3VwcG9ydHMgb25seSBncmFwaGljcyBzb3VyY2UgdHJhbnNwYXJlbmN5IGNvbG9yIGtleSBhbmQgYWxwaGEKLQkgKiBibGVuZGluZyBzaW11bHRhbmVvdXNseS4gU2VlIFRSTSAxNS40LjIuNC4yLjIgQWxwaGEgTW9kZSAqLwotCi0JaWYgKG1nci0+aW5mby5hbHBoYV9lbmFibGVkICYmIG1nci0+aW5mby50cmFuc19lbmFibGVkICYmCi0JCQltZ3ItPmluZm8udHJhbnNfa2V5X3R5cGUgIT0gT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1QpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BTFBIQV9GSVhFRF9aT1JERVIpKSB7CisJCS8qCisJCSAqIE9NQVAzIHN1cHBvcnRzIG9ubHkgZ3JhcGhpY3Mgc291cmNlIHRyYW5zcGFyZW5jeSBjb2xvciBrZXkKKwkJICogYW5kIGFscGhhIGJsZW5kaW5nIHNpbXVsdGFuZW91c2x5LiBTZWUgVFJNIDE1LjQuMi40LjIuMgorCQkgKiBBbHBoYSBNb2RlCisJCSAqLworCQlpZiAobWdyLT5pbmZvLnBhcnRpYWxfYWxwaGFfZW5hYmxlZCAmJiBtZ3ItPmluZm8udHJhbnNfZW5hYmxlZAorCQkJJiYgbWdyLT5pbmZvLnRyYW5zX2tleV90eXBlICE9CisJCQkJT01BUF9EU1NfQ09MT1JfS0VZX0dGWF9EU1QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MjIsMTMgKzE1MjksMTMgQEAKIAogc3RhdGljIGludCBkc3NfbWdyX2VuYWJsZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncikKIHsKLQlkaXNwY19lbmFibGVfY2hhbm5lbChtZ3ItPmlkLCAxKTsKKwlkaXNwY19tZ3JfZW5hYmxlKG1nci0+aWQsIDEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRzc19tZ3JfZGlzYWJsZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncikKIHsKLQlkaXNwY19lbmFibGVfY2hhbm5lbChtZ3ItPmlkLCAwKTsKKwlkaXNwY19tZ3JfZW5hYmxlKG1nci0+aWQsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xNTgwLDcgKzE1ODcsNyBAQAogCQltZ3ItPmVuYWJsZSA9ICZkc3NfbWdyX2VuYWJsZTsKIAkJbWdyLT5kaXNhYmxlID0gJmRzc19tZ3JfZGlzYWJsZTsKIAotCQltZ3ItPmNhcHMgPSBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQzsKKwkJbWdyLT5jYXBzID0gMDsKIAkJbWdyLT5zdXBwb3J0ZWRfZGlzcGxheXMgPQogCQkJZHNzX2ZlYXRfZ2V0X3N1cHBvcnRlZF9kaXNwbGF5cyhtZ3ItPmlkKTsKIApAQCAtMTU5Nyw0MiArMTYwNCw2IEBACiAJCX0KIAl9CiAKLSNpZmRlZiBMNF9FWEFNUExFCi0JewotCQlpbnQgb21hcF9kc3NfbWdyX2FwcGx5X2w0KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyKQotCQl7Ci0JCQlEU1NEQkcoIm9tYXBfZHNzX21ncl9hcHBseV9sNCglcylcbiIsIG1nci0+bmFtZSk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7Ci0JCW1nciA9IGt6YWxsb2Moc2l6ZW9mKCptZ3IpLCBHRlBfS0VSTkVMKTsKLQotCQlCVUdfT04obWdyID09IE5VTEwpOwotCi0JCW1nci0+bmFtZSA9ICJsNCI7Ci0JCW1nci0+c3VwcG9ydGVkX2Rpc3BsYXlzID0KLQkJCU9NQVBfRElTUExBWV9UWVBFX0RCSSB8IE9NQVBfRElTUExBWV9UWVBFX0RTSTsKLQotCQltZ3ItPnNldF9kZXZpY2UgPSAmb21hcF9kc3Nfc2V0X2RldmljZTsKLQkJbWdyLT51bnNldF9kZXZpY2UgPSAmb21hcF9kc3NfdW5zZXRfZGV2aWNlOwotCQltZ3ItPmFwcGx5ID0gJm9tYXBfZHNzX21ncl9hcHBseV9sNDsKLQkJbWdyLT5zZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9zZXRfaW5mbzsKLQkJbWdyLT5nZXRfbWFuYWdlcl9pbmZvID0gJm9tYXBfZHNzX21ncl9nZXRfaW5mbzsKLQotCQlkc3Nfb3ZlcmxheV9zZXR1cF9sNF9tYW5hZ2VyKG1ncik7Ci0KLQkJb21hcF9kc3NfYWRkX292ZXJsYXlfbWFuYWdlcihtZ3IpOwotCi0JCXIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbWdyLT5rb2JqLCAmbWFuYWdlcl9rdHlwZSwKLQkJCQkmcGRldi0+ZGV2LmtvYmosICJtYW5hZ2VybDQiKTsKLQotCQlpZiAocikKLQkJCURTU0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlXG4iKTsKLQl9Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMKaW5kZXggYzg0MzgwYy4uYWI4ZTQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwpAQCAtMjExLDE2ICsyMTEsMTcgQEAKIHN0YXRpYyBzc2l6ZV90IG92ZXJsYXlfZW5hYmxlZF9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IHNpemUpCiB7Ci0JaW50IHIsIGVuYWJsZTsKKwlpbnQgcjsKKwlib29sIGVuYWJsZTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmZW5hYmxlKTsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJmVuYWJsZSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaW5mby5lbmFibGVkID0gISFlbmFibGU7CisJaW5mby5lbmFibGVkID0gZW5hYmxlOwogCiAJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAlpZiAocikKQEAgLTI0OCw3ICsyNDksNyBAQAogCXU4IGFscGhhOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCi0JaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9HTE9CQUxfQUxQSEEpID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCiAJciA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJmFscGhhKTsKQEAgLTI1NywxNCArMjU4LDcgQEAKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCS8qIFZpZGVvMSBwbGFuZSBkb2VzIG5vdCBzdXBwb3J0IGdsb2JhbCBhbHBoYQotCSAqIHRvIGFsd2F5cyBtYWtlIGl0IDI1NSBjb21wbGV0ZWx5IG9wYXF1ZQotCSAqLwotCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBX1ZJRDEpICYmCi0JCQlvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKLQkJaW5mby5nbG9iYWxfYWxwaGEgPSAyNTU7Ci0JZWxzZQotCQlpbmZvLmdsb2JhbF9hbHBoYSA9IGFscGhhOworCWluZm8uZ2xvYmFsX2FscGhhID0gYWxwaGE7CiAKIAlyID0gb3ZsLT5zZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOwogCWlmIChyKQpAQCAtMjkzLDIwICsyODcsNTIgQEAKIAl1OCBhbHBoYTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAorCWlmICgob3ZsLT5jYXBzICYgT01BUF9EU1NfT1ZMX0NBUF9QUkVfTVVMVF9BTFBIQSkgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyID0ga3N0cnRvdTgoYnVmLCAwLCAmYWxwaGEpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAogCW92bC0+Z2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKIAotCS8qIG9ubHkgR0ZYIGFuZCBWaWRlbzIgcGxhbmUgc3VwcG9ydCBwcmUgYWxwaGEgbXVsdGlwbGllZAotCSAqIHNldCB6ZXJvIGZvciBWaWRlbzEgcGxhbmUKLQkgKi8KLQlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQV9WSUQxKSAmJgotCQlvdmwtPmlkID09IE9NQVBfRFNTX1ZJREVPMSkKLQkJaW5mby5wcmVfbXVsdF9hbHBoYSA9IDA7Ci0JZWxzZQotCQlpbmZvLnByZV9tdWx0X2FscGhhID0gYWxwaGE7CisJaW5mby5wcmVfbXVsdF9hbHBoYSA9IGFscGhhOworCisJciA9IG92bC0+c2V0X292ZXJsYXlfaW5mbyhvdmwsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAob3ZsLT5tYW5hZ2VyKSB7CisJCXIgPSBvdmwtPm1hbmFnZXItPmFwcGx5KG92bC0+bWFuYWdlcik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfem9yZGVyX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG92bC0+aW5mby56b3JkZXIpOworfQorCitzdGF0aWMgc3NpemVfdCBvdmVybGF5X3pvcmRlcl9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHI7CisJdTggem9yZGVyOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJaWYgKChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0ga3N0cnRvdTgoYnVmLCAwLCAmem9yZGVyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlvdmwtPmdldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisKKwlpbmZvLnpvcmRlciA9IHpvcmRlcjsKIAogCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CiAJaWYgKHIpCkBAIC0zNDcsNiArMzczLDggQEAKIHN0YXRpYyBPVkVSTEFZX0FUVFIocHJlX211bHRfYWxwaGEsIFNfSVJVR098U19JV1VTUiwKIAkJb3ZlcmxheV9wcmVfbXVsdF9hbHBoYV9zaG93LAogCQlvdmVybGF5X3ByZV9tdWx0X2FscGhhX3N0b3JlKTsKK3N0YXRpYyBPVkVSTEFZX0FUVFIoem9yZGVyLCBTX0lSVUdPfFNfSVdVU1IsCisJCW92ZXJsYXlfem9yZGVyX3Nob3csIG92ZXJsYXlfem9yZGVyX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm92ZXJsYXlfc3lzZnNfYXR0cnNbXSA9IHsKIAkmb3ZlcmxheV9hdHRyX25hbWUuYXR0ciwKQEAgLTM1OCw2ICszODYsNyBAQAogCSZvdmVybGF5X2F0dHJfZW5hYmxlZC5hdHRyLAogCSZvdmVybGF5X2F0dHJfZ2xvYmFsX2FscGhhLmF0dHIsCiAJJm92ZXJsYXlfYXR0cl9wcmVfbXVsdF9hbHBoYS5hdHRyLAorCSZvdmVybGF5X2F0dHJfem9yZGVyLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtNDA3LDYgKzQzNiw3IEBACiAJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICppbmZvOwogCXUxNiBvdXR3LCBvdXRoOwogCXUxNiBkdywgZGg7CisJaW50IGk7CiAKIAlpZiAoIWRzc2RldikKIAkJcmV0dXJuIDA7CkBAIC00NjIsNiArNDkyLDMxIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX1pPUkRFUikgeworCQlpZiAoaW5mby0+em9yZGVyIDwgMCB8fCBpbmZvLT56b3JkZXIgPiAzKSB7CisJCQlEU1NFUlIoInpvcmRlciBvdXQgb2YgcmFuZ2U6ICVkXG4iLAorCQkJCWluZm8tPnpvcmRlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKgorCQkgKiBDaGVjayB0aGF0IHpvcmRlciBkb2Vzbid0IG1hdGNoIHdpdGggem9yZGVyIG9mIGFueSBvdGhlcgorCQkgKiBvdmVybGF5IHdoaWNoIGlzIGVuYWJsZWQgYW5kIGlzIGFsc28gY29ubmVjdGVkIHRvIHRoZSBzYW1lCisJCSAqIG1hbmFnZXIKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7IGkrKykgeworCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqdG1wX292bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KGkpOworCisJCQlpZiAodG1wX292bC0+aWQgIT0gb3ZsLT5pZCAmJgorCQkJCQl0bXBfb3ZsLT5tYW5hZ2VyID09IG92bC0+bWFuYWdlciAmJgorCQkJCQl0bXBfb3ZsLT5pbmZvLmVuYWJsZWQgPT0gdHJ1ZSAmJgorCQkJCQl0bXBfb3ZsLT5pbmZvLnpvcmRlciA9PSBpbmZvLT56b3JkZXIpIHsKKwkJCQlEU1NFUlIoIiVzIGFuZCAlcyBoYXZlIHNhbWUgem9yZGVyOiAlZFxuIiwKKwkJCQkJb3ZsLT5uYW1lLCB0bXBfb3ZsLT5uYW1lLCBpbmZvLT56b3JkZXIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNiw2ICs1NzEsNyBAQAogCX0KIAogCW92bC0+bWFuYWdlciA9IG1ncjsKKwlvdmwtPm1hbmFnZXJfY2hhbmdlZCA9IHRydWU7CiAKIAkvKiBYWFg6IFdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBvbiBhIERTSSBtYW51YWwgdXBkYXRlIGRpc3BsYXksIGFuZAogCSAqIHRoZSBvdmVybGF5IGlzIGZpcnN0IGRpc2FibGVkLCB0aGVuIG1vdmVkIHRvIHR2LCBhbmQgZW5hYmxlZCwgd2UKQEAgLTUyOSwxNSArNTg1LDEyIEBACiAJICogVXNlcnNwYWNlIHdvcmthcm91bmQgZm9yIHRoaXMgaXMgdG8gdXBkYXRlIHRoZSBMQ0QgYWZ0ZXIgZGlzYWJsaW5nCiAJICogdGhlIG92ZXJsYXksIGJ1dCBiZWZvcmUgbW92aW5nIHRoZSBvdmVybGF5IHRvIFRWLgogCSAqLwotCWRpc3BjX3NldF9jaGFubmVsX291dChvdmwtPmlkLCBtZ3ItPmlkKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG9tYXBfZHNzX3Vuc2V0X21hbmFnZXIoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsKQogewotCWludCByOwotCiAJaWYgKCFvdmwtPm1hbmFnZXIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gZGV0YWNoIG92ZXJsYXk6IG1hbmFnZXIgbm90IHNldFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTQ4LDExICs2MDEsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyID0gb3ZsLT53YWl0X2Zvcl9nbyhvdmwpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQogCW92bC0+bWFuYWdlciA9IE5VTEw7CisJb3ZsLT5tYW5hZ2VyX2NoYW5nZWQgPSB0cnVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTgsMjIgKzY2OCwyOSBAQAogCQljYXNlIDA6CiAJCQlvdmwtPm5hbWUgPSAiZ2Z4IjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19HRlg7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCW92bC0+bmFtZSA9ICJ2aWQxIjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzE7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFIHwKLQkJCQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPQorCQkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSA/IDMgOiAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCW92bC0+bmFtZSA9ICJ2aWQyIjsKIAkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzI7Ci0JCQlvdmwtPmNhcHMgPSBPTUFQX0RTU19PVkxfQ0FQX1NDQUxFIHwKLQkJCQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDOwogCQkJb3ZsLT5pbmZvLmdsb2JhbF9hbHBoYSA9IDI1NTsKKwkJCW92bC0+aW5mby56b3JkZXIgPQorCQkJCWRzc19oYXNfZmVhdHVyZShGRUFUX0FMUEhBX0ZSRUVfWk9SREVSKSA/IDIgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW92bC0+bmFtZSA9ICJ2aWQzIjsKKwkJCW92bC0+aWQgPSBPTUFQX0RTU19WSURFTzM7CisJCQlvdmwtPmluZm8uZ2xvYmFsX2FscGhhID0gMjU1OworCQkJb3ZsLT5pbmZvLnpvcmRlciA9CisJCQkJZHNzX2hhc19mZWF0dXJlKEZFQVRfQUxQSEFfRlJFRV9aT1JERVIpID8gMSA6IDA7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NDMsNiArNzAwLDcgQEAKIAkJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvID0gJmRzc19vdmxfZ2V0X292ZXJsYXlfaW5mbzsKIAkJb3ZsLT53YWl0X2Zvcl9nbyA9ICZkc3Nfb3ZsX3dhaXRfZm9yX2dvOwogCisJCW92bC0+Y2FwcyA9IGRzc19mZWF0X2dldF9vdmVybGF5X2NhcHMob3ZsLT5pZCk7CiAJCW92bC0+c3VwcG9ydGVkX21vZGVzID0KIAkJCWRzc19mZWF0X2dldF9zdXBwb3J0ZWRfY29sb3JfbW9kZXMob3ZsLT5pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYwppbmRleCAzOWY0YzU5Li4xMTMwYzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMzA5LDkgKzMxMCw5IEBACiAKIAlEU1NEQkcoInJmYmlfdHJhbnNmZXJfYXJlYSAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CiAKLQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgd2lkdGgsIGhlaWdodCk7CisJZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCB3aWR0aCwgaGVpZ2h0KTsKIAotCWRpc3BjX2VuYWJsZV9jaGFubmVsKGRzc2Rldi0+bWFuYWdlci0+aWQsIHRydWUpOworCWRpc3BjX21ncl9lbmFibGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdHJ1ZSk7CiAKIAlyZmJpLmZyYW1lZG9uZV9jYWxsYmFjayA9IGNhbGxiYWNrOwogCXJmYmkuZnJhbWVkb25lX2NhbGxiYWNrX2RhdGEgPSBkYXRhOwpAQCAtNzgzLDEwICs3ODQsOCBAQAogCWlmICgqdyA9PSAwIHx8ICpoID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGRzc2Rldi0+bWFuYWdlci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSB7Ci0JCWRzc19zZXR1cF9wYXJ0aWFsX3BsYW5lcyhkc3NkZXYsIHgsIHksIHcsIGgsIHRydWUpOwotCQlkaXNwY19zZXRfbGNkX3NpemUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgKncsICpoKTsKLQl9CisJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgeCwgeSwgdywgaCwgdHJ1ZSk7CisJZGlzcGNfbWdyX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCAqdywgKmgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03OTYsMjIgKzc5NSw3IEBACiAJCXUxNiB4LCB1MTYgeSwgdTE2IHcsIHUxNiBoLAogCQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKGRzc2Rldi0+bWFuYWdlci0+Y2FwcyAmIE9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDKSB7Ci0JCXJmYmlfdHJhbnNmZXJfYXJlYShkc3NkZXYsIHcsIGgsIGNhbGxiYWNrLCBkYXRhKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7Ci0JCXZvaWQgX19pb21lbSAqYWRkcjsKLQkJaW50IHNjcl93aWR0aDsKLQotCQlvdmwgPSBkc3NkZXYtPm1hbmFnZXItPm92ZXJsYXlzWzBdOwotCQlzY3Jfd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOwotCQlhZGRyID0gb3ZsLT5pbmZvLnZhZGRyOwotCi0JCW9tYXBfcmZiaV93cml0ZV9waXhlbHMoYWRkciwgc2NyX3dpZHRoLCB4LCB5LCB3LCBoKTsKLQotCQljYWxsYmFjayhkYXRhKTsKLQl9Ci0KKwlyZmJpX3RyYW5zZmVyX2FyZWEoZHNzZGV2LCB3LCBoLCBjYWxsYmFjaywgZGF0YSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBfcmZiaV91cGRhdGUpOwpAQCAtODYwLDYgKzg0NCwxMSBAQAogewogCWludCByOwogCisJaWYgKGRzc2Rldi0+bWFuYWdlciA9PSBOVUxMKSB7CisJCURTU0VSUigiZmFpbGVkIHRvIGVuYWJsZSBkaXNwbGF5OiBubyBtYW5hZ2VyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJciA9IHJmYmlfcnVudGltZV9nZXQoKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CkBAIC04NzcsMTMgKzg2NiwxMyBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKKwlkaXNwY19tZ3Jfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKIAkJCU9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCk7CiAKLQlkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwKLQkJCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9SRkJJKTsKKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9SRkJJKTsKKwlkaXNwY19tZ3JfZW5hYmxlX3N0YWxsbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLCB0cnVlKTsKIAotCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CisJZGlzcGNfbWdyX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CiAKIAlyZmJpX2NvbmZpZ3VyZShkc3NkZXYtPnBoeS5yZmJpLmNoYW5uZWwsCiAJCQkgICAgICAgZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUsCkBAIC05NTIsMTAgKzk0MSw3IEBACiAKIAltc2xlZXAoMTApOwogCi0JaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwMzYzMCgpKQotCQljbGsgPSBkc3NfZ2V0X2ljaygpOwotCWVsc2UKLQkJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNrIik7CisJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNrIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IGlja1xuIik7CiAJCXIgPSBQVFJfRVJSKGNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCmluZGV4IDNhNjg4YzguLjQwMzA1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlICJkc3MuaCIKQEAgLTM1LDEzICszNiwxMyBAQAogc3RhdGljIHZvaWQgc2RpX2Jhc2ljX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogCiB7Ci0JZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCi0JCQlPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKKwlkaXNwY19tZ3Jfc2V0X2lvX3BhZF9tb2RlKERTU19JT19QQURfTU9ERV9CWVBBU1MpOworCWRpc3BjX21ncl9lbmFibGVfc3RhbGxtb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsIGZhbHNlKTsKIAotCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJZGlzcGNfbWdyX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCiAJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwogCi0JZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsIDI0KTsKKwlkaXNwY19tZ3Jfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsIDI0KTsKIAlkaXNwY19sY2RfZW5hYmxlX3NpZ25hbF9wb2xhcml0eSgxKTsKIH0KIApAQCAtNTUsNiArNTYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIHBjazsKIAlpbnQgcjsKIAorCWlmIChkc3NkZXYtPm1hbmFnZXIgPT0gTlVMTCkgeworCQlEU1NFUlIoImZhaWxlZCB0byBlbmFibGUgZGlzcGxheTogbm8gbWFuYWdlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwpAQCAtNzgsNyArODQsNyBAQAogCS8qIDE1LjUuOS4xLjIgKi8KIAlkc3NkZXYtPnBhbmVsLmNvbmZpZyB8PSBPTUFQX0RTU19MQ0RfUkYgfCBPTUFQX0RTU19MQ0RfT05PRkY7CiAKLQlkaXNwY19zZXRfcG9sX2ZyZXEoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgZHNzZGV2LT5wYW5lbC5jb25maWcsCisJZGlzcGNfbWdyX3NldF9wb2xfZnJlcShkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPnBhbmVsLmNvbmZpZywKIAkJCWRzc2Rldi0+cGFuZWwuYWNiaSwgZHNzZGV2LT5wYW5lbC5hY2IpOwogCiAJciA9IGRzc19jYWxjX2Nsb2NrX2RpdigxLCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCkBAIC0xMDEsMTMgKzEwNywxMyBAQAogCX0KIAogCi0JZGlzcGNfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsIHQpOworCWRpc3BjX21ncl9zZXRfbGNkX3RpbWluZ3MoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdCk7CiAKIAlyID0gZHNzX3NldF9jbG9ja19kaXYoJmRzc19jaW5mbyk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyX3NldF9kc3NfY2xvY2tfZGl2OwogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfbWdyX3NldF9jbG9ja19kaXYoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgJmRpc3BjX2NpbmZvKTsKIAlpZiAocikKIAkJZ290byBlcnJfc2V0X2Rpc3BjX2Nsb2NrX2RpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaS5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzQ0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiB0aV9oZG1pLmgKKyAqCisgKiBIRE1JIGRyaXZlciBkZWZpbml0aW9uIGZvciBUSSBPTUFQNCwgRE04MXh4LCBETTM4eHggIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX1RJX0hETUlfSAorI2RlZmluZSBfVElfSERNSV9ICisKK3N0cnVjdCBoZG1pX2lwX2RhdGE7CisKK2VudW0gaGRtaV9wbGxfcHdyIHsKKwlIRE1JX1BMTFBXUkNNRF9BTExPRkYgPSAwLAorCUhETUlfUExMUFdSQ01EX1BMTE9OTFkgPSAxLAorCUhETUlfUExMUFdSQ01EX0JPVEhPTl9BTExDTEtTID0gMiwKKwlIRE1JX1BMTFBXUkNNRF9CT1RIT05fTk9QSFlDTEsgPSAzCit9OworCitlbnVtIGhkbWlfY29yZV9oZG1pX2R2aSB7CisJSERNSV9EVkkgPSAwLAorCUhETUlfSERNSSA9IDEKK307CisKK2VudW0gaGRtaV9jbGtfcmVmc2VsIHsKKwlIRE1JX1JFRlNFTF9QQ0xLID0gMCwKKwlIRE1JX1JFRlNFTF9SRUYxID0gMSwKKwlIRE1JX1JFRlNFTF9SRUYyID0gMiwKKwlIRE1JX1JFRlNFTF9TWVNDTEsgPSAzCit9OworCitzdHJ1Y3QgaGRtaV92aWRlb190aW1pbmdzIHsKKwl1MTYgeF9yZXM7CisJdTE2IHlfcmVzOworCS8qIFVuaXQ6IEtIeiAqLworCXUzMiBwaXhlbF9jbG9jazsKKwl1MTYgaHN3OworCXUxNiBoZnA7CisJdTE2IGhicDsKKwl1MTYgdnN3OworCXUxNiB2ZnA7CisJdTE2IHZicDsKK307CisKKy8qIEhETUkgdGltaW5nIHN0cnVjdHVyZSAqLworc3RydWN0IGhkbWlfdGltaW5ncyB7CisJc3RydWN0IGhkbWlfdmlkZW9fdGltaW5ncyB0aW1pbmdzOworCWludCB2c3luY19wb2w7CisJaW50IGhzeW5jX3BvbDsKK307CisKK3N0cnVjdCBoZG1pX2NtIHsKKwlpbnQJY29kZTsKKwlpbnQJbW9kZTsKK307CisKK3N0cnVjdCBoZG1pX2NvbmZpZyB7CisJc3RydWN0IGhkbWlfdGltaW5ncyB0aW1pbmdzOworCXUxNglpbnRlcmxhY2U7CisJc3RydWN0IGhkbWlfY20gY207Cit9OworCisvKiBIRE1JIFBMTCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBoZG1pX3BsbF9pbmZvIHsKKwl1MTYgcmVnbjsKKwl1MTYgcmVnbTsKKwl1MzIgcmVnbWY7CisJdTE2IHJlZ20yOworCXUxNiByZWdzZDsKKwl1MTYgZGNvZnJlcTsKKwllbnVtIGhkbWlfY2xrX3JlZnNlbCByZWZzZWw7Cit9OworCitzdHJ1Y3QgdGlfaGRtaV9pcF9vcHMgeworCisJdm9pZCAoKnZpZGVvX2NvbmZpZ3VyZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwlpbnQgKCpwaHlfZW5hYmxlKShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKKworCXZvaWQgKCpwaHlfZGlzYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwlpbnQgKCpyZWFkX2VkaWQpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHU4ICplZGlkLCBpbnQgbGVuKTsKKworCWJvb2wgKCpkZXRlY3QpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOworCisJaW50ICgqcGxsX2VuYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7CisKKwl2b2lkICgqcGxsX2Rpc2FibGUpKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOworCisJdm9pZCAoKnZpZGVvX2VuYWJsZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgYm9vbCBzdGFydCk7CisKKwl2b2lkICgqZHVtcF93cmFwcGVyKShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCisJdm9pZCAoKmR1bXBfY29yZSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworCXZvaWQgKCpkdW1wX3BsbCkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworCXZvaWQgKCpkdW1wX3BoeSkoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKTsKKworfTsKKworc3RydWN0IGhkbWlfaXBfZGF0YSB7CisJdm9pZCBfX2lvbWVtCSpiYXNlX3dwOwkvKiBIRE1JIHdyYXBwZXIgKi8KKwl1bnNpZ25lZCBsb25nCWNvcmVfc3lzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCWNvcmVfYXZfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJcGxsX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCXBoeV9vZmZzZXQ7CisJY29uc3Qgc3RydWN0IHRpX2hkbWlfaXBfb3BzICpvcHM7CisJc3RydWN0IGhkbWlfY29uZmlnIGNmZzsKKwlzdHJ1Y3QgaGRtaV9wbGxfaW5mbyBwbGxfZGF0YTsKK307CitpbnQgdGlfaGRtaV80eHh4X3BoeV9lbmFibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF9waHlfZGlzYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKK2ludCB0aV9oZG1pXzR4eHhfcmVhZF9lZGlkKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHU4ICplZGlkLCBpbnQgbGVuKTsKK2Jvb2wgdGlfaGRtaV80eHh4X2RldGVjdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKTsKK3ZvaWQgdGlfaGRtaV80eHh4X3dwX3ZpZGVvX3N0YXJ0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIGJvb2wgc3RhcnQpOworaW50IHRpX2hkbWlfNHh4eF9wbGxfZW5hYmxlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpOwordm9pZCB0aV9oZG1pXzR4eHhfcGxsX2Rpc2FibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF9iYXNpY19jb25maWd1cmUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSk7Cit2b2lkIHRpX2hkbWlfNHh4eF93cF9kdW1wKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcyk7Cit2b2lkIHRpX2hkbWlfNHh4eF9wbGxfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwordm9pZCB0aV9oZG1pXzR4eHhfY29yZV9kdW1wKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsIHN0cnVjdCBzZXFfZmlsZSAqcyk7Cit2b2lkIHRpX2hkbWlfNHh4eF9waHlfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdGlfaGRtaV80eHh4X2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyoKKyAqIHRpX2hkbWlfNHh4eF9pcC5jCisgKgorICogSERNSSBUSTgxeHgsIFRJMzh4eCwgVEkgT01BUDQgZXRjIElQIGRyaXZlciBMaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIEF1dGhvcnM6IFlvbmcgWmhpCisgKglNeXRocmkgcGsgPG15dGhyaXBrQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSAidGlfaGRtaV80eHh4X2lwLmgiCisjaW5jbHVkZSAiZHNzLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3dyaXRlX3JlZyh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJCQljb25zdCB1MTYgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGJhc2VfYWRkciArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGhkbWlfcmVhZF9yZWcodm9pZCBfX2lvbWVtICpiYXNlX2FkZHIsCisJCQkJY29uc3QgdTE2IGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZV9hZGRyICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmhkbWlfd3BfYmFzZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXJldHVybiBpcF9kYXRhLT5iYXNlX3dwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaGRtaV9waHlfYmFzZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXJldHVybiBpcF9kYXRhLT5iYXNlX3dwICsgaXBfZGF0YS0+cGh5X29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmhkbWlfcGxsX2Jhc2Uoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlyZXR1cm4gaXBfZGF0YS0+YmFzZV93cCArIGlwX2RhdGEtPnBsbF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpoZG1pX2F2X2Jhc2Uoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlyZXR1cm4gaXBfZGF0YS0+YmFzZV93cCArIGlwX2RhdGEtPmNvcmVfYXZfb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaGRtaV9jb3JlX3N5c19iYXNlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJcmV0dXJuIGlwX2RhdGEtPmJhc2Vfd3AgKyBpcF9kYXRhLT5jb3JlX3N5c19vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJCQljb25zdCB1MTYgaWR4LAorCQkJCWludCBiMiwgaW50IGIxLCB1MzIgdmFsKQoreworCXUzMiB0ID0gMDsKKwl3aGlsZSAodmFsICE9IFJFR19HRVQoYmFzZV9hZGRyLCBpZHgsIGIyLCBiMSkpIHsKKwkJdWRlbGF5KDEpOworCQlpZiAodCsrID4gMTAwMDApCisJCQlyZXR1cm4gIXZhbDsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBoZG1pX3BsbF9pbml0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJdTMyIHI7CisJdm9pZCBfX2lvbWVtICpwbGxfYmFzZSA9IGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSk7CisJc3RydWN0IGhkbWlfcGxsX2luZm8gKmZtdCA9ICZpcF9kYXRhLT5wbGxfZGF0YTsKKworCS8qIFBMTCBzdGFydCBhbHdheXMgdXNlIG1hbnVhbCBtb2RlICovCisJUkVHX0ZMRF9NT0QocGxsX2Jhc2UsIFBMTENUUkxfUExMX0NPTlRST0wsIDB4MCwgMCwgMCk7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcxKTsKKwlyID0gRkxEX01PRChyLCBmbXQtPnJlZ20sIDIwLCA5KTsgLyogQ0ZHMV9QTExfUkVHTSAqLworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbiAtIDEsIDgsIDEpOyAgLyogQ0ZHMV9QTExfUkVHTiAqLworCisJaGRtaV93cml0ZV9yZWcocGxsX2Jhc2UsIFBMTENUUkxfQ0ZHMSwgcik7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyKTsKKworCXIgPSBGTERfTU9EKHIsIDB4MCwgMTIsIDEyKTsgLyogUExMX0hJR0hGUkVRIGRpdmlkZSBieSAyICovCisJciA9IEZMRF9NT0QociwgMHgxLCAxMywgMTMpOyAvKiBQTExfUkVGRU4gKi8KKwlyID0gRkxEX01PRChyLCAweDAsIDE0LCAxNCk7IC8qIFBIWV9DTEtJTkVOIGRlLWFzc2VydCBkdXJpbmcgbG9ja2luZyAqLworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVmc2VsLCAyMiwgMjEpOyAvKiBSRUZTRUwgKi8KKworCWlmIChmbXQtPmRjb2ZyZXEpIHsKKwkJLyogZGl2aWRlciBwcm9ncmFtbWluZyBmb3IgZnJlcXVlbmN5IGJleW9uZCAxMDAwTWh6ICovCisJCVJFR19GTERfTU9EKHBsbF9iYXNlLCBQTExDVFJMX0NGRzMsIGZtdC0+cmVnc2QsIDE3LCAxMCk7CisJCXIgPSBGTERfTU9EKHIsIDB4NCwgMywgMSk7IC8qIDEwMDBNSHogYW5kIDIwMDBNSHogKi8KKwl9IGVsc2UgeworCQlyID0gRkxEX01PRChyLCAweDIsIDMsIDEpOyAvKiA1MDBNSHogYW5kIDEwMDBNSHogKi8KKwl9CisKKwloZG1pX3dyaXRlX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyLCByKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKHBsbF9iYXNlLCBQTExDVFJMX0NGRzQpOworCXIgPSBGTERfTU9EKHIsIGZtdC0+cmVnbTIsIDI0LCAxOCk7CisJciA9IEZMRF9NT0QociwgZm10LT5yZWdtZiwgMTcsIDApOworCisJaGRtaV93cml0ZV9yZWcocGxsX2Jhc2UsIFBMTENUUkxfQ0ZHNCwgcik7CisKKwkvKiBnbyBub3cgKi8KKwlSRUdfRkxEX01PRChwbGxfYmFzZSwgUExMQ1RSTF9QTExfR08sIDB4MSwgMCwgMCk7CisKKwkvKiB3YWl0IGZvciBiaXQgY2hhbmdlICovCisJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShwbGxfYmFzZSwgUExMQ1RSTF9QTExfR08sCisJCQkJCQkJMCwgMCwgMSkgIT0gMSkgeworCQlwcl9lcnIoIlBMTCBHTyBiaXQgbm90IHNldFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIFdhaXQgdGlsbCB0aGUgbG9jayBiaXQgaXMgc2V0IGluIFBMTCBzdGF0dXMgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKHBsbF9iYXNlLAorCQkJCVBMTENUUkxfUExMX1NUQVRVUywgMSwgMSwgMSkgIT0gMSkgeworCQlwcl9lcnIoImNhbm5vdCBsb2NrIFBMTFxuIik7CisJCXByX2VycigiQ0ZHMSAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcxKSk7CisJCXByX2VycigiQ0ZHMiAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkcyKSk7CisJCXByX2VycigiQ0ZHNCAweCV4XG4iLAorCQkJaGRtaV9yZWFkX3JlZyhwbGxfYmFzZSwgUExMQ1RSTF9DRkc0KSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXByX2RlYnVnKCJQTEwgbG9ja2VkIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUEhZX1BXUl9DTUQgKi8KK3N0YXRpYyBpbnQgaGRtaV9zZXRfcGh5X3B3cihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBlbnVtIGhkbWlfcGh5X3B3ciB2YWwpCit7CisJLyogQ29tbWFuZCBmb3IgcG93ZXIgY29udHJvbCBvZiBIRE1JIFBIWSAqLworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9QV1JfQ1RSTCwgdmFsLCA3LCA2KTsKKworCS8qIFN0YXR1cyBvZiB0aGUgcG93ZXIgY29udHJvbCBvZiBIRE1JIFBIWSAqLworCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCUhETUlfV1BfUFdSX0NUUkwsIDUsIDQsIHZhbCkgIT0gdmFsKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHNldCBQSFkgcG93ZXIgbW9kZSB0byAlZFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFBMTF9QV1JfQ01EICovCitzdGF0aWMgaW50IGhkbWlfc2V0X3BsbF9wd3Ioc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgZW51bSBoZG1pX3BsbF9wd3IgdmFsKQoreworCS8qIENvbW1hbmQgZm9yIHBvd2VyIGNvbnRyb2wgb2YgSERNSSBQTEwgKi8KKwlSRUdfRkxEX01PRChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfUFdSX0NUUkwsIHZhbCwgMywgMik7CisKKwkvKiB3YWl0IHRpbGwgUEhZX1BXUl9TVEFUVVMgaXMgc2V0ICovCisJaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfUFdSX0NUUkwsCisJCQkJCQkxLCAwLCB2YWwpICE9IHZhbCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgUExMX1BXUl9TVEFUVVNcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3BsbF9yZXNldChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCS8qIFNZU1JFU0VUICBjb250cm9sbGVkIGJ5IHBvd2VyIEZTTSAqLworCVJFR19GTERfTU9EKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIFBMTENUUkxfUExMX0NPTlRST0wsIDB4MCwgMywgMyk7CisKKwkvKiBSRUFEIDB4MCByZXNldCBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoaGRtaV9wbGxfYmFzZShpcF9kYXRhKSwKKwkJCQlQTExDVFJMX1BMTF9TVEFUVVMsIDAsIDAsIDEpICE9IDEpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3lzcmVzZXQgUExMXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0aV9oZG1pXzR4eHhfcGxsX2VuYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXUxNiByID0gMDsKKworCXIgPSBoZG1pX3NldF9wbGxfcHdyKGlwX2RhdGEsIEhETUlfUExMUFdSQ01EX0FMTE9GRik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGhkbWlfc2V0X3BsbF9wd3IoaXBfZGF0YSwgSERNSV9QTExQV1JDTURfQk9USE9OX0FMTENMS1MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBoZG1pX3BsbF9yZXNldChpcF9kYXRhKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaGRtaV9wbGxfaW5pdChpcF9kYXRhKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfcGxsX2Rpc2FibGUoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwloZG1pX3NldF9wbGxfcHdyKGlwX2RhdGEsIEhETUlfUExMUFdSQ01EX0FMTE9GRik7Cit9CisKK2ludCB0aV9oZG1pXzR4eHhfcGh5X2VuYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXUxNiByID0gMDsKKwl2b2lkIF9faW9tZW0gKnBoeV9iYXNlID0gaGRtaV9waHlfYmFzZShpcF9kYXRhKTsKKworCXIgPSBoZG1pX3NldF9waHlfcHdyKGlwX2RhdGEsIEhETUlfUEhZUFdSQ01EX0xET09OKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gaGRtaV9zZXRfcGh5X3B3cihpcF9kYXRhLCBIRE1JX1BIWVBXUkNNRF9UWE9OKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwkvKgorCSAqIFJlYWQgYWRkcmVzcyAwIGluIG9yZGVyIHRvIGdldCB0aGUgU0NQIHJlc2V0IGRvbmUgY29tcGxldGVkCisJICogRHVtbXkgYWNjZXNzIHBlcmZvcm1lZCB0byBtYWtlIHN1cmUgcmVzZXQgaXMgZG9uZQorCSAqLworCWhkbWlfcmVhZF9yZWcocGh5X2Jhc2UsIEhETUlfVFhQSFlfVFhfQ1RSTCk7CisKKwkvKgorCSAqIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDAgdG8gY29uZmlndXJlIHRoZSBjbG9jaworCSAqIHVzZSBIRkJJVENMSyB3cml0ZSBIRE1JX1RYUEhZX1RYX0NPTlRST0xfRlJFUU9VVCBmaWVsZAorCSAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1RYX0NUUkwsIDB4MSwgMzEsIDMwKTsKKworCS8qIFdyaXRlIHRvIHBoeSBhZGRyZXNzIDEgdG8gc3RhcnQgSERNSSBsaW5lIChUWFZBTElEIGFuZCBUTURTQ0xLRU4pICovCisJaGRtaV93cml0ZV9yZWcocGh5X2Jhc2UsIEhETUlfVFhQSFlfRElHSVRBTF9DVFJMLCAweEYwMDAwMDAwKTsKKworCS8qIFNldHVwIG1heCBMRE8gdm9sdGFnZSAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1BPV0VSX0NUUkwsIDB4QiwgMywgMCk7CisKKwkvKiBXcml0ZSB0byBwaHkgYWRkcmVzcyAzIHRvIGNoYW5nZSB0aGUgcG9sYXJpdHkgY29udHJvbCAqLworCVJFR19GTERfTU9EKHBoeV9iYXNlLCBIRE1JX1RYUEhZX1BBRF9DRkdfQ1RSTCwgMHgxLCAyNywgMjcpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdGlfaGRtaV80eHh4X3BoeV9kaXNhYmxlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJaGRtaV9zZXRfcGh5X3B3cihpcF9kYXRhLCBIRE1JX1BIWVBXUkNNRF9PRkYpOworfQorCitzdGF0aWMgaW50IGhkbWlfY29yZV9kZGNfaW5pdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKTsKKworCS8qIFR1cm4gb24gQ0xLIGZvciBEREMgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfQVZfRFBELCAweDcsIDIsIDApOworCisJLyogSU5fUFJPRyAqLworCWlmIChSRUdfR0VUKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLCA0LCA0KSA9PSAxKSB7CisJCS8qIEFib3J0IHRyYW5zYWN0aW9uICovCisJCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQ01ELCAweGYsIDMsIDApOworCQkvKiBJTl9QUk9HICovCisJCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoYmFzZSwgSERNSV9DT1JFX0REQ19TVEFUVVMsCisJCQkJCTQsIDQsIDApICE9IDApIHsKKwkJCURTU0VSUigiVGltZW91dCBhYm9ydGluZyBEREMgdHJhbnNhY3Rpb25cbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwkvKiBDbGsgU0NMIERldmljZXMgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHhBLCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IHN0YXJ0aW5nIFNDTCBjbG9ja1xuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIENsZWFyIEZJRk8gKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHg5LCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IGNsZWFyaW5nIEREQyBmaWZvXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9jb3JlX2RkY19lZGlkKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXU4ICpwZWRpZCwgaW50IGV4dCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBoZG1pX2NvcmVfc3lzX2Jhc2UoaXBfZGF0YSk7CisJdTMyIGk7CisJY2hhciBjaGVja3N1bTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0lOX1BST0cgKi8KKwlpZiAoaGRtaV93YWl0X2Zvcl9iaXRfY2hhbmdlKGJhc2UsIEhETUlfQ09SRV9ERENfU1RBVFVTLAorCQkJCTQsIDQsIDApICE9IDApIHsKKwkJRFNTRVJSKCJUaW1lb3V0IHdhaXRpbmcgRERDIHRvIGJlIHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJaWYgKGV4dCAlIDIgIT0gMCkKKwkJb2Zmc2V0ID0gMHg4MDsKKworCS8qIExvYWQgU2VnbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisJUkVHX0ZMRF9NT0QoYmFzZSwgSERNSV9DT1JFX0REQ19TRUdNLCBleHQgLyAyLCA3LCAwKTsKKworCS8qIExvYWQgU2xhdmUgQWRkcmVzcyBSZWdpc3RlciAqLworCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQUREUiwgMHhBMCA+PiAxLCA3LCAxKTsKKworCS8qIExvYWQgT2Zmc2V0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX09GRlNFVCwgb2Zmc2V0LCA3LCAwKTsKKworCS8qIExvYWQgQnl0ZSBDb3VudCAqLworCVJFR19GTERfTU9EKGJhc2UsIEhETUlfQ09SRV9ERENfQ09VTlQxLCAweDgwLCA3LCAwKTsKKwlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NPVU5UMiwgMHgwLCAxLCAwKTsKKworCS8qIFNldCBERENfQ01EICovCisJaWYgKGV4dCkKKwkJUkVHX0ZMRF9NT0QoYmFzZSwgSERNSV9DT1JFX0REQ19DTUQsIDB4NCwgMywgMCk7CisJZWxzZQorCQlSRUdfRkxEX01PRChiYXNlLCBIRE1JX0NPUkVfRERDX0NNRCwgMHgyLCAzLCAwKTsKKworCS8qIEhETUlfQ09SRV9ERENfU1RBVFVTX0JVU19MT1cgKi8KKwlpZiAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgNiwgNikgPT0gMSkgeworCQlwcl9lcnIoIkkyQyBCdXMgTG93P1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBIRE1JX0NPUkVfRERDX1NUQVRVU19OT19BQ0sgKi8KKwlpZiAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgNSwgNSkgPT0gMSkgeworCQlwcl9lcnIoIkkyQyBObyBBY2tcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMHg4MDsgKytpKSB7CisJCWludCB0OworCisJCS8qIElOX1BST0cgKi8KKwkJaWYgKFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX0REQ19TVEFUVVMsIDQsIDQpID09IDApIHsKKwkJCURTU0VSUigib3BlcmF0aW9uIHN0b3BwZWQgd2hlbiByZWFkaW5nIGVkaWRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQl0ID0gMDsKKwkJLyogRklGT19FTVBUWSAqLworCQl3aGlsZSAoUkVHX0dFVChiYXNlLCBIRE1JX0NPUkVfRERDX1NUQVRVUywgMiwgMikgPT0gMSkgeworCQkJaWYgKHQrKyA+IDEwMDAwKSB7CisJCQkJRFNTRVJSKCJ0aW1lb3V0IHJlYWRpbmcgZWRpZFxuIik7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCX0KKworCQlwZWRpZFtpXSA9IFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX0REQ19EQVRBLCA3LCAwKTsKKwl9CisKKwljaGVja3N1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDB4ODA7ICsraSkKKwkJY2hlY2tzdW0gKz0gcGVkaWRbaV07CisKKwlpZiAoY2hlY2tzdW0gIT0gMCkgeworCQlwcl9lcnIoIkUtRURJRCBjaGVja3N1bSBmYWlsZWQhIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdGlfaGRtaV80eHh4X3JlYWRfZWRpZChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXU4ICplZGlkLCBpbnQgbGVuKQoreworCWludCByLCBsOworCisJaWYgKGxlbiA8IDEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyID0gaGRtaV9jb3JlX2RkY19pbml0KGlwX2RhdGEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBoZG1pX2NvcmVfZGRjX2VkaWQoaXBfZGF0YSwgZWRpZCwgMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbCA9IDEyODsKKworCWlmIChsZW4gPj0gMTI4ICogMiAmJiBlZGlkWzB4N2VdID4gMCkgeworCQlyID0gaGRtaV9jb3JlX2RkY19lZGlkKGlwX2RhdGEsIGVkaWQgKyAweDgwLCAxKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwkJbCArPSAxMjg7CisJfQorCisJcmV0dXJuIGw7Cit9CisKK2Jvb2wgdGlfaGRtaV80eHh4X2RldGVjdChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCWludCByOworCisJdm9pZCBfX2lvbWVtICpiYXNlID0gaGRtaV9jb3JlX3N5c19iYXNlKGlwX2RhdGEpOworCisJLyogSFBEICovCisJciA9IFJFR19HRVQoYmFzZSwgSERNSV9DT1JFX1NZU19TWVNfU1RBVCwgMSwgMSk7CisKKwlyZXR1cm4gciA9PSAxOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfaW5pdChzdHJ1Y3QgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyAqdmlkZW9fY2ZnLAorCQkJc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpICphdmlfY2ZnLAorCQkJc3RydWN0IGhkbWlfY29yZV9wYWNrZXRfZW5hYmxlX3JlcGVhdCAqcmVwZWF0X2NmZykKK3sKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV9jb3JlX2luaXRcbiIpOworCisJLyogdmlkZW8gY29yZSAqLworCXZpZGVvX2NmZy0+aXBfYnVzX3dpZHRoID0gSERNSV9JTlBVVF84QklUOworCXZpZGVvX2NmZy0+b3BfZGl0aGVyX3RydWMgPSBIRE1JX09VVFBVVFRSVU5DQVRJT05fOEJJVDsKKwl2aWRlb19jZmctPmRlZXBfY29sb3JfcGt0ID0gSERNSV9ERUVQQ09MT1JQQUNLRUNURElTQUJMRTsKKwl2aWRlb19jZmctPnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRTsKKwl2aWRlb19jZmctPmhkbWlfZHZpID0gSERNSV9EVkk7CisJdmlkZW9fY2ZnLT50Y2xrX3NlbF9jbGttdWx0ID0gSERNSV9GUExMMTBJRENLOworCisJLyogaW5mbyBmcmFtZSAqLworCWF2aV9jZmctPmRiMV9mb3JtYXQgPSAwOworCWF2aV9jZmctPmRiMV9hY3RpdmVfaW5mbyA9IDA7CisJYXZpX2NmZy0+ZGIxX2Jhcl9pbmZvX2R2ID0gMDsKKwlhdmlfY2ZnLT5kYjFfc2Nhbl9pbmZvID0gMDsKKwlhdmlfY2ZnLT5kYjJfY29sb3JpbWV0cnkgPSAwOworCWF2aV9jZmctPmRiMl9hc3BlY3RfcmF0aW8gPSAwOworCWF2aV9jZmctPmRiMl9hY3RpdmVfZm10X2FyID0gMDsKKwlhdmlfY2ZnLT5kYjNfaXRjID0gMDsKKwlhdmlfY2ZnLT5kYjNfZWMgPSAwOworCWF2aV9jZmctPmRiM19xX3JhbmdlID0gMDsKKwlhdmlfY2ZnLT5kYjNfbnVwX3NjYWxpbmcgPSAwOworCWF2aV9jZmctPmRiNF92aWRlb2NvZGUgPSAwOworCWF2aV9jZmctPmRiNV9waXhlbF9yZXBlYXQgPSAwOworCWF2aV9jZmctPmRiNl83X2xpbmVfZW9mdG9wID0gMCA7CisJYXZpX2NmZy0+ZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOworCWF2aV9jZmctPmRiMTBfMTFfcGl4ZWxfZW9mbGVmdCA9IDA7CisJYXZpX2NmZy0+ZGIxMl8xM19waXhlbF9zb2ZyaWdodCA9IDA7CisKKwkvKiBwYWNrZXQgZW5hYmxlIGFuZCByZXBlYXQgKi8KKwlyZXBlYXRfY2ZnLT5hdWRpb19wa3QgPSAwOworCXJlcGVhdF9jZmctPmF1ZGlvX3BrdF9yZXBlYXQgPSAwOworCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWUgPSAwOworCXJlcGVhdF9jZmctPmF2aV9pbmZvZnJhbWVfcmVwZWF0ID0gMDsKKwlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0ID0gMDsKKwlyZXBlYXRfY2ZnLT5nZW5fY250cmxfcGt0X3JlcGVhdCA9IDA7CisJcmVwZWF0X2NmZy0+Z2VuZXJpY19wa3QgPSAwOworCXJlcGVhdF9jZmctPmdlbmVyaWNfcGt0X3JlcGVhdCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfY29yZV9wb3dlcmRvd25fZGlzYWJsZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhKQoreworCXByX2RlYnVnKCJFbnRlciBoZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGVcbiIpOworCVJFR19GTERfTU9EKGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX0NUUkwxLCAweDAsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfc3dyZXNldF9yZWxlYXNlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJcHJfZGVidWcoIkVudGVyIGhkbWlfY29yZV9zd3Jlc2V0X3JlbGVhc2VcbiIpOworCVJFR19GTERfTU9EKGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX1NZU19TUlNULCAweDAsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfc3dyZXNldF9hc3NlcnQoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSkKK3sKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0XG4iKTsKKwlSRUdfRkxEX01PRChoZG1pX2NvcmVfc3lzX2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9TWVNfU1JTVCwgMHgxLCAwLCAwKTsKK30KKworLyogSERNSV9DT1JFX1ZJREVPX0NPTkZJRyAqLworc3RhdGljIHZvaWQgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXN0cnVjdCBoZG1pX2NvcmVfdmlkZW9fY29uZmlnICpjZmcpCit7CisJdTMyIHIgPSAwOworCXZvaWQgX19pb21lbSAqY29yZV9zeXNfYmFzZSA9IGhkbWlfY29yZV9zeXNfYmFzZShpcF9kYXRhKTsKKworCS8qIHN5c19jdHJsMSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm90IHR1bmFibGUgKi8KKwlyID0gaGRtaV9yZWFkX3JlZyhjb3JlX3N5c19iYXNlLCBIRE1JX0NPUkVfQ1RSTDEpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMsIDUsIDUpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMsIDQsIDQpOworCXIgPSBGTERfTU9EKHIsIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTLCAyLCAyKTsKKwlyID0gRkxEX01PRChyLCBIRE1JX0NPUkVfQ1RSTDFfRURHRV9SSVNJTkdFREdFLCAxLCAxKTsKKwloZG1pX3dyaXRlX3JlZyhjb3JlX3N5c19iYXNlLCBIRE1JX0NPUkVfQ1RSTDEsIHIpOworCisJUkVHX0ZMRF9NT0QoY29yZV9zeXNfYmFzZSwKKwkJCUhETUlfQ09SRV9TWVNfVklEX0FDRU4sIGNmZy0+aXBfYnVzX3dpZHRoLCA3LCA2KTsKKworCS8qIFZpZF9Nb2RlICovCisJciA9IGhkbWlfcmVhZF9yZWcoY29yZV9zeXNfYmFzZSwgSERNSV9DT1JFX1NZU19WSURfTU9ERSk7CisKKwkvKiBkaXRoZXIgdHJ1bmNhdGlvbiBjb25maWd1cmF0aW9uICovCisJaWYgKGNmZy0+b3BfZGl0aGVyX3RydWMgPiBIRE1JX09VVFBVVFRSVU5DQVRJT05fMTJCSVQpIHsKKwkJciA9IEZMRF9NT0QociwgY2ZnLT5vcF9kaXRoZXJfdHJ1YyAtIDMsIDcsIDYpOworCQlyID0gRkxEX01PRChyLCAxLCA1LCA1KTsKKwl9IGVsc2UgeworCQlyID0gRkxEX01PRChyLCBjZmctPm9wX2RpdGhlcl90cnVjLCA3LCA2KTsKKwkJciA9IEZMRF9NT0QociwgMCwgNSwgNSk7CisJfQorCWhkbWlfd3JpdGVfcmVnKGNvcmVfc3lzX2Jhc2UsIEhETUlfQ09SRV9TWVNfVklEX01PREUsIHIpOworCisJLyogSERNSV9DdHJsICovCisJciA9IGhkbWlfcmVhZF9yZWcoaGRtaV9hdl9iYXNlKGlwX2RhdGEpLCBIRE1JX0NPUkVfQVZfSERNSV9DVFJMKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmRlZXBfY29sb3JfcGt0LCA2LCA2KTsKKwlyID0gRkxEX01PRChyLCBjZmctPnBrdF9tb2RlLCA1LCAzKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmhkbWlfZHZpLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX2F2X2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwsIHIpOworCisJLyogVE1EU19DVFJMICovCisJUkVHX0ZMRF9NT0QoY29yZV9zeXNfYmFzZSwKKwkJCUhETUlfQ09SRV9TWVNfVE1EU19DVFJMLCBjZmctPnRjbGtfc2VsX2Nsa211bHQsIDYsIDUpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2NvcmVfYXV4X2luZm9mcmFtZV9hdmlfY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F2aSBpbmZvX2F2aSkKK3sKKwl1MzIgdmFsOworCWNoYXIgc3VtID0gMCwgY2hlY2tzdW0gPSAwOworCXZvaWQgX19pb21lbSAqYXZfYmFzZSA9IGhkbWlfYXZfYmFzZShpcF9kYXRhKTsKKworCXN1bSArPSAweDgyICsgMHgwMDIgKyAweDAwRDsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX1RZUEUsIDB4MDgyKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX1ZFUlMsIDB4MDAyKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0xFTiwgMHgwMEQpOworCisJdmFsID0gKGluZm9fYXZpLmRiMV9mb3JtYXQgPDwgNSkgfAorCQkoaW5mb19hdmkuZGIxX2FjdGl2ZV9pbmZvIDw8IDQpIHwKKwkJKGluZm9fYXZpLmRiMV9iYXJfaW5mb19kdiA8PCAyKSB8CisJCShpbmZvX2F2aS5kYjFfc2Nhbl9pbmZvKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoaW5mb19hdmkuZGIyX2NvbG9yaW1ldHJ5IDw8IDYpIHwKKwkJKGluZm9fYXZpLmRiMl9hc3BlY3RfcmF0aW8gPDwgNCkgfAorCQkoaW5mb19hdmkuZGIyX2FjdGl2ZV9mbXRfYXIpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMSksIHZhbCk7CisJc3VtICs9IHZhbDsKKworCXZhbCA9IChpbmZvX2F2aS5kYjNfaXRjIDw8IDcpIHwKKwkJKGluZm9fYXZpLmRiM19lYyA8PCA0KSB8CisJCShpbmZvX2F2aS5kYjNfcV9yYW5nZSA8PCAyKSB8CisJCShpbmZvX2F2aS5kYjNfbnVwX3NjYWxpbmcpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMiksIHZhbCk7CisJc3VtICs9IHZhbDsKKworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMyksCisJCQkJCWluZm9fYXZpLmRiNF92aWRlb2NvZGUpOworCXN1bSArPSBpbmZvX2F2aS5kYjRfdmlkZW9jb2RlOworCisJdmFsID0gaW5mb19hdmkuZGI1X3BpeGVsX3JlcGVhdDsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDQpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjZfN19saW5lX2VvZnRvcCAmIDB4MDBGRjsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDUpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiNl83X2xpbmVfZW9mdG9wID4+IDgpICYgMHgwMEZGKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDYpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjhfOV9saW5lX3NvZmJvdHRvbSAmIDB4MDBGRjsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDcpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiOF85X2xpbmVfc29mYm90dG9tID4+IDgpICYgMHgwMEZGKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKDgpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjEwXzExX3BpeGVsX2VvZmxlZnQgJiAweDAwRkY7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FWSV9EQllURSg5KSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJdmFsID0gKChpbmZvX2F2aS5kYjEwXzExX3BpeGVsX2VvZmxlZnQgPj4gOCkgJiAweDAwRkYpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSBpbmZvX2F2aS5kYjEyXzEzX3BpeGVsX3NvZnJpZ2h0ICYgMHgwMEZGOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTEpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoKGluZm9fYXZpLmRiMTJfMTNfcGl4ZWxfc29mcmlnaHQgPj4gOCkgJiAweDAwRkYpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfREJZVEUoMTIpLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwljaGVja3N1bSA9IDB4MTAwIC0gc3VtOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVklfQ0hTVU0sIGNoZWNrc3VtKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV9jb3JlX2F2X3BhY2tldF9jb25maWcoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJc3RydWN0IGhkbWlfY29yZV9wYWNrZXRfZW5hYmxlX3JlcGVhdCByZXBlYXRfY2ZnKQoreworCS8qIGVuYWJsZS9yZXBlYXQgdGhlIGluZm9mcmFtZSAqLworCWhkbWlfd3JpdGVfcmVnKGhkbWlfYXZfYmFzZShpcF9kYXRhKSwgSERNSV9DT1JFX0FWX1BCX0NUUkwxLAorCQkocmVwZWF0X2NmZy5hdWRpb19wa3QgPDwgNSkgfAorCQkocmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0IDw8IDQpIHwKKwkJKHJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA8PCAxKSB8CisJCShyZXBlYXRfY2ZnLmF2aV9pbmZvZnJhbWVfcmVwZWF0KSk7CisKKwkvKiBlbmFibGUvcmVwZWF0IHRoZSBwYWNrZXQgKi8KKwloZG1pX3dyaXRlX3JlZyhoZG1pX2F2X2Jhc2UoaXBfZGF0YSksIEhETUlfQ09SRV9BVl9QQl9DVFJMMiwKKwkJKHJlcGVhdF9jZmcuZ2VuX2NudHJsX3BrdCA8PCAzKSB8CisJCShyZXBlYXRfY2ZnLmdlbl9jbnRybF9wa3RfcmVwZWF0IDw8IDIpIHwKKwkJKHJlcGVhdF9jZmcuZ2VuZXJpY19wa3QgPDwgMSkgfAorCQkocmVwZWF0X2NmZy5nZW5lcmljX3BrdF9yZXBlYXQpKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV93cF9pbml0KHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsCisJCQlzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgKnZpZGVvX2ZtdCwKKwkJCXN0cnVjdCBoZG1pX3ZpZGVvX2ludGVyZmFjZSAqdmlkZW9faW50KQoreworCXByX2RlYnVnKCJFbnRlciBoZG1pX3dwX2luaXRcbiIpOworCisJdGltaW5ncy0+aGJwID0gMDsKKwl0aW1pbmdzLT5oZnAgPSAwOworCXRpbWluZ3MtPmhzdyA9IDA7CisJdGltaW5ncy0+dmJwID0gMDsKKwl0aW1pbmdzLT52ZnAgPSAwOworCXRpbWluZ3MtPnZzdyA9IDA7CisKKwl2aWRlb19mbXQtPnBhY2tpbmdfbW9kZSA9IEhETUlfUEFDS18xMGJfUkdCX1lVVjQ0NDsKKwl2aWRlb19mbXQtPnlfcmVzID0gMDsKKwl2aWRlb19mbXQtPnhfcmVzID0gMDsKKworCXZpZGVvX2ludC0+dnNwID0gMDsKKwl2aWRlb19pbnQtPmhzcCA9IDA7CisKKwl2aWRlb19pbnQtPmludGVybGFjaW5nID0gMDsKKwl2aWRlb19pbnQtPnRtID0gMDsgLyogSERNSV9USU1JTkdfU0xBVkUgKi8KKworfQorCit2b2lkIHRpX2hkbWlfNHh4eF93cF92aWRlb19zdGFydChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBib29sIHN0YXJ0KQoreworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcsIHN0YXJ0LCAzMSwgMzEpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3dwX3ZpZGVvX2luaXRfZm9ybWF0KHN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCAqdmlkZW9fZm10LAorCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MsIHN0cnVjdCBoZG1pX2NvbmZpZyAqcGFyYW0pCit7CisJcHJfZGVidWcoIkVudGVyIGhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXRcbiIpOworCisJdmlkZW9fZm10LT55X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueV9yZXM7CisJdmlkZW9fZm10LT54X3JlcyA9IHBhcmFtLT50aW1pbmdzLnRpbWluZ3MueF9yZXM7CisKKwl0aW1pbmdzLT5oYnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhicDsKKwl0aW1pbmdzLT5oZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhmcDsKKwl0aW1pbmdzLT5oc3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLmhzdzsKKwl0aW1pbmdzLT52YnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZicDsKKwl0aW1pbmdzLT52ZnAgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZmcDsKKwl0aW1pbmdzLT52c3cgPSBwYXJhbS0+dGltaW5ncy50aW1pbmdzLnZzdzsKK30KKworc3RhdGljIHZvaWQgaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCAqdmlkZW9fZm10KQoreworCXUzMiBsID0gMDsKKworCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcsCisJCQl2aWRlb19mbXQtPnBhY2tpbmdfbW9kZSwgMTAsIDgpOworCisJbCB8PSBGTERfVkFMKHZpZGVvX2ZtdC0+eV9yZXMsIDMxLCAxNik7CisJbCB8PSBGTERfVkFMKHZpZGVvX2ZtdC0+eF9yZXMsIDE1LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fU0laRSwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3QgaGRtaV92aWRlb19pbnRlcmZhY2UgKnZpZGVvX2ludCkKK3sKKwl1MzIgcjsKKwlwcl9kZWJ1ZygiRW50ZXIgaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlXG4iKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9WSURFT19DRkcpOworCXIgPSBGTERfTU9EKHIsIHZpZGVvX2ludC0+dnNwLCA3LCA3KTsKKwlyID0gRkxEX01PRChyLCB2aWRlb19pbnQtPmhzcCwgNiwgNik7CisJciA9IEZMRF9NT0QociwgdmlkZW9faW50LT5pbnRlcmxhY2luZywgMywgMyk7CisJciA9IEZMRF9NT0QociwgdmlkZW9faW50LT50bSwgMSwgMCk7CisJaGRtaV93cml0ZV9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX1ZJREVPX0NGRywgcik7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCXUzMiB0aW1pbmdfaCA9IDA7CisJdTMyIHRpbWluZ192ID0gMDsKKworCXByX2RlYnVnKCJFbnRlciBoZG1pX3dwX3ZpZGVvX2NvbmZpZ190aW1pbmdcbiIpOworCisJdGltaW5nX2ggfD0gRkxEX1ZBTCh0aW1pbmdzLT5oYnAsIDMxLCAyMCk7CisJdGltaW5nX2ggfD0gRkxEX1ZBTCh0aW1pbmdzLT5oZnAsIDE5LCA4KTsKKwl0aW1pbmdfaCB8PSBGTERfVkFMKHRpbWluZ3MtPmhzdywgNywgMCk7CisJaGRtaV93cml0ZV9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX1ZJREVPX1RJTUlOR19ILCB0aW1pbmdfaCk7CisKKwl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZicCwgMzEsIDIwKTsKKwl0aW1pbmdfdiB8PSBGTERfVkFMKHRpbWluZ3MtPnZmcCwgMTksIDgpOworCXRpbWluZ192IHw9IEZMRF9WQUwodGltaW5ncy0+dnN3LCA3LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fVElNSU5HX1YsIHRpbWluZ192KTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfYmFzaWNfY29uZmlndXJlKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEpCit7CisJLyogSERNSSAqLworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdmlkZW9fdGltaW5nOworCXN0cnVjdCBoZG1pX3ZpZGVvX2Zvcm1hdCB2aWRlb19mb3JtYXQ7CisJc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHZpZGVvX2ludGVyZmFjZTsKKwkvKiBIRE1JIGNvcmUgKi8KKwlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdmkgYXZpX2NmZzsKKwlzdHJ1Y3QgaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyB2X2NvcmVfY2ZnOworCXN0cnVjdCBoZG1pX2NvcmVfcGFja2V0X2VuYWJsZV9yZXBlYXQgcmVwZWF0X2NmZzsKKwlzdHJ1Y3QgaGRtaV9jb25maWcgKmNmZyA9ICZpcF9kYXRhLT5jZmc7CisKKwloZG1pX3dwX2luaXQoJnZpZGVvX3RpbWluZywgJnZpZGVvX2Zvcm1hdCwKKwkJJnZpZGVvX2ludGVyZmFjZSk7CisKKwloZG1pX2NvcmVfaW5pdCgmdl9jb3JlX2NmZywKKwkJJmF2aV9jZmcsCisJCSZyZXBlYXRfY2ZnKTsKKworCWhkbWlfd3BfdmlkZW9faW5pdF9mb3JtYXQoJnZpZGVvX2Zvcm1hdCwgJnZpZGVvX3RpbWluZywgY2ZnKTsKKworCWhkbWlfd3BfdmlkZW9fY29uZmlnX3RpbWluZyhpcF9kYXRhLCAmdmlkZW9fdGltaW5nKTsKKworCS8qIHZpZGVvIGNvbmZpZyAqLworCXZpZGVvX2Zvcm1hdC5wYWNraW5nX21vZGUgPSBIRE1JX1BBQ0tfMjRiX1JHQl9ZVVY0NDRfWVVWNDIyOworCisJaGRtaV93cF92aWRlb19jb25maWdfZm9ybWF0KGlwX2RhdGEsICZ2aWRlb19mb3JtYXQpOworCisJdmlkZW9faW50ZXJmYWNlLnZzcCA9IGNmZy0+dGltaW5ncy52c3luY19wb2w7CisJdmlkZW9faW50ZXJmYWNlLmhzcCA9IGNmZy0+dGltaW5ncy5oc3luY19wb2w7CisJdmlkZW9faW50ZXJmYWNlLmludGVybGFjaW5nID0gY2ZnLT5pbnRlcmxhY2U7CisJdmlkZW9faW50ZXJmYWNlLnRtID0gMSA7IC8qIEhETUlfVElNSU5HX01BU1RFUl8yNEJJVCAqLworCisJaGRtaV93cF92aWRlb19jb25maWdfaW50ZXJmYWNlKGlwX2RhdGEsICZ2aWRlb19pbnRlcmZhY2UpOworCisJLyoKKwkgKiBjb25maWd1cmUgY29yZSB2aWRlbyBwYXJ0CisJICogc2V0IHNvZnR3YXJlIHJlc2V0IGluIHRoZSBjb3JlCisJICovCisJaGRtaV9jb3JlX3N3cmVzZXRfYXNzZXJ0KGlwX2RhdGEpOworCisJLyogcG93ZXIgZG93biBvZmYgKi8KKwloZG1pX2NvcmVfcG93ZXJkb3duX2Rpc2FibGUoaXBfZGF0YSk7CisKKwl2X2NvcmVfY2ZnLnBrdF9tb2RlID0gSERNSV9QQUNLRVRNT0RFMjRCSVRQRVJQSVhFTDsKKwl2X2NvcmVfY2ZnLmhkbWlfZHZpID0gY2ZnLT5jbS5tb2RlOworCisJaGRtaV9jb3JlX3ZpZGVvX2NvbmZpZyhpcF9kYXRhLCAmdl9jb3JlX2NmZyk7CisKKwkvKiByZWxlYXNlIHNvZnR3YXJlIHJlc2V0IGluIHRoZSBjb3JlICovCisJaGRtaV9jb3JlX3N3cmVzZXRfcmVsZWFzZShpcF9kYXRhKTsKKworCS8qCisJICogY29uZmlndXJlIHBhY2tldAorCSAqIGluZm8gZnJhbWUgdmlkZW8gc2VlIGRvYyBDRUE4NjEtRCBwYWdlIDY1CisJICovCisJYXZpX2NmZy5kYjFfZm9ybWF0ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfUkdCOworCWF2aV9jZmcuZGIxX2FjdGl2ZV9pbmZvID0KKwkJSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PRkY7CisJYXZpX2NmZy5kYjFfYmFyX2luZm9fZHYgPSBIRE1JX0lORk9GUkFNRV9BVklfREIxQl9OTzsKKwlhdmlfY2ZnLmRiMV9zY2FuX2luZm8gPSBIRE1JX0lORk9GUkFNRV9BVklfREIxU18wOworCWF2aV9jZmcuZGIyX2NvbG9yaW1ldHJ5ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfTk87CisJYXZpX2NmZy5kYjJfYXNwZWN0X3JhdGlvID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fTk87CisJYXZpX2NmZy5kYjJfYWN0aXZlX2ZtdF9hciA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSX1NBTUU7CisJYXZpX2NmZy5kYjNfaXRjID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCM0lUQ19OTzsKKwlhdmlfY2ZnLmRiM19lYyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNFQ19YVllVVjYwMTsKKwlhdmlfY2ZnLmRiM19xX3JhbmdlID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCM1FfREVGQVVMVDsKKwlhdmlfY2ZnLmRiM19udXBfc2NhbGluZyA9IEhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19OTzsKKwlhdmlfY2ZnLmRiNF92aWRlb2NvZGUgPSBjZmctPmNtLmNvZGU7CisJYXZpX2NmZy5kYjVfcGl4ZWxfcmVwZWF0ID0gSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSX05POworCWF2aV9jZmcuZGI2XzdfbGluZV9lb2Z0b3AgPSAwOworCWF2aV9jZmcuZGI4XzlfbGluZV9zb2Zib3R0b20gPSAwOworCWF2aV9jZmcuZGIxMF8xMV9waXhlbF9lb2ZsZWZ0ID0gMDsKKwlhdmlfY2ZnLmRiMTJfMTNfcGl4ZWxfc29mcmlnaHQgPSAwOworCisJaGRtaV9jb3JlX2F1eF9pbmZvZnJhbWVfYXZpX2NvbmZpZyhpcF9kYXRhLCBhdmlfY2ZnKTsKKworCS8qIGVuYWJsZS9yZXBlYXQgdGhlIGluZm9mcmFtZSAqLworCXJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZSA9IEhETUlfUEFDS0VURU5BQkxFOworCXJlcGVhdF9jZmcuYXZpX2luZm9mcmFtZV9yZXBlYXQgPSBIRE1JX1BBQ0tFVFJFUEVBVE9OOworCS8qIHdha2V1cCAqLworCXJlcGVhdF9jZmcuYXVkaW9fcGt0ID0gSERNSV9QQUNLRVRFTkFCTEU7CisJcmVwZWF0X2NmZy5hdWRpb19wa3RfcmVwZWF0ID0gSERNSV9QQUNLRVRSRVBFQVRPTjsKKwloZG1pX2NvcmVfYXZfcGFja2V0X2NvbmZpZyhpcF9kYXRhLCByZXBlYXRfY2ZnKTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfd3BfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgcikpCisKKwlEVU1QUkVHKEhETUlfV1BfUkVWSVNJT04pOworCURVTVBSRUcoSERNSV9XUF9TWVNDT05GSUcpOworCURVTVBSRUcoSERNSV9XUF9JUlFTVEFUVVNfUkFXKTsKKwlEVU1QUkVHKEhETUlfV1BfSVJRU1RBVFVTKTsKKwlEVU1QUkVHKEhETUlfV1BfUFdSX0NUUkwpOworCURVTVBSRUcoSERNSV9XUF9JUlFFTkFCTEVfU0VUKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fQ0ZHKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fU0laRSk7CisJRFVNUFJFRyhIRE1JX1dQX1ZJREVPX1RJTUlOR19IKTsKKwlEVU1QUkVHKEhETUlfV1BfVklERU9fVElNSU5HX1YpOworCURVTVBSRUcoSERNSV9XUF9XUF9DTEspOworCURVTVBSRUcoSERNSV9XUF9BVURJT19DRkcpOworCURVTVBSRUcoSERNSV9XUF9BVURJT19DRkcyKTsKKwlEVU1QUkVHKEhETUlfV1BfQVVESU9fQ1RSTCk7CisJRFVNUFJFRyhIRE1JX1dQX0FVRElPX0RBVEEpOworfQorCit2b2lkIHRpX2hkbWlfNHh4eF9wbGxfZHVtcChzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisjZGVmaW5lIERVTVBQTEwocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIHIpKQorCisJRFVNUFBMTChQTExDVFJMX1BMTF9DT05UUk9MKTsKKwlEVU1QUExMKFBMTENUUkxfUExMX1NUQVRVUyk7CisJRFVNUFBMTChQTExDVFJMX1BMTF9HTyk7CisJRFVNUFBMTChQTExDVFJMX0NGRzEpOworCURVTVBQTEwoUExMQ1RSTF9DRkcyKTsKKwlEVU1QUExMKFBMTENUUkxfQ0ZHMyk7CisJRFVNUFBMTChQTExDVFJMX0NGRzQpOworfQorCit2b2lkIHRpX2hkbWlfNHh4eF9jb3JlX2R1bXAoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKQoreworCWludCBpOworCisjZGVmaW5lIENPUkVfUkVHKGksIG5hbWUpIG5hbWUoaSkKKyNkZWZpbmUgRFVNUENPUkUocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsXAorCQloZG1pX3JlYWRfcmVnKGhkbWlfcGxsX2Jhc2UoaXBfZGF0YSksIHIpKQorI2RlZmluZSBEVU1QQ09SRUFWKGksIHIpIHNlcV9wcmludGYocywgIiVzWyVkXSUqcyAlMDh4XG4iLCAjciwgaSwgXAorCQkoaSA8IDEwKSA/IDMyIC0gc3RybGVuKCNyKSA6IDMxIC0gc3RybGVuKCNyKSwgIiAiLCBcCisJCWhkbWlfcmVhZF9yZWcoaGRtaV9wbGxfYmFzZShpcF9kYXRhKSwgQ09SRV9SRUcoaSwgcikpKQorCisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WTkRfSURMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFVl9JREwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVWX0lESCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19ERVZfUkVWKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX1NSU1QpOworCURVTVBDT1JFKEhETUlfQ09SRV9DVFJMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19TWVNfU1RBVCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WSURfQUNFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19WSURfTU9ERSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19JTlRSX1NUQVRFKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFIzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0lOVFI0KTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX1VNQVNLMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19UTURTX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfRExZKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfVE9QKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0NOVEwpOworCURVTVBDT1JFKEhETUlfQ09SRV9TWVNfREVfQ05USCk7CisJRFVNUENPUkUoSERNSV9DT1JFX1NZU19ERV9MSU5MKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfU1lTX0RFX0xJTkhfMSk7CisKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX0NNRCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19TVEFUVVMpOworCURVTVBDT1JFKEhETUlfQ09SRV9ERENfQUREUik7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19PRkZTRVQpOworCURVTVBDT1JFKEhETUlfQ09SRV9ERENfQ09VTlQxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX0NPVU5UMik7CisJRFVNUENPUkUoSERNSV9DT1JFX0REQ19EQVRBKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfRERDX1NFR00pOworCisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0RQRCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1BCX0NUUkwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfUEJfQ1RSTDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfVFlQRSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVZJX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9DSFNVTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX0FWSV9EQllURV9ORUxFTVM7IGkrKykKKwkJRFVNUENPUkVBVihpLCBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKTsKKworCWZvciAoaSA9IDA7IGkgPCBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX05FTEVNUzsgaSsrKQorCQlEVU1QQ09SRUFWKGksIEhETUlfQ09SRV9BVl9TUERfREJZVEUpOworCisJZm9yIChpID0gMDsgaSA8IEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX01QRUdfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX01QRUdfREJZVEUpOworCisJZm9yIChpID0gMDsgaSA8IEhETUlfQ09SRV9BVl9HRU5fREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0dFTl9EQllURSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSERNSV9DT1JFX0FWX0dFTjJfREJZVEVfTkVMRU1TOyBpKyspCisJCURVTVBDT1JFQVYoaSwgSERNSV9DT1JFX0FWX0dFTjJfREJZVEUpOworCisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FDUl9DVFJMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfRlJFUV9TVkFMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfTl9TVkFMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX05fU1ZBTDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9OX1NWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX1NWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwxKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQ1RTX0hWQUwzKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVEX01PREUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TUERJRl9DVFJMKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TV0FQX0kyUyk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRElGX0VSVEgpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfSU5fTUFQKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSTJTX0lOX0NUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDApOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDEpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDQpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BU1JDKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfSTJTX0lOX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0hETUlfQ1RSTCk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRE9fVFhTVEFUKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRF9QQVJfQlVTQ0xLXzIpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18zKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9EUEQpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9QQl9DVFJMMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1BCX0NUUkwyKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVZJX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfVkVSUyk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FWSV9MRU4pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVklfQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9TUERfVFlQRSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRF9WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfU1BEX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX1NQRF9DSFNVTSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0FVRElPX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9BVURJT19WRVJTKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVESU9fTEVOKTsKKwlEVU1QQ09SRShIRE1JX0NPUkVfQVZfQVVESU9fQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX1RZUEUpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX1ZFUlMpOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9NUEVHX0xFTik7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX01QRUdfQ0hTVU0pOworCURVTVBDT1JFKEhETUlfQ09SRV9BVl9DUF9CWVRFMSk7CisJRFVNUENPUkUoSERNSV9DT1JFX0FWX0NFQ19BRERSX0lEKTsKK30KKwordm9pZCB0aV9oZG1pXzR4eHhfcGh5X2R1bXAoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwgc3RydWN0IHNlcV9maWxlICpzKQoreworI2RlZmluZSBEVU1QUEhZKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLFwKKwkJaGRtaV9yZWFkX3JlZyhoZG1pX3BoeV9iYXNlKGlwX2RhdGEpLCByKSkKKworCURVTVBQSFkoSERNSV9UWFBIWV9UWF9DVFJMKTsKKwlEVU1QUEhZKEhETUlfVFhQSFlfRElHSVRBTF9DVFJMKTsKKwlEVU1QUEhZKEhETUlfVFhQSFlfUE9XRVJfQ1RSTCk7CisJRFVNUFBIWShIRE1JX1RYUEhZX1BBRF9DRkdfQ1RSTCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKK3ZvaWQgaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0KHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJCXN0cnVjdCBoZG1pX2F1ZGlvX2Zvcm1hdCAqYXVkX2ZtdCkKK3sKKwl1MzIgcjsKKworCURTU0RCRygiRW50ZXIgaGRtaV93cF9hdWRpb19jb25maWdfZm9ybWF0XG4iKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9BVURJT19DRkcpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnN0ZXJlb19jaGFubmVscywgMjYsIDI0KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5hY3RpdmVfY2hubmxzX21zaywgMjMsIDE2KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5lbl9zaWdfYmxrX3N0cnRfZW5kLCA1LCA1KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT50eXBlLCA0LCA0KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5qdXN0aWZpY2F0aW9uLCAzLCAzKTsKKwlyID0gRkxEX01PRChyLCBhdWRfZm10LT5zYW1wbGVfb3JkZXIsIDIsIDIpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZXNfcGVyX3dvcmQsIDEsIDEpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9mbXQtPnNhbXBsZV9zaXplLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ0ZHLCByKTsKK30KKwordm9pZCBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWEoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfYXVkaW9fZG1hICphdWRfZG1hKQoreworCXUzMiByOworCisJRFNTREJHKCJFbnRlciBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19kbWFcbiIpOworCisJciA9IGhkbWlfcmVhZF9yZWcoaGRtaV93cF9iYXNlKGlwX2RhdGEpLCBIRE1JX1dQX0FVRElPX0NGRzIpOworCXIgPSBGTERfTU9EKHIsIGF1ZF9kbWEtPnRyYW5zZmVyX3NpemUsIDE1LCA4KTsKKwlyID0gRkxEX01PRChyLCBhdWRfZG1hLT5ibG9ja19zaXplLCA3LCAwKTsKKwloZG1pX3dyaXRlX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ0ZHMiwgcik7CisKKwlyID0gaGRtaV9yZWFkX3JlZyhoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfQVVESU9fQ1RSTCk7CisJciA9IEZMRF9NT0QociwgYXVkX2RtYS0+bW9kZSwgOSwgOSk7CisJciA9IEZMRF9NT0QociwgYXVkX2RtYS0+Zmlmb190aHJlc2hvbGQsIDgsIDApOworCWhkbWlfd3JpdGVfcmVnKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwgSERNSV9XUF9BVURJT19DVFJMLCByKTsKK30KKwordm9pZCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJCXN0cnVjdCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnICpjZmcpCit7CisJdTMyIHI7CisJdm9pZCBfX2lvbWVtICphdl9iYXNlID0gaGRtaV9hdl9iYXNlKGlwX2RhdGEpOworCisJLyogYXVkaW8gY2xvY2sgcmVjb3ZlcnkgcGFyYW1ldGVycyAqLworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BQ1JfQ1RSTCk7CisJciA9IEZMRF9NT0QociwgY2ZnLT51c2VfbWNsaywgMiwgMik7CisJciA9IEZMRF9NT0QociwgY2ZnLT5lbl9hY3JfcGt0LCAxLCAxKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmN0c19tb2RlLCAwLCAwKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQUNSX0NUUkwsIHIpOworCisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX05fU1ZBTDEsIGNmZy0+biwgNywgMCk7CisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX05fU1ZBTDIsIGNmZy0+biA+PiA4LCA3LCAwKTsKKwlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfTl9TVkFMMywgY2ZnLT5uID4+IDE2LCA3LCAwKTsKKworCWlmIChjZmctPmN0c19tb2RlID09IEhETUlfQVVESU9fQ1RTX01PREVfU1cpIHsKKwkJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0NUU19TVkFMMSwgY2ZnLT5jdHMsIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLAorCQkJCUhETUlfQ09SRV9BVl9DVFNfU1ZBTDIsIGNmZy0+Y3RzID4+IDgsIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLAorCQkJCUhETUlfQ09SRV9BVl9DVFNfU1ZBTDMsIGNmZy0+Y3RzID4+IDE2LCA3LCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBIRE1JIElQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGRpdmlkZSB0aGUgTUNMSyB0bworCQkgKiB1cGRhdGUgQ1RTIHZhbHVlLgorCQkgKi8KKwkJUkVHX0ZMRF9NT0QoYXZfYmFzZSwKKwkJCQlIRE1JX0NPUkVfQVZfRlJFUV9TVkFMLCBjZmctPm1jbGtfbW9kZSwgMiwgMCk7CisKKwkJLyogQ29uZmlndXJlIGNsb2NrIGZvciBhdWRpbyBwYWNrZXRzICovCisJCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18xLAorCQkJCWNmZy0+YXVkX3Bhcl9idXNjbGssIDcsIDApOworCQlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMiwKKwkJCQkoY2ZnLT5hdWRfcGFyX2J1c2NsayA+PiA4KSwgNywgMCk7CisJCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfUEFSX0JVU0NMS18zLAorCQkJCShjZmctPmF1ZF9wYXJfYnVzY2xrID4+IDE2KSwgNywgMCk7CisJfQorCisJLyogT3ZlcnJpZGUgb2YgU1BESUYgc2FtcGxlIGZyZXF1ZW5jeSB3aXRoIHZhbHVlIGluIEkyU19DSFNUNCAqLworCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9TUERJRl9DVFJMLAorCQkJCQkJY2ZnLT5mc19vdmVycmlkZSwgMSwgMSk7CisKKwkvKiBJMlMgcGFyYW1ldGVycyAqLworCVJFR19GTERfTU9EKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfQ0hTVDQsCisJCQkJCQljZmctPmZyZXFfc2FtcGxlLCAzLCAwKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTCk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmVuX2hpZ2hfYml0cmF0ZV9hdWQsIDcsIDcpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5zY2tfZWRnZV9tb2RlLCA2LCA2KTsKKwlyID0gRkxEX01PRChyLCBjZmctPmkyc19jZmcuY2JpdF9vcmRlciwgNSwgNSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLnZiaXQsIDQsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53c19wb2xhcml0eSwgMywgMyk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmp1c3RpZmljYXRpb24sIDIsIDIpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5kaXJlY3Rpb24sIDEsIDEpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy5zaGlmdCwgMCwgMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0kyU19JTl9DVFJMLCByKTsKKworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9JMlNfQ0hTVDUpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+ZnJlcV9zYW1wbGUsIDcsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+aTJzX2NmZy53b3JkX2xlbmd0aCwgMywgMSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLndvcmRfbWF4X2xlbmd0aCwgMCwgMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0kyU19DSFNUNSwgcik7CisKKwlSRUdfRkxEX01PRChhdl9iYXNlLCBIRE1JX0NPUkVfQVZfSTJTX0lOX0xFTiwKKwkJCWNmZy0+aTJzX2NmZy5pbl9sZW5ndGhfYml0cywgMywgMCk7CisKKwkvKiBBdWRpbyBjaGFubmVscyBhbmQgbW9kZSBwYXJhbWV0ZXJzICovCisJUkVHX0ZMRF9NT0QoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0hETUlfQ1RSTCwgY2ZnLT5sYXlvdXQsIDIsIDEpOworCXIgPSBoZG1pX3JlYWRfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURfTU9ERSk7CisJciA9IEZMRF9NT0QociwgY2ZnLT5pMnNfY2ZnLmFjdGl2ZV9zZHMsIDcsIDQpOworCXIgPSBGTERfTU9EKHIsIGNmZy0+ZW5fZHNkX2F1ZGlvLCAzLCAzKTsKKwlyID0gRkxEX01PRChyLCBjZmctPmVuX3BhcmFsbGVsX2F1ZF9pbnB1dCwgMiwgMik7CisJciA9IEZMRF9NT0QociwgY2ZnLT5lbl9zcGRpZiwgMSwgMSk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9NT0RFLCByKTsKK30KKwordm9pZCBoZG1pX2NvcmVfYXVkaW9faW5mb2ZyYW1lX2NvbmZpZyhzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQlzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyAqaW5mb19hdWQpCit7CisJdTggdmFsOworCXU4IHN1bSA9IDAsIGNoZWNrc3VtID0gMDsKKwl2b2lkIF9faW9tZW0gKmF2X2Jhc2UgPSBoZG1pX2F2X2Jhc2UoaXBfZGF0YSk7CisKKwkvKgorCSAqIFNldCBhdWRpbyBpbmZvIGZyYW1lIHR5cGUsIHZlcnNpb24gYW5kIGxlbmd0aCBhcworCSAqIGRlc2NyaWJlZCBpbiBIRE1JIDEuNGEgU2VjdGlvbiA4LjIuMiBzcGVjaWZpY2F0aW9uLgorCSAqIENoZWNrc3VtIGNhbGN1bGF0aW9uIGlzIGRlZmluZWQgaW4gU2VjdGlvbiA1LjMuNS4KKwkgKi8KKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVESU9fVFlQRSwgMHg4NCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRElPX1ZFUlMsIDB4MDEpOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsIEhETUlfQ09SRV9BVl9BVURJT19MRU4sIDB4MGEpOworCXN1bSArPSAweDg0ICsgMHgwMDEgKyAweDAwYTsKKworCXZhbCA9IChpbmZvX2F1ZC0+ZGIxX2NvZGluZ190eXBlIDw8IDQpCisJCQl8IChpbmZvX2F1ZC0+ZGIxX2NoYW5uZWxfY291bnQgLSAxKTsKKwloZG1pX3dyaXRlX3JlZyhhdl9iYXNlLCBIRE1JX0NPUkVfQVZfQVVEX0RCWVRFKDApLCB2YWwpOworCXN1bSArPSB2YWw7CisKKwl2YWwgPSAoaW5mb19hdWQtPmRiMl9zYW1wbGVfZnJlcSA8PCAyKSB8IGluZm9fYXVkLT5kYjJfc2FtcGxlX3NpemU7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgxKSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgyKSwgMHgwMCk7CisKKwl2YWwgPSBpbmZvX2F1ZC0+ZGI0X2NoYW5uZWxfYWxsb2M7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSgzKSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJdmFsID0gKGluZm9fYXVkLT5kYjVfZG93bm1peF9pbmggPDwgNykgfCAoaW5mb19hdWQtPmRiNV9sc3YgPDwgMyk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg0KSwgdmFsKTsKKwlzdW0gKz0gdmFsOworCisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg1KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg2KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg3KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg4KSwgMHgwMCk7CisJaGRtaV93cml0ZV9yZWcoYXZfYmFzZSwgSERNSV9DT1JFX0FWX0FVRF9EQllURSg5KSwgMHgwMCk7CisKKwljaGVja3N1bSA9IDB4MTAwIC0gc3VtOworCWhkbWlfd3JpdGVfcmVnKGF2X2Jhc2UsCisJCQkJCUhETUlfQ09SRV9BVl9BVURJT19DSFNVTSwgY2hlY2tzdW0pOworCisJLyoKKwkgKiBUT0RPOiBBZGQgTVBFRyBhbmQgU1BEIGVuYWJsZSBhbmQgcmVwZWF0IGNmZyB3aGVuIEVESUQgcGFyc2luZworCSAqIGlzIGF2YWlsYWJsZS4KKwkgKi8KK30KKworaW50IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cykKK3sKKwl1MzIgcjsKKwl1MzIgZGVlcF9jb2xvciA9IDA7CisJdTMyIHBjbGsgPSBpcF9kYXRhLT5jZmcudGltaW5ncy50aW1pbmdzLnBpeGVsX2Nsb2NrOworCisJaWYgKG4gPT0gTlVMTCB8fCBjdHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBPYnRhaW4gY3VycmVudCBkZWVwIGNvbG9yIGNvbmZpZ3VyYXRpb24uIFRoaXMgbmVlZGVkCisJICogdG8gY2FsY3VsYXRlIHRoZSBUTURTIGNsb2NrIGJhc2VkIG9uIHRoZSBwaXhlbCBjbG9jay4KKwkgKi8KKwlyID0gUkVHX0dFVChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksIEhETUlfV1BfVklERU9fQ0ZHLCAxLCAwKTsKKwlzd2l0Y2ggKHIpIHsKKwljYXNlIDE6IC8qIE5vIGRlZXAgY29sb3Igc2VsZWN0ZWQgKi8KKwkJZGVlcF9jb2xvciA9IDEwMDsKKwkJYnJlYWs7CisJY2FzZSAyOiAvKiAxMC1iaXQgZGVlcCBjb2xvciBzZWxlY3RlZCAqLworCQlkZWVwX2NvbG9yID0gMTI1OworCQlicmVhazsKKwljYXNlIDM6IC8qIDEyLWJpdCBkZWVwIGNvbG9yIHNlbGVjdGVkICovCisJCWRlZXBfY29sb3IgPSAxNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2FtcGxlX2ZyZXEpIHsKKwljYXNlIDMyMDAwOgorCQlpZiAoKGRlZXBfY29sb3IgPT0gMTI1KSAmJiAoKHBjbGsgPT0gNTQwNTQpCisJCQkJfHwgKHBjbGsgPT0gNzQyNTApKSkKKwkJCSpuID0gODE5MjsKKwkJZWxzZQorCQkJKm4gPSA0MDk2OworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCQkqbiA9IDYyNzI7CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWlmICgoZGVlcF9jb2xvciA9PSAxMjUpICYmICgocGNsayA9PSA1NDA1NCkKKwkJCQl8fCAocGNsayA9PSA3NDI1MCkpKQorCQkJKm4gPSA4MTkyOworCQllbHNlCisJCQkqbiA9IDYxNDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpuID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2FsY3VsYXRlIENUUy4gU2VlIEhETUkgMS4zYSBvciAxLjRhIHNwZWNpZmljYXRpb25zICovCisJKmN0cyA9IHBjbGsgKiAoKm4gLyAxMjgpICogZGVlcF9jb2xvciAvIChzYW1wbGVfZnJlcSAvIDEwKTsKKworCXJldHVybiAwOworfQorCitpbnQgaGRtaV9hdWRpb190cmlnZ2VyKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IGVyciA9IDA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJUkVHX0ZMRF9NT0QoaGRtaV9hdl9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX0NPUkVfQVZfQVVEX01PREUsIDEsIDAsIDApOworCQlSRUdfRkxEX01PRChoZG1pX3dwX2Jhc2UoaXBfZGF0YSksCisJCQkJCUhETUlfV1BfQVVESU9fQ1RSTCwgMSwgMzEsIDMxKTsKKwkJUkVHX0ZMRF9NT0QoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX1dQX0FVRElPX0NUUkwsIDEsIDMwLCAzMCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCVJFR19GTERfTU9EKGhkbWlfYXZfYmFzZShpcF9kYXRhKSwKKwkJCQkJSERNSV9DT1JFX0FWX0FVRF9NT0RFLCAwLCAwLCAwKTsKKwkJUkVHX0ZMRF9NT0QoaGRtaV93cF9iYXNlKGlwX2RhdGEpLAorCQkJCQlIRE1JX1dQX0FVRElPX0NUUkwsIDAsIDMwLCAzMCk7CisJCVJFR19GTERfTU9EKGhkbWlfd3BfYmFzZShpcF9kYXRhKSwKKwkJCQkJSERNSV9XUF9BVURJT19DVFJMLCAwLCAzMSwgMzEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pXzR4eHhfaXAuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3RpX2hkbWlfNHh4eF9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDA5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy90aV9oZG1pXzR4eHhfaXAuaApAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIHRpX2hkbWlfNHh4eF9pcC5oCisgKgorICogSERNSSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IgRE04MXh4LCBETTM4eHgsIFRJIE9NQVA0IGV0YyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfSERNSV9USV80eHh4X0hfCisjZGVmaW5lIF9IRE1JX1RJXzR4eHhfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KKyNpbmNsdWRlICJ0aV9oZG1pLmgiCisjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSV9NT0RVTEUpCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2VuZGlmCisKKy8qIEhETUkgV3JhcHBlciAqLworCisjZGVmaW5lIEhETUlfV1BfUkVWSVNJT04JCQkweDAKKyNkZWZpbmUgSERNSV9XUF9TWVNDT05GSUcJCQkweDEwCisjZGVmaW5lIEhETUlfV1BfSVJRU1RBVFVTX1JBVwkJCTB4MjQKKyNkZWZpbmUgSERNSV9XUF9JUlFTVEFUVVMJCQkweDI4CisjZGVmaW5lIEhETUlfV1BfUFdSX0NUUkwJCQkweDQwCisjZGVmaW5lIEhETUlfV1BfSVJRRU5BQkxFX1NFVAkJCTB4MkMKKyNkZWZpbmUgSERNSV9XUF9WSURFT19DRkcJCQkweDUwCisjZGVmaW5lIEhETUlfV1BfVklERU9fU0laRQkJCTB4NjAKKyNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfSAkJCTB4NjgKKyNkZWZpbmUgSERNSV9XUF9WSURFT19USU1JTkdfVgkJCTB4NkMKKyNkZWZpbmUgSERNSV9XUF9XUF9DTEsJCQkJMHg3MAorI2RlZmluZSBIRE1JX1dQX0FVRElPX0NGRwkJCTB4ODAKKyNkZWZpbmUgSERNSV9XUF9BVURJT19DRkcyCQkJMHg4NAorI2RlZmluZSBIRE1JX1dQX0FVRElPX0NUUkwJCQkweDg4CisjZGVmaW5lIEhETUlfV1BfQVVESU9fREFUQQkJCTB4OEMKKworLyogSERNSSBJUCBDb3JlIFN5c3RlbSAqLworCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfVk5EX0lETAkJCTB4MAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFVl9JREwJCQkweDgKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERVZfSURICQkJMHhDCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfREVWX1JFVgkJCTB4MTAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19TUlNUCQkJMHgxNAorI2RlZmluZSBIRE1JX0NPUkVfQ1RSTDEJCQkJMHgyMAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX1NZU19TVEFUCQkJMHgyNAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX1ZJRF9BQ0VOCQkJMHgxMjQKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19WSURfTU9ERQkJCTB4MTI4CisjZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUl9TVEFURQkJMHgxQzAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSMQkJCTB4MUM0CisjZGVmaW5lIEhETUlfQ09SRV9TWVNfSU5UUjIJCQkweDFDOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0lOVFIzCQkJMHgxQ0MKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19JTlRSNAkJCTB4MUQwCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfVU1BU0sxCQkJMHgxRDQKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19UTURTX0NUUkwJCQkweDIwOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0RMWQkJCTB4QzgKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DVFJMCQkJMHhDQworI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX1RPUAkJCTB4RDAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9DTlRMCQkJMHhEOAorI2RlZmluZSBIRE1JX0NPUkVfU1lTX0RFX0NOVEgJCQkweERDCisjZGVmaW5lIEhETUlfQ09SRV9TWVNfREVfTElOTAkJCTB4RTAKKyNkZWZpbmUgSERNSV9DT1JFX1NZU19ERV9MSU5IXzEJCQkweEU0CisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9WRU5fRk9MTE9XVlNZTkMJMHgxCisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9IRU5fRk9MTE9XSFNZTkMJMHgxCisjZGVmaW5lIEhETUlfQ09SRV9DVFJMMV9CU0VMXzI0QklUQlVTCQkweDEKKyNkZWZpbmUgSERNSV9DT1JFX0NUUkwxX0VER0VfUklTSU5HRURHRQkweDEKKworLyogSERNSSBEREMgRS1ESUQgKi8KKyNkZWZpbmUgSERNSV9DT1JFX0REQ19DTUQJCQkweDNDQworI2RlZmluZSBIRE1JX0NPUkVfRERDX1NUQVRVUwkJCTB4M0M4CisjZGVmaW5lIEhETUlfQ09SRV9ERENfQUREUgkJCTB4M0I0CisjZGVmaW5lIEhETUlfQ09SRV9ERENfT0ZGU0VUCQkJMHgzQkMKKyNkZWZpbmUgSERNSV9DT1JFX0REQ19DT1VOVDEJCQkweDNDMAorI2RlZmluZSBIRE1JX0NPUkVfRERDX0NPVU5UMgkJCTB4M0M0CisjZGVmaW5lIEhETUlfQ09SRV9ERENfREFUQQkJCTB4M0QwCisjZGVmaW5lIEhETUlfQ09SRV9ERENfU0VHTQkJCTB4M0I4CisKKy8qIEhETUkgSVAgQ29yZSBBdWRpbyBWaWRlbyAqLworCisjZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQkweEJDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9EUEQJCQkweEY0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9QQl9DVFJMMQkJCTB4RjgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwyCQkJMHhGQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX1RZUEUJCQkweDEwMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX1ZFUlMJCQkweDEwNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0xFTgkJCTB4MTA4CisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfQ0hTVU0JCQkweDEwQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVZJX0RCWVRFKG4pCQkobiAqIDQgKyAweDExMCkKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9EQllURV9ORUxFTVMJCTE1CisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfREJZVEUobikJCShuICogNCArIDB4MTkwKQorI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX05FTEVNUwkJMjcKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRF9EQllURShuKQkJKG4gKiA0ICsgMHgyMTApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURfREJZVEVfTkVMRU1TCQkxMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19EQllURShuKQkJKG4gKiA0ICsgMHgyOTApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX05FTEVNUwkJMjcKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0dFTl9EQllURShuKQkJKG4gKiA0ICsgMHgzMDApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfTkVMRU1TCQkzMQorI2RlZmluZSBIRE1JX0NPUkVfQVZfR0VOMl9EQllURShuKQkJKG4gKiA0ICsgMHgzODApCisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX05FTEVNUwkJMzEKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FDUl9DVFJMCQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9GUkVRX1NWQUwJCQkweDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX05fU1ZBTDEJCQkweEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX05fU1ZBTDIJCQkweDEwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9OX1NWQUwzCQkJMHgxNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwxCQkJMHgxOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwyCQkJMHgxQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX1NWQUwzCQkJMHgyMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwxCQkJMHgyNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwyCQkJMHgyOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQ1RTX0hWQUwzCQkJMHgyQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX01PREUJCQkweDUwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERJRl9DVFJMCQkJMHg1NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSFdfU1BESUZfRlMJCTB4NjAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1NXQVBfSTJTCQkJMHg2NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BESUZfRVJUSAkJCTB4NkMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19JTl9NQVAJCQkweDcwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9JMlNfSU5fQ1RSTAkJMHg3NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QwCQkJMHg3OAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QxCQkJMHg3QworI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1QyCQkJMHg4MAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1Q0CQkJMHg4NAorI2RlZmluZSBIRE1JX0NPUkVfQVZfSTJTX0NIU1Q1CQkJMHg4OAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVNSQwkJCTB4OEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0kyU19JTl9MRU4JCQkweDkwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9IRE1JX0NUUkwJCQkweEJDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURPX1RYU1RBVAkJMHhDMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMQkJMHhDQworI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMgkJMHhEMAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVEX1BBUl9CVVNDTEtfMwkJMHhENAorI2RlZmluZSBIRE1JX0NPUkVfQVZfVEVTVF9UWENUUkwJCTB4RjAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0RQRAkJCTB4RjQKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1BCX0NUUkwxCQkJMHhGOAorI2RlZmluZSBIRE1JX0NPUkVfQVZfUEJfQ1RSTDIJCQkweEZDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVFlQRQkJCTB4MTAwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfVkVSUwkJCTB4MTA0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVklfTEVOCQkJMHgxMDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FWSV9DSFNVTQkJCTB4MTBDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVFlQRQkJCTB4MTgwCisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfVkVSUwkJCTB4MTg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9TUERfTEVOCQkJMHgxODgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX1NQRF9DSFNVTQkJCTB4MThDCisjZGVmaW5lIEhETUlfQ09SRV9BVl9BVURJT19UWVBFCQkJMHgyMDAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX1ZFUlMJCQkweDIwNAorI2RlZmluZSBIRE1JX0NPUkVfQVZfQVVESU9fTEVOCQkJMHgyMDgKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0FVRElPX0NIU1VNCQkweDIwQworI2RlZmluZSBIRE1JX0NPUkVfQVZfTVBFR19UWVBFCQkJMHgyODAKKyNkZWZpbmUgSERNSV9DT1JFX0FWX01QRUdfVkVSUwkJCTB4Mjg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0xFTgkJCTB4Mjg4CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0NIU1VNCQkJMHgyOEMKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0NQX0JZVEUxCQkJMHgzN0MKKyNkZWZpbmUgSERNSV9DT1JFX0FWX0NFQ19BRERSX0lECQkweDNGQworI2RlZmluZSBIRE1JX0NPUkVfQVZfU1BEX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU4yX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9NUEVHX0RCWVRFX0VMU0laRQkJMHg0CisjZGVmaW5lIEhETUlfQ09SRV9BVl9HRU5fREJZVEVfRUxTSVpFCQkweDQKKworLyogUExMICovCisKKyNkZWZpbmUgUExMQ1RSTF9QTExfQ09OVFJPTAkJCTB4MAorI2RlZmluZSBQTExDVFJMX1BMTF9TVEFUVVMJCQkweDQKKyNkZWZpbmUgUExMQ1RSTF9QTExfR08JCQkJMHg4CisjZGVmaW5lIFBMTENUUkxfQ0ZHMQkJCQkweEMKKyNkZWZpbmUgUExMQ1RSTF9DRkcyCQkJCTB4MTAKKyNkZWZpbmUgUExMQ1RSTF9DRkczCQkJCTB4MTQKKyNkZWZpbmUgUExMQ1RSTF9DRkc0CQkJCTB4MjAKKworLyogSERNSSBQSFkgKi8KKworI2RlZmluZSBIRE1JX1RYUEhZX1RYX0NUUkwJCQkweDAKKyNkZWZpbmUgSERNSV9UWFBIWV9ESUdJVEFMX0NUUkwJCQkweDQKKyNkZWZpbmUgSERNSV9UWFBIWV9QT1dFUl9DVFJMCQkJMHg4CisjZGVmaW5lIEhETUlfVFhQSFlfUEFEX0NGR19DVFJMCQkJMHhDCisKKyNkZWZpbmUgUkVHX0ZMRF9NT0QoYmFzZSwgaWR4LCB2YWwsIHN0YXJ0LCBlbmQpIFwKKwloZG1pX3dyaXRlX3JlZyhiYXNlLCBpZHgsIEZMRF9NT0QoaGRtaV9yZWFkX3JlZyhiYXNlLCBpZHgpLFwKKwkJCQkJCQl2YWwsIHN0YXJ0LCBlbmQpKQorI2RlZmluZSBSRUdfR0VUKGJhc2UsIGlkeCwgc3RhcnQsIGVuZCkgXAorCUZMRF9HRVQoaGRtaV9yZWFkX3JlZyhiYXNlLCBpZHgpLCBzdGFydCwgZW5kKQorCitlbnVtIGhkbWlfcGh5X3B3ciB7CisJSERNSV9QSFlQV1JDTURfT0ZGID0gMCwKKwlIRE1JX1BIWVBXUkNNRF9MRE9PTiA9IDEsCisJSERNSV9QSFlQV1JDTURfVFhPTiA9IDIKK307CisKK2VudW0gaGRtaV9jb3JlX2lucHV0YnVzX3dpZHRoIHsKKwlIRE1JX0lOUFVUXzhCSVQgPSAwLAorCUhETUlfSU5QVVRfMTBCSVQgPSAxLAorCUhETUlfSU5QVVRfMTJCSVQgPSAyCit9OworCitlbnVtIGhkbWlfY29yZV9kaXRoZXJfdHJ1bmMgeworCUhETUlfT1VUUFVUVFJVTkNBVElPTl84QklUID0gMCwKKwlIRE1JX09VVFBVVFRSVU5DQVRJT05fMTBCSVQgPSAxLAorCUhETUlfT1VUUFVUVFJVTkNBVElPTl8xMkJJVCA9IDIsCisJSERNSV9PVVRQVVRESVRIRVJfOEJJVCA9IDMsCisJSERNSV9PVVRQVVRESVRIRVJfMTBCSVQgPSA0LAorCUhETUlfT1VUUFVURElUSEVSXzEyQklUID0gNQorfTsKKworZW51bSBoZG1pX2NvcmVfZGVlcGNvbG9yX2VkIHsKKwlIRE1JX0RFRVBDT0xPUlBBQ0tFQ1RESVNBQkxFID0gMCwKKwlIRE1JX0RFRVBDT0xPUlBBQ0tFQ1RFTkFCTEUgPSAxCit9OworCitlbnVtIGhkbWlfY29yZV9wYWNrZXRfbW9kZSB7CisJSERNSV9QQUNLRVRNT0RFUkVTRVJWRURWQUxVRSA9IDAsCisJSERNSV9QQUNLRVRNT0RFMjRCSVRQRVJQSVhFTCA9IDQsCisJSERNSV9QQUNLRVRNT0RFMzBCSVRQRVJQSVhFTCA9IDUsCisJSERNSV9QQUNLRVRNT0RFMzZCSVRQRVJQSVhFTCA9IDYsCisJSERNSV9QQUNLRVRNT0RFNDhCSVRQRVJQSVhFTCA9IDcKK307CisKK2VudW0gaGRtaV9jb3JlX3RjbGtzZWxjbGttdWx0IHsKKwlIRE1JX0ZQTEwwNUlEQ0sgPSAwLAorCUhETUlfRlBMTDEwSURDSyA9IDEsCisJSERNSV9GUExMMjBJRENLID0gMiwKKwlIRE1JX0ZQTEw0MElEQ0sgPSAzCit9OworCitlbnVtIGhkbWlfY29yZV9wYWNrZXRfY3RybCB7CisJSERNSV9QQUNLRVRFTkFCTEUgPSAxLAorCUhETUlfUEFDS0VURElTQUJMRSA9IDAsCisJSERNSV9QQUNLRVRSRVBFQVRPTiA9IDEsCisJSERNSV9QQUNLRVRSRVBFQVRPRkYgPSAwCit9OworCisvKiBJTkZPRlJBTUVfQVZJXyBhbmQgSU5GT0ZSQU1FX0FVRElPXyBkZWZpbml0aW9ucyAqLworZW51bSBoZG1pX2NvcmVfaW5mb2ZyYW1lIHsKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxWV9SR0IgPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFZX1lVVjQyMiA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVlfWVVWNDQ0ID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQV9BQ1RJVkVfRk9STUFUX09GRiA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMUFfQUNUSVZFX0ZPUk1BVF9PTiA9ICAxLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjFCX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9WRVJUID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9IT1JJID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIxQl9WRVJUSE9SSSA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMCA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMVNfMiA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfTk8gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJDX0lUVTYwMSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMkNfSVRVNzA5ID0gMiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyQ19FQ19FWFRFTkRFRCA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCMk1fTk8gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJNXzQzID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyTV8xNjkgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSX1NBTUUgPSA4LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjJSXzQzID0gOSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyUl8xNjkgPSAxMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIyUl8xNDkgPSAxMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzSVRDX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzSVRDX1lFUyA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM0VDX1hWWVVWNjAxID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzRUNfWFZZVVY3MDkgPSAxLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0RFRkFVTFQgPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNRX0xSID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzUV9GUiA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREIzU0NfSE9SSSA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCM1NDX1ZFUlQgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjNTQ19IT1JJVkVSVCA9IDMsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSX05PID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfMiA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzMgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl80ID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfNSA9IDQsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzYgPSA1LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl83ID0gNiwKKwlIRE1JX0lORk9GUkFNRV9BVklfREI1UFJfOCA9IDcsCisJSERNSV9JTkZPRlJBTUVfQVZJX0RCNVBSXzkgPSA4LAorCUhETUlfSU5GT0ZSQU1FX0FWSV9EQjVQUl8xMCA9IDksCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRlJPTV9TVFJFQU0gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0lFQzYwOTU4ID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BQzMgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX01QRUcxID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NUDMgPSA0LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX01QRUcyX01VTFRJQ0ggPSA1LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMUNUX0FBQyA9IDYsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfRFRTID0gNywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9BVFJBQyA9IDgsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIxQ1RfT05FQklUID0gOSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9ET0xCWV9ESUdJVEFMX1BMVVMgPSAxMCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9EVFNfSEQgPSAxMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9NQVQgPSAxMiwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9EU1QgPSAxMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjFDVF9XTUFfUFJPID0gMTQsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfRlJPTV9TVFJFQU0gPSAwLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzMyMDAwID0gMSwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl80NDEwMCA9IDIsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfNDgwMDAgPSAzLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNGXzg4MjAwID0gNCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl85NjAwMCA9IDUsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU0ZfMTc2NDAwID0gNiwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTRl8xOTIwMDAgPSA3LAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTX0ZST01fU1RSRUFNID0gMCwKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjJTU18xNkJJVCA9IDEsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREIyU1NfMjBCSVQgPSAyLAorCUhETUlfSU5GT0ZSQU1FX0FVRElPX0RCMlNTXzI0QklUID0gMywKKwlIRE1JX0lORk9GUkFNRV9BVURJT19EQjVfRE1fSU5IX1BFUk1JVFRFRCA9IDAsCisJSERNSV9JTkZPRlJBTUVfQVVESU9fREI1X0RNX0lOSF9QUk9ISUJJVEVEID0gMQorfTsKKworZW51bSBoZG1pX3BhY2tpbmdfbW9kZSB7CisJSERNSV9QQUNLXzEwYl9SR0JfWVVWNDQ0ID0gMCwKKwlIRE1JX1BBQ0tfMjRiX1JHQl9ZVVY0NDRfWVVWNDIyID0gMSwKKwlIRE1JX1BBQ0tfMjBiX1lVVjQyMiA9IDIsCisJSERNSV9QQUNLX0FMUkVBRFlQQUNLRUQgPSA3Cit9OworCitlbnVtIGhkbWlfY29yZV9hdWRpb19zYW1wbGVfZnJlcSB7CisJSERNSV9BVURJT19GU18zMjAwMCA9IDB4MywKKwlIRE1JX0FVRElPX0ZTXzQ0MTAwID0gMHgwLAorCUhETUlfQVVESU9fRlNfNDgwMDAgPSAweDIsCisJSERNSV9BVURJT19GU184ODIwMCA9IDB4OCwKKwlIRE1JX0FVRElPX0ZTXzk2MDAwID0gMHhBLAorCUhETUlfQVVESU9fRlNfMTc2NDAwID0gMHhDLAorCUhETUlfQVVESU9fRlNfMTkyMDAwID0gMHhFLAorCUhETUlfQVVESU9fRlNfTk9UX0lORElDQVRFRCA9IDB4MQorfTsKKworZW51bSBoZG1pX2NvcmVfYXVkaW9fbGF5b3V0IHsKKwlIRE1JX0FVRElPX0xBWU9VVF8yQ0ggPSAwLAorCUhETUlfQVVESU9fTEFZT1VUXzhDSCA9IDEKK307CisKK2VudW0gaGRtaV9jb3JlX2N0c19tb2RlIHsKKwlIRE1JX0FVRElPX0NUU19NT0RFX0hXID0gMCwKKwlIRE1JX0FVRElPX0NUU19NT0RFX1NXID0gMQorfTsKKworZW51bSBoZG1pX3N0ZXJlb19jaGFubmVscyB7CisJSERNSV9BVURJT19TVEVSRU9fTk9DSEFOTkVMUyA9IDAsCisJSERNSV9BVURJT19TVEVSRU9fT05FQ0hBTk5FTCA9IDEsCisJSERNSV9BVURJT19TVEVSRU9fVFdPQ0hBTk5FTFMgPSAyLAorCUhETUlfQVVESU9fU1RFUkVPX1RIUkVFQ0hBTk5FTFMgPSAzLAorCUhETUlfQVVESU9fU1RFUkVPX0ZPVVJDSEFOTkVMUyA9IDQKK307CisKK2VudW0gaGRtaV9hdWRpb190eXBlIHsKKwlIRE1JX0FVRElPX1RZUEVfTFBDTSA9IDAsCisJSERNSV9BVURJT19UWVBFX0lFQyA9IDEKK307CisKK2VudW0gaGRtaV9hdWRpb19qdXN0aWZ5IHsKKwlIRE1JX0FVRElPX0pVU1RJRllfTEVGVCA9IDAsCisJSERNSV9BVURJT19KVVNUSUZZX1JJR0hUID0gMQorfTsKKworZW51bSBoZG1pX2F1ZGlvX3NhbXBsZV9vcmRlciB7CisJSERNSV9BVURJT19TQU1QTEVfUklHSFRfRklSU1QgPSAwLAorCUhETUlfQVVESU9fU0FNUExFX0xFRlRfRklSU1QgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9fc2FtcGxlc19wZXJ3b3JkIHsKKwlIRE1JX0FVRElPX09ORVdPUkRfT05FU0FNUExFID0gMCwKKwlIRE1JX0FVRElPX09ORVdPUkRfVFdPU0FNUExFUyA9IDEKK307CisKK2VudW0gaGRtaV9hdWRpb19zYW1wbGVfc2l6ZSB7CisJSERNSV9BVURJT19TQU1QTEVfMTZCSVRTID0gMCwKKwlIRE1JX0FVRElPX1NBTVBMRV8yNEJJVFMgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9fdHJhbnNmX21vZGUgeworCUhETUlfQVVESU9fVFJBTlNGX0RNQSA9IDAsCisJSERNSV9BVURJT19UUkFOU0ZfSVJRID0gMQorfTsKKworZW51bSBoZG1pX2F1ZGlvX2Jsa19zdHJ0X2VuZF9zaWcgeworCUhETUlfQVVESU9fQkxPQ0tfU0lHX1NUQVJURU5EX09OID0gMCwKKwlIRE1JX0FVRElPX0JMT0NLX1NJR19TVEFSVEVORF9PRkYgPSAxCit9OworCitlbnVtIGhkbWlfYXVkaW9faTJzX2NvbmZpZyB7CisJSERNSV9BVURJT19JMlNfV1NfUE9MQVJJVFlfTE9XX0lTX0xFRlQgPSAwLAorCUhETUlfQVVESU9fSTJTX1dTX1BPTEFSSVRfWUxPV19JU19SSUdIVCA9IDEsCisJSERNSV9BVURJT19JMlNfTVNCX1NISUZURURfRklSU1QgPSAwLAorCUhETUlfQVVESU9fSTJTX0xTQl9TSElGVEVEX0ZJUlNUID0gMSwKKwlIRE1JX0FVRElPX0kyU19NQVhfV09SRF8yMEJJVFMgPSAwLAorCUhETUlfQVVESU9fSTJTX01BWF9XT1JEXzI0QklUUyA9IDEsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEX05PVF9TUEVDSUZJRUQgPSAwLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xNl9CSVRTID0gMSwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMTdfQklUUyA9IDYsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzE4X0JJVFMgPSAyLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8xOV9CSVRTID0gNCwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjBfQklUU18yME1BWCA9IDUsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIwX0JJVFNfMjRNQVggPSAxLAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yMV9CSVRTID0gNiwKKwlIRE1JX0FVRElPX0kyU19DSFNUX1dPUkRfMjJfQklUUyA9IDIsCisJSERNSV9BVURJT19JMlNfQ0hTVF9XT1JEXzIzX0JJVFMgPSA0LAorCUhETUlfQVVESU9fSTJTX0NIU1RfV09SRF8yNF9CSVRTID0gNSwKKwlIRE1JX0FVRElPX0kyU19TQ0tfRURHRV9GQUxMSU5HID0gMCwKKwlIRE1JX0FVRElPX0kyU19TQ0tfRURHRV9SSVNJTkcgPSAxLAorCUhETUlfQVVESU9fSTJTX1ZCSVRfRk9SX1BDTSA9IDAsCisJSERNSV9BVURJT19JMlNfVkJJVF9GT1JfQ09NUFJFU1NFRCA9IDEsCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIX05BID0gMCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMTYgPSAyLAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xNyA9IDEyLAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8xOCA9IDQsCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzE5ID0gOCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjAgPSAxMCwKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjEgPSAxMywKKwlIRE1JX0FVRElPX0kyU19JTlBVVF9MRU5HVEhfMjIgPSA1LAorCUhETUlfQVVESU9fSTJTX0lOUFVUX0xFTkdUSF8yMyA9IDksCisJSERNSV9BVURJT19JMlNfSU5QVVRfTEVOR1RIXzI0ID0gMTEsCisJSERNSV9BVURJT19JMlNfRklSU1RfQklUX1NISUZUID0gMCwKKwlIRE1JX0FVRElPX0kyU19GSVJTVF9CSVRfTk9fU0hJRlQgPSAxLAorCUhETUlfQVVESU9fSTJTX1NEMF9FTiA9IDEsCisJSERNSV9BVURJT19JMlNfU0QxX0VOID0gMSA8PCAxLAorCUhETUlfQVVESU9fSTJTX1NEMl9FTiA9IDEgPDwgMiwKKwlIRE1JX0FVRElPX0kyU19TRDNfRU4gPSAxIDw8IDMsCit9OworCitlbnVtIGhkbWlfYXVkaW9fbWNsa19tb2RlIHsKKwlIRE1JX0FVRElPX01DTEtfMTI4RlMgPSAwLAorCUhETUlfQVVESU9fTUNMS18yNTZGUyA9IDEsCisJSERNSV9BVURJT19NQ0xLXzM4NEZTID0gMiwKKwlIRE1JX0FVRElPX01DTEtfNTEyRlMgPSAzLAorCUhETUlfQVVESU9fTUNMS183NjhGUyA9IDQsCisJSERNSV9BVURJT19NQ0xLXzEwMjRGUyA9IDUsCisJSERNSV9BVURJT19NQ0xLXzExNTJGUyA9IDYsCisJSERNSV9BVURJT19NQ0xLXzE5MkZTID0gNworfTsKKworc3RydWN0IGhkbWlfY29yZV92aWRlb19jb25maWcgeworCWVudW0gaGRtaV9jb3JlX2lucHV0YnVzX3dpZHRoCWlwX2J1c193aWR0aDsKKwllbnVtIGhkbWlfY29yZV9kaXRoZXJfdHJ1bmMJb3BfZGl0aGVyX3RydWM7CisJZW51bSBoZG1pX2NvcmVfZGVlcGNvbG9yX2VkCWRlZXBfY29sb3JfcGt0OworCWVudW0gaGRtaV9jb3JlX3BhY2tldF9tb2RlCXBrdF9tb2RlOworCWVudW0gaGRtaV9jb3JlX2hkbWlfZHZpCQloZG1pX2R2aTsKKwllbnVtIGhkbWlfY29yZV90Y2xrc2VsY2xrbXVsdAl0Y2xrX3NlbF9jbGttdWx0OworfTsKKworLyoKKyAqIFJlZmVyIHRvIHNlY3Rpb24gOC4yIGluIEhETUkgMS4zIHNwZWNpZmljYXRpb24gZm9yCisgKiBkZXRhaWxzIGFib3V0IGluZm9mcmFtZSBkYXRhYnl0ZXMKKyAqLworc3RydWN0IGhkbWlfY29yZV9pbmZvZnJhbWVfYXZpIHsKKwkvKiBZMCwgWTEgcmdiLHlDYkNyICovCisJdTgJZGIxX2Zvcm1hdDsKKwkvKiBBMCAgQWN0aXZlIGluZm9ybWF0aW9uIFByZXNlbnQgKi8KKwl1OAlkYjFfYWN0aXZlX2luZm87CisJLyogQjAsIEIxIEJhciBpbmZvIGRhdGEgdmFsaWQgKi8KKwl1OAlkYjFfYmFyX2luZm9fZHY7CisJLyogUzAsIFMxIHNjYW4gaW5mb3JtYXRpb24gKi8KKwl1OAlkYjFfc2Nhbl9pbmZvOworCS8qIEMwLCBDMSBjb2xvcmltZXRyeSAqLworCXU4CWRiMl9jb2xvcmltZXRyeTsKKwkvKiBNMCwgTTEgQXNwZWN0IHJhdGlvICg0OjMsIDE2OjkpICovCisJdTgJZGIyX2FzcGVjdF9yYXRpbzsKKwkvKiBSMC4uLlIzIEFjdGl2ZSBmb3JtYXQgYXNwZWN0IHJhdGlvICovCisJdTgJZGIyX2FjdGl2ZV9mbXRfYXI7CisJLyogSVRDIElUIGNvbnRlbnQuICovCisJdTgJZGIzX2l0YzsKKwkvKiBFQzAsIEVDMSwgRUMyIEV4dGVuZGVkIGNvbG9yaW1ldHJ5ICovCisJdTgJZGIzX2VjOworCS8qIFExLCBRMCBRdWFudGl6YXRpb24gcmFuZ2UgKi8KKwl1OAlkYjNfcV9yYW5nZTsKKwkvKiBTQzEsIFNDMCBOb24tdW5pZm9ybSBwaWN0dXJlIHNjYWxpbmcgKi8KKwl1OAlkYjNfbnVwX3NjYWxpbmc7CisJLyogVklDMC4uNiBWaWRlbyBmb3JtYXQgaWRlbnRpZmljYXRpb24gKi8KKwl1OAlkYjRfdmlkZW9jb2RlOworCS8qIFBSMC4uUFIzIFBpeGVsIHJlcGV0aXRpb24gZmFjdG9yICovCisJdTgJZGI1X3BpeGVsX3JlcGVhdDsKKwkvKiBMaW5lIG51bWJlciBlbmQgb2YgdG9wIGJhciAqLworCXUxNglkYjZfN19saW5lX2VvZnRvcDsKKwkvKiBMaW5lIG51bWJlciBzdGFydCBvZiBib3R0b20gYmFyICovCisJdTE2CWRiOF85X2xpbmVfc29mYm90dG9tOworCS8qIFBpeGVsIG51bWJlciBlbmQgb2YgbGVmdCBiYXIgKi8KKwl1MTYJZGIxMF8xMV9waXhlbF9lb2ZsZWZ0OworCS8qIFBpeGVsIG51bWJlciBzdGFydCBvZiByaWdodCBiYXIgKi8KKwl1MTYJZGIxMl8xM19waXhlbF9zb2ZyaWdodDsKK307CisvKgorICogUmVmZXIgdG8gc2VjdGlvbiA4LjIgaW4gSERNSSAxLjMgc3BlY2lmaWNhdGlvbiBmb3IKKyAqIGRldGFpbHMgYWJvdXQgaW5mb2ZyYW1lIGRhdGFieXRlcworICovCitzdHJ1Y3QgaGRtaV9jb3JlX2luZm9mcmFtZV9hdWRpbyB7CisJdTggZGIxX2NvZGluZ190eXBlOworCXU4IGRiMV9jaGFubmVsX2NvdW50OworCXU4IGRiMl9zYW1wbGVfZnJlcTsKKwl1OCBkYjJfc2FtcGxlX3NpemU7CisJdTggZGI0X2NoYW5uZWxfYWxsb2M7CisJYm9vbCBkYjVfZG93bm1peF9pbmg7CisJdTggZGI1X2xzdjsJLyogTGV2ZWwgc2hpZnQgdmFsdWVzIGZvciBkb3dubWl4ICovCit9OworCitzdHJ1Y3QgaGRtaV9jb3JlX3BhY2tldF9lbmFibGVfcmVwZWF0IHsKKwl1MzIJYXVkaW9fcGt0OworCXUzMglhdWRpb19wa3RfcmVwZWF0OworCXUzMglhdmlfaW5mb2ZyYW1lOworCXUzMglhdmlfaW5mb2ZyYW1lX3JlcGVhdDsKKwl1MzIJZ2VuX2NudHJsX3BrdDsKKwl1MzIJZ2VuX2NudHJsX3BrdF9yZXBlYXQ7CisJdTMyCWdlbmVyaWNfcGt0OworCXUzMglnZW5lcmljX3BrdF9yZXBlYXQ7Cit9OworCitzdHJ1Y3QgaGRtaV92aWRlb19mb3JtYXQgeworCWVudW0gaGRtaV9wYWNraW5nX21vZGUJcGFja2luZ19tb2RlOworCXUzMgkJCXlfcmVzOwkvKiBMaW5lIHBlciBwYW5lbCAqLworCXUzMgkJCXhfcmVzOwkvKiBwaXhlbCBwZXIgbGluZSAqLworfTsKKworc3RydWN0IGhkbWlfdmlkZW9faW50ZXJmYWNlIHsKKwlpbnQJdnNwOwkvKiBWc3luYyBwb2xhcml0eSAqLworCWludAloc3A7CS8qIEhzeW5jIHBvbGFyaXR5ICovCisJaW50CWludGVybGFjaW5nOworCWludAl0bTsJLyogVGltaW5nIG1vZGUgKi8KK307CisKK3N0cnVjdCBoZG1pX2F1ZGlvX2Zvcm1hdCB7CisJZW51bSBoZG1pX3N0ZXJlb19jaGFubmVscwkJc3RlcmVvX2NoYW5uZWxzOworCXU4CQkJCQlhY3RpdmVfY2hubmxzX21zazsKKwllbnVtIGhkbWlfYXVkaW9fdHlwZQkJCXR5cGU7CisJZW51bSBoZG1pX2F1ZGlvX2p1c3RpZnkJCQlqdXN0aWZpY2F0aW9uOworCWVudW0gaGRtaV9hdWRpb19zYW1wbGVfb3JkZXIJCXNhbXBsZV9vcmRlcjsKKwllbnVtIGhkbWlfYXVkaW9fc2FtcGxlc19wZXJ3b3JkCQlzYW1wbGVzX3Blcl93b3JkOworCWVudW0gaGRtaV9hdWRpb19zYW1wbGVfc2l6ZQkJc2FtcGxlX3NpemU7CisJZW51bSBoZG1pX2F1ZGlvX2Jsa19zdHJ0X2VuZF9zaWcJZW5fc2lnX2Jsa19zdHJ0X2VuZDsKK307CisKK3N0cnVjdCBoZG1pX2F1ZGlvX2RtYSB7CisJdTgJCQkJdHJhbnNmZXJfc2l6ZTsKKwl1OAkJCQlibG9ja19zaXplOworCWVudW0gaGRtaV9hdWRpb190cmFuc2ZfbW9kZQltb2RlOworCXUxNgkJCQlmaWZvX3RocmVzaG9sZDsKK307CisKK3N0cnVjdCBoZG1pX2NvcmVfYXVkaW9faTJzX2NvbmZpZyB7CisJdTggd29yZF9tYXhfbGVuZ3RoOworCXU4IHdvcmRfbGVuZ3RoOworCXU4IGluX2xlbmd0aF9iaXRzOworCXU4IGp1c3RpZmljYXRpb247CisJdTggZW5faGlnaF9iaXRyYXRlX2F1ZDsKKwl1OCBzY2tfZWRnZV9tb2RlOworCXU4IGNiaXRfb3JkZXI7CisJdTggdmJpdDsKKwl1OCB3c19wb2xhcml0eTsKKwl1OCBkaXJlY3Rpb247CisJdTggc2hpZnQ7CisJdTggYWN0aXZlX3NkczsKK307CisKK3N0cnVjdCBoZG1pX2NvcmVfYXVkaW9fY29uZmlnIHsKKwlzdHJ1Y3QgaGRtaV9jb3JlX2F1ZGlvX2kyc19jb25maWcJaTJzX2NmZzsKKwllbnVtIGhkbWlfY29yZV9hdWRpb19zYW1wbGVfZnJlcQlmcmVxX3NhbXBsZTsKKwlib29sCQkJCQlmc19vdmVycmlkZTsKKwl1MzIJCQkJCW47CisJdTMyCQkJCQljdHM7CisJdTMyCQkJCQlhdWRfcGFyX2J1c2NsazsKKwllbnVtIGhkbWlfY29yZV9hdWRpb19sYXlvdXQJCWxheW91dDsKKwllbnVtIGhkbWlfY29yZV9jdHNfbW9kZQkJCWN0c19tb2RlOworCWJvb2wJCQkJCXVzZV9tY2xrOworCWVudW0gaGRtaV9hdWRpb19tY2xrX21vZGUJCW1jbGtfbW9kZTsKKwlib29sCQkJCQllbl9hY3JfcGt0OworCWJvb2wJCQkJCWVuX2RzZF9hdWRpbzsKKwlib29sCQkJCQllbl9wYXJhbGxlbF9hdWRfaW5wdXQ7CisJYm9vbAkJCQkJZW5fc3BkaWY7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSV9NT0RVTEUpCitpbnQgaGRtaV9hdWRpb190cmlnZ2VyKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpOworaW50IGhkbWlfY29uZmlnX2F1ZGlvX2FjcihzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCXUzMiBzYW1wbGVfZnJlcSwgdTMyICpuLCB1MzIgKmN0cyk7Cit2b2lkIGhkbWlfY29yZV9hdWRpb19pbmZvZnJhbWVfY29uZmlnKHN0cnVjdCBoZG1pX2lwX2RhdGEgKmlwX2RhdGEsCisJCXN0cnVjdCBoZG1pX2NvcmVfaW5mb2ZyYW1lX2F1ZGlvICppbmZvX2F1ZCk7Cit2b2lkIGhkbWlfY29yZV9hdWRpb19jb25maWcoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfY29yZV9hdWRpb19jb25maWcgKmNmZyk7Cit2b2lkIGhkbWlfd3BfYXVkaW9fY29uZmlnX2RtYShzdHJ1Y3QgaGRtaV9pcF9kYXRhICppcF9kYXRhLAorCQkJCQlzdHJ1Y3QgaGRtaV9hdWRpb19kbWEgKmF1ZF9kbWEpOwordm9pZCBoZG1pX3dwX2F1ZGlvX2NvbmZpZ19mb3JtYXQoc3RydWN0IGhkbWlfaXBfZGF0YSAqaXBfZGF0YSwKKwkJCQkJc3RydWN0IGhkbWlfYXVkaW9fZm9ybWF0ICphdWRfZm10KTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMKaW5kZXggMTczYzY2NC4uNzUzMzQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYwpAQCAtMjk1LDcgKzI5NSw2IEBACiAJdTMyIHdzc19kYXRhOwogCXN0cnVjdCByZWd1bGF0b3IgKnZkZGFfZGFjX3JlZzsKIAotCXN0cnVjdCBjbGsJKnR2X2NsazsKIAlzdHJ1Y3QgY2xrCSp0dl9kYWNfY2xrOwogfSB2ZW5jOwogCkBAIC00NjQsOSArNDYzLDExIEBACiAJcmVndWxhdG9yX2Rpc2FibGUodmVuYy52ZGRhX2RhY19yZWcpOwogfQogCi0KLQotCit1bnNpZ25lZCBsb25nIHZlbmNfZ2V0X3BpeGVsX2Nsb2NrKHZvaWQpCit7CisJLyogVkVOQyBQaXhlbCBDbG9jayBpbiBNaHogKi8KKwlyZXR1cm4gMTM1MDAwMDA7Cit9CiAKIC8qIGRyaXZlciAqLwogc3RhdGljIGludCB2ZW5jX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKQEAgLTczMiwyMiArNzMzLDEwIEBACiB7CiAJc3RydWN0IGNsayAqY2xrOwogCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCURTU0VSUigiY2FuJ3QgZ2V0IGZja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7Ci0JfQotCi0JdmVuYy50dl9jbGsgPSBjbGs7Ci0KIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfVkVOQ19SRVFVSVJFU19UVl9EQUNfQ0xLKSkgewotCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXAzNjMwKCkpCi0JCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfOTZtX2ZjayIpOwotCQllbHNlCi0JCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ0dl9kYWNfY2xrIik7CisJCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInR2X2RhY19jbGsiKTsKIAkJaWYgKElTX0VSUihjbGspKSB7CiAJCQlEU1NFUlIoImNhbid0IGdldCB0dl9kYWNfY2xrXG4iKTsKLQkJCWNsa19wdXQodmVuYy50dl9jbGspOwogCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAkJfQogCX0gZWxzZSB7CkBAIC03NjEsOCArNzUwLDYgQEAKIAogc3RhdGljIHZvaWQgdmVuY19wdXRfY2xvY2tzKHZvaWQpCiB7Ci0JaWYgKHZlbmMudHZfY2xrKQotCQljbGtfcHV0KHZlbmMudHZfY2xrKTsKIAlpZiAodmVuYy50dl9kYWNfY2xrKQogCQljbGtfcHV0KHZlbmMudHZfZGFjX2Nsayk7CiB9CkBAIC04MzgsNyArODI1LDYgQEAKIHsKIAlpZiAodmVuYy50dl9kYWNfY2xrKQogCQljbGtfZGlzYWJsZSh2ZW5jLnR2X2RhY19jbGspOwotCWNsa19kaXNhYmxlKHZlbmMudHZfY2xrKTsKIAogCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAJZHNzX3J1bnRpbWVfcHV0KCk7CkBAIC04NTgsNyArODQ0LDYgQEAKIAlpZiAociA8IDApCiAJCWdvdG8gZXJyX2dldF9kaXNwYzsKIAotCWNsa19lbmFibGUodmVuYy50dl9jbGspOwogCWlmICh2ZW5jLnR2X2RhY19jbGspCiAJCWNsa19lbmFibGUodmVuYy50dl9kYWNfY2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL0tjb25maWcKaW5kZXggYWEzMzM4Ni4uODNkM2ZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogbWVudWNvbmZpZyBGQl9PTUFQMgotICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorICAgICAgICB0cmlzdGF0ZSAiT01BUDIrIGZyYW1lIGJ1ZmZlciBzdXBwb3J0IgogICAgICAgICBkZXBlbmRzIG9uIEZCICYmIE9NQVAyX0RTUwogCiAJc2VsZWN0IE9NQVAyX1ZSQU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKaW5kZXggNmIxYWMyMy4uZGY3YmNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L29tYXBmYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jCmluZGV4IDYwMmI3MWEuLjcwYWE0N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwpAQCAtODA4LDE5ICs4MDgsMTUgQEAKIHN0YXRpYyB2b2lkIG9tYXBmYl9jYWxjX2FkZHIoY29uc3Qgc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCi0JCQkgICAgIGludCByb3RhdGlvbiwgdTMyICpwYWRkciwgdm9pZCBfX2lvbWVtICoqdmFkZHIpCisJCQkgICAgIGludCByb3RhdGlvbiwgdTMyICpwYWRkcikKIHsKIAl1MzIgZGF0YV9zdGFydF9wOwotCXZvaWQgX19pb21lbSAqZGF0YV9zdGFydF92OwogCWludCBvZmZzZXQ7CiAKLQlpZiAob2ZiaS0+cm90YXRpb25fdHlwZSA9PSBPTUFQX0RTU19ST1RfVlJGQikgeworCWlmIChvZmJpLT5yb3RhdGlvbl90eXBlID09IE9NQVBfRFNTX1JPVF9WUkZCKQogCQlkYXRhX3N0YXJ0X3AgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9yb3RfcGFkZHIob2ZiaSwgcm90YXRpb24pOwotCQlkYXRhX3N0YXJ0X3YgPSBOVUxMOwotCX0gZWxzZSB7CisJZWxzZQogCQlkYXRhX3N0YXJ0X3AgPSBvbWFwZmJfZ2V0X3JlZ2lvbl9wYWRkcihvZmJpKTsKLQkJZGF0YV9zdGFydF92ID0gb21hcGZiX2dldF9yZWdpb25fdmFkZHIob2ZiaSk7Ci0JfQogCiAJaWYgKG9mYmktPnJvdGF0aW9uX3R5cGUgPT0gT01BUF9EU1NfUk9UX1ZSRkIpCiAJCW9mZnNldCA9IGNhbGNfcm90YXRpb25fb2Zmc2V0X3ZyZmIodmFyLCBmaXgsIHJvdGF0aW9uKTsKQEAgLTgyOCwxNiArODI0LDE0IEBACiAJCW9mZnNldCA9IGNhbGNfcm90YXRpb25fb2Zmc2V0X2RtYSh2YXIsIGZpeCwgcm90YXRpb24pOwogCiAJZGF0YV9zdGFydF9wICs9IG9mZnNldDsKLQlkYXRhX3N0YXJ0X3YgKz0gb2Zmc2V0OwogCiAJaWYgKG9mZnNldCkKIAkJREJHKCJvZmZzZXQgJWQsICVkID0gJWRcbiIsCiAJCSAgICB2YXItPnhvZmZzZXQsIHZhci0+eW9mZnNldCwgb2Zmc2V0KTsKIAotCURCRygicGFkZHIgJXgsIHZhZGRyICVwXG4iLCBkYXRhX3N0YXJ0X3AsIGRhdGFfc3RhcnRfdik7CisJREJHKCJwYWRkciAleFxuIiwgZGF0YV9zdGFydF9wKTsKIAogCSpwYWRkciA9IGRhdGFfc3RhcnRfcDsKLQkqdmFkZHIgPSBkYXRhX3N0YXJ0X3Y7CiB9CiAKIC8qIHNldHVwIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBmYiAqLwpAQCAtODUwLDcgKzg0NCw2IEBACiAJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXggPSAmZmJpLT5maXg7CiAJZW51bSBvbWFwX2NvbG9yX21vZGUgbW9kZSA9IDA7CiAJdTMyIGRhdGFfc3RhcnRfcCA9IDA7Ci0Jdm9pZCBfX2lvbWVtICpkYXRhX3N0YXJ0X3YgPSBOVUxMOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCWludCB4cmVzLCB5cmVzOwogCWludCBzY3JlZW5fd2lkdGg7CkBAIC04ODAsOCArODczLDcgQEAKIAl9CiAKIAlpZiAob2ZiaS0+cmVnaW9uLT5zaXplKQotCQlvbWFwZmJfY2FsY19hZGRyKG9mYmksIHZhciwgZml4LCByb3RhdGlvbiwKLQkJCQkgJmRhdGFfc3RhcnRfcCwgJmRhdGFfc3RhcnRfdik7CisJCW9tYXBmYl9jYWxjX2FkZHIob2ZiaSwgdmFyLCBmaXgsIHJvdGF0aW9uLCAmZGF0YV9zdGFydF9wKTsKIAogCXIgPSBmYl9tb2RlX3RvX2Rzc19tb2RlKHZhciwgJm1vZGUpOwogCWlmIChyKSB7CkBAIC05MTAsNyArOTAyLDYgQEAKIAkJbWlycm9yID0gb2ZiaS0+bWlycm9yOwogCiAJaW5mby5wYWRkciA9IGRhdGFfc3RhcnRfcDsKLQlpbmZvLnZhZGRyID0gZGF0YV9zdGFydF92OwogCWluZm8uc2NyZWVuX3dpZHRoID0gc2NyZWVuX3dpZHRoOwogCWluZm8ud2lkdGggPSB4cmVzOwogCWluZm8uaGVpZ2h0ID0geXJlczsKQEAgLTIyNzYsNiArMjI2Nyw4NyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgdm9pZCBmYl92aWRlb21vZGVfdG9fb21hcF90aW1pbmdzKHN0cnVjdCBmYl92aWRlb21vZGUgKm0sCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnQpCit7CisJdC0+eF9yZXMgPSBtLT54cmVzOworCXQtPnlfcmVzID0gbS0+eXJlczsKKwl0LT5waXhlbF9jbG9jayA9IFBJQ09TMktIWihtLT5waXhjbG9jayk7CisJdC0+aHN3ID0gbS0+aHN5bmNfbGVuOworCXQtPmhmcCA9IG0tPnJpZ2h0X21hcmdpbjsKKwl0LT5oYnAgPSBtLT5sZWZ0X21hcmdpbjsKKwl0LT52c3cgPSBtLT52c3luY19sZW47CisJdC0+dmZwID0gbS0+bG93ZXJfbWFyZ2luOworCXQtPnZicCA9IG0tPnVwcGVyX21hcmdpbjsKK30KKworc3RhdGljIGludCBvbWFwZmJfZmluZF9iZXN0X21vZGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKK3sKKwlzdHJ1Y3QgZmJfbW9uc3BlY3MgKnNwZWNzOworCXU4ICplZGlkOworCWludCByLCBpLCBiZXN0X3hyZXMsIGJlc3RfaWR4LCBsZW47CisKKwlpZiAoIWRpc3BsYXktPmRyaXZlci0+cmVhZF9lZGlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxlbiA9IDB4ODAgKiAyOworCWVkaWQgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisKKwlyID0gZGlzcGxheS0+ZHJpdmVyLT5yZWFkX2VkaWQoZGlzcGxheSwgZWRpZCwgbGVuKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyMTsKKworCXNwZWNzID0ga3phbGxvYyhzaXplb2YoKnNwZWNzKSwgR0ZQX0tFUk5FTCk7CisKKwlmYl9lZGlkX3RvX21vbnNwZWNzKGVkaWQsIHNwZWNzKTsKKworCWlmIChlZGlkWzEyNl0gPiAwKQorCQlmYl9lZGlkX2FkZF9tb25zcGVjcyhlZGlkICsgMHg4MCwgc3BlY3MpOworCisJYmVzdF94cmVzID0gMDsKKwliZXN0X2lkeCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IHNwZWNzLT5tb2RlZGJfbGVuOyArK2kpIHsKKwkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbTsKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB0OworCisJCW0gPSAmc3BlY3MtPm1vZGVkYltpXTsKKworCQlpZiAobS0+cGl4Y2xvY2sgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNraXAgcmVwZWF0ZWQgcGl4ZWwgbW9kZXMgKi8KKwkJaWYgKG0tPnhyZXMgPT0gMjg4MCB8fCBtLT54cmVzID09IDE0NDApCisJCQljb250aW51ZTsKKworCQlmYl92aWRlb21vZGVfdG9fb21hcF90aW1pbmdzKG0sICZ0KTsKKworCQlyID0gZGlzcGxheS0+ZHJpdmVyLT5jaGVja190aW1pbmdzKGRpc3BsYXksICZ0KTsKKwkJaWYgKHIgPT0gMCAmJiBiZXN0X3hyZXMgPCBtLT54cmVzKSB7CisJCQliZXN0X3hyZXMgPSBtLT54cmVzOworCQkJYmVzdF9pZHggPSBpOworCQl9CisJfQorCisJaWYgKGJlc3RfeHJlcyA9PSAwKSB7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjI7CisJfQorCisJZmJfdmlkZW9tb2RlX3RvX29tYXBfdGltaW5ncygmc3BlY3MtPm1vZGVkYltiZXN0X2lkeF0sIHRpbWluZ3MpOworCisJciA9IDA7CisKK2VycjI6CisJZmJfZGVzdHJveV9tb2RlZGIoc3BlY3MtPm1vZGVkYik7CisJa2ZyZWUoc3BlY3MpOworZXJyMToKKwlrZnJlZShlZGlkKTsKKworCXJldHVybiByOworfQorCiBzdGF0aWMgaW50IG9tYXBmYl9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKIAkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewpAQCAtMjM3Myw4ICsyNDQ1LDEwIEBACiAJCW9tYXBfZHNzX2dldF9kZXZpY2UoZHNzZGV2KTsKIAogCQlpZiAoIWRzc2Rldi0+ZHJpdmVyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkcml2ZXIgZm9yIGRpc3BsYXlcbiIpOwotCQkJciA9IC1FTk9ERVY7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm8gZHJpdmVyIGZvciBkaXNwbGF5OiAlc1xuIiwKKwkJCQlkc3NkZXYtPm5hbWUpOworCQkJb21hcF9kc3NfcHV0X2RldmljZShkc3NkZXYpOworCQkJY29udGludWU7CiAJCX0KIAogCQlkID0gJmZiZGV2LT5kaXNwbGF5c1tmYmRldi0+bnVtX2Rpc3BsYXlzKytdOwpAQCAtMjQwMiw5ICsyNDc2LDI3IEBACiAJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fbWFuYWdlcnM7IGkrKykKIAkJZmJkZXYtPm1hbmFnZXJzW2ldID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihpKTsKIAorCS8qIGdmeCBvdmVybGF5IHNob3VsZCBiZSB0aGUgZGVmYXVsdCBvbmUuIGZpbmQgYSBkaXNwbGF5CisJICogY29ubmVjdGVkIHRvIHRoYXQsIGFuZCB1c2UgaXQgYXMgZGVmYXVsdCBkaXNwbGF5ICovCisJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoMCk7CisJaWYgKG92bC0+bWFuYWdlciAmJiBvdmwtPm1hbmFnZXItPmRldmljZSkgeworCQlkZWZfZGlzcGxheSA9IG92bC0+bWFuYWdlci0+ZGV2aWNlOworCX0gZWxzZSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgZmluZCBkZWZhdWx0IGRpc3BsYXlcbiIpOworCQlkZWZfZGlzcGxheSA9IE5VTEw7CisJfQorCiAJaWYgKGRlZl9tb2RlICYmIHN0cmxlbihkZWZfbW9kZSkgPiAwKSB7CiAJCWlmIChvbWFwZmJfcGFyc2VfZGVmX21vZGVzKGZiZGV2KSkKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjYW5ub3QgcGFyc2UgZGVmYXVsdCBtb2Rlc1xuIik7CisJfSBlbHNlIGlmIChkZWZfZGlzcGxheSAmJiBkZWZfZGlzcGxheS0+ZHJpdmVyLT5zZXRfdGltaW5ncyAmJgorCQkJZGVmX2Rpc3BsYXktPmRyaXZlci0+Y2hlY2tfdGltaW5ncykgeworCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHQ7CisKKwkJciA9IG9tYXBmYl9maW5kX2Jlc3RfbW9kZShkZWZfZGlzcGxheSwgJnQpOworCisJCWlmIChyID09IDApCisJCQlkZWZfZGlzcGxheS0+ZHJpdmVyLT5zZXRfdGltaW5ncyhkZWZfZGlzcGxheSwgJnQpOwogCX0KIAogCXIgPSBvbWFwZmJfY3JlYXRlX2ZyYW1lYnVmZmVycyhmYmRldik7CkBAIC0yNDIxLDE2ICsyNTEzLDYgQEAKIAogCURCRygibWdyLT5hcHBseSdlZFxuIik7CiAKLQkvKiBnZnggb3ZlcmxheSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgb25lLiBmaW5kIGEgZGlzcGxheQotCSAqIGNvbm5lY3RlZCB0byB0aGF0LCBhbmQgdXNlIGl0IGFzIGRlZmF1bHQgZGlzcGxheSAqLwotCW92bCA9IG9tYXBfZHNzX2dldF9vdmVybGF5KDApOwotCWlmIChvdmwtPm1hbmFnZXIgJiYgb3ZsLT5tYW5hZ2VyLT5kZXZpY2UpIHsKLQkJZGVmX2Rpc3BsYXkgPSBvdmwtPm1hbmFnZXItPmRldmljZTsKLQl9IGVsc2UgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgZGVmYXVsdCBkaXNwbGF5XG4iKTsKLQkJZGVmX2Rpc3BsYXkgPSBOVUxMOwotCX0KLQogCWlmIChkZWZfZGlzcGxheSkgewogCQlyID0gb21hcGZiX2luaXRfZGlzcGxheShmYmRldiwgZGVmX2Rpc3BsYXkpOwogCQlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwppbmRleCAxNTNiZjFhLi4xNjk0ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwpAQCAtMTA0LDE2ICsxMDQsMTQgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7Ci0JaW50IG1pcnJvcjsKKwlib29sIG1pcnJvcjsKIAlpbnQgcjsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gbmV3X3ZhcjsKIAotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmbWlycm9yKTsKKwlyID0gc3RydG9ib29sKGJ1ZiwgJm1pcnJvcik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JbWlycm9yID0gISFtaXJyb3I7Ci0KIAlpZiAoIWxvY2tfZmJfaW5mbyhmYmkpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCBmMjdhZTE2Li5hZTNjYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAKIAogLyogCi0gKiBQYXJzZSB1c2VyIHNwZWZpY2llZCBvcHRpb25zIChgdmlkZW89cGxhdGludW1mYjonKQorICogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAoYHZpZGVvPXBsYXRpbnVtZmI6JykKICAqLwogc3RhdGljIGludCBfX2luaXQgcGxhdGludW1mYl9zZXR1cChjaGFyICpvcHRpb25zKQogewpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHBsYXRpbnVtZmJfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gcGxhdGludW1mYl9wcm9iZSwKLQkucmVtb3ZlCQk9IHBsYXRpbnVtZmJfcmVtb3ZlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGxhdGludW1mYl9yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGludW1mYl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKaW5kZXggMjdmOTNhYS4uZGM3YmZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0yZmIuYwpAQCAtOTczLDggKzk3Myw4IEBACiB7CiAJc3RydWN0IHBtMmZiX3BhciAqcCA9IGluZm8tPnBhcjsKIAl1MzIgYmFzZTsKLQl1MzIgZGVwdGggPSAodmFyLT5iaXRzX3Blcl9waXhlbCArIDcpICYgfjc7Ci0JdTMyIHhyZXMgPSAodmFyLT54cmVzICsgMzEpICYgfjMxOworCXUzMiBkZXB0aCA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAmIH43OworCXUzMiB4cmVzID0gKGluZm8tPnZhci54cmVzICsgMzEpICYgfjMxOwogCiAJZGVwdGggPSAoZGVwdGggPiAzMikgPyAzMiA6IGRlcHRoOwogCWJhc2UgPSB0bzMyNjQodmFyLT55b2Zmc2V0ICogeHJlcyArIHZhci0+eG9mZnNldCwgZGVwdGgsIDEpOwpAQCAtMTc3Myw3ICsxNzczLDcgQEAKIAogI2lmbmRlZiBNT0RVTEUKIC8qKgotICogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucy4KKyAqIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMuCiAgKgogICogVGhpcyBpcywgY29tbWEtc2VwYXJhdGVkIG9wdGlvbnMgZm9sbG93aW5nIGB2aWRlbz1wbTJmYjonLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKaW5kZXggNjY2NmY0NS4uNjYzMmVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwpAQCAtMTE0Nyw5ICsxMTQ3LDkgQEAKIAkJCQkgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKLQljb25zdCB1MzIgeHJlcyA9ICh2YXItPnhyZXMgKyAzMSkgJiB+MzE7CisJY29uc3QgdTMyIHhyZXMgPSAoaW5mby0+dmFyLnhyZXMgKyAzMSkgJiB+MzE7CiAKLQlwYXItPmJhc2UgPSBwbTNmYl9zaGlmdF9icHAodmFyLT5iaXRzX3Blcl9waXhlbCwKKwlwYXItPmJhc2UgPSBwbTNmYl9zaGlmdF9icHAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAogCQkJCQkodmFyLT55b2Zmc2V0ICogeHJlcykKIAkJCQkJKyB2YXItPnhvZmZzZXQpOwogCVBNM19XQUlUKHBhciwgMSk7CkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogewogCWNoYXIgKnRoaXNfb3B0OwogCi0JLyogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAoYHZpZGVvPXBtM2ZiOicpICovCisJLyogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAoYHZpZGVvPXBtM2ZiOicpICovCiAJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMgYi9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvc2R1bS5jCmluZGV4IDVlYzRmMmQuLjUwZTAwMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMKKysrIGIvZHJpdmVycy92aWRlby9wbng0MDA4L3NkdW0uYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KIAogI2luY2x1ZGUgInNkdW0uaCIKICNpbmNsdWRlICJmYmNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wczNmYi5jIGIvZHJpdmVycy92aWRlby9wczNmYi5jCmluZGV4IDY1NTYwYTEuLjIxM2ZiYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHMzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJfQogCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEocHMzZmIuaXJxX25vLCBwczNmYl92c3luY19pbnRlcnJ1cHQsCi0JCQkgICAgIElSUUZfRElTQUJMRUQsIERFVklDRV9OQU1FLCAmZGV2LT5jb3JlKTsKKwkJCSAgICAgMCwgREVWSUNFX05BTUUsICZkZXYtPmNvcmUpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCQlyZXR2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGEzeHgtZ2N1LmMgYi9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYwppbmRleCAwMjgzYzcwLi4xZWQ4YjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YTN4eC1nY3UuYwpAQCAtMzEsOCArMzEsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KQEAgLTY3OCw3ICs2NzYsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHhhM3h4X2djdV9oYW5kbGVfaXJxLAotCQkJICBJUlFGX0RJU0FCTEVELCBEUlZfTkFNRSwgcHJpdik7CisJCQkgIDAsIERSVl9OQU1FLCBwcml2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5jIGIvZHJpdmVycy92aWRlby9weGFmYi5jCmluZGV4IDBmNGU4YzkuLjFkMWU0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKQEAgLTEzMDksMTYgKzEzMDksNiBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLWludCBweGFmYl9zbWFydF9xdWV1ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdWludDE2X3QgKmNtZHMsIGludCBuX2NtZHMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBweGFmYl9zbWFydF9mbHVzaChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHhhZmJfc21hcnRfaW5pdChzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpKSB7IHJldHVybiAwOyB9CiAjZW5kaWYgLyogQ09ORklHX0ZCX1BYQV9TTUFSVFBBTkVMICovCiAKQEAgLTIxOTEsNyArMjE4MSw3IEBACiAJCWdvdG8gZmFpbGVkX2ZyZWVfbWVtOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHhhZmJfaGFuZGxlX2lycSwgSVJRRl9ESVNBQkxFRCwgIkxDRCIsIGZiaSk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBweGFmYl9oYW5kbGVfaXJxLCAwLCAiTENEIiwgZmJpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MtZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjLWZiLmMKaW5kZXggNGFlY2YyMS4uMDc1M2IxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYy1mYi5jCkBAIC04MSw2ICs4MSw3IEBACiAgKiBAcGFsZXR0ZTogQWRkcmVzcyBvZiBwYWxldHRlIG1lbW9yeSwgb3IgMCBpZiBub25lLgogICogQGhhc19wcnRjb246IFNldCBpZiBoYXMgUFJUQ09OIHJlZ2lzdGVyLgogICogQGhhc19zaGFkb3djb246IFNldCBpZiBoYXMgU0hBRE9XQ09OIHJlZ2lzdGVyLgorICogQGhhc19jbGtzZWw6IFNldCBpZiBWSURDT04wIHJlZ2lzdGVyIGhhcyBDTEtTRUwgYml0LgogICovCiBzdHJ1Y3QgczNjX2ZiX3ZhcmlhbnQgewogCXVuc2lnbmVkIGludAlpc18yNDQzOjE7CkBAIC05OCw2ICs5OSw3IEBACiAKIAl1bnNpZ25lZCBpbnQJaGFzX3BydGNvbjoxOwogCXVuc2lnbmVkIGludAloYXNfc2hhZG93Y29uOjE7CisJdW5zaWduZWQgaW50CWhhc19jbGtzZWw6MTsKIH07CiAKIC8qKgpAQCAtMTg2LDYgKzE4OCw3IEBACiAgKiBAZGV2OiBUaGUgZGV2aWNlIHRoYXQgd2UgYm91bmQgdG8sIGZvciBwcmludGluZywgZXRjLgogICogQHJlZ3NfcmVzOiBUaGUgcmVzb3VyY2Ugd2UgY2xhaW1lZCBmb3IgdGhlIElPIHJlZ2lzdGVycy4KICAqIEBidXNfY2xrOiBUaGUgY2xrIChoY2xrKSBmZWVkaW5nIG91ciBpbnRlcmZhY2UgYW5kIHBvc3NpYmx5IHBpeGNsay4KKyAqIEBsY2RfY2xrOiBUaGUgY2xrIChzY2xrKSBmZWVkaW5nIHBpeGNsay4KICAqIEByZWdzOiBUaGUgbWFwcGVkIGhhcmR3YXJlIHJlZ2lzdGVycy4KICAqIEB2YXJpYW50OiBWYXJpYW50IGluZm9ybWF0aW9uIGZvciB0aGlzIGhhcmR3YXJlLgogICogQGVuYWJsZWQ6IEEgYml0bWFzayBvZiBlbmFibGVkIGhhcmR3YXJlIHdpbmRvd3MuCkBAIC0yMDAsNiArMjAzLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCByZXNvdXJjZQkJKnJlZ3NfcmVzOwogCXN0cnVjdCBjbGsJCSpidXNfY2xrOworCXN0cnVjdCBjbGsJCSpsY2RfY2xrOwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IHMzY19mYl92YXJpYW50CSB2YXJpYW50OwogCkBAIC0zMzYsMTAgKzM0MCwxNSBAQAogICovCiBzdGF0aWMgaW50IHMzY19mYl9jYWxjX3BpeGNsayhzdHJ1Y3QgczNjX2ZiICpzZmIsIHVuc2lnbmVkIGludCBwaXhjbGspCiB7Ci0JdW5zaWduZWQgbG9uZyBjbGsgPSBjbGtfZ2V0X3JhdGUoc2ZiLT5idXNfY2xrKTsKKwl1bnNpZ25lZCBsb25nIGNsazsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOwogCXVuc2lnbmVkIGludCByZXN1bHQ7CiAKKwlpZiAoc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsayA9IGNsa19nZXRfcmF0ZShzZmItPmJ1c19jbGspOworCWVsc2UKKwkJY2xrID0gY2xrX2dldF9yYXRlKHNmYi0+bGNkX2Nsayk7CisKIAl0bXAgPSAodW5zaWduZWQgbG9uZyBsb25nKWNsazsKIAl0bXAgKj0gcGl4Y2xrOwogCkBAIC04ODMsNyArODkyLDcgQEAKIAkJfQogCX0KIAkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgZGlzcGxheWVkIGFyZWEgKi8KLQllbmRfYm9mZiA9IHN0YXJ0X2JvZmYgKyB2YXItPnlyZXMgKiBpbmZvLT5maXgubGluZV9sZW5ndGg7CisJZW5kX2JvZmYgPSBzdGFydF9ib2ZmICsgaW5mby0+dmFyLnlyZXMgKiBpbmZvLT5maXgubGluZV9sZW5ndGg7CiAKIAkvKiBUZW1wb3JhcmlseSB0dXJuIG9mZiBwZXItdnN5bmMgdXBkYXRlIGZyb20gc2hhZG93IHJlZ2lzdGVycyB1bnRpbAogCSAqIGJvdGggc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgYXJlIHVwZGF0ZWQgdG8gcHJldmVudCBjb3JydXB0aW9uICovCkBAIC0xMzU0LDEzICsxMzYzLDI0IEBACiAKIAljbGtfZW5hYmxlKHNmYi0+YnVzX2Nsayk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKSB7CisJCXNmYi0+bGNkX2NsayA9IGNsa19nZXQoZGV2LCAic2Nsa19maW1kIik7CisJCWlmIChJU19FUlIoc2ZiLT5sY2RfY2xrKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGxjZCBjbG9ja1xuIik7CisJCQlyZXQgPSBQVFJfRVJSKHNmYi0+bGNkX2Nsayk7CisJCQlnb3RvIGVycl9idXNfY2xrOworCQl9CisKKwkJY2xrX2VuYWJsZShzZmItPmxjZF9jbGspOworCX0KKwogCXBtX3J1bnRpbWVfZW5hYmxlKHNmYi0+ZGV2KTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmluZCByZWdpc3RlcnNcbiIpOwogCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9jbGs7CisJCWdvdG8gZXJyX2xjZF9jbGs7CiAJfQogCiAJc2ZiLT5yZWdzX3JlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCkBAIC0xMzY4LDcgKzEzODgsNyBAQAogCWlmICghc2ZiLT5yZWdzX3JlcykgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjbGFpbSByZWdpc3RlciByZWdpb25cbiIpOwogCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGVycl9jbGs7CisJCWdvdG8gZXJyX2xjZF9jbGs7CiAJfQogCiAJc2ZiLT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtMTQ1MCw3ICsxNDcwLDEzIEBACiBlcnJfcmVxX3JlZ2lvbjoKIAlyZWxlYXNlX21lbV9yZWdpb24oc2ZiLT5yZWdzX3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoc2ZiLT5yZWdzX3JlcykpOwogCi1lcnJfY2xrOgorZXJyX2xjZF9jbGs6CisJaWYgKCFzZmItPnZhcmlhbnQuaGFzX2Nsa3NlbCkgeworCQljbGtfZGlzYWJsZShzZmItPmxjZF9jbGspOworCQljbGtfcHV0KHNmYi0+bGNkX2Nsayk7CisJfQorCitlcnJfYnVzX2NsazoKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCWNsa19wdXQoc2ZiLT5idXNfY2xrKTsKIApAQCAtMTQ4MSw2ICsxNTA3LDExIEBACiAKIAlpb3VubWFwKHNmYi0+cmVncyk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKSB7CisJCWNsa19kaXNhYmxlKHNmYi0+bGNkX2Nsayk7CisJCWNsa19wdXQoc2ZiLT5sY2RfY2xrKTsKKwl9CisKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCWNsa19wdXQoc2ZiLT5idXNfY2xrKTsKIApAQCAtMTUxMCw2ICsxNTQxLDkgQEAKIAkJczNjX2ZiX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTiwgd2luLT5mYmluZm8pOwogCX0KIAorCWlmICghc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsa19kaXNhYmxlKHNmYi0+bGNkX2Nsayk7CisKIAljbGtfZGlzYWJsZShzZmItPmJ1c19jbGspOwogCXJldHVybiAwOwogfQpAQCAtMTUyNCw2ICsxNTU4LDkgQEAKIAogCWNsa19lbmFibGUoc2ZiLT5idXNfY2xrKTsKIAorCWlmICghc2ZiLT52YXJpYW50Lmhhc19jbGtzZWwpCisJCWNsa19lbmFibGUoc2ZiLT5sY2RfY2xrKTsKKwogCS8qIHNldHVwIGdwaW8gYW5kIG91dHB1dCBwb2xhcml0eSBjb250cm9scyAqLwogCXBkLT5zZXR1cF9ncGlvKCk7CiAJd3JpdGVsKHBkLT52aWRjb24xLCBzZmItPnJlZ3MgKyBWSURDT04xKTsKQEAgLTE1NjksNiArMTYwNiw5IEBACiAJCXMzY19mYl9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04sIHdpbi0+ZmJpbmZvKTsKIAl9CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKQorCQljbGtfZGlzYWJsZShzZmItPmxjZF9jbGspOworCiAJY2xrX2Rpc2FibGUoc2ZiLT5idXNfY2xrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1ODMsNiArMTYyMyw5IEBACiAKIAljbGtfZW5hYmxlKHNmYi0+YnVzX2Nsayk7CiAKKwlpZiAoIXNmYi0+dmFyaWFudC5oYXNfY2xrc2VsKQorCQljbGtfZW5hYmxlKHNmYi0+bGNkX2Nsayk7CisKIAkvKiBzZXR1cCBncGlvIGFuZCBvdXRwdXQgcG9sYXJpdHkgY29udHJvbHMgKi8KIAlwZC0+c2V0dXBfZ3BpbygpOwogCXdyaXRlbChwZC0+dmlkY29uMSwgc2ZiLT5yZWdzICsgVklEQ09OMSk7CkBAIC0xNzU1LDYgKzE3OTgsNyBAQAogCQl9LAogCiAJCS5oYXNfcHJ0Y29uCT0gMSwKKwkJLmhhc19jbGtzZWwJPSAxLAogCX0sCiAJLndpblswXQk9ICZzM2NfZmJfZGF0YV82NHh4X3dpbnNbMF0sCiAJLndpblsxXQk9ICZzM2NfZmJfZGF0YV82NHh4X3dpbnNbMV0sCkBAIC0xNzg1LDYgKzE4MjksNyBAQAogCQl9LAogCiAJCS5oYXNfcHJ0Y29uCT0gMSwKKwkJLmhhc19jbGtzZWwJPSAxLAogCX0sCiAJLndpblswXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1swXSwKIAkud2luWzFdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzFdLApAQCAtMTgxNSw2ICsxODYwLDM3IEBACiAJCX0sCiAKIAkJLmhhc19zaGFkb3djb24JPSAxLAorCQkuaGFzX2Nsa3NlbAk9IDEsCisJfSwKKwkud2luWzBdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzBdLAorCS53aW5bMV0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMV0sCisJLndpblsyXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1syXSwKKwkud2luWzNdCT0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzNdLAorCS53aW5bNF0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbNF0sCit9OworCitzdGF0aWMgc3RydWN0IHMzY19mYl9kcml2ZXJkYXRhIHMzY19mYl9kYXRhX2V4eW5vczQgPSB7CisJLnZhcmlhbnQgPSB7CisJCS5ucl93aW5kb3dzCT0gNSwKKwkJLnZpZHRjb24JPSBWSURUQ09OMCwKKwkJLndpbmNvbgkJPSBXSU5DT04oMCksCisJCS53aW5tYXAJCT0gV0lOeE1BUCgwKSwKKwkJLmtleWNvbgkJPSBXS0VZQ09OLAorCQkub3NkCQk9IFZJRE9TRF9CQVNFLAorCQkub3NkX3N0cmlkZQk9IDE2LAorCQkuYnVmX3N0YXJ0CT0gVklEV19CVUZfU1RBUlQoMCksCisJCS5idWZfc2l6ZQk9IFZJRFdfQlVGX1NJWkUoMCksCisJCS5idWZfZW5kCT0gVklEV19CVUZfRU5EKDApLAorCisJCS5wYWxldHRlID0geworCQkJWzBdID0gMHgyNDAwLAorCQkJWzFdID0gMHgyODAwLAorCQkJWzJdID0gMHgyYzAwLAorCQkJWzNdID0gMHgzMDAwLAorCQkJWzRdID0gMHgzNDAwLAorCQl9LAorCisJCS5oYXNfc2hhZG93Y29uCT0gMSwKIAl9LAogCS53aW5bMF0JPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMF0sCiAJLndpblsxXQk9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1sxXSwKQEAgLTE4NDMsNiArMTkxOSw3IEBACiAJCQlbMF0gPSAweDQwMCwKIAkJCVsxXSA9IDB4ODAwLAogCQl9LAorCQkuaGFzX2Nsa3NlbAk9IDEsCiAJfSwKIAkud2luWzBdID0gJihzdHJ1Y3QgczNjX2ZiX3dpbl92YXJpYW50KSB7CiAJCS5wYWxldHRlX3N6CT0gMjU2LApAQCAtMTg1OSw2ICsxOTM2LDMwIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgczNjX2ZiX2RyaXZlcmRhdGEgczNjX2ZiX2RhdGFfczVwNjR4MCA9IHsKKwkudmFyaWFudCA9IHsKKwkJLm5yX3dpbmRvd3MJPSAzLAorCQkudmlkdGNvbgk9IFZJRFRDT04wLAorCQkud2luY29uCQk9IFdJTkNPTigwKSwKKwkJLndpbm1hcAkJPSBXSU54TUFQKDApLAorCQkua2V5Y29uCQk9IFdLRVlDT04sCisJCS5vc2QJCT0gVklET1NEX0JBU0UsCisJCS5vc2Rfc3RyaWRlCT0gMTYsCisJCS5idWZfc3RhcnQJPSBWSURXX0JVRl9TVEFSVCgwKSwKKwkJLmJ1Zl9zaXplCT0gVklEV19CVUZfU0laRSgwKSwKKwkJLmJ1Zl9lbmQJPSBWSURXX0JVRl9FTkQoMCksCisKKwkJLnBhbGV0dGUgPSB7CisJCQlbMF0gPSAweDI0MDAsCisJCQlbMV0gPSAweDI4MDAsCisJCQlbMl0gPSAweDJjMDAsCisJCX0sCisJfSwKKwkud2luWzBdID0gJnMzY19mYl9kYXRhX3M1cF93aW5zWzBdLAorCS53aW5bMV0gPSAmczNjX2ZiX2RhdGFfczVwX3dpbnNbMV0sCisJLndpblsyXSA9ICZzM2NfZmJfZGF0YV9zNXBfd2luc1syXSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHMzY19mYl9kcml2ZXJfaWRzW10gPSB7CiAJewogCQkubmFtZQkJPSAiczNjLWZiIiwKQEAgLTE4NzAsOCArMTk3MSwxNCBAQAogCQkubmFtZQkJPSAiczVwdjIxMC1mYiIsCiAJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZzM2NfZmJfZGF0YV9zNXB2MjEwLAogCX0sIHsKKwkJLm5hbWUJCT0gImV4eW5vczQtZmIiLAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmczNjX2ZiX2RhdGFfZXh5bm9zNCwKKwl9LCB7CiAJCS5uYW1lCQk9ICJzM2MyNDQzLWZiIiwKIAkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJnMzY19mYl9kYXRhX3MzYzI0NDMsCisJfSwgeworCQkubmFtZQkJPSAiczVwNjR4MC1mYiIsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSZzM2NfZmJfZGF0YV9zNXA2NHgwLAogCX0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKaW5kZXggMGFhMTM3Ni4uZWU0YzBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC03NjcsNyArNzY3LDYgQEAKIHN0YXRpYyBpbnQgczNjMjQxMGZiX2NwdWZyZXFfdHJhbnNpdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcXMgPSBkYXRhOwogCXN0cnVjdCBzM2MyNDEwZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZmJfaW5mbyAqZmJpbmZvOwogCWxvbmcgZGVsdGFfZjsKQEAgLTkxMSw3ICs5MTAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJaW5mby0+cGFsZXR0ZV9idWZmZXJbaV0gPSBQQUxFVFRFX0JVRkZfQ0xFQVI7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHMzYzI0MTBmYl9pcnEsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIGluZm8pOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMGZiX2lycSwgMCwgcGRldi0+bmFtZSwgaW5mbyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGlycSAlZCAtIGVyciAlZFxuIiwgaXJxLCByZXQpOwogCQlyZXQgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3MzZmIuYyBiL2RyaXZlcnMvdmlkZW8vczNmYi5jCmluZGV4IDRjYTVkMGMuLjk0NmE5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vczNmYi5jCkBAIC0xMDE5LDEyICsxMDE5LDEzIEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0ICovCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMCkgewotCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogKHZhci0+eHJlc192aXJ0dWFsIC8gMikgKyAodmFyLT54b2Zmc2V0IC8gMik7CisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAwKSB7CisJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgLyAxNikgKiAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCAvIDIpCisJCSAgICAgICArICh2YXItPnhvZmZzZXQgLyAyKTsKIAkJb2Zmc2V0ID0gb2Zmc2V0ID4+IDI7CiAJfSBlbHNlIHsKIAkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJICh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCk7CisJCQkgKHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCQlvZmZzZXQgPSBvZmZzZXQgPj4gMjsKIAl9CiAKQEAgLTE1MDQsNyArMTUwNSw3IEBACiAJLnJlc3VtZQkJPSBzM19wY2lfcmVzdW1lLAogfTsKIAotLyogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAqLworLyogUGFyc2UgdXNlciBzcGVjaWZpZWQgb3B0aW9ucyAqLwogCiAjaWZuZGVmIE1PRFVMRQogc3RhdGljIGludCAgX19pbml0IHMzZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2ExMTAwZmIuYwppbmRleCBlOGI3NmQ2Li45OGQ1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhMTEwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zYTExMDBmYi5jCkBAIC0xNDU3LDggKzE0NTcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBzYTExMDBmYl9oYW5kbGVfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJICAiTENEIiwgZmJpKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHNhMTEwMGZiX2hhbmRsZV9pcnEsIDAsICJMQ0QiLCBmYmkpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzYTExMDBmYjogcmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBmYWlsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfYWNjZWwuYwppbmRleCBiYmNjMDU1Li5iZmVmYTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2FjY2VsLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAic2F2YWdlZmIuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmJfZHJpdmVyLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwppbmRleCA0ZGU1NDFjLi5iZWI0OTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYwpAQCAtMTQ3NywxNSArMTQ3Nyw5IEBACiAJdmdhSFdQcm90ZWN0KHBhciwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmFnZWZiX3VwZGF0ZV9zdGFydChzdHJ1Y3Qgc2F2YWdlZmJfcGFyICAgICAgKnBhciwKLQkJCQkgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorc3RhdGljIHZvaWQgc2F2YWdlZmJfdXBkYXRlX3N0YXJ0KHN0cnVjdCBzYXZhZ2VmYl9wYXIgKnBhciwgaW50IGJhc2UpCiB7Ci0JaW50IGJhc2U7Ci0KLQliYXNlID0gKCh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCArICh2YXItPnhvZmZzZXQgJiB+MSkpCi0JCSogKCh2YXItPmJpdHNfcGVyX3BpeGVsKzcpIC8gOCkpID4+IDI7Ci0KLQkvKiBub3cgcHJvZ3JhbSB0aGUgc3RhcnQgYWRkcmVzcyByZWdpc3RlcnMgKi8KKwkvKiBwcm9ncmFtIHRoZSBzdGFydCBhZGRyZXNzIHJlZ2lzdGVycyAqLwogCXZnYV9vdXQxNigweDNkNCwgKGJhc2UgJiAweDAwZmYwMCkgfCAweDBjLCBwYXIpOwogCXZnYV9vdXQxNigweDNkNCwgKChiYXNlICYgMHgwMGZmKSA8PCA4KSB8IDB4MGQsIHBhcik7CiAJdmdhX291dDgoMHgzZDQsIDB4NjksIHBhcik7CkBAIC0xNTUwLDggKzE1NDQsMTIgQEAKIAkJCQlzdHJ1Y3QgZmJfaW5mbyAgICAgICAgICAgKmluZm8pCiB7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCWludCBiYXNlOwogCi0Jc2F2YWdlZmJfdXBkYXRlX3N0YXJ0KHBhciwgdmFyKTsKKwliYXNlID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCSAgICAgKyAodmFyLT54b2Zmc2V0ICYgfjEpICogKChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwrNykgLyA4KSkgPj4gMjsKKworCXNhdmFnZWZiX3VwZGF0ZV9zdGFydChwYXIsIGJhc2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21pcGlfZHNpLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21pcGlfZHNpLmMKaW5kZXggMjQ2NDBjOC4uNzJlZTk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaF9taXBpX2RzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbWlwaV9kc2kuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+CiAjaW5jbHVkZSA8dmlkZW8vc2hfbWlwaV9kc2kuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYwppbmRleCA3ZDU0ZTJjLi42NDdiYTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCkBAIC0xMTExLDYgKzExMTEsNyBAQAogc3RhdGljIHZvaWQgc2hfaGRtaV9lZGlkX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBzaF9oZG1pICpoZG1pID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzaF9oZG1pLCBlZGlkX3dvcmsud29yayk7CisJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IHNoX21vYmlsZV9oZG1pX2luZm8gKnBkYXRhID0gaGRtaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKIAlpbnQgcmV0OwpAQCAtMTEyMyw4ICsxMTI0LDkgQEAKIAogCW11dGV4X2xvY2soJmhkbWktPm11dGV4KTsKIAorCWluZm8gPSBoZG1pLT5pbmZvOworCiAJaWYgKGhkbWktPmhwX3N0YXRlID09IEhETUlfSE9UUExVR19DT05ORUNURUQpIHsKLQkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBoZG1pLT5pbmZvOwogCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gMCwgaGRtaV9yYXRlOwogCiAJCXJldCA9IHNoX2hkbWlfcmVhZF9lZGlkKGhkbWksICZoZG1pX3JhdGUsICZwYXJlbnRfcmF0ZSk7CkBAIC0xMTQ4LDQyICsxMTUwLDQ1IEBACiAKIAkJY2ggPSBpbmZvLT5wYXI7CiAKLQkJY29uc29sZV9sb2NrKCk7CisJCWlmIChsb2NrX2ZiX2luZm8oaW5mbykpIHsKKwkJCWNvbnNvbGVfbG9jaygpOwogCi0JCS8qIEhETUkgcGx1ZyBpbiAqLwotCQlpZiAoIXNoX2hkbWlfbXVzdF9yZWNvbmZpZ3VyZShoZG1pKSAmJgotCQkgICAgaW5mby0+c3RhdGUgPT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpIHsKLQkJCS8qCi0JCQkgKiBGaXJzdCBhY3RpdmF0aW9uIHdpdGggdGhlIGRlZmF1bHQgbW9uaXRvciAtIGp1c3QgdHVybgotCQkJICogb24sIGlmIHdlIHJ1biBhIHJlc3VtZSBoZXJlLCB0aGUgbG9nbyBkaXNhcHBlYXJzCi0JCQkgKi8KLQkJCWlmIChsb2NrX2ZiX2luZm8oaW5mbykpIHsKKwkJCS8qIEhETUkgcGx1ZyBpbiAqLworCQkJaWYgKCFzaF9oZG1pX211c3RfcmVjb25maWd1cmUoaGRtaSkgJiYKKwkJCSAgICBpbmZvLT5zdGF0ZSA9PSBGQklORk9fU1RBVEVfUlVOTklORykgeworCQkJCS8qCisJCQkJICogRmlyc3QgYWN0aXZhdGlvbiB3aXRoIHRoZSBkZWZhdWx0IG1vbml0b3IgLSBqdXN0IHR1cm4KKwkJCQkgKiBvbiwgaWYgd2UgcnVuIGEgcmVzdW1lIGhlcmUsIHRoZSBsb2dvIGRpc2FwcGVhcnMKKwkJCQkgKi8KIAkJCQlpbmZvLT52YXIud2lkdGggPSBoZG1pLT52YXIud2lkdGg7CiAJCQkJaW5mby0+dmFyLmhlaWdodCA9IGhkbWktPnZhci5oZWlnaHQ7CiAJCQkJc2hfaGRtaV9kaXNwbGF5X29uKGhkbWksIGluZm8pOwotCQkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBOZXcgbW9uaXRvciBvciBoYXZlIHRvIHdha2UgdXAgKi8KKwkJCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIE5ldyBtb25pdG9yIG9yIGhhdmUgdG8gd2FrZSB1cCAqLwotCQkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMCk7Ci0JCX0KIAotCQljb25zb2xlX3VubG9jaygpOworCQkJY29uc29sZV91bmxvY2soKTsKKwkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQl9CiAJfSBlbHNlIHsKIAkJcmV0ID0gMDsKLQkJaWYgKCFoZG1pLT5pbmZvKQorCQlpZiAoIWluZm8pCiAJCQlnb3RvIG91dDsKIAogCQloZG1pLT5tb25zcGVjLm1vZGVkYl9sZW4gPSAwOwogCQlmYl9kZXN0cm95X21vZGVkYihoZG1pLT5tb25zcGVjLm1vZGVkYik7CiAJCWhkbWktPm1vbnNwZWMubW9kZWRiID0gTlVMTDsKIAotCQljb25zb2xlX2xvY2soKTsKKwkJaWYgKGxvY2tfZmJfaW5mbyhpbmZvKSkgeworCQkJY29uc29sZV9sb2NrKCk7CiAKLQkJLyogSERNSSBkaXNjb25uZWN0ICovCi0JCWZiX3NldF9zdXNwZW5kKGhkbWktPmluZm8sIDEpOworCQkJLyogSERNSSBkaXNjb25uZWN0ICovCisJCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKIAotCQljb25zb2xlX3VubG9jaygpOworCQkJY29uc29sZV91bmxvY2soKTsKKwkJCXVubG9ja19mYl9pbmZvKGluZm8pOworCQl9CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCmluZGV4IGIwNDg0MTcuLmZhY2ZmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5jCkBAIC0yMyw0MCArMjMsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CisjaW5jbHVkZSA8dmlkZW8vc2hfbW9iaWxlX21lcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKICNpbmNsdWRlICJzaF9tb2JpbGVfbGNkY2ZiLmgiCi0jaW5jbHVkZSAic2hfbW9iaWxlX21lcmFtLmgiCiAKICNkZWZpbmUgU0lERV9CX09GRlNFVCAweDEwMDAKICNkZWZpbmUgTUlSUk9SX09GRlNFVCAweDIwMDAKIAotLyogc2hhcmVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBfTEREQ0tSIDB4NDEwCi0jZGVmaW5lIF9MRERDS1NUUFIgMHg0MTQKLSNkZWZpbmUgX0xESU5UUiAweDQ2OAotI2RlZmluZSBfTERTUiAweDQ2YwotI2RlZmluZSBfTERDTlQxUiAweDQ3MAotI2RlZmluZSBfTERDTlQyUiAweDQ3NAotI2RlZmluZSBfTERSQ05UUiAweDQ3OAotI2RlZmluZSBfTERERFNSIDB4NDdjCi0jZGVmaW5lIF9MRERXRDBSIDB4ODAwCi0jZGVmaW5lIF9MRERSRFIgMHg4NDAKLSNkZWZpbmUgX0xERFdBUiAweDkwMAotI2RlZmluZSBfTEREUkFSIDB4OTA0Ci0KLS8qIHNoYXJlZCByZWdpc3RlcnMgYW5kIHRoZWlyIG9yZGVyIGZvciBjb250ZXh0IHNhdmUvcmVzdG9yZSAqLwotc3RhdGljIGludCBsY2RjX3NoYXJlZF9yZWdzW10gPSB7Ci0JX0xERENLUiwKLQlfTEREQ0tTVFBSLAotCV9MRElOVFIsCi0JX0xERERTUiwKLQlfTERDTlQxUiwKLQlfTERDTlQyUiwKLX07Ci0jZGVmaW5lIE5SX1NIQVJFRF9SRUdTIEFSUkFZX1NJWkUobGNkY19zaGFyZWRfcmVncykKLQogI2RlZmluZSBNQVhfWFJFUyAxOTIwCiAjZGVmaW5lIE1BWF9ZUkVTIDEwODAKIApAQCAtOTgsMjIgKzc0LDYgQEAKIAlbTERQTVJdID0gMHg2M2MsCiB9OwogCi0jZGVmaW5lIFNUQVJUX0xDREMJMHgwMDAwMDAwMQotI2RlZmluZSBMQ0RDX1JFU0VUCTB4MDAwMDAxMDAKLSNkZWZpbmUgRElTUExBWV9CRVUJMHgwMDAwMDAwOAotI2RlZmluZSBMQ0RDX0VOQUJMRQkweDAwMDAwMDAxCi0jZGVmaW5lIExESU5UUl9GRQkweDAwMDAwNDAwCi0jZGVmaW5lIExESU5UUl9WU0UJMHgwMDAwMDIwMAotI2RlZmluZSBMRElOVFJfVkVFCTB4MDAwMDAxMDAKLSNkZWZpbmUgTERJTlRSX0ZTCTB4MDAwMDAwMDQKLSNkZWZpbmUgTERJTlRSX1ZTUwkweDAwMDAwMDAyCi0jZGVmaW5lIExESU5UUl9WRVMJMHgwMDAwMDAwMQotI2RlZmluZSBMRFJDTlRSX1NSUwkweDAwMDIwMDAwCi0jZGVmaW5lIExEUkNOVFJfU1JDCTB4MDAwMTAwMDAKLSNkZWZpbmUgTERSQ05UUl9NUlMJMHgwMDAwMDAwMgotI2RlZmluZSBMRFJDTlRSX01SQwkweDAwMDAwMDAxCi0jZGVmaW5lIExEU1JfTVJTCTB4MDAwMDAxMDAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgZGVmYXVsdF83MjBwID0gewogCS5uYW1lID0gIkhETUkgNzIwcCIsCiAJLnhyZXMgPSAxMjgwLApAQCAtMTQxLDcgKzEwMSw2IEBACiAJdW5zaWduZWQgbG9uZyBsZGRja3I7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gY2hbMl07CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOwotCXVuc2lnbmVkIGxvbmcgc2F2ZWRfc2hhcmVkX3JlZ3NbTlJfU0hBUkVEX1JFR1NdOwogCWludCBzdGFydGVkOwogCWludCBmb3JjZWRfYnBwOyAvKiAyIGNoYW5uZWwgTENEQyBtdXN0IHNoYXJlIGJwcCBzZXR0aW5nICovCiAJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9pbmZvICptZXJhbV9kZXY7CkBAIC0yMTgsMzMgKzE3NywzNiBAQAogewogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IGhhbmRsZTsKIAotCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERXRDBSLCBkYXRhIHwgMHgxMDAwMDAwMCk7Ci0JbGNkY193YWl0X2JpdChjaC0+bGNkYywgX0xEU1IsIDIsIDApOwotCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERXQVIsIDEgfCAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0QwUiwgZGF0YSB8IExERFdEeFJfV0RBQ1QpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCBMRERXQVJfV0EgfAorCQkgICAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgbGNkY19zeXNfd3JpdGVfZGF0YSh2b2lkICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBoYW5kbGU7CiAKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0QwUiwgZGF0YSB8IDB4MTEwMDAwMDApOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCAxIHwgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpID8gMiA6IDApKTsKLQlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgMiwgMCk7CisJbGNkY193cml0ZShjaC0+bGNkYywgX0xERFdEMFIsIGRhdGEgfCBMRERXRHhSX1dEQUNUIHwgTEREV0R4Ul9SU1cpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKKwlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREV0FSLCBMRERXQVJfV0EgfAorCQkgICAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyAyIDogMCkpOworCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCBMRFNSX0FTLCAwKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGNkY19zeXNfcmVhZF9kYXRhKHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBoYW5kbGU7CiAKLQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTEREUkRSLCAweDAxMDAwMDAwKTsKLQlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgMiwgMCk7Ci0JbGNkY193cml0ZShjaC0+bGNkYywgX0xERFJBUiwgMSB8IChsY2RjX2NoYW5faXNfc3VibGNkKGNoKSA/IDIgOiAwKSk7CisJbGNkY193cml0ZShjaC0+bGNkYywgX0xERFJEUiwgTEREUkRSX1JTUik7CisJbGNkY193YWl0X2JpdChjaC0+bGNkYywgX0xEU1IsIExEU1JfQVMsIDApOworCWxjZGNfd3JpdGUoY2gtPmxjZGMsIF9MRERSQVIsIExERFJBUl9SQSB8CisJCSAgIChsY2RjX2NoYW5faXNfc3VibGNkKGNoKSA/IDIgOiAwKSk7CiAJdWRlbGF5KDEpOwotCWxjZGNfd2FpdF9iaXQoY2gtPmxjZGMsIF9MRFNSLCAyLCAwKTsKKwlsY2RjX3dhaXRfYml0KGNoLT5sY2RjLCBfTERTUiwgTERTUl9BUywgMCk7CiAKLQlyZXR1cm4gbGNkY19yZWFkKGNoLT5sY2RjLCBfTEREUkRSKSAmIDB4M2ZmZmY7CisJcmV0dXJuIGxjZGNfcmVhZChjaC0+bGNkYywgX0xERFJEUikgJiBMRERSRFJfRFJEX01BU0s7CiB9CiAKIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyBzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyA9IHsKQEAgLTI1NiwxOCArMjE4LDIyIEBACiBzdGF0aWMgdm9pZCBzaF9tb2JpbGVfbGNkY19jbGtfb24oc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYpCiB7CiAJaWYgKGF0b21pY19pbmNfYW5kX3Rlc3QoJnByaXYtPmh3X3VzZWNudCkpIHsKLQkJcG1fcnVudGltZV9nZXRfc3luYyhwcml2LT5kZXYpOwogCQlpZiAocHJpdi0+ZG90X2NsaykKIAkJCWNsa19lbmFibGUocHJpdi0+ZG90X2Nsayk7CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMocHJpdi0+ZGV2KTsKKwkJaWYgKHByaXYtPm1lcmFtX2RldiAmJiBwcml2LT5tZXJhbV9kZXYtPnBkZXYpCisJCQlwbV9ydW50aW1lX2dldF9zeW5jKCZwcml2LT5tZXJhbV9kZXYtPnBkZXYtPmRldik7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBzaF9tb2JpbGVfbGNkY19jbGtfb2ZmKHN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2KQogewogCWlmIChhdG9taWNfc3ViX3JldHVybigxLCAmcHJpdi0+aHdfdXNlY250KSA9PSAtMSkgeworCQlpZiAocHJpdi0+bWVyYW1fZGV2ICYmIHByaXYtPm1lcmFtX2Rldi0+cGRldikKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPm1lcmFtX2Rldi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXQocHJpdi0+ZGV2KTsKIAkJaWYgKHByaXYtPmRvdF9jbGspCiAJCQljbGtfZGlzYWJsZShwcml2LT5kb3RfY2xrKTsKLQkJcG1fcnVudGltZV9wdXQocHJpdi0+ZGV2KTsKIAl9CiB9CiAKQEAgLTMxOSwxMyArMjg1LDEzIEBACiAJCWlmIChiY2ZnLT5zdGFydF90cmFuc2ZlcikKIAkJCWJjZmctPnN0YXJ0X3RyYW5zZmVyKGJjZmctPmJvYXJkX2RhdGEsIGNoLAogCQkJCQkgICAgICZzaF9tb2JpbGVfbGNkY19zeXNfYnVzX29wcyk7Ci0JCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTJSLCAxKTsKKwkJbGNkY193cml0ZV9jaGFuKGNoLCBMRFNNMlIsIExEU00yUl9PU1RSRyk7CiAJCWRtYV91bm1hcF9zZyhpbmZvLT5kZXYsIGNoLT5zZ2xpc3QsIG5yX3BhZ2VzLCBETUFfVE9fREVWSUNFKTsKIAl9IGVsc2UgewogCQlpZiAoYmNmZy0+c3RhcnRfdHJhbnNmZXIpCiAJCQliY2ZnLT5zdGFydF90cmFuc2ZlcihiY2ZnLT5ib2FyZF9kYXRhLCBjaCwKIAkJCQkJICAgICAmc2hfbW9iaWxlX2xjZGNfc3lzX2J1c19vcHMpOwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00yUiwgMSk7CisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTJSLCBMRFNNMlJfT1NUUkcpOwogCX0KIH0KIApAQCAtMzQxLDIyICszMDcsMTYgQEAKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IGRhdGE7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoOwotCXVuc2lnbmVkIGxvbmcgdG1wOwogCXVuc2lnbmVkIGxvbmcgbGRpbnRyOwogCWludCBpc19zdWI7CiAJaW50IGs7CiAKLQkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KLQlsZGludHIgPSB0bXAgPSBsY2RjX3JlYWQocHJpdiwgX0xESU5UUik7Ci0JLyoKLQkgKiBkaXNhYmxlIGZ1cnRoZXIgVlNZTkMgRW5kIElSUXMsIHByZXNlcnZlIGFsbCBvdGhlciBlbmFibGVkIElSUXMsCi0JICogd3JpdGUgMCB0byBiaXRzIDAtNiB0byBhY2sgYWxsIHRyaWdnZXJlZCBJUlFzLgotCSAqLwotCXRtcCAmPSAweGZmZmZmZjAwICYgfkxESU5UUl9WRUU7Ci0JbGNkY193cml0ZShwcml2LCBfTERJTlRSLCB0bXApOworCS8qIEFja25vd2xlZGdlIGludGVycnVwdHMgYW5kIGRpc2FibGUgZnVydGhlciBWU1lOQyBFbmQgSVJRcy4gKi8KKwlsZGludHIgPSBsY2RjX3JlYWQocHJpdiwgX0xESU5UUik7CisJbGNkY193cml0ZShwcml2LCBfTERJTlRSLCAobGRpbnRyIF4gTERJTlRSX1NUQVRVU19NQVNLKSAmIH5MRElOVFJfVkVFKTsKIAogCS8qIGZpZ3VyZSBvdXQgaWYgdGhpcyBpbnRlcnJ1cHQgaXMgZm9yIG1haW4gb3Igc3ViIGxjZCAqLwotCWlzX3N1YiA9IChsY2RjX3JlYWQocHJpdiwgX0xEU1IpICYgKDEgPDwgMTApKSA/IDEgOiAwOworCWlzX3N1YiA9IChsY2RjX3JlYWQocHJpdiwgX0xEU1IpICYgTERTUl9NU1MpID8gMSA6IDA7CiAKIAkvKiB3YWtlIHVwIGNoYW5uZWwgYW5kIGRpc2FibGUgY2xvY2tzICovCiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKQEAgLTM2NSw3ICszMjUsNyBAQAogCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKLQkJLyogRnJhbWUgU3RhcnQgKi8KKwkJLyogRnJhbWUgRW5kICovCiAJCWlmIChsZGludHIgJiBMRElOVFJfRlMpIHsKIAkJCWlmIChpc19zdWIgPT0gbGNkY19jaGFuX2lzX3N1YmxjZChjaCkpIHsKIAkJCQljaC0+ZnJhbWVfZW5kID0gMTsKQEAgLTM5MSwxNiArMzUxLDE3IEBACiAKIAkvKiBzdGFydCBvciBzdG9wIHRoZSBsY2RjICovCiAJaWYgKHN0YXJ0KQotCQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCB0bXAgfCBTVEFSVF9MQ0RDKTsKKwkJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgdG1wIHwgTERDTlQyUl9ETyk7CiAJZWxzZQotCQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCB0bXAgJiB+U1RBUlRfTENEQyk7CisJCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMlIsIHRtcCAmIH5MRENOVDJSX0RPKTsKIAogCS8qIHdhaXQgdW50aWwgcG93ZXIgaXMgYXBwbGllZC9zdG9wcGVkIG9uIGFsbCBjaGFubmVscyAqLwogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKQogCQlpZiAobGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSAmIHByaXYtPmNoW2tdLmVuYWJsZWQpCiAJCQl3aGlsZSAoMSkgewotCQkJCXRtcCA9IGxjZGNfcmVhZF9jaGFuKCZwcml2LT5jaFtrXSwgTERQTVIpICYgMzsKLQkJCQlpZiAoc3RhcnQgJiYgdG1wID09IDMpCisJCQkJdG1wID0gbGNkY19yZWFkX2NoYW4oJnByaXYtPmNoW2tdLCBMRFBNUikKKwkJCQkgICAgJiBMRFBNUl9MUFM7CisJCQkJaWYgKHN0YXJ0ICYmIHRtcCA9PSBMRFBNUl9MUFMpCiAJCQkJCWJyZWFrOwogCQkJCWlmICghc3RhcnQgJiYgdG1wID09IDApCiAJCQkJCWJyZWFrOwpAQCAtNDE4LDEzICszNzksMTMgQEAKIAl1MzIgdG1wOwogCiAJdG1wID0gY2gtPmxkbXQxcl92YWx1ZTsKLQl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyAwIDogMSA8PCAyODsKLQl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/IDAgOiAxIDw8IDI3OwotCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRFdQT0wpID8gMSA8PCAyNiA6IDA7Ci0JdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19ESVBPTCkgPyAxIDw8IDI1IDogMDsKLQl0bXAgfD0gKGNoLT5jZmcuZmxhZ3MgJiBMQ0RDX0ZMQUdTX0RBUE9MKSA/IDEgPDwgMjQgOiAwOwotCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfSFNDTlQpID8gMSA8PCAxNyA6IDA7Ci0JdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19EV0NOVCkgPyAxIDw8IDE2IDogMDsKKwl0bXAgfD0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyAwIDogTERNVDFSX1ZQT0w7CisJdG1wIHw9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyAwIDogTERNVDFSX0hQT0w7CisJdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19EV1BPTCkgPyBMRE1UMVJfRFdQT0wgOiAwOworCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRElQT0wpID8gTERNVDFSX0RJUE9MIDogMDsKKwl0bXAgfD0gKGNoLT5jZmcuZmxhZ3MgJiBMQ0RDX0ZMQUdTX0RBUE9MKSA/IExETVQxUl9EQVBPTCA6IDA7CisJdG1wIHw9IChjaC0+Y2ZnLmZsYWdzICYgTENEQ19GTEFHU19IU0NOVCkgPyBMRE1UMVJfSFNDTlQgOiAwOworCXRtcCB8PSAoY2gtPmNmZy5mbGFncyAmIExDRENfRkxBR1NfRFdDTlQpID8gTERNVDFSX0RXQ05UIDogMDsKIAlsY2RjX3dyaXRlX2NoYW4oY2gsIExETVQxUiwgdG1wKTsKIAogCS8qIHNldHVwIFNZUyBidXMgKi8KQEAgLTQ2MywyNDIgKzQyNCwyMzkgQEAKIAlsY2RjX3dyaXRlX2NoYW4oY2gsIExESEFKUiwgdG1wKTsKIH0KIAotc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zdGFydChzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdikKKy8qCisgKiBfX3NoX21vYmlsZV9sY2RjX3N0YXJ0IC0gQ29uZmlndXJlIGFuZCB0YXJ0IHRoZSBMQ0RDCisgKiBAcHJpdjogTENEQyBkZXZpY2UKKyAqCisgKiBDb25maWd1cmUgYWxsIGVuYWJsZWQgY2hhbm5lbHMgYW5kIHN0YXJ0IHRoZSBMQ0RDIGRldmljZS4gQWxsIGV4dGVybmFsCisgKiBkZXZpY2VzIChjbG9ja3MsIE1FUkFNLCBwYW5lbHMsIC4uLikgYXJlIG5vdCB0b3VjaGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIF9fc2hfbW9iaWxlX2xjZGNfc3RhcnQoc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19ib2FyZF9jZmcJKmJvYXJkX2NmZzsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgYnBwID0gMDsKLQl1bnNpZ25lZCBsb25nIGxkZGRzcjsKLQlpbnQgaywgbSwgcmV0OworCWludCBrLCBtOwogCi0JLyogZW5hYmxlIGNsb2NrcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7Ci0JCWlmIChwcml2LT5jaFtrXS5lbmFibGVkKSB7Ci0JCQlzaF9tb2JpbGVfbGNkY19jbGtfb24ocHJpdik7Ci0JCQlpZiAoIWJwcCkKLQkJCQlicHAgPSBwcml2LT5jaFtrXS5pbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7Ci0JCX0KLQl9CisJLyogRW5hYmxlIExDREMgY2hhbm5lbHMuIFJlYWQgZGF0YSBmcm9tIGV4dGVybmFsIG1lbW9yeSwgYXZvaWQgdXNpbmcgdGhlCisJICogQkVVIGZvciBub3cuCisJICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgcHJpdi0+Y2hbMF0uZW5hYmxlZCB8IHByaXYtPmNoWzFdLmVuYWJsZWQpOwogCi0JLyogcmVzZXQgKi8KLQlsY2RjX3dyaXRlKHByaXYsIF9MRENOVDJSLCBsY2RjX3JlYWQocHJpdiwgX0xEQ05UMlIpIHwgTENEQ19SRVNFVCk7Ci0JbGNkY193YWl0X2JpdChwcml2LCBfTERDTlQyUiwgTENEQ19SRVNFVCwgMCk7Ci0KLQkvKiBlbmFibGUgTENEQyBjaGFubmVscyAqLwotCXRtcCA9IGxjZGNfcmVhZChwcml2LCBfTERDTlQyUik7Ci0JdG1wIHw9IHByaXYtPmNoWzBdLmVuYWJsZWQ7Ci0JdG1wIHw9IHByaXYtPmNoWzFdLmVuYWJsZWQ7Ci0JbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgdG1wKTsKLQotCS8qIHJlYWQgZGF0YSBmcm9tIGV4dGVybmFsIG1lbW9yeSwgYXZvaWQgdXNpbmcgdGhlIEJFVSBmb3Igbm93ICovCi0JbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgbGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSAmIH5ESVNQTEFZX0JFVSk7Ci0KLQkvKiBzdG9wIHRoZSBsY2RjIGZpcnN0ICovCisJLyogU3RvcCB0aGUgTENEQyBmaXJzdCBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cy4gKi8KIAlzaF9tb2JpbGVfbGNkY19zdGFydF9zdG9wKHByaXYsIDApOworCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgMCk7CiAKLQkvKiBjb25maWd1cmUgY2xvY2tzICovCisJLyogQ29uZmlndXJlIHBvd2VyIHN1cHBseSwgZG90IGNsb2NrcyBhbmQgc3RhcnQgdGhlbS4gKi8KIAl0bXAgPSBwcml2LT5sZGRja3I7CiAJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKIAkJY2ggPSAmcHJpdi0+Y2hba107Ci0KLQkJaWYgKCFwcml2LT5jaFtrXS5lbmFibGVkKQorCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKKwkJaWYgKCFicHApCisJCQlicHAgPSBjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCisJCS8qIFBvd2VyIHN1cHBseSAqLworCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEUE1SLCAwKTsKKwogCQltID0gY2gtPmNmZy5jbG9ja19kaXZpZGVyOwogCQlpZiAoIW0pCiAJCQljb250aW51ZTsKIAotCQlpZiAobSA9PSAxKQotCQkJbSA9IDEgPDwgNjsKLQkJdG1wIHw9IG0gPDwgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpID8gOCA6IDApOwotCi0JCS8qIEZJWE1FOiBzaDc3MjQgY2FuIG9ubHkgdXNlIDQyLCA0OCwgNTQgYW5kIDYwIGZvciB0aGUgZGl2aWRlciBkZW5vbWluYXRvciAqLworCQkvKiBGSVhNRTogc2g3NzI0IGNhbiBvbmx5IHVzZSA0MiwgNDgsIDU0IGFuZCA2MCBmb3IgdGhlIGRpdmlkZXIKKwkJICogZGVub21pbmF0b3IuCisJCSAqLwogCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExERENLUEFUMVIsIDApOwogCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExERENLUEFUMlIsICgxIDw8IChtLzIpKSAtIDEpOworCisJCWlmIChtID09IDEpCisJCQltID0gTEREQ0tSX01PU0VMOworCQl0bXAgfD0gbSA8PCAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkgPyA4IDogMCk7CiAJfQogCiAJbGNkY193cml0ZShwcml2LCBfTEREQ0tSLCB0bXApOwotCi0JLyogc3RhcnQgZG90Y2xvY2sgYWdhaW4gKi8KIAlsY2RjX3dyaXRlKHByaXYsIF9MRERDS1NUUFIsIDApOwogCWxjZGNfd2FpdF9iaXQocHJpdiwgX0xERENLU1RQUiwgfjAsIDApOwogCi0JLyogaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgdG8gYmVnaW4gd2l0aCAqLwotCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgMCk7Ci0KKwkvKiBTZXR1cCBnZW9tZXRyeSwgZm9ybWF0LCBmcmFtZSBidWZmZXIgbWVtb3J5IGFuZCBvcGVyYXRpb24gbW9kZS4gKi8KIAlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwcml2LT5jaCk7IGsrKykgewogCQljaCA9ICZwcml2LT5jaFtrXTsKLQogCQlpZiAoIWNoLT5lbmFibGVkKQogCQkJY29udGludWU7CiAKIAkJc2hfbW9iaWxlX2xjZGNfZ2VvbWV0cnkoY2gpOwogCi0JCS8qIHBvd2VyIHN1cHBseSAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEUE1SLCAwKTsKKwkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKSB7CisJCQl0bXAgPSAoY2gtPmluZm8tPnZhci5ub25zdGQgPDwgMTYpOworCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCQljYXNlIDEyOgorCQkJCXRtcCB8PSBMRERGUl9ZRl80MjA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCXRtcCB8PSBMRERGUl9ZRl80MjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJZGVmYXVsdDoKKwkJCQl0bXAgfD0gTERERlJfWUZfNDQ0OworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCQljYXNlIDE2OgorCQkJCXRtcCA9IExEREZSX1BLRl9SR0IxNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjQ6CisJCQkJdG1wID0gTERERlJfUEtGX1JHQjI0OworCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCWRlZmF1bHQ6CisJCQkJdG1wID0gTERERlJfUEtGX0FSR0IzMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERERlIsIHRtcCk7CisJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERNTFNSLCBjaC0+cGl0Y2gpOworCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0ExUiwgY2gtPmJhc2VfYWRkcl95KTsKKwkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKQorCQkJbGNkY193cml0ZV9jaGFuKGNoLCBMRFNBMlIsIGNoLT5iYXNlX2FkZHJfYyk7CisKKwkJLyogV2hlbiB1c2luZyBkZWZlcnJlZCBJL08gbW9kZSwgY29uZmlndXJlIHRoZSBMQ0RDIGZvciBvbmUtc2hvdAorCQkgKiBvcGVyYXRpb24gYW5kIGVuYWJsZSB0aGUgZnJhbWUgZW5kIGludGVycnVwdC4gT3RoZXJ3aXNlIHVzZQorCQkgKiBjb250aW51b3VzIHJlYWQgbW9kZS4KKwkJICovCisJCWlmIChjaC0+bGRtdDFyX3ZhbHVlICYgTERNVDFSX0lGTSAmJgorCQkgICAgY2gtPmNmZy5zeXNfYnVzX2NmZy5kZWZlcnJlZF9pb19tc2VjKSB7CisJCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00xUiwgTERTTTFSX09TKTsKKwkJCWxjZGNfd3JpdGUocHJpdiwgX0xESU5UUiwgTERJTlRSX0ZFKTsKKwkJfSBlbHNlIHsKKwkJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTFSLCAwKTsKKwkJfQorCX0KKworCS8qIFdvcmQgYW5kIGxvbmcgd29yZCBzd2FwLiAqLworCWlmICAocHJpdi0+Y2hbMF0uaW5mby0+dmFyLm5vbnN0ZCkKKwkJdG1wID0gTERERFNSX0xTIHwgTERERFNSX1dTIHwgTERERFNSX0JTOworCWVsc2UgeworCQlzd2l0Y2ggKGJwcCkgeworCQljYXNlIDE2OgorCQkJdG1wID0gTERERFNSX0xTIHwgTERERFNSX1dTOworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCQl0bXAgPSBMREREU1JfTFMgfCBMREREU1JfV1MgfCBMREREU1JfQlM7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJZGVmYXVsdDoKKwkJCXRtcCA9IExERERTUl9MUzsKKwkJCWJyZWFrOworCQl9CisJfQorCWxjZGNfd3JpdGUocHJpdiwgX0xERERTUiwgdG1wKTsKKworCS8qIEVuYWJsZSB0aGUgZGlzcGxheSBvdXRwdXQuICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQxUiwgTERDTlQxUl9ERSk7CisJc2hfbW9iaWxlX2xjZGNfc3RhcnRfc3RvcChwcml2LCAxKTsKKwlwcml2LT5zdGFydGVkID0gMTsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zdGFydChzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2luZm8gKm1kZXYgPSBwcml2LT5tZXJhbV9kZXY7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2JvYXJkX2NmZwkqYm9hcmRfY2ZnOworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgcmV0OworCWludCBrOworCisJLyogZW5hYmxlIGNsb2NrcyBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZSAqLworCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7CisJCWlmIChwcml2LT5jaFtrXS5lbmFibGVkKQorCQkJc2hfbW9iaWxlX2xjZGNfY2xrX29uKHByaXYpOworCX0KKworCS8qIHJlc2V0ICovCisJbGNkY193cml0ZShwcml2LCBfTERDTlQyUiwgbGNkY19yZWFkKHByaXYsIF9MRENOVDJSKSB8IExEQ05UMlJfQlIpOworCWxjZGNfd2FpdF9iaXQocHJpdiwgX0xEQ05UMlIsIExEQ05UMlJfQlIsIDApOworCisJZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocHJpdi0+Y2gpOyBrKyspIHsKKwkJY2ggPSAmcHJpdi0+Y2hba107CisKKwkJaWYgKCFjaC0+ZW5hYmxlZCkKKwkJCWNvbnRpbnVlOwogCiAJCWJvYXJkX2NmZyA9ICZjaC0+Y2ZnLmJvYXJkX2NmZzsKIAkJaWYgKGJvYXJkX2NmZy0+c2V0dXBfc3lzKSB7Ci0JCQlyZXQgPSBib2FyZF9jZmctPnNldHVwX3N5cyhib2FyZF9jZmctPmJvYXJkX2RhdGEsCi0JCQkJCQljaCwgJnNoX21vYmlsZV9sY2RjX3N5c19idXNfb3BzKTsKKwkJCXJldCA9IGJvYXJkX2NmZy0+c2V0dXBfc3lzKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwgY2gsCisJCQkJCQkgICAmc2hfbW9iaWxlX2xjZGNfc3lzX2J1c19vcHMpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0JLyogd29yZCBhbmQgbG9uZyB3b3JkIHN3YXAgKi8KLQlsZGRkc3IgPSBsY2RjX3JlYWQocHJpdiwgX0xERERTUik7Ci0JaWYgIChwcml2LT5jaFswXS5pbmZvLT52YXIubm9uc3RkKQotCQlsY2RjX3dyaXRlKHByaXYsIF9MREREU1IsIGxkZGRzciB8IDcpOwotCWVsc2UgewotCQlzd2l0Y2ggKGJwcCkgewotCQljYXNlIDE2OgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA2KTsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA3KTsKLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJbGNkY193cml0ZShwcml2LCBfTERERFNSLCBsZGRkc3IgfCA0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCisJLyogQ29tcHV0ZSBmcmFtZSBidWZmZXIgYmFzZSBhZGRyZXNzIGFuZCBwaXRjaCBmb3IgZWFjaCBjaGFubmVsLiAqLwogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHByaXYtPmNoKTsgaysrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX3k7Ci0JCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX2MgPSAwOwotCQlpbnQgcGl0Y2g7Ci0JCWNoID0gJnByaXYtPmNoW2tdOworCQlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2NmZyAqY2ZnOworCQlpbnQgcGl4ZWxmb3JtYXQ7CiAKLQkJaWYgKCFwcml2LT5jaFtrXS5lbmFibGVkKQorCQljaCA9ICZwcml2LT5jaFtrXTsKKwkJaWYgKCFjaC0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIHNldCBicHAgZm9ybWF0IGluIFBLRls0OjBdICovCi0JCXRtcCA9IGxjZGNfcmVhZF9jaGFuKGNoLCBMRERGUik7Ci0JCXRtcCAmPSB+MHgwMDAzMDMxZjsKLQkJaWYgKGNoLT5pbmZvLT52YXIubm9uc3RkKSB7Ci0JCQl0bXAgfD0gKGNoLT5pbmZvLT52YXIubm9uc3RkIDw8IDE2KTsKLQkJCXN3aXRjaCAoY2gtPmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewotCQkJY2FzZSAxMjoKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJdG1wIHw9ICgweDEgPDwgOCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCXRtcCB8PSAoMHgyIDw8IDgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3dpdGNoIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JCQljYXNlIDE2OgotCQkJCXRtcCB8PSAweDAzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQl0bXAgfD0gMHgwYjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbGNkY193cml0ZV9jaGFuKGNoLCBMRERGUiwgdG1wKTsKKwkJY2gtPmJhc2VfYWRkcl95ID0gY2gtPmluZm8tPmZpeC5zbWVtX3N0YXJ0OworCQljaC0+YmFzZV9hZGRyX2MgPSBjaC0+YmFzZV9hZGRyX3kKKwkJCQkrIGNoLT5pbmZvLT52YXIueHJlcworCQkJCSogY2gtPmluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJCWNoLT5waXRjaCA9IGNoLT5pbmZvLT5maXgubGluZV9sZW5ndGg7CiAKLQkJYmFzZV9hZGRyX3kgPSBjaC0+aW5mby0+Zml4LnNtZW1fc3RhcnQ7Ci0JCWJhc2VfYWRkcl9jID0gYmFzZV9hZGRyX3kgKwotCQkJCWNoLT5pbmZvLT52YXIueHJlcyAqCi0JCQkJY2gtPmluZm8tPnZhci55cmVzX3ZpcnR1YWw7Ci0JCXBpdGNoID0gY2gtPmluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwkJLyogRW5hYmxlIE1FUkFNIGlmIHBvc3NpYmxlLiAqLworCQljZmcgPSBjaC0+Y2ZnLm1lcmFtX2NmZzsKKwkJaWYgKG1kZXYgPT0gTlVMTCB8fCBtZGV2LT5vcHMgPT0gTlVMTCB8fCBjZmcgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwogCi0JCS8qIHRlc3QgaWYgd2UgY2FuIGVuYWJsZSBtZXJhbSAqLwotCQlpZiAoY2gtPmNmZy5tZXJhbV9jZmcgJiYgcHJpdi0+bWVyYW1fZGV2ICYmCi0JCQkJcHJpdi0+bWVyYW1fZGV2LT5vcHMpIHsKLQkJCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnICpjZmc7Ci0JCQlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX2luZm8gKm1kZXY7Ci0JCQl1bnNpZ25lZCBsb25nIGljYl9hZGRyX3ksIGljYl9hZGRyX2M7Ci0JCQlpbnQgaWNiX3BpdGNoOwotCQkJaW50IHBmOwotCi0JCQljZmcgPSBjaC0+Y2ZnLm1lcmFtX2NmZzsKLQkJCW1kZXYgPSBwcml2LT5tZXJhbV9kZXY7Ci0JCQkvKiB3ZSBuZWVkIHRvIGRlLWluaXQgY29uZmlndXJlZCBJQ0JzIGJlZm9yZSB3ZQotCQkJICogd2UgY2FuIHJlLWluaXRpYWxpemUgdGhlbS4KLQkJCSAqLwotCQkJaWYgKGNoLT5tZXJhbV9lbmFibGVkKQotCQkJCW1kZXYtPm9wcy0+bWVyYW1fdW5yZWdpc3RlcihtZGV2LCBjZmcpOwotCisJCS8qIHdlIG5lZWQgdG8gZGUtaW5pdCBjb25maWd1cmVkIElDQnMgYmVmb3JlIHdlIGNhbgorCQkgKiByZS1pbml0aWFsaXplIHRoZW0uCisJCSAqLworCQlpZiAoY2gtPm1lcmFtX2VuYWJsZWQpIHsKKwkJCW1kZXYtPm9wcy0+bWVyYW1fdW5yZWdpc3RlcihtZGV2LCBjZmcpOwogCQkJY2gtPm1lcmFtX2VuYWJsZWQgPSAwOwotCi0JCQlpZiAoY2gtPmluZm8tPnZhci5ub25zdGQpIHsKLQkJCQlpZiAoY2gtPmluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAyNCkKLQkJCQkJcGYgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlYyNDsKLQkJCQllbHNlCi0JCQkJCXBmID0gU0hfTU9CSUxFX01FUkFNX1BGX05WOwotCQkJfSBlbHNlIHsKLQkJCQlwZiA9IFNIX01PQklMRV9NRVJBTV9QRl9SR0I7Ci0JCQl9Ci0KLQkJCXJldCA9IG1kZXYtPm9wcy0+bWVyYW1fcmVnaXN0ZXIobWRldiwgY2ZnLCBwaXRjaCwKLQkJCQkJCWNoLT5pbmZvLT52YXIueXJlcywKLQkJCQkJCXBmLAotCQkJCQkJYmFzZV9hZGRyX3ksCi0JCQkJCQliYXNlX2FkZHJfYywKLQkJCQkJCSZpY2JfYWRkcl95LAotCQkJCQkJJmljYl9hZGRyX2MsCi0JCQkJCQkmaWNiX3BpdGNoKTsKLQkJCWlmICghcmV0KSAgewotCQkJCS8qIHNldCBMRFNBMVIgdmFsdWUgKi8KLQkJCQliYXNlX2FkZHJfeSA9IGljYl9hZGRyX3k7Ci0JCQkJcGl0Y2ggPSBpY2JfcGl0Y2g7Ci0KLQkJCQkvKiBzZXQgTERTQTJSIHZhbHVlIGlmIHJlcXVpcmVkICovCi0JCQkJaWYgKGJhc2VfYWRkcl9jKQotCQkJCQliYXNlX2FkZHJfYyA9IGljYl9hZGRyX2M7Ci0KLQkJCQljaC0+bWVyYW1fZW5hYmxlZCA9IDE7Ci0JCQl9CiAJCX0KIAotCQkvKiBwb2ludCBvdXQgb3VyIGZyYW1lIGJ1ZmZlciAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0ExUiwgYmFzZV9hZGRyX3kpOwotCQlpZiAoY2gtPmluZm8tPnZhci5ub25zdGQpCi0JCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU0EyUiwgYmFzZV9hZGRyX2MpOworCQlpZiAoIWNoLT5pbmZvLT52YXIubm9uc3RkKQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfUkdCOworCQllbHNlIGlmIChjaC0+aW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlYyNDsKKwkJZWxzZQorCQkJcGl4ZWxmb3JtYXQgPSBTSF9NT0JJTEVfTUVSQU1fUEZfTlY7CiAKLQkJLyogc2V0IGxpbmUgc2l6ZSAqLwotCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExETUxTUiwgcGl0Y2gpOwotCi0JCS8qIHNldHVwIGRlZmVycmVkIGlvIGlmIFNZUyBidXMgKi8KLQkJdG1wID0gY2gtPmNmZy5zeXNfYnVzX2NmZy5kZWZlcnJlZF9pb19tc2VjOwotCQlpZiAoY2gtPmxkbXQxcl92YWx1ZSAmICgxIDw8IDEyKSAmJiB0bXApIHsKLQkJCWNoLT5kZWZpby5kZWZlcnJlZF9pbyA9IHNoX21vYmlsZV9sY2RjX2RlZmVycmVkX2lvOwotCQkJY2gtPmRlZmlvLmRlbGF5ID0gbXNlY3NfdG9famlmZmllcyh0bXApOwotCQkJY2gtPmluZm8tPmZiZGVmaW8gPSAmY2gtPmRlZmlvOwotCQkJZmJfZGVmZXJyZWRfaW9faW5pdChjaC0+aW5mbyk7Ci0KLQkJCS8qIG9uZS1zaG90IG1vZGUgKi8KLQkJCWxjZGNfd3JpdGVfY2hhbihjaCwgTERTTTFSLCAxKTsKLQotCQkJLyogZW5hYmxlICJGcmFtZSBFbmQgSW50ZXJydXB0IEVuYWJsZSIgYml0ICovCi0JCQlsY2RjX3dyaXRlKHByaXYsIF9MRElOVFIsIExESU5UUl9GRSk7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIGNvbnRpbnVvdXMgcmVhZCBtb2RlICovCi0JCQlsY2RjX3dyaXRlX2NoYW4oY2gsIExEU00xUiwgMCk7Ci0JCX0KKwkJcmV0ID0gbWRldi0+b3BzLT5tZXJhbV9yZWdpc3RlcihtZGV2LCBjZmcsIGNoLT5waXRjaCwKKwkJCQkJY2gtPmluZm8tPnZhci55cmVzLCBwaXhlbGZvcm1hdCwKKwkJCQkJY2gtPmJhc2VfYWRkcl95LCBjaC0+YmFzZV9hZGRyX2MsCisJCQkJCSZjaC0+YmFzZV9hZGRyX3ksICZjaC0+YmFzZV9hZGRyX2MsCisJCQkJCSZjaC0+cGl0Y2gpOworCQlpZiAoIXJldCkKKwkJCWNoLT5tZXJhbV9lbmFibGVkID0gMTsKIAl9CiAKLQkvKiBkaXNwbGF5IG91dHB1dCAqLwotCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMVIsIExDRENfRU5BQkxFKTsKKwkvKiBTdGFydCB0aGUgTENEQy4gKi8KKwlfX3NoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOwogCi0JLyogc3RhcnQgdGhlIGxjZGMgKi8KLQlzaF9tb2JpbGVfbGNkY19zdGFydF9zdG9wKHByaXYsIDEpOwotCXByaXYtPnN0YXJ0ZWQgPSAxOwotCi0JLyogdGVsbCB0aGUgYm9hcmQgY29kZSB0byBlbmFibGUgdGhlIHBhbmVsICovCisJLyogU2V0dXAgZGVmZXJyZWQgSS9PLCB0ZWxsIHRoZSBib2FyZCBjb2RlIHRvIGVuYWJsZSB0aGUgcGFuZWxzLCBhbmQKKwkgKiB0dXJuIGJhY2tsaWdodCBvbi4KKwkgKi8KIAlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwcml2LT5jaCk7IGsrKykgewogCQljaCA9ICZwcml2LT5jaFtrXTsKIAkJaWYgKCFjaC0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwogCisJCXRtcCA9IGNoLT5jZmcuc3lzX2J1c19jZmcuZGVmZXJyZWRfaW9fbXNlYzsKKwkJaWYgKGNoLT5sZG10MXJfdmFsdWUgJiBMRE1UMVJfSUZNICYmIHRtcCkgeworCQkJY2gtPmRlZmlvLmRlZmVycmVkX2lvID0gc2hfbW9iaWxlX2xjZGNfZGVmZXJyZWRfaW87CisJCQljaC0+ZGVmaW8uZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKHRtcCk7CisJCQljaC0+aW5mby0+ZmJkZWZpbyA9ICZjaC0+ZGVmaW87CisJCQlmYl9kZWZlcnJlZF9pb19pbml0KGNoLT5pbmZvKTsKKwkJfQorCiAJCWJvYXJkX2NmZyA9ICZjaC0+Y2ZnLmJvYXJkX2NmZzsKIAkJaWYgKGJvYXJkX2NmZy0+ZGlzcGxheV9vbiAmJiB0cnlfbW9kdWxlX2dldChib2FyZF9jZmctPm93bmVyKSkgewogCQkJYm9hcmRfY2ZnLT5kaXNwbGF5X29uKGJvYXJkX2NmZy0+Ym9hcmRfZGF0YSwgY2gtPmluZm8pOwpAQCAtNzc2LDQyICs3MzQsNDIgQEAKIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19jaGVja19pbnRlcmZhY2Uoc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoKQogewotCWludCBpZm0sIG1pZnR5cDsKKwlpbnQgaW50ZXJmYWNlX3R5cGUgPSBjaC0+Y2ZnLmludGVyZmFjZV90eXBlOwogCi0Jc3dpdGNoIChjaC0+Y2ZnLmludGVyZmFjZV90eXBlKSB7Ci0JY2FzZSBSR0I4OiBpZm0gPSAwOyBtaWZ0eXAgPSAwOyBicmVhazsKLQljYXNlIFJHQjk6IGlmbSA9IDA7IG1pZnR5cCA9IDQ7IGJyZWFrOwotCWNhc2UgUkdCMTJBOiBpZm0gPSAwOyBtaWZ0eXAgPSA1OyBicmVhazsKLQljYXNlIFJHQjEyQjogaWZtID0gMDsgbWlmdHlwID0gNjsgYnJlYWs7Ci0JY2FzZSBSR0IxNjogaWZtID0gMDsgbWlmdHlwID0gNzsgYnJlYWs7Ci0JY2FzZSBSR0IxODogaWZtID0gMDsgbWlmdHlwID0gMTA7IGJyZWFrOwotCWNhc2UgUkdCMjQ6IGlmbSA9IDA7IG1pZnR5cCA9IDExOyBicmVhazsKLQljYXNlIFNZUzhBOiBpZm0gPSAxOyBtaWZ0eXAgPSAwOyBicmVhazsKLQljYXNlIFNZUzhCOiBpZm0gPSAxOyBtaWZ0eXAgPSAxOyBicmVhazsKLQljYXNlIFNZUzhDOiBpZm0gPSAxOyBtaWZ0eXAgPSAyOyBicmVhazsKLQljYXNlIFNZUzhEOiBpZm0gPSAxOyBtaWZ0eXAgPSAzOyBicmVhazsKLQljYXNlIFNZUzk6IGlmbSA9IDE7IG1pZnR5cCA9IDQ7IGJyZWFrOwotCWNhc2UgU1lTMTI6IGlmbSA9IDE7IG1pZnR5cCA9IDU7IGJyZWFrOwotCWNhc2UgU1lTMTZBOiBpZm0gPSAxOyBtaWZ0eXAgPSA3OyBicmVhazsKLQljYXNlIFNZUzE2QjogaWZtID0gMTsgbWlmdHlwID0gODsgYnJlYWs7Ci0JY2FzZSBTWVMxNkM6IGlmbSA9IDE7IG1pZnR5cCA9IDk7IGJyZWFrOwotCWNhc2UgU1lTMTg6IGlmbSA9IDE7IG1pZnR5cCA9IDEwOyBicmVhazsKLQljYXNlIFNZUzI0OiBpZm0gPSAxOyBtaWZ0eXAgPSAxMTsgYnJlYWs7Ci0JZGVmYXVsdDogZ290byBiYWQ7CisJc3dpdGNoIChpbnRlcmZhY2VfdHlwZSkgeworCWNhc2UgUkdCODoKKwljYXNlIFJHQjk6CisJY2FzZSBSR0IxMkE6CisJY2FzZSBSR0IxMkI6CisJY2FzZSBSR0IxNjoKKwljYXNlIFJHQjE4OgorCWNhc2UgUkdCMjQ6CisJY2FzZSBTWVM4QToKKwljYXNlIFNZUzhCOgorCWNhc2UgU1lTOEM6CisJY2FzZSBTWVM4RDoKKwljYXNlIFNZUzk6CisJY2FzZSBTWVMxMjoKKwljYXNlIFNZUzE2QToKKwljYXNlIFNZUzE2QjoKKwljYXNlIFNZUzE2QzoKKwljYXNlIFNZUzE4OgorCWNhc2UgU1lTMjQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIFNVQkxDRCBvbmx5IHN1cHBvcnRzIFNZUyBpbnRlcmZhY2UgKi8KIAlpZiAobGNkY19jaGFuX2lzX3N1YmxjZChjaCkpIHsKLQkJaWYgKGlmbSA9PSAwKQotCQkJZ290byBiYWQ7Ci0JCWVsc2UKLQkJCWlmbSA9IDA7CisJCWlmICghKGludGVyZmFjZV90eXBlICYgTERNVDFSX0lGTSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbnRlcmZhY2VfdHlwZSAmPSB+TERNVDFSX0lGTTsKIAl9CiAKLQljaC0+bGRtdDFyX3ZhbHVlID0gKGlmbSA8PCAxMikgfCBtaWZ0eXA7CisJY2gtPmxkbXQxcl92YWx1ZSA9IGludGVyZmFjZV90eXBlOwogCXJldHVybiAwOwotIGJhZDoKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19zZXR1cF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKQEAgLTgxOSwxOCArNzc3LDI0IEBACiAJCQkJICAgICAgIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2KQogewogCWNoYXIgKnN0cjsKLQlpbnQgaWNrc2VsOwogCiAJc3dpdGNoIChjbG9ja19zb3VyY2UpIHsKLQljYXNlIExDRENfQ0xLX0JVUzogc3RyID0gImJ1c19jbGsiOyBpY2tzZWwgPSAwOyBicmVhazsKLQljYXNlIExDRENfQ0xLX1BFUklQSEVSQUw6IHN0ciA9ICJwZXJpcGhlcmFsX2NsayI7IGlja3NlbCA9IDE7IGJyZWFrOwotCWNhc2UgTENEQ19DTEtfRVhURVJOQUw6IHN0ciA9IE5VTEw7IGlja3NlbCA9IDI7IGJyZWFrOworCWNhc2UgTENEQ19DTEtfQlVTOgorCQlzdHIgPSAiYnVzX2NsayI7CisJCXByaXYtPmxkZGNrciA9IExERENLUl9JQ0tTRUxfQlVTOworCQlicmVhazsKKwljYXNlIExDRENfQ0xLX1BFUklQSEVSQUw6CisJCXN0ciA9ICJwZXJpcGhlcmFsX2NsayI7CisJCXByaXYtPmxkZGNrciA9IExERENLUl9JQ0tTRUxfTUlQSTsKKwkJYnJlYWs7CisJY2FzZSBMQ0RDX0NMS19FWFRFUk5BTDoKKwkJc3RyID0gTlVMTDsKKwkJcHJpdi0+bGRkY2tyID0gTEREQ0tSX0lDS1NFTF9IRE1JOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcml2LT5sZGRja3IgPSBpY2tzZWwgPDwgMTY7Ci0KIAlpZiAoc3RyKSB7CiAJCXByaXYtPmRvdF9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIHN0cik7CiAJCWlmIChJU19FUlIocHJpdi0+ZG90X2NsaykpIHsKQEAgLTkxNCwxMiArODc4LDEyIEBACiAJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfeSwgYmFzZV9hZGRyX2M7CiAJdW5zaWduZWQgbG9uZyBjX29mZnNldDsKIAotCWlmICghdmFyLT5ub25zdGQpCi0JCW5ld19wYW5fb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJKHZhci0+eG9mZnNldCAqIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KSk7CisJaWYgKCFpbmZvLT52YXIubm9uc3RkKQorCQluZXdfcGFuX29mZnNldCA9IHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCQkJICAgICAgICsgdmFyLT54b2Zmc2V0ICogKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOwogCWVsc2UKLQkJbmV3X3Bhbl9vZmZzZXQgPSAodmFyLT55b2Zmc2V0ICogaW5mby0+Zml4LmxpbmVfbGVuZ3RoKSArCi0JCQkodmFyLT54b2Zmc2V0KTsKKwkJbmV3X3Bhbl9vZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgKKwkJCSAgICAgICArIHZhci0+eG9mZnNldDsKIAogCWlmIChuZXdfcGFuX29mZnNldCA9PSBjaC0+cGFuX29mZnNldCkKIAkJcmV0dXJuIDA7CS8qIE5vIGNoYW5nZSwgZG8gbm90aGluZyAqLwpAQCAtOTI4LDQ1ICs4OTIsNDEgQEAKIAogCS8qIFNldCB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBuZXh0IHJlZnJlc2ggKi8KIAliYXNlX2FkZHJfeSA9IGNoLT5kbWFfaGFuZGxlICsgbmV3X3Bhbl9vZmZzZXQ7Ci0JaWYgKHZhci0+bm9uc3RkKSB7CisJaWYgKGluZm8tPnZhci5ub25zdGQpIHsKIAkJLyogU2V0IHkgb2Zmc2V0ICovCi0JCWNfb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqCi0JCQlpbmZvLT5maXgubGluZV9sZW5ndGggKgotCQkJKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAtIDgpKSAvIDg7Ci0JCWJhc2VfYWRkcl9jID0gY2gtPmRtYV9oYW5kbGUgKyB2YXItPnhyZXMgKiB2YXItPnlyZXNfdmlydHVhbCArCi0JCQljX29mZnNldDsKKwkJY19vZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBpbmZvLT5maXgubGluZV9sZW5ndGgKKwkJCSAqIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLSA4KSAvIDg7CisJCWJhc2VfYWRkcl9jID0gY2gtPmRtYV9oYW5kbGUKKwkJCSAgICArIGluZm8tPnZhci54cmVzICogaW5mby0+dmFyLnlyZXNfdmlydHVhbAorCQkJICAgICsgY19vZmZzZXQ7CiAJCS8qIFNldCB4IG9mZnNldCAqLwogCQlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDI0KQogCQkJYmFzZV9hZGRyX2MgKz0gMiAqIHZhci0+eG9mZnNldDsKIAkJZWxzZQogCQkJYmFzZV9hZGRyX2MgKz0gdmFyLT54b2Zmc2V0OwotCX0gZWxzZQotCQliYXNlX2FkZHJfYyA9IDA7CisJfQogCi0JaWYgKCFjaC0+bWVyYW1fZW5hYmxlZCkgewotCQlsY2RjX3dyaXRlX2NoYW5fbWlycm9yKGNoLCBMRFNBMVIsIGJhc2VfYWRkcl95KTsKLQkJaWYgKGJhc2VfYWRkcl9jKQotCQkJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTJSLCBiYXNlX2FkZHJfYyk7Ci0JfSBlbHNlIHsKKwlpZiAoY2gtPm1lcmFtX2VuYWJsZWQpIHsKIAkJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9jZmcgKmNmZzsKIAkJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9pbmZvICptZGV2OwotCQl1bnNpZ25lZCBsb25nIGljYl9hZGRyX3ksIGljYl9hZGRyX2M7CiAJCWludCByZXQ7CiAKIAkJY2ZnID0gY2gtPmNmZy5tZXJhbV9jZmc7CiAJCW1kZXYgPSBwcml2LT5tZXJhbV9kZXY7CiAJCXJldCA9IG1kZXYtPm9wcy0+bWVyYW1fdXBkYXRlKG1kZXYsIGNmZywKIAkJCQkJYmFzZV9hZGRyX3ksIGJhc2VfYWRkcl9jLAotCQkJCQkmaWNiX2FkZHJfeSwgJmljYl9hZGRyX2MpOworCQkJCQkmYmFzZV9hZGRyX3ksICZiYXNlX2FkZHJfYyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCi0JCWxjZGNfd3JpdGVfY2hhbl9taXJyb3IoY2gsIExEU0ExUiwgaWNiX2FkZHJfeSk7Ci0JCWlmIChpY2JfYWRkcl9jKQotCQkJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTJSLCBpY2JfYWRkcl9jKTsKLQogCX0KIAorCWNoLT5iYXNlX2FkZHJfeSA9IGJhc2VfYWRkcl95OworCWNoLT5iYXNlX2FkZHJfYyA9IGJhc2VfYWRkcl9jOworCisJbGNkY193cml0ZV9jaGFuX21pcnJvcihjaCwgTERTQTFSLCBiYXNlX2FkZHJfeSk7CisJaWYgKGluZm8tPnZhci5ub25zdGQpCisJCWxjZGNfd3JpdGVfY2hhbl9taXJyb3IoY2gsIExEU0EyUiwgYmFzZV9hZGRyX2MpOworCiAJaWYgKGxjZGNfY2hhbl9pc19zdWJsY2QoY2gpKQogCQlsY2RjX3dyaXRlKGNoLT5sY2RjLCBfTERSQ05UUiwgbGRyY250ciBeIExEUkNOVFJfU1JTKTsKIAllbHNlCkBAIC05ODUsOSArOTQ1LDExIEBACiAJdW5zaWduZWQgbG9uZyBsZGludHI7CiAJaW50IHJldDsKIAotCS8qIEVuYWJsZSBWU3luYyBFbmQgaW50ZXJydXB0ICovCisJLyogRW5hYmxlIFZTeW5jIEVuZCBpbnRlcnJ1cHQgYW5kIGJlIGNhcmVmdWwgbm90IHRvIGFja25vd2xlZGdlIGFueQorCSAqIHBlbmRpbmcgaW50ZXJydXB0LgorCSAqLwogCWxkaW50ciA9IGxjZGNfcmVhZChjaC0+bGNkYywgX0xESU5UUik7Ci0JbGRpbnRyIHw9IExESU5UUl9WRUU7CisJbGRpbnRyIHw9IExESU5UUl9WRUUgfCBMRElOVFJfU1RBVFVTX01BU0s7CiAJbGNkY193cml0ZShjaC0+bGNkYywgX0xESU5UUiwgbGRpbnRyKTsKIAogCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjaC0+dnN5bmNfY29tcGxldGlvbiwKQEAgLTEwMzcsMTEgKzk5OSw2IEBACiAJCS8qIENvdWxkbid0IHJlY29uZmlndXJlLCBob3BlZnVsbHksIGNhbiBjb250aW51ZSBhcyBiZWZvcmUgKi8KIAkJcmV0dXJuOwogCi0JaWYgKGluZm8tPnZhci5ub25zdGQpCi0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IG1vZGUxLnhyZXM7Ci0JZWxzZQotCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBtb2RlMS54cmVzICogKGNoLT5jZmcuYnBwIC8gOCk7Ci0KIAkvKgogCSAqIGZiX3NldF92YXIoKSBjYWxscyB0aGUgbm90aWZpZXIgY2hhbmdlIGludGVybmFsbHksIG9ubHkgaWYKIAkgKiBGQklORk9fTUlTQ19VU0VSRVZFTlQgZmxhZyBpcyBzZXQuIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIGZha2UgYQpAQCAtMTA5NCwzMCArMTA1MSwxMjYgQEAKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBpbmZvLT5wYXI7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnAgPSBjaC0+bGNkYzsKKwl1bnNpZ25lZCBpbnQgYmVzdF9kaXN0ID0gKHVuc2lnbmVkIGludCktMTsKKwl1bnNpZ25lZCBpbnQgYmVzdF94cmVzID0gMDsKKwl1bnNpZ25lZCBpbnQgYmVzdF95cmVzID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWlmICh2YXItPnhyZXMgPiBNQVhfWFJFUyB8fCB2YXItPnlyZXMgPiBNQVhfWVJFUyB8fAotCSAgICB2YXItPnhyZXMgKiB2YXItPnlyZXMgKiAoY2gtPmNmZy5icHAgLyA4KSAqIDIgPiBpbmZvLT5maXguc21lbV9sZW4pIHsKLQkJZGV2X3dhcm4oaW5mby0+ZGV2LCAiSW52YWxpZCBpbmZvOiAldS0ldS0ldS0ldSB4ICV1LSV1LSV1LSV1IEAgJWx1a0h6IVxuIiwKLQkJCSB2YXItPmxlZnRfbWFyZ2luLCB2YXItPnhyZXMsIHZhci0+cmlnaHRfbWFyZ2luLCB2YXItPmhzeW5jX2xlbiwKLQkJCSB2YXItPnVwcGVyX21hcmdpbiwgdmFyLT55cmVzLCB2YXItPmxvd2VyX21hcmdpbiwgdmFyLT52c3luY19sZW4sCi0JCQkgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spKTsKKwlpZiAodmFyLT54cmVzID4gTUFYX1hSRVMgfHwgdmFyLT55cmVzID4gTUFYX1lSRVMpCiAJCXJldHVybiAtRUlOVkFMOworCisJLyogSWYgYm9hcmQgY29kZSBwcm92aWRlcyB1cyB3aXRoIGEgbGlzdCBvZiBhdmFpbGFibGUgbW9kZXMsIG1ha2Ugc3VyZQorCSAqIHdlIHVzZSBvbmUgb2YgdGhlbS4gRmluZCB0aGUgbW9kZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lLiBUaGUKKwkgKiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBtb2RlcyBpcyBkZWZpbmVkIGFzIHRoZSBzaXplIG9mIHRoZQorCSAqIG5vbi1vdmVybGFwcGluZyBwYXJ0cyBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNoLT5jZmcubnVtX2NmZzsgKytpKSB7CisJCWNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUgPSAmY2gtPmNmZy5sY2RfY2ZnW2ldOworCQl1bnNpZ25lZCBpbnQgZGlzdDsKKworCQkvKiBXZSBjYW4gb25seSByb3VuZCB1cC4gKi8KKwkJaWYgKHZhci0+eHJlcyA+IG1vZGUtPnhyZXMgfHwgdmFyLT55cmVzID4gbW9kZS0+eXJlcykKKwkJCWNvbnRpbnVlOworCisJCWRpc3QgPSB2YXItPnhyZXMgKiB2YXItPnlyZXMgKyBtb2RlLT54cmVzICogbW9kZS0+eXJlcworCQkgICAgIC0gMiAqIG1pbih2YXItPnhyZXMsIG1vZGUtPnhyZXMpCisJCQkgKiBtaW4odmFyLT55cmVzLCBtb2RlLT55cmVzKTsKKworCQlpZiAoZGlzdCA8IGJlc3RfZGlzdCkgeworCQkJYmVzdF94cmVzID0gbW9kZS0+eHJlczsKKwkJCWJlc3RfeXJlcyA9IG1vZGUtPnlyZXM7CisJCQliZXN0X2Rpc3QgPSBkaXN0OworCQl9CiAJfQogCisJLyogSWYgbm8gYXZhaWxhYmxlIG1vZGUgY2FuIGJlIHVzZWQsIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoY2gtPmNmZy5udW1fY2ZnICE9IDApIHsKKwkJaWYgKGJlc3RfZGlzdCA9PSAodW5zaWduZWQgaW50KS0xKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdmFyLT54cmVzID0gYmVzdF94cmVzOworCQl2YXItPnlyZXMgPSBiZXN0X3lyZXM7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSB2aXJ0dWFsIHJlc29sdXRpb24gaXMgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSB2aXNpYmxlCisJICogcmVzb2x1dGlvbi4KKwkgKi8KKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAxNikgewkJLyogUkdCIDU2NSAqLworCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAyNCkgewkJLyogUkdCIDg4OCAqLworCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMjQ7CisJCXZhci0+cmVkLm9mZnNldCA9IDE2OworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCX0gZWxzZSBpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA8PSAzMikgewkJLyogUkdCQSA4ODggKi8KKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDMyOworCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJdmFyLT5yZWQubXNiX3JpZ2h0ID0gMDsKKwl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJdmFyLT5ibHVlLm1zYl9yaWdodCA9IDA7CisJdmFyLT50cmFuc3AubXNiX3JpZ2h0ID0gMDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgb3VyIGFsbG9jYXRlZCBtZW1vcnkuICovCisJaWYgKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCA+CisJICAgIGluZm8tPmZpeC5zbWVtX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBvbmx5IGFjY2VwdCB0aGUgZm9yY2VkX2JwcCBmb3IgZHVhbCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCiAJaWYgKHAtPmZvcmNlZF9icHAgJiYgcC0+Zm9yY2VkX2JwcCAhPSB2YXItPmJpdHNfcGVyX3BpeGVsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgMTY6IC8qIFBLRls0OjBdID0gMDAwMTEgLSBSR0IgNTY1ICovCi0JY2FzZSAyNDogLyogUEtGWzQ6MF0gPSAwMTAxMSAtIFJHQiA4ODggKi8KLQljYXNlIDMyOiAvKiBQS0ZbNDowXSA9IDAwMDAwIC0gUkdCQSA4ODggKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW4gKmNoID0gaW5mby0+cGFyOworCXUzMiBsaW5lX2xlbmd0aCA9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwlpbnQgcmV0OworCisJc2hfbW9iaWxlX2xjZGNfc3RvcChjaC0+bGNkYyk7CisKKwlpZiAoaW5mby0+dmFyLm5vbnN0ZCkKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXM7CisJZWxzZQorCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBpbmZvLT52YXIueHJlcworCQkJCSAgICAgICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gODsKKworCXJldCA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KGNoLT5sY2RjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZm8tPmRldiwgIiVzOiB1bmFibGUgdG8gcmVzdGFydCBMQ0RDXG4iLCBfX2Z1bmNfXyk7CisJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xMTc3LDYgKzEyMzAsNyBAQAogCS5mYl9vcGVuCT0gc2hfbW9iaWxlX29wZW4sCiAJLmZiX3JlbGVhc2UJPSBzaF9tb2JpbGVfcmVsZWFzZSwKIAkuZmJfY2hlY2tfdmFyCT0gc2hfbW9iaWxlX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3Bhcgk9IHNoX21vYmlsZV9zZXRfcGFyLAogfTsKIAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY191cGRhdGVfYmwoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkZXYpCkBAIC0xMjM4LDY2ICsxMjkyLDYgQEAKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmRldik7CiB9CiAKLXN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfc2V0X2JwcChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGJwcCwKLQkJCQkgICBpbnQgbm9uc3RkKQotewotCWlmIChub25zdGQpIHsKLQkJc3dpdGNoIChicHApIHsKLQkJY2FzZSAxMjoKLQkJY2FzZSAxNjoKLQkJY2FzZSAyNDoKLQkJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBicHA7Ci0JCQl2YXItPm5vbnN0ZCA9IG5vbnN0ZDsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGJwcCkgewotCWNhc2UgMTY6IC8qIFBLRls0OjBdID0gMDAwMTEgLSBSR0IgNTY1ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDExOwotCQl2YXItPnJlZC5sZW5ndGggPSA1OwotCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7Ci0JCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwotCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwotCQlicmVhazsKLQotCWNhc2UgMjQ6IC8qIFBLRls0OjBdID0gMDEwMTEgLSBSR0IgODg4ICovCi0JCXZhci0+cmVkLm9mZnNldCA9IDE2OwotCQl2YXItPnJlZC5sZW5ndGggPSA4OwotCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7Ci0JCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwotCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwotCQlicmVhazsKLQotCWNhc2UgMzI6IC8qIFBLRls0OjBdID0gMDAwMDAgLSBSR0JBIDg4OCAqLwotCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKLQkJdmFyLT5yZWQubGVuZ3RoID0gODsKLQkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwotCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPmJsdWUubGVuZ3RoID0gODsKLQkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7Ci0JCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOwotCXZhci0+cmVkLm1zYl9yaWdodCA9IDA7Ci0JdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOwotCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOwotCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwpAQCAtMTMxNiw0NyArMTMxMCwyMCBAQAogc3RhdGljIGludCBzaF9tb2JpbGVfbGNkY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKLQlpbnQgaywgbjsKLQotCS8qIHNhdmUgcGVyLWNoYW5uZWwgcmVnaXN0ZXJzICovCi0JZm9yIChrID0gMDsgayA8IEFSUkFZX1NJWkUocC0+Y2gpOyBrKyspIHsKLQkJY2ggPSAmcC0+Y2hba107Ci0JCWlmICghY2gtPmVuYWJsZWQpCi0JCQljb250aW51ZTsKLQkJZm9yIChuID0gMDsgbiA8IE5SX0NIX1JFR1M7IG4rKykKLQkJCWNoLT5zYXZlZF9jaF9yZWdzW25dID0gbGNkY19yZWFkX2NoYW4oY2gsIG4pOwotCX0KLQotCS8qIHNhdmUgc2hhcmVkIHJlZ2lzdGVycyAqLwotCWZvciAobiA9IDA7IG4gPCBOUl9TSEFSRURfUkVHUzsgbisrKQotCQlwLT5zYXZlZF9zaGFyZWRfcmVnc1tuXSA9IGxjZGNfcmVhZChwLCBsY2RjX3NoYXJlZF9yZWdzW25dKTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJLyogdHVybiBvZmYgTENEQyBoYXJkd2FyZSAqLwotCWxjZGNfd3JpdGUocCwgX0xEQ05UMVIsIDApOworCWxjZGNfd3JpdGUocHJpdiwgX0xEQ05UMVIsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaDsKLQlpbnQgaywgbjsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JLyogcmVzdG9yZSBwZXItY2hhbm5lbCByZWdpc3RlcnMgKi8KLQlmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShwLT5jaCk7IGsrKykgewotCQljaCA9ICZwLT5jaFtrXTsKLQkJaWYgKCFjaC0+ZW5hYmxlZCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKG4gPSAwOyBuIDwgTlJfQ0hfUkVHUzsgbisrKQotCQkJbGNkY193cml0ZV9jaGFuKGNoLCBuLCBjaC0+c2F2ZWRfY2hfcmVnc1tuXSk7Ci0JfQotCi0JLyogcmVzdG9yZSBzaGFyZWQgcmVnaXN0ZXJzICovCi0JZm9yIChuID0gMDsgbiA8IE5SX1NIQVJFRF9SRUdTOyBuKyspCi0JCWxjZGNfd3JpdGUocCwgbGNkY19zaGFyZWRfcmVnc1tuXSwgcC0+c2F2ZWRfc2hhcmVkX3JlZ3Nbbl0pOworCV9fc2hfbW9iaWxlX2xjZGNfc3RhcnQocHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MDgsMjYzICsxMzc1LDYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgaW50IHNoX21vYmlsZV9sY2RjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLQotc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX2xjZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfcHJpdiAqcHJpdjsKLQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgZXJyb3I7Ci0Jdm9pZCAqYnVmOwotCWludCBpLCBqOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWkgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICghcmVzIHx8IGkgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwotCi0JZXJyb3IgPSByZXF1ZXN0X2lycShpLCBzaF9tb2JpbGVfbGNkY19pcnEsIElSUUZfRElTQUJMRUQsCi0JCQkgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBpcnFcbiIpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JcHJpdi0+aXJxID0gaTsKLQlhdG9taWNfc2V0KCZwcml2LT5od191c2VjbnQsIC0xKTsKLQotCWogPSAwOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5jaCk7IGkrKykgewotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGo7Ci0KLQkJY2gtPmxjZGMgPSBwcml2OwotCQltZW1jcHkoJmNoLT5jZmcsICZwZGF0YS0+Y2hbaV0sIHNpemVvZihwZGF0YS0+Y2hbaV0pKTsKLQotCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX2NoZWNrX2ludGVyZmFjZShjaCk7Ci0JCWlmIChlcnJvcikgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVcbiIpOwotCQkJZ290byBlcnIxOwotCQl9Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoLT5mcmFtZV9lbmRfd2FpdCk7Ci0JCWluaXRfY29tcGxldGlvbigmY2gtPnZzeW5jX2NvbXBsZXRpb24pOwotCQljaC0+cGFuX29mZnNldCA9IDA7Ci0KLQkJLyogcHJvYmUgdGhlIGJhY2tsaWdodCBpcyB0aGVyZSBpcyBvbmUgZGVmaW5lZCAqLwotCQlpZiAoY2gtPmNmZy5ibF9pbmZvLm1heF9icmlnaHRuZXNzKQotCQkJY2gtPmJsID0gc2hfbW9iaWxlX2xjZGNfYmxfcHJvYmUoJnBkZXYtPmRldiwgY2gpOwotCi0JCXN3aXRjaCAocGRhdGEtPmNoW2ldLmNoYW4pIHsKLQkJY2FzZSBMQ0RDX0NIQU5fTUFJTkxDRDoKLQkJCWNoLT5lbmFibGVkID0gMSA8PCAxOwotCQkJY2gtPnJlZ19vZmZzID0gbGNkY19vZmZzX21haW5sY2Q7Ci0JCQlqKys7Ci0JCQlicmVhazsKLQkJY2FzZSBMQ0RDX0NIQU5fU1VCTENEOgotCQkJY2gtPmVuYWJsZWQgPSAxIDw8IDI7Ci0JCQljaC0+cmVnX29mZnMgPSBsY2RjX29mZnNfc3VibGNkOwotCQkJaisrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWopIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gY2hhbm5lbHMgZGVmaW5lZFxuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnIxOwotCX0KLQotCS8qIGZvciBkdWFsIGNoYW5uZWwgTENEQyAoTUFJTiArIFNVQikgZm9yY2Ugc2hhcmVkIGJwcCBzZXR0aW5nICovCi0JaWYgKGogPT0gMikKLQkJcHJpdi0+Zm9yY2VkX2JwcCA9IHBkYXRhLT5jaFswXS5icHA7Ci0KLQlwcml2LT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFwcml2LT5iYXNlKQotCQlnb3RvIGVycjE7Ci0KLQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldHVwX2Nsb2NrcyhwZGV2LCBwZGF0YS0+Y2xvY2tfc291cmNlLCBwcml2KTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHNldHVwIGNsb2Nrc1xuIik7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlwcml2LT5tZXJhbV9kZXYgPSBwZGF0YS0+bWVyYW1fZGV2OwotCi0JZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKLQkJY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbGNkX2NmZywgKm1heF9jZmcgPSBOVUxMOwotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGk7Ci0JCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuX2NmZyAqY2ZnID0gJmNoLT5jZmc7Ci0JCWNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUgPSBjZmctPmxjZF9jZmc7Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUgPSAwOwotCQlpbnQgazsKLQkJaW50IG51bV9jZmc7Ci0KLQkJY2gtPmluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCAmcGRldi0+ZGV2KTsKLQkJaWYgKCFjaC0+aW5mbykgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGZiX2luZm9cbiIpOwotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmZvID0gY2gtPmluZm87Ci0JCXZhciA9ICZpbmZvLT52YXI7Ci0JCWluZm8tPmZib3BzID0gJnNoX21vYmlsZV9sY2RjX29wczsKLQkJaW5mby0+cGFyID0gY2g7Ci0KLQkJbXV0ZXhfaW5pdCgmY2gtPm9wZW5fbG9jayk7Ci0KLQkJZm9yIChrID0gMCwgbGNkX2NmZyA9IG1vZGU7Ci0JCSAgICAgayA8IGNmZy0+bnVtX2NmZyAmJiBsY2RfY2ZnOwotCQkgICAgIGsrKywgbGNkX2NmZysrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUgPSBsY2RfY2ZnLT55cmVzICogbGNkX2NmZy0+eHJlczsKLQkJCS8qIE5WMTIgYnVmZmVycyBtdXN0IGhhdmUgZXZlbiBudW1iZXIgb2YgbGluZXMgKi8KLQkJCWlmICgoY2ZnLT5ub25zdGQpICYmIGNmZy0+YnBwID09IDEyICYmCi0JCQkJCShsY2RfY2ZnLT55cmVzICYgMHgxKSkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInlyZXMgbXVzdCBiZSBtdWx0aXBsZSBvZiAyIgotCQkJCQkJIiBmb3IgWUNiQ3I0MjAgbW9kZS5cbiIpOwotCQkJCWVycm9yID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycjE7Ci0JCQl9Ci0KLQkJCWlmIChzaXplID4gbWF4X3NpemUpIHsKLQkJCQltYXhfY2ZnID0gbGNkX2NmZzsKLQkJCQltYXhfc2l6ZSA9IHNpemU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIW1vZGUpCi0JCQltYXhfc2l6ZSA9IE1BWF9YUkVTICogTUFYX1lSRVM7Ci0JCWVsc2UgaWYgKG1heF9jZmcpCi0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGb3VuZCBsYXJnZXN0IHZpZGVvbW9kZSAldXgldVxuIiwKLQkJCQltYXhfY2ZnLT54cmVzLCBtYXhfY2ZnLT55cmVzKTsKLQotCQlpbmZvLT5maXggPSBzaF9tb2JpbGVfbGNkY19maXg7Ci0JCWluZm8tPmZpeC5zbWVtX2xlbiA9IG1heF9zaXplICogMiAqIGNmZy0+YnBwIC8gODsKLQotCQkgLyogT25seSBwYW4gaW4gMiBsaW5lIHN0ZXBzIGZvciBOVjEyICovCi0JCWlmIChjZmctPm5vbnN0ZCAmJiBjZmctPmJwcCA9PSAxMikKLQkJCWluZm8tPmZpeC55cGFuc3RlcCA9IDI7Ci0KLQkJaWYgKCFtb2RlKSB7Ci0JCQltb2RlID0gJmRlZmF1bHRfNzIwcDsKLQkJCW51bV9jZmcgPSAxOwotCQl9IGVsc2UgewotCQkJbnVtX2NmZyA9IGNmZy0+bnVtX2NmZzsKLQkJfQotCi0JCWZiX3ZpZGVvbW9kZV90b19tb2RlbGlzdChtb2RlLCBudW1fY2ZnLCAmaW5mby0+bW9kZWxpc3QpOwotCi0JCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBtb2RlKTsKLQkJdmFyLT53aWR0aCA9IGNmZy0+bGNkX3NpemVfY2ZnLndpZHRoOwotCQl2YXItPmhlaWdodCA9IGNmZy0+bGNkX3NpemVfY2ZnLmhlaWdodDsKLQkJLyogRGVmYXVsdCBZIHZpcnR1YWwgcmVzb2x1dGlvbiBpcyAyeCBwYW5lbCBzaXplICovCi0JCXZhci0+eXJlc192aXJ0dWFsID0gdmFyLT55cmVzICogMjsKLQkJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKLQotCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldF9icHAodmFyLCBjZmctPmJwcCwgY2ZnLT5ub25zdGQpOwotCQlpZiAoZXJyb3IpCi0JCQlicmVhazsKLQotCQlidWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgaW5mby0+Zml4LnNtZW1fbGVuLAotCQkJCQkgJmNoLT5kbWFfaGFuZGxlLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICZjaC0+cHNldWRvX3BhbGV0dGU7Ci0JCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKLQotCQllcnJvciA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIFBBTEVUVEVfTlIsIDApOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgY21hcFxuIik7Ci0JCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBpbmZvLT5maXguc21lbV9sZW4sCi0JCQkJCSAgYnVmLCBjaC0+ZG1hX2hhbmRsZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gY2gtPmRtYV9oYW5kbGU7Ci0JCWlmICh2YXItPm5vbnN0ZCkKLQkJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlczsKLQkJZWxzZQotCQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzICogKGNmZy0+YnBwIC8gOCk7Ci0KLQkJaW5mby0+c2NyZWVuX2Jhc2UgPSBidWY7Ci0JCWluZm8tPmRldmljZSA9ICZwZGV2LT5kZXY7Ci0JCWNoLT5kaXNwbGF5X3ZhciA9ICp2YXI7Ci0JfQotCi0JaWYgKGVycm9yKQotCQlnb3RvIGVycjE7Ci0KLQllcnJvciA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgaGFyZHdhcmVcbiIpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIGk7Ci0KLQkJaW5mbyA9IGNoLT5pbmZvOwotCi0JCWlmIChpbmZvLT5mYmRlZmlvKSB7Ci0JCQljaC0+c2dsaXN0ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAqCi0JCQkJCWluZm8tPmZpeC5zbWVtX2xlbiA+PiBQQUdFX1NISUZUKTsKLQkJCWlmICghY2gtPnNnbGlzdCkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBzZ2xpc3RcbiIpOwotCQkJCWdvdG8gZXJyMTsKLQkJCX0KLQkJfQotCi0JCWluZm8tPmJsX2RldiA9IGNoLT5ibDsKLQotCQllcnJvciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBlcnIxOwotCi0JCWRldl9pbmZvKGluZm8tPmRldiwKLQkJCSAicmVnaXN0ZXJlZCAlcy8lcyBhcyAlZHglZCAlZGJwcC5cbiIsCi0JCQkgcGRldi0+bmFtZSwKLQkJCSAoY2gtPmNmZy5jaGFuID09IExDRENfQ0hBTl9NQUlOTENEKSA/Ci0JCQkgIm1haW5sY2QiIDogInN1YmxjZCIsCi0JCQkgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzLAotCQkJIGNoLT5jZmcuYnBwKTsKLQotCQkvKiBkZWZlcnJlZCBpbyBtb2RlOiBkaXNhYmxlIGNsb2NrIHRvIHNhdmUgcG93ZXIgKi8KLQkJaWYgKGluZm8tPmZiZGVmaW8gfHwgaW5mby0+c3RhdGUgPT0gRkJJTkZPX1NUQVRFX1NVU1BFTkRFRCkKLQkJCXNoX21vYmlsZV9sY2RjX2Nsa19vZmYocHJpdik7Ci0JfQotCi0JLyogRmFpbHVyZSBpZ25vcmVkICovCi0JcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHNoX21vYmlsZV9sY2RjX25vdGlmeTsKLQlmYl9yZWdpc3Rlcl9jbGllbnQoJnByaXYtPm5vdGlmaWVyKTsKLQotCXJldHVybiAwOwotZXJyMToKLQlzaF9tb2JpbGVfbGNkY19yZW1vdmUocGRldik7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2xjZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTE3MTYsNiArMTQyNiwyNzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgc2hfbW9iaWxlX2xjZGNfY2hhbm5lbF9pbml0KHN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCwKKwkJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoX21vYmlsZV9sY2RjX2NoYW5fY2ZnICpjZmcgPSAmY2gtPmNmZzsKKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptYXhfbW9kZTsKKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBtYXhfc2l6ZTsKKwlpbnQgbnVtX2NmZzsKKwl2b2lkICpidWY7CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2luaXQoJmNoLT5vcGVuX2xvY2spOworCisJLyogQWxsb2NhdGUgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UuICovCisJY2gtPmluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCBkZXYpOworCWlmICghY2gtPmluZm8pIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgZmJfaW5mb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWluZm8gPSBjaC0+aW5mbzsKKwlpbmZvLT5mYm9wcyA9ICZzaF9tb2JpbGVfbGNkY19vcHM7CisJaW5mby0+cGFyID0gY2g7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSAmY2gtPnBzZXVkb19wYWxldHRlOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKworCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbW9kZXMgdG8gdmFsaWRhdGUgdGhlbSBhbmQgZmluZCB0aGUgaGlnaGVzdAorCSAqIHJlc29sdXRpb24uCisJICovCisJbWF4X21vZGUgPSBOVUxMOworCW1heF9zaXplID0gMDsKKworCWZvciAoaSA9IDAsIG1vZGUgPSBjZmctPmxjZF9jZmc7IGkgPCBjZmctPm51bV9jZmc7IGkrKywgbW9kZSsrKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gbW9kZS0+eXJlcyAqIG1vZGUtPnhyZXM7CisKKwkJLyogTlYxMiBidWZmZXJzIG11c3QgaGF2ZSBldmVuIG51bWJlciBvZiBsaW5lcyAqLworCQlpZiAoKGNmZy0+bm9uc3RkKSAmJiBjZmctPmJwcCA9PSAxMiAmJgorCQkJCShtb2RlLT55cmVzICYgMHgxKSkgeworCQkJZGV2X2VycihkZXYsICJ5cmVzIG11c3QgYmUgbXVsdGlwbGUgb2YgMiBmb3IgWUNiQ3I0MjAgIgorCQkJCSJtb2RlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChzaXplID4gbWF4X3NpemUpIHsKKwkJCW1heF9tb2RlID0gbW9kZTsKKwkJCW1heF9zaXplID0gc2l6ZTsKKwkJfQorCX0KKworCWlmICghbWF4X3NpemUpCisJCW1heF9zaXplID0gTUFYX1hSRVMgKiBNQVhfWVJFUzsKKwllbHNlCisJCWRldl9kYmcoZGV2LCAiRm91bmQgbGFyZ2VzdCB2aWRlb21vZGUgJXV4JXVcbiIsCisJCQltYXhfbW9kZS0+eHJlcywgbWF4X21vZGUtPnlyZXMpOworCisJLyogSW5pdGlhbGl6ZSBmaXhlZCBzY3JlZW4gaW5mb3JtYXRpb24uIFJlc3RyaWN0IHBhbiB0byAyIGxpbmVzIHN0ZXBzCisJICogZm9yIE5WMTIuCisJICovCisJaW5mby0+Zml4ID0gc2hfbW9iaWxlX2xjZGNfZml4OworCWluZm8tPmZpeC5zbWVtX2xlbiA9IG1heF9zaXplICogMiAqIGNmZy0+YnBwIC8gODsKKwlpZiAoY2ZnLT5ub25zdGQgJiYgY2ZnLT5icHAgPT0gMTIpCisJCWluZm8tPmZpeC55cGFuc3RlcCA9IDI7CisKKwkvKiBDcmVhdGUgdGhlIG1vZGUgbGlzdC4gKi8KKwlpZiAoY2ZnLT5sY2RfY2ZnID09IE5VTEwpIHsKKwkJbW9kZSA9ICZkZWZhdWx0XzcyMHA7CisJCW51bV9jZmcgPSAxOworCX0gZWxzZSB7CisJCW1vZGUgPSBjZmctPmxjZF9jZmc7CisJCW51bV9jZmcgPSBjZmctPm51bV9jZmc7CisJfQorCisJZmJfdmlkZW9tb2RlX3RvX21vZGVsaXN0KG1vZGUsIG51bV9jZmcsICZpbmZvLT5tb2RlbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlIHNjcmVlbiBpbmZvcm1hdGlvbiB1c2luZyB0aGUgZmlyc3QgbW9kZSBhcworCSAqIGRlZmF1bHQuIFRoZSBkZWZhdWx0IFkgdmlydHVhbCByZXNvbHV0aW9uIGlzIHR3aWNlIHRoZSBwYW5lbCBzaXplIHRvCisJICogYWxsb3cgZm9yIGRvdWJsZS1idWZmZXJpbmcuCisJICovCisJdmFyID0gJmluZm8tPnZhcjsKKwlmYl92aWRlb21vZGVfdG9fdmFyKHZhciwgbW9kZSk7CisJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGNmZy0+YnBwOworCXZhci0+d2lkdGggPSBjZmctPmxjZF9zaXplX2NmZy53aWR0aDsKKwl2YXItPmhlaWdodCA9IGNmZy0+bGNkX3NpemVfY2ZnLmhlaWdodDsKKwl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlcyAqIDI7CisJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKworCXJldCA9IHNoX21vYmlsZV9jaGVja192YXIodmFyLCBpbmZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQWxsb2NhdGUgZnJhbWUgYnVmZmVyIG1lbW9yeSBhbmQgY29sb3IgbWFwLiAqLworCWJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGluZm8tPmZpeC5zbWVtX2xlbiwgJmNoLT5kbWFfaGFuZGxlLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCBQQUxFVFRFX05SLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBjbWFwXG4iKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBpbmZvLT5maXguc21lbV9sZW4sCisJCQkJICBidWYsIGNoLT5kbWFfaGFuZGxlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvLT5maXguc21lbV9zdGFydCA9IGNoLT5kbWFfaGFuZGxlOworCWlmICh2YXItPm5vbnN0ZCkKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzOworCWVsc2UKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzICogKGNmZy0+YnBwIC8gOCk7CisKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGJ1ZjsKKwlpbmZvLT5kZXZpY2UgPSBkZXY7CisJY2gtPmRpc3BsYXlfdmFyID0gKnZhcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaF9tb2JpbGVfbGNkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19wcml2ICpwcml2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBudW1fY2hhbm5lbHM7CisJaW50IGVycm9yOworCWludCBpOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWkgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghcmVzIHx8IGkgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgcGxhdGZvcm0gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBkZXZpY2UgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJZXJyb3IgPSByZXF1ZXN0X2lycShpLCBzaF9tb2JpbGVfbGNkY19pcnEsIDAsCisJCQkgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBpcnFcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJcHJpdi0+aXJxID0gaTsKKwlhdG9taWNfc2V0KCZwcml2LT5od191c2VjbnQsIC0xKTsKKworCWZvciAoaSA9IDAsIG51bV9jaGFubmVscyA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkYXRhLT5jaCk7IGkrKykgeworCQlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiAqY2ggPSBwcml2LT5jaCArIG51bV9jaGFubmVsczsKKworCQljaC0+bGNkYyA9IHByaXY7CisJCW1lbWNweSgmY2gtPmNmZywgJnBkYXRhLT5jaFtpXSwgc2l6ZW9mKHBkYXRhLT5jaFtpXSkpOworCisJCWVycm9yID0gc2hfbW9iaWxlX2xjZGNfY2hlY2tfaW50ZXJmYWNlKGNoKTsKKwkJaWYgKGVycm9yKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZVxuIik7CisJCQlnb3RvIGVycjE7CisJCX0KKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2gtPmZyYW1lX2VuZF93YWl0KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZjaC0+dnN5bmNfY29tcGxldGlvbik7CisJCWNoLT5wYW5fb2Zmc2V0ID0gMDsKKworCQkvKiBwcm9iZSB0aGUgYmFja2xpZ2h0IGlzIHRoZXJlIGlzIG9uZSBkZWZpbmVkICovCisJCWlmIChjaC0+Y2ZnLmJsX2luZm8ubWF4X2JyaWdodG5lc3MpCisJCQljaC0+YmwgPSBzaF9tb2JpbGVfbGNkY19ibF9wcm9iZSgmcGRldi0+ZGV2LCBjaCk7CisKKwkJc3dpdGNoIChwZGF0YS0+Y2hbaV0uY2hhbikgeworCQljYXNlIExDRENfQ0hBTl9NQUlOTENEOgorCQkJY2gtPmVuYWJsZWQgPSBMRENOVDJSX01FOworCQkJY2gtPnJlZ19vZmZzID0gbGNkY19vZmZzX21haW5sY2Q7CisJCQludW1fY2hhbm5lbHMrKzsKKwkJCWJyZWFrOworCQljYXNlIExDRENfQ0hBTl9TVUJMQ0Q6CisJCQljaC0+ZW5hYmxlZCA9IExEQ05UMlJfU0U7CisJCQljaC0+cmVnX29mZnMgPSBsY2RjX29mZnNfc3VibGNkOworCQkJbnVtX2NoYW5uZWxzKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghbnVtX2NoYW5uZWxzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGNoYW5uZWxzIGRlZmluZWRcbiIpOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBmb3IgZHVhbCBjaGFubmVsIExDREMgKE1BSU4gKyBTVUIpIGZvcmNlIHNoYXJlZCBicHAgc2V0dGluZyAqLworCWlmIChudW1fY2hhbm5lbHMgPT0gMikKKwkJcHJpdi0+Zm9yY2VkX2JwcCA9IHBkYXRhLT5jaFswXS5icHA7CisKKwlwcml2LT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwcml2LT5iYXNlKQorCQlnb3RvIGVycjE7CisKKwllcnJvciA9IHNoX21vYmlsZV9sY2RjX3NldHVwX2Nsb2NrcyhwZGV2LCBwZGF0YS0+Y2xvY2tfc291cmNlLCBwcml2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHNldHVwIGNsb2Nrc1xuIik7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlwcml2LT5tZXJhbV9kZXYgPSBwZGF0YS0+bWVyYW1fZGV2OworCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IHByaXYtPmNoICsgaTsKKworCQllcnJvciA9IHNoX21vYmlsZV9sY2RjX2NoYW5uZWxfaW5pdChjaCwgJnBkZXYtPmRldik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyMTsKKwl9CisKKwllcnJvciA9IHNoX21vYmlsZV9sY2RjX3N0YXJ0KHByaXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgaGFyZHdhcmVcbiIpOworCQlnb3RvIGVycjE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuICpjaCA9IHByaXYtPmNoICsgaTsKKwkJc3RydWN0IGZiX2luZm8gKmluZm8gPSBjaC0+aW5mbzsKKworCQlpZiAoaW5mby0+ZmJkZWZpbykgeworCQkJY2gtPnNnbGlzdCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKgorCQkJCQlpbmZvLT5maXguc21lbV9sZW4gPj4gUEFHRV9TSElGVCk7CisJCQlpZiAoIWNoLT5zZ2xpc3QpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgc2dsaXN0XG4iKTsKKwkJCQlnb3RvIGVycjE7CisJCQl9CisJCX0KKworCQlpbmZvLT5ibF9kZXYgPSBjaC0+Ymw7CisKKwkJZXJyb3IgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyMTsKKworCQlkZXZfaW5mbyhpbmZvLT5kZXYsCisJCQkgInJlZ2lzdGVyZWQgJXMvJXMgYXMgJWR4JWQgJWRicHAuXG4iLAorCQkJIHBkZXYtPm5hbWUsCisJCQkgKGNoLT5jZmcuY2hhbiA9PSBMQ0RDX0NIQU5fTUFJTkxDRCkgPworCQkJICJtYWlubGNkIiA6ICJzdWJsY2QiLAorCQkJIGluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywKKwkJCSBjaC0+Y2ZnLmJwcCk7CisKKwkJLyogZGVmZXJyZWQgaW8gbW9kZTogZGlzYWJsZSBjbG9jayB0byBzYXZlIHBvd2VyICovCisJCWlmIChpbmZvLT5mYmRlZmlvIHx8IGluZm8tPnN0YXRlID09IEZCSU5GT19TVEFURV9TVVNQRU5ERUQpCisJCQlzaF9tb2JpbGVfbGNkY19jbGtfb2ZmKHByaXYpOworCX0KKworCS8qIEZhaWx1cmUgaWdub3JlZCAqLworCXByaXYtPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBzaF9tb2JpbGVfbGNkY19ub3RpZnk7CisJZmJfcmVnaXN0ZXJfY2xpZW50KCZwcml2LT5ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK2VycjE6CisJc2hfbW9iaWxlX2xjZGNfcmVtb3ZlKHBkZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF9tb2JpbGVfbGNkY19kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJzaF9tb2JpbGVfbGNkY19mYiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9sY2RjZmIuaCBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCmluZGV4IGFlZWQ2NjguLmE1OGEwZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2xjZGNmYi5oCkBAIC0xOCw2ICsxOCwxMyBAQAogc3RydWN0IGZiX2luZm87CiBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZTsKIAorLyoKKyAqIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuIC0gTENEQyBkaXNwbGF5IGNoYW5uZWwKKyAqCisgKiBAYmFzZV9hZGRyX3k6IEZyYW1lIGJ1ZmZlciB2aWV3cG9ydCBiYXNlIGFkZHJlc3MgKGx1bWEgY29tcG9uZW50KQorICogQGJhc2VfYWRkcl9jOiBGcmFtZSBidWZmZXIgdmlld3BvcnQgYmFzZSBhZGRyZXNzIChjaHJvbWEgY29tcG9uZW50KQorICogQHBpdGNoOiBGcmFtZSBidWZmZXIgbGluZSBwaXRjaAorICovCiBzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfY2hhbiB7CiAJc3RydWN0IHNoX21vYmlsZV9sY2RjX3ByaXYgKmxjZGM7CiAJdW5zaWduZWQgbG9uZyAqcmVnX29mZnM7CkBAIC0yNSw3ICszMiw2IEBACiAJdW5zaWduZWQgbG9uZyBlbmFibGVkOyAvKiBNRSBhbmQgU0UgaW4gTERDTlQyUiAqLwogCXN0cnVjdCBzaF9tb2JpbGVfbGNkY19jaGFuX2NmZyBjZmc7CiAJdTMyIHBzZXVkb19wYWxldHRlW1BBTEVUVEVfTlJdOwotCXVuc2lnbmVkIGxvbmcgc2F2ZWRfY2hfcmVnc1tOUl9DSF9SRUdTXTsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmw7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwpAQCAtNDAsNiArNDYsMTAgQEAKIAlpbnQgYmxhbmtfc3RhdHVzOwogCXN0cnVjdCBtdXRleCBvcGVuX2xvY2s7CQkvKiBwcm90ZWN0cyB0aGUgdXNlIGNvdW50ZXIgKi8KIAlpbnQgbWVyYW1fZW5hYmxlZDsKKworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyX3k7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfYzsKKwl1bnNpZ25lZCBpbnQgcGl0Y2g7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMgYi9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9tZXJhbS5jCmluZGV4IGNjN2Q3MzIuLjRkNjM0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uYwpAQCAtMTIsMjkgKzEyLDEwMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgInNoX21vYmlsZV9tZXJhbS5oIgorI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9tZXJhbS5oPgogCiAvKiBtZXJhbSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUV4eENUTCAweDAKLSNkZWZpbmUgTUV4eEJTSVpFIDB4NAotI2RlZmluZSBNRXh4TU5DRiAweDgKLSNkZWZpbmUgTUV4eFNBUkEgMHgxMAotI2RlZmluZSBNRXh4U0FSQiAweDE0Ci0jZGVmaW5lIE1FeHhTQlNJWkUgMHgxOAorI2RlZmluZSBNRVZDUjEJCQkweDQKKyNkZWZpbmUgTUVWQ1IxX1JTVAkJKDEgPDwgMzEpCisjZGVmaW5lIE1FVkNSMV9XRAkJKDEgPDwgMzApCisjZGVmaW5lIE1FVkNSMV9BTUQxCQkoMSA8PCAyOSkKKyNkZWZpbmUgTUVWQ1IxX0FNRDAJCSgxIDw8IDI4KQorI2RlZmluZSBNRVFTRUwxCQkJMHg0MAorI2RlZmluZSBNRVFTRUwyCQkJMHg0NAogCi0jZGVmaW5lIE1FUkFNX01FeHhDVExfVkFMKGN0bCwgbmV4dF9pY2IsIGFkZHIpCVwKLQkoKGN0bCkgfCAoKChuZXh0X2ljYikgJiAweDFmKSA8PCAxMSkgfCAoKChhZGRyKSAmIDB4N2ZmKSA8PCAxNikpCi0jZGVmaW5lCU1FUkFNX01FeHhCU0laRV9WQUwoYSwgYiwgYykgXAotCSgoKGEpIDw8IDI4KSB8ICgoYikgPDwgMTYpIHwgKGMpKQorI2RlZmluZSBNRXh4Q1RMCQkJMHg0MDAKKyNkZWZpbmUgTUV4eENUTF9CVgkJKDEgPDwgMzEpCisjZGVmaW5lIE1FeHhDVExfQlNaX1NISUZUCTI4CisjZGVmaW5lIE1FeHhDVExfTVNBUl9NQVNLCSgweDdmZiA8PCBNRXh4Q1RMX01TQVJfU0hJRlQpCisjZGVmaW5lIE1FeHhDVExfTVNBUl9TSElGVAkxNgorI2RlZmluZSBNRXh4Q1RMX05YVF9NQVNLCSgweDFmIDw8IE1FeHhDVExfTlhUX1NISUZUKQorI2RlZmluZSBNRXh4Q1RMX05YVF9TSElGVAkxMQorI2RlZmluZSBNRXh4Q1RMX1dEMQkJKDEgPDwgMTApCisjZGVmaW5lIE1FeHhDVExfV0QwCQkoMSA8PCA5KQorI2RlZmluZSBNRXh4Q1RMX1dTCQkoMSA8PCA4KQorI2RlZmluZSBNRXh4Q1RMX0NCCQkoMSA8PCA3KQorI2RlZmluZSBNRXh4Q1RMX1dCRgkJKDEgPDwgNikKKyNkZWZpbmUgTUV4eENUTF9XRgkJKDEgPDwgNSkKKyNkZWZpbmUgTUV4eENUTF9SRgkJKDEgPDwgNCkKKyNkZWZpbmUgTUV4eENUTF9DTQkJKDEgPDwgMykKKyNkZWZpbmUgTUV4eENUTF9NRF9SRUFECQkoMSA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX1dSSVRFCSgyIDw8IDApCisjZGVmaW5lIE1FeHhDVExfTURfSUNCX1dCCSgzIDw8IDApCisjZGVmaW5lIE1FeHhDVExfTURfSUNCCQkoNCA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX0ZCCQkoNyA8PCAwKQorI2RlZmluZSBNRXh4Q1RMX01EX01BU0sJCSg3IDw8IDApCisjZGVmaW5lIE1FeHhCU0laRQkJMHg0MDQKKyNkZWZpbmUgTUV4eEJTSVpFX1JDTlRfU0hJRlQJMjgKKyNkZWZpbmUgTUV4eEJTSVpFX1lTWk0xX1NISUZUCTE2CisjZGVmaW5lIE1FeHhCU0laRV9YU1pNMV9TSElGVAkwCisjZGVmaW5lIE1FeHhNTkNGCQkweDQwOAorI2RlZmluZSBNRXh4TU5DRl9LV0JOTV9TSElGVAkyOAorI2RlZmluZSBNRXh4TU5DRl9LUkJOTV9TSElGVAkyNAorI2RlZmluZSBNRXh4TU5DRl9CTk1fU0hJRlQJMTYKKyNkZWZpbmUgTUV4eE1OQ0ZfWEJWCQkoMSA8PCAxNSkKKyNkZWZpbmUgTUV4eE1OQ0ZfQ1BMX1lDQkNSNDQ0CSgxIDw8IDEyKQorI2RlZmluZSBNRXh4TU5DRl9DUExfWUNCQ1I0MjAJKDIgPDwgMTIpCisjZGVmaW5lIE1FeHhNTkNGX0NQTF9ZQ0JDUjQyMgkoMyA8PCAxMikKKyNkZWZpbmUgTUV4eE1OQ0ZfQ1BMX01TSwkoMyA8PCAxMikKKyNkZWZpbmUgTUV4eE1OQ0ZfQkwJCSgxIDw8IDIpCisjZGVmaW5lIE1FeHhNTkNGX0xOTV9TSElGVAkwCisjZGVmaW5lIE1FeHhTQVJBCQkweDQxMAorI2RlZmluZSBNRXh4U0FSQgkJMHg0MTQKKyNkZWZpbmUgTUV4eFNCU0laRQkJMHg0MTgKKyNkZWZpbmUgTUV4eFNCU0laRV9IRFYJCSgxIDw8IDMxKQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjE2CSgwIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjMyCSgxIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjY0CSgyIDw8IDI4KQorI2RlZmluZSBNRXh4U0JTSVpFX0hTWjEyOAkoMyA8PCAyOCkKKyNkZWZpbmUgTUV4eFNCU0laRV9TQlNJWlpfU0hJRlQJMAogCi0jZGVmaW5lIE1FVkNSMSAweDQKLSNkZWZpbmUgTUVBQ1RTIDB4MTAKLSNkZWZpbmUgTUVRU0VMMSAweDQwCi0jZGVmaW5lIE1FUVNFTDIgMHg0NAorI2RlZmluZSBNRVJBTV9NRXh4Q1RMX1ZBTChuZXh0LCBhZGRyKQlcCisJKCgoKG5leHQpIDw8IE1FeHhDVExfTlhUX1NISUZUKSAmIE1FeHhDVExfTlhUX01BU0spIHwgXAorCSAoKChhZGRyKSA8PCBNRXh4Q1RMX01TQVJfU0hJRlQpICYgTUV4eENUTF9NU0FSX01BU0spKQorI2RlZmluZQlNRVJBTV9NRXh4QlNJWkVfVkFMKHJjbnQsIHlzem0xLCB4c3ptMSkgXAorCSgoKHJjbnQpIDw8IE1FeHhCU0laRV9SQ05UX1NISUZUKSB8IFwKKwkgKCh5c3ptMSkgPDwgTUV4eEJTSVpFX1lTWk0xX1NISUZUKSB8IFwKKwkgKCh4c3ptMSkgPDwgTUV4eEJTSVpFX1hTWk0xX1NISUZUKSkKKworI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTQkJMzIKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tbW9uX3JlZ3NbXSA9IHsKKwlNRVZDUjEsCisJTUVRU0VMMSwKKwlNRVFTRUwyLAorfTsKKyNkZWZpbmUgQ01OX1JFR1NfU0laRSBBUlJBWV9TSVpFKGNvbW1vbl9yZWdzKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpY2JfcmVnc1tdID0geworCU1FeHhDVEwsCisJTUV4eEJTSVpFLAorCU1FeHhNTkNGLAorCU1FeHhTQVJBLAorCU1FeHhTQVJCLAorCU1FeHhTQlNJWkUsCit9OworI2RlZmluZSBJQ0JfUkVHU19TSVpFIEFSUkFZX1NJWkUoaWNiX3JlZ3MpCisKK3N0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiB7CisJdm9pZCBfX2lvbWVtCSpiYXNlOworCXN0cnVjdCBtdXRleAlsb2NrOworCXVuc2lnbmVkIGxvbmcJdXNlZF9pY2I7CisJaW50CQl1c2VkX21lcmFtX2NhY2hlX3JlZ2lvbnM7CisJdW5zaWduZWQgbG9uZwl1c2VkX21lcmFtX2NhY2hlW1NIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKKwl1bnNpZ25lZCBsb25nCWNtbl9zYXZlZF9yZWdzW0NNTl9SRUdTX1NJWkVdOworCXVuc2lnbmVkIGxvbmcJaWNiX3NhdmVkX3JlZ3NbSUNCX1JFR1NfU0laRSAqIFNIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKK307CiAKIC8qIHNldHRpbmdzICovCiAjZGVmaW5lIE1FUkFNX1NFQ19MSU5FIDE1CkBAIC00NCw4ICsxMTgsNyBAQAogICogTUVSQU0vSUNCIGFjY2VzcyBmdW5jdGlvbnMKICAqLwogCi0jZGVmaW5lIE1FUkFNX0lDQl9PRkZTRVQoYmFzZSwgaWR4LCBvZmYpCVwKLQkoKGJhc2UpICsgKDB4NDAwICsgKChpZHgpICogMHgyMCkgKyAob2ZmKSkpCisjZGVmaW5lIE1FUkFNX0lDQl9PRkZTRVQoYmFzZSwgaWR4LCBvZmYpCSgoYmFzZSkgKyAob2ZmKSArIChpZHgpICogMHgyMCkKIAogc3RhdGljIGlubGluZSB2b2lkIG1lcmFtX3dyaXRlX2ljYih2b2lkIF9faW9tZW0gKmJhc2UsIGludCBpZHgsIGludCBvZmYsCiAJdW5zaWduZWQgbG9uZyB2YWwpCkBAIC0yODAsMTcgKzM1MywxOCBAQAogCS8qCiAJICogU2V0IE1FUkFNIGZvciBmcmFtZWJ1ZmZlcgogCSAqCi0JICogMHg3MGY6ICBXRCA9IDB4MywgV1M9MHgxLCBDTT0weDEsIE1EPUZCIG1vZGUKIAkgKiB3ZSBhbHNvIGNoYWluIHRoZSBjYWNoZV9pY2IgYW5kIHRoZSBtYXJrZXJfaWNiLgogCSAqIHdlIGFsc28gc3BsaXQgdGhlIGFsbG9jYXRlZCBNRVJBTSBidWZmZXIgYmV0d2VlbiB0d28gSUNCcy4KIAkgKi8KIAltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsIE1FeHhDVEwsCi0JCQlNRVJBTV9NRXh4Q1RMX1ZBTCgweDcwZiwgaWNiLT5tYXJrZXJfaWNiLAotCQkJCQkgIGljYi0+bWVyYW1fb2Zmc2V0KSk7CisJCQlNRVJBTV9NRXh4Q1RMX1ZBTChpY2ItPm1hcmtlcl9pY2IsIGljYi0+bWVyYW1fb2Zmc2V0KSB8CisJCQlNRXh4Q1RMX1dEMSB8IE1FeHhDVExfV0QwIHwgTUV4eENUTF9XUyB8IE1FeHhDVExfQ00gfAorCQkJTUV4eENUTF9NRF9GQik7CiAJbWVyYW1fd3JpdGVfaWNiKHByaXYtPmJhc2UsIGljYi0+bWFya2VyX2ljYiwgTUV4eENUTCwKLQkJCU1FUkFNX01FeHhDVExfVkFMKDB4NzBmLCBpY2ItPmNhY2hlX2ljYiwKLQkJCQkJICBpY2ItPm1lcmFtX29mZnNldCArCi0JCQkJCSAgaWNiLT5tZXJhbV9zaXplIC8gMikpOworCQkJTUVSQU1fTUV4eENUTF9WQUwoaWNiLT5jYWNoZV9pY2IsIGljYi0+bWVyYW1fb2Zmc2V0ICsKKwkJCQkJICBpY2ItPm1lcmFtX3NpemUgLyAyKSB8CisJCQlNRXh4Q1RMX1dEMSB8IE1FeHhDVExfV0QwIHwgTUV4eENUTF9XUyB8IE1FeHhDVExfQ00gfAorCQkJTUV4eENUTF9NRF9GQik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5OSw4ICszNzMsMTAgQEAKIAkJCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1faWNiICppY2IpCiB7CiAJLyogZGlzYWJsZSBJQ0IgKi8KLQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsICBNRXh4Q1RMLCAwKTsKLQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5tYXJrZXJfaWNiLCBNRXh4Q1RMLCAwKTsKKwltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaWNiLT5jYWNoZV9pY2IsICBNRXh4Q1RMLAorCQkJTUV4eENUTF9XQkYgfCBNRXh4Q1RMX1dGIHwgTUV4eENUTF9SRik7CisJbWVyYW1fd3JpdGVfaWNiKHByaXYtPmJhc2UsIGljYi0+bWFya2VyX2ljYiwgTUV4eENUTCwKKwkJCU1FeHhDVExfV0JGIHwgTUV4eENUTF9XRiB8IE1FeHhDVExfUkYpOwogCWljYi0+Y2FjaGVfdW5pdCA9IDA7CiB9CiAKQEAgLTMzNywyNCArNDEzLDIyIEBACiAJCXhyZXMsIHlyZXMsICghcGl4ZWxmb3JtYXQpID8gInl1diIgOiAicmdiIiwKIAkJYmFzZV9hZGRyX3ksIGJhc2VfYWRkcl9jKTsKIAotCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwotCiAJLyogd2UgY2FuJ3QgaGFuZGxlIHdpZGVyIHRoYW4gODE5MnB4ICovCiAJaWYgKHhyZXMgPiA4MTkyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIndpZHRoIGV4Y2VlZGluZyB0aGUgbGltaXQgKD4gODE5MikuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKHByaXYtPnVzZWRfbWVyYW1fY2FjaGVfcmVnaW9ucyArIDIgPiBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtb3JlIElDQiBhdmFpbGFibGUuIik7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBlcnI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGRvIHdlIGhhdmUgYXQgbGVhc3Qgb25lIElDQiBjb25maWc/ICovCiAJaWYgKGNmZy0+aWNiWzBdLm1hcmtlcl9pY2IgPCAwIHx8IGNmZy0+aWNiWzBdLmNhY2hlX2ljYiA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYXQgbGVhc3Qgb25lIElDQiBpcyByZXF1aXJlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAocHJpdi0+dXNlZF9tZXJhbV9jYWNoZV9yZWdpb25zICsgMiA+IFNIX01PQklMRV9NRVJBTV9JQ0JfTlVNKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1vcmUgSUNCIGF2YWlsYWJsZS4iKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC00NjAsNiArNTM0LDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX21lcmFtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBrLCBqOworCisJZm9yIChrID0gMDsgayA8IENNTl9SRUdTX1NJWkU7IGsrKykKKwkJcHJpdi0+Y21uX3NhdmVkX3JlZ3Nba10gPSBtZXJhbV9yZWFkX3JlZyhwcml2LT5iYXNlLAorCQkJY29tbW9uX3JlZ3Nba10pOworCisJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJaWYgKCF0ZXN0X2JpdChqLCAmcHJpdi0+dXNlZF9pY2IpKQorCQkJY29udGludWU7CisJCWZvciAoayA9IDA7IGsgPCBJQ0JfUkVHU19TSVpFOyBrKyspIHsKKwkJCXByaXYtPmljYl9zYXZlZF9yZWdzW2ogKiBJQ0JfUkVHU19TSVpFICsga10gPQorCQkJCW1lcmFtX3JlYWRfaWNiKHByaXYtPmJhc2UsIGosIGljYl9yZWdzW2tdKTsKKwkJCS8qIFJlc2V0IElDQiBvbiByZXN1bWUgKi8KKwkJCWlmIChpY2JfcmVnc1trXSA9PSBNRXh4Q1RMKQorCQkJCXByaXYtPmljYl9zYXZlZF9yZWdzW2ogKiBJQ0JfUkVHU19TSVpFICsga10gfD0KKwkJCQkJTUV4eENUTF9XQkYgfCBNRXh4Q1RMX1dGIHwgTUV4eENUTF9SRjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9tb2JpbGVfbWVyYW1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaywgajsKKworCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCWlmICghdGVzdF9iaXQoaiwgJnByaXYtPnVzZWRfaWNiKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGsgPSAwOyBrIDwgSUNCX1JFR1NfU0laRTsgaysrKSB7CisJCQltZXJhbV93cml0ZV9pY2IocHJpdi0+YmFzZSwgaiwgaWNiX3JlZ3Nba10sCisJCQlwcml2LT5pY2Jfc2F2ZWRfcmVnc1tqICogSUNCX1JFR1NfU0laRSArIGtdKTsKKwkJfQorCX0KKworCWZvciAoayA9IDA7IGsgPCBDTU5fUkVHU19TSVpFOyBrKyspCisJCW1lcmFtX3dyaXRlX3JlZyhwcml2LT5iYXNlLCBjb21tb25fcmVnc1trXSwKKwkJCXByaXYtPmNtbl9zYXZlZF9yZWdzW2tdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNoX21vYmlsZV9tZXJhbV9kZXZfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBzaF9tb2JpbGVfbWVyYW1fcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHNoX21vYmlsZV9tZXJhbV9ydW50aW1lX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX21lcmFtX29wcyBzaF9tb2JpbGVfbWVyYW1fb3BzID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5tZXJhbV9yZWdpc3RlcgkJPSBzaF9tb2JpbGVfbWVyYW1fcmVnaXN0ZXIsCkBAIC01MTMsNyArNjM4LDkgQEAKIAogCS8qIGluaXRpYWxpemUgSUNCIGFkZHJlc3NpbmcgbW9kZSAqLwogCWlmIChwZGF0YS0+YWRkcl9tb2RlID09IFNIX01PQklMRV9NRVJBTV9NT0RFMSkKLQkJbWVyYW1fd3JpdGVfcmVnKHByaXYtPmJhc2UsIE1FVkNSMSwgMSA8PCAyOSk7CisJCW1lcmFtX3dyaXRlX3JlZyhwcml2LT5iYXNlLCBNRVZDUjEsIE1FVkNSMV9BTUQxKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgInNoX21vYmlsZV9tZXJhbSBpbml0aWFsaXplZC4iKTsKIApAQCAtNTMwLDYgKzY1Nyw4IEBACiB7CiAJc3RydWN0IHNoX21vYmlsZV9tZXJhbV9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKIAlpZiAocHJpdi0+YmFzZSkKIAkJaW91bm1hcChwcml2LT5iYXNlKTsKIApAQCAtNTQ0LDYgKzY3Myw3IEBACiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJCT0gInNoX21vYmlsZV9tZXJhbSIsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJLnBtCQk9ICZzaF9tb2JpbGVfbWVyYW1fZGV2X3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBzaF9tb2JpbGVfbWVyYW1fcHJvYmUsCiAJLnJlbW92ZQkJPSBzaF9tb2JpbGVfbWVyYW1fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uaCBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX21lcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzU0ZmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfbWVyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSNpZm5kZWYgX19zaF9tb2JpbGVfbWVyYW1faF9fCi0jZGVmaW5lIF9fc2hfbW9iaWxlX21lcmFtX2hfXwotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDx2aWRlby9zaF9tb2JpbGVfbWVyYW0uaD4KLQotLyoKLSAqIE1FUkFNIHByaXZhdGUKLSAqLwotCi0jZGVmaW5lIE1FUkFNX0lDQl9ZIDB4MQotI2RlZmluZSBNRVJBTV9JQ0JfQyAweDIKLQotLyogTUVSQU0gY2FjaGUgc2l6ZSAqLwotI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fSUNCX05VTQkJMzIKLQotI2RlZmluZSBTSF9NT0JJTEVfTUVSQU1fQ0FDSEVfT0ZGU0VUKHApCSgocCkgPj4gMTYpCi0jZGVmaW5lIFNIX01PQklMRV9NRVJBTV9DQUNIRV9TSVpFKHApCSgocCkgJiAweGZmZmYpCi0KLXN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fcHJpdiB7Ci0Jdm9pZCBfX2lvbWVtCSpiYXNlOwotCXN0cnVjdCBtdXRleAlsb2NrOwotCXVuc2lnbmVkIGxvbmcJdXNlZF9pY2I7Ci0JaW50CQl1c2VkX21lcmFtX2NhY2hlX3JlZ2lvbnM7Ci0JdW5zaWduZWQgbG9uZwl1c2VkX21lcmFtX2NhY2hlW1NIX01PQklMRV9NRVJBTV9JQ0JfTlVNXTsKLX07Ci0KLWludCBzaF9tb2JpbGVfbWVyYW1fYWxsb2NfaWNiKGNvbnN0IHN0cnVjdCBzaF9tb2JpbGVfbWVyYW1fY2ZnICpjZmcsCi0JCSAgIGludCB4cmVzLAotCQkgICBpbnQgeXJlcywKLQkJICAgdW5zaWduZWQgaW50IGJhc2VfYWRkciwKLQkJICAgaW50IHl1dl9tb2RlLAotCQkgICBpbnQgKm1hcmtlcl9pY2IsCi0JCSAgIGludCAqb3V0X3BpdGNoKTsKLQotdm9pZCBzaF9tb2JpbGVfbWVyYW1fZnJlZV9pY2IoaW50IG1hcmtlcl9pY2IpOwotCi0jZGVmaW5lIFNIX01PQklMRV9NRVJBTV9TVEFSVChpbmQsIGFiKSBcCi0JKDB4QzAwMDAwMDAgfCAoKGFiICYgMHgxKSA8PCAyMykgfCAoKGluZCAmIDB4MUYpIDw8IDI0KSkKLQotI2VuZGlmIC8qICFfX3NoX21vYmlsZV9tZXJhbV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCmluZGV4IDc1MjU5ODQuLjA3OGNhMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYwpAQCAtMTMzMywxOSArMTMzMywxNCBAQAogfQogCiBzdGF0aWMgaW50Ci1zaXNmYl9wYW5fdmFyKHN0cnVjdCBzaXNfdmlkZW9faW5mbyAqaXZpZGVvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3Npc2ZiX3Bhbl92YXIoc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8sIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCSAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWlmKHZhci0+eG9mZnNldCA+ICh2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcykpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmKHZhci0+eW9mZnNldCA+ICh2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcykpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaXZpZGVvLT5jdXJyZW50X2Jhc2UgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwpICsgdmFyLT54b2Zmc2V0OworCWl2aWRlby0+Y3VycmVudF9iYXNlID0gdmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbAorCQkJICAgICArIHZhci0+eG9mZnNldDsKIAogCS8qIGNhbGN1bGF0ZSBiYXNlIGJwcCBkZXAuICovCi0Jc3dpdGNoKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgMzI6CiAJCWJyZWFrOwogCWNhc2UgMTY6CkBAIC0xNjM1LDIwICsxNjMwLDE1IEBACiAJc3RydWN0IHNpc192aWRlb19pbmZvICppdmlkZW8gPSAoc3RydWN0IHNpc192aWRlb19pbmZvICopaW5mby0+cGFyOwogCWludCBlcnI7CiAKLQlpZih2YXItPnhvZmZzZXQgPiAodmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMpKQorCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYodmFyLT55b2Zmc2V0ID4gKHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzKSkKKwlpZiAodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8CisJICAgIHZhci0+eW9mZnNldCArIGluZm8tPnZhci55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZih2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYodmFyLT54b2Zmc2V0ICsgaW5mby0+dmFyLnhyZXMgPiBpbmZvLT52YXIueHJlc192aXJ0dWFsIHx8Ci0JICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmKChlcnIgPSBzaXNmYl9wYW5fdmFyKGl2aWRlbywgdmFyKSkgPCAwKQorCWVyciA9IHNpc2ZiX3Bhbl92YXIoaXZpZGVvLCBpbmZvLCB2YXIpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJaW5mby0+dmFyLnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NrZWxldG9uZmIuYyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCmluZGV4IDg5MTU4YmMuLjMwZjdhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2tlbGV0b25mYi5jCkBAIC05ODksNyArOTg5LDcgQEAKICAqLwogaW50IF9faW5pdCB4eHhmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewotICAgIC8qIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz14eHhmYjonKSAqLworICAgIC8qIFBhcnNlIHVzZXIgc3BlY2lmaWVkIG9wdGlvbnMgKGB2aWRlbz14eHhmYjonKSAqLwogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCmluZGV4IDYyOTRkY2EuLmE3ODI1NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCkBAIC01ODIsNyArNTgyLDcgQEAKIHsKIAlzdHJ1Y3Qgc201MDFmYl9wYXIgICpwYXIgPSBpbmZvLT5wYXI7CiAJc3RydWN0IHNtNTAxZmJfaW5mbyAqZmJpID0gcGFyLT5pbmZvOwotCXVuc2lnbmVkIGludCBieXRlc19waXhlbCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OworCXVuc2lnbmVkIGludCBieXRlc19waXhlbCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAJdW5zaWduZWQgbG9uZyB4b2ZmczsKIApAQCAtNjE0LDEwICs2MTQsMTAgQEAKIAlzdHJ1Y3Qgc201MDFmYl9pbmZvICpmYmkgPSBwYXItPmluZm87CiAJdW5zaWduZWQgbG9uZyByZWc7CiAKLQlyZWcgPSB2YXItPnhvZmZzZXQgfCAodmFyLT54cmVzX3ZpcnR1YWwgPDwgMTYpOworCXJlZyA9IHZhci0+eG9mZnNldCB8IChpbmZvLT52YXIueHJlc192aXJ0dWFsIDw8IDE2KTsKIAlzbWM1MDFfd3JpdGVsKHJlZywgZmJpLT5yZWdzICsgU001MDFfRENfUEFORUxfRkJfV0lEVEgpOwogCi0JcmVnID0gdmFyLT55b2Zmc2V0IHwgKHZhci0+eXJlc192aXJ0dWFsIDw8IDE2KTsKKwlyZWcgPSB2YXItPnlvZmZzZXQgfCAoaW5mby0+dmFyLnlyZXNfdmlydHVhbCA8PCAxNik7CiAJc21jNTAxX3dyaXRlbChyZWcsIGZiaS0+cmVncyArIFNNNTAxX0RDX1BBTkVMX0ZCX0hFSUdIVCk7CiAKIAlzbTUwMWZiX3N5bmNfcmVncyhmYmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zbXNjdWZ4LmMgYi9kcml2ZXJzL3ZpZGVvL3Ntc2N1ZnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNjZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9zbXNjdWZ4LmMKQEAgLTAsMCArMSwxOTk0IEBACisvKgorICogc21zY3VmeC5jIC0tIEZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU01TQyBVRlggVVNCIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU3RldmUgR2xlbmRpbm5pbmcgPHN0ZXZlLmdsZW5kaW5uaW5nQHNtc2MuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJvYmVydG8gRGUgSW9yaXMgPHJvYmVydG9AdW5iaXQuaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJlcm5pZSBUaG9tcHNvbiA8YmVybmllQHBsdWdhYmxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2Mi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCYXNlZCBvbiB1ZGxmYiwgd2l0aCB3b3JrIGZyb20gRmxvcmlhbiBFY2h0bGVyLCBIZW5yaWsgQmplcnJlZ2FhcmQgUGVkZXJzZW4sCisgKiBhbmQgb3RoZXJzLgorICoKKyAqIFdvcmtzIHdlbGwgd2l0aCBCZXJuaWUgVGhvbXBzb24ncyBYIERBTUFHRSBwYXRjaCB0byB4Zjg2LXZpZGVvLWZiZGV2CisgKiBhdmFpbGFibGUgZnJvbSBodHRwOi8vZ2l0LnBsdWdhYmxlLmNvbQorICoKKyAqIExheW91dCBpcyBiYXNlZCBvbiBza2VsZXRvbmZiIGJ5IEphbWVzIFNpbW1vbnMgYW5kIEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqIHVzYi1za2VsZXRvbiBieSBHcmVnS0guCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImVkaWQuaCIKKworI2RlZmluZSBjaGVja193YXJuKHN0YXR1cywgZm10LCBhcmdzLi4uKSBcCisJKHsgaWYgKHN0YXR1cyA8IDApIHByX3dhcm4oZm10LCAjI2FyZ3MpOyB9KQorCisjZGVmaW5lIGNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgZm10LCBhcmdzLi4uKSBcCisJKHsgaWYgKHN0YXR1cyA8IDApIHsgcHJfd2FybihmbXQsICMjYXJncyk7IHJldHVybiBzdGF0dXM7IH0gfSkKKworI2RlZmluZSBjaGVja193YXJuX2dvdG9fZXJyb3Ioc3RhdHVzLCBmbXQsIGFyZ3MuLi4pIFwKKwkoeyBpZiAoc3RhdHVzIDwgMCkgeyBwcl93YXJuKGZtdCwgIyNhcmdzKTsgZ290byBlcnJvcjsgfSB9KQorCisjZGVmaW5lIGFsbF9iaXRzX3NldCh4LCBiaXRzKSAoKCh4KSAmIChiaXRzKSkgPT0gKGJpdHMpKQorCisjZGVmaW5lIFVTQl9WRU5ET1JfUkVRVUVTVF9XUklURV9SRUdJU1RFUgkweEEwCisjZGVmaW5lIFVTQl9WRU5ET1JfUkVRVUVTVF9SRUFEX1JFR0lTVEVSCTB4QTEKKworLyoKKyAqIFRPRE86IFByb3Bvc2Ugc3RhbmRhcmQgZmIuaCBpb2N0bCBmb3IgcmVwb3J0aW5nIGRhbWFnZSwKKyAqIHVzaW5nIF9JT1dSKCkgYW5kIG9uZSBvZiB0aGUgZXhpc3RpbmcgYXJlYSBzdHJ1Y3RzIGZyb20gZmIuaAorICogQ29uc2lkZXIgdGhlc2UgaW9jdGxzIGRlcHJlY2F0ZWQsIGJ1dCB0aGV5J3JlIHN0aWxsIHVzZWQgYnkgdGhlCisgKiBEaXNwbGF5TGluayBYIHNlcnZlciBhcyB5ZXQgLSBuZWVkIGJvdGggdG8gYmUgbW9kaWZpZWQgaW4gdGFuZGVtCisgKiB3aGVuIG5ldyBpb2N0bChzKSBhcmUgcmVhZHkuCisgKi8KKyNkZWZpbmUgVUZYX0lPQ1RMX1JFVFVSTl9FRElECSgweEFEKQorI2RlZmluZSBVRlhfSU9DVExfUkVQT1JUX0RBTUFHRQkoMHhBQSkKKworLyogLUJVTEtfU0laRSBhcyBwZXIgdXNiLXNrZWxldG9uLiBDYW4gd2UgZ2V0IGZ1bGwgcGFnZSBhbmQgYXZvaWQgb3ZlcmhlYWQ/ICovCisjZGVmaW5lIEJVTEtfU0laRQkJKDUxMikKKyNkZWZpbmUgTUFYX1RSQU5TRkVSCQkoUEFHRV9TSVpFKjE2IC0gQlVMS19TSVpFKQorI2RlZmluZSBXUklURVNfSU5fRkxJR0hUCSg0KQorCisjZGVmaW5lIEdFVF9VUkJfVElNRU9VVAkJKEhaKQorI2RlZmluZSBGUkVFX1VSQl9USU1FT1VUCShIWioyKQorCisjZGVmaW5lIEJQUAkJCTIKKworI2RlZmluZSBVRlhfREVGSU9fV1JJVEVfREVMQVkJNSAvKiBmYl9kZWZlcnJlZF9pby5kZWxheSBpbiBqaWZmaWVzICovCisjZGVmaW5lIFVGWF9ERUZJT19XUklURV9ESVNBQkxFCShIWio2MCkgLyogImRpc2FibGUiIHdpdGggbG9uZyBkZWxheSAqLworCitzdHJ1Y3QgZGxvYXJlYSB7CisJaW50IHgsIHk7CisJaW50IHcsIGg7Cit9OworCitzdHJ1Y3QgdXJiX25vZGUgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IHVmeF9kYXRhICpkZXY7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZWxlYXNlX3VyYl93b3JrOworCXN0cnVjdCB1cmIgKnVyYjsKK307CisKK3N0cnVjdCB1cmJfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGxpbWl0X3NlbTsKKwlpbnQgYXZhaWxhYmxlOworCWludCBjb3VudDsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0cnVjdCB1ZnhfZGF0YSB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IGRldmljZSAqZ2RldjsgLyogJnVkZXYtPmRldiAqLworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCB1cmJfbGlzdCB1cmJzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJaW50IGZiX2NvdW50OworCWJvb2wgdmlydHVhbGl6ZWQ7IC8qIHRydWUgd2hlbiBwaHlzaWNhbCB1c2IgZGV2aWNlIG5vdCBwcmVzZW50ICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBmcmVlX2ZyYW1lYnVmZmVyX3dvcms7CisJYXRvbWljX3QgdXNiX2FjdGl2ZTsgLyogMCA9IHVwZGF0ZSB2aXJ0dWFsIGJ1ZmZlciwgYnV0IG5vIHVzYiB0cmFmZmljICovCisJYXRvbWljX3QgbG9zdF9waXhlbHM7IC8qIDEgPSBhIHJlbmRlciBvcCBmYWlsZWQuIE5lZWQgc2NyZWVuIHJlZnJlc2ggKi8KKwl1OCAqZWRpZDsgLyogbnVsbCB1bnRpbCB3ZSByZWFkIGVkaWQgZnJvbSBodyBvciBnZXQgZnJvbSBzeXNmcyAqLworCXNpemVfdCBlZGlkX3NpemU7CisJdTMyIHBzZXVkb19wYWxldHRlWzI1Nl07Cit9OworCitzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHVmeF9maXggPSB7CisJLmlkID0gICAgICAgICAgICJzbXNjdWZ4IiwKKwkudHlwZSA9ICAgICAgICAgRkJfVFlQRV9QQUNLRURfUElYRUxTLAorCS52aXN1YWwgPSAgICAgICBGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS54cGFuc3RlcCA9ICAgICAwLAorCS55cGFuc3RlcCA9ICAgICAwLAorCS55d3JhcHN0ZXAgPSAgICAwLAorCS5hY2NlbCA9ICAgICAgICBGQl9BQ0NFTF9OT05FLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBzbXNjdWZ4X2luZm9fZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19SRUFEU19GQVNUIHwKKwlGQklORk9fVklSVEZCIHwJRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAorCUZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwgRkJJTkZPX01JU0NfQUxXQVlTX1NFVFBBUjsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwNDI0LCAweDlkMDApLH0sCisJe1VTQl9ERVZJQ0UoMHgwNDI0LCAweDlkMDEpLH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworLyogbW9kdWxlIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgY29uc29sZTsgICAvKiBPcHRpb25hbGx5IGFsbG93IGZiY29uIHRvIGNvbnN1bWUgZmlyc3QgZnJhbWVidWZmZXIgKi8KK3N0YXRpYyBpbnQgZmJfZGVmaW8gPSB0cnVlOyAgLyogT3B0aW9uYWxseSBlbmFibGUgZmJfZGVmaW8gbW1hcCBzdXBwb3J0ICovCisKKy8qIHVmeCBrZWVwcyBhIGxpc3Qgb2YgdXJicyBmb3IgZWZmaWNpZW50IGJ1bGsgdHJhbnNmZXJzICovCitzdGF0aWMgdm9pZCB1ZnhfdXJiX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBzdHJ1Y3QgdXJiICp1ZnhfZ2V0X3VyYihzdHJ1Y3QgdWZ4X2RhdGEgKmRldik7CitzdGF0aWMgaW50IHVmeF9zdWJtaXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgdXJiICogdXJiLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBpbnQgdWZ4X2FsbG9jX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBpbnQgY291bnQsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIHVmeF9mcmVlX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2KTsKKworLyogcmVhZHMgYSBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHVmeF9yZWdfcmVhZChzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LCB1MzIgKmRhdGEpCit7CisJdTMyICpidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOworCWludCByZXQ7CisKKwlCVUdfT04oIWRldik7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJVVNCX1ZFTkRPUl9SRVFVRVNUX1JFQURfUkVHSVNURVIsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkwMCwgaW5kZXgsIGJ1ZiwgNCwgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCisJbGUzMl90b19jcHVzKGJ1Zik7CisJKmRhdGEgPSAqYnVmOworCWtmcmVlKGJ1Zik7CisKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCXByX3dhcm4oIkZhaWxlZCB0byByZWFkIHJlZ2lzdGVyIGluZGV4IDB4JTA4eFxuIiwgaW5kZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGVzIGEgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIGludCB1ZnhfcmVnX3dyaXRlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCB1MzIgaW5kZXgsIHUzMiBkYXRhKQoreworCXUzMiAqYnVmID0ga21hbGxvYyg0LCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJQlVHX09OKCFkZXYpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJKmJ1ZiA9IGRhdGE7CisJY3B1X3RvX2xlMzJzKGJ1Zik7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKKwkJVVNCX1ZFTkRPUl9SRVFVRVNUX1dSSVRFX1JFR0lTVEVSLAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCTAwLCBpbmRleCwgYnVmLCA0LCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwlrZnJlZShidWYpOworCisJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQlwcl93YXJuKCJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgaW5kZXggMHglMDh4IHdpdGggdmFsdWUgIgorCQkJIjB4JTA4eFxuIiwgaW5kZXgsIGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1ZnhfcmVnX2NsZWFyX2FuZF9zZXRfYml0cyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LAorCXUzMiBiaXRzX3RvX2NsZWFyLCB1MzIgYml0c190b19zZXQpCit7CisJdTMyIGRhdGE7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIGluZGV4LCAmZGF0YSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMgZXJyb3IgcmVhZGluZyAiCisJCSIweCV4IiwgaW5kZXgpOworCisJZGF0YSAmPSAofmJpdHNfdG9fY2xlYXIpOworCWRhdGEgfD0gYml0c190b19zZXQ7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgaW5kZXgsIGRhdGEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9yZWdfY2xlYXJfYW5kX3NldF9iaXRzIGVycm9yIHdyaXRpbmcgIgorCQkiMHgleCIsIGluZGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9yZWdfc2V0X2JpdHMoc3RydWN0IHVmeF9kYXRhICpkZXYsIHUzMiBpbmRleCwgdTMyIGJpdHMpCit7CisJcmV0dXJuIHVmeF9yZWdfY2xlYXJfYW5kX3NldF9iaXRzKGRldiwgaW5kZXgsIDAsIGJpdHMpOworfQorCitzdGF0aWMgaW50IHVmeF9yZWdfY2xlYXJfYml0cyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIGluZGV4LCB1MzIgYml0cykKK3sKKwlyZXR1cm4gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCBpbmRleCwgYml0cywgMCk7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X2xpdGVfcmVzZXQoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1czsKKwl1MzIgdmFsdWU7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgzMDA4LCAweDAwMDAwMDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfbGl0ZV9yZXNldCBlcnJvciB3cml0aW5nIDB4MzAwOCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgzMDA4LCAmdmFsdWUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9saXRlX3Jlc2V0IGVycm9yIHJlYWRpbmcgMHgzMDA4Iik7CisKKwlyZXR1cm4gKHZhbHVlID09IDApID8gMCA6IC1FSU87Cit9CisKKy8qIElmIGRpc3BsYXkgaXMgdW5ibGFua2VkLCB0aGVuIGJsYW5rIGl0ICovCitzdGF0aWMgaW50IHVmeF9ibGFuayhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgYm9vbCB3YWl0KQoreworCXUzMiBkY19jdHJsLCBkY19zdHM7CisJaW50IGk7CisKKwlpbnQgc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwMCwgJmRjX2N0cmwpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9ibGFuayBlcnJvciByZWFkaW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaWYgZGlzcGxheSBpcyBhbHJlYWR5IGJsYW5rZWQgKi8KKwlpZiAoKGRjX3N0cyAmIDB4MDAwMDAxMDApIHx8IChkY19jdHJsICYgMHgwMDAwMDEwMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gYmxhbmsgdGhlIGRpc3BsYXkgKi8KKwlkY19jdHJsIHw9IDB4MDAwMDAxMDA7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X2JsYW5rIGVycm9yIHdyaXRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpbW1lZGlhdGVseSBpZiB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgKi8KKwlpZiAoIXdhaXQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IDI1MDsgaSsrKSB7CisJCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwNCwgJmRjX3N0cyk7CisJCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9ibGFuayBlcnJvciByZWFkaW5nIDB4MjAwNCIpOworCisJCWlmIChkY19zdHMgJiAweDAwMDAwMTAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGRpc3BsYXkgdG8gYmxhbmsgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworLyogSWYgZGlzcGxheSBpcyBibGFua2VkLCB0aGVuIHVuYmxhbmsgaXQgKi8KK3N0YXRpYyBpbnQgdWZ4X3VuYmxhbmsoc3RydWN0IHVmeF9kYXRhICpkZXYsIGJvb2wgd2FpdCkKK3sKKwl1MzIgZGNfY3RybCwgZGNfc3RzOworCWludCBpOworCisJaW50IHN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwNCwgJmRjX3N0cyk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MjAwMCwgJmRjX2N0cmwpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF91bmJsYW5rIGVycm9yIHJlYWRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpZiBkaXNwbGF5IGlzIGFscmVhZHkgdW5ibGFua2VkICovCisJaWYgKCgoZGNfc3RzICYgMHgwMDAwMDEwMCkgPT0gMCkgfHwgKChkY19jdHJsICYgMHgwMDAwMDEwMCkgPT0gMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gdW5ibGFuayB0aGUgZGlzcGxheSAqLworCWRjX2N0cmwgJj0gfjB4MDAwMDAxMDA7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3Igd3JpdGluZyAweDIwMDAiKTsKKworCS8qIHJldHVybiBzdWNjZXNzIGltbWVkaWF0ZWx5IGlmIHdlIGRvbid0IGhhdmUgdG8gd2FpdCAqLworCWlmICghd2FpdCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjUwOyBpKyspIHsKKwkJc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3VuYmxhbmsgZXJyb3IgcmVhZGluZyAweDIwMDQiKTsKKworCQlpZiAoKGRjX3N0cyAmIDB4MDAwMDAxMDApID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGlzcGxheSB0byB1bmJsYW5rICovCisJcmV0dXJuIC1FSU87Cit9CisKKy8qIElmIGRpc3BsYXkgaXMgZW5hYmxlZCwgdGhlbiBkaXNhYmxlIGl0ICovCitzdGF0aWMgaW50IHVmeF9kaXNhYmxlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBib29sIHdhaXQpCit7CisJdTMyIGRjX2N0cmwsIGRjX3N0czsKKwlpbnQgaTsKKworCWludCBzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9kaXNhYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDAsICZkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciByZWFkaW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaWYgZGlzcGxheSBpcyBhbHJlYWR5IGRpc2FibGVkICovCisJaWYgKCgoZGNfc3RzICYgMHgwMDAwMDAwMSkgPT0gMCkgfHwgKChkY19jdHJsICYgMHgwMDAwMDAwMSkgPT0gMCkpCisJCXJldHVybiAwOworCisJLyogcmVxdWVzdCB0aGUgREMgdG8gZGlzYWJsZSB0aGUgZGlzcGxheSAqLworCWRjX2N0cmwgJj0gfigweDAwMDAwMDAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDAwLCBkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaW1tZWRpYXRlbHkgaWYgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0ICovCisJaWYgKCF3YWl0KQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTA7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZGlzYWJsZSBlcnJvciByZWFkaW5nIDB4MjAwNCIpOworCisJCWlmICgoZGNfc3RzICYgMHgwMDAwMDAwMSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCS8qIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkaXNwbGF5IHRvIGRpc2FibGUgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworLyogSWYgZGlzcGxheSBpcyBkaXNhYmxlZCwgdGhlbiBlbmFibGUgaXQgKi8KK3N0YXRpYyBpbnQgdWZ4X2VuYWJsZShzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgYm9vbCB3YWl0KQoreworCXUzMiBkY19jdHJsLCBkY19zdHM7CisJaW50IGk7CisKKwlpbnQgc3RhdHVzID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgyMDA0LCAmZGNfc3RzKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDAsICZkY19jdHJsKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDAwIik7CisKKwkvKiByZXR1cm4gc3VjY2VzcyBpZiBkaXNwbGF5IGlzIGFscmVhZHkgZW5hYmxlZCAqLworCWlmICgoZGNfc3RzICYgMHgwMDAwMDAwMSkgfHwgKGRjX2N0cmwgJiAweDAwMDAwMDAxKSkKKwkJcmV0dXJuIDA7CisKKwkvKiByZXF1ZXN0IHRoZSBEQyB0byBlbmFibGUgdGhlIGRpc3BsYXkgKi8KKwlkY19jdHJsIHw9IDB4MDAwMDAwMDE7CisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgZGNfY3RybCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X2VuYWJsZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogcmV0dXJuIHN1Y2Nlc3MgaW1tZWRpYXRlbHkgaWYgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0ICovCisJaWYgKCF3YWl0KQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCAyNTA7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDIwMDQsICZkY19zdHMpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1ZnhfZW5hYmxlIGVycm9yIHJlYWRpbmcgMHgyMDA0Iik7CisKKwkJaWYgKGRjX3N0cyAmIDB4MDAwMDAwMDEpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGlzcGxheSB0byBlbmFibGUgKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCB1ZnhfY29uZmlnX3N5c19jbGsoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDcwMEMsIDB4ODAwMDAwMEYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHg3MDBDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDE0LCAweDAwMTAwMjRGKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4NzAxNCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4NzAxMCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMTAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfY2xlYXJfYml0cyhkZXYsIDB4NzAwQywgMHgwMDAwMDAwQSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3IgY2xlYXJpbmcgUExMMSBieXBhc3MgaW4gMHg3MDBDIik7CisJbXNsZWVwKDEpOworCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9iaXRzKGRldiwgMHg3MDBDLCAweDgwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciBjbGVhcmluZyBvdXRwdXQgZ2F0ZSBpbiAweDcwMEMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9jb25maWdfZGRyMihzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwlpbnQgc3RhdHVzLCBpID0gMDsKKwl1MzIgdG1wOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAwNCwgMHgwMDFGMEY3Nyk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMDgsIDB4RkZGMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDA4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDBDLCAweDBGRkYyMjIyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAwQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAxMCwgMHgwMDAzMDgxNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMTAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMTQsIDB4MDA1MDAwMTkpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDE0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDE4LCAweDAyMEQwRjE1KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAxOCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAxQywgMHgwMjUzMjMwNSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMUMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMjAsIDB4MEIwMzA5MDUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDIwIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDI0LCAweDAwMDAwODI3KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAyNCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAyOCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMjgiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMkMsIDB4MDAwMDAwNDIpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDJDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDMwLCAweDA5NTIwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAzMCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDAzNCwgMHgwMjIyMzMxNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwMzQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwMzgsIDB4MDA0MzAwNDMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDM4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDNDLCAweEYwMEYwMDBGKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAzQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDA0MCwgMHhGMzgwRjAwRik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwNDAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwNDQsIDB4RjAwRjA0OTYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDQ0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDQ4LCAweDAzMDgwNDA2KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDA0OCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDA0QywgMHgwMDAwMTAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAwNEMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAwNUMsIDB4MDAwMDAwMDcpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMDVDIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMTAwLCAweDU0RjAwMDEyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDEwMCIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MDEwNCwgMHgwMDAwNDAxMik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDAxMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDAxMTgsIDB4NDA0MDQwNDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgwMTE4Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgwMDAwLCAweDAwMDAwMDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MDAwMCIpOworCisJd2hpbGUgKGkrKyA8IDUwMCkgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDAwMDAsICZ0bXApOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciByZWFkaW5nIDB4MDAwMCIpOworCisJCWlmIChhbGxfYml0c19zZXQodG1wLCAweEMwMDAwMDAwKSkKKwkJCXJldHVybiAwOworCX0KKworCXByX2VycigiRERSMiBpbml0aWFsaXNhdGlvbiB0aW1lZCBvdXQsIHJlZyAweDAwMDA9MHglMDh4IiwgdG1wKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RydWN0IHBsbF92YWx1ZXMgeworCXUzMiBkaXZfcjA7CisJdTMyIGRpdl9mMDsKKwl1MzIgZGl2X3EwOworCXUzMiByYW5nZTA7CisJdTMyIGRpdl9yMTsKKwl1MzIgZGl2X2YxOworCXUzMiBkaXZfcTE7CisJdTMyIHJhbmdlMTsKK307CisKK3N0YXRpYyB1MzIgdWZ4X2NhbGNfcmFuZ2UodTMyIHJlZl9mcmVxKQoreworCWlmIChyZWZfZnJlcSA+PSA4ODAwMDAwMCkKKwkJcmV0dXJuIDc7CisKKwlpZiAocmVmX2ZyZXEgPj0gNTQwMDAwMDApCisJCXJldHVybiA2OworCisJaWYgKHJlZl9mcmVxID49IDM0MDAwMDAwKQorCQlyZXR1cm4gNTsKKworCWlmIChyZWZfZnJlcSA+PSAyMTAwMDAwMCkKKwkJcmV0dXJuIDQ7CisKKwlpZiAocmVmX2ZyZXEgPj0gMTMwMDAwMDApCisJCXJldHVybiAzOworCisJaWYgKHJlZl9mcmVxID49IDgwMDAwMDApCisJCXJldHVybiAyOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGNhbGN1bGF0ZXMgUExMIGRpdmlkZXIgc2V0dGluZ3MgZm9yIGEgZGVzaXJlZCB0YXJnZXQgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZCB1ZnhfY2FsY19wbGxfdmFsdWVzKGNvbnN0IHUzMiBjbGtfcGl4ZWxfcGxsLCBzdHJ1Y3QgcGxsX3ZhbHVlcyAqYXNpY19wbGwpCit7CisJY29uc3QgdTMyIHJlZl9jbGsgPSAyNTAwMDAwMDsKKwl1MzIgZGl2X3IwLCBkaXZfZjAsIGRpdl9xMCwgZGl2X3IxLCBkaXZfZjEsIGRpdl9xMTsKKwl1MzIgbWluX2Vycm9yID0gY2xrX3BpeGVsX3BsbDsKKworCWZvciAoZGl2X3IwID0gMTsgZGl2X3IwIDw9IDMyOyBkaXZfcjArKykgeworCQl1MzIgcmVmX2ZyZXEwID0gcmVmX2NsayAvIGRpdl9yMDsKKwkJaWYgKHJlZl9mcmVxMCA8IDUwMDAwMDApCisJCQlicmVhazsKKworCQlpZiAocmVmX2ZyZXEwID4gMjAwMDAwMDAwKQorCQkJY29udGludWU7CisKKwkJZm9yIChkaXZfZjAgPSAxOyBkaXZfZjAgPD0gMjU2OyBkaXZfZjArKykgeworCQkJdTMyIHZjb19mcmVxMCA9IHJlZl9mcmVxMCAqIGRpdl9mMDsKKworCQkJaWYgKHZjb19mcmVxMCA8IDM1MDAwMDAwMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHZjb19mcmVxMCA+IDcwMDAwMDAwMCkKKwkJCQlicmVhazsKKworCQkJZm9yIChkaXZfcTAgPSAwOyBkaXZfcTAgPCA3OyBkaXZfcTArKykgeworCQkJCXUzMiBwbGxvdXRfZnJlcTAgPSB2Y29fZnJlcTAgLyAoMSA8PCBkaXZfcTApOworCisJCQkJaWYgKHBsbG91dF9mcmVxMCA8IDUwMDAwMDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKHBsbG91dF9mcmVxMCA+IDIwMDAwMDAwMCkKKwkJCQkJY29udGludWU7CisKKwkJCQlmb3IgKGRpdl9yMSA9IDE7IGRpdl9yMSA8PSAzMjsgZGl2X3IxKyspIHsKKwkJCQkJdTMyIHJlZl9mcmVxMSA9IHBsbG91dF9mcmVxMCAvIGRpdl9yMTsKKworCQkJCQlpZiAocmVmX2ZyZXExIDwgNTAwMDAwMCkKKwkJCQkJCWJyZWFrOworCisJCQkJCWZvciAoZGl2X2YxID0gMTsgZGl2X2YxIDw9IDI1NjsgZGl2X2YxKyspIHsKKwkJCQkJCXUzMiB2Y29fZnJlcTEgPSByZWZfZnJlcTEgKiBkaXZfZjE7CisKKwkJCQkJCWlmICh2Y29fZnJlcTEgPCAzNTAwMDAwMDApCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJCWlmICh2Y29fZnJlcTEgPiA3MDAwMDAwMDApCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWZvciAoZGl2X3ExID0gMDsgZGl2X3ExIDwgNzsgZGl2X3ExKyspIHsKKwkJCQkJCQl1MzIgcGxsb3V0X2ZyZXExID0gdmNvX2ZyZXExIC8gKDEgPDwgZGl2X3ExKTsKKwkJCQkJCQlpbnQgZXJyb3IgPSBhYnMocGxsb3V0X2ZyZXExIC0gY2xrX3BpeGVsX3BsbCk7CisKKwkJCQkJCQlpZiAocGxsb3V0X2ZyZXExIDwgNTAwMDAwMCkKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQlpZiAocGxsb3V0X2ZyZXExID4gNzAwMDAwMDAwKQorCQkJCQkJCQljb250aW51ZTsKKworCQkJCQkJCWlmIChlcnJvciA8IG1pbl9lcnJvcikgeworCQkJCQkJCQltaW5fZXJyb3IgPSBlcnJvcjsKKworCQkJCQkJCQkvKiBmaW5hbCByZXR1cm5lZCB2YWx1ZSBpcyBlcXVhbCB0byBjYWxjdWxhdGVkIHZhbHVlIC0gMQorCQkJCQkJCQkgKiBiZWNhdXNlIGEgdmFsdWUgb2YgMCA9IGRpdmlkZSBieSAxICovCisJCQkJCQkJCWFzaWNfcGxsLT5kaXZfcjAgPSBkaXZfcjAgLSAxOworCQkJCQkJCQlhc2ljX3BsbC0+ZGl2X2YwID0gZGl2X2YwIC0gMTsKKwkJCQkJCQkJYXNpY19wbGwtPmRpdl9xMCA9IGRpdl9xMDsKKwkJCQkJCQkJYXNpY19wbGwtPmRpdl9yMSA9IGRpdl9yMSAtIDE7CisJCQkJCQkJCWFzaWNfcGxsLT5kaXZfZjEgPSBkaXZfZjEgLSAxOworCQkJCQkJCQlhc2ljX3BsbC0+ZGl2X3ExID0gZGl2X3ExOworCisJCQkJCQkJCWFzaWNfcGxsLT5yYW5nZTAgPSB1ZnhfY2FsY19yYW5nZShyZWZfZnJlcTApOworCQkJCQkJCQlhc2ljX3BsbC0+cmFuZ2UxID0gdWZ4X2NhbGNfcmFuZ2UocmVmX2ZyZXExKTsKKworCQkJCQkJCQlpZiAobWluX2Vycm9yID09IDApCisJCQkJCQkJCQlyZXR1cm47CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKiBzZXRzIGFuYWxvZyBiaXQgUExMIGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCitzdGF0aWMgaW50IHVmeF9jb25maWdfcGl4X2NsayhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTMyIHBpeGNsb2NrKQoreworCXN0cnVjdCBwbGxfdmFsdWVzIGFzaWNfcGxsID0gezB9OworCXUzMiB2YWx1ZSwgY2xrX3BpeGVsLCBjbGtfcGl4ZWxfcGxsOworCWludCBzdGF0dXM7CisKKwkvKiBjb252ZXJ0IHBpeGNsb2NrIChpbiBwcykgdG8gZnJlcXVlbmN5IChpbiBIeikgKi8KKwljbGtfcGl4ZWwgPSBQSUNPUzJLSFoocGl4Y2xvY2spICogMTAwMDsKKwlwcl9kZWJ1ZygicGl4Y2xvY2sgJWQgcHMgPSBjbGtfcGl4ZWwgJWQgSHoiLCBwaXhjbG9jaywgY2xrX3BpeGVsKTsKKworCS8qIGNsa19waXhlbCA9IDEvMiBjbGtfcGl4ZWxfcGxsICovCisJY2xrX3BpeGVsX3BsbCA9IGNsa19waXhlbCAqIDI7CisKKwl1ZnhfY2FsY19wbGxfdmFsdWVzKGNsa19waXhlbF9wbGwsICZhc2ljX3BsbCk7CisKKwkvKiBLZWVwIEJZUEFTUyBhbmQgUkVTRVQgc2lnbmFscyBhc3NlcnRlZCB1bnRpbCBjb25maWd1cmVkICovCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4NzAwMCwgMHg4MDAwMDAwRik7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDAiKTsKKworCXZhbHVlID0gKGFzaWNfcGxsLmRpdl9mMSB8IChhc2ljX3BsbC5kaXZfcjEgPDwgOCkgfAorCQkoYXNpY19wbGwuZGl2X3ExIDw8IDE2KSB8IChhc2ljX3BsbC5yYW5nZTEgPDwgMjApKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDA4LCB2YWx1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDgiKTsKKworCXZhbHVlID0gKGFzaWNfcGxsLmRpdl9mMCB8IChhc2ljX3BsbC5kaXZfcjAgPDwgOCkgfAorCQkoYXNpY19wbGwuZGl2X3EwIDw8IDE2KSB8IChhc2ljX3BsbC5yYW5nZTAgPDwgMjApKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg3MDA0LCB2YWx1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igd3JpdGluZyAweDcwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfY2xlYXJfYml0cyhkZXYsIDB4NzAwMCwgMHgwMDAwMDAwNSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLAorCQkiZXJyb3IgY2xlYXJpbmcgUExMMCBieXBhc3MgYml0cyBpbiAweDcwMDAiKTsKKwltc2xlZXAoMSk7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX2NsZWFyX2JpdHMoZGV2LCAweDcwMDAsIDB4MDAwMDAwMEEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywKKwkJImVycm9yIGNsZWFyaW5nIFBMTDEgYnlwYXNzIGJpdHMgaW4gMHg3MDAwIik7CisJbXNsZWVwKDEpOworCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9iaXRzKGRldiwgMHg3MDAwLCAweDgwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciBjbGVhcmluZyBnYXRlIGJpdHMgaW4gMHg3MDAwIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Znhfc2V0X3ZpZF9tb2RlKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwl1MzIgdGVtcDsKKwl1MTYgaF90b3RhbCwgaF9hY3RpdmUsIGhfYmxhbmtfc3RhcnQsIGhfYmxhbmtfZW5kLCBoX3N5bmNfc3RhcnQsIGhfc3luY19lbmQ7CisJdTE2IHZfdG90YWwsIHZfYWN0aXZlLCB2X2JsYW5rX3N0YXJ0LCB2X2JsYW5rX2VuZCwgdl9zeW5jX3N0YXJ0LCB2X3N5bmNfZW5kOworCisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjgsIDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZGlzYWJsaW5nIFJHQiBwYWQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjQsIDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZGlzYWJsaW5nIFZEQUMiKTsKKworCS8qIHNodXQgZXZlcnl0aGluZyBkb3duIGJlZm9yZSBjaGFuZ2luZyB0aW1pbmcgKi8KKwlzdGF0dXMgPSB1ZnhfYmxhbmsoZGV2LCB0cnVlKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGJsYW5raW5nIGRpc3BsYXkiKTsKKworCXN0YXR1cyA9IHVmeF9kaXNhYmxlKGRldiwgdHJ1ZSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciBkaXNhYmxpbmcgZGlzcGxheSIpOworCisJc3RhdHVzID0gdWZ4X2NvbmZpZ19waXhfY2xrKGRldiwgdmFyLT5waXhjbG9jayk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciBjb25maWd1cmluZyBwaXhjbG9jayIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MjAwMCwgMHgwMDAwMDEwNCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAidWZ4X3NldF92aWRfbW9kZSBlcnJvciB3cml0aW5nIDB4MjAwMCIpOworCisJLyogc2V0IGhvcml6b250YWwgdGltaW5ncyAqLworCWhfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuICsgdmFyLT5sZWZ0X21hcmdpbjsKKwloX2FjdGl2ZSA9IHZhci0+eHJlczsKKwloX2JsYW5rX3N0YXJ0ID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW47CisJaF9ibGFua19lbmQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOworCWhfc3luY19zdGFydCA9IHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luOworCWhfc3luY19lbmQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOworCisJdGVtcCA9ICgoaF90b3RhbCAtIDEpIDw8IDE2KSB8IChoX2FjdGl2ZSAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMDgsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMDgiKTsKKworCXRlbXAgPSAoKGhfYmxhbmtfc3RhcnQgLSAxKSA8PCAxNikgfCAoaF9ibGFua19lbmQgLSAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDBDLCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDBDIik7CisKKwl0ZW1wID0gKChoX3N5bmNfc3RhcnQgLSAxKSA8PCAxNikgfCAoaF9zeW5jX2VuZCAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMTAsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMTAiKTsKKworCS8qIHNldCB2ZXJ0aWNhbCB0aW1pbmdzICovCisJdl90b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbjsKKwl2X2FjdGl2ZSA9IHZhci0+eXJlczsKKwl2X2JsYW5rX3N0YXJ0ID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW47CisJdl9ibGFua19lbmQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCXZfc3luY19zdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOworCXZfc3luY19lbmQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCisJdGVtcCA9ICgodl90b3RhbCAtIDEpIDw8IDE2KSB8ICh2X2FjdGl2ZSAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMTQsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMTQiKTsKKworCXRlbXAgPSAoKHZfYmxhbmtfc3RhcnQgLSAxKSA8PCAxNikgfCAodl9ibGFua19lbmQgLSAxKTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDE4LCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDE4Iik7CisKKwl0ZW1wID0gKCh2X3N5bmNfc3RhcnQgLSAxKSA8PCAxNikgfCAodl9zeW5jX2VuZCAtIDEpOworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMUMsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMUMiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMjAsIDB4MDAwMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMjAiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwMjQsIDB4MDAwMDAwMDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwMjQiKTsKKworCS8qIFNldCB0aGUgZnJhbWUgbGVuZ3RoIHJlZ2lzdGVyICgjcGl4ICogMiBieXRlcy9waXhlbCkgKi8KKwl0ZW1wID0gdmFyLT54cmVzICogdmFyLT55cmVzICogMjsKKwl0ZW1wID0gKHRlbXAgKyA3KSAmICh+MHg3KTsKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDI4LCB0ZW1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDI4Iik7CisKKwkvKiBlbmFibGUgZGVzaXJlZCBvdXRwdXQgaW50ZXJmYWNlICYgZGlzYWJsZSBvdGhlcnMgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQwLCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQwIik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQ0LCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQ0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgyMDQ4LCAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIHdyaXRpbmcgMHgyMDQ4Iik7CisKKwkvKiBzZXQgdGhlIHN5bmMgcG9sYXJpdGllcyAmIGVuYWJsZSBiaXQgKi8KKwl0ZW1wID0gMHgwMDAwMDAwMTsKKwlpZiAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpCisJCXRlbXAgfD0gMHgwMDAwMDAxMDsKKworCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpCisJCXRlbXAgfD0gMHgwMDAwMDAwODsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDIwNDAsIHRlbXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3Igd3JpdGluZyAweDIwNDAiKTsKKworCS8qIHN0YXJ0IGV2ZXJ5dGhpbmcgYmFjayB1cCAqLworCXN0YXR1cyA9IHVmeF9lbmFibGUoZGV2LCB0cnVlKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGVuYWJsaW5nIGRpc3BsYXkiKTsKKworCS8qIFVuYmxhbmsgdGhlIGRpc3BsYXkgKi8KKwlzdGF0dXMgPSB1ZnhfdW5ibGFuayhkZXYsIHRydWUpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgdW5ibGFua2luZyBkaXNwbGF5Iik7CisKKwkvKiBlbmFibGUgUkdCIHBhZCAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDgwMjgsIDB4MDAwMDAwMDMpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgInVmeF9zZXRfdmlkX21vZGUgZXJyb3IgZW5hYmxpbmcgUkdCIHBhZCIpOworCisJLyogZW5hYmxlIFZEQUMgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHg4MDI0LCAweDAwMDAwMDA3KTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJ1Znhfc2V0X3ZpZF9tb2RlIGVycm9yIGVuYWJsaW5nIFZEQUMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVmeF9vcHNfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zOworCisJaWYgKG9mZnNldCArIHNpemUgPiBpbmZvLT5maXguc21lbV9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJcG9zID0gKHVuc2lnbmVkIGxvbmcpaW5mby0+Zml4LnNtZW1fc3RhcnQgKyBvZmZzZXQ7CisKKwlwcl9kZWJ1ZygibW1hcCgpIGZyYW1lYnVmZmVyIGFkZHI6JWx1IHNpemU6JWx1XG4iLAorCQkgIHBvcywgc2l6ZSk7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwkJcG9zICs9IFBBR0VfU0laRTsKKwkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IDA7CisJfQorCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsJLyogYXZvaWQgdG8gc3dhcCBvdXQgdGhpcyBWTUEgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWZ4X3Jhd19yZWN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCB1MTYgKmNtZCwgaW50IHgsIGludCB5LAorCWludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzaXplX3QgcGFja2VkX2xpbmVfbGVuID0gQUxJR04oKHdpZHRoICogMiksIDQpOworCXNpemVfdCBwYWNrZWRfcmVjdF9sZW4gPSBwYWNrZWRfbGluZV9sZW4gKiBoZWlnaHQ7CisJaW50IGxpbmU7CisKKwlCVUdfT04oIWRldik7CisJQlVHX09OKCFkZXYtPmluZm8pOworCisJLyogY29tbWFuZCB3b3JkICovCisJKigodTMyICopJmNtZFswXSkgPSBjcHVfdG9fbGUzMigweDAxKTsKKworCS8qIGxlbmd0aCB3b3JkICovCisJKigodTMyICopJmNtZFsyXSkgPSBjcHVfdG9fbGUzMihwYWNrZWRfcmVjdF9sZW4gKyAxNik7CisKKwljbWRbNF0gPSBjcHVfdG9fbGUxNih4KTsKKwljbWRbNV0gPSBjcHVfdG9fbGUxNih5KTsKKwljbWRbNl0gPSBjcHVfdG9fbGUxNih3aWR0aCk7CisJY21kWzddID0gY3B1X3RvX2xlMTYoaGVpZ2h0KTsKKworCS8qIGZyYW1lIGJhc2UgYWRkcmVzcyAqLworCSooKHUzMiAqKSZjbWRbOF0pID0gY3B1X3RvX2xlMzIoMCk7CisKKwkvKiBjb2xvciBtb2RlIGFuZCBob3Jpem9udGFsIHJlc29sdXRpb24gKi8KKwljbWRbMTBdID0gY3B1X3RvX2xlMTYoMHg0MDAwIHwgZGV2LT5pbmZvLT52YXIueHJlcyk7CisKKwkvKiB2ZXJ0aWNhbCByZXNvbHV0aW9uICovCisJY21kWzExXSA9IGNwdV90b19sZTE2KGRldi0+aW5mby0+dmFyLnlyZXMpOworCisJLyogcGFja2VkIGRhdGEgKi8KKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaGVpZ2h0OyBsaW5lKyspIHsKKwkJY29uc3QgaW50IGxpbmVfb2Zmc2V0ID0gZGV2LT5pbmZvLT5maXgubGluZV9sZW5ndGggKiAoeSArIGxpbmUpOworCQljb25zdCBpbnQgYnl0ZV9vZmZzZXQgPSBsaW5lX29mZnNldCArICh4ICogQlBQKTsKKwkJbWVtY3B5KCZjbWRbKDI0ICsgKHBhY2tlZF9saW5lX2xlbiAqIGxpbmUpKSAvIDJdLAorCQkJKGNoYXIgKilkZXYtPmluZm8tPmZpeC5zbWVtX3N0YXJ0ICsgYnl0ZV9vZmZzZXQsIHdpZHRoICogQlBQKTsKKwl9Cit9CisKK2ludCB1ZnhfaGFuZGxlX2RhbWFnZShzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgaW50IHgsIGludCB5LAorCWludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzaXplX3QgcGFja2VkX2xpbmVfbGVuID0gQUxJR04oKHdpZHRoICogMiksIDQpOworCWludCBsZW4sIHN0YXR1cywgdXJiX2xpbmVzLCBzdGFydF9saW5lID0gMDsKKworCWlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSB8fAorCSAgICAoeCArIHdpZHRoID4gZGV2LT5pbmZvLT52YXIueHJlcykgfHwKKwkgICAgKHkgKyBoZWlnaHQgPiBkZXYtPmluZm8tPnZhci55cmVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChzdGFydF9saW5lIDwgaGVpZ2h0KSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHVmeF9nZXRfdXJiKGRldik7CisJCWlmICghdXJiKSB7CisJCQlwcl93YXJuKCJ1ZnhfaGFuZGxlX2RhbWFnZSB1bmFibGUgdG8gZ2V0IHVyYiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBhc3N1bWUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgdG8gdHJhbnNmZXIgYXQgbGVhc3Qgb25lIGxpbmUgKi8KKwkJQlVHX09OKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA8ICgyNCArICh3aWR0aCAqIDIpKSk7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB3ZSBjb3VsZCBmaXQgaW4gKi8KKwkJdXJiX2xpbmVzID0gKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtIDI0KSAvIHBhY2tlZF9saW5lX2xlbjsKKworCQkvKiBidXQgd2UgbWlnaHQgbm90IG5lZWQgdGhpcyBtYW55ICovCisJCXVyYl9saW5lcyA9IG1pbih1cmJfbGluZXMsIChoZWlnaHQgLSBzdGFydF9saW5lKSk7CisKKwkJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCAwLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJCXVmeF9yYXdfcmVjdChkZXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB4LCAoeSArIHN0YXJ0X2xpbmUpLCB3aWR0aCwgdXJiX2xpbmVzKTsKKwkJbGVuID0gMjQgKyAocGFja2VkX2xpbmVfbGVuICogdXJiX2xpbmVzKTsKKworCQlzdGF0dXMgPSB1Znhfc3VibWl0X3VyYihkZXYsIHVyYiwgbGVuKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRXJyb3Igc3VibWl0dGluZyBVUkIiKTsKKworCQlzdGFydF9saW5lICs9IHVyYl9saW5lczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUGF0aCB0cmlnZ2VyZWQgYnkgdXNlcm1vZGUgY2xpZW50cyB3aG8gd3JpdGUgdG8gZmlsZXN5c3RlbQorICogZS5nLiBjYXQgZmlsZW5hbWUgPiAvZGV2L2ZiMQorICogTm90IHVzZWQgYnkgWCBXaW5kb3dzIG9yIHRleHQtbW9kZSBjb25zb2xlLiBCdXQgdXNlZnVsIGZvciB0ZXN0aW5nLgorICogU2xvdyBiZWNhdXNlIG9mIGV4dHJhIGNvcHkgYW5kIHdlIG11c3QgYXNzdW1lIGFsbCBwaXhlbHMgZGlydHkuICovCitzdGF0aWMgc3NpemVfdCB1Znhfb3BzX3dyaXRlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJlc3VsdDsKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwl1MzIgb2Zmc2V0ID0gKHUzMikgKnBwb3M7CisKKwlyZXN1bHQgPSBmYl9zeXNfd3JpdGUoaW5mbywgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlpZiAocmVzdWx0ID4gMCkgeworCQlpbnQgc3RhcnQgPSBtYXgoKGludCkob2Zmc2V0IC8gaW5mby0+Zml4LmxpbmVfbGVuZ3RoKSAtIDEsIDApOworCQlpbnQgbGluZXMgPSBtaW4oKHUzMikoKHJlc3VsdCAvIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKyAxKSwKKwkJCQkodTMyKWluZm8tPnZhci55cmVzKTsKKworCQl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIDAsIHN0YXJ0LCBpbmZvLT52YXIueHJlcywgbGluZXMpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9vcHNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQoreworCisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBpbmZvLT5wYXI7CisKKwlzeXNfY29weWFyZWEoaW5mbywgYXJlYSk7CisKKwl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGFyZWEtPmR4LCBhcmVhLT5keSwKKwkJCWFyZWEtPndpZHRoLCBhcmVhLT5oZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCB1Znhfb3BzX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJc3lzX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisKKwl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGltYWdlLT5keCwgaW1hZ2UtPmR5LAorCQkJaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgdWZ4X29wc19maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJc3lzX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCisJdWZ4X2hhbmRsZV9kYW1hZ2UoZGV2LCByZWN0LT5keCwgcmVjdC0+ZHksIHJlY3QtPndpZHRoLAorCQkJICAgICAgcmVjdC0+aGVpZ2h0KTsKK30KKworLyogTk9URTogZmJfZGVmaW8uYyBpcyBob2xkaW5nIGluZm8tPmZiZGVmaW8ubXV0ZXgKKyAqICAgVG91Y2hpbmcgQU5ZIGZyYW1lYnVmZmVyIG1lbW9yeSB0aGF0IHRyaWdnZXJzIGEgcGFnZSBmYXVsdAorICogICBpbiBmYl9kZWZpbyB3aWxsIGNhdXNlIGEgZGVhZGxvY2ssIHdoZW4gaXQgYWxzbyB0cmllcyB0bworICogICBncmFiIHRoZSBzYW1lIG11dGV4LiAqLworc3RhdGljIHZvaWQgdWZ4X2RweV9kZWZlcnJlZF9pbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCkKK3sKKwlzdHJ1Y3QgcGFnZSAqY3VyOworCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbyA9IGluZm8tPmZiZGVmaW87CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBpbmZvLT5wYXI7CisKKwlpZiAoIWZiX2RlZmlvKQorCQlyZXR1cm47CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm47CisKKwkvKiB3YWxrIHRoZSB3cml0dGVuIHBhZ2UgbGlzdCBhbmQgcmVuZGVyIGVhY2ggdG8gZGV2aWNlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZmYmRlZmlvLT5wYWdlbGlzdCwgbHJ1KSB7CisJCS8qIGNyZWF0ZSBhIHJlY3RhbmdsZSBvZiBmdWxsIHNjcmVlbiB3aWR0aCB0aGF0IGVuY2xvc2VzIHRoZQorCQkgKiBlbnRpcmUgZGlydHkgZnJhbWVidWZmZXIgcGFnZSAqLworCQljb25zdCBpbnQgeCA9IDA7CisJCWNvbnN0IGludCB3aWR0aCA9IGRldi0+aW5mby0+dmFyLnhyZXM7CisJCWNvbnN0IGludCB5ID0gKGN1ci0+aW5kZXggPDwgUEFHRV9TSElGVCkgLyAod2lkdGggKiAyKTsKKwkJaW50IGhlaWdodCA9IChQQUdFX1NJWkUgLyAod2lkdGggKiAyKSkgKyAxOworCQloZWlnaHQgPSBtaW4oaGVpZ2h0LCAoaW50KShkZXYtPmluZm8tPnZhci55cmVzIC0geSkpOworCisJCUJVR19PTih5ID49IGRldi0+aW5mby0+dmFyLnlyZXMpOworCQlCVUdfT04oKHkgKyBoZWlnaHQpID4gZGV2LT5pbmZvLT52YXIueXJlcyk7CisKKwkJdWZ4X2hhbmRsZV9kYW1hZ2UoZGV2LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZGxvYXJlYSAqYXJlYSA9IE5VTEw7CisKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPnVzYl9hY3RpdmUpKQorCQlyZXR1cm4gMDsKKworCS8qIFRPRE86IFVwZGF0ZSBYIHNlcnZlciB0byBnZXQgdGhpcyBmcm9tIHN5c2ZzIGluc3RlYWQgKi8KKwlpZiAoY21kID09IFVGWF9JT0NUTF9SRVRVUk5fRURJRCkgeworCQl1OCBfX3VzZXIgKmVkaWQgPSAodTggX191c2VyICopYXJnOworCQlpZiAoY29weV90b191c2VyKGVkaWQsIGRldi0+ZWRpZCwgZGV2LT5lZGlkX3NpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCS8qIFRPRE86IEhlbHAgcHJvcG9zZSBhIHN0YW5kYXJkIGZiLmggaW9jdGwgdG8gcmVwb3J0IG1tYXAgZGFtYWdlICovCisJaWYgKGNtZCA9PSBVRlhfSU9DVExfUkVQT1JUX0RBTUFHRSkgeworCQkvKiBJZiB3ZSBoYXZlIGEgZGFtYWdlLWF3YXJlIGNsaWVudCwgdHVybiBmYl9kZWZpbyAib2ZmIgorCQkgKiBUbyBhdm9pZCBwZXJmIGltYWN0IG9mIHVuZWNlc3NhcnkgcGFnZSBmYXVsdCBoYW5kbGluZy4KKwkJICogRG9uZSBieSByZXNldHRpbmcgdGhlIGRlbGF5IGZvciB0aGlzIGZiX2luZm8gdG8gYSB2ZXJ5CisJCSAqIGxvbmcgcGVyaW9kLiBQYWdlcyB3aWxsIGJlY29tZSB3cml0YWJsZSBhbmQgc3RheSB0aGF0IHdheS4KKwkJICogUmVzZXQgdG8gbm9ybWFsIHZhbHVlIHdoZW4gYWxsIGNsaWVudHMgaGF2ZSBjbG9zZWQgdGhpcyBmYi4KKwkJICovCisJCWlmIChpbmZvLT5mYmRlZmlvKQorCQkJaW5mby0+ZmJkZWZpby0+ZGVsYXkgPSBVRlhfREVGSU9fV1JJVEVfRElTQUJMRTsKKworCQlhcmVhID0gKHN0cnVjdCBkbG9hcmVhICopYXJnOworCisJCWlmIChhcmVhLT54IDwgMCkKKwkJCWFyZWEtPnggPSAwOworCisJCWlmIChhcmVhLT54ID4gaW5mby0+dmFyLnhyZXMpCisJCQlhcmVhLT54ID0gaW5mby0+dmFyLnhyZXM7CisKKwkJaWYgKGFyZWEtPnkgPCAwKQorCQkJYXJlYS0+eSA9IDA7CisKKwkJaWYgKGFyZWEtPnkgPiBpbmZvLT52YXIueXJlcykKKwkJCWFyZWEtPnkgPSBpbmZvLT52YXIueXJlczsKKworCQl1ZnhfaGFuZGxlX2RhbWFnZShkZXYsIGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0YWtlbiBmcm9tIHZlc2FmYiAqLworc3RhdGljIGludAordWZ4X29wc19zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJICAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocmVnbm8gPj0gaW5mby0+Y21hcC5sZW4pCisJCXJldHVybiAxOworCisJaWYgKHJlZ25vIDwgMTYpIHsKKwkJaWYgKGluZm8tPnZhci5yZWQub2Zmc2V0ID09IDEwKSB7CisJCQkvKiAxOjU6NTo1ICovCisJCQkoKHUzMiAqKSAoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCQkJICAgICgocmVkICYgMHhmODAwKSA+PiAxKSB8CisJCQkgICAgKChncmVlbiAmIDB4ZjgwMCkgPj4gNikgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDA6NTo2OjUgKi8KKwkJCSgodTMyICopIChpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkgICAgKChyZWQgJiAweGY4MDApKSB8CisJCQkgICAgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEl0J3MgY29tbW9uIGZvciBzZXZlcmFsIGNsaWVudHMgdG8gaGF2ZSBmcmFtZWJ1ZmZlciBvcGVuIHNpbXVsdGFuZW91c2x5LgorICogZS5nLiBib3RoIGZiY29uIGFuZCBYLiBNYWtlcyB0aGluZ3MgaW50ZXJlc3RpbmcuCisgKiBBc3N1bWVzIGNhbGxlciBpcyBob2xkaW5nIGluZm8tPmxvY2sgKGZvciBvcGVuIGFuZCByZWxlYXNlIGF0IGxlYXN0KSAqLworc3RhdGljIGludCB1Znhfb3BzX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJLyogZmJjb24gYWdncmVzc2l2ZWx5IGNvbm5lY3RzIHRvIGZpcnN0IGZyYW1lYnVmZmVyIGl0IGZpbmRzLAorCSAqIHByZXZlbnRpbmcgb3RoZXIgY2xpZW50cyAoWCkgZnJvbSB3b3JraW5nIHByb3Blcmx5LiBVc3VhbGx5CisJICogbm90IHdoYXQgdGhlIHVzZXIgd2FudHMuIEZhaWwgYnkgZGVmYXVsdCB3aXRoIG9wdGlvbiB0byBlbmFibGUuICovCisJaWYgKHVzZXIgPT0gMCAmJiAhY29uc29sZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIElmIHRoZSBVU0IgZGV2aWNlIGlzIGdvbmUsIHdlIGRvbid0IGFjY2VwdCBuZXcgb3BlbnMgKi8KKwlpZiAoZGV2LT52aXJ0dWFsaXplZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYtPmZiX2NvdW50Kys7CisKKwlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKworCWlmIChmYl9kZWZpbyAmJiAoaW5mby0+ZmJkZWZpbyA9PSBOVUxMKSkgeworCQkvKiBlbmFibGUgZGVmaW8gYXQgbGFzdCBtb21lbnQgaWYgbm90IGRpc2FibGVkIGJ5IGNsaWVudCAqLworCisJCXN0cnVjdCBmYl9kZWZlcnJlZF9pbyAqZmJkZWZpbzsKKworCQlmYmRlZmlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZiX2RlZmVycmVkX2lvKSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGZiZGVmaW8pIHsKKwkJCWZiZGVmaW8tPmRlbGF5ID0gVUZYX0RFRklPX1dSSVRFX0RFTEFZOworCQkJZmJkZWZpby0+ZGVmZXJyZWRfaW8gPSB1ZnhfZHB5X2RlZmVycmVkX2lvOworCQl9CisKKwkJaW5mby0+ZmJkZWZpbyA9IGZiZGVmaW87CisJCWZiX2RlZmVycmVkX2lvX2luaXQoaW5mbyk7CisJfQorCisJcHJfZGVidWcoIm9wZW4gL2Rldi9mYiVkIHVzZXI9JWQgZmJfaW5mbz0lcCBjb3VudD0lZCIsCisJCWluZm8tPm5vZGUsIHVzZXIsIGluZm8sIGRldi0+ZmJfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbGwgY2xpZW50IGludGVyZmFjZXMgdG8gc3RhcnQgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBkaXNhYmxlZCwKKyAqIGFuZCBhbGwgcmVmZXJlbmNlcyB0byBvdXIgZGV2aWNlIGluc3RhbmNlICh1ZnhfZGF0YSkgYXJlIHJlbGVhc2VkLgorICogRXZlcnkgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlLCBzbyB3ZSBrbm93IGFyZSBmdWxseSBzcHVuIGRvd24KKyAqLworc3RhdGljIHZvaWQgdWZ4X2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVmeF9kYXRhLCBrcmVmKTsKKworCS8qIHRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IGZvciBhbGwgaW4tZmxpZ2h0IHVyYnMgdG8gY29tcGxldGUgKi8KKwlpZiAoZGV2LT51cmJzLmNvdW50ID4gMCkKKwkJdWZ4X2ZyZWVfdXJiX2xpc3QoZGV2KTsKKworCXByX2RlYnVnKCJmcmVlaW5nIHVmeF9kYXRhICVwIiwgZGV2KTsKKworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9yZWxlYXNlX3VyYl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXJiX25vZGUgKnVub2RlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1cmJfbm9kZSwKKwkJCQkJICAgICAgcmVsZWFzZV91cmJfd29yay53b3JrKTsKKworCXVwKCZ1bm9kZS0+ZGV2LT51cmJzLmxpbWl0X3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF9mcmVlX2ZyYW1lYnVmZmVyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1ZnhfZGF0YSwKKwkJCQkJICAgIGZyZWVfZnJhbWVidWZmZXJfd29yay53b3JrKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldi0+aW5mbzsKKwlpbnQgbm9kZSA9IGluZm8tPm5vZGU7CisKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCisJaWYgKGluZm8tPmNtYXAubGVuICE9IDApCisJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYikKKwkJZmJfZGVzdHJveV9tb2RlZGIoaW5mby0+bW9uc3BlY3MubW9kZWRiKTsKKwlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCisJCXZmcmVlKGluZm8tPnNjcmVlbl9iYXNlKTsKKworCWZiX2Rlc3Ryb3lfbW9kZWxpc3QoJmluZm8tPm1vZGVsaXN0KTsKKworCWRldi0+aW5mbyA9IDA7CisKKwkvKiBBc3N1bWUgaW5mbyBzdHJ1Y3R1cmUgaXMgZnJlZWQgYWZ0ZXIgdGhpcyBwb2ludCAqLworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisKKwlwcl9kZWJ1ZygiZmJfaW5mbyBmb3IgL2Rldi9mYiVkIGhhcyBiZWVuIGZyZWVkIiwgbm9kZSk7CisKKwkvKiByZWYgdGFrZW4gaW4gcHJvYmUoKSBhcyBwYXJ0IG9mIHJlZ2lzdGVyaW5nIGZyYW1lYmZ1ZmVyICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworfQorCisvKgorICogQXNzdW1lcyBjYWxsZXIgaXMgaG9sZGluZyBpbmZvLT5sb2NrIG11dGV4IChmb3Igb3BlbiBhbmQgcmVsZWFzZSBhdCBsZWFzdCkKKyAqLworc3RhdGljIGludCB1Znhfb3BzX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCisJZGV2LT5mYl9jb3VudC0tOworCisJLyogV2UgY2FuJ3QgZnJlZSBmYl9pbmZvIGhlcmUgLSBmYm1lbSB3aWxsIHRvdWNoIGl0IHdoZW4gd2UgcmV0dXJuICovCisJaWYgKGRldi0+dmlydHVhbGl6ZWQgJiYgKGRldi0+ZmJfY291bnQgPT0gMCkpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5mcmVlX2ZyYW1lYnVmZmVyX3dvcmssIEhaKTsKKworCWlmICgoZGV2LT5mYl9jb3VudCA9PSAwKSAmJiAoaW5mby0+ZmJkZWZpbykpIHsKKwkJZmJfZGVmZXJyZWRfaW9fY2xlYW51cChpbmZvKTsKKwkJa2ZyZWUoaW5mby0+ZmJkZWZpbyk7CisJCWluZm8tPmZiZGVmaW8gPSBOVUxMOworCQlpbmZvLT5mYm9wcy0+ZmJfbW1hcCA9IHVmeF9vcHNfbW1hcDsKKwl9CisKKwlwcl9kZWJ1ZygicmVsZWFzZWQgL2Rldi9mYiVkIHVzZXI9JWQgY291bnQ9JWQiLAorCQkgIGluZm8tPm5vZGUsIHVzZXIsIGRldi0+ZmJfY291bnQpOworCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgYSB2aWRlbyBtb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgY2hpcAorICogV2Ugc3RhcnQgZnJvbSBtb25pdG9yJ3MgbW9kZXMsIHNvIGRvbid0IG5lZWQgdG8gZmlsdGVyIHRoYXQgaGVyZSAqLworc3RhdGljIGludCB1ZnhfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlLAorCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpZiAoKG1vZGUtPnhyZXMgKiBtb2RlLT55cmVzKSA+ICgyMDQ4ICogMTE1MikpIHsKKwkJcHJfZGVidWcoIiVkeCVkIHRvbyBtYW55IHBpeGVscyIsCisJCSAgICAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1vZGUtPnBpeGNsb2NrIDwgNTAwMCkgeworCQlwcl9kZWJ1ZygiJWR4JWQgJWRwcyBwaXhlbCBjbG9jayB0b28gZmFzdCIsCisJCSAgICAgICBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCBtb2RlLT5waXhjbG9jayk7CisJCXJldHVybiAwOworCX0KKworCXByX2RlYnVnKCIlZHglZCAocGl4Y2xrICVkcHMgJWRNSHopIHZhbGlkIG1vZGUiLCBtb2RlLT54cmVzLCBtb2RlLT55cmVzLAorCQltb2RlLT5waXhjbG9jaywgKDEwMDAwMDAgLyBtb2RlLT5waXhjbG9jaykpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB1ZnhfdmFyX2NvbG9yX2Zvcm1hdChzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwljb25zdCBzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkID0geyAxMSwgNSwgMCB9OworCWNvbnN0IHN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbiA9IHsgNSwgNiwgMCB9OworCWNvbnN0IHN0cnVjdCBmYl9iaXRmaWVsZCBibHVlID0geyAwLCA1LCAwIH07CisKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJdmFyLT5yZWQgPSByZWQ7CisJdmFyLT5ncmVlbiA9IGdyZWVuOworCXZhci0+Ymx1ZSA9IGJsdWU7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3ZpZGVvbW9kZSBtb2RlOworCisJLyogVE9ETzogc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyBmcmFtZWJ1ZmZlciBzaXplICovCisJaWYgKCh2YXItPnhyZXMgKiB2YXItPnlyZXMgKiAyKSA+IGluZm8tPmZpeC5zbWVtX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgZGV2aWNlLXNwZWNpZmljIGVsZW1lbnRzIG9mIHZhciB1bnJlbGF0ZWQgdG8gbW9kZSAqLworCXVmeF92YXJfY29sb3JfZm9ybWF0KHZhcik7CisKKwlmYl92YXJfdG9fdmlkZW9tb2RlKCZtb2RlLCB2YXIpOworCisJaWYgKCF1ZnhfaXNfdmFsaWRfbW9kZSgmbW9kZSwgaW5mbykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWZ4X29wc19zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCWludCByZXN1bHQ7CisJdTE2ICpwaXhfZnJhbWVidWZmZXI7CisJaW50IGk7CisKKwlwcl9kZWJ1Zygic2V0X3BhciBtb2RlICVkeCVkIiwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKKwlyZXN1bHQgPSB1Znhfc2V0X3ZpZF9tb2RlKGRldiwgJmluZm8tPnZhcik7CisKKwlpZiAoKHJlc3VsdCA9PSAwKSAmJiAoZGV2LT5mYl9jb3VudCA9PSAwKSkgeworCQkvKiBwYWludCBncmVlbnNjcmVlbiAqLworCQlwaXhfZnJhbWVidWZmZXIgPSAodTE2ICopIGluZm8tPnNjcmVlbl9iYXNlOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+Zml4LnNtZW1fbGVuIC8gMjsgaSsrKQorCQkJcGl4X2ZyYW1lYnVmZmVyW2ldID0gMHgzN2U2OworCisJCXVmeF9oYW5kbGVfZGFtYWdlKGRldiwgMCwgMCwgaW5mby0+dmFyLnhyZXMsIGluZm8tPnZhci55cmVzKTsKKwl9CisKKwkvKiByZS1lbmFibGUgZGVmaW8gaWYgcHJldmlvdXNseSBkaXNhYmxlZCBieSBkYW1hZ2UgdHJhY2tpbmcgKi8KKwlpZiAoaW5mby0+ZmJkZWZpbykKKwkJaW5mby0+ZmJkZWZpby0+ZGVsYXkgPSBVRlhfREVGSU9fV1JJVEVfREVMQVk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBJbiBvcmRlciB0byBjb21lIGJhY2sgZnJvbSBmdWxsIERQTVMgb2ZmLCB3ZSBuZWVkIHRvIHNldCB0aGUgbW9kZSBhZ2FpbiAqLworc3RhdGljIGludCB1Znhfb3BzX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldiA9IGluZm8tPnBhcjsKKwl1Znhfc2V0X3ZpZF9tb2RlKGRldiwgJmluZm8tPnZhcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIHVmeF9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX3JlYWQgPSBmYl9zeXNfcmVhZCwKKwkuZmJfd3JpdGUgPSB1Znhfb3BzX3dyaXRlLAorCS5mYl9zZXRjb2xyZWcgPSB1Znhfb3BzX3NldGNvbHJlZywKKwkuZmJfZmlsbHJlY3QgPSB1Znhfb3BzX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYSA9IHVmeF9vcHNfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IHVmeF9vcHNfaW1hZ2VibGl0LAorCS5mYl9tbWFwID0gdWZ4X29wc19tbWFwLAorCS5mYl9pb2N0bCA9IHVmeF9vcHNfaW9jdGwsCisJLmZiX29wZW4gPSB1Znhfb3BzX29wZW4sCisJLmZiX3JlbGVhc2UgPSB1Znhfb3BzX3JlbGVhc2UsCisJLmZiX2JsYW5rID0gdWZ4X29wc19ibGFuaywKKwkuZmJfY2hlY2tfdmFyID0gdWZ4X29wc19jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSB1Znhfb3BzX3NldF9wYXIsCit9OworCisvKiBBc3N1bWVzICZpbmZvLT5sb2NrIGhlbGQgYnkgY2FsbGVyCisgKiBBc3N1bWVzIG5vIGFjdGl2ZSBjbGllbnRzIGhhdmUgZnJhbWVidWZmZXIgb3BlbiAqLworc3RhdGljIGludCB1ZnhfcmVhbGxvY19mcmFtZWJ1ZmZlcihzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJaW50IG9sZF9sZW4gPSBpbmZvLT5maXguc21lbV9sZW47CisJaW50IG5ld19sZW47CisJdW5zaWduZWQgY2hhciAqb2xkX2ZiID0gaW5mby0+c2NyZWVuX2Jhc2U7CisJdW5zaWduZWQgY2hhciAqbmV3X2ZiOworCisJcHJfZGVidWcoIlJlYWxsb2NhdGluZyBmcmFtZWJ1ZmZlci4gQWRkcmVzc2VzIHdpbGwgY2hhbmdlISIpOworCisJbmV3X2xlbiA9IGluZm8tPmZpeC5saW5lX2xlbmd0aCAqIGluZm8tPnZhci55cmVzOworCisJaWYgKFBBR0VfQUxJR04obmV3X2xlbikgPiBvbGRfbGVuKSB7CisJCS8qCisJCSAqIEFsbG9jIHN5c3RlbSBtZW1vcnkgZm9yIHZpcnR1YWwgZnJhbWVidWZmZXIKKwkJICovCisJCW5ld19mYiA9IHZtYWxsb2MobmV3X2xlbik7CisJCWlmICghbmV3X2ZiKSB7CisJCQlwcl9lcnIoIlZpcnR1YWwgZnJhbWVidWZmZXIgYWxsb2MgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKGluZm8tPnNjcmVlbl9iYXNlKSB7CisJCQltZW1jcHkobmV3X2ZiLCBvbGRfZmIsIG9sZF9sZW4pOworCQkJdmZyZWUoaW5mby0+c2NyZWVuX2Jhc2UpOworCQl9CisKKwkJaW5mby0+c2NyZWVuX2Jhc2UgPSBuZXdfZmI7CisJCWluZm8tPmZpeC5zbWVtX2xlbiA9IFBBR0VfQUxJR04obmV3X2xlbik7CisJCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIG5ld19mYjsKKwkJaW5mby0+ZmxhZ3MgPSBzbXNjdWZ4X2luZm9fZmxhZ3M7CisJfQorCisJcmV0dmFsID0gMDsKKworZXJyb3I6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogc2V0cyB1cCBJMkMgQ29udHJvbGxlciBmb3IgMTAwIEticHMsIHN0ZC4gc3BlZWQsIDctYml0IGFkZHIsIG1hc3RlciwKKyAqIHJlc3RhcnQgZW5hYmxlZCwgYnV0IG5vIHN0YXJ0IGJ5dGUsIGVuYWJsZSBjb250cm9sbGVyICovCitzdGF0aWMgaW50IHVmeF9pMmNfaW5pdChzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwl1MzIgdG1wOworCisJLyogZGlzYWJsZSB0aGUgY29udHJvbGxlciBiZWZvcmUgaXQgY2FuIGJlIHJlcHJvZ3JhbW1lZCAqLworCWludCBzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMDZDLCAweDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJmYWlsZWQgdG8gZGlzYWJsZSBJMkMiKTsKKworCS8qIFNldHVwIHRoZSBjbG9jayBjb3VudCByZWdpc3RlcnMKKwkgKiAoMTIrMSkgPSAxMyBjbGtzIEAgMi41IE1IeiA9IDUuMiB1UyAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwMTgsIDEyKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MTAxOCIpOworCisJLyogKDYrOCkgPSAxNCBjbGtzIEAgMi41IE1IeiA9IDUuNiB1UyAqLworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwMTQsIDYpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHdyaXRpbmcgMHgxMDE0Iik7CisKKwlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDEwMDAsICZ0bXApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImVycm9yIHJlYWRpbmcgMHgxMDAwIik7CisKKwkvKiBzZXQgc3BlZWQgdG8gc3RkIG1vZGUgKi8KKwl0bXAgJj0gfigweDA2KTsKKwl0bXAgfD0gMHgwMjsKKworCS8qIDctYml0IChub3QgMTAtYml0KSBhZGRyZXNzaW5nICovCisJdG1wICY9IH4oMHgxMCk7CisKKwkvKiBlbmFibGUgcmVzdGFydCBjb25kaXRpb25zIGFuZCBtYXN0ZXIgbW9kZSAqLworCXRtcCB8PSAweDIxOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MTAwMCwgdG1wKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJlcnJvciB3cml0aW5nIDB4MTAwMCIpOworCisJLyogU2V0IG5vcm1hbCB0eCB1c2luZyB0YXJnZXQgYWRkcmVzcyAwICovCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCAweDEwMDQsIDB4QzAwLCAweDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZXJyb3Igc2V0dGluZyBUWCBtb2RlIGJpdHMgaW4gMHgxMDA0Iik7CisKKwkvKiBFbmFibGUgdGhlIGNvbnRyb2xsZXIgKi8KKwlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMDZDLCAweDAxKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICJmYWlsZWQgdG8gZW5hYmxlIEkyQyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldHMgdGhlIEkyQyBwb3J0IG11eCBhbmQgdGFyZ2V0IGFkZHJlc3MgKi8KK3N0YXRpYyBpbnQgdWZ4X2kyY19jb25maWd1cmUoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IHN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwNkMsIDB4MDApOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImZhaWxlZCB0byBkaXNhYmxlIEkyQyIpOworCisJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MzAxMCwgMHgwMDAwMDAwMCk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZmFpbGVkIHRvIHdyaXRlIDB4MzAxMCIpOworCisJLyogQTBoIGlzIHN0ZCBmb3IgYW55IEVESUQsIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lICovCisJc3RhdHVzID0gdWZ4X3JlZ19jbGVhcl9hbmRfc2V0X2JpdHMoZGV2LCAweDEwMDQsIDB4M0ZGLAkoMHhBMCA+PiAxKSk7CisJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiZmFpbGVkIHRvIHNldCBUQVIgYml0cyBpbiAweDEwMDQiKTsKKworCXN0YXR1cyA9IHVmeF9yZWdfd3JpdGUoZGV2LCAweDEwNkMsIDB4MDEpOworCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgImZhaWxlZCB0byBlbmFibGUgSTJDIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogd2FpdCBmb3IgQlVTWSB0byBjbGVhciwgd2l0aCBhIHRpbWVvdXQgb2YgNTBtcyB3aXRoIDEwbXMgc2xlZXBzLiBpZiBubworICogbW9uaXRvciBpcyBjb25uZWN0ZWQsIHRoZXJlIGlzIG5vIGVycm9yIGV4Y2VwdCBmb3IgdGltZW91dCAqLworc3RhdGljIGludCB1ZnhfaTJjX3dhaXRfYnVzeShzdHJ1Y3QgdWZ4X2RhdGEgKmRldikKK3sKKwl1MzIgdG1wOworCWludCBpLCBzdGF0dXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQlzdGF0dXMgPSB1ZnhfcmVnX3JlYWQoZGV2LCAweDExMDAsICZ0bXApOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICIweDExMDAgcmVhZCBmYWlsZWQiKTsKKworCQkvKiBpZiBCVVNZIGlzIGNsZWFyLCBjaGVjayBmb3IgZXJyb3IgKi8KKwkJaWYgKCh0bXAgJiAweDgwMDAwMDAwKSA9PSAwKSB7CisJCQlpZiAodG1wICYgMHgyMDAwMDAwMCkgeworCQkJCXByX3dhcm4oIkkyQyByZWFkIGZhaWxlZCwgMHgxMTAwPTB4JTA4eCIsIHRtcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogcGVyZm9ybSB0aGUgZmlyc3QgMTAgcmV0cmllcyB3aXRob3V0IGRlbGF5ICovCisJCWlmIChpID49IDEwKQorCQkJbXNsZWVwKDEwKTsKKwl9CisKKwlwcl93YXJuKCJJMkMgYWNjZXNzIHRpbWVkIG91dCwgcmVzZXR0aW5nIEkyQyBoYXJkd2FyZSIpOworCXN0YXR1cyA9ICB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMTAwLCAweDQwMDAwMDAwKTsKKwljaGVja193YXJuX3JldHVybihzdGF0dXMsICIweDExMDAgd3JpdGUgZmFpbGVkIik7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogcmVhZHMgYSAxMjgtYnl0ZSBFRElEIGJsb2NrIGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwb3J0IGFuZCBUQVIgKi8KK3N0YXRpYyBpbnQgdWZ4X3JlYWRfZWRpZChzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgdTggKmVkaWQsIGludCBlZGlkX2xlbikKK3sKKwlpbnQgaSwgaiwgc3RhdHVzOworCXUzMiAqZWRpZF91MzIgPSAodTMyICopZWRpZDsKKworCUJVR19PTihlZGlkX2xlbiAhPSBFRElEX0xFTkdUSCk7CisKKwlzdGF0dXMgPSB1ZnhfaTJjX2NvbmZpZ3VyZShkZXYpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2VycigidWZ4X2kyY19jb25maWd1cmUgZmFpbGVkIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbWVtc2V0KGVkaWQsIDB4ZmYsIEVESURfTEVOR1RIKTsKKworCS8qIFJlYWQgdGhlIDEyOC1ieXRlIEVESUQgYXMgMiBidXJzdHMgb2YgNjQgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXUzMiB0ZW1wID0gMHgyODA3MDAwMCB8ICg2MyA8PCAyMCkgfCAoKCh1MzIpKGkgKiA2NCkpIDw8IDgpOworCQlzdGF0dXMgPSB1ZnhfcmVnX3dyaXRlKGRldiwgMHgxMTAwLCB0ZW1wKTsKKwkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRmFpbGVkIHRvIHdyaXRlIDB4MTEwMCIpOworCisJCXRlbXAgfD0gMHg4MDAwMDAwMDsKKwkJc3RhdHVzID0gdWZ4X3JlZ193cml0ZShkZXYsIDB4MTEwMCwgdGVtcCk7CisJCWNoZWNrX3dhcm5fcmV0dXJuKHN0YXR1cywgIkZhaWxlZCB0byB3cml0ZSAweDExMDAiKTsKKworCQlzdGF0dXMgPSB1ZnhfaTJjX3dhaXRfYnVzeShkZXYpOworCQljaGVja193YXJuX3JldHVybihzdGF0dXMsICJUaW1lb3V0IHdhaXRpbmcgZm9yIEkyQyBCVVNZIHRvIGNsZWFyIik7CisKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCXUzMiBkYXRhX3JlZ19hZGRyID0gMHgxMTEwICsgKGogKiA0KTsKKwkJCXN0YXR1cyA9IHVmeF9yZWdfcmVhZChkZXYsIGRhdGFfcmVnX2FkZHIsIGVkaWRfdTMyKyspOworCQkJY2hlY2tfd2Fybl9yZXR1cm4oc3RhdHVzLCAiRXJyb3IgcmVhZGluZyBpMmMgZGF0YSIpOworCQl9CisJfQorCisJLyogYWxsIEZGJ3MgaW4gdGhlIGZpcnN0IDE2IGJ5dGVzIGluZGljYXRlcyBub3RoaW5nIGlzIGNvbm5lY3RlZCAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChlZGlkW2ldICE9IDB4RkYpIHsKKwkJCXByX2RlYnVnKCJlZGlkIGRhdGEgcmVhZCBzdWNjZXNmdWxseSIpOworCQkJcmV0dXJuIEVESURfTEVOR1RIOworCQl9CisJfQorCisJcHJfd2FybigiZWRpZCBkYXRhIGNvbnRhaW5zIGFsbCAweGZmIik7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIDEpIHVzZSBzdyBkZWZhdWx0CisgKiAyKSBQYXJzZSBpbnRvIHZhcmlvdXMgZmJfaW5mbyBzdHJ1Y3RzCisgKiAzKSBBbGxvY2F0ZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIG1lbW9yeSB0byBiYWNrIGhpZ2hlc3QgcmVzIG1vZGUKKyAqCisgKiBQYXJzZXMgRURJRCBpbnRvIHRocmVlIHBsYWNlcyB1c2VkIGJ5IHZhcmlvdXMgcGFydHMgb2YgZmJkZXY6CisgKiBmYl92YXJfc2NyZWVuaW5mbyBjb250YWlucyB0aGUgdGltaW5nIG9mIHRoZSBtb25pdG9yJ3MgcHJlZmVycmVkIG1vZGUKKyAqIGZiX2luZm8ubW9uc3BlY3MgaXMgZnVsbCBwYXJzZWQgRURJRCBpbmZvLCBpbmNsdWRpbmcgbW9uc3BlY3MubW9kZWRiCisgKiBmYl9pbmZvLm1vZGVsaXN0IGlzIGEgbGlua2VkIGxpc3Qgb2YgYWxsIG1vbml0b3IgJiBWRVNBIG1vZGVzIHdoaWNoIHdvcmsKKyAqCisgKiBJZiBFRElEIGlzIG5vdCByZWFkYWJsZS92YWxpZCwgdGhlbiBtb2RlbGlzdCBpcyBhbGwgVkVTQSBtb2RlcywKKyAqIG1vbnNwZWNzIGlzIE5VTEwsIGFuZCBmYl92YXJfc2NyZWVuaW5mbyBpcyBzZXQgdG8gc2FmZSBWRVNBIG1vZGUKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsICovCitzdGF0aWMgaW50IHVmeF9zZXR1cF9tb2RlcyhzdHJ1Y3QgdWZ4X2RhdGEgKmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJY2hhciAqZGVmYXVsdF9lZGlkLCBzaXplX3QgZGVmYXVsdF9lZGlkX3NpemUpCit7CisJY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqZGVmYXVsdF92bW9kZSA9IE5VTEw7CisJdTggKmVkaWQ7CisJaW50IGksIHJlc3VsdCA9IDAsIHRyaWVzID0gMzsKKworCWlmIChpbmZvLT5kZXYpIC8qIG9ubHkgdXNlIG11dGV4IGlmIGluZm8gaGFzIGJlZW4gcmVnaXN0ZXJlZCAqLworCQltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKworCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVkaWQpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmYl9kZXN0cm95X21vZGVsaXN0KCZpbmZvLT5tb2RlbGlzdCk7CisJbWVtc2V0KCZpbmZvLT5tb25zcGVjcywgMCwgc2l6ZW9mKGluZm8tPm1vbnNwZWNzKSk7CisKKwkvKiBUcnkgdG8gKHJlKXJlYWQgRURJRCBmcm9tIGhhcmR3YXJlIGZpcnN0CisJICogRURJRCBkYXRhIG1heSByZXR1cm4sIGJ1dCBub3QgcGFyc2UgYXMgdmFsaWQKKwkgKiBUcnkgYWdhaW4gYSBmZXcgdGltZXMsIGluIGNhc2Ugb2YgZS5nLiBhbmFsb2cgY2FibGUgbm9pc2UgKi8KKwl3aGlsZSAodHJpZXMtLSkgeworCQlpID0gdWZ4X3JlYWRfZWRpZChkZXYsIGVkaWQsIEVESURfTEVOR1RIKTsKKworCQlpZiAoaSA+PSBFRElEX0xFTkdUSCkKKwkJCWZiX2VkaWRfdG9fbW9uc3BlY3MoZWRpZCwgJmluZm8tPm1vbnNwZWNzKTsKKworCQlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA+IDApIHsKKwkJCWRldi0+ZWRpZCA9IGVkaWQ7CisJCQlkZXYtPmVkaWRfc2l6ZSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIHRoYXQgZmFpbHMsIHVzZSBhIHByZXZpb3VzbHkgcmV0dXJuZWQgRURJRCBpZiBhdmFpbGFibGUgKi8KKwlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA9PSAwKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCB2YWxpZCBFRElEIGZyb20gZGV2aWNlL2Rpc3BsYXlcbiIpOworCisJCWlmIChkZXYtPmVkaWQpIHsKKwkJCWZiX2VkaWRfdG9fbW9uc3BlY3MoZGV2LT5lZGlkLCAmaW5mby0+bW9uc3BlY3MpOworCQkJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYl9sZW4gPiAwKQorCQkJCXByX2VycigiVXNpbmcgcHJldmlvdXNseSBxdWVyaWVkIEVESURcbiIpOworCQl9CisJfQorCisJLyogSWYgdGhhdCBmYWlscywgdXNlIHRoZSBkZWZhdWx0IEVESUQgd2Ugd2VyZSBoYW5kZWQgKi8KKwlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA9PSAwKSB7CisJCWlmIChkZWZhdWx0X2VkaWRfc2l6ZSA+PSBFRElEX0xFTkdUSCkgeworCQkJZmJfZWRpZF90b19tb25zcGVjcyhkZWZhdWx0X2VkaWQsICZpbmZvLT5tb25zcGVjcyk7CisJCQlpZiAoaW5mby0+bW9uc3BlY3MubW9kZWRiX2xlbiA+IDApIHsKKwkJCQltZW1jcHkoZWRpZCwgZGVmYXVsdF9lZGlkLCBkZWZhdWx0X2VkaWRfc2l6ZSk7CisJCQkJZGV2LT5lZGlkID0gZWRpZDsKKwkJCQlkZXYtPmVkaWRfc2l6ZSA9IGRlZmF1bHRfZWRpZF9zaXplOworCQkJCXByX2VycigiVXNpbmcgZGVmYXVsdC9iYWNrdXAgRURJRFxuIik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiB3ZSd2ZSBnb3QgbW9kZXMsIGxldCdzIHBpY2sgYSBiZXN0IGRlZmF1bHQgbW9kZSAqLworCWlmIChpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuID4gMCkgeworCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5tb25zcGVjcy5tb2RlZGJfbGVuOyBpKyspIHsKKwkJCWlmICh1ZnhfaXNfdmFsaWRfbW9kZSgmaW5mby0+bW9uc3BlY3MubW9kZWRiW2ldLCBpbmZvKSkKKwkJCQlmYl9hZGRfdmlkZW9tb2RlKCZpbmZvLT5tb25zcGVjcy5tb2RlZGJbaV0sCisJCQkJCSZpbmZvLT5tb2RlbGlzdCk7CisJCQllbHNlIC8qIGlmIHdlJ3ZlIHJlbW92ZWQgdG9wL2Jlc3QgbW9kZSAqLworCQkJCWluZm8tPm1vbnNwZWNzLm1pc2MgJj0gfkZCX01JU0NfMVNUX0RFVEFJTDsKKwkJfQorCisJCWRlZmF1bHRfdm1vZGUgPSBmYl9maW5kX2Jlc3RfZGlzcGxheSgmaW5mby0+bW9uc3BlY3MsCisJCQkJCQkgICAgICZpbmZvLT5tb2RlbGlzdCk7CisJfQorCisJLyogSWYgZXZlcnl0aGluZyBlbHNlIGhhcyBmYWlsZWQsIGZhbGwgYmFjayB0byBzYWZlIGRlZmF1bHQgbW9kZSAqLworCWlmIChkZWZhdWx0X3Ztb2RlID09IE5VTEwpIHsKKworCQlzdHJ1Y3QgZmJfdmlkZW9tb2RlIGZiX3Ztb2RlID0gezB9OworCisJCS8qIEFkZCB0aGUgc3RhbmRhcmQgVkVTQSBtb2RlcyB0byBvdXIgbW9kZWxpc3QKKwkJICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBFRElELCB0aGVyZSBtYXkgYmUgbW9kZXMgdGhhdAorCQkgKiBvdmVyc3BlYyBtb25pdG9yIGFuZC9vciBhcmUgaW5jb3JyZWN0IGFzcGVjdCByYXRpbywgZXRjLgorCQkgKiBCdXQgYXQgbGVhc3QgdGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIGNob29zZQorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFZFU0FfTU9ERURCX1NJWkU7IGkrKykgeworCQkJaWYgKHVmeF9pc192YWxpZF9tb2RlKChzdHJ1Y3QgZmJfdmlkZW9tb2RlICopCisJCQkJCQkmdmVzYV9tb2Rlc1tpXSwgaW5mbykpCisJCQkJZmJfYWRkX3ZpZGVvbW9kZSgmdmVzYV9tb2Rlc1tpXSwKKwkJCQkJCSAmaW5mby0+bW9kZWxpc3QpOworCQl9CisKKwkJLyogZGVmYXVsdCB0byByZXNvbHV0aW9uIHNhZmUgZm9yIHByb2plY3RvcnMKKwkJICogKHNpbmNlIHRoZXkgYXJlIG1vc3QgY29tbW9uIGNhc2Ugd2l0aG91dCBFRElEKQorCQkgKi8KKwkJZmJfdm1vZGUueHJlcyA9IDgwMDsKKwkJZmJfdm1vZGUueXJlcyA9IDYwMDsKKwkJZmJfdm1vZGUucmVmcmVzaCA9IDYwOworCQlkZWZhdWx0X3Ztb2RlID0gZmJfZmluZF9uZWFyZXN0X21vZGUoJmZiX3Ztb2RlLAorCQkJCQkJICAgICAmaW5mby0+bW9kZWxpc3QpOworCX0KKworCS8qIElmIHdlIGhhdmUgZ29vZCBtb2RlIGFuZCBubyBhY3RpdmUgY2xpZW50cyAqLworCWlmICgoZGVmYXVsdF92bW9kZSAhPSBOVUxMKSAmJiAoZGV2LT5mYl9jb3VudCA9PSAwKSkgeworCisJCWZiX3ZpZGVvbW9kZV90b192YXIoJmluZm8tPnZhciwgZGVmYXVsdF92bW9kZSk7CisJCXVmeF92YXJfY29sb3JfZm9ybWF0KCZpbmZvLT52YXIpOworCisJCS8qIHdpdGggbW9kZSBzaXplIGluZm8sIHdlIGNhbiBub3cgYWxsb2Mgb3VyIGZyYW1lYnVmZmVyICovCisJCW1lbWNweSgmaW5mby0+Zml4LCAmdWZ4X2ZpeCwgc2l6ZW9mKHVmeF9maXgpKTsKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXMgKgorCQkJKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOworCisJCXJlc3VsdCA9IHVmeF9yZWFsbG9jX2ZyYW1lYnVmZmVyKGRldiwgaW5mbyk7CisKKwl9IGVsc2UKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKworZXJyb3I6CisJaWYgKGVkaWQgJiYgKGRldi0+ZWRpZCAhPSBlZGlkKSkKKwkJa2ZyZWUoZWRpZCk7CisKKwlpZiAoaW5mby0+ZGV2KQorCQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB1ZnhfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwlzdHJ1Y3QgdWZ4X2RhdGEgKmRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IDA7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJdTMyIGlkX3JldiwgZnBnYV9yZXY7CisKKwkvKiB1c2IgaW5pdGlhbGl6YXRpb24gKi8KKwl1c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJQlVHX09OKCF1c2JkZXYpOworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwgInVmeF91c2JfcHJvYmU6IGZhaWxlZCBhbGxvYyBvZiBkZXYgc3RydWN0XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHdhaXQgZm9yIGJvdGggdXNiIGFuZCBmYmRldiB0byBzcGluIGRvd24gb24gZGlzY29ubmVjdCAqLworCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsgLyogbWF0Y2hpbmcga3JlZl9wdXQgaW4gdXNiIC5kaXNjb25uZWN0IGZuICovCisJa3JlZl9nZXQoJmRldi0+a3JlZik7IC8qIG1hdGNoaW5nIGtyZWZfcHV0IGluIGZyZWVfZnJhbWVidWZmZXJfd29yayAqLworCisJZGV2LT51ZGV2ID0gdXNiZGV2OworCWRldi0+Z2RldiA9ICZ1c2JkZXYtPmRldjsgLyogb3VyIGdlbmVyaWMgc3RydWN0IGRldmljZSAqICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgIiVzICVzIC0gc2VyaWFsICMlc1xuIiwKKwkJdXNiZGV2LT5tYW51ZmFjdHVyZXIsIHVzYmRldi0+cHJvZHVjdCwgdXNiZGV2LT5zZXJpYWwpOworCWRldl9kYmcoZGV2LT5nZGV2LCAidmlkXyUwNHgmcGlkXyUwNHgmcmV2XyUwNHggZHJpdmVyJ3MgdWZ4X2RhdGEgc3RydWN0IGF0ICVwXG4iLAorCQl1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QsCisJCXVzYmRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UsIGRldik7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJjb25zb2xlIGVuYWJsZT0lZFxuIiwgY29uc29sZSk7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJmYl9kZWZpbyBlbmFibGU9JWRcbiIsIGZiX2RlZmlvKTsKKworCWlmICghdWZ4X2FsbG9jX3VyYl9saXN0KGRldiwgV1JJVEVTX0lOX0ZMSUdIVCwgTUFYX1RSQU5TRkVSKSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlkZXZfZXJyKGRldi0+Z2RldiwgInVmeF9hbGxvY191cmJfbGlzdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFdlIGRvbid0IHJlZ2lzdGVyIGEgbmV3IFVTQiBjbGFzcy4gT3VyIGNsaWVudCBpbnRlcmZhY2UgaXMgZmJkZXYgKi8KKworCS8qIGFsbG9jYXRlcyBmcmFtZWJ1ZmZlciBkcml2ZXIgc3RydWN0dXJlLCBub3QgZnJhbWVidWZmZXIgbWVtb3J5ICovCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZ1c2JkZXYtPmRldik7CisJaWYgKCFpbmZvKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWRldl9lcnIoZGV2LT5nZGV2LCAiZnJhbWVidWZmZXJfYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmluZm8gPSBpbmZvOworCWluZm8tPnBhciA9IGRldjsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGRldi0+cHNldWRvX3BhbGV0dGU7CisJaW5mby0+ZmJvcHMgPSAmdWZ4X29wczsKKworCXJldHZhbCA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2VycihkZXYtPmdkZXYsICJmYl9hbGxvY19jbWFwIGZhaWxlZCAleFxuIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlJTklUX0RFTEFZRURfV09SSygmZGV2LT5mcmVlX2ZyYW1lYnVmZmVyX3dvcmssCisJCQkgIHVmeF9mcmVlX2ZyYW1lYnVmZmVyX3dvcmspOworCisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPm1vZGVsaXN0KTsKKworCXJldHZhbCA9IHVmeF9yZWdfcmVhZChkZXYsIDB4MzAwMCwgJmlkX3Jldik7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIHJlYWRpbmcgMHgzMDAwIHJlZ2lzdGVyIGZyb20gZGV2aWNlIiwgcmV0dmFsKTsKKwlkZXZfZGJnKGRldi0+Z2RldiwgIklEX1JFViByZWdpc3RlciB2YWx1ZSAweCUwOHgiLCBpZF9yZXYpOworCisJcmV0dmFsID0gdWZ4X3JlZ19yZWFkKGRldiwgMHgzMDA0LCAmZnBnYV9yZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCByZWFkaW5nIDB4MzAwNCByZWdpc3RlciBmcm9tIGRldmljZSIsIHJldHZhbCk7CisJZGV2X2RiZyhkZXYtPmdkZXYsICJGUEdBX1JFViByZWdpc3RlciB2YWx1ZSAweCUwOHgiLCBmcGdhX3Jldik7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgInJlc2V0dGluZyBkZXZpY2UiKTsKKwlyZXR2YWwgPSB1ZnhfbGl0ZV9yZXNldChkZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCByZXNldHRpbmcgZGV2aWNlIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAiY29uZmlndXJpbmcgc3lzdGVtIGNsb2NrIik7CisJcmV0dmFsID0gdWZ4X2NvbmZpZ19zeXNfY2xrKGRldik7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIGNvbmZpZ3VyaW5nIHN5c3RlbSBjbG9jayIsIHJldHZhbCk7CisKKwlkZXZfZGJnKGRldi0+Z2RldiwgImNvbmZpZ3VyaW5nIEREUjIgY29udHJvbGxlciIpOworCXJldHZhbCA9IHVmeF9jb25maWdfZGRyMihkZXYpOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJlcnJvciAlZCBpbml0aWFsaXNpbmcgRERSMiBjb250cm9sbGVyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAiY29uZmlndXJpbmcgSTJDIGNvbnRyb2xsZXIiKTsKKwlyZXR2YWwgPSB1ZnhfaTJjX2luaXQoZGV2KTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgaW5pdGlhbGlzaW5nIEkyQyBjb250cm9sbGVyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAic2VsZWN0aW5nIGRpc3BsYXkgbW9kZSIpOworCXJldHZhbCA9IHVmeF9zZXR1cF9tb2RlcyhkZXYsIGluZm8sIE5VTEwsIDApOworCWNoZWNrX3dhcm5fZ290b19lcnJvcihyZXR2YWwsICJ1bmFibGUgdG8gZmluZCBjb21tb24gbW9kZSBmb3IgZGlzcGxheSBhbmQgYWRhcHRlciIpOworCisJcmV0dmFsID0gdWZ4X3JlZ19zZXRfYml0cyhkZXYsIDB4NDAwMCwgMHgwMDAwMDAwMSk7CisJY2hlY2tfd2Fybl9nb3RvX2Vycm9yKHJldHZhbCwgImVycm9yICVkIGVuYWJsaW5nIGdyYXBoaWNzIGVuZ2luZSIsIHJldHZhbCk7CisKKwkvKiByZWFkeSB0byBiZWdpbiB1c2luZyBkZXZpY2UgKi8KKwlhdG9taWNfc2V0KCZkZXYtPnVzYl9hY3RpdmUsIDEpOworCisJZGV2X2RiZyhkZXYtPmdkZXYsICJjaGVja2luZyB2YXIiKTsKKwlyZXR2YWwgPSB1Znhfb3BzX2NoZWNrX3ZhcigmaW5mby0+dmFyLCBpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgdWZ4X29wc19jaGVja192YXIiLCByZXR2YWwpOworCisJZGV2X2RiZyhkZXYtPmdkZXYsICJzZXR0aW5nIHBhciIpOworCXJldHZhbCA9IHVmeF9vcHNfc2V0X3BhcihpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgdWZ4X29wc19zZXRfcGFyIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LT5nZGV2LCAicmVnaXN0ZXJpbmcgZnJhbWVidWZmZXIiKTsKKwlyZXR2YWwgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwljaGVja193YXJuX2dvdG9fZXJyb3IocmV0dmFsLCAiZXJyb3IgJWQgcmVnaXN0ZXJfZnJhbWVidWZmZXIiLCByZXR2YWwpOworCisJZGV2X2luZm8oZGV2LT5nZGV2LCAiU01TQyBVRFggVVNCIGRldmljZSAvZGV2L2ZiJWQgYXR0YWNoZWQuICVkeCVkIHJlc29sdXRpb24uIgorCQkiIFVzaW5nICVkSyBmcmFtZWJ1ZmZlciBtZW1vcnlcbiIsIGluZm8tPm5vZGUsCisJCWluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywgaW5mby0+Zml4LnNtZW1fbGVuID4+IDEwKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoZGV2KSB7CisJCWlmIChpbmZvKSB7CisJCQlpZiAoaW5mby0+Y21hcC5sZW4gIT0gMCkKKwkJCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCQkJaWYgKGluZm8tPm1vbnNwZWNzLm1vZGVkYikKKwkJCQlmYl9kZXN0cm95X21vZGVkYihpbmZvLT5tb25zcGVjcy5tb2RlZGIpOworCQkJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQorCQkJCXZmcmVlKGluZm8tPnNjcmVlbl9iYXNlKTsKKworCQkJZmJfZGVzdHJveV9tb2RlbGlzdCgmaW5mby0+bW9kZWxpc3QpOworCisJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCQl9CisKKwkJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOyAvKiByZWYgZm9yIGZyYW1lYnVmZmVyICovCisJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHVmeF9mcmVlKTsgLyogbGFzdCByZWYgZnJvbSBrcmVmX2luaXQgKi8KKworCQkvKiBkZXYgaGFzIGJlZW4gZGVhbGxvY2F0ZWQuIERvIG5vdCBkZXJlZmVyZW5jZSAqLworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHVmeF91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCB1ZnhfZGF0YSAqZGV2OworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWluZm8gPSBkZXYtPmluZm87CisKKwlwcl9kZWJ1ZygiVVNCIGRpc2Nvbm5lY3Qgc3RhcnRpbmdcbiIpOworCisJLyogd2UgdmlydHVhbGl6ZSB1bnRpbCBhbGwgZmIgY2xpZW50cyByZWxlYXNlLiBUaGVuIHdlIGZyZWUgKi8KKwlkZXYtPnZpcnR1YWxpemVkID0gdHJ1ZTsKKworCS8qIFdoZW4gbm9uLWFjdGl2ZSB3ZSdsbCB1cGRhdGUgdmlydHVhbCBmcmFtZWJ1ZmZlciwgYnV0IG5vIG5ldyB1cmJzICovCisJYXRvbWljX3NldCgmZGV2LT51c2JfYWN0aXZlLCAwKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCS8qIGlmIGNsaWVudHMgc3RpbGwgaGF2ZSB1cyBvcGVuLCB3aWxsIGJlIGZyZWVkIG9uIGxhc3QgY2xvc2UgKi8KKwlpZiAoZGV2LT5mYl9jb3VudCA9PSAwKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+ZnJlZV9mcmFtZWJ1ZmZlcl93b3JrLCAwKTsKKworCS8qIHJlbGVhc2UgcmVmZXJlbmNlIHRha2VuIGJ5IGtyZWZfaW5pdCBpbiBwcm9iZSgpICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgdWZ4X2ZyZWUpOworCisJLyogY29uc2lkZXIgdWZ4X2RhdGEgZnJlZWQgKi8KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVmeF9kcml2ZXIgPSB7CisJLm5hbWUgPSAic21zY3VmeCIsCisJLnByb2JlID0gdWZ4X3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVmeF91c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBpZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVmeF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlyZXMgPSB1c2JfcmVnaXN0ZXIoJnVmeF9kcml2ZXIpOworCWlmIChyZXMpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmVzKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1ZnhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmdWZ4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVmeF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCh1ZnhfbW9kdWxlX2V4aXQpOworCitzdGF0aWMgdm9pZCB1ZnhfdXJiX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1cmJfbm9kZSAqdW5vZGUgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVmeF9kYXRhICpkZXYgPSB1bm9kZS0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cykgeworCQlpZiAoISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKKwkJCXByX2VycigiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJYXRvbWljX3NldCgmZGV2LT5sb3N0X3BpeGVscywgMSk7CisJCX0KKwl9CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBkZXYtPnVyYnMuc2l6ZTsgLyogcmVzZXQgdG8gYWN0dWFsICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT51cmJzLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZ1bm9kZS0+ZW50cnksICZkZXYtPnVyYnMubGlzdCk7CisJZGV2LT51cmJzLmF2YWlsYWJsZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dXJicy5sb2NrLCBmbGFncyk7CisKKwkvKiBXaGVuIHVzaW5nIGZiX2RlZmlvLCB3ZSBkZWFkbG9jayBpZiB1cCgpIGlzIGNhbGxlZAorCSAqIHdoaWxlIGFub3RoZXIgaXMgd2FpdGluZy4gU28gcXVldWUgdG8gYW5vdGhlciBwcm9jZXNzICovCisJaWYgKGZiX2RlZmlvKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnVub2RlLT5yZWxlYXNlX3VyYl93b3JrLCAwKTsKKwllbHNlCisJCXVwKCZkZXYtPnVyYnMubGltaXRfc2VtKTsKK30KKworc3RhdGljIHZvaWQgdWZ4X2ZyZWVfdXJiX2xpc3Qoc3RydWN0IHVmeF9kYXRhICpkZXYpCit7CisJaW50IGNvdW50ID0gZGV2LT51cmJzLmNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CisJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIldhaXRpbmcgZm9yIGNvbXBsZXRlcyBhbmQgZnJlZWluZyBhbGwgcmVuZGVyIHVyYnNcbiIpOworCisJLyoga2VlcCB3YWl0aW5nIGFuZCBmcmVlaW5nLCB1bnRpbCB3ZSd2ZSBnb3QgJ2VtIGFsbCAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCS8qIEdldHRpbmcgaW50ZXJydXB0ZWQgbWVhbnMgYSBsZWFrLCBidXQgb2sgYXQgc2h1dGRvd24qLworCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmRldi0+dXJicy5saW1pdF9zZW0pOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dXJicy5sb2NrLCBmbGFncyk7CisKKwkJbm9kZSA9IGRldi0+dXJicy5saXN0Lm5leHQ7IC8qIGhhdmUgcmVzZXJ2ZWQgb25lIHdpdGggc2VtICovCisJCWxpc3RfZGVsX2luaXQobm9kZSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT51cmJzLmxvY2ssIGZsYWdzKTsKKworCQl1bm9kZSA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHVyYl9ub2RlLCBlbnRyeSk7CisJCXVyYiA9IHVub2RlLT51cmI7CisKKwkJLyogRnJlZSBlYWNoIHNlcGFyYXRlbHkgYWxsb2NhdGVkIHBpZWNlICovCisJCXVzYl9mcmVlX2NvaGVyZW50KHVyYi0+ZGV2LCBkZXYtPnVyYnMuc2l6ZSwKKwkJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdWZ4X2FsbG9jX3VyYl9saXN0KHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBpbnQgY291bnQsIHNpemVfdCBzaXplKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IHVyYl9ub2RlICp1bm9kZTsKKwljaGFyICpidWY7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT51cmJzLmxvY2spOworCisJZGV2LT51cmJzLnNpemUgPSBzaXplOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnVyYnMubGlzdCk7CisKKwl3aGlsZSAoaSA8IGNvdW50KSB7CisJCXVub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYl9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdW5vZGUpCisJCQlicmVhazsKKwkJdW5vZGUtPmRldiA9IGRldjsKKworCQlJTklUX0RFTEFZRURfV09SSygmdW5vZGUtPnJlbGVhc2VfdXJiX3dvcmssCisJCQkgIHVmeF9yZWxlYXNlX3VyYl93b3JrKTsKKworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJa2ZyZWUodW5vZGUpOworCQkJYnJlYWs7CisJCX0KKwkJdW5vZGUtPnVyYiA9IHVyYjsKKworCQlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBzaXplLCBHRlBfS0VSTkVMLAorCQkJCQkgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCFidWYpIHsKKwkJCWtmcmVlKHVub2RlKTsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggc2V0IHRvIGFjdHVhbCBiZWZvcmUgc3VibWl0ICovCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgZGV2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LCAxKSwKKwkJCWJ1Ziwgc2l6ZSwgdWZ4X3VyYl9jb21wbGV0aW9uLCB1bm9kZSk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkJbGlzdF9hZGRfdGFpbCgmdW5vZGUtPmVudHJ5LCAmZGV2LT51cmJzLmxpc3QpOworCisJCWkrKzsKKwl9CisKKwlzZW1hX2luaXQoJmRldi0+dXJicy5saW1pdF9zZW0sIGkpOworCWRldi0+dXJicy5jb3VudCA9IGk7CisJZGV2LT51cmJzLmF2YWlsYWJsZSA9IGk7CisKKwlwcl9kZWJ1ZygiYWxsb2NhdGVkICVkICVkIGJ5dGUgdXJic1xuIiwgaSwgKGludCkgc2l6ZSk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHN0cnVjdCB1cmIgKnVmeF9nZXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCB1cmJfbm9kZSAqdW5vZGU7CisJc3RydWN0IHVyYiAqdXJiID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2FpdCBmb3IgYW4gaW4tZmxpZ2h0IGJ1ZmZlciB0byBjb21wbGV0ZSBhbmQgZ2V0IHJlLXF1ZXVlZCAqLworCXJldCA9IGRvd25fdGltZW91dCgmZGV2LT51cmJzLmxpbWl0X3NlbSwgR0VUX1VSQl9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWF0b21pY19zZXQoJmRldi0+bG9zdF9waXhlbHMsIDEpOworCQlwcl93YXJuKCJ3YWl0IGZvciB1cmIgaW50ZXJydXB0ZWQ6ICV4IGF2YWlsYWJsZTogJWRcbiIsCisJCSAgICAgICByZXQsIGRldi0+dXJicy5hdmFpbGFibGUpOworCQlnb3RvIGVycm9yOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnVyYnMubG9jaywgZmxhZ3MpOworCisJQlVHX09OKGxpc3RfZW1wdHkoJmRldi0+dXJicy5saXN0KSk7IC8qIHJlc2VydmVkIG9uZSB3aXRoIGxpbWl0X3NlbSAqLworCWVudHJ5ID0gZGV2LT51cmJzLmxpc3QubmV4dDsKKwlsaXN0X2RlbF9pbml0KGVudHJ5KTsKKwlkZXYtPnVyYnMuYXZhaWxhYmxlLS07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnVyYnMubG9jaywgZmxhZ3MpOworCisJdW5vZGUgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgdXJiX25vZGUsIGVudHJ5KTsKKwl1cmIgPSB1bm9kZS0+dXJiOworCitlcnJvcjoKKwlyZXR1cm4gdXJiOworfQorCitzdGF0aWMgaW50IHVmeF9zdWJtaXRfdXJiKHN0cnVjdCB1ZnhfZGF0YSAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIsIHNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKworCUJVR19PTihsZW4gPiBkZXYtPnVyYnMuc2l6ZSk7CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47IC8qIHNldCB0byBhY3R1YWwgcGF5bG9hZCBsZW4gKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXQpIHsKKwkJdWZ4X3VyYl9jb21wbGV0aW9uKHVyYik7IC8qIGJlY2F1c2Ugbm8gb25lIGVsc2Ugd2lsbCAqLworCQlhdG9taWNfc2V0KCZkZXYtPmxvc3RfcGl4ZWxzLCAxKTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAleFxuIiwgcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX3BhcmFtKGNvbnNvbGUsIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gYmUgdXNlZCBvbiB0aGlzIGRpc3BsYXkiKTsKKworbW9kdWxlX3BhcmFtKGZiX2RlZmlvLCBib29sLCBTX0lXVVNSIHwgU19JUlVTUiB8IFNfSVdHUlAgfCBTX0lSR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MoZmJfZGVmaW8sICJFbmFibGUgZmJfZGVmaW8gbW1hcCBzdXBwb3J0Iik7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIEdsZW5kaW5uaW5nIDxzdGV2ZS5nbGVuZGlubmluZ0BzbXNjLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01TQyBVRlgga2VybmVsIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90bWlvZmIuYyBiL2RyaXZlcnMvdmlkZW8vdG1pb2ZiLmMKaW5kZXggY2QxYzRkY2UuLjhlNGE0NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdG1pb2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby90bWlvZmIuYwpAQCAtNzQ0LDcgKzc0NCw3IEBACiAJCWdvdG8gZXJyX2lvcmVtYXBfdnJhbTsKIAl9CiAKLQlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsICZ0bWlvZmJfaXJxLCBJUlFGX0RJU0FCTEVELAorCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJnRtaW9mYl9pcnEsIDAsCiAJCQkJCWRldl9uYW1lKCZkZXYtPmRldiksIGluZm8pOwogCiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IGM2Yzc3NTYuLjM0Y2YwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKKysrIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwpAQCAtOTg3LDggKzk4Nyw4IEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCWRlYnVnKCJlbnRlclxuIik7Ci0Jb2Zmc2V0ID0gKHZhci0+eG9mZnNldCArICh2YXItPnlvZmZzZXQgKiB2YXItPnhyZXNfdmlydHVhbCkpCi0JCSogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDMyOworCW9mZnNldCA9ICh2YXItPnhvZmZzZXQgKyAodmFyLT55b2Zmc2V0ICogaW5mby0+dmFyLnhyZXNfdmlydHVhbCkpCisJCSogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIC8gMzI7CiAJc2V0X3NjcmVlbl9zdGFydChwYXIsIG9mZnNldCk7CiAJZGVidWcoImV4aXRcbiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91ZGxmYi5jIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCmluZGV4IDA4N2ZjOTkuLjM0NzNlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKQEAgLTQ4LDIwICs0OCwzMCBAQAogCQlGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8IEZCSU5GT19NSVNDX0FMV0FZU19TRVRQQVI7CiAKIC8qCi0gKiBUaGVyZSBhcmUgbWFueSBEaXNwbGF5TGluay1iYXNlZCBwcm9kdWN0cywgYWxsIHdpdGggdW5pcXVlIFBJRHMuIFdlIGFyZSBhYmxlCi0gKiB0byBzdXBwb3J0IGFsbCB2b2x1bWUgb25lcyAoY2lyY2EgMjAwOSkgd2l0aCBhIHNpbmdsZSBkcml2ZXIsIHNvIHdlIG1hdGNoCi0gKiBnbG9iYWxseSBvbiBWSUQuIFRPRE86IFByb2JlKCkgbmVlZHMgdG8gZGV0ZWN0IHdoZW4gd2UgbWlnaHQgYmUgcnVubmluZwotICogImZ1dHVyZSIgY2hpcHMsIGFuZCBiYWlsIG9uIHRob3NlLCBzbyBhIGNvbXBhdGlibGUgZHJpdmVyIGNhbiBtYXRjaC4KKyAqIFRoZXJlIGFyZSBtYW55IERpc3BsYXlMaW5rLWJhc2VkIGdyYXBoaWNzIHByb2R1Y3RzLCBhbGwgd2l0aCB1bmlxdWUgUElEcy4KKyAqIFNvIHdlIG1hdGNoIG9uIERpc3BsYXlMaW5rJ3MgVklEICsgVmVuZG9yLURlZmluZWQgSW50ZXJmYWNlIENsYXNzICgweGZmKQorICogV2UgYWxzbyByZXF1aXJlIGEgbWF0Y2ggb24gU3ViQ2xhc3MgKDB4MDApIGFuZCBQcm90b2NvbCAoMHgwMCksCisgKiB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIGtub3duIFVTQiAyLjAgZXJhIGdyYXBoaWNzIGNoaXBzIGFuZCBmaXJtd2FyZSwKKyAqIGJ1dCBhbGxvd3MgRGlzcGxheUxpbmsgdG8gaW5jcmVtZW50IHRob3NlIGZvciBhbnkgZnV0dXJlIGluY29tcGF0aWJsZSBjaGlwcwogICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKLQl7LmlkVmVuZG9yID0gMHgxN2U5LCAubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX1ZFTkRPUix9LAorCXsuaWRWZW5kb3IgPSAweDE3ZTksCisJIC5iSW50ZXJmYWNlQ2xhc3MgPSAweGZmLAorCSAuYkludGVyZmFjZVN1YkNsYXNzID0gMHgwMCwKKwkgLmJJbnRlcmZhY2VQcm90b2NvbCA9IDB4MDAsCisJIC5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfVkVORE9SIHwKKwkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfAorCQlVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUyB8CisJCVVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1BST1RPQ09MLAorCX0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAogLyogbW9kdWxlIG9wdGlvbnMgKi8KLXN0YXRpYyBpbnQgY29uc29sZTsgICAvKiBPcHRpb25hbGx5IGFsbG93IGZiY29uIHRvIGNvbnN1bWUgZmlyc3QgZnJhbWVidWZmZXIgKi8KLXN0YXRpYyBpbnQgZmJfZGVmaW87ICAvKiBPcHRpb25hbGx5IGVuYWJsZSBleHBlcmltZW50YWwgZmJfZGVmaW8gbW1hcCBzdXBwb3J0ICovCitzdGF0aWMgaW50IGNvbnNvbGUgPSAxOyAvKiBBbGxvdyBmYmNvbiB0byBvcGVuIGZyYW1lYnVmZmVyICovCitzdGF0aWMgaW50IGZiX2RlZmlvID0gMTsgIC8qIERldGVjdCBtbWFwIHdyaXRlcyB1c2luZyBwYWdlIGZhdWx0cyAqLworc3RhdGljIGludCBzaGFkb3cgPSAxOyAvKiBPcHRpb25hbGx5IGRpc2FibGUgc2hhZG93IGZyYW1lYnVmZmVyICovCiAKIC8qIGRsZmIga2VlcHMgYSBsaXN0IG9mIHVyYnMgZm9yIGVmZmljaWVudCBidWxrIHRyYW5zZmVycyAqLwogc3RhdGljIHZvaWQgZGxmYl91cmJfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpOwpAQCAtOTQsMTcgKzEwNCwzOSBAQAogfQogCiAvKgotICogT24vT2ZmIGZvciBkcml2aW5nIHRoZSBEaXNwbGF5TGluayBmcmFtZWJ1ZmZlciB0byB0aGUgZGlzcGxheQotICogIDB4MDAgSCBhbmQgViBzeW5jIG9uCi0gKiAgMHgwMSBIIGFuZCBWIHN5bmMgb2ZmIChzY3JlZW4gYmxhbmsgYnV0IHBvd2VyZWQpCi0gKiAgMHgwNyBEUE1TIHBvd2VyZG93biAocmVxdWlyZXMgbW9kZXNldCB0byBjb21lIGJhY2spCisgKiBNYXAgRkJfQkxBTktfKiB0byBEaXNwbGF5TGluayByZWdpc3RlcgorICogRExSZWcgRkJfQkxBTktfKgorICogLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAweDAwIEZCX0JMQU5LX1VOQkxBTksgKDApCisgKiAgMHgwMSBGQl9CTEFOSyAoMSkKKyAqICAweDAzIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQgKDIpCisgKiAgMHgwNSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EICgzKQorICogIDB4MDcgRkJfQkxBTktfUE9XRVJET1dOICg0KSBOb3RlOiByZXF1aXJlcyBtb2Rlc2V0IHRvIGNvbWUgYmFjawogICovCi1zdGF0aWMgY2hhciAqZGxmYl9lbmFibGVfaHZzeW5jKGNoYXIgKmJ1ZiwgYm9vbCBlbmFibGUpCitzdGF0aWMgY2hhciAqZGxmYl9ibGFua2luZyhjaGFyICpidWYsIGludCBmYl9ibGFuaykKIHsKLQlpZiAoZW5hYmxlKQotCQlyZXR1cm4gZGxmYl9zZXRfcmVnaXN0ZXIoYnVmLCAweDFGLCAweDAwKTsKLQllbHNlCi0JCXJldHVybiBkbGZiX3NldF9yZWdpc3RlcihidWYsIDB4MUYsIDB4MDcpOworCXU4IHJlZzsKKworCXN3aXRjaCAoZmJfYmxhbmspIHsKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKKwkJcmVnID0gMHgwNzsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQlyZWcgPSAweDA1OworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJCXJlZyA9IDB4MDM7CisJCWJyZWFrOworCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQlyZWcgPSAweDAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWcgPSAweDAwOworCX0KKworCWJ1ZiA9IGRsZmJfc2V0X3JlZ2lzdGVyKGJ1ZiwgMHgxRiwgcmVnKTsKKworCXJldHVybiBidWY7CiB9CiAKIHN0YXRpYyBjaGFyICpkbGZiX3NldF9jb2xvcl9kZXB0aChjaGFyICpidWYsIHU4IHNlbGVjdGlvbikKQEAgLTI3MiwxMyArMzA0LDE1IEBACiAJd3JwdHIgPSBkbGZiX3NldF9iYXNlOGJwcCh3cnB0ciwgZGV2LT5pbmZvLT5maXguc21lbV9sZW4pOwogCiAJd3JwdHIgPSBkbGZiX3NldF92aWRfY21kcyh3cnB0ciwgdmFyKTsKLQl3cnB0ciA9IGRsZmJfZW5hYmxlX2h2c3luYyh3cnB0ciwgdHJ1ZSk7CisJd3JwdHIgPSBkbGZiX2JsYW5raW5nKHdycHRyLCBGQl9CTEFOS19VTkJMQU5LKTsKIAl3cnB0ciA9IGRsZmJfdmlkcmVnX3VubG9jayh3cnB0cik7CiAKIAl3cml0ZXNpemUgPSB3cnB0ciAtIGJ1ZjsKIAogCXJldHZhbCA9IGRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgd3JpdGVzaXplKTsKIAorCWRldi0+YmxhbmtfbW9kZSA9IEZCX0JMQU5LX1VOQkxBTks7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC03NTIsMTQgKzc4NiwxMyBAQAogewogCiAJc3RydWN0IGRsZmJfZGF0YSAqZGV2ID0gaW5mby0+cGFyOwotCXN0cnVjdCBkbG9hcmVhICphcmVhID0gTlVMTDsKIAogCWlmICghYXRvbWljX3JlYWQoJmRldi0+dXNiX2FjdGl2ZSkpCiAJCXJldHVybiAwOwogCiAJLyogVE9ETzogVXBkYXRlIFggc2VydmVyIHRvIGdldCB0aGlzIGZyb20gc3lzZnMgaW5zdGVhZCAqLwogCWlmIChjbWQgPT0gRExGQl9JT0NUTF9SRVRVUk5fRURJRCkgewotCQljaGFyICplZGlkID0gKGNoYXIgKilhcmc7CisJCXZvaWQgX191c2VyICplZGlkID0gKHZvaWQgX191c2VyICopYXJnOwogCQlpZiAoY29weV90b191c2VyKGVkaWQsIGRldi0+ZWRpZCwgZGV2LT5lZGlkX3NpemUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwpAQCAtNzY3LDYgKzgwMCwxMSBAQAogCiAJLyogVE9ETzogSGVscCBwcm9wb3NlIGEgc3RhbmRhcmQgZmIuaCBpb2N0bCB0byByZXBvcnQgbW1hcCBkYW1hZ2UgKi8KIAlpZiAoY21kID09IERMRkJfSU9DVExfUkVQT1JUX0RBTUFHRSkgeworCQlzdHJ1Y3QgZGxvYXJlYSBhcmVhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXJlYSwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbG9hcmVhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkvKgogCQkgKiBJZiB3ZSBoYXZlIGEgZGFtYWdlLWF3YXJlIGNsaWVudCwgdHVybiBmYl9kZWZpbyAib2ZmIgpAQCAtNzc4LDIxICs4MTYsMTkgQEAKIAkJaWYgKGluZm8tPmZiZGVmaW8pCiAJCQlpbmZvLT5mYmRlZmlvLT5kZWxheSA9IERMX0RFRklPX1dSSVRFX0RJU0FCTEU7CiAKLQkJYXJlYSA9IChzdHJ1Y3QgZGxvYXJlYSAqKWFyZzsKKwkJaWYgKGFyZWEueCA8IDApCisJCQlhcmVhLnggPSAwOwogCi0JCWlmIChhcmVhLT54IDwgMCkKLQkJCWFyZWEtPnggPSAwOworCQlpZiAoYXJlYS54ID4gaW5mby0+dmFyLnhyZXMpCisJCQlhcmVhLnggPSBpbmZvLT52YXIueHJlczsKIAotCQlpZiAoYXJlYS0+eCA+IGluZm8tPnZhci54cmVzKQotCQkJYXJlYS0+eCA9IGluZm8tPnZhci54cmVzOworCQlpZiAoYXJlYS55IDwgMCkKKwkJCWFyZWEueSA9IDA7CiAKLQkJaWYgKGFyZWEtPnkgPCAwKQotCQkJYXJlYS0+eSA9IDA7CisJCWlmIChhcmVhLnkgPiBpbmZvLT52YXIueXJlcykKKwkJCWFyZWEueSA9IGluZm8tPnZhci55cmVzOwogCi0JCWlmIChhcmVhLT55ID4gaW5mby0+dmFyLnlyZXMpCi0JCQlhcmVhLT55ID0gaW5mby0+dmFyLnlyZXM7Ci0KLQkJZGxmYl9oYW5kbGVfZGFtYWdlKGRldiwgYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCwKKwkJZGxmYl9oYW5kbGVfZGFtYWdlKGRldiwgYXJlYS54LCBhcmVhLnksIGFyZWEudywgYXJlYS5oLAogCQkJICAgaW5mby0+c2NyZWVuX2Jhc2UpOwogCX0KIApAQCAtODQwLDcgKzg3Niw3IEBACiAJICogcHJldmVudGluZyBvdGhlciBjbGllbnRzIChYKSBmcm9tIHdvcmtpbmcgcHJvcGVybHkuIFVzdWFsbHkKIAkgKiBub3Qgd2hhdCB0aGUgdXNlciB3YW50cy4gRmFpbCBieSBkZWZhdWx0IHdpdGggb3B0aW9uIHRvIGVuYWJsZS4KIAkgKi8KLQlpZiAoKHVzZXIgPT0gMCkgJiAoIWNvbnNvbGUpKQorCWlmICgodXNlciA9PSAwKSAmJiAoIWNvbnNvbGUpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJLyogSWYgdGhlIFVTQiBkZXZpY2UgaXMgZ29uZSwgd2UgZG9uJ3QgYWNjZXB0IG5ldyBvcGVucyAqLwpAQCAtMTAzOSwzMiArMTA3NSw1NyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qIFRvIGZvbnppIHRoZSBqdWtlYm94IChlLmcuIG1ha2UgYmxhbmtpbmcgY2hhbmdlcyB0YWtlIGVmZmVjdCkgKi8KK3N0YXRpYyBjaGFyICpkbGZiX2R1bW15X3JlbmRlcihjaGFyICpidWYpCit7CisJKmJ1ZisrID0gMHhBRjsKKwkqYnVmKysgPSAweDZBOyAvKiBjb3B5ICovCisJKmJ1ZisrID0gMHgwMDsgLyogZnJvbSBhZGRyZXNzKi8KKwkqYnVmKysgPSAweDAwOworCSpidWYrKyA9IDB4MDA7CisJKmJ1ZisrID0gMHgwMTsgLyogb25lIHBpeGVsICovCisJKmJ1ZisrID0gMHgwMDsgLyogdG8gYWRkcmVzcyAqLworCSpidWYrKyA9IDB4MDA7CisJKmJ1ZisrID0gMHgwMDsKKwlyZXR1cm4gYnVmOworfQorCiAvKgogICogSW4gb3JkZXIgdG8gY29tZSBiYWNrIGZyb20gZnVsbCBEUE1TIG9mZiwgd2UgbmVlZCB0byBzZXQgdGhlIG1vZGUgYWdhaW4KICAqLwogc3RhdGljIGludCBkbGZiX29wc19ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGRsZmJfZGF0YSAqZGV2ID0gaW5mby0+cGFyOworCWNoYXIgKmJ1ZnB0cjsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAKLQlpZiAoYmxhbmtfbW9kZSAhPSBGQl9CTEFOS19VTkJMQU5LKSB7Ci0JCWNoYXIgKmJ1ZnB0cjsKLQkJc3RydWN0IHVyYiAqdXJiOworCXByX2luZm8oIi9kZXYvZmIlZCBGQl9CTEFOSyBtb2RlICVkIC0tPiAlZFxuIiwKKwkJaW5mby0+bm9kZSwgZGV2LT5ibGFua19tb2RlLCBibGFua19tb2RlKTsKIAotCQl1cmIgPSBkbGZiX2dldF91cmIoZGV2KTsKLQkJaWYgKCF1cmIpCi0JCQlyZXR1cm4gMDsKKwlpZiAoKGRldi0+YmxhbmtfbW9kZSA9PSBGQl9CTEFOS19QT1dFUkRPV04pICYmCisJICAgIChibGFua19tb2RlICE9IEZCX0JMQU5LX1BPV0VSRE9XTikpIHsKIAotCQlidWZwdHIgPSAoY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQkJYnVmcHRyID0gZGxmYl92aWRyZWdfbG9jayhidWZwdHIpOwotCQlidWZwdHIgPSBkbGZiX2VuYWJsZV9odnN5bmMoYnVmcHRyLCBmYWxzZSk7Ci0JCWJ1ZnB0ciA9IGRsZmJfdmlkcmVnX3VubG9jayhidWZwdHIpOwotCi0JCWRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgYnVmcHRyIC0KLQkJCQkoY2hhciAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JfSBlbHNlIHsKKwkJLyogcmV0dXJuaW5nIGZyb20gcG93ZXJkb3duIHJlcXVpcmVzIGEgZnJlc2ggbW9kZXNldCAqLwogCQlkbGZiX3NldF92aWRlb19tb2RlKGRldiwgJmluZm8tPnZhcik7CiAJfQogCisJdXJiID0gZGxmYl9nZXRfdXJiKGRldik7CisJaWYgKCF1cmIpCisJCXJldHVybiAwOworCisJYnVmcHRyID0gKGNoYXIgKikgdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJYnVmcHRyID0gZGxmYl92aWRyZWdfbG9jayhidWZwdHIpOworCWJ1ZnB0ciA9IGRsZmJfYmxhbmtpbmcoYnVmcHRyLCBibGFua19tb2RlKTsKKwlidWZwdHIgPSBkbGZiX3ZpZHJlZ191bmxvY2soYnVmcHRyKTsKKworCS8qIHNlZW1zIGxpa2UgYSByZW5kZXIgb3AgaXMgbmVlZGVkIHRvIGhhdmUgYmxhbmsgY2hhbmdlIHRha2UgZWZmZWN0ICovCisJYnVmcHRyID0gZGxmYl9kdW1teV9yZW5kZXIoYnVmcHRyKTsKKworCWRsZmJfc3VibWl0X3VyYihkZXYsIHVyYiwgYnVmcHRyIC0KKwkJCShjaGFyICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKworCWRldi0+YmxhbmtfbW9kZSA9IGJsYW5rX21vZGU7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5Nyw3ICsxMTU4LDcgQEAKIAlpbnQgbmV3X2xlbjsKIAl1bnNpZ25lZCBjaGFyICpvbGRfZmIgPSBpbmZvLT5zY3JlZW5fYmFzZTsKIAl1bnNpZ25lZCBjaGFyICpuZXdfZmI7Ci0JdW5zaWduZWQgY2hhciAqbmV3X2JhY2s7CisJdW5zaWduZWQgY2hhciAqbmV3X2JhY2sgPSAwOwogCiAJcHJfd2FybigiUmVhbGxvY2F0aW5nIGZyYW1lYnVmZmVyLiBBZGRyZXNzZXMgd2lsbCBjaGFuZ2UhXG4iKTsKIApAQCAtMTEyOSw3ICsxMTkwLDggQEAKIAkJICogQnV0IHdpdGggaW1wZXJmZWN0IGRhbWFnZSBpbmZvIHdlIG1heSBzZW5kIHBpeGVscyBvdmVyIFVTQgogCQkgKiB0aGF0IHdlcmUsIGluIGZhY3QsIHVuY2hhbmdlZCAtIHdhc3RpbmcgbGltaXRlZCBVU0IgYmFuZHdpZHRoCiAJCSAqLwotCQluZXdfYmFjayA9IHZ6YWxsb2MobmV3X2xlbik7CisJCWlmIChzaGFkb3cpCisJCQluZXdfYmFjayA9IHZ6YWxsb2MobmV3X2xlbik7CiAJCWlmICghbmV3X2JhY2spCiAJCQlwcl9pbmZvKCJObyBzaGFkb3cvYmFja2luZyBidWZmZXIgYWxsb2NhdGVkXG4iKTsKIAkJZWxzZSB7CkBAIC0xNDMwLDIxICsxNDkyLDMwIEBACiB9CiAKIHN0YXRpYyBpbnQgZGxmYl9wYXJzZV92ZW5kb3JfZGVzY3JpcHRvcihzdHJ1Y3QgZGxmYl9kYXRhICpkZXYsCi0JCQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYpCisJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJY2hhciAqZGVzYzsKIAljaGFyICpidWY7CiAJY2hhciAqZGVzY19lbmQ7CiAKLQl1OCB0b3RhbF9sZW4gPSAwOworCWludCB0b3RhbF9sZW4gPSAwOwogCiAJYnVmID0ga3phbGxvYyhNQVhfVkVORE9SX0RFU0NSSVBUT1JfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiBmYWxzZTsKIAlkZXNjID0gYnVmOwogCi0JdG90YWxfbGVuID0gdXNiX2dldF9kZXNjcmlwdG9yKHVzYmRldiwgMHg1ZiwgLyogdmVuZG9yIHNwZWNpZmljICovCi0JCQkJICAgIDAsIGRlc2MsIE1BWF9WRU5ET1JfREVTQ1JJUFRPUl9TSVpFKTsKKwl0b3RhbF9sZW4gPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJCQkweDVmLCAvKiB2ZW5kb3Igc3BlY2lmaWMgKi8KKwkJCQkJMCwgZGVzYywgTUFYX1ZFTkRPUl9ERVNDUklQVE9SX1NJWkUpOworCisJLyogaWYgbm90IGZvdW5kLCBsb29rIGluIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCWlmICh0b3RhbF9sZW4gPCAwKSB7CisJCWlmICgwID09IHVzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcihpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLAorCQkJMHg1ZiwgJmRlc2MpKQorCQkJdG90YWxfbGVuID0gKGludCkgZGVzY1swXTsKKwl9CisKIAlpZiAodG90YWxfbGVuID4gNSkgewogCQlwcl9pbmZvKCJ2ZW5kb3IgZGVzY3JpcHRvciBsZW5ndGg6JXggZGF0YTolMDJ4ICUwMnggJTAyeCAlMDJ4IiBcCiAJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKQEAgLTE0ODUsNiArMTU1Niw4IEBACiAJCQl9CiAJCQlkZXNjICs9IGxlbmd0aDsKIAkJfQorCX0gZWxzZSB7CisJCXByX2luZm8oInZlbmRvciBkZXNjcmlwdG9yIG5vdCBhdmFpbGFibGUgKCVkKVxuIiwgdG90YWxfbGVuKTsKIAl9CiAKIAlnb3RvIHN1Y2Nlc3M7CkBAIC0xNTMxLDEwICsxNjA0LDExIEBACiAJCXVzYmRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UsIGRldik7CiAJcHJfaW5mbygiY29uc29sZSBlbmFibGU9JWRcbiIsIGNvbnNvbGUpOwogCXByX2luZm8oImZiX2RlZmlvIGVuYWJsZT0lZFxuIiwgZmJfZGVmaW8pOworCXByX2luZm8oInNoYWRvdyBlbmFibGU9JWRcbiIsIHNoYWRvdyk7CiAKIAlkZXYtPnNrdV9waXhlbF9saW1pdCA9IDIwNDggKiAxMTUyOyAvKiBkZWZhdWx0IHRvIG1heGltdW0gKi8KIAotCWlmICghZGxmYl9wYXJzZV92ZW5kb3JfZGVzY3JpcHRvcihkZXYsIHVzYmRldikpIHsKKwlpZiAoIWRsZmJfcGFyc2VfdmVuZG9yX2Rlc2NyaXB0b3IoZGV2LCBpbnRlcmZhY2UpKSB7CiAJCXByX2VycigiZmlybXdhcmUgbm90IHJlY29nbml6ZWQuIEFzc3VtZSBpbmNvbXBhdGlibGUgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNTQ4LDcgKzE2MjIsNyBAQAogCS8qIFdlIGRvbid0IHJlZ2lzdGVyIGEgbmV3IFVTQiBjbGFzcy4gT3VyIGNsaWVudCBpbnRlcmZhY2UgaXMgZmJkZXYgKi8KIAogCS8qIGFsbG9jYXRlcyBmcmFtZWJ1ZmZlciBkcml2ZXIgc3RydWN0dXJlLCBub3QgZnJhbWVidWZmZXIgbWVtb3J5ICovCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZ1c2JkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDAsICZpbnRlcmZhY2UtPmRldik7CiAJaWYgKCFpbmZvKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCXByX2VycigiZnJhbWVidWZmZXJfYWxsb2MgZmFpbGVkXG4iKTsKQEAgLTE4ODMsMTAgKzE5NTcsMTMgQEAKIH0KIAogbW9kdWxlX3BhcmFtKGNvbnNvbGUsIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOwotTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gY29uc3VtZSBmaXJzdCBmcmFtZWJ1ZmZlciBmb3VuZCIpOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlLCAiQWxsb3cgZmJjb24gdG8gb3BlbiBmcmFtZWJ1ZmZlciIpOwogCiBtb2R1bGVfcGFyYW0oZmJfZGVmaW8sIGJvb2wsIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JV0dSUCB8IFNfSVJHUlApOwotTU9EVUxFX1BBUk1fREVTQyhmYl9kZWZpbywgIkVuYWJsZSBmYl9kZWZpbyBtbWFwIHN1cHBvcnQuICpFeHBlcmltZW50YWwqIik7CitNT0RVTEVfUEFSTV9ERVNDKGZiX2RlZmlvLCAiUGFnZSBmYXVsdCBkZXRlY3Rpb24gb2YgbW1hcCB3cml0ZXMiKTsKKworbW9kdWxlX3BhcmFtKHNoYWRvdywgYm9vbCwgU19JV1VTUiB8IFNfSVJVU1IgfCBTX0lXR1JQIHwgU19JUkdSUCk7CitNT0RVTEVfUEFSTV9ERVNDKHNoYWRvdywgIlNoYWRvdyB2aWQgbWVtLiBEaXNhYmxlIHRvIHNhdmUgbWVtIGJ1dCBsb3NlIHBlcmYiKTsKIAogTU9EVUxFX0FVVEhPUigiUm9iZXJ0byBEZSBJb3JpcyA8cm9iZXJ0b0B1bmJpdC5pdD4sICIKIAkgICAgICAiSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPiwgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwppbmRleCA2YjUyYmY2Li4zZjVhMDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZhbGt5cmllZmIuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAKIAogLyoKLSAqIFBhcnNlIHVzZXIgc3BlZmljaWVkIG9wdGlvbnMgKGB2aWRlbz12YWxreXJpZWZiOicpCisgKiBQYXJzZSB1c2VyIHNwZWNpZmllZCBvcHRpb25zIChgdmlkZW89dmFsa3lyaWVmYjonKQogICovCiBpbnQgX19pbml0IHZhbGt5cmllZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZmYi5jCmluZGV4IGJjNjcyNTEuLmJmMmY3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZmIuYwpAQCAtMzk1LDggKzM5NSw4IEBACiAJCSAgICB8fCB2YXItPnhvZmZzZXQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlpZiAodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAotCQkgICAgdmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKKwkJaWYgKHZhci0+eG9mZnNldCArIGluZm8tPnZhci54cmVzID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAorCQkgICAgdmFyLT55b2Zmc2V0ICsgaW5mby0+dmFyLnlyZXMgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwppbmRleCAzMDVjOTc1Li4wMjY3YWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJICogZ3JhbnVsYXJpdHkgaWYgc29tZW9uZSBzdXBwb3J0cyB4b2Zmc2V0IGluIGJpdCByZXNvbHV0aW9uICovCiAJdmdhX2lvX3IoVkdBX0lTMV9SQyk7CQkvKiByZXNldCBmbGlwLWZsb3AgKi8KIAl2Z2FfaW9fdyhWR0FfQVRUX0lXLCBWR0FfQVRDX1BFTCk7Ci0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gOCkKKwlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCiAJCXZnYV9pb193KFZHQV9BVFRfSVcsICh4b2Zmc2V0ICYgMykgPDwgMSk7CiAJZWxzZQogCQl2Z2FfaW9fdyhWR0FfQVRUX0lXLCB4b2Zmc2V0ICYgNyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9kdmkuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCmluZGV4IGIxZjM2NDcuLjkxMzhlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5jCkBAIC0xNzIsMzAgKzE3MiwyMCBAQAogfQogCiAvKiBEVkkgU2V0IE1vZGUgKi8KLXZvaWQgdmlhZmJfZHZpX3NldF9tb2RlKHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqbW9kZSwgaW50IG1vZGVfYnBwLAotCWludCBzZXRfaWdhKQordm9pZCB2aWFmYl9kdmlfc2V0X21vZGUoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpCiB7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICpyYl9tb2RlOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqcER2aVRpbWluZzsKLQl1bnNpZ25lZCBsb25nIGRlc2lyZVBpeGVsQ2xvY2ssIG1heFBpeGVsQ2xvY2s7Ci0JcER2aVRpbWluZyA9IG1vZGUtPmNydGM7Ci0JZGVzaXJlUGl4ZWxDbG9jayA9IHBEdmlUaW1pbmctPnJlZnJlc2hfcmF0ZQotCQkqIHBEdmlUaW1pbmctPmNydGMuaG9yX3RvdGFsICogcER2aVRpbWluZy0+Y3J0Yy52ZXJfdG90YWwKLQkJLyAxMDAwMDAwOwotCW1heFBpeGVsQ2xvY2sgPSAodW5zaWduZWQgbG9uZyl2aWFwYXJpbmZvLT4KLQkJdG1kc19zZXR0aW5nX2luZm8tPm1heF9waXhlbF9jbG9jazsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZHZpX3ZhciA9ICp2YXI7CisJc3RydWN0IGNydF9tb2RlX3RhYmxlICpyYl9tb2RlOworCWludCBtYXhQaXhlbENsb2NrOwogCi0JREVCVUdfTVNHKEtFUk5fSU5GTyAiXG5EVklfc2V0X21vZGUhIVxuIik7Ci0KLQlpZiAoKG1heFBpeGVsQ2xvY2sgIT0gMCkgJiYgKGRlc2lyZVBpeGVsQ2xvY2sgPiBtYXhQaXhlbENsb2NrKSkgewotCQlyYl9tb2RlID0gdmlhZmJfZ2V0X3JiX21vZGUobW9kZS0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyLAotCQkJbW9kZS0+Y3J0Y1swXS5jcnRjLnZlcl9hZGRyKTsKLQkJaWYgKHJiX21vZGUpIHsKLQkJCW1vZGUgPSByYl9tb2RlOwotCQkJcER2aVRpbWluZyA9IHJiX21vZGUtPmNydGM7Ci0JCX0KKwltYXhQaXhlbENsb2NrID0gdmlhcGFyaW5mby0+c2hhcmVkLT50bWRzX3NldHRpbmdfaW5mby5tYXhfcGl4ZWxfY2xvY2s7CisJaWYgKG1heFBpeGVsQ2xvY2sgJiYgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spIC8gMTAwMCA+IG1heFBpeGVsQ2xvY2spIHsKKwkJcmJfbW9kZSA9IHZpYWZiX2dldF9iZXN0X3JiX21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMsIDYwKTsKKwkJaWYgKHJiX21vZGUpCisJCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZHZpX3ZhciwgcmJfbW9kZSk7CiAJfQotCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcocER2aVRpbWluZywgbW9kZSwgbW9kZV9icHAgLyA4LCBzZXRfaWdhKTsKKworCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoJmR2aV92YXIsIGlnYSk7CiB9CiAKIC8qIFNlbnNlIERWSSBDb25uZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2R2aS5oIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmgKaW5kZXggZjQ3M2RkMC4uZTIxMTZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvZHZpLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvZHZpLmgKQEAgLTU5LDcgKzU5LDYgQEAKIGJvb2wgX19kZXZpbml0IHZpYWZiX3RtZHNfdHJhc21pdHRlcl9pZGVudGlmeSh2b2lkKTsKIHZvaWQgX19kZXZpbml0IHZpYWZiX2luaXRfZHZpX3NpemUoc3RydWN0IHRtZHNfY2hpcF9pbmZvcm1hdGlvbiAqdG1kc19jaGlwLAogCXN0cnVjdCB0bWRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnRtZHNfc2V0dGluZyk7Ci12b2lkIHZpYWZiX2R2aV9zZXRfbW9kZShzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvTW9kZSwgaW50IG1vZGVfYnBwLAotCWludCBzZXRfaWdhKTsKK3ZvaWQgdmlhZmJfZHZpX3NldF9tb2RlKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgaWdhKTsKIAogI2VuZGlmIC8qIF9fRFZJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwppbmRleCBlMTBkODI0Li4zMTAyMTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9nbG9iYWwuYwpAQCAtMzUsNiArMzUsOCBAQAogaW50IHZpYWZiX0xDRDJfT047CiBpbnQgdmlhZmJfU0FNTV9PTjsKIGludCB2aWFmYl9kdWFsX2ZiOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF94cmVzID0gNjQwOwordW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF95cmVzID0gNDgwOwogaW50IHZpYWZiX2hvdHBsdWdfWHJlcyA9IDY0MDsKIGludCB2aWFmYl9ob3RwbHVnX1lyZXMgPSA0ODA7CiBpbnQgdmlhZmJfaG90cGx1Z19icHAgPSAzMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2dsb2JhbC5oIGIvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKaW5kZXggZmY5NjlkYy4uMjc1ZGJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvZ2xvYmFsLmgKQEAgLTY3LDYgKzY3LDggQEAKIGV4dGVybiBpbnQgdmlhZmJfbGNkX21vZGU7CiAKIGV4dGVybiBpbnQgdmlhZmJfQ1JUX09OOworZXh0ZXJuIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfeHJlczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3lyZXM7CiBleHRlcm4gaW50IHZpYWZiX2hvdHBsdWdfWHJlczsKIGV4dGVybiBpbnQgdmlhZmJfaG90cGx1Z19ZcmVzOwogZXh0ZXJuIGludCB2aWFmYl9ob3RwbHVnX2JwcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5jCmluZGV4IDQ3YjEzNTMuLmQ1YWFjYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvaHcuYwpAQCAtMTkxLDY3ICsxOTEsNiBAQAogCXtJR0EyX0ZFVENIX0NPVU5UX1JFR19OVU0sIHt7Q1I2NSwgMCwgN30sIHtDUjY3LCAyLCAzfSB9IH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWdhMV9jcnRjX3RpbWluZyBpZ2ExX2NydGNfcmVnID0gewotCS8qIElHQTEgSG9yaXpvbnRhbCBUb3RhbCAqLwotCXtJR0ExX0hPUl9UT1RBTF9SRUdfTlVNLCB7e0NSMDAsIDAsIDd9LCB7Q1IzNiwgMywgM30gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBBZGRyZXNzYWJsZSBWaWRlbyAqLwotCXtJR0ExX0hPUl9BRERSX1JFR19OVU0sIHt7Q1IwMSwgMCwgN30gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLwotCXtJR0ExX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSMDIsIDAsIDd9IH0gfSwKLQkvKiBJR0ExIEhvcml6b250YWwgQmxhbmsgRW5kICovCi0Je0lHQTFfSE9SX0JMQU5LX0VORF9SRUdfTlVNLAotCSB7e0NSMDMsIDAsIDR9LCB7Q1IwNSwgNywgN30sIHtDUjMzLCA1LCA1fSB9IH0sCi0JLyogSUdBMSBIb3Jpem9udGFsIFN5bmMgU3RhcnQgKi8KLQl7SUdBMV9IT1JfU1lOQ19TVEFSVF9SRUdfTlVNLCB7e0NSMDQsIDAsIDd9LCB7Q1IzMywgNCwgNH0gfSB9LAotCS8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLwotCXtJR0ExX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSMDUsIDAsIDR9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFRvdGFsICovCi0Je0lHQTFfVkVSX1RPVEFMX1JFR19OVU0sCi0JIHt7Q1IwNiwgMCwgN30sIHtDUjA3LCAwLCAwfSwge0NSMDcsIDUsIDV9LCB7Q1IzNSwgMCwgMH0gfSB9LAotCS8qIElHQTEgVmVydGljYWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLQl7SUdBMV9WRVJfQUREUl9SRUdfTlVNLAotCSB7e0NSMTIsIDAsIDd9LCB7Q1IwNywgMSwgMX0sIHtDUjA3LCA2LCA2fSwge0NSMzUsIDIsIDJ9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi0Je0lHQTFfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sCi0JIHt7Q1IxNSwgMCwgN30sIHtDUjA3LCAzLCAzfSwge0NSMDksIDUsIDV9LCB7Q1IzNSwgMywgM30gfSB9LAotCS8qIElHQTEgVmVydGljYWwgQmxhbmsgRW5kICovCi0Je0lHQTFfVkVSX0JMQU5LX0VORF9SRUdfTlVNLCB7e0NSMTYsIDAsIDd9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgU3RhcnQgKi8KLQl7SUdBMV9WRVJfU1lOQ19TVEFSVF9SRUdfTlVNLAotCSB7e0NSMTAsIDAsIDd9LCB7Q1IwNywgMiwgMn0sIHtDUjA3LCA3LCA3fSwge0NSMzUsIDEsIDF9IH0gfSwKLQkvKiBJR0ExIFZlcnRpY2FsIFN5bmMgRW5kICovCi0Je0lHQTFfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1IxMSwgMCwgM30gfSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgaWdhMl9jcnRjX3JlZyA9IHsKLQkvKiBJR0EyIEhvcml6b250YWwgVG90YWwgKi8KLQl7SUdBMl9IT1JfVE9UQUxfUkVHX05VTSwge3tDUjUwLCAwLCA3fSwge0NSNTUsIDAsIDN9IH0gfSwKLQkvKiBJR0EyIEhvcml6b250YWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLQl7SUdBMl9IT1JfQUREUl9SRUdfTlVNLCB7e0NSNTEsIDAsIDd9LCB7Q1I1NSwgNCwgNn0gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBTdGFydCAqLwotCXtJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNLCB7e0NSNTIsIDAsIDd9LCB7Q1I1NCwgMCwgMn0gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KLQl7SUdBMl9IT1JfQkxBTktfRU5EX1JFR19OVU0sCi0JIHt7Q1I1MywgMCwgN30sIHtDUjU0LCAzLCA1fSwge0NSNUQsIDYsIDZ9IH0gfSwKLQkvKiBJR0EyIEhvcml6b250YWwgU3luYyBTdGFydCAqLwotCXtJR0EyX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0sCi0JIHt7Q1I1NiwgMCwgN30sIHtDUjU0LCA2LCA3fSwge0NSNUMsIDcsIDd9LCB7Q1I1RCwgNywgN30gfSB9LAotCS8qIElHQTIgSG9yaXpvbnRhbCBTeW5jIEVuZCAqLwotCXtJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNLCB7e0NSNTcsIDAsIDd9LCB7Q1I1QywgNiwgNn0gfSB9LAotCS8qIElHQTIgVmVydGljYWwgVG90YWwgKi8KLQl7SUdBMl9WRVJfVE9UQUxfUkVHX05VTSwge3tDUjU4LCAwLCA3fSwge0NSNUQsIDAsIDJ9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCi0Je0lHQTJfVkVSX0FERFJfUkVHX05VTSwge3tDUjU5LCAwLCA3fSwge0NSNUQsIDMsIDV9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi0Je0lHQTJfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU0sIHt7Q1I1QSwgMCwgN30sIHtDUjVDLCAwLCAyfSB9IH0sCi0JLyogSUdBMiBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLQl7SUdBMl9WRVJfQkxBTktfRU5EX1JFR19OVU0sIHt7Q1I1QiwgMCwgN30sIHtDUjVDLCAzLCA1fSB9IH0sCi0JLyogSUdBMiBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCi0Je0lHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSwge3tDUjVFLCAwLCA3fSwge0NSNUYsIDUsIDd9IH0gfSwKLQkvKiBJR0EyIFZlcnRpY2FsIFN5bmMgRW5kICovCi0Je0lHQTJfVkVSX1NZTkNfRU5EX1JFR19OVU0sIHt7Q1I1RiwgMCwgNH0gfSB9Ci19OwotCiBzdGF0aWMgc3RydWN0IHJnYkxVVCBwYWxMVVRfdGFibGVbXSA9IHsKIAkvKiB7UixHLEJ9ICovCiAJLyogSW5kZXggMHgwMH4weDAzICovCkBAIC0xNTI4LDMwMiArMTQ2Nyw0MCBAQAogCXZpYV93cml0ZV9taXNjX3JlZ19tYXNrKDB4MEMsIDB4MEMpOyAvKiBzZWxlY3QgZXh0ZXJuYWwgY2xvY2sgKi8KIH0KIAotdm9pZCB2aWFmYl9sb2FkX2NydGNfdGltaW5nKHN0cnVjdCBkaXNwbGF5X3RpbWluZyBkZXZpY2VfdGltaW5nLAotCWludCBzZXRfaWdhKQorc3RhdGljIHN0cnVjdCBkaXNwbGF5X3RpbWluZyB2YXJfdG9fdGltaW5nKGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewotCWludCBpOwotCWludCB2aWFmYl9sb2FkX3JlZ19udW0gPSAwOwotCWludCByZWdfdmFsdWUgPSAwOwotCXN0cnVjdCBpb19yZWdpc3RlciAqcmVnID0gTlVMTDsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgdGltaW5nOwogCi0JdmlhZmJfdW5sb2NrX2NydCgpOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJaWYgKHNldF9pZ2EgPT0gSUdBMSkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIEhfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIGhvcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMV9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIGhvcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2ExX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLmhvcl9zeW5jX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSF9TWU5DX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0ExX0hPUl9TWU5DX0VORF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLmhvcl9zeW5jX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy5ob3Jfc3luY19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTFfY3J0Y19yZWcuaG9yX3N5bmNfZW5kLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX1RPVEFMX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTFfVkVSX1RPVEFMX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgICB2ZXJfdG90YWwpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJCWlnYTFfY3J0Y19yZWcudmVyX3RvdGFsLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfdG90YWwucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0FERFJfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfQUREUl9GT1JNVUxBKGRldmljZV90aW1pbmcuCi0JCQkJCQkJICB2ZXJfYWRkcik7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMV9jcnRjX3JlZy52ZXJfYWRkci5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2FkZHIucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0JMQU5LX1NUQVJUX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTFfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0KTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19zdGFydC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgVl9CTEFOS19FTkRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfQkxBTktfRU5EX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX2JsYW5rX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfZW5kKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2ExX2NydGNfcmVnLnZlcl9ibGFua19lbmQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX1NZTkNfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfU1lOQ19TVEFSVF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0KTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMV9jcnRjX3JlZy52ZXJfc3luY19zdGFydC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfU1lOQ19FTkRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMV9WRVJfU1lOQ19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfc3luY19zdGFydCwKLQkJCQkgICAgIGRldmljZV90aW1pbmcudmVyX3N5bmNfZW5kKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCSAgICBpZ2ExX2NydGNfcmVnLnZlcl9zeW5jX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTFfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZzsKLQkJCQlicmVhazsKLQotCQkJfQotCQl9Ci0KLQkJaWYgKHNldF9pZ2EgPT0gSUdBMikgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIEhfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9IT1JfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIGhvcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMl9jcnRjX3JlZy5ob3JfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIGhvcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2EyX2NydGNfcmVnLmhvcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9IT1JfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy5ob3JfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy5ob3JfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEhfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQpOwotCQkJCWlmIChVTklDSFJPTUVfQ043MDAgPD0KLQkJCQkJdmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lKQotCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19zdGFydC4KLQkJCQkJICAgIHJlZ19udW07Ci0JCQkJZWxzZQotCQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPSAzOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcuaG9yX3N5bmNfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBIX1NZTkNfRU5EX0lOREVYOgotCQkJCXJlZ192YWx1ZSA9Ci0JCQkJICAgIElHQTJfSE9SX1NZTkNfRU5EX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcuaG9yX3N5bmNfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLmhvcl9zeW5jX2VuZCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkgICAgaWdhMl9jcnRjX3JlZy5ob3Jfc3luY19lbmQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLmhvcl9zeW5jX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfVE9UQUxfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9WRVJfVE9UQUxfRk9STVVMQShkZXZpY2VfdGltaW5nLgotCQkJCQkJCSAgIHZlcl90b3RhbCk7Ci0JCQkJdmlhZmJfbG9hZF9yZWdfbnVtID0KLQkJCQkJaWdhMl9jcnRjX3JlZy52ZXJfdG90YWwucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl90b3RhbC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfQUREUl9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9BRERSX0ZPUk1VTEEoZGV2aWNlX3RpbWluZy4KLQkJCQkJCQkgIHZlcl9hZGRyKTsKLQkJCQl2aWFmYl9sb2FkX3JlZ19udW0gPQotCQkJCQlpZ2EyX2NydGNfcmVnLnZlcl9hZGRyLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYWRkci5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfQkxBTktfU1RBUlRfSU5ERVg6Ci0JCQkJcmVnX3ZhbHVlID0KLQkJCQkgICAgSUdBMl9WRVJfQkxBTktfU1RBUlRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX3N0YXJ0LnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfYmxhbmtfc3RhcnQucmVnOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWX0JMQU5LX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9CTEFOS19FTkRfRk9STVVMQQotCQkJCSAgICAoZGV2aWNlX3RpbWluZy52ZXJfYmxhbmtfc3RhcnQsCi0JCQkJICAgICBkZXZpY2VfdGltaW5nLnZlcl9ibGFua19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWdfbnVtOwotCQkJCXJlZyA9IGlnYTJfY3J0Y19yZWcudmVyX2JsYW5rX2VuZC5yZWc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZfU1lOQ19TVEFSVF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEKLQkJCQkgICAgKGRldmljZV90aW1pbmcudmVyX3N5bmNfc3RhcnQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfc3RhcnQucmVnX251bTsKLQkJCQlyZWcgPSBpZ2EyX2NydGNfcmVnLnZlcl9zeW5jX3N0YXJ0LnJlZzsKLQkJCQlicmVhazsKLQkJCWNhc2UgVl9TWU5DX0VORF9JTkRFWDoKLQkJCQlyZWdfdmFsdWUgPQotCQkJCSAgICBJR0EyX1ZFUl9TWU5DX0VORF9GT1JNVUxBCi0JCQkJICAgIChkZXZpY2VfdGltaW5nLnZlcl9zeW5jX3N0YXJ0LAotCQkJCSAgICAgZGV2aWNlX3RpbWluZy52ZXJfc3luY19lbmQpOwotCQkJCXZpYWZiX2xvYWRfcmVnX251bSA9Ci0JCQkJICAgIGlnYTJfY3J0Y19yZWcudmVyX3N5bmNfZW5kLnJlZ19udW07Ci0JCQkJcmVnID0gaWdhMl9jcnRjX3JlZy52ZXJfc3luY19lbmQucmVnOwotCQkJCWJyZWFrOwotCi0JCQl9Ci0JCX0KLQkJdmlhZmJfbG9hZF9yZWcocmVnX3ZhbHVlLCB2aWFmYl9sb2FkX3JlZ19udW0sIHJlZywgVklBQ1IpOwotCX0KLQotCXZpYWZiX2xvY2tfY3J0KCk7CisJdGltaW5nLmhvcl9hZGRyID0gdmFyLT54cmVzOworCXRpbWluZy5ob3Jfc3luY19zdGFydCA9IHRpbWluZy5ob3JfYWRkciArIHZhci0+cmlnaHRfbWFyZ2luOworCXRpbWluZy5ob3Jfc3luY19lbmQgPSB0aW1pbmcuaG9yX3N5bmNfc3RhcnQgKyB2YXItPmhzeW5jX2xlbjsKKwl0aW1pbmcuaG9yX3RvdGFsID0gdGltaW5nLmhvcl9zeW5jX2VuZCArIHZhci0+bGVmdF9tYXJnaW47CisJdGltaW5nLmhvcl9ibGFua19zdGFydCA9IHRpbWluZy5ob3JfYWRkcjsKKwl0aW1pbmcuaG9yX2JsYW5rX2VuZCA9IHRpbWluZy5ob3JfdG90YWw7CisJdGltaW5nLnZlcl9hZGRyID0gdmFyLT55cmVzOworCXRpbWluZy52ZXJfc3luY19zdGFydCA9IHRpbWluZy52ZXJfYWRkciArIHZhci0+bG93ZXJfbWFyZ2luOworCXRpbWluZy52ZXJfc3luY19lbmQgPSB0aW1pbmcudmVyX3N5bmNfc3RhcnQgKyB2YXItPnZzeW5jX2xlbjsKKwl0aW1pbmcudmVyX3RvdGFsID0gdGltaW5nLnZlcl9zeW5jX2VuZCArIHZhci0+dXBwZXJfbWFyZ2luOworCXRpbWluZy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmcudmVyX2FkZHI7CisJdGltaW5nLnZlcl9ibGFua19lbmQgPSB0aW1pbmcudmVyX3RvdGFsOworCXJldHVybiB0aW1pbmc7CiB9CiAKLXZvaWQgdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90YWJsZSwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvX21vZGUsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpCit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpCiB7Ci0Jc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydF9yZWc7Ci0JaW50IGk7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgaF9hZGRyLCB2X2FkZHI7Ci0JdTMyIGNsb2NrLCByZWZyZXNoID0gdmlhZmJfcmVmcmVzaDsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgY3J0X3JlZyA9IHZhcl90b190aW1pbmcodmFyKTsKIAotCWlmICh2aWFmYl9TQU1NX09OICYmIHNldF9pZ2EgPT0gSUdBMikKLQkJcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2gxOworCWlmIChpZ2EgPT0gSUdBMSkKKwkJdmlhX3NldF9wcmltYXJ5X3RpbWluZygmY3J0X3JlZyk7CisJZWxzZSBpZiAoaWdhID09IElHQTIpCisJCXZpYV9zZXRfc2Vjb25kYXJ5X3RpbWluZygmY3J0X3JlZyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdmlkZW9fbW9kZS0+bW9kZV9hcnJheTsgaSsrKSB7Ci0JCWluZGV4ID0gaTsKKwl2aWFmYl9sb2FkX2ZldGNoX2NvdW50X3JlZyh2YXItPnhyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4LCBpZ2EpOworCWlmICh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0gVU5JQ0hST01FX0NMRTI2NgorCQkmJiB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgIT0gVU5JQ0hST01FX0s0MDApCisJCXZpYWZiX2xvYWRfRklGT19yZWcoaWdhLCB2YXItPnhyZXMsIHZhci0+eXJlcyk7CiAKLQkJaWYgKGNydF90YWJsZVtpXS5yZWZyZXNoX3JhdGUgPT0gcmVmcmVzaCkKLQkJCWJyZWFrOwotCX0KLQotCWNydF9yZWcgPSBjcnRfdGFibGVbaW5kZXhdLmNydGM7Ci0KLQkvKiBNb2RlIDY0MHg0ODAgaGFzIGJvcmRlciwgYnV0IExDRC9ERlAgZGlkbid0IGhhdmUgYm9yZGVyLiAqLwotCS8qIFNvIHdlIHdvdWxkIGRlbGV0ZSBib3JkZXIuICovCi0JaWYgKCh2aWFmYl9MQ0RfT04gfCB2aWFmYl9EVklfT04pCi0JICAgICYmIHZpZGVvX21vZGUtPmNydGNbMF0uY3J0Yy5ob3JfYWRkciA9PSA2NDAKLQkgICAgJiYgdmlkZW9fbW9kZS0+Y3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IDQ4MAotCSAgICAmJiByZWZyZXNoID09IDYwKSB7Ci0JCS8qIFRoZSBib3JkZXIgaXMgOCBwaXhlbHMuICovCi0JCWNydF9yZWcuaG9yX2JsYW5rX3N0YXJ0ID0gY3J0X3JlZy5ob3JfYmxhbmtfc3RhcnQgLSA4OwotCi0JCS8qIEJsYW5raW5nIHRpbWUgc2hvdWxkIGFkZCBsZWZ0IGFuZCByaWdodCBib3JkZXJzLiAqLwotCQljcnRfcmVnLmhvcl9ibGFua19lbmQgPSBjcnRfcmVnLmhvcl9ibGFua19lbmQgKyAxNjsKLQl9Ci0KLQloX2FkZHIgPSBjcnRfcmVnLmhvcl9hZGRyOwotCXZfYWRkciA9IGNydF9yZWcudmVyX2FkZHI7Ci0JaWYgKHNldF9pZ2EgPT0gSUdBMSkgewotCQl2aWFmYl91bmxvY2tfY3J0KCk7Ci0JCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSMTcsIFZJQUNSLCAweDAwLCBCSVQ3KTsKLQl9Ci0KLQlzd2l0Y2ggKHNldF9pZ2EpIHsKLQljYXNlIElHQTE6Ci0JCXZpYWZiX2xvYWRfY3J0Y190aW1pbmcoY3J0X3JlZywgSUdBMSk7Ci0JCWJyZWFrOwotCWNhc2UgSUdBMjoKLQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhjcnRfcmVnLCBJR0EyKTsKLQkJYnJlYWs7Ci0JfQotCi0JdmlhZmJfbG9ja19jcnQoKTsKLQl2aWFmYl93cml0ZV9yZWdfbWFzayhDUjE3LCBWSUFDUiwgMHg4MCwgQklUNyk7Ci0JdmlhZmJfbG9hZF9mZXRjaF9jb3VudF9yZWcoaF9hZGRyLCBicHBfYnl0ZSwgc2V0X2lnYSk7Ci0KLQkvKiBsb2FkIEZJRk8gKi8KLQlpZiAoKHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSAhPSBVTklDSFJPTUVfQ0xFMjY2KQotCSAgICAmJiAodmlhcGFyaW5mby0+Y2hpcF9pbmZvLT5nZnhfY2hpcF9uYW1lICE9IFVOSUNIUk9NRV9LNDAwKSkKLQkJdmlhZmJfbG9hZF9GSUZPX3JlZyhzZXRfaWdhLCBoX2FkZHIsIHZfYWRkcik7Ci0KLQljbG9jayA9IGNydF9yZWcuaG9yX3RvdGFsICogY3J0X3JlZy52ZXJfdG90YWwKLQkJKiBjcnRfdGFibGVbaW5kZXhdLnJlZnJlc2hfcmF0ZTsKLQl2aWFmYl9zZXRfdmNsb2NrKGNsb2NrLCBzZXRfaWdhKTsKLQorCXZpYWZiX3NldF92Y2xvY2soUElDT1MyS0haKHZhci0+cGl4Y2xvY2spICogMTAwMCwgaWdhKTsKIH0KIAogdm9pZCBfX2RldmluaXQgdmlhZmJfaW5pdF9jaGlwX2luZm8oaW50IGNoaXBfdHlwZSkKQEAgLTIwOTIsMjMgKzE3NjksOSBAQAogCXJldHVybiBwb2xhcml0eTsKIH0KIAotaW50IHZpYWZiX3NldG1vZGUoc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwsIGludCB2aWRlb19icHAsCi0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwxLCBpbnQgdmlkZW9fYnBwMSkKK3N0YXRpYyB2b2lkIGh3X2luaXQodm9pZCkKIHsKLQlpbnQgaSwgajsKLQlpbnQgcG9ydDsKLQl1MzIgZGV2aWNlcyA9IHZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMV9kZXZpY2VzCi0JCXwgdmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXM7Ci0JdTggdmFsdWUsIGluZGV4LCBtYXNrOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZzsKLQlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90aW1pbmcxID0gTlVMTDsKLQotCWRldmljZV9zY3JlZW5fb2ZmKCk7Ci0JY3J0X3RpbWluZyA9IHZtb2RlX3RibC0+Y3J0YzsKLQotCWlmICh2aWFmYl9TQU1NX09OID09IDEpIHsKLQkJY3J0X3RpbWluZzEgPSB2bW9kZV90YmwxLT5jcnRjOwotCX0KKwlpbnQgaTsKIAogCWluYihWSUFTdGF0dXMpOwogCW91dGIoMHgwMCwgVklBQVIpOwpAQCAtMjE0Nyw5ICsxODEwLDggQEAKIAkJYnJlYWs7CiAJfQogCisJLyogcHJvYmFibHkgdGhpcyBzaG91bGQgZ28gdG8gdGhlIHNjYWxpbmcgY29kZSBvbmUgZGF5ICovCiAJdmlhZmJfd3JpdGVfcmVneChzY2FsaW5nX3BhcmFtZXRlcnMsIEFSUkFZX1NJWkUoc2NhbGluZ19wYXJhbWV0ZXJzKSk7Ci0JZGV2aWNlX29mZigpOwotCXZpYV9zZXRfc3RhdGUoZGV2aWNlcywgVklBX1NUQVRFX09GRik7CiAKIAkvKiBGaWxsIFZQSVQgUGFyYW1ldGVycyAqLwogCS8qIFdyaXRlIE1pc2MgUmVnaXN0ZXIgKi8KQEAgLTIxNzUsMTIgKzE4MzcsMjkgQEAKIAlpbmIoVklBU3RhdHVzKTsKIAlvdXRiKDB4MjAsIFZJQUFSKTsKIAorCWxvYWRfZml4X2JpdF9jcnRjX3JlZygpOworfQorCitpbnQgdmlhZmJfc2V0bW9kZShpbnQgdmlkZW9fYnBwLCBpbnQgdmlkZW9fYnBwMSkKK3sKKwlpbnQgajsKKwlpbnQgcG9ydDsKKwl1MzIgZGV2aWNlcyA9IHZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMV9kZXZpY2VzCisJCXwgdmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXM7CisJdTggdmFsdWUsIGluZGV4LCBtYXNrOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXIyOworCisJZGV2aWNlX3NjcmVlbl9vZmYoKTsKKwlkZXZpY2Vfb2ZmKCk7CisJdmlhX3NldF9zdGF0ZShkZXZpY2VzLCBWSUFfU1RBVEVfT0ZGKTsKKworCWh3X2luaXQoKTsKKwogCS8qIFVwZGF0ZSBQYXRjaCBSZWdpc3RlciAqLwogCiAJaWYgKCh2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0NMRTI2NgotCSAgICB8fCB2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmdmeF9jaGlwX25hbWUgPT0gVU5JQ0hST01FX0s0MDApCi0JICAgICYmIHZtb2RlX3RibC0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyID09IDEwMjQKLQkgICAgJiYgdm1vZGVfdGJsLT5jcnRjWzBdLmNydGMudmVyX2FkZHIgPT0gNzY4KSB7CisJCXx8IHZpYXBhcmluZm8tPmNoaXBfaW5mby0+Z2Z4X2NoaXBfbmFtZSA9PSBVTklDSFJPTUVfSzQwMCkKKwkJJiYgdmlhZmJpbmZvLT52YXIueHJlcyA9PSAxMDI0ICYmIHZpYWZiaW5mby0+dmFyLnlyZXMgPT0gNzY4KSB7CiAJCWZvciAoaiA9IDA7IGogPCByZXNfcGF0Y2hfdGFibGVbMF0udGFibGVfbGVuZ3RoOyBqKyspIHsKIAkJCWluZGV4ID0gcmVzX3BhdGNoX3RhYmxlWzBdLmlvX3JlZ190YWJsZVtqXS5pbmRleDsKIAkJCXBvcnQgPSByZXNfcGF0Y2hfdGFibGVbMF0uaW9fcmVnX3RhYmxlW2pdLnBvcnQ7CkBAIC0yMTkwLDcgKzE4NjksNiBAQAogCQl9CiAJfQogCi0JbG9hZF9maXhfYml0X2NydGNfcmVnKCk7CiAJdmlhX3NldF9wcmltYXJ5X3BpdGNoKHZpYWZiaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsKIAl2aWFfc2V0X3NlY29uZGFyeV9waXRjaCh2aWFmYl9kdWFsX2ZiID8gdmlhZmJpbmZvMS0+Zml4LmxpbmVfbGVuZ3RoCiAJCTogdmlhZmJpbmZvLT5maXgubGluZV9sZW5ndGgpOwpAQCAtMjIwOCwyMyArMTg4NiwyOCBAQAogCiAJLyogQ2xlYXIgT24gU2NyZWVuICovCiAKKwlpZiAodmlhZmJfZHVhbF9mYikgeworCQl2YXIyID0gdmlhZmJpbmZvMS0+dmFyOworCX0gZWxzZSBpZiAodmlhZmJfU0FNTV9PTikgeworCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmdmFyMiwgdmlhZmJfZ2V0X2Jlc3RfbW9kZSgKKwkJCXZpYWZiX3NlY29uZF94cmVzLCB2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfcmVmcmVzaDEpKTsKKwkJdmFyMi5iaXRzX3Blcl9waXhlbCA9IHZpYWZiaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCX0KKwogCS8qIENSVCBzZXQgbW9kZSAqLwogCWlmICh2aWFmYl9DUlRfT04pIHsKLQkJaWYgKHZpYWZiX1NBTU1fT04gJiYKLQkJCXZpYXBhcmluZm8tPnNoYXJlZC0+aWdhMl9kZXZpY2VzICYgVklBX0NSVCkgewotCQkJdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhjcnRfdGltaW5nMSwgdm1vZGVfdGJsMSwKLQkJCQl2aWRlb19icHAxIC8gOCwgSUdBMik7Ci0JCX0gZWxzZSB7Ci0JCQl2aWFmYl9maWxsX2NydGNfdGltaW5nKGNydF90aW1pbmcsIHZtb2RlX3RibCwKLQkJCQl2aWRlb19icHAgLyA4LAorCQlpZiAodmlhcGFyaW5mby0+c2hhcmVkLT5pZ2EyX2RldmljZXMgJiBWSUFfQ1JUCisJCQkmJiB2aWFmYl9TQU1NX09OKQorCQkJdmlhZmJfZmlsbF9jcnRjX3RpbWluZygmdmFyMiwgSUdBMik7CisJCWVsc2UKKwkJCXZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoJnZpYWZiaW5mby0+dmFyLAogCQkJCSh2aWFwYXJpbmZvLT5zaGFyZWQtPmlnYTFfZGV2aWNlcyAmIFZJQV9DUlQpCiAJCQkJPyBJR0ExIDogSUdBMik7Ci0JCX0KIAogCQkvKiBQYXRjaCBpZiBzZXRfaHJlcyBpcyBub3QgOCBhbGlnbm1lbnQgKDEzNjYpIHRvIHZpYWZiX3NldG1vZGUKIAkJdG8gOCBhbGlnbm1lbnQgKDEzNjgpLHRoZXJlIGlzIHNldmVyYWwgcGl4ZWxzICgyIHBpeGVscykKIAkJb24gcmlnaHQgc2lkZSBvZiBzY3JlZW4uICovCi0JCWlmICh2bW9kZV90YmwtPmNydGNbMF0uY3J0Yy5ob3JfYWRkciAlIDgpIHsKKwkJaWYgKHZpYWZiaW5mby0+dmFyLnhyZXMgJSA4KSB7CiAJCQl2aWFmYl91bmxvY2tfY3J0KCk7CiAJCQl2aWFmYl93cml0ZV9yZWcoQ1IwMiwgVklBQ1IsCiAJCQkJdmlhZmJfcmVhZF9yZWcoVklBQ1IsIENSMDIpIC0gMSk7CkBAIC0yMjMzLDMxICsxOTE2LDIwIEBACiAJfQogCiAJaWYgKHZpYWZiX0RWSV9PTikgewotCQlpZiAodmlhZmJfU0FNTV9PTiAmJgotCQkJKHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSkgewotCQkJdmlhZmJfZHZpX3NldF9tb2RlKHZpYWZiX2dldF9tb2RlCi0JCQkJICAgICAodmlhcGFyaW5mby0+dG1kc19zZXR0aW5nX2luZm8tPmhfYWN0aXZlLAotCQkJCSAgICAgIHZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT4KLQkJCQkgICAgICB2X2FjdGl2ZSksCi0JCQkJICAgICB2aWRlb19icHAxLCB2aWFwYXJpbmZvLT4KLQkJCQkgICAgIHRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQl2aWFmYl9kdmlfc2V0X21vZGUodmlhZmJfZ2V0X21vZGUKLQkJCQkgICAgICh2aWFwYXJpbmZvLT50bWRzX3NldHRpbmdfaW5mby0+aF9hY3RpdmUsCi0JCQkJICAgICAgdmlhcGFyaW5mby0+Ci0JCQkJICAgICAgdG1kc19zZXR0aW5nX2luZm8tPnZfYWN0aXZlKSwKLQkJCQkgICAgIHZpZGVvX2JwcCwgdmlhcGFyaW5mby0+Ci0JCQkJICAgICB0bWRzX3NldHRpbmdfaW5mby0+aWdhX3BhdGgpOwotCQl9CisJCWlmICh2aWFwYXJpbmZvLT5zaGFyZWQtPnRtZHNfc2V0dGluZ19pbmZvLmlnYV9wYXRoID09IElHQTIKKwkJCSYmIHZpYWZiX1NBTU1fT04pCisJCQl2aWFmYl9kdmlfc2V0X21vZGUoJnZhcjIsIElHQTIpOworCQllbHNlCisJCQl2aWFmYl9kdmlfc2V0X21vZGUoJnZpYWZiaW5mby0+dmFyLAorCQkJCXZpYXBhcmluZm8tPnRtZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCk7CiAJfQogCiAJaWYgKHZpYWZiX0xDRF9PTikgewogCQlpZiAodmlhZmJfU0FNTV9PTiAmJgogCQkJKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0EyKSkgewogCQkJdmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8tPmJwcCA9IHZpZGVvX2JwcDE7Ci0JCQl2aWFmYl9sY2Rfc2V0X21vZGUoY3J0X3RpbWluZzEsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKIAkJfSBlbHNlIHsKIAkJCS8qIElHQTEgZG9lc24ndCBoYXZlIExDRCBzY2FsaW5nLCBzbyBzZXQgaXQgY2VudGVyLiAqLwogCQkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aCA9PSBJR0ExKSB7CkBAIC0yMjY1LDE4ICsxOTM3LDE2IEBACiAJCQkJICAgIExDRF9DRU5URVJJTkc7CiAJCQl9CiAJCQl2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mby0+YnBwID0gdmlkZW9fYnBwOwotCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8pOworCQkJdmlhZmJfbGNkX3NldF9tb2RlKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvKTsKIAkJfQogCX0KIAlpZiAodmlhZmJfTENEMl9PTikgewogCQlpZiAodmlhZmJfU0FNTV9PTiAmJgogCQkJKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGggPT0gSUdBMikpIHsKIAkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+YnBwID0gdmlkZW9fYnBwMTsKLQkJCXZpYWZiX2xjZF9zZXRfbW9kZShjcnRfdGltaW5nMSwgdmlhcGFyaW5mby0+Ci0JCQkJbHZkc19zZXR0aW5nX2luZm8yLAotCQkJCSAgICAgJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yKTsKKwkJCXZpYWZiX2xjZF9zZXRfbW9kZSh2aWFwYXJpbmZvLT5sdmRzX3NldHRpbmdfaW5mbzIsCisJCQkJJnZpYXBhcmluZm8tPmNoaXBfaW5mby0+bHZkc19jaGlwX2luZm8yKTsKIAkJfSBlbHNlIHsKIAkJCS8qIElHQTEgZG9lc24ndCBoYXZlIExDRCBzY2FsaW5nLCBzbyBzZXQgaXQgY2VudGVyLiAqLwogCQkJaWYgKHZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+aWdhX3BhdGggPT0gSUdBMSkgewpAQCAtMjI4NCw5ICsxOTU0LDggQEAKIAkJCQkgICAgTENEX0NFTlRFUklORzsKIAkJCX0KIAkJCXZpYXBhcmluZm8tPmx2ZHNfc2V0dGluZ19pbmZvMi0+YnBwID0gdmlkZW9fYnBwOwotCQkJdmlhZmJfbGNkX3NldF9tb2RlKGNydF90aW1pbmcsIHZpYXBhcmluZm8tPgotCQkJCWx2ZHNfc2V0dGluZ19pbmZvMiwKLQkJCQkgICAgICZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMik7CisJCQl2aWFmYl9sY2Rfc2V0X21vZGUodmlhcGFyaW5mby0+bHZkc19zZXR0aW5nX2luZm8yLAorCQkJCSZ2aWFwYXJpbmZvLT5jaGlwX2luZm8tPmx2ZHNfY2hpcF9pbmZvMik7CiAJCX0KIAl9CiAKQEAgLTIyOTYsOCArMTk2NSw4IEBACiAKIAkvKiBJZiBzZXQgbW9kZSBub3JtYWxseSwgc2F2ZSByZXNvbHV0aW9uIGluZm9ybWF0aW9uIGZvciBob3QtcGx1ZyAuICovCiAJaWYgKCF2aWFmYl9ob3RwbHVnKSB7Ci0JCXZpYWZiX2hvdHBsdWdfWHJlcyA9IHZtb2RlX3RibC0+Y3J0Y1swXS5jcnRjLmhvcl9hZGRyOwotCQl2aWFmYl9ob3RwbHVnX1lyZXMgPSB2bW9kZV90YmwtPmNydGNbMF0uY3J0Yy52ZXJfYWRkcjsKKwkJdmlhZmJfaG90cGx1Z19YcmVzID0gdmlhZmJpbmZvLT52YXIueHJlczsKKwkJdmlhZmJfaG90cGx1Z19ZcmVzID0gdmlhZmJpbmZvLT52YXIueXJlczsKIAkJdmlhZmJfaG90cGx1Z19icHAgPSB2aWRlb19icHA7CiAJCXZpYWZiX2hvdHBsdWdfcmVmcmVzaCA9IHZpYWZiX3JlZnJlc2g7CiAKQEAgLTIzNDgsNDIgKzIwMTcsMTQgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKQotewotCWludCBpOwotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqYmVzdDsKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlID0gdmlhZmJfZ2V0X21vZGUoaHJlcywgdnJlcyk7Ci0KLQlpZiAoIXZtb2RlKQotCQlyZXR1cm4gUkVTXzY0MFg0ODBfNjBIWl9QSVhDTE9DSzsKLQotCWJlc3QgPSAmdm1vZGUtPmNydGNbMF07Ci0JZm9yIChpID0gMTsgaSA8IHZtb2RlLT5tb2RlX2FycmF5OyBpKyspIHsKLQkJaWYgKGFicyh2bW9kZS0+Y3J0Y1tpXS5yZWZyZXNoX3JhdGUgLSB2bW9kZV9yZWZyZXNoKQotCQkJPCBhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gdm1vZGVfcmVmcmVzaCkpCi0JCQliZXN0ID0gJnZtb2RlLT5jcnRjW2ldOwotCX0KLQotCXJldHVybiAxMDAwMDAwMDAwIC8gKGJlc3QtPmNydGMuaG9yX3RvdGFsICogYmVzdC0+Y3J0Yy52ZXJfdG90YWwpCi0JCSogMTAwMCAvIGJlc3QtPnJlZnJlc2hfcmF0ZTsKLX0KLQogaW50IHZpYWZiX2dldF9yZWZyZXNoKGludCBocmVzLCBpbnQgdnJlcywgdTMyIGxvbmdfcmVmcmVzaCkKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmJlc3Q7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZSA9IHZpYWZiX2dldF9tb2RlKGhyZXMsIHZyZXMpOwogCi0JaWYgKCF2bW9kZSkKKwliZXN0ID0gdmlhZmJfZ2V0X2Jlc3RfbW9kZShocmVzLCB2cmVzLCBsb25nX3JlZnJlc2gpOworCWlmICghYmVzdCkKIAkJcmV0dXJuIDYwOwogCi0JYmVzdCA9ICZ2bW9kZS0+Y3J0Y1swXTsKLQlmb3IgKGkgPSAxOyBpIDwgdm1vZGUtPm1vZGVfYXJyYXk7IGkrKykgewotCQlpZiAoYWJzKHZtb2RlLT5jcnRjW2ldLnJlZnJlc2hfcmF0ZSAtIGxvbmdfcmVmcmVzaCkKLQkJCTwgYWJzKGJlc3QtPnJlZnJlc2hfcmF0ZSAtIGxvbmdfcmVmcmVzaCkpCi0JCQliZXN0ID0gJnZtb2RlLT5jcnRjW2ldOwotCX0KLQogCWlmIChhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gbG9uZ19yZWZyZXNoKSA+IDMpIHsKIAkJaWYgKGhyZXMgPT0gMTIwMCAmJiB2cmVzID09IDkwMCkKIAkJCXJldHVybiA0OTsgLyogT0xQQyBEQ09OIG9ubHkgc3VwcG9ydHMgNTAgSHogKi8KQEAgLTI0ODUsMjEgKzIxMjYsMTQgQEAKIH0KIAogLypBY2NvcmRpbmcgdmFyJ3MgeHJlcywgeXJlcyBmaWxsIHZhcidzIG90aGVyIHRpbWluZyBpbmZvcm1hdGlvbiovCi12b2lkIHZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgcmVmcmVzaCwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibCkKK3ZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlKQogewotCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqY3J0X3RpbWluZyA9IE5VTEw7CiAJc3RydWN0IGRpc3BsYXlfdGltaW5nIGNydF9yZWc7Ci0JaW50IGkgPSAwLCBpbmRleCA9IDA7Ci0JY3J0X3RpbWluZyA9IHZtb2RlX3RibC0+Y3J0YzsKLQlmb3IgKGkgPSAwOyBpIDwgdm1vZGVfdGJsLT5tb2RlX2FycmF5OyBpKyspIHsKLQkJaW5kZXggPSBpOwotCQlpZiAoY3J0X3RpbWluZ1tpXS5yZWZyZXNoX3JhdGUgPT0gcmVmcmVzaCkKLQkJCWJyZWFrOwotCX0KIAotCWNydF9yZWcgPSBjcnRfdGltaW5nW2luZGV4XS5jcnRjOwotCXZhci0+cGl4Y2xvY2sgPSB2aWFmYl9nZXRfcGl4Y2xvY2sodmFyLT54cmVzLCB2YXItPnlyZXMsIHJlZnJlc2gpOworCWNydF9yZWcgPSBtb2RlLT5jcnRjOworCXZhci0+cGl4Y2xvY2sgPSAxMDAwMDAwMDAwIC8gKGNydF9yZWcuaG9yX3RvdGFsICogY3J0X3JlZy52ZXJfdG90YWwpCisJCSogMTAwMCAvIG1vZGUtPnJlZnJlc2hfcmF0ZTsKIAl2YXItPmxlZnRfbWFyZ2luID0KIAkgICAgY3J0X3JlZy5ob3JfdG90YWwgLSAoY3J0X3JlZy5ob3Jfc3luY19zdGFydCArIGNydF9yZWcuaG9yX3N5bmNfZW5kKTsKIAl2YXItPnJpZ2h0X21hcmdpbiA9IGNydF9yZWcuaG9yX3N5bmNfc3RhcnQgLSBjcnRfcmVnLmhvcl9hZGRyOwpAQCAtMjUwOSw4ICsyMTQzLDggQEAKIAl2YXItPmxvd2VyX21hcmdpbiA9IGNydF9yZWcudmVyX3N5bmNfc3RhcnQgLSBjcnRfcmVnLnZlcl9hZGRyOwogCXZhci0+dnN5bmNfbGVuID0gY3J0X3JlZy52ZXJfc3luY19lbmQ7CiAJdmFyLT5zeW5jID0gMDsKLQlpZiAoY3J0X3RpbWluZ1tpbmRleF0uaF9zeW5jX3BvbGFyaXR5ID09IFBPU0lUSVZFKQorCWlmIChtb2RlLT5oX3N5bmNfcG9sYXJpdHkgPT0gUE9TSVRJVkUpCiAJCXZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKLQlpZiAoY3J0X3RpbWluZ1tpbmRleF0udl9zeW5jX3BvbGFyaXR5ID09IFBPU0lUSVZFKQorCWlmIChtb2RlLT52X3N5bmNfcG9sYXJpdHkgPT0gUE9TSVRJVkUpCiAJCXZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5oIGIvZHJpdmVycy92aWRlby92aWEvaHcuaAppbmRleCBjNzIzOWViLi40ZGI1YjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9ody5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2h3LmgKQEAgLTUxLDQwICs1MSw2IEBACiAjZGVmaW5lIFZJQV9IU1lOQ19ORUdBVElWRQkweDAxCiAjZGVmaW5lIFZJQV9WU1lOQ19ORUdBVElWRQkweDAyCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRGVmaW5pdGlvbiBJR0ExIERlc2lnbiBNZXRob2Qgb2YgQ1JUQyBSZWdpc3RlcnMgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUdBMV9IT1JfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCgoeCkvOCktNSkKLSNkZWZpbmUgSUdBMV9IT1JfQUREUl9GT1JNVUxBKHgpICAgICAgICAgICAgKCgoeCkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfU1RBUlRfRk9STVVMQSh4KSAgICAgKCgoeCkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoKHgreSkvOCktMSkKLSNkZWZpbmUgSUdBMV9IT1JfU1lOQ19TVEFSVF9GT1JNVUxBKHgpICAgICAgKCh4KS84KQotI2RlZmluZSBJR0ExX0hPUl9TWU5DX0VORF9GT1JNVUxBKHgsIHkpICAgICAgKCh4K3kpLzgpCi0KLSNkZWZpbmUgSUdBMV9WRVJfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0yKQotI2RlZmluZSBJR0ExX1ZFUl9BRERSX0ZPUk1VTEEoeCkgICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTFfVkVSX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMV9WRVJfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQotI2RlZmluZSBJR0ExX1ZFUl9TWU5DX1NUQVJUX0ZPUk1VTEEoeCkgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTFfVkVSX1NZTkNfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICAoKHgreSktMSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiogRGVmaW5pdGlvbiBJR0EyIERlc2lnbiBNZXRob2Qgb2YgQ1JUQyBSZWdpc3RlcnMgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSUdBMl9IT1JfVE9UQUxfRk9STVVMQSh4KSAgICAgICAgICAgKCh4KS0xKQotI2RlZmluZSBJR0EyX0hPUl9BRERSX0ZPUk1VTEEoeCkgICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfSE9SX0JMQU5LX1NUQVJUX0ZPUk1VTEEoeCkgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9IT1JfQkxBTktfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICgoeCt5KS0xKQotI2RlZmluZSBJR0EyX0hPUl9TWU5DX1NUQVJUX0ZPUk1VTEEoeCkgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfSE9SX1NZTkNfRU5EX0ZPUk1VTEEoeCwgeSkgICAgICAoKHgreSktMSkKLQotI2RlZmluZSBJR0EyX1ZFUl9UT1RBTF9GT1JNVUxBKHgpICAgICAgICAgICAoKHgpLTEpCi0jZGVmaW5lIElHQTJfVkVSX0FERFJfRk9STVVMQSh4KSAgICAgICAgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9WRVJfQkxBTktfU1RBUlRfRk9STVVMQSh4KSAgICAgKCh4KS0xKQotI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19FTkRfRk9STVVMQSh4LCB5KSAgICAgKCh4K3kpLTEpCi0jZGVmaW5lIElHQTJfVkVSX1NZTkNfU1RBUlRfRk9STVVMQSh4KSAgICAgICgoeCktMSkKLSNkZWZpbmUgSUdBMl9WRVJfU1lOQ19FTkRfRk9STVVMQSh4LCB5KSAgICAgICgoeCt5KS0xKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlZmluaXRpb24gSUdBMiBEZXNpZ24gTWV0aG9kIG9mIENSVEMgU2hhZG93IFJlZ2lzdGVycyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NywzMyArNjMsNiBAQAogI2RlZmluZSBJR0EyX1ZFUl9TWU5DX1NUQVJUX1NIQURPV19GT1JNVUxBKHgpICAgICAgKHgpCiAjZGVmaW5lIElHQTJfVkVSX1NZTkNfRU5EX1NIQURPV19GT1JNVUxBKHgsIHkpICAgICAgKHgreSkKIAotLyogRGVmaW5lIFJlZ2lzdGVyIE51bWJlciBmb3IgSUdBMSBDUlRDIFRpbWluZyAqLwotCi0vKiBsb2NhdGlvbjoge0NSMDAsMCw3fSx7Q1IzNiwzLDN9ICovCi0jZGVmaW5lIElHQTFfSE9SX1RPVEFMX1JFR19OVU0JCTIKLS8qIGxvY2F0aW9uOiB7Q1IwMSwwLDd9ICovCi0jZGVmaW5lIElHQTFfSE9SX0FERFJfUkVHX05VTQkJMQotLyogbG9jYXRpb246IHtDUjAyLDAsN30gKi8KLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfU1RBUlRfUkVHX05VTSAgICAxCi0vKiBsb2NhdGlvbjoge0NSMDMsMCw0fSx7Q1IwNSw3LDd9LHtDUjMzLDUsNX0gKi8KLSNkZWZpbmUgSUdBMV9IT1JfQkxBTktfRU5EX1JFR19OVU0JMwotLyogbG9jYXRpb246IHtDUjA0LDAsN30se0NSMzMsNCw0fSAqLwotI2RlZmluZSBJR0ExX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0JMgotLyogbG9jYXRpb246IHtDUjA1LDAsNH0gKi8KLSNkZWZpbmUgSUdBMV9IT1JfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0vKiBsb2NhdGlvbjoge0NSMDYsMCw3fSx7Q1IwNywwLDB9LHtDUjA3LDUsNX0se0NSMzUsMCwwfSAqLwotI2RlZmluZSBJR0ExX1ZFUl9UT1RBTF9SRUdfTlVNICAgICAgICAgIDQKLS8qIGxvY2F0aW9uOiB7Q1IxMiwwLDd9LHtDUjA3LDEsMX0se0NSMDcsNiw2fSx7Q1IzNSwyLDJ9ICovCi0jZGVmaW5lIElHQTFfVkVSX0FERFJfUkVHX05VTSAgICAgICAgICAgNAotLyogbG9jYXRpb246IHtDUjE1LDAsN30se0NSMDcsMywzfSx7Q1IwOSw1LDV9LHtDUjM1LDMsM30gKi8KLSNkZWZpbmUgSUdBMV9WRVJfQkxBTktfU1RBUlRfUkVHX05VTSAgICA0Ci0vKiBsb2NhdGlvbjoge0NSMTYsMCw3fSAqLwotI2RlZmluZSBJR0ExX1ZFUl9CTEFOS19FTkRfUkVHX05VTSAgICAgIDEKLS8qIGxvY2F0aW9uOiB7Q1IxMCwwLDd9LHtDUjA3LDIsMn0se0NSMDcsNyw3fSx7Q1IzNSwxLDF9ICovCi0jZGVmaW5lIElHQTFfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSAgICAgNAotLyogbG9jYXRpb246IHtDUjExLDAsM30gKi8KLSNkZWZpbmUgSUdBMV9WRVJfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0KIC8qIERlZmluZSBSZWdpc3RlciBOdW1iZXIgZm9yIElHQTIgU2hhZG93IENSVEMgVGltaW5nICovCiAKIC8qIGxvY2F0aW9uOiB7Q1I2RCwwLDd9LHtDUjcxLDMsM30gKi8KQEAgLTE0MywzNyArODIsNiBAQAogLyogbG9jYXRpb246IHtDUjc2LDAsM30gKi8KICNkZWZpbmUgSUdBMl9TSEFET1dfVkVSX1NZTkNfRU5EX1JFR19OVU0gICAgMQogCi0vKiBEZWZpbmUgUmVnaXN0ZXIgTnVtYmVyIGZvciBJR0EyIENSVEMgVGltaW5nICovCi0KLS8qIGxvY2F0aW9uOiB7Q1I1MCwwLDd9LHtDUjU1LDAsM30gKi8KLSNkZWZpbmUgSUdBMl9IT1JfVE9UQUxfUkVHX05VTSAgICAgICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNTEsMCw3fSx7Q1I1NSw0LDZ9ICovCi0jZGVmaW5lIElHQTJfSE9SX0FERFJfUkVHX05VTSAgICAgICAgICAgMgotLyogbG9jYXRpb246IHtDUjUyLDAsN30se0NSNTQsMCwyfSAqLwotI2RlZmluZSBJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNICAgIDIKLS8qIGxvY2F0aW9uOiBDTEUyNjY6IHtDUjUzLDAsN30se0NSNTQsMyw1fSA9PiBDTEUyNjYncyBDUjVEWzZdCi1pcyByZXNlcnZlZCwgc28gaXQgbWF5IGhhdmUgcHJvYmxlbSB0byBzZXQgMTYwMHgxMjAwIG9uIElHQTIuICovCi0vKiAgICAgICAgIAlPdGhlcnM6IHtDUjUzLDAsN30se0NSNTQsMyw1fSx7Q1I1RCw2LDZ9ICovCi0jZGVmaW5lIElHQTJfSE9SX0JMQU5LX0VORF9SRUdfTlVNICAgICAgMwotLyogbG9jYXRpb246IHtDUjU2LDAsN30se0NSNTQsNiw3fSx7Q1I1Qyw3LDd9ICovCi0vKiBWVDMzMTQgYW5kIExhdGVyOiB7Q1I1NiwwLDd9LHtDUjU0LDYsN30se0NSNUMsNyw3fSwge0NSNUQsNyw3fSAqLwotI2RlZmluZSBJR0EyX0hPUl9TWU5DX1NUQVJUX1JFR19OVU0gICAgIDQKLQotLyogbG9jYXRpb246IHtDUjU3LDAsN30se0NSNUMsNiw2fSAqLwotI2RlZmluZSBJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNICAgICAgIDIKLS8qIGxvY2F0aW9uOiB7Q1I1OCwwLDd9LHtDUjVELDAsMn0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfVE9UQUxfUkVHX05VTSAgICAgICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNTksMCw3fSx7Q1I1RCwzLDV9ICovCi0jZGVmaW5lIElHQTJfVkVSX0FERFJfUkVHX05VTSAgICAgICAgICAgMgotLyogbG9jYXRpb246IHtDUjVBLDAsN30se0NSNUMsMCwyfSAqLwotI2RlZmluZSBJR0EyX1ZFUl9CTEFOS19TVEFSVF9SRUdfTlVNICAgIDIKLS8qIGxvY2F0aW9uOiB7Q1I1RSwwLDd9LHtDUjVDLDMsNX0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfQkxBTktfRU5EX1JFR19OVU0gICAgICAyCi0vKiBsb2NhdGlvbjoge0NSNUUsMCw3fSx7Q1I1Riw1LDd9ICovCi0jZGVmaW5lIElHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTSAgICAgMgotLyogbG9jYXRpb246IHtDUjVGLDAsNH0gKi8KLSNkZWZpbmUgSUdBMl9WRVJfU1lOQ19FTkRfUkVHX05VTSAgICAgICAxCi0KIC8qIERlZmluZSBGZXRjaCBDb3VudCBSZWdpc3RlciovCiAKIC8qIGxvY2F0aW9uOiB7U1IxQywwLDd9LHtTUjFELDAsMX0gKi8KQEAgLTQ0Niw4NyArMzU0LDEyIEBACiAvKiBsb2NhdGlvbjoge0NSNzgsMCw3fSx7Q1I3OSw2LDd9ICovCiAjZGVmaW5lIExDRF9WRVJfU0NBTElOR19GQUNUT1JfUkVHX05VTV9DTEUgIDIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqICAgICBEZWZpbmUgSUdBMSBEaXNwbGF5IFRpbWluZyAgICAgICAqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBpb19yZWdpc3RlciB7CiAJdTggaW9fYWRkcjsKIAl1OCBzdGFydF9iaXQ7CiAJdTggZW5kX2JpdDsKIH07CiAKLS8qIElHQTEgSG9yaXpvbnRhbCBUb3RhbCAqLwotc3RydWN0IGlnYTFfaG9yX3RvdGFsIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX1RPVEFMX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIEFkZHJlc3NhYmxlIFZpZGVvICovCi1zdHJ1Y3QgaWdhMV9ob3JfYWRkciB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9BRERSX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIEJsYW5rIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV9ob3JfYmxhbmtfc3RhcnQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfQkxBTktfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIEhvcml6b250YWwgQmxhbmsgRW5kICovCi1zdHJ1Y3QgaWdhMV9ob3JfYmxhbmtfZW5kIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfSE9SX0JMQU5LX0VORF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTEgSG9yaXpvbnRhbCBTeW5jIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV9ob3Jfc3luY19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX0hPUl9TWU5DX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBIb3Jpem9udGFsIFN5bmMgRW5kICovCi1zdHJ1Y3QgaWdhMV9ob3Jfc3luY19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9IT1JfU1lOQ19FTkRfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIFZlcnRpY2FsIFRvdGFsICovCi1zdHJ1Y3QgaWdhMV92ZXJfdG90YWwgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfVE9UQUxfUkVHX05VTV07Ci19OwotCi0vKiBJR0ExIFZlcnRpY2FsIEFkZHJlc3NhYmxlIFZpZGVvICovCi1zdHJ1Y3QgaWdhMV92ZXJfYWRkciB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9BRERSX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBCbGFuayBTdGFydCAqLwotc3RydWN0IGlnYTFfdmVyX2JsYW5rX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX0JMQU5LX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBCbGFuayBFbmQgKi8KLXN0cnVjdCBpZ2ExX3Zlcl9ibGFua19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMV9WRVJfQkxBTktfRU5EX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBTeW5jIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMV92ZXJfc3luY19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0ExX1ZFUl9TWU5DX1NUQVJUX1JFR19OVU1dOwotfTsKLQotLyogSUdBMSBWZXJ0aWNhbCBTeW5jIEVuZCAqLwotc3RydWN0IGlnYTFfdmVyX3N5bmNfZW5kIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTFfVkVSX1NZTkNfRU5EX1JFR19OVU1dOwotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiAgICAgIERlZmluZSBJR0EyIFNoYWRvdyBEaXNwbGF5IFRpbWluZyAgICAgICAgICoqKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTc5LDgyICs0MTIsNiBAQAogCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9TSEFET1dfVkVSX1NZTkNfRU5EX1JFR19OVU1dOwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKiAgICAgIERlZmluZSBJR0EyIERpc3BsYXkgVGltaW5nICAgICAgICAgICAgICAgICoqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSUdBMiBIb3Jpem9udGFsIFRvdGFsICovCi1zdHJ1Y3QgaWdhMl9ob3JfdG90YWwgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfVE9UQUxfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLXN0cnVjdCBpZ2EyX2hvcl9hZGRyIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX0FERFJfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgQmxhbmsgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9ibGFua19zdGFydCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9CTEFOS19TVEFSVF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgSG9yaXpvbnRhbCBCbGFuayBFbmQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9ibGFua19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9IT1JfQkxBTktfRU5EX1JFR19OVU1dOwotfTsKLQotLyogSUdBMiBIb3Jpem9udGFsIFN5bmMgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9zeW5jX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfSE9SX1NZTkNfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIEhvcml6b250YWwgU3luYyBFbmQgKi8KLXN0cnVjdCBpZ2EyX2hvcl9zeW5jX2VuZCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX0hPUl9TWU5DX0VORF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgVmVydGljYWwgVG90YWwgKi8KLXN0cnVjdCBpZ2EyX3Zlcl90b3RhbCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9UT1RBTF9SRUdfTlVNXTsKLX07Ci0KLS8qIElHQTIgVmVydGljYWwgQWRkcmVzc2FibGUgVmlkZW8gKi8KLXN0cnVjdCBpZ2EyX3Zlcl9hZGRyIHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX0FERFJfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIEJsYW5rIFN0YXJ0ICovCi1zdHJ1Y3QgaWdhMl92ZXJfYmxhbmtfc3RhcnQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfQkxBTktfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIEJsYW5rIEVuZCAqLwotc3RydWN0IGlnYTJfdmVyX2JsYW5rX2VuZCB7Ci0JaW50IHJlZ19udW07Ci0Jc3RydWN0IGlvX3JlZ2lzdGVyIHJlZ1tJR0EyX1ZFUl9CTEFOS19FTkRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIFN5bmMgU3RhcnQgKi8KLXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX3N0YXJ0IHsKLQlpbnQgcmVnX251bTsKLQlzdHJ1Y3QgaW9fcmVnaXN0ZXIgcmVnW0lHQTJfVkVSX1NZTkNfU1RBUlRfUkVHX05VTV07Ci19OwotCi0vKiBJR0EyIFZlcnRpY2FsIFN5bmMgRW5kICovCi1zdHJ1Y3QgaWdhMl92ZXJfc3luY19lbmQgewotCWludCByZWdfbnVtOwotCXN0cnVjdCBpb19yZWdpc3RlciByZWdbSUdBMl9WRVJfU1lOQ19FTkRfUkVHX05VTV07Ci19OwotCiAvKiBJR0ExIEZldGNoIENvdW50IFJlZ2lzdGVyICovCiBzdHJ1Y3QgaWdhMV9mZXRjaF9jb3VudCB7CiAJaW50IHJlZ19udW07CkBAIC04MTcsMjEgKzU3NCw2IEBACiAJIGlnYTJfZGlzcGxheV9xdWV1ZV9leHBpcmVfbnVtX3JlZzsKIH07CiAKLXN0cnVjdCBpZ2ExX2NydGNfdGltaW5nIHsKLQlzdHJ1Y3QgaWdhMV9ob3JfdG90YWwgaG9yX3RvdGFsOwotCXN0cnVjdCBpZ2ExX2hvcl9hZGRyIGhvcl9hZGRyOwotCXN0cnVjdCBpZ2ExX2hvcl9ibGFua19zdGFydCBob3JfYmxhbmtfc3RhcnQ7Ci0Jc3RydWN0IGlnYTFfaG9yX2JsYW5rX2VuZCBob3JfYmxhbmtfZW5kOwotCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX3N0YXJ0IGhvcl9zeW5jX3N0YXJ0OwotCXN0cnVjdCBpZ2ExX2hvcl9zeW5jX2VuZCBob3Jfc3luY19lbmQ7Ci0Jc3RydWN0IGlnYTFfdmVyX3RvdGFsIHZlcl90b3RhbDsKLQlzdHJ1Y3QgaWdhMV92ZXJfYWRkciB2ZXJfYWRkcjsKLQlzdHJ1Y3QgaWdhMV92ZXJfYmxhbmtfc3RhcnQgdmVyX2JsYW5rX3N0YXJ0OwotCXN0cnVjdCBpZ2ExX3Zlcl9ibGFua19lbmQgdmVyX2JsYW5rX2VuZDsKLQlzdHJ1Y3QgaWdhMV92ZXJfc3luY19zdGFydCB2ZXJfc3luY19zdGFydDsKLQlzdHJ1Y3QgaWdhMV92ZXJfc3luY19lbmQgdmVyX3N5bmNfZW5kOwotfTsKLQogc3RydWN0IGlnYTJfc2hhZG93X2NydGNfdGltaW5nIHsKIAlzdHJ1Y3QgaWdhMl9zaGFkb3dfaG9yX3RvdGFsIGhvcl90b3RhbF9zaGFkb3c7CiAJc3RydWN0IGlnYTJfc2hhZG93X2hvcl9ibGFua19lbmQgaG9yX2JsYW5rX2VuZF9zaGFkb3c7CkBAIC04NDMsMjEgKzU4NSw2IEBACiAJc3RydWN0IGlnYTJfc2hhZG93X3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmRfc2hhZG93OwogfTsKIAotc3RydWN0IGlnYTJfY3J0Y190aW1pbmcgewotCXN0cnVjdCBpZ2EyX2hvcl90b3RhbCBob3JfdG90YWw7Ci0Jc3RydWN0IGlnYTJfaG9yX2FkZHIgaG9yX2FkZHI7Ci0Jc3RydWN0IGlnYTJfaG9yX2JsYW5rX3N0YXJ0IGhvcl9ibGFua19zdGFydDsKLQlzdHJ1Y3QgaWdhMl9ob3JfYmxhbmtfZW5kIGhvcl9ibGFua19lbmQ7Ci0Jc3RydWN0IGlnYTJfaG9yX3N5bmNfc3RhcnQgaG9yX3N5bmNfc3RhcnQ7Ci0Jc3RydWN0IGlnYTJfaG9yX3N5bmNfZW5kIGhvcl9zeW5jX2VuZDsKLQlzdHJ1Y3QgaWdhMl92ZXJfdG90YWwgdmVyX3RvdGFsOwotCXN0cnVjdCBpZ2EyX3Zlcl9hZGRyIHZlcl9hZGRyOwotCXN0cnVjdCBpZ2EyX3Zlcl9ibGFua19zdGFydCB2ZXJfYmxhbmtfc3RhcnQ7Ci0Jc3RydWN0IGlnYTJfdmVyX2JsYW5rX2VuZCB2ZXJfYmxhbmtfZW5kOwotCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX3N0YXJ0IHZlcl9zeW5jX3N0YXJ0OwotCXN0cnVjdCBpZ2EyX3Zlcl9zeW5jX2VuZCB2ZXJfc3luY19lbmQ7Ci19OwotCiAvKiBkZXZpY2UgSUQgKi8KICNkZWZpbmUgQ0xFMjY2X0ZVTkNUSU9OMyAgICAweDMxMjMKICNkZWZpbmUgS000MDBfRlVOQ1RJT04zICAgICAweDMyMDUKQEAgLTkxMCw5ICs2MzcsNyBAQAogZXh0ZXJuIGludCB2aWFmYl9EVklfT047CiBleHRlcm4gaW50IHZpYWZiX2hvdHBsdWc7CiAKLXZvaWQgdmlhZmJfZmlsbF9jcnRjX3RpbWluZyhzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmNydF90YWJsZSwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpZGVvX21vZGUsIGludCBicHBfYnl0ZSwgaW50IHNldF9pZ2EpOwotCit2b2lkIHZpYWZiX2ZpbGxfY3J0Y190aW1pbmcoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpZ2EpOwogdm9pZCB2aWFmYl9zZXRfdmNsb2NrKHUzMiBDTEssIGludCBzZXRfaWdhKTsKIHZvaWQgdmlhZmJfbG9hZF9yZWcoaW50IHRpbWluZ192YWx1ZSwgaW50IHZpYWZiX2xvYWRfcmVnX251bSwKIAlzdHJ1Y3QgaW9fcmVnaXN0ZXIgKnJlZywKQEAgLTkzMiwxMyArNjU3LDExIEBACiB2b2lkIHZpYWZiX3NldF9kcGFfZ2Z4KGludCBvdXRwdXRfaW50ZXJmYWNlLCBzdHJ1Y3QgR0ZYX0RQQV9TRVRUSU5HXAogCQkJCQkqcF9nZnhfZHBhX3NldHRpbmcpOwogCi1pbnQgdmlhZmJfc2V0bW9kZShzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibCwgaW50IHZpZGVvX2JwcCwKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX3RibDEsIGludCB2aWRlb19icHAxKTsKLXZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCByZWZyZXNoLAotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfdGJsKTsKK2ludCB2aWFmYl9zZXRtb2RlKGludCB2aWRlb19icHAsIGludCB2aWRlb19icHAxKTsKK3ZvaWQgdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlKTsKIHZvaWQgX19kZXZpbml0IHZpYWZiX2luaXRfY2hpcF9pbmZvKGludCBjaGlwX3R5cGUpOwogdm9pZCBfX2RldmluaXQgdmlhZmJfaW5pdF9kYWMoaW50IHNldF9pZ2EpOwotaW50IHZpYWZiX2dldF9waXhjbG9jayhpbnQgaHJlcywgaW50IHZyZXMsIGludCB2bW9kZV9yZWZyZXNoKTsKIGludCB2aWFmYl9nZXRfcmVmcmVzaChpbnQgaHJlcywgaW50IHZyZXMsIHUzMiBmbG9hdF9yZWZyZXNoKTsKIHZvaWQgdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKGludCBocmVzLCBpbnQgdnJlcywgaW50IGJwcCwgaW50IGZsYWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9sY2QuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCmluZGV4IDZlMDY5ODEuLjVmM2I0ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5jCkBAIC01NDgsOSArNTQ4LDggQEAKIH0KIAogLyogTENEIFNldCBNb2RlICovCi12b2lkIHZpYWZiX2xjZF9zZXRfbW9kZShzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKm1vZGVfY3J0X3RhYmxlLAotCQkgIHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKLQkJICBzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pCit2b2lkIHZpYWZiX2xjZF9zZXRfbW9kZShzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCisJc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKQogewogCWludCBzZXRfaWdhID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5pZ2FfcGF0aDsKIAlpbnQgbW9kZV9icHAgPSBwbHZkc19zZXR0aW5nX2luZm8tPmJwcDsKQEAgLTU1OSwxNiArNTU4LDE1IEBACiAJaW50IHBhbmVsX2hyZXMgPSBwbHZkc19zZXR0aW5nX2luZm8tPmxjZF9wYW5lbF9ocmVzOwogCWludCBwYW5lbF92cmVzID0gcGx2ZHNfc2V0dGluZ19pbmZvLT5sY2RfcGFuZWxfdnJlczsKIAl1MzIgY2xvY2s7Ci0Jc3RydWN0IGRpc3BsYXlfdGltaW5nIG1vZGVfY3J0X3JlZywgcGFuZWxfY3J0X3JlZzsKLQlzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKnBhbmVsX2NydF90YWJsZSA9IE5VTEw7Ci0Jc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bW9kZV90YmwgPSB2aWFmYl9nZXRfbW9kZShwYW5lbF9ocmVzLAotCQlwYW5lbF92cmVzKTsKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgbW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnLCB0aW1pbmc7CisJc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlX2NydF90YWJsZSwgKnBhbmVsX2NydF90YWJsZTsKIAogCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2xjZF9zZXRfbW9kZSEhXG4iKTsKIAkvKiBHZXQgbW9kZSB0YWJsZSAqLworCW1vZGVfY3J0X3RhYmxlID0gdmlhZmJfZ2V0X2Jlc3RfbW9kZShzZXRfaHJlcywgc2V0X3ZyZXMsIDYwKTsKIAltb2RlX2NydF9yZWcgPSBtb2RlX2NydF90YWJsZS0+Y3J0YzsKIAkvKiBHZXQgcGFuZWwgdGFibGUgUG9pbnRlciAqLwotCXBhbmVsX2NydF90YWJsZSA9IHZtb2RlX3RibC0+Y3J0YzsKKwlwYW5lbF9jcnRfdGFibGUgPSB2aWFmYl9nZXRfYmVzdF9tb2RlKHBhbmVsX2hyZXMsIHBhbmVsX3ZyZXMsIDYwKTsKIAlwYW5lbF9jcnRfcmVnID0gcGFuZWxfY3J0X3RhYmxlLT5jcnRjOwogCURFQlVHX01TRyhLRVJOX0lORk8gImJlbGxvdyB2aWFmYl9sY2Rfc2V0X21vZGUhIVxuIik7CiAJaWYgKFZUMTYzNl9MVkRTID09IHBsdmRzX2NoaXBfaW5mby0+bHZkc19jaGlwX25hbWUpCkBAIC01NzYsMzEgKzU3NCwyOCBAQAogCWNsb2NrID0gcGFuZWxfY3J0X3JlZy5ob3JfdG90YWwgKiBwYW5lbF9jcnRfcmVnLnZlcl90b3RhbAogCQkqIHBhbmVsX2NydF90YWJsZS0+cmVmcmVzaF9yYXRlOwogCXBsdmRzX3NldHRpbmdfaW5mby0+dmNsayA9IGNsb2NrOwotCWlmIChzZXRfaWdhID09IElHQTEpIHsKLQkJLyogSUdBMSBkb2Vzbid0IGhhdmUgTENEIHNjYWxpbmcsIHNvIHNldCBpdCBhcyBjZW50ZXJpbmcuICovCi0JCXZpYWZiX2xvYWRfY3J0Y190aW1pbmcobGNkX2NlbnRlcmluZ190aW1naW5nCi0JCQkJIChtb2RlX2NydF9yZWcsIHBhbmVsX2NydF9yZWcpLCBJR0ExKTsKKworCWlmIChzZXRfaWdhID09IElHQTIgJiYgKHNldF9ocmVzIDwgcGFuZWxfaHJlcyB8fCBzZXRfdnJlcyA8IHBhbmVsX3ZyZXMpCisJCSYmIHBsdmRzX3NldHRpbmdfaW5mby0+ZGlzcGxheV9tZXRob2QgPT0gTENEX0VYUEFORFNJT04pIHsKKwkJdGltaW5nID0gcGFuZWxfY3J0X3JlZzsKKwkJbG9hZF9sY2Rfc2NhbGluZyhzZXRfaHJlcywgc2V0X3ZyZXMsIHBhbmVsX2hyZXMsIHBhbmVsX3ZyZXMpOwogCX0gZWxzZSB7Ci0JCS8qIEV4cGFuc2lvbiAqLwotCQlpZiAocGx2ZHNfc2V0dGluZ19pbmZvLT5kaXNwbGF5X21ldGhvZCA9PSBMQ0RfRVhQQU5EU0lPTgotCQkJJiYgKHNldF9ocmVzIDwgcGFuZWxfaHJlcyB8fCBzZXRfdnJlcyA8IHBhbmVsX3ZyZXMpKSB7Ci0JCQkvKiBleHBhbnNpb24gdGltaW5nIElHQTIgbG9hZGVkIHBhbmVsIHNldCB0aW1pbmcqLwotCQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhwYW5lbF9jcnRfcmVnLCBJR0EyKTsKLQkJCURFQlVHX01TRyhLRVJOX0lORk8gInZpYWZiX2xvYWRfY3J0Y190aW1pbmchIVxuIik7Ci0JCQlsb2FkX2xjZF9zY2FsaW5nKHNldF9ocmVzLCBzZXRfdnJlcywgcGFuZWxfaHJlcywKLQkJCQkJIHBhbmVsX3ZyZXMpOwotCQkJREVCVUdfTVNHKEtFUk5fSU5GTyAibG9hZF9sY2Rfc2NhbGluZyEhXG4iKTsKLQkJfSBlbHNlIHsJLyogQ2VudGVyaW5nICovCi0JCQkvKiBjZW50ZXJpbmcgdGltaW5nIElHQTIgYWx3YXlzIGxvYWRlZCBwYW5lbAotCQkJICAgYW5kIG1vZGUgcmVsZWF0aXZlIHRpbWluZyAqLwotCQkJdmlhZmJfbG9hZF9jcnRjX3RpbWluZyhsY2RfY2VudGVyaW5nX3RpbWdpbmcKLQkJCQkJIChtb2RlX2NydF9yZWcsIHBhbmVsX2NydF9yZWcpLCBJR0EyKTsKLQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSNzksIFZJQUNSLCAweDAwLAorCQl0aW1pbmcgPSBsY2RfY2VudGVyaW5nX3RpbWdpbmcobW9kZV9jcnRfcmVnLCBwYW5lbF9jcnRfcmVnKTsKKwkJaWYgKHNldF9pZ2EgPT0gSUdBMikKKwkJCS8qIGRpc2FibGUgc2NhbGluZyAqLworCQkJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDc5LCAweDAwLAogCQkJCUJJVDAgKyBCSVQxICsgQklUMik7Ci0JCQkvKiBMQ0Qgc2NhbGluZyBkaXNhYmxlZCAqLwotCQl9CiAJfQogCisJdGltaW5nLmhvcl9ibGFua19lbmQgKz0gdGltaW5nLmhvcl9ibGFua19zdGFydDsKKwl0aW1pbmcuaG9yX3N5bmNfZW5kICs9IHRpbWluZy5ob3Jfc3luY19zdGFydDsKKwl0aW1pbmcudmVyX2JsYW5rX2VuZCArPSB0aW1pbmcudmVyX2JsYW5rX3N0YXJ0OworCXRpbWluZy52ZXJfc3luY19lbmQgKz0gdGltaW5nLnZlcl9zeW5jX3N0YXJ0OworCWlmIChzZXRfaWdhID09IElHQTEpCisJCXZpYV9zZXRfcHJpbWFyeV90aW1pbmcoJnRpbWluZyk7CisJZWxzZSBpZiAoc2V0X2lnYSA9PSBJR0EyKQorCQl2aWFfc2V0X3NlY29uZGFyeV90aW1pbmcoJnRpbWluZyk7CisKIAkvKiBGZXRjaCBjb3VudCBmb3IgSUdBMiBvbmx5ICovCiAJdmlhZmJfbG9hZF9mZXRjaF9jb3VudF9yZWcoc2V0X2hyZXMsIG1vZGVfYnBwIC8gOCwgc2V0X2lnYSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL2xjZC5oIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmgKaW5kZXggNzVmNjBhNi4uNzdjYTdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvbGNkLmgKKysrIGIvZHJpdmVycy92aWRlby92aWEvbGNkLmgKQEAgLTc2LDE2ICs3NiwxMyBAQAogCQkJCSpwbHZkc19jaGlwX2luZm8sCiAJCQkJc3RydWN0IGx2ZHNfc2V0dGluZ19pbmZvcm1hdGlvbgogCQkJCSpwbHZkc19zZXR0aW5nX2luZm8pOwotdm9pZCB2aWFmYl9sY2Rfc2V0X21vZGUoc3RydWN0IGNydF9tb2RlX3RhYmxlICptb2RlX2NydF90YWJsZSwKLQkJICBzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uICpwbHZkc19zZXR0aW5nX2luZm8sCi0JCSAgc3RydWN0IGx2ZHNfY2hpcF9pbmZvcm1hdGlvbiAqcGx2ZHNfY2hpcF9pbmZvKTsKK3ZvaWQgdmlhZmJfbGNkX3NldF9tb2RlKHN0cnVjdCBsdmRzX3NldHRpbmdfaW5mb3JtYXRpb24gKnBsdmRzX3NldHRpbmdfaW5mbywKKwlzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uICpwbHZkc19jaGlwX2luZm8pOwogYm9vbCBfX2RldmluaXQgdmlhZmJfbHZkc190cmFzbWl0dGVyX2lkZW50aWZ5KHZvaWQpOwogdm9pZCB2aWFmYl9pbml0X2x2ZHNfb3V0cHV0X2ludGVyZmFjZShzdHJ1Y3QgbHZkc19jaGlwX2luZm9ybWF0aW9uCiAJCQkJKnBsdmRzX2NoaXBfaW5mbywKIAkJCQlzdHJ1Y3QgbHZkc19zZXR0aW5nX2luZm9ybWF0aW9uCiAJCQkJKnBsdmRzX3NldHRpbmdfaW5mbyk7CiBib29sIHZpYWZiX2xjZF9nZXRfbW9iaWxlX3N0YXRlKGJvb2wgKm1vYmlsZSk7Ci12b2lkIHZpYWZiX2xvYWRfY3J0Y190aW1pbmcoc3RydWN0IGRpc3BsYXlfdGltaW5nIGRldmljZV90aW1pbmcsCi0JaW50IHNldF9pZ2EpOwogCiAjZW5kaWYgLyogX19MQ0RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oIGIvZHJpdmVycy92aWRlby92aWEvc2hhcmUuaAppbmRleCA2MWIwYmQ1Li42OWQ4ODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS9zaGFyZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3NoYXJlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpZm5kZWYgX19TSEFSRV9IX18KICNkZWZpbmUgX19TSEFSRV9IX18KIAorI2luY2x1ZGUgInZpYV9tb2Rlc2V0dGluZy5oIgorCiAvKiBEZWZpbmUgQml0IEZpZWxkICovCiAjZGVmaW5lIEJJVDAgICAgMHgwMQogI2RlZmluZSBCSVQxICAgIDB4MDIKQEAgLTYzNCwxMCArNjM2LDYgQEAKICNkZWZpbmUgVl9TWU5DX1NBVFJUX1NIQURPV19JTkRFWCAgIDE4CiAjZGVmaW5lIFZfU1lOQ19FTkRfU0hBRE9XX0lOREVYICAgICAxOQogCi0vKiBEZWZpbml0aW9uIFZpZGVvIE1vZGUgUGl4ZWwgQ2xvY2sgKHBpY29zZWNvbmRzKQotKi8KLSNkZWZpbmUgUkVTXzY0MFg0ODBfNjBIWl9QSVhDTE9DSyAgICAzOTcyMgotCiAvKiBMQ0QgZGlzcGxheSBtZXRob2QKICovCiAjZGVmaW5lICAgICBMQ0RfRVhQQU5EU0lPTiAgICAgICAgICAgICAgMHgwMApAQCAtNjQ4LDIzICs2NDYsNiBAQAogI2RlZmluZSAgICAgTENEX09QRU5MREkgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lICAgICBMQ0RfU1BXRyAgICAgICAgICAgICAgICAgIDB4MDEKIAotLyogRGVmaW5lIGRpc3BsYXkgdGltaW5nCi0qLwotc3RydWN0IGRpc3BsYXlfdGltaW5nIHsKLQl1MTYgaG9yX3RvdGFsOwotCXUxNiBob3JfYWRkcjsKLQl1MTYgaG9yX2JsYW5rX3N0YXJ0OwotCXUxNiBob3JfYmxhbmtfZW5kOwotCXUxNiBob3Jfc3luY19zdGFydDsKLQl1MTYgaG9yX3N5bmNfZW5kOwotCXUxNiB2ZXJfdG90YWw7Ci0JdTE2IHZlcl9hZGRyOwotCXUxNiB2ZXJfYmxhbmtfc3RhcnQ7Ci0JdTE2IHZlcl9ibGFua19lbmQ7Ci0JdTE2IHZlcl9zeW5jX3N0YXJ0OwotCXUxNiB2ZXJfc3luY19lbmQ7Ci19OwotCiBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgewogCWludCByZWZyZXNoX3JhdGU7CiAJaW50IGhfc3luY19wb2xhcml0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWEtY29yZS5jCmluZGV4IGViMTEyYjYuLmRkNThiNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhLWNvcmUuYwpAQCAtMzUsNyArMzUsNyBAQAogICogVGhlIE9MUEMgWE8tMS41IHB1dHMgdGhlIGNhbWVyYSBwb3dlciBhbmQgcmVzZXQgbGluZXMgb250bwogICogR1BJTyAyQy4KICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2aWFfcG9ydF9jZmcgb2xwY19hZGFwX2NvbmZpZ3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdmlhX3BvcnRfY2ZnIG9scGNfYWRhcF9jb25maWdzW10gPSB7CiAJW1ZJQV9QT1JUXzI2XQk9IHsgVklBX1BPUlRfSTJDLCAgVklBX01PREVfSTJDLCBWSUFTUiwgMHgyNiB9LAogCVtWSUFfUE9SVF8zMV0JPSB7IFZJQV9QT1JUX0kyQywgIFZJQV9NT0RFX0kyQywgVklBU1IsIDB4MzEgfSwKIAlbVklBX1BPUlRfMjVdCT0geyBWSUFfUE9SVF9HUElPLCBWSUFfTU9ERV9HUElPLCBWSUFTUiwgMHgyNSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhLWdwaW8uYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYS1ncGlvLmMKaW5kZXggYWI1MzQxOC4uZDY5Y2ZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhLWdwaW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWEtZ3Bpby5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdmlhLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC92aWEtZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAvKgogICogVGhlIHBvcnRzIHdlIGtub3cgYWJvdXQuICBOb3RlIHRoYXQgdGhlIHBvcnQtMjUgZ3Bpb3MgYXJlIG5vdApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX21vZGVzZXR0aW5nLmMgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYwppbmRleCAzY2RkY2ZmLi4wZTQzMWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuYwpAQCAtMjksNiArMjksMTEwIEBACiAjaW5jbHVkZSAic2hhcmUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisKK3ZvaWQgdmlhX3NldF9wcmltYXJ5X3RpbWluZyhjb25zdCBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgKnRpbWluZykKK3sKKwlzdHJ1Y3QgZGlzcGxheV90aW1pbmcgcmF3OworCisJcmF3Lmhvcl90b3RhbCA9IHRpbWluZy0+aG9yX3RvdGFsIC8gOCAtIDU7CisJcmF3Lmhvcl9hZGRyID0gdGltaW5nLT5ob3JfYWRkciAvIDggLSAxOworCXJhdy5ob3JfYmxhbmtfc3RhcnQgPSB0aW1pbmctPmhvcl9ibGFua19zdGFydCAvIDggLSAxOworCXJhdy5ob3JfYmxhbmtfZW5kID0gdGltaW5nLT5ob3JfYmxhbmtfZW5kIC8gOCAtIDE7CisJcmF3Lmhvcl9zeW5jX3N0YXJ0ID0gdGltaW5nLT5ob3Jfc3luY19zdGFydCAvIDg7CisJcmF3Lmhvcl9zeW5jX2VuZCA9IHRpbWluZy0+aG9yX3N5bmNfZW5kIC8gODsKKwlyYXcudmVyX3RvdGFsID0gdGltaW5nLT52ZXJfdG90YWwgLSAyOworCXJhdy52ZXJfYWRkciA9IHRpbWluZy0+dmVyX2FkZHIgLSAxOworCXJhdy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmctPnZlcl9ibGFua19zdGFydCAtIDE7CisJcmF3LnZlcl9ibGFua19lbmQgPSB0aW1pbmctPnZlcl9ibGFua19lbmQgLSAxOworCXJhdy52ZXJfc3luY19zdGFydCA9IHRpbWluZy0+dmVyX3N5bmNfc3RhcnQgLSAxOworCXJhdy52ZXJfc3luY19lbmQgPSB0aW1pbmctPnZlcl9zeW5jX2VuZCAtIDE7CisKKwkvKiB1bmxvY2sgdGltaW5nIHJlZ2lzdGVycyAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxMSwgMHgwMCwgMHg4MCk7CisKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDAwLCByYXcuaG9yX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgwMSwgcmF3Lmhvcl9hZGRyICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgwMiwgcmF3Lmhvcl9ibGFua19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgwMywgcmF3Lmhvcl9ibGFua19lbmQgJiAweDFGLCAweDFGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDA0LCByYXcuaG9yX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MDUsIChyYXcuaG9yX3N5bmNfZW5kICYgMHgxRikKKwkJfCAocmF3Lmhvcl9ibGFua19lbmQgPDwgKDcgLSA1KSAmIDB4ODApLCAweDlGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDA2LCByYXcudmVyX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDA3LCAocmF3LnZlcl90b3RhbCA+PiA4ICYgMHgwMSkKKwkJfCAocmF3LnZlcl9hZGRyID4+ICg4IC0gMSkgJiAweDAyKQorCQl8IChyYXcudmVyX3N5bmNfc3RhcnQgPj4gKDggLSAyKSAmIDB4MDQpCisJCXwgKHJhdy52ZXJfYmxhbmtfc3RhcnQgPj4gKDggLSAzKSAmIDB4MDgpCisJCXwgKHJhdy52ZXJfdG90YWwgPj4gKDkgLSA1KSAmIDB4MjApCisJCXwgKHJhdy52ZXJfYWRkciA+PiAoOSAtIDYpICYgMHg0MCkKKwkJfCAocmF3LnZlcl9zeW5jX3N0YXJ0ID4+ICg5IC0gNykgJiAweDgwKSwgMHhFRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDA5LCByYXcudmVyX2JsYW5rX3N0YXJ0ID4+ICg5IC0gNSkgJiAweDIwLAorCQkweDIwKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDEwLCByYXcudmVyX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MTEsIHJhdy52ZXJfc3luY19lbmQgJiAweDBGLCAweDBGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDEyLCByYXcudmVyX2FkZHIgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDE1LCByYXcudmVyX2JsYW5rX3N0YXJ0ICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHgxNiwgcmF3LnZlcl9ibGFua19lbmQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4MzMsIChyYXcuaG9yX3N5bmNfc3RhcnQgPj4gKDggLSA0KSAmIDB4MTApCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICg2IC0gNSkgJiAweDIwKSwgMHgzMCk7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDM1LCAocmF3LnZlcl90b3RhbCA+PiAxMCAmIDB4MDEpCisJCXwgKHJhdy52ZXJfc3luY19zdGFydCA+PiAoMTAgLSAxKSAmIDB4MDIpCisJCXwgKHJhdy52ZXJfYWRkciA+PiAoMTAgLSAyKSAmIDB4MDQpCisJCXwgKHJhdy52ZXJfYmxhbmtfc3RhcnQgPj4gKDEwIC0gMykgJiAweDA4KSwgMHgwRik7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDM2LCByYXcuaG9yX3RvdGFsID4+ICg4IC0gMykgJiAweDA4LCAweDA4KTsKKworCS8qIGxvY2sgdGltaW5nIHJlZ2lzdGVycyAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxMSwgMHg4MCwgMHg4MCk7CisKKwkvKiByZXNldCB0aW1pbmcgY29udHJvbCAqLworCXZpYV93cml0ZV9yZWdfbWFzayhWSUFDUiwgMHgxNywgMHgwMCwgMHg4MCk7CisJdmlhX3dyaXRlX3JlZ19tYXNrKFZJQUNSLCAweDE3LCAweDgwLCAweDgwKTsKK30KKwordm9pZCB2aWFfc2V0X3NlY29uZGFyeV90aW1pbmcoY29uc3Qgc3RydWN0IGRpc3BsYXlfdGltaW5nICp0aW1pbmcpCit7CisJc3RydWN0IGRpc3BsYXlfdGltaW5nIHJhdzsKKworCXJhdy5ob3JfdG90YWwgPSB0aW1pbmctPmhvcl90b3RhbCAtIDE7CisJcmF3Lmhvcl9hZGRyID0gdGltaW5nLT5ob3JfYWRkciAtIDE7CisJcmF3Lmhvcl9ibGFua19zdGFydCA9IHRpbWluZy0+aG9yX2JsYW5rX3N0YXJ0IC0gMTsKKwlyYXcuaG9yX2JsYW5rX2VuZCA9IHRpbWluZy0+aG9yX2JsYW5rX2VuZCAtIDE7CisJcmF3Lmhvcl9zeW5jX3N0YXJ0ID0gdGltaW5nLT5ob3Jfc3luY19zdGFydCAtIDE7CisJcmF3Lmhvcl9zeW5jX2VuZCA9IHRpbWluZy0+aG9yX3N5bmNfZW5kIC0gMTsKKwlyYXcudmVyX3RvdGFsID0gdGltaW5nLT52ZXJfdG90YWwgLSAxOworCXJhdy52ZXJfYWRkciA9IHRpbWluZy0+dmVyX2FkZHIgLSAxOworCXJhdy52ZXJfYmxhbmtfc3RhcnQgPSB0aW1pbmctPnZlcl9ibGFua19zdGFydCAtIDE7CisJcmF3LnZlcl9ibGFua19lbmQgPSB0aW1pbmctPnZlcl9ibGFua19lbmQgLSAxOworCXJhdy52ZXJfc3luY19zdGFydCA9IHRpbWluZy0+dmVyX3N5bmNfc3RhcnQgLSAxOworCXJhdy52ZXJfc3luY19lbmQgPSB0aW1pbmctPnZlcl9zeW5jX2VuZCAtIDE7CisKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDUwLCByYXcuaG9yX3RvdGFsICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1MSwgcmF3Lmhvcl9hZGRyICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1MiwgcmF3Lmhvcl9ibGFua19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NTMsIHJhdy5ob3JfYmxhbmtfZW5kICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1NCwgKHJhdy5ob3JfYmxhbmtfc3RhcnQgPj4gOCAmIDB4MDcpCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICg4IC0gMykgJiAweDM4KQorCQl8IChyYXcuaG9yX3N5bmNfc3RhcnQgPj4gKDggLSA2KSAmIDB4QzApKTsKKwl2aWFfd3JpdGVfcmVnX21hc2soVklBQ1IsIDB4NTUsIChyYXcuaG9yX3RvdGFsID4+IDggJiAweDBGKQorCQl8IChyYXcuaG9yX2FkZHIgPj4gKDggLSA0KSAmIDB4NzApLCAweDdGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDU2LCByYXcuaG9yX3N5bmNfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDU3LCByYXcuaG9yX3N5bmNfZW5kICYgMHhGRik7CisJdmlhX3dyaXRlX3JlZyhWSUFDUiwgMHg1OCwgcmF3LnZlcl90b3RhbCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NTksIHJhdy52ZXJfYWRkciAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUEsIHJhdy52ZXJfYmxhbmtfc3RhcnQgJiAweEZGKTsKKwl2aWFfd3JpdGVfcmVnKFZJQUNSLCAweDVCLCByYXcudmVyX2JsYW5rX2VuZCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUMsIChyYXcudmVyX2JsYW5rX3N0YXJ0ID4+IDggJiAweDA3KQorCQl8IChyYXcudmVyX2JsYW5rX2VuZCA+PiAoOCAtIDMpICYgMHgzOCkKKwkJfCAocmF3Lmhvcl9zeW5jX2VuZCA+PiAoOCAtIDYpICYgMHg0MCkKKwkJfCAocmF3Lmhvcl9zeW5jX3N0YXJ0ID4+ICgxMCAtIDcpICYgMHg4MCkpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUQsIChyYXcudmVyX3RvdGFsID4+IDggJiAweDA3KQorCQl8IChyYXcudmVyX2FkZHIgPj4gKDggLSAzKSAmIDB4MzgpCisJCXwgKHJhdy5ob3JfYmxhbmtfZW5kID4+ICgxMSAtIDYpICYgMHg0MCkKKwkJfCAocmF3Lmhvcl9zeW5jX3N0YXJ0ID4+ICgxMSAtIDcpICYgMHg4MCkpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUUsIHJhdy52ZXJfc3luY19zdGFydCAmIDB4RkYpOworCXZpYV93cml0ZV9yZWcoVklBQ1IsIDB4NUYsIChyYXcudmVyX3N5bmNfZW5kICYgMHgxRikKKwkJfCAocmF3LnZlcl9zeW5jX3N0YXJ0ID4+ICg4IC0gNSkgJiAweEUwKSk7Cit9CisKIHZvaWQgdmlhX3NldF9wcmltYXJ5X2FkZHJlc3ModTMyIGFkZHIpCiB7CiAJREVCVUdfTVNHKEtFUk5fREVCVUcgInZpYV9zZXRfcHJpbWFyeV9hZGRyZXNzKDB4JTA4WClcbiIsIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhX21vZGVzZXR0aW5nLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaAppbmRleCBhZTM1Y2ZkLi4wNmUwOWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaAorKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFfbW9kZXNldHRpbmcuaApAQCAtMjgsNiArMjgsMjkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKKworI2RlZmluZSBWSUFfUElUQ0hfU0laRQkoMTw8MykKKyNkZWZpbmUgVklBX1BJVENIX01BWAkweDNGRjgKKworCitzdHJ1Y3QgZGlzcGxheV90aW1pbmcgeworCXUxNiBob3JfdG90YWw7CisJdTE2IGhvcl9hZGRyOworCXUxNiBob3JfYmxhbmtfc3RhcnQ7CisJdTE2IGhvcl9ibGFua19lbmQ7CisJdTE2IGhvcl9zeW5jX3N0YXJ0OworCXUxNiBob3Jfc3luY19lbmQ7CisJdTE2IHZlcl90b3RhbDsKKwl1MTYgdmVyX2FkZHI7CisJdTE2IHZlcl9ibGFua19zdGFydDsKKwl1MTYgdmVyX2JsYW5rX2VuZDsKKwl1MTYgdmVyX3N5bmNfc3RhcnQ7CisJdTE2IHZlcl9zeW5jX2VuZDsKK307CisKKwordm9pZCB2aWFfc2V0X3ByaW1hcnlfdGltaW5nKGNvbnN0IHN0cnVjdCBkaXNwbGF5X3RpbWluZyAqdGltaW5nKTsKK3ZvaWQgdmlhX3NldF9zZWNvbmRhcnlfdGltaW5nKGNvbnN0IHN0cnVjdCBkaXNwbGF5X3RpbWluZyAqdGltaW5nKTsKIHZvaWQgdmlhX3NldF9wcmltYXJ5X2FkZHJlc3ModTMyIGFkZHIpOwogdm9pZCB2aWFfc2V0X3NlY29uZGFyeV9hZGRyZXNzKHUzMiBhZGRyKTsKIHZvaWQgdmlhX3NldF9wcmltYXJ5X3BpdGNoKHUzMiBwaXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jIGIvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYwppbmRleCA1M2FhNDQzLi5hMTNjMjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKQEAgLTM4LDggKzM4LDYgQEAKIHN0YXRpYyBpbnQgdmlhZmJfYnBwID0gMzI7CiBzdGF0aWMgaW50IHZpYWZiX2JwcDEgPSAzMjsKIAotc3RhdGljIHVuc2lnbmVkIGludCB2aWFmYl9zZWNvbmRfeHJlcyA9IDY0MDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlhZmJfc2Vjb25kX3lyZXMgPSA0ODA7CiBzdGF0aWMgdW5zaWduZWQgaW50IHZpYWZiX3NlY29uZF9vZmZzZXQ7CiBzdGF0aWMgaW50IHZpYWZiX3NlY29uZF9zaXplOwogCkBAIC0xNTEsNyArMTQ5LDggQEAKIAogCWluZm8tPmZpeC52aXN1YWwgPQogCQlicHAgPT0gOCA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKiBicHAgLyA4ICsgNykgJiB+NzsKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBBTElHTihpbmZvLT52YXIueHJlc192aXJ0dWFsICogYnBwIC8gOCwKKwkJVklBX1BJVENIX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCB2aWFmYl9zZXR1cF9maXhpbmZvKHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4LApAQCAtMjAwLDcgKzE5OSw2IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJaW50IGRlcHRoLCByZWZyZXNoOwotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfZW50cnk7CiAJc3RydWN0IHZpYWZiX3BhciAqcHBhciA9IGluZm8tPnBhcjsKIAl1MzIgbGluZTsKIApAQCAtMjEwLDggKzIwOCwxMCBAQAogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCB8fCB2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZtb2RlX2VudHJ5ID0gdmlhZmJfZ2V0X21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMpOwotCWlmICghdm1vZGVfZW50cnkpIHsKKwkvKiB0aGUgcmVmcmVzaCByYXRlIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSwgYXMgd2Ugb25seSB3YW50IHRvIGtub3cKKwkgKiB3aGV0aGVyIHRoZSByZXNvbHV0aW9uIGV4aXN0cworCSAqLworCWlmICghdmlhZmJfZ2V0X2Jlc3RfbW9kZSh2YXItPnhyZXMsIHZhci0+eXJlcywgNjApKSB7CiAJCURFQlVHX01TRyhLRVJOX0lORk8KIAkJCSAgInZpYWZiOiBNb2RlICVkeCVkeCVkIG5vdCBzdXBwb3J0ZWQhIVxuIiwKIAkJCSAgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwpAQCAtMjM4LDggKzIzOCwxMiBAQAogCQlkZXB0aCA9IDI0OwogCiAJdmlhZmJfZmlsbF92YXJfY29sb3JfaW5mbyh2YXIsIGRlcHRoKTsKLQlsaW5lID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDggKyA3KSAmIH43OwotCWlmIChsaW5lICogdmFyLT55cmVzX3ZpcnR1YWwgPiBwcGFyLT5tZW1zaXplKQorCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisKKwlsaW5lID0gQUxJR04odmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCwKKwkJVklBX1BJVENIX1NJWkUpOworCWlmIChsaW5lID4gVklBX1BJVENIX01BWCB8fCBsaW5lICogdmFyLT55cmVzX3ZpcnR1YWwgPiBwcGFyLT5tZW1zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEJhc2VkIG9uIHZhciBwYXNzZWQgaW4gdG8gY2FsY3VsYXRlIHRoZSByZWZyZXNoLApAQCAtMjQ5LDcgKzI1Myw4IEBACiAJCWdldF92YXJfcmVmcmVzaCh2YXIpKTsKIAogCS8qIEFkanVzdCB2YXIgYWNjb3JkaW5nIHRvIG91ciBkcml2ZXIncyBvd24gdGFibGUgKi8KLQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbyh2YXIsIHJlZnJlc2gsIHZtb2RlX2VudHJ5KTsKKwl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbyh2YXIsCisJCXZpYWZiX2dldF9iZXN0X21vZGUodmFyLT54cmVzLCB2YXItPnlyZXMsIHJlZnJlc2gpKTsKIAlpZiAodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUICYmCiAJCSFwcGFyLT5zaGFyZWQtPnZkZXYtPmVuZ2luZV9tbWlvKQogCQl2YXItPmFjY2VsX2ZsYWdzID0gMDsKQEAgLTI2MCw3ICsyNjUsNiBAQAogc3RhdGljIGludCB2aWFmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCB2aWFmYl9wYXIgKnZpYXBhciA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZtb2RlX2VudHJ5LCAqdm1vZGVfZW50cnkxID0gTlVMTDsKIAlpbnQgcmVmcmVzaDsKIAlERUJVR19NU0coS0VSTl9JTkZPICJ2aWFmYl9zZXRfcGFyIVxuIik7CiAKQEAgLTI2OSwxMCArMjczLDcgQEAKIAl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcodmlhZmJpbmZvLT52YXIueHJlcywgdmlhZmJpbmZvLT52YXIueXJlcywKIAkJdmlhZmJpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsIDApOwogCi0Jdm1vZGVfZW50cnkgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYmluZm8tPnZhci54cmVzLCB2aWFmYmluZm8tPnZhci55cmVzKTsKIAlpZiAodmlhZmJfZHVhbF9mYikgewotCQl2bW9kZV9lbnRyeTEgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYmluZm8xLT52YXIueHJlcywKLQkJCXZpYWZiaW5mbzEtPnZhci55cmVzKTsKIAkJdmlhZmJfdXBkYXRlX2RldmljZV9zZXR0aW5nKHZpYWZiaW5mbzEtPnZhci54cmVzLAogCQkJdmlhZmJpbmZvMS0+dmFyLnlyZXMsIHZpYWZiaW5mbzEtPnZhci5iaXRzX3Blcl9waXhlbCwKIAkJCTEpOwpAQCAtMjgwLDggKzI4MSw2IEBACiAJCURFQlVHX01TRyhLRVJOX0lORk8KIAkJInZpYWZiX3NlY29uZF94cmVzID0gJWQsIHZpYWZiX3NlY29uZF95cmVzID0gJWQsIGJwcCA9ICVkXG4iLAogCQkJICB2aWFmYl9zZWNvbmRfeHJlcywgdmlhZmJfc2Vjb25kX3lyZXMsIHZpYWZiX2JwcDEpOwotCQl2bW9kZV9lbnRyeTEgPSB2aWFmYl9nZXRfbW9kZSh2aWFmYl9zZWNvbmRfeHJlcywKLQkJCXZpYWZiX3NlY29uZF95cmVzKTsKIAogCQl2aWFmYl91cGRhdGVfZGV2aWNlX3NldHRpbmcodmlhZmJfc2Vjb25kX3hyZXMsCiAJCQl2aWFmYl9zZWNvbmRfeXJlcywgdmlhZmJfYnBwMSwgMSk7CkBAIC0yODksNyArMjg4LDggQEAKIAogCXJlZnJlc2ggPSB2aWFmYl9nZXRfcmVmcmVzaChpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsCiAJCWdldF92YXJfcmVmcmVzaCgmaW5mby0+dmFyKSk7Ci0JaWYgKHZtb2RlX2VudHJ5KSB7CisJaWYgKHZpYWZiX2dldF9iZXN0X21vZGUodmlhZmJpbmZvLT52YXIueHJlcywgdmlhZmJpbmZvLT52YXIueXJlcywKKwkJcmVmcmVzaCkpIHsKIAkJaWYgKHZpYWZiX2R1YWxfZmIgJiYgdmlhcGFyLT5pZ2FfcGF0aCA9PSBJR0EyKSB7CiAJCQl2aWFmYl9icHAxID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwogCQkJdmlhZmJfcmVmcmVzaDEgPSByZWZyZXNoOwpAQCAtMzAyLDggKzMwMiw3IEBACiAJCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7CiAJCWVsc2UKIAkJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOwotCQl2aWFmYl9zZXRtb2RlKHZtb2RlX2VudHJ5LCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCi0JCQl2bW9kZV9lbnRyeTEsIHZpYWZiX2JwcDEpOworCQl2aWFmYl9zZXRtb2RlKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwgdmlhZmJfYnBwMSk7CiAJCXZpYWZiX3Bhbl9kaXNwbGF5KCZpbmZvLT52YXIsIGluZm8pOwogCX0KIApAQCAtMzQ4LDggKzM0Nyw5IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHZpYWZiX3BhciAqdmlhcGFyID0gaW5mby0+cGFyOwotCXUzMiB2cmFtX2FkZHIgPSAodmFyLT55b2Zmc2V0ICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQpCi0JCSogKHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KSArIHZpYXBhci0+dnJhbV9hZGRyOworCXUzMiB2cmFtX2FkZHIgPSB2aWFwYXItPnZyYW1fYWRkcgorCQkrIHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aAorCQkrIHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDg7CiAKIAlERUJVR19NU0coS0VSTl9ERUJVRyAidmlhZmJfcGFuX2Rpc3BsYXksIGFkZHJlc3MgPSAlZFxuIiwgdnJhbV9hZGRyKTsKIAlpZiAoIXZpYWZiX2R1YWxfZmIpIHsKQEAgLTExNTgsNyArMTE1OCw4IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXN0cmljdF9zdHJ0b3VsKHZhbHVlLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwkJCWlmIChrc3RydG91OCh2YWx1ZSwgMCwgJnJlZ192YWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCURFQlVHX01TRyhLRVJOX0lORk8gIkRWUDA6cmVnX3ZhbFslbF09OiV4XG4iLCBpLAogCQkJCSAgcmVnX3ZhbCk7CiAJCQlzd2l0Y2ggKGkpIHsKQEAgLTEyMjgsNyArMTIyOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJCXN0cmljdF9zdHJ0b3VsKHZhbHVlLCAwLCAodW5zaWduZWQgbG9uZyAqKSZyZWdfdmFsKTsKKwkJCWlmIChrc3RydG91OCh2YWx1ZSwgMCwgJnJlZ192YWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXN3aXRjaCAoaSkgewogCQkJY2FzZSAwOgogCQkJCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOUIsIFZJQUNSLApAQCAtMTI4Niw3ICsxMjg4LDggQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZlswXSwgYnVmZmVyLCBsZW5ndGgpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlidWZbbGVuZ3RoIC0gMV0gPSAnXDAnOwkvKkVuc3VyZSBlbmQgc3RyaW5nICovCi0Jc3RyaWN0X3N0cnRvdWwoJmJ1ZlswXSwgMCwgKHVuc2lnbmVkIGxvbmcgKikmcmVnX3ZhbCk7CisJaWYgKGtzdHJ0b3U4KGJ1ZiwgMCwgJnJlZ192YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJdmlhZmJfd3JpdGVfcmVnX21hc2soQ1I5NywgVklBQ1IsIHJlZ192YWwsIDB4MGYpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTEzMjUsNyArMTMyOCw4IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZbMF0sIGJ1ZmZlciwgbGVuZ3RoKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYnVmW2xlbmd0aCAtIDFdID0gJ1wwJzsJLypFbnN1cmUgZW5kIHN0cmluZyAqLwotCXN0cmljdF9zdHJ0b3VsKCZidWZbMF0sIDAsICh1bnNpZ25lZCBsb25nICopJnJlZ192YWwpOworCWlmIChrc3RydG91OChidWYsIDAsICZyZWdfdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCXZpYWZiX3dyaXRlX3JlZ19tYXNrKENSOTksIFZJQUNSLCByZWdfdmFsLCAweDBmKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMzk0LDggKzEzOTgsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCi0JCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJaWYgKGtzdHJ0b3U4KHZhbHVlLCAwLCAmcmVnX3ZhbC5EYXRhKSA8IDApCisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCXN3aXRjaCAoaSkgewogCQkJCWNhc2UgMDoKIAkJCQkJcmVnX3ZhbC5JbmRleCA9IDB4MDg7CkBAIC0xNDMxLDggKzE0MzUsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCQl2YWx1ZSA9IHN0cnNlcCgmcGJ1ZiwgIiAiKTsKIAkJCWlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0JCQkJc3RyaWN0X3N0cnRvdWwodmFsdWUsIDAsCi0JCQkJCSh1bnNpZ25lZCBsb25nICopJnJlZ192YWwuRGF0YSk7CisJCQkJaWYgKGtzdHJ0b3U4KHZhbHVlLCAwLCAmcmVnX3ZhbC5EYXRhKSA8IDApCisJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCXN3aXRjaCAoaSkgewogCQkJCWNhc2UgMDoKIAkJCQkJcmVnX3ZhbC5JbmRleCA9IDB4MDg7CkBAIC0xNzI5LDcgKzE3MzMsNiBAQAogaW50IF9fZGV2aW5pdCB2aWFfZmJfcGNpX3Byb2JlKHN0cnVjdCB2aWFmYl9kZXYgKnZkZXYpCiB7CiAJdTMyIGRlZmF1bHRfeHJlcywgZGVmYXVsdF95cmVzOwotCXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm1vZGVfZW50cnk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyOwogCWludCByYzsKIAl1MzIgdmlhZmJfcGFyX2xlbmd0aDsKQEAgLTE4MDIsNyArMTgwNSw2IEBACiAJfQogCiAJcGFyc2VfbW9kZSh2aWFmYl9tb2RlLCAmZGVmYXVsdF94cmVzLCAmZGVmYXVsdF95cmVzKTsKLQl2bW9kZV9lbnRyeSA9IHZpYWZiX2dldF9tb2RlKGRlZmF1bHRfeHJlcywgZGVmYXVsdF95cmVzKTsKIAlpZiAodmlhZmJfU0FNTV9PTiA9PSAxKQogCQlwYXJzZV9tb2RlKHZpYWZiX21vZGUxLCAmdmlhZmJfc2Vjb25kX3hyZXMsCiAJCQkmdmlhZmJfc2Vjb25kX3lyZXMpOwpAQCAtMTgxMiw5ICsxODE0LDggQEAKIAlkZWZhdWx0X3Zhci54cmVzX3ZpcnR1YWwgPSBkZWZhdWx0X3hyZXM7CiAJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID0gZGVmYXVsdF95cmVzOwogCWRlZmF1bHRfdmFyLmJpdHNfcGVyX3BpeGVsID0gdmlhZmJfYnBwOwotCXZpYWZiX2ZpbGxfdmFyX3RpbWluZ19pbmZvKCZkZWZhdWx0X3ZhciwgdmlhZmJfZ2V0X3JlZnJlc2goCi0JCWRlZmF1bHRfdmFyLnhyZXMsIGRlZmF1bHRfdmFyLnlyZXMsIHZpYWZiX3JlZnJlc2gpLAotCQl2aWFmYl9nZXRfbW9kZShkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzKSk7CisJdmlhZmJfZmlsbF92YXJfdGltaW5nX2luZm8oJmRlZmF1bHRfdmFyLCB2aWFmYl9nZXRfYmVzdF9tb2RlKAorCQlkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzLCB2aWFmYl9yZWZyZXNoKSk7CiAJdmlhZmJfc2V0dXBfZml4aW5mbygmdmlhZmJpbmZvLT5maXgsIHZpYXBhcmluZm8pOwogCXZpYWZiaW5mby0+dmFyID0gZGVmYXVsdF92YXI7CiAKQEAgLTE4NTMsOSArMTg1NCw4IEBACiAJCWRlZmF1bHRfdmFyLnhyZXNfdmlydHVhbCA9IHZpYWZiX3NlY29uZF94cmVzOwogCQlkZWZhdWx0X3Zhci55cmVzX3ZpcnR1YWwgPSB2aWFmYl9zZWNvbmRfeXJlczsKIAkJZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwgPSB2aWFmYl9icHAxOwotCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZGVmYXVsdF92YXIsIHZpYWZiX2dldF9yZWZyZXNoKAotCQkJZGVmYXVsdF92YXIueHJlcywgZGVmYXVsdF92YXIueXJlcywgdmlhZmJfcmVmcmVzaDEpLAotCQkJdmlhZmJfZ2V0X21vZGUoZGVmYXVsdF92YXIueHJlcywgZGVmYXVsdF92YXIueXJlcykpOworCQl2aWFmYl9maWxsX3Zhcl90aW1pbmdfaW5mbygmZGVmYXVsdF92YXIsIHZpYWZiX2dldF9iZXN0X21vZGUoCisJCQlkZWZhdWx0X3Zhci54cmVzLCBkZWZhdWx0X3Zhci55cmVzLCB2aWFmYl9yZWZyZXNoMSkpOwogCiAJCXZpYWZiX3NldHVwX2ZpeGluZm8oJnZpYWZiaW5mbzEtPmZpeCwgdmlhcGFyaW5mbzEpOwogCQl2aWFmYl9jaGVja192YXIoJmRlZmF1bHRfdmFyLCB2aWFmYmluZm8xKTsKQEAgLTE5NTAsNjEgKzE5NTAsNjcgQEAKIAkJaWYgKCEqdGhpc19vcHQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9tb2RlMT0iLCAxMikpCisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX21vZGUxPSIsIDEyKSkgewogCQkJdmlhZmJfbW9kZTEgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTIsIEdGUF9LRVJORUwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX21vZGU9IiwgMTEpKQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfbW9kZT0iLCAxMSkpIHsKIAkJCXZpYWZiX21vZGUgPSBrc3RyZHVwKHRoaXNfb3B0ICsgMTEsIEdGUF9LRVJORUwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2JwcDE9IiwgMTEpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxMSwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9icHAxKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9icHA9IiwgMTApKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxMCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9icHApOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX3JlZnJlc2gxPSIsIDE1KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTUsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfcmVmcmVzaDEpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX3JlZnJlc2g9IiwgMTQpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxNCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9yZWZyZXNoKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfZHNwX21ldGhvZD0iLCAyMSkpCi0JCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDIxLCAwLAotCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9kc3BfbWV0aG9kKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcGFuZWxfaWQ9IiwgMTkpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxOSwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9sY2RfcGFuZWxfaWQpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2FjY2VsPSIsIDEyKSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTIsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfYWNjZWwpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX1NBTU1fT049IiwgMTQpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxNCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9TQU1NX09OKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9hY3RpdmVfZGV2PSIsIDE3KSkKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2JwcDE9IiwgMTEpKSB7CisJCQlpZiAoa3N0cnRvdWludCh0aGlzX29wdCArIDExLCAwLCAmdmlhZmJfYnBwMSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnBwPSIsIDEwKSkgeworCQkJaWYgKGtzdHJ0b3VpbnQodGhpc19vcHQgKyAxMCwgMCwgJnZpYWZiX2JwcCkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaDE9IiwgMTUpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMTUsIDAsICZ2aWFmYl9yZWZyZXNoMSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfcmVmcmVzaD0iLCAxNCkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxNCwgMCwgJnZpYWZiX3JlZnJlc2gpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2xjZF9kc3BfbWV0aG9kPSIsIDIxKSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDIxLCAwLAorCQkJCSAgICAgICZ2aWFmYl9sY2RfZHNwX21ldGhvZCkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfbGNkX3BhbmVsX2lkPSIsIDE5KSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDE5LCAwLAorCQkJCSAgICAgICZ2aWFmYl9sY2RfcGFuZWxfaWQpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX2FjY2VsPSIsIDEyKSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDEyLCAwLCAmdmlhZmJfYWNjZWwpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZpYWZiX1NBTU1fT049IiwgMTQpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMTQsIDAsICZ2aWFmYl9TQU1NX09OKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9hY3RpdmVfZGV2PSIsIDE3KSkgewogCQkJdmlhZmJfYWN0aXZlX2RldiA9IGtzdHJkdXAodGhpc19vcHQgKyAxNywgR0ZQX0tFUk5FTCk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAotCQkJInZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0PSIsIDMwKSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMzAsIDAsCi0JCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9kaXNwbGF5X2hhcmR3YXJlX2xheW91dCk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfc2Vjb25kX3NpemU9IiwgMTgpKQotCQkJc3RyaWN0X3N0cnRvdWwodGhpc19vcHQgKyAxOCwgMCwKLQkJCQkodW5zaWduZWQgbG9uZyAqKSZ2aWFmYl9zZWNvbmRfc2l6ZSk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LAotCQkJInZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpPSIsIDI0KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjQsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfcGxhdGZvcm1fZXBpYV9kdmkpOwotCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwKLQkJCSJ2aWFmYl9kZXZpY2VfbGNkX2R1YWxlZGdlPSIsIDI2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMjYsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZSk7Ci0JCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnVzX3dpZHRoPSIsIDE2KSkKLQkJCXN0cmljdF9zdHJ0b3VsKHRoaXNfb3B0ICsgMTYsIDAsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmdmlhZmJfYnVzX3dpZHRoKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfbW9kZT0iLCAxNSkpCi0JCQlzdHJpY3Rfc3RydG91bCh0aGlzX29wdCArIDE1LCAwLAotCQkJCSh1bnNpZ25lZCBsb25nICopJnZpYWZiX2xjZF9tb2RlKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcG9ydD0iLCAxNSkpCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfZGlzcGxheV9oYXJkd2FyZV9sYXlvdXQ9IiwgMzApKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMzAsIDAsCisJCQkJICAgICAgJnZpYWZiX2Rpc3BsYXlfaGFyZHdhcmVfbGF5b3V0KSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9zZWNvbmRfc2l6ZT0iLCAxOCkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxOCwgMCwgJnZpYWZiX3NlY29uZF9zaXplKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfcGxhdGZvcm1fZXBpYV9kdmk9IiwgMjQpKSB7CisJCQlpZiAoa3N0cnRvaW50KHRoaXNfb3B0ICsgMjQsIDAsCisJCQkJICAgICAgJnZpYWZiX3BsYXRmb3JtX2VwaWFfZHZpKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsCisJCQkidmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZT0iLCAyNikpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAyNiwgMCwKKwkJCQkgICAgICAmdmlhZmJfZGV2aWNlX2xjZF9kdWFsZWRnZSkgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidmlhZmJfYnVzX3dpZHRoPSIsIDE2KSkgeworCQkJaWYgKGtzdHJ0b2ludCh0aGlzX29wdCArIDE2LCAwLCAmdmlhZmJfYnVzX3dpZHRoKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfbW9kZT0iLCAxNSkpIHsKKwkJCWlmIChrc3RydG9pbnQodGhpc19vcHQgKyAxNSwgMCwgJnZpYWZiX2xjZF9tb2RlKSA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9sY2RfcG9ydD0iLCAxNSkpIHsKIAkJCXZpYWZiX2xjZF9wb3J0ID0ga3N0cmR1cCh0aGlzX29wdCArIDE1LCBHRlBfS0VSTkVMKTsKLQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9kdmlfcG9ydD0iLCAxNSkpCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2aWFmYl9kdmlfcG9ydD0iLCAxNSkpIHsKIAkJCXZpYWZiX2R2aV9wb3J0ID0ga3N0cmR1cCh0aGlzX29wdCArIDE1LCBHRlBfS0VSTkVMKTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIwMjgsOSArMjAzNCw5IEBACiAJCXJldHVybiByOwogI2VuZGlmCiAJaWYgKHBhcnNlX21vZGUodmlhZmJfbW9kZSwgJmR1bW15X3gsICZkdW1teV95KQotCQl8fCAhdmlhZmJfZ2V0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSkKKwkJfHwgIXZpYWZiX2dldF9iZXN0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSwgdmlhZmJfcmVmcmVzaCkKIAkJfHwgcGFyc2VfbW9kZSh2aWFmYl9tb2RlMSwgJmR1bW15X3gsICZkdW1teV95KQotCQl8fCAhdmlhZmJfZ2V0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSkKKwkJfHwgIXZpYWZiX2dldF9iZXN0X21vZGUoZHVtbXlfeCwgZHVtbXlfeSwgdmlhZmJfcmVmcmVzaDEpCiAJCXx8IHZpYWZiX2JwcCA8IDAgfHwgdmlhZmJfYnBwID4gMzIKIAkJfHwgdmlhZmJfYnBwMSA8IDAgfHwgdmlhZmJfYnBwMSA+IDMyCiAJCXx8IHBhcnNlX2FjdGl2ZV9kZXYoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuYwppbmRleCA1OGRmNzRlLi4wOTExY2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmMKKysrIGIvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAkvKnJfcmF0ZSxoc3AsdnNwICovCiAJLypIVCwgIEhBLCAgSEJTLCBIQkUsIEhTUywgSFNFLCBWVCwgIFZBLCAgVkJTLCBWQkUsIFZTUywgVlNFICovCiAJe1JFRlJFU0hfNjAsIE02NDBYNDgwX1I2MF9IU1AsIE02NDBYNDgwX1I2MF9WU1AsCi0JIHs4MDAsIDY0MCwgNjQ4LCAxNDQsIDY1NiwgOTYsIDUyNSwgNDgwLCA0ODAsIDQ1LCA0OTAsIDJ9IH0sCisJIHs4MDAsIDY0MCwgNjQwLCAxNjAsIDY1NiwgOTYsIDUyNSwgNDgwLCA0ODAsIDQ1LCA0OTAsIDJ9IH0sCiAJe1JFRlJFU0hfNzUsIE02NDBYNDgwX1I3NV9IU1AsIE02NDBYNDgwX1I3NV9WU1AsCiAJIHs4NDAsIDY0MCwgNjQwLCAyMDAsIDY1NiwgNjQsIDUwMCwgNDgwLCA0ODAsIDIwLCA0ODEsIDN9IH0sCiAJe1JFRlJFU0hfODUsIE02NDBYNDgwX1I4NV9IU1AsIE02NDBYNDgwX1I4NV9WU1AsCkBAIC04NjMsMjYgKzg2Myw1NiBAQAogaW50IE5VTV9UT1RBTF9QQVRDSF9NT0RFID0gQVJSQVlfU0laRShyZXNfcGF0Y2hfdGFibGUpOwogCiAKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKQorc3RhdGljIHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqZ2V0X21vZGVzKHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdm10LCBpbnQgbiwKKwlpbnQgaHJlcywgaW50IHZyZXMpCiB7Ci0JdTMyIGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlhZmJfbW9kZXMpOyBpKyspCi0JCWlmICh2aWFmYl9tb2Rlc1tpXS5tb2RlX2FycmF5ICYmCi0JCQl2aWFmYl9tb2Rlc1tpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgotCQkJdmlhZmJfbW9kZXNbaV0uY3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IHZyZXMpCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlpZiAodm10W2ldLm1vZGVfYXJyYXkgJiYKKwkJCXZtdFtpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgorCQkJdm10W2ldLmNydGNbMF0uY3J0Yy52ZXJfYWRkciA9PSB2cmVzKQogCQkJcmV0dXJuICZ2aWFmYl9tb2Rlc1tpXTsKIAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgVmlkZW9Nb2RlVGFibGUgKnZpYWZiX2dldF9yYl9tb2RlKGludCBocmVzLCBpbnQgdnJlcykKK3N0YXRpYyBzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKmdldF9iZXN0X21vZGUoc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2bXQsCisJaW50IHJlZnJlc2gpCiB7Ci0JdTMyIGk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlhZmJfcmJfbW9kZXMpOyBpKyspCi0JCWlmICh2aWFmYl9yYl9tb2Rlc1tpXS5tb2RlX2FycmF5ICYmCi0JCQl2aWFmYl9yYl9tb2Rlc1tpXS5jcnRjWzBdLmNydGMuaG9yX2FkZHIgPT0gaHJlcyAmJgotCQkJdmlhZmJfcmJfbW9kZXNbaV0uY3J0Y1swXS5jcnRjLnZlcl9hZGRyID09IHZyZXMpCi0JCQlyZXR1cm4gJnZpYWZiX3JiX21vZGVzW2ldOworCXN0cnVjdCBjcnRfbW9kZV90YWJsZSAqYmVzdDsKKwlpbnQgaTsKIAotCXJldHVybiBOVUxMOworCWlmICghdm10KQorCQlyZXR1cm4gTlVMTDsKKworCWJlc3QgPSAmdm10LT5jcnRjWzBdOworCWZvciAoaSA9IDE7IGkgPCB2bXQtPm1vZGVfYXJyYXk7IGkrKykgeworCQlpZiAoYWJzKHZtdC0+Y3J0Y1tpXS5yZWZyZXNoX3JhdGUgLSByZWZyZXNoKQorCQkJPCBhYnMoYmVzdC0+cmVmcmVzaF9yYXRlIC0gcmVmcmVzaCkpCisJCQliZXN0ID0gJnZtdC0+Y3J0Y1tpXTsKKwl9CisKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKQoreworCXJldHVybiBnZXRfbW9kZXModmlhZmJfbW9kZXMsIEFSUkFZX1NJWkUodmlhZmJfbW9kZXMpLCBocmVzLCB2cmVzKTsKK30KKworc3RydWN0IGNydF9tb2RlX3RhYmxlICp2aWFmYl9nZXRfYmVzdF9tb2RlKGludCBocmVzLCBpbnQgdnJlcywgaW50IHJlZnJlc2gpCit7CisJcmV0dXJuIGdldF9iZXN0X21vZGUodmlhZmJfZ2V0X21vZGUoaHJlcywgdnJlcyksIHJlZnJlc2gpOworfQorCitzdGF0aWMgc3RydWN0IFZpZGVvTW9kZVRhYmxlICp2aWFmYl9nZXRfcmJfbW9kZShpbnQgaHJlcywgaW50IHZyZXMpCit7CisJcmV0dXJuIGdldF9tb2Rlcyh2aWFmYl9yYl9tb2RlcywgQVJSQVlfU0laRSh2aWFmYl9yYl9tb2RlcyksIGhyZXMsCisJCXZyZXMpOworfQorCitzdHJ1Y3QgY3J0X21vZGVfdGFibGUgKnZpYWZiX2dldF9iZXN0X3JiX21vZGUoaW50IGhyZXMsIGludCB2cmVzLCBpbnQgcmVmcmVzaCkKK3sKKwlyZXR1cm4gZ2V0X2Jlc3RfbW9kZSh2aWFmYl9nZXRfcmJfbW9kZShocmVzLCB2cmVzKSwgcmVmcmVzaCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmggYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFtb2RlLmgKaW5kZXggMzc1MTI4OS4uNTkxN2EyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhbW9kZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYW1vZGUuaApAQCAtNjAsNyArNjAsNyBAQAogZXh0ZXJuIHN0cnVjdCBwYXRjaF90YWJsZSByZXNfcGF0Y2hfdGFibGVbXTsKIGV4dGVybiBzdHJ1Y3QgVlBJVFRhYmxlIFZQSVQ7CiAKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X21vZGUoaW50IGhyZXMsIGludCB2cmVzKTsKLXN0cnVjdCBWaWRlb01vZGVUYWJsZSAqdmlhZmJfZ2V0X3JiX21vZGUoaW50IGhyZXMsIGludCB2cmVzKTsKK3N0cnVjdCBjcnRfbW9kZV90YWJsZSAqdmlhZmJfZ2V0X2Jlc3RfbW9kZShpbnQgaHJlcywgaW50IHZyZXMsIGludCByZWZyZXNoKTsKK3N0cnVjdCBjcnRfbW9kZV90YWJsZSAqdmlhZmJfZ2V0X2Jlc3RfcmJfbW9kZShpbnQgaHJlcywgaW50IHZyZXMsIGludCByZWZyZXNoKTsKIAogI2VuZGlmIC8qIF9fVklBTU9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYyBiL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYwppbmRleCAwZTEyMGQ2Li43NzdjMjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Z0ODUwMGxjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby92dDg1MDBsY2RmYi5jCkBAIC0yMTAsOCArMjEwLDggQEAKIAlzdHJ1Y3QgdnQ4NTAwbGNkX2luZm8gKmZiaSA9IHRvX3Z0ODUwMGxjZF9pbmZvKGluZm8pOwogCiAJd3JpdGVsKCgxIDw8IDMxKQotCQl8ICgoKHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzKSAqIHBpeGxlbiAvIDQpIDw8IDIwKQotCQl8IChvZmYgPj4gMiksIGZiaS0+cmVnYmFzZSArIDB4MjApOworCSAgICAgfCAoKChpbmZvLT52YXIueHJlc192aXJ0dWFsIC0gaW5mby0+dmFyLnhyZXMpICogcGl4bGVuIC8gNCkgPDwgMjApCisJICAgICB8IChvZmYgPj4gMiksIGZiaS0+cmVnYmFzZSArIDB4MjApOwogCXJldHVybiAwOwogfQogCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJZ290byBmYWlsZWRfZnJlZV9wYWxldHRlOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdnQ4NTAwbGNkX2hhbmRsZV9pcnEsIElSUUZfRElTQUJMRUQsICJMQ0QiLCBmYmkpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgdnQ4NTAwbGNkX2hhbmRsZV9pcnEsIDAsICJMQ0QiLCBmYmkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0ID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92dDg2MjNmYi5jIGIvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCmluZGV4IGY5YjNlM2QuLjRlNzRkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKQEAgLTYyMCwxMyArNjIwLDE0IEBACiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0ICovCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMCkgewotCQlvZmZzZXQgPSAodmFyLT55b2Zmc2V0IC8gMTYpICogdmFyLT54cmVzX3ZpcnR1YWwgKyB2YXItPnhvZmZzZXQ7CisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAwKSB7CisJCW9mZnNldCA9ICh2YXItPnlvZmZzZXQgLyAxNikgKiBpbmZvLT52YXIueHJlc192aXJ0dWFsCisJCSAgICAgICArIHZhci0+eG9mZnNldDsKIAkJb2Zmc2V0ID0gb2Zmc2V0ID4+IDM7CiAJfSBlbHNlIHsKIAkJb2Zmc2V0ID0gKHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCkgKwotCQkJICh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCk7Ci0JCW9mZnNldCA9IG9mZnNldCA+PiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gNCkgPyAyIDogMSk7CisJCQkgKHZhci0+eG9mZnNldCAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvIDgpOworCQlvZmZzZXQgPSBvZmZzZXQgPj4gKChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gNCkgPyAyIDogMSk7CiAJfQogCiAJLyogU2V0IHRoZSBvZmZzZXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3cxMDBmYi5jCmluZGV4IGM4YmU4YWYuLjIzNzVlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdzEwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby93MTAwZmIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYyBiL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYwppbmRleCA3N2RlYTAxLi5mY2I2Y2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMKKysrIGIvZHJpdmVycy92aWRlby94aWxpbnhmYi5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydC9mc2xfaHlwZXJ2aXNvci5jIGIvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKaW5kZXggM2Q5MTYyMS4uNDkzOWUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKKysrIGIvZHJpdmVycy92aXJ0L2ZzbF9oeXBlcnZpc29yLmMKQEAgLTcwNiw2ICs3MDYsNyBAQAogCS5wb2xsID0gZnNsX2h2X3BvbGwsCiAJLnJlYWQgPSBmc2xfaHZfcmVhZCwKIAkudW5sb2NrZWRfaW9jdGwgPSBmc2xfaHZfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGZzbF9odl9pb2N0bCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBmc2xfaHZfbWlzY19kZXYgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnIGIvZHJpdmVycy92aXJ0aW8vS2NvbmZpZwppbmRleCA1N2U0OTNiLi44MTZlZDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlydGlvL0tjb25maWcKQEAgLTM1LDQgKzM1LDE1IEBACiAKIAkgSWYgdW5zdXJlLCBzYXkgTS4KIAorIGNvbmZpZyBWSVJUSU9fTU1JTworIAl0cmlzdGF0ZSAiUGxhdGZvcm0gYnVzIGRyaXZlciBmb3IgbWVtb3J5IG1hcHBlZCB2aXJ0aW8gZGV2aWNlcyAoRVhQRVJJTUVOVEFMKSIKKyAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKyAJc2VsZWN0IFZJUlRJTworIAlzZWxlY3QgVklSVElPX1JJTkcKKyAJLS0taGVscC0tLQorIAkgVGhpcyBkcml2ZXJzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG1lbW9yeSBtYXBwZWQgdmlydGlvCisJIHBsYXRmb3JtIGRldmljZSBkcml2ZXIuCisKKyAJIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL01ha2VmaWxlIGIvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKaW5kZXggNjczOGM0NC4uNWE0YzYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aXJ0aW8vTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBvYmotJChDT05GSUdfVklSVElPKSArPSB2aXJ0aW8ubwogb2JqLSQoQ09ORklHX1ZJUlRJT19SSU5HKSArPSB2aXJ0aW9fcmluZy5vCitvYmotJChDT05GSUdfVklSVElPX01NSU8pICs9IHZpcnRpb19tbWlvLm8KIG9iai0kKENPTkZJR19WSVJUSU9fUENJKSArPSB2aXJ0aW9fcGNpLm8KIG9iai0kKENPTkZJR19WSVJUSU9fQkFMTE9PTikgKz0gdmlydGlvX2JhbGxvb24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYwppbmRleCBlZmIzNWFhLi45ODRjNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW8uYwpAQCAtMSw2ICsxLDcgQEAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogVW5pcXVlIG51bWJlcmluZyBmb3IgdmlydGlvIGRldmljZXMuICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGRldl9pbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCmluZGV4IGUwNThhY2UuLjk0ZmQ3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogc3RydWN0IHZpcnRpb19iYWxsb29uCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fbW1pby5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M1ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYwpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIFZpcnRpbyBtZW1vcnkgbWFwcGVkIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSwgQVJNIEx0ZC4KKyAqCisgKiBUaGlzIG1vZHVsZSBhbGxvd3MgdmlydGlvIGRldmljZXMgdG8gYmUgdXNlZCBvdmVyIGEgdmlydHVhbCwgbWVtb3J5IG1hcHBlZAorICogcGxhdGZvcm0gZGV2aWNlLgorICoKKyAqIFJlZ2lzdGVycyBsYXlvdXQgKGFsbCAzMi1iaXQgd2lkZSk6CisgKgorICogb2Zmc2V0IGQuIG5hbWUgICAgICAgICAgICAgZGVzY3JpcHRpb24KKyAqIC0tLS0tLSAtLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogMHgwMDAgIFIgIE1hZ2ljVmFsdWUgICAgICAgTWFnaWMgdmFsdWUgInZpcnQiCisgKiAweDAwNCAgUiAgVmVyc2lvbiAgICAgICAgICBEZXZpY2UgdmVyc2lvbiAoY3VycmVudCBtYXguIDEpCisgKiAweDAwOCAgUiAgRGV2aWNlSUQgICAgICAgICBWaXJ0aW8gZGV2aWNlIElECisgKiAweDAwYyAgUiAgVmVuZG9ySUQgICAgICAgICBWaXJ0aW8gdmVuZG9yIElECisgKgorICogMHgwMTAgIFIgIEhvc3RGZWF0dXJlcyAgICAgRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0CisgKiAweDAxNCAgVyAgSG9zdEZlYXR1cmVzU2VsICBTZXQgb2YgaG9zdCBmZWF0dXJlcyB0byBhY2Nlc3MgdmlhIEhvc3RGZWF0dXJlcworICoKKyAqIDB4MDIwICBXICBHdWVzdEZlYXR1cmVzICAgIEZlYXR1cmVzIGFjdGl2YXRlZCBieSB0aGUgZ3Vlc3QKKyAqIDB4MDI0ICBXICBHdWVzdEZlYXR1cmVzU2VsIFNldCBvZiBhY3RpdmF0ZWQgZmVhdHVyZXMgdG8gc2V0IHZpYSBHdWVzdEZlYXR1cmVzCisgKiAweDAyOCAgVyAgR3Vlc3RQYWdlU2l6ZSAgICBTaXplIG9mIGd1ZXN0J3MgbWVtb3J5IHBhZ2UgaW4gYnl0ZXMKKyAqCisgKiAweDAzMCAgVyAgUXVldWVTZWwgICAgICAgICBRdWV1ZSBzZWxlY3RvcgorICogMHgwMzQgIFIgIFF1ZXVlTnVtTWF4ICAgICAgTWF4aW11bSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqIDB4MDM4ICBXICBRdWV1ZU51bSAgICAgICAgIFF1ZXVlIHNpemUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqIDB4MDNjICBXICBRdWV1ZUFsaWduICAgICAgIFVzZWQgUmluZyBhbGlnbm1lbnQgZm9yIHRoZSBjdXJyZW50IHF1ZXVlCisgKiAweDA0MCAgUlcgUXVldWVQRk4gICAgICAgICBQRk4gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUKKyAqCisgKiAweDA1MCAgVyAgUXVldWVOb3RpZnkgICAgICBRdWV1ZSBub3RpZmllcgorICogMHgwNjAgIFIgIEludGVycnVwdFN0YXR1cyAgSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorICogMHgwNjAgIFcgIEludGVycnVwdEFDSyAgICAgSW50ZXJydXB0IGFja25vd2xlZGdlIHJlZ2lzdGVyCisgKiAweDA3MCAgUlcgU3RhdHVzICAgICAgICAgICBEZXZpY2Ugc3RhdHVzIHJlZ2lzdGVyCisgKgorICogMHgxMDArIFJXICAgICAgICAgICAgICAgICAgRGV2aWNlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqCisgKiBCYXNlZCBvbiBWaXJ0aW8gUENJIGRyaXZlciBieSBBbnRob255IExpZ3VvcmksIGNvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19tbWlvLmg+CisjaW5jbHVkZSA8bGludXgvdmlydGlvX3JpbmcuaD4KKworCisKKy8qIFRoZSBhbGlnbm1lbnQgdG8gdXNlIGJldHdlZW4gY29uc3VtZXIgYW5kIHByb2R1Y2VyIHBhcnRzIG9mIHZyaW5nLgorICogQ3VycmVudGx5IGhhcmRjb2RlZCB0byB0aGUgcGFnZSBzaXplLiAqLworI2RlZmluZSBWSVJUSU9fTU1JT19WUklOR19BTElHTgkJUEFHRV9TSVpFCisKKworCisjZGVmaW5lIHRvX3ZpcnRpb19tbWlvX2RldmljZShfcGxhdF9kZXYpIFwKKwljb250YWluZXJfb2YoX3BsYXRfZGV2LCBzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlLCB2ZGV2KQorCitzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlIHsKKwlzdHJ1Y3QgdmlydGlvX2RldmljZSB2ZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworCisJLyogYSBsaXN0IG9mIHF1ZXVlcyBzbyB3ZSBjYW4gZGlzcGF0Y2ggSVJRcyAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZpcnRxdWV1ZXM7Cit9OworCitzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyB7CisJLyogdGhlIGFjdHVhbCB2aXJ0cXVldWUgKi8KKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKworCS8qIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgbnVtOworCisJLyogdGhlIGluZGV4IG9mIHRoZSBxdWV1ZSAqLworCWludCBxdWV1ZV9pbmRleDsKKworCS8qIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHJpbmcgcXVldWUgKi8KKwl2b2lkICpxdWV1ZTsKKworCS8qIHRoZSBsaXN0IG5vZGUgZm9yIHRoZSB2aXJ0cXVldWVzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisKKworLyogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgKi8KKworc3RhdGljIHUzMiB2bV9nZXRfZmVhdHVyZXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCisJLyogVE9ETzogRmVhdHVyZXMgPiAzMiBiaXRzICovCisJd3JpdGVsKDAsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0hPU1RfRkVBVFVSRVNfU0VMKTsKKworCXJldHVybiByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTKTsKK30KKworc3RhdGljIHZvaWQgdm1fZmluYWxpemVfZmVhdHVyZXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCWludCBpOworCisJLyogR2l2ZSB2aXJ0aW9fcmluZyBhIGNoYW5jZSB0byBhY2NlcHQgZmVhdHVyZXMuICovCisJdnJpbmdfdHJhbnNwb3J0X2ZlYXR1cmVzKHZkZXYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmRldi0+ZmVhdHVyZXMpOyBpKyspIHsKKwkJd3JpdGVsKGksIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0dVRVNUX0ZFQVRVUkVTX1NFVCk7CisJCXdyaXRlbCh2ZGV2LT5mZWF0dXJlc1tpXSwKKwkJCQl2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFUyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB2bV9nZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKKwkJICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCXU4ICpwdHIgPSBidWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXB0cltpXSA9IHJlYWRiKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRyArIG9mZnNldCArIGkpOworfQorCitzdGF0aWMgdm9pZCB2bV9zZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKKwkJICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCWNvbnN0IHU4ICpwdHIgPSBidWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXdyaXRlYihwdHJbaV0sIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRyArIG9mZnNldCArIGkpOworfQorCitzdGF0aWMgdTggdm1fZ2V0X3N0YXR1cyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisKKwlyZXR1cm4gcmVhZGwodm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHZtX3NldF9zdGF0dXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisKKwkvKiBXZSBzaG91bGQgbmV2ZXIgYmUgc2V0dGluZyBzdGF0dXMgdG8gMC4gKi8KKwlCVUdfT04oc3RhdHVzID09IDApOworCisJd3JpdGVsKHN0YXR1cywgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKTsKK30KKworc3RhdGljIHZvaWQgdm1fcmVzZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCisJLyogMCBzdGF0dXMgbWVhbnMgYSByZXNldC4gKi8KKwl3cml0ZWwoMCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fU1RBVFVTKTsKK30KKworCisKKy8qIFRyYW5zcG9ydCBpbnRlcmZhY2UgKi8KKworLyogdGhlIG5vdGlmeSBmdW5jdGlvbiB1c2VkIHdoZW4gY3JlYXRpbmcgYSB2aXJ0IHF1ZXVlICovCitzdGF0aWMgdm9pZCB2bV9ub3RpZnkoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZxLT52ZGV2KTsKKwlzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyAqaW5mbyA9IHZxLT5wcml2OworCisJLyogV2Ugd3JpdGUgdGhlIHF1ZXVlJ3Mgc2VsZWN0b3IgaW50byB0aGUgbm90aWZpY2F0aW9uIHJlZ2lzdGVyIHRvCisJICogc2lnbmFsIHRoZSBvdGhlciBlbmQgKi8KKwl3cml0ZWwoaW5mby0+cXVldWVfaW5kZXgsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX05PVElGWSk7Cit9CisKKy8qIE5vdGlmeSBhbGwgdmlydHF1ZXVlcyBvbiBhbiBpbnRlcnJ1cHQuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSBvcGFxdWU7CisJc3RydWN0IHZpcnRpb19tbWlvX3ZxX2luZm8gKmluZm87CisJc3RydWN0IHZpcnRpb19kcml2ZXIgKnZkcnYgPSBjb250YWluZXJfb2Yodm1fZGV2LT52ZGV2LmRldi5kcml2ZXIsCisJCQlzdHJ1Y3QgdmlydGlvX2RyaXZlciwgZHJpdmVyKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJLyogUmVhZCBhbmQgYWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLworCXN0YXR1cyA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9TVEFUVVMpOworCXdyaXRlbChzdGF0dXMsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9BQ0spOworCisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFZJUlRJT19NTUlPX0lOVF9DT05GSUcpCisJCQkmJiB2ZHJ2ICYmIHZkcnYtPmNvbmZpZ19jaGFuZ2VkKSB7CisJCXZkcnYtPmNvbmZpZ19jaGFuZ2VkKCZ2bV9kZXYtPnZkZXYpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAobGlrZWx5KHN0YXR1cyAmIFZJUlRJT19NTUlPX0lOVF9WUklORykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZ2bV9kZXYtPnZpcnRxdWV1ZXMsIG5vZGUpCisJCQlyZXQgfD0gdnJpbmdfaW50ZXJydXB0KGlycSwgaW5mby0+dnEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHZvaWQgdm1fZGVsX3ZxKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2cS0+dmRldik7CisJc3RydWN0IHZpcnRpb19tbWlvX3ZxX2luZm8gKmluZm8gPSB2cS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZpbmZvLT5ub2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKKworCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOworCisJLyogU2VsZWN0IGFuZCBkZWFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCXdyaXRlbChpbmZvLT5xdWV1ZV9pbmRleCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfU0VMKTsKKwl3cml0ZWwoMCwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfUEZOKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHZyaW5nX3NpemUoaW5mby0+bnVtLCBWSVJUSU9fTU1JT19WUklOR19BTElHTikpOworCWZyZWVfcGFnZXNfZXhhY3QoaW5mby0+cXVldWUsIHNpemUpOworCWtmcmVlKGluZm8pOworfQorCitzdGF0aWMgdm9pZCB2bV9kZWxfdnFzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cSwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnEsIG4sICZ2ZGV2LT52cXMsIGxpc3QpCisJCXZtX2RlbF92cSh2cSk7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHZtX2Rldi0+cGRldiwgMCksIHZtX2Rldik7Cit9CisKKworCitzdGF0aWMgc3RydWN0IHZpcnRxdWV1ZSAqdm1fc2V0dXBfdnEoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIGluZGV4LAorCQkJCSAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdmlydHF1ZXVlICp2cSksCisJCQkJICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKKwlzdHJ1Y3QgdmlydGlvX21taW9fdnFfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBzaXplOworCWludCBlcnI7CisKKwkvKiBTZWxlY3QgdGhlIHF1ZXVlIHdlJ3JlIGludGVyZXN0ZWQgaW4gKi8KKwl3cml0ZWwoaW5kZXgsIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX1NFTCk7CisKKwkvKiBRdWV1ZSBzaG91bGRuJ3QgYWxyZWFkeSBiZSBzZXQgdXAuICovCisJaWYgKHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX1BGTikpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnJvcl9hdmFpbGFibGU7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIGZpbGwgb3V0IG91ciBhY3RpdmUgcXVldWUgZGVzY3JpcHRpb24gKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9rbWFsbG9jOworCX0KKwlpbmZvLT5xdWV1ZV9pbmRleCA9IGluZGV4OworCisJLyogQWxsb2NhdGUgcGFnZXMgZm9yIHRoZSBxdWV1ZSAtIHN0YXJ0IHdpdGggYSBxdWV1ZSBhcyBiaWcgYXMKKwkgKiBwb3NzaWJsZSAobGltaXRlZCBieSBtYXhpbXVtIHNpemUgYWxsb3dlZCBieSBkZXZpY2UpLCBkcm9wIGRvd24KKwkgKiB0byBhIG1pbmltYWwgc2l6ZSwganVzdCBiaWcgZW5vdWdoIHRvIGZpdCBkZXNjcmlwdG9yIHRhYmxlCisJICogYW5kIHR3byByaW5ncyAod2hpY2ggbWFrZXMgaXQgImFsaWdubWVudF9zaXplICogMiIpCisJICovCisJaW5mby0+bnVtID0gcmVhZGwodm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfTlVNX01BWCk7CisJd2hpbGUgKDEpIHsKKwkJc2l6ZSA9IFBBR0VfQUxJR04odnJpbmdfc2l6ZShpbmZvLT5udW0sCisJCQkJVklSVElPX01NSU9fVlJJTkdfQUxJR04pKTsKKwkJLyogQWxyZWFkeSBzbWFsbGVzdCBwb3NzaWJsZSBhbGxvY2F0aW9uPyAqLworCQlpZiAoc2l6ZSA8PSBWSVJUSU9fTU1JT19WUklOR19BTElHTiAqIDIpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yX2FsbG9jX3BhZ2VzOworCQl9CisKKwkJaW5mby0+cXVldWUgPSBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmIChpbmZvLT5xdWV1ZSkKKwkJCWJyZWFrOworCisJCWluZm8tPm51bSAvPSAyOworCX0KKworCS8qIEFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCXdyaXRlbChpbmZvLT5udW0sIHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1FVRVVFX05VTSk7CisJd3JpdGVsKFZJUlRJT19NTUlPX1ZSSU5HX0FMSUdOLAorCQkJdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fUVVFVUVfQUxJR04pOworCXdyaXRlbCh2aXJ0X3RvX3BoeXMoaW5mby0+cXVldWUpID4+IFBBR0VfU0hJRlQsCisJCQl2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19RVUVVRV9QRk4pOworCisJLyogQ3JlYXRlIHRoZSB2cmluZyAqLworCXZxID0gdnJpbmdfbmV3X3ZpcnRxdWV1ZShpbmZvLT5udW0sIFZJUlRJT19NTUlPX1ZSSU5HX0FMSUdOLAorCQkJCSB2ZGV2LCBpbmZvLT5xdWV1ZSwgdm1fbm90aWZ5LCBjYWxsYmFjaywgbmFtZSk7CisJaWYgKCF2cSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX25ld192aXJ0cXVldWU7CisJfQorCisJdnEtPnByaXYgPSBpbmZvOworCWluZm8tPnZxID0gdnE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdm1fZGV2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmluZm8tPm5vZGUsICZ2bV9kZXYtPnZpcnRxdWV1ZXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZxOworCitlcnJvcl9uZXdfdmlydHF1ZXVlOgorCXdyaXRlbCgwLCB2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19RVUVVRV9QRk4pOworCWZyZWVfcGFnZXNfZXhhY3QoaW5mby0+cXVldWUsIHNpemUpOworZXJyb3JfYWxsb2NfcGFnZXM6CisJa2ZyZWUoaW5mbyk7CitlcnJvcl9rbWFsbG9jOgorZXJyb3JfYXZhaWxhYmxlOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgdm1fZmluZF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG52cXMsCisJCSAgICAgICBzdHJ1Y3QgdmlydHF1ZXVlICp2cXNbXSwKKwkJICAgICAgIHZxX2NhbGxiYWNrX3QgKmNhbGxiYWNrc1tdLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSkKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CisJdW5zaWduZWQgaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEodm1fZGV2LT5wZGV2LCAwKTsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCB2bV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJZGV2X25hbWUoJnZkZXYtPmRldiksIHZtX2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBudnFzOyArK2kpIHsKKwkJdnFzW2ldID0gdm1fc2V0dXBfdnEodmRldiwgaSwgY2FsbGJhY2tzW2ldLCBuYW1lc1tpXSk7CisJCWlmIChJU19FUlIodnFzW2ldKSkgeworCQkJdm1fZGVsX3Zxcyh2ZGV2KTsKKwkJCXJldHVybiBQVFJfRVJSKHZxc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgdmlydGlvX2NvbmZpZ19vcHMgdmlydGlvX21taW9fY29uZmlnX29wcyA9IHsKKwkuZ2V0CQk9IHZtX2dldCwKKwkuc2V0CQk9IHZtX3NldCwKKwkuZ2V0X3N0YXR1cwk9IHZtX2dldF9zdGF0dXMsCisJLnNldF9zdGF0dXMJPSB2bV9zZXRfc3RhdHVzLAorCS5yZXNldAkJPSB2bV9yZXNldCwKKwkuZmluZF92cXMJPSB2bV9maW5kX3ZxcywKKwkuZGVsX3Zxcwk9IHZtX2RlbF92cXMsCisJLmdldF9mZWF0dXJlcwk9IHZtX2dldF9mZWF0dXJlcywKKwkuZmluYWxpemVfZmVhdHVyZXMgPSB2bV9maW5hbGl6ZV9mZWF0dXJlcywKK307CisKKworCisvKiBQbGF0Zm9ybSBkZXZpY2UgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgdmlydGlvX21taW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisJdW5zaWduZWQgbG9uZyBtYWdpYzsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBtZW0tPnN0YXJ0LAorCQkJcmVzb3VyY2Vfc2l6ZShtZW0pLCBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXZtX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZtX2RldiksIEdGUF9LRVJORUwpOworCWlmICghdm1fZGV2KQorCQlyZXR1cm4gIC1FTk9NRU07CisKKwl2bV9kZXYtPnZkZXYuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJdm1fZGV2LT52ZGV2LmNvbmZpZyA9ICZ2aXJ0aW9fbW1pb19jb25maWdfb3BzOworCXZtX2Rldi0+cGRldiA9IHBkZXY7CisJSU5JVF9MSVNUX0hFQUQoJnZtX2Rldi0+dmlydHF1ZXVlcyk7CisJc3Bpbl9sb2NrX2luaXQoJnZtX2Rldi0+bG9jayk7CisKKwl2bV9kZXYtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAodm1fZGV2LT5iYXNlID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogQ2hlY2sgbWFnaWMgdmFsdWUgKi8KKwltYWdpYyA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX01BR0lDX1ZBTFVFKTsKKwlpZiAobWVtY21wKCZtYWdpYywgInZpcnQiLCA0KSAhPSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJXcm9uZyBtYWdpYyB2YWx1ZSAweCUwOGx4IVxuIiwgbWFnaWMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDaGVjayBkZXZpY2UgdmVyc2lvbiAqLworCXZtX2Rldi0+dmVyc2lvbiA9IHJlYWRsKHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX1ZFUlNJT04pOworCWlmICh2bV9kZXYtPnZlcnNpb24gIT0gMSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJWZXJzaW9uICVsZCBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCQl2bV9kZXYtPnZlcnNpb24pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXZtX2Rldi0+dmRldi5pZC5kZXZpY2UgPSByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19ERVZJQ0VfSUQpOworCXZtX2Rldi0+dmRldi5pZC52ZW5kb3IgPSByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19WRU5ET1JfSUQpOworCisJd3JpdGVsKFBBR0VfU0laRSwgdm1fZGV2LT5iYXNlICsgVklSVElPX01NSU9fR1VFU1RfUEFHRV9TSVpFKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZtX2Rldik7CisKKwlyZXR1cm4gcmVnaXN0ZXJfdmlydGlvX2RldmljZSgmdm1fZGV2LT52ZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdmlydGlvX21taW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl1bnJlZ2lzdGVyX3ZpcnRpb19kZXZpY2UoJnZtX2Rldi0+dmRldik7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIFBsYXRmb3JtIGRyaXZlciAqLworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB2aXJ0aW9fbW1pb19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidmlydGlvLG1taW8iLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZpcnRpb19tbWlvX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmlydGlvX21taW9fZHJpdmVyID0geworCS5wcm9iZQkJPSB2aXJ0aW9fbW1pb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZpcnRpb19tbWlvX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZpcnRpby1tbWlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IHZpcnRpb19tbWlvX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2aXJ0aW9fbW1pb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmlydGlvX21taW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19tbWlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlydGlvX21taW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodmlydGlvX21taW9faW5pdCk7Cittb2R1bGVfZXhpdCh2aXJ0aW9fbW1pb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF3ZWwgTW9sbCA8cGF3ZWwubW9sbEBhcm0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGF0Zm9ybSBidXMgZHJpdmVyIGZvciBtZW1vcnkgbWFwcGVkIHZpcnRpbyBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKaW5kZXggNGJjYzhiOC4uM2QxYmY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCisrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwpAQCAtNDE1LDkgKzQxNSwxMyBAQAogCQl9CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZpbmZvLT5ub2RlLCAmdnBfZGV2LT52aXJ0cXVldWVzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cF9kZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY2FsbGJhY2spIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmaW5mby0+bm9kZSwgJnZwX2Rldi0+dmlydHF1ZXVlcyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwX2Rldi0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5ub2RlKTsKKwl9CiAKIAlyZXR1cm4gdnE7CiAKQEAgLTU5MCwxMSArNTk0LDExIEBACiAKIHN0YXRpYyB2b2lkIHZpcnRpb19wY2lfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqX2QpCiB7Ci0Jc3RydWN0IHZpcnRpb19kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihfZCwgc3RydWN0IHZpcnRpb19kZXZpY2UsCi0JCQkJCQkgZGV2KTsKLQlzdHJ1Y3QgdmlydGlvX3BjaV9kZXZpY2UgKnZwX2RldiA9IHRvX3ZwX2RldmljZShkZXYpOwotCi0Ja2ZyZWUodnBfZGV2KTsKKwkvKgorCSAqIE5vIG5lZWQgZm9yIGEgcmVsZWFzZSBtZXRob2QgYXMgd2UgYWxsb2NhdGUvZnJlZQorCSAqIGFsbCBkZXZpY2VzIHRvZ2V0aGVyIHdpdGggdGhlIHBjaSBkZXZpY2VzLgorCSAqIFByb3ZpZGUgYW4gZW1wdHkgb25lIHRvIGF2b2lkIGdldHRpbmcgYSB3YXJuaW5nIGZyb20gY29yZS4KKwkgKi8KIH0KIAogLyogdGhlIFBDSSBwcm9iaW5nIGZ1bmN0aW9uICovCkBAIC02ODIsNiArNjg2LDcgQEAKIAlwY2lfaW91bm1hcChwY2lfZGV2LCB2cF9kZXYtPmlvYWRkcik7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisJa2ZyZWUodnBfZGV2KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKaW5kZXggNGFjZjg4OC4uYzdhMmMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogdmlydGlvIGd1ZXN0IGlzIGNvbW11bmljYXRpbmcgd2l0aCBhIHZpcnR1YWwgImRldmljZSIgdGhhdCBhY3R1YWxseSBydW5zIG9uCiAgKiBhIGhvc3QgcHJvY2Vzc29yLiAgTWVtb3J5IGJhcnJpZXJzIGFyZSB1c2VkIHRvIGNvbnRyb2wgU01QIGVmZmVjdHMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3NjAuYyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCmluZGV4IDQ4M2Q0NTEuLjU3NTRjOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc2MC5jCkBAIC0xMTQsNDMgKzExNCw3IEBACiAJLnJlYWQgPSB3MV9kczI3NjBfcmVhZF9iaW4sCiB9OwogCi1zdGF0aWMgREVGSU5FX0lEUihiYXRfaWRyKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYmF0X2lkcl9sb2NrKTsKLQotc3RhdGljIGludCBuZXdfYmF0X2lkKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXdoaWxlICgxKSB7Ci0JCWludCBpZDsKLQotCQlyZXQgPSBpZHJfcHJlX2dldCgmYmF0X2lkciwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW11dGV4X2xvY2soJmJhdF9pZHJfbG9jayk7Ci0JCXJldCA9IGlkcl9nZXRfbmV3KCZiYXRfaWRyLCBOVUxMLCAmaWQpOwotCQltdXRleF91bmxvY2soJmJhdF9pZHJfbG9jayk7Ci0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyZXQgPSBpZCAmIE1BWF9JRF9NQVNLOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2JhdF9pZChpbnQgaWQpCi17Ci0JbXV0ZXhfbG9jaygmYmF0X2lkcl9sb2NrKTsKLQlpZHJfcmVtb3ZlKCZiYXRfaWRyLCBpZCk7Ci0JbXV0ZXhfdW5sb2NrKCZiYXRfaWRyX2xvY2spOwotfQorc3RhdGljIERFRklORV9JREEoYmF0X2lkYSk7CiAKIHN0YXRpYyBpbnQgdzFfZHMyNzYwX2FkZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewpAQCAtMTU4LDcgKzEyMiw3IEBACiAJaW50IGlkOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKLQlpZCA9IG5ld19iYXRfaWQoKTsKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZiYXRfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKIAlpZiAoaWQgPCAwKSB7CiAJCXJldCA9IGlkOwogCQlnb3RvIG5vaWQ7CkBAIC0xODcsNyArMTUxLDcgQEAKIHBkZXZfYWRkX2ZhaWxlZDoKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKIHBkZXZfYWxsb2NfZmFpbGVkOgotCXJlbGVhc2VfYmF0X2lkKGlkKTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmYmF0X2lkYSwgaWQpOwogbm9pZDoKIHN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKQEAgLTE5OSw3ICsxNjMsNyBAQAogCWludCBpZCA9IHBkZXYtPmlkOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JcmVsZWFzZV9iYXRfaWQoaWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZiYXRfaWRhLCBpZCk7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9kczI3NjBfYmluX2F0dHIpOwogfQogCkBAIC0yMTcsMTQgKzE4MSwxNCBAQAogewogCXByaW50ayhLRVJOX0lORk8gIjEtV2lyZSBkcml2ZXIgZm9yIHRoZSBEUzI3NjAgYmF0dGVyeSBtb25pdG9yICIKIAkgICAgICAgIiBjaGlwICAtIChjKSAyMDA0LTIwMDUsIFN6YWJvbGNzIEd5dXJrb1xuIik7Ci0JaWRyX2luaXQoJmJhdF9pZHIpOworCWlkYV9pbml0KCZiYXRfaWRhKTsKIAlyZXR1cm4gdzFfcmVnaXN0ZXJfZmFtaWx5KCZ3MV9kczI3NjBfZmFtaWx5KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHcxX2RzMjc2MF9leGl0KHZvaWQpCiB7CiAJdzFfdW5yZWdpc3Rlcl9mYW1pbHkoJncxX2RzMjc2MF9mYW1pbHkpOwotCWlkcl9kZXN0cm95KCZiYXRfaWRyKTsKKwlpZGFfZGVzdHJveSgmYmF0X2lkYSk7CiB9CiAKIEVYUE9SVF9TWU1CT0wodzFfZHMyNzYwX3JlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNzgwLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYwppbmRleCAyNzRjOGYzLi4zOWY3OGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuYwpAQCAtMjYsMjAgKzI2LDE0IEBACiAjaW5jbHVkZSAiLi4vdzFfZmFtaWx5LmgiCiAjaW5jbHVkZSAidzFfZHMyNzgwLmgiCiAKLWludCB3MV9kczI3ODBfaW8oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsCi0JCQlpbnQgaW8pCitzdGF0aWMgaW50IHcxX2RzMjc4MF9kb19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGFkZHIsCisJCQlzaXplX3QgY291bnQsIGludCBpbykKIHsKIAlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PREVWOworCWlmIChhZGRyID4gRFMyNzgwX0RBVEFfU0laRSB8fCBhZGRyIDwgMCkKKwkJcmV0dXJuIDA7CiAKLQltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7Ci0KLQlpZiAoYWRkciA+IERTMjc4MF9EQVRBX1NJWkUgfHwgYWRkciA8IDApIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dDsKLQl9CiAJY291bnQgPSBtaW5fdChpbnQsIGNvdW50LCBEUzI3ODBfREFUQV9TSVpFIC0gYWRkcik7CiAKIAlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSA9PSAwKSB7CkBAIC00Nyw3ICs0MSw2IEBACiAJCQl3MV93cml0ZV84KHNsLT5tYXN0ZXIsIFcxX0RTMjc4MF9XUklURV9EQVRBKTsKIAkJCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgYWRkcik7CiAJCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBidWYsIGNvdW50KTsKLQkJCS8qIFhYWCB3MV93cml0ZV9ibG9jayByZXR1cm5zIHZvaWQsIG5vdCBuX3dyaXR0ZW4gKi8KIAkJfSBlbHNlIHsKIAkJCXcxX3dyaXRlXzgoc2wtPm1hc3RlciwgVzFfRFMyNzgwX1JFQURfREFUQSk7CiAJCQl3MV93cml0ZV84KHNsLT5tYXN0ZXIsIGFkZHIpOwpAQCAtNTUsMTMgKzQ4LDQyIEBACiAJCX0KIAl9CiAKLW91dDoKLQltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKLQogCXJldHVybiBjb3VudDsKIH0KKworaW50IHcxX2RzMjc4MF9pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGFkZHIsIHNpemVfdCBjb3VudCwKKwkJCWludCBpbykKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX3NsYXZlLCBkZXYpOworCWludCByZXQ7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CisKKwlyZXQgPSB3MV9kczI3ODBfZG9faW8oZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CisKKwltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CiBFWFBPUlRfU1lNQk9MKHcxX2RzMjc4MF9pbyk7CiAKK2ludCB3MV9kczI3ODBfaW9fbm9sb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgYWRkciwgc2l6ZV90IGNvdW50LAorCQkJaW50IGlvKQoreworCWludCByZXQ7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSB3MV9kczI3ODBfZG9faW8oZGV2LCBidWYsIGFkZHIsIGNvdW50LCBpbyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh3MV9kczI3ODBfaW9fbm9sb2NrKTsKKwogaW50IHcxX2RzMjc4MF9lZXByb21fY21kKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGFkZHIsIGludCBjbWQpCiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3MV9zbGF2ZSwgZGV2KTsKQEAgLTk5LDQzICsxMjEsNyBAQAogCS5yZWFkID0gdzFfZHMyNzgwX3JlYWRfYmluLAogfTsKIAotc3RhdGljIERFRklORV9JRFIoYmF0X2lkcik7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGJhdF9pZHJfbG9jayk7Ci0KLXN0YXRpYyBpbnQgbmV3X2JhdF9pZCh2b2lkKQotewotCWludCByZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQlpbnQgaWQ7Ci0KLQkJcmV0ID0gaWRyX3ByZV9nZXQoJmJhdF9pZHIsIEdGUF9LRVJORUwpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltdXRleF9sb2NrKCZiYXRfaWRyX2xvY2spOwotCQlyZXQgPSBpZHJfZ2V0X25ldygmYmF0X2lkciwgTlVMTCwgJmlkKTsKLQkJbXV0ZXhfdW5sb2NrKCZiYXRfaWRyX2xvY2spOwotCi0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gaWQgJiBNQVhfSURfTUFTSzsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcmVsZWFzZV9iYXRfaWQoaW50IGlkKQotewotCW11dGV4X2xvY2soJmJhdF9pZHJfbG9jayk7Ci0JaWRyX3JlbW92ZSgmYmF0X2lkciwgaWQpOwotCW11dGV4X3VubG9jaygmYmF0X2lkcl9sb2NrKTsKLX0KK3N0YXRpYyBERUZJTkVfSURBKGJhdF9pZGEpOwogCiBzdGF0aWMgaW50IHcxX2RzMjc4MF9hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKQEAgLTE0Myw3ICsxMjksNyBAQAogCWludCBpZDsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCi0JaWQgPSBuZXdfYmF0X2lkKCk7CisJaWQgPSBpZGFfc2ltcGxlX2dldCgmYmF0X2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGlkIDwgMCkgewogCQlyZXQgPSBpZDsKIAkJZ290byBub2lkOwpAQCAtMTcyLDcgKzE1OCw3IEBACiBwZGV2X2FkZF9mYWlsZWQ6CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CiBwZGV2X2FsbG9jX2ZhaWxlZDoKLQlyZWxlYXNlX2JhdF9pZChpZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmJhdF9pZGEsIGlkKTsKIG5vaWQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4Myw3ICsxNjksNyBAQAogCWludCBpZCA9IHBkZXYtPmlkOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JcmVsZWFzZV9iYXRfaWQoaWQpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZiYXRfaWRhLCBpZCk7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9kczI3ODBfYmluX2F0dHIpOwogfQogCkBAIC0xOTksMTQgKzE4NSwxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB3MV9kczI3ODBfaW5pdCh2b2lkKQogewotCWlkcl9pbml0KCZiYXRfaWRyKTsKKwlpZGFfaW5pdCgmYmF0X2lkYSk7CiAJcmV0dXJuIHcxX3JlZ2lzdGVyX2ZhbWlseSgmdzFfZHMyNzgwX2ZhbWlseSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3MV9kczI3ODBfZXhpdCh2b2lkKQogewogCXcxX3VucmVnaXN0ZXJfZmFtaWx5KCZ3MV9kczI3ODBfZmFtaWx5KTsKLQlpZHJfZGVzdHJveSgmYmF0X2lkcik7CisJaWRhX2Rlc3Ryb3koJmJhdF9pZGEpOwogfQogCiBtb2R1bGVfaW5pdCh3MV9kczI3ODBfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI3ODAuaCBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCmluZGV4IGExZmJhNzkuLjczNzM3OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjc4MC5oCkBAIC0xMjQsNiArMTI0LDggQEAKIAogZXh0ZXJuIGludCB3MV9kczI3ODBfaW8oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsCiAJCQlpbnQgaW8pOworZXh0ZXJuIGludCB3MV9kczI3ODBfaW9fbm9sb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgYWRkciwKKwkJCXNpemVfdCBjb3VudCwgaW50IGlvKTsKIGV4dGVybiBpbnQgdzFfZHMyNzgwX2VlcHJvbV9jbWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkciwgaW50IGNtZCk7CiAKICNlbmRpZiAvKiAhX1cxX0RTMjc4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCA2MzM1OTc5Li5lOTMwOTc3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuYworKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIHNjaGVkdWxlX3RpbWVvdXQoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJ3MV9mYW1pbHkuaCIKICNpbmNsdWRlICJ3MS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9pbnQuYyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKaW5kZXggZDIyMGJjZS4uNjgyODgzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pbnQuYworKysgYi9kcml2ZXJzL3cxL3cxX2ludC5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJ3MS5oIgogI2luY2x1ZGUgIncxX2xvZy5oIgpAQCAtNzgsNiArODAsNyBAQAogCW1lbWNweSgmZGV2LT5kZXYsIGRldmljZSwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKIAlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOworCWRldi0+ZGV2LmluaXRfbmFtZSA9IGRldi0+bmFtZTsKIAogCWRldi0+ZHJpdmVyID0gZHJpdmVyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggNzY1YjM3Yi4uMzEzNWIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtMTU4LDEzICsxNTgsMTggQEAKIHN0YXRpYyB1OCB3MV9yZWFkX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyogc2FtcGxlIHRpbWluZyBpcyBjcml0aWNhbCBoZXJlICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRldi0+YnVzX21hc3Rlci0+d3JpdGVfYml0KGRldi0+YnVzX21hc3Rlci0+ZGF0YSwgMCk7CiAJdzFfZGVsYXkoNik7CiAJZGV2LT5idXNfbWFzdGVyLT53cml0ZV9iaXQoZGV2LT5idXNfbWFzdGVyLT5kYXRhLCAxKTsKIAl3MV9kZWxheSg5KTsKIAogCXJlc3VsdCA9IGRldi0+YnVzX21hc3Rlci0+cmVhZF9iaXQoZGV2LT5idXNfbWFzdGVyLT5kYXRhKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAl3MV9kZWxheSg1NSk7CiAKIAlyZXR1cm4gcmVzdWx0ICYgMHgxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDg2YjA3MzUuLjYyODU4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTY2LDYgKzY2LDcgQEAKIGNvbmZpZyBXTTgzMVhfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiV004MzF4IHdhdGNoZG9nIgogCWRlcGVuZHMgb24gTUZEX1dNODMxWAorCXNlbGVjdCBXQVRDSERPR19DT1JFCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIHdhdGNoZG9nIGluIHRoZSBXTTgzMXggQXVkaW9QbHVzIFBNSUNzLiAgV2hlbgogCSAgdGhlIHdhdGNoZG9nIHRyaWdnZXJzIHRoZSBzeXN0ZW0gd2lsbCBiZSByZXNldC4KQEAgLTE3MCw2ICsxNzEsNyBAQAogY29uZmlnIFMzQzI0MTBfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiUzNDMjQxMCBXYXRjaGRvZyIKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCB8fCBIQVZFX1MzQzI0MTBfV0FUQ0hET0cKKwlzZWxlY3QgV0FUQ0hET0dfQ09SRQogCWhlbHAKIAkgIFdhdGNoZG9nIHRpbWVyIGJsb2NrIGluIHRoZSBTYW1zdW5nIFNvQ3MuIFRoaXMgd2lsbCByZWJvb3QKIAkgIHRoZSBzeXN0ZW0gd2hlbiB0aGUgdGltZXIgZXhwaXJlcyB3aXRoIHRoZSB3YXRjaGRvZyBlbmFibGVkLgpAQCAtNzI2LDcgKzcyOCw3IEBACiAKIGNvbmZpZyBTQkM3MjQwX1dEVAogCXRyaXN0YXRlICJTQkMgTmFubyA3MjQwIFdhdGNoZG9nIFRpbWVyIgotCWRlcGVuZHMgb24gWDg2XzMyCisJZGVwZW5kcyBvbiBYODZfMzIgJiYgIVVNTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGZvdW5kIG9uIHRoZSBJRUkKIAkgIHNpbmdsZSBib2FyZCBjb21wdXRlcnMgRVBJQyBOYW5vIDcyNDAgKGFuZCBsaWtlbHkgb3RoZXJzKS4gVGhpcwpAQCAtMTE3NCw2ICsxMTc2LDEwIEBACiAJICBieSBYZW4gNC4wIGFuZCBuZXdlci4gIFRoZSB3YXRjaGRvZyB0aW1lb3V0IHBlcmlvZCBpcyBub3JtYWxseSBvbmUKIAkgIG1pbnV0ZSBidXQgY2FuIGJlIGNoYW5nZWQgd2l0aCBhIGJvb3QtdGltZSBwYXJhbWV0ZXIuCiAKK2NvbmZpZyBVTUxfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiVU1MIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gVU1MCisKICMKICMgSVNBLWJhc2VkIFdhdGNoZG9nIENhcmRzCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2NvaDkwMTMyN193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCmluZGV4IDkyOTE1MDYuLjAzZjQ0OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jCkBAIC00MjksNyArNDI5LDcgQEAKIAl3cml0ZXcoVTMwMF9XRE9HX1NSX1JFU0VUX1NUQVRVU19SRVNFVCwgdmlydGJhc2UgKyBVMzAwX1dET0dfU1IpOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBjb2g5MDEzMjdfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWlmIChyZXF1ZXN0X2lycShpcnEsIGNvaDkwMTMyN19pbnRlcnJ1cHQsIDAsCiAJCQlEUlZfTkFNRSAiIEJhcmsiLCBwZGV2KSkgewogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dF9ub19pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2V1cm90ZWNod2R0LmMKaW5kZXggZjFkMWRhNi4uNDEwMThkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ldXJvdGVjaHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZXVyb3RlY2h3ZHQuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZXVyd2R0X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwgImV1cndkdCIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZXVyd2R0X2ludGVycnVwdCwgMCwgImV1cndkdCIsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJldXJ3ZHQ6IElSUSAlZCBpcyBub3QgZnJlZS5cbiIsIGlycSk7CiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDc1MWE1OTEuLmJhNmFkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJaW50ZWwgVENPIFdhdGNoZG9nIERyaXZlcgogICoKLSAqCShjKSBDb3B5cmlnaHQgMjAwNi0yMDEwIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoJKGMpIENvcHlyaWdodCAyMDA2LTIwMTEgV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4uCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIERSVl9OQU1FCSJpVENPX3dkdCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA3IgogI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKIAogLyogSW5jbHVkZXMgKi8KQEAgLTM4NCw2ICszODQsMTEgQEAKIAkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKIAkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiAKK3N0YXRpYyBpbnQgdHVybl9TTUlfd2F0Y2hkb2dfY2xlYXJfb2ZmID0gMDsKK21vZHVsZV9wYXJhbSh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR1cm5fU01JX3dhdGNoZG9nX2NsZWFyX29mZiwKKwkiVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nIChkZWZhdWx0PTApIik7CisKIC8qCiAgKiBTb21lIFRDTyBzcGVjaWZpYyBmdW5jdGlvbnMKICAqLwpAQCAtODA4LDEwICs4MTMsMTIgQEAKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQotCS8qIEJpdCAxMzogVENPX0VOIC0+IDAgPSBEaXNhYmxlcyBUQ08gbG9naWMgZ2VuZXJhdGluZyBhbiBTTUkjICovCi0JdmFsMzIgPSBpbmwoU01JX0VOKTsKLQl2YWwzMiAmPSAweGZmZmZkZmZmOwkvKiBUdXJuIG9mZiBTTUkgY2xlYXJpbmcgd2F0Y2hkb2cgKi8KLQlvdXRsKHZhbDMyLCBTTUlfRU4pOworCWlmICh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYpIHsKKwkJLyogQml0IDEzOiBUQ09fRU4gLT4gMCA9IERpc2FibGVzIFRDTyBsb2dpYyBnZW5lcmF0aW5nIGFuIFNNSSMgKi8KKwkJdmFsMzIgPSBpbmwoU01JX0VOKTsKKwkJdmFsMzIgJj0gMHhmZmZmZGZmZjsJLyogVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nICovCisJCW91dGwodmFsMzIsIFNNSV9FTik7CisJfQogCiAJLyogVGhlIFRDTyBJL08gcmVnaXN0ZXJzIHJlc2lkZSBpbiBhIDMyLWJ5dGUgcmFuZ2UgcG9pbnRlZCB0bwogCSAgIGJ5IHRoZSBUQ09CQVNFIHZhbHVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCmluZGV4IDRkYzMxMDIuLjgyY2NkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCkBAIC0zNjcsOCArMzY3LDcgQEAKIAkJZ290byBlcnJfbWlzYzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X2lycSh3ZHQtPmlycSwgbXBjb3JlX3dkdF9maXJlLCBJUlFGX0RJU0FCTEVELAotCQkJCQkJCSJtcGNvcmVfd2R0Iiwgd2R0KTsKKwlyZXQgPSByZXF1ZXN0X2lycSh3ZHQtPmlycSwgbXBjb3JlX3dkdF9maXJlLCAwLCAibXBjb3JlX3dkdCIsIHdkdCk7CiAJaWYgKHJldCkgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCB3ZHQtPmRldiwKIAkJCSJjYW5ub3QgcmVnaXN0ZXIgSVJRJWQgZm9yIHdhdGNoZG9nXG4iLCB3ZHQtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL29jdGVvbi13ZHQtbWFpbi5jIGIvZHJpdmVycy93YXRjaGRvZy9vY3Rlb24td2R0LW1haW4uYwppbmRleCA5NDVlZTgzLi43YzBkODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL29jdGVvbi13ZHQtbWFpbi5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2N0ZW9uLXdkdC1tYWluLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCWlycSA9IE9DVEVPTl9JUlFfV0RPRzAgKyBjb3JlOwogCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgb2N0ZW9uX3dkdF9wb2tlX2lycSwKLQkJCUlSUUZfRElTQUJMRUQsICJvY3Rlb25fd2R0Iiwgb2N0ZW9uX3dkdF9wb2tlX2lycSkpCisJCQlJUlFGX05PX1RIUkVBRCwgIm9jdGVvbl93ZHQiLCBvY3Rlb25fd2R0X3Bva2VfaXJxKSkKIAkJcGFuaWMoIm9jdGVvbl93ZHQ6IENvdWxkbid0IG9idGFpbiBpcnEgJWQiLCBpcnEpOwogCiAJY3B1bWFza19zZXRfY3B1KGNwdSwgJmlycV9lbmFibGVkX2NwdXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IDMwZGE4OGYuLjVkZTdlNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTI3LDkgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPiAvKiBmb3IgTU9EVUxFX0FMSUFTX01JU0NERVYgKi8KICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKQEAgLTc0LDE0ICs3NCwxMiBAQAogCQkJIjAgdG8gcmVib290IChkZWZhdWx0IDApIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiV2F0Y2hkb2cgZGVidWcsIHNldCB0byA+MSBmb3IgZGVidWcgKGRlZmF1bHQgMCkiKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Blbl9sb2NrOwogc3RhdGljIHN0cnVjdCBkZXZpY2UgICAgKndkdF9kZXY7CS8qIHBsYXRmb3JtIGRldmljZSBhdHRhY2hlZCB0byAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZQkqd2R0X21lbTsKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UJKndkdF9pcnE7CiBzdGF0aWMgc3RydWN0IGNsawkqd2R0X2Nsb2NrOwogc3RhdGljIHZvaWQgX19pb21lbQkqd2R0X2Jhc2U7CiBzdGF0aWMgdW5zaWduZWQgaW50CSB3ZHRfY291bnQ7Ci1zdGF0aWMgY2hhcgkJIGV4cGVjdF9jbG9zZTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sod2R0X2xvY2spOwogCiAvKiB3YXRjaGRvZyBjb250cm9sIHJvdXRpbmVzICovCkBAIC05MywxMSArOTEsMTMgQEAKIAogLyogZnVuY3Rpb25zICovCiAKLXN0YXRpYyB2b2lkIHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHZvaWQpCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfa2VlcGFsaXZlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAlzcGluX2xvY2soJndkdF9sb2NrKTsKIAl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDTlQpOwogCXNwaW5fdW5sb2NrKCZ3ZHRfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19zM2MyNDEwd2R0X3N0b3Aodm9pZCkKQEAgLTEwOSwxNCArMTA5LDE2IEBACiAJd3JpdGVsKHd0Y29uLCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDT04pOwogfQogCi1zdGF0aWMgdm9pZCBzM2MyNDEwd2R0X3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgczNjMjQxMHdkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAlzcGluX2xvY2soJndkdF9sb2NrKTsKIAlfX3MzYzI0MTB3ZHRfc3RvcCgpOwogCXNwaW5fdW5sb2NrKCZ3ZHRfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgczNjMjQxMHdkdF9zdGFydCh2b2lkKQorc3RhdGljIGludCBzM2MyNDEwd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKIHsKIAl1bnNpZ25lZCBsb25nIHd0Y29uOwogCkBAIC0xNDIsNiArMTQ0LDggQEAKIAl3cml0ZWwod2R0X2NvdW50LCB3ZHRfYmFzZSArIFMzQzI0MTBfV1RDTlQpOwogCXdyaXRlbCh3dGNvbiwgd2R0X2Jhc2UgKyBTM0MyNDEwX1dUQ09OKTsKIAlzcGluX3VubG9jaygmd2R0X2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHMzYzI0MTB3ZHRfaXNfcnVubmluZyh2b2lkKQpAQCAtMTQ5LDcgKzE1Myw3IEBACiAJcmV0dXJuIHJlYWRsKHdkdF9iYXNlICsgUzNDMjQxMF9XVENPTikgJiBTM0MyNDEwX1dUQ09OX0VOQUJMRTsKIH0KIAotc3RhdGljIGludCBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsIHVuc2lnbmVkIHRpbWVvdXQpCiB7CiAJdW5zaWduZWQgbG9uZyBmcmVxID0gY2xrX2dldF9yYXRlKHdkdF9jbG9jayk7CiAJdW5zaWduZWQgaW50IGNvdW50OwpAQCAtMTgyLDggKzE4Niw2IEBACiAJCX0KIAl9CiAKLQl0bXJfbWFyZ2luID0gdGltZW91dDsKLQogCURCRygiJXM6IHRpbWVvdXQ9JWQsIGRpdmlzb3I9JWQsIGNvdW50PSVkICglMDh4KVxuIiwKIAkgICAgX19mdW5jX18sIHRpbWVvdXQsIGRpdmlzb3IsIGNvdW50LCBjb3VudC9kaXZpc29yKTsKIApAQCAtMjAxLDcwICsyMDMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICoJL2Rldi93YXRjaGRvZyBoYW5kbGluZwotICovCi0KLXN0YXRpYyBpbnQgczNjMjQxMHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZvcGVuX2xvY2spKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKG5vd2F5b3V0KQotCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCi0JZXhwZWN0X2Nsb3NlID0gMDsKLQotCS8qIHN0YXJ0IHRoZSB0aW1lciAqLwotCXMzYzI0MTB3ZHRfc3RhcnQoKTsKLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjQxMHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCS8qCi0JICoJU2h1dCBvZmYgdGhlIHRpbWVyLgotCSAqCUxvY2sgaXQgaW4gaWYgaXQncyBhIG1vZHVsZSBhbmQgd2Ugc2V0IG5vd2F5b3V0Ci0JICovCi0KLQlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKQotCQlzM2MyNDEwd2R0X3N0b3AoKTsKLQllbHNlIHsKLQkJZGV2X2Vycih3ZHRfZGV2LCAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nXG4iKTsKLQkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0JZXhwZWN0X2Nsb3NlID0gMDsKLQljbGVhcl9iaXQoMCwgJm9wZW5fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHMzYzI0MTB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAotCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQkvKgotCSAqCVJlZnJlc2ggdGhlIHRpbWVyLgotCSAqLwotCWlmIChsZW4pIHsKLQkJaWYgKCFub3dheW91dCkgewotCQkJc2l6ZV90IGk7Ci0KLQkJCS8qIEluIGNhc2UgaXQgd2FzIHNldCBsb25nIGFnbyAqLwotCQkJZXhwZWN0X2Nsb3NlID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgewotCQkJCWNoYXIgYzsKLQotCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjID09ICdWJykKLQkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7Ci0JCQl9Ci0JCX0KLQkJczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLQogI2RlZmluZSBPUFRJT05TIChXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBzM2MyNDEwX3dkdF9pZGVudCA9IHsKQEAgLTI3Myw1MyArMjExLDE3IEBACiAJLmlkZW50aXR5ICAgICAgICAgPQkiUzNDMjQxMCBXYXRjaGRvZyIsCiB9OwogCi0KLXN0YXRpYyBsb25nIHMzYzI0MTB3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCXVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0JaW50IG5ld19tYXJnaW47Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKLQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmczNjMjQxMF93ZHRfaWRlbnQsCi0JCQlzaXplb2YoczNjMjQxMF93ZHRfaWRlbnQpKSA/IC1FRkFVTFQgOiAwOwotCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgotCQlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgpOwotCQlyZXR1cm4gMDsKLQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6Ci0JCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KG5ld19tYXJnaW4pKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7Ci0JCXJldHVybiBwdXRfdXNlcih0bXJfbWFyZ2luLCBwKTsKLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJldHVybiBwdXRfdXNlcih0bXJfbWFyZ2luLCBwKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1RUWTsKLQl9Ci19Ci0KLS8qIGtlcm5lbCBpbnRlcmZhY2UgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgczNjMjQxMHdkdF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkud3JpdGUJCT0gczNjMjQxMHdkdF93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBzM2MyNDEwd2R0X2lvY3RsLAotCS5vcGVuCQk9IHMzYzI0MTB3ZHRfb3BlbiwKLQkucmVsZWFzZQk9IHMzYzI0MTB3ZHRfcmVsZWFzZSwKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHMzYzI0MTB3ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHMzYzI0MTB3ZHRfc3RhcnQsCisJLnN0b3AgPSBzM2MyNDEwd2R0X3N0b3AsCisJLnBpbmcgPSBzM2MyNDEwd2R0X2tlZXBhbGl2ZSwKKwkuc2V0X3RpbWVvdXQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgczNjMjQxMHdkdF9taXNjZGV2ID0gewotCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCS5mb3BzCQk9ICZzM2MyNDEwd2R0X2ZvcHMsCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2RldmljZSBzM2MyNDEwX3dkZCA9IHsKKwkuaW5mbyA9ICZzM2MyNDEwX3dkdF9pZGVudCwKKwkub3BzID0gJnMzYzI0MTB3ZHRfb3BzLAogfTsKIAogLyogaW50ZXJydXB0IGhhbmRsZXIgY29kZSAqLwpAQCAtMzI4LDcgKzIzMCw3IEBACiB7CiAJZGV2X2luZm8od2R0X2RldiwgIndhdGNoZG9nIHRpbWVyIGV4cGlyZWQgKGlycSlcbiIpOwogCi0JczNjMjQxMHdkdF9rZWVwYWxpdmUoKTsKKwlzM2MyNDEwd2R0X2tlZXBhbGl2ZSgmczNjMjQxMF93ZGQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzQ5LDE0ICsyNTEsMTQgQEAKIAkJICogdGhlIHdhdGNoZG9nIGlzIHJ1bm5pbmcuCiAJCSAqLwogCi0JCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCk7CisJCXMzYzI0MTB3ZHRfa2VlcGFsaXZlKCZzM2MyNDEwX3dkZCk7CiAJfSBlbHNlIGlmICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFKSB7Ci0JCXMzYzI0MTB3ZHRfc3RvcCgpOworCQlzM2MyNDEwd2R0X3N0b3AoJnMzYzI0MTBfd2RkKTsKIAotCQlyZXQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQodG1yX21hcmdpbik7CisJCXJldCA9IHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCgmczNjMjQxMF93ZGQsIHMzYzI0MTBfd2RkLnRpbWVvdXQpOwogCiAJCWlmIChyZXQgPj0gMCkKLQkJCXMzYzI0MTB3ZHRfc3RhcnQoKTsKKwkJCXMzYzI0MTB3ZHRfc3RhcnQoJnMzYzI0MTBfd2RkKTsKIAkJZWxzZQogCQkJZ290byBlcnI7CiAJfQpAQCAtMzY1LDcgKzI2Nyw4IEBACiAJcmV0dXJuIDA7CiAKICBlcnI6Ci0JZGV2X2Vycih3ZHRfZGV2LCAiY2Fubm90IHNldCBuZXcgdmFsdWUgZm9yIHRpbWVvdXQgJWRcbiIsIHRtcl9tYXJnaW4pOworCWRldl9lcnIod2R0X2RldiwgImNhbm5vdCBzZXQgbmV3IHZhbHVlIGZvciB0aW1lb3V0ICVkXG4iLAorCQkJCXMzYzI0MTBfd2RkLnRpbWVvdXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM5NiwxMCArMjk5LDYgQEAKIH0KICNlbmRpZgogCi0KLQotLyogZGV2aWNlIGludGVyZmFjZSAqLwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2MyNDEwd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtNDY2LDggKzM2NSw4IEBACiAJLyogc2VlIGlmIHdlIGNhbiBhY3R1YWxseSBzZXQgdGhlIHJlcXVlc3RlZCB0aW1lciBtYXJnaW4sIGFuZCBpZgogCSAqIG5vdCwgdHJ5IHRoZSBkZWZhdWx0IHZhbHVlICovCiAKLQlpZiAoczNjMjQxMHdkdF9zZXRfaGVhcnRiZWF0KHRtcl9tYXJnaW4pKSB7Ci0JCXN0YXJ0ZWQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoCisJaWYgKHMzYzI0MTB3ZHRfc2V0X2hlYXJ0YmVhdCgmczNjMjQxMF93ZGQsIHRtcl9tYXJnaW4pKSB7CisJCXN0YXJ0ZWQgPSBzM2MyNDEwd2R0X3NldF9oZWFydGJlYXQoJnMzYzI0MTBfd2RkLAogCQkJCQlDT05GSUdfUzNDMjQxMF9XQVRDSERPR19ERUZBVUxUX1RJTUUpOwogCiAJCWlmIChzdGFydGVkID09IDApCkBAIC00NzksMjIgKzM3OCwyMSBAQAogCQkJCQkJCSJjYW5ub3Qgc3RhcnRcbiIpOwogCX0KIAotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnMzYzI0MTB3ZHRfbWlzY2Rldik7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZzM2MyNDEwX3dkZCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkICglZClcbiIsCi0JCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgd2F0Y2hkb2cgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfY3B1ZnJlcTsKIAl9CiAKIAlpZiAodG1yX2F0Ym9vdCAmJiBzdGFydGVkID09IDApIHsKIAkJZGV2X2luZm8oZGV2LCAic3RhcnRpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOwotCQlzM2MyNDEwd2R0X3N0YXJ0KCk7CisJCXMzYzI0MTB3ZHRfc3RhcnQoJnMzYzI0MTBfd2RkKTsKIAl9IGVsc2UgaWYgKCF0bXJfYXRib290KSB7CiAJCS8qIGlmIHdlJ3JlIG5vdCBlbmFibGluZyB0aGUgd2F0Y2hkb2csIHRoZW4gZW5zdXJlIGl0IGlzCiAJCSAqIGRpc2FibGVkIGlmIGl0IGhhcyBiZWVuIGxlZnQgcnVubmluZyBmcm9tIHRoZSBib290bG9hZGVyCiAJCSAqIG9yIG90aGVyIHNvdXJjZSAqLwogCi0JCXMzYzI0MTB3ZHRfc3RvcCgpOworCQlzM2MyNDEwd2R0X3N0b3AoJnMzYzI0MTBfd2RkKTsKIAl9CiAKIAkvKiBwcmludCBvdXQgYSBzdGF0ZW1lbnQgb2YgcmVhZGluZXNzICovCkBAIC01MzAsNyArNDI4LDcgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgczNjMjQxMHdkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCW1pc2NfZGVyZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKKwl3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgmczNjMjQxMF93ZGQpOwogCiAJczNjMjQxMHdkdF9jcHVmcmVxX2RlcmVnaXN0ZXIoKTsKIApAQCAtNTUwLDcgKzQ0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHMzYzI0MTB3ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotCXMzYzI0MTB3ZHRfc3RvcCgpOworCXMzYzI0MTB3ZHRfc3RvcCgmczNjMjQxMF93ZGQpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC01NjUsNyArNDYzLDcgQEAKIAl3dGRhdF9zYXZlID0gcmVhZGwod2R0X2Jhc2UgKyBTM0MyNDEwX1dUREFUKTsKIAogCS8qIE5vdGUgdGhhdCBXVENOVCBkb2Vzbid0IG5lZWQgdG8gYmUgc2F2ZWQuICovCi0JczNjMjQxMHdkdF9zdG9wKCk7CisJczNjMjQxMHdkdF9zdG9wKCZzM2MyNDEwX3dkZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2Jfd2RvZy5jIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKaW5kZXggZjMxNDkzZS4uYjAxYTMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYl93ZG9nLmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCSAqIGdldCB0aGUgcmVzb3VyY2VzCiAJICovCiAKLQlyZXQgPSByZXF1ZXN0X2lycSgxLCBzYndkb2dfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoMSwgc2J3ZG9nX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCWlkZW50LmlkZW50aXR5LCAodm9pZCAqKXVzZXJfZG9nKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZXF1ZXN0IGlycSAxIC0gJWRcbiIsCkBAIC0zNTAsNyArMzUwLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoMSwgc2J3ZG9nX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCXJldCA9IHJlcXVlc3RfaXJxKDEsIHNid2RvZ19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkiS2VybmVsIFdhdGNoZG9nIiwgSU9BRERSKEFfU0NEX1dET0dfQ0ZHXzApKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0NSSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3NjNTIwX3dkdC5jCmluZGV4IDUyYjYzZjIuLmIyODQwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc2M1MjBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zYzUyMF93ZHQuYwpAQCAtMzk4LDcgKzM5OCw3IEBACiAJCQkJCQkJV0FUQ0hET0dfVElNRU9VVCk7CiAJfQogCi0Jd2R0bXJjdGwgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKShNTUNSX0JBU0UgKyBPRkZTX1dEVE1SQ1RMKSwgMik7CisJd2R0bXJjdGwgPSBpb3JlbWFwKE1NQ1JfQkFTRSArIE9GRlNfV0RUTVJDVEwsIDIpOwogCWlmICghd2R0bXJjdGwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHJlbWFwIG1lbW9yeVxuIik7CiAJCXJjID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3RtcDN4eHhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3N0bXAzeHh4X3dkdC5jCmluZGV4IGIzNDIxZmQuLmFjMjM0NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc3RtcDN4eHhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zdG1wM3h4eF93ZHQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1ydGMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IGU1YzkxZDQuLmRkNWQ2NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2MjdoZl93ZHQuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKIH0KIAotc3RhdGljIHZvaWQgd2R0X2N0cmwoaW50IHRpbWVvdXQpCitzdGF0aWMgdm9pZCB3ZHRfc2V0X3RpbWUoaW50IHRpbWVvdXQpCiB7CiAJc3Bpbl9sb2NrKCZpb19sb2NrKTsKIApAQCAtMTU4LDEzICsxNTgsMTMgQEAKIAogc3RhdGljIGludCB3ZHRfcGluZyh2b2lkKQogewotCXdkdF9jdHJsKHRpbWVvdXQpOworCXdkdF9zZXRfdGltZSh0aW1lb3V0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3ZHRfZGlzYWJsZSh2b2lkKQogewotCXdkdF9jdHJsKDApOworCXdkdF9zZXRfdGltZSgwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc2LDYgKzE3NiwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHdkdF9nZXRfdGltZSh2b2lkKQoreworCWludCB0aW1lbGVmdDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisKKwl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCW91dGJfcCgweEY2LCBXRFRfRUZFUik7ICAgIC8qIFNlbGVjdCBDUkY2ICovCisJdGltZWxlZnQgPSBpbmJfcChXRFRfRUZEUik7IC8qIFJlYWQgVGltZW91dCBjb3VudGVyIHRvIENSRjYgKi8KKworCXc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKCk7CisKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisKKwlyZXR1cm4gdGltZWxlZnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHdkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjAyLDcgKzIyMCw3IEBACiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0JaW50IG5ld190aW1lb3V0OworCWludCB0aW1ldmFsOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKIAkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CiAJCQkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKQEAgLTIzOCwxNCArMjU2LDE3IEBACiAJCXdkdF9waW5nKCk7CiAJCWJyZWFrOwogCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKKwkJaWYgKGdldF91c2VyKHRpbWV2YWwsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdChuZXdfdGltZW91dCkpCisJCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1ldmFsKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQl3ZHRfcGluZygpOwogCQkvKiBGYWxsICovCiAJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgogCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CisJY2FzZSBXRElPQ19HRVRUSU1FTEVGVDoKKwkJdGltZXZhbCA9IHdkdF9nZXRfdGltZSgpOworCQlyZXR1cm4gcHV0X3VzZXIodGltZXZhbCwgcCk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0LmMKaW5kZXggYmIwM2UxNS4uZDJlZjAwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dkdC5jCkBAIC02MTIsNyArNjEyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCB3ZHRfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAid2R0NTAxcCIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgd2R0X2ludGVycnVwdCwgMCwgIndkdDUwMXAiLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAid2R0OiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBpcnEpOwogCQlnb3RvIG91dHJlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jIGIvZHJpdmVycy93YXRjaGRvZy93ZHRfcGNpLmMKaW5kZXggMTcyZGFkNi4uZTBmYzNiYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2R0X3BjaS5jCkBAIC02NDMsNyArNjQzLDcgQEAKIAlpcnEgPSBkZXYtPmlycTsKIAlpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDIpOwogCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgd2R0cGNpX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCWlmIChyZXF1ZXN0X2lycShpcnEsIHdkdHBjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICJ3ZHRfcGNpIiwgJndkdHBjaV9taXNjZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJJUlEgJWQgaXMgbm90IGZyZWVcbiIsIGlycSk7CiAJCWdvdG8gb3V0X3JlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd204MzF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKaW5kZXggODcxY2FlYS4uN2JlMzg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93bTgzMXhfd2R0LmMKQEAgLTEyLDggKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtMjksMTkgKzI4LDE5IEBACiAJCSAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKIAkJIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgd204MzF4X3dkdF91c2VyczsKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3bTgzMXhfd2R0X21pc2NkZXY7Ci1zdGF0aWMgaW50IHdtODMxeF93ZHRfZXhwZWN0X2Nsb3NlOwotc3RhdGljIERFRklORV9NVVRFWCh3ZHRfbXV0ZXgpOwotc3RhdGljIHN0cnVjdCB3bTgzMXggKndtODMxeDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdXBkYXRlX2dwaW87Ci1zdGF0aWMgdW5zaWduZWQgaW50IHVwZGF0ZV9zdGF0ZTsKK3N0cnVjdCB3bTgzMXhfd2R0X2RydmRhdGEgeworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2Ugd2R0OworCXN0cnVjdCB3bTgzMXggKndtODMxeDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlpbnQgdXBkYXRlX2dwaW87CisJaW50IHVwZGF0ZV9zdGF0ZTsKK307CiAKIC8qIFdlIGNhbid0IHVzZSB0aGUgc3ViLXNlY29uZCB2YWx1ZXMgaGVyZSBidXQgdGhleSdyZSBpbmNsdWRlZAogICogZm9yIGNvbXBsZXRlbmVzcy4gICovCiBzdGF0aWMgc3RydWN0IHsKLQlpbnQgdGltZTsgIC8qIFNlY29uZHMgKi8KLQl1MTYgdmFsOyAgIC8qIFdET0dfVE8gdmFsdWUgKi8KKwl1bnNpZ25lZCBpbnQgdGltZTsgIC8qIFNlY29uZHMgKi8KKwl1MTYgdmFsOyAgICAgICAgICAgIC8qIFdET0dfVE8gdmFsdWUgKi8KIH0gd204MzF4X3dkdF9jZmdzW10gPSB7CiAJeyAgMSwgMiB9LAogCXsgIDIsIDMgfSwKQEAgLTUyLDMyICs1MSwxMyBAQAogCXsgMzMsIDcgfSwgIC8qIEFjdHVhbGx5IDMyLjc2OHMgc28gaW5jbHVkZSBib3RoLCBvdGhlcnMgcm91bmQgZG93biAqLwogfTsKIAotc3RhdGljIGludCB3bTgzMXhfd2R0X3NldF90aW1lb3V0KHN0cnVjdCB3bTgzMXggKndtODMxeCwgdTE2IHZhbHVlKQorc3RhdGljIGludCB3bTgzMXhfd2R0X3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZ3ZHRfbXV0ZXgpOwotCi0JcmV0ID0gd204MzF4X3JlZ191bmxvY2sod204MzF4KTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX1dBVENIRE9HLAotCQkJCSAgICAgIFdNODMxWF9XRE9HX1RPX01BU0ssIHZhbHVlKTsKLQkJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byB1bmxvY2sgc2VjdXJpdHkga2V5OiAlZFxuIiwKLQkJCXJldCk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ3ZHRfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bTgzMXhfd2R0X3N0YXJ0KHN0cnVjdCB3bTgzMXggKndtODMxeCkKLXsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmd2R0X211dGV4KTsKKwltdXRleF9sb2NrKCZkcml2ZXJfZGF0YS0+bG9jayk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3VubG9jayh3bTgzMXgpOwogCWlmIChyZXQgPT0gMCkgewpAQCAtODksMTYgKzY5LDE4IEBACiAJCQlyZXQpOwogCX0KIAotCW11dGV4X3VubG9jaygmd2R0X211dGV4KTsKKwltdXRleF91bmxvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X3dkdF9zdG9wKHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3N0YXRpYyBpbnQgd204MzF4X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZ3ZHRfbXV0ZXgpOworCW11dGV4X2xvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldCA9IHdtODMxeF9yZWdfdW5sb2NrKHdtODMxeCk7CiAJaWYgKHJldCA9PSAwKSB7CkBAIC0xMTAsMjYgKzkyLDI4IEBACiAJCQlyZXQpOwogCX0KIAotCW11dGV4X3VubG9jaygmd2R0X211dGV4KTsKKwltdXRleF91bmxvY2soJmRyaXZlcl9kYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X3dkdF9raWNrKHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3N0YXRpYyBpbnQgd204MzF4X3dkdF9waW5nKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkdF9kZXYpCiB7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OwogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCW11dGV4X2xvY2soJndkdF9tdXRleCk7CisJbXV0ZXhfbG9jaygmZHJpdmVyX2RhdGEtPmxvY2spOwogCi0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHVwZGF0ZV9ncGlvLCB1cGRhdGVfc3RhdGUpOwotCQl1cGRhdGVfc3RhdGUgPSAhdXBkYXRlX3N0YXRlOworCWlmIChkcml2ZXJfZGF0YS0+dXBkYXRlX2dwaW8pIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZHJpdmVyX2RhdGEtPnVwZGF0ZV9ncGlvLAorCQkJCQlkcml2ZXJfZGF0YS0+dXBkYXRlX3N0YXRlKTsKKwkJZHJpdmVyX2RhdGEtPnVwZGF0ZV9zdGF0ZSA9ICFkcml2ZXJfZGF0YS0+dXBkYXRlX3N0YXRlOwogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9CiAKLQogCXJlZyA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9XQVRDSERPRyk7CiAKIAlpZiAoIShyZWcgJiBXTTgzMVhfV0RPR19SU1RfU1JDKSkgewpAQCAtMTUwLDE4MiArMTM0LDU5IEBACiAJfQogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ3ZHRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZHJpdmVyX2RhdGEtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bTgzMXhfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2R0X2RldiwKKwkJCQkgIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewotCWludCByZXQ7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkcml2ZXJfZGF0YS0+d204MzF4OworCWludCByZXQsIGk7CiAKLQlpZiAoIXdtODMxeCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKTsgaSsrKQorCQlpZiAod204MzF4X3dkdF9jZmdzW2ldLnRpbWUgPT0gdGltZW91dCkKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKKwkJcmV0ID0gLUVJTlZBTDsKIAotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3bTgzMXhfd2R0X3VzZXJzKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldCA9IHdtODMxeF93ZHRfc3RhcnQod204MzF4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgd204MzF4X3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICh3bTgzMXhfd2R0X2V4cGVjdF9jbG9zZSkKLQkJd204MzF4X3dkdF9zdG9wKHdtODMxeCk7Ci0JZWxzZSB7Ci0JCWRldl93YXJuKHdtODMxeC0+ZGV2LCAiV2F0Y2hkb2cgZGV2aWNlIGNsb3NlZCB1bmNsZWFubHlcbiIpOwotCQl3bTgzMXhfd2R0X2tpY2sod204MzF4KTsKKwlyZXQgPSB3bTgzMXhfcmVnX3VubG9jayh3bTgzMXgpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfV0FUQ0hET0csCisJCQkJICAgICAgV004MzFYX1dET0dfVE9fTUFTSywKKwkJCQkgICAgICB3bTgzMXhfd2R0X2NmZ3NbaV0udmFsKTsKKwkJd204MzF4X3JlZ19sb2NrKHdtODMxeCk7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byB1bmxvY2sgc2VjdXJpdHkga2V5OiAlZFxuIiwKKwkJCXJldCk7CiAJfQogCi0JY2xlYXJfYml0KDAsICZ3bTgzMXhfd2R0X3VzZXJzKTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHdtODMxeF93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwKLQkJCQlsb2ZmX3QgKnBwb3MpCi17Ci0Jc2l6ZV90IGk7Ci0KLQlpZiAoY291bnQpIHsKLQkJd204MzF4X3dkdF9raWNrKHdtODMxeCk7Ci0KLQkJaWYgKCFub3dheW91dCkgewotCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCi0JCQl3bTgzMXhfd2R0X2V4cGVjdF9jbG9zZSA9IDA7Ci0KLQkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMKLQkJCSAgIGNoYXJhY3RlciAqLwotCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7Ci0JCQkJY2hhciBjOwotCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmIChjID09ICdWJykKLQkJCQkJd204MzF4X3dkdF9leHBlY3RfY2xvc2UgPSA0MjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB3bTgzMXhfd2R0X2luZm8gPSB7CiAJLm9wdGlvbnMgPSBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UsCiAJLmlkZW50aXR5ID0gIldNODMxeCBXYXRjaGRvZyIsCiB9OwogCi1zdGF0aWMgbG9uZyB3bTgzMXhfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0ID0gLUVOT1RUWSwgdGltZSwgaTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgX191c2VyICpwID0gYXJncDsKLQl1MTYgcmVnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFdESU9DX0dFVFNVUFBPUlQ6Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRElPQ19HRVRTVEFUVVM6Ci0JY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgotCQlyZXQgPSBwdXRfdXNlcigwLCBwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX1NFVE9QVElPTlM6Ci0JewotCQlpbnQgb3B0aW9uczsKLQotCQlpZiAoZ2V0X3VzZXIob3B0aW9ucywgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXQgPSAtRUlOVkFMOwotCi0JCS8qIFNldHRpbmcgYm90aCBzaW11bHRhbmVvdXNseSBtZWFucyBhdCBsZWFzdCBvbmUgbXVzdCBmYWlsICovCi0JCWlmIChvcHRpb25zID09IFdESU9TX0RJU0FCTEVDQVJEKQotCQkJcmV0ID0gd204MzF4X3dkdF9zdGFydCh3bTgzMXgpOwotCi0JCWlmIChvcHRpb25zID09IFdESU9TX0VOQUJMRUNBUkQpCi0JCQlyZXQgPSB3bTgzMXhfd2R0X3N0b3Aod204MzF4KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBXRElPQ19LRUVQQUxJVkU6Ci0JCXJldCA9IHdtODMxeF93ZHRfa2ljayh3bTgzMXgpOwotCQlicmVhazsKLQotCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJcmV0ID0gZ2V0X3VzZXIodGltZSwgcCk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQotCQlpZiAodGltZSA9PSAwKSB7Ci0JCQlpZiAobm93YXlvdXQpCi0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQl3bTgzMXhfd2R0X3N0b3Aod204MzF4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKTsgaSsrKQotCQkJaWYgKHdtODMxeF93ZHRfY2Znc1tpXS50aW1lID09IHRpbWUpCi0JCQkJYnJlYWs7Ci0JCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXJldCA9IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQod204MzF4LAotCQkJCQkJICAgICB3bTgzMXhfd2R0X2NmZ3NbaV0udmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6Ci0JCXJlZyA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9XQVRDSERPRyk7Ci0JCXJlZyAmPSBXTTgzMVhfV0RPR19UT19NQVNLOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfd2R0X2NmZ3MpOyBpKyspCi0JCQlpZiAod204MzF4X3dkdF9jZmdzW2ldLnZhbCA9PSByZWcpCi0JCQkJYnJlYWs7Ci0JCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkgewotCQkJZGV2X3dhcm4od204MzF4LT5kZXYsCi0JCQkJICJVbmtub3duIHdhdGNoZG9nIGNvbmZpZ3VyYXRpb246ICV4XG4iLCByZWcpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfSBlbHNlCi0JCQlyZXQgPSBwdXRfdXNlcih3bTgzMXhfd2R0X2NmZ3NbaV0udGltZSwgcCk7Ci0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3bTgzMXhfd2R0X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyB3bTgzMXhfd2R0X29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotCS53cml0ZSA9IHdtODMxeF93ZHRfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gd204MzF4X3dkdF9pb2N0bCwKLQkub3BlbiA9IHdtODMxeF93ZHRfb3BlbiwKLQkucmVsZWFzZSA9IHdtODMxeF93ZHRfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3bTgzMXhfd2R0X21pc2NkZXYgPSB7Ci0JLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCi0JLm5hbWUgPSAid2F0Y2hkb2ciLAotCS5mb3BzID0gJndtODMxeF93ZHRfZm9wcywKKwkuc3RhcnQgPSB3bTgzMXhfd2R0X3N0YXJ0LAorCS5zdG9wID0gd204MzF4X3dkdF9zdG9wLAorCS5waW5nID0gd204MzF4X3dkdF9waW5nLAorCS5zZXRfdGltZW91dCA9IHdtODMxeF93ZHRfc2V0X3RpbWVvdXQsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTgzMXhfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKmNoaXBfcGRhdGE7CiAJc3RydWN0IHdtODMxeF93YXRjaGRvZ19wZGF0YSAqcGRhdGE7Ci0JaW50IHJlZywgcmV0OwotCi0JaWYgKHdtODMxeCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ3bTgzMXggd2F0Y2hkb2cgYWxyZWFkeSByZWdpc3RlcmVkXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQl3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGE7CisJc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd204MzF4X3dkdDsKKwlpbnQgcmVnLCByZXQsIGk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfV0FUQ0hET0cpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zMzgsNiArMTk5LDM2IEBACiAJaWYgKHJlZyAmIFdNODMxWF9XRE9HX0RFQlVHKQogCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIldhdGNoZG9nIGlzIHBhdXNlZFxuIik7CiAKKwlkcml2ZXJfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZHJpdmVyX2RhdGEpIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIlVuYWJsZSB0byBhbGxvYWNhdGUgd2F0Y2hkb2cgZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJbXV0ZXhfaW5pdCgmZHJpdmVyX2RhdGEtPmxvY2spOworCWRyaXZlcl9kYXRhLT53bTgzMXggPSB3bTgzMXg7CisKKwl3bTgzMXhfd2R0ID0gJmRyaXZlcl9kYXRhLT53ZHQ7CisKKwl3bTgzMXhfd2R0LT5pbmZvID0gJndtODMxeF93ZHRfaW5mbzsKKwl3bTgzMXhfd2R0LT5vcHMgPSAmd204MzF4X3dkdF9vcHM7CisJd2F0Y2hkb2dfc2V0X2RydmRhdGEod204MzF4X3dkdCwgZHJpdmVyX2RhdGEpOworCisJaWYgKG5vd2F5b3V0KQorCQl3bTgzMXhfd2R0LT5zdGF0dXMgfD0gV0RPR19OT19XQVlfT1VUOworCisJcmVnID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX1dBVENIRE9HKTsKKwlyZWcgJj0gV004MzFYX1dET0dfVE9fTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXhfd2R0X2NmZ3MpOyBpKyspCisJCWlmICh3bTgzMXhfd2R0X2NmZ3NbaV0udmFsID09IHJlZykKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod204MzF4X3dkdF9jZmdzKSkKKwkJZGV2X3dhcm4od204MzF4LT5kZXYsCisJCQkgIlVua25vd24gd2F0Y2hkb2cgdGltZW91dDogJXhcbiIsIHJlZyk7CisJZWxzZQorCQl3bTgzMXhfd2R0LT50aW1lb3V0ID0gd204MzF4X3dkdF9jZmdzW2ldLnRpbWU7CisKIAkvKiBBcHBseSBhbnkgY29uZmlndXJhdGlvbiAqLwogCWlmIChwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CiAJCWNoaXBfcGRhdGEgPSBwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwpAQCAtMzYxLDcgKzI1Miw3IEBACiAJCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKIAkJCQkJIkZhaWxlZCB0byByZXF1ZXN0IHVwZGF0ZSBHUElPOiAlZFxuIiwKIAkJCQkJcmV0KTsKLQkJCQlnb3RvIGVycjsKKwkJCQlnb3RvIGVycl9hbGxvYzsKIAkJCX0KIAogCQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT51cGRhdGVfZ3BpbywgMCk7CkBAIC0zNzIsNyArMjYzLDcgQEAKIAkJCQlnb3RvIGVycl9ncGlvOwogCQkJfQogCi0JCQl1cGRhdGVfZ3BpbyA9IHBkYXRhLT51cGRhdGVfZ3BpbzsKKwkJCWRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbyA9IHBkYXRhLT51cGRhdGVfZ3BpbzsKIAogCQkJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyB0YWtlcyBoYXJkd2FyZSB1cGRhdGVzICovCiAJCQlyZWcgfD0gV004MzFYX1dET0dfUlNUX1NSQzsKQEAgLTM4OSwzMyArMjgwLDM0IEBACiAJCX0KIAl9CiAKLQl3bTgzMXhfd2R0X21pc2NkZXYucGFyZW50ID0gJnBkZXYtPmRldjsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJndtODMxeF93ZHRfbWlzY2Rldik7CisJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZkcml2ZXJfZGF0YS0+d2R0KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBtaXNjZGV2OiAlZFxuIiwgcmV0KTsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIndhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgpIGZhaWxlZDogJWRcbiIsCisJCQlyZXQpOwogCQlnb3RvIGVycl9ncGlvOwogCX0KIAorCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkcml2ZXJfZGF0YSk7CisKIAlyZXR1cm4gMDsKIAogZXJyX2dwaW86Ci0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fZnJlZSh1cGRhdGVfZ3Bpbyk7Ci0JCXVwZGF0ZV9ncGlvID0gMDsKLQl9CisJaWYgKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbykKKwkJZ3Bpb19mcmVlKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3Bpbyk7CitlcnJfYWxsb2M6CisJa2ZyZWUoZHJpdmVyX2RhdGEpOwogZXJyOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHdtODMxeF93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaWYgKHVwZGF0ZV9ncGlvKSB7Ci0JCWdwaW9fZnJlZSh1cGRhdGVfZ3Bpbyk7Ci0JCXVwZGF0ZV9ncGlvID0gMDsKLQl9CisJc3RydWN0IHdtODMxeF93ZHRfZHJ2ZGF0YSAqZHJpdmVyX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAKLQltaXNjX2RlcmVnaXN0ZXIoJndtODMxeF93ZHRfbWlzY2Rldik7CisJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJmRyaXZlcl9kYXRhLT53ZHQpOworCisJaWYgKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3BpbykKKwkJZ3Bpb19mcmVlKGRyaXZlcl9kYXRhLT51cGRhdGVfZ3Bpbyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2JhbGxvb24uYyBiL2RyaXZlcnMveGVuL2JhbGxvb24uYwppbmRleCA1ODc2ZTFhLi5hNzY3ODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KQEAgLTkzLDggKzk0LDggQEAKICNkZWZpbmUgaW5jX3RvdGFsaGlnaF9wYWdlcygpICh0b3RhbGhpZ2hfcGFnZXMrKykKICNkZWZpbmUgZGVjX3RvdGFsaGlnaF9wYWdlcygpICh0b3RhbGhpZ2hfcGFnZXMtLSkKICNlbHNlCi0jZGVmaW5lIGluY190b3RhbGhpZ2hfcGFnZXMoKSBkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBkZWNfdG90YWxoaWdoX3BhZ2VzKCkgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgaW5jX3RvdGFsaGlnaF9wYWdlcygpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWNfdG90YWxoaWdoX3BhZ2VzKCkgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogTGlzdCBvZiBiYWxsb29uZWQgcGFnZXMsIHRocmVhZGVkIHRocm91Z2ggdGhlIG1lbV9tYXAgYXJyYXkuICovCkBAIC0xNTQsOCArMTU1LDcgQEAKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKIAkJYmFsbG9vbl9zdGF0cy5iYWxsb29uX2hpZ2gtLTsKIAkJaW5jX3RvdGFsaGlnaF9wYWdlcygpOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCWJhbGxvb25fc3RhdHMuYmFsbG9vbl9sb3ctLTsKIAogCXRvdGFscmFtX3BhZ2VzKys7CkBAIC00MjIsNyArNDIyLDcgQEAKIAkJCQkodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKSwKIAkJCQlfX3B0ZV9tYSgwKSwgMCk7CiAJCQlCVUdfT04ocmV0KTsKLSAgICAgICAgICAgICAgICB9CisJCX0KIAogCX0KIApAQCAtNTA3LDcgKzUwNyw3IEBACiBpbnQgYWxsb2NfeGVuYmFsbG9vbmVkX3BhZ2VzKGludCBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcywgYm9vbCBoaWdobWVtKQogewogCWludCBwZ25vID0gMDsKLQlzdHJ1Y3QgcGFnZSogcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAltdXRleF9sb2NrKCZiYWxsb29uX211dGV4KTsKIAl3aGlsZSAocGdubyA8IG5yX3BhZ2VzKSB7CiAJCXBhZ2UgPSBiYWxsb29uX3JldHJpZXZlKGhpZ2htZW0pOwpAQCAtNTQwLDcgKzU0MCw3IEBACiAgKiBAbnJfcGFnZXM6IE51bWJlciBvZiBwYWdlcwogICogQHBhZ2VzOiBwYWdlcyB0byByZXR1cm4KICAqLwotdm9pZCBmcmVlX3hlbmJhbGxvb25lZF9wYWdlcyhpbnQgbnJfcGFnZXMsIHN0cnVjdCBwYWdlKiogcGFnZXMpCit2b2lkIGZyZWVfeGVuYmFsbG9vbmVkX3BhZ2VzKGludCBucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCAwZWI4YTU3Li42ZTA3NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtODUsOCArODUsNyBAQAogICogICAgSVBJIC0gSVBJIHZlY3RvcgogICogICAgRVZUQ0hOIC0KICAqLwotc3RydWN0IGlycV9pbmZvCi17CitzdHJ1Y3QgaXJxX2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAllbnVtIHhlbl9pcnFfdHlwZSB0eXBlOwkvKiB0eXBlICovCiAJdW5zaWduZWQgaXJxOwpAQCAtMjgyLDkgKzI4MSw5IEBACiAJCQkJCSAgIHN0cnVjdCBzaGFyZWRfaW5mbyAqc2gsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBpZHgpCiB7Ci0JcmV0dXJuIChzaC0+ZXZ0Y2huX3BlbmRpbmdbaWR4XSAmCisJcmV0dXJuIHNoLT5ldnRjaG5fcGVuZGluZ1tpZHhdICYKIAkJcGVyX2NwdShjcHVfZXZ0Y2huX21hc2ssIGNwdSlbaWR4XSAmCi0JCX5zaC0+ZXZ0Y2huX21hc2tbaWR4XSk7CisJCX5zaC0+ZXZ0Y2huX21hc2tbaWR4XTsKIH0KIAogc3RhdGljIHZvaWQgYmluZF9ldnRjaG5fdG9fY3B1KHVuc2lnbmVkIGludCBjaG4sIHVuc2lnbmVkIGludCBjcHUpCkBAIC0xMTgwLDcgKzExNzksNyBAQAogCWludCBjcHUgPSBnZXRfY3B1KCk7CiAJc3RydWN0IHNoYXJlZF9pbmZvICpzID0gSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIAlzdHJ1Y3QgdmNwdV9pbmZvICp2Y3B1X2luZm8gPSBfX3RoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpOwotIAl1bnNpZ25lZCBjb3VudDsKKwl1bnNpZ25lZCBjb3VudDsKIAogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBwZW5kaW5nX3dvcmRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwppbmRleCA4ODA3OThhLi4zOTg3MTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYuYworKysgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwpAQCAtMTkzLDkgKzE5Myw4IEBACiAKIAlhdG9taWNfc3ViKG1hcC0+Y291bnQsICZwYWdlc19tYXBwZWQpOwogCi0JaWYgKG1hcC0+bm90aWZ5LmZsYWdzICYgVU5NQVBfTk9USUZZX1NFTkRfRVZFTlQpIHsKKwlpZiAobWFwLT5ub3RpZnkuZmxhZ3MgJiBVTk1BUF9OT1RJRllfU0VORF9FVkVOVCkKIAkJbm90aWZ5X3JlbW90ZV92aWFfZXZ0Y2huKG1hcC0+bm90aWZ5LmV2ZW50KTsKLQl9CiAKIAlpZiAobWFwLT5wYWdlcykgewogCQlpZiAoIXVzZV9wdGVtb2QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwppbmRleCA4YzcxYWI4MC4uYmYxYzA5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAogCW5mbGFncyA9IHNoYXJlZFtyZWZdLmZsYWdzOwogCi0JcmV0dXJuIChuZmxhZ3MgJiAoR1RGX3JlYWRpbmd8R1RGX3dyaXRpbmcpKTsKKwlyZXR1cm4gbmZsYWdzICYgKEdURl9yZWFkaW5nfEdURl93cml0aW5nKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9xdWVyeV9mb3JlaWduX2FjY2Vzcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL21hbmFnZS5jIGIvZHJpdmVycy94ZW4vbWFuYWdlLmMKaW5kZXggMGI1MzY2Yi4uY2U0ZmEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vbWFuYWdlLmMKKysrIGIvZHJpdmVycy94ZW4vbWFuYWdlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDx4ZW4veGVuLmg+CiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vcGNpLmMgYi9kcml2ZXJzL3hlbi9wY2kuYwppbmRleCA2NjA1NzA3Li5iODRiZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9wY2kuYworKysgYi9kcml2ZXJzL3hlbi9wY2kuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCQkmbWFuYWdlX3BjaV9leHQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBwaHlzZGV2X21hbmFnZV9wY2kgbWFuYWdlX3BjaSA9IHsKLQkJCS5idXMgCT0gcGNpX2Rldi0+YnVzLT5udW1iZXIsCisJCQkuYnVzCT0gcGNpX2Rldi0+YnVzLT5udW1iZXIsCiAJCQkuZGV2Zm4JPSBwY2lfZGV2LT5kZXZmbiwKIAkJfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYyBiL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKaW5kZXggYzk4NDc2OC4uOGU5NjRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYworKysgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDx4ZW4vc3dpb3RsYi14ZW4uaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgPHhlbi94ZW4tb3BzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4veGVuLWJhbGxvb24uYwppbmRleCA1YzlkYzQzLi45Y2MyMjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1iYWxsb29uLmMKQEAgLTUwLDExICs1MCw2IEBACiAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfYmFsbG9vbihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KTsKIAotc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggdGFyZ2V0X3dhdGNoID0KLXsKLQkubm9kZSA9ICJtZW1vcnkvdGFyZ2V0IgotfTsKLQogLyogUmVhY3QgdG8gYSBjaGFuZ2UgaW4gdGhlIHRhcmdldCBrZXkgKi8KIHN0YXRpYyB2b2lkIHdhdGNoX3RhcmdldChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJCSBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNzMsNiArNjgsMTEgQEAKIAkgKi8KIAliYWxsb29uX3NldF9uZXdfdGFyZ2V0KG5ld190YXJnZXQgPj4gKFBBR0VfU0hJRlQgLSAxMCkpOwogfQorc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggdGFyZ2V0X3dhdGNoID0geworCS5ub2RlID0gIm1lbW9yeS90YXJnZXQiLAorCS5jYWxsYmFjayA9IHdhdGNoX3RhcmdldCwKK307CisKIAogc3RhdGljIGludCBiYWxsb29uX2luaXRfd2F0Y2hlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAogCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnQsCkBAIC04Nyw3ICs4Nyw5IEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHhlbnN0b3JlX25vdGlmaWVyOworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5zdG9yZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGJhbGxvb25faW5pdF93YXRjaGVyLAorfTsKIAogc3RhdGljIGludCBfX2luaXQgYmFsbG9vbl9pbml0KHZvaWQpCiB7CkBAIC0xMDAsOSArMTAyLDYgQEAKIAogCXJlZ2lzdGVyX3hlbl9zZWxmYmFsbG9vbmluZygmYmFsbG9vbl9zeXNkZXYpOwogCi0JdGFyZ2V0X3dhdGNoLmNhbGxiYWNrID0gd2F0Y2hfdGFyZ2V0OwotCXhlbnN0b3JlX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBiYWxsb29uX2luaXRfd2F0Y2hlcjsKLQogCXJlZ2lzdGVyX3hlbnN0b3JlX25vdGlmaWVyKCZ4ZW5zdG9yZV9ub3RpZmllcik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL2NvbmZfc3BhY2UuYwppbmRleCA0NDQzNDVhLi41MmZlZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9jb25mX3NwYWNlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svY29uZl9zcGFjZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgInBjaWJhY2suaCIKICNpbmNsdWRlICJjb25mX3NwYWNlLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYwppbmRleCBjZGFjZjkyLi44MWMzY2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2V2ZW50X2NoYW5uZWwuaD4KQEAgLTQ0Myw3ICs0NDQsNyBAQAogCiAJKnZhZGRyID0gTlVMTDsKIAotCWFyZWEgPSB4ZW5fYWxsb2Nfdm1fYXJlYShQQUdFX1NJWkUpOworCWFyZWEgPSBhbGxvY192bV9hcmVhKFBBR0VfU0laRSk7CiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDUzLDcgKzQ1NCw3IEBACiAJCUJVRygpOwogCiAJaWYgKG9wLnN0YXR1cyAhPSBHTlRTVF9va2F5KSB7Ci0JCXhlbl9mcmVlX3ZtX2FyZWEoYXJlYSk7CisJCWZyZWVfdm1fYXJlYShhcmVhKTsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIG9wLnN0YXR1cywKIAkJCQkgIm1hcHBpbmcgaW4gc2hhcmVkIHBhZ2UgJWQgZnJvbSBkb21haW4gJWQiLAogCQkJCSBnbnRfcmVmLCBkZXYtPm90aGVyZW5kX2lkKTsKQEAgLTU1Miw3ICs1NTMsNyBAQAogCQlCVUcoKTsKIAogCWlmIChvcC5zdGF0dXMgPT0gR05UU1Rfb2theSkKLQkJeGVuX2ZyZWVfdm1fYXJlYShhcmVhKTsKKwkJZnJlZV92bV9hcmVhKGFyZWEpOwogCWVsc2UKIAkJeGVuYnVzX2Rldl9lcnJvcihkZXYsIG9wLnN0YXR1cywKIAkJCQkgInVubWFwcGluZyBwYWdlIGF0IGhhbmRsZSAlZCBlcnJvciAlZCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggY2VmOWIwYi4uMWIxNzhjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0zMDksOCArMzEwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c191bnJlZ2lzdGVyX2RyaXZlcik7CiAKLXN0cnVjdCB4Yl9maW5kX2luZm8KLXsKK3N0cnVjdCB4Yl9maW5kX2luZm8gewogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXY7CiAJY29uc3QgY2hhciAqbm9kZW5hbWU7CiB9OwpAQCAtNjM5LDcgKzYzOSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfZGV2X2NhbmNlbCk7CiAKIC8qIEEgZmxhZyB0byBkZXRlcm1pbmUgaWYgeGVuc3RvcmVkIGlzICdyZWFkeScgKGkuZS4gaGFzIHN0YXJ0ZWQpICovCi1pbnQgeGVuc3RvcmVkX3JlYWR5ID0gMDsKK2ludCB4ZW5zdG9yZWRfcmVhZHk7CiAKIAogaW50IHJlZ2lzdGVyX3hlbnN0b3JlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCkBAIC03NzAsNyArNzcwLDcgQEAKIAlwcm9jX21rZGlyKCJ4ZW4iLCBOVUxMKTsKICNlbmRpZgogCi0gb3V0X2Vycm9yOgorb3V0X2Vycm9yOgogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaCBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAppbmRleCBiODE0OTM1Li45YjFkZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCkBAIC0zNiw4ICszNiw3IEBACiAKICNkZWZpbmUgWEVOX0JVU19JRF9TSVpFCQkJMjAKIAotc3RydWN0IHhlbl9idXNfdHlwZQoteworc3RydWN0IHhlbl9idXNfdHlwZSB7CiAJY2hhciAqcm9vdDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWxzOwogCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfYmFja2VuZC5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKaW5kZXggMzI0MTdiNS4uYzNjN2NkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9iYWNrZW5kLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYwppbmRleCA1NDA1ODdlLi4yZjczMTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZV9mcm9udGVuZC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vcHJvYy5jIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKaW5kZXggZTBjODQ3Mi4uOTg4ODgwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy96b3Jyby9wcm9jLmMKKysrIGIvZHJpdmVycy96b3Jyby9wcm9jLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlLmMgYi9mcy85cC92ZnNfaW5vZGUuYwppbmRleCBiNWExMDc2Li44NzllZDg4IDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3Qgdjlmc19pbm9kZSAqdjlpbm9kZSA9IFY5RlNfSShpbm9kZSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPmF0aW1lOwogCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPm10aW1lOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAkJCS8qIEhBUkRMSU5LQ09VTlQgJXUgKi8KIAkJCXNzY2FuZihleHQsICIlMTNzICV1IiwgdGFnX25hbWUsICZpX25saW5rKTsKIAkJCWlmICghc3RybmNtcCh0YWdfbmFtZSwgIkhBUkRMSU5LQ09VTlQiLCAxMykpCi0JCQkJaW5vZGUtPmlfbmxpbmsgPSBpX25saW5rOworCQkJCXNldF9ubGluayhpbm9kZSwgaV9ubGluayk7CiAJCX0KIAl9CiAJbW9kZSA9IHN0YXQtPm1vZGUgJiBTX0lBTExVR087CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jIGIvZnMvOXAvdmZzX2lub2RlX2RvdGwuYwppbmRleCBhZGVkNzlmLi4wYjU3NDVlIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jCisrKyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKIAkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOwogCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7Ci0JCWlub2RlLT5pX25saW5rID0gc3RhdC0+c3Rfbmxpbms7CisJCXNldF9ubGluayhpbm9kZSwgc3RhdC0+c3RfbmxpbmspOwogCiAJCW1vZGUgPSBzdGF0LT5zdF9tb2RlICYgU19JQUxMVUdPOwogCQltb2RlIHw9IGlub2RlLT5pX21vZGUgJiB+U19JQUxMVUdPOwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dJRCkKIAkJCWlub2RlLT5pX2dpZCA9IHN0YXQtPnN0X2dpZDsKIAkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTkxJTkspCi0JCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOworCQkJc2V0X25saW5rKGlub2RlLCBzdGF0LT5zdF9ubGluayk7CiAJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX01PREUpIHsKIAkJCWlub2RlLT5pX21vZGUgPSBzdGF0LT5zdF9tb2RlOwogCQkJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fApkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggOWZlMGIzNC4uNWY0YzQ1ZCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xMDksNyArMTA5LDcgQEAKIHNvdXJjZSAiZnMvc3lzZnMvS2NvbmZpZyIKIAogY29uZmlnIFRNUEZTCi0JYm9vbCAiVmlydHVhbCBtZW1vcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoZm9ybWVyIHNobSBmcykiCisJYm9vbCAiVG1wZnMgdmlydHVhbCBtZW1vcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoZm9ybWVyIHNobSBmcykiCiAJZGVwZW5kcyBvbiBTSE1FTQogCWhlbHAKIAkgIFRtcGZzIGlzIGEgZmlsZSBzeXN0ZW0gd2hpY2gga2VlcHMgYWxsIGZpbGVzIGluIHZpcnR1YWwgbWVtb3J5LgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA1YzMwYTEzLi5kMmMzMzUzIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtMTIwLDYgKzEyMCw2IEBACiBvYmotJChDT05GSUdfT0NGUzJfRlMpCQkrPSBvY2ZzMi8KIG9iai0kKENPTkZJR19CVFJGU19GUykJCSs9IGJ0cmZzLwogb2JqLSQoQ09ORklHX0dGUzJfRlMpICAgICAgICAgICArPSBnZnMyLwotb2JqLSQoeSkgICAgICAgICAgCQkrPSBleG9mcy8gIyBNdWx0aXBsZSBtb2RzLCB1c2VkIGJ5IG5mcy9vYmpsYXlvdXQKK29iai15CQkJCSs9IGV4b2ZzLyAjIE11bHRpcGxlIG1vZHVsZXMKIG9iai0kKENPTkZJR19DRVBIX0ZTKQkJKz0gY2VwaC8KIG9iai0kKENPTkZJR19QU1RPUkUpCQkrPSBwc3RvcmUvCmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKaW5kZXggZDUyNTBjNS4uMWRhYjZhMSAxMDA2NDQKLS0tIGEvZnMvYWRmcy9pbm9kZS5jCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJaW5vZGUtPmlfZ2lkCSA9IEFERlNfU0Ioc2IpLT5zX2dpZDsKIAlpbm9kZS0+aV9pbm8JID0gb2JqLT5maWxlX2lkOwogCWlub2RlLT5pX3NpemUJID0gb2JqLT5zaXplOwotCWlub2RlLT5pX25saW5rCSA9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV9ibG9ja3MJID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PgogCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCmRpZmYgLS1naXQgYS9mcy9hZmZzL2FtaWdhZmZzLmMgYi9mcy9hZmZzL2FtaWdhZmZzLmMKaW5kZXggM2E0NTU3ZS4uZGUzN2VjOCAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hbWlnYWZmcy5jCisrKyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWlmICghQUZGU19UQUlMKHNiLCBiaCktPmxpbmtfY2hhaW4pCi0JCQkJCWlub2RlLT5pX25saW5rID0gMTsKKwkJCQkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJCX0KIAkJCWFmZnNfZnJlZV9ibG9jayhzYiwgbGlua19pbm8pOwogCQkJZ290byBkb25lOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJaWYgKGlub2RlLT5pX25saW5rID4gMSkKIAkJcmV0dmFsID0gYWZmc19yZW1vdmVfbGluayhkZW50cnkpOwogCWVsc2UKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJYWZmc191bmxvY2tfbGluayhpbm9kZSk7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9pbm9kZS5jIGIvZnMvYWZmcy9pbm9kZS5jCmluZGV4IDVkODI4OTAuLjg4YTRiMGIgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvaW5vZGUuYworKysgYi9mcy9hZmZzL2lub2RlLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlwcm90ID0gYmUzMl90b19jcHUodGFpbC0+cHJvdGVjdCk7CiAKIAlpbm9kZS0+aV9zaXplID0gMDsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tb2RlID0gMDsKIAlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IDE7CiAJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJCQkJCSAgICAgICBzYmktPnNfaGFzaHNpemUgKyAxOwogCQl9CiAJCWlmICh0YWlsLT5saW5rX2NoYWluKQotCQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAoc2JpLT5zX2ZsYWdzICYgU0ZfT0ZTKSA/ICZhZmZzX2FvcHNfb2ZzIDogJmFmZnNfYW9wczsKIAkJaW5vZGUtPmlfb3AgPSAmYWZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2ZpbGVfb3BlcmF0aW9uczsKQEAgLTMwNCw3ICszMDQsNyBAQAogCWlub2RlLT5pX3VpZCAgICAgPSBjdXJyZW50X2ZzdWlkKCk7CiAJaW5vZGUtPmlfZ2lkICAgICA9IGN1cnJlbnRfZnNnaWQoKTsKIAlpbm9kZS0+aV9pbm8gICAgID0gYmxvY2s7Ci0JaW5vZGUtPmlfbmxpbmsgICA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSAgID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJYXRvbWljX3NldCgmQUZGU19JKGlub2RlKS0+aV9vcGVuY250LCAwKTsKIAlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCA9IDA7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJQUZGU19UQUlMKHNiLCBpbm9kZV9iaCktPmxpbmtfY2hhaW4gPSBjcHVfdG9fYmUzMihibG9jayk7CiAJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGlub2RlX2JoLCBibG9jayAtIGJlMzJfdG9fY3B1KGNoYWluKSk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGlub2RlX2JoLCBpbm9kZSk7Ci0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJaWhvbGQoaW5vZGUpOwogCX0KIAlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCmluZGV4IGUzZTllZmMuLjc4MGExMWQgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvbmFtZWkuYworKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gKEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfT0ZTKSA/ICZhZmZzX2FvcHNfb2ZzIDogJmFmZnNfYW9wczsKIAllcnJvciA9IGFmZnNfYWRkX2VudHJ5KGRpciwgaW5vZGUsIGRlbnRyeSwgU1RfRklMRSk7CiAJaWYgKGVycm9yKSB7Ci0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1VTRVJESVIpOwogCWlmIChlcnJvcikgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC0zOTIsNyArMzkyLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCAzNDZlMzI4Li4yZjIxM2QxIDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtOTAsNyArOTAsNyBAQAogCQkJdm5vZGUtPnZmc19pbm9kZS5pX3VpZCA9IHN0YXR1cy0+b3duZXI7CiAJCQl2bm9kZS0+dmZzX2lub2RlLmlfZ2lkID0gc3RhdHVzLT5ncm91cDsKIAkJCXZub2RlLT52ZnNfaW5vZGUuaV9nZW5lcmF0aW9uID0gdm5vZGUtPmZpZC51bmlxdWU7Ci0JCQl2bm9kZS0+dmZzX2lub2RlLmlfbmxpbmsgPSBzdGF0dXMtPm5saW5rOworCQkJc2V0X25saW5rKCZ2bm9kZS0+dmZzX2lub2RlLCBzdGF0dXMtPm5saW5rKTsKIAogCQkJbW9kZSA9IHZub2RlLT52ZnNfaW5vZGUuaV9tb2RlOwogCQkJbW9kZSAmPSB+U19JQUxMVUdPOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2lub2RlLmMgYi9mcy9hZnMvaW5vZGUuYwppbmRleCAwZmRhYjZlLi5kODkwYWUzIDEwMDY0NAotLS0gYS9mcy9hZnMvaW5vZGUuYworKysgYi9mcy9hZnMvaW5vZGUuYwpAQCAtNjcsNyArNjcsNyBAQAogCQlmc2NhY2hlX2F0dHJfY2hhbmdlZCh2bm9kZS0+Y2FjaGUpOwogI2VuZGlmCiAKLQlpbm9kZS0+aV9ubGluawkJPSB2bm9kZS0+c3RhdHVzLm5saW5rOworCXNldF9ubGluayhpbm9kZSwgdm5vZGUtPnN0YXR1cy5ubGluayk7CiAJaW5vZGUtPmlfdWlkCQk9IHZub2RlLT5zdGF0dXMub3duZXI7CiAJaW5vZGUtPmlfZ2lkCQk9IDA7CiAJaW5vZGUtPmlfc2l6ZQkJPSB2bm9kZS0+c3RhdHVzLnNpemU7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAlpbm9kZS0+aV9zaXplCQk9IDA7CiAJaW5vZGUtPmlfbW9kZQkJPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087CiAJaW5vZGUtPmlfb3AJCT0gJmFmc19hdXRvY2VsbF9pbm9kZV9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rCQk9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV91aWQJCT0gMDsKIAlpbm9kZS0+aV9naWQJCT0gMDsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMJPSBnZXRfc2Vjb25kcygpOwpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCBlMjllYzQ4Li43OGM1MTRjIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtNDQwLDggKzQ0MCw2IEBACiBzdGF0aWMgc3RydWN0IGtpb2NiICpfX2Fpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcSA9IE5VTEw7Ci0Jc3RydWN0IGFpb19yaW5nICpyaW5nOwotCWludCBva2F5ID0gMDsKIAogCXJlcSA9IGttZW1fY2FjaGVfYWxsb2Moa2lvY2JfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXJlcSkpCkBAIC00NTksMzkgKzQ1NywxMTQgQEAKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5raV9ydW5fbGlzdCk7CiAJcmVxLT5raV9ldmVudGZkID0gTlVMTDsKIAotCS8qIENoZWNrIGlmIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGhhcyBlbm91Z2ggZnJlZSBzcGFjZSB0bwotCSAqIGFjY2VwdCBhbiBldmVudCBmcm9tIHRoaXMgaW8uCi0JICovCi0Jc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7Ci0JcmluZyA9IGttYXBfYXRvbWljKGN0eC0+cmluZ19pbmZvLnJpbmdfcGFnZXNbMF0sIEtNX1VTRVIwKTsKLQlpZiAoY3R4LT5yZXFzX2FjdGl2ZSA8IGFpb19yaW5nX2F2YWlsKCZjdHgtPnJpbmdfaW5mbywgcmluZykpIHsKLQkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmN0eC0+YWN0aXZlX3JlcXMpOwotCQljdHgtPnJlcXNfYWN0aXZlKys7Ci0JCW9rYXkgPSAxOwotCX0KLQlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKLQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOwotCi0JaWYgKCFva2F5KSB7Ci0JCWttZW1fY2FjaGVfZnJlZShraW9jYl9jYWNoZXAsIHJlcSk7Ci0JCXJlcSA9IE5VTEw7Ci0JfQotCiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKKy8qCisgKiBzdHJ1Y3Qga2lvY2IncyBhcmUgYWxsb2NhdGVkIGluIGJhdGNoZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YKKyAqIHRpbWVzIHRoZSBjdHggbG9jayBpcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQuCisgKi8KKyNkZWZpbmUgS0lPQ0JfQkFUQ0hfU0laRQkzMkwKK3N0cnVjdCBraW9jYl9iYXRjaCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWxvbmcgY291bnQ7IC8qIG51bWJlciBvZiByZXF1ZXN0cyBsZWZ0IHRvIGFsbG9jYXRlICovCit9OworCitzdGF0aWMgdm9pZCBraW9jYl9iYXRjaF9pbml0KHN0cnVjdCBraW9jYl9iYXRjaCAqYmF0Y2gsIGxvbmcgdG90YWwpCit7CisJSU5JVF9MSVNUX0hFQUQoJmJhdGNoLT5oZWFkKTsKKwliYXRjaC0+Y291bnQgPSB0b3RhbDsKK30KKworc3RhdGljIHZvaWQga2lvY2JfYmF0Y2hfZnJlZShzdHJ1Y3Qga2lvY2JfYmF0Y2ggKmJhdGNoKQoreworCXN0cnVjdCBraW9jYiAqcmVxLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIG4sICZiYXRjaC0+aGVhZCwga2lfYmF0Y2gpIHsKKwkJbGlzdF9kZWwoJnJlcS0+a2lfYmF0Y2gpOworCQlrbWVtX2NhY2hlX2ZyZWUoa2lvY2JfY2FjaGVwLCByZXEpOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYmF0Y2ggb2Yga2lvY2JzLiAgVGhpcyBhdm9pZHMgdGFraW5nIGFuZCBkcm9wcGluZyB0aGUKKyAqIGNvbnRleHQgbG9jayBhIGxvdCBkdXJpbmcgc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQga2lvY2JfYmF0Y2hfcmVmaWxsKHN0cnVjdCBraW9jdHggKmN0eCwgc3RydWN0IGtpb2NiX2JhdGNoICpiYXRjaCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBhbGxvY2F0ZWQsIHRvX2FsbG9jOworCWxvbmcgYXZhaWw7CisJYm9vbCBjYWxsZWRfZnB1dCA9IGZhbHNlOworCXN0cnVjdCBraW9jYiAqcmVxLCAqbjsKKwlzdHJ1Y3QgYWlvX3JpbmcgKnJpbmc7CisKKwl0b19hbGxvYyA9IG1pbihiYXRjaC0+Y291bnQsIEtJT0NCX0JBVENIX1NJWkUpOworCWZvciAoYWxsb2NhdGVkID0gMDsgYWxsb2NhdGVkIDwgdG9fYWxsb2M7IGFsbG9jYXRlZCsrKSB7CisJCXJlcSA9IF9fYWlvX2dldF9yZXEoY3R4KTsKKwkJaWYgKCFyZXEpCisJCQkvKiBhbGxvY2F0aW9uIGZhaWxlZCwgZ28gd2l0aCB3aGF0IHdlJ3ZlIGdvdCAqLworCQkJYnJlYWs7CisJCWxpc3RfYWRkKCZyZXEtPmtpX2JhdGNoLCAmYmF0Y2gtPmhlYWQpOworCX0KKworCWlmIChhbGxvY2F0ZWQgPT0gMCkKKwkJZ290byBvdXQ7CisKK3JldHJ5OgorCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJpbmcgPSBrbWFwX2F0b21pYyhjdHgtPnJpbmdfaW5mby5yaW5nX3BhZ2VzWzBdKTsKKworCWF2YWlsID0gYWlvX3JpbmdfYXZhaWwoJmN0eC0+cmluZ19pbmZvLCByaW5nKSAtIGN0eC0+cmVxc19hY3RpdmU7CisJQlVHX09OKGF2YWlsIDwgMCk7CisJaWYgKGF2YWlsID09IDAgJiYgIWNhbGxlZF9mcHV0KSB7CisJCS8qCisJCSAqIEhhbmRsZSBhIHBvdGVudGlhbCBzdGFydmF0aW9uIGNhc2UuICBJdCBpcyBwb3NzaWJsZSB0aGF0CisJCSAqIHdlIGhvbGQgdGhlIGxhc3QgcmVmZXJlbmNlIG9uIGEgc3RydWN0IGZpbGUsIGNhdXNpbmcgdXMKKwkJICogdG8gZGVsYXkgdGhlIGZpbmFsIGZwdXQgdG8gbm9uLWlycSBjb250ZXh0LiAgSW4gdGhpcyBjYXNlLAorCQkgKiBjdHgtPnJlcXNfYWN0aXZlIGlzIGFydGlmaWNpYWxseSBoaWdoLiAgQ2FsbGluZyB0aGUgZnB1dAorCQkgKiByb3V0aW5lIGhlcmUgbWF5IGZyZWUgdXAgYSBzbG90IGluIHRoZSBldmVudCBjb21wbGV0aW9uCisJCSAqIHJpbmcsIGFsbG93aW5nIHRoaXMgYWxsb2NhdGlvbiB0byBzdWNjZWVkLgorCQkgKi8KKwkJa3VubWFwX2F0b21pYyhyaW5nKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKKwkJY2FsbGVkX2ZwdXQgPSB0cnVlOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChhdmFpbCA8IGFsbG9jYXRlZCkgeworCQkvKiBUcmltIGJhY2sgdGhlIG51bWJlciBvZiByZXF1ZXN0cy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgbiwgJmJhdGNoLT5oZWFkLCBraV9iYXRjaCkgeworCQkJbGlzdF9kZWwoJnJlcS0+a2lfYmF0Y2gpOworCQkJa21lbV9jYWNoZV9mcmVlKGtpb2NiX2NhY2hlcCwgcmVxKTsKKwkJCWlmICgtLWFsbG9jYXRlZCA8PSBhdmFpbCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWJhdGNoLT5jb3VudCAtPSBhbGxvY2F0ZWQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZiYXRjaC0+aGVhZCwga2lfYmF0Y2gpIHsKKwkJbGlzdF9hZGQoJnJlcS0+a2lfbGlzdCwgJmN0eC0+YWN0aXZlX3JlcXMpOworCQljdHgtPnJlcXNfYWN0aXZlKys7CisJfQorCisJa3VubWFwX2F0b21pYyhyaW5nKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCitvdXQ6CisJcmV0dXJuIGFsbG9jYXRlZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCwKKwkJCQkJc3RydWN0IGtpb2NiX2JhdGNoICpiYXRjaCkKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcTsKLQkvKiBIYW5kbGUgYSBwb3RlbnRpYWwgc3RhcnZhdGlvbiBjYXNlIC0tIHNob3VsZCBiZSBleGNlZWRpbmdseSByYXJlIGFzIAotCSAqIHJlcXVlc3RzIHdpbGwgYmUgc3R1Y2sgb24gZnB1dF9oZWFkIG9ubHkgaWYgdGhlIGFpb19mcHV0X3JvdXRpbmUgaXMgCi0JICogZGVsYXllZCBhbmQgdGhlIHJlcXVlc3RzIHdlcmUgdGhlIGxhc3QgdXNlciBvZiB0aGUgc3RydWN0IGZpbGUuCi0JICovCi0JcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOwotCWlmICh1bmxpa2VseShOVUxMID09IHJlcSkpIHsKLQkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKLQkJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOwotCX0KKworCWlmIChsaXN0X2VtcHR5KCZiYXRjaC0+aGVhZCkpCisJCWlmIChraW9jYl9iYXRjaF9yZWZpbGwoY3R4LCBiYXRjaCkgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmJhdGNoLT5oZWFkLCBzdHJ1Y3Qga2lvY2IsIGtpX2JhdGNoKTsKKwlsaXN0X2RlbCgmcmVxLT5raV9iYXRjaCk7CiAJcmV0dXJuIHJlcTsKIH0KIApAQCAtMTM4NywxMyArMTQ2MCwxMyBAQAogCQlyZXQgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKHR5cGUsCiAJCQkJKHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICopa2lvY2ItPmtpX2J1ZiwKIAkJCQlraW9jYi0+a2lfbmJ5dGVzLCAxLCAma2lvY2ItPmtpX2lubGluZV92ZWMsCi0JCQkJJmtpb2NiLT5raV9pb3ZlYyk7CisJCQkJJmtpb2NiLT5raV9pb3ZlYywgMSk7CiAJZWxzZQogI2VuZGlmCiAJCXJldCA9IHJ3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLAogCQkJCShzdHJ1Y3QgaW92ZWMgX191c2VyICopa2lvY2ItPmtpX2J1ZiwKIAkJCQlraW9jYi0+a2lfbmJ5dGVzLCAxLCAma2lvY2ItPmtpX2lubGluZV92ZWMsCi0JCQkJJmtpb2NiLT5raV9pb3ZlYyk7CisJCQkJJmtpb2NiLT5raV9pb3ZlYywgMSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0xNTE1LDcgKzE1ODgsOCBAQAogfQogCiBzdGF0aWMgaW50IGlvX3N1Ym1pdF9vbmUoc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKnVzZXJfaW9jYiwKLQkJCSBzdHJ1Y3QgaW9jYiAqaW9jYiwgYm9vbCBjb21wYXQpCisJCQkgc3RydWN0IGlvY2IgKmlvY2IsIHN0cnVjdCBraW9jYl9iYXRjaCAqYmF0Y2gsCisJCQkgYm9vbCBjb21wYXQpCiB7CiAJc3RydWN0IGtpb2NiICpyZXE7CiAJc3RydWN0IGZpbGUgKmZpbGU7CkBAIC0xNTQxLDcgKzE2MTUsNyBAQAogCWlmICh1bmxpa2VseSghZmlsZSkpCiAJCXJldHVybiAtRUJBREY7CiAKLQlyZXEgPSBhaW9fZ2V0X3JlcShjdHgpOwkJLyogcmV0dXJucyB3aXRoIDIgcmVmZXJlbmNlcyB0byByZXEgKi8KKwlyZXEgPSBhaW9fZ2V0X3JlcShjdHgsIGJhdGNoKTsgIC8qIHJldHVybnMgd2l0aCAyIHJlZmVyZW5jZXMgdG8gcmVxICovCiAJaWYgKHVubGlrZWx5KCFyZXEpKSB7CiAJCWZwdXQoZmlsZSk7CiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTYyMSw4ICsxNjk1LDkgQEAKIHsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7CiAJbG9uZyByZXQgPSAwOwotCWludCBpOworCWludCBpID0gMDsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlzdHJ1Y3Qga2lvY2JfYmF0Y2ggYmF0Y2g7CiAKIAlpZiAodW5saWtlbHkobnIgPCAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjM5LDYgKzE3MTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlraW9jYl9iYXRjaF9pbml0KCZiYXRjaCwgbnIpOworCiAJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCiAJLyoKQEAgLTE2NTksMTIgKzE3MzYsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCwgY29tcGF0KTsKKwkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCwgJmJhdGNoLCBjb21wYXQpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKKwlraW9jYl9iYXRjaF9mcmVlKCZiYXRjaCk7CiAJcHV0X2lvY3R4KGN0eCk7CiAJcmV0dXJuIGkgPyBpIDogcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbm9kZS5jIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCmluZGV4IDE4MGZhMjQuLjgxNzlmMWEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5vZGUuYworKysgYi9mcy9hdXRvZnM0L2lub2RlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCWlub2RlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOwogCiAJaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9kaXJfb3BlcmF0aW9uczsKIAl9IGVsc2UgaWYgKFNfSVNMTksobW9kZSkpIHsKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvbGludXh2ZnMuYyBiL2ZzL2JlZnMvbGludXh2ZnMuYwppbmRleCA3MjBkODg1Li44MzQyY2E2IDEwMDY0NAotLS0gYS9mcy9iZWZzL2xpbnV4dmZzLmMKKysrIGIvZnMvYmVmcy9saW51eHZmcy5jCkBAIC0zNTcsNyArMzU3LDcgQEAKIAlpbm9kZS0+aV9naWQgPSBiZWZzX3NiLT5tb3VudF9vcHRzLnVzZV9naWQgPwogCSAgICBiZWZzX3NiLT5tb3VudF9vcHRzLmdpZCA6IChnaWRfdCkgZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+Z2lkKTsKIAotCWlub2RlLT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCiAJLyoKIAkgKiBCRUZTJ3MgdGltZSBpcyA2NCBiaXRzLCBidXQgY3VycmVudCBWRlMgaXMgMzIgYml0cy4uLgpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IGIxNGNlYmYuLjljYzA3NDAxIDEwMDY0NAotLS0gYS9mcy9iZnMvZGlyLmMKKysrIGIvZnMvYmZzL2Rpci5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJcHJpbnRmKCJ1bmxpbmtpbmcgbm9uLWV4aXN0ZW50IGZpbGUgJXM6JWx1IChubGluaz0lZClcbiIsCiAJCQkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCiAJCQkJCWlub2RlLT5pX25saW5rKTsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCX0KIAlkZS0+aW5vID0gMDsKIAltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggYThlMzdmOC4uNjk3YWY1YiAxMDA2NDQKLS0tIGEvZnMvYmZzL2lub2RlLmMKKysrIGIvZnMvYmZzL2lub2RlLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlCRlNfSShpbm9kZSktPmlfZHNrX2lubyA9IGxlMTZfdG9fY3B1KGRpLT5pX2lubyk7CiAJaW5vZGUtPmlfdWlkID0gIGxlMzJfdG9fY3B1KGRpLT5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gIGxlMzJfdG9fY3B1KGRpLT5pX2dpZCk7Ci0JaW5vZGUtPmlfbmxpbmsgPSAgbGUzMl90b19jcHUoZGktPmlfbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoZGktPmlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gIGxlMzJfdG9fY3B1KGRpLT5pX2F0aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBkZDBmZGZjLi4yMWFjNWVlIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC03OTUsNyArNzk1LDE2IEBACiAJCQkgKiBtaWdodCB0cnkgdG8gZXhlYy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgYnJrIHdpbGwKIAkJCSAqIGZvbGxvdyB0aGUgbG9hZGVyLCBhbmQgaXMgbm90IG1vdmFibGUuICAqLwogI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfQVJNKQotCQkJbG9hZF9iaWFzID0gMDsKKwkJCS8qIE1lbW9yeSByYW5kb21pemF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBzd2l0Y2hlZCBvZmYKKwkJCSAqIGluIHJ1bnRpbWUgdmlhIHN5c2N0bC4KKwkJCSAqIElmIHRoYXQgaXMgdGhlIGNhc2UsIHJldGFpbiB0aGUgb3JpZ2luYWwgbm9uLXplcm8KKwkJCSAqIGxvYWRfYmlhcyB2YWx1ZSBpbiBvcmRlciB0byBlc3RhYmxpc2ggcHJvcGVyCisJCQkgKiBub24tcmFuZG9taXplZCBtYXBwaW5ncy4KKwkJCSAqLworCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKQorCQkJCWxvYWRfYmlhcyA9IDA7CisJCQllbHNlCisJCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CiAjZWxzZQogCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IGJhMWExYWUuLjFlOWVkYmQgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJd3JpdGVfdW5sb2NrKCZlbnRyaWVzX2xvY2spOwogCiAJaWYgKGRlbnRyeSkgewotCQlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwkJZHJvcF9ubGluayhkZW50cnktPmRfaW5vZGUpOwogCQlkX2Ryb3AoZGVudHJ5KTsKIAkJZHB1dChkZW50cnkpOwogCQlzaW1wbGVfcmVsZWFzZV9mcygmYm1fbW50LCAmZW50cnlfY291bnQpOwpkaWZmIC0tZ2l0IGEvZnMvYmlvLWludGVncml0eS5jIGIvZnMvYmlvLWludGVncml0eS5jCmluZGV4IDljNWU2YjIuLmMyMTgzZjMgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby1pbnRlZ3JpdHkuYworKysgYi9mcy9iaW8taW50ZWdyaXR5LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDliZmFkZTguLjQxYzkzYzcgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yNTUsNyArMjU1LDYgQEAKIHsKIAltZW1zZXQoYmlvLCAwLCBzaXplb2YoKmJpbykpOwogCWJpby0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKLQliaW8tPmJpX2NvbXBfY3B1ID0gLTE7CiAJYXRvbWljX3NldCgmYmlvLT5iaV9jbnQsIDEpOwogfQogRVhQT1JUX1NZTUJPTChiaW9faW5pdCk7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDk1Zjc4NmUuLmIwN2YxZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC05NzEsNyArOTcxLDcgQEAKIAogCWlmICghYmRldi0+YmRfZGlzaykKIAkJcmV0dXJuOwotCWlmIChkaXNrX3BhcnRpdGlvbmFibGUoYmRldi0+YmRfZGlzaykpCisJaWYgKGRpc2tfcGFydF9zY2FuX2VuYWJsZWQoYmRldi0+YmRfZGlzaykpCiAJCWJkZXYtPmJkX2ludmFsaWRhdGVkID0gMTsKIH0KIApAQCAtMTA4NSw2ICsxMDg1LDcgQEAKIHN0YXRpYyBpbnQgX19ibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwgaW50IGZvcl9wYXJ0KQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCWludCByZXQ7CiAJaW50IHBhcnRubzsKIAlpbnQgcGVybSA9IDA7CkBAIC0xMTEwLDYgKzExMTEsNyBAQAogCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0bm8pOwogCWlmICghZGlzaykKIAkJZ290byBvdXQ7CisJb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKIAogCWRpc2tfYmxvY2tfZXZlbnRzKGRpc2spOwogCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2LT5iZF9tdXRleCwgZm9yX3BhcnQpOwpAQCAtMTEzNyw4ICsxMTM5LDggQEAKIAkJCQkJYmRldi0+YmRfZGlzayA9IE5VTEw7CiAJCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCQkJCQlkaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2spOwotCQkJCQltb2R1bGVfcHV0KGRpc2stPmZvcHMtPm93bmVyKTsKIAkJCQkJcHV0X2Rpc2soZGlzayk7CisJCQkJCW1vZHVsZV9wdXQob3duZXIpOwogCQkJCQlnb3RvIHJlc3RhcnQ7CiAJCQkJfQogCQkJfQpAQCAtMTE5NCw4ICsxMTk2LDggQEAKIAkJCQlnb3RvIG91dF91bmxvY2tfYmRldjsKIAkJfQogCQkvKiBvbmx5IG9uZSBvcGVuZXIgaG9sZHMgcmVmcyB0byB0aGUgbW9kdWxlIGFuZCBkaXNrICovCi0JCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOwogCQlwdXRfZGlzayhkaXNrKTsKKwkJbW9kdWxlX3B1dChvd25lcik7CiAJfQogCWJkZXYtPmJkX29wZW5lcnMrKzsKIAlpZiAoZm9yX3BhcnQpCkBAIC0xMjE1LDggKzEyMTcsOCBAQAogIG91dF91bmxvY2tfYmRldjoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAlkaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2spOwotCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOwogCXB1dF9kaXNrKGRpc2spOworCW1vZHVsZV9wdXQob3duZXIpOwogIG91dDoKIAliZHB1dChiZGV2KTsKIApAQCAtMTQ0MiwxNCArMTQ0NCwxNSBAQAogCWlmICghYmRldi0+YmRfb3BlbmVycykgewogCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IGRpc2stPmZvcHMtPm93bmVyOwogCi0JCXB1dF9kaXNrKGRpc2spOwotCQltb2R1bGVfcHV0KG93bmVyKTsKIAkJZGlza19wdXRfcGFydChiZGV2LT5iZF9wYXJ0KTsKIAkJYmRldi0+YmRfcGFydCA9IE5VTEw7CiAJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOwogCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKIAkJCXZpY3RpbSA9IGJkZXYtPmJkX2NvbnRhaW5zOwogCQliZGV2LT5iZF9jb250YWlucyA9IE5VTEw7CisKKwkJcHV0X2Rpc2soZGlzayk7CisJCW1vZHVsZV9wdXQob3duZXIpOwogCX0KIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAliZHB1dChiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL01ha2VmaWxlIGIvZnMvYnRyZnMvTWFrZWZpbGUKaW5kZXggNDBlNmFjMC4uYzBkZGZkMiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvTWFrZWZpbGUKKysrIGIvZnMvYnRyZnMvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiAJICAgZXh0ZW50X21hcC5vIHN5c2ZzLm8gc3RydWN0LWZ1bmNzLm8geGF0dHIubyBvcmRlcmVkLWRhdGEubyBcCiAJICAgZXh0ZW50X2lvLm8gdm9sdW1lcy5vIGFzeW5jLXRocmVhZC5vIGlvY3RsLm8gbG9ja2luZy5vIG9ycGhhbi5vIFwKIAkgICBleHBvcnQubyB0cmVlLWxvZy5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gbHpvLm8gXAotCSAgIGNvbXByZXNzaW9uLm8gZGVsYXllZC1yZWYubyByZWxvY2F0aW9uLm8gZGVsYXllZC1pbm9kZS5vIHNjcnViLm8KKwkgICBjb21wcmVzc2lvbi5vIGRlbGF5ZWQtcmVmLm8gcmVsb2NhdGlvbi5vIGRlbGF5ZWQtaW5vZGUubyBzY3J1Yi5vIFwKKwkgICByZWFkYS5vIGJhY2tyZWYubwogCiBidHJmcy0kKENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCmRpZmYgLS1naXQgYS9mcy9idHJmcy9hY2wuYyBiL2ZzL2J0cmZzL2FjbC5jCmluZGV4IGViMTU5YWEuLjg5YjE1NmQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FjbC5jCisrKyBiL2ZzL2J0cmZzL2FjbC5jCkBAIC01OSwyMiArNTksMTkgQEAKIAkJaWYgKCF2YWx1ZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQlzaXplID0gX19idHJmc19nZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUpOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCBzaXplKTsKLQkJCWlmIChJU19FUlIoYWNsKSkgewotCQkJCWtmcmVlKHZhbHVlKTsKLQkJCQlyZXR1cm4gYWNsOwotCQkJfQotCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7Ci0JCX0KLQkJa2ZyZWUodmFsdWUpOworCX0KKwlpZiAoc2l6ZSA+IDApIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOwogCX0gZWxzZSBpZiAoc2l6ZSA9PSAtRU5PRU5UIHx8IHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAwKSB7CiAJCS8qIEZJWE1FLCB3aG8gcmV0dXJucyAtRU5PRU5UPyAgSSB0aGluayBub2JvZHkgKi8KIAkJYWNsID0gTlVMTDsKLQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAJfSBlbHNlIHsKIAkJYWNsID0gRVJSX1BUUigtRUlPKTsKIAl9CisJa2ZyZWUodmFsdWUpOworCisJaWYgKCFJU19FUlIoYWNsKSkKKwkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAKIAlyZXR1cm4gYWNsOwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5jIGIvZnMvYnRyZnMvYmFja3JlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTVhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9iYWNrcmVmLmMKQEAgLTAsMCArMSw3NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU1RSQVRPLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAiYmFja3JlZi5oIgorCitzdHJ1Y3QgX19kYXRhX3JlZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBpbnVtOworCXU2NCByb290OworCXU2NCBleHRlbnRfZGF0YV9pdGVtX29mZnNldDsKK307CisKK3N0cnVjdCBfX3NoYXJlZF9yZWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1NjQgZGlza19ieXRlOworfTsKKworc3RhdGljIGludCBfX2lub2RlX2luZm8odTY0IGludW0sIHU2NCBpb2ZmLCB1OCBrZXlfdHlwZSwKKwkJCXN0cnVjdCBidHJmc19yb290ICpmc19yb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCXN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKworCWtleS50eXBlID0ga2V5X3R5cGU7CisJa2V5Lm9iamVjdGlkID0gaW51bTsKKwlrZXkub2Zmc2V0ID0gaW9mZjsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGZzX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwlpZiAocmV0ICYmIHBhdGgtPnNsb3RzWzBdID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKSkgeworCQlyZXQgPSBidHJmc19uZXh0X2xlYWYoZnNfcm9vdCwgcGF0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQllYiA9IHBhdGgtPm5vZGVzWzBdOworCX0KKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJaWYgKGZvdW5kX2tleS0+dHlwZSAhPSBrZXkudHlwZSB8fCBmb3VuZF9rZXktPm9iamVjdGlkICE9IGtleS5vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgbWFrZXMgdGhlIHBhdGggcG9pbnQgdG8gKGludW0gSU5PREVfSVRFTSBpb2ZmKQorICovCitpbnQgaW5vZGVfaXRlbV9pbmZvKHU2NCBpbnVtLCB1NjQgaW9mZiwgc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlyZXR1cm4gX19pbm9kZV9pbmZvKGludW0sIGlvZmYsIEJUUkZTX0lOT0RFX0lURU1fS0VZLCBmc19yb290LCBwYXRoLAorCQkJCSZrZXkpOworfQorCitzdGF0aWMgaW50IGlub2RlX3JlZl9pbmZvKHU2NCBpbnVtLCB1NjQgaW9mZiwgc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJc3RydWN0IGJ0cmZzX2tleSAqZm91bmRfa2V5KQoreworCXJldHVybiBfX2lub2RlX2luZm8oaW51bSwgaW9mZiwgQlRSRlNfSU5PREVfUkVGX0tFWSwgZnNfcm9vdCwgcGF0aCwKKwkJCQlmb3VuZF9rZXkpOworfQorCisvKgorICogdGhpcyBpdGVyYXRlcyB0byB0dXJuIGEgYnRyZnNfaW5vZGVfcmVmIGludG8gYSBmdWxsIGZpbGVzeXN0ZW0gcGF0aC4gZWxlbWVudHMKKyAqIG9mIHRoZSBwYXRoIGFyZSBzZXBhcmF0ZWQgYnkgJy8nIGFuZCB0aGUgcGF0aCBpcyBndWFyYW50ZWVkIHRvIGJlCisgKiAwLXRlcm1pbmF0ZWQuIHRoZSBwYXRoIGlzIG9ubHkgZ2l2ZW4gd2l0aGluIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtLgorICogVGhlcmVmb3JlLCBpdCBuZXZlciBzdGFydHMgd2l0aCBhICcvJy4gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBwcm92aWRlCisgKiAic2l6ZSIgYnl0ZXMgaW4gImRlc3QiLiB0aGUgZGVzdCBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYmFja3dhcmRzLiBmaW5hbGx5LAorICogdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHJldHVybmVkLiB0aGlzIHBvaW50ZXIgaXMgd2l0aGluCisgKiBkZXN0LCBub3JtYWxseS4KKyAqIGluIGNhc2UgdGhlIHBhdGggYnVmZmVyIHdvdWxkIG92ZXJmbG93LCB0aGUgcG9pbnRlciBpcyBkZWNyZW1lbnRlZCBmdXJ0aGVyCisgKiBhcyBpZiBvdXRwdXQgd2FzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciwgdGhvdWdoIG5vIG1vcmUgb3V0cHV0IGlzIGFjdHVhbGx5CisgKiBnZW5lcmF0ZWQuIHRoYXQgd2F5LCB0aGUgY2FsbGVyIGNhbiBkZXRlcm1pbmUgaG93IG11Y2ggc3BhY2Ugd291bGQgYmUKKyAqIHJlcXVpcmVkIGZvciB0aGUgcGF0aCB0byBmaXQgaW50byB0aGUgYnVmZmVyLiBpbiB0aGF0IGNhc2UsIHRoZSByZXR1cm5lZAorICogdmFsdWUgd2lsbCBiZSBzbWFsbGVyIHRoYW4gZGVzdC4gY2FsbGVycyBtdXN0IGNoZWNrIHRoaXMhCisgKi8KK3N0YXRpYyBjaGFyICppcmVmX3RvX3BhdGgoc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKmlyZWYsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViX2luLCB1NjQgcGFyZW50LAorCQkJCWNoYXIgKmRlc3QsIHUzMiBzaXplKQoreworCXUzMiBsZW47CisJaW50IHNsb3Q7CisJdTY0IG5leHRfaW51bTsKKwlpbnQgcmV0OworCXM2NCBieXRlc19sZWZ0ID0gc2l6ZSAtIDE7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViID0gZWJfaW47CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisKKwlpZiAoYnl0ZXNfbGVmdCA+PSAwKQorCQlkZXN0W2J5dGVzX2xlZnRdID0gJ1wwJzsKKworCXdoaWxlICgxKSB7CisJCWxlbiA9IGJ0cmZzX2lub2RlX3JlZl9uYW1lX2xlbihlYiwgaXJlZik7CisJCWJ5dGVzX2xlZnQgLT0gbGVuOworCQlpZiAoYnl0ZXNfbGVmdCA+PSAwKQorCQkJcmVhZF9leHRlbnRfYnVmZmVyKGViLCBkZXN0ICsgYnl0ZXNfbGVmdCwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKShpcmVmICsgMSksIGxlbik7CisJCWlmIChlYiAhPSBlYl9pbikKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJCXJldCA9IGlub2RlX3JlZl9pbmZvKHBhcmVudCwgMCwgZnNfcm9vdCwgcGF0aCwgJmZvdW5kX2tleSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJbmV4dF9pbnVtID0gZm91bmRfa2V5Lm9mZnNldDsKKworCQkvKiByZWd1bGFyIGV4aXQgYWhlYWQgKi8KKwkJaWYgKHBhcmVudCA9PSBuZXh0X2ludW0pCisJCQlicmVhazsKKworCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCWViID0gcGF0aC0+bm9kZXNbMF07CisJCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gdXNlIGViIGFmdGVyIHJlbGVhc2luZyB0aGUgcGF0aCAqLworCQlpZiAoZWIgIT0gZWJfaW4pCisJCQlhdG9taWNfaW5jKCZlYi0+cmVmcyk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKworCQlpcmVmID0gYnRyZnNfaXRlbV9wdHIoZWIsIHNsb3QsIHN0cnVjdCBidHJmc19pbm9kZV9yZWYpOworCQlwYXJlbnQgPSBuZXh0X2ludW07CisJCS0tYnl0ZXNfbGVmdDsKKwkJaWYgKGJ5dGVzX2xlZnQgPj0gMCkKKwkJCWRlc3RbYnl0ZXNfbGVmdF0gPSAnLyc7CisJfQorCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldHVybiBkZXN0ICsgYnl0ZXNfbGVmdDsKK30KKworLyoKKyAqIHRoaXMgbWFrZXMgdGhlIHBhdGggcG9pbnQgdG8gKGxvZ2ljYWwgRVhURU5UX0lURU0gKikKKyAqIHJldHVybnMgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSBmb3IgZGF0YSwgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSyBmb3IKKyAqIHRyZWUgYmxvY2tzIGFuZCA8MCBvbiBlcnJvci4KKyAqLworaW50IGV4dGVudF9mcm9tX2xvZ2ljYWwoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBsb2dpY2FsLAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSkKK3sKKwlpbnQgcmV0OworCXU2NCBmbGFnczsKKwl1MzIgaXRlbV9zaXplOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJa2V5Lm9iamVjdGlkID0gbG9naWNhbDsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGZzX2luZm8tPmV4dGVudF9yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKGZzX2luZm8tPmV4dGVudF9yb290LCBwYXRoLAorCQkJCQkwLCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCBmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwlpZiAoZm91bmRfa2V5LT50eXBlICE9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSB8fAorCSAgICBmb3VuZF9rZXktPm9iamVjdGlkID4gbG9naWNhbCB8fAorCSAgICBmb3VuZF9rZXktPm9iamVjdGlkICsgZm91bmRfa2V5LT5vZmZzZXQgPD0gbG9naWNhbCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllYiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgcGF0aC0+c2xvdHNbMF0pOworCUJVR19PTihpdGVtX3NpemUgPCBzaXplb2YoKmVpKSk7CisKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlmbGFncyA9IGJ0cmZzX2V4dGVudF9mbGFncyhlYiwgZWkpOworCisJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0dXJuIEJUUkZTX0VYVEVOVF9GTEFHX1RSRUVfQkxPQ0s7CisJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSkKKwkJcmV0dXJuIEJUUkZTX0VYVEVOVF9GTEFHX0RBVEE7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBpdGVyYXRlIGV4dGVudCBpbmxpbmUgcmVmcy4gcHRyIG11c3QgcG9pbnQgdG8gYSAwIHZhbHVlCisgKiBmb3IgdGhlIGZpcnN0IGNhbGwgYW5kIG1heSBiZSBtb2RpZmllZC4gaXQgaXMgdXNlZCB0byB0cmFjayBzdGF0ZS4KKyAqIGlmIG1vcmUgcmVmcyBleGlzdCwgMCBpcyByZXR1cm5lZCBhbmQgdGhlIG5leHQgY2FsbCB0bworICogX19nZXRfZXh0ZW50X2lubGluZV9yZWYgbXVzdCBwYXNzIHRoZSBtb2RpZmllZCBwdHIgcGFyYW1ldGVyIHRvIGdldCB0aGUKKyAqIG5leHQgcmVmLiBhZnRlciB0aGUgbGFzdCByZWYgd2FzIHByb2Nlc3NlZCwgMSBpcyByZXR1cm5lZC4KKyAqIHJldHVybnMgPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX2dldF9leHRlbnRfaW5saW5lX3JlZih1bnNpZ25lZCBsb25nICpwdHIsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpLCB1MzIgaXRlbV9zaXplLAorCQkJCXN0cnVjdCBidHJmc19leHRlbnRfaW5saW5lX3JlZiAqKm91dF9laXJlZiwKKwkJCQlpbnQgKm91dF90eXBlKQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCXU2NCBmbGFnczsKKwlzdHJ1Y3QgYnRyZnNfdHJlZV9ibG9ja19pbmZvICppbmZvOworCisJaWYgKCEqcHRyKSB7CisJCS8qIGZpcnN0IGNhbGwgKi8KKwkJZmxhZ3MgPSBidHJmc19leHRlbnRfZmxhZ3MoZWIsIGVpKTsKKwkJaWYgKGZsYWdzICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykgeworCQkJaW5mbyA9IChzdHJ1Y3QgYnRyZnNfdHJlZV9ibG9ja19pbmZvICopKGVpICsgMSk7CisJCQkqb3V0X2VpcmVmID0KKwkJCQkoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKGluZm8gKyAxKTsKKwkJfSBlbHNlIHsKKwkJCSpvdXRfZWlyZWYgPSAoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKGVpICsgMSk7CisJCX0KKwkJKnB0ciA9ICh1bnNpZ25lZCBsb25nKSpvdXRfZWlyZWY7CisJCWlmICgodm9pZCAqKSpwdHIgPj0gKHZvaWQgKillaSArIGl0ZW1fc2l6ZSkKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCWVuZCA9ICh1bnNpZ25lZCBsb25nKWVpICsgaXRlbV9zaXplOworCSpvdXRfZWlyZWYgPSAoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmICopKnB0cjsKKwkqb3V0X3R5cGUgPSBidHJmc19leHRlbnRfaW5saW5lX3JlZl90eXBlKGViLCAqb3V0X2VpcmVmKTsKKworCSpwdHIgKz0gYnRyZnNfZXh0ZW50X2lubGluZV9yZWZfc2l6ZSgqb3V0X3R5cGUpOworCVdBUk5fT04oKnB0ciA+IGVuZCk7CisJaWYgKCpwdHIgPT0gZW5kKQorCQlyZXR1cm4gMTsgLyogbGFzdCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkcyB0aGUgdHJlZSBibG9jayBiYWNrcmVmIGZvciBhbiBleHRlbnQuIHRyZWUgbGV2ZWwgYW5kIHJvb3QgYXJlIHJldHVybmVkCisgKiB0aHJvdWdoIG91dF9sZXZlbCBhbmQgb3V0X3Jvb3QuIHB0ciBtdXN0IHBvaW50IHRvIGEgMCB2YWx1ZSBmb3IgdGhlIGZpcnN0CisgKiBjYWxsIGFuZCBtYXkgYmUgbW9kaWZpZWQgKHNlZSBfX2dldF9leHRlbnRfaW5saW5lX3JlZiBjb21tZW50KS4KKyAqIHJldHVybnMgMCBpZiBkYXRhIHdhcyBwcm92aWRlZCwgMSBpZiB0aGVyZSB3YXMgbm8gbW9yZSBkYXRhIHRvIHByb3ZpZGUgb3IKKyAqIDwwIG9uIGVycm9yLgorICovCitpbnQgdHJlZV9iYWNrcmVmX2Zvcl9leHRlbnQodW5zaWduZWQgbG9uZyAqcHRyLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtICplaSwgdTMyIGl0ZW1fc2l6ZSwKKwkJCQl1NjQgKm91dF9yb290LCB1OCAqb3V0X2xldmVsKQoreworCWludCByZXQ7CisJaW50IHR5cGU7CisJc3RydWN0IGJ0cmZzX3RyZWVfYmxvY2tfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2lubGluZV9yZWYgKmVpcmVmOworCisJaWYgKCpwdHIgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCisJCXJldHVybiAxOworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gX19nZXRfZXh0ZW50X2lubGluZV9yZWYocHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHR5cGUgPT0gQlRSRlNfVFJFRV9CTE9DS19SRUZfS0VZIHx8CisJCSAgICB0eXBlID09IEJUUkZTX1NIQVJFRF9CTE9DS19SRUZfS0VZKQorCQkJYnJlYWs7CisKKwkJaWYgKHJldCA9PSAxKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogd2UgY2FuIHRyZWF0IGJvdGggcmVmIHR5cGVzIGVxdWFsbHkgaGVyZSAqLworCWluZm8gPSAoc3RydWN0IGJ0cmZzX3RyZWVfYmxvY2tfaW5mbyAqKShlaSArIDEpOworCSpvdXRfcm9vdCA9IGJ0cmZzX2V4dGVudF9pbmxpbmVfcmVmX29mZnNldChlYiwgZWlyZWYpOworCSpvdXRfbGV2ZWwgPSBidHJmc190cmVlX2Jsb2NrX2xldmVsKGViLCBpbmZvKTsKKworCWlmIChyZXQgPT0gMSkKKwkJKnB0ciA9ICh1bnNpZ25lZCBsb25nKS0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kYXRhX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHU2NCBpbnVtLAorCQkJCXU2NCBleHRlbnRfZGF0YV9pdGVtX29mZnNldCwgdTY0IHJvb3QpCit7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZjsKKworCXJlZiA9IGttYWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfTk9GUyk7CisJaWYgKCFyZWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVmLT5pbnVtID0gaW51bTsKKwlyZWYtPmV4dGVudF9kYXRhX2l0ZW1fb2Zmc2V0ID0gZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQ7CisJcmVmLT5yb290ID0gcm9vdDsKKwlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsIGhlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kYXRhX2xpc3RfYWRkX2ViKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2RhdGFfcmVmICpkcmVmKQoreworCXJldHVybiBfX2RhdGFfbGlzdF9hZGQoaGVhZCwgYnRyZnNfZXh0ZW50X2RhdGFfcmVmX29iamVjdGlkKGViLCBkcmVmKSwKKwkJCQlidHJmc19leHRlbnRfZGF0YV9yZWZfb2Zmc2V0KGViLCBkcmVmKSwKKwkJCQlidHJmc19leHRlbnRfZGF0YV9yZWZfcm9vdChlYiwgZHJlZikpOworfQorCitzdGF0aWMgaW50IF9fc2hhcmVkX2xpc3RfYWRkKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHU2NCBkaXNrX2J5dGUpCit7CisJc3RydWN0IF9fc2hhcmVkX3JlZiAqcmVmOworCisJcmVmID0ga21hbGxvYyhzaXplb2YoKnJlZiksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWYtPmRpc2tfYnl0ZSA9IGRpc2tfYnl0ZTsKKwlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsIGhlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmX2lub2RlcyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJICAgdTY0IGxvZ2ljYWwsIHU2NCBpbnVtLAorCQkJCQkgICB1NjQgZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCSAgIHU2NCBleHRlbnRfb2Zmc2V0LAorCQkJCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqZGF0YV9yZWZzLAorCQkJCQkgICBpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCAqaXRlcmF0ZSwKKwkJCQkJICAgdm9pZCAqY3R4KQoreworCXU2NCByZWZfcm9vdDsKKwl1MzIgaXRlbV9zaXplOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCXN0cnVjdCBidHJmc19leHRlbnRfaW5saW5lX3JlZiAqZWlyZWY7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZjsKKwlpbnQgcmV0OworCWludCB0eXBlOworCWludCBsYXN0OworCXVuc2lnbmVkIGxvbmcgcHRyID0gMDsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoZGF0YV9yZWZzKSk7CisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBsb2dpY2FsLCBwYXRoLCAma2V5KTsKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfREFUQSkKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwllYiA9IHBhdGgtPm5vZGVzWzBdOworCWVpID0gYnRyZnNfaXRlbV9wdHIoZWIsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0pOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgcGF0aC0+c2xvdHNbMF0pOworCisJcmV0ID0gMDsKKwlyZWZfcm9vdCA9IDA7CisJLyoKKwkgKiBhcyBkb25lIGluIGl0ZXJhdGVfZXh0ZW50X2lub2Rlcywgd2UgZmlyc3QgYnVpbGQgYSBsaXN0IG9mIHJlZnMgdG8KKwkgKiBpdGVyYXRlLCB0aGVuIGZyZWUgdGhlIHBhdGggYW5kIHRoZW4gaXRlcmF0ZSB0aGVtIHRvIGF2b2lkIGRlYWRsb2Nrcy4KKwkgKi8KKwlkbyB7CisJCWxhc3QgPSBfX2dldF9leHRlbnRfaW5saW5lX3JlZigmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAobGFzdCA8IDApIHsKKwkJCXJldCA9IGxhc3Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAodHlwZSA9PSBCVFJGU19UUkVFX0JMT0NLX1JFRl9LRVkgfHwKKwkJICAgIHR5cGUgPT0gQlRSRlNfU0hBUkVEX0JMT0NLX1JFRl9LRVkpIHsKKwkJCXJlZl9yb290ID0gYnRyZnNfZXh0ZW50X2lubGluZV9yZWZfb2Zmc2V0KGViLCBlaXJlZik7CisJCQlyZXQgPSBfX2RhdGFfbGlzdF9hZGQoZGF0YV9yZWZzLCBpbnVtLAorCQkJCQkJZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCQlyZWZfcm9vdCk7CisJCX0KKwl9IHdoaWxlICghcmV0ICYmICFsYXN0KTsKKworCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKKworCWlmIChyZWZfcm9vdCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byBmaW5kIHRyZWUgYmxvY2sgcmVmICIKKwkJCSJmb3Igc2hhcmVkIGRhdGEgYmFja3JlZiAlbGx1XG4iLCBsb2dpY2FsKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKK291dDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoZGF0YV9yZWZzKSkgeworCQlyZWYgPSBsaXN0X2ZpcnN0X2VudHJ5KGRhdGFfcmVmcywgc3RydWN0IF9fZGF0YV9yZWYsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVmLT5saXN0KTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBpdGVyYXRlKHJlZi0+aW51bSwgZXh0ZW50X29mZnNldCArCisJCQkJCXJlZi0+ZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCXJlZi0+cm9vdCwgY3R4KTsKKwkJa2ZyZWUocmVmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faXRlcl9zaGFyZWRfaW5saW5lX3JlZihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkgICAgdTY0IGxvZ2ljYWwsIHU2NCBvcmlnX2V4dGVudF9pdGVtX29iamVjdGlkLAorCQkJCSAgICB1NjQgZXh0ZW50X29mZnNldCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmRhdGFfcmVmcywKKwkJCQkgICAgaXRlcmF0ZV9leHRlbnRfaW5vZGVzX3QgKml0ZXJhdGUsCisJCQkJICAgIHZvaWQgKmN0eCkKK3sKKwl1NjQgZGlza19ieXRlOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJaW50IHNsb3Q7CisJaW50IG5yaXRlbXM7CisJaW50IHJldDsKKwlpbnQgZm91bmQgPSAwOworCisJZWIgPSByZWFkX3RyZWVfYmxvY2soZnNfaW5mby0+dHJlZV9yb290LCBsb2dpY2FsLAorCQkJCWZzX2luZm8tPnRyZWVfcm9vdC0+bGVhZnNpemUsIDApOworCWlmICghZWIpCisJCXJldHVybiAtRUlPOworCisJLyoKKwkgKiBmcm9tIHRoZSBzaGFyZWQgZGF0YSByZWYsIHdlIG9ubHkgaGF2ZSB0aGUgbGVhZiBidXQgd2UgbmVlZAorCSAqIHRoZSBrZXkuIHRodXMsIHdlIG11c3QgbG9vayBpbnRvIGFsbCBpdGVtcyBhbmQgc2VlIHRoYXQgd2UKKwkgKiBmaW5kIG9uZSAoc29tZSkgd2l0aCBhIHJlZmVyZW5jZSB0byBvdXIgZXh0ZW50IGl0ZW0uCisJICovCisJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKTsKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgbnJpdGVtczsgKytzbG90KSB7CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgJmtleSwgc2xvdCk7CisJCWlmIChrZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQljb250aW51ZTsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihlYiwgc2xvdCwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQlpZiAoIWZpKSB7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZGlza19ieXRlID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoZWIsIGZpKTsKKwkJaWYgKGRpc2tfYnl0ZSAhPSBvcmlnX2V4dGVudF9pdGVtX29iamVjdGlkKSB7CisJCQlpZiAoZm91bmQpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0KKwkJKytmb3VuZDsKKwkJcmV0ID0gX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmX2lub2Rlcyhmc19pbmZvLCBsb2dpY2FsLAorCQkJCQkJCWtleS5vYmplY3RpZCwKKwkJCQkJCQlrZXkub2Zmc2V0LAorCQkJCQkJCWV4dGVudF9vZmZzZXQsIHBhdGgsCisJCQkJCQkJZGF0YV9yZWZzLAorCQkJCQkJCWl0ZXJhdGUsIGN0eCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byBmb2xsb3cgc2hhcmVkIGRhdGEgYmFja3JlZiAiCisJCQkidG8gcGFyZW50ICVsbHVcbiIsIGxvZ2ljYWwpOworCQlXQVJOX09OKDEpOworCQlyZXQgPSAtRUlPOworCX0KKworCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNhbGxzIGl0ZXJhdGUoKSBmb3IgZXZlcnkgaW5vZGUgdGhhdCByZWZlcmVuY2VzIHRoZSBleHRlbnQgaWRlbnRpZmllZCBieQorICogdGhlIGdpdmVuIHBhcmFtZXRlcnMuIHdpbGwgdXNlIHRoZSBwYXRoIGdpdmVuIGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm4gaXQKKyAqIHJlbGVhc2VkLgorICogd2hlbiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCBpdGVyYXRpb24gc3RvcHMuCisgKi8KK2ludCBpdGVyYXRlX2V4dGVudF9pbm9kZXMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJdTY0IGV4dGVudF9pdGVtX29iamVjdGlkLAorCQkJCXU2NCBleHRlbnRfb2Zmc2V0LAorCQkJCWl0ZXJhdGVfZXh0ZW50X2lub2Rlc190ICppdGVyYXRlLCB2b2lkICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSAwOworCWludCBsYXN0OworCWludCByZXQ7CisJaW50IHR5cGU7CisJdTY0IGxvZ2ljYWw7CisJdTMyIGl0ZW1fc2l6ZTsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2lubGluZV9yZWYgKmVpcmVmOworCXN0cnVjdCBidHJmc19leHRlbnRfZGF0YV9yZWYgKmRyZWY7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqZWk7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGxpc3RfaGVhZCBkYXRhX3JlZnMgPSBMSVNUX0hFQURfSU5JVChkYXRhX3JlZnMpOworCXN0cnVjdCBsaXN0X2hlYWQgc2hhcmVkX3JlZnMgPSBMSVNUX0hFQURfSU5JVChzaGFyZWRfcmVmcyk7CisJc3RydWN0IF9fZGF0YV9yZWYgKnJlZl9kOworCXN0cnVjdCBfX3NoYXJlZF9yZWYgKnJlZl9zOworCisJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIoZWIsIHBhdGgtPnNsb3RzWzBdKTsKKworCS8qIGZpcnN0IHdlIGl0ZXJhdGUgdGhlIGlubGluZSByZWZzLCAuLi4gKi8KKwlkbyB7CisJCWxhc3QgPSBfX2dldF9leHRlbnRfaW5saW5lX3JlZigmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCSZlaXJlZiwgJnR5cGUpOworCQlpZiAobGFzdCA9PSAtRU5PRU5UKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxhc3QgPCAwKSB7CisJCQlyZXQgPSBsYXN0OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHlwZSA9PSBCVFJGU19FWFRFTlRfREFUQV9SRUZfS0VZKSB7CisJCQlkcmVmID0gKHN0cnVjdCBidHJmc19leHRlbnRfZGF0YV9yZWYgKikoJmVpcmVmLT5vZmZzZXQpOworCQkJcmV0ID0gX19kYXRhX2xpc3RfYWRkX2ViKCZkYXRhX3JlZnMsIGViLCBkcmVmKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IEJUUkZTX1NIQVJFRF9EQVRBX1JFRl9LRVkpIHsKKwkJCWxvZ2ljYWwgPSBidHJmc19leHRlbnRfaW5saW5lX3JlZl9vZmZzZXQoZWIsIGVpcmVmKTsKKwkJCXJldCA9IF9fc2hhcmVkX2xpc3RfYWRkKCZzaGFyZWRfcmVmcywgbG9naWNhbCk7CisJCX0KKwl9IHdoaWxlICghcmV0ICYmICFsYXN0KTsKKworCS8qIC4uLiB0aGVuIHdlIHByb2NlZWQgdG8gaW4tdHJlZSByZWZlcmVuY2VzIGFuZCAuLi4gKi8KKwl3aGlsZSAoIXJldCkgeworCQkrK3BhdGgtPnNsb3RzWzBdOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPiBidHJmc19oZWFkZXJfbnJpdGVtcyhlYikpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihmc19pbmZvLT5leHRlbnRfcm9vdCwgcGF0aCk7CisJCQlpZiAocmV0KSB7CisJCQkJaWYgKHJldCA9PSAxKQorCQkJCQlyZXQgPSAwOyAvKiB3ZSdyZSBkb25lICovCisJCQkJYnJlYWs7CisJCQl9CisJCQllYiA9IHBhdGgtPm5vZGVzWzBdOworCQl9CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShlYiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IGV4dGVudF9pdGVtX29iamVjdGlkKQorCQkJYnJlYWs7CisJCWlmIChrZXkudHlwZSA9PSBCVFJGU19FWFRFTlRfREFUQV9SRUZfS0VZKSB7CisJCQlkcmVmID0gYnRyZnNfaXRlbV9wdHIoZWIsIHBhdGgtPnNsb3RzWzBdLAorCQkJCQkJc3RydWN0IGJ0cmZzX2V4dGVudF9kYXRhX3JlZik7CisJCQlyZXQgPSBfX2RhdGFfbGlzdF9hZGRfZWIoJmRhdGFfcmVmcywgZWIsIGRyZWYpOworCQl9IGVsc2UgaWYgKGtleS50eXBlID09IEJUUkZTX1NIQVJFRF9EQVRBX1JFRl9LRVkpIHsKKwkJCXJldCA9IF9fc2hhcmVkX2xpc3RfYWRkKCZzaGFyZWRfcmVmcywga2V5Lm9mZnNldCk7CisJCX0KKwl9CisKKwlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisKKwkvKgorCSAqIC4uLiBvbmx5IGF0IHRoZSB2ZXJ5IGVuZCB3ZSBjYW4gcHJvY2VzcyB0aGUgcmVmcyB3ZSBmb3VuZC4gdGhpcyBpcworCSAqIGJlY2F1c2UgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHdlIGNhbGwgaXMgYWxsb3dlZCB0byBtYWtlIHRyZWUgbG9va3VwcworCSAqIGFuZCB3ZSBoYXZlIHRvIGF2b2lkIGRlYWRsb2Nrcy4gYWRkaXRpb25hbGx5LCB3ZSBuZWVkIG1vcmUgdHJlZQorCSAqIGxvb2t1cHMgb3Vyc2VsdmVzIGZvciBzaGFyZWQgZGF0YSByZWZzLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZGF0YV9yZWZzKSkgeworCQlyZWZfZCA9IGxpc3RfZmlyc3RfZW50cnkoJmRhdGFfcmVmcywgc3RydWN0IF9fZGF0YV9yZWYsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVmX2QtPmxpc3QpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGl0ZXJhdGUocmVmX2QtPmludW0sIGV4dGVudF9vZmZzZXQgKworCQkJCQlyZWZfZC0+ZXh0ZW50X2RhdGFfaXRlbV9vZmZzZXQsCisJCQkJCXJlZl9kLT5yb290LCBjdHgpOworCQlrZnJlZShyZWZfZCk7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzaGFyZWRfcmVmcykpIHsKKwkJcmVmX3MgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzaGFyZWRfcmVmcywgc3RydWN0IF9fc2hhcmVkX3JlZiwKKwkJCQkJbGlzdCk7CisJCWxpc3RfZGVsKCZyZWZfcy0+bGlzdCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gX19pdGVyX3NoYXJlZF9pbmxpbmVfcmVmKGZzX2luZm8sCisJCQkJCQkJcmVmX3MtPmRpc2tfYnl0ZSwKKwkJCQkJCQlleHRlbnRfaXRlbV9vYmplY3RpZCwKKwkJCQkJCQlleHRlbnRfb2Zmc2V0LCBwYXRoLAorCQkJCQkJCSZkYXRhX3JlZnMsCisJCQkJCQkJaXRlcmF0ZSwgY3R4KTsKKwkJa2ZyZWUocmVmX3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpdGVyYXRlX2lub2Rlc19mcm9tX2xvZ2ljYWwodTY0IGxvZ2ljYWwsIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCWl0ZXJhdGVfZXh0ZW50X2lub2Rlc190ICppdGVyYXRlLCB2b2lkICpjdHgpCit7CisJaW50IHJldDsKKwl1NjQgb2Zmc2V0OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBsb2dpY2FsLCBwYXRoLAorCQkJCQkmZm91bmRfa2V5KTsKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW9mZnNldCA9IGxvZ2ljYWwgLSBmb3VuZF9rZXkub2JqZWN0aWQ7CisJcmV0ID0gaXRlcmF0ZV9leHRlbnRfaW5vZGVzKGZzX2luZm8sIHBhdGgsIGZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQkJb2Zmc2V0LCBpdGVyYXRlLCBjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpdGVyYXRlX2lyZWZzKHU2NCBpbnVtLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQlpdGVyYXRlX2lyZWZzX3QgKml0ZXJhdGUsIHZvaWQgKmN0eCkKK3sKKwlpbnQgcmV0OworCWludCBzbG90OworCXUzMiBjdXI7CisJdTMyIGxlbjsKKwl1MzIgbmFtZV9sZW47CisJdTY0IHBhcmVudCA9IDA7CisJaW50IGZvdW5kID0gMDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqaXJlZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGlub2RlX3JlZl9pbmZvKGludW0sIHBhcmVudCA/IHBhcmVudCsxIDogMCwgZnNfcm9vdCwgcGF0aCwKKwkJCQkJJmZvdW5kX2tleSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IGZvdW5kID8gMCA6IC1FTk9FTlQ7CisJCQlicmVhazsKKwkJfQorCQkrK2ZvdW5kOworCisJCXBhcmVudCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwkJLyogbWFrZSBzdXJlIHdlIGNhbiB1c2UgZWIgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBwYXRoICovCisJCWF0b21pY19pbmMoJmViLT5yZWZzKTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJCWl0ZW0gPSBidHJmc19pdGVtX25yKGViLCBzbG90KTsKKwkJaXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBzbG90LCBzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmKTsKKworCQlmb3IgKGN1ciA9IDA7IGN1ciA8IGJ0cmZzX2l0ZW1fc2l6ZShlYiwgaXRlbSk7IGN1ciArPSBsZW4pIHsKKwkJCW5hbWVfbGVuID0gYnRyZnNfaW5vZGVfcmVmX25hbWVfbGVuKGViLCBpcmVmKTsKKwkJCS8qIHBhdGggbXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgY2FsbGluZyBpdGVyYXRlKCkhICovCisJCQlyZXQgPSBpdGVyYXRlKHBhcmVudCwgaXJlZiwgZWIsIGN0eCk7CisJCQlpZiAocmV0KSB7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9IHNpemVvZigqaXJlZikgKyBuYW1lX2xlbjsKKwkJCWlyZWYgPSAoc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqKSgoY2hhciAqKWlyZWYgKyBsZW4pOworCQl9CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJfQorCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJldHVybnMgMCBpZiB0aGUgcGF0aCBjb3VsZCBiZSBkdW1wZWQgKHByb2JhYmx5IHRydW5jYXRlZCkKKyAqIHJldHVybnMgPDAgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitzdGF0aWMgaW50IGlub2RlX3RvX3BhdGgodTY0IGludW0sIHN0cnVjdCBidHJmc19pbm9kZV9yZWYgKmlyZWYsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB2b2lkICpjdHgpCit7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppcGF0aCA9IGN0eDsKKwljaGFyICpmc3BhdGg7CisJY2hhciAqZnNwYXRoX21pbjsKKwlpbnQgaSA9IGlwYXRoLT5mc3BhdGgtPmVsZW1fY250OworCWNvbnN0IGludCBzX3B0ciA9IHNpemVvZihjaGFyICopOworCXUzMiBieXRlc19sZWZ0OworCisJYnl0ZXNfbGVmdCA9IGlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgPiBzX3B0ciA/CisJCQkJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgLSBzX3B0ciA6IDA7CisKKwlmc3BhdGhfbWluID0gKGNoYXIgKilpcGF0aC0+ZnNwYXRoLT52YWwgKyAoaSArIDEpICogc19wdHI7CisJZnNwYXRoID0gaXJlZl90b19wYXRoKGlwYXRoLT5mc19yb290LCBpcGF0aC0+YnRyZnNfcGF0aCwgaXJlZiwgZWIsCisJCQkJaW51bSwgZnNwYXRoX21pbiwgYnl0ZXNfbGVmdCk7CisJaWYgKElTX0VSUihmc3BhdGgpKQorCQlyZXR1cm4gUFRSX0VSUihmc3BhdGgpOworCisJaWYgKGZzcGF0aCA+IGZzcGF0aF9taW4pIHsKKwkJaXBhdGgtPmZzcGF0aC0+dmFsW2ldID0gKHU2NClmc3BhdGg7CisJCSsraXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7CisJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX2xlZnQgPSBmc3BhdGggLSBmc3BhdGhfbWluOworCX0gZWxzZSB7CisJCSsraXBhdGgtPmZzcGF0aC0+ZWxlbV9taXNzZWQ7CisJCWlwYXRoLT5mc3BhdGgtPmJ5dGVzX21pc3NpbmcgKz0gZnNwYXRoX21pbiAtIGZzcGF0aDsKKwkJaXBhdGgtPmZzcGF0aC0+Ynl0ZXNfbGVmdCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGR1bXBzIGFsbCBmaWxlIHN5c3RlbSBwYXRocyB0byB0aGUgaW5vZGUgaW50byB0aGUgaXBhdGggc3RydWN0LCBwcm92aWRlZAorICogaXMgaGFzIGJlZW4gY3JlYXRlZCBsYXJnZSBlbm91Z2guIGVhY2ggcGF0aCBpcyB6ZXJvLXRlcm1pbmF0ZWQgYW5kIGFjY2Vzc2VkCisgKiBmcm9tIGlwYXRoLT5mc3BhdGgtPnZhbFtpXS4KKyAqIHdoZW4gaXQgcmV0dXJucywgdGhlcmUgYXJlIGlwYXRoLT5mc3BhdGgtPmVsZW1fY250IG51bWJlciBvZiBwYXRocyBhdmFpbGFibGUKKyAqIGluIGlwYXRoLT5mc3BhdGgtPnZhbFtdLiB3aGVuIHRoZSBhbGxvY2F0ZWQgc3BhY2Ugd2Fzbid0IHN1ZmZpY2llbnQsIHRoZQorICogbnVtYmVyIG9mIG1pc3NlZCBwYXRocyBpbiByZWNvcmVkIGluIGlwYXRoLT5mc3BhdGgtPmVsZW1fbWlzc2VkLCBvdGhlcndpc2UsCisgKiBpdCdzIHplcm8uIGlwYXRoLT5mc3BhdGgtPmJ5dGVzX21pc3NpbmcgaG9sZHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkCisgKiBoYXZlIGJlZW4gbmVlZGVkIHRvIHJldHVybiBhbGwgcGF0aHMuCisgKi8KK2ludCBwYXRoc19mcm9tX2lub2RlKHU2NCBpbnVtLCBzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmlwYXRoKQoreworCXJldHVybiBpdGVyYXRlX2lyZWZzKGludW0sIGlwYXRoLT5mc19yb290LCBpcGF0aC0+YnRyZnNfcGF0aCwKKwkJCQlpbm9kZV90b19wYXRoLCBpcGF0aCk7Cit9CisKKy8qCisgKiBhbGxvY2F0ZXMgc3BhY2UgdG8gcmV0dXJuIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzIGZvciBhbiBpbm9kZS4KKyAqIHRvdGFsX2J5dGVzIHRvIGFsbG9jYXRlIGFyZSBwYXNzZWQsIG5vdGUgdGhhdCBzcGFjZSB1c2FibGUgZm9yIGFjdHVhbCBwYXRoCisgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHRvdGFsX2J5dGVzIC0gc2l6ZW9mKHN0cnVjdCBpbm9kZV9mc19wYXRocykuCisgKiB0aGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlIGZyZWVkIHdpdGggZnJlZV9pcGF0aCgpIGluIHRoZSBlbmQuCisgKi8KK3N0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lciAqaW5pdF9kYXRhX2NvbnRhaW5lcih1MzIgdG90YWxfYnl0ZXMpCit7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICpkYXRhOworCXNpemVfdCBhbGxvY19ieXRlczsKKworCWFsbG9jX2J5dGVzID0gbWF4X3Qoc2l6ZV90LCB0b3RhbF9ieXRlcywgc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2MoYWxsb2NfYnl0ZXMsIEdGUF9OT0ZTKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHRvdGFsX2J5dGVzID49IHNpemVvZigqZGF0YSkpIHsKKwkJZGF0YS0+Ynl0ZXNfbGVmdCA9IHRvdGFsX2J5dGVzIC0gc2l6ZW9mKCpkYXRhKTsKKwkJZGF0YS0+Ynl0ZXNfbWlzc2luZyA9IDA7CisJfSBlbHNlIHsKKwkJZGF0YS0+Ynl0ZXNfbWlzc2luZyA9IHNpemVvZigqZGF0YSkgLSB0b3RhbF9ieXRlczsKKwkJZGF0YS0+Ynl0ZXNfbGVmdCA9IDA7CisJfQorCisJZGF0YS0+ZWxlbV9jbnQgPSAwOworCWRhdGEtPmVsZW1fbWlzc2VkID0gMDsKKworCXJldHVybiBkYXRhOworfQorCisvKgorICogYWxsb2NhdGVzIHNwYWNlIHRvIHJldHVybiBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocyBmb3IgYW4gaW5vZGUuCisgKiB0b3RhbF9ieXRlcyB0byBhbGxvY2F0ZSBhcmUgcGFzc2VkLCBub3RlIHRoYXQgc3BhY2UgdXNhYmxlIGZvciBhY3R1YWwgcGF0aAorICogaW5mb3JtYXRpb24gd2lsbCBiZSB0b3RhbF9ieXRlcyAtIHNpemVvZihzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMpLgorICogdGhlIHJldHVybmVkIHBvaW50ZXIgbXVzdCBiZSBmcmVlZCB3aXRoIGZyZWVfaXBhdGgoKSBpbiB0aGUgZW5kLgorICovCitzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmluaXRfaXBhdGgoczMyIHRvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppZnA7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICpmc3BhdGg7CisKKwlmc3BhdGggPSBpbml0X2RhdGFfY29udGFpbmVyKHRvdGFsX2J5dGVzKTsKKwlpZiAoSVNfRVJSKGZzcGF0aCkpCisJCXJldHVybiAodm9pZCAqKWZzcGF0aDsKKworCWlmcCA9IGttYWxsb2Moc2l6ZW9mKCppZnApLCBHRlBfTk9GUyk7CisJaWYgKCFpZnApIHsKKwkJa2ZyZWUoZnNwYXRoKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJaWZwLT5idHJmc19wYXRoID0gcGF0aDsKKwlpZnAtPmZzcGF0aCA9IGZzcGF0aDsKKwlpZnAtPmZzX3Jvb3QgPSBmc19yb290OworCisJcmV0dXJuIGlmcDsKK30KKwordm9pZCBmcmVlX2lwYXRoKHN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGgpCit7CisJa2ZyZWUoaXBhdGgpOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5oIGIvZnMvYnRyZnMvYmFja3JlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjE4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9iYWNrcmVmLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTVFJBVE8uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19CVFJGU19CQUNLUkVGX18KKyNkZWZpbmUgX19CVFJGU19CQUNLUkVGX18KKworI2luY2x1ZGUgImlvY3RsLmgiCisKK3N0cnVjdCBpbm9kZV9mc19wYXRocyB7CisJc3RydWN0IGJ0cmZzX3BhdGgJCSpidHJmc19wYXRoOworCXN0cnVjdCBidHJmc19yb290CQkqZnNfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIJKmZzcGF0aDsKK307CisKK3R5cGVkZWYgaW50IChpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCkodTY0IGludW0sIHU2NCBvZmZzZXQsIHU2NCByb290LAorCQl2b2lkICpjdHgpOwordHlwZWRlZiBpbnQgKGl0ZXJhdGVfaXJlZnNfdCkodTY0IHBhcmVudCwgc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqaXJlZiwKKwkJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHZvaWQgKmN0eCk7CisKK2ludCBpbm9kZV9pdGVtX2luZm8odTY0IGludW0sIHU2NCBpb2ZmLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoKTsKKworaW50IGV4dGVudF9mcm9tX2xvZ2ljYWwoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBsb2dpY2FsLAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHN0cnVjdCBidHJmc19rZXkgKmZvdW5kX2tleSk7CisKK2ludCB0cmVlX2JhY2tyZWZfZm9yX2V4dGVudCh1bnNpZ25lZCBsb25nICpwdHIsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpLCB1MzIgaXRlbV9zaXplLAorCQkJCXU2NCAqb3V0X3Jvb3QsIHU4ICpvdXRfbGV2ZWwpOworCitpbnQgaXRlcmF0ZV9leHRlbnRfaW5vZGVzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCXU2NCBleHRlbnRfaXRlbV9vYmplY3RpZCwKKwkJCQl1NjQgZXh0ZW50X29mZnNldCwKKwkJCQlpdGVyYXRlX2V4dGVudF9pbm9kZXNfdCAqaXRlcmF0ZSwgdm9pZCAqY3R4KTsKKworaW50IGl0ZXJhdGVfaW5vZGVzX2Zyb21fbG9naWNhbCh1NjQgbG9naWNhbCwgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJaXRlcmF0ZV9leHRlbnRfaW5vZGVzX3QgKml0ZXJhdGUsIHZvaWQgKmN0eCk7CisKK2ludCBwYXRoc19mcm9tX2lub2RlKHU2NCBpbnVtLCBzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmlwYXRoKTsKKworc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICppbml0X2RhdGFfY29udGFpbmVyKHUzMiB0b3RhbF9ieXRlcyk7CitzdHJ1Y3QgaW5vZGVfZnNfcGF0aHMgKmluaXRfaXBhdGgoczMyIHRvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpOwordm9pZCBmcmVlX2lwYXRoKHN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmggYi9mcy9idHJmcy9idHJmc19pbm9kZS5oCmluZGV4IGQ5Zjk5YTEuLjYzNDYwOGQyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9idHJmc19pbm9kZS5oCisrKyBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKQEAgLTEwMywxMSArMTAzLDYgQEAKIAkgKi8KIAl1NjQgZGVsYWxsb2NfYnl0ZXM7CiAKLQkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IgdGhpcyBpbm9kZSBmb3IKLQkgKiBkZWxhbGxvYwotCSAqLwotCXU2NCByZXNlcnZlZF9ieXRlczsKLQogCS8qCiAJICogdGhlIHNpemUgb2YgdGhlIGZpbGUgc3RvcmVkIGluIHRoZSBtZXRhZGF0YSBvbiBkaXNrLiAgZGF0YT1vcmRlcmVkCiAJICogbWVhbnMgdGhlIGluLW1lbW9yeSBpX3NpemUgbWlnaHQgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb24gZGlzawpAQCAtMTE1LDkgKzExMCw2IEBACiAJICovCiAJdTY0IGRpc2tfaV9zaXplOwogCi0JLyogZmxhZ3MgZmllbGQgZnJvbSB0aGUgb24gZGlzayBpbm9kZSAqLwotCXUzMiBmbGFnczsKLQogCS8qCiAJICogaWYgdGhpcyBpcyBhIGRpcmVjdG9yeSB0aGVuIGluZGV4X2NudCBpcyB0aGUgY291bnRlciBmb3IgdGhlIGluZGV4CiAJICogbnVtYmVyIGZvciBuZXcgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZApAQCAtMTMyLDYgKzEyNCwxNSBAQAogCXU2NCBsYXN0X3VubGlua190cmFuczsKIAogCS8qCisJICogTnVtYmVyIG9mIGJ5dGVzIG91dHN0YW5kaW5nIHRoYXQgYXJlIGdvaW5nIHRvIG5lZWQgY3N1bXMuICBUaGlzIGlzCisJICogdXNlZCBpbiBFTk9TUEMgYWNjb3VudGluZy4KKwkgKi8KKwl1NjQgY3N1bV9ieXRlczsKKworCS8qIGZsYWdzIGZpZWxkIGZyb20gdGhlIG9uIGRpc2sgaW5vZGUgKi8KKwl1MzIgZmxhZ3M7CisKKwkvKgogCSAqIENvdW50ZXJzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBleHRlbnQgaXRlbSdzIHdlIG1heSB1c2UgZHVlCiAJICogdG8gZGVsYWxsb2MgYW5kIHN1Y2guICBvdXRzdGFuZGluZ19leHRlbnRzIGlzIHRoZSBudW1iZXIgb2YgZXh0ZW50CiAJICogaXRlbXMgd2UgdGhpbmsgd2UnbGwgZW5kIHVwIHVzaW5nLCBhbmQgcmVzZXJ2ZWRfZXh0ZW50cyBpcyB0aGUgbnVtYmVyCkBAIC0xNDYsMTQgKzE0NywxMiBAQAogCSAqIHRoZSBidHJmcyBmaWxlIHJlbGVhc2UgY2FsbCB3aWxsIGFkZCB0aGlzIGlub2RlIHRvIHRoZQogCSAqIG9yZGVyZWQgb3BlcmF0aW9ucyBsaXN0IHNvIHRoYXQgd2UgbWFrZSBzdXJlIHRvIGZsdXNoIG91dCBhbnkKIAkgKiBuZXcgZGF0YSB0aGUgYXBwbGljYXRpb24gbWF5IGhhdmUgd3JpdHRlbiBiZWZvcmUgY29tbWl0LgotCSAqCi0JICogeWVzLCBpdHMgc2lsbHkgdG8gaGF2ZSBhIHNpbmdsZSBiaXRmbGFnLCBidXQgd2UgbWlnaHQgZ3JvdyBtb3JlCi0JICogb2YgdGhlc2UuCiAJICovCiAJdW5zaWduZWQgb3JkZXJlZF9kYXRhX2Nsb3NlOjE7CiAJdW5zaWduZWQgb3JwaGFuX21ldGFfcmVzZXJ2ZWQ6MTsKIAl1bnNpZ25lZCBkdW1teV9pbm9kZToxOwogCXVuc2lnbmVkIGluX2RlZnJhZzoxOworCXVuc2lnbmVkIGRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQ6MTsKIAogCS8qCiAJICogYWx3YXlzIGNvbXByZXNzIHRoaXMgb25lIGZpbGUKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCmluZGV4IDhlYzVkODYuLjE0ZjFjNWEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKKysrIGIvZnMvYnRyZnMvY29tcHJlc3Npb24uYwpAQCAtODUsNyArODUsOCBAQAogc3RhdGljIGlubGluZSBpbnQgY29tcHJlc3NlZF9iaW9fc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGRpc2tfc2l6ZSkKIHsKLQl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgY29tcHJlc3NlZF9iaW8pICsKIAkJKChkaXNrX3NpemUgKyByb290LT5zZWN0b3JzaXplIC0gMSkgLyByb290LT5zZWN0b3JzaXplKSAqCiAJCWNzdW1fc2l6ZTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmMgYi9mcy9idHJmcy9jdHJlZS5jCmluZGV4IDAxMWNhYjMuLjBmZTYxNWUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmMKKysrIGIvZnMvYnRyZnMvY3RyZWUuYwpAQCAtOTAyLDkgKzkwMiwxMCBAQAogCiAJb3JpZ19wdHIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKG1pZCwgb3JpZ19zbG90KTsKIAotCWlmIChsZXZlbCA8IEJUUkZTX01BWF9MRVZFTCAtIDEpCisJaWYgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkgewogCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1tsZXZlbCArIDFdOwotCXBzbG90ID0gcGF0aC0+c2xvdHNbbGV2ZWwgKyAxXTsKKwkJcHNsb3QgPSBwYXRoLT5zbG90c1tsZXZlbCArIDFdOworCX0KIAogCS8qCiAJICogZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIHBvaW50ZXIgaW4gdGhlIHJvb3QKQEAgLTExMDcsOSArMTEwOCwxMCBAQAogCW1pZCA9IHBhdGgtPm5vZGVzW2xldmVsXTsKIAlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG1pZCkgIT0gdHJhbnMtPnRyYW5zaWQpOwogCi0JaWYgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkKKwlpZiAobGV2ZWwgPCBCVFJGU19NQVhfTEVWRUwgLSAxKSB7CiAJCXBhcmVudCA9IHBhdGgtPm5vZGVzW2xldmVsICsgMV07Ci0JcHNsb3QgPSBwYXRoLT5zbG90c1tsZXZlbCArIDFdOworCQlwc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsICsgMV07CisJfQogCiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggMDM5MTJjNS4uYjliYTU5ZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuaAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9idHJmcy5oPgogI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgImV4dGVudF9pby5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKICNpbmNsdWRlICJhc3luYy10aHJlYWQuaCIKQEAgLTM2MCw2ICszNjEsNDcgQEAKICNkZWZpbmUgQlRSRlNfTEFCRUxfU0laRSAyNTYKIAogLyoKKyAqIGp1c3QgaW4gY2FzZSB3ZSBzb21laG93IGxvc2UgdGhlIHJvb3RzIGFuZCBhcmUgbm90IGFibGUgdG8gbW91bnQsCisgKiB3ZSBzdG9yZSBhbiBhcnJheSBvZiB0aGUgcm9vdHMgZnJvbSBwcmV2aW91cyB0cmFuc2FjdGlvbnMKKyAqIGluIHRoZSBzdXBlci4KKyAqLworI2RlZmluZSBCVFJGU19OVU1fQkFDS1VQX1JPT1RTIDQKK3N0cnVjdCBidHJmc19yb290X2JhY2t1cCB7CisJX19sZTY0IHRyZWVfcm9vdDsKKwlfX2xlNjQgdHJlZV9yb290X2dlbjsKKworCV9fbGU2NCBjaHVua19yb290OworCV9fbGU2NCBjaHVua19yb290X2dlbjsKKworCV9fbGU2NCBleHRlbnRfcm9vdDsKKwlfX2xlNjQgZXh0ZW50X3Jvb3RfZ2VuOworCisJX19sZTY0IGZzX3Jvb3Q7CisJX19sZTY0IGZzX3Jvb3RfZ2VuOworCisJX19sZTY0IGRldl9yb290OworCV9fbGU2NCBkZXZfcm9vdF9nZW47CisKKwlfX2xlNjQgY3N1bV9yb290OworCV9fbGU2NCBjc3VtX3Jvb3RfZ2VuOworCisJX19sZTY0IHRvdGFsX2J5dGVzOworCV9fbGU2NCBieXRlc191c2VkOworCV9fbGU2NCBudW1fZGV2aWNlczsKKwkvKiBmdXR1cmUgKi8KKwlfX2xlNjQgdW5zZWRfNjRbNF07CisKKwl1OCB0cmVlX3Jvb3RfbGV2ZWw7CisJdTggY2h1bmtfcm9vdF9sZXZlbDsKKwl1OCBleHRlbnRfcm9vdF9sZXZlbDsKKwl1OCBmc19yb290X2xldmVsOworCXU4IGRldl9yb290X2xldmVsOworCXU4IGNzdW1fcm9vdF9sZXZlbDsKKwkvKiBmdXR1cmUgYW5kIHRvIGFsaWduICovCisJdTggdW51c2VkXzhbMTBdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKgogICogdGhlIHN1cGVyIGJsb2NrIGJhc2ljYWxseSBsaXN0cyB0aGUgbWFpbiB0cmVlcyBvZiB0aGUgRlMKICAqIGl0IGN1cnJlbnRseSBsYWNrcyBhbnkgYmxvY2sgY291bnQgZXRjIGV0YwogICovCkBAIC00MDUsNiArNDQ3LDcgQEAKIAkvKiBmdXR1cmUgZXhwYW5zaW9uICovCiAJX19sZTY0IHJlc2VydmVkWzMxXTsKIAl1OCBzeXNfY2h1bmtfYXJyYXlbQlRSRlNfU1lTVEVNX0NIVU5LX0FSUkFZX1NJWkVdOworCXN0cnVjdCBidHJmc19yb290X2JhY2t1cCBzdXBlcl9yb290c1tCVFJGU19OVU1fQkFDS1VQX1JPT1RTXTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyoKQEAgLTc3MiwxNCArODE1LDggQEAKIHN0cnVjdCBidHJmc19ibG9ja19yc3YgewogCXU2NCBzaXplOwogCXU2NCByZXNlcnZlZDsKLQl1NjQgZnJlZWRbMl07CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXNwaW5sb2NrX3QgbG9jazsKLQlhdG9taWNfdCB1c2FnZTsKLQl1bnNpZ25lZCBpbnQgcHJpb3JpdHk6ODsKLQl1bnNpZ25lZCBpbnQgZHVyYWJsZToxOwotCXVuc2lnbmVkIGludCByZWZpbGxfdXNlZDoxOwogCXVuc2lnbmVkIGludCBmdWxsOjE7CiB9OwogCkBAIC04NDAsMTAgKzg3NywxMCBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAl1NjQgcGlubmVkOwogCXU2NCByZXNlcnZlZDsKLQl1NjQgcmVzZXJ2ZWRfcGlubmVkOwogCXU2NCBieXRlc19zdXBlcjsKIAl1NjQgZmxhZ3M7CiAJdTY0IHNlY3RvcnNpemU7CisJdTY0IGNhY2hlX2dlbmVyYXRpb247CiAJdW5zaWduZWQgaW50IHJvOjE7CiAJdW5zaWduZWQgaW50IGRpcnR5OjE7CiAJdW5zaWduZWQgaW50IGlyZWY6MTsKQEAgLTg5OSw2ICs5MzYsMTAgQEAKIAlzcGlubG9ja190IGJsb2NrX2dyb3VwX2NhY2hlX2xvY2s7CiAJc3RydWN0IHJiX3Jvb3QgYmxvY2tfZ3JvdXBfY2FjaGVfdHJlZTsKIAorCS8qIGtlZXAgdHJhY2sgb2YgdW5hbGxvY2F0ZWQgc3BhY2UgKi8KKwlzcGlubG9ja190IGZyZWVfY2h1bmtfbG9jazsKKwl1NjQgZnJlZV9jaHVua19zcGFjZTsKKwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBmcmVlZF9leHRlbnRzWzJdOwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqcGlubmVkX2V4dGVudHM7CiAKQEAgLTkxNiwxNCArOTU3LDExIEBACiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiB0cmFuc19ibG9ja19yc3Y7CiAJLyogYmxvY2sgcmVzZXJ2YXRpb24gZm9yIGNodW5rIHRyZWUgKi8KIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2IGNodW5rX2Jsb2NrX3JzdjsKKwkvKiBibG9jayByZXNlcnZhdGlvbiBmb3IgZGVsYXllZCBvcGVyYXRpb25zICovCisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiBkZWxheWVkX2Jsb2NrX3JzdjsKIAogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgZW1wdHlfYmxvY2tfcnN2OwogCi0JLyogbGlzdCBvZiBibG9jayByZXNlcnZhdGlvbnMgdGhhdCBjcm9zcyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGR1cmFibGVfYmxvY2tfcnN2X2xpc3Q7Ci0KLQlzdHJ1Y3QgbXV0ZXggZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXg7Ci0KIAl1NjQgZ2VuZXJhdGlvbjsKIAl1NjQgbGFzdF90cmFuc19jb21taXR0ZWQ7CiAKQEAgLTk0Miw4ICs5ODAsOCBAQAogCXdhaXRfcXVldWVfaGVhZF90IHRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBhc3luY19zdWJtaXRfd2FpdDsKIAotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayBzdXBlcl9jb3B5OwotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayBzdXBlcl9mb3JfY29tbWl0OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2Zvcl9jb21taXQ7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqX19iZGV2OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IGlub2RlICpidHJlZV9pbm9kZTsKQEAgLTEwMzYsNiArMTA3NCw3IEBACiAJc3RydWN0IGJ0cmZzX3dvcmtlcnMgZW5kaW9fZnJlZXNwYWNlX3dvcmtlcjsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyBzdWJtaXRfd29ya2VyczsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyBjYWNoaW5nX3dvcmtlcnM7CisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgcmVhZGFoZWFkX3dvcmtlcnM7CiAKIAkvKgogCSAqIGZpeHVwIHdvcmtlcnMgdGFrZSBkaXJ0eSBwYWdlcyB0aGF0IGRpZG4ndCBwcm9wZXJseSBnbyB0aHJvdWdoCkBAIC0xMTE5LDYgKzExNTgsMTMgQEAKIAl1NjQgZnNfc3RhdGU7CiAKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yb290ICpkZWxheWVkX3Jvb3Q7CisKKwkvKiByZWFkYWhlYWQgdHJlZSAqLworCXNwaW5sb2NrX3QgcmVhZGFfbG9jazsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJlYWRhX3RyZWU7CisKKwkvKiBuZXh0IGJhY2t1cCByb290IHRvIGJlIG92ZXJ3cml0dGVuICovCisJaW50IGJhY2t1cF9yb290X2luZGV4OwogfTsKIAogLyoKQEAgLTEzNjMsNiArMTQwOSw3IEBACiAjZGVmaW5lIEJUUkZTX01PVU5UX0VOT1NQQ19ERUJVRwkgKDEgPDwgMTUpCiAjZGVmaW5lIEJUUkZTX01PVU5UX0FVVE9fREVGUkFHCQkoMSA8PCAxNikKICNkZWZpbmUgQlRSRlNfTU9VTlRfSU5PREVfTUFQX0NBQ0hFCSgxIDw8IDE3KQorI2RlZmluZSBCVFJGU19NT1VOVF9SRUNPVkVSWQkJKDEgPDwgMTgpCiAKICNkZWZpbmUgYnRyZnNfY2xlYXJfb3B0KG8sIG9wdCkJCSgobykgJj0gfkJUUkZTX01PVU5UXyMjb3B0KQogI2RlZmluZSBidHJmc19zZXRfb3B0KG8sIG9wdCkJCSgobykgfD0gQlRSRlNfTU9VTlRfIyNvcHQpCkBAIC0xOTc4LDYgKzIwMjUsNTUgQEAKIAlyZXR1cm4gcm9vdC0+cm9vdF9pdGVtLmZsYWdzICYgQlRSRlNfUk9PVF9TVUJWT0xfUkRPTkxZOwogfQogCisvKiBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKi8KK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfdHJlZV9yb290LCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF90cmVlX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdF9nZW4sIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfdHJlZV9yb290X2xldmVsLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRyZWVfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY2h1bmtfcm9vdCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBjaHVua19yb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2NodW5rX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNodW5rX3Jvb3RfZ2VuLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2NodW5rX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgY2h1bmtfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZXh0ZW50X3Jvb3QsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZXh0ZW50X3Jvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZXh0ZW50X3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGV4dGVudF9yb290X2dlbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9leHRlbnRfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBleHRlbnRfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZnNfcm9vdCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBmc19yb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2ZzX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGZzX3Jvb3RfZ2VuLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2ZzX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZnNfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZGV2X3Jvb3QsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgZGV2X3Jvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfZGV2X3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGRldl9yb290X2dlbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9kZXZfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBkZXZfcm9vdF9sZXZlbCwgOCk7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY3N1bV9yb290LCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9jc3VtX3Jvb3RfZ2VuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdF9nZW4sIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhiYWNrdXBfY3N1bV9yb290X2xldmVsLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIGNzdW1fcm9vdF9sZXZlbCwgOCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX3RvdGFsX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAsCisJCSAgIHRvdGFsX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmFja3VwX2J5dGVzX3VzZWQsIHN0cnVjdCBidHJmc19yb290X2JhY2t1cCwKKwkJICAgYnl0ZXNfdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJhY2t1cF9udW1fZGV2aWNlcywgc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwLAorCQkgICBudW1fZGV2aWNlcywgNjQpOworCiAvKiBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKi8KIAogQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2J5dGVuciwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBieXRlbnIsIDY0KTsKQEAgLTIxMjksNiArMjIyNSwxMSBAQAogCQkoc3BhY2VfaW5mby0+ZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZ2ZwX3QgYnRyZnNfYWxsb2Nfd3JpdGVfbWFzayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKK3sKKwlyZXR1cm4gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUzsKK30KKwogLyogZXh0ZW50LXRyZWUuYyAqLwogc3RhdGljIGlubGluZSB1NjQgYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkJIHVuc2lnbmVkIG51bV9pdGVtcykKQEAgLTIxMzcsNiArMjIzOCwxNyBAQAogCQkzICogbnVtX2l0ZW1zOwogfQogCisvKgorICogRG9pbmcgYSB0cnVuY2F0ZSB3b24ndCByZXN1bHQgaW4gbmV3IG5vZGVzIG9yIGxlYXZlcywganVzdCB3aGF0IHdlIG5lZWQgZm9yCisgKiBDT1cuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGJ0cmZzX2NhbGNfdHJ1bmNfbWV0YWRhdGFfc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJCSB1bnNpZ25lZCBudW1faXRlbXMpCit7CisJcmV0dXJuIChyb290LT5sZWFmc2l6ZSArIHJvb3QtPm5vZGVzaXplICogKEJUUkZTX01BWF9MRVZFTCAtIDEpKSAqCisJCW51bV9pdGVtczsKK30KKwogdm9pZCBidHJmc19wdXRfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSk7CiBpbnQgYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKQEAgLTIxNDYsNiArMjI1OCw5IEBACiAJCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCAqcmVmcywgdTY0ICpmbGFncyk7CiBpbnQgYnRyZnNfcGluX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJICAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtLCBpbnQgcmVzZXJ2ZWQpOworaW50IGJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzKTsKIGludCBidHJmc19jcm9zc19yZWZfZXhpc3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICB1NjQgb2JqZWN0aWQsIHU2NCBvZmZzZXQsIHU2NCBieXRlbnIpOwpAQCAtMjE5Niw4ICsyMzExLDggQEAKIAkJICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCBvd25lciwgdTY0IG9mZnNldCk7CiAKIGludCBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKLWludCBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKLQkJCQl1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSwgaW50IHNpbmZvKTsKK2ludCBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pOwogaW50IGJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiBpbnQgYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0yMjQwLDI1ICsyMzU1LDIzIEBACiBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpidHJmc19hbGxvY19ibG9ja19yc3Yoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogdm9pZCBidHJmc19mcmVlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KTsKLXZvaWQgYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAotCQkJCSBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3YpOwotaW50IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKK2ludCBidHJmc19ibG9ja19yc3ZfYWRkKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAogCQkJdTY0IG51bV9ieXRlcyk7Ci1pbnQgYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKK2ludCBidHJmc19ibG9ja19yc3ZfYWRkX25vZmx1c2goc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAorCQkJCXU2NCBudW1fYnl0ZXMpOworaW50IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LCBpbnQgbWluX2ZhY3Rvcik7CitpbnQgYnRyZnNfYmxvY2tfcnN2X3JlZmlsbChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAotCQkJICB1NjQgbWluX3Jlc2VydmVkLCBpbnQgbWluX2ZhY3Rvcik7CisJCQkgIHU2NCBtaW5fcmVzZXJ2ZWQpOwogaW50IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnNyY19yc3YsCiAJCQkgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqZHN0X3JzdiwKIAkJCSAgICB1NjQgbnVtX2J5dGVzKTsKIHZvaWQgYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkgICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKIAkJCSAgICAgdTY0IG51bV9ieXRlcyk7Ci1pbnQgYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdik7CiBpbnQgYnRyZnNfc2V0X2Jsb2NrX2dyb3VwX3JvKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlKTsKIGludCBidHJmc19zZXRfYmxvY2tfZ3JvdXBfcncoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCkBAIC0yMzc5LDYgKzI0OTIsMTggQEAKIAlzbXBfbWIoKTsKIAlyZXR1cm4gZnNfaW5mby0+Y2xvc2luZzsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZzX2luZm8oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJa2ZyZWUoZnNfaW5mby0+ZGVsYXllZF9yb290KTsKKwlrZnJlZShmc19pbmZvLT5leHRlbnRfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+dHJlZV9yb290KTsKKwlrZnJlZShmc19pbmZvLT5jaHVua19yb290KTsKKwlrZnJlZShmc19pbmZvLT5kZXZfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+Y3N1bV9yb290KTsKKwlrZnJlZShmc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlrZnJlZShmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0KTsKKwlrZnJlZShmc19pbmZvKTsKK30KIAogLyogcm9vdC1pdGVtLmMgKi8KIGludCBidHJmc19maW5kX3Jvb3RfcmVmKHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QsCkBAIC0yNTc5LDExICsyNzA0LDYgQEAKIGludCBidHJmc19vcnBoYW5fYWRkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19vcnBoYW5fZGVsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBidHJmc19vcnBoYW5fY2xlYW51cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7Ci12b2lkIGJ0cmZzX29ycGhhbl9wcmVfc25hcHNob3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmcsCi0JCQkJdTY0ICpieXRlc190b19yZXNlcnZlKTsKLXZvaWQgYnRyZnNfb3JwaGFuX3Bvc3Rfc25hcHNob3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmcpOwogdm9pZCBidHJmc19vcnBoYW5fY29tbWl0X3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CiBpbnQgYnRyZnNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9sZHNpemUsIGxvZmZfdCBzaXplKTsKQEAgLTI2OTcsNCArMjgxNywyMCBAQAogaW50IGJ0cmZzX3NjcnViX3Byb2dyZXNzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZGV2aWQsCiAJCQkgc3RydWN0IGJ0cmZzX3NjcnViX3Byb2dyZXNzICpwcm9ncmVzcyk7CiAKKy8qIHJlYWRhLmMgKi8KK3N0cnVjdCByZWFkYV9jb250cm9sIHsKKwlzdHJ1Y3QgYnRyZnNfcm9vdAkqcm9vdDsJCS8qIHRyZWUgdG8gcHJlZmV0Y2ggKi8KKwlzdHJ1Y3QgYnRyZnNfa2V5CWtleV9zdGFydDsKKwlzdHJ1Y3QgYnRyZnNfa2V5CWtleV9lbmQ7CS8qIGV4Y2x1c2l2ZSAqLworCWF0b21pY190CQllbGVtczsKKwlzdHJ1Y3Qga3JlZgkJcmVmY250OworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Cit9Oworc3RydWN0IHJlYWRhX2NvbnRyb2wgKmJ0cmZzX3JlYWRhX2FkZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKnN0YXJ0LCBzdHJ1Y3QgYnRyZnNfa2V5ICplbmQpOworaW50IGJ0cmZzX3JlYWRhX3dhaXQodm9pZCAqaGFuZGxlKTsKK3ZvaWQgYnRyZnNfcmVhZGFfZGV0YWNoKHZvaWQgKmhhbmRsZSk7CitpbnQgYnRyZWVfcmVhZGFoZWFkX2hvb2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSB1NjQgc3RhcnQsIGludCBlcnIpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYwppbmRleCBiNTJjNjcyLi41YjE2MzU3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCkBAIC01OTEsNyArNTkxLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlzcmNfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQlkc3RfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJZHN0X3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCW51bV9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKIAlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZShzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwpAQCAtNjA5LDcgKzYwOSw3IEBACiAJaWYgKCFpdGVtLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfYmxvY2tfcnN2OwogCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHJzdiwKIAkJCQlpdGVtLT5ieXRlc19yZXNlcnZlZCk7CiB9CkBAIC02MTcsMjQgKzYxNywxMDIgQEAKIHN0YXRpYyBpbnQgYnRyZnNfZGVsYXllZF9pbm9kZV9yZXNlcnZlX21ldGFkYXRhKAogCQkJCQlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqc3JjX3JzdjsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpkc3RfcnN2OwogCXU2NCBudW1fYnl0ZXM7CiAJaW50IHJldDsKLQotCWlmICghdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKQotCQlyZXR1cm4gMDsKKwlpbnQgcmVsZWFzZSA9IGZhbHNlOwogCiAJc3JjX3JzdiA9IHRyYW5zLT5ibG9ja19yc3Y7Ci0JZHN0X3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCWRzdF9yc3YgPSAmcm9vdC0+ZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3Y7CiAKIAludW1fYnl0ZXMgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgMSk7CisKKwkvKgorCSAqIGJ0cmZzX2RpcnR5X2lub2RlIHdpbGwgdXBkYXRlIHRoZSBpbm9kZSB1bmRlciBidHJmc19qb2luX3RyYW5zYWN0aW9uCisJICogd2hpY2ggZG9lc24ndCByZXNlcnZlIHNwYWNlIGZvciBzcGVlZC4gIFRoaXMgaXMgYSBwcm9ibGVtIHNpbmNlIHdlCisJICogc3RpbGwgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciB0aGlzIHVwZGF0ZSwgc28gdHJ5IHRvIHJlc2VydmUgdGhlCisJICogc3BhY2UuCisJICoKKwkgKiBOb3cgaWYgc3JjX3JzdiA9PSBkZWxhbGxvY19ibG9ja19yc3Ygd2UnbGwgbGV0IGl0IGp1c3Qgc3RlYWwgc2luY2UKKwkgKiB3ZSdyZSBhY2NvdW50ZWQgZm9yLgorCSAqLworCWlmICghdHJhbnMtPmJ5dGVzX3Jlc2VydmVkICYmCisJICAgIHNyY19yc3YgIT0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdikgeworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkX25vZmx1c2gocm9vdCwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKwkJLyoKKwkJICogU2luY2Ugd2UncmUgdW5kZXIgYSB0cmFuc2FjdGlvbiByZXNlcnZlX21ldGFkYXRhX2J5dGVzIGNvdWxkCisJCSAqIHRyeSB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHdoaWNoIHdpbGwgbWFrZSBpdCByZXR1cm4KKwkJICogRUFHQUlOIHRvIG1ha2UgdXMgc3RvcCB0aGUgdHJhbnNhY3Rpb24gd2UgaGF2ZSwgc28gcmV0dXJuCisJCSAqIEVOT1NQQyBpbnN0ZWFkIHNvIHRoYXQgYnRyZnNfZGlydHlfaW5vZGUga25vd3Mgd2hhdCB0byBkby4KKwkJICovCisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldCA9IC1FTk9TUEM7CisJCWlmICghcmV0KQorCQkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChzcmNfcnN2ID09ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3YpIHsKKwkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisJCWlmIChCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCkgeworCQkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOworCQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKKwkJCXJlbGVhc2UgPSB0cnVlOworCQkJZ290byBtaWdyYXRlOworCQl9CisJCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisKKwkJLyogT2sgd2UgZGlkbid0IGhhdmUgc3BhY2UgcHJlLXJlc2VydmVkLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCSAqIHRvbyBvZnRlbiBidXQgaXQgY2FuIGhhcHBlbiBpZiB3ZSBkbyBkZWxhbGxvYyB0byBhbiBleGlzdGluZworCQkgKiBpbm9kZSB3aGljaCBnZXRzIGRpcnRpZWQgYmVjYXVzZSBvZiB0aGUgdGltZSB1cGRhdGUsIGFuZCB0aGVuCisJCSAqIGlzbid0IHRvdWNoZWQgYWdhaW4gdW50aWwgYWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMgYW5kCisJCSAqIHRoZW4gd2UgdHJ5IHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIEZpcnN0IHRyeSB0byBiZSBuaWNlIGFuZAorCQkgKiByZXNlcnZlIHNvbWV0aGluZyBzdHJpY3RseSBmb3IgdXMuICBJZiBub3QgYmUgYSBwYWluIGFuZCB0cnkKKwkJICogdG8gc3RlYWwgZnJvbSB0aGUgZGVsYWxsb2MgYmxvY2sgcnN2LgorCQkgKi8KKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHJvb3QsIGRzdF9yc3YsIG51bV9ieXRlcyk7CisJCWlmICghcmV0KQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X21pZ3JhdGUoc3JjX3JzdiwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKwkJaWYgKCFyZXQpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBPayB0aGlzIGlzIGEgcHJvYmxlbSwgbGV0J3MganVzdCBzdGVhbCBmcm9tIHRoZSBnbG9iYWwgcnN2CisJCSAqIHNpbmNlIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4gdGhhdCBvZnRlbi4KKwkJICovCisJCVdBUk5fT04oMSk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKCZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LAorCQkJCQkgICAgICBkc3RfcnN2LCBudW1fYnl0ZXMpOworCQlnb3RvIG91dDsKKwl9CisKK21pZ3JhdGU6CiAJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X21pZ3JhdGUoc3JjX3JzdiwgZHN0X3JzdiwgbnVtX2J5dGVzKTsKKworb3V0OgorCS8qCisJICogTWlncmF0ZSBvbmx5IHRha2VzIGEgcmVzZXJ2YXRpb24sIGl0IGRvZXNuJ3QgdG91Y2ggdGhlIHNpemUgb2YgdGhlCisJICogYmxvY2tfcnN2LiAgVGhpcyBpcyB0byBzaW1wbGlmeSBwZW9wbGUgd2hvIGRvbid0IG5vcm1hbGx5IGhhdmUgdGhpbmdzCisJICogbWlncmF0ZWQgZnJvbSB0aGVpciBibG9jayByc3YuICBJZiB0aGV5IGdvIHRvIHJlbGVhc2UgdGhlaXIKKwkgKiByZXNlcnZhdGlvbiwgdGhhdCB3aWxsIGRlY3JlYXNlIHRoZSBzaXplIGFzIHdlbGwsIHNvIGlmIG1pZ3JhdGUKKwkgKiByZWR1Y2VkIHNpemUgd2UnZCBlbmQgdXAgd2l0aCBhIG5lZ2F0aXZlIHNpemUuICBCdXQgZm9yIHRoZQorCSAqIGRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgc3R1ZmYgd2Ugd2lsbCBvbmx5IGtub3cgdG8gZHJvcCAxIHJlc2VydmF0aW9uLAorCSAqIGJ1dCB3ZSBjb3VsZCBpbiBmYWN0IGRvIHRoaXMgcmVzZXJ2ZS9taWdyYXRlIGRhbmNlIHNldmVyYWwgdGltZXMKKwkgKiBiZXR3ZWVuIHRoZSB0aW1lIHdlIGRpZCB0aGUgb3JpZ2luYWwgcmVzZXJ2YXRpb24gYW5kIHdlJ2QgY2xlYW4gaXQKKwkgKiB1cC4gIFNvIHRvIHRha2UgY2FyZSBvZiB0aGlzLCByZWxlYXNlIHRoZSBzcGFjZSBmb3IgdGhlIG1ldGEKKwkgKiByZXNlcnZhdGlvbiBoZXJlLiAgSSB0aGluayBpdCBtYXkgYmUgdGltZSBmb3IgYSBkb2N1bWVudGF0aW9uIHBhZ2Ugb24KKwkgKiBob3cgYmxvY2sgcnN2cy4gd29yay4KKwkgKi8KIAlpZiAoIXJldCkKIAkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQgPSBudW1fYnl0ZXM7CiAKKwlpZiAocmVsZWFzZSkKKwkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgc3JjX3JzdiwgbnVtX2J5dGVzKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0Niw3ICs3MjQsNyBAQAogCWlmICghbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQpCiAJCXJldHVybjsKIAotCXJzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCXJzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByc3YsCiAJCQkJbm9kZS0+Ynl0ZXNfcmVzZXJ2ZWQpOwogCW5vZGUtPmJ5dGVzX3Jlc2VydmVkID0gMDsKQEAgLTEwMjYsNyArMTEwNCw3IEBACiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCWRlbGF5ZWRfcm9vdCA9IGJ0cmZzX2dldF9kZWxheWVkX3Jvb3Qocm9vdCk7CiAKQEAgLTEwNjksNyArMTE0Nyw3IEBACiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJm5vZGUtPnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZub2RlLT5yb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCBub2RlLT5yb290LCBub2RlKTsKIAlpZiAoIXJldCkKQEAgLTExNDksNyArMTIyNyw3IEBACiAJCWdvdG8gZnJlZV9wYXRoOwogCiAJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5kZWxheWVkX2Jsb2NrX3JzdjsKIAogCXJldCA9IGJ0cmZzX2luc2VydF9kZWxheWVkX2l0ZW1zKHRyYW5zLCBwYXRoLCByb290LCBkZWxheWVkX25vZGUpOwogCWlmICghcmV0KQpAQCAtMTY0MSw3ICsxNzE5LDcgQEAKIAlpbm9kZS0+aV9naWQgPSBidHJmc19zdGFja19pbm9kZV9naWQoaW5vZGVfaXRlbSk7CiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBidHJmc19zdGFja19pbm9kZV9zaXplKGlub2RlX2l0ZW0pKTsKIAlpbm9kZS0+aV9tb2RlID0gYnRyZnNfc3RhY2tfaW5vZGVfbW9kZShpbm9kZV9pdGVtKTsKLQlpbm9kZS0+aV9ubGluayA9IGJ0cmZzX3N0YWNrX2lub2RlX25saW5rKGlub2RlX2l0ZW0pOworCXNldF9ubGluayhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmxpbmsoaW5vZGVfaXRlbSkpOwogCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgYnRyZnNfc3RhY2tfaW5vZGVfbmJ5dGVzKGlub2RlX2l0ZW0pKTsKIAlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IGJ0cmZzX3N0YWNrX2lub2RlX2dlbmVyYXRpb24oaW5vZGVfaXRlbSk7CiAJQlRSRlNfSShpbm9kZSktPnNlcXVlbmNlID0gYnRyZnNfc3RhY2tfaW5vZGVfc2VxdWVuY2UoaW5vZGVfaXRlbSk7CkBAIC0xNjg1LDEyICsxNzYzLDEwIEBACiAJCWdvdG8gcmVsZWFzZV9ub2RlOwogCX0KIAotCXJldCA9IGJ0cmZzX2RlbGF5ZWRfaW5vZGVfcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgcm9vdCwgZGVsYXllZF9ub2RlKTsKLQkvKgotCSAqIHdlIG11c3QgcmVzZXJ2ZSBlbm91Z2ggc3BhY2Ugd2hlbiB3ZSBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbiwKLQkgKiBzbyByZXNlcnZpbmcgbWV0YWRhdGEgZmFpbHVyZSBpcyBpbXBvc3NpYmxlCi0JICovCi0JQlVHX09OKHJldCk7CisJcmV0ID0gYnRyZnNfZGVsYXllZF9pbm9kZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCQkJCSAgIGRlbGF5ZWRfbm9kZSk7CisJaWYgKHJldCkKKwkJZ290byByZWxlYXNlX25vZGU7CiAKIAlmaWxsX3N0YWNrX2lub2RlX2l0ZW0odHJhbnMsICZkZWxheWVkX25vZGUtPmlub2RlX2l0ZW0sIGlub2RlKTsKIAlkZWxheWVkX25vZGUtPmlub2RlX2RpcnR5ID0gMTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCAwN2IzYWM2Li42MmFmZTVjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXNrLWlvLmMKKysrIGIvZnMvYnRyZnMvZGlzay1pby5jCkBAIC0yNTYsOCArMjU2LDcgQEAKIHN0YXRpYyBpbnQgY3N1bV90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLAogCQkJICAgaW50IHZlcmlmeSkKIHsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWNoYXIgKnJlc3VsdCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsZW47CiAJdW5zaWduZWQgbG9uZyBjdXJfbGVuOwpAQCAtMzY3LDcgKzM2Niw4IEBACiAJY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfQ09SUlVQVCwgJmViLT5iZmxhZ3MpOwogCWlvX3RyZWUgPSAmQlRSRlNfSShyb290LT5mc19pbmZvLT5idHJlZV9pbm9kZSktPmlvX3RyZWU7CiAJd2hpbGUgKDEpIHsKLQkJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGViLCBzdGFydCwgMSwKKwkJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGViLCBzdGFydCwKKwkJCQkJICAgICAgIFdBSVRfQ09NUExFVEUsCiAJCQkJCSAgICAgICBidHJlZV9nZXRfZXh0ZW50LCBtaXJyb3JfbnVtKTsKIAkJaWYgKCFyZXQgJiYKIAkJICAgICF2ZXJpZnlfcGFyZW50X3RyYW5zaWQoaW9fdHJlZSwgZWIsIHBhcmVudF90cmFuc2lkKSkKQEAgLTYwOCwxMSArNjA4LDQ4IEBACiAJZW5kID0gbWluX3QodTY0LCBlYi0+bGVuLCBQQUdFX0NBQ0hFX1NJWkUpOwogCWVuZCA9IGViLT5zdGFydCArIGVuZCAtIDE7CiBlcnI6CisJaWYgKHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmZWItPmJmbGFncykpIHsKKwkJY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmZWItPmJmbGFncyk7CisJCWJ0cmVlX3JlYWRhaGVhZF9ob29rKHJvb3QsIGViLCBlYi0+c3RhcnQsIHJldCk7CisJfQorCiAJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGJ0cmVlX2lvX2ZhaWxlZF9ob29rKHN0cnVjdCBiaW8gKmZhaWxlZF9iaW8sCisJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSB1NjQgbWlycm9yX251bSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPnJvb3Q7CisKKwl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJaWYgKHBhZ2UtPnByaXZhdGUgPT0gRVhURU5UX1BBR0VfUFJJVkFURSkKKwkJZ290byBvdXQ7CisJaWYgKCFwYWdlLT5wcml2YXRlKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHBhZ2UtPnByaXZhdGUgPj4gMjsKKwlXQVJOX09OKGxlbiA9PSAwKTsKKworCWViID0gYWxsb2NfZXh0ZW50X2J1ZmZlcih0cmVlLCBzdGFydCwgbGVuLCBwYWdlKTsKKwlpZiAoZWIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoRVhURU5UX0JVRkZFUl9SRUFEQUhFQUQsICZlYi0+YmZsYWdzKSkgeworCQljbGVhcl9iaXQoRVhURU5UX0JVRkZFUl9SRUFEQUhFQUQsICZlYi0+YmZsYWdzKTsKKwkJYnRyZWVfcmVhZGFoZWFkX2hvb2socm9vdCwgZWIsIGViLT5zdGFydCwgLUVJTyk7CisJfQorCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisKK291dDoKKwlyZXR1cm4gLUVJTzsJLyogd2UgZml4ZWQgbm90aGluZyAqLworfQorCiBzdGF0aWMgdm9pZCBlbmRfd29ya3F1ZXVlX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJc3RydWN0IGVuZF9pb193cSAqZW5kX2lvX3dxID0gYmlvLT5iaV9wcml2YXRlOwpAQCAtOTA4LDcgKzk0NSw3IEBACiB7CiAJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOwogCXRyZWUgPSAmQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKLQlyZXR1cm4gZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHRyZWUsIHBhZ2UsIGJ0cmVlX2dldF9leHRlbnQpOworCXJldHVybiBleHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZWVfZ2V0X2V4dGVudCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgYnRyZWVfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IGdmcF9mbGFncykKQEAgLTk3NCwxMSArMTAxMSw0MyBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gMDsKIAlyZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAotCQkJCSBidWYsIDAsIDAsIGJ0cmVlX2dldF9leHRlbnQsIDApOworCQkJCSBidWYsIDAsIFdBSVRfTk9ORSwgYnRyZWVfZ2V0X2V4dGVudCwgMCk7CiAJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJlYWRhX3RyZWVfYmxvY2tfZmxhZ2dlZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSwKKwkJCSBpbnQgbWlycm9yX251bSwgc3RydWN0IGV4dGVudF9idWZmZXIgKiplYikKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlOworCWludCByZXQ7CisKKwlidWYgPSBidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlzZXRfYml0KEVYVEVOVF9CVUZGRVJfUkVBREFIRUFELCAmYnVmLT5iZmxhZ3MpOworCisJcmV0ID0gcmVhZF9leHRlbnRfYnVmZmVyX3BhZ2VzKGlvX3RyZWUsIGJ1ZiwgMCwgV0FJVF9QQUdFX0xPQ0ssCisJCQkJICAgICAgIGJ0cmVlX2dldF9leHRlbnQsIG1pcnJvcl9udW0pOworCWlmIChyZXQpIHsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHRlc3RfYml0KEVYVEVOVF9CVUZGRVJfQ09SUlVQVCwgJmJ1Zi0+YmZsYWdzKSkgeworCQlmcmVlX2V4dGVudF9idWZmZXIoYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIGlmIChleHRlbnRfYnVmZmVyX3VwdG9kYXRlKGlvX3RyZWUsIGJ1ZiwgTlVMTCkpIHsKKwkJKmViID0gYnVmOworCX0gZWxzZSB7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2ZpbmRfdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJICAgIHU2NCBieXRlbnIsIHUzMiBibG9ja3NpemUpCiB7CkBAIC0xMTM1LDEwICsxMjA0LDEyIEBACiAKIAlnZW5lcmF0aW9uID0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0pOwogCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgYnRyZnNfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtKSk7CisJcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOwogCXJvb3QtPm5vZGUgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYnRyZnNfcm9vdF9ieXRlbnIoJnJvb3QtPnJvb3RfaXRlbSksCiAJCQkJICAgICBibG9ja3NpemUsIGdlbmVyYXRpb24pOwogCWlmICghcm9vdC0+bm9kZSB8fCAhYnRyZnNfYnVmZmVyX3VwdG9kYXRlKHJvb3QtPm5vZGUsIGdlbmVyYXRpb24pKSB7CiAJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5ub2RlKTsKKwkJcm9vdC0+bm9kZSA9IE5VTEw7CiAJCXJldHVybiAtRUlPOwogCX0KIAlyb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKQEAgLTE1NzcsNiArMTY0OCwyMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIHRoaXMgd2lsbCBmaW5kIHRoZSBoaWdoZXN0IGdlbmVyYXRpb24gaW4gdGhlIGFycmF5IG9mCisgKiByb290IGJhY2t1cHMuICBUaGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgYXJyYXkgaXMgcmV0dXJuZWQsCisgKiBvciAtMSBpZiB3ZSBjYW4ndCBmaW5kIGFueXRoaW5nLgorICoKKyAqIFdlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgdmFsaWQgYnkgY29tcGFyaW5nIHRoZQorICogZ2VuZXJhdGlvbiBvZiB0aGUgbGF0ZXN0ICByb290IGluIHRoZSBhcnJheSB3aXRoIHRoZSBnZW5lcmF0aW9uCisgKiBpbiB0aGUgc3VwZXIgYmxvY2suICBJZiB0aGV5IGRvbid0IG1hdGNoIHdlIHBpdGNoIGl0LgorICovCitzdGF0aWMgaW50IGZpbmRfbmV3ZXN0X3N1cGVyX2JhY2t1cChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgdTY0IG5ld2VzdF9nZW4pCit7CisJdTY0IGN1cjsKKwlpbnQgbmV3ZXN0X2luZGV4ID0gLTE7CisJc3RydWN0IGJ0cmZzX3Jvb3RfYmFja3VwICpyb290X2JhY2t1cDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVFJGU19OVU1fQkFDS1VQX1JPT1RTOyBpKyspIHsKKwkJcm9vdF9iYWNrdXAgPSBpbmZvLT5zdXBlcl9jb3B5LT5zdXBlcl9yb290cyArIGk7CisJCWN1ciA9IGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKTsKKwkJaWYgKGN1ciA9PSBuZXdlc3RfZ2VuKQorCQkJbmV3ZXN0X2luZGV4ID0gaTsKKwl9CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgYWN0dWFsbHkgd3JhcHBlZCBhcm91bmQgKi8KKwlpZiAobmV3ZXN0X2luZGV4ID09IEJUUkZTX05VTV9CQUNLVVBfUk9PVFMgLSAxKSB7CisJCXJvb3RfYmFja3VwID0gaW5mby0+c3VwZXJfY29weS0+c3VwZXJfcm9vdHM7CisJCWN1ciA9IGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKTsKKwkJaWYgKGN1ciA9PSBuZXdlc3RfZ2VuKQorCQkJbmV3ZXN0X2luZGV4ID0gMDsKKwl9CisJcmV0dXJuIG5ld2VzdF9pbmRleDsKK30KKworCisvKgorICogZmluZCB0aGUgb2xkZXN0IGJhY2t1cCBzbyB3ZSBrbm93IHdoZXJlIHRvIHN0b3JlIG5ldyBlbnRyaWVzCisgKiBpbiB0aGUgYmFja3VwIGFycmF5LiAgVGhpcyB3aWxsIHNldCB0aGUgYmFja3VwX3Jvb3RfaW5kZXgKKyAqIGZpZWxkIGluIHRoZSBmc19pbmZvIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBmaW5kX29sZGVzdF9zdXBlcl9iYWNrdXAoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sCisJCQkJICAgICB1NjQgbmV3ZXN0X2dlbikKK3sKKwlpbnQgbmV3ZXN0X2luZGV4ID0gLTE7CisKKwluZXdlc3RfaW5kZXggPSBmaW5kX25ld2VzdF9zdXBlcl9iYWNrdXAoaW5mbywgbmV3ZXN0X2dlbik7CisJLyogaWYgdGhlcmUgd2FzIGdhcmJhZ2UgaW4gdGhlcmUsIGp1c3QgbW92ZSBhbG9uZyAqLworCWlmIChuZXdlc3RfaW5kZXggPT0gLTEpIHsKKwkJaW5mby0+YmFja3VwX3Jvb3RfaW5kZXggPSAwOworCX0gZWxzZSB7CisJCWluZm8tPmJhY2t1cF9yb290X2luZGV4ID0gKG5ld2VzdF9pbmRleCArIDEpICUgQlRSRlNfTlVNX0JBQ0tVUF9ST09UUzsKKwl9Cit9CisKKy8qCisgKiBjb3B5IGFsbCB0aGUgcm9vdCBwb2ludGVycyBpbnRvIHRoZSBzdXBlciBiYWNrdXAgYXJyYXkuCisgKiB0aGlzIHdpbGwgYnVtcCB0aGUgYmFja3VwIHBvaW50ZXIgYnkgb25lIHdoZW4gaXQgaXMKKyAqIGRvbmUKKyAqLworc3RhdGljIHZvaWQgYmFja3VwX3N1cGVyX3Jvb3RzKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKQoreworCWludCBuZXh0X2JhY2t1cDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKnJvb3RfYmFja3VwOworCWludCBsYXN0X2JhY2t1cDsKKworCW5leHRfYmFja3VwID0gaW5mby0+YmFja3VwX3Jvb3RfaW5kZXg7CisJbGFzdF9iYWNrdXAgPSAobmV4dF9iYWNrdXAgKyBCVFJGU19OVU1fQkFDS1VQX1JPT1RTIC0gMSkgJQorCQlCVFJGU19OVU1fQkFDS1VQX1JPT1RTOworCisJLyoKKwkgKiBqdXN0IG92ZXJ3cml0ZSB0aGUgbGFzdCBiYWNrdXAgaWYgd2UncmUgYXQgdGhlIHNhbWUgZ2VuZXJhdGlvbgorCSAqIHRoaXMgaGFwcGVucyBvbmx5IGF0IHVtb3VudAorCSAqLworCXJvb3RfYmFja3VwID0gaW5mby0+c3VwZXJfZm9yX2NvbW1pdC0+c3VwZXJfcm9vdHMgKyBsYXN0X2JhY2t1cDsKKwlpZiAoYnRyZnNfYmFja3VwX3RyZWVfcm9vdF9nZW4ocm9vdF9iYWNrdXApID09CisJICAgIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGluZm8tPnRyZWVfcm9vdC0+bm9kZSkpCisJCW5leHRfYmFja3VwID0gbGFzdF9iYWNrdXA7CisKKwlyb290X2JhY2t1cCA9IGluZm8tPnN1cGVyX2Zvcl9jb21taXQtPnN1cGVyX3Jvb3RzICsgbmV4dF9iYWNrdXA7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSBhbGwgb2Ygb3VyIHBhZGRpbmcgYW5kIGVtcHR5IHNsb3RzIGdldCB6ZXJvIGZpbGxlZAorCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lcyB3ZSB1c2UgdG9kYXkKKwkgKi8KKwltZW1zZXQocm9vdF9iYWNrdXAsIDAsIHNpemVvZigqcm9vdF9iYWNrdXApKTsKKworCWluZm8tPmJhY2t1cF9yb290X2luZGV4ID0gKG5leHRfYmFja3VwICsgMSkgJSBCVFJGU19OVU1fQkFDS1VQX1JPT1RTOworCisJYnRyZnNfc2V0X2JhY2t1cF90cmVlX3Jvb3Qocm9vdF9iYWNrdXAsIGluZm8tPnRyZWVfcm9vdC0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9iYWNrdXBfdHJlZV9yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT50cmVlX3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfdHJlZV9yb290X2xldmVsKHJvb3RfYmFja3VwLAorCQkJICAgICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChpbmZvLT50cmVlX3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdChyb290X2JhY2t1cCwgaW5mby0+Y2h1bmtfcm9vdC0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSkpOworCWJ0cmZzX3NldF9iYWNrdXBfY2h1bmtfcm9vdF9sZXZlbChyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSkpOworCisJYnRyZnNfc2V0X2JhY2t1cF9leHRlbnRfcm9vdChyb290X2JhY2t1cCwgaW5mby0+ZXh0ZW50X3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwlidHJmc19zZXRfYmFja3VwX2V4dGVudF9yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT5leHRlbnRfcm9vdC0+bm9kZSkpOworCWJ0cmZzX3NldF9iYWNrdXBfZXh0ZW50X3Jvb3RfbGV2ZWwocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2xldmVsKGluZm8tPmV4dGVudF9yb290LT5ub2RlKSk7CisKKwkvKgorCSAqIHdlIG1pZ2h0IGNvbW1pdCBkdXJpbmcgbG9nIHJlY292ZXJ5LCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBzZXQKKwkgKiB0aGUgZnNfcm9vdC4gIE1ha2Ugc3VyZSBpdCBpcyB2YWxpZCBiZWZvcmUgd2UgZmlsbCBpdCBpbi4KKwkgKi8KKwlpZiAoaW5mby0+ZnNfcm9vdCAmJiBpbmZvLT5mc19yb290LT5ub2RlKSB7CisJCWJ0cmZzX3NldF9iYWNrdXBfZnNfcm9vdChyb290X2JhY2t1cCwKKwkJCQkJIGluZm8tPmZzX3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwkJYnRyZnNfc2V0X2JhY2t1cF9mc19yb290X2dlbihyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihpbmZvLT5mc19yb290LT5ub2RlKSk7CisJCWJ0cmZzX3NldF9iYWNrdXBfZnNfcm9vdF9sZXZlbChyb290X2JhY2t1cCwKKwkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+ZnNfcm9vdC0+bm9kZSkpOworCX0KKworCWJ0cmZzX3NldF9iYWNrdXBfZGV2X3Jvb3Qocm9vdF9iYWNrdXAsIGluZm8tPmRldl9yb290LT5ub2RlLT5zdGFydCk7CisJYnRyZnNfc2V0X2JhY2t1cF9kZXZfcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+ZGV2X3Jvb3QtPm5vZGUpKTsKKwlidHJmc19zZXRfYmFja3VwX2Rldl9yb290X2xldmVsKHJvb3RfYmFja3VwLAorCQkJCSAgICAgICBidHJmc19oZWFkZXJfbGV2ZWwoaW5mby0+ZGV2X3Jvb3QtPm5vZGUpKTsKKworCWJ0cmZzX3NldF9iYWNrdXBfY3N1bV9yb290KHJvb3RfYmFja3VwLCBpbmZvLT5jc3VtX3Jvb3QtPm5vZGUtPnN0YXJ0KTsKKwlidHJmc19zZXRfYmFja3VwX2NzdW1fcm9vdF9nZW4ocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaW5mby0+Y3N1bV9yb290LT5ub2RlKSk7CisJYnRyZnNfc2V0X2JhY2t1cF9jc3VtX3Jvb3RfbGV2ZWwocm9vdF9iYWNrdXAsCisJCQkgICAgICAgYnRyZnNfaGVhZGVyX2xldmVsKGluZm8tPmNzdW1fcm9vdC0+bm9kZSkpOworCisJYnRyZnNfc2V0X2JhY2t1cF90b3RhbF9ieXRlcyhyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoaW5mby0+c3VwZXJfY29weSkpOworCWJ0cmZzX3NldF9iYWNrdXBfYnl0ZXNfdXNlZChyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfYnl0ZXNfdXNlZChpbmZvLT5zdXBlcl9jb3B5KSk7CisJYnRyZnNfc2V0X2JhY2t1cF9udW1fZGV2aWNlcyhyb290X2JhY2t1cCwKKwkJCSAgICAgYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoaW5mby0+c3VwZXJfY29weSkpOworCisJLyoKKwkgKiBpZiB3ZSBkb24ndCBjb3B5IHRoaXMgb3V0IHRvIHRoZSBzdXBlcl9jb3B5LCBpdCB3b24ndCBnZXQgcmVtZW1iZXJlZAorCSAqIGZvciB0aGUgbmV4dCBjb21taXQKKwkgKi8KKwltZW1jcHkoJmluZm8tPnN1cGVyX2NvcHktPnN1cGVyX3Jvb3RzLAorCSAgICAgICAmaW5mby0+c3VwZXJfZm9yX2NvbW1pdC0+c3VwZXJfcm9vdHMsCisJICAgICAgIHNpemVvZigqcm9vdF9iYWNrdXApICogQlRSRlNfTlVNX0JBQ0tVUF9ST09UUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvcGllcyBpbmZvIG91dCBvZiB0aGUgcm9vdCBiYWNrdXAgYXJyYXkgYW5kIGJhY2sgaW50bworICogdGhlIGluLW1lbW9yeSBzdXBlciBibG9jay4gIEl0IGlzIG1lYW50IHRvIGhlbHAgaXRlcmF0ZSB0aHJvdWdoCisgKiB0aGUgYXJyYXksIHNvIHlvdSBzZW5kIGl0IHRoZSBudW1iZXIgb2YgYmFja3VwcyB5b3UndmUgYWxyZWFkeQorICogdHJpZWQgYW5kIHRoZSBsYXN0IGJhY2t1cCBpbmRleCB5b3UgdXNlZC4KKyAqCisgKiB0aGlzIHJldHVybnMgLTEgd2hlbiBpdCBoYXMgdHJpZWQgYWxsIHRoZSBiYWNrdXBzCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgbmV4dF9yb290X2JhY2t1cChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXIsCisJCQkJICAgICBpbnQgKm51bV9iYWNrdXBzX3RyaWVkLCBpbnQgKmJhY2t1cF9pbmRleCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9iYWNrdXAgKnJvb3RfYmFja3VwOworCWludCBuZXdlc3QgPSAqYmFja3VwX2luZGV4OworCisJaWYgKCpudW1fYmFja3Vwc190cmllZCA9PSAwKSB7CisJCXU2NCBnZW4gPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKHN1cGVyKTsKKworCQluZXdlc3QgPSBmaW5kX25ld2VzdF9zdXBlcl9iYWNrdXAoaW5mbywgZ2VuKTsKKwkJaWYgKG5ld2VzdCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKworCQkqYmFja3VwX2luZGV4ID0gbmV3ZXN0OworCQkqbnVtX2JhY2t1cHNfdHJpZWQgPSAxOworCX0gZWxzZSBpZiAoKm51bV9iYWNrdXBzX3RyaWVkID09IEJUUkZTX05VTV9CQUNLVVBfUk9PVFMpIHsKKwkJLyogd2UndmUgdHJpZWQgYWxsIHRoZSBiYWNrdXBzLCBhbGwgZG9uZSAqLworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJLyoganVtcCB0byB0aGUgbmV4dCBvbGRlc3QgYmFja3VwICovCisJCW5ld2VzdCA9ICgqYmFja3VwX2luZGV4ICsgQlRSRlNfTlVNX0JBQ0tVUF9ST09UUyAtIDEpICUKKwkJCUJUUkZTX05VTV9CQUNLVVBfUk9PVFM7CisJCSpiYWNrdXBfaW5kZXggPSBuZXdlc3Q7CisJCSpudW1fYmFja3Vwc190cmllZCArPSAxOworCX0KKwlyb290X2JhY2t1cCA9IHN1cGVyLT5zdXBlcl9yb290cyArIG5ld2VzdDsKKworCWJ0cmZzX3NldF9zdXBlcl9nZW5lcmF0aW9uKHN1cGVyLAorCQkJCSAgIGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3RfZ2VuKHJvb3RfYmFja3VwKSk7CisJYnRyZnNfc2V0X3N1cGVyX3Jvb3Qoc3VwZXIsIGJ0cmZzX2JhY2t1cF90cmVlX3Jvb3Qocm9vdF9iYWNrdXApKTsKKwlidHJmc19zZXRfc3VwZXJfcm9vdF9sZXZlbChzdXBlciwKKwkJCQkgICBidHJmc19iYWNrdXBfdHJlZV9yb290X2xldmVsKHJvb3RfYmFja3VwKSk7CisJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoc3VwZXIsIGJ0cmZzX2JhY2t1cF9ieXRlc191c2VkKHJvb3RfYmFja3VwKSk7CisKKwkvKgorCSAqIGZpeG1lOiB0aGUgdG90YWwgYnl0ZXMgYW5kIG51bV9kZXZpY2VzIG5lZWQgdG8gbWF0Y2ggb3Igd2Ugc2hvdWxkCisJICogbmVlZCBhIGZzY2sKKwkgKi8KKwlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXIsIGJ0cmZzX2JhY2t1cF90b3RhbF9ieXRlcyhyb290X2JhY2t1cCkpOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcyhzdXBlciwgYnRyZnNfYmFja3VwX251bV9kZXZpY2VzKHJvb3RfYmFja3VwKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGhlbHBlciB0byBjbGVhbnVwIHRyZWUgcm9vdHMgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcm9vdF9wb2ludGVycyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgaW50IGNodW5rX3Jvb3QpCit7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPnRyZWVfcm9vdC0+bm9kZSk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPnRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihpbmZvLT5kZXZfcm9vdC0+bm9kZSk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPmRldl9yb290LT5jb21taXRfcm9vdCk7CisJZnJlZV9leHRlbnRfYnVmZmVyKGluZm8tPmV4dGVudF9yb290LT5ub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+ZXh0ZW50X3Jvb3QtPmNvbW1pdF9yb290KTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y3N1bV9yb290LT5ub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y3N1bV9yb290LT5jb21taXRfcm9vdCk7CisKKwlpbmZvLT50cmVlX3Jvb3QtPm5vZGUgPSBOVUxMOworCWluZm8tPnRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmRldl9yb290LT5ub2RlID0gTlVMTDsKKwlpbmZvLT5kZXZfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmV4dGVudF9yb290LT5ub2RlID0gTlVMTDsKKwlpbmZvLT5leHRlbnRfcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCWluZm8tPmNzdW1fcm9vdC0+bm9kZSA9IE5VTEw7CisJaW5mby0+Y3N1bV9yb290LT5jb21taXRfcm9vdCA9IE5VTEw7CisKKwlpZiAoY2h1bmtfcm9vdCkgeworCQlmcmVlX2V4dGVudF9idWZmZXIoaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihpbmZvLT5jaHVua19yb290LT5jb21taXRfcm9vdCk7CisJCWluZm8tPmNodW5rX3Jvb3QtPm5vZGUgPSBOVUxMOworCQlpbmZvLT5jaHVua19yb290LT5jb21taXRfcm9vdCA9IE5VTEw7CisJfQorfQorCisKIHN0cnVjdCBidHJmc19yb290ICpvcGVuX2N0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcywKIAkJCSAgICAgIGNoYXIgKm9wdGlvbnMpCkBAIC0xNTkwLDI5ICsxODkwLDMyIEBACiAJdTY0IGZlYXR1cmVzOwogCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCQkgR0ZQX05PRlMpOwotCXN0cnVjdCBidHJmc19yb290ICpjc3VtX3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCQkgR0ZQX05PRlMpOworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlcjsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290ID0gYnRyZnNfc2Ioc2IpOwotCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwKLQkJCQkJCUdGUF9OT0ZTKTsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCi0JCQkJCSAgICAgIEdGUF9OT0ZTKTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHRyZWVfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNzdW1fcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZ190cmVlX3Jvb3Q7Ci0KIAlpbnQgcmV0OwogCWludCBlcnIgPSAtRUlOVkFMOworCWludCBudW1fYmFja3Vwc190cmllZCA9IDA7CisJaW50IGJhY2t1cF9pbmRleCA9IDA7CiAKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXI7CisJZXh0ZW50X3Jvb3QgPSBmc19pbmZvLT5leHRlbnRfcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOworCWNzdW1fcm9vdCA9IGZzX2luZm8tPmNzdW1fcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOworCWNodW5rX3Jvb3QgPSBmc19pbmZvLT5jaHVua19yb290ID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7CisJZGV2X3Jvb3QgPSBmc19pbmZvLT5kZXZfcm9vdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19yb290KSwgR0ZQX05PRlMpOwogCi0JaWYgKCFleHRlbnRfcm9vdCB8fCAhdHJlZV9yb290IHx8ICF0cmVlX3Jvb3QtPmZzX2luZm8gfHwKLQkgICAgIWNodW5rX3Jvb3QgfHwgIWRldl9yb290IHx8ICFjc3VtX3Jvb3QpIHsKKwlpZiAoIWV4dGVudF9yb290IHx8ICFjc3VtX3Jvb3QgfHwgIWNodW5rX3Jvb3QgfHwgIWRldl9yb290KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9Ci0JZnNfaW5mbyA9IHRyZWVfcm9vdC0+ZnNfaW5mbzsKIAogCXJldCA9IGluaXRfc3JjdV9zdHJ1Y3QoJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKIAlpZiAocmV0KSB7CkBAIC0xNjQ4LDE1ICsxOTUxLDEwIEBACiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWxheWVkX2lwdXRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CiAJbXV0ZXhfaW5pdCgmZnNfaW5mby0+cmVsb2NfbXV0ZXgpOwogCiAJaW5pdF9jb21wbGV0aW9uKCZmc19pbmZvLT5rb2JqX3VucmVnaXN0ZXIpOwotCWZzX2luZm8tPnRyZWVfcm9vdCA9IHRyZWVfcm9vdDsKLQlmc19pbmZvLT5leHRlbnRfcm9vdCA9IGV4dGVudF9yb290OwotCWZzX2luZm8tPmNzdW1fcm9vdCA9IGNzdW1fcm9vdDsKLQlmc19pbmZvLT5jaHVua19yb290ID0gY2h1bmtfcm9vdDsKLQlmc19pbmZvLT5kZXZfcm9vdCA9IGRldl9yb290OwotCWZzX2luZm8tPmZzX2RldmljZXMgPSBmc19kZXZpY2VzOwogCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5kaXJ0eV9jb3dvbmx5X3Jvb3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+c3BhY2VfaW5mbyk7CiAJYnRyZnNfbWFwcGluZ19pbml0KCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwpAQCAtMTY2NSw4ICsxOTYzLDcgQEAKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2KTsKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2KTsKIAlidHJmc19pbml0X2Jsb2NrX3JzdigmZnNfaW5mby0+ZW1wdHlfYmxvY2tfcnN2KTsKLQlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOworCWJ0cmZzX2luaXRfYmxvY2tfcnN2KCZmc19pbmZvLT5kZWxheWVkX2Jsb2NrX3Jzdik7CiAJYXRvbWljX3NldCgmZnNfaW5mby0+bnJfYXN5bmNfc3VibWl0cywgMCk7CiAJYXRvbWljX3NldCgmZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMsIDApOwogCWF0b21pY19zZXQoJmZzX2luZm8tPmFzeW5jX3N1Ym1pdF9kcmFpbmluZywgMCk7CkBAIC0xNjc3LDYgKzE5NzQsMTEgQEAKIAlmc19pbmZvLT5tZXRhZGF0YV9yYXRpbyA9IDA7CiAJZnNfaW5mby0+ZGVmcmFnX2lub2RlcyA9IFJCX1JPT1Q7CiAJZnNfaW5mby0+dHJhbnNfbm9fam9pbiA9IDA7CisJZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSA9IDA7CisKKwkvKiByZWFkYWhlYWQgc3RhdGUgKi8KKwlJTklUX1JBRElYX1RSRUUoJmZzX2luZm8tPnJlYWRhX3RyZWUsIEdGUF9OT0ZTICYgfl9fR0ZQX1dBSVQpOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKIAogCWZzX2luZm8tPnRocmVhZF9wb29sX3NpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLAogCQkJCQkgIG51bV9vbmxpbmVfY3B1cygpICsgMiwgOCk7CkBAIC0xNzA1LDcgKzIwMDcsNyBAQAogCXNiLT5zX2JkaSA9ICZmc19pbmZvLT5iZGk7CiAKIAlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9pbm8gPSBCVFJGU19CVFJFRV9JTk9ERV9PQkpFQ1RJRDsKLQlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGZzX2luZm8tPmJ0cmVlX2lub2RlLCAxKTsKIAkvKgogCSAqIHdlIHNldCB0aGUgaV9zaXplIG9uIHRoZSBidHJlZSBpbm9kZSB0byB0aGUgbWF4IHBvc3NpYmxlIGludC4KIAkgKiB0aGUgcmVhbCBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgZGV0ZXJtaW5lZCBieSBhbGwgb2YKQEAgLTE3NjYsMTQgKzIwNjgsMTQgQEAKIAkJZ290byBmYWlsX2FsbG9jOwogCX0KIAotCW1lbWNweSgmZnNfaW5mby0+c3VwZXJfY29weSwgYmgtPmJfZGF0YSwgc2l6ZW9mKGZzX2luZm8tPnN1cGVyX2NvcHkpKTsKLQltZW1jcHkoJmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsICZmc19pbmZvLT5zdXBlcl9jb3B5LAotCSAgICAgICBzaXplb2YoZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCkpOworCW1lbWNweShmc19pbmZvLT5zdXBlcl9jb3B5LCBiaC0+Yl9kYXRhLCBzaXplb2YoKmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKKwltZW1jcHkoZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwgZnNfaW5mby0+c3VwZXJfY29weSwKKwkgICAgICAgc2l6ZW9mKCpmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0KSk7CiAJYnJlbHNlKGJoKTsKIAotCW1lbWNweShmc19pbmZvLT5mc2lkLCBmc19pbmZvLT5zdXBlcl9jb3B5LmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CisJbWVtY3B5KGZzX2luZm8tPmZzaWQsIGZzX2luZm8tPnN1cGVyX2NvcHktPmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CiAKLQlkaXNrX3N1cGVyID0gJmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IGZzX2luZm8tPnN1cGVyX2NvcHk7CiAJaWYgKCFidHJmc19zdXBlcl9yb290KGRpc2tfc3VwZXIpKQogCQlnb3RvIGZhaWxfYWxsb2M7CiAKQEAgLTE3ODMsNiArMjA4NSwxMyBAQAogCWJ0cmZzX2NoZWNrX3N1cGVyX3ZhbGlkKGZzX2luZm8sIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKIAogCS8qCisJICogcnVuIHRocm91Z2ggb3VyIGFycmF5IG9mIGJhY2t1cCBzdXBlcnMgYW5kIHNldHVwCisJICogb3VyIHJpbmcgcG9pbnRlciB0byB0aGUgb2xkZXN0IG9uZQorCSAqLworCWdlbmVyYXRpb24gPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOworCWZpbmRfb2xkZXN0X3N1cGVyX2JhY2t1cChmc19pbmZvLCBnZW5lcmF0aW9uKTsKKworCS8qCiAJICogSW4gdGhlIGxvbmcgdGVybSwgd2UnbGwgc3RvcmUgdGhlIGNvbXByZXNzaW9uIHR5cGUgaW4gdGhlIHN1cGVyCiAJICogYmxvY2ssIGFuZCBpdCdsbCBiZSB1c2VkIGZvciBwZXIgZmlsZSBjb21wcmVzc2lvbiBjb250cm9sLgogCSAqLwpAQCAtMTg3MCw2ICsyMTc5LDkgQEAKIAlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2VycywgImRlbGF5ZWQtbWV0YSIsCiAJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLAogCQkJICAgJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnJlYWRhaGVhZF93b3JrZXJzLCAicmVhZGFoZWFkIiwKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUsCisJCQkgICAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOwogCiAJLyoKIAkgKiBlbmRpb3MgYXJlIGxhcmdlbHkgcGFyYWxsZWwgYW5kIHNob3VsZCBoYXZlIGEgdmVyeQpAQCAtMTg4MCw2ICsyMTkyLDcgQEAKIAogCWZzX2luZm8tPmVuZGlvX3dyaXRlX3dvcmtlcnMuaWRsZV90aHJlc2ggPSAyOwogCWZzX2luZm8tPmVuZGlvX21ldGFfd3JpdGVfd29ya2Vycy5pZGxlX3RocmVzaCA9IDI7CisJZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMuaWRsZV90aHJlc2ggPSAyOwogCiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+d29ya2VycywgMSk7CiAJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIsIDEpOwpAQCAtMTg5Myw2ICsyMjA2LDcgQEAKIAlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19mcmVlc3BhY2Vfd29ya2VyLCAxKTsKIAlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5kZWxheWVkX3dvcmtlcnMsIDEpOwogCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmNhY2hpbmdfd29ya2VycywgMSk7CisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMsIDEpOwogCiAJZnNfaW5mby0+YmRpLnJhX3BhZ2VzICo9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKGRpc2tfc3VwZXIpOwogCWZzX2luZm8tPmJkaS5yYV9wYWdlcyA9IG1heChmc19pbmZvLT5iZGkucmFfcGFnZXMsCkBAIC0xOTM5LDcgKzIyNTMsNyBAQAogCWlmICghdGVzdF9iaXQoRVhURU5UX0JVRkZFUl9VUFRPREFURSwgJmNodW5rX3Jvb3QtPm5vZGUtPmJmbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIGNodW5rIHJvb3Qgb24gJXNcbiIsCiAJCSAgICAgICBzYi0+c19pZCk7Ci0JCWdvdG8gZmFpbF9jaHVua19yb290OworCQlnb3RvIGZhaWxfdHJlZV9yb290czsKIAl9CiAJYnRyZnNfc2V0X3Jvb3Rfbm9kZSgmY2h1bmtfcm9vdC0+cm9vdF9pdGVtLCBjaHVua19yb290LT5ub2RlKTsKIAljaHVua19yb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShjaHVua19yb290KTsKQEAgLTE5NTQsMTEgKzIyNjgsMTIgQEAKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0cmZzOiBmYWlsZWQgdG8gcmVhZCBjaHVuayB0cmVlIG9uICVzXG4iLAogCQkgICAgICAgc2ItPnNfaWQpOwotCQlnb3RvIGZhaWxfY2h1bmtfcm9vdDsKKwkJZ290byBmYWlsX3RyZWVfcm9vdHM7CiAJfQogCiAJYnRyZnNfY2xvc2VfZXh0cmFfZGV2aWNlcyhmc19kZXZpY2VzKTsKIAorcmV0cnlfcm9vdF9iYWNrdXA6CiAJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZSh0cmVlX3Jvb3QsCiAJCQkJICAgICBidHJmc19zdXBlcl9yb290X2xldmVsKGRpc2tfc3VwZXIpKTsKIAlnZW5lcmF0aW9uID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihkaXNrX3N1cGVyKTsKQEAgLTE5NjYsMzIgKzIyODEsMzMgQEAKIAl0cmVlX3Jvb3QtPm5vZGUgPSByZWFkX3RyZWVfYmxvY2sodHJlZV9yb290LAogCQkJCQkgIGJ0cmZzX3N1cGVyX3Jvb3QoZGlza19zdXBlciksCiAJCQkJCSAgYmxvY2tzaXplLCBnZW5lcmF0aW9uKTsKLQlpZiAoIXRyZWVfcm9vdC0+bm9kZSkKLQkJZ290byBmYWlsX2NodW5rX3Jvb3Q7Ci0JaWYgKCF0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX1VQVE9EQVRFLCAmdHJlZV9yb290LT5ub2RlLT5iZmxhZ3MpKSB7CisJaWYgKCF0cmVlX3Jvb3QtPm5vZGUgfHwKKwkgICAgIXRlc3RfYml0KEVYVEVOVF9CVUZGRVJfVVBUT0RBVEUsICZ0cmVlX3Jvb3QtPm5vZGUtPmJmbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIHRyZWUgcm9vdCBvbiAlc1xuIiwKIAkJICAgICAgIHNiLT5zX2lkKTsKLQkJZ290byBmYWlsX3RyZWVfcm9vdDsKKworCQlnb3RvIHJlY292ZXJ5X3RyZWVfcm9vdDsKIAl9CisKIAlidHJmc19zZXRfcm9vdF9ub2RlKCZ0cmVlX3Jvb3QtPnJvb3RfaXRlbSwgdHJlZV9yb290LT5ub2RlKTsKIAl0cmVlX3Jvb3QtPmNvbW1pdF9yb290ID0gYnRyZnNfcm9vdF9ub2RlKHRyZWVfcm9vdCk7CiAKIAlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKIAkJCQkgIEJUUkZTX0VYVEVOVF9UUkVFX09CSkVDVElELCBleHRlbnRfcm9vdCk7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX3RyZWVfcm9vdDsKKwkJZ290byByZWNvdmVyeV90cmVlX3Jvb3Q7CiAJZXh0ZW50X3Jvb3QtPnRyYWNrX2RpcnR5ID0gMTsKIAogCXJldCA9IGZpbmRfYW5kX3NldHVwX3Jvb3QodHJlZV9yb290LCBmc19pbmZvLAogCQkJCSAgQlRSRlNfREVWX1RSRUVfT0JKRUNUSUQsIGRldl9yb290KTsKIAlpZiAocmV0KQotCQlnb3RvIGZhaWxfZXh0ZW50X3Jvb3Q7CisJCWdvdG8gcmVjb3ZlcnlfdHJlZV9yb290OwogCWRldl9yb290LT50cmFja19kaXJ0eSA9IDE7CiAKIAlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKIAkJCQkgIEJUUkZTX0NTVU1fVFJFRV9PQkpFQ1RJRCwgY3N1bV9yb290KTsKIAlpZiAocmV0KQotCQlnb3RvIGZhaWxfZGV2X3Jvb3Q7CisJCWdvdG8gcmVjb3ZlcnlfdHJlZV9yb290OwogCiAJY3N1bV9yb290LT50cmFja19kaXJ0eSA9IDE7CiAKQEAgLTIxMjQsMjIgKzI0NDAsMTMgQEAKIAogZmFpbF9ibG9ja19ncm91cHM6CiAJYnRyZnNfZnJlZV9ibG9ja19ncm91cHMoZnNfaW5mbyk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKGNzdW1fcm9vdC0+bm9kZSk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKGNzdW1fcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9kZXZfcm9vdDoKLQlmcmVlX2V4dGVudF9idWZmZXIoZGV2X3Jvb3QtPm5vZGUpOwotCWZyZWVfZXh0ZW50X2J1ZmZlcihkZXZfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9leHRlbnRfcm9vdDoKLQlmcmVlX2V4dGVudF9idWZmZXIoZXh0ZW50X3Jvb3QtPm5vZGUpOwotCWZyZWVfZXh0ZW50X2J1ZmZlcihleHRlbnRfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF90cmVlX3Jvb3Q6Ci0JZnJlZV9leHRlbnRfYnVmZmVyKHRyZWVfcm9vdC0+bm9kZSk7Ci0JZnJlZV9leHRlbnRfYnVmZmVyKHRyZWVfcm9vdC0+Y29tbWl0X3Jvb3QpOwotZmFpbF9jaHVua19yb290OgotCWZyZWVfZXh0ZW50X2J1ZmZlcihjaHVua19yb290LT5ub2RlKTsKLQlmcmVlX2V4dGVudF9idWZmZXIoY2h1bmtfcm9vdC0+Y29tbWl0X3Jvb3QpOworCitmYWlsX3RyZWVfcm9vdHM6CisJZnJlZV9yb290X3BvaW50ZXJzKGZzX2luZm8sIDEpOworCiBmYWlsX3NiX2J1ZmZlcjoKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPnJlYWRhaGVhZF93b3JrZXJzKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMpOwogCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZGVsYWxsb2Nfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT53b3JrZXJzKTsKQEAgLTIxNTIsMjUgKzI0NTksMzcgQEAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5jYWNoaW5nX3dvcmtlcnMpOwogZmFpbF9hbGxvYzoKLQlrZnJlZShmc19pbmZvLT5kZWxheWVkX3Jvb3QpOwogZmFpbF9pcHV0OgorCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOworCiAJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CiAJaXB1dChmc19pbmZvLT5idHJlZV9pbm9kZSk7Ci0KLQlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOwotCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOwogZmFpbF9iZGk6CiAJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CiBmYWlsX3NyY3U6CiAJY2xlYW51cF9zcmN1X3N0cnVjdCgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogZmFpbDoKLQlrZnJlZShleHRlbnRfcm9vdCk7Ci0Ja2ZyZWUodHJlZV9yb290KTsKLQlrZnJlZShmc19pbmZvKTsKLQlrZnJlZShjaHVua19yb290KTsKLQlrZnJlZShkZXZfcm9vdCk7Ci0Ja2ZyZWUoY3N1bV9yb290KTsKKwlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOworCWZyZWVfZnNfaW5mbyhmc19pbmZvKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOworCityZWNvdmVyeV90cmVlX3Jvb3Q6CisJaWYgKCFidHJmc190ZXN0X29wdCh0cmVlX3Jvb3QsIFJFQ09WRVJZKSkKKwkJZ290byBmYWlsX3RyZWVfcm9vdHM7CisKKwlmcmVlX3Jvb3RfcG9pbnRlcnMoZnNfaW5mbywgMCk7CisKKwkvKiBkb24ndCB1c2UgdGhlIGxvZyBpbiByZWNvdmVyeSBtb2RlLCBpdCB3b24ndCBiZSB2YWxpZCAqLworCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdChkaXNrX3N1cGVyLCAwKTsKKworCS8qIHdlIGNhbid0IHRydXN0IHRoZSBmcmVlIHNwYWNlIGNhY2hlIGVpdGhlciAqLworCWJ0cmZzX3NldF9vcHQoZnNfaW5mby0+bW91bnRfb3B0LCBDTEVBUl9DQUNIRSk7CisKKwlyZXQgPSBuZXh0X3Jvb3RfYmFja3VwKGZzX2luZm8sIGZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkgICAgICAgJm51bV9iYWNrdXBzX3RyaWVkLCAmYmFja3VwX2luZGV4KTsKKwlpZiAocmV0ID09IC0xKQorCQlnb3RvIGZhaWxfYmxvY2tfZ3JvdXBzOworCWdvdG8gcmV0cnlfcm9vdF9iYWNrdXA7CiB9CiAKIHN0YXRpYyB2b2lkIGJ0cmZzX2VuZF9idWZmZXJfd3JpdGVfc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCkBAIC0yMzM4LDEwICsyNjU3LDExIEBACiAJaW50IHRvdGFsX2Vycm9ycyA9IDA7CiAJdTY0IGZsYWdzOwogCi0JbWF4X2Vycm9ycyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7CisJbWF4X2Vycm9ycyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpIC0gMTsKIAlkb19iYXJyaWVycyA9ICFidHJmc190ZXN0X29wdChyb290LCBOT0JBUlJJRVIpOworCWJhY2t1cF9zdXBlcl9yb290cyhyb290LT5mc19pbmZvKTsKIAotCXNiID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQ7CisJc2IgPSByb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0OwogCWRldl9pdGVtID0gJnNiLT5kZXZfaXRlbTsKIAogCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZV9saXN0X211dGV4KTsKQEAgLTI1NDUsOCArMjg2NSw2IEBACiAJLyogY2xlYXIgb3V0IHRoZSByYnRyZWUgb2YgZGVmcmFnZ2FibGUgaW5vZGVzICovCiAJYnRyZnNfcnVuX2RlZnJhZ19pbm9kZXMocm9vdC0+ZnNfaW5mbyk7CiAKLQlidHJmc19wdXRfYmxvY2tfZ3JvdXBfY2FjaGUoZnNfaW5mbyk7Ci0KIAkvKgogCSAqIEhlcmUgY29tZSAyIHNpdHVhdGlvbnMgd2hlbiBidHJmcyBpcyBicm9rZW4gdG8gZmxpcCByZWFkb25seToKIAkgKgpAQCAtMjU3Miw2ICsyODkwLDggQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGNvbW1pdCBzdXBlciByZXQgJWRcbiIsIHJldCk7CiAJfQogCisJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwX2NhY2hlKGZzX2luZm8pOworCiAJa3RocmVhZF9zdG9wKHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2t0aHJlYWQpOwogCWt0aHJlYWRfc3RvcChyb290LT5mc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpOwogCkBAIC0yNjAzLDcgKzI5MjMsNiBAQAogCWRlbF9mc19yb290cyhmc19pbmZvKTsKIAogCWlwdXQoZnNfaW5mby0+YnRyZWVfaW5vZGUpOwotCWtmcmVlKGZzX2luZm8tPmRlbGF5ZWRfcm9vdCk7CiAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMpOwpAQCAtMjYxNyw2ICsyOTM2LDcgQEAKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPnN1Ym1pdF93b3JrZXJzKTsKIAlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2Vycyk7CiAJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5jYWNoaW5nX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMpOwogCiAJYnRyZnNfY2xvc2VfZGV2aWNlcyhmc19pbmZvLT5mc19kZXZpY2VzKTsKIAlidHJmc19tYXBwaW5nX3RyZWVfZnJlZSgmZnNfaW5mby0+bWFwcGluZ190cmVlKTsKQEAgLTI2MjQsMTIgKzI5NDQsNyBAQAogCWJkaV9kZXN0cm95KCZmc19pbmZvLT5iZGkpOwogCWNsZWFudXBfc3JjdV9zdHJ1Y3QoJmZzX2luZm8tPnN1YnZvbF9zcmN1KTsKIAotCWtmcmVlKGZzX2luZm8tPmV4dGVudF9yb290KTsKLQlrZnJlZShmc19pbmZvLT50cmVlX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8tPmNodW5rX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8tPmRldl9yb290KTsKLQlrZnJlZShmc19pbmZvLT5jc3VtX3Jvb3QpOwotCWtmcmVlKGZzX2luZm8pOworCWZyZWVfZnNfaW5mbyhmc19pbmZvKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjczNSw3ICszMDUwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYnRyZWVfbG9ja19wYWdlX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW50IGJ0cmVlX2xvY2tfcGFnZV9ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpkYXRhLAorCQkJCXZvaWQgKCpmbHVzaF9mbikodm9pZCAqKSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwpAQCAtMjc1Miw3ICszMDY4LDEwIEBACiAJaWYgKCFlYikKIAkJZ290byBvdXQ7CiAKLQlidHJmc190cmVlX2xvY2soZWIpOworCWlmICghYnRyZnNfdHJ5X3RyZWVfd3JpdGVfbG9jayhlYikpIHsKKwkJZmx1c2hfZm4oZGF0YSk7CisJCWJ0cmZzX3RyZWVfbG9jayhlYik7CisJfQogCWJ0cmZzX3NldF9oZWFkZXJfZmxhZyhlYiwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVYVEVOVF9CVUZGRVJfRElSVFksICZlYi0+YmZsYWdzKSkgewpAQCAtMjc2Nyw3ICszMDg2LDEwIEBACiAJYnRyZnNfdHJlZV91bmxvY2soZWIpOwogCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CiBvdXQ6Ci0JbG9ja19wYWdlKHBhZ2UpOworCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCWZsdXNoX2ZuKGRhdGEpOworCQlsb2NrX3BhZ2UocGFnZSk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zMTIzLDYgKzM0NDUsNyBAQAogc3RhdGljIHN0cnVjdCBleHRlbnRfaW9fb3BzIGJ0cmVlX2V4dGVudF9pb19vcHMgPSB7CiAJLndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayA9IGJ0cmVlX2xvY2tfcGFnZV9ob29rLAogCS5yZWFkcGFnZV9lbmRfaW9faG9vayA9IGJ0cmVlX3JlYWRwYWdlX2VuZF9pb19ob29rLAorCS5yZWFkcGFnZV9pb19mYWlsZWRfaG9vayA9IGJ0cmVlX2lvX2ZhaWxlZF9ob29rLAogCS5zdWJtaXRfYmlvX2hvb2sgPSBidHJlZV9zdWJtaXRfYmlvX2hvb2ssCiAJLyogbm90ZSB3ZSdyZSBzaGFyaW5nIHdpdGggaW5vZGUuYyBmb3IgdGhlIG1lcmdlIGJpbyBob29rICovCiAJLm1lcmdlX2Jpb19ob29rID0gYnRyZnNfbWVyZ2VfYmlvX2hvb2ssCmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmggYi9mcy9idHJmcy9kaXNrLWlvLmgKaW5kZXggYmVjM2VhNC4uYzk5ZDBhOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpc2staW8uaAorKysgYi9mcy9idHJmcy9kaXNrLWlvLmgKQEAgLTQwLDYgKzQwLDggQEAKIAkJCQkgICAgICB1MzIgYmxvY2tzaXplLCB1NjQgcGFyZW50X3RyYW5zaWQpOwogaW50IHJlYWRhaGVhZF90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplLAogCQkJIHU2NCBwYXJlbnRfdHJhbnNpZCk7CitpbnQgcmVhZGFfdHJlZV9ibG9ja19mbGFnZ2VkKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplLAorCQkJIGludCBtaXJyb3JfbnVtLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKmViKTsKIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkJICAgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSk7CiBpbnQgY2xlYW5fdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTgzLDggKzg1LDYgQEAKIAkJCSAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOwogaW50IGJ0cmZzX2FkZF9sb2dfdHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKLWludCBidHJlZV9sb2NrX3BhZ2VfaG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0KIAogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiB2b2lkIGJ0cmZzX2luaXRfbG9ja2RlcCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IGY1YmUwNmEuLmIyMzIxNTAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJjb21wYXQuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAiY3RyZWUuaCIKQEAgLTUyLDYgKzUzLDIxIEBACiAJQ0hVTktfQUxMT0NfTElNSVRFRCA9IDIsCiB9OwogCisvKgorICogQ29udHJvbCBob3cgcmVzZXJ2YXRpb25zIGFyZSBkZWFsdCB3aXRoLgorICoKKyAqIFJFU0VSVkVfRlJFRSAtIGZyZWVpbmcgYSByZXNlcnZhdGlvbi4KKyAqIFJFU0VSVkVfQUxMT0MgLSBhbGxvY2F0aW5nIHNwYWNlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBieXRlc19tYXlfdXNlIGZvcgorICogICBFTk9TUEMgYWNjb3VudGluZworICogUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIC0gYWxsb2NhdGluZyBzcGFjZSBhbmQgd2Ugc2hvdWxkIG5vdCB1cGRhdGUKKyAqICAgYnl0ZXNfbWF5X3VzZSBhcyB0aGUgRU5PU1BDIGFjY291bnRpbmcgaXMgZG9uZSBlbHNld2hlcmUKKyAqLworZW51bSB7CisJUkVTRVJWRV9GUkVFID0gMCwKKwlSRVNFUlZFX0FMTE9DID0gMSwKKwlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgPSAyLAorfTsKKwogc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYyk7CkBAIC04MSw2ICs5Nyw4IEBACiAJCQkgc3RydWN0IGJ0cmZzX2tleSAqa2V5KTsKIHN0YXRpYyB2b2lkIGR1bXBfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqaW5mbywgdTY0IGJ5dGVzLAogCQkJICAgIGludCBkdW1wX2Jsb2NrX2dyb3Vwcyk7CitzdGF0aWMgaW50IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSk7CiAKIHN0YXRpYyBub2lubGluZSBpbnQKIGJsb2NrX2dyb3VwX2NhY2hlX2RvbmUoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKQEAgLTEwNCw3ICsxMjIsNiBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWNoZS0+Y291bnQpKSB7CiAJCVdBUk5fT04oY2FjaGUtPnBpbm5lZCA+IDApOwogCQlXQVJOX09OKGNhY2hlLT5yZXNlcnZlZCA+IDApOwotCQlXQVJOX09OKGNhY2hlLT5yZXNlcnZlZF9waW5uZWQgPiAwKTsKIAkJa2ZyZWUoY2FjaGUtPmZyZWVfc3BhY2VfY3RsKTsKIAkJa2ZyZWUoY2FjaGUpOwogCX0KQEAgLTQ2NSw3ICs0ODIsOCBAQAogCSAqIHdlIGxpa2VseSBob2xkIGltcG9ydGFudCBsb2Nrcy4KIAkgKi8KIAlpZiAodHJhbnMgJiYgKCF0cmFucy0+dHJhbnNhY3Rpb24tPmluX2NvbW1pdCkgJiYKLQkgICAgKHJvb3QgJiYgcm9vdCAhPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpKSB7CisJICAgIChyb290ICYmIHJvb3QgIT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KSAmJgorCSAgICBidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpIHsKIAkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CiAJCWlmIChjYWNoZS0+Y2FjaGVkICE9IEJUUkZTX0NBQ0hFX05PKSB7CiAJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwpAQCAtMTc3MCwxOCArMTc4OCwxOCBAQAogewogCWludCByZXQ7CiAJdTY0IGRpc2NhcmRlZF9ieXRlcyA9IDA7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBOVUxMOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOwogCiAKIAkvKiBUZWxsIHRoZSBibG9jayBkZXZpY2UocykgdGhhdCB0aGUgc2VjdG9ycyBjYW4gYmUgZGlzY2FyZGVkICovCiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKCZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsIFJFUV9ESVNDQVJELAotCQkJICAgICAgYnl0ZW5yLCAmbnVtX2J5dGVzLCAmbXVsdGksIDApOworCQkJICAgICAgYnl0ZW5yLCAmbnVtX2J5dGVzLCAmYmJpbywgMCk7CiAJaWYgKCFyZXQpIHsKLQkJc3RydWN0IGJ0cmZzX2Jpb19zdHJpcGUgKnN0cmlwZSA9IG11bHRpLT5zdHJpcGVzOworCQlzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSAqc3RyaXBlID0gYmJpby0+c3RyaXBlczsKIAkJaW50IGk7CiAKIAotCQlmb3IgKGkgPSAwOyBpIDwgbXVsdGktPm51bV9zdHJpcGVzOyBpKyssIHN0cmlwZSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBiYmlvLT5udW1fc3RyaXBlczsgaSsrLCBzdHJpcGUrKykgewogCQkJaWYgKCFzdHJpcGUtPmRldi0+Y2FuX2Rpc2NhcmQpCiAJCQkJY29udGludWU7CiAKQEAgLTE4MDAsNyArMTgxOCw3IEBACiAJCQkgKi8KIAkJCXJldCA9IDA7CiAJCX0KLQkJa2ZyZWUobXVsdGkpOworCQlrZnJlZShiYmlvKTsKIAl9CiAKIAlpZiAoYWN0dWFsX2J5dGVzKQpAQCAtMjcwMCw2ICsyNzE4LDEzIEBACiAJCWdvdG8gYWdhaW47CiAJfQogCisJLyogV2UndmUgYWxyZWFkeSBzZXR1cCB0aGlzIHRyYW5zYWN0aW9uLCBnbyBhaGVhZCBhbmQgZXhpdCAqLworCWlmIChibG9ja19ncm91cC0+Y2FjaGVfZ2VuZXJhdGlvbiA9PSB0cmFucy0+dHJhbnNpZCAmJgorCSAgICBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJZGNzID0gQlRSRlNfRENfU0VUVVA7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKIAkvKgogCSAqIFdlIHdhbnQgdG8gc2V0IHRoZSBnZW5lcmF0aW9uIHRvIDAsIHRoYXQgd2F5IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKIAkgKiBmcm9tIGhlcmUgb24gb3V0IHdlIGtub3cgbm90IHRvIHRydXN0IHRoaXMgY2FjaGUgd2hlbiB3ZSBsb2FkIHVwIG5leHQKQEAgLTI3NDksMTIgKzI3NzQsMTUgQEAKIAlpZiAoIXJldCkKIAkJZGNzID0gQlRSRlNfRENfU0VUVVA7CiAJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBudW1fcGFnZXMpOworCiBvdXRfcHV0OgogCWlwdXQoaW5vZGUpOwogb3V0X2ZyZWU6CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogb3V0OgogCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCWlmICghcmV0KQorCQlibG9ja19ncm91cC0+Y2FjaGVfZ2VuZXJhdGlvbiA9IHRyYW5zLT50cmFuc2lkOwogCWJsb2NrX2dyb3VwLT5kaXNrX2NhY2hlX3N0YXRlID0gZGNzOwogCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CiAKQEAgLTMxMjIsMTYgKzMxNTAsMTMgQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCWRhdGFfc2luZm8tPmJ5dGVzX21heV91c2UgKz0gYnl0ZXM7Ci0JQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2J5dGVzICs9IGJ5dGVzOwogCXNwaW5fdW5sb2NrKCZkYXRhX3NpbmZvLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQogCiAvKgotICogY2FsbGVkIHdoZW4gd2UgYXJlIGNsZWFyaW5nIGFuIGRlbGFsbG9jIGV4dGVudCBmcm9tIHRoZQotICogaW5vZGUncyBpb190cmVlIG9yIHRoZXJlIHdhcyBhbiBlcnJvciBmb3Igd2hhdGV2ZXIgcmVhc29uCi0gKiBhZnRlciBjYWxsaW5nIGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZQorICogQ2FsbGVkIGlmIHdlIG5lZWQgdG8gY2xlYXIgYSBkYXRhIHJlc2VydmF0aW9uIGZvciB0aGlzIGlub2RlLgogICovCiB2b2lkIGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYnl0ZXMpCiB7CkBAIC0zMTQ0LDcgKzMxNjksNiBAQAogCWRhdGFfc2luZm8gPSBCVFJGU19JKGlub2RlKS0+c3BhY2VfaW5mbzsKIAlzcGluX2xvY2soJmRhdGFfc2luZm8tPmxvY2spOwogCWRhdGFfc2luZm8tPmJ5dGVzX21heV91c2UgLT0gYnl0ZXM7Ci0JQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2J5dGVzIC09IGJ5dGVzOwogCXNwaW5fdW5sb2NrKCZkYXRhX3NpbmZvLT5sb2NrKTsKIH0KIApAQCAtMzE2NSw2ICszMTg5LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzaW5mbywgdTY0IGFsbG9jX2J5dGVzLAogCQkJICAgICAgaW50IGZvcmNlKQogeworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmdsb2JhbF9yc3YgPSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAl1NjQgbnVtX2J5dGVzID0gc2luZm8tPnRvdGFsX2J5dGVzIC0gc2luZm8tPmJ5dGVzX3JlYWRvbmx5OwogCXU2NCBudW1fYWxsb2NhdGVkID0gc2luZm8tPmJ5dGVzX3VzZWQgKyBzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQ7CiAJdTY0IHRocmVzaDsKQEAgLTMxNzMsMTEgKzMxOTgsMTggQEAKIAkJcmV0dXJuIDE7CiAKIAkvKgorCSAqIFdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGdsb2JhbCByc3YgYmVjYXVzZSBmb3IgYWxsIGludGVudHMKKwkgKiBhbmQgcHVycG9zZXMgaXQncyB1c2VkIHNwYWNlLiAgRG9uJ3Qgd29ycnkgYWJvdXQgbG9ja2luZyB0aGUKKwkgKiBnbG9iYWxfcnN2LCBpdCBkb2Vzbid0IGNoYW5nZSBleGNlcHQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKwkgKi8KKwludW1fYWxsb2NhdGVkICs9IGdsb2JhbF9yc3YtPnNpemU7CisKKwkvKgogCSAqIGluIGxpbWl0ZWQgbW9kZSwgd2Ugd2FudCB0byBoYXZlIHNvbWUgZnJlZSBzcGFjZSB1cCB0bwogCSAqIGFib3V0IDElIG9mIHRoZSBGUyBzaXplLgogCSAqLwogCWlmIChmb3JjZSA9PSBDSFVOS19BTExPQ19MSU1JVEVEKSB7Ci0JCXRocmVzaCA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwkJdGhyZXNoID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAJCXRocmVzaCA9IG1heF90KHU2NCwgNjQgKiAxMDI0ICogMTAyNCwKIAkJCSAgICAgICBkaXZfZmFjdG9yX2ZpbmUodGhyZXNoLCAxKSk7CiAKQEAgLTMxOTksNyArMzIzMSw3IEBACiAJaWYgKG51bV9hbGxvY2F0ZWQgKyBhbGxvY19ieXRlcyA8IGRpdl9mYWN0b3IobnVtX2J5dGVzLCA4KSkKIAkJcmV0dXJuIDA7CiAKLQl0aHJlc2ggPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdGhyZXNoID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAkvKiAyNTZNQiBvciA1JSBvZiB0aGUgRlMgKi8KIAl0aHJlc2ggPSBtYXhfdCh1NjQsIDI1NiAqIDEwMjQgKiAxMDI0LCBkaXZfZmFjdG9yX2ZpbmUodGhyZXNoLCA1KSk7CkBAIC0zMzAyLDI0ICszMzM0LDI2IEBACiAvKgogICogc2hyaW5rIG1ldGFkYXRhIHJlc2VydmF0aW9uIGZvciBkZWxhbGxvYwogICovCi1zdGF0aWMgaW50IHNocmlua19kZWxhbGxvYyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgdG9fcmVjbGFpbSwgaW50IHN5bmMpCitzdGF0aWMgaW50IHNocmlua19kZWxhbGxvYyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHRvX3JlY2xhaW0sCisJCQkgICBib29sIHdhaXRfb3JkZXJlZCkKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJdTY0IHJlc2VydmVkOwogCXU2NCBtYXhfcmVjbGFpbTsKIAl1NjQgcmVjbGFpbWVkID0gMDsKIAlsb25nIHRpbWVfbGVmdDsKLQlpbnQgbnJfcGFnZXMgPSAoMiAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAoMiAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWludCBsb29wcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBwcm9ncmVzczsKIAorCXRyYW5zID0gKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKiljdXJyZW50LT5qb3VybmFsX2luZm87CiAJYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAlzcGFjZV9pbmZvID0gYmxvY2tfcnN2LT5zcGFjZV9pbmZvOwogCiAJc21wX21iKCk7Ci0JcmVzZXJ2ZWQgPSBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZDsKKwlyZXNlcnZlZCA9IHNwYWNlX2luZm8tPmJ5dGVzX21heV91c2U7CiAJcHJvZ3Jlc3MgPSBzcGFjZV9pbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzczsKIAogCWlmIChyZXNlcnZlZCA9PSAwKQpAQCAtMzMzNCwxOCArMzM2OCwyMCBAQAogCX0KIAogCW1heF9yZWNsYWltID0gbWluKHJlc2VydmVkLCB0b19yZWNsYWltKTsKLQorCW5yX3BhZ2VzID0gbWF4X3QodW5zaWduZWQgbG9uZywgbnJfcGFnZXMsCisJCQkgbWF4X3JlY2xhaW0gPj4gUEFHRV9DQUNIRV9TSElGVCk7CiAJd2hpbGUgKGxvb3BzIDwgMTAyNCkgewogCQkvKiBoYXZlIHRoZSBmbHVzaGVyIHRocmVhZHMganVtcCBpbiBhbmQgZG8gc29tZSBJTyAqLwogCQlzbXBfbWIoKTsKIAkJbnJfcGFnZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBucl9wYWdlcywKIAkJICAgICAgIHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwotCQl3cml0ZWJhY2tfaW5vZGVzX3NiX25yX2lmX2lkbGUocm9vdC0+ZnNfaW5mby0+c2IsIG5yX3BhZ2VzKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9ucl9pZl9pZGxlKHJvb3QtPmZzX2luZm8tPnNiLCBucl9wYWdlcywKKwkJCQkJCVdCX1JFQVNPTl9GU19GUkVFX1NQQUNFKTsKIAogCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCQlpZiAocmVzZXJ2ZWQgPiBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCkKLQkJCXJlY2xhaW1lZCArPSByZXNlcnZlZCAtIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkOwotCQlyZXNlcnZlZCA9IHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkOworCQlpZiAocmVzZXJ2ZWQgPiBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlKQorCQkJcmVjbGFpbWVkICs9IHJlc2VydmVkIC0gc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZTsKKwkJcmVzZXJ2ZWQgPSBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwogCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAKIAkJbG9vcHMrKzsKQEAgLTMzNTYsMTEgKzMzOTIsMTUgQEAKIAkJaWYgKHRyYW5zICYmIHRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCkKIAkJCXJldHVybiAtRUFHQUlOOwogCi0JCXRpbWVfbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJaWYgKHdhaXRfb3JkZXJlZCAmJiAhdHJhbnMpIHsKKwkJCWJ0cmZzX3dhaXRfb3JkZXJlZF9leHRlbnRzKHJvb3QsIDAsIDApOworCQl9IGVsc2UgeworCQkJdGltZV9sZWZ0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCi0JCS8qIFdlIHdlcmUgaW50ZXJydXB0ZWQsIGV4aXQgKi8KLQkJaWYgKHRpbWVfbGVmdCkKLQkJCWJyZWFrOworCQkJLyogV2Ugd2VyZSBpbnRlcnJ1cHRlZCwgZXhpdCAqLworCQkJaWYgKHRpbWVfbGVmdCkKKwkJCQlicmVhazsKKwkJfQogCiAJCS8qIHdlJ3ZlIGtpY2tlZCB0aGUgSU8gYSBmZXcgdGltZXMsIGlmIGFueXRoaW5nIGhhcyBiZWVuIGZyZWVkLAogCQkgKiBleGl0LiAgVGhlcmUgaXMgbm8gc2Vuc2UgaW4gbG9vcGluZyBoZXJlIGZvciBhIGxvbmcgdGltZQpAQCAtMzM3NSwzNCArMzQxNSw5MCBAQAogCQl9CiAKIAl9Ci0JaWYgKHJlY2xhaW1lZCA+PSB0b19yZWNsYWltICYmICF0cmFucykKLQkJYnRyZnNfd2FpdF9vcmRlcmVkX2V4dGVudHMocm9vdCwgMCwgMCk7CisKIAlyZXR1cm4gcmVjbGFpbWVkID49IHRvX3JlY2xhaW07CiB9CiAKLS8qCi0gKiBSZXRyaWVzIHRlbGxzIHVzIGhvdyBtYW55IHRpbWVzIHdlJ3ZlIGNhbGxlZCByZXNlcnZlX21ldGFkYXRhX2J5dGVzLiAgVGhlCi0gKiBpZGVhIGlzIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgKHJldHJpZXMgPT0gMCkgdGhlbiB3ZSB3aWxsIGFkZCB0byBvdXIKLSAqIHJlc2VydmVkIGNvdW50IGlmIHdlIGNhbid0IG1ha2UgdGhlIGFsbG9jYXRpb24gaW4gb3JkZXIgdG8gaG9sZCBvdXIgcGxhY2UKLSAqIHdoaWxlIHdlIGdvIGFuZCB0cnkgYW5kIGZyZWUgdXAgc3BhY2UuICBUaGF0IHdheSBmb3IgcmV0cmllcyA+IDEgd2UgZG9uJ3QgdHJ5Ci0gKiBhbmQgYWRkIHNwYWNlLCB3ZSBqdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgYW1vdW50IG9mIHVudXNlZCBzcGFjZSBpcyA+PSB0aGUKLSAqIHRvdGFsIHNwYWNlLCBtZWFuaW5nIHRoYXQgb3VyIHJlc2VydmF0aW9uIGlzIHZhbGlkLgorLyoqCisgKiBtYXliZV9jb21taXRfdHJhbnNhY3Rpb24gLSBwb3NzaWJseSBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGlmIGl0cyBvayB0bworICogQHJvb3QgLSB0aGUgcm9vdCB3ZSdyZSBhbGxvY2F0aW5nIGZvcgorICogQGJ5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50IHRvIHJlc2VydmUKKyAqIEBmb3JjZSAtIGZvcmNlIHRoZSBjb21taXQKICAqCi0gKiBIb3dldmVyIGlmIHdlIGRvbid0IGludGVuZCB0byByZXRyeSB0aGlzIHJlc2VydmF0aW9uLCBwYXNzIC0xIGFzIHJldHJpZXMgc28KLSAqIHRoYXQgaXQgc2hvcnQgY2lyY3VpdHMgdGhpcyBsb2dpYy4KKyAqIFRoaXMgd2lsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGFjdHVhbGx5CisgKiBnZXQgdXMgc29tZXdoZXJlIGFuZCB0aGVuIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gaWYgaXQgZG9lcy4gIE90aGVyd2lzZSBpdAorICogd2lsbCByZXR1cm4gLUVOT1NQQy4KICAqLwotc3RhdGljIGludCByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCitzdGF0aWMgaW50IG1heV9jb21taXRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICBzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbywKKwkJCQkgIHU2NCBieXRlcywgaW50IGZvcmNlKQoreworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmRlbGF5ZWRfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGF5ZWRfYmxvY2tfcnN2OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCisJdHJhbnMgPSAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqKWN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpZiAodHJhbnMpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGZvcmNlKQorCQlnb3RvIGNvbW1pdDsKKworCS8qIFNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggcGlubmVkIHNwYWNlIHRvIG1ha2UgdGhpcyByZXNlcnZhdGlvbiAqLworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJaWYgKHNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCA+PSBieXRlcykgeworCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCWdvdG8gY29tbWl0OworCX0KKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGVyZSBpcyBzb21lIHNwYWNlIGluIHRoZSBkZWxheWVkIGluc2VydGlvbiByZXNlcnZhdGlvbiBmb3IKKwkgKiB0aGlzIHJlc2VydmF0aW9uLgorCSAqLworCWlmIChzcGFjZV9pbmZvICE9IGRlbGF5ZWRfcnN2LT5zcGFjZV9pbmZvKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXNwaW5fbG9jaygmZGVsYXllZF9yc3YtPmxvY2spOworCWlmIChkZWxheWVkX3Jzdi0+c2l6ZSA8IGJ5dGVzKSB7CisJCXNwaW5fdW5sb2NrKCZkZWxheWVkX3Jzdi0+bG9jayk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwlzcGluX3VubG9jaygmZGVsYXllZF9yc3YtPmxvY2spOworCitjb21taXQ6CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOworCWlmIChJU19FUlIodHJhbnMpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJldHVybiBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworfQorCisvKioKKyAqIHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMgLSB0cnkgdG8gcmVzZXJ2ZSBieXRlcyBmcm9tIHRoZSBibG9ja19yc3YncyBzcGFjZQorICogQHJvb3QgLSB0aGUgcm9vdCB3ZSdyZSBhbGxvY2F0aW5nIGZvcgorICogQGJsb2NrX3JzdiAtIHRoZSBibG9ja19yc3Ygd2UncmUgYWxsb2NhdGluZyBmb3IKKyAqIEBvcmlnX2J5dGVzIC0gdGhlIG51bWJlciBvZiBieXRlcyB3ZSB3YW50CisgKiBAZmx1c2ggLSB3ZXRoZXIgb3Igbm90IHdlIGNhbiBmbHVzaCB0byBtYWtlIG91ciByZXNlcnZhdGlvbgorICoKKyAqIFRoaXMgd2lsbCByZXNlcnZlIG9yZ2lfYnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwYWNlIGluZm8gYXNzb2NpYXRlZAorICogd2l0aCB0aGUgYmxvY2tfcnN2LiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpdCB3aWxsIG1ha2UgYW4gYXR0ZW1wdCB0bworICogZmx1c2ggb3V0IHNwYWNlIHRvIG1ha2Ugcm9vbS4gIEl0IHdpbGwgZG8gdGhpcyBieSBmbHVzaGluZyBkZWxhbGxvYyBpZgorICogcG9zc2libGUgb3IgY29tbWl0dGluZyB0aGUgdHJhbnNhY3Rpb24uICBJZiBmbHVzaCBpcyAwIHRoZW4gbm8gYXR0ZW1wdHMgdG8KKyAqIHJlZ2FpbiByZXNlcnZhdGlvbnMgd2lsbCBiZSBtYWRlIGFuZCB0aGlzIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoCisgKiBzcGFjZSBhbHJlYWR5LgorICovCitzdGF0aWMgaW50IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCiAJCQkJICB1NjQgb3JpZ19ieXRlcywgaW50IGZsdXNoKQogewogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvID0gYmxvY2tfcnN2LT5zcGFjZV9pbmZvOwotCXU2NCB1bnVzZWQ7CisJdTY0IHVzZWQ7CiAJdTY0IG51bV9ieXRlcyA9IG9yaWdfYnl0ZXM7CiAJaW50IHJldHJpZXMgPSAwOwogCWludCByZXQgPSAwOwogCWJvb2wgY29tbWl0dGVkID0gZmFsc2U7CiAJYm9vbCBmbHVzaGluZyA9IGZhbHNlOworCWJvb2wgd2FpdF9vcmRlcmVkID0gZmFsc2U7CiAKIGFnYWluOgogCXJldCA9IDA7CkBAIC0zNDE5LDcgKzM1MTUsNyBAQAogCQkgKiBkZWFkbG9jayBzaW5jZSB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIGZsdXNoZXIgdG8gZmluaXNoLCBidXQKIAkJICogaG9sZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBvcGVuLgogCQkgKi8KLQkJaWYgKHRyYW5zKQorCQlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzcGFjZV9pbmZvLT53YWl0LAogCQkJCQkgICAgICAgIXNwYWNlX2luZm8tPmZsdXNoKTsKQEAgLTM0MzEsOSArMzUyNyw5IEBACiAJfQogCiAJcmV0ID0gLUVOT1NQQzsKLQl1bnVzZWQgPSBzcGFjZV9pbmZvLT5ieXRlc191c2VkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKwotCQkgc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwotCQkgc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZTsKKwl1c2VkID0gc3BhY2VfaW5mby0+Ynl0ZXNfdXNlZCArIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKworCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwogCiAJLyoKIAkgKiBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgd2UndmUgbm90IGFscmVhZHkgb3Zlci1yZXNlcnZlZCB0aGUgYmxvY2sgZ3JvdXAKQEAgLTM0NDIsMTAgKzM1MzgsOSBAQAogCSAqIGxldHMgc3RhcnQgZmx1c2hpbmcgc3R1ZmYgZmlyc3QgYW5kIHRoZW4gY29tZSBiYWNrIGFuZCB0cnkgdG8gbWFrZQogCSAqIG91ciByZXNlcnZhdGlvbi4KIAkgKi8KLQlpZiAodW51c2VkIDw9IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzKSB7Ci0JCXVudXNlZCA9IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzIC0gdW51c2VkOwotCQlpZiAodW51c2VkID49IG51bV9ieXRlcykgewotCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gb3JpZ19ieXRlczsKKwlpZiAodXNlZCA8PSBzcGFjZV9pbmZvLT50b3RhbF9ieXRlcykgeworCQlpZiAodXNlZCArIG9yaWdfYnl0ZXMgPD0gc3BhY2VfaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkJCXNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgKz0gb3JpZ19ieXRlczsKIAkJCXJldCA9IDA7CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMzQ2MSwxMCArMzU1Niw2NCBAQAogCQkgKiBhbW91bnQgcGx1cyB0aGUgYW1vdW50IG9mIGJ5dGVzIHRoYXQgd2UgbmVlZCBmb3IgdGhpcwogCQkgKiByZXNlcnZhdGlvbi4KIAkJICovCi0JCW51bV9ieXRlcyA9IHVudXNlZCAtIHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsKKwkJd2FpdF9vcmRlcmVkID0gdHJ1ZTsKKwkJbnVtX2J5dGVzID0gdXNlZCAtIHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsKIAkJCShvcmlnX2J5dGVzICogKHJldHJpZXMgKyAxKSk7CiAJfQogCisJaWYgKHJldCkgeworCQl1NjQgcHJvZmlsZSA9IGJ0cmZzX2dldF9hbGxvY19wcm9maWxlKHJvb3QsIDApOworCQl1NjQgYXZhaWw7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhIGxvdCBvZiBzcGFjZSB0aGF0J3MgcGlubmVkLCBkb24ndCBib3RoZXIgZG9pbmcKKwkJICogdGhlIG92ZXJjb21taXQgZGFuY2UgeWV0IGFuZCBqdXN0IGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlhdmFpbCA9IChzcGFjZV9pbmZvLT50b3RhbF9ieXRlcyAtIHNwYWNlX2luZm8tPmJ5dGVzX3VzZWQpICogODsKKwkJZG9fZGl2KGF2YWlsLCAxMCk7CisJCWlmIChzcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgPj0gYXZhaWwgJiYgZmx1c2ggJiYgIWNvbW1pdHRlZCkgeworCQkJc3BhY2VfaW5mby0+Zmx1c2ggPSAxOworCQkJZmx1c2hpbmcgPSB0cnVlOworCQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworCQkJcmV0ID0gbWF5X2NvbW1pdF90cmFuc2FjdGlvbihyb290LCBzcGFjZV9pbmZvLAorCQkJCQkJICAgICBvcmlnX2J5dGVzLCAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQljb21taXR0ZWQgPSB0cnVlOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwkJYXZhaWwgPSByb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgZHVwLCByYWlkMSBvciByYWlkMTAgdGhlbiBvbmx5IGhhbGYgb2YgdGhlIGZyZWUKKwkJICogc3BhY2UgaXMgYWN0dWFsbHkgdXNlYWJsZS4KKwkJICovCisJCWlmIChwcm9maWxlICYgKEJUUkZTX0JMT0NLX0dST1VQX0RVUCB8CisJCQkgICAgICAgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEgfAorCQkJICAgICAgIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkpCisJCQlhdmFpbCA+Pj0gMTsKKworCQkvKgorCQkgKiBJZiB3ZSBhcmVuJ3QgZmx1c2hpbmcgZG9uJ3QgbGV0IHVzIG92ZXJjb21taXQgdG9vIG11Y2gsIHNheQorCQkgKiAxLzh0aCBvZiB0aGUgc3BhY2UuICBJZiB3ZSBjYW4gZmx1c2gsIGxldCBpdCBvdmVyY29tbWl0IHVwIHRvCisJCSAqIDEvMiBvZiB0aGUgc3BhY2UuCisJCSAqLworCQlpZiAoZmx1c2gpCisJCQlhdmFpbCA+Pj0gMzsKKwkJZWxzZQorCQkJYXZhaWwgPj49IDE7CisJCSBzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKworCQlpZiAodXNlZCArIG51bV9ieXRlcyA8IHNwYWNlX2luZm8tPnRvdGFsX2J5dGVzICsgYXZhaWwpIHsKKwkJCXNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgKz0gb3JpZ19ieXRlczsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSB7CisJCQl3YWl0X29yZGVyZWQgPSB0cnVlOworCQl9CisJfQorCiAJLyoKIAkgKiBDb3VsZG4ndCBtYWtlIG91ciByZXNlcnZhdGlvbiwgc2F2ZSBvdXIgcGxhY2Ugc28gd2hpbGUgd2UncmUgdHJ5aW5nCiAJICogdG8gcmVjbGFpbSBzcGFjZSB3ZSBjYW4gYWN0dWFsbHkgdXNlIGl0IGluc3RlYWQgb2Ygc29tZWJvZHkgZWxzZQpAQCAtMzQ4NCw3ICszNjMzLDcgQEAKIAkgKiBXZSBkbyBzeW5jaHJvbm91cyBzaHJpbmtpbmcgc2luY2Ugd2UgZG9uJ3QgYWN0dWFsbHkgdW5yZXNlcnZlCiAJICogbWV0YWRhdGEgdW50aWwgYWZ0ZXIgdGhlIElPIGlzIGNvbXBsZXRlZC4KIAkgKi8KLQlyZXQgPSBzaHJpbmtfZGVsYWxsb2ModHJhbnMsIHJvb3QsIG51bV9ieXRlcywgMSk7CisJcmV0ID0gc2hyaW5rX2RlbGFsbG9jKHJvb3QsIG51bV9ieXRlcywgd2FpdF9vcmRlcmVkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTM0OTYsMzUgKzM2NDUsMTcgQEAKIAkgKiBzbyBnbyBiYWNrIGFyb3VuZCBhbmQgdHJ5IGFnYWluLgogCSAqLwogCWlmIChyZXRyaWVzIDwgMikgeworCQl3YWl0X29yZGVyZWQgPSB0cnVlOwogCQlyZXRyaWVzKys7CiAJCWdvdG8gYWdhaW47CiAJfQogCi0JLyoKLQkgKiBOb3QgZW5vdWdoIHNwYWNlIHRvIGJlIHJlY2xhaW1lZCwgZG9uJ3QgYm90aGVyIGNvbW1pdHRpbmcgdGhlCi0JICogdHJhbnNhY3Rpb24uCi0JICovCi0Jc3Bpbl9sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKLQlpZiAoc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkIDwgb3JpZ19ieXRlcykKLQkJcmV0ID0gLUVOT1NQQzsKLQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSAtRUFHQUlOOwotCWlmICh0cmFucykKLQkJZ290byBvdXQ7Ci0KIAlyZXQgPSAtRU5PU1BDOwogCWlmIChjb21taXR0ZWQpCiAJCWdvdG8gb3V0OwogCi0JdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwotCWlmIChJU19FUlIodHJhbnMpKQotCQlnb3RvIG91dDsKLQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCXJldCA9IG1heV9jb21taXRfdHJhbnNhY3Rpb24ocm9vdCwgc3BhY2VfaW5mbywgb3JpZ19ieXRlcywgMCk7CiAJaWYgKCFyZXQpIHsKLQkJdHJhbnMgPSBOVUxMOwogCQljb21taXR0ZWQgPSB0cnVlOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTM1NDIsMTAgKzM2NzMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpnZXRfYmxvY2tfcnN2KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKLQlpZiAocm9vdC0+cmVmX2Nvd3MpCisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gTlVMTDsKKworCWlmIChyb290LT5yZWZfY293cyB8fCByb290ID09IHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdCkKIAkJYmxvY2tfcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQllbHNlCisKKwlpZiAoIWJsb2NrX3JzdikKIAkJYmxvY2tfcnN2ID0gcm9vdC0+YmxvY2tfcnN2OwogCiAJaWYgKCFibG9ja19yc3YpCkBAIC0zNjE2LDcgKzM3NDksNyBAQAogCQl9CiAJCWlmIChudW1fYnl0ZXMpIHsKIAkJCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JCQlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIC09IG51bV9ieXRlczsKIAkJCXNwYWNlX2luZm8tPnJlc2VydmF0aW9uX3Byb2dyZXNzKys7CiAJCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJCX0KQEAgLTM2NDAsOSArMzc3Myw2IEBACiB7CiAJbWVtc2V0KHJzdiwgMCwgc2l6ZW9mKCpyc3YpKTsKIAlzcGluX2xvY2tfaW5pdCgmcnN2LT5sb2NrKTsKLQlhdG9taWNfc2V0KCZyc3YtPnVzYWdlLCAxKTsKLQlyc3YtPnByaW9yaXR5ID0gNjsKLQlJTklUX0xJU1RfSEVBRCgmcnN2LT5saXN0KTsKIH0KIAogc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYnRyZnNfYWxsb2NfYmxvY2tfcnN2KHN0cnVjdCBidHJmc19yb290ICpyb290KQpAQCAtMzY2MywzOCArMzc5MywyMCBAQAogdm9pZCBidHJmc19mcmVlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2KQogewotCWlmIChyc3YgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmcnN2LT51c2FnZSkpIHsKLQkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgcnN2LCAodTY0KS0xKTsKLQkJaWYgKCFyc3YtPmR1cmFibGUpCi0JCQlrZnJlZShyc3YpOwotCX0KKwlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCByc3YsICh1NjQpLTEpOworCWtmcmVlKHJzdik7CiB9CiAKLS8qCi0gKiBtYWtlIHRoZSBibG9ja19yc3Ygc3RydWN0IGJlIGFibGUgdG8gY2FwdHVyZSBmcmVlZCBzcGFjZS4KLSAqIHRoZSBjYXB0dXJlZCBzcGFjZSB3aWxsIHJlLWFkZCB0byB0aGUgdGhlIGJsb2NrX3JzdiBzdHJ1Y3QKLSAqIGFmdGVyIHRyYW5zYWN0aW9uIGNvbW1pdAotICovCi12b2lkIGJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3JzdihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2KQotewotCWJsb2NrX3Jzdi0+ZHVyYWJsZSA9IDE7Ci0JbXV0ZXhfbG9jaygmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmJsb2NrX3Jzdi0+bGlzdCwgJmZzX2luZm8tPmR1cmFibGVfYmxvY2tfcnN2X2xpc3QpOwotCW11dGV4X3VubG9jaygmZnNfaW5mby0+ZHVyYWJsZV9ibG9ja19yc3ZfbXV0ZXgpOwotfQotCi1pbnQgYnRyZnNfYmxvY2tfcnN2X2FkZChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2LAotCQkJdTY0IG51bV9ieXRlcykKK3N0YXRpYyBpbmxpbmUgaW50IF9fYmxvY2tfcnN2X2FkZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCQkgIHU2NCBudW1fYnl0ZXMsIGludCBmbHVzaCkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKG51bV9ieXRlcyA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXModHJhbnMsIHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAxKTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCBmbHVzaCk7CiAJaWYgKCFyZXQpIHsKIAkJYmxvY2tfcnN2X2FkZF9ieXRlcyhibG9ja19yc3YsIG51bV9ieXRlcywgMSk7CiAJCXJldHVybiAwOwpAQCAtMzcwMyw1NSArMzgxNSw2NiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBidHJmc19ibG9ja19yc3ZfY2hlY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAotCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCi0JCQkgIHU2NCBtaW5fcmVzZXJ2ZWQsIGludCBtaW5fZmFjdG9yKQoraW50IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCisJCQl1NjQgbnVtX2J5dGVzKQoreworCXJldHVybiBfX2Jsb2NrX3Jzdl9hZGQocm9vdCwgYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDEpOworfQorCitpbnQgYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCQl1NjQgbnVtX2J5dGVzKQoreworCXJldHVybiBfX2Jsb2NrX3Jzdl9hZGQocm9vdCwgYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDApOworfQorCitpbnQgYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICBzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsIGludCBtaW5fZmFjdG9yKQogewogCXU2NCBudW1fYnl0ZXMgPSAwOwotCWludCBjb21taXRfdHJhbnMgPSAwOwogCWludCByZXQgPSAtRU5PU1BDOwogCiAJaWYgKCFibG9ja19yc3YpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCWlmIChtaW5fZmFjdG9yID4gMCkKLQkJbnVtX2J5dGVzID0gZGl2X2ZhY3RvcihibG9ja19yc3YtPnNpemUsIG1pbl9mYWN0b3IpOwotCWlmIChtaW5fcmVzZXJ2ZWQgPiBudW1fYnl0ZXMpCi0JCW51bV9ieXRlcyA9IG1pbl9yZXNlcnZlZDsKLQotCWlmIChibG9ja19yc3YtPnJlc2VydmVkID49IG51bV9ieXRlcykgeworCW51bV9ieXRlcyA9IGRpdl9mYWN0b3IoYmxvY2tfcnN2LT5zaXplLCBtaW5fZmFjdG9yKTsKKwlpZiAoYmxvY2tfcnN2LT5yZXNlcnZlZCA+PSBudW1fYnl0ZXMpCiAJCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJbnVtX2J5dGVzIC09IGJsb2NrX3Jzdi0+cmVzZXJ2ZWQ7Ci0JCWlmIChibG9ja19yc3YtPmR1cmFibGUgJiYKLQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbMF0gKyBibG9ja19yc3YtPmZyZWVkWzFdID49IG51bV9ieXRlcykKLQkJCWNvbW1pdF90cmFucyA9IDE7Ci0JfQogCXNwaW5fdW5sb2NrKCZibG9ja19yc3YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdiwKKwkJCSAgdTY0IG1pbl9yZXNlcnZlZCkKK3sKKwl1NjQgbnVtX2J5dGVzID0gMDsKKwlpbnQgcmV0ID0gLUVOT1NQQzsKKworCWlmICghYmxvY2tfcnN2KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmYmxvY2tfcnN2LT5sb2NrKTsKKwludW1fYnl0ZXMgPSBtaW5fcmVzZXJ2ZWQ7CisJaWYgKGJsb2NrX3Jzdi0+cmVzZXJ2ZWQgPj0gbnVtX2J5dGVzKQorCQlyZXQgPSAwOworCWVsc2UKKwkJbnVtX2J5dGVzIC09IGJsb2NrX3Jzdi0+cmVzZXJ2ZWQ7CisJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7CisKIAlpZiAoIXJldCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYmxvY2tfcnN2LT5yZWZpbGxfdXNlZCkgewotCQlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHRyYW5zLCByb290LCBibG9ja19yc3YsCi0JCQkJCSAgICAgbnVtX2J5dGVzLCAwKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWJsb2NrX3Jzdl9hZGRfYnl0ZXMoYmxvY2tfcnN2LCBudW1fYnl0ZXMsIDApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoY29tbWl0X3RyYW5zKSB7Ci0JCWlmICh0cmFucykKLQkJCXJldHVybiAtRUFHQUlOOwotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7Ci0JCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAxKTsKKwlpZiAoIXJldCkgeworCQlibG9ja19yc3ZfYWRkX2J5dGVzKGJsb2NrX3JzdiwgbnVtX2J5dGVzLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIC1FTk9TUEM7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnNyY19yc3YsCkBAIC0zNzgzLDcgKzM5MDYsNyBAQAogCXU2NCBudW1fYnl0ZXM7CiAJdTY0IG1ldGFfdXNlZDsKIAl1NjQgZGF0YV91c2VkOwotCWludCBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoJmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWludCBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAlzaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpOwogCXNwaW5fbG9jaygmc2luZm8tPmxvY2spOwpAQCAtMzgyNywxMiArMzk1MCwxMiBAQAogCWlmIChzaW5mby0+dG90YWxfYnl0ZXMgPiBudW1fYnl0ZXMpIHsKIAkJbnVtX2J5dGVzID0gc2luZm8tPnRvdGFsX2J5dGVzIC0gbnVtX2J5dGVzOwogCQlibG9ja19yc3YtPnJlc2VydmVkICs9IG51bV9ieXRlczsKLQkJc2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IG51bV9ieXRlczsKKwkJc2luZm8tPmJ5dGVzX21heV91c2UgKz0gbnVtX2J5dGVzOwogCX0KIAogCWlmIChibG9ja19yc3YtPnJlc2VydmVkID49IGJsb2NrX3Jzdi0+c2l6ZSkgewogCQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnJlc2VydmVkIC0gYmxvY2tfcnN2LT5zaXplOwotCQlzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCQlzaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSBudW1fYnl0ZXM7CiAJCXNpbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzcysrOwogCQlibG9ja19yc3YtPnJlc2VydmVkID0gYmxvY2tfcnN2LT5zaXplOwogCQlibG9ja19yc3YtPmZ1bGwgPSAxOwpAQCAtMzg0OCwxNiArMzk3MSwxMyBAQAogCiAJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTSk7CiAJZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwotCWZzX2luZm8tPmNodW5rX2Jsb2NrX3Jzdi5wcmlvcml0eSA9IDEwOwogCiAJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBKTsKIAlmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwotCWZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3YucHJpb3JpdHkgPSAxMDsKLQlmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LnJlZmlsbF91c2VkID0gMTsKIAlmc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3Yuc3BhY2VfaW5mbyA9IHNwYWNlX2luZm87CiAJZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2LnNwYWNlX2luZm8gPSBzcGFjZV9pbmZvOwogCWZzX2luZm8tPmVtcHR5X2Jsb2NrX3Jzdi5zcGFjZV9pbmZvID0gc3BhY2VfaW5mbzsKLQlmc19pbmZvLT5lbXB0eV9ibG9ja19yc3YucHJpb3JpdHkgPSAxMDsKKwlmc19pbmZvLT5kZWxheWVkX2Jsb2NrX3Jzdi5zcGFjZV9pbmZvID0gc3BhY2VfaW5mbzsKIAogCWZzX2luZm8tPmV4dGVudF9yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAlmc19pbmZvLT5jc3VtX3Jvb3QtPmJsb2NrX3JzdiA9ICZmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OwpAQCAtMzg2NSwxMCArMzk4NSw2IEBACiAJZnNfaW5mby0+dHJlZV9yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdjsKIAlmc19pbmZvLT5jaHVua19yb290LT5ibG9ja19yc3YgPSAmZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2OwogCi0JYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KGZzX2luZm8sICZmc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2KTsKLQotCWJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3Jzdihmc19pbmZvLCAmZnNfaW5mby0+ZGVsYWxsb2NfYmxvY2tfcnN2KTsKLQogCXVwZGF0ZV9nbG9iYWxfYmxvY2tfcnN2KGZzX2luZm8pOwogfQogCkBAIC0zODgxLDM3ICszOTk3LDggQEAKIAlXQVJOX09OKGZzX2luZm8tPnRyYW5zX2Jsb2NrX3Jzdi5yZXNlcnZlZCA+IDApOwogCVdBUk5fT04oZnNfaW5mby0+Y2h1bmtfYmxvY2tfcnN2LnNpemUgPiAwKTsKIAlXQVJOX09OKGZzX2luZm8tPmNodW5rX2Jsb2NrX3Jzdi5yZXNlcnZlZCA+IDApOwotfQotCi1pbnQgYnRyZnNfdHJ1bmNhdGVfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCi0JCQkJICAgIHN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdikKLXsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICp0cmFuc19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwotCXU2NCBudW1fYnl0ZXM7Ci0JaW50IHJldDsKLQotCS8qCi0JICogVHJ1bmNhdGUgc2hvdWxkIGJlIGZyZWVpbmcgZGF0YSwgYnV0IGdpdmUgdXMgMiBpdGVtcyBqdXN0IGluIGNhc2UgaXQKLQkgKiBuZWVkcyB0byB1c2Ugc29tZSBzcGFjZS4gIFdlIG1heSB3YW50IHRvIGJlIHNtYXJ0ZXIgYWJvdXQgdGhpcyBpbiB0aGUKLQkgKiBmdXR1cmUuCi0JICovCi0JbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIDIpOwotCi0JLyogV2UgYWxyZWFkeSBoYXZlIGVub3VnaCBieXRlcywganVzdCByZXR1cm4gKi8KLQlpZiAocnN2LT5yZXNlcnZlZCA+PSBudW1fYnl0ZXMpCi0JCXJldHVybiAwOwotCi0JbnVtX2J5dGVzIC09IHJzdi0+cmVzZXJ2ZWQ7Ci0KLQkvKgotCSAqIFlvdSBzaG91bGQgaGF2ZSByZXNlcnZlZCBlbm91Z2ggc3BhY2UgYmVmb3JlIGhhbmQgdG8gZG8gdGhpcywgc28gdGhpcwotCSAqIHNob3VsZCBub3QgZmFpbC4KLQkgKi8KLQlyZXQgPSBibG9ja19yc3ZfbWlncmF0ZV9ieXRlcyh0cmFuc19yc3YsIHJzdiwgbnVtX2J5dGVzKTsKLQlCVUdfT04ocmV0KTsKLQotCXJldHVybiAwOworCVdBUk5fT04oZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3Yuc2l6ZSA+IDApOworCVdBUk5fT04oZnNfaW5mby0+ZGVsYXllZF9ibG9ja19yc3YucmVzZXJ2ZWQgPiAwKTsKIH0KIAogdm9pZCBidHJmc190cmFuc19yZWxlYXNlX21ldGFkYXRhKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMzkyMCw5ICs0MDA3LDcgQEAKIAlpZiAoIXRyYW5zLT5ieXRlc19yZXNlcnZlZCkKIAkJcmV0dXJuOwogCi0JQlVHX09OKHRyYW5zLT5ibG9ja19yc3YgIT0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3Jzdik7Ci0JYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgdHJhbnMtPmJsb2NrX3JzdiwKLQkJCQl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQpOworCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIHRyYW5zLT5ibG9ja19yc3YsIHRyYW5zLT5ieXRlc19yZXNlcnZlZCk7CiAJdHJhbnMtPmJ5dGVzX3Jlc2VydmVkID0gMDsKIH0KIApAQCAtMzk2NCwzMyArNDA0OSw5OSBAQAogCXJldHVybiBibG9ja19yc3ZfbWlncmF0ZV9ieXRlcyhzcmNfcnN2LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwogfQogCisvKioKKyAqIGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50IC0gZHJvcCBhbiBvdXRzdGFuZGluZyBleHRlbnQKKyAqIEBpbm9kZTogdGhlIGlub2RlIHdlJ3JlIGRyb3BwaW5nIHRoZSBleHRlbnQgZm9yCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBhcmUgZnJlZWluZyB1cCBhbiBvdXRzdGFuZGluZyBleHRlbnQsIGVpdGhlciBjYWxsZWQKKyAqIGFmdGVyIGFuIGVycm9yIG9yIGFmdGVyIGFuIGV4dGVudCBpcyB3cml0dGVuLiAgVGhpcyB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mCisgKiByZXNlcnZlZCBleHRlbnRzIHRoYXQgbmVlZCB0byBiZSBmcmVlZC4gIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aAorICogQlRSRlNfSShpbm9kZSktPmxvY2sgaGVsZC4KKyAqLwogc3RhdGljIHVuc2lnbmVkIGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJdW5zaWduZWQgZHJvcF9pbm9kZV9zcGFjZSA9IDA7CiAJdW5zaWduZWQgZHJvcHBlZF9leHRlbnRzID0gMDsKIAotCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCUJVR19PTighQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOwogCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzLS07CiAKKwlpZiAoQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgPT0gMCAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCkgeworCQlkcm9wX2lub2RlX3NwYWNlID0gMTsKKwkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOworCX0KKwogCS8qCiAJICogSWYgd2UgaGF2ZSBtb3JlIG9yIHRoZSBzYW1lIGFtb3VudCBvZiBvdXRzYW5kaW5nIGV4dGVudHMgdGhhbiB3ZSBoYXZlCiAJICogcmVzZXJ2ZWQgdGhlbiB3ZSBuZWVkIHRvIGxlYXZlIHRoZSByZXNlcnZlZCBleHRlbnRzIGNvdW50IGFsb25lLgogCSAqLwogCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyA+PQogCSAgICBCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cykKLQkJZ290byBvdXQ7CisJCXJldHVybiBkcm9wX2lub2RlX3NwYWNlOwogCiAJZHJvcHBlZF9leHRlbnRzID0gQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMgLQogCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50czsKIAlCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cyAtPSBkcm9wcGVkX2V4dGVudHM7Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKLQlyZXR1cm4gZHJvcHBlZF9leHRlbnRzOworCXJldHVybiBkcm9wcGVkX2V4dGVudHMgKyBkcm9wX2lub2RlX3NwYWNlOwogfQogCi1zdGF0aWMgdTY0IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBudW1fYnl0ZXMpCisvKioKKyAqIGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplIC0gcmV0dXJuIHRoZSBhbW91bnQgb2YgbWV0YWRhIHNwYWNlIHRoYXQgbXVzdCBiZQorICoJcmVzZXJ2ZWQvZnJlZSdkIGZvciB0aGUgZ2l2ZW4gYnl0ZXMuCisgKiBAaW5vZGU6IHRoZSBpbm9kZSB3ZSdyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KKyAqIEByZXNlcnZlOiAxIGlmIHdlIGFyZSByZXNlcnZpbmcgc3BhY2UsIDAgaWYgd2UgYXJlIGZyZWVpbmcgc3BhY2UKKyAqCisgKiBUaGlzIGFkanVzdHMgdGhlIG51bWJlciBvZiBjc3VtX2J5dGVzIGluIHRoZSBpbm9kZSBhbmQgdGhlbiByZXR1cm5zIHRoZQorICogY29ycmVjdCBhbW91bnQgb2YgbWV0YWRhdGEgdGhhdCBtdXN0IGVpdGhlciBiZSByZXNlcnZlZCBvciBmcmVlZC4gIFdlCisgKiBjYWxjdWxhdGUgaG93IG1hbnkgY2hlY2tzdW1zIHdlIGNhbiBmaXQgaW50byBvbmUgbGVhZiBhbmQgdGhlbiBkaXZpZGUgdGhlCisgKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIG5lZWQgdG8gYmUgY2hlY2tzdW1lZCBieSB0aGlzIHZhbHVlIHRvIGZpZ3VyZSBvdXQKKyAqIGhvdyBtYW55IGNoZWNrc3VtcyB3aWxsIGJlIHJlcXVpcmVkLiAgSWYgd2UgYXJlIGFkZGluZyBieXRlcyB0aGVuIHRoZSBudW1iZXIKKyAqIG1heSBnbyB1cCBhbmQgd2Ugd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzIHRoYXQgbXVzdCBiZQorICogcmVzZXJ2ZWQuICBJZiBpdCBpcyBnb2luZyBkb3duIHdlIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0CisgKiBiZSBmcmVlZC4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggQlRSRlNfSShpbm9kZSktPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHU2NCBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzLAorCQkJCSAgIGludCByZXNlcnZlKQogewotCXJldHVybiBudW1fYnl0ZXMgPj49IDM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1NjQgY3N1bV9zaXplOworCWludCBudW1fY3N1bXNfcGVyX2xlYWY7CisJaW50IG51bV9jc3VtczsKKwlpbnQgb2xkX2NzdW1zOworCisJaWYgKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+Y3N1bV9ieXRlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCW9sZF9jc3VtcyA9IChpbnQpZGl2NjRfdTY0KEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwlpZiAocmVzZXJ2ZSkKKwkJQlRSRlNfSShpbm9kZSktPmNzdW1fYnl0ZXMgKz0gbnVtX2J5dGVzOworCWVsc2UKKwkJQlRSRlNfSShpbm9kZSktPmNzdW1fYnl0ZXMgLT0gbnVtX2J5dGVzOworCWNzdW1fc2l6ZSA9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpIC0gc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKTsKKwludW1fY3N1bXNfcGVyX2xlYWYgPSAoaW50KWRpdjY0X3U2NChjc3VtX3NpemUsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2NzdW1faXRlbSkgKworCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19kaXNrX2tleSkpOworCW51bV9jc3VtcyA9IChpbnQpZGl2NjRfdTY0KEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwludW1fY3N1bXMgPSBudW1fY3N1bXMgKyBudW1fY3N1bXNfcGVyX2xlYWYgLSAxOworCW51bV9jc3VtcyA9IG51bV9jc3VtcyAvIG51bV9jc3Vtc19wZXJfbGVhZjsKKworCW9sZF9jc3VtcyA9IG9sZF9jc3VtcyArIG51bV9jc3Vtc19wZXJfbGVhZiAtIDE7CisJb2xkX2NzdW1zID0gb2xkX2NzdW1zIC8gbnVtX2NzdW1zX3Blcl9sZWFmOworCisJLyogTm8gY2hhbmdlLCBubyBuZWVkIHRvIHJlc2VydmUgbW9yZSAqLworCWlmIChvbGRfY3N1bXMgPT0gbnVtX2NzdW1zKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXNlcnZlKQorCQlyZXR1cm4gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsCisJCQkJCQkgICAgICBudW1fY3N1bXMgLSBvbGRfY3N1bXMpOworCisJcmV0dXJuIGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBvbGRfY3N1bXMgLSBudW1fY3N1bXMpOwogfQogCiBpbnQgYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQpAQCAtMzk5OSw5ICs0MTUwLDEzIEBACiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAl1NjQgdG9fcmVzZXJ2ZSA9IDA7CiAJdW5zaWduZWQgbnJfZXh0ZW50cyA9IDA7CisJaW50IGZsdXNoID0gMTsKIAlpbnQgcmV0OwogCi0JaWYgKGJ0cmZzX3RyYW5zYWN0aW9uX2luX2NvbW1pdChyb290LT5mc19pbmZvKSkKKwlpZiAoYnRyZnNfaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkpCisJCWZsdXNoID0gMDsKKworCWlmIChmbHVzaCAmJiBidHJmc190cmFuc2FjdGlvbl9pbl9jb21taXQocm9vdC0+ZnNfaW5mbykpCiAJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CiAKIAludW1fYnl0ZXMgPSBBTElHTihudW1fYnl0ZXMsIHJvb3QtPnNlY3RvcnNpemUpOwpAQCAtNDAxNCwyMSArNDE2OSw0MSBAQAogCQlucl9leHRlbnRzID0gQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgLQogCQkJQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHM7CiAJCUJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzICs9IG5yX2V4dGVudHM7Ci0KLQkJdG9fcmVzZXJ2ZSA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBucl9leHRlbnRzKTsKIAl9CisKKwkvKgorCSAqIEFkZCBhbiBpdGVtIHRvIHJlc2VydmUgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSB3aGVuIHdlIGNvbXBsZXRlIHRoZQorCSAqIGRlbGFsbG9jIGlvLgorCSAqLworCWlmICghQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQpIHsKKwkJbnJfZXh0ZW50cysrOworCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfbWV0YV9yZXNlcnZlZCA9IDE7CisJfQorCisJdG9fcmVzZXJ2ZSA9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBucl9leHRlbnRzKTsKKwl0b19yZXNlcnZlICs9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMsIDEpOwogCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAKLQl0b19yZXNlcnZlICs9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMpOwotCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMoTlVMTCwgcm9vdCwgYmxvY2tfcnN2LCB0b19yZXNlcnZlLCAxKTsKKwlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgdG9fcmVzZXJ2ZSwgZmx1c2gpOwogCWlmIChyZXQpIHsKKwkJdTY0IHRvX2ZyZWUgPSAwOwogCQl1bnNpZ25lZCBkcm9wcGVkOwotCQkvKgotCQkgKiBXZSBkb24ndCBuZWVkIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugb3VyIHJlc2VydmF0aW9uIGZhaWxlZCwKLQkJICogd2UganVzdCBuZWVkIHRvIGNsZWFuIHVwIG91ciBjb3VudGVyLgotCQkgKi8KKworCQlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAkJZHJvcHBlZCA9IGRyb3Bfb3V0c3RhbmRpbmdfZXh0ZW50KGlub2RlKTsKLQkJV0FSTl9PTihkcm9wcGVkID4gMSk7CisJCXRvX2ZyZWUgPSBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShpbm9kZSwgbnVtX2J5dGVzLCAwKTsKKwkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKKwkJdG9fZnJlZSArPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgZHJvcHBlZCk7CisKKwkJLyoKKwkJICogU29tZWJvZHkgY291bGQgaGF2ZSBjb21lIGluIGFuZCB0d2lkZGxlZCB3aXRoIHRoZQorCQkgKiByZXNlcnZhdGlvbiwgc28gaWYgd2UgaGF2ZSB0byBmcmVlIG1vcmUgdGhhbiB3ZSB3b3VsZCBoYXZlCisJCSAqIHJlc2VydmVkIGZyb20gdGhpcyByZXNlcnZhdGlvbiBnbyBhaGVhZCBhbmQgcmVsZWFzZSB0aG9zZQorCQkgKiBieXRlcy4KKwkJICovCisJCXRvX2ZyZWUgLT0gdG9fcmVzZXJ2ZTsKKwkJaWYgKHRvX2ZyZWUpCisJCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCBibG9ja19yc3YsIHRvX2ZyZWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDAzNyw2ICs0MjEyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YSAtIHJlbGVhc2UgYSBtZXRhZGF0YSByZXNlcnZhdGlvbiBmb3IgYW4gaW5vZGUKKyAqIEBpbm9kZTogdGhlIGlub2RlIHRvIHJlbGVhc2UgdGhlIHJlc2VydmF0aW9uIGZvcgorICogQG51bV9ieXRlczogdGhlIG51bWJlciBvZiBieXRlcyB3ZSdyZSByZWxlYXNpbmcKKyAqCisgKiBUaGlzIHdpbGwgcmVsZWFzZSB0aGUgbWV0YWRhdGEgcmVzZXJ2YXRpb24gZm9yIGFuIGlub2RlLiAgVGhpcyBjYW4gYmUgY2FsbGVkCisgKiBvbmNlIHdlIGNvbXBsZXRlIElPIGZvciBhIGdpdmVuIHNldCBvZiBieXRlcyB0byByZWxlYXNlIHRoZWlyIG1ldGFkYXRhCisgKiByZXNlcnZhdGlvbnMuCisgKi8KIHZvaWQgYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CkBAIC00MDQ0LDkgKzQyMjgsMTEgQEAKIAl1bnNpZ25lZCBkcm9wcGVkOwogCiAJbnVtX2J5dGVzID0gQUxJR04obnVtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAlkcm9wcGVkID0gZHJvcF9vdXRzdGFuZGluZ19leHRlbnQoaW5vZGUpOwogCi0JdG9fZnJlZSA9IGNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMpOworCXRvX2ZyZWUgPSBjYWxjX2NzdW1fbWV0YWRhdGFfc2l6ZShpbm9kZSwgbnVtX2J5dGVzLCAwKTsKKwlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCWlmIChkcm9wcGVkID4gMCkKIAkJdG9fZnJlZSArPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgZHJvcHBlZCk7CiAKQEAgLTQwNTQsNiArNDI0MCwyMSBAQAogCQkJCXRvX2ZyZWUpOwogfQogCisvKioKKyAqIGJ0cmZzX2RlbGFsbG9jX3Jlc2VydmVfc3BhY2UgLSByZXNlcnZlIGRhdGEgYW5kIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYworICogQGlub2RlOiBpbm9kZSB3ZSdyZSB3cml0aW5nIHRvCisgKiBAbnVtX2J5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdhbnQgdG8gYWxsb2NhdGUKKyAqCisgKiBUaGlzIHdpbGwgZG8gdGhlIGZvbGxvd2luZyB0aGluZ3MKKyAqCisgKiBvIHJlc2VydmUgc3BhY2UgaW4gdGhlIGRhdGEgc3BhY2UgaW5mbyBmb3IgbnVtX2J5dGVzCisgKiBvIHJlc2VydmUgc3BhY2UgaW4gdGhlIG1ldGFkYXRhIHNwYWNlIGluZm8gYmFzZWQgb24gbnVtYmVyIG9mIG91dHN0YW5kaW5nCisgKiAgIGV4dGVudHMgYW5kIGhvdyBtdWNoIGNzdW1zIHdpbGwgYmUgbmVlZGVkCisgKiBvIGFkZCB0byB0aGUgaW5vZGVzIC0+ZGVsYWxsb2NfYnl0ZXMKKyAqIG8gYWRkIGl0IHRvIHRoZSBmc19pbmZvJ3MgZGVsYWxsb2MgaW5vZGVzIGxpc3QuCisgKgorICogVGhpcyB3aWxsIHJldHVybiAwIGZvciBzdWNjZXNzIGFuZCAtRU5PU1BDIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGxlZnQuCisgKi8KIGludCBidHJmc19kZWxhbGxvY19yZXNlcnZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBudW1fYnl0ZXMpCiB7CiAJaW50IHJldDsKQEAgLTQwNzEsNiArNDI3MiwxOSBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UgLSByZWxlYXNlIGRhdGEgYW5kIG1ldGFkYXRhIHNwYWNlIGZvciBkZWxhbGxvYworICogQGlub2RlOiBpbm9kZSB3ZSdyZSByZWxlYXNpbmcgc3BhY2UgZm9yCisgKiBAbnVtX2J5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdhbnQgdG8gZnJlZSB1cAorICoKKyAqIFRoaXMgbXVzdCBiZSBtYXRjaGVkIHdpdGggYSBjYWxsIHRvIGJ0cmZzX2RlbGFsbG9jX3Jlc2VydmVfc3BhY2UuICBUaGlzIGlzCisgKiBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBtZXRhZGF0YSBBTkQgZGF0YSByZXNlcnZhdGlvbnMKKyAqIGFueW1vcmUuICBTbyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvciB3ZSBpbnNlcnQgYW4gaW5saW5lIGV4dGVudC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVsZWFzZSB0aGUgbWV0YWRhdGEgc3BhY2UgdGhhdCB3YXMgbm90IHVzZWQgYW5kIHdpbGwKKyAqIGRlY3JlbWVudCAtPmRlbGFsbG9jX2J5dGVzIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZnNfaW5mbyBkZWxhbGxvY19pbm9kZXMKKyAqIGxpc3QgaWYgdGhlcmUgYXJlIG5vIGRlbGFsbG9jIGJ5dGVzIGxlZnQuCisgKi8KIHZvaWQgYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbnVtX2J5dGVzKQogewogCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIG51bV9ieXRlcyk7CkBAIC00MDkwLDEyICs0MzA0LDEyIEBACiAKIAkvKiBibG9jayBhY2NvdW50aW5nIGZvciBzdXBlciBibG9jayAqLwogCXNwaW5fbG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7Ci0Jb2xkX3ZhbCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHkpOworCW9sZF92YWwgPSBidHJmc19zdXBlcl9ieXRlc191c2VkKGluZm8tPnN1cGVyX2NvcHkpOwogCWlmIChhbGxvYykKIAkJb2xkX3ZhbCArPSBudW1fYnl0ZXM7CiAJZWxzZQogCQlvbGRfdmFsIC09IG51bV9ieXRlczsKLQlidHJmc19zZXRfc3VwZXJfYnl0ZXNfdXNlZCgmaW5mby0+c3VwZXJfY29weSwgb2xkX3ZhbCk7CisJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoaW5mby0+c3VwZXJfY29weSwgb2xkX3ZhbCk7CiAJc3Bpbl91bmxvY2soJmluZm8tPmRlbGFsbG9jX2xvY2spOwogCiAJd2hpbGUgKHRvdGFsKSB7CkBAIC00MTIzLDcgKzQzMzcsNyBAQAogCQlzcGluX2xvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKIAkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CiAKLQkJaWYgKGJ0cmZzX3N1cGVyX2NhY2hlX2dlbmVyYXRpb24oJmluZm8tPnN1cGVyX2NvcHkpICE9IDAgJiYKKwkJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSAmJgogCQkgICAgY2FjaGUtPmRpc2tfY2FjaGVfc3RhdGUgPCBCVFJGU19EQ19DTEVBUikKIAkJCWNhY2hlLT5kaXNrX2NhY2hlX3N0YXRlID0gQlRSRlNfRENfQ0xFQVI7CiAKQEAgLTQxMzUsNyArNDM0OSw2IEBACiAJCQlidHJmc19zZXRfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0sIG9sZF92YWwpOwogCQkJY2FjaGUtPnJlc2VydmVkIC09IG51bV9ieXRlczsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc191c2VkICs9IG51bV9ieXRlczsKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5kaXNrX3VzZWQgKz0gbnVtX2J5dGVzICogZmFjdG9yOwogCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKQEAgLTQxODcsNyArNDQwMCw2IEBACiAJaWYgKHJlc2VydmVkKSB7CiAJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CiAJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCWNhY2hlLT5zcGFjZV9pbmZvLT5yZXNlcnZhdGlvbl9wcm9ncmVzcysrOwogCX0KIAlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CkBAIC00MjE1LDQ1ICs0NDI3LDgyIEBACiB9CiAKIC8qCi0gKiB1cGRhdGUgc2l6ZSBvZiByZXNlcnZlZCBleHRlbnRzLiB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gLUVBR0FJTgotICogaWYgJ3Jlc2VydmUnIGlzIHRydWUgb3IgJ3NpbmZvJyBpcyBmYWxzZS4KKyAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aGluIHRyYW5zYWN0aW9uCiAgKi8KLWludCBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKLQkJCQl1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSwgaW50IHNpbmZvKQoraW50IGJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzKQogeworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBieXRlbnIpOworCUJVR19PTighY2FjaGUpOworCisJLyoKKwkgKiBwdWxsIGluIHRoZSBmcmVlIHNwYWNlIGNhY2hlIChpZiBhbnkpIHNvIHRoYXQgb3VyIHBpbgorCSAqIHJlbW92ZXMgdGhlIGZyZWUgc3BhY2UgZnJvbSB0aGUgY2FjaGUuICBXZSBoYXZlIGxvYWRfb25seSBzZXQKKwkgKiB0byBvbmUgYmVjYXVzZSB0aGUgc2xvdyBjb2RlIHRvIHJlYWQgaW4gdGhlIGZyZWUgZXh0ZW50cyBkb2VzIGNoZWNrCisJICogdGhlIHBpbm5lZCBleHRlbnRzLgorCSAqLworCWNhY2hlX2Jsb2NrX2dyb3VwKGNhY2hlLCB0cmFucywgcm9vdCwgMSk7CisKKwlwaW5fZG93bl9leHRlbnQocm9vdCwgY2FjaGUsIGJ5dGVuciwgbnVtX2J5dGVzLCAwKTsKKworCS8qIHJlbW92ZSB1cyBmcm9tIHRoZSBmcmVlIHNwYWNlIGNhY2hlIChpZiB3ZSdyZSB0aGVyZSBhdCBhbGwpICovCisJYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2UoY2FjaGUsIGJ5dGVuciwgbnVtX2J5dGVzKTsKKwlidHJmc19wdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKKyAqIEBjYWNoZToJVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6CVRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KKyAqIEByZXNlcnZlOglPbmUgb2YgdGhlIHJlc2VydmF0aW9uIGVudW1zCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGFsbG9jYXRvciB3aGVuIGl0IHJlc2VydmVzIHNwYWNlLCBvciBieSBzb21lYm9keSB3aG8gaXMKKyAqIGZyZWVpbmcgc3BhY2UgdGhhdCB3YXMgbmV2ZXIgYWN0dWFsbHkgdXNlZCBvbiBkaXNrLiAgRm9yIGV4YW1wbGUgaWYgeW91CisgKiByZXNlcnZlIHNvbWUgc3BhY2UgZm9yIGEgbmV3IGxlYWYgaW4gdHJhbnNhY3Rpb24gQSBhbmQgYmVmb3JlIHRyYW5zYWN0aW9uIEEKKyAqIGNvbW1pdHMgeW91IGZyZWUgdGhhdCBsZWFmLCB5b3UgY2FsbCB0aGlzIHdpdGggcmVzZXJ2ZSBzZXQgdG8gMCBpbiBvcmRlciB0bworICogY2xlYXIgdGhlIHJlc2VydmF0aW9uLgorICoKKyAqIE1ldGFkYXRhIHJlc2VydmF0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHdpdGggUkVTRVJWRV9BTExPQyBzbyB3ZSBkbyB0aGUgcHJvcGVyCisgKiBFTk9TUEMgYWNjb3VudGluZy4gIEZvciBkYXRhIHdlIGhhbmRsZSB0aGUgcmVzZXJ2YXRpb24gdGhyb3VnaCBjbGVhcmluZyB0aGUKKyAqIGRlbGFsbG9jIGJpdHMgaW4gdGhlIGlvX3RyZWUuICBXZSBoYXZlIHRvIGRvIHRoaXMgc2luY2Ugd2UgY291bGQgZW5kIHVwCisgKiBhbGxvY2F0aW5nIGxlc3MgZGlzayBzcGFjZSBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gdGhlCisgKiBjYXNlIG9mIGNvbXByZXNzaW9uLgorICoKKyAqIElmIHRoaXMgaXMgYSByZXNlcnZhdGlvbiBhbmQgdGhlIGJsb2NrIGdyb3VwIGhhcyBiZWNvbWUgcmVhZCBvbmx5IHdlIGNhbm5vdAorICogbWFrZSB0aGUgcmVzZXJ2YXRpb24gYW5kIHJldHVybiAtRUFHQUlOLCBvdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBhbHdheXMKKyAqIHN1Y2NlZWRzLgorICovCitzdGF0aWMgaW50IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgcmVzZXJ2ZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbyA9IGNhY2hlLT5zcGFjZV9pbmZvOwogCWludCByZXQgPSAwOwotCWlmIChzaW5mbykgewotCQlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbyA9IGNhY2hlLT5zcGFjZV9pbmZvOwotCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJaWYgKHJlc2VydmUpIHsKLQkJCWlmIChjYWNoZS0+cm8pIHsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJfSBlbHNlIHsKLQkJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IG51bV9ieXRlczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjYWNoZS0+cm8pCi0JCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOwotCQkJY2FjaGUtPnJlc2VydmVkIC09IG51bV9ieXRlczsKLQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKLQkJCXNwYWNlX2luZm8tPnJlc2VydmF0aW9uX3Byb2dyZXNzKys7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJaWYgKHJlc2VydmUgIT0gUkVTRVJWRV9GUkVFKSB7CiAJCWlmIChjYWNoZS0+cm8pIHsKIAkJCXJldCA9IC1FQUdBSU47CiAJCX0gZWxzZSB7Ci0JCQlpZiAocmVzZXJ2ZSkKLQkJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJZWxzZQotCQkJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOworCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOworCQkJaWYgKHJlc2VydmUgPT0gUkVTRVJWRV9BTExPQykgeworCQkJCUJVR19PTihzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIDwgbnVtX2J5dGVzKTsKKwkJCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlIC09IG51bV9ieXRlczsKKwkJCX0KIAkJfQotCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCX0gZWxzZSB7CisJCWlmIChjYWNoZS0+cm8pCisJCQlzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBudW1fYnl0ZXM7CisJCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKKwkJc3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKIAl9CisJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDMxOSwxMyArNDU2OCw4IEBACiAJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOwogCQljYWNoZS0+cGlubmVkIC09IGxlbjsKIAkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCAtPSBsZW47Ci0JCWlmIChjYWNoZS0+cm8pIHsKKwkJaWYgKGNhY2hlLT5ybykKIAkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBsZW47Ci0JCX0gZWxzZSBpZiAoY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCA+IDApIHsKLQkJCWxlbiA9IG1pbihsZW4sIGNhY2hlLT5yZXNlcnZlZF9waW5uZWQpOwotCQkJY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCAtPSBsZW47Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbGVuOwotCQl9CiAJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CiAJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CiAJfQpAQCAtNDM0MCwxMSArNDU4NCw4IEBACiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOwogCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdW5waW47Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKm5leHRfcnN2OwogCXU2NCBzdGFydDsKIAl1NjQgZW5kOwotCWludCBpZHg7CiAJaW50IHJldDsKIAogCWlmIChmc19pbmZvLT5waW5uZWRfZXh0ZW50cyA9PSAmZnNfaW5mby0+ZnJlZWRfZXh0ZW50c1swXSkKQEAgLTQzNjcsMzAgKzQ2MDgsNiBAQAogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKLQltdXRleF9sb2NrKCZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrX3JzdiwgbmV4dF9yc3YsCi0JCQkJICZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9saXN0LCBsaXN0KSB7Ci0KLQkJaWR4ID0gdHJhbnMtPnRyYW5zaWQgJiAweDE7Ci0JCWlmIChibG9ja19yc3YtPmZyZWVkW2lkeF0gPiAwKSB7Ci0JCQlibG9ja19yc3ZfYWRkX2J5dGVzKGJsb2NrX3JzdiwKLQkJCQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbaWR4XSwgMCk7Ci0JCQlibG9ja19yc3YtPmZyZWVkW2lkeF0gPSAwOwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmYmxvY2tfcnN2LT51c2FnZSkgPT0gMCkgewotCQkJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgYmxvY2tfcnN2LCAodTY0KS0xKTsKLQotCQkJaWYgKGJsb2NrX3Jzdi0+ZnJlZWRbMF0gPT0gMCAmJgotCQkJICAgIGJsb2NrX3Jzdi0+ZnJlZWRbMV0gPT0gMCkgewotCQkJCWxpc3RfZGVsX2luaXQoJmJsb2NrX3Jzdi0+bGlzdCk7Ci0JCQkJa2ZyZWUoYmxvY2tfcnN2KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ0cmZzX2Jsb2NrX3Jzdl9yZWxlYXNlKHJvb3QsIGJsb2NrX3JzdiwgMCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5kdXJhYmxlX2Jsb2NrX3Jzdl9tdXRleCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY2OCw3ICs0ODg1LDYgQEAKIAkJCSAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsCiAJCQkgICB1NjQgcGFyZW50LCBpbnQgbGFzdF9yZWYpCiB7Ci0Jc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2OwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUgPSBOVUxMOwogCWludCByZXQ7CiAKQEAgLTQ2ODMsNjQgKzQ4OTksMjQgQEAKIAlpZiAoIWxhc3RfcmVmKQogCQlyZXR1cm47CiAKLQlibG9ja19yc3YgPSBnZXRfYmxvY2tfcnN2KHRyYW5zLCByb290KTsKIAljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBidWYtPnN0YXJ0KTsKLQlpZiAoYmxvY2tfcnN2LT5zcGFjZV9pbmZvICE9IGNhY2hlLT5zcGFjZV9pbmZvKQotCQlnb3RvIG91dDsKIAogCWlmIChidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihidWYpID09IHRyYW5zLT50cmFuc2lkKSB7CiAJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgewogCQkJcmV0ID0gY2hlY2tfcmVmX2NsZWFudXAodHJhbnMsIHJvb3QsIGJ1Zi0+c3RhcnQpOwogCQkJaWYgKCFyZXQpCi0JCQkJZ290byBwaW47CisJCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpZiAoYnRyZnNfaGVhZGVyX2ZsYWcoYnVmLCBCVFJGU19IRUFERVJfRkxBR19XUklUVEVOKSkgewogCQkJcGluX2Rvd25fZXh0ZW50KHJvb3QsIGNhY2hlLCBidWYtPnN0YXJ0LCBidWYtPmxlbiwgMSk7Ci0JCQlnb3RvIHBpbjsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJV0FSTl9PTih0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX0RJUlRZLCAmYnVmLT5iZmxhZ3MpKTsKIAogCQlidHJmc19hZGRfZnJlZV9zcGFjZShjYWNoZSwgYnVmLT5zdGFydCwgYnVmLT5sZW4pOwotCQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCAwLCAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkvKiBibG9jayBncm91cCBiZWNhbWUgcmVhZC1vbmx5ICovCi0JCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCAwLCAxKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmV0ID0gMTsKLQkJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCQlpZiAoYmxvY2tfcnN2LT5yZXNlcnZlZCA8IGJsb2NrX3Jzdi0+c2l6ZSkgewotCQkJYmxvY2tfcnN2LT5yZXNlcnZlZCArPSBidWYtPmxlbjsKLQkJCXJldCA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7Ci0KLQkJaWYgKHJldCkgewotCQkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gYnVmLT5sZW47Ci0JCQljYWNoZS0+c3BhY2VfaW5mby0+cmVzZXJ2YXRpb25fcHJvZ3Jlc3MrKzsKLQkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7Ci0JCX0KLQkJZ290byBvdXQ7Ci0JfQotcGluOgotCWlmIChibG9ja19yc3YtPmR1cmFibGUgJiYgIWNhY2hlLT5ybykgewotCQlyZXQgPSAwOwotCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKLQkJaWYgKCFjYWNoZS0+cm8pIHsKLQkJCWNhY2hlLT5yZXNlcnZlZF9waW5uZWQgKz0gYnVmLT5sZW47Ci0JCQlyZXQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7Ci0KLQkJaWYgKHJldCkgewotCQkJc3Bpbl9sb2NrKCZibG9ja19yc3YtPmxvY2spOwotCQkJYmxvY2tfcnN2LT5mcmVlZFt0cmFucy0+dHJhbnNpZCAmIDB4MV0gKz0gYnVmLT5sZW47Ci0JCQlzcGluX3VubG9jaygmYmxvY2tfcnN2LT5sb2NrKTsKLQkJfQorCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGJ1Zi0+bGVuLCBSRVNFUlZFX0ZSRUUpOwogCX0KIG91dDoKIAkvKgpAQCAtNDg4MywxMCArNTA1OSwxMyBAQAogCWludCBsYXN0X3B0cl9sb29wID0gMDsKIAlpbnQgbG9vcCA9IDA7CiAJaW50IGluZGV4ID0gMDsKKwlpbnQgYWxsb2NfdHlwZSA9IChkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQSkgPworCQlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgOiBSRVNFUlZFX0FMTE9DOwogCWJvb2wgZm91bmRfdW5jYWNoZWRfYmcgPSBmYWxzZTsKIAlib29sIGZhaWxlZF9jbHVzdGVyX3JlZmlsbCA9IGZhbHNlOwogCWJvb2wgZmFpbGVkX2FsbG9jID0gZmFsc2U7CiAJYm9vbCB1c2VfY2x1c3RlciA9IHRydWU7CisJYm9vbCBoYXZlX2NhY2hpbmdfYmcgPSBmYWxzZTsKIAl1NjQgaWRlYWxfY2FjaGVfcGVyY2VudCA9IDA7CiAJdTY0IGlkZWFsX2NhY2hlX29mZnNldCA9IDA7CiAKQEAgLTQ5NjksNiArNTE0OCw3IEBACiAJCX0KIAl9CiBzZWFyY2g6CisJaGF2ZV9jYWNoaW5nX2JnID0gZmFsc2U7CiAJZG93bl9yZWFkKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrX2dyb3VwLCAmc3BhY2VfaW5mby0+YmxvY2tfZ3JvdXBzW2luZGV4XSwKIAkJCSAgICBsaXN0KSB7CkBAIC01MTc3LDYgKzUzNTcsOCBAQAogCQkJZmFpbGVkX2FsbG9jID0gdHJ1ZTsKIAkJCWdvdG8gaGF2ZV9ibG9ja19ncm91cDsKIAkJfSBlbHNlIGlmICghb2Zmc2V0KSB7CisJCQlpZiAoIWNhY2hlZCkKKwkJCQloYXZlX2NhY2hpbmdfYmcgPSB0cnVlOwogCQkJZ290byBsb29wOwogCQl9CiBjaGVja3M6CkBAIC01MjAyLDggKzUzODQsOCBAQAogCQkJCQkgICAgIHNlYXJjaF9zdGFydCAtIG9mZnNldCk7CiAJCUJVR19PTihvZmZzZXQgPiBzZWFyY2hfc3RhcnQpOwogCi0JCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLCAxLAotCQkJCQkgICAgKGRhdGEgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSk7CisJCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLAorCQkJCQkJICBhbGxvY190eXBlKTsKIAkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOwogCQkJZ290byBsb29wOwpAQCAtNTIyNyw2ICs1NDA5LDkgQEAKIAl9CiAJdXBfcmVhZCgmc3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CiAKKwlpZiAoIWlucy0+b2JqZWN0aWQgJiYgbG9vcCA+PSBMT09QX0NBQ0hJTkdfV0FJVCAmJiBoYXZlX2NhY2hpbmdfYmcpCisJCWdvdG8gc2VhcmNoOworCiAJaWYgKCFpbnMtPm9iamVjdGlkICYmICsraW5kZXggPCBCVFJGU19OUl9SQUlEX1RZUEVTKQogCQlnb3RvIHNlYXJjaDsKIApAQCAtNTMyNSw3ICs1NTEwLDggQEAKIAlpbnQgaW5kZXggPSAwOwogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvIGhhcyAlbGx1IGZyZWUsIGlzICVzZnVsbFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvICVsbHUgaGFzICVsbHUgZnJlZSwgaXMgJXNmdWxsXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluZm8tPmZsYWdzLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShpbmZvLT50b3RhbF9ieXRlcyAtIGluZm8tPmJ5dGVzX3VzZWQgLQogCQkJCSAgICBpbmZvLT5ieXRlc19waW5uZWQgLSBpbmZvLT5ieXRlc19yZXNlcnZlZCAtCiAJCQkJICAgIGluZm8tPmJ5dGVzX3JlYWRvbmx5KSwKQEAgLTU0MTEsNyArNTU5Nyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc3RhcnQsIHU2NCBsZW4pCitzdGF0aWMgaW50IF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXU2NCBzdGFydCwgdTY0IGxlbiwgaW50IHBpbikKIHsKIAlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOwogCWludCByZXQgPSAwOwpAQCAtNTQyNiw4ICs1NjEzLDEyIEBACiAJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIERJU0NBUkQpKQogCQlyZXQgPSBidHJmc19kaXNjYXJkX2V4dGVudChyb290LCBzdGFydCwgbGVuLCBOVUxMKTsKIAotCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGNhY2hlLCBzdGFydCwgbGVuKTsKLQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGxlbiwgMCwgMSk7CisJaWYgKHBpbikKKwkJcGluX2Rvd25fZXh0ZW50KHJvb3QsIGNhY2hlLCBzdGFydCwgbGVuLCAxKTsKKwllbHNlIHsKKwkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIHN0YXJ0LCBsZW4pOworCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoY2FjaGUsIGxlbiwgUkVTRVJWRV9GUkVFKTsKKwl9CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKIAogCXRyYWNlX2J0cmZzX3Jlc2VydmVkX2V4dGVudF9mcmVlKHJvb3QsIHN0YXJ0LCBsZW4pOwpAQCAtNTQzNSw2ICs1NjI2LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQl1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJcmV0dXJuIF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwgc3RhcnQsIGxlbiwgMCk7Cit9CisKK2ludCBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJcmV0dXJuIF9fYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwgc3RhcnQsIGxlbiwgMSk7Cit9CisKIHN0YXRpYyBpbnQgYWxsb2NfcmVzZXJ2ZWRfZmlsZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJICAgICAgdTY0IHBhcmVudCwgdTY0IHJvb3Rfb2JqZWN0aWQsCkBAIC01NjMwLDcgKzU4MzMsOCBAQAogCQlwdXRfY2FjaGluZ19jb250cm9sKGNhY2hpbmdfY3RsKTsKIAl9CiAKLQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsIGlucy0+b2Zmc2V0LCAxLCAxKTsKKwlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsIGlucy0+b2Zmc2V0LAorCQkJCQkgIFJFU0VSVkVfQUxMT0NfTk9fQUNDT1VOVCk7CiAJQlVHX09OKHJldCk7CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAlyZXQgPSBhbGxvY19yZXNlcnZlZF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgMCwgcm9vdF9vYmplY3RpZCwKQEAgLTU2ODcsOCArNTg5MSw3IEBACiAJYmxvY2tfcnN2ID0gZ2V0X2Jsb2NrX3Jzdih0cmFucywgcm9vdCk7CiAKIAlpZiAoYmxvY2tfcnN2LT5zaXplID09IDApIHsKLQkJcmV0ID0gcmVzZXJ2ZV9tZXRhZGF0YV9ieXRlcyh0cmFucywgcm9vdCwgYmxvY2tfcnN2LAotCQkJCQkgICAgIGJsb2Nrc2l6ZSwgMCk7CisJCXJldCA9IHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMocm9vdCwgYmxvY2tfcnN2LCBibG9ja3NpemUsIDApOwogCQkvKgogCQkgKiBJZiB3ZSBjb3VsZG4ndCByZXNlcnZlIG1ldGFkYXRhIGJ5dGVzIHRyeSBhbmQgdXNlIHNvbWUgZnJvbQogCQkgKiB0aGUgZ2xvYmFsIHJlc2VydmUuCkBAIC01NzA4LDEzICs1OTExLDE1IEBACiAJaWYgKCFyZXQpCiAJCXJldHVybiBibG9ja19yc3Y7CiAJaWYgKHJldCkgewotCQlXQVJOX09OKDEpOwotCQlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHRyYW5zLCByb290LCBibG9ja19yc3YsIGJsb2Nrc2l6ZSwKLQkJCQkJICAgICAwKTsKKwkJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUoX3JzLAorCQkJCURFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAorCQkJCS8qREVGQVVMVF9SQVRFTElNSVRfQlVSU1QqLyAyKTsKKwkJaWYgKF9fcmF0ZWxpbWl0KCZfcnMpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYnRyZnM6IGJsb2NrIHJzdiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJCVdBUk5fT04oMSk7CisJCX0KKwkJcmV0ID0gcmVzZXJ2ZV9tZXRhZGF0YV9ieXRlcyhyb290LCBibG9ja19yc3YsIGJsb2Nrc2l6ZSwgMCk7CiAJCWlmICghcmV0KSB7Ci0JCQlzcGluX2xvY2soJmJsb2NrX3Jzdi0+bG9jayk7Ci0JCQlibG9ja19yc3YtPnNpemUgKz0gYmxvY2tzaXplOwotCQkJc3Bpbl91bmxvY2soJmJsb2NrX3Jzdi0+bG9jayk7CiAJCQlyZXR1cm4gYmxvY2tfcnN2OwogCQl9IGVsc2UgaWYgKHJldCAmJiBibG9ja19yc3YgIT0gZ2xvYmFsX3JzdikgewogCQkJcmV0ID0gYmxvY2tfcnN2X3VzZV9ieXRlcyhnbG9iYWxfcnN2LCBibG9ja3NpemUpOwpAQCAtNjU5MiwxMiArNjc5Nyw5IEBACiAJCSAgICBjYWNoZS0+Ynl0ZXNfc3VwZXIgLSBidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSk7CiAKIAlpZiAoc2luZm8tPmJ5dGVzX3VzZWQgKyBzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKyBzaW5mby0+Ynl0ZXNfcGlubmVkICsKLQkgICAgc2luZm8tPmJ5dGVzX21heV91c2UgKyBzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwotCSAgICBjYWNoZS0+cmVzZXJ2ZWRfcGlubmVkICsgbnVtX2J5dGVzICsgbWluX2FsbG9jYWJsZV9ieXRlcyA8PQotCSAgICBzaW5mby0+dG90YWxfYnl0ZXMpIHsKKwkgICAgc2luZm8tPmJ5dGVzX21heV91c2UgKyBzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKyBudW1fYnl0ZXMgKworCSAgICBtaW5fYWxsb2NhYmxlX2J5dGVzIDw9IHNpbmZvLT50b3RhbF9ieXRlcykgewogCQlzaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOwotCQlzaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gY2FjaGUtPnJlc2VydmVkX3Bpbm5lZDsKLQkJY2FjaGUtPnJlc2VydmVkX3Bpbm5lZCA9IDA7CiAJCWNhY2hlLT5ybyA9IDE7CiAJCXJldCA9IDA7CiAJfQpAQCAtNjk2NCw3ICs3MTY2LDggQEAKIAkJCQkJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8sCiAJCQkJCWxpc3QpOwogCQlpZiAoc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkID4gMCB8fAotCQkgICAgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgPiAwKSB7CisJCSAgICBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCA+IDAgfHwKKwkJICAgIHNwYWNlX2luZm8tPmJ5dGVzX21heV91c2UgPiAwKSB7CiAJCQlXQVJOX09OKDEpOwogCQkJZHVtcF9zcGFjZV9pbmZvKHNwYWNlX2luZm8sIDAsIDApOwogCQl9CkBAIC03MDA2LDE0ICs3MjA5LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBhdGgtPnJlYWRhID0gMTsKIAotCWNhY2hlX2dlbiA9IGJ0cmZzX3N1cGVyX2NhY2hlX2dlbmVyYXRpb24oJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwotCWlmIChjYWNoZV9nZW4gIT0gMCAmJgotCSAgICBidHJmc19zdXBlcl9nZW5lcmF0aW9uKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAhPSBjYWNoZV9nZW4pCisJY2FjaGVfZ2VuID0gYnRyZnNfc3VwZXJfY2FjaGVfZ2VuZXJhdGlvbihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpICYmCisJICAgIGJ0cmZzX3N1cGVyX2dlbmVyYXRpb24ocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgIT0gY2FjaGVfZ2VuKQogCQluZWVkX2NsZWFyID0gMTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgQ0xFQVJfQ0FDSEUpKQogCQluZWVkX2NsZWFyID0gMTsKLQlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSAmJiBjYWNoZV9nZW4pCi0JCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBkaXNrIHNwYWNlIGNhY2hpbmcgaXMgZW5hYmxlZFxuIik7CiAKIAl3aGlsZSAoMSkgewogCQlyZXQgPSBmaW5kX2ZpcnN0X2Jsb2NrX2dyb3VwKHJvb3QsIHBhdGgsICZrZXkpOwpAQCAtNzI1Miw3ICs3NDUzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaW5vZGUgPSBsb29rdXBfZnJlZV9zcGFjZV9pbm9kZShyb290LCBibG9ja19ncm91cCwgcGF0aCk7CisJaW5vZGUgPSBsb29rdXBfZnJlZV9zcGFjZV9pbm9kZSh0cmVlX3Jvb3QsIGJsb2NrX2dyb3VwLCBwYXRoKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwogCQlCVUdfT04ocmV0KTsKQEAgLTcyNjgsNyArNzQ2OSw3IEBACiAJCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwogCQl9CiAJCS8qIE9uZSBmb3Igb3VyIGxvb2t1cCByZWYgKi8KLQkJaXB1dChpbm9kZSk7CisJCWJ0cmZzX2FkZF9kZWxheWVkX2lwdXQoaW5vZGUpOwogCX0KIAogCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZSRUVfU1BBQ0VfT0JKRUNUSUQ7CkBAIC03MzM5LDcgKzc1NDAsNyBAQAogCWludCBtaXhlZCA9IDA7CiAJaW50IHJldDsKIAotCWRpc2tfc3VwZXIgPSAmZnNfaW5mby0+c3VwZXJfY29weTsKKwlkaXNrX3N1cGVyID0gZnNfaW5mby0+c3VwZXJfY29weTsKIAlpZiAoIWJ0cmZzX3N1cGVyX3Jvb3QoZGlza19zdXBlcikpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IGQ0MTgxNjQuLjFmODdjNGQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY29tcGF0LmgiCiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZXMuaCIKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHRlbnRfc3RhdGVfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dGVudF9idWZmZXJfY2FjaGU7CkBAIC04OTQsNiArODk1LDE5NCBAQAogCWdvdG8gYWdhaW47CiB9CiAKKy8qKgorICogY29udmVydF9leHRlbnQgLSBjb252ZXJ0IGFsbCBiaXRzIGluIGEgZ2l2ZW4gcmFuZ2UgZnJvbSBvbmUgYml0IHRvIGFub3RoZXIKKyAqIEB0cmVlOgl0aGUgaW8gdHJlZSB0byBzZWFyY2gKKyAqIEBzdGFydDoJdGhlIHN0YXJ0IG9mZnNldCBpbiBieXRlcworICogQGVuZDoJdGhlIGVuZCBvZmZzZXQgaW4gYnl0ZXMgKGluY2x1c2l2ZSkKKyAqIEBiaXRzOgl0aGUgYml0cyB0byBzZXQgaW4gdGhpcyByYW5nZQorICogQGNsZWFyX2JpdHM6CXRoZSBiaXRzIHRvIGNsZWFyIGluIHRoaXMgcmFuZ2UKKyAqIEBtYXNrOgl0aGUgYWxsb2NhdGlvbiBtYXNrCisgKgorICogVGhpcyB3aWxsIGdvIHRocm91Z2ggYW5kIHNldCBiaXRzIGZvciB0aGUgZ2l2ZW4gcmFuZ2UuICBJZiBhbnkgc3RhdGVzIGV4aXN0CisgKiBhbHJlYWR5IGluIHRoaXMgcmFuZ2UgdGhleSBhcmUgc2V0IHdpdGggdGhlIGdpdmVuIGJpdCBhbmQgY2xlYXJlZCBvZiB0aGUKKyAqIGNsZWFyX2JpdHMuICBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gYmUgdXNlZCBieSB0aGluZ3MgdGhhdCBhcmUgbWVyZ2VhYmxlLCBpZQorICogY29udmVydGluZyBmcm9tIHNheSBERUxBTExPQyB0byBESVJUWS4gIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgd2l0aAorICogYm91bmRhcnkgYml0cyBsaWtlIExPQ0suCisgKi8KK2ludCBjb252ZXJ0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICBpbnQgYml0cywgaW50IGNsZWFyX2JpdHMsIGdmcF90IG1hc2spCit7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqcHJlYWxsb2MgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWludCBlcnIgPSAwOworCXU2NCBsYXN0X3N0YXJ0OworCXU2NCBsYXN0X2VuZDsKKworYWdhaW46CisJaWYgKCFwcmVhbGxvYyAmJiAobWFzayAmIF9fR0ZQX1dBSVQpKSB7CisJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlKG1hc2spOworCQlpZiAoIXByZWFsbG9jKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwkvKgorCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgorCSAqLworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CisJaWYgKCFub2RlKSB7CisJCXByZWFsbG9jID0gYWxsb2NfZXh0ZW50X3N0YXRlX2F0b21pYyhwcmVhbGxvYyk7CisJCWlmICghcHJlYWxsb2MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgZW5kLCAmYml0cyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CitoaXRfbmV4dDoKKwlsYXN0X3N0YXJ0ID0gc3RhdGUtPnN0YXJ0OworCWxhc3RfZW5kID0gc3RhdGUtPmVuZDsKKworCS8qCisJICogfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogfCBzdGF0ZSB8CisJICoKKwkgKiBKdXN0IGxvY2sgd2hhdCB3ZSBmb3VuZCBhbmQga2VlcCBnb2luZworCSAqLworCWlmIChzdGF0ZS0+c3RhcnQgPT0gc3RhcnQgJiYgc3RhdGUtPmVuZCA8PSBlbmQpIHsKKwkJc3RydWN0IHJiX25vZGUgKm5leHRfbm9kZTsKKworCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOworCQljbGVhcl9zdGF0ZV9iaXQodHJlZSwgc3RhdGUsICZjbGVhcl9iaXRzLCAwKTsKKworCQltZXJnZV9zdGF0ZSh0cmVlLCBzdGF0ZSk7CisJCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQorCQkJZ290byBvdXQ7CisKKwkJc3RhcnQgPSBsYXN0X2VuZCArIDE7CisJCW5leHRfbm9kZSA9IHJiX25leHQoJnN0YXRlLT5yYl9ub2RlKTsKKwkJaWYgKG5leHRfbm9kZSAmJiBzdGFydCA8IGVuZCAmJiBwcmVhbGxvYyAmJiAhbmVlZF9yZXNjaGVkKCkpIHsKKwkJCXN0YXRlID0gcmJfZW50cnkobmV4dF9ub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLAorCQkJCQkgcmJfbm9kZSk7CisJCQlpZiAoc3RhdGUtPnN0YXJ0ID09IHN0YXJ0KQorCQkJCWdvdG8gaGl0X25leHQ7CisJCX0KKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCisJLyoKKwkgKiAgICAgfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogfCBzdGF0ZSB8CisJICogICBvcgorCSAqIHwgLS0tLS0tLS0tLS0tLSBzdGF0ZSAtLS0tLS0tLS0tLS0tLSB8CisJICoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQgd2UgZm91bmQsIGFuZCBtYXkgZmxpcCBiaXRzIG9uCisJICogc2Vjb25kIGhhbGYuCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGV4dGVuZHMgcGFzdCBvdXIKKwkgKiByYW5nZSwgd2UganVzdCBzcGxpdCBhbmQgc2VhcmNoIGFnYWluLiAgSXQnbGwgZ2V0IHNwbGl0CisJICogYWdhaW4gdGhlIG5leHQgdGltZSB0aG91Z2guCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGlzIGluc2lkZSBvdXIgcmFuZ2UsIHdlIHNldCB0aGUKKwkgKiBkZXNpcmVkIGJpdCBvbiBpdC4KKwkgKi8KKwlpZiAoc3RhdGUtPnN0YXJ0IDwgc3RhcnQpIHsKKwkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCXJldHVybiAtRU5PTUVNOworCQllcnIgPSBzcGxpdF9zdGF0ZSh0cmVlLCBzdGF0ZSwgcHJlYWxsb2MsIHN0YXJ0KTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJcHJlYWxsb2MgPSBOVUxMOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChzdGF0ZS0+ZW5kIDw9IGVuZCkgeworCQkJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKKwkJCWNsZWFyX3N0YXRlX2JpdCh0cmVlLCBzdGF0ZSwgJmNsZWFyX2JpdHMsIDApOworCQkJbWVyZ2Vfc3RhdGUodHJlZSwgc3RhdGUpOworCQkJaWYgKGxhc3RfZW5kID09ICh1NjQpLTEpCisJCQkJZ290byBvdXQ7CisJCQlzdGFydCA9IGxhc3RfZW5kICsgMTsKKwkJfQorCQlnb3RvIHNlYXJjaF9hZ2FpbjsKKwl9CisJLyoKKwkgKiB8IC0tLS0gZGVzaXJlZCByYW5nZSAtLS0tIHwKKwkgKiAgICAgfCBzdGF0ZSB8IG9yICAgICAgICAgICAgICAgfCBzdGF0ZSB8CisJICoKKwkgKiBUaGVyZSdzIGEgaG9sZSwgd2UgbmVlZCB0byBpbnNlcnQgc29tZXRoaW5nIGluIGl0IGFuZAorCSAqIGlnbm9yZSB0aGUgZXh0ZW50IHdlIGZvdW5kLgorCSAqLworCWlmIChzdGF0ZS0+c3RhcnQgPiBzdGFydCkgeworCQl1NjQgdGhpc19lbmQ7CisJCWlmIChlbmQgPCBsYXN0X3N0YXJ0KQorCQkJdGhpc19lbmQgPSBlbmQ7CisJCWVsc2UKKwkJCXRoaXNfZW5kID0gbGFzdF9zdGFydCAtIDE7CisKKwkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qCisJCSAqIEF2b2lkIHRvIGZyZWUgJ3ByZWFsbG9jJyBpZiBpdCBjYW4gYmUgbWVyZ2VkIHdpdGgKKwkJICogdGhlIGxhdGVyIGV4dGVudC4KKwkJICovCisJCWVyciA9IGluc2VydF9zdGF0ZSh0cmVlLCBwcmVhbGxvYywgc3RhcnQsIHRoaXNfZW5kLAorCQkJCSAgICZiaXRzKTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJaWYgKGVycikgeworCQkJZnJlZV9leHRlbnRfc3RhdGUocHJlYWxsb2MpOworCQkJcHJlYWxsb2MgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJlYWxsb2MgPSBOVUxMOworCQlzdGFydCA9IHRoaXNfZW5kICsgMTsKKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCS8qCisJICogfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogICAgICAgICAgICAgICAgICAgICAgICB8IHN0YXRlIHwKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQsIGFuZCBzZXQgdGhlIGJpdAorCSAqIG9uIHRoZSBmaXJzdCBoYWxmCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA8PSBlbmQgJiYgc3RhdGUtPmVuZCA+IGVuZCkgeworCQlwcmVhbGxvYyA9IGFsbG9jX2V4dGVudF9zdGF0ZV9hdG9taWMocHJlYWxsb2MpOworCQlpZiAoIXByZWFsbG9jKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZXJyID0gc3BsaXRfc3RhdGUodHJlZSwgc3RhdGUsIHByZWFsbG9jLCBlbmQgKyAxKTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKworCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBwcmVhbGxvYywgJmJpdHMpOworCQljbGVhcl9zdGF0ZV9iaXQodHJlZSwgcHJlYWxsb2MsICZjbGVhcl9iaXRzLCAwKTsKKworCQltZXJnZV9zdGF0ZSh0cmVlLCBwcmVhbGxvYyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJZ290byBzZWFyY2hfYWdhaW47CisKK291dDoKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKHByZWFsbG9jKQorCQlmcmVlX2V4dGVudF9zdGF0ZShwcmVhbGxvYyk7CisKKwlyZXR1cm4gZXJyOworCitzZWFyY2hfYWdhaW46CisJaWYgKHN0YXJ0ID4gZW5kKQorCQlnb3RvIG91dDsKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKG1hc2sgJiBfX0dGUF9XQUlUKQorCQljb25kX3Jlc2NoZWQoKTsKKwlnb3RvIGFnYWluOworfQorCiAvKiB3cmFwcGVycyBhcm91bmQgc2V0L2NsZWFyIGV4dGVudCBiaXQgKi8KIGludCBzZXRfZXh0ZW50X2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkgICAgIGdmcF90IG1hc2spCkBAIC05MTksNyArMTEwOCw3IEBACiAJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLCBnZnBfdCBtYXNrKQogewogCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLAotCQkJICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX0RJUlRZIHwgRVhURU5UX1VQVE9EQVRFLAorCQkJICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX1VQVE9EQVRFLAogCQkJICAgICAgMCwgTlVMTCwgY2FjaGVkX3N0YXRlLCBtYXNrKTsKIH0KIApAQCAtMTU5OSw2ICsxNzg4LDM2OCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogV2hlbiBJTyBmYWlscywgZWl0aGVyIHdpdGggRUlPIG9yIGNzdW0gdmVyaWZpY2F0aW9uIGZhaWxzLCB3ZQorICogdHJ5IG90aGVyIG1pcnJvcnMgdGhhdCBtaWdodCBoYXZlIGEgZ29vZCBjb3B5IG9mIHRoZSBkYXRhLiAgVGhpcworICogaW9fZmFpbHVyZV9yZWNvcmQgaXMgdXNlZCB0byByZWNvcmQgc3RhdGUgYXMgd2UgZ28gdGhyb3VnaCBhbGwgdGhlCisgKiBtaXJyb3JzLiAgSWYgYW5vdGhlciBtaXJyb3IgaGFzIGdvb2QgZGF0YSwgdGhlIHBhZ2UgaXMgc2V0IHVwIHRvIGRhdGUKKyAqIGFuZCB0aGluZ3MgY29udGludWUuICBJZiBhIGdvb2QgbWlycm9yIGNhbid0IGJlIGZvdW5kLCB0aGUgb3JpZ2luYWwKKyAqIGJpbyBlbmRfaW8gY2FsbGJhY2sgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoaW5ncyBoYXZlIGZhaWxlZC4KKyAqLworc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1NjQgc3RhcnQ7CisJdTY0IGxlbjsKKwl1NjQgbG9naWNhbDsKKwl1bnNpZ25lZCBsb25nIGJpb19mbGFnczsKKwlpbnQgdGhpc19taXJyb3I7CisJaW50IGZhaWxlZF9taXJyb3I7CisJaW50IGluX3ZhbGlkYXRpb247Cit9OworCitzdGF0aWMgaW50IGZyZWVfaW9fZmFpbHVyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKnJlYywKKwkJCQlpbnQgZGlkX3JlcGFpcikKK3sKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZmFpbHVyZV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWU7CisKKwlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHJlYy0+c3RhcnQsIDApOworCXJldCA9IGNsZWFyX2V4dGVudF9iaXRzKGZhaWx1cmVfdHJlZSwgcmVjLT5zdGFydCwKKwkJCQlyZWMtPnN0YXJ0ICsgcmVjLT5sZW4gLSAxLAorCQkJCUVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKKwlpZiAocmV0KQorCQllcnIgPSByZXQ7CisKKwlpZiAoZGlkX3JlcGFpcikgeworCQlyZXQgPSBjbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHJlYy0+c3RhcnQsCisJCQkJCXJlYy0+c3RhcnQgKyByZWMtPmxlbiAtIDEsCisJCQkJCUVYVEVOVF9EQU1BR0VELCBHRlBfTk9GUyk7CisJCWlmIChyZXQgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwl9CisKKwlrZnJlZShyZWMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJlcGFpcl9pb19mYWlsdXJlX2NhbGxiYWNrKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwljb21wbGV0ZShiaW8tPmJpX3ByaXZhdGUpOworfQorCisvKgorICogdGhpcyBieXBhc3NlcyB0aGUgc3RhbmRhcmQgYnRyZnMgc3VibWl0IGZ1bmN0aW9ucyBkZWxpYmVyYXRlbHksIGFzCisgKiB0aGUgc3RhbmRhcmQgYmVoYXZpb3IgaXMgdG8gd3JpdGUgYWxsIGNvcGllcyBpbiBhIHJhaWQgc2V0dXAuIGhlcmUgd2Ugb25seQorICogd2FudCB0byB3cml0ZSB0aGUgb25lIGJhZCBjb3B5LiBzbyB3ZSBkbyB0aGUgbWFwcGluZyBmb3Igb3Vyc2VsdmVzIGFuZCBpc3N1ZQorICogc3VibWl0X2JpbyBkaXJlY3RseS4KKyAqIHRvIGF2b2lkIGFueSBzeW5jaG9uaXphdGlvbiBpc3N1ZXMsIHdhaXQgZm9yIHRoZSBkYXRhIGFmdGVyIHdyaXRpbmcsIHdoaWNoCisgKiBhY3R1YWxseSBwcmV2ZW50cyB0aGUgcmVhZCB0aGF0IHRyaWdnZXJlZCB0aGUgZXJyb3IgZnJvbSBmaW5pc2hpbmcuCisgKiBjdXJyZW50bHksIHRoZXJlIGNhbiBiZSBubyBtb3JlIHRoYW4gdHdvIGNvcGllcyBvZiBldmVyeSBkYXRhIGJpdC4gdGh1cywKKyAqIGV4YWN0bHkgb25lIHJld3JpdGUgaXMgcmVxdWlyZWQuCisgKi8KK2ludCByZXBhaXJfaW9fZmFpbHVyZShzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgdTY0IHN0YXJ0LAorCQkJdTY0IGxlbmd0aCwgdTY0IGxvZ2ljYWwsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJaW50IG1pcnJvcl9udW0pCit7CisJc3RydWN0IGJpbyAqYmlvOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbCk7CisJdTY0IG1hcF9sZW5ndGggPSAwOworCXU2NCBzZWN0b3I7CisJc3RydWN0IGJ0cmZzX2JpbyAqYmJpbyA9IE5VTEw7CisJaW50IHJldDsKKworCUJVR19PTighbWlycm9yX251bSk7CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOworCWlmICghYmlvKQorCQlyZXR1cm4gLUVJTzsKKwliaW8tPmJpX3ByaXZhdGUgPSAmY29tcGw7CisJYmlvLT5iaV9lbmRfaW8gPSByZXBhaXJfaW9fZmFpbHVyZV9jYWxsYmFjazsKKwliaW8tPmJpX3NpemUgPSAwOworCW1hcF9sZW5ndGggPSBsZW5ndGg7CisKKwlyZXQgPSBidHJmc19tYXBfYmxvY2sobWFwX3RyZWUsIFdSSVRFLCBsb2dpY2FsLAorCQkJICAgICAgJm1hcF9sZW5ndGgsICZiYmlvLCBtaXJyb3JfbnVtKTsKKwlpZiAocmV0KSB7CisJCWJpb19wdXQoYmlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUJVR19PTihtaXJyb3JfbnVtICE9IGJiaW8tPm1pcnJvcl9udW0pOworCXNlY3RvciA9IGJiaW8tPnN0cmlwZXNbbWlycm9yX251bS0xXS5waHlzaWNhbCA+PiA5OworCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWRldiA9IGJiaW8tPnN0cmlwZXNbbWlycm9yX251bS0xXS5kZXY7CisJa2ZyZWUoYmJpbyk7CisJaWYgKCFkZXYgfHwgIWRldi0+YmRldiB8fCAhZGV2LT53cml0ZWFibGUpIHsKKwkJYmlvX3B1dChiaW8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJYmlvLT5iaV9iZGV2ID0gZGV2LT5iZGV2OworCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGxlbmd0aCwgc3RhcnQtcGFnZV9vZmZzZXQocGFnZSkpOworCXN1Ym1pdF9iaW8oV1JJVEVfU1lOQywgYmlvKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbCk7CisKKwlpZiAoIXRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpKSB7CisJCS8qIHRyeSB0byByZW1hcCB0aGF0IGV4dGVudCBlbHNld2hlcmU/ICovCisJCWJpb19wdXQoYmlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgcmVhZCBlcnJvciBjb3JyZWN0ZWQ6IGlubyAlbHUgb2ZmICVsbHUgKGRldiAlcyAiCisJCQkic2VjdG9yICVsbHUpXG4iLCBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX2lubywgc3RhcnQsCisJCQlkZXYtPm5hbWUsIHNlY3Rvcik7CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBlYWNoIHRpbWUgYW4gSU8gZmluaXNoZXMsIHdlIGRvIGEgZmFzdCBjaGVjayBpbiB0aGUgSU8gZmFpbHVyZSB0cmVlCisgKiB0byBzZWUgaWYgd2UgbmVlZCB0byBwcm9jZXNzIG9yIGNsZWFuIHVwIGFuIGlvX2ZhaWx1cmVfcmVjb3JkCisgKi8KK3N0YXRpYyBpbnQgY2xlYW5faW9fZmFpbHVyZSh1NjQgc3RhcnQsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXU2NCBwcml2YXRlOworCXU2NCBwcml2YXRlX2ZhaWx1cmU7CisJc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjOworCXN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCWludCBudW1fY29waWVzOworCWludCBkaWRfcmVwYWlyID0gMDsKKwlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCisJcHJpdmF0ZSA9IDA7CisJcmV0ID0gY291bnRfcmFuZ2VfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwgJnByaXZhdGUsCisJCQkJKHU2NCktMSwgMSwgRVhURU5UX0RJUlRZLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZSgmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwgc3RhcnQsCisJCQkJJnByaXZhdGVfZmFpbHVyZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwlmYWlscmVjID0gKHN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCAqKSh1bnNpZ25lZCBsb25nKSBwcml2YXRlX2ZhaWx1cmU7CisJQlVHX09OKCFmYWlscmVjLT50aGlzX21pcnJvcik7CisKKwlpZiAoZmFpbHJlYy0+aW5fdmFsaWRhdGlvbikgeworCQkvKiB0aGVyZSB3YXMgbm8gcmVhbCBlcnJvciwganVzdCBmcmVlIHRoZSByZWNvcmQgKi8KKwkJcHJfZGVidWcoImNsZWFuX2lvX2ZhaWx1cmU6IGZyZWVpbmcgZHVtbXkgZXJyb3IgYXQgJWxsdVxuIiwKKwkJCSBmYWlscmVjLT5zdGFydCk7CisJCWRpZF9yZXBhaXIgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOworCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgIGZhaWxyZWMtPnN0YXJ0LAorCQkJCQkgICAgRVhURU5UX0xPQ0tFRCk7CisJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOworCisJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCA9PSBmYWlscmVjLT5zdGFydCkgeworCQltYXBfdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlOworCQludW1fY29waWVzID0gYnRyZnNfbnVtX2NvcGllcyhtYXBfdHJlZSwgZmFpbHJlYy0+bG9naWNhbCwKKwkJCQkJCWZhaWxyZWMtPmxlbik7CisJCWlmIChudW1fY29waWVzID4gMSkgIHsKKwkJCXJldCA9IHJlcGFpcl9pb19mYWlsdXJlKG1hcF90cmVlLCBzdGFydCwgZmFpbHJlYy0+bGVuLAorCQkJCQkJZmFpbHJlYy0+bG9naWNhbCwgcGFnZSwKKwkJCQkJCWZhaWxyZWMtPmZhaWxlZF9taXJyb3IpOworCQkJZGlkX3JlcGFpciA9ICFyZXQ7CisJCX0KKwl9CisKK291dDoKKwlpZiAoIXJldCkKKwkJcmV0ID0gZnJlZV9pb19mYWlsdXJlKGlub2RlLCBmYWlscmVjLCBkaWRfcmVwYWlyKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIGlzIGEgZ2VuZXJpYyBoYW5kbGVyIGZvciByZWFkcGFnZSBlcnJvcnMgKGRlZmF1bHQKKyAqIHJlYWRwYWdlX2lvX2ZhaWxlZF9ob29rKS4gaWYgb3RoZXIgY29waWVzIGV4aXN0LCByZWFkIHRob3NlIGFuZCB3cml0ZSBiYWNrCisgKiBnb29kIGRhdGEgdG8gdGhlIGZhaWxlZCBwb3NpdGlvbi4gZG9lcyBub3QgaW52ZXN0aWdhdGUgaW4gcmVtYXBwaW5nIHRoZQorICogZmFpbGVkIGV4dGVudCBlbHNld2hlcmUsIGhvcGluZyB0aGUgZGV2aWNlIHdpbGwgYmUgc21hcnQgZW5vdWdoIHRvIGRvIHRoaXMgYXMKKyAqIG5lZWRlZAorICovCisKK3N0YXRpYyBpbnQgYmlvX3JlYWRwYWdlX2Vycm9yKHN0cnVjdCBiaW8gKmZhaWxlZF9iaW8sIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXU2NCBzdGFydCwgdTY0IGVuZCwgaW50IGZhaWxlZF9taXJyb3IsCisJCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjID0gTlVMTDsKKwl1NjQgcHJpdmF0ZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dGVudF9pb190cmVlICpmYWlsdXJlX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBudW1fY29waWVzOworCWludCByZXQ7CisJaW50IHJlYWRfbW9kZTsKKwl1NjQgbG9naWNhbDsKKworCUJVR19PTihmYWlsZWRfYmlvLT5iaV9ydyAmIFJFUV9XUklURSk7CisKKwlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LCAmcHJpdmF0ZSk7CisJaWYgKHJldCkgeworCQlmYWlscmVjID0ga3phbGxvYyhzaXplb2YoKmZhaWxyZWMpLCBHRlBfTk9GUyk7CisJCWlmICghZmFpbHJlYykKKwkJCXJldHVybiAtRU5PTUVNOworCQlmYWlscmVjLT5zdGFydCA9IHN0YXJ0OworCQlmYWlscmVjLT5sZW4gPSBlbmQgLSBzdGFydCArIDE7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yID0gMDsKKwkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gMDsKKwkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDA7CisKKwkJcmVhZF9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGZhaWxyZWMtPmxlbik7CisJCWlmICghZW0pIHsKKwkJCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCWtmcmVlKGZhaWxyZWMpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZW0tPnN0YXJ0ID4gc3RhcnQgfHwgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8IHN0YXJ0KSB7CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJZW0gPSBOVUxMOworCQl9CisJCXJlYWRfdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKworCQlpZiAoIWVtIHx8IElTX0VSUihlbSkpIHsKKwkJCWtmcmVlKGZhaWxyZWMpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJbG9naWNhbCA9IHN0YXJ0IC0gZW0tPnN0YXJ0OworCQlsb2dpY2FsID0gZW0tPmJsb2NrX3N0YXJ0ICsgbG9naWNhbDsKKwkJaWYgKHRlc3RfYml0KEVYVEVOVF9GTEFHX0NPTVBSRVNTRUQsICZlbS0+ZmxhZ3MpKSB7CisJCQlsb2dpY2FsID0gZW0tPmJsb2NrX3N0YXJ0OworCQkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gRVhURU5UX0JJT19DT01QUkVTU0VEOworCQkJZXh0ZW50X3NldF9jb21wcmVzc190eXBlKCZmYWlscmVjLT5iaW9fZmxhZ3MsCisJCQkJCQkgZW0tPmNvbXByZXNzX3R5cGUpOworCQl9CisJCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IChuZXcpIGxvZ2ljYWw9JWxsdSwgc3RhcnQ9JWxsdSwgIgorCQkJICJsZW49JWxsdVxuIiwgbG9naWNhbCwgc3RhcnQsIGZhaWxyZWMtPmxlbik7CisJCWZhaWxyZWMtPmxvZ2ljYWwgPSBsb2dpY2FsOworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCisJCS8qIHNldCB0aGUgYml0cyBpbiB0aGUgcHJpdmF0ZSBmYWlsdXJlIHRyZWUgKi8KKwkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKGZhaWx1cmVfdHJlZSwgc3RhcnQsIGVuZCwKKwkJCQkJRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSwgR0ZQX05PRlMpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSBzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LAorCQkJCQkJKHU2NCkodW5zaWduZWQgbG9uZylmYWlscmVjKTsKKwkJLyogc2V0IHRoZSBiaXRzIGluIHRoZSBpbm9kZSdzIHRyZWUgKi8KKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9EQU1BR0VELAorCQkJCQkJR0ZQX05PRlMpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUoZmFpbHJlYyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJZmFpbHJlYyA9IChzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKikodW5zaWduZWQgbG9uZylwcml2YXRlOworCQlwcl9kZWJ1ZygiYmlvX3JlYWRwYWdlX2Vycm9yOiAoZm91bmQpIGxvZ2ljYWw9JWxsdSwgIgorCQkJICJzdGFydD0lbGx1LCBsZW49JWxsdSwgdmFsaWRhdGlvbj0lZFxuIiwKKwkJCSBmYWlscmVjLT5sb2dpY2FsLCBmYWlscmVjLT5zdGFydCwgZmFpbHJlYy0+bGVuLAorCQkJIGZhaWxyZWMtPmluX3ZhbGlkYXRpb24pOworCQkvKgorCQkgKiB3aGVuIGRhdGEgY2FuIGJlIG9uIGRpc2sgbW9yZSB0aGFuIHR3aWNlLCBhZGQgdG8gZmFpbHJlYyBoZXJlCisJCSAqIChlLmcuIHdpdGggYSBsaXN0IGZvciBmYWlsZWRfbWlycm9yKSB0byBtYWtlCisJCSAqIGNsZWFuX2lvX2ZhaWx1cmUoKSBjbGVhbiBhbGwgdGhvc2UgZXJyb3JzIGF0IG9uY2UuCisJCSAqLworCX0KKwludW1fY29waWVzID0gYnRyZnNfbnVtX2NvcGllcygKKwkJCSAgICAgICZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlLAorCQkJICAgICAgZmFpbHJlYy0+bG9naWNhbCwgZmFpbHJlYy0+bGVuKTsKKwlpZiAobnVtX2NvcGllcyA9PSAxKSB7CisJCS8qCisJCSAqIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBjb3B5IG9mIHRoZSBkYXRhLCBzbyBkb24ndCBib3RoZXIgd2l0aAorCQkgKiBhbGwgdGhlIHJldHJ5IGFuZCBlcnJvciBjb3JyZWN0aW9uIGNvZGUgdGhhdCBmb2xsb3dzLiBubworCQkgKiBtYXR0ZXIgd2hhdCB0aGUgZXJyb3IgaXMsIGl0IGlzIHZlcnkgbGlrZWx5IHRvIHBlcnNpc3QuCisJCSAqLworCQlwcl9kZWJ1ZygiYmlvX3JlYWRwYWdlX2Vycm9yOiBjYW5ub3QgcmVwYWlyLCBudW1fY29waWVzID09IDEuICIKKwkJCSAic3RhdGU9JXAsIG51bV9jb3BpZXM9JWQsIG5leHRfbWlycm9yICVkLCAiCisJCQkgImZhaWxlZF9taXJyb3IgJWRcbiIsIHN0YXRlLCBudW1fY29waWVzLAorCQkJIGZhaWxyZWMtPnRoaXNfbWlycm9yLCBmYWlsZWRfbWlycm9yKTsKKwkJZnJlZV9pb19mYWlsdXJlKGlub2RlLCBmYWlscmVjLCAwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFzdGF0ZSkgeworCQlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCQlzdGF0ZSA9IGZpbmRfZmlyc3RfZXh0ZW50X2JpdF9zdGF0ZSh0cmVlLCBmYWlscmVjLT5zdGFydCwKKwkJCQkJCSAgICBFWFRFTlRfTE9DS0VEKTsKKwkJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCAhPSBmYWlscmVjLT5zdGFydCkKKwkJCXN0YXRlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCX0KKworCS8qCisJICogdGhlcmUgYXJlIHR3byBwcmVtaXNlczoKKwkgKglhKSBkZWxpdmVyIGdvb2QgZGF0YSB0byB0aGUgY2FsbGVyCisJICoJYikgY29ycmVjdCB0aGUgYmFkIHNlY3RvcnMgb24gZGlzaworCSAqLworCWlmIChmYWlsZWRfYmlvLT5iaV92Y250ID4gMSkgeworCQkvKgorCQkgKiB0byBmdWxmaWxsIGIpLCB3ZSBuZWVkIHRvIGtub3cgdGhlIGV4YWN0IGZhaWxpbmcgc2VjdG9ycywgYXMKKwkJICogd2UgZG9uJ3Qgd2FudCB0byByZXdyaXRlIGFueSBtb3JlIHRoYW4gdGhlIGZhaWxlZCBvbmVzLiB0aHVzLAorCQkgKiB3ZSBuZWVkIHNlcGFyYXRlIHJlYWQgcmVxdWVzdHMgZm9yIHRoZSBmYWlsZWQgYmlvCisJCSAqCisJCSAqIGlmIHRoZSBmb2xsb3dpbmcgQlVHX09OIHRyaWdnZXJzLCBvdXIgdmFsaWRhdGlvbiByZXF1ZXN0IGdvdAorCQkgKiBtZXJnZWQuIHdlIG5lZWQgc2VwYXJhdGUgcmVxdWVzdHMgZm9yIG91ciBhbGdvcml0aG0gdG8gd29yay4KKwkJICovCisJCUJVR19PTihmYWlscmVjLT5pbl92YWxpZGF0aW9uKTsKKwkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDE7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yID0gZmFpbGVkX21pcnJvcjsKKwkJcmVhZF9tb2RlID0gUkVBRF9TWU5DIHwgUkVRX0ZBSUxGQVNUX0RFVjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSdyZSByZWFkeSB0byBmdWxmaWxsIGEpIGFuZCBiKSBhbG9uZ3NpZGUuIGdldCBhIGdvb2QgY29weQorCQkgKiBvZiB0aGUgZmFpbGVkIHNlY3RvciBhbmQgaWYgd2Ugc3VjY2VlZCwgd2UgaGF2ZSBzZXR1cAorCQkgKiBldmVyeXRoaW5nIGZvciByZXBhaXJfaW9fZmFpbHVyZSB0byBkbyB0aGUgcmVzdCBmb3IgdXMuCisJCSAqLworCQlpZiAoZmFpbHJlYy0+aW5fdmFsaWRhdGlvbikgeworCQkJQlVHX09OKGZhaWxyZWMtPnRoaXNfbWlycm9yICE9IGZhaWxlZF9taXJyb3IpOworCQkJZmFpbHJlYy0+aW5fdmFsaWRhdGlvbiA9IDA7CisJCQlmYWlscmVjLT50aGlzX21pcnJvciA9IDA7CisJCX0KKwkJZmFpbHJlYy0+ZmFpbGVkX21pcnJvciA9IGZhaWxlZF9taXJyb3I7CisJCWZhaWxyZWMtPnRoaXNfbWlycm9yKys7CisJCWlmIChmYWlscmVjLT50aGlzX21pcnJvciA9PSBmYWlsZWRfbWlycm9yKQorCQkJZmFpbHJlYy0+dGhpc19taXJyb3IrKzsKKwkJcmVhZF9tb2RlID0gUkVBRF9TWU5DOworCX0KKworCWlmICghc3RhdGUgfHwgZmFpbHJlYy0+dGhpc19taXJyb3IgPiBudW1fY29waWVzKSB7CisJCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IChmYWlsKSBzdGF0ZT0lcCwgbnVtX2NvcGllcz0lZCwgIgorCQkJICJuZXh0X21pcnJvciAlZCwgZmFpbGVkX21pcnJvciAlZFxuIiwgc3RhdGUsCisJCQkgbnVtX2NvcGllcywgZmFpbHJlYy0+dGhpc19taXJyb3IsIGZhaWxlZF9taXJyb3IpOworCQlmcmVlX2lvX2ZhaWx1cmUoaW5vZGUsIGZhaWxyZWMsIDApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOworCWJpby0+YmlfcHJpdmF0ZSA9IHN0YXRlOworCWJpby0+YmlfZW5kX2lvID0gZmFpbGVkX2Jpby0+YmlfZW5kX2lvOworCWJpby0+Ymlfc2VjdG9yID0gZmFpbHJlYy0+bG9naWNhbCA+PiA5OworCWJpby0+YmlfYmRldiA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwliaW8tPmJpX3NpemUgPSAwOworCisJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgZmFpbHJlYy0+bGVuLCBzdGFydCAtIHBhZ2Vfb2Zmc2V0KHBhZ2UpKTsKKworCXByX2RlYnVnKCJiaW9fcmVhZHBhZ2VfZXJyb3I6IHN1Ym1pdHRpbmcgbmV3IHJlYWRbJSN4XSB0byAiCisJCSAidGhpc19taXJyb3I9JWQsIG51bV9jb3BpZXM9JWQsIGluX3ZhbGlkYXRpb249JWRcbiIsIHJlYWRfbW9kZSwKKwkJIGZhaWxyZWMtPnRoaXNfbWlycm9yLCBudW1fY29waWVzLCBmYWlscmVjLT5pbl92YWxpZGF0aW9uKTsKKworCXRyZWUtPm9wcy0+c3VibWl0X2Jpb19ob29rKGlub2RlLCByZWFkX21vZGUsIGJpbywgZmFpbHJlYy0+dGhpc19taXJyb3IsCisJCQkJCWZhaWxyZWMtPmJpb19mbGFncywgMCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIGxvdHMgYW5kIGxvdHMgb2Ygcm9vbSBmb3IgcGVyZm9ybWFuY2UgZml4ZXMgaW4gdGhlIGVuZF9iaW8gZnVuY3MgKi8KIAogLyoKQEAgLTE2OTcsNiArMjI0OCw5IEBACiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZCA9IE5VTEw7CiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOwogCisJCXByX2RlYnVnKCJlbmRfYmlvX2V4dGVudF9yZWFkcGFnZTogYmlfdmNudD0lZCwgaWR4PSVkLCBlcnI9JWQsICIKKwkJCSAibWlycm9yPSVsZFxuIiwgYmlvLT5iaV92Y250LCBiaW8tPmJpX2lkeCwgZXJyLAorCQkJIChsb25nIGludCliaW8tPmJpX2JkZXYpOwogCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CiAKIAkJc3RhcnQgPSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCkBAIC0xNzI3LDExICsyMjgxLDE5IEBACiAJCQkJCQkJICAgICAgc3RhdGUpOwogCQkJaWYgKHJldCkKIAkJCQl1cHRvZGF0ZSA9IDA7CisJCQllbHNlCisJCQkJY2xlYW5faW9fZmFpbHVyZShzdGFydCwgcGFnZSk7CiAJCX0KLQkJaWYgKCF1cHRvZGF0ZSAmJiB0cmVlLT5vcHMgJiYKLQkJICAgIHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2spIHsKLQkJCXJldCA9IHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2soYmlvLCBwYWdlLAotCQkJCQkJCSBzdGFydCwgZW5kLCBOVUxMKTsKKwkJaWYgKCF1cHRvZGF0ZSkgeworCQkJdTY0IGZhaWxlZF9taXJyb3I7CisJCQlmYWlsZWRfbWlycm9yID0gKHU2NCliaW8tPmJpX2JkZXY7CisJCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+cmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2spCisJCQkJcmV0ID0gdHJlZS0+b3BzLT5yZWFkcGFnZV9pb19mYWlsZWRfaG9vaygKKwkJCQkJCWJpbywgcGFnZSwgc3RhcnQsIGVuZCwKKwkJCQkJCWZhaWxlZF9taXJyb3IsIHN0YXRlKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBiaW9fcmVhZHBhZ2VfZXJyb3IoYmlvLCBwYWdlLCBzdGFydCwgZW5kLAorCQkJCQkJCSBmYWlsZWRfbWlycm9yLCBOVUxMKTsKIAkJCWlmIChyZXQgPT0gMCkgewogCQkJCXVwdG9kYXRlID0KIAkJCQkJdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CkBAIC0xODExLDYgKzIzNzMsNyBAQAogCQkJCQkgICBtaXJyb3JfbnVtLCBiaW9fZmxhZ3MsIHN0YXJ0KTsKIAllbHNlCiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisKIAlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fRU9QTk9UU1VQUCkpCiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCWJpb19wdXQoYmlvKTsKQEAgLTIwNzYsMTYgKzI2MzksMTYgQEAKIH0KIAogaW50IGV4dGVudF9yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCkKKwkJCSAgICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsIGludCBtaXJyb3JfbnVtKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MgPSAwOwogCWludCByZXQ7CiAKLQlyZXQgPSBfX2V4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBnZXRfZXh0ZW50LCAmYmlvLCAwLAorCXJldCA9IF9fZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHRyZWUsIHBhZ2UsIGdldF9leHRlbnQsICZiaW8sIG1pcnJvcl9udW0sCiAJCQkJICAgICAgJmJpb19mbGFncyk7CiAJaWYgKGJpbykKLQkJcmV0ID0gc3VibWl0X29uZV9iaW8oUkVBRCwgYmlvLCAwLCBiaW9fZmxhZ3MpOworCQlyZXQgPSBzdWJtaXRfb25lX2JpbyhSRUFELCBiaW8sIG1pcnJvcl9udW0sIGJpb19mbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjEzNiw2ICsyNjk5LDcgQEAKIAlpbnQgY29tcHJlc3NlZDsKIAlpbnQgd3JpdGVfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBucl93cml0dGVuID0gMDsKKwlib29sIGZpbGxfZGVsYWxsb2MgPSB0cnVlOwogCiAJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKQogCQl3cml0ZV9mbGFncyA9IFdSSVRFX1NZTkM7CkBAIC0yMTQ1LDYgKzI3MDksOSBAQAogCXRyYWNlX19fZXh0ZW50X3dyaXRlcGFnZShwYWdlLCBpbm9kZSwgd2JjKTsKIAogCVdBUk5fT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCisJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisKIAlwZ19vZmZzZXQgPSBpX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJaWYgKHBhZ2UtPmluZGV4ID4gZW5kX2luZGV4IHx8CiAJICAgKHBhZ2UtPmluZGV4ID09IGVuZF9pbmRleCAmJiAhcGdfb2Zmc2V0KSkgewpAQCAtMjE2NiwxMCArMjczMywxMyBAQAogCiAJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKIAorCWlmICghdHJlZS0+b3BzIHx8ICF0cmVlLT5vcHMtPmZpbGxfZGVsYWxsb2MpCisJCWZpbGxfZGVsYWxsb2MgPSBmYWxzZTsKKwogCWRlbGFsbG9jX3N0YXJ0ID0gc3RhcnQ7CiAJZGVsYWxsb2NfZW5kID0gMDsKIAlwYWdlX3N0YXJ0ZWQgPSAwOwotCWlmICghZXBkLT5leHRlbnRfbG9ja2VkKSB7CisJaWYgKCFlcGQtPmV4dGVudF9sb2NrZWQgJiYgZmlsbF9kZWxhbGxvYykgewogCQl1NjQgZGVsYWxsb2NfdG9fd3JpdGUgPSAwOwogCQkvKgogCQkgKiBtYWtlIHN1cmUgdGhlIHdiYyBtYXBwaW5nIGluZGV4IGlzIGF0IGxlYXN0IHVwZGF0ZWQKQEAgLTI0MjEsMTAgKzI5OTEsMTYgQEAKIAkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKIAkJCSAqIG1hcHBpbmcKIAkJCSAqLwotCQkJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vaykKLQkJCQl0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayhwYWdlKTsKLQkJCWVsc2UKLQkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAodHJlZS0+b3BzICYmCisJCQkgICAgdHJlZS0+b3BzLT53cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spIHsKKwkJCQl0cmVlLT5vcHMtPndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vayhwYWdlLAorCQkJCQkJCSAgICAgICBkYXRhLCBmbHVzaF9mbik7CisJCQl9IGVsc2UgeworCQkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCQkJCWZsdXNoX2ZuKGRhdGEpOworCQkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQkJfQorCQkJfQogCiAJCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSkgewogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMjkyNiw3ICszNTAyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpleHRlbnRfYnVmZmVyX3BhZ2Uoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAoraW5saW5lIHN0cnVjdCBwYWdlICpleHRlbnRfYnVmZmVyX3BhZ2Uoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCiB7CiAJc3RydWN0IHBhZ2UgKnA7CkBAIC0yOTUxLDcgKzM1MjcsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbnVtX2V4dGVudF9wYWdlcyh1NjQgc3RhcnQsIHU2NCBsZW4pCitpbmxpbmUgdW5zaWduZWQgbG9uZyBudW1fZXh0ZW50X3BhZ2VzKHU2NCBzdGFydCwgdTY0IGxlbikKIHsKIAlyZXR1cm4gKChzdGFydCArIGxlbiArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpIC0KIAkJKHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOwpAQCAtMzIwNCw2ICszNzgwLDcgQEAKIAkJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmcGFnZS0+bWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMzNDksOCArMzkyNiw3IEBACiB9CiAKIGludCByZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAotCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCi0JCQkgICAgIHU2NCBzdGFydCwgaW50IHdhaXQsCisJCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdTY0IHN0YXJ0LCBpbnQgd2FpdCwKIAkJCSAgICAgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50LCBpbnQgbWlycm9yX251bSkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CkBAIC0zMzg2LDcgKzM5NjIsNyBAQAogCW51bV9wYWdlcyA9IG51bV9leHRlbnRfcGFnZXMoZWItPnN0YXJ0LCBlYi0+bGVuKTsKIAlmb3IgKGkgPSBzdGFydF9pOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKIAkJcGFnZSA9IGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSk7Ci0JCWlmICghd2FpdCkgeworCQlpZiAod2FpdCA9PSBXQUlUX05PTkUpIHsKIAkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKQogCQkJCWdvdG8gdW5sb2NrX2V4aXQ7CiAJCX0gZWxzZSB7CkBAIC0zNDMwLDcgKzQwMDYsNyBAQAogCWlmIChiaW8pCiAJCXN1Ym1pdF9vbmVfYmlvKFJFQUQsIGJpbywgbWlycm9yX251bSwgYmlvX2ZsYWdzKTsKIAotCWlmIChyZXQgfHwgIXdhaXQpCisJaWYgKHJldCB8fCB3YWl0ICE9IFdBSVRfQ09NUExFVEUpCiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSBzdGFydF9pOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5oIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKaW5kZXggN2IyZjBjMy4uZmViOWJlMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmgKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTE3LDYgKzE3LDggQEAKICNkZWZpbmUgRVhURU5UX05PREFUQVNVTSAoMSA8PCAxMCkKICNkZWZpbmUgRVhURU5UX0RPX0FDQ09VTlRJTkcgKDEgPDwgMTEpCiAjZGVmaW5lIEVYVEVOVF9GSVJTVF9ERUxBTExPQyAoMSA8PCAxMikKKyNkZWZpbmUgRVhURU5UX05FRURfV0FJVCAoMSA8PCAxMykKKyNkZWZpbmUgRVhURU5UX0RBTUFHRUQgKDEgPDwgMTQpCiAjZGVmaW5lIEVYVEVOVF9JT0JJVFMgKEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfV1JJVEVCQUNLKQogI2RlZmluZSBFWFRFTlRfQ1RMQklUUyAoRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfRklSU1RfREVMQUxMT0MpCiAKQEAgLTMyLDYgKzM0LDcgQEAKICNkZWZpbmUgRVhURU5UX0JVRkZFUl9CTE9DS0lORyAxCiAjZGVmaW5lIEVYVEVOVF9CVUZGRVJfRElSVFkgMgogI2RlZmluZSBFWFRFTlRfQlVGRkVSX0NPUlJVUFQgMworI2RlZmluZSBFWFRFTlRfQlVGRkVSX1JFQURBSEVBRCA0CS8qIHRoaXMgZ290IHRyaWdnZXJlZCBieSByZWFkYWhlYWQgKi8KIAogLyogdGhlc2UgYXJlIGZsYWdzIGZvciBleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jICovCiAjZGVmaW5lIEVYVEVOVF9DTEVBUl9VTkxPQ0tfUEFHRSAweDEKQEAgLTY3LDcgKzcwLDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKIAlpbnQgKCpyZWFkcGFnZV9pb19ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIAlpbnQgKCpyZWFkcGFnZV9pb19mYWlsZWRfaG9vaykoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIHU2NCBmYWlsZWRfbWlycm9yLAogCQkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSk7CiAJaW50ICgqd3JpdGVwYWdlX2lvX2ZhaWxlZF9ob29rKShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQl1NjQgc3RhcnQsIHU2NCBlbmQsCkBAIC04NSw3ICs4OCw4IEBACiAJCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcik7CiAJdm9pZCAoKnNwbGl0X2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KTsKLQlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlKTsKKwlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpkYXRhLAorCQkJCQkgICB2b2lkICgqZmx1c2hfZm4pKHZvaWQgKikpOwogfTsKIAogc3RydWN0IGV4dGVudF9pb190cmVlIHsKQEAgLTE4NSw3ICsxODksNyBAQAogaW50IHRyeV9sb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJICAgIGdmcF90IG1hc2spOwogaW50IGV4dGVudF9yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQpOworCQkJICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsIGludCBtaXJyb3JfbnVtKTsKIGludCBfX2luaXQgZXh0ZW50X2lvX2luaXQodm9pZCk7CiB2b2lkIGV4dGVudF9pb19leGl0KHZvaWQpOwogCkBAIC0yMTQsNiArMjE4LDggQEAKIAkJICAgICBnZnBfdCBtYXNrKTsKIGludCBjbGVhcl9leHRlbnRfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCSAgICAgICBnZnBfdCBtYXNrKTsKK2ludCBjb252ZXJ0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICBpbnQgYml0cywgaW50IGNsZWFyX2JpdHMsIGdmcF90IG1hc2spOwogaW50IHNldF9leHRlbnRfZGVsYWxsb2Moc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICoqY2FjaGVkX3N0YXRlLCBnZnBfdCBtYXNrKTsKIGludCBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCkBAIC0yNDgsOSArMjU0LDE0IEBACiBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZmluZF9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCQkJIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOwogdm9pZCBmcmVlX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKKyNkZWZpbmUgV0FJVF9OT05FCTAKKyNkZWZpbmUgV0FJVF9DT01QTEVURQkxCisjZGVmaW5lIFdBSVRfUEFHRV9MT0NLCTIKIGludCByZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAogCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHU2NCBzdGFydCwgaW50IHdhaXQsCiAJCQkgICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwgaW50IG1pcnJvcl9udW0pOwordW5zaWduZWQgbG9uZyBudW1fZXh0ZW50X3BhZ2VzKHU2NCBzdGFydCwgdTY0IGxlbik7CitzdHJ1Y3QgcGFnZSAqZXh0ZW50X2J1ZmZlcl9wYWdlKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdW5zaWduZWQgbG9uZyBpKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGV4dGVudF9idWZmZXJfZ2V0KHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKIHsKQEAgLTMwMCw0ICszMTEsMTAgQEAKIHN0cnVjdCBiaW8gKgogYnRyZnNfYmlvX2FsbG9jKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBmaXJzdF9zZWN0b3IsIGludCBucl92ZWNzLAogCQlnZnBfdCBnZnBfZmxhZ3MpOworCitzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlOworCitpbnQgcmVwYWlyX2lvX2ZhaWx1cmUoc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUsIHU2NCBzdGFydCwKKwkJCXU2NCBsZW5ndGgsIHU2NCBsb2dpY2FsLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCWludCBtaXJyb3JfbnVtKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS1pdGVtLmMgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwppbmRleCBhMWNiNzgyLi5jN2ZiM2E0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLWl0ZW0uYworKysgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwpAQCAtOTEsOCArOTEsNyBAQAogCXN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKml0ZW07CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJdTY0IGNzdW1fb2Zmc2V0ID0gMDsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCBjc3Vtc19pbl9pdGVtOwogCiAJZmlsZV9rZXkub2JqZWN0aWQgPSBCVFJGU19FWFRFTlRfQ1NVTV9PQkpFQ1RJRDsKQEAgLTE2Miw4ICsxNjEsNyBAQAogCXU2NCBpdGVtX2xhc3Rfb2Zmc2V0ID0gMDsKIAl1NjQgZGlza19ieXRlbnI7CiAJdTMyIGRpZmY7Ci0JdTE2IGNzdW1fc2l6ZSA9Ci0JCWJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlpbnQgcmV0OwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKml0ZW0gPSBOVUxMOwpAQCAtMjkwLDcgKzI4OCw3IEBACiAJaW50IHJldDsKIAlzaXplX3Qgc2l6ZTsKIAl1NjQgY3N1bV9lbmQ7Ci0JdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQpAQCAtNDkyLDggKzQ5MCw3IEBACiAJCQkJICAgICAgdTY0IGJ5dGVuciwgdTY0IGxlbikKIHsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCXU2NCBjc3VtX2VuZDsKIAl1NjQgZW5kX2J5dGUgPSBieXRlbnIgKyBsZW47CiAJdTMyIGJsb2Nrc2l6ZV9iaXRzID0gcm9vdC0+ZnNfaW5mby0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CkBAIC01NDksOCArNTQ2LDcgQEAKIAl1NjQgY3N1bV9lbmQ7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJaW50IHJldDsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCBibG9ja3NpemVfYml0cyA9IHJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCiAJcm9vdCA9IHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdDsKQEAgLTY3Niw4ICs2NzIsNyBAQAogCXN0cnVjdCBidHJmc19zZWN0b3Jfc3VtICpzZWN0b3Jfc3VtOwogCXUzMiBucml0ZW1zOwogCXUzMiBpbnNfc2l6ZTsKLQl1MTYgY3N1bV9zaXplID0KLQkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggZTRlNTdkNS4uZGFmZGZhMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtMTA2OSw2ICsxMDY5LDcgQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CiAJaW50IGVyciA9IDA7CiAJaW50IGZhaWxpID0gMDsKIAl1NjQgc3RhcnRfcG9zOwpAQCAtMTA4MCw3ICsxMDgxLDcgQEAKIGFnYWluOgogCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewogCQlwYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXggKyBpLAotCQkJCQkgICAgICAgR0ZQX05PRlMpOworCQkJCQkgICAgICAgbWFzayk7CiAJCWlmICghcGFnZXNbaV0pIHsKIAkJCWZhaWxpID0gaSAtIDE7CiAJCQllcnIgPSAtRU5PTUVNOwpAQCAtMTYxNSwxMCArMTYxNiw2IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIGFsbG9jX2VuZCAtIGFsbG9jX3N0YXJ0KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQogCWxvY2tlZF9lbmQgPSBhbGxvY19lbmQgLSAxOwogCXdoaWxlICgxKSB7CiAJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKQEAgLTE2NjQsMTEgKzE2NjEsMjcgQEAKIAkJaWYgKGVtLT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0hPTEUgfHwKIAkJICAgIChjdXJfb2Zmc2V0ID49IGlub2RlLT5pX3NpemUgJiYKIAkJICAgICAhdGVzdF9iaXQoRVhURU5UX0ZMQUdfUFJFQUxMT0MsICZlbS0+ZmxhZ3MpKSkgeworCisJCQkvKgorCQkJICogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGJlZm9yZSB3ZSBkbyB0aGUKKwkJCSAqIGFsbG9jYXRpb24uCisJCQkgKi8KKwkJCXJldCA9IGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZShpbm9kZSwgbGFzdF9ieXRlIC0KKwkJCQkJCQkgIGN1cl9vZmZzZXQpOworCQkJaWYgKHJldCkgeworCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCXJldCA9IGJ0cmZzX3ByZWFsbG9jX2ZpbGVfcmFuZ2UoaW5vZGUsIG1vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCQkJbGFzdF9ieXRlIC0gY3VyX29mZnNldCwKIAkJCQkJCQkxIDw8IGlub2RlLT5pX2Jsa2JpdHMsCiAJCQkJCQkJb2Zmc2V0ICsgbGVuLAogCQkJCQkJCSZhbGxvY19oaW50KTsKKworCQkJLyogTGV0IGdvIG9mIG91ciByZXNlcnZhdGlvbi4gKi8KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgbGFzdF9ieXRlIC0KKwkJCQkJCSAgICAgICBjdXJfb2Zmc2V0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKIAkJCQlicmVhazsKQEAgLTE2OTQsOCArMTcwNyw2IEBACiAJfQogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsIGxvY2tlZF9lbmQsCiAJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKLQotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgYWxsb2NfZW5kIC0gYWxsb2Nfc3RhcnQpOwogb3V0OgogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xODIxLDcgKzE4MzIsNyBAQAogCXN3aXRjaCAob3JpZ2luKSB7CiAJY2FzZSBTRUVLX0VORDoKIAljYXNlIFNFRUtfQ1VSOgotCQlvZmZzZXQgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJb2Zmc2V0ID0gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiAJCWdvdG8gb3V0OwogCWNhc2UgU0VFS19EQVRBOgogCWNhc2UgU0VFS19IT0xFOgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jIGIvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCmluZGV4IDQxYWM5MjcuLjE4MTc2MGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZyZWUtc3BhY2UtY2FjaGUuYworKysgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlICJjdHJlZS5oIgogI2luY2x1ZGUgImZyZWUtc3BhY2UtY2FjaGUuaCIKICNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgpAQCAtODQsNiArODUsNyBAQAogCQkJCSAgICAgICpibG9ja19ncm91cCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJdTMyIGZsYWdzID0gQlRSRlNfSU5PREVfTk9EQVRBU1VNIHwgQlRSRlNfSU5PREVfTk9EQVRBQ09XOwogCiAJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CiAJaWYgKGJsb2NrX2dyb3VwLT5pbm9kZSkKQEAgLTk4LDEzICsxMDAsMTQgQEAKIAkJcmV0dXJuIGlub2RlOwogCiAJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+bG9jayk7Ci0JaWYgKEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTSkgeworCWlmICghKChCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk9sZCBzdHlsZSBzcGFjZSBpbm9kZSBmb3VuZCwgY29udmVydGluZy5cbiIpOwotCQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX05PREFUQVNVTTsKKwkJQlRSRlNfSShpbm9kZSktPmZsYWdzIHw9IEJUUkZTX0lOT0RFX05PREFUQVNVTSB8CisJCQlCVFJGU19JTk9ERV9OT0RBVEFDT1c7CiAJCWJsb2NrX2dyb3VwLT5kaXNrX2NhY2hlX3N0YXRlID0gQlRSRlNfRENfQ0xFQVI7CiAJfQogCi0JaWYgKCFidHJmc19mc19jbG9zaW5nKHJvb3QtPmZzX2luZm8pKSB7CisJaWYgKCFibG9ja19ncm91cC0+aXJlZikgewogCQlibG9ja19ncm91cC0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CiAJCWJsb2NrX2dyb3VwLT5pcmVmID0gMTsKIAl9CkBAIC0xMjIsMTIgKzEyNSwxNyBAQAogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2hlYWRlciAqaGVhZGVyOwogCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXU2NCBmbGFncyA9IEJUUkZTX0lOT0RFX05PQ09NUFJFU1MgfCBCVFJGU19JTk9ERV9QUkVBTExPQzsKIAlpbnQgcmV0OwogCiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2lub2RlKHRyYW5zLCByb290LCBwYXRoLCBpbm8pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBXZSBpbmxpbmUgY3JjJ3MgZm9yIHRoZSBmcmVlIGRpc2sgc3BhY2UgY2FjaGUgKi8KKwlpZiAoaW5vICE9IEJUUkZTX0ZSRUVfSU5PX09CSkVDVElEKQorCQlmbGFncyB8PSBCVFJGU19JTk9ERV9OT0RBVEFTVU0gfCBCVFJGU19JTk9ERV9OT0RBVEFDT1c7CisKIAlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CkBAIC0xNDAsOCArMTQ4LDcgQEAKIAlidHJmc19zZXRfaW5vZGVfdWlkKGxlYWYsIGlub2RlX2l0ZW0sIDApOwogCWJ0cmZzX3NldF9pbm9kZV9naWQobGVhZiwgaW5vZGVfaXRlbSwgMCk7CiAJYnRyZnNfc2V0X2lub2RlX21vZGUobGVhZiwgaW5vZGVfaXRlbSwgU19JRlJFRyB8IDA2MDApOwotCWJ0cmZzX3NldF9pbm9kZV9mbGFncyhsZWFmLCBpbm9kZV9pdGVtLCBCVFJGU19JTk9ERV9OT0NPTVBSRVNTIHwKLQkJCSAgICAgIEJUUkZTX0lOT0RFX1BSRUFMTE9DKTsKKwlidHJmc19zZXRfaW5vZGVfZmxhZ3MobGVhZiwgaW5vZGVfaXRlbSwgZmxhZ3MpOwogCWJ0cmZzX3NldF9pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtLCAxKTsKIAlidHJmc19zZXRfaW5vZGVfdHJhbnNpZChsZWFmLCBpbm9kZV9pdGVtLCB0cmFucy0+dHJhbnNpZCk7CiAJYnRyZnNfc2V0X2lub2RlX2Jsb2NrX2dyb3VwKGxlYWYsIGlub2RlX2l0ZW0sIG9mZnNldCk7CkBAIC0xOTEsMTYgKzE5OCwyNCBAQAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdjsKKwl1NjQgbmVlZGVkX2J5dGVzOwogCWxvZmZfdCBvbGRzaXplOwogCWludCByZXQgPSAwOwogCiAJcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKLQl0cmFucy0+YmxvY2tfcnN2ID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdjsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJvb3QsCi0JCQkJICAgIHJvb3QtPm9ycGhhbl9ibG9ja19yc3YsCi0JCQkJICAgIDAsIDUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJdHJhbnMtPmJsb2NrX3JzdiA9ICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2OworCisJLyogMSBmb3Igc2xhY2sgc3BhY2UsIDEgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSAqLworCW5lZWRlZF9ieXRlcyA9IGJ0cmZzX2NhbGNfdHJ1bmNfbWV0YWRhdGFfc2l6ZShyb290LCAxKSArCisJCWJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCAxKTsKKworCXNwaW5fbG9jaygmdHJhbnMtPmJsb2NrX3Jzdi0+bG9jayk7CisJaWYgKHRyYW5zLT5ibG9ja19yc3YtPnJlc2VydmVkIDwgbmVlZGVkX2J5dGVzKSB7CisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+YmxvY2tfcnN2LT5sb2NrKTsKKwkJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmFucy0+YmxvY2tfcnN2LT5sb2NrKTsKIAogCW9sZHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKQEAgLTIxMywxMyArMjI4LDE1IEBACiAJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLAogCQkJCQkgMCwgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKIAotCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CiAJaWYgKHJldCkgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gcnN2OwogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDIsMjYgKzI1OSwzNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGlvX2N0bCB7CisJdm9pZCAqY3VyLCAqb3JpZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgaW5kZXg7CisJaW50IG51bV9wYWdlczsKKwl1bnNpZ25lZCBjaGVja19jcmNzOjE7Cit9OworCitzdGF0aWMgaW50IGlvX2N0bF9pbml0KHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCW1lbXNldChpb19jdGwsIDAsIHNpemVvZihzdHJ1Y3QgaW9fY3RsKSk7CisJaW9fY3RsLT5udW1fcGFnZXMgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KKwkJUEFHRV9DQUNIRV9TSElGVDsKKwlpb19jdGwtPnBhZ2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBpb19jdGwtPm51bV9wYWdlcywKKwkJCQlHRlBfTk9GUyk7CisJaWYgKCFpb19jdGwtPnBhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpb19jdGwtPnJvb3QgPSByb290OworCWlmIChidHJmc19pbm8oaW5vZGUpICE9IEJUUkZTX0ZSRUVfSU5PX09CSkVDVElEKQorCQlpb19jdGwtPmNoZWNrX2NyY3MgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb19jdGxfZnJlZShzdHJ1Y3QgaW9fY3RsICppb19jdGwpCit7CisJa2ZyZWUoaW9fY3RsLT5wYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF91bm1hcF9wYWdlKHN0cnVjdCBpb19jdGwgKmlvX2N0bCkKK3sKKwlpZiAoaW9fY3RsLT5jdXIpIHsKKwkJa3VubWFwKGlvX2N0bC0+cGFnZSk7CisJCWlvX2N0bC0+Y3VyID0gTlVMTDsKKwkJaW9fY3RsLT5vcmlnID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF9tYXBfcGFnZShzdHJ1Y3QgaW9fY3RsICppb19jdGwsIGludCBjbGVhcikKK3sKKwlXQVJOX09OKGlvX2N0bC0+Y3VyKTsKKwlCVUdfT04oaW9fY3RsLT5pbmRleCA+PSBpb19jdGwtPm51bV9wYWdlcyk7CisJaW9fY3RsLT5wYWdlID0gaW9fY3RsLT5wYWdlc1tpb19jdGwtPmluZGV4KytdOworCWlvX2N0bC0+Y3VyID0ga21hcChpb19jdGwtPnBhZ2UpOworCWlvX2N0bC0+b3JpZyA9IGlvX2N0bC0+Y3VyOworCWlvX2N0bC0+c2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlpZiAoY2xlYXIpCisJCW1lbXNldChpb19jdGwtPmN1ciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgaW9fY3RsX2Ryb3BfcGFnZXMoc3RydWN0IGlvX2N0bCAqaW9fY3RsKQoreworCWludCBpOworCisJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb19jdGwtPm51bV9wYWdlczsgaSsrKSB7CisJCUNsZWFyUGFnZUNoZWNrZWQoaW9fY3RsLT5wYWdlc1tpXSk7CisJCXVubG9ja19wYWdlKGlvX2N0bC0+cGFnZXNbaV0pOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoaW9fY3RsLT5wYWdlc1tpXSk7CisJfQorfQorCitzdGF0aWMgaW50IGlvX2N0bF9wcmVwYXJlX3BhZ2VzKHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlpbnQgdXB0b2RhdGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9fY3RsLT5udW1fcGFnZXM7IGkrKykgeworCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpLCBtYXNrKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlpb19jdGxfZHJvcF9wYWdlcyhpb19jdGwpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaW9fY3RsLT5wYWdlc1tpXSA9IHBhZ2U7CisJCWlmICh1cHRvZGF0ZSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlidHJmc19yZWFkcGFnZShOVUxMLCBwYWdlKTsKKwkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZXJyb3IgcmVhZGluZyBmcmVlICIKKwkJCQkgICAgICAgInNwYWNlIGNhY2hlXG4iKTsKKwkJCQlpb19jdGxfZHJvcF9wYWdlcyhpb19jdGwpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2N0bF9zZXRfZ2VuZXJhdGlvbihzdHJ1Y3QgaW9fY3RsICppb19jdGwsIHU2NCBnZW5lcmF0aW9uKQoreworCXU2NCAqdmFsOworCisJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMSk7CisKKwkvKgorCSAqIFNraXAgdGhlIGNzdW0gYXJlYXMuICBJZiB3ZSBkb24ndCBjaGVjayBjcmNzIHRoZW4gd2UganVzdCBoYXZlIGEKKwkgKiA2NGJpdCBjaHVuayBhdCB0aGUgZnJvbnQgb2YgdGhlIGZpcnN0IHBhZ2UuCisJICovCisJaWYgKGlvX2N0bC0+Y2hlY2tfY3JjcykgeworCQlpb19jdGwtPmN1ciArPSAoc2l6ZW9mKHUzMikgKiBpb19jdGwtPm51bV9wYWdlcyk7CisJCWlvX2N0bC0+c2l6ZSAtPSBzaXplb2YodTY0KSArIChzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzKTsKKwl9IGVsc2UgeworCQlpb19jdGwtPmN1ciArPSBzaXplb2YodTY0KTsKKwkJaW9fY3RsLT5zaXplIC09IHNpemVvZih1NjQpICogMjsKKwl9CisKKwl2YWwgPSBpb19jdGwtPmN1cjsKKwkqdmFsID0gY3B1X3RvX2xlNjQoZ2VuZXJhdGlvbik7CisJaW9fY3RsLT5jdXIgKz0gc2l6ZW9mKHU2NCk7Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX2NoZWNrX2dlbmVyYXRpb24oc3RydWN0IGlvX2N0bCAqaW9fY3RsLCB1NjQgZ2VuZXJhdGlvbikKK3sKKwl1NjQgKmdlbjsKKworCS8qCisJICogU2tpcCB0aGUgY3JjIGFyZWEuICBJZiB3ZSBkb24ndCBjaGVjayBjcmNzIHRoZW4gd2UganVzdCBoYXZlIGEgNjRiaXQKKwkgKiBjaHVuayBhdCB0aGUgZnJvbnQgb2YgdGhlIGZpcnN0IHBhZ2UuCisJICovCisJaWYgKGlvX2N0bC0+Y2hlY2tfY3JjcykgeworCQlpb19jdGwtPmN1ciArPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOworCQlpb19jdGwtPnNpemUgLT0gc2l6ZW9mKHU2NCkgKworCQkJKHNpemVvZih1MzIpICogaW9fY3RsLT5udW1fcGFnZXMpOworCX0gZWxzZSB7CisJCWlvX2N0bC0+Y3VyICs9IHNpemVvZih1NjQpOworCQlpb19jdGwtPnNpemUgLT0gc2l6ZW9mKHU2NCkgKiAyOworCX0KKworCWdlbiA9IGlvX2N0bC0+Y3VyOworCWlmIChsZTY0X3RvX2NwdSgqZ2VuKSAhPSBnZW5lcmF0aW9uKSB7CisJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiYnRyZnM6IHNwYWNlIGNhY2hlIGdlbmVyYXRpb24gIgorCQkJCSAgICIoJUx1KSBkb2VzIG5vdCBtYXRjaCBpbm9kZSAoJUx1KVxuIiwgKmdlbiwKKwkJCQkgICBnZW5lcmF0aW9uKTsKKwkJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlvX2N0bC0+Y3VyICs9IHNpemVvZih1NjQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpb19jdGxfc2V0X2NyYyhzdHJ1Y3QgaW9fY3RsICppb19jdGwsIGludCBpbmRleCkKK3sKKwl1MzIgKnRtcDsKKwl1MzIgY3JjID0gfih1MzIpMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCisJaWYgKCFpb19jdGwtPmNoZWNrX2NyY3MpIHsKKwkJaW9fY3RsX3VubWFwX3BhZ2UoaW9fY3RsKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmRleCA9PSAwKQorCQlvZmZzZXQgPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOzsKKworCWNyYyA9IGJ0cmZzX2NzdW1fZGF0YShpb19jdGwtPnJvb3QsIGlvX2N0bC0+b3JpZyArIG9mZnNldCwgY3JjLAorCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlidHJmc19jc3VtX2ZpbmFsKGNyYywgKGNoYXIgKikmY3JjKTsKKwlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCXRtcCA9IGttYXAoaW9fY3RsLT5wYWdlc1swXSk7CisJdG1wICs9IGluZGV4OworCSp0bXAgPSBjcmM7CisJa3VubWFwKGlvX2N0bC0+cGFnZXNbMF0pOworfQorCitzdGF0aWMgaW50IGlvX2N0bF9jaGVja19jcmMoc3RydWN0IGlvX2N0bCAqaW9fY3RsLCBpbnQgaW5kZXgpCit7CisJdTMyICp0bXAsIHZhbDsKKwl1MzIgY3JjID0gfih1MzIpMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSAwOworCisJaWYgKCFpb19jdGwtPmNoZWNrX2NyY3MpIHsKKwkJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbmRleCA9PSAwKQorCQlvZmZzZXQgPSBzaXplb2YodTMyKSAqIGlvX2N0bC0+bnVtX3BhZ2VzOworCisJdG1wID0ga21hcChpb19jdGwtPnBhZ2VzWzBdKTsKKwl0bXAgKz0gaW5kZXg7CisJdmFsID0gKnRtcDsKKwlrdW5tYXAoaW9fY3RsLT5wYWdlc1swXSk7CisKKwlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwljcmMgPSBidHJmc19jc3VtX2RhdGEoaW9fY3RsLT5yb290LCBpb19jdGwtPm9yaWcgKyBvZmZzZXQsIGNyYywKKwkJCSAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CisJYnRyZnNfY3N1bV9maW5hbChjcmMsIChjaGFyICopJmNyYyk7CisJaWYgKHZhbCAhPSBjcmMpIHsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogY3N1bSBtaXNtYXRjaCBvbiBmcmVlICIKKwkJCQkgICAic3BhY2UgY2FjaGVcbiIpOworCQlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb19jdGxfYWRkX2VudHJ5KHN0cnVjdCBpb19jdGwgKmlvX2N0bCwgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLAorCQkJICAgIHZvaWQgKmJpdG1hcCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSAqZW50cnk7CisKKwlpZiAoIWlvX2N0bC0+Y3VyKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWVudHJ5ID0gaW9fY3RsLT5jdXI7CisJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KG9mZnNldCk7CisJZW50cnktPmJ5dGVzID0gY3B1X3RvX2xlNjQoYnl0ZXMpOworCWVudHJ5LT50eXBlID0gKGJpdG1hcCkgPyBCVFJGU19GUkVFX1NQQUNFX0JJVE1BUCA6CisJCUJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UOworCWlvX2N0bC0+Y3VyICs9IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7CisJaW9fY3RsLT5zaXplIC09IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7CisKKwlpZiAoaW9fY3RsLT5zaXplID49IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSkpCisJCXJldHVybiAwOworCisJaW9fY3RsX3NldF9jcmMoaW9fY3RsLCBpb19jdGwtPmluZGV4IC0gMSk7CisKKwkvKiBObyBtb3JlIHBhZ2VzIHRvIG1hcCAqLworCWlmIChpb19jdGwtPmluZGV4ID49IGlvX2N0bC0+bnVtX3BhZ2VzKQorCQlyZXR1cm4gMDsKKworCS8qIG1hcCB0aGUgbmV4dCBwYWdlICovCisJaW9fY3RsX21hcF9wYWdlKGlvX2N0bCwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX2FkZF9iaXRtYXAoc3RydWN0IGlvX2N0bCAqaW9fY3RsLCB2b2lkICpiaXRtYXApCit7CisJaWYgKCFpb19jdGwtPmN1cikKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKgorCSAqIElmIHdlIGFyZW4ndCBhdCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGFnZSwgdW5tYXAgdGhpcyBvbmUgYW5kCisJICogbWFwIHRoZSBuZXh0IG9uZSBpZiB0aGVyZSBpcyBhbnkgbGVmdC4KKwkgKi8KKwlpZiAoaW9fY3RsLT5jdXIgIT0gaW9fY3RsLT5vcmlnKSB7CisJCWlvX2N0bF9zZXRfY3JjKGlvX2N0bCwgaW9fY3RsLT5pbmRleCAtIDEpOworCQlpZiAoaW9fY3RsLT5pbmRleCA+PSBpb19jdGwtPm51bV9wYWdlcykKKwkJCXJldHVybiAtRU5PU1BDOworCQlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwl9CisKKwltZW1jcHkoaW9fY3RsLT5jdXIsIGJpdG1hcCwgUEFHRV9DQUNIRV9TSVpFKTsKKwlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwlpZiAoaW9fY3RsLT5pbmRleCA8IGlvX2N0bC0+bnVtX3BhZ2VzKQorCQlpb19jdGxfbWFwX3BhZ2UoaW9fY3RsLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW9fY3RsX3plcm9fcmVtYWluaW5nX3BhZ2VzKHN0cnVjdCBpb19jdGwgKmlvX2N0bCkKK3sKKwkvKgorCSAqIElmIHdlJ3JlIG5vdCBvbiB0aGUgYm91bmRhcnkgd2Uga25vdyB3ZSd2ZSBtb2RpZmllZCB0aGUgcGFnZSBhbmQgd2UKKwkgKiBuZWVkIHRvIGNyYyB0aGUgcGFnZS4KKwkgKi8KKwlpZiAoaW9fY3RsLT5jdXIgIT0gaW9fY3RsLT5vcmlnKQorCQlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwllbHNlCisJCWlvX2N0bF91bm1hcF9wYWdlKGlvX2N0bCk7CisKKwl3aGlsZSAoaW9fY3RsLT5pbmRleCA8IGlvX2N0bC0+bnVtX3BhZ2VzKSB7CisJCWlvX2N0bF9tYXBfcGFnZShpb19jdGwsIDEpOworCQlpb19jdGxfc2V0X2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXggLSAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW9fY3RsX3JlYWRfZW50cnkoc3RydWN0IGlvX2N0bCAqaW9fY3RsLAorCQkJICAgIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeSwgdTggKnR5cGUpCit7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkgKmU7CisJaW50IHJldDsKKworCWlmICghaW9fY3RsLT5jdXIpIHsKKwkJcmV0ID0gaW9fY3RsX2NoZWNrX2NyYyhpb19jdGwsIGlvX2N0bC0+aW5kZXgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwllID0gaW9fY3RsLT5jdXI7CisJZW50cnktPm9mZnNldCA9IGxlNjRfdG9fY3B1KGUtPm9mZnNldCk7CisJZW50cnktPmJ5dGVzID0gbGU2NF90b19jcHUoZS0+Ynl0ZXMpOworCSp0eXBlID0gZS0+dHlwZTsKKwlpb19jdGwtPmN1ciArPSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpOworCWlvX2N0bC0+c2l6ZSAtPSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpOworCisJaWYgKGlvX2N0bC0+c2l6ZSA+PSBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpKQorCQlyZXR1cm4gMDsKKworCWlvX2N0bF91bm1hcF9wYWdlKGlvX2N0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb19jdGxfcmVhZF9iaXRtYXAoc3RydWN0IGlvX2N0bCAqaW9fY3RsLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmVudHJ5KQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb19jdGxfY2hlY2tfY3JjKGlvX2N0bCwgaW9fY3RsLT5pbmRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweShlbnRyeS0+Yml0bWFwLCBpb19jdGwtPmN1ciwgUEFHRV9DQUNIRV9TSVpFKTsKKwlpb19jdGxfdW5tYXBfcGFnZShpb19jdGwpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBfX2xvYWRfZnJlZV9zcGFjZV9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9mZnNldCkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9oZWFkZXIgKmhlYWRlcjsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW9fY3RsIGlvX2N0bDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZSwgKm47CiAJc3RydWN0IGxpc3RfaGVhZCBiaXRtYXBzOwogCXU2NCBudW1fZW50cmllczsKIAl1NjQgbnVtX2JpdG1hcHM7CiAJdTY0IGdlbmVyYXRpb247Ci0JcGdvZmZfdCBpbmRleCA9IDA7CisJdTggdHlwZTsKIAlpbnQgcmV0ID0gMDsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBzKTsKIAogCS8qIE5vdGhpbmcgaW4gdGhlIHNwYWNlIGNhY2hlLCBnb29kYnllICovCiAJaWYgKCFpX3NpemVfcmVhZChpbm9kZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZSRUVfU1BBQ0VfT0JKRUNUSUQ7CiAJa2V5Lm9mZnNldCA9IG9mZnNldDsKQEAgLTI2OSwxMSArNjAzLDEwIEBACiAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCWVsc2UgaWYgKHJldCA+IDApIHsKIAkJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJcmV0ID0gLTE7CkBAIC0yOTEsMTY5ICs2MjQsMTAyIEBACiAJCSAgICAgICAiIG5vdCBtYXRjaCBmcmVlIHNwYWNlIGNhY2hlIGdlbmVyYXRpb24gKCVsbHUpXG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZ2VuZXJhdGlvbik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoIW51bV9lbnRyaWVzKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAKKwlpb19jdGxfaW5pdCgmaW9fY3RsLCBpbm9kZSwgcm9vdCk7CiAJcmV0ID0gcmVhZGFoZWFkX2NhY2hlKGlub2RlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5ICplbnRyeTsKLQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmU7Ci0JCXZvaWQgKmFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQkJaW50IG5lZWRfbG9vcCA9IDA7CisJcmV0ID0gaW9fY3RsX3ByZXBhcmVfcGFnZXMoJmlvX2N0bCwgaW5vZGUsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JCWlmICghbnVtX2VudHJpZXMgJiYgIW51bV9iaXRtYXBzKQotCQkJYnJlYWs7CisJcmV0ID0gaW9fY3RsX2NoZWNrX2NyYygmaW9fY3RsLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfY2FjaGU7CiAKLQkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKLQkJaWYgKCFwYWdlKQorCXJldCA9IGlvX2N0bF9jaGVja19nZW5lcmF0aW9uKCZpb19jdGwsIGdlbmVyYXRpb24pOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9jYWNoZTsKKworCXdoaWxlIChudW1fZW50cmllcykgeworCQllID0ga21lbV9jYWNoZV96YWxsb2MoYnRyZnNfZnJlZV9zcGFjZV9jYWNoZXAsCisJCQkJICAgICAgR0ZQX05PRlMpOworCQlpZiAoIWUpCiAJCQlnb3RvIGZyZWVfY2FjaGU7CiAKLQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCWJ0cmZzX3JlYWRwYWdlKE5VTEwsIHBhZ2UpOwotCQkJbG9ja19wYWdlKHBhZ2UpOwotCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogZXJyb3IgcmVhZGluZyBmcmVlICIKLQkJCQkgICAgICAgInNwYWNlIGNhY2hlXG4iKTsKLQkJCQlnb3RvIGZyZWVfY2FjaGU7Ci0JCQl9CisJCXJldCA9IGlvX2N0bF9yZWFkX2VudHJ5KCZpb19jdGwsIGUsICZ0eXBlKTsKKwkJaWYgKHJldCkgeworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJfQotCQlhZGRyID0ga21hcChwYWdlKTsKIAotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJdTY0ICpnZW47Ci0KLQkJCS8qCi0JCQkgKiBXZSBwdXQgYSBib2d1cyBjcmMgaW4gdGhlIGZyb250IG9mIHRoZSBmaXJzdCBwYWdlIGluCi0JCQkgKiBjYXNlIG9sZCBrZXJuZWxzIHRyeSB0byBtb3VudCBhIGZzIHdpdGggdGhlIG5ldwotCQkJICogZm9ybWF0IHRvIG1ha2Ugc3VyZSB0aGV5IGRpc2NhcmQgdGhlIGNhY2hlLgotCQkJICovCi0JCQlhZGRyICs9IHNpemVvZih1NjQpOwotCQkJb2Zmc2V0ICs9IHNpemVvZih1NjQpOwotCi0JCQlnZW4gPSBhZGRyOwotCQkJaWYgKCpnZW4gIT0gQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24pIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBzcGFjZSBjYWNoZSBnZW5lcmF0aW9uIgotCQkJCSAgICAgICAiICglbGx1KSBkb2VzIG5vdCBtYXRjaCBpbm9kZSAoJWxsdSlcbiIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKmdlbiwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgICAgICAgQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24pOwotCQkJCWt1bm1hcChwYWdlKTsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJZ290byBmcmVlX2NhY2hlOwotCQkJfQotCQkJYWRkciArPSBzaXplb2YodTY0KTsKLQkJCW9mZnNldCArPSBzaXplb2YodTY0KTsKKwkJaWYgKCFlLT5ieXRlcykgeworCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJfQotCQllbnRyeSA9IGFkZHI7CiAKLQkJd2hpbGUgKDEpIHsKLQkJCWlmICghbnVtX2VudHJpZXMpCi0JCQkJYnJlYWs7Ci0KLQkJCW5lZWRfbG9vcCA9IDE7Ci0JCQllID0ga21lbV9jYWNoZV96YWxsb2MoYnRyZnNfZnJlZV9zcGFjZV9jYWNoZXAsCi0JCQkJCSAgICAgIEdGUF9OT0ZTKTsKLQkJCWlmICghZSkgewotCQkJCWt1bm1hcChwYWdlKTsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJZ290byBmcmVlX2NhY2hlOwotCQkJfQotCi0JCQllLT5vZmZzZXQgPSBsZTY0X3RvX2NwdShlbnRyeS0+b2Zmc2V0KTsKLQkJCWUtPmJ5dGVzID0gbGU2NF90b19jcHUoZW50cnktPmJ5dGVzKTsKLQkJCWlmICghZS0+Ynl0ZXMpIHsKLQkJCQlrdW5tYXAocGFnZSk7CisJCWlmICh0eXBlID09IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UKSB7CisJCQlzcGluX2xvY2soJmN0bC0+dHJlZV9sb2NrKTsKKwkJCXJldCA9IGxpbmtfZnJlZV9zcGFjZShjdGwsIGUpOworCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkR1cGxpY2F0ZSBlbnRyaWVzIGluICIKKwkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOwogCQkJCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgZSk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJCWdvdG8gZnJlZV9jYWNoZTsKIAkJCX0KLQotCQkJaWYgKGVudHJ5LT50eXBlID09IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UKSB7Ci0JCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7Ci0JCQkJc3Bpbl91bmxvY2soJmN0bC0+dHJlZV9sb2NrKTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgotCQkJCQkgICAgICAgImZyZWUgc3BhY2UgY2FjaGUsIGR1bXBpbmdcbiIpOwotCQkJCQlrdW5tYXAocGFnZSk7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWdvdG8gZnJlZV9jYWNoZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWUtPmJpdG1hcCA9IGt6YWxsb2MoUEFHRV9DQUNIRV9TSVpFLCBHRlBfTk9GUyk7Ci0JCQkJaWYgKCFlLT5iaXRtYXApIHsKLQkJCQkJa3VubWFwKHBhZ2UpOwotCQkJCQlrbWVtX2NhY2hlX2ZyZWUoCi0JCQkJCQlidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgZSk7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWdvdG8gZnJlZV9jYWNoZTsKLQkJCQl9Ci0JCQkJc3Bpbl9sb2NrKCZjdGwtPnRyZWVfbG9jayk7Ci0JCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7Ci0JCQkJY3RsLT50b3RhbF9iaXRtYXBzKys7Ci0JCQkJY3RsLT5vcC0+cmVjYWxjX3RocmVzaG9sZHMoY3RsKTsKLQkJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwotCQkJCWlmIChyZXQpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJEdXBsaWNhdGUgZW50cmllcyBpbiAiCi0JCQkJCSAgICAgICAiZnJlZSBzcGFjZSBjYWNoZSwgZHVtcGluZ1xuIik7Ci0JCQkJCWt1bm1hcChwYWdlKTsKLQkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCQkJZ290byBmcmVlX2NhY2hlOwotCQkJCX0KLQkJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwcyk7CisJCX0gZWxzZSB7CisJCQlCVUdfT04oIW51bV9iaXRtYXBzKTsKKwkJCW51bV9iaXRtYXBzLS07CisJCQllLT5iaXRtYXAgPSBremFsbG9jKFBBR0VfQ0FDSEVfU0laRSwgR0ZQX05PRlMpOworCQkJaWYgKCFlLT5iaXRtYXApIHsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoCisJCQkJCWJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCQlnb3RvIGZyZWVfY2FjaGU7CiAJCQl9Ci0KLQkJCW51bV9lbnRyaWVzLS07Ci0JCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KTsKLQkJCWlmIChvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpID49Ci0JCQkgICAgUEFHRV9DQUNIRV9TSVpFKQotCQkJCWJyZWFrOwotCQkJZW50cnkrKzsKKwkJCXNwaW5fbG9jaygmY3RsLT50cmVlX2xvY2spOworCQkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgZSk7CisJCQljdGwtPnRvdGFsX2JpdG1hcHMrKzsKKwkJCWN0bC0+b3AtPnJlY2FsY190aHJlc2hvbGRzKGN0bCk7CisJCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRHVwbGljYXRlIGVudHJpZXMgaW4gIgorCQkJCSAgICAgICAiZnJlZSBzcGFjZSBjYWNoZSwgZHVtcGluZ1xuIik7CisJCQkJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX2ZyZWVfc3BhY2VfY2FjaGVwLCBlKTsKKwkJCQlnb3RvIGZyZWVfY2FjaGU7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwcyk7CiAJCX0KIAotCQkvKgotCQkgKiBXZSByZWFkIGFuIGVudHJ5IG91dCBvZiB0aGlzIHBhZ2UsIHdlIG5lZWQgdG8gbW92ZSBvbiB0byB0aGUKLQkJICogbmV4dCBwYWdlLgotCQkgKi8KLQkJaWYgKG5lZWRfbG9vcCkgewotCQkJa3VubWFwKHBhZ2UpOwotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogV2UgYWRkIHRoZSBiaXRtYXBzIGF0IHRoZSBlbmQgb2YgdGhlIGVudHJpZXMgaW4gb3JkZXIgdGhhdAotCQkgKiB0aGUgYml0bWFwIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBjYWNoZS4KLQkJICovCi0JCWUgPSBsaXN0X2VudHJ5KGJpdG1hcHMubmV4dCwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZlLT5saXN0KTsKLQkJbWVtY3B5KGUtPmJpdG1hcCwgYWRkciwgUEFHRV9DQUNIRV9TSVpFKTsKLQkJa3VubWFwKHBhZ2UpOwotCQludW1fYml0bWFwcy0tOwotbmV4dDoKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJaW5kZXgrKzsKKwkJbnVtX2VudHJpZXMtLTsKIAl9CiAKKwlpb19jdGxfdW5tYXBfcGFnZSgmaW9fY3RsKTsKKworCS8qCisJICogV2UgYWRkIHRoZSBiaXRtYXBzIGF0IHRoZSBlbmQgb2YgdGhlIGVudHJpZXMgaW4gb3JkZXIgdGhhdAorCSAqIHRoZSBiaXRtYXAgZW50cmllcyBhcmUgYWRkZWQgdG8gdGhlIGNhY2hlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuLCAmYml0bWFwcywgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZlLT5saXN0KTsKKwkJcmV0ID0gaW9fY3RsX3JlYWRfYml0bWFwKCZpb19jdGwsIGUpOworCQlpZiAocmV0KQorCQkJZ290byBmcmVlX2NhY2hlOworCX0KKworCWlvX2N0bF9kcm9wX3BhZ2VzKCZpb19jdGwpOwogCXJldCA9IDE7CiBvdXQ6CisJaW9fY3RsX2ZyZWUoJmlvX2N0bCk7CiAJcmV0dXJuIHJldDsKIGZyZWVfY2FjaGU6CisJaW9fY3RsX2Ryb3BfcGFnZXMoJmlvX2N0bCk7CiAJX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShjdGwpOwogCWdvdG8gb3V0OwogfQpAQCAtNDY1LDcgKzczMSw3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBmc19pbmZvLT50cmVlX3Jvb3Q7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCWJvb2wgbWF0Y2hlZDsKIAl1NjQgdXNlZCA9IGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmJsb2NrX2dyb3VwLT5pdGVtKTsKIApAQCAtNDk3LDYgKzc2MywxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBXZSBtYXkgaGF2ZSBjb252ZXJ0ZWQgdGhlIGlub2RlIGFuZCBtYWRlIHRoZSBjYWNoZSBpbnZhbGlkLiAqLworCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCWlmIChibG9ja19ncm91cC0+ZGlza19jYWNoZV9zdGF0ZSAhPSBCVFJGU19EQ19XUklUVEVOKSB7CisJCXNwaW5fdW5sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCiAJcmV0ID0gX19sb2FkX2ZyZWVfc3BhY2VfY2FjaGUoZnNfaW5mby0+dHJlZV9yb290LCBpbm9kZSwgY3RsLAogCQkJCSAgICAgIHBhdGgsIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQpOwogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKQEAgLTUzMCw2ICs4MDQsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIF9fYnRyZnNfd3JpdGVfb3V0X2NhY2hlIC0gd3JpdGUgb3V0IGNhY2hlZCBpbmZvIHRvIGFuIGlub2RlCisgKiBAcm9vdCAtIHRoZSByb290IHRoZSBpbm9kZSBiZWxvbmdzIHRvCisgKiBAY3RsIC0gdGhlIGZyZWUgc3BhY2UgY2FjaGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIG91dAorICogQGJsb2NrX2dyb3VwIC0gdGhlIGJsb2NrX2dyb3VwIGZvciB0aGlzIGNhY2hlIGlmIGl0IGJlbG9uZ3MgdG8gYSBibG9ja19ncm91cAorICogQHRyYW5zIC0gdGhlIHRyYW5zIGhhbmRsZQorICogQHBhdGggLSB0aGUgcGF0aCB0byB1c2UKKyAqIEBvZmZzZXQgLSB0aGUgb2Zmc2V0IGZvciB0aGUga2V5IHdlJ2xsIGluc2VydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG91dCBhIGZyZWUgc3BhY2UgY2FjaGUgc3RydWN0IHRvIGRpc2sgZm9yIHF1aWNrIHJlY292ZXJ5CisgKiBvbiBtb3VudC4gIFRoaXMgd2lsbCByZXR1cm4gMCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGwgaW4gd3JpdGluZyB0aGUgY2FjaGUgb3V0LAorICogYW5kIC0xIGlmIGl0IHdhcyBub3QuCisgKi8KIGludCBfX2J0cmZzX3dyaXRlX291dF9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9jdGwgKmN0bCwKIAkJCSAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLApAQCAtNTQwLDQyICs4MjcsMjQgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBwYWdlICoqcGFnZXM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZnJlZV9jbHVzdGVyICpjbHVzdGVyID0gTlVMTDsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnVucGluID0gTlVMTDsKKwlzdHJ1Y3QgaW9fY3RsIGlvX2N0bDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJpdG1hcF9saXN0OwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCXU2NCBzdGFydCwgZW5kLCBsZW47Ci0JdTY0IGJ5dGVzID0gMDsKLQl1MzIgY3JjID0gfih1MzIpMDsKLQlpbnQgaW5kZXggPSAwLCBudW1fcGFnZXMgPSAwOwogCWludCBlbnRyaWVzID0gMDsKIAlpbnQgYml0bWFwcyA9IDA7Ci0JaW50IHJldCA9IC0xOwotCWJvb2wgbmV4dF9wYWdlID0gZmFsc2U7Ci0JYm9vbCBvdXRfb2Zfc3BhY2UgPSBmYWxzZTsKKwlpbnQgcmV0OworCWludCBlcnIgPSAtMTsKIAogCUlOSVRfTElTVF9IRUFEKCZiaXRtYXBfbGlzdCk7CiAKLQlub2RlID0gcmJfZmlyc3QoJmN0bC0+ZnJlZV9zcGFjZV9vZmZzZXQpOwotCWlmICghbm9kZSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIWlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJcmV0dXJuIC0xOwogCi0JbnVtX3BhZ2VzID0gKGlfc2l6ZV9yZWFkKGlub2RlKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+Ci0JCVBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwotCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgaW5vZGUtPmlfc2l6ZSAmCi0JCQkJIH4ocm9vdC0+c2VjdG9yc2l6ZSAtIDEpLCAodTY0KS0xKTsKLQotCXBhZ2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBudW1fcGFnZXMsIEdGUF9OT0ZTKTsKLQlpZiAoIXBhZ2VzKQotCQlyZXR1cm4gLTE7CisJaW9fY3RsX2luaXQoJmlvX2N0bCwgaW5vZGUsIHJvb3QpOwogCiAJLyogR2V0IHRoZSBjbHVzdGVyIGZvciB0aGlzIGJsb2NrX2dyb3VwIGlmIGl0IGV4aXN0cyAqLwogCWlmIChibG9ja19ncm91cCAmJiAhbGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmNsdXN0ZXJfbGlzdCkpCkBAIC01ODksMzAgKzg1OCw5IEBACiAJICovCiAJdW5waW4gPSByb290LT5mc19pbmZvLT5waW5uZWRfZXh0ZW50czsKIAotCS8qCi0JICogTG9jayBhbGwgcGFnZXMgZmlyc3Qgc28gd2UgY2FuIGxvY2sgdGhlIGV4dGVudCBzYWZlbHkuCi0JICoKLQkgKiBOT1RFOiBCZWNhdXNlIHdlIGhvbGQgdGhlIHJlZiB0aGUgZW50aXJlIHRpbWUgd2UncmUgZ29pbmcgdG8gd3JpdGUgdG8KLQkgKiB0aGUgcGFnZSBmaW5kX2dldF9wYWdlIHNob3VsZCBuZXZlciBmYWlsLCBzbyB3ZSBkb24ndCBkbyBhIGNoZWNrCi0JICogYWZ0ZXIgZmluZF9nZXRfcGFnZSBhdCB0aGlzIHBvaW50LiAgSnVzdCBwdXR0aW5nIHRoaXMgaGVyZSBzbyBwZW9wbGUKLQkgKiBrbm93IGFuZCBkb24ndCBmcmVhayBvdXQuCi0JICovCi0Jd2hpbGUgKGluZGV4IDwgbnVtX3BhZ2VzKSB7Ci0JCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4LCBHRlBfTk9GUyk7Ci0JCWlmICghcGFnZSkgewotCQkJaW50IGk7CisJLyogTG9jayBhbGwgcGFnZXMgZmlyc3Qgc28gd2UgY2FuIGxvY2sgdGhlIGV4dGVudCBzYWZlbHkuICovCisJaW9fY3RsX3ByZXBhcmVfcGFnZXMoJmlvX2N0bCwgaW5vZGUsIDApOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXBhZ2VzW2luZGV4XSA9IHBhZ2U7Ci0JCWluZGV4Kys7Ci0JfQotCi0JaW5kZXggPSAwOwogCWxvY2tfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwLCBpX3NpemVfcmVhZChpbm9kZSkgLSAxLAogCQkJIDAsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKIApAQCAtNjIzLDE4OSArODcxLDExMSBAQAogCWlmIChibG9ja19ncm91cCkKIAkJc3RhcnQgPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwogCisJbm9kZSA9IHJiX2ZpcnN0KCZjdGwtPmZyZWVfc3BhY2Vfb2Zmc2V0KTsKKwlpZiAoIW5vZGUgJiYgY2x1c3RlcikgeworCQlub2RlID0gcmJfZmlyc3QoJmNsdXN0ZXItPnJvb3QpOworCQljbHVzdGVyID0gTlVMTDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgY2FuIGZpdCBvdXIgY3JjcyBpbnRvIHRoZSBmaXJzdCBwYWdlICovCisJaWYgKGlvX2N0bC5jaGVja19jcmNzICYmCisJICAgIChpb19jdGwubnVtX3BhZ2VzICogc2l6ZW9mKHUzMikpID49IFBBR0VfQ0FDSEVfU0laRSkgeworCQlXQVJOX09OKDEpOworCQlnb3RvIG91dF9ub3NwYzsKKwl9CisKKwlpb19jdGxfc2V0X2dlbmVyYXRpb24oJmlvX2N0bCwgdHJhbnMtPnRyYW5zaWQpOworCiAJLyogV3JpdGUgb3V0IHRoZSBleHRlbnQgZW50cmllcyAqLwotCWRvIHsKLQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkgKmVudHJ5OwotCQl2b2lkICphZGRyLCAqb3JpZzsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXdoaWxlIChub2RlKSB7CisJCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplOwogCi0JCW5leHRfcGFnZSA9IGZhbHNlOworCQllID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisJCWVudHJpZXMrKzsKIAotCQlpZiAoaW5kZXggPj0gbnVtX3BhZ2VzKSB7Ci0JCQlvdXRfb2Zfc3BhY2UgPSB0cnVlOworCQlyZXQgPSBpb19jdGxfYWRkX2VudHJ5KCZpb19jdGwsIGUtPm9mZnNldCwgZS0+Ynl0ZXMsCisJCQkJICAgICAgIGUtPmJpdG1hcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9ub3NwYzsKKworCQlpZiAoZS0+Yml0bWFwKSB7CisJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwX2xpc3QpOworCQkJYml0bWFwcysrOworCQl9CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCQlpZiAoIW5vZGUgJiYgY2x1c3RlcikgeworCQkJbm9kZSA9IHJiX2ZpcnN0KCZjbHVzdGVyLT5yb290KTsKKwkJCWNsdXN0ZXIgPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBXZSB3YW50IHRvIGFkZCBhbnkgcGlubmVkIGV4dGVudHMgdG8gb3VyIGZyZWUgc3BhY2UgY2FjaGUKKwkgKiBzbyB3ZSBkb24ndCBsZWFrIHRoZSBzcGFjZQorCSAqLworCXdoaWxlIChibG9ja19ncm91cCAmJiAoc3RhcnQgPCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKKwkJCSAgICAgICBibG9ja19ncm91cC0+a2V5Lm9mZnNldCkpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KHVucGluLCBzdGFydCwgJnN0YXJ0LCAmZW5kLAorCQkJCQkgICAgRVhURU5UX0RJUlRZKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGFnZSA9IHBhZ2VzW2luZGV4XTsKKwkJLyogVGhpcyBwaW5uZWQgZXh0ZW50IGlzIG91dCBvZiBvdXIgcmFuZ2UgKi8KKwkJaWYgKHN0YXJ0ID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKworCQkgICAgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpCisJCQlicmVhazsKIAotCQlvcmlnID0gYWRkciA9IGttYXAocGFnZSk7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl1NjQgKmdlbjsKKwkJbGVuID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArCisJCQlibG9ja19ncm91cC0+a2V5Lm9mZnNldCAtIHN0YXJ0OworCQlsZW4gPSBtaW4obGVuLCBlbmQgKyAxIC0gc3RhcnQpOwogCi0JCQkvKgotCQkJICogV2UncmUgZ29pbmcgdG8gcHV0IGluIGEgYm9ndXMgY3JjIGZvciB0aGlzIHBhZ2UgdG8KLQkJCSAqIG1ha2Ugc3VyZSB0aGF0IG9sZCBrZXJuZWxzIHdobyBhcmVuJ3QgYXdhcmUgb2YgdGhpcwotCQkJICogZm9ybWF0IHdpbGwgYmUgc3VyZSB0byBkaXNjYXJkIHRoZSBjYWNoZS4KLQkJCSAqLwotCQkJYWRkciArPSBzaXplb2YodTY0KTsKLQkJCW9mZnNldCArPSBzaXplb2YodTY0KTsKKwkJZW50cmllcysrOworCQlyZXQgPSBpb19jdGxfYWRkX2VudHJ5KCZpb19jdGwsIHN0YXJ0LCBsZW4sIE5VTEwpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfbm9zcGM7CiAKLQkJCWdlbiA9IGFkZHI7Ci0JCQkqZ2VuID0gdHJhbnMtPnRyYW5zaWQ7Ci0JCQlhZGRyICs9IHNpemVvZih1NjQpOwotCQkJb2Zmc2V0ICs9IHNpemVvZih1NjQpOwotCQl9Ci0JCWVudHJ5ID0gYWRkcjsKLQotCQltZW1zZXQoYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKLQkJd2hpbGUgKG5vZGUgJiYgIW5leHRfcGFnZSkgewotCQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmU7Ci0KLQkJCWUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKLQkJCWVudHJpZXMrKzsKLQotCQkJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KGUtPm9mZnNldCk7Ci0JCQllbnRyeS0+Ynl0ZXMgPSBjcHVfdG9fbGU2NChlLT5ieXRlcyk7Ci0JCQlpZiAoZS0+Yml0bWFwKSB7Ci0JCQkJZW50cnktPnR5cGUgPSBCVFJGU19GUkVFX1NQQUNFX0JJVE1BUDsKLQkJCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYml0bWFwX2xpc3QpOwotCQkJCWJpdG1hcHMrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJZW50cnktPnR5cGUgPSBCVFJGU19GUkVFX1NQQUNFX0VYVEVOVDsKLQkJCX0KLQkJCW5vZGUgPSByYl9uZXh0KG5vZGUpOwotCQkJaWYgKCFub2RlICYmIGNsdXN0ZXIpIHsKLQkJCQlub2RlID0gcmJfZmlyc3QoJmNsdXN0ZXItPnJvb3QpOwotCQkJCWNsdXN0ZXIgPSBOVUxMOwotCQkJfQotCQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZV9lbnRyeSk7Ci0JCQlpZiAob2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KSA+PQotCQkJICAgIFBBR0VfQ0FDSEVfU0laRSkKLQkJCQluZXh0X3BhZ2UgPSB0cnVlOwotCQkJZW50cnkrKzsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIHdhbnQgdG8gYWRkIGFueSBwaW5uZWQgZXh0ZW50cyB0byBvdXIgZnJlZSBzcGFjZSBjYWNoZQotCQkgKiBzbyB3ZSBkb24ndCBsZWFrIHRoZSBzcGFjZQotCQkgKi8KLQkJd2hpbGUgKGJsb2NrX2dyb3VwICYmICFuZXh0X3BhZ2UgJiYKLQkJICAgICAgIChzdGFydCA8IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKwotCQkJYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpKSB7Ci0JCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQodW5waW4sIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCQkgICAgRVhURU5UX0RJUlRZKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlyZXQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBUaGlzIHBpbm5lZCBleHRlbnQgaXMgb3V0IG9mIG91ciByYW5nZSAqLwotCQkJaWYgKHN0YXJ0ID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKwotCQkJICAgIGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0KQotCQkJCWJyZWFrOwotCi0JCQlsZW4gPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKLQkJCQlibG9ja19ncm91cC0+a2V5Lm9mZnNldCAtIHN0YXJ0OwotCQkJbGVuID0gbWluKGxlbiwgZW5kICsgMSAtIHN0YXJ0KTsKLQotCQkJZW50cmllcysrOwotCQkJZW50cnktPm9mZnNldCA9IGNwdV90b19sZTY0KHN0YXJ0KTsKLQkJCWVudHJ5LT5ieXRlcyA9IGNwdV90b19sZTY0KGxlbik7Ci0JCQllbnRyeS0+dHlwZSA9IEJUUkZTX0ZSRUVfU1BBQ0VfRVhURU5UOwotCi0JCQlzdGFydCA9IGVuZCArIDE7Ci0JCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2VudHJ5KTsKLQkJCWlmIChvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfZW50cnkpID49Ci0JCQkgICAgUEFHRV9DQUNIRV9TSVpFKQotCQkJCW5leHRfcGFnZSA9IHRydWU7Ci0JCQllbnRyeSsrOwotCQl9Ci0KLQkJLyogR2VuZXJhdGUgYm9ndXMgY3JjIHZhbHVlICovCi0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl1MzIgKnRtcDsKLQkJCWNyYyA9IGJ0cmZzX2NzdW1fZGF0YShyb290LCBvcmlnICsgc2l6ZW9mKHU2NCksIGNyYywKLQkJCQkJICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gc2l6ZW9mKHU2NCkpOwotCQkJYnRyZnNfY3N1bV9maW5hbChjcmMsIChjaGFyICopJmNyYyk7Ci0JCQljcmMrKzsKLQkJCXRtcCA9IG9yaWc7Ci0JCQkqdG1wID0gY3JjOwotCQl9Ci0KLQkJa3VubWFwKHBhZ2UpOwotCi0JCWJ5dGVzICs9IFBBR0VfQ0FDSEVfU0laRTsKLQotCQlpbmRleCsrOwotCX0gd2hpbGUgKG5vZGUgfHwgbmV4dF9wYWdlKTsKKwkJc3RhcnQgPSBlbmQgKyAxOworCX0KIAogCS8qIFdyaXRlIG91dCB0aGUgYml0bWFwcyAqLwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZiaXRtYXBfbGlzdCkgewotCQl2b2lkICphZGRyOwogCQlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnkgPQogCQkJbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBsaXN0KTsKIAotCQlpZiAoaW5kZXggPj0gbnVtX3BhZ2VzKSB7Ci0JCQlvdXRfb2Zfc3BhY2UgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGFnZSA9IHBhZ2VzW2luZGV4XTsKLQotCQlhZGRyID0ga21hcChwYWdlKTsKLQkJbWVtY3B5KGFkZHIsIGVudHJ5LT5iaXRtYXAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCWt1bm1hcChwYWdlKTsKLQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOwotCisJCXJldCA9IGlvX2N0bF9hZGRfYml0bWFwKCZpb19jdGwsIGVudHJ5LT5iaXRtYXApOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfbm9zcGM7CiAJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKLQkJaW5kZXgrKzsKLQl9Ci0KLQlpZiAob3V0X29mX3NwYWNlKSB7Ci0JCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7Ci0JCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgMCwKLQkJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEsICZjYWNoZWRfc3RhdGUsCi0JCQkJICAgICBHRlBfTk9GUyk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OwogCX0KIAogCS8qIFplcm8gb3V0IHRoZSByZXN0IG9mIHRoZSBwYWdlcyBqdXN0IHRvIG1ha2Ugc3VyZSAqLwotCXdoaWxlIChpbmRleCA8IG51bV9wYWdlcykgewotCQl2b2lkICphZGRyOworCWlvX2N0bF96ZXJvX3JlbWFpbmluZ19wYWdlcygmaW9fY3RsKTsKIAotCQlwYWdlID0gcGFnZXNbaW5kZXhdOwotCQlhZGRyID0ga21hcChwYWdlKTsKLQkJbWVtc2V0KGFkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCWt1bm1hcChwYWdlKTsKLQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOwotCQlpbmRleCsrOwotCX0KLQotCXJldCA9IGJ0cmZzX2RpcnR5X3BhZ2VzKHJvb3QsIGlub2RlLCBwYWdlcywgbnVtX3BhZ2VzLCAwLAotCQkJCQkgICAgYnl0ZXMsICZjYWNoZWRfc3RhdGUpOwotCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7CisJcmV0ID0gYnRyZnNfZGlydHlfcGFnZXMocm9vdCwgaW5vZGUsIGlvX2N0bC5wYWdlcywgaW9fY3RsLm51bV9wYWdlcywKKwkJCQkwLCBpX3NpemVfcmVhZChpbm9kZSksICZjYWNoZWRfc3RhdGUpOworCWlvX2N0bF9kcm9wX3BhZ2VzKCZpb19jdGwpOwogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgMCwKIAkJCSAgICAgaV9zaXplX3JlYWQoaW5vZGUpIC0gMSwgJmNhY2hlZF9zdGF0ZSwgR0ZQX05PRlMpOwogCi0JaWYgKHJldCkgewotCQlyZXQgPSAwOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAotCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CiAKLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOworCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAlrZXkub2JqZWN0aWQgPSBCVFJGU19GUkVFX1NQQUNFX09CSkVDVElEOwogCWtleS5vZmZzZXQgPSBvZmZzZXQ7CiAJa2V5LnR5cGUgPSAwOwogCi0JcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIDEsIDEpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAwLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtMTsKLQkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGJ5dGVzIC0gMSwKLQkJCQkgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKLQkJCQkgRVhURU5UX0RPX0FDQ09VTlRJTkcsIDAsIDAsIE5VTEwsIEdGUF9OT0ZTKTsKKwkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGlub2RlLT5pX3NpemUgLSAxLAorCQkJCSBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MsIDAsIDAsIE5VTEwsCisJCQkJIEdGUF9OT0ZTKTsKIAkJZ290byBvdXQ7CiAJfQogCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKQEAgLTgxNiwxNSArOTg2LDE2IEBACiAJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CiAJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfRlJFRV9TUEFDRV9PQkpFQ1RJRCB8fAogCQkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBvZmZzZXQpIHsKLQkJCXJldCA9IC0xOwotCQkJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsIGJ5dGVzIC0gMSwKLQkJCQkJIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8Ci0JCQkJCSBFWFRFTlRfRE9fQUNDT1VOVElORywgMCwgMCwgTlVMTCwKLQkJCQkJIEdGUF9OT0ZTKTsKKwkJCWNsZWFyX2V4dGVudF9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwLAorCQkJCQkgaW5vZGUtPmlfc2l6ZSAtIDEsCisJCQkJCSBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MsIDAsIDAsCisJCQkJCSBOVUxMLCBHRlBfTk9GUyk7CiAJCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KKworCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CiAJaGVhZGVyID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCiAJCQkJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2VfaGVhZGVyKTsKIAlidHJmc19zZXRfZnJlZV9zcGFjZV9lbnRyaWVzKGxlYWYsIGhlYWRlciwgZW50cmllcyk7CkBAIC04MzMsMTYgKzEwMDQsMjYgQEAKIAlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKIAlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAKLQlyZXQgPSAxOwotCisJZXJyID0gMDsKIG91dDoKLQlrZnJlZShwYWdlcyk7Ci0JaWYgKHJldCAhPSAxKSB7Ci0JCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIDAsIGluZGV4KTsKKwlpb19jdGxfZnJlZSgmaW9fY3RsKTsKKwlpZiAoZXJyKSB7CisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKGlub2RlLT5pX21hcHBpbmcpOwogCQlCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbiA9IDA7CiAJfQogCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKKworb3V0X25vc3BjOgorCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZiaXRtYXBfbGlzdCkgeworCQlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnkgPQorCQkJbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOworCX0KKwlpb19jdGxfZHJvcF9wYWdlcygmaW9fY3RsKTsKKwl1bmxvY2tfZXh0ZW50X2NhY2hlZCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsCisJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKKwlnb3RvIG91dDsKIH0KIAogaW50IGJ0cmZzX3dyaXRlX291dF9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKQEAgLTg2OSwxNCArMTA1MCwxNSBAQAogCiAJcmV0ID0gX19idHJmc193cml0ZV9vdXRfY2FjaGUocm9vdCwgaW5vZGUsIGN0bCwgYmxvY2tfZ3JvdXAsIHRyYW5zLAogCQkJCSAgICAgIHBhdGgsIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQpOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKHJldCkgewogCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKIAkJYmxvY2tfZ3JvdXAtPmRpc2tfY2FjaGVfc3RhdGUgPSBCVFJGU19EQ19FUlJPUjsKIAkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKIAkJcmV0ID0gMDsKLQorI2lmZGVmIERFQlVHCiAJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byB3cml0ZSBmcmVlIHNwYWNlIGNhY2UgIgogCQkgICAgICAgImZvciBibG9jayBncm91cCAlbGx1XG4iLCBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkKTsKKyNlbmRpZgogCX0KIAogCWlwdXQoaW5vZGUpOwpAQCAtMTcwMSw2ICsxODgzLDcgQEAKIAkJCWN0bC0+dG90YWxfYml0bWFwcy0tOwogCQl9CiAJCWttZW1fY2FjaGVfZnJlZShidHJmc19mcmVlX3NwYWNlX2NhY2hlcCwgaW5mbyk7CisJCXJldCA9IDA7CiAJCWdvdG8gb3V0X2xvY2s7CiAJfQogCkBAIC0xNzA4LDcgKzE4OTEsOCBAQAogCQl1bmxpbmtfZnJlZV9zcGFjZShjdGwsIGluZm8pOwogCQlpbmZvLT5vZmZzZXQgKz0gYnl0ZXM7CiAJCWluZm8tPmJ5dGVzIC09IGJ5dGVzOwotCQlsaW5rX2ZyZWVfc3BhY2UoY3RsLCBpbmZvKTsKKwkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGN0bCwgaW5mbyk7CisJCVdBUk5fT04ocmV0KTsKIAkJZ290byBvdXRfbG9jazsKIAl9CiAKQEAgLTI0NzIsOSArMjY1NiwxOSBAQAogCQlzcGluX3VubG9jaygmY3RsLT50cmVlX2xvY2spOwogCiAJCWlmIChieXRlcyA+PSBtaW5sZW4pIHsKLQkJCWludCB1cGRhdGVfcmV0OwotCQkJdXBkYXRlX3JldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwKLQkJCQkJCQkJIGJ5dGVzLCAxLCAxKTsKKwkJCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOworCQkJaW50IHVwZGF0ZSA9IDA7CisKKwkJCXNwYWNlX2luZm8gPSBibG9ja19ncm91cC0+c3BhY2VfaW5mbzsKKwkJCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJCWlmICghYmxvY2tfZ3JvdXAtPnJvKSB7CisJCQkJYmxvY2tfZ3JvdXAtPnJlc2VydmVkICs9IGJ5dGVzOworCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IGJ5dGVzOworCQkJCXVwZGF0ZSA9IDE7CisJCQl9CisJCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCQkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCiAJCQlyZXQgPSBidHJmc19lcnJvcl9kaXNjYXJkX2V4dGVudChmc19pbmZvLT5leHRlbnRfcm9vdCwKIAkJCQkJCQkgc3RhcnQsCkBAIC0yNDgyLDkgKzI2NzYsMTYgQEAKIAkJCQkJCQkgJmFjdHVhbGx5X3RyaW1tZWQpOwogCiAJCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgc3RhcnQsIGJ5dGVzKTsKLQkJCWlmICghdXBkYXRlX3JldCkKLQkJCQlidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXMoYmxvY2tfZ3JvdXAsCi0JCQkJCQkJICAgIGJ5dGVzLCAwLCAxKTsKKwkJCWlmICh1cGRhdGUpIHsKKwkJCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOworCQkJCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCQkJCWlmIChibG9ja19ncm91cC0+cm8pCisJCQkJCXNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5ICs9IGJ5dGVzOworCQkJCWJsb2NrX2dyb3VwLT5yZXNlcnZlZCAtPSBieXRlczsKKwkJCQlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCAtPSBieXRlczsKKwkJCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCQkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJCX0KIAogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKQEAgLTI2NDMsOSArMjg0NCwxMyBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IF9fYnRyZnNfd3JpdGVfb3V0X2NhY2hlKHJvb3QsIGlub2RlLCBjdGwsIE5VTEwsIHRyYW5zLCBwYXRoLCAwKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0KSB7CisJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIGlub2RlLT5pX3NpemUpOworI2lmZGVmIERFQlVHCiAJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZhaWxlZCB0byB3cml0ZSBmcmVlIGlubyBjYWNoZSAiCiAJCSAgICAgICAiZm9yIHJvb3QgJWxsdVxuIiwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworI2VuZGlmCisJfQogCiAJaXB1dChpbm9kZSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKaW5kZXggYjQwODdlMC4uZjg5NjJhOSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUtbWFwLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKQEAgLTM5OCw2ICszOTgsOCBAQAogCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlX2N0bCAqY3RsID0gcm9vdC0+ZnJlZV9pbm9fY3RsOwogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqcnN2OworCXU2NCBudW1fYnl0ZXM7CiAJdTY0IGFsbG9jX2hpbnQgPSAwOwogCWludCByZXQ7CiAJaW50IHByZWFsbG9jOwpAQCAtNDIxLDExICs0MjMsMjYgQEAKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcnN2ID0gdHJhbnMtPmJsb2NrX3JzdjsKKwl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKKworCW51bV9ieXRlcyA9IHRyYW5zLT5ieXRlc19yZXNlcnZlZDsKKwkvKgorCSAqIDEgaXRlbSBmb3IgaW5vZGUgaXRlbSBpbnNlcnRpb24gaWYgbmVlZAorCSAqIDMgaXRlbXMgZm9yIGlub2RlIGl0ZW0gdXBkYXRlIChpbiB0aGUgd29yc3QgY2FzZSkKKwkgKiAxIGl0ZW0gZm9yIGZyZWUgc3BhY2Ugb2JqZWN0CisJICogMyBpdGVtcyBmb3IgcHJlLWFsbG9jYXRpb24KKwkgKi8KKwl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQgPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgOCk7CisJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZF9ub2ZsdXNoKHJvb3QsIHRyYW5zLT5ibG9ja19yc3YsCisJCQkJCSAgdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIGFnYWluOgogCWlub2RlID0gbG9va3VwX2ZyZWVfaW5vX2lub2RlKHJvb3QsIHBhdGgpOwogCWlmIChJU19FUlIoaW5vZGUpICYmIFBUUl9FUlIoaW5vZGUpICE9IC1FTk9FTlQpIHsKIAkJcmV0ID0gUFRSX0VSUihpbm9kZSk7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChJU19FUlIoaW5vZGUpKSB7CkBAIC00MzQsNyArNDUxLDcgQEAKIAogCQlyZXQgPSBjcmVhdGVfZnJlZV9pbm9faW5vZGUocm9vdCwgdHJhbnMsIHBhdGgpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQlnb3RvIGFnYWluOwogCX0KIApAQCAtNDY1LDIxICs0ODIsMjYgQEAKIAkvKiBKdXN0IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLwogCXByZWFsbG9jICs9IDggKiBQQUdFX0NBQ0hFX1NJWkU7CiAKLQlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIHByZWFsbG9jKTsKKwlyZXQgPSBidHJmc19kZWxhbGxvY19yZXNlcnZlX3NwYWNlKGlub2RlLCBwcmVhbGxvYyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfcHV0OwogCiAJcmV0ID0gYnRyZnNfcHJlYWxsb2NfZmlsZV9yYW5nZV90cmFucyhpbm9kZSwgdHJhbnMsIDAsIDAsIHByZWFsbG9jLAogCQkJCQkgICAgICBwcmVhbGxvYywgcHJlYWxsb2MsICZhbGxvY19oaW50KTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShpbm9kZSwgcHJlYWxsb2MpOwogCQlnb3RvIG91dF9wdXQ7CisJfQogCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgcHJlYWxsb2MpOwogCisJcmV0ID0gYnRyZnNfd3JpdGVfb3V0X2lub19jYWNoZShyb290LCB0cmFucywgcGF0aCk7CiBvdXRfcHV0OgogCWlwdXQoaW5vZGUpOworb3V0X3JlbGVhc2U6CisJYnRyZnNfYmxvY2tfcnN2X3JlbGVhc2Uocm9vdCwgdHJhbnMtPmJsb2NrX3JzdiwgdHJhbnMtPmJ5dGVzX3Jlc2VydmVkKTsKIG91dDoKLQlpZiAocmV0ID09IDApCi0JCXJldCA9IGJ0cmZzX3dyaXRlX291dF9pbm9fY2FjaGUocm9vdCwgdHJhbnMsIHBhdGgpOworCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisJdHJhbnMtPmJ5dGVzX3Jlc2VydmVkID0gbnVtX2J5dGVzOwogCiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCBiMmQwMDRhLi4xMTZhYjY3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTQ1LDEwICs0NSwxMCBAQAogI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCiAjaW5jbHVkZSAiaW9jdGwuaCIKICNpbmNsdWRlICJwcmludC10cmVlLmgiCi0jaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgIm9yZGVyZWQtZGF0YS5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAidHJlZS1sb2cuaCIKKyNpbmNsdWRlICJ2b2x1bWVzLmgiCiAjaW5jbHVkZSAiY29tcHJlc3Npb24uaCIKICNpbmNsdWRlICJsb2NraW5nLmgiCiAjaW5jbHVkZSAiZnJlZS1zcGFjZS1jYWNoZS5oIgpAQCAtOTMsNiArOTMsOCBAQAogCQkJCSAgIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSwKIAkJCQkgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCAqcGFnZV9zdGFydGVkLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5yX3dyaXR0ZW4sIGludCB1bmxvY2spOworc3RhdGljIG5vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiBzdGF0aWMgaW50IGJ0cmZzX2luaXRfaW5vZGVfc2VjdXJpdHkoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCAgc3RydWN0IGlub2RlICpkaXIsCkBAIC0zOTMsNyArMzk1LDEwIEBACiAJICAgICAoQlRSRlNfSShpbm9kZSktPmZsYWdzICYgQlRSRlNfSU5PREVfQ09NUFJFU1MpKSkgewogCQlXQVJOX09OKHBhZ2VzKTsKIAkJcGFnZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5yX3BhZ2VzLCBHRlBfTk9GUyk7Ci0JCUJVR19PTighcGFnZXMpOworCQlpZiAoIXBhZ2VzKSB7CisJCQkvKiBqdXN0IGJhaWwgb3V0IHRvIHRoZSB1bmNvbXByZXNzZWQgY29kZSAqLworCQkJZ290byBjb250OworCQl9CiAKIAkJaWYgKEJUUkZTX0koaW5vZGUpLT5mb3JjZV9jb21wcmVzcykKIAkJCWNvbXByZXNzX3R5cGUgPSBCVFJGU19JKGlub2RlKS0+Zm9yY2VfY29tcHJlc3M7CkBAIC00MjQsNiArNDI5LDcgQEAKIAkJCXdpbGxfY29tcHJlc3MgPSAxOwogCQl9CiAJfQorY29udDoKIAlpZiAoc3RhcnQgPT0gMCkgewogCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCUJVR19PTihJU19FUlIodHJhbnMpKTsKQEAgLTgyMCw3ICs4MjYsNyBAQAogCX0KIAogCUJVR19PTihkaXNrX251bV9ieXRlcyA+Ci0JICAgICAgIGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CisJICAgICAgIGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKIAogCWFsbG9jX2hpbnQgPSBnZXRfZXh0ZW50X2FsbG9jYXRpb25faGludChpbm9kZSwgc3RhcnQsIG51bV9ieXRlcyk7CiAJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBzdGFydCArIG51bV9ieXRlcyAtIDEsIDApOwpAQCAtMTczNyw3ICsxNzQzLDcgQEAKIAkJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7CiAJCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKLQkJCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlX2ZhbGxiYWNrKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCQlCVUdfT04ocmV0KTsKIAkJfQogCQlnb3RvIG91dDsKQEAgLTE3ODcsMTcgKzE3OTMsMTcgQEAKIAogCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZF9leHRlbnQpOwogCWlmICghcmV0IHx8ICF0ZXN0X2JpdChCVFJGU19PUkRFUkVEX1BSRUFMTE9DLCAmb3JkZXJlZF9leHRlbnQtPmZsYWdzKSkgewotCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlX2ZhbGxiYWNrKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCUJVR19PTihyZXQpOwogCX0KIAlyZXQgPSAwOwogb3V0OgotCWlmIChub2xvY2spIHsKLQkJaWYgKHRyYW5zKQotCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX25vbG9jayh0cmFucywgcm9vdCk7Ci0JfSBlbHNlIHsKKwlpZiAocm9vdCAhPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpCiAJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2VfbWV0YWRhdGEoaW5vZGUsIG9yZGVyZWRfZXh0ZW50LT5sZW4pOwotCQlpZiAodHJhbnMpCisJaWYgKHRyYW5zKSB7CisJCWlmIChub2xvY2spCisJCQlidHJmc19lbmRfdHJhbnNhY3Rpb25fbm9sb2NrKHRyYW5zLCByb290KTsKKwkJZWxzZQogCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAl9CiAKQEAgLTE4MTksMTUzICsxODI1LDkgQEAKIH0KIAogLyoKLSAqIFdoZW4gSU8gZmFpbHMsIGVpdGhlciB3aXRoIEVJTyBvciBjc3VtIHZlcmlmaWNhdGlvbiBmYWlscywgd2UKLSAqIHRyeSBvdGhlciBtaXJyb3JzIHRoYXQgbWlnaHQgaGF2ZSBhIGdvb2QgY29weSBvZiB0aGUgZGF0YS4gIFRoaXMKLSAqIGlvX2ZhaWx1cmVfcmVjb3JkIGlzIHVzZWQgdG8gcmVjb3JkIHN0YXRlIGFzIHdlIGdvIHRocm91Z2ggYWxsIHRoZQotICogbWlycm9ycy4gIElmIGFub3RoZXIgbWlycm9yIGhhcyBnb29kIGRhdGEsIHRoZSBwYWdlIGlzIHNldCB1cCB0byBkYXRlCi0gKiBhbmQgdGhpbmdzIGNvbnRpbnVlLiAgSWYgYSBnb29kIG1pcnJvciBjYW4ndCBiZSBmb3VuZCwgdGhlIG9yaWdpbmFsCi0gKiBiaW8gZW5kX2lvIGNhbGxiYWNrIGlzIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGluZ3MgaGF2ZSBmYWlsZWQuCi0gKi8KLXN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdTY0IHN0YXJ0OwotCXU2NCBsZW47Ci0JdTY0IGxvZ2ljYWw7Ci0JdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3M7Ci0JaW50IGxhc3RfbWlycm9yOwotfTsKLQotc3RhdGljIGludCBidHJmc19pb19mYWlsZWRfaG9vayhzdHJ1Y3QgYmlvICpmYWlsZWRfYmlvLAotCQkJIHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCi0JCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICpmYWlscmVjID0gTlVMTDsKLQl1NjQgcHJpdmF0ZTsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IGV4dGVudF9pb190cmVlICpmYWlsdXJlX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZTsKLQlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZTsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IG51bV9jb3BpZXM7Ci0JaW50IHJldDsKLQlpbnQgcnc7Ci0JdTY0IGxvZ2ljYWw7Ci0KLQlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LCAmcHJpdmF0ZSk7Ci0JaWYgKHJldCkgewotCQlmYWlscmVjID0ga21hbGxvYyhzaXplb2YoKmZhaWxyZWMpLCBHRlBfTk9GUyk7Ci0JCWlmICghZmFpbHJlYykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlmYWlscmVjLT5zdGFydCA9IHN0YXJ0OwotCQlmYWlscmVjLT5sZW4gPSBlbmQgLSBzdGFydCArIDE7Ci0JCWZhaWxyZWMtPmxhc3RfbWlycm9yID0gMDsKLQkJZmFpbHJlYy0+YmlvX2ZsYWdzID0gMDsKLQotCQlyZWFkX2xvY2soJmVtX3RyZWUtPmxvY2spOwotCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzdGFydCwgZmFpbHJlYy0+bGVuKTsKLQkJaWYgKGVtLT5zdGFydCA+IHN0YXJ0IHx8IGVtLT5zdGFydCArIGVtLT5sZW4gPCBzdGFydCkgewotCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKLQkJCWVtID0gTlVMTDsKLQkJfQotCQlyZWFkX3VubG9jaygmZW1fdHJlZS0+bG9jayk7Ci0KLQkJaWYgKElTX0VSUl9PUl9OVUxMKGVtKSkgewotCQkJa2ZyZWUoZmFpbHJlYyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlsb2dpY2FsID0gc3RhcnQgLSBlbS0+c3RhcnQ7Ci0JCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQgKyBsb2dpY2FsOwotCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncykpIHsKLQkJCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQ7Ci0JCQlmYWlscmVjLT5iaW9fZmxhZ3MgPSBFWFRFTlRfQklPX0NPTVBSRVNTRUQ7Ci0JCQlleHRlbnRfc2V0X2NvbXByZXNzX3R5cGUoJmZhaWxyZWMtPmJpb19mbGFncywKLQkJCQkJCSBlbS0+Y29tcHJlc3NfdHlwZSk7Ci0JCX0KLQkJZmFpbHJlYy0+bG9naWNhbCA9IGxvZ2ljYWw7Ci0JCWZyZWVfZXh0ZW50X21hcChlbSk7Ci0JCXNldF9leHRlbnRfYml0cyhmYWlsdXJlX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfAotCQkJCUVYVEVOVF9ESVJUWSwgR0ZQX05PRlMpOwotCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LAotCQkJCSAodTY0KSh1bnNpZ25lZCBsb25nKWZhaWxyZWMpOwotCX0gZWxzZSB7Ci0JCWZhaWxyZWMgPSAoc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICopKHVuc2lnbmVkIGxvbmcpcHJpdmF0ZTsKLQl9Ci0JbnVtX2NvcGllcyA9IGJ0cmZzX251bV9jb3BpZXMoCi0JCQkgICAgICAmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZSwKLQkJCSAgICAgIGZhaWxyZWMtPmxvZ2ljYWwsIGZhaWxyZWMtPmxlbik7Ci0JZmFpbHJlYy0+bGFzdF9taXJyb3IrKzsKLQlpZiAoIXN0YXRlKSB7Ci0JCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUubG9jayk7Ci0JCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKLQkJCQkJCSAgICBmYWlscmVjLT5zdGFydCwKLQkJCQkJCSAgICBFWFRFTlRfTE9DS0VEKTsKLQkJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCAhPSBmYWlscmVjLT5zdGFydCkKLQkJCXN0YXRlID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOwotCX0KLQlpZiAoIXN0YXRlIHx8IGZhaWxyZWMtPmxhc3RfbWlycm9yID4gbnVtX2NvcGllcykgewotCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIGZhaWxyZWMtPnN0YXJ0LCAwKTsKLQkJY2xlYXJfZXh0ZW50X2JpdHMoZmFpbHVyZV90cmVlLCBmYWlscmVjLT5zdGFydCwKLQkJCQkgIGZhaWxyZWMtPnN0YXJ0ICsgZmFpbHJlYy0+bGVuIC0gMSwKLQkJCQkgIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKLQkJa2ZyZWUoZmFpbHJlYyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOwotCWJpby0+YmlfcHJpdmF0ZSA9IHN0YXRlOwotCWJpby0+YmlfZW5kX2lvID0gZmFpbGVkX2Jpby0+YmlfZW5kX2lvOwotCWJpby0+Ymlfc2VjdG9yID0gZmFpbHJlYy0+bG9naWNhbCA+PiA5OwotCWJpby0+YmlfYmRldiA9IGZhaWxlZF9iaW8tPmJpX2JkZXY7Ci0JYmlvLT5iaV9zaXplID0gMDsKLQotCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGZhaWxyZWMtPmxlbiwgc3RhcnQgLSBwYWdlX29mZnNldChwYWdlKSk7Ci0JaWYgKGZhaWxlZF9iaW8tPmJpX3J3ICYgUkVRX1dSSVRFKQotCQlydyA9IFdSSVRFOwotCWVsc2UKLQkJcncgPSBSRUFEOwotCi0JcmV0ID0gQlRSRlNfSShpbm9kZSktPmlvX3RyZWUub3BzLT5zdWJtaXRfYmlvX2hvb2soaW5vZGUsIHJ3LCBiaW8sCi0JCQkJCQkgICAgICBmYWlscmVjLT5sYXN0X21pcnJvciwKLQkJCQkJCSAgICAgIGZhaWxyZWMtPmJpb19mbGFncywgMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGVhY2ggdGltZSBhbiBJTyBmaW5pc2hlcywgd2UgZG8gYSBmYXN0IGNoZWNrIGluIHRoZSBJTyBmYWlsdXJlIHRyZWUKLSAqIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHByb2Nlc3Mgb3IgY2xlYW4gdXAgYW4gaW9fZmFpbHVyZV9yZWNvcmQKLSAqLwotc3RhdGljIGludCBidHJmc19jbGVhbl9pb19mYWlsdXJlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQpCi17Ci0JdTY0IHByaXZhdGU7Ci0JdTY0IHByaXZhdGVfZmFpbHVyZTsKLQlzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKmZhaWx1cmU7Ci0JaW50IHJldDsKLQotCXByaXZhdGUgPSAwOwotCWlmIChjb3VudF9yYW5nZV9iaXRzKCZCVFJGU19JKGlub2RlKS0+aW9fZmFpbHVyZV90cmVlLCAmcHJpdmF0ZSwKLQkJCSAgICAgKHU2NCktMSwgMSwgRVhURU5UX0RJUlRZLCAwKSkgewotCQlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZSgmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwKLQkJCQkJc3RhcnQsICZwcml2YXRlX2ZhaWx1cmUpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCWZhaWx1cmUgPSAoc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICopKHVuc2lnbmVkIGxvbmcpCi0JCQkJICAgcHJpdmF0ZV9mYWlsdXJlOwotCQkJc2V0X3N0YXRlX3ByaXZhdGUoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQsIDApOwotCQkJY2xlYXJfZXh0ZW50X2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQsCi0JCQkJCSAgZmFpbHVyZS0+c3RhcnQgKyBmYWlsdXJlLT5sZW4gLSAxLAotCQkJCQkgIEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9MT0NLRUQsCi0JCQkJCSAgR0ZQX05PRlMpOwotCQkJa2ZyZWUoZmFpbHVyZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKiB3aGVuIHJlYWRzIGFyZSBkb25lLCB3ZSBuZWVkIHRvIGNoZWNrIGNzdW1zIHRvIHZlcmlmeSB0aGUgZGF0YSBpcyBjb3JyZWN0Ci0gKiBpZiB0aGVyZSdzIGEgbWF0Y2gsIHdlIGFsbG93IHRoZSBiaW8gdG8gZmluaXNoLiAgSWYgbm90LCB3ZSBnbyB0aHJvdWdoCi0gKiB0aGUgaW9fZmFpbHVyZV9yZWNvcmQgcm91dGluZXMgdG8gZmluZCBnb29kIGNvcGllcworICogaWYgdGhlcmUncyBhIG1hdGNoLCB3ZSBhbGxvdyB0aGUgYmlvIHRvIGZpbmlzaC4gIElmIG5vdCwgdGhlIGNvZGUgaW4KKyAqIGV4dGVudF9pby5jIHdpbGwgdHJ5IHRvIGZpbmQgZ29vZCBjb3BpZXMgZm9yIHVzLgogICovCiBzdGF0aWMgaW50IGJ0cmZzX3JlYWRwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCkBAIC0yMDExLDEwICsxODczLDYgQEAKIAogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIGdvb2Q6Ci0JLyogaWYgdGhlIGlvIGZhaWx1cmUgdHJlZSBmb3IgdGhpcyBpbm9kZSBpcyBub24tZW1wdHksCi0JICogY2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIHJlY292ZXJlZCBmcm9tIGEgZmFpbGVkIElPCi0JICovCi0JYnRyZnNfY2xlYW5faW9fZmFpbHVyZXMoaW5vZGUsIHN0YXJ0KTsKIAlyZXR1cm4gMDsKIAogemVyb2l0OgpAQCAtMjA3OSw4OSArMTkzNyw2IEBACiAJdXBfcmVhZCgmcm9vdC0+ZnNfaW5mby0+Y2xlYW51cF93b3JrX3NlbSk7CiB9CiAKLS8qCi0gKiBjYWxjdWxhdGUgZXh0cmEgbWV0YWRhdGEgcmVzZXJ2YXRpb24gd2hlbiBzbmFwc2hvdHRpbmcgYSBzdWJ2b2x1bWUKLSAqIGNvbnRhaW5zIG9ycGhhbiBmaWxlcy4KLSAqLwotdm9pZCBidHJmc19vcnBoYW5fcHJlX3NuYXBzaG90KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCXN0cnVjdCBidHJmc19wZW5kaW5nX3NuYXBzaG90ICpwZW5kaW5nLAotCQkJCXU2NCAqYnl0ZXNfdG9fcmVzZXJ2ZSkKLXsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKLQlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3Y7Ci0JdTY0IG51bV9ieXRlczsKLQlpbnQgaW5kZXg7Ci0KLQlyb290ID0gcGVuZGluZy0+cm9vdDsKLQlpZiAoIXJvb3QtPm9ycGhhbl9ibG9ja19yc3YgfHwgbGlzdF9lbXB0eSgmcm9vdC0+b3JwaGFuX2xpc3QpKQotCQlyZXR1cm47Ci0KLQlibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwotCi0JLyogb3JwaGFuIGJsb2NrIHJlc2VydmF0aW9uIGZvciB0aGUgc25hcHNob3QgKi8KLQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnNpemU7Ci0KLQkvKgotCSAqIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBjcmVhdGVkLCBDT1dpbmcgdHJlZSBibG9ja3MgbWF5IHVzZSBtb3JlCi0JICogc3BhY2UgdGhhbiBpdCBmcmVlcy4gU28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2gKLQkgKiByZXNlcnZlZCBzcGFjZS4KLQkgKi8KLQlpbmRleCA9IHRyYW5zLT50cmFuc2lkICYgMHgxOwotCWlmIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0gPCBibG9ja19yc3YtPnNpemUpIHsKLQkJbnVtX2J5dGVzICs9IGJsb2NrX3Jzdi0+c2l6ZSAtCi0JCQkgICAgIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0pOwotCX0KLQotCSpieXRlc190b19yZXNlcnZlICs9IG51bV9ieXRlczsKLX0KLQotdm9pZCBidHJmc19vcnBoYW5fcG9zdF9zbmFwc2hvdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJCQlzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCAqcGVuZGluZykKLXsKLQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IHBlbmRpbmctPnJvb3Q7Ci0Jc3RydWN0IGJ0cmZzX3Jvb3QgKnNuYXAgPSBwZW5kaW5nLT5zbmFwOwotCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKmJsb2NrX3JzdjsKLQl1NjQgbnVtX2J5dGVzOwotCWludCBpbmRleDsKLQlpbnQgcmV0OwotCi0JaWYgKCFyb290LT5vcnBoYW5fYmxvY2tfcnN2IHx8IGxpc3RfZW1wdHkoJnJvb3QtPm9ycGhhbl9saXN0KSkKLQkJcmV0dXJuOwotCi0JLyogcmVmaWxsIHNvdXJjZSBzdWJ2b2x1bWUncyBvcnBoYW4gYmxvY2sgcmVzZXJ2YXRpb24gKi8KLQlibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwotCWluZGV4ID0gdHJhbnMtPnRyYW5zaWQgJiAweDE7Ci0JaWYgKGJsb2NrX3Jzdi0+cmVzZXJ2ZWQgKyBibG9ja19yc3YtPmZyZWVkW2luZGV4XSA8IGJsb2NrX3Jzdi0+c2l6ZSkgewotCQludW1fYnl0ZXMgPSBibG9ja19yc3YtPnNpemUgLQotCQkJICAgIChibG9ja19yc3YtPnJlc2VydmVkICsgYmxvY2tfcnN2LT5mcmVlZFtpbmRleF0pOwotCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcGVuZGluZy0+YmxvY2tfcnN2LAotCQkJCQkgICAgICByb290LT5vcnBoYW5fYmxvY2tfcnN2LAotCQkJCQkgICAgICBudW1fYnl0ZXMpOwotCQlCVUdfT04ocmV0KTsKLQl9Ci0KLQkvKiBzZXR1cCBvcnBoYW4gYmxvY2sgcmVzZXJ2YXRpb24gZm9yIHRoZSBzbmFwc2hvdCAqLwotCWJsb2NrX3JzdiA9IGJ0cmZzX2FsbG9jX2Jsb2NrX3JzdihzbmFwKTsKLQlCVUdfT04oIWJsb2NrX3Jzdik7Ci0KLQlidHJmc19hZGRfZHVyYWJsZV9ibG9ja19yc3Yocm9vdC0+ZnNfaW5mbywgYmxvY2tfcnN2KTsKLQlzbmFwLT5vcnBoYW5fYmxvY2tfcnN2ID0gYmxvY2tfcnN2OwotCi0JbnVtX2J5dGVzID0gcm9vdC0+b3JwaGFuX2Jsb2NrX3Jzdi0+c2l6ZTsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcGVuZGluZy0+YmxvY2tfcnN2LAotCQkJCSAgICAgIGJsb2NrX3JzdiwgbnVtX2J5dGVzKTsKLQlCVUdfT04ocmV0KTsKLQotI2lmIDAKLQkvKiBpbnNlcnQgb3JwaGFuIGl0ZW0gZm9yIHRoZSBzbmFwc2hvdCAqLwotCVdBUk5fT04oIXJvb3QtPm9ycGhhbl9pdGVtX2luc2VydGVkKTsKLQlyZXQgPSBidHJmc19pbnNlcnRfb3JwaGFuX2l0ZW0odHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKLQkJCQkgICAgICAgc25hcC0+cm9vdF9rZXkub2JqZWN0aWQpOwotCUJVR19PTihyZXQpOwotCXNuYXAtPm9ycGhhbl9pdGVtX2luc2VydGVkID0gMTsKLSNlbmRpZgotfQotCiBlbnVtIGJ0cmZzX29ycGhhbl9jbGVhbnVwX3N0YXRlIHsKIAlPUlBIQU5fQ0xFQU5VUF9TVEFSVEVECT0gMSwKIAlPUlBIQU5fQ0xFQU5VUF9ET05FCT0gMiwKQEAgLTIyNDcsOSArMjAyMiw2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CiAKLQlpZiAoYmxvY2tfcnN2KQotCQlidHJmc19hZGRfZHVyYWJsZV9ibG9ja19yc3Yocm9vdC0+ZnNfaW5mbywgYmxvY2tfcnN2KTsKLQogCS8qIGdyYWIgbWV0YWRhdGEgcmVzZXJ2YXRpb24gZnJvbSB0cmFuc2FjdGlvbiBoYW5kbGUgKi8KIAlpZiAocmVzZXJ2ZSkgewogCQlyZXQgPSBidHJmc19vcnBoYW5fcmVzZXJ2ZV9tZXRhZGF0YSh0cmFucywgaW5vZGUpOwpAQCAtMjMxNiw2ICsyMDg4LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleSwgZm91bmRfa2V5OwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdTY0IGxhc3Rfb2JqZWN0aWQgPSAwOwogCWludCByZXQgPSAwLCBucl91bmxpbmsgPSAwLCBucl90cnVuY2F0ZSA9IDA7CiAKIAlpZiAoY21weGNoZygmcm9vdC0+b3JwaGFuX2NsZWFudXBfc3RhdGUsIDAsIE9SUEhBTl9DTEVBTlVQX1NUQVJURUQpKQpAQCAtMjM2NywxMyArMjE0MCwzOSBAQAogCQkgKiBjcm9zc2luZyByb290IHRoaW5nLiAgd2Ugc3RvcmUgdGhlIGlub2RlIG51bWJlciBpbiB0aGUKIAkJICogb2Zmc2V0IG9mIHRoZSBvcnBoYW4gaXRlbS4KIAkJICovCisKKwkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPT0gbGFzdF9vYmplY3RpZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogRXJyb3IgcmVtb3Zpbmcgb3JwaGFuIGVudHJ5LCAiCisJCQkgICAgICAgInN0b3BwaW5nIG9ycGhhbiBjbGVhbnVwXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxhc3Rfb2JqZWN0aWQgPSBmb3VuZF9rZXkub2Zmc2V0OworCiAJCWZvdW5kX2tleS5vYmplY3RpZCA9IGZvdW5kX2tleS5vZmZzZXQ7CiAJCWZvdW5kX2tleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CiAJCWZvdW5kX2tleS5vZmZzZXQgPSAwOwogCQlpbm9kZSA9IGJ0cmZzX2lnZXQocm9vdC0+ZnNfaW5mby0+c2IsICZmb3VuZF9rZXksIHJvb3QsIE5VTEwpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CisJCXJldCA9IFBUUl9SRVQoaW5vZGUpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRVNUQUxFKQogCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogSW5vZGUgaXMgYWxyZWFkeSBnb25lIGJ1dCB0aGUgb3JwaGFuIGl0ZW0gaXMgc3RpbGwgdGhlcmUsCisJCSAqIGtpbGwgdGhlIG9ycGhhbiBpdGVtLgorCQkgKi8KKwkJaWYgKHJldCA9PSAtRVNUQUxFKSB7CisJCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJaWYgKElTX0VSUih0cmFucykpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGJ0cmZzX2RlbF9vcnBoYW5faXRlbSh0cmFucywgcm9vdCwKKwkJCQkJCSAgICBmb3VuZF9rZXkub2JqZWN0aWQpOworCQkJQlVHX09OKHJldCk7CisJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQkJY29udGludWU7CiAJCX0KIAogCQkvKgpAQCAtMjM4NCwyNCArMjE4Myw2IEBACiAJCWxpc3RfYWRkKCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4sICZyb290LT5vcnBoYW5fbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CiAKLQkJLyoKLQkJICogaWYgdGhpcyBpcyBhIGJhZCBpbm9kZSwgbWVhbnMgd2UgYWN0dWFsbHkgc3VjY2VlZGVkIGluCi0JCSAqIHJlbW92aW5nIHRoZSBpbm9kZSwgYnV0IG5vdCB0aGUgb3JwaGFuIHJlY29yZCwgd2hpY2ggbWVhbnMKLQkJICogd2UgbmVlZCB0byBtYW51YWxseSBkZWxldGUgdGhlIG9ycGhhbiBzaW5jZSBpcHV0IHdpbGwganVzdAotCQkgKiBkbyBhIGRlc3Ryb3lfaW5vZGUKLQkJICovCi0JCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7Ci0JCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDApOwotCQkJaWYgKElTX0VSUih0cmFucykpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKHRyYW5zKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWJ0cmZzX29ycGhhbl9kZWwodHJhbnMsIGlub2RlKTsKLQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JCQlpcHV0KGlub2RlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogaWYgd2UgaGF2ZSBsaW5rcywgdGhpcyB3YXMgYSB0cnVuY2F0ZSwgbGV0cyBkbyB0aGF0ICovCiAJCWlmIChpbm9kZS0+aV9ubGluaykgewogCQkJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CkBAIC0yNDIwLDYgKzIyMDEsOSBAQAogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQorCS8qIHJlbGVhc2UgdGhlIHBhdGggc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0ICovCisJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOworCiAJcm9vdC0+b3JwaGFuX2NsZWFudXBfc3RhdGUgPSBPUlBIQU5fQ0xFQU5VUF9ET05FOwogCiAJaWYgKHJvb3QtPm9ycGhhbl9ibG9ja19yc3YpCkBAIC0yNTM0LDcgKzIzMTgsNyBAQAogCWlub2RlX2l0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKIAkJCQkgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOwogCWlub2RlLT5pX21vZGUgPSBidHJmc19pbm9kZV9tb2RlKGxlYWYsIGlub2RlX2l0ZW0pOwotCWlub2RlLT5pX25saW5rID0gYnRyZnNfaW5vZGVfbmxpbmsobGVhZiwgaW5vZGVfaXRlbSk7CisJc2V0X25saW5rKGlub2RlLCBidHJmc19pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtKSk7CiAJaW5vZGUtPmlfdWlkID0gYnRyZnNfaW5vZGVfdWlkKGxlYWYsIGlub2RlX2l0ZW0pOwogCWlub2RlLT5pX2dpZCA9IGJ0cmZzX2lub2RlX2dpZChsZWFmLCBpbm9kZV9pdGVtKTsKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIGJ0cmZzX2lub2RlX3NpemUobGVhZiwgaW5vZGVfaXRlbSkpOwpAQCAtMjY0Nyw3ICsyNDMxLDcgQEAKIC8qCiAgKiBjb3B5IGV2ZXJ5dGhpbmcgaW4gdGhlIGluLW1lbW9yeSBpbm9kZSBpbnRvIHRoZSBidHJlZS4KICAqLwotbm9pbmxpbmUgaW50IGJ0cmZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKK3N0YXRpYyBub2lubGluZSBpbnQgYnRyZnNfdXBkYXRlX2lub2RlX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CkBAIC0yNjU1LDIxICsyNDM5LDYgQEAKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBJZiB0aGUgaW5vZGUgaXMgYSBmcmVlIHNwYWNlIGlub2RlLCB3ZSBjYW4gZGVhZGxvY2sgZHVyaW5nIGNvbW1pdAotCSAqIGlmIHdlIHB1dCBpdCBpbnRvIHRoZSBkZWxheWVkIGNvZGUuCi0JICoKLQkgKiBUaGUgZGF0YSByZWxvY2F0aW9uIGlub2RlIHNob3VsZCBhbHNvIGJlIGRpcmVjdGx5IHVwZGF0ZWQKLQkgKiB3aXRob3V0IGRlbGF5Ci0JICovCi0JaWYgKCFidHJmc19pc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKQotCSAgICAmJiByb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQpIHsKLQkJcmV0ID0gYnRyZnNfZGVsYXllZF91cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKLQkJaWYgKCFyZXQpCi0JCQlidHJmc19zZXRfaW5vZGVfbGFzdF90cmFucyh0cmFucywgaW5vZGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI2OTgsNiArMjQ2Nyw0MyBAQAogfQogCiAvKgorICogY29weSBldmVyeXRoaW5nIGluIHRoZSBpbi1tZW1vcnkgaW5vZGUgaW50byB0aGUgYnRyZWUuCisgKi8KK25vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzIGEgZnJlZSBzcGFjZSBpbm9kZSwgd2UgY2FuIGRlYWRsb2NrIGR1cmluZyBjb21taXQKKwkgKiBpZiB3ZSBwdXQgaXQgaW50byB0aGUgZGVsYXllZCBjb2RlLgorCSAqCisJICogVGhlIGRhdGEgcmVsb2NhdGlvbiBpbm9kZSBzaG91bGQgYWxzbyBiZSBkaXJlY3RseSB1cGRhdGVkCisJICogd2l0aG91dCBkZWxheQorCSAqLworCWlmICghYnRyZnNfaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSkKKwkgICAgJiYgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEKSB7CisJCXJldCA9IGJ0cmZzX2RlbGF5ZWRfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCWlmICghcmV0KQorCQkJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gYnRyZnNfdXBkYXRlX2lub2RlX2l0ZW0odHJhbnMsIHJvb3QsIGlub2RlKTsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCWlmIChyZXQgPT0gLUVOT1NQQykKKwkJcmV0dXJuIGJ0cmZzX3VwZGF0ZV9pbm9kZV9pdGVtKHRyYW5zLCByb290LCBpbm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIHVubGluayBoZWxwZXIgdGhhdCBnZXRzIHVzZWQgaGVyZSBpbiBpbm9kZS5jIGFuZCBpbiB0aGUgdHJlZSBsb2dnaW5nCiAgKiByZWNvdmVyeSBjb2RlLiAgSXQgcmVtb3ZlIGEgbGluayBpbiBhIGRpcmVjdG9yeSB3aXRoIGEgZ2l2ZW4gbmFtZSwgYW5kCiAgKiBhbHNvIGRyb3BzIHRoZSBiYWNrIHJlZnMgaW4gdGhlIGlub2RlIHRvIHRoZSBkaXJlY3RvcnkKQEAgLTI4MzUsNyArMjY0MSwxNiBAQAogCXU2NCBpbm8gPSBidHJmc19pbm8oaW5vZGUpOwogCXU2NCBkaXJfaW5vID0gYnRyZnNfaW5vKGRpcik7CiAKLQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEwKTsKKwkvKgorCSAqIDEgZm9yIHRoZSBwb3NzaWJsZSBvcnBoYW4gaXRlbQorCSAqIDEgZm9yIHRoZSBkaXIgaXRlbQorCSAqIDEgZm9yIHRoZSBkaXIgaW5kZXgKKwkgKiAxIGZvciB0aGUgaW5vZGUgcmVmCisJICogMSBmb3IgdGhlIGlub2RlIHJlZiBpbiB0aGUgdHJlZSBsb2cKKwkgKiAyIGZvciB0aGUgZGlyIGVudHJpZXMgaW4gdGhlIGxvZworCSAqIDEgZm9yIHRoZSBpbm9kZQorCSAqLworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgOCk7CiAJaWYgKCFJU19FUlIodHJhbnMpIHx8IFBUUl9FUlIodHJhbnMpICE9IC1FTk9TUEMpCiAJCXJldHVybiB0cmFuczsKIApAQCAtMjg1OCw3ICsyNjczLDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAwKTsKKwkvKiAxIGZvciB0aGUgb3JwaGFuIGl0ZW0gKi8KKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOwogCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAkJcm9vdC0+ZnNfaW5mby0+ZW5vc3BjX3VubGluayA9IDA7CkBAIC0yOTYzLDYgKzI3NzksMTIgQEAKIAllcnIgPSAwOwogb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwkvKiBNaWdyYXRlIHRoZSBvcnBoYW4gcmVzZXJ2YXRpb24gb3ZlciAqLworCWlmICghZXJyKQorCQllcnIgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSh0cmFucy0+YmxvY2tfcnN2LAorCQkJCSZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LAorCQkJCXRyYW5zLT5ieXRlc19yZXNlcnZlZCk7CisKIAlpZiAoZXJyKSB7CiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCXJvb3QtPmZzX2luZm8tPmVub3NwY191bmxpbmsgPSAwOwpAQCAtMjk3Nyw2ICsyNzk5LDkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlpZiAodHJhbnMtPmJsb2NrX3JzdiA9PSAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdikgeworCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCB0cmFucy0+YmxvY2tfcnN2LAorCQkJCQl0cmFucy0+Ynl0ZXNfcmVzZXJ2ZWQpOworCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKIAkJQlVHX09OKCFyb290LT5mc19pbmZvLT5lbm9zcGNfdW5saW5rKTsKIAkJcm9vdC0+ZnNfaW5mby0+ZW5vc3BjX3VubGluayA9IDA7CiAJfQpAQCAtMzM2OCw2ICszMTkzLDcgQEAKIAlwZ29mZl90IGluZGV4ID0gZnJvbSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOwogCXN0cnVjdCBwYWdlICpwYWdlOworCWdmcF90IG1hc2sgPSBidHJmc19hbGxvY193cml0ZV9tYXNrKG1hcHBpbmcpOwogCWludCByZXQgPSAwOwogCXU2NCBwYWdlX3N0YXJ0OwogCXU2NCBwYWdlX2VuZDsKQEAgLTMzODAsNyArMzIwNiw3IEBACiAKIAlyZXQgPSAtRU5PTUVNOwogYWdhaW46Ci0JcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBpbmRleCwgbWFzayk7CiAJaWYgKCFwYWdlKSB7CiAJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIFBBR0VfQ0FDSEVfU0laRSk7CiAJCWdvdG8gb3V0OwpAQCAtMzYxMyw2ICszNDM5LDggQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19ibG9ja19yc3YgKnJzdiwgKmdsb2JhbF9yc3Y7CisJdTY0IG1pbl9zaXplID0gYnRyZnNfY2FsY190cnVuY19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCXVuc2lnbmVkIGxvbmcgbnI7CiAJaW50IHJldDsKIApAQCAtMzY0MCwyMiArMzQ2OCw1NSBAQAogCQlnb3RvIG5vX2RlbGV0ZTsKIAl9CiAKKwlyc3YgPSBidHJmc19hbGxvY19ibG9ja19yc3Yocm9vdCk7CisJaWYgKCFyc3YpIHsKKwkJYnRyZnNfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisJCWdvdG8gbm9fZGVsZXRlOworCX0KKwlyc3YtPnNpemUgPSBtaW5fc2l6ZTsKKwlnbG9iYWxfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmdsb2JhbF9ibG9ja19yc3Y7CisKIAlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOwogCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IHNpbXBsZXIgdGhhbiBidHJmc190cnVuY2F0ZSBzaW5jZQorCSAqCisJICogMSkgV2UndmUgYWxyZWFkeSByZXNlcnZlZCBvdXIgc3BhY2UgZm9yIG91ciBvcnBoYW4gaXRlbSBpbiB0aGUKKwkgKiAgICB1bmxpbmsuCisJICogMikgV2UncmUgZ29pbmcgdG8gZGVsZXRlIHRoZSBpbm9kZSBpdGVtLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZQorCSAqICAgIGl0IGF0IGFsbC4KKwkgKgorCSAqIFNvIHdlIGp1c3QgbmVlZCB0byByZXNlcnZlIHNvbWUgc2xhY2sgc3BhY2UgaW4gY2FzZSB3ZSBhZGQgYnl0ZXMgd2hlbgorCSAqIGRvaW5nIHRoZSB0cnVuY2F0ZS4KKwkgKi8KIAl3aGlsZSAoMSkgewotCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCk7Ci0JCUJVR19PTihJU19FUlIodHJhbnMpKTsKLQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJvb3QtPm9ycGhhbl9ibG9ja19yc3Y7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcnN2LCBtaW5fc2l6ZSk7CiAKLQkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2NoZWNrKHRyYW5zLCByb290LAotCQkJCQkgICAgcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdiwgMCwgNSk7CisJCS8qCisJCSAqIFRyeSBhbmQgc3RlYWwgZnJvbSB0aGUgZ2xvYmFsIHJlc2VydmUgc2luY2Ugd2Ugd2lsbAorCQkgKiBsaWtlbHkgbm90IHVzZSB0aGlzIHNwYWNlIGFueXdheSwgd2Ugd2FudCB0byB0cnkgYXMKKwkJICogaGFyZCBhcyBwb3NzaWJsZSB0byBnZXQgdGhpcyB0byB3b3JrLgorCQkgKi8KKwkJaWYgKHJldCkKKwkJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9taWdyYXRlKGdsb2JhbF9yc3YsIHJzdiwgbWluX3NpemUpOworCiAJCWlmIChyZXQpIHsKLQkJCUJVR19PTihyZXQgIT0gLUVBR0FJTik7Ci0JCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwotCQkJQlVHX09OKHJldCk7Ci0JCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBnZXQgc3BhY2UgZm9yIGEgIgorCQkJICAgICAgICJkZWxldGUsIHdpbGwgdHJ1bmNhdGUgb24gbW91bnQgJWRcbiIsIHJldCk7CisJCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJvb3QsIHJzdik7CisJCQlnb3RvIG5vX2RlbGV0ZTsKIAkJfQogCisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMCk7CisJCWlmIChJU19FUlIodHJhbnMpKSB7CisJCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJvb3QsIHJzdik7CisJCQlnb3RvIG5vX2RlbGV0ZTsKKwkJfQorCisJCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLCAwLCAwKTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CkBAIC0zNjY0LDE0ICszNTI1LDE3IEBACiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCXRyYW5zID0gTlVMTDsKIAkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7Ci0KIAl9CiAKKwlidHJmc19mcmVlX2Jsb2NrX3Jzdihyb290LCByc3YpOworCiAJaWYgKHJldCA9PSAwKSB7CisJCXRyYW5zLT5ibG9ja19yc3YgPSByb290LT5vcnBoYW5fYmxvY2tfcnN2OwogCQlyZXQgPSBidHJmc19vcnBoYW5fZGVsKHRyYW5zLCBpbm9kZSk7CiAJCUJVR19PTihyZXQpOwogCX0KIAorCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwogCWlmICghKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290IHx8CiAJICAgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCkpCiAJCWJ0cmZzX3JldHVybl9pbm8ocm9vdCwgYnRyZnNfaW5vKGlub2RlKSk7CkBAIC01Nzk1LDggKzU2NTksNyBAQAogCWlmICh0ZXN0X2JpdChCVFJGU19PUkRFUkVEX05PQ09XLCAmb3JkZXJlZC0+ZmxhZ3MpKSB7CiAJCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZCk7CiAJCWlmICghcmV0KQotCQkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7Ci0JCWVyciA9IHJldDsKKwkJCWVyciA9IGJ0cmZzX3VwZGF0ZV9pbm9kZV9mYWxsYmFjayh0cmFucywgcm9vdCwgaW5vZGUpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTU4MzQsNyArNTY5Nyw3IEBACiAJYWRkX3BlbmRpbmdfY3N1bXModHJhbnMsIGlub2RlLCBvcmRlcmVkLT5maWxlX29mZnNldCwgJm9yZGVyZWQtPmxpc3QpOwogCXJldCA9IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgMCwgb3JkZXJlZCk7CiAJaWYgKCFyZXQgfHwgIXRlc3RfYml0KEJUUkZTX09SREVSRURfUFJFQUxMT0MsICZvcmRlcmVkLT5mbGFncykpCi0JCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQlidHJmc191cGRhdGVfaW5vZGVfZmFsbGJhY2sodHJhbnMsIHJvb3QsIGlub2RlKTsKIAlyZXQgPSAwOwogb3V0X3VubG9jazoKIAl1bmxvY2tfZXh0ZW50X2NhY2hlZCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIG9yZGVyZWQtPmZpbGVfb2Zmc2V0LApAQCAtNjI4OSw3ICs2MTUyLDcgQEAKIHsKIAlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CiAJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOwotCXJldHVybiBleHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZnNfZ2V0X2V4dGVudCk7CisJcmV0dXJuIGV4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBidHJmc19nZXRfZXh0ZW50LCAwKTsKIH0KIAogc3RhdGljIGludCBidHJmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtNjU0MSw2ICs2NDA0LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAl1bnNpZ25lZCBsb25nIG5yOwogCXU2NCBtYXNrID0gcm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisJdTY0IG1pbl9zaXplID0gYnRyZnNfY2FsY190cnVuY19tZXRhZGF0YV9zaXplKHJvb3QsIDEpOwogCiAJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKIAlpZiAocmV0KQpAQCAtNjU4OCwxOSArNjQ1MiwyMyBAQAogCXJzdiA9IGJ0cmZzX2FsbG9jX2Jsb2NrX3Jzdihyb290KTsKIAlpZiAoIXJzdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JYnRyZnNfYWRkX2R1cmFibGVfYmxvY2tfcnN2KHJvb3QtPmZzX2luZm8sIHJzdik7CisJcnN2LT5zaXplID0gbWluX3NpemU7CiAKKwkvKgorCSAqIDEgZm9yIHRoZSB0cnVuY2F0ZSBzbGFjayBzcGFjZQorCSAqIDEgZm9yIHRoZSBvcnBoYW4gaXRlbSB3ZSdyZSBnb2luZyB0byBhZGQKKwkgKiAxIGZvciB0aGUgb3JwaGFuIGl0ZW0gZGVsZXRpb24KKwkgKiAxIGZvciB1cGRhdGluZyB0aGUgaW5vZGUuCisJICovCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCA0KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQllcnIgPSBQVFJfRVJSKHRyYW5zKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JLyoKLQkgKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgdHJ1bmNhdGUgcHJvY2Vzcy4gIFRydW5jYXRlIHNob3VsZCBiZSBhZGRpbmcKLQkgKiBzcGFjZSwgYnV0IGlmIHRoZXJlIGFyZSBzbmFwc2hvdHMgaXQgbWF5IGVuZCB1cCB1c2luZyBzcGFjZS4KLQkgKi8KLQlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LCByc3YpOworCS8qIE1pZ3JhdGUgdGhlIHNsYWNrIHNwYWNlIGZvciB0aGUgdHJ1bmNhdGUgdG8gb3VyIHJlc2VydmUgKi8KKwlyZXQgPSBidHJmc19ibG9ja19yc3ZfbWlncmF0ZSgmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2LCByc3YsCisJCQkJICAgICAgbWluX3NpemUpOwogCUJVR19PTihyZXQpOwogCiAJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwpAQCAtNjYwOSwyMSArNjQ3Nyw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwotCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Ci0JYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7Ci0KLQkvKgotCSAqIE9rIHNvIHdlJ3ZlIGFscmVhZHkgbWlncmF0ZWQgb3VyIGJ5dGVzIG92ZXIgZm9yIHRoZSB0cnVuY2F0ZSwgc28gaGVyZQotCSAqIGp1c3QgcmVzZXJ2ZSB0aGUgb25lIHNsb3Qgd2UgbmVlZCBmb3IgdXBkYXRpbmcgdGhlIGlub2RlLgotCSAqLwotCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7Ci0JaWYgKElTX0VSUih0cmFucykpIHsKLQkJZXJyID0gUFRSX0VSUih0cmFucyk7Ci0JCWdvdG8gb3V0OwotCX0KLQl0cmFucy0+YmxvY2tfcnN2ID0gcnN2OwotCiAJLyoKIAkgKiBzZXRhdHRyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHRoZSBvcmRlcmVkX2RhdGFfY2xvc2UgZmxhZywKIAkgKiBidXQgdGhhdCBpcyBvbmx5IHRlc3RlZCBkdXJpbmcgdGhlIGxhc3QgZmlsZSByZWxlYXNlLiAgVGhhdApAQCAtNjY0NSwyMCArNjQ5OCwzMCBAQAogCQlidHJmc19hZGRfb3JkZXJlZF9vcGVyYXRpb24odHJhbnMsIHJvb3QsIGlub2RlKTsKIAogCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcnN2LCBtaW5fc2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aXRoIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbiB3ZQorCQkJICogc3RhcnRlZCBhYm92ZSwgZXZlcnkgb3RoZXIgdGltZSB3ZSBzaG91bGRuJ3QgaGF2ZSBhCisJCQkgKiB0cmFuc2FjdGlvbiBzdGFydGVkIHlldC4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJCWdvdG8gZW5kX3RyYW5zOworCQkJZXJyID0gcmV0OworCQkJYnJlYWs7CisJCX0KKwogCQlpZiAoIXRyYW5zKSB7Ci0JCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDMpOworCQkJLyogSnVzdCBuZWVkIHRoZSAxIGZvciB1cGRhdGluZyB0aGUgaW5vZGUgKi8KKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CiAJCQlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQkJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCi0JCQlyZXQgPSBidHJmc190cnVuY2F0ZV9yZXNlcnZlX21ldGFkYXRhKHRyYW5zLCByb290LAotCQkJCQkJCSAgICAgIHJzdik7Ci0JCQlCVUdfT04ocmV0KTsKLQotCQkJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKIAkJfQogCisJCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CisKIAkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLAogCQkJCQkJIGlub2RlLT5pX3NpemUsCiAJCQkJCQkgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKQEAgLTY2NzMsNyArNjUzNiw3IEBACiAJCQllcnIgPSByZXQ7CiAJCQlicmVhazsKIAkJfQotCitlbmRfdHJhbnM6CiAJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCQl0cmFucyA9IE5VTEw7CkBAIC02NjkzLDE0ICs2NTU2LDE2IEBACiAJCXJldCA9IGJ0cmZzX29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpOwogCX0KIAotCXRyYW5zLT5ibG9ja19yc3YgPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfYmxvY2tfcnN2OwotCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwotCWlmIChyZXQgJiYgIWVycikKLQkJZXJyID0gcmV0OworCWlmICh0cmFucykgeworCQl0cmFucy0+YmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPnRyYW5zX2Jsb2NrX3JzdjsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCWlmIChyZXQgJiYgIWVycikKKwkJCWVyciA9IHJldDsKIAotCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwotCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7Ci0JYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOworCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKKwl9CiAKIG91dDoKIAlidHJmc19mcmVlX2Jsb2NrX3Jzdihyb290LCByc3YpOwpAQCAtNjcyOCw3ICs2NTkzLDcgQEAKIAlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKIAotCWlub2RlLT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CiAKIAllcnIgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIG5ld19yb290LCBpbm9kZSk7CkBAIC02NzU1LDkgKzY2MjAsOSBAQAogCWVpLT5sYXN0X3N1Yl90cmFucyA9IDA7CiAJZWktPmxvZ2dlZF90cmFucyA9IDA7CiAJZWktPmRlbGFsbG9jX2J5dGVzID0gMDsKLQllaS0+cmVzZXJ2ZWRfYnl0ZXMgPSAwOwogCWVpLT5kaXNrX2lfc2l6ZSA9IDA7CiAJZWktPmZsYWdzID0gMDsKKwllaS0+Y3N1bV9ieXRlcyA9IDA7CiAJZWktPmluZGV4X2NudCA9ICh1NjQpLTE7CiAJZWktPmxhc3RfdW5saW5rX3RyYW5zID0gMDsKIApAQCAtNjc2OSw2ICs2NjM0LDcgQEAKIAllaS0+b3JwaGFuX21ldGFfcmVzZXJ2ZWQgPSAwOwogCWVpLT5kdW1teV9pbm9kZSA9IDA7CiAJZWktPmluX2RlZnJhZyA9IDA7CisJZWktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAwOwogCWVpLT5mb3JjZV9jb21wcmVzcyA9IEJUUkZTX0NPTVBSRVNTX05PTkU7CiAKIAllaS0+ZGVsYXllZF9ub2RlID0gTlVMTDsKQEAgLTY4MDMsNiArNjY2OSw4IEBACiAJV0FSTl9PTihpbm9kZS0+aV9kYXRhLm5ycGFnZXMpOwogCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOwogCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHMpOworCVdBUk5fT04oQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzKTsKKwlXQVJOX09OKEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzKTsKIAogCS8qCiAJICogVGhpcyBjYW4gaGFwcGVuIHdoZXJlIHdlIGNyZWF0ZSBhbiBpbm9kZSwgYnV0IHNvbWVib2R5IGVsc2UgYWxzbwpAQCAtNzQyMCw3ICs3Mjg4LDYgQEAKIAkucmVhZHBhZ2VfZW5kX2lvX2hvb2sgPSBidHJmc19yZWFkcGFnZV9lbmRfaW9faG9vaywKIAkud3JpdGVwYWdlX2VuZF9pb19ob29rID0gYnRyZnNfd3JpdGVwYWdlX2VuZF9pb19ob29rLAogCS53cml0ZXBhZ2Vfc3RhcnRfaG9vayA9IGJ0cmZzX3dyaXRlcGFnZV9zdGFydF9ob29rLAotCS5yZWFkcGFnZV9pb19mYWlsZWRfaG9vayA9IGJ0cmZzX2lvX2ZhaWxlZF9ob29rLAogCS5zZXRfYml0X2hvb2sgPSBidHJmc19zZXRfYml0X2hvb2ssCiAJLmNsZWFyX2JpdF9ob29rID0gYnRyZnNfY2xlYXJfYml0X2hvb2ssCiAJLm1lcmdlX2V4dGVudF9ob29rID0gYnRyZnNfbWVyZ2VfZXh0ZW50X2hvb2ssCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5jIGIvZnMvYnRyZnMvaW9jdGwuYwppbmRleCBkYWU1ZGZlLi40YTM0YzQ3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5jCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlICJ2b2x1bWVzLmgiCiAjaW5jbHVkZSAibG9ja2luZy5oIgogI2luY2x1ZGUgImlub2RlLW1hcC5oIgorI2luY2x1ZGUgImJhY2tyZWYuaCIKIAogLyogTWFzayBvdXQgZmxhZ3MgdGhhdCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUgb2YgaW5vZGUuICovCiBzdGF0aWMgaW5saW5lIF9fdTMyIGJ0cmZzX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKQEAgLTExNyw3ICsxMTgsNyBAQAogLyoKICAqIEluaGVyaXQgZmxhZ3MgZnJvbSB0aGUgcGFyZW50IGlub2RlLgogICoKLSAqIFVubGlrZSBleHROIHdlIGRvbid0IGhhdmUgYW55IGZsYWdzIHdlIGRvbid0IHdhbnQgdG8gaW5oZXJpdCBjdXJyZW50bHkuCisgKiBDdXJyZW50bHkgb25seSB0aGUgY29tcHJlc3Npb24gZmxhZ3MgYW5kIHRoZSBjb3cgZmxhZ3MgYXJlIGluaGVyaXRlZC4KICAqLwogdm9pZCBidHJmc19pbmhlcml0X2lmbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKQEAgLTEyOCwxMiArMTI5LDE3IEBACiAKIAlmbGFncyA9IEJUUkZTX0koZGlyKS0+ZmxhZ3M7CiAKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX0RJUlNZTkM7Ci0JZWxzZSBpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCWZsYWdzICY9IChCVFJGU19JTk9ERV9OT0RVTVAgfCBCVFJGU19JTk9ERV9OT0FUSU1FKTsKKwlpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0NPTVBSRVNTKSB7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyAmPSB+QlRSRlNfSU5PREVfQ09NUFJFU1M7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9OT0NPTVBSRVNTOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9DT01QUkVTUykgeworCQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkJUUkZTX0lOT0RFX05PQ09NUFJFU1M7CisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9DT01QUkVTUzsKKwl9CiAKLQlCVFJGU19JKGlub2RlKS0+ZmxhZ3MgPSBmbGFnczsKKwlpZiAoZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFDT1cpCisJCUJUUkZTX0koaW5vZGUpLT5mbGFncyB8PSBCVFJGU19JTk9ERV9OT0RBVEFDT1c7CisKIAlidHJmc191cGRhdGVfaWZsYWdzKGlub2RlKTsKIH0KIApAQCAtMjc3LDYgKzI4Myw3IEBACiAJc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZTsKIAl1NjQgbWlubGVuID0gVUxMT05HX01BWDsKIAl1NjQgbnVtX2RldmljZXMgPSAwOworCXU2NCB0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWludCByZXQ7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCkBAIC0yOTUsMTIgKzMwMiwxNSBAQAogCQl9CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOworCiAJaWYgKCFudW1fZGV2aWNlcykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgYXJnLCBzaXplb2YocmFuZ2UpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHJhbmdlLnN0YXJ0ID4gdG90YWxfYnl0ZXMpCisJCXJldHVybiAtRUlOVkFMOwogCisJcmFuZ2UubGVuID0gbWluKHJhbmdlLmxlbiwgdG90YWxfYnl0ZXMgLSByYW5nZS5zdGFydCk7CiAJcmFuZ2UubWlubGVuID0gbWF4KHJhbmdlLm1pbmxlbiwgbWlubGVuKTsKIAlyZXQgPSBidHJmc190cmltX2ZzKHJvb3QsICZyYW5nZSk7CiAJaWYgKHJldCA8IDApCkBAIC03NjAsNyArNzcwLDcgQEAKIAlpbnQgcmV0ID0gMTsKIAogCS8qCi0JICogbWFrZSBzdXJlIHRoYXQgb25jZSB3ZSBzdGFydCBkZWZyYWdnaW5nIGFuZCBleHRlbnQsIHdlIGtlZXAgb24KKwkgKiBtYWtlIHN1cmUgdGhhdCBvbmNlIHdlIHN0YXJ0IGRlZnJhZ2dpbmcgYW4gZXh0ZW50LCB3ZSBrZWVwIG9uCiAJICogZGVmcmFnZ2luZyBpdAogCSAqLwogCWlmIChzdGFydCA8ICpkZWZyYWdfZW5kKQpAQCAtODA1LDcgKzgxNSw2IEBACiAJICogZXh0ZW50IHdpbGwgZm9yY2UgYXQgbGVhc3QgcGFydCBvZiB0aGF0IGJpZyBleHRlbnQgdG8gYmUgZGVmcmFnZ2VkLgogCSAqLwogCWlmIChyZXQpIHsKLQkJKmxhc3RfbGVuICs9IGxlbjsKIAkJKmRlZnJhZ19lbmQgPSBleHRlbnRfbWFwX2VuZChlbSk7CiAJfSBlbHNlIHsKIAkJKmxhc3RfbGVuID0gMDsKQEAgLTg0Myw2ICs4NTIsNyBAQAogCWludCBpX2RvbmU7CiAJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOwogCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZF9zdGF0ZSA9IE5VTEw7CisJZ2ZwX3QgbWFzayA9IGJ0cmZzX2FsbG9jX3dyaXRlX21hc2soaW5vZGUtPmlfbWFwcGluZyk7CiAKIAlpZiAoaXNpemUgPT0gMCkKIAkJcmV0dXJuIDA7CkBAIC04NjAsNyArODcwLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsCi0JCQkJCSAgICBzdGFydF9pbmRleCArIGksIEdGUF9OT0ZTKTsKKwkJCQkJICAgIHN0YXJ0X2luZGV4ICsgaSwgbWFzayk7CiAJCWlmICghcGFnZSkKIAkJCWJyZWFrOwogCkBAIC05NzIsMTggKzk4MiwyMCBAQAogCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlcjsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKKwl1NjQgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJdTY0IGZlYXR1cmVzOwogCXU2NCBsYXN0X2xlbiA9IDA7CiAJdTY0IHNraXAgPSAwOwogCXU2NCBkZWZyYWdfZW5kID0gMDsKIAl1NjQgbmV3ZXJfb2ZmID0gcmFuZ2UtPnN0YXJ0OwotCWludCBuZXdlcl9sZWZ0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyByYV9pbmRleCA9IDA7CiAJaW50IHJldDsKIAlpbnQgZGVmcmFnX2NvdW50ID0gMDsKIAlpbnQgY29tcHJlc3NfdHlwZSA9IEJUUkZTX0NPTVBSRVNTX1pMSUI7CiAJaW50IGV4dGVudF90aHJlc2ggPSByYW5nZS0+ZXh0ZW50X3RocmVzaDsKLQlpbnQgbmV3ZXJfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBtYXhfY2x1c3RlciA9ICgyNTYgKiAxMDI0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBjbHVzdGVyID0gbWF4X2NsdXN0ZXI7CiAJdTY0IG5ld19hbGlnbiA9IH4oKHU2NCkxMjggKiAxMDI0IC0gMSk7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAKQEAgLTk5Nyw3ICsxMDA5LDcgQEAKIAkJCWNvbXByZXNzX3R5cGUgPSByYW5nZS0+Y29tcHJlc3NfdHlwZTsKIAl9CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKQorCWlmIChpc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0xMDEzLDcgKzEwMjUsNyBAQAogCQlyYSA9ICZmaWxlLT5mX3JhOwogCX0KIAotCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBuZXdlcl9jbHVzdGVyLAorCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBtYXhfY2x1c3RlciwKIAkJCUdGUF9OT0ZTKTsKIAlpZiAoIXBhZ2VzKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMDIyLDEwICsxMDM0LDEwIEBACiAKIAkvKiBmaW5kIHRoZSBsYXN0IHBhZ2UgdG8gZGVmcmFnICovCiAJaWYgKHJhbmdlLT5zdGFydCArIHJhbmdlLT5sZW4gPiByYW5nZS0+c3RhcnQpIHsKLQkJbGFzdF9pbmRleCA9IG1pbl90KHU2NCwgaW5vZGUtPmlfc2l6ZSAtIDEsCisJCWxhc3RfaW5kZXggPSBtaW5fdCh1NjQsIGlzaXplIC0gMSwKIAkJCSByYW5nZS0+c3RhcnQgKyByYW5nZS0+bGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9IGVsc2UgewotCQlsYXN0X2luZGV4ID0gKGlub2RlLT5pX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlsYXN0X2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9CiAKIAlpZiAobmV3ZXJfdGhhbikgewpAQCAtMTAzOCwxNCArMTA1MCwxMyBAQAogCQkJICogdGhlIGV4dGVudHMgaW4gdGhlIGZpbGUgZXZlbmx5IHNwYWNlZAogCQkJICovCiAJCQlpID0gKG5ld2VyX29mZiAmIG5ld19hbGlnbikgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCW5ld2VyX2xlZnQgPSBuZXdlcl9jbHVzdGVyOwogCQl9IGVsc2UKIAkJCWdvdG8gb3V0X3JhOwogCX0gZWxzZSB7CiAJCWkgPSByYW5nZS0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAl9CiAJaWYgKCFtYXhfdG9fZGVmcmFnKQotCQltYXhfdG9fZGVmcmFnID0gbGFzdF9pbmRleCAtIDE7CisJCW1heF90b19kZWZyYWcgPSBsYXN0X2luZGV4OwogCiAJLyoKIAkgKiBtYWtlIHdyaXRlYmFjayBzdGFydHMgZnJvbSBpLCBzbyB0aGUgZGVmcmFnIHJhbmdlIGNhbiBiZQpAQCAtMTA3OSwxOCArMTA5MCwzMSBAQAogCQkJaSA9IG1heChpICsgMSwgbmV4dCk7CiAJCQljb250aW51ZTsKIAkJfQorCisJCWlmICghbmV3ZXJfdGhhbikgeworCQkJY2x1c3RlciA9IChQQUdFX0NBQ0hFX0FMSUdOKGRlZnJhZ19lbmQpID4+CisJCQkJICAgUEFHRV9DQUNIRV9TSElGVCkgLSBpOworCQkJY2x1c3RlciA9IG1pbihjbHVzdGVyLCBtYXhfY2x1c3Rlcik7CisJCX0gZWxzZSB7CisJCQljbHVzdGVyID0gbWF4X2NsdXN0ZXI7CisJCX0KKwogCQlpZiAocmFuZ2UtPmZsYWdzICYgQlRSRlNfREVGUkFHX1JBTkdFX0NPTVBSRVNTKQogCQkJQlRSRlNfSShpbm9kZSktPmZvcmNlX2NvbXByZXNzID0gY29tcHJlc3NfdHlwZTsKIAotCQlidHJmc19mb3JjZV9yYShpbm9kZS0+aV9tYXBwaW5nLCByYSwgZmlsZSwgaSwgbmV3ZXJfY2x1c3Rlcik7CisJCWlmIChpICsgY2x1c3RlciA+IHJhX2luZGV4KSB7CisJCQlyYV9pbmRleCA9IG1heChpLCByYV9pbmRleCk7CisJCQlidHJmc19mb3JjZV9yYShpbm9kZS0+aV9tYXBwaW5nLCByYSwgZmlsZSwgcmFfaW5kZXgsCisJCQkJICAgICAgIGNsdXN0ZXIpOworCQkJcmFfaW5kZXggKz0gbWF4X2NsdXN0ZXI7CisJCX0KIAotCQlyZXQgPSBjbHVzdGVyX3BhZ2VzX2Zvcl9kZWZyYWcoaW5vZGUsIHBhZ2VzLCBpLCBuZXdlcl9jbHVzdGVyKTsKKwkJcmV0ID0gY2x1c3Rlcl9wYWdlc19mb3JfZGVmcmFnKGlub2RlLCBwYWdlcywgaSwgY2x1c3Rlcik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXRfcmE7CiAKIAkJZGVmcmFnX2NvdW50ICs9IHJldDsKIAkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLCByZXQpOwotCQlpICs9IHJldDsKIAogCQlpZiAobmV3ZXJfdGhhbikgewogCQkJaWYgKG5ld2VyX29mZiA9PSAodTY0KS0xKQpAQCAtMTEwNSwxMiArMTEyOSwxNyBAQAogCQkJaWYgKCFyZXQpIHsKIAkJCQlyYW5nZS0+c3RhcnQgPSBuZXdlcl9vZmY7CiAJCQkJaSA9IChuZXdlcl9vZmYgJiBuZXdfYWxpZ24pID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQkJbmV3ZXJfbGVmdCA9IG5ld2VyX2NsdXN0ZXI7CiAJCQl9IGVsc2UgewogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewotCQkJaSsrOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlpICs9IHJldDsKKwkJCQlsYXN0X2xlbiArPSByZXQgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwkJCX0gZWxzZSB7CisJCQkJaSsrOworCQkJCWxhc3RfbGVuID0gMDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTEzNiwxNiArMTE2NSwxNCBAQAogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl9CiAKLQlkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJZmVhdHVyZXMgPSBidHJmc19zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyKTsKIAlpZiAocmFuZ2UtPmNvbXByZXNzX3R5cGUgPT0gQlRSRlNfQ09NUFJFU1NfTFpPKSB7CiAJCWZlYXR1cmVzIHw9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfQ09NUFJFU1NfTFpPOwogCQlidHJmc19zZXRfc3VwZXJfaW5jb21wYXRfZmxhZ3MoZGlza19zdXBlciwgZmVhdHVyZXMpOwogCX0KIAotCWlmICghZmlsZSkKLQkJa2ZyZWUocmEpOwotCXJldHVybiBkZWZyYWdfY291bnQ7CisJcmV0ID0gZGVmcmFnX2NvdW50OwogCiBvdXRfcmE6CiAJaWYgKCFmaWxlKQpAQCAtMjU4Nyw3ICsyNjE0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCX0KIAotCWRpcl9pZCA9IGJ0cmZzX3N1cGVyX3Jvb3RfZGlyKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlkaXJfaWQgPSBidHJmc19zdXBlcl9yb290X2Rpcihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbSh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoLAogCQkJCSAgIGRpcl9pZCwgImRlZmF1bHQiLCA3LCAxKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZGkpKSB7CkBAIC0yNjAzLDcgKzI2MzAsNyBAQAogCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAKLQlkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJZGlza19zdXBlciA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJZmVhdHVyZXMgPSBidHJmc19zdXBlcl9pbmNvbXBhdF9mbGFncyhkaXNrX3N1cGVyKTsKIAlpZiAoIShmZWF0dXJlcyAmIEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfREVGQVVMVF9TVUJWT0wpKSB7CiAJCWZlYXR1cmVzIHw9IEJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfREVGQVVMVF9TVUJWT0w7CkBAIC0yODY0LDYgKzI4OTEsMTQ0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfaW5vX3RvX3BhdGgoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisJdTY0IHJlbF9wdHI7CisJaW50IHNpemU7CisJc3RydWN0IGJ0cmZzX2lvY3RsX2lub19wYXRoX2FyZ3MgKmlwYSA9IE5VTEw7CisJc3RydWN0IGlub2RlX2ZzX3BhdGhzICppcGF0aCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlpcGEgPSBtZW1kdXBfdXNlcihhcmcsIHNpemVvZigqaXBhKSk7CisJaWYgKElTX0VSUihpcGEpKSB7CisJCXJldCA9IFBUUl9FUlIoaXBhKTsKKwkJaXBhID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2l6ZSA9IG1pbl90KHUzMiwgaXBhLT5zaXplLCA0MDk2KTsKKwlpcGF0aCA9IGluaXRfaXBhdGgoc2l6ZSwgcm9vdCwgcGF0aCk7CisJaWYgKElTX0VSUihpcGF0aCkpIHsKKwkJcmV0ID0gUFRSX0VSUihpcGF0aCk7CisJCWlwYXRoID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcGF0aHNfZnJvbV9pbm9kZShpcGEtPmludW0sIGlwYXRoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7ICsraSkgeworCQlyZWxfcHRyID0gaXBhdGgtPmZzcGF0aC0+dmFsW2ldIC0gKHU2NClpcGF0aC0+ZnNwYXRoLT52YWw7CisJCWlwYXRoLT5mc3BhdGgtPnZhbFtpXSA9IHJlbF9wdHI7CisJfQorCisJcmV0ID0gY29weV90b191c2VyKCh2b2lkICopaXBhLT5mc3BhdGgsICh2b2lkICopaXBhdGgtPmZzcGF0aCwgc2l6ZSk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJZnJlZV9pcGF0aChpcGF0aCk7CisJa2ZyZWUoaXBhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfaW5vX2xpc3QodTY0IGludW0sIHU2NCBvZmZzZXQsIHU2NCByb290LCB2b2lkICpjdHgpCit7CisJc3RydWN0IGJ0cmZzX2RhdGFfY29udGFpbmVyICppbm9kZXMgPSBjdHg7CisJY29uc3Qgc2l6ZV90IGMgPSAzICogc2l6ZW9mKHU2NCk7CisKKwlpZiAoaW5vZGVzLT5ieXRlc19sZWZ0ID49IGMpIHsKKwkJaW5vZGVzLT5ieXRlc19sZWZ0IC09IGM7CisJCWlub2Rlcy0+dmFsW2lub2Rlcy0+ZWxlbV9jbnRdID0gaW51bTsKKwkJaW5vZGVzLT52YWxbaW5vZGVzLT5lbGVtX2NudCArIDFdID0gb2Zmc2V0OworCQlpbm9kZXMtPnZhbFtpbm9kZXMtPmVsZW1fY250ICsgMl0gPSByb290OworCQlpbm9kZXMtPmVsZW1fY250ICs9IDM7CisJfSBlbHNlIHsKKwkJaW5vZGVzLT5ieXRlc19taXNzaW5nICs9IGMgLSBpbm9kZXMtPmJ5dGVzX2xlZnQ7CisJCWlub2Rlcy0+Ynl0ZXNfbGVmdCA9IDA7CisJCWlub2Rlcy0+ZWxlbV9taXNzZWQgKz0gMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfbG9naWNhbF90b19pbm8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldCA9IDA7CisJaW50IHNpemU7CisJdTY0IGV4dGVudF9vZmZzZXQ7CisJc3RydWN0IGJ0cmZzX2lvY3RsX2xvZ2ljYWxfaW5vX2FyZ3MgKmxvaTsKKwlzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIgKmlub2RlcyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJbG9pID0gbWVtZHVwX3VzZXIoYXJnLCBzaXplb2YoKmxvaSkpOworCWlmIChJU19FUlIobG9pKSkgeworCQlyZXQgPSBQVFJfRVJSKGxvaSk7CisJCWxvaSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNpemUgPSBtaW5fdCh1MzIsIGxvaS0+c2l6ZSwgNDA5Nik7CisJaW5vZGVzID0gaW5pdF9kYXRhX2NvbnRhaW5lcihzaXplKTsKKwlpZiAoSVNfRVJSKGlub2RlcykpIHsKKwkJcmV0ID0gUFRSX0VSUihpbm9kZXMpOworCQlpbm9kZXMgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBleHRlbnRfZnJvbV9sb2dpY2FsKHJvb3QtPmZzX2luZm8sIGxvaS0+bG9naWNhbCwgcGF0aCwgJmtleSk7CisKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykKKwkJcmV0ID0gLUVOT0VOVDsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlleHRlbnRfb2Zmc2V0ID0gbG9pLT5sb2dpY2FsIC0ga2V5Lm9iamVjdGlkOworCXJldCA9IGl0ZXJhdGVfZXh0ZW50X2lub2Rlcyhyb290LT5mc19pbmZvLCBwYXRoLCBrZXkub2JqZWN0aWQsCisJCQkJCWV4dGVudF9vZmZzZXQsIGJ1aWxkX2lub19saXN0LCBpbm9kZXMpOworCisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gY29weV90b191c2VyKCh2b2lkICopbG9pLT5pbm9kZXMsICh2b2lkICopaW5vZGVzLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXQgPSAtRUZBVUxUOworCitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWtmcmVlKGlub2Rlcyk7CisJa2ZyZWUobG9pKTsKKworCXJldHVybiByZXQ7Cit9CisKIGxvbmcgYnRyZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludAogCQljbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMjkyMSw2ICszMDg2LDEwIEBACiAJCXJldHVybiBidHJmc19pb2N0bF90cmVlX3NlYXJjaChmaWxlLCBhcmdwKTsKIAljYXNlIEJUUkZTX0lPQ19JTk9fTE9PS1VQOgogCQlyZXR1cm4gYnRyZnNfaW9jdGxfaW5vX2xvb2t1cChmaWxlLCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19JTk9fUEFUSFM6CisJCXJldHVybiBidHJmc19pb2N0bF9pbm9fdG9fcGF0aChyb290LCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19MT0dJQ0FMX0lOTzoKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX2xvZ2ljYWxfdG9faW5vKHJvb3QsIGFyZ3ApOwogCWNhc2UgQlRSRlNfSU9DX1NQQUNFX0lORk86CiAJCXJldHVybiBidHJmc19pb2N0bF9zcGFjZV9pbmZvKHJvb3QsIGFyZ3ApOwogCWNhc2UgQlRSRlNfSU9DX1NZTkM6CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5oIGIvZnMvYnRyZnMvaW9jdGwuaAppbmRleCBhZDFlYTc4Li4yNTJhZTk5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5oCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmgKQEAgLTE5Myw2ICsxOTMsMzAgQEAKIAlzdHJ1Y3QgYnRyZnNfaW9jdGxfc3BhY2VfaW5mbyBzcGFjZXNbMF07CiB9OwogCitzdHJ1Y3QgYnRyZnNfZGF0YV9jb250YWluZXIgeworCV9fdTMyCWJ5dGVzX2xlZnQ7CS8qIG91dCAtLSBieXRlcyBub3QgbmVlZGVkIHRvIGRlbGl2ZXIgb3V0cHV0ICovCisJX191MzIJYnl0ZXNfbWlzc2luZzsJLyogb3V0IC0tIGFkZGl0aW9uYWwgYnl0ZXMgbmVlZGVkIGZvciByZXN1bHQgKi8KKwlfX3UzMgllbGVtX2NudDsJLyogb3V0ICovCisJX191MzIJZWxlbV9taXNzZWQ7CS8qIG91dCAqLworCV9fdTY0CXZhbFswXTsJCS8qIG91dCAqLworfTsKKworc3RydWN0IGJ0cmZzX2lvY3RsX2lub19wYXRoX2FyZ3MgeworCV9fdTY0CQkJCWludW07CQkvKiBpbiAqLworCV9fdTMyCQkJCXNpemU7CQkvKiBpbiAqLworCV9fdTY0CQkJCXJlc2VydmVkWzRdOworCS8qIHN0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lcgkqZnNwYXRoOwkgICBvdXQgKi8KKwlfX3U2NAkJCQlmc3BhdGg7CQkvKiBvdXQgKi8KK307CisKK3N0cnVjdCBidHJmc19pb2N0bF9sb2dpY2FsX2lub19hcmdzIHsKKwlfX3U2NAkJCQlsb2dpY2FsOwkvKiBpbiAqLworCV9fdTMyCQkJCXNpemU7CQkvKiBpbiAqLworCV9fdTY0CQkJCXJlc2VydmVkWzRdOworCS8qIHN0cnVjdCBidHJmc19kYXRhX2NvbnRhaW5lcgkqaW5vZGVzOwlvdXQgICAqLworCV9fdTY0CQkJCWlub2RlczsKK307CisKICNkZWZpbmUgQlRSRlNfSU9DX1NOQVBfQ1JFQVRFIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDEsIFwKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCiAjZGVmaW5lIEJUUkZTX0lPQ19ERUZSQUcgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMiwgXApAQCAtMjQ4LDQgKzI3Miw5IEBACiAJCQkJIHN0cnVjdCBidHJmc19pb2N0bF9kZXZfaW5mb19hcmdzKQogI2RlZmluZSBCVFJGU19JT0NfRlNfSU5GTyBfSU9SKEJUUkZTX0lPQ1RMX01BR0lDLCAzMSwgXAogCQkJICAgICAgIHN0cnVjdCBidHJmc19pb2N0bF9mc19pbmZvX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19JTk9fUEFUSFMgX0lPV1IoQlRSRlNfSU9DVExfTUFHSUMsIDM1LCBcCisJCQkJCXN0cnVjdCBidHJmc19pb2N0bF9pbm9fcGF0aF9hcmdzKQorI2RlZmluZSBCVFJGU19JT0NfTE9HSUNBTF9JTk8gX0lPV1IoQlRSRlNfSU9DVExfTUFHSUMsIDM2LCBcCisJCQkJCXN0cnVjdCBidHJmc19pb2N0bF9pbm9fcGF0aF9hcmdzKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ByaW50LXRyZWUuYyBiL2ZzL2J0cmZzL3ByaW50LXRyZWUuYwppbmRleCBmYjI2MDVkLi5mMzhlNDUyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9wcmludC10cmVlLmMKKysrIGIvZnMvYnRyZnMvcHJpbnQtdHJlZS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIHZvaWQgYnRyZnNfcHJpbnRfbGVhZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKmwpCiB7CiAJaW50IGk7Ci0JdTMyIHR5cGU7Ci0JdTMyIG5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobCk7CisJdTMyIHR5cGUsIG5yOwogCXN0cnVjdCBidHJmc19pdGVtICppdGVtOwogCXN0cnVjdCBidHJmc19yb290X2l0ZW0gKnJpOwogCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CkBAIC0xNzIsNiArMTcxLDExIEBACiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CiAKKwlpZiAoIWwpCisJCXJldHVybjsKKworCW5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobCk7CisKIAlwcmludGsoS0VSTl9JTkZPICJsZWFmICVsbHUgdG90YWwgcHRycyAlZCBmcmVlIHNwYWNlICVkXG4iLAogCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2hlYWRlcl9ieXRlbnIobCksIG5yLAogCQlidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgbCkpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVhZGEuYyBiL2ZzL2J0cmZzL3JlYWRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3M2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3JlYWRhLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU1RSQVRPLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorCisjdW5kZWYgREVCVUcKKworLyoKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2VuZXJpYyByZWFkIGFoZWFkIGZyYW1ld29yay4KKyAqCisgKiBUbyB0cmlnZ2VyIGEgcmVhZGFoZWFkLCBidHJmc19yZWFkYV9hZGQgbXVzdCBiZSBjYWxsZWQuIEl0IHdpbGwgc3RhcnQKKyAqIGEgcmVhZCBhaGVhZCBmb3IgdGhlIGdpdmVuIHJhbmdlIFtzdGFydCwgZW5kKSBvbiB0cmVlIHJvb3QuIFRoZSByZXR1cm5lZAorICogaGFuZGxlIGNhbiBlaXRoZXIgYmUgdXNlZCB0byB3YWl0IG9uIHRoZSByZWFkYWhlYWQgdG8gZmluaXNoCisgKiAoYnRyZnNfcmVhZGFfd2FpdCksIG9yIHRvIHNlbmQgaXQgdG8gdGhlIGJhY2tncm91bmQgKGJ0cmZzX3JlYWRhX2RldGFjaCkuCisgKgorICogVGhlIHJlYWQgYWhlYWQgd29ya3MgYXMgZm9sbG93czoKKyAqIE9uIGJ0cmZzX3JlYWRhX2FkZCwgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgaW5zZXJ0ZWQgaW50byBhIHJhZGl4X3RyZWUuCisgKiByZWFkYV9zdGFydF9tYWNoaW5lIHdpbGwgdGhlbiBzZWFyY2ggZm9yIGV4dGVudHMgdG8gcHJlZmV0Y2ggYW5kIHRyaWdnZXIKKyAqIHNvbWUgcmVhZHMuIFdoZW4gYSByZWFkIGZpbmlzaGVzIGZvciBhIG5vZGUsIGFsbCBjb250YWluZWQgbm9kZS9sZWFmCisgKiBwb2ludGVycyB0aGF0IGxpZSBpbiB0aGUgZ2l2ZW4gcmFuZ2Ugd2lsbCBhbHNvIGJlIGVucXVldWVkLiBUaGUgcmVhZHMgd2lsbAorICogYmUgdHJpZ2dlcmVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHRodXMgZ2l2aW5nIGEgYmlnIHdpbiBvdmVyIGEgbmFpdmUKKyAqIGVudW1lcmF0aW9uLiBJdCB3aWxsIGFsc28gbWFrZSB1c2Ugb2YgbXVsdGktZGV2aWNlIGxheW91dHMuIEVhY2ggZGlzaworICogd2lsbCBoYXZlIGl0cyBvbiByZWFkIHBvaW50ZXIgYW5kIGFsbCBkaXNrcyB3aWxsIGJ5IHV0aWxpemVkIGluIHBhcmFsbGVsLgorICogQWxzbyB3aWxsIG5vIHR3byBkaXNrcyByZWFkIGJvdGggc2lkZXMgb2YgYSBtaXJyb3Igc2ltdWx0YW5lb3VzbHksIGFzIHRoaXMKKyAqIHdvdWxkIHdhc3RlIHNlZWtpbmcgY2FwYWNpdHkuIEluc3RlYWQgYm90aCBkaXNrcyB3aWxsIHJlYWQgZGlmZmVyZW50IHBhcnRzCisgKiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqIEFueSBudW1iZXIgb2YgcmVhZGFoZWFkcyBjYW4gYmUgc3RhcnRlZCBpbiBwYXJhbGxlbC4gVGhlIHJlYWQgb3JkZXIgd2lsbCBiZQorICogZGV0ZXJtaW5lZCBnbG9iYWxseSwgaS5lLiAyIHBhcmFsbGVsIHJlYWRhaGVhZHMgd2lsbCBub3JtYWxseSBmaW5pc2ggZmFzdGVyCisgKiB0aGFuIHRoZSAyIHN0YXJ0ZWQgb25lIGFmdGVyIGFub3RoZXIuCisgKi8KKworI2RlZmluZSBNQVhfTUlSUk9SUyAyCisjZGVmaW5lIE1BWF9JTl9GTElHSFQgNgorCitzdHJ1Y3QgcmVhZGFfZXh0Y3RsIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wJKnJjOworCXU2NAkJCWdlbmVyYXRpb247Cit9OworCitzdHJ1Y3QgcmVhZGFfZXh0ZW50IHsKKwl1NjQJCQlsb2dpY2FsOworCXN0cnVjdCBidHJmc19rZXkJdG9wOworCXUzMgkJCWJsb2Nrc2l6ZTsKKwlpbnQJCQllcnI7CisJc3RydWN0IGxpc3RfaGVhZAlleHRjdGw7CisJc3RydWN0IGtyZWYJCXJlZmNudDsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCByZWFkYV96b25lCSp6b25lc1tNQVhfTUlSUk9SU107CisJaW50CQkJbnpvbmVzOworCXN0cnVjdCBidHJmc19kZXZpY2UJKnNjaGVkdWxlZF9mb3I7Cit9OworCitzdHJ1Y3QgcmVhZGFfem9uZSB7CisJdTY0CQkJc3RhcnQ7CisJdTY0CQkJZW5kOworCXU2NAkJCWVsZW1zOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzcGlubG9ja190CQlsb2NrOworCWludAkJCWxvY2tlZDsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlCSpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2RldmljZQkqZGV2c1tNQVhfTUlSUk9SU107IC8qIGZ1bGwgbGlzdCwgaW5jbCBzZWxmICovCisJaW50CQkJbmRldnM7CisJc3RydWN0IGtyZWYJCXJlZmNudDsKK307CisKK3N0cnVjdCByZWFkYV9tYWNoaW5lX3dvcmsgeworCXN0cnVjdCBidHJmc193b3JrCXdvcms7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8JKmZzX2luZm87Cit9OworCitzdGF0aWMgdm9pZCByZWFkYV9leHRlbnRfcHV0KHN0cnVjdCBidHJmc19mc19pbmZvICosIHN0cnVjdCByZWFkYV9leHRlbnQgKik7CitzdGF0aWMgdm9pZCByZWFkYV9jb250cm9sX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOworc3RhdGljIHZvaWQgcmVhZGFfem9uZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKTsKK3N0YXRpYyB2b2lkIHJlYWRhX3N0YXJ0X21hY2hpbmUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOworc3RhdGljIHZvaWQgX19yZWFkYV9zdGFydF9tYWNoaW5lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKKworc3RhdGljIGludCByZWFkYV9hZGRfYmxvY2soc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjLCB1NjQgbG9naWNhbCwKKwkJCSAgIHN0cnVjdCBidHJmc19rZXkgKnRvcCwgaW50IGxldmVsLCB1NjQgZ2VuZXJhdGlvbik7CisKKy8qIHJlY3Vyc2VzICovCisvKiBpbiBjYXNlIG9mIGVyciwgZWIgbWlnaHQgYmUgTlVMTCAqLworc3RhdGljIGludCBfX3JlYWRhaGVhZF9ob29rKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkgICAgdTY0IHN0YXJ0LCBpbnQgZXJyKQoreworCWludCBsZXZlbCA9IDA7CisJaW50IG5yaXRlbXM7CisJaW50IGk7CisJdTY0IGJ5dGVucjsKKwl1NjQgZ2VuZXJhdGlvbjsKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmZvcl9kZXY7CisKKwlpZiAoZWIpCisJCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGViKTsKKworCS8qIGZpbmQgZXh0ZW50ICovCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCk7CisJaWYgKHJlKQorCQlrcmVmX2dldCgmcmUtPnJlZmNudCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJaWYgKCFyZSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZyZS0+bG9jayk7CisJLyoKKwkgKiBqdXN0IHRha2UgdGhlIGZ1bGwgbGlzdCBmcm9tIHRoZSBleHRlbnQuIGFmdGVyd2FyZHMgd2UKKwkgKiBkb24ndCBuZWVkIHRoZSBsb2NrIGFueW1vcmUKKwkgKi8KKwlsaXN0X3JlcGxhY2VfaW5pdCgmcmUtPmV4dGN0bCwgJmxpc3QpOworCWZvcl9kZXYgPSByZS0+c2NoZWR1bGVkX2ZvcjsKKwlyZS0+c2NoZWR1bGVkX2ZvciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnJlLT5sb2NrKTsKKworCWlmIChlcnIgPT0gMCkgeworCQlucml0ZW1zID0gbGV2ZWwgPyBidHJmc19oZWFkZXJfbnJpdGVtcyhlYikgOiAwOworCQlnZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZWIpOworCQkvKgorCQkgKiBGSVhNRTogY3VycmVudGx5IHdlIGp1c3Qgc2V0IG5yaXRlbXMgdG8gMCBpZiB0aGlzIGlzIGEgbGVhZiwKKwkJICogZWZmZWN0aXZlbHkgaWdub3JpbmcgdGhlIGNvbnRlbnQuIEluIGEgbmV4dCBzdGVwIHdlIGNvdWxkCisJCSAqIHRyaWdnZXIgbW9yZSByZWFkYWhlYWQgZGVwZW5kaW5nIGZyb20gdGhlIGNvbnRlbnQsIGUuZy4KKwkJICogZmV0Y2ggdGhlIGNoZWNrc3VtcyBmb3IgdGhlIGV4dGVudHMgaW4gdGhlIGxlYWYuCisJCSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIHRoaXMgaXMgdGhlIGVycm9yIGNhc2UsIHRoZSBleHRlbnQgYnVmZmVyIGhhcyBub3QgYmVlbgorCQkgKiByZWFkIGNvcnJlY3RseS4gV2Ugd29uJ3QgYWNjZXNzIGFueXRoaW5nIGZyb20gaXQgYW5kCisJCSAqIGp1c3QgY2xlYW51cCBvdXIgZGF0YSBzdHJ1Y3R1cmVzLiBFZmZlY3RpdmVseSB0aGlzIHdpbGwKKwkJICogY3V0IHRoZSBicmFuY2ggYmVsb3cgdGhpcyBub2RlIGZyb20gcmVhZCBhaGVhZC4KKwkJICovCisJCW5yaXRlbXMgPSAwOworCQlnZW5lcmF0aW9uID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCXN0cnVjdCByZWFkYV9leHRjdGwgKnJlYzsKKwkJdTY0IG5fZ2VuOworCQlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwkJc3RydWN0IGJ0cmZzX2tleSBuZXh0X2tleTsKKworCQlidHJmc19ub2RlX2tleV90b19jcHUoZWIsICZrZXksIGkpOworCQlpZiAoaSArIDEgPCBucml0ZW1zKQorCQkJYnRyZnNfbm9kZV9rZXlfdG9fY3B1KGViLCAmbmV4dF9rZXksIGkgKyAxKTsKKwkJZWxzZQorCQkJbmV4dF9rZXkgPSByZS0+dG9wOworCQlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGViLCBpKTsKKwkJbl9nZW4gPSBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKGViLCBpKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYywgJmxpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCByZWFkYV9jb250cm9sICpyYyA9IHJlYy0+cmM7CisKKwkJCS8qCisJCQkgKiBpZiB0aGUgZ2VuZXJhdGlvbiBkb2Vzbid0IG1hdGNoLCBqdXN0IGlnbm9yZSB0aGlzCisJCQkgKiBleHRjdGwuIFRoaXMgd2lsbCBwcm9iYWJseSBjdXQgb2ZmIGEgYnJhbmNoIGZyb20KKwkJCSAqIHByZWZldGNoLiBBbHRlcm5hdGl2ZWx5IG9uZSBjb3VsZCBzdGFydCBhIG5ldyAoc3ViLSkKKwkJCSAqIHByZWZldGNoIGZvciB0aGlzIGJyYW5jaCwgc3RhcnRpbmcgYWdhaW4gZnJvbSByb290LgorCQkJICogRklYTUU6IG1vdmUgdGhlIGdlbmVyYXRpb24gY2hlY2sgb3V0IG9mIHRoaXMgbG9vcAorCQkJICovCisjaWZkZWYgREVCVUcKKwkJCWlmIChyZWMtPmdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJnZW5lcmF0aW9uIG1pc21hdGNoIGZvciAiCisJCQkJCQkiKCVsbHUsJWQsJWxsdSkgJWxsdSAhPSAlbGx1XG4iLAorCQkJCSAgICAgICBrZXkub2JqZWN0aWQsIGtleS50eXBlLCBrZXkub2Zmc2V0LAorCQkJCSAgICAgICByZWMtPmdlbmVyYXRpb24sIGdlbmVyYXRpb24pOworCQkJfQorI2VuZGlmCisJCQlpZiAocmVjLT5nZW5lcmF0aW9uID09IGdlbmVyYXRpb24gJiYKKwkJCSAgICBidHJmc19jb21wX2NwdV9rZXlzKCZrZXksICZyYy0+a2V5X2VuZCkgPCAwICYmCisJCQkgICAgYnRyZnNfY29tcF9jcHVfa2V5cygmbmV4dF9rZXksICZyYy0+a2V5X3N0YXJ0KSA+IDApCisJCQkJcmVhZGFfYWRkX2Jsb2NrKHJjLCBieXRlbnIsICZuZXh0X2tleSwKKwkJCQkJCWxldmVsIC0gMSwgbl9nZW4pOworCQl9CisJfQorCS8qCisJICogZnJlZSBleHRjdGwgcmVjb3JkcworCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKKwkJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjOworCQlzdHJ1Y3QgcmVhZGFfZXh0Y3RsICpyZWM7CisKKwkJcmVjID0gbGlzdF9maXJzdF9lbnRyeSgmbGlzdCwgc3RydWN0IHJlYWRhX2V4dGN0bCwgbGlzdCk7CisJCWxpc3RfZGVsKCZyZWMtPmxpc3QpOworCQlyYyA9IHJlYy0+cmM7CisJCWtmcmVlKHJlYyk7CisKKwkJa3JlZl9nZXQoJnJjLT5yZWZjbnQpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmMtPmVsZW1zKSkgeworCQkJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisJCQl3YWtlX3VwKCZyYy0+d2FpdCk7CisJCX0KKwkJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisKKwkJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CS8qIG9uZSByZWYgZm9yIGVhY2ggZW50cnkgKi8KKwl9CisJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CS8qIG91ciByZWYgKi8KKwlpZiAoZm9yX2RldikKKwkJYXRvbWljX2RlYygmZm9yX2Rldi0+cmVhZGFfaW5fZmxpZ2h0KTsKKworCXJldHVybiAwOworfQorCisvKgorICogc3RhcnQgaXMgcGFzc2VkIHNlcGFyYXRlbHkgaW4gY2FzZSBlYiBpbiBOVUxMLCB3aGljaCBtYXkgYmUgdGhlIGNhc2Ugd2l0aAorICogZmFpbGVkIEkvTworICovCitpbnQgYnRyZWVfcmVhZGFoZWFkX2hvb2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSB1NjQgc3RhcnQsIGludCBlcnIpCit7CisJaW50IHJldDsKKworCXJldCA9IF9fcmVhZGFoZWFkX2hvb2socm9vdCwgZWIsIHN0YXJ0LCBlcnIpOworCisJcmVhZGFfc3RhcnRfbWFjaGluZShyb290LT5mc19pbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVhZGFfem9uZSAqcmVhZGFfZmluZF96b25lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQkgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldiwgdTY0IGxvZ2ljYWwsCisJCQkJCSAgc3RydWN0IGJ0cmZzX2JpbyAqYmJpbykKK3sKKwlpbnQgcmV0OworCWludCBsb29wZWQgPSAwOworCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUgPSBOVUxMOworCXU2NCBzdGFydDsKKwl1NjQgZW5kOworCWludCBpOworCithZ2FpbjoKKwl6b25lID0gTlVMTDsKKwlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfem9uZXMsICh2b2lkICoqKSZ6b25lLAorCQkJCSAgICAgbG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZULCAxKTsKKwlpZiAocmV0ID09IDEpCisJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCWlmIChyZXQgPT0gMSkgeworCQlpZiAobG9naWNhbCA+PSB6b25lLT5zdGFydCAmJiBsb2dpY2FsIDwgem9uZS0+ZW5kKQorCQkJcmV0dXJuIHpvbmU7CisJCXNwaW5fbG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCWtyZWZfcHV0KCZ6b25lLT5yZWZjbnQsIHJlYWRhX3pvbmVfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwl9CisKKwlpZiAobG9vcGVkKQorCQlyZXR1cm4gTlVMTDsKKworCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGZzX2luZm8sIGxvZ2ljYWwpOworCWlmICghY2FjaGUpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBjYWNoZS0+a2V5Lm9iamVjdGlkOworCWVuZCA9IHN0YXJ0ICsgY2FjaGUtPmtleS5vZmZzZXQgLSAxOworCWJ0cmZzX3B1dF9ibG9ja19ncm91cChjYWNoZSk7CisKKwl6b25lID0ga3phbGxvYyhzaXplb2YoKnpvbmUpLCBHRlBfTk9GUyk7CisJaWYgKCF6b25lKQorCQlyZXR1cm4gTlVMTDsKKworCXpvbmUtPnN0YXJ0ID0gc3RhcnQ7CisJem9uZS0+ZW5kID0gZW5kOworCUlOSVRfTElTVF9IRUFEKCZ6b25lLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmem9uZS0+bG9jayk7CisJem9uZS0+bG9ja2VkID0gMDsKKwlrcmVmX2luaXQoJnpvbmUtPnJlZmNudCk7CisJem9uZS0+ZWxlbXMgPSAwOworCXpvbmUtPmRldmljZSA9IGRldjsgLyogb3VyIGRldmljZSBhbHdheXMgc2l0cyBhdCBpbmRleCAwICovCisJZm9yIChpID0gMDsgaSA8IGJiaW8tPm51bV9zdHJpcGVzOyArK2kpIHsKKwkJLyogYm91bmRzIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQgKi8KKwkJem9uZS0+ZGV2c1tpXSA9IGJiaW8tPnN0cmlwZXNbaV0uZGV2OworCX0KKwl6b25lLT5uZGV2cyA9IGJiaW8tPm51bV9zdHJpcGVzOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmZGV2LT5yZWFkYV96b25lcywKKwkJCQkodW5zaWduZWQgbG9uZyl6b25lLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVCwKKwkJCQl6b25lKTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisKKwlpZiAocmV0KSB7CisJCWtmcmVlKHpvbmUpOworCQlsb29wZWQgPSAxOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiB6b25lOworfQorCitzdGF0aWMgc3RydWN0IHJlYWRhX2V4dGVudCAqcmVhZGFfZmluZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICAgIHU2NCBsb2dpY2FsLAorCQkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICp0b3AsIGludCBsZXZlbCkKK3sKKwlpbnQgcmV0OworCWludCBsb29wZWQgPSAwOworCXN0cnVjdCByZWFkYV9leHRlbnQgKnJlID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUgPSAmZnNfaW5mby0+bWFwcGluZ190cmVlOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKwl1MzIgYmxvY2tzaXplOworCXU2NCBsZW5ndGg7CisJaW50IG56b25lcyA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IGxvZ2ljYWwgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworYWdhaW46CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlyZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCk7CisJaWYgKHJlKQorCQlrcmVmX2dldCgmcmUtPnJlZmNudCk7CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJaWYgKHJlIHx8IGxvb3BlZCkKKwkJcmV0dXJuIHJlOworCisJcmUgPSBremFsbG9jKHNpemVvZigqcmUpLCBHRlBfTk9GUyk7CisJaWYgKCFyZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsIGxldmVsKTsKKwlyZS0+bG9naWNhbCA9IGxvZ2ljYWw7CisJcmUtPmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKwlyZS0+dG9wID0gKnRvcDsKKwlJTklUX0xJU1RfSEVBRCgmcmUtPmV4dGN0bCk7CisJc3Bpbl9sb2NrX2luaXQoJnJlLT5sb2NrKTsKKwlrcmVmX2luaXQoJnJlLT5yZWZjbnQpOworCisJLyoKKwkgKiBtYXAgYmxvY2sKKwkgKi8KKwlsZW5ndGggPSBibG9ja3NpemU7CisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBSRVFfV1JJVEUsIGxvZ2ljYWwsICZsZW5ndGgsICZiYmlvLCAwKTsKKwlpZiAocmV0IHx8ICFiYmlvIHx8IGxlbmd0aCA8IGJsb2Nrc2l6ZSkKKwkJZ290byBlcnJvcjsKKworCWlmIChiYmlvLT5udW1fc3RyaXBlcyA+IE1BWF9NSVJST1JTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgcmVhZGFoZWFkOiBtb3JlIHRoYW4gJWQgY29waWVzIG5vdCAiCisJCQkJInN1cHBvcnRlZCIsIE1BWF9NSVJST1JTKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKG56b25lcyA9IDA7IG56b25lcyA8IGJiaW8tPm51bV9zdHJpcGVzOyArK256b25lcykgeworCQlzdHJ1Y3QgcmVhZGFfem9uZSAqem9uZTsKKworCQlkZXYgPSBiYmlvLT5zdHJpcGVzW256b25lc10uZGV2OworCQl6b25lID0gcmVhZGFfZmluZF96b25lKGZzX2luZm8sIGRldiwgbG9naWNhbCwgYmJpbyk7CisJCWlmICghem9uZSkKKwkJCWJyZWFrOworCisJCXJlLT56b25lc1tuem9uZXNdID0gem9uZTsKKwkJc3Bpbl9sb2NrKCZ6b25lLT5sb2NrKTsKKwkJaWYgKCF6b25lLT5lbGVtcykKKwkJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCQkrK3pvbmUtPmVsZW1zOworCQlzcGluX3VubG9jaygmem9uZS0+bG9jayk7CisJCXNwaW5fbG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCWtyZWZfcHV0KCZ6b25lLT5yZWZjbnQsIHJlYWRhX3pvbmVfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwl9CisJcmUtPm56b25lcyA9IG56b25lczsKKwlpZiAobnpvbmVzID09IDApIHsKKwkJLyogbm90IGEgc2luZ2xlIHpvbmUgZm91bmQsIGVycm9yIGFuZCBvdXQgKi8KKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbnNlcnQgZXh0ZW50IGluIHJlYWRhX3RyZWUgKyBhbGwgcGVyLWRldmljZSB0cmVlcywgYWxsIG9yIG5vdGhpbmcgKi8KKwlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCXJldCA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZmc19pbmZvLT5yZWFkYV90cmVlLCBpbmRleCwgcmUpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlpZiAocmV0ICE9IC1FTk9NRU0pIHsKKwkJCS8qIHNvbWVvbmUgaW5zZXJ0ZWQgdGhlIGV4dGVudCBpbiB0aGUgbWVhbnRpbWUgKi8KKwkJCWxvb3BlZCA9IDE7CisJCX0KKwkJZ290byBlcnJvcjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG56b25lczsgKytpKSB7CisJCWRldiA9IGJiaW8tPnN0cmlwZXNbaV0uZGV2OworCQlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmZGV2LT5yZWFkYV9leHRlbnRzLCBpbmRleCwgcmUpOworCQlpZiAocmV0KSB7CisJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQlkZXYgPSBiYmlvLT5zdHJpcGVzW2ldLmRldjsKKwkJCQlCVUdfT04oZGV2ID09IE5VTEwpOworCQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZkZXYtPnJlYWRhX2V4dGVudHMsIGluZGV4KTsKKwkJCX0KKwkJCUJVR19PTihmc19pbmZvID09IE5VTEwpOworCQkJcmFkaXhfdHJlZV9kZWxldGUoJmZzX2luZm8tPnJlYWRhX3RyZWUsIGluZGV4KTsKKwkJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCisJa2ZyZWUoYmJpbyk7CisJcmV0dXJuIHJlOworCitlcnJvcjoKKwl3aGlsZSAobnpvbmVzKSB7CisJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCisJCS0tbnpvbmVzOworCQl6b25lID0gcmUtPnpvbmVzW256b25lc107CisJCWtyZWZfZ2V0KCZ6b25lLT5yZWZjbnQpOworCQlzcGluX2xvY2soJnpvbmUtPmxvY2spOworCQktLXpvbmUtPmVsZW1zOworCQlpZiAoem9uZS0+ZWxlbXMgPT0gMCkgeworCQkJLyoKKwkJCSAqIG5vIGZzX2luZm8tPnJlYWRhX2xvY2sgbmVlZGVkLCBhcyB0aGlzIGNhbid0IGJlCisJCQkgKiB0aGUgbGFzdCByZWYKKwkJCSAqLworCQkJa3JlZl9wdXQoJnpvbmUtPnJlZmNudCwgcmVhZGFfem9uZV9yZWxlYXNlKTsKKwkJfQorCQlzcGluX3VubG9jaygmem9uZS0+bG9jayk7CisKKwkJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJa3JlZl9wdXQoJnpvbmUtPnJlZmNudCwgcmVhZGFfem9uZV9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCX0KKwlrZnJlZShiYmlvKTsKKwlrZnJlZShyZSk7CisJaWYgKGxvb3BlZCkKKwkJZ290byBhZ2FpbjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfa3JlZl9kdW1teShzdHJ1Y3Qga3JlZiAqa3IpCit7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRhX2V4dGVudF9wdXQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkgICAgIHN0cnVjdCByZWFkYV9leHRlbnQgKnJlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSByZS0+bG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlpZiAoIWtyZWZfcHV0KCZyZS0+cmVmY250LCByZWFkYV9rcmVmX2R1bW15KSkgeworCQlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlyYWRpeF90cmVlX2RlbGV0ZSgmZnNfaW5mby0+cmVhZGFfdHJlZSwgaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJc3RydWN0IHJlYWRhX3pvbmUgKnpvbmUgPSByZS0+em9uZXNbaV07CisKKwkJcmFkaXhfdHJlZV9kZWxldGUoJnpvbmUtPmRldmljZS0+cmVhZGFfZXh0ZW50cywgaW5kZXgpOworCX0KKworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJc3RydWN0IHJlYWRhX3pvbmUgKnpvbmUgPSByZS0+em9uZXNbaV07CisKKwkJa3JlZl9nZXQoJnpvbmUtPnJlZmNudCk7CisJCXNwaW5fbG9jaygmem9uZS0+bG9jayk7CisJCS0tem9uZS0+ZWxlbXM7CisJCWlmICh6b25lLT5lbGVtcyA9PSAwKSB7CisJCQkvKiBubyBmc19pbmZvLT5yZWFkYV9sb2NrIG5lZWRlZCwgYXMgdGhpcyBjYW4ndCBiZQorCQkJICogdGhlIGxhc3QgcmVmICovCisJCQlrcmVmX3B1dCgmem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQl9CisJCXNwaW5fdW5sb2NrKCZ6b25lLT5sb2NrKTsKKworCQlzcGluX2xvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlrcmVmX3B1dCgmem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQlzcGluX3VubG9jaygmZnNfaW5mby0+cmVhZGFfbG9jayk7CisJfQorCWlmIChyZS0+c2NoZWR1bGVkX2ZvcikKKwkJYXRvbWljX2RlYygmcmUtPnNjaGVkdWxlZF9mb3ItPnJlYWRhX2luX2ZsaWdodCk7CisKKwlrZnJlZShyZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRhX3pvbmVfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgcmVhZGFfem9uZSAqem9uZSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmVhZGFfem9uZSwgcmVmY250KTsKKworCXJhZGl4X3RyZWVfZGVsZXRlKCZ6b25lLT5kZXZpY2UtPnJlYWRhX3pvbmVzLAorCQkJICB6b25lLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisKKwlrZnJlZSh6b25lKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfY29udHJvbF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCByZWFkYV9jb250cm9sICpyYyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcmVhZGFfY29udHJvbCwKKwkJCQkJCXJlZmNudCk7CisKKwlrZnJlZShyYyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZGFfYWRkX2Jsb2NrKHN0cnVjdCByZWFkYV9jb250cm9sICpyYywgdTY0IGxvZ2ljYWwsCisJCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICp0b3AsIGludCBsZXZlbCwgdTY0IGdlbmVyYXRpb24pCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSByYy0+cm9vdDsKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZTsKKwlzdHJ1Y3QgcmVhZGFfZXh0Y3RsICpyZWM7CisKKwlyZSA9IHJlYWRhX2ZpbmRfZXh0ZW50KHJvb3QsIGxvZ2ljYWwsIHRvcCwgbGV2ZWwpOyAvKiB0YWtlcyBvbmUgcmVmICovCisJaWYgKCFyZSkKKwkJcmV0dXJuIC0xOworCisJcmVjID0ga3phbGxvYyhzaXplb2YoKnJlYyksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlYykgeworCQlyZWFkYV9leHRlbnRfcHV0KHJvb3QtPmZzX2luZm8sIHJlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlYy0+cmMgPSByYzsKKwlyZWMtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCWF0b21pY19pbmMoJnJjLT5lbGVtcyk7CisKKwlzcGluX2xvY2soJnJlLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZyZWMtPmxpc3QsICZyZS0+ZXh0Y3RsKTsKKwlzcGluX3VubG9jaygmcmUtPmxvY2spOworCisJLyogbGVhdmUgdGhlIHJlZiBvbiB0aGUgZXh0ZW50ICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNhbGxlZCB3aXRoIGZzX2luZm8tPnJlYWRhX2xvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCByZWFkYV9wZWVyX3pvbmVzX3NldF9sb2NrKHN0cnVjdCByZWFkYV96b25lICp6b25lLCBpbnQgbG9jaykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gem9uZS0+ZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgem9uZS0+bmRldnM7ICsraSkgeworCQlzdHJ1Y3QgcmVhZGFfem9uZSAqcGVlcjsKKwkJcGVlciA9IHJhZGl4X3RyZWVfbG9va3VwKCZ6b25lLT5kZXZzW2ldLT5yZWFkYV96b25lcywgaW5kZXgpOworCQlpZiAocGVlciAmJiBwZWVyLT5kZXZpY2UgIT0gem9uZS0+ZGV2aWNlKQorCQkJcGVlci0+bG9ja2VkID0gbG9jazsKKwl9Cit9CisKKy8qCisgKiBjYWxsZWQgd2l0aCBmc19pbmZvLT5yZWFkYV9sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCByZWFkYV9waWNrX3pvbmUoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCByZWFkYV96b25lICp0b3Bfem9uZSA9IE5VTEw7CisJc3RydWN0IHJlYWRhX3pvbmUgKnRvcF9sb2NrZWRfem9uZSA9IE5VTEw7CisJdTY0IHRvcF9lbGVtcyA9IDA7CisJdTY0IHRvcF9sb2NrZWRfZWxlbXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSAwOworCWludCByZXQ7CisKKwlpZiAoZGV2LT5yZWFkYV9jdXJyX3pvbmUpIHsKKwkJcmVhZGFfcGVlcl96b25lc19zZXRfbG9jayhkZXYtPnJlYWRhX2N1cnJfem9uZSwgMCk7CisJCWtyZWZfcHV0KCZkZXYtPnJlYWRhX2N1cnJfem9uZS0+cmVmY250LCByZWFkYV96b25lX3JlbGVhc2UpOworCQlkZXYtPnJlYWRhX2N1cnJfem9uZSA9IE5VTEw7CisJfQorCS8qIHBpY2sgdGhlIHpvbmUgd2l0aCB0aGUgbW9zdCBlbGVtZW50cyAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCisJCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfem9uZXMsCisJCQkJCSAgICAgKHZvaWQgKiopJnpvbmUsIGluZGV4LCAxKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisJCWluZGV4ID0gKHpvbmUtPmVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJCWlmICh6b25lLT5sb2NrZWQpIHsKKwkJCWlmICh6b25lLT5lbGVtcyA+IHRvcF9sb2NrZWRfZWxlbXMpIHsKKwkJCQl0b3BfbG9ja2VkX2VsZW1zID0gem9uZS0+ZWxlbXM7CisJCQkJdG9wX2xvY2tlZF96b25lID0gem9uZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh6b25lLT5lbGVtcyA+IHRvcF9lbGVtcykgeworCQkJCXRvcF9lbGVtcyA9IHpvbmUtPmVsZW1zOworCQkJCXRvcF96b25lID0gem9uZTsKKwkJCX0KKwkJfQorCX0KKwlpZiAodG9wX3pvbmUpCisJCWRldi0+cmVhZGFfY3Vycl96b25lID0gdG9wX3pvbmU7CisJZWxzZSBpZiAodG9wX2xvY2tlZF96b25lKQorCQlkZXYtPnJlYWRhX2N1cnJfem9uZSA9IHRvcF9sb2NrZWRfem9uZTsKKwllbHNlCisJCXJldHVybiAwOworCisJZGV2LT5yZWFkYV9uZXh0ID0gZGV2LT5yZWFkYV9jdXJyX3pvbmUtPnN0YXJ0OworCWtyZWZfZ2V0KCZkZXYtPnJlYWRhX2N1cnJfem9uZS0+cmVmY250KTsKKwlyZWFkYV9wZWVyX3pvbmVzX3NldF9sb2NrKGRldi0+cmVhZGFfY3Vycl96b25lLCAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlYWRhX3N0YXJ0X21hY2hpbmVfZGV2KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZSA9IE5VTEw7CisJaW50IG1pcnJvcl9udW0gPSAwOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiA9IE5VTEw7CisJdTY0IGxvZ2ljYWw7CisJdTMyIGJsb2Nrc2l6ZTsKKwlpbnQgcmV0OworCWludCBpOworCWludCBuZWVkX2tpY2sgPSAwOworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlpZiAoZGV2LT5yZWFkYV9jdXJyX3pvbmUgPT0gTlVMTCkgeworCQlyZXQgPSByZWFkYV9waWNrX3pvbmUoZGV2KTsKKwkJaWYgKCFyZXQpIHsKKwkJCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogRklYTUUgY3VycmVudGx5IHdlIGlzc3VlIHRoZSByZWFkcyBvbmUgZXh0ZW50IGF0IGEgdGltZS4gSWYgd2UgaGF2ZQorCSAqIGEgY29udGlndW91cyBibG9jayBvZiBleHRlbnRzLCB3ZSBjb3VsZCBhbHNvIGNvYWd1bGF0ZSB0aGVtIG9yIHVzZQorCSAqIHBsdWdnaW5nIHRvIHNwZWVkIHRoaW5ncyB1cAorCSAqLworCXJldCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRldi0+cmVhZGFfZXh0ZW50cywgKHZvaWQgKiopJnJlLAorCQkJCSAgICAgZGV2LT5yZWFkYV9uZXh0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIDEpOworCWlmIChyZXQgPT0gMCB8fCByZS0+bG9naWNhbCA+PSBkZXYtPnJlYWRhX2N1cnJfem9uZS0+ZW5kKSB7CisJCXJldCA9IHJlYWRhX3BpY2tfem9uZShkZXYpOworCQlpZiAoIXJldCkgeworCQkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmUgPSBOVUxMOworCQlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZkZXYtPnJlYWRhX2V4dGVudHMsICh2b2lkICoqKSZyZSwKKwkJCQkJZGV2LT5yZWFkYV9uZXh0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIDEpOworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJc3Bpbl91bmxvY2soJmZzX2luZm8tPnJlYWRhX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJZGV2LT5yZWFkYV9uZXh0ID0gcmUtPmxvZ2ljYWwgKyByZS0+YmxvY2tzaXplOworCWtyZWZfZ2V0KCZyZS0+cmVmY250KTsKKworCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKworCS8qCisJICogZmluZCBtaXJyb3IgbnVtCisJICovCisJZm9yIChpID0gMDsgaSA8IHJlLT5uem9uZXM7ICsraSkgeworCQlpZiAocmUtPnpvbmVzW2ldLT5kZXZpY2UgPT0gZGV2KSB7CisJCQltaXJyb3JfbnVtID0gaSArIDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlsb2dpY2FsID0gcmUtPmxvZ2ljYWw7CisJYmxvY2tzaXplID0gcmUtPmJsb2Nrc2l6ZTsKKworCXNwaW5fbG9jaygmcmUtPmxvY2spOworCWlmIChyZS0+c2NoZWR1bGVkX2ZvciA9PSBOVUxMKSB7CisJCXJlLT5zY2hlZHVsZWRfZm9yID0gZGV2OworCQluZWVkX2tpY2sgPSAxOworCX0KKwlzcGluX3VubG9jaygmcmUtPmxvY2spOworCisJcmVhZGFfZXh0ZW50X3B1dChmc19pbmZvLCByZSk7CisKKwlpZiAoIW5lZWRfa2ljaykKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfaW5jKCZkZXYtPnJlYWRhX2luX2ZsaWdodCk7CisJcmV0ID0gcmVhZGFfdHJlZV9ibG9ja19mbGFnZ2VkKGZzX2luZm8tPmV4dGVudF9yb290LCBsb2dpY2FsLCBibG9ja3NpemUsCisJCQkgbWlycm9yX251bSwgJmViKTsKKwlpZiAocmV0KQorCQlfX3JlYWRhaGVhZF9ob29rKGZzX2luZm8tPmV4dGVudF9yb290LCBOVUxMLCBsb2dpY2FsLCByZXQpOworCWVsc2UgaWYgKGViKQorCQlfX3JlYWRhaGVhZF9ob29rKGZzX2luZm8tPmV4dGVudF9yb290LCBlYiwgZWItPnN0YXJ0LCByZXQpOworCisJaWYgKGViKQorCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIHZvaWQgcmVhZGFfc3RhcnRfbWFjaGluZV93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspCit7CisJc3RydWN0IHJlYWRhX21hY2hpbmVfd29yayAqcm13OworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOworCisJcm13ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByZWFkYV9tYWNoaW5lX3dvcmssIHdvcmspOworCWZzX2luZm8gPSBybXctPmZzX2luZm87CisKKwlrZnJlZShybXcpOworCisJX19yZWFkYV9zdGFydF9tYWNoaW5lKGZzX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBfX3JlYWRhX3N0YXJ0X21hY2hpbmUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gZnNfaW5mby0+ZnNfZGV2aWNlczsKKwl1NjQgZW5xdWV1ZWQ7CisJdTY0IHRvdGFsID0gMDsKKwlpbnQgaTsKKworCWRvIHsKKwkJZW5xdWV1ZWQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmRldmljZS0+cmVhZGFfaW5fZmxpZ2h0KSA8CisJCQkgICAgTUFYX0lOX0ZMSUdIVCkKKwkJCQllbnF1ZXVlZCArPSByZWFkYV9zdGFydF9tYWNoaW5lX2Rldihmc19pbmZvLAorCQkJCQkJCQkgICAgZGV2aWNlKTsKKwkJfQorCQl0b3RhbCArPSBlbnF1ZXVlZDsKKwl9IHdoaWxlIChlbnF1ZXVlZCAmJiB0b3RhbCA8IDEwMDAwKTsKKworCWlmIChlbnF1ZXVlZCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUsIHRoaXMgaXMgZWZmZWN0aXZlbHkgc2luZ2xlCisJICogdGhyZWFkZWQuIFRvIGEpIG5vdCBob2xkIHRoZSBjYWxsZXIgZm9yIHRvbyBsb25nIGFuZCBiKSB0byB1dGlsaXplCisJICogbW9yZSBjb3Jlcywgd2UgYnJva2UgdGhlIGxvb3AgYWJvdmUgYWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyBhbmQgbm93CisJICogZW5xdWV1ZSB0byB3b3JrZXJzIHRvIGZpbmlzaCBpdC4gVGhpcyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGxvYWQgdG8KKwkgKiB0aGUgY29yZXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkKKwkJcmVhZGFfc3RhcnRfbWFjaGluZShmc19pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGFfc3RhcnRfbWFjaGluZShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlzdHJ1Y3QgcmVhZGFfbWFjaGluZV93b3JrICpybXc7CisKKwlybXcgPSBremFsbG9jKHNpemVvZigqcm13KSwgR0ZQX05PRlMpOworCWlmICghcm13KSB7CisJCS8qIEZJWE1FIHdlIGNhbm5vdCBoYW5kbGUgdGhpcyBwcm9wZXJseSByaWdodCBub3cgKi8KKwkJQlVHKCk7CisJfQorCXJtdy0+d29yay5mdW5jID0gcmVhZGFfc3RhcnRfbWFjaGluZV93b3JrZXI7CisJcm13LT5mc19pbmZvID0gZnNfaW5mbzsKKworCWJ0cmZzX3F1ZXVlX3dvcmtlcigmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMsICZybXctPndvcmspOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGR1bXBfZGV2cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgaW50IGFsbCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSBmc19pbmZvLT5mc19kZXZpY2VzOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJaW50IHJldDsKKwlpbnQgaTsKKwlpbnQgajsKKwlpbnQgY250OworCisJc3Bpbl9sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYgJWxsZCBoYXMgJWQgaW4gZmxpZ2h0XG4iLCBkZXZpY2UtPmRldmlkLAorCQkJYXRvbWljX3JlYWQoJmRldmljZS0+cmVhZGFfaW5fZmxpZ2h0KSk7CisJCWluZGV4ID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCXN0cnVjdCByZWFkYV96b25lICp6b25lOworCQkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZGV2aWNlLT5yZWFkYV96b25lcywKKwkJCQkJCSAgICAgKHZvaWQgKiopJnpvbmUsIGluZGV4LCAxKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIHpvbmUgJWxsdS0lbGx1IGVsZW1zICVsbHUgbG9ja2VkICIKKwkJCQkiJWQgZGV2cyIsIHpvbmUtPnN0YXJ0LCB6b25lLT5lbmQsIHpvbmUtPmVsZW1zLAorCQkJCXpvbmUtPmxvY2tlZCk7CisJCQlmb3IgKGogPSAwOyBqIDwgem9uZS0+bmRldnM7ICsraikgeworCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlbGxkIiwKKwkJCQkJem9uZS0+ZGV2c1tqXS0+ZGV2aWQpOworCQkJfQorCQkJaWYgKGRldmljZS0+cmVhZGFfY3Vycl96b25lID09IHpvbmUpCisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiIGN1cnIgb2ZmICVsbHUiLAorCQkJCQlkZXZpY2UtPnJlYWRhX25leHQgLSB6b25lLT5zdGFydCk7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJaW5kZXggPSAoem9uZS0+ZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJfQorCQljbnQgPSAwOworCQlpbmRleCA9IDA7CisJCXdoaWxlIChhbGwpIHsKKwkJCXN0cnVjdCByZWFkYV9leHRlbnQgKnJlID0gTlVMTDsKKworCQkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZGV2aWNlLT5yZWFkYV9leHRlbnRzLAorCQkJCQkJICAgICAodm9pZCAqKikmcmUsIGluZGV4LCAxKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiAgcmU6IGxvZ2ljYWwgJWxsdSBzaXplICV1IGVtcHR5ICVkIGZvciAlbGxkIiwKKwkJCQlyZS0+bG9naWNhbCwgcmUtPmJsb2Nrc2l6ZSwKKwkJCQlsaXN0X2VtcHR5KCZyZS0+ZXh0Y3RsKSwgcmUtPnNjaGVkdWxlZF9mb3IgPworCQkJCXJlLT5zY2hlZHVsZWRfZm9yLT5kZXZpZCA6IC0xKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHJlLT5uem9uZXM7ICsraSkgeworCQkJCXByaW50ayhLRVJOX0NPTlQgIiB6b25lICVsbHUtJWxsdSBkZXZzIiwKKwkJCQkJcmUtPnpvbmVzW2ldLT5zdGFydCwKKwkJCQkJcmUtPnpvbmVzW2ldLT5lbmQpOworCQkJCWZvciAoaiA9IDA7IGogPCByZS0+em9uZXNbaV0tPm5kZXZzOyArK2opIHsKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICVsbGQiLAorCQkJCQkJcmUtPnpvbmVzW2ldLT5kZXZzW2pdLT5kZXZpZCk7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCWluZGV4ID0gKHJlLT5sb2dpY2FsID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJCWlmICgrK2NudCA+IDE1KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaW5kZXggPSAwOworCWNudCA9IDA7CisJd2hpbGUgKGFsbCkgeworCQlzdHJ1Y3QgcmVhZGFfZXh0ZW50ICpyZSA9IE5VTEw7CisKKwkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZnNfaW5mby0+cmVhZGFfdHJlZSwgKHZvaWQgKiopJnJlLAorCQkJCQkgICAgIGluZGV4LCAxKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJYnJlYWs7CisJCWlmICghcmUtPnNjaGVkdWxlZF9mb3IpIHsKKwkJCWluZGV4ID0gKHJlLT5sb2dpY2FsID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHCisJCQkicmU6IGxvZ2ljYWwgJWxsdSBzaXplICV1IGxpc3QgZW1wdHkgJWQgZm9yICVsbGQiLAorCQkJcmUtPmxvZ2ljYWwsIHJlLT5ibG9ja3NpemUsIGxpc3RfZW1wdHkoJnJlLT5leHRjdGwpLAorCQkJcmUtPnNjaGVkdWxlZF9mb3IgPyByZS0+c2NoZWR1bGVkX2Zvci0+ZGV2aWQgOiAtMSk7CisJCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJCXByaW50ayhLRVJOX0NPTlQgIiB6b25lICVsbHUtJWxsdSBkZXZzIiwKKwkJCQlyZS0+em9uZXNbaV0tPnN0YXJ0LAorCQkJCXJlLT56b25lc1tpXS0+ZW5kKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZS0+bnpvbmVzOyArK2kpIHsKKwkJCQlwcmludGsoS0VSTl9DT05UICIgem9uZSAlbGx1LSVsbHUgZGV2cyIsCisJCQkJCXJlLT56b25lc1tpXS0+c3RhcnQsCisJCQkJCXJlLT56b25lc1tpXS0+ZW5kKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgcmUtPnpvbmVzW2ldLT5uZGV2czsgKytqKSB7CisJCQkJCXByaW50ayhLRVJOX0NPTlQgIiAlbGxkIiwKKwkJCQkJCXJlLT56b25lc1tpXS0+ZGV2c1tqXS0+ZGV2aWQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQlpbmRleCA9IChyZS0+bG9naWNhbCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJfQorCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5yZWFkYV9sb2NrKTsKK30KKyNlbmRpZgorCisvKgorICogaW50ZXJmYWNlCisgKi8KK3N0cnVjdCByZWFkYV9jb250cm9sICpidHJmc19yZWFkYV9hZGQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfa2V5ICprZXlfc3RhcnQsIHN0cnVjdCBidHJmc19rZXkgKmtleV9lbmQpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjOworCXU2NCBzdGFydDsKKwl1NjQgZ2VuZXJhdGlvbjsKKwlpbnQgbGV2ZWw7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGU7CisJc3RhdGljIHN0cnVjdCBidHJmc19rZXkgbWF4X2tleSA9IHsKKwkJLm9iamVjdGlkID0gKHU2NCktMSwKKwkJLnR5cGUgPSAodTgpLTEsCisJCS5vZmZzZXQgPSAodTY0KS0xCisJfTsKKworCXJjID0ga3phbGxvYyhzaXplb2YoKnJjKSwgR0ZQX05PRlMpOworCWlmICghcmMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmMtPnJvb3QgPSByb290OworCXJjLT5rZXlfc3RhcnQgPSAqa2V5X3N0YXJ0OworCXJjLT5rZXlfZW5kID0gKmtleV9lbmQ7CisJYXRvbWljX3NldCgmcmMtPmVsZW1zLCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyYy0+d2FpdCk7CisJa3JlZl9pbml0KCZyYy0+cmVmY250KTsKKwlrcmVmX2dldCgmcmMtPnJlZmNudCk7IC8qIG9uZSByZWYgZm9yIGhhdmluZyBlbGVtZW50cyAqLworCisJbm9kZSA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKKwlzdGFydCA9IG5vZGUtPnN0YXJ0OworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKG5vZGUpOworCWdlbmVyYXRpb24gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihub2RlKTsKKwlmcmVlX2V4dGVudF9idWZmZXIobm9kZSk7CisKKwlyZWFkYV9hZGRfYmxvY2socmMsIHN0YXJ0LCAmbWF4X2tleSwgbGV2ZWwsIGdlbmVyYXRpb24pOworCisJcmVhZGFfc3RhcnRfbWFjaGluZShyb290LT5mc19pbmZvKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIERFQlVHCitpbnQgYnRyZnNfcmVhZGFfd2FpdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjID0gaGFuZGxlOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZyYy0+ZWxlbXMpKSB7CisJCXdhaXRfZXZlbnRfdGltZW91dChyYy0+d2FpdCwgYXRvbWljX3JlYWQoJnJjLT5lbGVtcykgPT0gMCwKKwkJCQkgICA1ICogSFopOworCQlkdW1wX2RldnMocmMtPnJvb3QtPmZzX2luZm8sIHJjLT5lbGVtcyA8IDEwID8gMSA6IDApOworCX0KKworCWR1bXBfZGV2cyhyYy0+cm9vdC0+ZnNfaW5mbywgcmMtPmVsZW1zIDwgMTAgPyAxIDogMCk7CisKKwlrcmVmX3B1dCgmcmMtPnJlZmNudCwgcmVhZGFfY29udHJvbF9yZWxlYXNlKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK2ludCBidHJmc19yZWFkYV93YWl0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcmVhZGFfY29udHJvbCAqcmMgPSBoYW5kbGU7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnJjLT5lbGVtcykpIHsKKwkJd2FpdF9ldmVudChyYy0+d2FpdCwgYXRvbWljX3JlYWQoJnJjLT5lbGVtcykgPT0gMCk7CisJfQorCisJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIGJ0cmZzX3JlYWRhX2RldGFjaCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJjID0gaGFuZGxlOworCisJa3JlZl9wdXQoJnJjLT5yZWZjbnQsIHJlYWRhX2NvbnRyb2xfcmVsZWFzZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKaW5kZXggNTliYjE3Ni4uZGZmMjlkNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwpAQCAtMTE3NCw2ICsxMTc0LDggQEAKIAkJCWxpc3RfYWRkX3RhaWwoJm5ld19lZGdlLT5saXN0W1VQUEVSXSwKIAkJCQkgICAgICAmbmV3X25vZGUtPmxvd2VyKTsKIAkJfQorCX0gZWxzZSB7CisJCWxpc3RfYWRkX3RhaWwoJm5ld19ub2RlLT5sb3dlciwgJmNhY2hlLT5sZWF2ZXMpOwogCX0KIAogCXJiX25vZGUgPSB0cmVlX2luc2VydCgmY2FjaGUtPnJiX3Jvb3QsIG5ld19ub2RlLT5ieXRlbnIsCkBAIC0yMDQxLDggKzIwNDMsNyBAQAogCQlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CiAJCXRyYW5zLT5ibG9ja19yc3YgPSByYy0+YmxvY2tfcnN2OwogCi0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayh0cmFucywgcm9vdCwgcmMtPmJsb2NrX3JzdiwKLQkJCQkJICAgIG1pbl9yZXNlcnZlZCwgMCk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9yZWZpbGwocm9vdCwgcmMtPmJsb2NrX3JzdiwgbWluX3Jlc2VydmVkKTsKIAkJaWYgKHJldCkgewogCQkJQlVHX09OKHJldCAhPSAtRUFHQUlOKTsKIAkJCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0yMTUyLDggKzIxNTMsNyBAQAogYWdhaW46CiAJaWYgKCFlcnIpIHsKIAkJbnVtX2J5dGVzID0gcmMtPm1lcmdpbmdfcnN2X3NpemU7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoTlVMTCwgcm9vdCwgcmMtPmJsb2NrX3JzdiwKLQkJCQkJICBudW1fYnl0ZXMpOworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkKHJvb3QsIHJjLT5ibG9ja19yc3YsIG51bV9ieXRlcyk7CiAJCWlmIChyZXQpCiAJCQllcnIgPSByZXQ7CiAJfQpAQCAtMjQyNyw3ICsyNDI3LDcgQEAKIAludW1fYnl0ZXMgPSBjYWxjdV9tZXRhZGF0YV9zaXplKHJjLCBub2RlLCAxKSAqIDI7CiAKIAl0cmFucy0+YmxvY2tfcnN2ID0gcmMtPmJsb2NrX3JzdjsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfYWRkKHRyYW5zLCByb290LCByYy0+YmxvY2tfcnN2LCBudW1fYnl0ZXMpOworCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQocm9vdCwgcmMtPmJsb2NrX3JzdiwgbnVtX2J5dGVzKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCXJjLT5jb21taXRfdHJhbnNhY3Rpb24gPSAxOwpAQCAtMjkyMiw2ICsyOTIyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhOworCWdmcF90IG1hc2sgPSBidHJmc19hbGxvY193cml0ZV9tYXNrKGlub2RlLT5pX21hcHBpbmcpOwogCWludCBuciA9IDA7CiAJaW50IHJldCA9IDA7CiAKQEAgLTI5NTYsNyArMjk1Nyw3IEBACiAJCQkJCQkgIHJhLCBOVUxMLCBpbmRleCwKIAkJCQkJCSAgbGFzdF9pbmRleCArIDEgLSBpbmRleCk7CiAJCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwKLQkJCQkJCSAgIEdGUF9OT0ZTKTsKKwkJCQkJCSAgIG1hc2spOwogCQkJaWYgKCFwYWdlKSB7CiAJCQkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShpbm9kZSwKIAkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtMzMyMyw4ICszMzI0LDExIEBACiAJfQogCiAJa2V5Lm9iamVjdGlkID0gcmVmX29iamVjdGlkOwotCWtleS5vZmZzZXQgPSByZWZfb2Zmc2V0OwogCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCWlmIChyZWZfb2Zmc2V0ID4gKCh1NjQpLTEgPDwgMzIpKQorCQlrZXkub2Zmc2V0ID0gMDsKKwllbHNlCisJCWtleS5vZmZzZXQgPSByZWZfb2Zmc2V0OwogCiAJcGF0aC0+c2VhcmNoX2NvbW1pdF9yb290ID0gMTsKIAlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOwpAQCAtMzY0NSwxNCArMzY0OSwxMSBAQAogCSAqIGJ0cmZzX2luaXRfcmVsb2Nfcm9vdCB3aWxsIHVzZSB0aGVtIHdoZW4gdGhlcmUKIAkgKiBpcyBubyByZXNlcnZhdGlvbiBpbiB0cmFuc2FjdGlvbiBoYW5kbGUuCiAJICovCi0JcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChOVUxMLCByYy0+ZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19yc3YsCisJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChyYy0+ZXh0ZW50X3Jvb3QsIHJjLT5ibG9ja19yc3YsCiAJCQkJICByYy0+ZXh0ZW50X3Jvb3QtPm5vZGVzaXplICogMjU2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmMtPmJsb2NrX3Jzdi0+cmVmaWxsX3VzZWQgPSAxOwotCWJ0cmZzX2FkZF9kdXJhYmxlX2Jsb2NrX3JzdihyYy0+ZXh0ZW50X3Jvb3QtPmZzX2luZm8sIHJjLT5ibG9ja19yc3YpOwotCiAJbWVtc2V0KCZyYy0+Y2x1c3RlciwgMCwgc2l6ZW9mKHJjLT5jbHVzdGVyKSk7CiAJcmMtPnNlYXJjaF9zdGFydCA9IHJjLT5ibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkOwogCXJjLT5leHRlbnRzX2ZvdW5kID0gMDsKQEAgLTM3NzcsOCArMzc3OCw3IEBACiAJCQl9CiAJCX0KIAotCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJjLT5leHRlbnRfcm9vdCwKLQkJCQkJICAgIHJjLT5ibG9ja19yc3YsIDAsIDUpOworCQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2socmMtPmV4dGVudF9yb290LCByYy0+YmxvY2tfcnN2LCA1KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVBR0FJTikgewogCQkJCWVyciA9IHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NjcnViLmMgYi9mcy9idHJmcy9zY3J1Yi5jCmluZGV4IGE4ZDAzZDUuLmY0MTkwZjIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NjcnViLmMKKysrIGIvZnMvYnRyZnMvc2NydWIuYwpAQCAtMTcsMTAgKzE3LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAidm9sdW1lcy5oIgogI2luY2x1ZGUgImRpc2staW8uaCIKICNpbmNsdWRlICJvcmRlcmVkLWRhdGEuaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImJhY2tyZWYuaCIKKyNpbmNsdWRlICJleHRlbnRfaW8uaCIKIAogLyoKICAqIFRoaXMgaXMgb25seSB0aGUgZmlyc3Qgc3RlcCB0b3dhcmRzIGEgZnVsbC1mZWF0dXJlcyBzY3J1Yi4gSXQgcmVhZHMgYWxsCkBAIC0yOSwxNSArMzMsMTIgQEAKICAqIGFueSBjYW4gYmUgZm91bmQuCiAgKgogICogRnV0dXJlIGVuaGFuY2VtZW50czoKLSAqICAtIFRvIGVuaGFuY2UgdGhlIHBlcmZvcm1hbmNlLCBiZXR0ZXIgcmVhZC1haGVhZCBzdHJhdGVnaWVzIGZvciB0aGUKLSAqICAgIGV4dGVudC10cmVlIGNhbiBiZSBlbXBsb3llZC4KICAqICAtIEluIGNhc2UgYW4gdW5yZXBhaXJhYmxlIGV4dGVudCBpcyBlbmNvdW50ZXJlZCwgdHJhY2sgd2hpY2ggZmlsZXMgYXJlCiAgKiAgICBhZmZlY3RlZCBhbmQgcmVwb3J0IHRoZW0KICAqICAtIEluIGNhc2Ugb2YgYSByZWFkIGVycm9yIG9uIGZpbGVzIHdpdGggbm9kYXRhc3VtLCBtYXAgdGhlIGZpbGUgYW5kIHJlYWQKICAqICAgIHRoZSBleHRlbnQgdG8gdHJpZ2dlciBhIHdyaXRlYmFjayBvZiB0aGUgZ29vZCBjb3B5CiAgKiAgLSB0cmFjayBhbmQgcmVjb3JkIG1lZGlhIGVycm9ycywgdGhyb3cgb3V0IGJhZCBkZXZpY2VzCiAgKiAgLSBhZGQgYSBtb2RlIHRvIGFsc28gcmVhZCB1bmFsbG9jYXRlZCBzcGFjZQotICogIC0gbWFrZSB0aGUgcHJlZmV0Y2ggY2FuY2VsbGFibGUKICAqLwogCiBzdHJ1Y3Qgc2NydWJfYmlvOwpAQCAtNjMsNyArNjQsNyBAQAogc3RydWN0IHNjcnViX3BhZ2UgewogCXU2NAkJCWZsYWdzOyAgLyogZXh0ZW50IGZsYWdzICovCiAJdTY0CQkJZ2VuZXJhdGlvbjsKLQl1NjQJCQltaXJyb3JfbnVtOworCWludAkJCW1pcnJvcl9udW07CiAJaW50CQkJaGF2ZV9jc3VtOwogCXU4CQkJY3N1bVtCVFJGU19DU1VNX1NJWkVdOwogfTsKQEAgLTg3LDYgKzg4LDcgQEAKIAlpbnQJCQlmaXJzdF9mcmVlOwogCWludAkJCWN1cnI7CiAJYXRvbWljX3QJCWluX2ZsaWdodDsKKwlhdG9taWNfdAkJZml4dXBfY250OwogCXNwaW5sb2NrX3QJCWxpc3RfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlsaXN0X3dhaXQ7CiAJdTE2CQkJY3N1bV9zaXplOwpAQCAtMTAwLDYgKzEwMiwyNyBAQAogCXNwaW5sb2NrX3QJCXN0YXRfbG9jazsKIH07CiAKK3N0cnVjdCBzY3J1Yl9maXh1cF9ub2RhdGFzdW0geworCXN0cnVjdCBzY3J1Yl9kZXYJKnNkZXY7CisJdTY0CQkJbG9naWNhbDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdAkqcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfd29yawl3b3JrOworCWludAkJCW1pcnJvcl9udW07Cit9OworCitzdHJ1Y3Qgc2NydWJfd2FybmluZyB7CisJc3RydWN0IGJ0cmZzX3BhdGgJKnBhdGg7CisJdTY0CQkJZXh0ZW50X2l0ZW1fc2l6ZTsKKwljaGFyCQkJKnNjcmF0Y2hfYnVmOworCWNoYXIJCQkqbXNnX2J1ZjsKKwljb25zdCBjaGFyCQkqZXJyc3RyOworCXNlY3Rvcl90CQlzZWN0b3I7CisJdTY0CQkJbG9naWNhbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlCSpkZXY7CisJaW50CQkJbXNnX2J1ZnNpemU7CisJaW50CQkJc2NyYXRjaF9idWZzaXplOworfTsKKwogc3RhdGljIHZvaWQgc2NydWJfZnJlZV9jc3VtcyhzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2KQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmc2Rldi0+Y3N1bV9saXN0KSkgewpAQCAtMTc1LDE0ICsxOTgsMTUgQEAKIAogCQlpZiAoaSAhPSBTQ1JVQl9CSU9TX1BFUl9ERVYtMSkKIAkJCXNkZXYtPmJpb3NbaV0tPm5leHRfZnJlZSA9IGkgKyAxOwotCQkgZWxzZQorCQllbHNlCiAJCQlzZGV2LT5iaW9zW2ldLT5uZXh0X2ZyZWUgPSAtMTsKIAl9CiAJc2Rldi0+Zmlyc3RfZnJlZSA9IDA7CiAJc2Rldi0+Y3VyciA9IC0xOwogCWF0b21pY19zZXQoJnNkZXYtPmluX2ZsaWdodCwgMCk7CisJYXRvbWljX3NldCgmc2Rldi0+Zml4dXBfY250LCAwKTsKIAlhdG9taWNfc2V0KCZzZGV2LT5jYW5jZWxfcmVxLCAwKTsKLQlzZGV2LT5jc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoJmZzX2luZm8tPnN1cGVyX2NvcHkpOworCXNkZXYtPmNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZShmc19pbmZvLT5zdXBlcl9jb3B5KTsKIAlJTklUX0xJU1RfSEVBRCgmc2Rldi0+Y3N1bV9saXN0KTsKIAogCXNwaW5fbG9ja19pbml0KCZzZGV2LT5saXN0X2xvY2spOwpAQCAtMTk1LDI0ICsyMTksMzYxIEBACiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKK3N0YXRpYyBpbnQgc2NydWJfcHJpbnRfd2FybmluZ19pbm9kZSh1NjQgaW51bSwgdTY0IG9mZnNldCwgdTY0IHJvb3QsIHZvaWQgKmN0eCkKK3sKKwl1NjQgaXNpemU7CisJdTMyIG5saW5rOworCWludCByZXQ7CisJaW50IGk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOworCXN0cnVjdCBzY3J1Yl93YXJuaW5nICpzd2FybiA9IGN0eDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHN3YXJuLT5kZXYtPmRldl9yb290LT5mc19pbmZvOworCXN0cnVjdCBpbm9kZV9mc19wYXRocyAqaXBhdGggPSBOVUxMOworCXN0cnVjdCBidHJmc19yb290ICpsb2NhbF9yb290OworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisKKwlyb290X2tleS5vYmplY3RpZCA9IHJvb3Q7CisJcm9vdF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CisJcm9vdF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlsb2NhbF9yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZnNfaW5mbywgJnJvb3Rfa2V5KTsKKwlpZiAoSVNfRVJSKGxvY2FsX3Jvb3QpKSB7CisJCXJldCA9IFBUUl9FUlIobG9jYWxfcm9vdCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGlub2RlX2l0ZW1faW5mbyhpbnVtLCAwLCBsb2NhbF9yb290LCBzd2Fybi0+cGF0aCk7CisJaWYgKHJldCkgeworCQlidHJmc19yZWxlYXNlX3BhdGgoc3dhcm4tPnBhdGgpOworCQlnb3RvIGVycjsKKwl9CisKKwllYiA9IHN3YXJuLT5wYXRoLT5ub2Rlc1swXTsKKwlpbm9kZV9pdGVtID0gYnRyZnNfaXRlbV9wdHIoZWIsIHN3YXJuLT5wYXRoLT5zbG90c1swXSwKKwkJCQkJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCWlzaXplID0gYnRyZnNfaW5vZGVfc2l6ZShlYiwgaW5vZGVfaXRlbSk7CisJbmxpbmsgPSBidHJmc19pbm9kZV9ubGluayhlYiwgaW5vZGVfaXRlbSk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHN3YXJuLT5wYXRoKTsKKworCWlwYXRoID0gaW5pdF9pcGF0aCg0MDk2LCBsb2NhbF9yb290LCBzd2Fybi0+cGF0aCk7CisJcmV0ID0gcGF0aHNfZnJvbV9pbm9kZShpbnVtLCBpcGF0aCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwkvKgorCSAqIHdlIGRlbGliZXJhdGVseSBpZ25vcmUgdGhlIGJpdCBpcGF0aCBtaWdodCBoYXZlIGJlZW4gdG9vIHNtYWxsIHRvCisJICogaG9sZCBhbGwgb2YgdGhlIHBhdGhzIGhlcmUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXBhdGgtPmZzcGF0aC0+ZWxlbV9jbnQ7ICsraSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgorCQkJIiVzLCBzZWN0b3IgJWxsdSwgcm9vdCAlbGx1LCBpbm9kZSAlbGx1LCBvZmZzZXQgJWxsdSwgIgorCQkJImxlbmd0aCAlbGx1LCBsaW5rcyAldSAocGF0aDogJXMpXG4iLCBzd2Fybi0+ZXJyc3RyLAorCQkJc3dhcm4tPmxvZ2ljYWwsIHN3YXJuLT5kZXYtPm5hbWUsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXN3YXJuLT5zZWN0b3IsIHJvb3QsIGludW0sIG9mZnNldCwKKwkJCW1pbihpc2l6ZSAtIG9mZnNldCwgKHU2NClQQUdFX1NJWkUpLCBubGluaywKKwkJCShjaGFyICopaXBhdGgtPmZzcGF0aC0+dmFsW2ldKTsKKworCWZyZWVfaXBhdGgoaXBhdGgpOworCXJldHVybiAwOworCitlcnI6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6ICVzIGF0IGxvZ2ljYWwgJWxsdSBvbiBkZXYgIgorCQkiJXMsIHNlY3RvciAlbGx1LCByb290ICVsbHUsIGlub2RlICVsbHUsIG9mZnNldCAlbGx1OiBwYXRoICIKKwkJInJlc29sdmluZyBmYWlsZWQgd2l0aCByZXQ9JWRcbiIsIHN3YXJuLT5lcnJzdHIsCisJCXN3YXJuLT5sb2dpY2FsLCBzd2Fybi0+ZGV2LT5uYW1lLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXN3YXJuLT5zZWN0b3IsIHJvb3QsIGludW0sIG9mZnNldCwgcmV0KTsKKworCWZyZWVfaXBhdGgoaXBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY3J1Yl9wcmludF93YXJuaW5nKGNvbnN0IGNoYXIgKmVycnN0ciwgc3RydWN0IHNjcnViX2JpbyAqc2JpbywKKwkJCQlpbnQgaXgpCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2ID0gc2Jpby0+c2Rldi0+ZGV2OworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gZGV2LT5kZXZfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtICplaTsKKwlzdHJ1Y3Qgc2NydWJfd2FybmluZyBzd2FybjsKKwl1MzIgaXRlbV9zaXplOworCWludCByZXQ7CisJdTY0IHJlZl9yb290OworCXU4IHJlZl9sZXZlbDsKKwl1bnNpZ25lZCBsb25nIHB0ciA9IDA7CisJY29uc3QgaW50IGJ1ZnNpemUgPSA0MDk2OworCXU2NCBleHRlbnRfb2Zmc2V0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKworCXN3YXJuLnNjcmF0Y2hfYnVmID0ga21hbGxvYyhidWZzaXplLCBHRlBfTk9GUyk7CisJc3dhcm4ubXNnX2J1ZiA9IGttYWxsb2MoYnVmc2l6ZSwgR0ZQX05PRlMpOworCXN3YXJuLnNlY3RvciA9IChzYmlvLT5waHlzaWNhbCArIGl4ICogUEFHRV9TSVpFKSA+PiA5OworCXN3YXJuLmxvZ2ljYWwgPSBzYmlvLT5sb2dpY2FsICsgaXggKiBQQUdFX1NJWkU7CisJc3dhcm4uZXJyc3RyID0gZXJyc3RyOworCXN3YXJuLmRldiA9IGRldjsKKwlzd2Fybi5tc2dfYnVmc2l6ZSA9IGJ1ZnNpemU7CisJc3dhcm4uc2NyYXRjaF9idWZzaXplID0gYnVmc2l6ZTsKKworCWlmICghcGF0aCB8fCAhc3dhcm4uc2NyYXRjaF9idWYgfHwgIXN3YXJuLm1zZ19idWYpCisJCWdvdG8gb3V0OworCisJcmV0ID0gZXh0ZW50X2Zyb21fbG9naWNhbChmc19pbmZvLCBzd2Fybi5sb2dpY2FsLCBwYXRoLCAmZm91bmRfa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlleHRlbnRfb2Zmc2V0ID0gc3dhcm4ubG9naWNhbCAtIGZvdW5kX2tleS5vYmplY3RpZDsKKwlzd2Fybi5leHRlbnRfaXRlbV9zaXplID0gZm91bmRfa2V5Lm9mZnNldDsKKworCWViID0gcGF0aC0+bm9kZXNbMF07CisJZWkgPSBidHJmc19pdGVtX3B0cihlYiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJaXRlbV9zaXplID0gYnRyZnNfaXRlbV9zaXplX25yKGViLCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAocmV0ICYgQlRSRlNfRVhURU5UX0ZMQUdfVFJFRV9CTE9DSykgeworCQlkbyB7CisJCQlyZXQgPSB0cmVlX2JhY2tyZWZfZm9yX2V4dGVudCgmcHRyLCBlYiwgZWksIGl0ZW1fc2l6ZSwKKwkJCQkJCQkmcmVmX3Jvb3QsICZyZWZfbGV2ZWwpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgYXQgbG9naWNhbCAlbGx1IG9uIGRldiAlcywgIgorCQkJCSJzZWN0b3IgJWxsdTogbWV0YWRhdGEgJXMgKGxldmVsICVkKSBpbiB0cmVlICIKKwkJCQkiJWxsdVxuIiwgZXJyc3RyLCBzd2Fybi5sb2dpY2FsLCBkZXYtPm5hbWUsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzd2Fybi5zZWN0b3IsCisJCQkJcmVmX2xldmVsID8gIm5vZGUiIDogImxlYWYiLAorCQkJCXJldCA8IDAgPyAtMSA6IHJlZl9sZXZlbCwKKwkJCQlyZXQgPCAwID8gLTEgOiByZWZfcm9vdCk7CisJCX0gd2hpbGUgKHJldCAhPSAxKTsKKwl9IGVsc2UgeworCQlzd2Fybi5wYXRoID0gcGF0aDsKKwkJaXRlcmF0ZV9leHRlbnRfaW5vZGVzKGZzX2luZm8sIHBhdGgsIGZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQkJZXh0ZW50X29mZnNldCwKKwkJCQkJc2NydWJfcHJpbnRfd2FybmluZ19pbm9kZSwgJnN3YXJuKTsKKwl9CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJa2ZyZWUoc3dhcm4uc2NyYXRjaF9idWYpOworCWtmcmVlKHN3YXJuLm1zZ19idWYpOworfQorCitzdGF0aWMgaW50IHNjcnViX2ZpeHVwX3JlYWRwYWdlKHU2NCBpbnVtLCB1NjQgb2Zmc2V0LCB1NjQgcm9vdCwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVjdCBzY3J1Yl9maXh1cF9ub2RhdGFzdW0gKmZpeHVwID0gY3R4OworCWludCByZXQ7CisJaW50IGNvcnJlY3RlZCA9IDA7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJdTY0IGVuZCA9IG9mZnNldCArIFBBR0VfU0laRSAtIDE7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvY2FsX3Jvb3Q7CisKKwlrZXkub2JqZWN0aWQgPSByb290OworCWtleS50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlsb2NhbF9yb290ID0gYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoZml4dXAtPnJvb3QtPmZzX2luZm8sICZrZXkpOworCWlmIChJU19FUlIobG9jYWxfcm9vdCkpCisJCXJldHVybiBQVFJfRVJSKGxvY2FsX3Jvb3QpOworCisJa2V5LnR5cGUgPSBCVFJGU19JTk9ERV9JVEVNX0tFWTsKKwlrZXkub2JqZWN0aWQgPSBpbnVtOworCWtleS5vZmZzZXQgPSAwOworCWlub2RlID0gYnRyZnNfaWdldChmaXh1cC0+cm9vdC0+ZnNfaW5mby0+c2IsICZrZXksIGxvY2FsX3Jvb3QsIE5VTEwpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisKKwlpbmRleCA9IG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlpZiAoIXBhZ2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZTsKKwkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgeworCQkJLyoKKwkJCSAqIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGRlZmVjdCBzZWN0b3IuIHRoZQorCQkJICogZGF0YSB0aGF0IHdhcyBpbiB0aGF0IHNlY3RvciBpcyBub3QgaW4gbWVtb3J5LAorCQkJICogYmVjYXVzZSB0aGUgcGFnZSB3YXMgbW9kaWZpZWQuIHdlIG11c3Qgbm90IHdyaXRlIHRoZQorCQkJICogbW9kaWZpZWQgcGFnZSB0byB0aGF0IHNlY3Rvci4KKwkJCSAqCisJCQkgKiBUT0RPOiB3aGF0IGNvdWxkIGJlIGRvbmUgaGVyZTogd2FpdCBmb3IgdGhlIGRlbGFsbG9jCisJCQkgKiAgICAgICBydW5uZXIgdG8gd3JpdGUgb3V0IHRoYXQgcGFnZSAobWlnaHQgaW52b2x2ZQorCQkJICogICAgICAgQ09XKSBhbmQgc2VlIHdoZXRoZXIgdGhlIHNlY3RvciBpcyBzdGlsbAorCQkJICogICAgICAgcmVmZXJlbmNlZCBhZnRlcndhcmRzLgorCQkJICoKKwkJCSAqIEZvciB0aGUgbWVhbnRpbWUsIHdlJ2xsIHRyZWF0IHRoaXMgZXJyb3IKKwkJCSAqIGluY29ycmVjdGFibGUsIGFsdGhvdWdoIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgYQorCQkJICogbGF0ZXIgc2NydWIgd2lsbCBmaW5kIHRoZSBiYWQgc2VjdG9yIGFnYWluIGFuZCB0aGF0CisJCQkgKiB0aGVyZSdzIG5vIGRpcnR5IHBhZ2UgaW4gbWVtb3J5LCB0aGVuLgorCQkJICovCisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWFwX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZTsKKwkJcmV0ID0gcmVwYWlyX2lvX2ZhaWx1cmUobWFwX3RyZWUsIG9mZnNldCwgUEFHRV9TSVpFLAorCQkJCQlmaXh1cC0+bG9naWNhbCwgcGFnZSwKKwkJCQkJZml4dXAtPm1pcnJvcl9udW0pOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJY29ycmVjdGVkID0gIXJldDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBuZWVkIHRvIGdldCBnb29kIGRhdGEgZmlyc3QuIHRoZSBnZW5lcmFsIHJlYWRwYWdlIHBhdGgKKwkJICogd2lsbCBjYWxsIHJlcGFpcl9pb19mYWlsdXJlIGZvciB1cywgd2UganVzdCBoYXZlIHRvIG1ha2UKKwkJICogc3VyZSB3ZSByZWFkIHRoZSBiYWQgbWlycm9yLgorCQkgKi8KKwkJcmV0ID0gc2V0X2V4dGVudF9iaXRzKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgb2Zmc2V0LCBlbmQsCisJCQkJCUVYVEVOVF9EQU1BR0VELCBHRlBfTk9GUyk7CisJCWlmIChyZXQpIHsKKwkJCS8qIHNldF9leHRlbnRfYml0cyBzaG91bGQgZ2l2ZSBwcm9wZXIgZXJyb3IgKi8KKwkJCVdBUk5fT04ocmV0ID4gMCk7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBleHRlbnRfcmVhZF9mdWxsX3BhZ2UoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBwYWdlLAorCQkJCQkJYnRyZnNfZ2V0X2V4dGVudCwKKwkJCQkJCWZpeHVwLT5taXJyb3JfbnVtKTsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKworCQljb3JyZWN0ZWQgPSAhdGVzdF9yYW5nZV9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBvZmZzZXQsCisJCQkJCQllbmQsIEVYVEVOVF9EQU1BR0VELCAwLCBOVUxMKTsKKwkJaWYgKCFjb3JyZWN0ZWQpCisJCQljbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIG9mZnNldCwgZW5kLAorCQkJCQkJRVhURU5UX0RBTUFHRUQsIEdGUF9OT0ZTKTsKKwl9CisKK291dDoKKwlpZiAocGFnZSkKKwkJcHV0X3BhZ2UocGFnZSk7CisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJldCA9PSAwICYmIGNvcnJlY3RlZCkgeworCQkvKgorCQkgKiB3ZSBvbmx5IG5lZWQgdG8gY2FsbCByZWFkcGFnZSBmb3Igb25lIG9mIHRoZSBpbm9kZXMgYmVsb25naW5nCisJCSAqIHRvIHRoaXMgZXh0ZW50LiBzbyBtYWtlIGl0ZXJhdGVfZXh0ZW50X2lub2RlcyBzdG9wCisJCSAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgc2NydWJfZml4dXBfbm9kYXRhc3VtKHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCWludCByZXQ7CisJc3RydWN0IHNjcnViX2ZpeHVwX25vZGF0YXN1bSAqZml4dXA7CisJc3RydWN0IHNjcnViX2RldiAqc2RldjsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHVuY29ycmVjdGFibGUgPSAwOworCisJZml4dXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjcnViX2ZpeHVwX25vZGF0YXN1bSwgd29yayk7CisJc2RldiA9IGZpeHVwLT5zZGV2OworCWZzX2luZm8gPSBmaXh1cC0+cm9vdC0+ZnNfaW5mbzsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKSB7CisJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJKytzZGV2LT5zdGF0Lm1hbGxvY19lcnJvcnM7CisJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQl1bmNvcnJlY3RhYmxlID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKGZpeHVwLT5yb290KTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQl1bmNvcnJlY3RhYmxlID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiB0aGUgaWRlYSBpcyB0byB0cmlnZ2VyIGEgcmVndWxhciByZWFkIHRocm91Z2ggdGhlIHN0YW5kYXJkIHBhdGguIHdlCisJICogcmVhZCBhIHBhZ2UgZnJvbSB0aGUgKGZhaWxlZCkgbG9naWNhbCBhZGRyZXNzIGJ5IHNwZWNpZnlpbmcgdGhlCisJICogY29ycmVzcG9uZGluZyBjb3B5bnVtIG9mIHRoZSBmYWlsZWQgc2VjdG9yLiB0aHVzLCB0aGF0IHJlYWRwYWdlIGlzCisJICogZXhwZWN0ZWQgdG8gZmFpbC4KKwkgKiB0aGF0IGlzIHRoZSBwb2ludCB3aGVyZSBvbi10aGUtZmx5IGVycm9yIGNvcnJlY3Rpb24gd2lsbCBraWNrIGluCisJICogKG9uY2UgaXQncyBmaW5pc2hlZCkgYW5kIHJld3JpdGUgdGhlIGZhaWxlZCBzZWN0b3IgaWYgYSBnb29kIGNvcHkKKwkgKiBjYW4gYmUgZm91bmQuCisJICovCisJcmV0ID0gaXRlcmF0ZV9pbm9kZXNfZnJvbV9sb2dpY2FsKGZpeHVwLT5sb2dpY2FsLCBmaXh1cC0+cm9vdC0+ZnNfaW5mbywKKwkJCQkJCXBhdGgsIHNjcnViX2ZpeHVwX3JlYWRwYWdlLAorCQkJCQkJZml4dXApOworCWlmIChyZXQgPCAwKSB7CisJCXVuY29ycmVjdGFibGUgPSAxOworCQlnb3RvIG91dDsKKwl9CisJV0FSTl9PTihyZXQgIT0gMSk7CisKKwlzcGluX2xvY2soJnNkZXYtPnN0YXRfbG9jayk7CisJKytzZGV2LT5zdGF0LmNvcnJlY3RlZF9lcnJvcnM7CisJc3Bpbl91bmxvY2soJnNkZXYtPnN0YXRfbG9jayk7CisKK291dDoKKwlpZiAodHJhbnMgJiYgIUlTX0VSUih0cmFucykpCisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgZml4dXAtPnJvb3QpOworCWlmICh1bmNvcnJlY3RhYmxlKSB7CisJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJKytzZGV2LT5zdGF0LnVuY29ycmVjdGFibGVfZXJyb3JzOworCQlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGZpeHVwICIKKwkJCQkJIihub2RhdGFzdW0pIGVycm9yIGF0IGxvZ2ljYWwgJWxsdVxuIiwKKwkJCQkJZml4dXAtPmxvZ2ljYWwpOworCX0KKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlrZnJlZShmaXh1cCk7CisKKwkvKiBzZWUgY2FsbGVyIHdoeSB3ZSdyZSBwcmV0ZW5kaW5nIHRvIGJlIHBhdXNlZCBpbiB0aGUgc2NydWIgY291bnRlcnMgKi8KKwltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKKwlhdG9taWNfZGVjKCZmc19pbmZvLT5zY3J1YnNfcnVubmluZyk7CisJYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7CisJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKKwlhdG9taWNfZGVjKCZzZGV2LT5maXh1cF9jbnQpOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOworCXdha2VfdXAoJnNkZXYtPmxpc3Rfd2FpdCk7Cit9CisKIC8qCiAgKiBzY3J1Yl9yZWNoZWNrX2Vycm9yIGdldHMgY2FsbGVkIHdoZW4gZWl0aGVyIHZlcmlmaWNhdGlvbiBvZiB0aGUgcGFnZQogICogZmFpbGVkIG9yIHRoZSBiaW8gZmFpbGVkIHRvIHJlYWQsIGUuZy4gd2l0aCBFSU8uIEluIHRoZSBsYXR0ZXIgY2FzZSwKICAqIHJlY2hlY2tfZXJyb3IgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IHBhZ2UgaW4gdGhlIGJpbywgZXZlbiB0aG91Z2ggb25seQogICogb25lIG1heSBiZSBiYWQKICAqLwotc3RhdGljIHZvaWQgc2NydWJfcmVjaGVja19lcnJvcihzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvLCBpbnQgaXgpCitzdGF0aWMgaW50IHNjcnViX3JlY2hlY2tfZXJyb3Ioc3RydWN0IHNjcnViX2JpbyAqc2JpbywgaW50IGl4KQogeworCXN0cnVjdCBzY3J1Yl9kZXYgKnNkZXYgPSBzYmlvLT5zZGV2OworCXU2NCBzZWN0b3IgPSAoc2Jpby0+cGh5c2ljYWwgKyBpeCAqIFBBR0VfU0laRSkgPj4gOTsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShfcnMsIERFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAorCQkJCQlERUZBVUxUX1JBVEVMSU1JVF9CVVJTVCk7CisKIAlpZiAoc2Jpby0+ZXJyKSB7Ci0JCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBzYmlvLT5zZGV2LT5kZXYtPmJkZXYsCi0JCQkJICAgKHNiaW8tPnBoeXNpY2FsICsgaXggKiBQQUdFX1NJWkUpID4+IDksCisJCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBzYmlvLT5zZGV2LT5kZXYtPmJkZXYsIHNlY3RvciwKIAkJCQkgICBzYmlvLT5iaW8tPmJpX2lvX3ZlY1tpeF0uYnZfcGFnZSkgPT0gMCkgewogCQkJaWYgKHNjcnViX2ZpeHVwX2NoZWNrKHNiaW8sIGl4KSA9PSAwKQotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gMDsKIAkJfQorCQlpZiAoX19yYXRlbGltaXQoJl9ycykpCisJCQlzY3J1Yl9wcmludF93YXJuaW5nKCJpL28gZXJyb3IiLCBzYmlvLCBpeCk7CisJfSBlbHNlIHsKKwkJaWYgKF9fcmF0ZWxpbWl0KCZfcnMpKQorCQkJc2NydWJfcHJpbnRfd2FybmluZygiY2hlY2tzdW0gZXJyb3IiLCBzYmlvLCBpeCk7CiAJfQogCisJc3Bpbl9sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCSsrc2Rldi0+c3RhdC5yZWFkX2Vycm9yczsKKwlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwogCXNjcnViX2ZpeHVwKHNiaW8sIGl4KTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBzY3J1Yl9maXh1cF9jaGVjayhzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvLCBpbnQgaXgpCkBAIC0yNTAsNyArNjExLDggQEAKIAlzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2ID0gc2Jpby0+c2RldjsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHNkZXYtPmRldi0+ZGV2X3Jvb3QtPmZzX2luZm87CiAJc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUgPSAmZnNfaW5mby0+bWFwcGluZ190cmVlOwotCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfYmlvICpiYmlvID0gTlVMTDsKKwlzdHJ1Y3Qgc2NydWJfZml4dXBfbm9kYXRhc3VtICpmaXh1cDsKIAl1NjQgbG9naWNhbCA9IHNiaW8tPmxvZ2ljYWwgKyBpeCAqIFBBR0VfU0laRTsKIAl1NjQgbGVuZ3RoOwogCWludCBpOwpAQCAtMjU5LDM4ICs2MjEsNTcgQEAKIAogCWlmICgoc2Jpby0+c3BhZ1tpeF0uZmxhZ3MgJiBCVFJGU19FWFRFTlRfRkxBR19EQVRBKSAmJgogCSAgICAoc2Jpby0+c3BhZ1tpeF0uaGF2ZV9jc3VtID09IDApKSB7CisJCWZpeHVwID0ga3phbGxvYyhzaXplb2YoKmZpeHVwKSwgR0ZQX05PRlMpOworCQlpZiAoIWZpeHVwKQorCQkJZ290byB1bmNvcnJlY3RhYmxlOworCQlmaXh1cC0+c2RldiA9IHNkZXY7CisJCWZpeHVwLT5sb2dpY2FsID0gbG9naWNhbDsKKwkJZml4dXAtPnJvb3QgPSBmc19pbmZvLT5leHRlbnRfcm9vdDsKKwkJZml4dXAtPm1pcnJvcl9udW0gPSBzYmlvLT5zcGFnW2l4XS5taXJyb3JfbnVtOwogCQkvKgotCQkgKiBub2RhdGFzdW0sIGRvbid0IHRyeSB0byBmaXggYW55dGhpbmcKLQkJICogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIsIG9wZW4gdGhlIGlub2RlIGFuZCB0cmlnZ2VyIGEKLQkJICogd3JpdGViYWNrCisJCSAqIGluY3JlbWVudCBzY3J1YnNfcnVubmluZyB0byBwcmV2ZW50IGNhbmNlbCByZXF1ZXN0cyBmcm9tCisJCSAqIGNvbXBsZXRpbmcgYXMgbG9uZyBhcyBhIGZpeHVwIHdvcmtlciBpcyBydW5uaW5nLiB3ZSBtdXN0IGFsc28KKwkJICogaW5jcmVtZW50IHNjcnVic19wYXVzZWQgdG8gcHJldmVudCBkZWFkbG9ja2luZyBvbiBwYXVzZQorCQkgKiByZXF1ZXN0cyB1c2VkIGZvciB0cmFuc2FjdGlvbnMgY29tbWl0cyAoYXMgdGhlIHdvcmtlciB1c2VzIGEKKwkJICogdHJhbnNhY3Rpb24gY29udGV4dCkuIGl0IGlzIHNhZmUgdG8gcmVnYXJkIHRoZSBmaXh1cCB3b3JrZXIKKwkJICogYXMgcGF1c2VkIGZvciBhbGwgbWF0dGVycyBwcmFjdGljYWwuIGVmZmVjdGl2ZWx5LCB3ZSBvbmx5CisJCSAqIGF2b2lkIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmcm9tIGNvbXBsZXRpbmcuCiAJCSAqLwotCQlnb3RvIHVuY29ycmVjdGFibGU7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCQlhdG9taWNfaW5jKCZmc19pbmZvLT5zY3J1YnNfcnVubmluZyk7CisJCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOworCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCQlhdG9taWNfaW5jKCZzZGV2LT5maXh1cF9jbnQpOworCQlmaXh1cC0+d29yay5mdW5jID0gc2NydWJfZml4dXBfbm9kYXRhc3VtOworCQlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICZmaXh1cC0+d29yayk7CisJCXJldHVybjsKIAl9CiAKIAlsZW5ndGggPSBQQUdFX1NJWkU7CiAJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBSRVFfV1JJVEUsIGxvZ2ljYWwsICZsZW5ndGgsCi0JCQkgICAgICAmbXVsdGksIDApOwotCWlmIChyZXQgfHwgIW11bHRpIHx8IGxlbmd0aCA8IFBBR0VfU0laRSkgeworCQkJICAgICAgJmJiaW8sIDApOworCWlmIChyZXQgfHwgIWJiaW8gfHwgbGVuZ3RoIDwgUEFHRV9TSVpFKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgInNjcnViX2ZpeHVwOiBidHJmc19tYXBfYmxvY2sgZmFpbGVkIHVzIGZvciAlbGx1XG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsKTsKIAkJV0FSTl9PTigxKTsKKwkJa2ZyZWUoYmJpbyk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobXVsdGktPm51bV9zdHJpcGVzID09IDEpCisJaWYgKGJiaW8tPm51bV9zdHJpcGVzID09IDEpCiAJCS8qIHRoZXJlIGFyZW4ndCBhbnkgcmVwbGljYXMgKi8KIAkJZ290byB1bmNvcnJlY3RhYmxlOwogCiAJLyoKIAkgKiBmaXJzdCBmaW5kIGEgZ29vZCBjb3B5CiAJICovCi0JZm9yIChpID0gMDsgaSA8IG11bHRpLT5udW1fc3RyaXBlczsgKytpKSB7Ci0JCWlmIChpID09IHNiaW8tPnNwYWdbaXhdLm1pcnJvcl9udW0pCisJZm9yIChpID0gMDsgaSA8IGJiaW8tPm51bV9zdHJpcGVzOyArK2kpIHsKKwkJaWYgKGkgKyAxID09IHNiaW8tPnNwYWdbaXhdLm1pcnJvcl9udW0pCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2NydWJfZml4dXBfaW8oUkVBRCwgbXVsdGktPnN0cmlwZXNbaV0uZGV2LT5iZGV2LAotCQkJCSAgIG11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID4+IDksCisJCWlmIChzY3J1Yl9maXh1cF9pbyhSRUFELCBiYmlvLT5zdHJpcGVzW2ldLmRldi0+YmRldiwKKwkJCQkgICBiYmlvLT5zdHJpcGVzW2ldLnBoeXNpY2FsID4+IDksCiAJCQkJICAgc2Jpby0+YmlvLT5iaV9pb192ZWNbaXhdLmJ2X3BhZ2UpKSB7CiAJCQkvKiBJL08tZXJyb3IsIHRoaXMgaXMgbm90IGEgZ29vZCBjb3B5ICovCiAJCQljb250aW51ZTsKQEAgLTI5OSw3ICs2ODAsNyBAQAogCQlpZiAoc2NydWJfZml4dXBfY2hlY2soc2JpbywgaXgpID09IDApCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gbXVsdGktPm51bV9zdHJpcGVzKQorCWlmIChpID09IGJiaW8tPm51bV9zdHJpcGVzKQogCQlnb3RvIHVuY29ycmVjdGFibGU7CiAKIAlpZiAoIXNkZXYtPnJlYWRvbmx5KSB7CkBAIC0zMTQsMjUgKzY5NSwyMyBAQAogCQl9CiAJfQogCi0Ja2ZyZWUobXVsdGkpOworCWtmcmVlKGJiaW8pOwogCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAkrK3NkZXYtPnN0YXQuY29ycmVjdGVkX2Vycm9yczsKIAlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IGZpeGVkIHVwIGF0ICVsbHVcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxvZ2ljYWwpOworCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiYnRyZnM6IGZpeGVkIHVwIGVycm9yIGF0IGxvZ2ljYWwgJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxvZ2ljYWwpOwogCXJldHVybjsKIAogdW5jb3JyZWN0YWJsZToKLQlrZnJlZShtdWx0aSk7CisJa2ZyZWUoYmJpbyk7CiAJc3Bpbl9sb2NrKCZzZGV2LT5zdGF0X2xvY2spOwogCSsrc2Rldi0+c3RhdC51bmNvcnJlY3RhYmxlX2Vycm9yczsKIAlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAotCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IHVuYWJsZSB0byBmaXh1cCBhdCAlbGx1XG4iLAotCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpbG9naWNhbCk7CisJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGZpeHVwIChyZWd1bGFyKSBlcnJvciBhdCAiCisJCQkJImxvZ2ljYWwgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsKTsKIH0KIAogc3RhdGljIGludCBzY3J1Yl9maXh1cF9pbyhpbnQgcncsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKQEAgLTM4Miw4ICs3NjEsMTQgQEAKIAlpbnQgcmV0OwogCiAJaWYgKHNiaW8tPmVycikgeworCQlyZXQgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgc2Jpby0+Y291bnQ7ICsraSkKLQkJCXNjcnViX3JlY2hlY2tfZXJyb3Ioc2JpbywgaSk7CisJCQlyZXQgfD0gc2NydWJfcmVjaGVja19lcnJvcihzYmlvLCBpKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKKwkJCSsrc2Rldi0+c3RhdC51bnZlcmlmaWVkX2Vycm9yczsKKwkJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQl9CiAKIAkJc2Jpby0+YmlvLT5iaV9mbGFncyAmPSB+KEJJT19QT09MX01BU0sgLSAxKTsKIAkJc2Jpby0+YmlvLT5iaV9mbGFncyB8PSAxIDw8IEJJT19VUFRPREFURTsKQEAgLTM5NiwxMCArNzgxLDYgQEAKIAkJCWJpLT5idl9vZmZzZXQgPSAwOwogCQkJYmktPmJ2X2xlbiA9IFBBR0VfU0laRTsKIAkJfQotCi0JCXNwaW5fbG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKLQkJKytzZGV2LT5zdGF0LnJlYWRfZXJyb3JzOwotCQlzcGluX3VubG9jaygmc2Rldi0+c3RhdF9sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBzYmlvLT5jb3VudDsgKytpKSB7CkBAIC00MjAsOCArODAxLDE0IEBACiAJCQlXQVJOX09OKDEpOwogCQl9CiAJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9VU0VSMCk7Ci0JCWlmIChyZXQpCi0JCQlzY3J1Yl9yZWNoZWNrX2Vycm9yKHNiaW8sIGkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBzY3J1Yl9yZWNoZWNrX2Vycm9yKHNiaW8sIGkpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlzcGluX2xvY2soJnNkZXYtPnN0YXRfbG9jayk7CisJCQkJKytzZGV2LT5zdGF0LnVudmVyaWZpZWRfZXJyb3JzOworCQkJCXNwaW5fdW5sb2NrKCZzZGV2LT5zdGF0X2xvY2spOworCQkJfQorCQl9CiAJfQogCiBvdXQ6CkBAIC01NTcsNTcgKzk0NCwyNyBAQAogc3RhdGljIGludCBzY3J1Yl9zdWJtaXQoc3RydWN0IHNjcnViX2RldiAqc2RldikKIHsKIAlzdHJ1Y3Qgc2NydWJfYmlvICpzYmlvOwotCXN0cnVjdCBiaW8gKmJpbzsKLQlpbnQgaTsKIAogCWlmIChzZGV2LT5jdXJyID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXNiaW8gPSBzZGV2LT5iaW9zW3NkZXYtPmN1cnJdOwotCi0JYmlvID0gYmlvX2FsbG9jKEdGUF9OT0ZTLCBzYmlvLT5jb3VudCk7Ci0JaWYgKCFiaW8pCi0JCWdvdG8gbm9tZW07Ci0KLQliaW8tPmJpX3ByaXZhdGUgPSBzYmlvOwotCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKLQliaW8tPmJpX2JkZXYgPSBzZGV2LT5kZXYtPmJkZXY7Ci0JYmlvLT5iaV9zZWN0b3IgPSBzYmlvLT5waHlzaWNhbCA+PiA5OwotCi0JZm9yIChpID0gMDsgaSA8IHNiaW8tPmNvdW50OyArK2kpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCWludCByZXQ7Ci0KLQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOwotCQlpZiAoIXBhZ2UpCi0JCQlnb3RvIG5vbWVtOwotCi0JCXJldCA9IGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7Ci0JCWlmICghcmV0KSB7Ci0JCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQkJCWdvdG8gbm9tZW07Ci0JCX0KLQl9Ci0KIAlzYmlvLT5lcnIgPSAwOwogCXNkZXYtPmN1cnIgPSAtMTsKIAlhdG9taWNfaW5jKCZzZGV2LT5pbl9mbGlnaHQpOwogCi0Jc3VibWl0X2JpbyhSRUFELCBiaW8pOworCXN1Ym1pdF9iaW8oUkVBRCwgc2Jpby0+YmlvKTsKIAogCXJldHVybiAwOwotCi1ub21lbToKLQlzY3J1Yl9mcmVlX2JpbyhiaW8pOwotCi0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgc2NydWJfcGFnZShzdHJ1Y3Qgc2NydWJfZGV2ICpzZGV2LCB1NjQgbG9naWNhbCwgdTY0IGxlbiwKLQkJICAgICAgdTY0IHBoeXNpY2FsLCB1NjQgZmxhZ3MsIHU2NCBnZW4sIHU2NCBtaXJyb3JfbnVtLAorCQkgICAgICB1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgaW50IG1pcnJvcl9udW0sCiAJCSAgICAgIHU4ICpjc3VtLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IHNjcnViX2JpbyAqc2JpbzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmV0OwogCiBhZ2FpbjoKIAkvKgpAQCAtNjI4LDEyICs5ODUsMjIgQEAKIAl9CiAJc2JpbyA9IHNkZXYtPmJpb3Nbc2Rldi0+Y3Vycl07CiAJaWYgKHNiaW8tPmNvdW50ID09IDApIHsKKwkJc3RydWN0IGJpbyAqYmlvOworCiAJCXNiaW8tPnBoeXNpY2FsID0gcGh5c2ljYWw7CiAJCXNiaW8tPmxvZ2ljYWwgPSBsb2dpY2FsOworCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIFNDUlVCX1BBR0VTX1BFUl9CSU8pOworCQlpZiAoIWJpbykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWJpby0+YmlfcHJpdmF0ZSA9IHNiaW87CisJCWJpby0+YmlfZW5kX2lvID0gc2NydWJfYmlvX2VuZF9pbzsKKwkJYmlvLT5iaV9iZGV2ID0gc2Rldi0+ZGV2LT5iZGV2OworCQliaW8tPmJpX3NlY3RvciA9IHNiaW8tPnBoeXNpY2FsID4+IDk7CisJCXNiaW8tPmVyciA9IDA7CisJCXNiaW8tPmJpbyA9IGJpbzsKIAl9IGVsc2UgaWYgKHNiaW8tPnBoeXNpY2FsICsgc2Jpby0+Y291bnQgKiBQQUdFX1NJWkUgIT0gcGh5c2ljYWwgfHwKIAkJICAgc2Jpby0+bG9naWNhbCArIHNiaW8tPmNvdW50ICogUEFHRV9TSVpFICE9IGxvZ2ljYWwpIHsKLQkJaW50IHJldDsKLQogCQlyZXQgPSBzY3J1Yl9zdWJtaXQoc2Rldik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtNjQzLDYgKzEwMTAsMjAgQEAKIAlzYmlvLT5zcGFnW3NiaW8tPmNvdW50XS5nZW5lcmF0aW9uID0gZ2VuOwogCXNiaW8tPnNwYWdbc2Jpby0+Y291bnRdLmhhdmVfY3N1bSA9IDA7CiAJc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0ubWlycm9yX251bSA9IG1pcnJvcl9udW07CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9GUyk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGJpb19hZGRfcGFnZShzYmlvLT5iaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7CisJaWYgKCFyZXQpIHsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldCA9IHNjcnViX3N1Ym1pdChzZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWdvdG8gYWdhaW47CisJfQorCiAJaWYgKGNzdW0pIHsKIAkJc2Jpby0+c3BhZ1tzYmlvLT5jb3VudF0uaGF2ZV9jc3VtID0gMTsKIAkJbWVtY3B5KHNiaW8tPnNwYWdbc2Jpby0+Y291bnRdLmNzdW0sIGNzdW0sIHNkZXYtPmNzdW1fc2l6ZSk7CkBAIC03MDEsNyArMTA4Miw3IEBACiAKIC8qIHNjcnViIGV4dGVudCB0cmllcyB0byBjb2xsZWN0IHVwIHRvIDY0IGtCIGZvciBlYWNoIGJpbyAqLwogc3RhdGljIGludCBzY3J1Yl9leHRlbnQoc3RydWN0IHNjcnViX2RldiAqc2RldiwgdTY0IGxvZ2ljYWwsIHU2NCBsZW4sCi0JCQl1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgdTY0IG1pcnJvcl9udW0pCisJCQl1NjQgcGh5c2ljYWwsIHU2NCBmbGFncywgdTY0IGdlbiwgaW50IG1pcnJvcl9udW0pCiB7CiAJaW50IHJldDsKIAl1OCBjc3VtW0JUUkZTX0NTVU1fU0laRV07CkBAIC03NDEsMTMgKzExMjIsMTYgQEAKIAlpbnQgc2xvdDsKIAlpbnQgaTsKIAl1NjQgbnN0cmlwZXM7Ci0JaW50IHN0YXJ0X3N0cmlwZTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAl1NjQgcGh5c2ljYWw7CiAJdTY0IGxvZ2ljYWw7CiAJdTY0IGdlbmVyYXRpb247Ci0JdTY0IG1pcnJvcl9udW07CisJaW50IG1pcnJvcl9udW07CisJc3RydWN0IHJlYWRhX2NvbnRyb2wgKnJlYWRhMTsKKwlzdHJ1Y3QgcmVhZGFfY29udHJvbCAqcmVhZGEyOworCXN0cnVjdCBidHJmc19rZXkga2V5X3N0YXJ0OworCXN0cnVjdCBidHJmc19rZXkga2V5X2VuZDsKIAogCXU2NCBpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW47CiAJdTY0IG9mZnNldDsKQEAgLTc1OCwxMDIgKzExNDIsODggQEAKIAlpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDApIHsKIAkJb2Zmc2V0ID0gbWFwLT5zdHJpcGVfbGVuICogbnVtOwogCQlpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW4gKiBtYXAtPm51bV9zdHJpcGVzOwotCQltaXJyb3JfbnVtID0gMDsKKwkJbWlycm9yX251bSA9IDE7CiAJfSBlbHNlIGlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApIHsKIAkJaW50IGZhY3RvciA9IG1hcC0+bnVtX3N0cmlwZXMgLyBtYXAtPnN1Yl9zdHJpcGVzOwogCQlvZmZzZXQgPSBtYXAtPnN0cmlwZV9sZW4gKiAobnVtIC8gbWFwLT5zdWJfc3RyaXBlcyk7CiAJCWluY3JlbWVudCA9IG1hcC0+c3RyaXBlX2xlbiAqIGZhY3RvcjsKLQkJbWlycm9yX251bSA9IG51bSAlIG1hcC0+c3ViX3N0cmlwZXM7CisJCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPnN1Yl9zdHJpcGVzICsgMTsKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxKSB7CiAJCWluY3JlbWVudCA9IG1hcC0+c3RyaXBlX2xlbjsKLQkJbWlycm9yX251bSA9IG51bSAlIG1hcC0+bnVtX3N0cmlwZXM7CisJCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPm51bV9zdHJpcGVzICsgMTsKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkgewogCQlpbmNyZW1lbnQgPSBtYXAtPnN0cmlwZV9sZW47Ci0JCW1pcnJvcl9udW0gPSBudW0gJSBtYXAtPm51bV9zdHJpcGVzOworCQltaXJyb3JfbnVtID0gbnVtICUgbWFwLT5udW1fc3RyaXBlcyArIDE7CiAJfSBlbHNlIHsKIAkJaW5jcmVtZW50ID0gbWFwLT5zdHJpcGVfbGVuOwotCQltaXJyb3JfbnVtID0gMDsKKwkJbWlycm9yX251bSA9IDE7CiAJfQogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKIAlpZiAoIXBhdGgpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGF0aC0+cmVhZGEgPSAyOwogCXBhdGgtPnNlYXJjaF9jb21taXRfcm9vdCA9IDE7CiAJcGF0aC0+c2tpcF9sb2NraW5nID0gMTsKIAogCS8qCi0JICogZmluZCBhbGwgZXh0ZW50cyBmb3IgZWFjaCBzdHJpcGUgYW5kIGp1c3QgcmVhZCB0aGVtIHRvIGdldAotCSAqIHRoZW0gaW50byB0aGUgcGFnZSBjYWNoZQotCSAqIEZJWE1FOiB3ZSBjYW4gZG8gYmV0dGVyLiBidWlsZCBhIG1vcmUgaW50ZWxsaWdlbnQgcHJlZmV0Y2hpbmcKKwkgKiB0cmlnZ2VyIHRoZSByZWFkYWhlYWQgZm9yIGV4dGVudCB0cmVlIGNzdW0gdHJlZSBhbmQgd2FpdCBmb3IKKwkgKiBjb21wbGV0aW9uLiBEdXJpbmcgcmVhZGFoZWFkLCB0aGUgc2NydWIgaXMgb2ZmaWNpYWxseSBwYXVzZWQKKwkgKiB0byBub3QgaG9sZCBvZmYgdHJhbnNhY3Rpb24gY29tbWl0cwogCSAqLwogCWxvZ2ljYWwgPSBiYXNlICsgb2Zmc2V0OwotCXBoeXNpY2FsID0gbWFwLT5zdHJpcGVzW251bV0ucGh5c2ljYWw7Ci0JcmV0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnN0cmlwZXM7ICsraSkgewotCQlrZXkub2JqZWN0aWQgPSBsb2dpY2FsOwotCQlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKLQkJa2V5Lm9mZnNldCA9ICh1NjQpMDsKIAotCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9ub3BsdWc7CisJd2FpdF9ldmVudChzZGV2LT5saXN0X3dhaXQsCisJCSAgIGF0b21pY19yZWFkKCZzZGV2LT5pbl9mbGlnaHQpID09IDApOworCWF0b21pY19pbmMoJmZzX2luZm8tPnNjcnVic19wYXVzZWQpOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOwogCi0JCS8qCi0JCSAqIHdlIG1pZ2h0IG1pc3MgaGFsZiBhbiBleHRlbnQgaGVyZSwgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIsCi0JCSAqIGFzIGl0J3Mgb25seSB0aGUgcHJlZmV0Y2gKLQkJICovCi0JCXdoaWxlICgxKSB7Ci0JCQlsID0gcGF0aC0+bm9kZXNbMF07Ci0JCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07Ci0JCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKSkgewotCQkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKLQkJCQlpZiAocmV0ID09IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dF9ub3BsdWc7CisJLyogRklYTUUgaXQgbWlnaHQgYmUgYmV0dGVyIHRvIHN0YXJ0IHJlYWRhaGVhZCBhdCBjb21taXQgcm9vdCAqLworCWtleV9zdGFydC5vYmplY3RpZCA9IGxvZ2ljYWw7CisJa2V5X3N0YXJ0LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJa2V5X3N0YXJ0Lm9mZnNldCA9ICh1NjQpMDsKKwlrZXlfZW5kLm9iamVjdGlkID0gYmFzZSArIG9mZnNldCArIG5zdHJpcGVzICogaW5jcmVtZW50OworCWtleV9lbmQudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKwlrZXlfZW5kLm9mZnNldCA9ICh1NjQpMDsKKwlyZWFkYTEgPSBidHJmc19yZWFkYV9hZGQocm9vdCwgJmtleV9zdGFydCwgJmtleV9lbmQpOwogCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgc2xvdCk7CisJa2V5X3N0YXJ0Lm9iamVjdGlkID0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQ7CisJa2V5X3N0YXJ0LnR5cGUgPSBCVFJGU19FWFRFTlRfQ1NVTV9LRVk7CisJa2V5X3N0YXJ0Lm9mZnNldCA9IGxvZ2ljYWw7CisJa2V5X2VuZC5vYmplY3RpZCA9IEJUUkZTX0VYVEVOVF9DU1VNX09CSkVDVElEOworCWtleV9lbmQudHlwZSA9IEJUUkZTX0VYVEVOVF9DU1VNX0tFWTsKKwlrZXlfZW5kLm9mZnNldCA9IGJhc2UgKyBvZmZzZXQgKyBuc3RyaXBlcyAqIGluY3JlbWVudDsKKwlyZWFkYTIgPSBidHJmc19yZWFkYV9hZGQoY3N1bV9yb290LCAma2V5X3N0YXJ0LCAma2V5X2VuZCk7CiAKLQkJCWlmIChrZXkub2JqZWN0aWQgPj0gbG9naWNhbCArIG1hcC0+c3RyaXBlX2xlbikKLQkJCQlicmVhazsKKwlpZiAoIUlTX0VSUihyZWFkYTEpKQorCQlidHJmc19yZWFkYV93YWl0KHJlYWRhMSk7CisJaWYgKCFJU19FUlIocmVhZGEyKSkKKwkJYnRyZnNfcmVhZGFfd2FpdChyZWFkYTIpOwogCi0JCQlwYXRoLT5zbG90c1swXSsrOwotCQl9Ci0JCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKLQkJbG9naWNhbCArPSBpbmNyZW1lbnQ7Ci0JCXBoeXNpY2FsICs9IG1hcC0+c3RyaXBlX2xlbjsKLQkJY29uZF9yZXNjaGVkKCk7CisJbXV0ZXhfbG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV9yZXEpKSB7CisJCW11dGV4X3VubG9jaygmZnNfaW5mby0+c2NydWJfbG9jayk7CisJCXdhaXRfZXZlbnQoZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCwKKwkJICAgYXRvbWljX3JlYWQoJmZzX2luZm8tPnNjcnViX3BhdXNlX3JlcSkgPT0gMCk7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwogCX0KKwlhdG9taWNfZGVjKCZmc19pbmZvLT5zY3J1YnNfcGF1c2VkKTsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOworCXdha2VfdXAoJmZzX2luZm8tPnNjcnViX3BhdXNlX3dhaXQpOwogCiAJLyoKIAkgKiBjb2xsZWN0IGFsbCBkYXRhIGNzdW1zIGZvciB0aGUgc3RyaXBlIHRvIGF2b2lkIHNlZWtpbmcgZHVyaW5nCiAJICogdGhlIHNjcnViLiBUaGlzIG1pZ2h0IGN1cnJlbnRseSAoY3JjMzIpIGVuZCB1cCB0byBiZSBhYm91dCAxTUIKIAkgKi8KLQlzdGFydF9zdHJpcGUgPSAwOwogCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKLWFnYWluOgotCWxvZ2ljYWwgPSBiYXNlICsgb2Zmc2V0ICsgc3RhcnRfc3RyaXBlICogaW5jcmVtZW50OwotCWZvciAoaSA9IHN0YXJ0X3N0cmlwZTsgaSA8IG5zdHJpcGVzOyArK2kpIHsKLQkJcmV0ID0gYnRyZnNfbG9va3VwX2NzdW1zX3JhbmdlKGNzdW1fcm9vdCwgbG9naWNhbCwKLQkJCQkJICAgICAgIGxvZ2ljYWwgKyBtYXAtPnN0cmlwZV9sZW4gLSAxLAotCQkJCQkgICAgICAgJnNkZXYtPmNzdW1fbGlzdCwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKIAotCQlsb2dpY2FsICs9IGluY3JlbWVudDsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQogCS8qCiAJICogbm93IGZpbmQgYWxsIGV4dGVudHMgZm9yIGVhY2ggc3RyaXBlIGFuZCBzY3J1YiB0aGVtCiAJICovCi0JbG9naWNhbCA9IGJhc2UgKyBvZmZzZXQgKyBzdGFydF9zdHJpcGUgKiBpbmNyZW1lbnQ7Ci0JcGh5c2ljYWwgPSBtYXAtPnN0cmlwZXNbbnVtXS5waHlzaWNhbCArIHN0YXJ0X3N0cmlwZSAqIG1hcC0+c3RyaXBlX2xlbjsKKwlsb2dpY2FsID0gYmFzZSArIG9mZnNldDsKKwlwaHlzaWNhbCA9IG1hcC0+c3RyaXBlc1tudW1dLnBoeXNpY2FsOwogCXJldCA9IDA7Ci0JZm9yIChpID0gc3RhcnRfc3RyaXBlOyBpIDwgbnN0cmlwZXM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBuc3RyaXBlczsgKytpKSB7CiAJCS8qCiAJCSAqIGNhbmNlbGVkPwogCQkgKi8KQEAgLTg4MiwxMSArMTI1MiwxNCBAQAogCQkJYXRvbWljX2RlYygmZnNfaW5mby0+c2NydWJzX3BhdXNlZCk7CiAJCQltdXRleF91bmxvY2soJmZzX2luZm8tPnNjcnViX2xvY2spOwogCQkJd2FrZV91cCgmZnNfaW5mby0+c2NydWJfcGF1c2Vfd2FpdCk7Ci0JCQlzY3J1Yl9mcmVlX2NzdW1zKHNkZXYpOwotCQkJc3RhcnRfc3RyaXBlID0gaTsKLQkJCWdvdG8gYWdhaW47CiAJCX0KIAorCQlyZXQgPSBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2UoY3N1bV9yb290LCBsb2dpY2FsLAorCQkJCQkgICAgICAgbG9naWNhbCArIG1hcC0+c3RyaXBlX2xlbiAtIDEsCisJCQkJCSAgICAgICAmc2Rldi0+Y3N1bV9saXN0LCAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCiAJCWtleS5vYmplY3RpZCA9IGxvZ2ljYWw7CiAJCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwogCQlrZXkub2Zmc2V0ID0gKHU2NCkwOwpAQCAtOTgyLDcgKzEzNTUsNiBAQAogCiBvdXQ6CiAJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKLW91dF9ub3BsdWc6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KQEAgLTEyNTMsMTAgKzE2MjUsMTEgQEAKIAkJcmV0ID0gc2NydWJfZW51bWVyYXRlX2NodW5rcyhzZGV2LCBzdGFydCwgZW5kKTsKIAogCXdhaXRfZXZlbnQoc2Rldi0+bGlzdF93YWl0LCBhdG9taWNfcmVhZCgmc2Rldi0+aW5fZmxpZ2h0KSA9PSAwKTsKLQogCWF0b21pY19kZWMoJmZzX2luZm8tPnNjcnVic19ydW5uaW5nKTsKIAl3YWtlX3VwKCZmc19pbmZvLT5zY3J1Yl9wYXVzZV93YWl0KTsKIAorCXdhaXRfZXZlbnQoc2Rldi0+bGlzdF93YWl0LCBhdG9taWNfcmVhZCgmc2Rldi0+Zml4dXBfY250KSA9PSAwKTsKKwogCWlmIChwcm9ncmVzcykKIAkJbWVtY3B5KHByb2dyZXNzLCAmc2Rldi0+c3RhdCwgc2l6ZW9mKCpwcm9ncmVzcykpOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdXBlci5jIGIvZnMvYnRyZnMvc3VwZXIuYwppbmRleCAxNTYzNGQ0Li44YmQ5ZDZkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zdXBlci5jCisrKyBiL2ZzL2J0cmZzL3N1cGVyLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGVhbmNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgImNvbXBhdC5oIgogI2luY2x1ZGUgImRlbGF5ZWQtaW5vZGUuaCIKICNpbmNsdWRlICJjdHJlZS5oIgpAQCAtNTgsNiArNTksNyBAQAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9idHJmcy5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYnRyZnNfc3VwZXJfb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJ0cmZzX2ZzX3R5cGU7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpidHJmc19kZWNvZGVfZXJyb3Ioc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIGludCBlcnJubywKIAkJCQkgICAgICBjaGFyIG5idWZbMTZdKQpAQCAtMTYyLDcgKzE2NCw3IEBACiAJT3B0X25vdHJlZWxvZywgT3B0X3JhdGlvLCBPcHRfZmx1c2hvbmNvbW1pdCwgT3B0X2Rpc2NhcmQsCiAJT3B0X3NwYWNlX2NhY2hlLCBPcHRfY2xlYXJfY2FjaGUsIE9wdF91c2VyX3N1YnZvbF9ybV9hbGxvd2VkLAogCU9wdF9lbm9zcGNfZGVidWcsIE9wdF9zdWJ2b2xyb290aWQsIE9wdF9kZWZyYWcsCi0JT3B0X2lub2RlX2NhY2hlLCBPcHRfZXJyLAorCU9wdF9pbm9kZV9jYWNoZSwgT3B0X25vX3NwYWNlX2NhY2hlLCBPcHRfcmVjb3ZlcnksIE9wdF9lcnIsCiB9OwogCiBzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CkBAIC0xOTUsNiArMTk3LDggQEAKIAl7T3B0X3N1YnZvbHJvb3RpZCwgInN1YnZvbHJvb3RpZD0lZCJ9LAogCXtPcHRfZGVmcmFnLCAiYXV0b2RlZnJhZyJ9LAogCXtPcHRfaW5vZGVfY2FjaGUsICJpbm9kZV9jYWNoZSJ9LAorCXtPcHRfbm9fc3BhY2VfY2FjaGUsICJub3NwYWNlX2NhY2hlIn0sCisJe09wdF9yZWNvdmVyeSwgInJlY292ZXJ5In0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtMjA2LDE0ICsyMTAsMTkgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWNoYXIgKnAsICpudW0sICpvcmlnOworCWNoYXIgKnAsICpudW0sICpvcmlnID0gTlVMTDsKKwl1NjQgY2FjaGVfZ2VuOwogCWludCBpbnRhcmc7CiAJaW50IHJldCA9IDA7CiAJY2hhciAqY29tcHJlc3NfdHlwZTsKIAlib29sIGNvbXByZXNzX2ZvcmNlID0gZmFsc2U7CiAKKwljYWNoZV9nZW4gPSBidHJmc19zdXBlcl9jYWNoZV9nZW5lcmF0aW9uKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWlmIChjYWNoZV9nZW4pCisJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBTUEFDRV9DQUNIRSk7CisKIAlpZiAoIW9wdGlvbnMpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCS8qCiAJICogc3Ryc2VwIGNoYW5nZXMgdGhlIHN0cmluZywgZHVwbGljYXRlIGl0IGJlY2F1c2UgcGFyc2Vfb3B0aW9ucwpAQCAtMzYwLDkgKzM2OSwxMiBAQAogCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIERJU0NBUkQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3NwYWNlX2NhY2hlOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGRpc2sgc3BhY2UgY2FjaGluZ1xuIik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vX3NwYWNlX2NhY2hlOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGRpc2FibGluZyBkaXNrIHNwYWNlIGNhY2hpbmdcbiIpOworCQkJYnRyZnNfY2xlYXJfb3B0KGluZm8tPm1vdW50X29wdCwgU1BBQ0VfQ0FDSEUpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lub2RlX2NhY2hlOgogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGlub2RlIG1hcCBjYWNoaW5nXG4iKTsKIAkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBJTk9ERV9NQVBfQ0FDSEUpOwpAQCAtMzgxLDYgKzM5MywxMCBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGF1dG8gZGVmcmFnIik7CiAJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgQVVUT19ERUZSQUcpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X3JlY292ZXJ5OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGVuYWJsaW5nIGF1dG8gcmVjb3ZlcnkiKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBSRUNPVkVSWSk7CisJCQlicmVhazsKIAkJY2FzZSBPcHRfZXJyOgogCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHVucmVjb2duaXplZCBtb3VudCBvcHRpb24gIgogCQkJICAgICAgICInJXMnXG4iLCBwKTsKQEAgLTM5MSw2ICs0MDcsOCBAQAogCQl9CiAJfQogb3V0OgorCWlmICghcmV0ICYmIGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIFNQQUNFX0NBQ0hFKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGRpc2sgc3BhY2UgY2FjaGluZyBpcyBlbmFibGVkXG4iKTsKIAlrZnJlZShvcmlnKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDA2LDEyICs0MjQsMTIgQEAKIAkJdTY0ICpzdWJ2b2xfcm9vdGlkLCBzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqKmZzX2RldmljZXMpCiB7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWNoYXIgKm9wdHMsICpvcmlnLCAqcDsKKwljaGFyICpkZXZpY2VfbmFtZSwgKm9wdHMsICpvcmlnLCAqcDsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBpbnRhcmc7CiAKIAlpZiAoIW9wdGlvbnMpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAogCS8qCiAJICogc3Ryc2VwIGNoYW5nZXMgdGhlIHN0cmluZywgZHVwbGljYXRlIGl0IGJlY2F1c2UgcGFyc2Vfb3B0aW9ucwpAQCAtNDMwLDYgKzQ0OCw3IEBACiAJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9zdWJ2b2w6CisJCQlrZnJlZSgqc3Vidm9sX25hbWUpOwogCQkJKnN1YnZvbF9uYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zdWJ2b2xpZDoKQEAgLTQ1NywyOSArNDc2LDI0IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGV2aWNlOgotCQkJZXJyb3IgPSBidHJmc19zY2FuX29uZV9kZXZpY2UobWF0Y2hfc3RyZHVwKCZhcmdzWzBdKSwKKwkJCWRldmljZV9uYW1lID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCWlmICghZGV2aWNlX25hbWUpIHsKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQllcnJvciA9IGJ0cmZzX3NjYW5fb25lX2RldmljZShkZXZpY2VfbmFtZSwKIAkJCQkJZmxhZ3MsIGhvbGRlciwgZnNfZGV2aWNlcyk7CisJCQlrZnJlZShkZXZpY2VfbmFtZSk7CiAJCQlpZiAoZXJyb3IpCi0JCQkJZ290byBvdXRfZnJlZV9vcHRzOworCQkJCWdvdG8gb3V0OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCX0KIAotIG91dF9mcmVlX29wdHM6CitvdXQ6CiAJa2ZyZWUob3JpZyk7Ci0gb3V0OgotCS8qCi0JICogSWYgbm8gc3Vidm9sdW1lIG5hbWUgaXMgc3BlY2lmaWVkIHdlIHVzZSB0aGUgZGVmYXVsdCBvbmUuICBBbGxvY2F0ZQotCSAqIGEgY29weSBvZiB0aGUgc3RyaW5nICIuIiBoZXJlIHNvIHRoYXQgY29kZSBsYXRlciBpbiB0aGUKLQkgKiBtb3VudCBwYXRoIGRvZXNuJ3QgY2FyZSBpZiBpdCdzIHRoZSBkZWZhdWx0IHZvbHVtZSBvciBhbm90aGVyIG9uZS4KLQkgKi8KLQlpZiAoISpzdWJ2b2xfbmFtZSkgewotCQkqc3Vidm9sX25hbWUgPSBrc3RyZHVwKCIuIiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKnN1YnZvbF9uYW1lKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDkyLDcgKzUwNiw2IEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAl1NjQgZGlyX2lkOwogCWludCBuZXcgPSAwOwogCkBAIC01MTcsNyArNTMwLDcgQEAKIAkgKiB3aWxsIG1vdW50IGJ5IGRlZmF1bHQgaWYgd2UgaGF2ZW4ndCBiZWVuIGdpdmVuIGEgc3BlY2lmaWMgc3Vidm9sdW1lCiAJICogdG8gbW91bnQuCiAJICovCi0JZGlyX2lkID0gYnRyZnNfc3VwZXJfcm9vdF9kaXIoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWRpcl9pZCA9IGJ0cmZzX3N1cGVyX3Jvb3RfZGlyKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKE5VTEwsIHJvb3QsIHBhdGgsIGRpcl9pZCwgImRlZmF1bHQiLCA3LCAwKTsKIAlpZiAoSVNfRVJSKGRpKSkgewogCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CkBAIC01NjYsMjkgKzU3OSw3IEBACiAJCXJldHVybiBkZ2V0KHNiLT5zX3Jvb3QpOwogCX0KIAotCWlmIChuZXcpIHsKLQkJY29uc3Qgc3RydWN0IHFzdHIgbmFtZSA9IHsgLm5hbWUgPSAiLyIsIC5sZW4gPSAxIH07Ci0KLQkJLyoKLQkJICogTmV3IGlub2RlLCB3ZSBuZWVkIHRvIG1ha2UgdGhlIGRlbnRyeSBhIHNpYmxpbmcgb2Ygc19yb290IHNvCi0JCSAqIGV2ZXJ5dGhpbmcgZ2V0cyBjbGVhbmVkIHVwIHByb3Blcmx5IG9uIHVubW91bnQuCi0JCSAqLwotCQlkZW50cnkgPSBkX2FsbG9jKHNiLT5zX3Jvb3QsICZuYW1lKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCX0KLQkJZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogV2UgZm91bmQgdGhlIGlub2RlIGluIGNhY2hlLCBqdXN0IGZpbmQgYSBkZW50cnkgZm9yIGl0IGFuZAotCQkgKiBwdXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2UganVzdCBnb3QuCi0JCSAqLwotCQlkZW50cnkgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwotCQlpcHV0KGlub2RlKTsKLQl9Ci0KLQlyZXR1cm4gZGVudHJ5OworCXJldHVybiBkX29idGFpbl9hbGlhcyhpbm9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgYnRyZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtNzE5LDYgKzcxMCw4IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub2FjbCIpOwogCWlmIChidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpCiAJCXNlcV9wdXRzKHNlcSwgIixzcGFjZV9jYWNoZSIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vc3BhY2VfY2FjaGUiKTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgQ0xFQVJfQ0FDSEUpKQogCQlzZXFfcHV0cyhzZXEsICIsY2xlYXJfY2FjaGUiKTsKIAlpZiAoYnRyZnNfdGVzdF9vcHQocm9vdCwgVVNFUl9TVUJWT0xfUk1fQUxMT1dFRCkpCkBAIC03NTMsNiArNzQ2LDEzNyBAQAogCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKIH0KIAorLyoKKyAqIHN1YnZvbHVtZXMgYXJlIGlkZW50aWZpZWQgYnkgaW5vIDI1NgorICovCitzdGF0aWMgaW5saW5lIGludCBpc19zdWJ2b2x1bWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoaW5vZGUgJiYgaW5vZGUtPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyB3aWxsIHN0cmlwIG91dCB0aGUgc3Vidm9sPSVzIGFyZ3VtZW50IGZvciBhbiBhcmd1bWVudCBzdHJpbmcgYW5kIGFkZAorICogc3Vidm9saWQ9MCB0byBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBhY3R1YWwgdHJlZSByb290IGZvciBwYXRoIHdhbGtpbmcgdG8gdGhlCisgKiBzdWJ2b2wgd2Ugd2FudC4KKyAqLworc3RhdGljIGNoYXIgKnNldHVwX3Jvb3RfYXJncyhjaGFyICphcmdzKQoreworCXVuc2lnbmVkIGNvcGllZCA9IDA7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKGFyZ3MpICsgMjsKKwljaGFyICpwb3M7CisJY2hhciAqcmV0OworCisJLyoKKwkgKiBXZSBuZWVkIHRoZSBzYW1lIGFyZ3MgYXMgYmVmb3JlLCBidXQgbWludXMKKwkgKgorCSAqIHN1YnZvbD1hCisJICoKKwkgKiBhbmQgYWRkCisJICoKKwkgKiBzdWJ2b2xpZD0wCisJICoKKwkgKiB3aGljaCBpcyBhIGRpZmZlcmVuY2Ugb2YgMiBjaGFyYWN0ZXJzLCBzbyB3ZSBhbGxvY2F0ZSBzdHJsZW4oYXJncykgKworCSAqIDIgY2hhcmFjdGVycy4KKwkgKi8KKwlyZXQgPSBremFsbG9jKGxlbiAqIHNpemVvZihjaGFyKSwgR0ZQX05PRlMpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKwlwb3MgPSBzdHJzdHIoYXJncywgInN1YnZvbD0iKTsKKworCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uICovCisJaWYgKCFwb3MpIHsKKwkJa2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBUaGUgc3Vidm9sPTw+IGFyZyBpcyBub3QgYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcsIGNvcHkgZXZlcnlib2R5CisJICogdXAgdG8gdGhhdCBpbnRvIHJldC4KKwkgKi8KKwlpZiAocG9zICE9IGFyZ3MpIHsKKwkJKnBvcyA9ICdcMCc7CisJCXN0cmNweShyZXQsIGFyZ3MpOworCQljb3BpZWQgKz0gc3RybGVuKGFyZ3MpOworCQlwb3MrKzsKKwl9CisKKwlzdHJuY3B5KHJldCArIGNvcGllZCwgInN1YnZvbGlkPTAiLCBsZW4gLSBjb3BpZWQpOworCisJLyogTGVuZ3RoIG9mIHN1YnZvbGlkPTAgKi8KKwljb3BpZWQgKz0gMTA7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vICwgYWZ0ZXIgdGhlIHN1YnZvbD0gb3B0aW9uIHRoZW4gd2Uga25vdyB0aGVyZSdzIG5vCisJICogb3RoZXIgb3B0aW9ucyBhbmQgd2UgY2FuIGp1c3QgcmV0dXJuLgorCSAqLworCXBvcyA9IHN0cmNocihwb3MsICcsJyk7CisJaWYgKCFwb3MpCisJCXJldHVybiByZXQ7CisKKwkvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgaW50byBvdXIgYnVmZmVyICovCisJc3RybmNweShyZXQgKyBjb3BpZWQsIHBvcywgbGVuIC0gY29waWVkKTsKKwljb3BpZWQgKz0gc3RybGVuKHBvcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbW91bnRfc3Vidm9sKGNvbnN0IGNoYXIgKnN1YnZvbF9uYW1lLCBpbnQgZmxhZ3MsCisJCQkJICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zX3ByaXZhdGU7CisJY2hhciAqbmV3YXJnczsKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCWludCBlcnJvcjsKKworCW5ld2FyZ3MgPSBzZXR1cF9yb290X2FyZ3MoZGF0YSk7CisJaWYgKCFuZXdhcmdzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltbnQgPSB2ZnNfa2Vybl9tb3VudCgmYnRyZnNfZnNfdHlwZSwgZmxhZ3MsIGRldmljZV9uYW1lLAorCQkJICAgICBuZXdhcmdzKTsKKwlrZnJlZShuZXdhcmdzKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXJldHVybiBFUlJfQ0FTVChtbnQpOworCisJbnNfcHJpdmF0ZSA9IGNyZWF0ZV9tbnRfbnMobW50KTsKKwlpZiAoSVNfRVJSKG5zX3ByaXZhdGUpKSB7CisJCW1udHB1dChtbnQpOworCQlyZXR1cm4gRVJSX0NBU1QobnNfcHJpdmF0ZSk7CisJfQorCisJLyoKKwkgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYXV0b21vdW50IG9mIHRoZSBzdWJ2b2wgc28gd2UgY2FuIGp1c3QKKwkgKiBkcm9wIHRoZSBtbnQgd2UgaGF2ZSBoZXJlIGFuZCByZXR1cm4gdGhlIGRlbnRyeSB0aGF0IHdlCisJICogZm91bmQuCisJICovCisJZXJyb3IgPSB2ZnNfcGF0aF9sb29rdXAobW50LT5tbnRfcm9vdCwgbW50LCBzdWJ2b2xfbmFtZSwKKwkJCQlMT09LVVBfRk9MTE9XLCAmcGF0aCk7CisJcHV0X21udF9ucyhuc19wcml2YXRlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKworCWlmICghaXNfc3Vidm9sdW1lX2lub2RlKHBhdGguZGVudHJ5LT5kX2lub2RlKSkgeworCQlwYXRoX3B1dCgmcGF0aCk7CisJCW1udHB1dChtbnQpOworCQllcnJvciA9IC1FSU5WQUw7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6ICclcycgaXMgbm90IGEgdmFsaWQgc3Vidm9sdW1lXG4iLAorCQkJCXN1YnZvbF9uYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJLyogR2V0IGEgcmVmIHRvIHRoZSBzYiBhbmQgdGhlIGRlbnRyeSB3ZSBmb3VuZCBhbmQgcmV0dXJuIGl0ICovCisJcyA9IHBhdGgubW50LT5tbnRfc2I7CisJYXRvbWljX2luYygmcy0+c19hY3RpdmUpOworCXJvb3QgPSBkZ2V0KHBhdGguZGVudHJ5KTsKKwlwYXRoX3B1dCgmcGF0aCk7CisJZG93bl93cml0ZSgmcy0+c191bW91bnQpOworCisJcmV0dXJuIHJvb3Q7Cit9CiAKIC8qCiAgKiBGaW5kIGEgc3VwZXJibG9jayBmb3IgdGhlIGdpdmVuIGRldmljZSAvIG1vdW50IHBvaW50LgpAQCAtNzY3LDcgKzg5MSw2IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzOwogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSBOVUxMOwotCXN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QgPSBOVUxMOwogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gTlVMTDsKIAlmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEOwogCWNoYXIgKnN1YnZvbF9uYW1lID0gTlVMTDsKQEAgLTc4MSwyMSArOTA0LDIwIEBACiAJZXJyb3IgPSBidHJmc19wYXJzZV9lYXJseV9vcHRpb25zKGRhdGEsIG1vZGUsIGZzX3R5cGUsCiAJCQkJCSAgJnN1YnZvbF9uYW1lLCAmc3Vidm9sX29iamVjdGlkLAogCQkJCQkgICZzdWJ2b2xfcm9vdGlkLCAmZnNfZGV2aWNlcyk7Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlrZnJlZShzdWJ2b2xfbmFtZSk7CiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwlpZiAoc3Vidm9sX25hbWUpIHsKKwkJcm9vdCA9IG1vdW50X3N1YnZvbChzdWJ2b2xfbmFtZSwgZmxhZ3MsIGRldmljZV9uYW1lLCBkYXRhKTsKKwkJa2ZyZWUoc3Vidm9sX25hbWUpOworCQlyZXR1cm4gcm9vdDsKKwl9CiAKIAllcnJvciA9IGJ0cmZzX3NjYW5fb25lX2RldmljZShkZXZpY2VfbmFtZSwgbW9kZSwgZnNfdHlwZSwgJmZzX2RldmljZXMpOwogCWlmIChlcnJvcikKLQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCi0JZXJyb3IgPSBidHJmc19vcGVuX2RldmljZXMoZnNfZGV2aWNlcywgbW9kZSwgZnNfdHlwZSk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7Ci0KLQlpZiAoIShmbGFncyAmIE1TX1JET05MWSkgJiYgZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKSB7Ci0JCWVycm9yID0gLUVBQ0NFUzsKLQkJZ290byBlcnJvcl9jbG9zZV9kZXZpY2VzOwotCX0KKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCiAJLyoKIAkgKiBTZXR1cCBhIGR1bW15IHJvb3QgYW5kIGZzX2luZm8gZm9yIHRlc3Qvc2V0IHN1cGVyLiAgVGhpcyBpcyBiZWNhdXNlCkBAIC04MDQsMTkgKzkyNiw0MCBAQAogCSAqIHRoZW4gb3Blbl9jdHJlZSB3aWxsIHByb3Blcmx5IGluaXRpYWxpemUgZXZlcnl0aGluZyBsYXRlci4KIAkgKi8KIAlmc19pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX2ZzX2luZm8pLCBHRlBfTk9GUyk7Ci0JdHJlZV9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7Ci0JaWYgKCFmc19pbmZvIHx8ICF0cmVlX3Jvb3QpIHsKKwlpZiAoIWZzX2luZm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZnNfaW5mby0+dHJlZV9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLCBHRlBfTk9GUyk7CisJaWYgKCFmc19pbmZvLT50cmVlX3Jvb3QpIHsKIAkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZzX2luZm87CisJfQorCWZzX2luZm8tPnRyZWVfcm9vdC0+ZnNfaW5mbyA9IGZzX2luZm87CisJZnNfaW5mby0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7CisKKwlmc19pbmZvLT5zdXBlcl9jb3B5ID0ga3phbGxvYyhCVFJGU19TVVBFUl9JTkZPX1NJWkUsIEdGUF9OT0ZTKTsKKwlmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0ID0ga3phbGxvYyhCVFJGU19TVVBFUl9JTkZPX1NJWkUsIEdGUF9OT0ZTKTsKKwlpZiAoIWZzX2luZm8tPnN1cGVyX2NvcHkgfHwgIWZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZzX2luZm87CisJfQorCisJZXJyb3IgPSBidHJmc19vcGVuX2RldmljZXMoZnNfZGV2aWNlcywgbW9kZSwgZnNfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX2ZzX2luZm87CisKKwlpZiAoIShmbGFncyAmIE1TX1JET05MWSkgJiYgZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKSB7CisJCWVycm9yID0gLUVBQ0NFUzsKIAkJZ290byBlcnJvcl9jbG9zZV9kZXZpY2VzOwogCX0KLQlmc19pbmZvLT50cmVlX3Jvb3QgPSB0cmVlX3Jvb3Q7Ci0JZnNfaW5mby0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7Ci0JdHJlZV9yb290LT5mc19pbmZvID0gZnNfaW5mbzsKIAogCWJkZXYgPSBmc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKLQlzID0gc2dldChmc190eXBlLCBidHJmc190ZXN0X3N1cGVyLCBidHJmc19zZXRfc3VwZXIsIHRyZWVfcm9vdCk7Ci0JaWYgKElTX0VSUihzKSkKLQkJZ290byBlcnJvcl9zOworCXMgPSBzZ2V0KGZzX3R5cGUsIGJ0cmZzX3Rlc3Rfc3VwZXIsIGJ0cmZzX3NldF9zdXBlciwKKwkJIGZzX2luZm8tPnRyZWVfcm9vdCk7CisJaWYgKElTX0VSUihzKSkgeworCQllcnJvciA9IFBUUl9FUlIocyk7CisJCWdvdG8gZXJyb3JfY2xvc2VfZGV2aWNlczsKKwl9CiAKIAlpZiAocy0+c19yb290KSB7CiAJCWlmICgoZmxhZ3MgXiBzLT5zX2ZsYWdzKSAmIE1TX1JET05MWSkgewpAQCAtODI2LDc1ICs5NjksMzUgQEAKIAkJfQogCiAJCWJ0cmZzX2Nsb3NlX2RldmljZXMoZnNfZGV2aWNlcyk7Ci0JCWtmcmVlKGZzX2luZm8pOwotCQlrZnJlZSh0cmVlX3Jvb3QpOworCQlmcmVlX2ZzX2luZm8oZnNfaW5mbyk7CiAJfSBlbHNlIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJCXMtPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PU0VDOwogCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOworCQlidHJmc19zYihzKS0+ZnNfaW5mby0+YmRldl9ob2xkZXIgPSBmc190eXBlOwogCQllcnJvciA9IGJ0cmZzX2ZpbGxfc3VwZXIocywgZnNfZGV2aWNlcywgZGF0YSwKIAkJCQkJIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwogCQlpZiAoZXJyb3IpIHsKIAkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCQl9CiAKLQkJYnRyZnNfc2IocyktPmZzX2luZm8tPmJkZXZfaG9sZGVyID0gZnNfdHlwZTsKIAkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CiAJfQogCi0JLyogaWYgdGhleSBnYXZlIHVzIGEgc3Vidm9sdW1lIG5hbWUgYmluZCBtb3VudCBpbnRvIHRoYXQgKi8KLQlpZiAoc3RyY21wKHN1YnZvbF9uYW1lLCAiLiIpKSB7Ci0JCXN0cnVjdCBkZW50cnkgKm5ld19yb290OwotCi0JCXJvb3QgPSBnZXRfZGVmYXVsdF9yb290KHMsIHN1YnZvbF9yb290aWQpOwotCQlpZiAoSVNfRVJSKHJvb3QpKSB7Ci0JCQllcnJvciA9IFBUUl9FUlIocm9vdCk7Ci0JCQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQkJCWdvdG8gZXJyb3JfZnJlZV9zdWJ2b2xfbmFtZTsKLQkJfQotCi0JCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQluZXdfcm9vdCA9IGxvb2t1cF9vbmVfbGVuKHN1YnZvbF9uYW1lLCByb290LAotCQkJCSAgICAgIHN0cmxlbihzdWJ2b2xfbmFtZSkpOwotCQltdXRleF91bmxvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCi0JCWlmIChJU19FUlIobmV3X3Jvb3QpKSB7Ci0JCQlkcHV0KHJvb3QpOwotCQkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JCQllcnJvciA9IFBUUl9FUlIobmV3X3Jvb3QpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCQl9Ci0JCWlmICghbmV3X3Jvb3QtPmRfaW5vZGUpIHsKLQkJCWRwdXQocm9vdCk7Ci0JCQlkcHV0KG5ld19yb290KTsKLQkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZXJyb3IgPSAtRU5YSU87Ci0JCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7Ci0JCX0KLQkJZHB1dChyb290KTsKLQkJcm9vdCA9IG5ld19yb290OwotCX0gZWxzZSB7Ci0JCXJvb3QgPSBnZXRfZGVmYXVsdF9yb290KHMsIHN1YnZvbF9vYmplY3RpZCk7Ci0JCWlmIChJU19FUlIocm9vdCkpIHsKLQkJCWVycm9yID0gUFRSX0VSUihyb290KTsKLQkJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOwotCQl9CisJcm9vdCA9IGdldF9kZWZhdWx0X3Jvb3Qocywgc3Vidm9sX29iamVjdGlkKTsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CisJCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOworCQlyZXR1cm4gcm9vdDsKIAl9CiAKLQlrZnJlZShzdWJ2b2xfbmFtZSk7CiAJcmV0dXJuIHJvb3Q7CiAKLWVycm9yX3M6Ci0JZXJyb3IgPSBQVFJfRVJSKHMpOwogZXJyb3JfY2xvc2VfZGV2aWNlczoKIAlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2RldmljZXMpOwotCWtmcmVlKGZzX2luZm8pOwotCWtmcmVlKHRyZWVfcm9vdCk7Ci1lcnJvcl9mcmVlX3N1YnZvbF9uYW1lOgotCWtmcmVlKHN1YnZvbF9uYW1lKTsKK2Vycm9yX2ZzX2luZm86CisJZnJlZV9mc19pbmZvKGZzX2luZm8pOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIApAQCAtOTE5LDcgKzEwMjIsNyBAQAogCQlpZiAocm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+cndfZGV2aWNlcyA9PSAwKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJaWYgKGJ0cmZzX3N1cGVyX2xvZ19yb290KCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAhPSAwKQorCQlpZiAoYnRyZnNfc3VwZXJfbG9nX3Jvb3Qocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgIT0gMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXJldCA9IGJ0cmZzX2NsZWFudXBfZnNfcm9vdHMocm9vdC0+ZnNfaW5mbyk7CkBAIC0xMDg1LDcgKzExODgsNyBAQAogc3RhdGljIGludCBidHJmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfc2IoZGVudHJ5LT5kX3NiKTsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmcm9vdC0+ZnNfaW5mby0+c3BhY2VfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqZm91bmQ7CiAJdTY0IHRvdGFsX3VzZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKaW5kZXggZTI0Yjc5Ni4uNmEwNTc0ZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYworKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCkBAIC01NSw2ICs1NSw3IEBACiAJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjdXJfdHJhbnM7CiAKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOworbG9vcDoKIAlpZiAocm9vdC0+ZnNfaW5mby0+dHJhbnNfbm9fam9pbikgewogCQlpZiAoIW5vZmFpbCkgewogCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwpAQCAtNzUsMTYgKzc2LDE4IEBACiAJY3VyX3RyYW5zID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoIWN1cl90cmFucykKIAkJcmV0dXJuIC1FTk9NRU07CisKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWlmIChyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCS8qCisJCSAqIHNvbWVvbmUgc3RhcnRlZCBhIHRyYW5zYWN0aW9uIGFmdGVyIHdlIHVubG9ja2VkLiAgTWFrZSBzdXJlCisJCSAqIHRvIHJlZG8gdGhlIHRyYW5zX25vX2pvaW4gY2hlY2tzIGFib3ZlCisJCSAqLwogCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLCBjdXJfdHJhbnMpOwogCQljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwotCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7Ci0JCWF0b21pY19pbmMoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMpOwotCQljdXJfdHJhbnMtPm51bV9qb2luZWQrKzsKLQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwotCQlyZXR1cm4gMDsKKwkJZ290byBsb29wOwogCX0KKwogCWF0b21pY19zZXQoJmN1cl90cmFucy0+bnVtX3dyaXRlcnMsIDEpOwogCWN1cl90cmFucy0+bnVtX2pvaW5lZCA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCk7CkBAIC0yNzUsNyArMjc4LDcgQEAKIAkgKi8KIAlpZiAobnVtX2l0ZW1zID4gMCAmJiByb290ICE9IHJvb3QtPmZzX2luZm8tPmNodW5rX3Jvb3QpIHsKIAkJbnVtX2J5dGVzID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIG51bV9pdGVtcyk7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQoTlVMTCwgcm9vdCwKKwkJcmV0ID0gYnRyZnNfYmxvY2tfcnN2X2FkZChyb290LAogCQkJCQkgICZyb290LT5mc19pbmZvLT50cmFuc19ibG9ja19yc3YsCiAJCQkJCSAgbnVtX2J5dGVzKTsKIAkJaWYgKHJldCkKQEAgLTQxOCw4ICs0MjEsOCBAQAogCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7CiAJaW50IHJldDsKLQlyZXQgPSBidHJmc19ibG9ja19yc3ZfY2hlY2sodHJhbnMsIHJvb3QsCi0JCQkJICAgICZyb290LT5mc19pbmZvLT5nbG9iYWxfYmxvY2tfcnN2LCAwLCA1KTsKKworCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9jaGVjayhyb290LCAmcm9vdC0+ZnNfaW5mby0+Z2xvYmFsX2Jsb2NrX3JzdiwgNSk7CiAJcmV0dXJuIHJldCA/IDEgOiAwOwogfQogCkBAIC00MjcsMTcgKzQzMCwyNiBAQAogCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cl90cmFucyA9IHRyYW5zLT50cmFuc2FjdGlvbjsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpyc3YgPSB0cmFucy0+YmxvY2tfcnN2OwogCWludCB1cGRhdGVzOwogCiAJc21wX21iKCk7CiAJaWYgKGN1cl90cmFucy0+YmxvY2tlZCB8fCBjdXJfdHJhbnMtPmRlbGF5ZWRfcmVmcy5mbHVzaGluZykKIAkJcmV0dXJuIDE7CiAKKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyBpbiBjYXNlIHdlJ3JlIGRlbGV0aW5nIGNzdW1zIHNvIHRoZSBnbG9iYWwgYmxvY2sKKwkgKiByc3YgZ2V0J3MgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjc3VtIGJsb2NrIHJzdi4KKwkgKi8KKwl0cmFucy0+YmxvY2tfcnN2ID0gTlVMTDsKKwogCXVwZGF0ZXMgPSB0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlczsKIAl0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlcyA9IDA7CiAJaWYgKHVwZGF0ZXMpCiAJCWJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsIHVwZGF0ZXMpOwogCisJdHJhbnMtPmJsb2NrX3JzdiA9IHJzdjsKKwogCXJldHVybiBzaG91bGRfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIH0KIApAQCAtNDUzLDYgKzQ2NSw4IEBACiAJCXJldHVybiAwOwogCX0KIAorCWJ0cmZzX3RyYW5zX3JlbGVhc2VfbWV0YWRhdGEodHJhbnMsIHJvb3QpOworCXRyYW5zLT5ibG9ja19yc3YgPSBOVUxMOwogCXdoaWxlIChjb3VudCA8IDQpIHsKIAkJdW5zaWduZWQgbG9uZyBjdXIgPSB0cmFucy0+ZGVsYXllZF9yZWZfdXBkYXRlczsKIAkJdHJhbnMtPmRlbGF5ZWRfcmVmX3VwZGF0ZXMgPSAwOwpAQCAtNDczLDggKzQ4Nyw2IEBACiAJCWNvdW50Kys7CiAJfQogCi0JYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7Ci0KIAlpZiAobG9jayAmJiAhYXRvbWljX3JlYWQoJnJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpICYmCiAJICAgIHNob3VsZF9lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpKSB7CiAJCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDE7CkBAIC01NjIsNTAgKzU3NCwyMSBAQAogaW50IGJ0cmZzX3dyaXRlX21hcmtlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMsIGludCBtYXJrKQogewotCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAJaW50IHdlcnIgPSAwOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmc7CiAJdTY0IHN0YXJ0ID0gMDsKIAl1NjQgZW5kOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQl3aGlsZSAoMSkgewotCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCSAgICBtYXJrKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCQl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQotCQkJaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkJc3RhcnQgPSAodTY0KShpbmRleCArIDEpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQlwYWdlID0gZmluZF9nZXRfcGFnZShidHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7Ci0JCQlpZiAoIXBhZ2UpCi0JCQkJY29udGludWU7Ci0KLQkJCWJ0cmVlX2xvY2tfcGFnZV9ob29rKHBhZ2UpOwotCQkJaWYgKCFwYWdlLT5tYXBwaW5nKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgewotCQkJCWlmIChQYWdlRGlydHkocGFnZSkpCi0JCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDApOwotCQkJaWYgKGVycikKLQkJCQl3ZXJyID0gZXJyOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9CisJd2hpbGUgKCFmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCisJCQkJICAgICAgbWFyaykpIHsKKwkJY29udmVydF9leHRlbnRfYml0KGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVFRF9XQUlULCBtYXJrLAorCQkJCSAgIEdGUF9OT0ZTKTsKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCQlpZiAoZXJyKQorCQkJd2VyciA9IGVycjsKKwkJY29uZF9yZXNjaGVkKCk7CisJCXN0YXJ0ID0gZW5kICsgMTsKIAl9CiAJaWYgKGVycikKIAkJd2VyciA9IGVycjsKQEAgLTYyMSwzOSArNjA0LDIwIEBACiBpbnQgYnRyZnNfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCSAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZGlydHlfcGFnZXMsIGludCBtYXJrKQogewotCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAJaW50IHdlcnIgPSAwOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmc7CiAJdTY0IHN0YXJ0ID0gMDsKIAl1NjQgZW5kOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAKLQl3aGlsZSAoMSkgewotCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCi0JCQkJCSAgICBtYXJrKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCi0JCWNsZWFyX2V4dGVudF9iaXRzKGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBtYXJrLCBHRlBfTk9GUyk7Ci0JCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKLQkJCWluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCXN0YXJ0ID0gKHU2NCkoaW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoYnRyZWVfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOwotCQkJaWYgKCFwYWdlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgewotCQkJCWJ0cmVlX2xvY2tfcGFnZV9ob29rKHBhZ2UpOwotCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMCk7Ci0JCQkJaWYgKGVycikKLQkJCQkJd2VyciA9IGVycjsKLQkJCX0KLQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJfQorCXdoaWxlICghZmluZF9maXJzdF9leHRlbnRfYml0KGRpcnR5X3BhZ2VzLCBzdGFydCwgJnN0YXJ0LCAmZW5kLAorCQkJCSAgICAgIEVYVEVOVF9ORUVEX1dBSVQpKSB7CisJCWNsZWFyX2V4dGVudF9iaXRzKGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVFRF9XQUlULCBHRlBfTk9GUyk7CisJCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCQlpZiAoZXJyKQorCQkJd2VyciA9IGVycjsKKwkJY29uZF9yZXNjaGVkKCk7CisJCXN0YXJ0ID0gZW5kICsgMTsKIAl9CiAJaWYgKGVycikKIAkJd2VyciA9IGVycjsKQEAgLTY3Myw3ICs2MzcsMTIgQEAKIAogCXJldCA9IGJ0cmZzX3dyaXRlX21hcmtlZF9leHRlbnRzKHJvb3QsIGRpcnR5X3BhZ2VzLCBtYXJrKTsKIAlyZXQyID0gYnRyZnNfd2FpdF9tYXJrZWRfZXh0ZW50cyhyb290LCBkaXJ0eV9wYWdlcywgbWFyayk7Ci0JcmV0dXJuIHJldCB8fCByZXQyOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0MikKKwkJcmV0dXJuIHJldDI7CisJcmV0dXJuIDA7CiB9CiAKIGludCBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTkxMSwxMSArODgwLDEwIEBACiAJfQogCiAJYnRyZnNfcmVsb2NfcHJlX3NuYXBzaG90KHRyYW5zLCBwZW5kaW5nLCAmdG9fcmVzZXJ2ZSk7Ci0JYnRyZnNfb3JwaGFuX3ByZV9zbmFwc2hvdCh0cmFucywgcGVuZGluZywgJnRvX3Jlc2VydmUpOwogCiAJaWYgKHRvX3Jlc2VydmUgPiAwKSB7Ci0JCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGQodHJhbnMsIHJvb3QsICZwZW5kaW5nLT5ibG9ja19yc3YsCi0JCQkJCSAgdG9fcmVzZXJ2ZSk7CisJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGRfbm9mbHVzaChyb290LCAmcGVuZGluZy0+YmxvY2tfcnN2LAorCQkJCQkJICB0b19yZXNlcnZlKTsKIAkJaWYgKHJldCkgewogCQkJcGVuZGluZy0+ZXJyb3IgPSByZXQ7CiAJCQlnb3RvIGZhaWw7CkBAIC0xMDAyLDcgKzk3MCw2IEBACiAJQlVHX09OKElTX0VSUihwZW5kaW5nLT5zbmFwKSk7CiAKIAlidHJmc19yZWxvY19wb3N0X3NuYXBzaG90KHRyYW5zLCBwZW5kaW5nKTsKLQlidHJmc19vcnBoYW5fcG9zdF9zbmFwc2hvdCh0cmFucywgcGVuZGluZyk7CiBmYWlsOgogCWtmcmVlKG5ld19yb290X2l0ZW0pOwogCXRyYW5zLT5ibG9ja19yc3YgPSByc3Y7CkBAIC0xMDMyLDcgKzk5OSw3IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcm9vdF9pdGVtOwogCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXI7CiAKLQlzdXBlciA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN1cGVyID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAogCXJvb3RfaXRlbSA9ICZyb290LT5mc19pbmZvLT5jaHVua19yb290LT5yb290X2l0ZW07CiAJc3VwZXItPmNodW5rX3Jvb3QgPSByb290X2l0ZW0tPmJ5dGVucjsKQEAgLTEwNDMsNyArMTAxMCw3IEBACiAJc3VwZXItPnJvb3QgPSByb290X2l0ZW0tPmJ5dGVucjsKIAlzdXBlci0+Z2VuZXJhdGlvbiA9IHJvb3RfaXRlbS0+Z2VuZXJhdGlvbjsKIAlzdXBlci0+cm9vdF9sZXZlbCA9IHJvb3RfaXRlbS0+bGV2ZWw7Ci0JaWYgKHN1cGVyLT5jYWNoZV9nZW5lcmF0aW9uICE9IDAgfHwgYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpKQorCWlmIChidHJmc190ZXN0X29wdChyb290LCBTUEFDRV9DQUNIRSkpCiAJCXN1cGVyLT5jYWNoZV9nZW5lcmF0aW9uID0gcm9vdF9pdGVtLT5nZW5lcmF0aW9uOwogfQogCkBAIC0xMTY4LDE0ICsxMTM1LDE1IEBACiAKIAlidHJmc19ydW5fb3JkZXJlZF9vcGVyYXRpb25zKHJvb3QsIDApOwogCisJYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7CisJdHJhbnMtPmJsb2NrX3JzdiA9IE5VTEw7CisKIAkvKiBtYWtlIGEgcGFzcyB0aHJvdWdoIGFsbCB0aGUgZGVsYXllZCByZWZzIHdlIGhhdmUgc28gZmFyCiAJICogYW55IHJ1bm5pbmdzIHByb2NzIG1heSBhZGQgbW9yZSB3aGlsZSB3ZSBhcmUgaGVyZQogCSAqLwogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsIDApOwogCUJVR19PTihyZXQpOwogCi0JYnRyZnNfdHJhbnNfcmVsZWFzZV9tZXRhZGF0YSh0cmFucywgcm9vdCk7Ci0KIAljdXJfdHJhbnMgPSB0cmFucy0+dHJhbnNhY3Rpb247CiAJLyoKIAkgKiBzZXQgdGhlIGZsdXNoaW5nIGZsYWcgc28gcHJvY3MgaW4gdGhpcyB0cmFuc2FjdGlvbiBoYXZlIHRvCkBAIC0xMzQxLDEyICsxMzA5LDEyIEBACiAJdXBkYXRlX3N1cGVyX3Jvb3RzKHJvb3QpOwogCiAJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nKSB7Ci0JCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7Ci0JCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7CisJCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdChyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LCAwKTsKKwkJYnRyZnNfc2V0X3N1cGVyX2xvZ19yb290X2xldmVsKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksIDApOwogCX0KIAotCW1lbWNweSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwgJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCi0JICAgICAgIHNpemVvZihyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSk7CisJbWVtY3B5KHJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsIHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJICAgICAgIHNpemVvZigqcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkpOwogCiAJdHJhbnMtPnRyYW5zYWN0aW9uLT5ibG9ja2VkID0gMDsKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggNzg2NjM5Zi4uMzU2ODM3NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0yNzYsOCArMjc2LDkgQEAKIAkJCSAgICAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCB1NjQgZ2VuKQogewogCWlmICh3Yy0+cGluKQotCQlidHJmc19waW5fZXh0ZW50KGxvZy0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCi0JCQkJIGViLT5zdGFydCwgZWItPmxlbiwgMCk7CisJCWJ0cmZzX3Bpbl9leHRlbnRfZm9yX2xvZ19yZXBsYXkod2MtPnRyYW5zLAorCQkJCQkJbG9nLT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCQkJCWViLT5zdGFydCwgZWItPmxlbik7CiAKIAlpZiAoYnRyZnNfYnVmZmVyX3VwdG9kYXRlKGViLCBnZW4pKSB7CiAJCWlmICh3Yy0+d3JpdGUpCkBAIC0xMDMwLDcgKzEwMzEsNyBAQAogCX0KIAlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CiAJaWYgKG5saW5rICE9IGlub2RlLT5pX25saW5rKSB7Ci0JCWlub2RlLT5pX25saW5rID0gbmxpbms7CisJCXNldF9ubGluayhpbm9kZSwgbmxpbmspOwogCQlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAl9CiAJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9ICh1NjQpLTE7CkBAIC0xNzYwLDcgKzE3NjEsNyBAQAogCiAJCQkJV0FSTl9PTihyb290X293bmVyICE9CiAJCQkJCUJUUkZTX1RSRUVfTE9HX09CSkVDVElEKTsKLQkJCQlyZXQgPSBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChyb290LAorCQkJCXJldCA9IGJ0cmZzX2ZyZWVfYW5kX3Bpbl9yZXNlcnZlZF9leHRlbnQocm9vdCwKIAkJCQkJCQkgYnl0ZW5yLCBibG9ja3NpemUpOwogCQkJCUJVR19PTihyZXQpOwogCQkJfQpAQCAtMTgyOCw3ICsxODI5LDcgQEAKIAkJCQlidHJmc190cmVlX3VubG9jayhuZXh0KTsKIAogCQkJCVdBUk5fT04ocm9vdF9vd25lciAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7Ci0JCQkJcmV0ID0gYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQocm9vdCwKKwkJCQlyZXQgPSBidHJmc19mcmVlX2FuZF9waW5fcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCiAJCQkJCQlwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydCwKIAkJCQkJCXBhdGgtPm5vZGVzWypsZXZlbF0tPmxlbik7CiAJCQkJQlVHX09OKHJldCk7CkBAIC0xODk3LDcgKzE4OTgsNyBAQAogCiAJCQlXQVJOX09OKGxvZy0+cm9vdF9rZXkub2JqZWN0aWQgIT0KIAkJCQlCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7Ci0JCQlyZXQgPSBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChsb2csIG5leHQtPnN0YXJ0LAorCQkJcmV0ID0gYnRyZnNfZnJlZV9hbmRfcGluX3Jlc2VydmVkX2V4dGVudChsb2csIG5leHQtPnN0YXJ0LAogCQkJCQkJCSBuZXh0LT5sZW4pOwogCQkJQlVHX09OKHJldCk7CiAJCX0KQEAgLTIwMTMsMTAgKzIwMTQsMTAgQEAKIAkvKiB3YWl0IGZvciBwcmV2aW91cyB0cmVlIGxvZyBzeW5jIHRvIGNvbXBsZXRlICovCiAJaWYgKGF0b21pY19yZWFkKCZyb290LT5sb2dfY29tbWl0WyhpbmRleDEgKyAxKSAlIDJdKSkKIAkJd2FpdF9sb2dfY29tbWl0KHRyYW5zLCByb290LCByb290LT5sb2dfdHJhbnNpZCAtIDEpOwotCiAJd2hpbGUgKDEpIHsKIAkJdW5zaWduZWQgbG9uZyBiYXRjaCA9IHJvb3QtPmxvZ19iYXRjaDsKLQkJaWYgKHJvb3QtPmxvZ19tdWx0aXBsZV9waWRzKSB7CisJCS8qIHdoZW4gd2UncmUgb24gYW4gc3NkLCBqdXN0IGtpY2sgdGhlIGxvZyBjb21taXQgb3V0ICovCisJCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgU1NEKSAmJiByb290LT5sb2dfbXVsdGlwbGVfcGlkcykgewogCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJCQltdXRleF9sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwpAQCAtMjExNyw5ICsyMTE4LDkgQEAKIAlCVUdfT04ocmV0KTsKIAlidHJmc193YWl0X21hcmtlZF9leHRlbnRzKGxvZywgJmxvZy0+ZGlydHlfbG9nX3BhZ2VzLCBtYXJrKTsKIAotCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwKKwlidHJmc19zZXRfc3VwZXJfbG9nX3Jvb3Qocm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwKIAkJCQlsb2dfcm9vdF90cmVlLT5ub2RlLT5zdGFydCk7Ci0JYnRyZnNfc2V0X3N1cGVyX2xvZ19yb290X2xldmVsKCZyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LAorCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbChyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LAogCQkJCWJ0cmZzX2hlYWRlcl9sZXZlbChsb2dfcm9vdF90cmVlLT5ub2RlKSk7CiAKIAlsb2dfcm9vdF90cmVlLT5sb2dfYmF0Y2ggPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IGYyYTRjYzcuLmMzNzQzM2QgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTM2Niw2ICszNjYsMTQgQEAKIAkJfQogCQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5kZXZfYWxsb2NfbGlzdCk7CiAKKwkJLyogaW5pdCByZWFkYWhlYWQgc3RhdGUgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+cmVhZGFfbG9jayk7CisJCWRldmljZS0+cmVhZGFfY3Vycl96b25lID0gTlVMTDsKKwkJYXRvbWljX3NldCgmZGV2aWNlLT5yZWFkYV9pbl9mbGlnaHQsIDApOworCQlkZXZpY2UtPnJlYWRhX25leHQgPSAwOworCQlJTklUX1JBRElYX1RSRUUoJmRldmljZS0+cmVhZGFfem9uZXMsIEdGUF9OT0ZTICYgfl9fR0ZQX1dBSVQpOworCQlJTklUX1JBRElYX1RSRUUoJmRldmljZS0+cmVhZGFfZXh0ZW50cywgR0ZQX05PRlMgJiB+X19HRlBfV0FJVCk7CisKIAkJbXV0ZXhfbG9jaygmZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCQlsaXN0X2FkZF9yY3UoJmRldmljZS0+ZGV2X2xpc3QsICZmc19kZXZpY2VzLT5kZXZpY2VzKTsKIAkJbXV0ZXhfdW5sb2NrKCZmc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CkBAIC01OTcsMTAgKzYwNSw4IEBACiAJCXNldF9ibG9ja3NpemUoYmRldiwgNDA5Nik7CiAKIAkJYmggPSBidHJmc19yZWFkX2Rldl9zdXBlcihiZGV2KTsKLQkJaWYgKCFiaCkgewotCQkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKCFiaCkKIAkJCWdvdG8gZXJyb3JfY2xvc2U7Ci0JCX0KIAogCQlkaXNrX3N1cGVyID0gKHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CiAJCWRldmlkID0gYnRyZnNfc3RhY2tfZGV2aWNlX2lkKCZkaXNrX3N1cGVyLT5kZXZfaXRlbSk7CkBAIC02NTUsNyArNjYxLDcgQEAKIAkJY29udGludWU7CiAJfQogCWlmIChmc19kZXZpY2VzLT5vcGVuX2RldmljZXMgPT0gMCkgewotCQlyZXQgPSAtRUlPOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJZnNfZGV2aWNlcy0+c2VlZGluZyA9IHNlZWRpbmc7CkBAIC05OTMsNyArOTk5LDcgQEAKIAlrZXkub2JqZWN0aWQgPSBkZXZpY2UtPmRldmlkOwogCWtleS5vZmZzZXQgPSBzdGFydDsKIAlrZXkudHlwZSA9IEJUUkZTX0RFVl9FWFRFTlRfS0VZOwotCithZ2FpbjoKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOwogCWlmIChyZXQgPiAwKSB7CiAJCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwga2V5Lm9iamVjdGlkLApAQCAtMTAwNiw2ICsxMDEyLDkgQEAKIAkJCQkJc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQpOwogCQlCVUdfT04oZm91bmRfa2V5Lm9mZnNldCA+IHN0YXJ0IHx8IGZvdW5kX2tleS5vZmZzZXQgKwogCQkgICAgICAgYnRyZnNfZGV2X2V4dGVudF9sZW5ndGgobGVhZiwgZXh0ZW50KSA8IHN0YXJ0KTsKKwkJa2V5ID0gZm91bmRfa2V5OworCQlidHJmc19yZWxlYXNlX3BhdGgocGF0aCk7CisJCWdvdG8gYWdhaW47CiAJfSBlbHNlIGlmIChyZXQgPT0gMCkgewogCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CiAJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLApAQCAtMTAxMyw4ICsxMDIyLDEzIEBACiAJfQogCUJVR19PTihyZXQpOwogCi0JaWYgKGRldmljZS0+Ynl0ZXNfdXNlZCA+IDApCi0JCWRldmljZS0+Ynl0ZXNfdXNlZCAtPSBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsZWFmLCBleHRlbnQpOworCWlmIChkZXZpY2UtPmJ5dGVzX3VzZWQgPiAwKSB7CisJCXU2NCBsZW4gPSBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsZWFmLCBleHRlbnQpOworCQlkZXZpY2UtPmJ5dGVzX3VzZWQgLT0gbGVuOworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJCXJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfc3BhY2UgKz0gbGVuOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwl9CiAJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOwogCiBvdXQ6CkBAIC0xMzU2LDYgKzEzNzAsMTEgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3VuZG87CiAKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSA9IGRldmljZS0+dG90YWxfYnl0ZXMgLQorCQlkZXZpY2UtPmJ5dGVzX3VzZWQ7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlkZXZpY2UtPmluX2ZzX21ldGFkYXRhID0gMDsKIAlidHJmc19zY3J1Yl9jYW5jZWxfZGV2KHJvb3QsIGRldmljZSk7CiAKQEAgLTEzODcsOCArMTQwNiw4IEBACiAJY2FsbF9yY3UoJmRldmljZS0+cmN1LCBmcmVlX2RldmljZSk7CiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5kZXZpY2VfbGlzdF9tdXRleCk7CiAKLQludW1fZGV2aWNlcyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7Ci0JYnRyZnNfc2V0X3N1cGVyX251bV9kZXZpY2VzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LCBudW1fZGV2aWNlcyk7CisJbnVtX2RldmljZXMgPSBidHJmc19zdXBlcl9udW1fZGV2aWNlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KSAtIDE7CisJYnRyZnNfc2V0X3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksIG51bV9kZXZpY2VzKTsKIAogCWlmIChjdXJfZGV2aWNlcy0+b3Blbl9kZXZpY2VzID09IDApIHsKIAkJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXM7CkBAIC0xNDUwLDcgKzE0NjksNyBAQAogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlczsKIAlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqb2xkX2RldmljZXM7CiAJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKnNlZWRfZGV2aWNlczsKLQlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIgPSByb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OwogCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKIAl1NjQgc3VwZXJfZmxhZ3M7CiAKQEAgLTE2OTEsMTUgKzE3MTAsMTkgQEAKIAkJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bnVtX2Nhbl9kaXNjYXJkKys7CiAJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGV2aWNlLT50b3RhbF9ieXRlczsKIAorCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwlyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlICs9IGRldmljZS0+dG90YWxfYnl0ZXM7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlpZiAoIWJsa19xdWV1ZV9ub25yb3QoYmRldl9nZXRfcXVldWUoYmRldikpKQogCQlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yb3RhdGluZyA9IDE7CiAKLQl0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKLQlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJdG90YWxfYnl0ZXMgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKIAkJCQkgICAgdG90YWxfYnl0ZXMgKyBkZXZpY2UtPnRvdGFsX2J5dGVzKTsKIAotCXRvdGFsX2J5dGVzID0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwotCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwl0b3RhbF9ieXRlcyA9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcyhyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5LAogCQkJCSAgICB0b3RhbF9ieXRlcyArIDEpOwogCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCkBAIC0xNzkwLDcgKzE4MTMsNyBAQAogCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBuZXdfc2l6ZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2NvcHkgPQotCQkmZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwkJZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAl1NjQgb2xkX3RvdGFsID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSk7CiAJdTY0IGRpZmYgPSBuZXdfc2l6ZSAtIGRldmljZS0+dG90YWxfYnl0ZXM7CiAKQEAgLTE4NDksNyArMTg3Miw3IEBACiBzdGF0aWMgaW50IGJ0cmZzX2RlbF9zeXNfY2h1bmsoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBjaHVua19vYmplY3RpZCwgdTY0CiAJCQljaHVua19vZmZzZXQpCiB7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmRpc2tfa2V5OwogCXN0cnVjdCBidHJmc19jaHVuayAqY2h1bms7CiAJdTggKnB0cjsKQEAgLTIxNzUsNyArMjE5OCw3IEBACiAJYm9vbCByZXRyaWVkID0gZmFsc2U7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmw7CiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAl1NjQgb2xkX3RvdGFsID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSk7CiAJdTY0IG9sZF9zaXplID0gZGV2aWNlLT50b3RhbF9ieXRlczsKIAl1NjQgZGlmZiA9IGRldmljZS0+dG90YWxfYnl0ZXMgLSBuZXdfc2l6ZTsKQEAgLTIxOTIsOCArMjIxNSwxMiBAQAogCWxvY2tfY2h1bmtzKHJvb3QpOwogCiAJZGV2aWNlLT50b3RhbF9ieXRlcyA9IG5ld19zaXplOwotCWlmIChkZXZpY2UtPndyaXRlYWJsZSkKKwlpZiAoZGV2aWNlLT53cml0ZWFibGUpIHsKIAkJZGV2aWNlLT5mc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcyAtPSBkaWZmOworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJCXJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfc3BhY2UgLT0gZGlmZjsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisJfQogCXVubG9ja19jaHVua3Mocm9vdCk7CiAKIGFnYWluOgpAQCAtMjI1Nyw2ICsyMjg0LDkgQEAKIAkJZGV2aWNlLT50b3RhbF9ieXRlcyA9IG9sZF9zaXplOwogCQlpZiAoZGV2aWNlLT53cml0ZWFibGUpCiAJCQlkZXZpY2UtPmZzX2RldmljZXMtPnRvdGFsX3J3X2J5dGVzICs9IGRpZmY7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwkJcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19zcGFjZSArPSBkaWZmOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKIAkJdW5sb2NrX2NodW5rcyhyb290KTsKIAkJZ290byBkb25lOwogCX0KQEAgLTIyOTIsNyArMjMyMiw3IEBACiAJCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXksCiAJCQkgICBzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rLCBpbnQgaXRlbV9zaXplKQogewotCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weSA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXJfY29weSA9IHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CiAJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OwogCXUzMiBhcnJheV9zaXplOwogCXU4ICpwdHI7CkBAIC0yNjE1LDYgKzI2NDUsMTEgQEAKIAkJaW5kZXgrKzsKIAl9CiAKKwlzcGluX2xvY2soJmV4dGVudF9yb290LT5mc19pbmZvLT5mcmVlX2NodW5rX2xvY2spOworCWV4dGVudF9yb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlIC09IChzdHJpcGVfc2l6ZSAqCisJCQkJCQkgICBtYXAtPm51bV9zdHJpcGVzKTsKKwlzcGluX3VubG9jaygmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPmZyZWVfY2h1bmtfbG9jayk7CisKIAlpbmRleCA9IDA7CiAJc3RyaXBlID0gJmNodW5rLT5zdHJpcGU7CiAJd2hpbGUgKGluZGV4IDwgbWFwLT5udW1fc3RyaXBlcykgewpAQCAtMjg0OCw3ICsyODgzLDcgQEAKIAogc3RhdGljIGludCBfX2J0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAogCQkJICAgICB1NjQgbG9naWNhbCwgdTY0ICpsZW5ndGgsCi0JCQkgICAgIHN0cnVjdCBidHJmc19tdWx0aV9iaW8gKiptdWx0aV9yZXQsCisJCQkgICAgIHN0cnVjdCBidHJmc19iaW8gKipiYmlvX3JldCwKIAkJCSAgICAgaW50IG1pcnJvcl9udW0pCiB7CiAJc3RydWN0IGV4dGVudF9tYXAgKmVtOwpAQCAtMjg2NiwxOCArMjkwMSwxOCBAQAogCWludCBpOwogCWludCBudW1fc3RyaXBlczsKIAlpbnQgbWF4X2Vycm9ycyA9IDA7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBOVUxMOworCXN0cnVjdCBidHJmc19iaW8gKmJiaW8gPSBOVUxMOwogCi0JaWYgKG11bHRpX3JldCAmJiAhKHJ3ICYgKFJFUV9XUklURSB8IFJFUV9ESVNDQVJEKSkpCisJaWYgKGJiaW9fcmV0ICYmICEocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSkKIAkJc3RyaXBlc19hbGxvY2F0ZWQgPSAxOwogYWdhaW46Ci0JaWYgKG11bHRpX3JldCkgewotCQltdWx0aSA9IGt6YWxsb2MoYnRyZnNfbXVsdGlfYmlvX3NpemUoc3RyaXBlc19hbGxvY2F0ZWQpLAorCWlmIChiYmlvX3JldCkgeworCQliYmlvID0ga3phbGxvYyhidHJmc19iaW9fc2l6ZShzdHJpcGVzX2FsbG9jYXRlZCksCiAJCQkJR0ZQX05PRlMpOwotCQlpZiAoIW11bHRpKQorCQlpZiAoIWJiaW8pCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlhdG9taWNfc2V0KCZtdWx0aS0+ZXJyb3IsIDApOworCQlhdG9taWNfc2V0KCZiYmlvLT5lcnJvciwgMCk7CiAJfQogCiAJcmVhZF9sb2NrKCZlbV90cmVlLT5sb2NrKTsKQEAgLTI4OTgsNyArMjkzMyw3IEBACiAJaWYgKG1pcnJvcl9udW0gPiBtYXAtPm51bV9zdHJpcGVzKQogCQltaXJyb3JfbnVtID0gMDsKIAotCS8qIGlmIG91ciBtdWx0aSBiaW8gc3RydWN0IGlzIHRvbyBzbWFsbCwgYmFjayBvZmYgYW5kIHRyeSBhZ2FpbiAqLworCS8qIGlmIG91ciBidHJmc19iaW8gc3RydWN0IGlzIHRvbyBzbWFsbCwgYmFjayBvZmYgYW5kIHRyeSBhZ2FpbiAqLwogCWlmIChydyAmIFJFUV9XUklURSkgewogCQlpZiAobWFwLT50eXBlICYgKEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwKIAkJCQkgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSkgewpAQCAtMjkxNywxMSArMjk1MiwxMSBAQAogCQkJc3RyaXBlc19yZXF1aXJlZCA9IG1hcC0+bnVtX3N0cmlwZXM7CiAJCX0KIAl9Ci0JaWYgKG11bHRpX3JldCAmJiAocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSAmJgorCWlmIChiYmlvX3JldCAmJiAocncgJiAoUkVRX1dSSVRFIHwgUkVRX0RJU0NBUkQpKSAmJgogCSAgICBzdHJpcGVzX2FsbG9jYXRlZCA8IHN0cmlwZXNfcmVxdWlyZWQpIHsKIAkJc3RyaXBlc19hbGxvY2F0ZWQgPSBtYXAtPm51bV9zdHJpcGVzOwogCQlmcmVlX2V4dGVudF9tYXAoZW0pOwotCQlrZnJlZShtdWx0aSk7CisJCWtmcmVlKGJiaW8pOwogCQlnb3RvIGFnYWluOwogCX0KIAlzdHJpcGVfbnIgPSBvZmZzZXQ7CkBAIC0yOTUwLDcgKzI5ODUsNyBAQAogCQkqbGVuZ3RoID0gZW0tPmxlbiAtIG9mZnNldDsKIAl9CiAKLQlpZiAoIW11bHRpX3JldCkKKwlpZiAoIWJiaW9fcmV0KQogCQlnb3RvIG91dDsKIAogCW51bV9zdHJpcGVzID0gMTsKQEAgLTI5NzUsMTMgKzMwMTAsMTcgQEAKIAkJCXN0cmlwZV9pbmRleCA9IGZpbmRfbGl2ZV9taXJyb3IobWFwLCAwLAogCQkJCQkgICAgbWFwLT5udW1fc3RyaXBlcywKIAkJCQkJICAgIGN1cnJlbnQtPnBpZCAlIG1hcC0+bnVtX3N0cmlwZXMpOworCQkJbWlycm9yX251bSA9IHN0cmlwZV9pbmRleCArIDE7CiAJCX0KIAogCX0gZWxzZSBpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSB7Ci0JCWlmIChydyAmIChSRVFfV1JJVEUgfCBSRVFfRElTQ0FSRCkpCisJCWlmIChydyAmIChSRVFfV1JJVEUgfCBSRVFfRElTQ0FSRCkpIHsKIAkJCW51bV9zdHJpcGVzID0gbWFwLT5udW1fc3RyaXBlczsKLQkJZWxzZSBpZiAobWlycm9yX251bSkKKwkJfSBlbHNlIGlmIChtaXJyb3JfbnVtKSB7CiAJCQlzdHJpcGVfaW5kZXggPSBtaXJyb3JfbnVtIC0gMTsKKwkJfSBlbHNlIHsKKwkJCW1pcnJvcl9udW0gPSAxOworCQl9CiAKIAl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgewogCQlpbnQgZmFjdG9yID0gbWFwLT5udW1fc3RyaXBlcyAvIG1hcC0+c3ViX3N0cmlwZXM7CkBAIC0zMDAxLDYgKzMwNDAsNyBAQAogCQkJc3RyaXBlX2luZGV4ID0gZmluZF9saXZlX21pcnJvcihtYXAsIHN0cmlwZV9pbmRleCwKIAkJCQkJICAgICAgbWFwLT5zdWJfc3RyaXBlcywgc3RyaXBlX2luZGV4ICsKIAkJCQkJICAgICAgY3VycmVudC0+cGlkICUgbWFwLT5zdWJfc3RyaXBlcyk7CisJCQltaXJyb3JfbnVtID0gc3RyaXBlX2luZGV4ICsgMTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qCkBAIC0zMDA5LDE1ICszMDQ5LDE2IEBACiAJCSAqIHN0cmlwZV9pbmRleCBpcyB0aGUgbnVtYmVyIG9mIG91ciBkZXZpY2UgaW4gdGhlIHN0cmlwZSBhcnJheQogCQkgKi8KIAkJc3RyaXBlX2luZGV4ID0gZG9fZGl2KHN0cmlwZV9uciwgbWFwLT5udW1fc3RyaXBlcyk7CisJCW1pcnJvcl9udW0gPSBzdHJpcGVfaW5kZXggKyAxOwogCX0KIAlCVUdfT04oc3RyaXBlX2luZGV4ID49IG1hcC0+bnVtX3N0cmlwZXMpOwogCiAJaWYgKHJ3ICYgUkVRX0RJU0NBUkQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9zdHJpcGVzOyBpKyspIHsKLQkJCW11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID0KKwkJCWJiaW8tPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLnBoeXNpY2FsICsKIAkJCQlzdHJpcGVfb2Zmc2V0ICsgc3RyaXBlX25yICogbWFwLT5zdHJpcGVfbGVuOwotCQkJbXVsdGktPnN0cmlwZXNbaV0uZGV2ID0gbWFwLT5zdHJpcGVzW3N0cmlwZV9pbmRleF0uZGV2OworCQkJYmJpby0+c3RyaXBlc1tpXS5kZXYgPSBtYXAtPnN0cmlwZXNbc3RyaXBlX2luZGV4XS5kZXY7CiAKIAkJCWlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkgewogCQkJCXU2NCBzdHJpcGVzOwpAQCAtMzAzOCwxNiArMzA3OSwxNiBAQAogCQkJCX0KIAkJCQlzdHJpcGVzID0gc3RyaXBlX25yX2VuZCAtIDEgLSBqOwogCQkJCWRvX2RpdihzdHJpcGVzLCBtYXAtPm51bV9zdHJpcGVzKTsKLQkJCQltdWx0aS0+c3RyaXBlc1tpXS5sZW5ndGggPSBtYXAtPnN0cmlwZV9sZW4gKgorCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoID0gbWFwLT5zdHJpcGVfbGVuICoKIAkJCQkJKHN0cmlwZXMgLSBzdHJpcGVfbnIgKyAxKTsKIAogCQkJCWlmIChpID09IDApIHsKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfb2Zmc2V0OwogCQkJCQlzdHJpcGVfb2Zmc2V0ID0gMDsKIAkJCQl9CiAJCQkJaWYgKHN0cmlwZV9pbmRleCA9PSBsYXN0X3N0cmlwZSkKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfZW5kX29mZnNldDsKIAkJCX0gZWxzZSBpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKSB7CiAJCQkJdTY0IHN0cmlwZXM7CkBAIC0zMDcyLDExICszMTEzLDExIEBACiAJCQkJfQogCQkJCXN0cmlwZXMgPSBzdHJpcGVfbnJfZW5kIC0gMSAtIGo7CiAJCQkJZG9fZGl2KHN0cmlwZXMsIGZhY3Rvcik7Ci0JCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoID0gbWFwLT5zdHJpcGVfbGVuICoKKwkJCQliYmlvLT5zdHJpcGVzW2ldLmxlbmd0aCA9IG1hcC0+c3RyaXBlX2xlbiAqCiAJCQkJCShzdHJpcGVzIC0gc3RyaXBlX25yICsgMSk7CiAKIAkJCQlpZiAoaSA8IG1hcC0+c3ViX3N0cmlwZXMpIHsKLQkJCQkJbXVsdGktPnN0cmlwZXNbaV0ubGVuZ3RoIC09CisJCQkJCWJiaW8tPnN0cmlwZXNbaV0ubGVuZ3RoIC09CiAJCQkJCQlzdHJpcGVfb2Zmc2V0OwogCQkJCQlpZiAoaSA9PSBtYXAtPnN1Yl9zdHJpcGVzIC0gMSkKIAkJCQkJCXN0cmlwZV9vZmZzZXQgPSAwOwpAQCAtMzA4NCwxMSArMzEyNSwxMSBAQAogCQkJCWlmIChzdHJpcGVfaW5kZXggPj0gbGFzdF9zdHJpcGUgJiYKIAkJCQkgICAgc3RyaXBlX2luZGV4IDw9IChsYXN0X3N0cmlwZSArCiAJCQkJCQkgICAgIG1hcC0+c3ViX3N0cmlwZXMgLSAxKSkgewotCQkJCQltdWx0aS0+c3RyaXBlc1tpXS5sZW5ndGggLT0KKwkJCQkJYmJpby0+c3RyaXBlc1tpXS5sZW5ndGggLT0KIAkJCQkJCXN0cmlwZV9lbmRfb2Zmc2V0OwogCQkJCX0KIAkJCX0gZWxzZQotCQkJCW11bHRpLT5zdHJpcGVzW2ldLmxlbmd0aCA9ICpsZW5ndGg7CisJCQkJYmJpby0+c3RyaXBlc1tpXS5sZW5ndGggPSAqbGVuZ3RoOwogCiAJCQlzdHJpcGVfaW5kZXgrKzsKIAkJCWlmIChzdHJpcGVfaW5kZXggPT0gbWFwLT5udW1fc3RyaXBlcykgewpAQCAtMzA5OSwxOSArMzE0MCwyMCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9zdHJpcGVzOyBpKyspIHsKLQkJCW11bHRpLT5zdHJpcGVzW2ldLnBoeXNpY2FsID0KKwkJCWJiaW8tPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLnBoeXNpY2FsICsKIAkJCQlzdHJpcGVfb2Zmc2V0ICsKIAkJCQlzdHJpcGVfbnIgKiBtYXAtPnN0cmlwZV9sZW47Ci0JCQltdWx0aS0+c3RyaXBlc1tpXS5kZXYgPQorCQkJYmJpby0+c3RyaXBlc1tpXS5kZXYgPQogCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLmRldjsKIAkJCXN0cmlwZV9pbmRleCsrOwogCQl9CiAJfQotCWlmIChtdWx0aV9yZXQpIHsKLQkJKm11bHRpX3JldCA9IG11bHRpOwotCQltdWx0aS0+bnVtX3N0cmlwZXMgPSBudW1fc3RyaXBlczsKLQkJbXVsdGktPm1heF9lcnJvcnMgPSBtYXhfZXJyb3JzOworCWlmIChiYmlvX3JldCkgeworCQkqYmJpb19yZXQgPSBiYmlvOworCQliYmlvLT5udW1fc3RyaXBlcyA9IG51bV9zdHJpcGVzOworCQliYmlvLT5tYXhfZXJyb3JzID0gbWF4X2Vycm9yczsKKwkJYmJpby0+bWlycm9yX251bSA9IG1pcnJvcl9udW07CiAJfQogb3V0OgogCWZyZWVfZXh0ZW50X21hcChlbSk7CkBAIC0zMTIwLDkgKzMxNjIsOSBAQAogCiBpbnQgYnRyZnNfbWFwX2Jsb2NrKHN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlLCBpbnQgcncsCiAJCSAgICAgIHU2NCBsb2dpY2FsLCB1NjQgKmxlbmd0aCwKLQkJICAgICAgc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqKm11bHRpX3JldCwgaW50IG1pcnJvcl9udW0pCisJCSAgICAgIHN0cnVjdCBidHJmc19iaW8gKipiYmlvX3JldCwgaW50IG1pcnJvcl9udW0pCiB7Ci0JcmV0dXJuIF9fYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgbGVuZ3RoLCBtdWx0aV9yZXQsCisJcmV0dXJuIF9fYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgbGVuZ3RoLCBiYmlvX3JldCwKIAkJCQkgbWlycm9yX251bSk7CiB9CiAKQEAgLTMxOTEsMjggKzMyMzMsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZW5kX2Jpb19tdWx0aV9zdHJpcGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQorc3RhdGljIHZvaWQgYnRyZnNfZW5kX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7Ci0Jc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IGJ0cmZzX2JpbyAqYmJpbyA9IGJpby0+YmlfcHJpdmF0ZTsKIAlpbnQgaXNfb3JpZ19iaW8gPSAwOwogCiAJaWYgKGVycikKLQkJYXRvbWljX2luYygmbXVsdGktPmVycm9yKTsKKwkJYXRvbWljX2luYygmYmJpby0+ZXJyb3IpOwogCi0JaWYgKGJpbyA9PSBtdWx0aS0+b3JpZ19iaW8pCisJaWYgKGJpbyA9PSBiYmlvLT5vcmlnX2JpbykKIAkJaXNfb3JpZ19iaW8gPSAxOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm11bHRpLT5zdHJpcGVzX3BlbmRpbmcpKSB7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJiaW8tPnN0cmlwZXNfcGVuZGluZykpIHsKIAkJaWYgKCFpc19vcmlnX2JpbykgewogCQkJYmlvX3B1dChiaW8pOwotCQkJYmlvID0gbXVsdGktPm9yaWdfYmlvOworCQkJYmlvID0gYmJpby0+b3JpZ19iaW87CiAJCX0KLQkJYmlvLT5iaV9wcml2YXRlID0gbXVsdGktPnByaXZhdGU7Ci0JCWJpby0+YmlfZW5kX2lvID0gbXVsdGktPmVuZF9pbzsKKwkJYmlvLT5iaV9wcml2YXRlID0gYmJpby0+cHJpdmF0ZTsKKwkJYmlvLT5iaV9lbmRfaW8gPSBiYmlvLT5lbmRfaW87CisJCWJpby0+YmlfYmRldiA9IChzdHJ1Y3QgYmxvY2tfZGV2aWNlICopCisJCQkJCSh1bnNpZ25lZCBsb25nKWJiaW8tPm1pcnJvcl9udW07CiAJCS8qIG9ubHkgc2VuZCBhbiBlcnJvciB0byB0aGUgaGlnaGVyIGxheWVycyBpZiBpdCBpcwogCQkgKiBiZXlvbmQgdGhlIHRvbGVyYW5jZSBvZiB0aGUgbXVsdGktYmlvCiAJCSAqLwotCQlpZiAoYXRvbWljX3JlYWQoJm11bHRpLT5lcnJvcikgPiBtdWx0aS0+bWF4X2Vycm9ycykgeworCQlpZiAoYXRvbWljX3JlYWQoJmJiaW8tPmVycm9yKSA+IGJiaW8tPm1heF9lcnJvcnMpIHsKIAkJCWVyciA9IC1FSU87CiAJCX0gZWxzZSBpZiAoZXJyKSB7CiAJCQkvKgpAQCAtMzIyMiw3ICszMjY2LDcgQEAKIAkJCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CiAJCQllcnIgPSAwOwogCQl9Ci0JCWtmcmVlKG11bHRpKTsKKwkJa2ZyZWUoYmJpbyk7CiAKIAkJYmlvX2VuZGlvKGJpbywgZXJyKTsKIAl9IGVsc2UgaWYgKCFpc19vcmlnX2JpbykgewpAQCAtMzMwMiwyMCArMzM0NiwyMCBAQAogCXU2NCBsb2dpY2FsID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OwogCXU2NCBsZW5ndGggPSAwOwogCXU2NCBtYXBfbGVuZ3RoOwotCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpID0gTlVMTDsKIAlpbnQgcmV0OwogCWludCBkZXZfbnIgPSAwOwogCWludCB0b3RhbF9kZXZzID0gMTsKKwlzdHJ1Y3QgYnRyZnNfYmlvICpiYmlvID0gTlVMTDsKIAogCWxlbmd0aCA9IGJpby0+Ymlfc2l6ZTsKIAltYXBfdHJlZSA9ICZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWU7CiAJbWFwX2xlbmd0aCA9IGxlbmd0aDsKIAotCXJldCA9IGJ0cmZzX21hcF9ibG9jayhtYXBfdHJlZSwgcncsIGxvZ2ljYWwsICZtYXBfbGVuZ3RoLCAmbXVsdGksCisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBydywgbG9naWNhbCwgJm1hcF9sZW5ndGgsICZiYmlvLAogCQkJICAgICAgbWlycm9yX251bSk7CiAJQlVHX09OKHJldCk7CiAKLQl0b3RhbF9kZXZzID0gbXVsdGktPm51bV9zdHJpcGVzOworCXRvdGFsX2RldnMgPSBiYmlvLT5udW1fc3RyaXBlczsKIAlpZiAobWFwX2xlbmd0aCA8IGxlbmd0aCkgewogCQlwcmludGsoS0VSTl9DUklUICJtYXBwaW5nIGZhaWxlZCBsb2dpY2FsICVsbHUgYmlvIGxlbiAlbGx1ICIKIAkJICAgICAgICJsZW4gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsLApAQCAtMzMyMywyNSArMzM2NywyOCBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltYXBfbGVuZ3RoKTsKIAkJQlVHKCk7CiAJfQotCW11bHRpLT5lbmRfaW8gPSBmaXJzdF9iaW8tPmJpX2VuZF9pbzsKLQltdWx0aS0+cHJpdmF0ZSA9IGZpcnN0X2Jpby0+YmlfcHJpdmF0ZTsKLQltdWx0aS0+b3JpZ19iaW8gPSBmaXJzdF9iaW87Ci0JYXRvbWljX3NldCgmbXVsdGktPnN0cmlwZXNfcGVuZGluZywgbXVsdGktPm51bV9zdHJpcGVzKTsKKworCWJiaW8tPm9yaWdfYmlvID0gZmlyc3RfYmlvOworCWJiaW8tPnByaXZhdGUgPSBmaXJzdF9iaW8tPmJpX3ByaXZhdGU7CisJYmJpby0+ZW5kX2lvID0gZmlyc3RfYmlvLT5iaV9lbmRfaW87CisJYXRvbWljX3NldCgmYmJpby0+c3RyaXBlc19wZW5kaW5nLCBiYmlvLT5udW1fc3RyaXBlcyk7CiAKIAl3aGlsZSAoZGV2X25yIDwgdG90YWxfZGV2cykgewotCQlpZiAodG90YWxfZGV2cyA+IDEpIHsKLQkJCWlmIChkZXZfbnIgPCB0b3RhbF9kZXZzIC0gMSkgewotCQkJCWJpbyA9IGJpb19jbG9uZShmaXJzdF9iaW8sIEdGUF9OT0ZTKTsKLQkJCQlCVUdfT04oIWJpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWJpbyA9IGZpcnN0X2JpbzsKLQkJCX0KLQkJCWJpby0+YmlfcHJpdmF0ZSA9IG11bHRpOwotCQkJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX211bHRpX3N0cmlwZTsKKwkJaWYgKGRldl9uciA8IHRvdGFsX2RldnMgLSAxKSB7CisJCQliaW8gPSBiaW9fY2xvbmUoZmlyc3RfYmlvLCBHRlBfTk9GUyk7CisJCQlCVUdfT04oIWJpbyk7CisJCX0gZWxzZSB7CisJCQliaW8gPSBmaXJzdF9iaW87CiAJCX0KLQkJYmlvLT5iaV9zZWN0b3IgPSBtdWx0aS0+c3RyaXBlc1tkZXZfbnJdLnBoeXNpY2FsID4+IDk7Ci0JCWRldiA9IG11bHRpLT5zdHJpcGVzW2Rldl9ucl0uZGV2OworCQliaW8tPmJpX3ByaXZhdGUgPSBiYmlvOworCQliaW8tPmJpX2VuZF9pbyA9IGJ0cmZzX2VuZF9iaW87CisJCWJpby0+Ymlfc2VjdG9yID0gYmJpby0+c3RyaXBlc1tkZXZfbnJdLnBoeXNpY2FsID4+IDk7CisJCWRldiA9IGJiaW8tPnN0cmlwZXNbZGV2X25yXS5kZXY7CiAJCWlmIChkZXYgJiYgZGV2LT5iZGV2ICYmIChydyAhPSBXUklURSB8fCBkZXYtPndyaXRlYWJsZSkpIHsKKwkJCXByX2RlYnVnKCJidHJmc19tYXBfYmlvOiBydyAlZCwgc2Vjb3I9JWxsdSwgZGV2PSVsdSAiCisJCQkJICIoJXMgaWQgJWxsdSksIHNpemU9JXVcbiIsIHJ3LAorCQkJCSAodTY0KWJpby0+Ymlfc2VjdG9yLCAodV9sb25nKWRldi0+YmRldi0+YmRfZGV2LAorCQkJCSBkZXYtPm5hbWUsIGRldi0+ZGV2aWQsIGJpby0+Ymlfc2l6ZSk7CiAJCQliaW8tPmJpX2JkZXYgPSBkZXYtPmJkZXY7CiAJCQlpZiAoYXN5bmNfc3VibWl0KQogCQkJCXNjaGVkdWxlX2Jpbyhyb290LCBkZXYsIHJ3LCBiaW8pOwpAQCAtMzM1NCw4ICszNDAxLDYgQEAKIAkJfQogCQlkZXZfbnIrKzsKIAl9Ci0JaWYgKHRvdGFsX2RldnMgPT0gMSkKLQkJa2ZyZWUobXVsdGkpOwogCXJldHVybiAwOwogfQogCkBAIC0zNjE2LDE1ICszNjYxLDIwIEBACiAJZmlsbF9kZXZpY2VfZnJvbV9pdGVtKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UpOwogCWRldmljZS0+ZGV2X3Jvb3QgPSByb290LT5mc19pbmZvLT5kZXZfcm9vdDsKIAlkZXZpY2UtPmluX2ZzX21ldGFkYXRhID0gMTsKLQlpZiAoZGV2aWNlLT53cml0ZWFibGUpCisJaWYgKGRldmljZS0+d3JpdGVhYmxlKSB7CiAJCWRldmljZS0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGV2aWNlLT50b3RhbF9ieXRlczsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX2xvY2spOworCQlyb290LT5mc19pbmZvLT5mcmVlX2NodW5rX3NwYWNlICs9IGRldmljZS0+dG90YWxfYnl0ZXMgLQorCQkJZGV2aWNlLT5ieXRlc191c2VkOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZnJlZV9jaHVua19sb2NrKTsKKwl9CiAJcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgYnRyZnNfcmVhZF9zeXNfYXJyYXkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCiB7Ci0Jc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc2I7CiAJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICpkaXNrX2tleTsKIAlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5oIGIvZnMvYnRyZnMvdm9sdW1lcy5oCmluZGV4IDZkODY2ZGIuLmFiNWIxYzQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuaAorKysgYi9mcy9idHJmcy92b2x1bWVzLmgKQEAgLTkyLDYgKzkyLDE0IEBACiAJc3RydWN0IGJ0cmZzX3dvcmsgd29yazsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCXN0cnVjdCB3b3JrX3N0cnVjdCByY3Vfd29yazsKKworCS8qIHJlYWRhaGVhZCBzdGF0ZSAqLworCXNwaW5sb2NrX3QgcmVhZGFfbG9jazsKKwlhdG9taWNfdCByZWFkYV9pbl9mbGlnaHQ7CisJdTY0IHJlYWRhX25leHQ7CisJc3RydWN0IHJlYWRhX3pvbmUgKnJlYWRhX2N1cnJfem9uZTsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJlYWRhX3pvbmVzOworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgcmVhZGFfZXh0ZW50czsKIH07CiAKIHN0cnVjdCBidHJmc19mc19kZXZpY2VzIHsKQEAgLTEzNiw3ICsxNDQsMTAgQEAKIAl1NjQgbGVuZ3RoOyAvKiBvbmx5IHVzZWQgZm9yIGRpc2NhcmQgbWFwcGluZ3MgKi8KIH07CiAKLXN0cnVjdCBidHJmc19tdWx0aV9iaW8geworc3RydWN0IGJ0cmZzX2JpbzsKK3R5cGVkZWYgdm9pZCAoYnRyZnNfYmlvX2VuZF9pb190KSAoc3RydWN0IGJ0cmZzX2JpbyAqYmlvLCBpbnQgZXJyKTsKKworc3RydWN0IGJ0cmZzX2JpbyB7CiAJYXRvbWljX3Qgc3RyaXBlc19wZW5kaW5nOwogCWJpb19lbmRfaW9fdCAqZW5kX2lvOwogCXN0cnVjdCBiaW8gKm9yaWdfYmlvOwpAQCAtMTQ0LDYgKzE1NSw3IEBACiAJYXRvbWljX3QgZXJyb3I7CiAJaW50IG1heF9lcnJvcnM7CiAJaW50IG51bV9zdHJpcGVzOworCWludCBtaXJyb3JfbnVtOwogCXN0cnVjdCBidHJmc19iaW9fc3RyaXBlIHN0cmlwZXNbXTsKIH07CiAKQEAgLTE3MSw3ICsxODMsNyBAQAogaW50IGJ0cmZzX2FjY291bnRfZGV2X2V4dGVudHNfc2l6ZShzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBzdGFydCwKIAkJCQkgICB1NjQgZW5kLCB1NjQgKmxlbmd0aCk7CiAKLSNkZWZpbmUgYnRyZnNfbXVsdGlfYmlvX3NpemUobikgKHNpemVvZihzdHJ1Y3QgYnRyZnNfbXVsdGlfYmlvKSArIFwKKyNkZWZpbmUgYnRyZnNfYmlvX3NpemUobikgKHNpemVvZihzdHJ1Y3QgYnRyZnNfYmlvKSArIFwKIAkJCSAgICAoc2l6ZW9mKHN0cnVjdCBidHJmc19iaW9fc3RyaXBlKSAqIChuKSkpCiAKIGludCBidHJmc19hbGxvY19kZXZfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMTgwLDcgKzE5Miw3IEBACiAJCQkgICB1NjQgY2h1bmtfb2Zmc2V0LCB1NjQgc3RhcnQsIHU2NCBudW1fYnl0ZXMpOwogaW50IGJ0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAogCQkgICAgdTY0IGxvZ2ljYWwsIHU2NCAqbGVuZ3RoLAotCQkgICAgc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqKm11bHRpX3JldCwgaW50IG1pcnJvcl9udW0pOworCQkgICAgc3RydWN0IGJ0cmZzX2JpbyAqKmJiaW9fcmV0LCBpbnQgbWlycm9yX251bSk7CiBpbnQgYnRyZnNfcm1hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwKIAkJICAgICB1NjQgY2h1bmtfc3RhcnQsIHU2NCBwaHlzaWNhbCwgdTY0IGRldmlkLAogCQkgICAgIHU2NCAqKmxvZ2ljYWwsIGludCAqbmFkZHJzLCBpbnQgKnN0cmlwZV9sZW4pOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMveGF0dHIuYyBiL2ZzL2J0cmZzL3hhdHRyLmMKaW5kZXggNDI2YWE0Ni4uMzg0OGIwNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMveGF0dHIuYworKysgYi9mcy9idHJmcy94YXR0ci5jCkBAIC0xMjcsNiArMTI3LDE3IEBACiBhZ2FpbjoKIAlyZXQgPSBidHJmc19pbnNlcnRfeGF0dHJfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgYnRyZnNfaW5vKGlub2RlKSwKIAkJCQkgICAgICBuYW1lLCBuYW1lX2xlbiwgdmFsdWUsIHNpemUpOworCS8qCisJICogSWYgd2UncmUgc2V0dGluZyBhbiB4YXR0ciB0byBhIG5ldyB2YWx1ZSBidXQgdGhlIG5ldyB2YWx1ZSBpcyBzYXkKKwkgKiBleGFjdGx5IEJUUkZTX01BWF9YQVRUUl9TSVpFLCB3ZSBjb3VsZCBlbmQgdXAgd2l0aCBFT1ZFUkZMT1cgZ2V0dGluZworCSAqIGJhY2sgZnJvbSBzcGxpdF9sZWFmLiAgVGhpcyBpcyBiZWNhdXNlIGl0IHRoaW5rcyB3ZSdsbCBiZSBleHRlbmRpbmcKKwkgKiB0aGUgZXhpc3RpbmcgaXRlbSBzaXplLCBidXQgd2UncmUgYXNraW5nIGZvciBlbm91Z2ggc3BhY2UgdG8gYWRkIHRoZQorCSAqIGl0ZW0gaXRzZWxmLiAgU28gaWYgd2UgZ2V0IEVPVkVSRkxPVyBqdXN0IHNldCByZXQgdG8gRUVYSVNUIGFuZCBsZXQKKwkgKiB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gZmlndXJlIGl0IG91dC4KKwkgKi8KKwlpZiAocmV0ID09IC1FT1ZFUkZMT1cpCisJCXJldCA9IC1FRVhJU1Q7CisKIAlpZiAocmV0ID09IC1FRVhJU1QpIHsKIAkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDFhODBiMDQuLjE5ZDhlYjcgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yMTMsMTMgKzIxMywxNiBAQAogCSAqIGVsc2V3aGVyZSwgZG9uJ3QgYnVmZmVyX2Vycm9yIGlmIHdlIGhhZCBzb21lIHVubWFwcGVkIGJ1ZmZlcnMKIAkgKi8KIAlpZiAoYWxsX21hcHBlZCkgeworCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKIAkJcHJpbnRrKCJfX2ZpbmRfZ2V0X2Jsb2NrX3Nsb3coKSBmYWlsZWQuICIKIAkJCSJibG9jaz0lbGx1LCBiX2Jsb2NrbnI9JWxsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwogCQlwcmludGsoImJfc3RhdGU9MHglMDhseCwgYl9zaXplPSV6dVxuIiwKIAkJCWJoLT5iX3N0YXRlLCBiaC0+Yl9zaXplKTsKLQkJcHJpbnRrKCJkZXZpY2UgYmxvY2tzaXplOiAlZFxuIiwgMSA8PCBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwkJcHJpbnRrKCJkZXZpY2UgJXMgYmxvY2tzaXplOiAlZFxuIiwgYmRldm5hbWUoYmRldiwgYiksCisJCQkxIDw8IGJkX2lub2RlLT5pX2Jsa2JpdHMpOwogCX0KIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmJkX21hcHBpbmctPnByaXZhdGVfbG9jayk7CkBAIC0yODUsNyArMjg4LDcgQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAlpbnQgbmlkOwogCi0Jd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcygxMDI0KTsKKwl3YWtldXBfZmx1c2hlcl90aHJlYWRzKDEwMjQsIFdCX1JFQVNPTl9GUkVFX01PUkVfTUVNKTsKIAl5aWVsZCgpOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CkBAIC0xNDcwLDEzICsxNDczLDEzIEBACiB9CiAKIC8qKgotICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UgLSBpbnZhbGlkYXRlIHBhcnQgb2YgYWxsIG9mIGEgYnVmZmVyLWJhY2tlZCBwYWdlCisgKiBibG9ja19pbnZhbGlkYXRlcGFnZSAtIGludmFsaWRhdGUgcGFydCBvciBhbGwgb2YgYSBidWZmZXItYmFja2VkIHBhZ2UKICAqCiAgKiBAcGFnZTogdGhlIHBhZ2Ugd2hpY2ggaXMgYWZmZWN0ZWQKICAqIEBvZmZzZXQ6IHRoZSBpbmRleCBvZiB0aGUgdHJ1bmNhdGlvbiBwb2ludAogICoKICAqIGJsb2NrX2ludmFsaWRhdGVwYWdlKCkgaXMgY2FsbGVkIHdoZW4gYWxsIG9yIHBhcnQgb2YgdGhlIHBhZ2UgaGFzIGJlY29tZQotICogaW52YWxpZGF0ZWRieSBhIHRydW5jYXRlIG9wZXJhdGlvbi4KKyAqIGludmFsaWRhdGVkIGJ5IGEgdHJ1bmNhdGUgb3BlcmF0aW9uLgogICoKICAqIGJsb2NrX2ludmFsaWRhdGVwYWdlKCkgZG9lcyBub3QgaGF2ZSB0byByZWxlYXNlIGFsbCBidWZmZXJzLCBidXQgaXQgbXVzdAogICogZW5zdXJlIHRoYXQgbm8gZGlydHkgYnVmZmVyIGlzIGxlZnQgb3V0c2lkZSBAb2Zmc2V0IGFuZCB0aGF0IG5vIEkvTwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9hZGRyLmMgYi9mcy9jZXBoL2FkZHIuYwppbmRleCA1YTM5NTNkLi40MTQ0Y2FmIDEwMDY0NAotLS0gYS9mcy9jZXBoL2FkZHIuYworKysgYi9mcy9jZXBoL2FkZHIuYwpAQCAtMjI4LDM2ICsyMjgsMTI5IEBACiB9CiAKIC8qCi0gKiBCdWlsZCBhIHZlY3RvciBvZiBjb250aWd1b3VzIHBhZ2VzIGZyb20gdGhlIHByb3ZpZGVkIHBhZ2UgbGlzdC4KKyAqIEZpbmlzaCBhbiBhc3luYyByZWFkKGFoZWFkKSBvcC4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICoqcGFnZV92ZWN0b3JfZnJvbV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwKLQkJCQkJICAgdW5zaWduZWQgKm5yX3BhZ2VzKQorc3RhdGljIHZvaWQgZmluaXNoX3JlYWQoc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSwgc3RydWN0IGNlcGhfbXNnICptc2cpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+cl9pbm9kZTsKKwlzdHJ1Y3QgY2VwaF9vc2RfcmVwbHlfaGVhZCAqcmVwbHloZWFkOworCWludCByYywgYnl0ZXM7CisJaW50IGk7CisKKwkvKiBwYXJzZSByZXBseSAqLworCXJlcGx5aGVhZCA9IG1zZy0+ZnJvbnQuaW92X2Jhc2U7CisJV0FSTl9PTihsZTMyX3RvX2NwdShyZXBseWhlYWQtPm51bV9vcHMpID09IDApOworCXJjID0gbGUzMl90b19jcHUocmVwbHloZWFkLT5yZXN1bHQpOworCWJ5dGVzID0gbGUzMl90b19jcHUobXNnLT5oZHIuZGF0YV9sZW4pOworCisJZG91dCgiZmluaXNoX3JlYWQgJXAgcmVxICVwIHJjICVkIGJ5dGVzICVkXG4iLCBpbm9kZSwgcmVxLCByYywgYnl0ZXMpOworCisJLyogdW5sb2NrIGFsbCBwYWdlcywgemVyb2luZyBhbnkgZGF0YSB3ZSBkaWRuJ3QgcmVhZCAqLworCWZvciAoaSA9IDA7IGkgPCByZXEtPnJfbnVtX3BhZ2VzOyBpKyssIGJ5dGVzIC09IFBBR0VfQ0FDSEVfU0laRSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+cl9wYWdlc1tpXTsKKworCQlpZiAoYnl0ZXMgPCAoaW50KVBBR0VfQ0FDSEVfU0laRSkgeworCQkJLyogemVybyAocmVtYWluZGVyIG9mKSBwYWdlICovCisJCQlpbnQgcyA9IGJ5dGVzIDwgMCA/IDAgOiBieXRlczsKKwkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIHMsIFBBR0VfQ0FDSEVfU0laRSk7CisJCX0KKyAJCWRvdXQoImZpbmlzaF9yZWFkICVwIHVwdG9kYXRlICVwIGlkeCAlbHVcbiIsIGlub2RlLCBwYWdlLAorCQkgICAgIHBhZ2UtPmluZGV4KTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJa2ZyZWUocmVxLT5yX3BhZ2VzKTsKK30KKworLyoKKyAqIHN0YXJ0IGFuIGFzeW5jIHJlYWQoYWhlYWQpIG9wZXJhdGlvbi4gIHJldHVybiBucl9wYWdlcyB3ZSBzdWJtaXR0ZWQKKyAqIGEgcmVhZCBmb3Igb24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzdGFydF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjID0KKwkJJmNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+Y2xpZW50LT5vc2RjOworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcTsKKwl1NjQgb2ZmOworCXU2NCBsZW47CisJaW50IGk7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgbmV4dF9pbmRleCwgY29udGlnX3BhZ2VzID0gMDsKKwlwZ29mZl90IG5leHRfaW5kZXg7CisJaW50IG5yX3BhZ2VzID0gMDsKKwlpbnQgcmV0OworCisJb2ZmID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIGNvdW50IHBhZ2VzICovCisJbmV4dF9pbmRleCA9IHBhZ2UtPmluZGV4OworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwYWdlLCBwYWdlX2xpc3QsIGxydSkgeworCQlpZiAocGFnZS0+aW5kZXggIT0gbmV4dF9pbmRleCkKKwkJCWJyZWFrOworCQlucl9wYWdlcysrOworCQluZXh0X2luZGV4Kys7CisJCWlmIChtYXggJiYgbnJfcGFnZXMgPT0gbWF4KQorCQkJYnJlYWs7CisJfQorCWxlbiA9IG5yX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZG91dCgic3RhcnRfcmVhZCAlcCBucl9wYWdlcyAlZCBpcyAlbGxkfiVsbGRcbiIsIGlub2RlLCBucl9wYWdlcywKKwkgICAgIG9mZiwgbGVuKTsKKworCXJlcSA9IGNlcGhfb3NkY19uZXdfcmVxdWVzdChvc2RjLCAmY2ktPmlfbGF5b3V0LCBjZXBoX3Zpbm8oaW5vZGUpLAorCQkJCSAgICBvZmYsICZsZW4sCisJCQkJICAgIENFUEhfT1NEX09QX1JFQUQsIENFUEhfT1NEX0ZMQUdfUkVBRCwKKwkJCQkgICAgTlVMTCwgMCwKKwkJCQkgICAgY2ktPmlfdHJ1bmNhdGVfc2VxLCBjaS0+aV90cnVuY2F0ZV9zaXplLAorCQkJCSAgICBOVUxMLCBmYWxzZSwgMSwgMCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogYnVpbGQgcGFnZSB2ZWN0b3IgKi8KLQlwYWdlcyA9IGttYWxsb2Moc2l6ZW9mKCpwYWdlcykgKiAqbnJfcGFnZXMsIEdGUF9OT0ZTKTsKKwlucl9wYWdlcyA9IGxlbiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXBhZ2VzID0ga21hbGxvYyhzaXplb2YoKnBhZ2VzKSAqIG5yX3BhZ2VzLCBHRlBfTk9GUyk7CisJcmV0ID0gLUVOT01FTTsKIAlpZiAoIXBhZ2VzKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCUJVR19PTihsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpOwotCW5leHRfaW5kZXggPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSktPmluZGV4OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwYWdlLCBwYWdlX2xpc3QsIGxydSkgewotCQlpZiAocGFnZS0+aW5kZXggPT0gbmV4dF9pbmRleCkgewotCQkJZG91dCgicmVhZHBhZ2VzIHBhZ2UgJWQgJXBcbiIsIGNvbnRpZ19wYWdlcywgcGFnZSk7Ci0JCQlwYWdlc1tjb250aWdfcGFnZXNdID0gcGFnZTsKLQkJCWNvbnRpZ19wYWdlcysrOwotCQkJbmV4dF9pbmRleCsrOwotCQl9IGVsc2UgewotCQkJYnJlYWs7CisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgKytpKSB7CisJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJCUJVR19PTihQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQorIAkJZG91dCgic3RhcnRfcmVhZCAlcCBhZGRpbmcgJXAgaWR4ICVsdVxuIiwgaW5vZGUsIHBhZ2UsCisJCSAgICAgcGFnZS0+aW5kZXgpOworCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsICZpbm9kZS0+aV9kYXRhLCBwYWdlLT5pbmRleCwKKwkJCQkJICBHRlBfTk9GUykpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWRvdXQoInN0YXJ0X3JlYWQgJXAgYWRkX3RvX3BhZ2VfY2FjaGUgZmFpbGVkICVwXG4iLAorCQkJICAgICBpbm9kZSwgcGFnZSk7CisJCQlucl9wYWdlcyA9IGk7CisJCQlnb3RvIG91dF9wYWdlczsKIAkJfQorCQlwYWdlc1tpXSA9IHBhZ2U7CiAJfQotCSpucl9wYWdlcyA9IGNvbnRpZ19wYWdlczsKLQlyZXR1cm4gcGFnZXM7CisJcmVxLT5yX3BhZ2VzID0gcGFnZXM7CisJcmVxLT5yX251bV9wYWdlcyA9IG5yX3BhZ2VzOworCXJlcS0+cl9jYWxsYmFjayA9IGZpbmlzaF9yZWFkOworCXJlcS0+cl9pbm9kZSA9IGlub2RlOworCisJZG91dCgic3RhcnRfcmVhZCAlcCBzdGFydGluZyAlcCAlbGxkfiVsbGRcbiIsIGlub2RlLCByZXEsIG9mZiwgbGVuKTsKKwlyZXQgPSBjZXBoX29zZGNfc3RhcnRfcmVxdWVzdChvc2RjLCByZXEsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfcGFnZXM7CisJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIG5yX3BhZ2VzOworCitvdXRfcGFnZXM6CisJY2VwaF9yZWxlYXNlX3BhZ2VfdmVjdG9yKHBhZ2VzLCBucl9wYWdlcyk7CitvdXQ6CisJY2VwaF9vc2RjX3B1dF9yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIHJldDsKIH0KIAorCiAvKgogICogUmVhZCBtdWx0aXBsZSBwYWdlcy4gIExlYXZlIHBhZ2VzIHdlIGRvbid0IHJlYWQgKyB1bmxvY2sgaW4gcGFnZV9saXN0OwogICogdGhlIGNhbGxlciAoVk0pIGNsZWFucyB0aGVtIHVwLgpAQCAtMjY2LDY0ICszNTksMjQgQEAKIAkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcGFnZV9saXN0LCB1bnNpZ25lZCBucl9wYWdlcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKLQlzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjID0KLQkJJmNlcGhfaW5vZGVfdG9fY2xpZW50KGlub2RlKS0+Y2xpZW50LT5vc2RjOworCXN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjID0gY2VwaF9pbm9kZV90b19jbGllbnQoaW5vZGUpOwogCWludCByYyA9IDA7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQlsb2ZmX3Qgb2Zmc2V0OwotCXU2NCBsZW47CisJaW50IG1heCA9IDA7CiAKLQlkb3V0KCJyZWFkcGFnZXMgJXAgZmlsZSAlcCBucl9wYWdlcyAlZFxuIiwKLQkgICAgIGlub2RlLCBmaWxlLCBucl9wYWdlcyk7CisJaWYgKGZzYy0+bW91bnRfb3B0aW9ucy0+cnNpemUgPj0gUEFHRV9DQUNIRV9TSVpFKQorCQltYXggPSAoZnNjLT5tb3VudF9vcHRpb25zLT5yc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpCisJCQk+PiBQQUdFX1NISUZUOwogCi0JcGFnZXMgPSBwYWdlX3ZlY3Rvcl9mcm9tX2xpc3QocGFnZV9saXN0LCAmbnJfcGFnZXMpOwotCWlmIChJU19FUlIocGFnZXMpKQotCQlyZXR1cm4gUFRSX0VSUihwYWdlcyk7Ci0KLQkvKiBndWVzcyByZWFkIGV4dGVudCAqLwotCW9mZnNldCA9IHBhZ2VzWzBdLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCWxlbiA9IG5yX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JcmMgPSBjZXBoX29zZGNfcmVhZHBhZ2VzKG9zZGMsIGNlcGhfdmlubyhpbm9kZSksICZjaS0+aV9sYXlvdXQsCi0JCQkJIG9mZnNldCwgJmxlbiwKLQkJCQkgY2ktPmlfdHJ1bmNhdGVfc2VxLCBjaS0+aV90cnVuY2F0ZV9zaXplLAotCQkJCSBwYWdlcywgbnJfcGFnZXMsIDApOwotCWlmIChyYyA9PSAtRU5PRU5UKQotCQlyYyA9IDA7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKDsgIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiBsZW4gPiAwOwotCSAgICAgcmMgLT0gUEFHRV9DQUNIRV9TSVpFLCBsZW4gLT0gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0KLQkJCWxpc3RfZW50cnkocGFnZV9saXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKLQotCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQotCQlpZiAocmMgPCAoaW50KVBBR0VfQ0FDSEVfU0laRSkgewotCQkJLyogemVybyAocmVtYWluZGVyIG9mKSBwYWdlICovCi0JCQlpbnQgcyA9IHJjIDwgMCA/IDAgOiByYzsKLQkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIHMsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JCX0KLQotCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIHBhZ2UtPmluZGV4LAotCQkJCQkgIEdGUF9OT0ZTKSkgewotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZG91dCgicmVhZHBhZ2VzICVwIGFkZF90b19wYWdlX2NhY2hlIGZhaWxlZCAlcFxuIiwKLQkJCSAgICAgaW5vZGUsIHBhZ2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZG91dCgicmVhZHBhZ2VzICVwIGFkZGluZyAlcCBpZHggJWx1XG4iLCBpbm9kZSwgcGFnZSwKLQkJICAgICBwYWdlLT5pbmRleCk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJZG91dCgicmVhZHBhZ2VzICVwIGZpbGUgJXAgbnJfcGFnZXMgJWQgbWF4ICVkXG4iLCBpbm9kZSwgZmlsZSwgbnJfcGFnZXMsCisJICAgICBtYXgpOworCXdoaWxlICghbGlzdF9lbXB0eShwYWdlX2xpc3QpKSB7CisJCXJjID0gc3RhcnRfcmVhZChpbm9kZSwgcGFnZV9saXN0LCBtYXgpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJCUJVR19PTihyYyA9PSAwKTsKIAl9Ci0JcmMgPSAwOwotCiBvdXQ6Ci0Ja2ZyZWUocGFnZXMpOworCWRvdXQoInJlYWRwYWdlcyAlcCBmaWxlICVwIHJldCAlZFxuIiwgaW5vZGUsIGZpbGUsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvY2Fwcy5jIGIvZnMvY2VwaC9jYXBzLmMKaW5kZXggOGQ3NGFkNy4uMGYzMjdjNiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9jYXBzLmMKKysrIGIvZnMvY2VwaC9jYXBzLmMKQEAgLTQ4NywxNyArNDg3LDE1IEBACiAJCWNpLT5pX3JkY2FjaGVfZ2VuKys7CiAKIAkvKgotCSAqIGlmIHdlIGFyZSBuZXdseSBpc3N1ZWQgRklMRV9TSEFSRUQsIGNsZWFyIElfQ09NUExFVEU7IHdlCisJICogaWYgd2UgYXJlIG5ld2x5IGlzc3VlZCBGSUxFX1NIQVJFRCwgY2xlYXIgRF9DT01QTEVURTsgd2UKIAkgKiBkb24ndCBrbm93IHdoYXQgaGFwcGVuZWQgdG8gdGhpcyBkaXJlY3Rvcnkgd2hpbGUgd2UgZGlkbid0CiAJICogaGF2ZSB0aGUgY2FwLgogCSAqLwogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfRklMRV9TSEFSRUQpICYmCiAJICAgIChoYWQgJiBDRVBIX0NBUF9GSUxFX1NIQVJFRCkgPT0gMCkgewogCQljaS0+aV9zaGFyZWRfZ2VuKys7Ci0JCWlmIChTX0lTRElSKGNpLT52ZnNfaW5vZGUuaV9tb2RlKSkgewotCQkJZG91dCgiIG1hcmtpbmcgJXAgTk9UIGNvbXBsZXRlXG4iLCAmY2ktPnZmc19pbm9kZSk7Ci0JCQljaS0+aV9jZXBoX2ZsYWdzICY9IH5DRVBIX0lfQ09NUExFVEU7Ci0JCX0KKwkJaWYgKFNfSVNESVIoY2ktPnZmc19pbm9kZS5pX21vZGUpKQorCQkJY2VwaF9kaXJfY2xlYXJfY29tcGxldGUoJmNpLT52ZnNfaW5vZGUpOwogCX0KIH0KIApAQCAtOTQ1LDcgKzk0Myw3IEBACiAJICAgICBzZXEsIGlzc3VlX3NlcSwgbXNlcSwgZm9sbG93cywgc2l6ZSwgbWF4X3NpemUsCiAJICAgICB4YXR0cl92ZXJzaW9uLCB4YXR0cnNfYnVmID8gKGludCl4YXR0cnNfYnVmLT52ZWMuaW92X2xlbiA6IDApOwogCi0JbXNnID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0NMSUVOVF9DQVBTLCBzaXplb2YoKmZjKSwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfQ0FQUywgc2l6ZW9mKCpmYyksIEdGUF9OT0ZTLCBmYWxzZSk7CiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMzYzLDcgKzIzNjEsNyBAQAogCX0KIAogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfTElOS19FWENMKSA9PSAwKQotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGdyYW50LT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoZ3JhbnQtPm5saW5rKSk7CiAKIAlpZiAoKGlzc3VlZCAmIENFUEhfQ0FQX1hBVFRSX0VYQ0wpID09IDAgJiYgZ3JhbnQtPnhhdHRyX2xlbikgewogCQlpbnQgbGVuID0gbGUzMl90b19jcHUoZ3JhbnQtPnhhdHRyX2xlbik7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2Rpci5jIGIvZnMvY2VwaC9kaXIuYwppbmRleCAzODJhYmM5Li4yYWJkMGRmIDEwMDY0NAotLS0gYS9mcy9jZXBoL2Rpci5jCisrKyBiL2ZzL2NlcGgvZGlyLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogICogZmFsbGluZyBiYWNrIHRvIGEgIm5vcm1hbCIgc3luYyByZWFkZGlyIGlmIGFueSBkZW50cmllcyBpbiB0aGUgZGlyCiAgKiBhcmUgZHJvcHBlZC4KICAqCi0gKiBJX0NPTVBMRVRFIHRlbGxzIGluZGljYXRlcyB3ZSBoYXZlIGFsbCBkZW50cmllcyBpbiB0aGUgZGlyLiAgSXQgaXMKKyAqIERfQ09NUExFVEUgdGVsbHMgaW5kaWNhdGVzIHdlIGhhdmUgYWxsIGRlbnRyaWVzIGluIHRoZSBkaXIuICBJdCBpcwogICogZGVmaW5lZCBJRkYgd2UgaG9sZCBDRVBIX0NBUF9GSUxFX1NIQVJFRCAod2hpY2ggd2lsbCBiZSByZXZva2VkIGJ5CiAgKiB0aGUgTURTIGlmL3doZW4gdGhlIGRpcmVjdG9yeSBpcyBtb2RpZmllZCkuCiAgKi8KQEAgLTE5OSw4ICsxOTksOCBAQAogCWZpbHAtPmZfcG9zKys7CiAKIAkvKiBtYWtlIHN1cmUgYSBkZW50cnkgd2Fzbid0IGRyb3BwZWQgd2hpbGUgd2UgZGlkbid0IGhhdmUgcGFyZW50IGxvY2sgKi8KLQlpZiAoIWNlcGhfaV90ZXN0KGRpciwgQ0VQSF9JX0NPTVBMRVRFKSkgewotCQlkb3V0KCIgbG9zdCBJX0NPTVBMRVRFIG9uICVwOyBmYWxsaW5nIGJhY2sgdG8gbWRzXG4iLCBkaXIpOworCWlmICghY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShkaXIpKSB7CisJCWRvdXQoIiBsb3N0IERfQ09NUExFVEUgb24gJXA7IGZhbGxpbmcgYmFjayB0byBtZHNcbiIsIGRpcik7CiAJCWVyciA9IC1FQUdBSU47CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI4NSw3ICsyODUsNyBAQAogCWlmICgoZmlscC0+Zl9wb3MgPT0gMiB8fCBmaS0+ZGVudHJ5KSAmJgogCSAgICAhY2VwaF90ZXN0X21vdW50X29wdChmc2MsIE5PQVNZTkNSRUFERElSKSAmJgogCSAgICBjZXBoX3NuYXAoaW5vZGUpICE9IENFUEhfU05BUERJUiAmJgotCSAgICAoY2ktPmlfY2VwaF9mbGFncyAmIENFUEhfSV9DT01QTEVURSkgJiYKKwkgICAgY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkgJiYKIAkgICAgX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIENFUEhfQ0FQX0ZJTEVfU0hBUkVELCAxKSkgewogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWVyciA9IF9fZGNhY2hlX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKQEAgLTM1MSw3ICszNTEsNyBAQAogCiAJCWlmICghcmVxLT5yX2RpZF9wcmVwb3B1bGF0ZSkgewogCQkJZG91dCgicmVhZGRpciAhZGlkX3ByZXBvcHVsYXRlIik7Ci0JCQlmaS0+ZGlyX3JlbGVhc2VfY291bnQtLTsgICAgLyogcHJlY2x1ZGUgSV9DT01QTEVURSAqLworCQkJZmktPmRpcl9yZWxlYXNlX2NvdW50LS07ICAgIC8qIHByZWNsdWRlIERfQ09NUExFVEUgKi8KIAkJfQogCiAJCS8qIG5vdGUgbmV4dCBvZmZzZXQgYW5kIGxhc3QgZGVudHJ5IG5hbWUgKi8KQEAgLTQzMCw4ICs0MzAsNyBAQAogCSAqLwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKGNpLT5pX3JlbGVhc2VfY291bnQgPT0gZmktPmRpcl9yZWxlYXNlX2NvdW50KSB7Ci0JCWRvdXQoIiBtYXJraW5nICVwIGNvbXBsZXRlXG4iLCBpbm9kZSk7Ci0JCS8qIGNpLT5pX2NlcGhfZmxhZ3MgfD0gQ0VQSF9JX0NPTVBMRVRFOyAqLworCQljZXBoX2Rpcl9zZXRfY29tcGxldGUoaW5vZGUpOwogCQljaS0+aV9tYXhfb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CiAJfQogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKQEAgLTYxNCw3ICs2MTMsNyBAQAogCQkJICAgIGZzYy0+bW91bnRfb3B0aW9ucy0+c25hcGRpcl9uYW1lLAogCQkJICAgIGRlbnRyeS0+ZF9uYW1lLmxlbikgJiYKIAkJICAgICFpc19yb290X2NlcGhfZGVudHJ5KGRpciwgZGVudHJ5KSAmJgotCQkgICAgKGNpLT5pX2NlcGhfZmxhZ3MgJiBDRVBIX0lfQ09NUExFVEUpICYmCisJCSAgICBjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKGRpcikgJiYKIAkJICAgIChfX2NlcGhfY2Fwc19pc3N1ZWRfbWFzayhjaSwgQ0VQSF9DQVBfRklMRV9TSEFSRUQsIDEpKSkgewogCQkJc3Bpbl91bmxvY2soJmRpci0+aV9sb2NrKTsKIAkJCWRvdXQoIiBkaXIgJXAgY29tcGxldGUsIC1FTk9FTlRcbiIsIGRpcik7CkBAIC05MzQsNyArOTMzLDcgQEAKIAkJICovCiAKIAkJLyogZF9tb3ZlIHNjcmV3cyB1cCBkX3N1YmRpcnMgb3JkZXIgKi8KLQkJY2VwaF9pX2NsZWFyKG5ld19kaXIsIENFUEhfSV9DT01QTEVURSk7CisJCWNlcGhfZGlyX2NsZWFyX2NvbXBsZXRlKG5ld19kaXIpOwogCiAJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKIApAQCAtMTA5Miw3ICsxMDkxLDc1IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qCisgKiBTZXQvY2xlYXIvdGVzdCBkaXIgY29tcGxldGUgZmxhZyBvbiB0aGUgZGlyJ3MgZGVudHJ5LgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIF9fZF9maW5kX2FueV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzOwogCisJaWYgKGxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpCisJCXJldHVybiBOVUxMOworCWFsaWFzID0gbGlzdF9maXJzdF9lbnRyeSgmaW5vZGUtPmlfZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwlyZXR1cm4gYWxpYXM7Cit9CisKK3ZvaWQgY2VwaF9kaXJfc2V0X2NvbXBsZXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2ZpbmRfYW55X2FsaWFzKGlub2RlKTsKKwkKKwlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpIHsKKwkJZG91dCgiIG1hcmtpbmcgJXAgKCVwKSBjb21wbGV0ZVxuIiwgaW5vZGUsIGRlbnRyeSk7CisJCXNldF9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmY2VwaF9kZW50cnkoZGVudHJ5KS0+ZmxhZ3MpOworCX0KK30KKwordm9pZCBjZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IF9fZF9maW5kX2FueV9hbGlhcyhpbm9kZSk7CisKKwlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpIHsKKwkJZG91dCgiIG1hcmtpbmcgJXAgKCVwKSBOT1QgY29tcGxldGVcbiIsIGlub2RlLCBkZW50cnkpOworCQljbGVhcl9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmY2VwaF9kZW50cnkoZGVudHJ5KS0+ZmxhZ3MpOworCX0KK30KKworYm9vbCBjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2ZpbmRfYW55X2FsaWFzKGlub2RlKTsKKworCWlmIChkZW50cnkgJiYgY2VwaF9kZW50cnkoZGVudHJ5KSkKKwkJcmV0dXJuIHRlc3RfYml0KENFUEhfRF9DT01QTEVURSwgJmNlcGhfZGVudHJ5KGRlbnRyeSktPmZsYWdzKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBXaGVuIHRoZSBWRlMgcHJ1bmVzIGEgZGVudHJ5IGZyb20gdGhlIGNhY2hlLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZQorICogY29tcGxldGUgZmxhZyBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKyAqCisgKiBDYWxsZWQgdW5kZXIgZGVudHJ5LT5kX2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGNlcGhfZF9wcnVuZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGNlcGhfZGVudHJ5X2luZm8gKmRpOworCisJZG91dCgiZF9yZWxlYXNlICVwXG4iLCBkZW50cnkpOworCisJLyogZG8gd2UgaGF2ZSBhIHZhbGlkIHBhcmVudD8gKi8KKwlpZiAoIWRlbnRyeS0+ZF9wYXJlbnQgfHwgSVNfUk9PVChkZW50cnkpKQorCQlyZXR1cm47CisKKwkvKiBpZiB3ZSBhcmUgbm90IGhhc2hlZCwgd2UgZG9uJ3QgYWZmZWN0IERfQ09NUExFVEUgKi8KKwlpZiAoZF91bmhhc2hlZChkZW50cnkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHdlIGhvbGQgZF9sb2NrLCBzbyBkX3BhcmVudCBpcyBzdGFibGUsIGFuZCBkX2ZzZGF0YSBpcyBuZXZlcgorCSAqIGNsZWFyZWQgdW50aWwgZF9yZWxlYXNlCisJICovCisJZGkgPSBjZXBoX2RlbnRyeShkZW50cnktPmRfcGFyZW50KTsKKwljbGVhcl9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmZGktPmZsYWdzKTsKK30KIAogLyoKICAqIHJlYWQoKSBvbiBhIGRpci4gIFRoaXMgd2VpcmQgaW50ZXJmYWNlIGhhY2sgb25seSB3b3JrcyBpZiBtb3VudGVkCkBAIC0xMzA2LDYgKzEzNzMsNyBAQAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfZGVudHJ5X29wcyA9IHsKIAkuZF9yZXZhbGlkYXRlID0gY2VwaF9kX3JldmFsaWRhdGUsCiAJLmRfcmVsZWFzZSA9IGNlcGhfZF9yZWxlYXNlLAorCS5kX3BydW5lID0gY2VwaF9kX3BydW5lLAogfTsKIAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcGRpcl9kZW50cnlfb3BzID0gewpAQCAtMTMxNSw0ICsxMzgzLDUgQEAKIAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNlcGhfc25hcF9kZW50cnlfb3BzID0gewogCS5kX3JlbGVhc2UgPSBjZXBoX2RfcmVsZWFzZSwKKwkuZF9wcnVuZSA9IGNlcGhfZF9wcnVuZSwKIH07CmRpZmYgLS1naXQgYS9mcy9jZXBoL2lub2RlLmMgYi9mcy9jZXBoL2lub2RlLmMKaW5kZXggMDk1Nzk5Yi4uZTM5MmJmYyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pbm9kZS5jCisrKyBiL2ZzL2NlcGgvaW5vZGUuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgIm1kc19jbGllbnQuaCIKQEAgLTYxOSw3ICs2MTgsNyBAQAogCX0KIAogCWlmICgoaXNzdWVkICYgQ0VQSF9DQVBfTElOS19FWENMKSA9PSAwKQotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGluZm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShpbmZvLT5ubGluaykpOwogCiAJLyogYmUgY2FyZWZ1bCB3aXRoIG10aW1lLCBhdGltZSwgc2l6ZSAqLwogCWNlcGhfZGVjb2RlX3RpbWVzcGVjKCZhdGltZSwgJmluZm8tPmF0aW1lKTsKQEAgLTc3Miw5ICs3NzEsOSBAQAogCSAgICBjZXBoX3NuYXAoaW5vZGUpID09IENFUEhfTk9TTkFQICYmCiAJICAgIChsZTMyX3RvX2NwdShpbmZvLT5jYXAuY2FwcykgJiBDRVBIX0NBUF9GSUxFX1NIQVJFRCkgJiYKIAkgICAgKGlzc3VlZCAmIENFUEhfQ0FQX0ZJTEVfRVhDTCkgPT0gMCAmJgotCSAgICAoY2ktPmlfY2VwaF9mbGFncyAmIENFUEhfSV9DT01QTEVURSkgPT0gMCkgeworCSAgICAhY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkpIHsKIAkJZG91dCgiIG1hcmtpbmcgJXAgY29tcGxldGUgKGVtcHR5KVxuIiwgaW5vZGUpOwotCQkvKiBjaS0+aV9jZXBoX2ZsYWdzIHw9IENFUEhfSV9DT01QTEVURTsgKi8KKwkJY2VwaF9kaXJfc2V0X2NvbXBsZXRlKGlub2RlKTsKIAkJY2ktPmlfbWF4X29mZnNldCA9IDI7CiAJfQogCkBAIC04NTcsNyArODU2LDcgQEAKIAlkaSA9IGNlcGhfZGVudHJ5KGRuKTsKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKChjZXBoX2lub2RlKGlub2RlKS0+aV9jZXBoX2ZsYWdzICYgQ0VQSF9JX0NPTVBMRVRFKSA9PSAwKSB7CisJaWYgKCFjZXBoX2Rpcl90ZXN0X2NvbXBsZXRlKGlub2RlKSkgewogCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC0xMDU3LDcgKzEwNTYsNyBAQAogCQkJICogZF9tb3ZlKCkgcHV0cyB0aGUgcmVuYW1lZCBkZW50cnkgYXQgdGhlIGVuZCBvZgogCQkJICogZF9zdWJkaXJzLiAgV2UgbmVlZCB0byBhc3NpZ24gaXQgYW4gYXBwcm9wcmlhdGUKIAkJCSAqIGRpcmVjdG9yeSBvZmZzZXQgc28gd2UgY2FuIGJlaGF2ZSB3aGVuIGhvbGRpbmcKLQkJCSAqIElfQ09NUExFVEUuCisJCQkgKiBEX0NPTVBMRVRFLgogCQkJICovCiAJCQljZXBoX3NldF9kZW50cnlfb2Zmc2V0KHJlcS0+cl9vbGRfZGVudHJ5KTsKIAkJCWRvdXQoImRuICVwIGdldHMgbmV3IG9mZnNldCAlbGxkXG4iLCByZXEtPnJfb2xkX2RlbnRyeSwgCkBAIC0xMzY0LDQ5ICsxMzYzLDYgQEAKIH0KIAogLyoKLSAqIGludmFsaWRhdGUgYW55IHBhZ2VzIHRoYXQgYXJlIG5vdCBkaXJ0eSBvciB1bmRlciB3cml0ZWJhY2suICB0aGlzCi0gKiBpbmNsdWRlcyBwYWdlcyB0aGF0IGFyZSBjbGVhbiBhbmQgbWFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBjZXBoX2ludmFsaWRhdGVfbm9uZGlydHlfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCi17Ci0Jc3RydWN0IHBhZ2V2ZWMgcHZlYzsKLQlwZ29mZl90IG5leHQgPSAwOwotCWludCBpOwotCi0JcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKLQl3aGlsZSAocGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIG5leHQsIFBBR0VWRUNfU0laRSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKLQkJCXBnb2ZmX3QgaW5kZXg7Ci0JCQlpbnQgc2tpcF9wYWdlID0KLQkJCQkoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkpOwotCi0JCQlpZiAoIXNraXBfcGFnZSkKLQkJCQlza2lwX3BhZ2UgPSAhdHJ5bG9ja19wYWdlKHBhZ2UpOwotCi0JCQkvKgotCQkJICogV2UgcmVhbGx5IHNob3VsZG4ndCBiZSBsb29raW5nIGF0IHRoZSAtPmluZGV4IG9mIGFuCi0JCQkgKiB1bmxvY2tlZCBwYWdlLiAgQnV0IHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGxvY2sgdGhlc2UKLQkJCSAqIHBhZ2VzLiAgU28gd2UgcmVseSB1cG9uIG5vYm9keSBhbHRlcmluZyB0aGUgLT5pbmRleAotCQkJICogb2YgdGhpcyAocGlubmVkLWJ5LXVzKSBwYWdlLgotCQkJICovCi0JCQlpbmRleCA9IHBhZ2UtPmluZGV4OwotCQkJaWYgKGluZGV4ID4gbmV4dCkKLQkJCQluZXh0ID0gaW5kZXg7Ci0JCQluZXh0Kys7Ci0KLQkJCWlmIChza2lwX3BhZ2UpCi0JCQkJY29udGludWU7Ci0KLQkJCWdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UobWFwcGluZywgcGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJfQotCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci19Ci0KLS8qCiAgKiBJbnZhbGlkYXRlIGlub2RlIHBhZ2VzIGluIGEgd29ya2VyIHRocmVhZC4gIChUaGlzIGNhbid0IGJlIGRvbmUKICAqIGluIHRoZSBtZXNzYWdlIGhhbmRsZXIgY29udGV4dC4pCiAgKi8KQEAgLTE0MjksNyArMTM4NSw3IEBACiAJb3JpZ19nZW4gPSBjaS0+aV9yZGNhY2hlX2dlbjsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKLQljZXBoX2ludmFsaWRhdGVfbm9uZGlydHlfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAob3JpZ19nZW4gPT0gY2ktPmlfcmRjYWNoZV9nZW4gJiYKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW9jdGwuYyBiL2ZzL2NlcGgvaW9jdGwuYwppbmRleCAzYjI1NmI1Li41YTE0YzI5IDEwMDY0NAotLS0gYS9mcy9jZXBoL2lvY3RsLmMKKysrIGIvZnMvY2VwaC9pb2N0bC5jCkBAIC00MiwxNyArNDIsMzkgQEAKIAlzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjID0gY2VwaF9zYl90b19jbGllbnQoaW5vZGUtPmlfc2IpLT5tZHNjOwogCXN0cnVjdCBjZXBoX21kc19yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0IGw7CisJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY2VwaF9pb2N0bF9sYXlvdXQgbmw7CiAJaW50IGVyciwgaTsKIAotCS8qIGNvcHkgYW5kIHZhbGlkYXRlICovCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZsLCBhcmcsIHNpemVvZihsKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKChsLm9iamVjdF9zaXplICYgflBBR0VfTUFTSykgfHwKLQkgICAgKGwuc3RyaXBlX3VuaXQgJiB+UEFHRV9NQVNLKSB8fAotCSAgICAhbC5zdHJpcGVfdW5pdCB8fAotCSAgICAobC5vYmplY3Rfc2l6ZSAmJgotCSAgICAgKHVuc2lnbmVkKWwub2JqZWN0X3NpemUgJSAodW5zaWduZWQpbC5zdHJpcGVfdW5pdCkpCisJLyogdmFsaWRhdGUgY2hhbmdlZCBwYXJhbXMgYWdhaW5zdCBjdXJyZW50IGxheW91dCAqLworCWVyciA9IGNlcGhfZG9fZ2V0YXR0cihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgQ0VQSF9TVEFUX0NBUF9MQVlPVVQpOworCWlmICghZXJyKSB7CisJCW5sLnN0cmlwZV91bml0ID0gY2VwaF9maWxlX2xheW91dF9zdShjaS0+aV9sYXlvdXQpOworCQlubC5zdHJpcGVfY291bnQgPSBjZXBoX2ZpbGVfbGF5b3V0X3N0cmlwZV9jb3VudChjaS0+aV9sYXlvdXQpOworCQlubC5vYmplY3Rfc2l6ZSA9IGNlcGhfZmlsZV9sYXlvdXRfb2JqZWN0X3NpemUoY2ktPmlfbGF5b3V0KTsKKwkJbmwuZGF0YV9wb29sID0gbGUzMl90b19jcHUoY2ktPmlfbGF5b3V0LmZsX3BnX3Bvb2wpOworCQlubC5wcmVmZXJyZWRfb3NkID0KKwkJCQkoczMyKWxlMzJfdG9fY3B1KGNpLT5pX2xheW91dC5mbF9wZ19wcmVmZXJyZWQpOworCX0gZWxzZQorCQlyZXR1cm4gZXJyOworCisJaWYgKGwuc3RyaXBlX2NvdW50KQorCQlubC5zdHJpcGVfY291bnQgPSBsLnN0cmlwZV9jb3VudDsKKwlpZiAobC5zdHJpcGVfdW5pdCkKKwkJbmwuc3RyaXBlX3VuaXQgPSBsLnN0cmlwZV91bml0OworCWlmIChsLm9iamVjdF9zaXplKQorCQlubC5vYmplY3Rfc2l6ZSA9IGwub2JqZWN0X3NpemU7CisJaWYgKGwuZGF0YV9wb29sKQorCQlubC5kYXRhX3Bvb2wgPSBsLmRhdGFfcG9vbDsKKwlpZiAobC5wcmVmZXJyZWRfb3NkKQorCQlubC5wcmVmZXJyZWRfb3NkID0gbC5wcmVmZXJyZWRfb3NkOworCisJaWYgKChubC5vYmplY3Rfc2l6ZSAmIH5QQUdFX01BU0spIHx8CisJICAgIChubC5zdHJpcGVfdW5pdCAmIH5QQUdFX01BU0spIHx8CisJICAgICgodW5zaWduZWQpbmwub2JqZWN0X3NpemUgJSAodW5zaWduZWQpbmwuc3RyaXBlX3VuaXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIG1ha2Ugc3VyZSBpdCdzIGEgdmFsaWQgZGF0YSBwb29sICovCmRpZmYgLS1naXQgYS9mcy9jZXBoL2lvY3RsLmggYi9mcy9jZXBoL2lvY3RsLmgKaW5kZXggMGM1MTY3ZS4uYmU0YTYwNCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pb2N0bC5oCisrKyBiL2ZzL2NlcGgvaW9jdGwuaApAQCAtNiw3ICs2LDMxIEBACiAKICNkZWZpbmUgQ0VQSF9JT0NUTF9NQUdJQyAweDk3CiAKLS8qIGp1c3QgdXNlIHU2NCB0byBhbGlnbiBzYW5lbHkgb24gYWxsIGFyY2hzICovCisvKgorICogQ0VQSF9JT0NfR0VUX0xBWU9VVCAtIGdldCBmaWxlIGxheW91dCBvciBkaXIgbGF5b3V0IHBvbGljeQorICogQ0VQSF9JT0NfU0VUX0xBWU9VVCAtIHNldCBmaWxlIGxheW91dAorICogQ0VQSF9JT0NfU0VUX0xBWU9VVF9QT0xJQ1kgLSBzZXQgZGlyIGxheW91dCBwb2xpY3kKKyAqCisgKiBUaGUgZmlsZSBsYXlvdXQgc3BlY2lmaWVzIGhvdyBmaWxlIGRhdGEgaXMgc3RyaXBlZCBvdmVyIG9iamVjdHMgaW4KKyAqIHRoZSBkaXN0cmlidXRlZCBvYmplY3Qgc3RvcmUsIHdoaWNoIG9iamVjdCBwb29sIHRoZXkgYmVsb25nIHRvIChpZgorICogaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0KSwgYW5kIGFuIG9wdGlvbmFsICdwcmVmZXJyZWQgb3NkJyB0bworICogc3RvcmUgdGhlbSBvbi4KKyAqCisgKiBGaWxlcyBnZXQgYSBuZXcgbGF5b3V0IGJhc2VkIG9uIHRoZSBwb2xpY3kgc2V0IG9uIHRoZSBjb250YWluaW5nCisgKiBkaXJlY3Rvcnkgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMuICBUaGUgR0VUX0xBWU9VVCBpb2N0bCB3aWxsIGxldAorICogeW91IGV4YW1pbmUgdGhlIGxheW91dCBmb3IgYSBmaWxlIG9yIHRoZSBwb2xpY3kgb24gYSBkaXJlY3RvcnkuCisgKgorICogU0VUX0xBWU9VVCB3aWxsIGxldCB5b3Ugc2V0IGEgbGF5b3V0IG9uIGEgbmV3bHkgY3JlYXRlZCBmaWxlLiAgVGhpcworICogb25seSB3b3JrcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsZSBpcyBjcmVhdGVkIGFuZCBiZWZvcmUgYW55CisgKiBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQuCisgKgorICogU0VUX0xBWU9VVF9QT0xJQ1kgd2lsbCBsZXQgeW91IHNldCBhIGxheW91dCBwb2xpY3kgKGRlZmF1bHQgbGF5b3V0KQorICogb24gYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGFwcGx5IHRvIGFueSBuZXcgZmlsZXMgY3JlYXRlZCBpbiB0aGF0CisgKiBkaXJlY3RvcnkgKG9yIGFueSBjaGlsZCBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IHNwZWNpZnkgYSBsYXlvdXQgb2YKKyAqIGl0cyBvd24pLgorICovCisKKy8qIHVzZSB1NjQgdG8gYWxpZ24gc2FuZWx5IG9uIGFsbCBhcmNocyAqLwogc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0IHsKIAlfX3U2NCBzdHJpcGVfdW5pdCwgc3RyaXBlX2NvdW50LCBvYmplY3Rfc2l6ZTsKIAlfX3U2NCBkYXRhX3Bvb2w7CkBAIC0yMSw2ICs0NSw4IEBACiAJCQkJICAgc3RydWN0IGNlcGhfaW9jdGxfbGF5b3V0KQogCiAvKgorICogQ0VQSF9JT0NfR0VUX0RBVEFMT0MgLSBnZXQgbG9jYXRpb24gb2YgZmlsZSBkYXRhIGluIHRoZSBjbHVzdGVyCisgKgogICogRXh0cmFjdCBpZGVudGl0eSwgYWRkcmVzcyBvZiB0aGUgT1NEIGFuZCBvYmplY3Qgc3RvcmluZyBhIGdpdmVuCiAgKiBmaWxlIG9mZnNldC4KICAqLwpAQCAtMzksNyArNjUsMzQgQEAKICNkZWZpbmUgQ0VQSF9JT0NfR0VUX0RBVEFMT0MgX0lPV1IoQ0VQSF9JT0NUTF9NQUdJQywgMywJXAogCQkJCSAgIHN0cnVjdCBjZXBoX2lvY3RsX2RhdGFsb2MpCiAKKy8qCisgKiBDRVBIX0lPQ19MQVpZSU8gLSByZWxheCBjb25zaXN0ZW5jeQorICoKKyAqIE5vcm1hbGx5IENlcGggc3dpdGNoZXMgdG8gc3luY2hyb25vdXMgSU8gd2hlbiBtdWx0aXBsZSBjbGllbnRzIGhhdmUKKyAqIHRoZSBmaWxlIG9wZW4gKGFuZCBvciBtb3JlIGZvciB3cml0ZSkuICBSZWFkcyBhbmQgd3JpdGVzIGJ5cGFzcyB0aGUKKyAqIHBhZ2UgY2FjaGUgYW5kIGdvIGRpcmVjdGx5IHRvIHRoZSBPU0QuICBTZXR0aW5nIHRoaXMgZmxhZyBvbiBhIGZpbGUKKyAqIGRlc2NyaXB0b3Igd2lsbCBhbGxvdyBidWZmZXJlZCBJTyBmb3IgdGhpcyBmaWxlIGluIGNhc2VzIHdoZXJlIHRoZQorICogYXBwbGljYXRpb24ga25vd3MgaXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgbm9kZXMgKG9yIGRvZXNuJ3QKKyAqIGNhcmUpLgorICovCiAjZGVmaW5lIENFUEhfSU9DX0xBWllJTyBfSU8oQ0VQSF9JT0NUTF9NQUdJQywgNCkKKworLyoKKyAqIENFUEhfSU9DX1NZTkNJTyAtIGZvcmNlIHN5bmNocm9ub3VzIElPCisgKgorICogVGhpcyBpb2N0bCBzZXRzIGEgZmlsZSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBzeW5jaHJvbm91cyBJTyB0aGF0CisgKiBieXBhc3NlcyB0aGUgcGFnZSBjYWNoZSwgZXZlbiBpZiBpdCBpcyBub3QgbmVjZXNzYXJ5LiAgVGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIG9wcG9zaXRlIGJlaGF2aW9yIG9mIElPQ19MQVpZSU8uICBUaGlzIGZvcmNlcyB0aGUKKyAqIHNhbWUgcmVhZC93cml0ZSBwYXRoIGFzIGEgZmlsZSBvcGVuZWQgYnkgbXVsdGlwbGUgY2xpZW50cyB3aGVuIG9uZQorICogb3IgbW9yZSBvZiB0aG9zZSBjbGllbnRzIGlzIG9wZW5lZCBmb3Igd3JpdGUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgdHlwZSBvZiBzeW5jIElPIHRha2VzIGEgZGlmZmVyZW50IHBhdGggdGhhbiBhIGZpbGUKKyAqIG9wZW5lZCB3aXRoIE9fU1lOQy9EX1NZTkMgKHdyaXRlcyBoaXQgdGhlIHBhZ2UgY2FjaGUgYW5kIGFyZQorICogaW1tZWRpYXRlbHkgZmx1c2hlZCBvbiBwYWdlIGJvdW5kYXJpZXMpLiAgSXQgaXMgdmVyeSBzaW1pbGFyIHRvCisgKiBPX0RJUkVDVCAod3JpdGVzIGJ5cGFzcyB0aGUgcGFnZSBjYWNoZSkgZXhjZXAgdGhhdCBPX0RJUkVDVCB3cml0ZXMKKyAqIGFyZSBub3QgY29waWVkICh1c2VyIHBhZ2UgbXVzdCByZW1haW4gc3RhYmxlKSBhbmQgT19ESVJFQ1Qgd3JpdGVzCisgKiBoYXZlIGFsaWdubWVudCByZXN0cmljdGlvbnMgKG9uIHRoZSBidWZmZXIgYW5kIGZpbGUgb2Zmc2V0KS4KKyAqLwogI2RlZmluZSBDRVBIX0lPQ19TWU5DSU8gX0lPKENFUEhfSU9DVExfTUFHSUMsIDUpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCA4NmM1OWUxLi4yNjRhYjcwIDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtNjE5LDcgKzYxOSw3IEBACiAgKgogICogQ2FsbGVkIHVuZGVyIG1kc2MtPm11dGV4LgogICovCi1zdHJ1Y3QgZGVudHJ5ICpnZXRfbm9uc25hcF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9ub25zbmFwX3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJLyoKIAkgKiB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHByb3RlY3RpbmcgdGhlIGRfcGFyZW50IGFjY2VzcwpAQCAtNzY0LDcgKzc2NCw4IEBACiAJc3RydWN0IGNlcGhfbXNnICptc2c7CiAJc3RydWN0IGNlcGhfbWRzX3Nlc3Npb25faGVhZCAqaDsKIAotCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfU0VTU0lPTiwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfU0VTU0lPTiwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMsCisJCQkgICBmYWxzZSk7CiAJaWYgKCFtc2cpIHsKIAkJcHJfZXJyKCJjcmVhdGVfc2Vzc2lvbl9tc2cgRU5PTUVNIGNyZWF0aW5nIG1zZ1xuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTI0MCw3ICsxMjQxLDcgQEAKIAl3aGlsZSAoc2Vzc2lvbi0+c19udW1fY2FwX3JlbGVhc2VzIDwgc2Vzc2lvbi0+c19ucl9jYXBzICsgZXh0cmEpIHsKIAkJc3Bpbl91bmxvY2soJnNlc3Npb24tPnNfY2FwX2xvY2spOwogCQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0NBUFJFTEVBU0UsIFBBR0VfQ0FDSEVfU0laRSwKLQkJCQkgICBHRlBfTk9GUyk7CisJCQkJICAgR0ZQX05PRlMsIGZhbHNlKTsKIAkJaWYgKCFtc2cpCiAJCQlnb3RvIG91dF91bmxvY2tlZDsKIAkJZG91dCgiYWRkX2NhcF9yZWxlYXNlcyAlcCBtc2cgJXAgbm93ICVkXG4iLCBzZXNzaW9uLCBtc2csCkBAIC0xNjUyLDcgKzE2NTMsNyBAQAogCWlmIChyZXEtPnJfb2xkX2RlbnRyeV9kcm9wKQogCQlsZW4gKz0gcmVxLT5yX29sZF9kZW50cnktPmRfbmFtZS5sZW47CiAKLQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX1JFUVVFU1QsIGxlbiwgR0ZQX05PRlMpOworCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfUkVRVUVTVCwgbGVuLCBHRlBfTk9GUywgZmFsc2UpOwogCWlmICghbXNnKSB7CiAJCW1zZyA9IEVSUl9QVFIoLUVOT01FTSk7CiAJCWdvdG8gb3V0X2ZyZWUyOwpAQCAtMjAwMSw3ICsyMDAyLDcgQEAKIH0KIAogLyoKLSAqIEludmFsaWRhdGUgZGlyIElfQ09NUExFVEUsIGRlbnRyeSBsZWFzZSBzdGF0ZSBvbiBhbiBhYm9ydGVkIE1EUworICogSW52YWxpZGF0ZSBkaXIgRF9DT01QTEVURSwgZGVudHJ5IGxlYXNlIHN0YXRlIG9uIGFuIGFib3J0ZWQgTURTCiAgKiBuYW1lc3BhY2UgcmVxdWVzdC4KICAqLwogdm9pZCBjZXBoX2ludmFsaWRhdGVfZGlyX3JlcXVlc3Qoc3RydWN0IGNlcGhfbWRzX3JlcXVlc3QgKnJlcSkKQEAgLTIwMDksOSArMjAxMCw5IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+cl9sb2NrZWRfZGlyOwogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAKLQlkb3V0KCJpbnZhbGlkYXRlX2Rpcl9yZXF1ZXN0ICVwIChJX0NPTVBMRVRFLCBsZWFzZShzKSlcbiIsIGlub2RlKTsKKwlkb3V0KCJpbnZhbGlkYXRlX2Rpcl9yZXF1ZXN0ICVwIChEX0NPTVBMRVRFLCBsZWFzZShzKSlcbiIsIGlub2RlKTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCWNpLT5pX2NlcGhfZmxhZ3MgJj0gfkNFUEhfSV9DT01QTEVURTsKKwljZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShpbm9kZSk7CiAJY2ktPmlfcmVsZWFzZV9jb3VudCsrOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIApAQCAtMjUxOCw3ICsyNTE5LDcgQEAKIAkJZ290byBmYWlsX25vcGFnZWxpc3Q7CiAJY2VwaF9wYWdlbGlzdF9pbml0KHBhZ2VsaXN0KTsKIAotCXJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0NMSUVOVF9SRUNPTk5FQ1QsIDAsIEdGUF9OT0ZTKTsKKwlyZXBseSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19DTElFTlRfUkVDT05ORUNULCAwLCBHRlBfTk9GUywgZmFsc2UpOwogCWlmICghcmVwbHkpCiAJCWdvdG8gZmFpbF9ub21zZzsKIApAQCAtMjgzMSw3ICsyODMyLDcgQEAKIAlkbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAlsZW4gKz0gZG5hbWVsZW47CiAKLQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0xFQVNFLCBsZW4sIEdGUF9OT0ZTKTsKKwltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQ0xJRU5UX0xFQVNFLCBsZW4sIEdGUF9OT0ZTLCBmYWxzZSk7CiAJaWYgKCFtc2cpCiAJCXJldHVybjsKIAlsZWFzZSA9IG1zZy0+ZnJvbnQuaW92X2Jhc2U7CkBAIC0zMTUzLDcgKzMxNTQsNyBAQAogLyoKICAqIHRydWUgaWYgYWxsIHNlc3Npb25zIGFyZSBjbG9zZWQsIG9yIHdlIGZvcmNlIHVubW91bnQKICAqLwotYm9vbCBkb25lX2Nsb3Npbmdfc2Vzc2lvbnMoc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYykKK3N0YXRpYyBib29sIGRvbmVfY2xvc2luZ19zZXNzaW9ucyhzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjKQogewogCWludCBpLCBuID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zdXBlci5jIGIvZnMvY2VwaC9zdXBlci5jCmluZGV4IDg4YmFjYWYuLmE5MDg0NmYgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvc3VwZXIuYworKysgYi9mcy9jZXBoL3N1cGVyLmMKQEAgLTExNCw2ICsxMTQsNyBAQAogZW51bSB7CiAJT3B0X3dzaXplLAogCU9wdF9yc2l6ZSwKKwlPcHRfcmFzaXplLAogCU9wdF9jYXBzX3dhbnRlZF9kZWxheV9taW4sCiAJT3B0X2NhcHNfd2FudGVkX2RlbGF5X21heCwKIAlPcHRfY2FwX3JlbGVhc2Vfc2FmZXR5LApAQCAtMTM2LDYgKzEzNyw3IEBACiBzdGF0aWMgbWF0Y2hfdGFibGVfdCBmc29wdF90b2tlbnMgPSB7CiAJe09wdF93c2l6ZSwgIndzaXplPSVkIn0sCiAJe09wdF9yc2l6ZSwgInJzaXplPSVkIn0sCisJe09wdF9yYXNpemUsICJyYXNpemU9JWQifSwKIAl7T3B0X2NhcHNfd2FudGVkX2RlbGF5X21pbiwgImNhcHNfd2FudGVkX2RlbGF5X21pbj0lZCJ9LAogCXtPcHRfY2Fwc193YW50ZWRfZGVsYXlfbWF4LCAiY2Fwc193YW50ZWRfZGVsYXlfbWF4PSVkIn0sCiAJe09wdF9jYXBfcmVsZWFzZV9zYWZldHksICJjYXBfcmVsZWFzZV9zYWZldHk9JWQifSwKQEAgLTE5Niw2ICsxOTgsOSBAQAogCWNhc2UgT3B0X3JzaXplOgogCQlmc29wdC0+cnNpemUgPSBpbnR2YWw7CiAJCWJyZWFrOworCWNhc2UgT3B0X3Jhc2l6ZToKKwkJZnNvcHQtPnJhc2l6ZSA9IGludHZhbDsKKwkJYnJlYWs7CiAJY2FzZSBPcHRfY2Fwc193YW50ZWRfZGVsYXlfbWluOgogCQlmc29wdC0+Y2Fwc193YW50ZWRfZGVsYXlfbWluID0gaW50dmFsOwogCQlicmVhazsKQEAgLTI4OSwyOCArMjk0LDI5IEBACiAKIAlkb3V0KCJwYXJzZV9tb3VudF9vcHRpb25zICVwLCBkZXZfbmFtZSAnJXMnXG4iLCBmc29wdCwgZGV2X25hbWUpOwogCi0gICAgICAgIGZzb3B0LT5zYl9mbGFncyA9IGZsYWdzOwotICAgICAgICBmc29wdC0+ZmxhZ3MgPSBDRVBIX01PVU5UX09QVF9ERUZBVUxUOworCWZzb3B0LT5zYl9mbGFncyA9IGZsYWdzOworCWZzb3B0LT5mbGFncyA9IENFUEhfTU9VTlRfT1BUX0RFRkFVTFQ7CiAKLSAgICAgICAgZnNvcHQtPnJzaXplID0gQ0VQSF9SU0laRV9ERUZBVUxUOwotICAgICAgICBmc29wdC0+c25hcGRpcl9uYW1lID0ga3N0cmR1cChDRVBIX1NOQVBESVJOQU1FX0RFRkFVTFQsIEdGUF9LRVJORUwpOworCWZzb3B0LT5yc2l6ZSA9IENFUEhfUlNJWkVfREVGQVVMVDsKKwlmc29wdC0+cmFzaXplID0gQ0VQSF9SQVNJWkVfREVGQVVMVDsKKwlmc29wdC0+c25hcGRpcl9uYW1lID0ga3N0cmR1cChDRVBIX1NOQVBESVJOQU1FX0RFRkFVTFQsIEdGUF9LRVJORUwpOwogCWZzb3B0LT5jYXBzX3dhbnRlZF9kZWxheV9taW4gPSBDRVBIX0NBUFNfV0FOVEVEX0RFTEFZX01JTl9ERUZBVUxUOwogCWZzb3B0LT5jYXBzX3dhbnRlZF9kZWxheV9tYXggPSBDRVBIX0NBUFNfV0FOVEVEX0RFTEFZX01BWF9ERUZBVUxUOwotICAgICAgICBmc29wdC0+Y2FwX3JlbGVhc2Vfc2FmZXR5ID0gQ0VQSF9DQVBfUkVMRUFTRV9TQUZFVFlfREVGQVVMVDsKLSAgICAgICAgZnNvcHQtPm1heF9yZWFkZGlyID0gQ0VQSF9NQVhfUkVBRERJUl9ERUZBVUxUOwotICAgICAgICBmc29wdC0+bWF4X3JlYWRkaXJfYnl0ZXMgPSBDRVBIX01BWF9SRUFERElSX0JZVEVTX0RFRkFVTFQ7Ci0gICAgICAgIGZzb3B0LT5jb25nZXN0aW9uX2tiID0gZGVmYXVsdF9jb25nZXN0aW9uX2tiKCk7Ci0JCi0gICAgICAgIC8qIGlwMVs6cG9ydDFdWyxpcDJbOnBvcnQyXS4uLl06L3N1YmRpci9pbi9mcyAqLwotICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICBpZiAoIWRldl9uYW1lKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICAqcGF0aCA9IHN0cnN0cihkZXZfbmFtZSwgIjovIik7Ci0gICAgICAgIGlmICgqcGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJfZXJyKCJkZXZpY2UgbmFtZSBpcyBtaXNzaW5nIHBhdGggKG5vIDovIGluICVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X25hbWUpOwotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICB9CisJZnNvcHQtPmNhcF9yZWxlYXNlX3NhZmV0eSA9IENFUEhfQ0FQX1JFTEVBU0VfU0FGRVRZX0RFRkFVTFQ7CisJZnNvcHQtPm1heF9yZWFkZGlyID0gQ0VQSF9NQVhfUkVBRERJUl9ERUZBVUxUOworCWZzb3B0LT5tYXhfcmVhZGRpcl9ieXRlcyA9IENFUEhfTUFYX1JFQURESVJfQllURVNfREVGQVVMVDsKKwlmc29wdC0+Y29uZ2VzdGlvbl9rYiA9IGRlZmF1bHRfY29uZ2VzdGlvbl9rYigpOworCisJLyogaXAxWzpwb3J0MV1bLGlwMls6cG9ydDJdLi4uXTovc3ViZGlyL2luL2ZzICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWRldl9uYW1lKQorCQlnb3RvIG91dDsKKwkqcGF0aCA9IHN0cnN0cihkZXZfbmFtZSwgIjovIik7CisJaWYgKCpwYXRoID09IE5VTEwpIHsKKwkJcHJfZXJyKCJkZXZpY2UgbmFtZSBpcyBtaXNzaW5nIHBhdGggKG5vIDovIGluICVzKVxuIiwKKwkJCQlkZXZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KIAlkZXZfbmFtZV9lbmQgPSAqcGF0aDsKIAlkb3V0KCJkZXZpY2UgbmFtZSAnJS4qcydcbiIsIChpbnQpKGRldl9uYW1lX2VuZCAtIGRldl9uYW1lKSwgZGV2X25hbWUpOwogCkBAIC0zNzYsNiArMzgyLDggQEAKIAkJc2VxX3ByaW50ZihtLCAiLHdzaXplPSVkIiwgZnNvcHQtPndzaXplKTsKIAlpZiAoZnNvcHQtPnJzaXplICE9IENFUEhfUlNJWkVfREVGQVVMVCkKIAkJc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgZnNvcHQtPnJzaXplKTsKKwlpZiAoZnNvcHQtPnJhc2l6ZSAhPSBDRVBIX1JBU0laRV9ERUZBVUxUKQorCQlzZXFfcHJpbnRmKG0sICIscmFzaXplPSVkIiwgZnNvcHQtPnJzaXplKTsKIAlpZiAoZnNvcHQtPmNvbmdlc3Rpb25fa2IgIT0gZGVmYXVsdF9jb25nZXN0aW9uX2tiKCkpCiAJCXNlcV9wcmludGYobSwgIix3cml0ZV9jb25nZXN0aW9uX2tiPSVkIiwgZnNvcHQtPmNvbmdlc3Rpb25fa2IpOwogCWlmIChmc29wdC0+Y2Fwc193YW50ZWRfZGVsYXlfbWluICE9IENFUEhfQ0FQU19XQU5URURfREVMQVlfTUlOX0RFRkFVTFQpCkBAIC00MTgsMjQgKzQyNiwyNyBAQAogLyoKICAqIGNyZWF0ZSBhIG5ldyBmcyBjbGllbnQKICAqLwotc3RydWN0IGNlcGhfZnNfY2xpZW50ICpjcmVhdGVfZnNfY2xpZW50KHN0cnVjdCBjZXBoX21vdW50X29wdGlvbnMgKmZzb3B0LAorc3RhdGljIHN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqY3JlYXRlX2ZzX2NsaWVudChzdHJ1Y3QgY2VwaF9tb3VudF9vcHRpb25zICpmc29wdCwKIAkJCQkJc3RydWN0IGNlcGhfb3B0aW9ucyAqb3B0KQogewogCXN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjOworCWNvbnN0IHVuc2lnbmVkIHN1cHBvcnRlZF9mZWF0dXJlcyA9CisJCUNFUEhfRkVBVFVSRV9GTE9DSyB8CisJCUNFUEhfRkVBVFVSRV9ESVJMQVlPVVRIQVNIOworCWNvbnN0IHVuc2lnbmVkIHJlcXVpcmVkX2ZlYXR1cmVzID0gMDsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAogCWZzYyA9IGt6YWxsb2Moc2l6ZW9mKCpmc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZzYykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlmc2MtPmNsaWVudCA9IGNlcGhfY3JlYXRlX2NsaWVudChvcHQsIGZzYyk7CisJZnNjLT5jbGllbnQgPSBjZXBoX2NyZWF0ZV9jbGllbnQob3B0LCBmc2MsIHN1cHBvcnRlZF9mZWF0dXJlcywKKwkJCQkJIHJlcXVpcmVkX2ZlYXR1cmVzKTsKIAlpZiAoSVNfRVJSKGZzYy0+Y2xpZW50KSkgewogCQllcnIgPSBQVFJfRVJSKGZzYy0+Y2xpZW50KTsKIAkJZ290byBmYWlsOwogCX0KIAlmc2MtPmNsaWVudC0+ZXh0cmFfbW9uX2Rpc3BhdGNoID0gZXh0cmFfbW9uX2Rpc3BhdGNoOwotCWZzYy0+Y2xpZW50LT5zdXBwb3J0ZWRfZmVhdHVyZXMgfD0gQ0VQSF9GRUFUVVJFX0ZMT0NLIHwKLQkJQ0VQSF9GRUFUVVJFX0RJUkxBWU9VVEhBU0g7CiAJZnNjLT5jbGllbnQtPm1vbmMud2FudF9tZHNtYXAgPSAxOwogCiAJZnNjLT5tb3VudF9vcHRpb25zID0gZnNvcHQ7CkBAIC00OTEsNyArNTAyLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi12b2lkIGRlc3Ryb3lfZnNfY2xpZW50KHN0cnVjdCBjZXBoX2ZzX2NsaWVudCAqZnNjKQorc3RhdGljIHZvaWQgZGVzdHJveV9mc19jbGllbnQoc3RydWN0IGNlcGhfZnNfY2xpZW50ICpmc2MpCiB7CiAJZG91dCgiZGVzdHJveV9mc19jbGllbnQgJXBcbiIsIGZzYyk7CiAKQEAgLTc3NCwxMCArNzg1LDEwIEBACiB7CiAJaW50IGVycjsKIAotCS8qIHNldCByYV9wYWdlcyBiYXNlZCBvbiByc2l6ZSBtb3VudCBvcHRpb24/ICovCi0JaWYgKGZzYy0+bW91bnRfb3B0aW9ucy0+cnNpemUgPj0gUEFHRV9DQUNIRV9TSVpFKQorCS8qIHNldCByYV9wYWdlcyBiYXNlZCBvbiByYXNpemUgbW91bnQgb3B0aW9uPyAqLworCWlmIChmc2MtPm1vdW50X29wdGlvbnMtPnJhc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpCiAJCWZzYy0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9Ci0JCQkoZnNjLT5tb3VudF9vcHRpb25zLT5yc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpCisJCQkoZnNjLT5tb3VudF9vcHRpb25zLT5yYXNpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKQogCQkJPj4gUEFHRV9TSElGVDsKIAllbHNlCiAJCWZzYy0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9CmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmggYi9mcy9jZXBoL3N1cGVyLmgKaW5kZXggYTIzZWVkNS4uMDFiZjE4OSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5oCisrKyBiL2ZzL2NlcGgvc3VwZXIuaApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZSBjZXBoX3Rlc3RfbW91bnRfb3B0KGZzYywgb3B0KSBcCiAJKCEhKChmc2MpLT5tb3VudF9vcHRpb25zLT5mbGFncyAmIENFUEhfTU9VTlRfT1BUXyMjb3B0KSkKIAotI2RlZmluZSBDRVBIX1JTSVpFX0RFRkFVTFQgICAgICAgICAgICAgKDUxMioxMDI0KSAvKiByZWFkYWhlYWQgKi8KKyNkZWZpbmUgQ0VQSF9SU0laRV9ERUZBVUxUICAgICAgICAgICAgIDAgICAgICAgICAgIC8qIG1heCByZWFkIHNpemUgKi8KKyNkZWZpbmUgQ0VQSF9SQVNJWkVfREVGQVVMVCAgICAgICAgICAgICg4MTkyKjEwMjQpIC8qIHJlYWRhaGVhZCAqLwogI2RlZmluZSBDRVBIX01BWF9SRUFERElSX0RFRkFVTFQgICAgICAgIDEwMjQKICNkZWZpbmUgQ0VQSF9NQVhfUkVBRERJUl9CWVRFU19ERUZBVUxUICAoNTEyKjEwMjQpCiAjZGVmaW5lIENFUEhfU05BUERJUk5BTUVfREVGQVVMVCAgICAgICAgIi5zbmFwIgpAQCAtNDUsOCArNDYsOSBAQAogCWludCBmbGFnczsKIAlpbnQgc2JfZmxhZ3M7CiAKLQlpbnQgd3NpemU7Ci0JaW50IHJzaXplOyAgICAgICAgICAgIC8qIG1heCByZWFkYWhlYWQgKi8KKwlpbnQgd3NpemU7ICAgICAgICAgICAgLyogbWF4IHdyaXRlIHNpemUgKi8KKwlpbnQgcnNpemU7ICAgICAgICAgICAgLyogbWF4IHJlYWQgc2l6ZSAqLworCWludCByYXNpemU7ICAgICAgICAgICAvKiBtYXggcmVhZGFoZWFkICovCiAJaW50IGNvbmdlc3Rpb25fa2I7ICAgIC8qIG1heCB3cml0ZWJhY2sgaW4gZmxpZ2h0ICovCiAJaW50IGNhcHNfd2FudGVkX2RlbGF5X21pbiwgY2Fwc193YW50ZWRfZGVsYXlfbWF4OwogCWludCBjYXBfcmVsZWFzZV9zYWZldHk7CkBAIC0yMDEsNiArMjAzLDcgQEAKICAqIENlcGggZGVudHJ5IHN0YXRlCiAgKi8KIHN0cnVjdCBjZXBoX2RlbnRyeV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpsZWFzZV9zZXNzaW9uOwogCXUzMiBsZWFzZV9nZW4sIGxlYXNlX3NoYXJlZF9nZW47CiAJdTMyIGxlYXNlX3NlcTsKQEAgLTIxMSw2ICsyMTQsMTggQEAKIAl1NjQgb2Zmc2V0OwogfTsKIAorLyoKKyAqIGRlbnRyeSBmbGFncworICoKKyAqIFRoZSBsb2NraW5nIGZvciBEX0NPTVBMRVRFIGlzIGEgYml0IG9kZDoKKyAqICAtIHdlIGNhbiBjbGVhciBpdCBhdCBhbG1vc3QgYW55IHRpbWUgKHNlZSBjZXBoX2RfcHJ1bmUpCisgKiAgLSBpdCBpcyBvbmx5IG1lYW5pbmdmdWwgaWY6CisgKiAgICAtIHdlIGhvbGQgZGlyIGlub2RlIGlfbG9jaworICogICAgLSB3ZSBob2xkIGRpciBGSUxFX1NIQVJFRCBjYXBzCisgKiAgICAtIHRoZSBkZW50cnkgRF9DT01QTEVURSBpcyBzZXQKKyAqLworI2RlZmluZSBDRVBIX0RfQ09NUExFVEUgMSAgLyogaWYgc2V0LCBkX3UuZF9zdWJkaXJzIGlzIGNvbXBsZXRlIGRpcmVjdG9yeSAqLworCiBzdHJ1Y3QgY2VwaF9pbm9kZV94YXR0cnNfaW5mbyB7CiAJLyoKIAkgKiAoc3RpbGwgZW5jb2RlZCkgeGF0dHIgYmxvYi4gd2UgYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHBhcnNpbmcKQEAgLTI0OSw3ICsyNjQsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyBpX3JjdGltZTsKIAl1NjQgaV9yYnl0ZXMsIGlfcmZpbGVzLCBpX3JzdWJkaXJzOwogCXU2NCBpX2ZpbGVzLCBpX3N1YmRpcnM7Ci0JdTY0IGlfbWF4X29mZnNldDsgIC8qIGxhcmdlc3QgcmVhZGRpciBvZmZzZXQsIHNldCB3aXRoIElfQ09NUExFVEUgKi8KKwl1NjQgaV9tYXhfb2Zmc2V0OyAgLyogbGFyZ2VzdCByZWFkZGlyIG9mZnNldCwgc2V0IHdpdGggRF9DT01QTEVURSAqLwogCiAJc3RydWN0IHJiX3Jvb3QgaV9mcmFndHJlZTsKIAlzdHJ1Y3QgbXV0ZXggaV9mcmFndHJlZV9tdXRleDsKQEAgLTM0NCw5ICszNTksMTAgQEAKICAqIHg4Nl82NCtpbm8zMiAgNjQgICAgICAgICAgICAgICAgICAgICAzMgogICogeDg2XzY0ICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgIDY0CiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGNlcGhfaW5vX3RvX2lubzMyKGlub190IGlubykKK3N0YXRpYyBpbmxpbmUgdTMyIGNlcGhfaW5vX3RvX2lubzMyKF9fdTY0IHZpbm8pCiB7Ci0JaW5vIF49IGlubyA+PiAoc2l6ZW9mKGlubykgKiA4IC0gMzIpOworCXUzMiBpbm8gPSB2aW5vICYgMHhmZmZmZmZmZjsKKwlpbm8gXj0gdmlubyA+PiAzMjsKIAlpZiAoIWlubykKIAkJaW5vID0gMTsKIAlyZXR1cm4gaW5vOwpAQCAtMzU3LDExICszNzMsMTEgQEAKICAqLwogc3RhdGljIGlubGluZSBpbm9fdCBjZXBoX3Zpbm9fdG9faW5vKHN0cnVjdCBjZXBoX3Zpbm8gdmlubykKIHsKLQlpbm9fdCBpbm8gPSAoaW5vX3Qpdmluby5pbm87ICAvKiBeICh2aW5vLnNuYXAgPDwgMjApOyAqLwogI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKLQlpbm8gPSBjZXBoX2lub190b19pbm8zMihpbm8pOworCXJldHVybiBjZXBoX2lub190b19pbm8zMih2aW5vLmlubyk7CisjZWxzZQorCXJldHVybiAoaW5vX3Qpdmluby5pbm87CiAjZW5kaWYKLQlyZXR1cm4gaW5vOwogfQogCiAvKgpAQCAtNDEzLDcgKzQyOSw2IEBACiAvKgogICogQ2VwaCBpbm9kZS4KICAqLwotI2RlZmluZSBDRVBIX0lfQ09NUExFVEUgIDEgIC8qIHdlIGhhdmUgY29tcGxldGUgZGlyZWN0b3J5IGNhY2hlZCAqLwogI2RlZmluZSBDRVBIX0lfTk9ERUxBWSAgIDQgIC8qIGRvIG5vdCBkZWxheSBjYXAgcmVsZWFzZSAqLwogI2RlZmluZSBDRVBIX0lfRkxVU0ggICAgIDggIC8qIGRvIG5vdCBkZWxheSBmbHVzaCBvZiBkaXJ0eSBtZXRhZGF0YSAqLwogI2RlZmluZSBDRVBIX0lfTk9GTFVTSCAgMTYgIC8qIGRvIG5vdCBmbHVzaCBkaXJ0eSBjYXBzICovCkBAIC00NzEsNiArNDg2LDEzIEBACiB9CiAKIC8qCisgKiBzZXQvY2xlYXIgZGlyZWN0b3J5IERfQ09NUExFVEUgZmxhZworICovCit2b2lkIGNlcGhfZGlyX3NldF9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3ZvaWQgY2VwaF9kaXJfY2xlYXJfY29tcGxldGUoc3RydWN0IGlub2RlICppbm9kZSk7Citib29sIGNlcGhfZGlyX3Rlc3RfY29tcGxldGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKKy8qCiAgKiBjYXBzIGhlbHBlcnMKICAqLwogc3RhdGljIGlubGluZSBib29sIF9fY2VwaF9pc19hbnlfcmVhbF9jYXBzKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9SRUFETUUgYi9mcy9jaWZzL1JFQURNRQppbmRleCBjNWMyYzVlLi44OTVkYTFkIDEwMDY0NAotLS0gYS9mcy9jaWZzL1JFQURNRQorKysgYi9mcy9jaWZzL1JFQURNRQpAQCAtNzQ1LDQgKzc0NSwxOCBAQAogY3JlYXRlIGNpZnMuc3BuZWdvICogKiAvdXNyL2xvY2FsL3NiaW4vY2lmcy51cGNhbGwgJWsKIGNyZWF0ZSBkbnNfcmVzb2x2ZXIgKiAqIC91c3IvbG9jYWwvc2Jpbi9jaWZzLnVwY2FsbCAlawogCitDSUZTIGtlcm5lbCBtb2R1bGUgcGFyYW1ldGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZXNlIG1vZHVsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgb3IgbW9kaWZpZWQgZWl0aGVyIGR1cmluZyB0aGUgdGltZSBvZgorbW9kdWxlIGxvYWRpbmcgb3IgZHVyaW5nIHRoZSBydW50aW1lIGJ5IHVzaW5nIHRoZSBpbnRlcmZhY2UKKwkvcHJvYy9tb2R1bGUvY2lmcy9wYXJhbWV0ZXJzLzxwYXJhbT4KKworaS5lLiBlY2hvICJ2YWx1ZSIgPiAvc3lzL21vZHVsZS9jaWZzL3BhcmFtZXRlcnMvPHBhcmFtPgorCisxLiBlY2hvX3JldHJpZXMgLSBUaGUgbnVtYmVyIG9mIGVjaG8gYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cCBhbmQKKwkJICByZWNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlci4gVGhlIGRlZmF1bHQgaXMgNS4gVGhlIHZhbHVlIDAKKwkJICBtZWFucyBuZXZlciByZWNvbm5lY3QuCisKKzIuIGVuYWJsZV9vcGxvY2tzIC0gRW5hYmxlIG9yIGRpc2FibGUgb3Bsb2Nrcy4gT3Bsb2NrcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorCQkgICAgW1kveS8xXS4gVG8gZGlzYWJsZSB1c2UgYW55IG9mIFtOL24vMF0uCiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKaW5kZXggNmQ0MDY1Ni4uODRlOGMwNyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX2RlYnVnLmMKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiBzdGF0aWMgaW50IGNpZnNfb3Bsb2NrX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc2VxX3ByaW50ZihtLCAiJWRcbiIsIG9wbG9ja0VuYWJsZWQpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBlbmFibGVfb3Bsb2Nrcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyNiwxMyArNTI2LDE2IEBACiAJY2hhciBjOwogCWludCByYzsKIAorCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFRoZSAvcHJvYy9mcy9jaWZzL09wbG9ja0VuYWJsZWQgaW50ZXJmYWNlICIKKwkgICAgICAgIndpbGwgYmUgcmVtb3ZlZCBpbiBrZXJuZWwgdmVyc2lvbiAzLjQuIFBsZWFzZSBtaWdyYXRlIHRvICIKKwkgICAgICAgInVzaW5nIHRoZSAnZW5hYmxlX29wbG9ja3MnIG1vZHVsZSBwYXJhbWV0ZXIgaW4gY2lmcy5rby5cbiIpOwogCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCi0JCW9wbG9ja0VuYWJsZWQgPSAwOworCQllbmFibGVfb3Bsb2NrcyA9IGZhbHNlOwogCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQotCQlvcGxvY2tFbmFibGVkID0gMTsKKwkJZW5hYmxlX29wbG9ja3MgPSB0cnVlOwogCiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2ZzX3NiLmggYi9mcy9jaWZzL2NpZnNfZnNfc2IuaAppbmRleCA3MjYwZTExLi41MDBkNjU4IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfZnNfc2IuaAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtNDMsNiArNDMsOCBAQAogI2RlZmluZSBDSUZTX01PVU5UX1NUUklDVF9JTwkweDQwMDAwIC8qIHN0cmljdCBjYWNoZSBtb2RlICovCiAjZGVmaW5lIENJRlNfTU9VTlRfUldQSURGT1JXQVJECTB4ODAwMDAgLyogdXNlIHBpZCBmb3J3YXJkaW5nIGZvciBydyAqLwogI2RlZmluZSBDSUZTX01PVU5UX1BPU0lYQUNMCTB4MTAwMDAwIC8qIG1pcnJvciBvZiBNU19QT1NJWEFDTCBpbiBtbnRfY2lmc19mbGFncyAqLworI2RlZmluZSBDSUZTX01PVU5UX0NJRlNfQkFDS1VQVUlEIDB4MjAwMDAwIC8qIGJhY2t1cCBpbnRlbnQgYml0IGZvciBhIHVzZXIgKi8KKyNkZWZpbmUgQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUEdJRCAweDQwMDAwMCAvKiBiYWNrdXAgaW50ZW50IGJpdCBmb3IgYSBncm91cCAqLwogCiBzdHJ1Y3QgY2lmc19zYl9pbmZvIHsKIAlzdHJ1Y3QgcmJfcm9vdCB0bGlua190cmVlOwpAQCAtNTUsNiArNTcsOCBAQAogCWF0b21pY190IGFjdGl2ZTsKIAl1aWRfdAltbnRfdWlkOwogCWdpZF90CW1udF9naWQ7CisJdWlkX3QJbW50X2JhY2t1cHVpZDsKKwlnaWRfdAltbnRfYmFja3VwZ2lkOwogCW1vZGVfdAltbnRfZmlsZV9tb2RlOwogCW1vZGVfdAltbnRfZGlyX21vZGU7CiAJdW5zaWduZWQgaW50IG1udF9jaWZzX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzYWNsLmMgYi9mcy9jaWZzL2NpZnNhY2wuYwppbmRleCBkMGY1OWZhLi43MmRkZjIzIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNhY2wuYworKysgYi9mcy9jaWZzL2NpZnNhY2wuYwpAQCAtOTEsOSArOTEsNzYgQEAKIAlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKIAlzcGluX3VubG9jaygmc2lkZ2lkbG9jayk7CiAKKwlyb290ID0gJnNpZHVpZHRyZWU7CisJc3Bpbl9sb2NrKCZ1aWRzaWRsb2NrKTsKKwlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKKwlzcGluX3VubG9jaygmdWlkc2lkbG9jayk7CisKKwlyb290ID0gJnNpZGdpZHRyZWU7CisJc3Bpbl9sb2NrKCZnaWRzaWRsb2NrKTsKKwlzaHJpbmtfaWRtYXBfdHJlZShyb290LCBucl90b19zY2FuLCAmbnJfcmVtLCAmbnJfZGVsKTsKKwlzcGluX3VubG9jaygmZ2lkc2lkbG9jayk7CisKIAlyZXR1cm4gbnJfcmVtOwogfQogCitzdGF0aWMgdm9pZAorc2lkX3JiX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBjaWQsCisJCXN0cnVjdCBjaWZzX3NpZF9pZCAqKnBzaWRpZCwgY2hhciAqdHlwZXN0cikKK3sKKwljaGFyICpzdHJwdHI7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICoqbGlua3RvID0gJihyb290LT5yYl9ub2RlKTsKKwlzdHJ1Y3QgY2lmc19zaWRfaWQgKmxzaWRpZDsKKworCXdoaWxlIChub2RlKSB7CisJCWxzaWRpZCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBjaWZzX3NpZF9pZCwgcmJub2RlKTsKKwkJcGFyZW50ID0gbm9kZTsKKwkJaWYgKGNpZCA+IGxzaWRpZC0+aWQpIHsKKwkJCWxpbmt0byA9ICYobm9kZS0+cmJfbGVmdCk7CisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJfQorCQlpZiAoY2lkIDwgbHNpZGlkLT5pZCkgeworCQkJbGlua3RvID0gJihub2RlLT5yYl9yaWdodCk7CisJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCX0KKwl9CisKKwkoKnBzaWRpZCktPmlkID0gY2lkOworCSgqcHNpZGlkKS0+dGltZSA9IGppZmZpZXMgLSAoU0lEX01BUF9SRVRSWSArIDEpOworCSgqcHNpZGlkKS0+cmVmY291bnQgPSAwOworCisJc3ByaW50ZigoKnBzaWRpZCktPnNpZHN0ciwgIiVzIiwgdHlwZXN0cik7CisJc3RycHRyID0gKCpwc2lkaWQpLT5zaWRzdHIgKyBzdHJsZW4oKCpwc2lkaWQpLT5zaWRzdHIpOworCXNwcmludGYoc3RycHRyLCAiJWxkIiwgY2lkKTsKKworCWNsZWFyX2JpdChTSURfSURfUEVORElORywgJigqcHNpZGlkKS0+c3RhdGUpOworCWNsZWFyX2JpdChTSURfSURfTUFQUEVELCAmKCpwc2lkaWQpLT5zdGF0ZSk7CisKKwlyYl9saW5rX25vZGUoJigqcHNpZGlkKS0+cmJub2RlLCBwYXJlbnQsIGxpbmt0byk7CisJcmJfaW5zZXJ0X2NvbG9yKCYoKnBzaWRpZCktPnJibm9kZSwgcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2lmc19zaWRfaWQgKgorc2lkX3JiX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBjaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBjaWZzX3NpZF9pZCAqbHNpZGlkOworCisJd2hpbGUgKG5vZGUpIHsKKwkJbHNpZGlkID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGNpZnNfc2lkX2lkLCByYm5vZGUpOworCQlpZiAoY2lkID4gbHNpZGlkLT5pZCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChjaWQgPCBsc2lkaWQtPmlkKQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlIC8qIG5vZGUgZm91bmQgKi8KKwkJCXJldHVybiBsc2lkaWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgY2lmc19zaHJpbmtlciA9IHsKIAkuc2hyaW5rID0gY2lmc19pZG1hcF9zaHJpbmtlciwKIAkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLApAQCAtMTEwLDYgKzE3Nyw3IEBACiAKIAltZW1jcHkocGF5bG9hZCwgZGF0YSwgZGF0YWxlbik7CiAJa2V5LT5wYXlsb2FkLmRhdGEgPSBwYXlsb2FkOworCWtleS0+ZGF0YWxlbiA9IGRhdGFsZW47CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNCw2ICsyOTIsMTIwIEBACiB9CiAKIHN0YXRpYyBpbnQKK2lkX3RvX3NpZCh1bnNpZ25lZCBsb25nIGNpZCwgdWludCBzaWR0eXBlLCBzdHJ1Y3QgY2lmc19zaWQgKnNzaWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qga2V5ICpzaWRrZXk7CisJY29uc3Qgc3RydWN0IGNyZWQgKnNhdmVkX2NyZWQ7CisJc3RydWN0IGNpZnNfc2lkICpsc2lkOworCXN0cnVjdCBjaWZzX3NpZF9pZCAqcHNpZGlkLCAqbnBzaWRpZDsKKwlzdHJ1Y3QgcmJfcm9vdCAqY2lkdHJlZTsKKwlzcGlubG9ja190ICpjaWRsb2NrOworCisJaWYgKHNpZHR5cGUgPT0gU0lET1dORVIpIHsKKwkJY2lkbG9jayA9ICZzaWR1aWRsb2NrOworCQljaWR0cmVlID0gJnVpZHRyZWU7CisJfSBlbHNlIGlmIChzaWR0eXBlID09IFNJREdST1VQKSB7CisJCWNpZGxvY2sgPSAmc2lkZ2lkbG9jazsKKwkJY2lkdHJlZSA9ICZnaWR0cmVlOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jayhjaWRsb2NrKTsKKwlwc2lkaWQgPSBzaWRfcmJfc2VhcmNoKGNpZHRyZWUsIGNpZCk7CisKKwlpZiAoIXBzaWRpZCkgeyAvKiBub2RlIGRvZXMgbm90IGV4aXN0LCBhbGxvY2F0ZSBvbmUgJiBhdHRlbXB0IGFkZGluZyAqLworCQlzcGluX3VubG9jayhjaWRsb2NrKTsKKwkJbnBzaWRpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaWZzX3NpZF9pZCksIEdGUF9LRVJORUwpOworCQlpZiAoIW5wc2lkaWQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlucHNpZGlkLT5zaWRzdHIgPSBrbWFsbG9jKFNJRExFTiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbnBzaWRpZC0+c2lkc3RyKSB7CisJCQlrZnJlZShucHNpZGlkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc3Bpbl9sb2NrKGNpZGxvY2spOworCQlwc2lkaWQgPSBzaWRfcmJfc2VhcmNoKGNpZHRyZWUsIGNpZCk7CisJCWlmIChwc2lkaWQpIHsgLyogbm9kZSBoYXBwZW5lZCB0byBnZXQgaW5zZXJ0ZWQgbWVhbndoaWxlICovCisJCQkrK3BzaWRpZC0+cmVmY291bnQ7CisJCQlzcGluX3VubG9jayhjaWRsb2NrKTsKKwkJCWtmcmVlKG5wc2lkaWQtPnNpZHN0cik7CisJCQlrZnJlZShucHNpZGlkKTsKKwkJfSBlbHNlIHsKKwkJCXBzaWRpZCA9IG5wc2lkaWQ7CisJCQlzaWRfcmJfaW5zZXJ0KGNpZHRyZWUsIGNpZCwgJnBzaWRpZCwKKwkJCQkJc2lkdHlwZSA9PSBTSURPV05FUiA/ICJvaToiIDogImdpOiIpOworCQkJKytwc2lkaWQtPnJlZmNvdW50OworCQkJc3Bpbl91bmxvY2soY2lkbG9jayk7CisJCX0KKwl9IGVsc2UgeworCQkrK3BzaWRpZC0+cmVmY291bnQ7CisJCXNwaW5fdW5sb2NrKGNpZGxvY2spOworCX0KKworCS8qCisJICogSWYgd2UgYXJlIGhlcmUsIGl0IGlzIHNhZmUgdG8gYWNjZXNzIHBzaWRpZCBhbmQgaXRzIGZpZWxkcworCSAqIHNpbmNlIGEgcmVmZXJlbmNlIHdhcyB0YWtlbiBlYXJsaWVyIHdoaWxlIGhvbGRpbmcgdGhlIHNwaW5sb2NrLgorCSAqIEEgcmVmZXJlbmNlIG9uIHRoZSBub2RlIGlzIHB1dCB3aXRob3V0IGhvbGRpbmcgdGhlIHNwaW5sb2NrCisJICogYW5kIGl0IGlzIE9LIHRvIGRvIHNvIGluIHRoaXMgY2FzZSwgc2hyaW5rZXIgd2lsbCBub3QgZXJhc2UKKwkgKiB0aGlzIG5vZGUgdW50aWwgYWxsIHJlZmVyZW5jZXMgYXJlIHB1dCBhbmQgd2UgZG8gbm90IGFjY2VzcworCSAqIGFueSBmaWVsZHMgb2YgdGhlIG5vZGUgYWZ0ZXIgYSByZWZlcmVuY2UgaXMgcHV0IC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoU0lEX0lEX01BUFBFRCwgJnBzaWRpZC0+c3RhdGUpKSB7CisJCW1lbWNweShzc2lkLCAmcHNpZGlkLT5zaWQsIHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKKwkJcHNpZGlkLT50aW1lID0gamlmZmllczsgLyogdXBkYXRlIHRzIGZvciBhY2Nlc3NpbmcgKi8KKwkJZ290byBpZF9zaWRfb3V0OworCX0KKworCWlmICh0aW1lX2FmdGVyKHBzaWRpZC0+dGltZSArIFNJRF9NQVBfUkVUUlksIGppZmZpZXMpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBpZF9zaWRfb3V0OworCX0KKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChTSURfSURfUEVORElORywgJnBzaWRpZC0+c3RhdGUpKSB7CisJCXNhdmVkX2NyZWQgPSBvdmVycmlkZV9jcmVkcyhyb290X2NyZWQpOworCQlzaWRrZXkgPSByZXF1ZXN0X2tleSgmY2lmc19pZG1hcF9rZXlfdHlwZSwgcHNpZGlkLT5zaWRzdHIsICIiKTsKKwkJaWYgKElTX0VSUihzaWRrZXkpKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQljRllJKDEsICIlczogQ2FuJ3QgbWFwIGFuZCBpZCB0byBhIFNJRCIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCWxzaWQgPSAoc3RydWN0IGNpZnNfc2lkICopc2lka2V5LT5wYXlsb2FkLmRhdGE7CisJCQltZW1jcHkoJnBzaWRpZC0+c2lkLCBsc2lkLAorCQkJCXNpZGtleS0+ZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpID8KKwkJCQlzaWRrZXktPmRhdGFsZW4gOiBzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQltZW1jcHkoc3NpZCwgJnBzaWRpZC0+c2lkLAorCQkJCXNpZGtleS0+ZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpID8KKwkJCQlzaWRrZXktPmRhdGFsZW4gOiBzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQlzZXRfYml0KFNJRF9JRF9NQVBQRUQsICZwc2lkaWQtPnN0YXRlKTsKKwkJCWtleV9wdXQoc2lka2V5KTsKKwkJCWtmcmVlKHBzaWRpZC0+c2lkc3RyKTsKKwkJfQorCQlwc2lkaWQtPnRpbWUgPSBqaWZmaWVzOyAvKiB1cGRhdGUgdHMgZm9yIGFjY2Vzc2luZyAqLworCQlyZXZlcnRfY3JlZHMoc2F2ZWRfY3JlZCk7CisJCWNsZWFyX2JpdChTSURfSURfUEVORElORywgJnBzaWRpZC0+c3RhdGUpOworCQl3YWtlX3VwX2JpdCgmcHNpZGlkLT5zdGF0ZSwgU0lEX0lEX1BFTkRJTkcpOworCX0gZWxzZSB7CisJCXJjID0gd2FpdF9vbl9iaXQoJnBzaWRpZC0+c3RhdGUsIFNJRF9JRF9QRU5ESU5HLAorCQkJCXNpZGlkX3BlbmRpbmdfd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHJjKSB7CisJCQljRllJKDEsICIlczogc2lkaWRfcGVuZGluZ193YWl0IGludGVycnVwdGVkICVkIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCS0tcHNpZGlkLT5yZWZjb3VudDsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpZiAodGVzdF9iaXQoU0lEX0lEX01BUFBFRCwgJnBzaWRpZC0+c3RhdGUpKQorCQkJbWVtY3B5KHNzaWQsICZwc2lkaWQtPnNpZCwgc2l6ZW9mKHN0cnVjdCBjaWZzX3NpZCkpOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJfQoraWRfc2lkX291dDoKKwktLXBzaWRpZC0+cmVmY291bnQ7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CiBzaWRfdG9faWQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IGNpZnNfc2lkICpwc2lkLAogCQlzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIsIHVpbnQgc2lkdHlwZSkKIHsKQEAgLTM4Myw2ICs1NjUsMTAgQEAKIAlzcGluX2xvY2tfaW5pdCgmc2lkZ2lkbG9jayk7CiAJZ2lkdHJlZSA9IFJCX1JPT1Q7CiAKKwlzcGluX2xvY2tfaW5pdCgmdWlkc2lkbG9jayk7CisJc2lkdWlkdHJlZSA9IFJCX1JPT1Q7CisJc3Bpbl9sb2NrX2luaXQoJmdpZHNpZGxvY2spOworCXNpZGdpZHRyZWUgPSBSQl9ST09UOwogCXJlZ2lzdGVyX3Nocmlua2VyKCZjaWZzX3Nocmlua2VyKTsKIAogCWNGWUkoMSwgImNpZnMgaWRtYXAga2V5cmluZzogJWRcbiIsIGtleV9zZXJpYWwoa2V5cmluZykpOwpAQCAtNDIyLDYgKzYwOCwxOCBAQAogCXdoaWxlICgobm9kZSA9IHJiX2ZpcnN0KHJvb3QpKSkKIAkJcmJfZXJhc2Uobm9kZSwgcm9vdCk7CiAJc3Bpbl91bmxvY2soJnNpZGdpZGxvY2spOworCisJcm9vdCA9ICZzaWR1aWR0cmVlOworCXNwaW5fbG9jaygmdWlkc2lkbG9jayk7CisJd2hpbGUgKChub2RlID0gcmJfZmlyc3Qocm9vdCkpKQorCQlyYl9lcmFzZShub2RlLCByb290KTsKKwlzcGluX3VubG9jaygmdWlkc2lkbG9jayk7CisKKwlyb290ID0gJnNpZGdpZHRyZWU7CisJc3Bpbl9sb2NrKCZnaWRzaWRsb2NrKTsKKwl3aGlsZSAoKG5vZGUgPSByYl9maXJzdChyb290KSkpCisJCXJiX2VyYXNlKG5vZGUsIHJvb3QpOworCXNwaW5fdW5sb2NrKCZnaWRzaWRsb2NrKTsKIH0KIAogLyogaWYgdGhlIHR3byBTSURzIChyb3VnaGx5IGVxdWl2YWxlbnQgdG8gYSBVVUlEIGZvciBhIHVzZXIgb3IgZ3JvdXApIGFyZQpAQCAtNzA2LDcgKzkwNCw3IEBACiAJYWNsX3NpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfYWNsKTsKIAogCW51bV9hY2VzID0gbGUzMl90b19jcHUocGRhY2wtPm51bV9hY2VzKTsKLQlpZiAobnVtX2FjZXMgID4gMCkgeworCWlmIChudW1fYWNlcyA+IDApIHsKIAkJdW1vZGVfdCB1c2VyX21hc2sgPSBTX0lSV1hVOwogCQl1bW9kZV90IGdyb3VwX21hc2sgPSBTX0lSV1hHOwogCQl1bW9kZV90IG90aGVyX21hc2sgPSBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE87CkBAIC04NjgsNTIgKzEwNjYsODIgQEAKIAllbHNlCiAJCWNGWUkoMSwgIm5vIEFDTCIpOyAvKiBCQiBncmFudCBhbGwgb3IgZGVmYXVsdCBwZXJtcz8gKi8KIAotLyoJY2lmc2NyZWQtPnVpZCA9IG93bmVyX3NpZF9wdHItPnJpZDsKLQljaWZzY3JlZC0+Z2lkID0gZ3JvdXBfc2lkX3B0ci0+cmlkOwotCW1lbWNweSgodm9pZCAqKSgmKGNpZnNjcmVkLT5vc2lkKSksICh2b2lkICopb3duZXJfc2lkX3B0ciwKLQkJCXNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKLQltZW1jcHkoKHZvaWQgKikoJihjaWZzY3JlZC0+Z3NpZCkpLCAodm9pZCAqKWdyb3VwX3NpZF9wdHIsCi0JCQlzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7ICovCi0KIAlyZXR1cm4gcmM7CiB9CiAKLQogLyogQ29udmVydCBwZXJtaXNzaW9uIGJpdHMgZnJvbSBtb2RlIHRvIGVxdWl2YWxlbnQgQ0lGUyBBQ0wgKi8KIHN0YXRpYyBpbnQgYnVpbGRfc2VjX2Rlc2Moc3RydWN0IGNpZnNfbnRzZCAqcG50c2QsIHN0cnVjdCBjaWZzX250c2QgKnBubnRzZCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCBubW9kZSkKKwlfX3UzMiBzZWNkZXNjbGVuLCBfX3U2NCBubW9kZSwgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGludCAqYWNsZmxhZykKIHsKIAlpbnQgcmMgPSAwOwogCV9fdTMyIGRhY2xvZmZzZXQ7CiAJX191MzIgbmRhY2xvZmZzZXQ7CiAJX191MzIgc2lkc29mZnNldDsKIAlzdHJ1Y3QgY2lmc19zaWQgKm93bmVyX3NpZF9wdHIsICpncm91cF9zaWRfcHRyOworCXN0cnVjdCBjaWZzX3NpZCAqbm93bmVyX3NpZF9wdHIsICpuZ3JvdXBfc2lkX3B0cjsKIAlzdHJ1Y3QgY2lmc19hY2wgKmRhY2xfcHRyID0gTlVMTDsgIC8qIG5vIG5lZWQgZm9yIFNBQ0wgcHRyICovCiAJc3RydWN0IGNpZnNfYWNsICpuZGFjbF9wdHIgPSBOVUxMOyAvKiBubyBuZWVkIGZvciBTQUNMIHB0ciAqLwogCi0JaWYgKChpbm9kZSA9PSBOVUxMKSB8fCAocG50c2QgPT0gTlVMTCkgfHwgKHBubnRzZCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlvd25lcl9zaWRfcHRyID0gKHN0cnVjdCBjaWZzX3NpZCAqKSgoY2hhciAqKXBudHNkICsKKwlpZiAobm1vZGUgIT0gTk9fQ0hBTkdFXzY0KSB7IC8qIGNobW9kICovCisJCW93bmVyX3NpZF9wdHIgPSAoc3RydWN0IGNpZnNfc2lkICopKChjaGFyICopcG50c2QgKwogCQkJCWxlMzJfdG9fY3B1KHBudHNkLT5vc2lkb2Zmc2V0KSk7Ci0JZ3JvdXBfc2lkX3B0ciA9IChzdHJ1Y3QgY2lmc19zaWQgKikoKGNoYXIgKilwbnRzZCArCisJCWdyb3VwX3NpZF9wdHIgPSAoc3RydWN0IGNpZnNfc2lkICopKChjaGFyICopcG50c2QgKwogCQkJCWxlMzJfdG9fY3B1KHBudHNkLT5nc2lkb2Zmc2V0KSk7CisJCWRhY2xvZmZzZXQgPSBsZTMyX3RvX2NwdShwbnRzZC0+ZGFjbG9mZnNldCk7CisJCWRhY2xfcHRyID0gKHN0cnVjdCBjaWZzX2FjbCAqKSgoY2hhciAqKXBudHNkICsgZGFjbG9mZnNldCk7CisJCW5kYWNsb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjaWZzX250c2QpOworCQluZGFjbF9wdHIgPSAoc3RydWN0IGNpZnNfYWNsICopKChjaGFyICopcG5udHNkICsgbmRhY2xvZmZzZXQpOworCQluZGFjbF9wdHItPnJldmlzaW9uID0gZGFjbF9wdHItPnJldmlzaW9uOworCQluZGFjbF9wdHItPnNpemUgPSAwOworCQluZGFjbF9wdHItPm51bV9hY2VzID0gMDsKIAotCWRhY2xvZmZzZXQgPSBsZTMyX3RvX2NwdShwbnRzZC0+ZGFjbG9mZnNldCk7Ci0JZGFjbF9wdHIgPSAoc3RydWN0IGNpZnNfYWNsICopKChjaGFyICopcG50c2QgKyBkYWNsb2Zmc2V0KTsKLQotCW5kYWNsb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjaWZzX250c2QpOwotCW5kYWNsX3B0ciA9IChzdHJ1Y3QgY2lmc19hY2wgKikoKGNoYXIgKilwbm50c2QgKyBuZGFjbG9mZnNldCk7Ci0JbmRhY2xfcHRyLT5yZXZpc2lvbiA9IGRhY2xfcHRyLT5yZXZpc2lvbjsKLQluZGFjbF9wdHItPnNpemUgPSAwOwotCW5kYWNsX3B0ci0+bnVtX2FjZXMgPSAwOwotCi0JcmMgPSBzZXRfY2htb2RfZGFjbChuZGFjbF9wdHIsIG93bmVyX3NpZF9wdHIsIGdyb3VwX3NpZF9wdHIsIG5tb2RlKTsKLQotCXNpZHNvZmZzZXQgPSBuZGFjbG9mZnNldCArIGxlMTZfdG9fY3B1KG5kYWNsX3B0ci0+c2l6ZSk7Ci0KLQkvKiBjb3B5IHNlY3VyaXR5IGRlc2NyaXB0b3IgY29udHJvbCBwb3J0aW9uIGFuZCBvd25lciBhbmQgZ3JvdXAgc2lkICovCi0JY29weV9zZWNfZGVzYyhwbnRzZCwgcG5udHNkLCBzaWRzb2Zmc2V0KTsKKwkJcmMgPSBzZXRfY2htb2RfZGFjbChuZGFjbF9wdHIsIG93bmVyX3NpZF9wdHIsIGdyb3VwX3NpZF9wdHIsCisJCQkJCW5tb2RlKTsKKwkJc2lkc29mZnNldCA9IG5kYWNsb2Zmc2V0ICsgbGUxNl90b19jcHUobmRhY2xfcHRyLT5zaXplKTsKKwkJLyogY29weSBzZWMgZGVzYyBjb250cm9sIHBvcnRpb24gJiBvd25lciBhbmQgZ3JvdXAgc2lkcyAqLworCQljb3B5X3NlY19kZXNjKHBudHNkLCBwbm50c2QsIHNpZHNvZmZzZXQpOworCQkqYWNsZmxhZyA9IENJRlNfQUNMX0RBQ0w7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHBubnRzZCwgcG50c2QsIHNlY2Rlc2NsZW4pOworCQlpZiAodWlkICE9IE5PX0NIQU5HRV8zMikgeyAvKiBjaG93biAqLworCQkJb3duZXJfc2lkX3B0ciA9IChzdHJ1Y3QgY2lmc19zaWQgKikoKGNoYXIgKilwbm50c2QgKworCQkJCQlsZTMyX3RvX2NwdShwbm50c2QtPm9zaWRvZmZzZXQpKTsKKwkJCW5vd25lcl9zaWRfcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW5vd25lcl9zaWRfcHRyKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJcmMgPSBpZF90b19zaWQodWlkLCBTSURPV05FUiwgbm93bmVyX3NpZF9wdHIpOworCQkJaWYgKHJjKSB7CisJCQkJY0ZZSSgxLCAiJXM6IE1hcHBpbmcgZXJyb3IgJWQgZm9yIG93bmVyIGlkICVkIiwKKwkJCQkJCV9fZnVuY19fLCByYywgdWlkKTsKKwkJCQlrZnJlZShub3duZXJfc2lkX3B0cik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJbWVtY3B5KG93bmVyX3NpZF9wdHIsIG5vd25lcl9zaWRfcHRyLAorCQkJCQlzaXplb2Yoc3RydWN0IGNpZnNfc2lkKSk7CisJCQlrZnJlZShub3duZXJfc2lkX3B0cik7CisJCQkqYWNsZmxhZyA9IENJRlNfQUNMX09XTkVSOworCQl9CisJCWlmIChnaWQgIT0gTk9fQ0hBTkdFXzMyKSB7IC8qIGNoZ3JwICovCisJCQlncm91cF9zaWRfcHRyID0gKHN0cnVjdCBjaWZzX3NpZCAqKSgoY2hhciAqKXBubnRzZCArCisJCQkJCWxlMzJfdG9fY3B1KHBubnRzZC0+Z3NpZG9mZnNldCkpOworCQkJbmdyb3VwX3NpZF9wdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc19zaWQpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghbmdyb3VwX3NpZF9wdHIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyYyA9IGlkX3RvX3NpZChnaWQsIFNJREdST1VQLCBuZ3JvdXBfc2lkX3B0cik7CisJCQlpZiAocmMpIHsKKwkJCQljRllJKDEsICIlczogTWFwcGluZyBlcnJvciAlZCBmb3IgZ3JvdXAgaWQgJWQiLAorCQkJCQkJX19mdW5jX18sIHJjLCBnaWQpOworCQkJCWtmcmVlKG5ncm91cF9zaWRfcHRyKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQltZW1jcHkoZ3JvdXBfc2lkX3B0ciwgbmdyb3VwX3NpZF9wdHIsCisJCQkJCXNpemVvZihzdHJ1Y3QgY2lmc19zaWQpKTsKKwkJCWtmcmVlKG5ncm91cF9zaWRfcHRyKTsKKwkJCSphY2xmbGFnID0gQ0lGU19BQ0xfR1JPVVA7CisJCX0KKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05NDUsNyArMTE3Myw3IEBACiB7CiAJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QgPSBOVUxMOwogCWludCBvcGxvY2sgPSAwOwotCWludCB4aWQsIHJjOworCWludCB4aWQsIHJjLCBjcmVhdGVfb3B0aW9ucyA9IDA7CiAJX191MTYgZmlkOwogCXN0cnVjdCBjaWZzX3Rjb24gKnRjb247CiAJc3RydWN0IHRjb25fbGluayAqdGxpbmsgPSBjaWZzX3NiX3RsaW5rKGNpZnNfc2IpOwpAQCAtOTU2LDkgKzExODQsMTIgQEAKIAl0Y29uID0gdGxpbmtfdGNvbih0bGluayk7CiAJeGlkID0gR2V0WGlkKCk7CiAKLQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgcGF0aCwgRklMRV9PUEVOLCBSRUFEX0NPTlRST0wsIDAsCi0JCQkgJmZpZCwgJm9wbG9jaywgTlVMTCwgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCWlmIChiYWNrdXBfY3JlZChjaWZzX3NiKSkKKwkJY3JlYXRlX29wdGlvbnMgfD0gQ1JFQVRFX09QRU5fQkFDS1VQX0lOVEVOVDsKKworCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIFJFQURfQ09OVFJPTCwKKwkJCWNyZWF0ZV9vcHRpb25zLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAoIXJjKSB7CiAJCXJjID0gQ0lGU1NNQkdldENJRlNBQ0woeGlkLCB0Y29uLCBmaWQsICZwbnRzZCwgcGFjbGxlbik7CiAJCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIGZpZCk7CkBAIC05OTEsMTMgKzEyMjIsMTUgQEAKIAlyZXR1cm4gcG50c2Q7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2NpZnNfYWNsX2J5X3BhdGgoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgY29uc3QgY2hhciAqcGF0aCwKLQkJc3RydWN0IGNpZnNfbnRzZCAqcG5udHNkLCB1MzIgYWNsbGVuKQorIC8qIFNldCBhbiBBQ0wgb24gdGhlIHNlcnZlciAqLworaW50IHNldF9jaWZzX2FjbChzdHJ1Y3QgY2lmc19udHNkICpwbm50c2QsIF9fdTMyIGFjbGxlbiwKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBhY2xmbGFnKQogewogCWludCBvcGxvY2sgPSAwOwotCWludCB4aWQsIHJjOworCWludCB4aWQsIHJjLCBhY2Nlc3NfZmxhZ3MsIGNyZWF0ZV9vcHRpb25zID0gMDsKIAlfX3UxNiBmaWQ7CiAJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IHRjb25fbGluayAqdGxpbmsgPSBjaWZzX3NiX3RsaW5rKGNpZnNfc2IpOwogCiAJaWYgKElTX0VSUih0bGluaykpCkBAIC0xMDA2LDE1ICsxMjM5LDIzIEBACiAJdGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOwogCXhpZCA9IEdldFhpZCgpOwogCi0JcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIHBhdGgsIEZJTEVfT1BFTiwgV1JJVEVfREFDLCAwLAotCQkJICZmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCisJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CisKKwlpZiAoYWNsZmxhZyA9PSBDSUZTX0FDTF9PV05FUiB8fCBhY2xmbGFnID09IENJRlNfQUNMX0dST1VQKQorCQlhY2Nlc3NfZmxhZ3MgPSBXUklURV9PV05FUjsKKwllbHNlCisJCWFjY2Vzc19mbGFncyA9IFdSSVRFX0RBQzsKKworCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBwYXRoLCBGSUxFX09QRU4sIGFjY2Vzc19mbGFncywKKwkJCWNyZWF0ZV9vcHRpb25zLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMsCisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAocmMpIHsKIAkJY0VSUk9SKDEsICJVbmFibGUgdG8gb3BlbiBmaWxlIHRvIHNldCBBQ0wiKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmMgPSBDSUZTU01CU2V0Q0lGU0FDTCh4aWQsIHRjb24sIGZpZCwgcG5udHNkLCBhY2xsZW4pOworCXJjID0gQ0lGU1NNQlNldENJRlNBQ0woeGlkLCB0Y29uLCBmaWQsIHBubnRzZCwgYWNsbGVuLCBhY2xmbGFnKTsKIAljRllJKERCRzIsICJTZXRDSUZTQUNMIHJjID0gJWQiLCByYyk7CiAKIAlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBmaWQpOwpAQCAtMTAyNCwxNyArMTI2NSw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBTZXQgYW4gQUNMIG9uIHRoZSBzZXJ2ZXIgKi8KLWludCBzZXRfY2lmc19hY2woc3RydWN0IGNpZnNfbnRzZCAqcG5udHNkLCBfX3UzMiBhY2xsZW4sCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7Ci0KLQljRllJKERCRzIsICJzZXQgQUNMIGZvciAlcyBmcm9tIG1vZGUgMHgleCIsIHBhdGgsIGlub2RlLT5pX21vZGUpOwotCi0JcmV0dXJuIHNldF9jaWZzX2FjbF9ieV9wYXRoKGNpZnNfc2IsIHBhdGgsIHBubnRzZCwgYWNsbGVuKTsKLX0KLQogLyogVHJhbnNsYXRlIHRoZSBDSUZTIEFDTCAoc2ltbGFyIHRvIE5URlMgQUNMKSBmb3IgYSBmaWxlIGludG8gbW9kZSBiaXRzICovCiBpbnQKIGNpZnNfYWNsX3RvX2ZhdHRyKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwKQEAgLTEwNjYsOSArMTI5NiwxMiBAQAogfQogCiAvKiBDb252ZXJ0IG1vZGUgYml0cyB0byBhbiBBQ0wgc28gd2UgY2FuIHVwZGF0ZSB0aGUgQUNMIG9uIHRoZSBzZXJ2ZXIgKi8KLWludCBtb2RlX3RvX2NpZnNfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTY0IG5tb2RlKQoraW50CitpZF9tb2RlX3RvX2NpZnNfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTY0IG5tb2RlLAorCQkJdWlkX3QgdWlkLCBnaWRfdCBnaWQpCiB7CiAJaW50IHJjID0gMDsKKwlpbnQgYWNsZmxhZyA9IENJRlNfQUNMX0RBQ0w7IC8qIGRlZmF1bHQgZmxhZyB0byBzZXQgKi8KIAlfX3UzMiBzZWNkZXNjbGVuID0gMDsKIAlzdHJ1Y3QgY2lmc19udHNkICpwbnRzZCA9IE5VTEw7IC8qIGFjbCBvYnRhaW5lZCBmcm9tIHNlcnZlciAqLwogCXN0cnVjdCBjaWZzX250c2QgKnBubnRzZCA9IE5VTEw7IC8qIG1vZGlmaWVkIGFjbCB0byBiZSBzZW50IHRvIHNlcnZlciAqLwpAQCAtMTA5OCwxMyArMTMzMSwxNSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAotCQlyYyA9IGJ1aWxkX3NlY19kZXNjKHBudHNkLCBwbm50c2QsIGlub2RlLCBubW9kZSk7CisJCXJjID0gYnVpbGRfc2VjX2Rlc2MocG50c2QsIHBubnRzZCwgc2VjZGVzY2xlbiwgbm1vZGUsIHVpZCwgZ2lkLAorCQkJCQkmYWNsZmxhZyk7CiAKIAkJY0ZZSShEQkcyLCAiYnVpbGRfc2VjX2Rlc2MgcmM6ICVkIiwgcmMpOwogCiAJCWlmICghcmMpIHsKIAkJCS8qIFNldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciAqLwotCQkJcmMgPSBzZXRfY2lmc19hY2wocG5udHNkLCBzZWNkZXNjbGVuLCBpbm9kZSwgcGF0aCk7CisJCQlyYyA9IHNldF9jaWZzX2FjbChwbm50c2QsIHNlY2Rlc2NsZW4sIGlub2RlLAorCQkJCQkJcGF0aCwgYWNsZmxhZyk7CiAJCQljRllJKERCRzIsICJzZXRfY2lmc19hY2wgcmM6ICVkIiwgcmMpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCAzMGFjZDIyLi41ZDliOWFjIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0zNyw4MyArMzcsOCBAQAogICogdGhlIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuIEFsc28sIHRoaXMgZnVuY3Rpb24KICAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgc2VydmVyLT5zcnZfbXV0ZXggaGVsZC4KICAqLwotc3RhdGljIGludCBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY29uc3Qgc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LAotCQkJCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgY2hhciAqc2lnbmF0dXJlKQotewotCWludCByYzsKLQotCWlmIChjaWZzX3BkdSA9PSBOVUxMIHx8IHNpZ25hdHVyZSA9PSBOVUxMIHx8IHNlcnZlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghc2VydmVyLT5zZWNtZWNoLnNkZXNjbWQ1KSB7Ci0JCWNFUlJPUigxLCAiJXM6IENhbid0IGdlbmVyYXRlIHNpZ25hdHVyZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2VydmVyLT5zZWNtZWNoLnNkZXNjbWQ1LT5zaGFzaCk7Ci0JaWYgKHJjKSB7Ci0JCWNFUlJPUigxLCAiJXM6IENvdWxkIG5vdCBpbml0IG1kNVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZXJ2ZXItPnNlY21lY2guc2Rlc2NtZDUtPnNoYXNoLAotCQlzZXJ2ZXItPnNlc3Npb25fa2V5LnJlc3BvbnNlLCBzZXJ2ZXItPnNlc3Npb25fa2V5Lmxlbik7Ci0JaWYgKHJjKSB7Ci0JCWNFUlJPUigxLCAiJXM6IENvdWxkIG5vdCB1cGRhdGUgd2l0aCByZXNwb25zZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZXJ2ZXItPnNlY21lY2guc2Rlc2NtZDUtPnNoYXNoLAotCQljaWZzX3BkdS0+UHJvdG9jb2wsIGJlMzJfdG9fY3B1KGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCkpOwotCWlmIChyYykgewotCQljRVJST1IoMSwgIiVzOiBDb3VsZCBub3QgdXBkYXRlIHdpdGggcGF5bG9hZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNlcnZlci0+c2VjbWVjaC5zZGVzY21kNS0+c2hhc2gsIHNpZ25hdHVyZSk7Ci0JaWYgKHJjKQotCQljRVJST1IoMSwgIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgbWQ1IGhhc2hcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByYzsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXJ2ZXItPnNydl9tdXRleCBoZWxkICovCi1pbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqY2lmc19wZHUsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKLQkJICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKLXsKLQlpbnQgcmMgPSAwOwotCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07Ci0KLQlpZiAoKGNpZnNfcGR1ID09IE5VTEwpIHx8IChzZXJ2ZXIgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCEoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSB8fAotCSAgICBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKLQkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9Ci0JCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7Ci0JY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7Ci0KLQkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7Ci0Jc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQotCXJjID0gY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNpZnNfcGR1LCBzZXJ2ZXIsIHNtYl9zaWduYXR1cmUpOwotCWlmIChyYykKLQkJbWVtc2V0KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIDAsIDgpOwotCWVsc2UKLQkJbWVtY3B5KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIHNtYl9zaWduYXR1cmUsIDgpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGNpZnNfY2FsY19zaWduYXR1cmUyKGNvbnN0IHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYywKLQkJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKnNpZ25hdHVyZSkKK3N0YXRpYyBpbnQgY2lmc19jYWxjX3NpZ25hdHVyZShjb25zdCBzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsCisJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKnNpZ25hdHVyZSkKIHsKIAlpbnQgaTsKIAlpbnQgcmM7CkBAIC0xNzksNyArMTA0LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07Ci0Jc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1ID0gaW92WzBdLmlvdl9iYXNlOworCXN0cnVjdCBzbWJfaGRyICpjaWZzX3BkdSA9IChzdHJ1Y3Qgc21iX2hkciAqKWlvdlswXS5pb3ZfYmFzZTsKIAogCWlmICgoY2lmc19wZHUgPT0gTlVMTCkgfHwgKHNlcnZlciA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODksNyArMTE0LDcgQEAKIAkJcmV0dXJuIHJjOwogCiAJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKLQkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOworCQltZW1jcHkoY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSwgIkJTUlNQWUwiLCA4KTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMjAwLDcgKzEyNSw3IEBACiAJKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIgPSBzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOwogCXNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAKLQlyYyA9IGNpZnNfY2FsY19zaWduYXR1cmUyKGlvdiwgbl92ZWMsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CisJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlKGlvdiwgbl92ZWMsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CiAJaWYgKHJjKQogCQltZW1zZXQoY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSwgMCwgOCk7CiAJZWxzZQpAQCAtMjA5LDEzICsxMzQsMjcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LAorLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXJ2ZXItPnNydl9tdXRleCBoZWxkICovCitpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqY2lmc19wZHUsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKKwkJICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisKKwlpb3YuaW92X2Jhc2UgPSBjaWZzX3BkdTsKKwlpb3YuaW92X2xlbiA9IGJlMzJfdG9fY3B1KGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCkgKyA0OworCisJcmV0dXJuIGNpZnNfc2lnbl9zbWIyKCZpb3YsIDEsIHNlcnZlciwKKwkJCSAgICAgIHBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpOworfQorCitpbnQgY2lmc192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCBucl9pb3YsCiAJCQkgIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJCSAgX191MzIgZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKQogewogCXVuc2lnbmVkIGludCByYzsKIAljaGFyIHNlcnZlcl9yZXNwb25zZV9zaWdbOF07CiAJY2hhciB3aGF0X3dlX3RoaW5rX3NpZ19zaG91bGRfYmVbMjBdOworCXN0cnVjdCBzbWJfaGRyICpjaWZzX3BkdSA9IChzdHJ1Y3Qgc21iX2hkciAqKWlvdlswXS5pb3ZfYmFzZTsKIAogCWlmIChjaWZzX3BkdSA9PSBOVUxMIHx8IHNlcnZlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0Nyw4ICsxODYsOCBAQAogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOwogCiAJbXV0ZXhfbG9jaygmc2VydmVyLT5zcnZfbXV0ZXgpOwotCXJjID0gY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNpZnNfcGR1LCBzZXJ2ZXIsCi0JCXdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CisJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlKGlvdiwgbnJfaW92LCBzZXJ2ZXIsCisJCQkJIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CiAJbXV0ZXhfdW5sb2NrKCZzZXJ2ZXItPnNydl9tdXRleCk7CiAKIAlpZiAocmMpCkBAIC0yNjUsNyArMjA0LDcgQEAKIH0KIAogLyogZmlyc3QgY2FsY3VsYXRlIDI0IGJ5dGVzIG50bG0gcmVzcG9uc2UgYW5kIHRoZW4gMTYgYnl0ZSBzZXNzaW9uIGtleSAqLwotaW50IHNldHVwX250bG1fcmVzcG9uc2Uoc3RydWN0IGNpZnNfc2VzICpzZXMpCitpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKnNlcywgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NwKQogewogCWludCByYyA9IDA7CiAJdW5zaWduZWQgaW50IHRlbXBfbGVuID0gQ0lGU19TRVNTX0tFWV9TSVpFICsgQ0lGU19BVVRIX1JFU1BfU0laRTsKQEAgLTI4MiwxNCArMjIxLDE0IEBACiAJc2VzLT5hdXRoX2tleS5sZW4gPSB0ZW1wX2xlbjsKIAogCXJjID0gU01CTlRlbmNyeXB0KHNlcy0+cGFzc3dvcmQsIHNlcy0+c2VydmVyLT5jcnlwdGtleSwKLQkJCXNlcy0+YXV0aF9rZXkucmVzcG9uc2UgKyBDSUZTX1NFU1NfS0VZX1NJWkUpOworCQkJc2VzLT5hdXRoX2tleS5yZXNwb25zZSArIENJRlNfU0VTU19LRVlfU0laRSwgbmxzX2NwKTsKIAlpZiAocmMpIHsKIAkJY0ZZSSgxLCAiJXMgQ2FuJ3QgZ2VuZXJhdGUgTlRMTSByZXNwb25zZSwgZXJyb3I6ICVkIiwKIAkJCV9fZnVuY19fLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IEVfbWQ0aGFzaChzZXMtPnBhc3N3b3JkLCB0ZW1wX2tleSk7CisJcmMgPSBFX21kNGhhc2goc2VzLT5wYXNzd29yZCwgdGVtcF9rZXksIG5sc19jcCk7CiAJaWYgKHJjKSB7CiAJCWNGWUkoMSwgIiVzIENhbid0IGdlbmVyYXRlIE5UIGhhc2gsIGVycm9yOiAlZCIsIF9fZnVuY19fLCByYyk7CiAJCXJldHVybiByYzsKQEAgLTQ2NSw3ICs0MDQsNyBAQAogCX0KIAogCS8qIGNhbGN1bGF0ZSBtZDQgaGFzaCBvZiBwYXNzd29yZCAqLwotCUVfbWQ0aGFzaChzZXMtPnBhc3N3b3JkLCBudF9oYXNoKTsKKwlFX21kNGhhc2goc2VzLT5wYXNzd29yZCwgbnRfaGFzaCwgbmxzX2NwKTsKIAogCXJjID0gY3J5cHRvX3NoYXNoX3NldGtleShzZXMtPnNlcnZlci0+c2VjbWVjaC5obWFjbWQ1LCBudF9oYXNoLAogCQkJCUNJRlNfTlRIQVNIX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggNTRiOGYxZS4uOGYxZmUzMiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC01Myw3ICs1Myw3IEBACiBpbnQgY2lmc0ZZSSA9IDA7CiBpbnQgY2lmc0VSUk9SID0gMTsKIGludCB0cmFjZVNNQiA9IDA7Ci11bnNpZ25lZCBpbnQgb3Bsb2NrRW5hYmxlZCA9IDE7Citib29sIGVuYWJsZV9vcGxvY2tzID0gdHJ1ZTsKIHVuc2lnbmVkIGludCBsaW51eEV4dEVuYWJsZWQgPSAxOwogdW5zaWduZWQgaW50IGxvb2t1cENhY2hlRW5hYmxlZCA9IDE7CiB1bnNpZ25lZCBpbnQgbXVsdGl1c2VyX21vdW50ID0gMDsKQEAgLTc0LDcgKzc0LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoY2lmc19taW5fc21hbGwsICJTbWFsbCBuZXR3b3JrIGJ1ZmZlcnMgaW4gcG9vbC4gRGVmYXVsdDogMzAgIgogCQkJCSAiUmFuZ2U6IDIgdG8gMjU2Iik7CiB1bnNpZ25lZCBpbnQgY2lmc19tYXhfcGVuZGluZyA9IENJRlNfTUFYX1JFUTsKLW1vZHVsZV9wYXJhbShjaWZzX21heF9wZW5kaW5nLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNpZnNfbWF4X3BlbmRpbmcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNpZnNfbWF4X3BlbmRpbmcsICJTaW11bHRhbmVvdXMgcmVxdWVzdHMgdG8gc2VydmVyLiAiCiAJCQkJICAgIkRlZmF1bHQ6IDUwIFJhbmdlOiAyIHRvIDI1NiIpOwogdW5zaWduZWQgc2hvcnQgZWNob19yZXRyaWVzID0gNTsKQEAgLTgyLDYgKzgyLDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKGVjaG9fcmV0cmllcywgIk51bWJlciBvZiBlY2hvIGF0dGVtcHRzIGJlZm9yZSBnaXZpbmcgdXAgYW5kICIKIAkJCSAgICAgICAicmVjb25uZWN0aW5nIHNlcnZlci4gRGVmYXVsdDogNS4gMCBtZWFucyAiCiAJCQkgICAgICAgIm5ldmVyIHJlY29ubmVjdC4iKTsKK21vZHVsZV9wYXJhbShlbmFibGVfb3Bsb2NrcywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9vcGxvY2tzLCAiRW5hYmxlIG9yIGRpc2FibGUgb3Bsb2NrcyAoYm9vbCkuIERlZmF1bHQ6IgorCQkJCSAieS9ZLzEiKTsKKwogZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19zbV9yZXFfcG9vbHA7CiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX3JlcV9wb29scDsKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfbWlkX3Bvb2xwOwpAQCAtMTMyLDEyICsxMzYsMTIgQEAKIAllbHNlCiAJCXNiLT5zX2Rfb3AgPSAmY2lmc19kZW50cnlfb3BzOwogCi0jaWZkZWYgQ0lGU19ORlNEX0VYUE9SVAorI2lmZGVmIENPTkZJR19DSUZTX05GU0RfRVhQT1JUCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSkgewogCQljRllJKDEsICJleHBvcnQgb3BzIHN1cHBvcnRlZCIpOwogCQlzYi0+c19leHBvcnRfb3AgPSAmY2lmc19leHBvcnRfb3BzOwogCX0KLSNlbmRpZiAvKiBDSUZTX05GU0RfRVhQT1JUICovCisjZW5kaWYgLyogQ09ORklHX0NJRlNfTkZTRF9FWFBPUlQgKi8KIAogCXJldHVybiAwOwogCkBAIC00MzIsNiArNDM2LDEyIEBACiAJCXNlcV9wcmludGYocywgIixtZnN5bWxpbmtzIik7CiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9GU0NBQ0hFKQogCQlzZXFfcHJpbnRmKHMsICIsZnNjIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT1NTWU5DKQorCQlzZXFfcHJpbnRmKHMsICIsbm9zdHJpY3RzeW5jIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19QRVJNKQorCQlzZXFfcHJpbnRmKHMsICIsbm9wZXJtIik7CisJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TVFJJQ1RfSU8pCisJCXNlcV9wcmludGYocywgIixzdHJpY3RjYWNoZSIpOwogCiAJc2VxX3ByaW50ZihzLCAiLHJzaXplPSVkIiwgY2lmc19zYi0+cnNpemUpOwogCXNlcV9wcmludGYocywgIix3c2l6ZT0lZCIsIGNpZnNfc2ItPndzaXplKTsKQEAgLTUzMCw3ICs1NDAsNiBAQAogCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CiAJY2hhciAqcywgKnA7CiAJY2hhciBzZXA7Ci0JaW50IHhpZDsKIAogCWZ1bGxfcGF0aCA9IGNpZnNfYnVpbGRfcGF0aF90b19yb290KHZvbCwgY2lmc19zYiwKIAkJCQkJICAgIGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYikpOwpAQCAtNTM5LDcgKzU0OCw2IEBACiAKIAljRllJKDEsICJHZXQgcm9vdCBkZW50cnkgZm9yICVzIiwgZnVsbF9wYXRoKTsKIAotCXhpZCA9IEdldFhpZCgpOwogCXNlcCA9IENJRlNfRElSX1NFUChjaWZzX3NiKTsKIAlkZW50cnkgPSBkZ2V0KHNiLT5zX3Jvb3QpOwogCXAgPSBzID0gZnVsbF9wYXRoOwpAQCAtNTcwLDcgKzU3OCw2IEBACiAJCWRwdXQoZGVudHJ5KTsKIAkJZGVudHJ5ID0gY2hpbGQ7CiAJfSB3aGlsZSAoIUlTX0VSUihkZW50cnkpKTsKLQlfRnJlZVhpZCh4aWQpOwogCWtmcmVlKGZ1bGxfcGF0aCk7CiAJcmV0dXJuIGRlbnRyeTsKIH0KQEAgLTcyMyw3ICs3MzAsNyBAQAogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIChsb2ZmX3QpcmM7CiAJfQotCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiB9CiAKIHN0YXRpYyBpbnQgY2lmc19zZXRsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9uZyBhcmcsIHN0cnVjdCBmaWxlX2xvY2sgKipsZWFzZSkKQEAgLTk0Miw3ICs5NDksOCBAQAogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGlub2RlOwogCiAJaW5vZGVfaW5pdF9vbmNlKCZjaWZzaS0+dmZzX2lub2RlKTsKLQlJTklUX0xJU1RfSEVBRCgmY2lmc2ktPmxvY2tMaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2lmc2ktPmxsaXN0KTsKKwltdXRleF9pbml0KCZjaWZzaS0+bG9ja19tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IDk1ZGE4MDIuLjMwZmY1NjAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMTIxLDkgKzEyMSw5IEBACiBleHRlcm4gc3NpemVfdAljaWZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIGV4dGVybiBsb25nIGNpZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLSNpZmRlZiBDSUZTX05GU0RfRVhQT1JUCisjaWZkZWYgQ09ORklHX0NJRlNfTkZTRF9FWFBPUlQKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwotI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19ORlNEX0VYUE9SVCAqLwogCi0jZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjc1IgorI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS43NiIKICNlbmRpZgkJCQkvKiBfQ0lGU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCA5NWRhZDlkLi44MjM4YWExIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0xNjcsNiArMTY3LDggQEAKIAl1aWRfdCBjcmVkX3VpZDsKIAl1aWRfdCBsaW51eF91aWQ7CiAJZ2lkX3QgbGludXhfZ2lkOworCXVpZF90IGJhY2t1cHVpZDsKKwlnaWRfdCBiYWNrdXBnaWQ7CiAJbW9kZV90IGZpbGVfbW9kZTsKIAltb2RlX3QgZGlyX21vZGU7CiAJdW5zaWduZWQgc2VjRmxnOwpAQCAtMTc5LDYgKzE4MSw4IEBACiAJYm9vbCBub3Blcm06MTsKIAlib29sIG5vX3BzeF9hY2w6MTsgLyogc2V0IGlmIHBvc2l4IGFjbCBzdXBwb3J0IHNob3VsZCBiZSBkaXNhYmxlZCAqLwogCWJvb2wgY2lmc19hY2w6MTsKKwlib29sIGJhY2t1cHVpZF9zcGVjaWZpZWQ7IC8qIG1vdW50IG9wdGlvbiAgYmFja3VwdWlkICBpcyBzcGVjaWZpZWQgKi8KKwlib29sIGJhY2t1cGdpZF9zcGVjaWZpZWQ7IC8qIG1vdW50IG9wdGlvbiAgYmFja3VwZ2lkICBpcyBzcGVjaWZpZWQgKi8KIAlib29sIG5vX3hhdHRyOjE7ICAgLyogc2V0IGlmIHhhdHRyIChFQSkgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQqLwogCWJvb2wgc2VydmVyX2lubzoxOyAvKiB1c2UgaW5vZGUgbnVtYmVycyBmcm9tIHNlcnZlciBpZSBVbmlxdWVJZCAqLwogCWJvb2wgZGlyZWN0X2lvOjE7CkBAIC0yMTksNyArMjIzLDggQEAKIAkJCSBDSUZTX01PVU5UX09WRVJSX0dJRCB8IENJRlNfTU9VTlRfRFlOUEVSTSB8IFwKIAkJCSBDSUZTX01PVU5UX05PUE9TSVhCUkwgfCBDSUZTX01PVU5UX05PU1NZTkMgfCBcCiAJCQkgQ0lGU19NT1VOVF9GU0NBQ0hFIHwgQ0lGU19NT1VOVF9NRl9TWU1MSU5LUyB8IFwKLQkJCSBDSUZTX01PVU5UX01VTFRJVVNFUiB8IENJRlNfTU9VTlRfU1RSSUNUX0lPKQorCQkJIENJRlNfTU9VTlRfTVVMVElVU0VSIHwgQ0lGU19NT1VOVF9TVFJJQ1RfSU8gfCBcCisJCQkgQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUFVJRCB8IENJRlNfTU9VTlRfQ0lGU19CQUNLVVBHSUQpCiAKICNkZWZpbmUgQ0lGU19NU19NQVNLIChNU19SRE9OTFkgfCBNU19NQU5ETE9DSyB8IE1TX05PRVhFQyB8IE1TX05PU1VJRCB8IFwKIAkJICAgICAgTVNfTk9ERVYgfCBNU19TWU5DSFJPTk9VUykKQEAgLTI4Niw3ICsyOTEsMTMgQEAKIAlib29sCXNlY19rZXJiZXJvc3UydTsJLyogc3VwcG9ydHMgVTJVIEtlcmJlcm9zICovCiAJYm9vbAlzZWNfa2VyYmVyb3M7CQkvKiBzdXBwb3J0cyBwbGFpbiBLZXJiZXJvcyAqLwogCWJvb2wJc2VjX21za2VyYmVyb3M7CQkvKiBzdXBwb3J0cyBsZWdhY3kgTVMgS2VyYmVyb3MgKi8KKwlib29sCWxhcmdlX2J1ZjsJCS8qIGlzIGN1cnJlbnQgYnVmZmVyIGxhcmdlPyAqLwogCXN0cnVjdCBkZWxheWVkX3dvcmsJZWNobzsgLyogZWNobyBwaW5nIHdvcmtxdWV1ZSBqb2IgKi8KKwlzdHJ1Y3Qga3ZlYyAqaW92OwkvKiByZXVzYWJsZSBrdmVjIGFycmF5IGZvciByZWNlaXZlcyAqLworCXVuc2lnbmVkIGludCBucl9pb3Y7CS8qIG51bWJlciBvZiBrdmVjcyBpbiBhcnJheSAqLworCWNoYXIJKnNtYWxsYnVmOwkvKiBwb2ludGVyIHRvIGN1cnJlbnQgInNtYWxsIiBidWZmZXIgKi8KKwljaGFyCSpiaWdidWY7CS8qIHBvaW50ZXIgdG8gY3VycmVudCAiYmlnIiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgdG90YWxfcmVhZDsgLyogdG90YWwgYW1vdW50IG9mIGRhdGEgcmVhZCBpbiB0aGlzIHBhc3MgKi8KICNpZmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCiAJc3RydWN0IGZzY2FjaGVfY29va2llICAgKmZzY2FjaGU7IC8qIGNsaWVudCBpbmRleCBjYWNoZSBjb29raWUgKi8KICNlbmRpZgpAQCAtNDg1LDkgKzQ5NiwxMyBAQAogICovCiBzdHJ1Y3QgY2lmc0xvY2tJbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxsaXN0OwkvKiBwb2ludGVyIHRvIG5leHQgY2lmc0xvY2tJbmZvICovCisJc3RydWN0IGxpc3RfaGVhZCBibGlzdDsgLyogcG9pbnRlciB0byBsb2NrcyBibG9ja2VkIG9uIHRoaXMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBibG9ja19xOwogCV9fdTY0IG9mZnNldDsKIAlfX3U2NCBsZW5ndGg7CisJX191MzIgcGlkOwogCV9fdTggdHlwZTsKKwlfX3UxNiBuZXRmaWQ7CiB9OwogCiAvKgpAQCAtNTIwLDggKzUzNSw2IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXVuc2lnbmVkIGludCBmX2ZsYWdzOwogCXN0cnVjdCB0Y29uX2xpbmsgKnRsaW5rOwotCXN0cnVjdCBtdXRleCBsb2NrX211dGV4OwotCXN0cnVjdCBsaXN0X2hlYWQgbGxpc3Q7IC8qIGxpc3Qgb2YgYnl0ZSByYW5nZSBsb2NrcyB3ZSBoYXZlLiAqLwogCWJvb2wgaW52YWxpZEhhbmRsZToxOwkvKiBmaWxlIGNsb3NlZCB2aWEgc2Vzc2lvbiBhYmVuZCAqLwogCWJvb2wgb3Bsb2NrX2JyZWFrX2NhbmNlbGxlZDoxOwogCWludCBjb3VudDsJCS8qIHJlZmNvdW50IHByb3RlY3RlZCBieSBjaWZzX2ZpbGVfbGlzdF9sb2NrICovCkBAIC01NTQsNyArNTY3LDkgQEAKICAqLwogCiBzdHJ1Y3QgY2lmc0lub2RlSW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsb2NrTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxsaXN0OwkJLyogYnJsb2NrcyBmb3IgdGhpcyBpbm9kZSAqLworCWJvb2wgY2FuX2NhY2hlX2JybGNrczsKKwlzdHJ1Y3QgbXV0ZXggbG9ja19tdXRleDsJLyogcHJvdGVjdCB0d28gZmllbGRzIGFib3ZlICovCiAJLyogQkIgYWRkIGluIGxpc3RzIGZvciBkaXJ0eSBwYWdlcyBpLmUuIHdyaXRlIGNhY2hpbmcgaW5mbyBmb3Igb3Bsb2NrICovCiAJc3RydWN0IGxpc3RfaGVhZCBvcGVuRmlsZUxpc3Q7CiAJX191MzIgY2lmc0F0dHJzOyAvKiBlLmcuIERPUyBhcmNoaXZlIGJpdCwgc3BhcnNlLCBjb21wcmVzc2VkLCBzeXN0ZW0gKi8KQEAgLTY0Myw4ICs2NTgsMjQgQEAKIHN0cnVjdCBtaWRfcV9lbnRyeTsKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHByb3RvdHlwZSBmb3IgdGhlIG1pZCBjYWxsYmFjayBmdW5jdGlvbi4gV2hlbiBjcmVhdGluZyBvbmUsCi0gKiB0YWtlIHNwZWNpYWwgY2FyZSB0byBhdm9pZCBkZWFkbG9ja3MuIFRoaW5ncyB0byBiZWFyIGluIG1pbmQ6CisgKiBUaGlzIGlzIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBtaWQgcmVjZWl2ZSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBmb3IKKyAqIHJlY2VpdmluZyB0aGUgcmVzdCBvZiB0aGUgU01CIGZyYW1lLCBzdGFydGluZyB3aXRoIHRoZSBXb3JkQ291bnQgKHdoaWNoIGlzCisgKiBqdXN0IGFmdGVyIHRoZSBNSUQgaW4gc3RydWN0IHNtYl9oZHIpLiBOb3RlOgorICoKKyAqIC0gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBjaWZzZCwgd2l0aCBubyBsb2NrcyBoZWxkLgorICogLSBUaGUgbWlkIHdpbGwgc3RpbGwgYmUgb24gdGhlIHBlbmRpbmdfbWlkX3EuCisgKiAtIG1pZC0+cmVzcF9idWYgd2lsbCBwb2ludCB0byB0aGUgY3VycmVudCBidWZmZXIuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIGEgc3VjY2Vzc2Z1bCByZWNlaXZlLCBvciBhbiBlcnJvci4gVGhlIHJlY2VpdmUgc3RhdGUgaW4KKyAqIHRoZSBUQ1BfU2VydmVyX0luZm8gd2lsbCBhbHNvIGJlIHVwZGF0ZWQuCisgKi8KK3R5cGVkZWYgaW50IChtaWRfcmVjZWl2ZV90KShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsCisJCQkgICAgc3RydWN0IG1pZF9xX2VudHJ5ICptaWQpOworCisvKgorICogVGhpcyBpcyB0aGUgcHJvdG90eXBlIGZvciB0aGUgbWlkIGNhbGxiYWNrIGZ1bmN0aW9uLiBUaGlzIGlzIGNhbGxlZCBvbmNlIHRoZQorICogbWlkIGhhcyBiZWVuIHJlY2VpdmVkIG9mZiBvZiB0aGUgc29ja2V0LiBXaGVuIGNyZWF0aW5nIG9uZSwgdGFrZSBzcGVjaWFsCisgKiBjYXJlIHRvIGF2b2lkIGRlYWRsb2Nrcy4gVGhpbmdzIHRvIGJlYXIgaW4gbWluZDoKICAqCiAgKiAtIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IGNpZnNkLCB3aXRoIG5vIGxvY2tzIGhlbGQKICAqIC0gdGhlIG1pZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBhbnkgbGlzdHMKQEAgLTY2Miw5ICs2OTMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHdoZW5fc2VudDsgLyogdGltZSB3aGVuIHNtYiBzZW5kIGZpbmlzaGVkICovCiAJdW5zaWduZWQgbG9uZyB3aGVuX3JlY2VpdmVkOyAvKiB3aGVuIGRlbXV4IGNvbXBsZXRlICh0YWtlbiBvZmYgd2lyZSkgKi8KICNlbmRpZgorCW1pZF9yZWNlaXZlX3QgKnJlY2VpdmU7IC8qIGNhbGwgcmVjZWl2ZSBjYWxsYmFjayAqLwogCW1pZF9jYWxsYmFja190ICpjYWxsYmFjazsgLyogY2FsbCBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAJdm9pZCAqY2FsbGJhY2tfZGF0YTsJICAvKiBnZW5lcmFsIHB1cnBvc2UgcG9pbnRlciBmb3IgY2FsbGJhY2sgKi8KLQlzdHJ1Y3Qgc21iX2hkciAqcmVzcF9idWY7CS8qIHJlc3BvbnNlIGJ1ZmZlciAqLworCXN0cnVjdCBzbWJfaGRyICpyZXNwX2J1ZjsJLyogcG9pbnRlciB0byByZWNlaXZlZCBTTUIgaGVhZGVyICovCiAJaW50IG1pZFN0YXRlOwkvKiB3aXNoIHRoaXMgd2VyZSBlbnVtIGJ1dCBjYW4gbm90IHBhc3MgdG8gd2FpdF9ldmVudCAqLwogCV9fdTggY29tbWFuZDsJLyogc21iIGNvbW1hbmQgY29kZSAqLwogCWJvb2wgbGFyZ2VCdWY6MTsJLyogaWYgdmFsaWQgcmVzcG9uc2UsIGlzIHBvaW50ZXIgdG8gbGFyZ2UgYnVmICovCkBAIC05NjQsNyArOTk2LDggQEAKIAkJCQl0byBiZSBlc3RhYmxpc2hlZCBvbiBleGlzdGluZyBtb3VudCBpZiB3ZQogCQkJCWhhdmUgdGhlIHVpZC9wYXNzd29yZCBvciBLZXJiZXJvcyBjcmVkZW50aWFsCiAJCQkJb3IgZXF1aXZhbGVudCBmb3IgY3VycmVudCB1c2VyICovCi1HTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBvcGxvY2tFbmFibGVkOworLyogZW5hYmxlIG9yIGRpc2FibGUgb3Bsb2NrcyAqLworR0xPQkFMX0VYVEVSTiBib29sIGVuYWJsZV9vcGxvY2tzOwogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgbG9va3VwQ2FjaGVFbmFibGVkOwogR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgZ2xvYmFsX3NlY2ZsYWdzOwkvKiBpZiBvbiwgc2Vzc2lvbiBzZXR1cCBzZW50CiAJCQkJd2l0aCBtb3JlIHNlY3VyZSBudGxtc3NwMiBjaGFsbGVuZ2UvcmVzcCAqLwpAQCAtOTc4LDEwICsxMDExLDE2IEBACiAvKiByZWNvbm5lY3QgYWZ0ZXIgdGhpcyBtYW55IGZhaWxlZCBlY2hvIGF0dGVtcHRzICovCiBHTE9CQUxfRVhURVJOIHVuc2lnbmVkIHNob3J0IGVjaG9fcmV0cmllczsKIAorI2lmZGVmIENPTkZJR19DSUZTX0FDTAogR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgcmJfcm9vdCB1aWR0cmVlOwogR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgcmJfcm9vdCBnaWR0cmVlOwogR0xPQkFMX0VYVEVSTiBzcGlubG9ja190IHNpZHVpZGxvY2s7CiBHTE9CQUxfRVhURVJOIHNwaW5sb2NrX3Qgc2lkZ2lkbG9jazsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IHJiX3Jvb3Qgc2lkdWlkdHJlZTsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IHJiX3Jvb3Qgc2lkZ2lkdHJlZTsKK0dMT0JBTF9FWFRFUk4gc3BpbmxvY2tfdCB1aWRzaWRsb2NrOworR0xPQkFMX0VYVEVSTiBzcGlubG9ja190IGdpZHNpZGxvY2s7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfQUNMICovCiAKIHZvaWQgY2lmc19vcGxvY2tfYnJlYWsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaAppbmRleCBkZTNhYTI4Li4zZmIwM2UyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNwZHUuaAorKysgYi9mcy9jaWZzL2NpZnNwZHUuaApAQCAtMTA4OSw5ICsxMDg5LDcgQEAKIAlfX2xlMTYgRGF0YUxlbmd0aEhpZ2g7CiAJX191NjQgUmVzZXJ2ZWQyOwogCV9fdTE2IEJ5dGVDb3VudDsKLQlfX3U4IFBhZDsJCS8qIEJCIGNoZWNrIGZvciB3aGV0aGVyIHBhZGRlZCB0byBEV09SRAotCQkJCSAgIGJvdW5kYXJ5IGFuZCBvcHRpbXVtIHBlcmZvcm1hbmNlIGhlcmUgKi8KLQljaGFyIERhdGFbMV07CisJLyogcmVhZCByZXNwb25zZSBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd3MgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgUkVBRF9SU1A7CiAKIHR5cGVkZWYgc3RydWN0IGxvY2tpbmdfYW5keF9yYW5nZSB7CkBAIC0xOTEzLDYgKzE5MTEsMTAgQEAKIAogLyogU0VURlNJbmZvIExldmVscyAqLwogI2RlZmluZSBTTUJfU0VUX0NJRlNfVU5JWF9JTkZPICAgIDB4MjAwCisvKiBsZXZlbCAweDIwMyBpcyBkZWZpbmVkIGFib3ZlIGluIGxpc3Qgb2YgUUZTIGluZm8gbGV2ZWxzICovCisvKiAjZGVmaW5lIFNNQl9SRVFVRVNUX1RSQU5TUE9SVF9FTkNSWVBUSU9OIDB4MjAzICovCisKKy8qIExldmVsIDB4MjAwIHJlcXVlc3Qgc3RydWN0dXJlIGZvbGxvd3MgKi8KIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NldGZzaV9yZXEgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KIAlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKQEAgLTE5NDAsMTMgKzE5NDIsMzkgQEAKIAlfX2xlNjQgQ2xpZW50VW5peENhcDsgICAvKiBEYXRhIGVuZCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBUUkFOU0FDVElPTjJfU0VURlNJX1JFUTsKIAorLyogbGV2ZWwgMHgyMDMgcmVxdWVzdCBzdHJ1Y3R1cmUgZm9sbG93cyAqLwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2V0ZnNfZW5jX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsJLyogNCAqLworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsJLyogMTIgKi8KKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CS8qIG9uZSAqLworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBUUkFOUzJfU0VUX0ZTX0lORk9STUFUSU9OICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX3UxNiAgUmVzZXJ2ZWQ0OwkvKiBQYXJhbWV0ZXJzIHN0YXJ0LiAqLworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOy8qIFBhcmFtZXRlcnMgZW5kLiAqLworCS8qIE5UTE1TU1AgQmxvYiwgRGF0YSBzdGFydC4gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgVFJBTlNBQ1RJT04yX1NFVEZTSV9FTkNfUkVROworCisvKiByZXNwb25zZSBmb3Igc2V0ZnNpbmZvIGxldmVscyAweDIwMCBhbmQgMHgyMDMgKi8KIHR5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NldGZzaV9yc3AgewogCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKi8KIAlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CiAJX191MTYgQnl0ZUNvdW50OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBUUkFOU0FDVElPTjJfU0VURlNJX1JTUDsKIAotCiB0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9nZXRfZGZzX3JlZmVyX3JlcSB7CiAJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLwogCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OwpAQCAtMjA5OCwxMyArMjEyNiwxMyBAQAogI2RlZmluZSBDSUZTX1VOSVhfUFJPWFlfQ0FQICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogUHJveHkgY2FwOiAweEFDRSBpb2N0bCBhbmQKIAkJCQkJCSAgICAgIFFGUyBQUk9YWSBjYWxsICovCiAjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKLS8qIENhbiBub3Qgc2V0IHBhdGhuYW1lcyBjYXAgeWV0IHVudGlsIHdlIHNlbmQgbmV3IHBvc2l4IGNyZWF0ZSBTTUIgc2luY2UKLSAgIG90aGVyd2lzZSBzZXJ2ZXIgY2FuIHRyZWF0IHN1Y2ggaGFuZGxlcyBvcGVuZWQgd2l0aCBvbGRlciBudGNyZWF0ZXgKLSAgIChieSBhIG5ldyBjbGllbnQgd2hpY2gga25vd3MgaG93IHRvIHNlbmQgcG9zaXggcGF0aCBvcHMpCi0gICBhcyBub24tcG9zaXggaGFuZGxlcyAoY2FuIGFmZmVjdCB3cml0ZSBiZWhhdmlvciB3aXRoIGJ5dGUgcmFuZ2UgbG9ja3MuCi0gICBXZSBjYW4gYWRkIGJhY2sgaW4gUE9TSVhfUEFUSF9PUFMgY2FwIHdoZW4gUG9zaXggQ3JlYXRlL01rZGlyIGZpbmlzaGVkICovCisvKiBwcmVzdW1hYmx5IGRvbid0IG5lZWQgdGhlIDB4MjAgUE9TSVhfUEFUSF9PUFNfQ0FQIHNpbmNlIHdlIG5ldmVyIHNlbmQKKyAgIExvY2tpbmdYIGluc3RlYWQgb2YgcG9zaXggbG9ja2luZyBjYWxsIG9uIHVuaXggc2VzcyAoYW5kIHdlIGRvIG5vdCBleHBlY3QKKyAgIExvY2tpbmdYIHRvIHVzZSBkaWZmZXJlbnQgKGllIFdpbmRvd3MpIHNlbWFudGljcyB0aGFuIHBvc2l4IGxvY2tpbmcgb24KKyAgIHRoZSBzYW1lIHNlc3Npb24gKGlmIFdJTkUgbmVlZHMgdG8gZG8gdGhpcyBsYXRlciwgd2UgY2FuIGFkZCB0aGlzIGNhcAorICAgYmFjayBpbiBsYXRlciAqLwogLyogI2RlZmluZSBDSUZTX1VOSVhfQ0FQX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwZmIgKi8KLSNkZWZpbmUgQ0lGU19VTklYX0NBUF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMGRiCisjZGVmaW5lIENJRlNfVU5JWF9DQVBfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDNkYgogI2Vsc2UKICNkZWZpbmUgQ0lGU19VTklYX0NBUF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDEzCiAjZW5kaWYgLyogQ09ORklHX0NJRlNfUE9TSVggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IDhkZjI4ZTkuLjZmNGUyNDMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtNjksOCArNjksOSBAQAogCQkJCQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogZXh0ZXJuIHZvaWQgRGVsZXRlTWlkUUVudHJ5KHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkRW50cnkpOwogZXh0ZXJuIGludCBjaWZzX2NhbGxfYXN5bmMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQkJICAgdW5zaWduZWQgaW50IG52ZWMsIG1pZF9jYWxsYmFja190ICpjYWxsYmFjaywKLQkJCSAgIHZvaWQgKmNiZGF0YSwgYm9vbCBpZ25vcmVfcGVuZCk7CisJCQkgICB1bnNpZ25lZCBpbnQgbnZlYywgbWlkX3JlY2VpdmVfdCAqcmVjZWl2ZSwKKwkJCSAgIG1pZF9jYWxsYmFja190ICpjYWxsYmFjaywgdm9pZCAqY2JkYXRhLAorCQkJICAgYm9vbCBpZ25vcmVfcGVuZCk7CiBleHRlcm4gaW50IFNlbmRSZWNlaXZlKGNvbnN0IHVuc2lnbmVkIGludCAvKiB4aWQgKi8gLCBzdHJ1Y3QgY2lmc19zZXMgKiwKIAkJCXN0cnVjdCBzbWJfaGRyICogLyogaW5wdXQgKi8gLAogCQkJc3RydWN0IHNtYl9oZHIgKiAvKiBvdXQgKi8gLApAQCAtOTAsNiArOTEsNyBAQAogZXh0ZXJuIGludCBjaGVja1NNQihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQsIHVuc2lnbmVkIGludCBsZW5ndGgpOwogZXh0ZXJuIGJvb2wgaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbWJfaGRyICpzbWIsCiAJCQkJICBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICopOworZXh0ZXJuIGJvb2wgYmFja3VwX2NyZWQoc3RydWN0IGNpZnNfc2JfaW5mbyAqKTsKIGV4dGVybiBib29sIGlzX3NpemVfc2FmZV90b19jaGFuZ2Uoc3RydWN0IGNpZnNJbm9kZUluZm8gKiwgX191NjQgZW9mKTsKIGV4dGVybiB2b2lkIGNpZnNfdXBkYXRlX2VvZihzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc2ksIGxvZmZfdCBvZmZzZXQsCiAJCQkgICAgdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4pOwpAQCAtMTQ1LDEyICsxNDcsMTkgQEAKIGV4dGVybiBpbnQgY2lmc19hY2xfdG9fZmF0dHIoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKIAkJCSAgICAgIHN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IF9fdTE2ICpwZmlkKTsKLWV4dGVybiBpbnQgbW9kZV90b19jaWZzX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpwYXRoLCBfX3U2NCk7CitleHRlcm4gaW50IGlkX21vZGVfdG9fY2lmc19hY2woc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqcGF0aCwgX191NjQsCisJCQkJCXVpZF90LCBnaWRfdCk7CiBleHRlcm4gc3RydWN0IGNpZnNfbnRzZCAqZ2V0X2NpZnNfYWNsKHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgc3RydWN0IGlub2RlICosCiAJCQkJCWNvbnN0IGNoYXIgKiwgdTMyICopOwogZXh0ZXJuIGludCBzZXRfY2lmc19hY2woc3RydWN0IGNpZnNfbnRzZCAqLCBfX3UzMiwgc3RydWN0IGlub2RlICosCi0JCQkJY29uc3QgY2hhciAqKTsKKwkJCQljb25zdCBjaGFyICosIGludCk7CiAKK2V4dGVybiB2b2lkIGRlcXVldWVfbWlkKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkLCBib29sIG1hbGZvcm1lZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKmJ1ZiwKKwkJICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAorCQlzdHJ1Y3Qga3ZlYyAqaW92X29yaWcsIHVuc2lnbmVkIGludCBucl9zZWdzLAorCQl1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CiBleHRlcm4gdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKTsKIGV4dGVybiBpbnQgY2lmc19tYXRjaF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKTsKQEAgLTM1OSwxNCArMzY4LDE3IEBACiAJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsCiAJCQlpbnQgcmVtYXBfc3BlY2lhbF9jaGFycyk7CiAKK2V4dGVybiBpbnQgY2lmc19sb2Nrdihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLCBjb25zdCBfX3UxNiBuZXRmaWQsCisJCSAgICAgIGNvbnN0IF9fdTggbG9ja190eXBlLCBjb25zdCBfX3UzMiBudW1fdW5sb2NrLAorCQkgICAgICBjb25zdCBfX3UzMiBudW1fbG9jaywgTE9DS0lOR19BTkRYX1JBTkdFICpidWYpOwogZXh0ZXJuIGludCBDSUZTU01CTG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQkJY29uc3QgX191MTYgbmV0ZmlkLCBjb25zdCBfX3U2NCBsZW4sCisJCQljb25zdCBfX3UxNiBuZXRmaWQsIGNvbnN0IF9fdTMyIG5ldHBpZCwgY29uc3QgX191NjQgbGVuLAogCQkJY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCiAJCQljb25zdCBfX3UzMiBudW1Mb2NrLCBjb25zdCBfX3U4IGxvY2tUeXBlLAogCQkJY29uc3QgYm9vbCB3YWl0RmxhZywgY29uc3QgX191OCBvcGxvY2tfbGV2ZWwpOwogZXh0ZXJuIGludCBDSUZTU01CUG9zaXhMb2NrKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgaW50IGdldF9mbGFnLAotCQkJY29uc3QgX191NjQgbGVuLCBzdHJ1Y3QgZmlsZV9sb2NrICosCisJCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191MzIgbmV0cGlkLAorCQkJY29uc3QgaW50IGdldF9mbGFnLCBjb25zdCBfX3U2NCBsZW4sIHN0cnVjdCBmaWxlX2xvY2sgKiwKIAkJCWNvbnN0IF9fdTE2IGxvY2tfdHlwZSwgY29uc3QgYm9vbCB3YWl0RmxhZyk7CiBleHRlcm4gaW50IENJRlNTTUJURGlzKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24pOwogZXh0ZXJuIGludCBDSUZTU01CRWNobyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwpAQCAtMzgwLDExICszOTIsMTIgQEAKIGV4dGVybiBpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICosIF9fdTMyICopOwogZXh0ZXJuIGludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKiwKIAkJCSAgX191MzIgKik7Ci1leHRlcm4gaW50IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3Qgc21iX2hkciAqLAorZXh0ZXJuIGludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGt2ZWMgKmlvdiwgdW5zaWduZWQgaW50IG5yX2lvdiwKIAkJCQkgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkJCV9fdTMyIGV4cGVjdGVkX3NlcXVlbmNlX251bWJlcik7Ci1leHRlcm4gaW50IFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKLWV4dGVybiBpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKik7CitleHRlcm4gaW50IFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKK2V4dGVybiBpbnQgc2V0dXBfbnRsbV9yZXNwb25zZShzdHJ1Y3QgY2lmc19zZXMgKiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKIGV4dGVybiBpbnQgc2V0dXBfbnRsbXYyX3JzcChzdHJ1Y3QgY2lmc19zZXMgKiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKIGV4dGVybiBpbnQgY2lmc19jcnlwdG9fc2hhc2hfYWxsb2NhdGUoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqKTsKIGV4dGVybiB2b2lkIGNpZnNfY3J5cHRvX3NoYXNoX3JlbGVhc2Uoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqKTsKQEAgLTQxOSw3ICs0MzIsNyBAQAogZXh0ZXJuIGludCBDSUZTU01CR2V0Q0lGU0FDTChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAogCQkJX191MTYgZmlkLCBzdHJ1Y3QgY2lmc19udHNkICoqYWNsX2luZiwgX191MzIgKmJ1Zmxlbik7CiBleHRlcm4gaW50IENJRlNTTUJTZXRDSUZTQUNMKGNvbnN0IGludCwgc3RydWN0IGNpZnNfdGNvbiAqLCBfX3UxNiwKLQkJCXN0cnVjdCBjaWZzX250c2QgKiwgX191MzIpOworCQkJc3RydWN0IGNpZnNfbnRzZCAqLCBfX3UzMiwgaW50KTsKIGV4dGVybiBpbnQgQ0lGU1NNQkdldFBvc2l4QUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCiAJCWNoYXIgKmFjbF9pbmYsIGNvbnN0IGludCBidWZsZW4sIGNvbnN0IGludCBhY2xfdHlwZSwKQEAgLTQzNiwxMCArNDQ5LDI5IEBACiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGgsCiAJCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIGludCB4aWQpOwogZXh0ZXJuIGludCBtZGZvdXIodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IEVfbWQ0aGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKnAxNik7CitleHRlcm4gaW50IEVfbWQ0aGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKnAxNiwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKTsKIGV4dGVybiBpbnQgU01CZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmM4LAogCQkJdW5zaWduZWQgY2hhciAqcDI0KTsKIAorLyogYXN5bmNocm9ub3VzIHJlYWQgc3VwcG9ydCAqLworc3RydWN0IGNpZnNfcmVhZGRhdGEgeworCXN0cnVjdCBjaWZzRmlsZUluZm8JCSpjZmlsZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkJKm1hcHBpbmc7CisJX191NjQJCQkJb2Zmc2V0OworCXVuc2lnbmVkIGludAkJCWJ5dGVzOworCXBpZF90CQkJCXBpZDsKKwlpbnQJCQkJcmVzdWx0OworCXN0cnVjdCBsaXN0X2hlYWQJCXBhZ2VzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKKwl1bnNpZ25lZCBpbnQJCQlucl9pb3Y7CisJc3RydWN0IGt2ZWMJCQlpb3ZbMV07Cit9OworCitzdHJ1Y3QgY2lmc19yZWFkZGF0YSAqY2lmc19yZWFkZGF0YV9hbGxvYyh1bnNpZ25lZCBpbnQgbnJfcGFnZXMpOwordm9pZCBjaWZzX3JlYWRkYXRhX2ZyZWUoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKTsKK2ludCBjaWZzX2FzeW5jX3JlYWR2KHN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSk7CisKIC8qIGFzeW5jaHJvbm91cyB3cml0ZSBzdXBwb3J0ICovCiBzdHJ1Y3QgY2lmc193cml0ZWRhdGEgewogCXN0cnVjdCBrcmVmCQkJcmVmY291bnQ7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IGE4MGY3YmQuLjY2MDBhYTIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiY2lmc3BkdS5oIgogI2luY2x1ZGUgImNpZnNnbG9iLmgiCkBAIC00MCw2ICs0Miw3IEBACiAjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCiAjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImZzY2FjaGUuaCIKIAogI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCiBzdGF0aWMgc3RydWN0IHsKQEAgLTgzLDYgKzg2LDkgQEAKICNlbmRpZiAvKiBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggKi8KICNlbmRpZiAvKiBDSUZTX1BPU0lYICovCiAKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBjaWZzX3JlYWR2X2NvbXBsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIC8qIE1hcmsgYXMgaW52YWxpZCwgYWxsIG9wZW4gZmlsZXMgb24gdHJlZSBjb25uZWN0aW9ucyBzaW5jZSB0aGV5CiAgICB3ZXJlIGNsb3NlZCB3aGVuIHNlc3Npb24gdG8gc2VydmVyIHdhcyBsb3N0ICovCiBzdGF0aWMgdm9pZCBtYXJrX29wZW5fZmlsZXNfaW52YWxpZChzdHJ1Y3QgY2lmc190Y29uICpwVGNvbikKQEAgLTQ1Myw4ICs0NTksNyBAQAogCQl9CiAJCXNlcnZlci0+c2VjX21vZGUgPSAoX191OClsZTE2X3RvX2NwdShyc3AtPlNlY3VyaXR5TW9kZSk7CiAJCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocnNwLT5NYXhNcHhDb3VudCk7Ci0JCXNlcnZlci0+bWF4QnVmID0gbWluKChfX3UzMilsZTE2X3RvX2NwdShyc3AtPk1heEJ1ZlNpemUpLAotCQkJCShfX3UzMilDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFKTsKKwkJc2VydmVyLT5tYXhCdWYgPSBsZTE2X3RvX2NwdShyc3AtPk1heEJ1ZlNpemUpOwogCQlzZXJ2ZXItPm1heF92Y3MgPSBsZTE2X3RvX2NwdShyc3AtPk1heE51bWJlclZjcyk7CiAJCS8qIGV2ZW4gdGhvdWdoIHdlIGRvIG5vdCB1c2UgcmF3IHdlIG1pZ2h0IGFzIHdlbGwgc2V0IHRoaXMKIAkJYWNjdXJhdGVseSwgaW4gY2FzZSB3ZSBldmVyIGZpbmQgYSBuZWVkIGZvciBpdCAqLwpAQCAtNTYxLDggKzU2Niw3IEBACiAJICAgbGl0dGxlIGVuZGlhbiAqLwogCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocFNNQnItPk1heE1weENvdW50KTsKIAkvKiBwcm9iYWJseSBubyBuZWVkIHRvIHN0b3JlIGFuZCBjaGVjayBtYXh2Y3MgKi8KLQlzZXJ2ZXItPm1heEJ1ZiA9IG1pbihsZTMyX3RvX2NwdShwU01Cci0+TWF4QnVmZmVyU2l6ZSksCi0JCQkoX191MzIpIENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpOworCXNlcnZlci0+bWF4QnVmID0gbGUzMl90b19jcHUocFNNQnItPk1heEJ1ZmZlclNpemUpOwogCXNlcnZlci0+bWF4X3J3ID0gbGUzMl90b19jcHUocFNNQnItPk1heFJhd1NpemUpOwogCWNGWUkoREJHMiwgIk1heCBidWYgPSAlZCIsIHNlcy0+c2VydmVyLT5tYXhCdWYpOwogCXNlcnZlci0+Y2FwYWJpbGl0aWVzID0gbGUzMl90b19jcHUocFNNQnItPkNhcGFiaWxpdGllcyk7CkBAIC03MzksNyArNzQzLDggQEAKIAlpb3YuaW92X2Jhc2UgPSBzbWI7CiAJaW92Lmlvdl9sZW4gPSBiZTMyX3RvX2NwdShzbWItPmhkci5zbWJfYnVmX2xlbmd0aCkgKyA0OwogCi0JcmMgPSBjaWZzX2NhbGxfYXN5bmMoc2VydmVyLCAmaW92LCAxLCBjaWZzX2VjaG9fY2FsbGJhY2ssIHNlcnZlciwgdHJ1ZSk7CisJcmMgPSBjaWZzX2NhbGxfYXN5bmMoc2VydmVyLCAmaW92LCAxLCBOVUxMLCBjaWZzX2VjaG9fY2FsbGJhY2ssCisJCQkgICAgIHNlcnZlciwgdHJ1ZSk7CiAJaWYgKHJjKQogCQljRllJKDEsICJFY2hvIHJlcXVlc3QgZmFpbGVkOiAlZCIsIHJjKTsKIApAQCAtMTM3Niw2ICsxMzgxLDM1OSBAQAogCXJldHVybiByYzsKIH0KIAorc3RydWN0IGNpZnNfcmVhZGRhdGEgKgorY2lmc19yZWFkZGF0YV9hbGxvYyh1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCit7CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhOworCisJLyogcmVhZGRhdGEgKyAxIGt2ZWMgZm9yIGVhY2ggcGFnZSAqLworCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSArCisJCQlzaXplb2Yoc3RydWN0IGt2ZWMpICogbnJfcGFnZXMsIEdGUF9LRVJORUwpOworCWlmIChyZGF0YSAhPSBOVUxMKSB7CisJCUlOSVRfV09SSygmcmRhdGEtPndvcmssIGNpZnNfcmVhZHZfY29tcGxldGUpOworCQlJTklUX0xJU1RfSEVBRCgmcmRhdGEtPnBhZ2VzKTsKKwl9CisJcmV0dXJuIHJkYXRhOworfQorCit2b2lkCitjaWZzX3JlYWRkYXRhX2ZyZWUoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKQoreworCWNpZnNGaWxlSW5mb19wdXQocmRhdGEtPmNmaWxlKTsKKwlrZnJlZShyZGF0YSk7Cit9CisKKy8qCisgKiBEaXNjYXJkIGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY3VycmVudCBTTUIuIFRvIGRvIHRoaXMsIHdlIGJvcnJvdyB0aGUKKyAqIGN1cnJlbnQgYmlnYnVmLgorICovCitzdGF0aWMgaW50CitjaWZzX3JlYWR2X2Rpc2NhcmQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCkKK3sKKwlSRUFEX1JTUCAqcnNwID0gKFJFQURfUlNQICopc2VydmVyLT5zbWFsbGJ1ZjsKKwl1bnNpZ25lZCBpbnQgcmZjbGVuID0gYmUzMl90b19jcHUocnNwLT5oZHIuc21iX2J1Zl9sZW5ndGgpOworCWludCByZW1haW5pbmcgPSByZmNsZW4gKyA0IC0gc2VydmVyLT50b3RhbF9yZWFkOworCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSA9IG1pZC0+Y2FsbGJhY2tfZGF0YTsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisJCWludCBsZW5ndGg7CisKKwkJbGVuZ3RoID0gY2lmc19yZWFkX2Zyb21fc29ja2V0KHNlcnZlciwgc2VydmVyLT5iaWdidWYsCisJCQkJbWluX3QodW5zaWduZWQgaW50LCByZW1haW5pbmcsCisJCQkJCUNJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpKTsKKwkJaWYgKGxlbmd0aCA8IDApCisJCQlyZXR1cm4gbGVuZ3RoOworCQlzZXJ2ZXItPnRvdGFsX3JlYWQgKz0gbGVuZ3RoOworCQlyZW1haW5pbmcgLT0gbGVuZ3RoOworCX0KKworCWRlcXVldWVfbWlkKG1pZCwgcmRhdGEtPnJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcmVhZHZfcmVjZWl2ZShzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCWludCBsZW5ndGgsIGxlbjsKKwl1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQsIHJlbWFpbmluZywgZGF0YV9sZW47CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhID0gbWlkLT5jYWxsYmFja19kYXRhOworCVJFQURfUlNQICpyc3AgPSAoUkVBRF9SU1AgKilzZXJ2ZXItPnNtYWxsYnVmOworCXVuc2lnbmVkIGludCByZmNsZW4gPSBiZTMyX3RvX2NwdShyc3AtPmhkci5zbWJfYnVmX2xlbmd0aCkgKyA0OworCXU2NCBlb2Y7CisJcGdvZmZfdCBlb2ZfaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICp0cGFnZTsKKworCWNGWUkoMSwgIiVzOiBtaWQ9JXUgb2Zmc2V0PSVsbHUgYnl0ZXM9JXUiLCBfX2Z1bmNfXywKKwkJbWlkLT5taWQsIHJkYXRhLT5vZmZzZXQsIHJkYXRhLT5ieXRlcyk7CisKKwkvKgorCSAqIHJlYWQgdGhlIHJlc3Qgb2YgUkVBRF9SU1AgaGVhZGVyIChzYW5zIERhdGEgYXJyYXkpLCBvciB3aGF0ZXZlciB3ZQorCSAqIGNhbiBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YS4gQXQgdGhpcyBwb2ludCwgd2UndmUgcmVhZCBkb3duIHRvCisJICogdGhlIE1pZC4KKwkgKi8KKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHJmY2xlbiwgc2l6ZW9mKCpyc3ApKSAtCisJCQlzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMTsKKworCXJkYXRhLT5pb3ZbMF0uaW92X2Jhc2UgPSBzZXJ2ZXItPnNtYWxsYnVmICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDE7CisJcmRhdGEtPmlvdlswXS5pb3ZfbGVuID0gbGVuOworCisJbGVuZ3RoID0gY2lmc19yZWFkdl9mcm9tX3NvY2tldChzZXJ2ZXIsIHJkYXRhLT5pb3YsIDEsIGxlbik7CisJaWYgKGxlbmd0aCA8IDApCisJCXJldHVybiBsZW5ndGg7CisJc2VydmVyLT50b3RhbF9yZWFkICs9IGxlbmd0aDsKKworCS8qIFdhcyB0aGUgU01CIHJlYWQgc3VjY2Vzc2Z1bD8gKi8KKwlyZGF0YS0+cmVzdWx0ID0gbWFwX3NtYl90b19saW51eF9lcnJvcigmcnNwLT5oZHIsIGZhbHNlKTsKKwlpZiAocmRhdGEtPnJlc3VsdCAhPSAwKSB7CisJCWNGWUkoMSwgIiVzOiBzZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBfX2Z1bmNfXywKKwkJCXJkYXRhLT5yZXN1bHQpOworCQlyZXR1cm4gY2lmc19yZWFkdl9kaXNjYXJkKHNlcnZlciwgbWlkKTsKKwl9CisKKwkvKiBJcyB0aGVyZSBlbm91Z2ggdG8gZ2V0IHRvIHRoZSByZXN0IG9mIHRoZSBSRUFEX1JTUCBoZWFkZXI/ICovCisJaWYgKHNlcnZlci0+dG90YWxfcmVhZCA8IHNpemVvZihSRUFEX1JTUCkpIHsKKwkJY0ZZSSgxLCAiJXM6IHNlcnZlciByZXR1cm5lZCBzaG9ydCBoZWFkZXIuIGdvdD0ldSBleHBlY3RlZD0lenUiLAorCQkJX19mdW5jX18sIHNlcnZlci0+dG90YWxfcmVhZCwgc2l6ZW9mKFJFQURfUlNQKSk7CisJCXJkYXRhLT5yZXN1bHQgPSAtRUlPOworCQlyZXR1cm4gY2lmc19yZWFkdl9kaXNjYXJkKHNlcnZlciwgbWlkKTsKKwl9CisKKwlkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHJzcC0+RGF0YU9mZnNldCkgKyA0OworCWlmIChkYXRhX29mZnNldCA8IHNlcnZlci0+dG90YWxfcmVhZCkgeworCQkvKgorCQkgKiB3aW4yazggc29tZXRpbWVzIHNlbmRzIGFuIG9mZnNldCBvZiAwIHdoZW4gdGhlIHJlYWQKKwkJICogaXMgYmV5b25kIHRoZSBFT0YuIFRyZWF0IGl0IGFzIGlmIHRoZSBkYXRhIHN0YXJ0cyBqdXN0IGFmdGVyCisJCSAqIHRoZSBoZWFkZXIuCisJCSAqLworCQljRllJKDEsICIlczogZGF0YSBvZmZzZXQgKCV1KSBpbnNpZGUgcmVhZCByZXNwb25zZSBoZWFkZXIiLAorCQkJX19mdW5jX18sIGRhdGFfb2Zmc2V0KTsKKwkJZGF0YV9vZmZzZXQgPSBzZXJ2ZXItPnRvdGFsX3JlYWQ7CisJfSBlbHNlIGlmIChkYXRhX29mZnNldCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFKSB7CisJCS8qIGRhdGFfb2Zmc2V0IGlzIGJleW9uZCB0aGUgZW5kIG9mIHNtYWxsYnVmICovCisJCWNGWUkoMSwgIiVzOiBkYXRhIG9mZnNldCAoJXUpIGJleW9uZCBlbmQgb2Ygc21hbGxidWYiLAorCQkJX19mdW5jX18sIGRhdGFfb2Zmc2V0KTsKKwkJcmRhdGEtPnJlc3VsdCA9IC1FSU87CisJCXJldHVybiBjaWZzX3JlYWR2X2Rpc2NhcmQoc2VydmVyLCBtaWQpOworCX0KKworCWNGWUkoMSwgIiVzOiB0b3RhbF9yZWFkPSV1IGRhdGFfb2Zmc2V0PSV1IiwgX19mdW5jX18sCisJCXNlcnZlci0+dG90YWxfcmVhZCwgZGF0YV9vZmZzZXQpOworCisJbGVuID0gZGF0YV9vZmZzZXQgLSBzZXJ2ZXItPnRvdGFsX3JlYWQ7CisJaWYgKGxlbiA+IDApIHsKKwkJLyogcmVhZCBhbnkganVuayBiZWZvcmUgZGF0YSBpbnRvIHRoZSByZXN0IG9mIHNtYWxsYnVmICovCisJCXJkYXRhLT5pb3ZbMF0uaW92X2Jhc2UgPSBzZXJ2ZXItPnNtYWxsYnVmICsgc2VydmVyLT50b3RhbF9yZWFkOworCQlyZGF0YS0+aW92WzBdLmlvdl9sZW4gPSBsZW47CisJCWxlbmd0aCA9IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc2VydmVyLCByZGF0YS0+aW92LCAxLCBsZW4pOworCQlpZiAobGVuZ3RoIDwgMCkKKwkJCXJldHVybiBsZW5ndGg7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisJfQorCisJLyogc2V0IHVwIGZpcnN0IGlvdiBmb3Igc2lnbmF0dXJlIGNoZWNrICovCisJcmRhdGEtPmlvdlswXS5pb3ZfYmFzZSA9IHNlcnZlci0+c21hbGxidWY7CisJcmRhdGEtPmlvdlswXS5pb3ZfbGVuID0gc2VydmVyLT50b3RhbF9yZWFkOworCWNGWUkoMSwgIjA6IGlvdl9iYXNlPSVwIGlvdl9sZW49JXp1IiwKKwkJcmRhdGEtPmlvdlswXS5pb3ZfYmFzZSwgcmRhdGEtPmlvdlswXS5pb3ZfbGVuKTsKKworCS8qIGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIHJlc3BvbnNlPyAqLworCWRhdGFfbGVuID0gbGUxNl90b19jcHUocnNwLT5EYXRhTGVuZ3RoSGlnaCkgPDwgMTY7CisJZGF0YV9sZW4gKz0gbGUxNl90b19jcHUocnNwLT5EYXRhTGVuZ3RoKTsKKwlpZiAoZGF0YV9vZmZzZXQgKyBkYXRhX2xlbiA+IHJmY2xlbikgeworCQkvKiBkYXRhX2xlbiBpcyBjb3JydXB0IC0tIGRpc2NhcmQgZnJhbWUgKi8KKwkJcmRhdGEtPnJlc3VsdCA9IC1FSU87CisJCXJldHVybiBjaWZzX3JlYWR2X2Rpc2NhcmQoc2VydmVyLCBtaWQpOworCX0KKworCS8qIG1hcnNoYWwgdXAgdGhlIHBhZ2UgYXJyYXkgKi8KKwlsZW4gPSAwOworCXJlbWFpbmluZyA9IGRhdGFfbGVuOworCXJkYXRhLT5ucl9pb3YgPSAxOworCisJLyogZGV0ZXJtaW5lIHRoZSBlb2YgdGhhdCB0aGUgc2VydmVyIChwcm9iYWJseSkgaGFzICovCisJZW9mID0gQ0lGU19JKHJkYXRhLT5tYXBwaW5nLT5ob3N0KS0+c2VydmVyX2VvZjsKKwllb2ZfaW5kZXggPSBlb2YgPyAoZW9mIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA6IDA7CisJY0ZZSSgxLCAiZW9mPSVsbHUgZW9mX2luZGV4PSVsdSIsIGVvZiwgZW9mX2luZGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywgbHJ1KSB7CisJCWlmIChyZW1haW5pbmcgPj0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQkvKiBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSBwYWdlICovCisJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9iYXNlID0ga21hcChwYWdlKTsKKwkJCXJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2xlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCWNGWUkoMSwgIiV1OiBpZHg9JWx1IGlvdl9iYXNlPSVwIGlvdl9sZW49JXp1IiwKKwkJCQlyZGF0YS0+bnJfaW92LCBwYWdlLT5pbmRleCwKKwkJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9iYXNlLAorCQkJCXJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2xlbik7CisJCQkrK3JkYXRhLT5ucl9pb3Y7CisJCQlsZW4gKz0gUEFHRV9DQUNIRV9TSVpFOworCQkJcmVtYWluaW5nIC09IFBBR0VfQ0FDSEVfU0laRTsKKwkJfSBlbHNlIGlmIChyZW1haW5pbmcgPiAwKSB7CisJCQkvKiBlbm91Z2ggZm9yIHBhcnRpYWwgcGFnZSwgZmlsbCBhbmQgemVybyB0aGUgcmVzdCAqLworCQkJcmRhdGEtPmlvdltyZGF0YS0+bnJfaW92XS5pb3ZfYmFzZSA9IGttYXAocGFnZSk7CisJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9sZW4gPSByZW1haW5pbmc7CisJCQljRllJKDEsICIldTogaWR4PSVsdSBpb3ZfYmFzZT0lcCBpb3ZfbGVuPSV6dSIsCisJCQkJcmRhdGEtPm5yX2lvdiwgcGFnZS0+aW5kZXgsCisJCQkJcmRhdGEtPmlvdltyZGF0YS0+bnJfaW92XS5pb3ZfYmFzZSwKKwkJCQlyZGF0YS0+aW92W3JkYXRhLT5ucl9pb3ZdLmlvdl9sZW4pOworCQkJbWVtc2V0KHJkYXRhLT5pb3ZbcmRhdGEtPm5yX2lvdl0uaW92X2Jhc2UgKyByZW1haW5pbmcsCisJCQkJJ1wwJywgUEFHRV9DQUNIRV9TSVpFIC0gcmVtYWluaW5nKTsKKwkJCSsrcmRhdGEtPm5yX2lvdjsKKwkJCWxlbiArPSByZW1haW5pbmc7CisJCQlyZW1haW5pbmcgPSAwOworCQl9IGVsc2UgaWYgKHBhZ2UtPmluZGV4ID4gZW9mX2luZGV4KSB7CisJCQkvKgorCQkJICogVGhlIFZGUyB3aWxsIG5vdCB0cnkgdG8gZG8gcmVhZGFoZWFkIHBhc3QgdGhlCisJCQkgKiBpX3NpemUsIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBvdXRzdGFuZGluZworCQkJICogd3JpdGVzIHdpdGggZ2FwcyBpbiB0aGUgbWlkZGxlIGFuZCB0aGUgaV9zaXplIGhhc24ndAorCQkJICogY2F1Z2h0IHVwIHlldC4gUG9wdWxhdGUgdGhvc2Ugd2l0aCB6ZXJvZWQgb3V0IHBhZ2VzCisJCQkgKiB0byBwcmV2ZW50IHRoZSBWRlMgZnJvbSByZXBlYXRlZGx5IGF0dGVtcHRpbmcgdG8KKwkJCSAqIGZpbGwgdGhlbSB1bnRpbCB0aGUgd3JpdGVzIGFyZSBmbHVzaGVkLgorCQkJICovCisJCQl6ZXJvX3VzZXIocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vIG5lZWQgdG8gaG9sZCBwYWdlIGhvc3RhZ2UgKi8KKwkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9CisKKwkvKiBpc3N1ZSB0aGUgcmVhZCBpZiB3ZSBoYXZlIGFueSBpb3ZlY3MgbGVmdCB0byBmaWxsICovCisJaWYgKHJkYXRhLT5ucl9pb3YgPiAxKSB7CisJCWxlbmd0aCA9IGNpZnNfcmVhZHZfZnJvbV9zb2NrZXQoc2VydmVyLCAmcmRhdGEtPmlvdlsxXSwKKwkJCQkJCXJkYXRhLT5ucl9pb3YgLSAxLCBsZW4pOworCQlpZiAobGVuZ3RoIDwgMCkKKwkJCXJldHVybiBsZW5ndGg7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gMDsKKwl9CisKKwlyZGF0YS0+Ynl0ZXMgPSBsZW5ndGg7CisKKwljRllJKDEsICJ0b3RhbF9yZWFkPSV1IHJmY2xlbj0ldSByZW1haW5pbmc9JXUiLCBzZXJ2ZXItPnRvdGFsX3JlYWQsCisJCXJmY2xlbiwgcmVtYWluaW5nKTsKKworCS8qIGRpc2NhcmQgYW55dGhpbmcgbGVmdCBvdmVyICovCisJaWYgKHNlcnZlci0+dG90YWxfcmVhZCA8IHJmY2xlbikKKwkJcmV0dXJuIGNpZnNfcmVhZHZfZGlzY2FyZChzZXJ2ZXIsIG1pZCk7CisKKwlkZXF1ZXVlX21pZChtaWQsIGZhbHNlKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZAorY2lmc19yZWFkdl9jb21wbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQlzdHJ1Y3QgY2lmc19yZWFkZGF0YSwgd29yayk7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICp0cGFnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywgbHJ1KSB7CisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCQlscnVfY2FjaGVfYWRkX2ZpbGUocGFnZSk7CisKKwkJaWYgKHJkYXRhLT5yZXN1bHQgPT0gMCkgeworCQkJa3VubWFwKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0KKworCQl1bmxvY2tfcGFnZShwYWdlKTsKKworCQlpZiAocmRhdGEtPnJlc3VsdCA9PSAwKQorCQkJY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKHJkYXRhLT5tYXBwaW5nLT5ob3N0LCBwYWdlKTsKKworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWNpZnNfcmVhZGRhdGFfZnJlZShyZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitjaWZzX3JlYWR2X2NhbGxiYWNrKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YSA9IG1pZC0+Y2FsbGJhY2tfZGF0YTsKKwlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gdGxpbmtfdGNvbihyZGF0YS0+Y2ZpbGUtPnRsaW5rKTsKKwlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKKworCWNGWUkoMSwgIiVzOiBtaWQ9JXUgc3RhdGU9JWQgcmVzdWx0PSVkIGJ5dGVzPSV1IiwgX19mdW5jX18sCisJCW1pZC0+bWlkLCBtaWQtPm1pZFN0YXRlLCByZGF0YS0+cmVzdWx0LCByZGF0YS0+Ynl0ZXMpOworCisJc3dpdGNoIChtaWQtPm1pZFN0YXRlKSB7CisJY2FzZSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ6CisJCS8qIHJlc3VsdCBhbHJlYWR5IHNldCwgY2hlY2sgc2lnbmF0dXJlICovCisJCWlmIChzZXJ2ZXItPnNlY19tb2RlICYKKwkJICAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKKwkJCWlmIChjaWZzX3ZlcmlmeV9zaWduYXR1cmUocmRhdGEtPmlvdiwgcmRhdGEtPm5yX2lvdiwKKwkJCQkJICBzZXJ2ZXIsIG1pZC0+c2VxdWVuY2VfbnVtYmVyICsgMSkpCisJCQkJY0VSUk9SKDEsICJVbmV4cGVjdGVkIFNNQiBzaWduYXR1cmUiKTsKKwkJfQorCQkvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgY291bnRlZCB0b3dhcmQgdGhlIGluaXRpYXRpbmcgdGFzaz8gKi8KKwkJdGFza19pb19hY2NvdW50X3JlYWQocmRhdGEtPmJ5dGVzKTsKKwkJY2lmc19zdGF0c19ieXRlc19yZWFkKHRjb24sIHJkYXRhLT5ieXRlcyk7CisJCWJyZWFrOworCWNhc2UgTUlEX1JFUVVFU1RfU1VCTUlUVEVEOgorCWNhc2UgTUlEX1JFVFJZX05FRURFRDoKKwkJcmRhdGEtPnJlc3VsdCA9IC1FQUdBSU47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJkYXRhLT5yZXN1bHQgPSAtRUlPOworCX0KKworCXF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwgJnJkYXRhLT53b3JrKTsKKwlEZWxldGVNaWRRRW50cnkobWlkKTsKKwlhdG9taWNfZGVjKCZzZXJ2ZXItPmluRmxpZ2h0KTsKKwl3YWtlX3VwKCZzZXJ2ZXItPnJlcXVlc3RfcSk7Cit9CisKKy8qIGNpZnNfYXN5bmNfcmVhZHYgLSBzZW5kIGFuIGFzeW5jIHdyaXRlLCBhbmQgc2V0IHVwIG1pZCB0byBoYW5kbGUgcmVzdWx0ICovCitpbnQKK2NpZnNfYXN5bmNfcmVhZHYoc3RydWN0IGNpZnNfcmVhZGRhdGEgKnJkYXRhKQoreworCWludCByYzsKKwlSRUFEX1JFUSAqc21iID0gTlVMTDsKKwlpbnQgd2N0OworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKHJkYXRhLT5jZmlsZS0+dGxpbmspOworCisJY0ZZSSgxLCAiJXM6IG9mZnNldD0lbGx1IGJ5dGVzPSV1IiwgX19mdW5jX18sCisJCXJkYXRhLT5vZmZzZXQsIHJkYXRhLT5ieXRlcyk7CisKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpCisJCXdjdCA9IDEyOworCWVsc2UgeworCQl3Y3QgPSAxMDsgLyogb2xkIHN0eWxlIHJlYWQgKi8KKwkJaWYgKChyZGF0YS0+b2Zmc2V0ID4+IDMyKSA+IDApICB7CisJCQkvKiBjYW4gbm90IGhhbmRsZSB0aGlzIGJpZyBvZmZzZXQgZm9yIG9sZCAqLworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fUkVBRF9BTkRYLCB3Y3QsIHRjb24sICh2b2lkICoqKSZzbWIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc21iLT5oZHIuUGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KXJkYXRhLT5waWQpOworCXNtYi0+aGRyLlBpZEhpZ2ggPSBjcHVfdG9fbGUxNigoX191MTYpKHJkYXRhLT5waWQgPj4gMTYpKTsKKworCXNtYi0+QW5kWENvbW1hbmQgPSAweEZGOwkvKiBub25lICovCisJc21iLT5GaWQgPSByZGF0YS0+Y2ZpbGUtPm5ldGZpZDsKKwlzbWItPk9mZnNldExvdyA9IGNwdV90b19sZTMyKHJkYXRhLT5vZmZzZXQgJiAweEZGRkZGRkZGKTsKKwlpZiAod2N0ID09IDEyKQorCQlzbWItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihyZGF0YS0+b2Zmc2V0ID4+IDMyKTsKKwlzbWItPlJlbWFpbmluZyA9IDA7CisJc21iLT5NYXhDb3VudCA9IGNwdV90b19sZTE2KHJkYXRhLT5ieXRlcyAmIDB4RkZGRik7CisJc21iLT5NYXhDb3VudEhpZ2ggPSBjcHVfdG9fbGUzMihyZGF0YS0+Ynl0ZXMgPj4gMTYpOworCWlmICh3Y3QgPT0gMTIpCisJCXNtYi0+Qnl0ZUNvdW50ID0gMDsKKwllbHNlIHsKKwkJLyogb2xkIHN0eWxlIHJlYWQgKi8KKwkJc3RydWN0IHNtYl9jb21fcmVhZHhfcmVxICpzbWJyID0KKwkJCShzdHJ1Y3Qgc21iX2NvbV9yZWFkeF9yZXEgKilzbWI7CisJCXNtYnItPkJ5dGVDb3VudCA9IDA7CisJfQorCisJLyogNCBmb3IgUkZDMTAwMSBsZW5ndGggKyAxIGZvciBCQ0MgKi8KKwlyZGF0YS0+aW92WzBdLmlvdl9iYXNlID0gc21iOworCXJkYXRhLT5pb3ZbMF0uaW92X2xlbiA9IGJlMzJfdG9fY3B1KHNtYi0+aGRyLnNtYl9idWZfbGVuZ3RoKSArIDQ7CisKKwlyYyA9IGNpZnNfY2FsbF9hc3luYyh0Y29uLT5zZXMtPnNlcnZlciwgcmRhdGEtPmlvdiwgMSwKKwkJCSAgICAgY2lmc19yZWFkdl9yZWNlaXZlLCBjaWZzX3JlYWR2X2NhbGxiYWNrLAorCQkJICAgICByZGF0YSwgZmFsc2UpOworCisJaWYgKHJjID09IDApCisJCWNpZnNfc3RhdHNfaW5jKCZ0Y29uLT5udW1fcmVhZHMpOworCisJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWIpOworCXJldHVybiByYzsKK30KKwogaW50CiBDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc19pb19wYXJtcyAqaW9fcGFybXMsIHVuc2lnbmVkIGludCAqbmJ5dGVzLAogCSAgICBjaGFyICoqYnVmLCBpbnQgKnBidWZfdHlwZSkKQEAgLTE4MzYsNyArMjE5NCw3IEBACiAKIAlrcmVmX2dldCgmd2RhdGEtPnJlZmNvdW50KTsKIAlyYyA9IGNpZnNfY2FsbF9hc3luYyh0Y29uLT5zZXMtPnNlcnZlciwgaW92LCB3ZGF0YS0+bnJfcGFnZXMgKyAxLAotCQkJICAgICBjaWZzX3dyaXRldl9jYWxsYmFjaywgd2RhdGEsIGZhbHNlKTsKKwkJCSAgICAgTlVMTCwgY2lmc193cml0ZXZfY2FsbGJhY2ssIHdkYXRhLCBmYWxzZSk7CiAKIAlpZiAocmMgPT0gMCkKIAkJY2lmc19zdGF0c19pbmMoJnRjb24tPm51bV93cml0ZXMpOwpAQCAtMTk2MiwxMCArMjMyMCw1MCBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGNpZnNfbG9ja3YoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgY29uc3QgX191MTYgbmV0ZmlkLAorCSAgICAgICBjb25zdCBfX3U4IGxvY2tfdHlwZSwgY29uc3QgX191MzIgbnVtX3VubG9jaywKKwkgICAgICAgY29uc3QgX191MzIgbnVtX2xvY2ssIExPQ0tJTkdfQU5EWF9SQU5HRSAqYnVmKQoreworCWludCByYyA9IDA7CisJTE9DS19SRVEgKnBTTUIgPSBOVUxMOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwlpbnQgcmVzcF9idWZfdHlwZTsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgImNpZnNfbG9ja3YgbnVtIGxvY2sgJWQgbnVtIHVubG9jayAlZCIsIG51bV9sb2NrLCBudW1fdW5sb2NrKTsKKworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9MT0NLSU5HX0FORFgsIDgsIHRjb24sICh2b2lkICoqKSAmcFNNQik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5OdW1iZXJPZkxvY2tzID0gY3B1X3RvX2xlMTYobnVtX2xvY2spOworCXBTTUItPk51bWJlck9mVW5sb2NrcyA9IGNwdV90b19sZTE2KG51bV91bmxvY2spOworCXBTTUItPkxvY2tUeXBlID0gbG9ja190eXBlOworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsgLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsgLyogbmV0ZmlkIHN0YXlzIGxlICovCisKKwljb3VudCA9IChudW1fdW5sb2NrICsgbnVtX2xvY2spICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisJaW5jX3JmYzEwMDFfbGVuKHBTTUIsIGNvdW50KTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSAoY2hhciAqKXBTTUI7CisJaW92WzBdLmlvdl9sZW4gPSBiZTMyX3RvX2NwdShwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGgpICsgNCAtCisJCQkgKG51bV91bmxvY2sgKyBudW1fbG9jaykgKiBzaXplb2YoTE9DS0lOR19BTkRYX1JBTkdFKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKWJ1ZjsKKwlpb3ZbMV0uaW92X2xlbiA9IChudW1fdW5sb2NrICsgbnVtX2xvY2spICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisKKwljaWZzX3N0YXRzX2luYygmdGNvbi0+bnVtX2xvY2tzKTsKKwlyYyA9IFNlbmRSZWNlaXZlMih4aWQsIHRjb24tPnNlcywgaW92LCAyLCAmcmVzcF9idWZfdHlwZSwgQ0lGU19OT19SRVNQKTsKKwlpZiAocmMpCisJCWNGWUkoMSwgIlNlbmQgZXJyb3IgaW4gY2lmc19sb2NrdiA9ICVkIiwgcmMpOworCisJcmV0dXJuIHJjOworfQogCiBpbnQKIENJRlNTTUJMb2NrKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCi0JICAgIGNvbnN0IF9fdTE2IHNtYl9maWxlX2lkLCBjb25zdCBfX3U2NCBsZW4sCisJICAgIGNvbnN0IF9fdTE2IHNtYl9maWxlX2lkLCBjb25zdCBfX3UzMiBuZXRwaWQsIGNvbnN0IF9fdTY0IGxlbiwKIAkgICAgY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCiAJICAgIGNvbnN0IF9fdTMyIG51bUxvY2ssIGNvbnN0IF9fdTggbG9ja1R5cGUsCiAJICAgIGNvbnN0IGJvb2wgd2FpdEZsYWcsIGNvbnN0IF9fdTggb3Bsb2NrX2xldmVsKQpAQCAtMjAwMSw3ICsyMzk5LDcgQEAKIAlwU01CLT5GaWQgPSBzbWJfZmlsZV9pZDsgLyogbmV0ZmlkIHN0YXlzIGxlICovCiAKIAlpZiAoKG51bUxvY2sgIT0gMCkgfHwgKG51bVVubG9jayAhPSAwKSkgewotCQlwU01CLT5Mb2Nrc1swXS5QaWQgPSBjcHVfdG9fbGUxNihjdXJyZW50LT50Z2lkKTsKKwkJcFNNQi0+TG9ja3NbMF0uUGlkID0gY3B1X3RvX2xlMTYobmV0cGlkKTsKIAkJLyogQkIgd2hlcmUgdG8gc3RvcmUgcGlkIGhpZ2g/ICovCiAJCXBTTUItPkxvY2tzWzBdLkxlbmd0aExvdyA9IGNwdV90b19sZTMyKCh1MzIpbGVuKTsKIAkJcFNNQi0+TG9ja3NbMF0uTGVuZ3RoSGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxlbj4+MzIpKTsKQEAgLTIwMzUsOSArMjQzMyw5IEBACiAKIGludAogQ0lGU1NNQlBvc2l4TG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc190Y29uICp0Y29uLAotCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgaW50IGdldF9mbGFnLCBjb25zdCBfX3U2NCBsZW4sCi0JCXN0cnVjdCBmaWxlX2xvY2sgKnBMb2NrRGF0YSwgY29uc3QgX191MTYgbG9ja190eXBlLAotCQljb25zdCBib29sIHdhaXRGbGFnKQorCQljb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191MzIgbmV0cGlkLCBjb25zdCBpbnQgZ2V0X2ZsYWcsCisJCWNvbnN0IF9fdTY0IGxlbiwgc3RydWN0IGZpbGVfbG9jayAqcExvY2tEYXRhLAorCQljb25zdCBfX3UxNiBsb2NrX3R5cGUsIGNvbnN0IGJvb2wgd2FpdEZsYWcpCiB7CiAJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKIAlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOwpAQCAtMjA5NSw3ICsyNDkzLDcgQEAKIAl9IGVsc2UKIAkJcFNNQi0+VGltZW91dCA9IDA7CiAKLQlwYXJtX2RhdGEtPnBpZCA9IGNwdV90b19sZTMyKGN1cnJlbnQtPnRnaWQpOworCXBhcm1fZGF0YS0+cGlkID0gY3B1X3RvX2xlMzIobmV0cGlkKTsKIAlwYXJtX2RhdGEtPnN0YXJ0ID0gY3B1X3RvX2xlNjQocExvY2tEYXRhLT5mbF9zdGFydCk7CiAJcGFybV9kYXRhLT5sZW5ndGggPSBjcHVfdG9fbGU2NChsZW4pOyAgLyogbm9ybWFsaXplIG5lZ2F0aXZlIG51bWJlcnMgKi8KIApAQCAtMjgxMiw4ICszMjEwLDcgQEAKIAlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CiAJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMigyKTsKIAkvKiBCQiBmaW5kIGV4YWN0IGRhdGEgY291bnQgbWF4IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gNDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gMDsKQEAgLTMzMDYsOCArMzcwMyw3IEBACiAJcFNNQi0+UmVzZXJ2ZWQgPSAwOwogCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMihwYXJtX2xlbik7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgID0gMDsKLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMzIoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CiAJcFNNQi0+RGF0YUNvdW50ICA9IHBTTUItPlRvdGFsRGF0YUNvdW50OwogCXRlbXBfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fbnRyYW5zYWN0X3JlcSwgUGFybXMpICsKQEAgLTM0NjcsNyArMzg2Myw3IEBACiAKIGludAogQ0lGU1NNQlNldENJRlNBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgX191MTYgZmlkLAotCQkJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QsIF9fdTMyIGFjbGxlbikKKwkJCXN0cnVjdCBjaWZzX250c2QgKnBudHNkLCBfX3UzMiBhY2xsZW4sIGludCBhY2xmbGFnKQogewogCV9fdTE2IGJ5dGVfY291bnQsIHBhcmFtX2NvdW50LCBkYXRhX2NvdW50LCBwYXJhbV9vZmZzZXQsIGRhdGFfb2Zmc2V0OwogCWludCByYyA9IDA7CkBAIC0zNTA0LDcgKzM5MDAsNyBAQAogCiAJcFNNQi0+RmlkID0gZmlkOyAvKiBmaWxlIGhhbmRsZSBhbHdheXMgbGUgKi8KIAlwU01CLT5SZXNlcnZlZDIgPSAwOwotCXBTTUItPkFjbEZsYWdzID0gY3B1X3RvX2xlMzIoQ0lGU19BQ0xfREFDTCk7CisJcFNNQi0+QWNsRmxhZ3MgPSBjcHVfdG9fbGUzMihhY2xmbGFnKTsKIAogCWlmIChwbnRzZCAmJiBhY2xsZW4pIHsKIAkJbWVtY3B5KChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsgZGF0YV9vZmZzZXQsCkBAIC0zOTc3LDggKzQzNzMsNyBAQAogCXBhcmFtcyA9IDEyICsgbmFtZV9sZW4gLyogaW5jbHVkZXMgbnVsbCAqLyA7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwkvKiBubyBFQXMgKi8KIAlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDEwKTsKLQlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtCi0JCQkJCSAgTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+RmxhZ3MgPSAwOwpAQCAtNDA1Miw4ICs0NDQ3LDcgQEAKIAkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSA9IDIgLyogc2tpcCAuIGFuZCAuLiAqLyArCiAJCQkJcHNyY2hfaW5mLT5lbnRyaWVzX2luX2J1ZmZlcjsKIAkJCWxub2ZmID0gbGUxNl90b19jcHUocGFybXMtPkxhc3ROYW1lT2Zmc2V0KTsKLQkJCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUgPAotCQkJICAgICAgbG5vZmYpIHsKKwkJCWlmIChDSUZTTWF4QnVmU2l6ZSA8IGxub2ZmKSB7CiAJCQkJY0VSUk9SKDEsICJpZ25vcmluZyBjb3JydXB0IHJlc3VtZSBuYW1lIik7CiAJCQkJcHNyY2hfaW5mLT5sYXN0X2VudHJ5ID0gTlVMTDsKIAkJCQlyZXR1cm4gcmM7CkBAIC00MDk3LDkgKzQ0OTEsNyBAQAogCWJ5dGVfY291bnQgPSAwOwogCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsgICAgICAgLyogbm8gRUFzICovCiAJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNig4KTsKLQlwU01CLT5NYXhEYXRhQ291bnQgPQotCQljcHVfdG9fbGUxNigodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFKSAmCi0JCQkJMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgJiAweEZGRkZGRjAwKTsKIAlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKIAlwU01CLT5SZXNlcnZlZCA9IDA7CiAJcFNNQi0+RmxhZ3MgPSAwOwpAQCAtNDE4MSw4ICs0NTczLDcgQEAKIAkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSArPQogCQkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXI7CiAJCQlsbm9mZiA9IGxlMTZfdG9fY3B1KHBhcm1zLT5MYXN0TmFtZU9mZnNldCk7Ci0JCQlpZiAodGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFIDwKLQkJCSAgICAgIGxub2ZmKSB7CisJCQlpZiAoQ0lGU01heEJ1ZlNpemUgPCBsbm9mZikgewogCQkJCWNFUlJPUigxLCAiaWdub3JpbmcgY29ycnVwdCByZXN1bWUgbmFtZSIpOwogCQkJCXBzcmNoX2luZi0+bGFzdF9lbnRyeSA9IE5VTEw7CiAJCQkJcmV0dXJuIHJjOwpAQCAtNTg0MCw3ICs2MjMxLDcgQEAKIAogCQlpZiAoZWFfbmFtZSkgewogCQkJaWYgKGVhX25hbWVfbGVuID09IG5hbWVfbGVuICYmCi0JCQkgICAgc3RybmNtcChlYV9uYW1lLCB0ZW1wX3B0ciwgbmFtZV9sZW4pID09IDApIHsKKwkJCSAgICBtZW1jbXAoZWFfbmFtZSwgdGVtcF9wdHIsIG5hbWVfbGVuKSA9PSAwKSB7CiAJCQkJdGVtcF9wdHIgKz0gbmFtZV9sZW4gKyAxOwogCQkJCXJjID0gdmFsdWVfbGVuOwogCQkJCWlmIChidWZfc2l6ZSA9PSAwKQpAQCAtNjAzNSwxMiArNjQyNiw3IEBACiAJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IDAgOwogCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKIAlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTMyKDIpOwotCS8qIEJCIGZpbmQgZXhhY3QgZGF0YSBjb3VudCBtYXggZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLwotCXBTTUItPk1heERhdGFDb3VudCA9IDA7IC8qIHNhbWUgaW4gbGl0dGxlIGVuZGlhbiBvciBiZSAqLwotLyogQkIgVkVSSUZZIHZlcmlmeSB3aGljaCBpcyBjb3JyZWN0IGZvciBhYm92ZSBCQiAqLwotCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTMyKCh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0KLQkJCQkJICAgICBNQVhfQ0lGU19IRFJfU0laRSkgJiAweEZGRkZGRjAwKTsKLQorCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTMyKENJRlNNYXhCdWZTaXplICYgMHhGRkZGRkYwMCk7CiAJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDQ7CiAJcFNNQi0+UmVzZXJ2ZWQgPSAwOwogCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IDA7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDYyYWJmOWYuLmQ2YTk3MmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSAiY2lmc3BkdS5oIgogI2luY2x1ZGUgImNpZnNnbG9iLmgiCkBAIC0xODEsNyArMTgyLDcgQEAKIAkJLUVJTlZBTCA9IGludmFsaWQgdHJhbnNhY3QyCiAKICAqLwotc3RhdGljIGludCBjaGVjazJuZFQyKHN0cnVjdCBzbWJfaGRyICpwU01CLCB1bnNpZ25lZCBpbnQgbWF4QnVmU2l6ZSkKK3N0YXRpYyBpbnQgY2hlY2sybmRUMihzdHJ1Y3Qgc21iX2hkciAqcFNNQikKIHsKIAlzdHJ1Y3Qgc21iX3QyX3JzcCAqcFNNQnQ7CiAJaW50IHJlbWFpbmluZzsKQEAgLTIxNCw5ICsyMTUsOSBAQAogCiAJY0ZZSSgxLCAibWlzc2luZyAlZCBieXRlcyBmcm9tIHRyYW5zYWN0MiwgY2hlY2sgbmV4dCByZXNwb25zZSIsCiAJCXJlbWFpbmluZyk7Ci0JaWYgKHRvdGFsX2RhdGFfc2l6ZSA+IG1heEJ1ZlNpemUpIHsKKwlpZiAodG90YWxfZGF0YV9zaXplID4gQ0lGU01heEJ1ZlNpemUpIHsKIAkJY0VSUk9SKDEsICJUb3RhbERhdGFTaXplICVkIGlzIG92ZXIgbWF4aW11bSBidWZmZXIgJWQiLAotCQkJdG90YWxfZGF0YV9zaXplLCBtYXhCdWZTaXplKTsKKwkJCXRvdGFsX2RhdGFfc2l6ZSwgQ0lGU01heEJ1ZlNpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIHJlbWFpbmluZzsKQEAgLTMyMCwyNyArMzIxLDI0IEBACiB9CiAKIHN0YXRpYyBib29sCi1hbGxvY2F0ZV9idWZmZXJzKGNoYXIgKipiaWdidWYsIGNoYXIgKipzbWFsbGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCi0JCSBib29sIGlzX2xhcmdlX2J1ZikKK2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQogewotCWNoYXIgKmJidWYgPSAqYmlnYnVmLCAqc2J1ZiA9ICpzbWFsbGJ1ZjsKLQotCWlmIChiYnVmID09IE5VTEwpIHsKLQkJYmJ1ZiA9IChjaGFyICopY2lmc19idWZfZ2V0KCk7Ci0JCWlmICghYmJ1ZikgeworCWlmICghc2VydmVyLT5iaWdidWYpIHsKKwkJc2VydmVyLT5iaWdidWYgPSAoY2hhciAqKWNpZnNfYnVmX2dldCgpOworCQlpZiAoIXNlcnZlci0+YmlnYnVmKSB7CiAJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgbGFyZ2UgU01CIHJlc3BvbnNlIik7CiAJCQltc2xlZXAoMzAwMCk7CiAJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCX0gZWxzZSBpZiAoaXNfbGFyZ2VfYnVmKSB7CisJfSBlbHNlIGlmIChzZXJ2ZXItPmxhcmdlX2J1ZikgewogCQkvKiB3ZSBhcmUgcmV1c2luZyBhIGRpcnR5IGxhcmdlIGJ1ZiwgY2xlYXIgaXRzIHN0YXJ0ICovCi0JCW1lbXNldChiYnVmLCAwLCBzaXplKTsKKwkJbWVtc2V0KHNlcnZlci0+YmlnYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKIAl9CiAKLQlpZiAoc2J1ZiA9PSBOVUxMKSB7Ci0JCXNidWYgPSAoY2hhciAqKWNpZnNfc21hbGxfYnVmX2dldCgpOwotCQlpZiAoIXNidWYpIHsKKwlpZiAoIXNlcnZlci0+c21hbGxidWYpIHsKKwkJc2VydmVyLT5zbWFsbGJ1ZiA9IChjaGFyICopY2lmc19zbWFsbF9idWZfZ2V0KCk7CisJCWlmICghc2VydmVyLT5zbWFsbGJ1ZikgewogCQkJY0VSUk9SKDEsICJObyBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpOwogCQkJbXNsZWVwKDEwMDApOwogCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCkBAIC0zNDksMzYgKzM0NywxMTYgQEAKIAkJLyogYmVnaW5uaW5nIG9mIHNtYiBidWZmZXIgaXMgY2xlYXJlZCBpbiBvdXIgYnVmX2dldCAqLwogCX0gZWxzZSB7CiAJCS8qIGlmIGV4aXN0aW5nIHNtYWxsIGJ1ZiBjbGVhciBiZWdpbm5pbmcgKi8KLQkJbWVtc2V0KHNidWYsIDAsIHNpemUpOworCQltZW1zZXQoc2VydmVyLT5zbWFsbGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CiAJfQogCi0JKmJpZ2J1ZiA9IGJidWY7Ci0JKnNtYWxsYnVmID0gc2J1ZjsKLQogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50Ci1yZWFkX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKLQkJIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCB0b19yZWFkLAotCQkgdW5zaWduZWQgaW50ICpwdG90YWxfcmVhZCwgYm9vbCBpc19oZWFkZXJfcmVhZCkKK3N0YXRpYyBib29sCitzZXJ2ZXJfdW5yZXNwb25zaXZlKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKIHsKLQlpbnQgbGVuZ3RoLCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7Ci0JY2hhciAqYnVmID0gaW92LT5pb3ZfYmFzZTsKKwlpZiAoZWNob19yZXRyaWVzID4gMCAmJiBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzR29vZCAmJgorCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKworCQkJCShlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCkpKSB7CisJCWNFUlJPUigxLCAiU2VydmVyICVzIGhhcyBub3QgcmVzcG9uZGVkIGluICVkIHNlY29uZHMuICIKKwkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCisJCQkgIChlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCAvIEhaKSk7CisJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCXJldHVybiB0cnVlOworCX0KIAotCWZvciAodG90YWxfcmVhZCA9IDA7IHRvdGFsX3JlYWQgPCB0b19yZWFkOyB0b3RhbF9yZWFkICs9IGxlbmd0aCkgewotCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsIHNtYl9tc2csIGlvdiwgMSwKLQkJCQkJdG9fcmVhZCAtIHRvdGFsX3JlYWQsIDApOworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIGt2ZWNfYXJyYXlfaW5pdCAtIGNsb25lIGEga3ZlYyBhcnJheSwgYW5kIGFkdmFuY2UgaW50byBpdAorICogQG5ldzoJcG9pbnRlciB0byBtZW1vcnkgZm9yIGNsb25lZCBhcnJheQorICogQGlvdjoJcG9pbnRlciB0byBvcmlnaW5hbCBhcnJheQorICogQG5yX3NlZ3M6CW51bWJlciBvZiBtZW1iZXJzIGluIG9yaWdpbmFsIGFycmF5CisgKiBAYnl0ZXM6CW51bWJlciBvZiBieXRlcyB0byBhZHZhbmNlIGludG8gdGhlIGNsb25lZCBhcnJheQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjb3B5IHRoZSBhcnJheSBwcm92aWRlZCBpbiBpb3YgdG8gYSBzZWN0aW9uIG9mIG1lbW9yeQorICogYW5kIGFkdmFuY2UgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaW50byB0aGUgbmV3IGFycmF5LiBJdCByZXR1cm5zCisgKiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBuZXcgYXJyYXkuICJuZXciIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzCisgKiB0aGUgb3JpZ2luYWwgaW92IGFycmF5LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitrdmVjX2FycmF5X2luaXQoc3RydWN0IGt2ZWMgKm5ldywgc3RydWN0IGt2ZWMgKmlvdiwgdW5zaWduZWQgaW50IG5yX3NlZ3MsCisJCXNpemVfdCBieXRlcykKK3sKKwlzaXplX3QgYmFzZSA9IDA7CisKKwl3aGlsZSAoYnl0ZXMgfHwgIWlvdi0+aW92X2xlbikgeworCQlpbnQgY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuKTsKKworCQlieXRlcyAtPSBjb3B5OworCQliYXNlICs9IGNvcHk7CisJCWlmIChpb3YtPmlvdl9sZW4gPT0gYmFzZSkgeworCQkJaW92Kys7CisJCQlucl9zZWdzLS07CisJCQliYXNlID0gMDsKKwkJfQorCX0KKwltZW1jcHkobmV3LCBpb3YsIHNpemVvZigqaW92KSAqIG5yX3NlZ3MpOworCW5ldy0+aW92X2Jhc2UgKz0gYmFzZTsKKwluZXctPmlvdl9sZW4gLT0gYmFzZTsKKwlyZXR1cm4gbnJfc2VnczsKK30KKworc3RhdGljIHN0cnVjdCBrdmVjICoKK2dldF9zZXJ2ZXJfaW92ZWMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCB1bnNpZ25lZCBpbnQgbnJfc2VncykKK3sKKwlzdHJ1Y3Qga3ZlYyAqbmV3X2lvdjsKKworCWlmIChzZXJ2ZXItPmlvdiAmJiBucl9zZWdzIDw9IHNlcnZlci0+bnJfaW92KQorCQlyZXR1cm4gc2VydmVyLT5pb3Y7CisKKwkvKiBub3QgYmlnIGVub3VnaCAtLSBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kIHJlbGVhc2UgdGhlIG9sZCAqLworCW5ld19pb3YgPSBrbWFsbG9jKHNpemVvZigqbmV3X2lvdikgKiBucl9zZWdzLCBHRlBfTk9GUyk7CisJaWYgKG5ld19pb3YpIHsKKwkJa2ZyZWUoc2VydmVyLT5pb3YpOworCQlzZXJ2ZXItPmlvdiA9IG5ld19pb3Y7CisJCXNlcnZlci0+bnJfaW92ID0gbnJfc2VnczsKKwl9CisJcmV0dXJuIG5ld19pb3Y7Cit9CisKK2ludAorY2lmc19yZWFkdl9mcm9tX3NvY2tldChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBrdmVjICppb3Zfb3JpZywKKwkJICAgICAgIHVuc2lnbmVkIGludCBucl9zZWdzLCB1bnNpZ25lZCBpbnQgdG9fcmVhZCkKK3sKKwlpbnQgbGVuZ3RoID0gMDsKKwlpbnQgdG90YWxfcmVhZDsKKwl1bnNpZ25lZCBpbnQgc2VnczsKKwlzdHJ1Y3QgbXNnaGRyIHNtYl9tc2c7CisJc3RydWN0IGt2ZWMgKmlvdjsKKworCWlvdiA9IGdldF9zZXJ2ZXJfaW92ZWMoc2VydmVyLCBucl9zZWdzKTsKKwlpZiAoIWlvdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKworCWZvciAodG90YWxfcmVhZCA9IDA7IHRvX3JlYWQ7IHRvdGFsX3JlYWQgKz0gbGVuZ3RoLCB0b19yZWFkIC09IGxlbmd0aCkgeworCQlpZiAoc2VydmVyX3VucmVzcG9uc2l2ZShzZXJ2ZXIpKSB7CisJCQl0b3RhbF9yZWFkID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VncyA9IGt2ZWNfYXJyYXlfaW5pdChpb3YsIGlvdl9vcmlnLCBucl9zZWdzLCB0b3RhbF9yZWFkKTsKKworCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsICZzbWJfbXNnLAorCQkJCQlpb3YsIHNlZ3MsIHRvX3JlYWQsIDApOworCiAJCWlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgewotCQkJLyogdGhlbiB3aWxsIGV4aXQgKi8KLQkJCXJjID0gMjsKKwkJCXRvdGFsX3JlYWQgPSAtRVNIVVRET1dOOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKIAkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQkvKiBSZWNvbm5lY3Qgd2FrZXMgdXAgcnNwbnMgcSAqLwotCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KLQkJCXJjID0gMTsKKwkJCXRvdGFsX3JlYWQgPSAtRUFHQUlOOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAobGVuZ3RoID09IC1FUkVTVEFSVFNZUyB8fAogCQkJICAgbGVuZ3RoID09IC1FQUdBSU4gfHwKQEAgLTM5MCw1NiArNDY4LDU0IEBACiAJCQkgKi8KIAkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJCWxlbmd0aCA9IDA7Ci0JCQlpZiAoIWlzX2hlYWRlcl9yZWFkKQotCQkJCWNvbnRpbnVlOwotCQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaGVhZGVyIHJlYWQgKi8KLQkJCWlmICh0b3RhbF9yZWFkKSB7Ci0JCQkJaW92LT5pb3ZfYmFzZSA9ICh0b19yZWFkIC0gdG90YWxfcmVhZCkgKwotCQkJCQkJYnVmOwotCQkJCWlvdi0+aW92X2xlbiA9IHRvX3JlYWQgLSB0b3RhbF9yZWFkOwotCQkJCXNtYl9tc2ctPm1zZ19jb250cm9sID0gTlVMTDsKLQkJCQlzbWJfbXNnLT5tc2dfY29udHJvbGxlbiA9IDA7Ci0JCQkJcmMgPSAzOwotCQkJfSBlbHNlCi0JCQkJcmMgPSAxOwotCQkJYnJlYWs7CisJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgewotCQkJY0VSUk9SKDEsICJSZWNlaXZlZCBubyBkYXRhLCBleHBlY3RpbmcgJWQiLAotCQkJICAgICAgIHRvX3JlYWQgLSB0b3RhbF9yZWFkKTsKKwkJCWNGWUkoMSwgIlJlY2VpdmVkIG5vIGRhdGEgb3IgZXJyb3I6IGV4cGVjdGluZyAlZCAiCisJCQkJImdvdCAlZCIsIHRvX3JlYWQsIGxlbmd0aCk7CiAJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJcmMgPSAxOworCQkJdG90YWxfcmVhZCA9IC1FQUdBSU47CiAJCQlicmVhazsKIAkJfQogCX0KKwlyZXR1cm4gdG90YWxfcmVhZDsKK30KIAotCSpwdG90YWxfcmVhZCA9IHRvdGFsX3JlYWQ7Ci0JcmV0dXJuIHJjOworaW50CitjaWZzX3JlYWRfZnJvbV9zb2NrZXQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBjaGFyICpidWYsCisJCSAgICAgIHVuc2lnbmVkIGludCB0b19yZWFkKQoreworCXN0cnVjdCBrdmVjIGlvdjsKKworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKwlpb3YuaW92X2xlbiA9IHRvX3JlYWQ7CisKKwlyZXR1cm4gY2lmc19yZWFkdl9mcm9tX3NvY2tldChzZXJ2ZXIsICZpb3YsIDEsIHRvX3JlYWQpOwogfQogCiBzdGF0aWMgYm9vbAotY2hlY2tfcmZjMTAwMl9oZWFkZXIoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBjaGFyICpidWYpCitpc19zbWJfcmVzcG9uc2Uoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCB1bnNpZ25lZCBjaGFyIHR5cGUpCiB7Ci0JY2hhciB0ZW1wID0gKmJ1ZjsKLQl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KAotCQkJCSgoc3RydWN0IHNtYl9oZHIgKilidWYpLT5zbWJfYnVmX2xlbmd0aCk7Ci0KIAkvKgogCSAqIFRoZSBmaXJzdCBieXRlIGJpZyBlbmRpYW4gb2YgdGhlIGxlbmd0aCBmaWVsZCwKIAkgKiBpcyBhY3R1YWxseSBub3QgcGFydCBvZiB0aGUgbGVuZ3RoIGJ1dCB0aGUgdHlwZQogCSAqIHdpdGggdGhlIG1vc3QgY29tbW9uLCB6ZXJvLCBhcyByZWd1bGFyIGRhdGEuCiAJICovCi0JaWYgKHRlbXAgPT0gKGNoYXIpIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKHRlbXAgPT0gKGNoYXIpUkZDMTAwMl9QT1NJVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7Ci0JCWNGWUkoMSwgIkdvb2QgUkZDIDEwMDIgc2Vzc2lvbiByc3AiKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJGQzEwMDJfU0VTU0lPTl9NRVNTQUdFOgorCQkvKiBSZWd1bGFyIFNNQiByZXNwb25zZSAqLworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFOgorCQljRllJKDEsICJSRkMgMTAwMiBzZXNzaW9uIGtlZXAgYWxpdmUiKTsKKwkJYnJlYWs7CisJY2FzZSBSRkMxMDAyX1BPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0U6CisJCWNGWUkoMSwgIlJGQyAxMDAyIHBvc2l0aXZlIHNlc3Npb24gcmVzcG9uc2UiKTsKKwkJYnJlYWs7CisJY2FzZSBSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0U6CiAJCS8qCiAJCSAqIFdlIGdldCB0aGlzIGZyb20gV2luZG93cyA5OCBpbnN0ZWFkIG9mIGFuIGVycm9yIG9uCiAJCSAqIFNNQiBuZWdwcm90IHJlc3BvbnNlLgogCQkgKi8KLQkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKLQkJCXBkdV9sZW5ndGgpOworCQljRllJKDEsICJSRkMgMTAwMiBuZWdhdGl2ZSBzZXNzaW9uIHJlc3BvbnNlIik7CiAJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvIGNsZWFuIHVwICovCiAJCW1zbGVlcCgxMDAwKTsKIAkJLyoKQEAgLTQ0OCw4NyArNTI0LDg5IEBACiAJCSAqIGlzIHNpbmNlIHdlIGRvIG5vdCBiZWdpbiB3aXRoIFJGQzEwMDEgc2Vzc2lvbgogCQkgKiBpbml0aWFsaXplIGZyYW1lKS4KIAkJICovCi0JCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7CisJCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7CiAJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CiAJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKHRlbXAgIT0gKGNoYXIpIDApIHsKLQkJY0VSUk9SKDEsICJVbmtub3duIFJGQyAxMDAyIGZyYW1lIik7Ci0JCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCBidWYsIDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljRVJST1IoMSwgIlJGQyAxMDAyIHVua25vd24gcmVzcG9uc2UgdHlwZSAweCV4IiwgdHlwZSk7CiAJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCXJldHVybiBmYWxzZTsKIAl9CiAKLQkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCi0JaWYgKChwZHVfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHx8Ci0JICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgewotCQljRVJST1IoMSwgIkludmFsaWQgc2l6ZSBTTUIgbGVuZ3RoICVkIHBkdV9sZW5ndGggJWQiLAotCQkgICAgICAgNCwgcGR1X2xlbmd0aCs0KTsKLQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIHN0cnVjdCBtaWRfcV9lbnRyeSAqCi1maW5kX2NpZnNfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9oZHIgKmJ1ZiwKLQkgICAgICBpbnQgKmxlbmd0aCwgYm9vbCBpc19sYXJnZV9idWYsIGJvb2wgKmlzX211bHRpX3JzcCwgY2hhciAqKmJpZ2J1ZikKK2ZpbmRfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9oZHIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCA9IE5VTEwsICp0bXBfbWlkLCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZDsKIAogCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtaWQsIHRtcF9taWQsICZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EsIHFoZWFkKSB7Ci0JCWlmIChtaWQtPm1pZCAhPSBidWYtPk1pZCB8fAotCQkgICAgbWlkLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKLQkJICAgIG1pZC0+Y29tbWFuZCAhPSBidWYtPkNvbW1hbmQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKmxlbmd0aCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmLCBzZXJ2ZXItPm1heEJ1ZikgPiAwKSB7Ci0JCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCi0JCQkqaXNfbXVsdGlfcnNwID0gdHJ1ZTsKLQkJCWlmIChtaWQtPnJlc3BfYnVmKSB7Ci0JCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KLQkJCQkqbGVuZ3RoID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKLQkJCQlpZiAoKmxlbmd0aCA+IDApIHsKLQkJCQkJKmxlbmd0aCA9IDA7Ci0JCQkJCW1pZC0+bXVsdGlSc3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCi0JCQkJbWlkLT5tdWx0aUVuZCA9IHRydWU7Ci0JCQkJZ290byBtdWx0aV90Ml9mbmQ7Ci0JCQl9Ci0JCQlpZiAoIWlzX2xhcmdlX2J1ZikgewotCQkJCS8qRklYTUU6IHN3aXRjaCB0byBhbHJlYWR5IGFsbG9jYXRlZCBsYXJnZWJ1Zj8qLwotCQkJCWNFUlJPUigxLCAiMXN0IHRyYW5zMiByZXNwIG5lZWRzIGJpZ2J1ZiIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBIYXZlIGZpcnN0IGJ1ZmZlciAqLwotCQkJCW1pZC0+cmVzcF9idWYgPSBidWY7Ci0JCQkJbWlkLT5sYXJnZUJ1ZiA9IHRydWU7Ci0JCQkJKmJpZ2J1ZiA9IE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1pZCwgJnNlcnZlci0+cGVuZGluZ19taWRfcSwgcWhlYWQpIHsKKwkJaWYgKG1pZC0+bWlkID09IGJ1Zi0+TWlkICYmCisJCSAgICBtaWQtPm1pZFN0YXRlID09IE1JRF9SRVFVRVNUX1NVQk1JVFRFRCAmJgorCQkgICAgbWlkLT5jb21tYW5kID09IGJ1Zi0+Q29tbWFuZCkgeworCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCXJldHVybiBtaWQ7CiAJCX0KLQkJbWlkLT5yZXNwX2J1ZiA9IGJ1ZjsKLQkJbWlkLT5sYXJnZUJ1ZiA9IGlzX2xhcmdlX2J1ZjsKLW11bHRpX3QyX2ZuZDoKLQkJaWYgKCpsZW5ndGggPT0gMCkKLQkJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7Ci0JCWVsc2UKLQkJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfTUFMRk9STUVEOwotI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgotCQltaWQtPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOwotI2VuZGlmCi0JCWxpc3RfZGVsX2luaXQoJm1pZC0+cWhlYWQpOwotCQlyZXQgPSBtaWQ7Ci0JCWJyZWFrOwogCX0KIAlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCXJldHVybiBOVUxMOworfQogCi0JcmV0dXJuIHJldDsKK3ZvaWQKK2RlcXVldWVfbWlkKHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkLCBib29sIG1hbGZvcm1lZCkKK3sKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKKwltaWQtPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOworI2VuZGlmCisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJaWYgKCFtYWxmb3JtZWQpCisJCW1pZC0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7CisJZWxzZQorCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX01BTEZPUk1FRDsKKwlsaXN0X2RlbF9pbml0KCZtaWQtPnFoZWFkKTsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX21pZChzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCwgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAorCSAgIHN0cnVjdCBzbWJfaGRyICpidWYsIGludCBtYWxmb3JtZWQpCit7CisJaWYgKG1hbGZvcm1lZCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmKSA+IDApIHsKKwkJbWlkLT5tdWx0aVJzcCA9IHRydWU7CisJCWlmIChtaWQtPnJlc3BfYnVmKSB7CisJCQkvKiBtZXJnZSByZXNwb25zZSAtIGZpeCB1cCAxc3QqLworCQkJbWFsZm9ybWVkID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKKwkJCWlmIChtYWxmb3JtZWQgPiAwKQorCQkJCXJldHVybjsKKworCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCisJCQltaWQtPm11bHRpRW5kID0gdHJ1ZTsKKwkJCXJldHVybiBkZXF1ZXVlX21pZChtaWQsIG1hbGZvcm1lZCk7CisJCX0KKwkJaWYgKCFzZXJ2ZXItPmxhcmdlX2J1ZikgeworCQkJLypGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkgYWxsb2NhdGVkIGxhcmdlYnVmPyovCisJCQljRVJST1IoMSwgIjFzdCB0cmFuczIgcmVzcCBuZWVkcyBiaWdidWYiKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCisJCQltaWQtPnJlc3BfYnVmID0gYnVmOworCQkJbWlkLT5sYXJnZUJ1ZiA9IHRydWU7CisJCQlzZXJ2ZXItPmJpZ2J1ZiA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKwltaWQtPnJlc3BfYnVmID0gYnVmOworCW1pZC0+bGFyZ2VCdWYgPSBzZXJ2ZXItPmxhcmdlX2J1ZjsKKwkvKiBXYXMgcHJldmlvdXMgYnVmIHB1dCBpbiBtcHggc3RydWN0IGZvciBtdWx0aS1yc3A/ICovCisJaWYgKCFtaWQtPm11bHRpUnNwKSB7CisJCS8qIHNtYiBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB1c2VyIHRocmVhZCAqLworCQlpZiAoc2VydmVyLT5sYXJnZV9idWYpCisJCQlzZXJ2ZXItPmJpZ2J1ZiA9IE5VTEw7CisJCWVsc2UKKwkJCXNlcnZlci0+c21hbGxidWYgPSBOVUxMOworCX0KKwlkZXF1ZXVlX21pZChtaWQsIG1hbGZvcm1lZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFuX2RlbXVsdGlwbGV4X2luZm8oc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQpAQCAtNjE4LDYgKzY5Niw3IEBACiAJfQogCiAJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyLT5pb3YpOwogCWtmcmVlKHNlcnZlcik7CiAKIAlsZW5ndGggPSBhdG9taWNfZGVjX3JldHVybigmdGNwU2VzQWxsb2NDb3VudCk7CkBAIC02MjcsMjAgKzcwNiw3MCBAQAogfQogCiBzdGF0aWMgaW50CitzdGFuZGFyZF9yZWNlaXZlMyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkKQoreworCWludCBsZW5ndGg7CisJY2hhciAqYnVmID0gc2VydmVyLT5zbWFsbGJ1ZjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlciA9IChzdHJ1Y3Qgc21iX2hkciAqKWJ1ZjsKKwl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKworCS8qIG1ha2Ugc3VyZSB0aGlzIHdpbGwgZml0IGluIGEgbGFyZ2UgYnVmZmVyICovCisJaWYgKHBkdV9sZW5ndGggPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkgeworCQljRVJST1IoMSwgIlNNQiByZXNwb25zZSB0b28gbG9uZyAoJXUgYnl0ZXMpIiwKKwkJCXBkdV9sZW5ndGgpOworCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBzd2l0Y2ggdG8gbGFyZ2UgYnVmZmVyIGlmIHRvbyBiaWcgZm9yIGEgc21hbGwgb25lICovCisJaWYgKHBkdV9sZW5ndGggPiBNQVhfQ0lGU19TTUFMTF9CVUZGRVJfU0laRSAtIDQpIHsKKwkJc2VydmVyLT5sYXJnZV9idWYgPSB0cnVlOworCQltZW1jcHkoc2VydmVyLT5iaWdidWYsIHNlcnZlci0+c21hbGxidWYsIHNlcnZlci0+dG90YWxfcmVhZCk7CisJCWJ1ZiA9IHNlcnZlci0+YmlnYnVmOworCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYnVmOworCX0KKworCS8qIG5vdyByZWFkIHRoZSByZXN0ICovCisJbGVuZ3RoID0gY2lmc19yZWFkX2Zyb21fc29ja2V0KHNlcnZlciwKKwkJCSAgYnVmICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEsCisJCQkgIHBkdV9sZW5ndGggLSBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMSArIDQpOworCWlmIChsZW5ndGggPCAwKQorCQlyZXR1cm4gbGVuZ3RoOworCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisKKwlkdW1wX3NtYihzbWJfYnVmZmVyLCBzZXJ2ZXItPnRvdGFsX3JlYWQpOworCisJLyoKKwkgKiBXZSBrbm93IHRoYXQgd2UgcmVjZWl2ZWQgZW5vdWdoIHRvIGdldCB0byB0aGUgTUlEIGFzIHdlCisJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCisJICogaWYgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciBpcyBPSy4gV2UgYm9ycm93IHRoZSBsZW5ndGgKKwkgKiB2YXIgZm9yIHRoZSByZXN0IG9mIHRoZSBsb29wIHRvIGF2b2lkIGEgbmV3IHN0YWNrIHZhci4KKwkgKgorCSAqIDQ4IGJ5dGVzIGlzIGVub3VnaCB0byBkaXNwbGF5IHRoZSBoZWFkZXIgYW5kIGEgbGl0dGxlIGJpdAorCSAqIGludG8gdGhlIHBheWxvYWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKwkgKi8KKwlsZW5ndGggPSBjaGVja1NNQihzbWJfYnVmZmVyLCBzbWJfYnVmZmVyLT5NaWQsIHNlcnZlci0+dG90YWxfcmVhZCk7CisJaWYgKGxlbmd0aCAhPSAwKQorCQljaWZzX2R1bXBfbWVtKCJCYWQgU01COiAiLCBidWYsCisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIHNlcnZlci0+dG90YWxfcmVhZCwgNDgpKTsKKworCWlmIChtaWQpCisJCWhhbmRsZV9taWQobWlkLCBzZXJ2ZXIsIHNtYl9idWZmZXIsIGxlbmd0aCk7CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50CiBjaWZzX2RlbXVsdGlwbGV4X3RocmVhZCh2b2lkICpwKQogewogCWludCBsZW5ndGg7CiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gcDsKLQl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aCwgdG90YWxfcmVhZDsKLQljaGFyICpidWYgPSBOVUxMLCAqYmlnYnVmID0gTlVMTCwgKnNtYWxsYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aDsKKwljaGFyICpidWYgPSBOVUxMOwogCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyID0gTlVMTDsKLQlzdHJ1Y3QgbXNnaGRyIHNtYl9tc2c7Ci0Jc3RydWN0IGt2ZWMgaW92OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza190b193YWtlID0gTlVMTDsKIAlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKLQlib29sIGlzTGFyZ2VCdWYgPSBmYWxzZTsKLQlib29sIGlzTXVsdGlSc3AgPSBmYWxzZTsKLQlpbnQgcmM7CiAKIAljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKIAljRllJKDEsICJEZW11bHRpcGxleCBQSUQ6ICVkIiwgdGFza19waWRfbnIoY3VycmVudCkpOwpAQCAtNjU1LDExMSArNzg0LDY1IEBACiAJCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoJmJpZ2J1ZiwgJnNtYWxsYnVmLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkciksIGlzTGFyZ2VCdWYpKQorCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoc2VydmVyKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlzTGFyZ2VCdWYgPSBmYWxzZTsKLQkJaXNNdWx0aVJzcCA9IGZhbHNlOwotCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopc21hbGxidWY7Ci0JCWJ1ZiA9IHNtYWxsYnVmOwotCQlpb3YuaW92X2Jhc2UgPSBidWY7Ci0JCWlvdi5pb3ZfbGVuID0gNDsKLQkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlzZXJ2ZXItPmxhcmdlX2J1ZiA9IGZhbHNlOworCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopc2VydmVyLT5zbWFsbGJ1ZjsKKwkJYnVmID0gc2VydmVyLT5zbWFsbGJ1ZjsKIAkJcGR1X2xlbmd0aCA9IDQ7IC8qIGVub3VnaCB0byBnZXQgUkZDMTAwMSBoZWFkZXIgKi8KIAotaW5jb21wbGV0ZV9yY3Y6Ci0JCWlmIChlY2hvX3JldHJpZXMgPiAwICYmIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKwotCQkJCQkoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwpKSkgewotCQkJY0VSUk9SKDEsICJTZXJ2ZXIgJXMgaGFzIG5vdCByZXNwb25kZWQgaW4gJWQgc2Vjb25kcy4gIgotCQkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCi0JCQkJICAoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwgLyBIWikpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCWxlbmd0aCA9IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsIGJ1ZiwgcGR1X2xlbmd0aCk7CisJCWlmIChsZW5ndGggPCAwKQogCQkJY29udGludWU7Ci0JCX0KLQotCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKLQkJCQkgICAgICAmdG90YWxfcmVhZCwgdHJ1ZSAvKiBoZWFkZXIgcmVhZCAqLyk7Ci0JCWlmIChyYyA9PSAzKQotCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKLQkJZWxzZSBpZiAocmMgPT0gMikKLQkJCWJyZWFrOwotCQllbHNlIGlmIChyYyA9PSAxKQotCQkJY29udGludWU7CisJCXNlcnZlci0+dG90YWxfcmVhZCA9IGxlbmd0aDsKIAogCQkvKgogCQkgKiBUaGUgcmlnaHQgYW1vdW50IHdhcyByZWFkIGZyb20gc29ja2V0IC0gNCBieXRlcywKIAkJICogc28gd2UgY2FuIG5vdyBpbnRlcnByZXQgdGhlIGxlbmd0aCBmaWVsZC4KIAkJICovCi0KLQkJLyoKLQkJICogTm90ZSB0aGF0IFJGQyAxMDAxIGxlbmd0aCBpcyBiaWcgZW5kaWFuIG9uIHRoZSB3aXJlLAotCQkgKiBidXQgd2UgY29udmVydCBpdCBoZXJlIHNvIGl0IGlzIGFsd2F5cyBtYW5pcHVsYXRlZAotCQkgKiBhcyBob3N0IGJ5dGUgb3JkZXIuCi0JCSAqLwogCQlwZHVfbGVuZ3RoID0gYmUzMl90b19jcHUoc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGgpOwogCi0JCWNGWUkoMSwgInJmYzEwMDIgbGVuZ3RoIDB4JXgiLCBwZHVfbGVuZ3RoKzQpOwotCQlpZiAoIWNoZWNrX3JmYzEwMDJfaGVhZGVyKHNlcnZlciwgYnVmKSkKKwkJY0ZZSSgxLCAiUkZDMTAwMiBoZWFkZXIgMHgleCIsIHBkdV9sZW5ndGgpOworCQlpZiAoIWlzX3NtYl9yZXNwb25zZShzZXJ2ZXIsIGJ1ZlswXSkpCiAJCQljb250aW51ZTsKIAotCQkvKiBlbHNlIGxlbmd0aCBvayAqLwotCQlpZiAocGR1X2xlbmd0aCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIC0gNCkgewotCQkJaXNMYXJnZUJ1ZiA9IHRydWU7Ci0JCQltZW1jcHkoYmlnYnVmLCBzbWFsbGJ1ZiwgNCk7Ci0JCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYmlnYnVmOwotCQkJYnVmID0gYmlnYnVmOworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgKi8KKwkJaWYgKHBkdV9sZW5ndGggPCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpIC0gMSAtIDQpIHsKKwkJCWNFUlJPUigxLCAiU01CIHJlc3BvbnNlIHRvbyBzaG9ydCAoJXUgYnl0ZXMpIiwKKwkJCQlwZHVfbGVuZ3RoKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQkJY29udGludWU7CiAJCX0KIAotCQlpb3YuaW92X2Jhc2UgPSA0ICsgYnVmOwotCQlpb3YuaW92X2xlbiA9IHBkdV9sZW5ndGg7Ci0JCXJjID0gcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsICZzbWJfbXNnLCAmaW92LCBwZHVfbGVuZ3RoLAotCQkJCSAgICAgICZ0b3RhbF9yZWFkLCBmYWxzZSk7Ci0JCWlmIChyYyA9PSAyKQotCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKHJjID09IDEpCisJCS8qIHJlYWQgZG93biB0byB0aGUgTUlEICovCisJCWxlbmd0aCA9IGNpZnNfcmVhZF9mcm9tX3NvY2tldChzZXJ2ZXIsIGJ1ZiArIDQsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxIC0gNCk7CisJCWlmIChsZW5ndGggPCAwKQorCQkJY29udGludWU7CisJCXNlcnZlci0+dG90YWxfcmVhZCArPSBsZW5ndGg7CisKKwkJbWlkX2VudHJ5ID0gZmluZF9taWQoc2VydmVyLCBzbWJfYnVmZmVyKTsKKworCQlpZiAoIW1pZF9lbnRyeSB8fCAhbWlkX2VudHJ5LT5yZWNlaXZlKQorCQkJbGVuZ3RoID0gc3RhbmRhcmRfcmVjZWl2ZTMoc2VydmVyLCBtaWRfZW50cnkpOworCQllbHNlCisJCQlsZW5ndGggPSBtaWRfZW50cnktPnJlY2VpdmUoc2VydmVyLCBtaWRfZW50cnkpOworCisJCWlmIChsZW5ndGggPCAwKQogCQkJY29udGludWU7CiAKLQkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLwotCi0JCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOwotCi0JCS8qCi0JCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKLQkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCi0JCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCi0JCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgotCQkgKgotCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKLQkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotCQkgKi8KLQkJbGVuZ3RoID0gY2hlY2tTTUIoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKTsKLQkJaWYgKGxlbmd0aCAhPSAwKQotCQkJY2lmc19kdW1wX21lbSgiQmFkIFNNQjogIiwgYnVmLAotCQkJCSAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKwkJaWYgKHNlcnZlci0+bGFyZ2VfYnVmKSB7CisJCQlidWYgPSBzZXJ2ZXItPmJpZ2J1ZjsKKwkJCXNtYl9idWZmZXIgPSAoc3RydWN0IHNtYl9oZHIgKilidWY7CisJCX0KIAogCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKLQotCQltaWRfZW50cnkgPSBmaW5kX2NpZnNfbWlkKHNlcnZlciwgc21iX2J1ZmZlciwgJmxlbmd0aCwKLQkJCQkJICBpc0xhcmdlQnVmLCAmaXNNdWx0aVJzcCwgJmJpZ2J1Zik7CiAJCWlmIChtaWRfZW50cnkgIT0gTlVMTCkgewotCQkJbWlkX2VudHJ5LT5jYWxsYmFjayhtaWRfZW50cnkpOwotCQkJLyogV2FzIHByZXZpb3VzIGJ1ZiBwdXQgaW4gbXB4IHN0cnVjdCBmb3IgbXVsdGktcnNwPyAqLwotCQkJaWYgKCFpc011bHRpUnNwKSB7Ci0JCQkJLyogc21iIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGJ5IHVzZXIgdGhyZWFkICovCi0JCQkJaWYgKGlzTGFyZ2VCdWYpCi0JCQkJCWJpZ2J1ZiA9IE5VTEw7Ci0JCQkJZWxzZQotCQkJCQlzbWFsbGJ1ZiA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobGVuZ3RoICE9IDApIHsKLQkJCS8qIHJlc3BvbnNlIHNhbml0eSBjaGVja3MgZmFpbGVkICovCi0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICghaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHNtYl9idWZmZXIsIHNlcnZlcikgJiYKLQkJCSAgICFpc011bHRpUnNwKSB7CisJCQlpZiAoIW1pZF9lbnRyeS0+bXVsdGlSc3AgfHwgbWlkX2VudHJ5LT5tdWx0aUVuZCkKKwkJCQltaWRfZW50cnktPmNhbGxiYWNrKG1pZF9lbnRyeSk7CisJCX0gZWxzZSBpZiAoIWlzX3ZhbGlkX29wbG9ja19icmVhayhzbWJfYnVmZmVyLCBzZXJ2ZXIpKSB7CiAJCQljRVJST1IoMSwgIk5vIHRhc2sgdG8gd2FrZSwgdW5rbm93biBmcmFtZSByZWNlaXZlZCEgIgogCQkJCSAgICJOdW1NaWRzICVkIiwgYXRvbWljX3JlYWQoJm1pZENvdW50KSk7CiAJCQljaWZzX2R1bXBfbWVtKCJSZWNlaXZlZCBEYXRhIGlzOiAiLCBidWYsCkBAIC03NzMsOSArODU2LDkgQEAKIAl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLwogCiAJLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgaGVyZSBvbiBleGl0ICovCi0JY2lmc19idWZfcmVsZWFzZShiaWdidWYpOwotCWlmIChzbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLwotCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYWxsYnVmKTsKKwljaWZzX2J1Zl9yZWxlYXNlKHNlcnZlci0+YmlnYnVmKTsKKwlpZiAoc2VydmVyLT5zbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLworCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNlcnZlci0+c21hbGxidWYpOwogCiAJdGFza190b193YWtlID0geGNoZygmc2VydmVyLT50c2ssIE5VTEwpOwogCWNsZWFuX2RlbXVsdGlwbGV4X2luZm8oc2VydmVyKTsKQEAgLTgyNyw2ICs5MTAsNyBAQAogewogCWNoYXIgKnZhbHVlLCAqZGF0YSwgKmVuZDsKIAljaGFyICptb3VudGRhdGFfY29weSA9IE5VTEwsICpvcHRpb25zOworCWludCBlcnI7CiAJdW5zaWduZWQgaW50ICB0ZW1wX2xlbiwgaSwgajsKIAljaGFyIHNlcGFyYXRvclsyXTsKIAlzaG9ydCBpbnQgb3ZlcnJpZGVfdWlkID0gLTE7CkBAIC04ODMsNiArOTY3LDggQEAKIAkJCWNGWUkoMSwgIk51bGwgc2VwYXJhdG9yIG5vdCBhbGxvd2VkIik7CiAJCX0KIAl9CisJdm9sLT5iYWNrdXB1aWRfc3BlY2lmaWVkID0gZmFsc2U7IC8qIG5vIGJhY2t1cCBpbnRlbnQgZm9yIGEgdXNlciAqLworCXZvbC0+YmFja3VwZ2lkX3NwZWNpZmllZCA9IGZhbHNlOyAvKiBubyBiYWNrdXAgaW50ZW50IGZvciBhIGdyb3VwICovCiAKIAl3aGlsZSAoKGRhdGEgPSBzdHJzZXAoJm9wdGlvbnMsIHNlcGFyYXRvcikpICE9IE5VTEwpIHsKIAkJaWYgKCEqZGF0YSkKQEAgLTE0NDIsNiArMTUyOCwyMiBAQAogCQkJdm9sLT5tZnN5bWxpbmtzID0gdHJ1ZTsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibXVsdGl1c2VyIiwgOCkgPT0gMCkgewogCQkJdm9sLT5tdWx0aXVzZXIgPSB0cnVlOworCQl9IGVsc2UgaWYgKCFzdHJuaWNtcChkYXRhLCAiYmFja3VwdWlkIiwgOSkgJiYgdmFsdWUgJiYgKnZhbHVlKSB7CisJCQllcnIgPSBrc3RydG91aW50KHZhbHVlLCAwLCAmdm9sLT5iYWNrdXB1aWQpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQljRVJST1IoMSwgIiVzOiBJbnZhbGlkIGJhY2t1cHVpZCB2YWx1ZSIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQlnb3RvIGNpZnNfcGFyc2VfbW91bnRfZXJyOworCQkJfQorCQkJdm9sLT5iYWNrdXB1aWRfc3BlY2lmaWVkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICghc3RybmljbXAoZGF0YSwgImJhY2t1cGdpZCIsIDkpICYmIHZhbHVlICYmICp2YWx1ZSkgeworCQkJZXJyID0ga3N0cnRvdWludCh2YWx1ZSwgMCwgJnZvbC0+YmFja3VwZ2lkKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJY0VSUk9SKDEsICIlczogSW52YWxpZCBiYWNrdXBnaWQgdmFsdWUiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBjaWZzX3BhcnNlX21vdW50X2VycjsKKwkJCX0KKwkJCXZvbC0+YmFja3VwZ2lkX3NwZWNpZmllZCA9IHRydWU7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVW5rbm93biBtb3VudCBvcHRpb24gJXNcbiIsCiAJCQkJCQlkYXRhKTsKQEAgLTIyMDksMTYgKzIzMTEsMTYgQEAKIAkgICAgKG5ldy0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01BU0spKQogCQlyZXR1cm4gMDsKIAotCWlmIChvbGQtPnJzaXplICE9IG5ldy0+cnNpemUpCi0JCXJldHVybiAwOwotCiAJLyoKLQkgKiBXZSB3YW50IHRvIHNoYXJlIHNiIG9ubHkgaWYgd2UgZG9uJ3Qgc3BlY2lmeSB3c2l6ZSBvciBzcGVjaWZpZWQgd3NpemUKLQkgKiBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gZXhpc3Rpbmcgb25lLgorCSAqIFdlIHdhbnQgdG8gc2hhcmUgc2Igb25seSBpZiB3ZSBkb24ndCBzcGVjaWZ5IGFuIHIvd3NpemUgb3IKKwkgKiBzcGVjaWZpZWQgci93c2l6ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZXhpc3Rpbmcgb25lLgogCSAqLwogCWlmIChuZXctPndzaXplICYmIG5ldy0+d3NpemUgPCBvbGQtPndzaXplKQogCQlyZXR1cm4gMDsKIAorCWlmIChuZXctPnJzaXplICYmIG5ldy0+cnNpemUgPCBvbGQtPnJzaXplKQorCQlyZXR1cm4gMDsKKwogCWlmIChvbGQtPm1udF91aWQgIT0gbmV3LT5tbnRfdWlkIHx8IG9sZC0+bW50X2dpZCAhPSBuZXctPm1udF9naWQpCiAJCXJldHVybiAwOwogCkBAIC0yNjU2LDE0ICsyNzU4LDYgQEAKIAkJCQkJQ0lGU19NT1VOVF9QT1NJWF9QQVRIUzsKIAkJfQogCi0JCWlmIChjaWZzX3NiICYmIChjaWZzX3NiLT5yc2l6ZSA+IDEyNyAqIDEwMjQpKSB7Ci0JCQlpZiAoKGNhcCAmIENJRlNfVU5JWF9MQVJHRV9SRUFEX0NBUCkgPT0gMCkgewotCQkJCWNpZnNfc2ItPnJzaXplID0gMTI3ICogMTAyNDsKLQkJCQljRllJKERCRzIsICJsYXJnZXIgcmVhZHMgbm90IHN1cHBvcnRlZCBieSBzcnYiKTsKLQkJCX0KLQkJfQotCi0KIAkJY0ZZSSgxLCAiTmVnb3RpYXRlIGNhcHMgMHgleCIsIChpbnQpY2FwKTsKICNpZmRlZiBDT05GSUdfQ0lGU19ERUJVRzIKIAkJaWYgKGNhcCAmIENJRlNfVU5JWF9GQ05UTF9DQVApCkBAIC0yNzA4LDMxICsyODAyLDE5IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNpZnNfc2ItPnRsaW5rX3RyZWVfbG9jayk7CiAJY2lmc19zYi0+dGxpbmtfdHJlZSA9IFJCX1JPT1Q7CiAKLQlpZiAocHZvbHVtZV9pbmZvLT5yc2l6ZSA+IENJRlNNYXhCdWZTaXplKSB7Ci0JCWNFUlJPUigxLCAicnNpemUgJWQgdG9vIGxhcmdlLCB1c2luZyBNYXhCdWZTaXplIiwKLQkJCXB2b2x1bWVfaW5mby0+cnNpemUpOwotCQljaWZzX3NiLT5yc2l6ZSA9IENJRlNNYXhCdWZTaXplOwotCX0gZWxzZSBpZiAoKHB2b2x1bWVfaW5mby0+cnNpemUpICYmCi0JCQkocHZvbHVtZV9pbmZvLT5yc2l6ZSA8PSBDSUZTTWF4QnVmU2l6ZSkpCi0JCWNpZnNfc2ItPnJzaXplID0gcHZvbHVtZV9pbmZvLT5yc2l6ZTsKLQllbHNlIC8qIGRlZmF1bHQgKi8KLQkJY2lmc19zYi0+cnNpemUgPSBDSUZTTWF4QnVmU2l6ZTsKLQotCWlmIChjaWZzX3NiLT5yc2l6ZSA8IDIwNDgpIHsKLQkJY2lmc19zYi0+cnNpemUgPSAyMDQ4OwotCQkvKiBXaW5kb3dzIE1FIG1heSBwcmVmZXIgdGhpcyAqLwotCQljRllJKDEsICJyZWFkc2l6ZSBzZXQgdG8gbWluaW11bTogMjA0OCIpOwotCX0KLQogCS8qCi0JICogVGVtcG9yYXJpbHkgc2V0IHdzaXplIGZvciBtYXRjaGluZyBzdXBlcmJsb2NrLiBJZiB3ZSBlbmQgdXAgdXNpbmcKLQkgKiBuZXcgc2IgdGhlbiBjaWZzX25lZ290aWF0ZV93c2l6ZSB3aWxsIGxhdGVyIG5lZ290aWF0ZSBpdCBkb3dud2FyZAotCSAqIGlmIG5lZWRlZC4KKwkgKiBUZW1wb3JhcmlseSBzZXQgci93c2l6ZSBmb3IgbWF0Y2hpbmcgc3VwZXJibG9jay4gSWYgd2UgZW5kIHVwIHVzaW5nCisJICogbmV3IHNiIHRoZW4gY2xpZW50IHdpbGwgbGF0ZXIgbmVnb3RpYXRlIGl0IGRvd253YXJkIGlmIG5lZWRlZC4KIAkgKi8KKwljaWZzX3NiLT5yc2l6ZSA9IHB2b2x1bWVfaW5mby0+cnNpemU7CiAJY2lmc19zYi0+d3NpemUgPSBwdm9sdW1lX2luZm8tPndzaXplOwogCiAJY2lmc19zYi0+bW50X3VpZCA9IHB2b2x1bWVfaW5mby0+bGludXhfdWlkOwogCWNpZnNfc2ItPm1udF9naWQgPSBwdm9sdW1lX2luZm8tPmxpbnV4X2dpZDsKKwlpZiAocHZvbHVtZV9pbmZvLT5iYWNrdXB1aWRfc3BlY2lmaWVkKQorCQljaWZzX3NiLT5tbnRfYmFja3VwdWlkID0gcHZvbHVtZV9pbmZvLT5iYWNrdXB1aWQ7CisJaWYgKHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkX3NwZWNpZmllZCkKKwkJY2lmc19zYi0+bW50X2JhY2t1cGdpZCA9IHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkOwogCWNpZnNfc2ItPm1udF9maWxlX21vZGUgPSBwdm9sdW1lX2luZm8tPmZpbGVfbW9kZTsKIAljaWZzX3NiLT5tbnRfZGlyX21vZGUgPSBwdm9sdW1lX2luZm8tPmRpcl9tb2RlOwogCWNGWUkoMSwgImZpbGUgbW9kZTogMHgleCAgZGlyIG1vZGU6IDB4JXgiLApAQCAtMjc2Myw2ICsyODQ1LDEwIEBACiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfUldQSURGT1JXQVJEOwogCWlmIChwdm9sdW1lX2luZm8tPmNpZnNfYWNsKQogCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PSBDSUZTX01PVU5UX0NJRlNfQUNMOworCWlmIChwdm9sdW1lX2luZm8tPmJhY2t1cHVpZF9zcGVjaWZpZWQpCisJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfQ0lGU19CQUNLVVBVSUQ7CisJaWYgKHB2b2x1bWVfaW5mby0+YmFja3VwZ2lkX3NwZWNpZmllZCkKKwkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9DSUZTX0JBQ0tVUEdJRDsKIAlpZiAocHZvbHVtZV9pbmZvLT5vdmVycmlkZV91aWQpCiAJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfT1ZFUlJfVUlEOwogCWlmIChwdm9sdW1lX2luZm8tPm92ZXJyaWRlX2dpZCkKQEAgLTI3OTUsMjkgKzI4ODEsNDEgQEAKIH0KIAogLyoKLSAqIFdoZW4gdGhlIHNlcnZlciBzdXBwb3J0cyB2ZXJ5IGxhcmdlIHdyaXRlcyB2aWEgUE9TSVggZXh0ZW5zaW9ucywgd2UgY2FuCi0gKiBhbGxvdyB1cCB0byAyXjI0LTEsIG1pbnVzIHRoZSBzaXplIG9mIGEgV1JJVEVfQU5EX1ggaGVhZGVyLCBub3QgaW5jbHVkaW5nCi0gKiB0aGUgUkZDMTAwMSBsZW5ndGguCisgKiBXaGVuIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdmVyeSBsYXJnZSByZWFkcyBhbmQgd3JpdGVzIHZpYSBQT1NJWCBleHRlbnNpb25zLAorICogd2UgY2FuIGFsbG93IHVwIHRvIDJeMjQtMSwgbWludXMgdGhlIHNpemUgb2YgYSBSRUFEL1dSSVRFX0FORF9YIGhlYWRlciwgbm90CisgKiBpbmNsdWRpbmcgdGhlIFJGQzEwMDEgbGVuZ3RoLgogICoKICAqIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG1ha2UgZm9yICJpbnRlcmVzdGluZyIgYWxsb2NhdGlvbiBwcm9ibGVtcyBkdXJpbmcKICAqIHdyaXRlYmFjayBob3dldmVyIGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgZm9yIHRoZQogICogcGFnZXMuIEEgMTZNIHdyaXRlIG1lYW5zIH4zMmtiIHBhZ2UgYXJyYXkgd2l0aCBQQUdFX0NBQ0hFX1NJWkUgPT0gNDA5Ni4KKyAqCisgKiBGb3IgcmVhZHMsIHRoZXJlIGlzIGEgc2ltaWxhciBwcm9ibGVtIGFzIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gYXJyYXkKKyAqIG9mIGt2ZWNzIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZSwgdGhvdWdoIHRoYXQgc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBkb25lCisgKiBvbmNlLgogICovCiAjZGVmaW5lIENJRlNfTUFYX1dTSVpFICgoMTw8MjQpIC0gMSAtIHNpemVvZihXUklURV9SRVEpICsgNCkKKyNkZWZpbmUgQ0lGU19NQVhfUlNJWkUgKCgxPDwyNCkgLSBzaXplb2YoUkVBRF9SU1ApICsgNCkKIAogLyoKLSAqIFdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IGFsbG93IGxhcmdlIHBvc2l4IHdyaXRlcywgb25seSBhbGxvdyBhIHdzaXplIG9mCi0gKiAxMjhrIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBXUklURV9BTkRfWCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHdyaXRlIHVwCi0gKiB0byB0aGUgbWF4aW11bSBzaXplIGRlc2NyaWJlZCBieSBSRkMxMDAyLgorICogV2hlbiB0aGUgc2VydmVyIGRvZXNuJ3QgYWxsb3cgbGFyZ2UgcG9zaXggd3JpdGVzLCBvbmx5IGFsbG93IGEgcnNpemUvd3NpemUKKyAqIG9mIDJeMTctMSBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgY2FsbCBoZWFkZXIuIFRoYXQgYWxsb3dzIGZvciBhIHJlYWQgb3IKKyAqIHdyaXRlIHVwIHRvIHRoZSBtYXhpbXVtIHNpemUgZGVzY3JpYmVkIGJ5IFJGQzEwMDIuCiAgKi8KLSNkZWZpbmUgQ0lGU19NQVhfUkZDMTAwMl9XU0laRSAoMTI4ICogMTAyNCAtIHNpemVvZihXUklURV9SRVEpICsgNCkKKyNkZWZpbmUgQ0lGU19NQVhfUkZDMTAwMl9XU0laRSAoKDE8PDE3KSAtIDEgLSBzaXplb2YoV1JJVEVfUkVRKSArIDQpCisjZGVmaW5lIENJRlNfTUFYX1JGQzEwMDJfUlNJWkUgKCgxPDwxNykgLSAxIC0gc2l6ZW9mKFJFQURfUlNQKSArIDQpCiAKIC8qCiAgKiBUaGUgZGVmYXVsdCB3c2l6ZSBpcyAxTS4gZmluZF9nZXRfcGFnZXMgc2VlbXMgdG8gcmV0dXJuIGEgbWF4aW11bSBvZiAyNTYKICAqIHBhZ2VzIGluIGEgc2luZ2xlIGNhbGwuIFdpdGggUEFHRV9DQUNIRV9TSVpFID09IDRrLCB0aGlzIG1lYW5zIHdlIGNhbiBmaWxsCiAgKiBhIHNpbmdsZSB3c2l6ZSByZXF1ZXN0IHdpdGggYSBzaW5nbGUgY2FsbC4KICAqLwotI2RlZmluZSBDSUZTX0RFRkFVTFRfV1NJWkUgKDEwMjQgKiAxMDI0KQorI2RlZmluZSBDSUZTX0RFRkFVTFRfSU9TSVpFICgxMDI0ICogMTAyNCkKKworLyoKKyAqIFdpbmRvd3Mgb25seSBzdXBwb3J0cyBhIG1heCBvZiA2MGsgcmVhZHMuIERlZmF1bHQgdG8gdGhhdCB3aGVuIHBvc2l4CisgKiBleHRlbnNpb25zIGFyZW4ndCBpbiBmb3JjZS4KKyAqLworI2RlZmluZSBDSUZTX0RFRkFVTFRfTk9OX1BPU0lYX1JTSVpFICg2MCAqIDEwMjQpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGNpZnNfbmVnb3RpYXRlX3dzaXplKHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sIHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8pCkBAIC0yODI1LDcgKzI5MjMsNyBAQAogCV9fdTY0IHVuaXhfY2FwID0gbGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KTsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKIAl1bnNpZ25lZCBpbnQgd3NpemUgPSBwdm9sdW1lX2luZm8tPndzaXplID8gcHZvbHVtZV9pbmZvLT53c2l6ZSA6Ci0JCQkJQ0lGU19ERUZBVUxUX1dTSVpFOworCQkJCUNJRlNfREVGQVVMVF9JT1NJWkU7CiAKIAkvKiBjYW4gc2VydmVyIHN1cHBvcnQgMjQtYml0IHdyaXRlIHNpemVzPyAodmlhIFVOSVggZXh0ZW5zaW9ucykgKi8KIAlpZiAoIXRjb24tPnVuaXhfZXh0IHx8ICEodW5peF9jYXAgJiBDSUZTX1VOSVhfTEFSR0VfV1JJVEVfQ0FQKSkKQEAgLTI4NDgsNiArMjk0Niw1MCBAQAogCXJldHVybiB3c2l6ZTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludAorY2lmc19uZWdvdGlhdGVfcnNpemUoc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbykKK3sKKwlfX3U2NCB1bml4X2NhcCA9IGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSk7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gdGNvbi0+c2VzLT5zZXJ2ZXI7CisJdW5zaWduZWQgaW50IHJzaXplLCBkZWZzaXplOworCisJLyoKKwkgKiBTZXQgZGVmYXVsdCB2YWx1ZS4uLgorCSAqCisJICogSEFDSyBhbGVydCEgQW5jaWVudCBzZXJ2ZXJzIGhhdmUgdmVyeSBzbWFsbCBidWZmZXJzLiBFdmVuIHRob3VnaAorCSAqIE1TLUNJRlMgaW5kaWNhdGVzIHRoYXQgc2VydmVycyBhcmUgb25seSBsaW1pdGVkIGJ5IHRoZSBjbGllbnQncworCSAqIGJ1ZnNpemUgZm9yIHJlYWRzLCB0ZXN0aW5nIGFnYWluc3Qgd2luOThzZSBzaG93cyB0aGF0IGl0IHRocm93cworCSAqIElOVkFMSURfUEFSQU1FVEVSIGVycm9ycyBpZiB5b3UgdHJ5IHRvIHJlcXVlc3QgdG9vIGxhcmdlIGEgcmVhZC4KKwkgKgorCSAqIElmIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyBhIE1heEJ1ZmZlclNpemUgb2YgbGVzcyB0aGFuIG9uZSBwYWdlLAorCSAqIGFzc3VtZSB0aGF0IGl0IGFsc28gY2FuJ3Qgc2F0aXNmeSByZWFkcyBsYXJnZXIgdGhhbiB0aGF0IGVpdGhlci4KKwkgKgorCSAqIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciBoZXVyaXN0aWMgZm9yIHRoaXM/CisJICovCisJaWYgKHRjb24tPnVuaXhfZXh0ICYmICh1bml4X2NhcCAmIENJRlNfVU5JWF9MQVJHRV9SRUFEX0NBUCkpCisJCWRlZnNpemUgPSBDSUZTX0RFRkFVTFRfSU9TSVpFOworCWVsc2UgaWYgKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX1JFQURfWCkKKwkJZGVmc2l6ZSA9IENJRlNfREVGQVVMVF9OT05fUE9TSVhfUlNJWkU7CisJZWxzZSBpZiAoc2VydmVyLT5tYXhCdWYgPj0gUEFHRV9DQUNIRV9TSVpFKQorCQlkZWZzaXplID0gQ0lGU01heEJ1ZlNpemU7CisJZWxzZQorCQlkZWZzaXplID0gc2VydmVyLT5tYXhCdWYgLSBzaXplb2YoUkVBRF9SU1ApOworCisJcnNpemUgPSBwdm9sdW1lX2luZm8tPnJzaXplID8gcHZvbHVtZV9pbmZvLT5yc2l6ZSA6IGRlZnNpemU7CisKKwkvKgorCSAqIG5vIENBUF9MQVJHRV9SRUFEX1g/IFRoZW4gTVMtQ0lGUyBzdGF0ZXMgdGhhdCB3ZSBtdXN0IGxpbWl0IHRoaXMgdG8KKwkgKiB0aGUgY2xpZW50J3MgTWF4QnVmZmVyU2l6ZS4KKwkgKi8KKwlpZiAoIShzZXJ2ZXItPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9SRUFEX1gpKQorCQlyc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgQ0lGU01heEJ1ZlNpemUsIHJzaXplKTsKKworCS8qIGhhcmQgbGltaXQgb2YgQ0lGU19NQVhfUlNJWkUgKi8KKwlyc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgcnNpemUsIENJRlNfTUFYX1JTSVpFKTsKKworCXJldHVybiByc2l6ZTsKK30KKwogc3RhdGljIGludAogaXNfcGF0aF9hY2Nlc3NpYmxlKGludCB4aWQsIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24sCiAJCSAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsIGNvbnN0IGNoYXIgKmZ1bGxfcGF0aCkKQEAgLTMwNDEsNiArMzE4MywyMiBAQAogCXJldHVybiB2b2x1bWVfaW5mbzsKIH0KIAorLyogbWFrZSBzdXJlIHJhX3BhZ2VzIGlzIGEgbXVsdGlwbGUgb2YgcnNpemUgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitjaWZzX3JhX3BhZ2VzKHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCit7CisJdW5zaWduZWQgaW50IHJlYWRzOworCXVuc2lnbmVkIGludCByc2l6ZV9wYWdlcyA9IGNpZnNfc2ItPnJzaXplIC8gUEFHRV9DQUNIRV9TSVpFOworCisJaWYgKHJzaXplX3BhZ2VzID49IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlcykKKwkJcmV0dXJuIGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKKwllbHNlIGlmIChyc2l6ZV9wYWdlcyA9PSAwKQorCQlyZXR1cm4gcnNpemVfcGFnZXM7CisKKwlyZWFkcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyAvIHJzaXplX3BhZ2VzOworCXJldHVybiByZWFkcyAqIHJzaXplX3BhZ2VzOworfQorCiBpbnQKIGNpZnNfbW91bnQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IHNtYl92b2wgKnZvbHVtZV9pbmZvKQogewpAQCAtMzA1OSw4ICszMjE3LDYgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWNpZnNfc2ItPmJkaS5yYV9wYWdlcyA9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5yYV9wYWdlczsKLQogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKIHRyeV9tb3VudF9hZ2FpbjoKIAkvKiBjbGVhbnVwIGFjdGl2aXRpZXMgaWYgd2UncmUgY2hhc2luZyBhIHJlZmVycmFsICovCkBAIC0zMTI1LDE1ICszMjgxLDExIEBACiAJCUNJRlNTTUJRRlNBdHRyaWJ1dGVJbmZvKHhpZCwgdGNvbik7CiAJfQogCi0JaWYgKCh0Y29uLT51bml4X2V4dCA9PSAwKSAmJiAoY2lmc19zYi0+cnNpemUgPiAoMTAyNCAqIDEyNykpKSB7Ci0JCWNpZnNfc2ItPnJzaXplID0gMTAyNCAqIDEyNzsKLQkJY0ZZSShEQkcyLCAibm8gdmVyeSBsYXJnZSByZWFkIHN1cHBvcnQsIHJzaXplIG5vdyAxMjdLIik7Ci0JfQotCWlmICghKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX1JFQURfWCkpCi0JCWNpZnNfc2ItPnJzaXplID0gbWluKGNpZnNfc2ItPnJzaXplLAotCQkJICAgICAgICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpKTsKLQogCWNpZnNfc2ItPndzaXplID0gY2lmc19uZWdvdGlhdGVfd3NpemUodGNvbiwgdm9sdW1lX2luZm8pOworCWNpZnNfc2ItPnJzaXplID0gY2lmc19uZWdvdGlhdGVfcnNpemUodGNvbiwgdm9sdW1lX2luZm8pOworCisJLyogdHVuZSByZWFkYWhlYWQgYWNjb3JkaW5nIHRvIHJzaXplICovCisJY2lmc19zYi0+YmRpLnJhX3BhZ2VzID0gY2lmc19yYV9wYWdlcyhjaWZzX3NiKTsKIAogcmVtb3RlX3BhdGhfY2hlY2s6CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTApAQCAtMzMwMSw3ICszNDUzLDcgQEAKIAkJZWxzZQogI2VuZGlmIC8qIENJRlNfV0VBS19QV19IQVNIICovCiAJCXJjID0gU01CTlRlbmNyeXB0KHRjb24tPnBhc3N3b3JkLCBzZXMtPnNlcnZlci0+Y3J5cHRrZXksCi0JCQkJCWJjY19wdHIpOworCQkJCQliY2NfcHRyLCBubHNfY29kZXBhZ2UpOwogCiAJCWJjY19wdHIgKz0gQ0lGU19BVVRIX1JFU1BfU0laRTsKIAkJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IDcyZDQ0OGIuLmQ3ZWViOWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJfQogCXRjb24gPSB0bGlua190Y29uKHRsaW5rKTsKIAotCWlmIChvcGxvY2tFbmFibGVkKQorCWlmIChlbmFibGVfb3Bsb2NrcykKIAkJb3Bsb2NrID0gUkVRX09QTE9DSzsKIAogCWlmIChuZCkKQEAgLTI0NCw2ICsyNDQsOSBAQAogCWlmICghdGNvbi0+dW5peF9leHQgJiYgKG1vZGUgJiBTX0lXVUdPKSA9PSAwKQogCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BUSU9OX1JFQURPTkxZOwogCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX05UX1NNQlMpCiAJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAogCQkJIGRlc2lyZWRBY2Nlc3MsIGNyZWF0ZV9vcHRpb25zLApAQCAtMzU3LDYgKzM2MCw3IEBACiB7CiAJaW50IHJjID0gLUVQRVJNOwogCWludCB4aWQ7CisJaW50IGNyZWF0ZV9vcHRpb25zID0gQ1JFQVRFX05PVF9ESVIgfCBDUkVBVEVfT1BUSU9OX1NQRUNJQUw7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKIAlzdHJ1Y3QgdGNvbl9saW5rICp0bGluazsKIAlzdHJ1Y3QgY2lmc190Y29uICpwVGNvbjsKQEAgLTQzMSw5ICs0MzUsMTEgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCS8qIEZJWE1FOiB3b3VsZCBXUklURV9PV05FUiB8IFdSSVRFX0RBQyBiZSBiZXR0ZXI/ICovCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIEZJTEVfQ1JFQVRFLAotCQkJIEdFTkVSSUNfV1JJVEUsIENSRUFURV9OT1RfRElSIHwgQ1JFQVRFX09QVElPTl9TUEVDSUFMLAorCQkJIEdFTkVSSUNfV1JJVEUsIGNyZWF0ZV9vcHRpb25zLAogCQkJICZmaWxlSGFuZGxlLCAmb3Bsb2NrLCBidWYsIGNpZnNfc2ItPmxvY2FsX25scywKIAkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAlpZiAocmMpCkBAIC02NDIsOCArNjQ4LDE2IEBACiAJaWYgKGRpcmVudHJ5LT5kX2lub2RlKSB7CiAJCWlmIChjaWZzX3JldmFsaWRhdGVfZGVudHJ5KGRpcmVudHJ5KSkKIAkJCXJldHVybiAwOwotCQllbHNlCisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZvcmNpYmx5IGludmFsaWRhdGUgYXV0b21vdW50aW5nIGRpcmVjdG9yeSBpbm9kZXMKKwkJCSAqIChyZW1vdGUgREZTIGRpcmVjdG9yaWVzKSBzbyB0byBoYXZlIHRoZW0KKwkJCSAqIGluc3RhbnRpYXRlZCBhZ2FpbiBmb3IgYXV0b21vdW50CisJCQkgKi8KKwkJCWlmIChJU19BVVRPTU9VTlQoZGlyZW50cnktPmRfaW5vZGUpKQorCQkJCXJldHVybiAwOwogCQkJcmV0dXJuIDE7CisJCX0KIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9leHBvcnQuYyBiL2ZzL2NpZnMvZXhwb3J0LmMKaW5kZXggNTVkODdhYy4uOWM3ZWNkYyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9leHBvcnQuYworKysgYi9mcy9jaWZzL2V4cG9ydC5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgogI2luY2x1ZGUgImNpZnNmcy5oIgogCi0jaWZkZWYgQ0lGU19ORlNEX0VYUE9SVAorI2lmZGVmIENPTkZJR19DSUZTX05GU0RfRVhQT1JUCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2lmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAkvKiBCQiBuZWVkIHRvIGFkZCBjb2RlIGhlcmUgZXZlbnR1YWxseSB0byBlbmFibGUgZXhwb3J0IHZpYSBORlNEICovCkBAIC02Myw1ICs2Myw1IEBACiAJLmVuY29kZV9mcyA9ICAqLwogfTsKIAotI2VuZGlmIC8qIENJRlNfTkZTRF9FWFBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19ORlNEX0VYUE9SVCAqLwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDlmNDFhMTAuLmNmMGIxNTMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiY2lmc2ZzLmgiCiAjaW5jbHVkZSAiY2lmc3BkdS5oIgpAQCAtMTc0LDYgKzE3NSw3IEBACiAJaW50IHJjOwogCWludCBkZXNpcmVkQWNjZXNzOwogCWludCBkaXNwb3NpdGlvbjsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlGSUxFX0FMTF9JTkZPICpidWY7CiAKIAlkZXNpcmVkQWNjZXNzID0gY2lmc19jb252ZXJ0X2ZsYWdzKGZfZmxhZ3MpOwpAQCAtMjEwLDkgKzIxMiwxMiBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmIChiYWNrdXBfY3JlZChjaWZzX3NiKSkKKwkJY3JlYXRlX29wdGlvbnMgfD0gQ1JFQVRFX09QRU5fQkFDS1VQX0lOVEVOVDsKKwogCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQogCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKLQkJCSBkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgcG5ldGZpZCwgcG9wbG9jaywgYnVmLAorCQkJIGRlc2lyZWRBY2Nlc3MsIGNyZWF0ZV9vcHRpb25zLCBwbmV0ZmlkLCBwb3Bsb2NrLCBidWYsCiAJCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncwogCQkJCSAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAllbHNlCkBAIC0yNTgsOCArMjYzLDYgQEAKIAlwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBmYWxzZTsKIAlwQ2lmc0ZpbGUtPnRsaW5rID0gY2lmc19nZXRfdGxpbmsodGxpbmspOwogCW11dGV4X2luaXQoJnBDaWZzRmlsZS0+ZmhfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBDaWZzRmlsZS0+bG9ja19tdXRleCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBDaWZzRmlsZS0+bGxpc3QpOwogCUlOSVRfV09SSygmcENpZnNGaWxlLT5vcGxvY2tfYnJlYWssIGNpZnNfb3Bsb2NrX2JyZWFrKTsKIAogCXNwaW5fbG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7CkBAIC0yNzIsMTEgKzI3NSwxNCBAQAogCXNwaW5fdW5sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKIAogCWNpZnNfc2V0X29wbG9ja19sZXZlbChwQ2lmc0lub2RlLCBvcGxvY2spOworCXBDaWZzSW5vZGUtPmNhbl9jYWNoZV9icmxja3MgPSBwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbDsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBDaWZzRmlsZTsKIAlyZXR1cm4gcENpZnNGaWxlOwogfQogCitzdGF0aWMgdm9pZCBjaWZzX2RlbF9sb2NrX3dhaXRlcnMoc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jayk7CisKIC8qCiAgKiBSZWxlYXNlIGEgcmVmZXJlbmNlIG9uIHRoZSBmaWxlIHByaXZhdGUgZGF0YS4gVGhpcyBtYXkgaW52b2x2ZSBjbG9zaW5nCiAgKiB0aGUgZmlsZWhhbmRsZSBvdXQgb24gdGhlIHNlcnZlci4gTXVzdCBiZSBjYWxsZWQgd2l0aG91dCBob2xkaW5nCkBAIC0zMjcsMTIgKzMzMywxNSBAQAogCS8qIERlbGV0ZSBhbnkgb3V0c3RhbmRpbmcgbG9jayByZWNvcmRzLiBXZSdsbCBsb3NlIHRoZW0gd2hlbiB0aGUgZmlsZQogCSAqIGlzIGNsb3NlZCBhbnl3YXkuCiAJICovCi0JbXV0ZXhfbG9jaygmY2lmc19maWxlLT5sb2NrX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpZnNfZmlsZS0+bGxpc3QsIGxsaXN0KSB7CisJbXV0ZXhfbG9jaygmY2lmc2ktPmxvY2tfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgdG1wLCAmY2lmc2ktPmxsaXN0LCBsbGlzdCkgeworCQlpZiAobGktPm5ldGZpZCAhPSBjaWZzX2ZpbGUtPm5ldGZpZCkKKwkJCWNvbnRpbnVlOwogCQlsaXN0X2RlbCgmbGktPmxsaXN0KTsKKwkJY2lmc19kZWxfbG9ja193YWl0ZXJzKGxpKTsKIAkJa2ZyZWUobGkpOwogCX0KLQltdXRleF91bmxvY2soJmNpZnNfZmlsZS0+bG9ja19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjaWZzaS0+bG9ja19tdXRleCk7CiAKIAljaWZzX3B1dF90bGluayhjaWZzX2ZpbGUtPnRsaW5rKTsKIAlkcHV0KGNpZnNfZmlsZS0+ZGVudHJ5KTsKQEAgLTM3MSw3ICszODAsNyBAQAogCWNGWUkoMSwgImlub2RlID0gMHglcCBmaWxlIGZsYWdzIGFyZSAweCV4IGZvciAlcyIsCiAJCSBpbm9kZSwgZmlsZS0+Zl9mbGFncywgZnVsbF9wYXRoKTsKIAotCWlmIChvcGxvY2tFbmFibGVkKQorCWlmIChlbmFibGVfb3Bsb2NrcykKIAkJb3Bsb2NrID0gUkVRX09QTE9DSzsKIAllbHNlCiAJCW9wbG9jayA9IDA7CkBAIC00NjUsNiArNDc0LDcgQEAKIAljaGFyICpmdWxsX3BhdGggPSBOVUxMOwogCWludCBkZXNpcmVkQWNjZXNzOwogCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlfX3UxNiBuZXRmaWQ7CiAKIAl4aWQgPSBHZXRYaWQoKTsKQEAgLTQ5NSw3ICs1MDUsNyBAQAogCWNGWUkoMSwgImlub2RlID0gMHglcCBmaWxlIGZsYWdzIDB4JXggZm9yICVzIiwKIAkJIGlub2RlLCBwQ2lmc0ZpbGUtPmZfZmxhZ3MsIGZ1bGxfcGF0aCk7CiAKLQlpZiAob3Bsb2NrRW5hYmxlZCkKKwlpZiAoZW5hYmxlX29wbG9ja3MpCiAJCW9wbG9jayA9IFJFUV9PUExPQ0s7CiAJZWxzZQogCQlvcGxvY2sgPSAwOwpAQCAtNTI0LDYgKzUzNCw5IEBACiAKIAlkZXNpcmVkQWNjZXNzID0gY2lmc19jb252ZXJ0X2ZsYWdzKHBDaWZzRmlsZS0+Zl9mbGFncyk7CiAKKwlpZiAoYmFja3VwX2NyZWQoY2lmc19zYikpCisJCWNyZWF0ZV9vcHRpb25zIHw9IENSRUFURV9PUEVOX0JBQ0tVUF9JTlRFTlQ7CisKIAkvKiBDYW4gbm90IHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHRvIGJlIHJldHVybmVkCiAJICAgYnkgU01CT3BlbiBhbmQgdGhlbiBjYWxsaW5nIGdldF9pbm9kZV9pbmZvIHdpdGggcmV0dXJuZWQgYnVmCiAJICAgc2luY2UgZmlsZSBtaWdodCBoYXZlIHdyaXRlIGJlaGluZCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZmx1c2hlZApAQCAtNTMxLDcgKzU0NCw3IEBACiAJICAgdGhhdCBpbm9kZSB3YXMgbm90IGRpcnR5IGxvY2FsbHkgd2UgY291bGQgZG8gdGhpcyAqLwogCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sIGRlc2lyZWRBY2Nlc3MsCi0JCQkgQ1JFQVRFX05PVF9ESVIsICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkgY3JlYXRlX29wdGlvbnMsICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCiAJCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwogCWlmIChyYykgewpAQCAtNjMxLDIxOSArNjQ0LDY4NyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBzdG9yZV9maWxlX2xvY2soc3RydWN0IGNpZnNGaWxlSW5mbyAqZmlkLCBfX3U2NCBsZW4sCi0JCQkJX191NjQgb2Zmc2V0LCBfX3U4IGxvY2tUeXBlKQorc3RhdGljIHN0cnVjdCBjaWZzTG9ja0luZm8gKgorY2lmc19sb2NrX2luaXQoX191NjQgb2Zmc2V0LCBfX3U2NCBsZW5ndGgsIF9fdTggdHlwZSwgX191MTYgbmV0ZmlkKQogewotCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpID0KKwlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrID0KIAkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNMb2NrSW5mbyksIEdGUF9LRVJORUwpOwotCWlmIChsaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlsaS0+b2Zmc2V0ID0gb2Zmc2V0OwotCWxpLT5sZW5ndGggPSBsZW47Ci0JbGktPnR5cGUgPSBsb2NrVHlwZTsKLQltdXRleF9sb2NrKCZmaWQtPmxvY2tfbXV0ZXgpOwotCWxpc3RfYWRkKCZsaS0+bGxpc3QsICZmaWQtPmxsaXN0KTsKLQltdXRleF91bmxvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JcmV0dXJuIDA7CisJaWYgKCFsb2NrKQorCQlyZXR1cm4gbG9jazsKKwlsb2NrLT5vZmZzZXQgPSBvZmZzZXQ7CisJbG9jay0+bGVuZ3RoID0gbGVuZ3RoOworCWxvY2stPnR5cGUgPSB0eXBlOworCWxvY2stPm5ldGZpZCA9IG5ldGZpZDsKKwlsb2NrLT5waWQgPSBjdXJyZW50LT50Z2lkOworCUlOSVRfTElTVF9IRUFEKCZsb2NrLT5ibGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9jay0+YmxvY2tfcSk7CisJcmV0dXJuIGxvY2s7CiB9CiAKLWludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnBmTG9jaykKK3N0YXRpYyB2b2lkCitjaWZzX2RlbF9sb2NrX3dhaXRlcnMoc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jaykKIHsKLQlpbnQgcmMsIHhpZDsKLQlfX3UzMiBudW1Mb2NrID0gMDsKLQlfX3UzMiBudW1VbmxvY2sgPSAwOwotCV9fdTY0IGxlbmd0aDsKLQlib29sIHdhaXRfZmxhZyA9IGZhbHNlOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKLQlfX3UxNiBuZXRmaWQ7Ci0JX191OCBsb2NrVHlwZSA9IExPQ0tJTkdfQU5EWF9MQVJHRV9GSUxFUzsKLQlib29sIHBvc2l4X2xvY2tpbmcgPSAwOwotCi0JbGVuZ3RoID0gMSArIHBmTG9jay0+ZmxfZW5kIC0gcGZMb2NrLT5mbF9zdGFydDsKLQlyYyA9IC1FQUNDRVM7Ci0JeGlkID0gR2V0WGlkKCk7Ci0KLQljRllJKDEsICJMb2NrIHBhcm06IDB4JXggZmxvY2tmbGFnczogIgotCQkgIjB4JXggZmxvY2t0eXBlOiAweCV4IHN0YXJ0OiAlbGxkIGVuZDogJWxsZCIsCi0JCWNtZCwgcGZMb2NrLT5mbF9mbGFncywgcGZMb2NrLT5mbF90eXBlLCBwZkxvY2stPmZsX3N0YXJ0LAotCQlwZkxvY2stPmZsX2VuZCk7Ci0KLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQotCQljRllJKDEsICJQb3NpeCIpOwotCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgRkxfRkxPQ0spCi0JCWNGWUkoMSwgIkZsb2NrIik7Ci0JaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkgewotCQljRllJKDEsICJCbG9ja2luZyBsb2NrIik7Ci0JCXdhaXRfZmxhZyA9IHRydWU7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpLCB0bXAsICZsb2NrLT5ibGlzdCwgYmxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbGktPmJsaXN0KTsKKwkJd2FrZV91cCgmbGktPmJsb2NrX3EpOwogCX0KLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKLQkJY0ZZSSgxLCAiUHJvY2VzcyBzdXNwZW5kZWQgYnkgbWFuZGF0b3J5IGxvY2tpbmcgLSAiCi0JCQkgIm5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKLQlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX0xFQVNFKQotCQljRllJKDEsICJMZWFzZSBvbiBmaWxlIC0gbm90IGltcGxlbWVudGVkIHlldCIpOwotCWlmIChwZkxvY2stPmZsX2ZsYWdzICYKLQkgICAgKH4oRkxfUE9TSVggfCBGTF9GTE9DSyB8IEZMX1NMRUVQIHwgRkxfQUNDRVNTIHwgRkxfTEVBU0UpKSkKLQkJY0ZZSSgxLCAiVW5rbm93biBsb2NrIGZsYWdzIDB4JXgiLCBwZkxvY2stPmZsX2ZsYWdzKTsKK30KIAotCWlmIChwZkxvY2stPmZsX3R5cGUgPT0gRl9XUkxDSykgewotCQljRllJKDEsICJGX1dSTENLICIpOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1VOTENLKSB7Ci0JCWNGWUkoMSwgIkZfVU5MQ0siKTsKLQkJbnVtVW5sb2NrID0gMTsKLQkJLyogQ2hlY2sgaWYgdW5sb2NrIGluY2x1ZGVzIG1vcmUgdGhhbgotCQlvbmUgbG9jayByYW5nZSAqLwotCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfUkRMQ0spIHsKLQkJY0ZZSSgxLCAiRl9SRExDSyIpOwotCQlsb2NrVHlwZSB8PSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0s7Ci0JCW51bUxvY2sgPSAxOwotCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfRVhMQ0spIHsKLQkJY0ZZSSgxLCAiRl9FWExDSyIpOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKSB7Ci0JCWNGWUkoMSwgIkZfU0hMQ0siKTsKLQkJbG9ja1R5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOwotCQludW1Mb2NrID0gMTsKLQl9IGVsc2UKLQkJY0ZZSSgxLCAiVW5rbm93biB0eXBlIG9mIGxvY2siKTsKK3N0YXRpYyBib29sCitfX2NpZnNfZmluZF9sb2NrX2NvbmZsaWN0KHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUsIF9fdTY0IG9mZnNldCwKKwkJCV9fdTY0IGxlbmd0aCwgX191OCB0eXBlLCBfX3UxNiBuZXRmaWQsCisJCQlzdHJ1Y3QgY2lmc0xvY2tJbmZvICoqY29uZl9sb2NrKQoreworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpLCAqdG1wOwogCi0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7Ci0JdGNvbiA9IHRsaW5rX3Rjb24oKChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhKS0+dGxpbmspOwotCW5ldGZpZCA9ICgoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YSktPm5ldGZpZDsKLQotCWlmICgodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgJiYKLQkgICAgKENJRlNfVU5JWF9GQ05UTF9DQVAgJiBsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKSAmJgotCSAgICAoKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT1BPU0lYQlJMKSA9PSAwKSkKLQkJcG9zaXhfbG9ja2luZyA9IDE7Ci0JLyogQkIgYWRkIGNvZGUgaGVyZSB0byBub3JtYWxpemUgb2Zmc2V0IGFuZCBsZW5ndGggdG8KLQlhY2NvdW50IGZvciBuZWdhdGl2ZSBsZW5ndGggd2hpY2ggd2UgY2FuIG5vdCBhY2NlcHQgb3ZlciB0aGUKLQl3aXJlICovCi0JaWYgKElTX0dFVExLKGNtZCkpIHsKLQkJaWYgKHBvc2l4X2xvY2tpbmcpIHsKLQkJCWludCBwb3NpeF9sb2NrX3R5cGU7Ci0JCQlpZiAobG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0spCi0JCQkJcG9zaXhfbG9ja190eXBlID0gQ0lGU19SRExDSzsKLQkJCWVsc2UKLQkJCQlwb3NpeF9sb2NrX3R5cGUgPSBDSUZTX1dSTENLOwotCQkJcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCAxIC8qIGdldCAqLywKLQkJCQkJbGVuZ3RoLCBwZkxvY2ssIHBvc2l4X2xvY2tfdHlwZSwKLQkJCQkJd2FpdF9mbGFnKTsKLQkJCUZyZWVYaWQoeGlkKTsKLQkJCXJldHVybiByYzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCWlmIChvZmZzZXQgKyBsZW5ndGggPD0gbGktPm9mZnNldCB8fAorCQkgICAgb2Zmc2V0ID49IGxpLT5vZmZzZXQgKyBsaS0+bGVuZ3RoKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKCh0eXBlICYgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLKSAmJgorCQkJICgobmV0ZmlkID09IGxpLT5uZXRmaWQgJiYgY3VycmVudC0+dGdpZCA9PSBsaS0+cGlkKSB8fAorCQkJICB0eXBlID09IGxpLT50eXBlKSkKKwkJCWNvbnRpbnVlOworCQllbHNlIHsKKwkJCSpjb25mX2xvY2sgPSBsaTsKKwkJCXJldHVybiB0cnVlOwogCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KIAotCQkvKiBCQiB3ZSBjb3VsZCBjaGFpbiB0aGVzZSBpbnRvIG9uZSBsb2NrIHJlcXVlc3QgQkIgKi8KLQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLCBwZkxvY2stPmZsX3N0YXJ0LAotCQkJCSAwLCAxLCBsb2NrVHlwZSwgMCAvKiB3YWl0IGZsYWcgKi8sIDApOwotCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLAotCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMSAvKiBudW1VbmxvY2sgKi8gLAotCQkJCQkgMCAvKiBudW1Mb2NrICovICwgbG9ja1R5cGUsCi0JCQkJCSAwIC8qIHdhaXQgZmxhZyAqLywgMCk7Ci0JCQlwZkxvY2stPmZsX3R5cGUgPSBGX1VOTENLOwotCQkJaWYgKHJjICE9IDApCi0JCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgotCQkJCQkgICAicmFuZ2UgJWQgZHVyaW5nIHRlc3Qgb2YgbG9jayIsIHJjKTsKLQkJCXJjID0gMDsKK3N0YXRpYyBib29sCitjaWZzX2ZpbmRfbG9ja19jb25mbGljdChzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlLCBzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrLAorCQkJc3RydWN0IGNpZnNMb2NrSW5mbyAqKmNvbmZfbG9jaykKK3sKKwlyZXR1cm4gX19jaWZzX2ZpbmRfbG9ja19jb25mbGljdChjaW5vZGUsIGxvY2stPm9mZnNldCwgbG9jay0+bGVuZ3RoLAorCQkJCQkgbG9jay0+dHlwZSwgbG9jay0+bmV0ZmlkLCBjb25mX2xvY2spOworfQogCi0JCX0gZWxzZSB7Ci0JCQkvKiBpZiByYyA9PSBFUlJfU0hBUklOR19WSU9MQVRJT04gPyAqLwotCQkJcmMgPSAwOworc3RhdGljIGludAorY2lmc19sb2NrX3Rlc3Qoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSwgX191NjQgb2Zmc2V0LCBfX3U2NCBsZW5ndGgsCisJICAgICAgIF9fdTggdHlwZSwgX191MTYgbmV0ZmlkLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmNvbmZfbG9jazsKKwlib29sIGV4aXN0OwogCi0JCQlpZiAobG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0spIHsKLQkJCQlwZkxvY2stPmZsX3R5cGUgPSBGX1dSTENLOwotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IENJRlNTTUJMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCBsZW5ndGgsCi0JCQkJCXBmTG9jay0+Zmxfc3RhcnQsIDAsIDEsCi0JCQkJCWxvY2tUeXBlIHwgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLLAotCQkJCQkwIC8qIHdhaXQgZmxhZyAqLywgMCk7Ci0JCQkJaWYgKHJjID09IDApIHsKLQkJCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwKLQkJCQkJCWxlbmd0aCwgcGZMb2NrLT5mbF9zdGFydCwgMSwgMCwKLQkJCQkJCWxvY2tUeXBlIHwKLQkJCQkJCUxPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSywKLQkJCQkJCTAgLyogd2FpdCBmbGFnICovLCAwKTsKLQkJCQkJcGZMb2NrLT5mbF90eXBlID0gRl9SRExDSzsKLQkJCQkJaWYgKHJjICE9IDApCi0JCQkJCQljRVJST1IoMSwgIkVycm9yIHVubG9ja2luZyAiCi0JCQkJCQkicHJldmlvdXNseSBsb2NrZWQgcmFuZ2UgJWQgIgotCQkJCQkJImR1cmluZyB0ZXN0IG9mIGxvY2siLCByYyk7Ci0JCQkJCXJjID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlwZkxvY2stPmZsX3R5cGUgPSBGX1dSTENLOwotCQkJCQlyYyA9IDA7Ci0JCQkJfQotCQkJfQotCQl9CisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAorCWV4aXN0ID0gX19jaWZzX2ZpbmRfbG9ja19jb25mbGljdChjaW5vZGUsIG9mZnNldCwgbGVuZ3RoLCB0eXBlLCBuZXRmaWQsCisJCQkJCSAgJmNvbmZfbG9jayk7CisJaWYgKGV4aXN0KSB7CisJCWZsb2NrLT5mbF9zdGFydCA9IGNvbmZfbG9jay0+b2Zmc2V0OworCQlmbG9jay0+ZmxfZW5kID0gY29uZl9sb2NrLT5vZmZzZXQgKyBjb25mX2xvY2stPmxlbmd0aCAtIDE7CisJCWZsb2NrLT5mbF9waWQgPSBjb25mX2xvY2stPnBpZDsKKwkJaWYgKGNvbmZfbG9jay0+dHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKwkJCWZsb2NrLT5mbF90eXBlID0gRl9SRExDSzsKKwkJZWxzZQorCQkJZmxvY2stPmZsX3R5cGUgPSBGX1dSTENLOworCX0gZWxzZSBpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykKKwkJcmMgPSAxOworCWVsc2UKKwkJZmxvY2stPmZsX3R5cGUgPSBGX1VOTENLOworCisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfbG9ja19hZGQoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSwgc3RydWN0IGNpZnNMb2NrSW5mbyAqbG9jaykKK3sKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmxvY2stPmxsaXN0LCAmY2lub2RlLT5sbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworfQorCitzdGF0aWMgaW50CitjaWZzX2xvY2tfYWRkX2lmKHN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUsIHN0cnVjdCBjaWZzTG9ja0luZm8gKmxvY2ssCisJCSBib29sIHdhaXQpCit7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqY29uZl9sb2NrOworCWJvb2wgZXhpc3Q7CisJaW50IHJjID0gMDsKKwordHJ5X2FnYWluOgorCWV4aXN0ID0gZmFsc2U7CisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKworCWV4aXN0ID0gY2lmc19maW5kX2xvY2tfY29uZmxpY3QoY2lub2RlLCBsb2NrLCAmY29uZl9sb2NrKTsKKwlpZiAoIWV4aXN0ICYmIGNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQlsaXN0X2FkZF90YWlsKCZsb2NrLT5sbGlzdCwgJmNpbm9kZS0+bGxpc3QpOworCQltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIWV4aXN0KQorCQlyYyA9IDE7CisJZWxzZSBpZiAoIXdhaXQpCisJCXJjID0gLUVBQ0NFUzsKKwllbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmbG9jay0+Ymxpc3QsICZjb25mX2xvY2stPmJsaXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShsb2NrLT5ibG9ja19xLAorCQkJCQkobG9jay0+Ymxpc3QucHJldiA9PSAmbG9jay0+Ymxpc3QpICYmCisJCQkJCShsb2NrLT5ibGlzdC5uZXh0ID09ICZsb2NrLT5ibGlzdCkpOworCQlpZiAoIXJjKQorCQkJZ290byB0cnlfYWdhaW47CisJCW11dGV4X2xvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCWxpc3RfZGVsX2luaXQoJmxvY2stPmJsaXN0KTsKKwl9CisKKwltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitjaWZzX3Bvc2l4X2xvY2tfdGVzdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmxvY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGNoYXIgc2F2ZWRfdHlwZSA9IGZsb2NrLT5mbF90eXBlOworCisJaWYgKChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCXBvc2l4X3Rlc3RfbG9jayhmaWxlLCBmbG9jayk7CisKKwlpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9VTkxDSyAmJiAhY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzKSB7CisJCWZsb2NrLT5mbF90eXBlID0gc2F2ZWRfdHlwZTsKKwkJcmMgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcG9zaXhfbG9ja19zZXQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsb2NrKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJjID0gMTsKKworCWlmICgoZmxvY2stPmZsX2ZsYWdzICYgRkxfUE9TSVgpID09IDApCisJCXJldHVybiByYzsKKworCW11dGV4X2xvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJaWYgKCFjaW5vZGUtPmNhbl9jYWNoZV9icmxja3MpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCQlyZXR1cm4gcmM7CisJfQorCXJjID0gcG9zaXhfbG9ja19maWxlX3dhaXQoZmlsZSwgZmxvY2spOworCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfcHVzaF9tYW5kYXRvcnlfbG9ja3Moc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCit7CisJaW50IHhpZCwgcmMgPSAwLCBzdG9yZWRfcmM7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBudW0sIG1heF9udW07CisJTE9DS0lOR19BTkRYX1JBTkdFICpidWYsICpjdXI7CisJaW50IHR5cGVzW10gPSB7TE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTLAorCQkgICAgICAgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLIHwgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTfTsKKwlpbnQgaTsKKworCXhpZCA9IEdldFhpZCgpOworCXRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWlmICghY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzKSB7CisJCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JaWYgKCFudW1Mb2NrICYmICFudW1VbmxvY2spIHsKLQkJLyogaWYgbm8gbG9jayBvciB1bmxvY2sgdGhlbiBub3RoaW5nCi0JCXRvIGRvIHNpbmNlIHdlIGRvIG5vdCBrbm93IHdoYXQgaXQgaXMgKi8KKwltYXhfbnVtID0gKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLSBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKSAvCisJCSAgc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSk7CisJYnVmID0ga3phbGxvYyhtYXhfbnVtICogc2l6ZW9mKExPQ0tJTkdfQU5EWF9SQU5HRSksIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCW11dGV4X3VubG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKIAkJRnJlZVhpZCh4aWQpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJldHVybiByYzsKIAl9CiAKLQlpZiAocG9zaXhfbG9ja2luZykgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyID0gYnVmOworCQludW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCQlpZiAobGktPnR5cGUgIT0gdHlwZXNbaV0pCisJCQkJY29udGludWU7CisJCQljdXItPlBpZCA9IGNwdV90b19sZTE2KGxpLT5waWQpOworCQkJY3VyLT5MZW5ndGhMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5sZW5ndGgpOworCQkJY3VyLT5MZW5ndGhIaWdoID0gY3B1X3RvX2xlMzIoKHUzMikobGktPmxlbmd0aD4+MzIpKTsKKwkJCWN1ci0+T2Zmc2V0TG93ID0gY3B1X3RvX2xlMzIoKHUzMilsaS0+b2Zmc2V0KTsKKwkJCWN1ci0+T2Zmc2V0SGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxpLT5vZmZzZXQ+PjMyKSk7CisJCQlpZiAoKytudW0gPT0gbWF4X251bSkgeworCQkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkJICAgICAgIGxpLT50eXBlLCAwLCBudW0sIGJ1Zik7CisJCQkJaWYgKHN0b3JlZF9yYykKKwkJCQkJcmMgPSBzdG9yZWRfcmM7CisJCQkJY3VyID0gYnVmOworCQkJCW51bSA9IDA7CisJCQl9IGVsc2UKKwkJCQljdXIrKzsKKwkJfQorCisJCWlmIChudW0pIHsKKwkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkgICAgICAgdHlwZXNbaV0sIDAsIG51bSwgYnVmKTsKKwkJCWlmIChzdG9yZWRfcmMpCisJCQkJcmMgPSBzdG9yZWRfcmM7CisJCX0KKwl9CisKKwljaW5vZGUtPmNhbl9jYWNoZV9icmxja3MgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisKKwlrZnJlZShidWYpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNvcGllZCBmcm9tIGZzL2xvY2tzLmMgd2l0aCBhIG5hbWUgY2hhbmdlICovCisjZGVmaW5lIGNpZnNfZm9yX2VhY2hfbG9jayhpbm9kZSwgbG9ja3ApIFwKKwlmb3IgKGxvY2twID0gJmlub2RlLT5pX2Zsb2NrOyAqbG9ja3AgIT0gTlVMTDsgXAorCSAgICAgbG9ja3AgPSAmKCpsb2NrcCktPmZsX25leHQpCisKK3N0YXRpYyBpbnQKK2NpZnNfcHVzaF9wb3NpeF9sb2NrcyhzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisJc3RydWN0IGZpbGVfbG9jayAqZmxvY2ssICoqYmVmb3JlOworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxjaywgKnRtcDsKKwlpbnQgcmMgPSAwLCB4aWQsIHR5cGU7CisJX191NjQgbGVuZ3RoOworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja3NfdG9fc2VuZDsKKworCXhpZCA9IEdldFhpZCgpOworCisJbXV0ZXhfbG9jaygmY2lub2RlLT5sb2NrX211dGV4KTsKKwlpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZsb2Nrc190b19zZW5kKTsKKworCWxvY2tfZmxvY2tzKCk7CisJY2lmc19mb3JfZWFjaF9sb2NrKGNmaWxlLT5kZW50cnktPmRfaW5vZGUsIGJlZm9yZSkgeworCQlmbG9jayA9ICpiZWZvcmU7CisJCWxlbmd0aCA9IDEgKyBmbG9jay0+ZmxfZW5kIC0gZmxvY2stPmZsX3N0YXJ0OworCQlpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9SRExDSyB8fCBmbG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKQorCQkJdHlwZSA9IENJRlNfUkRMQ0s7CisJCWVsc2UKKwkJCXR5cGUgPSBDSUZTX1dSTENLOworCisJCWxjayA9IGNpZnNfbG9ja19pbml0KGZsb2NrLT5mbF9zdGFydCwgbGVuZ3RoLCB0eXBlLAorCQkJCSAgICAgY2ZpbGUtPm5ldGZpZCk7CisJCWlmICghbGNrKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIHNlbmRfbG9ja3M7CisJCX0KKwkJbGNrLT5waWQgPSBmbG9jay0+ZmxfcGlkOworCisJCWxpc3RfYWRkX3RhaWwoJmxjay0+bGxpc3QsICZsb2Nrc190b19zZW5kKTsKKwl9CisKK3NlbmRfbG9ja3M6CisJdW5sb2NrX2Zsb2NrcygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxjaywgdG1wLCAmbG9ja3NfdG9fc2VuZCwgbGxpc3QpIHsKKwkJc3RydWN0IGZpbGVfbG9jayB0bXBfbG9jazsKKwkJaW50IHN0b3JlZF9yYzsKKworCQl0bXBfbG9jay5mbF9zdGFydCA9IGxjay0+b2Zmc2V0OworCQlzdG9yZWRfcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbGNrLT5uZXRmaWQsIGxjay0+cGlkLAorCQkJCQkgICAgIDAsIGxjay0+bGVuZ3RoLCAmdG1wX2xvY2ssCisJCQkJCSAgICAgbGNrLT50eXBlLCAwKTsKKwkJaWYgKHN0b3JlZF9yYykKKwkJCXJjID0gc3RvcmVkX3JjOworCQlsaXN0X2RlbCgmbGNrLT5sbGlzdCk7CisJCWtmcmVlKGxjayk7CisJfQorCisJY2lub2RlLT5jYW5fY2FjaGVfYnJsY2tzID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19wdXNoX2xvY2tzKHN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGNmaWxlLT5kZW50cnktPmRfc2IpOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisKKwlpZiAoKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpICYmCisJICAgIChDSUZTX1VOSVhfRkNOVExfQ0FQICYgbGU2NF90b19jcHUodGNvbi0+ZnNVbml4SW5mby5DYXBhYmlsaXR5KSkgJiYKKwkgICAgKChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9QT1NJWEJSTCkgPT0gMCkpCisJCXJldHVybiBjaWZzX3B1c2hfcG9zaXhfbG9ja3MoY2ZpbGUpOworCisJcmV0dXJuIGNpZnNfcHVzaF9tYW5kYXRvcnlfbG9ja3MoY2ZpbGUpOworfQorCitzdGF0aWMgdm9pZAorY2lmc19yZWFkX2Zsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmZsb2NrLCBfX3U4ICp0eXBlLCBpbnQgKmxvY2ssIGludCAqdW5sb2NrLAorCQlib29sICp3YWl0X2ZsYWcpCit7CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorCQljRllJKDEsICJQb3NpeCIpOworCWlmIChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykKKwkJY0ZZSSgxLCAiRmxvY2siKTsKKwlpZiAoZmxvY2stPmZsX2ZsYWdzICYgRkxfU0xFRVApIHsKKwkJY0ZZSSgxLCAiQmxvY2tpbmcgbG9jayIpOworCQkqd2FpdF9mbGFnID0gdHJ1ZTsKKwl9CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKKwkJY0ZZSSgxLCAiUHJvY2VzcyBzdXNwZW5kZWQgYnkgbWFuZGF0b3J5IGxvY2tpbmcgLSAiCisJCQkibm90IGltcGxlbWVudGVkIHlldCIpOworCWlmIChmbG9jay0+ZmxfZmxhZ3MgJiBGTF9MRUFTRSkKKwkJY0ZZSSgxLCAiTGVhc2Ugb24gZmlsZSAtIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKwlpZiAoZmxvY2stPmZsX2ZsYWdzICYKKwkgICAgKH4oRkxfUE9TSVggfCBGTF9GTE9DSyB8IEZMX1NMRUVQIHwgRkxfQUNDRVNTIHwgRkxfTEVBU0UpKSkKKwkJY0ZZSSgxLCAiVW5rbm93biBsb2NrIGZsYWdzIDB4JXgiLCBmbG9jay0+ZmxfZmxhZ3MpOworCisJKnR5cGUgPSBMT0NLSU5HX0FORFhfTEFSR0VfRklMRVM7CisJaWYgKGZsb2NrLT5mbF90eXBlID09IEZfV1JMQ0spIHsKKwkJY0ZZSSgxLCAiRl9XUkxDSyAiKTsKKwkJKmxvY2sgPSAxOworCX0gZWxzZSBpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9VTkxDSykgeworCQljRllJKDEsICJGX1VOTENLIik7CisJCSp1bmxvY2sgPSAxOworCQkvKiBDaGVjayBpZiB1bmxvY2sgaW5jbHVkZXMgbW9yZSB0aGFuIG9uZSBsb2NrIHJhbmdlICovCisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSA9PSBGX1JETENLKSB7CisJCWNGWUkoMSwgIkZfUkRMQ0siKTsKKwkJKnR5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOworCQkqbG9jayA9IDE7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSA9PSBGX0VYTENLKSB7CisJCWNGWUkoMSwgIkZfRVhMQ0siKTsKKwkJKmxvY2sgPSAxOworCX0gZWxzZSBpZiAoZmxvY2stPmZsX3R5cGUgPT0gRl9TSExDSykgeworCQljRllJKDEsICJGX1NITENLIik7CisJCSp0eXBlIHw9IExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSzsKKwkJKmxvY2sgPSAxOworCX0gZWxzZQorCQljRllJKDEsICJVbmtub3duIHR5cGUgb2YgbG9jayIpOworfQorCitzdGF0aWMgaW50CitjaWZzX2dldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaywgX191OCB0eXBlLAorCSAgIGJvb2wgd2FpdF9mbGFnLCBib29sIHBvc2l4X2xjaywgaW50IHhpZCkKK3sKKwlpbnQgcmMgPSAwOworCV9fdTY0IGxlbmd0aCA9IDEgKyBmbG9jay0+ZmxfZW5kIC0gZmxvY2stPmZsX3N0YXJ0OworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbiA9IHRsaW5rX3Rjb24oY2ZpbGUtPnRsaW5rKTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlID0gQ0lGU19JKGNmaWxlLT5kZW50cnktPmRfaW5vZGUpOworCV9fdTE2IG5ldGZpZCA9IGNmaWxlLT5uZXRmaWQ7CisKKwlpZiAocG9zaXhfbGNrKSB7CiAJCWludCBwb3NpeF9sb2NrX3R5cGU7Ci0JCWlmIChsb2NrVHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKworCQlyYyA9IGNpZnNfcG9zaXhfbG9ja190ZXN0KGZpbGUsIGZsb2NrKTsKKwkJaWYgKCFyYykKKwkJCXJldHVybiByYzsKKworCQlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKKwkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfUkRMQ0s7CisJCWVsc2UKKwkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfV1JMQ0s7CisJCXJjID0gQ0lGU1NNQlBvc2l4TG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgICAgICAxIC8qIGdldCAqLywgbGVuZ3RoLCBmbG9jaywKKwkJCQkgICAgICBwb3NpeF9sb2NrX3R5cGUsIHdhaXRfZmxhZyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNpZnNfbG9ja190ZXN0KGNpbm9kZSwgZmxvY2stPmZsX3N0YXJ0LCBsZW5ndGgsIHR5cGUsIG5ldGZpZCwKKwkJCSAgICBmbG9jayk7CisJaWYgKCFyYykKKwkJcmV0dXJuIHJjOworCisJLyogQkIgd2UgY291bGQgY2hhaW4gdGhlc2UgaW50byBvbmUgbG9jayByZXF1ZXN0IEJCICovCisJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwgbGVuZ3RoLAorCQkJIGZsb2NrLT5mbF9zdGFydCwgMCwgMSwgdHlwZSwgMCwgMCk7CisJaWYgKHJjID09IDApIHsKKwkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgbGVuZ3RoLCBmbG9jay0+Zmxfc3RhcnQsIDEsIDAsCisJCQkJIHR5cGUsIDAsIDApOworCQlmbG9jay0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCWlmIChyYyAhPSAwKQorCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgorCQkJCSAgICJyYW5nZSAlZCBkdXJpbmcgdGVzdCBvZiBsb2NrIiwgcmMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykgeworCQlmbG9jay0+ZmxfdHlwZSA9IEZfV1JMQ0s7CisJCXJldHVybiAwOworCX0KKworCXJjID0gQ0lGU1NNQkxvY2soeGlkLCB0Y29uLCBuZXRmaWQsIGN1cnJlbnQtPnRnaWQsIGxlbmd0aCwKKwkJCSBmbG9jay0+Zmxfc3RhcnQsIDAsIDEsCisJCQkgdHlwZSB8IExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSywgMCwgMCk7CisJaWYgKHJjID09IDApIHsKKwkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgY3VycmVudC0+dGdpZCwKKwkJCQkgbGVuZ3RoLCBmbG9jay0+Zmxfc3RhcnQsIDEsIDAsCisJCQkJIHR5cGUgfCBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0ssCisJCQkJIDAsIDApOworCQlmbG9jay0+ZmxfdHlwZSA9IEZfUkRMQ0s7CisJCWlmIChyYyAhPSAwKQorCQkJY0VSUk9SKDEsICJFcnJvciB1bmxvY2tpbmcgcHJldmlvdXNseSBsb2NrZWQgIgorCQkJCSAgInJhbmdlICVkIGR1cmluZyB0ZXN0IG9mIGxvY2siLCByYyk7CisJfSBlbHNlCisJCWZsb2NrLT5mbF90eXBlID0gRl9XUkxDSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY2lmc19tb3ZlX2xsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKnNvdXJjZSwgc3RydWN0IGxpc3RfaGVhZCAqZGVzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaSwgKnRtcDsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGksIHRtcCwgc291cmNlKQorCQlsaXN0X21vdmUobGksIGRlc3QpOworfQorCitzdGF0aWMgdm9pZAorY2lmc19mcmVlX2xsaXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxsaXN0KQoreworCXN0cnVjdCBjaWZzTG9ja0luZm8gKmxpLCAqdG1wOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgdG1wLCBsbGlzdCwgbGxpc3QpIHsKKwkJY2lmc19kZWxfbG9ja193YWl0ZXJzKGxpKTsKKwkJbGlzdF9kZWwoJmxpLT5sbGlzdCk7CisJCWtmcmVlKGxpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfdW5sb2NrX3JhbmdlKHN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaywgaW50IHhpZCkKK3sKKwlpbnQgcmMgPSAwLCBzdG9yZWRfcmM7CisJaW50IHR5cGVzW10gPSB7TE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTLAorCQkgICAgICAgTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLIHwgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTfTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbWF4X251bSwgbnVtOworCUxPQ0tJTkdfQU5EWF9SQU5HRSAqYnVmLCAqY3VyOworCXN0cnVjdCBjaWZzX3Rjb24gKnRjb24gPSB0bGlua190Y29uKGNmaWxlLT50bGluayk7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSA9IENJRlNfSShjZmlsZS0+ZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsaSwgKnRtcDsKKwlfX3U2NCBsZW5ndGggPSAxICsgZmxvY2stPmZsX2VuZCAtIGZsb2NrLT5mbF9zdGFydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9sbGlzdDsKKworCUlOSVRfTElTVF9IRUFEKCZ0bXBfbGxpc3QpOworCisJbWF4X251bSA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSkgLworCQkgIHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpOworCWJ1ZiA9IGt6YWxsb2MobWF4X251bSAqIHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJY3VyID0gYnVmOworCQludW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmNpbm9kZS0+bGxpc3QsIGxsaXN0KSB7CisJCQlpZiAoZmxvY2stPmZsX3N0YXJ0ID4gbGktPm9mZnNldCB8fAorCQkJICAgIChmbG9jay0+Zmxfc3RhcnQgKyBsZW5ndGgpIDwKKwkJCSAgICAobGktPm9mZnNldCArIGxpLT5sZW5ndGgpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGN1cnJlbnQtPnRnaWQgIT0gbGktPnBpZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjZmlsZS0+bmV0ZmlkICE9IGxpLT5uZXRmaWQpCisJCQkJY29udGludWU7CisJCQlpZiAodHlwZXNbaV0gIT0gbGktPnR5cGUpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNpbm9kZS0+Y2FuX2NhY2hlX2JybGNrcykgeworCQkJCWN1ci0+UGlkID0gY3B1X3RvX2xlMTYobGktPnBpZCk7CisJCQkJY3VyLT5MZW5ndGhMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5sZW5ndGgpOworCQkJCWN1ci0+TGVuZ3RoSGlnaCA9CisJCQkJCWNwdV90b19sZTMyKCh1MzIpKGxpLT5sZW5ndGg+PjMyKSk7CisJCQkJY3VyLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMigodTMyKWxpLT5vZmZzZXQpOworCQkJCWN1ci0+T2Zmc2V0SGlnaCA9CisJCQkJCWNwdV90b19sZTMyKCh1MzIpKGxpLT5vZmZzZXQ+PjMyKSk7CisJCQkJLyoKKwkJCQkgKiBXZSBuZWVkIHRvIHNhdmUgYSBsb2NrIGhlcmUgdG8gbGV0IHVzIGFkZAorCQkJCSAqIGl0IGFnYWluIHRvIHRoZSBpbm9kZSBsaXN0IGlmIHRoZSB1bmxvY2sKKwkJCQkgKiByYW5nZSByZXF1ZXN0IGZhaWxzIG9uIHRoZSBzZXJ2ZXIuCisJCQkJICovCisJCQkJbGlzdF9tb3ZlKCZsaS0+bGxpc3QsICZ0bXBfbGxpc3QpOworCQkJCWlmICgrK251bSA9PSBtYXhfbnVtKSB7CisJCQkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLAorCQkJCQkJCSAgICAgICBjZmlsZS0+bmV0ZmlkLAorCQkJCQkJCSAgICAgICBsaS0+dHlwZSwgbnVtLAorCQkJCQkJCSAgICAgICAwLCBidWYpOworCQkJCQlpZiAoc3RvcmVkX3JjKSB7CisJCQkJCQkvKgorCQkJCQkJICogV2UgZmFpbGVkIG9uIHRoZSB1bmxvY2sgcmFuZ2UKKwkJCQkJCSAqIHJlcXVlc3QgLSBhZGQgYWxsIGxvY2tzIGZyb20KKwkJCQkJCSAqIHRoZSB0bXAgbGlzdCB0byB0aGUgaGVhZCBvZgorCQkJCQkJICogdGhlIGlub2RlIGxpc3QuCisJCQkJCQkgKi8KKwkJCQkJCWNpZnNfbW92ZV9sbGlzdCgmdG1wX2xsaXN0LAorCQkJCQkJCQkmY2lub2RlLT5sbGlzdCk7CisJCQkJCQlyYyA9IHN0b3JlZF9yYzsKKwkJCQkJfSBlbHNlCisJCQkJCQkvKgorCQkJCQkJICogVGhlIHVubG9jayByYW5nZSByZXF1ZXN0CisJCQkJCQkgKiBzdWNjZWVkIC0gZnJlZSB0aGUgdG1wIGxpc3QuCisJCQkJCQkgKi8KKwkJCQkJCWNpZnNfZnJlZV9sbGlzdCgmdG1wX2xsaXN0KTsKKwkJCQkJY3VyID0gYnVmOworCQkJCQludW0gPSAwOworCQkJCX0gZWxzZQorCQkJCQljdXIrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4gY2FjaGUgYnJsb2NrIHJlcXVlc3RzIC0gc2ltcGx5IHJlbW92ZQorCQkJCSAqIGEgbG9jayBmcm9tIHRoZSBpbm9kZSBsaXN0LgorCQkJCSAqLworCQkJCWxpc3RfZGVsKCZsaS0+bGxpc3QpOworCQkJCWNpZnNfZGVsX2xvY2tfd2FpdGVycyhsaSk7CisJCQkJa2ZyZWUobGkpOworCQkJfQorCQl9CisJCWlmIChudW0pIHsKKwkJCXN0b3JlZF9yYyA9IGNpZnNfbG9ja3YoeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLAorCQkJCQkgICAgICAgdHlwZXNbaV0sIG51bSwgMCwgYnVmKTsKKwkJCWlmIChzdG9yZWRfcmMpIHsKKwkJCQljaWZzX21vdmVfbGxpc3QoJnRtcF9sbGlzdCwgJmNpbm9kZS0+bGxpc3QpOworCQkJCXJjID0gc3RvcmVkX3JjOworCQkJfSBlbHNlCisJCQkJY2lmc19mcmVlX2xsaXN0KCZ0bXBfbGxpc3QpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjaW5vZGUtPmxvY2tfbXV0ZXgpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitjaWZzX3NldGxrKHN0cnVjdCBmaWxlICpmaWxlLCAgc3RydWN0IGZpbGVfbG9jayAqZmxvY2ssIF9fdTggdHlwZSwKKwkgICBib29sIHdhaXRfZmxhZywgYm9vbCBwb3NpeF9sY2ssIGludCBsb2NrLCBpbnQgdW5sb2NrLCBpbnQgeGlkKQoreworCWludCByYyA9IDA7CisJX191NjQgbGVuZ3RoID0gMSArIGZsb2NrLT5mbF9lbmQgLSBmbG9jay0+Zmxfc3RhcnQ7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2lmc190Y29uICp0Y29uID0gdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJX191MTYgbmV0ZmlkID0gY2ZpbGUtPm5ldGZpZDsKKworCWlmIChwb3NpeF9sY2spIHsKKwkJaW50IHBvc2l4X2xvY2tfdHlwZTsKKworCQlyYyA9IGNpZnNfcG9zaXhfbG9ja19zZXQoZmlsZSwgZmxvY2spOworCQlpZiAoIXJjIHx8IHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAodHlwZSAmIExPQ0tJTkdfQU5EWF9TSEFSRURfTE9DSykKIAkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfUkRMQ0s7CiAJCWVsc2UKIAkJCXBvc2l4X2xvY2tfdHlwZSA9IENJRlNfV1JMQ0s7CiAKLQkJaWYgKG51bVVubG9jayA9PSAxKQorCQlpZiAodW5sb2NrID09IDEpCiAJCQlwb3NpeF9sb2NrX3R5cGUgPSBDSUZTX1VOTENLOwogCi0JCXJjID0gQ0lGU1NNQlBvc2l4TG9jayh4aWQsIHRjb24sIG5ldGZpZCwgMCAvKiBzZXQgKi8sCi0JCQkJICAgICAgbGVuZ3RoLCBwZkxvY2ssIHBvc2l4X2xvY2tfdHlwZSwKLQkJCQkgICAgICB3YWl0X2ZsYWcpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBjaWZzRmlsZUluZm8gKmZpZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCQlpZiAobnVtTG9jaykgewotCQkJcmMgPSBDSUZTU01CTG9jayh4aWQsIHRjb24sIG5ldGZpZCwgbGVuZ3RoLAotCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMCwgbnVtTG9jaywgbG9ja1R5cGUsCi0JCQkJCSB3YWl0X2ZsYWcsIDApOwotCi0JCQlpZiAocmMgPT0gMCkgewotCQkJCS8qIEZvciBXaW5kb3dzIGxvY2tzIHdlIG11c3Qgc3RvcmUgdGhlbS4gKi8KLQkJCQlyYyA9IHN0b3JlX2ZpbGVfbG9jayhmaWQsIGxlbmd0aCwKLQkJCQkJCXBmTG9jay0+Zmxfc3RhcnQsIGxvY2tUeXBlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChudW1VbmxvY2spIHsKLQkJCS8qIEZvciBlYWNoIHN0b3JlZCBsb2NrIHRoYXQgdGhpcyB1bmxvY2sgb3ZlcmxhcHMKLQkJCSAgIGNvbXBsZXRlbHksIHVubG9jayBpdC4gKi8KLQkJCWludCBzdG9yZWRfcmMgPSAwOwotCQkJc3RydWN0IGNpZnNMb2NrSW5mbyAqbGksICp0bXA7Ci0KLQkJCXJjID0gMDsKLQkJCW11dGV4X2xvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGksIHRtcCwgJmZpZC0+bGxpc3QsIGxsaXN0KSB7Ci0JCQkJaWYgKHBmTG9jay0+Zmxfc3RhcnQgPD0gbGktPm9mZnNldCAmJgotCQkJCQkJKHBmTG9jay0+Zmxfc3RhcnQgKyBsZW5ndGgpID49Ci0JCQkJCQkobGktPm9mZnNldCArIGxpLT5sZW5ndGgpKSB7Ci0JCQkJCXN0b3JlZF9yYyA9IENJRlNTTUJMb2NrKHhpZCwgdGNvbiwKLQkJCQkJCQluZXRmaWQsIGxpLT5sZW5ndGgsCi0JCQkJCQkJbGktPm9mZnNldCwgMSwgMCwKLQkJCQkJCQlsaS0+dHlwZSwgZmFsc2UsIDApOwotCQkJCQlpZiAoc3RvcmVkX3JjKQotCQkJCQkJcmMgPSBzdG9yZWRfcmM7Ci0JCQkJCWVsc2UgewotCQkJCQkJbGlzdF9kZWwoJmxpLT5sbGlzdCk7Ci0JCQkJCQlrZnJlZShsaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJmZpZC0+bG9ja19tdXRleCk7Ci0JCX0KKwkJcmMgPSBDSUZTU01CUG9zaXhMb2NrKHhpZCwgdGNvbiwgbmV0ZmlkLCBjdXJyZW50LT50Z2lkLAorCQkJCSAgICAgIDAgLyogc2V0ICovLCBsZW5ndGgsIGZsb2NrLAorCQkJCSAgICAgIHBvc2l4X2xvY2tfdHlwZSwgd2FpdF9mbGFnKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkKLQkJcG9zaXhfbG9ja19maWxlX3dhaXQoZmlsZSwgcGZMb2NrKTsKKwlpZiAobG9jaykgeworCQlzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrOworCisJCWxvY2sgPSBjaWZzX2xvY2tfaW5pdChmbG9jay0+Zmxfc3RhcnQsIGxlbmd0aCwgdHlwZSwgbmV0ZmlkKTsKKwkJaWYgKCFsb2NrKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmMgPSBjaWZzX2xvY2tfYWRkX2lmKGNpbm9kZSwgbG9jaywgd2FpdF9mbGFnKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWtmcmVlKGxvY2spOworCQlpZiAocmMgPD0gMCkKKwkJCWdvdG8gb3V0OworCisJCXJjID0gQ0lGU1NNQkxvY2soeGlkLCB0Y29uLCBuZXRmaWQsIGN1cnJlbnQtPnRnaWQsIGxlbmd0aCwKKwkJCQkgZmxvY2stPmZsX3N0YXJ0LCAwLCAxLCB0eXBlLCB3YWl0X2ZsYWcsIDApOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKworCQljaWZzX2xvY2tfYWRkKGNpbm9kZSwgbG9jayk7CisJfSBlbHNlIGlmICh1bmxvY2spCisJCXJjID0gY2lmc191bmxvY2tfcmFuZ2UoY2ZpbGUsIGZsb2NrLCB4aWQpOworCitvdXQ6CisJaWYgKGZsb2NrLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorCQlwb3NpeF9sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKK3sKKwlpbnQgcmMsIHhpZDsKKwlpbnQgbG9jayA9IDAsIHVubG9jayA9IDA7CisJYm9vbCB3YWl0X2ZsYWcgPSBmYWxzZTsKKwlib29sIHBvc2l4X2xjayA9IGZhbHNlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNfdGNvbiAqdGNvbjsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlOworCV9fdTE2IG5ldGZpZDsKKwlfX3U4IHR5cGU7CisKKwlyYyA9IC1FQUNDRVM7CisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICJMb2NrIHBhcm06IDB4JXggZmxvY2tmbGFnczogMHgleCBmbG9ja3R5cGU6IDB4JXggc3RhcnQ6ICVsbGQgIgorCQkiZW5kOiAlbGxkIiwgY21kLCBmbG9jay0+ZmxfZmxhZ3MsIGZsb2NrLT5mbF90eXBlLAorCQlmbG9jay0+Zmxfc3RhcnQsIGZsb2NrLT5mbF9lbmQpOworCisJY2lmc19yZWFkX2Zsb2NrKGZsb2NrLCAmdHlwZSwgJmxvY2ssICZ1bmxvY2ssICZ3YWl0X2ZsYWcpOworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CisJY2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl0Y29uID0gdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspOworCW5ldGZpZCA9IGNmaWxlLT5uZXRmaWQ7CisJY2lub2RlID0gQ0lGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCisJaWYgKCh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCSAgICAoQ0lGU19VTklYX0ZDTlRMX0NBUCAmIGxlNjRfdG9fY3B1KHRjb24tPmZzVW5peEluZm8uQ2FwYWJpbGl0eSkpICYmCisJICAgICgoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PUE9TSVhCUkwpID09IDApKQorCQlwb3NpeF9sY2sgPSB0cnVlOworCS8qCisJICogQkIgYWRkIGNvZGUgaGVyZSB0byBub3JtYWxpemUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gYWNjb3VudCBmb3IKKwkgKiBuZWdhdGl2ZSBsZW5ndGggd2hpY2ggd2UgY2FuIG5vdCBhY2NlcHQgb3ZlciB0aGUgd2lyZS4KKwkgKi8KKwlpZiAoSVNfR0VUTEsoY21kKSkgeworCQlyYyA9IGNpZnNfZ2V0bGsoZmlsZSwgZmxvY2ssIHR5cGUsIHdhaXRfZmxhZywgcG9zaXhfbGNrLCB4aWQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIWxvY2sgJiYgIXVubG9jaykgeworCQkvKgorCQkgKiBpZiBubyBsb2NrIG9yIHVubG9jayB0aGVuIG5vdGhpbmcgdG8gZG8gc2luY2Ugd2UgZG8gbm90CisJCSAqIGtub3cgd2hhdCBpdCBpcworCQkgKi8KKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmMgPSBjaWZzX3NldGxrKGZpbGUsIGZsb2NrLCB0eXBlLCB3YWl0X2ZsYWcsIHBvc2l4X2xjaywgbG9jaywgdW5sb2NrLAorCQkJeGlkKTsKIAlGcmVlWGlkKHhpZCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTcxNCw2ICsyMTk1LDcgQEAKIAlzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqcFNNQnI7CiAJc3RydWN0IGNpZnNfaW9fcGFybXMgaW9fcGFybXM7CiAJY2hhciAqcmVhZF9kYXRhOworCXVuc2lnbmVkIGludCByc2l6ZTsKIAlfX3UzMiBwaWQ7CiAKIAlpZiAoIW5yX3NlZ3MpCkBAIC0xNzI2LDYgKzIyMDgsOSBAQAogCXhpZCA9IEdldFhpZCgpOwogCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCisJLyogRklYTUU6IHNldCB1cCBoYW5kbGVycyBmb3IgbGFyZ2VyIHJlYWRzIGFuZC9vciBjb252ZXJ0IHRvIGFzeW5jICovCisJcnNpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNpZnNfc2ItPnJzaXplLCBDSUZTTWF4QnVmU2l6ZSk7CisKIAlvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJcFRjb24gPSB0bGlua190Y29uKG9wZW5fZmlsZS0+dGxpbmspOwogCkBAIC0xNzM4LDcgKzIyMjMsNyBAQAogCQljRllJKDEsICJhdHRlbXB0aW5nIHJlYWQgb24gd3JpdGUgb25seSBmaWxlIGluc3RhbmNlIik7CiAKIAlmb3IgKHRvdGFsX3JlYWQgPSAwOyB0b3RhbF9yZWFkIDwgbGVuOyB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQpIHsKLQkJY3VyX2xlbiA9IG1pbl90KGNvbnN0IHNpemVfdCwgbGVuIC0gdG90YWxfcmVhZCwgY2lmc19zYi0+cnNpemUpOworCQljdXJfbGVuID0gbWluX3QoY29uc3Qgc2l6ZV90LCBsZW4gLSB0b3RhbF9yZWFkLCByc2l6ZSk7CiAJCXJjID0gLUVBR0FJTjsKIAkJcmVhZF9kYXRhID0gTlVMTDsKIApAQCAtMTgzMCw2ICsyMzE1LDcgQEAKIAl1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCA9IDA7CiAJdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7CiAJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhZF9zaXplOworCXVuc2lnbmVkIGludCByc2l6ZTsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzX3Rjb24gKnBUY29uOwogCWludCB4aWQ7CkBAIC0xODQyLDYgKzIzMjgsOSBAQAogCXhpZCA9IEdldFhpZCgpOwogCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCisJLyogRklYTUU6IHNldCB1cCBoYW5kbGVycyBmb3IgbGFyZ2VyIHJlYWRzIGFuZC9vciBjb252ZXJ0IHRvIGFzeW5jICovCisJcnNpemUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNpZnNfc2ItPnJzaXplLCBDSUZTTWF4QnVmU2l6ZSk7CisKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKIAkJcmMgPSAtRUJBREY7CiAJCUZyZWVYaWQoeGlkKTsKQEAgLTE4NjEsMTQgKzIzNTAsMTQgQEAKIAlmb3IgKHRvdGFsX3JlYWQgPSAwLCBjdXJyZW50X29mZnNldCA9IHJlYWRfZGF0YTsKIAkgICAgIHJlYWRfc2l6ZSA+IHRvdGFsX3JlYWQ7CiAJICAgICB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQsIGN1cnJlbnRfb2Zmc2V0ICs9IGJ5dGVzX3JlYWQpIHsKLQkJY3VycmVudF9yZWFkX3NpemUgPSBtaW5fdChjb25zdCBpbnQsIHJlYWRfc2l6ZSAtIHRvdGFsX3JlYWQsCi0JCQkJCSAgY2lmc19zYi0+cnNpemUpOworCQljdXJyZW50X3JlYWRfc2l6ZSA9IG1pbl90KHVpbnQsIHJlYWRfc2l6ZSAtIHRvdGFsX3JlYWQsIHJzaXplKTsKKwogCQkvKiBGb3Igd2luZG93cyBtZSBhbmQgOXggd2UgZG8gbm90IHdhbnQgdG8gcmVxdWVzdCBtb3JlCiAJCXRoYW4gaXQgbmVnb3RpYXRlZCBzaW5jZSBpdCB3aWxsIHJlZnVzZSB0aGUgcmVhZCB0aGVuICovCiAJCWlmICgocFRjb24tPnNlcykgJiYKIAkJCSEocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0xBUkdFX0ZJTEVTKSkgewotCQkJY3VycmVudF9yZWFkX3NpemUgPSBtaW5fdChjb25zdCBpbnQsIGN1cnJlbnRfcmVhZF9zaXplLAotCQkJCQlwVGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIDEyOCk7CisJCQljdXJyZW50X3JlYWRfc2l6ZSA9IG1pbl90KHVpbnQsIGN1cnJlbnRfcmVhZF9zaXplLAorCQkJCQlDSUZTTWF4QnVmU2l6ZSk7CiAJCX0KIAkJcmMgPSAtRUFHQUlOOwogCQl3aGlsZSAocmMgPT0gLUVBR0FJTikgewpAQCAtMTk1Nyw4MiArMjQ0NiwyNCBAQAogCXJldHVybiByYzsKIH0KIAotCi1zdGF0aWMgdm9pZCBjaWZzX2NvcHlfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0Jc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIGludCBieXRlc19yZWFkLCBjaGFyICpkYXRhKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCWNoYXIgKnRhcmdldDsKLQotCXdoaWxlIChieXRlc19yZWFkID4gMCkgewotCQlpZiAobGlzdF9lbXB0eShwYWdlcykpCi0JCQlicmVhazsKLQotCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCi0JCWlmIChhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgcGFnZS0+aW5kZXgsCi0JCQkJICAgICAgR0ZQX0tFUk5FTCkpIHsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWNGWUkoMSwgIkFkZCBwYWdlIGNhY2hlIGZhaWxlZCIpOwotCQkJZGF0YSArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCQlieXRlc19yZWFkIC09IFBBR0VfQ0FDSEVfU0laRTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQotCQl0YXJnZXQgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0KLQkJaWYgKFBBR0VfQ0FDSEVfU0laRSA+IGJ5dGVzX3JlYWQpIHsKLQkJCW1lbWNweSh0YXJnZXQsIGRhdGEsIGJ5dGVzX3JlYWQpOwotCQkJLyogemVybyB0aGUgdGFpbCBlbmQgb2YgdGhpcyBwYXJ0aWFsIHBhZ2UgKi8KLQkJCW1lbXNldCh0YXJnZXQgKyBieXRlc19yZWFkLCAwLAotCQkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIGJ5dGVzX3JlYWQpOwotCQkJYnl0ZXNfcmVhZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkodGFyZ2V0LCBkYXRhLCBQQUdFX0NBQ0hFX1NJWkUpOwotCQkJYnl0ZXNfcmVhZCAtPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCX0KLQkJa3VubWFwX2F0b21pYyh0YXJnZXQsIEtNX1VTRVIwKTsKLQotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJZGF0YSArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0KLQkJLyogYWRkIHBhZ2UgdG8gRlMtQ2FjaGUgKi8KLQkJY2lmc19yZWFkcGFnZV90b19mc2NhY2hlKG1hcHBpbmctPmhvc3QsIHBhZ2UpOwotCX0KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgY2lmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgdW5zaWduZWQgbnVtX3BhZ2VzKQogewotCWludCByYyA9IC1FQUNDRVM7Ci0JaW50IHhpZDsKLQlsb2ZmX3Qgb2Zmc2V0OwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7Ci0Jc3RydWN0IGNpZnNfdGNvbiAqcFRjb247Ci0JdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOwotCXVuc2lnbmVkIGludCByZWFkX3NpemUsIGk7Ci0JY2hhciAqc21iX3JlYWRfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKnBTTUJyOwotCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKLQlzdHJ1Y3QgY2lmc19pb19wYXJtcyBpb19wYXJtczsKLQlpbnQgYnVmX3R5cGUgPSBDSUZTX05PX0JVRkZFUjsKLQlfX3UzMiBwaWQ7CisJaW50IHJjOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wbGlzdDsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CisJdW5zaWduZWQgaW50IHJzaXplID0gY2lmc19zYi0+cnNpemU7CisJcGlkX3QgcGlkOwogCi0JeGlkID0gR2V0WGlkKCk7Ci0JaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7Ci0JCXJjID0gLUVCQURGOwotCQlGcmVlWGlkKHhpZCk7Ci0JCXJldHVybiByYzsKLQl9Ci0Jb3Blbl9maWxlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwotCXBUY29uID0gdGxpbmtfdGNvbihvcGVuX2ZpbGUtPnRsaW5rKTsKKwkvKgorCSAqIEdpdmUgdXAgaW1tZWRpYXRlbHkgaWYgcnNpemUgaXMgdG9vIHNtYWxsIHRvIHJlYWQgYW4gZW50aXJlIHBhZ2UuCisJICogVGhlIFZGUyB3aWxsIGZhbGwgYmFjayB0byByZWFkcGFnZS4gV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMKKwkgKiBwb2ludCBob3dldmVyIHNpbmNlIHdlIHNldCByYV9wYWdlcyB0byAwIHdoZW4gdGhlIHJzaXplIGlzIHNtYWxsZXIKKwkgKiB0aGFuIGEgY2FjaGUgcGFnZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocnNpemUgPCBQQUdFX0NBQ0hFX1NJWkUpKQorCQlyZXR1cm4gMDsKIAogCS8qCiAJICogUmVhZHMgYXMgbWFueSBwYWdlcyBhcyBwb3NzaWJsZSBmcm9tIGZzY2FjaGUuIFJldHVybnMgLUVOT0JVRlMKQEAgLTIwNDEsMTI1ICsyNDcyLDEyNyBAQAogCXJjID0gY2lmc19yZWFkcGFnZXNfZnJvbV9mc2NhY2hlKG1hcHBpbmctPmhvc3QsIG1hcHBpbmcsIHBhZ2VfbGlzdCwKIAkJCQkJICZudW1fcGFnZXMpOwogCWlmIChyYyA9PSAwKQotCQlnb3RvIHJlYWRfY29tcGxldGU7CisJCXJldHVybiByYzsKIAotCWNGWUkoREJHMiwgInJwYWdlczogbnVtIHBhZ2VzICVkIiwgbnVtX3BhZ2VzKTsKIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1JXUElERk9SV0FSRCkKIAkJcGlkID0gb3Blbl9maWxlLT5waWQ7CiAJZWxzZQogCQlwaWQgPSBjdXJyZW50LT50Z2lkOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKSB7Ci0JCXVuc2lnbmVkIGNvbnRpZ19wYWdlczsKLQkJc3RydWN0IHBhZ2UgKnRtcF9wYWdlOwotCQl1bnNpZ25lZCBsb25nIGV4cGVjdGVkX2luZGV4OworCXJjID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmdG1wbGlzdCk7CiAKLQkJaWYgKGxpc3RfZW1wdHkocGFnZV9saXN0KSkKLQkJCWJyZWFrOworCWNGWUkoMSwgIiVzOiBmaWxlPSVwIG1hcHBpbmc9JXAgbnVtX3BhZ2VzPSV1IiwgX19mdW5jX18sIGZpbGUsCisJCW1hcHBpbmcsIG51bV9wYWdlcyk7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggdGhlIHBhZ2UgYXQgZW5kIG9mIGxpc3QgYW5kIG1vdmUgaXQgdG8gcHJpdmF0ZQorCSAqIGxpc3QuIERvIHRoZSBzYW1lIHdpdGggYW55IGZvbGxvd2luZyBwYWdlcyB1bnRpbCB3ZSBoaXQKKwkgKiB0aGUgcnNpemUgbGltaXQsIGhpdCBhbiBpbmRleCBkaXNjb250aW51aXR5LCBvciBydW4gb3V0IG9mCisJICogcGFnZXMuIElzc3VlIHRoZSBhc3luYyByZWFkIGFuZCB0aGVuIHN0YXJ0IHRoZSBsb29wIGFnYWluCisJICogdW50aWwgdGhlIGxpc3QgaXMgZW1wdHkuCisJICoKKwkgKiBOb3RlIHRoYXQgbGlzdCBvcmRlciBpcyBpbXBvcnRhbnQuIFRoZSBwYWdlX2xpc3QgaXMgaW4KKwkgKiB0aGUgb3JkZXIgb2YgZGVjbGluaW5nIGluZGV4ZXMuIFdoZW4gd2UgcHV0IHRoZSBwYWdlcyBpbgorCSAqIHRoZSByZGF0YS0+cGFnZXMsIHRoZW4gd2Ugd2FudCB0aGVtIGluIGluY3JlYXNpbmcgb3JkZXIuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfaW5kZXg7CisJCXVuc2lnbmVkIGludCBucl9wYWdlcyA9IDE7CisJCWxvZmZfdCBvZmZzZXQ7CisJCXN0cnVjdCBwYWdlICpwYWdlLCAqdHBhZ2U7CisJCXN0cnVjdCBjaWZzX3JlYWRkYXRhICpyZGF0YTsKIAogCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOwotCQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKLQkJLyogY291bnQgYWRqYWNlbnQgcGFnZXMgdGhhdCB3ZSB3aWxsIHJlYWQgaW50byAqLwotCQljb250aWdfcGFnZXMgPSAwOwotCQlleHBlY3RlZF9pbmRleCA9Ci0JCQlsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSktPmluZGV4OwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodG1wX3BhZ2UsIHBhZ2VfbGlzdCwgbHJ1KSB7Ci0JCQlpZiAodG1wX3BhZ2UtPmluZGV4ID09IGV4cGVjdGVkX2luZGV4KSB7Ci0JCQkJY29udGlnX3BhZ2VzKys7Ci0JCQkJZXhwZWN0ZWRfaW5kZXgrKzsKLQkJCX0gZWxzZQotCQkJCWJyZWFrOworCQkvKgorCQkgKiBMb2NrIHRoZSBwYWdlIGFuZCBwdXQgaXQgaW4gdGhlIGNhY2hlLiBTaW5jZSBubyBvbmUgZWxzZQorCQkgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhpcyBwYWdlLCB3ZSdyZSBzYWZlIHRvIHNpbXBseSBzZXQKKwkJICogUEdfbG9ja2VkIHdpdGhvdXQgY2hlY2tpbmcgaXQgZmlyc3QuCisJCSAqLworCQlfX3NldF9wYWdlX2xvY2tlZChwYWdlKTsKKwkJcmMgPSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQocGFnZSwgbWFwcGluZywKKwkJCQkJICAgICAgcGFnZS0+aW5kZXgsIEdGUF9LRVJORUwpOworCisJCS8qIGdpdmUgdXAgaWYgd2UgY2FuJ3Qgc3RpY2sgaXQgaW4gdGhlIGNhY2hlICovCisJCWlmIChyYykgeworCQkJX19jbGVhcl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChjb250aWdfcGFnZXMgKyBpID4gIG51bV9wYWdlcykKLQkJCWNvbnRpZ19wYWdlcyA9IG51bV9wYWdlcyAtIGk7CiAKLQkJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMKLQkJICAgcmVhZCBhaGVhZCAqLworCQkvKiBtb3ZlIGZpcnN0IHBhZ2UgdG8gdGhlIHRtcGxpc3QgKi8KKwkJb2Zmc2V0ID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQlsaXN0X21vdmVfdGFpbCgmcGFnZS0+bHJ1LCAmdG1wbGlzdCk7CiAKLQkJcmVhZF9zaXplID0gY29udGlnX3BhZ2VzICogUEFHRV9DQUNIRV9TSVpFOwotCQkvKiBSZWFkIHNpemUgbmVlZHMgdG8gYmUgaW4gbXVsdGlwbGVzIG9mIG9uZSBwYWdlICovCi0JCXJlYWRfc2l6ZSA9IG1pbl90KGNvbnN0IHVuc2lnbmVkIGludCwgcmVhZF9zaXplLAotCQkJCSAgY2lmc19zYi0+cnNpemUgJiBQQUdFX0NBQ0hFX01BU0spOwotCQljRllJKERCRzIsICJycGFnZXM6IHJlYWQgc2l6ZSAweCV4ICBjb250aWd1b3VzIHBhZ2VzICVkIiwKLQkJCQlyZWFkX3NpemUsIGNvbnRpZ19wYWdlcyk7Ci0JCXJjID0gLUVBR0FJTjsKLQkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJLyogbm93IHRyeSBhbmQgYWRkIG1vcmUgcGFnZXMgb250byB0aGUgcmVxdWVzdCAqLworCQlleHBlY3RlZF9pbmRleCA9IHBhZ2UtPmluZGV4ICsgMTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocGFnZSwgdHBhZ2UsIHBhZ2VfbGlzdCwgbHJ1KSB7CisJCQkvKiBkaXNjb250aW51aXR5ID8gKi8KKwkJCWlmIChwYWdlLT5pbmRleCAhPSBleHBlY3RlZF9pbmRleCkKKwkJCQlicmVhazsKKworCQkJLyogd291bGQgdGhpcyBwYWdlIHB1c2ggdGhlIHJlYWQgb3ZlciB0aGUgcnNpemU/ICovCisJCQlpZiAoYnl0ZXMgKyBQQUdFX0NBQ0hFX1NJWkUgPiByc2l6ZSkKKwkJCQlicmVhazsKKworCQkJX19zZXRfcGFnZV9sb2NrZWQocGFnZSk7CisJCQlpZiAoYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHBhZ2UsIG1hcHBpbmcsCisJCQkJCQlwYWdlLT5pbmRleCwgR0ZQX0tFUk5FTCkpIHsKKwkJCQlfX2NsZWFyX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGlzdF9tb3ZlX3RhaWwoJnBhZ2UtPmxydSwgJnRtcGxpc3QpOworCQkJYnl0ZXMgKz0gUEFHRV9DQUNIRV9TSVpFOworCQkJZXhwZWN0ZWRfaW5kZXgrKzsKKwkJCW5yX3BhZ2VzKys7CisJCX0KKworCQlyZGF0YSA9IGNpZnNfcmVhZGRhdGFfYWxsb2MobnJfcGFnZXMpOworCQlpZiAoIXJkYXRhKSB7CisJCQkvKiBiZXN0IHRvIGdpdmUgdXAgaWYgd2UncmUgb3V0IG9mIG1lbSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIHRwYWdlLCAmdG1wbGlzdCwgbHJ1KSB7CisJCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJCXJjID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKKwkJY2lmc0ZpbGVJbmZvX2dldChvcGVuX2ZpbGUpOworCQlzcGluX3VubG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7CisJCXJkYXRhLT5jZmlsZSA9IG9wZW5fZmlsZTsKKwkJcmRhdGEtPm1hcHBpbmcgPSBtYXBwaW5nOworCQlyZGF0YS0+b2Zmc2V0ID0gb2Zmc2V0OworCQlyZGF0YS0+Ynl0ZXMgPSBieXRlczsKKwkJcmRhdGEtPnBpZCA9IHBpZDsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmdG1wbGlzdCwgJnJkYXRhLT5wYWdlcyk7CisKKwkJZG8gewogCQkJaWYgKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgewogCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShvcGVuX2ZpbGUsIHRydWUpOwogCQkJCWlmIChyYyAhPSAwKQotCQkJCQlicmVhazsKKwkJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpb19wYXJtcy5uZXRmaWQgPSBvcGVuX2ZpbGUtPm5ldGZpZDsKLQkJCWlvX3Bhcm1zLnBpZCA9IHBpZDsKLQkJCWlvX3Bhcm1zLnRjb24gPSBwVGNvbjsKLQkJCWlvX3Bhcm1zLm9mZnNldCA9IG9mZnNldDsKLQkJCWlvX3Bhcm1zLmxlbmd0aCA9IHJlYWRfc2l6ZTsKLQkJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCAmaW9fcGFybXMsICZieXRlc19yZWFkLAotCQkJCQkgJnNtYl9yZWFkX2RhdGEsICZidWZfdHlwZSk7Ci0JCQkvKiBCQiBtb3JlIFJDIGNoZWNrcyA/ICovCi0JCQlpZiAocmMgPT0gLUVBR0FJTikgewotCQkJCWlmIChzbWJfcmVhZF9kYXRhKSB7Ci0JCQkJCWlmIChidWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKLQkJCQkJCWNpZnNfc21hbGxfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7Ci0JCQkJCWVsc2UgaWYgKGJ1Zl90eXBlID09IENJRlNfTEFSR0VfQlVGRkVSKQotCQkJCQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7Ci0JCQkJfQorCQkJcmMgPSBjaWZzX2FzeW5jX3JlYWR2KHJkYXRhKTsKKwkJfSB3aGlsZSAocmMgPT0gLUVBR0FJTik7CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0cGFnZSwgJnJkYXRhLT5wYWdlcywKKwkJCQkJCSBscnUpIHsKKwkJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwkJCQlscnVfY2FjaGVfYWRkX2ZpbGUocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJfQotCQl9Ci0JCWlmICgocmMgPCAwKSB8fCAoc21iX3JlYWRfZGF0YSA9PSBOVUxMKSkgewotCQkJY0ZZSSgxLCAiUmVhZCBlcnJvciBpbiByZWFkcGFnZXM6ICVkIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKLQkJCXRhc2tfaW9fYWNjb3VudF9yZWFkKGJ5dGVzX3JlYWQpOwotCQkJcFNNQnIgPSAoc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKilzbWJfcmVhZF9kYXRhOwotCQkJY2lmc19jb3B5X2NhY2hlX3BhZ2VzKG1hcHBpbmcsIHBhZ2VfbGlzdCwgYnl0ZXNfcmVhZCwKLQkJCQlzbWJfcmVhZF9kYXRhICsgNCAvKiBSRkMxMDAxIGhkciAqLyArCi0JCQkJbGUxNl90b19jcHUocFNNQnItPkRhdGFPZmZzZXQpKTsKLQotCQkJaSArPSAgYnl0ZXNfcmVhZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkJY2lmc19zdGF0c19ieXRlc19yZWFkKHBUY29uLCBieXRlc19yZWFkKTsKLQkJCWlmICgoYnl0ZXNfcmVhZCAmIFBBR0VfQ0FDSEVfTUFTSykgIT0gYnl0ZXNfcmVhZCkgewotCQkJCWkrKzsgLyogYWNjb3VudCBmb3IgcGFydGlhbCBwYWdlICovCi0KLQkJCQkvKiBzZXJ2ZXIgY29weSBvZiBmaWxlIGNhbiBoYXZlIHNtYWxsZXIgc2l6ZQotCQkJCSAgIHRoYW4gY2xpZW50ICovCi0JCQkJLyogQkIgZG8gd2UgbmVlZCB0byB2ZXJpZnkgdGhpcyBjb21tb24gY2FzZSA/Ci0JCQkJICAgdGhpcyBjYXNlIGlzIG9rIC0gaWYgd2UgYXJlIGF0IHNlcnZlciBFT0YKLQkJCQkgICB3ZSB3aWxsIGhpdCBpdCBvbiBuZXh0IHJlYWQgKi8KLQotCQkJCS8qIGJyZWFrOyAqLwotCQkJfQotCQl9IGVsc2UgewotCQkJY0ZZSSgxLCAiTm8gYnl0ZXMgcmVhZCAoJWQpIGF0IG9mZnNldCAlbGxkIC4gIgotCQkJCSJDbGVhbmluZyByZW1haW5pbmcgcGFnZXMgZnJvbSByZWFkYWhlYWQgbGlzdCIsCi0JCQkJYnl0ZXNfcmVhZCwgb2Zmc2V0KTsKLQkJCS8qIEJCIHR1cm4gb2ZmIGNhY2hpbmcgYW5kIGRvIG5ldyBsb29rdXAgb24KLQkJCSAgIGZpbGUgc2l6ZSBhdCBzZXJ2ZXI/ICovCisJCQljaWZzX3JlYWRkYXRhX2ZyZWUocmRhdGEpOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJCWlmIChidWZfdHlwZSA9PSBDSUZTX1NNQUxMX0JVRkZFUikKLQkJCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOwotCQkJZWxzZSBpZiAoYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCi0JCQkJY2lmc19idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOwotCQl9Ci0JCWJ5dGVzX3JlYWQgPSAwOwogCX0KIAotLyogbmVlZCB0byBmcmVlIHNtYl9yZWFkX2RhdGEgYnVmIGJlZm9yZSBleGl0ICovCi0JaWYgKHNtYl9yZWFkX2RhdGEpIHsKLQkJaWYgKGJ1Zl90eXBlID09IENJRlNfU01BTExfQlVGRkVSKQotCQkJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWJfcmVhZF9kYXRhKTsKLQkJZWxzZSBpZiAoYnVmX3R5cGUgPT0gQ0lGU19MQVJHRV9CVUZGRVIpCi0JCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOwotCQlzbWJfcmVhZF9kYXRhID0gTlVMTDsKLQl9Ci0KLXJlYWRfY29tcGxldGU6Ci0JRnJlZVhpZCh4aWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjQwOCw2ICsyODQxLDEwIEBACiAJCWNGWUkoMSwgIk9wbG9jayBmbHVzaCBpbm9kZSAlcCByYyAlZCIsIGlub2RlLCByYyk7CiAJfQogCisJcmMgPSBjaWZzX3B1c2hfbG9ja3MoY2ZpbGUpOworCWlmIChyYykKKwkJY0VSUk9SKDEsICJQdXNoIGxvY2tzIHJjID0gJWQiLCByYyk7CisKIAkvKgogCSAqIHJlbGVhc2luZyBzdGFsZSBvcGxvY2sgYWZ0ZXIgcmVjZW50IHJlY29ubmVjdCBvZiBzbWIgc2Vzc2lvbiB1c2luZwogCSAqIGEgbm93IGluY29ycmVjdCBmaWxlIGhhbmRsZSBpcyBub3QgYSBkYXRhIGludGVncml0eSBpc3N1ZSBidXQgZG8KQEAgLTI0MTUsOCArMjg1Miw5IEBACiAJICogZGlzY29ubmVjdGVkIHNpbmNlIG9wbG9jayBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZSBzZXJ2ZXIKIAkgKi8KIAlpZiAoIWNmaWxlLT5vcGxvY2tfYnJlYWtfY2FuY2VsbGVkKSB7Ci0JCXJjID0gQ0lGU1NNQkxvY2soMCwgdGxpbmtfdGNvbihjZmlsZS0+dGxpbmspLCBjZmlsZS0+bmV0ZmlkLCAwLAotCQkJCSAwLCAwLCAwLCBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UsIGZhbHNlLAorCQlyYyA9IENJRlNTTUJMb2NrKDAsIHRsaW5rX3Rjb24oY2ZpbGUtPnRsaW5rKSwgY2ZpbGUtPm5ldGZpZCwKKwkJCQkgY3VycmVudC0+dGdpZCwgMCwgMCwgMCwgMCwKKwkJCQkgTE9DS0lOR19BTkRYX09QTE9DS19SRUxFQVNFLCBmYWxzZSwKIAkJCQkgY2lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPyAxIDogMCk7CiAJCWNGWUkoMSwgIk9wbG9jayByZWxlYXNlIHJjID0gJWQiLCByYyk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IGE3YjJkY2QuLmU4NTFkNWIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWlub2RlLT5pX210aW1lID0gZmF0dHItPmNmX210aW1lOwogCWlub2RlLT5pX2N0aW1lID0gZmF0dHItPmNmX2N0aW1lOwogCWlub2RlLT5pX3JkZXYgPSBmYXR0ci0+Y2ZfcmRldjsKLQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5jZl9ubGluazsKKwlzZXRfbmxpbmsoaW5vZGUsIGZhdHRyLT5jZl9ubGluayk7CiAJaW5vZGUtPmlfdWlkID0gZmF0dHItPmNmX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBmYXR0ci0+Y2ZfZ2lkOwogCkBAIC01NjIsNyArNTYyLDE2IEBACiAKIAl4aWQgPSBHZXRYaWQoKTsKIAlyYyA9IENJRlNTTUJRRmlsZUluZm8oeGlkLCB0Y29uLCBjZmlsZS0+bmV0ZmlkLCAmZmluZF9kYXRhKTsKLQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgfHwgcmMgPT0gLUVJTlZBTCkgeworCXN3aXRjaCAocmMpIHsKKwljYXNlIDA6CisJCWNpZnNfYWxsX2luZm9fdG9fZmF0dHIoJmZhdHRyLCAmZmluZF9kYXRhLCBjaWZzX3NiLCBmYWxzZSk7CisJCWJyZWFrOworCWNhc2UgLUVSRU1PVEU6CisJCWNpZnNfY3JlYXRlX2Rmc19mYXR0cigmZmF0dHIsIGlub2RlLT5pX3NiKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIC1FT1BOT1RTVVBQOgorCWNhc2UgLUVJTlZBTDoKIAkJLyoKIAkJICogRklYTUU6IGxlZ2FjeSBzZXJ2ZXIgLS0gZmFsbCBiYWNrIHRvIHBhdGgtYmFzZWQgY2FsbD8KIAkJICogZm9yIG5vdywganVzdCBza2lwIHJldmFsaWRhdGluZyBhbmQgbWFyayBpbm9kZSBmb3IKQEAgLTU3MCwxOCArNTc5LDE0IEBACiAJCSAqLwogCQlyYyA9IDA7CiAJCUNJRlNfSShpbm9kZSktPnRpbWUgPSAwOworCWRlZmF1bHQ6CiAJCWdvdG8gY2dmaV9leGl0OwotCX0gZWxzZSBpZiAocmMgPT0gLUVSRU1PVEUpIHsKLQkJY2lmc19jcmVhdGVfZGZzX2ZhdHRyKCZmYXR0ciwgaW5vZGUtPmlfc2IpOwotCQlyYyA9IDA7Ci0JfSBlbHNlIGlmIChyYykKLQkJZ290byBjZ2ZpX2V4aXQ7CisJfQogCiAJLyoKIAkgKiBkb24ndCBib3RoZXIgd2l0aCBTRlUganVuayBoZXJlIC0tIGp1c3QgbWFyayBpbm9kZSBhcyBuZWVkaW5nCiAJICogcmV2YWxpZGF0aW9uLgogCSAqLwotCWNpZnNfYWxsX2luZm9fdG9fZmF0dHIoJmZhdHRyLCAmZmluZF9kYXRhLCBjaWZzX3NiLCBmYWxzZSk7CiAJZmF0dHIuY2ZfdW5pcXVlaWQgPSBDSUZTX0koaW5vZGUpLT51bmlxdWVpZDsKIAlmYXR0ci5jZl9mbGFncyB8PSBDSUZTX0ZBVFRSX05FRURfUkVWQUw7CiAJY2lmc19mYXR0cl90b19pbm9kZShpbm9kZSwgJmZhdHRyKTsKQEAgLTkwMCw3ICs5MDUsNyBAQAogCWlmIChyYyAmJiB0Y29uLT5pcGMpIHsKIAkJY0ZZSSgxLCAiaXBjIGNvbm5lY3Rpb24gLSBmYWtlIHJlYWQgaW5vZGUiKTsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOwotCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCXNldF9ubGluayhpbm9kZSwgMik7CiAJCWlub2RlLT5pX29wID0gJmNpZnNfaXBjX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKQEAgLTEzNjIsNyArMTM2Nyw3IEBACiAJCSAvKiBzZXR0aW5nIG5saW5rIG5vdCBuZWNlc3NhcnkgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHdlCiAJCSAgKiBmYWlsZWQgdG8gZ2V0IGl0IGZyb20gdGhlIHNlcnZlciBvciB3YXMgc2V0IGJvZ3VzICovCiAJCWlmICgoZGlyZW50cnktPmRfaW5vZGUpICYmIChkaXJlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA8IDIpKQotCQkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMjsKKwkJCXNldF9ubGluayhkaXJlbnRyeS0+ZF9pbm9kZSwgMik7CiAKIAkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCQkvKiBtdXN0IHR1cm4gb24gc2V0Z2lkIGJpdCBpZiBwYXJlbnQgZGlyIGhhcyBpdCAqLwpAQCAtMjA5Niw2ICsyMTAxLDggQEAKIGNpZnNfc2V0YXR0cl9ub3VuaXgoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cnMpCiB7CiAJaW50IHhpZDsKKwl1aWRfdCB1aWQgPSBOT19DSEFOR0VfMzI7CisJZ2lkX3QgZ2lkID0gTk9fQ0hBTkdFXzMyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkaXJlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSA9IENJRlNfSShpbm9kZSk7CkBAIC0yMTQ2LDEzICsyMTUzLDI1IEBACiAJCQlnb3RvIGNpZnNfc2V0YXR0cl9leGl0OwogCX0KIAotCS8qCi0JICogV2l0aG91dCB1bml4IGV4dGVuc2lvbnMgd2UgY2FuJ3Qgc2VuZCBvd25lcnNoaXAgY2hhbmdlcyB0byB0aGUKLQkgKiBzZXJ2ZXIsIHNvIHNpbGVudGx5IGlnbm9yZSB0aGVtLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cKLQkgKiBsb2NhbCBET1MvV2luZG93cyBmaWxlc3lzdGVtcyBiZWhhdmUgKFZGQVQsIE5URlMsIGV0YykuIFdpdGgKLQkgKiBDSUZTQUNMIHN1cHBvcnQgKyBwcm9wZXIgV2luZG93cyB0byBVbml4IGlkbWFwcGluZywgd2UgbWF5IGJlCi0JICogYWJsZSB0byBzdXBwb3J0IHRoaXMgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCXVpZCA9IGF0dHJzLT5pYV91aWQ7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCWdpZCA9IGF0dHJzLT5pYV9naWQ7CisKKyNpZmRlZiBDT05GSUdfQ0lGU19BQ0wKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7CisJCWlmICh1aWQgIT0gTk9fQ0hBTkdFXzMyIHx8IGdpZCAhPSBOT19DSEFOR0VfMzIpIHsKKwkJCXJjID0gaWRfbW9kZV90b19jaWZzX2FjbChpbm9kZSwgZnVsbF9wYXRoLCBOT19DSEFOR0VfNjQsCisJCQkJCQkJdWlkLCBnaWQpOworCQkJaWYgKHJjKSB7CisJCQkJY0ZZSSgxLCAiJXM6IFNldHRpbmcgaWQgZmFpbGVkIHdpdGggZXJyb3I6ICVkIiwKKwkJCQkJX19mdW5jX18sIHJjKTsKKwkJCQlnb3RvIGNpZnNfc2V0YXR0cl9leGl0OworCQkJfQorCQl9CisJfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX0NJRlNfQUNMICovCiAJaWYgKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpKQogCQlhdHRycy0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRCB8IEFUVFJfR0lEKTsKIApAQCAtMjE2MSwxNSArMjE4MCwxMiBAQAogCQlhdHRycy0+aWFfdmFsaWQgJj0gfkFUVFJfTU9ERTsKIAogCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKLQkJY0ZZSSgxLCAiTW9kZSBjaGFuZ2VkIHRvIDAlbyIsIGF0dHJzLT5pYV9tb2RlKTsKIAkJbW9kZSA9IGF0dHJzLT5pYV9tb2RlOwotCX0KLQotCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKIAkJcmMgPSAwOwogI2lmZGVmIENPTkZJR19DSUZTX0FDTAogCQlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7Ci0JCQlyYyA9IG1vZGVfdG9fY2lmc19hY2woaW5vZGUsIGZ1bGxfcGF0aCwgbW9kZSk7CisJCQlyYyA9IGlkX21vZGVfdG9fY2lmc19hY2woaW5vZGUsIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJCU5PX0NIQU5HRV8zMiwgTk9fQ0hBTkdFXzMyKTsKIAkJCWlmIChyYykgewogCQkJCWNGWUkoMSwgIiVzOiBTZXR0aW5nIEFDTCBmYWlsZWQgd2l0aCBlcnJvcjogJWQiLAogCQkJCQlfX2Z1bmNfXywgcmMpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9saW5rLmMgYi9mcy9jaWZzL2xpbmsuYwppbmRleCBkYjNmMThjLi42YjBlMDY0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2xpbmsuYworKysgYi9mcy9jaWZzL2xpbmsuYwpAQCAtMTgzLDE0ICsxODMsMjAgQEAKIHN0YXRpYyBpbnQKIENJRlNDcmVhdGVNRlN5bUxpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwKIAkJICAgIGNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsIGludCByZW1hcCkKKwkJICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CiAJaW50IHJjOwogCWludCBvcGxvY2sgPSAwOworCWludCByZW1hcDsKKwlpbnQgY3JlYXRlX29wdGlvbnMgPSBDUkVBVEVfTk9UX0RJUjsKIAlfX3UxNiBuZXRmaWQgPSAwOwogCXU4ICpidWY7CiAJdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW4gPSAwOwogCXN0cnVjdCBjaWZzX2lvX3Bhcm1zIGlvX3Bhcm1zOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKKworCW5sc19jb2RlcGFnZSA9IGNpZnNfc2ItPmxvY2FsX25sczsKKwlyZW1hcCA9IGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFI7CiAKIAlidWYgPSBrbWFsbG9jKENJRlNfTUZfU1lNTElOS19GSUxFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQpAQCAtMjAyLDggKzIwOCwxMSBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJaWYgKGJhY2t1cF9jcmVkKGNpZnNfc2IpKQorCQljcmVhdGVfb3B0aW9ucyB8PSBDUkVBVEVfT1BFTl9CQUNLVVBfSU5URU5UOworCiAJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZyb21OYW1lLCBGSUxFX0NSRUFURSwgR0VORVJJQ19XUklURSwKLQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKKwkJCSBjcmVhdGVfb3B0aW9ucywgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKIAkJCSBubHNfY29kZXBhZ2UsIHJlbWFwKTsKIAlpZiAocmMgIT0gMCkgewogCQlrZnJlZShidWYpOwpAQCAtNDI0LDcgKzQzMyw3IEBACiAJaWYgKG9sZF9maWxlLT5kX2lub2RlKSB7CiAJCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7CiAJCWlmIChyYyA9PSAwKSB7Ci0JCQlvbGRfZmlsZS0+ZF9pbm9kZS0+aV9ubGluaysrOworCQkJaW5jX25saW5rKG9sZF9maWxlLT5kX2lub2RlKTsKIC8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgY29udGluZ2VudCBvbiBzdXBlcmJsb2NrIGZsYWcgTk9BVElNRT8gKi8KIC8qCQkJb2xkX2ZpbGUtPmRfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ki8KIAkJCS8qIHBhcmVudCBkaXIgdGltZXN0YW1wcyB3aWxsIHVwZGF0ZSBmcm9tIHNydgpAQCAtNTU5LDkgKzU2OCw3IEBACiAJLyogQkIgd2hhdCBpZiBERlMgYW5kIHRoaXMgdm9sdW1lIGlzIG9uIGRpZmZlcmVudCBzaGFyZT8gQkIgKi8KIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX01GX1NZTUxJTktTKQogCQlyYyA9IENJRlNDcmVhdGVNRlN5bUxpbmsoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBzeW1uYW1lLAotCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQkgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJCQljaWZzX3NiKTsKIAllbHNlIGlmIChwVGNvbi0+dW5peF9leHQpCiAJCXJjID0gQ0lGU1VuaXhDcmVhdGVTeW1MaW5rKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgc3ltbmFtZSwKIAkJCQkJICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWlzYy5jIGIvZnMvY2lmcy9taXNjLmMKaW5kZXggN2MxNjkzMy4uNzAzZWY1YyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9taXNjLmMKKysrIGIvZnMvY2lmcy9taXNjLmMKQEAgLTQyMCwxOSArNDIwLDIyIEBACiB9CiAKIGludAotY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQorY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCkKIHsKLQlfX3UzMiBsZW4gPSBiZTMyX3RvX2NwdShzbWItPnNtYl9idWZfbGVuZ3RoKTsKKwlfX3UzMiByZmNsZW4gPSBiZTMyX3RvX2NwdShzbWItPnNtYl9idWZfbGVuZ3RoKTsKIAlfX3UzMiBjbGNfbGVuOyAgLyogY2FsY3VsYXRlZCBsZW5ndGggKi8KLQljRllJKDAsICJjaGVja1NNQiBMZW5ndGg6IDB4JXgsIHNtYl9idWZfbGVuZ3RoOiAweCV4IiwgbGVuZ3RoLCBsZW4pOworCWNGWUkoMCwgImNoZWNrU01CIExlbmd0aDogMHgleCwgc21iX2J1Zl9sZW5ndGg6IDB4JXgiLAorCQl0b3RhbF9yZWFkLCByZmNsZW4pOwogCi0JaWYgKGxlbmd0aCA8IDIgKyBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKSB7Ci0JCWlmICgobGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxKQorCS8qIGlzIHRoaXMgZnJhbWUgdG9vIHNtYWxsIHRvIGV2ZW4gZ2V0IHRvIGEgQkNDPyAqLworCWlmICh0b3RhbF9yZWFkIDwgMiArIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpIHsKKwkJaWYgKCh0b3RhbF9yZWFkID49IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxKQogCQkJICAgICYmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgIT0gMCkpIHsKKwkJCS8qIGl0J3MgYW4gZXJyb3IgcmV0dXJuICovCiAJCQlzbWItPldvcmRDb3VudCA9IDA7CiAJCQkvKiBzb21lIGVycm9yIGNhc2VzIGRvIG5vdCByZXR1cm4gd2N0IGFuZCBiY2MgKi8KIAkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKChsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDEpICYmCisJCX0gZWxzZSBpZiAoKHRvdGFsX3JlYWQgPT0gc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDEpICYmCiAJCQkJKHNtYi0+V29yZENvdW50ID09IDApKSB7CiAJCQljaGFyICp0bXAgPSAoY2hhciAqKXNtYjsKIAkJCS8qIE5lZWQgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdHdvIHNlcnZlcnMgaGVyZSAqLwpAQCAtNDUyLDM5ICs0NTUsMzUgQEAKIAkJfSBlbHNlIHsKIAkJCWNFUlJPUigxLCAiTGVuZ3RoIGxlc3MgdGhhbiBzbWIgaGVhZGVyIHNpemUiKTsKIAkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGxlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB7Ci0JCWNFUlJPUigxLCAic21iIGxlbmd0aCBncmVhdGVyIHRoYW4gTWF4QnVmU2l6ZSwgbWlkPSVkIiwKLQkJCQkgICBzbWItPk1pZCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwkvKiBvdGhlcndpc2UsIHRoZXJlIGlzIGVub3VnaCB0byBnZXQgdG8gdGhlIEJDQyAqLwogCWlmIChjaGVja19zbWJfaGRyKHNtYiwgbWlkKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRUlPOwogCWNsY19sZW4gPSBzbWJDYWxjU2l6ZShzbWIpOwogCi0JaWYgKDQgKyBsZW4gIT0gbGVuZ3RoKSB7CisJaWYgKDQgKyByZmNsZW4gIT0gdG90YWxfcmVhZCkgewogCQljRVJST1IoMSwgIkxlbmd0aCByZWFkIGRvZXMgbm90IG1hdGNoIFJGQzEwMDEgbGVuZ3RoICVkIiwKLQkJCSAgIGxlbik7Ci0JCXJldHVybiAxOworCQkJCXJmY2xlbik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICg0ICsgbGVuICE9IGNsY19sZW4pIHsKKwlpZiAoNCArIHJmY2xlbiAhPSBjbGNfbGVuKSB7CiAJCS8qIGNoZWNrIGlmIGJjYyB3cmFwcGVkIGFyb3VuZCBmb3IgbGFyZ2UgcmVhZCByZXNwb25zZXMgKi8KLQkJaWYgKChsZW4gPiA2NCAqIDEwMjQpICYmIChsZW4gPiBjbGNfbGVuKSkgeworCQlpZiAoKHJmY2xlbiA+IDY0ICogMTAyNCkgJiYgKHJmY2xlbiA+IGNsY19sZW4pKSB7CiAJCQkvKiBjaGVjayBpZiBsZW5ndGhzIG1hdGNoIG1vZCA2NEsgKi8KLQkJCWlmICgoKDQgKyBsZW4pICYgMHhGRkZGKSA9PSAoY2xjX2xlbiAmIDB4RkZGRikpCisJCQlpZiAoKCg0ICsgcmZjbGVuKSAmIDB4RkZGRikgPT0gKGNsY19sZW4gJiAweEZGRkYpKQogCQkJCXJldHVybiAwOyAvKiBiY2Mgd3JhcHBlZCAqLwogCQl9CiAJCWNGWUkoMSwgIkNhbGN1bGF0ZWQgc2l6ZSAldSB2cyBsZW5ndGggJXUgbWlzbWF0Y2ggZm9yIG1pZD0ldSIsCi0JCQkJY2xjX2xlbiwgNCArIGxlbiwgc21iLT5NaWQpOworCQkJCWNsY19sZW4sIDQgKyByZmNsZW4sIHNtYi0+TWlkKTsKIAotCQlpZiAoNCArIGxlbiA8IGNsY19sZW4pIHsKKwkJaWYgKDQgKyByZmNsZW4gPCBjbGNfbGVuKSB7CiAJCQljRVJST1IoMSwgIlJGQzEwMDEgc2l6ZSAldSBzbWFsbGVyIHRoYW4gU01CIGZvciBtaWQ9JXUiLAotCQkJCQlsZW4sIHNtYi0+TWlkKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKGxlbiA+IGNsY19sZW4gKyA1MTIpIHsKKwkJCQkJcmZjbGVuLCBzbWItPk1pZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmIChyZmNsZW4gPiBjbGNfbGVuICsgNTEyKSB7CiAJCQkvKgogCQkJICogU29tZSBzZXJ2ZXJzIChXaW5kb3dzIFhQIGluIHBhcnRpY3VsYXIpIHNlbmQgbW9yZQogCQkJICogZGF0YSB0aGFuIHRoZSBsZW5ndGhzIGluIHRoZSBTTUIgcGFja2V0IHdvdWxkCkBAIC00OTUsOCArNDk0LDggQEAKIAkJCSAqIGRhdGEgdG8gNTEyIGJ5dGVzLgogCQkJICovCiAJCQljRVJST1IoMSwgIlJGQzEwMDEgc2l6ZSAldSBtb3JlIHRoYW4gNTEyIGJ5dGVzIGxhcmdlciAiCi0JCQkJICAidGhhbiBTTUIgZm9yIG1pZD0ldSIsIGxlbiwgc21iLT5NaWQpOwotCQkJcmV0dXJuIDE7CisJCQkJICAidGhhbiBTTUIgZm9yIG1pZD0ldSIsIHJmY2xlbiwgc21iLT5NaWQpOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC02NzYsMyArNjc1LDE4IEBACiAJCWNpbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gZmFsc2U7CiAJfQogfQorCitib29sCitiYWNrdXBfY3JlZChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiKQoreworCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfQ0lGU19CQUNLVVBVSUQpIHsKKwkJaWYgKGNpZnNfc2ItPm1udF9iYWNrdXB1aWQgPT0gY3VycmVudF9mc3VpZCgpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfQ0lGU19CQUNLVVBHSUQpIHsKKwkJaWYgKGluX2dyb3VwX3AoY2lmc19zYi0+bW50X2JhY2t1cGdpZCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL3Nlc3MuYyBiL2ZzL2NpZnMvc2Vzcy5jCmluZGV4IGQzZTYxOTYuLjRlYzNlZTkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc2Vzcy5jCisrKyBiL2ZzL2NpZnMvc2Vzcy5jCkBAIC0xMjQsNyArMTI0LDkgQEAKIAkvKgl0aGF0IHdlIHVzZSBpbiBuZXh0IGZldyBsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCS8qIE5vdGUgdGhhdCBoZWFkZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiBoZWFkZXJfYXNzZW1ibGUgKi8KIAlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOwotCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heEJ1ZmZlclNpemUgPSBjcHVfdG9fbGUxNihtaW5fdCh1MzIsCisJCQkJCUNJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0LAorCQkJCQlVU0hSVF9NQVgpKTsKIAlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKIAlwU01CLT5yZXEuVmNOdW1iZXIgPSBnZXRfbmV4dF92Y251bShzZXMpOwogCkBAIC02ODEsNyArNjgzLDcgQEAKIAkJCWNwdV90b19sZTE2KENJRlNfQVVUSF9SRVNQX1NJWkUpOwogCiAJCS8qIGNhbGN1bGF0ZSBudGxtIHJlc3BvbnNlIGFuZCBzZXNzaW9uIGtleSAqLwotCQlyYyA9IHNldHVwX250bG1fcmVzcG9uc2Uoc2VzKTsKKwkJcmMgPSBzZXR1cF9udGxtX3Jlc3BvbnNlKHNlcywgbmxzX2NwKTsKIAkJaWYgKHJjKSB7CiAJCQljRVJST1IoMSwgIkVycm9yICVkIGR1cmluZyBOVExNIGF1dGhlbnRpY2F0aW9uIiwgcmMpOwogCQkJZ290byBzc2V0dXBfZXhpdDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKaW5kZXggNDJiOWZmZi4uN2NhY2JhMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWJlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKQEAgLTE5OSwxNjAgKzE5OSwzNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogUm91dGluZXMgZm9yIFdpbmRvd3MgTlQgTUQ0IEhhc2ggZnVuY3Rpb25zLiAqLwotc3RhdGljIGludAotX215X3djc2xlbihfX3UxNiAqc3RyKQotewotCWludCBsZW4gPSAwOwotCXdoaWxlICgqc3RyKysgIT0gMCkKLQkJbGVuKys7Ci0JcmV0dXJuIGxlbjsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgaW50byBhbiBOVCBVTklDT0RFIHN0cmluZy4KLSAqIE5vdGUgdGhhdCByZWdhcmRsZXNzIG9mIHByb2Nlc3NvciB0eXBlCi0gKiB0aGlzIG11c3QgYmUgaW4gaW50ZWwgKGxpdHRsZS1lbmRpYW4pCi0gKiBmb3JtYXQuCi0gKi8KLQotc3RhdGljIGludAotX215X21ic3Rvd2NzKF9fdTE2ICpkc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKLXsJLyogQkIgbm90IGEgdmVyeSBnb29kIGNvbnZlcnNpb24gcm91dGluZSAtIGNoYW5nZS9maXggKi8KLQlpbnQgaTsKLQlfX3UxNiB2YWw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJdmFsID0gKnNyYzsKLQkJU1NWQUwoZHN0LCAwLCB2YWwpOwotCQlkc3QrKzsKLQkJc3JjKys7Ci0JCWlmICh2YWwgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gaTsKLX0KLQogLyoKICAqIENyZWF0ZXMgdGhlIE1ENCBIYXNoIG9mIHRoZSB1c2VycyBwYXNzd29yZCBpbiBOVCBVTklDT0RFLgogICovCiAKIGludAotRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KQorRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2LAorCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQogewogCWludCByYzsKIAlpbnQgbGVuOwogCV9fdTE2IHdwd2RbMTI5XTsKIAogCS8qIFBhc3N3b3JkIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycyAqLwotCWlmIChwYXNzd2QpIHsKLQkJbGVuID0gc3RybGVuKChjaGFyICopIHBhc3N3ZCk7Ci0JCWlmIChsZW4gPiAxMjgpCi0JCQlsZW4gPSAxMjg7Ci0KLQkJLyogUGFzc3dvcmQgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gTlQgdW5pY29kZSAqLwotCQlfbXlfbWJzdG93Y3Mod3B3ZCwgcGFzc3dkLCBsZW4pOwotCX0gZWxzZQorCWlmIChwYXNzd2QpIC8qIFBhc3N3b3JkIG11c3QgYmUgY29udmVydGVkIHRvIE5UIHVuaWNvZGUgKi8KKwkJbGVuID0gY2lmc19zdHJ0b1VDUyh3cHdkLCBwYXNzd2QsIDEyOCwgY29kZXBhZ2UpOworCWVsc2UgewogCQlsZW4gPSAwOworCQkqd3B3ZCA9IDA7IC8qIEVuc3VyZSBzdHJpbmcgaXMgbnVsbCB0ZXJtaW5hdGVkICovCisJfQogCi0Jd3B3ZFtsZW5dID0gMDsJLyogRW5zdXJlIHN0cmluZyBpcyBudWxsIHRlcm1pbmF0ZWQgKi8KLQkvKiBDYWxjdWxhdGUgbGVuZ3RoIGluIGJ5dGVzICovCi0JbGVuID0gX215X3djc2xlbih3cHdkKSAqIHNpemVvZihfX3UxNik7Ci0KLQlyYyA9IG1kZm91cihwMTYsICh1bnNpZ25lZCBjaGFyICopIHdwd2QsIGxlbik7Ci0JbWVtc2V0KHdwd2QsIDAsIDEyOSAqIDIpOworCXJjID0gbWRmb3VyKHAxNiwgKHVuc2lnbmVkIGNoYXIgKikgd3B3ZCwgbGVuICogc2l6ZW9mKF9fdTE2KSk7CisJbWVtc2V0KHdwd2QsIDAsIDEyOSAqIHNpemVvZihfX3UxNikpOwogCiAJcmV0dXJuIHJjOwogfQogCi0jaWYgMCAvKiBjdXJyZW50bHkgdW51c2VkICovCi0vKiBEb2VzIGJvdGggdGhlIE5UIGFuZCBMTSBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCi1zdGF0aWMgdm9pZAotbnRfbG1fb3dmX2dlbihjaGFyICpwd2QsIHVuc2lnbmVkIGNoYXIgbnRfcDE2WzE2XSwgdW5zaWduZWQgY2hhciBwMTZbMTZdKQotewotCWNoYXIgcGFzc3dkWzUxNF07Ci0KLQltZW1zZXQocGFzc3dkLCAnXDAnLCA1MTQpOwotCWlmIChzdHJsZW4ocHdkKSA8IDUxMykKLQkJc3RyY3B5KHBhc3N3ZCwgcHdkKTsKLQllbHNlCi0JCW1lbWNweShwYXNzd2QsIHB3ZCwgNTEyKTsKLQkvKiBDYWxjdWxhdGUgdGhlIE1ENCBoYXNoIChOVCBjb21wYXRpYmxlKSBvZiB0aGUgcGFzc3dvcmQgKi8KLQltZW1zZXQobnRfcDE2LCAnXDAnLCAxNik7Ci0JRV9tZDRoYXNoKHBhc3N3ZCwgbnRfcDE2KTsKLQotCS8qIE1hbmdsZSB0aGUgcGFzc3dvcmRzIGludG8gTGFubWFuIGZvcm1hdCAqLwotCXBhc3N3ZFsxNF0gPSAnXDAnOwotLyoJc3RydXBwZXIocGFzc3dkKTsgKi8KLQotCS8qIENhbGN1bGF0ZSB0aGUgU01CIChsYW5tYW4pIGhhc2ggZnVuY3Rpb25zIG9mIHRoZSBwYXNzd29yZCAqLwotCi0JbWVtc2V0KHAxNiwgJ1wwJywgMTYpOwotCUVfUDE2KCh1bnNpZ25lZCBjaGFyICopIHBhc3N3ZCwgKHVuc2lnbmVkIGNoYXIgKikgcDE2KTsKLQotCS8qIGNsZWFyIG91dCBsb2NhbCBjb3B5IG9mIHVzZXIncyBwYXNzd29yZCAoanVzdCBiZWluZyBwYXJhbm9pZCkuICovCi0JbWVtc2V0KHBhc3N3ZCwgJ1wwJywgc2l6ZW9mKHBhc3N3ZCkpOwotfQotI2VuZGlmCi0KLS8qIERvZXMgdGhlIE5UTE12MiBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCi0jaWYgMCAgLyogZnVuY3Rpb24gbm90IG5lZWRlZCB5ZXQgLSBidXQgd2lsbCBiZSBzb29uICovCi1zdGF0aWMgdm9pZAotbnR2Ml9vd2ZfZ2VuKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3dmWzE2XSwgY29uc3QgY2hhciAqdXNlcl9uLAotCQljb25zdCBjaGFyICpkb21haW5fbiwgdW5zaWduZWQgY2hhciBrcl9idWZbMTZdLAotCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCi17Ci0Jd2NoYXJfdCAqdXNlcl91OwotCXdjaGFyX3QgKmRvbV91OwotCWludCB1c2VyX2wsIGRvbWFpbl9sOwotCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7Ci0KLQkvKiBtaWdodCBhcyB3ZWxsIGRvIG9uZSBhbGxvYyB0byBob2xkIGJvdGggKHVzZXJfdSBhbmQgZG9tX3UpICovCi0JdXNlcl91ID0ga21hbGxvYygyMDQ4ICogc2l6ZW9mKHdjaGFyX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAodXNlcl91ID09IE5VTEwpCi0JCXJldHVybjsKLQlkb21fdSA9IHVzZXJfdSArIDEwMjQ7Ci0KLQkvKiBwdXNoX3VjczIoTlVMTCwgdXNlcl91LCB1c2VyX24sICh1c2VyX2wrMSkqMiwKLQkJCVNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsKLQkgICBwdXNoX3VjczIoTlVMTCwgZG9tX3UsIGRvbWFpbl9uLCAoZG9tYWluX2wrMSkqMiwKLQkJCVNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsgKi8KLQotCS8qIEJCIHVzZXIgYW5kIGRvbWFpbiBtYXkgbmVlZCB0byBiZSB1cHBlcmNhc2VkICovCi0JdXNlcl9sID0gY2lmc19zdHJ0b1VDUyh1c2VyX3UsIHVzZXJfbiwgNTExLCBubHNfY29kZXBhZ2UpOwotCWRvbWFpbl9sID0gY2lmc19zdHJ0b1VDUyhkb21fdSwgZG9tYWluX24sIDUxMSwgbmxzX2NvZGVwYWdlKTsKLQotCXVzZXJfbCsrOwkJLyogdHJhaWxpbmcgbnVsbCAqLwotCWRvbWFpbl9sKys7Ci0KLQlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQob3dmLCAxNiwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVzZXJfdSwgdXNlcl9sICogMiwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRvbV91LCBkb21haW5fbCAqIDIsICZjdHgpOwotCWhtYWNfbWQ1X2ZpbmFsKGtyX2J1ZiwgJmN0eCk7Ci0KLQlrZnJlZSh1c2VyX3UpOwotfQotI2VuZGlmCi0KLS8qIERvZXMgdGhlIGRlcyBlbmNyeXB0aW9uIGZyb20gdGhlIEZJUlNUIDggQllURVMgb2YgdGhlIE5UIG9yIExNIE1ENCBoYXNoLiAqLwotI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCAqLwotc3RhdGljIHZvaWQKLU5UTE1TU1BPV0ZlbmNyeXB0KHVuc2lnbmVkIGNoYXIgcGFzc3dkWzhdLAotCQkgIHVuc2lnbmVkIGNoYXIgKm50bG1jaGFscmVzcCwgdW5zaWduZWQgY2hhciBwMjRbMjRdKQotewotCXVuc2lnbmVkIGNoYXIgcDIxWzIxXTsKLQotCW1lbXNldChwMjEsICdcMCcsIDIxKTsKLQltZW1jcHkocDIxLCBwYXNzd2QsIDgpOwotCW1lbXNldChwMjEgKyA4LCAweGJkLCA4KTsKLQotCUVfUDI0KHAyMSwgbnRsbWNoYWxyZXNwLCBwMjQpOwotfQotI2VuZGlmCi0KIC8qIERvZXMgdGhlIE5UIE1ENCBoYXNoIHRoZW4gZGVzIGVuY3J5cHRpb24uICovCiBpbnQKLVNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCitTTUJOVGVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0LAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpjb2RlcGFnZSkKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgY2hhciBwMTZbMTZdLCBwMjFbMjFdOwpAQCAtMzYwLDcgKzIzNiw3IEBACiAJbWVtc2V0KHAxNiwgJ1wwJywgMTYpOwogCW1lbXNldChwMjEsICdcMCcsIDIxKTsKIAotCXJjID0gRV9tZDRoYXNoKHBhc3N3ZCwgcDE2KTsKKwlyYyA9IEVfbWQ0aGFzaChwYXNzd2QsIHAxNiwgY29kZXBhZ2UpOwogCWlmIChyYykgewogCQljRllJKDEsICIlcyBDYW4ndCBnZW5lcmF0ZSBOVCBoYXNoLCBlcnJvcjogJWQiLCBfX2Z1bmNfXywgcmMpOwogCQlyZXR1cm4gcmM7CkBAIC0zNjksMzkgKzI0NSwzIEBACiAJcmMgPSBFX1AyNChwMjEsIGM4LCBwMjQpOwogCXJldHVybiByYzsKIH0KLQotCi0vKiBEb2VzIHRoZSBtZDUgZW5jcnlwdGlvbiBmcm9tIHRoZSBOVCBoYXNoIGZvciBOVExNdjIuICovCi0vKiBUaGVzZSByb3V0aW5lcyB3aWxsIGJlIG5lZWRlZCBsYXRlciAqLwotI2lmIDAKLXN0YXRpYyB2b2lkCi1TTUJPV0ZlbmNyeXB0X250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCi0JCSAgIGNvbnN0IHN0cnVjdCBkYXRhX2Jsb2IgKnNydl9jaGFsLAotCQkgICBjb25zdCBzdHJ1Y3QgZGF0YV9ibG9iICpjbGlfY2hhbCwgdW5zaWduZWQgY2hhciByZXNwX2J1ZlsxNl0pCi17Ci0Jc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKLQotCWhtYWNfbWQ1X2luaXRfbGltS190b182NChrciwgMTYsICZjdHgpOwotCWhtYWNfbWQ1X3VwZGF0ZShzcnZfY2hhbC0+ZGF0YSwgc3J2X2NoYWwtPmxlbmd0aCwgJmN0eCk7Ci0JaG1hY19tZDVfdXBkYXRlKGNsaV9jaGFsLT5kYXRhLCBjbGlfY2hhbC0+bGVuZ3RoLCAmY3R4KTsKLQlobWFjX21kNV9maW5hbChyZXNwX2J1ZiwgJmN0eCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1TTUJzZXNza2V5Z2VuX250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm50X3Jlc3AsIF9fdTggc2Vzc19rZXlbMTZdKQotewotCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7Ci0KLQlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa3IsIDE2LCAmY3R4KTsKLQlobWFjX21kNV91cGRhdGUobnRfcmVzcCwgMTYsICZjdHgpOwotCWhtYWNfbWQ1X2ZpbmFsKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAmY3R4KTsKLX0KLQotc3RhdGljIHZvaWQKLVNNQnNlc3NrZXlnZW5fbnR2MShjb25zdCB1bnNpZ25lZCBjaGFyIGtyWzE2XSwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnRfcmVzcCwgX191OCBzZXNzX2tleVsxNl0pCi17Ci0JbWRmb3VyKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAodW5zaWduZWQgY2hhciAqKSBrciwgMTYpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCAxMGNhNmIyLi4wY2M5NTg0IDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgpAQCAtMzI0LDcgKzMyNSw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSB3YWl0X2V2ZW50X2tpbGxhYmxlKHNlcnZlci0+cmVzcG9uc2VfcSwKKwllcnJvciA9IHdhaXRfZXZlbnRfZnJlZXpla2lsbGFibGUoc2VydmVyLT5yZXNwb25zZV9xLAogCQkJCSAgICBtaWRRLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQpOwogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CkBAIC0zMzksOCArMzQwLDggQEAKICAqLwogaW50CiBjaWZzX2NhbGxfYXN5bmMoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQl1bnNpZ25lZCBpbnQgbnZlYywgbWlkX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCB2b2lkICpjYmRhdGEsCi0JCWJvb2wgaWdub3JlX3BlbmQpCisJCXVuc2lnbmVkIGludCBudmVjLCBtaWRfcmVjZWl2ZV90ICpyZWNlaXZlLAorCQltaWRfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNiZGF0YSwgYm9vbCBpZ25vcmVfcGVuZCkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IG1pZF9xX2VudHJ5ICptaWQ7CkBAIC0zNzQsNiArMzc1LDcgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAorCW1pZC0+cmVjZWl2ZSA9IHJlY2VpdmU7CiAJbWlkLT5jYWxsYmFjayA9IGNhbGxiYWNrOwogCW1pZC0+Y2FsbGJhY2tfZGF0YSA9IGNiZGF0YTsKIAltaWQtPm1pZFN0YXRlID0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEOwpAQCAtNDk2LDEzICs0OTgsMTggQEAKIGNpZnNfY2hlY2tfcmVjZWl2ZShzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCwgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkgICBib29sIGxvZ19lcnJvcikKIHsKLQlkdW1wX3NtYihtaWQtPnJlc3BfYnVmLAotCQkgbWluX3QodTMyLCA5MiwgYmUzMl90b19jcHUobWlkLT5yZXNwX2J1Zi0+c21iX2J1Zl9sZW5ndGgpKSk7CisJdW5zaWduZWQgaW50IGxlbiA9IGJlMzJfdG9fY3B1KG1pZC0+cmVzcF9idWYtPnNtYl9idWZfbGVuZ3RoKSArIDQ7CisKKwlkdW1wX3NtYihtaWQtPnJlc3BfYnVmLCBtaW5fdCh1MzIsIDkyLCBsZW4pKTsKIAogCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBpbnRvIGEgbW9yZSB1c2FibGUgZm9ybSAqLwogCWlmIChzZXJ2ZXItPnNlY19tb2RlICYgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkgeworCQlzdHJ1Y3Qga3ZlYyBpb3Y7CisKKwkJaW92Lmlvdl9iYXNlID0gbWlkLT5yZXNwX2J1ZjsKKwkJaW92Lmlvdl9sZW4gPSBsZW47CiAJCS8qIEZJWE1FOiBhZGQgY29kZSB0byBraWxsIHNlc3Npb24gKi8KLQkJaWYgKGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShtaWQtPnJlc3BfYnVmLCBzZXJ2ZXIsCisJCWlmIChjaWZzX3ZlcmlmeV9zaWduYXR1cmUoJmlvdiwgMSwgc2VydmVyLAogCQkJCQkgIG1pZC0+c2VxdWVuY2VfbnVtYmVyICsgMSkgIT0gMCkKIAkJCWNFUlJPUigxLCAiVW5leHBlY3RlZCBTTUIgc2lnbmF0dXJlIik7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy94YXR0ci5jIGIvZnMvY2lmcy94YXR0ci5jCmluZGV4IGMzMjMwODguLjQ1ZjA3YzQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMveGF0dHIuYworKysgYi9mcy9jaWZzL3hhdHRyLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogI2lmZGVmIENPTkZJR19DSUZTX0FDTAogCQkJbWVtY3B5KHBhY2wsIGVhX3ZhbHVlLCB2YWx1ZV9zaXplKTsKIAkJCXJjID0gc2V0X2NpZnNfYWNsKHBhY2wsIHZhbHVlX3NpemUsCi0JCQkJZGlyZW50cnktPmRfaW5vZGUsIGZ1bGxfcGF0aCk7CisJCQkJZGlyZW50cnktPmRfaW5vZGUsIGZ1bGxfcGF0aCwgQ0lGU19BQ0xfREFDTCk7CiAJCQlpZiAocmMgPT0gMCkgLyogZm9yY2UgcmV2YWxpZGF0ZSBvZiB0aGUgaW5vZGUgKi8KIAkJCQlDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpLT50aW1lID0gMDsKIAkJCWtmcmVlKHBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9jb2RhX2xpbnV4LmMgYi9mcy9jb2RhL2NvZGFfbGludXguYwppbmRleCAyYmRiY2MxLi44NTRhY2U3IDEwMDY0NAotLS0gYS9mcy9jb2RhL2NvZGFfbGludXguYworKysgYi9mcy9jb2RhL2NvZGFfbGludXguYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIGlmIChhdHRyLT52YV9naWQgIT0gLTEpCiAJICAgICAgICBpbm9kZS0+aV9naWQgPSAoZ2lkX3QpIGF0dHItPnZhX2dpZDsKIAlpZiAoYXR0ci0+dmFfbmxpbmsgIT0gLTEpCi0JICAgICAgICBpbm9kZS0+aV9ubGluayA9IGF0dHItPnZhX25saW5rOworCQlzZXRfbmxpbmsoaW5vZGUsIGF0dHItPnZhX25saW5rKTsKIAlpZiAoYXR0ci0+dmFfc2l6ZSAhPSAtMSkKIAkgICAgICAgIGlub2RlLT5pX3NpemUgPSBhdHRyLT52YV9zaXplOwogCWlmIChhdHRyLT52YV9zaXplICE9IC0xKQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9kaXIuYyBiL2ZzL2NvZGEvZGlyLmMKaW5kZXggMDIzOTQzMy4uMjhlN2UxMyAxMDA2NDQKLS0tIGEvZnMvY29kYS9kaXIuYworKysgYi9mcy9jb2RhL2Rpci5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAlpZiAoIWVycm9yKSB7CiAJCS8qIFZGUyBtYXkgZGVsZXRlIHRoZSBjaGlsZCAqLwogCQlpZiAoZGUtPmRfaW5vZGUpCi0JCSAgICBkZS0+ZF9pbm9kZS0+aV9ubGluayA9IDA7CisJCQljbGVhcl9ubGluayhkZS0+ZF9pbm9kZSk7CiAKIAkJLyogZml4IHRoZSBsaW5rIGNvdW50IG9mIHRoZSBwYXJlbnQgKi8KIAkJY29kYV9kaXJfZHJvcF9ubGluayhkaXIpOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCAwNWUzZjNkLi5jOTg3ODc1IDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMjQ2LDExICsyNDYsOCBAQAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMF0sICZ1YnVmLT5mX2ZzaWQudmFsWzBdKSB8fAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMV0sICZ1YnVmLT5mX2ZzaWQudmFsWzFdKSB8fAogCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnJzaXplLCAmdWJ1Zi0+Zl9mcnNpemUpIHx8Ci0JICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbMF0pIHx8IAotCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzFdKSB8fCAKLQkgICAgX19wdXRfdXNlcigwLCAmdWJ1Zi0+Zl9zcGFyZVsyXSkgfHwgCi0JICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbM10pIHx8IAotCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzRdKSkKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZsYWdzLCAmdWJ1Zi0+Zl9mbGFncykgfHwKKwkgICAgX19jbGVhcl91c2VyKHVidWYtPmZfc3BhcmUsIHNpemVvZih1YnVmLT5mX3NwYXJlKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtNTQ5LDcgKzU0Niw3IEBACiBzc2l6ZV90IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IoaW50IHR5cGUsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp1dmVjdG9yLCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCiAJCXVuc2lnbmVkIGxvbmcgZmFzdF9zZWdzLCBzdHJ1Y3QgaW92ZWMgKmZhc3RfcG9pbnRlciwKLQkJc3RydWN0IGlvdmVjICoqcmV0X3BvaW50ZXIpCisJCXN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyLCBpbnQgY2hlY2tfYWNjZXNzKQogewogCWNvbXBhdF9zc2l6ZV90IHRvdF9sZW47CiAJc3RydWN0IGlvdmVjICppb3YgPSAqcmV0X3BvaW50ZXIgPSBmYXN0X3BvaW50ZXI7CkBAIC01OTYsNyArNTkzLDggQEAKIAkJfQogCQlpZiAobGVuIDwgMCkJLyogc2l6ZV90IG5vdCBmaXR0aW5nIGluIGNvbXBhdF9zc2l6ZV90IC4uICovCiAJCQlnb3RvIG91dDsKLQkJaWYgKCFhY2Nlc3Nfb2sodnJmeV9kaXIodHlwZSksIGNvbXBhdF9wdHIoYnVmKSwgbGVuKSkgeworCQlpZiAoY2hlY2tfYWNjZXNzICYmCisJCSAgICAhYWNjZXNzX29rKHZyZnlfZGlyKHR5cGUpLCBjb21wYXRfcHRyKGJ1ZiksIGxlbikpIHsKIAkJCXJldCA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTExMCw3ICsxMTA4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAl0b3RfbGVuID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAotCQkJCQkgICAgICAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkJICAgICAgIFVJT19GQVNUSU9WLCBpb3ZzdGFjaywgJmlvdiwgMSk7CiAJaWYgKHRvdF9sZW4gPT0gMCkgewogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggYTg4OTQ4Yi4uYTkwMWM2OSAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogfQogCiAvKgotICogZGVudHJ5X2xydV8oYWRkfGRlbHxtb3ZlX3RhaWwpIG11c3QgYmUgY2FsbGVkIHdpdGggZF9sb2NrIGhlbGQuCisgKiBkZW50cnlfbHJ1XyhhZGR8ZGVsfHBydW5lfG1vdmVfdGFpbCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBkX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHZvaWQgZGVudHJ5X2xydV9hZGQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpAQCAtMjQ1LDYgKzI0NSw5IEBACiAJZGVudHJ5X3N0YXQubnJfdW51c2VkLS07CiB9CiAKKy8qCisgKiBSZW1vdmUgYSBkZW50cnkgd2l0aCByZWZlcmVuY2VzIGZyb20gdGhlIExSVS4KKyAqLwogc3RhdGljIHZvaWQgZGVudHJ5X2xydV9kZWwoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKQEAgLTI1NCw2ICsyNTcsMjMgQEAKIAl9CiB9CiAKKy8qCisgKiBSZW1vdmUgYSBkZW50cnkgdGhhdCBpcyB1bnJlZmVyZW5jZWQgYW5kIGFib3V0IHRvIGJlIHBydW5lZAorICogKHVuaGFzaGVkIGFuZCBkZXN0cm95ZWQpIGZyb20gdGhlIExSVSwgYW5kIGluZm9ybSB0aGUgZmlsZSBzeXN0ZW0uCisgKiBUaGlzIHdyYXBwZXIgc2hvdWxkIGJlIGNhbGxlZCBfcHJpb3JfIHRvIHVuaGFzaGluZyBhIHZpY3RpbSBkZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkIGRlbnRyeV9scnVfcHJ1bmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKwkJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9PUF9QUlVORSkKKwkJCWRlbnRyeS0+ZF9vcC0+ZF9wcnVuZShkZW50cnkpOworCisJCXNwaW5fbG9jaygmZGNhY2hlX2xydV9sb2NrKTsKKwkJX19kZW50cnlfbHJ1X2RlbChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xydV9sb2NrKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGRlbnRyeV9scnVfbW92ZV90YWlsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzcGluX2xvY2soJmRjYWNoZV9scnVfbG9jayk7CkBAIC00MDMsOCArNDIzLDEyIEBACiAKIAlpZiAocmVmKQogCQlkZW50cnktPmRfY291bnQtLTsKLQkvKiBpZiBkZW50cnkgd2FzIG9uIHRoZSBkX2xydSBsaXN0IGRlbGV0ZSBpdCBmcm9tIHRoZXJlICovCi0JZGVudHJ5X2xydV9kZWwoZGVudHJ5KTsKKwkvKgorCSAqIGlmIGRlbnRyeSB3YXMgb24gdGhlIGRfbHJ1IGxpc3QgZGVsZXRlIGl0IGZyb20gdGhlcmUuCisJICogaW5mb3JtIHRoZSBmcyB2aWEgZF9wcnVuZSB0aGF0IHRoaXMgZGVudHJ5IGlzIGFib3V0IHRvIGJlCisJICogdW5oYXNoZWQgYW5kIGRlc3Ryb3llZC4KKwkgKi8KKwlkZW50cnlfbHJ1X3BydW5lKGRlbnRyeSk7CiAJLyogaWYgaXQgd2FzIG9uIHRoZSBoYXNoIHRoZW4gcmVtb3ZlIGl0ICovCiAJX19kX2Ryb3AoZGVudHJ5KTsKIAlyZXR1cm4gZF9raWxsKGRlbnRyeSwgcGFyZW50KTsKQEAgLTUyMiw5ICs1NDYsMTEgQEAKIAkgKiB3b3VsZCBtYWtlIGl0IHVucmVhY2hhYmxlIGZyb20gdGhlIHJvb3QsCiAJICogd2UgbWlnaHQgc3RpbGwgcG9wdWxhdGUgaXQgaWYgaXQgd2FzIGEKIAkgKiB3b3JraW5nIGRpcmVjdG9yeSBvciBzaW1pbGFyKS4KKwkgKiBXZSBhbHNvIG5lZWQgdG8gbGVhdmUgbW91bnRwb2ludHMgYWxvbmUsCisJICogZGlyZWN0b3J5IG9yIG5vdC4KIAkgKi8KLQlpZiAoZGVudHJ5LT5kX2NvdW50ID4gMSkgewotCQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJaWYgKGRlbnRyeS0+ZF9jb3VudCA+IDEgJiYgZGVudHJ5LT5kX2lub2RlKSB7CisJCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fCBkX21vdW50cG9pbnQoZGVudHJ5KSkgewogCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KQEAgLTg1NCw4ICs4ODAsMTIgQEAKIAkJZG8gewogCQkJc3RydWN0IGlub2RlICppbm9kZTsKIAotCQkJLyogZGV0YWNoIGZyb20gdGhlIHN5c3RlbSAqLwotCQkJZGVudHJ5X2xydV9kZWwoZGVudHJ5KTsKKwkJCS8qCisJCQkgKiByZW1vdmUgdGhlIGRlbnRyeSBmcm9tIHRoZSBscnUsIGFuZCBpbmZvcm0KKwkJCSAqIHRoZSBmcyB0aGF0IHRoaXMgZGVudHJ5IGlzIGFib3V0IHRvIGJlCisJCQkgKiB1bmhhc2hlZCBhbmQgZGVzdHJveWVkLgorCQkJICovCisJCQlkZW50cnlfbHJ1X3BydW5lKGRlbnRyeSk7CiAJCQlfX2Rfc2hyaW5rKGRlbnRyeSk7CiAKIAkJCWlmIChkZW50cnktPmRfY291bnQgIT0gMCkgewpAQCAtMTI4Myw2ICsxMzEzLDggQEAKIAkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9PUF9SRVZBTElEQVRFOwogCWlmIChvcC0+ZF9kZWxldGUpCiAJCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfT1BfREVMRVRFOworCWlmIChvcC0+ZF9wcnVuZSkKKwkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9PUF9QUlVORTsKIAogfQogRVhQT1JUX1NZTUJPTChkX3NldF9kX29wKTsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggMmYyN2U1Ny4uZDVkNTI5NyAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCiAJcy0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKIAlpZiAocy0+c19yb290KQpAQCAtNTQ5LDcgKzU0OSw3IEBACiAKIAlkZW50cnkgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwogCi0JaW5vZGUtPmlfbmxpbmstLTsKKwlkcm9wX25saW5rKGlub2RlKTsKIAlkX2RlbGV0ZShkZW50cnkpOwogCWRwdXQoZGVudHJ5KTsJLyogZF9hbGxvY19uYW1lKCkgaW4gZGV2cHRzX3B0eV9uZXcoKSAqLwogCWRwdXQoZGVudHJ5KTsJCS8qIGRfZmluZF9hbGlhcyBhYm92ZSAqLwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwppbmRleCA0NGEzNjBjLi5kNzQwYWI2IDEwMDY0NAotLS0gYS9mcy9kaXJlY3QtaW8uYworKysgYi9mcy9kaXJlY3QtaW8uYwpAQCAtMzksNyArMzksNyBAQAogCiAvKgogICogSG93IG1hbnkgdXNlciBwYWdlcyB0byBtYXAgaW4gb25lIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgZGV0ZXJtaW5lcwotICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgaW4gdGhlIHNsYWIgY2FjaGUKICAqLwogI2RlZmluZSBESU9fUEFHRVMJNjQKIApAQCAtNTUsMTMgKzU1LDEwIEBACiAgKiBibG9ja3NpemUuCiAgKi8KIAotc3RydWN0IGRpbyB7Ci0JLyogQklPIHN1Ym1pc3Npb24gc3RhdGUgKi8KKy8qIGRpb19zdGF0ZSBvbmx5IHVzZWQgaW4gdGhlIHN1Ym1pc3Npb24gcGF0aCAqLworCitzdHJ1Y3QgZGlvX3N1Ym1pdCB7CiAJc3RydWN0IGJpbyAqYmlvOwkJLyogYmlvIHVuZGVyIGFzc2VtYmx5ICovCi0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlpbnQgcnc7Ci0JbG9mZl90IGlfc2l6ZTsJCQkvKiBpX3NpemUgd2hlbiBzdWJtaXR0ZWQgKi8KLQlpbnQgZmxhZ3M7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBibGtiaXRzOwkJLyogZG9lc24ndCBjaGFuZ2UgKi8KIAl1bnNpZ25lZCBibGtmYWN0b3I7CQkvKiBXaGVuIHdlJ3JlIHVzaW5nIGFuIGFsaWdubWVudCB3aGljaAogCQkJCQkgICBpcyBmaW5lciB0aGFuIHRoZSBmaWxlc3lzdGVtJ3Mgc29mdApAQCAtNzYsMTggKzczLDE3IEBACiAJc2VjdG9yX3QgYmxvY2tfaW5fZmlsZTsJCS8qIEN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIHVuZGVybHlpbmcKIAkJCQkJICAgZmlsZSBpbiBkaW9fYmxvY2sgdW5pdHMuICovCiAJdW5zaWduZWQgYmxvY2tzX2F2YWlsYWJsZTsJLyogQXQgYmxvY2tfaW5fZmlsZS4gIGNoYW5nZXMgKi8KKwlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCiAJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fcmVxdWVzdDsvKiBkb2Vzbid0IGNoYW5nZSAqLwogCXVuc2lnbmVkIGZpcnN0X2Jsb2NrX2luX3BhZ2U7CS8qIGRvZXNuJ3QgY2hhbmdlLCBVc2VkIG9ubHkgb25jZSAqLwogCWludCBib3VuZGFyeTsJCQkvKiBwcmV2IGJsb2NrIGlzIGF0IGEgYm91bmRhcnkgKi8KLQlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCiAJZ2V0X2Jsb2NrX3QgKmdldF9ibG9jazsJCS8qIGJsb2NrIG1hcHBpbmcgZnVuY3Rpb24gKi8KLQlkaW9faW9kb25lX3QgKmVuZF9pbzsJCS8qIElPIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KIAlkaW9fc3VibWl0X3QgKnN1Ym1pdF9pbzsJLyogSU8gc3VibWl0aW9uIGZ1bmN0aW9uICovCisKIAlsb2ZmX3QgbG9naWNhbF9vZmZzZXRfaW5fYmlvOwkvKiBjdXJyZW50IGZpcnN0IGxvZ2ljYWwgYmxvY2sgaW4gYmlvICovCiAJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fYmlvOwkvKiBjdXJyZW50IGZpbmFsIGJsb2NrIGluIGJpbyArIDEgKi8KIAlzZWN0b3JfdCBuZXh0X2Jsb2NrX2Zvcl9pbzsJLyogbmV4dCBibG9jayB0byBiZSBwdXQgdW5kZXIgSU8sCiAJCQkJCSAgIGluIGRpb19ibG9ja3MgdW5pdHMgKi8KLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOwkvKiBsYXN0IGdldF9ibG9jaygpIHJlc3VsdCAqLwogCiAJLyoKIAkgKiBEZWZlcnJlZCBhZGRpdGlvbiBvZiBhIHBhZ2UgdG8gdGhlIGRpby4gIFRoZXNlIHZhcmlhYmxlcyBhcmUKQEAgLTEwMCwxOCArOTYsNiBAQAogCXNlY3Rvcl90IGN1cl9wYWdlX2Jsb2NrOwkvKiBXaGVyZSBpdCBzdGFydHMgKi8KIAlsb2ZmX3QgY3VyX3BhZ2VfZnNfb2Zmc2V0OwkvKiBPZmZzZXQgaW4gZmlsZSAqLwogCi0JLyogQklPIGNvbXBsZXRpb24gc3RhdGUgKi8KLQlzcGlubG9ja190IGJpb19sb2NrOwkJLyogcHJvdGVjdHMgQklPIGZpZWxkcyBiZWxvdyAqLwotCXVuc2lnbmVkIGxvbmcgcmVmY291bnQ7CQkvKiBkaXJlY3RfaW9fd29ya2VyKCkgYW5kIGJpb3MgKi8KLQlzdHJ1Y3QgYmlvICpiaW9fbGlzdDsJCS8qIHNpbmdseSBsaW5rZWQgdmlhIGJpX3ByaXZhdGUgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndhaXRlcjsJLyogd2FpdGluZyB0YXNrIChOVUxMIGlmIG5vbmUpICovCi0KLQkvKiBBSU8gcmVsYXRlZCBzdHVmZiAqLwotCXN0cnVjdCBraW9jYiAqaW9jYjsJCS8qIGtpb2NiICovCi0JaW50IGlzX2FzeW5jOwkJCS8qIGlzIElPIGFzeW5jID8gKi8KLQlpbnQgaW9fZXJyb3I7CQkJLyogSU8gZXJyb3IgaW4gY29tcGxldGlvbiBwYXRoICovCi0Jc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KLQogCS8qCiAJICogUGFnZSBmZXRjaGluZyBzdGF0ZS4gVGhlc2UgdmFyaWFibGVzIGJlbG9uZyB0byBkaW9fcmVmaWxsX3BhZ2VzKCkuCiAJICovCkBAIC0xMjUsNyArMTA5LDMwIEBACiAJICovCiAJdW5zaWduZWQgaGVhZDsJCQkvKiBuZXh0IHBhZ2UgdG8gcHJvY2VzcyAqLwogCXVuc2lnbmVkIHRhaWw7CQkJLyogbGFzdCB2YWxpZCBwYWdlICsgMSAqLworfTsKKworLyogZGlvX3N0YXRlIGNvbW11bmljYXRlZCBiZXR3ZWVuIHN1Ym1pc3Npb24gcGF0aCBhbmQgZW5kX2lvICovCitzdHJ1Y3QgZGlvIHsKKwlpbnQgZmxhZ3M7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwlpbnQgcnc7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb2ZmX3QgaV9zaXplOwkJCS8qIGlfc2l6ZSB3aGVuIHN1Ym1pdHRlZCAqLworCWRpb19pb2RvbmVfdCAqZW5kX2lvOwkJLyogSU8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3B5IGZyb20gbWFwX2JoLmJfcHJpdmF0ZSAqLworCisJLyogQklPIGNvbXBsZXRpb24gc3RhdGUgKi8KKwlzcGlubG9ja190IGJpb19sb2NrOwkJLyogcHJvdGVjdHMgQklPIGZpZWxkcyBiZWxvdyAqLwogCWludCBwYWdlX2Vycm9yczsJCS8qIGVycm5vIGZyb20gZ2V0X3VzZXJfcGFnZXMoKSAqLworCWludCBpc19hc3luYzsJCQkvKiBpcyBJTyBhc3luYyA/ICovCisJaW50IGlvX2Vycm9yOwkJCS8qIElPIGVycm9yIGluIGNvbXBsZXRpb24gcGF0aCAqLworCXVuc2lnbmVkIGxvbmcgcmVmY291bnQ7CQkvKiBkaXJlY3RfaW9fd29ya2VyKCkgYW5kIGJpb3MgKi8KKwlzdHJ1Y3QgYmlvICpiaW9fbGlzdDsJCS8qIHNpbmdseSBsaW5rZWQgdmlhIGJpX3ByaXZhdGUgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndhaXRlcjsJLyogd2FpdGluZyB0YXNrIChOVUxMIGlmIG5vbmUpICovCisKKwkvKiBBSU8gcmVsYXRlZCBzdHVmZiAqLworCXN0cnVjdCBraW9jYiAqaW9jYjsJCS8qIGtpb2NiICovCisJc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KIAogCS8qCiAJICogcGFnZXNbXSAoYW5kIGFueSBmaWVsZHMgcGxhY2VkIGFmdGVyIGl0KSBhcmUgbm90IHplcm9lZCBvdXQgYXQKQEAgLTEzMyw3ICsxNDAsOSBAQAogCSAqIHdpc2ggdGhhdCB0aGV5IG5vdCBiZSB6ZXJvZWQuCiAJICovCiAJc3RydWN0IHBhZ2UgKnBhZ2VzW0RJT19QQUdFU107CS8qIHBhZ2UgYnVmZmVyICovCi19OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRpb19jYWNoZSBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdm9pZCBfX2lub2RlX2Rpb193YWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC0xODIsMjcgKzE5MSwyNyBAQAogLyoKICAqIEhvdyBtYW55IHBhZ2VzIGFyZSBpbiB0aGUgcXVldWU/CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZGlvX3BhZ2VzX3ByZXNlbnQoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkaW9fcGFnZXNfcHJlc2VudChzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKLQlyZXR1cm4gZGlvLT50YWlsIC0gZGlvLT5oZWFkOworCXJldHVybiBzZGlvLT50YWlsIC0gc2Rpby0+aGVhZDsKIH0KIAogLyoKICAqIEdvIGdyYWIgYW5kIHBpbiBzb21lIHVzZXJzcGFjZSBwYWdlcy4gICBUeXBpY2FsbHkgd2UnbGwgZ2V0IDY0IGF0IGEgdGltZS4KICAqLwotc3RhdGljIGludCBkaW9fcmVmaWxsX3BhZ2VzKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19yZWZpbGxfcGFnZXMoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKIAlpbnQgcmV0OwogCWludCBucl9wYWdlczsKIAotCW5yX3BhZ2VzID0gbWluKGRpby0+dG90YWxfcGFnZXMgLSBkaW8tPmN1cnJfcGFnZSwgRElPX1BBR0VTKTsKKwlucl9wYWdlcyA9IG1pbihzZGlvLT50b3RhbF9wYWdlcyAtIHNkaW8tPmN1cnJfcGFnZSwgRElPX1BBR0VTKTsKIAlyZXQgPSBnZXRfdXNlcl9wYWdlc19mYXN0KAotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzLAkJLyogV2hlcmUgZnJvbT8gKi8KKwkJc2Rpby0+Y3Vycl91c2VyX2FkZHJlc3MsCQkvKiBXaGVyZSBmcm9tPyAqLwogCQlucl9wYWdlcywJCQkvKiBIb3cgbWFueSBwYWdlcz8gKi8KIAkJZGlvLT5ydyA9PSBSRUFELAkJLyogV3JpdGUgdG8gbWVtb3J5PyAqLwogCQkmZGlvLT5wYWdlc1swXSk7CQkvKiBQdXQgcmVzdWx0cyBoZXJlICovCiAKLQlpZiAocmV0IDwgMCAmJiBkaW8tPmJsb2Nrc19hdmFpbGFibGUgJiYgKGRpby0+cncgJiBXUklURSkpIHsKKwlpZiAocmV0IDwgMCAmJiBzZGlvLT5ibG9ja3NfYXZhaWxhYmxlICYmIChkaW8tPnJ3ICYgV1JJVEUpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gWkVST19QQUdFKDApOwogCQkvKgogCQkgKiBBIG1lbW9yeSBmYXVsdCwgYnV0IHRoZSBmaWxlc3lzdGVtIGhhcyBzb21lIG91dHN0YW5kaW5nCkBAIC0yMTMsMTcgKzIyMiwxNyBAQAogCQkJZGlvLT5wYWdlX2Vycm9ycyA9IHJldDsKIAkJcGFnZV9jYWNoZV9nZXQocGFnZSk7CiAJCWRpby0+cGFnZXNbMF0gPSBwYWdlOwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSAxOworCQlzZGlvLT5oZWFkID0gMDsKKwkJc2Rpby0+dGFpbCA9IDE7CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZXQgPj0gMCkgewotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzICs9IHJldCAqIFBBR0VfU0laRTsKLQkJZGlvLT5jdXJyX3BhZ2UgKz0gcmV0OwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSByZXQ7CisJCXNkaW8tPmN1cnJfdXNlcl9hZGRyZXNzICs9IHJldCAqIFBBR0VfU0laRTsKKwkJc2Rpby0+Y3Vycl9wYWdlICs9IHJldDsKKwkJc2Rpby0+aGVhZCA9IDA7CisJCXNkaW8tPnRhaWwgPSByZXQ7CiAJCXJldCA9IDA7CiAJfQogb3V0OgpAQCAtMjM2LDE3ICsyNDUsMTggQEAKICAqIGRlY2VudCBudW1iZXIgb2YgcGFnZXMsIGxlc3MgZnJlcXVlbnRseS4gIFRvIHByb3ZpZGUgbmljZXIgdXNlIG9mIHRoZQogICogTDEgY2FjaGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZGlvX2dldF9wYWdlKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmRpb19nZXRfcGFnZShzdHJ1Y3QgZGlvICpkaW8sCisJCXN0cnVjdCBkaW9fc3VibWl0ICpzZGlvKQogewotCWlmIChkaW9fcGFnZXNfcHJlc2VudChkaW8pID09IDApIHsKKwlpZiAoZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykgPT0gMCkgewogCQlpbnQgcmV0OwogCi0JCXJldCA9IGRpb19yZWZpbGxfcGFnZXMoZGlvKTsKKwkJcmV0ID0gZGlvX3JlZmlsbF9wYWdlcyhkaW8sIHNkaW8pOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQkJQlVHX09OKGRpb19wYWdlc19wcmVzZW50KGRpbykgPT0gMCk7CisJCUJVR19PTihkaW9fcGFnZXNfcHJlc2VudChzZGlvKSA9PSAwKTsKIAl9Ci0JcmV0dXJuIGRpby0+cGFnZXNbZGlvLT5oZWFkKytdOworCXJldHVybiBkaW8tPnBhZ2VzW3NkaW8tPmhlYWQrK107CiB9CiAKIC8qKgpAQCAtMjkyLDcgKzMwMiw3IEBACiAKIAlpZiAoZGlvLT5lbmRfaW8gJiYgZGlvLT5yZXN1bHQpIHsKIAkJZGlvLT5lbmRfaW8oZGlvLT5pb2NiLCBvZmZzZXQsIHRyYW5zZmVycmVkLAotCQkJICAgIGRpby0+bWFwX2JoLmJfcHJpdmF0ZSwgcmV0LCBpc19hc3luYyk7CisJCQkgICAgZGlvLT5wcml2YXRlLCByZXQsIGlzX2FzeW5jKTsKIAl9IGVsc2UgewogCQlpZiAoaXNfYXN5bmMpCiAJCQlhaW9fY29tcGxldGUoZGlvLT5pb2NiLCByZXQsIDApOwpAQCAtMzIzLDcgKzMzMyw3IEBACiAKIAlpZiAocmVtYWluaW5nID09IDApIHsKIAkJZGlvX2NvbXBsZXRlKGRpbywgZGlvLT5pb2NiLT5raV9wb3MsIDAsIHRydWUpOwotCQlrZnJlZShkaW8pOworCQlrbWVtX2NhY2hlX2ZyZWUoZGlvX2NhY2hlLCBkaW8pOwogCX0KIH0KIApAQCAtMzY3LDkgKzM3NywxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGlvX2VuZF9pbyk7CiAKLXN0YXRpYyB2b2lkCi1kaW9fYmlvX2FsbG9jKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJc2VjdG9yX3QgZmlyc3Rfc2VjdG9yLCBpbnQgbnJfdmVjcykKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGlvX2Jpb19hbGxvYyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCSAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJICAgICAgc2VjdG9yX3QgZmlyc3Rfc2VjdG9yLCBpbnQgbnJfdmVjcykKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKQEAgLTM4Niw4ICszOTcsOCBAQAogCWVsc2UKIAkJYmlvLT5iaV9lbmRfaW8gPSBkaW9fYmlvX2VuZF9pbzsKIAotCWRpby0+YmlvID0gYmlvOwotCWRpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9mc19vZmZzZXQ7CisJc2Rpby0+YmlvID0gYmlvOworCXNkaW8tPmxvZ2ljYWxfb2Zmc2V0X2luX2JpbyA9IHNkaW8tPmN1cl9wYWdlX2ZzX29mZnNldDsKIH0KIAogLyoKQEAgLTM5Nyw5ICs0MDgsOSBAQAogICoKICAqIGJpb3MgaG9sZCBhIGRpbyByZWZlcmVuY2UgYmV0d2VlbiBzdWJtaXRfYmlvIGFuZCAtPmVuZF9pby4KICAqLwotc3RhdGljIHZvaWQgZGlvX2Jpb19zdWJtaXQoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSB2b2lkIGRpb19iaW9fc3VibWl0KHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8pCiB7Ci0Jc3RydWN0IGJpbyAqYmlvID0gZGlvLT5iaW87CisJc3RydWN0IGJpbyAqYmlvID0gc2Rpby0+YmlvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAliaW8tPmJpX3ByaXZhdGUgPSBkaW87CkBAIC00MTEsMjQgKzQyMiwyNCBAQAogCWlmIChkaW8tPmlzX2FzeW5jICYmIGRpby0+cncgPT0gUkVBRCkKIAkJYmlvX3NldF9wYWdlc19kaXJ0eShiaW8pOwogCi0JaWYgKGRpby0+c3VibWl0X2lvKQotCQlkaW8tPnN1Ym1pdF9pbyhkaW8tPnJ3LCBiaW8sIGRpby0+aW5vZGUsCi0JCQkgICAgICAgZGlvLT5sb2dpY2FsX29mZnNldF9pbl9iaW8pOworCWlmIChzZGlvLT5zdWJtaXRfaW8pCisJCXNkaW8tPnN1Ym1pdF9pbyhkaW8tPnJ3LCBiaW8sIGRpby0+aW5vZGUsCisJCQkgICAgICAgc2Rpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvKTsKIAllbHNlCiAJCXN1Ym1pdF9iaW8oZGlvLT5ydywgYmlvKTsKIAotCWRpby0+YmlvID0gTlVMTDsKLQlkaW8tPmJvdW5kYXJ5ID0gMDsKLQlkaW8tPmxvZ2ljYWxfb2Zmc2V0X2luX2JpbyA9IDA7CisJc2Rpby0+YmlvID0gTlVMTDsKKwlzZGlvLT5ib3VuZGFyeSA9IDA7CisJc2Rpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvID0gMDsKIH0KIAogLyoKICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBpbiBjYXNlIG9mIGEgZmFpbHVyZQogICovCi1zdGF0aWMgdm9pZCBkaW9fY2xlYW51cChzdHJ1Y3QgZGlvICpkaW8pCitzdGF0aWMgaW5saW5lIHZvaWQgZGlvX2NsZWFudXAoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKLQl3aGlsZSAoZGlvX3BhZ2VzX3ByZXNlbnQoZGlvKSkKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpb19nZXRfcGFnZShkaW8pKTsKKwl3aGlsZSAoZGlvX3BhZ2VzX3ByZXNlbnQoc2RpbykpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW9fZ2V0X3BhZ2UoZGlvLCBzZGlvKSk7CiB9CiAKIC8qCkBAIC01MTgsMTEgKzUyOSwxMSBAQAogICoKICAqIFRoaXMgYWxzbyBoZWxwcyB0byBsaW1pdCB0aGUgcGVhayBhbW91bnQgb2YgcGlubmVkIHVzZXJzcGFjZSBtZW1vcnkuCiAgKi8KLXN0YXRpYyBpbnQgZGlvX2Jpb19yZWFwKHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19iaW9fcmVhcChzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvKQogewogCWludCByZXQgPSAwOwogCi0JaWYgKGRpby0+cmVhcF9jb3VudGVyKysgPj0gNjQpIHsKKwlpZiAoc2Rpby0+cmVhcF9jb3VudGVyKysgPj0gNjQpIHsKIAkJd2hpbGUgKGRpby0+YmlvX2xpc3QpIHsKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlzdHJ1Y3QgYmlvICpiaW87CkBAIC01MzYsMTQgKzU0NywxNCBAQAogCQkJaWYgKHJldCA9PSAwKQogCQkJCXJldCA9IHJldDI7CiAJCX0KLQkJZGlvLT5yZWFwX2NvdW50ZXIgPSAwOworCQlzZGlvLT5yZWFwX2NvdW50ZXIgPSAwOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKgogICogQ2FsbCBpbnRvIHRoZSBmcyB0byBtYXAgc29tZSBtb3JlIGRpc2sgYmxvY2tzLiAgV2UgcmVjb3JkIHRoZSBjdXJyZW50IG51bWJlcgotICogb2YgYXZhaWxhYmxlIGJsb2NrcyBhdCBkaW8tPmJsb2Nrc19hdmFpbGFibGUuICBUaGVzZSBhcmUgaW4gdW5pdHMgb2YgdGhlCisgKiBvZiBhdmFpbGFibGUgYmxvY2tzIGF0IHNkaW8tPmJsb2Nrc19hdmFpbGFibGUuICBUaGVzZSBhcmUgaW4gdW5pdHMgb2YgdGhlCiAgKiBmcyBibG9ja3NpemUsICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpLgogICoKICAqIFRoZSBmcyBpcyBhbGxvd2VkIHRvIG1hcCBsb3RzIG9mIGJsb2NrcyBhdCBvbmNlLiAgSWYgaXQgd2FudHMgdG8gZG8gdGhhdCwKQEAgLTU2NCwxMCArNTc1LDEwIEBACiAgKiBidWZmZXJfbWFwcGVkKCkuICBIb3dldmVyIHRoZSBkaXJlY3QtaW8gY29kZSB3aWxsIG9ubHkgcHJvY2VzcyBob2xlcyBvbmUKICAqIGJsb2NrIGF0IGEgdGltZSAtIGl0IHdpbGwgcmVwZWF0ZWRseSBjYWxsIGdldF9ibG9jaygpIGFzIGl0IHdhbGtzIHRoZSBob2xlLgogICovCi1zdGF0aWMgaW50IGdldF9tb3JlX2Jsb2NrcyhzdHJ1Y3QgZGlvICpkaW8pCitzdGF0aWMgaW50IGdldF9tb3JlX2Jsb2NrcyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCA9ICZkaW8tPm1hcF9iaDsKIAlzZWN0b3JfdCBmc19zdGFydGJsazsJLyogSW50byBmaWxlLCBpbiBmaWxlc3lzdGVtLXNpemVkIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgZnNfY291bnQ7CS8qIE51bWJlciBvZiBmaWxlc3lzdGVtLXNpemVkIGJsb2NrcyAqLwogCXVuc2lnbmVkIGxvbmcgZGlvX2NvdW50Oy8qIE51bWJlciBvZiBkaW9fYmxvY2stc2l6ZWQgYmxvY2tzICovCkBAIC01ODAsMTEgKzU5MSwxMSBAQAogCSAqLwogCXJldCA9IGRpby0+cGFnZV9lcnJvcnM7CiAJaWYgKHJldCA9PSAwKSB7Ci0JCUJVR19PTihkaW8tPmJsb2NrX2luX2ZpbGUgPj0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKLQkJZnNfc3RhcnRibGsgPSBkaW8tPmJsb2NrX2luX2ZpbGUgPj4gZGlvLT5ibGtmYWN0b3I7Ci0JCWRpb19jb3VudCA9IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCAtIGRpby0+YmxvY2tfaW5fZmlsZTsKLQkJZnNfY291bnQgPSBkaW9fY291bnQgPj4gZGlvLT5ibGtmYWN0b3I7Ci0JCWJsa21hc2sgPSAoMSA8PCBkaW8tPmJsa2ZhY3RvcikgLSAxOworCQlCVUdfT04oc2Rpby0+YmxvY2tfaW5fZmlsZSA+PSBzZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKKwkJZnNfc3RhcnRibGsgPSBzZGlvLT5ibG9ja19pbl9maWxlID4+IHNkaW8tPmJsa2ZhY3RvcjsKKwkJZGlvX2NvdW50ID0gc2Rpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCAtIHNkaW8tPmJsb2NrX2luX2ZpbGU7CisJCWZzX2NvdW50ID0gZGlvX2NvdW50ID4+IHNkaW8tPmJsa2ZhY3RvcjsKKwkJYmxrbWFzayA9ICgxIDw8IHNkaW8tPmJsa2ZhY3RvcikgLSAxOwogCQlpZiAoZGlvX2NvdW50ICYgYmxrbWFzaykJCiAJCQlmc19jb3VudCsrOwogCkBAIC02MDQsMTMgKzYxNSwxNiBAQAogCQkgKi8KIAkJY3JlYXRlID0gZGlvLT5ydyAmIFdSSVRFOwogCQlpZiAoZGlvLT5mbGFncyAmIERJT19TS0lQX0hPTEVTKSB7Ci0JCQlpZiAoZGlvLT5ibG9ja19pbl9maWxlIDwgKGlfc2l6ZV9yZWFkKGRpby0+aW5vZGUpID4+Ci0JCQkJCQkJZGlvLT5ibGtiaXRzKSkKKwkJCWlmIChzZGlvLT5ibG9ja19pbl9maWxlIDwgKGlfc2l6ZV9yZWFkKGRpby0+aW5vZGUpID4+CisJCQkJCQkJc2Rpby0+YmxrYml0cykpCiAJCQkJY3JlYXRlID0gMDsKIAkJfQogCi0JCXJldCA9ICgqZGlvLT5nZXRfYmxvY2spKGRpby0+aW5vZGUsIGZzX3N0YXJ0YmxrLAorCQlyZXQgPSAoKnNkaW8tPmdldF9ibG9jaykoZGlvLT5pbm9kZSwgZnNfc3RhcnRibGssCiAJCQkJCQltYXBfYmgsIGNyZWF0ZSk7CisKKwkJLyogU3RvcmUgZm9yIGNvbXBsZXRpb24gKi8KKwkJZGlvLT5wcml2YXRlID0gbWFwX2JoLT5iX3ByaXZhdGU7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC02MTgsMjAgKzYzMiwyMSBAQAogLyoKICAqIFRoZXJlIGlzIG5vIGJpby4gIE1ha2Ugb25lIG5vdy4KICAqLwotc3RhdGljIGludCBkaW9fbmV3X2JpbyhzdHJ1Y3QgZGlvICpkaW8sIHNlY3Rvcl90IHN0YXJ0X3NlY3RvcikKK3N0YXRpYyBpbmxpbmUgaW50IGRpb19uZXdfYmlvKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8sCisJCXNlY3Rvcl90IHN0YXJ0X3NlY3Rvciwgc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCWludCByZXQsIG5yX3BhZ2VzOwogCi0JcmV0ID0gZGlvX2Jpb19yZWFwKGRpbyk7CisJcmV0ID0gZGlvX2Jpb19yZWFwKGRpbywgc2Rpbyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0Jc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChkaW8tPmJsa2JpdHMgLSA5KTsKLQlucl9wYWdlcyA9IG1pbihkaW8tPnBhZ2VzX2luX2lvLCBiaW9fZ2V0X25yX3ZlY3MoZGlvLT5tYXBfYmguYl9iZGV2KSk7CisJc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChzZGlvLT5ibGtiaXRzIC0gOSk7CisJbnJfcGFnZXMgPSBtaW4oc2Rpby0+cGFnZXNfaW5faW8sIGJpb19nZXRfbnJfdmVjcyhtYXBfYmgtPmJfYmRldikpOwogCW5yX3BhZ2VzID0gbWluKG5yX3BhZ2VzLCBCSU9fTUFYX1BBR0VTKTsKIAlCVUdfT04obnJfcGFnZXMgPD0gMCk7Ci0JZGlvX2Jpb19hbGxvYyhkaW8sIGRpby0+bWFwX2JoLmJfYmRldiwgc2VjdG9yLCBucl9wYWdlcyk7Ci0JZGlvLT5ib3VuZGFyeSA9IDA7CisJZGlvX2Jpb19hbGxvYyhkaW8sIHNkaW8sIG1hcF9iaC0+Yl9iZGV2LCBzZWN0b3IsIG5yX3BhZ2VzKTsKKwlzZGlvLT5ib3VuZGFyeSA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY0MywyMSArNjU4LDIxIEBACiAgKgogICogUmV0dXJuIHplcm8gb24gc3VjY2Vzcy4gIE5vbi16ZXJvIG1lYW5zIHRoZSBjYWxsZXIgbmVlZHMgdG8gc3RhcnQgYSBuZXcgQklPLgogICovCi1zdGF0aWMgaW50IGRpb19iaW9fYWRkX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSBpbnQgZGlvX2Jpb19hZGRfcGFnZShzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYmlvX2FkZF9wYWdlKGRpby0+YmlvLCBkaW8tPmN1cl9wYWdlLAotCQkJZGlvLT5jdXJfcGFnZV9sZW4sIGRpby0+Y3VyX3BhZ2Vfb2Zmc2V0KTsKLQlpZiAocmV0ID09IGRpby0+Y3VyX3BhZ2VfbGVuKSB7CisJcmV0ID0gYmlvX2FkZF9wYWdlKHNkaW8tPmJpbywgc2Rpby0+Y3VyX3BhZ2UsCisJCQlzZGlvLT5jdXJfcGFnZV9sZW4sIHNkaW8tPmN1cl9wYWdlX29mZnNldCk7CisJaWYgKHJldCA9PSBzZGlvLT5jdXJfcGFnZV9sZW4pIHsKIAkJLyoKIAkJICogRGVjcmVtZW50IGNvdW50IG9ubHksIGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwYWdlCiAJCSAqLwotCQlpZiAoKGRpby0+Y3VyX3BhZ2VfbGVuICsgZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKLQkJCWRpby0+cGFnZXNfaW5faW8tLTsKLQkJcGFnZV9jYWNoZV9nZXQoZGlvLT5jdXJfcGFnZSk7Ci0JCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9ibG9jayArCi0JCQkoZGlvLT5jdXJfcGFnZV9sZW4gPj4gZGlvLT5ibGtiaXRzKTsKKwkJaWYgKChzZGlvLT5jdXJfcGFnZV9sZW4gKyBzZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKKwkJCXNkaW8tPnBhZ2VzX2luX2lvLS07CisJCXBhZ2VfY2FjaGVfZ2V0KHNkaW8tPmN1cl9wYWdlKTsKKwkJc2Rpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gc2Rpby0+Y3VyX3BhZ2VfYmxvY2sgKworCQkJKHNkaW8tPmN1cl9wYWdlX2xlbiA+PiBzZGlvLT5ibGtiaXRzKTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewogCQlyZXQgPSAxOwpAQCAtNjc1LDE0ICs2OTAsMTUgQEAKICAqIFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgY3VyX3BhZ2UgZnJvbSB0aGUKICAqIGRpbywgYW5kIGZvciBkcm9wcGluZyB0aGUgcmVmY291bnQgd2hpY2ggY2FtZSBmcm9tIHRoYXQgcHJlc2VuY2UuCiAgKi8KLXN0YXRpYyBpbnQgZGlvX3NlbmRfY3VyX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGlubGluZSBpbnQgZGlvX3NlbmRfY3VyX3BhZ2Uoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbywKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICptYXBfYmgpCiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZGlvLT5iaW8pIHsKLQkJbG9mZl90IGN1cl9vZmZzZXQgPSBkaW8tPmN1cl9wYWdlX2ZzX29mZnNldDsKLQkJbG9mZl90IGJpb19uZXh0X29mZnNldCA9IGRpby0+bG9naWNhbF9vZmZzZXRfaW5fYmlvICsKLQkJCWRpby0+YmlvLT5iaV9zaXplOworCWlmIChzZGlvLT5iaW8pIHsKKwkJbG9mZl90IGN1cl9vZmZzZXQgPSBzZGlvLT5jdXJfcGFnZV9mc19vZmZzZXQ7CisJCWxvZmZfdCBiaW9fbmV4dF9vZmZzZXQgPSBzZGlvLT5sb2dpY2FsX29mZnNldF9pbl9iaW8gKworCQkJc2Rpby0+YmlvLT5iaV9zaXplOwogCiAJCS8qCiAJCSAqIFNlZSB3aGV0aGVyIHRoaXMgbmV3IHJlcXVlc3QgaXMgY29udGlndW91cyB3aXRoIHRoZSBvbGQuCkBAIC02OTgsMjggKzcxNCwyOCBAQAogCQkgKiBiZSB0aGUgbmV4dCBsb2dpY2FsIG9mZnNldCBpbiB0aGUgYmlvLCBzdWJtaXQgdGhlIGJpbyB3ZQogCQkgKiBoYXZlLgogCQkgKi8KLQkJaWYgKGRpby0+ZmluYWxfYmxvY2tfaW5fYmlvICE9IGRpby0+Y3VyX3BhZ2VfYmxvY2sgfHwKKwkJaWYgKHNkaW8tPmZpbmFsX2Jsb2NrX2luX2JpbyAhPSBzZGlvLT5jdXJfcGFnZV9ibG9jayB8fAogCQkgICAgY3VyX29mZnNldCAhPSBiaW9fbmV4dF9vZmZzZXQpCi0JCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQkJZGlvX2Jpb19zdWJtaXQoZGlvLCBzZGlvKTsKIAkJLyoKIAkJICogU3VibWl0IG5vdyBpZiB0aGUgdW5kZXJseWluZyBmcyBpcyBhYm91dCB0byBwZXJmb3JtIGEKIAkJICogbWV0YWRhdGEgcmVhZAogCQkgKi8KLQkJZWxzZSBpZiAoZGlvLT5ib3VuZGFyeSkKLQkJCWRpb19iaW9fc3VibWl0KGRpbyk7CisJCWVsc2UgaWYgKHNkaW8tPmJvdW5kYXJ5KQorCQkJZGlvX2Jpb19zdWJtaXQoZGlvLCBzZGlvKTsKIAl9CiAKLQlpZiAoZGlvLT5iaW8gPT0gTlVMTCkgewotCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIGRpby0+Y3VyX3BhZ2VfYmxvY2spOworCWlmIChzZGlvLT5iaW8gPT0gTlVMTCkgeworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIHNkaW8sIHNkaW8tPmN1cl9wYWdlX2Jsb2NrLCBtYXBfYmgpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRpb19iaW9fYWRkX3BhZ2UoZGlvKSAhPSAwKSB7Ci0JCWRpb19iaW9fc3VibWl0KGRpbyk7Ci0JCXJldCA9IGRpb19uZXdfYmlvKGRpbywgZGlvLT5jdXJfcGFnZV9ibG9jayk7CisJaWYgKGRpb19iaW9fYWRkX3BhZ2Uoc2RpbykgIT0gMCkgeworCQlkaW9fYmlvX3N1Ym1pdChkaW8sIHNkaW8pOworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIHNkaW8sIHNkaW8tPmN1cl9wYWdlX2Jsb2NrLCBtYXBfYmgpOwogCQlpZiAocmV0ID09IDApIHsKLQkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2UoZGlvKTsKKwkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2Uoc2Rpbyk7CiAJCQlCVUdfT04ocmV0ICE9IDApOwogCQl9CiAJfQpAQCAtNzQ0LDkgKzc2MCwxMCBAQAogICogSWYgdGhhdCBkb2Vzbid0IHdvcmsgb3V0IHRoZW4gd2UgcHV0IHRoZSBvbGQgcGFnZSBpbnRvIHRoZSBiaW8gYW5kIGFkZCB0aGlzCiAgKiBwYWdlIHRvIHRoZSBkaW8gaW5zdGVhZC4KICAqLwotc3RhdGljIGludAotc3VibWl0X3BhZ2Vfc2VjdGlvbihzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBwYWdlICpwYWdlLAotCQl1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbiwgc2VjdG9yX3QgYmxvY2tucikKK3N0YXRpYyBpbmxpbmUgaW50CitzdWJtaXRfcGFnZV9zZWN0aW9uKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGRpb19zdWJtaXQgKnNkaW8sIHN0cnVjdCBwYWdlICpwYWdlLAorCQkgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW4sIHNlY3Rvcl90IGJsb2NrbnIsCisJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNzYwLDIwICs3NzcsMjAgQEAKIAkvKgogCSAqIENhbiB3ZSBqdXN0IGdyb3cgdGhlIGN1cnJlbnQgcGFnZSdzIHByZXNlbmNlIGluIHRoZSBkaW8/CiAJICovCi0JaWYgKAkoZGlvLT5jdXJfcGFnZSA9PSBwYWdlKSAmJgotCQkoZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBkaW8tPmN1cl9wYWdlX2xlbiA9PSBvZmZzZXQpICYmCi0JCShkaW8tPmN1cl9wYWdlX2Jsb2NrICsKLQkJCShkaW8tPmN1cl9wYWdlX2xlbiA+PiBkaW8tPmJsa2JpdHMpID09IGJsb2NrbnIpKSB7Ci0JCWRpby0+Y3VyX3BhZ2VfbGVuICs9IGxlbjsKKwlpZiAoc2Rpby0+Y3VyX3BhZ2UgPT0gcGFnZSAmJgorCSAgICBzZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBzZGlvLT5jdXJfcGFnZV9sZW4gPT0gb2Zmc2V0ICYmCisJICAgIHNkaW8tPmN1cl9wYWdlX2Jsb2NrICsKKwkgICAgKHNkaW8tPmN1cl9wYWdlX2xlbiA+PiBzZGlvLT5ibGtiaXRzKSA9PSBibG9ja25yKSB7CisJCXNkaW8tPmN1cl9wYWdlX2xlbiArPSBsZW47CiAKIAkJLyoKLQkJICogSWYgZGlvLT5ib3VuZGFyeSB0aGVuIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhlIElPIG5vdyB0bworCQkgKiBJZiBzZGlvLT5ib3VuZGFyeSB0aGVuIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhlIElPIG5vdyB0bwogCQkgKiBhdm9pZCBtZXRhZGF0YSBzZWVrcy4KIAkJICovCi0JCWlmIChkaW8tPmJvdW5kYXJ5KSB7Ci0JCQlyZXQgPSBkaW9fc2VuZF9jdXJfcGFnZShkaW8pOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpby0+Y3VyX3BhZ2UpOwotCQkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJCWlmIChzZGlvLT5ib3VuZGFyeSkgeworCQkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvLCBzZGlvLCBtYXBfYmgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHNkaW8tPmN1cl9wYWdlKTsKKwkJCXNkaW8tPmN1cl9wYWdlID0gTlVMTDsKIAkJfQogCQlnb3RvIG91dDsKIAl9CkBAIC03ODEsMjAgKzc5OCwyMCBAQAogCS8qCiAJICogSWYgdGhlcmUncyBhIGRlZmVycmVkIHBhZ2UgYWxyZWFkeSB0aGVyZSB0aGVuIHNlbmQgaXQuCiAJICovCi0JaWYgKGRpby0+Y3VyX3BhZ2UpIHsKLQkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpby0+Y3VyX3BhZ2UpOwotCQlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKwlpZiAoc2Rpby0+Y3VyX3BhZ2UpIHsKKwkJcmV0ID0gZGlvX3NlbmRfY3VyX3BhZ2UoZGlvLCBzZGlvLCBtYXBfYmgpOworCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc2Rpby0+Y3VyX3BhZ2UpOworCQlzZGlvLT5jdXJfcGFnZSA9IE5VTEw7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAlwYWdlX2NhY2hlX2dldChwYWdlKTsJCS8qIEl0IGlzIGluIGRpbyAqLwotCWRpby0+Y3VyX3BhZ2UgPSBwYWdlOwotCWRpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OwotCWRpby0+Y3VyX3BhZ2VfbGVuID0gbGVuOwotCWRpby0+Y3VyX3BhZ2VfYmxvY2sgPSBibG9ja25yOwotCWRpby0+Y3VyX3BhZ2VfZnNfb2Zmc2V0ID0gZGlvLT5ibG9ja19pbl9maWxlIDw8IGRpby0+YmxrYml0czsKKwlzZGlvLT5jdXJfcGFnZSA9IHBhZ2U7CisJc2Rpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCXNkaW8tPmN1cl9wYWdlX2xlbiA9IGxlbjsKKwlzZGlvLT5jdXJfcGFnZV9ibG9jayA9IGJsb2NrbnI7CisJc2Rpby0+Y3VyX3BhZ2VfZnNfb2Zmc2V0ID0gc2Rpby0+YmxvY2tfaW5fZmlsZSA8PCBzZGlvLT5ibGtiaXRzOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC04MDQsMTYgKzgyMSwxNiBAQAogICogZmlsZSBibG9ja3MuICBPbmx5IGNhbGxlZCBmb3IgU19JU1JFRyBmaWxlcyAtIGJsb2NrZGV2cyBkbyBub3Qgc2V0CiAgKiBidWZmZXJfbmV3CiAgKi8KLXN0YXRpYyB2b2lkIGNsZWFuX2Jsb2NrZGV2X2FsaWFzZXMoc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIHZvaWQgY2xlYW5fYmxvY2tkZXZfYWxpYXNlcyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoKQogewogCXVuc2lnbmVkIGk7CiAJdW5zaWduZWQgbmJsb2NrczsKIAotCW5ibG9ja3MgPSBkaW8tPm1hcF9iaC5iX3NpemUgPj4gZGlvLT5pbm9kZS0+aV9ibGtiaXRzOworCW5ibG9ja3MgPSBtYXBfYmgtPmJfc2l6ZSA+PiBkaW8tPmlub2RlLT5pX2Jsa2JpdHM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKSB7Ci0JCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoZGlvLT5tYXBfYmguYl9iZGV2LAotCQkJCQlkaW8tPm1hcF9iaC5iX2Jsb2NrbnIgKyBpKTsKKwkJdW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YShtYXBfYmgtPmJfYmRldiwKKwkJCQkJICBtYXBfYmgtPmJfYmxvY2tuciArIGkpOwogCX0KIH0KIApAQCAtODI2LDE5ICs4NDMsMjAgQEAKICAqIGBlbmQnIGlzIHplcm8gaWYgd2UncmUgZG9pbmcgdGhlIHN0YXJ0IG9mIHRoZSBJTywgMSBhdCB0aGUgZW5kIG9mIHRoZQogICogSU8uCiAgKi8KLXN0YXRpYyB2b2lkIGRpb196ZXJvX2Jsb2NrKHN0cnVjdCBkaW8gKmRpbywgaW50IGVuZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaW9femVyb19ibG9jayhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBkaW9fc3VibWl0ICpzZGlvLAorCQlpbnQgZW5kLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCkKIHsKIAl1bnNpZ25lZCBkaW9fYmxvY2tzX3Blcl9mc19ibG9jazsKIAl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogSW4gZGlvX2Jsb2NrcyAqLwogCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7Ci0JaWYgKCFkaW8tPmJsa2ZhY3RvciB8fCAhYnVmZmVyX25ldygmZGlvLT5tYXBfYmgpKQorCXNkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7CisJaWYgKCFzZGlvLT5ibGtmYWN0b3IgfHwgIWJ1ZmZlcl9uZXcobWFwX2JoKSkKIAkJcmV0dXJuOwogCi0JZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgPSAxIDw8IGRpby0+YmxrZmFjdG9yOwotCXRoaXNfY2h1bmtfYmxvY2tzID0gZGlvLT5ibG9ja19pbl9maWxlICYgKGRpb19ibG9ja3NfcGVyX2ZzX2Jsb2NrIC0gMSk7CisJZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgPSAxIDw8IHNkaW8tPmJsa2ZhY3RvcjsKKwl0aGlzX2NodW5rX2Jsb2NrcyA9IHNkaW8tPmJsb2NrX2luX2ZpbGUgJiAoZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSAxKTsKIAogCWlmICghdGhpc19jaHVua19ibG9ja3MpCiAJCXJldHVybjsKQEAgLTg1MCwxNCArODY4LDE0IEBACiAJaWYgKGVuZCkgCiAJCXRoaXNfY2h1bmtfYmxvY2tzID0gZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSB0aGlzX2NodW5rX2Jsb2NrczsKIAotCXRoaXNfY2h1bmtfYnl0ZXMgPSB0aGlzX2NodW5rX2Jsb2NrcyA8PCBkaW8tPmJsa2JpdHM7CisJdGhpc19jaHVua19ieXRlcyA9IHRoaXNfY2h1bmtfYmxvY2tzIDw8IHNkaW8tPmJsa2JpdHM7CiAKIAlwYWdlID0gWkVST19QQUdFKDApOwotCWlmIChzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgMCwgdGhpc19jaHVua19ieXRlcywgCi0JCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbykpCisJaWYgKHN1Ym1pdF9wYWdlX3NlY3Rpb24oZGlvLCBzZGlvLCBwYWdlLCAwLCB0aGlzX2NodW5rX2J5dGVzLAorCQkJCXNkaW8tPm5leHRfYmxvY2tfZm9yX2lvLCBtYXBfYmgpKQogCQlyZXR1cm47CiAKLQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCXNkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOwogfQogCiAvKgpAQCAtODc2LDIwICs4OTQsMjAgQEAKICAqIGl0IHNob3VsZCBzZXQgYl9zaXplIHRvIFBBR0VfU0laRSBvciBtb3JlIGluc2lkZSBnZXRfYmxvY2soKS4gIFRoaXMgZ2l2ZXMKICAqIGZpbmUgYWxpZ25tZW50IGJ1dCBzdGlsbCBhbGxvd3MgdGhpcyBmdW5jdGlvbiB0byB3b3JrIGluIFBBR0VfU0laRSB1bml0cy4KICAqLwotc3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIGludCBkb19kaXJlY3RfSU8oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgZGlvX3N1Ym1pdCAqc2RpbywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoKQogewotCWNvbnN0IHVuc2lnbmVkIGJsa2JpdHMgPSBkaW8tPmJsa2JpdHM7CisJY29uc3QgdW5zaWduZWQgYmxrYml0cyA9IHNkaW8tPmJsa2JpdHM7CiAJY29uc3QgdW5zaWduZWQgYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9TSVpFID4+IGJsa2JpdHM7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgYmxvY2tfaW5fcGFnZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcF9iaCA9ICZkaW8tPm1hcF9iaDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIFRoZSBJL08gY2FuIHN0YXJ0IGF0IGFueSBibG9jayBvZmZzZXQgd2l0aGluIHRoZSBmaXJzdCBwYWdlICovCi0JYmxvY2tfaW5fcGFnZSA9IGRpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZTsKKwlibG9ja19pbl9wYWdlID0gc2Rpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZTsKIAotCXdoaWxlIChkaW8tPmJsb2NrX2luX2ZpbGUgPCBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpIHsKLQkJcGFnZSA9IGRpb19nZXRfcGFnZShkaW8pOworCXdoaWxlIChzZGlvLT5ibG9ja19pbl9maWxlIDwgc2Rpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCkgeworCQlwYWdlID0gZGlvX2dldF9wYWdlKGRpbywgc2Rpbyk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIG91dDsKQEAgLTkwMSwxNCArOTE5LDE0IEBACiAJCQl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogIyBvZiBibG9ja3MgKi8KIAkJCXVuc2lnbmVkIHU7CiAKLQkJCWlmIChkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgeworCQkJaWYgKHNkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgewogCQkJCS8qCiAJCQkJICogTmVlZCB0byBnbyBhbmQgbWFwIHNvbWUgbW9yZSBkaXNrCiAJCQkJICovCiAJCQkJdW5zaWduZWQgbG9uZyBibGttYXNrOwogCQkJCXVuc2lnbmVkIGxvbmcgZGlvX3JlbWFpbmRlcjsKIAotCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8pOworCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8sIHNkaW8sIG1hcF9iaCk7CiAJCQkJaWYgKHJldCkgewogCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJCWdvdG8gb3V0OwpAQCAtOTE2LDE4ICs5MzQsMTggQEAKIAkJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQobWFwX2JoKSkKIAkJCQkJZ290byBkb19ob2xlczsKIAotCQkJCWRpby0+YmxvY2tzX2F2YWlsYWJsZSA9Ci0JCQkJCQltYXBfYmgtPmJfc2l6ZSA+PiBkaW8tPmJsa2JpdHM7Ci0JCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9Ci0JCQkJCW1hcF9iaC0+Yl9ibG9ja25yIDw8IGRpby0+YmxrZmFjdG9yOworCQkJCXNkaW8tPmJsb2Nrc19hdmFpbGFibGUgPQorCQkJCQkJbWFwX2JoLT5iX3NpemUgPj4gc2Rpby0+YmxrYml0czsKKwkJCQlzZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9CisJCQkJCW1hcF9iaC0+Yl9ibG9ja25yIDw8IHNkaW8tPmJsa2ZhY3RvcjsKIAkJCQlpZiAoYnVmZmVyX25ldyhtYXBfYmgpKQotCQkJCQljbGVhbl9ibG9ja2Rldl9hbGlhc2VzKGRpbyk7CisJCQkJCWNsZWFuX2Jsb2NrZGV2X2FsaWFzZXMoZGlvLCBtYXBfYmgpOwogCi0JCQkJaWYgKCFkaW8tPmJsa2ZhY3RvcikKKwkJCQlpZiAoIXNkaW8tPmJsa2ZhY3RvcikKIAkJCQkJZ290byBkb19ob2xlczsKIAotCQkJCWJsa21hc2sgPSAoMSA8PCBkaW8tPmJsa2ZhY3RvcikgLSAxOwotCQkJCWRpb19yZW1haW5kZXIgPSAoZGlvLT5ibG9ja19pbl9maWxlICYgYmxrbWFzayk7CisJCQkJYmxrbWFzayA9ICgxIDw8IHNkaW8tPmJsa2ZhY3RvcikgLSAxOworCQkJCWRpb19yZW1haW5kZXIgPSAoc2Rpby0+YmxvY2tfaW5fZmlsZSAmIGJsa21hc2spOwogCiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIElPIGFuZCB0aGF0IElPCkBAIC05NDEsOCArOTU5LDggQEAKIAkJCQkgKiBvbi1kaXNrCiAJCQkJICovCiAJCQkJaWYgKCFidWZmZXJfbmV3KG1hcF9iaCkpCi0JCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKLQkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgLT0gZGlvX3JlbWFpbmRlcjsKKwkJCQkJc2Rpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKKwkJCQlzZGlvLT5ibG9ja3NfYXZhaWxhYmxlIC09IGRpb19yZW1haW5kZXI7CiAJCQl9CiBkb19ob2xlczoKIAkJCS8qIEhhbmRsZSBob2xlcyAqLwpAQCAtOTYxLDcgKzk3OSw3IEBACiAJCQkJICovCiAJCQkJaV9zaXplX2FsaWduZWQgPSBBTElHTihpX3NpemVfcmVhZChkaW8tPmlub2RlKSwKIAkJCQkJCQkxIDw8IGJsa2JpdHMpOwotCQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPj0KKwkJCQlpZiAoc2Rpby0+YmxvY2tfaW5fZmlsZSA+PQogCQkJCQkJaV9zaXplX2FsaWduZWQgPj4gYmxrYml0cykgewogCQkJCQkvKiBXZSBoaXQgZW9mICovCiAJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTk2OSw3ICs5ODcsNyBAQAogCQkJCX0KIAkJCQl6ZXJvX3VzZXIocGFnZSwgYmxvY2tfaW5fcGFnZSA8PCBibGtiaXRzLAogCQkJCQkJMSA8PCBibGtiaXRzKTsKLQkJCQlkaW8tPmJsb2NrX2luX2ZpbGUrKzsKKwkJCQlzZGlvLT5ibG9ja19pbl9maWxlKys7CiAJCQkJYmxvY2tfaW5fcGFnZSsrOwogCQkJCWdvdG8gbmV4dF9ibG9jazsKIAkJCX0KQEAgLTk3OSwzOCArOTk3LDQxIEBACiAJCQkgKiBpcyBmaW5lciB0aGFuIHRoZSB1bmRlcmx5aW5nIGZzLCBnbyBjaGVjayB0byBzZWUgaWYKIAkJCSAqIHdlIG11c3QgemVybyBvdXQgdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvciAmJiAhZGlvLT5zdGFydF96ZXJvX2RvbmUpKQotCQkJCWRpb196ZXJvX2Jsb2NrKGRpbywgMCk7CisJCQlpZiAodW5saWtlbHkoc2Rpby0+YmxrZmFjdG9yICYmICFzZGlvLT5zdGFydF96ZXJvX2RvbmUpKQorCQkJCWRpb196ZXJvX2Jsb2NrKGRpbywgc2RpbywgMCwgbWFwX2JoKTsKIAogCQkJLyoKIAkJCSAqIFdvcmsgb3V0LCBpbiB0aGlzX2NodW5rX2Jsb2NrcywgaG93IG11Y2ggZGlzayB3ZQogCQkJICogY2FuIGFkZCB0byB0aGlzIHBhZ2UKIAkJCSAqLwotCQkJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2Nrc19hdmFpbGFibGU7CisJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHNkaW8tPmJsb2Nrc19hdmFpbGFibGU7CiAJCQl1ID0gKFBBR0VfU0laRSAtIG9mZnNldF9pbl9wYWdlKSA+PiBibGtiaXRzOwogCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKIAkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7Ci0JCQl1ID0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlOworCQkJdSA9IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBzZGlvLT5ibG9ja19pbl9maWxlOwogCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKIAkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CiAJCQl0aGlzX2NodW5rX2J5dGVzID0gdGhpc19jaHVua19ibG9ja3MgPDwgYmxrYml0czsKIAkJCUJVR19PTih0aGlzX2NodW5rX2J5dGVzID09IDApOwogCi0JCQlkaW8tPmJvdW5kYXJ5ID0gYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCk7Ci0JCQlyZXQgPSBzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgb2Zmc2V0X2luX3BhZ2UsCi0JCQkJdGhpc19jaHVua19ieXRlcywgZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyk7CisJCQlzZGlvLT5ib3VuZGFyeSA9IGJ1ZmZlcl9ib3VuZGFyeShtYXBfYmgpOworCQkJcmV0ID0gc3VibWl0X3BhZ2Vfc2VjdGlvbihkaW8sIHNkaW8sIHBhZ2UsCisJCQkJCQkgIG9mZnNldF9pbl9wYWdlLAorCQkJCQkJICB0aGlzX2NodW5rX2J5dGVzLAorCQkJCQkJICBzZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbywKKwkJCQkJCSAgbWFwX2JoKTsKIAkJCWlmIChyZXQpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJc2Rpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gdGhpc19jaHVua19ibG9ja3M7CiAKLQkJCWRpby0+YmxvY2tfaW5fZmlsZSArPSB0aGlzX2NodW5rX2Jsb2NrczsKKwkJCXNkaW8tPmJsb2NrX2luX2ZpbGUgKz0gdGhpc19jaHVua19ibG9ja3M7CiAJCQlibG9ja19pbl9wYWdlICs9IHRoaXNfY2h1bmtfYmxvY2tzOwotCQkJZGlvLT5ibG9ja3NfYXZhaWxhYmxlIC09IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJc2Rpby0+YmxvY2tzX2F2YWlsYWJsZSAtPSB0aGlzX2NodW5rX2Jsb2NrczsKIG5leHRfYmxvY2s6Ci0JCQlCVUdfT04oZGlvLT5ibG9ja19pbl9maWxlID4gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKLQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPT0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KQorCQkJQlVHX09OKHNkaW8tPmJsb2NrX2luX2ZpbGUgPiBzZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KTsKKwkJCWlmIChzZGlvLT5ibG9ja19pbl9maWxlID09IHNkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMTAyMiwxMzUgKzEwNDMsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdAotZGlyZWN0X2lvX3dvcmtlcihpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwgCi0JY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgCi0JdW5zaWduZWQgYmxrYml0cywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrLCBkaW9faW9kb25lX3QgZW5kX2lvLAotCWRpb19zdWJtaXRfdCBzdWJtaXRfaW8sIHN0cnVjdCBkaW8gKmRpbykKK3N0YXRpYyBpbmxpbmUgaW50IGRyb3BfcmVmY291bnQoc3RydWN0IGRpbyAqZGlvKQogewotCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOyAKKwlpbnQgcmV0MjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzZWc7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXNzaXplX3QgcmV0MjsKLQlzaXplX3QgYnl0ZXM7Ci0KLQlkaW8tPmlub2RlID0gaW5vZGU7Ci0JZGlvLT5ydyA9IHJ3OwotCWRpby0+YmxrYml0cyA9IGJsa2JpdHM7Ci0JZGlvLT5ibGtmYWN0b3IgPSBpbm9kZS0+aV9ibGtiaXRzIC0gYmxrYml0czsKLQlkaW8tPmJsb2NrX2luX2ZpbGUgPSBvZmZzZXQgPj4gYmxrYml0czsKLQotCWRpby0+Z2V0X2Jsb2NrID0gZ2V0X2Jsb2NrOwotCWRpby0+ZW5kX2lvID0gZW5kX2lvOwotCWRpby0+c3VibWl0X2lvID0gc3VibWl0X2lvOwotCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gLTE7Ci0JZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyA9IC0xOwotCi0JZGlvLT5pb2NiID0gaW9jYjsKLQlkaW8tPmlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQotCXNwaW5fbG9ja19pbml0KCZkaW8tPmJpb19sb2NrKTsKLQlkaW8tPnJlZmNvdW50ID0gMTsKLQotCS8qCi0JICogSW4gY2FzZSBvZiBub24tYWxpZ25lZCBidWZmZXJzLCB3ZSBtYXkgbmVlZCAyIG1vcmUKLQkgKiBwYWdlcyBzaW5jZSB3ZSBuZWVkIHRvIHplcm8gb3V0IGZpcnN0IGFuZCBsYXN0IGJsb2NrLgotCSAqLwotCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvcikpCi0JCWRpby0+cGFnZXNfaW5faW8gPSAyOwotCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQl1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJZGlvLT5wYWdlc19pbl9pbyArPQotCQkJKCh1c2VyX2FkZHIraW92W3NlZ10uaW92X2xlbiArUEFHRV9TSVpFLTEpL1BBR0VfU0laRQotCQkJCS0gdXNlcl9hZGRyL1BBR0VfU0laRSk7Ci0JfQotCi0JZm9yIChzZWcgPSAwOyBzZWcgPCBucl9zZWdzOyBzZWcrKykgewotCQl1c2VyX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3Zbc2VnXS5pb3ZfYmFzZTsKLQkJZGlvLT5zaXplICs9IGJ5dGVzID0gaW92W3NlZ10uaW92X2xlbjsKLQotCQkvKiBJbmRleCBpbnRvIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBmaXJzdCBibG9jayAqLwotCQlkaW8tPmZpcnN0X2Jsb2NrX2luX3BhZ2UgPSAodXNlcl9hZGRyICYgflBBR0VfTUFTSykgPj4gYmxrYml0czsKLQkJZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0ID0gZGlvLT5ibG9ja19pbl9maWxlICsKLQkJCQkJCShieXRlcyA+PiBibGtiaXRzKTsKLQkJLyogUGFnZSBmZXRjaGluZyBzdGF0ZSAqLwotCQlkaW8tPmhlYWQgPSAwOwotCQlkaW8tPnRhaWwgPSAwOwotCQlkaW8tPmN1cnJfcGFnZSA9IDA7Ci0KLQkJZGlvLT50b3RhbF9wYWdlcyA9IDA7Ci0JCWlmICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFLTEpKSB7Ci0JCQlkaW8tPnRvdGFsX3BhZ2VzKys7Ci0JCQlieXRlcyAtPSBQQUdFX1NJWkUgLSAodXNlcl9hZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKLQkJfQotCQlkaW8tPnRvdGFsX3BhZ2VzICs9IChieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwotCQlkaW8tPmN1cnJfdXNlcl9hZGRyZXNzID0gdXNlcl9hZGRyOwotCQotCQlyZXQgPSBkb19kaXJlY3RfSU8oZGlvKTsKLQotCQlkaW8tPnJlc3VsdCArPSBpb3Zbc2VnXS5pb3ZfbGVuIC0KLQkJCSgoZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlKSA8PAotCQkJCQlibGtiaXRzKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkaW9fY2xlYW51cChkaW8pOwotCQkJYnJlYWs7Ci0JCX0KLQl9IC8qIGVuZCBpb3ZlYyBsb29wICovCi0KLQlpZiAocmV0ID09IC1FTk9UQkxLKSB7Ci0JCS8qCi0JCSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgcmVxdWVzdCB3aWxsIGJlCi0JCSAqIGJlIGhhbmRsZWQgYnkgYnVmZmVyZWQgSS9PIHdoZW4gd2UgcmV0dXJuCi0JCSAqLwotCQlyZXQgPSAwOwotCX0KLQkvKgotCSAqIFRoZXJlIG1heSBiZSBzb21lIHVud3JpdHRlbiBkaXNrIGF0IHRoZSBlbmQgb2YgYSBwYXJ0LXdyaXR0ZW4KLQkgKiBmcy1ibG9jay1zaXplZCBibG9jay4gIEdvIHplcm8gdGhhdCBub3cuCi0JICovCi0JZGlvX3plcm9fYmxvY2soZGlvLCAxKTsKLQotCWlmIChkaW8tPmN1cl9wYWdlKSB7Ci0JCXJldDIgPSBkaW9fc2VuZF9jdXJfcGFnZShkaW8pOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSByZXQyOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvLT5jdXJfcGFnZSk7Ci0JCWRpby0+Y3VyX3BhZ2UgPSBOVUxMOwotCX0KLQlpZiAoZGlvLT5iaW8pCi0JCWRpb19iaW9fc3VibWl0KGRpbyk7Ci0KLQkvKgotCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQsIHdlIHJldHVybiBzaG9ydCBJTyBkdWUgdG8gZW5kIG9mIGZpbGUuCi0JICogSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHJlbGVhc2UgYWxsIHRoZSBwYWdlcyB3ZSBnb3QgaG9sZCBvbi4KLQkgKi8KLQlkaW9fY2xlYW51cChkaW8pOwotCi0JLyoKLQkgKiBBbGwgYmxvY2sgbG9va3VwcyBoYXZlIGJlZW4gcGVyZm9ybWVkLiBGb3IgUkVBRCByZXF1ZXN0cwotCSAqIHdlIGNhbiBsZXQgaV9tdXRleCBnbyBub3cgdGhhdCBpdHMgYWNoaWV2ZWQgaXRzIHB1cnBvc2UKLQkgKiBvZiBwcm90ZWN0aW5nIHVzIGZyb20gbG9va2luZyB1cCB1bmluaXRpYWxpemVkIGJsb2Nrcy4KLQkgKi8KLQlpZiAocncgPT0gUkVBRCAmJiAoZGlvLT5mbGFncyAmIERJT19MT0NLSU5HKSkKLQkJbXV0ZXhfdW5sb2NrKCZkaW8tPmlub2RlLT5pX211dGV4KTsKLQotCS8qCi0JICogVGhlIG9ubHkgdGltZSB3ZSB3YW50IHRvIGxlYXZlIGJpb3MgaW4gZmxpZ2h0IGlzIHdoZW4gYSBzdWNjZXNzZnVsCi0JICogcGFydGlhbCBhaW8gcmVhZCBvciBmdWxsIGFpbyB3cml0ZSBoYXZlIGJlZW4gc2V0dXAuICBJbiB0aGF0IGNhc2UKLQkgKiBiaW8gY29tcGxldGlvbiB3aWxsIGNhbGwgYWlvX2NvbXBsZXRlLiAgVGhlIG9ubHkgdGltZSBpdCdzIHNhZmUgdG8KLQkgKiBjYWxsIGFpb19jb21wbGV0ZSBpcyB3aGVuIHdlIHJldHVybiAtRUlPQ0JRVUVVRUQsIHNvIHdlIGtleSBvbiB0aGF0LgotCSAqIFRoaXMgaGFkICpiZXR0ZXIqIGJlIHRoZSBvbmx5IHBsYWNlIHRoYXQgcmFpc2VzIC1FSU9DQlFVRVVFRC4KLQkgKi8KLQlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCk7Ci0JaWYgKGRpby0+aXNfYXN5bmMgJiYgcmV0ID09IDAgJiYgZGlvLT5yZXN1bHQgJiYKLQkgICAgKChydyAmIFJFQUQpIHx8IChkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpKSkKLQkJcmV0ID0gLUVJT0NCUVVFVUVEOwotCi0JaWYgKHJldCAhPSAtRUlPQ0JRVUVVRUQpCi0JCWRpb19hd2FpdF9jb21wbGV0aW9uKGRpbyk7CiAKIAkvKgogCSAqIFN5bmMgd2lsbCBhbHdheXMgYmUgZHJvcHBpbmcgdGhlIGZpbmFsIHJlZiBhbmQgY29tcGxldGluZyB0aGUKQEAgLTExNjYsMTQgKzEwNjIsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CiAJcmV0MiA9IC0tZGlvLT5yZWZjb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmV0MiA9PSAwKSB7Ci0JCXJldCA9IGRpb19jb21wbGV0ZShkaW8sIG9mZnNldCwgcmV0LCBmYWxzZSk7Ci0JCWtmcmVlKGRpbyk7Ci0JfSBlbHNlCi0JCUJVR19PTihyZXQgIT0gLUVJT0NCUVVFVUVEKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldDI7CiB9CiAKIC8qCkBAIC0xMTk1LDYgKzEwODQsMTEgQEAKICAqIGV4cGVjdGVkIHRoYXQgZmlsZXN5c3RlbSBwcm92aWRlIGV4Y2x1c2lvbiBiZXR3ZWVuIG5ldyBkaXJlY3QgSS9PCiAgKiBhbmQgdHJ1bmNhdGVzLiAgRm9yIERJT19MT0NLSU5HIGZpbGVzeXN0ZW1zIHRoaXMgaXMgZG9uZSBieSBpX211dGV4LAogICogYnV0IG90aGVyIGZpbGVzeXN0ZW1zIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoaXMgb24gdGhlaXIgb3duLgorICoKKyAqIE5PVEU6IGlmIHlvdSBwYXNzICJzZGlvIiB0byBhbnl0aGluZyBieSBwb2ludGVyIG1ha2Ugc3VyZSB0aGF0IGZ1bmN0aW9uCisgKiBpcyBhbHdheXMgaW5saW5lZC4gT3RoZXJ3aXNlIGdjYyBpcyB1bmFibGUgdG8gc3BsaXQgdGhlIHN0cnVjdHVyZSBpbnRvCisgKiBpbmRpdmlkdWFsIGZpZWxkcyBhbmQgd2lsbCBnZW5lcmF0ZSBtdWNoIHdvcnNlIGNvZGUuIFRoaXMgaXMgaW1wb3J0YW50CisgKiBmb3IgdGhlIHdob2xlIGZpbGUuCiAgKi8KIHNzaXplX3QKIF9fYmxvY2tkZXZfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtMTIxMSw2ICsxMTA1LDEwIEBACiAJc3NpemVfdCByZXR2YWwgPSAtRUlOVkFMOwogCWxvZmZfdCBlbmQgPSBvZmZzZXQ7CiAJc3RydWN0IGRpbyAqZGlvOworCXN0cnVjdCBkaW9fc3VibWl0IHNkaW8gPSB7IDAsIH07CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHI7CisJc2l6ZV90IGJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCBtYXBfYmggPSB7IDAsIH07CiAKIAlpZiAocncgJiBXUklURSkKIAkJcncgPSBXUklURV9PRElSRUNUOwpAQCAtMTI0NCw3ICsxMTQyLDcgQEAKIAlpZiAocncgPT0gUkVBRCAmJiBlbmQgPT0gb2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCWRpbyA9IGttYWxsb2Moc2l6ZW9mKCpkaW8pLCBHRlBfS0VSTkVMKTsKKwlkaW8gPSBrbWVtX2NhY2hlX2FsbG9jKGRpb19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJcmV0dmFsID0gLUVOT01FTTsKIAlpZiAoIWRpbykKIAkJZ290byBvdXQ7CkBAIC0xMjY4LDcgKzExNjYsNyBAQAogCQkJCQkJCSAgICAgIGVuZCAtIDEpOwogCQkJaWYgKHJldHZhbCkgewogCQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQkJCWtmcmVlKGRpbyk7CisJCQkJa21lbV9jYWNoZV9mcmVlKGRpb19jYWNoZSwgZGlvKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQpAQCAtMTI4OCwxMSArMTE4NiwxNDEgQEAKIAlkaW8tPmlzX2FzeW5jID0gIWlzX3N5bmNfa2lvY2IoaW9jYikgJiYgISgocncgJiBXUklURSkgJiYKIAkJKGVuZCA+IGlfc2l6ZV9yZWFkKGlub2RlKSkpOwogCi0JcmV0dmFsID0gZGlyZWN0X2lvX3dvcmtlcihydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LAotCQkJCW5yX3NlZ3MsIGJsa2JpdHMsIGdldF9ibG9jaywgZW5kX2lvLAotCQkJCXN1Ym1pdF9pbywgZGlvKTsKKwlyZXR2YWwgPSAwOworCisJZGlvLT5pbm9kZSA9IGlub2RlOworCWRpby0+cncgPSBydzsKKwlzZGlvLmJsa2JpdHMgPSBibGtiaXRzOworCXNkaW8uYmxrZmFjdG9yID0gaW5vZGUtPmlfYmxrYml0cyAtIGJsa2JpdHM7CisJc2Rpby5ibG9ja19pbl9maWxlID0gb2Zmc2V0ID4+IGJsa2JpdHM7CisKKwlzZGlvLmdldF9ibG9jayA9IGdldF9ibG9jazsKKwlkaW8tPmVuZF9pbyA9IGVuZF9pbzsKKwlzZGlvLnN1Ym1pdF9pbyA9IHN1Ym1pdF9pbzsKKwlzZGlvLmZpbmFsX2Jsb2NrX2luX2JpbyA9IC0xOworCXNkaW8ubmV4dF9ibG9ja19mb3JfaW8gPSAtMTsKKworCWRpby0+aW9jYiA9IGlvY2I7CisJZGlvLT5pX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZGlvLT5iaW9fbG9jayk7CisJZGlvLT5yZWZjb3VudCA9IDE7CisKKwkvKgorCSAqIEluIGNhc2Ugb2Ygbm9uLWFsaWduZWQgYnVmZmVycywgd2UgbWF5IG5lZWQgMiBtb3JlCisJICogcGFnZXMgc2luY2Ugd2UgbmVlZCB0byB6ZXJvIG91dCBmaXJzdCBhbmQgbGFzdCBibG9jay4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2Rpby5ibGtmYWN0b3IpKQorCQlzZGlvLnBhZ2VzX2luX2lvID0gMjsKKworCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW92W3NlZ10uaW92X2Jhc2U7CisJCXNkaW8ucGFnZXNfaW5faW8gKz0KKwkJCSgodXNlcl9hZGRyICsgaW92W3NlZ10uaW92X2xlbiArIFBBR0VfU0laRS0xKSAvCisJCQkJUEFHRV9TSVpFIC0gdXNlcl9hZGRyIC8gUEFHRV9TSVpFKTsKKwl9CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlzZGlvLnNpemUgKz0gYnl0ZXMgPSBpb3Zbc2VnXS5pb3ZfbGVuOworCisJCS8qIEluZGV4IGludG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IGJsb2NrICovCisJCXNkaW8uZmlyc3RfYmxvY2tfaW5fcGFnZSA9ICh1c2VyX2FkZHIgJiB+UEFHRV9NQVNLKSA+PiBibGtiaXRzOworCQlzZGlvLmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgPSBzZGlvLmJsb2NrX2luX2ZpbGUgKworCQkJCQkJKGJ5dGVzID4+IGJsa2JpdHMpOworCQkvKiBQYWdlIGZldGNoaW5nIHN0YXRlICovCisJCXNkaW8uaGVhZCA9IDA7CisJCXNkaW8udGFpbCA9IDA7CisJCXNkaW8uY3Vycl9wYWdlID0gMDsKKworCQlzZGlvLnRvdGFsX3BhZ2VzID0gMDsKKwkJaWYgKHVzZXJfYWRkciAmIChQQUdFX1NJWkUtMSkpIHsKKwkJCXNkaW8udG90YWxfcGFnZXMrKzsKKwkJCWJ5dGVzIC09IFBBR0VfU0laRSAtICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQl9CisJCXNkaW8udG90YWxfcGFnZXMgKz0gKGJ5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJCXNkaW8uY3Vycl91c2VyX2FkZHJlc3MgPSB1c2VyX2FkZHI7CisKKwkJcmV0dmFsID0gZG9fZGlyZWN0X0lPKGRpbywgJnNkaW8sICZtYXBfYmgpOworCisJCWRpby0+cmVzdWx0ICs9IGlvdltzZWddLmlvdl9sZW4gLQorCQkJKChzZGlvLmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBzZGlvLmJsb2NrX2luX2ZpbGUpIDw8CisJCQkJCWJsa2JpdHMpOworCisJCWlmIChyZXR2YWwpIHsKKwkJCWRpb19jbGVhbnVwKGRpbywgJnNkaW8pOworCQkJYnJlYWs7CisJCX0KKwl9IC8qIGVuZCBpb3ZlYyBsb29wICovCisKKwlpZiAocmV0dmFsID09IC1FTk9UQkxLKSB7CisJCS8qCisJCSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgcmVxdWVzdCB3aWxsIGJlCisJCSAqIGJlIGhhbmRsZWQgYnkgYnVmZmVyZWQgSS9PIHdoZW4gd2UgcmV0dXJuCisJCSAqLworCQlyZXR2YWwgPSAwOworCX0KKwkvKgorCSAqIFRoZXJlIG1heSBiZSBzb21lIHVud3JpdHRlbiBkaXNrIGF0IHRoZSBlbmQgb2YgYSBwYXJ0LXdyaXR0ZW4KKwkgKiBmcy1ibG9jay1zaXplZCBibG9jay4gIEdvIHplcm8gdGhhdCBub3cuCisJICovCisJZGlvX3plcm9fYmxvY2soZGlvLCAmc2RpbywgMSwgJm1hcF9iaCk7CisKKwlpZiAoc2Rpby5jdXJfcGFnZSkgeworCQlzc2l6ZV90IHJldDI7CisKKwkJcmV0MiA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbywgJnNkaW8sICZtYXBfYmgpOworCQlpZiAocmV0dmFsID09IDApCisJCQlyZXR2YWwgPSByZXQyOworCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc2Rpby5jdXJfcGFnZSk7CisJCXNkaW8uY3VyX3BhZ2UgPSBOVUxMOworCX0KKwlpZiAoc2Rpby5iaW8pCisJCWRpb19iaW9fc3VibWl0KGRpbywgJnNkaW8pOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0LCB3ZSByZXR1cm4gc2hvcnQgSU8gZHVlIHRvIGVuZCBvZiBmaWxlLgorCSAqIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byByZWxlYXNlIGFsbCB0aGUgcGFnZXMgd2UgZ290IGhvbGQgb24uCisJICovCisJZGlvX2NsZWFudXAoZGlvLCAmc2Rpbyk7CisKKwkvKgorCSAqIEFsbCBibG9jayBsb29rdXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIEZvciBSRUFEIHJlcXVlc3RzCisJICogd2UgY2FuIGxldCBpX211dGV4IGdvIG5vdyB0aGF0IGl0cyBhY2hpZXZlZCBpdHMgcHVycG9zZQorCSAqIG9mIHByb3RlY3RpbmcgdXMgZnJvbSBsb29raW5nIHVwIHVuaW5pdGlhbGl6ZWQgYmxvY2tzLgorCSAqLworCWlmIChydyA9PSBSRUFEICYmIChkaW8tPmZsYWdzICYgRElPX0xPQ0tJTkcpKQorCQltdXRleF91bmxvY2soJmRpby0+aW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBUaGUgb25seSB0aW1lIHdlIHdhbnQgdG8gbGVhdmUgYmlvcyBpbiBmbGlnaHQgaXMgd2hlbiBhIHN1Y2Nlc3NmdWwKKwkgKiBwYXJ0aWFsIGFpbyByZWFkIG9yIGZ1bGwgYWlvIHdyaXRlIGhhdmUgYmVlbiBzZXR1cC4gIEluIHRoYXQgY2FzZQorCSAqIGJpbyBjb21wbGV0aW9uIHdpbGwgY2FsbCBhaW9fY29tcGxldGUuICBUaGUgb25seSB0aW1lIGl0J3Mgc2FmZSB0bworCSAqIGNhbGwgYWlvX2NvbXBsZXRlIGlzIHdoZW4gd2UgcmV0dXJuIC1FSU9DQlFVRVVFRCwgc28gd2Uga2V5IG9uIHRoYXQuCisJICogVGhpcyBoYWQgKmJldHRlciogYmUgdGhlIG9ubHkgcGxhY2UgdGhhdCByYWlzZXMgLUVJT0NCUVVFVUVELgorCSAqLworCUJVR19PTihyZXR2YWwgPT0gLUVJT0NCUVVFVUVEKTsKKwlpZiAoZGlvLT5pc19hc3luYyAmJiByZXR2YWwgPT0gMCAmJiBkaW8tPnJlc3VsdCAmJgorCSAgICAoKHJ3ICYgUkVBRCkgfHwgKGRpby0+cmVzdWx0ID09IHNkaW8uc2l6ZSkpKQorCQlyZXR2YWwgPSAtRUlPQ0JRVUVVRUQ7CisKKwlpZiAocmV0dmFsICE9IC1FSU9DQlFVRVVFRCkKKwkJZGlvX2F3YWl0X2NvbXBsZXRpb24oZGlvKTsKKworCWlmIChkcm9wX3JlZmNvdW50KGRpbykgPT0gMCkgeworCQlyZXR2YWwgPSBkaW9fY29tcGxldGUoZGlvLCBvZmZzZXQsIHJldHZhbCwgZmFsc2UpOworCQlrbWVtX2NhY2hlX2ZyZWUoZGlvX2NhY2hlLCBkaW8pOworCX0gZWxzZQorCQlCVUdfT04ocmV0dmFsICE9IC1FSU9DQlFVRVVFRCk7CiAKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTChfX2Jsb2NrZGV2X2RpcmVjdF9JTyk7CisKK3N0YXRpYyBfX2luaXQgaW50IGRpb19pbml0KHZvaWQpCit7CisJZGlvX2NhY2hlID0gS01FTV9DQUNIRShkaW8sIFNMQUJfUEFOSUMpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZGlvX2luaXQpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaCBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCmluZGV4IGIzNmM1NTcuLjU0NDgxYTMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCisrKyBiL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oCkBAIC01MTQsNyArNTE0LDcgQEAKIAogI2RlZmluZSBlY3J5cHRmc19wcmludGsodHlwZSwgZm10LCBhcmcuLi4pIFwKICAgICAgICAgX19lY3J5cHRmc19wcmludGsodHlwZSAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgYXJnKTsKLV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCitfX3ByaW50ZigxLCAyKQogdm9pZCBfX2VjcnlwdGZzX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVjcnlwdGZzX21haW5fZm9wczsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IDExZjg1ODIuLmEzNmQzMjcgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtNDc0LDggKzQ3NCw4IEBACiAJCWdvdG8gb3V0X2xvY2s7CiAJZnNzdGFja19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwotCW9sZF9kZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPQotCQllY3J5cHRmc19pbm9kZV90b19sb3dlcihvbGRfZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluazsKKwlzZXRfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSwKKwkJICBlY3J5cHRmc19pbm9kZV90b19sb3dlcihvbGRfZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluayk7CiAJaV9zaXplX3dyaXRlKG5ld19kZW50cnktPmRfaW5vZGUsIGZpbGVfc2l6ZV9zYXZlKTsKIG91dF9sb2NrOgogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CkBAIC00OTksOCArNDk5LDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAlmc3N0YWNrX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9pbm9kZSk7Ci0JZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0KLQkJZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIoZGVudHJ5LT5kX2lub2RlKS0+aV9ubGluazsKKwlzZXRfbmxpbmsoZGVudHJ5LT5kX2lub2RlLAorCQkgIGVjcnlwdGZzX2lub2RlX3RvX2xvd2VyKGRlbnRyeS0+ZF9pbm9kZSktPmlfbmxpbmspOwogCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKIAlkX2Ryb3AoZGVudHJ5KTsKIG91dF91bmxvY2s6CkBAIC01NjUsNyArNTY1LDcgQEAKIAkJZ290byBvdXQ7CiAJZnNzdGFja19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOwotCWRpci0+aV9ubGluayA9IGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUtPmlfbmxpbms7CisJc2V0X25saW5rKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayk7CiBvdXQ6CiAJdW5sb2NrX2Rpcihsb3dlcl9kaXJfZGVudHJ5KTsKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKQEAgLTU4OCw3ICs1ODgsNyBAQAogCWlmICghcmMgJiYgZGVudHJ5LT5kX2lub2RlKQogCQljbGVhcl9ubGluayhkZW50cnktPmRfaW5vZGUpOwogCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JZGlyLT5pX25saW5rID0gbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluazsKKwlzZXRfbmxpbmsoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKTsKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogCWlmICghcmMpCiAJCWRfZHJvcChkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvZWZzL2lub2RlLmMgYi9mcy9lZnMvaW5vZGUuYwppbmRleCA5YzEzNDEyLi5iYzg0ZjM2IDEwMDY0NAotLS0gYS9mcy9lZnMvaW5vZGUuYworKysgYi9mcy9lZnMvaW5vZGUuYwpAQCAtOTYsNyArOTYsNyBAQAogCWVmc19pbm9kZSA9IChzdHJ1Y3QgZWZzX2Rpbm9kZSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CiAgICAgCiAJaW5vZGUtPmlfbW9kZSAgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX21vZGUpOwotCWlub2RlLT5pX25saW5rID0gYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX25saW5rKSk7CiAJaW5vZGUtPmlfdWlkICAgPSAodWlkX3QpYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV91aWQpOwogCWlub2RlLT5pX2dpZCAgID0gKGdpZF90KWJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfZ2lkKTsKIAlpbm9kZS0+aV9zaXplICA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy9ldmVudHBvbGwuYyBiL2ZzL2V2ZW50cG9sbC5jCmluZGV4IDkwMjZmYzkuLjgyOGU3NTAgMTAwNjQ0Ci0tLSBhL2ZzL2V2ZW50cG9sbC5jCisrKyBiL2ZzL2V2ZW50cG9sbC5jCkBAIC03MCw2ICs3MCwxNSBAQAogICogc2ltdWx0YW5lb3VzIGluc2VydHMgKEEgaW50byBCIGFuZCBCIGludG8gQSkgZnJvbSByYWNpbmcgYW5kCiAgKiBjb25zdHJ1Y3RpbmcgYSBjeWNsZSB3aXRob3V0IGVpdGhlciBpbnNlcnQgb2JzZXJ2aW5nIHRoYXQgaXQgaXMKICAqIGdvaW5nIHRvLgorICogSXQgaXMgbmVjZXNzYXJ5IHRvIGFjcXVpcmUgbXVsdGlwbGUgImVwLT5tdHgiZXMgYXQgb25jZSBpbiB0aGUKKyAqIGNhc2Ugd2hlbiBvbmUgZXBvbGwgZmQgaXMgYWRkZWQgdG8gYW5vdGhlci4gSW4gdGhpcyBjYXNlLCB3ZQorICogYWx3YXlzIGFjcXVpcmUgdGhlIGxvY2tzIGluIHRoZSBvcmRlciBvZiBuZXN0aW5nIChpLmUuIGFmdGVyCisgKiBlcG9sbF9jdGwoZTEsIEVQT0xMX0NUTF9BREQsIGUyKSwgZTEtPm10eCB3aWxsIGFsd2F5cyBiZSBhY3F1aXJlZAorICogYmVmb3JlIGUyLT5tdHgpLiBTaW5jZSB3ZSBkaXNhbGxvdyBjeWNsZXMgb2YgZXBvbGwgZmlsZQorICogZGVzY3JpcHRvcnMsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtdXRleGVzIGFyZSB3ZWxsLW9yZGVyZWQuIEluCisgKiBvcmRlciB0byBjb21tdW5pY2F0ZSB0aGlzIG5lc3RpbmcgdG8gbG9ja2RlcCwgd2hlbiB3YWxraW5nIGEgdHJlZQorICogb2YgZXBvbGwgZmlsZSBkZXNjcmlwdG9ycywgd2UgdXNlIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBhcworICogdGhlIGxvY2tkZXAgc3Via2V5LgogICogSXQgaXMgcG9zc2libGUgdG8gZHJvcCB0aGUgImVwLT5tdHgiIGFuZCB0byB1c2UgdGhlIGdsb2JhbAogICogbXV0ZXggImVwbXV0ZXgiICh0b2dldGhlciB3aXRoICJlcC0+bG9jayIpIHRvIGhhdmUgaXQgd29ya2luZywKICAqIGJ1dCBoYXZpbmcgImVwLT5tdHgiIHdpbGwgbWFrZSB0aGUgaW50ZXJmYWNlIG1vcmUgc2NhbGFibGUuCkBAIC00NjQsMTMgKzQ3MywxNSBAQAogICogQGVwOiBQb2ludGVyIHRvIHRoZSBlcG9sbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgogICogQHNwcm9jOiBQb2ludGVyIHRvIHRoZSBzY2FuIGNhbGxiYWNrLgogICogQHByaXY6IFByaXZhdGUgb3BhcXVlIGRhdGEgcGFzc2VkIHRvIHRoZSBAc3Byb2MgY2FsbGJhY2suCisgKiBAZGVwdGg6IFRoZSBjdXJyZW50IGRlcHRoIG9mIHJlY3Vyc2l2ZSBmX29wLT5wb2xsIGNhbGxzLgogICoKICAqIFJldHVybnM6IFRoZSBzYW1lIGludGVnZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgQHNwcm9jIGNhbGxiYWNrLgogICovCiBzdGF0aWMgaW50IGVwX3NjYW5fcmVhZHlfbGlzdChzdHJ1Y3QgZXZlbnRwb2xsICplcCwKIAkJCSAgICAgIGludCAoKnNwcm9jKShzdHJ1Y3QgZXZlbnRwb2xsICosCiAJCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKiwgdm9pZCAqKSwKLQkJCSAgICAgIHZvaWQgKnByaXYpCisJCQkgICAgICB2b2lkICpwcml2LAorCQkJICAgICAgaW50IGRlcHRoKQogewogCWludCBlcnJvciwgcHdha2UgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00ODEsNyArNDkyLDcgQEAKIAkgKiBXZSBuZWVkIHRvIGxvY2sgdGhpcyBiZWNhdXNlIHdlIGNvdWxkIGJlIGhpdCBieQogCSAqIGV2ZW50cG9sbF9yZWxlYXNlX2ZpbGUoKSBhbmQgZXBvbGxfY3RsKCkuCiAJICovCi0JbXV0ZXhfbG9jaygmZXAtPm10eCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmVwLT5tdHgsIGRlcHRoKTsKIAogCS8qCiAJICogU3RlYWwgdGhlIHJlYWR5IGxpc3QsIGFuZCByZS1pbml0IHRoZSBvcmlnaW5hbCBvbmUgdG8gdGhlCkBAIC02NzAsNyArNjgxLDcgQEAKIAogc3RhdGljIGludCBlcF9wb2xsX3JlYWR5ZXZlbnRzX3Byb2Modm9pZCAqcHJpdiwgdm9pZCAqY29va2llLCBpbnQgY2FsbF9uZXN0cykKIHsKLQlyZXR1cm4gZXBfc2Nhbl9yZWFkeV9saXN0KHByaXYsIGVwX3JlYWRfZXZlbnRzX3Byb2MsIE5VTEwpOworCXJldHVybiBlcF9zY2FuX3JlYWR5X2xpc3QocHJpdiwgZXBfcmVhZF9ldmVudHNfcHJvYywgTlVMTCwgY2FsbF9uZXN0cyArIDEpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGVwX2V2ZW50cG9sbF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQpAQCAtNzM3LDcgKzc0OCw3IEBACiAKIAkJZXAgPSBlcGktPmVwOwogCQlsaXN0X2RlbF9pbml0KCZlcGktPmZsbGluayk7Ci0JCW11dGV4X2xvY2soJmVwLT5tdHgpOworCQltdXRleF9sb2NrX25lc3RlZCgmZXAtPm10eCwgMCk7CiAJCWVwX3JlbW92ZShlcCwgZXBpKTsKIAkJbXV0ZXhfdW5sb2NrKCZlcC0+bXR4KTsKIAl9CkBAIC0xMTM0LDcgKzExNDUsNyBAQAogCWVzZWQubWF4ZXZlbnRzID0gbWF4ZXZlbnRzOwogCWVzZWQuZXZlbnRzID0gZXZlbnRzOwogCi0JcmV0dXJuIGVwX3NjYW5fcmVhZHlfbGlzdChlcCwgZXBfc2VuZF9ldmVudHNfcHJvYywgJmVzZWQpOworCXJldHVybiBlcF9zY2FuX3JlYWR5X2xpc3QoZXAsIGVwX3NlbmRfZXZlbnRzX3Byb2MsICZlc2VkLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGltZXNwZWMgZXBfc2V0X21zdGltZW91dChsb25nIG1zKQpAQCAtMTI2Nyw3ICsxMjc4LDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcmJwOwogCXN0cnVjdCBlcGl0ZW0gKmVwaTsKIAotCW11dGV4X2xvY2soJmVwLT5tdHgpOworCW11dGV4X2xvY2tfbmVzdGVkKCZlcC0+bXR4LCBjYWxsX25lc3RzICsgMSk7CiAJZm9yIChyYnAgPSByYl9maXJzdCgmZXAtPnJicik7IHJicDsgcmJwID0gcmJfbmV4dChyYnApKSB7CiAJCWVwaSA9IHJiX2VudHJ5KHJicCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKIAkJaWYgKHVubGlrZWx5KGlzX2ZpbGVfZXBvbGwoZXBpLT5mZmQuZmlsZSkpKSB7CkBAIC0xNDA5LDcgKzE0MjAsNyBAQAogCX0KIAogCi0JbXV0ZXhfbG9jaygmZXAtPm10eCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmVwLT5tdHgsIDApOwogCiAJLyoKIAkgKiBUcnkgdG8gbG9va3VwIHRoZSBmaWxlIGluc2lkZSBvdXIgUkIgdHJlZSwgU2luY2Ugd2UgZ3JhYmJlZCAibXR4IgpkaWZmIC0tZ2l0IGEvZnMvZXhlYy5jIGIvZnMvZXhlYy5jCmluZGV4IDI1ZGNiZTUuLjM2MjU0NjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4ZWMuYworKysgYi9mcy9leGVjLmMKQEAgLTg0MSwxMCArODQxLDYgQEAKIAl0c2stPm1tID0gbW07CiAJdHNrLT5hY3RpdmVfbW0gPSBtbTsKIAlhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKTsKLQlpZiAob2xkX21tICYmIHRzay0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKSB7Ci0JCWF0b21pY19kZWMoJm9sZF9tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCQlhdG9taWNfaW5jKCZ0c2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JfQogCXRhc2tfdW5sb2NrKHRzayk7CiAJYXJjaF9waWNrX21tYXBfbGF5b3V0KG1tKTsKIAlpZiAob2xkX21tKSB7CmRpZmYgLS1naXQgYS9mcy9leG9mcy9LY29uZmlnIGIvZnMvZXhvZnMvS2NvbmZpZwppbmRleCBmYTlhMjg2Li5kYTQyZjMyIDEwMDY0NAotLS0gYS9mcy9leG9mcy9LY29uZmlnCisrKyBiL2ZzL2V4b2ZzL0tjb25maWcKQEAgLTUsNyArNSw3IEBACiAjIHNlbGVjdGVkIGJ5IGFueSBvZiB0aGUgdXNlcnMuCiBjb25maWcgT1JFCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEVYT0ZTX0ZTCisJZGVwZW5kcyBvbiBFWE9GU19GUyB8fCBQTkZTX09CSkxBWU9VVAogCXNlbGVjdCBBU1lOQ19YT1IKIAlkZWZhdWx0IFNDU0lfT1NEX1VMRAogCmRpZmYgLS1naXQgYS9mcy9leG9mcy9pbm9kZS5jIGIvZnMvZXhvZnMvaW5vZGUuYwppbmRleCAzZTVmM2E2Li5mNmRiZjc3IDEwMDY0NAotLS0gYS9mcy9leG9mcy9pbm9kZS5jCisrKyBiL2ZzL2V4b2ZzL2lub2RlLmMKQEAgLTExNjUsNyArMTE2NSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KGZjYi5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9IGxlMzJfdG9fY3B1KGZjYi5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gbGUzMl90b19jcHUoZmNiLmlfZ2lkKTsKLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZjYi5pX2xpbmtzX2NvdW50KTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KGZjYi5pX2xpbmtzX2NvdW50KSk7CiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9jdGltZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9hdGltZSk7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShmY2IuaV9tdGltZSk7CmRpZmYgLS1naXQgYS9mcy9leG9mcy9vcmUuYyBiL2ZzL2V4b2ZzL29yZS5jCmluZGV4IGZjZmE4NmEuLmQyNzFhZDggMTAwNjQ0Ci0tLSBhL2ZzL2V4b2ZzL29yZS5jCisrKyBiL2ZzL2V4b2ZzL29yZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxsaW51eC9sY20uaD4KIApkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvc3VwZXIuYyBiL2ZzL2V4b2ZzL3N1cGVyLmMKaW5kZXggMDU3YjIzNy4uZTYwODVlYyAxMDA2NDQKLS0tIGEvZnMvZXhvZnMvc3VwZXIuYworKysgYi9mcy9leG9mcy9zdXBlci5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYmFsbG9jLmMgYi9mcy9leHQyL2JhbGxvYy5jCmluZGV4IDhmNDRjZWYuLmE4Y2JlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvYmFsbG9jLmMKKysrIGIvZnMvZXh0Mi9iYWxsb2MuYwpAQCAtNDIxLDcgKzQyMSw3IEBACiB2b2lkIGV4dDJfaW5pdF9ibG9ja19hbGxvY19pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOwotCXN0cnVjdCBleHQyX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2kgPSBlaS0+aV9ibG9ja19hbGxvY19pbmZvOworCXN0cnVjdCBleHQyX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2k7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCiAJYmxvY2tfaSA9IGttYWxsb2Moc2l6ZW9mKCpibG9ja19pKSwgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCBhZjlmYzg5Li45YTRlNWUyMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTEzNSwxMCArMTM1LDEwIEBACiBzdHJ1Y3QgZGVudHJ5ICpleHQyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOwogCiAvKiBzdXBlci5jICovCi1leHRlcm4gdm9pZCBleHQyX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCBleHQyX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0Ml9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0Ml9tc2coc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogZXh0ZXJuIHZvaWQgZXh0Ml91cGRhdGVfZHluYW1pY19yZXYgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgZXh0Ml93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCBlZTllZDMxLi5jNGU4MWRmYiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pYWxsb2MuYworKysgYi9mcy9leHQyL2lhbGxvYy5jCkBAIC02MDEsNyArNjAxLDcgQEAKIGZhaWxfZHJvcDoKIAlkcXVvdF9kcm9wKGlub2RlKTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pbm9kZS5jIGIvZnMvZXh0Mi9pbm9kZS5jCmluZGV4IGE4YTU4ZjYuLjkxYTY5NDUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvaW5vZGUuYworKysgYi9mcy9leHQyL2lub2RlLmMKQEAgLTEzMjEsNyArMTMyMSw3IEBACiAJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OwogCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCXNldF9ubGluayhpbm9kZSwgbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KSk7CiAJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplKTsKIAlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSAoc2lnbmVkKWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9hdGltZSk7CiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gKHNpZ25lZClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDFkZDYyZWQuLmJkOGFjMTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTMyNywxMCArMzI3LDEwIEBACiAJaWYgKGlubyA+IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwogCi0JLyogaWdldCBpc24ndCByZWFsbHkgcmlnaHQgaWYgdGhlIGlub2RlIGlzIGN1cnJlbnRseSB1bmFsbG9jYXRlZCEhCi0JICogZXh0Ml9yZWFkX2lub2RlIGN1cnJlbnRseSBkb2VzIGFwcHJvcHJpYXRlIGNoZWNrcywgYnV0Ci0JICogaXQgbWlnaHQgYmUgIm5lYXRlciIgdG8gY2FsbCBleHQyX2dldF9pbm9kZSBmaXJzdCBhbmQgY2hlY2sKLQkgKiBpZiB0aGUgaW5vZGUgaXMgdmFsaWQuLi4uLgorCS8qCisJICogZXh0Ml9pZ2V0IGlzbid0IHF1aXRlIHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhCisJICogSG93ZXZlciBleHQyX2lnZXQgY3VycmVudGx5IGRvZXMgYXBwcm9wcmlhdGUgY2hlY2tzIHRvIGhhbmRsZSBzdGFsZQorCSAqIGlub2RlcyBzbyBldmVyeXRoaW5nIGlzIE9LLgogCSAqLwogCWlub2RlID0gZXh0Ml9pZ2V0KHNiLCBpbm8pOwogCWlmIChJU19FUlIoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iYWxsb2MuYyBiL2ZzL2V4dDMvYmFsbG9jLmMKaW5kZXggNjM4NmQ3Ni4uYTIwMzg5MiAxMDA2NDQKLS0tIGEvZnMvZXh0My9iYWxsb2MuYworKysgYi9mcy9leHQzL2JhbGxvYy5jCkBAIC00MjcsNyArNDI3LDcgQEAKIHZvaWQgZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7Ci0Jc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAKIAlibG9ja19pID0ga21hbGxvYyhzaXplb2YoKmJsb2NrX2kpLCBHRlBfTk9GUyk7CkBAIC0xNDQwLDE0ICsxNDQwLDE0IEBACiAgKgogICogQ2hlY2sgaWYgZmlsZXN5c3RlbSBoYXMgYXQgbGVhc3QgMSBmcmVlIGJsb2NrIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KICAqLwotc3RhdGljIGludCBleHQzX2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCitzdGF0aWMgaW50IGV4dDNfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSwgaW50IHVzZV9yZXNlcnZhdGlvbikKIHsKIAlleHQzX2ZzYmxrX3QgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOwogCiAJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CiAJaWYgKGZyZWVfYmxvY2tzIDwgcm9vdF9ibG9ja3MgKyAxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCi0JCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudF9mc3VpZCgpICYmCisJCSF1c2VfcmVzZXJ2YXRpb24gJiYgc2JpLT5zX3Jlc3VpZCAhPSBjdXJyZW50X2ZzdWlkKCkgJiYKIAkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CiAJCXJldHVybiAwOwogCX0KQEAgLTE0NjgsNyArMTQ2OCw3IEBACiAgKi8KIGludCBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpCiB7Ci0JaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhFWFQzX1NCKHNiKSkgfHwgKCpyZXRyaWVzKSsrID4gMykKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKEVYVDNfU0Ioc2IpLCAwKSB8fCAoKnJldHJpZXMpKysgPiAzKQogCQlyZXR1cm4gMDsKIAogCWpiZF9kZWJ1ZygxLCAiJXM6IHJldHJ5aW5nIG9wZXJhdGlvbiBhZnRlciBFTk9TUENcbiIsIHNiLT5zX2lkKTsKQEAgLTE1NDYsNyArMTU0Niw3IEBACiAJaWYgKGJsb2NrX2kgJiYgKCh3aW5kb3dzeiA9IGJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZS5yc3ZfZ29hbF9zaXplKSA+IDApKQogCQlteV9yc3YgPSAmYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlOwogCi0JaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhzYmkpKSB7CisJaWYgKCFleHQzX2hhc19mcmVlX2Jsb2NrcyhzYmksIElTX05PUVVPVEEoaW5vZGUpKSkgewogCQkqZXJycCA9IC1FTk9TUEM7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE5MjQsOSArMTkyNCwxMCBAQAogICogcmVhY2hlcyBhbnkgdXNlZCBibG9jay4gVGhlbiBpc3N1ZSBhIFRSSU0gY29tbWFuZCBvbiB0aGlzIGV4dGVudCBhbmQgZnJlZQogICogdGhlIGV4dGVudCBpbiB0aGUgYmxvY2sgYml0bWFwLiBUaGlzIGlzIGRvbmUgdW50aWwgd2hvbGUgZ3JvdXAgaXMgc2Nhbm5lZC4KICAqLwotZXh0M19ncnBibGtfdCBleHQzX3RyaW1fYWxsX2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGdyb3VwLAotCQkJCWV4dDNfZ3JwYmxrX3Qgc3RhcnQsIGV4dDNfZ3JwYmxrX3QgbWF4LAotCQkJCWV4dDNfZ3JwYmxrX3QgbWluYmxvY2tzKQorc3RhdGljIGV4dDNfZ3JwYmxrX3QgZXh0M190cmltX2FsbF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCXVuc2lnbmVkIGludCBncm91cCwKKwkJCQkJZXh0M19ncnBibGtfdCBzdGFydCwgZXh0M19ncnBibGtfdCBtYXgsCisJCQkJCWV4dDNfZ3JwYmxrX3QgbWluYmxvY2tzKQogewogCWhhbmRsZV90ICpoYW5kbGU7CiAJZXh0M19ncnBibGtfdCBuZXh0LCBmcmVlX2Jsb2NrcywgYml0LCBmcmVlZCwgY291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9mc3luYy5jIGIvZnMvZXh0My9mc3luYy5jCmluZGV4IGQ0OTRjNTUuLjE4NjBlZDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvZnN5bmMuYworKysgYi9mcy9leHQzL2ZzeW5jLmMKQEAgLTYxLDEzICs2MSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFRha2luZyB0aGUgbXV0ZXggaGVyZSBqdXN0IHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIGhvdyBmc3luYyB3YXMKLQkgKiBjYWxsZWQgcHJldmlvdXNseSwgaG93ZXZlciBpdCBsb29rcyBsaWtlIHdlIGRvbid0IG5lZWQgdG8gdGFrZQotCSAqIGlfbXV0ZXggYXQgYWxsLgotCSAqLwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQogCUpfQVNTRVJUKGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IE5VTEwpOwogCiAJLyoKQEAgLTg1LDcgKzc4LDYgQEAKIAkgKiAgc2FmZSBpbi1qb3VybmFsLCB3aGljaCBpcyBhbGwgZnN5bmMoKSBuZWVkcyB0byBlbnN1cmUuCiAJICovCiAJaWYgKGV4dDNfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCXJldCA9IGV4dDNfZm9yY2VfY29tbWl0KGlub2RlLT5pX3NiKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA4LDggKzEwMCw2IEBACiAJICovCiAJaWYgKG5lZWRzX2JhcnJpZXIpCiAJCWJsa2Rldl9pc3N1ZV9mbHVzaChpbm9kZS0+aV9zYi0+c19iZGV2LCBHRlBfS0VSTkVMLCBOVUxMKTsKLQotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogb3V0OgogCXRyYWNlX2V4dDNfc3luY19maWxlX2V4aXQoaW5vZGUsIHJldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCmluZGV4IGJmMDljYmYuLjVjODY2ZTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaWFsbG9jLmMKKysrIGIvZnMvZXh0My9pYWxsb2MuYwpAQCAtMTc4LDQyICsxNzgsNiBAQAogfQogCiAvKgotICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKLSAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKLSAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgotICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKLSAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgotICoKLSAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKLSAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgotICovCi1zdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQotewotCWludCBuZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OwotCXVuc2lnbmVkIGludCBmcmVlaSwgYXZlZnJlZWk7Ci0Jc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYywgKmJlc3RfZGVzYyA9IE5VTEw7Ci0JaW50IGdyb3VwLCBiZXN0X2dyb3VwID0gLTE7Ci0KLQlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJkVYVDNfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7Ci0JYXZlZnJlZWkgPSBmcmVlaSAvIG5ncm91cHM7Ci0KLQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7Ci0JCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsIE5VTEwpOwotCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQotCQkJY29udGludWU7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIWJlc3RfZGVzYyB8fAotCQkgICAgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA+Ci0JCSAgICAgbGUxNl90b19jcHUoYmVzdF9kZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpKSB7Ci0JCQliZXN0X2dyb3VwID0gZ3JvdXA7Ci0JCQliZXN0X2Rlc2MgPSBkZXNjOwotCQl9Ci0JfQotCXJldHVybiBiZXN0X2dyb3VwOwotfQotCi0vKgogICogT3Jsb3YncyBhbGxvY2F0b3IgZm9yIGRpcmVjdG9yaWVzLgogICoKICAqIFdlIGFsd2F5cyB0cnkgdG8gc3ByZWFkIGZpcnN0LWxldmVsIGRpcmVjdG9yaWVzLgpAQCAtNDM2LDEyICs0MDAsOSBAQAogCiAJc2JpID0gRVhUM19TQihzYik7CiAJZXMgPSBzYmktPnNfZXM7Ci0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaWYgKHRlc3Rfb3B0IChzYiwgT0xEQUxMT0MpKQotCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX2RpcihzYiwgZGlyKTsKLQkJZWxzZQotCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX29ybG92KHNiLCBkaXIpOwotCX0gZWxzZQorCWlmIChTX0lTRElSKG1vZGUpKQorCQlncm91cCA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpcik7CisJZWxzZQogCQlncm91cCA9IGZpbmRfZ3JvdXBfb3RoZXIoc2IsIGRpcik7CiAKIAllcnIgPSAtRU5PU1BDOwpAQCAtNjIxLDcgKzU4Miw3IEBACiBmYWlsX2Ryb3A6CiAJZHF1b3RfZHJvcChpbm9kZSk7CiAJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOwotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiAJYnJlbHNlKGJpdG1hcF9iaCk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMTI2NjFlMS4uODVmZTY1NSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjg5OSw3ICsyODk5LDcgQEAKIAkJaW5vZGUtPmlfdWlkIHw9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfaGlnaCkgPDwgMTY7CiAJCWlub2RlLT5pX2dpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZ2lkX2hpZ2gpIDw8IDE2OwogCX0KLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCk7CisJc2V0X25saW5rKGlub2RlLCBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpKTsKIAlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX3NpemUpOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IChzaWduZWQpbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2F0aW1lKTsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAoc2lnbmVkKWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9jdGltZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKaW5kZXggYzdmNDM5NC4uYmExYjU0ZSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pb2N0bC5jCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtMTUwLDMwICsxNTAsNiBAQAogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0jaWZkZWYgQ09ORklHX0pCRF9ERUJVRwotCWNhc2UgRVhUM19JT0NfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCS8qCi0JCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAotCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCi0JCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KLQkJICoKLQkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCWludCByZXQgPSAwOwotCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJYWRkX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlpZiAodGltZXJfcGVuZGluZygmRVhUM19TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlyZXQgPSAxOwotCQkJfQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0jZW5kaWYKIAljYXNlIEVYVDNfSU9DX0dFVFJTVlNaOgogCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKQogCQkJJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDA2MjllMDkuLjY0MmRjNmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTE4MjEsNyArMTgyMSw3IEBACiAJZGUtPm5hbWVfbGVuID0gMjsKIAlzdHJjcHkgKGRlLT5uYW1lLCAiLi4iKTsKIAlleHQzX3NldF9kZV90eXBlKGRpci0+aV9zYiwgZGUsIFNfSUZESVIpOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwogCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CiAJaWYgKGVycikKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAKIAlpZiAoZXJyKSB7CiBvdXRfY2xlYXJfaW5vZGU6Ci0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQlpcHV0IChpbm9kZSk7CkBAIC0yMTcwLDcgKzIxNzAsNyBAQAogCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M191bmxpbmsiLAogCQkJICAgICAgIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCSAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOwotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMSk7CiAJfQogCXJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOwogCWlmIChyZXR2YWwpCmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggN2JlYjY5YS4uOTIyZDI4OSAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtNjUyLDggKzY1Miw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub3VpZDMyIik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCiAJCXNlcV9wdXRzKHNlcSwgIixkZWJ1ZyIpOwotCWlmICh0ZXN0X29wdChzYiwgT0xEQUxMT0MpKQotCQlzZXFfcHV0cyhzZXEsICIsb2xkYWxsb2MiKTsKICNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgogCWlmICh0ZXN0X29wdChzYiwgWEFUVFJfVVNFUikpCiAJCXNlcV9wdXRzKHNlcSwgIix1c2VyX3hhdHRyIik7CkBAIC0xMDQ5LDEwICsxMDQ3LDEyIEBACiAJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb2xkYWxsb2M6Ci0JCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJJZ25vcmluZyBkZXByZWNhdGVkIG9sZGFsbG9jIG9wdGlvbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29ybG92OgotCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlleHQzX21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSJJZ25vcmluZyBkZXByZWNhdGVkIG9ybG92IG9wdGlvbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKQEAgLTI2NjksMTMgKzI2NjksMTMgQEAKIAkJCS8qCiAJCQkgKiBJZiB3ZSBoYXZlIGFuIHVucHJvY2Vzc2VkIG9ycGhhbiBsaXN0IGhhbmdpbmcKIAkJCSAqIGFyb3VuZCBmcm9tIGEgcHJldmlvdXNseSByZWFkb25seSBiZGV2IG1vdW50LAotCQkJICogcmVxdWlyZSBhIGZ1bGwgdW1vdW50L3JlbW91bnQgZm9yIG5vdy4KKwkJCSAqIHJlcXVpcmUgYSBmdWxsIHVtb3VudCAmIG1vdW50IGZvciBub3cuCiAJCQkgKi8KIAkJCWlmIChlcy0+c19sYXN0X29ycGhhbikgewogCQkJCWV4dDNfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJ3YXJuaW5nOiBjb3VsZG4ndCAiCiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnByb2Nlc3NlZCAiCiAJCQkJICAgICAgICJvcnBoYW4gaW5vZGUgbGlzdC4gIFBsZWFzZSAiCi0JCQkJICAgICAgICJ1bW91bnQvcmVtb3VudCBpbnN0ZWFkLiIpOworCQkJCSAgICAgICAidW1vdW50ICYgbW91bnQgaW5zdGVhZC4iKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggZjgyMjRhZC4uZjZkYmE0NSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC0yOCw3ICsyOCw4IEBACiAgKi8KIAogLyoKLSAqIENhbGN1bGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnVtYmVyIGFuZCBvZmZzZXQsIGdpdmVuIGEgYmxvY2sgbnVtYmVyCisgKiBDYWxjdWxhdGUgdGhlIGJsb2NrIGdyb3VwIG51bWJlciBhbmQgb2Zmc2V0IGludG8gdGhlIGJsb2NrL2NsdXN0ZXIKKyAqIGFsbG9jYXRpb24gYml0bWFwLCBnaXZlbiBhIGJsb2NrIG51bWJlcgogICovCiB2b2lkIGV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9mc2Jsa190IGJsb2NrbnIsCiAJCWV4dDRfZ3JvdXBfdCAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKQpAQCAtMzcsNyArMzgsOCBAQAogCWV4dDRfZ3JwYmxrX3Qgb2Zmc2V0OwogCiAJYmxvY2tuciA9IGJsb2NrbnIgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQlvZmZzZXQgPSBkb19kaXYoYmxvY2tuciwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJb2Zmc2V0ID0gZG9fZGl2KGJsb2NrbnIsIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpID4+CisJCUVYVDRfU0Ioc2IpLT5zX2NsdXN0ZXJfYml0czsKIAlpZiAob2Zmc2V0cCkKIAkJKm9mZnNldHAgPSBvZmZzZXQ7CiAJaWYgKGJsb2NrZ3JwcCkKQEAgLTU1LDEzMSArNTcsMTcwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9ncm91cF91c2VkX21ldGFfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjbHVzdGVycyB1c2VkIGZvciBmaWxlIHN5c3RlbSBtZXRhZGF0YTsgdGhpcworICogcmVwcmVzZW50cyB0aGUgb3ZlcmhlYWQgbmVlZGVkIGJ5IHRoZSBmaWxlIHN5c3RlbS4KKyAqLwordW5zaWduZWQgZXh0NF9udW1fb3ZlcmhlYWRfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAorCQkJCSAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApCit7CisJdW5zaWduZWQgbnVtX2NsdXN0ZXJzOworCWludCBibG9ja19jbHVzdGVyID0gLTEsIGlub2RlX2NsdXN0ZXIgPSAtMSwgaXRibF9jbHVzdGVyID0gLTEsIGksIGM7CisJZXh0NF9mc2Jsa190IHN0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgYmxvY2tfZ3JvdXApOworCWV4dDRfZnNibGtfdCBpdGJsX2JsazsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKworCS8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrLAorCSAqIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzLCBhbmQgcmVzZXJ2ZWQgYmxvY2sgZ3JvdXAKKwkgKiBkZXNjcmlwdG9yIGJsb2NrcyAqLworCW51bV9jbHVzdGVycyA9IGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXApOworCisJLyoKKwkgKiBGb3IgdGhlIGFsbG9jYXRpb24gYml0bWFwcyBhbmQgaW5vZGUgdGFibGUsIHdlIGZpcnN0IG5lZWQKKwkgKiB0byBjaGVjayB0byBzZWUgaWYgdGhlIGJsb2NrIGlzIGluIHRoZSBibG9jayBncm91cC4gIElmIGl0CisJICogaXMsIHRoZW4gY2hlY2sgdG8gc2VlIGlmIHRoZSBjbHVzdGVyIGlzIGFscmVhZHkgYWNjb3VudGVkCisJICogZm9yIGluIHRoZSBjbHVzdGVycyB1c2VkIGZvciB0aGUgYmFzZSBtZXRhZGF0YSBjbHVzdGVyLCBvcgorCSAqIGlmIHdlIGNhbiBpbmNyZW1lbnQgdGhlIGJhc2UgbWV0YWRhdGEgY2x1c3RlciB0byBpbmNsdWRlCisJICogdGhhdCBibG9jay4gIE90aGVyd2lzZSwgd2Ugd2lsbCBoYXZlIHRvIHRyYWNrIHRoZSBjbHVzdGVyCisJICogdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24gYml0bWFwIG9yIGlub2RlIHRhYmxlIGV4cGxpY2l0bHkuCisJICogTm9ybWFsbHkgYWxsIG9mIHRoZXNlIGJsb2NrcyBhcmUgY29udGlndW91cywgc28gdGhlIHNwZWNpYWwKKwkgKiBjYXNlIGhhbmRsaW5nIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgZXhjZXB0IGZvciAqdmVyeSoKKwkgKiB1bnVzdWFsIGZpbGUgc3lzdGVtIGxheW91dHMuCisJICovCisJaWYgKGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCBibG9ja19ncm91cCkpIHsKKwkJYmxvY2tfY2x1c3RlciA9IEVYVDRfQjJDKHNiaSwgKHN0YXJ0IC0KKwkJCQkJICAgICAgIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApKSk7CisJCWlmIChibG9ja19jbHVzdGVyIDwgbnVtX2NsdXN0ZXJzKQorCQkJYmxvY2tfY2x1c3RlciA9IC0xOworCQllbHNlIGlmIChibG9ja19jbHVzdGVyID09IG51bV9jbHVzdGVycykgeworCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlibG9ja19jbHVzdGVyID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZXh0NF9ibG9ja19pbl9ncm91cChzYiwgZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCksIGJsb2NrX2dyb3VwKSkgeworCQlpbm9kZV9jbHVzdGVyID0gRVhUNF9CMkMoc2JpLAorCQkJCQkgc3RhcnQgLSBleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSk7CisJCWlmIChpbm9kZV9jbHVzdGVyIDwgbnVtX2NsdXN0ZXJzKQorCQkJaW5vZGVfY2x1c3RlciA9IC0xOworCQllbHNlIGlmIChpbm9kZV9jbHVzdGVyID09IG51bV9jbHVzdGVycykgeworCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlpbm9kZV9jbHVzdGVyID0gLTE7CisJCX0KKwl9CisKKwlpdGJsX2JsayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pdGJfcGVyX2dyb3VwOyBpKyspIHsKKwkJaWYgKGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIGl0YmxfYmxrICsgaSwgYmxvY2tfZ3JvdXApKSB7CisJCQljID0gRVhUNF9CMkMoc2JpLCBzdGFydCAtIGl0YmxfYmxrICsgaSk7CisJCQlpZiAoKGMgPCBudW1fY2x1c3RlcnMpIHx8IChjID09IGlub2RlX2NsdXN0ZXIpIHx8CisJCQkgICAgKGMgPT0gYmxvY2tfY2x1c3RlcikgfHwgKGMgPT0gaXRibF9jbHVzdGVyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjID09IG51bV9jbHVzdGVycykgeworCQkJCW51bV9jbHVzdGVycysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbnVtX2NsdXN0ZXJzKys7CisJCQlpdGJsX2NsdXN0ZXIgPSBjOworCQl9CisJfQorCisJaWYgKGJsb2NrX2NsdXN0ZXIgIT0gLTEpCisJCW51bV9jbHVzdGVycysrOworCWlmIChpbm9kZV9jbHVzdGVyICE9IC0xKQorCQludW1fY2x1c3RlcnMrKzsKKworCXJldHVybiBudW1fY2x1c3RlcnM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzX2luX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwKQoreworCXVuc2lnbmVkIGludCBibG9ja3M7CisKKwlpZiAoYmxvY2tfZ3JvdXAgPT0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKSAtIDEpIHsKKwkJLyoKKwkJICogRXZlbiB0aG91Z2ggbWtlMmZzIGFsd2F5cyBpbml0aWFsaXplcyB0aGUgZmlyc3QgYW5kCisJCSAqIGxhc3QgZ3JvdXAsIGp1c3QgaW4gY2FzZSBzb21lIG90aGVyIHRvb2wgd2FzIHVzZWQsCisJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNhbGN1bGF0ZSB0aGUgcmlnaHQgZnJlZQorCQkgKiBibG9ja3MuCisJCSAqLworCQlibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKHNiKS0+c19lcykgLQorCQkJZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgYmxvY2tfZ3JvdXApOworCX0gZWxzZQorCQlibG9ja3MgPSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOworCXJldHVybiBFWFQ0X05VTV9CMkMoRVhUNF9TQihzYiksIGJsb2Nrcyk7Cit9CisKKy8qIEluaXRpYWxpemVzIGFuIHVuaW5pdGlhbGl6ZWQgYmxvY2sgYml0bWFwICovCit2b2lkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsCisJCQkgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKQoreworCXVuc2lnbmVkIGludCBiaXQsIGJpdF9tYXg7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJZXh0NF9mc2Jsa190IHN0YXJ0LCB0bXA7CisJaW50IGZsZXhfYmcgPSAwOworCisJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9sb2NrZWQoYmgpKTsKKworCS8qIElmIGNoZWNrc3VtIGlzIGJhZCBtYXJrIGFsbCBibG9ja3MgdXNlZCB0byBwcmV2ZW50IGFsbG9jYXRpb24KKwkgKiBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCisJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgeworCQlleHQ0X2Vycm9yKHNiLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKKwkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCAwKTsKKwkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7CisJCWV4dDRfaXRhYmxlX3VudXNlZF9zZXQoc2IsIGdkcCwgMCk7CisJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOworCQlyZXR1cm47CisJfQorCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOworCisJYml0X21heCA9IGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXApOworCWZvciAoYml0ID0gMDsgYml0IDwgYml0X21heDsgYml0KyspCisJCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOworCisJc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7CisKKwlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcpKQorCQlmbGV4X2JnID0gMTsKKworCS8qIFNldCBiaXRzIGZvciBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIGlub2RlIHRhYmxlICovCisJdG1wID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCk7CisJaWYgKCFmbGV4X2JnIHx8IGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQorCQlleHQ0X3NldF9iaXQoRVhUNF9CMkMoc2JpLCB0bXAgLSBzdGFydCksIGJoLT5iX2RhdGEpOworCisJdG1wID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CisJaWYgKCFmbGV4X2JnIHx8IGV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQorCQlleHQ0X3NldF9iaXQoRVhUNF9CMkMoc2JpLCB0bXAgLSBzdGFydCksIGJoLT5iX2RhdGEpOworCisJdG1wID0gZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKTsKKwlmb3IgKDsgdG1wIDwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSArCisJCSAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7IHRtcCsrKSB7CisJCWlmICghZmxleF9iZyB8fCBleHQ0X2Jsb2NrX2luX2dyb3VwKHNiLCB0bXAsIGJsb2NrX2dyb3VwKSkKKwkJCWV4dDRfc2V0X2JpdChFWFQ0X0IyQyhzYmksIHRtcCAtIHN0YXJ0KSwgYmgtPmJfZGF0YSk7CisJfQorCisJLyoKKwkgKiBBbHNvIGlmIHRoZSBudW1iZXIgb2YgYmxvY2tzIHdpdGhpbiB0aGUgZ3JvdXAgaXMgbGVzcyB0aGFuCisJICogdGhlIGJsb2Nrc2l6ZSAqIDggKCB3aGljaCBpcyB0aGUgc2l6ZSBvZiBiaXRtYXAgKSwgc2V0IHJlc3QKKwkgKiBvZiB0aGUgYmxvY2sgYml0bWFwIHRvIDEKKwkgKi8KKwlleHQ0X21hcmtfYml0bWFwX2VuZChudW1fY2x1c3RlcnNfaW5fZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKSwKKwkJCSAgICAgc2ItPnNfYmxvY2tzaXplICogOCwgYmgtPmJfZGF0YSk7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIGEgYmxvY2sgZ3JvdXAuICBJdCBpcyB1c2VkIHdoZW4KKyAqIHRoZSBibG9jayBiaXRtYXAgaXMgdW5pbml0aWFsaXplZCwgc28gd2UgY2FuJ3QganVzdCBjb3VudCB0aGUgYml0cworICogaW4gdGhlIGJpdG1hcC4gKi8KK3Vuc2lnbmVkIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKIAkJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKQogewotCWV4dDRfZnNibGtfdCB0bXA7Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0JLyogYmxvY2sgYml0bWFwLCBpbm9kZSBiaXRtYXAsIGFuZCBpbm9kZSB0YWJsZSBibG9ja3MgKi8KLQlpbnQgdXNlZF9ibG9ja3MgPSBzYmktPnNfaXRiX3Blcl9ncm91cCArIDI7Ci0KLQlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcpKSB7Ci0JCWlmICghZXh0NF9ibG9ja19pbl9ncm91cChzYiwgZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksCi0JCQkJCWJsb2NrX2dyb3VwKSkKLQkJCXVzZWRfYmxvY2tzLS07Ci0KLQkJaWYgKCFleHQ0X2Jsb2NrX2luX2dyb3VwKHNiLCBleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwKLQkJCQkJYmxvY2tfZ3JvdXApKQotCQkJdXNlZF9ibG9ja3MtLTsKLQotCQl0bXAgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApOwotCQlmb3IgKDsgdG1wIDwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSArCi0JCQkJc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7IHRtcCsrKSB7Ci0JCQlpZiAoIWV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQotCQkJCXVzZWRfYmxvY2tzIC09IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHVzZWRfYmxvY2tzOworCXJldHVybiBudW1fY2x1c3RlcnNfaW5fZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKSAtIAorCQlleHQ0X251bV9vdmVyaGVhZF9jbHVzdGVycyhzYiwgYmxvY2tfZ3JvdXAsIGdkcCk7CiB9CiAKLS8qIEluaXRpYWxpemVzIGFuIHVuaW5pdGlhbGl6ZWQgYmxvY2sgYml0bWFwIGlmIGdpdmVuLCBhbmQgcmV0dXJucyB0aGUKLSAqIG51bWJlciBvZiBibG9ja3MgZnJlZSBpbiB0aGUgZ3JvdXAuICovCi11bnNpZ25lZCBleHQ0X2luaXRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCSBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCkKLXsKLQlpbnQgYml0LCBiaXRfbWF4OwotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQl1bnNpZ25lZCBmcmVlX2Jsb2NrcywgZ3JvdXBfYmxvY2tzOwotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCi0JaWYgKGJoKSB7Ci0JCUpfQVNTRVJUX0JIKGJoLCBidWZmZXJfbG9ja2VkKGJoKSk7Ci0KLQkJLyogSWYgY2hlY2tzdW0gaXMgYmFkIG1hcmsgYWxsIGJsb2NrcyB1c2VkIHRvIHByZXZlbnQgYWxsb2NhdGlvbgotCQkgKiBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCi0JCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCkpIHsKLQkJCWV4dDRfZXJyb3Ioc2IsICJDaGVja3N1bSBiYWQgZm9yIGdyb3VwICV1IiwKLQkJCQkJYmxvY2tfZ3JvdXApOwotCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOwotCQkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7Ci0JCQlleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHNiLCBnZHAsIDApOwotCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKLQl9Ci0KLQkvKiBDaGVjayBmb3Igc3VwZXJibG9jayBhbmQgZ2R0IGJhY2t1cHMgaW4gdGhpcyBncm91cCAqLwotCWJpdF9tYXggPSBleHQ0X2JnX2hhc19zdXBlcihzYiwgYmxvY2tfZ3JvdXApOwotCi0JaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykgfHwKLQkgICAgYmxvY2tfZ3JvdXAgPCBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfbWV0YV9iZykgKgotCQkJICBzYmktPnNfZGVzY19wZXJfYmxvY2spIHsKLQkJaWYgKGJpdF9tYXgpIHsKLQkJCWJpdF9tYXggKz0gZXh0NF9iZ19udW1fZ2RiKHNiLCBibG9ja19ncm91cCk7Ci0JCQliaXRfbWF4ICs9Ci0JCQkJbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOwotCQl9Ci0JfSBlbHNlIHsgLyogRm9yIE1FVEFfQkdfQkxPQ0tfR1JPVVBTICovCi0JCWJpdF9tYXggKz0gZXh0NF9iZ19udW1fZ2RiKHNiLCBibG9ja19ncm91cCk7Ci0JfQotCi0JaWYgKGJsb2NrX2dyb3VwID09IG5ncm91cHMgLSAxKSB7Ci0JCS8qCi0JCSAqIEV2ZW4gdGhvdWdoIG1rZTJmcyBhbHdheXMgaW5pdGlhbGl6ZSBmaXJzdCBhbmQgbGFzdCBncm91cAotCQkgKiBpZiBzb21lIG90aGVyIHRvb2wgZW5hYmxlZCB0aGUgRVhUNF9CR19CTE9DS19VTklOSVQgd2UgbmVlZAotCQkgKiB0byBtYWtlIHN1cmUgd2UgY2FsY3VsYXRlIHRoZSByaWdodCBmcmVlIGJsb2NrcwotCQkgKi8KLQkJZ3JvdXBfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoc2JpLT5zX2VzKSAtCi0JCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBuZ3JvdXBzIC0gMSk7Ci0JfSBlbHNlIHsKLQkJZ3JvdXBfYmxvY2tzID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQl9Ci0KLQlmcmVlX2Jsb2NrcyA9IGdyb3VwX2Jsb2NrcyAtIGJpdF9tYXg7Ci0KLQlpZiAoYmgpIHsKLQkJZXh0NF9mc2Jsa190IHN0YXJ0LCB0bXA7Ci0JCWludCBmbGV4X2JnID0gMDsKLQotCQlmb3IgKGJpdCA9IDA7IGJpdCA8IGJpdF9tYXg7IGJpdCsrKQotCQkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7Ci0KLQkJc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7Ci0KLQkJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsCi0JCQkJCSAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GTEVYX0JHKSkKLQkJCWZsZXhfYmcgPSAxOwotCi0JCS8qIFNldCBiaXRzIGZvciBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIGlub2RlIHRhYmxlICovCi0JCXRtcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApOwotCQlpZiAoIWZsZXhfYmcgfHwgZXh0NF9ibG9ja19pbl9ncm91cChzYiwgdG1wLCBibG9ja19ncm91cCkpCi0JCQlleHQ0X3NldF9iaXQodG1wIC0gc3RhcnQsIGJoLT5iX2RhdGEpOwotCi0JCXRtcCA9IGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApOwotCQlpZiAoIWZsZXhfYmcgfHwgZXh0NF9ibG9ja19pbl9ncm91cChzYiwgdG1wLCBibG9ja19ncm91cCkpCi0JCQlleHQ0X3NldF9iaXQodG1wIC0gc3RhcnQsIGJoLT5iX2RhdGEpOwotCi0JCXRtcCA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7Ci0JCWZvciAoOyB0bXAgPCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApICsKLQkJCQlzYmktPnNfaXRiX3Blcl9ncm91cDsgdG1wKyspIHsKLQkJCWlmICghZmxleF9iZyB8fAotCQkJCWV4dDRfYmxvY2tfaW5fZ3JvdXAoc2IsIHRtcCwgYmxvY2tfZ3JvdXApKQotCQkJCWV4dDRfc2V0X2JpdCh0bXAgLSBzdGFydCwgYmgtPmJfZGF0YSk7Ci0JCX0KLQkJLyoKLQkJICogQWxzbyBpZiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB3aXRoaW4gdGhlIGdyb3VwIGlzCi0JCSAqIGxlc3MgdGhhbiB0aGUgYmxvY2tzaXplICogOCAoIHdoaWNoIGlzIHRoZSBzaXplCi0JCSAqIG9mIGJpdG1hcCApLCBzZXQgcmVzdCBvZiB0aGUgYmxvY2sgYml0bWFwIHRvIDEKLQkJICovCi0JCWV4dDRfbWFya19iaXRtYXBfZW5kKGdyb3VwX2Jsb2Nrcywgc2ItPnNfYmxvY2tzaXplICogOCwKLQkJCQkgICAgIGJoLT5iX2RhdGEpOwotCX0KLQlyZXR1cm4gZnJlZV9ibG9ja3MgLSBleHQ0X2dyb3VwX3VzZWRfbWV0YV9ibG9ja3Moc2IsIGJsb2NrX2dyb3VwLCBnZHApOwotfQotCi0KIC8qCiAgKiBUaGUgZnJlZSBibG9ja3MgYXJlIG1hbmFnZWQgYnkgYml0bWFwcy4gIEEgZmlsZSBzeXN0ZW0gY29udGFpbnMgc2V2ZXJhbAogICogYmxvY2tzIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgY29udGFpbnMgMSBiaXRtYXAgYmxvY2sgZm9yIGJsb2NrcywgMSBiaXRtYXAKQEAgLTM2Miw1MyArNDAzLDU0IEBACiB9CiAKIC8qKgotICogZXh0NF9oYXNfZnJlZV9ibG9ja3MoKQorICogZXh0NF9oYXNfZnJlZV9jbHVzdGVycygpCiAgKiBAc2JpOglpbi1jb3JlIHN1cGVyIGJsb2NrIHN0cnVjdHVyZS4KLSAqIEBuYmxvY2tzOgludW1iZXIgb2YgbmVlZGVkIGJsb2NrcworICogQG5jbHVzdGVyczoJbnVtYmVyIG9mIG5lZWRlZCBibG9ja3MKKyAqIEBmbGFnczoJZmxhZ3MgZnJvbSBleHQ0X21iX25ld19ibG9ja3MoKQogICoKLSAqIENoZWNrIGlmIGZpbGVzeXN0ZW0gaGFzIG5ibG9ja3MgZnJlZSAmIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqIENoZWNrIGlmIGZpbGVzeXN0ZW0gaGFzIG5jbHVzdGVycyBmcmVlICYgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgogICogT24gc3VjY2VzcyByZXR1cm4gMSwgcmV0dXJuIDAgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksCi0JCQkJczY0IG5ibG9ja3MsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgZXh0NF9oYXNfZnJlZV9jbHVzdGVycyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksCisJCQkJICBzNjQgbmNsdXN0ZXJzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JczY0IGZyZWVfYmxvY2tzLCBkaXJ0eV9ibG9ja3MsIHJvb3RfYmxvY2tzOwotCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjID0gJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXI7Ci0Jc3RydWN0IHBlcmNwdV9jb3VudGVyICpkYmMgPSAmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXI7CisJczY0IGZyZWVfY2x1c3RlcnMsIGRpcnR5X2NsdXN0ZXJzLCByb290X2NsdXN0ZXJzOworCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmNjID0gJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmRjYyA9ICZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyOwogCi0JZnJlZV9ibG9ja3MgID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShmYmMpOwotCWRpcnR5X2Jsb2NrcyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZGJjKTsKLQlyb290X2Jsb2NrcyA9IGV4dDRfcl9ibG9ja3NfY291bnQoc2JpLT5zX2VzKTsKKwlmcmVlX2NsdXN0ZXJzICA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZmNjKTsKKwlkaXJ0eV9jbHVzdGVycyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoZGNjKTsKKwlyb290X2NsdXN0ZXJzID0gRVhUNF9CMkMoc2JpLCBleHQ0X3JfYmxvY2tzX2NvdW50KHNiaS0+c19lcykpOwogCi0JaWYgKGZyZWVfYmxvY2tzIC0gKG5ibG9ja3MgKyByb290X2Jsb2NrcyArIGRpcnR5X2Jsb2NrcykgPAotCQkJCQkJRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSykgewotCQlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoZmJjKTsKLQkJZGlydHlfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKGRiYyk7CisJaWYgKGZyZWVfY2x1c3RlcnMgLSAobmNsdXN0ZXJzICsgcm9vdF9jbHVzdGVycyArIGRpcnR5X2NsdXN0ZXJzKSA8CisJCQkJCUVYVDRfRlJFRUNMVVNURVJTX1dBVEVSTUFSSykgeworCQlmcmVlX2NsdXN0ZXJzICA9IEVYVDRfQzJCKHNiaSwgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKGZjYykpOworCQlkaXJ0eV9jbHVzdGVycyA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZShkY2MpOwogCX0KLQkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgc3BhY2UgYWZ0ZXIKLQkgKiBhY2NvdW50aW5nIGZvciBjdXJyZW50IGRpcnR5IGJsb2NrcyAmIHJvb3QgcmVzZXJ2ZWQgYmxvY2tzLgorCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBzcGFjZSBhZnRlciBhY2NvdW50aW5nIGZvciBjdXJyZW50CisJICogZGlydHkgY2x1c3RlcnMgJiByb290IHJlc2VydmVkIGNsdXN0ZXJzLgogCSAqLwotCWlmIChmcmVlX2Jsb2NrcyA+PSAoKHJvb3RfYmxvY2tzICsgbmJsb2NrcykgKyBkaXJ0eV9ibG9ja3MpKQorCWlmIChmcmVlX2NsdXN0ZXJzID49ICgocm9vdF9jbHVzdGVycyArIG5jbHVzdGVycykgKyBkaXJ0eV9jbHVzdGVycykpCiAJCXJldHVybiAxOwogCi0JLyogSG0sIG5vcGUuICBBcmUgKGVub3VnaCkgcm9vdCByZXNlcnZlZCBibG9ja3MgYXZhaWxhYmxlPyAqLworCS8qIEhtLCBub3BlLiAgQXJlIChlbm91Z2gpIHJvb3QgcmVzZXJ2ZWQgY2x1c3RlcnMgYXZhaWxhYmxlPyAqLwogCWlmIChzYmktPnNfcmVzdWlkID09IGN1cnJlbnRfZnN1aWQoKSB8fAogCSAgICAoKHNiaS0+c19yZXNnaWQgIT0gMCkgJiYgaW5fZ3JvdXBfcChzYmktPnNfcmVzZ2lkKSkgfHwKIAkgICAgY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSB8fAogCQkoZmxhZ3MgJiBFWFQ0X01CX1VTRV9ST09UX0JMT0NLUykpIHsKIAotCQlpZiAoZnJlZV9ibG9ja3MgPj0gKG5ibG9ja3MgKyBkaXJ0eV9ibG9ja3MpKQorCQlpZiAoZnJlZV9jbHVzdGVycyA+PSAobmNsdXN0ZXJzICsgZGlydHlfY2x1c3RlcnMpKQogCQkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKLQkJCSAgIHM2NCBuYmxvY2tzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgZXh0NF9jbGFpbV9mcmVlX2NsdXN0ZXJzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKKwkJCSAgICAgczY0IG5jbHVzdGVycywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWlmIChleHQ0X2hhc19mcmVlX2Jsb2NrcyhzYmksIG5ibG9ja3MsIGZsYWdzKSkgewotCQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCBuYmxvY2tzKTsKKwlpZiAoZXh0NF9oYXNfZnJlZV9jbHVzdGVycyhzYmksIG5jbHVzdGVycywgZmxhZ3MpKSB7CisJCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlciwgbmNsdXN0ZXJzKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5PU1BDOwpAQCAtNDI4LDcgKzQ3MCw3IEBACiAgKi8KIGludCBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpCiB7Ci0JaWYgKCFleHQ0X2hhc19mcmVlX2Jsb2NrcyhFWFQ0X1NCKHNiKSwgMSwgMCkgfHwKKwlpZiAoIWV4dDRfaGFzX2ZyZWVfY2x1c3RlcnMoRVhUNF9TQihzYiksIDEsIDApIHx8CiAJICAgICgqcmV0cmllcykrKyA+IDMgfHwKIAkgICAgIUVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpCiAJCXJldHVybiAwOwpAQCAtNDQ0LDcgKzQ4Niw3IEBACiAgKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQogICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBjb3VudDoJCXBvaW50ZXIgdG8gdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQKKyAqIEBjb3VudDoJCXBvaW50ZXIgdG8gdG90YWwgbnVtYmVyIG9mIGNsdXN0ZXJzIG5lZWRlZAogICogQGVycnA6ICAgICAgICAgICAgICAgZXJyb3IgY29kZQogICoKICAqIFJldHVybiAxc3QgYWxsb2NhdGVkIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCAqY291bnQgc3RvcmVzIHRvdGFsIGFjY291bnQKQEAgLTQ3NiwxOCArNTE4LDE5IEBACiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gYXIubGVuOwogCQlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQkJZHF1b3RfYWxsb2NfYmxvY2tfbm9mYWlsKGlub2RlLCBhci5sZW4pOworCQlkcXVvdF9hbGxvY19ibG9ja19ub2ZhaWwoaW5vZGUsCisJCQkJRVhUNF9DMkIoRVhUNF9TQihpbm9kZS0+aV9zYiksIGFyLmxlbikpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIGV4dDRfY291bnRfZnJlZV9ibG9ja3MoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgYmxvY2tzCisgKiBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgY2x1c3RlcnMKICAqIEBzYjoJCXN1cGVyYmxvY2sKICAqCi0gKiBBZGRzIHVwIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgorICogQWRkcyB1cCB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgogICovCi1leHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWV4dDRfZnNibGtfdCBkZXNjX2NvdW50OwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKQEAgLTUwOCw3ICs1NTEsNyBAQAogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKLQkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKTsKKwkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCk7CiAJCWJyZWxzZShiaXRtYXBfYmgpOwogCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKIAkJaWYgKGJpdG1hcF9iaCA9PSBOVUxMKQpAQCAtNTE2LDEyICs1NTksMTMgQEAKIAogCQl4ID0gZXh0NF9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgImdyb3VwICV1OiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAotCQkJaSwgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCksIHgpOworCQkJaSwgZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApLCB4KTsKIAkJYml0bWFwX2NvdW50ICs9IHg7CiAJfQogCWJyZWxzZShiaXRtYXBfYmgpOwotCXByaW50ayhLRVJOX0RFQlVHICJleHQ0X2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAlbGx1IgotCQkiLCBjb21wdXRlZCA9ICVsbHUsICVsbHVcbiIsIGV4dDRfZnJlZV9ibG9ja3NfY291bnQoZXMpLAorCXByaW50ayhLRVJOX0RFQlVHICJleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnM6IHN0b3JlZCA9ICVsbHUiCisJICAgICAgICIsIGNvbXB1dGVkID0gJWxsdSwgJWxsdVxuIiwKKwkgICAgICAgRVhUNF9CMkMoc2JpLCBleHQ0X2ZyZWVfYmxvY2tzX2NvdW50KGVzKSksCiAJICAgICAgIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CiAJcmV0dXJuIGJpdG1hcF9jb3VudDsKICNlbHNlCkBAIC01MzAsNyArNTc0LDcgQEAKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CisJCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApOwogCX0KIAogCXJldHVybiBkZXNjX2NvdW50OwpAQCAtNjIwLDYgKzY2NCwzMSBAQAogCiB9CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlIHN5c3RlbSBtZXRhZGF0YSBjbHVzdGVycyBhdAorICogdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrIGdyb3VwLCBpbmNsdWRpbmcgdGhlIHJlc2VydmVkIGdkdCBibG9ja3MuCisgKi8KK3Vuc2lnbmVkIGV4dDRfbnVtX2Jhc2VfbWV0YV9jbHVzdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCXVuc2lnbmVkIG51bTsKKworCS8qIENoZWNrIGZvciBzdXBlcmJsb2NrIGFuZCBnZHQgYmFja3VwcyBpbiB0aGlzIGdyb3VwICovCisJbnVtID0gZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGJsb2NrX2dyb3VwKTsKKworCWlmICghRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIGJsb2NrX2dyb3VwIDwgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X21ldGFfYmcpICoKKwkJCSAgc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrKSB7CisJCWlmIChudW0pIHsKKwkJCW51bSArPSBleHQ0X2JnX251bV9nZGIoc2IsIGJsb2NrX2dyb3VwKTsKKwkJCW51bSArPSBsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CisJCX0KKwl9IGVsc2UgeyAvKiBGb3IgTUVUQV9CR19CTE9DS19HUk9VUFMgKi8KKwkJbnVtICs9IGV4dDRfYmdfbnVtX2dkYihzYiwgYmxvY2tfZ3JvdXApOworCX0KKwlyZXR1cm4gRVhUNF9OVU1fQjJDKHNiaSwgbnVtKTsKK30KIC8qKgogICoJZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrIC0gcmV0dXJuIGEgaGludCBmb3IgYmxvY2sgYWxsb2NhdGlvbgogICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgYWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBiN2Q3YmQwLi41YjBlMjZhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTQ0LDkgKzE0NCwxNyBAQAogI2RlZmluZSBFWFQ0X01BUF9VTldSSVRURU4JKDEgPDwgQkhfVW53cml0dGVuKQogI2RlZmluZSBFWFQ0X01BUF9CT1VOREFSWQkoMSA8PCBCSF9Cb3VuZGFyeSkKICNkZWZpbmUgRVhUNF9NQVBfVU5JTklUCQkoMSA8PCBCSF9VbmluaXQpCisvKiBTb21ldGltZXMgKGluIHRoZSBiaWdhbGxvYyBjYXNlLCBmcm9tIGV4dDRfZGFfZ2V0X2Jsb2NrX3ByZXApIHRoZSBjYWxsZXIgb2YKKyAqIGV4dDRfbWFwX2Jsb2NrcyB3YW50cyB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXIgaGFzCisgKiBhbHJlYWR5IGJlZW4gYWNjb3VudGVkIGZvci4gRVhUNF9NQVBfRlJPTV9DTFVTVEVSIGNvbnZleXMgdG8gdGhlIGNhbGxlciB0aGF0CisgKiB0aGUgcmVxdWVzdGVkIG1hcHBpbmcgd2FzIGZyb20gcHJldmlvdXNseSBtYXBwZWQgKG9yIGRlbGF5ZWQgYWxsb2NhdGVkKQorICogY2x1c3Rlci4gV2UgdXNlIEJIX0FsbG9jRnJvbUNsdXN0ZXIgb25seSBmb3IgdGhpcyBmbGFnLiBCSF9BbGxvY0Zyb21DbHVzdGVyCisgKiBzaG91bGQgbmV2ZXIgYXBwZWFyIG9uIGJ1ZmZlcl9oZWFkJ3Mgc3RhdGUgZmxhZ3MuCisgKi8KKyNkZWZpbmUgRVhUNF9NQVBfRlJPTV9DTFVTVEVSCSgxIDw8IEJIX0FsbG9jRnJvbUNsdXN0ZXIpCiAjZGVmaW5lIEVYVDRfTUFQX0ZMQUdTCQkoRVhUNF9NQVBfTkVXIHwgRVhUNF9NQVBfTUFQUEVEIHxcCiAJCQkJIEVYVDRfTUFQX1VOV1JJVFRFTiB8IEVYVDRfTUFQX0JPVU5EQVJZIHxcCi0JCQkJIEVYVDRfTUFQX1VOSU5JVCkKKwkJCQkgRVhUNF9NQVBfVU5JTklUIHwgRVhUNF9NQVBfRlJPTV9DTFVTVEVSKQogCiBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHsKIAlleHQ0X2ZzYmxrX3QgbV9wYmxrOwpAQCAtMjM5LDggKzI0NywxMSBAQAogIyBkZWZpbmUgRVhUNF9CTE9DS19TSVpFKHMpCQkoRVhUNF9NSU5fQkxPQ0tfU0laRSA8PCAocyktPnNfbG9nX2Jsb2NrX3NpemUpCiAjZW5kaWYKICNkZWZpbmUJRVhUNF9BRERSX1BFUl9CTE9DSyhzKQkJKEVYVDRfQkxPQ0tfU0laRShzKSAvIHNpemVvZihfX3UzMikpCisjZGVmaW5lIEVYVDRfQ0xVU1RFUl9TSVpFKHMpCQkoRVhUNF9CTE9DS19TSVpFKHMpIDw8IFwKKwkJCQkJIEVYVDRfU0IocyktPnNfY2x1c3Rlcl9iaXRzKQogI2lmZGVmIF9fS0VSTkVMX18KICMgZGVmaW5lIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfYmxvY2tzaXplX2JpdHMpCisjIGRlZmluZSBFWFQ0X0NMVVNURVJfQklUUyhzKQkJKEVYVDRfU0IocyktPnNfY2x1c3Rlcl9iaXRzKQogI2Vsc2UKICMgZGVmaW5lIEVYVDRfQkxPQ0tfU0laRV9CSVRTKHMpCSgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKICNlbmRpZgpAQCAtMjU4LDYgKzI2OSwxNCBAQAogI2VuZGlmCiAjZGVmaW5lIEVYVDRfQkxPQ0tfQUxJR04oc2l6ZSwgYmxrYml0cykJCUFMSUdOKChzaXplKSwgKDEgPDwgKGJsa2JpdHMpKSkKIAorLyogVHJhbnNsYXRlIGEgYmxvY2sgbnVtYmVyIHRvIGEgY2x1c3RlciBudW1iZXIgKi8KKyNkZWZpbmUgRVhUNF9CMkMoc2JpLCBibGspCSgoYmxrKSA+PiAoc2JpKS0+c19jbHVzdGVyX2JpdHMpCisvKiBUcmFuc2xhdGUgYSBjbHVzdGVyIG51bWJlciB0byBhIGJsb2NrIG51bWJlciAqLworI2RlZmluZSBFWFQ0X0MyQihzYmksIGNsdXN0ZXIpCSgoY2x1c3RlcikgPDwgKHNiaSktPnNfY2x1c3Rlcl9iaXRzKQorLyogVHJhbnNsYXRlICMgb2YgYmxrcyB0byAjIG9mIGNsdXN0ZXJzICovCisjZGVmaW5lIEVYVDRfTlVNX0IyQyhzYmksIGJsa3MpCSgoKGJsa3MpICsgKHNiaSktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpID4+IFwKKwkJCQkgKHNiaSktPnNfY2x1c3Rlcl9iaXRzKQorCiAvKgogICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKICAqLwpAQCAtMjg5LDcgKzMwOCw3IEBACiAKIHN0cnVjdCBmbGV4X2dyb3VwcyB7CiAJYXRvbWljX3QgZnJlZV9pbm9kZXM7Ci0JYXRvbWljX3QgZnJlZV9ibG9ja3M7CisJYXRvbWljX3QgZnJlZV9jbHVzdGVyczsKIAlhdG9taWNfdCB1c2VkX2RpcnM7CiB9OwogCkBAIC0zMDYsNiArMzI1LDcgQEAKICNkZWZpbmUgRVhUNF9ERVNDX1NJWkUocykJCShFWFQ0X1NCKHMpLT5zX2Rlc2Nfc2l6ZSkKICNpZmRlZiBfX0tFUk5FTF9fCiAjIGRlZmluZSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAocykJKEVYVDRfU0IocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyMgZGVmaW5lIEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHMpCShFWFQ0X1NCKHMpLT5zX2NsdXN0ZXJzX3Blcl9ncm91cCkKICMgZGVmaW5lIEVYVDRfREVTQ19QRVJfQkxPQ0socykJCShFWFQ0X1NCKHMpLT5zX2Rlc2NfcGVyX2Jsb2NrKQogIyBkZWZpbmUgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHMpCShFWFQ0X1NCKHMpLT5zX2lub2Rlc19wZXJfZ3JvdXApCiAjIGRlZmluZSBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMocykJKEVYVDRfU0IocyktPnNfZGVzY19wZXJfYmxvY2tfYml0cykKQEAgLTM1OCw4ICszNzgsNyBAQAogCiAvKiBGbGFncyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgYnkgbmV3IGlub2RlcyBmcm9tIHRoZWlyIHBhcmVudC4gKi8KICNkZWZpbmUgRVhUNF9GTF9JTkhFUklURUQgKEVYVDRfU0VDUk1fRkwgfCBFWFQ0X1VOUk1fRkwgfCBFWFQ0X0NPTVBSX0ZMIHxcCi0JCQkgICBFWFQ0X1NZTkNfRkwgfCBFWFQ0X0lNTVVUQUJMRV9GTCB8IEVYVDRfQVBQRU5EX0ZMIHxcCi0JCQkgICBFWFQ0X05PRFVNUF9GTCB8IEVYVDRfTk9BVElNRV9GTCB8XAorCQkJICAgRVhUNF9TWU5DX0ZMIHwgRVhUNF9OT0RVTVBfRkwgfCBFWFQ0X05PQVRJTUVfRkwgfFwKIAkJCSAgIEVYVDRfTk9DT01QUl9GTCB8IEVYVDRfSk9VUk5BTF9EQVRBX0ZMIHxcCiAJCQkgICBFWFQ0X05PVEFJTF9GTCB8IEVYVDRfRElSU1lOQ19GTCkKIApAQCAtNTIwLDYgKzUzOSw4IEBACiAjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUCQkweDAwMjAKIAkvKiBEb24ndCBub3JtYWxpemUgYWxsb2NhdGlvbiBzaXplICh1c2VkIGZvciBmYWxsb2NhdGUpICovCiAjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19OT19OT1JNQUxJWkUJCTB4MDA0MAorCS8qIFJlcXVlc3Qgd2lsbCBub3QgcmVzdWx0IGluIGlub2RlIHNpemUgdXBkYXRlICh1c2VyIGZvciBmYWxsb2NhdGUpICovCisjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19LRUVQX1NJWkUJCTB4MDA4MAogCiAvKgogICogRmxhZ3MgdXNlZCBieSBleHQ0X2ZyZWVfYmxvY2tzCkBAIC01MjgsNiArNTQ5LDEzIEBACiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUCQkweDAwMDIKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQJMHgwMDA0CiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUJMHgwMDA4CisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0ZJUlNUX0NMVVNURVIJMHgwMDEwCisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0xBU1RfQ0xVU1RFUgkweDAwMjAKKworLyoKKyAqIEZsYWdzIHVzZWQgYnkgZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzCisgKi8KKyNkZWZpbmUgRVhUNF9ESVNDQVJEX1BBUlRJQUxfUEdfWkVST19VTk1BUFBFRAkweDAwMDEKIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzCkBAIC01MzgsOSArNTY2LDYgQEAKICNkZWZpbmUJRVhUNF9JT0NfU0VUVkVSU0lPTgkJX0lPVygnZicsIDQsIGxvbmcpCiAjZGVmaW5lCUVYVDRfSU9DX0dFVFZFUlNJT05fT0xECQlGU19JT0NfR0VUVkVSU0lPTgogI2RlZmluZQlFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRAkJRlNfSU9DX1NFVFZFUlNJT04KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotI2RlZmluZSBFWFQ0X0lPQ19XQUlUX0ZPUl9SRUFET05MWQlfSU9SKCdmJywgOTksIGxvbmcpCi0jZW5kaWYKICNkZWZpbmUgRVhUNF9JT0NfR0VUUlNWU1oJCV9JT1IoJ2YnLCA1LCBsb25nKQogI2RlZmluZSBFWFQ0X0lPQ19TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGxvbmcpCiAjZGVmaW5lIEVYVDRfSU9DX0dST1VQX0VYVEVORAkJX0lPVygnZicsIDcsIHVuc2lnbmVkIGxvbmcpCkBAIC01NjMsOSArNTg4LDYgQEAKICNkZWZpbmUgRVhUNF9JT0MzMl9TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGludCkKICNkZWZpbmUgRVhUNF9JT0MzMl9HUk9VUF9FWFRFTkQJCV9JT1coJ2YnLCA3LCB1bnNpZ25lZCBpbnQpCiAjZGVmaW5lIEVYVDRfSU9DMzJfR1JPVVBfQURECQlfSU9XKCdmJywgOCwgc3RydWN0IGNvbXBhdF9leHQ0X25ld19ncm91cF9pbnB1dCkKLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotI2RlZmluZSBFWFQ0X0lPQzMyX1dBSVRfRk9SX1JFQURPTkxZCV9JT1IoJ2YnLCA5OSwgaW50KQotI2VuZGlmCiAjZGVmaW5lIEVYVDRfSU9DMzJfR0VUVkVSU0lPTl9PTEQJRlNfSU9DMzJfR0VUVkVSU0lPTgogI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT05fT0xECUZTX0lPQzMyX1NFVFZFUlNJT04KICNlbmRpZgpAQCAtODM3LDYgKzg1OSw3IEBACiAJZXh0NF9ncm91cF90CWlfbGFzdF9hbGxvY19ncm91cDsKIAogCS8qIGFsbG9jYXRpb24gcmVzZXJ2YXRpb24gaW5mbyBmb3IgZGVsYWxsb2MgKi8KKwkvKiBJbiBjYXNlIG9mIGJpZ2FsbG9jLCB0aGVzZSByZWZlciB0byBjbHVzdGVycyByYXRoZXIgdGhhbiBibG9ja3MgKi8KIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CkBAIC04ODYsNyArOTA5LDYgQEAKIC8qCiAgKiBNb3VudCBmbGFncwogICovCi0jZGVmaW5lIEVYVDRfTU9VTlRfT0xEQUxMT0MJCTB4MDAwMDIgIC8qIERvbid0IHVzZSB0aGUgbmV3IE9ybG92IGFsbG9jYXRvciAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0dSUElECQkweDAwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREVCVUcJCTB4MDAwMDgJLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDAxMAkvKiBDb250aW51ZSBvbiBlcnJvcnMgKi8KQEAgLTkxOCw2ICs5NDAsOSBAQAogI2RlZmluZSBFWFQ0X01PVU5UX0RJU0NBUkQJCTB4NDAwMDAwMDAgLyogSXNzdWUgRElTQ0FSRCByZXF1ZXN0cyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0lOSVRfSU5PREVfVEFCTEUJMHg4MDAwMDAwMCAvKiBJbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgaXRhYmxlcyAqLwogCisjZGVmaW5lIEVYVDRfTU9VTlQyX0VYUExJQ0lUX0RFTEFMTE9DCTB4MDAwMDAwMDEgLyogVXNlciBleHBsaWNpdGx5CisJCQkJCQkgICAgICBzcGVjaWZpZWQgZGVsYWxsb2MgKi8KKwogI2RlZmluZSBjbGVhcl9vcHQoc2IsIG9wdCkJCUVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCAmPSBcCiAJCQkJCQl+RVhUNF9NT1VOVF8jI29wdAogI2RlZmluZSBzZXRfb3B0KHNiLCBvcHQpCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQgfD0gXApAQCAtOTY4LDkgKzk5Myw5IEBACiAvKjEwKi8JX19sZTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCiAJX19sZTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLwogCV9fbGUzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCi0JX19sZTMyCXNfb2Jzb19sb2dfZnJhZ19zaXplOwkvKiBPYnNvbGV0ZWQgZnJhZ21lbnQgc2l6ZSAqLworCV9fbGUzMglzX2xvZ19jbHVzdGVyX3NpemU7CS8qIEFsbG9jYXRpb24gY2x1c3RlciBzaXplICovCiAvKjIwKi8JX19sZTMyCXNfYmxvY2tzX3Blcl9ncm91cDsJLyogIyBCbG9ja3MgcGVyIGdyb3VwICovCi0JX19sZTMyCXNfb2Jzb19mcmFnc19wZXJfZ3JvdXA7CS8qIE9ic29sZXRlZCBmcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfY2x1c3RlcnNfcGVyX2dyb3VwOwkvKiAjIENsdXN0ZXJzIHBlciBncm91cCAqLwogCV9fbGUzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLwogCV9fbGUzMglzX210aW1lOwkJLyogTW91bnQgdGltZSAqLwogLyozMCovCV9fbGUzMglzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLwpAQCAtMTA2Niw3ICsxMDkxLDEwIEBACiAJX191OAlzX2xhc3RfZXJyb3JfZnVuY1szMl07CS8qIGZ1bmN0aW9uIHdoZXJlIHRoZSBlcnJvciBoYXBwZW5lZCAqLwogI2RlZmluZSBFWFQ0X1NfRVJSX0VORCBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jaywgc19tb3VudF9vcHRzKQogCV9fdTgJc19tb3VudF9vcHRzWzY0XTsKLQlfX2xlMzIJc19yZXNlcnZlZFsxMTJdOyAgICAgICAgLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworCV9fbGUzMglzX3Vzcl9xdW90YV9pbnVtOwkvKiBpbm9kZSBmb3IgdHJhY2tpbmcgdXNlciBxdW90YSAqLworCV9fbGUzMglzX2dycF9xdW90YV9pbnVtOwkvKiBpbm9kZSBmb3IgdHJhY2tpbmcgZ3JvdXAgcXVvdGEgKi8KKwlfX2xlMzIJc19vdmVyaGVhZF9jbHVzdGVyczsJLyogb3ZlcmhlYWQgYmxvY2tzL2NsdXN0ZXJzIGluIGZzICovCisJX19sZTMyICBzX3Jlc2VydmVkWzEwOV07ICAgICAgICAvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCiB9OwogCiAjZGVmaW5lIEVYVDRfU19FUlJfTEVOIChFWFQ0X1NfRVJSX0VORCAtIEVYVDRfU19FUlJfU1RBUlQpCkBAIC0xMDg2LDYgKzExMTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgc19kZXNjX3NpemU7CS8qIFNpemUgb2YgYSBncm91cCBkZXNjcmlwdG9yIGluIGJ5dGVzICovCiAJdW5zaWduZWQgbG9uZyBzX2lub2Rlc19wZXJfYmxvY2s7LyogTnVtYmVyIG9mIGlub2RlcyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgYmxvY2tzIGluIGEgZ3JvdXAgKi8KKwl1bnNpZ25lZCBsb25nIHNfY2x1c3RlcnNfcGVyX2dyb3VwOyAvKiBOdW1iZXIgb2YgY2x1c3RlcnMgaW4gYSBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19pbm9kZXNfcGVyX2dyb3VwOy8qIE51bWJlciBvZiBpbm9kZXMgaW4gYSBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19pdGJfcGVyX2dyb3VwOwkvKiBOdW1iZXIgb2YgaW5vZGUgdGFibGUgYmxvY2tzIHBlciBncm91cCAqLwogCXVuc2lnbmVkIGxvbmcgc19nZGJfY291bnQ7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9yIGJsb2NrcyAqLwpAQCAtMTA5NCw2ICsxMTIzLDggQEAKIAlleHQ0X2dyb3VwX3Qgc19ibG9ja2ZpbGVfZ3JvdXBzOy8qIEdyb3VwcyBhY2NlcHRhYmxlIGZvciBub24tZXh0ZW50IGZpbGVzICovCiAJdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KIAl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLworCXVuc2lnbmVkIGludCBzX2NsdXN0ZXJfcmF0aW87CS8qIE51bWJlciBvZiBibG9ja3MgcGVyIGNsdXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc19jbHVzdGVyX2JpdHM7CS8qIGxvZzIgb2Ygc19jbHVzdGVyX3JhdGlvICovCiAJbG9mZl90IHNfYml0bWFwX21heGJ5dGVzOwkvKiBtYXggYnl0ZXMgZm9yIGJpdG1hcCBmaWxlcyAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwpAQCAtMTExNywxMCArMTE0OCwxMCBAQAogCXUzMiBzX2hhc2hfc2VlZFs0XTsKIAlpbnQgc19kZWZfaGFzaF92ZXJzaW9uOwogCWludCBzX2hhc2hfdW5zaWduZWQ7CS8qIDMgaWYgaGFzaCBzaG91bGQgYmUgc2lnbmVkLCAwIGlmIG5vdCAqLwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVibG9ja3NfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlY2x1c3RlcnNfY291bnRlcjsKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlaW5vZGVzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlyc19jb3VudGVyOwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnR5YmxvY2tzX2NvdW50ZXI7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlydHljbHVzdGVyc19jb3VudGVyOwogCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc19wcm9jOwogCXN0cnVjdCBrb2JqZWN0IHNfa29iajsKQEAgLTExMzYsMTAgKzExNjcsNiBAQAogCXUzMiBzX21heF9iYXRjaF90aW1lOwogCXUzMiBzX21pbl9iYXRjaF90aW1lOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCByb193YWl0X3F1ZXVlOwkvKiBGb3IgcGVvcGxlIHdhaXRpbmcgZm9yIHRoZSBmcyB0byBnbyByZWFkLW9ubHkgKi8KLSNlbmRpZgogI2lmZGVmIENPTkZJR19RVU9UQQogCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsJCS8qIE5hbWVzIG9mIHF1b3RhIGZpbGVzIHdpdGggam91cm5hbGxlZCBxdW90YSAqLwogCWludCBzX2pxdW90YV9mbXQ7CQkJLyogRm9ybWF0IG9mIHF1b3RhIHRvIHVzZSAqLwpAQCAtMTI0OCw2ICsxMjc1LDE1IEBACiAJCSBpbm8gPD0gbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3NldF9pb191bndyaXR0ZW5fZmxhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgZXh0NF9pb19lbmQgKmlvX2VuZCkKK3sKKwlpZiAoIShpb19lbmQtPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pKSB7CisJCWlvX2VuZC0+ZmxhZyB8PSBFWFQ0X0lPX0VORF9VTldSSVRURU47CisJCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7CisJfQorfQorCiAvKgogICogSW5vZGUgZHluYW1pYyBzdGF0ZSBmbGFncwogICovCkBAIC0xMzYwLDYgKzEzOTYsNyBAQAogI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSwkweDAwMjAKICNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9FWFRSQV9JU0laRQkweDAwNDAKICNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9RVU9UQQkJMHgwMTAwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MJCTB4MDIwMAogCiAjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKICNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKQEAgLTE0MDIsNyArMTQzOSw4IEBACiAJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSyB8IFwKIAkJCQkJIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRVhUUkFfSVNJWkUgfCBcCiAJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUiB8XAotCQkJCQkgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9IVUdFX0ZJTEUpCisJCQkJCSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRSB8XAorCQkJCQkgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9CSUdBTExPQykKIAogLyoKICAqIERlZmF1bHQgdmFsdWVzIGZvciB1c2VyIGFuZC9vciBncm91cCB1c2luZyByZXNlcnZlZCBibG9ja3MKQEAgLTE3MzUsOSArMTc3Myw5IEBACiAJCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJCSB1bnNpZ25lZCBsb25nICpjb3VudCwKIAkJCQkJIGludCAqZXJycCk7Ci1leHRlcm4gaW50IGV4dDRfY2xhaW1fZnJlZV9ibG9ja3Moc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAotCQkJCSAgczY0IG5ibG9ja3MsIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIGludCBleHQ0X2NsYWltX2ZyZWVfY2x1c3RlcnMoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAorCQkJCSAgICBzNjQgbmNsdXN0ZXJzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19ibG9ja3NfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKIAkJCQkJCSAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsCkBAIC0xNzQ1LDEyICsxNzgzLDE4IEBACiBleHRlcm4gaW50IGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcyk7CiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXApOwotZXh0ZXJuIHVuc2lnbmVkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkgICAgICAgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKLSNkZWZpbmUgZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYykJCQlcCi0JCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIE5VTEwsIGdyb3VwLCBkZXNjKQorZXh0ZXJuIHZvaWQgZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgZXh0NF9ncm91cF90IGdyb3VwLAorCQkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHVuc2lnbmVkIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKKwkJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKTsKK2V4dGVybiB1bnNpZ25lZCBleHQ0X251bV9iYXNlX21ldGFfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCk7CitleHRlcm4gdW5zaWduZWQgZXh0NF9udW1fb3ZlcmhlYWRfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAorCQkJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApOwogZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qIGRpci5jICovCkBAIC0xNzc2LDcgKzE4MjAsOCBAQAogCiAvKiBpYWxsb2MuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZXh0NF9uZXdfaW5vZGUoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIGludCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsIF9fdTMyIGdvYWwpOworCQkJCSAgICBjb25zdCBzdHJ1Y3QgcXN0ciAqcXN0ciwgX191MzIgZ29hbCwKKwkJCQkgICAgdWlkX3QgKm93bmVyKTsKIGV4dGVybiB2b2lkIGV4dDRfZnJlZV9pbm9kZShoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICogZXh0NF9vcnBoYW5fZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpAQCAtMTgzOSw2ICsxODg0LDEyIEBACiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgZnJvbSk7CiBleHRlcm4gaW50IGV4dDRfYmxvY2tfemVyb19wYWdlX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsCiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgZnJvbSwgbG9mZl90IGxlbmd0aCk7CitleHRlcm4gaW50IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20sCisJCWxvZmZfdCBsZW5ndGgsIGludCBmbGFncyk7CitleHRlcm4gaW50IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZV90ICpoYW5kbGUsCisJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgZnJvbSwKKwkJbG9mZl90IGxlbmd0aCwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKIGV4dGVybiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTE4NzgsNDAgKzE5MjksNDAgQEAKIGV4dGVybiB2b2lkICpleHQ0X2t2bWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gdm9pZCAqZXh0NF9rdnphbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKTsKLWV4dGVybiB2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCSAgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSBleHQ0X2Vycm9yKHNiLCBtZXNzYWdlLi4uKQlfX2V4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAlcCiAJCQkJCQkgICAgIF9fTElORV9fLCAjIyBtZXNzYWdlKQotZXh0ZXJuIHZvaWQgZXh0NF9lcnJvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOwotZXh0ZXJuIHZvaWQgZXh0NF9lcnJvcl9maWxlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworZXh0ZXJuIF9fcHJpbnRmKDUsIDYpCit2b2lkIGV4dDRfZXJyb3JfaW5vZGUoc3RydWN0IGlub2RlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBleHQ0X2ZzYmxrX3QsCisJCSAgICAgIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBfX3ByaW50Zig1LCA2KQordm9pZCBleHQ0X2Vycm9yX2ZpbGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGV4dDRfZnNibGtfdCwKKwkJICAgICBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2V4dDRfc3RkX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosCiAJCQkgICAgIHVuc2lnbmVkIGludCwgaW50KTsKLWV4dGVybiB2b2lkIF9fZXh0NF9hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCSAgICAgICBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CitleHRlcm4gX19wcmludGYoNCwgNSkKK3ZvaWQgX19leHQ0X2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJICBjb25zdCBjaGFyICosIC4uLik7CiAjZGVmaW5lIGV4dDRfYWJvcnQoc2IsIG1lc3NhZ2UuLi4pCV9fZXh0NF9hYm9ydChzYiwgX19mdW5jX18sIFwKIAkJCQkJCSAgICAgICBfX0xJTkVfXywgIyMgbWVzc2FnZSkKLWV4dGVybiB2b2lkIF9fZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKLQkJCSAgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJICAgIGNvbnN0IGNoYXIgKiwgLi4uKTsKICNkZWZpbmUgZXh0NF93YXJuaW5nKHNiLCBtZXNzYWdlLi4uKQlfX2V4dDRfd2FybmluZyhzYiwgX19mdW5jX18sIFwKIAkJCQkJCSAgICAgICBfX0xJTkVfXywgIyMgbWVzc2FnZSkKLWV4dGVybiB2b2lkIGV4dDRfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCBleHQ0X21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2R1bXBfbW1wX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IG1tcF9zdHJ1Y3QgKm1tcCwKIAkJCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICopOwogI2RlZmluZSBkdW1wX21tcF9tc2coc2IsIG1tcCwgbXNnKQlfX2R1bXBfbW1wX21zZyhzYiwgbW1wLCBfX2Z1bmNfXywgXAogCQkJCQkJICAgICAgIF9fTElORV9fLCBtc2cpCi1leHRlcm4gdm9pZCBfX2V4dDRfZ3JwX2xvY2tlZF9lcnJvcihjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgXAotCQkJCSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90LCBcCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcsIGV4dDRfZnNibGtfdCwgXAotCQkJCSAgICBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDcsIDgpKSk7CitleHRlcm4gX19wcmludGYoNywgOCkKK3ZvaWQgX19leHQ0X2dycF9sb2NrZWRfZXJyb3IoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCisJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBleHQ0X2dyb3VwX3QsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcsIGV4dDRfZnNibGtfdCwKKwkJCSAgICAgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSBleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGdycCwgbWVzc2FnZS4uLikgXAogCV9fZXh0NF9ncnBfbG9ja2VkX2Vycm9yKF9fZnVuY19fLCBfX0xJTkVfXywgKHNiKSwgKGdycCksICMjIG1lc3NhZ2UpCiBleHRlcm4gdm9pZCBleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTE5MjcsOCArMTk3OCw4IEBACiAJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7Ci1leHRlcm4gX191MzIgZXh0NF9mcmVlX2Jsa3NfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIF9fdTMyIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIF9fdTMyIGV4dDRfdXNlZF9kaXJzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xOTQxLDggKzE5OTIsOSBAQAogCQkJCSAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOwogZXh0ZXJuIHZvaWQgZXh0NF9pbm9kZV90YWJsZV9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOwotZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsa3Nfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLAorCQkJCQkgX191MzIgY291bnQpOwogZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2lub2Rlc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpOwogZXh0ZXJuIHZvaWQgZXh0NF91c2VkX2RpcnNfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0yMDUxLDEzICsyMTAzLDEzIEBACiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyogRWFjaCBDUFUgY2FuIGFjY3VtdWxhdGUgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggYmxvY2tzIGluIHRoZWlyIGxvY2FsCi0gKiBjb3VudGVycy4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBmcmVlIGJsb2NrcyBtb3JlCisvKiBFYWNoIENQVSBjYW4gYWNjdW11bGF0ZSBwZXJjcHVfY291bnRlcl9iYXRjaCBjbHVzdGVycyBpbiB0aGVpciBsb2NhbAorICogY291bnRlcnMuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnJlZSBjbHVzdGVycyBtb3JlCiAgKiB0aGFuIHBlcmNwdV9jb3VudGVyX2JhdGNoICAqIG5yX2NwdV9pZHMuIEFsc28gYWRkIGEgd2luZG93IG9mIDQgdGltZXMuCiAgKi8KLSNkZWZpbmUgRVhUNF9GUkVFQkxPQ0tTX1dBVEVSTUFSSyAoNCAqIChwZXJjcHVfY291bnRlcl9iYXRjaCAqIG5yX2NwdV9pZHMpKQorI2RlZmluZSBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUksgKDQgKiAocGVyY3B1X2NvdW50ZXJfYmF0Y2ggKiBucl9jcHVfaWRzKSkKICNlbHNlCi0jZGVmaW5lIEVYVDRfRlJFRUJMT0NLU19XQVRFUk1BUksgMAorI2RlZmluZSBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUksgMAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBuZXdzaXplKQpAQCAtMjI0MywxMCArMjI5NSwxOSBAQAogZW51bSBleHQ0X3N0YXRlX2JpdHMgewogCUJIX1VuaW5pdAkvKiBibG9ja3MgYXJlIGFsbG9jYXRlZCBidXQgdW5pbml0aWFsaXplZCBvbiBkaXNrICovCiAJICA9IEJIX0pCRFByaXZhdGVTdGFydCwKKwlCSF9BbGxvY0Zyb21DbHVzdGVyLAkvKiBhbGxvY2F0ZWQgYmxvY2tzIHdlcmUgcGFydCBvZiBhbHJlYWR5CisJCQkJICogYWxsb2NhdGVkIGNsdXN0ZXIuIE5vdGUgdGhhdCB0aGlzIGZsYWcgd2lsbAorCQkJCSAqIG5ldmVyLCBldmVyIGFwcGVhciBpbiBhIGJ1ZmZlcl9oZWFkJ3Mgc3RhdGUKKwkJCQkgKiBmbGFnLiBTZWUgRVhUNF9NQVBfRlJPTV9DTFVTVEVSIHRvIHNlZSB3aGVyZQorCQkJCSAqIHRoaXMgaXMgdXNlZC4gKi8KKwlCSF9EYV9NYXBwZWQsCS8qIERlbGF5ZWQgYWxsb2NhdGVkIGJsb2NrIHRoYXQgbm93IGhhcyBhIG1hcHBpbmcuIFRoaXMKKwkJCSAqIGZsYWcgaXMgc2V0IHdoZW4gZXh0NF9tYXBfYmxvY2tzIGlzIGNhbGxlZCBvbiBhCisJCQkgKiBkZWxheWVkIGFsbG9jYXRlZCBibG9jayB0byBnZXQgaXRzIHJlYWwgbWFwcGluZy4gKi8KIH07CiAKIEJVRkZFUl9GTlMoVW5pbml0LCB1bmluaXQpCiBUQVNfQlVGRkVSX0ZOUyhVbmluaXQsIHVuaW5pdCkKK0JVRkZFUl9GTlMoRGFfTWFwcGVkLCBkYV9tYXBwZWQpCiAKIC8qCiAgKiBBZGQgbmV3IG1ldGhvZCB0byB0ZXN0IHdldGhlciBibG9jayBhbmQgaW5vZGUgYml0bWFwcyBhcmUgcHJvcGVybHkKQEAgLTIyODIsNCArMjM0Myw2IEBACiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKKyNpbmNsdWRlICJleHQ0X2V4dGVudHMuaCIKKwogI2VuZGlmCS8qIF9FWFQ0X0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmggYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCmluZGV4IDA5NWMzNmYuLmE1MmRiM2EgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKKysrIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaApAQCAtMjkwLDUgKzI5MCw3IEBACiAJCQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKik7CiBleHRlcm4gdm9pZCBleHQ0X2V4dF9kcm9wX3JlZnMoc3RydWN0IGV4dDRfZXh0X3BhdGggKik7CiBleHRlcm4gaW50IGV4dDRfZXh0X2NoZWNrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIGludCBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAorCQkJCSAgICAgIGludCBzZWFyY2hfaGludF9yZXZlcnNlKTsKICNlbmRpZiAvKiBfRVhUNF9FWFRFTlRTICovCiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMgYi9mcy9leHQ0L2V4dDRfamJkMi5jCmluZGV4IGY1MjQwYWEuLmFjYTE3OTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpAQCAtMTA5LDkgKzEwOSwxMSBAQAogCiAJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKIAkJZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwotCQlpZiAoZXJyKQotCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgbGluZSwgX19mdW5jX18sCi0JCQkJCQkgIGJoLCBoYW5kbGUsIGVycik7CisJCWlmIChlcnIpIHsKKwkJCS8qIEVycm9ycyBjYW4gb25seSBoYXBwZW4gaWYgdGhlcmUgaXMgYSBidWcgKi8KKwkJCWhhbmRsZS0+aF9lcnIgPSBlcnI7CisJCQlfX2V4dDRfam91cm5hbF9zdG9wKHdoZXJlLCBsaW5lLCBoYW5kbGUpOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGlub2RlKQogCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggNTdjZjU2OC4uNjFmYTllMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4dDQuaD4KIApAQCAtOTYsMTMgKzk1LDE3IEBACiAgKiAgLSBFTk9NRU0KICAqICAtIEVJTwogICovCi1zdGF0aWMgaW50IGV4dDRfZXh0X2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCisjZGVmaW5lIGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGgpIFwKKwkJX19leHQ0X2V4dF9kaXJ0eShfX2Z1bmNfXywgX19MSU5FX18sIChoYW5kbGUpLCAoaW5vZGUpLCAocGF0aCkpCitzdGF0aWMgaW50IF9fZXh0NF9leHRfZGlydHkoY29uc3QgY2hhciAqd2hlcmUsIHVuc2lnbmVkIGludCBsaW5lLAorCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCiB7CiAJaW50IGVycjsKIAlpZiAocGF0aC0+cF9iaCkgewogCQkvKiBwYXRoIHBvaW50cyB0byBibG9jayAqLwotCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBwYXRoLT5wX2JoKTsKKwkJZXJyID0gX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSh3aGVyZSwgbGluZSwgaGFuZGxlLAorCQkJCQkJICAgaW5vZGUsIHBhdGgtPnBfYmgpOwogCX0gZWxzZSB7CiAJCS8qIHBhdGggcG9pbnRzIHRvIGxlYWYvaW5kZXggaW4gaW5vZGUgYm9keSAqLwogCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xMTQsMTEgKzExNyw5IEBACiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCSAgICAgIGV4dDRfbGJsa190IGJsb2NrKQogewotCWludCBkZXB0aDsKLQogCWlmIChwYXRoKSB7CisJCWludCBkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAJCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0JCWRlcHRoID0gcGF0aC0+cF9kZXB0aDsKIAogCQkvKgogCQkgKiBUcnkgdG8gcHJlZGljdCBibG9jayBwbGFjZW1lbnQgYXNzdW1pbmcgdGhhdCB3ZSBhcmUKQEAgLTE4MCwxMiArMTgxLDEwIEBACiAKIAlzaXplID0gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKSkKIAkJCS8gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCk7Ci0JaWYgKCFjaGVjaykgewogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAotCQlpZiAoc2l6ZSA+IDYpCi0JCQlzaXplID0gNjsKKwlpZiAoIWNoZWNrICYmIHNpemUgPiA2KQorCQlzaXplID0gNjsKICNlbmRpZgotCX0KIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtMTk1LDEyICsxOTQsMTAgQEAKIAogCXNpemUgPSAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKQogCQkJLyBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7Ci0JaWYgKCFjaGVjaykgewogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAotCQlpZiAoc2l6ZSA+IDUpCi0JCQlzaXplID0gNTsKKwlpZiAoIWNoZWNrICYmIHNpemUgPiA1KQorCQlzaXplID0gNTsKICNlbmRpZgotCX0KIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtMjExLDEyICsyMDgsMTAgQEAKIAlzaXplID0gc2l6ZW9mKEVYVDRfSShpbm9kZSktPmlfZGF0YSk7CiAJc2l6ZSAtPSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcik7CiAJc2l6ZSAvPSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKLQlpZiAoIWNoZWNrKSB7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCi0JCWlmIChzaXplID4gMykKLQkJCXNpemUgPSAzOworCWlmICghY2hlY2sgJiYgc2l6ZSA+IDMpCisJCXNpemUgPSAzOwogI2VuZGlmCi0JfQogCXJldHVybiBzaXplOwogfQogCkBAIC0yMjcsMTIgKzIyMiwxMCBAQAogCXNpemUgPSBzaXplb2YoRVhUNF9JKGlub2RlKS0+aV9kYXRhKTsKIAlzaXplIC09IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKTsKIAlzaXplIC89IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQlpZiAoIWNoZWNrKSB7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCi0JCWlmIChzaXplID4gNCkKLQkJCXNpemUgPSA0OworCWlmICghY2hlY2sgJiYgc2l6ZSA+IDQpCisJCXNpemUgPSA0OwogI2VuZGlmCi0JfQogCXJldHVybiBzaXplOwogfQogCkBAIC0yNDQsNyArMjM3LDcgQEAKIGludCBleHQ0X2V4dF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCiB7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwotCWludCBpZHhzLCBudW0gPSAwOworCWludCBpZHhzOwogCiAJaWR4cyA9ICgoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKQogCQkvIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KSk7CkBAIC0yNTksNiArMjUyLDggQEAKIAkgKi8KIAlpZiAoZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gJiYKIAkgICAgZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jaysxID09IGxibG9jaykgeworCQlpbnQgbnVtID0gMDsKKwogCQlpZiAoKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICUgaWR4cykgPT0gMCkKIAkJCW51bSsrOwogCQlpZiAoKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICUgKGlkeHMqaWR4cykpID09IDApCkBAIC0zMjEsOCArMzE2LDYgQEAKIAkJCQlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaCwKIAkJCQlpbnQgZGVwdGgpCiB7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50ICpleHQ7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqZXh0X2lkeDsKIAl1bnNpZ25lZCBzaG9ydCBlbnRyaWVzOwogCWlmIChlaC0+ZWhfZW50cmllcyA9PSAwKQogCQlyZXR1cm4gMTsKQEAgLTMzMSw3ICszMjQsNyBAQAogCiAJaWYgKGRlcHRoID09IDApIHsKIAkJLyogbGVhZiBlbnRyaWVzICovCi0JCWV4dCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4dCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOwogCQl3aGlsZSAoZW50cmllcykgewogCQkJaWYgKCFleHQ0X3ZhbGlkX2V4dGVudChpbm9kZSwgZXh0KSkKIAkJCQlyZXR1cm4gMDsKQEAgLTMzOSw3ICszMzIsNyBAQAogCQkJZW50cmllcy0tOwogCQl9CiAJfSBlbHNlIHsKLQkJZXh0X2lkeCA9IEVYVF9GSVJTVF9JTkRFWChlaCk7CisJCXN0cnVjdCBleHQ0X2V4dGVudF9pZHggKmV4dF9pZHggPSBFWFRfRklSU1RfSU5ERVgoZWgpOwogCQl3aGlsZSAoZW50cmllcykgewogCQkJaWYgKCFleHQ0X3ZhbGlkX2V4dGVudF9pZHgoaW5vZGUsIGV4dF9pZHgpKQogCQkJCXJldHVybiAwOwpAQCAtNzUxLDMxICs3NDQsMzAgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JbGVuID0gRVhUX01BWF9JTkRFWChjdXJwLT5wX2hkcikgLSBjdXJwLT5wX2lkeDsKIAlpZiAobG9naWNhbCA+IGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpIHsKIAkJLyogaW5zZXJ0IGFmdGVyICovCi0JCWlmIChjdXJwLT5wX2lkeCAhPSBFWFRfTEFTVF9JTkRFWChjdXJwLT5wX2hkcikpIHsKLQkJCWxlbiA9IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQkJCWxlbiA9IGxlbiA8IDAgPyAwIDogbGVuOwotCQkJZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkIGFmdGVyOiAlbGx1LiAiCi0JCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAotCQkJCQlsb2dpY2FsLCBwdHIsIGxlbiwKLQkJCQkJKGN1cnAtPnBfaWR4ICsgMSksIChjdXJwLT5wX2lkeCArIDIpKTsKLQkJCW1lbW1vdmUoY3VycC0+cF9pZHggKyAyLCBjdXJwLT5wX2lkeCArIDEsIGxlbik7Ci0JCX0KKwkJZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkIGFmdGVyOiAlbGx1XG4iLCBsb2dpY2FsLCBwdHIpOwogCQlpeCA9IGN1cnAtPnBfaWR4ICsgMTsKIAl9IGVsc2UgewogCQkvKiBpbnNlcnQgYmVmb3JlICovCi0JCWxlbiA9IGxlbiAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKLQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCWV4dF9kZWJ1ZygiaW5zZXJ0IG5ldyBpbmRleCAlZCBiZWZvcmU6ICVsbHUuICIKLQkJCQkibW92ZSAlZCBmcm9tIDB4JXAgdG8gMHglcFxuIiwKLQkJCQlsb2dpY2FsLCBwdHIsIGxlbiwKLQkJCQljdXJwLT5wX2lkeCwgKGN1cnAtPnBfaWR4ICsgMSkpOwotCQltZW1tb3ZlKGN1cnAtPnBfaWR4ICsgMSwgY3VycC0+cF9pZHgsIGxlbik7CisJCWV4dF9kZWJ1ZygiaW5zZXJ0IG5ldyBpbmRleCAlZCBiZWZvcmU6ICVsbHVcbiIsIGxvZ2ljYWwsIHB0cik7CiAJCWl4ID0gY3VycC0+cF9pZHg7CiAJfQogCisJbGVuID0gRVhUX0xBU1RfSU5ERVgoY3VycC0+cF9oZHIpIC0gaXggKyAxOworCUJVR19PTihsZW4gPCAwKTsKKwlpZiAobGVuID4gMCkgeworCQlleHRfZGVidWcoImluc2VydCBuZXcgaW5kZXggJWQ6ICIKKwkJCQkibW92ZSAlZCBpbmRpY2VzIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCWxvZ2ljYWwsIGxlbiwgaXgsIGl4ICsgMSk7CisJCW1lbW1vdmUoaXggKyAxLCBpeCwgbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpKTsKKwl9CisKKwlpZiAodW5saWtlbHkoaXggPiBFWFRfTUFYX0lOREVYKGN1cnAtPnBfaGRyKSkpIHsKKwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgIml4ID4gRVhUX01BWF9JTkRFWCEiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCiAJaXgtPmVpX2Jsb2NrID0gY3B1X3RvX2xlMzIobG9naWNhbCk7CiAJZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGl4LCBwdHIpOwogCWxlMTZfYWRkX2NwdSgmY3VycC0+cF9oZHItPmVoX2VudHJpZXMsIDEpOwpAQCAtMTA0MiwxNiArMTAzNCwxNCBAQAogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X2dyb3dfaW5kZXB0aChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkJIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAogCQkJCSBzdHJ1Y3QgZXh0NF9leHRlbnQgKm5ld2V4dCkKIHsKLQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqY3VycCA9IHBhdGg7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqbmVoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOwogCWludCBlcnIgPSAwOwogCi0JbmV3YmxvY2sgPSBleHQ0X2V4dF9uZXdfbWV0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBwYXRoLAorCW5ld2Jsb2NrID0gZXh0NF9leHRfbmV3X21ldGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgTlVMTCwKIAkJbmV3ZXh0LCAmZXJyLCBmbGFncyk7CiAJaWYgKG5ld2Jsb2NrID09IDApCiAJCXJldHVybiBlcnI7CkBAIC0xMDcxLDcgKzEwNjEsOCBAQAogCX0KIAogCS8qIG1vdmUgdG9wLWxldmVsIGluZGV4L2xlYWYgaW50byBuZXcgYmxvY2sgKi8KLQltZW1tb3ZlKGJoLT5iX2RhdGEsIGN1cnAtPnBfaGRyLCBzaXplb2YoRVhUNF9JKGlub2RlKS0+aV9kYXRhKSk7CisJbWVtbW92ZShiaC0+Yl9kYXRhLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCisJCXNpemVvZihFWFQ0X0koaW5vZGUpLT5pX2RhdGEpKTsKIAogCS8qIHNldCBzaXplIG9mIG5ldyBibG9jayAqLwogCW5laCA9IGV4dF9ibG9ja19oZHIoYmgpOwpAQCAtMTA4OSwzMiArMTA4MCwyMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JLyogY3JlYXRlIGluZGV4IGluIG5ldyB0b3AtbGV2ZWwgaW5kZXg6IG51bSxtYXgscG9pbnRlciAqLwotCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQljdXJwLT5wX2hkci0+ZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQzsKLQljdXJwLT5wX2hkci0+ZWhfbWF4ID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHgoaW5vZGUsIDApKTsKLQljdXJwLT5wX2hkci0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KDEpOwotCWN1cnAtPnBfaWR4ID0gRVhUX0ZJUlNUX0lOREVYKGN1cnAtPnBfaGRyKTsKLQotCWlmIChwYXRoWzBdLnBfaGRyLT5laF9kZXB0aCkKLQkJY3VycC0+cF9pZHgtPmVpX2Jsb2NrID0KLQkJCUVYVF9GSVJTVF9JTkRFWChwYXRoWzBdLnBfaGRyKS0+ZWlfYmxvY2s7Ci0JZWxzZQotCQljdXJwLT5wX2lkeC0+ZWlfYmxvY2sgPQotCQkJRVhUX0ZJUlNUX0VYVEVOVChwYXRoWzBdLnBfaGRyKS0+ZWVfYmxvY2s7Ci0JZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGN1cnAtPnBfaWR4LCBuZXdibG9jayk7Ci0KKwkvKiBVcGRhdGUgdG9wLWxldmVsIGluZGV4OiBudW0sbWF4LHBvaW50ZXIgKi8KIAluZWggPSBleHRfaW5vZGVfaGRyKGlub2RlKTsKKwluZWgtPmVoX2VudHJpZXMgPSBjcHVfdG9fbGUxNigxKTsKKwlleHQ0X2lkeF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0lOREVYKG5laCksIG5ld2Jsb2NrKTsKKwlpZiAobmVoLT5laF9kZXB0aCA9PSAwKSB7CisJCS8qIFJvb3QgZXh0ZW50IGJsb2NrIGJlY29tZXMgaW5kZXggYmxvY2sgKi8KKwkJbmVoLT5laF9tYXggPSBjcHVfdG9fbGUxNihleHQ0X2V4dF9zcGFjZV9yb290X2lkeChpbm9kZSwgMCkpOworCQlFWFRfRklSU1RfSU5ERVgobmVoKS0+ZWlfYmxvY2sgPQorCQkJRVhUX0ZJUlNUX0VYVEVOVChuZWgpLT5lZV9ibG9jazsKKwl9CiAJZXh0X2RlYnVnKCJuZXcgcm9vdDogbnVtICVkKCVkKSwgbGJsb2NrICVkLCBwdHIgJWxsdVxuIiwKIAkJICBsZTE2X3RvX2NwdShuZWgtPmVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShuZWgtPmVoX21heCksCiAJCSAgbGUzMl90b19jcHUoRVhUX0ZJUlNUX0lOREVYKG5laCktPmVpX2Jsb2NrKSwKIAkJICBleHQ0X2lkeF9wYmxvY2soRVhUX0ZJUlNUX0lOREVYKG5laCkpKTsKIAotCW5laC0+ZWhfZGVwdGggPSBjcHVfdG9fbGUxNihwYXRoLT5wX2RlcHRoICsgMSk7Ci0JZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgY3VycCk7CisJbmVoLT5laF9kZXB0aCA9IGNwdV90b19sZTE2KG5laC0+ZWhfZGVwdGggKyAxKTsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiBvdXQ6CiAJYnJlbHNlKGJoKTsKIApAQCAtMTE2Miw4ICsxMTQ0LDcgQEAKIAkJCWVyciA9IFBUUl9FUlIocGF0aCk7CiAJfSBlbHNlIHsKIAkJLyogdHJlZSBpcyBmdWxsLCB0aW1lIHRvIGdyb3cgaW4gZGVwdGggKi8KLQkJZXJyID0gZXh0NF9leHRfZ3Jvd19pbmRlcHRoKGhhbmRsZSwgaW5vZGUsIGZsYWdzLAotCQkJCQkgICAgcGF0aCwgbmV3ZXh0KTsKKwkJZXJyID0gZXh0NF9leHRfZ3Jvd19pbmRlcHRoKGhhbmRsZSwgaW5vZGUsIGZsYWdzLCBuZXdleHQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKQEAgLTEyMzUsOSArMTIxNiw5IEBACiAJCQlpZiAodW5saWtlbHkoaXggIT0gRVhUX0ZJUlNUX0lOREVYKHBhdGhbZGVwdGhdLnBfaGRyKSkpIHsKIAkJCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAogCQkJCSAgIml4ICglZCkgIT0gRVhUX0ZJUlNUX0lOREVYICglZCkgKGRlcHRoICVkKSEiLAotCQkJCSAgaXggIT0gTlVMTCA/IGl4LT5laV9ibG9jayA6IDAsCisJCQkJICBpeCAhPSBOVUxMID8gbGUzMl90b19jcHUoaXgtPmVpX2Jsb2NrKSA6IDAsCiAJCQkJICBFWFRfRklSU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpICE9IE5VTEwgPwotCQkJCSAgICBFWFRfRklSU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpLT5laV9ibG9jayA6IDAsCisJCWxlMzJfdG9fY3B1KEVYVF9GSVJTVF9JTkRFWChwYXRoW2RlcHRoXS5wX2hkciktPmVpX2Jsb2NrKSA6IDAsCiAJCQkJICBkZXB0aCk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0xMjYwLDEzICsxMjQxLDE0IEBACiAvKgogICogc2VhcmNoIHRoZSBjbG9zZXN0IGFsbG9jYXRlZCBibG9jayB0byB0aGUgcmlnaHQgZm9yICpsb2dpY2FsCiAgKiBhbmQgcmV0dXJucyBpdCBhdCBAbG9naWNhbCArIGl0J3MgcGh5c2ljYWwgYWRkcmVzcyBhdCBAcGh5cwotICogaWYgKmxvZ2ljYWwgaXMgdGhlIHNtYWxsZXN0IGFsbG9jYXRlZCBibG9jaywgdGhlIGZ1bmN0aW9uCisgKiBpZiAqbG9naWNhbCBpcyB0aGUgbGFyZ2VzdCBhbGxvY2F0ZWQgYmxvY2ssIHRoZSBmdW5jdGlvbgogICogcmV0dXJucyAwIGF0IEBwaHlzCiAgKiByZXR1cm4gdmFsdWUgY29udGFpbnMgMCAoc3VjY2Vzcykgb3IgZXJyb3IgY29kZQogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X3NlYXJjaF9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKLQkJCQkgZXh0NF9sYmxrX3QgKmxvZ2ljYWwsIGV4dDRfZnNibGtfdCAqcGh5cykKKwkJCQkgZXh0NF9sYmxrX3QgKmxvZ2ljYWwsIGV4dDRfZnNibGtfdCAqcGh5cywKKwkJCQkgc3RydWN0IGV4dDRfZXh0ZW50ICoqcmV0X2V4KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwpAQCAtMTMwOCw5ICsxMjkwLDcgQEAKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQotCQkqbG9naWNhbCA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7Ci0JCSpwaHlzID0gZXh0NF9leHRfcGJsb2NrKGV4KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gZm91bmRfZXh0ZW50OwogCX0KIAogCWlmICh1bmxpa2VseSgqbG9naWNhbCA8IChsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgZWVfbGVuKSkpIHsKQEAgLTEzMjMsOSArMTMwMyw3IEBACiAJaWYgKGV4ICE9IEVYVF9MQVNUX0VYVEVOVChwYXRoW2RlcHRoXS5wX2hkcikpIHsKIAkJLyogbmV4dCBhbGxvY2F0ZWQgYmxvY2sgaW4gdGhpcyBsZWFmICovCiAJCWV4Kys7Ci0JCSpsb2dpY2FsID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKLQkJKnBoeXMgPSBleHQ0X2V4dF9wYmxvY2soZXgpOwotCQlyZXR1cm4gMDsKKwkJZ290byBmb3VuZF9leHRlbnQ7CiAJfQogCiAJLyogZ28gdXAgYW5kIHNlYXJjaCBmb3IgaW5kZXggdG8gdGhlIHJpZ2h0ICovCkBAIC0xMzY4LDkgKzEzNDYsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCWV4ID0gRVhUX0ZJUlNUX0VYVEVOVChlaCk7Citmb3VuZF9leHRlbnQ6CiAJKmxvZ2ljYWwgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOwogCSpwaHlzID0gZXh0NF9leHRfcGJsb2NrKGV4KTsKLQlwdXRfYmgoYmgpOworCSpyZXRfZXggPSBleDsKKwlpZiAoYmgpCisJCXB1dF9iaChiaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTUsNyArMTM3Niw4IEBACiAJd2hpbGUgKGRlcHRoID49IDApIHsKIAkJaWYgKGRlcHRoID09IHBhdGgtPnBfZGVwdGgpIHsKIAkJCS8qIGxlYWYgKi8KLQkJCWlmIChwYXRoW2RlcHRoXS5wX2V4dCAhPQorCQkJaWYgKHBhdGhbZGVwdGhdLnBfZXh0ICYmCisJCQkJcGF0aFtkZXB0aF0ucF9leHQgIT0KIAkJCQkJRVhUX0xBU1RfRVhURU5UKHBhdGhbZGVwdGhdLnBfaGRyKSkKIAkJCSAgcmV0dXJuIGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfZXh0WzFdLmVlX2Jsb2NrKTsKIAkJfSBlbHNlIHsKQEAgLTE2MjMsNyArMTYwNSw4IEBACiAgKiBzdWNoIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvdmVybGFwLCBhbmQgdGhlbiByZXR1cm5zIDEuCiAgKiBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGZvdW5kLCBpdCByZXR1cm5zIDAuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorc3RhdGljIHVuc2lnbmVkIGludCBleHQ0X2V4dF9jaGVja19vdmVybGFwKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKKwkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgc3RydWN0IGV4dDRfZXh0ZW50ICpuZXdleHQsCiAJCQkJCSAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewpAQCAtMTYzNyw2ICsxNjIwLDcgQEAKIAlpZiAoIXBhdGhbZGVwdGhdLnBfZXh0KQogCQlnb3RvIG91dDsKIAliMiA9IGxlMzJfdG9fY3B1KHBhdGhbZGVwdGhdLnBfZXh0LT5lZV9ibG9jayk7CisJYjIgJj0gfihzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpOwogCiAJLyoKIAkgKiBnZXQgdGhlIG5leHQgYWxsb2NhdGVkIGJsb2NrIGlmIHRoZSBleHRlbnQgaW4gdGhlIHBhdGgKQEAgLTE2NDYsNiArMTYzMCw3IEBACiAJCWIyID0gZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCk7CiAJCWlmIChiMiA9PSBFWFRfTUFYX0JMT0NLUykKIAkJCWdvdG8gb3V0OworCQliMiAmPSB+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CiAJfQogCiAJLyogY2hlY2sgZm9yIHdyYXAgdGhyb3VnaCB6ZXJvIG9uIGV4dGVudCBsb2dpY2FsIHN0YXJ0IGJsb2NrKi8KQEAgLTE2OTcsNyArMTY4Miw3IEBACiAJLyogdHJ5IHRvIGluc2VydCBibG9jayBpbnRvIGZvdW5kIGV4dGVudCBhbmQgcmV0dXJuICovCiAJaWYgKGV4ICYmICEoZmxhZyAmIEVYVDRfR0VUX0JMT0NLU19QUkVfSU8pCiAJCSYmIGV4dDRfY2FuX2V4dGVudHNfYmVfbWVyZ2VkKGlub2RlLCBleCwgbmV3ZXh0KSkgewotCQlleHRfZGVidWcoImFwcGVuZCBbJWRdJWQgYmxvY2sgdG8gJWQ6WyVkXSVkIChmcm9tICVsbHUpXG4iLAorCQlleHRfZGVidWcoImFwcGVuZCBbJWRdJWQgYmxvY2sgdG8gJXU6WyVkXSVkIChmcm9tICVsbHUpXG4iLAogCQkJICBleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKG5ld2V4dCksCiAJCQkgIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCksCiAJCQkgIGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayksCkBAIC0xNzM1LDcgKzE3MjAsNyBAQAogCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spKQogCQluZXh0ID0gZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHBhdGgpOwogCWlmIChuZXh0ICE9IEVYVF9NQVhfQkxPQ0tTKSB7Ci0JCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGJsb2NrIC0gJWRcbiIsIG5leHQpOworCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICV1XG4iLCBuZXh0KTsKIAkJQlVHX09OKG5wYXRoICE9IE5VTEwpOwogCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKIAkJaWYgKElTX0VSUihucGF0aCkpCkBAIC0xNzczLDQ2ICsxNzU4LDUxIEBACiAKIAlpZiAoIW5lYXJleCkgewogCQkvKiB0aGVyZSBpcyBubyBleHRlbnQgaW4gdGhpcyBsZWFmLCBjcmVhdGUgZmlyc3Qgb25lICovCi0JCWV4dF9kZWJ1ZygiZmlyc3QgZXh0ZW50IGluIHRoZSBsZWFmOiAlZDolbGx1OlslZF0lZFxuIiwKKwkJZXh0X2RlYnVnKCJmaXJzdCBleHRlbnQgaW4gdGhlIGxlYWY6ICV1OiVsbHU6WyVkXSVkXG4iLAogCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAogCQkJCWV4dDRfZXh0X3BibG9jayhuZXdleHQpLAogCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKIAkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpKTsKLQkJcGF0aFtkZXB0aF0ucF9leHQgPSBFWFRfRklSU1RfRVhURU5UKGVoKTsKLQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spCisJCW5lYXJleCA9IEVYVF9GSVJTVF9FWFRFTlQoZWgpOworCX0gZWxzZSB7CisJCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKQogCQkJICAgPiBsZTMyX3RvX2NwdShuZWFyZXgtPmVlX2Jsb2NrKSkgewotLyoJCUJVR19PTihuZXdleHQtPmVlX2Jsb2NrID09IG5lYXJleC0+ZWVfYmxvY2spOyAqLwotCQlpZiAobmVhcmV4ICE9IEVYVF9MQVNUX0VYVEVOVChlaCkpIHsKLQkJCWxlbiA9IEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleDsKLQkJCWxlbiA9IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOwotCQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCQlleHRfZGVidWcoImluc2VydCAlZDolbGx1OlslZF0lZCBhZnRlcjogbmVhcmVzdCAweCVwLCAiCi0JCQkJCSJtb3ZlICVkIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJLyogSW5zZXJ0IGFmdGVyICovCisJCQlleHRfZGVidWcoImluc2VydCAldTolbGx1OlslZF0lZCBiZWZvcmU6ICIKKwkJCQkJIm5lYXJlc3QgJXBcbiIsCiAJCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAogCQkJCQlleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKIAkJCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAogCQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAotCQkJCQluZWFyZXgsIGxlbiwgbmVhcmV4ICsgMSwgbmVhcmV4ICsgMik7Ci0JCQltZW1tb3ZlKG5lYXJleCArIDIsIG5lYXJleCArIDEsIGxlbik7CisJCQkJCW5lYXJleCk7CisJCQluZWFyZXgrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIEluc2VydCBiZWZvcmUgKi8KKwkJCUJVR19PTihuZXdleHQtPmVlX2Jsb2NrID09IG5lYXJleC0+ZWVfYmxvY2spOworCQkJZXh0X2RlYnVnKCJpbnNlcnQgJXU6JWxsdTpbJWRdJWQgYWZ0ZXI6ICIKKwkJCQkJIm5lYXJlc3QgJXBcbiIsCisJCQkJCWxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spLAorCQkJCQlleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKKwkJCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAorCQkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAorCQkJCQluZWFyZXgpOwogCQl9Ci0JCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4ICsgMTsKLQl9IGVsc2UgewotCQlCVUdfT04obmV3ZXh0LT5lZV9ibG9jayA9PSBuZWFyZXgtPmVlX2Jsb2NrKTsKLQkJbGVuID0gKEVYVF9NQVhfRVhURU5UKGVoKSAtIG5lYXJleCkgKiBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKLQkJbGVuID0gbGVuIDwgMCA/IDAgOiBsZW47Ci0JCWV4dF9kZWJ1ZygiaW5zZXJ0ICVkOiVsbHU6WyVkXSVkIGJlZm9yZTogbmVhcmVzdCAweCVwLCAiCi0JCQkJIm1vdmUgJWQgZnJvbSAweCVwIHRvIDB4JXBcbiIsCi0JCQkJbGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jayksCi0JCQkJZXh0NF9leHRfcGJsb2NrKG5ld2V4dCksCi0JCQkJZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAotCQkJCWV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKG5ld2V4dCksCi0JCQkJbmVhcmV4LCBsZW4sIG5lYXJleCwgbmVhcmV4ICsgMSk7Ci0JCW1lbW1vdmUobmVhcmV4ICsgMSwgbmVhcmV4LCBsZW4pOwotCQlwYXRoW2RlcHRoXS5wX2V4dCA9IG5lYXJleDsKKwkJbGVuID0gRVhUX0xBU1RfRVhURU5UKGVoKSAtIG5lYXJleCArIDE7CisJCWlmIChsZW4gPiAwKSB7CisJCQlleHRfZGVidWcoImluc2VydCAldTolbGx1OlslZF0lZDogIgorCQkJCQkibW92ZSAlZCBleHRlbnRzIGZyb20gMHglcCB0byAweCVwXG4iLAorCQkJCQlsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSwKKwkJCQkJZXh0NF9leHRfcGJsb2NrKG5ld2V4dCksCisJCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKKwkJCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4obmV3ZXh0KSwKKwkJCQkJbGVuLCBuZWFyZXgsIG5lYXJleCArIDEpOworCQkJbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsCisJCQkJbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCkpOworCQl9CiAJfQogCiAJbGUxNl9hZGRfY3B1KCZlaC0+ZWhfZW50cmllcywgMSk7Ci0JbmVhcmV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CisJcGF0aFtkZXB0aF0ucF9leHQgPSBuZWFyZXg7CiAJbmVhcmV4LT5lZV9ibG9jayA9IG5ld2V4dC0+ZWVfYmxvY2s7CiAJZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpOwogCW5lYXJleC0+ZWVfbGVuID0gbmV3ZXh0LT5lZV9sZW47CkBAIC0xOTYyLDYgKzE5NTIsNyBAQAogCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OwogCUJVR19PTihsZW4gPT0gMCk7CiAJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOworCXRyYWNlX2V4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgYmxvY2ssIGxlbiwgc3RhcnQpOwogCWNleCA9ICZFWFQ0X0koaW5vZGUpLT5pX2NhY2hlZF9leHRlbnQ7CiAJY2V4LT5lY19ibG9jayA9IGJsb2NrOwogCWNleC0+ZWNfbGVuID0gbGVuOwpAQCAtMjA2Myw2ICsyMDU0LDcgQEAKIAkJc2JpLT5leHRlbnRfY2FjaGVfbWlzc2VzKys7CiAJZWxzZQogCQlzYmktPmV4dGVudF9jYWNoZV9oaXRzKys7CisJdHJhY2VfZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIGJsb2NrLCByZXQpOwogCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMTMwLDYgKzIxMjIsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJZXh0X2RlYnVnKCJpbmRleCBpcyBlbXB0eSwgcmVtb3ZlIGl0LCBmcmVlIGJsb2NrICVsbHVcbiIsIGxlYWYpOworCXRyYWNlX2V4dDRfZXh0X3JtX2lkeChpbm9kZSwgbGVhZik7CisKIAlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGxlYWYsIDEsCiAJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQSB8IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjE1OCw3ICsyMTUyLDcgQEAKIAkJCSAqICBuZWVkIHRvIGFjY291bnQgZm9yIGxlYWYgYmxvY2sgY3JlZGl0CiAJCQkgKgogCQkJICogIGJpdG1hcHMgYW5kIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzCi0JCQkgKiAgYW5kIG90aGVyIG1ldGFkYXQgYmxvY2tzIHN0aWxsIG5lZWQgdG8gYmUKKwkJCSAqICBhbmQgb3RoZXIgbWV0YWRhdGEgYmxvY2tzIHN0aWxsIG5lZWQgdG8gYmUKIAkJCSAqICBhY2NvdW50ZWQuCiAJCQkgKi8KIAkJCS8qIDEgYml0bWFwLCAxIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgKi8KQEAgLTIxOTUsMTQgKzIxODksNDAgQEAKIH0KIAogc3RhdGljIGludCBleHQ0X3JlbW92ZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAotCQkJCWV4dDRfbGJsa190IGZyb20sIGV4dDRfbGJsa190IHRvKQorCQkJICAgICAgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJCSAgICAgIGV4dDRfZnNibGtfdCAqcGFydGlhbF9jbHVzdGVyLAorCQkJICAgICAgZXh0NF9sYmxrX3QgZnJvbSwgZXh0NF9sYmxrX3QgdG8pCiB7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJdW5zaWduZWQgc2hvcnQgZWVfbGVuID0gIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwlleHQ0X2ZzYmxrX3QgcGJsazsKIAlpbnQgZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CisJLyoKKwkgKiBGb3IgYmlnYWxsb2MgZmlsZSBzeXN0ZW1zLCB3ZSBuZXZlciBmcmVlIGEgcGFydGlhbCBjbHVzdGVyCisJICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXh0ZW50LiAgSW5zdGVhZCwgd2UgbWFrZSBhIG5vdGUKKwkgKiB0aGF0IHdlIHRyaWVkIGZyZWVpbmcgdGhlIGNsdXN0ZXIsIGFuZCBjaGVjayB0byBzZWUgaWYgd2UKKwkgKiBuZWVkIHRvIGZyZWUgaXQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8gZXh0NF9yZW1vdmVfYmxvY2tzLAorCSAqIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGV4dDRfdHJ1bmNhdGUoKSBvcGVyYXRpb24uCisJICovCisJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19OT0ZSRUVfRklSU1RfQ0xVU1RFUjsKKworCXRyYWNlX2V4dDRfcmVtb3ZlX2Jsb2Nrcyhpbm9kZSwgZXgsIGZyb20sIHRvLCAqcGFydGlhbF9jbHVzdGVyKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBwYXJ0aWFsIGNsdXN0ZXIsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZQorCSAqIGNsdXN0ZXIgb2YgdGhlIGxhc3QgYmxvY2ssIHdlIG5lZWQgdG8gZXhwbGljaXRseSBmcmVlIHRoZQorCSAqIHBhcnRpYWwgY2x1c3RlciBoZXJlLgorCSAqLworCXBibGsgPSBleHQ0X2V4dF9wYmxvY2soZXgpICsgZWVfbGVuIC0gMTsKKwlpZiAoKnBhcnRpYWxfY2x1c3RlciAmJiAoRVhUNF9CMkMoc2JpLCBwYmxrKSAhPSAqcGFydGlhbF9jbHVzdGVyKSkgeworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJIEVYVDRfQzJCKHNiaSwgKnBhcnRpYWxfY2x1c3RlciksCisJCQkJIHNiaS0+c19jbHVzdGVyX3JhdGlvLCBmbGFncyk7CisJCSpwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogI2lmZGVmIEVYVEVOVFNfU1RBVFMKIAl7CiAJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwpAQCAtMjIyMiwxMiArMjI0MiwyNCBAQAogCSAgICAmJiB0byA9PSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spICsgZWVfbGVuIC0gMSkgewogCQkvKiB0YWlsIHJlbW92YWwgKi8KIAkJZXh0NF9sYmxrX3QgbnVtOwotCQlleHQ0X2ZzYmxrX3Qgc3RhcnQ7CiAKIAkJbnVtID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGVlX2xlbiAtIGZyb207Ci0JCXN0YXJ0ID0gZXh0NF9leHRfcGJsb2NrKGV4KSArIGVlX2xlbiAtIG51bTsKLQkJZXh0X2RlYnVnKCJmcmVlIGxhc3QgJXUgYmxvY2tzIHN0YXJ0aW5nICVsbHVcbiIsIG51bSwgc3RhcnQpOwotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIHN0YXJ0LCBudW0sIGZsYWdzKTsKKwkJcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCkgKyBlZV9sZW4gLSBudW07CisJCWV4dF9kZWJ1ZygiZnJlZSBsYXN0ICV1IGJsb2NrcyBzdGFydGluZyAlbGx1XG4iLCBudW0sIHBibGspOworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIHBibGssIG51bSwgZmxhZ3MpOworCQkvKgorCQkgKiBJZiB0aGUgYmxvY2sgcmFuZ2UgdG8gYmUgZnJlZWQgZGlkbid0IHN0YXJ0IGF0IHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgYSBjbHVzdGVyLCBhbmQgd2UgcmVtb3ZlZCB0aGUgZW50aXJlCisJCSAqIGV4dGVudCwgc2F2ZSB0aGUgcGFydGlhbCBjbHVzdGVyIGhlcmUsIHNpbmNlIHdlCisJCSAqIG1pZ2h0IG5lZWQgdG8gZGVsZXRlIGlmIHdlIGRldGVybWluZSB0aGF0IHRoZQorCQkgKiB0cnVuY2F0ZSBvcGVyYXRpb24gaGFzIHJlbW92ZWQgYWxsIG9mIHRoZSBibG9ja3MgaW4KKwkJICogdGhlIGNsdXN0ZXIuCisJCSAqLworCQlpZiAocGJsayAmIChzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpICYmCisJCSAgICAoZWVfbGVuID09IG51bSkpCisJCQkqcGFydGlhbF9jbHVzdGVyID0gRVhUNF9CMkMoc2JpLCBwYmxrKTsKKwkJZWxzZQorCQkJKnBhcnRpYWxfY2x1c3RlciA9IDA7CiAJfSBlbHNlIGlmIChmcm9tID09IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykKIAkJICAgJiYgdG8gPD0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSArIGVlX2xlbiAtIDEpIHsKIAkJLyogaGVhZCByZW1vdmFsICovCkBAIC0yMjM4LDcgKzIyNzAsNyBAQAogCQlzdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7CiAKIAkJZXh0X2RlYnVnKCJmcmVlIGZpcnN0ICV1IGJsb2NrcyBzdGFydGluZyAlbGx1XG4iLCBudW0sIHN0YXJ0KTsKLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAwLCBzdGFydCwgbnVtLCBmbGFncyk7CisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgc3RhcnQsIG51bSwgZmxhZ3MpOwogCiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAic3RyYW5nZSByZXF1ZXN0OiByZW1vdmFsKDIpICIKQEAgLTIyNjIsMTkgKzIyOTQsMTkgQEAKICAqLwogc3RhdGljIGludAogZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwgZXh0NF9sYmxrX3Qgc3RhcnQsCi0JCWV4dDRfbGJsa190IGVuZCkKKwkJIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLCBleHQ0X2ZzYmxrX3QgKnBhcnRpYWxfY2x1c3RlciwKKwkJIGV4dDRfbGJsa190IHN0YXJ0LCBleHQ0X2xibGtfdCBlbmQpCiB7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJaW50IGVyciA9IDAsIGNvcnJlY3RfaW5kZXggPSAwOwogCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSksIGNyZWRpdHM7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7Ci0JZXh0NF9sYmxrX3QgYSwgYiwgYmxvY2s7CisJZXh0NF9sYmxrX3QgYSwgYjsKIAl1bnNpZ25lZCBudW07CiAJZXh0NF9sYmxrX3QgZXhfZWVfYmxvY2s7CiAJdW5zaWduZWQgc2hvcnQgZXhfZWVfbGVuOwogCXVuc2lnbmVkIHVuaW5pdGlhbGl6ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0Jc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7CiAKIAkvKiB0aGUgaGVhZGVyIG11c3QgYmUgY2hlY2tlZCBhbHJlYWR5IGluIGV4dDRfZXh0X3JlbW92ZV9zcGFjZSgpICovCiAJZXh0X2RlYnVnKCJ0cnVuY2F0ZSBzaW5jZSAldSBpbiBsZWFmXG4iLCBzdGFydCk7CkBAIC0yMjkxLDYgKzIzMjMsOCBAQAogCWV4X2VlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAlleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CiAKKwl0cmFjZV9leHQ0X2V4dF9ybV9sZWFmKGlub2RlLCBzdGFydCwgZXgsICpwYXJ0aWFsX2NsdXN0ZXIpOworCiAJd2hpbGUgKGV4ID49IEVYVF9GSVJTVF9FWFRFTlQoZWgpICYmCiAJCQlleF9lZV9ibG9jayArIGV4X2VlX2xlbiA+IHN0YXJ0KSB7CiAKQEAgLTIzMTUsODYgKzIzNDksMTggQEAKIAkJCWV4X2VlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAkJCWV4X2VlX2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKIAkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGEgIT0gZXhfZWVfYmxvY2sgJiYKLQkJCWIgIT0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4gLSAxKSB7Ci0JCQkvKgotCQkJICogSWYgdGhpcyBpcyBhIHRydW5jYXRlLCB0aGVuIHRoaXMgY29uZGl0aW9uIHNob3VsZAotCQkJICogbmV2ZXIgaGFwcGVuIGJlY2F1c2UgYXQgbGVhc3Qgb25lIG9mIHRoZSBlbmQgcG9pbnRzCi0JCQkgKiBuZWVkcyB0byBiZSBvbiB0aGUgZWRnZSBvZiB0aGUgZXh0ZW50LgotCQkJICovCi0JCQlpZiAoZW5kID09IEVYVF9NQVhfQkxPQ0tTIC0gMSkgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCQlzdGFydCwgZW5kKTsKLQkJCQlibG9jayA9IDA7Ci0JCQkJbnVtID0gMDsKLQkJCQllcnIgPSAtRUlPOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJLyoKLQkJCSAqIGVsc2UgdGhpcyBpcyBhIGhvbGUgcHVuY2gsIHNvIHRoZSBleHRlbnQgbmVlZHMgdG8KLQkJCSAqIGJlIHNwbGl0IHNpbmNlIG5laXRoZXIgZWRnZSBvZiB0aGUgaG9sZSBpcyBvbiB0aGUKLQkJCSAqIGV4dGVudCBlZGdlCi0JCQkgKi8KLQkJCWVsc2V7Ci0JCQkJbWFwLm1fcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCk7Ci0JCQkJbWFwLm1fbGJsayA9IGV4X2VlX2Jsb2NrOwotCQkJCW1hcC5tX2xlbiA9IGIgLSBleF9lZV9ibG9jazsKLQotCQkJCWVyciA9IGV4dDRfc3BsaXRfZXh0ZW50KGhhbmRsZSwKLQkJCQkJaW5vZGUsIHBhdGgsICZtYXAsIDAsCi0JCQkJCUVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUIHwKLQkJCQkJRVhUNF9HRVRfQkxPQ0tTX1BSRV9JTyk7Ci0KLQkJCQlpZiAoZXJyIDwgMCkKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCQlleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7Ci0KLQkJCQliID0gZXhfZWVfYmxvY2srZXhfZWVfbGVuIC0gMSA8IGVuZCA/Ci0JCQkJCWV4X2VlX2Jsb2NrK2V4X2VlX2xlbiAtIDEgOiBlbmQ7Ci0KLQkJCQkvKiBUaGVuIHJlbW92ZSB0YWlsIG9mIHRoaXMgZXh0ZW50ICovCi0JCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKLQkJCQludW0gPSBhIC0gYmxvY2s7Ci0JCQl9CisJCX0gZWxzZSBpZiAoYiAhPSBleF9lZV9ibG9jayArIGV4X2VlX2xlbiAtIDEpIHsKKwkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAorCQkJCQkgc3RhcnQsIGVuZCk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CiAJCX0gZWxzZSBpZiAoYSAhPSBleF9lZV9ibG9jaykgewogCQkJLyogcmVtb3ZlIHRhaWwgb2YgdGhlIGV4dGVudCAqLwotCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKLQkJCW51bSA9IGEgLSBibG9jazsKLQkJfSBlbHNlIGlmIChiICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgewotCQkJLyogcmVtb3ZlIGhlYWQgb2YgdGhlIGV4dGVudCAqLwotCQkJYmxvY2sgPSBiOwotCQkJbnVtID0gIGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gYjsKLQotCQkJLyoKLQkJCSAqIElmIHRoaXMgaXMgYSB0cnVuY2F0ZSwgdGhpcyBjb25kaXRpb24KLQkJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCSAqLwotCQkJaWYgKGVuZCA9PSBFWFRfTUFYX0JMT0NLUyAtIDEpIHsKLQkJCQlleHRfZGVidWcoIiAgYmFkIHRydW5jYXRlICV1OiV1XG4iLAotCQkJCQlzdGFydCwgZW5kKTsKLQkJCQllcnIgPSAtRUlPOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCQkJbnVtID0gYSAtIGV4X2VlX2Jsb2NrOwogCQl9IGVsc2UgewogCQkJLyogcmVtb3ZlIHdob2xlIGV4dGVudDogZXhjZWxsZW50ISAqLwotCQkJYmxvY2sgPSBleF9lZV9ibG9jazsKIAkJCW51bSA9IDA7Ci0JCQlpZiAoYSAhPSBleF9lZV9ibG9jaykgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCXN0YXJ0LCBlbmQpOwotCQkJCWVyciA9IC1FSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWlmIChiICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgewotCQkJCWV4dF9kZWJ1ZygiICBiYWQgdHJ1bmNhdGUgJXU6JXVcbiIsCi0JCQkJCXN0YXJ0LCBlbmQpOwotCQkJCWVyciA9IC1FSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9CiAJCX0KLQogCQkvKgogCQkgKiAzIGZvciBsZWFmLCBzYiwgYW5kIGlub2RlIHBsdXMgMiAoYm1hcCBhbmQgZ3JvdXAKIAkJICogZGVzY3JpcHRvcikgZm9yIGVhY2ggYmxvY2sgZ3JvdXA7IGFzc3VtZSB0d28gYmxvY2sKQEAgLTI0MTYsMjMgKzIzODIsMTUgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCi0JCWVyciA9IGV4dDRfcmVtb3ZlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBleCwgYSwgYik7CisJCWVyciA9IGV4dDRfcmVtb3ZlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBleCwgcGFydGlhbF9jbHVzdGVyLAorCQkJCQkgYSwgYik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAobnVtID09IDApIHsKKwkJaWYgKG51bSA9PSAwKQogCQkJLyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqLwogCQkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCAwKTsKLQkJfSBlbHNlIGlmIChibG9jayAhPSBleF9lZV9ibG9jaykgewotCQkJLyoKLQkJCSAqIElmIHRoaXMgd2FzIGEgaGVhZCByZW1vdmFsLCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlCi0JCQkgKiB0aGUgcGh5c2ljYWwgYmxvY2sgc2luY2UgaXQgaXMgbm93IGF0IGEgZGlmZmVyZW50Ci0JCQkgKiBsb2NhdGlvbgotCQkJICovCi0JCQlleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGV4dDRfZXh0X3BibG9jayhleCkgKyAoYi1hKSk7Ci0JCX0KIAotCQlleC0+ZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihibG9jayk7CiAJCWV4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihudW0pOwogCQkvKgogCQkgKiBEbyBub3QgbWFyayB1bmluaXRpYWxpemVkIGlmIGFsbCB0aGUgYmxvY2tzIGluIHRoZQpAQCAtMjQ0MCwxMSArMjM5OCw2IEBACiAJCSAqLwogCQlpZiAodW5pbml0aWFsaXplZCAmJiBudW0pCiAJCQlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgpOwotCi0JCWVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKLQogCQkvKgogCQkgKiBJZiB0aGUgZXh0ZW50IHdhcyBjb21wbGV0ZWx5IHJlbGVhc2VkLAogCQkgKiB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsZWFmCkBAIC0yNDY0LDkgKzI0MTcsMTQgQEAKIAkJCQkJc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCkpOwogCQkJfQogCQkJbGUxNl9hZGRfY3B1KCZlaC0+ZWhfZW50cmllcywgLTEpOwotCQl9CisJCX0gZWxzZQorCQkJKnBhcnRpYWxfY2x1c3RlciA9IDA7CiAKLQkJZXh0X2RlYnVnKCJuZXcgZXh0ZW50OiAldToldTolbGx1XG4iLCBibG9jaywgbnVtLAorCQllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJZXh0X2RlYnVnKCJuZXcgZXh0ZW50OiAldToldTolbGx1XG4iLCBleF9lZV9ibG9jaywgbnVtLAogCQkJCWV4dDRfZXh0X3BibG9jayhleCkpOwogCQlleC0tOwogCQlleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CkBAIC0yNDc2LDYgKzI0MzQsMjUgQEAKIAlpZiAoY29ycmVjdF9pbmRleCAmJiBlaC0+ZWhfZW50cmllcykKIAkJZXJyID0gZXh0NF9leHRfY29ycmVjdF9pbmRleGVzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOwogCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBzdGlsbCBhIGVudHJ5IGluIHRoZSBsZWFmIG5vZGUsIGNoZWNrIHRvIHNlZSBpZgorCSAqIGl0IHJlZmVyZW5jZXMgdGhlIHBhcnRpYWwgY2x1c3Rlci4gIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKKwkgKiB3aGVyZSBpdCBjb3VsZDsgaWYgaXQgZG9lc24ndCwgd2UgY2FuIGZyZWUgdGhlIGNsdXN0ZXIuCisJICovCisJaWYgKCpwYXJ0aWFsX2NsdXN0ZXIgJiYgZXggPj0gRVhUX0ZJUlNUX0VYVEVOVChlaCkgJiYKKwkgICAgKEVYVDRfQjJDKHNiaSwgZXh0NF9leHRfcGJsb2NrKGV4KSArIGV4X2VlX2xlbiAtIDEpICE9CisJICAgICAqcGFydGlhbF9jbHVzdGVyKSkgeworCQlpbnQgZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDsKKworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKKworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJIEVYVDRfQzJCKHNiaSwgKnBhcnRpYWxfY2x1c3RlciksCisJCQkJIHNiaS0+c19jbHVzdGVyX3JhdGlvLCBmbGFncyk7CisJCSpwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogCS8qIGlmIHRoaXMgbGVhZiBpcyBmcmVlLCB0aGVuIHdlIHNob3VsZAogCSAqIHJlbW92ZSBpdCBmcm9tIGluZGV4IGJsb2NrIGFib3ZlICovCiAJaWYgKGVyciA9PSAwICYmIGVoLT5laF9lbnRyaWVzID09IDAgJiYgcGF0aFtkZXB0aF0ucF9iaCAhPSBOVUxMKQpAQCAtMjUxMSw2ICsyNDg4LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aDsKKwlleHQ0X2ZzYmxrX3QgcGFydGlhbF9jbHVzdGVyID0gMDsKIAloYW5kbGVfdCAqaGFuZGxlOwogCWludCBpLCBlcnI7CiAKQEAgLTI1MjQsNiArMjUwMiw4IEBACiBhZ2FpbjoKIAlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKIAorCXRyYWNlX2V4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgc3RhcnQsIGRlcHRoKTsKKwogCS8qCiAJICogV2Ugc3RhcnQgc2Nhbm5pbmcgZnJvbSByaWdodCBzaWRlLCBmcmVlaW5nIGFsbCB0aGUgYmxvY2tzCiAJICogYWZ0ZXIgaV9zaXplIGFuZCB3YWxraW5nIGludG8gdGhlIHRyZWUgZGVwdGgtd2lzZS4KQEAgLTI1NDYsNyArMjUyNiw4IEBACiAJCWlmIChpID09IGRlcHRoKSB7CiAJCQkvKiB0aGlzIGlzIGxlYWYgYmxvY2sgKi8KIAkJCWVyciA9IGV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwKLQkJCQkJc3RhcnQsIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CisJCQkJCSAgICAgICAmcGFydGlhbF9jbHVzdGVyLCBzdGFydCwKKwkJCQkJICAgICAgIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CiAJCQkvKiByb290IGxldmVsIGhhcyBwX2JoID09IE5VTEwsIGJyZWxzZSgpIGVhdHMgdGhpcyAqLwogCQkJYnJlbHNlKHBhdGhbaV0ucF9iaCk7CiAJCQlwYXRoW2ldLnBfYmggPSBOVUxMOwpAQCAtMjYxOCw2ICsyNTk5LDI0IEBACiAJCX0KIAl9CiAKKwl0cmFjZV9leHQ0X2V4dF9yZW1vdmVfc3BhY2VfZG9uZShpbm9kZSwgc3RhcnQsIGRlcHRoLCBwYXJ0aWFsX2NsdXN0ZXIsCisJCQlwYXRoLT5wX2hkci0+ZWhfZW50cmllcyk7CisKKwkvKiBJZiB3ZSBzdGlsbCBoYXZlIHNvbWV0aGluZyBpbiB0aGUgcGFydGlhbCBjbHVzdGVyIGFuZCB3ZSBoYXZlIHJlbW92ZWQKKwkgKiBldmVuIHRoZSBmaXJzdCBleHRlbnQsIHRoZW4gd2Ugc2hvdWxkIGZyZWUgdGhlIGJsb2NrcyBpbiB0aGUgcGFydGlhbAorCSAqIGNsdXN0ZXIgYXMgd2VsbC4gKi8KKwlpZiAocGFydGlhbF9jbHVzdGVyICYmIHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKKwkJaW50IGZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQ7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CisKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgcGFydGlhbF9jbHVzdGVyKSwKKwkJCQkgRVhUNF9TQihzYiktPnNfY2x1c3Rlcl9yYXRpbywgZmxhZ3MpOworCQlwYXJ0aWFsX2NsdXN0ZXIgPSAwOworCX0KKwogCS8qIFRPRE86IGZsZXhpYmxlIHRyZWUgcmVkdWN0aW9uIHNob3VsZCBiZSBoZXJlICovCiAJaWYgKHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKIAkJLyoKQEAgLTI5MDksMTcgKzI5MDgsMjkgQEAKICAqICAgYT4gVGhlcmUgaXMgbm8gc3BsaXQgcmVxdWlyZWQ6IEVudGlyZSBleHRlbnQgc2hvdWxkIGJlIGluaXRpYWxpemVkCiAgKiAgIGI+IFNwbGl0cyBpbiB0d28gZXh0ZW50czogV3JpdGUgaXMgaGFwcGVuaW5nIGF0IGVpdGhlciBlbmQgb2YgdGhlIGV4dGVudAogICogICBjPiBTcGxpdHMgaW4gdGhyZWUgZXh0ZW50czogU29tb25lIGlzIHdyaXRpbmcgaW4gbWlkZGxlIG9mIHRoZSBleHRlbnQKKyAqCisgKiBQcmUtY29uZGl0aW9uczoKKyAqICAtIFRoZSBleHRlbnQgcG9pbnRlZCB0byBieSAncGF0aCcgaXMgdW5pbml0aWFsaXplZC4KKyAqICAtIFRoZSBleHRlbnQgcG9pbnRlZCB0byBieSAncGF0aCcgY29udGFpbnMgYSBzdXBlcnNldAorICogICAgb2YgdGhlIGxvZ2ljYWwgc3BhbiBbbWFwLT5tX2xibGssIG1hcC0+bV9sYmxrICsgbWFwLT5tX2xlbikuCisgKgorICogUG9zdC1jb25kaXRpb25zIG9uIHN1Y2Nlc3M6CisgKiAgLSB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBibG9ja3MgYmV5b25kIG1hcC0+bF9sYmxrCisgKiAgICB0aGF0IGFyZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorICogICAgSXQgaXMgZ3VhcmFudGVlZCB0byBiZSA+PSBtYXAtPm1fbGVuLgogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWQoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAogCQkJCQkgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKKwlzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICplaDsKIAlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHNwbGl0X21hcDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgemVyb19leDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OwogCWV4dDRfbGJsa190IGVlX2Jsb2NrLCBlb2ZfYmxvY2s7Ci0JdW5zaWduZWQgaW50IGFsbG9jYXRlZCwgZWVfbGVuLCBkZXB0aDsKKwl1bnNpZ25lZCBpbnQgZWVfbGVuLCBkZXB0aDsKKwlpbnQgYWxsb2NhdGVkOwogCWludCBlcnIgPSAwOwogCWludCBzcGxpdF9mbGFnID0gMDsKIApAQCAtMjkzMywxMSArMjk0NCw5MyBAQAogCQllb2ZfYmxvY2sgPSBtYXAtPm1fbGJsayArIG1hcC0+bV9sZW47CiAKIAlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CisJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKIAlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OwogCWVlX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAllZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CiAJYWxsb2NhdGVkID0gZWVfbGVuIC0gKG1hcC0+bV9sYmxrIC0gZWVfYmxvY2spOwogCisJdHJhY2VfZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZF9lbnRlcihpbm9kZSwgbWFwLCBleCk7CisKKwkvKiBQcmUtY29uZGl0aW9ucyAqLworCUJVR19PTighZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpOworCUJVR19PTighaW5fcmFuZ2UobWFwLT5tX2xibGssIGVlX2Jsb2NrLCBlZV9sZW4pKTsKKwlCVUdfT04obWFwLT5tX2xibGsgKyBtYXAtPm1fbGVuID4gZWVfYmxvY2sgKyBlZV9sZW4pOworCisJLyoKKwkgKiBBdHRlbXB0IHRvIHRyYW5zZmVyIG5ld2x5IGluaXRpYWxpemVkIGJsb2NrcyBmcm9tIHRoZSBjdXJyZW50bHkKKwkgKiB1bmluaXRpYWxpemVkIGV4dGVudCB0byBpdHMgbGVmdCBuZWlnaGJvci4gVGhpcyBpcyBtdWNoIGNoZWFwZXIKKwkgKiB0aGFuIGFuIGluc2VydGlvbiBmb2xsb3dlZCBieSBhIG1lcmdlIGFzIHRob3NlIGludm9sdmUgY29zdGx5CisJICogbWVtbW92ZSgpIGNhbGxzLiBUaGlzIGlzIHRoZSBjb21tb24gY2FzZSBpbiBzdGVhZHkgc3RhdGUgZm9yCisJICogd29ya2xvYWRzIGRvaW5nIGZhbGxvY2F0ZShGQUxMT0NfRkxfS0VFUF9TSVpFKSBmb2xsb3dlZCBieSBhcHBlbmQKKwkgKiB3cml0ZXMuCisJICoKKwkgKiBMaW1pdGF0aW9ucyBvZiB0aGUgY3VycmVudCBsb2dpYzoKKwkgKiAgLSBMMTogd2Ugb25seSBkZWFsIHdpdGggd3JpdGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgZXh0ZW50LgorCSAqICAgIFRoZSBhcHByb2FjaCBjb3VsZCBiZSBleHRlbmRlZCB0byB3cml0ZXMgYXQgdGhlIGVuZAorCSAqICAgIG9mIHRoZSBleHRlbnQgYnV0IHRoaXMgc2NlbmFyaW8gd2FzIGRlZW1lZCBsZXNzIGNvbW1vbi4KKwkgKiAgLSBMMjogd2UgZG8gbm90IGRlYWwgd2l0aCB3cml0ZXMgY292ZXJpbmcgdGhlIHdob2xlIGV4dGVudC4KKwkgKiAgICBUaGlzIHdvdWxkIHJlcXVpcmUgcmVtb3ZpbmcgdGhlIGV4dGVudCBpZiB0aGUgdHJhbnNmZXIKKwkgKiAgICBpcyBwb3NzaWJsZS4KKwkgKiAgLSBMMzogd2Ugb25seSBhdHRlbXB0IHRvIG1lcmdlIHdpdGggYW4gZXh0ZW50IHN0b3JlZCBpbiB0aGUKKwkgKiAgICBzYW1lIGV4dGVudCB0cmVlIG5vZGUuCisJICovCisJaWYgKChtYXAtPm1fbGJsayA9PSBlZV9ibG9jaykgJiYJLypMMSovCisJCShtYXAtPm1fbGVuIDwgZWVfbGVuKSAmJgkvKkwyKi8KKwkJKGV4ID4gRVhUX0ZJUlNUX0VYVEVOVChlaCkpKSB7CS8qTDMqLworCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKnByZXZfZXg7CisJCWV4dDRfbGJsa190IHByZXZfbGJsazsKKwkJZXh0NF9mc2Jsa190IHByZXZfcGJsaywgZWVfcGJsazsKKwkJdW5zaWduZWQgaW50IHByZXZfbGVuLCB3cml0ZV9sZW47CisKKwkJcHJldl9leCA9IGV4IC0gMTsKKwkJcHJldl9sYmxrID0gbGUzMl90b19jcHUocHJldl9leC0+ZWVfYmxvY2spOworCQlwcmV2X2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKHByZXZfZXgpOworCQlwcmV2X3BibGsgPSBleHQ0X2V4dF9wYmxvY2socHJldl9leCk7CisJCWVlX3BibGsgPSBleHQ0X2V4dF9wYmxvY2soZXgpOworCQl3cml0ZV9sZW4gPSBtYXAtPm1fbGVuOworCisJCS8qCisJCSAqIEEgdHJhbnNmZXIgb2YgYmxvY2tzIGZyb20gJ2V4JyB0byAncHJldl9leCcgaXMgYWxsb3dlZAorCQkgKiB1cG9uIHRob3NlIGNvbmRpdGlvbnM6CisJCSAqIC0gQzE6IHByZXZfZXggaXMgaW5pdGlhbGl6ZWQsCisJCSAqIC0gQzI6IHByZXZfZXggaXMgbG9naWNhbGx5IGFidXR0aW5nIGV4LAorCQkgKiAtIEMzOiBwcmV2X2V4IGlzIHBoeXNpY2FsbHkgYWJ1dHRpbmcgZXgsCisJCSAqIC0gQzQ6IHByZXZfZXggY2FuIHJlY2VpdmUgdGhlIGFkZGl0aW9uYWwgYmxvY2tzIHdpdGhvdXQKKwkJICogICBvdmVyZmxvd2luZyB0aGUgKGluaXRpYWxpemVkKSBsZW5ndGggbGltaXQuCisJCSAqLworCQlpZiAoKCFleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKHByZXZfZXgpKSAmJgkJLypDMSovCisJCQkoKHByZXZfbGJsayArIHByZXZfbGVuKSA9PSBlZV9ibG9jaykgJiYJCS8qQzIqLworCQkJKChwcmV2X3BibGsgKyBwcmV2X2xlbikgPT0gZWVfcGJsaykgJiYJCS8qQzMqLworCQkJKHByZXZfbGVuIDwgKEVYVF9JTklUX01BWF9MRU4gLSB3cml0ZV9sZW4pKSkgewkvKkM0Ki8KKwkJCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisKKwkJCXRyYWNlX2V4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWRfZmFzdHBhdGgoaW5vZGUsCisJCQkJbWFwLCBleCwgcHJldl9leCk7CisKKwkJCS8qIFNoaWZ0IHRoZSBzdGFydCBvZiBleCBieSAnd3JpdGVfbGVuJyBibG9ja3MgKi8KKwkJCWV4LT5lZV9ibG9jayA9IGNwdV90b19sZTMyKGVlX2Jsb2NrICsgd3JpdGVfbGVuKTsKKwkJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZWVfcGJsayArIHdyaXRlX2xlbik7CisJCQlleC0+ZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gd3JpdGVfbGVuKTsKKwkJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleCk7IC8qIFJlc3RvcmUgdGhlIGZsYWcgKi8KKworCQkJLyogRXh0ZW5kIHByZXZfZXggYnkgJ3dyaXRlX2xlbicgYmxvY2tzICovCisJCQlwcmV2X2V4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihwcmV2X2xlbiArIHdyaXRlX2xlbik7CisKKwkJCS8qIE1hcmsgdGhlIGJsb2NrIGNvbnRhaW5pbmcgYm90aCBleHRlbnRzIGFzIGRpcnR5ICovCisJCQlleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCisJCQkvKiBVcGRhdGUgcGF0aCB0byBwb2ludCB0byB0aGUgcmlnaHQgZXh0ZW50ICovCisJCQlwYXRoW2RlcHRoXS5wX2V4dCA9IHByZXZfZXg7CisKKwkJCS8qIFJlc3VsdDogbnVtYmVyIG9mIGluaXRpYWxpemVkIGJsb2NrcyBwYXN0IG1fbGJsayAqLworCQkJYWxsb2NhdGVkID0gd3JpdGVfbGVuOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAlXQVJOX09OKG1hcC0+bV9sYmxrIDwgZWVfYmxvY2spOwogCS8qCiAJICogSXQgaXMgc2FmZSB0byBjb252ZXJ0IGV4dGVudCB0byBpbml0aWFsaXplZCB2aWEgZXhwbGljaXQKQEAgLTMxNjUsNiArMzI1OCwxOTIgQEAKIAlyZXR1cm4gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogfQogCisvKioKKyAqIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZTogZmluZCBkZWxheWVkIGFsbG9jYXRlZCBibG9jayBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKgorICogR29lcyB0aHJvdWdoIHRoZSBidWZmZXIgaGVhZHMgaW4gdGhlIHJhbmdlIFtsYmxrX3N0YXJ0LCBsYmxrX2VuZF0gYW5kIHJldHVybnMKKyAqIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBidWZmZXJzIG1hcmtlZCBmb3IgZGVsYXllZCBhbGxvY2F0aW9uLiBJdCByZXR1cm5zICcxJworICogb24gdGhlIGZpcnN0IGRlbGFsbG9jJ2VkIGJ1ZmZlciBoZWFkIGZvdW5kLiBJZiBubyBidWZmZXIgaGVhZCBpbiB0aGUgZ2l2ZW4KKyAqIHJhbmdlIGlzIG1hcmtlZCBmb3IgZGVsYWxsb2MsIGl0IHJldHVybnMgMC4KKyAqIGxibGtfc3RhcnQgc2hvdWxkIGFsd2F5cyBiZSA8PSBsYmxrX2VuZC4KKyAqIHNlYXJjaF9oaW50X3JldmVyc2UgaXMgdG8gaW5kaWNhdGUgdGhhdCBzZWFyY2hpbmcgaW4gcmV2ZXJzZSBmcm9tIGxibGtfZW5kIHRvCisgKiBsYmxrX3N0YXJ0IG1pZ2h0IGJlIG1vcmUgZWZmaWNpZW50IChpLmUuLCB3ZSB3aWxsIGxpa2VseSBoaXQgdGhlIGRlbGFsbG9jJ2VkCisgKiBibG9jayBzb29uZXIpLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJsb2NrcyBhcmUgdHJ1bmNhdGVkIHNlcXVlbnRpYWxseSBmcm9tCisgKiBsYmxrX3N0YXJ0IHRvd2FyZHMgbGJsa19lbmQuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9maW5kX2RlbGFsbG9jX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGV4dDRfbGJsa190IGxibGtfc3RhcnQsCisJCQkJICAgIGV4dDRfbGJsa190IGxibGtfZW5kLAorCQkJCSAgICBpbnQgc2VhcmNoX2hpbnRfcmV2ZXJzZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmggPSBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlOworCWV4dDRfbGJsa190IGksIHBnX2xibGs7CisJcGdvZmZfdCBpbmRleDsKKworCS8qIHJldmVyc2Ugc2VhcmNoIHdvbnQgd29yayBpZiBmcyBibG9jayBzaXplIGlzIGxlc3MgdGhhbiBwYWdlIHNpemUgKi8KKwlpZiAoaW5vZGUtPmlfYmxrYml0cyA8IFBBR0VfQ0FDSEVfU0hJRlQpCisJCXNlYXJjaF9oaW50X3JldmVyc2UgPSAwOworCisJaWYgKHNlYXJjaF9oaW50X3JldmVyc2UpCisJCWkgPSBsYmxrX2VuZDsKKwllbHNlCisJCWkgPSBsYmxrX3N0YXJ0OworCisJaW5kZXggPSBpID4+IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisKKwl3aGlsZSAoKGkgPj0gbGJsa19zdGFydCkgJiYgKGkgPD0gbGJsa19lbmQpKSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBuZXh0cGFnZTsKKworCQlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCQlnb3RvIG5leHRwYWdlOworCisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWlmICghaGVhZCkKKwkJCWdvdG8gbmV4dHBhZ2U7CisKKwkJYmggPSBoZWFkOworCQlwZ19sYmxrID0gaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJaW5vZGUtPmlfYmxrYml0cyk7CisJCWRvIHsKKwkJCWlmICh1bmxpa2VseShwZ19sYmxrIDwgbGJsa19zdGFydCkpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgcG9zc2libGUgd2hlbiBmcyBibG9jayBzaXplIGlzIGxlc3MKKwkJCQkgKiB0aGFuIHBhZ2Ugc2l6ZSBhbmQgb3VyIGNsdXN0ZXIgc3RhcnRzL2VuZHMgaW4KKwkJCQkgKiBtaWRkbGUgb2YgdGhlIHBhZ2UuIFNvIHdlIG5lZWQgdG8gc2tpcCB0aGUKKwkJCQkgKiBpbml0aWFsIGZldyBibG9ja3MgdGlsbCB3ZSByZWFjaCB0aGUgJ2xibGsnCisJCQkJICovCisJCQkJcGdfbGJsaysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIGRlbGF5ZWQgYWxsb2NhdGVkIGFuZCB0aGF0IGl0CisJCQkgKiBpcyBub3QgeWV0IG1hcHBlZC4gKHdoZW4gZGEtYnVmZmVycyBhcmUgbWFwcGVkIGR1cmluZworCQkJICogdGhlaXIgd3JpdGVvdXQsIHRoZWlyIGRhX21hcHBlZCBiaXQgaXMgc2V0LikKKwkJCSAqLworCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkgJiYgIWJ1ZmZlcl9kYV9tYXBwZWQoYmgpKSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCXRyYWNlX2V4dDRfZmluZF9kZWxhbGxvY19yYW5nZShpbm9kZSwKKwkJCQkJCWxibGtfc3RhcnQsIGxibGtfZW5kLAorCQkJCQkJc2VhcmNoX2hpbnRfcmV2ZXJzZSwKKwkJCQkJCTEsIGkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKHNlYXJjaF9oaW50X3JldmVyc2UpCisJCQkJaS0tOworCQkJZWxzZQorCQkJCWkrKzsKKwkJfSB3aGlsZSAoKGkgPj0gbGJsa19zdGFydCkgJiYgKGkgPD0gbGJsa19lbmQpICYmCisJCQkJKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCkpOworbmV4dHBhZ2U6CisJCWlmIChwYWdlKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkvKgorCQkgKiBNb3ZlIHRvIG5leHQgcGFnZS4gJ2knIHdpbGwgYmUgdGhlIGZpcnN0IGxibGsgaW4gdGhlIG5leHQKKwkJICogcGFnZS4KKwkJICovCisJCWlmIChzZWFyY2hfaGludF9yZXZlcnNlKQorCQkJaW5kZXgtLTsKKwkJZWxzZQorCQkJaW5kZXgrKzsKKwkJaSA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJfQorCisJdHJhY2VfZXh0NF9maW5kX2RlbGFsbG9jX3JhbmdlKGlub2RlLCBsYmxrX3N0YXJ0LCBsYmxrX2VuZCwKKwkJCQkJc2VhcmNoX2hpbnRfcmV2ZXJzZSwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAorCQkJICAgICAgIGludCBzZWFyY2hfaGludF9yZXZlcnNlKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOworCWV4dDRfbGJsa190IGxibGtfc3RhcnQsIGxibGtfZW5kOworCWxibGtfc3RhcnQgPSBsYmxrICYgKH4oc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxKSk7CisJbGJsa19lbmQgPSBsYmxrX3N0YXJ0ICsgc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxOworCisJcmV0dXJuIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZShpbm9kZSwgbGJsa19zdGFydCwgbGJsa19lbmQsCisJCQkJCXNlYXJjaF9oaW50X3JldmVyc2UpOworfQorCisvKioKKyAqIERldGVybWluZXMgaG93IG1hbnkgY29tcGxldGUgY2x1c3RlcnMgKG91dCBvZiB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlICdtYXAnKQorICogYXJlIHVuZGVyIGRlbGFsbG9jIGFuZCB3ZXJlIHJlc2VydmVkIHF1b3RhIGZvci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgYXJlIHdyaXRpbmcgb3V0IHRoZSBibG9ja3MgdGhhdCB3ZXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gd2l0aCB0aGVpciBhbGxvY2F0aW9uIGRlbGF5ZWQsIGJ1dCB0aGVuIHRoZSBzcGFjZSB3YXMKKyAqIGFsbG9jYXRlZCB1c2luZyBmYWxsb2NhdGUoKSBiZWZvcmUgdGhlIGRlbGF5ZWQgYWxsb2NhdGlvbiBjb3VsZCBiZSByZXNvbHZlZC4KKyAqIFRoZSBjYXNlcyB0byBsb29rIGZvciBhcmU6CisgKiAoJz0nIGluZGljYXRlZCBkZWxheWVkIGFsbG9jYXRlZCBibG9ja3MKKyAqICAnLScgaW5kaWNhdGVzIG5vbi1kZWxheWVkIGFsbG9jYXRlZCBibG9ja3MpCisgKiAoYSkgcGFydGlhbCBjbHVzdGVycyB0b3dhcmRzIGJlZ2lubmluZyBhbmQvb3IgZW5kIG91dHNpZGUgb2YgYWxsb2NhdGVkIHJhbmdlCisgKiAgICAgYXJlIG5vdCBkZWxhbGxvYydlZC4KKyAqCUV4OgorICoJfC0tLS1jLS0tPXw9PT09Yz09PT18PT09PWM9PT09fD09PS1jLS0tLXwKKyAqCSAgICAgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiA0IGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKiAoYikgcGFydGlhbCBjbHVzdGVyIChvdXRzaWRlIG9mIGFsbG9jYXRlZCByYW5nZSkgdG93YXJkcyBlaXRoZXIgZW5kIGlzCisgKiAgICAgbWFya2VkIGZvciBkZWxheWVkIGFsbG9jYXRpb24uIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBleGNsdWRlIHRoYXQKKyAqICAgICBjbHVzdGVyLgorICoJRXg6CisgKgl8LS0tLT09PT1jPT09PT09PT18PT09PT09PT1jPT09PT09PT18CisgKgkgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiAxIGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKglFeDoKKyAqCXw9PT09PT09PT09PT09PT09Yz09PT09PT09PT09PT09PT18CisgKiAgICAgICAgICAgIHwrKysrKysgYWxsb2NhdGVkICsrKysrK3wKKyAqCT09PiAwIGNvbXBsZXRlIGNsdXN0ZXJzIGluIGFib3ZlIGV4YW1wbGUKKyAqCisgKiBUaGUgZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZSB3aWxsIGJlIGNhbGxlZCBvbmx5IGlmIHdlCisgKiBkZXRlcm1pbmUgaGVyZSB0aGF0IHRoZXJlIHdlcmUgc29tZSAiZW50aXJlIiBjbHVzdGVycyB0aGF0IHNwYW4KKyAqIHRoaXMgJ2FsbG9jYXRlZCcgcmFuZ2UuCisgKiBJbiB0aGUgbm9uLWJpZ2FsbG9jIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCBqdXN0IGVuZCB1cCByZXR1cm5pbmcgbnVtX2Jsa3MKKyAqIHdpdGhvdXQgZXZlciBjYWxsaW5nIGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsa19zdGFydCwKKwkJCSAgIHVuc2lnbmVkIGludCBudW1fYmxrcykKK3sKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKKwlleHQ0X2xibGtfdCBhbGxvY19jbHVzdGVyX3N0YXJ0LCBhbGxvY19jbHVzdGVyX2VuZDsKKwlleHQ0X2xibGtfdCBsYmxrX2Zyb20sIGxibGtfdG8sIGNfb2Zmc2V0OworCXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfY2x1c3RlcnMgPSAwOworCisJYWxsb2NfY2x1c3Rlcl9zdGFydCA9IEVYVDRfQjJDKHNiaSwgbGJsa19zdGFydCk7CisJYWxsb2NfY2x1c3Rlcl9lbmQgPSBFWFQ0X0IyQyhzYmksIGxibGtfc3RhcnQgKyBudW1fYmxrcyAtIDEpOworCisJLyogbWF4IHBvc3NpYmxlIGNsdXN0ZXJzIGZvciB0aGlzIGFsbG9jYXRpb24gKi8KKwlhbGxvY2F0ZWRfY2x1c3RlcnMgPSBhbGxvY19jbHVzdGVyX2VuZCAtIGFsbG9jX2NsdXN0ZXJfc3RhcnQgKyAxOworCisJdHJhY2VfZXh0NF9nZXRfcmVzZXJ2ZWRfY2x1c3Rlcl9hbGxvYyhpbm9kZSwgbGJsa19zdGFydCwgbnVtX2Jsa3MpOworCisJLyogQ2hlY2sgdG93YXJkcyBsZWZ0IHNpZGUgKi8KKwljX29mZnNldCA9IGxibGtfc3RhcnQgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSAxKTsKKwlpZiAoY19vZmZzZXQpIHsKKwkJbGJsa19mcm9tID0gbGJsa19zdGFydCAmICh+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSkpOworCQlsYmxrX3RvID0gbGJsa19mcm9tICsgY19vZmZzZXQgLSAxOworCisJCWlmIChleHQ0X2ZpbmRfZGVsYWxsb2NfcmFuZ2UoaW5vZGUsIGxibGtfZnJvbSwgbGJsa190bywgMCkpCisJCQlhbGxvY2F0ZWRfY2x1c3RlcnMtLTsKKwl9CisKKwkvKiBOb3cgY2hlY2sgdG93YXJkcyByaWdodC4gKi8KKwljX29mZnNldCA9IChsYmxrX3N0YXJ0ICsgbnVtX2Jsa3MpICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKGFsbG9jYXRlZF9jbHVzdGVycyAmJiBjX29mZnNldCkgeworCQlsYmxrX2Zyb20gPSBsYmxrX3N0YXJ0ICsgbnVtX2Jsa3M7CisJCWxibGtfdG8gPSBsYmxrX2Zyb20gKyAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSBjX29mZnNldCkgLSAxOworCisJCWlmIChleHQ0X2ZpbmRfZGVsYWxsb2NfcmFuZ2UoaW5vZGUsIGxibGtfZnJvbSwgbGJsa190bywgMCkpCisJCQlhbGxvY2F0ZWRfY2x1c3RlcnMtLTsKKwl9CisKKwlyZXR1cm4gYWxsb2NhdGVkX2NsdXN0ZXJzOworfQorCiBzdGF0aWMgaW50CiBleHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCkBAIC0zMTgxLDYgKzM0NjAsOSBAQAogCQkgIGZsYWdzLCBhbGxvY2F0ZWQpOwogCWV4dDRfZXh0X3Nob3dfbGVhZihpbm9kZSwgcGF0aCk7CiAKKwl0cmFjZV9leHQ0X2V4dF9oYW5kbGVfdW5pbml0aWFsaXplZF9leHRlbnRzKGlub2RlLCBtYXAsIGFsbG9jYXRlZCwKKwkJCQkJCSAgICBuZXdibG9jayk7CisKIAkvKiBnZXRfYmxvY2soKSBiZWZvcmUgc3VibWl0IHRoZSBJTywgc3BsaXQgdGhlIGV4dGVudCAqLwogCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFJFX0lPKSkgewogCQlyZXQgPSBleHQ0X3NwbGl0X3Vud3JpdHRlbl9leHRlbnRzKGhhbmRsZSwgaW5vZGUsIG1hcCwKQEAgLTMxOTAsMTAgKzM0NzIsOSBAQAogCQkgKiB0aGF0IHRoaXMgSU8gbmVlZHMgdG8gY29udmVyc2lvbiB0byB3cml0dGVuIHdoZW4gSU8gaXMKIAkJICogY29tcGxldGVkCiAJCSAqLwotCQlpZiAoaW8gJiYgIShpby0+ZmxhZyAmIEVYVDRfSU9fRU5EX1VOV1JJVFRFTikpIHsKLQkJCWlvLT5mbGFnID0gRVhUNF9JT19FTkRfVU5XUklUVEVOOwotCQkJYXRvbWljX2luYygmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKTsKLQkJfSBlbHNlCisJCWlmIChpbykKKwkJCWV4dDRfc2V0X2lvX3Vud3JpdHRlbl9mbGFnKGlub2RlLCBpbyk7CisJCWVsc2UKIAkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0RJT19VTldSSVRURU4pOwogCQlpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKQogCQkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX1VOSU5JVDsKQEAgLTMyMzQsMTQgKzM1MTUsOCBAQAogCiAJLyogYnVmZmVyZWQgd3JpdGUsIHdyaXRlcGFnZSB0aW1lLCBjb252ZXJ0Ki8KIAlyZXQgPSBleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCk7Ci0JaWYgKHJldCA+PSAwKSB7CisJaWYgKHJldCA+PSAwKQogCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKLQkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXRoLAotCQkJCQkgbWFwLT5tX2xlbik7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBvdXQyOwotCX0KLQogb3V0OgogCWlmIChyZXQgPD0gMCkgewogCQllcnIgPSByZXQ7CkBAIC0zMjcwLDExICszNTQ1LDI0IEBACiAJICogQnV0IGZhbGxvY2F0ZSB3b3VsZCBoYXZlIGFscmVhZHkgdXBkYXRlZCBxdW90YSBhbmQgYmxvY2sKIAkgKiBjb3VudCBmb3IgdGhpcyBvZmZzZXQuIFNvIGNhbmNlbCB0aGVzZSByZXNlcnZhdGlvbgogCSAqLwotCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKQotCQlleHQ0X2RhX3VwZGF0ZV9yZXNlcnZlX3NwYWNlKGlub2RlLCBhbGxvY2F0ZWQsIDApOworCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKSB7CisJCXVuc2lnbmVkIGludCByZXNlcnZlZF9jbHVzdGVyczsKKwkJcmVzZXJ2ZWRfY2x1c3RlcnMgPSBnZXRfcmVzZXJ2ZWRfY2x1c3Rlcl9hbGxvYyhpbm9kZSwKKwkJCQltYXAtPm1fbGJsaywgbWFwLT5tX2xlbik7CisJCWlmIChyZXNlcnZlZF9jbHVzdGVycykKKwkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsCisJCQkJCQkgICAgIHJlc2VydmVkX2NsdXN0ZXJzLAorCQkJCQkJICAgICAwKTsKKwl9CiAKIG1hcF9vdXQ6CiAJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX01BUFBFRDsKKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRSkgPT0gMCkgeworCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIHBhdGgsCisJCQkJCSBtYXAtPm1fbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDI7CisJfQogb3V0MToKIAlpZiAoYWxsb2NhdGVkID4gbWFwLT5tX2xlbikKIAkJYWxsb2NhdGVkID0gbWFwLT5tX2xlbjsKQEAgLTMyOTAsNiArMzU3OCwxMTEgQEAKIH0KIAogLyoKKyAqIGdldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2MgLSBjaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3RlZAorICogYWxsb2NhdGlvbiAoaW4gdGhlIG1hcCBzdHJ1Y3R1cmUpIG92ZXJsYXBzIHdpdGggYSBjbHVzdGVyIGFscmVhZHkKKyAqIGFsbG9jYXRlZCBpbiBhbiBleHRlbnQuCisgKglAc2IJVGhlIGZpbGVzeXN0ZW0gc3VwZXJibG9jayBzdHJ1Y3R1cmUKKyAqCUBtYXAJVGhlIHJlcXVlc3RlZCBsYmxrLT5wYmxrIG1hcHBpbmcKKyAqCUBleAlUaGUgZXh0ZW50IHN0cnVjdHVyZSB3aGljaCBtaWdodCBjb250YWluIGFuIGltcGxpZWQKKyAqCQkJY2x1c3RlciBhbGxvY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZXh0NF9leHRfbWFwX2Jsb2NrcygpIGFmdGVyIHdlIGZhaWxlZCB0bworICogZmluZCBibG9ja3MgdGhhdCB3ZXJlIGFscmVhZHkgaW4gdGhlIGlub2RlJ3MgZXh0ZW50IHRyZWUuICBIZW5jZSwKKyAqIHdlIGtub3cgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGNhbm5vdCBvdmVybGFwCisgKiB0aGUgZXh0ZW50IGZyb20gdGhlIGlub2RlJ3MgZXh0ZW50IHRyZWUuICBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgd2UKKyAqIHdhbnQgdG8gY2F0Y2guICBUaGUgZmlyc3QgaXMgdGhpcyBjYXNlOgorICoKKyAqCQkgfC0tLSBjbHVzdGVyICMgTi0tfAorICogICAgfC0tLSBleHRlbnQgLS0tfAl8LS0tLSByZXF1ZXN0ZWQgcmVnaW9uIC0tLXwKKyAqCQkJfD09PT09PT09PT18CisgKgorICogVGhlIHNlY29uZCBjYXNlIHRoYXQgd2UgbmVlZCB0byB0ZXN0IGZvciBpcyB0aGlzIG9uZToKKyAqCisgKiAgIHwtLS0tLS0tLS0gY2x1c3RlciAjIE4gLS0tLS0tLS0tLS0tLS0tLXwKKyAqCSAgIHwtLS0gcmVxdWVzdGVkIHJlZ2lvbiAtLXwgICB8LS0tLS0tLSBleHRlbnQgLS0tLXwKKyAqCSAgIHw9PT09PT09PT09PT09PT09PT09PT09PXwKKyAqCisgKiBUaGUgdGhpcmQgY2FzZSBpcyB3aGVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGxpZXMgYmV0d2VlbiB0d28gZXh0ZW50cworICogd2l0aGluIHRoZSBzYW1lIGNsdXN0ZXI6CisgKiAgICAgICAgICB8LS0tLS0tLS0tLS0tLSBjbHVzdGVyICMgTi0tLS0tLS0tLS0tLS18CisgKiB8LS0tLS0gZXggLS0tLS18ICAgICAgICAgICAgICAgICAgfC0tLS0gZXhfcmlnaHQgLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgfC0tLS0tLSByZXF1ZXN0ZWQgcmVnaW9uIC0tLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgfD09PT09PT09PT09PT09PT18CisgKgorICogSW4gZWFjaCBvZiB0aGUgYWJvdmUgY2FzZXMsIHdlIG5lZWQgdG8gc2V0IHRoZSBtYXAtPm1fcGJsayBhbmQKKyAqIG1hcC0+bV9sZW4gc28gaXQgY29ycmVzcG9uZHMgdG8gdGhlIHJldHVybiB0aGUgZXh0ZW50IGxhYmVsbGVkIGFzCisgKiAifD09PT18IiBmcm9tIGNsdXN0ZXIgI04sIHNpbmNlIGl0IGlzIGFscmVhZHkgaW4gdXNlIGZvciBkYXRhIGluCisgKiBjbHVzdGVyIEVYVDRfQjJDKHNiaSwgbWFwLT5tX2xibGspLglXZSB3aWxsIHRoZW4gcmV0dXJuIDEgdG8KKyAqIHNpZ25hbCB0byBleHQ0X2V4dF9tYXBfYmxvY2tzKCkgdGhhdCBtYXAtPm1fcGJsayBzaG91bGQgYmUgdHJlYXRlZAorICogYXMgYSBuZXcgImFsbG9jYXRlZCIgYmxvY2sgcmVnaW9uLiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIHJldHVybiAwIGFuZAorICogZXh0NF9leHRfbWFwX2Jsb2NrcygpIHdpbGwgdGhlbiBhbGxvY2F0ZSBvbmUgb3IgbW9yZSBuZXcgY2x1c3RlcnMKKyAqIGJ5IGNhbGxpbmcgZXh0NF9tYl9uZXdfYmxvY2tzKCkuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ltcGxpZWRfY2x1c3Rlcl9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkJCSAgICAgc3RydWN0IGV4dDRfZXh0ZW50ICpleCwKKwkJCQkgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQoreworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCWV4dDRfbGJsa190IGNfb2Zmc2V0ID0gbWFwLT5tX2xibGsgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8tMSk7CisJZXh0NF9sYmxrX3QgZXhfY2x1c3Rlcl9zdGFydCwgZXhfY2x1c3Rlcl9lbmQ7CisJZXh0NF9sYmxrX3QgcnJfY2x1c3Rlcl9zdGFydCwgcnJfY2x1c3Rlcl9lbmQ7CisJZXh0NF9sYmxrX3QgZWVfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCWV4dDRfZnNibGtfdCBlZV9zdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7CisJdW5zaWduZWQgc2hvcnQgZWVfbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOworCisJLyogVGhlIGV4dGVudCBwYXNzZWQgaW4gdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIG1hdGNoICovCisJZXhfY2x1c3Rlcl9zdGFydCA9IEVYVDRfQjJDKHNiaSwgZWVfYmxvY2spOworCWV4X2NsdXN0ZXJfZW5kID0gRVhUNF9CMkMoc2JpLCBlZV9ibG9jayArIGVlX2xlbiAtIDEpOworCisJLyogVGhlIHJlcXVlc3RlZCByZWdpb24gcGFzc2VkIGludG8gZXh0NF9tYXBfYmxvY2tzKCkgKi8KKwlycl9jbHVzdGVyX3N0YXJ0ID0gRVhUNF9CMkMoc2JpLCBtYXAtPm1fbGJsayk7CisJcnJfY2x1c3Rlcl9lbmQgPSBFWFQ0X0IyQyhzYmksIG1hcC0+bV9sYmxrICsgbWFwLT5tX2xlbiAtIDEpOworCisJaWYgKChycl9jbHVzdGVyX3N0YXJ0ID09IGV4X2NsdXN0ZXJfZW5kKSB8fAorCSAgICAocnJfY2x1c3Rlcl9zdGFydCA9PSBleF9jbHVzdGVyX3N0YXJ0KSkgeworCQlpZiAocnJfY2x1c3Rlcl9zdGFydCA9PSBleF9jbHVzdGVyX2VuZCkKKwkJCWVlX3N0YXJ0ICs9IGVlX2xlbiAtIDE7CisJCW1hcC0+bV9wYmxrID0gKGVlX3N0YXJ0ICYgfihzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpKSArCisJCQljX29mZnNldDsKKwkJbWFwLT5tX2xlbiA9IG1pbihtYXAtPm1fbGVuLAorCQkJCSAodW5zaWduZWQpIHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gY19vZmZzZXQpOworCQkvKgorCQkgKiBDaGVjayBmb3IgYW5kIGhhbmRsZSB0aGlzIGNhc2U6CisJCSAqCisJCSAqICAgfC0tLS0tLS0tLSBjbHVzdGVyICMgTi0tLS0tLS0tLS0tLS18CisJCSAqCQkgICAgICAgfC0tLS0tLS0gZXh0ZW50IC0tLS18CisJCSAqCSAgIHwtLS0gcmVxdWVzdGVkIHJlZ2lvbiAtLS18CisJCSAqCSAgIHw9PT09PT09PT09PXwKKwkJICovCisKKwkJaWYgKG1hcC0+bV9sYmxrIDwgZWVfYmxvY2spCisJCQltYXAtPm1fbGVuID0gbWluKG1hcC0+bV9sZW4sIGVlX2Jsb2NrIC0gbWFwLT5tX2xibGspOworCisJCS8qCisJCSAqIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgYWxsb2NhdGVkCisJCSAqIGJsb2NrIHRvIHRoZSByaWdodCBvZiAnZXgnIGJ1dCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgY2x1c3Rlci4KKwkJICoKKwkJICogICAgICAgICAgfC0tLS0tLS0tLS0tLS0gY2x1c3RlciAjIE4tLS0tLS0tLS0tLS0tfAorCQkgKiB8LS0tLS0gZXggLS0tLS18ICAgICAgICAgICAgICAgICAgfC0tLS0gZXhfcmlnaHQgLS0tLXwKKwkJICogICAgICAgICAgICAgICAgICB8LS0tLS0tIHJlcXVlc3RlZCByZWdpb24gLS0tLS0tfAorCQkgKiAgICAgICAgICAgICAgICAgIHw9PT09PT09PT09PT09PT09fAorCQkgKi8KKwkJaWYgKG1hcC0+bV9sYmxrID4gZWVfYmxvY2spIHsKKwkJCWV4dDRfbGJsa190IG5leHQgPSBleHQ0X2V4dF9uZXh0X2FsbG9jYXRlZF9ibG9jayhwYXRoKTsKKwkJCW1hcC0+bV9sZW4gPSBtaW4obWFwLT5tX2xlbiwgbmV4dCAtIG1hcC0+bV9sYmxrKTsKKwkJfQorCisJCXRyYWNlX2V4dDRfZ2V0X2ltcGxpZWRfY2x1c3Rlcl9hbGxvY19leGl0KHNiLCBtYXAsIDEpOworCQlyZXR1cm4gMTsKKwl9CisKKwl0cmFjZV9leHQ0X2dldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2NfZXhpdChzYiwgbWFwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgogICogQmxvY2sgYWxsb2NhdGlvbi9tYXAvcHJlYWxsb2NhdGlvbiByb3V0aW5lIGZvciBleHRlbnRzIGJhc2VkIGZpbGVzCiAgKgogICoKQEAgLTMzMTEsMTUgKzM3MDQsMTcgQEAKIAkJCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXgsICpleDsKKwlzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXgsICpleCwgKmV4MjsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKIAlleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwOwotCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0OwotCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOworCWludCBmcmVlX29uX2VyciA9IDAsIGVyciA9IDAsIGRlcHRoLCByZXQ7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZCA9IDAsIG9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZF9jbHVzdGVycyA9IDA7CiAJdW5zaWduZWQgaW50IHB1bmNoZWRfb3V0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CiAJZXh0NF9pb19lbmRfdCAqaW8gPSBFWFQ0X0koaW5vZGUpLT5jdXJfYWlvX2RpbzsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIHB1bmNoX21hcDsKKwlleHQ0X2xibGtfdCBjbHVzdGVyX29mZnNldDsKIAogCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJWx1XG4iLAogCQkgIG1hcC0+bV9sYmxrLCBtYXAtPm1fbGVuLCBpbm9kZS0+aV9pbm8pOwpAQCAtMzMyOSw2ICszNzI0LDEwIEBACiAJaWYgKCEoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFVOQ0hfT1VUX0VYVCkgJiYKIAkJZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIG1hcC0+bV9sYmxrLCAmbmV3ZXgpKSB7CiAJCWlmICghbmV3ZXguZWVfc3RhcnRfbG8gJiYgIW5ld2V4LmVlX3N0YXJ0X2hpKSB7CisJCQlpZiAoKHNiaS0+c19jbHVzdGVyX3JhdGlvID4gMSkgJiYKKwkJCSAgICBleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3Rlcihpbm9kZSwgbWFwLT5tX2xibGssIDApKQorCQkJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKIAkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CiAJCQkJLyoKIAkJCQkgKiBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0IGFuZApAQCAtMzMzOSw2ICszNzM4LDggQEAKIAkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KIAkJfSBlbHNlIHsKIAkJCS8qIGJsb2NrIGlzIGFscmVhZHkgYWxsb2NhdGVkICovCisJCQlpZiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8gPiAxKQorCQkJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CiAJCQluZXdibG9jayA9IG1hcC0+bV9sYmxrCiAJCQkJICAgLSBsZTMyX3RvX2NwdShuZXdleC5lZV9ibG9jaykKIAkJCQkgICArIGV4dDRfZXh0X3BibG9jaygmbmV3ZXgpOwpAQCAtMzM4NCw4ICszNzg1LDE0IEBACiAJCSAqIHdlIHNwbGl0IG91dCBpbml0aWFsaXplZCBwb3J0aW9ucyBkdXJpbmcgYSB3cml0ZS4KIAkJICovCiAJCWVlX2xlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKworCQl0cmFjZV9leHQ0X2V4dF9zaG93X2V4dGVudChpbm9kZSwgZWVfYmxvY2ssIGVlX3N0YXJ0LCBlZV9sZW4pOworCiAJCS8qIGlmIGZvdW5kIGV4dGVudCBjb3ZlcnMgYmxvY2ssIHNpbXBseSByZXR1cm4gaXQgKi8KIAkJaWYgKGluX3JhbmdlKG1hcC0+bV9sYmxrLCBlZV9ibG9jaywgZWVfbGVuKSkgeworCQkJc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBwdW5jaF9tYXA7CisJCQlleHQ0X2ZzYmxrX3QgcGFydGlhbF9jbHVzdGVyID0gMDsKKwogCQkJbmV3YmxvY2sgPSBtYXAtPm1fbGJsayAtIGVlX2Jsb2NrICsgZWVfc3RhcnQ7CiAJCQkvKiBudW1iZXIgb2YgcmVtYWluaW5nIGJsb2NrcyBpbiB0aGUgZXh0ZW50ICovCiAJCQlhbGxvY2F0ZWQgPSBlZV9sZW4gLSAobWFwLT5tX2xibGsgLSBlZV9ibG9jayk7CkBAIC0zNDY5LDcgKzM4NzYsOCBAQAogCQkJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShpbm9kZSk7CiAKIAkJCWVyciA9IGV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwKLQkJCQltYXAtPm1fbGJsaywgbWFwLT5tX2xibGsgKyBwdW5jaGVkX291dCk7CisJCQkJCSAgICAgICAmcGFydGlhbF9jbHVzdGVyLCBtYXAtPm1fbGJsaywKKwkJCQkJICAgICAgIG1hcC0+bV9sYmxrICsgcHVuY2hlZF9vdXQpOwogCiAJCQlpZiAoIWVyciAmJiBwYXRoLT5wX2hkci0+ZWhfZW50cmllcyA9PSAwKSB7CiAJCQkJLyoKQEAgLTM0OTIsNiArMzkwMCwxMCBAQAogCQl9CiAJfQogCisJaWYgKChzYmktPnNfY2x1c3Rlcl9yYXRpbyA+IDEpICYmCisJICAgIGV4dDRfZmluZF9kZWxhbGxvY19jbHVzdGVyKGlub2RlLCBtYXAtPm1fbGJsaywgMCkpCisJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKIAkvKgogCSAqIHJlcXVlc3RlZCBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0OwogCSAqIHdlIGNvdWxkbid0IHRyeSB0byBjcmVhdGUgYmxvY2sgaWYgY3JlYXRlIGZsYWcgaXMgemVybwpAQCAtMzUwNCw5ICszOTE2LDI1IEBACiAJCWV4dDRfZXh0X3B1dF9nYXBfaW5fY2FjaGUoaW5vZGUsIHBhdGgsIG1hcC0+bV9sYmxrKTsKIAkJZ290byBvdXQyOwogCX0KKwogCS8qCiAJICogT2theSwgd2UgbmVlZCB0byBkbyBibG9jayBhbGxvY2F0aW9uLgogCSAqLworCW1hcC0+bV9mbGFncyAmPSB+RVhUNF9NQVBfRlJPTV9DTFVTVEVSOworCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobWFwLT5tX2xibGspOworCWNsdXN0ZXJfb2Zmc2V0ID0gbWFwLT5tX2xibGsgJiAoc2JpLT5zX2NsdXN0ZXJfcmF0aW8tMSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBiaWdhbGxvYywgY2hlY2sgdG8gc2VlIGlmIHRoZSBleHRlbnQgcmV0dXJuZWQKKwkgKiBieSBleHQ0X2V4dF9maW5kX2V4dGVudCgpIGltcGxpZXMgYSBjbHVzdGVyIHdlIGNhbiB1c2UuCisJICovCisJaWYgKGNsdXN0ZXJfb2Zmc2V0ICYmIGV4ICYmCisJICAgIGdldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2MoaW5vZGUtPmlfc2IsIG1hcCwgZXgsIHBhdGgpKSB7CisJCWFyLmxlbiA9IGFsbG9jYXRlZCA9IG1hcC0+bV9sZW47CisJCW5ld2Jsb2NrID0gbWFwLT5tX3BibGs7CisJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9GUk9NX0NMVVNURVI7CisJCWdvdG8gZ290X2FsbG9jYXRlZF9ibG9ja3M7CisJfQogCiAJLyogZmluZCBuZWlnaGJvdXIgYWxsb2NhdGVkIGJsb2NrcyAqLwogCWFyLmxsZWZ0ID0gbWFwLT5tX2xibGs7CkBAIC0zNTE0LDEwICszOTQyLDIxIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQyOwogCWFyLmxyaWdodCA9IG1hcC0+bV9sYmxrOwotCWVyciA9IGV4dDRfZXh0X3NlYXJjaF9yaWdodChpbm9kZSwgcGF0aCwgJmFyLmxyaWdodCwgJmFyLnByaWdodCk7CisJZXgyID0gTlVMTDsKKwllcnIgPSBleHQ0X2V4dF9zZWFyY2hfcmlnaHQoaW5vZGUsIHBhdGgsICZhci5scmlnaHQsICZhci5wcmlnaHQsICZleDIpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MjsKIAorCS8qIENoZWNrIGlmIHRoZSBleHRlbnQgYWZ0ZXIgc2VhcmNoaW5nIHRvIHRoZSByaWdodCBpbXBsaWVzIGEKKwkgKiBjbHVzdGVyIHdlIGNhbiB1c2UuICovCisJaWYgKChzYmktPnNfY2x1c3Rlcl9yYXRpbyA+IDEpICYmIGV4MiAmJgorCSAgICBnZXRfaW1wbGllZF9jbHVzdGVyX2FsbG9jKGlub2RlLT5pX3NiLCBtYXAsIGV4MiwgcGF0aCkpIHsKKwkJYXIubGVuID0gYWxsb2NhdGVkID0gbWFwLT5tX2xlbjsKKwkJbmV3YmxvY2sgPSBtYXAtPm1fcGJsazsKKwkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX0ZST01fQ0xVU1RFUjsKKwkJZ290byBnb3RfYWxsb2NhdGVkX2Jsb2NrczsKKwl9CisKIAkvKgogCSAqIFNlZSBpZiByZXF1ZXN0IGlzIGJleW9uZCBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgd2UgY2FuIGhhdmUgaW4KIAkgKiBhIHNpbmdsZSBleHRlbnQuIEZvciBhbiBpbml0aWFsaXplZCBleHRlbnQgdGhpcyBsaW1pdCBpcwpAQCAtMzUzMiw5ICszOTcxLDggQEAKIAkJbWFwLT5tX2xlbiA9IEVYVF9VTklOSVRfTUFYX0xFTjsKIAogCS8qIENoZWNrIGlmIHdlIGNhbiByZWFsbHkgaW5zZXJ0IChtX2xibGspOjoobV9sYmxrICsgbV9sZW4pIGV4dGVudCAqLwotCW5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobWFwLT5tX2xibGspOwogCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KG1hcC0+bV9sZW4pOwotCWVyciA9IGV4dDRfZXh0X2NoZWNrX292ZXJsYXAoaW5vZGUsICZuZXdleCwgcGF0aCk7CisJZXJyID0gZXh0NF9leHRfY2hlY2tfb3ZlcmxhcChzYmksIGlub2RlLCAmbmV3ZXgsIHBhdGgpOwogCWlmIChlcnIpCiAJCWFsbG9jYXRlZCA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCk7CiAJZWxzZQpAQCAtMzU0NCw3ICszOTgyLDE4IEBACiAJYXIuaW5vZGUgPSBpbm9kZTsKIAlhci5nb2FsID0gZXh0NF9leHRfZmluZF9nb2FsKGlub2RlLCBwYXRoLCBtYXAtPm1fbGJsayk7CiAJYXIubG9naWNhbCA9IG1hcC0+bV9sYmxrOwotCWFyLmxlbiA9IGFsbG9jYXRlZDsKKwkvKgorCSAqIFdlIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2x1c3RlcgorCSAqIGZvciB0aGUgbG9naWNhbCBibG9jayBudW1iZXIsIHNpbmNlIHdoZW4gd2UgYWxsb2NhdGUgYQorCSAqIHBoeXNpY2FsIGNsdXN0ZXIsIHRoZSBwaHlzaWNhbCBibG9jayBzaG91bGQgc3RhcnQgYXQgdGhlCisJICogc2FtZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbHVzdGVyLiAgVGhpcyBpcworCSAqIG5lZWRlZCBzbyB0aGF0IGZ1dHVyZSBjYWxscyB0byBnZXRfaW1wbGllZF9jbHVzdGVyX2FsbG9jKCkKKwkgKiB3b3JrIGNvcnJlY3RseS4KKwkgKi8KKwlvZmZzZXQgPSBtYXAtPm1fbGJsayAmIChzYmktPnNfY2x1c3Rlcl9yYXRpbyAtIDEpOworCWFyLmxlbiA9IEVYVDRfTlVNX0IyQyhzYmksIG9mZnNldCthbGxvY2F0ZWQpOworCWFyLmdvYWwgLT0gb2Zmc2V0OworCWFyLmxvZ2ljYWwgLT0gb2Zmc2V0OwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOwogCWVsc2UKQEAgLTM1NTcsOSArNDAwNiwxNSBAQAogCQlnb3RvIG91dDI7CiAJZXh0X2RlYnVnKCJhbGxvY2F0ZSBuZXcgYmxvY2s6IGdvYWwgJWxsdSwgZm91bmQgJWxsdS8ldVxuIiwKIAkJICBhci5nb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKKwlmcmVlX29uX2VyciA9IDE7CisJYWxsb2NhdGVkX2NsdXN0ZXJzID0gYXIubGVuOworCWFyLmxlbiA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKSAtIG9mZnNldDsKKwlpZiAoYXIubGVuID4gYWxsb2NhdGVkKQorCQlhci5sZW4gPSBhbGxvY2F0ZWQ7CiAKK2dvdF9hbGxvY2F0ZWRfYmxvY2tzOgogCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLwotCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmbmV3ZXgsIG5ld2Jsb2NrKTsKKwlleHQ0X2V4dF9zdG9yZV9wYmxvY2soJm5ld2V4LCBuZXdibG9jayArIG9mZnNldCk7CiAJbmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTsKIAkvKiBNYXJrIHVuaW5pdGlhbGl6ZWQgKi8KIAlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCl7CkBAIC0zNTcyLDEwICs0MDI3LDkgQEAKIAkJICogdGhhdCB3ZSBuZWVkIHRvIHBlcmZvcm0gY29udmVyc2lvbiB3aGVuIElPIGlzIGRvbmUuCiAJCSAqLwogCQlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1BSRV9JTykpIHsKLQkJCWlmIChpbyAmJiAhKGlvLT5mbGFnICYgRVhUNF9JT19FTkRfVU5XUklUVEVOKSkgewotCQkJCWlvLT5mbGFnID0gRVhUNF9JT19FTkRfVU5XUklUVEVOOwotCQkJCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7Ci0JCQl9IGVsc2UKKwkJCWlmIChpbykKKwkJCQlleHQ0X3NldF9pb191bndyaXR0ZW5fZmxhZyhpbm9kZSwgaW8pOworCQkJZWxzZQogCQkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLAogCQkJCQkJICAgICBFWFQ0X1NUQVRFX0RJT19VTldSSVRURU4pOwogCQl9CkBAIC0zNTgzLDExICs0MDM3LDE0IEBACiAJCQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfVU5JTklUOwogCX0KIAotCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwgYXIubGVuKTsKKwllcnIgPSAwOworCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfS0VFUF9TSVpFKSA9PSAwKQorCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssCisJCQkJCSBwYXRoLCBhci5sZW4pOwogCWlmICghZXJyKQogCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsCiAJCQkJCSAgICAgJm5ld2V4LCBmbGFncyk7Ci0JaWYgKGVycikgeworCWlmIChlcnIgJiYgZnJlZV9vbl9lcnIpIHsKIAkJaW50IGZiX2ZsYWdzID0gZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSA/CiAJCQlFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFIDogMDsKIAkJLyogZnJlZSBkYXRhIGJsb2NrcyB3ZSBqdXN0IGFsbG9jYXRlZCAqLwpAQCAtMzYxMCw4ICs0MDY3LDgyIEBACiAJICogVXBkYXRlIHJlc2VydmVkIGJsb2Nrcy9tZXRhZGF0YSBibG9ja3MgYWZ0ZXIgc3VjY2Vzc2Z1bAogCSAqIGJsb2NrIGFsbG9jYXRpb24gd2hpY2ggaGFkIGJlZW4gZGVmZXJyZWQgdGlsbCBub3cuCiAJICovCi0JaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpCi0JCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGFsbG9jYXRlZCwgMSk7CisJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpIHsKKwkJdW5zaWduZWQgaW50IHJlc2VydmVkX2NsdXN0ZXJzOworCQkvKgorCQkgKiBDaGVjayBob3cgbWFueSBjbHVzdGVycyB3ZSBoYWQgcmVzZXJ2ZWQgdGhpcyBhbGxvY2F0ZWQgcmFuZ2UKKwkJICovCisJCXJlc2VydmVkX2NsdXN0ZXJzID0gZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2MoaW5vZGUsCisJCQkJCQltYXAtPm1fbGJsaywgYWxsb2NhdGVkKTsKKwkJaWYgKG1hcC0+bV9mbGFncyAmIEVYVDRfTUFQX0ZST01fQ0xVU1RFUikgeworCQkJaWYgKHJlc2VydmVkX2NsdXN0ZXJzKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIGNsdXN0ZXJzIHJlc2VydmVkIGZvciB0aGlzIHJhbmdlLgorCQkJCSAqIEJ1dCBzaW5jZSB3ZSBhcmUgbm90IGRvaW5nIGFjdHVhbCBhbGxvY2F0aW9uCisJCQkJICogYW5kIGFyZSBzaW1wbHkgdXNpbmcgYmxvY2tzIGZyb20gcHJldmlvdXNseQorCQkJCSAqIGFsbG9jYXRlZCBjbHVzdGVyLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUKKwkJCQkgKiByZXNlcnZhdGlvbiBhbmQgbm90IGNsYWltIHF1b3RhLgorCQkJCSAqLworCQkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsCisJCQkJCQlyZXNlcnZlZF9jbHVzdGVycywgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCVUdfT04oYWxsb2NhdGVkX2NsdXN0ZXJzIDwgcmVzZXJ2ZWRfY2x1c3RlcnMpOworCQkJLyogV2Ugd2lsbCBjbGFpbSBxdW90YSBmb3IgYWxsIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MuKi8KKwkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGFsbG9jYXRlZF9jbHVzdGVycywKKwkJCQkJCQkxKTsKKwkJCWlmIChyZXNlcnZlZF9jbHVzdGVycyA8IGFsbG9jYXRlZF9jbHVzdGVycykgeworCQkJCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwkJCQlpbnQgcmVzZXJ2YXRpb24gPSBhbGxvY2F0ZWRfY2x1c3RlcnMgLQorCQkJCQkJICByZXNlcnZlZF9jbHVzdGVyczsKKwkJCQkvKgorCQkJCSAqIEl0IHNlZW1zIHdlIGNsYWltZWQgZmV3IGNsdXN0ZXJzIG91dHNpZGUgb2YKKwkJCQkgKiB0aGUgcmFuZ2Ugb2YgdGhpcyBhbGxvY2F0aW9uLiBXZSBzaG91bGQgZ2l2ZQorCQkJCSAqIGl0IGJhY2sgdG8gdGhlIHJlc2VydmF0aW9uIHBvb2wuIFRoaXMgY2FuCisJCQkJICogaGFwcGVuIGluIHRoZSBmb2xsb3dpbmcgY2FzZToKKwkJCQkgKgorCQkJCSAqICogU3VwcG9zZSBzX2NsdXN0ZXJfcmF0aW8gaXMgNCAoaS5lLiwgZWFjaAorCQkJCSAqICAgY2x1c3RlciBoYXMgNCBibG9ja3MuIFRodXMsIHRoZSBjbHVzdGVycworCQkJCSAqICAgYXJlIFswLTNdLFs0LTddLFs4LTExXS4uLgorCQkJCSAqICogRmlyc3QgY29tZXMgZGVsYXllZCBhbGxvY2F0aW9uIHdyaXRlIGZvcgorCQkJCSAqICAgbG9naWNhbCBibG9ja3MgMTAgJiAxMS4gU2luY2UgdGhlcmUgd2VyZSBubworCQkJCSAqICAgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0ZWQgYmxvY2tzIGluIHRoZQorCQkJCSAqICAgcmFuZ2UgWzgtMTFdLCB3ZSB3b3VsZCByZXNlcnZlIDEgY2x1c3RlcgorCQkJCSAqICAgZm9yIHRoaXMgd3JpdGUuCisJCQkJICogKiBOZXh0IGNvbWVzIHdyaXRlIGZvciBsb2dpY2FsIGJsb2NrcyAzIHRvIDguCisJCQkJICogICBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgcmVzZXJ2ZSAyIGNsdXN0ZXJzCisJCQkJICogICAoZm9yIFswLTNdIGFuZCBbNC03XTsgYW5kIG5vdCBmb3IgWzgtMTFdIGFzCisJCQkJICogICB0aGF0IHJhbmdlIGhhcyBhIGRlbGF5ZWQgYWxsb2NhdGVkIGJsb2Nrcy4KKwkJCQkgKiAgIFRodXMgdG90YWwgcmVzZXJ2ZWQgY2x1c3RlcnMgbm93IGJlY29tZXMgMy4KKwkJCQkgKiAqIE5vdywgZHVyaW5nIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gd3JpdGVvdXQKKwkJCQkgKiAgIHRpbWUsIHdlIHdpbGwgZmlyc3Qgd3JpdGUgYmxvY2tzIFszLThdIGFuZAorCQkJCSAqICAgYWxsb2NhdGUgMyBjbHVzdGVycyBmb3Igd3JpdGluZyB0aGVzZQorCQkJCSAqICAgYmxvY2tzLiBBbHNvLCB3ZSB3b3VsZCBjbGFpbSBhbGwgdGhlc2UKKwkJCQkgKiAgIHRocmVlIGNsdXN0ZXJzIGFib3ZlLgorCQkJCSAqICogTm93IHdoZW4gd2UgY29tZSBoZXJlIHRvIHdyaXRlb3V0IHRoZQorCQkJCSAqICAgYmxvY2tzIFsxMC0xMV0sIHdlIHdvdWxkIGV4cGVjdCB0byBjbGFpbQorCQkJCSAqICAgdGhlIHJlc2VydmF0aW9uIG9mIDEgY2x1c3RlciB3ZSBoYWQgbWFkZQorCQkJCSAqICAgKGFuZCB3ZSB3b3VsZCBjbGFpbSBpdCBzaW5jZSB0aGVyZSBhcmUgbm8KKwkJCQkgKiAgIG1vcmUgZGVsYXllZCBhbGxvY2F0ZWQgYmxvY2tzIGluIHRoZSByYW5nZQorCQkJCSAqICAgWzgtMTFdLiBCdXQgb3VyIHJlc2VydmVkIGNsdXN0ZXIgY291bnQgaGFkCisJCQkJICogICBhbHJlYWR5IGdvbmUgdG8gMC4KKwkJCQkgKgorCQkJCSAqICAgVGh1cywgYXQgdGhlIHN0ZXAgNCBhYm92ZSB3aGVuIHdlIGRldGVybWluZQorCQkJCSAqICAgdGhhdCB0aGVyZSBhcmUgc3RpbGwgc29tZSB1bndyaXR0ZW4gZGVsYXllZAorCQkJCSAqICAgYWxsb2NhdGVkIGJsb2NrcyBvdXRzaWRlIG9mIG91ciBjdXJyZW50CisJCQkJICogICBibG9jayByYW5nZSwgd2Ugc2hvdWxkIGluY3JlbWVudCB0aGUKKwkJCQkgKiAgIHJlc2VydmVkIGNsdXN0ZXJzIGNvdW50IHNvIHRoYXQgd2hlbiB0aGUKKwkJCQkgKiAgIHJlbWFpbmluZyBibG9ja3MgZmluYWxseSBnZXRzIHdyaXR0ZW4sIHdlCisJCQkJICogICBjb3VsZCBjbGFpbSB0aGVtLgorCQkJCSAqLworCQkJCWRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsCisJCQkJCQlFWFQ0X0MyQihzYmksIHJlc2VydmF0aW9uKSk7CisJCQkJc3Bpbl9sb2NrKCZlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKKwkJCQllaS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2NrcyArPSByZXNlcnZhdGlvbjsKKwkJCQlzcGluX3VubG9jaygmZWktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CisJCQl9CisJCX0KKwl9CiAKIAkvKgogCSAqIENhY2hlIHRoZSBleHRlbnQgYW5kIHVwZGF0ZSB0cmFuc2FjdGlvbiB0byBjb21taXQgb24gZmRhdGFzeW5jIG9ubHkKQEAgLTM2MzQsMTIgKzQxNjUsMTIgQEAKIAkJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOwogCQlrZnJlZShwYXRoKTsKIAl9Ci0JdHJhY2VfZXh0NF9leHRfbWFwX2Jsb2Nrc19leGl0KGlub2RlLCBtYXAtPm1fbGJsaywKLQkJbmV3YmxvY2ssIG1hcC0+bV9sZW4sIGVyciA/IGVyciA6IGFsbG9jYXRlZCk7Ci0KIAlyZXN1bHQgPSAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFVOQ0hfT1VUX0VYVCkgPwogCQkJcHVuY2hlZF9vdXQgOiBhbGxvY2F0ZWQ7CiAKKwl0cmFjZV9leHQ0X2V4dF9tYXBfYmxvY2tzX2V4aXQoaW5vZGUsIG1hcC0+bV9sYmxrLAorCQluZXdibG9jaywgbWFwLT5tX2xlbiwgZXJyID8gZXJyIDogcmVzdWx0KTsKKwogCXJldHVybiBlcnIgPyBlcnIgOiByZXN1bHQ7CiB9CiAKQEAgLTM2NDksNiArNDE4MCw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWV4dDRfbGJsa190IGxhc3RfYmxvY2s7CiAJaGFuZGxlX3QgKmhhbmRsZTsKKwlsb2ZmX3QgcGFnZV9sZW47CiAJaW50IGVyciA9IDA7CiAKIAkvKgpAQCAtMzY2NSw4ICs0MTk3LDE2IEBACiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm47CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSAmIChzYi0+c19ibG9ja3NpemUgLSAxKSkKLQkJZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJaWYgKGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCQlwYWdlX2xlbiA9IFBBR0VfQ0FDSEVfU0laRSAtCisJCQkoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwkJZXJyID0gZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKGhhbmRsZSwKKwkJCW1hcHBpbmcsIGlub2RlLT5pX3NpemUsIHBhZ2VfbGVuLCAwKTsKKworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfc3RvcDsKKwl9CiAKIAlpZiAoZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpKQogCQlnb3RvIG91dF9zdG9wOwpAQCAtMzc2MCw2ICs0MzAwLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcmV0MiA9IDA7CiAJaW50IHJldHJpZXMgPSAwOworCWludCBmbGFnczsKIAlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAl1bnNpZ25lZCBpbnQgY3JlZGl0cywgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CiAKQEAgLTM3OTYsNiArNDMzNywxNiBAQAogCQl0cmFjZV9leHQ0X2ZhbGxvY2F0ZV9leGl0KGlub2RlLCBvZmZzZXQsIG1heF9ibG9ja3MsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQorCWZsYWdzID0gRVhUNF9HRVRfQkxPQ0tTX0NSRUFURV9VTklOSVRfRVhUOworCWlmIChtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkKKwkJZmxhZ3MgfD0gRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRTsKKwkvKgorCSAqIERvbid0IG5vcm1hbGl6ZSB0aGUgcmVxdWVzdCBpZiBpdCBjYW4gZml0IGluIG9uZSBleHRlbnQgc28KKwkgKiB0aGF0IGl0IGRvZXNuJ3QgZ2V0IHVubmVjZXNzYXJpbHkgc3BsaXQgaW50byBtdWx0aXBsZQorCSAqIGV4dGVudHMuCisJICovCisJaWYgKGxlbiA8PSBFWFRfVU5JTklUX01BWF9MRU4gPDwgYmxrYml0cykKKwkJZmxhZ3MgfD0gRVhUNF9HRVRfQkxPQ0tTX05PX05PUk1BTElaRTsKIHJldHJ5OgogCXdoaWxlIChyZXQgPj0gMCAmJiByZXQgPCBtYXhfYmxvY2tzKSB7CiAJCW1hcC5tX2xibGsgPSBtYXAubV9sYmxrICsgcmV0OwpAQCAtMzgwNSw5ICs0MzU2LDcgQEAKIAkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmbWFwLAotCQkJCSAgICAgIEVYVDRfR0VUX0JMT0NLU19DUkVBVEVfVU5JTklUX0VYVCB8Ci0JCQkJICAgICAgRVhUNF9HRVRfQkxPQ0tTX05PX05PUk1BTElaRSk7CisJCXJldCA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAmbWFwLCBmbGFncyk7CiAJCWlmIChyZXQgPD0gMCkgewogI2lmZGVmIEVYVDRGU19ERUJVRwogCQkJV0FSTl9PTihyZXQgPD0gMCk7CkBAIC00MTAyLDcgKzQ2NTEsNiBAQAogCQlyZXR1cm4gRVhUX0JSRUFLOwogCXJldHVybiBFWFRfQ09OVElOVUU7CiB9Ci0KIC8qIGZpZW1hcCBmbGFncyB3ZSBjYW4gaGFuZGxlIHNwZWNpZmllZCBoZXJlICovCiAjZGVmaW5lIEVYVDRfRklFTUFQX0ZMQUdTCShGSUVNQVBfRkxBR19TWU5DfEZJRU1BUF9GTEFHX1hBVFRSKQogCkBAIC00MTYyLDE3ICs0NzEwLDI4IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgbWFwOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0JbG9mZl90IGZpcnN0X2Jsb2NrX29mZnNldCwgbGFzdF9ibG9ja19vZmZzZXQsIGJsb2NrX2xlbjsKLQlsb2ZmX3QgZmlyc3RfcGFnZSwgbGFzdF9wYWdlLCBmaXJzdF9wYWdlX29mZnNldCwgbGFzdF9wYWdlX29mZnNldDsKKwlsb2ZmX3QgZmlyc3RfcGFnZSwgbGFzdF9wYWdlLCBwYWdlX2xlbjsKKwlsb2ZmX3QgZmlyc3RfcGFnZV9vZmZzZXQsIGxhc3RfcGFnZV9vZmZzZXQ7CiAJaW50IHJldCwgY3JlZGl0cywgYmxvY2tzX3JlbGVhc2VkLCBlcnIgPSAwOwogCisJLyogTm8gbmVlZCB0byBwdW5jaCBob2xlIGJleW9uZCBpX3NpemUgKi8KKwlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgaG9sZSBleHRlbmRzIGJleW9uZCBpX3NpemUsIHNldCB0aGUgaG9sZQorCSAqIHRvIGVuZCBhZnRlciB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIGlfc2l6ZQorCSAqLworCWlmIChvZmZzZXQgKyBsZW5ndGggPiBpbm9kZS0+aV9zaXplKSB7CisJCWxlbmd0aCA9IGlub2RlLT5pX3NpemUgKworCQkgICBQQUdFX0NBQ0hFX1NJWkUgLSAoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgLQorCQkgICBvZmZzZXQ7CisJfQorCiAJZmlyc3RfYmxvY2sgPSAob2Zmc2V0ICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KIAkJRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOwogCWxhc3RfYmxvY2sgPSAob2Zmc2V0ICsgbGVuZ3RoKSA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7CiAKLQlmaXJzdF9ibG9ja19vZmZzZXQgPSBmaXJzdF9ibG9jayA8PCBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JbGFzdF9ibG9ja19vZmZzZXQgPSBsYXN0X2Jsb2NrIDw8IEVYVDRfQkxPQ0tfU0laRV9CSVRTKHNiKTsKLQogCWZpcnN0X3BhZ2UgPSAob2Zmc2V0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlsYXN0X3BhZ2UgPSAob2Zmc2V0ICsgbGVuZ3RoKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCkBAIC00MTg1LDExICs0NzQ0LDEwIEBACiAJICovCiAJaWYgKG1hcHBpbmctPm5ycGFnZXMgJiYgbWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19ESVJUWSkpIHsKIAkJZXJyID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLAotCQkJZmlyc3RfcGFnZV9vZmZzZXQgPT0gMCA/IDAgOiBmaXJzdF9wYWdlX29mZnNldC0xLAotCQkJbGFzdF9wYWdlX29mZnNldCk7CisJCQlvZmZzZXQsIG9mZnNldCArIGxlbmd0aCAtIDEpOwogCi0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIE5vdyByZWxlYXNlIHRoZSBwYWdlcyAqLwpAQCAtNDIxMSwyNCArNDc2OSw2NCBAQAogCQlnb3RvIG91dDsKIAogCS8qCi0JICogTm93IHdlIG5lZWQgdG8gemVybyBvdXQgdGhlIHVuIGJsb2NrIGFsaWduZWQgZGF0YS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBzbWFsbGVyIHRoYW4gYSBibG9jaywganVzdAotCSAqIHplcm8gb3V0IHRoZSBtaWRkbGUKKwkgKiBOb3cgd2UgbmVlZCB0byB6ZXJvIG91dCB0aGUgbm9uLXBhZ2UtYWxpZ25lZCBkYXRhIGluIHRoZQorCSAqIHBhZ2VzIGF0IHRoZSBzdGFydCBhbmQgdGFpbCBvZiB0aGUgaG9sZSwgYW5kIHVubWFwIHRoZSBidWZmZXIKKwkgKiBoZWFkcyBmb3IgdGhlIGJsb2NrIGFsaWduZWQgcmVnaW9ucyBvZiB0aGUgcGFnZSB0aGF0IHdlcmUKKwkgKiBjb21wbGV0ZWx5IHplcm9lZC4KIAkgKi8KLQlpZiAoZmlyc3RfYmxvY2sgPiBsYXN0X2Jsb2NrKQotCQlleHQ0X2Jsb2NrX3plcm9fcGFnZV9yYW5nZShoYW5kbGUsIG1hcHBpbmcsIG9mZnNldCwgbGVuZ3RoKTsKLQllbHNlIHsKLQkJLyogemVybyBvdXQgdGhlIGhlYWQgb2YgdGhlIGhvbGUgYmVmb3JlIHRoZSBmaXJzdCBibG9jayAqLwotCQlibG9ja19sZW4gID0gZmlyc3RfYmxvY2tfb2Zmc2V0IC0gb2Zmc2V0OwotCQlpZiAoYmxvY2tfbGVuID4gMCkKLQkJCWV4dDRfYmxvY2tfemVyb19wYWdlX3JhbmdlKGhhbmRsZSwgbWFwcGluZywKLQkJCQkJCSAgIG9mZnNldCwgYmxvY2tfbGVuKTsKKwlpZiAoZmlyc3RfcGFnZSA+IGxhc3RfcGFnZSkgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBzcGFjZSBiZWluZyB0cnVuY2F0ZWQgaXMgY29udGFpbmVkIHdpdGhpbiBhIHBhZ2UKKwkJICoganVzdCB6ZXJvIG91dCBhbmQgdW5tYXAgdGhlIG1pZGRsZSBvZiB0aGF0IHBhZ2UKKwkJICovCisJCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGUsCisJCQltYXBwaW5nLCBvZmZzZXQsIGxlbmd0aCwgMCk7CiAKLQkJLyogemVybyBvdXQgdGhlIHRhaWwgb2YgdGhlIGhvbGUgYWZ0ZXIgdGhlIGxhc3QgYmxvY2sgKi8KLQkJYmxvY2tfbGVuID0gb2Zmc2V0ICsgbGVuZ3RoIC0gbGFzdF9ibG9ja19vZmZzZXQ7Ci0JCWlmIChibG9ja19sZW4gPiAwKSB7Ci0JCQlleHQ0X2Jsb2NrX3plcm9fcGFnZV9yYW5nZShoYW5kbGUsIG1hcHBpbmcsCi0JCQkJCWxhc3RfYmxvY2tfb2Zmc2V0LCBibG9ja19sZW4pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogemVybyBvdXQgYW5kIHVubWFwIHRoZSBwYXJ0aWFsIHBhZ2UgdGhhdCBjb250YWlucworCQkgKiB0aGUgc3RhcnQgb2YgdGhlIGhvbGUKKwkJICovCisJCXBhZ2VfbGVuICA9IGZpcnN0X3BhZ2Vfb2Zmc2V0IC0gb2Zmc2V0OworCQlpZiAocGFnZV9sZW4gPiAwKSB7CisJCQllcnIgPSBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlLCBtYXBwaW5nLAorCQkJCQkJICAgb2Zmc2V0LCBwYWdlX2xlbiwgMCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogemVybyBvdXQgYW5kIHVubWFwIHRoZSBwYXJ0aWFsIHBhZ2UgdGhhdCBjb250YWlucworCQkgKiB0aGUgZW5kIG9mIHRoZSBob2xlCisJCSAqLworCQlwYWdlX2xlbiA9IG9mZnNldCArIGxlbmd0aCAtIGxhc3RfcGFnZV9vZmZzZXQ7CisJCWlmIChwYWdlX2xlbiA+IDApIHsKKwkJCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVycyhoYW5kbGUsIG1hcHBpbmcsCisJCQkJCWxhc3RfcGFnZV9vZmZzZXQsIHBhZ2VfbGVuLCAwKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKworCS8qCisJICogSWYgaV9zaXplIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGFzdCBwYWdlLCB3ZSBuZWVkIHRvCisJICogdW5tYXAgYW5kIHplcm8gdGhlIHBhcnRpYWwgcGFnZSBhZnRlciBpX3NpemUKKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUID09IGxhc3RfcGFnZSAmJgorCSAgIGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCisJCXBhZ2VfbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0KKwkJCShpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKworCQlpZiAocGFnZV9sZW4gPiAwKSB7CisJCQllcnIgPSBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlLAorCQkJICBtYXBwaW5nLCBpbm9kZS0+aV9zaXplLCBwYWdlX2xlbiwgMCk7CisKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggZTQwOTVlOS4uY2I3MGYxOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTE4MSw4ICsxODEsOCBAQAogCQlwYXRoLmRlbnRyeSA9IG1udC0+bW50X3Jvb3Q7CiAJCWNwID0gZF9wYXRoKCZwYXRoLCBidWYsIHNpemVvZihidWYpKTsKIAkJaWYgKCFJU19FUlIoY3ApKSB7Ci0JCQltZW1jcHkoc2JpLT5zX2VzLT5zX2xhc3RfbW91bnRlZCwgY3AsCi0JCQkgICAgICAgc2l6ZW9mKHNiaS0+c19lcy0+c19sYXN0X21vdW50ZWQpKTsKKwkJCXN0cmxjcHkoc2JpLT5zX2VzLT5zX2xhc3RfbW91bnRlZCwgY3AsCisJCQkJc2l6ZW9mKHNiaS0+c19lcy0+c19sYXN0X21vdW50ZWQpKTsKIAkJCWV4dDRfbWFya19zdXBlcl9kaXJ0eShzYik7CiAJCX0KIAl9CkBAIC0yMjQsNTMgKzIyNCw4IEBACiAJCW1heGJ5dGVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzOwogCWVsc2UKIAkJbWF4Ynl0ZXMgPSBpbm9kZS0+aV9zYi0+c19tYXhieXRlczsKLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0Jc3dpdGNoIChvcmlnaW4pIHsKLQljYXNlIFNFRUtfRU5EOgotCQlvZmZzZXQgKz0gaW5vZGUtPmlfc2l6ZTsKLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0NVUjoKLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJCXJldHVybiBmaWxlLT5mX3BvczsKLQkJfQotCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7Ci0JCWJyZWFrOwotCWNhc2UgU0VFS19EQVRBOgotCQkvKgotCQkgKiBJbiB0aGUgZ2VuZXJpYyBjYXNlIHRoZSBlbnRpcmUgZmlsZSBpcyBkYXRhLCBzbyBhcyBsb25nIGFzCi0JCSAqIG9mZnNldCBpc24ndCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIG9mZnNldCBpcyBkYXRhLgotCQkgKi8KLQkJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0hPTEU6Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIGEgdmlydHVhbCBob2xlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHNvIGFzIGxvbmcgYXMKLQkJICogb2Zmc2V0IGlzbid0IGlfc2l6ZSBvciBsYXJnZXIsIHJldHVybiBpX3NpemUuCi0JCSAqLwotCQlpZiAob2Zmc2V0ID49IGlub2RlLT5pX3NpemUpIHsKLQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOwotCQlicmVhazsKLQl9CiAKLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBtYXhieXRlcykgewotCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgewotCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKLQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0KLQlyZXR1cm4gb2Zmc2V0OworCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sIG1heGJ5dGVzKTsKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZnN5bmMuYyBiL2ZzL2V4dDQvZnN5bmMuYwppbmRleCAwMzZmNzhmLi4wMGEyY2I3IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZzeW5jLmMKKysrIGIvZnMvZXh0NC9mc3luYy5jCkBAIC03NSw3ICs3NSw3IEBACiAgKiB0byB3cml0dGVuLgogICogVGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgSU9zIG9uIHN1Y2Nlc3MuCiAgKi8KLWV4dGVybiBpbnQgZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oc3RydWN0IGlub2RlICppbm9kZSkKK2ludCBleHQ0X2ZsdXNoX2NvbXBsZXRlZF9JTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWV4dDRfaW9fZW5kX3QgKmlvOwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKQEAgLTgzLDE0ICs4MywxMiBAQAogCWludCByZXQgPSAwOwogCWludCByZXQyID0gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZlaS0+aV9jb21wbGV0ZWRfaW9fbGlzdCkpCi0JCXJldHVybiByZXQ7Ci0KIAlkdW1wX2NvbXBsZXRlZF9JTyhpbm9kZSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZlaS0+aV9jb21wbGV0ZWRfaW9fbGlzdCkpewogCQlpbyA9IGxpc3RfZW50cnkoZWktPmlfY29tcGxldGVkX2lvX2xpc3QubmV4dCwKIAkJCQlleHQ0X2lvX2VuZF90LCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmaW8tPmxpc3QpOwogCQkvKgogCQkgKiBDYWxsaW5nIGV4dDRfZW5kX2lvX25vbG9jaygpIHRvIGNvbnZlcnQgY29tcGxldGVkCiAJCSAqIElPIHRvIHdyaXR0ZW4uCkBAIC0xMDcsMTEgKzEwNSw5IEBACiAJCSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCQlyZXQgPSBleHQ0X2VuZF9pb19ub2xvY2soaW8pOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXQyID0gcmV0OwotCQllbHNlCi0JCQlsaXN0X2RlbF9pbml0KCZpby0+bGlzdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOwogCXJldHVybiAocmV0MiA8IDApID8gcmV0MiA6IDA7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCA5YzYzZjI3Li4wMGJlYjRmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiBhbGxvY2F0aW9uLCBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCiAJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgewogCQlleHQ0X2Vycm9yKHNiLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKLQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOworCQlleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnNfc2V0KHNiLCBnZHAsIDApOwogCQlleHQ0X2ZyZWVfaW5vZGVzX3NldChzYiwgZ2RwLCAwKTsKIAkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLCAwKTsKIAkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7CkBAIC0yOTMsMTIxICsyOTMsOSBAQAogCWV4dDRfc3RkX2Vycm9yKHNiLCBmYXRhbCk7CiB9CiAKLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcwotICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAotICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCi0gKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAotICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCi0gKgotICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeVwncyBibG9jawotICogZ3JvdXAgdG8gZmluZCBhIGZyZWUgaW5vZGUuCi0gKi8KLXN0YXRpYyBpbnQgZmluZF9ncm91cF9kaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpwYXJlbnQsCi0JCQkJZXh0NF9ncm91cF90ICpiZXN0X2dyb3VwKQotewotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOwotCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MsICpiZXN0X2Rlc2MgPSBOVUxMOwotCWV4dDRfZ3JvdXBfdCBncm91cDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJkVYVDRfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7Ci0JYXZlZnJlZWkgPSBmcmVlaSAvIG5ncm91cHM7Ci0KLQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7Ci0JCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgTlVMTCk7Ci0JCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCi0JCQljb250aW51ZTsKLQkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpIDwgYXZlZnJlZWkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFiZXN0X2Rlc2MgfHwKLQkJICAgIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPgotCQkgICAgIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBiZXN0X2Rlc2MpKSkgewotCQkJKmJlc3RfZ3JvdXAgPSBncm91cDsKLQkJCWJlc3RfZGVzYyA9IGRlc2M7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgZnJlZV9ibG9ja19yYXRpbyAxMAotCi1zdGF0aWMgaW50IGZpbmRfZ3JvdXBfZmxleChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCwKLQkJCSAgIGV4dDRfZ3JvdXBfdCAqYmVzdF9ncm91cCkKLXsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOwotCXN0cnVjdCBmbGV4X2dyb3VwcyAqZmxleF9ncm91cCA9IHNiaS0+c19mbGV4X2dyb3VwczsKLQlleHQ0X2dyb3VwX3QgcGFyZW50X2dyb3VwID0gRVhUNF9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7Ci0JZXh0NF9ncm91cF90IHBhcmVudF9mYmdfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBwYXJlbnRfZ3JvdXApOwotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQlpbnQgZmxleF9zaXplID0gZXh0NF9mbGV4X2JnX3NpemUoc2JpKTsKLQlleHQ0X2dyb3VwX3QgYmVzdF9mbGV4ID0gcGFyZW50X2ZiZ19ncm91cDsKLQlpbnQgYmxvY2tzX3Blcl9mbGV4ID0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgKiBmbGV4X3NpemU7Ci0JaW50IGZsZXhiZ19mcmVlX2Jsb2NrczsKLQlpbnQgZmxleF9mcmVlYl9yYXRpbzsKLQlleHQ0X2dyb3VwX3Qgbl9mYmdfZ3JvdXBzOwotCWV4dDRfZ3JvdXBfdCBpOwotCi0Jbl9mYmdfZ3JvdXBzID0gKG5ncm91cHMgKyBmbGV4X3NpemUgLSAxKSA+PgotCQlzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleDsKLQotZmluZF9jbG9zZV90b19wYXJlbnQ6Ci0JZmxleGJnX2ZyZWVfYmxvY2tzID0gYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2Nrcyk7Ci0JZmxleF9mcmVlYl9yYXRpbyA9IGZsZXhiZ19mcmVlX2Jsb2NrcyAqIDEwMCAvIGJsb2Nrc19wZXJfZmxleDsKLQlpZiAoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2lub2RlcykgJiYKLQkgICAgZmxleF9mcmVlYl9yYXRpbyA+IGZyZWVfYmxvY2tfcmF0aW8pCi0JCWdvdG8gZm91bmRfZmxleGJnOwotCi0JaWYgKGJlc3RfZmxleCAmJiBiZXN0X2ZsZXggPT0gcGFyZW50X2ZiZ19ncm91cCkgewotCQliZXN0X2ZsZXgtLTsKLQkJZ290byBmaW5kX2Nsb3NlX3RvX3BhcmVudDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbl9mYmdfZ3JvdXBzOyBpKyspIHsKLQkJaWYgKGkgPT0gcGFyZW50X2ZiZ19ncm91cCB8fCBpID09IHBhcmVudF9mYmdfZ3JvdXAgLSAxKQotCQkJY29udGludWU7Ci0KLQkJZmxleGJnX2ZyZWVfYmxvY2tzID0gYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9ibG9ja3MpOwotCQlmbGV4X2ZyZWViX3JhdGlvID0gZmxleGJnX2ZyZWVfYmxvY2tzICogMTAwIC8gYmxvY2tzX3Blcl9mbGV4OwotCi0JCWlmIChmbGV4X2ZyZWViX3JhdGlvID4gZnJlZV9ibG9ja19yYXRpbyAmJgotCQkgICAgKGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ldLmZyZWVfaW5vZGVzKSkpIHsKLQkJCWJlc3RfZmxleCA9IGk7Ci0JCQlnb3RvIGZvdW5kX2ZsZXhiZzsKLQkJfQotCi0JCWlmICgoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2lub2RlcykgPT0gMCkgfHwKLQkJICAgICgoYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9ibG9ja3MpID4KLQkJICAgICAgYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2NrcykpICYmCi0JCSAgICAgYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbaV0uZnJlZV9pbm9kZXMpKSkKLQkJCWJlc3RfZmxleCA9IGk7Ci0JfQotCi0JaWYgKCFhdG9taWNfcmVhZCgmZmxleF9ncm91cFtiZXN0X2ZsZXhdLmZyZWVfaW5vZGVzKSB8fAotCSAgICAhYXRvbWljX3JlYWQoJmZsZXhfZ3JvdXBbYmVzdF9mbGV4XS5mcmVlX2Jsb2NrcykpCi0JCXJldHVybiAtMTsKLQotZm91bmRfZmxleGJnOgotCWZvciAoaSA9IGJlc3RfZmxleCAqIGZsZXhfc2l6ZTsgaSA8IG5ncm91cHMgJiYKLQkJICAgICBpIDwgKGJlc3RfZmxleCArIDEpICogZmxleF9zaXplOyBpKyspIHsKLQkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwotCQlpZiAoZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpIHsKLQkJCSpiZXN0X2dyb3VwID0gaTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwotb3V0OgotCXJldHVybiAwOwotfQotCiBzdHJ1Y3Qgb3Jsb3Zfc3RhdHMgewogCV9fdTMyIGZyZWVfaW5vZGVzOwotCV9fdTMyIGZyZWVfYmxvY2tzOworCV9fdTMyIGZyZWVfY2x1c3RlcnM7CiAJX191MzIgdXNlZF9kaXJzOwogfTsKIApAQCAtNDI0LDcgKzMxMiw3IEBACiAKIAlpZiAoZmxleF9zaXplID4gMSkgewogCQlzdGF0cy0+ZnJlZV9pbm9kZXMgPSBhdG9taWNfcmVhZCgmZmxleF9ncm91cFtnXS5mcmVlX2lub2Rlcyk7Ci0JCXN0YXRzLT5mcmVlX2Jsb2NrcyA9IGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ddLmZyZWVfYmxvY2tzKTsKKwkJc3RhdHMtPmZyZWVfY2x1c3RlcnMgPSBhdG9taWNfcmVhZCgmZmxleF9ncm91cFtnXS5mcmVlX2NsdXN0ZXJzKTsKIAkJc3RhdHMtPnVzZWRfZGlycyA9IGF0b21pY19yZWFkKCZmbGV4X2dyb3VwW2ddLnVzZWRfZGlycyk7CiAJCXJldHVybjsKIAl9CkBAIC00MzIsMTEgKzMyMCwxMSBAQAogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBnLCBOVUxMKTsKIAlpZiAoZGVzYykgewogCQlzdGF0cy0+ZnJlZV9pbm9kZXMgPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKTsKLQkJc3RhdHMtPmZyZWVfYmxvY2tzID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpOworCQlzdGF0cy0+ZnJlZV9jbHVzdGVycyA9IGV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CiAJCXN0YXRzLT51c2VkX2RpcnMgPSBleHQ0X3VzZWRfZGlyc19jb3VudChzYiwgZGVzYyk7CiAJfSBlbHNlIHsKIAkJc3RhdHMtPmZyZWVfaW5vZGVzID0gMDsKLQkJc3RhdHMtPmZyZWVfYmxvY2tzID0gMDsKKwkJc3RhdHMtPmZyZWVfY2x1c3RlcnMgPSAwOwogCQlzdGF0cy0+dXNlZF9kaXJzID0gMDsKIAl9CiB9CkBAIC00NzEsMTAgKzM1OSwxMCBAQAogCWV4dDRfZ3JvdXBfdCByZWFsX25ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWludCBpbm9kZXNfcGVyX2dyb3VwID0gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKIAl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOwotCWV4dDRfZnNibGtfdCBmcmVlYiwgYXZlZnJlZWI7CisJZXh0NF9mc2Jsa190IGZyZWViLCBhdmVmcmVlYzsKIAl1bnNpZ25lZCBpbnQgbmRpcnM7CiAJaW50IG1heF9kaXJzLCBtaW5faW5vZGVzOwotCWV4dDRfZ3JwYmxrX3QgbWluX2Jsb2NrczsKKwlleHQ0X2dycGJsa190IG1pbl9jbHVzdGVyczsKIAlleHQ0X2dyb3VwX3QgaSwgZ3JwLCBnLCBuZ3JvdXBzOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IG9ybG92X3N0YXRzIHN0YXRzOwpAQCAtNDkwLDkgKzM3OCwxMCBAQAogCiAJZnJlZWkgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKLQlmcmVlYiA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotCWF2ZWZyZWViID0gZnJlZWI7Ci0JZG9fZGl2KGF2ZWZyZWViLCBuZ3JvdXBzKTsKKwlmcmVlYiA9IEVYVDRfQzJCKHNiaSwKKwkJcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKSk7CisJYXZlZnJlZWMgPSBmcmVlYjsKKwlkb19kaXYoYXZlZnJlZWMsIG5ncm91cHMpOwogCW5kaXJzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2RpcnNfY291bnRlcik7CiAKIAlpZiAoU19JU0RJUihtb2RlKSAmJgpAQCAtNTE4LDcgKzQwNyw3IEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoc3RhdHMuZnJlZV9pbm9kZXMgPCBhdmVmcmVlaSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChzdGF0cy5mcmVlX2Jsb2NrcyA8IGF2ZWZyZWViKQorCQkJaWYgKHN0YXRzLmZyZWVfY2x1c3RlcnMgPCBhdmVmcmVlYykKIAkJCQljb250aW51ZTsKIAkJCWdycCA9IGc7CiAJCQlyZXQgPSAwOwpAQCAtNTU2LDcgKzQ0NSw3IEBACiAJbWluX2lub2RlcyA9IGF2ZWZyZWVpIC0gaW5vZGVzX3Blcl9ncm91cCpmbGV4X3NpemUgLyA0OwogCWlmIChtaW5faW5vZGVzIDwgMSkKIAkJbWluX2lub2RlcyA9IDE7Ci0JbWluX2Jsb2NrcyA9IGF2ZWZyZWViIC0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSpmbGV4X3NpemUgLyA0OworCW1pbl9jbHVzdGVycyA9IGF2ZWZyZWVjIC0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKmZsZXhfc2l6ZSAvIDQ7CiAKIAkvKgogCSAqIFN0YXJ0IGxvb2tpbmcgaW4gdGhlIGZsZXggZ3JvdXAgd2hlcmUgd2UgbGFzdCBhbGxvY2F0ZWQgYW4KQEAgLTU3NSw3ICs0NjQsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChzdGF0cy5mcmVlX2lub2RlcyA8IG1pbl9pbm9kZXMpCiAJCQljb250aW51ZTsKLQkJaWYgKHN0YXRzLmZyZWVfYmxvY2tzIDwgbWluX2Jsb2NrcykKKwkJaWYgKHN0YXRzLmZyZWVfY2x1c3RlcnMgPCBtaW5fY2x1c3RlcnMpCiAJCQljb250aW51ZTsKIAkJZ290byBmb3VuZF9mbGV4X2JnOwogCX0KQEAgLTY1OSw3ICs1NDgsNyBAQAogCSpncm91cCA9IHBhcmVudF9ncm91cDsKIAlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKIAlpZiAoZGVzYyAmJiBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSAmJgotCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpKQorCSAgICBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGRlc2MpKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC02ODMsNyArNTcyLDcgQEAKIAkJCSpncm91cCAtPSBuZ3JvdXBzOwogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKIAkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKLQkJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCisJCSAgICBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGRlc2MpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC04MDIsNyArNjkxLDcgQEAKICAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgogICovCiBzdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsIF9fdTMyIGdvYWwpCisJCQkgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLCBfX3UzMiBnb2FsLCB1aWRfdCAqb3duZXIpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2JpdG1hcF9iaCA9IE5VTEw7CkBAIC04MTYsOCArNzA1LDYgQEAKIAlpbnQgcmV0MiwgZXJyID0gMDsKIAlzdHJ1Y3QgaW5vZGUgKnJldDsKIAlleHQ0X2dyb3VwX3QgaTsKLQlpbnQgZnJlZSA9IDA7Ci0Jc3RhdGljIGludCBvbmNlID0gMTsKIAlleHQ0X2dyb3VwX3QgZmxleF9ncm91cDsKIAogCS8qIENhbm5vdCBjcmVhdGUgZmlsZXMgaW4gYSBkZWxldGVkIGRpcmVjdG9yeSAqLwpAQCAtODQzLDI2ICs3MzAsOSBAQAogCQlnb3RvIGdvdF9ncm91cDsKIAl9CiAKLQlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggJiYgdGVzdF9vcHQoc2IsIE9MREFMTE9DKSkgewotCQlyZXQyID0gZmluZF9ncm91cF9mbGV4KHNiLCBkaXIsICZncm91cCk7Ci0JCWlmIChyZXQyID09IC0xKSB7Ci0JCQlyZXQyID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyLCAmZ3JvdXAsIG1vZGUpOwotCQkJaWYgKHJldDIgPT0gMCAmJiBvbmNlKSB7Ci0JCQkJb25jZSA9IDA7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFICJleHQ0OiBmaW5kX2dyb3VwX2ZsZXggIgotCQkJCSAgICAgICAiZmFpbGVkLCBmYWxsYmFjayBzdWNjZWVkZWQgZGlyICVsdVxuIiwKLQkJCQkgICAgICAgZGlyLT5pX2lubyk7Ci0JCQl9Ci0JCX0KLQkJZ290byBnb3RfZ3JvdXA7Ci0JfQotCi0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJaWYgKHRlc3Rfb3B0KHNiLCBPTERBTExPQykpCi0JCQlyZXQyID0gZmluZF9ncm91cF9kaXIoc2IsIGRpciwgJmdyb3VwKTsKLQkJZWxzZQotCQkJcmV0MiA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpciwgJmdyb3VwLCBtb2RlLCBxc3RyKTsKLQl9IGVsc2UKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0MiA9IGZpbmRfZ3JvdXBfb3Jsb3Yoc2IsIGRpciwgJmdyb3VwLCBtb2RlLCBxc3RyKTsKKwllbHNlCiAJCXJldDIgPSBmaW5kX2dyb3VwX290aGVyKHNiLCBkaXIsICZncm91cCwgbW9kZSk7CiAKIGdvdF9ncm91cDoKQEAgLTk1MCwyNiArODIwLDIxIEBACiAJCQlnb3RvIGZhaWw7CiAJCX0KIAotCQlmcmVlID0gMDsKLQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CisJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBibG9ja19iaXRtYXBfYmgpOworCQlicmVsc2UoYmxvY2tfYml0bWFwX2JoKTsKKwogCQkvKiByZWNoZWNrIGFuZCBjbGVhciBmbGFnIHVuZGVyIGxvY2sgaWYgd2Ugc3RpbGwgbmVlZCB0byAqLworCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKLQkJCWZyZWUgPSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBnZHApOwogCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwotCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGZyZWUpOworCQkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLAorCQkJCWV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLCBncm91cCwgZ2RwKSk7CiAJCQlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBncm91cCwKIAkJCQkJCQkJZ2RwKTsKIAkJfQogCQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCi0JCS8qIERvbid0IG5lZWQgdG8gZGlydHkgYml0bWFwIGJsb2NrIGlmIHdlIGRpZG4ndCBjaGFuZ2UgaXQgKi8KLQkJaWYgKGZyZWUpIHsKLQkJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKLQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQlOVUxMLCBibG9ja19iaXRtYXBfYmgpOwotCQl9Ci0KLQkJYnJlbHNlKGJsb2NrX2JpdG1hcF9iaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWw7CiAJfQpAQCAtOTg3LDggKzg1MiwxMSBAQAogCQlmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgZ3JvdXApOwogCQlhdG9taWNfZGVjKCZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9pbm9kZXMpOwogCX0KLQotCWlmICh0ZXN0X29wdChzYiwgR1JQSUQpKSB7CisJaWYgKG93bmVyKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSBvd25lclswXTsKKwkJaW5vZGUtPmlfZ2lkID0gb3duZXJbMV07CisJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgR1JQSUQpKSB7CiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CkBAIC0xMDA1LDExICs4NzMsNyBAQAogCWVpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOwogCWVpLT5pX2Rpc2tzaXplID0gMDsKIAotCS8qCi0JICogRG9uJ3QgaW5oZXJpdCBleHRlbnQgZmxhZyBmcm9tIGRpcmVjdG9yeSwgYW1vbmdzdCBvdGhlcnMuIFdlIHNldAotCSAqIGV4dGVudCBmbGFnIG9uIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5IGFuZCBmaWxlIG9ubHkgaWYgLW8gZXh0ZW50Ci0JICogbW91bnQgb3B0aW9uIGlzIHNwZWNpZmllZAotCSAqLworCS8qIERvbid0IGluaGVyaXQgZXh0ZW50IGZsYWcgZnJvbSBkaXJlY3RvcnksIGFtb25nc3Qgb3RoZXJzLiAqLwogCWVpLT5pX2ZsYWdzID0KIAkJZXh0NF9tYXNrX2ZsYWdzKG1vZGUsIEVYVDRfSShkaXIpLT5pX2ZsYWdzICYgRVhUNF9GTF9JTkhFUklURUQpOwogCWVpLT5pX2ZpbGVfYWNsID0gMDsKQEAgLTEwODQsNyArOTQ4LDcgQEAKIGZhaWxfZHJvcDoKIAlkcXVvdF9kcm9wKGlub2RlKTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKQEAgLTEyMzUsNyArMTA5OSw3IEBACiAgKiBpbm9kZSBhbGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgZ3JvdXAsIHNvIHdlIHRha2UgYWxsb2Nfc2VtIGxvY2ssIHRvCiAgKiBibG9jayBleHQ0X2NsYWltX2lub2RlIHVudGlsIHdlIGFyZSBmaW5pc2hlZC4KICAqLwotZXh0ZXJuIGludCBleHQ0X2luaXRfaW5vZGVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAoraW50IGV4dDRfaW5pdF9pbm9kZV90YWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXAsCiAJCQkJIGludCBiYXJyaWVyKQogewogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5kaXJlY3QuYyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwppbmRleCAwOTYyNjQyLi4zY2ZjNzNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2luZGlyZWN0LmMKKysrIGIvZnMvZXh0NC9pbmRpcmVjdC5jCkBAIC02OTksNiArNjk5LDEzIEBACiAJLyoKIAkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCiAJKi8KKwlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MpKSB7CisJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJDYW4ndCBhbGxvY2F0ZSBibG9ja3MgZm9yICIKKwkJCQkgIm5vbi1leHRlbnQgbWFwcGVkIGlub2RlcyB3aXRoIGJpZ2FsbG9jIik7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwogCWdvYWwgPSBleHQ0X2ZpbmRfZ29hbChpbm9kZSwgbWFwLT5tX2xibGssIHBhcnRpYWwpOwogCiAJLyogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgW2QsdF1pbmRpcmVjdCBibG9ja3MgKi8KQEAgLTEzNDMsNyArMTM1MCw5IEBACiAJX19sZTMyIG5yID0gMDsKIAlpbnQgbiA9IDA7CiAJZXh0NF9sYmxrX3QgbGFzdF9ibG9jaywgbWF4X2Jsb2NrOworCWxvZmZfdCBwYWdlX2xlbjsKIAl1bnNpZ25lZCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaW50IGVycjsKIAogCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCkBAIC0xMzU0LDkgKzEzNjMsMTYgQEAKIAltYXhfYmxvY2sgPSAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzICsgYmxvY2tzaXplLTEpCiAJCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKIAotCWlmIChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKQotCQlpZiAoZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSkpCisJaWYgKGlub2RlLT5pX3NpemUgJSBQQUdFX0NBQ0hFX1NJWkUgIT0gMCkgeworCQlwYWdlX2xlbiA9IFBBR0VfQ0FDSEVfU0laRSAtCisJCQkoaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwkJZXJyID0gZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKGhhbmRsZSwKKwkJCW1hcHBpbmcsIGlub2RlLT5pX3NpemUsIHBhZ2VfbGVuLCAwKTsKKworCQlpZiAoZXJyKQogCQkJZ290byBvdXRfc3RvcDsKKwl9CiAKIAlpZiAobGFzdF9ibG9jayAhPSBtYXhfYmxvY2spIHsKIAkJbiA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggOTg2ZTIzOC4uMjQwZjZlMiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCi0jaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCiAjaW5jbHVkZSAidHJ1bmNhdGUuaCIKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9leHQ0Lmg+CkBAIC0yNjgsNyArMjY3LDcgQEAKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAKIAlzcGluX2xvY2soJmVpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwotCXRyYWNlX2V4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHVzZWQpOworCXRyYWNlX2V4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHVzZWQsIHF1b3RhX2NsYWltKTsKIAlpZiAodW5saWtlbHkodXNlZCA+IGVpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKSkgewogCQlleHQ0X21zZyhpbm9kZS0+aV9zYiwgS0VSTl9OT1RJQ0UsICIlczogaW5vICVsdSwgdXNlZCAlZCAiCiAJCQkgIndpdGggb25seSAlZCByZXNlcnZlZCBkYXRhIGJsb2Nrc1xuIiwKQEAgLTI4MSw3ICsyODAsNyBAQAogCS8qIFVwZGF0ZSBwZXItaW5vZGUgcmVzZXJ2YXRpb25zICovCiAJZWktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MgLT0gdXNlZDsKIAllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyAtPSBlaS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7Ci0JcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsCiAJCQkgICB1c2VkICsgZWktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzKTsKIAllaS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgPSAwOwogCkBAIC0yOTEsNyArMjkwLDcgQEAKIAkJICogb25seSB3aGVuIHdlIGhhdmUgd3JpdHRlbiBhbGwgb2YgdGhlIGRlbGF5ZWQKIAkJICogYWxsb2NhdGlvbiBibG9ja3MuCiAJCSAqLwotCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAorCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsCiAJCQkJICAgZWktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOwogCQllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9IDA7CiAJCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuID0gMDsKQEAgLTMwMCwxNCArMjk5LDE0IEBACiAKIAkvKiBVcGRhdGUgcXVvdGEgc3Vic3lzdGVtIGZvciBkYXRhIGJsb2NrcyAqLwogCWlmIChxdW90YV9jbGFpbSkKLQkJZHF1b3RfY2xhaW1fYmxvY2soaW5vZGUsIHVzZWQpOworCQlkcXVvdF9jbGFpbV9ibG9jayhpbm9kZSwgRVhUNF9DMkIoc2JpLCB1c2VkKSk7CiAJZWxzZSB7CiAJCS8qCiAJCSAqIFdlIGRpZCBmYWxsb2NhdGUgd2l0aCBhbiBvZmZzZXQgdGhhdCBpcyBhbHJlYWR5IGRlbGF5ZWQKIAkJICogYWxsb2NhdGVkLiBTbyBvbiBkZWxheWVkIGFsbG9jYXRlZCB3cml0ZWJhY2sgd2Ugc2hvdWxkCiAJCSAqIG5vdCByZS1jbGFpbSB0aGUgcXVvdGEgZm9yIGZhbGxvY2F0ZWQgYmxvY2tzLgogCQkgKi8KLQkJZHF1b3RfcmVsZWFzZV9yZXNlcnZhdGlvbl9ibG9jayhpbm9kZSwgdXNlZCk7CisJCWRxdW90X3JlbGVhc2VfcmVzZXJ2YXRpb25fYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgdXNlZCkpOwogCX0KIAogCS8qCkBAIC0zOTksNiArMzk4LDQ5IEBACiB9CiAKIC8qCisgKiBTZXRzIHRoZSBCSF9EYV9NYXBwZWQgYml0IG9uIHRoZSBidWZmZXIgaGVhZHMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWFwLgorICovCitzdGF0aWMgdm9pZCBzZXRfYnVmZmVyc19kYV9tYXBwZWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJaW50IGksIG5yX3BhZ2VzOworCXBnb2ZmX3QgaW5kZXgsIGVuZDsKKworCWluZGV4ID0gbWFwLT5tX2xibGsgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwllbmQgPSAobWFwLT5tX2xibGsgKyBtYXAtPm1fbGVuIC0gMSkgPj4KKwkJKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJd2hpbGUgKGluZGV4IDw9IGVuZCkgeworCQlucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBpbmRleCwKKwkJCQkJICBtaW4oZW5kIC0gaW5kZXggKyAxLAorCQkJCQkgICAgICAocGdvZmZfdClQQUdFVkVDX1NJWkUpKTsKKwkJaWYgKG5yX3BhZ2VzID09IDApCisJCQlicmVhazsKKwkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCisJCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB8fAorCQkJICAgICFQYWdlRGlydHkocGFnZSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJCWRvIHsKKwkJCQkJc2V0X2J1ZmZlcl9kYV9tYXBwZWQoYmgpOworCQkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkJCX0KKwkJCWluZGV4Kys7CisJCX0KKwkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwl9Cit9CisKKy8qCiAgKiBUaGUgZXh0NF9tYXBfYmxvY2tzKCkgZnVuY3Rpb24gdHJpZXMgdG8gbG9vayB1cCB0aGUgcmVxdWVzdGVkIGJsb2NrcywKICAqIGFuZCByZXR1cm5zIGlmIHRoZSBibG9ja3MgYXJlIGFscmVhZHkgbWFwcGVkLgogICoKQEAgLTQxNiw3ICs0NTgsNyBAQAogICogdGhlIGJ1ZmZlciBoZWFkIGlzIG1hcHBlZC4KICAqCiAgKiBJdCByZXR1cm5zIDAgaWYgcGxhaW4gbG9vayB1cCBmYWlsZWQgKGJsb2NrcyBoYXZlIG5vdCBiZWVuIGFsbG9jYXRlZCksIGluCi0gKiB0aGF0IGNhc2VtLCBidWZmZXIgaGVhZCBpcyB1bm1hcHBlZAorICogdGhhdCBjYXNlLCBidWZmZXIgaGVhZCBpcyB1bm1hcHBlZAogICoKICAqIEl0IHJldHVybnMgdGhlIGVycm9yIGluIGNhc2Ugb2YgYWxsb2NhdGlvbiBmYWlsdXJlLgogICovCkBAIC00MzUsOSArNDc3LDExIEBACiAJICovCiAJZG93bl9yZWFkKCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkpOwogCWlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkgewotCQlyZXR2YWwgPSBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG1hcCwgMCk7CisJCXJldHZhbCA9IGV4dDRfZXh0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgbWFwLCBmbGFncyAmCisJCQkJCSAgICAgRVhUNF9HRVRfQkxPQ0tTX0tFRVBfU0laRSk7CiAJfSBlbHNlIHsKLQkJcmV0dmFsID0gZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBtYXAsIDApOworCQlyZXR2YWwgPSBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIG1hcCwgZmxhZ3MgJgorCQkJCQkgICAgIEVYVDRfR0VUX0JMT0NLU19LRUVQX1NJWkUpOwogCX0KIAl1cF9yZWFkKCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkpOwogCkBAIC00NTUsNyArNDk5LDcgQEAKIAkgKiBSZXR1cm5zIGlmIHRoZSBibG9ja3MgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZAogCSAqCiAJICogTm90ZSB0aGF0IGlmIGJsb2NrcyBoYXZlIGJlZW4gcHJlYWxsb2NhdGVkCi0JICogZXh0NF9leHRfZ2V0X2Jsb2NrKCkgcmV0dXJucyB0aCBjcmVhdGUgPSAwCisJICogZXh0NF9leHRfZ2V0X2Jsb2NrKCkgcmV0dXJucyB0aGUgY3JlYXRlID0gMAogCSAqIHdpdGggYnVmZmVyIGhlYWQgdW5tYXBwZWQuCiAJICovCiAJaWYgKHJldHZhbCA+IDAgJiYgbWFwLT5tX2ZsYWdzICYgRVhUNF9NQVBfTUFQUEVEKQpAQCAtNTE3LDkgKzU2MSwxNyBAQAogCQkJKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpKQogCQkJZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZShpbm9kZSwgcmV0dmFsLCAxKTsKIAl9Ci0JaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpCisJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpIHsKIAkJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCk7CiAKKwkJLyogSWYgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgbWFwcGVkIHRoZSBkZWxheWVkIGFsbG9jYXRlZCBibG9ja3MsCisJCSAqIHNldCB0aGUgQkhfRGFfTWFwcGVkIGJpdCBvbiB0aGVtLiBJdHMgaW1wb3J0YW50IHRvIGRvIHRoaXMKKwkJICogdW5kZXIgdGhlIHByb3RlY3Rpb24gb2YgaV9kYXRhX3NlbS4KKwkJICovCisJCWlmIChyZXR2YWwgPiAwICYmIG1hcC0+bV9mbGFncyAmIEVYVDRfTUFQX01BUFBFRCkKKwkJCXNldF9idWZmZXJzX2RhX21hcHBlZChpbm9kZSwgbWFwKTsKKwl9CisKIAl1cF93cml0ZSgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKIAlpZiAocmV0dmFsID4gMCAmJiBtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9NQVBQRUQpIHsKIAkJaW50IHJldCA9IGNoZWNrX2Jsb2NrX3ZhbGlkaXR5KGlub2RlLCBtYXApOwpAQCAtOTA5LDcgKzk2MSwxMSBAQAogCQkJZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOwogCQlpZiAocmV0MiA8IDApCiAJCQlyZXQgPSByZXQyOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQorCiAJcmV0MiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHJldDI7CkBAIC0xMDM3LDE0ICsxMDkzLDE0IEBACiB9CiAKIC8qCi0gKiBSZXNlcnZlIGEgc2luZ2xlIGJsb2NrIGxvY2F0ZWQgYXQgbGJsb2NrCisgKiBSZXNlcnZlIGEgc2luZ2xlIGNsdXN0ZXIgbG9jYXRlZCBhdCBsYmxvY2sKICAqLwogc3RhdGljIGludCBleHQ0X2RhX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsb2NrKQogewogCWludCByZXRyaWVzID0gMDsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JdW5zaWduZWQgbG9uZyBtZF9uZWVkZWQ7CisJdW5zaWduZWQgaW50IG1kX25lZWRlZDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTEwNTQsNyArMTExMCw4IEBACiAJICovCiByZXBlYXQ6CiAJc3Bpbl9sb2NrKCZlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQltZF9uZWVkZWQgPSBleHQ0X2NhbGNfbWV0YWRhdGFfYW1vdW50KGlub2RlLCBsYmxvY2spOworCW1kX25lZWRlZCA9IEVYVDRfTlVNX0IyQyhzYmksCisJCQkJIGV4dDRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jaykpOwogCXRyYWNlX2V4dDRfZGFfcmVzZXJ2ZV9zcGFjZShpbm9kZSwgbWRfbmVlZGVkKTsKIAlzcGluX3VubG9jaygmZWktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAKQEAgLTEwNjMsMTUgKzExMjAsMTUgQEAKIAkgKiB1cyBmcm9tIG1ldGFkYXRhIG92ZXItZXN0aW1hdGlvbiwgdGhvdWdoIHdlIG1heSBnbyBvdmVyIGJ5CiAJICogYSBzbWFsbCBhbW91bnQgaW4gdGhlIGVuZC4gIEhlcmUgd2UganVzdCByZXNlcnZlIGZvciBkYXRhLgogCSAqLwotCXJldCA9IGRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsIDEpOworCXJldCA9IGRxdW90X3Jlc2VydmVfYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgMSkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyoKIAkgKiBXZSBkbyBzdGlsbCBjaGFyZ2UgZXN0aW1hdGVkIG1ldGFkYXRhIHRvIHRoZSBzYiB0aG91Z2g7CiAJICogd2UgY2Fubm90IGFmZm9yZCB0byBydW4gb3V0IG9mIGZyZWUgYmxvY2tzLgogCSAqLwotCWlmIChleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHNiaSwgbWRfbmVlZGVkICsgMSwgMCkpIHsKLQkJZHF1b3RfcmVsZWFzZV9yZXNlcnZhdGlvbl9ibG9jayhpbm9kZSwgMSk7CisJaWYgKGV4dDRfY2xhaW1fZnJlZV9jbHVzdGVycyhzYmksIG1kX25lZWRlZCArIDEsIDApKSB7CisJCWRxdW90X3JlbGVhc2VfcmVzZXJ2YXRpb25fYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgMSkpOwogCQlpZiAoZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkgewogCQkJeWllbGQoKTsKIAkJCWdvdG8gcmVwZWF0OwpAQCAtMTExOCwxOSArMTE3NSwyMSBAQAogCQkgKiBXZSBjYW4gcmVsZWFzZSBhbGwgb2YgdGhlIHJlc2VydmVkIG1ldGFkYXRhIGJsb2NrcwogCQkgKiBvbmx5IHdoZW4gd2UgaGF2ZSB3cml0dGVuIGFsbCBvZiB0aGUgZGVsYXllZAogCQkgKiBhbGxvY2F0aW9uIGJsb2Nrcy4KKwkJICogTm90ZSB0aGF0IGluIGNhc2Ugb2YgYmlnYWxsb2MsIGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MsCisJCSAqIGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MsIGV0Yy4gcmVmZXIgdG8gbnVtYmVyIG9mIGNsdXN0ZXJzLgogCQkgKi8KLQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAogCQkJCSAgIGVpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzKTsKIAkJZWktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSAwOwogCQllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbiA9IDA7CiAJfQogCiAJLyogdXBkYXRlIGZzIGRpcnR5IGRhdGEgYmxvY2tzIGNvdW50ZXIgKi8KLQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCB0b19mcmVlKTsKKwlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIHRvX2ZyZWUpOwogCiAJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAKLQlkcXVvdF9yZWxlYXNlX3Jlc2VydmF0aW9uX2Jsb2NrKGlub2RlLCB0b19mcmVlKTsKKwlkcXVvdF9yZWxlYXNlX3Jlc2VydmF0aW9uX2Jsb2NrKGlub2RlLCBFWFQ0X0MyQihzYmksIHRvX2ZyZWUpKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9kYV9wYWdlX3JlbGVhc2VfcmVzZXJ2YXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC0xMTM5LDYgKzExOTgsOSBAQAogCWludCB0b19yZWxlYXNlID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaDsKIAl1bnNpZ25lZCBpbnQgY3Vycl9vZmYgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOworCWludCBudW1fY2x1c3RlcnM7CiAKIAloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCWJoID0gaGVhZDsKQEAgLTExNDgsMTAgKzEyMTAsMjQgQEAKIAkJaWYgKChvZmZzZXQgPD0gY3Vycl9vZmYpICYmIChidWZmZXJfZGVsYXkoYmgpKSkgewogCQkJdG9fcmVsZWFzZSsrOwogCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl9kYV9tYXBwZWQoYmgpOwogCQl9CiAJCWN1cnJfb2ZmID0gbmV4dF9vZmY7CiAJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQlleHQ0X2RhX3JlbGVhc2Vfc3BhY2UocGFnZS0+bWFwcGluZy0+aG9zdCwgdG9fcmVsZWFzZSk7CisKKwkvKiBJZiB3ZSBoYXZlIHJlbGVhc2VkIGFsbCB0aGUgYmxvY2tzIGJlbG9uZ2luZyB0byBhIGNsdXN0ZXIsIHRoZW4gd2UKKwkgKiBuZWVkIHRvIHJlbGVhc2UgdGhlIHJlc2VydmVkIHNwYWNlIGZvciB0aGF0IGNsdXN0ZXIuICovCisJbnVtX2NsdXN0ZXJzID0gRVhUNF9OVU1fQjJDKHNiaSwgdG9fcmVsZWFzZSk7CisJd2hpbGUgKG51bV9jbHVzdGVycyA+IDApIHsKKwkJZXh0NF9mc2Jsa190IGxibGs7CisJCWxibGsgPSAocGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSkgKworCQkJKChudW1fY2x1c3RlcnMgLSAxKSA8PCBzYmktPnNfY2x1c3Rlcl9iaXRzKTsKKwkJaWYgKHNiaS0+c19jbHVzdGVyX3JhdGlvID09IDEgfHwKKwkJICAgICFleHQ0X2ZpbmRfZGVsYWxsb2NfY2x1c3Rlcihpbm9kZSwgbGJsaywgMSkpCisJCQlleHQ0X2RhX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIDEpOworCisJCW51bV9jbHVzdGVycy0tOworCX0KIH0KIAogLyoKQEAgLTEyNTMsNiArMTMyOSw4IEBACiAJCQkJCQljbGVhcl9idWZmZXJfZGVsYXkoYmgpOwogCQkJCQkJYmgtPmJfYmxvY2tuciA9IHBibG9jazsKIAkJCQkJfQorCQkJCQlpZiAoYnVmZmVyX2RhX21hcHBlZChiaCkpCisJCQkJCQljbGVhcl9idWZmZXJfZGFfbWFwcGVkKGJoKTsKIAkJCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8CiAJCQkJCSAgICBidWZmZXJfbWFwcGVkKGJoKSkKIAkJCQkJCUJVR19PTihiaC0+Yl9ibG9ja25yICE9IHBibG9jayk7CkBAIC0xMzQ2LDEyICsxNDI0LDE1IEBACiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiVG90YWwgZnJlZSBibG9ja3MgY291bnQgJWxsZFxuIiwKLQkgICAgICAgZXh0NF9jb3VudF9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYikpOworCSAgICAgICBFWFQ0X0MyQihFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCWV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhpbm9kZS0+aV9zYikpKTsKIAlwcmludGsoS0VSTl9DUklUICJGcmVlL0RpcnR5IGJsb2NrIGRldGFpbHNcbiIpOwogCXByaW50ayhLRVJOX0NSSVQgImZyZWVfYmxvY2tzPSVsbGRcbiIsCi0JICAgICAgIChsb25nIGxvbmcpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikpOworCSAgICAgICAobG9uZyBsb25nKSBFWFQ0X0MyQihFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIpKSk7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiZGlydHlfYmxvY2tzPSVsbGRcbiIsCi0JICAgICAgIChsb25nIGxvbmcpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKKwkgICAgICAgKGxvbmcgbG9uZykgRVhUNF9DMkIoRVhUNF9TQihpbm9kZS0+aV9zYiksCisJCXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcikpKTsKIAlwcmludGsoS0VSTl9DUklUICJCbG9jayByZXNlcnZhdGlvbiBkZXRhaWxzXG4iKTsKIAlwcmludGsoS0VSTl9DUklUICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSV1XG4iLAogCSAgICAgICBFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzKTsKQEAgLTE0MzAsOCArMTUxMSw3IEBACiAJCWlmIChlcnIgPT0gLUVBR0FJTikKIAkJCWdvdG8gc3VibWl0X2lvOwogCi0JCWlmIChlcnIgPT0gLUVOT1NQQyAmJgotCQkgICAgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzYikpIHsKKwkJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzYikpIHsKIAkJCW1wZC0+cmV0dmFsID0gZXJyOwogCQkJZ290byBzdWJtaXRfaW87CiAJCX0KQEAgLTE0NzEsMTMgKzE1NTEsMTUgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbWFwLm1fbGVuOyBpKyspCiAJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJkZXYsIG1hcC5tX3BibGsgKyBpKTsKLQl9CiAKLQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShtcGQtPmlub2RlKSkgewotCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIG1wZC0+aW5vZGUpOwotCQlpZiAoZXJyKQotCQkJLyogVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCAqLwotCQkJcmV0dXJuOworCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShtcGQtPmlub2RlKSkgeworCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBtcGQtPmlub2RlKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKiBPbmx5IGlmIHRoZSBqb3VybmFsIGlzIGFib3J0ZWQgKi8KKwkJCQltcGQtPnJldHZhbCA9IGVycjsKKwkJCQlnb3RvIHN1Ym1pdF9pbzsKKwkJCX0KKwkJfQogCX0KIAogCS8qCkBAIC0xNTg0LDYgKzE2NjYsNjYgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ3JhYnMgY29kZSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZgorICogZXh0NF9tYXBfYmxvY2tzLCBidXQgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIgaXMgZnJvbSBkZWxheWVkIHdyaXRlCisgKiB0aW1lLiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSByZXF1ZXN0ZWQgYmxvY2tzIGFuZCBzZXRzIHRoZQorICogYnVmZmVyIGRlbGF5IGJpdCB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBpX2RhdGFfc2VtLgorICovCitzdGF0aWMgaW50IGV4dDRfZGFfbWFwX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByZXR2YWw7CisJc2VjdG9yX3QgaW52YWxpZF9ibG9jayA9IH4oKHNlY3Rvcl90KSAweGZmZmYpOworCisJaWYgKGludmFsaWRfYmxvY2sgPCBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykpCisJCWludmFsaWRfYmxvY2sgPSB+MDsKKworCW1hcC0+bV9mbGFncyA9IDA7CisJZXh0X2RlYnVnKCJleHQ0X2RhX21hcF9ibG9ja3MoKTogaW5vZGUgJWx1LCBtYXhfYmxvY2tzICV1LCIKKwkJICAibG9naWNhbCBibG9jayAlbHVcbiIsIGlub2RlLT5pX2lubywgbWFwLT5tX2xlbiwKKwkJICAodW5zaWduZWQgbG9uZykgbWFwLT5tX2xibGspOworCS8qCisJICogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gZ2V0IHRoZSBibG9jayB3aXRob3V0IHJlcXVlc3RpbmcgYSBuZXcKKwkgKiBmaWxlIHN5c3RlbSBibG9jay4KKwkgKi8KKwlkb3duX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CisJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQorCQlyZXR2YWwgPSBleHQ0X2V4dF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCBtYXAsIDApOworCWVsc2UKKwkJcmV0dmFsID0gZXh0NF9pbmRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgbWFwLCAwKTsKKworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKgorCQkgKiBYWFg6IF9fYmxvY2tfcHJlcGFyZV93cml0ZSgpIHVubWFwcyBwYXNzZWQgYmxvY2ssCisJCSAqIGlzIGl0IE9LPworCQkgKi8KKwkJLyogSWYgdGhlIGJsb2NrIHdhcyBhbGxvY2F0ZWQgZnJvbSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjbHVzdGVyLAorCQkgKiB0aGVuIHdlIGRvbnQgbmVlZCB0byByZXNlcnZlIGl0IGFnYWluLiAqLworCQlpZiAoIShtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9GUk9NX0NMVVNURVIpKSB7CisJCQlyZXR2YWwgPSBleHQ0X2RhX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGlibG9jayk7CisJCQlpZiAocmV0dmFsKQorCQkJCS8qIG5vdCBlbm91Z2ggc3BhY2UgdG8gcmVzZXJ2ZSAqLworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCS8qIENsZWFyIEVYVDRfTUFQX0ZST01fQ0xVU1RFUiBmbGFnIHNpbmNlIGl0cyBwdXJwb3NlIGlzIHNlcnZlZAorCQkgKiBhbmQgaXQgc2hvdWxkIG5vdCBhcHBlYXIgb24gdGhlIGJoLT5iX3N0YXRlLgorCQkgKi8KKwkJbWFwLT5tX2ZsYWdzICY9IH5FWFQ0X01BUF9GUk9NX0NMVVNURVI7CisKKwkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgaW52YWxpZF9ibG9jayk7CisJCXNldF9idWZmZXJfbmV3KGJoKTsKKwkJc2V0X2J1ZmZlcl9kZWxheShiaCk7CisJfQorCitvdXRfdW5sb2NrOgorCXVwX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgogICogVGhpcyBpcyBhIHNwZWNpYWwgZ2V0X2Jsb2Nrc190IGNhbGxiYWNrIHdoaWNoIGlzIHVzZWQgYnkKICAqIGV4dDRfZGFfd3JpdGVfYmVnaW4oKS4gIEl0IHdpbGwgZWl0aGVyIHJldHVybiBtYXBwZWQgYmxvY2sgb3IKICAqIHJlc2VydmUgc3BhY2UgZm9yIGEgc2luZ2xlIGJsb2NrLgpAQCAtMTYwMCwxMCArMTc0Miw2IEBACiB7CiAJc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7CiAJaW50IHJldCA9IDA7Ci0Jc2VjdG9yX3QgaW52YWxpZF9ibG9jayA9IH4oKHNlY3Rvcl90KSAweGZmZmYpOwotCi0JaWYgKGludmFsaWRfYmxvY2sgPCBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykpCi0JCWludmFsaWRfYmxvY2sgPSB+MDsKIAogCUJVR19PTihjcmVhdGUgPT0gMCk7CiAJQlVHX09OKGJoLT5iX3NpemUgIT0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKQEAgLTE2MTYsMjUgKzE3NTQsOSBAQAogCSAqIHByZWFsbG9jYXRlZCBibG9ja3MgYXJlIHVubWFwcGVkIGJ1dCBzaG91bGQgdHJlYXRlZAogCSAqIHRoZSBzYW1lIGFzIGFsbG9jYXRlZCBibG9ja3MuCiAJICovCi0JcmV0ID0gZXh0NF9tYXBfYmxvY2tzKE5VTEwsIGlub2RlLCAmbWFwLCAwKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBleHQ0X2RhX21hcF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJm1hcCwgYmgpOworCWlmIChyZXQgPD0gMCkKIAkJcmV0dXJuIHJldDsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpCi0JCQlyZXR1cm4gMDsgLyogTm90IHN1cmUgdGhpcyBjb3VsZCBvciBzaG91bGQgaGFwcGVuICovCi0JCS8qCi0JCSAqIFhYWDogX19ibG9ja193cml0ZV9iZWdpbigpIHVubWFwcyBwYXNzZWQgYmxvY2ssIGlzIGl0IE9LPwotCQkgKi8KLQkJcmV0ID0gZXh0NF9kYV9yZXNlcnZlX3NwYWNlKGlub2RlLCBpYmxvY2spOwotCQlpZiAocmV0KQotCQkJLyogbm90IGVub3VnaCBzcGFjZSB0byByZXNlcnZlICovCi0JCQlyZXR1cm4gcmV0OwotCi0JCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGludmFsaWRfYmxvY2spOwotCQlzZXRfYnVmZmVyX25ldyhiaCk7Ci0JCXNldF9idWZmZXJfZGVsYXkoYmgpOwotCQlyZXR1cm4gMDsKLQl9CiAKIAltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCBtYXAubV9wYmxrKTsKIAliaC0+Yl9zdGF0ZSA9IChiaC0+Yl9zdGF0ZSAmIH5FWFQ0X01BUF9GTEFHUykgfCBtYXAubV9mbGFnczsKQEAgLTE4MTEsOCArMTkzMywxMiBAQAogCQkgKiBXZSBkb24ndCB3YW50IHRvIGRvIGJsb2NrIGFsbG9jYXRpb24sIHNvIHJlZGlydHkKIAkJICogdGhlIHBhZ2UgYW5kIHJldHVybi4gIFdlIG1heSByZWFjaCBoZXJlIHdoZW4gd2UgZG8KIAkJICogYSBqb3VybmFsIGNvbW1pdCB2aWEgam91cm5hbF9zdWJtaXRfaW5vZGVfZGF0YV9idWZmZXJzLgotCQkgKiBXZSBjYW4gYWxzbyByZWFjaCBoZXJlIHZpYSBzaHJpbmtfcGFnZV9saXN0CisJCSAqIFdlIGNhbiBhbHNvIHJlYWNoIGhlcmUgdmlhIHNocmlua19wYWdlX2xpc3QgYnV0IGl0CisJCSAqIHNob3VsZCBuZXZlciBiZSBmb3IgZGlyZWN0IHJlY2xhaW0gc28gd2FybiBpZiB0aGF0CisJCSAqIGhhcHBlbnMKIAkJICovCisJCVdBUk5fT05fT05DRSgoY3VycmVudC0+ZmxhZ3MgJiAoUEZfTUVNQUxMT0N8UEZfS1NXQVBEKSkgPT0KKwkJCQkJCQkJUEZfTUVNQUxMT0MpOwogCQlnb3RvIHJlZGlydHlfcGFnZTsKIAl9CiAJaWYgKGNvbW1pdF93cml0ZSkKQEAgLTIwNDYsNiArMjE3Miw3IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihtYXBwaW5nLT5ob3N0LT5pX3NiKTsKIAlwZ29mZl90IGRvbmVfaW5kZXggPSAwOwogCXBnb2ZmX3QgZW5kOworCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCiAJdHJhY2VfZXh0NF9kYV93cml0ZXBhZ2VzKGlub2RlLCB3YmMpOwogCkBAIC0yMTI0LDYgKzIyNTEsNyBAQAogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCB8fCB3YmMtPnRhZ2dlZF93cml0ZXBhZ2VzKQogCQl0YWdfcGFnZXNfZm9yX3dyaXRlYmFjayhtYXBwaW5nLCBpbmRleCwgZW5kKTsKIAorCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAl3aGlsZSAoIXJldCAmJiB3YmMtPm5yX3RvX3dyaXRlID4gMCkgewogCiAJCS8qCkBAIC0yMTc0LDExICsyMzAyLDEyIEBACiAJCQlyZXQgPSAwOwogCQl9IGVsc2UgaWYgKHJldCA9PSBNUEFHRV9EQV9FWFRFTlRfVEFJTCkgewogCQkJLyoKLQkJCSAqIGdvdCBvbmUgZXh0ZW50IG5vdyB0cnkgd2l0aAotCQkJICogcmVzdCBvZiB0aGUgcGFnZXMKKwkJCSAqIEdvdCBvbmUgZXh0ZW50IG5vdyB0cnkgd2l0aCByZXN0IG9mIHRoZSBwYWdlcy4KKwkJCSAqIElmIG1wZC5yZXR2YWwgaXMgc2V0IC1FSU8sIGpvdXJuYWwgaXMgYWJvcnRlZC4KKwkJCSAqIFNvIHdlIGRvbid0IG5lZWQgdG8gd3JpdGUgYW55IG1vcmUuCiAJCQkgKi8KIAkJCXBhZ2VzX3dyaXR0ZW4gKz0gbXBkLnBhZ2VzX3dyaXR0ZW47Ci0JCQlyZXQgPSAwOworCQkJcmV0ID0gbXBkLnJldHZhbDsKIAkJCWlvX2RvbmUgPSAxOwogCQl9IGVsc2UgaWYgKHdiYy0+bnJfdG9fd3JpdGUpCiAJCQkvKgpAQCAtMjE4OCw2ICsyMzE3LDcgQEAKIAkJCSAqLwogCQkJYnJlYWs7CiAJfQorCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAJaWYgKCFpb19kb25lICYmICFjeWNsZWQpIHsKIAkJY3ljbGVkID0gMTsKIAkJaW5kZXggPSAwOwpAQCAtMjIyNiwxMCArMjM1NiwxMSBAQAogCSAqIERlbGFsbG9jIG5lZWQgYW4gYWNjdXJhdGUgZnJlZSBibG9jayBhY2NvdW50aW5nLiBTbyBzd2l0Y2gKIAkgKiB0byBub24gZGVsYWxsb2Mgd2hlbiB3ZSBhcmUgbmVhciB0byBlcnJvciByYW5nZS4KIAkgKi8KLQlmcmVlX2Jsb2NrcyAgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKLQlkaXJ0eV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJZnJlZV9ibG9ja3MgID0gRVhUNF9DMkIoc2JpLAorCQlwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIpKTsKKwlkaXJ0eV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyKTsKIAlpZiAoMiAqIGZyZWVfYmxvY2tzIDwgMyAqIGRpcnR5X2Jsb2NrcyB8fAotCQlmcmVlX2Jsb2NrcyA8IChkaXJ0eV9ibG9ja3MgKyBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLKSkgeworCQlmcmVlX2Jsb2NrcyA8IChkaXJ0eV9ibG9ja3MgKyBFWFQ0X0ZSRUVDTFVTVEVSU19XQVRFUk1BUkspKSB7CiAJCS8qCiAJCSAqIGZyZWUgYmxvY2sgY291bnQgaXMgbGVzcyB0aGFuIDE1MCUgb2YgZGlydHkgYmxvY2tzCiAJCSAqIG9yIGZyZWUgYmxvY2tzIGlzIGxlc3MgdGhhbiB3YXRlcm1hcmsKQEAgLTIyNDEsNyArMjM3Miw3IEBACiAJICogc3RhcnQgcHVzaGluZyBkZWxhbGxvYyB3aGVuIDEvMiBvZiBmcmVlIGJsb2NrcyBhcmUgZGlydHkuCiAJICovCiAJaWYgKGZyZWVfYmxvY2tzIDwgMiAqIGRpcnR5X2Jsb2NrcykKLQkJd3JpdGViYWNrX2lub2Rlc19zYl9pZl9pZGxlKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9pZl9pZGxlKHNiLCBXQl9SRUFTT05fRlNfRlJFRV9TUEFDRSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNTUsNiArMjM4Niw3IEBACiAJcGdvZmZfdCBpbmRleDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAloYW5kbGVfdCAqaGFuZGxlOworCWxvZmZfdCBwYWdlX2xlbjsKIAogCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKQEAgLTIzMDEsNiArMjQzMywxMyBAQAogCQkgKi8KIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCiAJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CisJfSBlbHNlIHsKKwkJcGFnZV9sZW4gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCWlmIChwYWdlX2xlbiA+IDApIHsKKwkJCXJldCA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwKKwkJCQlpbm9kZSwgcGFnZSwgcG9zIC0gcGFnZV9sZW4sIHBhZ2VfbGVuLAorCQkJCUVYVDRfRElTQ0FSRF9QQVJUSUFMX1BHX1pFUk9fVU5NQVBQRUQpOworCQl9CiAJfQogCiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCkBAIC0yMzQzLDYgKzI0ODIsNyBAQAogCWxvZmZfdCBuZXdfaV9zaXplOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAlpbnQgd3JpdGVfbW9kZSA9IChpbnQpKHVuc2lnbmVkIGxvbmcpZnNkYXRhOworCWxvZmZfdCBwYWdlX2xlbjsKIAogCWlmICh3cml0ZV9tb2RlID09IEZBTExfQkFDS19UT19OT05ERUxBTExPQykgewogCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKQEAgLTIzOTEsNiArMjUzMSwxNiBAQAogCX0KIAlyZXQyID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwKIAkJCQkJCQlwYWdlLCBmc2RhdGEpOworCisJcGFnZV9sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLQorCQkJKChwb3MgKyBjb3BpZWQgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwlpZiAocGFnZV9sZW4gPiAwKSB7CisJCXJldCA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwKKwkJCWlub2RlLCBwYWdlLCBwb3MgKyBjb3BpZWQgLSAxLCBwYWdlX2xlbiwKKwkJCUVYVDRfRElTQ0FSRF9QQVJUSUFMX1BHX1pFUk9fVU5NQVBQRUQpOworCX0KKwogCWNvcGllZCA9IHJldDI7CiAJaWYgKHJldDIgPCAwKQogCQlyZXQgPSByZXQyOwpAQCAtMjY4NSwxMCArMjgzNSw3IEBACiAJICogYnV0IGJlaW5nIG1vcmUgY2FyZWZ1bCBpcyBhbHdheXMgc2FmZSBmb3IgdGhlIGZ1dHVyZSBjaGFuZ2UuCiAJICovCiAJaW5vZGUgPSBpb19lbmQtPmlub2RlOwotCWlmICghKGlvX2VuZC0+ZmxhZyAmIEVYVDRfSU9fRU5EX1VOV1JJVFRFTikpIHsKLQkJaW9fZW5kLT5mbGFnIHw9IEVYVDRfSU9fRU5EX1VOV1JJVFRFTjsKLQkJYXRvbWljX2luYygmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKTsKLQl9CisJZXh0NF9zZXRfaW9fdW53cml0dGVuX2ZsYWcoaW5vZGUsIGlvX2VuZCk7CiAKIAkvKiBBZGQgdGhlIGlvX2VuZCB0byBwZXItaW5vZGUgY29tcGxldGVkIGlvIGxpc3QqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZFWFQ0X0koaW5vZGUpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CkBAIC0yODU0LDYgKzMwMDEsMTIgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCXNzaXplX3QgcmV0OwogCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgZGF0YSBqb3VybmFsbGluZyB3ZSBkb24ndCBzdXBwb3J0IE9fRElSRUNUCisJICovCisJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJCXJldHVybiAwOworCiAJdHJhY2VfZXh0NF9kaXJlY3RfSU9fZW50ZXIoaW5vZGUsIG9mZnNldCwgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpLCBydyk7CiAJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlyZXQgPSBleHQ0X2V4dF9kaXJlY3RfSU8ocncsIGlvY2IsIGlvdiwgb2Zmc2V0LCBucl9zZWdzKTsKQEAgLTI5MjMsNiArMzA3Niw3IEBACiAJLmJtYXAJCQk9IGV4dDRfYm1hcCwKIAkuaW52YWxpZGF0ZXBhZ2UJCT0gZXh0NF9pbnZhbGlkYXRlcGFnZSwKIAkucmVsZWFzZXBhZ2UJCT0gZXh0NF9yZWxlYXNlcGFnZSwKKwkuZGlyZWN0X0lPCQk9IGV4dDRfZGlyZWN0X0lPLAogCS5pc19wYXJ0aWFsbHlfdXB0b2RhdGUgID0gYmxvY2tfaXNfcGFydGlhbGx5X3VwdG9kYXRlLAogCS5lcnJvcl9yZW1vdmVfcGFnZQk9IGdlbmVyaWNfZXJyb3JfcmVtb3ZlX3BhZ2UsCiB9OwpAQCAtMjk1OSw2ICszMTEzLDIyNyBAQAogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQ0X2pvdXJuYWxsZWRfYW9wczsKIH0KIAorCisvKgorICogZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzKCkKKyAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrLgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbmQgbG9ja3MgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgb2Zmc2V0CisgKiAiZnJvbSIgYW5kIHBhc3NlcyBpdCB0byBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jay4KKyAqIENhbGxpbmcgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSBwYWdlIGxvY2tlZCBzaG91bGQgY2FsbAorICogZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzX25vX2xvY2sgZGlyZWN0bHkuCisgKi8KK2ludCBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnMoaGFuZGxlX3QgKmhhbmRsZSwKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBmcm9tLAorCQlsb2ZmX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGVyciA9IDA7CisKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQsCisJCQkJICAgbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwgaW5vZGUsIHBhZ2UsCisJCWZyb20sIGxlbmd0aCwgZmxhZ3MpOworCisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jaygpCisgKiBaZXJvcyBhIHBhZ2UgcmFuZ2Ugb2YgbGVuZ3RoICdsZW5ndGgnIHN0YXJ0aW5nIGZyb20gb2Zmc2V0ICdmcm9tJy4KKyAqIEJ1ZmZlciBoZWFkcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGJsb2NrIGFsaWduZWQgcmVnaW9ucyBvZiB0aGUKKyAqIHplcm9lZCByYW5nZSB3aWxsIGJlIHVubWFwcGVkLiAgVW5ibG9jayBhbGlnbmVkIHJlZ2lvbnMKKyAqIHdpbGwgaGF2ZSB0aGUgY29ycmVzcG9uZGluZyBidWZmZXIgaGVhZCBtYXBwZWQgaWYgbmVlZGVkIHNvIHRoYXQKKyAqIHRoYXQgcmVnaW9uIG9mIHRoZSBwYWdlIGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIHBhcnRpYWwgemVybyBvdXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHBhZ2UgaGFzIGFscmVhZHkgYmVlbiAgbG9ja2VkLiAgVGhlCisgKiBUaGUgcmFuZ2UgdG8gYmUgZGlzY2FyZGVkIG11c3QgYmUgY29udGFpbmVkIHdpdGggaW4gdGhlIGdpdmVuIHBhZ2UuCisgKiBJZiB0aGUgc3BlY2lmaWVkIHJhbmdlIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUgcGFnZSBpdCB3aWxsIGJlIHNob3J0ZW5lZAorICogdG8gdGhlIGVuZCBvZiB0aGUgcGFnZSB0aGF0IGNvcnJlc3BvbmRzIHRvICdmcm9tJy4gIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGFwcHJvcHJpYXRlIGZvciB1cGRhdGluZyBhIHBhZ2UgYW5kIGl0IGJ1ZmZlciBoZWFkcyB0byBiZSB1bm1hcHBlZCBhbmQKKyAqIHplcm9lZCBmb3IgYmxvY2tzIHRoYXQgaGF2ZSBiZWVuIGVpdGhlciByZWxlYXNlZCwgb3IgYXJlIGdvaW5nIHRvIGJlCisgKiByZWxlYXNlZC4KKyAqCisgKiBoYW5kbGU6IFRoZSBqb3VybmFsIGhhbmRsZQorICogaW5vZGU6ICBUaGUgZmlsZXMgaW5vZGUKKyAqIHBhZ2U6ICAgQSBsb2NrZWQgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXQgImZyb20iCisgKiBmcm9tOiAgIFRoZSBzdGFydGluZyBieXRlIG9mZnNldCAoZnJvbSB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUpCisgKiAgICAgICAgIHRvIGJlZ2luIGRpc2NhcmRpbmcKKyAqIGxlbjogICAgVGhlIGxlbmd0aCBvZiBieXRlcyB0byBkaXNjYXJkCisgKiBmbGFnczogIE9wdGlvbmFsIGZsYWdzIHRoYXQgbWF5IGJlIHVzZWQ6CisgKgorICogICAgICAgICBFWFQ0X0RJU0NBUkRfUEFSVElBTF9QR19aRVJPX1VOTUFQUEVECisgKiAgICAgICAgIE9ubHkgemVybyB0aGUgcmVnaW9ucyBvZiB0aGUgcGFnZSB3aG9zZSBidWZmZXIgaGVhZHMKKyAqICAgICAgICAgaGF2ZSBhbHJlYWR5IGJlZW4gdW5tYXBwZWQuICBUaGlzIGZsYWcgaXMgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgZm9yIHVwZGF0ZWluZyB0aGUgY29udGVudHMgb2YgYSBwYWdlIHdob3NlIGJsb2NrcyBtYXkKKyAqICAgICAgICAgaGF2ZSBhbHJlYWR5IGJlZW4gcmVsZWFzZWQsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gemVybworICogICAgICAgICBvdXQgdGhlIHJlZ2lvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRob3NlIHJlbGVhc2VkIGJsb2Nrcy4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjZXNzIG9yIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBleHQ0X2Rpc2NhcmRfcGFydGlhbF9wYWdlX2J1ZmZlcnNfbm9fbG9jayhoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IGZyb20sCisJCWxvZmZfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKwlleHQ0X2ZzYmxrX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCXVuc2lnbmVkIGludCBibG9ja3NpemUsIG1heCwgcG9zOworCWV4dDRfbGJsa190IGlibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBlcnIgPSAwOworCisJYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCW1heCA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKworCWlmIChpbmRleCAhPSBwYWdlLT5pbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIGNvcnJlY3QgbGVuZ3RoIGlmIGl0IGRvZXMgbm90IGZhbGwgYmV0d2VlbgorCSAqICdmcm9tJyBhbmQgdGhlIGVuZCBvZiB0aGUgcGFnZQorCSAqLworCWlmIChsZW5ndGggPiBtYXggfHwgbGVuZ3RoIDwgMCkKKwkJbGVuZ3RoID0gbWF4OworCisJaWJsb2NrID0gaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHJhbmdlIHRvIGJlIGRpc2NhcmRlZCBjb3ZlcnMgYSBwYXJ0aWFsIGJsb2NrCisJCSAqIHdlIG5lZWQgdG8gZ2V0IHRoZSBwYWdlIGJ1ZmZlcnMuICBUaGlzIGlzIGJlY2F1c2UKKwkJICogcGFydGlhbCBibG9ja3MgY2Fubm90IGJlIHJlbGVhc2VkIGFuZCB0aGUgcGFnZSBuZWVkcworCQkgKiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayBiZWZvcmUKKwkJICogd2Ugd3JpdGUgdGhlIHplcm9zIG9uIHRvcCBvZiBpdC4KKwkJICovCisJCWlmICgoZnJvbSAmIChibG9ja3NpemUgLSAxKSkgfHwKKwkJICAgICgoZnJvbSArIGxlbmd0aCkgJiAoYmxvY2tzaXplIC0gMSkpKSB7CisJCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBwYXJ0aWFsIGJsb2NrcywKKwkJCSAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gdXBkYXRlLAorCQkJICogc28gd2UgY2FuIHJldHVybiBub3cKKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBGaW5kIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyAib2Zmc2V0IiAqLworCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCXBvcyA9IGJsb2Nrc2l6ZTsKKwl3aGlsZSAob2Zmc2V0ID49IHBvcykgeworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWJsb2NrKys7CisJCXBvcyArPSBibG9ja3NpemU7CisJfQorCisJcG9zID0gb2Zmc2V0OworCXdoaWxlIChwb3MgPCBvZmZzZXQgKyBsZW5ndGgpIHsKKwkJdW5zaWduZWQgaW50IGVuZF9vZl9ibG9jaywgcmFuZ2VfdG9fZGlzY2FyZDsKKworCQllcnIgPSAwOworCisJCS8qIFRoZSBsZW5ndGggb2Ygc3BhY2UgbGVmdCB0byB6ZXJvIGFuZCB1bm1hcCAqLworCQlyYW5nZV90b19kaXNjYXJkID0gb2Zmc2V0ICsgbGVuZ3RoIC0gcG9zOworCisJCS8qIFRoZSBsZW5ndGggb2Ygc3BhY2UgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwkJZW5kX29mX2Jsb2NrID0gYmxvY2tzaXplIC0gKHBvcyAmIChibG9ja3NpemUtMSkpOworCisJCS8qCisJCSAqIERvIG5vdCB1bm1hcCBvciB6ZXJvIHBhc3QgZW5kIG9mIGJsb2NrCisJCSAqIGZvciB0aGlzIGJ1ZmZlciBoZWFkCisJCSAqLworCQlpZiAocmFuZ2VfdG9fZGlzY2FyZCA+IGVuZF9vZl9ibG9jaykKKwkJCXJhbmdlX3RvX2Rpc2NhcmQgPSBlbmRfb2ZfYmxvY2s7CisKKworCQkvKgorCQkgKiBTa2lwIHRoaXMgYnVmZmVyIGhlYWQgaWYgd2UgYXJlIG9ubHkgemVyb2luZyB1bmFtcHBlZAorCQkgKiByZWdpb25zIG9mIHRoZSBwYWdlCisJCSAqLworCQlpZiAoZmxhZ3MgJiBFWFQ0X0RJU0NBUkRfUEFSVElBTF9QR19aRVJPX1VOTUFQUEVEICYmCisJCQlidWZmZXJfbWFwcGVkKGJoKSkKKwkJCQlnb3RvIG5leHQ7CisKKwkJLyogSWYgdGhlIHJhbmdlIGlzIGJsb2NrIGFsaWduZWQsIHVubWFwICovCisJCWlmIChyYW5nZV90b19kaXNjYXJkID09IGJsb2Nrc2l6ZSkgeworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWJoLT5iX2JkZXYgPSBOVUxMOworCQkJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CisJCQljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOworCQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXplcm9fdXNlcihwYWdlLCBwb3MsIHJhbmdlX3RvX2Rpc2NhcmQpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAiQnVmZmVyIGRpc2NhcmRlZCIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJLyoKKwkJICogSWYgdGhpcyBibG9jayBpcyBub3QgY29tcGxldGVseSBjb250YWluZWQgaW4gdGhlIHJhbmdlCisJCSAqIHRvIGJlIGRpc2NhcmRlZCwgdGhlbiBpdCBpcyBub3QgZ29pbmcgdG8gYmUgcmVsZWFzZWQuIEJlY2F1c2UKKwkJICogd2UgbmVlZCB0byBrZWVwIHRoaXMgYmxvY2ssIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgcGFydAorCQkgKiBvZiB0aGUgcGFnZSBpcyB1cHRvZGF0ZSBiZWZvcmUgd2UgbW9kaWZ5IGl0IGJ5IHdyaXRlaW5nCisJCSAqIHBhcnRpYWwgemVyb3Mgb24gaXQuCisJCSAqLworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQkvKgorCQkJICogQnVmZmVyIGhlYWQgbXVzdCBiZSBtYXBwZWQgYmVmb3JlIHdlIGNhbiByZWFkCisJCQkgKiBmcm9tIHRoZSBibG9jaworCQkJICovCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJ1bm1hcHBlZCIpOworCQkJZXh0NF9nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQkJLyogdW5tYXBwZWQ/IEl0J3MgYSBob2xlIC0gbm90aGluZyB0byBkbyAqLworCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCUJVRkZFUl9UUkFDRShiaCwgInN0aWxsIHVubWFwcGVkIik7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisKKwkJLyogT2ssIGl0J3MgbWFwcGVkLiBNYWtlIHN1cmUgaXQncyB1cC10by1kYXRlICovCisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJLyogVWhodWguIFJlYWQgZXJyb3IuIENvbXBsYWluIGFuZCBwdW50LiovCisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZ290byBuZXh0OworCQl9CisKKwkJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG5leHQ7CisJCX0KKworCQl6ZXJvX3VzZXIocGFnZSwgcG9zLCByYW5nZV90b19kaXNjYXJkKTsKKworCQllcnIgPSAwOworCQlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQl9IGVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKworCQlCVUZGRVJfVFJBQ0UoYmgsICJQYXJ0aWFsIGJ1ZmZlciB6ZXJvZWQiKTsKK25leHQ6CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlpYmxvY2srKzsKKwkJcG9zICs9IHJhbmdlX3RvX2Rpc2NhcmQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIGV4dDRfYmxvY2tfdHJ1bmNhdGVfcGFnZSgpIHplcm9lcyBvdXQgYSBtYXBwaW5nIGZyb20gZmlsZSBvZmZzZXQgYGZyb20nCiAgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayB3aGljaCBjb3JyZXNwb25kcyB0byBgZnJvbScuCkBAIC0zMDAxLDcgKzMzNzYsNyBAQAogCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKG1hcHBpbmcsIGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVCwKIAkJCQkgICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpICYgfl9fR0ZQX0ZTKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAltYXggPSBibG9ja3NpemUgLSAob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKTsKQEAgLTMwNzAsMTEgKzM0NDUsOCBAQAogCWVyciA9IDA7CiAJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKIAkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwotCX0gZWxzZSB7Ci0JCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSAmJiBFWFQ0X0koaW5vZGUpLT5qaW5vZGUpCi0JCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKKwl9IGVsc2UKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCX0KIAogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMzExNSw2ICszNDg3LDExIEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCisJaWYgKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJfcmF0aW8gPiAxKSB7CisJCS8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBiaWdhbGxvYyBmaWxlIHN5c3RlbXMgKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKIAlyZXR1cm4gZXh0NF9leHRfcHVuY2hfaG9sZShmaWxlLCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKQEAgLTM0MTQsNyArMzc5MSw3IEBACiAJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OwogCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCXNldF9ubGluayhpbm9kZSwgbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KSk7CiAKIAlleHQ0X2NsZWFyX3N0YXRlX2ZsYWdzKGVpKTsJLyogT25seSByZWxldmFudCBvbiAzMi1iaXQgYXJjaHMgKi8KIAllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKQEAgLTQ0MTYsNiArNDc5Myw3IEBACiAJCQkgIFBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKSkgewogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfSkRBVEEpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IGYxOGJmZTMuLmE1Njc5NjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTIxLDYgKzIxLDcgQEAKIGxvbmcgZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCkBAIC0xNzMsMzMgKzE3NCw4IEBACiAJCW1udF9kcm9wX3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwogCQlyZXR1cm4gZXJyOwogCX0KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCWNhc2UgRVhUNF9JT0NfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCS8qCi0JCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAotCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCi0JCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KLQkJICoKLQkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7Ci0JCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQkJCWludCByZXQgPSAwOwotCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJYWRkX3dhaXRfcXVldWUoJkVYVDRfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlpZiAodGltZXJfcGVuZGluZygmRVhUNF9TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7Ci0JCQkJc2NoZWR1bGUoKTsKLQkJCQlyZXQgPSAxOwotCQkJfQotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDRfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0jZW5kaWYKIAljYXNlIEVYVDRfSU9DX0dST1VQX0VYVEVORDogewogCQlleHQ0X2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQ7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJaW50IGVyciwgZXJyMj0wOwogCiAJCWVyciA9IGV4dDRfcmVzaXplX2JlZ2luKHNiKTsKQEAgLTIwOSw2ICsxODUsMTMgQEAKIAkJaWYgKGdldF91c2VyKG5fYmxvY2tzX2NvdW50LCAoX191MzIgX191c2VyICopYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIHJlc2l6aW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKIAkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMjUwLDYgKzIzMywxMyBAQAogCQkJZ290byBtZXh0X291dDsKIAkJfQogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIGRlZnJhZyBub3Qgc3VwcG9ydGVkIHdpdGggYmlnYWxsb2MiKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCiAJCWVyciA9IG1udF93YW50X3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOwogCQlpZiAoZXJyKQogCQkJZ290byBtZXh0X291dDsKQEAgLTI3MCw3ICsyNjAsNiBAQAogCiAJY2FzZSBFWFQ0X0lPQ19HUk9VUF9BREQ6IHsKIAkJc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgaW5wdXQ7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJaW50IGVyciwgZXJyMj0wOwogCiAJCWVyciA9IGV4dDRfcmVzaXplX2JlZ2luKHNiKTsKQEAgLTI4MSw2ICsyNzAsMTMgQEAKIAkJCQlzaXplb2YoaW5wdXQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiT25saW5lIHJlc2l6aW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKIAkJZXJyID0gbW50X3dhbnRfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMzM3LDcgKzMzMyw2IEBACiAKIAljYXNlIEZJVFJJTToKIAl7Ci0JCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShzYi0+c19iZGV2KTsKIAkJc3RydWN0IGZzdHJpbV9yYW5nZSByYW5nZTsKIAkJaW50IHJldCA9IDA7CkBAIC0zNDgsNyArMzQzLDE0IEBACiAJCWlmICghYmxrX3F1ZXVlX2Rpc2NhcmQocSkpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgKHN0cnVjdCBmc3RyaW1fcmFuZ2UgKilhcmcsCisJCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiRklUUklNIG5vdCBzdXBwb3J0ZWQgd2l0aCBiaWdhbGxvYyIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyYW5nZSwgKHN0cnVjdCBmc3RyaW1fcmFuZ2UgX191c2VyICopYXJnLAogCQkgICAgc2l6ZW9mKHJhbmdlKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMzU4LDcgKzM2MCw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZnN0cmltX3JhbmdlICopYXJnLCAmcmFuZ2UsCisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBmc3RyaW1fcmFuZ2UgX191c2VyICopYXJnLCAmcmFuZ2UsCiAJCSAgICBzaXplb2YocmFuZ2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCkBAIC0zOTYsMTEgKzM5OCw2IEBACiAJY2FzZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT05fT0xEOgogCQljbWQgPSBFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRDsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0pCRDJfREVCVUcKLQljYXNlIEVYVDRfSU9DMzJfV0FJVF9GT1JfUkVBRE9OTFk6Ci0JCWNtZCA9IEVYVDRfSU9DX1dBSVRfRk9SX1JFQURPTkxZOwotCQlicmVhazsKLSNlbmRpZgogCWNhc2UgRVhUNF9JT0MzMl9HRVRSU1ZTWjoKIAkJY21kID0gRVhUNF9JT0NfR0VUUlNWU1o7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCAxN2E1YTU3Li5lMmQ4YmU4IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtNzAsOCArNzAsOCBAQAogICoKICAqIHBhX2xzdGFydCAtPiB0aGUgbG9naWNhbCBzdGFydCBibG9jayBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQogICogcGFfcHN0YXJ0IC0+IHRoZSBwaHlzaWNhbCBzdGFydCBibG9jayBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQotICogcGFfbGVuICAgIC0+IGxlbmd0aCBmb3IgdGhpcyBwcmVhbGxvYyBzcGFjZQotICogcGFfZnJlZSAgIC0+ICBmcmVlIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGlzIHByZWFsbG9jIHNwYWNlCisgKiBwYV9sZW4gICAgLT4gbGVuZ3RoIGZvciB0aGlzIHByZWFsbG9jIHNwYWNlIChpbiBjbHVzdGVycykKKyAqIHBhX2ZyZWUgICAtPiAgZnJlZSBzcGFjZSBhdmFpbGFibGUgaW4gdGhpcyBwcmVhbGxvYyBzcGFjZSAoaW4gY2x1c3RlcnMpCiAgKgogICogVGhlIGlub2RlIHByZWFsbG9jYXRpb24gc3BhY2UgaXMgdXNlZCBsb29raW5nIGF0IHRoZSBfbG9naWNhbF8gc3RhcnQKICAqIGJsb2NrLiBJZiBvbmx5IHRoZSBsb2dpY2FsIGZpbGUgYmxvY2sgZmFsbHMgd2l0aGluIHRoZSByYW5nZSBvZiBwcmVhbGxvYwpAQCAtMTI2LDcgKzEyNiw4IEBACiAgKiBsaXN0LiBJbiBjYXNlIG9mIGlub2RlIHByZWFsbG9jYXRpb24gd2UgZm9sbG93IGEgbGlzdCBvZiBoZXVyaXN0aWNzCiAgKiBiYXNlZCBvbiBmaWxlIHNpemUuIFRoaXMgY2FuIGJlIGZvdW5kIGluIGV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3QuIElmCiAgKiB3ZSBhcmUgZG9pbmcgYSBncm91cCBwcmVhbGxvYyB3ZSB0cnkgdG8gbm9ybWFsaXplIHRoZSByZXF1ZXN0IHRvCi0gKiBzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MuIERlZmF1bHQgdmFsdWUgb2Ygc19tYl9ncm91cF9wcmVhbGxvYyBpcworICogc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jLiAgVGhlIGRlZmF1bHQgdmFsdWUgb2Ygc19tYl9ncm91cF9wcmVhbGxvYyBpcworICogZGVwZW5kZW50IG9uIHRoZSBjbHVzdGVyIHNpemU7IGZvciBub24tYmlnYWxsb2MgZmlsZSBzeXN0ZW1zLCBpdCBpcwogICogNTEyIGJsb2Nrcy4gVGhpcyBjYW4gYmUgdHVuZWQgdmlhCiAgKiAvc3lzL2ZzL2V4dDQvPHBhcnRpdGlvbj4vbWJfZ3JvdXBfcHJlYWxsb2MuIFRoZSB2YWx1ZSBpcyByZXByZXNlbnRlZCBpbgogICogdGVybXMgb2YgbnVtYmVyIG9mIGJsb2Nrcy4gSWYgd2UgaGF2ZSBtb3VudGVkIHRoZSBmaWxlIHN5c3RlbSB3aXRoIC1PCkBAIC00NTksNyArNDYwLDcgQEAKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yOwogCiAJCQlibG9ja25yID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlibG9ja25yICs9IGZpcnN0ICsgaTsKKwkJCWJsb2NrbnIgKz0gRVhUNF9DMkIoRVhUNF9TQihzYiksIGZpcnN0ICsgaSk7CiAJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCiAJCQkJCSAgICAgIGlub2RlID8gaW5vZGUtPmlfaW5vIDogMCwKIAkJCQkJICAgICAgYmxvY2tuciwKQEAgLTU4MCw3ICs1ODEsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQkvKiBib3RoIGJpdHMgaW4gYnVkZHkyIG11c3QgYmUgMCAqLworCQkJLyogYm90aCBiaXRzIGluIGJ1ZGR5MiBtdXN0IGJlIDEgKi8KIAkJCU1CX0NIRUNLX0FTU0VSVChtYl90ZXN0X2JpdChpIDw8IDEsIGJ1ZGR5MikpOwogCQkJTUJfQ0hFQ0tfQVNTRVJUKG1iX3Rlc3RfYml0KChpIDw8IDEpICsgMSwgYnVkZHkyKSk7CiAKQEAgLTY1Myw3ICs2NTQsNyBAQAogCWV4dDRfZ3JwYmxrX3QgY2h1bms7CiAJdW5zaWduZWQgc2hvcnQgYm9yZGVyOwogCi0JQlVHX09OKGxlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpOworCUJVR19PTihsZW4gPiBFWFQ0X0NMVVNURVJTX1BFUl9HUk9VUChzYikpOwogCiAJYm9yZGVyID0gMiA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKIApAQCAtNzA1LDcgKzcwNiw3IEBACiAJCQkJdm9pZCAqYnVkZHksIHZvaWQgKmJpdG1hcCwgZXh0NF9ncm91cF90IGdyb3VwKQogewogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQlleHQ0X2dycGJsa190IG1heCA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZXh0NF9ncnBibGtfdCBtYXggPSBFWFQ0X0NMVVNURVJTX1BFUl9HUk9VUChzYik7CiAJZXh0NF9ncnBibGtfdCBpID0gMDsKIAlleHQ0X2dycGJsa190IGZpcnN0OwogCWV4dDRfZ3JwYmxrX3QgbGVuOwpAQCAtNzM0LDcgKzczNSw3IEBACiAKIAlpZiAoZnJlZSAhPSBncnAtPmJiX2ZyZWUpIHsKIAkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgMCwgMCwKLQkJCQkgICAgICAiJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2QiLAorCQkJCSAgICAgICIldSBjbHVzdGVycyBpbiBiaXRtYXAsICV1IGluIGdkIiwKIAkJCQkgICAgICBmcmVlLCBncnAtPmJiX2ZyZWUpOwogCQkvKgogCQkgKiBJZiB3ZSBpbnRlbnQgdG8gY29udGludWUsIHdlIGNvbnNpZGVyIGdyb3VwIGRlc2NyaXRvcgpAQCAtMTMzOSw3ICsxMzQwLDcgQEAKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yOwogCiAJCQlibG9ja25yID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlibG9ja25yICs9IGJsb2NrOworCQkJYmxvY2tuciArPSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgYmxvY2spOwogCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLAogCQkJCQkgICAgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDAsCiAJCQkJCSAgICAgIGJsb2NrbnIsCkBAIC0xMzkwLDcgKzEzOTEsNiBAQAogewogCWludCBuZXh0ID0gYmxvY2s7CiAJaW50IG1heDsKLQlpbnQgb3JkOwogCXZvaWQgKmJ1ZGR5OwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoZTRiLT5iZF9zYiwgZTRiLT5iZF9ncm91cCkpOwpAQCAtMTQzMiw5ICsxNDMyLDggQEAKIAkJaWYgKG1iX3Rlc3RfYml0KG5leHQsIEVYVDRfTUJfQklUTUFQKGU0YikpKQogCQkJYnJlYWs7CiAKLQkJb3JkID0gbWJfZmluZF9vcmRlcl9mb3JfYmxvY2soZTRiLCBuZXh0KTsKKwkJb3JkZXIgPSBtYl9maW5kX29yZGVyX2Zvcl9ibG9jayhlNGIsIG5leHQpOwogCi0JCW9yZGVyID0gb3JkOwogCQlibG9jayA9IG5leHQgPj4gb3JkZXI7CiAJCWV4LT5mZV9sZW4gKz0gMSA8PCBvcmRlcjsKIAl9CkBAIC0xNjI0LDggKzE2MjMsOCBAQAogCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50ICpnZXggPSAmYWMtPmFjX2dfZXg7CiAKIAlCVUdfT04oZXgtPmZlX2xlbiA8PSAwKTsKLQlCVUdfT04oZXgtPmZlX2xlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChhYy0+YWNfc2IpKTsKLQlCVUdfT04oZXgtPmZlX3N0YXJ0ID49IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChhYy0+YWNfc2IpKTsKKwlCVUdfT04oZXgtPmZlX2xlbiA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKGFjLT5hY19zYikpOworCUJVR19PTihleC0+ZmVfc3RhcnQgPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoYWMtPmFjX3NiKSk7CiAJQlVHX09OKGFjLT5hY19zdGF0dXMgIT0gQUNfU1RBVFVTX0NPTlRJTlVFKTsKIAogCWFjLT5hY19mb3VuZCsrOwpAQCAtMTgyMywxNSArMTgyMiwxNSBAQAogCiAJd2hpbGUgKGZyZWUgJiYgYWMtPmFjX3N0YXR1cyA9PSBBQ19TVEFUVVNfQ09OVElOVUUpIHsKIAkJaSA9IG1iX2ZpbmRfbmV4dF96ZXJvX2JpdChiaXRtYXAsCi0JCQkJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLCBpKTsKLQkJaWYgKGkgPj0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCQkJCQkJRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpLCBpKTsKKwkJaWYgKGkgPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKSB7CiAJCQkvKgogCQkJICogSUYgd2UgaGF2ZSBjb3JydXB0IGJpdG1hcCwgd2Ugd29uJ3QgZmluZCBhbnkKIAkJCSAqIGZyZWUgYmxvY2tzIGV2ZW4gdGhvdWdoIGdyb3VwIGluZm8gc2F5cyB3ZQogCQkJICogd2UgaGF2ZSBmcmVlIGJsb2NrcwogCQkJICovCiAJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsIDAsIDAsCi0JCQkJCSIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgorCQkJCQkiJWQgZnJlZSBjbHVzdGVycyBhcyBwZXIgIgogCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGJpdG1hcCBzYXlzIDAiLAogCQkJCQlmcmVlKTsKIAkJCWJyZWFrOwpAQCAtMTg0MSw3ICsxODQwLDcgQEAKIAkJQlVHX09OKGV4LmZlX2xlbiA8PSAwKTsKIAkJaWYgKGZyZWUgPCBleC5mZV9sZW4pIHsKIAkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwgMCwgMCwKLQkJCQkJIiVkIGZyZWUgYmxvY2tzIGFzIHBlciAiCisJCQkJCSIlZCBmcmVlIGNsdXN0ZXJzIGFzIHBlciAiCiAJCQkJCSJncm91cCBpbmZvLiBCdXQgZ290ICVkIGJsb2NrcyIsCiAJCQkJCWZyZWUsIGV4LmZlX2xlbik7CiAJCQkvKgpAQCAtMTg4Nyw3ICsxODg2LDcgQEAKIAlkb19kaXYoYSwgc2JpLT5zX3N0cmlwZSk7CiAJaSA9IChhICogc2JpLT5zX3N0cmlwZSkgLSBmaXJzdF9ncm91cF9ibG9jazsKIAotCXdoaWxlIChpIDwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCXdoaWxlIChpIDwgRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpKSB7CiAJCWlmICghbWJfdGVzdF9iaXQoaSwgYml0bWFwKSkgewogCQkJbWF4ID0gbWJfZmluZF9leHRlbnQoZTRiLCAwLCBpLCBzYmktPnNfc3RyaXBlLCAmZXgpOwogCQkJaWYgKG1heCA+PSBzYmktPnNfc3RyaXBlKSB7CkBAIC0yMjUyLDEwICsyMjUxLDEwIEBACiAJICovCiAJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZSA9Ci0JCQlleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBkZXNjKTsKKwkJCWV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYyk7CiAJfSBlbHNlIHsKIAkJbWV0YV9ncm91cF9pbmZvW2ldLT5iYl9mcmVlID0KLQkJCWV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKKwkJCWV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJm1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfcHJlYWxsb2NfbGlzdCk7CkBAIC0yNDczLDcgKzI0NzIsMjAgQEAKIAlzYmktPnNfbWJfc3RhdHMgPSBNQl9ERUZBVUxUX1NUQVRTOwogCXNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdCA9IE1CX0RFRkFVTFRfU1RSRUFNX1RIUkVTSE9MRDsKIAlzYmktPnNfbWJfb3JkZXIyX3JlcXMgPSBNQl9ERUZBVUxUX09SREVSMl9SRVFTOwotCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA9IE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0M7CisJLyoKKwkgKiBUaGUgZGVmYXVsdCBncm91cCBwcmVhbGxvY2F0aW9uIGlzIDUxMiwgd2hpY2ggZm9yIDRrIGJsb2NrCisJICogc2l6ZXMgdHJhbnNsYXRlcyB0byAyIG1lZ2FieXRlcy4gIEhvd2V2ZXIgZm9yIGJpZ2FsbG9jIGZpbGUKKwkgKiBzeXN0ZW1zLCB0aGlzIGlzIHByb2JhYmx5IHRvbyBiaWcgKGkuZSwgaWYgdGhlIGNsdXN0ZXIgc2l6ZQorCSAqIGlzIDEgbWVnYWJ5dGUsIHRoZW4gZ3JvdXAgcHJlYWxsb2NhdGlvbiBzaXplIGJlY29tZXMgaGFsZiBhCisJICogZ2lnYWJ5dGUhKS4gIEFzIGEgZGVmYXVsdCwgd2Ugd2lsbCBrZWVwIGEgdHdvIG1lZ2FieXRlCisJICogZ3JvdXAgcHJhbGxvYyBzaXplIGZvciBjbHVzdGVyIHNpemVzIHVwIHRvIDY0aywgYW5kIGFmdGVyCisJICogdGhhdCwgd2Ugd2lsbCBmb3JjZSBhIG1pbmltdW0gZ3JvdXAgcHJlYWxsb2NhdGlvbiBzaXplIG9mCisJICogMzIgY2x1c3RlcnMuICBUaGlzIHRyYW5zbGF0ZXMgdG8gOCBtZWdzIHdoZW4gdGhlIGNsdXN0ZXIKKwkgKiBzaXplIGlzIDI1NmssIGFuZCAzMiBtZWdzIHdoZW4gdGhlIGNsdXN0ZXIgc2l6ZSBpcyAxIG1lZywKKwkgKiB3aGljaCBzZWVtcyByZWFzb25hYmxlIGFzIGEgZGVmYXVsdC4KKwkgKi8KKwlzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MgPSBtYXgoTUJfREVGQVVMVF9HUk9VUF9QUkVBTExPQyA+PgorCQkJCSAgICAgICBzYmktPnNfY2x1c3Rlcl9iaXRzLCAzMik7CiAJLyoKIAkgKiBJZiB0aGVyZSBpcyBhIHNfc3RyaXBlID4gMSwgdGhlbiB3ZSBzZXQgdGhlIHNfbWJfZ3JvdXBfcHJlYWxsb2MKIAkgKiB0byB0aGUgbG93ZXN0IG11bHRpcGxlIG9mIHNfc3RyaXBlIHdoaWNoIGlzIGJpZ2dlciB0aGFuCkBAIC0yNDkwLDcgKzI1MDIsNyBAQAogCXNiaS0+c19sb2NhbGl0eV9ncm91cHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGV4dDRfbG9jYWxpdHlfZ3JvdXApOwogCWlmIChzYmktPnNfbG9jYWxpdHlfZ3JvdXBzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZyZWVfZ3JvdXBpbmZvX3NsYWI7CiAJfQogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpsZzsKQEAgLTI1MDMsOSArMjUxNSw4IEBACiAKIAkvKiBpbml0IGZpbGUgZm9yIGJ1ZGR5IGRhdGEgKi8KIAlyZXQgPSBleHQ0X21iX2luaXRfYmFja2VuZChzYik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X2ZyZWVfbG9jYWxpdHlfZ3JvdXBzOwogCiAJaWYgKHNiaS0+c19wcm9jKQogCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9ncm91cHMiLCBTX0lSVUdPLCBzYmktPnNfcHJvYywKQEAgLTI1MTMsMTEgKzI1MjQsMTkgQEAKIAogCWlmIChzYmktPnNfam91cm5hbCkKIAkJc2JpLT5zX2pvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrID0gcmVsZWFzZV9ibG9ja3Nfb25fY29tbWl0OworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2xvY2FsaXR5X2dyb3VwczoKKwlmcmVlX3BlcmNwdShzYmktPnNfbG9jYWxpdHlfZ3JvdXBzKTsKKwlzYmktPnNfbG9jYWxpdHlfZ3JvdXBzID0gTlVMTDsKK291dF9mcmVlX2dyb3VwaW5mb19zbGFiOgorCWV4dDRfZ3JvdXBpbmZvX2Rlc3Ryb3lfc2xhYnMoKTsKIG91dDoKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKHNiaS0+c19tYl9vZmZzZXRzKTsKLQkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwotCX0KKwlrZnJlZShzYmktPnNfbWJfb2Zmc2V0cyk7CisJc2JpLT5zX21iX29mZnNldHMgPSBOVUxMOworCWtmcmVlKHNiaS0+c19tYl9tYXhzKTsKKwlzYmktPnNfbWJfbWF4cyA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjYwMiwxMSArMjYyMSwxMyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2lzc3VlX2Rpc2NhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLCBleHQ0X2dycGJsa190IGJsb2NrLCBpbnQgY291bnQpCisJCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwgZXh0NF9ncnBibGtfdCBjbHVzdGVyLCBpbnQgY291bnQpCiB7CiAJZXh0NF9mc2Jsa190IGRpc2NhcmRfYmxvY2s7CiAKLQlkaXNjYXJkX2Jsb2NrID0gYmxvY2sgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7CisJZGlzY2FyZF9ibG9jayA9IChFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgY2x1c3RlcikgKworCQkJIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGJsb2NrX2dyb3VwKSk7CisJY291bnQgPSBFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgY291bnQpOwogCXRyYWNlX2V4dDRfZGlzY2FyZF9ibG9ja3Moc2IsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKSBkaXNjYXJkX2Jsb2NrLCBjb3VudCk7CiAJcmV0dXJuIHNiX2lzc3VlX2Rpc2NhcmQoc2IsIGRpc2NhcmRfYmxvY2ssIGNvdW50LCBHRlBfTk9GUywgMCk7CkBAIC0yNjMzLDcgKzI2NTQsNyBAQAogCiAJCWlmICh0ZXN0X29wdChzYiwgRElTQ0FSRCkpCiAJCQlleHQ0X2lzc3VlX2Rpc2NhcmQoc2IsIGVudHJ5LT5ncm91cCwKLQkJCQkJICAgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKKwkJCQkJICAgZW50cnktPnN0YXJ0X2NsdXN0ZXIsIGVudHJ5LT5jb3VudCk7CiAKIAkJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBlbnRyeS0+Z3JvdXAsICZlNGIpOwogCQkvKiB3ZSBleHBlY3QgdG8gZmluZCBleGlzdGluZyBidWRkeSBiZWNhdXNlIGl0J3MgcGlubmVkICovCkBAIC0yNjQ2LDcgKzI2NjcsNyBAQAogCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGVudHJ5LT5ncm91cCk7CiAJCS8qIFRha2UgaXQgb3V0IG9mIHBlciBncm91cCByYiB0cmVlICovCiAJCXJiX2VyYXNlKCZlbnRyeS0+bm9kZSwgJihkYi0+YmJfZnJlZV9yb290KSk7Ci0JCW1iX2ZyZWVfYmxvY2tzKE5VTEwsICZlNGIsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CisJCW1iX2ZyZWVfYmxvY2tzKE5VTEwsICZlNGIsIGVudHJ5LT5zdGFydF9jbHVzdGVyLCBlbnRyeS0+Y291bnQpOwogCiAJCS8qCiAJCSAqIENsZWFyIHRoZSB0cmltbWVkIGZsYWcgZm9yIHRoZSBncm91cCBzbyB0aGF0IHRoZSBuZXh0CkBAIC0yNzUyLDcgKzI3NzMsNyBAQAogICovCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAogZXh0NF9tYl9tYXJrX2Rpc2tzcGFjZV91c2VkKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCi0JCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzKQorCQkJCWhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGludCByZXNlcnZfY2xzdHJzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CkBAIC0yNzgzLDcgKzI4MDQsNyBAQAogCQlnb3RvIG91dF9lcnI7CiAKIAlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAldSglZClcbiIsIGFjLT5hY19iX2V4LmZlX2dyb3VwLAotCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkpOworCQkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzKHNiLCBnZHApKTsKIAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RwX2JoKTsKIAlpZiAoZXJyKQpAQCAtMjc5MSw3ICsyODEyLDcgQEAKIAogCWJsb2NrID0gZXh0NF9ncnBfb2Zmc190b19ibG9jayhzYiwgJmFjLT5hY19iX2V4KTsKIAotCWxlbiA9IGFjLT5hY19iX2V4LmZlX2xlbjsKKwlsZW4gPSBFWFQ0X0MyQihzYmksIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc2JpLCBibG9jaywgbGVuKSkgewogCQlleHQ0X2Vycm9yKHNiLCAiQWxsb2NhdGluZyBibG9ja3MgJWxsdS0lbGx1IHdoaWNoIG92ZXJsYXAgIgogCQkJICAgImZzIG1ldGFkYXRhXG4iLCBibG9jaywgYmxvY2srbGVuKTsKQEAgLTI4MjMsMjggKzI4NDQsMjkgQEAKIAkJICAgICAgYWMtPmFjX2JfZXguZmVfbGVuKTsKIAlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0JMT0NLX1VOSU5JVCk7Ci0JCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLAotCQkJCQlleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsCi0JCQkJCWFjLT5hY19iX2V4LmZlX2dyb3VwLCBnZHApKTsKKwkJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLAorCQkJCQkgICAgIGV4dDRfZnJlZV9jbHVzdGVyc19hZnRlcl9pbml0KHNiLAorCQkJCQkJYWMtPmFjX2JfZXguZmVfZ3JvdXAsIGdkcCkpOwogCX0KLQlsZW4gPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSAtIGFjLT5hY19iX2V4LmZlX2xlbjsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgbGVuKTsKKwlsZW4gPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCkgLSBhYy0+YWNfYl9leC5mZV9sZW47CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCBsZW4pOwogCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwLCBnZHApOwogCiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGFjLT5hY19iX2V4LmZlX2xlbik7CisJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJLyoKIAkgKiBOb3cgcmVkdWNlIHRoZSBkaXJ0eSBibG9jayBjb3VudCBhbHNvLiBTaG91bGQgbm90IGdvIG5lZ2F0aXZlCiAJICovCiAJaWYgKCEoYWMtPmFjX2ZsYWdzICYgRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRCkpCiAJCS8qIHJlbGVhc2UgYWxsIHRoZSByZXNlcnZlZCBibG9ja3MgaWYgbm9uIGRlbGFsbG9jICovCi0JCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsIHJlc2Vydl9ibGtzKTsKKwkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAorCQkJCSAgIHJlc2Vydl9jbHN0cnMpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwKIAkJCQkJCQkgIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKIAkJYXRvbWljX3N1YihhYy0+YWNfYl9leC5mZV9sZW4sCi0JCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaXRtYXBfYmgpOwpAQCAtMjg4Niw2ICsyOTA4LDcgQEAKIGV4dDRfbWJfbm9ybWFsaXplX3JlcXVlc3Qoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYywKIAkJCQlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgKmFyKQogeworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoYWMtPmFjX3NiKTsKIAlpbnQgYnNiaXRzLCBtYXg7CiAJZXh0NF9sYmxrX3QgZW5kOwogCWxvZmZfdCBzaXplLCBvcmlnX3NpemUsIHN0YXJ0X29mZjsKQEAgLTI5MTYsNyArMjkzOSw3IEBACiAKIAkvKiBmaXJzdCwgbGV0J3MgbGVhcm4gYWN0dWFsIGZpbGUgc2l6ZQogCSAqIGdpdmVuIGN1cnJlbnQgcmVxdWVzdCBpcyBhbGxvY2F0ZWQgKi8KLQlzaXplID0gYWMtPmFjX29fZXguZmVfbG9naWNhbCArIGFjLT5hY19vX2V4LmZlX2xlbjsKKwlzaXplID0gYWMtPmFjX29fZXguZmVfbG9naWNhbCArIEVYVDRfQzJCKHNiaSwgYWMtPmFjX29fZXguZmVfbGVuKTsKIAlzaXplID0gc2l6ZSA8PCBic2JpdHM7CiAJaWYgKHNpemUgPCBpX3NpemVfcmVhZChhYy0+YWNfaW5vZGUpKQogCQlzaXplID0gaV9zaXplX3JlYWQoYWMtPmFjX2lub2RlKTsKQEAgLTI5ODgsNyArMzAxMSw4IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBhX2VuZCA9IHBhLT5wYV9sc3RhcnQgKyBwYS0+cGFfbGVuOworCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgRVhUNF9DMkIoRVhUNF9TQihhYy0+YWNfc2IpLAorCQkJCQkJICBwYS0+cGFfbGVuKTsKIAogCQkvKiBQQSBtdXN0IG5vdCBvdmVybGFwIG9yaWdpbmFsIHJlcXVlc3QgKi8KIAkJQlVHX09OKCEoYWMtPmFjX29fZXguZmVfbG9naWNhbCA+PSBwYV9lbmQgfHwKQEAgLTMwMTgsOSArMzA0MiwxMSBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwYSwgJmVpLT5pX3ByZWFsbG9jX2xpc3QsIHBhX2lub2RlX2xpc3QpIHsKIAkJZXh0NF9sYmxrX3QgcGFfZW5kOworCiAJCXNwaW5fbG9jaygmcGEtPnBhX2xvY2spOwogCQlpZiAocGEtPnBhX2RlbGV0ZWQgPT0gMCkgewotCQkJcGFfZW5kID0gcGEtPnBhX2xzdGFydCArIHBhLT5wYV9sZW47CisJCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgRVhUNF9DMkIoRVhUNF9TQihhYy0+YWNfc2IpLAorCQkJCQkJCSAgcGEtPnBhX2xlbik7CiAJCQlCVUdfT04oIShzdGFydCA+PSBwYV9lbmQgfHwgZW5kIDw9IHBhLT5wYV9sc3RhcnQpKTsKIAkJfQogCQlzcGluX3VubG9jaygmcGEtPnBhX2xvY2spOwpAQCAtMzAzNiwxNCArMzA2MiwxNCBAQAogCX0KIAlCVUdfT04oc3RhcnQgKyBzaXplIDw9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgJiYKIAkJCXN0YXJ0ID4gYWMtPmFjX29fZXguZmVfbG9naWNhbCk7Ci0JQlVHX09OKHNpemUgPD0gMCB8fCBzaXplID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKGFjLT5hY19zYikpOworCUJVR19PTihzaXplIDw9IDAgfHwgc2l6ZSA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKGFjLT5hY19zYikpOwogCiAJLyogbm93IHByZXBhcmUgZ29hbCByZXF1ZXN0ICovCiAKIAkvKiBYWFg6IGlzIGl0IGJldHRlciB0byBhbGlnbiBibG9ja3MgV1JUIHRvIGxvZ2ljYWwKIAkgKiBwbGFjZW1lbnQgb3Igc2F0aXNmeSBiaWcgcmVxdWVzdCBhcyBpcyAqLwogCWFjLT5hY19nX2V4LmZlX2xvZ2ljYWwgPSBzdGFydDsKLQlhYy0+YWNfZ19leC5mZV9sZW4gPSBzaXplOworCWFjLT5hY19nX2V4LmZlX2xlbiA9IEVYVDRfTlVNX0IyQyhzYmksIHNpemUpOwogCiAJLyogZGVmaW5lIGdvYWwgc3RhcnQgaW4gb3JkZXIgdG8gbWVyZ2UgKi8KIAlpZiAoYXItPnByaWdodCAmJiAoYXItPmxyaWdodCA9PSAoc3RhcnQgKyBzaXplKSkpIHsKQEAgLTMxMTIsMTQgKzMxMzgsMTYgQEAKIHN0YXRpYyB2b2lkIGV4dDRfbWJfdXNlX2lub2RlX3BhKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCiAJCQkJc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKQogeworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoYWMtPmFjX3NiKTsKIAlleHQ0X2ZzYmxrX3Qgc3RhcnQ7CiAJZXh0NF9mc2Jsa190IGVuZDsKIAlpbnQgbGVuOwogCiAJLyogZm91bmQgcHJlYWxsb2NhdGVkIGJsb2NrcywgdXNlIHRoZW0gKi8KIAlzdGFydCA9IHBhLT5wYV9wc3RhcnQgKyAoYWMtPmFjX29fZXguZmVfbG9naWNhbCAtIHBhLT5wYV9sc3RhcnQpOwotCWVuZCA9IG1pbihwYS0+cGFfcHN0YXJ0ICsgcGEtPnBhX2xlbiwgc3RhcnQgKyBhYy0+YWNfb19leC5mZV9sZW4pOwotCWxlbiA9IGVuZCAtIHN0YXJ0OworCWVuZCA9IG1pbihwYS0+cGFfcHN0YXJ0ICsgRVhUNF9DMkIoc2JpLCBwYS0+cGFfbGVuKSwKKwkJICBzdGFydCArIEVYVDRfQzJCKHNiaSwgYWMtPmFjX29fZXguZmVfbGVuKSk7CisJbGVuID0gRVhUNF9OVU1fQjJDKHNiaSwgZW5kIC0gc3RhcnQpOwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoYWMtPmFjX3NiLCBzdGFydCwgJmFjLT5hY19iX2V4LmZlX2dyb3VwLAogCQkJCQkmYWMtPmFjX2JfZXguZmVfc3RhcnQpOwogCWFjLT5hY19iX2V4LmZlX2xlbiA9IGxlbjsKQEAgLTMxMjcsNyArMzE1NSw3IEBACiAJYWMtPmFjX3BhID0gcGE7CiAKIAlCVUdfT04oc3RhcnQgPCBwYS0+cGFfcHN0YXJ0KTsKLQlCVUdfT04oc3RhcnQgKyBsZW4gPiBwYS0+cGFfcHN0YXJ0ICsgcGEtPnBhX2xlbik7CisJQlVHX09OKGVuZCA+IHBhLT5wYV9wc3RhcnQgKyBFWFQ0X0MyQihzYmksIHBhLT5wYV9sZW4pKTsKIAlCVUdfT04ocGEtPnBhX2ZyZWUgPCBsZW4pOwogCXBhLT5wYV9mcmVlIC09IGxlbjsKIApAQCAtMzE5Myw2ICszMjIxLDcgQEAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CiBleHQ0X21iX3VzZV9wcmVhbGxvY2F0ZWQoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGFjLT5hY19zYik7CiAJaW50IG9yZGVyLCBpOwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGFjLT5hY19pbm9kZSk7CiAJc3RydWN0IGV4dDRfbG9jYWxpdHlfZ3JvdXAgKmxnOwpAQCAtMzIxMCwxMiArMzIzOSwxNCBAQAogCQkvKiBhbGwgZmllbGRzIGluIHRoaXMgY29uZGl0aW9uIGRvbid0IGNoYW5nZSwKIAkJICogc28gd2UgY2FuIHNraXAgbG9ja2luZyBmb3IgdGhlbSAqLwogCQlpZiAoYWMtPmFjX29fZXguZmVfbG9naWNhbCA8IHBhLT5wYV9sc3RhcnQgfHwKLQkJCWFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPj0gcGEtPnBhX2xzdGFydCArIHBhLT5wYV9sZW4pCisJCSAgICBhYy0+YWNfb19leC5mZV9sb2dpY2FsID49IChwYS0+cGFfbHN0YXJ0ICsKKwkJCQkJICAgICAgIEVYVDRfQzJCKHNiaSwgcGEtPnBhX2xlbikpKQogCQkJY29udGludWU7CiAKIAkJLyogbm9uLWV4dGVudCBmaWxlcyBjYW4ndCBoYXZlIHBoeXNpY2FsIGJsb2NrcyBwYXN0IDJeMzIgKi8KIAkJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoYWMtPmFjX2lub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSAmJgotCQkJcGEtPnBhX3BzdGFydCArIHBhLT5wYV9sZW4gPiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpCisJCSAgICAocGEtPnBhX3BzdGFydCArIEVYVDRfQzJCKHNiaSwgcGEtPnBhX2xlbikgPgorCQkgICAgIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpCiAJCQljb250aW51ZTsKIAogCQkvKiBmb3VuZCBwcmVhbGxvY2F0ZWQgYmxvY2tzLCB1c2UgdGhlbSAqLwpAQCAtMzI5MSw3ICszMzIyLDcgQEAKIAogCXdoaWxlIChuKSB7CiAJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKLQkJZXh0NF9zZXRfYml0cyhiaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CisJCWV4dDRfc2V0X2JpdHMoYml0bWFwLCBlbnRyeS0+c3RhcnRfY2x1c3RlciwgZW50cnktPmNvdW50KTsKIAkJbiA9IHJiX25leHQobik7CiAJfQogCXJldHVybjsKQEAgLTMzMTIsNyArMzM0Myw2IEBACiAJZXh0NF9ncm91cF90IGdyb3VwbnI7CiAJZXh0NF9ncnBibGtfdCBzdGFydDsKIAlpbnQgcHJlYWxsb2NhdGVkID0gMDsKLQlpbnQgY291bnQgPSAwOwogCWludCBsZW47CiAKIAkvKiBhbGwgZm9ybSBvZiBwcmVhbGxvY2F0aW9uIGRpc2NhcmRzIGZpcnN0IGxvYWQgZ3JvdXAsCkBAIC0zMzM1LDcgKzMzNjUsNiBAQAogCQlCVUdfT04oZ3JvdXBuciAhPSBncm91cCk7CiAJCWV4dDRfc2V0X2JpdHMoYml0bWFwLCBzdGFydCwgbGVuKTsKIAkJcHJlYWxsb2NhdGVkICs9IGxlbjsKLQkJY291bnQrKzsKIAl9CiAJbWJfZGVidWcoMSwgInByZWxsb2NhdGVkICV1IGZvciBncm91cCAldVxuIiwgcHJlYWxsb2NhdGVkLCBncm91cCk7CiB9CkBAIC0zNDEyLDYgKzM0NDEsNyBAQAogZXh0NF9tYl9uZXdfaW5vZGVfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gYWMtPmFjX3NiOworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7CkBAIC0zNDQzLDE2ICszNDczLDE4IEBACiAJCXdpbmwgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsIC0gYWMtPmFjX2dfZXguZmVfbG9naWNhbDsKIAogCQkvKiBhbHNvLCB3ZSBzaG91bGQgY292ZXIgd2hvbGUgb3JpZ2luYWwgcmVxdWVzdCAqLwotCQl3aW5zID0gYWMtPmFjX2JfZXguZmVfbGVuIC0gYWMtPmFjX29fZXguZmVfbGVuOworCQl3aW5zID0gRVhUNF9DMkIoc2JpLCBhYy0+YWNfYl9leC5mZV9sZW4gLSBhYy0+YWNfb19leC5mZV9sZW4pOwogCiAJCS8qIHRoZSBzbWFsbGVzdCBvbmUgZGVmaW5lcyByZWFsIHdpbmRvdyAqLwogCQl3aW4gPSBtaW4od2lubCwgd2lucyk7CiAKLQkJb2ZmcyA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgJSBhYy0+YWNfYl9leC5mZV9sZW47CisJCW9mZnMgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICUKKwkJCUVYVDRfQzJCKHNiaSwgYWMtPmFjX2JfZXguZmVfbGVuKTsKIAkJaWYgKG9mZnMgJiYgb2ZmcyA8IHdpbikKIAkJCXdpbiA9IG9mZnM7CiAKLQkJYWMtPmFjX2JfZXguZmVfbG9naWNhbCA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgLSB3aW47CisJCWFjLT5hY19iX2V4LmZlX2xvZ2ljYWwgPSBhYy0+YWNfb19leC5mZV9sb2dpY2FsIC0KKwkJCUVYVDRfQjJDKHNiaSwgd2luKTsKIAkJQlVHX09OKGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPCBhYy0+YWNfYl9leC5mZV9sb2dpY2FsKTsKIAkJQlVHX09OKGFjLT5hY19vX2V4LmZlX2xlbiA+IGFjLT5hY19iX2V4LmZlX2xlbik7CiAJfQpAQCAtMzQ3Nyw3ICszNTA5LDcgQEAKIAl0cmFjZV9leHQ0X21iX25ld19pbm9kZV9wYShhYywgcGEpOwogCiAJZXh0NF9tYl91c2VfaW5vZGVfcGEoYWMsIHBhKTsKLQlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmRVhUNF9TQihzYiktPnNfbWJfcHJlYWxsb2NhdGVkKTsKKwlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmc2JpLT5zX21iX3ByZWFsbG9jYXRlZCk7CiAKIAllaSA9IEVYVDRfSShhYy0+YWNfaW5vZGUpOwogCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKQEAgLTM1OTIsNyArMzYyNCw3IEBACiAKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKLQlncnBfYmxrX3N0YXJ0ID0gcGEtPnBhX3BzdGFydCAtIGJpdDsKKwlncnBfYmxrX3N0YXJ0ID0gcGEtPnBhX3BzdGFydCAtIEVYVDRfQzJCKHNiaSwgYml0KTsKIAlCVUdfT04oZ3JvdXAgIT0gZTRiLT5iZF9ncm91cCAmJiBwYS0+cGFfbGVuICE9IDApOwogCWVuZCA9IGJpdCArIHBhLT5wYV9sZW47CiAKQEAgLTM2MDcsNyArMzYzOSw4IEBACiAJCWZyZWUgKz0gbmV4dCAtIGJpdDsKIAogCQl0cmFjZV9leHQ0X21iYWxsb2NfZGlzY2FyZChzYiwgTlVMTCwgZ3JvdXAsIGJpdCwgbmV4dCAtIGJpdCk7Ci0JCXRyYWNlX2V4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYShwYSwgZ3JwX2Jsa19zdGFydCArIGJpdCwKKwkJdHJhY2VfZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhKHBhLCAoZ3JwX2Jsa19zdGFydCArCisJCQkJCQkgICAgRVhUNF9DMkIoc2JpLCBiaXQpKSwKIAkJCQkJICAgICAgIG5leHQgLSBiaXQpOwogCQltYl9mcmVlX2Jsb2NrcyhwYS0+cGFfaW5vZGUsIGU0YiwgYml0LCBuZXh0IC0gYml0KTsKIAkJYml0ID0gbmV4dCArIDE7CkBAIC0zNjkwLDcgKzM3MjMsNyBAQAogCX0KIAogCWlmIChuZWVkZWQgPT0gMCkKLQkJbmVlZGVkID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSArIDE7CisJCW5lZWRlZCA9IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSArIDE7CiAKIAlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiByZXBlYXQ6CkBAIC0zOTU4LDcgKzM5OTEsNyBAQAogCWlmICh1bmxpa2VseShhYy0+YWNfZmxhZ3MgJiBFWFQ0X01CX0hJTlRfR09BTF9PTkxZKSkKIAkJcmV0dXJuOwogCi0Jc2l6ZSA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgKyBhYy0+YWNfb19leC5mZV9sZW47CisJc2l6ZSA9IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgKyBFWFQ0X0MyQihzYmksIGFjLT5hY19vX2V4LmZlX2xlbik7CiAJaXNpemUgPSAoaV9zaXplX3JlYWQoYWMtPmFjX2lub2RlKSArIGFjLT5hY19zYi0+c19ibG9ja3NpemUgLSAxKQogCQk+PiBic2JpdHM7CiAKQEAgLTM5NjksNiArNDAwMiwxMSBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKHNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA8PSAwKSB7CisJCWFjLT5hY19mbGFncyB8PSBFWFQ0X01CX1NUUkVBTV9BTExPQzsKKwkJcmV0dXJuOworCX0KKwogCS8qIGRvbid0IHVzZSBncm91cCBhbGxvY2F0aW9uIGZvciBsYXJnZSBmaWxlcyAqLwogCXNpemUgPSBtYXgoc2l6ZSwgaXNpemUpOwogCWlmIChzaXplID4gc2JpLT5zX21iX3N0cmVhbV9yZXF1ZXN0KSB7CkBAIC00MDA3LDggKzQwNDUsOCBAQAogCWxlbiA9IGFyLT5sZW47CiAKIAkvKiBqdXN0IGEgZGlydHkgaGFjayB0byBmaWx0ZXIgdG9vIGJpZyByZXF1ZXN0cyAgKi8KLQlpZiAobGVuID49IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxMCkKLQkJbGVuID0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEwOworCWlmIChsZW4gPj0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpIC0gMTApCisJCWxlbiA9IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSAtIDEwOwogCiAJLyogc3RhcnQgc2VhcmNoaW5nIGZyb20gdGhlIGdvYWwgKi8KIAlnb2FsID0gYXItPmdvYWw7CkBAIC00MDE5LDE4ICs0MDU3LDE1IEBACiAKIAkvKiBzZXQgdXAgYWxsb2NhdGlvbiBnb2FscyAqLwogCW1lbXNldChhYywgMCwgc2l6ZW9mKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCkpOwotCWFjLT5hY19iX2V4LmZlX2xvZ2ljYWwgPSBhci0+bG9naWNhbDsKKwlhYy0+YWNfYl9leC5mZV9sb2dpY2FsID0gYXItPmxvZ2ljYWwgJiB+KHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CiAJYWMtPmFjX3N0YXR1cyA9IEFDX1NUQVRVU19DT05USU5VRTsKIAlhYy0+YWNfc2IgPSBzYjsKIAlhYy0+YWNfaW5vZGUgPSBhci0+aW5vZGU7Ci0JYWMtPmFjX29fZXguZmVfbG9naWNhbCA9IGFyLT5sb2dpY2FsOworCWFjLT5hY19vX2V4LmZlX2xvZ2ljYWwgPSBhYy0+YWNfYl9leC5mZV9sb2dpY2FsOwogCWFjLT5hY19vX2V4LmZlX2dyb3VwID0gZ3JvdXA7CiAJYWMtPmFjX29fZXguZmVfc3RhcnQgPSBibG9jazsKIAlhYy0+YWNfb19leC5mZV9sZW4gPSBsZW47Ci0JYWMtPmFjX2dfZXguZmVfbG9naWNhbCA9IGFyLT5sb2dpY2FsOwotCWFjLT5hY19nX2V4LmZlX2dyb3VwID0gZ3JvdXA7Ci0JYWMtPmFjX2dfZXguZmVfc3RhcnQgPSBibG9jazsKLQlhYy0+YWNfZ19leC5mZV9sZW4gPSBsZW47CisJYWMtPmFjX2dfZXggPSBhYy0+YWNfb19leDsKIAlhYy0+YWNfZmxhZ3MgPSBhci0+ZmxhZ3M7CiAKIAkvKiB3ZSBoYXZlIHRvIGRlZmluZSBjb250ZXh0OiB3ZSdsbCB3ZSB3b3JrIHdpdGggYSBmaWxlIG9yCkBAIC00MTgyLDEzICs0MjE3LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9tYl9yZWxlYXNlX2NvbnRleHQoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGFjLT5hY19zYik7CiAJc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhID0gYWMtPmFjX3BhOwogCWlmIChwYSkgewogCQlpZiAocGEtPnBhX3R5cGUgPT0gTUJfR1JPVVBfUEEpIHsKIAkJCS8qIHNlZSBjb21tZW50IGluIGV4dDRfbWJfdXNlX2dyb3VwX3BhKCkgKi8KIAkJCXNwaW5fbG9jaygmcGEtPnBhX2xvY2spOwotCQkJcGEtPnBhX3BzdGFydCArPSBhYy0+YWNfYl9leC5mZV9sZW47Ci0JCQlwYS0+cGFfbHN0YXJ0ICs9IGFjLT5hY19iX2V4LmZlX2xlbjsKKwkJCXBhLT5wYV9wc3RhcnQgKz0gRVhUNF9DMkIoc2JpLCBhYy0+YWNfYl9leC5mZV9sZW4pOworCQkJcGEtPnBhX2xzdGFydCArPSBFWFQ0X0MyQihzYmksIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJCQlwYS0+cGFfZnJlZSAtPSBhYy0+YWNfYl9leC5mZV9sZW47CiAJCQlwYS0+cGFfbGVuIC09IGFjLT5hY19iX2V4LmZlX2xlbjsKIAkJCXNwaW5fdW5sb2NrKCZwYS0+cGFfbG9jayk7CkBAIC00MjQ5LDEzICs0Mjg1LDE3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlleHQ0X2ZzYmxrX3QgYmxvY2sgPSAwOwogCXVuc2lnbmVkIGludCBpbnF1b3RhID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVzZXJ2X2Jsa3MgPSAwOworCXVuc2lnbmVkIGludCByZXNlcnZfY2xzdHJzID0gMDsKIAogCXNiID0gYXItPmlub2RlLT5pX3NiOwogCXNiaSA9IEVYVDRfU0Ioc2IpOwogCiAJdHJhY2VfZXh0NF9yZXF1ZXN0X2Jsb2Nrcyhhcik7CiAKKwkvKiBBbGxvdyB0byB1c2Ugc3VwZXJ1c2VyIHJlc2VydmF0aW9uIGZvciBxdW90YSBmaWxlICovCisJaWYgKElTX05PUVVPVEEoYXItPmlub2RlKSkKKwkJYXItPmZsYWdzIHw9IEVYVDRfTUJfVVNFX1JPT1RfQkxPQ0tTOworCiAJLyoKIAkgKiBGb3IgZGVsYXllZCBhbGxvY2F0aW9uLCB3ZSBjb3VsZCBza2lwIHRoZSBFTk9TUEMgYW5kCiAJICogRURRVU9UIGNoZWNrLCBhcyBibG9ja3MgYW5kIHF1b3RhcyBoYXZlIGJlZW4gYWxyZWFkeQpAQCAtNDI2OSw3ICs0MzA5LDcgQEAKIAkJICogYW5kIHZlcmlmeSBhbGxvY2F0aW9uIGRvZXNuJ3QgZXhjZWVkIHRoZSBxdW90YSBsaW1pdHMuCiAJCSAqLwogCQl3aGlsZSAoYXItPmxlbiAmJgotCQkJZXh0NF9jbGFpbV9mcmVlX2Jsb2NrcyhzYmksIGFyLT5sZW4sIGFyLT5mbGFncykpIHsKKwkJCWV4dDRfY2xhaW1fZnJlZV9jbHVzdGVycyhzYmksIGFyLT5sZW4sIGFyLT5mbGFncykpIHsKIAogCQkJLyogbGV0IG90aGVycyB0byBmcmVlIHRoZSBzcGFjZSAqLwogCQkJeWllbGQoKTsKQEAgLTQyNzksMTIgKzQzMTksMTQgQEAKIAkJCSplcnJwID0gLUVOT1NQQzsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXJlc2Vydl9ibGtzID0gYXItPmxlbjsKKwkJcmVzZXJ2X2Nsc3RycyA9IGFyLT5sZW47CiAJCWlmIChhci0+ZmxhZ3MgJiBFWFQ0X01CX1VTRV9ST09UX0JMT0NLUykgewotCQkJZHF1b3RfYWxsb2NfYmxvY2tfbm9mYWlsKGFyLT5pbm9kZSwgYXItPmxlbik7CisJCQlkcXVvdF9hbGxvY19ibG9ja19ub2ZhaWwoYXItPmlub2RlLAorCQkJCQkJIEVYVDRfQzJCKHNiaSwgYXItPmxlbikpOwogCQl9IGVsc2UgewogCQkJd2hpbGUgKGFyLT5sZW4gJiYKLQkJCQlkcXVvdF9hbGxvY19ibG9jayhhci0+aW5vZGUsIGFyLT5sZW4pKSB7CisJCQkJZHF1b3RfYWxsb2NfYmxvY2soYXItPmlub2RlLAorCQkJCQkJICBFWFQ0X0MyQihzYmksIGFyLT5sZW4pKSkgewogCiAJCQkJYXItPmZsYWdzIHw9IEVYVDRfTUJfSElOVF9OT1BSRUFMTE9DOwogCQkJCWFyLT5sZW4tLTsKQEAgLTQzMjgsNyArNDM3MCw3IEBACiAJCQlleHQ0X21iX25ld19wcmVhbGxvY2F0aW9uKGFjKTsKIAl9CiAJaWYgKGxpa2VseShhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCkpIHsKLQkJKmVycnAgPSBleHQ0X21iX21hcmtfZGlza3NwYWNlX3VzZWQoYWMsIGhhbmRsZSwgcmVzZXJ2X2Jsa3MpOworCQkqZXJycCA9IGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChhYywgaGFuZGxlLCByZXNlcnZfY2xzdHJzKTsKIAkJaWYgKCplcnJwID09IC1FQUdBSU4pIHsKIAkJCS8qCiAJCQkgKiBkcm9wIHRoZSByZWZlcmVuY2UgdGhhdCB3ZSB0b29rCkBAIC00MzY0LDEzICs0NDA2LDEzIEBACiAJaWYgKGFjKQogCQlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9hY19jYWNoZXAsIGFjKTsKIAlpZiAoaW5xdW90YSAmJiBhci0+bGVuIDwgaW5xdW90YSkKLQkJZHF1b3RfZnJlZV9ibG9jayhhci0+aW5vZGUsIGlucXVvdGEgLSBhci0+bGVuKTsKKwkJZHF1b3RfZnJlZV9ibG9jayhhci0+aW5vZGUsIEVYVDRfQzJCKHNiaSwgaW5xdW90YSAtIGFyLT5sZW4pKTsKIAlpZiAoIWFyLT5sZW4pIHsKIAkJaWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoYXItPmlub2RlLAogCQkJCQkgICBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEKSkKIAkJCS8qIHJlbGVhc2UgYWxsIHRoZSByZXNlcnZlZCBibG9ja3MgaWYgbm9uIGRlbGFsbG9jICovCi0JCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAotCQkJCQkJcmVzZXJ2X2Jsa3MpOworCQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyLAorCQkJCQkJcmVzZXJ2X2Nsc3Rycyk7CiAJfQogCiAJdHJhY2VfZXh0NF9hbGxvY2F0ZV9ibG9ja3MoYXIsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spOwpAQCAtNDM4OCw3ICs0NDMwLDcgQEAKIHsKIAlpZiAoKGVudHJ5MS0+dF90aWQgPT0gZW50cnkyLT50X3RpZCkgJiYKIAkgICAgKGVudHJ5MS0+Z3JvdXAgPT0gZW50cnkyLT5ncm91cCkgJiYKLQkgICAgKChlbnRyeTEtPnN0YXJ0X2JsayArIGVudHJ5MS0+Y291bnQpID09IGVudHJ5Mi0+c3RhcnRfYmxrKSkKKwkgICAgKChlbnRyeTEtPnN0YXJ0X2NsdXN0ZXIgKyBlbnRyeTEtPmNvdW50KSA9PSBlbnRyeTItPnN0YXJ0X2NsdXN0ZXIpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQzOTgsNyArNDQ0MCw3IEBACiAJCSAgICAgIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqbmV3X2VudHJ5KQogewogCWV4dDRfZ3JvdXBfdCBncm91cCA9IGU0Yi0+YmRfZ3JvdXA7Ci0JZXh0NF9ncnBibGtfdCBibG9jazsKKwlleHQ0X2dycGJsa190IGNsdXN0ZXI7CiAJc3RydWN0IGV4dDRfZnJlZV9kYXRhICplbnRyeTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpkYiA9IGU0Yi0+YmRfaW5mbzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKQEAgLTQ0MTEsNyArNDQ1Myw3IEBACiAJQlVHX09OKGU0Yi0+YmRfYnVkZHlfcGFnZSA9PSBOVUxMKTsKIAogCW5ld19ub2RlID0gJm5ld19lbnRyeS0+bm9kZTsKLQlibG9jayA9IG5ld19lbnRyeS0+c3RhcnRfYmxrOworCWNsdXN0ZXIgPSBuZXdfZW50cnktPnN0YXJ0X2NsdXN0ZXI7CiAKIAlpZiAoISpuKSB7CiAJCS8qIGZpcnN0IGZyZWUgYmxvY2sgZXhlbnQuIFdlIG5lZWQgdG8KQEAgLTQ0MjUsMTMgKzQ0NjcsMTQgQEAKIAl3aGlsZSAoKm4pIHsKIAkJcGFyZW50ID0gKm47CiAJCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOwotCQlpZiAoYmxvY2sgPCBlbnRyeS0+c3RhcnRfYmxrKQorCQlpZiAoY2x1c3RlciA8IGVudHJ5LT5zdGFydF9jbHVzdGVyKQogCQkJbiA9ICYoKm4pLT5yYl9sZWZ0OwotCQllbHNlIGlmIChibG9jayA+PSAoZW50cnktPnN0YXJ0X2JsayArIGVudHJ5LT5jb3VudCkpCisJCWVsc2UgaWYgKGNsdXN0ZXIgPj0gKGVudHJ5LT5zdGFydF9jbHVzdGVyICsgZW50cnktPmNvdW50KSkKIAkJCW4gPSAmKCpuKS0+cmJfcmlnaHQ7CiAJCWVsc2UgewogCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgMCwKLQkJCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCkgKyBibG9jaywKKwkJCQlleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCkgKworCQkJCUVYVDRfQzJCKHNiaSwgY2x1c3RlciksCiAJCQkJIkJsb2NrIGFscmVhZHkgb24gdG8tYmUtZnJlZWQgbGlzdCIpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTQ0NDUsNyArNDQ4OCw3IEBACiAJaWYgKG5vZGUpIHsKIAkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOwogCQlpZiAoY2FuX21lcmdlKGVudHJ5LCBuZXdfZW50cnkpKSB7Ci0JCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGVudHJ5LT5zdGFydF9ibGs7CisJCQluZXdfZW50cnktPnN0YXJ0X2NsdXN0ZXIgPSBlbnRyeS0+c3RhcnRfY2x1c3RlcjsKIAkJCW5ld19lbnRyeS0+Y291bnQgKz0gZW50cnktPmNvdW50OwogCQkJcmJfZXJhc2Uobm9kZSwgJihkYi0+YmJfZnJlZV9yb290KSk7CiAJCQlzcGluX2xvY2soJnNiaS0+c19tZF9sb2NrKTsKQEAgLTQ0OTYsNiArNDUzOSw3IEBACiAJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaTsKIAlzdHJ1Y3QgZXh0NF9idWRkeSBlNGI7CisJdW5zaWduZWQgaW50IGNvdW50X2NsdXN0ZXJzOwogCWludCBlcnIgPSAwOwogCWludCByZXQ7CiAKQEAgLTQ1NDQsNiArNDU4OCwzOCBAQAogCWlmICghZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoaW5vZGUpKQogCQlmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBOwogCisJLyoKKwkgKiBJZiB0aGUgZXh0ZW50IHRvIGJlIGZyZWVkIGRvZXMgbm90IGJlZ2luIG9uIGEgY2x1c3RlcgorCSAqIGJvdW5kYXJ5LCB3ZSBuZWVkIHRvIGRlYWwgd2l0aCBwYXJ0aWFsIGNsdXN0ZXJzIGF0IHRoZQorCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBleHRlbnQuICBOb3JtYWxseSB3ZSB3aWxsIGZyZWUKKwkgKiBibG9ja3MgYXQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIHVubGVzcyB3ZSBhcmUgZXhwbGljaXRseQorCSAqIHJlcXVlc3RlZCB0byBhdm9pZCBkb2luZyBzby4KKwkgKi8KKwlvdmVyZmxvdyA9IGJsb2NrICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKG92ZXJmbG93KSB7CisJCWlmIChmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0ZJUlNUX0NMVVNURVIpIHsKKwkJCW92ZXJmbG93ID0gc2JpLT5zX2NsdXN0ZXJfcmF0aW8gLSBvdmVyZmxvdzsKKwkJCWJsb2NrICs9IG92ZXJmbG93OworCQkJaWYgKGNvdW50ID4gb3ZlcmZsb3cpCisJCQkJY291bnQgLT0gb3ZlcmZsb3c7CisJCQllbHNlCisJCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYmxvY2sgLT0gb3ZlcmZsb3c7CisJCQljb3VudCArPSBvdmVyZmxvdzsKKwkJfQorCX0KKwlvdmVyZmxvdyA9IGNvdW50ICYgKHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gMSk7CisJaWYgKG92ZXJmbG93KSB7CisJCWlmIChmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9GUkVFX0xBU1RfQ0xVU1RFUikgeworCQkJaWYgKGNvdW50ID4gb3ZlcmZsb3cpCisJCQkJY291bnQgLT0gb3ZlcmZsb3c7CisJCQllbHNlCisJCQkJcmV0dXJuOworCQl9IGVsc2UKKwkJCWNvdW50ICs9IHNiaS0+c19jbHVzdGVyX3JhdGlvIC0gb3ZlcmZsb3c7CisJfQorCiBkb19tb3JlOgogCW92ZXJmbG93ID0gMDsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBibG9jaywgJmJsb2NrX2dyb3VwLCAmYml0KTsKQEAgLTQ1NTIsMTAgKzQ2MjgsMTIgQEAKIAkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGZyZWVpbmcgYmxvY2tzIGFjcm9zcyBhIGdyb3VwCiAJICogYm91bmRhcnkuCiAJICovCi0JaWYgKGJpdCArIGNvdW50ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgewotCQlvdmVyZmxvdyA9IGJpdCArIGNvdW50IC0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlpZiAoRVhUNF9DMkIoc2JpLCBiaXQpICsgY291bnQgPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSB7CisJCW92ZXJmbG93ID0gRVhUNF9DMkIoc2JpLCBiaXQpICsgY291bnQgLQorCQkJRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKIAkJY291bnQgLT0gb3ZlcmZsb3c7CiAJfQorCWNvdW50X2NsdXN0ZXJzID0gRVhUNF9CMkMoc2JpLCBjb3VudCk7CiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwogCWlmICghYml0bWFwX2JoKSB7CiAJCWVyciA9IC1FSU87CkBAIC00NTcwLDkgKzQ2NDgsOSBAQAogCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgYmxvY2ssIGNvdW50KSB8fAogCSAgICBpbl9yYW5nZShleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwgYmxvY2ssIGNvdW50KSB8fAogCSAgICBpbl9yYW5nZShibG9jaywgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKLQkJICAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkgfHwKKwkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAogCSAgICBpbl9yYW5nZShibG9jayArIGNvdW50IC0gMSwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKLQkJICAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpIHsKKwkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSkgewogCiAJCWV4dDRfZXJyb3Ioc2IsICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZSAtICIKIAkJCSAgICJCbG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKQEAgLTQ1OTcsMTEgKzQ2NzUsMTEgQEAKICNpZmRlZiBBR0dSRVNTSVZFX0NIRUNLCiAJewogCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudF9jbHVzdGVyczsgaSsrKQogCQkJQlVHX09OKCFtYl90ZXN0X2JpdChiaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpOwogCX0KICNlbmRpZgotCXRyYWNlX2V4dDRfbWJhbGxvY19mcmVlKHNiLCBpbm9kZSwgYmxvY2tfZ3JvdXAsIGJpdCwgY291bnQpOworCXRyYWNlX2V4dDRfbWJhbGxvY19mcmVlKHNiLCBpbm9kZSwgYmxvY2tfZ3JvdXAsIGJpdCwgY291bnRfY2x1c3RlcnMpOwogCiAJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBibG9ja19ncm91cCwgJmU0Yik7CiAJaWYgKGVycikKQEAgLTQ2MTgsMTMgKzQ2OTYsMTMgQEAKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJfQotCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGJpdDsKKwkJbmV3X2VudHJ5LT5zdGFydF9jbHVzdGVyID0gYml0OwogCQluZXdfZW50cnktPmdyb3VwICA9IGJsb2NrX2dyb3VwOwotCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CisJCW5ld19lbnRyeS0+Y291bnQgPSBjb3VudF9jbHVzdGVyczsKIAkJbmV3X2VudHJ5LT50X3RpZCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQ7CiAKIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7Ci0JCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnQpOworCQltYl9jbGVhcl9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBiaXQsIGNvdW50X2NsdXN0ZXJzKTsKIAkJZXh0NF9tYl9mcmVlX21ldGFkYXRhKGhhbmRsZSwgJmU0YiwgbmV3X2VudHJ5KTsKIAl9IGVsc2UgewogCQkvKiBuZWVkIHRvIHVwZGF0ZSBncm91cF9pbmZvLT5iYl9mcmVlIGFuZCBiaXRtYXAKQEAgLTQ2MzIsMjUgKzQ3MTAsMjkgQEAKIAkJICogdGhlbSB3aXRoIGdyb3VwIGxvY2tfaGVsZAogCQkgKi8KIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7Ci0JCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnQpOwotCQltYl9mcmVlX2Jsb2Nrcyhpbm9kZSwgJmU0YiwgYml0LCBjb3VudCk7CisJCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnRfY2x1c3RlcnMpOworCQltYl9mcmVlX2Jsb2Nrcyhpbm9kZSwgJmU0YiwgYml0LCBjb3VudF9jbHVzdGVycyk7CiAJfQogCi0JcmV0ID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkgKyBjb3VudDsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgcmV0KTsKKwlyZXQgPSBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCkgKyBjb3VudF9jbHVzdGVyczsKKwlleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnNfc2V0KHNiLCBnZHAsIHJldCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCk7CiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKKwlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlciwgY291bnRfY2x1c3RlcnMpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgYmxvY2tfZ3JvdXApOwotCQlhdG9taWNfYWRkKGNvdW50LCAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJYXRvbWljX2FkZChjb3VudF9jbHVzdGVycywKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXh0NF9tYl91bmxvYWRfYnVkZHkoJmU0Yik7CiAKIAlmcmVlZCArPSBjb3VudDsKIAorCWlmICghKGZsYWdzICYgRVhUNF9GUkVFX0JMT0NLU19OT19RVU9UX1VQREFURSkpCisJCWRxdW90X2ZyZWVfYmxvY2soaW5vZGUsIEVYVDRfQzJCKHNiaSwgY291bnRfY2x1c3RlcnMpKTsKKwogCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOwogCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKQEAgLTQ2NjksOCArNDc1MSw2IEBACiAJfQogCWV4dDRfbWFya19zdXBlcl9kaXJ0eShzYik7CiBlcnJvcl9yZXR1cm46Ci0JaWYgKGZyZWVkICYmICEoZmxhZ3MgJiBFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFKSkKLQkJZHF1b3RfZnJlZV9ibG9jayhpbm9kZSwgZnJlZWQpOwogCWJyZWxzZShiaXRtYXBfYmgpOwogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwogCXJldHVybjsKQEAgLTQ3NzgsMTYgKzQ4NTgsMTcgQEAKIAlleHQ0X2xvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKIAltYl9jbGVhcl9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBiaXQsIGNvdW50KTsKIAltYl9mcmVlX2Jsb2NrcyhOVUxMLCAmZTRiLCBiaXQsIGNvdW50KTsKLQlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKLQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGRlc2MsIGJsa19mcmVlX2NvdW50KTsKKwlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVycyhzYiwgZGVzYyk7CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZGVzYywgYmxrX2ZyZWVfY291bnQpOwogCWRlc2MtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBibG9ja19ncm91cCwgZGVzYyk7CiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGJsb2Nrc19mcmVlZCk7CisJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsCisJCQkgICBFWFQ0X0IyQyhzYmksIGJsb2Nrc19mcmVlZCkpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CiAJCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgYmxvY2tfZ3JvdXApOwotCQlhdG9taWNfYWRkKGJsb2Nrc19mcmVlZCwKLQkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MpOworCQlhdG9taWNfYWRkKEVYVDRfQjJDKHNiaSwgYmxvY2tzX2ZyZWVkKSwKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJfQogCiAJZXh0NF9tYl91bmxvYWRfYnVkZHkoJmU0Yik7CkBAIC00OTQ4LDcgKzUwMjksNyBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKIAlleHQ0X2dyb3VwX3QgZmlyc3RfZ3JvdXAsIGxhc3RfZ3JvdXA7CiAJZXh0NF9ncm91cF90IGdyb3VwLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKLQlleHQ0X2dycGJsa190IGNudCA9IDAsIGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrOworCWV4dDRfZ3JwYmxrX3QgY250ID0gMCwgZmlyc3RfY2x1c3RlciwgbGFzdF9jbHVzdGVyOwogCXVpbnQ2NF90IHN0YXJ0LCBsZW4sIG1pbmxlbiwgdHJpbW1lZCA9IDA7CiAJZXh0NF9mc2Jsa190IGZpcnN0X2RhdGFfYmxrID0KIAkJCWxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwpAQCAtNDk1OCw3ICs1MDM5LDcgQEAKIAlsZW4gPSByYW5nZS0+bGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCW1pbmxlbiA9IHJhbmdlLT5taW5sZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAKLQlpZiAodW5saWtlbHkobWlubGVuID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkpCisJaWYgKHVubGlrZWx5KG1pbmxlbiA+IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChzdGFydCArIGxlbiA8PSBmaXJzdF9kYXRhX2JsaykKIAkJZ290byBvdXQ7CkBAIC00OTY5LDExICs1MDUwLDExIEBACiAKIAkvKiBEZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QgZ3JvdXAgdG8gZXhhbWluZSBiYXNlZCBvbiBzdGFydCBhbmQgbGVuICovCiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDRfZnNibGtfdCkgc3RhcnQsCi0JCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9ibG9jayk7CisJCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9jbHVzdGVyKTsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCAoZXh0NF9mc2Jsa190KSAoc3RhcnQgKyBsZW4pLAotCQkJCSAgICAgJmxhc3RfZ3JvdXAsICZsYXN0X2Jsb2NrKTsKKwkJCQkgICAgICZsYXN0X2dyb3VwLCAmbGFzdF9jbHVzdGVyKTsKIAlsYXN0X2dyb3VwID0gKGxhc3RfZ3JvdXAgPiBuZ3JvdXBzIC0gMSkgPyBuZ3JvdXBzIC0gMSA6IGxhc3RfZ3JvdXA7Ci0JbGFzdF9ibG9jayA9IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJbGFzdF9jbHVzdGVyID0gRVhUNF9DTFVTVEVSU19QRVJfR1JPVVAoc2IpOwogCiAJaWYgKGZpcnN0X2dyb3VwID4gbGFzdF9ncm91cCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00OTkzLDIwICs1MDc0LDIwIEBACiAJCSAqIGNoYW5nZSBpdCBmb3IgdGhlIGxhc3QgZ3JvdXAgaW4gd2hpY2ggY2FzZSBzdGFydCArCiAJCSAqIGxlbiA8IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikuCiAJCSAqLwotCQlpZiAoZmlyc3RfYmxvY2sgKyBsZW4gPCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQotCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgbGVuOwotCQlsZW4gLT0gbGFzdF9ibG9jayAtIGZpcnN0X2Jsb2NrOworCQlpZiAoZmlyc3RfY2x1c3RlciArIGxlbiA8IEVYVDRfQ0xVU1RFUlNfUEVSX0dST1VQKHNiKSkKKwkJCWxhc3RfY2x1c3RlciA9IGZpcnN0X2NsdXN0ZXIgKyBsZW47CisJCWxlbiAtPSBsYXN0X2NsdXN0ZXIgLSBmaXJzdF9jbHVzdGVyOwogCiAJCWlmIChncnAtPmJiX2ZyZWUgPj0gbWlubGVuKSB7Ci0JCQljbnQgPSBleHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBmaXJzdF9ibG9jaywKLQkJCQkJCWxhc3RfYmxvY2ssIG1pbmxlbik7CisJCQljbnQgPSBleHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBmaXJzdF9jbHVzdGVyLAorCQkJCQkJbGFzdF9jbHVzdGVyLCBtaW5sZW4pOwogCQkJaWYgKGNudCA8IDApIHsKIAkJCQlyZXQgPSBjbnQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJdHJpbW1lZCArPSBjbnQ7Ci0JCWZpcnN0X2Jsb2NrID0gMDsKKwkJZmlyc3RfY2x1c3RlciA9IDA7CiAJfQogCXJhbmdlLT5sZW4gPSB0cmltbWVkICogc2ItPnNfYmxvY2tzaXplOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuaCBiL2ZzL2V4dDQvbWJhbGxvYy5oCmluZGV4IDlkNGE2MzYuLjQ3NzA1ZjMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5oCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5oCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAKIAkvKiBmcmVlIGJsb2NrIGV4dGVudCAqLwotCWV4dDRfZ3JwYmxrX3Qgc3RhcnRfYmxrOworCWV4dDRfZ3JwYmxrX3Qgc3RhcnRfY2x1c3RlcjsKIAlleHQ0X2dycGJsa190IGNvdW50OwogCiAJLyogdHJhbnNhY3Rpb24gd2hpY2ggZnJlZWQgdGhpcyBleHRlbnQgKi8KQEAgLTEzOSw5ICsxMzksOSBAQAogCiBzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCB7CiAJZXh0NF9sYmxrX3QgZmVfbG9naWNhbDsKLQlleHQ0X2dycGJsa190IGZlX3N0YXJ0OworCWV4dDRfZ3JwYmxrX3QgZmVfc3RhcnQ7CS8qIEluIGNsdXN0ZXIgdW5pdHMgKi8KIAlleHQ0X2dyb3VwX3QgZmVfZ3JvdXA7Ci0JZXh0NF9ncnBibGtfdCBmZV9sZW47CisJZXh0NF9ncnBibGtfdCBmZV9sZW47CS8qIEluIGNsdXN0ZXIgdW5pdHMgKi8KIH07CiAKIC8qCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkvKiB0aGUgYmVzdCBmb3VuZCBleHRlbnQgKi8KIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBhY19iX2V4OwogCi0JLyogY29weSBvZiB0aGUgYmV4dCBmb3VuZCBleHRlbnQgdGFrZW4gYmVmb3JlIHByZWFsbG9jYXRpb24gZWZmb3J0cyAqLworCS8qIGNvcHkgb2YgdGhlIGJlc3QgZm91bmQgZXh0ZW50IHRha2VuIGJlZm9yZSBwcmVhbGxvY2F0aW9uIGVmZm9ydHMgKi8KIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBhY19mX2V4OwogCiAJLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZG9uZS4gd2UgaGF2ZSB0byB0cmFjayB0byBsaW1pdCBzZWFyY2hpbmcgKi8KQEAgLTIxNiw2ICsyMTYsNyBAQAogc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9ncnBfb2Zmc190b19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCQlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCAqZmV4KQogewotCXJldHVybiBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBmZXgtPmZlX2dyb3VwKSArIGZleC0+ZmVfc3RhcnQ7CisJcmV0dXJuIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGZleC0+ZmVfZ3JvdXApICsKKwkJKGZleC0+ZmVfc3RhcnQgPDwgRVhUNF9TQihzYiktPnNfY2x1c3Rlcl9iaXRzKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCBiNTdiOThmLi4xNmFjMjI4IDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtMTUsMTkgKzE1LDE4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogCiAvKgogICogVGhlIGNvbnRpZ3VvdXMgYmxvY2tzIGRldGFpbHMgd2hpY2ggY2FuIGJlCiAgKiByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBleHRlbnQKICAqLwotc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCB7Ci0JZXh0NF9sYmxrX3QgZmlyc3RfYmxvY2ssIGxhc3RfYmxvY2s7CitzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgeworCWV4dDRfbGJsa190IGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrLCBjdXJyX2Jsb2NrOwogCWV4dDRfZnNibGtfdCBmaXJzdF9wYmxvY2ssIGxhc3RfcGJsb2NrOwogfTsKIAogc3RhdGljIGludCBmaW5pc2hfcmFuZ2UoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgbGlzdF9ibG9ja3Nfc3RydWN0ICpsYikKKwkJCQlzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogCiB7CiAJaW50IHJldHZhbCA9IDAsIG5lZWRlZDsKQEAgLTg3LDggKzg2LDcgQEAKIH0KIAogc3RhdGljIGludCB1cGRhdGVfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgYmxrX251bSwKLQkJCQlzdHJ1Y3QgbGlzdF9ibG9ja3Nfc3RydWN0ICpsYikKKwkJCSAgICAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCWludCByZXR2YWw7CiAJLyoKQEAgLTk2LDkgKzk0LDEwIEBACiAJICovCiAJaWYgKGxiLT5maXJzdF9wYmxvY2sgJiYKIAkJKGxiLT5sYXN0X3BibG9jaysxID09IHBibG9jaykgJiYKLQkJKGxiLT5sYXN0X2Jsb2NrKzEgPT0gYmxrX251bSkpIHsKKwkJKGxiLT5sYXN0X2Jsb2NrKzEgPT0gbGItPmN1cnJfYmxvY2spKSB7CiAJCWxiLT5sYXN0X3BibG9jayA9IHBibG9jazsKLQkJbGItPmxhc3RfYmxvY2sgPSBibGtfbnVtOworCQlsYi0+bGFzdF9ibG9jayA9IGxiLT5jdXJyX2Jsb2NrOworCQlsYi0+Y3Vycl9ibG9jaysrOwogCQlyZXR1cm4gMDsKIAl9CiAJLyoKQEAgLTEwNiw2NCArMTA1LDQ5IEBACiAJICovCiAJcmV0dmFsID0gZmluaXNoX3JhbmdlKGhhbmRsZSwgaW5vZGUsIGxiKTsKIAlsYi0+Zmlyc3RfcGJsb2NrID0gbGItPmxhc3RfcGJsb2NrID0gcGJsb2NrOwotCWxiLT5maXJzdF9ibG9jayA9IGxiLT5sYXN0X2Jsb2NrID0gYmxrX251bTsKLQorCWxiLT5maXJzdF9ibG9jayA9IGxiLT5sYXN0X2Jsb2NrID0gbGItPmN1cnJfYmxvY2s7CisJbGItPmN1cnJfYmxvY2srKzsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgKmJsa19udW1wLAotCQkJCSAgIHN0cnVjdCBsaXN0X2Jsb2Nrc19zdHJ1Y3QgKmxiKQorCQkJCSAgIGV4dDRfZnNibGtfdCBwYmxvY2ssCisJCQkJICAgc3RydWN0IG1pZ3JhdGVfc3RydWN0ICpsYikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCV9fbGUzMiAqaV9kYXRhOwogCWludCBpLCByZXR2YWwgPSAwOwotCWV4dDRfbGJsa190IGJsa19jb3VudCA9ICpibGtfbnVtcDsKIAl1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDI7CiAKLQlpZiAoIXBibG9jaykgewotCQkvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi8KLQkJKmJsa19udW1wICs9IG1heF9lbnRyaWVzOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwYmxvY2spOwogCWlmICghYmgpCiAJCXJldHVybiAtRUlPOwogCiAJaV9kYXRhID0gKF9fbGUzMiAqKWJoLT5iX2RhdGE7Ci0JZm9yIChpID0gMDsgaSA8IG1heF9lbnRyaWVzOyBpKyssIGJsa19jb3VudCsrKSB7CisJZm9yIChpID0gMDsgaSA8IG1heF9lbnRyaWVzOyBpKyspIHsKIAkJaWYgKGlfZGF0YVtpXSkgewogCQkJcmV0dmFsID0gdXBkYXRlX2V4dGVudF9yYW5nZShoYW5kbGUsIGlub2RlLAotCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwKLQkJCQkJCWJsa19jb3VudCwgbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWxiLT5jdXJyX2Jsb2NrKys7CiAJCX0KIAl9Ci0KLQkvKiBVcGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JKmJsa19udW1wID0gYmxrX2NvdW50OwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9kaW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLCBleHQ0X2xibGtfdCAqYmxrX251bXAsCi0JCQkJICAgIHN0cnVjdCBsaXN0X2Jsb2Nrc19zdHJ1Y3QgKmxiKQorCQkJCSAgICBleHQ0X2ZzYmxrX3QgcGJsb2NrLAorCQkJCSAgICBzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgKmxiKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJX19sZTMyICppX2RhdGE7CiAJaW50IGksIHJldHZhbCA9IDA7Ci0JZXh0NF9sYmxrX3QgYmxrX2NvdW50ID0gKmJsa19udW1wOwogCXVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPj4gMjsKIAotCWlmICghcGJsb2NrKSB7Ci0JCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkqYmxrX251bXAgKz0gbWF4X2VudHJpZXMgKiBtYXhfZW50cmllczsKLQkJcmV0dXJuIDA7Ci0JfQogCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIHBibG9jayk7CiAJaWYgKCFiaCkKIAkJcmV0dXJuIC1FSU87CkBAIC0xNzIsMzggKzE1NiwyOCBAQAogCWZvciAoaSA9IDA7IGkgPCBtYXhfZW50cmllczsgaSsrKSB7CiAJCWlmIChpX2RhdGFbaV0pIHsKIAkJCXJldHZhbCA9IHVwZGF0ZV9pbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLAotCQkJCQkJJmJsa19jb3VudCwgbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkJYmxrX2NvdW50ICs9IG1heF9lbnRyaWVzOworCQkJbGItPmN1cnJfYmxvY2sgKz0gbWF4X2VudHJpZXM7CiAJCX0KIAl9Ci0KLQkvKiBVcGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JKmJsa19udW1wID0gYmxrX2NvdW50OwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgZXh0NF9mc2Jsa190IHBibG9jaywgZXh0NF9sYmxrX3QgKmJsa19udW1wLAotCQkJCSAgICAgc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCAqbGIpCisJCQkJICAgIGV4dDRfZnNibGtfdCBwYmxvY2ssCisJCQkJICAgIHN0cnVjdCBtaWdyYXRlX3N0cnVjdCAqbGIpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlfX2xlMzIgKmlfZGF0YTsKIAlpbnQgaSwgcmV0dmFsID0gMDsKLQlleHQ0X2xibGtfdCBibGtfY291bnQgPSAqYmxrX251bXA7CiAJdW5zaWduZWQgbG9uZyBtYXhfZW50cmllcyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA+PiAyOwogCi0JaWYgKCFwYmxvY2spIHsKLQkJLyogT25seSB1cGRhdGUgdGhlIGZpbGUgYmxvY2sgbnVtYmVyICovCi0JCSpibGtfbnVtcCArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7Ci0JCXJldHVybiAwOwotCX0KIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwYmxvY2spOwogCWlmICghYmgpCiAJCXJldHVybiAtRUlPOwpAQCAtMjEyLDE2ICsxODYsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2VudHJpZXM7IGkrKykgewogCQlpZiAoaV9kYXRhW2ldKSB7CiAJCQlyZXR2YWwgPSB1cGRhdGVfZGluZF9leHRlbnRfcmFuZ2UoaGFuZGxlLCBpbm9kZSwKLQkJCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtpXSksCi0JCQkJCQkmYmxrX2NvdW50LCBsYik7CisJCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLCBsYik7CiAJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCS8qIE9ubHkgdXBkYXRlIHRoZSBmaWxlIGJsb2NrIG51bWJlciAqLwotCQkJYmxrX2NvdW50ICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7CisJCQlsYi0+Y3Vycl9ibG9jayArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzOworCQl9CiAJfQotCS8qIFVwZGF0ZSB0aGUgZmlsZSBibG9jayBudW1iZXIgKi8KLQkqYmxrX251bXAgPSBibGtfY291bnQ7CiAJcHV0X2JoKGJoKTsKIAlyZXR1cm4gcmV0dmFsOwogCkBAIC00NjIsMTIgKzQzNCwxMiBAQAogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IHJldHZhbCA9IDAsIGk7CiAJX19sZTMyICppX2RhdGE7Ci0JZXh0NF9sYmxrX3QgYmxrX2NvdW50ID0gMDsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaTsKIAlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCBsYjsKKwlzdHJ1Y3QgbWlncmF0ZV9zdHJ1Y3QgbGI7CiAJdW5zaWduZWQgbG9uZyBtYXhfZW50cmllczsKIAlfX3UzMiBnb2FsOworCXVpZF90IG93bmVyWzJdOwogCiAJLyoKIAkgKiBJZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVudHMsIG9yIHRoZSBpbm9kZQpAQCAtNDk1LDEwICs0NjcsMTIgQEAKIAl9CiAJZ29hbCA9ICgoKGlub2RlLT5pX2lubyAtIDEpIC8gRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKSkgKgogCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSArIDE7CisJb3duZXJbMF0gPSBpbm9kZS0+aV91aWQ7CisJb3duZXJbMV0gPSBpbm9kZS0+aV9naWQ7CiAJdG1wX2lub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBpbm9kZS0+aV9zYi0+c19yb290LT5kX2lub2RlLAotCQkJCSAgIFNfSUZSRUcsIE5VTEwsIGdvYWwpOworCQkJCSAgIFNfSUZSRUcsIE5VTEwsIGdvYWwsIG93bmVyKTsKIAlpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwkJcmV0dmFsID0gUFRSX0VSUihpbm9kZSk7CiAJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJCXJldHVybiByZXR2YWw7CiAJfQpAQCAtNTA3LDcgKzQ4MSw3IEBACiAJICogU2V0IHRoZSBpX25saW5rIHRvIHplcm8gc28gaXQgd2lsbCBiZSBkZWxldGVkIGxhdGVyCiAJICogd2hlbiB3ZSBkcm9wIGlub2RlIHJlZmVyZW5jZS4KIAkgKi8KLQl0bXBfaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKHRtcF9pbm9kZSk7CiAKIAlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCB0bXBfaW5vZGUpOwogCWV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIHRtcF9pbm9kZSk7CkBAIC01NTEsMzUgKzUyNSwzMiBAQAogCiAJLyogMzIgYml0IGJsb2NrIGFkZHJlc3MgNCBieXRlcyAqLwogCW1heF9lbnRyaWVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDI7Ci0JZm9yIChpID0gMDsgaSA8IEVYVDRfTkRJUl9CTE9DS1M7IGkrKywgYmxrX2NvdW50KyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUNF9ORElSX0JMT0NLUzsgaSsrKSB7CiAJCWlmIChpX2RhdGFbaV0pIHsKIAkJCXJldHZhbCA9IHVwZGF0ZV9leHRlbnRfcmFuZ2UoaGFuZGxlLCB0bXBfaW5vZGUsCi0JCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbaV0pLAotCQkJCQkJYmxrX2NvdW50LCAmbGIpOworCQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW2ldKSwgJmxiKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJfb3V0OwotCQl9CisJCX0gZWxzZQorCQkJbGIuY3Vycl9ibG9jaysrOwogCX0KIAlpZiAoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSkgewogCQlyZXR2YWwgPSB1cGRhdGVfaW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSwKLQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSksCi0JCQkJCSZibGtfY291bnQsICZsYik7CisJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSksICZsYik7CiAJCQlpZiAocmV0dmFsKQogCQkJCWdvdG8gZXJyX291dDsKIAl9IGVsc2UKLQkJYmxrX2NvdW50ICs9ICBtYXhfZW50cmllczsKKwkJbGIuY3Vycl9ibG9jayArPSBtYXhfZW50cmllczsKIAlpZiAoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pIHsKIAkJcmV0dmFsID0gdXBkYXRlX2RpbmRfZXh0ZW50X3JhbmdlKGhhbmRsZSwgdG1wX2lub2RlLAotCQkJCQlsZTMyX3RvX2NwdShpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSksCi0JCQkJCSZibGtfY291bnQsICZsYik7CisJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfRElORF9CTE9DS10pLCAmbGIpOwogCQkJaWYgKHJldHZhbCkKIAkJCQlnb3RvIGVycl9vdXQ7CiAJfSBlbHNlCi0JCWJsa19jb3VudCArPSBtYXhfZW50cmllcyAqIG1heF9lbnRyaWVzOworCQlsYi5jdXJyX2Jsb2NrICs9IG1heF9lbnRyaWVzICogbWF4X2VudHJpZXM7CiAJaWYgKGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSB7CiAJCXJldHZhbCA9IHVwZGF0ZV90aW5kX2V4dGVudF9yYW5nZShoYW5kbGUsIHRtcF9pbm9kZSwKLQkJCQkJbGUzMl90b19jcHUoaV9kYXRhW0VYVDRfVElORF9CTE9DS10pLAotCQkJCQkmYmxrX2NvdW50LCAmbGIpOworCQkJCWxlMzJfdG9fY3B1KGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdKSwgJmxiKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBlcnJfb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW1wLmMgYi9mcy9leHQ0L21tcC5jCmluZGV4IDliZGVmM2YuLjdlYTRiYTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbW1wLmMKKysrIGIvZnMvZXh0NC9tbXAuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJbW1wLT5tbXBfY2hlY2tfaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihtbXBfY2hlY2tfaW50ZXJ2YWwpOwogCWJkZXZuYW1lKGJoLT5iX2JkZXYsIG1tcC0+bW1wX2JkZXZuYW1lKTsKIAotCW1lbWNweShtbXAtPm1tcF9ub2RlbmFtZSwgaW5pdF91dHNuYW1lKCktPnN5c25hbWUsCisJbWVtY3B5KG1tcC0+bW1wX25vZGVuYW1lLCBpbml0X3V0c25hbWUoKS0+bm9kZW5hbWUsCiAJICAgICAgIHNpemVvZihtbXAtPm1tcF9ub2RlbmFtZSkpOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKQEAgLTEyNSw4ICsxMjUsOSBAQAogCQkgKiBEb24ndCBzcGV3IHRvbyBtYW55IGVycm9yIG1lc3NhZ2VzLiBQcmludCBvbmUgZXZlcnkKIAkJICogKHNfbW1wX3VwZGF0ZV9pbnRlcnZhbCAqIDYwKSBzZWNvbmRzLgogCQkgKi8KLQkJaWYgKHJldHZhbCAmJiAoZmFpbGVkX3dyaXRlcyAlIDYwKSA9PSAwKSB7Ci0JCQlleHQ0X2Vycm9yKHNiLCAiRXJyb3Igd3JpdGluZyB0byBNTVAgYmxvY2siKTsKKwkJaWYgKHJldHZhbCkgeworCQkJaWYgKChmYWlsZWRfd3JpdGVzICUgNjApID09IDApCisJCQkJZXh0NF9lcnJvcihzYiwgIkVycm9yIHdyaXRpbmcgdG8gTU1QIGJsb2NrIik7CiAJCQlmYWlsZWRfd3JpdGVzKys7CiAJCX0KIApAQCAtMjk1LDcgKzI5Niw4IEBACiAJLyoKIAkgKiB3cml0ZSBhIG5ldyByYW5kb20gc2VxdWVuY2UgbnVtYmVyLgogCSAqLwotCW1tcC0+bW1wX3NlcSA9IHNlcSA9IGNwdV90b19sZTMyKG1tcF9uZXdfc2VxKCkpOworCXNlcSA9IG1tcF9uZXdfc2VxKCk7CisJbW1wLT5tbXBfc2VxID0gY3B1X3RvX2xlMzIoc2VxKTsKIAogCXJldHZhbCA9IHdyaXRlX21tcF9ibG9jayhiaCk7CiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYyBiL2ZzL2V4dDQvbW92ZV9leHRlbnQuYwppbmRleCBmNTc0NTVhLi5jNTgyNmM2IDEwMDY0NAotLS0gYS9mcy9leHQ0L21vdmVfZXh0ZW50LmMKKysrIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCi0jaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCiAjaW5jbHVkZSAiZXh0NC5oIgogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCAxYzkyNGZhLi5hYTRjNzgyIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC0xNTg2LDcgKzE1ODYsNyBAQAogCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwgZnJhbWVzWzFdLmVudHJpZXMpKTsKIAkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCgibm9kZSIsCiAJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKLQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoMik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgyKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQkJYnJlbHNlIChiaDIpOwpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAkJCWlmIChlcnIpCiAJCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQl9Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGZyYW1lc1swXS5iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBmcmFtZXNbMF0uYmgpOwogCQlpZiAoZXJyKSB7CiAJCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKIAkJCWdvdG8gY2xlYW51cDsKQEAgLTE2OTQsNyArMTY5NCw3IEBACiAJaWYgKGlzX2R4KGlub2RlKSAmJiBpbm9kZS0+aV9ubGluayA+IDEpIHsKIAkJLyogbGltaXQgaXMgMTYtYml0IGlfbGlua3NfY291bnQgKi8KIAkJaWYgKGlub2RlLT5pX25saW5rID49IEVYVDRfTElOS19NQVggfHwgaW5vZGUtPmlfbmxpbmsgPT0gMikgewotCQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJCUVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKGlub2RlLT5pX3NiLAogCQkJCQkgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0RJUl9OTElOSyk7CiAJCX0KQEAgLTE3MDcsOSArMTcwNyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfZGVjX2NvdW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JZHJvcF9ubGluayhpbm9kZSk7Ci0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfbmxpbmsgPT0gMCkKLQkJaW5jX25saW5rKGlub2RlKTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbmxpbmsgPiAyKQorCQlkcm9wX25saW5rKGlub2RlKTsKIH0KIAogCkBAIC0xNzU2LDcgKzE3NTUsNyBAQAogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAotCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUsICZkZW50cnktPmRfbmFtZSwgMCk7CisJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgbW9kZSwgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7CkBAIC0xNzkyLDcgKzE3OTEsNyBAQAogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAotCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUsICZkZW50cnktPmRfbmFtZSwgMCk7CisJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgbW9kZSwgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKQEAgLTE4MzIsNyArMTgzMSw3IEBACiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZESVIgfCBtb2RlLAotCQkJICAgICAgICZkZW50cnktPmRfbmFtZSwgMCk7CisJCQkgICAgICAgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKIAkJZ290byBvdXRfc3RvcDsKQEAgLTE4NjEsOSArMTg2MCw5IEBACiAJZGUtPm5hbWVfbGVuID0gMjsKIAlzdHJjcHkoZGUtPm5hbWUsICIuLiIpOwogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBkaXJfYmxvY2spOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2NsZWFyX2lub2RlOwogCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKQEAgLTIyMTQsNyArMjIxMyw3IEBACiAJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwKIAkJCSAgICAgIkRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCSAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJcmV0dmFsID0gZXh0NF9kZWxldGVfZW50cnkoaGFuZGxlLCBkaXIsIGRlLCBiaCk7CiAJaWYgKHJldHZhbCkKQEAgLTIyNzksNyArMjI3OCw3IEBACiAJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPLAotCQkJICAgICAgICZkZW50cnktPmRfbmFtZSwgMCk7CisJCQkgICAgICAgJmRlbnRyeS0+ZF9uYW1lLCAwLCBOVUxMKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKIAkJZ290byBvdXRfc3RvcDsKQEAgLTI1MzAsNyArMjUyOSw3IEBACiAJCVBBUkVOVF9JTk8oZGlyX2JoLT5iX2RhdGEsIG5ld19kaXItPmlfc2ItPnNfYmxvY2tzaXplKSA9CiAJCQkJCQljcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CiAJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKKwkJcmV0dmFsID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBvbGRfaW5vZGUsIGRpcl9iaCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWV4dDRfc3RkX2Vycm9yKG9sZF9kaXItPmlfc2IsIHJldHZhbCk7CiAJCQlnb3RvIGVuZF9yZW5hbWU7CkBAIC0yNTM5LDcgKzI1MzgsNyBAQAogCQlpZiAobmV3X2lub2RlKSB7CiAJCQkvKiBjaGVja2VkIGVtcHR5X2RpciBhYm92ZSwgY2FuJ3QgaGF2ZSBhbm90aGVyIHBhcmVudCwKIAkJCSAqIGV4dDRfZGVjX2NvdW50KCkgd29uJ3Qgd29yayBmb3IgbWFueS1saW5rZWQgZGlycyAqLwotCQkJbmV3X2lub2RlLT5pX25saW5rID0gMDsKKwkJCWNsZWFyX25saW5rKG5ld19pbm9kZSk7CiAJCX0gZWxzZSB7CiAJCQlleHQ0X2luY19jb3VudChoYW5kbGUsIG5ld19kaXIpOwogCQkJZXh0NF91cGRhdGVfZHhfZmxhZyhuZXdfZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFnZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKaW5kZXggOTJmMzhlZS4uN2NlMWQwYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKKysrIGIvZnMvZXh0NC9wYWdlLWlvLmMKQEAgLTcwLDcgKzcwLDYgQEAKIHZvaWQgZXh0NF9mcmVlX2lvX2VuZChleHQ0X2lvX2VuZF90ICppbykKIHsKIAlpbnQgaTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CiAKIAlCVUdfT04oIWlvKTsKIAlpZiAoaW8tPnBhZ2UpCkBAIC03OCw1NiArNzcsNDMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW8tPm51bV9pb19wYWdlczsgaSsrKQogCQlwdXRfaW9fcGFnZShpby0+cGFnZXNbaV0pOwogCWlvLT5udW1faW9fcGFnZXMgPSAwOwotCXdxID0gZXh0NF9pb2VuZF93cShpby0+aW5vZGUpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZFWFQ0X0koaW8tPmlub2RlKS0+aV9pb2VuZF9jb3VudCkgJiYKLQkgICAgd2FpdHF1ZXVlX2FjdGl2ZSh3cSkpCi0JCXdha2VfdXBfYWxsKHdxKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmRVhUNF9JKGlvLT5pbm9kZSktPmlfaW9lbmRfY291bnQpKQorCQl3YWtlX3VwX2FsbChleHQ0X2lvZW5kX3dxKGlvLT5pbm9kZSkpOwogCWttZW1fY2FjaGVfZnJlZShpb19lbmRfY2FjaGVwLCBpbyk7CiB9CiAKIC8qCiAgKiBjaGVjayBhIHJhbmdlIG9mIHNwYWNlIGFuZCBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4uCisgKgorICogQ2FsbGVkIHdpdGggaW5vZGUtPmlfbXV0ZXg7IHdlIGRlcGVuZCBvbiB0aGlzIHdoZW4gd2UgbWFuaXB1bGF0ZQorICogaW8tPmZsYWcsIHNpbmNlIHdlIGNvdWxkIG90aGVyd2lzZSByYWNlIHdpdGggZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oKQogICovCiBpbnQgZXh0NF9lbmRfaW9fbm9sb2NrKGV4dDRfaW9fZW5kX3QgKmlvKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpby0+aW5vZGU7CiAJbG9mZl90IG9mZnNldCA9IGlvLT5vZmZzZXQ7CiAJc3NpemVfdCBzaXplID0gaW8tPnNpemU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxOwogCWludCByZXQgPSAwOwogCiAJZXh0NF9kZWJ1ZygiZXh0NF9lbmRfaW9fbm9sb2NrOiBpbyAweCVwIGZyb20gaW5vZGUgJWx1LGxpc3QtPm5leHQgMHglcCwiCiAJCSAgICJsaXN0LT5wcmV2IDB4JXBcbiIsCiAJCSAgIGlvLCBpbm9kZS0+aV9pbm8sIGlvLT5saXN0Lm5leHQsIGlvLT5saXN0LnByZXYpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmlvLT5saXN0KSkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghKGlvLT5mbGFnICYgRVhUNF9JT19FTkRfVU5XUklUVEVOKSkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50cyhpbm9kZSwgb2Zmc2V0LCBzaXplKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVud3JpdHRlbiAiCi0JCQkiZXh0ZW50cyB0byB3cml0dGVuIGV4dGVudHMsIGVycm9yIGlzICVkICIKLQkJCSJpbyBpcyBzdGlsbCBvbiBpbm9kZSAlbHUgYWlvIGRpbyBsaXN0XG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCwgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIHJldDsKKwkJZXh0NF9tc2coaW5vZGUtPmlfc2IsIEtFUk5fRU1FUkcsCisJCQkgImZhaWxlZCB0byBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4gIgorCQkJICJleHRlbnRzIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhICAiCisJCQkgIihpbm9kZSAlbHUsIG9mZnNldCAlbGx1LCBzaXplICV6ZCwgZXJyb3IgJWQpIiwKKwkJCSBpbm9kZS0+aV9pbm8sIG9mZnNldCwgc2l6ZSwgcmV0KTsKIAl9CiAKIAlpZiAoaW8tPmlvY2IpCiAJCWFpb19jb21wbGV0ZShpby0+aW9jYiwgaW8tPnJlc3VsdCwgMCk7Ci0JLyogY2xlYXIgdGhlIERJTyBBSU8gdW53cml0dGVuIGZsYWcgKi8KLQlpZiAoaW8tPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pIHsKLQkJaW8tPmZsYWcgJj0gfkVYVDRfSU9fRU5EX1VOV1JJVFRFTjsKLQkJLyogV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gKi8KLQkJd3EgPSBleHQ0X2lvZW5kX3dxKGlvLT5pbm9kZSk7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZFWFQ0X0koaW5vZGUpLT5pX2Fpb2Rpb191bndyaXR0ZW4pICYmCi0JCSAgICB3YWl0cXVldWVfYWN0aXZlKHdxKSkgewotCQkJd2FrZV91cF9hbGwod3EpOwotCQl9Ci0JfQogCisJLyogV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmRVhUNF9JKGlub2RlKS0+aV9haW9kaW9fdW53cml0dGVuKSkKKwkJd2FrZV91cF9hbGwoZXh0NF9pb2VuZF93cShpby0+aW5vZGUpKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDAsOSArMTI2LDE1IEBACiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpby0+aW5vZGU7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbwkqZWkgPSBFWFQ0X0koaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCWludAkJCXJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZpby0+bGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKKwkJZ290byBmcmVlOworCX0KIAogCWlmICghbXV0ZXhfdHJ5bG9jaygmaW5vZGUtPmlfbXV0ZXgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAJCS8qCiAJCSAqIFJlcXVldWUgdGhlIHdvcmsgaW5zdGVhZCBvZiB3YWl0aW5nIHNvIHRoYXQgdGhlIHdvcmsKIAkJICogaXRlbXMgcXVldWVkIGFmdGVyIHRoaXMgY2FuIGJlIHByb2Nlc3NlZC4KQEAgLTE1OSwxNyArMTUxLDExIEBACiAJCWlvLT5mbGFnIHw9IEVYVDRfSU9fRU5EX1FVRVVFRDsKIAkJcmV0dXJuOwogCX0KLQlyZXQgPSBleHQ0X2VuZF9pb19ub2xvY2soaW8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZpby0+bGlzdCkpCi0JCWxpc3RfZGVsX2luaXQoJmlvLT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZpby0+bGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWktPmlfY29tcGxldGVkX2lvX2xvY2ssIGZsYWdzKTsKKwkodm9pZCkgZXh0NF9lbmRfaW9fbm9sb2NrKGlvKTsKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKK2ZyZWU6CiAJZXh0NF9mcmVlX2lvX2VuZChpbyk7CiB9CiAKQEAgLTM1MCwxMCArMzM2LDggQEAKIAlpZiAoKGlvX2VuZC0+bnVtX2lvX3BhZ2VzID49IE1BWF9JT19QQUdFUykgJiYKIAkgICAgKGlvX2VuZC0+cGFnZXNbaW9fZW5kLT5udW1faW9fcGFnZXMtMV0gIT0gaW9fcGFnZSkpCiAJCWdvdG8gc3VibWl0X2FuZF9yZXRyeTsKLQlpZiAoYnVmZmVyX3VuaW5pdChiaCkgJiYgIShpb19lbmQtPmZsYWcgJiBFWFQ0X0lPX0VORF9VTldSSVRURU4pKSB7Ci0JCWlvX2VuZC0+ZmxhZyB8PSBFWFQ0X0lPX0VORF9VTldSSVRURU47Ci0JCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfYWlvZGlvX3Vud3JpdHRlbik7Ci0JfQorCWlmIChidWZmZXJfdW5pbml0KGJoKSkKKwkJZXh0NF9zZXRfaW9fdW53cml0dGVuX2ZsYWcoaW5vZGUsIGlvX2VuZCk7CiAJaW8tPmlvX2VuZC0+c2l6ZSArPSBiaC0+Yl9zaXplOwogCWlvLT5pb19uZXh0X2Jsb2NrKys7CiAJcmV0ID0gYmlvX2FkZF9wYWdlKGlvLT5pb19iaW8sIGJoLT5iX3BhZ2UsIGJoLT5iX3NpemUsIGJoX29mZnNldChiaCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9yZXNpemUuYyBiL2ZzL2V4dDQvcmVzaXplLmMKaW5kZXggNzA3ZDNmMS4uOTk2NzgwYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9yZXNpemUuYworKysgYi9mcy9leHQ0L3Jlc2l6ZS5jCkBAIC04NzUsNyArODc1LDcgQEAKIAlleHQ0X2Jsb2NrX2JpdG1hcF9zZXQoc2IsIGdkcCwgaW5wdXQtPmJsb2NrX2JpdG1hcCk7IC8qIExWIEZJWE1FICovCiAJZXh0NF9pbm9kZV9iaXRtYXBfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV9iaXRtYXApOyAvKiBMViBGSVhNRSAqLwogCWV4dDRfaW5vZGVfdGFibGVfc2V0KHNiLCBnZHAsIGlucHV0LT5pbm9kZV90YWJsZSk7IC8qIExWIEZJWE1FICovCi0JZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJZXh0NF9mcmVlX2dyb3VwX2NsdXN0ZXJzX3NldChzYiwgZ2RwLCBpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQpOwogCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCWdkcC0+YmdfZmxhZ3MgPSBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1pFUk9FRCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaW5wdXQtPmdyb3VwLCBnZHApOwpAQCAtOTM3LDggKzkzNyw4IEBACiAJCWlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOwogCiAJLyogVXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyAqLwotCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJCSAgIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWNsdXN0ZXJzX2NvdW50ZXIsCisJCQkgICBFWFQ0X0IyQyhzYmksIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCkpOwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCkBAIC05NDYsOCArOTQ2LDggQEAKIAkgICAgc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXA7CiAJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpbnB1dC0+Z3JvdXApOwotCQlhdG9taWNfYWRkKGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCwKLQkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MpOworCQlhdG9taWNfYWRkKEVYVDRfQjJDKHNiaSwgaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9jbHVzdGVycyk7CiAJCWF0b21pY19hZGQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKIAkJCSAgICZzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9pbm9kZXMpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA0NGQwYzhkLi45OTUzZDgwIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSAiZXh0NC5oIgorI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCkBAIC0xNjMsOCArMTY0LDggQEAKIAkJIChleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX3RhYmxlX2hpKSA8PCAzMiA6IDApOwogfQogCi1fX3UzMiBleHQ0X2ZyZWVfYmxrc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCitfX3UzMiBleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKIHsKIAlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KQEAgLTIxOSw4ICsyMjAsOCBAQAogCQliZy0+YmdfaW5vZGVfdGFibGVfaGkgPSBjcHVfdG9fbGUzMihibGsgPj4gMzIpOwogfQogCi12b2lkIGV4dDRfZnJlZV9ibGtzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit2b2lkIGV4dDRfZnJlZV9ncm91cF9jbHVzdGVyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCkKIHsKIAliZy0+YmdfZnJlZV9ibG9ja3NfY291bnRfbG8gPSBjcHVfdG9fbGUxNigoX191MTYpY291bnQpOwogCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQpAQCAtNDE0LDYgKzQxNSwyMiBAQAogCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIH0KIAorLyoKKyAqIFRoZSBkZWxfZ2VuZGlzaygpIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZXMgdGhlIGRpc2stc3BlY2lmaWMgZGF0YQorICogc3RydWN0dXJlcywgaW5jbHVkaW5nIHRoZSBiZGkgc3RydWN0dXJlLCB3aXRob3V0IHRlbGxpbmcgYW55b25lCisgKiBlbHNlLiAgT25jZSB0aGlzIGhhcHBlbnMsIGFueSBhdHRlbXB0IHRvIGNhbGwgbWFya19idWZmZXJfZGlydHkoKQorICogKGZvciBleGFtcGxlLCBieSBleHQ0X2NvbW1pdF9zdXBlciksIHdpbGwgY2F1c2UgYSBrZXJuZWwgT09QUy4KKyAqIFRoaXMgaXMgYSBrbHVkZ2UgdG8gcHJldmVudCB0aGVzZSBvb3BzIHVudGlsIHdlIGNhbiBwdXQgaW4gYSBwcm9wZXIKKyAqIGhvb2sgaW4gZGVsX2dlbmRpc2soKSB0byBpbmZvcm0gdGhlIFZGUyBhbmQgZmlsZSBzeXN0ZW0gbGF5ZXJzLgorICovCitzdGF0aWMgaW50IGJsb2NrX2RldmljZV9lamVjdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlOworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBiZF9pbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCisJcmV0dXJuIGJkaS0+ZGV2ID09IE5VTEw7Cit9CisKIAogLyogRGVhbCB3aXRoIHRoZSByZXBvcnRpbmcgb2YgZmFpbHVyZSBjb25kaXRpb25zIG9uIGEgZmlsZXN5c3RlbSBzdWNoIGFzCiAgKiBpbmNvbnNpc3RlbmNpZXMgZGV0ZWN0ZWQgb3IgcmVhZCBJTyBmYWlsdXJlcy4KQEAgLTgyMSwxMCArODM4LDEwIEBACiAJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CiAJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOwogCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJYnJlbHNlKHNiaS0+c19zYmgpOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKQEAgLTEwNTcsOCArMTA3NCw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixub3VpZDMyIik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykgJiYgIShkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9ERUJVRykpCiAJCXNlcV9wdXRzKHNlcSwgIixkZWJ1ZyIpOwotCWlmICh0ZXN0X29wdChzYiwgT0xEQUxMT0MpKQotCQlzZXFfcHV0cyhzZXEsICIsb2xkYWxsb2MiKTsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWlmICh0ZXN0X29wdChzYiwgWEFUVFJfVVNFUikpCiAJCXNlcV9wdXRzKHNlcSwgIix1c2VyX3hhdHRyIik7CkBAIC0xNTY3LDEwICsxNTgyLDEyIEBACiAJCQlzZXRfb3B0KHNiLCBERUJVRyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb2xkYWxsb2M6Ci0JCQlzZXRfb3B0KHNiLCBPTERBTExPQyk7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJCSAiSWdub3JpbmcgZGVwcmVjYXRlZCBvbGRhbGxvYyBvcHRpb24iKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vcmxvdjoKLQkJCWNsZWFyX29wdChzYiwgT0xEQUxMT0MpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCQkgIklnbm9yaW5nIGRlcHJlY2F0ZWQgb3Jsb3Ygb3B0aW9uIik7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCQljYXNlIE9wdF91c2VyX3hhdHRyOgpAQCAtMTgwMSw2ICsxODE4LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2RlbGFsbG9jOgogCQkJY2xlYXJfb3B0KHNiLCBERUxBTExPQyk7CisJCQljbGVhcl9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbWJsa19pb19zdWJtaXQ6CiAJCQlzZXRfb3B0KHNiLCBNQkxLX0lPX1NVQk1JVCk7CkBAIC0xODE3LDYgKzE4MzUsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RlbGFsbG9jOgogCQkJc2V0X29wdChzYiwgREVMQUxMT0MpOworCQkJc2V0X29wdDIoc2IsIEVYUExJQ0lUX0RFTEFMTE9DKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ibG9ja192YWxpZGl0eToKIAkJCXNldF9vcHQoc2IsIEJMT0NLX1ZBTElESVRZKTsKQEAgLTE5MzUsNyArMTk1NCw3IEBACiAJCXJlcyA9IE1TX1JET05MWTsKIAl9CiAJaWYgKHJlYWRfb25seSkKLQkJcmV0dXJuIHJlczsKKwkJZ290byBkb25lOwogCWlmICghKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfVkFMSURfRlMpKQogCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAid2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzLCAiCiAJCQkgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CkBAIC0xOTY2LDYgKzE5ODUsNyBAQAogCQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAKIAlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7Citkb25lOgogCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQogCQlwcmludGsoS0VSTl9JTkZPICJbRVhUNCBGUyBicz0lbHUsIGdjPSV1LCAiCiAJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNHgsIG1vMj0lMDR4XVxuIiwKQEAgLTIwMTUsOCArMjAzNSw4IEBACiAJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpKTsKIAkJYXRvbWljX2FkZChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApLAogCQkJICAgJnNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2lub2Rlcyk7Ci0JCWF0b21pY19hZGQoZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCksCi0JCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzKTsKKwkJYXRvbWljX2FkZChleHQ0X2ZyZWVfZ3JvdXBfY2x1c3RlcnMoc2IsIGdkcCksCisJCQkgICAmc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfY2x1c3RlcnMpOwogCQlhdG9taWNfYWRkKGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApLAogCQkJICAgJnNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS51c2VkX2RpcnMpOwogCX0KQEAgLTIxMzQsNyArMjE1NCw4IEBACiAJaWYgKE5VTEwgIT0gZmlyc3Rfbm90X3plcm9lZCkKIAkJKmZpcnN0X25vdF96ZXJvZWQgPSBncnA7CiAKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsCisJCQkJICAgRVhUNF9DMkIoc2JpLCBleHQ0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc2IpKSk7CiAJc2JpLT5zX2VzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID1jcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CiAJcmV0dXJuIDE7CiB9CkBAIC0yNDU0LDcgKzI0NzUsOCBAQAogCQkJCQkgICAgICBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKLQkJCShzNjQpIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKKwkJKHM2NCkgRVhUNF9DMkIoc2JpLAorCQkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZGlydHljbHVzdGVyc19jb3VudGVyKSkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXNzaW9uX3dyaXRlX2tieXRlc19zaG93KHN0cnVjdCBleHQ0X2F0dHIgKmEsCkBAIC0yNjgyLDYgKzI3MDQsMTMgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQorCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9CSUdBTExPQykgJiYKKwkgICAgIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgeworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkgIkNhbid0IHN1cHBvcnQgYmlnYWxsb2MgZmVhdHVyZSB3aXRob3V0ICIKKwkJCSAiZXh0ZW50cyBmZWF0dXJlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCXJldHVybiAxOwogfQogCkBAIC0zMDg3LDEwICszMTE2LDEwIEBACiAJY2hhciAqY3A7CiAJY29uc3QgY2hhciAqZGVzY3I7CiAJaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGJsb2Nrc2l6ZTsKKwlpbnQgYmxvY2tzaXplLCBjbHVzdGVyc2l6ZTsKIAl1bnNpZ25lZCBpbnQgZGJfY291bnQ7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IG5lZWRzX3JlY292ZXJ5LCBoYXNfaHVnZV9maWxlczsKKwlpbnQgbmVlZHNfcmVjb3ZlcnksIGhhc19odWdlX2ZpbGVzLCBoYXNfYmlnYWxsb2M7CiAJX191NjQgYmxvY2tzX2NvdW50OwogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGpvdXJuYWxfaW9wcmlvID0gREVGQVVMVF9KT1VSTkFMX0lPUFJJTzsKQEAgLTMyMjQsNiArMzI1MywzMyBAQAogCQkJICAgJmpvdXJuYWxfaW9wcmlvLCBOVUxMLCAwKSkKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAKKwlpZiAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSB7CisJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiRVhUNC1mczogV2FybmluZzogbW91bnRpbmcgIgorCQkJICAgICJ3aXRoIGRhdGE9am91cm5hbCBkaXNhYmxlcyBkZWxheWVkICIKKwkJCSAgICAiYWxsb2NhdGlvbiBhbmQgT19ESVJFQ1Qgc3VwcG9ydCFcbiIpOworCQlpZiAodGVzdF9vcHQyKHNiLCBFWFBMSUNJVF9ERUxBTExPQykpIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IG1vdW50IHdpdGggIgorCQkJCSAiYm90aCBkYXRhPWpvdXJuYWwgYW5kIGRlbGFsbG9jIik7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCQlpZiAodGVzdF9vcHQoc2IsIERJT1JFQURfTk9MT0NLKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY2FuJ3QgbW91bnQgd2l0aCAiCisJCQkJICJib3RoIGRhdGE9am91cm5hbCBhbmQgZGVsYWxsb2MiKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCWlmICh0ZXN0X29wdChzYiwgREVMQUxMT0MpKQorCQkJY2xlYXJfb3B0KHNiLCBERUxBTExPQyk7CisJfQorCisJYmxvY2tzaXplID0gQkxPQ0tfU0laRSA8PCBsZTMyX3RvX2NwdShlcy0+c19sb2dfYmxvY2tfc2l6ZSk7CisJaWYgKHRlc3Rfb3B0KHNiLCBESU9SRUFEX05PTE9DSykpIHsKKwkJaWYgKGJsb2Nrc2l6ZSA8IFBBR0VfU0laRSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY2FuJ3QgbW91bnQgd2l0aCAiCisJCQkJICJkaW9yZWFkX25vbG9jayBpZiBibG9jayBzaXplICE9IFBBR0VfU0laRSIpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwl9CisKIAlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAogCQkodGVzdF9vcHQoc2IsIFBPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOwogCkBAIC0zMjY1LDggKzMzMjEsNiBAQAogCWlmICghZXh0NF9mZWF0dXJlX3NldF9vayhzYiwgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkpCiAJCWdvdG8gZmFpbGVkX21vdW50OwogCi0JYmxvY2tzaXplID0gQkxPQ0tfU0laRSA8PCBsZTMyX3RvX2NwdShlcy0+c19sb2dfYmxvY2tfc2l6ZSk7Ci0KIAlpZiAoYmxvY2tzaXplIDwgRVhUNF9NSU5fQkxPQ0tfU0laRSB8fAogCSAgICBibG9ja3NpemUgPiBFWFQ0X01BWF9CTE9DS19TSVpFKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKQEAgLTMzNjksMTIgKzM0MjMsNTMgQEAKIAkJc2ItPnNfZGlydCA9IDE7CiAJfQogCi0JaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCi0JCSAgICAgICAiI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1IiwKLQkJICAgICAgIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKLQkJZ290byBmYWlsZWRfbW91bnQ7CisJLyogSGFuZGxlIGNsdXN0ZXJzaXplICovCisJY2x1c3RlcnNpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19jbHVzdGVyX3NpemUpOworCWhhc19iaWdhbGxvYyA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfQklHQUxMT0MpOworCWlmIChoYXNfYmlnYWxsb2MpIHsKKwkJaWYgKGNsdXN0ZXJzaXplIDwgYmxvY2tzaXplKSB7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJICJjbHVzdGVyIHNpemUgKCVkKSBzbWFsbGVyIHRoYW4gIgorCQkJCSAiYmxvY2sgc2l6ZSAoJWQpIiwgY2x1c3RlcnNpemUsIGJsb2Nrc2l6ZSk7CisJCQlnb3RvIGZhaWxlZF9tb3VudDsKKwkJfQorCQlzYmktPnNfY2x1c3Rlcl9iaXRzID0gbGUzMl90b19jcHUoZXMtPnNfbG9nX2NsdXN0ZXJfc2l6ZSkgLQorCQkJbGUzMl90b19jcHUoZXMtPnNfbG9nX2Jsb2NrX3NpemUpOworCQlzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwID0KKwkJCWxlMzJfdG9fY3B1KGVzLT5zX2NsdXN0ZXJzX3Blcl9ncm91cCk7CisJCWlmIChzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAiI2NsdXN0ZXJzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAorCQkJCSBzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCAhPQorCQkgICAgKHNiaS0+c19jbHVzdGVyc19wZXJfZ3JvdXAgKiAoY2x1c3RlcnNpemUgLyBibG9ja3NpemUpKSkgeworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiYmxvY2tzIHBlciBncm91cCAoJWx1KSBhbmQgIgorCQkJCSAiY2x1c3RlcnMgcGVyIGdyb3VwICglbHUpIGluY29uc2lzdGVudCIsCisJCQkJIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwLAorCQkJCSBzYmktPnNfY2x1c3RlcnNfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNsdXN0ZXJzaXplICE9IGJsb2Nrc2l6ZSkgeworCQkJZXh0NF93YXJuaW5nKHNiLCAiZnJhZ21lbnQvY2x1c3RlciBzaXplICglZCkgIT0gIgorCQkJCSAgICAgImJsb2NrIHNpemUgKCVkKSIsIGNsdXN0ZXJzaXplLAorCQkJCSAgICAgYmxvY2tzaXplKTsKKwkJCWNsdXN0ZXJzaXplID0gYmxvY2tzaXplOworCQl9CisJCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkgIiNibG9ja3MgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdSIsCisJCQkJIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJCXNiaS0+c19jbHVzdGVyc19wZXJfZ3JvdXAgPSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cDsKKwkJc2JpLT5zX2NsdXN0ZXJfYml0cyA9IDA7CiAJfQorCXNiaS0+c19jbHVzdGVyX3JhdGlvID0gY2x1c3RlcnNpemUgLyBibG9ja3NpemU7CisKIAlpZiAoc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKIAkJICAgICAgICIjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLApAQCAtMzQ0NiwxMCArMzU0MSw4IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWYgKGV4dDRfcHJvY19yb290KQogCQlzYmktPnNfcHJvYyA9IHByb2NfbWtkaXIoc2ItPnNfaWQsIGV4dDRfcHJvY19yb290KTsKLSNlbmRpZgogCiAJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIApAQCAtMzQ4Myw4ICszNTc2LDggQEAKIAlzYmktPnNfZXJyX3JlcG9ydC5mdW5jdGlvbiA9IHByaW50X2RhaWx5X2Vycm9yX2luZm87CiAJc2JpLT5zX2Vycl9yZXBvcnQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzYjsKIAotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCi0JCQlleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyLAorCQkJZXh0NF9jb3VudF9mcmVlX2NsdXN0ZXJzKHNiKSk7CiAJaWYgKCFlcnIpIHsKIAkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCQlleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CkBAIC0zNDk0LDcgKzM1ODcsNyBAQAogCQkJCWV4dDRfY291bnRfZGlycyhzYikpOwogCX0KIAlpZiAoIWVycikgewotCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgMCk7CisJCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIDApOwogCX0KIAlpZiAoZXJyKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImluc3VmZmljaWVudCBtZW1vcnkiKTsKQEAgLTM2MDksMTMgKzM3MDIsMTMgQEAKIAkgKiBUaGUgam91cm5hbCBtYXkgaGF2ZSB1cGRhdGVkIHRoZSBiZyBzdW1tYXJ5IGNvdW50cywgc28gd2UKIAkgKiBuZWVkIHRvIHVwZGF0ZSB0aGUgZ2xvYmFsIGNvdW50ZXJzLgogCSAqLwotCXBlcmNwdV9jb3VudGVyX3NldCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJCSAgIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19mcmVlY2x1c3RlcnNfY291bnRlciwKKwkJCSAgIGV4dDRfY291bnRfZnJlZV9jbHVzdGVycyhzYikpOwogCXBlcmNwdV9jb3VudGVyX3NldCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKIAlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJzX2NvdW50ZXIsCiAJCQkgICBleHQ0X2NvdW50X2RpcnMoc2IpKTsKLQlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLCAwKTsKKwlwZXJjcHVfY291bnRlcl9zZXQoJnNiaS0+c19kaXJ0eWNsdXN0ZXJzX2NvdW50ZXIsIDApOwogCiBub19qb3VybmFsOgogCS8qCkBAIC0zNjc5LDI1ICszNzcyLDYgQEAKIAkJCSAiYXZhaWxhYmxlIik7CiAJfQogCi0JaWYgKHRlc3Rfb3B0KHNiLCBERUxBTExPQykgJiYKLQkgICAgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkpIHsKLQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIGRlbGFsbG9jIG9wdGlvbiAtICIKLQkJCSAicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7Ci0JCWNsZWFyX29wdChzYiwgREVMQUxMT0MpOwotCX0KLQlpZiAodGVzdF9vcHQoc2IsIERJT1JFQURfTk9MT0NLKSkgewotCQlpZiAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSB7Ci0JCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAiSWdub3JpbmcgZGlvcmVhZF9ub2xvY2sgIgotCQkJCSJvcHRpb24gLSByZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGUiKTsKLQkJCWNsZWFyX29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwotCQl9Ci0JCWlmIChzYi0+c19ibG9ja3NpemUgPCBQQUdFX1NJWkUpIHsKLQkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkaW9yZWFkX25vbG9jayAiCi0JCQkJIm9wdGlvbiAtIGJsb2NrIHNpemUgaXMgdG9vIHNtYWxsIik7Ci0JCQljbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTsKLQkJfQotCX0KLQogCWVyciA9IGV4dDRfc2V0dXBfc3lzdGVtX3pvbmUoc2IpOwogCWlmIChlcnIpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgc3lzdGVtICIKQEAgLTM3MTAsMjIgKzM3ODQsMTkgQEAKIAlpZiAoZXJyKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImZhaWxlZCB0byBpbml0aWFsaXplIG1iYWxsb2MgKCVkKSIsCiAJCQkgZXJyKTsKLQkJZ290byBmYWlsZWRfbW91bnQ0OworCQlnb3RvIGZhaWxlZF9tb3VudDU7CiAJfQogCiAJZXJyID0gZXh0NF9yZWdpc3Rlcl9saV9yZXF1ZXN0KHNiLCBmaXJzdF9ub3RfemVyb2VkKTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWxlZF9tb3VudDQ7CisJCWdvdG8gZmFpbGVkX21vdW50NjsKIAogCXNiaS0+c19rb2JqLmtzZXQgPSBleHQ0X2tzZXQ7CiAJaW5pdF9jb21wbGV0aW9uKCZzYmktPnNfa29ial91bnJlZ2lzdGVyKTsKIAllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmc2JpLT5zX2tvYmosICZleHQ0X2t0eXBlLCBOVUxMLAogCQkJCSAgICIlcyIsIHNiLT5zX2lkKTsKLQlpZiAoZXJyKSB7Ci0JCWV4dDRfbWJfcmVsZWFzZShzYik7Ci0JCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOwotCQlnb3RvIGZhaWxlZF9tb3VudDQ7Ci0JfTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZF9tb3VudDc7CiAKIAlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X09SUEhBTl9GUzsKIAlleHQ0X29ycGhhbl9jbGVhbnVwKHNiLCBlcyk7CkBAIC0zNzU5LDEzICszODMwLDE5IEBACiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIlZGUzogQ2FuJ3QgZmluZCBleHQ0IGZpbGVzeXN0ZW0iKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIAorZmFpbGVkX21vdW50NzoKKwlleHQ0X3VucmVnaXN0ZXJfbGlfcmVxdWVzdChzYik7CitmYWlsZWRfbW91bnQ2OgorCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOworZmFpbGVkX21vdW50NToKKwlleHQ0X21iX3JlbGVhc2Uoc2IpOworCWV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzYik7CiBmYWlsZWRfbW91bnQ0OgogCWlwdXQocm9vdCk7CiAJc2ItPnNfcm9vdCA9IE5VTEw7CiAJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibW91bnQgZmFpbGVkIik7CiAJZGVzdHJveV93b3JrcXVldWUoRVhUNF9TQihzYiktPmRpb191bndyaXR0ZW5fd3EpOwogZmFpbGVkX21vdW50X3dxOgotCWV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzYik7CiAJaWYgKHNiaS0+c19qb3VybmFsKSB7CiAJCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKIAkJc2JpLT5zX2pvdXJuYWwgPSBOVUxMOwpAQCAtMzc3NCwxMCArMzg1MSwxMCBAQAogCWRlbF90aW1lcigmc2JpLT5zX2Vycl9yZXBvcnQpOwogCWlmIChzYmktPnNfZmxleF9ncm91cHMpCiAJCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJaWYgKHNiaS0+c19tbXBfdHNrKQogCQlrdGhyZWFkX3N0b3Aoc2JpLT5zX21tcF90c2spOwogZmFpbGVkX21vdW50MjoKQEAgLTQwNjQsNyArNDE0MSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYmggPSBFWFQ0X1NCKHNiKS0+c19zYmg7CiAJaW50IGVycm9yID0gMDsKIAotCWlmICghc2JoKQorCWlmICghc2JoIHx8IGJsb2NrX2RldmljZV9lamVjdGVkKHNiKSkKIAkJcmV0dXJuIGVycm9yOwogCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKSkgewogCQkvKgpAQCAtNDEwMCw4ICs0MTc3LDkgQEAKIAllbHNlCiAJCWVzLT5zX2tieXRlc193cml0dGVuID0KIAkJCWNwdV90b19sZTY0KEVYVDRfU0Ioc2IpLT5zX2tieXRlc193cml0dGVuKTsKLQlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAotCQkJCQkgICAmRVhUNF9TQihzYiktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSk7CisJZXh0NF9mcmVlX2Jsb2Nrc19jb3VudF9zZXQoZXMsCisJCQlFWFQ0X0MyQihFWFQ0X1NCKHNiKSwgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAorCQkJCSZFWFQ0X1NCKHNiKS0+c19mcmVlY2x1c3RlcnNfY291bnRlcikpKTsKIAllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9CiAJCWNwdV90b19sZTMyKHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgKIAkJCQkmRVhUNF9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSk7CkBAIC00NTA2LDE2ICs0NTg0LDM0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyoKKyAqIE5vdGU6IGNhbGN1bGF0aW5nIHRoZSBvdmVyaGVhZCBzbyB3ZSBjYW4gYmUgY29tcGF0aWJsZSB3aXRoCisgKiBoaXN0b3JpY2FsIEJTRCBwcmFjdGljZSBpcyBxdWl0ZSBkaWZmaWN1bHQgaW4gdGhlIGZhY2Ugb2YKKyAqIGNsdXN0ZXJzL2JpZ2FsbG9jLiAgVGhpcyBpcyBiZWNhdXNlIG11bHRpcGxlIG1ldGFkYXRhIGJsb2NrcyBmcm9tCisgKiBkaWZmZXJlbnQgYmxvY2sgZ3JvdXAgY2FuIGVuZCB1cCBpbiB0aGUgc2FtZSBhbGxvY2F0aW9uIGNsdXN0ZXIuCisgKiBDYWxjdWxhdGluZyB0aGUgZXhhY3Qgb3ZlcmhlYWQgaW4gdGhlIGZhY2Ugb2YgY2x1c3RlcmVkIGFsbG9jYXRpb24KKyAqIHJlcXVpcmVzIGVpdGhlciBPKGFsbCBibG9jayBiaXRtYXBzKSBpbiBtZW1vcnkgb3IgTyhudW1iZXIgb2YgYmxvY2sKKyAqIGdyb3VwcyoqMikgaW4gdGltZS4gIFdlIHdpbGwgc3RpbGwgY2FsY3VsYXRlIHRoZSBzdXBlcmJsb2NrIGZvcgorICogb2xkZXIgZmlsZSBzeXN0ZW1zIC0tLSBhbmQgaWYgd2UgY29tZSBhY3Jvc3Mgd2l0aCBhIGJpZ2FsbG9jIGZpbGUKKyAqIHN5c3RlbSB3aXRoIHplcm8gaW4gc19vdmVyaGVhZF9jbHVzdGVycyB0aGUgZXN0aW1hdGUgd2lsbCBiZSBjbG9zZSB0bworICogY29ycmVjdCBlc3BlY2lhbGx5IGZvciB2ZXJ5IGxhcmdlIGNsdXN0ZXIgc2l6ZXMgLS0tIGJ1dCBmb3IgbmV3ZXIKKyAqIGZpbGUgc3lzdGVtcywgaXQncyBiZXR0ZXIgdG8gY2FsY3VsYXRlIHRoaXMgZmlndXJlIG9uY2UgYXQgbWtmcworICogdGltZSwgYW5kIHN0b3JlIGl0IGluIHRoZSBzdXBlcmJsb2NrLiAgSWYgdGhlIHN1cGVyYmxvY2sgdmFsdWUgaXMKKyAqIHByZXNlbnQgKGV2ZW4gZm9yIG5vbi1iaWdhbGxvYyBmaWxlIHN5c3RlbXMpLCB3ZSB3aWxsIHVzZSBpdC4KKyAqLwogc3RhdGljIGludCBleHQ0X3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwOwogCXU2NCBmc2lkOwogCXM2NCBiZnJlZTsKIAogCWlmICh0ZXN0X29wdChzYiwgTUlOSVhfREYpKSB7CiAJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKGVzLT5zX292ZXJoZWFkX2NsdXN0ZXJzKSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gbGUzMl90b19jcHUoZXMtPnNfb3ZlcmhlYWRfY2x1c3RlcnMpOwogCX0gZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewogCQlleHQ0X2dyb3VwX3QgaSwgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJCWV4dDRfZnNibGtfdCBvdmVyaGVhZCA9IDA7CkBAIC00NTMwLDI0ICs0NjI2LDE2IEBACiAJCSAqIEFsbCBvZiB0aGUgYmxvY2tzIGJlZm9yZSBmaXJzdF9kYXRhX2Jsb2NrIGFyZQogCQkgKiBvdmVyaGVhZAogCQkgKi8KLQkJb3ZlcmhlYWQgPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwkJb3ZlcmhlYWQgPSBFWFQ0X0IyQyhzYmksIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKTsKIAogCQkvKgotCQkgKiBBZGQgdGhlIG92ZXJoZWFkIGF0dHJpYnV0ZWQgdG8gdGhlIHN1cGVyYmxvY2sgYW5kCi0JCSAqIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzLiAgSWYgdGhlIHNwYXJzZSBzdXBlcmJsb2NrcwotCQkgKiBmZWF0dXJlIGlzIHR1cm5lZCBvbiwgdGhlbiBub3QgYWxsIGdyb3VwcyBoYXZlIHRoaXMuCisJCSAqIEFkZCB0aGUgb3ZlcmhlYWQgZm91bmQgaW4gZWFjaCBibG9jayBncm91cAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewotCQkJb3ZlcmhlYWQgKz0gZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGkpICsKLQkJCQlleHQ0X2JnX251bV9nZGIoc2IsIGkpOworCQkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCQlvdmVyaGVhZCArPSBleHQ0X251bV9vdmVyaGVhZF9jbHVzdGVycyhzYiwgaSwgZ2RwKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQl9Ci0KLQkJLyoKLQkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jawotCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KLQkJICovCi0JCW92ZXJoZWFkICs9IG5ncm91cHMgKiAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKTsKIAkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKIAkJc21wX3dtYigpOwogCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CkBAIC00NTU1LDExICs0NjQzLDEyIEBACiAKIAlidWYtPmZfdHlwZSA9IEVYVDRfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChlcykgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKLQliZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikgLQotCQkgICAgICAgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcik7CisJYnVmLT5mX2Jsb2NrcyA9IChleHQ0X2Jsb2Nrc19jb3VudChlcykgLQorCQkJIEVYVDRfQzJCKHNiaSwgc2JpLT5zX292ZXJoZWFkX2xhc3QpKTsKKwliZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVjbHVzdGVyc19jb3VudGVyKSAtCisJCXBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgmc2JpLT5zX2RpcnR5Y2x1c3RlcnNfY291bnRlcik7CiAJLyogcHJldmVudCB1bmRlcmZsb3cgaW4gY2FzZSB0aGF0IGZldyBmcmVlIHNwYWNlIGlzIGF2YWlsYWJsZSAqLwotCWJ1Zi0+Zl9iZnJlZSA9IG1heF90KHM2NCwgYmZyZWUsIDApOworCWJ1Zi0+Zl9iZnJlZSA9IEVYVDRfQzJCKHNiaSwgbWF4X3QoczY0LCBiZnJlZSwgMCkpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgLSBleHQ0X3JfYmxvY2tzX2NvdW50KGVzKTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgZXh0NF9yX2Jsb2Nrc19jb3VudChlcykpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwpAQCAtNDk4MCwxMyArNTA2OSwxMSBAQAogCQlyZXR1cm4gZXJyOwogCWVyciA9IGV4dDRfaW5pdF9zeXN0ZW1fem9uZSgpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0NzsKKwkJZ290byBvdXQ2OwogCWV4dDRfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImV4dDQiLCBOVUxMLCBmc19rb2JqKTsKIAlpZiAoIWV4dDRfa3NldCkKLQkJZ290byBvdXQ2OwotCWV4dDRfcHJvY19yb290ID0gcHJvY19ta2RpcigiZnMvZXh0NCIsIE5VTEwpOwotCWlmICghZXh0NF9wcm9jX3Jvb3QpCiAJCWdvdG8gb3V0NTsKKwlleHQ0X3Byb2Nfcm9vdCA9IHByb2NfbWtkaXIoImZzL2V4dDQiLCBOVUxMKTsKIAogCWVyciA9IGV4dDRfaW5pdF9mZWF0X2FkdmVydHMoKTsKIAlpZiAoZXJyKQpAQCAtNTAyMiwxMiArNTEwOSwxMiBAQAogb3V0MzoKIAlleHQ0X2V4aXRfZmVhdF9hZHZlcnRzKCk7CiBvdXQ0OgotCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9leHQ0IiwgTlVMTCk7Ci1vdXQ1OgorCWlmIChleHQ0X3Byb2Nfcm9vdCkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2V4dDQiLCBOVUxMKTsKIAlrc2V0X3VucmVnaXN0ZXIoZXh0NF9rc2V0KTsKLW91dDY6CitvdXQ1OgogCWV4dDRfZXhpdF9zeXN0ZW1fem9uZSgpOwotb3V0NzoKK291dDY6CiAJZXh0NF9leGl0X3BhZ2VpbygpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L3hhdHRyLmMgYi9mcy9leHQ0L3hhdHRyLmMKaW5kZXggYzc1N2FkYy4uOTNhMDBkOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC94YXR0ci5jCisrKyBiL2ZzL2V4dDQveGF0dHIuYwpAQCAtODIwLDggKzgyMCwxNCBAQAogCQkJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKQogCQkJCWdvYWwgPSBnb2FsICYgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTOwogCisJCQkvKgorCQkJICogdGFrZSBpX2RhdGFfc2VtIGJlY2F1c2Ugd2Ugd2lsbCB0ZXN0CisJCQkgKiBpX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgaW4gZXh0NF9tYl9uZXdfYmxvY2tzCisJCQkgKi8KKwkJCWRvd25fcmVhZCgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKIAkJCWJsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwgMCwKIAkJCQkJCSAgICAgTlVMTCwgJmVycm9yKTsKKwkJCXVwX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCkBAIC05ODUsMTEgKzk5MSw3IEBACiAJbm9fZXhwYW5kID0gZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05PX0VYUEFORCk7CiAJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTk9fRVhQQU5EKTsKIAotCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaXMuaWxvYyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGNsZWFudXA7Ci0KLQllcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaXMuaWxvYy5iaCk7CisJZXJyb3IgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlzLmlsb2MpOwogCWlmIChlcnJvcikKIAkJZ290byBjbGVhbnVwOwogCmRpZmYgLS1naXQgYS9mcy9mYXQvZGlyLmMgYi9mcy9mYXQvZGlyLmMKaW5kZXggNWVmYmQ1ZC4uYWNhMTkxYiAxMDA2NDQKLS0tIGEvZnMvZmF0L2Rpci5jCisrKyBiL2ZzL2ZhdC9kaXIuYwpAQCAtMTU2LDggKzE1Niw4IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAodW5pX3hsYXRlID09IDEpIHsKIAkJCQkqb3ArKyA9ICc6JzsKLQkJCQlvcCA9IHBhY2tfaGV4X2J5dGUob3AsIGVjID4+IDgpOwotCQkJCW9wID0gcGFja19oZXhfYnl0ZShvcCwgZWMpOworCQkJCW9wID0gaGV4X2J5dGVfcGFjayhvcCwgZWMgPj4gOCk7CisJCQkJb3AgPSBoZXhfYnl0ZV9wYWNrKG9wLCBlYyk7CiAJCQkJbGVuIC09IDU7CiAJCQl9IGVsc2UgewogCQkJCSpvcCsrID0gJz8nOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdC5oIGIvZnMvZmF0L2ZhdC5oCmluZGV4IGE1ZDM4NTMuLjE1MTBhNGQgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9mYXQuaAorKysgYi9mcy9mYXQvZmF0LmgKQEAgLTMyNiwxNSArMzI2LDE0IEBACiBleHRlcm4gaW50IGZhdF9mbHVzaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICppMSwKIAkJICAgICAgICAgICAgc3RydWN0IGlub2RlICppMik7CiAvKiBmYXQvbWlzYy5jICovCi1leHRlcm4gdm9pZAotX19mYXRfZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHJlcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpIF9fY29sZDsKK2V4dGVybiBfX3ByaW50ZigzLCA0KSBfX2NvbGQKK3ZvaWQgX19mYXRfZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHJlcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2RlZmluZSBmYXRfZnNfZXJyb3Ioc2IsIGZtdCwgYXJncy4uLikJCVwKIAlfX2ZhdF9mc19lcnJvcihzYiwgMSwgZm10ICwgIyMgYXJncykKICNkZWZpbmUgZmF0X2ZzX2Vycm9yX3JhdGVsaW1pdChzYiwgZm10LCBhcmdzLi4uKSBcCiAJX19mYXRfZnNfZXJyb3Ioc2IsIF9fcmF0ZWxpbWl0KCZNU0RPU19TQihzYiktPnJhdGVsaW1pdCksIGZtdCAsICMjIGFyZ3MpCi12b2lkIGZhdF9tc2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKSBfX2NvbGQ7CitfX3ByaW50ZigzLCA0KSBfX2NvbGQKK3ZvaWQgZmF0X21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIGludCBmYXRfY2x1c3RlcnNfZmx1c2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gaW50IGZhdF9jaGFpbl9hZGQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5ld19kY2x1cywgaW50IG5yX2NsdXN0ZXIpOwogZXh0ZXJuIHZvaWQgZmF0X3RpbWVfZmF0MnVuaXgoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSwgc3RydWN0IHRpbWVzcGVjICp0cywKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggMTcyNmQ3My4uODA4Y2FjNyAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCQkJcmV0dXJuIGVycm9yOwogCQlNU0RPU19JKGlub2RlKS0+bW11X3ByaXZhdGUgPSBpbm9kZS0+aV9zaXplOwogCi0JCWlub2RlLT5pX25saW5rID0gZmF0X3N1YmRpcnMoaW5vZGUpOworCQlzZXRfbmxpbmsoaW5vZGUsIGZhdF9zdWJkaXJzKGlub2RlKSk7CiAJfSBlbHNlIHsgLyogbm90IGEgZGlyZWN0b3J5ICovCiAJCWlub2RlLT5pX2dlbmVyYXRpb24gfD0gMTsKIAkJaW5vZGUtPmlfbW9kZSA9IGZhdF9tYWtlX21vZGUoc2JpLCBkZS0+YXR0ciwKQEAgLTEyMzMsNyArMTIzMyw3IEBACiAJZmF0X3NhdmVfYXR0cnMoaW5vZGUsIEFUVFJfRElSKTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAwOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSBmYXRfc3ViZGlycyhpbm9kZSkrMjsKKwlzZXRfbmxpbmsoaW5vZGUsIGZhdF9zdWJkaXJzKGlub2RlKSsyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZmF0L25hbWVpX21zZG9zLmMgYi9mcy9mYXQvbmFtZWlfbXNkb3MuYwppbmRleCA2NmU4M2I4Li4yMTZiNDE5IDEwMDY0NAotLS0gYS9mcy9mYXQvbmFtZWlfbXNkb3MuYworKysgYi9mcy9mYXQvbmFtZWlfbXNkb3MuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCS8qIHRoZSBkaXJlY3Rvcnkgd2FzIGNvbXBsZXRlZCwganVzdCByZXR1cm4gYSBlcnJvciAqLwogCQlnb3RvIG91dDsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gdHM7CiAJLyogdGltZXN0YW1wIGlzIGFscmVhZHkgd3JpdHRlbiwgc28gbWFya19pbm9kZV9kaXJ0eSgpIGlzIHVubmVlZGVkLiAqLwogCmRpZmYgLS1naXQgYS9mcy9mYXQvbmFtZWlfdmZhdC5jIGIvZnMvZmF0L25hbWVpX3ZmYXQuYwppbmRleCBiYjNmMjljLi5hODdhNjU2IDEwMDY0NAotLS0gYS9mcy9mYXQvbmFtZWlfdmZhdC5jCisrKyBiL2ZzL2ZhdC9uYW1laV92ZmF0LmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJaW5vZGUtPmlfdmVyc2lvbisrOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOwogCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KIApkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCmluZGV4IDFhNDMxMTQuLjdiMmFmNWEgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYworKysgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCWlwLT5pX3VpZCA9ICh1aWRfdCl2aXAtPnZpaV91aWQ7CiAJaXAtPmlfZ2lkID0gKGdpZF90KXZpcC0+dmlpX2dpZDsKIAotCWlwLT5pX25saW5rID0gdmlwLT52aWlfbmxpbms7CisJc2V0X25saW5rKGlwLCB2aXAtPnZpaV9ubGluayk7CiAJaXAtPmlfc2l6ZSA9IHZpcC0+dmlpX3NpemU7CiAKIAlpcC0+aV9hdGltZS50dl9zZWMgPSB2aXAtPnZpaV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggMDRjZjNiOS4uNzNjMzk5MiAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQxLDExICs0MSwyMyBAQAogCXVuc2lnbmVkIGludCBmb3Jfa3VwZGF0ZToxOwogCXVuc2lnbmVkIGludCByYW5nZV9jeWNsaWM6MTsKIAl1bnNpZ25lZCBpbnQgZm9yX2JhY2tncm91bmQ6MTsKKwllbnVtIHdiX3JlYXNvbiByZWFzb247CQkvKiB3aHkgd2FzIHdyaXRlYmFjayBpbml0aWF0ZWQ/ICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBwZW5kaW5nIHdvcmsgbGlzdCAqLwogCXN0cnVjdCBjb21wbGV0aW9uICpkb25lOwkvKiBzZXQgaWYgdGhlIGNhbGxlciB3YWl0cyAqLwogfTsKIAorY29uc3QgY2hhciAqd2JfcmVhc29uX25hbWVbXSA9IHsKKwlbV0JfUkVBU09OX0JBQ0tHUk9VTkRdCQk9ICJiYWNrZ3JvdW5kIiwKKwlbV0JfUkVBU09OX1RSWV9UT19GUkVFX1BBR0VTXQk9ICJ0cnlfdG9fZnJlZV9wYWdlcyIsCisJW1dCX1JFQVNPTl9TWU5DXQkJPSAic3luYyIsCisJW1dCX1JFQVNPTl9QRVJJT0RJQ10JCT0gInBlcmlvZGljIiwKKwlbV0JfUkVBU09OX0xBUFRPUF9USU1FUl0JPSAibGFwdG9wX3RpbWVyIiwKKwlbV0JfUkVBU09OX0ZSRUVfTU9SRV9NRU1dCT0gImZyZWVfbW9yZV9tZW1vcnkiLAorCVtXQl9SRUFTT05fRlNfRlJFRV9TUEFDRV0JPSAiZnNfZnJlZV9zcGFjZSIsCisJW1dCX1JFQVNPTl9GT1JLRVJfVEhSRUFEXQk9ICJmb3JrZXJfdGhyZWFkIgorfTsKKwogLyoKICAqIEluY2x1ZGUgdGhlIGNyZWF0aW9uIG9mIHRoZSB0cmFjZSBwb2ludHMgYWZ0ZXIgZGVmaW5pbmcgdGhlCiAgKiB3Yl93cml0ZWJhY2tfd29yayBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgZGVmaW5pdGlvbiByZW1haW5zIGxvY2FsIHRvIHRoaXMKQEAgLTExNSw3ICsxMjcsNyBAQAogCiBzdGF0aWMgdm9pZAogX19iZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMsCi0JCSAgICAgIGJvb2wgcmFuZ2VfY3ljbGljKQorCQkgICAgICBib29sIHJhbmdlX2N5Y2xpYywgZW51bSB3Yl9yZWFzb24gcmVhc29uKQogewogCXN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayAqd29yazsKIApAQCAtMTM1LDYgKzE0Nyw3IEBACiAJd29yay0+c3luY19tb2RlCT0gV0JfU1lOQ19OT05FOwogCXdvcmstPm5yX3BhZ2VzCT0gbnJfcGFnZXM7CiAJd29yay0+cmFuZ2VfY3ljbGljID0gcmFuZ2VfY3ljbGljOworCXdvcmstPnJlYXNvbgk9IHJlYXNvbjsKIAogCWJkaV9xdWV1ZV93b3JrKGJkaSwgd29yayk7CiB9CkBAIC0xNTAsOSArMTYzLDEwIEBACiAgKiAgIGNvbXBsZXRpb24uIENhbGxlciBuZWVkIG5vdCBob2xkIHNiIHNfdW1vdW50IHNlbWFwaG9yZS4KICAqCiAgKi8KLXZvaWQgYmRpX3N0YXJ0X3dyaXRlYmFjayhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBsb25nIG5yX3BhZ2VzKQordm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMsCisJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7Ci0JX19iZGlfc3RhcnRfd3JpdGViYWNrKGJkaSwgbnJfcGFnZXMsIHRydWUpOworCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCB0cnVlLCByZWFzb24pOwogfQogCiAvKioKQEAgLTI1MSw3ICsyNjUsNyBAQAogICovCiBzdGF0aWMgaW50IG1vdmVfZXhwaXJlZF9pbm9kZXMoc3RydWN0IGxpc3RfaGVhZCAqZGVsYXlpbmdfcXVldWUsCiAJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZGlzcGF0Y2hfcXVldWUsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzKQorCQkJICAgICAgIHN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayAqd29yaykKIHsKIAlMSVNUX0hFQUQodG1wKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpub2RlOwpAQCAtMjYyLDggKzI3Niw4IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoZGVsYXlpbmdfcXVldWUpKSB7CiAJCWlub2RlID0gd2JfaW5vZGUoZGVsYXlpbmdfcXVldWUtPnByZXYpOwotCQlpZiAob2xkZXJfdGhhbl90aGlzICYmCi0JCSAgICBpbm9kZV9kaXJ0aWVkX2FmdGVyKGlub2RlLCAqb2xkZXJfdGhhbl90aGlzKSkKKwkJaWYgKHdvcmstPm9sZGVyX3RoYW5fdGhpcyAmJgorCQkgICAgaW5vZGVfZGlydGllZF9hZnRlcihpbm9kZSwgKndvcmstPm9sZGVyX3RoYW5fdGhpcykpCiAJCQlicmVhazsKIAkJaWYgKHNiICYmIHNiICE9IGlub2RlLT5pX3NiKQogCQkJZG9fc2Jfc29ydCA9IDE7CkBAIC0zMDIsMTMgKzMxNiwxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tPiBkZXF1ZXVlIGZvciBJTwogICovCi1zdGF0aWMgdm9pZCBxdWV1ZV9pbyhzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IsIHVuc2lnbmVkIGxvbmcgKm9sZGVyX3RoYW5fdGhpcykKK3N0YXRpYyB2b2lkIHF1ZXVlX2lvKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3Yiwgc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrKQogewogCWludCBtb3ZlZDsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJndiLT5saXN0X2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJndiLT5iX21vcmVfaW8sICZ3Yi0+Yl9pbyk7Ci0JbW92ZWQgPSBtb3ZlX2V4cGlyZWRfaW5vZGVzKCZ3Yi0+Yl9kaXJ0eSwgJndiLT5iX2lvLCBvbGRlcl90aGFuX3RoaXMpOwotCXRyYWNlX3dyaXRlYmFja19xdWV1ZV9pbyh3Yiwgb2xkZXJfdGhhbl90aGlzLCBtb3ZlZCk7CisJbW92ZWQgPSBtb3ZlX2V4cGlyZWRfaW5vZGVzKCZ3Yi0+Yl9kaXJ0eSwgJndiLT5iX2lvLCB3b3JrKTsKKwl0cmFjZV93cml0ZWJhY2tfcXVldWVfaW8od2IsIHdvcmssIG1vdmVkKTsKIH0KIAogc3RhdGljIGludCB3cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTY0MSwzMSArNjU1LDQwIEBACiAJcmV0dXJuIHdyb3RlOwogfQogCi1sb25nIHdyaXRlYmFja19pbm9kZXNfd2Ioc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLCBsb25nIG5yX3BhZ2VzKQorbG9uZyB3cml0ZWJhY2tfaW5vZGVzX3diKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3YiwgbG9uZyBucl9wYWdlcywKKwkJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJc3RydWN0IHdiX3dyaXRlYmFja193b3JrIHdvcmsgPSB7CiAJCS5ucl9wYWdlcwk9IG5yX3BhZ2VzLAogCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAogCQkucmFuZ2VfY3ljbGljCT0gMSwKKwkJLnJlYXNvbgkJPSByZWFzb24sCiAJfTsKIAogCXNwaW5fbG9jaygmd2ItPmxpc3RfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJndiLT5iX2lvKSkKLQkJcXVldWVfaW8od2IsIE5VTEwpOworCQlxdWV1ZV9pbyh3YiwgJndvcmspOwogCV9fd3JpdGViYWNrX2lub2Rlc193Yih3YiwgJndvcmspOwogCXNwaW5fdW5sb2NrKCZ3Yi0+bGlzdF9sb2NrKTsKIAogCXJldHVybiBucl9wYWdlcyAtIHdvcmsubnJfcGFnZXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBvdmVyX2Jncm91bmRfdGhyZXNoKHZvaWQpCitzdGF0aWMgYm9vbCBvdmVyX2Jncm91bmRfdGhyZXNoKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCiB7CiAJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaCwgZGlydHlfdGhyZXNoOwogCiAJZ2xvYmFsX2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gpOwogCi0JcmV0dXJuIChnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1VOU1RBQkxFX05GUykgPiBiYWNrZ3JvdW5kX3RocmVzaCk7CisJaWYgKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpICsKKwkgICAgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKSA+IGJhY2tncm91bmRfdGhyZXNoKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChiZGlfc3RhdChiZGksIEJESV9SRUNMQUlNQUJMRSkgPgorCQkJCWJkaV9kaXJ0eV9saW1pdChiZGksIGJhY2tncm91bmRfdGhyZXNoKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC02NzUsNyArNjk4LDcgQEAKIHN0YXRpYyB2b2lkIHdiX3VwZGF0ZV9iYW5kd2lkdGgoc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLAogCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSkKIHsKLQlfX2JkaV91cGRhdGVfYmFuZHdpZHRoKHdiLT5iZGksIDAsIDAsIDAsIDAsIHN0YXJ0X3RpbWUpOworCV9fYmRpX3VwZGF0ZV9iYW5kd2lkdGgod2ItPmJkaSwgMCwgMCwgMCwgMCwgMCwgc3RhcnRfdGltZSk7CiB9CiAKIC8qCkBAIC03MjcsNyArNzUwLDcgQEAKIAkJICogRm9yIGJhY2tncm91bmQgd3JpdGVvdXQsIHN0b3Agd2hlbiB3ZSBhcmUgYmVsb3cgdGhlCiAJCSAqIGJhY2tncm91bmQgZGlydHkgdGhyZXNob2xkCiAJCSAqLwotCQlpZiAod29yay0+Zm9yX2JhY2tncm91bmQgJiYgIW92ZXJfYmdyb3VuZF90aHJlc2goKSkKKwkJaWYgKHdvcmstPmZvcl9iYWNrZ3JvdW5kICYmICFvdmVyX2Jncm91bmRfdGhyZXNoKHdiLT5iZGkpKQogCQkJYnJlYWs7CiAKIAkJaWYgKHdvcmstPmZvcl9rdXBkYXRlKSB7CkBAIC03MzgsNyArNzYxLDcgQEAKIAogCQl0cmFjZV93cml0ZWJhY2tfc3RhcnQod2ItPmJkaSwgd29yayk7CiAJCWlmIChsaXN0X2VtcHR5KCZ3Yi0+Yl9pbykpCi0JCQlxdWV1ZV9pbyh3Yiwgd29yay0+b2xkZXJfdGhhbl90aGlzKTsKKwkJCXF1ZXVlX2lvKHdiLCB3b3JrKTsKIAkJaWYgKHdvcmstPnNiKQogCQkJcHJvZ3Jlc3MgPSB3cml0ZWJhY2tfc2JfaW5vZGVzKHdvcmstPnNiLCB3Yiwgd29yayk7CiAJCWVsc2UKQEAgLTgxMSwxMyArODM0LDE0IEBACiAKIHN0YXRpYyBsb25nIHdiX2NoZWNrX2JhY2tncm91bmRfZmx1c2goc3RydWN0IGJkaV93cml0ZWJhY2sgKndiKQogewotCWlmIChvdmVyX2Jncm91bmRfdGhyZXNoKCkpIHsKKwlpZiAob3Zlcl9iZ3JvdW5kX3RocmVzaCh3Yi0+YmRpKSkgewogCiAJCXN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayB3b3JrID0gewogCQkJLm5yX3BhZ2VzCT0gTE9OR19NQVgsCiAJCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAogCQkJLmZvcl9iYWNrZ3JvdW5kCT0gMSwKIAkJCS5yYW5nZV9jeWNsaWMJPSAxLAorCQkJLnJlYXNvbgkJPSBXQl9SRUFTT05fQkFDS0dST1VORCwKIAkJfTsKIAogCQlyZXR1cm4gd2Jfd3JpdGViYWNrKHdiLCAmd29yayk7CkBAIC04NTEsNiArODc1LDcgQEAKIAkJCS5zeW5jX21vZGUJPSBXQl9TWU5DX05PTkUsCiAJCQkuZm9yX2t1cGRhdGUJPSAxLAogCQkJLnJhbmdlX2N5Y2xpYwk9IDEsCisJCQkucmVhc29uCQk9IFdCX1JFQVNPTl9QRVJJT0RJQywKIAkJfTsKIAogCQlyZXR1cm4gd2Jfd3JpdGViYWNrKHdiLCAmd29yayk7CkBAIC05NjksNyArOTk0LDcgQEAKICAqIFN0YXJ0IHdyaXRlYmFjayBvZiBgbnJfcGFnZXMnIHBhZ2VzLiAgSWYgYG5yX3BhZ2VzJyBpcyB6ZXJvLCB3cml0ZSBiYWNrCiAgKiB0aGUgd2hvbGUgd29ybGQuCiAgKi8KLXZvaWQgd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsb25nIG5yX3BhZ2VzKQordm9pZCB3YWtldXBfZmx1c2hlcl90aHJlYWRzKGxvbmcgbnJfcGFnZXMsIGVudW0gd2JfcmVhc29uIHJlYXNvbikKIHsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwogCkBAIC05ODIsNyArMTAwNyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmRpLCAmYmRpX2xpc3QsIGJkaV9saXN0KSB7CiAJCWlmICghYmRpX2hhc19kaXJ0eV9pbyhiZGkpKQogCQkJY29udGludWU7Ci0JCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCBmYWxzZSk7CisJCV9fYmRpX3N0YXJ0X3dyaXRlYmFjayhiZGksIG5yX3BhZ2VzLCBmYWxzZSwgcmVhc29uKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC0xMjAzLDcgKzEyMjgsOSBAQAogICogb24gaG93IG1hbnkgKGlmIGFueSkgd2lsbCBiZSB3cml0dGVuLCBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3YWl0CiAgKiBmb3IgSU8gY29tcGxldGlvbiBvZiBzdWJtaXR0ZWQgSU8uCiAgKi8KLXZvaWQgd3JpdGViYWNrX2lub2Rlc19zYl9ucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIG5yKQordm9pZCB3cml0ZWJhY2tfaW5vZGVzX3NiX25yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgdW5zaWduZWQgbG9uZyBuciwKKwkJCSAgICBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CiAJc3RydWN0IHdiX3dyaXRlYmFja193b3JrIHdvcmsgPSB7CkBAIC0xMjEyLDYgKzEyMzksNyBAQAogCQkudGFnZ2VkX3dyaXRlcGFnZXMJPSAxLAogCQkuZG9uZQkJCT0gJmRvbmUsCiAJCS5ucl9wYWdlcwkJPSBuciwKKwkJLnJlYXNvbgkJCT0gcmVhc29uLAogCX07CiAKIAlXQVJOX09OKCFyd3NlbV9pc19sb2NrZWQoJnNiLT5zX3Vtb3VudCkpOwpAQCAtMTIyOCw5ICsxMjU2LDkgQEAKICAqIG9uIGhvdyBtYW55IChpZiBhbnkpIHdpbGwgYmUgd3JpdHRlbiwgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd2FpdAogICogZm9yIElPIGNvbXBsZXRpb24gb2Ygc3VibWl0dGVkIElPLgogICovCi12b2lkIHdyaXRlYmFja19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgd3JpdGViYWNrX2lub2Rlc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7Ci0JcmV0dXJuIHdyaXRlYmFja19pbm9kZXNfc2JfbnIoc2IsIGdldF9ucl9kaXJ0eV9wYWdlcygpKTsKKwlyZXR1cm4gd3JpdGViYWNrX2lub2Rlc19zYl9ucihzYiwgZ2V0X25yX2RpcnR5X3BhZ2VzKCksIHJlYXNvbik7CiB9CiBFWFBPUlRfU1lNQk9MKHdyaXRlYmFja19pbm9kZXNfc2IpOwogCkBAIC0xMjQxLDExICsxMjY5LDExIEBACiAgKiBJbnZva2Ugd3JpdGViYWNrX2lub2Rlc19zYiBpZiBubyB3cml0ZWJhY2sgaXMgY3VycmVudGx5IHVuZGVyd2F5LgogICogUmV0dXJucyAxIGlmIHdyaXRlYmFjayB3YXMgc3RhcnRlZCwgMCBpZiBub3QuCiAgKi8KLWludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK2ludCB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZW51bSB3Yl9yZWFzb24gcmVhc29uKQogewogCWlmICghd3JpdGViYWNrX2luX3Byb2dyZXNzKHNiLT5zX2JkaSkpIHsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwotCQl3cml0ZWJhY2tfaW5vZGVzX3NiKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYihzYiwgcmVhc29uKTsKIAkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlCkBAIC0xMjYyLDExICsxMjkwLDEyIEBACiAgKiBSZXR1cm5zIDEgaWYgd3JpdGViYWNrIHdhcyBzdGFydGVkLCAwIGlmIG5vdC4KICAqLwogaW50IHdyaXRlYmFja19pbm9kZXNfc2JfbnJfaWZfaWRsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnIpCisJCQkJICAgdW5zaWduZWQgbG9uZyBuciwKKwkJCQkgICBlbnVtIHdiX3JlYXNvbiByZWFzb24pCiB7CiAJaWYgKCF3cml0ZWJhY2tfaW5fcHJvZ3Jlc3Moc2ItPnNfYmRpKSkgewogCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7Ci0JCXdyaXRlYmFja19pbm9kZXNfc2JfbnIoc2IsIG5yKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYl9ucihzYiwgbnIsIHJlYXNvbik7CiAJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CiAJCXJldHVybiAxOwogCX0gZWxzZQpAQCAtMTI5MCw2ICsxMzE5LDcgQEAKIAkJLm5yX3BhZ2VzCT0gTE9OR19NQVgsCiAJCS5yYW5nZV9jeWNsaWMJPSAwLAogCQkuZG9uZQkJPSAmZG9uZSwKKwkJLnJlYXNvbgkJPSBXQl9SRUFTT05fU1lOQywKIAl9OwogCiAJV0FSTl9PTighcndzZW1faXNfbG9ja2VkKCZzYi0+c191bW91bnQpKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggODU1NDJhNy4uNDI1OTNjNSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCWlmIChpb3ApCiAJCWlub2RlLT5pX29wID0gaW9wOwogCWlub2RlLT5pX2ZvcCA9IGZvcDsKLQlpbm9kZS0+aV9ubGluayA9IG5saW5rOworCXNldF9ubGluayhpbm9kZSwgbmxpbmspOwogCWlub2RlLT5pX3ByaXZhdGUgPSBmYzsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlyZXR1cm4gZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9jdXNlLmMgYi9mcy9mdXNlL2N1c2UuYwppbmRleCBiNmNjYTQ3Li4zNDI2NTIxIDEwMDY0NAotLS0gYS9mcy9mdXNlL2N1c2UuYworKysgYi9mcy9mdXNlL2N1c2UuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImZ1c2VfaS5oIgogCmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggYWRkOTZmNi4uM2U2ZDcyNyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIAlpbm9kZS0+aV9pbm8gICAgID0gYXR0ci0+aW5vOwogCWlub2RlLT5pX21vZGUgICAgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgfCAoYXR0ci0+bW9kZSAmIDA3Nzc3KTsKLQlpbm9kZS0+aV9ubGluayAgID0gYXR0ci0+bmxpbms7CisJc2V0X25saW5rKGlub2RlLCBhdHRyLT5ubGluayk7CiAJaW5vZGUtPmlfdWlkICAgICA9IGF0dHItPnVpZDsKIAlpbm9kZS0+aV9naWQgICAgID0gYXR0ci0+Z2lkOwogCWlub2RlLT5pX2Jsb2NrcyAgPSBhdHRyLT5ibG9ja3M7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2FjbC5jIGIvZnMvZ2ZzMi9hY2wuYwppbmRleCAzNDUwMWI2Li42NTk3OGQ3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2FjbC5jCisrKyBiL2ZzL2dmczIvYWNsLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJaWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CiAJCWlhdHRyLmlhX21vZGUgPSBtb2RlOwogCi0JCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShHRlMyX0koaW5vZGUpLCAmaWF0dHIpOworCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsICZpYXR0cik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtMTYwLDYgKzE2MCw3IEBACiAKIGludCBnZnMyX2FjbF9jaG1vZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmlwLT5pX2lub2RlOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKIAljaGFyICpkYXRhOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xNjksNyArMTcwLDcgQEAKIAlpZiAoSVNfRVJSKGFjbCkpCiAJCXJldHVybiBQVFJfRVJSKGFjbCk7CiAJaWYgKCFhY2wpCi0JCXJldHVybiBnZnMyX3NldGF0dHJfc2ltcGxlKGlwLCBhdHRyKTsKKwkJcmV0dXJuIGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOwogCiAJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2QoJmFjbCwgR0ZQX05PRlMsIGF0dHItPmlhX21vZGUpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggZjlmYmJlOS4uNDg1OGUxZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTY2Myw3ICs2NjMsNyBAQAogCWlmICgmaXAtPmlfaW5vZGUgPT0gc2RwLT5zZF9yaW5kZXgpCiAJCXJibG9ja3MgKz0gMiAqIFJFU19TVEFURlM7CiAJaWYgKGFsbG9jX3JlcXVpcmVkKQotCQlyYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJcmJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhpcCk7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCByYmxvY2tzLAogCQkJCSBQQUdFX0NBQ0hFX1NJWkUvc2RwLT5zZF9zYi5zYl9ic2l6ZSk7CkBAIC03ODcsNyArNzg3LDYgQEAKIAl1NjQgdG8gPSBwb3MgKyBjb3BpZWQ7CiAJdm9pZCAqa2FkZHI7CiAJdW5zaWduZWQgY2hhciAqYnVmID0gZGliaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7Ci0Jc3RydWN0IGdmczJfZGlub2RlICpkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7CiAKIAlCVUdfT04oKHBvcyArIGxlbikgPiAoZGliaC0+Yl9zaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpKTsKIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKQEAgLTgwNCw3ICs4MDMsNiBAQAogCWlmIChjb3BpZWQpIHsKIAkJaWYgKGlub2RlLT5pX3NpemUgPCB0bykKIAkJCWlfc2l6ZV93cml0ZShpbm9kZSwgdG8pOwotCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJfQogCkBAIC04NzMsMTAgKzg3MSw2IEBACiAJCWdmczJfcGFnZV9hZGRfZGF0YWJ1ZnMoaXAsIHBhZ2UsIGZyb20sIHRvKTsKIAogCXJldCA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsIGZzZGF0YSk7Ci0JaWYgKHJldCA+IDApIHsKLQkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQl9CiAKIAlpZiAoaW5vZGUgPT0gc2RwLT5zZF9yaW5kZXgpIHsKIAkJYWRqdXN0X2ZzX3NwYWNlKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYm1hcC5jIGIvZnMvZ2ZzMi9ibWFwLmMKaW5kZXggNzg3OGM0Ny4uNDFkNDk0ZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9ibWFwLmMKKysrIGIvZnMvZ2ZzMi9ibWFwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIApAQCAtMzYsMTEgKzM3LDYgQEAKIAlfX3UxNiBtcF9saXN0W0dGUzJfTUFYX01FVEFfSEVJR0hUXTsKIH07CiAKLXR5cGVkZWYgaW50ICgqYmxvY2tfY2FsbF90KSAoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmgsCi0JCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fYmU2NCAqdG9wLAotCQkJICAgICBfX2JlNjQgKmJvdHRvbSwgdW5zaWduZWQgaW50IGhlaWdodCwKLQkJCSAgICAgdm9pZCAqZGF0YSk7Ci0KIHN0cnVjdCBzdHJpcF9taW5lIHsKIAlpbnQgc21fZmlyc3Q7CiAJdW5zaWduZWQgaW50IHNtX2hlaWdodDsKQEAgLTI3Myw2ICsyNjksMzAgQEAKIAlyZXR1cm4gKChfX2JlNjQgKikoYmgtPmJfZGF0YSArIGhlYWRfc2l6ZSkpICsgbXAtPm1wX2xpc3RbaGVpZ2h0XTsKIH0KIAorc3RhdGljIHZvaWQgZ2ZzMl9tZXRhcGF0aF9yYShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGNvbnN0IF9fYmU2NCAqcG9zKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmFiaDsKKwljb25zdCBfX2JlNjQgKmVuZHAgPSAoY29uc3QgX19iZTY0ICopKGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplKTsKKwljb25zdCBfX2JlNjQgKnQ7CisKKwlmb3IgKHQgPSBwb3M7IHQgPCBlbmRwOyB0KyspIHsKKwkJaWYgKCEqdCkKKwkJCWNvbnRpbnVlOworCisJCXJhYmggPSBnZnMyX2dldGJ1ZihnbCwgYmU2NF90b19jcHUoKnQpLCBDUkVBVEUpOworCQlpZiAodHJ5bG9ja19idWZmZXIocmFiaCkpIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKHJhYmgpKSB7CisJCQkJcmFiaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJCQlzdWJtaXRfYmgoUkVBREEgfCBSRVFfTUVUQSwgcmFiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1bmxvY2tfYnVmZmVyKHJhYmgpOworCQl9CisJCWJyZWxzZShyYWJoKTsKKwl9Cit9CisKIC8qKgogICogbG9va3VwX21ldGFwYXRoIC0gV2FsayB0aGUgbWV0YWRhdGEgdHJlZSB0byBhIHNwZWNpZmljIHBvaW50CiAgKiBAaXA6IFRoZSBpbm9kZQpAQCAtNDMyLDEyICs0NTIsMTQgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNkcC0+c2RfdmZzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCA9IG1wLT5tcF9iaFswXTsKIAl1NjQgYm4sIGRibG9jayA9IDA7CiAJdW5zaWduZWQgbiwgaSwgYmxrcywgYWxsb2NlZCA9IDAsIGlibGtzID0gMCwgYnJhbmNoX3N0YXJ0ID0gMDsKIAl1bnNpZ25lZCBkYmxrcyA9IDA7CiAJdW5zaWduZWQgcHRyc19wZXJfYmxrOwogCWNvbnN0IHVuc2lnbmVkIGVuZF9vZl9tZXRhZGF0YSA9IGhlaWdodCAtIDE7CisJaW50IHJldDsKIAlpbnQgZW9iID0gMDsKIAllbnVtIGFsbG9jX3N0YXRlIHN0YXRlOwogCV9fYmU2NCAqcHRyOwpAQCAtNTQwLDYgKzU2MiwxNSBAQAogCQkJZGJsb2NrID0gYm47CiAJCQl3aGlsZSAobi0tID4gMCkKIAkJCQkqcHRyKysgPSBjcHVfdG9fYmU2NChibisrKTsKKwkJCWlmIChidWZmZXJfemVyb25ldyhiaF9tYXApKSB7CisJCQkJcmV0ID0gc2JfaXNzdWVfemVyb291dChzYiwgZGJsb2NrLCBkYmxrcywKKwkJCQkJCSAgICAgICBHRlBfTk9GUyk7CisJCQkJaWYgKHJldCkgeworCQkJCQlmc19lcnIoc2RwLAorCQkJCQkgICAgICAgIkZhaWxlZCB0byB6ZXJvIGRhdGEgYnVmZmVyc1xuIik7CisJCQkJCWNsZWFyX2J1ZmZlcl96ZXJvbmV3KGJoX21hcCk7CisJCQkJfQorCQkJfQogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlICgoc3RhdGUgIT0gQUxMT0NfREFUQSkgfHwgIWRibG9jayk7CkBAIC02NjgsNzYgKzY5OSw2IEBACiB9CiAKIC8qKgotICogcmVjdXJzaXZlX3NjYW4gLSByZWN1cnNpdmVseSBzY2FuIHRocm91Z2ggdGhlIGVuZCBvZiBhIGZpbGUKLSAqIEBpcDogdGhlIGlub2RlCi0gKiBAZGliaDogdGhlIGRpbm9kZSBidWZmZXIKLSAqIEBtcDogdGhlIHBhdGggdGhyb3VnaCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBvaW50IHRvIHN0YXJ0Ci0gKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IHRoZSByZWN1cnNpb24gaXMgYXQKLSAqIEBibG9jazogdGhlIGluZGlyZWN0IGJsb2NrIHRvIGxvb2sgYXQKLSAqIEBmaXJzdDogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jawotICogQGJjOiB0aGUgY2FsbCB0byBtYWtlIGZvciBlYWNoIHBpZWNlIG9mIG1ldGFkYXRhCi0gKiBAZGF0YTogZGF0YSBvcGFxdWUgdG8gdGhpcyBmdW5jdGlvbiB0byBwYXNzIHRvIEBiYwotICoKLSAqIFdoZW4gdGhpcyBpcyBmaXJzdCBjYWxsZWQgQGhlaWdodCBhbmQgQGJsb2NrIHNob3VsZCBiZSB6ZXJvIGFuZAotICogQGZpcnN0IHNob3VsZCBiZSAxLgotICoKLSAqIFJldHVybnM6IGVycm5vCi0gKi8KLQotc3RhdGljIGludCByZWN1cnNpdmVfc2NhbihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCwKLQkJCSAgc3RydWN0IG1ldGFwYXRoICptcCwgdW5zaWduZWQgaW50IGhlaWdodCwKLQkJCSAgdTY0IGJsb2NrLCBpbnQgZmlyc3QsIGJsb2NrX2NhbGxfdCBiYywKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlfX2JlNjQgKnRvcCwgKmJvdHRvbTsKLQl1NjQgYm47Ci0JaW50IGVycm9yOwotCWludCBtaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKTsKLQotCWlmICghaGVpZ2h0KSB7Ci0JCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCQlkaWJoID0gYmg7Ci0KLQkJdG9wID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpICsgbXAtPm1wX2xpc3RbMF07Ci0JCWJvdHRvbSA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSArIHNkcC0+c2RfZGlwdHJzOwotCX0gZWxzZSB7Ci0JCWVycm9yID0gZ2ZzMl9tZXRhX2luZGlyZWN0X2J1ZmZlcihpcCwgaGVpZ2h0LCBibG9jaywgMCwgJmJoKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCi0JCXRvcCA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIG1oX3NpemUpICsKLQkJCQkgIChmaXJzdCA/IG1wLT5tcF9saXN0W2hlaWdodF0gOiAwKTsKLQotCQlib3R0b20gPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBtaF9zaXplKSArIHNkcC0+c2RfaW5wdHJzOwotCX0KLQotCWVycm9yID0gYmMoaXAsIGRpYmgsIGJoLCB0b3AsIGJvdHRvbSwgaGVpZ2h0LCBkYXRhKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGhlaWdodCA8IGlwLT5pX2hlaWdodCAtIDEpCi0JCWZvciAoOyB0b3AgPCBib3R0b207IHRvcCsrLCBmaXJzdCA9IDApIHsKLQkJCWlmICghKnRvcCkKLQkJCQljb250aW51ZTsKLQotCQkJYm4gPSBiZTY0X3RvX2NwdSgqdG9wKTsKLQotCQkJZXJyb3IgPSByZWN1cnNpdmVfc2NhbihpcCwgZGliaCwgbXAsIGhlaWdodCArIDEsIGJuLAotCQkJCQkgICAgICAgZmlyc3QsIGJjLCBkYXRhKTsKLQkJCWlmIChlcnJvcikKLQkJCQlicmVhazsKLQkJfQotCi1vdXQ6Ci0JYnJlbHNlKGJoKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgogICogZG9fc3RyaXAgLSBMb29rIGZvciBhIGxheWVyIGEgcGFydGljdWxhciBsYXllciBvZiB0aGUgZmlsZSBhbmQgc3RyaXAgaXQgb2ZmCiAgKiBAaXA6IHRoZSBpbm9kZQogICogQGRpYmg6IHRoZSBkaW5vZGUgYnVmZmVyCkBAIC03NTIsOSArNzEzLDggQEAKIAogc3RhdGljIGludCBkb19zdHJpcChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGliaCwKIAkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fYmU2NCAqdG9wLCBfX2JlNjQgKmJvdHRvbSwKLQkJICAgIHVuc2lnbmVkIGludCBoZWlnaHQsIHZvaWQgKmRhdGEpCisJCSAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzdHJ1Y3Qgc3RyaXBfbWluZSAqc20pCiB7Ci0Jc3RydWN0IHN0cmlwX21pbmUgKnNtID0gZGF0YTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3Qgcmxpc3Q7CiAJdTY0IGJuLCBic3RhcnQ7CkBAIC03ODMsMTEgKzc0Myw2IEBACiAJZWxzZSBpZiAoaXAtPmlfZGVwdGgpCiAJCXJldm9rZXMgPSBzZHAtPnNkX2lucHRyczsKIAotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQllcnJvciA9IGdmczJfcmluZGV4X2hvbGQoc2RwLCAmaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKLQllbHNlIGlmICghc2RwLT5zZF9yZ3JwcykKLQkJZXJyb3IgPSBnZnMyX3JpX3VwZGF0ZShpcCk7Ci0KIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIApAQCAtODA1LDcgKzc2MCw3IEBACiAJCQlibGVuKys7CiAJCWVsc2UgewogCQkJaWYgKGJzdGFydCkKLQkJCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYnN0YXJ0KTsKKwkJCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCiAJCQlic3RhcnQgPSBibjsKIAkJCWJsZW4gPSAxOwpAQCAtODEzLDcgKzc2OCw3IEBACiAJfQogCiAJaWYgKGJzdGFydCkKLQkJZ2ZzMl9ybGlzdF9hZGQoc2RwLCAmcmxpc3QsIGJzdGFydCk7CisJCWdmczJfcmxpc3RfYWRkKGlwLCAmcmxpc3QsIGJzdGFydCk7CiAJZWxzZQogCQlnb3RvIG91dDsgLyogTm90aGluZyB0byBkbyAqLwogCkBAIC04ODcsMTIgKzg0Miw4MiBAQAogb3V0X3JsaXN0OgogCWdmczJfcmxpc3RfZnJlZSgmcmxpc3QpOwogb3V0OgotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgorICogcmVjdXJzaXZlX3NjYW4gLSByZWN1cnNpdmVseSBzY2FuIHRocm91Z2ggdGhlIGVuZCBvZiBhIGZpbGUKKyAqIEBpcDogdGhlIGlub2RlCisgKiBAZGliaDogdGhlIGRpbm9kZSBidWZmZXIKKyAqIEBtcDogdGhlIHBhdGggdGhyb3VnaCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBvaW50IHRvIHN0YXJ0CisgKiBAaGVpZ2h0OiB0aGUgaGVpZ2h0IHRoZSByZWN1cnNpb24gaXMgYXQKKyAqIEBibG9jazogdGhlIGluZGlyZWN0IGJsb2NrIHRvIGxvb2sgYXQKKyAqIEBmaXJzdDogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaworICogQHNtOiBkYXRhIG9wYXF1ZSB0byB0aGlzIGZ1bmN0aW9uIHRvIHBhc3MgdG8gQGJjCisgKgorICogV2hlbiB0aGlzIGlzIGZpcnN0IGNhbGxlZCBAaGVpZ2h0IGFuZCBAYmxvY2sgc2hvdWxkIGJlIHplcm8gYW5kCisgKiBAZmlyc3Qgc2hvdWxkIGJlIDEuCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IHJlY3Vyc2l2ZV9zY2FuKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoLAorCQkJICBzdHJ1Y3QgbWV0YXBhdGggKm1wLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJICB1NjQgYmxvY2ssIGludCBmaXJzdCwgc3RydWN0IHN0cmlwX21pbmUgKnNtKQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCV9fYmU2NCAqdG9wLCAqYm90dG9tOworCXU2NCBibjsKKwlpbnQgZXJyb3I7CisJaW50IG1oX3NpemUgPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOworCisJaWYgKCFoZWlnaHQpIHsKKwkJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmYmgpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWRpYmggPSBiaDsKKworCQl0b3AgPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSkgKyBtcC0+bXBfbGlzdFswXTsKKwkJYm90dG9tID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpICsgc2RwLT5zZF9kaXB0cnM7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBnZnMyX21ldGFfaW5kaXJlY3RfYnVmZmVyKGlwLCBoZWlnaHQsIGJsb2NrLCAwLCAmYmgpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJdG9wID0gKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgbWhfc2l6ZSkgKworCQkJCSAgKGZpcnN0ID8gbXAtPm1wX2xpc3RbaGVpZ2h0XSA6IDApOworCisJCWJvdHRvbSA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIG1oX3NpemUpICsgc2RwLT5zZF9pbnB0cnM7CisJfQorCisJZXJyb3IgPSBkb19zdHJpcChpcCwgZGliaCwgYmgsIHRvcCwgYm90dG9tLCBoZWlnaHQsIHNtKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGhlaWdodCA8IGlwLT5pX2hlaWdodCAtIDEpIHsKKworCQlnZnMyX21ldGFwYXRoX3JhKGlwLT5pX2dsLCBiaCwgdG9wKTsKKworCQlmb3IgKDsgdG9wIDwgYm90dG9tOyB0b3ArKywgZmlyc3QgPSAwKSB7CisJCQlpZiAoISp0b3ApCisJCQkJY29udGludWU7CisKKwkJCWJuID0gYmU2NF90b19jcHUoKnRvcCk7CisKKwkJCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIGRpYmgsIG1wLCBoZWlnaHQgKyAxLCBibiwKKwkJCQkJICAgICAgIGZpcnN0LCBzbSk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKwl9CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoqCiAgKiBnZnMyX2Jsb2NrX3RydW5jYXRlX3BhZ2UgLSBEZWFsIHdpdGggemVyb2luZyBvdXQgZGF0YSBmb3IgdHJ1bmNhdGUKICAqCiAgKiBUaGlzIGlzIHBhcnRseSBib3Jyb3dlZCBmcm9tIGV4dDMuCkBAIC0xMDMxLDcgKzEwNTYsNyBAQAogCQlzbS5zbV9maXJzdCA9ICEhc2l6ZTsKIAkJc20uc21faGVpZ2h0ID0gaGVpZ2h0OwogCi0JCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIE5VTEwsICZtcCwgMCwgMCwgMSwgZG9fc3RyaXAsICZzbSk7CisJCWVycm9yID0gcmVjdXJzaXZlX3NjYW4oaXAsIE5VTEwsICZtcCwgMCwgMCwgMSwgJnNtKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggMWNjMmY4ZS4uOGNjYWQyNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0yNDAsMTYgKzI0MCwxNSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX3N0dWZmZWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjaGFyICpidWYsCi0JCQkJIHU2NCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplKQorc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX3N0dWZmZWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBfX2JlNjQgKmJ1ZiwKKwkJCQkgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCWlmICghZXJyb3IpIHsKLQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwotCQltZW1jcHkoYnVmLCBkaWJoLT5iX2RhdGEgKyBvZmZzZXQsIHNpemUpOworCQltZW1jcHkoYnVmLCBkaWJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSwgc2l6ZSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAKQEAgLTI2MSwxMyArMjYwLDEyIEBACiAgKiBnZnMyX2Rpcl9yZWFkX2RhdGEgLSBSZWFkIGEgZGF0YSBmcm9tIGEgZGlyZWN0b3J5IGlub2RlCiAgKiBAaXA6IFRoZSBHRlMyIElub2RlCiAgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIHBsYWNlIHJlc3VsdCBpbnRvCi0gKiBAb2Zmc2V0OiBGaWxlIG9mZnNldCB0byBiZWdpbiBqZGF0YV9yZWFkbmcgZnJvbQogICogQHNpemU6IEFtb3VudCBvZiBkYXRhIHRvIHRyYW5zZmVyCiAgKgogICogUmV0dXJuczogVGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGNvcGllZCBvciB0aGUgZXJyb3IKICAqLwotc3RhdGljIGludCBnZnMyX2Rpcl9yZWFkX2RhdGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjaGFyICpidWYsIHU2NCBvZmZzZXQsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgcmEpCitzdGF0aWMgaW50IGdmczJfZGlyX3JlYWRfZGF0YShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIF9fYmU2NCAqYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJdTY0IGxibG9jaywgZGJsb2NrOwpAQCAtMjc1LDI0ICsyNzMsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbzsKIAlpbnQgY29waWVkID0gMDsKIAlpbnQgZXJyb3IgPSAwOwotCXU2NCBkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSk7Ci0KLQlpZiAob2Zmc2V0ID49IGRpc2tzaXplKQotCQlyZXR1cm4gMDsKLQotCWlmIChvZmZzZXQgKyBzaXplID4gZGlza3NpemUpCi0JCXNpemUgPSBkaXNrc2l6ZSAtIG9mZnNldDsKLQotCWlmICghc2l6ZSkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkKLQkJcmV0dXJuIGdmczJfZGlyX3JlYWRfc3R1ZmZlZChpcCwgYnVmLCBvZmZzZXQsIHNpemUpOworCQlyZXR1cm4gZ2ZzMl9kaXJfcmVhZF9zdHVmZmVkKGlwLCBidWYsIHNpemUpOwogCiAJaWYgKGdmczJfYXNzZXJ0X3dhcm4oc2RwLCBnZnMyX2lzX2pkYXRhKGlwKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGJsb2NrID0gb2Zmc2V0OworCWxibG9jayA9IDA7CiAJbyA9IGRvX2RpdihsYmxvY2ssIHNkcC0+c2RfamJzaXplKSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcik7CiAKIAl3aGlsZSAoY29waWVkIDwgc2l6ZSkgewpAQCAtMzExLDggKzI5OSw2IEBACiAJCQlpZiAoZXJyb3IgfHwgIWRibG9jaykKIAkJCQlnb3RvIGZhaWw7CiAJCQlCVUdfT04oZXh0bGVuIDwgMSk7Ci0JCQlpZiAoIXJhKQotCQkJCWV4dGxlbiA9IDE7CiAJCQliaCA9IGdmczJfbWV0YV9yYShpcC0+aV9nbCwgZGJsb2NrLCBleHRsZW4pOwogCQl9IGVsc2UgewogCQkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgZGJsb2NrLCBESU9fV0FJVCwgJmJoKTsKQEAgLTMyOCw3ICszMTQsNyBAQAogCQlleHRsZW4tLTsKIAkJbWVtY3B5KGJ1ZiwgYmgtPmJfZGF0YSArIG8sIGFtb3VudCk7CiAJCWJyZWxzZShiaCk7Ci0JCWJ1ZiArPSBhbW91bnQ7CisJCWJ1ZiArPSAoYW1vdW50L3NpemVvZihfX2JlNjQpKTsKIAkJY29waWVkICs9IGFtb3VudDsKIAkJbGJsb2NrKys7CiAJCW8gPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOwpAQCAtMzcxLDcgKzM1Nyw3IEBACiAJaWYgKGhjID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JcmV0ID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGlwLCAoY2hhciAqKWhjLCAwLCBoc2l6ZSwgMSk7CisJcmV0ID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGlwLCBoYywgaHNpemUpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKGhjKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTE2OTUsNyArMTY4MSw2IEBACiAJY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUgPSAmZGVudHJ5LT5kX25hbWU7CiAJc3RydWN0IGdmczJfZGlyZW50ICpkZW50LCAqcHJldiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlpbnQgZXJyb3I7CiAKIAkvKiBSZXR1cm5zIF9laXRoZXJfIHRoZSBlbnRyeSAoaWYgaXRzIGZpcnN0IGluIGJsb2NrKSBvciB0aGUKIAkgICBwcmV2aW91cyBlbnRyeSBvdGhlcndpc2UgKi8KQEAgLTE3MjQsMjIgKzE3MDksMTUgQEAKIAl9CiAJYnJlbHNlKGJoKTsKIAotCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihkaXAsICZiaCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlpZiAoIWRpcC0+aV9lbnRyaWVzKQogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKLQlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGJoLCAxKTsKIAlkaXAtPmlfZW50cmllcy0tOwogCWRpcC0+aV9pbm9kZS5pX210aW1lID0gZGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQlkcm9wX25saW5rKCZkaXAtPmlfaW5vZGUpOwotCWdmczJfZGlub2RlX291dChkaXAsIGJoLT5iX2RhdGEpOwotCWJyZWxzZShiaCk7CiAJbWFya19pbm9kZV9kaXJ0eSgmZGlwLT5pX2lub2RlKTsKIAotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xODI5LDEwICsxODA3LDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3B1dDsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZkaXAtPmlfYWxsb2MtPmFsX3JpX2doKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X3FzOwotCiAJLyogIENvdW50IHRoZSBudW1iZXIgb2YgbGVhdmVzICAqLwogCWJoID0gbGVhZl9iaDsKIApAQCAtMTg0Nyw3ICsxODIxLDcgQEAKIAkJaWYgKGJsayAhPSBsZWFmX25vKQogCQkJYnJlbHNlKGJoKTsKIAotCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYmxrKTsKKwkJZ2ZzMl9ybGlzdF9hZGQoZGlwLCAmcmxpc3QsIGJsayk7CiAJCWxfYmxvY2tzKys7CiAJfQogCkBAIC0xOTExLDggKzE4ODUsNiBAQAogCWdmczJfZ2xvY2tfZHFfbShybGlzdC5ybF9yZ3Jwcywgcmxpc3QucmxfZ2hzKTsKIG91dF9ybGlzdDoKIAlnZnMyX3JsaXN0X2ZyZWUoJnJsaXN0KTsKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZGlwLT5pX2FsbG9jLT5hbF9yaV9naCk7Ci1vdXRfcXM6CiAJZ2ZzMl9xdW90YV91bmhvbGQoZGlwKTsKIG91dF9wdXQ6CiAJZ2ZzMl9hbGxvY19wdXQoZGlwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggZWRlYjllOC4uY2UzNmE1NiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTU5LDE1ICs1OSwyNCBAQAogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwogCWxvZmZfdCBlcnJvcjsKIAotCWlmIChvcmlnaW4gPT0gMikgeworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSBTRUVLX0VORDogLyogVGhlc2UgcmVmZXJlbmNlIGlub2RlLT5pX3NpemUgKi8KKwljYXNlIFNFRUtfREFUQToKKwljYXNlIFNFRUtfSE9MRToKIAkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgTE1fRkxBR19BTlksCiAJCQkJCSAgICZpX2doKTsKIAkJaWYgKCFlcnJvcikgewotCQkJZXJyb3IgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJCWVycm9yID0gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxlLCBvZmZzZXQsIG9yaWdpbik7CiAJCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaV9naCk7CiAJCX0KLQl9IGVsc2UKLQkJZXJyb3IgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwljYXNlIFNFRUtfU0VUOgorCQllcnJvciA9IGdlbmVyaWNfZmlsZV9sbHNlZWsoZmlsZSwgb2Zmc2V0LCBvcmlnaW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IC1FSU5WQUw7CisJfQogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzU3LDggKzM2NiwxNSBAQAogCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrcywgaW5kX2Jsb2NrcywgcmJsb2NrczsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsOworCWxvZmZfdCBzaXplOwogCWludCByZXQ7CiAKKwkvKiBXYWl0IGlmIGZzIGlzIGZyb3plbi4gVGhpcyBpcyByYWN5IHNvIHdlIGNoZWNrIGFnYWluIGxhdGVyIG9uCisJICogYW5kIHJldHJ5IGlmIHRoZSBmcyBoYXMgYmVlbiBmcm96ZW4gYWZ0ZXIgdGhlIHBhZ2UgbG9jayBoYXMKKwkgKiBiZWVuIGFjcXVpcmVkCisJICovCisJdmZzX2NoZWNrX2Zyb3plbihpbm9kZS0+aV9zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKwogCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKIAlyZXQgPSBnZnMyX2dsb2NrX25xKCZnaCk7CiAJaWYgKHJldCkKQEAgLTM2Nyw4ICszODMsMTUgQEAKIAlzZXRfYml0KEdMRl9ESVJUWSwgJmlwLT5pX2dsLT5nbF9mbGFncyk7CiAJc2V0X2JpdChHSUZfU1dfUEFHRUQsICZpcC0+aV9mbGFncyk7CiAKLQlpZiAoIWdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgUEFHRV9DQUNIRV9TSVpFKSkKKwlpZiAoIWdmczJfd3JpdGVfYWxsb2NfcmVxdWlyZWQoaXAsIHBvcywgUEFHRV9DQUNIRV9TSVpFKSkgeworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQl9CiAJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKIAlyZXQgPSAtRU5PTUVNOwogCWFsID0gZ2ZzMl9hbGxvY19nZXQoaXApOwogCWlmIChhbCA9PSBOVUxMKQpAQCAtMzg4LDcgKzQxMSw3IEBACiAJCXJibG9ja3MgKz0gZGF0YV9ibG9ja3MgPyBkYXRhX2Jsb2NrcyA6IDE7CiAJaWYgKGluZF9ibG9ja3MgfHwgZGF0YV9ibG9ja3MpIHsKIAkJcmJsb2NrcyArPSBSRVNfU1RBVEZTICsgUkVTX1FVT1RBOwotCQlyYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJcmJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhpcCk7CiAJfQogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCByYmxvY2tzLCAwKTsKIAlpZiAocmV0KQpAQCAtMzk2LDIxICs0MTksMjkgQEAKIAogCWxvY2tfcGFnZShwYWdlKTsKIAlyZXQgPSAtRUlOVkFMOwotCWxhc3RfaW5kZXggPSBpcC0+aV9pbm9kZS5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAocGFnZS0+aW5kZXggPiBsYXN0X2luZGV4KQotCQlnb3RvIG91dF91bmxvY2tfcGFnZTsKLQlyZXQgPSAwOwotCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IHBhZ2UtPm1hcHBpbmcgIT0gaXAtPmlfaW5vZGUuaV9tYXBwaW5nKQotCQlnb3RvIG91dF91bmxvY2tfcGFnZTsKLQlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgewotCQlyZXQgPSBnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBwYWdlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3VubG9ja19wYWdlOwotCX0KLQlyZXQgPSBnZnMyX2FsbG9jYXRlX3BhZ2VfYmFja2luZyhwYWdlKTsKKwlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWxhc3RfaW5kZXggPSAoc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJLyogQ2hlY2sgcGFnZSBpbmRleCBhZ2FpbnN0IGlub2RlIHNpemUgKi8KKwlpZiAoc2l6ZSA9PSAwIHx8IChwYWdlLT5pbmRleCA+IGxhc3RfaW5kZXgpKQorCQlnb3RvIG91dF90cmFuc19lbmQ7CiAKLW91dF91bmxvY2tfcGFnZToKLQl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXQgPSAtRUFHQUlOOworCS8qIElmIHRydW5jYXRlZCwgd2UgbXVzdCByZXRyeSB0aGUgb3BlcmF0aW9uLCB3ZSBtYXkgaGF2ZSByYWNlZAorCSAqIHdpdGggdGhlIGdsb2NrIGRlbW90aW9uIGNvZGUuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKQorCQlnb3RvIG91dF90cmFuc19lbmQ7CisKKwkvKiBVbnN0dWZmLCBpZiByZXF1aXJlZCwgYW5kIGFsbG9jYXRlIGJhY2tpbmcgYmxvY2tzIGZvciBwYWdlICovCisJcmV0ID0gMDsKKwlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkKKwkJcmV0ID0gZ2ZzMl91bnN0dWZmX2Rpbm9kZShpcCwgcGFnZSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBnZnMyX2FsbG9jYXRlX3BhZ2VfYmFja2luZyhwYWdlKTsKKworb3V0X3RyYW5zX2VuZDoKKwlpZiAocmV0KQorCQl1bmxvY2tfcGFnZShwYWdlKTsKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogb3V0X3RyYW5zX2ZhaWw6CiAJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoaXApOwpAQCAtNDIyLDExICs0NTMsMTcgQEAKIAlnZnMyX2dsb2NrX2RxKCZnaCk7CiBvdXQ6CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KCZnaCk7Ci0JaWYgKHJldCA9PSAtRU5PTUVNKQotCQlyZXQgPSBWTV9GQVVMVF9PT007Ci0JZWxzZSBpZiAocmV0KQotCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7Ci0JcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCS8qIFRoaXMgY2hlY2sgbXVzdCBiZSBwb3N0IGRyb3BwaW5nIG9mIHRyYW5zYWN0aW9uIGxvY2sgKi8KKwkJaWYgKGlub2RlLT5pX3NiLT5zX2Zyb3plbiA9PSBTQl9VTkZST1pFTikgeworCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJfQorCX0KKwlyZXR1cm4gYmxvY2tfcGFnZV9ta3dyaXRlX3JldHVybihyZXQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGdmczJfdm1fb3BzID0gewpAQCAtNTUxLDggKzU4OCwxNiBAQAogICogQGVuZDogdGhlIGVuZCBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzeW5jCiAgKiBAZGF0YXN5bmM6IHNldCBpZiB3ZSBjYW4gaWdub3JlIHRpbWVzdGFtcCBjaGFuZ2VzCiAgKgotICogVGhlIFZGUyB3aWxsIGZsdXNoIGRhdGEgZm9yIHVzLiBXZSBvbmx5IG5lZWQgdG8gd29ycnkKLSAqIGFib3V0IG1ldGFkYXRhIGhlcmUuCisgKiBXZSBzcGxpdCB0aGUgZGF0YSBmbHVzaGluZyBoZXJlIHNvIHRoYXQgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGRhdGEKKyAqIHVudGlsIGFmdGVyIHdlJ3ZlIGFsc28gc2VudCB0aGUgbWV0YWRhdGEgdG8gZGlzay4gTm90ZSB0aGF0IGZvcgorICogZGF0YT1vcmRlcmVkLCB3ZSB3aWxsIHdyaXRlICYgd2FpdCBmb3IgdGhlIGRhdGEgYXQgdGhlIGxvZyBmbHVzaAorICogc3RhZ2UgYW55d2F5LCBzbyB0aGlzIGlzIHVubGlrZWx5IHRvIG1ha2UgbXVjaCBvZiBhIGRpZmZlcmVuY2UKKyAqIGV4Y2VwdCBpbiB0aGUgZGF0YT13cml0ZWJhY2sgY2FzZS4KKyAqCisgKiBJZiB0aGUgZmRhdGF3cml0ZSBmYWlscyBkdWUgdG8gYW55IHJlYXNvbiBleGNlcHQgLUVJTywgd2Ugd2lsbAorICogY29udGludWUgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnN5bmMsIGFsdGhvdWdoIHdlJ2xsIHN0aWxsIHJlcG9ydAorICogdGhlIGVycm9yIGF0IHRoZSBlbmQuIFRoaXMgaXMgdG8gbWF0Y2ggZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZSgpCisgKiBiZWhhdmlvdXIuCiAgKgogICogUmV0dXJuczogZXJybm8KICAqLwpAQCAtNTYwLDMwICs2MDUsMzQgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAogCQkgICAgICBpbnQgZGF0YXN5bmMpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgc3luY19zdGF0ZSA9IGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKTsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwotCWludCByZXQ7CisJaW50IHJldCwgcmV0MSA9IDA7CiAKLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CisJCXJldDEgPSBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCk7CisJCWlmIChyZXQxID09IC1FSU8pCisJCQlyZXR1cm4gcmV0MTsKKwl9CiAKIAlpZiAoZGF0YXN5bmMpCiAJCXN5bmNfc3RhdGUgJj0gfklfRElSVFlfU1lOQzsKIAogCWlmIChzeW5jX3N0YXRlKSB7CiAJCXJldCA9IHN5bmNfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIDEpOwotCQlpZiAocmV0KSB7Ci0JCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZ2ZzMl9haWxfZmx1c2goaXAtPmlfZ2wpOworCQlpZiAoZ2ZzMl9pc19qZGF0YShpcCkpCisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQlnZnMyX2FpbF9mbHVzaChpcC0+aV9nbCwgMSk7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmV0dXJuIDA7CisJaWYgKG1hcHBpbmctPm5ycGFnZXMpCisJCXJldCA9IGZpbGVtYXBfZmRhdGF3YWl0X3JhbmdlKG1hcHBpbmcsIHN0YXJ0LCBlbmQpOworCisJcmV0dXJuIHJldCA/IHJldCA6IHJldDE7CiB9CiAKIC8qKgpAQCAtNjIwLDEzNSArNjY5LDE4IEBACiAJcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwogfQogCi1zdGF0aWMgaW50IGVtcHR5X3dyaXRlX2VuZChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwKLQkJCSAgIHVuc2lnbmVkIHRvLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JdW5zaWduZWQgb2Zmc2V0LCBibGtzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCXBnb2ZmX3QgZW5kX2luZGV4ID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQl6ZXJvX3VzZXIocGFnZSwgZnJvbSwgdG8tZnJvbSk7Ci0JbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOwotCi0JaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4IHx8ICEobW9kZSAmIEZBTExPQ19GTF9LRUVQX1NJWkUpKSB7Ci0JCWlmICghZ2ZzMl9pc193cml0ZWJhY2soaXApKQotCQkJZ2ZzMl9wYWdlX2FkZF9kYXRhYnVmcyhpcCwgcGFnZSwgZnJvbSwgdG8pOwotCi0JCWJsb2NrX2NvbW1pdF93cml0ZShwYWdlLCBmcm9tLCB0byk7Ci0JCXJldHVybiAwOwotCX0KLQotCW9mZnNldCA9IDA7Ci0JYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ci0Jd2hpbGUgKG9mZnNldCA8IHRvKSB7Ci0JCWlmIChvZmZzZXQgPj0gZnJvbSkgewotCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKLQkJCXdyaXRlX2RpcnR5X2J1ZmZlcihiaCwgV1JJVEUpOwotCQl9Ci0JCW9mZnNldCArPSBibGtzaXplOwotCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKLQl9Ci0KLQlvZmZzZXQgPSAwOwotCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotCXdoaWxlIChvZmZzZXQgPCB0bykgewotCQlpZiAob2Zmc2V0ID49IGZyb20pIHsKLQkJCXdhaXRfb25fYnVmZmVyKGJoKTsKLQkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfQotCQlvZmZzZXQgKz0gYmxrc2l6ZTsKLQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5lZWRzX2VtcHR5X3dyaXRlKHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwIH07Ci0KLQliaF9tYXAuYl9zaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGJsb2NrLCAmYmhfbWFwLCAwKTsKLQlpZiAodW5saWtlbHkoZXJyb3IpKQotCQlyZXR1cm4gZXJyb3I7Ci0JcmV0dXJuICFidWZmZXJfbWFwcGVkKCZiaF9tYXApOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2VtcHR5X2Jsb2NrcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sCi0JCQkgICAgICBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQl1bnNpZ25lZCBzdGFydCwgZW5kLCBuZXh0LCBibGtzaXplOwotCXNlY3Rvcl90IGJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKLQlpbnQgcmV0OwotCi0JYmxrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKLQluZXh0ID0gZW5kID0gMDsKLQl3aGlsZSAobmV4dCA8IGZyb20pIHsKLQkJbmV4dCArPSBibGtzaXplOwotCQlibG9jaysrOwotCX0KLQlzdGFydCA9IG5leHQ7Ci0JZG8gewotCQluZXh0ICs9IGJsa3NpemU7Ci0JCXJldCA9IG5lZWRzX2VtcHR5X3dyaXRlKGJsb2NrLCBpbm9kZSk7Ci0JCWlmICh1bmxpa2VseShyZXQgPCAwKSkKLQkJCXJldHVybiByZXQ7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJaWYgKGVuZCkgewotCQkJCXJldCA9IF9fYmxvY2tfd3JpdGVfYmVnaW4ocGFnZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LAotCQkJCQkJCSAgZ2ZzMl9ibG9ja19tYXApOwotCQkJCWlmICh1bmxpa2VseShyZXQpKQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCXJldCA9IGVtcHR5X3dyaXRlX2VuZChwYWdlLCBzdGFydCwgZW5kLCBtb2RlKTsKLQkJCQlpZiAodW5saWtlbHkocmV0KSkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCQllbmQgPSAwOwotCQkJfQotCQkJc3RhcnQgPSBuZXh0OwotCQl9Ci0JCWVsc2UKLQkJCWVuZCA9IG5leHQ7Ci0JCWJsb2NrKys7Ci0JfSB3aGlsZSAobmV4dCA8IHRvKTsKLQotCWlmIChlbmQpIHsKLQkJcmV0ID0gX19ibG9ja193cml0ZV9iZWdpbihwYWdlLCBzdGFydCwgZW5kIC0gc3RhcnQsIGdmczJfYmxvY2tfbWFwKTsKLQkJaWYgKHVubGlrZWx5KHJldCkpCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBlbXB0eV93cml0ZV9lbmQocGFnZSwgc3RhcnQsIGVuZCwgbW9kZSk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmYWxsb2NhdGVfY2h1bmsoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbiwKIAkJCSAgIGludCBtb2RlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKLQl1NjQgc3RhcnQgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfQ0FDSEVfTUFTSzsKLQl1NjQgZW5kID0gKG9mZnNldCArIGxlbiAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JcGdvZmZfdCBjdXJyOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGludCBlbmRfb2Zmc2V0ID0gKG9mZnNldCArIGxlbikgJiB+UEFHRV9DQUNIRV9NQVNLOwotCXVuc2lnbmVkIGludCBmcm9tLCB0bzsKLQotCWlmICghZW5kX29mZnNldCkKLQkJZW5kX29mZnNldCA9IFBBR0VfQ0FDSEVfU0laRTsKKwl1bnNpZ25lZCBpbnQgbnJfYmxrczsKKwlzZWN0b3JfdCBsYmxvY2sgPSBvZmZzZXQgPj4gaW5vZGUtPmlfYmxrYml0czsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCWlmICh1bmxpa2VseShlcnJvcikpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7CiAKQEAgLTc1OCw0MCArNjkwLDMxIEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQljdXJyID0gc3RhcnQ7Ci0Jb2Zmc2V0ID0gc3RhcnQgPDwgUEFHRV9DQUNIRV9TSElGVDsKLQlmcm9tID0gc3RhcnRfb2Zmc2V0OwotCXRvID0gUEFHRV9DQUNIRV9TSVpFOwotCXdoaWxlIChjdXJyIDw9IGVuZCkgewotCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlX3dyaXRlX2JlZ2luKGlub2RlLT5pX21hcHBpbmcsIGN1cnIsCi0JCQkJCQkgICBBT1BfRkxBR19OT0ZTKTsKLQkJaWYgKHVubGlrZWx5KCFwYWdlKSkgewotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KKwl3aGlsZSAobGVuKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKKwkJYmhfbWFwLmJfc2l6ZSA9IGxlbjsKKwkJc2V0X2J1ZmZlcl96ZXJvbmV3KCZiaF9tYXApOwogCi0JCWlmIChjdXJyID09IGVuZCkKLQkJCXRvID0gZW5kX29mZnNldDsKLQkJZXJyb3IgPSB3cml0ZV9lbXB0eV9ibG9ja3MocGFnZSwgZnJvbSwgdG8sIG1vZGUpOwotCQlpZiAoIWVycm9yICYmIG9mZnNldCArIHRvID4gaW5vZGUtPmlfc2l6ZSAmJgotCQkgICAgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpIHsKLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0ICsgdG8pOwotCQl9Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWlmIChlcnJvcikKKwkJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAmYmhfbWFwLCAxKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJCWdvdG8gb3V0OwotCQljdXJyKys7Ci0JCW9mZnNldCArPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWZyb20gPSAwOworCQlsZW4gLT0gYmhfbWFwLmJfc2l6ZTsKKwkJbnJfYmxrcyA9IGJoX21hcC5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKKwkJbGJsb2NrICs9IG5yX2Jsa3M7CisJCWlmICghYnVmZmVyX25ldygmYmhfbWFwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl96ZXJvbmV3KCZiaF9tYXApKSkgeworCQkJZXJyb3IgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KIAl9CisJaWYgKG9mZnNldCArIGxlbiA+IGlub2RlLT5pX3NpemUgJiYgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0ICsgbGVuKTsKIAotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAotCWJyZWxzZShkaWJoKTsKLQogb3V0OgorCWJyZWxzZShkaWJoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTc5OSw3ICs3MjIsNyBAQAogCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcykKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcyA9IGlwLT5pX2FsbG9jLT5hbF9yZ2QtPnJkX2ZyZWVfY2xvbmU7CisJdW5zaWduZWQgaW50IG1heF9ibG9ja3MgPSBpcC0+aV9yZ2QtPnJkX2ZyZWVfY2xvbmU7CiAJdW5zaWduZWQgaW50IHRtcCwgbWF4X2RhdGEgPSBtYXhfYmxvY2tzIC0gMyAqIChzZHAtPnNkX21heF9oZWlnaHQgLSAxKTsKIAogCWZvciAodG1wID0gbWF4X2RhdGE7IHRtcCA+IHNkcC0+c2RfZGlwdHJzOykgewpAQCAtODMxLDYgKzc1NCw3IEBACiAJaW50IGVycm9yOwogCWxvZmZfdCBic2l6ZV9tYXNrID0gfigobG9mZl90KXNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKTsKIAlsb2ZmX3QgbmV4dCA9IChvZmZzZXQgKyBsZW4gLSAxKSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OworCWxvZmZfdCBtYXhfY2h1bmtfc2l6ZSA9IFVJTlRfTUFYICYgYnNpemVfbWFzazsKIAluZXh0ID0gKG5leHQgKyAxKSA8PCBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCiAJLyogV2Ugb25seSBzdXBwb3J0IHRoZSBGQUxMT0NfRkxfS0VFUF9TSVpFIG1vZGUgKi8KQEAgLTg4NCwxMSArODA4LDEyIEBACiAJCQlnb3RvIG91dF9xdW5sb2NrOwogCQl9CiAJCW1heF9ieXRlcyA9IGJ5dGVzOwotCQljYWxjX21heF9yZXNlcnYoaXAsIGxlbiwgJm1heF9ieXRlcywgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisJCWNhbGNfbWF4X3Jlc2VydihpcCwgKGxlbiA+IG1heF9jaHVua19zaXplKT8gbWF4X2NodW5rX3NpemU6IGxlbiwKKwkJCQkmbWF4X2J5dGVzLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIAkJYWwtPmFsX3JlcXVlc3RlZCA9IGRhdGFfYmxvY2tzICsgaW5kX2Jsb2NrczsKIAogCQlyYmxvY2tzID0gUkVTX0RJTk9ERSArIGluZF9ibG9ja3MgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBICsKLQkJCSAgUkVTX1JHX0hEUiArIGdmczJfcmdfYmxvY2tzKGFsKTsKKwkJCSAgUkVTX1JHX0hEUiArIGdmczJfcmdfYmxvY2tzKGlwKTsKIAkJaWYgKGdmczJfaXNfamRhdGEoaXApKQogCQkJcmJsb2NrcyArPSBkYXRhX2Jsb2NrcyA/IGRhdGFfYmxvY2tzIDogMTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9jay5oIGIvZnMvZ2ZzMi9nbG9jay5oCmluZGV4IDY2NzA3MTEuLjI1NTNiODUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvY2suaAorKysgYi9mcy9nZnMyL2dsb2NrLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogdm9pZCBnZnMyX2dsb2NrX2RxX20odW5zaWduZWQgaW50IG51bV9naCwgc3RydWN0IGdmczJfaG9sZGVyICpnaHMpOwogdm9pZCBnZnMyX2dsb2NrX2RxX3VuaW5pdF9tKHVuc2lnbmVkIGludCBudW1fZ2gsIHN0cnVjdCBnZnMyX2hvbGRlciAqZ2hzKTsKIAotX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK19fcHJpbnRmKDIsIDMpCiB2b2lkIGdmczJfcHJpbnRfZGJnKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9wcy5jIGIvZnMvZ2ZzMi9nbG9wcy5jCmluZGV4IGRhMjFlY2EuLjE2NTZkZjdhIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmMKKysrIGIvZnMvZ2ZzMi9nbG9wcy5jCkBAIC0yOCw0MCArMjgsNTUgQEAKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgImRpci5oIgogCitzdGF0aWMgdm9pZCBnZnMyX2FpbF9lcnJvcihzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJZnNfZXJyKGdsLT5nbF9zYmQsICJBSUwgYnVmZmVyICVwOiBibG9ja25yICVsbHUgc3RhdGUgMHglMDhseCBtYXBwaW5nICVwIHBhZ2Ugc3RhdGUgMHglbHhcbiIsCisJICAgICAgIGJoLCAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGJoLT5iX3N0YXRlLAorCSAgICAgICBiaC0+Yl9wYWdlLT5tYXBwaW5nLCBiaC0+Yl9wYWdlLT5mbGFncyk7CisJZnNfZXJyKGdsLT5nbF9zYmQsICJBSUwgZ2xvY2sgJXU6JWxsdSBtYXBwaW5nICVwXG4iLAorCSAgICAgICBnbC0+Z2xfbmFtZS5sbl90eXBlLCBnbC0+Z2xfbmFtZS5sbl9udW1iZXIsCisJICAgICAgIGdmczJfZ2xvY2syYXNwYWNlKGdsKSk7CisJZ2ZzMl9sbV93aXRoZHJhdyhnbC0+Z2xfc2JkLCAiQUlMIGVycm9yXG4iKTsKK30KKwogLyoqCiAgKiBfX2dmczJfYWlsX2ZsdXNoIC0gcmVtb3ZlIGFsbCBidWZmZXJzIGZvciBhIGdpdmVuIGxvY2sgZnJvbSB0aGUgQUlMCiAgKiBAZ2w6IHRoZSBnbG9jaworICogQGZzeW5jOiBzZXQgd2hlbiBjYWxsZWQgZnJvbSBmc3luYyAobm90IGFsbCBidWZmZXJzIHdpbGwgYmUgY2xlYW4pCiAgKgogICogTm9uZSBvZiB0aGUgYnVmZmVycyBzaG91bGQgYmUgZGlydHksIGxvY2tlZCwgb3IgcGlubmVkLgogICovCiAKLXN0YXRpYyB2b2lkIF9fZ2ZzMl9haWxfZmx1c2goc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorc3RhdGljIHZvaWQgX19nZnMyX2FpbF9mbHVzaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGJvb2wgZnN5bmMpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZ2wtPmdsX2FpbF9saXN0OwotCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkOworCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkLCAqdG1wOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY29uc3QgdW5zaWduZWQgbG9uZyBiX3N0YXRlID0gKDFVTCA8PCBCSF9EaXJ0eSl8KDFVTCA8PCBCSF9QaW5uZWQpfCgxVUwgPDwgQkhfTG9jayk7CisJc2VjdG9yX3QgYmxvY2tucjsKIAorCWdmczJfbG9nX2xvY2soc2RwKTsKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewotCQliZCA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IGdmczJfYnVmZGF0YSwKLQkJCQliZF9haWxfZ2xfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJkLCB0bXAsIGhlYWQsIGJkX2FpbF9nbF9saXN0KSB7CiAJCWJoID0gYmQtPmJkX2JoOwotCQlnZnMyX3JlbW92ZV9mcm9tX2FpbChiZCk7Ci0JCWJkLT5iZF9iaCA9IE5VTEw7CisJCWlmIChiaC0+Yl9zdGF0ZSAmIGJfc3RhdGUpIHsKKwkJCWlmIChmc3luYykKKwkJCQljb250aW51ZTsKKwkJCWdmczJfYWlsX2Vycm9yKGdsLCBiaCk7CisJCX0KKwkJYmxvY2tuciA9IGJoLT5iX2Jsb2NrbnI7CiAJCWJoLT5iX3ByaXZhdGUgPSBOVUxMOwotCQlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CisJCWdmczJfcmVtb3ZlX2Zyb21fYWlsKGJkKTsgLyogZHJvcHMgcmVmIG9uIGJoICovCiAKLQkJYmQtPmJkX2Jsa25vID0gYmgtPmJfYmxvY2tucjsKLQkJZ2ZzMl9sb2dfbG9jayhzZHApOwotCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsICFidWZmZXJfYnVzeShiaCkpOworCQliZC0+YmRfYmggPSBOVUxMOworCQliZC0+YmRfYmxrbm8gPSBibG9ja25yOworCiAJCWdmczJfdHJhbnNfYWRkX3Jldm9rZShzZHAsIGJkKTsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0KLQkJc3Bpbl9sb2NrKCZzZHAtPnNkX2FpbF9sb2NrKTsKIAl9Ci0JZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCAhYXRvbWljX3JlYWQoJmdsLT5nbF9haWxfY291bnQpKTsKKwlCVUdfT04oIWZzeW5jICYmIGF0b21pY19yZWFkKCZnbC0+Z2xfYWlsX2NvdW50KSk7CiAJc3Bpbl91bmxvY2soJnNkcC0+c2RfYWlsX2xvY2spOworCWdmczJfbG9nX3VubG9jayhzZHApOwogfQogCiAKQEAgLTg0LDEzICs5OSwxMyBAQAogCUJVR19PTihjdXJyZW50LT5qb3VybmFsX2luZm8pOwogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9ICZ0cjsKIAotCV9fZ2ZzMl9haWxfZmx1c2goZ2wpOworCV9fZ2ZzMl9haWxfZmx1c2goZ2wsIDApOwogCiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOwogfQogCi12b2lkIGdmczJfYWlsX2ZsdXNoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3ZvaWQgZ2ZzMl9haWxfZmx1c2goc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBib29sIGZzeW5jKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKIAl1bnNpZ25lZCBpbnQgcmV2b2tlcyA9IGF0b21pY19yZWFkKCZnbC0+Z2xfYWlsX2NvdW50KTsKQEAgLTEwMiw3ICsxMTcsNyBAQAogCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAwLCByZXZva2VzKTsKIAlpZiAocmV0KQogCQlyZXR1cm47Ci0JX19nZnMyX2FpbF9mbHVzaChnbCk7CisJX19nZnMyX2FpbF9mbHVzaChnbCwgZnN5bmMpOwogCWdmczJfdHJhbnNfZW5kKHNkcCk7CiAJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKIH0KQEAgLTExOSw2ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgcmdycF9nb19zeW5jKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWV0YW1hcHBpbmcgPSBnZnMyX2dsb2NrMmFzcGFjZShnbCk7CisJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpKQpAQCAtMTMwLDYgKzE0NiwxMiBAQAogCWVycm9yID0gZmlsZW1hcF9mZGF0YXdhaXQobWV0YW1hcHBpbmcpOwogICAgICAgICBtYXBwaW5nX3NldF9lcnJvcihtZXRhbWFwcGluZywgZXJyb3IpOwogCWdmczJfYWlsX2VtcHR5X2dsKGdsKTsKKworCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOworCXJnZCA9IGdsLT5nbF9vYmplY3Q7CisJaWYgKHJnZCkKKwkJZ2ZzMl9mcmVlX2Nsb25lcyhyZ2QpOworCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CiB9CiAKIC8qKgpAQCAtMjc3LDcgKzI5OSw3IEBACiAJCWlmIChubGluayA9PSAwKQogCQkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQllbHNlCi0JCQlpbm9kZS0+aV9ubGluayA9IG5saW5rOworCQkJc2V0X25saW5rKGlub2RlLCBubGluayk7CiAJfQogfQogCkBAIC00MzAsMzMgKzQ1Miw2IEBACiB9CiAKIC8qKgotICogcmdycF9nb19sb2NrIC0gb3BlcmF0aW9uIGRvbmUgYWZ0ZXIgYW4gcmdycCBsb2NrIGlzIGxvY2tlZCBieQotICogICAgYSBmaXJzdCBob2xkZXIgb24gdGhpcyBub2RlLgotICogQGdsOiB0aGUgZ2xvY2sKLSAqIEBmbGFnczoKLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLXN0YXRpYyBpbnQgcmdycF9nb19sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCi17Ci0JcmV0dXJuIGdmczJfcmdycF9iaF9nZXQoZ2gtPmdoX2dsLT5nbF9vYmplY3QpOwotfQotCi0vKioKLSAqIHJncnBfZ29fdW5sb2NrIC0gb3BlcmF0aW9uIGRvbmUgYmVmb3JlIGFuIHJncnAgbG9jayBpcyB1bmxvY2tlZCBieQotICogICAgYSBsYXN0IGhvbGRlciBvbiB0aGlzIG5vZGUuCi0gKiBAZ2w6IHRoZSBnbG9jawotICogQGZsYWdzOgotICoKLSAqLwotCi1zdGF0aWMgdm9pZCByZ3JwX2dvX3VubG9jayhzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKQotewotCWdmczJfcmdycF9iaF9wdXQoZ2gtPmdoX2dsLT5nbF9vYmplY3QpOwotfQotCi0vKioKICAqIHRyYW5zX2dvX3N5bmMgLSBwcm9tb3RlL2RlbW90ZSB0aGUgdHJhbnNhY3Rpb24gZ2xvY2sKICAqIEBnbDogdGhlIGdsb2NrCiAgKiBAc3RhdGU6IHRoZSByZXF1ZXN0ZWQgc3RhdGUKQEAgLTU1OCw4ICs1NTMsOCBAQAogY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyBnZnMyX3JncnBfZ2xvcHMgPSB7CiAJLmdvX3htb3RlX3RoID0gcmdycF9nb19zeW5jLAogCS5nb19pbnZhbCA9IHJncnBfZ29faW52YWwsCi0JLmdvX2xvY2sgPSByZ3JwX2dvX2xvY2ssCi0JLmdvX3VubG9jayA9IHJncnBfZ29fdW5sb2NrLAorCS5nb19sb2NrID0gZ2ZzMl9yZ3JwX2dvX2xvY2ssCisJLmdvX3VubG9jayA9IGdmczJfcmdycF9nb191bmxvY2ssCiAJLmdvX2R1bXAgPSBnZnMyX3JncnBfZHVtcCwKIAkuZ29fdHlwZSA9IExNX1RZUEVfUkdSUCwKIAkuZ29fZmxhZ3MgPSBHTE9GX0FTUEFDRSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvcHMuaCBiL2ZzL2dmczIvZ2xvcHMuaAppbmRleCA2ZmNlNDA5Li5iZjk1YTJkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmgKKysrIGIvZnMvZ2ZzMi9nbG9wcy5oCkBAIC0yMyw2ICsyMyw2IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyBnZnMyX2pvdXJuYWxfZ2xvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2ZzMl9nbG9wc19saXN0W107CiAKLWV4dGVybiB2b2lkIGdmczJfYWlsX2ZsdXNoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CitleHRlcm4gdm9pZCBnZnMyX2FpbF9mbHVzaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGJvb2wgZnN5bmMpOwogCiAjZW5kaWYgLyogX19HTE9QU19ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCA4OTJhYzM3Li43Mzg5ZGZkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfYmwuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAKICNkZWZpbmUgRElPX1dBSVQJMHgwMDAwMDAxMAogI2RlZmluZSBESU9fTUVUQURBVEEJMHgwMDAwMDAyMApAQCAtNzgsOCArNzksNyBAQAogfTsKIAogc3RydWN0IGdmczJfcmdycGQgewotCXN0cnVjdCBsaXN0X2hlYWQgcmRfbGlzdDsJLyogTGluayB3aXRoIHN1cGVyYmxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJkX2xpc3RfbXJ1OworCXN0cnVjdCByYl9ub2RlIHJkX25vZGU7CQkvKiBMaW5rIHdpdGggc3VwZXJibG9jayAqLwogCXN0cnVjdCBnZnMyX2dsb2NrICpyZF9nbDsJLyogR2xvY2sgZm9yIHRoaXMgcmdycCAqLwogCXU2NCByZF9hZGRyOwkJCS8qIGdycCBibG9jayBkaXNrIGFkZHJlc3MgKi8KIAl1NjQgcmRfZGF0YTA7CQkJLyogZmlyc3QgZGF0YSBsb2NhdGlvbiAqLwpAQCAtOTEsMTAgKzkxLDcgQEAKIAl1MzIgcmRfZGlub2RlczsKIAl1NjQgcmRfaWdlbmVyYXRpb247CiAJc3RydWN0IGdmczJfYml0bWFwICpyZF9iaXRzOwotCXN0cnVjdCBtdXRleCByZF9tdXRleDsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfZWxlbWVudCByZF9sZTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnJkX3NiZDsKLQl1bnNpZ25lZCBpbnQgcmRfYmhfY291bnQ7CiAJdTMyIHJkX2xhc3RfYWxsb2M7CiAJdTMyIHJkX2ZsYWdzOwogI2RlZmluZSBHRlMyX1JERl9DSEVDSwkJMHgxMDAwMDAwMCAvKiBjaGVjayBmb3IgdW5saW5rZWQgaW5vZGVzICovCkBAIC0xMDYsMTIgKzEwMywxNSBAQAogZW51bSBnZnMyX3N0YXRlX2JpdHMgewogCUJIX1Bpbm5lZCA9IEJIX1ByaXZhdGVTdGFydCwKIAlCSF9Fc2NhcGVkID0gQkhfUHJpdmF0ZVN0YXJ0ICsgMSwKKwlCSF9aZXJvbmV3ID0gQkhfUHJpdmF0ZVN0YXJ0ICsgMiwKIH07CiAKIEJVRkZFUl9GTlMoUGlubmVkLCBwaW5uZWQpCiBUQVNfQlVGRkVSX0ZOUyhQaW5uZWQsIHBpbm5lZCkKIEJVRkZFUl9GTlMoRXNjYXBlZCwgZXNjYXBlZCkKIFRBU19CVUZGRVJfRk5TKEVzY2FwZWQsIGVzY2FwZWQpCitCVUZGRVJfRk5TKFplcm9uZXcsIHplcm9uZXcpCitUQVNfQlVGRkVSX0ZOUyhaZXJvbmV3LCB6ZXJvbmV3KQogCiBzdHJ1Y3QgZ2ZzMl9idWZkYXRhIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJkX2JoOwpAQCAtMjQ2LDcgKzI0Niw2IEBACiAKIHN0cnVjdCBnZnMyX2FsbG9jIHsKIAkvKiBRdW90YSBzdHVmZiAqLwotCiAJc3RydWN0IGdmczJfcXVvdGFfZGF0YSAqYWxfcWRbMipNQVhRVU9UQVNdOwogCXN0cnVjdCBnZnMyX2hvbGRlciBhbF9xZF9naHNbMipNQVhRVU9UQVNdOwogCXVuc2lnbmVkIGludCBhbF9xZF9udW07CkBAIC0yNTUsMTggKzI1NCwxMyBAQAogCXUzMiBhbF9hbGxvY2VkOyAvKiBGaWxsZWQgaW4gYnkgZ2ZzMl9hbGxvY18qKCkgKi8KIAogCS8qIEZpbGxlZCBpbiBieSBnZnMyX2lucGxhY2VfcmVzZXJ2ZSgpICovCi0KLQl1bnNpZ25lZCBpbnQgYWxfbGluZTsKLQljaGFyICphbF9maWxlOwotCXN0cnVjdCBnZnMyX2hvbGRlciBhbF9yaV9naDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgYWxfcmdkX2doOwotCXN0cnVjdCBnZnMyX3JncnBkICphbF9yZ2Q7Ci0KIH07CiAKIGVudW0gewogCUdJRl9JTlZBTElECQk9IDAsCiAJR0lGX1FEX0xPQ0tFRAkJPSAxLAorCUdJRl9BTExPQ19GQUlMRUQJPSAyLAogCUdJRl9TV19QQUdFRAkJPSAzLAogfTsKIApAQCAtMjgyLDYgKzI3Niw3IEBACiAJc3RydWN0IGdmczJfaG9sZGVyIGlfaW9wZW5fZ2g7CiAJc3RydWN0IGdmczJfaG9sZGVyIGlfZ2g7IC8qIGZvciBwcmVwYXJlL2NvbW1pdF93cml0ZSBvbmx5ICovCiAJc3RydWN0IGdmczJfYWxsb2MgKmlfYWxsb2M7CisJc3RydWN0IGdmczJfcmdycGQgKmlfcmdkOwogCXU2NCBpX2dvYWw7CS8qIGdvYWwgYmxvY2sgZm9yIGFsbG9jYXRpb25zICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBpX3J3X211dGV4OwogCXN0cnVjdCBsaXN0X2hlYWQgaV90cnVuY19saXN0OwpAQCAtNTc0LDkgKzU2OSw3IEBACiAJaW50IHNkX3JpbmRleF91cHRvZGF0ZTsKIAlzcGlubG9ja190IHNkX3JpbmRleF9zcGluOwogCXN0cnVjdCBtdXRleCBzZF9yaW5kZXhfbXV0ZXg7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzZF9yaW5kZXhfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNkX3JpbmRleF9tcnVfbGlzdDsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqc2RfcmluZGV4X2ZvcndhcmQ7CisJc3RydWN0IHJiX3Jvb3Qgc2RfcmluZGV4X3RyZWU7CiAJdW5zaWduZWQgaW50IHNkX3JncnBzOwogCXVuc2lnbmVkIGludCBzZF9tYXhfcmdfZGF0YTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IDY1MjViODAuLmNmZDQ5NTkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogCQkJZ290byBmYWlsX3F1b3RhX2xvY2tzOwogCiAJCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIHNkcC0+c2RfbWF4X2RpcnJlcyArCi0JCQkJCSBhbC0+YWxfcmdkLT5yZF9sZW5ndGggKworCQkJCQkgZGlwLT5pX3JnZC0+cmRfbGVuZ3RoICsKIAkJCQkJIDIgKiBSRVNfRElOT0RFICsKIAkJCQkJIFJFU19TVEFURlMgKyBSRVNfUVVPVEEsIDApOwogCQlpZiAoZXJyb3IpCkBAIC02MTMsOCArNjEzLDcgQEAKIAlnZnMyX3RyYW5zX2VuZChzZHApOwogCiBmYWlsX2lwcmVzZXJ2OgotCWlmIChkaXAtPmlfYWxsb2MtPmFsX3JnZCkKLQkJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoZGlwKTsKKwlnZnMyX2lucGxhY2VfcmVsZWFzZShkaXApOwogCiBmYWlsX3F1b3RhX2xvY2tzOgogCWdmczJfcXVvdGFfdW5sb2NrKGRpcCk7CkBAIC02NjEsNyArNjYwLDcgQEAKIAogc3RhdGljIGludCBnZnMyX2NyZWF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgZGV2X3QgZGV2LCBjb25zdCBjaGFyICpzeW1uYW1lLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKKwkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBleGNsKQogewogCWNvbnN0IHN0cnVjdCBxc3RyICpuYW1lID0gJmRlbnRyeS0+ZF9uYW1lOwogCXN0cnVjdCBnZnMyX2hvbGRlciBnaHNbMl07CkBAIC02ODEsNiArNjgwLDEyIEBACiAJCWdvdG8gZmFpbDsKIAogCWVycm9yID0gY3JlYXRlX29rKGRpcCwgbmFtZSwgbW9kZSk7CisJaWYgKChlcnJvciA9PSAtRUVYSVNUKSAmJiBTX0lTUkVHKG1vZGUpICYmICFleGNsKSB7CisJCWlub2RlID0gZ2ZzMl9sb29rdXBpKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAwKTsKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoZ2hzKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJcmV0dXJuIElTX0VSUihpbm9kZSkgPyBQVFJfRVJSKGlub2RlKSA6IDA7CisJfQogCWlmIChlcnJvcikKIAkJZ290byBmYWlsX2d1bmxvY2s7CiAKQEAgLTcyMywyMSArNzI4LDIyIEBACiAJCWJyZWxzZShiaCk7CiAKIAlnZnMyX3RyYW5zX2VuZChzZHApOwotCWlmIChkaXAtPmlfYWxsb2MtPmFsX3JnZCkKLQkJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoZGlwKTsKKwlnZnMyX2lucGxhY2VfcmVsZWFzZShkaXApOwogCWdmczJfcXVvdGFfdW5sb2NrKGRpcCk7CiAJZ2ZzMl9hbGxvY19wdXQoZGlwKTsKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdF9tKDIsIGdocyk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZ2ZzMl9nbG9ja19kcV91bmluaXRfbSgyLCBnaHMpOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWxfZ3VubG9jazI6CiAJZ2ZzMl9nbG9ja19kcV91bmluaXQoZ2hzICsgMSk7Ci0JaWYgKGlub2RlICYmICFJU19FUlIoaW5vZGUpKQotCQlpcHV0KGlub2RlKTsKIGZhaWxfZ3VubG9jazoKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaHMpOworCWlmIChpbm9kZSAmJiAhSVNfRVJSKGlub2RlKSkgeworCQlzZXRfYml0KEdJRl9BTExPQ19GQUlMRUQsICZHRlMyX0koaW5vZGUpLT5pX2ZsYWdzKTsKKwkJaXB1dChpbm9kZSk7CisJfQogZmFpbDoKIAlpZiAoYmgpCiAJCWJyZWxzZShiaCk7CkBAIC03NTYsMjQgKzc2MiwxMCBAQAogc3RhdGljIGludCBnZnMyX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgICAgICAgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JaW50IHJldDsKLQotCWZvciAoOzspIHsKLQkJcmV0ID0gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIFNfSUZSRUcgfCBtb2RlLCAwLCBOVUxMLCAwKTsKLQkJaWYgKHJldCAhPSAtRUVYSVNUIHx8IChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0VYQ0wpKSkKLQkJCXJldHVybiByZXQ7Ci0KLQkJaW5vZGUgPSBnZnMyX2xvb2t1cGkoZGlyLCAmZGVudHJ5LT5kX25hbWUsIDApOwotCQlpZiAoaW5vZGUpIHsKLQkJCWlmICghSVNfRVJSKGlub2RlKSkKLQkJCQlicmVhazsKLQkJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKLQkJfQotCX0KLQotCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JcmV0dXJuIDA7CisJaW50IGV4Y2wgPSAwOworCWlmIChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0VYQ0wpKQorCQlleGNsID0gMTsKKwlyZXR1cm4gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIFNfSUZSRUcgfCBtb2RlLCAwLCBOVUxMLCAwLCBleGNsKTsKIH0KIAogLyoqCkBAIC05MDAsNyArODkyLDcgQEAKIAkJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIAogCQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBzZHAtPnNkX21heF9kaXJyZXMgKwotCQkJCQkgZ2ZzMl9yZ19ibG9ja3MoYWwpICsKKwkJCQkJIGdmczJfcmdfYmxvY2tzKGRpcCkgKwogCQkJCQkgMiAqIFJFU19ESU5PREUgKyBSRVNfU1RBVEZTICsKIAkJCQkJIFJFU19RVU9UQSwgMCk7CiAJCWlmIChlcnJvcikKQEAgLTkyMiw4ICs5MTQsOSBAQAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAlpbmNfbmxpbmsoJmlwLT5pX2lub2RlKTsKIAlpcC0+aV9pbm9kZS5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKLQltYXJrX2lub2RlX2RpcnR5KCZpcC0+aV9pbm9kZSk7CisJaWhvbGQoaW5vZGUpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAKIG91dF9icmVsc2U6CiAJYnJlbHNlKGRpYmgpOwpAQCAtOTQ1LDExICs5MzgsNiBAQAogb3V0X3BhcmVudDoKIAlnZnMyX2hvbGRlcl91bmluaXQoZ2hzKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoZ2hzICsgMSk7Ci0JaWYgKCFlcnJvcikgewotCQlpaG9sZChpbm9kZSk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEwMjIsOCArMTAxMCw2IEBACiAJCWNsZWFyX25saW5rKGlub2RlKTsKIAllbHNlCiAJCWRyb3BfbmxpbmsoaW5vZGUpOwotCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7Ci0JZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKIAkJZ2ZzMl91bmxpbmtfZGkoaW5vZGUpOwpAQCAtMTA1MSwxMyArMTAzNyw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2hzWzNdOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0Jc3RydWN0IGdmczJfaG9sZGVyIHJpX2doOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZyaV9naCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KIAlnZnMyX2hvbGRlcl9pbml0KGRpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCBnaHMpOwogCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsICBMTV9TVF9FWENMVVNJVkUsIDAsIGdocyArIDEpOwogCkBAIC0xMTE0LDcgKzEwOTUsNiBAQAogCWdmczJfZ2xvY2tfZHEoZ2hzKTsKIG91dF9wYXJlbnQ6CiAJZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyk7Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTExMzcsNyArMTExNyw3IEBACiAJaWYgKHNpemUgPiBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkgLSAxKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAotCXJldHVybiBnZnMyX2NyZWF0ZV9pbm9kZShkaXIsIGRlbnRyeSwgU19JRkxOSyB8IFNfSVJXWFVHTywgMCwgc3ltbmFtZSwgc2l6ZSk7CisJcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGTE5LIHwgU19JUldYVUdPLCAwLCBzeW1uYW1lLCBzaXplLCAwKTsKIH0KIAogLyoqCkBAIC0xMTUxLDcgKzExMzEsNyBAQAogCiBzdGF0aWMgaW50IGdmczJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCiB7Ci0JcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGRElSIHwgbW9kZSwgMCwgTlVMTCwgMCk7CisJcmV0dXJuIGdmczJfY3JlYXRlX2lub2RlKGRpciwgZGVudHJ5LCBTX0lGRElSIHwgbW9kZSwgMCwgTlVMTCwgMCwgMCk7CiB9CiAKIC8qKgpAQCAtMTE2Niw3ICsxMTQ2LDcgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKIAkJICAgICAgZGV2X3QgZGV2KQogewotCXJldHVybiBnZnMyX2NyZWF0ZV9pbm9kZShkaXIsIGRlbnRyeSwgbW9kZSwgZGV2LCBOVUxMLCAwKTsKKwlyZXR1cm4gZ2ZzMl9jcmVhdGVfaW5vZGUoZGlyLCBkZW50cnksIG1vZGUsIGRldiwgTlVMTCwgMCwgMCk7CiB9CiAKIC8qCkBAIC0xMjMyLDcgKzEyMTIsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShvZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqbmlwID0gTlVMTDsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0Iob2Rpcik7Ci0Jc3RydWN0IGdmczJfaG9sZGVyIGdoc1s1XSwgcl9naCA9IHsgLmdoX2dsID0gTlVMTCwgfSwgcmlfZ2g7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoc1s1XSwgcl9naCA9IHsgLmdoX2dsID0gTlVMTCwgfTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqbnJnZDsKIAl1bnNpZ25lZCBpbnQgbnVtX2doOwogCWludCBkaXJfcmVuYW1lID0gMDsKQEAgLTEyNDYsMTAgKzEyMjYsNiBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCWlmIChvZGlwICE9IG5kaXApIHsKIAkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsIExNX1NUX0VYQ0xVU0lWRSwKIAkJCQkJICAgMCwgJnJfZ2gpOwpAQCAtMTM4NiwxMiArMTM2MiwxMiBAQAogCiAJCWFsLT5hbF9yZXF1ZXN0ZWQgPSBzZHAtPnNkX21heF9kaXJyZXM7CiAKLQkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9yaShuZGlwKTsKKwkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShuZGlwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfZ3VubG9ja19xOwogCiAJCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIHNkcC0+c2RfbWF4X2RpcnJlcyArCi0JCQkJCSBnZnMyX3JnX2Jsb2NrcyhhbCkgKworCQkJCQkgZ2ZzMl9yZ19ibG9ja3MobmRpcCkgKwogCQkJCQkgNCAqIFJFU19ESU5PREUgKyA0ICogUkVTX0xFQUYgKwogCQkJCQkgUkVTX1NUQVRGUyArIFJFU19RVU9UQSArIDQsIDApOwogCQlpZiAoZXJyb3IpCkBAIC0xNDU3LDcgKzE0MzMsNiBAQAogCWlmIChyX2doLmdoX2dsKQogCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcl9naCk7CiBvdXQ6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE1NjEsMjEgKzE1MzYsMTAgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgX19nZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKQorc3RhdGljIGludCBfX2dmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCiAJc2V0YXR0cl9jb3B5KGlub2RlLCBhdHRyKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7Ci0JZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwotCWJyZWxzZShkaWJoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4NywxOSArMTU1MSwxOSBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9zZXRhdHRyX3NpbXBsZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cikKK2ludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoY3VycmVudC0+am91cm5hbF9pbmZvKQotCQlyZXR1cm4gX19nZnMyX3NldGF0dHJfc2ltcGxlKGlwLCBhdHRyKTsKKwkJcmV0dXJuIF9fZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAKLQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCBSRVNfRElOT0RFLCAwKTsKKwllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQihpbm9kZSksIFJFU19ESU5PREUsIDApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSBfX2dmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOwotCWdmczJfdHJhbnNfZW5kKEdGUzJfU0IoJmlwLT5pX2lub2RlKSk7CisJZXJyb3IgPSBfX2dmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOworCWdmczJfdHJhbnNfZW5kKEdGUzJfU0IoaW5vZGUpKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE2MzcsNyArMTYwMSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrX3E7CiAKLQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9lbmRfdHJhbnM7CiAKQEAgLTE2OTMsMTIgKzE2NTcsMTIgQEAKIAllbHNlIGlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmIElTX1BPU0lYQUNMKGlub2RlKSkKIAkJZXJyb3IgPSBnZnMyX2FjbF9jaG1vZChpcCwgYXR0cik7CiAJZWxzZQotCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaW5vZGUsIGF0dHIpOwogCiBvdXQ6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlfZ2gpOwogCWlmICghZXJyb3IpCiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpX2doKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuaCBiL2ZzL2dmczIvaW5vZGUuaAppbmRleCA4ZDkwZTBjLi4yNzZlN2I1IDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmgKKysrIGIvZnMvZ2ZzMi9pbm9kZS5oCkBAIC0xMDksNyArMTA5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmdmczJfbG9va3VwaShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCiAJCQkJICBpbnQgaXNfcm9vdCk7CiBleHRlcm4gaW50IGdmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7Ci1leHRlcm4gaW50IGdmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworZXh0ZXJuIGludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBleHRlcm4gc3RydWN0IGlub2RlICpnZnMyX2xvb2t1cF9zaW1wbGUoc3RydWN0IGlub2RlICpkaXAsIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9kaW5vZGVfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCwgdm9pZCAqYnVmKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9sb3BzLmMgYi9mcy9nZnMyL2xvcHMuYwppbmRleCAwNWJiYjEyLi4wMzAxYmU2IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvcHMuYworKysgYi9mcy9nZnMyL2xvcHMuYwpAQCAtNjAsNiArNjAsMjkgQEAKIAl0cmFjZV9nZnMyX3BpbihiZCwgMSk7CiB9CiAKK3N0YXRpYyBib29sIGJ1ZmZlcl9pc19yZ3JwKGNvbnN0IHN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkKQoreworCXJldHVybiBiZC0+YmRfZ2wtPmdsX25hbWUubG5fdHlwZSA9PSBMTV9UWVBFX1JHUlA7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3JlbGVhc2Vfc3BhY2Uoc3RydWN0IGdmczJfYnVmZGF0YSAqYmQpCit7CisJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gYmQtPmJkX2dsOworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKKwlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkID0gZ2wtPmdsX29iamVjdDsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSBiZC0+YmRfYmgtPmJfYmxvY2tuciAtIGdsLT5nbF9uYW1lLmxuX251bWJlcjsKKwlzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKmJpID0gcmdkLT5yZF9iaXRzICsgaW5kZXg7CisKKwlpZiAoYmktPmJpX2Nsb25lID09IDApCisJCXJldHVybjsKKwlpZiAoc2RwLT5zZF9hcmdzLmFyX2Rpc2NhcmQpCisJCWdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHNkcCwgcmdkLT5yZF9kYXRhMCwgYmQtPmJkX2JoLCBiaSk7CisJbWVtY3B5KGJpLT5iaV9jbG9uZSArIGJpLT5iaV9vZmZzZXQsCisJICAgICAgIGJkLT5iZF9iaC0+Yl9kYXRhICsgYmktPmJpX29mZnNldCwgYmktPmJpX2xlbik7CisJY2xlYXJfYml0KEdCRl9GVUxMLCAmYmktPmJpX2ZsYWdzKTsKKwlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX2ZyZWU7Cit9CisKIC8qKgogICogZ2ZzMl91bnBpbiAtIFVucGluIGEgYnVmZmVyCiAgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbSB0aGUgYnVmZmVyIGJlbG9uZ3MgdG8KQEAgLTgxLDYgKzEwNCw5IEBACiAJbWFya19idWZmZXJfZGlydHkoYmgpOwogCWNsZWFyX2J1ZmZlcl9waW5uZWQoYmgpOwogCisJaWYgKGJ1ZmZlcl9pc19yZ3JwKGJkKSkKKwkJbWF5YmVfcmVsZWFzZV9zcGFjZShiZCk7CisKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWlmIChiZC0+YmRfYWlsKSB7CiAJCWxpc3RfZGVsKCZiZC0+YmRfYWlsX3N0X2xpc3QpOwpAQCAtNDY5LDQyICs0OTUsNiBAQAogCWdmczJfcmV2b2tlX2NsZWFuKHNkcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJnX2xvX2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfbG9nX2VsZW1lbnQgKmxlKQotewotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0Jc3RydWN0IGdmczJfdHJhbnMgKnRyID0gY3VycmVudC0+am91cm5hbF9pbmZvOwotCi0JdHItPnRyX3RvdWNoZWQgPSAxOwotCi0JcmdkID0gY29udGFpbmVyX29mKGxlLCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGUpOwotCi0JZ2ZzMl9sb2dfbG9jayhzZHApOwotCWlmICghbGlzdF9lbXB0eSgmbGUtPmxlX2xpc3QpKXsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0JCXJldHVybjsKLQl9Ci0JZ2ZzMl9yZ3JwX2JoX2hvbGQocmdkKTsKLQlzZHAtPnNkX2xvZ19udW1fcmcrKzsKLQlsaXN0X2FkZCgmbGUtPmxlX2xpc3QsICZzZHAtPnNkX2xvZ19sZV9yZyk7Ci0JZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJnX2xvX2FmdGVyX2NvbW1pdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfYWlsICphaSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnNkcC0+c2RfbG9nX2xlX3JnOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcmdkID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGUubGVfbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJnZC0+cmRfbGUubGVfbGlzdCk7Ci0JCXNkcC0+c2RfbG9nX251bV9yZy0tOwotCi0JCWdmczJfcmdycF9yZXBvbGlzaF9jbG9uZXMocmdkKTsKLQkJZ2ZzMl9yZ3JwX2JoX3B1dChyZ2QpOwotCX0KLQlnZnMyX2Fzc2VydF93YXJuKHNkcCwgIXNkcC0+c2RfbG9nX251bV9yZyk7Ci19Ci0KIC8qKgogICogZGF0YWJ1Zl9sb19hZGQgLSBBZGQgYSBkYXRhYnVmIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCkBAIC03MDUsOCArNjk1LDYgQEAKIAogCQlicmVsc2UoYmhfbG9nKTsKIAkJYnJlbHNlKGJoX2lwKTsKLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7CiAKIAkJc2RwLT5zZF9yZXBsYXllZF9ibG9ja3MrKzsKIAl9CkBAIC03NzEsOCArNzU5LDYgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBnZnMyX2xvZ19vcGVyYXRpb25zIGdmczJfcmdfbG9wcyA9IHsKLQkubG9fYWRkID0gcmdfbG9fYWRkLAotCS5sb19hZnRlcl9jb21taXQgPSByZ19sb19hZnRlcl9jb21taXQsCiAJLmxvX25hbWUgPSAicmciLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuYwppbmRleCAwNzk1ODdlLi5jYjIzYzJiIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19mc3R5cGUuYworKysgYi9mcy9nZnMyL29wc19mc3R5cGUuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgpAQCAtNzcsOCArNzgsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCW11dGV4X2luaXQoJnNkcC0+c2RfcmluZGV4X211dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmc2RwLT5zZF9yaW5kZXhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKKwlzZHAtPnNkX3JpbmRleF90cmVlLnJiX25vZGUgPSBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJnNkcC0+c2RfamluZGV4X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX2ppbmRleF9zcGluKTsKQEAgLTY1Miw3ICs2NTIsNiBAQAogCQlmc19lcnIoc2RwLCAiY2FuJ3QgbG9va3VwIGpvdXJuYWwgaW5kZXg6ICVkXG4iLCBlcnJvcik7CiAJCXJldHVybiBQVFJfRVJSKHNkcC0+c2RfamluZGV4KTsKIAl9Ci0JaXAgPSBHRlMyX0koc2RwLT5zZF9qaW5kZXgpOwogCiAJLyogTG9hZCBpbiB0aGUgam91cm5hbCBpbmRleCBzcGVjaWFsIGZpbGUgKi8KIApAQCAtNzY0LDcgKzc2Myw2IEBACiBzdGF0aWMgaW50IGluaXRfaW5vZGVzKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgdW5kbykKIHsKIAlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBnZnMyX2lub2RlICppcDsKIAlzdHJ1Y3QgaW5vZGUgKm1hc3RlciA9IHNkcC0+c2RfbWFzdGVyX2Rpci0+ZF9pbm9kZTsKIAogCWlmICh1bmRvKQpAQCAtNzg5LDcgKzc4Nyw2IEBACiAJCWZzX2VycihzZHAsICJjYW4ndCBnZXQgcmVzb3VyY2UgaW5kZXggaW5vZGU6ICVkXG4iLCBlcnJvcik7CiAJCWdvdG8gZmFpbF9zdGF0ZnM7CiAJfQotCWlwID0gR0ZTMl9JKHNkcC0+c2RfcmluZGV4KTsKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDA7CiAKIAkvKiBSZWFkIGluIHRoZSBxdW90YSBpbm9kZSAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5jIGIvZnMvZ2ZzMi9xdW90YS5jCmluZGV4IDBlOGJiMTMuLjdlNTI4ZGMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuYworKysgYi9mcy9nZnMyL3F1b3RhLmMKQEAgLTYzOCwxNSArNjM4LDE4IEBACiAJdW5zaWduZWQgbG9uZyBpbmRleCA9IGxvYyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIG9mZnNldCA9IGxvYyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAl1bnNpZ25lZCBibG9ja3NpemUsIGlibG9jaywgcG9zOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpkaWJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdm9pZCAqa2FkZHIsICpwdHI7CiAJc3RydWN0IGdmczJfcXVvdGEgcSwgKnFwOwogCWludCBlcnIsIG5ieXRlczsKIAl1NjQgc2l6ZTsKIAotCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKQotCQlnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBOVUxMKTsKKwlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgeworCQllcnIgPSBnZnMyX3Vuc3R1ZmZfZGlub2RlKGlwLCBOVUxMKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQogCiAJbWVtc2V0KCZxLCAwLCBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpKTsKIAllcnIgPSBnZnMyX2ludGVybmFsX3JlYWQoaXAsIE5VTEwsIChjaGFyICopJnEsICZsb2MsIHNpemVvZihxKSk7CkBAIC03MzYsMjIgKzczOSwxMyBAQAogCQlnb3RvIGdldF9hX3BhZ2U7CiAJfQogCi0JLyogVXBkYXRlIHRoZSBkaXNrIGlub2RlIHRpbWVzdGFtcCBhbmQgc2l6ZSAoaWYgZXh0ZW5kZWQpICovCi0JZXJyID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCiAJc2l6ZSA9IGxvYyArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9xdW90YSk7CiAJaWYgKHNpemUgPiBpbm9kZS0+aV9zaXplKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHNpemUpOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKLQlicmVsc2UoZGliaCk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0KLW91dDoKIAlyZXR1cm4gZXJyOworCiB1bmxvY2tfb3V0OgogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTgyMiw3ICs4MTYsNyBAQAogCQlnb3RvIG91dF9hbGxvYzsKIAogCWlmIChuYWxsb2MpCi0JCWJsb2NrcyArPSBnZnMyX3JnX2Jsb2NrcyhhbCkgKyBuYWxsb2MgKiBpbmRfYmxvY2tzICsgUkVTX1NUQVRGUzsKKwkJYmxvY2tzICs9IGdmczJfcmdfYmxvY2tzKGlwKSArIG5hbGxvYyAqIGluZF9ibG9ja3MgKyBSRVNfU1RBVEZTOwogCiAJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgYmxvY2tzLCAwKTsKIAlpZiAoZXJyb3IpCkBAIC05MzYsNyArOTMwLDkgQEAKIAl1bnNpZ25lZCBpbnQgeDsKIAlpbnQgZXJyb3IgPSAwOwogCi0JZ2ZzMl9xdW90YV9ob2xkKGlwLCB1aWQsIGdpZCk7CisJZXJyb3IgPSBnZnMyX3F1b3RhX2hvbGQoaXAsIHVpZCwgZ2lkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCWlmIChjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpIHx8CiAJICAgIHNkcC0+c2RfYXJncy5hcl9xdW90YSAhPSBHRlMyX1FVT1RBX09OKQpAQCAtMTYwNyw3ICsxNjAzLDcgQEAKIAkJZXJyb3IgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2FsbG9jOwotCQlibG9ja3MgKz0gZ2ZzMl9yZ19ibG9ja3MoYWwpOworCQlibG9ja3MgKz0gZ2ZzMl9yZ19ibG9ja3MoaXApOwogCX0KIAogCS8qIFNvbWUgcXVvdGFzIHNwYW4gYmxvY2sgYm91bmRhcmllcyBhbmQgY2FuIHVwZGF0ZSB0d28gYmxvY2tzLApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZ3JwLmMgYi9mcy9nZnMyL3JncnAuYwppbmRleCA3ZjhhZjFlLi45NmJkNmQ3NSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZ3JwLmMKKysrIGIvZnMvZ2ZzMi9yZ3JwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC0zMjgsMTggKzMyOSwyMiBAQAogCiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9ibGsycmdycGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBibGspCiB7Ci0Jc3RydWN0IGdmczJfcmdycGQgKnJnZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ld247CisJc3RydWN0IGdmczJfcmdycGQgKmN1cjsKIAogCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJnZCwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0LCByZF9saXN0X21ydSkgewotCQlpZiAocmdycF9jb250YWluc19ibG9jayhyZ2QsIGJsaykpIHsKLQkJCWxpc3RfbW92ZSgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKKwluZXduID0gJnNkcC0+c2RfcmluZGV4X3RyZWUucmJfbm9kZTsKKwl3aGlsZSAoKm5ld24pIHsKKwkJY3VyID0gcmJfZW50cnkoKm5ld24sIHN0cnVjdCBnZnMyX3JncnBkLCByZF9ub2RlKTsKKwkJaWYgKGJsayA8IGN1ci0+cmRfYWRkcikKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX2xlZnQpOworCQllbHNlIGlmIChibGsgPj0gY3VyLT5yZF9kYXRhMCArIGN1ci0+cmRfZGF0YSkKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX3JpZ2h0KTsKKwkJZWxzZSB7CiAJCQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JCQlyZXR1cm4gcmdkOworCQkJcmV0dXJuIGN1cjsKIAkJfQogCX0KLQogCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKIAogCXJldHVybiBOVUxMOwpAQCAtMzU0LDggKzM1OSwxNSBAQAogCiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc3RydWN0IGdmczJfc2JkICpzZHApCiB7Ci0JZ2ZzMl9hc3NlcnQoc2RwLCAhbGlzdF9lbXB0eSgmc2RwLT5zZF9yaW5kZXhfbGlzdCkpOwotCXJldHVybiBsaXN0X2VudHJ5KHNkcC0+c2RfcmluZGV4X2xpc3QubmV4dCwgc3RydWN0IGdmczJfcmdycGQsIHJkX2xpc3QpOworCWNvbnN0IHN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CisKKwlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOworCW4gPSByYl9maXJzdCgmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CisJcmdkID0gcmJfZW50cnkobiwgc3RydWN0IGdmczJfcmdycGQsIHJkX25vZGUpOworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKworCXJldHVybiByZ2Q7CiB9CiAKIC8qKgpAQCAtMzY3LDQ1ICszNzksNTggQEAKIAogc3RydWN0IGdmczJfcmdycGQgKmdmczJfcmdycGRfZ2V0X25leHQoc3RydWN0IGdmczJfcmdycGQgKnJnZCkKIHsKLQlpZiAocmdkLT5yZF9saXN0Lm5leHQgPT0gJnJnZC0+cmRfc2JkLT5zZF9yaW5kZXhfbGlzdCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGxpc3RfZW50cnkocmdkLT5yZF9saXN0Lm5leHQsIHN0cnVjdCBnZnMyX3JncnBkLCByZF9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfcmdycGRpKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGdmczJfcmdycGQgKnJnZDsKLQlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2w7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKKwljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbjsKIAogCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0Jc2RwLT5zZF9yaW5kZXhfZm9yd2FyZCA9IE5VTEw7CisJbiA9IHJiX25leHQoJnJnZC0+cmRfbm9kZSk7CisJaWYgKG4gPT0gTlVMTCkKKwkJbiA9IHJiX2ZpcnN0KCZzZHAtPnNkX3JpbmRleF90cmVlKTsKKworCWlmICh1bmxpa2VseSgmcmdkLT5yZF9ub2RlID09IG4pKSB7CisJCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJnZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBnZnMyX3JncnBkLCByZF9ub2RlKTsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CisJcmV0dXJuIHJnZDsKK30KIAotCWhlYWQgPSAmc2RwLT5zZF9yaW5kZXhfbGlzdDsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJcmdkID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGlzdCk7Ci0JCWdsID0gcmdkLT5yZF9nbDsKK3ZvaWQgZ2ZzMl9mcmVlX2Nsb25lcyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQoreworCWludCB4OwogCi0JCWxpc3RfZGVsKCZyZ2QtPnJkX2xpc3QpOwotCQlsaXN0X2RlbCgmcmdkLT5yZF9saXN0X21ydSk7Ci0KLQkJaWYgKGdsKSB7Ci0JCQlnbC0+Z2xfb2JqZWN0ID0gTlVMTDsKLQkJCWdmczJfZ2xvY2tfYWRkX3RvX2xydShnbCk7Ci0JCQlnZnMyX2dsb2NrX3B1dChnbCk7Ci0JCX0KLQotCQlrZnJlZShyZ2QtPnJkX2JpdHMpOwotCQlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9yZ3JwZF9jYWNoZXAsIHJnZCk7CisJZm9yICh4ID0gMDsgeCA8IHJnZC0+cmRfbGVuZ3RoOyB4KyspIHsKKwkJc3RydWN0IGdmczJfYml0bWFwICpiaSA9IHJnZC0+cmRfYml0cyArIHg7CisJCWtmcmVlKGJpLT5iaV9jbG9uZSk7CisJCWJpLT5iaV9jbG9uZSA9IE5VTEw7CiAJfQogfQogCiB2b2lkIGdmczJfY2xlYXJfcmdycGQoc3RydWN0IGdmczJfc2JkICpzZHApCiB7Ci0JbXV0ZXhfbG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOwotCWNsZWFyX3JncnBkaShzZHApOwotCW11dGV4X3VubG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CisJc3RydWN0IGdmczJfZ2xvY2sgKmdsOworCisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnNkcC0+c2RfcmluZGV4X3RyZWUpKSkgeworCQlyZ2QgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbm9kZSk7CisJCWdsID0gcmdkLT5yZF9nbDsKKworCQlyYl9lcmFzZShuLCAmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CisKKwkJaWYgKGdsKSB7CisJCQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKKwkJCWdsLT5nbF9vYmplY3QgPSBOVUxMOworCQkJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKKwkJCWdmczJfZ2xvY2tfYWRkX3RvX2xydShnbCk7CisJCQlnZnMyX2dsb2NrX3B1dChnbCk7CisJCX0KKworCQlnZnMyX2ZyZWVfY2xvbmVzKHJnZCk7CisJCWtmcmVlKHJnZC0+cmRfYml0cyk7CisJCWttZW1fY2FjaGVfZnJlZShnZnMyX3JncnBkX2NhY2hlcCwgcmdkKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfcmluZGV4X3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCkBAIC01MjQsMjIgKzU0OSwzNCBAQAogCXJldHVybiB0b3RhbF9kYXRhOwogfQogCi1zdGF0aWMgdm9pZCBnZnMyX3JpbmRleF9pbihzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLCBjb25zdCB2b2lkICpidWYpCitzdGF0aWMgdm9pZCByZ2RfaW5zZXJ0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCiB7Ci0JY29uc3Qgc3RydWN0IGdmczJfcmluZGV4ICpzdHIgPSBidWY7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ld24gPSAmc2RwLT5zZF9yaW5kZXhfdHJlZS5yYl9ub2RlLCAqcGFyZW50ID0gTlVMTDsKIAotCXJnZC0+cmRfYWRkciA9IGJlNjRfdG9fY3B1KHN0ci0+cmlfYWRkcik7Ci0JcmdkLT5yZF9sZW5ndGggPSBiZTMyX3RvX2NwdShzdHItPnJpX2xlbmd0aCk7Ci0JcmdkLT5yZF9kYXRhMCA9IGJlNjRfdG9fY3B1KHN0ci0+cmlfZGF0YTApOwotCXJnZC0+cmRfZGF0YSA9IGJlMzJfdG9fY3B1KHN0ci0+cmlfZGF0YSk7Ci0JcmdkLT5yZF9iaXRieXRlcyA9IGJlMzJfdG9fY3B1KHN0ci0+cmlfYml0Ynl0ZXMpOworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCisJd2hpbGUgKCpuZXduKSB7CisJCXN0cnVjdCBnZnMyX3JncnBkICpjdXIgPSByYl9lbnRyeSgqbmV3biwgc3RydWN0IGdmczJfcmdycGQsCisJCQkJCQkgIHJkX25vZGUpOworCisJCXBhcmVudCA9ICpuZXduOworCQlpZiAocmdkLT5yZF9hZGRyIDwgY3VyLT5yZF9hZGRyKQorCQkJbmV3biA9ICYoKCpuZXduKS0+cmJfbGVmdCk7CisJCWVsc2UgaWYgKHJnZC0+cmRfYWRkciA+IGN1ci0+cmRfYWRkcikKKwkJCW5ld24gPSAmKCgqbmV3biktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKworCXJiX2xpbmtfbm9kZSgmcmdkLT5yZF9ub2RlLCBwYXJlbnQsIG5ld24pOworCXJiX2luc2VydF9jb2xvcigmcmdkLT5yZF9ub2RlLCAmc2RwLT5zZF9yaW5kZXhfdHJlZSk7CiB9CiAKIC8qKgogICogcmVhZF9yaW5kZXhfZW50cnkgLSBQdWxsIGluIGEgbmV3IHJlc291cmNlIGluZGV4IGVudHJ5IGZyb20gdGhlIGRpc2sKICAqIEBnbDogVGhlIGdsb2NrIGNvdmVyaW5nIHRoZSByaW5kZXggaW5vZGUKICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsID4gMCBvbiBFT0YsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAgKi8KIAogc3RhdGljIGludCByZWFkX3JpbmRleF9lbnRyeShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCkBAIC01NDcsNDQgKzU4NCw1MyBAQAogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCWxvZmZfdCBwb3MgPSBzZHAtPnNkX3JncnBzICogc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCk7Ci0JY2hhciBidWZbc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCldOworCXN0cnVjdCBnZnMyX3JpbmRleCBidWY7CiAJaW50IGVycm9yOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CiAKLQllcnJvciA9IGdmczJfaW50ZXJuYWxfcmVhZChpcCwgcmFfc3RhdGUsIGJ1ZiwgJnBvcywKKwlpZiAocG9zID49IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSkpCisJCXJldHVybiAxOworCisJZXJyb3IgPSBnZnMyX2ludGVybmFsX3JlYWQoaXAsIHJhX3N0YXRlLCAoY2hhciAqKSZidWYsICZwb3MsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCkpOwotCWlmICghZXJyb3IpCi0JCXJldHVybiAwOwotCWlmIChlcnJvciAhPSBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KSkgewotCQlpZiAoZXJyb3IgPiAwKQotCQkJZXJyb3IgPSAtRUlPOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQorCisJaWYgKGVycm9yICE9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKQorCQlyZXR1cm4gKGVycm9yID09IDApID8gMSA6IGVycm9yOwogCiAJcmdkID0ga21lbV9jYWNoZV96YWxsb2MoZ2ZzMl9yZ3JwZF9jYWNoZXAsIEdGUF9OT0ZTKTsKIAllcnJvciA9IC1FTk9NRU07CiAJaWYgKCFyZ2QpCiAJCXJldHVybiBlcnJvcjsKIAotCW11dGV4X2luaXQoJnJnZC0+cmRfbXV0ZXgpOwotCWxvcHNfaW5pdF9sZSgmcmdkLT5yZF9sZSwgJmdmczJfcmdfbG9wcyk7CiAJcmdkLT5yZF9zYmQgPSBzZHA7CisJcmdkLT5yZF9hZGRyID0gYmU2NF90b19jcHUoYnVmLnJpX2FkZHIpOworCXJnZC0+cmRfbGVuZ3RoID0gYmUzMl90b19jcHUoYnVmLnJpX2xlbmd0aCk7CisJcmdkLT5yZF9kYXRhMCA9IGJlNjRfdG9fY3B1KGJ1Zi5yaV9kYXRhMCk7CisJcmdkLT5yZF9kYXRhID0gYmUzMl90b19jcHUoYnVmLnJpX2RhdGEpOworCXJnZC0+cmRfYml0Ynl0ZXMgPSBiZTMyX3RvX2NwdShidWYucmlfYml0Ynl0ZXMpOwogCi0JbGlzdF9hZGRfdGFpbCgmcmdkLT5yZF9saXN0LCAmc2RwLT5zZF9yaW5kZXhfbGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKLQotCWdmczJfcmluZGV4X2luKHJnZCwgYnVmKTsKIAllcnJvciA9IGNvbXB1dGVfYml0c3RydWN0cyhyZ2QpOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCQlnb3RvIGZhaWw7CiAKIAllcnJvciA9IGdmczJfZ2xvY2tfZ2V0KHNkcCwgcmdkLT5yZF9hZGRyLAogCQkJICAgICAgICZnZnMyX3JncnBfZ2xvcHMsIENSRUFURSwgJnJnZC0+cmRfZ2wpOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCQlnb3RvIGZhaWw7CiAKIAlyZ2QtPnJkX2dsLT5nbF9vYmplY3QgPSByZ2Q7CiAJcmdkLT5yZF9mbGFncyAmPSB+R0ZTMl9SREZfVVBUT0RBVEU7CisJaWYgKHJnZC0+cmRfZGF0YSA+IHNkcC0+c2RfbWF4X3JnX2RhdGEpCisJCXNkcC0+c2RfbWF4X3JnX2RhdGEgPSByZ2QtPnJkX2RhdGE7CisJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwlyZ2RfaW5zZXJ0KHJnZCk7CisJc2RwLT5zZF9yZ3JwcysrOworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKKwlyZXR1cm4gZXJyb3I7CisKK2ZhaWw6CisJa2ZyZWUocmdkLT5yZF9iaXRzKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9yZ3JwZF9jYWNoZXAsIHJnZCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC01OTUsNDAgKzY0MSwyOCBAQAogICogUmV0dXJuczogMCBvbiBzdWNjZXNzZnVsIHVwZGF0ZSwgZXJyb3IgY29kZSBvdGhlcndpc2UKICAqLwogCi1pbnQgZ2ZzMl9yaV91cGRhdGUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQorc3RhdGljIGludCBnZnMyX3JpX3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYV9zdGF0ZTsKLQl1NjQgcmdycF9jb3VudCA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkOwotCXVuc2lnbmVkIGludCBtYXhfZGF0YSA9IDA7CiAJaW50IGVycm9yOwogCi0JZG9fZGl2KHJncnBfY291bnQsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKTsKLQljbGVhcl9yZ3JwZGkoc2RwKTsKLQogCWZpbGVfcmFfc3RhdGVfaW5pdCgmcmFfc3RhdGUsIGlub2RlLT5pX21hcHBpbmcpOwotCWZvciAoc2RwLT5zZF9yZ3JwcyA9IDA7IHNkcC0+c2RfcmdycHMgPCByZ3JwX2NvdW50OyBzZHAtPnNkX3JncnBzKyspIHsKKwlkbyB7CiAJCWVycm9yID0gcmVhZF9yaW5kZXhfZW50cnkoaXAsICZyYV9zdGF0ZSk7Ci0JCWlmIChlcnJvcikgewotCQkJY2xlYXJfcmdycGRpKHNkcCk7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQl9CisJfSB3aGlsZSAoZXJyb3IgPT0gMCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJnZCwgJnNkcC0+c2RfcmluZGV4X2xpc3QsIHJkX2xpc3QpCi0JCWlmIChyZ2QtPnJkX2RhdGEgPiBtYXhfZGF0YSkKLQkJCW1heF9kYXRhID0gcmdkLT5yZF9kYXRhOwotCXNkcC0+c2RfbWF4X3JnX2RhdGEgPSBtYXhfZGF0YTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogZ2ZzMl9yaW5kZXhfaG9sZCAtIEdyYWIgYSBsb2NrIG9uIHRoZSByaW5kZXgKKyAqIGdmczJfcmluZGV4X3VwZGF0ZSAtIFVwZGF0ZSB0aGUgcmluZGV4IGlmIHJlcXVpcmVkCiAgKiBAc2RwOiBUaGUgR0ZTMiBzdXBlcmJsb2NrCi0gKiBAcmlfZ2g6IHRoZSBnbG9jayBob2xkZXIKICAqCiAgKiBXZSBncmFiIGEgbG9jayBvbiB0aGUgcmluZGV4IGlub2RlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QKICAqIGNoYW5nZSB3aGlsc3Qgd2UgYXJlIHBlcmZvcm1pbmcgYW4gb3BlcmF0aW9uLiBXZSBrZWVwIHRoaXMgbG9jawpAQCAtNjQwLDMwICs2NzQsMjkgQEAKICAqIHNwZWNpYWwgZmlsZSwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgaWYgc29tZW9uZSBleHBhbmRlZCB0aGUKICAqIGZpbGVzeXN0ZW0gKHZpYSBnZnMyX2dyb3cgdXRpbGl0eSksIHdoaWNoIGFkZHMgbmV3IHJlc291cmNlIGdyb3Vwcy4KICAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2NlZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQogICovCiAKLWludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKQoraW50IGdmczJfcmluZGV4X3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpOwogCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGlwLT5pX2dsOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGdsLCBMTV9TVF9TSEFSRUQsIDAsIHJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2g7CisJaW50IGVycm9yID0gMDsKIAogCS8qIFJlYWQgbmV3IGNvcHkgZnJvbSBkaXNrIGlmIHdlIGRvbid0IGhhdmUgdGhlIGxhdGVzdCAqLwogCWlmICghc2RwLT5zZF9yaW5kZXhfdXB0b2RhdGUpIHsKIAkJbXV0ZXhfbG9jaygmc2RwLT5zZF9yaW5kZXhfbXV0ZXgpOwotCQlpZiAoIXNkcC0+c2RfcmluZGV4X3VwdG9kYXRlKSB7CisJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGdsLCBMTV9TVF9TSEFSRUQsIDAsICZyaV9naCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKCFzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSkKIAkJCWVycm9yID0gZ2ZzMl9yaV91cGRhdGUoaXApOwotCQkJaWYgKGVycm9yKQotCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KHJpX2doKTsKLQkJfQorCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcmlfZ2gpOwogCQltdXRleF91bmxvY2soJnNkcC0+c2RfcmluZGV4X211dGV4KTsKIAl9CiAKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNjk0LDcgKzcyNyw3IEBACiB9CiAKIC8qKgotICogZ2ZzMl9yZ3JwX2JoX2dldCAtIFJlYWQgaW4gYSBSRydzIGhlYWRlciBhbmQgYml0bWFwcworICogZ2ZzMl9yZ3JwX2dvX2xvY2sgLSBSZWFkIGluIGEgUkcncyBoZWFkZXIgYW5kIGJpdG1hcHMKICAqIEByZ2Q6IHRoZSBzdHJ1Y3QgZ2ZzMl9yZ3JwZCBkZXNjcmliaW5nIHRoZSBSRyB0byByZWFkIGluCiAgKgogICogUmVhZCBpbiBhbGwgb2YgYSBSZXNvdXJjZSBHcm91cCdzIGhlYWRlciBhbmQgYml0bWFwIGJsb2Nrcy4KQEAgLTcwMyw4ICs3MzYsOSBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9yZ3JwX2JoX2dldChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQoraW50IGdmczJfcmdycF9nb19sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCiB7CisJc3RydWN0IGdmczJfcmdycGQgKnJnZCA9IGdoLT5naF9nbC0+Z2xfb2JqZWN0OwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gcmdkLT5yZF9zYmQ7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gcmdkLT5yZF9nbDsKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7CkBAIC03MTIsMTcgKzc0Niw2IEBACiAJdW5zaWduZWQgaW50IHgsIHk7CiAJaW50IGVycm9yOwogCi0JbXV0ZXhfbG9jaygmcmdkLT5yZF9tdXRleCk7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWlmIChyZ2QtPnJkX2JoX2NvdW50KSB7Ci0JCXJnZC0+cmRfYmhfY291bnQrKzsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQltdXRleF91bmxvY2soJnJnZC0+cmRfbXV0ZXgpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCiAJZm9yICh4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7CiAJCWJpID0gcmdkLT5yZF9iaXRzICsgeDsKIAkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChnbCwgcmdkLT5yZF9hZGRyICsgeCwgMCwgJmJpLT5iaV9iaCk7CkBAIC03NDcsMTUgKzc3MCw5IEBACiAJCQljbGVhcl9iaXQoR0JGX0ZVTEwsICZyZ2QtPnJkX2JpdHNbeF0uYmlfZmxhZ3MpOwogCQlnZnMyX3JncnBfaW4ocmdkLCAocmdkLT5yZF9iaXRzWzBdLmJpX2JoKS0+Yl9kYXRhKTsKIAkJcmdkLT5yZF9mbGFncyB8PSAoR0ZTMl9SREZfVVBUT0RBVEUgfCBHRlMyX1JERl9DSEVDSyk7CisJCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfZnJlZTsKIAl9CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfZnJlZTsKLQlyZ2QtPnJkX2JoX2NvdW50Kys7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCi0JbXV0ZXhfdW5sb2NrKCZyZ2QtPnJkX211dGV4KTsKLQogCXJldHVybiAwOwogCiBmYWlsOgpAQCAtNzY1LDUyICs3ODIsMzIgQEAKIAkJYmktPmJpX2JoID0gTlVMTDsKIAkJZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFiaS0+YmlfY2xvbmUpOwogCX0KLQltdXRleF91bmxvY2soJnJnZC0+cmRfbXV0ZXgpOwogCiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkIGdmczJfcmdycF9iaF9ob2xkKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JZ2ZzMl9hc3NlcnRfd2FybihyZ2QtPnJkX3NiZCwgcmdkLT5yZF9iaF9jb3VudCk7Ci0JcmdkLT5yZF9iaF9jb3VudCsrOwotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLX0KLQogLyoqCi0gKiBnZnMyX3JncnBfYmhfcHV0IC0gUmVsZWFzZSBSRyBiaXRtYXBzIHJlYWQgaW4gd2l0aCBnZnMyX3JncnBfYmhfZ2V0KCkKKyAqIGdmczJfcmdycF9nb191bmxvY2sgLSBSZWxlYXNlIFJHIGJpdG1hcHMgcmVhZCBpbiB3aXRoIGdmczJfcmdycF9iaF9nZXQoKQogICogQHJnZDogdGhlIHN0cnVjdCBnZnMyX3JncnBkIGRlc2NyaWJpbmcgdGhlIFJHIHRvIHJlYWQgaW4KICAqCiAgKi8KIAotdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCit2b2lkIGdmczJfcmdycF9nb191bmxvY2soc3RydWN0IGdmczJfaG9sZGVyICpnaCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHJnZC0+cmRfc2JkOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBnaC0+Z2hfZ2wtPmdsX29iamVjdDsKIAlpbnQgeCwgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWdmczJfYXNzZXJ0X3dhcm4ocmdkLT5yZF9zYmQsIHJnZC0+cmRfYmhfY291bnQpOwotCWlmICgtLXJnZC0+cmRfYmhfY291bnQpIHsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZXR1cm47Ci0JfQotCiAJZm9yICh4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7CiAJCXN0cnVjdCBnZnMyX2JpdG1hcCAqYmkgPSByZ2QtPnJkX2JpdHMgKyB4OwotCQlrZnJlZShiaS0+YmlfY2xvbmUpOwotCQliaS0+YmlfY2xvbmUgPSBOVUxMOwogCQlicmVsc2UoYmktPmJpX2JoKTsKIAkJYmktPmJpX2JoID0gTlVMTDsKIAl9CiAKLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiB9CiAKLXN0YXRpYyB2b2lkIGdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgb2Zmc2V0LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKmJpKQordm9pZCBnZnMyX3JncnBfc2VuZF9kaXNjYXJkcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IG9mZnNldCwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdmczJfYml0bWFwICpiaSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2RwLT5zZF92ZnM7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CkBAIC04MjMsNyArODIwLDcgQEAKIAl1bnNpZ25lZCBpbnQgeDsKIAogCWZvciAoeCA9IDA7IHggPCBiaS0+YmlfbGVuOyB4KyspIHsKLQkJY29uc3QgdTggKm9yaWcgPSBiaS0+YmlfYmgtPmJfZGF0YSArIGJpLT5iaV9vZmZzZXQgKyB4OworCQljb25zdCB1OCAqb3JpZyA9IGJoLT5iX2RhdGEgKyBiaS0+Ymlfb2Zmc2V0ICsgeDsKIAkJY29uc3QgdTggKmNsb25lID0gYmktPmJpX2Nsb25lICsgYmktPmJpX29mZnNldCArIHg7CiAJCXU4IGRpZmYgPSB+KCpvcmlnIHwgKCpvcmlnID4+IDEpKSAmICgqY2xvbmUgfCAoKmNsb25lID4+IDEpKTsKIAkJZGlmZiAmPSAweDU1OwpAQCAtODYyLDI4ICs4NTksNiBAQAogCXNkcC0+c2RfYXJncy5hcl9kaXNjYXJkID0gMDsKIH0KIAotdm9pZCBnZnMyX3JncnBfcmVwb2xpc2hfY2xvbmVzKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSByZ2QtPnJkX3NiZDsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7Ci0JdW5zaWduZWQgaW50IHg7Ci0KLQlmb3IgKHggPSAwOyB4IDwgbGVuZ3RoOyB4KyspIHsKLQkJc3RydWN0IGdmczJfYml0bWFwICpiaSA9IHJnZC0+cmRfYml0cyArIHg7Ci0JCWlmICghYmktPmJpX2Nsb25lKQotCQkJY29udGludWU7Ci0JCWlmIChzZHAtPnNkX2FyZ3MuYXJfZGlzY2FyZCkKLQkJCWdmczJfcmdycF9zZW5kX2Rpc2NhcmRzKHNkcCwgcmdkLT5yZF9kYXRhMCwgYmkpOwotCQljbGVhcl9iaXQoR0JGX0ZVTEwsICZiaS0+YmlfZmxhZ3MpOwotCQltZW1jcHkoYmktPmJpX2Nsb25lICsgYmktPmJpX29mZnNldCwKLQkJICAgICAgIGJpLT5iaV9iaC0+Yl9kYXRhICsgYmktPmJpX29mZnNldCwgYmktPmJpX2xlbik7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX2ZyZWU7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotfQotCiAvKioKICAqIGdmczJfYWxsb2NfZ2V0IC0gZ2V0IHRoZSBzdHJ1Y3QgZ2ZzMl9hbGxvYyBzdHJ1Y3R1cmUgZm9yIGFuIGlub2RlCiAgKiBAaXA6IHRoZSBpbmNvcmUgR0ZTMiBpbm9kZSBzdHJ1Y3R1cmUKQEAgLTg5MywzOCArODY4LDM1IEBACiAKIHN0cnVjdCBnZnMyX2FsbG9jICpnZnMyX2FsbG9jX2dldChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CisJaW50IGVycm9yOwogCUJVR19PTihpcC0+aV9hbGxvYyAhPSBOVUxMKTsKIAlpcC0+aV9hbGxvYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZnMyX2FsbG9jKSwgR0ZQX05PRlMpOworCWVycm9yID0gZ2ZzMl9yaW5kZXhfdXBkYXRlKHNkcCk7CisJaWYgKGVycm9yKQorCQlmc193YXJuKHNkcCwgInJpbmRleCB1cGRhdGUgcmV0dXJucyAlZFxuIiwgZXJyb3IpOwogCXJldHVybiBpcC0+aV9hbGxvYzsKIH0KIAogLyoqCiAgKiB0cnlfcmdycF9maXQgLSBTZWUgaWYgYSBnaXZlbiByZXNlcnZhdGlvbiB3aWxsIGZpdCBpbiBhIGdpdmVuIFJHCiAgKiBAcmdkOiB0aGUgUkcgZGF0YQotICogQGFsOiB0aGUgc3RydWN0IGdmczJfYWxsb2Mgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHJlc2VydmF0aW9uCisgKiBAaXA6IHRoZSBpbm9kZQogICoKICAqIElmIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlIHJlcXVlc3RlZCBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGZyb20gdGhlIFJHOgotICogICBTZXRzIHRoZSAkYWxfcmdkIGZpZWxkIGluIEBhbC4KICAqCiAgKiBSZXR1cm5zOiAxIG9uIHN1Y2Nlc3MgKGl0IGZpdHMpLCAwIG9uIGZhaWx1cmUgKGl0IGRvZXNuJ3QgZml0KQogICovCiAKLXN0YXRpYyBpbnQgdHJ5X3JncnBfZml0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIHN0cnVjdCBnZnMyX2FsbG9jICphbCkKK3N0YXRpYyBpbnQgdHJ5X3JncnBfZml0KGNvbnN0IHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHJnZC0+cmRfc2JkOwotCWludCByZXQgPSAwOworCWNvbnN0IHN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwogCiAJaWYgKHJnZC0+cmRfZmxhZ3MgJiAoR0ZTMl9SR0ZfTk9BTExPQyB8IEdGUzJfUkRGX0VSUk9SKSkKIAkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWlmIChyZ2QtPnJkX2ZyZWVfY2xvbmUgPj0gYWwtPmFsX3JlcXVlc3RlZCkgewotCQlhbC0+YWxfcmdkID0gcmdkOwotCQlyZXQgPSAxOwotCX0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlyZXR1cm4gcmV0OworCWlmIChyZ2QtPnJkX2ZyZWVfY2xvbmUgPj0gYWwtPmFsX3JlcXVlc3RlZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtOTkyLDc2ICs5NjQsNiBAQAogfQogCiAvKioKLSAqIHJlY2VudF9yZ3JwX25leHQgLSBnZXQgbmV4dCBSRyBmcm9tICJyZWNlbnQiIGxpc3QKLSAqIEBjdXJfcmdkOiBjdXJyZW50IHJncnAKLSAqCi0gKiBSZXR1cm5zOiBUaGUgbmV4dCByZ3JwIGluIHRoZSByZWNlbnQgbGlzdAotICovCi0KLXN0YXRpYyBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmVjZW50X3JncnBfbmV4dChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqY3VyX3JnZCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGN1cl9yZ2QtPnJkX3NiZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCWhlYWQgPSAmc2RwLT5zZF9yaW5kZXhfbXJ1X2xpc3Q7Ci0JaWYgKHVubGlrZWx5KGN1cl9yZ2QtPnJkX2xpc3RfbXJ1Lm5leHQgPT0gaGVhZCkpIHsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmdkID0gbGlzdF9lbnRyeShjdXJfcmdkLT5yZF9saXN0X21ydS5uZXh0LCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCwgcmRfbGlzdF9tcnUpOwotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZXR1cm4gcmdkOwotfQotCi0vKioKLSAqIGZvcndhcmRfcmdycF9nZXQgLSBnZXQgYW4gcmdycCB0byB0cnkgbmV4dCBmcm9tIGZ1bGwgbGlzdAotICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawotICoKLSAqIFJldHVybnM6IFRoZSByZ3JwIHRvIHRyeSBuZXh0Ci0gKi8KLQotc3RhdGljIHN0cnVjdCBnZnMyX3JncnBkICpmb3J3YXJkX3JncnBfZ2V0KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQotewotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7Ci0JdW5zaWduZWQgaW50IGpvdXJuYWxzID0gZ2ZzMl9qaW5kZXhfc2l6ZShzZHApOwotCXVuc2lnbmVkIGludCByZyA9IDAsIHg7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCi0JcmdkID0gc2RwLT5zZF9yaW5kZXhfZm9yd2FyZDsKLQlpZiAoIXJnZCkgewotCQlpZiAoc2RwLT5zZF9yZ3JwcyA+PSBqb3VybmFscykKLQkJCXJnID0gc2RwLT5zZF9yZ3JwcyAqIHNkcC0+c2RfamRlc2MtPmpkX2ppZCAvIGpvdXJuYWxzOwotCi0JCWZvciAoeCA9IDAsIHJnZCA9IGdmczJfcmdycGRfZ2V0X2ZpcnN0KHNkcCk7IHggPCByZzsKLQkJICAgICB4KyssIHJnZCA9IGdmczJfcmdycGRfZ2V0X25leHQocmdkKSkKLQkJCS8qIERvIE5vdGhpbmcgKi87Ci0KLQkJc2RwLT5zZF9yaW5kZXhfZm9yd2FyZCA9IHJnZDsKLQl9Ci0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0KLQlyZXR1cm4gcmdkOwotfQotCi0vKioKLSAqIGZvcndhcmRfcmdycF9zZXQgLSBzZXQgdGhlIGZvcndhcmQgcmdycCBwb2ludGVyCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICogQHJnZDogVGhlIG5ldyBmb3J3YXJkIHJncnAKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgZm9yd2FyZF9yZ3JwX3NldChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfcmdycGQgKnJnZCkKLXsKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCXNkcC0+c2RfcmluZGV4X2ZvcndhcmQgPSByZ2Q7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotfQotCi0vKioKICAqIGdldF9sb2NhbF9yZ3JwIC0gQ2hvb3NlIGFuZCBsb2NrIGEgcmdycCBmb3IgYWxsb2NhdGlvbgogICogQGlwOiB0aGUgaW5vZGUgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IKICAqIEByZ3A6IHRoZSBjaG9zZW4gYW5kIGxvY2tlZCByZ3JwCkBAIC0xMDc2LDE0ICs5NzgsMTggQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLCAqYmVnaW4gPSBOVUxMOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwotCWludCBmbGFncyA9IExNX0ZMQUdfVFJZOwotCWludCBza2lwcGVkID0gMDsKLQlpbnQgbG9vcHMgPSAwOwogCWludCBlcnJvciwgcmdfbG9ja2VkOworCWludCBsb29wcyA9IDA7CiAKLQlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX2dvYWwpOworCWlmIChpcC0+aV9yZ2QgJiYgcmdycF9jb250YWluc19ibG9jayhpcC0+aV9yZ2QsIGlwLT5pX2dvYWwpKQorCQlyZ2QgPSBiZWdpbiA9IGlwLT5pX3JnZDsKKwllbHNlCisJCXJnZCA9IGJlZ2luID0gZ2ZzMl9ibGsycmdycGQoc2RwLCBpcC0+aV9nb2FsKTsKIAotCXdoaWxlIChyZ2QpIHsKKwlpZiAocmdkID09IE5VTEwpCisJCXJldHVybiAtRUJBRFNMVDsKKworCXdoaWxlIChsb29wcyA8IDMpIHsKIAkJcmdfbG9ja2VkID0gMDsKIAogCQlpZiAoZ2ZzMl9nbG9ja19pc19sb2NrZWRfYnlfbWUocmdkLT5yZF9nbCkpIHsKQEAgLTEwOTUsOTIgKzEwMDEsMzYgQEAKIAkJfQogCQlzd2l0Y2ggKGVycm9yKSB7CiAJCWNhc2UgMDoKLQkJCWlmICh0cnlfcmdycF9maXQocmdkLCBhbCkpCi0JCQkJZ290byBvdXQ7CisJCQlpZiAodHJ5X3JncnBfZml0KHJnZCwgaXApKSB7CisJCQkJaXAtPmlfcmdkID0gcmdkOworCQkJCXJldHVybiAwOworCQkJfQogCQkJaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9DSEVDSykKIAkJCQl0cnlfcmdycF91bmxpbmsocmdkLCBsYXN0X3VubGlua2VkLCBpcC0+aV9ub19hZGRyKTsKIAkJCWlmICghcmdfbG9ja2VkKQogCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmdkX2doKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIEdMUl9UUllGQUlMRUQ6Ci0JCQlyZ2QgPSByZWNlbnRfcmdycF9uZXh0KHJnZCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JfQotCi0JLyogR28gdGhyb3VnaCBmdWxsIGxpc3Qgb2YgcmdycHMgKi8KLQotCWJlZ2luID0gcmdkID0gZm9yd2FyZF9yZ3JwX2dldChzZHApOwotCi0JZm9yICg7OykgewotCQlyZ19sb2NrZWQgPSAwOwotCi0JCWlmIChnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShyZ2QtPnJkX2dsKSkgewotCQkJcmdfbG9ja2VkID0gMTsKLQkJCWVycm9yID0gMDsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHJnZC0+cmRfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgZmxhZ3MsCi0JCQkJCQkgICAmYWwtPmFsX3JnZF9naCk7Ci0JCX0KLQkJc3dpdGNoIChlcnJvcikgewotCQljYXNlIDA6Ci0JCQlpZiAodHJ5X3JncnBfZml0KHJnZCwgYWwpKQotCQkJCWdvdG8gb3V0OwotCQkJaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9DSEVDSykKLQkJCQl0cnlfcmdycF91bmxpbmsocmdkLCBsYXN0X3VubGlua2VkLCBpcC0+aV9ub19hZGRyKTsKLQkJCWlmICghcmdfbG9ja2VkKQotCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmdkX2doKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgR0xSX1RSWUZBSUxFRDoKLQkJCXNraXBwZWQrKzsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQotCQlyZ2QgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZCk7Ci0JCWlmICghcmdkKQotCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKLQotCQlpZiAocmdkID09IGJlZ2luKSB7Ci0JCQlpZiAoKytsb29wcyA+PSAzKQotCQkJCXJldHVybiAtRU5PU1BDOwotCQkJaWYgKCFza2lwcGVkKQorCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfbmV4dChyZ2QpOworCQkJaWYgKHJnZCA9PSBiZWdpbikKIAkJCQlsb29wcysrOwotCQkJZmxhZ3MgPSAwOwotCQkJaWYgKGxvb3BzID09IDIpCi0JCQkJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQogCi1vdXQ6Ci0JaWYgKGJlZ2luKSB7Ci0JCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7Ci0JCWxpc3RfbW92ZSgmcmdkLT5yZF9saXN0X21ydSwgJnNkcC0+c2RfcmluZGV4X21ydV9saXN0KTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCQlyZ2QgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZCk7Ci0JCWlmICghcmdkKQotCQkJcmdkID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKLQkJZm9yd2FyZF9yZ3JwX3NldChzZHAsIHJnZCk7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FTk9TUEM7CiB9CiAKIC8qKgotICogZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfaSAtIFJlc2VydmUgc3BhY2UgaW4gdGhlIGZpbGVzeXN0ZW0KKyAqIGdmczJfaW5wbGFjZV9yZXNlcnZlIC0gUmVzZXJ2ZSBzcGFjZSBpbiB0aGUgZmlsZXN5c3RlbQogICogQGlwOiB0aGUgaW5vZGUgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IKICAqCiAgKiBSZXR1cm5zOiBlcnJubwogICovCiAKLWludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKHN0cnVjdCBnZnMyX2lub2RlICppcCwgaW50IGhvbGRfcmluZGV4LAotCQkJICAgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpCitpbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwpAQCAtMTE5MSw0NSArMTA0MSwyMiBAQAogCWlmIChnZnMyX2Fzc2VydF93YXJuKHNkcCwgYWwtPmFsX3JlcXVlc3RlZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGhvbGRfcmluZGV4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gaG9sZCB0aGUgcmluZGV4IHVubGVzcyB0aGUgaW5vZGUgd2UncmUgdXNpbmcgaXMKLQkJICAgdGhlIHJpbmRleCBpdHNlbGYsIGluIHdoaWNoIGNhc2UgaXQncyBhbHJlYWR5IGhlbGQuICovCi0JCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpKQotCQkJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJmFsLT5hbF9yaV9naCk7Ci0JCWVsc2UgaWYgKCFzZHAtPnNkX3JncnBzKSAvKiBXZSBtYXkgbm90IGhhdmUgdGhlIHJpbmRleCByZWFkCi0JCQkJCSAgICBpbiwgc286ICovCi0JCQllcnJvciA9IGdmczJfcmlfdXBkYXRlKGlwKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotdHJ5X2FnYWluOgogCWRvIHsKIAkJZXJyb3IgPSBnZXRfbG9jYWxfcmdycChpcCwgJmxhc3RfdW5saW5rZWQpOwotCQkvKiBJZiB0aGVyZSBpcyBubyBzcGFjZSwgZmx1c2hpbmcgdGhlIGxvZyBtYXkgcmVsZWFzZSBzb21lICovCi0JCWlmIChlcnJvcikgewotCQkJaWYgKGlwID09IEdGUzJfSShzZHAtPnNkX3JpbmRleCkgJiYKLQkJCSAgICAhc2RwLT5zZF9yaW5kZXhfdXB0b2RhdGUpIHsKLQkJCQllcnJvciA9IGdmczJfcmlfdXBkYXRlKGlwKTsKLQkJCQlpZiAoZXJyb3IpCi0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQlnb3RvIHRyeV9hZ2FpbjsKLQkJCX0KLQkJCWdmczJfbG9nX2ZsdXNoKHNkcCwgTlVMTCk7CisJCWlmIChlcnJvciAhPSAtRU5PU1BDKQorCQkJYnJlYWs7CisJCS8qIENoZWNrIHRoYXQgZnMgaGFzbid0IGdyb3duIGlmIHdyaXRpbmcgdG8gcmluZGV4ICovCisJCWlmIChpcCA9PSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpICYmICFzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSkgeworCQkJZXJyb3IgPSBnZnMyX3JpX3VwZGF0ZShpcCk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKIAkJfQotCX0gd2hpbGUgKGVycm9yICYmIHRyaWVzKysgPCAzKTsKKwkJLyogRmx1c2hpbmcgdGhlIGxvZyBtYXkgcmVsZWFzZSBzcGFjZSAqLworCQlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOworCX0gd2hpbGUgKHRyaWVzKysgPCAzKTsKIAotCWlmIChlcnJvcikgewotCQlpZiAoaG9sZF9yaW5kZXggJiYgaXAgIT0gR0ZTMl9JKHNkcC0+c2RfcmluZGV4KSkKLQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyogbm8gZXJyb3IsIHNvIHdlIGhhdmUgdGhlIHJncnAgc2V0IGluIHRoZSBpbm9kZSdzIGFsbG9jYXRpb24uICovCi0JYWwtPmFsX2ZpbGUgPSBmaWxlOwotCWFsLT5hbF9saW5lID0gbGluZTsKLQotCXJldHVybiAwOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoqCkBAIC0xMjQxLDIwICsxMDY4LDEwIEBACiAKIHZvaWQgZ2ZzMl9pbnBsYWNlX3JlbGVhc2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX2FsbG9jICphbCA9IGlwLT5pX2FsbG9jOwogCi0JaWYgKGdmczJfYXNzZXJ0X3dhcm4oc2RwLCBhbC0+YWxfYWxsb2NlZCA8PSBhbC0+YWxfcmVxdWVzdGVkKSA9PSAtMSkKLQkJZnNfd2FybihzZHAsICJhbF9hbGxvY2VkID0gJXUsIGFsX3JlcXVlc3RlZCA9ICV1ICIKLQkJCSAgICAgImFsX2ZpbGUgPSAlcywgYWxfbGluZSA9ICV1XG4iLAotCQkgICAgICAgICAgICAgYWwtPmFsX2FsbG9jZWQsIGFsLT5hbF9yZXF1ZXN0ZWQsIGFsLT5hbF9maWxlLAotCQkJICAgICBhbC0+YWxfbGluZSk7Ci0KLQlhbC0+YWxfcmdkID0gTlVMTDsKIAlpZiAoYWwtPmFsX3JnZF9naC5naF9nbCkKIAkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yZ2RfZ2gpOwotCWlmIChpcCAhPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpICYmIGFsLT5hbF9yaV9naC5naF9nbCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yaV9naCk7CiB9CiAKIC8qKgpAQCAtMTM1Miw2ICsxMTY5LDcgQEAKIAkJLyogVGhlIEdGUzJfQkxLU1RfVU5MSU5LRUQgc3RhdGUgZG9lc24ndCBhcHBseSB0byB0aGUgY2xvbmUKIAkJICAgYml0bWFwcywgc28gd2UgbXVzdCBzZWFyY2ggdGhlIG9yaWdpbmFscyBmb3IgdGhhdC4gKi8KIAkJYnVmZmVyID0gYmktPmJpX2JoLT5iX2RhdGEgKyBiaS0+Ymlfb2Zmc2V0OworCQlXQVJOX09OKCFidWZmZXJfdXB0b2RhdGUoYmktPmJpX2JoKSk7CiAJCWlmIChvbGRfc3RhdGUgIT0gR0ZTMl9CTEtTVF9VTkxJTktFRCAmJiBiaS0+YmlfY2xvbmUpCiAJCQlidWZmZXIgPSBiaS0+YmlfY2xvbmUgKyBiaS0+Ymlfb2Zmc2V0OwogCkBAIC0xMzcxLDYgKzExODksNyBAQAogCiAJaWYgKGJsayA9PSBCRklUTk9FTlQpCiAJCXJldHVybiBibGs7CisKIAkqbiA9IDE7CiAJaWYgKG9sZF9zdGF0ZSA9PSBuZXdfc3RhdGUpCiAJCWdvdG8gb3V0OwpAQCAtMTUwMyw3ICsxMzIyLDcgQEAKIAlpZiAoYWwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiAKLQlyZ2QgPSBhbC0+YWxfcmdkOworCXJnZCA9IGlwLT5pX3JnZDsKIAogCWlmIChyZ3JwX2NvbnRhaW5zX2Jsb2NrKHJnZCwgaXAtPmlfZ29hbCkpCiAJCWdvYWwgPSBpcC0+aV9nb2FsIC0gcmdkLT5yZF9kYXRhMDsKQEAgLTE1MTgsNyArMTMzNyw3IEBACiAKIAlyZ2QtPnJkX2xhc3RfYWxsb2MgPSBibGs7CiAJYmxvY2sgPSByZ2QtPnJkX2RhdGEwICsgYmxrOwotCWlwLT5pX2dvYWwgPSBibG9jazsKKwlpcC0+aV9nb2FsID0gYmxvY2sgKyAqbiAtIDE7CiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJc3RydWN0IGdmczJfZGlub2RlICpkaSA9IChzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKilkaWJoLT5iX2RhdGE7CkBAIC0xNTM5LDkgKzEzNTgsNyBAQAogCWdmczJfc3RhdGZzX2NoYW5nZShzZHAsIDAsIC0oczY0KSpuLCAwKTsKIAlnZnMyX3F1b3RhX2NoYW5nZShpcCwgKm4sIGlwLT5pX2lub2RlLmlfdWlkLCBpcC0+aV9pbm9kZS5pX2dpZCk7CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCXJnZC0+cmRfZnJlZV9jbG9uZSAtPSAqbjsKLQlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAJdHJhY2VfZ2ZzMl9ibG9ja19hbGxvYyhpcCwgYmxvY2ssICpuLCBHRlMyX0JMS1NUX1VTRUQpOwogCSpibiA9IGJsb2NrOwogCXJldHVybiAwOwpAQCAtMTU2NCw3ICsxMzgxLDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsID0gZGlwLT5pX2FsbG9jOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBhbC0+YWxfcmdkOworCXN0cnVjdCBnZnMyX3JncnBkICpyZ2QgPSBkaXAtPmlfcmdkOwogCXUzMiBibGs7CiAJdTY0IGJsb2NrOwogCXVuc2lnbmVkIGludCBuID0gMTsKQEAgLTE1OTQsOSArMTQxMSw3IEBACiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgLTEsICsxKTsKIAlnZnMyX3RyYW5zX2FkZF91bnJldm9rZShzZHAsIGJsb2NrLCAxKTsKIAotCXNwaW5fbG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAJcmdkLT5yZF9mcmVlX2Nsb25lLS07Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwogCXRyYWNlX2dmczJfYmxvY2tfYWxsb2MoZGlwLCBibG9jaywgMSwgR0ZTMl9CTEtTVF9ESU5PREUpOwogCSpibiA9IGJsb2NrOwogCXJldHVybiAwOwpAQCAtMTYyOSw4ICsxNDQ0LDYgQEAKIAlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgsIDEpOwogCWdmczJfcmdycF9vdXQocmdkLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgtPmJfZGF0YSk7CiAKLQlnZnMyX3RyYW5zX2FkZF9yZyhyZ2QpOwotCiAJLyogRGlyZWN0b3JpZXMga2VlcCB0aGVpciBkYXRhIGluIHRoZSBtZXRhZGF0YSBhZGRyZXNzIHNwYWNlICovCiAJaWYgKG1ldGEgfHwgaXAtPmlfZGVwdGgpCiAJCWdmczJfbWV0YV93aXBlKGlwLCBic3RhcnQsIGJsZW4pOwpAQCAtMTY2Niw3ICsxNDc5LDYgQEAKIAl0cmFjZV9nZnMyX2Jsb2NrX2FsbG9jKGlwLCBibGtubywgMSwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7CiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwotCWdmczJfdHJhbnNfYWRkX3JnKHJnZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfZnJlZV91bmluaXRfZGkoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdTY0IGJsa25vKQpAQCAtMTY4OCw3ICsxNTAwLDYgQEAKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwogCiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgKzEsIC0xKTsKLQlnZnMyX3RyYW5zX2FkZF9yZyhyZ2QpOwogfQogCiAKQEAgLTE3MTQsNDEgKzE1MjUsMzMgQEAKIGludCBnZnMyX2NoZWNrX2Jsa190eXBlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgbm9fYWRkciwgdW5zaWduZWQgaW50IHR5cGUpCiB7CiAJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKLQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2gsIHJnZF9naDsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9yaW5kZXgpOwotCWludCByaV9sb2NrZWQgPSAwOworCXN0cnVjdCBnZnMyX2hvbGRlciByZ2RfZ2g7CiAJaW50IGVycm9yOwogCi0JaWYgKCFnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShpcC0+aV9nbCkpIHsKLQkJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBmYWlsOwotCQlyaV9sb2NrZWQgPSAxOwotCX0KKwllcnJvciA9IGdmczJfcmluZGV4X3VwZGF0ZShzZHApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJZXJyb3IgPSAtRUlOVkFMOwogCXJnZCA9IGdmczJfYmxrMnJncnBkKHNkcCwgbm9fYWRkcik7CiAJaWYgKCFyZ2QpCi0JCWdvdG8gZmFpbF9yaW5kZXg7CisJCWdvdG8gZmFpbDsKIAogCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHJnZC0+cmRfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJnJnZF9naCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfcmluZGV4OworCQlnb3RvIGZhaWw7CiAKIAlpZiAoZ2ZzMl9nZXRfYmxvY2tfdHlwZShyZ2QsIG5vX2FkZHIpICE9IHR5cGUpCiAJCWVycm9yID0gLUVTVEFMRTsKIAogCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyZ2RfZ2gpOwotZmFpbF9yaW5kZXg6Ci0JaWYgKHJpX2xvY2tlZCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKIGZhaWw6CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKioKICAqIGdmczJfcmxpc3RfYWRkIC0gYWRkIGEgUkcgdG8gYSBsaXN0IG9mIFJHcwotICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqIEBpcDogdGhlIGlub2RlCiAgKiBAcmxpc3Q6IHRoZSBsaXN0IG9mIHJlc291cmNlIGdyb3VwcwogICogQGJsb2NrOiB0aGUgYmxvY2sKICAqCkBAIC0xNzU4LDkgKzE1NjEsMTAgQEAKICAqCiAgKi8KIAotdm9pZCBnZnMyX3JsaXN0X2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfcmdycF9saXN0ICpybGlzdCwKK3ZvaWQgZ2ZzMl9ybGlzdF9hZGQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0LAogCQkgICAgdTY0IGJsb2NrKQogeworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3JncnBkICpyZ2Q7CiAJc3RydWN0IGdmczJfcmdycGQgKip0bXA7CiAJdW5zaWduZWQgaW50IG5ld19zcGFjZTsKQEAgLTE3NjksMTIgKzE1NzMsMTUgQEAKIAlpZiAoZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFybGlzdC0+cmxfZ2hzKSkKIAkJcmV0dXJuOwogCi0JcmdkID0gZ2ZzMl9ibGsycmdycGQoc2RwLCBibG9jayk7CisJaWYgKGlwLT5pX3JnZCAmJiByZ3JwX2NvbnRhaW5zX2Jsb2NrKGlwLT5pX3JnZCwgYmxvY2spKQorCQlyZ2QgPSBpcC0+aV9yZ2Q7CisJZWxzZQorCQlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGJsb2NrKTsKIAlpZiAoIXJnZCkgewotCQlpZiAoZ2ZzMl9jb25zaXN0KHNkcCkpCi0JCQlmc19lcnIoc2RwLCAiYmxvY2sgPSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrKTsKKwkJZnNfZXJyKHNkcCwgInJsaXN0X2FkZDogbm8gcmdycCBmb3IgYmxvY2sgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jayk7CiAJCXJldHVybjsKIAl9CisJaXAtPmlfcmdkID0gcmdkOwogCiAJZm9yICh4ID0gMDsgeCA8IHJsaXN0LT5ybF9yZ3JwczsgeCsrKQogCQlpZiAocmxpc3QtPnJsX3JnZFt4XSA9PSByZ2QpCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuaCBiL2ZzL2dmczIvcmdycC5oCmluZGV4IGQyNTNmOWEuLmNmNWM1MDEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5oCisrKyBiL2ZzL2dmczIvcmdycC5oCkBAIC0xOCwxOCArMTgsMTUgQEAKIAogZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX3ZlcmlmeShzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKIAotc3RydWN0IGdmczJfcmdycGQgKmdmczJfYmxrMnJncnBkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrKTsKLXN0cnVjdCBnZnMyX3JncnBkICpnZnMyX3JncnBkX2dldF9maXJzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7Ci1zdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9yZ3JwZF9nZXRfbmV4dChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9ibGsycmdycGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBibGspOworZXh0ZXJuIHN0cnVjdCBnZnMyX3JncnBkICpnZnMyX3JncnBkX2dldF9maXJzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gc3RydWN0IGdmczJfcmdycGQgKmdmczJfcmdycGRfZ2V0X25leHQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7CiAKIGV4dGVybiB2b2lkIGdmczJfY2xlYXJfcmdycGQoc3RydWN0IGdmczJfc2JkICpzZHApOwotZXh0ZXJuIGludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKTsKLQotZXh0ZXJuIGludCBnZnMyX3JncnBfYmhfZ2V0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX2JoX2hvbGQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7Ci1leHRlcm4gdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwotCi1leHRlcm4gdm9pZCBnZnMyX3JncnBfcmVwb2xpc2hfY2xvbmVzKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOworZXh0ZXJuIGludCBnZnMyX3JpbmRleF91cGRhdGUoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIHZvaWQgZ2ZzMl9mcmVlX2Nsb25lcyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiBpbnQgZ2ZzMl9yZ3JwX2dvX2xvY2soc3RydWN0IGdmczJfaG9sZGVyICpnaCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfZ29fdW5sb2NrKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpOwogCiBleHRlcm4gc3RydWN0IGdmczJfYWxsb2MgKmdmczJfYWxsb2NfZ2V0KHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ZzMl9hbGxvY19wdXQoc3RydWN0IGdmczJfaW5vZGUgKmlwKQpAQCAtMzksMTYgKzM2LDkgQEAKIAlpcC0+aV9hbGxvYyA9IE5VTEw7CiB9CiAKLWV4dGVybiBpbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGludCBob2xkX3JpbmRleCwKLQkJCQkgIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKTsKLSNkZWZpbmUgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoaXApIFwKLQlnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKChpcCksIDEsIF9fRklMRV9fLCBfX0xJTkVfXykKLSNkZWZpbmUgZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfcmkoaXApIFwKLQlnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKChpcCksIDAsIF9fRklMRV9fLCBfX0xJTkVfXykKLQorZXh0ZXJuIGludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogZXh0ZXJuIHZvaWQgZ2ZzMl9pbnBsYWNlX3JlbGVhc2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIAotZXh0ZXJuIGludCBnZnMyX3JpX3VwZGF0ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogZXh0ZXJuIGludCBnZnMyX2FsbG9jX2Jsb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0ICpibiwgdW5zaWduZWQgaW50ICpuKTsKIGV4dGVybiBpbnQgZ2ZzMl9hbGxvY19kaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCAqYm4sIHU2NCAqZ2VuZXJhdGlvbik7CiAKQEAgLTY2LDExICs1NiwxNCBAQAogCXN0cnVjdCBnZnMyX2hvbGRlciAqcmxfZ2hzOwogfTsKIAotZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9hZGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsCitleHRlcm4gdm9pZCBnZnMyX3JsaXN0X2FkZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsCiAJCQkgICB1NjQgYmxvY2spOwogZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9hbGxvYyhzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0LCB1bnNpZ25lZCBpbnQgc3RhdGUpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9ybGlzdF9mcmVlKHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QpOwogZXh0ZXJuIHU2NCBnZnMyX3JpX3RvdGFsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIGV4dGVybiBpbnQgZ2ZzMl9yZ3JwX2R1bXAoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfc2VuZF9kaXNjYXJkcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IG9mZnNldCwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGdmczJfYml0bWFwICpiaSk7CiAKICNlbmRpZiAvKiBfX1JHUlBfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zdXBlci5jIGIvZnMvZ2ZzMi9zdXBlci5jCmluZGV4IGI3YmVhZGQuLjcxZTQyMDkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvc3VwZXIuYworKysgYi9mcy9nZnMyL3N1cGVyLmMKQEAgLTc1Miw0NyArNzUyLDE1IEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWV0YW1hcHBpbmcgPSBnZnMyX2dsb2NrMmFzcGFjZShpcC0+aV9nbCk7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1ldGFtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwotCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCXN0cnVjdCB0aW1lc3BlYyBhdGltZTsKLQlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpOwotCWludCByZXQgPSAtRUFHQUlOOwotCWludCB1bmxvY2tfcmVxdWlyZWQgPSAwOworCWludCByZXQgPSAwOwogCi0JLyogU2tpcCB0aW1lc3RhbXAgdXBkYXRlLCBpZiB0aGlzIGlzIGZyb20gYSBtZW1hbGxvYyAqLwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKQotCQlnb3RvIGRvX2ZsdXNoOwotCWlmICghZ2ZzMl9nbG9ja19pc19sb2NrZWRfYnlfbWUoaXAtPmlfZ2wpKSB7Ci0JCXJldCA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOwotCQlpZiAocmV0KQotCQkJZ290byBkb19mbHVzaDsKLQkJdW5sb2NrX3JlcXVpcmVkID0gMTsKLQl9Ci0JcmV0ID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19ESU5PREUsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gZG9fdW5sb2NrOwotCXJldCA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZiaCk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWJoLT5iX2RhdGE7Ci0JCWF0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KGRpLT5kaV9hdGltZSk7Ci0JCWF0aW1lLnR2X25zZWMgPSBiZTMyX3RvX2NwdShkaS0+ZGlfYXRpbWVfbnNlYyk7Ci0JCWlmICh0aW1lc3BlY19jb21wYXJlKCZpbm9kZS0+aV9hdGltZSwgJmF0aW1lKSA+IDApIHsKLQkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7Ci0JCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGJoLT5iX2RhdGEpOwotCQl9Ci0JCWJyZWxzZShiaCk7Ci0JfQotCWdmczJfdHJhbnNfZW5kKHNkcCk7Ci1kb191bmxvY2s6Ci0JaWYgKHVubG9ja19yZXF1aXJlZCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKLWRvX2ZsdXNoOgogCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKLQlmaWxlbWFwX2ZkYXRhd3JpdGUobWV0YW1hcHBpbmcpOwogCWlmIChiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQlnZnMyX2FpbDFfZmx1c2goc2RwLCB3YmMpOwotCWlmICghcmV0ICYmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkpCisJZWxzZQorCQlmaWxlbWFwX2ZkYXRhd3JpdGUobWV0YW1hcHBpbmcpOworCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCkKIAkJcmV0ID0gZmlsZW1hcF9mZGF0YXdhaXQobWV0YW1hcHBpbmcpOwogCWlmIChyZXQpCiAJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CkBAIC04MDAsNiArNzY4LDY0IEBACiB9CiAKIC8qKgorICogZ2ZzMl9kaXJ0eV9pbm9kZSAtIGNoZWNrIGZvciBhdGltZSB1cGRhdGVzCisgKiBAaW5vZGU6IFRoZSBpbm9kZSBpbiBxdWVzdGlvbgorICogQGZsYWdzOiBUaGUgdHlwZSBvZiBkaXJ0eQorICoKKyAqIFVuZm9ydHVuYXRlbHkgaXQgY2FuIGJlIGNhbGxlZCB1bmRlciBhbnkgY29tYmluYXRpb24gb2YgaW5vZGUKKyAqIGdsb2NrIGFuZCB0cmFuc2FjdGlvbiBsb2NrLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIGNhcmVmdWxseS4KKyAqCisgKiBBdCB0aGUgbW9tZW50IHRoaXMgZGVhbHMgb25seSB3aXRoIGF0aW1lIC0gaXQgc2hvdWxkIGJlIHBvc3NpYmxlCisgKiB0byBleHBhbmQgdGhhdCByb2xlIGluIGZ1dHVyZSwgb25jZSBhIHJldmlldyBvZiB0aGUgbG9ja2luZyBoYXMKKyAqIGJlZW4gY2FycmllZCBvdXQuCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGdmczJfaG9sZGVyIGdoOworCWludCBuZWVkX3VubG9jayA9IDA7CisJaW50IG5lZWRfZW5kdHJhbnMgPSAwOworCWludCByZXQ7CisKKwlpZiAoIShmbGFncyAmIChJX0RJUlRZX0RBVEFTWU5DfElfRElSVFlfU1lOQykpKQorCQlyZXR1cm47CisKKwlpZiAoIWdmczJfZ2xvY2tfaXNfbG9ja2VkX2J5X21lKGlwLT5pX2dsKSkgeworCQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKKwkJaWYgKHJldCkgeworCQkJZnNfZXJyKHNkcCwgImRpcnR5X2lub2RlOiBnbG9jayAlZFxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCQluZWVkX3VubG9jayA9IDE7CisJfQorCisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9PSBOVUxMKSB7CisJCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZnNfZXJyKHNkcCwgImRpcnR5X2lub2RlOiBnZnMyX3RyYW5zX2JlZ2luICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJbmVlZF9lbmR0cmFucyA9IDE7CisJfQorCisJcmV0ID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKKwlpZiAocmV0ID09IDApIHsKKwkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisKKwlpZiAobmVlZF9lbmR0cmFucykKKwkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKK291dDoKKwlpZiAobmVlZF91bmxvY2spCisJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7Cit9CisKKy8qKgogICogZ2ZzMl9tYWtlX2ZzX3JvIC0gVHVybiBhIFJlYWQtV3JpdGUgRlMgaW50byBhIFJlYWQtT25seSBvbmUKICAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCiAgKgpAQCAtMTAxMSw3ICsxMDM3LDYgQEAKIAogc3RhdGljIGludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQogewotCXN0cnVjdCBnZnMyX2hvbGRlciByaV9naDsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkX25leHQ7CiAJc3RydWN0IGdmczJfaG9sZGVyICpnaGEsICpnaDsKIAl1bnNpZ25lZCBpbnQgc2xvdHMgPSA2NDsKQEAgLTEwMjQsMTAgKzEwNDksNiBAQAogCWlmICghZ2hhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZyaV9naCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQogCXJnZF9uZXh0ID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKIAogCWZvciAoOzspIHsKQEAgLTEwNzAsOSArMTA5MSw2IEBACiAJCXlpZWxkKCk7CiAJfQogCi0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKLQotb3V0OgogCWtmcmVlKGdoYSk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTEyNCw2ICsxMTQyLDEwIEBACiAJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNjOwogCWludCBlcnJvcjsKIAorCWVycm9yID0gZ2ZzMl9yaW5kZXhfdXBkYXRlKHNkcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKIAlpZiAoZ2ZzMl90dW5lX2dldChzZHAsIGd0X3N0YXRmc19zbG93KSkKIAkJZXJyb3IgPSBnZnMyX3N0YXRmc19zbG93KHNkcCwgJnNjKTsKIAllbHNlCkBAIC0xMzk0LDIxICsxNDE2LDE3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZhbC0+YWxfcmlfZ2gpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcXM7Ci0KIAlyZ2QgPSBnZnMyX2JsazJyZ3JwZChzZHAsIGlwLT5pX25vX2FkZHIpOwogCWlmICghcmdkKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CiAJCWVycm9yID0gLUVJTzsKLQkJZ290byBvdXRfcmluZGV4X3JlbHNlOworCQlnb3RvIG91dF9xczsKIAl9CiAKIAllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChyZ2QtPnJkX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsCiAJCQkJICAgJmFsLT5hbF9yZ2RfZ2gpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmluZGV4X3JlbHNlOworCQlnb3RvIG91dF9xczsKIAogCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19SR19CSVQgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBLAogCQkJCSBzZHAtPnNkX2pkZXNjLT5qZF9ibG9ja3MpOwpAQCAtMTQyMyw4ICsxNDQxLDYgQEAKIAogb3V0X3JnX2d1bmxvY2s6CiAJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmFsLT5hbF9yZ2RfZ2gpOwotb3V0X3JpbmRleF9yZWxzZToKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmYWwtPmFsX3JpX2doKTsKIG91dF9xczoKIAlnZnMyX3F1b3RhX3VuaG9sZChpcCk7CiBvdXQ6CkBAIC0xNDcxLDkgKzE0ODcsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBnZnMyX2NoZWNrX2Jsa190eXBlKHNkcCwgaXAtPmlfbm9fYWRkciwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF90cnVuY2F0ZTsKKwlpZiAoIXRlc3RfYml0KEdJRl9BTExPQ19GQUlMRUQsICZpcC0+aV9mbGFncykpIHsKKwkJZXJyb3IgPSBnZnMyX2NoZWNrX2Jsa190eXBlKHNkcCwgaXAtPmlfbm9fYWRkciwgR0ZTMl9CTEtTVF9VTkxJTktFRCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3RydW5jYXRlOworCX0KIAogCWlmICh0ZXN0X2JpdChHSUZfSU5WQUxJRCwgJmlwLT5pX2ZsYWdzKSkgewogCQllcnJvciA9IGdmczJfaW5vZGVfcmVmcmVzaChpcCk7CkBAIC0xNTEzLDYgKzE1MzEsMTAgQEAKIAlnb3RvIG91dF91bmxvY2s7CiAKIG91dF90cnVuY2F0ZToKKwlnZnMyX2xvZ19mbHVzaChzZHAsIGlwLT5pX2dsKTsKKwl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCWdmczJfYWlsX2ZsdXNoKGlwLT5pX2dsLCAwKTsKKwogCS8qIENhc2UgMiBzdGFydHMgaGVyZSAqLwogCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIDAsIHNkcC0+c2RfamRlc2MtPmpkX2Jsb2Nrcyk7CiAJaWYgKGVycm9yKQpAQCAtMTU1Miw2ICsxNTc0LDcgQEAKIAlpZiAoaXApIHsKIAkJaXAtPmlfZmxhZ3MgPSAwOwogCQlpcC0+aV9nbCA9IE5VTEw7CisJCWlwLT5pX3JnZCA9IE5VTEw7CiAJfQogCXJldHVybiAmaXAtPmlfaW5vZGU7CiB9CkBAIC0xNTcyLDYgKzE1OTUsNyBAQAogCS5hbGxvY19pbm9kZQkJPSBnZnMyX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCQk9IGdmczJfZGVzdHJveV9pbm9kZSwKIAkud3JpdGVfaW5vZGUJCT0gZ2ZzMl93cml0ZV9pbm9kZSwKKwkuZGlydHlfaW5vZGUJCT0gZ2ZzMl9kaXJ0eV9pbm9kZSwKIAkuZXZpY3RfaW5vZGUJCT0gZ2ZzMl9ldmljdF9pbm9kZSwKIAkucHV0X3N1cGVyCQk9IGdmczJfcHV0X3N1cGVyLAogCS5zeW5jX2ZzCQk9IGdmczJfc3luY19mcywKZGlmZiAtLWdpdCBhL2ZzL2dmczIvdHJhbnMuYyBiL2ZzL2dmczIvdHJhbnMuYwppbmRleCA5ZWM3M2E4Li44NmFjNzVkIDEwMDY0NAotLS0gYS9mcy9nZnMyL3RyYW5zLmMKKysrIGIvZnMvZ2ZzMi90cmFucy5jCkBAIC0xODUsOCArMTg1LDMgQEAKIAlnZnMyX2xvZ191bmxvY2soc2RwKTsKIH0KIAotdm9pZCBnZnMyX3RyYW5zX2FkZF9yZyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKQotewotCWxvcHNfYWRkKHJnZC0+cmRfc2JkLCAmcmdkLT5yZF9sZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvdHJhbnMuaCBiL2ZzL2dmczIvdHJhbnMuaAppbmRleCBmYjU2Yjc4Li5mOGYxMDFlIDEwMDY0NAotLS0gYS9mcy9nZnMyL3RyYW5zLmgKKysrIGIvZnMvZ2ZzMi90cmFucy5oCkBAIC0yOCwyMCArMjgsMjAgQEAKIAogLyogcmVzZXJ2ZSBlaXRoZXIgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIHBsdXMgdGhlIHJnIGhlYWRlcgogICogYmxvY2ssIG9yIGFsbCBvZiB0aGUgYmxvY2tzIGluIHRoZSByZywgd2hpY2hldmVyIGlzIHNtYWxsZXIgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfcmdfYmxvY2tzKGNvbnN0IHN0cnVjdCBnZnMyX2FsbG9jICphbCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfcmdfYmxvY2tzKGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlyZXR1cm4gKGFsLT5hbF9yZXF1ZXN0ZWQgPCBhbC0+YWxfcmdkLT5yZF9sZW5ndGgpPwotCSAgICAgICBhbC0+YWxfcmVxdWVzdGVkICsgMSA6IGFsLT5hbF9yZ2QtPnJkX2xlbmd0aDsKKwljb25zdCBzdHJ1Y3QgZ2ZzMl9hbGxvYyAqYWwgPSBpcC0+aV9hbGxvYzsKKwlpZiAoYWwtPmFsX3JlcXVlc3RlZCA8IGlwLT5pX3JnZC0+cmRfbGVuZ3RoKQorCQlyZXR1cm4gYWwtPmFsX3JlcXVlc3RlZCArIDE7CisJcmV0dXJuIGlwLT5pX3JnZC0+cmRfbGVuZ3RoOwogfQogCi1pbnQgZ2ZzMl90cmFuc19iZWdpbihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdW5zaWduZWQgaW50IGJsb2NrcywKLQkJICAgICB1bnNpZ25lZCBpbnQgcmV2b2tlcyk7CitleHRlcm4gaW50IGdmczJfdHJhbnNfYmVnaW4oc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBibG9ja3MsCisJCQkgICAgdW5zaWduZWQgaW50IHJldm9rZXMpOwogCi12b2lkIGdmczJfdHJhbnNfZW5kKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLQotdm9pZCBnZnMyX3RyYW5zX2FkZF9iaChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBtZXRhKTsKLXZvaWQgZ2ZzMl90cmFuc19hZGRfcmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9idWZkYXRhICpiZCk7Ci12b2lkIGdmczJfdHJhbnNfYWRkX3VucmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrbm8sIHVuc2lnbmVkIGludCBsZW4pOwotdm9pZCBnZnMyX3RyYW5zX2FkZF9yZyhzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKK2V4dGVybiB2b2lkIGdmczJfdHJhbnNfZW5kKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiB2b2lkIGdmczJfdHJhbnNfYWRkX2JoKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IG1ldGEpOworZXh0ZXJuIHZvaWQgZ2ZzMl90cmFuc19hZGRfcmV2b2tlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9idWZkYXRhICpiZCk7CitleHRlcm4gdm9pZCBnZnMyX3RyYW5zX2FkZF91bnJldm9rZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogI2VuZGlmIC8qIF9fVFJBTlNfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi94YXR0ci5jIGIvZnMvZ2ZzMi94YXR0ci5jCmluZGV4IDQzOWI2MWMwLi43MWQ3YmY4IDEwMDY0NAotLS0gYS9mcy9nZnMyL3hhdHRyLmMKKysrIGIvZnMvZ2ZzMi94YXR0ci5jCkBAIC0zMzIsMTUgKzMzMiw4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9hbGxvYzsKIAotCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChHRlMyX1NCKCZpcC0+aV9pbm9kZSksICZhbC0+YWxfcmlfZ2gpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcXVvdGE7Ci0KIAllcnJvciA9IGVhX2RlYWxsb2NfdW5zdHVmZmVkKGlwLCBiaCwgZWEsIHByZXYsIChsZWF2ZSkgPyAmZXJyb3IgOiBOVUxMKTsKIAotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwotCi1vdXRfcXVvdGE6CiAJZ2ZzMl9xdW90YV91bmhvbGQoaXApOwogb3V0X2FsbG9jOgogCWdmczJfYWxsb2NfcHV0KGlwKTsKQEAgLTczNCw3ICs3MjcsNyBAQAogCQlnb3RvIG91dF9ndW5sb2NrX3E7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLAotCQkJCSBibGtzICsgZ2ZzMl9yZ19ibG9ja3MoYWwpICsKKwkJCQkgYmxrcyArIGdmczJfcmdfYmxvY2tzKGlwKSArCiAJCQkJIFJFU19ESU5PREUgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBLCAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2lwcmVzOwpAQCAtMTI5Niw3ICsxMjg5LDggQEAKIAogaW50IGdmczJfeGF0dHJfYWNsX2NobW9kKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyLCBjaGFyICpkYXRhKQogewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9lYV9sb2NhdGlvbiBlbDsKIAlpbnQgZXJyb3I7CiAKQEAgLTEzMTksNyArMTMxMyw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQllcnJvciA9IGdmczJfc2V0YXR0cl9zaW1wbGUoaXAsIGF0dHIpOworCWVycm9yID0gZ2ZzMl9zZXRhdHRyX3NpbXBsZShpbm9kZSwgYXR0cik7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMzYyLDE0ICsxMzU2LDE0IEBACiAJCQlibGVuKys7CiAJCWVsc2UgewogCQkJaWYgKGJzdGFydCkKLQkJCQlnZnMyX3JsaXN0X2FkZChzZHAsICZybGlzdCwgYnN0YXJ0KTsKKwkJCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCQkJYnN0YXJ0ID0gYm47CiAJCQlibGVuID0gMTsKIAkJfQogCQlibGtzKys7CiAJfQogCWlmIChic3RhcnQpCi0JCWdmczJfcmxpc3RfYWRkKHNkcCwgJnJsaXN0LCBic3RhcnQpOworCQlnZnMyX3JsaXN0X2FkZChpcCwgJnJsaXN0LCBic3RhcnQpOwogCWVsc2UKIAkJZ290byBvdXQ7CiAKQEAgLTE1MDEsMjQgKzE0OTUsMTggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2FsbG9jOwogCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgJmFsLT5hbF9yaV9naCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9xdW90YTsKLQogCWVycm9yID0gZWFfZm9yZWFjaChpcCwgZWFfZGVhbGxvY191bnN0dWZmZWQsIE5VTEwpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmluZGV4OworCQlnb3RvIG91dF9xdW90YTsKIAogCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkgewogCQllcnJvciA9IGVhX2RlYWxsb2NfaW5kaXJlY3QoaXApOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF9yaW5kZXg7CisJCQlnb3RvIG91dF9xdW90YTsKIAl9CiAKIAllcnJvciA9IGVhX2RlYWxsb2NfYmxvY2soaXApOwogCi1vdXRfcmluZGV4OgotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmlfZ2gpOwogb3V0X3F1b3RhOgogCWdmczJfcXVvdGFfdW5ob2xkKGlwKTsKIG91dF9hbGxvYzoKZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5jIGIvZnMvaGZzL2J0cmVlLmMKaW5kZXggM2ViYzQzNy4uMWNiZGVlYSAxMDA2NDQKLS0tIGEvZnMvaGZzL2J0cmVlLmMKKysrIGIvZnMvaGZzL2J0cmVlLmMKQEAgLTQ2LDExICs0NiwyNiBAQAogCWNhc2UgSEZTX0VYVF9DTklEOgogCQloZnNfaW5vZGVfcmVhZF9mb3JrKHRyZWUtPmlub2RlLCBtZGItPmRyWFRFeHRSZWMsIG1kYi0+ZHJYVEZsU2l6ZSwKIAkJCQkgICAgbWRiLT5kclhURmxTaXplLCBiZTMyX3RvX2NwdShtZGItPmRyWFRDbHBTaXopKTsKKwkJaWYgKEhGU19JKHRyZWUtPmlub2RlKS0+YWxsb2NfYmxvY2tzID4KKwkJCQkJSEZTX0kodHJlZS0+aW5vZGUpLT5maXJzdF9ibG9ja3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaGZzOiBpbnZhbGlkIGJ0cmVlIGV4dGVudCByZWNvcmRzXG4iKTsKKwkJCXVubG9ja19uZXdfaW5vZGUodHJlZS0+aW5vZGUpOworCQkJZ290byBmcmVlX2lub2RlOworCQl9CisKIAkJdHJlZS0+aW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzX2J0cmVlX2FvcHM7CiAJCWJyZWFrOwogCWNhc2UgSEZTX0NBVF9DTklEOgogCQloZnNfaW5vZGVfcmVhZF9mb3JrKHRyZWUtPmlub2RlLCBtZGItPmRyQ1RFeHRSZWMsIG1kYi0+ZHJDVEZsU2l6ZSwKIAkJCQkgICAgbWRiLT5kckNURmxTaXplLCBiZTMyX3RvX2NwdShtZGItPmRyQ1RDbHBTaXopKTsKKworCQlpZiAoIUhGU19JKHRyZWUtPmlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImhmczogaW52YWxpZCBidHJlZSBleHRlbnQgcmVjb3JkcyAiCisJCQkJCQkJCSIoMCBzaXplKS5cbiIpOworCQkJdW5sb2NrX25ld19pbm9kZSh0cmVlLT5pbm9kZSk7CisJCQlnb3RvIGZyZWVfaW5vZGU7CisJCX0KKwogCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTU5LDExICs3NCw2IEBACiAJfQogCXVubG9ja19uZXdfaW5vZGUodHJlZS0+aW5vZGUpOwogCi0JaWYgKCFIRlNfSSh0cmVlLT5pbm9kZSktPmZpcnN0X2Jsb2NrcykgewotCQlwcmludGsoS0VSTl9FUlIgImhmczogaW52YWxpZCBidHJlZSBleHRlbnQgcmVjb3JkcyAoMCBzaXplKS5cbiIpOwotCQlnb3RvIGZyZWVfaW5vZGU7Ci0JfQotCiAJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CiAJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIDAsIE5VTEwpOwogCWlmIChJU19FUlIocGFnZSkpCmRpZmYgLS1naXQgYS9mcy9oZnMvZGlyLmMgYi9mcy9oZnMvZGlyLmMKaW5kZXggYjRkNzBiMS4uYmNlNGVlZiAxMDA2NDQKLS0tIGEvZnMvaGZzL2Rpci5jCisrKyBiL2ZzL2hmcy9kaXIuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIAlyZXMgPSBoZnNfY2F0X2NyZWF0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gcmVzOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAKIAlyZXMgPSBoZnNfY2F0X2NyZWF0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2lub2RlLmMgYi9mcy9oZnMvaW5vZGUuYwppbmRleCA5NmExYjYyLi5hMWE5ZmRjIDEwMDY0NAotLS0gYS9mcy9oZnMvaW5vZGUuYworKysgYi9mcy9oZnMvaW5vZGUuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCUhGU19JKGlub2RlKS0+ZmxhZ3MgPSAwOwogCUhGU19JKGlub2RlKS0+cnNyY19pbm9kZSA9IE5VTEw7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBpbm9kZSAqLwogCWlub2RlLT5pX3VpZCA9IGhzYi0+c191aWQ7CiAJaW5vZGUtPmlfZ2lkID0gaHNiLT5zX2dpZDsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCWlmIChpZGF0YS0+a2V5KQogCQlIRlNfSShpbm9kZSktPmNhdF9rZXkgPSAqaWRhdGEtPmtleTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy90cmFucy5jIGIvZnMvaGZzL3RyYW5zLmMKaW5kZXggZTY3M2E4OC4uYjFjZTRjNyAxMDA2NDQKLS0tIGEvZnMvaGZzL3RyYW5zLmMKKysrIGIvZnMvaGZzL3RyYW5zLmMKQEAgLTQwLDYgKzQwLDggQEAKIAogCXNyYyA9IGluLT5uYW1lOwogCXNyY2xlbiA9IGluLT5sZW47CisJaWYgKHNyY2xlbiA+IEhGU19OQU1FTEVOKQorCQlzcmNsZW4gPSBIRlNfTkFNRUxFTjsKIAlkc3QgPSBvdXQ7CiAJZHN0bGVuID0gSEZTX01BWF9OQU1FTEVOOwogCWlmIChubHNfaW8pIHsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDI1YjI0NDMuLjQ1MzZjZDMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZGlyLmMKKysrIGIvZnMvaGZzcGx1cy9kaXIuYwpAQCAtNDE1LDcgKzQxNSw3IEBACiAJZ290byBvdXQ7CiAKIG91dF9lcnI6Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiBvdXQ6CkBAIC00NDAsNyArNDQwLDcgQEAKIAogCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CiAJaWYgKHJlcykgewotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggNGNjMWUzYS4uNDBlMTQxMyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKGlub2RlLCAxKTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCiAJaGlwID0gSEZTUExVU19JKGlub2RlKTsKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsICZlbnRyeSwgZmQtPmVudHJ5b2Zmc2V0LAogCQkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlcikpOwogCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMsIDEpOwotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMSk7CiAJCWlub2RlLT5pX3NpemUgPSAyICsgYmUzMl90b19jcHUoZm9sZGVyLT52YWxlbmNlKTsKIAkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZvbGRlci0+YWNjZXNzX2RhdGUpOwogCQlpbm9kZS0+aV9tdGltZSA9IGhmc3BfbXQydXQoZm9sZGVyLT5jb250ZW50X21vZF9kYXRlKTsKQEAgLTUzMiwxMSArNTMyLDExIEBACiAJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8KIAkJCQkJJmZpbGUtPnJzcmNfZm9yayA6ICZmaWxlLT5kYXRhX2ZvcmspOwogCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zLCAwKTsKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJaWYgKGZpbGUtPnBlcm1pc3Npb25zLmRldikKLQkJCQlpbm9kZS0+aV9ubGluayA9Ci0JCQkJCWJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldik7CisJCQkJc2V0X25saW5rKGlub2RlLAorCQkJCQkgIGJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldikpOwogCQkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AgPSAmaGZzcGx1c19maWxlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCmluZGV4IDBkMjJhZmQuLjJmNzJkYTUgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC01NDEsNyArNTQxLDcgQEAKIAogCWluby0+aV9pbm8gPSBzdC5pbm87CiAJaW5vLT5pX21vZGUgPSBzdC5tb2RlOwotCWluby0+aV9ubGluayA9IHN0Lm5saW5rOworCXNldF9ubGluayhpbm8sIHN0Lm5saW5rKTsKIAlpbm8tPmlfdWlkID0gc3QudWlkOwogCWluby0+aV9naWQgPSBzdC5naWQ7CiAJaW5vLT5pX2F0aW1lID0gc3QuYXRpbWU7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfdXNlci5jCmluZGV4IGQ1MWE5ODM4Li5kZDdiYzM4IDEwMDY0NAotLS0gYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYworKysgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPHN5cy92ZnMuaD4KICNpbmNsdWRlICJob3N0ZnMuaCIKICNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlIDx1dGltZS5oPgogCiBzdGF0aWMgdm9pZCBzdGF0NjRfdG9faG9zdGZzKGNvbnN0IHN0cnVjdCBzdGF0NjQgKmJ1Ziwgc3RydWN0IGhvc3Rmc19zdGF0ICpwKQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKaW5kZXggOTZhOGVkOS4uMmZhMDA4OSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kaXIuYworKysgYi9mcy9ocGZzL2Rpci5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJCXJlc3VsdC0+aV9tb2RlICY9IH4wMTExOwogCQkJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOwogCQkJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOwotCQkJcmVzdWx0LT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayhyZXN1bHQsIDEpOwogCQl9CiAJCXVubG9ja19uZXdfaW5vZGUocmVzdWx0KTsKIAl9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2hwZnNfZm4uaCBiL2ZzL2hwZnMvaHBmc19mbi5oCmluZGV4IDMzMWI1ZTIuLmRlOTQ2MTcgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvaHBmc19mbi5oCisrKyBiL2ZzL2hwZnMvaHBmc19mbi5oCkBAIC0zMTEsOCArMzExLDggQEAKIAogLyogc3VwZXIuYyAqLwogCi12b2lkIGhwZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgLi4uKQotCV9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworX19wcmludGYoMiwgMykKK3ZvaWQgaHBmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IGhwZnNfc3RvcF9jeWNsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIGludCAqLCBjaGFyICopOwogdW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvaW5vZGUuYyBiL2ZzL2hwZnMvaW5vZGUuYwppbmRleCAzMzhjZDgzLi4zYjJjZWMyIDEwMDY0NAotLS0gYS9mcy9ocGZzL2lub2RlLmMKKysrIGIvZnMvaHBmcy9pbm9kZS5jCkBAIC01Myw3ICs1Myw3IEBACiAJCWktPmlfbW9kZSAmPSB+MDExMTsKIAkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKIAkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKLQkJaS0+aV9ubGluayA9IDA7Ki8KKwkJY2xlYXJfbmxpbmsoaSk7Ki8KIAkJbWFrZV9iYWRfaW5vZGUoaSk7CiAJCXJldHVybjsKIAl9CkBAIC03Nyw3ICs3Nyw3IEBACiAJCQlpLT5pX21vZGUgPSBTX0lGTE5LIHwgMDc3NzsKIAkJCWktPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpLT5pX2RhdGEuYV9vcHMgPSAmaHBmc19zeW1saW5rX2FvcHM7Ci0JCQlpLT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayhpLCAxKTsKIAkJCWktPmlfc2l6ZSA9IGVhX3NpemU7CiAJCQlpLT5pX2Jsb2NrcyA9IDE7CiAJCQlicmVsc2UoYmgpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCQl9CiAJCQlpZiAoU19JU0JMSyhtb2RlKSB8fCBTX0lTQ0hSKG1vZGUpIHx8IFNfSVNGSUZPKG1vZGUpIHx8IFNfSVNTT0NLKG1vZGUpKSB7CiAJCQkJYnJlbHNlKGJoKTsKLQkJCQlpLT5pX25saW5rID0gMTsKKwkJCQlzZXRfbmxpbmsoaSwgMSk7CiAJCQkJaS0+aV9zaXplID0gMDsKIAkJCQlpLT5pX2Jsb2NrcyA9IDE7CiAJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIG1vZGUsCkBAIC0xMjUsMTMgKzEyNSwxMyBAQAogCQlocGZzX2NvdW50X2Rub2RlcyhpLT5pX3NiLCBocGZzX2lub2RlLT5pX2RubywgJm5fZG5vZGVzLCAmbl9zdWJkaXJzLCBOVUxMKTsKIAkJaS0+aV9ibG9ja3MgPSA0ICogbl9kbm9kZXM7CiAJCWktPmlfc2l6ZSA9IDIwNDggKiBuX2Rub2RlczsKLQkJaS0+aV9ubGluayA9IDIgKyBuX3N1YmRpcnM7CisJCXNldF9ubGluayhpLCAyICsgbl9zdWJkaXJzKTsKIAl9IGVsc2UgewogCQlpLT5pX21vZGUgfD0gU19JRlJFRzsKIAkJaWYgKCFocGZzX2lub2RlLT5pX2VhX21vZGUpIGktPmlfbW9kZSAmPSB+MDExMTsKIAkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKIAkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKLQkJaS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpLCAxKTsKIAkJaS0+aV9zaXplID0gbGUzMl90b19jcHUoZm5vZGUtPmZpbGVfc2l6ZSk7CiAJCWktPmlfYmxvY2tzID0gKChpLT5pX3NpemUgKyA1MTEpID4+IDkpICsgMTsKIAkJaS0+aV9kYXRhLmFfb3BzID0gJmhwZnNfYW9wczsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvbmFtZWkuYyBiL2ZzL2hwZnMvbmFtZWkuYwppbmRleCAyZGY2OWUyLi5lYTkxZmNiIDEwMDY0NAotLS0gYS9mcy9ocGZzL25hbWVpLmMKKysrIGIvZnMvaHBmcy9uYW1laS5jCkBAIC01Niw3ICs1Niw3IEBACiAJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2Rpcl9vcHM7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDQ7CiAJcmVzdWx0LT5pX3NpemUgPSAyMDQ4OwotCXJlc3VsdC0+aV9ubGluayA9IDI7CisJc2V0X25saW5rKHJlc3VsdCwgMik7CiAJaWYgKGRlZS5yZWFkX29ubHkpCiAJCXJlc3VsdC0+aV9tb2RlICY9IH4wMjIyOwogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlyZXN1bHQtPmlfbW9kZSAmPSB+MDExMTsKIAlyZXN1bHQtPmlfb3AgPSAmaHBmc19maWxlX2lvcHM7CiAJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOwotCXJlc3VsdC0+aV9ubGluayA9IDE7CisJc2V0X25saW5rKHJlc3VsdCwgMSk7CiAJaHBmc19pKHJlc3VsdCktPmlfcGFyZW50X2RpciA9IGRpci0+aV9pbm87CiAJcmVzdWx0LT5pX2N0aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSByZXN1bHQtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgbGUzMl90b19jcHUoZGVlLmNyZWF0aW9uX2RhdGUpKTsKIAlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlocGZzX2kocmVzdWx0KS0+aV9lYV9zaXplID0gMDsKIAlyZXN1bHQtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCXJlc3VsdC0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JcmVzdWx0LT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsocmVzdWx0LCAxKTsKIAlyZXN1bHQtPmlfc2l6ZSA9IDA7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDE7CiAJaW5pdF9zcGVjaWFsX2lub2RlKHJlc3VsdCwgbW9kZSwgcmRldik7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlyZXN1bHQtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCXJlc3VsdC0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7CiAJcmVzdWx0LT5pX2Jsb2NrcyA9IDE7Ci0JcmVzdWx0LT5pX25saW5rID0gMTsKKwlzZXRfbmxpbmsocmVzdWx0LCAxKTsKIAlyZXN1bHQtPmlfc2l6ZSA9IHN0cmxlbihzeW1saW5rKTsKIAlyZXN1bHQtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19zeW1saW5rX2FvcHM7CmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmcy5jIGIvZnMvaHBwZnMvaHBwZnMuYwppbmRleCA5NzBlYTk4Li5mNTkwYjExIDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmcy5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzLmMKQEAgLTcwMiw3ICs3MDIsNyBAQAogCWlub2RlLT5pX2N0aW1lID0gcHJvY19pbm8tPmlfY3RpbWU7CiAJaW5vZGUtPmlfaW5vID0gcHJvY19pbm8tPmlfaW5vOwogCWlub2RlLT5pX21vZGUgPSBwcm9jX2luby0+aV9tb2RlOwotCWlub2RlLT5pX25saW5rID0gcHJvY19pbm8tPmlfbmxpbms7CisJc2V0X25saW5rKGlub2RlLCBwcm9jX2luby0+aV9ubGluayk7CiAJaW5vZGUtPmlfc2l6ZSA9IHByb2NfaW5vLT5pX3NpemU7CiAJaW5vZGUtPmlfYmxvY2tzID0gcHJvY19pbm8tPmlfYmxvY2tzOwogCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGVjODg5NTMuLjBiZTVhNzggMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC05NzAsNyArOTcwLDcgQEAKIAogCWRfaW5zdGFudGlhdGUocGF0aC5kZW50cnksIGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gc2l6ZTsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCiAJZXJyb3IgPSAtRU5GSUxFOwogCWZpbGUgPSBhbGxvY19maWxlKCZwYXRoLCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBlYzc5MjQ2Li5lZTRlNjZiIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCWF0b21pY19zZXQoJmlub2RlLT5pX2NvdW50LCAxKTsKIAlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOwogCWlub2RlLT5pX2ZvcCA9ICZlbXB0eV9mb3BzOwotCWlub2RlLT5pX25saW5rID0gMTsKKwlpbm9kZS0+X19pX25saW5rID0gMTsKIAlpbm9kZS0+aV9vcGZsYWdzID0gMDsKIAlpbm9kZS0+aV91aWQgPSAwOwogCWlub2RlLT5pX2dpZCA9IDA7CkBAIC02MzQsNyArNjM0LDcgQEAKIAkJICogaW5vZGUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3Qgc28gd2UgZG9uJ3Qgc3BpbiBvbiBpdC4KIAkJICovCiAJCWlmICghc3Bpbl90cnlsb2NrKCZpbm9kZS0+aV9sb2NrKSkgewotCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9scnUsICZzYi0+c19pbm9kZV9scnUpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmlub2RlLT5pX2xydSwgJnNiLT5zX2lub2RlX2xydSk7CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy9pb3ByaW8uYyBiL2ZzL2lvcHJpby5jCmluZGV4IDdkYTJhMDYuLmY3OWRhYjggMTAwNjQ0Ci0tLSBhL2ZzL2lvcHJpby5jCisrKyBiL2ZzL2lvcHJpby5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3ByaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCBhNWQwMzY3Li5mOTUwMDU5IDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAKICNpbmNsdWRlICJpc29mcy5oIgogI2luY2x1ZGUgInppc29mcy5oIgpAQCAtMTE0OCw3ICsxMTQ5LDEzIEBACiAKIHN0YXRpYyBpbnQgaXNvZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLGlzb2ZzX2dldF9ibG9jayk7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlKHBhZ2UsIGlzb2ZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaXNvZnNfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgaXNvZnNfZ2V0X2Jsb2NrKTsKIH0KIAogc3RhdGljIHNlY3Rvcl90IF9pc29mc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKQEAgLTExNTgsNiArMTE2NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGlzb2ZzX2FvcHMgPSB7CiAJLnJlYWRwYWdlID0gaXNvZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IGlzb2ZzX3JlYWRwYWdlcywKIAkuYm1hcCA9IF9pc29mc19ibWFwCiB9OwogCkBAIC0xMzE5LDcgKzEzMjcsNyBAQAogCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBzYmktPnNfZG1vZGU7CiAJCWVsc2UKIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087Ci0JCWlub2RlLT5pX25saW5rID0gMTsJLyoKKwkJc2V0X25saW5rKGlub2RlLCAxKTsJLyoKIAkJCQkJICogU2V0IHRvIDEuICBXZSBrbm93IHRoZXJlIGFyZSAyLCBidXQKIAkJCQkJICogdGhlIGZpbmQgdXRpbGl0eSB0cmllcyB0byBvcHRpbWl6ZQogCQkJCQkgKiBpZiBpdCBpcyAyLCBhbmQgaXQgc2NyZXdzIHVwLiAgSXQgaXMKQEAgLTEzMzcsNyArMTM0NSw3IEBACiAJCQkgKi8KIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVhVR087CiAJCX0KLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCX0KIAlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOwogCWlub2RlLT5pX2dpZCA9IHNiaS0+c19naWQ7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9yb2NrLmMgYi9mcy9pc29mcy9yb2NrLmMKaW5kZXggMWZiYzdkZS4uNzBlNzlkMCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvcm9jay5jCisrKyBiL2ZzL2lzb2ZzL3JvY2suYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBTSUcoJ1AnLCAnWCcpOgogCQkJaW5vZGUtPmlfbW9kZSA9IGlzb251bV83MzMocnItPnUuUFgubW9kZSk7Ci0JCQlpbm9kZS0+aV9ubGluayA9IGlzb251bV83MzMocnItPnUuUFgubl9saW5rcyk7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGlzb251bV83MzMocnItPnUuUFgubl9saW5rcykpOwogCQkJaW5vZGUtPmlfdWlkID0gaXNvbnVtXzczMyhyci0+dS5QWC51aWQpOwogCQkJaW5vZGUtPmlfZ2lkID0gaXNvbnVtXzczMyhyci0+dS5QWC5naWQpOwogCQkJYnJlYWs7CkBAIC00OTYsNyArNDk2LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlub2RlLT5pX21vZGUgPSByZWxvYy0+aV9tb2RlOwotCQkJaW5vZGUtPmlfbmxpbmsgPSByZWxvYy0+aV9ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgcmVsb2MtPmlfbmxpbmspOwogCQkJaW5vZGUtPmlfdWlkID0gcmVsb2MtPmlfdWlkOwogCQkJaW5vZGUtPmlfZ2lkID0gcmVsb2MtPmlfZ2lkOwogCQkJaW5vZGUtPmlfcmRldiA9IHJlbG9jLT5pX3JkZXY7CmRpZmYgLS1naXQgYS9mcy9qYmQvam91cm5hbC5jIGIvZnMvamJkL2pvdXJuYWwuYwppbmRleCA5ZmUwNjFmLi5mZWE4ZGQ2IDEwMDY0NAotLS0gYS9mcy9qYmQvam91cm5hbC5jCisrKyBiL2ZzL2piZC9qb3VybmFsLmMKQEAgLTExMzUsNiArMTEzNSwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpID09IDAgfHwKKwkgICAgYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpID49IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJKQkQ6IEludmFsaWQgc3RhcnQgYmxvY2sgb2Ygam91cm5hbDogJXVcbiIsCisJCQliZTMyX3RvX2NwdShzYi0+c19maXJzdCkpOworCQlnb3RvIG91dDsKKwl9CisKIAlyZXR1cm4gMDsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggZWVmNjk3OS4uNjhkNzA0ZCAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKIAogCXRyYWNlX2piZDJfc3RhcnRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7Ci0JamJkX2RlYnVnKDEsICJKQkQ6IHN0YXJ0aW5nIGNvbW1pdCBvZiB0cmFuc2FjdGlvbiAlZFxuIiwKKwlqYmRfZGVidWcoMSwgIkpCRDI6IHN0YXJ0aW5nIGNvbW1pdCBvZiB0cmFuc2FjdGlvbiAlZFxuIiwKIAkJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQpOwogCiAJd3JpdGVfbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKQEAgLTQyNyw3ICs0MjcsNyBAQAogCV9famJkMl9qb3VybmFsX2NsZWFuX2NoZWNrcG9pbnRfbGlzdChqb3VybmFsKTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCi0JamJkX2RlYnVnICgzLCAiSkJEOiBjb21taXQgcGhhc2UgMVxuIik7CisJamJkX2RlYnVnKDMsICJKQkQyOiBjb21taXQgcGhhc2UgMVxuIik7CiAKIAkvKgogCSAqIFN3aXRjaCB0byBhIG5ldyByZXZva2UgdGFibGUuCkBAIC00NDcsNyArNDQ3LDcgQEAKIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKIAl3cml0ZV91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKLQlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAyXG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSAyXG4iKTsKIAogCS8qCiAJICogTm93IHN0YXJ0IGZsdXNoaW5nIHRoaW5ncyB0byBkaXNrLCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCQkJCQkgIFdSSVRFX1NZTkMpOwogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKLQlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCWpiZF9kZWJ1ZygzLCAiSkJEMjogY29tbWl0IHBoYXNlIDJcbiIpOwogCiAJLyoKIAkgKiBXYXkgdG8gZ286IHdlIGhhdmUgbm93IHdyaXR0ZW4gb3V0IGFsbCBvZiB0aGUgZGF0YSBmb3IgYQpAQCAtNTIyLDcgKzUyMiw3IEBACiAKIAkJCUpfQVNTRVJUIChidWZzID09IDApOwogCi0JCQlqYmRfZGVidWcoNCwgIkpCRDogZ2V0IGRlc2NyaXB0b3JcbiIpOworCQkJamJkX2RlYnVnKDQsICJKQkQyOiBnZXQgZGVzY3JpcHRvclxuIik7CiAKIAkJCWRlc2NyaXB0b3IgPSBqYmQyX2pvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOwogCQkJaWYgKCFkZXNjcmlwdG9yKSB7CkBAIC01MzEsNyArNTMxLDcgQEAKIAkJCX0KIAogCQkJYmggPSBqaDJiaChkZXNjcmlwdG9yKTsKLQkJCWpiZF9kZWJ1Zyg0LCAiSkJEOiBnb3QgYnVmZmVyICVsbHUgKCVwKVxuIiwKKwkJCWpiZF9kZWJ1Zyg0LCAiSkJEMjogZ290IGJ1ZmZlciAlbGx1ICglcClcbiIsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBiaC0+Yl9kYXRhKTsKIAkJCWhlYWRlciA9IChqb3VybmFsX2hlYWRlcl90ICopJmJoLT5iX2RhdGFbMF07CiAJCQloZWFkZXItPmhfbWFnaWMgICAgID0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpOwpAQCAtNjI1LDcgKzYyNSw3IEBACiAJCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycyA9PSBOVUxMIHx8CiAJCSAgICBzcGFjZV9sZWZ0IDwgdGFnX2J5dGVzICsgMTYpIHsKIAotCQkJamJkX2RlYnVnKDQsICJKQkQ6IFN1Ym1pdCAlZCBJT3NcbiIsIGJ1ZnMpOworCQkJamJkX2RlYnVnKDQsICJKQkQyOiBTdWJtaXQgJWQgSU9zXG4iLCBidWZzKTsKIAogCQkJLyogV3JpdGUgYW4gZW5kLW9mLWRlc2NyaXB0b3IgbWFya2VyIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0dGluZyB0aGUgSU9zLiAgInRhZyIgc3RpbGwgcG9pbnRzIHRvCkBAIC03MDcsNyArNzA3LDcgQEAKIAkgICBzbyB3ZSBpbmN1ciBsZXNzIHNjaGVkdWxpbmcgbG9hZC4KIAkqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAzXG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSAzXG4iKTsKIAogCS8qCiAJICogYWtwbTogdGhlc2UgYXJlIEJKX0lPLCBhbmQgal9saXN0X2xvY2sgaXMgbm90IG5lZWRlZC4KQEAgLTc3MSw3ICs3NzEsNyBAQAogCiAJSl9BU1NFUlQgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdCA9PSBOVUxMKTsKIAotCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgNFxuIik7CisJamJkX2RlYnVnKDMsICJKQkQyOiBjb21taXQgcGhhc2UgNFxuIik7CiAKIAkvKiBIZXJlIHdlIHdhaXQgZm9yIHRoZSByZXZva2UgcmVjb3JkIGFuZCBkZXNjcmlwdG9yIHJlY29yZCBidWZmZXJzICovCiAgd2FpdF9mb3JfY3RsYnVmOgpAQCAtODAxLDcgKzgwMSw3IEBACiAJaWYgKGVycikKIAkJamJkMl9qb3VybmFsX2Fib3J0KGpvdXJuYWwsIGVycik7CiAKLQlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDVcbiIpOworCWpiZF9kZWJ1ZygzLCAiSkJEMjogY29tbWl0IHBoYXNlIDVcbiIpOwogCXdyaXRlX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfQ09NTUlUX0RGTFVTSCk7CiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9DT01NSVRfSkZMVVNIOwpAQCAtODMwLDcgKzgzMCw3IEBACiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGNhbiBiZSByZW1vdmVkIGZyb20gYW55IGNoZWNrcG9pbnQgbGlzdCBpdCB3YXMgb24KICAgICAgICAgICAgYmVmb3JlLiAqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA2XG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSA2XG4iKTsKIAogCUpfQVNTRVJUKGxpc3RfZW1wdHkoJmNvbW1pdF90cmFuc2FjdGlvbi0+dF9pbm9kZV9saXN0KSk7CiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CkBAIC05NjQsNyArOTY0LDcgQEAKIAogCS8qIERvbmUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uISAqLwogCi0JamJkX2RlYnVnKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSA3XG4iKTsKKwlqYmRfZGVidWcoMywgIkpCRDI6IGNvbW1pdCBwaGFzZSA3XG4iKTsKIAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9PSBUX0NPTU1JVF9KRkxVU0gpOwogCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCQlqb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjayhqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOwogCiAJdHJhY2VfamJkMl9lbmRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7Ci0JamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKKwlqYmRfZGVidWcoMSwgIkpCRDI6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKIAkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKIAlpZiAodG9fZnJlZSkKIAkJa2ZyZWUoY29tbWl0X3RyYW5zYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggZjI0ZGYxMy4uMGZhMDEyMyAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCQkgKi8KIAogCQlqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0ID0gdGFyZ2V0OwotCQlqYmRfZGVidWcoMSwgIkpCRDogcmVxdWVzdGluZyBjb21taXQgJWQvJWRcbiIsCisJCWpiZF9kZWJ1ZygxLCAiSkJEMjogcmVxdWVzdGluZyBjb21taXQgJWQvJWRcbiIsCiAJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QsCiAJCQkgIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlKTsKIAkJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2NvbW1pdCk7CkBAIC01MDAsNyArNTAwLDcgQEAKIAkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgcHJlc2VydmUKIAkJICAgdGhlIGV2aWRlbmNlIGJlZm9yZSBram91cm5hbGQgZ29lcyBpbnRvIGEgbG9vcCBhbmQKIAkJICAgaW5jcmVtZW50cyBqX2NvbW1pdF9zZXF1ZW5jZSBiZXlvbmQgYWxsIHJlY29nbml0aW9uLiAqLwotCQlXQVJOX09OQ0UoMSwgImpiZDogYmFkIGxvZ19zdGFydF9jb21taXQ6ICV1ICV1ICV1ICV1XG4iLAorCQlXQVJOX09OQ0UoMSwgIkpCRDI6IGJhZCBsb2dfc3RhcnRfY29tbWl0OiAldSAldSAldSAldVxuIiwKIAkJCSAgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwKIAkJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsCiAJCQkgIHRhcmdldCwgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID8gCkBAIC02NDUsNyArNjQ1LDcgQEAKIAl9CiAjZW5kaWYKIAl3aGlsZSAodGlkX2d0KHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpKSB7Ci0JCWpiZF9kZWJ1ZygxLCAiSkJEOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKKwkJamJkX2RlYnVnKDEsICJKQkQyOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKIAkJCQkgIHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOwogCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKIAkJcmVhZF91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCWZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOwogCWxhc3QgPSBiZTMyX3RvX2NwdShzYi0+c19tYXhsZW4pOwogCWlmIChmaXJzdCArIEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTID4gbGFzdCArIDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IEpvdXJuYWwgdG9vIHNob3J0IChibG9ja3MgJWxsdS0lbGx1KS5cbiIsCisJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogSm91cm5hbCB0b28gc2hvcnQgKGJsb2NrcyAlbGx1LSVsbHUpLlxuIiwKIAkJICAgICAgIGZpcnN0LCBsYXN0KTsKIAkJam91cm5hbF9mYWlsX3N1cGVyYmxvY2soam91cm5hbCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAkgKi8KIAlpZiAoc2ItPnNfc3RhcnQgPT0gMCAmJiBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UgPT0KIAkJCQlqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlKSB7Ci0JCWpiZF9kZWJ1ZygxLCJKQkQ6IFNraXBwaW5nIHN1cGVyYmxvY2sgdXBkYXRlIG9uIHJlY292ZXJlZCBzYiAiCisJCWpiZF9kZWJ1ZygxLCAiSkJEMjogU2tpcHBpbmcgc3VwZXJibG9jayB1cGRhdGUgb24gcmVjb3ZlcmVkIHNiICIKIAkJCSIoc3RhcnQgJWxkLCBzZXEgJWQsIGVycm5vICVkKVxuIiwKIAkJCWpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLAogCQkJam91cm5hbC0+al9lcnJubyk7CkBAIC0xMTYzLDcgKzExNjMsNyBAQAogCX0KIAogCXJlYWRfbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKLQlqYmRfZGVidWcoMSwiSkJEOiB1cGRhdGluZyBzdXBlcmJsb2NrIChzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCWpiZF9kZWJ1ZygxLCAiSkJEMjogdXBkYXRpbmcgc3VwZXJibG9jayAoc3RhcnQgJWxkLCBzZXEgJWQsIGVycm5vICVkKVxuIiwKIAkJICBqb3VybmFsLT5qX3RhaWwsIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSwgam91cm5hbC0+al9lcnJubyk7CiAKIAlzYi0+c19zZXF1ZW5jZSA9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSk7CkBAIC0xMjE2LDggKzEyMTYsOCBAQAogCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOwogCQl3YWl0X29uX2J1ZmZlcihiaCk7CiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQkJcHJpbnRrIChLRVJOX0VSUgotCQkJCSJKQkQ6IElPIGVycm9yIHJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJKQkQyOiBJTyBlcnJvciByZWFkaW5nIGpvdXJuYWwgc3VwZXJibG9ja1xuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTEyMjgsNyArMTIyOCw3IEBACiAKIAlpZiAoc2ItPnNfaGVhZGVyLmhfbWFnaWMgIT0gY3B1X3RvX2JlMzIoSkJEMl9NQUdJQ19OVU1CRVIpIHx8CiAJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAhPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJKQkQyOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEyNDAsMTQgKzEyNDAsMjIgQEAKIAkJam91cm5hbC0+al9mb3JtYXRfdmVyc2lvbiA9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkpCRDogdW5yZWNvZ25pc2VkIHN1cGVyYmxvY2sgZm9ybWF0IElEXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogdW5yZWNvZ25pc2VkIHN1cGVyYmxvY2sgZm9ybWF0IElEXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbikgPCBqb3VybmFsLT5qX21heGxlbikKIAkJam91cm5hbC0+al9tYXhsZW4gPSBiZTMyX3RvX2NwdShzYi0+c19tYXhsZW4pOwogCWVsc2UgaWYgKGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbikgPiBqb3VybmFsLT5qX21heGxlbikgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiSkJEOiBqb3VybmFsIGZpbGUgdG9vIHNob3J0XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogam91cm5hbCBmaWxlIHRvbyBzaG9ydFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChiZTMyX3RvX2NwdShzYi0+c19maXJzdCkgPT0gMCB8fAorCSAgICBiZTMyX3RvX2NwdShzYi0+c19maXJzdCkgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIkpCRDI6IEludmFsaWQgc3RhcnQgYmxvY2sgb2Ygam91cm5hbDogJXVcbiIsCisJCQliZTMyX3RvX2NwdShzYi0+c19maXJzdCkpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEzMTAsOCArMTMxOCw4IEBACiAJCSAgICAgfmNwdV90b19iZTMyKEpCRDJfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpKSB8fAogCQkgICAgKHNiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJgogCQkgICAgIH5jcHVfdG9fYmUzMihKQkQyX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTKSkpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCi0JCQkJIkpCRDogVW5yZWNvZ25pc2VkIGZlYXR1cmVzIG9uIGpvdXJuYWxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJKQkQyOiBVbnJlY29nbmlzZWQgZmVhdHVyZXMgb24gam91cm5hbFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTEzNDYsNyArMTM1NCw3IEBACiAJcmV0dXJuIDA7CiAKIHJlY292ZXJ5X2Vycm9yOgotCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IHJlY292ZXJ5IGZhaWxlZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogcmVjb3ZlcnkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTU3Nyw3ICsxNTg1LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJcHJpbnRrKEtFUk5fV0FSTklORwotCQkiSkJEOiBDb252ZXJ0aW5nIHN1cGVyYmxvY2sgZnJvbSB2ZXJzaW9uIDEgdG8gMi5cbiIpOworCQkiSkJEMjogQ29udmVydGluZyBzdXBlcmJsb2NrIGZyb20gdmVyc2lvbiAxIHRvIDIuXG4iKTsKIAogCS8qIFByZS1pbml0aWFsaXNlIG5ldyBmaWVsZHMgdG8gemVybyAqLwogCW9mZnNldCA9ICgoY2hhciAqKSAmKHNiLT5zX2ZlYXR1cmVfY29tcGF0KSkgLSAoKGNoYXIgKikgc2IpOwpAQCAtMTY5NCw3ICsxNzAyLDcgQEAKIAlpZiAoIWpvdXJuYWwtPmpfdGFpbCkKIAkJZ290byBub19yZWNvdmVyeTsKIAotCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6ICVzIHJlY292ZXJ5IGluZm9ybWF0aW9uIG9uIGpvdXJuYWxcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEMjogJXMgcmVjb3ZlcnkgaW5mb3JtYXRpb24gb24gam91cm5hbFxuIiwKIAkJd3JpdGUgPyAiQ2xlYXJpbmciIDogIklnbm9yaW5nIik7CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfc2tpcF9yZWNvdmVyeShqb3VybmFsKTsKQEAgLTIwMjAsNyArMjAyOCw3IEBACiAJcmV0dmFsID0gMDsKIAlpZiAoIWpiZDJfam91cm5hbF9oZWFkX2NhY2hlKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDI6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIzODMsNyArMjM5MSw3IEBACiAjaWZkZWYgQ09ORklHX0pCRDJfREVCVUcKIAlpbnQgbiA9IGF0b21pY19yZWFkKCZucl9qb3VybmFsX2hlYWRzKTsKIAlpZiAobikKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDogbGVha2VkICVkIGpvdXJuYWxfaGVhZHMhXG4iLCBuKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDI6IGxlYWtlZCAlZCBqb3VybmFsX2hlYWRzIVxuIiwgbik7CiAjZW5kaWYKIAlqYmQyX3JlbW92ZV9kZWJ1Z2ZzX2VudHJ5KCk7CiAJamJkMl9yZW1vdmVfamJkX3N0YXRzX3Byb2NfZW50cnkoKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmVjb3ZlcnkuYyBiL2ZzL2piZDIvcmVjb3ZlcnkuYwppbmRleCAxY2FkODY5Li5kYTZkN2JhIDEwMDY0NAotLS0gYS9mcy9qYmQyL3JlY292ZXJ5LmMKKysrIGIvZnMvamJkMi9yZWNvdmVyeS5jCkBAIC04OSw3ICs4OSw3IEBACiAJCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIG5leHQsICZibG9ja25yKTsKIAogCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQkJbmV4dCk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQpAQCAtMTM4LDE0ICsxMzgsMTQgQEAKIAkqYmhwID0gTlVMTDsKIAogCWlmIChvZmZzZXQgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCBvZmZzZXQsICZibG9ja25yKTsKIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiBiYWQgYmxvY2sgYXQgb2Zmc2V0ICV1XG4iLAorCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGJhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQlvZmZzZXQpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTE2Myw3ICsxNjMsNyBAQAogCX0KIAogCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IEZhaWxlZCB0byByZWFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQyOiBGYWlsZWQgdG8gcmVhZCBibG9jayBhdCBvZmZzZXQgJXVcbiIsCiAJCQlvZmZzZXQpOwogCQlicmVsc2UoYmgpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI1MSwxMCArMjUxLDEwIEBACiAJaWYgKCFlcnIpCiAJCWVyciA9IGRvX29uZV9wYXNzKGpvdXJuYWwsICZpbmZvLCBQQVNTX1JFUExBWSk7CiAKLQlqYmRfZGVidWcoMSwgIkpCRDogcmVjb3ZlcnksIGV4aXQgc3RhdHVzICVkLCAiCisJamJkX2RlYnVnKDEsICJKQkQyOiByZWNvdmVyeSwgZXhpdCBzdGF0dXMgJWQsICIKIAkJICAicmVjb3ZlcmVkIHRyYW5zYWN0aW9ucyAldSB0byAldVxuIiwKIAkJICBlcnIsIGluZm8uc3RhcnRfdHJhbnNhY3Rpb24sIGluZm8uZW5kX3RyYW5zYWN0aW9uKTsKLQlqYmRfZGVidWcoMSwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLAorCWpiZF9kZWJ1ZygxLCAiSkJEMjogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLAogCQkgIGluZm8ubnJfcmVwbGF5cywgaW5mby5ucl9yZXZva2VfaGl0cywgaW5mby5ucl9yZXZva2VzKTsKIAogCS8qIFJlc3RhcnQgdGhlIGxvZyBhdCB0aGUgbmV4dCB0cmFuc2FjdGlvbiBJRCwgdGh1cyBpbnZhbGlkYXRpbmcKQEAgLTI5MywxNCArMjkzLDE0IEBACiAJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CiAKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSkJEOiBlcnJvciAlZCBzY2FubmluZyBqb3VybmFsXG4iLCBlcnIpOworCQlwcmludGsoS0VSTl9FUlIgIkpCRDI6IGVycm9yICVkIHNjYW5uaW5nIGpvdXJuYWxcbiIsIGVycik7CiAJCSsram91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZTsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCiAJCWludCBkcm9wcGVkID0gaW5mby5lbmRfdHJhbnNhY3Rpb24gLSAKIAkJCWJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19zZXF1ZW5jZSk7CiAJCWpiZF9kZWJ1ZygxLAotCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAorCQkJICAiSkJEMjogaWdub3JpbmcgJWQgdHJhbnNhY3Rpb24lcyBmcm9tIHRoZSBqb3VybmFsLlxuIiwKIAkJCSAgZHJvcHBlZCwgKGRyb3BwZWQgPT0gMSkgPyAiIiA6ICJzIik7CiAjZW5kaWYKIAkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJd3JhcChqb3VybmFsLCAqbmV4dF9sb2dfYmxvY2spOwogCQllcnIgPSBqcmVhZCgmb2JoLCBqb3VybmFsLCBpb19ibG9jayk7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nIGJsb2NrICIKKwkJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyBibG9jayAiCiAJCQkJIiVsdSBpbiBsb2dcbiIsIGVyciwgaW9fYmxvY2spOwogCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7CkBAIC00MTEsNyArNDExLDcgQEAKIAkJICogZWl0aGVyIHRoZSBuZXh0IGRlc2NyaXB0b3IgYmxvY2sgb3IgdGhlIGZpbmFsIGNvbW1pdAogCQkgKiByZWNvcmQuICovCiAKLQkJamJkX2RlYnVnKDMsICJKQkQ6IGNoZWNraW5nIGJsb2NrICVsZFxuIiwgbmV4dF9sb2dfYmxvY2spOworCQlqYmRfZGVidWcoMywgIkpCRDI6IGNoZWNraW5nIGJsb2NrICVsZFxuIiwgbmV4dF9sb2dfYmxvY2spOwogCQllcnIgPSBqcmVhZCgmYmgsIGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZmFpbGVkOwpAQCAtNDkxLDggKzQ5MSw4IEBACiAJCQkJCS8qIFJlY292ZXIgd2hhdCB3ZSBjYW4sIGJ1dAogCQkJCQkgKiByZXBvcnQgZmFpbHVyZSBhdCB0aGUgZW5kLiAqLwogCQkJCQlzdWNjZXNzID0gZXJyOwotCQkJCQlwcmludGsgKEtFUk5fRVJSCi0JCQkJCQkiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nICIKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiSkJEMjogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyAiCiAJCQkJCQkiYmxvY2sgJWxkIGluIGxvZ1xuIiwKIAkJCQkJCWVyciwgaW9fYmxvY2spOwogCQkJCX0gZWxzZSB7CkBAIC01MjAsNyArNTIwLDcgQEAKIAkJCQkJCQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CiAJCQkJCWlmIChuYmggPT0gTlVMTCkgewogCQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCQkgICAgICAgIkpCRDogT3V0IG9mIG1lbW9yeSAiCisJCQkJCQkgICAgICAgIkpCRDI6IE91dCBvZiBtZW1vcnkgIgogCQkJCQkJICAgICAgICJkdXJpbmcgcmVjb3ZlcnkuXG4iKTsKIAkJCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJCQlicmVsc2UoYmgpOwpAQCAtNjg5LDcgKzY4OSw3IEBACiAJCS8qIEl0J3MgcmVhbGx5IGJhZCBuZXdzIGlmIGRpZmZlcmVudCBwYXNzZXMgZW5kIHVwIGF0CiAJCSAqIGRpZmZlcmVudCBwbGFjZXMgKGJ1dCBwb3NzaWJsZSBkdWUgdG8gSU8gZXJyb3JzKS4gKi8KIAkJaWYgKGluZm8tPmVuZF90cmFuc2FjdGlvbiAhPSBuZXh0X2NvbW1pdF9JRCkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiByZWNvdmVyeSBwYXNzICVkIGVuZGVkIGF0ICIKKwkJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogcmVjb3ZlcnkgcGFzcyAlZCBlbmRlZCBhdCAiCiAJCQkJInRyYW5zYWN0aW9uICV1LCBleHBlY3RlZCAldVxuIiwKIAkJCQlwYXNzLCBuZXh0X2NvbW1pdF9JRCwgaW5mby0+ZW5kX3RyYW5zYWN0aW9uKTsKIAkJCWlmICghc3VjY2VzcykKZGlmZiAtLWdpdCBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwppbmRleCAyZDcxMDk0Li5hMGU0MWE0IDEwMDY0NAotLS0gYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgdm9pZCBfX2piZDJfam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwpAQCAtMTE1LDcgKzExNiw3IEBACiAgKi8KIAogc3RhdGljIGludCBzdGFydF90aGlzX2hhbmRsZShqb3VybmFsX3QgKmpvdXJuYWwsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgIGludCBnZnBfbWFzaykKKwkJCSAgICAgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJdHJhbnNhY3Rpb25fdAkqdHJhbnNhY3Rpb24sICpuZXdfdHJhbnNhY3Rpb24gPSBOVUxMOwogCXRpZF90CQl0aWQ7CkBAIC0xMjQsNyArMTI1LDcgQEAKIAl1bnNpZ25lZCBsb25nIHRzID0gamlmZmllczsKIAogCWlmIChuYmxvY2tzID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgewotCQlwcmludGsoS0VSTl9FUlIgIkpCRDogJXMgd2FudHMgdG9vIG1hbnkgY3JlZGl0cyAoJWQgPiAlZClcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiSkJEMjogJXMgd2FudHMgdG9vIG1hbnkgY3JlZGl0cyAoJWQgPiAlZClcbiIsCiAJCSAgICAgICBjdXJyZW50LT5jb21tLCBuYmxvY2tzLAogCQkgICAgICAgam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycyk7CiAJCXJldHVybiAtRU5PU1BDOwpAQCAtMzIwLDcgKzMyMSw3IEBACiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGhhbmRsZSwgb3IgYW4gRVJSX1BUUigpIHZhbHVlCiAgKiBvbiBmYWlsdXJlLgogICovCi1oYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBuYmxvY2tzLCBpbnQgZ2ZwX21hc2spCitoYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBuYmxvY2tzLCBnZnBfdCBnZnBfbWFzaykKIHsKIAloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCWludCBlcnI7CkBAIC00NDMsNyArNDQ0LDcgQEAKICAqIHRyYW5zYWN0aW9uIGNhcGFiYWJsZSBvZiBndWFyYW50ZWVpbmcgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKICAqIGNyZWRpdHMuCiAgKi8KLWludCBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzaykKK2ludCBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MsIGdmcF90IGdmcF9tYXNrKQogewogCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOwogCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CkBAIC01NjMsNyArNTY0LDcgQEAKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICAgICJKQkQ6IFNwb3R0ZWQgZGlydHkgbWV0YWRhdGEgYnVmZmVyIChkZXYgPSAlcywgYmxvY2tuciA9ICVsbHUpLiAiCisJICAgICAgICJKQkQyOiBTcG90dGVkIGRpcnR5IG1ldGFkYXRhIGJ1ZmZlciAoZGV2ID0gJXMsIGJsb2NrbnIgPSAlbGx1KS4gIgogCSAgICAgICAiVGhlcmUncyBhIHJpc2sgb2YgZmlsZXN5c3RlbSBjb3JydXB0aW9uIGluIGNhc2Ugb2Ygc3lzdGVtICIKIAkgICAgICAgImNyYXNoLlxuIiwKIAkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYiksICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CkBAIC0xMDQ5LDYgKzEwNTAsMTAgQEAKICAqIG1hcmsgZGlydHkgbWV0YWRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgam91cm5hbGVkIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQKICAqIHRyYW5zYWN0aW9uLgogICoKKyAqIFRoZSBidWZmZXIgbXVzdCBoYXZlIHByZXZpb3VzbHkgaGFkIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkKKyAqIGNhbGxlZCBzbyB0aGF0IGl0IGhhcyBhIHZhbGlkIGpvdXJuYWxfaGVhZCBhdHRhY2hlZCB0byB0aGUgYnVmZmVyCisgKiBoZWFkLgorICoKICAqIFRoZSBidWZmZXIgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QgYW5kIGlzIG1hcmtlZAogICogYXMgYmVsb25naW5nIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCkBAIC0xMDY1LDExICsxMDcwLDE2IEBACiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKwlpbnQgcmV0ID0gMDsKIAogCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CiAJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CiAJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCiAJCWdvdG8gb3V0OworCWlmICghYnVmZmVyX2piZChiaCkpIHsKKwkJcmV0ID0gLUVVQ0xFQU47CisJCWdvdG8gb3V0OworCX0KIAogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIApAQCAtMTA5Myw4ICsxMTAzLDIwIEBACiAJICovCiAJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uICYmIGpoLT5iX2psaXN0ID09IEJKX01ldGFkYXRhKSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJmYXN0cGF0aCIpOwotCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KLQkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJaWYgKHVubGlrZWx5KGpoLT5iX3RyYW5zYWN0aW9uICE9CisJCQkgICAgIGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX3RyYW5zYWN0aW9uICglbGx1LCAlcCwgJXUpICE9ICIKKwkJCSAgICAgICAiam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICglcCwgJXUpIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmgtPmJfYmxvY2tuciwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiA/IGpoLT5iX3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLAorCQkJICAgICAgIGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA/CisJCQkgICAgICAgam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uLT50X3RpZCA6IDApOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQogCQlnb3RvIG91dF91bmxvY2tfYmg7CiAJfQogCkBAIC0xMTA4LDkgKzExMzAsMzIgQEAKIAkgKi8KIAlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgImFscmVhZHkgb24gb3RoZXIgdHJhbnNhY3Rpb24iKTsKLQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09Ci0JCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7Ci0JCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJaWYgKHVubGlrZWx5KGpoLT5iX3RyYW5zYWN0aW9uICE9CisJCQkgICAgIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX3RyYW5zYWN0aW9uICglbGx1LCAlcCwgJXUpICE9ICIKKwkJCSAgICAgICAiam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uICglcCwgJXUpIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2Rldm5hbWUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmgtPmJfYmxvY2tuciwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl90cmFuc2FjdGlvbiA/IGpoLT5iX3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uLAorCQkJICAgICAgIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA/CisJCQkgICAgICAgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uLT50X3RpZCA6IDApOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlpZiAodW5saWtlbHkoamgtPmJfbmV4dF90cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbikpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6ICVzOiAiCisJCQkgICAgICAgImpoLT5iX25leHRfdHJhbnNhY3Rpb24gKCVsbHUsICVwLCAldSkgIT0gIgorCQkJICAgICAgICJ0cmFuc2FjdGlvbiAoJXAsICV1KSIsCisJCQkgICAgICAgam91cm5hbC0+al9kZXZuYW1lLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJoLT5iX2Jsb2NrbnIsCisJCQkgICAgICAgamgtPmJfbmV4dF90cmFuc2FjdGlvbiwKKwkJCSAgICAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID8KKwkJCSAgICAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uLT50X3RpZCA6IDAsCisJCQkgICAgICAgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CiAJCS8qIEFuZCB0aGlzIGNhc2UgaXMgaWxsZWdhbDogd2UgY2FuJ3QgcmV1c2UgYW5vdGhlcgogCQkgKiB0cmFuc2FjdGlvbidzIGRhdGEgYnVmZmVyLCBldmVyLiAqLwogCQlnb3RvIG91dF91bmxvY2tfYmg7CkBAIC0xMTI3LDcgKzExNzIsOCBAQAogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogb3V0OgogCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7Ci0JcmV0dXJuIDA7CisJV0FSTl9PTihyZXQpOwkvKiBBbGwgZXJyb3JzIGFyZSBidWdzLCBzbyBkdW1wIHRoZSBzdGFjayAqLworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wci5jIGIvZnMvamZmczIvY29tcHIuYwppbmRleCBkZTQyNDcwLi41YjZjOWQxIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wci5jCisrKyBiL2ZzL2pmZnMyL2NvbXByLmMKQEAgLTUzLDYgKzUzLDc4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBqZmZzMl9zZWxlY3RlZF9jb21wcmVzczoKKyAqIEBjb21wcjogRXhwbGljaXQgY29tcHJlc3Npb24gdHlwZSB0byB1c2UgKGllLCBKRkZTMl9DT01QUl9aTElCKS4KKyAqCUlmIDAsIGp1c3QgdGFrZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1vZGUuCisgKiBAZGF0YV9pbjogUG9pbnRlciB0byB1bmNvbXByZXNzZWQgZGF0YQorICogQGNwYWdlX291dDogUG9pbnRlciB0byByZXR1cm5lZCBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgY29tcHJlc3NlZCBkYXRhCisgKiBAZGF0YWxlbjogT24gZW50cnksIGhvbGRzIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUgZm9yIGNvbXByZXNzaW9uLgorICoJT24gZXhpdCwgZXhwZWN0ZWQgdG8gaG9sZCB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29tcHJlc3NlZC4KKyAqIEBjZGF0YWxlbjogT24gZW50cnksIGhvbGRzIHRoZSBhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlIGZvciBjb21wcmVzc2VkCisgKglkYXRhLiBPbiBleGl0LCBleHBlY3RlZCB0byBob2xkIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZAorICoJZGF0YS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY29tcHJlc3Npb24gdHlwZSB1c2VkLiAgWmVybyBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZGF0YQorICogY291bGQgbm90IGJlIGNvbXByZXNzZWQ7IHByb2JhYmx5IGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCB0aGUgcmVxdWVzdGVkCisgKiBjb21wcmVzc2lvbiBtb2RlLgorICovCitzdGF0aWMgaW50IGpmZnMyX3NlbGVjdGVkX2NvbXByZXNzKHU4IGNvbXByLCB1bnNpZ25lZCBjaGFyICpkYXRhX2luLAorCQl1bnNpZ25lZCBjaGFyICoqY3BhZ2Vfb3V0LCB1MzIgKmRhdGFsZW4sIHUzMiAqY2RhdGFsZW4pCit7CisJc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7CisJaW50IGVyciwgcmV0ID0gSkZGUzJfQ09NUFJfTk9ORTsKKwl1aW50MzJfdCBvcmlnX3NsZW4sIG9yaWdfZGxlbjsKKwljaGFyICpvdXRwdXRfYnVmOworCisJb3V0cHV0X2J1ZiA9IGttYWxsb2MoKmNkYXRhbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW91dHB1dF9idWYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IE5vIG1lbW9yeSBmb3IgY29tcHJlc3NvciBhbGxvY2F0aW9uLiBDb21wcmVzc2lvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJb3JpZ19zbGVuID0gKmRhdGFsZW47CisJb3JpZ19kbGVuID0gKmNkYXRhbGVuOworCXNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworCQkvKiBTa2lwIGRlY29tcHJlc3Mtb25seSBhbmQgZGlzYWJsZWQgbW9kdWxlcyAqLworCQlpZiAoIXRoaXMtPmNvbXByZXNzIHx8IHRoaXMtPmRpc2FibGVkKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBpZiBub3QgdGhlIGRlc2lyZWQgY29tcHJlc3Npb24gdHlwZSAqLworCQlpZiAoY29tcHIgJiYgKGNvbXByICE9IHRoaXMtPmNvbXByKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEVpdGhlciBjb21wcmVzc2lvbiB0eXBlIHdhcyB1bnNwZWNpZmllZCwgb3Igd2UgZm91bmQgb3VyCisJCSAqIGNvbXByZXNzb3I7IGVpdGhlciB3YXksIHdlJ3JlIGdvb2QgdG8gZ28uCisJCSAqLworCQl0aGlzLT51c2Vjb3VudCsrOworCQlzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCisJCSpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKwkJKmNkYXRhbGVuID0gb3JpZ19kbGVuOworCQllcnIgPSB0aGlzLT5jb21wcmVzcyhkYXRhX2luLCBvdXRwdXRfYnVmLCBkYXRhbGVuLCBjZGF0YWxlbik7CisKKwkJc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisJCXRoaXMtPnVzZWNvdW50LS07CisJCWlmICghZXJyKSB7CisJCQkvKiBTdWNjZXNzICovCisJCQlyZXQgPSB0aGlzLT5jb21wcjsKKwkJCXRoaXMtPnN0YXRfY29tcHJfYmxvY2tzKys7CisJCQl0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSArPSAqZGF0YWxlbjsKKwkJCXRoaXMtPnN0YXRfY29tcHJfbmV3X3NpemUgKz0gKmNkYXRhbGVuOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwlpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpCisJCWtmcmVlKG91dHB1dF9idWYpOworCWVsc2UKKwkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBqZmZzMl9jb21wcmVzczoKICAqIEBkYXRhX2luOiBQb2ludGVyIHRvIHVuY29tcHJlc3NlZCBkYXRhCiAgKiBAY3BhZ2Vfb3V0OiBQb2ludGVyIHRvIHJldHVybmVkIHBvaW50ZXIgdG8gYnVmZmVyIGZvciBjb21wcmVzc2VkIGRhdGEKQEAgLTc2LDQ3ICsxNDgsMjMgQEAKIAkJCXVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pCiB7CiAJaW50IHJldCA9IEpGRlMyX0NPTVBSX05PTkU7Ci0JaW50IGNvbXByX3JldDsKKwlpbnQgbW9kZSwgY29tcHJfcmV0OwogCXN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzLCAqYmVzdD1OVUxMOwogCXVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWYgPSBOVUxMLCAqdG1wX2J1ZjsKIAl1aW50MzJfdCBvcmlnX3NsZW4sIG9yaWdfZGxlbjsKIAl1aW50MzJfdCBiZXN0X3NsZW49MCwgYmVzdF9kbGVuPTA7CiAKLQlzd2l0Y2ggKGpmZnMyX2NvbXByZXNzaW9uX21vZGUpIHsKKwlpZiAoYy0+bW91bnRfb3B0cy5vdmVycmlkZV9jb21wcikKKwkJbW9kZSA9IGMtPm1vdW50X29wdHMuY29tcHI7CisJZWxzZQorCQltb2RlID0gamZmczJfY29tcHJlc3Npb25fbW9kZTsKKworCXN3aXRjaCAobW9kZSkgewogCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9OT05FOgogCQlicmVhazsKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFk6Ci0JCW91dHB1dF9idWYgPSBrbWFsbG9jKCpjZGF0YWxlbixHRlBfS0VSTkVMKTsKLQkJaWYgKCFvdXRwdXRfYnVmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uIENvbXByZXNzaW9uIGZhaWxlZC5cbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJb3JpZ19zbGVuID0gKmRhdGFsZW47Ci0JCW9yaWdfZGxlbiA9ICpjZGF0YWxlbjsKLQkJc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgewotCQkJLyogU2tpcCBkZWNvbXByZXNzLW9ubHkgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgYW5kIGRpc2FibGVkIG1vZHVsZXMgKi8KLQkJCWlmICgoIXRoaXMtPmNvbXByZXNzKXx8KHRoaXMtPmRpc2FibGVkKSkKLQkJCQljb250aW51ZTsKLQotCQkJdGhpcy0+dXNlY291bnQrKzsKLQkJCXNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCQkqZGF0YWxlbiAgPSBvcmlnX3NsZW47Ci0JCQkqY2RhdGFsZW4gPSBvcmlnX2RsZW47Ci0JCQljb21wcl9yZXQgPSB0aGlzLT5jb21wcmVzcyhkYXRhX2luLCBvdXRwdXRfYnVmLCBkYXRhbGVuLCBjZGF0YWxlbik7Ci0JCQlzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKLQkJCXRoaXMtPnVzZWNvdW50LS07Ci0JCQlpZiAoIWNvbXByX3JldCkgewotCQkJCXJldCA9IHRoaXMtPmNvbXByOwotCQkJCXRoaXMtPnN0YXRfY29tcHJfYmxvY2tzKys7Ci0JCQkJdGhpcy0+c3RhdF9jb21wcl9vcmlnX3NpemUgKz0gKmRhdGFsZW47Ci0JCQkJdGhpcy0+c3RhdF9jb21wcl9uZXdfc2l6ZSAgKz0gKmNkYXRhbGVuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0JCWlmIChyZXQgPT0gSkZGUzJfQ09NUFJfTk9ORSkKLQkJCWtmcmVlKG91dHB1dF9idWYpOworCQlyZXQgPSBqZmZzMl9zZWxlY3RlZF9jb21wcmVzcygwLCBkYXRhX2luLCBjcGFnZV9vdXQsIGRhdGFsZW4sCisJCQkJY2RhdGFsZW4pOwogCQlicmVhazsKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfU0laRToKIAljYXNlIEpGRlMyX0NPTVBSX01PREVfRkFWT1VSTFpPOgpAQCAtMTc0LDIyICsyMjIsMjggQEAKIAkJCWJlc3QtPnN0YXRfY29tcHJfb3JpZ19zaXplICs9IGJlc3Rfc2xlbjsKIAkJCWJlc3QtPnN0YXRfY29tcHJfbmV3X3NpemUgICs9IGJlc3RfZGxlbjsKIAkJCXJldCA9IGJlc3QtPmNvbXByOworCQkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKIAkJYnJlYWs7CisJY2FzZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFTFpPOgorCQlyZXQgPSBqZmZzMl9zZWxlY3RlZF9jb21wcmVzcyhKRkZTMl9DT01QUl9MWk8sIGRhdGFfaW4sCisJCQkJY3BhZ2Vfb3V0LCBkYXRhbGVuLCBjZGF0YWxlbik7CisJCWJyZWFrOworCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9GT1JDRVpMSUI6CisJCXJldCA9IGpmZnMyX3NlbGVjdGVkX2NvbXByZXNzKEpGRlMyX0NPTVBSX1pMSUIsIGRhdGFfaW4sCisJCQkJY3BhZ2Vfb3V0LCBkYXRhbGVuLCBjZGF0YWxlbik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiSkZGUzI6IHVua25vd24gY29tcHJlc3Npb24gbW9kZS5cbiIpOwogCX0KLSBvdXQ6CisKIAlpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpIHsKIAkJKmNwYWdlX291dCA9IGRhdGFfaW47CiAJCSpkYXRhbGVuID0gKmNkYXRhbGVuOwogCQlub25lX3N0YXRfY29tcHJfYmxvY2tzKys7CiAJCW5vbmVfc3RhdF9jb21wcl9zaXplICs9ICpkYXRhbGVuOwogCX0KLQllbHNlIHsKLQkJKmNwYWdlX291dCA9IG91dHB1dF9idWY7Ci0JfQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByLmggYi9mcy9qZmZzMi9jb21wci5oCmluZGV4IDEzYmI3NTkuLjVlOTFkNTcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByLmgKKysrIGIvZnMvamZmczIvY29tcHIuaApAQCAtNDAsNiArNDAsOCBAQAogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX1BSSU9SSVRZICAgMQogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX1NJWkUgICAgICAgMgogI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZBVk9VUkxaTyAgMworI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFTFpPICAgNAorI2RlZmluZSBKRkZTMl9DT01QUl9NT0RFX0ZPUkNFWkxJQiAgNQogCiAjZGVmaW5lIEZBVk9VUl9MWk9fUEVSQ0VOVCA4MAogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9kaXIuYyBiL2ZzL2pmZnMyL2Rpci5jCmluZGV4IDk2NTliN2MuLmJlNjE2OWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2Rpci5jCisrKyBiL2ZzL2pmZnMyL2Rpci5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlyZXQgPSBqZmZzMl9kb191bmxpbmsoYywgZGlyX2YsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGRlYWRfZiwgbm93KTsKIAlpZiAoZGVhZF9mLT5pbm9jYWNoZSkKLQkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gZGVhZF9mLT5pbm9jYWNoZS0+cGlub19ubGluazsKKwkJc2V0X25saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZGVhZF9mLT5pbm9jYWNoZS0+cGlub19ubGluayk7CiAJaWYgKCFyZXQpCiAJCWRpcl9pLT5pX210aW1lID0gZGlyX2ktPmlfY3RpbWUgPSBJVElNRShub3cpOwogCXJldHVybiByZXQ7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAogCWlmICghcmV0KSB7CiAJCW11dGV4X2xvY2soJmYtPnNlbSk7Ci0JCW9sZF9kZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSArK2YtPmlub2NhY2hlLT5waW5vX25saW5rOworCQlzZXRfbmxpbmsob2xkX2RlbnRyeS0+ZF9pbm9kZSwgKytmLT5pbm9jYWNoZS0+cGlub19ubGluayk7CiAJCW11dGV4X3VubG9jaygmZi0+c2VtKTsKIAkJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOwogCQlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUobm93KTsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKIAogCS8qIERpcmVjdG9yaWVzIGdldCBubGluayAyIGF0IHN0YXJ0ICovCi0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJLyogYnV0IGljLT5waW5vX25saW5rIGlzIHRoZSBwYXJlbnQgaW5vIyAqLwogCWYtPmlub2NhY2hlLT5waW5vX25saW5rID0gZGlyX2ktPmlfaW5vOwogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9mcy5jIGIvZnMvamZmczIvZnMuYwppbmRleCBiYmNiOTc1Li40YjhhZmUzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9mcy5jCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTI3OCw3ICsyNzgsNyBAQAogCWlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUobGF0ZXN0X25vZGUubXRpbWUpKTsKIAlpbm9kZS0+aV9jdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLmN0aW1lKSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IGYtPmlub2NhY2hlLT5waW5vX25saW5rOworCXNldF9ubGluayhpbm9kZSwgZi0+aW5vY2FjaGUtPnBpbm9fbmxpbmspOwogCiAJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWNhc2UgU19JRkRJUjoKIAl7CiAJCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7Ci0JCWlub2RlLT5pX25saW5rID0gMjsgLyogcGFyZW50IGFuZCAnLicgKi8KKwkJc2V0X25saW5rKGlub2RlLCAyKTsgLyogcGFyZW50IGFuZCAnLicgKi8KIAogCQlmb3IgKGZkPWYtPmRlbnRzOyBmZDsgZmQgPSBmZC0+bmV4dCkgewogCQkJaWYgKGZkLT50eXBlID09IERUX0RJUiAmJiBmZC0+aW5vKQpAQCAtMzc5LDcgKzM3OSw3IEBACiAJamZmczJfZG9fc2V0YXR0cihpbm9kZSwgJmlhdHRyKTsKIH0KIAotaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCitpbnQgamZmczJfZG9fcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CiAKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJaW5vZGUtPmlfaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CiAJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOwogCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfZnNfc2IuaCBiL2ZzL2pmZnMyL2pmZnMyX2ZzX3NiLmgKaW5kZXggMGJjNmE2Yy4uNTVhMGMxZCAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfZnNfc2IuaAorKysgYi9mcy9qZmZzMi9qZmZzMl9mc19zYi5oCkBAIC0yOSw2ICsyOSwxMSBAQAogCiBzdHJ1Y3QgamZmczJfaW5vZGlydHk7CiAKK3N0cnVjdCBqZmZzMl9tb3VudF9vcHRzIHsKKwlib29sIG92ZXJyaWRlX2NvbXByOworCXVuc2lnbmVkIGludCBjb21wcjsKK307CisKIC8qIEEgc3RydWN0IGZvciB0aGUgb3ZlcmFsbCBmaWxlIHN5c3RlbSBjb250cm9sLiAgUG9pbnRlcnMgdG8KICAgIGpmZnMyX3NiX2luZm8gc3RydWN0cyBhcmUgbmFtZWQgYGMnIGluIHRoZSBzb3VyY2UgY29kZS4KICAgIE5lZSBqZmZzX2NvbnRyb2wKQEAgLTEyNiw2ICsxMzEsNyBAQAogI2VuZGlmCiAKIAlzdHJ1Y3QgamZmczJfc3VtbWFyeSAqc3VtbWFyeTsJCS8qIFN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgamZmczJfbW91bnRfb3B0cyBtb3VudF9vcHRzOwogCiAjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1hBVFRSCiAjZGVmaW5lIFhBVFRSSU5ERVhfSEFTSFNJWkUJKDU3KQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggNmMxNzU1Yy4uYWI2NWVlMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0xNzYsNyArMTc2LDcgQEAKIHN0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCB1bW9kZV90IG1vZGUsCiAJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpOwogaW50IGpmZnMyX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKLWludCBqZmZzMl9yZW1vdW50X2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CitpbnQgamZmczJfZG9fcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CiBpbnQgamZmczJfZG9fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKIHZvaWQgamZmczJfZ2NfcmVsZWFzZV9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKIAkJCSAgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zY2FuLmMgYi9mcy9qZmZzMi9zY2FuLmMKaW5kZXggOGQ4Y2QzNC4uMjgxMDdjYSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc2Nhbi5jCisrKyBiL2ZzL2pmZnMyL3NjYW4uYwpAQCAtMjc1LDkgKzI3NSw3IEBACiAJZWxzZQogCQljLT5tdGQtPnVucG9pbnQoYy0+bXRkLCAwLCBjLT5tdGQtPnNpemUpOwogI2VuZGlmCi0JaWYgKHMpCi0JCWtmcmVlKHMpOwotCisJa2ZyZWUocyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggODUzYjhlMy4uZTdlOTc0NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC0xNywxMSArMTcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvamZmczIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3N1cGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlICJjb21wci5oIgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCkBAIC03NSw2ICs3NywzNyBAQAogCXVubG9ja19zdXBlcihzYik7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpqZmZzMl9jb21wcl9uYW1lKHVuc2lnbmVkIGludCBjb21wcikKK3sKKwlzd2l0Y2ggKGNvbXByKSB7CisJY2FzZSBKRkZTMl9DT01QUl9NT0RFX05PTkU6CisJCXJldHVybiAibm9uZSI7CisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworCWNhc2UgSkZGUzJfQ09NUFJfTU9ERV9GT1JDRUxaTzoKKwkJcmV0dXJuICJsem8iOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1pMSUIKKwljYXNlIEpGRlMyX0NPTVBSX01PREVfRk9SQ0VaTElCOgorCQlyZXR1cm4gInpsaWIiOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbjsgcHJvZ3JhbW1lciBlcnJvciAqLworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gIiI7CisJfQorfQorCitzdGF0aWMgaW50IGpmZnMyX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhtbnQtPm1udF9zYik7CisJc3RydWN0IGpmZnMyX21vdW50X29wdHMgKm9wdHMgPSAmYy0+bW91bnRfb3B0czsKKworCWlmIChvcHRzLT5vdmVycmlkZV9jb21wcikKKwkJc2VxX3ByaW50ZihzLCAiLGNvbXByPSVzIiwgamZmczJfY29tcHJfbmFtZShvcHRzLT5jb21wcikpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgamZmczJfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOwpAQCAtMTMzLDYgKzE2Niw4NSBAQAogCS5maF90b19wYXJlbnQgPSBqZmZzMl9maF90b19wYXJlbnQsCiB9OwogCisvKgorICogSkZGUzIgbW91bnQgb3B0aW9ucy4KKyAqCisgKiBPcHRfb3ZlcnJpZGVfY29tcHI6IG92ZXJyaWRlIGRlZmF1bHQgY29tcHJlc3NvcgorICogT3B0X2VycjoganVzdCBlbmQgb2YgYXJyYXkgbWFya2VyCisgKi8KK2VudW0geworCU9wdF9vdmVycmlkZV9jb21wciwKKwlPcHRfZXJyLAorfTsKKworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfb3ZlcnJpZGVfY29tcHIsICJjb21wcj0lcyJ9LAorCXtPcHRfZXJyLCBOVUxMfSwKK307CisKK3N0YXRpYyBpbnQgamZmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgY2hhciAqZGF0YSkKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJY2hhciAqcCwgKm5hbWU7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZkYXRhLCAiLCIpKSkgeworCQlpbnQgdG9rZW47CisKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9vdmVycmlkZV9jb21wcjoKKwkJCW5hbWUgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCisJCQlpZiAoIW5hbWUpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoIXN0cmNtcChuYW1lLCAibm9uZSIpKQorCQkJCWMtPm1vdW50X29wdHMuY29tcHIgPSBKRkZTMl9DT01QUl9NT0RFX05PTkU7CisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworCQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAibHpvIikpCisJCQkJYy0+bW91bnRfb3B0cy5jb21wciA9IEpGRlMyX0NPTVBSX01PREVfRk9SQ0VMWk87CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfWkxJQgorCQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiemxpYiIpKQorCQkJCWMtPm1vdW50X29wdHMuY29tcHIgPQorCQkJCQkJSkZGUzJfQ09NUFJfTU9ERV9GT1JDRVpMSUI7CisjZW5kaWYKKwkJCWVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzIgRXJyb3I6IHVua25vd24gY29tcHJlc3NvciBcIiVzXCIiLAorCQkJCQkJbmFtZSk7CisJCQkJa2ZyZWUobmFtZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlrZnJlZShuYW1lKTsKKwkJCWMtPm1vdW50X29wdHMub3ZlcnJpZGVfY29tcHIgPSB0cnVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyIEVycm9yOiB1bnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICclcycgb3IgbWlzc2luZyB2YWx1ZVxuIiwKKwkJCQkJcCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX3JlbW91bnRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCWludCBlcnI7CisKKwllcnIgPSBqZmZzMl9wYXJzZV9vcHRpb25zKGMsIGRhdGEpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGpmZnMyX2RvX3JlbW91bnRfZnMoc2IsIGZsYWdzLCBkYXRhKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnMyX3N1cGVyX29wZXJhdGlvbnMgPQogewogCS5hbGxvY19pbm9kZSA9CWpmZnMyX2FsbG9jX2lub2RlLApAQCAtMTQzLDYgKzI1NSw3IEBACiAJLnJlbW91bnRfZnMgPQlqZmZzMl9yZW1vdW50X2ZzLAogCS5ldmljdF9pbm9kZSA9CWpmZnMyX2V2aWN0X2lub2RlLAogCS5kaXJ0eV9pbm9kZSA9CWpmZnMyX2RpcnR5X2lub2RlLAorCS5zaG93X29wdGlvbnMgPQlqZmZzMl9zaG93X29wdGlvbnMsCiAJLnN5bmNfZnMgPQlqZmZzMl9zeW5jX2ZzLAogfTsKIApAQCAtMTY2LDYgKzI3OSwxMiBAQAogCWMtPm9zX3ByaXYgPSBzYjsKIAlzYi0+c19mc19pbmZvID0gYzsKIAorCXJldCA9IGpmZnMyX3BhcnNlX29wdGlvbnMoYywgZGF0YSk7CisJaWYgKHJldCkgeworCQlrZnJlZShjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogSW5pdGlhbGl6ZSBKRkZTMiBzdXBlcmJsb2NrIGxvY2tzLCB0aGUgZnVydGhlciBpbml0aWFsaXphdGlvbiB3aWxsCiAJICogYmUgZG9uZSBsYXRlciAqLwogCW11dGV4X2luaXQoJmMtPmFsbG9jX3NlbSk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKaW5kZXggNDUxNWJlYS4uYjA5ZTUxZCAxMDA2NDQKLS0tIGEvZnMvamZmczIvd2J1Zi5jCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtNTc4LDggKzU3OCw3IEBACiAJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gMDsKIAotCWlmIChtdXRleF90cnlsb2NrKCZjLT5hbGxvY19zZW0pKSB7Ci0JCW11dGV4X3VubG9jaygmYy0+YWxsb2Nfc2VtKTsKKwlpZiAoIW11dGV4X2lzX2xvY2tlZCgmYy0+YWxsb2Nfc2VtKSkgewogCQlwcmludGsoS0VSTl9DUklUICJqZmZzMl9mbHVzaF93YnVmKCkgY2FsbGVkIHdpdGggYWxsb2Nfc2VtIG5vdCBsb2NrZWQhXG4iKTsKIAkJQlVHKCk7CiAJfQpAQCAtMTAyNiw3ICsxMDI1LDcgQEAKIAlpbnQgY21sZW4gPSBtaW5fdChpbnQsIGMtPm9vYmF2YWlsLCBPT0JfQ01fU0laRSk7CiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMub29ibGVuID0gTlJfT09CX1NDQU5fUEFHRVMgKiBjLT5vb2JhdmFpbDsKIAlvcHMub29iYnVmID0gYy0+b29iYnVmOwogCW9wcy5sZW4gPSBvcHMub29ib2ZmcyA9IG9wcy5yZXRsZW4gPSBvcHMub29icmV0bGVuID0gMDsKQEAgLTEwNjksNyArMTA2OCw3IEBACiAJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKIAlpbnQgcmV0LCBjbWxlbiA9IG1pbl90KGludCwgYy0+b29iYXZhaWwsIE9PQl9DTV9TSVpFKTsKIAotCW9wcy5tb2RlID0gTVREX09PQl9BVVRPOworCW9wcy5tb2RlID0gTVREX09QU19BVVRPX09PQjsKIAlvcHMub29ibGVuID0gY21sZW47CiAJb3BzLm9vYmJ1ZiA9IGMtPm9vYmJ1ZjsKIAlvcHMubGVuID0gb3BzLm9vYm9mZnMgPSBvcHMucmV0bGVuID0gb3BzLm9vYnJldGxlbiA9IDA7CkBAIC0xMDk1LDcgKzEwOTQsNyBAQAogCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CiAJaW50IGNtbGVuID0gbWluX3QoaW50LCBjLT5vb2JhdmFpbCwgT09CX0NNX1NJWkUpOwogCi0Jb3BzLm1vZGUgPSBNVERfT09CX0FVVE87CisJb3BzLm1vZGUgPSBNVERfT1BTX0FVVE9fT09COwogCW9wcy5vb2JsZW4gPSBjbWxlbjsKIAlvcHMub29iYnVmID0gKHVpbnQ4X3QgKikmb29iX2NsZWFubWFya2VyOwogCW9wcy5sZW4gPSBvcHMub29ib2ZmcyA9IG9wcy5yZXRsZW4gPSBvcHMub29icmV0bGVuID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW1hcC5jIGIvZnMvamZzL2pmc19pbWFwLmMKaW5kZXggYjc4YjJmOS4uMWI2ZjE1ZiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbWFwLmMKKysrIGIvZnMvamZzL2pmc19pbWFwLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZml4ZWQgZGlzayBpbm9kZSAoQUlUKSBpbiByYXcgbW9kZSAqLwogCW1wID0gcmVhZF9tZXRhcGFnZShpcCwgYWRkcmVzcyA8PCBzYmktPmwybmJwZXJwYWdlLCBQU0laRSwgMSk7CiAJaWYgKG1wID09IE5VTEwpIHsKLQkJaXAtPmlfbmxpbmsgPSAxOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLworCQlzZXRfbmxpbmsoaXAsIDEpOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLwogCQlpcHV0KGlwKTsKIAkJcmV0dXJuIChOVUxMKTsKIAl9CkBAIC00NjksNyArNDY5LDcgQEAKIAkvKiBjb3B5IG9uLWRpc2sgaW5vZGUgdG8gaW4tbWVtb3J5IGlub2RlICovCiAJaWYgKChjb3B5X2Zyb21fZGlub2RlKGRwLCBpcCkpICE9IDApIHsKIAkJLyogaGFuZGxlIGJhZCByZXR1cm4gYnkgcmV0dXJuaW5nIE5VTEwgZm9yIGlwICovCi0JCWlwLT5pX25saW5rID0gMTsJLyogRG9uJ3Qgd2FudCBpcHV0KCkgZGVsZXRpbmcgaXQgKi8KKwkJc2V0X25saW5rKGlwLCAxKTsJLyogRG9uJ3Qgd2FudCBpcHV0KCkgZGVsZXRpbmcgaXQgKi8KIAkJaXB1dChpcCk7CiAJCS8qIHJlbGVhc2UgdGhlIHBhZ2UgKi8KIAkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CkBAIC0zMDc2LDcgKzMwNzYsNyBAQAogCQkJCWlwLT5pX21vZGUgfD0gMDAwMTsKIAkJfQogCX0KLQlpcC0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfbmxpbmspOworCXNldF9ubGluayhpcCwgbGUzMl90b19jcHUoZGlwLT5kaV9ubGluaykpOwogCiAJamZzX2lwLT5zYXZlZF91aWQgPSBsZTMyX3RvX2NwdShkaXAtPmRpX3VpZCk7CiAJaWYgKHNiaS0+dWlkID09IC0xKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5jIGIvZnMvamZzL2pmc19pbm9kZS5jCmluZGV4IDI2ODY1MzEuLmMxYTNlNjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW5vZGUuYworKysgYi9mcy9qZnMvamZzX2lub2RlLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWRxdW90X2Ryb3AoaW5vZGUpOwogCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKIGZhaWxfdW5sb2NrOgotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiBmYWlsX3B1dDoKIAlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDU4MzYzNmYuLmNjNWY4MTEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3Igc3luY19ibG9ja2RldigpICovCiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvZnMvamZzL25hbWVpLmMgYi9mcy9qZnMvbmFtZWkuYwppbmRleCBlMTc1NDVlLi5hMTEyYWQ5IDEwMDY0NAotLS0gYS9mcy9qZnMvbmFtZWkuYworKysgYi9mcy9qZnMvbmFtZWkuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJbXV0ZXhfdW5sb2NrKCZKRlNfSVAoZGlwKS0+Y29tbWl0X211dGV4KTsKIAlpZiAocmMpIHsKIAkJZnJlZV9lYV93bWFwKGlwKTsKLQkJaXAtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpcCk7CiAJCXVubG9ja19uZXdfaW5vZGUoaXApOwogCQlpcHV0KGlwKTsKIAl9IGVsc2UgewpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCWdvdG8gb3V0MzsKIAl9CiAKLQlpcC0+aV9ubGluayA9IDI7CS8qIGZvciAnLicgKi8KKwlzZXRfbmxpbmsoaXAsIDIpOwkvKiBmb3IgJy4nICovCiAJaXAtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlwLT5pX2ZvcCA9ICZqZnNfZGlyX29wZXJhdGlvbnM7CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogCW11dGV4X3VubG9jaygmSkZTX0lQKGRpcCktPmNvbW1pdF9tdXRleCk7CiAJaWYgKHJjKSB7CiAJCWZyZWVfZWFfd21hcChpcCk7Ci0JCWlwLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaXApOwogCQl1bmxvY2tfbmV3X2lub2RlKGlwKTsKIAkJaXB1dChpcCk7CiAJfSBlbHNlIHsKQEAgLTg0NCw3ICs4NDQsNyBAQAogCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKIAogCWlmIChyYykgewotCQlpcC0+aV9ubGluay0tOyAvKiBuZXZlciBpbnN0YW50aWF0ZWQgKi8KKwkJZHJvcF9ubGluayhpcCk7IC8qIG5ldmVyIGluc3RhbnRpYXRlZCAqLwogCQlpcHV0KGlwKTsKIAl9IGVsc2UKIAkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKQEAgLTEwNDgsNyArMTA0OCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZKRlNfSVAoZGlwKS0+Y29tbWl0X211dGV4KTsKIAlpZiAocmMpIHsKIAkJZnJlZV9lYV93bWFwKGlwKTsKLQkJaXAtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpcCk7CiAJCXVubG9ja19uZXdfaW5vZGUoaXApOwogCQlpcHV0KGlwKTsKIAl9IGVsc2UgewpAQCAtMTQzMyw3ICsxNDMzLDcgQEAKIAltdXRleF91bmxvY2soJkpGU19JUChkaXIpLT5jb21taXRfbXV0ZXgpOwogCWlmIChyYykgewogCQlmcmVlX2VhX3dtYXAoaXApOwotCQlpcC0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlwKTsKIAkJdW5sb2NrX25ld19pbm9kZShpcCk7CiAJCWlwdXQoaXApOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDA2YzhhNjcuLmE0NGVmZjA3NiAxMDA2NDQKLS0tIGEvZnMvamZzL3N1cGVyLmMKKysrIGIvZnMvamZzL3N1cGVyLmMKQEAgLTQ4NSw3ICs0ODUsNiBAQAogCQlnb3RvIG91dF91bmxvYWQ7CiAJfQogCWlub2RlLT5pX2lubyA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOwogCWlub2RlLT5pX3NpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmc19tZXRhcGFnZV9hb3BzOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2xpYmZzLmMgYi9mcy9saWJmcy5jCmluZGV4IGMxOGU5YTEuLmY2ZDQxMWUgMTAwNjQ0Ci0tLSBhL2ZzL2xpYmZzLmMKKysrIGIvZnMvbGliZnMuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghcm9vdCkgewogCQlpcHV0KGlub2RlKTsKQEAgLTUxMCw4ICs1MTAsMTAgQEAKIAkJaWYgKCFkZW50cnkpCiAJCQlnb3RvIG91dDsKIAkJaW5vZGUgPSBuZXdfaW5vZGUocyk7Ci0JCWlmICghaW5vZGUpCisJCWlmICghaW5vZGUpIHsKKwkJCWRwdXQoZGVudHJ5KTsKIAkJCWdvdG8gb3V0OworCQl9CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgZmlsZXMtPm1vZGU7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJaW5vZGUtPmlfZm9wID0gZmlsZXMtPm9wczsKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2Rpci5jIGIvZnMvbG9nZnMvZGlyLmMKaW5kZXggYjNmZjNkOC4uYjdkN2Y2NyAxMDA2NDQKLS0tIGEvZnMvbG9nZnMvZGlyLmMKKysrIGIvZnMvbG9nZnMvZGlyLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogewogCWludCByZXQ7CiAKLQlpbm9kZS0+aV9ubGluay0tOworCWRyb3BfbmxpbmsoaW5vZGUpOwogCXJldCA9IHdyaXRlX2lub2RlKGlub2RlKTsKIAlMT0dGU19CVUdfT04ocmV0LCBpbm9kZS0+aV9zYik7CiAJcmV0dXJuIHJldDsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiAJdGEgPSBremFsbG9jKHNpemVvZigqdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRhKSB7Ci0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJCWFib3J0X3RyYW5zYWN0aW9uKGlub2RlLCB0YSk7CiAJCWxpLT5saV9mbGFncyB8PSBMT0dGU19JRl9TVElMTEJPUk47CiAJCS8qIEZJWE1FOiB0cnVuY2F0ZSBzeW1saW5rICovCi0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTYzLDcgKzU2Myw3IEBACiAKIAlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAlpaG9sZChpbm9kZSk7Ci0JaW5vZGUtPmlfbmxpbmsrKzsKKwlpbmNfbmxpbmsoaW5vZGUpOwogCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAKIAlyZXR1cm4gX19sb2dmc19jcmVhdGUoZGlyLCBkZW50cnksIGlub2RlLCBOVUxMLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2lub2RlLmMgYi9mcy9sb2dmcy9pbm9kZS5jCmluZGV4IGVkZmVhN2EuLjdlNDQxYWQgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL2lub2RlLmMKKysrIGIvZnMvbG9nZnMvaW5vZGUuYwpAQCAtOTMsNyArOTMsNyBAQAogCQkvKiBpbm9kZS0+aV9ubGluayA9PSAwIGNhbiBiZSB0cnVlIHdoZW4gY2FsbGVkIGZyb20KIAkJICogYmxvY2sgdmFsaWRhdG9yICovCiAJCS8qIHNldCBpX25saW5rIHRvIDAgdG8gcHJldmVudCBjYWNoaW5nICovCi0JCWlub2RlLT5pX25saW5rID0gMDsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlsb2dmc19pbm9kZShpbm9kZSktPmxpX2ZsYWdzIHw9IExPR0ZTX0lGX1pPTUJJRTsKIAkJaWdldF9mYWlsZWQoaW5vZGUpOwogCQlpZiAoIWVycikKQEAgLTE5OSw3ICsxOTksNiBAQAogCWlub2RlLT5pX2Jsb2Nrcwk9IDA7CiAJaW5vZGUtPmlfY3RpbWUJPSBDVVJSRU5UX1RJTUU7CiAJaW5vZGUtPmlfbXRpbWUJPSBDVVJSRU5UX1RJTUU7Ci0JaW5vZGUtPmlfbmxpbmsJPSAxOwogCWxpLT5saV9yZWZjb3VudCA9IDE7CiAJSU5JVF9MSVNUX0hFQUQoJmxpLT5saV9mcmVlaW5nX2xpc3QpOwogCmRpZmYgLS1naXQgYS9mcy9sb2dmcy9sb2dmcy5oIGIvZnMvbG9nZnMvbG9nZnMuaAppbmRleCBmMjJkMTA4Li4zOThlY2ZmNiAxMDA2NDQKLS0tIGEvZnMvbG9nZnMvbG9nZnMuaAorKysgYi9mcy9sb2dmcy9sb2dmcy5oCkBAIC02MTgsNyArNjE4LDYgQEAKIHN0cnVjdCBwYWdlICplbWVyZ2VuY3lfcmVhZF9iZWdpbihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCk7CiB2b2lkIGVtZXJnZW5jeV9yZWFkX2VuZChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIGxvZ2ZzX2NyYXNoX2R1bXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci12b2lkICptZW1jaHJfaW52KGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CiBpbnQgbG9nZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKnN0YXRzKTsKIGludCBsb2dmc19jaGVja19kcyhzdHJ1Y3QgbG9nZnNfZGlza19zdXBlciAqZHMpOwogaW50IGxvZ2ZzX3dyaXRlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvcmVhZHdyaXRlLmMgYi9mcy9sb2dmcy9yZWFkd3JpdGUuYwppbmRleCBkOGQwOTM4Li4yYWM0MjE3IDEwMDY0NAotLS0gYS9mcy9sb2dmcy9yZWFkd3JpdGUuYworKysgYi9mcy9sb2dmcy9yZWFkd3JpdGUuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJaW5vZGUtPmlfYXRpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9hdGltZSk7CiAJaW5vZGUtPmlfY3RpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9jdGltZSk7CiAJaW5vZGUtPmlfbXRpbWUJPSBiZTY0X3RvX3RpbWVzcGVjKGRpLT5kaV9tdGltZSk7Ci0JaW5vZGUtPmlfbmxpbmsJPSBiZTMyX3RvX2NwdShkaS0+ZGlfcmVmY291bnQpOworCXNldF9ubGluayhpbm9kZSwgYmUzMl90b19jcHUoZGktPmRpX3JlZmNvdW50KSk7CiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGJlMzJfdG9fY3B1KGRpLT5kaV9nZW5lcmF0aW9uKTsKIAogCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgewpkaWZmIC0tZ2l0IGEvZnMvbG9nZnMvc3VwZXIuYyBiL2ZzL2xvZ2ZzL3N1cGVyLmMKaW5kZXggY2UwM2ExOC4uZTc5NWMyMzQgMTAwNjQ0Ci0tLSBhL2ZzL2xvZ2ZzL3N1cGVyLmMKKysrIGIvZnMvbG9nZnMvc3VwZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KQEAgLTkxLDI4ICs5Miw2IEBACiB9CiAKIC8qCi0gKiBUT0RPOiBtb3ZlIHRvIGxpYi9zdHJpbmcuYwotICovCi0vKioKLSAqIG1lbWNocl9pbnYgLSBGaW5kIGEgY2hhcmFjdGVyIGluIGFuIGFyZWEgb2YgbWVtb3J5LgotICogQHM6IFRoZSBtZW1vcnkgYXJlYQotICogQGM6IFRoZSBieXRlIHRvIHNlYXJjaCBmb3IKLSAqIEBuOiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KLSAqCi0gKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBAYywgb3IgJU5VTEwKLSAqIGlmIHRoZSB3aG9sZSBidWZmZXIgY29udGFpbnMganVzdCBAYy4KLSAqLwotdm9pZCAqbWVtY2hyX2ludihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHM7Ci0Jd2hpbGUgKG4tLSAhPSAwKQotCQlpZiAoKHVuc2lnbmVkIGNoYXIpYyAhPSAqcCsrKQotCQkJcmV0dXJuICh2b2lkICopKHAgLSAxKTsKLQotCXJldHVybiBOVUxMOwotfQotCi0vKgogICogRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhIHJlc2VydmUgZm9yIHJvb3QsIHNpbWlsYXIgdG8gZXh0Mi4KICAqLwogaW50IGxvZ2ZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzdGF0cykKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IGU3ZDIzZTIuLjY0Y2RjZDYgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IHJhd19pbm9kZS0+aV9tb2RlOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClyYXdfaW5vZGUtPmlfdWlkOwogCWlub2RlLT5pX2dpZCA9IChnaWRfdClyYXdfaW5vZGUtPmlfZ2lkOwotCWlub2RlLT5pX25saW5rID0gcmF3X2lub2RlLT5pX25saW5rczsKKwlzZXRfbmxpbmsoaW5vZGUsIHJhd19pbm9kZS0+aV9ubGlua3MpOwogCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmlfc2l6ZTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfdGltZTsKIAlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKQEAgLTQ3OSw3ICs0NzksNyBAQAogCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPmlfbW9kZTsKIAlpbm9kZS0+aV91aWQgPSAodWlkX3QpcmF3X2lub2RlLT5pX3VpZDsKIAlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpcmF3X2lub2RlLT5pX2dpZDsKLQlpbm9kZS0+aV9ubGluayA9IHJhd19pbm9kZS0+aV9ubGlua3M7CisJc2V0X25saW5rKGlub2RlLCByYXdfaW5vZGUtPmlfbmxpbmtzKTsKIAlpbm9kZS0+aV9zaXplID0gcmF3X2lub2RlLT5pX3NpemU7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gcmF3X2lub2RlLT5pX210aW1lOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+aV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDBiMzEzOGQuLjUwMDhmMDEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGNoYXIgKmdldG5hbWVfZmxhZ3MoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIGNoYXIgKmdldG5hbWVfZmxhZ3MoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCAqZW1wdHkpCiB7CiAJY2hhciAqdG1wLCAqcmVzdWx0OwogCkBAIC0xNDgsNiArMTQ4LDggQEAKIAogCQlyZXN1bHQgPSB0bXA7CiAJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlpZiAocmV0dmFsID09IC1FTk9FTlQgJiYgZW1wdHkpCisJCQkJKmVtcHR5ID0gMTsKIAkJCWlmIChyZXR2YWwgIT0gLUVOT0VOVCB8fCAhKGZsYWdzICYgTE9PS1VQX0VNUFRZKSkgewogCQkJCV9fcHV0bmFtZSh0bXApOwogCQkJCXJlc3VsdCA9IEVSUl9QVFIocmV0dmFsKTsKQEAgLTE2MCw3ICsxNjIsNyBAQAogCiBjaGFyICpnZXRuYW1lKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUpCiB7Ci0JcmV0dXJuIGdldG5hbWVfZmxhZ3MoZmlsZW5hbWUsIDApOworCXJldHVybiBnZXRuYW1lX2ZsYWdzKGZpbGVuYW1lLCAwLCAwKTsKIH0KIAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKQEAgLTIyMSwxNCArMjIzLDEyIEBACiB9CiAKIC8qCi0gKiBUaGlzIGRvZXMgYmFzaWMgUE9TSVggQUNMIHBlcm1pc3Npb24gY2hlY2tpbmcKKyAqIFRoaXMgZG9lcyB0aGUgYmFzaWMgcGVybWlzc2lvbiBjaGVja2luZwogICovCiBzdGF0aWMgaW50IGFjbF9wZXJtaXNzaW9uX2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXVuc2lnbmVkIGludCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAotCW1hc2sgJj0gTUFZX1JFQUQgfCBNQVlfV1JJVEUgfCBNQVlfRVhFQyB8IE1BWV9OT1RfQkxPQ0s7Ci0KIAlpZiAoY3VycmVudF91c2VyX25zKCkgIT0gaW5vZGVfdXNlcm5zKGlub2RlKSkKIAkJZ290byBvdGhlcl9wZXJtczsKIApAQCAtMjU3LDcgKzI1Nyw3IEBACiAvKioKICAqIGdlbmVyaWNfcGVybWlzc2lvbiAtICBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cyBvbiBhIFBvc2l4LWxpa2UgZmlsZXN5c3RlbQogICogQGlub2RlOglpbm9kZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgotICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCisgKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQywgLi4uKQogICoKICAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCiAgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCkBAIC0yNzMsNyArMjczLDcgQEAKIAlpbnQgcmV0OwogCiAJLyoKLQkgKiBEbyB0aGUgYmFzaWMgUE9TSVggQUNMIHBlcm1pc3Npb24gY2hlY2tzLgorCSAqIERvIHRoZSBiYXNpYyBwZXJtaXNzaW9uIGNoZWNrcy4KIAkgKi8KIAlyZXQgPSBhY2xfcGVybWlzc2lvbl9jaGVjayhpbm9kZSwgbWFzayk7CiAJaWYgKHJldCAhPSAtRUFDQ0VTKQpAQCAtMzMxLDEyICszMzEsMTQgQEAKIC8qKgogICogaW5vZGVfcGVybWlzc2lvbiAgLSAgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgdG8gYSBnaXZlbiBpbm9kZQogICogQGlub2RlOglpbm9kZSB0byBjaGVjayBwZXJtaXNzaW9uIG9uCi0gKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQykKKyAqIEBtYXNrOglyaWdodCB0byBjaGVjayBmb3IgKCVNQVlfUkVBRCwgJU1BWV9XUklURSwgJU1BWV9FWEVDLCAuLi4pCiAgKgogICogVXNlZCB0byBjaGVjayBmb3IgcmVhZC93cml0ZS9leGVjdXRlIHBlcm1pc3Npb25zIG9uIGFuIGlub2RlLgogICogV2UgdXNlICJmc3VpZCIgZm9yIHRoaXMsIGxldHRpbmcgdXMgc2V0IGFyYml0cmFyeSBwZXJtaXNzaW9ucwogICogZm9yIGZpbGVzeXN0ZW0gYWNjZXNzIHdpdGhvdXQgY2hhbmdpbmcgdGhlICJub3JtYWwiIHVpZHMgd2hpY2gKICAqIGFyZSB1c2VkIGZvciBvdGhlciB0aGluZ3MuCisgKgorICogV2hlbiBjaGVja2luZyBmb3IgTUFZX0FQUEVORCwgTUFZX1dSSVRFIG11c3QgYWxzbyBiZSBzZXQgaW4gQG1hc2suCiAgKi8KIGludCBpbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewpAQCAtODUwLDcgKzg1Miw3IEBACiAJCW1udHB1dChwYXRoLT5tbnQpOwogCWlmIChyZXQgPT0gLUVJU0RJUikKIAkJcmV0ID0gMDsKLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPCAwID8gcmV0IDogbmVlZF9tbnRwdXQ7CiB9CiAKIGludCBmb2xsb3dfZG93bl9vbmUoc3RydWN0IHBhdGggKnBhdGgpCkBAIC04OTgsNiArOTAwLDcgQEAKIAkJCWJyZWFrOwogCQlwYXRoLT5tbnQgPSBtb3VudGVkOwogCQlwYXRoLT5kZW50cnkgPSBtb3VudGVkLT5tbnRfcm9vdDsKKwkJbmQtPmZsYWdzIHw9IExPT0tVUF9KVU1QRUQ7CiAJCW5kLT5zZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwYXRoLT5kZW50cnktPmRfc2VxKTsKIAkJLyoKIAkJICogVXBkYXRlIHRoZSBpbm9kZSB0b28uIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgdGhlCkBAIC0xMjExLDYgKzEyMTQsOCBAQAogCQlwYXRoX3B1dF9jb25kaXRpb25hbChwYXRoLCBuZCk7CiAJCXJldHVybiBlcnI7CiAJfQorCWlmIChlcnIpCisJCW5kLT5mbGFncyB8PSBMT09LVVBfSlVNUEVEOwogCSppbm9kZSA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTgsMTEgKzE4MDMsMTEgQEAKIAlyZXR1cm4gX19sb29rdXBfaGFzaCgmdGhpcywgYmFzZSwgTlVMTCk7CiB9CiAKLWludCB1c2VyX3BhdGhfYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzLAotCQkgc3RydWN0IHBhdGggKnBhdGgpCitpbnQgdXNlcl9wYXRoX2F0X2VtcHR5KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKKwkJIHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgKmVtcHR5KQogewogCXN0cnVjdCBuYW1laWRhdGEgbmQ7Ci0JY2hhciAqdG1wID0gZ2V0bmFtZV9mbGFncyhuYW1lLCBmbGFncyk7CisJY2hhciAqdG1wID0gZ2V0bmFtZV9mbGFncyhuYW1lLCBmbGFncywgZW1wdHkpOwogCWludCBlcnIgPSBQVFJfRVJSKHRtcCk7CiAJaWYgKCFJU19FUlIodG1wKSkgewogCkBAIC0xODE2LDYgKzE4MjEsMTIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgdXNlcl9wYXRoX2F0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKKwkJIHN0cnVjdCBwYXRoICpwYXRoKQoreworCXJldHVybiB1c2VyX3BhdGhfYXRfZW1wdHkoZGZkLCBuYW1lLCBmbGFncywgcGF0aCwgMCk7Cit9CisKIHN0YXRpYyBpbnQgdXNlcl9wYXRoX3BhcmVudChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwKIAkJCXN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICoqbmFtZSkKIHsKQEAgLTIwMzUsMTAgKzIwNDYsNyBAQAogCWlmIChmbGFnICYgT19OT0FUSU1FICYmICFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCS8qCi0JICogRW5zdXJlIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyBsZWFzZXMgb24gdGhlIGZpbGUuCi0JICovCi0JcmV0dXJuIGJyZWFrX2xlYXNlKGlub2RlLCBmbGFnKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBoYW5kbGVfdHJ1bmNhdGUoc3RydWN0IGZpbGUgKmZpbHApCkBAIC0yMTQxLDYgKzIxNDksMTAgQEAKIAl9CiAKIAkvKiBjcmVhdGUgc2lkZSBvZiB0aGluZ3MgKi8KKwkvKgorCSAqIFRoaXMgd2lsbCAqb25seSogZGVhbCB3aXRoIGxlYXZpbmcgUkNVIG1vZGUgLSBMT09LVVBfSlVNUEVEIGhhcyBiZWVuCisJICogY2xlYXJlZCB3aGVuIHdlIGdvdCB0byB0aGUgbGFzdCBjb21wb25lbnQgd2UgYXJlIGFib3V0IHRvIGxvb2sgdXAKKwkgKi8KIAllcnJvciA9IGNvbXBsZXRlX3dhbGsobmQpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwpAQCAtMjIwOSw2ICsyMjIxLDkgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIGV4aXRfZHB1dDsKIAorCWlmIChlcnJvcikKKwkJbmQtPmZsYWdzIHw9IExPT0tVUF9KVU1QRUQ7CisKIAllcnJvciA9IC1FTk9FTlQ7CiAJaWYgKCFwYXRoLT5kZW50cnktPmRfaW5vZGUpCiAJCWdvdG8gZXhpdF9kcHV0OwpAQCAtMjIxOCw2ICsyMjMzLDEwIEBACiAKIAlwYXRoX3RvX25hbWVpZGF0YShwYXRoLCBuZCk7CiAJbmQtPmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOworCS8qIFdoeSB0aGlzLCB5b3UgYXNrPyAgX05vd18gd2UgbWlnaHQgaGF2ZSBncm93biBMT09LVVBfSlVNUEVELi4uICovCisJZXJyb3IgPSBjb21wbGV0ZV93YWxrKG5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXhpdDsKIAllcnJvciA9IC1FSVNESVI7CiAJaWYgKFNfSVNESVIobmQtPmlub2RlLT5pX21vZGUpKQogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGI0ZmViYjIuLmU1ZTFjN2QgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0xMTA5LDYgKzExMDksNyBAQAogCiAJLyogZGV2aWNlICovCiAJaWYgKG1udC0+bW50X3NiLT5zX29wLT5zaG93X2Rldm5hbWUpIHsKKwkJc2VxX3B1dHMobSwgImRldmljZSAiKTsKIAkJZXJyID0gbW50LT5tbnRfc2ItPnNfb3AtPnNob3dfZGV2bmFtZShtLCBtbnQpOwogCX0gZWxzZSB7CiAJCWlmIChtbnQtPm1udF9kZXZuYW1lKSB7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pbm9kZS5jIGIvZnMvbmNwZnMvaW5vZGUuYwppbmRleCAyMDJmMzcwLi41YjVmYTMzIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pbm9kZS5jCisrKyBiL2ZzL25jcGZzL2lub2RlLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiAJRERQUklOVEsoIm5jcF9yZWFkX2lub2RlOiBpbm9kZS0+aV9tb2RlID0gJXVcbiIsIGlub2RlLT5pX21vZGUpOwogCi0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJaW5vZGUtPmlfdWlkID0gc2VydmVyLT5tLnVpZDsKIAlpbm9kZS0+aV9naWQgPSBzZXJ2ZXItPm0uZ2lkOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKaW5kZXggOTE4YWQ2NC4uNzI2ZTU5YSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jCisrKyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwpAQCAtNDg4LDE3ICs0ODgsMTggQEAKIAkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCSAgICAgIHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzKQogewotCV9fYmUzMiAqcDsKKwl1aW50MzJfdCBiaXRtYXBbMl07CisJX19iZTMyICpwLCBzdGF0dXM7CiAKIAlhcmdzLT5jcmFhX2FkZHIgPSBzdmNfYWRkcihycXN0cCk7CiAJcCA9IHJlYWRfYnVmKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiBodG9ubChORlM0RVJSX0JBRFhEUik7CiAJYXJncy0+Y3JhYV9vYmpzX3RvX2tlZXAgPSBudG9obCgqcCsrKTsKLQlwID0gcmVhZF9idWYoeGRyLCA0KTsKLQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKLQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfQkFEWERSKTsKLQlhcmdzLT5jcmFhX3R5cGVfbWFzayA9IG50b2hsKCpwKTsKKwlzdGF0dXMgPSBkZWNvZGVfYml0bWFwKHhkciwgYml0bWFwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlhcmdzLT5jcmFhX3R5cGVfbWFzayA9IGJpdG1hcFswXTsKIAogCXJldHVybiAwOwogfQpAQCAtOTg2LDQgKzk4Nyw1IEBACiAJLnZzX3Byb2MgPSBuZnM0X2NhbGxiYWNrX3Byb2NlZHVyZXMxLAogCS52c194ZHJzaXplID0gTkZTNF9DQUxMQkFDS19YRFJTSVpFLAogCS52c19kaXNwYXRjaCA9IE5VTEwsCisJLnZzX2hpZGRlbiA9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggMjhiOGMzZi4uMGExZjgzMSAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC0xMzcsMTEgKzEzNyw5IEBACiBzdGF0aWMgaW50CiBuZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7Ci0KIAlkcHJpbnRrKCJORlM6IHJlbGVhc2UoJXMvJXMpXG4iLAotCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCi0JCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19WRlNSRUxFQVNFKTsKIAlyZXR1cm4gbmZzX3JlbGVhc2UoaW5vZGUsIGZpbHApOwpAQCAtMTgwLDggKzE3OCw2IEBACiAKIHN0YXRpYyBsb2ZmX3QgbmZzX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewotCWxvZmZfdCBsb2ZmOwotCiAJZHByaW50aygiTkZTOiBsbHNlZWsgZmlsZSglcy8lcywgJWxsZCwgJWQpXG4iLAogCQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAogCQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCkBAIC0xOTcsMTMgKzE5Myw5IEBACiAJCWludCByZXR2YWwgPSBuZnNfcmV2YWxpZGF0ZV9maWxlX3NpemUoaW5vZGUsIGZpbHApOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCXJldHVybiAobG9mZl90KXJldHZhbDsKKwl9CiAKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJbG9mZiA9IGdlbmVyaWNfZmlsZV9sbHNlZWtfdW5sb2NrZWQoZmlscCwgb2Zmc2V0LCBvcmlnaW4pOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JfSBlbHNlCi0JCWxvZmYgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbHAsIG9mZnNldCwgb3JpZ2luKTsKLQlyZXR1cm4gbG9mZjsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2xsc2VlayhmaWxwLCBvZmZzZXQsIG9yaWdpbik7CiB9CiAKIC8qCkBAIC0yMzQsMTQgKzIyNiwxMyBAQAogCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmVzdWx0OwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKIAogCWlmIChpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpCiAJCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CiAKIAlkcHJpbnRrKCJORlM6IHJlYWQoJXMvJXMsICVsdUAlbHUpXG4iLAogCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKwkJKHVuc2lnbmVkIGxvbmcpIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKSwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CiAKIAlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBpb2NiLT5raV9maWxwLT5mX21hcHBpbmcpOwogCWlmICghcmVzdWx0KSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IDRkYzZkMDcuLmMwN2E1NWEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJbWVtc2V0KCZpbm9kZS0+aV9jdGltZSwgMCwgc2l6ZW9mKGlub2RlLT5pX2N0aW1lKSk7CiAJCWlub2RlLT5pX3ZlcnNpb24gPSAwOwogCQlpbm9kZS0+aV9zaXplID0gMDsKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCWlub2RlLT5pX3VpZCA9IC0yOwogCQlpbm9kZS0+aV9naWQgPSAtMjsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJCXwgTkZTX0lOT19JTlZBTElEX0RBVEEKIAkJCQl8IE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfTkxJTkspCi0JCQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgZmF0dHItPm5saW5rKTsKIAkJZWxzZSBpZiAobmZzX3NlcnZlcl9jYXBhYmxlKGlub2RlLCBORlNfQ0FQX05MSU5LKSkKIAkJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwogCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfT1dORVIpCkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKIAkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7Ci0JCQlpbm9kZS0+aV9ubGluayA9IGZhdHRyLT5ubGluazsKKwkJCXNldF9ubGluayhpbm9kZSwgZmF0dHItPm5saW5rKTsKIAkJfQogCX0gZWxzZSBpZiAoc2VydmVyLT5jYXBzICYgTkZTX0NBUF9OTElOSykKIAkJaW52YWxpZCB8PSBzYXZlX2NhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fSU5WQUxJRF9BVFRSCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCmluZGV4IDA5MTE5NDEuLmE2MmQzNmIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJuZnM0ZmlsZWxheW91dC5oIgpAQCAtNDQ5LDkgKzQ1MCw4IEBACiAKIAlmbC0+ZHNhZGRyID0gZHNhZGRyOwogCi0JaWYgKGZsLT5maXJzdF9zdHJpcGVfaW5kZXggPCAwIHx8Ci0JICAgIGZsLT5maXJzdF9zdHJpcGVfaW5kZXggPj0gZHNhZGRyLT5zdHJpcGVfY291bnQpIHsKLQkJZHByaW50aygiJXMgQmFkIGZpcnN0X3N0cmlwZV9pbmRleCAlZFxuIiwKKwlpZiAoZmwtPmZpcnN0X3N0cmlwZV9pbmRleCA+PSBkc2FkZHItPnN0cmlwZV9jb3VudCkgeworCQlkcHJpbnRrKCIlcyBCYWQgZmlyc3Rfc3RyaXBlX2luZGV4ICV1XG4iLAogCQkJCV9fZnVuY19fLCBmbC0+Zmlyc3Rfc3RyaXBlX2luZGV4KTsKIAkJZ290byBvdXRfcHV0OwogCX0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCiAJLyogTm90ZSB0aGF0IGEgemVybyB2YWx1ZSBmb3IgbnVtX2ZoIGlzIGxlZ2FsIGZvciBTVFJJUEVfU1BBUlNFLgogCSAqIEZ1dGhlciBjaGVja2luZyBpcyBkb25lIGluIGZpbGVsYXlvdXRfY2hlY2tfbGF5b3V0ICovCi0JaWYgKGZsLT5udW1fZmggPCAwIHx8IGZsLT5udW1fZmggPgorCWlmIChmbC0+bnVtX2ZoID4KIAkgICAgbWF4KE5GUzRfUE5GU19NQVhfU1RSSVBFX0NOVCwgTkZTNF9QTkZTX01BWF9NVUxUSV9DTlQpKQogCQlnb3RvIG91dF9lcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggZDJhZTQxMy4uYjYwZmRkZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTU5NTAsNiArNTk1MCw3IEBACiB7CiAJc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywgKnRtcDsKKwl1bnNpZ25lZCBsb25nICpiaXRsb2NrID0gJk5GU19JKGRhdGEtPmFyZ3MuaW5vZGUpLT5mbGFnczsKIAogCXBuZnNfY2xlYW51cF9sYXlvdXRjb21taXQoZGF0YSk7CiAJLyogTWF0Y2hlZCBieSByZWZlcmVuY2VzIGluIHBuZnNfc2V0X2xheW91dGNvbW1pdCAqLwpAQCAtNTk1OSw2ICs1OTYwLDExIEBACiAJCQkJICAgICAgICZsc2VnLT5wbHNfZmxhZ3MpKQogCQkJcHV0X2xzZWcobHNlZyk7CiAJfQorCisJY2xlYXJfYml0X3VubG9jayhORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsIGJpdGxvY2spOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisJd2FrZV91cF9iaXQoYml0bG9jaywgTkZTX0lOT19MQVlPVVRDT01NSVRUSU5HKTsKKwogCXB1dF9ycGNjcmVkKGRhdGEtPmNyZWQpOwogCWtmcmVlKGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggMWRjZTEyZi4uZTYxNjFiMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC02NjAyLDggKzY2MDIsNiBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IGRlY29kZV9zZWNpbmZvKHhkciwgcmVzKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIG91dDsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqaW9fb3NkLmMKaW5kZXggZDBjZGExMi4uYzgwN2FiOSAxMDA2NDQKLS0tIGEvZnMvbmZzL29iamxheW91dC9vYmppb19vc2QuYworKysgYi9mcy9uZnMvb2JqbGF5b3V0L29iamlvX29zZC5jCkBAIC0zOCwyMSArMzgsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c2NzaS9vc2RfaW5pdGlhdG9yLmg+CisjaW5jbHVkZSA8c2NzaS9vc2Rfb3JlLmg+CiAKICNpbmNsdWRlICJvYmpsYXlvdXQuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgICAgICAgICBORlNEQkdfUE5GU19MRAogCi0jZGVmaW5lIF9MTFUoeCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpeCkKLQotZW51bSB7IEJJT19NQVhfUEFHRVNfS01BTExPQyA9Ci0JCShQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGJpbykpIC8gc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwKLX07Ci0KIHN0cnVjdCBvYmppb19kZXZfZW50IHsKIAlzdHJ1Y3QgbmZzNF9kZXZpY2VpZF9ub2RlIGlkX25vZGU7Ci0Jc3RydWN0IG9zZF9kZXYgKm9kOworCXN0cnVjdCBvcmVfZGV2IG9kOwogfTsKIAogc3RhdGljIHZvaWQKQEAgLTYwLDggKzU0LDggQEAKIHsKIAlzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqZGUgPSBjb250YWluZXJfb2YoZCwgc3RydWN0IG9iamlvX2Rldl9lbnQsIGlkX25vZGUpOwogCi0JZHByaW50aygiJXM6IGZyZWUgb2Q9JXBcbiIsIF9fZnVuY19fLCBkZS0+b2QpOwotCW9zZHVsZF9wdXRfZGV2aWNlKGRlLT5vZCk7CisJZHByaW50aygiJXM6IGZyZWUgb2Q9JXBcbiIsIF9fZnVuY19fLCBkZS0+b2Qub2QpOworCW9zZHVsZF9wdXRfZGV2aWNlKGRlLT5vZC5vZCk7CiAJa2ZyZWUoZGUpOwogfQogCkBAIC05OCwxMiArOTIsMTIgQEAKIAkJCQluZnNzLT5wbmZzX2N1cnJfbGQsCiAJCQkJbmZzcy0+bmZzX2NsaWVudCwKIAkJCQlkX2lkKTsKLQlkZS0+b2QgPSBvZDsKKwlkZS0+b2Qub2QgPSBvZDsKIAogCWQgPSBuZnM0X2luc2VydF9kZXZpY2VpZF9ub2RlKCZkZS0+aWRfbm9kZSk7CiAJbiA9IGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgb2JqaW9fZGV2X2VudCwgaWRfbm9kZSk7CiAJaWYgKG4gIT0gZGUpIHsKLQkJZHByaW50aygiJXM6IFJhY2Ugd2l0aCBvdGhlciBuLT5vZD0lcFxuIiwgX19mdW5jX18sIG4tPm9kKTsKKwkJZHByaW50aygiJXM6IFJhY2Ugd2l0aCBvdGhlciBuLT5vZD0lcFxuIiwgX19mdW5jX18sIG4tPm9kLm9kKTsKIAkJb2JqaW9fZnJlZV9kZXZpY2VpZF9ub2RlKCZkZS0+aWRfbm9kZSk7CiAJCWRlID0gbjsKIAl9CkBAIC0xMTEsMjggKzEwNSwxMSBAQAogCXJldHVybiBkZTsKIH0KIAotc3RydWN0IGNhcHNfYnVmZmVycyB7Ci0JdTggY2Fwc19rZXlbT1NEX0NSWVBUT19LRVlJRF9TSVpFXTsKLQl1OCBjcmVkc1tPU0RfQ0FQX0xFTl07Ci19OwotCiBzdHJ1Y3Qgb2JqaW9fc2VnbWVudCB7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgbHNlZzsKIAotCXN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCAqY29tcHM7Ci0KLQl1bnNpZ25lZCBtaXJyb3JzX3AxOwotCXVuc2lnbmVkIHN0cmlwZV91bml0OwotCXVuc2lnbmVkIGdyb3VwX3dpZHRoOwkvKiBEYXRhIHN0cmlwZV91bml0cyB3aXRob3V0IGludGVncml0eSBjb21wcyAqLwotCXU2NCBncm91cF9kZXB0aDsKLQl1bnNpZ25lZCBncm91cF9jb3VudDsKLQotCXVuc2lnbmVkIG1heF9pb19zaXplOwotCi0JdW5zaWduZWQgY29tcHNfaW5kZXg7Ci0JdW5zaWduZWQgbnVtX2NvbXBzOwotCS8qIHZhcmlhYmxlIGxlbmd0aCAqLwotCXN0cnVjdCBvYmppb19kZXZfZW50ICpvZHNbXTsKKwlzdHJ1Y3Qgb3JlX2xheW91dCBsYXlvdXQ7CisJc3RydWN0IG9yZV9jb21wb25lbnRzIG9jOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqCkBAIC0xNDEsNTkgKzExOCw0NCBAQAogCXJldHVybiBjb250YWluZXJfb2YobHNlZywgc3RydWN0IG9iamlvX3NlZ21lbnQsIGxzZWcpOwogfQogCi1zdHJ1Y3Qgb2JqaW9fc3RhdGU7Ci10eXBlZGVmIHNzaXplX3QgKCpvYmppb19kb25lX2ZuKShzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyk7Ci0KIHN0cnVjdCBvYmppb19zdGF0ZSB7CiAJLyogR2VuZXJpYyBsYXllciAqLwotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgb2xfc3RhdGU7CisJc3RydWN0IG9iamxheW91dF9pb19yZXMgb2lyOwogCi0Jc3RydWN0IG9iamlvX3NlZ21lbnQgKmxheW91dDsKLQotCXN0cnVjdCBrcmVmIGtyZWY7Ci0Jb2JqaW9fZG9uZV9mbiBkb25lOwotCXZvaWQgKnByaXZhdGU7Ci0KLQl1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQl1bnNpZ25lZCBudW1kZXZzOyAvKiBBY3R1YWxseSB1c2VkIGRldnMgaW4gdGhpcyBJTyAqLwotCS8qIEEgcGVyLWRldmljZSB2YXJpYWJsZSBhcnJheSBvZiBzaXplIG51bWRldnMgKi8KLQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wIHsKLQkJc3RydWN0IGJpbyAqYmlvOwotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yOwotCQl1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQkJdTY0IG9mZnNldDsKLQkJdW5zaWduZWQgZGV2OwotCX0gcGVyX2RldltdOworCWJvb2wgc3luYzsKKwkvKkZJWE1FOiBTdXBwb3J0IGZvciBleHRyYV9ieXRlcyBhdCBvcmVfZ2V0X3J3X3N0YXRlKCkgKi8KKwlzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3M7CiB9OwogCiAvKiBTZW5kIGFuZCB3YWl0IGZvciBhIGdldF9kZXZpY2VfaW5mbyBvZiBkZXZpY2VzIGluIHRoZSBsYXlvdXQsCiAgICB0aGVuIGxvb2sgdGhlbSB1cCB3aXRoIHRoZSBvc2RfaW5pdGlhdG9yIGxpYnJhcnkgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqX2RldmljZV9sb29rdXAoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc2xheSwKLQkJCQlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnLCB1bnNpZ25lZCBjb21wLAotCQkJCWdmcF90IGdmcF9mbGFncykKK3N0YXRpYyBpbnQgb2JqaW9fZGV2aWNlc19sb29rdXAoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc2xheSwKKwlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnLCB1bnNpZ25lZCBjLCBzdHJ1Y3QgbmZzNF9kZXZpY2VpZCAqZF9pZCwKKwlnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHBuZnNfb3NkX2RldmljZWFkZHIgKmRldmljZWFkZHI7Ci0Jc3RydWN0IG5mczRfZGV2aWNlaWQgKmRfaWQ7CiAJc3RydWN0IG9iamlvX2Rldl9lbnQgKm9kZTsKIAlzdHJ1Y3Qgb3NkX2RldiAqb2Q7CiAJc3RydWN0IG9zZF9kZXZfaW5mbyBvZGk7CiAJaW50IGVycjsKIAotCWRfaWQgPSAmb2JqaW9fc2VnLT5jb21wc1tjb21wXS5vY19vYmplY3RfaWQub2lkX2RldmljZV9pZDsKLQogCW9kZSA9IF9kZXZfbGlzdF9maW5kKE5GU19TRVJWRVIocG5mc2xheS0+cGxoX2lub2RlKSwgZF9pZCk7Ci0JaWYgKG9kZSkKLQkJcmV0dXJuIG9kZTsKKwlpZiAob2RlKSB7CisJCW9iamlvX3NlZy0+b2Mub2RzW2NdID0gJm9kZS0+b2Q7IC8qIG11c3QgdXNlIGNvbnRhaW5lcl9vZiAqLworCQlyZXR1cm4gMDsKKwl9CiAKIAllcnIgPSBvYmpsYXlvdXRfZ2V0X2RldmljZWluZm8ocG5mc2xheSwgZF9pZCwgJmRldmljZWFkZHIsIGdmcF9mbGFncyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZHByaW50aygiJXM6IG9iamxheW91dF9nZXRfZGV2aWNlaW5mbyBkZXYoJWxseDolbGx4KSA9PiVkXG4iLAogCQkJX19mdW5jX18sIF9ERVZJRF9MTyhkX2lkKSwgX0RFVklEX0hJKGRfaWQpLCBlcnIpOwotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCW9kaS5zeXN0ZW1pZF9sZW4gPSBkZXZpY2VhZGRyLT5vZGFfc3lzdGVtaWQubGVuOwogCWlmIChvZGkuc3lzdGVtaWRfbGVuID4gc2l6ZW9mKG9kaS5zeXN0ZW1pZCkpIHsKKwkJZHByaW50aygiJXM6IG9kaS5zeXN0ZW1pZF9sZW4gPiBzaXplb2Yoc3lzdGVtaWQ9JXpkKVxuIiwKKwkJCV9fZnVuY19fLCBzaXplb2Yob2RpLnN5c3RlbWlkKSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAob2RpLnN5c3RlbWlkX2xlbikKQEAgLTIxOCw5NCArMTgwLDUxIEBACiAKIAlvZGUgPSBfZGV2X2xpc3RfYWRkKE5GU19TRVJWRVIocG5mc2xheS0+cGxoX2lub2RlKSwgZF9pZCwgb2QsCiAJCQkgICAgZ2ZwX2ZsYWdzKTsKLQorCW9iamlvX3NlZy0+b2Mub2RzW2NdID0gJm9kZS0+b2Q7IC8qIG11c3QgdXNlIGNvbnRhaW5lcl9vZiAqLworCWRwcmludGsoIkFkZGluZyBuZXcgZGV2X2lkKCVsbHg6JWxseClcbiIsCisJCV9ERVZJRF9MTyhkX2lkKSwgX0RFVklEX0hJKGRfaWQpKTsKIG91dDoKLQlkcHJpbnRrKCIlczogcmV0dXJuPSVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAlvYmpsYXlvdXRfcHV0X2RldmljZWluZm8oZGV2aWNlYWRkcik7Ci0JcmV0dXJuIGVyciA/IEVSUl9QVFIoZXJyKSA6IG9kZTsKLX0KLQotc3RhdGljIGludCBvYmppb19kZXZpY2VzX2xvb2t1cChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzbGF5LAotCXN0cnVjdCBvYmppb19zZWdtZW50ICpvYmppb19zZWcsCi0JZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIGk7Ci0JaW50IGVycjsKLQotCS8qIGxvb2t1cCBhbGwgZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBvYmppb19zZWctPm51bV9jb21wczsgaSsrKSB7Ci0JCXN0cnVjdCBvYmppb19kZXZfZW50ICpvZGU7Ci0KLQkJb2RlID0gX2RldmljZV9sb29rdXAocG5mc2xheSwgb2JqaW9fc2VnLCBpLCBnZnBfZmxhZ3MpOwotCQlpZiAodW5saWtlbHkoSVNfRVJSKG9kZSkpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKG9kZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlvYmppb19zZWctPm9kc1tpXSA9IG9kZTsKLQl9Ci0JZXJyID0gMDsKLQotb3V0OgotCWRwcmludGsoIiVzOiByZXR1cm49JWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX3ZlcmlmeV9kYXRhX21hcChzdHJ1Y3QgcG5mc19vc2RfbGF5b3V0ICpsYXlvdXQpCitzdGF0aWMgdm9pZCBjb3B5X3NpbmdsZV9jb21wKHN0cnVjdCBvcmVfY29tcG9uZW50cyAqb2MsIHVuc2lnbmVkIGMsCisJCQkgICAgIHN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCAqc3JjX2NvbXApCiB7Ci0Jc3RydWN0IHBuZnNfb3NkX2RhdGFfbWFwICpkYXRhX21hcCA9ICZsYXlvdXQtPm9sb19tYXA7Ci0JdTY0IHN0cmlwZV9sZW5ndGg7Ci0JdTMyIGdyb3VwX3dpZHRoOworCXN0cnVjdCBvcmVfY29tcCAqb2NvbXAgPSAmb2MtPmNvbXBzW2NdOwogCi0vKiBGSVhNRTogT25seSByYWlkMCBmb3Igbm93LiBpZiBub3QgZ28gdGhyb3VnaCBNRFMgKi8KLQlpZiAoZGF0YV9tYXAtPm9kbV9yYWlkX2FsZ29yaXRobSAhPSBQTkZTX09TRF9SQUlEXzApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJPbmx5IFJBSURfMCBmb3Igbm93XG4iKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0JaWYgKDAgIT0gKGRhdGFfbWFwLT5vZG1fbnVtX2NvbXBzICUgKGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCArIDEpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRhdGEgTWFwIHdyb25nLCBudW1fY29tcHM9JXUgbWlycm9ycz0ldVxuIiwKLQkJCSAgZGF0YV9tYXAtPm9kbV9udW1fY29tcHMsIGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlXQVJOX09OKHNyY19jb21wLT5vY19jYXBfa2V5LmNyZWRfbGVuID4gMCk7IC8qIGxpYm9zZCBpcyBOT19TRUMgb25seSAqLworCVdBUk5fT04oc3JjX2NvbXAtPm9jX2NhcC5jcmVkX2xlbiA+IHNpemVvZihvY29tcC0+Y3JlZCkpOwogCi0JaWYgKGRhdGFfbWFwLT5vZG1fZ3JvdXBfd2lkdGgpCi0JCWdyb3VwX3dpZHRoID0gZGF0YV9tYXAtPm9kbV9ncm91cF93aWR0aDsKLQllbHNlCi0JCWdyb3VwX3dpZHRoID0gZGF0YV9tYXAtPm9kbV9udW1fY29tcHMgLwotCQkJCQkJKGRhdGFfbWFwLT5vZG1fbWlycm9yX2NudCArIDEpOworCW9jb21wLT5vYmoucGFydGl0aW9uID0gc3JjX2NvbXAtPm9jX29iamVjdF9pZC5vaWRfcGFydGl0aW9uX2lkOworCW9jb21wLT5vYmouaWQgPSBzcmNfY29tcC0+b2Nfb2JqZWN0X2lkLm9pZF9vYmplY3RfaWQ7CiAKLQlzdHJpcGVfbGVuZ3RoID0gKHU2NClkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0ICogZ3JvdXBfd2lkdGg7Ci0JaWYgKHN0cmlwZV9sZW5ndGggPj0gKDFVTEwgPDwgMzIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVG90YWwgU3RyaXBlIGxlbmd0aCgweCVsbHgpIgotCQkJICAiID49IDMyYml0IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9MTFUoc3RyaXBlX2xlbmd0aCkpOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQotCWlmICgwICE9IChkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0ICYgflBBR0VfTUFTSykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTdHJpcGUgVW5pdCgweCVsbHgpIgotCQkJICAiIG11c3QgYmUgTXVsdHBsZXMgb2YgUEFHRV9TSVpFKDB4JWx4KVxuIiwKLQkJCSAgX0xMVShkYXRhX21hcC0+b2RtX3N0cmlwZV91bml0KSwgUEFHRV9TSVpFKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwltZW1jcHkob2NvbXAtPmNyZWQsIHNyY19jb21wLT5vY19jYXAuY3JlZCwgc2l6ZW9mKG9jb21wLT5jcmVkKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlfc2luZ2xlX2NvbXAoc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjdXJfY29tcCwKLQkJCSAgICAgc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpzcmNfY29tcCwKLQkJCSAgICAgc3RydWN0IGNhcHNfYnVmZmVycyAqY2Fwc19wKQoraW50IF9fYWxsb2Nfb2JqaW9fc2VnKHVuc2lnbmVkIG51bWRldnMsIGdmcF90IGdmcF9mbGFncywKKwkJICAgICAgIHN0cnVjdCBvYmppb19zZWdtZW50ICoqcHNlZykKIHsKLQlXQVJOX09OKHNyY19jb21wLT5vY19jYXBfa2V5LmNyZWRfbGVuID4gc2l6ZW9mKGNhcHNfcC0+Y2Fwc19rZXkpKTsKLQlXQVJOX09OKHNyY19jb21wLT5vY19jYXAuY3JlZF9sZW4gPiBzaXplb2YoY2Fwc19wLT5jcmVkcykpOworCXN0cnVjdCBfX2FsbG9jX29iamlvX3NlZ21lbnQgeworCQlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCBvbHNlZzsKKwkJc3RydWN0IG9yZV9kZXYgKm9kc1tudW1kZXZzXTsKKwkJc3RydWN0IG9yZV9jb21wCWNvbXBzW251bWRldnNdOworCX0gKmFvbHNlZzsKIAotCSpjdXJfY29tcCA9ICpzcmNfY29tcDsKKwlhb2xzZWcgPSBremFsbG9jKHNpemVvZigqYW9sc2VnKSwgZ2ZwX2ZsYWdzKTsKKwlpZiAodW5saWtlbHkoIWFvbHNlZykpIHsKKwkJZHByaW50aygiJXM6IEZhaWxkIGFsbG9jYXRpb24gbnVtZGV2cz0lZCBzaXplPSV6ZFxuIiwgX19mdW5jX18sCisJCQludW1kZXZzLCBzaXplb2YoKmFvbHNlZykpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLQltZW1jcHkoY2Fwc19wLT5jYXBzX2tleSwgc3JjX2NvbXAtPm9jX2NhcF9rZXkuY3JlZCwKLQkgICAgICAgc2l6ZW9mKGNhcHNfcC0+Y2Fwc19rZXkpKTsKLQljdXJfY29tcC0+b2NfY2FwX2tleS5jcmVkID0gY2Fwc19wLT5jYXBzX2tleTsKKwlhb2xzZWctPm9sc2VnLm9jLm51bWRldnMgPSBudW1kZXZzOworCWFvbHNlZy0+b2xzZWcub2Muc2luZ2xlX2NvbXAgPSBFQ19NVUxUUExFX0NPTVBTOworCWFvbHNlZy0+b2xzZWcub2MuY29tcHMgPSBhb2xzZWctPmNvbXBzOworCWFvbHNlZy0+b2xzZWcub2Mub2RzID0gYW9sc2VnLT5vZHM7CiAKLQltZW1jcHkoY2Fwc19wLT5jcmVkcywgc3JjX2NvbXAtPm9jX2NhcC5jcmVkLAotCSAgICAgICBzaXplb2YoY2Fwc19wLT5jcmVkcykpOwotCWN1cl9jb21wLT5vY19jYXAuY3JlZCA9IGNhcHNfcC0+Y3JlZHM7CisJKnBzZWcgPSAmYW9sc2VnLT5vbHNlZzsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG9iamlvX2FsbG9jX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKipvdXRwLApAQCAtMzE3LDU5ICsyMzYsNDMgQEAKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnOwogCXN0cnVjdCBwbmZzX29zZF94ZHJfZGVjb2RlX2xheW91dF9pdGVyIGl0ZXI7CiAJc3RydWN0IHBuZnNfb3NkX2xheW91dCBsYXlvdXQ7Ci0Jc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjdXJfY29tcCwgc3JjX2NvbXA7Ci0Jc3RydWN0IGNhcHNfYnVmZmVycyAqY2Fwc19wOworCXN0cnVjdCBwbmZzX29zZF9vYmplY3RfY3JlZCBzcmNfY29tcDsKKwl1bnNpZ25lZCBjdXJfY29tcDsKIAlpbnQgZXJyOwogCiAJZXJyID0gcG5mc19vc2RfeGRyX2RlY29kZV9sYXlvdXRfbWFwKCZsYXlvdXQsICZpdGVyLCB4ZHIpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gX3ZlcmlmeV9kYXRhX21hcCgmbGF5b3V0KTsKKwllcnIgPSBfX2FsbG9jX29iamlvX3NlZyhsYXlvdXQub2xvX251bV9jb21wcywgZ2ZwX2ZsYWdzLCAmb2JqaW9fc2VnKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAotCW9iamlvX3NlZyA9IGt6YWxsb2Moc2l6ZW9mKCpvYmppb19zZWcpICsKLQkJCSAgICBzaXplb2Yob2JqaW9fc2VnLT5vZHNbMF0pICogbGF5b3V0Lm9sb19udW1fY29tcHMgKwotCQkJICAgIHNpemVvZigqb2JqaW9fc2VnLT5jb21wcykgKiBsYXlvdXQub2xvX251bV9jb21wcyArCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjYXBzX2J1ZmZlcnMpICogbGF5b3V0Lm9sb19udW1fY29tcHMsCi0JCQkgICAgZ2ZwX2ZsYWdzKTsKLQlpZiAoIW9iamlvX3NlZykKLQkJcmV0dXJuIC1FTk9NRU07CisJb2JqaW9fc2VnLT5sYXlvdXQuc3RyaXBlX3VuaXQgPSBsYXlvdXQub2xvX21hcC5vZG1fc3RyaXBlX3VuaXQ7CisJb2JqaW9fc2VnLT5sYXlvdXQuZ3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfd2lkdGg7CisJb2JqaW9fc2VnLT5sYXlvdXQuZ3JvdXBfZGVwdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfZGVwdGg7CisJb2JqaW9fc2VnLT5sYXlvdXQubWlycm9yc19wMSA9IGxheW91dC5vbG9fbWFwLm9kbV9taXJyb3JfY250ICsgMTsKKwlvYmppb19zZWctPmxheW91dC5yYWlkX2FsZ29yaXRobSA9IGxheW91dC5vbG9fbWFwLm9kbV9yYWlkX2FsZ29yaXRobTsKIAotCW9iamlvX3NlZy0+Y29tcHMgPSAodm9pZCAqKShvYmppb19zZWctPm9kcyArIGxheW91dC5vbG9fbnVtX2NvbXBzKTsKLQljdXJfY29tcCA9IG9iamlvX3NlZy0+Y29tcHM7Ci0JY2Fwc19wID0gKHZvaWQgKikoY3VyX2NvbXAgKyBsYXlvdXQub2xvX251bV9jb21wcyk7Ci0Jd2hpbGUgKHBuZnNfb3NkX3hkcl9kZWNvZGVfbGF5b3V0X2NvbXAoJnNyY19jb21wLCAmaXRlciwgeGRyLCAmZXJyKSkKLQkJY29weV9zaW5nbGVfY29tcChjdXJfY29tcCsrLCAmc3JjX2NvbXAsIGNhcHNfcCsrKTsKKwllcnIgPSBvcmVfdmVyaWZ5X2xheW91dChsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzLAorCQkJCQkgICZvYmppb19zZWctPmxheW91dCk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXJyOwogCi0Jb2JqaW9fc2VnLT5udW1fY29tcHMgPSBsYXlvdXQub2xvX251bV9jb21wczsKLQlvYmppb19zZWctPmNvbXBzX2luZGV4ID0gbGF5b3V0Lm9sb19jb21wc19pbmRleDsKLQllcnIgPSBvYmppb19kZXZpY2VzX2xvb2t1cChwbmZzbGF5LCBvYmppb19zZWcsIGdmcF9mbGFncyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnI7Ci0KLQlvYmppb19zZWctPm1pcnJvcnNfcDEgPSBsYXlvdXQub2xvX21hcC5vZG1fbWlycm9yX2NudCArIDE7Ci0Jb2JqaW9fc2VnLT5zdHJpcGVfdW5pdCA9IGxheW91dC5vbG9fbWFwLm9kbV9zdHJpcGVfdW5pdDsKLQlpZiAobGF5b3V0Lm9sb19tYXAub2RtX2dyb3VwX3dpZHRoKSB7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfd2lkdGg7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfZGVwdGggPSBsYXlvdXQub2xvX21hcC5vZG1fZ3JvdXBfZGVwdGg7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfY291bnQgPSBsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzIC8KLQkJCQkJCW9iamlvX3NlZy0+bWlycm9yc19wMSAvCi0JCQkJCQlvYmppb19zZWctPmdyb3VwX3dpZHRoOwotCX0gZWxzZSB7Ci0JCW9iamlvX3NlZy0+Z3JvdXBfd2lkdGggPSBsYXlvdXQub2xvX21hcC5vZG1fbnVtX2NvbXBzIC8KLQkJCQkJCW9iamlvX3NlZy0+bWlycm9yc19wMTsKLQkJb2JqaW9fc2VnLT5ncm91cF9kZXB0aCA9IC0xOwotCQlvYmppb19zZWctPmdyb3VwX2NvdW50ID0gMTsKKwlvYmppb19zZWctPm9jLmZpcnN0X2RldiA9IGxheW91dC5vbG9fY29tcHNfaW5kZXg7CisJY3VyX2NvbXAgPSAwOworCXdoaWxlIChwbmZzX29zZF94ZHJfZGVjb2RlX2xheW91dF9jb21wKCZzcmNfY29tcCwgJml0ZXIsIHhkciwgJmVycikpIHsKKwkJY29weV9zaW5nbGVfY29tcCgmb2JqaW9fc2VnLT5vYywgY3VyX2NvbXAsICZzcmNfY29tcCk7CisJCWVyciA9IG9iamlvX2RldmljZXNfbG9va3VwKHBuZnNsYXksIG9iamlvX3NlZywgY3VyX2NvbXAsCisJCQkJCSAgICZzcmNfY29tcC5vY19vYmplY3RfaWQub2lkX2RldmljZV9pZCwKKwkJCQkJICAgZ2ZwX2ZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCQkrK2N1cl9jb21wOwogCX0KLQotCS8qIENhY2hlIHRoaXMgY2FsY3VsYXRpb24gaXQgd2lsbCBoaXQgZm9yIGV2ZXJ5IHBhZ2UgKi8KLQlvYmppb19zZWctPm1heF9pb19zaXplID0gKEJJT19NQVhfUEFHRVNfS01BTExPQyAqIFBBR0VfU0laRSAtCi0JCQkJICBvYmppb19zZWctPnN0cmlwZV91bml0KSAqCi0JCQkJIG9iamlvX3NlZy0+Z3JvdXBfd2lkdGg7CisJLyogcG5mc19vc2RfeGRyX2RlY29kZV9sYXlvdXRfY29tcCByZXR1cm5zIGZhbHNlIG9uIGVycm9yICovCisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gZXJyOwogCiAJKm91dHAgPSAmb2JqaW9fc2VnLT5sc2VnOwogCXJldHVybiAwOwpAQCAtMzg2LDQzICsyODksNjMgQEAKIAlpbnQgaTsKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnID0gT0JKSU9fTFNFRyhsc2VnKTsKIAotCWZvciAoaSA9IDA7IGkgPCBvYmppb19zZWctPm51bV9jb21wczsgaSsrKSB7Ci0JCWlmICghb2JqaW9fc2VnLT5vZHNbaV0pCisJZm9yIChpID0gMDsgaSA8IG9iamlvX3NlZy0+b2MubnVtZGV2czsgaSsrKSB7CisJCXN0cnVjdCBvcmVfZGV2ICpvZCA9IG9iamlvX3NlZy0+b2Mub2RzW2ldOworCQlzdHJ1Y3Qgb2JqaW9fZGV2X2VudCAqb2RlOworCisJCWlmICghb2QpCiAJCQlicmVhazsKLQkJbmZzNF9wdXRfZGV2aWNlaWRfbm9kZSgmb2JqaW9fc2VnLT5vZHNbaV0tPmlkX25vZGUpOworCQlvZGUgPSBjb250YWluZXJfb2Yob2QsIHR5cGVvZigqb2RlKSwgb2QpOworCQluZnM0X3B1dF9kZXZpY2VpZF9ub2RlKCZvZGUtPmlkX25vZGUpOwogCX0KIAlrZnJlZShvYmppb19zZWcpOwogfQogCi1pbnQgb2JqaW9fYWxsb2NfaW9fc3RhdGUoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCi0JCQkgc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqKm91dHAsCi0JCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKQorc3RhdGljIGludAorb2JqaW9fYWxsb2NfaW9fc3RhdGUoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqcG5mc19sYXlvdXRfdHlwZSwgYm9vbCBpc19yZWFkaW5nLAorCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBwZ2Jhc2UsCisJbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50LCB2b2lkICpycGNkYXRhLCBnZnBfdCBnZnBfZmxhZ3MsCisJc3RydWN0IG9iamlvX3N0YXRlICoqb3V0cCkKIHsKIAlzdHJ1Y3Qgb2JqaW9fc2VnbWVudCAqb2JqaW9fc2VnID0gT0JKSU9fTFNFRyhsc2VnKTsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvczsKLQljb25zdCB1bnNpZ25lZCBmaXJzdF9zaXplID0gc2l6ZW9mKCppb3MpICsKLQkJCQlvYmppb19zZWctPm51bV9jb21wcyAqIHNpemVvZihpb3MtPnBlcl9kZXZbMF0pOwotCWNvbnN0IHVuc2lnbmVkIHNlY19zaXplID0gb2JqaW9fc2VnLT5udW1fY29tcHMgKgotCQkJCQkJc2l6ZW9mKGlvcy0+b2xfc3RhdGUuaW9lcnJzWzBdKTsKKwlzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3M7CisJaW50IHJldDsKKwlzdHJ1Y3QgX19hbGxvY19vYmppb19zdGF0ZSB7CisJCXN0cnVjdCBvYmppb19zdGF0ZSBvYmppb3M7CisJCXN0cnVjdCBwbmZzX29zZF9pb2VyciBpb2VycnNbb2JqaW9fc2VnLT5vYy5udW1kZXZzXTsKKwl9ICphb3M7CiAKLQlpb3MgPSBremFsbG9jKGZpcnN0X3NpemUgKyBzZWNfc2l6ZSwgZ2ZwX2ZsYWdzKTsKLQlpZiAodW5saWtlbHkoIWlvcykpCisJYW9zID0ga3phbGxvYyhzaXplb2YoKmFvcyksIGdmcF9mbGFncyk7CisJaWYgKHVubGlrZWx5KCFhb3MpKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlvcy0+bGF5b3V0ID0gb2JqaW9fc2VnOwotCWlvcy0+b2xfc3RhdGUuaW9lcnJzID0gKCh2b2lkICopaW9zKSArIGZpcnN0X3NpemU7Ci0JaW9zLT5vbF9zdGF0ZS5udW1fY29tcHMgPSBvYmppb19zZWctPm51bV9jb21wczsKKwlvYmpsYXlvdXRfaW5pdF9pb2VycnMoJmFvcy0+b2JqaW9zLm9pciwgb2JqaW9fc2VnLT5vYy5udW1kZXZzLAorCQkJYW9zLT5pb2VycnMsIHJwY2RhdGEsIHBuZnNfbGF5b3V0X3R5cGUpOwogCi0JKm91dHAgPSAmaW9zLT5vbF9zdGF0ZTsKKwlyZXQgPSBvcmVfZ2V0X3J3X3N0YXRlKCZvYmppb19zZWctPmxheW91dCwgJm9iamlvX3NlZy0+b2MsIGlzX3JlYWRpbmcsCisJCQkgICAgICAgb2Zmc2V0LCBjb3VudCwgJmlvcyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJa2ZyZWUoYW9zKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpb3MtPnBhZ2VzID0gcGFnZXM7CisJaW9zLT5wZ2Jhc2UgPSBwZ2Jhc2U7CisJaW9zLT5wcml2YXRlID0gYW9zOworCUJVR19PTihpb3MtPm5yX3BhZ2VzID4gKHBnYmFzZSArIGNvdW50ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVCk7CisKKwlhb3MtPm9iamlvcy5zeW5jID0gMDsKKwlhb3MtPm9iamlvcy5pb3MgPSBpb3M7CisJKm91dHAgPSAmYW9zLT5vYmppb3M7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgb2JqaW9fZnJlZV9pb19zdGF0ZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpvbF9zdGF0ZSkKK3ZvaWQgb2JqaW9fZnJlZV9yZXN1bHQoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pcikKIHsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zID0gY29udGFpbmVyX29mKG9pciwgc3RydWN0IG9iamlvX3N0YXRlLCBvaXIpOwogCi0Ja2ZyZWUoaW9zKTsKKwlvcmVfcHV0X2lvX3N0YXRlKG9iamlvcy0+aW9zKTsKKwlrZnJlZShvYmppb3MpOwogfQogCiBlbnVtIHBuZnNfb3NkX2Vycm5vIG9zZF9wcmlfMl9wbmZzX2VycihlbnVtIG9zZF9lcnJfcHJpb3JpdHkgb2VwKQpAQCAtNDU1LDUzOSArMzc4LDE1MiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX2NsZWFyX2JpbyhzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgdm9pZCBfX29uX2Rldl9lcnJvcihzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3MsCisJc3RydWN0IG9yZV9kZXYgKm9kLCB1bnNpZ25lZCBkZXZfaW5kZXgsIGVudW0gb3NkX2Vycl9wcmlvcml0eSBvZXAsCisJdTY0IGRldl9vZmZzZXQsIHU2NCAgZGV2X2xlbikKIHsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JdW5zaWduZWQgaTsKKwlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKm9iamlvcyA9IGlvcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcG5mc19vc2Rfb2JqaWQgcG9vaWQ7CisJc3RydWN0IG9iamlvX2Rldl9lbnQgKm9kZSA9IGNvbnRhaW5lcl9vZihvZCwgdHlwZW9mKCpvZGUpLCBvZCk7CisJLyogRklYTUU6IHdoYXQgdG8gZG8gd2l0aCBtb3JlLXRoZW4tb25lLWdyb3VwIGxheW91dHMuIFdlIG5lZWQgdG8KKwkgKiB0cmFuc2xhdGUgZnJvbSBvcmVfaW9fc3RhdGUgaW5kZXggdG8gb2MtPmNvbXBzIGluZGV4CisJICovCisJdW5zaWduZWQgY29tcCA9IGRldl9pbmRleDsKIAotCV9fYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpbywgaSwgMCkgewotCQl1bnNpZ25lZCB0aGlzX2NvdW50ID0gYnYtPmJ2X2xlbjsKKwlwb29pZC5vaWRfZGV2aWNlX2lkID0gb2RlLT5pZF9ub2RlLmRldmljZWlkOworCXBvb2lkLm9pZF9wYXJ0aXRpb25faWQgPSBpb3MtPm9jLT5jb21wc1tjb21wXS5vYmoucGFydGl0aW9uOworCXBvb2lkLm9pZF9vYmplY3RfaWQgPSBpb3MtPm9jLT5jb21wc1tjb21wXS5vYmouaWQ7CiAKLQkJaWYgKGxpa2VseShQQUdFX1NJWkUgPT0gdGhpc19jb3VudCkpCi0JCQljbGVhcl9oaWdocGFnZShidi0+YnZfcGFnZSk7Ci0JCWVsc2UKLQkJCXplcm9fdXNlcihidi0+YnZfcGFnZSwgYnYtPmJ2X29mZnNldCwgdGhpc19jb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9pb19jaGVjayhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgYm9vbCBpc193cml0ZSkKLXsKLQllbnVtIG9zZF9lcnJfcHJpb3JpdHkgb2VwID0gT1NEX0VSUl9QUklfTk9fRVJST1I7Ci0JaW50IGxpbl9yZXQgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8ICBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3Qgb3NkX3NlbnNlX2luZm8gb3NpOwotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gaW9zLT5wZXJfZGV2W2ldLm9yOwotCQlpbnQgcmV0OwotCi0JCWlmICghb3IpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBvc2RfcmVxX2RlY29kZV9zZW5zZShvciwgJm9zaSk7Ci0JCWlmIChsaWtlbHkoIXJldCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoT1NEX0VSUl9QUklfQ0xFQVJfUEFHRVMgPT0gb3NpLm9zZF9lcnJfcHJpKSB7Ci0JCQkvKiBzdGFydCByZWFkIG9mZnNldCBwYXNzZWQgZW5kb2YgZmlsZSAqLwotCQkJQlVHX09OKGlzX3dyaXRlKTsKLQkJCV9jbGVhcl9iaW8oaW9zLT5wZXJfZGV2W2ldLmJpbyk7Ci0JCQlkcHJpbnRrKCIlczogc3RhcnQgcmVhZCBvZmZzZXQgcGFzc2VkIGVuZCBvZiBmaWxlICIKLQkJCQkib2Zmc2V0PTB4JWxseCwgbGVuZ3RoPTB4JWx4XG4iLCBfX2Z1bmNfXywKLQkJCQlfTExVKGlvcy0+cGVyX2RldltpXS5vZmZzZXQpLAotCQkJCWlvcy0+cGVyX2RldltpXS5sZW5ndGgpOwotCi0JCQljb250aW51ZTsgLyogd2UgcmVjb3ZlcmVkICovCi0JCX0KLQkJb2JqbGF5b3V0X2lvX3NldF9yZXN1bHQoJmlvcy0+b2xfc3RhdGUsIGksCi0JCQkJCSZpb3MtPmxheW91dC0+Y29tcHNbaV0ub2Nfb2JqZWN0X2lkLAotCQkJCQlvc2RfcHJpXzJfcG5mc19lcnIob3NpLm9zZF9lcnJfcHJpKSwKLQkJCQkJaW9zLT5wZXJfZGV2W2ldLm9mZnNldCwKLQkJCQkJaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCwKLQkJCQkJaXNfd3JpdGUpOwotCi0JCWlmIChvc2kub3NkX2Vycl9wcmkgPj0gb2VwKSB7Ci0JCQlvZXAgPSBvc2kub3NkX2Vycl9wcmk7Ci0JCQlsaW5fcmV0ID0gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIGxpbl9yZXQ7Ci19Ci0KLS8qCi0gKiBDb21tb24gSU8gc3RhdGUgaGVscGVycy4KLSAqLwotc3RhdGljIHZvaWQgX2lvX2ZyZWUoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltpXTsKLQotCQlpZiAocGVyX2Rldi0+b3IpIHsKLQkJCW9zZF9lbmRfcmVxdWVzdChwZXJfZGV2LT5vcik7Ci0JCQlwZXJfZGV2LT5vciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAocGVyX2Rldi0+YmlvKSB7Ci0JCQliaW9fcHV0KHBlcl9kZXYtPmJpbyk7Ci0JCQlwZXJfZGV2LT5iaW8gPSBOVUxMOwotCQl9Ci0JfQotfQotCi1zdHJ1Y3Qgb3NkX2RldiAqX2lvX29kKHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zLCB1bnNpZ25lZCBkZXYpCi17Ci0JdW5zaWduZWQgbWluX2RldiA9IGlvcy0+bGF5b3V0LT5jb21wc19pbmRleDsKLQl1bnNpZ25lZCBtYXhfZGV2ID0gbWluX2RldiArIGlvcy0+bGF5b3V0LT5udW1fY29tcHM7Ci0KLQlCVUdfT04oZGV2IDwgbWluX2RldiB8fCBtYXhfZGV2IDw9IGRldik7Ci0JcmV0dXJuIGlvcy0+bGF5b3V0LT5vZHNbZGV2IC0gbWluX2Rldl0tPm9kOwotfQotCi1zdHJ1Y3QgX3N0cmlwaW5nX2luZm8gewotCXU2NCBvYmpfb2Zmc2V0OwotCXU2NCBncm91cF9sZW5ndGg7Ci0JdW5zaWduZWQgZGV2OwotCXVuc2lnbmVkIHVuaXRfb2ZmOwotfTsKLQotc3RhdGljIHZvaWQgX2NhbGNfc3RyaXBlX2luZm8oc3RydWN0IG9iamlvX3N0YXRlICppb3MsIHU2NCBmaWxlX29mZnNldCwKLQkJCSAgICAgIHN0cnVjdCBfc3RyaXBpbmdfaW5mbyAqc2kpCi17Ci0JdTMyCXN0cmlwZV91bml0ID0gaW9zLT5sYXlvdXQtPnN0cmlwZV91bml0OwotCXUzMglncm91cF93aWR0aCA9IGlvcy0+bGF5b3V0LT5ncm91cF93aWR0aDsKLQl1NjQJZ3JvdXBfZGVwdGggPSBpb3MtPmxheW91dC0+Z3JvdXBfZGVwdGg7Ci0JdTMyCVUgPSBzdHJpcGVfdW5pdCAqIGdyb3VwX3dpZHRoOwotCi0JdTY0CVQgPSBVICogZ3JvdXBfZGVwdGg7Ci0JdTY0CVMgPSBUICogaW9zLT5sYXlvdXQtPmdyb3VwX2NvdW50OwotCXU2NAlNID0gZGl2NjRfdTY0KGZpbGVfb2Zmc2V0LCBTKTsKLQotCS8qCi0JRyA9IChMIC0gKE0gKiBTKSkgLyBUCi0JSCA9IChMIC0gKE0gKiBTKSkgJSBUCi0JKi8KLQl1NjQJTG1vZFUgPSBmaWxlX29mZnNldCAtIE0gKiBTOwotCXUzMglHID0gZGl2NjRfdTY0KExtb2RVLCBUKTsKLQl1NjQJSCA9IExtb2RVIC0gRyAqIFQ7Ci0KLQl1MzIJTiA9IGRpdl91NjQoSCwgVSk7Ci0KLQlkaXZfdTY0X3JlbShmaWxlX29mZnNldCwgc3RyaXBlX3VuaXQsICZzaS0+dW5pdF9vZmYpOwotCXNpLT5vYmpfb2Zmc2V0ID0gc2ktPnVuaXRfb2ZmICsgKE4gKiBzdHJpcGVfdW5pdCkgKwotCQkJCSAgKE0gKiBncm91cF9kZXB0aCAqIHN0cmlwZV91bml0KTsKLQotCS8qICJIIC0gKE4gKiBVKSIgaXMganVzdCAiSCAlIFUiIHNvIGl0J3MgYm91bmQgdG8gdTMyICovCi0Jc2ktPmRldiA9ICh1MzIpKEggLSAoTiAqIFUpKSAvIHN0cmlwZV91bml0ICsgRyAqIGdyb3VwX3dpZHRoOwotCXNpLT5kZXYgKj0gaW9zLT5sYXlvdXQtPm1pcnJvcnNfcDE7Ci0KLQlzaS0+Z3JvdXBfbGVuZ3RoID0gVCAtIEg7Ci19Ci0KLXN0YXRpYyBpbnQgX2FkZF9zdHJpcGVfdW5pdChzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgIHVuc2lnbmVkICpjdXJfcGcsCi0JCXVuc2lnbmVkIHBnYmFzZSwgc3RydWN0IF9vYmppb19wZXJfY29tcCAqcGVyX2RldiwgaW50IGxlbiwKLQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIHBnID0gKmN1cl9wZzsKLQlpbnQgY3VyX2xlbiA9IGxlbjsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9Ci0JCQlvc2RfcmVxdWVzdF9xdWV1ZShfaW9fb2QoaW9zLCBwZXJfZGV2LT5kZXYpKTsKLQotCWlmIChwZXJfZGV2LT5iaW8gPT0gTlVMTCkgewotCQl1bnNpZ25lZCBwYWdlc19pbl9zdHJpcGUgPSBpb3MtPmxheW91dC0+Z3JvdXBfd2lkdGggKgotCQkJCSAgICAgIChpb3MtPmxheW91dC0+c3RyaXBlX3VuaXQgLyBQQUdFX1NJWkUpOwotCQl1bnNpZ25lZCBiaW9fc2l6ZSA9IChpb3MtPm9sX3N0YXRlLm5yX3BhZ2VzICsgcGFnZXNfaW5fc3RyaXBlKSAvCi0JCQkJICAgIGlvcy0+bGF5b3V0LT5ncm91cF93aWR0aDsKLQotCQlpZiAoQklPX01BWF9QQUdFU19LTUFMTE9DIDwgYmlvX3NpemUpCi0JCQliaW9fc2l6ZSA9IEJJT19NQVhfUEFHRVNfS01BTExPQzsKLQotCQlwZXJfZGV2LT5iaW8gPSBiaW9fa21hbGxvYyhnZnBfZmxhZ3MsIGJpb19zaXplKTsKLQkJaWYgKHVubGlrZWx5KCFwZXJfZGV2LT5iaW8pKSB7Ci0JCQlkcHJpbnRrKCJGYWlsZCB0byBhbGxvY2F0ZSBCSU8gc2l6ZT0ldVxuIiwgYmlvX3NpemUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQl3aGlsZSAoY3VyX2xlbiA+IDApIHsKLQkJdW5zaWduZWQgcGdsZW4gPSBtaW5fdCh1bnNpZ25lZCwgUEFHRV9TSVpFIC0gcGdiYXNlLCBjdXJfbGVuKTsKLQkJdW5zaWduZWQgYWRkZWRfbGVuOwotCi0JCUJVR19PTihpb3MtPm9sX3N0YXRlLm5yX3BhZ2VzIDw9IHBnKTsKLQkJY3VyX2xlbiAtPSBwZ2xlbjsKLQotCQlhZGRlZF9sZW4gPSBiaW9fYWRkX3BjX3BhZ2UocSwgcGVyX2Rldi0+YmlvLAotCQkJCQlpb3MtPm9sX3N0YXRlLnBhZ2VzW3BnXSwgcGdsZW4sIHBnYmFzZSk7Ci0JCWlmICh1bmxpa2VseShwZ2xlbiAhPSBhZGRlZF9sZW4pKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXBnYmFzZSA9IDA7Ci0JCSsrcGc7Ci0JfQotCUJVR19PTihjdXJfbGVuKTsKLQotCXBlcl9kZXYtPmxlbmd0aCArPSBsZW47Ci0JKmN1cl9wZyA9IHBnOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9wcmVwYXJlX29uZV9ncm91cChzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgdTY0IGxlbmd0aCwKLQkJCSAgICAgIHN0cnVjdCBfc3RyaXBpbmdfaW5mbyAqc2ksIHVuc2lnbmVkICpsYXN0X3BnLAotCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQotewotCXVuc2lnbmVkIHN0cmlwZV91bml0ID0gaW9zLT5sYXlvdXQtPnN0cmlwZV91bml0OwotCXVuc2lnbmVkIG1pcnJvcnNfcDEgPSBpb3MtPmxheW91dC0+bWlycm9yc19wMTsKLQl1bnNpZ25lZCBkZXZzX2luX2dyb3VwID0gaW9zLT5sYXlvdXQtPmdyb3VwX3dpZHRoICogbWlycm9yc19wMTsKLQl1bnNpZ25lZCBkZXYgPSBzaS0+ZGV2OwotCXVuc2lnbmVkIGZpcnN0X2RldiA9IGRldiAtIChkZXYgJSBkZXZzX2luX2dyb3VwKTsKLQl1bnNpZ25lZCBtYXhfY29tcCA9IGlvcy0+bnVtZGV2cyA/IGlvcy0+bnVtZGV2cyAtIG1pcnJvcnNfcDEgOiAwOwotCXVuc2lnbmVkIGN1cl9wZyA9ICpsYXN0X3BnOwotCWludCByZXQgPSAwOwotCi0Jd2hpbGUgKGxlbmd0aCkgewotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltkZXYgLSBmaXJzdF9kZXZdOwotCQl1bnNpZ25lZCBjdXJfbGVuLCBwYWdlX29mZiA9IDA7Ci0KLQkJaWYgKCFwZXJfZGV2LT5sZW5ndGgpIHsKLQkJCXBlcl9kZXYtPmRldiA9IGRldjsKLQkJCWlmIChkZXYgPCBzaS0+ZGV2KSB7Ci0JCQkJcGVyX2Rldi0+b2Zmc2V0ID0gc2ktPm9ial9vZmZzZXQgKyBzdHJpcGVfdW5pdCAtCi0JCQkJCQkJCSAgIHNpLT51bml0X29mZjsKLQkJCQljdXJfbGVuID0gc3RyaXBlX3VuaXQ7Ci0JCQl9IGVsc2UgaWYgKGRldiA9PSBzaS0+ZGV2KSB7Ci0JCQkJcGVyX2Rldi0+b2Zmc2V0ID0gc2ktPm9ial9vZmZzZXQ7Ci0JCQkJY3VyX2xlbiA9IHN0cmlwZV91bml0IC0gc2ktPnVuaXRfb2ZmOwotCQkJCXBhZ2Vfb2ZmID0gc2ktPnVuaXRfb2ZmICYgflBBR0VfTUFTSzsKLQkJCQlCVUdfT04ocGFnZV9vZmYgJiYKLQkJCQkgICAgICAocGFnZV9vZmYgIT0gaW9zLT5vbF9zdGF0ZS5wZ2Jhc2UpKTsKLQkJCX0gZWxzZSB7IC8qIGRldiA+IHNpLT5kZXYgKi8KLQkJCQlwZXJfZGV2LT5vZmZzZXQgPSBzaS0+b2JqX29mZnNldCAtIHNpLT51bml0X29mZjsKLQkJCQljdXJfbGVuID0gc3RyaXBlX3VuaXQ7Ci0JCQl9Ci0KLQkJCWlmIChtYXhfY29tcCA8IGRldiAtIGZpcnN0X2RldikKLQkJCQltYXhfY29tcCA9IGRldiAtIGZpcnN0X2RldjsKLQkJfSBlbHNlIHsKLQkJCWN1cl9sZW4gPSBzdHJpcGVfdW5pdDsKLQkJfQotCQlpZiAoY3VyX2xlbiA+PSBsZW5ndGgpCi0JCQljdXJfbGVuID0gbGVuZ3RoOwotCi0JCXJldCA9IF9hZGRfc3RyaXBlX3VuaXQoaW9zLCAmY3VyX3BnLCBwYWdlX29mZiAsIHBlcl9kZXYsCi0JCQkJICAgICAgIGN1cl9sZW4sIGdmcF9mbGFncyk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBvdXQ7Ci0KLQkJZGV2ICs9IG1pcnJvcnNfcDE7Ci0JCWRldiA9IChkZXYgJSBkZXZzX2luX2dyb3VwKSArIGZpcnN0X2RldjsKLQotCQlsZW5ndGggLT0gY3VyX2xlbjsKLQkJaW9zLT5sZW5ndGggKz0gY3VyX2xlbjsKLQl9Ci1vdXQ6Ci0JaW9zLT5udW1kZXZzID0gbWF4X2NvbXAgKyBtaXJyb3JzX3AxOwotCSpsYXN0X3BnID0gY3VyX3BnOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX2lvX3J3X3BhZ2VsaXN0KHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zLCBnZnBfdCBnZnBfZmxhZ3MpCi17Ci0JdTY0IGxlbmd0aCA9IGlvcy0+b2xfc3RhdGUuY291bnQ7Ci0JdTY0IG9mZnNldCA9IGlvcy0+b2xfc3RhdGUub2Zmc2V0OwotCXN0cnVjdCBfc3RyaXBpbmdfaW5mbyBzaTsKLQl1bnNpZ25lZCBsYXN0X3BnID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCXdoaWxlIChsZW5ndGgpIHsKLQkJX2NhbGNfc3RyaXBlX2luZm8oaW9zLCBvZmZzZXQsICZzaSk7Ci0KLQkJaWYgKGxlbmd0aCA8IHNpLmdyb3VwX2xlbmd0aCkKLQkJCXNpLmdyb3VwX2xlbmd0aCA9IGxlbmd0aDsKLQotCQlyZXQgPSBfcHJlcGFyZV9vbmVfZ3JvdXAoaW9zLCBzaS5ncm91cF9sZW5ndGgsICZzaSwgJmxhc3RfcGcsIGdmcF9mbGFncyk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBvdXQ7Ci0KLQkJb2Zmc2V0ICs9IHNpLmdyb3VwX2xlbmd0aDsKLQkJbGVuZ3RoIC09IHNpLmdyb3VwX2xlbmd0aDsKLQl9Ci0KLW91dDoKLQlpZiAoIWlvcy0+bGVuZ3RoKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IF9zeW5jX2RvbmUoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0Jc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBpb3MtPnByaXZhdGU7Ci0KLQljb21wbGV0ZSh3YWl0aW5nKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX2xhc3RfaW8oc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IG9iamlvX3N0YXRlICppb3MgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IG9iamlvX3N0YXRlLCBrcmVmKTsKLQotCWlvcy0+ZG9uZShpb3MpOwotfQotCi1zdGF0aWMgdm9pZCBfZG9uZV9pbyhzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLCB2b2lkICpwKQotewotCXN0cnVjdCBvYmppb19zdGF0ZSAqaW9zID0gcDsKLQotCWtyZWZfcHV0KCZpb3MtPmtyZWYsIF9sYXN0X2lvKTsKLX0KLQotc3RhdGljIHNzaXplX3QgX2lvX2V4ZWMoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCi17Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7Ci0Jc3NpemVfdCBzdGF0dXMgPSAwOyAvKiBzeW5jIHN0YXR1cyAqLwotCXVuc2lnbmVkIGk7Ci0Jb2JqaW9fZG9uZV9mbiBzYXZlZF9kb25lX2ZuID0gaW9zLT5kb25lOwotCWJvb2wgc3luYyA9IGlvcy0+b2xfc3RhdGUuc3luYzsKLQotCWlmIChzeW5jKSB7Ci0JCWlvcy0+ZG9uZSA9IF9zeW5jX2RvbmU7Ci0JCWlvcy0+cHJpdmF0ZSA9ICZ3YWl0OwotCX0KLQotCWtyZWZfaW5pdCgmaW9zLT5rcmVmKTsKLQotCWZvciAoaSA9IDA7IGkgPCBpb3MtPm51bWRldnM7IGkrKykgewotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gaW9zLT5wZXJfZGV2W2ldLm9yOwotCi0JCWlmICghb3IpCi0JCQljb250aW51ZTsKLQotCQlrcmVmX2dldCgmaW9zLT5rcmVmKTsKLQkJb3NkX2V4ZWN1dGVfcmVxdWVzdF9hc3luYyhvciwgX2RvbmVfaW8sIGlvcyk7Ci0JfQotCi0Ja3JlZl9wdXQoJmlvcy0+a3JlZiwgX2xhc3RfaW8pOwotCi0JaWYgKHN5bmMpIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmd2FpdCk7Ci0JCXN0YXR1cyA9IHNhdmVkX2RvbmVfZm4oaW9zKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOworCW9iamxheW91dF9pb19zZXRfcmVzdWx0KCZvYmppb3MtPm9pciwgY29tcCwKKwkJCQkmcG9vaWQsIG9zZF9wcmlfMl9wbmZzX2VycihvZXApLAorCQkJCWRldl9vZmZzZXQsIGRldl9sZW4sICFpb3MtPnJlYWRpbmcpOwogfQogCiAvKgogICogcmVhZAogICovCi1zdGF0aWMgc3NpemVfdCBfcmVhZF9kb25lKHN0cnVjdCBvYmppb19zdGF0ZSAqaW9zKQorc3RhdGljIHZvaWQgX3JlYWRfZG9uZShzdHJ1Y3Qgb3JlX2lvX3N0YXRlICppb3MsIHZvaWQgKnByaXZhdGUpCiB7CisJc3RydWN0IG9iamlvX3N0YXRlICpvYmppb3MgPSBwcml2YXRlOwogCXNzaXplX3Qgc3RhdHVzOwotCWludCByZXQgPSBfaW9fY2hlY2soaW9zLCBmYWxzZSk7CisJaW50IHJldCA9IG9yZV9jaGVja19pbyhpb3MsICZfX29uX2Rldl9lcnJvcik7CiAKLQlfaW9fZnJlZShpb3MpOworCS8qIEZJWE1FOiBfaW9fZnJlZShpb3MpIGNhbiB3ZSBkZWFsb2NhdGUgdGhlIGxpYm9zZCByZXNvdXJjZXM7ICovCiAKIAlpZiAobGlrZWx5KCFyZXQpKQogCQlzdGF0dXMgPSBpb3MtPmxlbmd0aDsKIAllbHNlCiAJCXN0YXR1cyA9IHJldDsKIAotCW9iamxheW91dF9yZWFkX2RvbmUoJmlvcy0+b2xfc3RhdGUsIHN0YXR1cywgaW9zLT5vbF9zdGF0ZS5zeW5jKTsKLQlyZXR1cm4gc3RhdHVzOworCW9iamxheW91dF9yZWFkX2RvbmUoJm9iamlvcy0+b2lyLCBzdGF0dXMsIG9iamlvcy0+c3luYyk7CiB9CiAKLXN0YXRpYyBpbnQgX3JlYWRfbWlycm9ycyhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcywgdW5zaWduZWQgY3VyX2NvbXApCitpbnQgb2JqaW9fcmVhZF9wYWdlbGlzdChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCiB7Ci0Jc3RydWN0IG9zZF9yZXF1ZXN0ICpvciA9IE5VTEw7Ci0Jc3RydWN0IF9vYmppb19wZXJfY29tcCAqcGVyX2RldiA9ICZpb3MtPnBlcl9kZXZbY3VyX2NvbXBdOwotCXVuc2lnbmVkIGRldiA9IHBlcl9kZXYtPmRldjsKLQlzdHJ1Y3QgcG5mc19vc2Rfb2JqZWN0X2NyZWQgKmNyZWQgPQotCQkJJmlvcy0+bGF5b3V0LT5jb21wc1tjdXJfY29tcF07Ci0Jc3RydWN0IG9zZF9vYmpfaWQgb2JqID0gewotCQkucGFydGl0aW9uID0gY3JlZC0+b2Nfb2JqZWN0X2lkLm9pZF9wYXJ0aXRpb25faWQsCi0JCS5pZCA9IGNyZWQtPm9jX29iamVjdF9pZC5vaWRfb2JqZWN0X2lkLAotCX07CisJc3RydWN0IG9iamlvX3N0YXRlICpvYmppb3M7CiAJaW50IHJldDsKIAotCW9yID0gb3NkX3N0YXJ0X3JlcXVlc3QoX2lvX29kKGlvcywgZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCXBlcl9kZXYtPm9yID0gb3I7Ci0KLQlvc2RfcmVxX3JlYWQob3IsICZvYmosIHBlcl9kZXYtPm9mZnNldCwgcGVyX2Rldi0+YmlvLCBwZXJfZGV2LT5sZW5ndGgpOwotCi0JcmV0ID0gb3NkX2ZpbmFsaXplX3JlcXVlc3Qob3IsIDAsIGNyZWQtPm9jX2NhcC5jcmVkLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCWRwcmludGsoIiVzOiBGYWlsZCB0byBvc2RfZmluYWxpemVfcmVxdWVzdCgpID0+ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRwcmludGsoIiVzOlslZF0gZGV2PSVkIG9iaj0weCVsbHggc3RhcnQ9MHglbGx4IGxlbmd0aD0weCVseFxuIiwKLQkJX19mdW5jX18sIGN1cl9jb21wLCBkZXYsIG9iai5pZCwgX0xMVShwZXJfZGV2LT5vZmZzZXQpLAotCQlwZXJfZGV2LT5sZW5ndGgpOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgX3JlYWRfZXhlYyhzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcykKLXsKLQl1bnNpZ25lZCBpOwotCWludCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9zLT5udW1kZXZzOyBpICs9IGlvcy0+bGF5b3V0LT5taXJyb3JzX3AxKSB7Ci0JCWlmICghaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBfcmVhZF9taXJyb3JzKGlvcywgaSk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQotCQkJZ290byBlcnI7Ci0JfQotCi0JaW9zLT5kb25lID0gX3JlYWRfZG9uZTsKLQlyZXR1cm4gX2lvX2V4ZWMoaW9zKTsgLyogSW4gc3luYyBtb2RlIGV4ZWMgcmV0dXJucyB0aGUgaW8gc3RhdHVzICovCi0KLWVycjoKLQlfaW9fZnJlZShpb3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3Qgb2JqaW9fcmVhZF9wYWdlbGlzdChzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpvbF9zdGF0ZSkKLXsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBfaW9fcndfcGFnZWxpc3QoaW9zLCBHRlBfS0VSTkVMKTsKKwlyZXQgPSBvYmppb19hbGxvY19pb19zdGF0ZShORlNfSShyZGF0YS0+aW5vZGUpLT5sYXlvdXQsIHRydWUsCisJCQlyZGF0YS0+bHNlZywgcmRhdGEtPmFyZ3MucGFnZXMsIHJkYXRhLT5hcmdzLnBnYmFzZSwKKwkJCXJkYXRhLT5hcmdzLm9mZnNldCwgcmRhdGEtPmFyZ3MuY291bnQsIHJkYXRhLAorCQkJR0ZQX0tFUk5FTCwgJm9iamlvcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gX3JlYWRfZXhlYyhpb3MpOworCW9iamlvcy0+aW9zLT5kb25lID0gX3JlYWRfZG9uZTsKKwlkcHJpbnRrKCIlczogb2Zmc2V0PTB4JWxseCBsZW5ndGg9MHgleFxuIiwgX19mdW5jX18sCisJCXJkYXRhLT5hcmdzLm9mZnNldCwgcmRhdGEtPmFyZ3MuY291bnQpOworCXJldHVybiBvcmVfcmVhZChvYmppb3MtPmlvcyk7CiB9CiAKIC8qCiAgKiB3cml0ZQogICovCi1zdGF0aWMgc3NpemVfdCBfd3JpdGVfZG9uZShzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcykKK3N0YXRpYyB2b2lkIF93cml0ZV9kb25lKHN0cnVjdCBvcmVfaW9fc3RhdGUgKmlvcywgdm9pZCAqcHJpdmF0ZSkKIHsKKwlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKm9iamlvcyA9IHByaXZhdGU7CiAJc3NpemVfdCBzdGF0dXM7Ci0JaW50IHJldCA9IF9pb19jaGVjayhpb3MsIHRydWUpOworCWludCByZXQgPSBvcmVfY2hlY2tfaW8oaW9zLCAmX19vbl9kZXZfZXJyb3IpOwogCi0JX2lvX2ZyZWUoaW9zKTsKKwkvKiBGSVhNRTogX2lvX2ZyZWUoaW9zKSBjYW4gd2UgZGVhbG9jYXRlIHRoZSBsaWJvc2QgcmVzb3VyY2VzOyAqLwogCiAJaWYgKGxpa2VseSghcmV0KSkgewogCQkvKiBGSVhNRTogc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBPU0QncyBwZXJzaXN0ZW5jZSBtb2RlbAogCQkgKiBTZWUgT1NEMnIwNSBTZWN0aW9uIDQuMTMgRGF0YSBwZXJzaXN0ZW5jZSBtb2RlbCAqLwotCQlpb3MtPm9sX3N0YXRlLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJCW9iamlvcy0+b2lyLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CiAJCXN0YXR1cyA9IGlvcy0+bGVuZ3RoOwogCX0gZWxzZSB7CiAJCXN0YXR1cyA9IHJldDsKIAl9CiAKLQlvYmpsYXlvdXRfd3JpdGVfZG9uZSgmaW9zLT5vbF9zdGF0ZSwgc3RhdHVzLCBpb3MtPm9sX3N0YXRlLnN5bmMpOwotCXJldHVybiBzdGF0dXM7CisJb2JqbGF5b3V0X3dyaXRlX2RvbmUoJm9iamlvcy0+b2lyLCBzdGF0dXMsIG9iamlvcy0+c3luYyk7CiB9CiAKLXN0YXRpYyBpbnQgX3dyaXRlX21pcnJvcnMoc3RydWN0IG9iamlvX3N0YXRlICppb3MsIHVuc2lnbmVkIGN1cl9jb21wKQorc3RhdGljIHN0cnVjdCBwYWdlICpfX3I0d19nZXRfcGFnZSh2b2lkICpwcml2LCB1NjQgb2Zmc2V0LCBib29sICp1cHRvZGF0ZSkKIHsKLQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICptYXN0ZXJfZGV2ID0gJmlvcy0+cGVyX2RldltjdXJfY29tcF07Ci0JdW5zaWduZWQgZGV2ID0gaW9zLT5wZXJfZGV2W2N1cl9jb21wXS5kZXY7Ci0JdW5zaWduZWQgbGFzdF9jb21wID0gY3VyX2NvbXAgKyBpb3MtPmxheW91dC0+bWlycm9yc19wMTsKLQlpbnQgcmV0OworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zID0gcHJpdjsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhID0gb2JqaW9zLT5vaXIucnBjZGF0YTsKKwlwZ29mZl90IGluZGV4ID0gb2Zmc2V0IC8gUEFHRV9TSVpFOworCXN0cnVjdCBwYWdlICpwYWdlID0gZmluZF9nZXRfcGFnZSh3ZGF0YS0+aW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOwogCi0JZm9yICg7IGN1cl9jb21wIDwgbGFzdF9jb21wOyArK2N1cl9jb21wLCArK2RldikgewotCQlzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yID0gTlVMTDsKLQkJc3RydWN0IHBuZnNfb3NkX29iamVjdF9jcmVkICpjcmVkID0KLQkJCQkJJmlvcy0+bGF5b3V0LT5jb21wc1tjdXJfY29tcF07Ci0JCXN0cnVjdCBvc2Rfb2JqX2lkIG9iaiA9IHsKLQkJCS5wYXJ0aXRpb24gPSBjcmVkLT5vY19vYmplY3RfaWQub2lkX3BhcnRpdGlvbl9pZCwKLQkJCS5pZCA9IGNyZWQtPm9jX29iamVjdF9pZC5vaWRfb2JqZWN0X2lkLAotCQl9OwotCQlzdHJ1Y3QgX29iamlvX3Blcl9jb21wICpwZXJfZGV2ID0gJmlvcy0+cGVyX2RldltjdXJfY29tcF07Ci0JCXN0cnVjdCBiaW8gKmJpbzsKLQotCQlvciA9IG9zZF9zdGFydF9yZXF1ZXN0KF9pb19vZChpb3MsIGRldiksIEdGUF9OT0ZTKTsKLQkJaWYgKHVubGlrZWx5KCFvcikpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKKwlpZiAoIXBhZ2UpIHsKKwkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2Uod2RhdGEtPmlub2RlLT5pX21hcHBpbmcsCisJCQkJCQlpbmRleCwgR0ZQX05PRlMpOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCQlkcHJpbnRrKCIlczogZ3JhYl9jYWNoZV9wYWdlIEZhaWxlZCBpbmRleD0weCVseFxuIiwKKwkJCQlfX2Z1bmNfXywgaW5kZXgpOworCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcGVyX2Rldi0+b3IgPSBvcjsKLQotCQlpZiAocGVyX2RldiAhPSBtYXN0ZXJfZGV2KSB7Ci0JCQliaW8gPSBiaW9fa21hbGxvYyhHRlBfTk9GUywKLQkJCQkJICBtYXN0ZXJfZGV2LT5iaW8tPmJpX21heF92ZWNzKTsKLQkJCWlmICh1bmxpa2VseSghYmlvKSkgewotCQkJCWRwcmludGsoIkZhaWxkIHRvIGFsbG9jYXRlIEJJTyBzaXplPSV1XG4iLAotCQkJCQltYXN0ZXJfZGV2LT5iaW8tPmJpX21heF92ZWNzKTsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCi0JCQlfX2Jpb19jbG9uZShiaW8sIG1hc3Rlcl9kZXYtPmJpbyk7Ci0JCQliaW8tPmJpX2JkZXYgPSBOVUxMOwotCQkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKLQkJCXBlcl9kZXYtPmJpbyA9IGJpbzsKLQkJCXBlcl9kZXYtPmRldiA9IGRldjsKLQkJCXBlcl9kZXYtPmxlbmd0aCA9IG1hc3Rlcl9kZXYtPmxlbmd0aDsKLQkJCXBlcl9kZXYtPm9mZnNldCA9ICBtYXN0ZXJfZGV2LT5vZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQliaW8gPSBtYXN0ZXJfZGV2LT5iaW87Ci0JCQliaW8tPmJpX3J3IHw9IFJFUV9XUklURTsKLQkJfQotCi0JCW9zZF9yZXFfd3JpdGUob3IsICZvYmosIHBlcl9kZXYtPm9mZnNldCwgYmlvLCBwZXJfZGV2LT5sZW5ndGgpOwotCi0JCXJldCA9IG9zZF9maW5hbGl6ZV9yZXF1ZXN0KG9yLCAwLCBjcmVkLT5vY19jYXAuY3JlZCwgTlVMTCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRwcmludGsoIiVzOiBGYWlsZCB0byBvc2RfZmluYWxpemVfcmVxdWVzdCgpID0+ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlkcHJpbnRrKCIlczpbJWRdIGRldj0lZCBvYmo9MHglbGx4IHN0YXJ0PTB4JWxseCBsZW5ndGg9MHglbHhcbiIsCi0JCQlfX2Z1bmNfXywgY3VyX2NvbXAsIGRldiwgb2JqLmlkLCBfTExVKHBlcl9kZXYtPm9mZnNldCksCi0JCQlwZXJfZGV2LT5sZW5ndGgpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKIAl9Ci0KLWVycjoKLQlyZXR1cm4gcmV0OworCWlmIChQYWdlRGlydHkocGFnZSkgfHwgUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJKnVwdG9kYXRlID0gdHJ1ZTsKKwllbHNlCisJCSp1cHRvZGF0ZSA9IFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlkcHJpbnRrKCIlczogaW5kZXg9MHglbHggdXB0b2RhdGU9JWRcbiIsIF9fZnVuY19fLCBpbmRleCwgKnVwdG9kYXRlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAotc3RhdGljIHNzaXplX3QgX3dyaXRlX2V4ZWMoc3RydWN0IG9iamlvX3N0YXRlICppb3MpCitzdGF0aWMgdm9pZCBfX3I0d19wdXRfcGFnZSh2b2lkICpwcml2LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl1bnNpZ25lZCBpOwotCWludCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW9zLT5udW1kZXZzOyBpICs9IGlvcy0+bGF5b3V0LT5taXJyb3JzX3AxKSB7Ci0JCWlmICghaW9zLT5wZXJfZGV2W2ldLmxlbmd0aCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBfd3JpdGVfbWlycm9ycyhpb3MsIGkpOwotCQlpZiAodW5saWtlbHkocmV0KSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlvcy0+ZG9uZSA9IF93cml0ZV9kb25lOwotCXJldHVybiBfaW9fZXhlYyhpb3MpOyAvKiBJbiBzeW5jIG1vZGUgZXhlYyByZXR1cm5zIHRoZSBpby0+c3RhdHVzICovCi0KLWVycjoKLQlfaW9fZnJlZShpb3MpOwotCXJldHVybiByZXQ7CisJZHByaW50aygiJXM6IGluZGV4PTB4JWx4XG4iLCBfX2Z1bmNfXywgcGFnZS0+aW5kZXgpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm47CiB9CiAKLXNzaXplX3Qgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqb2xfc3RhdGUsIGJvb2wgc3RhYmxlKQorc3RhdGljIGNvbnN0IHN0cnVjdCBfb3JlX3I0d19vcCBfcjR3X29wID0geworCS5nZXRfcGFnZSA9ICZfX3I0d19nZXRfcGFnZSwKKwkucHV0X3BhZ2UgPSAmX19yNHdfcHV0X3BhZ2UsCit9OworCitpbnQgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSwgaW50IGhvdykKIHsKLQlzdHJ1Y3Qgb2JqaW9fc3RhdGUgKmlvcyA9IGNvbnRhaW5lcl9vZihvbF9zdGF0ZSwgc3RydWN0IG9iamlvX3N0YXRlLAotCQkJCQkgICAgICAgb2xfc3RhdGUpOworCXN0cnVjdCBvYmppb19zdGF0ZSAqb2JqaW9zOwogCWludCByZXQ7CiAKLQkvKiBUT0RPOiBpb3MtPnN0YWJsZSA9IHN0YWJsZTsgKi8KLQlyZXQgPSBfaW9fcndfcGFnZWxpc3QoaW9zLCBHRlBfTk9GUyk7CisJcmV0ID0gb2JqaW9fYWxsb2NfaW9fc3RhdGUoTkZTX0kod2RhdGEtPmlub2RlKS0+bGF5b3V0LCBmYWxzZSwKKwkJCXdkYXRhLT5sc2VnLCB3ZGF0YS0+YXJncy5wYWdlcywgd2RhdGEtPmFyZ3MucGdiYXNlLAorCQkJd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCwgd2RhdGEsIEdGUF9OT0ZTLAorCQkJJm9iamlvcyk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gX3dyaXRlX2V4ZWMoaW9zKTsKKwlvYmppb3MtPnN5bmMgPSAwICE9IChob3cgJiBGTFVTSF9TWU5DKTsKKwlvYmppb3MtPmlvcy0+cjR3ID0gJl9yNHdfb3A7CisKKwlpZiAoIW9iamlvcy0+c3luYykKKwkJb2JqaW9zLT5pb3MtPmRvbmUgPSBfd3JpdGVfZG9uZTsKKworCWRwcmludGsoIiVzOiBvZmZzZXQ9MHglbGx4IGxlbmd0aD0weCV4XG4iLCBfX2Z1bmNfXywKKwkJd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCk7CisJcmV0ID0gb3JlX3dyaXRlKG9iamlvcy0+aW9zKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvYmppb3MtPnN5bmMpCisJCV93cml0ZV9kb25lKG9iamlvcy0+aW9zLCBvYmppb3MpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBib29sIG9iamlvX3BnX3Rlc3Qoc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqcGdpbywKQEAgLTk5Nyw3ICs1MzMsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gcGdpby0+cGdfY291bnQgKyByZXEtPndiX2J5dGVzIDw9Ci0JCQlPQkpJT19MU0VHKHBnaW8tPnBnX2xzZWcpLT5tYXhfaW9fc2l6ZTsKKwkJCU9CSklPX0xTRUcocGdpby0+cGdfbHNlZyktPmxheW91dC5tYXhfaW9fbGVuZ3RoOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mc19wYWdlaW9fb3BzIG9iamlvX3BnX3JlYWRfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYyBiL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmMKaW5kZXggMWQwNmY4ZS4uNzIwNzRlMyAxMDA2NDQKLS0tIGEvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuYworKysgYi9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5jCkBAIC0xNTYsNzcgKzE1NiwzOSBAQAogCXJldHVybiBlbmQgPiBzdGFydCA/IGVuZCAtIDEgOiBORlM0X01BWF9VSU5UNjQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICoKLW9iamxheW91dF9hbGxvY19pb19zdGF0ZShzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzX2xheW91dF90eXBlLAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJCXVuc2lnbmVkIHBnYmFzZSwKLQkJCWxvZmZfdCBvZmZzZXQsCi0JCQlzaXplX3QgY291bnQsCi0JCQlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywKLQkJCXZvaWQgKnJwY2RhdGEsCi0JCQlnZnBfdCBnZnBfZmxhZ3MpCit2b2lkIF9maXhfdmVyaWZ5X2lvX3BhcmFtcyhzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywKKwkJCSAgIHN0cnVjdCBwYWdlICoqKnBfcGFnZXMsIHVuc2lnbmVkICpwX3BnYmFzZSwKKwkJCSAgIHU2NCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGU7CiAJdTY0IGxzZWdfZW5kX29mZnNldDsKIAotCWRwcmludGsoIiVzOiBhbGxvY2F0aW5nIGlvX3N0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKG9iamlvX2FsbG9jX2lvX3N0YXRlKGxzZWcsICZzdGF0ZSwgZ2ZwX2ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlCVUdfT04ob2Zmc2V0IDwgbHNlZy0+cGxzX3JhbmdlLm9mZnNldCk7CiAJbHNlZ19lbmRfb2Zmc2V0ID0gZW5kX29mZnNldChsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAogCQkJCSAgICAgbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCk7CiAJQlVHX09OKG9mZnNldCA+PSBsc2VnX2VuZF9vZmZzZXQpOwotCWlmIChvZmZzZXQgKyBjb3VudCA+IGxzZWdfZW5kX29mZnNldCkgewotCQljb3VudCA9IGxzZWctPnBsc19yYW5nZS5sZW5ndGggLQotCQkJCShvZmZzZXQgLSBsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0KTsKLQkJZHByaW50aygiJXM6IHRydW5jYXRlZCBjb3VudCAlWmRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJV0FSTl9PTihvZmZzZXQgKyBjb3VudCA+IGxzZWdfZW5kX29mZnNldCk7CisKKwlpZiAoKnBfcGdiYXNlID4gUEFHRV9TSVpFKSB7CisJCWRwcmludGsoIiVzOiBwZ2Jhc2UoMHgleCkgPiBQQUdFX1NJWkVcbiIsIF9fZnVuY19fLCAqcF9wZ2Jhc2UpOworCQkqcF9wYWdlcyArPSAqcF9wZ2Jhc2UgPj4gUEFHRV9TSElGVDsKKwkJKnBfcGdiYXNlICY9IH5QQUdFX01BU0s7CiAJfQotCi0JaWYgKHBnYmFzZSA+IFBBR0VfU0laRSkgewotCQlwYWdlcyArPSBwZ2Jhc2UgPj4gUEFHRV9TSElGVDsKLQkJcGdiYXNlICY9IH5QQUdFX01BU0s7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJnN0YXRlLT5lcnJfbGlzdCk7Ci0Jc3RhdGUtPmxzZWcgPSBsc2VnOwotCXN0YXRlLT5ycGNkYXRhID0gcnBjZGF0YTsKLQlzdGF0ZS0+cGFnZXMgPSBwYWdlczsKLQlzdGF0ZS0+cGdiYXNlID0gcGdiYXNlOwotCXN0YXRlLT5ucl9wYWdlcyA9IChwZ2Jhc2UgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0Jc3RhdGUtPm9mZnNldCA9IG9mZnNldDsKLQlzdGF0ZS0+Y291bnQgPSBjb3VudDsKLQlzdGF0ZS0+c3luYyA9IDA7Ci0KLQlyZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpsYXlvdXRfZnJlZV9pb19zdGF0ZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSkKLXsKLQlkcHJpbnRrKCIlczogZnJlZWluZyBpb19zdGF0ZVxuIiwgX19mdW5jX18pOwotCWlmICh1bmxpa2VseSghc3RhdGUpKQotCQlyZXR1cm47Ci0KLQlvYmppb19mcmVlX2lvX3N0YXRlKHN0YXRlKTsKIH0KIAogLyoKICAqIEkvTyBkb25lIGNvbW1vbiBjb2RlCiAgKi8KIHN0YXRpYyB2b2lkCi1vYmpsYXlvdXRfaW9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlKQorb2JqbGF5b3V0X2lvZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyKQogewotCWRwcmludGsoIiVzOiBzdGF0ZSAlcCBzdGF0dXNcbiIsIF9fZnVuY19fLCBzdGF0ZSk7Ci0KLQlpZiAobGlrZWx5KHN0YXRlLT5zdGF0dXMgPj0gMCkpIHsKLQkJb2JqbGF5b3V0X2ZyZWVfaW9fc3RhdGUoc3RhdGUpOworCWlmIChsaWtlbHkob2lyLT5zdGF0dXMgPj0gMCkpIHsKKwkJb2JqaW9fZnJlZV9yZXN1bHQob2lyKTsKIAl9IGVsc2UgewotCQlzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXkgPSBPQkpMQVlPVVQoc3RhdGUtPmxzZWctPnBsc19sYXlvdXQpOworCQlzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXkgPSBvaXItPm9iamxheTsKIAogCQlzcGluX2xvY2soJm9iamxheS0+bG9jayk7CiAJCW9iamxheS0+ZGVsdGFfc3BhY2VfdmFsaWQgPSBPQkpfRFNVX0lOVkFMSUQ7Ci0JCWxpc3RfYWRkKCZvYmpsYXktPmVycl9saXN0LCAmc3RhdGUtPmVycl9saXN0KTsKKwkJbGlzdF9hZGQoJm9iamxheS0+ZXJyX2xpc3QsICZvaXItPmVycl9saXN0KTsKIAkJc3Bpbl91bmxvY2soJm9iamxheS0+bG9jayk7CiAJfQogfQpAQCAtMjM4LDEzICsyMDAsMTMgQEAKICAqIHRoZSBlcnJvciBmb3IgbGF0ZXIgcmVwb3J0aW5nIGF0IGxheW91dC1yZXR1cm4uCiAgKi8KIHZvaWQKLW9iamxheW91dF9pb19zZXRfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbmRleCwKK29iamxheW91dF9pb19zZXRfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIsIHVuc2lnbmVkIGluZGV4LAogCQkJc3RydWN0IHBuZnNfb3NkX29iamlkICpwb29pZCwgaW50IG9zZF9lcnJvciwKIAkJCXU2NCBvZmZzZXQsIHU2NCBsZW5ndGgsIGJvb2wgaXNfd3JpdGUpCiB7Ci0Jc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZzdGF0ZS0+aW9lcnJzW2luZGV4XTsKKwlzdHJ1Y3QgcG5mc19vc2RfaW9lcnIgKmlvZXJyID0gJm9pci0+aW9lcnJzW2luZGV4XTsKIAotCUJVR19PTihpbmRleCA+PSBzdGF0ZS0+bnVtX2NvbXBzKTsKKwlCVUdfT04oaW5kZXggPj0gb2lyLT5udW1fY29tcHMpOwogCWlmIChvc2RfZXJyb3IpIHsKIAkJaW9lcnItPm9lcl9jb21wb25lbnQgPSAqcG9vaWQ7CiAJCWlvZXJyLT5vZXJfY29tcF9vZmZzZXQgPSBvZmZzZXQ7CkBAIC0yODUsMjEgKzI0NywxOCBAQAogfQogCiB2b2lkCi1vYmpsYXlvdXRfcmVhZF9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCBzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKQorb2JqbGF5b3V0X3JlYWRfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLCBzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKQogewotCWludCBlb2YgPSBzdGF0ZS0+ZW9mOwotCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YTsKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEgPSBvaXItPnJwY2RhdGE7CiAKLQlzdGF0ZS0+c3RhdHVzID0gc3RhdHVzOwotCWRwcmludGsoIiVzOiBCZWdpbiBzdGF0dXM9JXpkIGVvZj0lZFxuIiwgX19mdW5jX18sIHN0YXR1cywgZW9mKTsKLQlyZGF0YSA9IHN0YXRlLT5ycGNkYXRhOwotCXJkYXRhLT50YXNrLnRrX3N0YXR1cyA9IHN0YXR1czsKLQlpZiAoc3RhdHVzID49IDApIHsKKwlvaXItPnN0YXR1cyA9IHJkYXRhLT50YXNrLnRrX3N0YXR1cyA9IHN0YXR1czsKKwlpZiAoc3RhdHVzID49IDApCiAJCXJkYXRhLT5yZXMuY291bnQgPSBzdGF0dXM7Ci0JCXJkYXRhLT5yZXMuZW9mID0gZW9mOwotCX0KLQlvYmpsYXlvdXRfaW9kb25lKHN0YXRlKTsKLQkvKiBtdXN0IG5vdCB1c2Ugc3RhdGUgYWZ0ZXIgdGhpcyBwb2ludCAqLworCW9iamxheW91dF9pb2RvbmUob2lyKTsKKwkvKiBtdXN0IG5vdCB1c2Ugb2lyIGFmdGVyIHRoaXMgcG9pbnQgKi8KKworCWRwcmludGsoIiVzOiBSZXR1cm4gc3RhdHVzPSV6ZCBlb2Y9JWQgc3luYz0lZFxuIiwgX19mdW5jX18sCisJCXN0YXR1cywgcmRhdGEtPnJlcy5lb2YsIHN5bmMpOwogCiAJaWYgKHN5bmMpCiAJCXBuZnNfbGRfcmVhZF9kb25lKHJkYXRhKTsKQEAgLTMxNyw0MCArMjc2LDM2IEBACiB7CiAJbG9mZl90IG9mZnNldCA9IHJkYXRhLT5hcmdzLm9mZnNldDsKIAlzaXplX3QgY291bnQgPSByZGF0YS0+YXJncy5jb3VudDsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZTsKLQlzc2l6ZV90IHN0YXR1cyA9IDA7CisJaW50IGVycjsKIAlsb2ZmX3QgZW9mOwogCi0JZHByaW50aygiJXM6IEJlZ2luIGlub2RlICVwIG9mZnNldCAlbGx1IGNvdW50ICVkXG4iLAotCQlfX2Z1bmNfXywgcmRhdGEtPmlub2RlLCBvZmZzZXQsIChpbnQpY291bnQpOwotCiAJZW9mID0gaV9zaXplX3JlYWQocmRhdGEtPmlub2RlKTsKIAlpZiAodW5saWtlbHkob2Zmc2V0ICsgY291bnQgPiBlb2YpKSB7CiAJCWlmIChvZmZzZXQgPj0gZW9mKSB7Ci0JCQlzdGF0dXMgPSAwOworCQkJZXJyID0gMDsKIAkJCXJkYXRhLT5yZXMuY291bnQgPSAwOwogCQkJcmRhdGEtPnJlcy5lb2YgPSAxOworCQkJLypGSVhNRTogZG8gd2UgbmVlZCB0byBjYWxsIHBuZnNfbGRfcmVhZF9kb25lKCkgKi8KIAkJCWdvdG8gb3V0OwogCQl9CiAJCWNvdW50ID0gZW9mIC0gb2Zmc2V0OwogCX0KIAotCXN0YXRlID0gb2JqbGF5b3V0X2FsbG9jX2lvX3N0YXRlKE5GU19JKHJkYXRhLT5pbm9kZSktPmxheW91dCwKLQkJCQkJIHJkYXRhLT5hcmdzLnBhZ2VzLCByZGF0YS0+YXJncy5wZ2Jhc2UsCi0JCQkJCSBvZmZzZXQsIGNvdW50LAotCQkJCQkgcmRhdGEtPmxzZWcsIHJkYXRhLAotCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFzdGF0ZSkpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCXJkYXRhLT5yZXMuZW9mID0gKG9mZnNldCArIGNvdW50KSA+PSBlb2Y7CisJX2ZpeF92ZXJpZnlfaW9fcGFyYW1zKHJkYXRhLT5sc2VnLCAmcmRhdGEtPmFyZ3MucGFnZXMsCisJCQkgICAgICAmcmRhdGEtPmFyZ3MucGdiYXNlLAorCQkJICAgICAgcmRhdGEtPmFyZ3Mub2Zmc2V0LCByZGF0YS0+YXJncy5jb3VudCk7CiAKLQlzdGF0ZS0+ZW9mID0gc3RhdGUtPm9mZnNldCArIHN0YXRlLT5jb3VudCA+PSBlb2Y7CisJZHByaW50aygiJXM6IGlub2RlKCVseCkgb2Zmc2V0IDB4JWxseCBjb3VudCAweCVaeCBlb2Y9JWRcbiIsCisJCV9fZnVuY19fLCByZGF0YS0+aW5vZGUtPmlfaW5vLCBvZmZzZXQsIGNvdW50LCByZGF0YS0+cmVzLmVvZik7CiAKLQlzdGF0dXMgPSBvYmppb19yZWFkX3BhZ2VsaXN0KHN0YXRlKTsKKwllcnIgPSBvYmppb19yZWFkX3BhZ2VsaXN0KHJkYXRhKTsKICBvdXQ6Ci0JZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJVpkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQlyZGF0YS0+cG5mc19lcnJvciA9IHN0YXR1czsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlyZGF0YS0+cG5mc19lcnJvciA9IGVycjsKKwkJZHByaW50aygiJXM6IFJldHVybmVkIEVycm9yICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIFBORlNfTk9UX0FUVEVNUFRFRDsKKwl9CiAJcmV0dXJuIFBORlNfQVRURU1QVEVEOwogfQogCkBAIC0zNzEsMjYgKzMyNiwyMCBAQAogfQogCiB2b2lkCi1vYmpsYXlvdXRfd3JpdGVfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwgc3NpemVfdCBzdGF0dXMsCi0JCSAgICAgYm9vbCBzeW5jKQorb2JqbGF5b3V0X3dyaXRlX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwgc3NpemVfdCBzdGF0dXMsIGJvb2wgc3luYykKIHsKLQlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEgPSBvaXItPnJwY2RhdGE7CiAKLQlkcHJpbnRrKCIlczogQmVnaW5cbiIsIF9fZnVuY19fKTsKLQl3ZGF0YSA9IHN0YXRlLT5ycGNkYXRhOwotCXN0YXRlLT5zdGF0dXMgPSBzdGF0dXM7Ci0Jd2RhdGEtPnRhc2sudGtfc3RhdHVzID0gc3RhdHVzOworCW9pci0+c3RhdHVzID0gd2RhdGEtPnRhc2sudGtfc3RhdHVzID0gc3RhdHVzOwogCWlmIChzdGF0dXMgPj0gMCkgewogCQl3ZGF0YS0+cmVzLmNvdW50ID0gc3RhdHVzOwotCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBzdGF0ZS0+Y29tbWl0dGVkOwotCQlkcHJpbnRrKCIlczogUmV0dXJuIHN0YXR1cyAlZCBjb21taXR0ZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2RhdGEtPnRhc2sudGtfc3RhdHVzLAotCQkJd2RhdGEtPnZlcmYuY29tbWl0dGVkKTsKLQl9IGVsc2UKLQkJZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2RhdGEtPnRhc2sudGtfc3RhdHVzKTsKLQlvYmpsYXlvdXRfaW9kb25lKHN0YXRlKTsKLQkvKiBtdXN0IG5vdCB1c2Ugc3RhdGUgYWZ0ZXIgdGhpcyBwb2ludCAqLworCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBvaXItPmNvbW1pdHRlZDsKKwl9CisJb2JqbGF5b3V0X2lvZG9uZShvaXIpOworCS8qIG11c3Qgbm90IHVzZSBvaXIgYWZ0ZXIgdGhpcyBwb2ludCAqLworCisJZHByaW50aygiJXM6IFJldHVybiBzdGF0dXMgJXpkIGNvbW1pdHRlZCAlZCBzeW5jPSVkXG4iLCBfX2Z1bmNfXywKKwkJc3RhdHVzLCB3ZGF0YS0+dmVyZi5jb21taXR0ZWQsIHN5bmMpOwogCiAJaWYgKHN5bmMpCiAJCXBuZnNfbGRfd3JpdGVfZG9uZSh3ZGF0YSk7CkBAIC00MDcsMzAgKzM1NiwxOCBAQAogb2JqbGF5b3V0X3dyaXRlX3BhZ2VsaXN0KHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEsCiAJCQkgaW50IGhvdykKIHsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZTsKLQlzc2l6ZV90IHN0YXR1czsKKwlpbnQgZXJyOwogCi0JZHByaW50aygiJXM6IEJlZ2luIGlub2RlICVwIG9mZnNldCAlbGx1IGNvdW50ICV1XG4iLAotCQlfX2Z1bmNfXywgd2RhdGEtPmlub2RlLCB3ZGF0YS0+YXJncy5vZmZzZXQsIHdkYXRhLT5hcmdzLmNvdW50KTsKKwlfZml4X3ZlcmlmeV9pb19wYXJhbXMod2RhdGEtPmxzZWcsICZ3ZGF0YS0+YXJncy5wYWdlcywKKwkJCSAgICAgICZ3ZGF0YS0+YXJncy5wZ2Jhc2UsCisJCQkgICAgICB3ZGF0YS0+YXJncy5vZmZzZXQsIHdkYXRhLT5hcmdzLmNvdW50KTsKIAotCXN0YXRlID0gb2JqbGF5b3V0X2FsbG9jX2lvX3N0YXRlKE5GU19JKHdkYXRhLT5pbm9kZSktPmxheW91dCwKLQkJCQkJIHdkYXRhLT5hcmdzLnBhZ2VzLAotCQkJCQkgd2RhdGEtPmFyZ3MucGdiYXNlLAotCQkJCQkgd2RhdGEtPmFyZ3Mub2Zmc2V0LAotCQkJCQkgd2RhdGEtPmFyZ3MuY291bnQsCi0JCQkJCSB3ZGF0YS0+bHNlZywgd2RhdGEsCi0JCQkJCSBHRlBfTk9GUyk7Ci0JaWYgKHVubGlrZWx5KCFzdGF0ZSkpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJZXJyID0gb2JqaW9fd3JpdGVfcGFnZWxpc3Qod2RhdGEsIGhvdyk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJd2RhdGEtPnBuZnNfZXJyb3IgPSBlcnI7CisJCWRwcmludGsoIiVzOiBSZXR1cm5lZCBFcnJvciAlZFxuIiwgX19mdW5jX18sIGVycik7CisJCXJldHVybiBQTkZTX05PVF9BVFRFTVBURUQ7CiAJfQotCi0Jc3RhdGUtPnN5bmMgPSBob3cgJiBGTFVTSF9TWU5DOwotCi0Jc3RhdHVzID0gb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RhdGUsIGhvdyAmIEZMVVNIX1NUQUJMRSk7Ci0gb3V0OgotCWRwcmludGsoIiVzOiBSZXR1cm4gc3RhdHVzICVaZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0Jd2RhdGEtPnBuZnNfZXJyb3IgPSBzdGF0dXM7CiAJcmV0dXJuIFBORlNfQVRURU1QVEVEOwogfQogCkBAIC01MzcsMTQgKzQ3NCwxNCBAQAogc3RhdGljIHZvaWQKIGVuY29kZV9hY2N1bXVsYXRlZF9lcnJvcihzdHJ1Y3Qgb2JqbGF5b3V0ICpvYmpsYXksIF9fYmUzMiAqcCkKIHsKLQlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwgKnRtcDsKKwlzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLCAqdG1wOwogCXN0cnVjdCBwbmZzX29zZF9pb2VyciBhY2N1bXVsYXRlZF9lcnIgPSB7Lm9lcl9lcnJubyA9IDB9OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0YXRlLCB0bXAsICZvYmpsYXktPmVycl9saXN0LCBlcnJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvaXIsIHRtcCwgJm9iamxheS0+ZXJyX2xpc3QsIGVycl9saXN0KSB7CiAJCXVuc2lnbmVkIGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5udW1fY29tcHM7IGkrKykgewotCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZzdGF0ZS0+aW9lcnJzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgb2lyLT5udW1fY29tcHM7IGkrKykgeworCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VyciA9ICZvaXItPmlvZXJyc1tpXTsKIAogCQkJaWYgKCFpb2Vyci0+b2VyX2Vycm5vKQogCQkJCWNvbnRpbnVlOwpAQCAtNTYzLDggKzUwMCw4IEBACiAKIAkJCW1lcmdlX2lvZXJyKCZhY2N1bXVsYXRlZF9lcnIsIGlvZXJyKTsKIAkJfQotCQlsaXN0X2RlbCgmc3RhdGUtPmVycl9saXN0KTsKLQkJb2JqbGF5b3V0X2ZyZWVfaW9fc3RhdGUoc3RhdGUpOworCQlsaXN0X2RlbCgmb2lyLT5lcnJfbGlzdCk7CisJCW9iamlvX2ZyZWVfcmVzdWx0KG9pcik7CiAJfQogCiAJcG5mc19vc2RfeGRyX2VuY29kZV9pb2VycihwLCAmYWNjdW11bGF0ZWRfZXJyKTsKQEAgLTU3Niw3ICs1MTMsNyBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0cmV0dXJuX2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IG9iamxheW91dCAqb2JqbGF5ID0gT0JKTEFZT1VUKHBuZnNsYXkpOwotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLCAqdG1wOworCXN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIsICp0bXA7CiAJX19iZTMyICpzdGFydDsKIAogCWRwcmludGsoIiVzOiBCZWdpblxuIiwgX19mdW5jX18pOwpAQCAtNTg1LDEzICs1MjIsMTMgQEAKIAogCXNwaW5fbG9jaygmb2JqbGF5LT5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGF0ZSwgdG1wLCAmb2JqbGF5LT5lcnJfbGlzdCwgZXJyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2lyLCB0bXAsICZvYmpsYXktPmVycl9saXN0LCBlcnJfbGlzdCkgewogCQlfX2JlMzIgKmxhc3RfeGRyID0gTlVMTCwgKnA7CiAJCXVuc2lnbmVkIGk7CiAJCWludCByZXMgPSAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bnVtX2NvbXBzOyBpKyspIHsKLQkJCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnIgPSAmc3RhdGUtPmlvZXJyc1tpXTsKKwkJZm9yIChpID0gMDsgaSA8IG9pci0+bnVtX2NvbXBzOyBpKyspIHsKKwkJCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnIgPSAmb2lyLT5pb2VycnNbaV07CiAKIAkJCWlmICghaW9lcnItPm9lcl9lcnJubykKIAkJCQljb250aW51ZTsKQEAgLTYxNSw3ICs1NTIsNyBAQAogCQkJfQogCiAJCQlsYXN0X3hkciA9IHA7Ci0JCQlwbmZzX29zZF94ZHJfZW5jb2RlX2lvZXJyKHAsICZzdGF0ZS0+aW9lcnJzW2ldKTsKKwkJCXBuZnNfb3NkX3hkcl9lbmNvZGVfaW9lcnIocCwgJm9pci0+aW9lcnJzW2ldKTsKIAkJfQogCiAJCS8qIFRPRE86IHVzZSB4ZHJfd3JpdGVfcGFnZXMgKi8KQEAgLTYzMSw4ICs1NjgsOCBAQAogCQkJZW5jb2RlX2FjY3VtdWxhdGVkX2Vycm9yKG9iamxheSwgbGFzdF94ZHIpOwogCQkJZ290byBsb29wX2RvbmU7CiAJCX0KLQkJbGlzdF9kZWwoJnN0YXRlLT5lcnJfbGlzdCk7Ci0JCW9iamxheW91dF9mcmVlX2lvX3N0YXRlKHN0YXRlKTsKKwkJbGlzdF9kZWwoJm9pci0+ZXJyX2xpc3QpOworCQlvYmppb19mcmVlX3Jlc3VsdChvaXIpOwogCX0KIGxvb3BfZG9uZToKIAlzcGluX3VubG9jaygmb2JqbGF5LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmggYi9mcy9uZnMvb2JqbGF5b3V0L29iamxheW91dC5oCmluZGV4IGE4MjQ0YzguLjhlYzM0NzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9vYmpsYXlvdXQvb2JqbGF5b3V0LmgKKysrIGIvZnMvbmZzL29iamxheW91dC9vYmpsYXlvdXQuaApAQCAtNzQsMTkgKzc0LDExIEBACiAgKiBwZXItSS9PIG9wZXJhdGlvbiBzdGF0ZQogICogZW1iZWRkZWQgaW4gb2JqZWN0cyBwcm92aWRlciBpb19zdGF0ZSBkYXRhIHN0cnVjdHVyZQogICovCi1zdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlIHsKLQlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKLQotCXN0cnVjdCBwYWdlICoqcGFnZXM7Ci0JdW5zaWduZWQgcGdiYXNlOwotCXVuc2lnbmVkIG5yX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0JbG9mZl90IG9mZnNldDsKLQlib29sIHN5bmM7CitzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyB7CisJc3RydWN0IG9iamxheW91dCAqb2JqbGF5OwogCiAJdm9pZCAqcnBjZGF0YTsKIAlpbnQgc3RhdHVzOyAgICAgICAgICAgICAvKiByZXMgKi8KLQlpbnQgZW9mOyAgICAgICAgICAgICAgICAvKiByZXMgKi8KIAlpbnQgY29tbWl0dGVkOyAgICAgICAgICAvKiByZXMgKi8KIAogCS8qIEVycm9yIHJlcG9ydGluZyAobGF5b3V0X3JldHVybikgKi8KQEAgLTEwMCw2ICs5MiwxOCBAQAogCXN0cnVjdCBwbmZzX29zZF9pb2VyciAqaW9lcnJzOwogfTsKIAorc3RhdGljIGlubGluZQordm9pZCBvYmpsYXlvdXRfaW5pdF9pb2VycnMoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwgdW5zaWduZWQgbnVtX2NvbXBzLAorCQkJc3RydWN0IHBuZnNfb3NkX2lvZXJyICppb2VycnMsIHZvaWQgKnJwY2RhdGEsCisJCQlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbmZzX2xheW91dF90eXBlKQoreworCW9pci0+b2JqbGF5ID0gT0JKTEFZT1VUKHBuZnNfbGF5b3V0X3R5cGUpOworCW9pci0+cnBjZGF0YSA9IHJwY2RhdGE7CisJSU5JVF9MSVNUX0hFQUQoJm9pci0+ZXJyX2xpc3QpOworCW9pci0+bnVtX2NvbXBzID0gbnVtX2NvbXBzOworCW9pci0+aW9lcnJzID0gaW9lcnJzOworfQorCiAvKgogICogUmFpZCBlbmdpbmUgSS9PIEFQSQogICovCkBAIC0xMTAsMjggKzExNCwyNCBAQAogCWdmcF90IGdmcF9mbGFncyk7CiBleHRlcm4gdm9pZCBvYmppb19mcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpOwogCi1leHRlcm4gaW50IG9iamlvX2FsbG9jX2lvX3N0YXRlKAotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLAotCXN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKipvdXRwLAotCWdmcF90IGdmcF9mbGFncyk7Ci1leHRlcm4gdm9pZCBvYmppb19mcmVlX2lvX3N0YXRlKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlKTsKKy8qIG9iamlvX2ZyZWVfcmVzdWx0IHdpbGwgZnJlZSB0aGVzZSBAb2lyIHN0cnVjdHMgcmVjaWV2ZWQgZnJvbQorICogb2JqbGF5b3V0X3tyZWFkLHdyaXRlfV9kb25lCisgKi8KK2V4dGVybiB2b2lkIG9iamlvX2ZyZWVfcmVzdWx0KHN0cnVjdCBvYmpsYXlvdXRfaW9fcmVzICpvaXIpOwogCi1leHRlcm4gc3NpemVfdCBvYmppb19yZWFkX3BhZ2VsaXN0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKm9sX3N0YXRlKTsKLWV4dGVybiBzc2l6ZV90IG9iamlvX3dyaXRlX3BhZ2VsaXN0KHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKm9sX3N0YXRlLAotCQkJCSAgICBib29sIHN0YWJsZSk7CitleHRlcm4gaW50IG9iamlvX3JlYWRfcGFnZWxpc3Qoc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhKTsKK2V4dGVybiBpbnQgb2JqaW9fd3JpdGVfcGFnZWxpc3Qoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSwgaW50IGhvdyk7CiAKIC8qCiAgKiBjYWxsYmFjayBBUEkKICAqLwotZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X2lvX3NldF9yZXN1bHQoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGUsCitleHRlcm4gdm9pZCBvYmpsYXlvdXRfaW9fc2V0X3Jlc3VsdChzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3JlcyAqb2lyLAogCQkJdW5zaWduZWQgaW5kZXgsIHN0cnVjdCBwbmZzX29zZF9vYmppZCAqcG9vaWQsCiAJCQlpbnQgb3NkX2Vycm9yLCB1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoLCBib29sIGlzX3dyaXRlKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1vYmpsYXlvdXRfYWRkX2RlbHRhX3NwYWNlX3VzZWQoc3RydWN0IG9iamxheW91dF9pb19zdGF0ZSAqc3RhdGUsIHM2NCBzcGFjZV91c2VkKQorb2JqbGF5b3V0X2FkZF9kZWx0YV9zcGFjZV91c2VkKHN0cnVjdCBvYmpsYXlvdXQgKm9iamxheSwgczY0IHNwYWNlX3VzZWQpCiB7Ci0Jc3RydWN0IG9iamxheW91dCAqb2JqbGF5ID0gT0JKTEFZT1VUKHN0YXRlLT5sc2VnLT5wbHNfbGF5b3V0KTsKLQogCS8qIElmIG9uZSBvZiB0aGUgSS9PcyBlcnJvcmVkIG91dCBhbmQgdGhlIGRlbHRhX3NwYWNlX3VzZWQgd2FzCiAJICogaW52YWxpZCB3ZSByZW5kZXIgdGhlIGNvbXBsZXRlIHJlcG9ydCBhcyBpbnZhbGlkLiBQcm90b2NvbCBtYW5kYXRlCiAJICogdGhlIERTVSBiZSBhY2N1cmF0ZSBvciBub3QgcmVwb3J0ZWQuCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAlzcGluX3VubG9jaygmb2JqbGF5LT5sb2NrKTsKIH0KIAotZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X3JlYWRfZG9uZShzdHJ1Y3Qgb2JqbGF5b3V0X2lvX3N0YXRlICpzdGF0ZSwKK2V4dGVybiB2b2lkIG9iamxheW91dF9yZWFkX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwKIAkJCQlzc2l6ZV90IHN0YXR1cywgYm9vbCBzeW5jKTsKLWV4dGVybiB2b2lkIG9iamxheW91dF93cml0ZV9kb25lKHN0cnVjdCBvYmpsYXlvdXRfaW9fc3RhdGUgKnN0YXRlLAorZXh0ZXJuIHZvaWQgb2JqbGF5b3V0X3dyaXRlX2RvbmUoc3RydWN0IG9iamxheW91dF9pb19yZXMgKm9pciwKIAkJCQkgc3NpemVfdCBzdGF0dXMsIGJvb2wgc3luYyk7CiAKIGV4dGVybiBpbnQgb2JqbGF5b3V0X2dldF9kZXZpY2VpbmZvKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKnBuZnNsYXksCmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IGI2MDk3MGMuLjU2NjhmN2MgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicG5mcy5oIgpAQCAtNDEsNyArNDIsNyBAQAogCiAvKioKICAqIG5mc19jcmVhdGVfcmVxdWVzdCAtIENyZWF0ZSBhbiBORlMgcmVhZC93cml0ZSByZXF1ZXN0LgotICogQGZpbGU6IGZpbGUgZGVzY3JpcHRvciB0byB1c2UKKyAqIEBjdHg6IG9wZW4gY29udGV4dCB0byB1c2UKICAqIEBpbm9kZTogaW5vZGUgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgYXR0YWNoZWQKICAqIEBwYWdlOiBwYWdlIHRvIHdyaXRlCiAgKiBAb2Zmc2V0OiBzdGFydGluZyBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIGZvciB0aGUgd3JpdGUKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IGVlNzNkOWEuLmJhZjczNTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBuZnMuaCIKICNpbmNsdWRlICJpb3N0YXQuaCIKQEAgLTE0NDMsMTcgKzE0NDQsMzEgQEAKIAkvKiBOb3RlIGt6YWxsb2MgZW5zdXJlcyBkYXRhLT5yZXMuc2VxX3Jlcy5zcl9zbG90ID09IE5VTEwgKi8KIAlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfTk9GUyk7CiAJaWYgKCFkYXRhKSB7Ci0JCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAorCWlmICghdGVzdF9iaXQoTkZTX0lOT19MQVlPVVRDT01NSVQsICZuZnNpLT5mbGFncykpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsICZuZnNpLT5mbGFncykpIHsKKwkJaWYgKCFzeW5jKSB7CisJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlzdGF0dXMgPSB3YWl0X29uX2JpdF9sb2NrKCZuZnNpLT5mbGFncywgTkZTX0lOT19MQVlPVVRDT01NSVRUSU5HLAorCQkJCQluZnNfd2FpdF9iaXRfa2lsbGFibGUsIFRBU0tfS0lMTEFCTEUpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKIAlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bHNlZ19saXN0KTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19JTk9fTEFZT1VUQ09NTUlULCAmbmZzaS0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcsICZuZnNpLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkJa2ZyZWUoZGF0YSk7Ci0JCWdvdG8gb3V0OworCQl3YWtlX3VwX2JpdCgmbmZzaS0+ZmxhZ3MsIE5GU19JTk9fTEFZT1VUQ09NTUlUVElORyk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJcG5mc19saXN0X3dyaXRlX2xzZWcoaW5vZGUsICZkYXRhLT5sc2VnX2xpc3QpOwpAQCAtMTQ3NSw2ICsxNDkwLDExIEBACiAKIAlzdGF0dXMgPSBuZnM0X3Byb2NfbGF5b3V0Y29tbWl0KGRhdGEsIHN5bmMpOwogb3V0OgorCWlmIChzdGF0dXMpCisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKK291dF9mcmVlOgorCWtmcmVlKGRhdGEpOworCWdvdG8gb3V0OwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnNfZGV2LmMgYi9mcy9uZnMvcG5mc19kZXYuYwppbmRleCA2ZmRhNTIyLi40ZjM1OWQyIDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mc19kZXYuYworKysgYi9mcy9uZnMvcG5mc19kZXYuYwpAQCAtMjgsNiArMjgsNyBAQAogICogIHN1Y2ggZGFtYWdlcy4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAicG5mcy5oIgogCiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BORlMKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggMjIxOWM4OC4uMWRkYTc4ZCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xMjQzLDcgKzEyNDQsNiBAQAogewogCXN0cnVjdCBuZnNfd3JpdGVhcmdzCSphcmdwID0gJmRhdGEtPmFyZ3M7CiAJc3RydWN0IG5mc193cml0ZXJlcwkqcmVzcCA9ICZkYXRhLT5yZXM7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlciA9IE5GU19TRVJWRVIoZGF0YS0+aW5vZGUpOwogCWludCBzdGF0dXM7CiAKIAlkcHJpbnRrKCJORlM6ICU1dSBuZnNfd3JpdGViYWNrX2RvbmUgKHN0YXR1cyAlZClcbiIsCkBAIC0xMjc3LDcgKzEyNzcsNyBAQAogCQlpZiAodGltZV9iZWZvcmUoY29tcGxhaW4sIGppZmZpZXMpKSB7CiAJCQlkcHJpbnRrKCJORlM6ICAgICAgIGZhdWx0eSBORlMgc2VydmVyICVzOiIKIAkJCQkiIChjb21taXR0ZWQgPSAlZCkgIT0gKHN0YWJsZSA9ICVkKVxuIiwKLQkJCQlzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2hvc3RuYW1lLAorCQkJCU5GU19TRVJWRVIoZGF0YS0+aW5vZGUpLT5uZnNfY2xpZW50LT5jbF9ob3N0bmFtZSwKIAkJCQlyZXNwLT52ZXJmLT5jb21taXR0ZWQsIGFyZ3AtPnN0YWJsZSk7CiAJCQljb21wbGFpbiA9IGppZmZpZXMgKyAzMDAgKiBIWjsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCBhZDg4ZjFjLi45YzUxYWZmIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImFjbC5oIgogCiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggNjZkMDk1ZC4uYjZmYTc5MiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiBuZnNlcnJfYmFkX3hkcjsKIAl9Ci0JdyAmPSAhTkZTNF9TSEFSRV9BQ0NFU1NfTUFTSzsKKwl3ICY9IH5ORlM0X1NIQVJFX0FDQ0VTU19NQVNLOwogCWlmICghdykKIAkJcmV0dXJuIG5mc19vazsKIAlpZiAoIWFyZ3AtPm1pbm9ydmVyc2lvbikKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IGRiMzRhNTguLmM0NWEyZWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjVfZW5jdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgImlkbWFwLmgiCiAjaW5jbHVkZSAibmZzZC5oIgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggZGM1YTFiZi4uZWRhN2Q3ZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCkBAIC0yNTYsNiArMjU3LDggQEAKIAluZnNkX3NlcnYgPSBOVUxMOwogCW5mc2Rfc2h1dGRvd24oKTsKIAorCXN2Y19ycGNiX2NsZWFudXAoc2Vydik7CisKIAlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBsYXN0IHNlcnZlciBoYXMgZXhpdGVkLCBmbHVzaGluZyBleHBvcnQgIgogCQkJICAgICJjYWNoZVxuIik7CiAJbmZzZF9leHBvcnRfZmx1c2goKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggNjY2NjI4Yi4uYjUwZmZiNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAgZmFpbGVkX2FjbDoKICBmYWlsZWRfYm1hcDoKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCWlwdXQoaW5vZGUpOyAgLyogcmF3X2lub2RlIHdpbGwgYmUgZGVsZXRlZCB0aHJvdWdoCiAJCQkgZ2VuZXJpY19kZWxldGVfaW5vZGUoKSAqLwogCWdvdG8gZmFpbGVkOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9tb2RlKTsKIAlpbm9kZS0+aV91aWQgPSAodWlkX3QpbGUzMl90b19jcHUocmF3X2lub2RlLT5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9naWQpOwotCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCkpOwogCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbGU2NF90b19jcHUocmF3X2lub2RlLT5pX210aW1lKTsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBsZTY0X3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25hbWVpLmMgYi9mcy9uaWxmczIvbmFtZWkuYwppbmRleCBhMzE0MTk5Li43Njg5ODJkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmFtZWkuYworKysgYi9mcy9uaWxmczIvbmFtZWkuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCW5pbGZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAogCQkJICAgICAgImRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkXG4iLAogCQkJICAgICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJZXJyID0gbmlsZnNfZGVsZXRlX2VudHJ5KGRlLCBwYWdlKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25pbGZzLmggYi9mcy9uaWxmczIvbmlsZnMuaAppbmRleCAyNTVkNWUxLi4zNzc3ZDEzIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmlsZnMuaAorKysgYi9mcy9uaWxmczIvbmlsZnMuaApAQCAtMjc2LDEwICsyNzYsMTAgQEAKIC8qIHN1cGVyLmMgKi8KIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIG5pbGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHZvaWQgbmlsZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgbmlsZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgbmlsZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIG5pbGZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogZXh0ZXJuIHN0cnVjdCBuaWxmc19zdXBlcl9ibG9jayAqCiBuaWxmc19yZWFkX3N1cGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1NjQsIGludCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIGV4dGVybiBpbnQgbmlsZnNfc3RvcmVfbWFnaWNfYW5kX29wdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGVidWcuaCBiL2ZzL250ZnMvZGVidWcuaAppbmRleCAyMTQyYjFjLi41M2MyN2VhIDEwMDY0NAotLS0gYS9mcy9udGZzL2RlYnVnLmgKKysrIGIvZnMvbnRmcy9kZWJ1Zy5oCkBAIC0zMCw4ICszMCw5IEBACiAKIGV4dGVybiBpbnQgZGVidWdfbXNnczsKIAotZXh0ZXJuIHZvaWQgX19udGZzX2RlYnVnKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQljb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCit2b2lkIF9fbnRmc19kZWJ1Zyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogLyoqCiAgKiBudGZzX2RlYnVnIC0gd3JpdGUgYSBkZWJ1ZyBsZXZlbCBtZXNzYWdlIHRvIHN5c2xvZwogICogQGY6CQlhIHByaW50ZiBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKQEAgLTUyLDEyICs1MywxNCBAQAogCiAjZW5kaWYJLyogIURFQlVHICovCiAKLWV4dGVybiB2b2lkIF9fbnRmc193YXJuaW5nKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuICBfX3ByaW50ZigzLCA0KQordm9pZCBfX250ZnNfd2FybmluZyhjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNkZWZpbmUgbnRmc193YXJuaW5nKHNiLCBmLCBhLi4uKQlfX250ZnNfd2FybmluZyhfX2Z1bmNfXywgc2IsIGYsICMjYSkKIAotZXh0ZXJuIHZvaWQgX19udGZzX2Vycm9yKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuICBfX3ByaW50ZigzLCA0KQordm9pZCBfX250ZnNfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2RlZmluZSBudGZzX2Vycm9yKHNiLCBmLCBhLi4uKQkJX19udGZzX2Vycm9yKF9fZnVuY19fLCBzYiwgZiwgIyNhKQogCiAjZW5kaWYgLyogX0xJTlVYX05URlNfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IDEzNzE0ODcuLjk3ZTJkYWMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogCSAqIG1pZ2h0IGJlIHRyaWNreSBkdWUgdG8gdmZzIGludGVyYWN0aW9ucy4gTmVlZCB0byB0aGluayBhYm91dCB0aGlzCiAJICogc29tZSBtb3JlIHdoZW4gaW1wbGVtZW50aW5nIHRoZSB1bmxpbmsgY29tbWFuZC4KIAkgKi8KLQl2aS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KG0tPmxpbmtfY291bnQpOworCXNldF9ubGluayh2aSwgbGUxNl90b19jcHUobS0+bGlua19jb3VudCkpOwogCS8qCiAJICogRklYTUU6IFJlcGFyc2UgcG9pbnRzIGNhbiBoYXZlIHRoZSBkaXJlY3RvcnkgYml0IHNldCBldmVuIHRob3VnaAogCSAqIHRoZXkgd291bGQgYmUgU19JRkxOSy4gTmVlZCB0byBkZWFsIHdpdGggdGhpcyBmdXJ0aGVyIGJlbG93IHdoZW4gd2UKQEAgLTYzNCw3ICs2MzQsNyBAQAogCQl2aS0+aV9tb2RlICY9IH52b2wtPmRtYXNrOwogCQkvKiBUaGluZ3MgYnJlYWsgd2l0aG91dCB0aGlzIGtsdWRnZSEgKi8KIAkJaWYgKHZpLT5pX25saW5rID4gMSkKLQkJCXZpLT5pX25saW5rID0gMTsKKwkJCXNldF9ubGluayh2aSwgMSk7CiAJfSBlbHNlIHsKIAkJdmktPmlfbW9kZSB8PSBTX0lGUkVHOwogCQkvKiBBcHBseSB0aGUgZmlsZSBwZXJtaXNzaW9ucyBtYXNrIHNldCBpbiB0aGUgbW91bnQgb3B0aW9ucy4gKi8KQEAgLTEyNDIsNyArMTI0Miw3IEBACiAJdmktPmlfdmVyc2lvbgk9IGJhc2VfdmktPmlfdmVyc2lvbjsKIAl2aS0+aV91aWQJPSBiYXNlX3ZpLT5pX3VpZDsKIAl2aS0+aV9naWQJPSBiYXNlX3ZpLT5pX2dpZDsKLQl2aS0+aV9ubGluawk9IGJhc2VfdmktPmlfbmxpbms7CisJc2V0X25saW5rKHZpLCBiYXNlX3ZpLT5pX25saW5rKTsKIAl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CiAJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOwogCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAJdmktPmlfdmVyc2lvbgk9IGJhc2VfdmktPmlfdmVyc2lvbjsKIAl2aS0+aV91aWQJPSBiYXNlX3ZpLT5pX3VpZDsKIAl2aS0+aV9naWQJPSBiYXNlX3ZpLT5pX2dpZDsKLQl2aS0+aV9ubGluawk9IGJhc2VfdmktPmlfbmxpbms7CisJc2V0X25saW5rKHZpLCBiYXNlX3ZpLT5pX25saW5rKTsKIAl2aS0+aV9tdGltZQk9IGJhc2VfdmktPmlfbXRpbWU7CiAJdmktPmlfY3RpbWUJPSBiYXNlX3ZpLT5pX2N0aW1lOwogCXZpLT5pX2F0aW1lCT0gYmFzZV92aS0+aV9hdGltZTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCmluZGV4IGRiNWVlNGIuLmFkN2QwYzEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCA4NTgyZTNmLi5lMjg3OGI1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMjI5Miw3ICsyMjkyLDcgQEAKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwogCiAJaV9zaXplX3dyaXRlKGlub2RlLCBzaXplKTsKLQlpbm9kZS0+aV9ubGluayA9IDI7CisJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOwogCiAJcmV0ID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlLCBkaV9iaCk7CkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBuZXdfYmgpOwogCiAJaV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCWlub2RlLT5pX25saW5rID0gMjsKKwlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCWlub2RlLT5pX2Jsb2NrcyA9IG9jZnMyX2lub2RlX3NlY3Rvcl9jb3VudChpbm9kZSk7CiAJc3RhdHVzID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlLCBmZV9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKaW5kZXggNTZmODJjYi4uMGUyOGUyNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgImNsdXN0ZXIvaGVhcnRiZWF0LmgiCiAjaW5jbHVkZSAiY2x1c3Rlci9ub2RlbWFuYWdlci5oIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IDc2NDJkN2MuLmUxZWQ1ZTUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTIwOTIsNyArMjA5Miw3IEBACiAJaW5vZGUtPmlfdWlkICAgICA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2l1aWQpOwogCWlub2RlLT5pX2dpZCAgICAgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9pZ2lkKTsKIAlpbm9kZS0+aV9tb2RlICAgID0gYmUxNl90b19jcHUobHZiLT5sdmJfaW1vZGUpOwotCWlub2RlLT5pX25saW5rICAgPSBiZTE2X3RvX2NwdShsdmItPmx2Yl9pbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgYmUxNl90b19jcHUobHZiLT5sdmJfaW5saW5rKSk7CiAJb2NmczJfdW5wYWNrX3RpbWVzcGVjKCZpbm9kZS0+aV9hdGltZSwKIAkJCSAgICAgIGJlNjRfdG9fY3B1KGx2Yi0+bHZiX2lhdGltZV9wYWNrZWQpKTsKIAlvY2ZzMl91bnBhY2tfdGltZXNwZWMoJmlub2RlLT5pX210aW1lLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggYjRjOGJiNi4uYTIyZDJjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSk7CiAKLQlpbm9kZS0+aV9ubGluayA9IG9jZnMyX3JlYWRfbGlua3NfY291bnQoZmUpOworCXNldF9ubGluayhpbm9kZSwgb2NmczJfcmVhZF9saW5rc19jb3VudChmZSkpOwogCiAJdHJhY2Vfb2NmczJfcG9wdWxhdGVfaW5vZGUoT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkJCSAgIGxlMzJfdG9fY3B1KGZlLT5pX2ZsYWdzKSk7CkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogCU9DRlMyX0koaW5vZGUpLT5pcF9keW5fZmVhdHVyZXMgPSBsZTE2X3RvX2NwdShmZS0+aV9keW5fZmVhdHVyZXMpOwogCW9jZnMyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAJaV9zaXplX3dyaXRlKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBvY2ZzMl9yZWFkX2xpbmtzX2NvdW50KGZlKTsKKwlzZXRfbmxpbmsoaW5vZGUsIG9jZnMyX3JlYWRfbGlua3NfY291bnQoZmUpKTsKIAlpbm9kZS0+aV91aWQgPSBsZTMyX3RvX2NwdShmZS0+aV91aWQpOwogCWlub2RlLT5pX2dpZCA9IGxlMzJfdG9fY3B1KGZlLT5pX2dpZCk7CiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KGZlLT5pX21vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggNTNhYTQxZS4uYThiMmJmZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xOTksOSArMTk5LDcgQEAKIAkgKiB0aGVzZSBhcmUgdXNlZCBieSB0aGUgc3VwcG9ydCBmdW5jdGlvbnMgaGVyZSBhbmQgaW4KIAkgKiBjYWxsZXJzLiAqLwogCWlmIChTX0lTRElSKG1vZGUpKQotCQlpbm9kZS0+aV9ubGluayA9IDI7Ci0JZWxzZQotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCXNldF9ubGluayhpbm9kZSwgMik7CiAJaW5vZGVfaW5pdF9vd25lcihpbm9kZSwgZGlyLCBtb2RlKTsKIAlkcXVvdF9pbml0aWFsaXplKGlub2RlKTsKIAlyZXR1cm4gaW5vZGU7CkBAIC0xMzc5LDcgKzEzNzcsNyBAQAogCX0KIAogCWlmIChuZXdfaW5vZGUpIHsKLQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsobmV3X2lub2RlKTsKIAkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTEzODcsOSArMTM4NSw5IEBACiAJaWYgKHVwZGF0ZV9kb3RfZG90KSB7CiAJCXN0YXR1cyA9IG9jZnMyX3VwZGF0ZV9lbnRyeShvbGRfaW5vZGUsIGhhbmRsZSwKIAkJCQkJICAgICZvbGRfaW5vZGVfZG90X2RvdF9yZXMsIG5ld19kaXIpOwotCQlvbGRfZGlyLT5pX25saW5rLS07CisJCWRyb3Bfbmxpbmsob2xkX2Rpcik7CiAJCWlmIChuZXdfaW5vZGUpIHsKLQkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQkJZHJvcF9ubGluayhuZXdfaW5vZGUpOwogCQl9IGVsc2UgewogCQkJaW5jX25saW5rKG5ld19kaXIpOwogCQkJbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKQEAgLTIwMTgsNyArMjAxNiw3IEBACiAJb3JwaGFuX2ZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3JwaGFuX2Rpcl9iaC0+Yl9kYXRhOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlvY2ZzMl9hZGRfbGlua3NfY291bnQob3JwaGFuX2ZlLCAxKTsKLQlvcnBoYW5fZGlyX2lub2RlLT5pX25saW5rID0gb2NmczJfcmVhZF9saW5rc19jb3VudChvcnBoYW5fZmUpOworCXNldF9ubGluayhvcnBoYW5fZGlyX2lub2RlLCBvY2ZzMl9yZWFkX2xpbmtzX2NvdW50KG9ycGhhbl9mZSkpOwogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBvcnBoYW5fZGlyX2JoKTsKIAogCXN0YXR1cyA9IF9fb2NmczJfYWRkX2VudHJ5KGhhbmRsZSwgb3JwaGFuX2Rpcl9pbm9kZSwgbmFtZSwKQEAgLTIxMTYsNyArMjExNCw3IEBACiAJb3JwaGFuX2ZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgb3JwaGFuX2Rpcl9iaC0+Yl9kYXRhOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlvY2ZzMl9hZGRfbGlua3NfY291bnQob3JwaGFuX2ZlLCAtMSk7Ci0Jb3JwaGFuX2Rpcl9pbm9kZS0+aV9ubGluayA9IG9jZnMyX3JlYWRfbGlua3NfY291bnQob3JwaGFuX2ZlKTsKKwlzZXRfbmxpbmsob3JwaGFuX2Rpcl9pbm9kZSwgb2NmczJfcmVhZF9saW5rc19jb3VudChvcnBoYW5fZmUpKTsKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgb3JwaGFuX2Rpcl9iaCk7CiAKIGxlYXZlOgpAQCAtMjI4Miw3ICsyMjgwLDcgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCS8qIGRvIHRoZSByZWFsIHdvcmsgbm93LiAqLwogCXN0YXR1cyA9IF9fb2NmczJfbWtub2RfbG9ja2VkKGRpciwgaW5vZGUsCiAJCQkJICAgICAgMCwgJm5ld19kaV9iaCwgcGFyZW50X2RpX2JoLCBoYW5kbGUsCkBAIC0yNDM3LDcgKzI0MzUsNyBAQAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCWxlMzJfYWRkX2NwdSgmZGktPmlfZmxhZ3MsIC1PQ0ZTMl9PUlBIQU5FRF9GTCk7CiAJZGktPmlfb3JwaGFuZWRfc2xvdCA9IDA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOworCXNldF9ubGluayhpbm9kZSwgMSk7CiAJb2NmczJfc2V0X2xpbmtzX2NvdW50KGRpLCBpbm9kZS0+aV9ubGluayk7CiAJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuaCBiL2ZzL29jZnMyL3N1cGVyLmgKaW5kZXggNDBjN2RlMC4uNzRmZjc0YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuaAorKysgYi9mcy9vY2ZzMi9zdXBlci5oCkBAIC0zMSwxNyArMzEsMTUgQEAKIGludCBvY2ZzMl9wdWJsaXNoX2dldF9tb3VudF9zdGF0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgIGludCBub2RlX251bSk7CiAKLXZvaWQgX19vY2ZzMl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkgICBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworX19wcmludGYoMywgNCkKK3ZvaWQgX19vY2ZzMl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIG9jZnMyX2Vycm9yKHNiLCBmbXQsIGFyZ3MuLi4pIF9fb2NmczJfZXJyb3Ioc2IsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIGZtdCwgIyNhcmdzKQogCi12b2lkIF9fb2NmczJfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJICAgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK19fcHJpbnRmKDMsIDQpCit2b2lkIF9fb2NmczJfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2RlZmluZSBvY2ZzMl9hYm9ydChzYiwgZm10LCBhcmdzLi4uKSBfX29jZnMyX2Fib3J0KHNiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmbXQsICMjYXJncykKIApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IGY3MTE5MjEuLjIyYzQxYjUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTY4NSw2ICs2ODUsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cF9hbGw7CiAKKwllcnJvciA9IGJyZWFrX2xlYXNlKGlub2RlLCBmLT5mX2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cF9hbGw7CisKIAlpZiAoIW9wZW4gJiYgZi0+Zl9vcCkKIAkJb3BlbiA9IGYtPmZfb3AtPm9wZW47CiAJaWYgKG9wZW4pIHsKZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwppbmRleCBhMmE1YmZmLi5lNGUwZmY3IDEwMDY0NAotLS0gYS9mcy9vcGVucHJvbWZzL2lub2RlLmMKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKIAkJaW5vZGUtPmlfb3AgPSAmb3BlbnByb21faW5vZGVfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAkJYnJlYWs7CiAJY2FzZSBvcF9pbm9kZV9wcm9wOgogCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgIm9wdGlvbnMiKSAmJiAobGVuID09IDE3KSAmJgpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCWVsc2UKIAkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsKIAkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tZnNfcHJvcF9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IGVudF9vaS0+dS5wcm9wLT5sZW5ndGg7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IGFmOWZkZjAuLmJkOGFlNzggMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtNDksMTggKzQ5LDIwIEBACiAjZGVmaW5lIGxkbV9lcnJvcihmLCBhLi4uKSBfbGRtX3ByaW50ayAoS0VSTl9FUlIsICAgX19mdW5jX18sIGYsICMjYSkKICNkZWZpbmUgbGRtX2luZm8oZiwgYS4uLikgIF9sZG1fcHJpbnRrIChLRVJOX0lORk8sICBfX2Z1bmNfXywgZiwgIyNhKQogCi1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKLXN0YXRpYyB2b2lkIF9sZG1fcHJpbnRrIChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCQkgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMywgNCkKK3ZvaWQgX2xkbV9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLQlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydCAoYXJncywgZm10KTsKLQl2c25wcmludGYgKGJ1Ziwgc2l6ZW9mIChidWYpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZCAoYXJncyk7CiAKLQlwcmludGsgKCIlcyVzKCk6ICVzXG4iLCBsZXZlbCwgZnVuY3Rpb24sIGJ1Zik7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50aygiJXMlcygpOiAlcFZcbiIsIGxldmVsLCBmdW5jdGlvbiwgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDBlMGJlMWQuLjQwNjVmMDcgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTEyNTQsNiArMTI1NCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwaXBlZnNfb3BzID0gewogCS5kZXN0cm95X2lub2RlID0gZnJlZV9pbm9kZV9ub25yY3UsCisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvcG9zaXhfYWNsLmMgYi9mcy9wb3NpeF9hY2wuYwppbmRleCAxMDAyN2I0Li5jZWE0NjIzIDEwMDY0NAotLS0gYS9mcy9wb3NpeF9hY2wuYworKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtMjE4LDYgKzIxOCw4IEBACiAJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZSwgKm1hc2tfb2JqOwogCWludCBmb3VuZCA9IDA7CiAKKwl3YW50ICY9IE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMgfCBNQVlfTk9UX0JMT0NLOworCiAJRk9SRUFDSF9BQ0xfRU5UUlkocGEsIGFjbCwgcGUpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2gocGEtPmVfdGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9VU0VSX09CSjoKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNWViMDIwNi4uODUxYmEzZCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTExMDcsMTMgKzExMDcsNiBAQAogCQlnb3RvIGVycl9zaWdoYW5kOwogCX0KIAotCWlmIChvb21fYWRqdXN0ICE9IHRhc2stPnNpZ25hbC0+b29tX2FkaikgewotCQlpZiAob29tX2FkanVzdCA9PSBPT01fRElTQUJMRSkKLQkJCWF0b21pY19pbmMoJnRhc2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWlmICh0YXNrLT5zaWduYWwtPm9vbV9hZGogPT0gT09NX0RJU0FCTEUpCi0JCQlhdG9taWNfZGVjKCZ0YXNrLT5tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCX0KLQogCS8qCiAJICogV2FybiB0aGF0IC9wcm9jL3BpZC9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsIHNlZQogCSAqIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dC4KQEAgLTEyMTUsMTIgKzEyMDgsNiBAQAogCQlnb3RvIGVycl9zaWdoYW5kOwogCX0KIAotCWlmIChvb21fc2NvcmVfYWRqICE9IHRhc2stPnNpZ25hbC0+b29tX3Njb3JlX2FkaikgewotCQlpZiAob29tX3Njb3JlX2FkaiA9PSBPT01fU0NPUkVfQURKX01JTikKLQkJCWF0b21pY19pbmMoJnRhc2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWlmICh0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gT09NX1NDT1JFX0FESl9NSU4pCi0JCQlhdG9taWNfZGVjKCZ0YXNrLT5tbS0+b29tX2Rpc2FibGVfY291bnQpOwotCX0KIAl0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPSBvb21fc2NvcmVfYWRqOwogCWlmIChoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0KGN1cnJlbnQsIENBUF9TWVNfUkVTT1VSQ0UpKQogCQl0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGpfbWluID0gb29tX3Njb3JlX2FkajsKQEAgLTIyNjEsNyArMjI0OCw3IEBACiAJZWkgPSBQUk9DX0koaW5vZGUpOwogCWlub2RlLT5pX21vZGUgPSBwLT5tb2RlOwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlpbm9kZS0+aV9ubGluayA9IDI7CS8qIFVzZSBnZXRhdHRyIHRvIGZpeCBpZiBuZWNlc3NhcnkgKi8KKwkJc2V0X25saW5rKGlub2RlLCAyKTsJLyogVXNlIGdldGF0dHIgdG8gZml4IGlmIG5lY2Vzc2FyeSAqLwogCWlmIChwLT5pb3ApCiAJCWlub2RlLT5pX29wID0gcC0+aW9wOwogCWlmIChwLT5mb3ApCkBAIC0yNjU1LDcgKzI2NDIsNyBAQAogCiAJaW5vZGUtPmlfbW9kZSA9IHAtPm1vZGU7CiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCWlub2RlLT5pX25saW5rID0gMjsKKwkJc2V0X25saW5rKGlub2RlLCAyKTsKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJaW5vZGUtPmlfc2l6ZSA9IDY0OwogCWlmIChwLT5pb3ApCkBAIC0yOTk0LDggKzI5ODEsOCBAQAogCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RnaWRfYmFzZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZsYWdzfD1TX0lNTVVUQUJMRTsKIAotCWlub2RlLT5pX25saW5rID0gMiArIHBpZF9lbnRyeV9jb3VudF9kaXJzKHRnaWRfYmFzZV9zdHVmZiwKLQkJQVJSQVlfU0laRSh0Z2lkX2Jhc2Vfc3R1ZmYpKTsKKwlzZXRfbmxpbmsoaW5vZGUsIDIgKyBwaWRfZW50cnlfY291bnRfZGlycyh0Z2lkX2Jhc2Vfc3R1ZmYsCisJCQkJCQkgIEFSUkFZX1NJWkUodGdpZF9iYXNlX3N0dWZmKSkpOwogCiAJZF9zZXRfZF9vcChkZW50cnksICZwaWRfZGVudHJ5X29wZXJhdGlvbnMpOwogCkBAIC0zMjQ2LDggKzMyMzMsOCBAQAogCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RpZF9iYXNlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZmxhZ3N8PVNfSU1NVVRBQkxFOwogCi0JaW5vZGUtPmlfbmxpbmsgPSAyICsgcGlkX2VudHJ5X2NvdW50X2RpcnModGlkX2Jhc2Vfc3R1ZmYsCi0JCUFSUkFZX1NJWkUodGlkX2Jhc2Vfc3R1ZmYpKTsKKwlzZXRfbmxpbmsoaW5vZGUsIDIgKyBwaWRfZW50cnlfY291bnRfZGlycyh0aWRfYmFzZV9zdHVmZiwKKwkJCQkJCSAgQVJSQVlfU0laRSh0aWRfYmFzZV9zdHVmZikpKTsKIAogCWRfc2V0X2Rfb3AoZGVudHJ5LCAmcGlkX2RlbnRyeV9vcGVyYXRpb25zKTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCA5ZDk5MTMxLi4xMDA5MGQ5IDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gUFJPQ19JKGlub2RlKS0+cGRlOwogCWlmIChkZSAmJiBkZS0+bmxpbmspCi0JCWlub2RlLT5pX25saW5rID0gZGUtPm5saW5rOworCQlzZXRfbmxpbmsoaW5vZGUsIGRlLT5ubGluayk7CiAKIAlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCA3ZWQ3MmQ2Li43NzM3YzU0IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJaWYgKGRlLT5zaXplKQogCQkJaW5vZGUtPmlfc2l6ZSA9IGRlLT5zaXplOwogCQlpZiAoZGUtPm5saW5rKQotCQkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGRlLT5ubGluayk7CiAJCWlmIChkZS0+cHJvY19pb3BzKQogCQkJaW5vZGUtPmlfb3AgPSBkZS0+cHJvY19pb3BzOwogCQlpZiAoZGUtPnByb2NfZm9wcykgewpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IDFhNzdkYmUuLmE2YjYyMTcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTMsNiArMyw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CkBAIC0xNCw2ICsxNSwxNSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zeXNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3N5c19kaXJfb3BlcmF0aW9uczsKIAordm9pZCBwcm9jX3N5c19wb2xsX25vdGlmeShzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgKnBvbGwpCit7CisJaWYgKCFwb2xsKQorCQlyZXR1cm47CisKKwlhdG9taWNfaW5jKCZwb2xsLT5ldmVudCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb2xsLT53YWl0KTsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZSAqcHJvY19zeXNfbWFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCiB7CkBAIC0zOSw3ICs0OSw3IEBACiAJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3N5c19maWxlX29wZXJhdGlvbnM7CiAJfSBlbHNlIHsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJaW5vZGUtPmlfb3AgPSAmcHJvY19zeXNfZGlyX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3N5c19kaXJfZmlsZV9vcGVyYXRpb25zOwogCX0KQEAgLTE3Niw2ICsxODYsMzkgQEAKIAlyZXR1cm4gcHJvY19zeXNfY2FsbF9oYW5kbGVyKGZpbHAsICh2b2lkIF9fdXNlciAqKWJ1ZiwgY291bnQsIHBwb3MsIDEpOwogfQogCitzdGF0aWMgaW50IHByb2Nfc3lzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSBQUk9DX0koaW5vZGUpLT5zeXNjdGxfZW50cnk7CisKKwlpZiAodGFibGUtPnBvbGwpCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByb2Nfc3lzX3BvbGxfZXZlbnQodGFibGUtPnBvbGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvY19zeXNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IFBST0NfSShpbm9kZSktPnN5c2N0bF9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGV2ZW50ID0gKHVuc2lnbmVkIGxvbmcpZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCByZXQgPSBERUZBVUxUX1BPTExNQVNLOworCisJaWYgKCF0YWJsZS0+cHJvY19oYW5kbGVyKQorCQlnb3RvIG91dDsKKworCWlmICghdGFibGUtPnBvbGwpCisJCWdvdG8gb3V0OworCisJcG9sbF93YWl0KGZpbHAsICZ0YWJsZS0+cG9sbC0+d2FpdCwgd2FpdCk7CisKKwlpZiAoZXZlbnQgIT0gYXRvbWljX3JlYWQoJnRhYmxlLT5wb2xsLT5ldmVudCkpIHsKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJvY19zeXNfcG9sbF9ldmVudCh0YWJsZS0+cG9sbCk7CisJCXJldCA9IFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMRVJSIHwgUE9MTFBSSTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQogCiBzdGF0aWMgaW50IHByb2Nfc3lzX2ZpbGxfY2FjaGUoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwKIAkJCQlmaWxsZGlyX3QgZmlsbGRpciwKQEAgLTM2NCwxMiArNDA3LDE1IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwcm9jX3N5c19vcGVuLAorCS5wb2xsCQk9IHByb2Nfc3lzX3BvbGwsCiAJLnJlYWQJCT0gcHJvY19zeXNfcmVhZCwKIAkud3JpdGUJCT0gcHJvY19zeXNfd3JpdGUsCiAJLmxsc2VlawkJPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzX2Rpcl9maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgk9IHByb2Nfc3lzX3JlYWRkaXIsCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCA1YWZhYTU4Li5lNDE4YzVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC00NCw2ICs0NCw3IEBACiAJCSJWbVBlYWs6XHQlOGx1IGtCXG4iCiAJCSJWbVNpemU6XHQlOGx1IGtCXG4iCiAJCSJWbUxjazpcdCU4bHUga0JcbiIKKwkJIlZtUGluOlx0JThsdSBrQlxuIgogCQkiVm1IV006XHQlOGx1IGtCXG4iCiAJCSJWbVJTUzpcdCU4bHUga0JcbiIKIAkJIlZtRGF0YTpcdCU4bHUga0JcbiIKQEAgLTU1LDYgKzU2LDcgQEAKIAkJaGl3YXRlcl92bSA8PCAoUEFHRV9TSElGVC0xMCksCiAJCSh0b3RhbF92bSAtIG1tLT5yZXNlcnZlZF92bSkgPDwgKFBBR0VfU0hJRlQtMTApLAogCQltbS0+bG9ja2VkX3ZtIDw8IChQQUdFX1NISUZULTEwKSwKKwkJbW0tPnBpbm5lZF92bSA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWhpd2F0ZXJfcnNzIDw8IChQQUdFX1NISUZULTEwKSwKIAkJdG90YWxfcnNzIDw8IChQQUdFX1NISUZULTEwKSwKIAkJZGF0YSA8PCAoUEFHRV9TSElGVC0xMCksCkBAIC0xMDM5LDYgKzEwNDEsOSBAQAogCQlzZXFfcHJpbnRmKG0sICIgc3RhY2siKTsKIAl9CiAKKwlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCisJCXNlcV9wcmludGYobSwgIiBodWdlIik7CisKIAl3YWxrX3BhZ2VfcmFuZ2Uodm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICZ3YWxrKTsKIAogCWlmICghbWQtPnBhZ2VzKQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy92bWNvcmUuYyBiL2ZzL3Byb2Mvdm1jb3JlLmMKaW5kZXggY2Q5OWJmNS4uYjBmNDUwYSAxMDA2NDQKLS0tIGEvZnMvcHJvYy92bWNvcmUuYworKysgYi9mcy9wcm9jL3ZtY29yZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KZGlmZiAtLWdpdCBhL2ZzL3BzdG9yZS9pbm9kZS5jIGIvZnMvcHN0b3JlL2lub2RlLmMKaW5kZXggODkzYjk2MS4uMzc5YTAyZCAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL2lub2RlLmMKKysrIGIvZnMvcHN0b3JlL2lub2RlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgpAQCAtMzIsMTMgKzMzLDE4IEBACiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjZGVmaW5lCVBTVE9SRV9OQU1FTEVOCTY0CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxscHN0b3JlX2xvY2spOworc3RhdGljIExJU1RfSEVBRChhbGxwc3RvcmUpOworCiBzdHJ1Y3QgcHN0b3JlX3ByaXZhdGUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaTsKIAllbnVtIHBzdG9yZV90eXBlX2lkIHR5cGU7CiAJdTY0CWlkOwpAQCAtODEsOCArODcsMTYgQEAKIAogc3RhdGljIHZvaWQgcHN0b3JlX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJc3RydWN0IHBzdG9yZV9wcml2YXRlCSpwID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwogCWVuZF93cml0ZWJhY2soaW5vZGUpOwotCWtmcmVlKGlub2RlLT5pX3ByaXZhdGUpOworCWlmIChwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbGxwc3RvcmVfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJCWtmcmVlKHApOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHBzdG9yZV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKQEAgLTE4Miw5ICsxOTYsMjMgQEAKIAlzdHJ1Y3QgZGVudHJ5CQkqcm9vdCA9IHBzdG9yZV9zYi0+c19yb290OwogCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7Ci0JaW50CQkJcmM7CisJaW50CQkJcmMgPSAwOwogCWNoYXIJCQluYW1lW1BTVE9SRV9OQU1FTEVOXTsKLQlzdHJ1Y3QgcHN0b3JlX3ByaXZhdGUJKnByaXZhdGU7CisJc3RydWN0IHBzdG9yZV9wcml2YXRlCSpwcml2YXRlLCAqcG9zOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZhbGxwc3RvcmUsIGxpc3QpIHsKKwkJaWYgKHBvcy0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBwb3MtPmlkID09IGlkICYmCisJCSAgICBwb3MtPnBzaSA9PSBwc2kpIHsKKwkJCXJjID0gLUVFWElTVDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFsbHBzdG9yZV9sb2NrLCBmbGFncyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlyYyA9IC1FTk9NRU07CiAJaW5vZGUgPSBwc3RvcmVfZ2V0X2lub2RlKHBzdG9yZV9zYiwgcm9vdC0+ZF9pbm9kZSwgU19JRlJFRyB8IDA0NDQsIDApOwpAQCAtMjI5LDYgKzI1NywxMCBAQAogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWxscHN0b3JlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmcHJpdmF0ZS0+bGlzdCwgJmFsbHBzdG9yZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxscHN0b3JlX2xvY2ssIGZsYWdzKTsKKwogCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTI3Nyw3ICszMDksNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JcHN0b3JlX2dldF9yZWNvcmRzKCk7CisJcHN0b3JlX2dldF9yZWNvcmRzKDApOwogCiAJcmV0dXJuIDA7CiBmYWlsOgpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL2ludGVybmFsLmggYi9mcy9wc3RvcmUvaW50ZXJuYWwuaAppbmRleCA2MTFjMWIzLi4zYmRlNDYxIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvaW50ZXJuYWwuaAorKysgYi9mcy9wc3RvcmUvaW50ZXJuYWwuaApAQCAtMSw1ICsxLDUgQEAKIGV4dGVybiB2b2lkCXBzdG9yZV9zZXRfa21zZ19ieXRlcyhpbnQpOwotZXh0ZXJuIHZvaWQJcHN0b3JlX2dldF9yZWNvcmRzKHZvaWQpOworZXh0ZXJuIHZvaWQJcHN0b3JlX2dldF9yZWNvcmRzKGludCk7CiBleHRlcm4gaW50CXBzdG9yZV9ta2ZpbGUoZW51bSBwc3RvcmVfdHlwZV9pZCwgY2hhciAqcHNuYW1lLCB1NjQgaWQsCiAJCQkgICAgICBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcGxhdGZvcm0uYyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCmluZGV4IGM1MzAwZWMuLjJiZDYyMGYgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCisrKyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCkBAIC0yNSwxMiArMjUsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKKyAqIFdlIGRlZmVyIG1ha2luZyAib29wcyIgZW50cmllcyBhcHBlYXIgaW4gcHN0b3JlIC0gc2VlCisgKiB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgYWN0dWFsbHkgc3RpbGwgcnVubmluZyB3ZWxsIGVub3VnaAorICogdG8gbGV0IHNvbWVvbmUgc2VlIHRoZSBlbnRyeQorICovCisjZGVmaW5lCVBTVE9SRV9JTlRFUlZBTAkoNjAgKiBIWikKKworc3RhdGljIGludCBwc3RvcmVfbmV3X2VudHJ5OworCitzdGF0aWMgdm9pZCBwc3RvcmVfdGltZWZ1bmModW5zaWduZWQgbG9uZyk7CitzdGF0aWMgREVGSU5FX1RJTUVSKHBzdG9yZV90aW1lciwgcHN0b3JlX3RpbWVmdW5jLCAwLCAwKTsKKworc3RhdGljIHZvaWQgcHN0b3JlX2Rvd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKHBzdG9yZV93b3JrLCBwc3RvcmVfZG93b3JrKTsKKworLyoKICAqIHBzdG9yZV9sb2NrIGp1c3QgcHJvdGVjdHMgInBzaW5mbyIgZHVyaW5nCiAgKiBjYWxscyB0byBwc3RvcmVfcmVnaXN0ZXIoKQogICovCkBAIC02OSwxNSArODcsMjIgQEAKIAl1bnNpZ25lZCBsb25nCXNpemUsIHRvdGFsID0gMDsKIAljaGFyCQkqZHN0LCAqd2h5OwogCXU2NAkJaWQ7Ci0JaW50CQloc2l6ZTsKKwlpbnQJCWhzaXplLCByZXQ7CiAJdW5zaWduZWQgaW50CXBhcnQgPSAxOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCWludAkJaXNfbG9ja2VkID0gMDsKIAogCWlmIChyZWFzb24gPCBBUlJBWV9TSVpFKHJlYXNvbl9zdHIpKQogCQl3aHkgPSByZWFzb25fc3RyW3JlYXNvbl07CiAJZWxzZQogCQl3aHkgPSAiVW5rbm93biI7CiAKLQltdXRleF9sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJaWYgKGluX25taSgpKSB7CisJCWlzX2xvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcHNpbmZvLT5idWZfbG9jayk7CisJCWlmICghaXNfbG9ja2VkKQorCQkJcHJfZXJyKCJwc3RvcmUgZHVtcCByb3V0aW5lIGJsb2NrZWQgaW4gTk1JLCBtYXkgY29ycnVwdCBlcnJvciByZWNvcmRcbiIpOworCX0gZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHNpbmZvLT5idWZfbG9jaywgZmxhZ3MpOwogCW9vcHNjb3VudCsrOwogCXdoaWxlICh0b3RhbCA8IGttc2dfYnl0ZXMpIHsKIAkJZHN0ID0gcHNpbmZvLT5idWY7CkBAIC05NywxOCArMTIyLDIwIEBACiAJCW1lbWNweShkc3QsIHMxICsgczFfc3RhcnQsIGwxX2NweSk7CiAJCW1lbWNweShkc3QgKyBsMV9jcHksIHMyICsgczJfc3RhcnQsIGwyX2NweSk7CiAKLQkJaWQgPSBwc2luZm8tPndyaXRlKFBTVE9SRV9UWVBFX0RNRVNHLCBwYXJ0LAorCQlyZXQgPSBwc2luZm8tPndyaXRlKFBTVE9SRV9UWVBFX0RNRVNHLCAmaWQsIHBhcnQsCiAJCQkJICAgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHksIHBzaW5mbyk7Ci0JCWlmIChyZWFzb24gPT0gS01TR19EVU1QX09PUFMgJiYgcHN0b3JlX2lzX21vdW50ZWQoKSkKLQkJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsCi0JCQkJICAgICAgcHNpbmZvLT5idWYsIGhzaXplICsgbDFfY3B5ICsgbDJfY3B5LAotCQkJCSAgICAgIENVUlJFTlRfVElNRSwgcHNpbmZvKTsKKwkJaWYgKHJldCA9PSAwICYmIHJlYXNvbiA9PSBLTVNHX0RVTVBfT09QUyAmJiBwc3RvcmVfaXNfbW91bnRlZCgpKQorCQkJcHN0b3JlX25ld19lbnRyeSA9IDE7CiAJCWwxIC09IGwxX2NweTsKIAkJbDIgLT0gbDJfY3B5OwogCQl0b3RhbCArPSBsMV9jcHkgKyBsMl9jcHk7CiAJCXBhcnQrKzsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJaWYgKGluX25taSgpKSB7CisJCWlmIChpc19sb2NrZWQpCisJCQlzcGluX3VubG9jaygmcHNpbmZvLT5idWZfbG9jayk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrbXNnX2R1bXBlciBwc3RvcmVfZHVtcGVyID0gewpAQCAtMTQ4LDE5ICsxNzUsMjQgQEAKIAl9CiAKIAlpZiAocHN0b3JlX2lzX21vdW50ZWQoKSkKLQkJcHN0b3JlX2dldF9yZWNvcmRzKCk7CisJCXBzdG9yZV9nZXRfcmVjb3JkcygwKTsKIAogCWttc2dfZHVtcF9yZWdpc3RlcigmcHN0b3JlX2R1bXBlcik7CiAKKwlwc3RvcmVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQU1RPUkVfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZwc3RvcmVfdGltZXIpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwc3RvcmVfcmVnaXN0ZXIpOwogCiAvKgotICogUmVhZCBhbGwgdGhlIHJlY29yZHMgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yZS4gQ3JlYXRlIGFuZAotICogZmlsZSBmaWxlcyBpbiBvdXIgZmlsZXN5c3RlbS4KKyAqIFJlYWQgYWxsIHRoZSByZWNvcmRzIGZyb20gdGhlIHBlcnNpc3RlbnQgc3RvcmUuIENyZWF0ZQorICogZmlsZXMgaW4gb3VyIGZpbGVzeXN0ZW0uICBEb24ndCB3YXJuIGFib3V0IC1FRVhJU1QgZXJyb3JzCisgKiB3aGVuIHdlIGFyZSByZS1zY2FubmluZyB0aGUgYmFja2luZyBzdG9yZSBsb29raW5nIHRvIGFkZCBuZXcKKyAqIGVycm9yIHJlY29yZHMuCiAgKi8KLXZvaWQgcHN0b3JlX2dldF9yZWNvcmRzKHZvaWQpCit2b2lkIHBzdG9yZV9nZXRfcmVjb3JkcyhpbnQgcXVpZXQpCiB7CiAJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kgPSBwc2luZm87CiAJc3NpemVfdAkJCXNpemU7CkBAIC0xNjgsMzYgKzIwMCw1NSBAQAogCWVudW0gcHN0b3JlX3R5cGVfaWQJdHlwZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCXRpbWU7CiAJaW50CQkJZmFpbGVkID0gMCwgcmM7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlpZiAoIXBzaSkKIAkJcmV0dXJuOwogCi0JbXV0ZXhfbG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwc2luZm8tPmJ1Zl9sb2NrLCBmbGFncyk7CiAJcmMgPSBwc2ktPm9wZW4ocHNpKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCiAJd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lLCBwc2kpKSA+IDApIHsKLQkJaWYgKHBzdG9yZV9ta2ZpbGUodHlwZSwgcHNpLT5uYW1lLCBpZCwgcHNpLT5idWYsIChzaXplX3Qpc2l6ZSwKLQkJCQkgIHRpbWUsIHBzaSkpCisJCXJjID0gcHN0b3JlX21rZmlsZSh0eXBlLCBwc2ktPm5hbWUsIGlkLCBwc2ktPmJ1ZiwgKHNpemVfdClzaXplLAorCQkJCSAgdGltZSwgcHNpKTsKKwkJaWYgKHJjICYmIChyYyAhPSAtRUVYSVNUIHx8ICFxdWlldCkpCiAJCQlmYWlsZWQrKzsKIAl9CiAJcHNpLT5jbG9zZShwc2kpOwogb3V0OgotCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAogCWlmIChmYWlsZWQpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzdG9yZTogZmFpbGVkIHRvIGxvYWQgJWQgcmVjb3JkKHMpIGZyb20gJyVzJ1xuIiwKIAkJICAgICAgIGZhaWxlZCwgcHNpLT5uYW1lKTsKIH0KIAorc3RhdGljIHZvaWQgcHN0b3JlX2Rvd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcHN0b3JlX2dldF9yZWNvcmRzKDEpOworfQorCitzdGF0aWMgdm9pZCBwc3RvcmVfdGltZWZ1bmModW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpZiAocHN0b3JlX25ld19lbnRyeSkgeworCQlwc3RvcmVfbmV3X2VudHJ5ID0gMDsKKwkJc2NoZWR1bGVfd29yaygmcHN0b3JlX3dvcmspOworCX0KKworCW1vZF90aW1lcigmcHN0b3JlX3RpbWVyLCBqaWZmaWVzICsgUFNUT1JFX0lOVEVSVkFMKTsKK30KKwogLyoKICAqIENhbGwgcGxhdGZvcm0gZHJpdmVyIHRvIHdyaXRlIGEgcmVjb3JkIHRvIHRoZQogICogcGVyc2lzdGVudCBzdG9yZS4KICAqLwogaW50IHBzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JdTY0CWlkOworCXU2NAkJaWQ7CisJaW50CQlyZXQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCWlmICghcHNpbmZvKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIwNSwxMyArMjU2LDEzIEBACiAJaWYgKHNpemUgPiBwc2luZm8tPmJ1ZnNpemUpCiAJCXJldHVybiAtRUZCSUc7CiAKLQltdXRleF9sb2NrKCZwc2luZm8tPmJ1Zl9tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAltZW1jcHkocHNpbmZvLT5idWYsIGJ1Ziwgc2l6ZSk7Ci0JaWQgPSBwc2luZm8tPndyaXRlKHR5cGUsIDAsIHNpemUsIHBzaW5mbyk7Ci0JaWYgKHBzdG9yZV9pc19tb3VudGVkKCkpCisJcmV0ID0gcHNpbmZvLT53cml0ZSh0eXBlLCAmaWQsIDAsIHNpemUsIHBzaW5mbyk7CisJaWYgKHJldCA9PSAwICYmIHBzdG9yZV9pc19tb3VudGVkKCkpCiAJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsIHBzaW5mby0+YnVmLAogCQkJICAgICAgc2l6ZSwgQ1VSUkVOVF9USU1FLCBwc2luZm8pOwotCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvcW54NC9pbm9kZS5jIGIvZnMvcW54NC9pbm9kZS5jCmluZGV4IDJiMDY0NjYuLjNiZGQyMTQgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvaW5vZGUuYworKysgYi9mcy9xbng0L2lub2RlLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCWlub2RlLT5pX21vZGUgICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX21vZGUpOwogCWlub2RlLT5pX3VpZCAgICAgPSAodWlkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV91aWQpOwogCWlub2RlLT5pX2dpZCAgICAgPSAoZ2lkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV9naWQpOwotCWlub2RlLT5pX25saW5rICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX25saW5rKTsKKwlzZXRfbmxpbmsoaW5vZGUsIGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+ZGlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplICAgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9zaXplKTsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfbXRpbWUpOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvcXVvdGEuYyBiL2ZzL3F1b3RhL3F1b3RhLmMKaW5kZXggMTBiNmJlMy4uMzVmNGIwZSAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvcXVvdGEuYworKysgYi9mcy9xdW90YS9xdW90YS5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJLyogY2FsbGVyIGFscmVhZHkgaG9sZHMgc191bW91bnQgKi8KIAkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQkJcmV0dXJuIC1FUk9GUzsKLQkJd3JpdGViYWNrX2lub2Rlc19zYihzYik7CisJCXdyaXRlYmFja19pbm9kZXNfc2Ioc2IsIFdCX1JFQVNPTl9TWU5DKTsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNjMsMTIgKzM2MywxNSBAQAogCX0KIAogCXNiID0gcXVvdGFjdGxfYmxvY2soc3BlY2lhbCk7Ci0JaWYgKElTX0VSUihzYikpCi0JCXJldHVybiBQVFJfRVJSKHNiKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNiKTsKKwkJZ290byBvdXQ7CisJfQogCiAJcmV0ID0gZG9fcXVvdGFjdGwoc2IsIHR5cGUsIGNtZHMsIGlkLCBhZGRyLCBwYXRocCk7CiAKIAlkcm9wX3N1cGVyKHNiKTsKK291dDoKIAlpZiAocGF0aHAgJiYgIUlTX0VSUihwYXRocCkpCiAJCXBhdGhfcHV0KHBhdGhwKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKaW5kZXggZWFjYjE2Ni4uNDYyY2ViMyAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvaW5vZGUuYworKysgYi9mcy9yYW1mcy9pbm9kZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAgKiBjYWNoZXMgaXMgc3VmZmljaWVudC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpAQCAtMjg4LDE0ICsyODcsNyBAQAogewogCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZyYW1mc19mc190eXBlKTsKIH0KLQotc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmFtZnNfZnModm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJhbWZzX2ZzX3R5cGUpOwotfQotCiBtb2R1bGVfaW5pdChpbml0X3JhbWZzX2ZzKQotbW9kdWxlX2V4aXQoZXhpdF9yYW1mc19mcykKIAogaW50IF9faW5pdCBpbml0X3Jvb3Rmcyh2b2lkKQogewpAQCAtMzExLDUgKzMwMywzIEBACiAKIAlyZXR1cm4gZXJyOwogfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggMTc5ZjFjMy4uNWFkNDI0OCAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMzUsMjMgKzM1LDQ1IEBACiAJcmV0dXJuIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1VOU0lHTkVEX09GRlNFVDsKIH0KIAorc3RhdGljIGxvZmZfdCBsc2Vla19leGVjdXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbWF4c2l6ZSkKK3sKKwlpZiAob2Zmc2V0IDwgMCAmJiAhdW5zaWduZWRfb2Zmc2V0cyhmaWxlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9mZnNldCA+IG1heHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwl9CisJcmV0dXJuIG9mZnNldDsKK30KKwogLyoqCi0gKiBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkIC0gbG9ja2xlc3MgZ2VuZXJpYyBsbHNlZWsgaW1wbGVtZW50YXRpb24KKyAqIGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZSAtIGdlbmVyaWMgbGxzZWVrIGltcGxlbWVudGF0aW9uIGZvciByZWd1bGFyIGZpbGVzCiAgKiBAZmlsZToJZmlsZSBzdHJ1Y3R1cmUgdG8gc2VlayBvbgogICogQG9mZnNldDoJZmlsZSBvZmZzZXQgdG8gc2VlayB0bwogICogQG9yaWdpbjoJdHlwZSBvZiBzZWVrCisgKiBAc2l6ZToJbWF4IHNpemUgb2YgZmlsZSBzeXN0ZW0KICAqCi0gKiBVcGRhdGVzIHRoZSBmaWxlIG9mZnNldCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IEBvZmZzZXQgYW5kIEBvcmlnaW4uCi0gKiBMb2NraW5nIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAqIFRoaXMgaXMgYSB2YXJpYW50IG9mIGdlbmVyaWNfZmlsZV9sbHNlZWsgdGhhdCBhbGxvd3MgcGFzc2luZyBpbiBhIGN1c3RvbQorICogZmlsZSBzaXplLgorICoKKyAqIFN5bmNocm9uaXphdGlvbjoKKyAqIFNFRUtfU0VUIGFuZCBTRUVLX0VORCBhcmUgdW5zeW5jaHJvbml6ZWQgKGJ1dCBhdG9taWMgb24gNjRiaXQgcGxhdGZvcm1zKQorICogU0VFS19DVVIgaXMgc3luY2hyb25pemVkIGFnYWluc3Qgb3RoZXIgU0VFS19DVVJzLCBidXQgbm90IHJlYWQvd3JpdGVzLgorICogcmVhZC93cml0ZXMgYmVoYXZlIGxpa2UgU0VFS19TRVQgYWdhaW5zdCBzZWVrcy4KICAqLwogbG9mZl90Ci1nZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQorZ2VuZXJpY19maWxlX2xsc2Vla19zaXplKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luLAorCQlsb2ZmX3QgbWF4c2l6ZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCiAJc3dpdGNoIChvcmlnaW4pIHsKIAljYXNlIFNFRUtfRU5EOgotCQlvZmZzZXQgKz0gaW5vZGUtPmlfc2l6ZTsKKwkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJYnJlYWs7CiAJY2FzZSBTRUVLX0NVUjoKIAkJLyoKQEAgLTYyLDE0ICs4NCwyMiBAQAogCQkgKi8KIAkJaWYgKG9mZnNldCA9PSAwKQogCQkJcmV0dXJuIGZpbGUtPmZfcG9zOwotCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7Ci0JCWJyZWFrOworCQkvKgorCQkgKiBmX2xvY2sgcHJvdGVjdHMgYWdhaW5zdCByZWFkL21vZGlmeS93cml0ZSByYWNlIHdpdGggb3RoZXIKKwkJICogU0VFS19DVVJzLiBOb3RlIHRoYXQgcGFyYWxsZWwgd3JpdGVzIGFuZCByZWFkcyBiZWhhdmUKKwkJICogbGlrZSBTRUVLX1NFVC4KKwkJICovCisJCXNwaW5fbG9jaygmZmlsZS0+Zl9sb2NrKTsKKwkJb2Zmc2V0ID0gbHNlZWtfZXhlY3V0ZShmaWxlLCBpbm9kZSwgZmlsZS0+Zl9wb3MgKyBvZmZzZXQsCisJCQkJICAgICAgIG1heHNpemUpOworCQlzcGluX3VubG9jaygmZmlsZS0+Zl9sb2NrKTsKKwkJcmV0dXJuIG9mZnNldDsKIAljYXNlIFNFRUtfREFUQToKIAkJLyoKIAkJICogSW4gdGhlIGdlbmVyaWMgY2FzZSB0aGUgZW50aXJlIGZpbGUgaXMgZGF0YSwgc28gYXMgbG9uZyBhcwogCQkgKiBvZmZzZXQgaXNuJ3QgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBvZmZzZXQgaXMgZGF0YS4KIAkJICovCi0JCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCQlyZXR1cm4gLUVOWElPOwogCQlicmVhazsKIAljYXNlIFNFRUtfSE9MRToKQEAgLTc3LDI2ICsxMDcsMTUgQEAKIAkJICogVGhlcmUgaXMgYSB2aXJ0dWFsIGhvbGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gYXMgbG9uZyBhcwogCQkgKiBvZmZzZXQgaXNuJ3QgaV9zaXplIG9yIGxhcmdlciwgcmV0dXJuIGlfc2l6ZS4KIAkJICovCi0JCWlmIChvZmZzZXQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJaWYgKG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCQlyZXR1cm4gLUVOWElPOwotCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplOworCQlvZmZzZXQgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWJyZWFrOwogCX0KIAotCWlmIChvZmZzZXQgPCAwICYmICF1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogU3BlY2lhbCBsb2NrIG5lZWRlZCBoZXJlPyAqLwotCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKLQkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7Ci0JCWZpbGUtPmZfdmVyc2lvbiA9IDA7Ci0JfQotCi0JcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gbHNlZWtfZXhlY3V0ZShmaWxlLCBpbm9kZSwgb2Zmc2V0LCBtYXhzaXplKTsKIH0KLUVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZCk7CitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZSk7CiAKIC8qKgogICogZ2VuZXJpY19maWxlX2xsc2VlayAtIGdlbmVyaWMgbGxzZWVrIGltcGxlbWVudGF0aW9uIGZvciByZWd1bGFyIGZpbGVzCkBAIC0xMTAsMTMgKzEyOSwxMCBAQAogICovCiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlsb2ZmX3QgcnZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCi0JbXV0ZXhfbG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCXJ2YWwgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3VubG9ja2VkKGZpbGUsIG9mZnNldCwgb3JpZ2luKTsKLQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKLQotCXJldHVybiBydmFsOworCXJldHVybiBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sCisJCQkJCWlub2RlLT5pX3NiLT5zX21heGJ5dGVzKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX2xsc2Vlayk7CiAKQEAgLTYxNyw3ICs2MzMsOCBAQAogc3NpemVfdCByd19jb3B5X2NoZWNrX3V2ZWN0b3IoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiB1dmVjdG9yLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCB1bnNpZ25lZCBsb25nIGZhc3Rfc2VncywKIAkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqZmFzdF9wb2ludGVyLAotCQkJICAgICAgc3RydWN0IGlvdmVjICoqcmV0X3BvaW50ZXIpCisJCQkgICAgICBzdHJ1Y3QgaW92ZWMgKipyZXRfcG9pbnRlciwKKwkJCSAgICAgIGludCBjaGVja19hY2Nlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CiAJc3NpemVfdCByZXQ7CkBAIC02NzMsNyArNjkwLDggQEAKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAodW5saWtlbHkoIWFjY2Vzc19vayh2cmZ5X2Rpcih0eXBlKSwgYnVmLCBsZW4pKSkgeworCQlpZiAoY2hlY2tfYWNjZXNzCisJCSAgICAmJiB1bmxpa2VseSghYWNjZXNzX29rKHZyZnlfZGlyKHR5cGUpLCBidWYsIGxlbikpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTcwNSw3ICs3MjMsNyBAQAogCX0KIAogCXJldCA9IHJ3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAotCQkJQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDw9IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCA5YjBkNGI3Li45NTBmMTNhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTExNTQsNyArMTE1NCw3IEBACiAJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CiAJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjEpOwogCQlpbm9kZS0+aV9tb2RlID0gc2RfdjFfbW9kZShzZCk7Ci0JCWlub2RlLT5pX25saW5rID0gc2RfdjFfbmxpbmsoc2QpOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkX3YxX25saW5rKHNkKSk7CiAJCWlub2RlLT5pX3VpZCA9IHNkX3YxX3VpZChzZCk7CiAJCWlub2RlLT5pX2dpZCA9IHNkX3YxX2dpZChzZCk7CiAJCWlub2RlLT5pX3NpemUgPSBzZF92MV9zaXplKHNkKTsKQEAgLTExOTksNyArMTE5OSw3IEBACiAJCXN0cnVjdCBzdGF0X2RhdGEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilCX0lfUElURU0oYmgsIGloKTsKIAogCQlpbm9kZS0+aV9tb2RlID0gc2RfdjJfbW9kZShzZCk7Ci0JCWlub2RlLT5pX25saW5rID0gc2RfdjJfbmxpbmsoc2QpOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkX3YyX25saW5rKHNkKSk7CiAJCWlub2RlLT5pX3VpZCA9IHNkX3YyX3VpZChzZCk7CiAJCWlub2RlLT5pX3NpemUgPSBzZF92Ml9zaXplKHNkKTsKIAkJaW5vZGUtPmlfZ2lkID0gc2RfdjJfZ2lkKHNkKTsKQEAgLTE0NDQsNyArMTQ0NCw3IEBACiAJCS8qIGEgc3RhbGUgTkZTIGhhbmRsZSBjYW4gdHJpZ2dlciB0aGlzIHdpdGhvdXQgaXQgYmVpbmcgYW4gZXJyb3IgKi8KIAkJcGF0aHJlbHNlKCZwYXRoX3RvX3NkKTsKIAkJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgzMiw3ICsxODMyLDcgQEAKICNlbmRpZgogCiAJLyogZmlsbCBzdGF0IGRhdGEgKi8KLQlpbm9kZS0+aV9ubGluayA9IChTX0lTRElSKG1vZGUpID8gMiA6IDEpOworCXNldF9ubGluayhpbm9kZSwgKFNfSVNESVIobW9kZSkgPyAyIDogMSkpOwogCiAJLyogdWlkIGFuZCBnaWQgbXVzdCBhbHJlYWR5IGJlIHNldCBieSB0aGUgY2FsbGVyIGZvciBxdW90YSBpbml0ICovCiAKQEAgLTE5ODcsNyArMTk4Nyw3IEBACiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCiAgICAgICBvdXRfaW5zZXJ0ZWRfc2Q6Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOworCWNsZWFyX25saW5rKGlub2RlKTsKIAl0aC0+dF90cmFuc19pZCA9IDA7CS8qIHNvIHRoZSBjYWxsZXIgY2FuJ3QgdXNlIHRoaXMgaGFuZGxlIGxhdGVyICovCiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7IC8qIE9LIHRvIGRvIGV2ZW4gaWYgd2UgaGFkbid0IGxvY2tlZCBpdCAqLwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggZWYzOTIzMi4uODAwNThlOCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCi0jZGVmaW5lIElOQ19ESVJfSU5PREVfTkxJTksoaSkgaWYgKGktPmlfbmxpbmsgIT0gMSkgeyBpbmNfbmxpbmsoaSk7IGlmIChpLT5pX25saW5rID49IFJFSVNFUkZTX0xJTktfTUFYKSBpLT5pX25saW5rPTE7IH0KKyNkZWZpbmUgSU5DX0RJUl9JTk9ERV9OTElOSyhpKSBpZiAoaS0+aV9ubGluayAhPSAxKSB7IGluY19ubGluayhpKTsgaWYgKGktPmlfbmxpbmsgPj0gUkVJU0VSRlNfTElOS19NQVgpIHNldF9ubGluayhpLCAxKTsgfQogI2RlZmluZSBERUNfRElSX0lOT0RFX05MSU5LKGkpIGlmIChpLT5pX25saW5rICE9IDEpIGRyb3BfbmxpbmsoaSk7CiAKIC8vIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5zIGFycmF5IG9mIGVudHJ5IGhlYWRlcnMuIFRoaXMgcGVyZm9ybXMKQEAgLTYyMiw3ICs2MjIsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAkJaWYgKGVycikKQEAgLTcwMiw3ICs3MDIsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAkJaWYgKGVycikKQEAgLTc4Nyw3ICs3ODcsNyBAQAogCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJREVDX0RJUl9JTk9ERV9OTElOSyhkaXIpOwogCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CiAJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwpAQCAtOTY0LDcgKzk2NCw3IEBACiAJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJyZWlzZXJmcy03MDQyIiwKIAkJCQkgImRlbGV0aW5nIG5vbmV4aXN0ZW50IGZpbGUgKCVsdSksICVkIiwKIAkJCQkgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAKIAlkcm9wX25saW5rKGlub2RlKTsKQEAgLTEwODYsNyArMTA4Niw3IEBACiAJCQkJICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CiAJCWlmIChlcnIpCkBAIC0xMTI5LDcgKzExMjksNyBAQAogCiAJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAlpZiAocmV0dmFsKSB7Ci0JCWlub2RlLT5pX25saW5rLS07CisJCWRyb3BfbmxpbmsoaW5vZGUpOwogCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCiAJaWYgKHJldHZhbCkgewogCQlpbnQgZXJyOwotCQlpbm9kZS0+aV9ubGluay0tOworCQlkcm9wX25saW5rKGlub2RlKTsKIAkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CiAJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwogCQlyZXR1cm4gZXJyID8gZXJyIDogcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvc3VwZXIuYyBiL2ZzL3JvbWZzL3N1cGVyLmMKaW5kZXggMjMwNWUzMS4uOGI0MDg5ZiAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvc3VwZXIuYworKysgYi9mcy9yb21mcy9zdXBlci5jCkBAIC0zMzcsNyArMzM3LDcgQEAKIAlpbm9kZS0+aV9tZXRhc2l6ZSA9IChST01GSF9TSVpFICsgbmxlbiArIDEgKyBST01GSF9QQUQpICYgUk9NRkhfTUFTSzsKIAlpbm9kZS0+aV9kYXRhb2Zmc2V0ID0gcG9zICsgaW5vZGUtPmlfbWV0YXNpemU7CiAKLQlpLT5pX25saW5rID0gMTsJCS8qIEhhcmQgdG8gZGVjaWRlLi4gKi8KKwlzZXRfbmxpbmsoaSwgMSk7CQkvKiBIYXJkIHRvIGRlY2lkZS4uICovCiAJaS0+aV9zaXplID0gYmUzMl90b19jcHUocmkuc2l6ZSk7CiAJaS0+aV9tdGltZS50dl9zZWMgPSBpLT5pX2F0aW1lLnR2X3NlYyA9IGktPmlfY3RpbWUudHZfc2VjID0gMDsKIAlpLT5pX210aW1lLnR2X25zZWMgPSBpLT5pX2F0aW1lLnR2X25zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvS2NvbmZpZyBiL2ZzL3NxdWFzaGZzL0tjb25maWcKaW5kZXggMDQ4YjU5ZC4uYzcwMTExZSAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvS2NvbmZpZworKysgYi9mcy9zcXVhc2hmcy9LY29uZmlnCkBAIC03OCw2ICs3OCwyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU1FVQVNIRlNfNEtfREVWQkxLX1NJWkUKKwlib29sICJVc2UgNEsgZGV2aWNlIGJsb2NrIHNpemU/IgorCWRlcGVuZHMgb24gU1FVQVNIRlMKKwloZWxwCisJICBCeSBkZWZhdWx0IFNxdWFzaGZzIHNldHMgdGhlIGRldiBibG9jayBzaXplIChzYl9taW5fYmxvY2tzaXplKQorCSAgdG8gMUsgb3IgdGhlIHNtYWxsZXN0IGJsb2NrIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBibG9jayBkZXZpY2UKKwkgIChpZiBsYXJnZXIpLiAgVGhpcywgYmVjYXVzZSBibG9ja3MgYXJlIHBhY2tlZCB0b2dldGhlciBhbmQKKwkgIHVuYWxpZ25lZCBpbiBTcXVhc2hmcywgc2hvdWxkIHJlZHVjZSBsYXRlbmN5LgorCisJICBUaGlzLCBob3dldmVyLCBnaXZlcyBwb29yIHBlcmZvcm1hbmNlIG9uIE1URCBOQU5EIGRldmljZXMgd2hlcmUKKwkgIHRoZSBvcHRpbWFsIEkvTyBzaXplIGlzIDRLIChldmVuIHRob3VnaCB0aGUgZGV2aWNlcyBjYW4gc3VwcG9ydAorCSAgc21hbGxlciBibG9jayBzaXplcykuCisKKwkgIFVzaW5nIGEgNEsgZGV2aWNlIGJsb2NrIHNpemUgbWF5IGFsc28gaW1wcm92ZSBvdmVyYWxsIEkvTworCSAgcGVyZm9ybWFuY2UgZm9yIHNvbWUgZmlsZSBhY2Nlc3MgcGF0dGVybnMgKGUuZy4gc2VxdWVudGlhbAorCSAgYWNjZXNzZXMgb2YgZmlsZXMgaW4gZmlsZXN5c3RlbSBvcmRlcikgb24gYWxsIG1lZGlhLgorCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZm9yY2UgU3F1YXNoZnMgdG8gdXNlIGEgNEsgZGV2aWNlIGJsb2NrCisJICBzaXplIGJ5IGRlZmF1bHQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTUVVBU0hGU19FTUJFRERFRAogCWJvb2wgIkFkZGl0aW9uYWwgb3B0aW9uIGZvciBtZW1vcnktY29uc3RyYWluZWQgc3lzdGVtcyIKIAlkZXBlbmRzIG9uIFNRVUFTSEZTCmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9pbm9kZS5jIGIvZnMvc3F1YXNoZnMvaW5vZGUuYwppbmRleCAwNGJlYmNhLi5mZDdiM2IzIDEwMDY0NAotLS0gYS9mcy9zcXVhc2hmcy9pbm9kZS5jCisrKyBiL2ZzL3NxdWFzaGZzL2lub2RlLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCQkJZnJhZ19vZmZzZXQgPSAwOwogCQl9CiAKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlzZXRfbmxpbmsoaW5vZGUsIDEpOwogCQlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPmZpbGVfc2l6ZSk7CiAJCWlub2RlLT5pX2ZvcCA9ICZnZW5lcmljX3JvX2ZvcHM7CiAJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQl9CiAKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfaW5vZGVfb3BzOwogCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBmYWlsZWRfcmVhZDsKIAotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTE2X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfZGlyX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNxdWFzaGZzX2Rpcl9vcHM7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCWdvdG8gZmFpbGVkX3JlYWQ7CiAKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKIAkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfZGlyX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZm9wID0gJnNxdWFzaGZzX2Rpcl9vcHM7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGZhaWxlZF9yZWFkOwogCi0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5zeW1saW5rX3NpemUpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19zeW1saW5rX2lub2RlX29wczsKIAkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZzcXVhc2hmc19zeW1saW5rX2FvcHM7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJCWlub2RlLT5pX21vZGUgfD0gU19JRkNIUjsKIAkJZWxzZQogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQkxLOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCXJkZXYgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+cmRldik7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgbmV3X2RlY29kZV9kZXYocmRldikpOwogCkBAIC0zNDksNyArMzQ5LDcgQEAKIAkJCWlub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19pbm9kZV9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJcmRldiA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5yZGV2KTsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBuZXdfZGVjb2RlX2RldihyZGV2KSk7CiAKQEAgLTM3MCw3ICszNzAsNyBAQAogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGSUZPOwogCQllbHNlCiAJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZTT0NLOwotCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKSk7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgMCk7CiAJCWJyZWFrOwogCX0KQEAgLTM4OSw3ICszODksNyBAQAogCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGU09DSzsKIAkJeGF0dHJfaWQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+eGF0dHIpOwogCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19pbm9kZV9vcHM7Ci0JCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJc2V0X25saW5rKGlub2RlLCBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspKTsKIAkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCAwKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaCBiL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzLmgKaW5kZXggYjRhNGU1My4uZThlMTQ2NCAxMDA2NDQKLS0tIGEvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaAorKysgYi9mcy9zcXVhc2hmcy9zcXVhc2hmc19mcy5oCkBAIC0zNiw2ICszNiwxMyBAQAogI2RlZmluZSBTUVVBU0hGU19GSUxFX1NJWkUJCTEzMTA3MgogI2RlZmluZSBTUVVBU0hGU19GSUxFX0xPRwkJMTcKIAorLyogZGVmYXVsdCBzaXplIG9mIGJsb2NrIGRldmljZSBJL08gKi8KKyNpZmRlZiBDT05GSUdfU1FVQVNIRlNfNEtfREVWQkxLX1NJWkUKKyNkZWZpbmUgU1FVQVNIRlNfREVWQkxLX1NJWkUgNDA5NgorI2Vsc2UKKyNkZWZpbmUgU1FVQVNIRlNfREVWQkxLX1NJWkUgMTAyNAorI2VuZGlmCisKICNkZWZpbmUgU1FVQVNIRlNfRklMRV9NQVhfU0laRQkJMTA0ODU3NgogI2RlZmluZSBTUVVBU0hGU19GSUxFX01BWF9MT0cJCTIwCiAKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL3N1cGVyLmMgYi9mcy9zcXVhc2hmcy9zdXBlci5jCmluZGV4IDc0Mzg4NTAuLjJkYTE3MTUgMTAwNjQ0Ci0tLSBhL2ZzL3NxdWFzaGZzL3N1cGVyLmMKKysrIGIvZnMvc3F1YXNoZnMvc3VwZXIuYwpAQCAtOTUsNyArOTUsNyBAQAogCX0KIAltc2JsayA9IHNiLT5zX2ZzX2luZm87CiAKLQltc2Jsay0+ZGV2Ymxrc2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2IsIEJMT0NLX1NJWkUpOworCW1zYmxrLT5kZXZibGtzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgU1FVQVNIRlNfREVWQkxLX1NJWkUpOwogCW1zYmxrLT5kZXZibGtzaXplX2xvZzIgPSBmZnoofm1zYmxrLT5kZXZibGtzaXplKTsKIAogCW11dGV4X2luaXQoJm1zYmxrLT5yZWFkX2RhdGFfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvc3RhY2suYyBiL2ZzL3N0YWNrLmMKaW5kZXggYjRmMmFiNDguLjljMTE1MTkgMTAwNjQ0Ci0tLSBhL2ZzL3N0YWNrLmMKKysrIGIvZnMvc3RhY2suYwpAQCAtNzEsNiArNzEsNiBAQAogCWRlc3QtPmlfY3RpbWUgPSBzcmMtPmlfY3RpbWU7CiAJZGVzdC0+aV9ibGtiaXRzID0gc3JjLT5pX2Jsa2JpdHM7CiAJZGVzdC0+aV9mbGFncyA9IHNyYy0+aV9mbGFnczsKLQlkZXN0LT5pX25saW5rID0gc3JjLT5pX25saW5rOworCXNldF9ubGluayhkZXN0LCBzcmMtPmlfbmxpbmspOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnNzdGFja19jb3B5X2F0dHJfYWxsKTsKZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwppbmRleCA3OGEzYWE4Li44ODA2Yjg5IDEwMDY0NAotLS0gYS9mcy9zdGF0LmMKKysrIGIvZnMvc3RhdC5jCkBAIC0yOTQsMTUgKzI5NCwxNiBAQAogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOworCWludCBlbXB0eSA9IDA7CiAKIAlpZiAoYnVmc2l6IDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyb3IgPSB1c2VyX3BhdGhfYXQoZGZkLCBwYXRobmFtZSwgTE9PS1VQX0VNUFRZLCAmcGF0aCk7CisJZXJyb3IgPSB1c2VyX3BhdGhfYXRfZW1wdHkoZGZkLCBwYXRobmFtZSwgTE9PS1VQX0VNUFRZLCAmcGF0aCwgJmVtcHR5KTsKIAlpZiAoIWVycm9yKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAotCQllcnJvciA9IC1FSU5WQUw7CisJCWVycm9yID0gZW1wdHkgPyAtRU5PRU5UIDogLUVJTlZBTDsKIAkJaWYgKGlub2RlLT5pX29wLT5yZWFkbGluaykgewogCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9yZWFkbGluayhwYXRoLmRlbnRyeSk7CiAJCQlpZiAoIWVycm9yKSB7CmRpZmYgLS1naXQgYS9mcy9zdGF0ZnMuYyBiL2ZzL3N0YXRmcy5jCmluZGV4IDgyNDQ5MjQuLjljZjA0YTEgMTAwNjQ0Ci0tLSBhL2ZzL3N0YXRmcy5jCisrKyBiL2ZzL3N0YXRmcy5jCkBAIC03Niw3ICs3Niw3IEBACiBpbnQgdXNlcl9zdGF0ZnMoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBzdHJ1Y3Qga3N0YXRmcyAqc3QpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKLQlpbnQgZXJyb3IgPSB1c2VyX3BhdGgocGF0aG5hbWUsICZwYXRoKTsKKwlpbnQgZXJyb3IgPSB1c2VyX3BhdGhfYXQoQVRfRkRDV0QsIHBhdGhuYW1lLCBMT09LVVBfRk9MTE9XfExPT0tVUF9BVVRPTU9VTlQsICZwYXRoKTsKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gdmZzX3N0YXRmcygmcGF0aCwgc3QpOwogCQlwYXRoX3B1dCgmcGF0aCk7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAzZjU2YTI2Li5hZmQwZjFhIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKCFncmFiX3N1cGVyX3Bhc3NpdmUoc2IpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAhc2MtPm5yX3RvX3NjYW4gPyAwIDogLTE7CiAKIAlpZiAoc2ItPnNfb3AgJiYgc2ItPnNfb3AtPm5yX2NhY2hlZF9vYmplY3RzKQogCQlmc19vYmplY3RzID0gc2ItPnNfb3AtPm5yX2NhY2hlZF9vYmplY3RzKHNiKTsKQEAgLTcyNyw4ICs3MjcsMTMgQEAKIAogCWlmIChzYi0+c19vcC0+cmVtb3VudF9mcykgewogCQlyZXR2YWwgPSBzYi0+c19vcC0+cmVtb3VudF9mcyhzYiwgJmZsYWdzLCBkYXRhKTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7CisJCWlmIChyZXR2YWwpIHsKKwkJCWlmICghZm9yY2UpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCS8qIElmIGZvcmNlZCByZW1vdW50LCBnbyBhaGVhZCBkZXNwaXRlIGFueSBlcnJvcnMgKi8KKwkJCVdBUk4oMSwgImZvcmNlZCByZW1vdW50IG9mIGEgJXMgZnMgcmV0dXJuZWQgJWlcbiIsCisJCQkgICAgIHNiLT5zX3R5cGUtPm5hbWUsIHJldHZhbCk7CisJCX0KIAl9CiAJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUk1UX01BU0spIHwgKGZsYWdzICYgTVNfUk1UX01BU0spOwogCmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggYzk4YTc0Ny4uMTAxYjhlZiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtNDMsNyArNDMsNyBAQAogCWlmICh3YWl0KQogCQlzeW5jX2lub2Rlc19zYihzYik7CiAJZWxzZQotCQl3cml0ZWJhY2tfaW5vZGVzX3NiKHNiKTsKKwkJd3JpdGViYWNrX2lub2Rlc19zYihzYiwgV0JfUkVBU09OX1NZTkMpOwogCiAJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQogCQlzYi0+c19vcC0+c3luY19mcyhzYiwgd2FpdCk7CkBAIC05OCw3ICs5OCw3IEBACiAgKi8KIFNZU0NBTExfREVGSU5FMChzeW5jKQogewotCXdha2V1cF9mbHVzaGVyX3RocmVhZHMoMCk7CisJd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcygwLCBXQl9SRUFTT05fU1lOQyk7CiAJc3luY19maWxlc3lzdGVtcygwKTsKIAlzeW5jX2ZpbGVzeXN0ZW1zKDEpOwogCWlmICh1bmxpa2VseShsYXB0b3BfbW9kZSkpCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDQ4ZmZiZGYwLi43ZmRmNmE3IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtODY1LDE1ICs4NjUsMTMgQEAKIAkJc2QtPnNfbmFtZSA9IG5ld19uYW1lOwogCX0KIAotCS8qIFJlbW92ZSBmcm9tIG9sZCBwYXJlbnQncyBsaXN0IGFuZCBpbnNlcnQgaW50byBuZXcgcGFyZW50J3MgbGlzdC4gKi8KLQlpZiAoc2QtPnNfcGFyZW50ICE9IG5ld19wYXJlbnRfc2QpIHsKLQkJc3lzZnNfdW5saW5rX3NpYmxpbmcoc2QpOwotCQlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7Ci0JCXN5c2ZzX3B1dChzZC0+c19wYXJlbnQpOwotCQlzZC0+c19wYXJlbnQgPSBuZXdfcGFyZW50X3NkOwotCQlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwotCX0KKwkvKiBNb3ZlIHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgcmJ0cmVlLiAqLworCXN5c2ZzX3VubGlua19zaWJsaW5nKHNkKTsKKwlzeXNmc19nZXQobmV3X3BhcmVudF9zZCk7CisJc3lzZnNfcHV0KHNkLT5zX3BhcmVudCk7CiAJc2QtPnNfbnMgPSBuZXdfbnM7CisJc2QtPnNfcGFyZW50ID0gbmV3X3BhcmVudF9zZDsKKwlzeXNmc19saW5rX3NpYmxpbmcoc2QpOwogCiAJZXJyb3IgPSAwOwogIG91dDoKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2lub2RlLmMgYi9mcy9zeXNmcy9pbm9kZS5jCmluZGV4IGUyM2YyODguLmM4MWIyMmYzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9pbm9kZS5jCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCX0KIAogCWlmIChzeXNmc190eXBlKHNkKSA9PSBTWVNGU19ESVIpCi0JCWlub2RlLT5pX25saW5rID0gc2QtPnNfZGlyLnN1YmRpcnMgKyAyOworCQlzZXRfbmxpbmsoaW5vZGUsIHNkLT5zX2Rpci5zdWJkaXJzICsgMik7CiB9CiAKIGludCBzeXNmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaW5vZGUuYyBiL2ZzL3N5c3YvaW5vZGUuYwppbmRleCAwNjMwZWI5Ni4uMjVmZmIzZSAxMDA2NDQKLS0tIGEvZnMvc3lzdi9pbm9kZS5jCisrKyBiL2ZzL3N5c3YvaW5vZGUuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJaW5vZGUtPmlfbW9kZSA9IGZzMTZfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV91aWQpOwogCWlub2RlLT5pX2dpZCA9IChnaWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9naWQpOwotCWlub2RlLT5pX25saW5rID0gZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbmxpbmspOworCXNldF9ubGluayhpbm9kZSwgZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbmxpbmspKTsKIAlpbm9kZS0+aV9zaXplID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfc2l6ZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfYXRpbWUpOwogCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX210aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2J1ZGdldC5jIGIvZnMvdWJpZnMvYnVkZ2V0LmMKaW5kZXggMzE1ZGU2Ni4uYmM0Zjk0YiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvYnVkZ2V0LmMKKysrIGIvZnMvdWJpZnMvYnVkZ2V0LmMKQEAgLTYzLDcgKzYzLDcgQEAKIHN0YXRpYyB2b2lkIHNocmlua19saWFiaWxpdHkoc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBucl90b193cml0ZSkKIHsKIAlkb3duX3JlYWQoJmMtPnZmc19zYi0+c191bW91bnQpOwotCXdyaXRlYmFja19pbm9kZXNfc2IoYy0+dmZzX3NiKTsKKwl3cml0ZWJhY2tfaW5vZGVzX3NiKGMtPnZmc19zYiwgV0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UpOwogCXVwX3JlYWQoJmMtPnZmc19zYi0+c191bW91bnQpOwogfQogCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kZWJ1Zy5jIGIvZnMvdWJpZnMvZGVidWcuYwppbmRleCBlZWYxMDlhLi5iMDliYTJkIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9kZWJ1Zy5jCisrKyBiL2ZzL3ViaWZzL2RlYnVnLmMKQEAgLTg3MCw2ICs4NzAsMjIgQEAKIAlzcGluX3VubG9jaygmZGJnX2xvY2spOwogfQogCit2b2lkIGRiZ19kdW1wX3NsZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCSAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpCit7CisJc3RydWN0IHViaWZzX3NjYW5fbm9kZSAqc25vZDsKKworCXByaW50ayhLRVJOX0RFQlVHICIocGlkICVkKSBzdGFydCBkdW1waW5nIHNjYW5uZWQgZGF0YSBmcm9tIExFQiAlZDolZFxuIiwKKwkgICAgICAgY3VycmVudC0+cGlkLCBzbGViLT5sbnVtLCBvZmZzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc25vZCwgJnNsZWItPm5vZGVzLCBsaXN0KSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlwcmludGsoS0VSTl9ERUJVRyAiRHVtcGluZyBub2RlIGF0IExFQiAlZDolZCBsZW4gJWRcbiIsIHNsZWItPmxudW0sCisJCSAgICAgICBzbm9kLT5vZmZzLCBzbm9kLT5sZW4pOworCQlkYmdfZHVtcF9ub2RlKGMsIHNub2QtPm5vZGUpOworCX0KK30KKwogdm9pZCBkYmdfZHVtcF9sZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIGludCBsbnVtKQogewogCXN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYjsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2RlYnVnLmggYi9mcy91Ymlmcy9kZWJ1Zy5oCmluZGV4IGZlYjM2MWUuLjhkOWM0NjggMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2RlYnVnLmgKKysrIGIvZnMvdWJpZnMvZGVidWcuaApAQCAtMjY5LDYgKzI2OSw4IEBACiB2b2lkIGRiZ19kdW1wX2xwcm9wcyhzdHJ1Y3QgdWJpZnNfaW5mbyAqYyk7CiB2b2lkIGRiZ19kdW1wX2xwdF9pbmZvKHN0cnVjdCB1Ymlmc19pbmZvICpjKTsKIHZvaWQgZGJnX2R1bXBfbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBpbnQgbG51bSk7Cit2b2lkIGRiZ19kdW1wX3NsZWIoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsCisJCSAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpOwogdm9pZCBkYmdfZHVtcF96bm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkJICAgIGNvbnN0IHN0cnVjdCB1Ymlmc196bm9kZSAqem5vZGUpOwogdm9pZCBkYmdfZHVtcF9oZWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLCBzdHJ1Y3QgdWJpZnNfbHB0X2hlYXAgKmhlYXAsIGludCBjYXQpOwpAQCAtMzg3LDYgKzM4OSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGJnX2R1bXBfbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAogCQkJCWludCBsbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybjsgfQogc3RhdGljIGlubGluZSB2b2lkCitkYmdfZHVtcF9zbGViKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLAorCSAgICAgIGNvbnN0IHN0cnVjdCB1Ymlmc19zY2FuX2xlYiAqc2xlYiwgaW50IG9mZnMpICAgICAgICB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkCiBkYmdfZHVtcF96bm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKIAkgICAgICAgY29uc3Qgc3RydWN0IHViaWZzX3pub2RlICp6bm9kZSkgICAgICAgICAgICAgICAgICAgeyByZXR1cm47IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkYmdfZHVtcF9oZWFwKHN0cnVjdCB1Ymlmc19pbmZvICpjLApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvcmVjb3ZlcnkuYyBiL2ZzL3ViaWZzL3JlY292ZXJ5LmMKaW5kZXggYWYwMjc5MC4uZWU0ZjQzZiAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvcmVjb3ZlcnkuYworKysgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCkBAIC05ODMsNyArOTgzLDcgQEAKIH0KIAogLyoqCi0gKiAgY2xlYW5fYW5fdW5jbGVhbl9sZWIgLSByZWFkIGFuZCB3cml0ZSBhIExFQiB0byByZW1vdmUgY29ycnVwdGlvbi4KKyAqIGNsZWFuX2FuX3VuY2xlYW5fbGViIC0gcmVhZCBhbmQgd3JpdGUgYSBMRUIgdG8gcmVtb3ZlIGNvcnJ1cHRpb24uCiAgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAdWNsZWI6IHVuY2xlYW4gTEVCIGluZm9ybWF0aW9uCiAgKiBAc2J1ZjogTEVCLXNpemVkIGJ1ZmZlciB0byB1c2UKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3NiLmMgYi9mcy91Ymlmcy9zYi5jCmluZGV4IDkzZDkzOGEuLjYwOTRjNWEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3NiLmMKKysrIGIvZnMvdWJpZnMvc2IuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJbXN0LT50b3RhbF9kaXJ0eSA9IGNwdV90b19sZTY0KHRtcDY0KTsKIAogCS8qICBUaGUgaW5kZXhpbmcgTEVCIGRvZXMgbm90IGNvbnRyaWJ1dGUgdG8gZGFyayBzcGFjZSAqLwotCXRtcDY0ID0gKGMtPm1haW5fbGVicyAtIDEpICogYy0+ZGFya193bTsKKwl0bXA2NCA9ICgobG9uZyBsb25nKShjLT5tYWluX2xlYnMgLSAxKSAqIGMtPmRhcmtfd20pOwogCW1zdC0+dG90YWxfZGFyayA9IGNwdV90b19sZTY0KHRtcDY0KTsKIAogCW1zdC0+dG90YWxfdXNlZCA9IGNwdV90b19sZTY0KFVCSUZTX0lOT19OT0RFX1NaKTsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IGIyODEyMTIuLjIwNDAzZGMgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCWdvdG8gb3V0X2lubzsKIAogCWlub2RlLT5pX2ZsYWdzIHw9IChTX05PQ01USU1FIHwgU19OT0FUSU1FKTsKLQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KGluby0+bmxpbmspOworCXNldF9ubGluayhpbm9kZSwgbGUzMl90b19jcHUoaW5vLT5ubGluaykpOwogCWlub2RlLT5pX3VpZCAgID0gbGUzMl90b19jcHUoaW5vLT51aWQpOwogCWlub2RlLT5pX2dpZCAgID0gbGUzMl90b19jcHUoaW5vLT5naWQpOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgPSAoaW50NjRfdClsZTY0X3RvX2NwdShpbm8tPmF0aW1lX3NlYyk7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy94YXR0ci5jIGIvZnMvdWJpZnMveGF0dHIuYwppbmRleCAxNmYxOWY1Li5iZjE4ZjdhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy94YXR0ci5jCisrKyBiL2ZzL3ViaWZzL3hhdHRyLmMKQEAgLTU1OCwxMCArNTU4LDEwIEBACiAJfQogCiAJdWJpZnNfYXNzZXJ0KGlub2RlLT5pX25saW5rID09IDEpOwotCWlub2RlLT5pX25saW5rID0gMDsKKwljbGVhcl9ubGluayhpbm9kZSk7CiAJZXJyID0gcmVtb3ZlX3hhdHRyKGMsIGhvc3QsIGlub2RlLCAmbm0pOwogCWlmIChlcnIpCi0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAogCS8qIElmIEBpX25saW5rIGlzIDAsICdpcHV0KCknIHdpbGwgZGVsZXRlIHRoZSBpbm9kZSAqLwogCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2JhbGxvYy5jIGIvZnMvdWRmL2JhbGxvYy5jCmluZGV4IDk1NTE4YTkuLjk4NzU4NWIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9iYWxsb2MuYworKysgYi9mcy91ZGYvYmFsbG9jLmMKQEAgLTU5LDggKzU5LDggQEAKIAlpbnQgbnJfZ3JvdXBzID0gYml0bWFwLT5zX25yX2dyb3VwczsKIAogCWlmIChibG9ja19ncm91cCA+PSBucl9ncm91cHMpIHsKLQkJdWRmX2RlYnVnKCJibG9ja19ncm91cCAoJWQpID4gbnJfZ3JvdXBzICglZClcbiIsIGJsb2NrX2dyb3VwLAotCQkJICBucl9ncm91cHMpOworCQl1ZGZfZGVidWcoImJsb2NrX2dyb3VwICglZCkgPiBucl9ncm91cHMgKCVkKVxuIiwKKwkJCSAgYmxvY2tfZ3JvdXAsIG5yX2dyb3Vwcyk7CiAJfQogCiAJaWYgKGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYmxvY2tfZ3JvdXBdKSB7CkBAIC0xMjYsOCArMTI2LDkgQEAKIAlpZiAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQgPCBjb3VudCB8fAogCSAgICAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKSB7CiAJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCi0JCQkgIGJsb2MtPmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy0+bG9naWNhbEJsb2NrTnVtLAotCQkJICBjb3VudCwgcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKTsKKwkJCSAgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCAwLAorCQkJICBibG9jLT5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAorCQkJICBwYXJ0bWFwLT5zX3BhcnRpdGlvbl9sZW4pOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKQEAgLTE1NSw3ICsxNTYsNyBAQAogCQkJaWYgKHVkZl9zZXRfYml0KGJpdCArIGksIGJoLT5iX2RhdGEpKSB7CiAJCQkJdWRmX2RlYnVnKCJiaXQgJWxkIGFscmVhZHkgc2V0XG4iLCBiaXQgKyBpKTsKIAkJCQl1ZGZfZGVidWcoImJ5dGU9JTJ4XG4iLAotCQkJCQkoKGNoYXIgKiliaC0+Yl9kYXRhKVsoYml0ICsgaSkgPj4gM10pOworCQkJCQkgICgoY2hhciAqKWJoLT5iX2RhdGEpWyhiaXQgKyBpKSA+PiAzXSk7CiAJCQl9CiAJCX0KIAkJdWRmX2FkZF9mcmVlX3NwYWNlKHNiLCBzYmktPnNfcGFydGl0aW9uLCBjb3VudCk7CkBAIC0zNjksNyArMzcwLDggQEAKIAlpZiAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQgPCBjb3VudCB8fAogCSAgICAoYmxvYy0+bG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gcGFydG1hcC0+c19wYXJ0aXRpb25fbGVuKSB7CiAJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCi0JCQkgIGJsb2MtPmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCBjb3VudCwKKwkJCSAgYmxvYy0+bG9naWNhbEJsb2NrTnVtLCAwLAorCQkJICBibG9jLT5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAogCQkJICBwYXJ0bWFwLT5zX3BhcnRpdGlvbl9sZW4pOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CmRpZmYgLS1naXQgYS9mcy91ZGYvZGlyZWN0b3J5LmMgYi9mcy91ZGYvZGlyZWN0b3J5LmMKaW5kZXggMmZmZGI2Ny4uM2U0NGY1NyAxMDA2NDQKLS0tIGEvZnMvdWRmL2RpcmVjdG9yeS5jCisrKyBiL2ZzL3VkZi9kaXJlY3RvcnkuYwpAQCAtMTYyLDggKzE2Miw4IEBACiAJaW50IHBhZGxlbjsKIAogCWlmICgoIWJ1ZmZlcikgfHwgKCFvZmZzZXQpKSB7Ci0JCXVkZl9kZWJ1ZygiaW52YWxpZHBhcm1zXG4sIGJ1ZmZlcj0lcCwgb2Zmc2V0PSVwXG4iLCBidWZmZXIsCi0JCQkgIG9mZnNldCk7CisJCXVkZl9kZWJ1ZygiaW52YWxpZHBhcm1zLCBidWZmZXI9JXAsIG9mZnNldD0lcFxuIiwKKwkJCSAgYnVmZmVyLCBvZmZzZXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogCXN0cnVjdCBzaG9ydF9hZCAqc2E7CiAKIAlpZiAoKCFwdHIpIHx8ICghb2Zmc2V0KSkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2dldF9maWxlc2hvcnRhZCgpIGludmFsaWRwYXJtc1xuIik7CisJCXByX2VycigiJXM6IGludmFsaWRwYXJtc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCXN0cnVjdCBsb25nX2FkICpsYTsKIAogCWlmICgoIXB0cikgfHwgKCFvZmZzZXQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZ2V0X2ZpbGVsb25nYWQoKSBpbnZhbGlkcGFybXNcbiIpOworCQlwcl9lcnIoIiVzOiBpbnZhbGlkcGFybXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IDFkMTM1OGUuLjRmZDFkODAgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYy1pdHUtdC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAKICNpbmNsdWRlICJ1ZGZfaS5oIgogI2luY2x1ZGUgInVkZl9zYi5oIgpAQCAtODMsMTIgKzg0LDEwIEBACiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7CiAJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgIT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCICYmCiAJICAgIGlub2RlLT5pX3NpemUgIT0gaWluZm8tPmlfbGVuRXh0ZW50cykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnMgKCVzKTogSW5vZGUgJWx1IChtb2RlICVvKSBoYXMgIgotCQkJImlub2RlIHNpemUgJWxsdSBkaWZmZXJlbnQgZnJvbSBleHRlbnQgbGVuZ3RoICVsbHUuICIKLQkJCSJGaWxlc3lzdGVtIG5lZWQgbm90IGJlIHN0YW5kYXJkcyBjb21wbGlhbnQuXG4iLAotCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbW9kZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWluZm8tPmlfbGVuRXh0ZW50cyk7CisJCXVkZl93YXJuKGlub2RlLT5pX3NiLCAiSW5vZGUgJWx1IChtb2RlICVvKSBoYXMgaW5vZGUgc2l6ZSAlbGx1IGRpZmZlcmVudCBmcm9tIGV4dGVudCBsZW5ndGggJWxsdS4gRmlsZXN5c3RlbSBuZWVkIG5vdCBiZSBzdGFuZGFyZHMgY29tcGxpYW50LlxuIiwKKwkJCSBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm9kZS0+aV9zaXplLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWluZm8tPmlfbGVuRXh0ZW50cyk7CiAJfQogCWtmcmVlKGlpbmZvLT5pX2V4dC5pX2RhdGEpOwogCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBOVUxMOwpAQCAtMTA0LDcgKzEwMywxMyBAQAogCiBzdGF0aWMgaW50IHVkZl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHVkZl9nZXRfYmxvY2spOworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCB1ZGZfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCB1ZGZfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgdWRmX2dldF9ibG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgdWRmX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTEzOSw2ICsxNDQsNyBAQAogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9hb3BzID0gewogCS5yZWFkcGFnZQk9IHVkZl9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCT0gdWRmX3JlYWRwYWdlcywKIAkud3JpdGVwYWdlCT0gdWRmX3dyaXRlcGFnZSwKIAkud3JpdGVfYmVnaW4JCT0gdWRmX3dyaXRlX2JlZ2luLAogCS53cml0ZV9lbmQJCT0gZ2VuZXJpY193cml0ZV9lbmQsCkBAIC0xMTY5LDE2ICsxMTc1LDE1IEBACiAJICovCiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCAmaWluZm8tPmlfbG9jYXRpb24sIDAsICZpZGVudCk7CiAJaWYgKCFiaCkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX3JlYWRfaW5vZGUoaW5vICVsZCkgZmFpbGVkICFiaFxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXVkZl9lcnIoaW5vZGUtPmlfc2IsICIoaW5vICVsZCkgZmFpbGVkICFiaFxuIiwgaW5vZGUtPmlfaW5vKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGlkZW50ICE9IFRBR19JREVOVF9GRSAmJiBpZGVudCAhPSBUQUdfSURFTlRfRUZFICYmCiAJICAgIGlkZW50ICE9IFRBR19JREVOVF9VU0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9yZWFkX2lub2RlKGlubyAlbGQpICIKLQkJCQkiZmFpbGVkIGlkZW50PSVkXG4iLCBpbm9kZS0+aV9pbm8sIGlkZW50KTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgIihpbm8gJWxkKSBmYWlsZWQgaWRlbnQ9JWRcbiIsCisJCQlpbm9kZS0+aV9pbm8sIGlkZW50KTsKIAkJYnJlbHNlKGJoKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CkBAIC0xMjE4LDggKzEyMjMsOCBAQAogCQl9CiAJCWJyZWxzZShpYmgpOwogCX0gZWxzZSBpZiAoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUgIT0gY3B1X3RvX2xlMTYoNCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAotCQkgICAgICAgbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgInVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKIAkJYnJlbHNlKGJoKTsKIAkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm47CkBAIC0xMjM2LDYgKzEyNDEsNyBAQAogCWludCBvZmZzZXQ7CiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CisJdW5zaWduZWQgaW50IGxpbmtfY291bnQ7CiAKIAlmZSA9IChzdHJ1Y3QgZmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKIAllZmUgPSAoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKQEAgLTEzMTgsOSArMTMyNCwxMCBAQAogCWlub2RlLT5pX21vZGUgJj0gfnNiaS0+c191bWFzazsKIAlyZWFkX3VubG9jaygmc2JpLT5zX2NyZWRfbG9jayk7CiAKLQlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKLQlpZiAoIWlub2RlLT5pX25saW5rKQotCQlpbm9kZS0+aV9ubGluayA9IDE7CisJbGlua19jb3VudCA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKKwlpZiAoIWxpbmtfY291bnQpCisJCWxpbmtfY291bnQgPSAxOworCXNldF9ubGluayhpbm9kZSwgbGlua19jb3VudCk7CiAKIAlpbm9kZS0+aV9zaXplID0gbGU2NF90b19jcHUoZmUtPmluZm9ybWF0aW9uTGVuZ3RoKTsKIAlpaW5mby0+aV9sZW5FeHRlbnRzID0gaW5vZGUtPmlfc2l6ZTsKQEAgLTE0MTMsOSArMTQyMCw4IEBACiAJCXVkZl9kZWJ1ZygiTUVUQURBVEEgQklUTUFQIEZJTEUtLS0tLVxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZmlsbF9pbm9kZShpbm8gJWxkKSBmYWlsZWQgdW5rbm93biAiCi0JCQkJImZpbGUgdHlwZT0lZFxuIiwgaW5vZGUtPmlfaW5vLAotCQkJCWZlLT5pY2JUYWcuZmlsZVR5cGUpOworCQl1ZGZfZXJyKGlub2RlLT5pX3NiLCAiKGlubyAlbGQpIGZhaWxlZCB1bmtub3duIGZpbGUgdHlwZT0lZFxuIiwKKwkJCWlub2RlLT5pX2lubywgZmUtPmljYlRhZy5maWxlVHlwZSk7CiAJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE0MzgsOCArMTQ0NCw4IEBACiAJaWluZm8tPmlfZXh0LmlfZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWlpbmZvLT5pX2V4dC5pX2RhdGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6dWRmX2FsbG9jX2lfZGF0YSAoaW5vICVsZCkgIgotCQkJCSJubyBmcmVlIG1lbW9yeVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJdWRmX2Vycihpbm9kZS0+aV9zYiwgIihpbm8gJWxkKSBubyBmcmVlIG1lbW9yeVxuIiwKKwkJCWlub2RlLT5pX2lubyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTY4OSw5ICsxNjk1LDggQEAKIAlpZiAoZG9fc3luYykgewogCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJCWlmIChidWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJJTyBlcnJvciBzeW5jaW5nIHVkZiBpbm9kZSAiCi0JCQkJIlslczolMDhseF1cbiIsIGlub2RlLT5pX3NiLT5zX2lkLAotCQkJCWlub2RlLT5pX2lubyk7CisJCQl1ZGZfd2Fybihpbm9kZS0+aV9zYiwgIklPIGVycm9yIHN5bmNpbmcgdWRmIGlub2RlIFslMDhseF1cbiIsCisJCQkJIGlub2RlLT5pX2lubyk7CiAJCQllcnIgPSAtRUlPOwogCQl9CiAJfQpAQCAtMTk4Miw4ICsxOTg3LDcgQEAKIAkJKmVsZW4gPSBsZTMyX3RvX2NwdShsYWQtPmV4dExlbmd0aCkgJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl1ZGZfZGVidWcoImFsbG9jX3R5cGUgPSAlZCB1bnN1cHBvcnRlZFxuIiwKLQkJCQlpaW5mby0+aV9hbGxvY190eXBlKTsKKwkJdWRmX2RlYnVnKCJhbGxvY190eXBlID0gJWQgdW5zdXBwb3J0ZWRcbiIsIGlpbmZvLT5pX2FsbG9jX3R5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvbG93bGV2ZWwuYyBiL2ZzL3VkZi9sb3dsZXZlbC5jCmluZGV4IDQzZTI0YTMuLjY1ODNmZTkgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9sb3dsZXZlbC5jCisrKyBiL2ZzL3VkZi9sb3dsZXZlbC5jCkBAIC0zOCw3ICszOCw3IEBACiAKIAlpZiAoaSA9PSAwKSB7CiAJCXVkZl9kZWJ1ZygiWEEgZGlzazogJXMsIHZvbF9kZXNjX3N0YXJ0PSVkXG4iLAotCQkJICAobXNfaW5mby54YV9mbGFnID8gInllcyIgOiAibm8iKSwgbXNfaW5mby5hZGRyLmxiYSk7CisJCQkgIG1zX2luZm8ueGFfZmxhZyA/ICJ5ZXMiIDogIm5vIiwgbXNfaW5mby5hZGRyLmxiYSk7CiAJCWlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KIAkJCXZvbF9kZXNjX3N0YXJ0ID0gbXNfaW5mby5hZGRyLmxiYTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvdWRmL21pc2MuYyBiL2ZzL3VkZi9taXNjLmMKaW5kZXggOTIxNTcwMC4uYzE3NWI0ZCAxMDA2NDQKLS0tIGEvZnMvdWRmL21pc2MuYworKysgYi9mcy91ZGYvbWlzYy5jCkBAIC0yMDQsNiArMjA0LDcgQEAKIHsKIAlzdHJ1Y3QgdGFnICp0YWdfcDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1OCBjaGVja3N1bTsKIAogCS8qIFJlYWQgdGhlIGJsb2NrICovCiAJaWYgKGJsb2NrID09IDB4RkZGRkZGRkYpCkBAIC0yMTEsOCArMjEyLDggQEAKIAogCWJoID0gdWRmX3RyZWFkKHNiLCBibG9jayk7CiAJaWYgKCFiaCkgewotCQl1ZGZfZGVidWcoImJsb2NrPSVkLCBsb2NhdGlvbj0lZDogcmVhZCBmYWlsZWRcbiIsCi0JCQkgIGJsb2NrLCBsb2NhdGlvbik7CisJCXVkZl9lcnIoc2IsICJyZWFkIGZhaWxlZCwgYmxvY2s9JXUsIGxvY2F0aW9uPSVkXG4iLAorCQkJYmxvY2ssIGxvY2F0aW9uKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yMjcsMTYgKzIyOCwxOCBAQAogCX0KIAogCS8qIFZlcmlmeSB0aGUgdGFnIGNoZWNrc3VtICovCi0JaWYgKHVkZl90YWdfY2hlY2tzdW0odGFnX3ApICE9IHRhZ19wLT50YWdDaGVja3N1bSkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdGFnIGNoZWNrc3VtIGZhaWxlZCBibG9jayAlZFxuIiwgYmxvY2spOworCWNoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSh0YWdfcCk7CisJaWYgKGNoZWNrc3VtICE9IHRhZ19wLT50YWdDaGVja3N1bSkgeworCQl1ZGZfZXJyKHNiLCAidGFnIGNoZWNrc3VtIGZhaWxlZCwgYmxvY2sgJXU6IDB4JTAyeCAhPSAweCUwMnhcbiIsCisJCQlibG9jaywgY2hlY2tzdW0sIHRhZ19wLT50YWdDaGVja3N1bSk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAogCS8qIFZlcmlmeSB0aGUgdGFnIHZlcnNpb24gKi8KIAlpZiAodGFnX3AtPmRlc2NWZXJzaW9uICE9IGNwdV90b19sZTE2KDB4MDAwMlUpICYmCiAJICAgIHRhZ19wLT5kZXNjVmVyc2lvbiAhPSBjcHVfdG9fbGUxNigweDAwMDNVKSkgewotCQl1ZGZfZGVidWcoInRhZyB2ZXJzaW9uIDB4JTA0eCAhPSAweDAwMDIgfHwgMHgwMDAzIGJsb2NrICVkXG4iLAotCQkJICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pLCBibG9jayk7CisJCXVkZl9lcnIoc2IsICJ0YWcgdmVyc2lvbiAweCUwNHggIT0gMHgwMDAyIHx8IDB4MDAwMywgYmxvY2sgJXVcbiIsCisJCQlsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pLCBibG9jayk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIApAQCAtMjQ4LDggKzI1MSw4IEBACiAJCXJldHVybiBiaDsKIAogCXVkZl9kZWJ1ZygiQ3JjIGZhaWx1cmUgYmxvY2sgJWQ6IGNyYyA9ICVkLCBjcmNsZW4gPSAlZFxuIiwgYmxvY2ssCi0JICAgIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDKSwgbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkNMZW5ndGgpKTsKLQorCQkgIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDKSwKKwkJICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCkpOwogZXJyb3Jfb3V0OgogCWJyZWxzZShiaCk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9mcy91ZGYvbmFtZWkuYyBiL2ZzL3VkZi9uYW1laS5jCmluZGV4IGYxZGNlODQuLjQ2MzllMTMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9uYW1laS5jCisrKyBiL2ZzL3VkZi9uYW1laS5jCkBAIC01NzcsOCArNTc3LDcgQEAKIAogCWZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpOwogCWlmICghZmkpIHsKLQkJaW5vZGUtPmlfbmxpbmstLTsKLQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtNjE4LDggKzYxNyw3IEBACiAJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKIAlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKSB7Ci0JCWlub2RlLT5pX25saW5rLS07Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTY2NSwxMiArNjYzLDExIEBACiAJaW5vZGUtPmlfZm9wID0gJnVkZl9kaXJfb3BlcmF0aW9uczsKIAlmaSA9IHVkZl9hZGRfZW50cnkoaW5vZGUsIE5VTEwsICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKSB7Ci0JCWlub2RlLT5pX25saW5rLS07Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlnb3RvIG91dDsKIAl9Ci0JaW5vZGUtPmlfbmxpbmsgPSAyOworCXNldF9ubGluayhpbm9kZSwgMik7CiAJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihkaW5mby0+aV9sb2NhdGlvbik7CiAJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CkBAIC02ODMsNyArNjgwLDcgQEAKIAogCWZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpOwogCWlmICghZmkpIHsKLQkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBvdXQ7CkBAIC03OTksOSArNzk2LDggQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVuZF9ybWRpcjsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMikKLQkJdWRmX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZGZfcm1kaXIiLAotCQkJICAgICJlbXB0eSBkaXJlY3RvcnkgaGFzIG5saW5rICE9IDIgKCVkKSIsCi0JCQkgICAgaW5vZGUtPmlfbmxpbmspOworCQl1ZGZfd2Fybihpbm9kZS0+aV9zYiwgImVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIT0gMiAoJWQpXG4iLAorCQkJIGlub2RlLT5pX25saW5rKTsKIAljbGVhcl9ubGluayhpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaW5vZGVfZGVjX2xpbmtfY291bnQoZGlyKTsKQEAgLTg0MCw3ICs4MzYsNyBAQAogCWlmICghaW5vZGUtPmlfbmxpbmspIHsKIAkJdWRmX2RlYnVnKCJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglbHUpLCAlZFxuIiwKIAkJCSAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7Ci0JCWlub2RlLT5pX25saW5rID0gMTsKKwkJc2V0X25saW5rKGlub2RlLCAxKTsKIAl9CiAJcmV0dmFsID0gdWRmX2RlbGV0ZV9lbnRyeShkaXIsIGZpLCAmZmliaCwgJmNmaSk7CiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2ZzL3VkZi9wYXJ0aXRpb24uYyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwppbmRleCBhNzEwOTBlLi5kNmNhZjAxIDEwMDY0NAotLS0gYS9mcy91ZGYvcGFydGl0aW9uLmMKKysrIGIvZnMvdWRmL3BhcnRpdGlvbi5jCkBAIC0zMyw4ICszMyw4IEBACiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKIAlpZiAocGFydGl0aW9uID49IHNiaS0+c19wYXJ0aXRpb25zKSB7Ci0JCXVkZl9kZWJ1ZygiYmxvY2s9JWQsIHBhcnRpdGlvbj0lZCwgb2Zmc2V0PSVkOiAiCi0JCQkgICJpbnZhbGlkIHBhcnRpdGlvblxuIiwgYmxvY2ssIHBhcnRpdGlvbiwgb2Zmc2V0KTsKKwkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkLCBvZmZzZXQ9JWQ6IGludmFsaWQgcGFydGl0aW9uXG4iLAorCQkJICBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAl9CiAJbWFwID0gJnNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dOwpAQCAtNjAsOCArNjAsOCBAQAogCXZkYXRhID0gJm1hcC0+c190eXBlX3NwZWNpZmljLnNfdmlydHVhbDsKIAogCWlmIChibG9jayA+IHZkYXRhLT5zX251bV9lbnRyaWVzKSB7Ci0JCXVkZl9kZWJ1ZygiVHJ5aW5nIHRvIGFjY2VzcyBibG9jayBiZXlvbmQgZW5kIG9mIFZBVCAiCi0JCQkgICIoJWQgbWF4ICVkKVxuIiwgYmxvY2ssIHZkYXRhLT5zX251bV9lbnRyaWVzKTsKKwkJdWRmX2RlYnVnKCJUcnlpbmcgdG8gYWNjZXNzIGJsb2NrIGJleW9uZCBlbmQgb2YgVkFUICglZCBtYXggJWQpXG4iLAorCQkJICBibG9jaywgdmRhdGEtPnNfbnVtX2VudHJpZXMpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAl9CiAKQEAgLTMyMSw5ICszMjEsMTQgQEAKIAkvKiBXZSBzaG91bGRuJ3QgbW91bnQgc3VjaCBtZWRpYS4uLiAqLwogCUJVR19PTighaW5vZGUpOwogCXJldGJsayA9IHVkZl90cnlfcmVhZF9tZXRhKGlub2RlLCBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOwotCWlmIChyZXRibGsgPT0gMHhGRkZGRkZGRikgewotCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJlcnJvciByZWFkaW5nIGZyb20gTUVUQURBVEEsICIKLQkJCSJ0cnlpbmcgdG8gcmVhZCBmcm9tIE1JUlJPUiIpOworCWlmIChyZXRibGsgPT0gMHhGRkZGRkZGRiAmJiBtZGF0YS0+c19tZXRhZGF0YV9mZSkgeworCQl1ZGZfd2FybihzYiwgImVycm9yIHJlYWRpbmcgZnJvbSBNRVRBREFUQSwgdHJ5aW5nIHRvIHJlYWQgZnJvbSBNSVJST1JcbiIpOworCQlpZiAoIShtZGF0YS0+c19mbGFncyAmIE1GX01JUlJPUl9GRV9MT0FERUQpKSB7CisJCQltZGF0YS0+c19taXJyb3JfZmUgPSB1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc2IsCisJCQkJbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CisJCQltZGF0YS0+c19mbGFncyB8PSBNRl9NSVJST1JfRkVfTE9BREVEOworCQl9CisKIAkJaW5vZGUgPSBtZGF0YS0+c19taXJyb3JfZmU7CiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gMHhGRkZGRkZGRjsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKaW5kZXggN2IyN2IwNi4uZTE4NTI1MyAxMDA2NDQKLS0tIGEvZnMvdWRmL3N1cGVyLmMKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTc1LDggKzc1LDYgQEAKIAogI2RlZmluZSBVREZfREVGQVVMVF9CTE9DS1NJWkUgMjA0OAogCi1zdGF0aWMgY2hhciBlcnJvcl9idWZbMTAyNF07Ci0KIC8qIFRoZXNlIGFyZSB0aGUgIm1lYXQiIC0gZXZlcnl0aGluZyBlbHNlIGlzIHN0dWZmaW5nICovCiBzdGF0aWMgaW50IHVkZl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCk7CiBzdGF0aWMgdm9pZCB1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKQEAgLTkyLDggKzkwLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCB1ZGZfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBzdGF0aWMgaW50IHVkZl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKLXN0YXRpYyB2b2lkIHVkZl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKnVkZl9zYl9sdmlkaXUoc3RydWN0IHVkZl9zYl9pbmZvICpzYmkpCiB7CkBAIC0yNDQsOSArMjQwLDggQEAKIAlzYmktPnNfcGFydG1hcHMgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHVkZl9wYXJ0X21hcCksCiAJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaS0+c19wYXJ0bWFwcykgewotCQl1ZGZfZXJyb3Ioc2IsIF9fZnVuY19fLAotCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAlZCBwYXJ0aXRpb24gbWFwcyIsCi0JCQkgIGNvdW50KTsKKwkJdWRmX2VycihzYiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgJWQgcGFydGl0aW9uIG1hcHNcbiIsCisJCQljb3VudCk7CiAJCXNiaS0+c19wYXJ0aXRpb25zID0gMDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNTUwLDggKzU0NSw3IEBACiAJCQl1b3B0LT5kbW9kZSA9IG9wdGlvbiAmIDA3Nzc7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAidWRmOiBiYWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCi0JCQkgICAgICAgIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcHJfZXJyKCJiYWQgbW91bnQgb3B0aW9uIFwiJXNcIiBvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjQ1LDIwICs2MzksMTYgQEAKIAkJCQl1ZGZfZGVidWcoIklTTzk2NjAgQm9vdCBSZWNvcmQgZm91bmRcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgotCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBQcmltYXJ5IFZvbHVtZSBEZXNjcmlwdG9yICIKLQkJCQkJICAiZm91bmRcbiIpOworCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBQcmltYXJ5IFZvbHVtZSBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjoKLQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgIgotCQkJCQkgICJEZXNjcmlwdG9yIGZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgRGVzY3JpcHRvciBmb3VuZFxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6Ci0JCQkJdWRmX2RlYnVnKCJJU085NjYwIFZvbHVtZSBQYXJ0aXRpb24gRGVzY3JpcHRvciAiCi0JCQkJCSAgImZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIFBhcnRpdGlvbiBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjU1OgotCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBWb2x1bWUgRGVzY3JpcHRvciBTZXQgIgotCQkJCQkgICJUZXJtaW5hdG9yIGZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVm9sdW1lIERlc2NyaXB0b3IgU2V0IFRlcm1pbmF0b3IgZm91bmRcbiIpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVlJTICgldSkgZm91bmRcbiIsCkBAIC04MDksOCArNzk5LDcgQEAKIAkJCSAgICAgIHB2b2xkZXNjLT5yZWNvcmRpbmdEYXRlQW5kVGltZSkpIHsKICNpZmRlZiBVREZGU19ERUJVRwogCQlzdHJ1Y3QgdGltZXN0YW1wICp0cyA9ICZwdm9sZGVzYy0+cmVjb3JkaW5nRGF0ZUFuZFRpbWU7Ci0JCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJTA0dS8lMDJ1LyUwMnUiCi0JCQkgICIgJTAydTolMDJ1ICgleClcbiIsCisJCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCiAJCQkgIGxlMTZfdG9fY3B1KHRzLT55ZWFyKSwgdHMtPm1vbnRoLCB0cy0+ZGF5LCB0cy0+aG91ciwKIAkJCSAgdHMtPm1pbnV0ZSwgbGUxNl90b19jcHUodHMtPnR5cGVBbmRUaW1lem9uZSkpOwogI2VuZGlmCkBAIC04MjEsNyArODEwLDcgQEAKIAkJCXN0cm5jcHkoVURGX1NCKHNiKS0+c192b2x1bWVfaWRlbnQsIG91dHN0ci0+dV9uYW1lLAogCQkJCW91dHN0ci0+dV9sZW4gPiAzMSA/IDMxIDogb3V0c3RyLT51X2xlbik7CiAJCQl1ZGZfZGVidWcoInZvbElkZW50W10gPSAnJXMnXG4iLAotCQkJCQlVREZfU0Ioc2IpLT5zX3ZvbHVtZV9pZGVudCk7CisJCQkJICBVREZfU0Ioc2IpLT5zX3ZvbHVtZV9pZGVudCk7CiAJCX0KIAogCWlmICghdWRmX2J1aWxkX3VzdHIoaW5zdHIsIHB2b2xkZXNjLT52b2xTZXRJZGVudCwgMTI4KSkKQEAgLTgzNyw2NCArODI2LDU3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IGlub2RlICp1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJdTMyIG1ldGFfZmlsZV9sb2MsIHUzMiBwYXJ0aXRpb25fbnVtKQoreworCXN0cnVjdCBrZXJuZWxfbGJfYWRkciBhZGRyOworCXN0cnVjdCBpbm9kZSAqbWV0YWRhdGFfZmU7CisKKwlhZGRyLmxvZ2ljYWxCbG9ja051bSA9IG1ldGFfZmlsZV9sb2M7CisJYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBwYXJ0aXRpb25fbnVtOworCisJbWV0YWRhdGFfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOworCisJaWYgKG1ldGFkYXRhX2ZlID09IE5VTEwpCisJCXVkZl93YXJuKHNiLCAibWV0YWRhdGEgaW5vZGUgZWZlIG5vdCBmb3VuZFxuIik7CisJZWxzZSBpZiAoVURGX0kobWV0YWRhdGFfZmUpLT5pX2FsbG9jX3R5cGUgIT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpIHsKKwkJdWRmX3dhcm4oc2IsICJtZXRhZGF0YSBpbm9kZSBlZmUgZG9lcyBub3QgaGF2ZSBzaG9ydCBhbGxvY2F0aW9uIGRlc2NyaXB0b3JzIVxuIik7CisJCWlwdXQobWV0YWRhdGFfZmUpOworCQltZXRhZGF0YV9mZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIG1ldGFkYXRhX2ZlOworfQorCiBzdGF0aWMgaW50IHVkZl9sb2FkX21ldGFkYXRhX2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBwYXJ0aXRpb24pCiB7CiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKIAlzdHJ1Y3QgdWRmX21ldGFfZGF0YSAqbWRhdGE7CiAJc3RydWN0IGtlcm5lbF9sYl9hZGRyIGFkZHI7Ci0JaW50IGZlX2Vycm9yID0gMDsKIAogCW1hcCA9ICZzYmktPnNfcGFydG1hcHNbcGFydGl0aW9uXTsKIAltZGF0YSA9ICZtYXAtPnNfdHlwZV9zcGVjaWZpYy5zX21ldGFkYXRhOwogCiAJLyogbWV0YWRhdGEgYWRkcmVzcyAqLwotCWFkZHIubG9naWNhbEJsb2NrTnVtID0gIG1kYXRhLT5zX21ldGFfZmlsZV9sb2M7Ci0JYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBtYXAtPnNfcGFydGl0aW9uX251bTsKLQogCXVkZl9kZWJ1ZygiTWV0YWRhdGEgZmlsZSBsb2NhdGlvbjogYmxvY2sgPSAlZCBwYXJ0ID0gJWRcbiIsCi0JCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCSAgbWRhdGEtPnNfbWV0YV9maWxlX2xvYywgbWFwLT5zX3BhcnRpdGlvbl9udW0pOwogCi0JbWRhdGEtPnNfbWV0YWRhdGFfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOworCW1kYXRhLT5zX21ldGFkYXRhX2ZlID0gdWRmX2ZpbmRfbWV0YWRhdGFfaW5vZGVfZWZlKHNiLAorCQltZGF0YS0+c19tZXRhX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CiAKIAlpZiAobWRhdGEtPnNfbWV0YWRhdGFfZmUgPT0gTlVMTCkgewotCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJtZXRhZGF0YSBpbm9kZSBlZmUgbm90IGZvdW5kLCAiCi0JCQkJIndpbGwgdHJ5IG1pcnJvciBpbm9kZS4iKTsKLQkJZmVfZXJyb3IgPSAxOwotCX0gZWxzZSBpZiAoVURGX0kobWRhdGEtPnNfbWV0YWRhdGFfZmUpLT5pX2FsbG9jX3R5cGUgIT0KLQkJIElDQlRBR19GTEFHX0FEX1NIT1JUKSB7Ci0JCXVkZl93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIm1ldGFkYXRhIGlub2RlIGVmZSBkb2VzIG5vdCBoYXZlICIKLQkJCSJzaG9ydCBhbGxvY2F0aW9uIGRlc2NyaXB0b3JzISIpOwotCQlmZV9lcnJvciA9IDE7Ci0JCWlwdXQobWRhdGEtPnNfbWV0YWRhdGFfZmUpOwotCQltZGF0YS0+c19tZXRhZGF0YV9mZSA9IE5VTEw7Ci0JfQorCQkvKiBtaXJyb3IgZmlsZSBlbnRyeSAqLworCQl1ZGZfZGVidWcoIk1pcnJvciBtZXRhZGF0YSBmaWxlIGxvY2F0aW9uOiBibG9jayA9ICVkIHBhcnQgPSAlZFxuIiwKKwkJCSAgbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jLCBtYXAtPnNfcGFydGl0aW9uX251bSk7CiAKLQkvKiBtaXJyb3IgZmlsZSBlbnRyeSAqLwotCWFkZHIubG9naWNhbEJsb2NrTnVtID0gbWRhdGEtPnNfbWlycm9yX2ZpbGVfbG9jOwotCWFkZHIucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gbWFwLT5zX3BhcnRpdGlvbl9udW07CisJCW1kYXRhLT5zX21pcnJvcl9mZSA9IHVkZl9maW5kX21ldGFkYXRhX2lub2RlX2VmZShzYiwKKwkJCW1kYXRhLT5zX21pcnJvcl9maWxlX2xvYywgbWFwLT5zX3BhcnRpdGlvbl9udW0pOwogCi0JdWRmX2RlYnVnKCJNaXJyb3IgbWV0YWRhdGEgZmlsZSBsb2NhdGlvbjogYmxvY2sgPSAlZCBwYXJ0ID0gJWRcbiIsCi0JCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7Ci0KLQltZGF0YS0+c19taXJyb3JfZmUgPSB1ZGZfaWdldChzYiwgJmFkZHIpOwotCi0JaWYgKG1kYXRhLT5zX21pcnJvcl9mZSA9PSBOVUxMKSB7Ci0JCWlmIChmZV9lcnJvcikgewotCQkJdWRmX2Vycm9yKHNiLCBfX2Z1bmNfXywgIm1pcnJvciBpbm9kZSBlZmUgbm90IGZvdW5kICIKLQkJCSJhbmQgbWV0YWRhdGEgaW5vZGUgaXMgbWlzc2luZyB0b28sIGV4aXRpbmcuLi4iKTsKKwkJaWYgKG1kYXRhLT5zX21pcnJvcl9mZSA9PSBOVUxMKSB7CisJCQl1ZGZfZXJyKHNiLCAiQm90aCBtZXRhZGF0YSBhbmQgbWlycm9yIG1ldGFkYXRhIGlub2RlIGVmZSBjYW4gbm90IGZvdW5kXG4iKTsKIAkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfSBlbHNlCi0JCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJtaXJyb3IgaW5vZGUgZWZlIG5vdCBmb3VuZCwiCi0JCQkJCSIgYnV0IG1ldGFkYXRhIGlub2RlIGlzIE9LIik7Ci0JfSBlbHNlIGlmIChVREZfSShtZGF0YS0+c19taXJyb3JfZmUpLT5pX2FsbG9jX3R5cGUgIT0KLQkJIElDQlRBR19GTEFHX0FEX1NIT1JUKSB7Ci0JCXVkZl93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIm1pcnJvciBpbm9kZSBlZmUgZG9lcyBub3QgaGF2ZSAiCi0JCQkic2hvcnQgYWxsb2NhdGlvbiBkZXNjcmlwdG9ycyEiKTsKLQkJaXB1dChtZGF0YS0+c19taXJyb3JfZmUpOwotCQltZGF0YS0+c19taXJyb3JfZmUgPSBOVUxMOwotCQlpZiAoZmVfZXJyb3IpCi0JCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KIAl9CiAKIAkvKgpAQCAtOTA3LDE4ICs4ODksMTUgQEAKIAkJYWRkci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBtYXAtPnNfcGFydGl0aW9uX251bTsKIAogCQl1ZGZfZGVidWcoIkJpdG1hcCBmaWxlIGxvY2F0aW9uOiBibG9jayA9ICVkIHBhcnQgPSAlZFxuIiwKLQkJCWFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCQkgIGFkZHIubG9naWNhbEJsb2NrTnVtLCBhZGRyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CiAKIAkJbWRhdGEtPnNfYml0bWFwX2ZlID0gdWRmX2lnZXQoc2IsICZhZGRyKTsKIAogCQlpZiAobWRhdGEtPnNfYml0bWFwX2ZlID09IE5VTEwpIHsKIAkJCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKLQkJCQl1ZGZfd2FybmluZyhzYiwgX19mdW5jX18sICJiaXRtYXAgaW5vZGUgZWZlICIKLQkJCQkJIm5vdCBmb3VuZCBidXQgaXQncyBvayBzaW5jZSB0aGUgZGlzYyIKLQkJCQkJIiBpcyBtb3VudGVkIHJlYWQtb25seSIpOworCQkJCXVkZl93YXJuKHNiLCAiYml0bWFwIGlub2RlIGVmZSBub3QgZm91bmQgYnV0IGl0J3Mgb2sgc2luY2UgdGhlIGRpc2MgaXMgbW91bnRlZCByZWFkLW9ubHlcbiIpOwogCQkJZWxzZSB7Ci0JCQkJdWRmX2Vycm9yKHNiLCBfX2Z1bmNfXywgImJpdG1hcCBpbm9kZSBlZmUgbm90ICIKLQkJCQkJImZvdW5kIGFuZCBhdHRlbXB0ZWQgcmVhZC13cml0ZSBtb3VudCIpOworCQkJCXVkZl9lcnIoc2IsICJiaXRtYXAgaW5vZGUgZWZlIG5vdCBmb3VuZCBhbmQgYXR0ZW1wdGVkIHJlYWQtd3JpdGUgbW91bnRcbiIpOwogCQkJCWdvdG8gZXJyb3JfZXhpdDsKIAkJCX0KIAkJfQpAQCAtOTcxLDkgKzk1MCw4IEBACiAJCWJpdG1hcCA9IHZ6YWxsb2Moc2l6ZSk7IC8qIFRPRE86IGdldCByaWQgb2YgdnphbGxvYyAqLwogCiAJaWYgKGJpdG1hcCA9PSBOVUxMKSB7Ci0JCXVkZl9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICJVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGJpdG1hcCAiCi0JCQkgICJhbmQgJWQgYnVmZmVyX2hlYWQgcG9pbnRlcnMiLCBucl9ncm91cHMpOworCQl1ZGZfZXJyKHNiLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgYW5kICVkIGJ1ZmZlcl9oZWFkIHBvaW50ZXJzXG4iLAorCQkJbnJfZ3JvdXBzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMDAzLDEwICs5ODEsOSBAQAogCWlmIChwLT5hY2Nlc3NUeXBlID09IGNwdV90b19sZTMyKFBEX0FDQ0VTU19UWVBFX09WRVJXUklUQUJMRSkpCiAJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0gVURGX1BBUlRfRkxBR19PVkVSV1JJVEFCTEU7CiAKLQl1ZGZfZGVidWcoIlBhcnRpdGlvbiAoJWQgdHlwZSAleCkgc3RhcnRzIGF0IHBoeXNpY2FsICVkLCAiCi0JCSAgImJsb2NrIGxlbmd0aCAlZFxuIiwgcF9pbmRleCwKLQkJICBtYXAtPnNfcGFydGl0aW9uX3R5cGUsIG1hcC0+c19wYXJ0aXRpb25fcm9vdCwKLQkJICBtYXAtPnNfcGFydGl0aW9uX2xlbik7CisJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkIHR5cGUgJXgpIHN0YXJ0cyBhdCBwaHlzaWNhbCAlZCwgYmxvY2sgbGVuZ3RoICVkXG4iLAorCQkgIHBfaW5kZXgsIG1hcC0+c19wYXJ0aXRpb25fdHlwZSwKKwkJICBtYXAtPnNfcGFydGl0aW9uX3Jvb3QsIG1hcC0+c19wYXJ0aXRpb25fbGVuKTsKIAogCWlmIChzdHJjbXAocC0+cGFydGl0aW9uQ29udGVudHMuaWRlbnQsIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMikgJiYKIAkgICAgc3RyY21wKHAtPnBhcnRpdGlvbkNvbnRlbnRzLmlkZW50LCBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDMpKQpAQCAtMTAyMywxMiArMTAwMCwxMiBAQAogCQltYXAtPnNfdXNwYWNlLnNfdGFibGUgPSB1ZGZfaWdldChzYiwgJmxvYyk7CiAJCWlmICghbWFwLT5zX3VzcGFjZS5zX3RhYmxlKSB7CiAJCQl1ZGZfZGVidWcoImNhbm5vdCBsb2FkIHVuYWxsb2NTcGFjZVRhYmxlIChwYXJ0ICVkKVxuIiwKLQkJCQkJcF9pbmRleCk7CisJCQkJICBwX2luZGV4KTsKIAkJCXJldHVybiAxOwogCQl9CiAJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0gVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFOwogCQl1ZGZfZGVidWcoInVuYWxsb2NTcGFjZVRhYmxlIChwYXJ0ICVkKSBAICVsZFxuIiwKLQkJCQlwX2luZGV4LCBtYXAtPnNfdXNwYWNlLnNfdGFibGUtPmlfaW5vKTsKKwkJCSAgcF9pbmRleCwgbWFwLT5zX3VzcGFjZS5zX3RhYmxlLT5pX2lubyk7CiAJfQogCiAJaWYgKHBoZC0+dW5hbGxvY1NwYWNlQml0bWFwLmV4dExlbmd0aCkgewpAQCAtMTA0MSw4ICsxMDE4LDggQEAKIAkJYml0bWFwLT5zX2V4dFBvc2l0aW9uID0gbGUzMl90b19jcHUoCiAJCQkJcGhkLT51bmFsbG9jU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOwogCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVA7Ci0JCXVkZl9kZWJ1ZygidW5hbGxvY1NwYWNlQml0bWFwIChwYXJ0ICVkKSBAICVkXG4iLCBwX2luZGV4LAotCQkJCQkJYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKKwkJdWRmX2RlYnVnKCJ1bmFsbG9jU3BhY2VCaXRtYXAgKHBhcnQgJWQpIEAgJWRcbiIsCisJCQkgIHBfaW5kZXgsIGJpdG1hcC0+c19leHRQb3NpdGlvbik7CiAJfQogCiAJaWYgKHBoZC0+cGFydGl0aW9uSW50ZWdyaXR5VGFibGUuZXh0TGVuZ3RoKQpAQCAtMTA1OCwxMyArMTAzNSwxMyBAQAogCQltYXAtPnNfZnNwYWNlLnNfdGFibGUgPSB1ZGZfaWdldChzYiwgJmxvYyk7CiAJCWlmICghbWFwLT5zX2ZzcGFjZS5zX3RhYmxlKSB7CiAJCQl1ZGZfZGVidWcoImNhbm5vdCBsb2FkIGZyZWVkU3BhY2VUYWJsZSAocGFydCAlZClcbiIsCi0JCQkJcF9pbmRleCk7CisJCQkJICBwX2luZGV4KTsKIAkJCXJldHVybiAxOwogCQl9CiAKIAkJbWFwLT5zX3BhcnRpdGlvbl9mbGFncyB8PSBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFOwogCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VUYWJsZSAocGFydCAlZCkgQCAlbGRcbiIsCi0JCQkJcF9pbmRleCwgbWFwLT5zX2ZzcGFjZS5zX3RhYmxlLT5pX2lubyk7CisJCQkgIHBfaW5kZXgsIG1hcC0+c19mc3BhY2Uuc190YWJsZS0+aV9pbm8pOwogCX0KIAogCWlmIChwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKSB7CkBAIC0xMDc3LDggKzEwNTQsOCBAQAogCQliaXRtYXAtPnNfZXh0UG9zaXRpb24gPSBsZTMyX3RvX2NwdSgKIAkJCQlwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOwogCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9IFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQOwotCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VCaXRtYXAgKHBhcnQgJWQpIEAgJWRcbiIsIHBfaW5kZXgsCi0JCQkJCWJpdG1hcC0+c19leHRQb3NpdGlvbik7CisJCXVkZl9kZWJ1ZygiZnJlZWRTcGFjZUJpdG1hcCAocGFydCAlZCkgQCAlZFxuIiwKKwkJCSAgcF9pbmRleCwgYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTE4LDExICsxMDk1LDkgQEAKIAl1ZGZfZmluZF92YXRfYmxvY2soc2IsIHBfaW5kZXgsIHR5cGUxX2luZGV4LCBzYmktPnNfbGFzdF9ibG9jayk7CiAJaWYgKCFzYmktPnNfdmF0X2lub2RlICYmCiAJICAgIHNiaS0+c19sYXN0X2Jsb2NrICE9IGJsb2NrcyAtIDEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJVREYtZnM6IEZhaWxlZCB0byByZWFkIFZBVCBpbm9kZSBmcm9tIHRoZSIKLQkJICAgICAgICIgbGFzdCByZWNvcmRlZCBibG9jayAoJWx1KSwgcmV0cnlpbmcgd2l0aCB0aGUgbGFzdCAiCi0JCSAgICAgICAiYmxvY2sgb2YgdGhlIGRldmljZSAoJWx1KS5cbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZylzYmktPnNfbGFzdF9ibG9jaywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKWJsb2NrcyAtIDEpOworCQlwcl9ub3RpY2UoIkZhaWxlZCB0byByZWFkIFZBVCBpbm9kZSBmcm9tIHRoZSBsYXN0IHJlY29yZGVkIGJsb2NrICglbHUpLCByZXRyeWluZyB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBkZXZpY2UgKCVsdSkuXG4iLAorCQkJICAodW5zaWduZWQgbG9uZylzYmktPnNfbGFzdF9ibG9jaywKKwkJCSAgKHVuc2lnbmVkIGxvbmcpYmxvY2tzIC0gMSk7CiAJCXVkZl9maW5kX3ZhdF9ibG9jayhzYiwgcF9pbmRleCwgdHlwZTFfaW5kZXgsIGJsb2NrcyAtIDEpOwogCX0KIAlpZiAoIXNiaS0+c192YXRfaW5vZGUpCkBAIC0xMjIwLDggKzExOTUsOCBAQAogCWlmIChtYXAtPnNfcGFydGl0aW9uX3R5cGUgPT0gVURGX01FVEFEQVRBX01BUDI1KSB7CiAJCXJldCA9IHVkZl9sb2FkX21ldGFkYXRhX2ZpbGVzKHNiLCBpKTsKIAkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVREYtZnM6IGVycm9yIGxvYWRpbmcgTWV0YURhdGEgIgotCQkJInBhcnRpdGlvbiBtYXAgJWRcbiIsIGkpOworCQkJdWRmX2VycihzYiwgImVycm9yIGxvYWRpbmcgTWV0YURhdGEgcGFydGl0aW9uIG1hcCAlZFxuIiwKKwkJCQlpKTsKIAkJCWdvdG8gb3V0X2JoOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEyMzQsOSArMTIwOSw3IEBACiAJCSAqIG92ZXJ3cml0ZSBibG9ja3MgaW5zdGVhZCBvZiByZWxvY2F0aW5nIHRoZW0pLgogCQkgKi8KIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVERi1mczogRmlsZXN5c3RlbSBtYXJrZWQgcmVhZC1vbmx5ICIKLQkJCSJiZWNhdXNlIHdyaXRpbmcgdG8gcHNldWRvb3ZlcndyaXRlIHBhcnRpdGlvbiBpcyAiCi0JCQkibm90IGltcGxlbWVudGVkLlxuIik7CisJCXByX25vdGljZSgiRmlsZXN5c3RlbSBtYXJrZWQgcmVhZC1vbmx5IGJlY2F1c2Ugd3JpdGluZyB0byBwc2V1ZG9vdmVyd3JpdGUgcGFydGl0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJfQogb3V0X2JoOgogCS8qIEluIGNhc2UgbG9hZGluZyBmYWlsZWQsIHdlIGhhbmRsZSBjbGVhbnVwIGluIHVkZl9maWxsX3N1cGVyICovCkBAIC0xMzQ0LDkgKzEzMTcsOCBAQAogCQkJCXN0cnVjdCBtZXRhZGF0YVBhcnRpdGlvbk1hcCAqbWRtID0KIAkJCQkJCShzdHJ1Y3QgbWV0YWRhdGFQYXJ0aXRpb25NYXAgKikKIAkJCQkJCSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pOwotCQkJCXVkZl9kZWJ1ZygiUGFyc2luZyBMb2dpY2FsIHZvbCBwYXJ0ICVkICIKLQkJCQkJInR5cGUgJWQgIGlkPSVzXG4iLCBpLCB0eXBlLAotCQkJCQlVREZfSURfTUVUQURBVEEpOworCQkJCXVkZl9kZWJ1ZygiUGFyc2luZyBMb2dpY2FsIHZvbCBwYXJ0ICVkIHR5cGUgJWQgIGlkPSVzXG4iLAorCQkJCQkgIGksIHR5cGUsIFVERl9JRF9NRVRBREFUQSk7CiAKIAkJCQltYXAtPnNfcGFydGl0aW9uX3R5cGUgPSBVREZfTUVUQURBVEFfTUFQMjU7CiAJCQkJbWFwLT5zX3BhcnRpdGlvbl9mdW5jID0gdWRmX2dldF9wYmxvY2tfbWV0YTI1OwpAQCAtMTM2MSwyNSArMTMzMywyNCBAQAogCQkJCQlsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpOwogCQkJCW1kYXRhLT5zX2FsaWduX3VuaXRfc2l6ZSA9CiAJCQkJCWxlMTZfdG9fY3B1KG1kbS0+YWxpZ25Vbml0U2l6ZSk7Ci0JCQkJbWRhdGEtPnNfZHVwX21kX2ZsYWcgCSA9Ci0JCQkJCW1kbS0+ZmxhZ3MgJiAweDAxOworCQkJCWlmIChtZG0tPmZsYWdzICYgMHgwMSkKKwkJCQkJbWRhdGEtPnNfZmxhZ3MgfD0gTUZfRFVQTElDQVRFX01EOwogCiAJCQkJdWRmX2RlYnVnKCJNZXRhZGF0YSBJZGVudCBzdWZmaXg9MHgleFxuIiwKLQkJCQkJKGxlMTZfdG9fY3B1KAotCQkJCQkgKChfX2xlMTYgKikKLQkJCQkJICAgICAgbWRtLT5wYXJ0SWRlbnQuaWRlbnRTdWZmaXgpWzBdKSkpOworCQkJCQkgIGxlMTZfdG9fY3B1KCooX19sZTE2ICopCisJCQkJCQkgICAgICBtZG0tPnBhcnRJZGVudC5pZGVudFN1ZmZpeCkpOwogCQkJCXVkZl9kZWJ1ZygiTWV0YWRhdGEgcGFydCBudW09JWRcbiIsCi0JCQkJCWxlMTZfdG9fY3B1KG1kbS0+cGFydGl0aW9uTnVtKSk7CisJCQkJCSAgbGUxNl90b19jcHUobWRtLT5wYXJ0aXRpb25OdW0pKTsKIAkJCQl1ZGZfZGVidWcoIk1ldGFkYXRhIHBhcnQgYWxsb2MgdW5pdCBzaXplPSVkXG4iLAotCQkJCQlsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpKTsKKwkJCQkJICBsZTMyX3RvX2NwdShtZG0tPmFsbG9jVW5pdFNpemUpKTsKIAkJCQl1ZGZfZGVidWcoIk1ldGFkYXRhIGZpbGUgbG9jPSVkXG4iLAotCQkJCQlsZTMyX3RvX2NwdShtZG0tPm1ldGFkYXRhRmlsZUxvYykpOworCQkJCQkgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFGaWxlTG9jKSk7CiAJCQkJdWRmX2RlYnVnKCJNaXJyb3IgZmlsZSBsb2M9JWRcbiIsCi0JCQkJICAgICAgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFNaXJyb3JGaWxlTG9jKSk7CisJCQkJCSAgbGUzMl90b19jcHUobWRtLT5tZXRhZGF0YU1pcnJvckZpbGVMb2MpKTsKIAkJCQl1ZGZfZGVidWcoIkJpdG1hcCBmaWxlIGxvYz0lZFxuIiwKLQkJCQkgICAgICAgbGUzMl90b19jcHUobWRtLT5tZXRhZGF0YUJpdG1hcEZpbGVMb2MpKTsKLQkJCQl1ZGZfZGVidWcoIkR1cGxpY2F0ZSBGbGFnOiAlZCAlZFxuIiwKLQkJCQkJbWRhdGEtPnNfZHVwX21kX2ZsYWcsIG1kbS0+ZmxhZ3MpOworCQkJCQkgIGxlMzJfdG9fY3B1KG1kbS0+bWV0YWRhdGFCaXRtYXBGaWxlTG9jKSk7CisJCQkJdWRmX2RlYnVnKCJGbGFnczogJWQgJWRcbiIsCisJCQkJCSAgbWRhdGEtPnNfZmxhZ3MsIG1kbS0+ZmxhZ3MpOwogCQkJfSBlbHNlIHsKIAkJCQl1ZGZfZGVidWcoIlVua25vd24gaWRlbnQ6ICVzXG4iLAogCQkJCQkgIHVwbTItPnBhcnRJZGVudC5pZGVudCk7CkBAIC0xMzg5LDE2ICsxMzYwLDE1IEBACiAJCQltYXAtPnNfcGFydGl0aW9uX251bSA9IGxlMTZfdG9fY3B1KHVwbTItPnBhcnRpdGlvbk51bSk7CiAJCX0KIAkJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkOiVkKSB0eXBlICVkIG9uIHZvbHVtZSAlZFxuIiwKLQkJCSAgaSwgbWFwLT5zX3BhcnRpdGlvbl9udW0sIHR5cGUsCi0JCQkgIG1hcC0+c192b2x1bWVzZXFudW0pOworCQkJICBpLCBtYXAtPnNfcGFydGl0aW9uX251bSwgdHlwZSwgbWFwLT5zX3ZvbHVtZXNlcW51bSk7CiAJfQogCiAJaWYgKGZpbGVzZXQpIHsKIAkJc3RydWN0IGxvbmdfYWQgKmxhID0gKHN0cnVjdCBsb25nX2FkICopJihsdmQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZVswXSk7CiAKIAkJKmZpbGVzZXQgPSBsZWxiX3RvX2NwdShsYS0+ZXh0TG9jYXRpb24pOwotCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsICIKLQkJCSAgInBhcnRpdGlvbj0lZFxuIiwgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAorCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKKwkJCSAgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAogCQkJICBmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOwogCX0KIAlpZiAobHZkLT5pbnRlZ3JpdHlTZXFFeHQuZXh0TGVuZ3RoKQpAQCAtMTQ3OCw5ICsxNDQ4LDkgQEAKIAogCQliaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwgYmxvY2ssIGJsb2NrLCAmaWRlbnQpOwogCQlpZiAoIWJoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInVkZjogQmxvY2sgJUx1IG9mIHZvbHVtZSBkZXNjcmlwdG9yICIKLQkJCSAgICAgICAic2VxdWVuY2UgaXMgY29ycnVwdGVkIG9yIHdlIGNvdWxkIG5vdCByZWFkICIKLQkJCSAgICAgICAiaXQuXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrKTsKKwkJCXVkZl9lcnIoc2IsCisJCQkJIkJsb2NrICVsbHUgb2Ygdm9sdW1lIGRlc2NyaXB0b3Igc2VxdWVuY2UgaXMgY29ycnVwdGVkIG9yIHdlIGNvdWxkIG5vdCByZWFkIGl0XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2spOwogCQkJcmV0dXJuIDE7CiAJCX0KIApAQCAtMTU1Myw3ICsxNTIzLDcgQEAKIAkgKiBpbiBhIHN1aXRhYmxlIG9yZGVyCiAJICovCiAJaWYgKCF2ZHNbVkRTX1BPU19QUklNQVJZX1ZPTF9ERVNDXS5ibG9jaykgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogUHJpbWFyeSBWb2x1bWUgRGVzY3JpcHRvciBub3QgZm91bmQhXG4iKTsKKwkJdWRmX2VycihzYiwgIlByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3Igbm90IGZvdW5kIVxuIik7CiAJCXJldHVybiAxOwogCX0KIAlpZiAodWRmX2xvYWRfcHZvbGRlc2Moc2IsIHZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLmJsb2NrKSkKQEAgLTE3NDAsNyArMTcxMCw3IEBACiAKIAlpZiAoIXNiX3NldF9ibG9ja3NpemUoc2IsIHVvcHQtPmJsb2Nrc2l6ZSkpIHsKIAkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IEJhZCBibG9jayBzaXplXG4iKTsKKwkJCXVkZl93YXJuKHNiLCAiQmFkIGJsb2NrIHNpemVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJc2JpLT5zX2xhc3RfYmxvY2sgPSB1b3B0LT5sYXN0YmxvY2s7CkBAIC0xNzQ5LDEyICsxNzE5LDExIEBACiAJCW5zcl9vZmYgPSB1ZGZfY2hlY2tfdnNkKHNiKTsKIAkJaWYgKCFuc3Jfb2ZmKSB7CiAJCQlpZiAoIXNpbGVudCkKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIFZSUyBmb3VuZFxuIik7CisJCQkJdWRmX3dhcm4oc2IsICJObyBWUlMgZm91bmRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKG5zcl9vZmYgPT0gLTEpCi0JCQl1ZGZfZGVidWcoIkZhaWxlZCB0byByZWFkIGJ5dGUgMzI3NjguIEFzc3VtaW5nIG9wZW4gIgotCQkJCSAgImRpc2MuIFNraXBwaW5nIHZhbGlkaXR5IGNoZWNrXG4iKTsKKwkJCXVkZl9kZWJ1ZygiRmFpbGVkIHRvIHJlYWQgYnl0ZSAzMjc2OC4gQXNzdW1pbmcgb3BlbiBkaXNjLiBTa2lwcGluZyB2YWxpZGl0eSBjaGVja1xuIik7CiAJCWlmICghc2JpLT5zX2xhc3RfYmxvY2spCiAJCQlzYmktPnNfbGFzdF9ibG9jayA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CiAJfSBlbHNlIHsKQEAgLTE3NjUsNyArMTczNCw3IEBACiAJc2JpLT5zX2FuY2hvciA9IHVvcHQtPmFuY2hvcjsKIAlpZiAoIXVkZl9maW5kX2FuY2hvcihzYiwgZmlsZXNldCkpIHsKIAkJaWYgKCFzaWxlbnQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIGFuY2hvciBmb3VuZFxuIik7CisJCQl1ZGZfd2FybihzYiwgIk5vIGFuY2hvciBmb3VuZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAgLTE5MzcsOCArMTkwNiw3IEBACiAKIAlpZiAodW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX1VURjgpICYmCiAJICAgIHVvcHQuZmxhZ3MgJiAoMSA8PCBVREZfRkxBR19OTFNfTUFQKSkgewotCQl1ZGZfZXJyb3Ioc2IsICJ1ZGZfcmVhZF9zdXBlciIsCi0JCQkgICJ1dGY4IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGlvY2hhcnNldFxuIik7CisJCXVkZl9lcnIoc2IsICJ1dGY4IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGlvY2hhcnNldFxuIik7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KICNpZmRlZiBDT05GSUdfVURGX05MUwpAQCAtMTk4NywxNSArMTk1NSwxNCBAQAogCQlyZXQgPSB1ZGZfbG9hZF92cnMoc2IsICZ1b3B0LCBzaWxlbnQsICZmaWxlc2V0KTsKIAkJaWYgKCFyZXQgJiYgdW9wdC5ibG9ja3NpemUgIT0gVURGX0RFRkFVTFRfQkxPQ0tTSVpFKSB7CiAJCQlpZiAoIXNpbGVudCkKLQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCQkgICAgICAgIlVERi1mczogUmVzY2FubmluZyB3aXRoIGJsb2Nrc2l6ZSAiCi0JCQkJICAgICAgICIlZFxuIiwgVURGX0RFRkFVTFRfQkxPQ0tTSVpFKTsKKwkJCQlwcl9ub3RpY2UoIlJlc2Nhbm5pbmcgd2l0aCBibG9ja3NpemUgJWRcbiIsCisJCQkJCSAgVURGX0RFRkFVTFRfQkxPQ0tTSVpFKTsKIAkJCXVvcHQuYmxvY2tzaXplID0gVURGX0RFRkFVTFRfQkxPQ0tTSVpFOwogCQkJcmV0ID0gdWRmX2xvYWRfdnJzKHNiLCAmdW9wdCwgc2lsZW50LCAmZmlsZXNldCk7CiAJCX0KIAl9CiAJaWYgKCFyZXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzOiBObyBwYXJ0aXRpb24gZm91bmQgKDEpXG4iKTsKKwkJdWRmX3dhcm4oc2IsICJObyBwYXJ0aXRpb24gZm91bmQgKDEpXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCkBAIC0yMDEwLDEwICsxOTc3LDkgQEAKIAkJCQlsZTE2X3RvX2NwdShsdmlkaXUtPm1heFVERldyaXRlUmV2KTsgKi8KIAogCQlpZiAobWluVURGUmVhZFJldiA+IFVERl9NQVhfUkVBRF9WRVJTSU9OKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlVERi1mczogbWluVURGUmVhZFJldj0leCAiCi0JCQkJCSIobWF4IGlzICV4KVxuIiwKLQkJCSAgICAgICBsZTE2X3RvX2NwdShsdmlkaXUtPm1pblVERlJlYWRSZXYpLAotCQkJICAgICAgIFVERl9NQVhfUkVBRF9WRVJTSU9OKTsKKwkJCXVkZl9lcnIoc2IsICJtaW5VREZSZWFkUmV2PSV4IChtYXggaXMgJXgpXG4iLAorCQkJCWxlMTZfdG9fY3B1KGx2aWRpdS0+bWluVURGUmVhZFJldiksCisJCQkJVURGX01BWF9SRUFEX1ZFUlNJT04pOwogCQkJZ290byBlcnJvcl9vdXQ7CiAJCX0gZWxzZSBpZiAobWluVURGV3JpdGVSZXYgPiBVREZfTUFYX1dSSVRFX1ZFUlNJT04pCiAJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CkBAIC0yMDI3LDI4ICsxOTkzLDI3IEBACiAJfQogCiAJaWYgKCFzYmktPnNfcGFydGl0aW9ucykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVREYtZnM6IE5vIHBhcnRpdGlvbiBmb3VuZCAoMilcbiIpOworCQl1ZGZfd2FybihzYiwgIk5vIHBhcnRpdGlvbiBmb3VuZCAoMilcbiIpOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKIAlpZiAoc2JpLT5zX3BhcnRtYXBzW3NiaS0+c19wYXJ0aXRpb25dLnNfcGFydGl0aW9uX2ZsYWdzICYKIAkJCVVERl9QQVJUX0ZMQUdfUkVBRF9PTkxZKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiVURGLWZzOiBQYXJ0aXRpb24gbWFya2VkIHJlYWRvbmx5OyAiCi0JCQkJICAgImZvcmNpbmcgcmVhZG9ubHkgbW91bnRcbiIpOworCQlwcl9ub3RpY2UoIlBhcnRpdGlvbiBtYXJrZWQgcmVhZG9ubHk7IGZvcmNpbmcgcmVhZG9ubHkgbW91bnRcbiIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJfQogCiAJaWYgKHVkZl9maW5kX2ZpbGVzZXQoc2IsICZmaWxlc2V0LCAmcm9vdGRpcikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzOiBObyBmaWxlc2V0IGZvdW5kXG4iKTsKKwkJdWRmX3dhcm4oc2IsICJObyBmaWxlc2V0IGZvdW5kXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJaWYgKCFzaWxlbnQpIHsKIAkJc3RydWN0IHRpbWVzdGFtcCB0czsKIAkJdWRmX3RpbWVfdG9fZGlza19zdGFtcCgmdHMsIHNiaS0+c19yZWNvcmRfdGltZSk7Ci0JCXVkZl9pbmZvKCJVREY6IE1vdW50aW5nIHZvbHVtZSAnJXMnLCAiCi0JCQkgInRpbWVzdGFtcCAlMDR1LyUwMnUvJTAydSAlMDJ1OiUwMnUgKCV4KVxuIiwKLQkJCSBzYmktPnNfdm9sdW1lX2lkZW50LCBsZTE2X3RvX2NwdSh0cy55ZWFyKSwgdHMubW9udGgsIHRzLmRheSwKKwkJdWRmX2luZm8oIk1vdW50aW5nIHZvbHVtZSAnJXMnLCB0aW1lc3RhbXAgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCisJCQkgc2JpLT5zX3ZvbHVtZV9pZGVudCwKKwkJCSBsZTE2X3RvX2NwdSh0cy55ZWFyKSwgdHMubW9udGgsIHRzLmRheSwKIAkJCSB0cy5ob3VyLCB0cy5taW51dGUsIGxlMTZfdG9fY3B1KHRzLnR5cGVBbmRUaW1lem9uZSkpOwogCX0KIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCkBAIC0yMDU5LDggKzIwMjQsNyBAQAogCS8qIHBlcmhhcHMgaXQncyBub3QgZXh0ZW5zaWJsZSBlbm91Z2gsIGJ1dCBmb3Igbm93IC4uLiAqLwogCWlub2RlID0gdWRmX2lnZXQoc2IsICZyb290ZGlyKTsKIAlpZiAoIWlub2RlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVURGLWZzOiBFcnJvciBpbiB1ZGZfaWdldCwgYmxvY2s9JWQsICIKLQkJCQkicGFydGl0aW9uPSVkXG4iLAorCQl1ZGZfZXJyKHNiLCAiRXJyb3IgaW4gdWRmX2lnZXQsIGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCiAJCSAgICAgICByb290ZGlyLmxvZ2ljYWxCbG9ja051bSwgcm9vdGRpci5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOwogCQlnb3RvIGVycm9yX291dDsKIAl9CkBAIC0yMDY4LDcgKzIwMzIsNyBAQAogCS8qIEFsbG9jYXRlIGEgZGVudHJ5IGZvciB0aGUgcm9vdCBpbm9kZSAqLwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghc2ItPnNfcm9vdCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVERi1mczogQ291bGRuJ3QgYWxsb2NhdGUgcm9vdCBkZW50cnlcbiIpOworCQl1ZGZfZXJyKHNiLCAiQ291bGRuJ3QgYWxsb2NhdGUgcm9vdCBkZW50cnlcbiIpOwogCQlpcHV0KGlub2RlKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQpAQCAtMjA5NiwzMiArMjA2MCw0MCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgdm9pZCB1ZGZfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQordm9pZCBfdWRmX2VycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKLQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLQkJLyogbWFyayBzYiBlcnJvciAqLworCS8qIG1hcmsgc2IgZXJyb3IgKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCiAJCXNiLT5zX2RpcnQgPSAxOwotCX0KKwogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJfZXJyKCJlcnJvciAoZGV2aWNlICVzKTogJXM6ICVwViIsIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiVURGLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCi0JCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKIH0KIAotdm9pZCB1ZGZfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQordm9pZCBfdWRmX3dhcm4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJfd2Fybigid2FybmluZyAoZGV2aWNlICVzKTogJXM6ICVwViIsIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOwogfQogCiBzdGF0aWMgdm9pZCB1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC0yMjEzLDExICsyMTg1LDExIEBACiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKHNiLCAmbG9jLCAwLCAmaWRlbnQpOwogCiAJaWYgKCFiaCkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2NvdW50X2ZyZWUgZmFpbGVkXG4iKTsKKwkJdWRmX2VycihzYiwgInVkZl9jb3VudF9mcmVlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoaWRlbnQgIT0gVEFHX0lERU5UX1NCRCkgewogCQlicmVsc2UoYmgpOwotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2NvdW50X2ZyZWUgZmFpbGVkXG4iKTsKKwkJdWRmX2VycihzYiwgInVkZl9jb3VudF9mcmVlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvdWRmL3RydW5jYXRlLmMgYi9mcy91ZGYvdHJ1bmNhdGUuYwppbmRleCA4NDI0MzA4Li40Yjk4ZmVlIDEwMDY0NAotLS0gYS9mcy91ZGYvdHJ1bmNhdGUuYworKysgYi9mcy91ZGYvdHJ1bmNhdGUuYwpAQCAtOTUsMjMgKzk1LDIxIEBACiAJCWxiY291bnQgKz0gZWxlbjsKIAkJaWYgKGxiY291bnQgPiBpbm9kZS0+aV9zaXplKSB7CiAJCQlpZiAobGJjb3VudCAtIGlub2RlLT5pX3NpemUgPj0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgInVkZl90cnVuY2F0ZV90YWlsX2V4dGVudCgpOiBUb28gbG9uZyAiCi0JCQkJICAgICAgICJleHRlbnQgYWZ0ZXIgRU9GIGluIGlub2RlICV1OiBpX3NpemU6ICIKLQkJCQkgICAgICAgIiVMZCBsYmNvdW50OiAlTGQgZXh0ZW50ICV1KyV1XG4iLAotCQkJCSAgICAgICAodW5zaWduZWQpaW5vZGUtPmlfaW5vLAotCQkJCSAgICAgICAobG9uZyBsb25nKWlub2RlLT5pX3NpemUsCi0JCQkJICAgICAgIChsb25nIGxvbmcpbGJjb3VudCwKLQkJCQkgICAgICAgKHVuc2lnbmVkKWVsb2MubG9naWNhbEJsb2NrTnVtLAotCQkJCSAgICAgICAodW5zaWduZWQpZWxlbik7CisJCQkJdWRmX3dhcm4oaW5vZGUtPmlfc2IsCisJCQkJCSAiVG9vIGxvbmcgZXh0ZW50IGFmdGVyIEVPRiBpbiBpbm9kZSAldTogaV9zaXplOiAlbGxkIGxiY291bnQ6ICVsbGQgZXh0ZW50ICV1KyV1XG4iLAorCQkJCQkgKHVuc2lnbmVkKWlub2RlLT5pX2lubywKKwkJCQkJIChsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZSwKKwkJCQkJIChsb25nIGxvbmcpbGJjb3VudCwKKwkJCQkJICh1bnNpZ25lZCllbG9jLmxvZ2ljYWxCbG9ja051bSwKKwkJCQkJICh1bnNpZ25lZCllbGVuKTsKIAkJCW5lbGVuID0gZWxlbiAtIChsYmNvdW50IC0gaW5vZGUtPmlfc2l6ZSk7CiAJCQllcG9zLm9mZnNldCAtPSBhZHNpemU7CiAJCQlleHRlbnRfdHJ1bmMoaW5vZGUsICZlcG9zLCAmZWxvYywgZXR5cGUsIGVsZW4sIG5lbGVuKTsKIAkJCWVwb3Mub2Zmc2V0ICs9IGFkc2l6ZTsKIAkJCWlmICh1ZGZfbmV4dF9hZXh0KGlub2RlLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSAhPSAtMSkKLQkJCQlwcmludGsoS0VSTl9FUlIgInVkZl90cnVuY2F0ZV90YWlsX2V4dGVudCgpOiAiCi0JCQkJICAgICAgICJFeHRlbnQgYWZ0ZXIgRU9GIGluIGlub2RlICV1LlxuIiwKLQkJCQkgICAgICAgKHVuc2lnbmVkKWlub2RlLT5pX2lubyk7CisJCQkJdWRmX2Vycihpbm9kZS0+aV9zYiwKKwkJCQkJIkV4dGVudCBhZnRlciBFT0YgaW4gaW5vZGUgJXVcbiIsCisJCQkJCSh1bnNpZ25lZClpbm9kZS0+aV9pbm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX3NiLmggYi9mcy91ZGYvdWRmX3NiLmgKaW5kZXggNDg1OGMxOS4uNTE0MmE4MiAxMDA2NDQKLS0tIGEvZnMvdWRmL3VkZl9zYi5oCisrKyBiL2ZzL3VkZi91ZGZfc2IuaApAQCAtNTQsMTMgKzU0LDE2IEBACiAKICNwcmFnbWEgcGFjaygxKSAvKiBYWFgoaGNoKTogV2h5PyAgVGhpcyBmaWxlIGp1c3QgZGVmaW5lcyBpbi1jb3JlIHN0cnVjdHVyZXMgKi8KIAorI2RlZmluZSBNRl9EVVBMSUNBVEVfTUQJCTB4MDEKKyNkZWZpbmUgTUZfTUlSUk9SX0ZFX0xPQURFRAkweDAyCisKIHN0cnVjdCB1ZGZfbWV0YV9kYXRhIHsKIAlfX3UzMglzX21ldGFfZmlsZV9sb2M7CiAJX191MzIJc19taXJyb3JfZmlsZV9sb2M7CiAJX191MzIJc19iaXRtYXBfZmlsZV9sb2M7CiAJX191MzIJc19hbGxvY191bml0X3NpemU7CiAJX191MTYJc19hbGlnbl91bml0X3NpemU7Ci0JX191OCAJc19kdXBfbWRfZmxhZzsKKwlpbnQJc19mbGFnczsKIAlzdHJ1Y3QgaW5vZGUgKnNfbWV0YWRhdGFfZmU7CiAJc3RydWN0IGlub2RlICpzX21pcnJvcl9mZTsKIAlzdHJ1Y3QgaW5vZGUgKnNfYml0bWFwX2ZlOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZmRlY2wuaCBiL2ZzL3VkZi91ZGZkZWNsLmgKaW5kZXggZGJkNTJkNGIuLmYzNGU2ZmMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZkZWNsLmgKKysrIGIvZnMvdWRmL3VkZmRlY2wuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19VREZfREVDTF9ICiAjZGVmaW5lIF9fVURGX0RFQ0xfSAogCisjZGVmaW5lIHByX2ZtdChmbXQpICJVREYtZnM6ICIgZm10CisKICNpbmNsdWRlICJlY21hXzE2Ny5oIgogI2luY2x1ZGUgIm9zdGFfdWRmLmgiCiAKQEAgLTE2LDIzICsxOCwzMCBAQAogI2RlZmluZSBVREZfUFJFQUxMT0NBVEUKICNkZWZpbmUgVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTCTgKIAorZXh0ZXJuIF9fcHJpbnRmKDMsIDQpIHZvaWQgX3VkZl9lcnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNkZWZpbmUgdWRmX2VycihzYiwgZm10LCAuLi4pCQkJCQlcCisJX3VkZl9lcnIoc2IsIF9fZnVuY19fLCBmbXQsICMjX19WQV9BUkdTX18pCisKK2V4dGVybiBfX3ByaW50ZigzLCA0KSB2b2lkIF91ZGZfd2FybihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQljb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSB1ZGZfd2FybihzYiwgZm10LCAuLi4pCQkJCQlcCisJX3VkZl93YXJuKHNiLCBfX2Z1bmNfXywgZm10LCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIHVkZl9pbmZvKGZtdCwgLi4uKQkJCQkJXAorCXByX2luZm8oIklORk8gIiBmbXQsICMjX19WQV9BUkdTX18pCisKICN1bmRlZiBVREZGU19ERUJVRwogCiAjaWZkZWYgVURGRlNfREVCVUcKLSNkZWZpbmUgdWRmX2RlYnVnKGYsIGEuLi4pIFwKLWRvIHsgXAotCXByaW50ayhLRVJOX0RFQlVHICJVREYtZnMgREVCVUcgJXM6JWQ6JXM6ICIsIFwKLQkJX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7IFwKLQlwcmludGsoZiwgIyNhKTsgXAotfSB3aGlsZSAoMCkKKyNkZWZpbmUgdWRmX2RlYnVnKGZtdCwgLi4uKQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiJXM6JWQ6JXM6ICIgZm10KSwJCVwKKwkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKICNlbHNlCi0jZGVmaW5lIHVkZl9kZWJ1ZyhmLCBhLi4uKSAvKiovCisjZGVmaW5lIHVkZl9kZWJ1ZyhmbXQsIC4uLikJCQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCiAKLSNkZWZpbmUgdWRmX2luZm8oZiwgYS4uLikgXAotCXByaW50ayhLRVJOX0lORk8gIlVERi1mcyBJTkZPICIgZiwgIyNhKTsKLQotCiAjZGVmaW5lIHVkZl9maXhlZF90b192YXJpYWJsZSh4KSAoICggKCAoeCkgPj4gNSApICogMzkgKSArICggKHgpICYgMHgwMDAwMDAxRiApICkKICNkZWZpbmUgdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKHgpICggKCAoICh4KSAvIDM5ICkgPDwgNSApICsgKCAoeCkgJSAzOSApICkKIApAQCAtMTEyLDggKzEyMSw2IEBACiAKIC8qIHN1cGVyLmMgKi8KIAotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQotZXh0ZXJuIHZvaWQgdWRmX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogc3RhdGljIGlubGluZSB2b2lkIHVkZl91cGRhdGVkX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gVURGX1NCKHNiKS0+c19sdmlkX2JoOwpAQCAtMTI2LDYgKzEzMyw4IEBACiAJVURGX1NCKHNiKS0+c19sdmlkX2RpcnR5ID0gMTsKIH0KIGV4dGVybiB1NjQgbHZpZF9nZXRfdW5pcXVlX2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RydWN0IGlub2RlICp1ZGZfZmluZF9tZXRhZGF0YV9pbm9kZV9lZmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJdTMyIG1ldGFfZmlsZV9sb2MsIHUzMiBwYXJ0aXRpb25fbnVtKTsKIAogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwKZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZ0aW1lLmMgYi9mcy91ZGYvdWRmdGltZS5jCmluZGV4IGI4YzgyOGMuLjFmMTE0ODMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZ0aW1lLmMKKysrIGIvZnMvdWRmL3VkZnRpbWUuYwpAQCAtMzQsOSArMzQsMTAgQEAKICAqIGh0dHA6Ly93d3cuYm91bGRlci5uaXN0Lmdvdi90aW1lZnJlcS9wdWJzL2J1bGxldGluL2xlYXBzZWNvbmQuaHRtCiAgKi8KIAorI2luY2x1ZGUgInVkZmRlY2wuaCIKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSAidWRmZGVjbC5oIgogCiAjZGVmaW5lIEVQT0NIX1lFQVIgMTk3MAogCmRpZmYgLS1naXQgYS9mcy91ZGYvdW5pY29kZS5jIGIvZnMvdWRmL3VuaWNvZGUuYwppbmRleCBkMDNhOTBiLi40NGI4MTVlIDEwMDY0NAotLS0gYS9mcy91ZGYvdW5pY29kZS5jCisrKyBiL2ZzL3VkZi91bmljb2RlLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCWNtcF9pZCA9IG9jdV9pLT51X2NtcElEOwogCWlmIChjbXBfaWQgIT0gOCAmJiBjbXBfaWQgIT0gMTYpIHsKIAkJbWVtc2V0KHV0Zl9vLCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVua25vd24gY29tcHJlc3Npb24gY29kZSAoJWQpIHN0cmk9JXNcbiIsCisJCXByX2VycigidW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwKIAkJICAgICAgIGNtcF9pZCwgb2N1X2ktPnVfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI0Miw3ICsyNDIsNyBAQAogCWlmICh1dGZfY250KSB7CiBlcnJvcl9vdXQ6CiAJCW9jdVsrK3VfbGVuXSA9ICc/JzsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVkZjogYmFkIFVURi04IGNoYXJhY3RlclxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdCgiYmFkIFVURi04IGNoYXJhY3RlclxuIikpOwogCX0KIAogCW9jdVtsZW5ndGggLSAxXSA9ICh1aW50OF90KXVfbGVuICsgMTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWNtcF9pZCA9IG9jdV9pLT51X2NtcElEOwogCWlmIChjbXBfaWQgIT0gOCAmJiBjbXBfaWQgIT0gMTYpIHsKIAkJbWVtc2V0KHV0Zl9vLCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVua25vd24gY29tcHJlc3Npb24gY29kZSAoJWQpIHN0cmk9JXNcbiIsCisJCXByX2VycigidW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwKIAkJICAgICAgIGNtcF9pZCwgb2N1X2ktPnVfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pYWxsb2MuYyBiL2ZzL3Vmcy9pYWxsb2MuYwppbmRleCAyZWFiZjA0Li43OGE0YzcwIDEwMDY0NAotLS0gYS9mcy91ZnMvaWFsbG9jLmMKKysrIGIvZnMvdWZzL2lhbGxvYy5jCkBAIC0zNDEsNyArMzQxLDcgQEAKIAogZmFpbF9yZW1vdmVfaW5vZGU6CiAJdW5sb2NrX3N1cGVyKHNiKTsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJY2xlYXJfbmxpbmsoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogCVVGU0QoIkVYSVQgKEZBSUxFRCk6IGVyciAlZFxuIiwgZXJyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCBiNGQ3OTFhLi44NzliMTM0IDEwMDY0NAotLS0gYS9mcy91ZnMvaW5vZGUuYworKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJICogQ29weSBkYXRhIHRvIHRoZSBpbi1jb3JlIGlub2RlLgogCSAqLwogCWlub2RlLT5pX21vZGUgPSBtb2RlID0gZnMxNl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfbW9kZSk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBmczE2X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBmczE2X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9ubGluaykpOwogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CiAJCXVmc19lcnJvciAoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJpbm9kZSAlbHUgaGFzIHplcm8gbmxpbmtcbiIsIGlub2RlLT5pX2lubyk7CiAJCXJldHVybiAtMTsKQEAgLTYzNyw3ICs2MzcsNyBAQAogCSAqIENvcHkgZGF0YSB0byB0aGUgaW4tY29yZSBpbm9kZS4KIAkgKi8KIAlpbm9kZS0+aV9tb2RlID0gbW9kZSA9IGZzMTZfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9tb2RlKTsKLQlpbm9kZS0+aV9ubGluayA9IGZzMTZfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9ubGluayk7CisJc2V0X25saW5rKGlub2RlLCBmczE2X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfbmxpbmspKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgewogCQl1ZnNfZXJyb3IgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiaW5vZGUgJWx1IGhhcyB6ZXJvIG5saW5rXG4iLCBpbm9kZS0+aV9pbm8pOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9mcy91ZnMvdWZzLmggYi9mcy91ZnMvdWZzLmgKaW5kZXggNWJlMjc1NS4uYzI2ZjJiY2UgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy91ZnMuaAorKysgYi9mcy91ZnMvdWZzLmgKQEAgLTExNyw5ICsxMTcsMTIgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVmc19kaXJfb3BlcmF0aW9uczsKIAogLyogc3VwZXIuYyAqLwotZXh0ZXJuIHZvaWQgdWZzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCB1ZnNfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCB1ZnNfcGFuaWMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgdWZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIHVmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgdWZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIAogLyogc3ltbGluay5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCmluZGV4IGJkZDljYjUuLmNlODRmZmQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWxsb2MuYworKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19BR0ZMLCBYRlNfQUdGTF9SRUYpOworCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0FHRkxfUkVGKTsKIAkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTM5LDcgKzIxMzksNyBAQAogCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCAqYnBwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KLQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19BR0YsIFhGU19BR0ZfUkVGKTsKKwl4ZnNfYnVmX3NldF9yZWYoKmJwcCwgWEZTX0FHRl9SRUYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FvcHMuYyBiL2ZzL3hmcy94ZnNfYW9wcy5jCmluZGV4IDhjMzdkZGUuLjU3NGQ0ZWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5jCkBAIC0zOCw0MCArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAotCi0vKgotICogUHJpbWUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBzaW5jZSBhZGRyZXNzIGlzIHVzZWQgYXMgdGhlIGtleS4KLSAqLwotI2RlZmluZSBOVlNZTkMJCTM3Ci0jZGVmaW5lIHRvX2lvZW5kX3dxKHYpCSgmeGZzX2lvZW5kX3dxWygodW5zaWduZWQgbG9uZyl2KSAlIE5WU1lOQ10pCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgeGZzX2lvZW5kX3dxW05WU1lOQ107Ci0KLXZvaWQgX19pbml0Ci14ZnNfaW9lbmRfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5WU1lOQzsgaSsrKQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ4ZnNfaW9lbmRfd3FbaV0pOwotfQotCi12b2lkCi14ZnNfaW9lbmRfd2FpdCgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxID0gdG9faW9lbmRfd3EoaXApOwotCi0Jd2FpdF9ldmVudCgqd3EsIChhdG9taWNfcmVhZCgmaXAtPmlfaW9jb3VudCkgPT0gMCkpOwotfQotCi1TVEFUSUMgdm9pZAoteGZzX2lvZW5kX3dha2UoCi0JeGZzX2lub2RlX3QJKmlwKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpcC0+aV9pb2NvdW50KSkKLQkJd2FrZV91cCh0b19pb2VuZF93cShpcCkpOwotfQotCiB2b2lkCiB4ZnNfY291bnRfcGFnZV9zdGF0ZSgKIAlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCkBAIC0xMTUsMjUgKzgxLDIwIEBACiAJeGZzX2lvZW5kX3QJCSppb2VuZCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqbmV4dDsKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlvZW5kLT5pb19pbm9kZSk7CiAKIAlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBuZXh0KSB7CiAJCW5leHQgPSBiaC0+Yl9wcml2YXRlOwogCQliaC0+Yl9lbmRfaW8oYmgsICFpb2VuZC0+aW9fZXJyb3IpOwogCX0KIAotCS8qCi0JICogVm9sdW1lIG1hbmFnZXJzIHN1cHBvcnRpbmcgbXVsdGlwbGUgcGF0aHMgY2FuIHNlbmQgYmFjayBFTk9ERVYKLQkgKiB3aGVuIHRoZSBmaW5hbCBwYXRoIGRpc2FwcGVhcnMuICBJbiB0aGlzIGNhc2UgY29udGludWluZyB0byBmaWxsCi0JICogdGhlIHBhZ2UgY2FjaGUgd2l0aCBkaXJ0eSBkYXRhIHdoaWNoIGNhbm5vdCBiZSB3cml0dGVuIG91dCBpcwotCSAqIGV2aWwsIHNvIHByZXZlbnQgdGhhdC4KLQkgKi8KLQlpZiAodW5saWtlbHkoaW9lbmQtPmlvX2Vycm9yID09IC1FTk9ERVYpKSB7Ci0JCXhmc19kb19mb3JjZV9zaHV0ZG93bihpcC0+aV9tb3VudCwgU0hVVERPV05fREVWSUNFX1JFUSwKLQkJCQkgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOworCWlmIChpb2VuZC0+aW9faW9jYikgeworCQlpZiAoaW9lbmQtPmlvX2lzYXN5bmMpIHsKKwkJCWFpb19jb21wbGV0ZShpb2VuZC0+aW9faW9jYiwgaW9lbmQtPmlvX2Vycm9yID8KKwkJCQkJaW9lbmQtPmlvX2Vycm9yIDogaW9lbmQtPmlvX3Jlc3VsdCwgMCk7CisJCX0KKwkJaW5vZGVfZGlvX2RvbmUoaW9lbmQtPmlvX2lub2RlKTsKIAl9CiAKLQl4ZnNfaW9lbmRfd2FrZShpcCk7CiAJbWVtcG9vbF9mcmVlKGlvZW5kLCB4ZnNfaW9lbmRfcG9vbCk7CiB9CiAKQEAgLTE1Niw2ICsxMTcsMTUgQEAKIH0KIAogLyoKKyAqIEZhc3QgYW5kIGxvb3NlIGNoZWNrIGlmIHRoaXMgd3JpdGUgY291bGQgdXBkYXRlIHRoZSBvbi1kaXNrIGlub2RlIHNpemUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZnNfaW9lbmRfaXNfYXBwZW5kKHN0cnVjdCB4ZnNfaW9lbmQgKmlvZW5kKQoreworCXJldHVybiBpb2VuZC0+aW9fb2Zmc2V0ICsgaW9lbmQtPmlvX3NpemUgPgorCQlYRlNfSShpb2VuZC0+aW9faW5vZGUpLT5pX2QuZGlfc2l6ZTsKK30KKworLyoKICAqIFVwZGF0ZSBvbi1kaXNrIGZpbGUgc2l6ZSBub3cgdGhhdCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8gZGlzay4gIFRoZQogICogY3VycmVudCBpbi1tZW1vcnkgZmlsZSBzaXplIGlzIGlfc2l6ZS4gIElmIGEgd3JpdGUgaXMgYmV5b25kIGVvZiBpX25ld19zaXplCiAgKiB3aWxsIGJlIHRoZSBpbnRlbmRlZCBmaWxlIHNpemUgdW50aWwgaV9zaXplIGlzIHVwZGF0ZWQuICBJZiB0aGlzIHdyaXRlIGRvZXMKQEAgLTE3Myw5ICsxNDMsNiBAQAogCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpb2VuZC0+aW9faW5vZGUpOwogCXhmc19mc2l6ZV90CQlpc2l6ZTsKIAotCWlmICh1bmxpa2VseShpb2VuZC0+aW9fZXJyb3IpKQotCQlyZXR1cm4gMDsKLQogCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpKQogCQlyZXR1cm4gRUFHQUlOOwogCkBAIC0xOTIsNiArMTU5LDkgQEAKIAogLyoKICAqIFNjaGVkdWxlIElPIGNvbXBsZXRpb24gaGFuZGxpbmcgb24gdGhlIGZpbmFsIHB1dCBvZiBhbiBpb2VuZC4KKyAqCisgKiBJZiB0aGVyZSBpcyBubyB3b3JrIHRvIGRvIHdlIG1pZ2h0IGFzIHdlbGwgY2FsbCBpdCBhIGRheSBhbmQgZnJlZSB0aGUKKyAqIGlvZW5kIHJpZ2h0IG5vdy4KICAqLwogU1RBVElDIHZvaWQKIHhmc19maW5pc2hfaW9lbmQoCkBAIC0yMDAsOCArMTcwLDEwIEBACiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvZW5kLT5pb19yZW1haW5pbmcpKSB7CiAJCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT19VTldSSVRURU4pCiAJCQlxdWV1ZV93b3JrKHhmc2NvbnZlcnRkX3dvcmtxdWV1ZSwgJmlvZW5kLT5pb193b3JrKTsKLQkJZWxzZQorCQllbHNlIGlmICh4ZnNfaW9lbmRfaXNfYXBwZW5kKGlvZW5kKSkKIAkJCXF1ZXVlX3dvcmsoeGZzZGF0YWRfd29ya3F1ZXVlLCAmaW9lbmQtPmlvX3dvcmspOworCQllbHNlCisJCQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiAJfQogfQogCkBAIC0yMTYsMTcgKzE4OCwyNCBAQAogCXN0cnVjdCB4ZnNfaW5vZGUgKmlwID0gWEZTX0koaW9lbmQtPmlvX2lub2RlKTsKIAlpbnQJCWVycm9yID0gMDsKIAorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQlpb2VuZC0+aW9fZXJyb3IgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChpb2VuZC0+aW9fZXJyb3IpCisJCWdvdG8gZG9uZTsKKwogCS8qCiAJICogRm9yIHVud3JpdHRlbiBleHRlbnRzIHdlIG5lZWQgdG8gaXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYQogCSAqIHJhbmdlIHRvIG5vcm1hbCB3cml0dGVuIGV4dGVucyBhZnRlciB0aGUgZGF0YSBJL08gaGFzIGZpbmlzaGVkLgogCSAqLwotCWlmIChpb2VuZC0+aW9fdHlwZSA9PSBJT19VTldSSVRURU4gJiYKLQkgICAgbGlrZWx5KCFpb2VuZC0+aW9fZXJyb3IgJiYgIVhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSkgewotCisJaWYgKGlvZW5kLT5pb190eXBlID09IElPX1VOV1JJVFRFTikgewogCQllcnJvciA9IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oaXAsIGlvZW5kLT5pb19vZmZzZXQsCiAJCQkJCQkgaW9lbmQtPmlvX3NpemUpOwotCQlpZiAoZXJyb3IpCi0JCQlpb2VuZC0+aW9fZXJyb3IgPSBlcnJvcjsKKwkJaWYgKGVycm9yKSB7CisJCQlpb2VuZC0+aW9fZXJyb3IgPSAtZXJyb3I7CisJCQlnb3RvIGRvbmU7CisJCX0KIAl9CiAKIAkvKgpAQCAtMjM2LDYgKzIxNSw3IEBACiAJZXJyb3IgPSB4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOwogCUFTU0VSVCghZXJyb3IgfHwgZXJyb3IgPT0gRUFHQUlOKTsKIAorZG9uZToKIAkvKgogCSAqIElmIHdlIGRpZG4ndCBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIHRoZSBpb2VuZCwgcmVxdWV1ZSBpdCB0byB0aGUKIAkgKiB0YWlsIG9mIHRoZSB3b3JrcXVldWUgZm9yIGFub3RoZXIgYXR0ZW1wdCBsYXRlci4gT3RoZXJ3aXNlIGRlc3Ryb3kKQEAgLTI0Nyw4ICsyMjcsNiBAQAogCQkvKiBlbnN1cmUgd2UgZG9uJ3Qgc3BpbiBvbiBibG9ja2VkIGlvZW5kcyAqLwogCQlkZWxheSgxKTsKIAl9IGVsc2UgewotCQlpZiAoaW9lbmQtPmlvX2lvY2IpCi0JCQlhaW9fY29tcGxldGUoaW9lbmQtPmlvX2lvY2IsIGlvZW5kLT5pb19yZXN1bHQsIDApOwogCQl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiAJfQogfQpAQCAtMjg1LDEzICsyNjMsMTMgQEAKIAkgKiBhbGwgdGhlIEkvTyBmcm9tIGNhbGxpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB0b28gZWFybHkuCiAJICovCiAJYXRvbWljX3NldCgmaW9lbmQtPmlvX3JlbWFpbmluZywgMSk7CisJaW9lbmQtPmlvX2lzYXN5bmMgPSAwOwogCWlvZW5kLT5pb19lcnJvciA9IDA7CiAJaW9lbmQtPmlvX2xpc3QgPSBOVUxMOwogCWlvZW5kLT5pb190eXBlID0gdHlwZTsKIAlpb2VuZC0+aW9faW5vZGUgPSBpbm9kZTsKIAlpb2VuZC0+aW9fYnVmZmVyX2hlYWQgPSBOVUxMOwogCWlvZW5kLT5pb19idWZmZXJfdGFpbCA9IE5VTEw7Ci0JYXRvbWljX2luYygmWEZTX0koaW9lbmQtPmlvX2lub2RlKS0+aV9pb2NvdW50KTsKIAlpb2VuZC0+aW9fb2Zmc2V0ID0gMDsKIAlpb2VuZC0+aW9fc2l6ZSA9IDA7CiAJaW9lbmQtPmlvX2lvY2IgPSBOVUxMOwpAQCAtMzM3LDggKzMxNSw4IEBACiAJCWNvdW50ID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKIAllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCi0JCQkgIGJtYXBpX2ZsYWdzLCAgTlVMTCwgMCwgaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCisJCQkJaW1hcCwgJm5pbWFwcywgYm1hcGlfZmxhZ3MpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAogCWlmIChlcnJvcikKQEAgLTU1MSw3ICs1MjksNiBAQAogCQkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCX0gd2hpbGUgKChiaCA9IG5leHRfYmgpICE9IE5VTEwpOwogCi0JCXhmc19pb2VuZF93YWtlKFhGU19JKGlvZW5kLT5pb19pbm9kZSkpOwogCQltZW1wb29sX2ZyZWUoaW9lbmQsIHhmc19pb2VuZF9wb29sKTsKIAl9IHdoaWxlICgoaW9lbmQgPSBuZXh0KSAhPSBOVUxMKTsKIH0KQEAgLTkyNSwxMSArOTAyLDExIEBACiAJICogcmFuZG9tIGNhbGxlcnMgZm9yIGRpcmVjdCByZWNsYWltIG9yIG1lbWNnIHJlY2xhaW0uICBXZSBleHBsaWNpdGx5CiAJICogYWxsb3cgcmVjbGFpbSBmcm9tIGtzd2FwZCBhcyB0aGUgc3RhY2sgdXNhZ2UgdGhlcmUgaXMgcmVsYXRpdmVseSBsb3cuCiAJICoKLQkgKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgZG9uZSBieSB0aGUgY29yZSBWTSwgYnV0IHVudGlsIHRoYXQgaGFwcGVucwotCSAqIGZpbGVzeXN0ZW1zIGxpa2UgWEZTLCBidHJmcyBhbmQgZXh0NCBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGlzCi0JICogYnkgdGhlbXNlbHZlcy4KKwkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gZXhjZXB0IGluIHRoZSBjYXNlIG9mIGEgVk0gcmVncmVzc2lvbiBzbworCSAqIHdhcm4gYWJvdXQgaXQuCiAJICovCi0JaWYgKChjdXJyZW50LT5mbGFncyAmIChQRl9NRU1BTExPQ3xQRl9LU1dBUEQpKSA9PSBQRl9NRU1BTExPQykKKwlpZiAoV0FSTl9PTl9PTkNFKChjdXJyZW50LT5mbGFncyAmIChQRl9NRU1BTExPQ3xQRl9LU1dBUEQpKSA9PQorCQkJUEZfTUVNQUxMT0MpKQogCQlnb3RvIHJlZGlydHk7CiAKIAkvKgpAQCAtMTE2MSw4ICsxMTM4LDggQEAKIAllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIHNpemUpOwogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCi0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAotCQkJICBYRlNfQk1BUElfRU5USVJFLCAgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwpOworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJCSZpbWFwLCAmbmltYXBzLCBYRlNfQk1BUElfRU5USVJFKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtMTMwMCw3ICsxMjc3LDYgQEAKIAlib29sCQkJaXNfYXN5bmMpCiB7CiAJc3RydWN0IHhmc19pb2VuZAkqaW9lbmQgPSBpb2NiLT5wcml2YXRlOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gaW9lbmQtPmlvX2lub2RlOwogCiAJLyoKIAkgKiBibG9ja2Rldl9kaXJlY3RfSU8gY2FuIHJldHVybiBhbiBlcnJvciBldmVuIGFmdGVyIHRoZSBJL08KQEAgLTEzMTEsMjggKzEyODcsMTcgQEAKIAogCWlvZW5kLT5pb19vZmZzZXQgPSBvZmZzZXQ7CiAJaW9lbmQtPmlvX3NpemUgPSBzaXplOworCWlvZW5kLT5pb19pb2NiID0gaW9jYjsKKwlpb2VuZC0+aW9fcmVzdWx0ID0gcmV0OwogCWlmIChwcml2YXRlICYmIHNpemUgPiAwKQogCQlpb2VuZC0+aW9fdHlwZSA9IElPX1VOV1JJVFRFTjsKIAogCWlmIChpc19hc3luYykgewotCQkvKgotCQkgKiBJZiB3ZSBhcmUgY29udmVydGluZyBhbiB1bndyaXR0ZW4gZXh0ZW50IHdlIG5lZWQgdG8gZGVsYXkKLQkJICogdGhlIEFJTyBjb21wbGV0aW9uIHVudGlsIGFmdGVyIHRoZSB1bndyaXR0ZW50IGV4dGVudAotCQkgKiBjb252ZXJzaW9uIGhhcyBjb21wbGV0ZWQsIG90aGVyd2lzZSBkbyBpdCBBU0FQLgotCQkgKi8KLQkJaWYgKGlvZW5kLT5pb190eXBlID09IElPX1VOV1JJVFRFTikgewotCQkJaW9lbmQtPmlvX2lvY2IgPSBpb2NiOwotCQkJaW9lbmQtPmlvX3Jlc3VsdCA9IHJldDsKLQkJfSBlbHNlIHsKLQkJCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIDApOwotCQl9CisJCWlvZW5kLT5pb19pc2FzeW5jID0gMTsKIAkJeGZzX2ZpbmlzaF9pb2VuZChpb2VuZCk7CiAJfSBlbHNlIHsKIAkJeGZzX2ZpbmlzaF9pb2VuZF9zeW5jKGlvZW5kKTsKIAl9Ci0KLQkvKiBYWFg6IHByb2JhYmx5IHNob3VsZCBtb3ZlIGludG8gdGhlIHJlYWwgSS9PIGNvbXBsZXRpb24gaGFuZGxlciAqLwotCWlub2RlX2Rpb19kb25lKGlub2RlKTsKIH0KIAogU1RBVElDIHNzaXplX3QKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5oIGIvZnMveGZzL3hmc19hb3BzLmgKaW5kZXggNzFmNzIxZS4uMTE2ZGQ1YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hb3BzLmgKKysrIGIvZnMveGZzL3hmc19hb3BzLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKIAl1bnNpZ25lZCBpbnQJCWlvX3R5cGU7CS8qIGRlbGFsbG9jIC8gdW53cml0dGVuICovCiAJaW50CQkJaW9fZXJyb3I7CS8qIEkvTyBlcnJvciBjb2RlICovCiAJYXRvbWljX3QJCWlvX3JlbWFpbmluZzsJLyogaG9sZCBjb3VudCAqLworCXVuc2lnbmVkIGludAkJaW9faXNhc3luYyA6IDE7CS8qIG5lZWRzIGFpb19jb21wbGV0ZSAqLwogCXN0cnVjdCBpbm9kZQkJKmlvX2lub2RlOwkvKiBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8gKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmlvX2J1ZmZlcl9oZWFkOy8qIGJ1ZmZlciBsaW5rZWQgbGlzdCBoZWFkICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSppb19idWZmZXJfdGFpbDsvKiBidWZmZXIgbGlua2VkIGxpc3QgdGFpbCAqLwpAQCAtNjAsOSArNjEsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgeGZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKIGV4dGVybiBpbnQgeGZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIAotZXh0ZXJuIHZvaWQgeGZzX2lvZW5kX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCB4ZnNfaW9lbmRfd2FpdChzdHJ1Y3QgeGZzX2lub2RlICopOwotCiBleHRlcm4gdm9pZCB4ZnNfY291bnRfcGFnZV9zdGF0ZShzdHJ1Y3QgcGFnZSAqLCBpbnQgKiwgaW50ICopOwogCiAjZW5kaWYgLyogX19YRlNfQU9QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKaW5kZXggMTYwYmNkYy4uMWU1ZDk3ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyLmMKKysrIGIvZnMveGZzL3hmc19hdHRyLmMKQEAgLTMxOSw3ICszMTksNyBAQAogCQlyZXR1cm4gKGVycm9yKTsKIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHApOworCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgMCk7CiAKIAkvKgogCSAqIElmIHRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBub24tZXhpc3RlbnQgb3IgYSBzaG9ydGZvcm0gbGlzdCwKQEAgLTM4OSw3ICszODksNyBAQAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KIAkJaWYgKGNvbW1pdHRlZCkKLQkJCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIDApOwogCiAJCS8qCiAJCSAqIENvbW1pdCB0aGUgbGVhZiB0cmFuc2Zvcm1hdGlvbi4gIFdlJ2xsIG5lZWQgYW5vdGhlciAobGlua2VkKQpAQCAtNTM3LDcgKzUzNyw3IEBACiAJICogTm8gbmVlZCB0byBtYWtlIHF1b3RhIHJlc2VydmF0aW9ucyBoZXJlLiBXZSBleHBlY3QgdG8gcmVsZWFzZSBzb21lCiAJICogYmxvY2tzIG5vdCBhbGxvY2F0ZSBpbiB0aGUgY29tbW9uIGNhc2UuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwKTsKKwl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIDApOwogCiAJLyoKIAkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCkBAIC04MDksNyArODA5LDcgQEAKIAkgKiBObyBuZWVkIHRvIG1ha2UgcXVvdGEgcmVzZXJ2YXRpb25zIGhlcmUuIFdlIGV4cGVjdCB0byByZWxlYXNlIHNvbWUKIAkgKiBibG9ja3MsIG5vdCBhbGxvY2F0ZSwgaW4gdGhlIGNvbW1vbiBjYXNlLgogCSAqLwotCXhmc190cmFuc19pam9pbih0cmFucywgZHApOworCXhmc190cmFuc19pam9pbih0cmFucywgZHAsIDApOwogCiAJLyoKIAkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCkBAIC04MjMsMTggKzgyMyw2IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogU2lnbmFsIHN5bmNocm9ub3VzIGluYWN0aXZlIHRyYW5zYWN0aW9ucyB1bmxlc3MgdGhpcyBpcyBhCi0JICogc3luY2hyb25vdXMgbW91bnQgZmlsZXN5c3RlbSBpbiB3aGljaCBjYXNlIHdlIGtub3cgdGhhdCB3ZSdyZSBoZXJlCi0JICogYmVjYXVzZSB3ZSd2ZSBiZWVuIGNhbGxlZCBvdXQgb2YgeGZzX2luYWN0aXZlIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi0JICogbGFzdCByZWZlcmVuY2UgaXMgZ29uZSBhbmQgdGhlIHVubGluayB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBoaXQKLQkgKiB0aGUgZGlzayBzbyBhc3luYyBpbmFjdGl2ZSB0cmFuc2FjdGlvbnMgYXJlIHNhZmUuCi0JICovCi0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKSB7Ci0JCWlmIChkcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApCi0JCQl4ZnNfdHJhbnNfc2V0X3N5bmModHJhbnMpOwotCX0KLQogCWVycm9yID0geGZzX2l0cnVuY2F0ZV9leHRlbnRzKCZ0cmFucywgZHAsIFhGU19BVFRSX0ZPUkssIDApOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CkBAIC05NzMsNyArOTYxLDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCiAJCS8qCiAJCSAqIENvbW1pdCB0aGUgY3VycmVudCB0cmFucyAoaW5jbHVkaW5nIHRoZSBpbm9kZSkgYW5kIHN0YXJ0CkBAIC0xMDc1LDcgKzEwNjMsNyBAQAogCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJCSAqLwogCQkJaWYgKGNvbW1pdHRlZCkKLQkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAkJfSBlbHNlCiAJCQl4ZnNfZGFfYnVmX2RvbmUoYnApOwogCkBAIC0xMTQ5LDcgKzExMzcsNyBAQAogCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkgKi8KIAkJaWYgKGNvbW1pdHRlZCkKLQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgMCk7CiAJfSBlbHNlCiAJCXhmc19kYV9idWZfZG9uZShicCk7CiAJcmV0dXJuKDApOwpAQCAtMTMwMyw3ICsxMjkxLDcgQEAKIAkJCSAqIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCQkgKi8KIAkJCWlmIChjb21taXR0ZWQpCi0JCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgMCk7CiAKIAkJCS8qCiAJCQkgKiBDb21taXQgdGhlIG5vZGUgY29udmVyc2lvbiBhbmQgc3RhcnQgdGhlIG5leHQKQEAgLTEzNDAsNyArMTMyOCw3IEBACiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBBZGRpdGlvbiBzdWNjZWVkZWQsIHVwZGF0ZSBCdHJlZSBoYXNodmFscy4KQEAgLTE0NTIsNyArMTQ0MCw3IEBACiAJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkJICovCiAJCQlpZiAoY29tbWl0dGVkKQotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCQl9CiAKIAkJLyoKQEAgLTE1ODQsNyArMTU3Miw3IEBACiAJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCiAJCSAqLwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCAwKTsKIAogCQkvKgogCQkgKiBDb21taXQgdGhlIEJ0cmVlIGpvaW4gb3BlcmF0aW9uIGFuZCBzdGFydCBhIG5ldyB0cmFucy4KQEAgLTE2MzUsNyArMTYyMyw3IEBACiAJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgogCQkJICovCiAJCQlpZiAoY29tbWl0dGVkKQotCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHApOworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCQl9IGVsc2UKIAkJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKIAl9CkBAIC0xOTc1LDEwICsxOTYzLDkgQEAKIAlsYmxrbm8gPSBhcmdzLT5ybXRibGtubzsKIAl3aGlsZSAodmFsdWVsZW4gPiAwKSB7CiAJCW5tYXAgPSBBVFRSX1JNVFZBTFVFX01BUFNJWkU7Ci0JCWVycm9yID0geGZzX2JtYXBpKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAotCQkJCSAgYXJncy0+cm10YmxrY250LAotCQkJCSAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCSAgTlVMTCwgMCwgbWFwLCAmbm1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoYXJncy0+ZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkgICAgICAgYXJncy0+cm10YmxrY250LCBtYXAsICZubWFwLAorCQkJCSAgICAgICBYRlNfQk1BUElfQVRUUkZPUkspOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4oZXJyb3IpOwogCQlBU1NFUlQobm1hcCA+PSAxKTsKQEAgLTIwNTIsMTAgKzIwMzksOSBAQAogCQkgKi8KIAkJeGZzX2JtYXBfaW5pdChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CiAJCW5tYXAgPSAxOwotCQllcnJvciA9IHhmc19ibWFwaShhcmdzLT50cmFucywgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUoYXJncy0+dHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCiAJCQkJICBibGtjbnQsCi0JCQkJICBYRlNfQk1BUElfQVRUUkZPUksgfCBYRlNfQk1BUElfTUVUQURBVEEgfAotCQkJCQkJCVhGU19CTUFQSV9XUklURSwKKwkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKIAkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKIAkJCQkgIGFyZ3MtPmZsaXN0KTsKIAkJaWYgKCFlcnJvcikgewpAQCAtMjA3NCw3ICsyMDYwLDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIDApOwogCiAJCUFTU0VSVChubWFwID09IDEpOwogCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKQEAgLTIxMDQsMTQgKzIwOTAsMTEgQEAKIAkJICovCiAJCXhmc19ibWFwX2luaXQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOwogCQlubWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKLQkJCQkgIGFyZ3MtPnJtdGJsa2NudCwKLQkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIDAsICZtYXAsICZubWFwLAotCQkJCSAgTlVMTCk7Ci0JCWlmIChlcnJvcikgeworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCisJCQkJICAgICAgIGFyZ3MtPnJtdGJsa2NudCwgJm1hcCwgJm5tYXAsCisJCQkJICAgICAgIFhGU19CTUFQSV9BVFRSRk9SSyk7CisJCWlmIChlcnJvcikKIAkJCXJldHVybihlcnJvcik7Ci0JCX0KIAkJQVNTRVJUKG5tYXAgPT0gMSk7CiAJCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgogCQkgICAgICAgKG1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSk7CkBAIC0yMTIxLDE2ICsyMTA0LDE3IEBACiAKIAkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfRE9OVF9CTE9DSyk7Ci0JCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwotCisJCWlmICghYnApCisJCQlyZXR1cm4gRU5PTUVNOwogCQl0bXAgPSAodmFsdWVsZW4gPCBYRlNfQlVGX1NJWkUoYnApKSA/IHZhbHVlbGVuIDoKIAkJCQkJCQlYRlNfQlVGX1NJWkUoYnApOwogCQl4ZnNfYnVmX2lvbW92ZShicCwgMCwgdG1wLCBzcmMsIFhCUldfV1JJVEUpOwogCQlpZiAodG1wIDwgWEZTX0JVRl9TSVpFKGJwKSkKIAkJCXhmc19idWZfemVybyhicCwgdG1wLCBYRlNfQlVGX1NJWkUoYnApIC0gdG1wKTsKLQkJaWYgKChlcnJvciA9IHhmc19id3JpdGUobXAsIGJwKSkpIHsvKiBHUk9UOiBOT1RFOiBzeW5jaHJvbm91cyB3cml0ZSAqLwotCQkJcmV0dXJuIChlcnJvcik7Ci0JCX0KKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsJLyogR1JPVDogTk9URTogc3luY2hyb25vdXMgd3JpdGUgKi8KKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKIAkJc3JjICs9IHRtcDsKIAkJdmFsdWVsZW4gLT0gdG1wOwogCkBAIC0yMTY2LDE2ICsyMTUwLDEyIEBACiAJCS8qCiAJCSAqIFRyeSB0byByZW1lbWJlciB3aGVyZSB3ZSBkZWNpZGVkIHRvIHB1dCB0aGUgdmFsdWUuCiAJCSAqLwotCQl4ZnNfYm1hcF9pbml0KGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKIAkJbm1hcCA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGFyZ3MtPmRwLCAoeGZzX2ZpbGVvZmZfdClsYmxrbm8sCi0JCQkJCWFyZ3MtPnJtdGJsa2NudCwKLQkJCQkJWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAotCQkJCQlhcmdzLT5maXJzdGJsb2NrLCAwLCAmbWFwLCAmbm1hcCwKLQkJCQkJYXJncy0+Zmxpc3QpOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAorCQkJCSAgICAgICBhcmdzLT5ybXRibGtjbnQsICZtYXAsICZubWFwLAorCQkJCSAgICAgICBYRlNfQk1BUElfQVRUUkZPUkspOworCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4oZXJyb3IpOwotCQl9CiAJCUFTU0VSVChubWFwID09IDEpOwogCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKIAkJICAgICAgIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOwpAQCAtMjE4OCw4ICsyMTY4LDcgQEAKIAkJICovCiAJCWJwID0geGZzX2luY29yZShtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwgWEJGX1RSWUxPQ0spOwogCQlpZiAoYnApIHsKLQkJCVhGU19CVUZfU1RBTEUoYnApOwotCQkJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCQkJeGZzX2J1Zl9zdGFsZShicCk7CiAJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCWJwID0gTlVMTDsKIAkJfQpAQCAtMjIyNyw3ICsyMjA2LDcgQEAKIAkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KIAkJICovCiAJCWlmIChjb21taXR0ZWQpCi0JCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGFyZ3MtPmRwKTsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgYXJncy0+ZHAsIDApOwogCiAJCS8qCiAJCSAqIENsb3NlIG91dCB0cmFucyBhbmQgc3RhcnQgdGhlIG5leHQgb25lIGluIHRoZSBjaGFpbi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IDhmYWQ5NjAuLmQ0OTA2ZTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtMjkyNiw5ICsyOTI2LDggQEAKIAkJICogVHJ5IHRvIHJlbWVtYmVyIHdoZXJlIHdlIGRlY2lkZWQgdG8gcHV0IHRoZSB2YWx1ZS4KIAkJICovCiAJCW5tYXAgPSAxOwotCQllcnJvciA9IHhmc19ibWFwaSgqdHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCi0JCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkJTlVMTCwgMCwgJm1hcCwgJm5tYXAsIE5VTEwpOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCisJCQkJICAgICAgICZtYXAsICZubWFwLCBYRlNfQk1BUElfQVRUUkZPUkspOwogCQlpZiAoZXJyb3IpIHsKIAkJCXJldHVybihlcnJvcik7CiAJCX0KQEAgLTI5NDgsNiArMjk0Nyw4IEBACiAJCQlicCA9IHhmc190cmFuc19nZXRfYnVmKCp0cmFucywKIAkJCQkJZHAtPmlfbW91bnQtPm1fZGRldl90YXJncCwKIAkJCQkJZGJsa25vLCBkYmxrY250LCBYQkZfTE9DSyk7CisJCQlpZiAoIWJwKQorCQkJCXJldHVybiBFTk9NRU07CiAJCQl4ZnNfdHJhbnNfYmludmFsKCp0cmFucywgYnApOwogCQkJLyoKIAkJCSAqIFJvbGwgdG8gbmV4dCB0cmFuc2FjdGlvbi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggNDUyYTI5MS4uYzY4YmFlYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmMKKysrIGIvZnMveGZzL3hmc19ibWFwLmMKQEAgLTUwLDE3ICs1MCwyMiBAQAogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAKLSNpZmRlZiBERUJVRwotU1RBVElDIHZvaWQKLXhmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cyh4ZnNfYnRyZWVfY3VyX3QgKmN1ciwgeGZzX2lub2RlX3QgKmlwLCBpbnQgd2hpY2hmb3JrKTsKLSNlbmRpZgotCiBrbWVtX3pvbmVfdAkJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOwogCiAvKgogICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgYm1hcCByb3V0aW5lcy4KICAqLwogCisjaWZkZWYgREVCVUcKK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlpbnQJCQl3aGljaGZvcmspOworI2Vsc2UKKyNkZWZpbmUgeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKGN1ciwgaXAsIHdoaWNoZm9yaykJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGV4dGVudHMgZm9ybWF0IGZpbGVzLgpAQCAtODUsNTggKzkwLDYgQEAKIAlpbnQJCQkqZmxhZ3MpOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGRlbGF5ZWQKLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KLQl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIGFkZCB0byBmaWxlIGV4dGVudHMgKi8KLQl4ZnNfZmlsYmxrc190CQkqZG5ldywJLyogbmV3IGRlbGF5ZWQtYWxsb2MgaW5kaXJlY3QgYmxvY2tzICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKLSAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQotICogdG8gYSBkZWxheWVkIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSgKLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKLSAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQotICogdG8gYSByZWFsIGFsbG9jYXRpb24uCi0gKi8KLVNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCWludAkJCXdoaWNoZm9yayk7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCk7IC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KLQotLyoKICAqIHhmc19ibWFwX2FsbG9jIGlzIGNhbGxlZCBieSB4ZnNfYm1hcGkgdG8gYWxsb2NhdGUgYW4gZXh0ZW50IGZvciBhIGZpbGUuCiAgKiBJdCBmaWd1cmVzIG91dCB3aGVyZSB0byBhc2sgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yIHRvIHB1dCB0aGUgbmV3IGV4dGVudC4KICAqLwpAQCAtMjE1LDE5ICsxNjgsNiBAQAogCXhmc19ibWJ0X2lyZWNfdAkqcHJldnApOwkvKiBvdXQ6IHByZXZpb3VzIGV4dGVudCBlbnRyeSBmb3VuZCAqLwogCiAvKgotICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAotICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCi0gKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCi0gKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9pc2Flb2YoCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQl4ZnNfZmlsZW9mZl90ICAgb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KLQlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JY2hhcgkJKmFlb2YpOwkJLyogcmV0dXJuIHZhbHVlICovCi0KLS8qCiAgKiBDb21wdXRlIHRoZSB3b3JzdC1jYXNlIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3MgdGhhdCB3aWxsIGJlIHVzZWQKICAqIGZvciBpcCdzIGRlbGF5ZWQgZXh0ZW50IG9mIGxlbmd0aCAibGVuIi4KICAqLwpAQCAtNDMxLDE4OCArMzcxLDEzIEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBpIHRvIHVwZGF0ZSBmaWxlIGV4dGVudCByZWNvcmRzIGFuZCB0aGUgYnRyZWUKLSAqIGFmdGVyIGFsbG9jYXRpbmcgc3BhY2UgKG9yIGRvaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uKS4KLSAqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfYWRkX2V4dGVudCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KLQl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIGFkZCB0byBmaWxlIGV4dGVudHMgKi8KLQl4ZnNfZnNibG9ja190CQkqZmlyc3QsCS8qIHBvaW50ZXIgdG8gZmlyc3RibG9jayB2YXJpYWJsZSAqLwotCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KLQlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCi0JaW50CQkJd2hpY2hmb3JrKSAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotewotCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yIG9yIG51bGwgKi8KLQl4ZnNfZmlsYmxrc190CQlkYV9uZXc7IC8qIG5ldyBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KLQl4ZnNfZmlsYmxrc190CQlkYV9vbGQ7IC8qIG9sZCBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KLQlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJCSppZnA7CS8qIGlub2RlIGZvcmsgcHRyICovCi0JaW50CQkJbG9nZmxhZ3M7IC8qIHJldHVybmVkIHZhbHVlICovCi0JeGZzX2V4dG51bV90CQluZXh0ZW50czsgLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZmlsZSBub3cgKi8KLQotCVhGU19TVEFUU19JTkMoeHNfYWRkX2V4bGlzdCk7Ci0KLQljdXIgPSAqY3VycDsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7Ci0JZGFfb2xkID0gZGFfbmV3ID0gMDsKLQllcnJvciA9IDA7Ci0KLQlBU1NFUlQoKmlkeCA+PSAwKTsKLQlBU1NFUlQoKmlkeCA8PSBuZXh0ZW50cyk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgdGhlIGZpcnN0IGV4dGVudCBhZGRlZCB0byBhIG5ldy9lbXB0eSBmaWxlLgotCSAqIFNwZWNpYWwgY2FzZSB0aGlzIG9uZSwgc28gb3RoZXIgcm91dGluZXMgZ2V0IHRvIGFzc3VtZSB0aGVyZSBhcmUKLQkgKiBhbHJlYWR5IGV4dGVudHMgaW4gdGhlIGxpc3QuCi0JICovCi0JaWYgKG5leHRlbnRzID09IDApIHsKLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4LCAxLCBuZXcsCi0JCQkJd2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUksgPyBCTUFQX0FUVFJGT1JLIDogMCk7Ci0KLQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKLQotCQlpZiAoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSkgewotCQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssIDEpOwotCQkJbG9nZmxhZ3MgPSBYRlNfSUxPR19DT1JFIHwgeGZzX2lsb2dfZmV4dCh3aGljaGZvcmspOwotCQl9IGVsc2UKLQkJCWxvZ2ZsYWdzID0gMDsKLQl9Ci0JLyoKLQkgKiBBbnkga2luZCBvZiBuZXcgZGVsYXllZCBhbGxvY2F0aW9uIGdvZXMgaGVyZS4KLQkgKi8KLQllbHNlIGlmIChpc251bGxzdGFydGJsb2NrKG5ldy0+YnJfc3RhcnRibG9jaykpIHsKLQkJaWYgKGN1cikKLQkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgotCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7Ci0JCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5KGlwLCBpZHgsIG5ldywKLQkJCQkJCSAgICAgICAmbG9nZmxhZ3MpOwotCX0KLQkvKgotCSAqIFJlYWwgYWxsb2NhdGlvbiBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQkgKi8KLQllbHNlIGlmICgqaWR4ID09IG5leHRlbnRzKSB7Ci0JCWlmIChjdXIpCi0JCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKLQkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUwpID09IDApOwotCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwgbmV3LAotCQkJCSZsb2dmbGFncywgd2hpY2hmb3JrKTsKLQl9IGVsc2UgewotCQl4ZnNfYm1idF9pcmVjX3QJcHJldjsJLyogb2xkIGV4dGVudCBhdCBvZmZzZXQgaWR4ICovCi0KLQkJLyoKLQkJICogR2V0IHRoZSByZWNvcmQgcmVmZXJyZWQgdG8gYnkgaWR4LgotCQkgKi8KLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCksICZwcmV2KTsKLQkJLyoKLQkJICogSWYgaXQncyBhIHJlYWwgYWxsb2NhdGlvbiByZWNvcmQsIGFuZCB0aGUgbmV3IGFsbG9jYXRpb24gZW5kcwotCQkgKiBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIHJlZmVycmVkIHRvIHJlY29yZCwgdGhlbiB3ZSdyZSBmaWxsaW5nCi0JCSAqIGluIGEgZGVsYXllZCBvciB1bndyaXR0ZW4gYWxsb2NhdGlvbiB3aXRoIGEgcmVhbCBvbmUsIG9yCi0JCSAqIGNvbnZlcnRpbmcgcmVhbCBiYWNrIHRvIHVud3JpdHRlbi4KLQkJICovCi0JCWlmICghaXNudWxsc3RhcnRibG9jayhuZXctPmJyX3N0YXJ0YmxvY2spICYmCi0JCSAgICBuZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50ID4gcHJldi5icl9zdGFydG9mZikgewotCQkJaWYgKHByZXYuYnJfc3RhdGUgIT0gWEZTX0VYVF9VTldSSVRURU4gJiYKLQkJCSAgICBpc251bGxzdGFydGJsb2NrKHByZXYuYnJfc3RhcnRibG9jaykpIHsKLQkJCQlkYV9vbGQgPSBzdGFydGJsb2NrdmFsKHByZXYuYnJfc3RhcnRibG9jayk7Ci0JCQkJaWYgKGN1cikKLQkJCQkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKLQkJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCk7Ci0JCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwodHAsIGlwLAotCQkJCQkJaWR4LCAmY3VyLCBuZXcsICZkYV9uZXcsCi0JCQkJCQlmaXJzdCwgZmxpc3QsICZsb2dmbGFncyk7Ci0JCQl9IGVsc2UgewotCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAotCQkJCSAgICAgICBuZXctPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKLQotCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbChpcCwKLQkJCQkJCWlkeCwgJmN1ciwgbmV3LCAmbG9nZmxhZ3MpOwotCQkJCWlmIChlcnJvcikKLQkJCQkJZ290byBkb25lOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSB3ZSdyZSBmaWxsaW5nIGluIGEgaG9sZSB3aXRoIGFuIGFsbG9jYXRpb24uCi0JCSAqLwotCQllbHNlIHsKLQkJCWlmIChjdXIpCi0JCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmCi0JCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7Ci0JCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKGlwLCBpZHgsIGN1ciwKLQkJCQkJbmV3LCAmbG9nZmxhZ3MsIHdoaWNoZm9yayk7Ci0JCX0KLQl9Ci0KLQlpZiAoZXJyb3IpCi0JCWdvdG8gZG9uZTsKLQlBU1NFUlQoKmN1cnAgPT0gY3VyIHx8ICpjdXJwID09IE5VTEwpOwotCi0JLyoKLQkgKiBDb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5LgotCSAqLwotCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7Ci0JCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLwotCi0JCUFTU0VSVChjdXIgPT0gTlVMTCk7Ci0JCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZSh0cCwgaXAsIGZpcnN0LAotCQkJZmxpc3QsICZjdXIsIGRhX29sZCA+IDAsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yayk7Ci0JCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKLQkJaWYgKGVycm9yKQotCQkJZ290byBkb25lOwotCX0KLQkvKgotCSAqIEFkanVzdCBmb3IgY2hhbmdlcyBpbiByZXNlcnZlZCBkZWxheWVkIGluZGlyZWN0IGJsb2Nrcy4KLQkgKiBOb3RoaW5nIHRvIGRvIGZvciBkaXNrIHF1b3RhcyBoZXJlLgotCSAqLwotCWlmIChkYV9vbGQgfHwgZGFfbmV3KSB7Ci0JCXhmc19maWxibGtzX3QJbmJsa3M7Ci0KLQkJbmJsa3MgPSBkYV9uZXc7Ci0JCWlmIChjdXIpCi0JCQluYmxrcyArPSBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7Ci0JCUFTU0VSVChuYmxrcyA8PSBkYV9vbGQpOwotCQlpZiAobmJsa3MgPCBkYV9vbGQpCi0JCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCi0JCQkJKGludDY0X3QpKGRhX29sZCAtIG5ibGtzKSwgMCk7Ci0JfQotCS8qCi0JICogQ2xlYXIgb3V0IHRoZSBhbGxvY2F0ZWQgZmllbGQsIGRvbmUgd2l0aCBpdCBub3cgaW4gYW55IGNhc2UuCi0JICovCi0JaWYgKGN1cikgewotCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOwotCQkqY3VycCA9IGN1cjsKLQl9Ci1kb25lOgotI2lmZGVmIERFQlVHCi0JaWYgKCFlcnJvcikKLQkJeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKCpjdXJwLCBpcCwgd2hpY2hmb3JrKTsKLSNlbmRpZgotCSpsb2dmbGFnc3AgPSBsb2dmbGFnczsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGRlbGF5ZWQKLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24uCisgKiBDb252ZXJ0IGEgZGVsYXllZCBhbGxvY2F0aW9uIHRvIGEgcmVhbCBhbGxvY2F0aW9uLgogICovCiBTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCiB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwoCi0Jc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JeGZzX2ZpbGJsa3NfdAkJKmRuZXcsCS8qIG5ldyBkZWxheWVkLWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLwotCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLwotCWludAkJCSpsb2dmbGFnc3ApIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEpCiB7Ci0JeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkvKiBidHJlZSBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbmV3ID0gJmJtYS0+Z290OwogCWludAkJCWRpZmY7CS8qIHRlbXAgdmFsdWUgKi8KIAl4ZnNfYm1idF9yZWNfaG9zdF90CSplcDsJLyogZXh0ZW50IGVudHJ5IGZvciBpZHggKi8KIAlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCkBAIC02MjMsMTAgKzM4OCwyMiBAQAogCQkJCQkvKiBsZWZ0IGlzIDAsIHJpZ2h0IGlzIDEsIHByZXYgaXMgMiAqLwogCWludAkJCXJ2YWw9MDsJLyogcmV0dXJuIHZhbHVlIChsb2dnaW5nIGZsYWdzKSAqLwogCWludAkJCXN0YXRlID0gMDsvKiBzdGF0ZSBiaXRzLCBhY2Nlc3NlZCB0aHJ1IG1hY3JvcyAqLwotCXhmc19maWxibGtzX3QJCXRlbXA9MDsJLyogdmFsdWUgZm9yIGRuZXcgY2FsY3VsYXRpb25zICovCi0JeGZzX2ZpbGJsa3NfdAkJdGVtcDI9MDsvKiB2YWx1ZSBmb3IgZG5ldyBjYWxjdWxhdGlvbnMgKi8KKwl4ZnNfZmlsYmxrc190CQlkYV9uZXc7IC8qIG5ldyBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZmlsYmxrc190CQlkYV9vbGQ7IC8qIG9sZCBjb3VudCBkZWwgYWxsb2MgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZmlsYmxrc190CQl0ZW1wPTA7CS8qIHZhbHVlIGZvciBkYV9uZXcgY2FsY3VsYXRpb25zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDI9MDsvKiB2YWx1ZSBmb3IgZGFfbmV3IGNhbGN1bGF0aW9ucyAqLwogCWludAkJCXRtcF9ydmFsOwkvKiBwYXJ0aWFsIGxvZ2dpbmcgZmxhZ3MgKi8KIAorCWlmcCA9IFhGU19JRk9SS19QVFIoYm1hLT5pcCwgWEZTX0RBVEFfRk9SSyk7CisKKwlBU1NFUlQoYm1hLT5pZHggPj0gMCk7CisJQVNTRVJUKGJtYS0+aWR4IDw9IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2Yoc3RydWN0IHhmc19ibWJ0X3JlYykpOworCUFTU0VSVCghaXNudWxsc3RhcnRibG9jayhuZXctPmJyX3N0YXJ0YmxvY2spKTsKKwlBU1NFUlQoIWJtYS0+Y3VyIHx8CisJICAgICAgIChibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYgWEZTX0JUQ1VSX0JQUlZfV0FTREVMKSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2FkZF9leGxpc3QpOworCiAjZGVmaW5lCUxFRlQJCXJbMF0KICNkZWZpbmUJUklHSFQJCXJbMV0KICNkZWZpbmUJUFJFVgkJclsyXQpAQCAtNjM0LDE0ICs0MTEsMTUgQEAKIAkvKgogCSAqIFNldCB1cCBhIGJ1bmNoIG9mIHZhcmlhYmxlcyB0byBtYWtlIHRoZSB0ZXN0cyBzaW1wbGVyLgogCSAqLwotCWN1ciA9ICpjdXJwOwotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOwotCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpOworCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKIAl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmUFJFVik7CiAJbmV3X2VuZG9mZiA9IG5ldy0+YnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQ7CiAJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgPD0gbmV3LT5icl9zdGFydG9mZik7CiAJQVNTRVJUKFBSRVYuYnJfc3RhcnRvZmYgKyBQUkVWLmJyX2Jsb2NrY291bnQgPj0gbmV3X2VuZG9mZik7CiAKKwlkYV9vbGQgPSBzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jayk7CisJZGFfbmV3ID0gMDsKKwogCS8qCiAJICogU2V0IGZsYWdzIGRldGVybWluaW5nIHdoYXQgcGFydCBvZiB0aGUgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uCiAJICogZXh0ZW50IGlzIGJlaW5nIHJlcGxhY2VkIGJ5IGEgcmVhbCBhbGxvY2F0aW9uLgpAQCAtNjU1LDkgKzQzMyw5IEBACiAJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgbGVmdCBuZWlnaGJvci4KIAkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KIAkgKi8KLQlpZiAoKmlkeCA+IDApIHsKKwlpZiAoYm1hLT5pZHggPiAwKSB7CiAJCXN0YXRlIHw9IEJNQVBfTEVGVF9WQUxJRDsKLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCAtIDEpLCAmTEVGVCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4IC0gMSksICZMRUZUKTsKIAogCQlpZiAoaXNudWxsc3RhcnRibG9jayhMRUZULmJyX3N0YXJ0YmxvY2spKQogCQkJc3RhdGUgfD0gQk1BUF9MRUZUX0RFTEFZOwpAQCAtNjc1LDkgKzQ1Myw5IEBACiAJICogRG9uJ3Qgc2V0IGNvbnRpZ3VvdXMgaWYgdGhlIGNvbWJpbmVkIGV4dGVudCB3b3VsZCBiZSB0b28gbGFyZ2UuCiAJICogQWxzbyBjaGVjayBmb3IgYWxsLXRocmVlLWNvbnRpZ3VvdXMgYmVpbmcgdG9vIGxhcmdlLgogCSAqLwotCWlmICgqaWR4IDwgaXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gMSkgeworCWlmIChibWEtPmlkeCA8IGJtYS0+aXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gMSkgewogCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX1ZBTElEOwotCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4ICsgMSksICZSSUdIVCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMSksICZSSUdIVCk7CiAKIAkJaWYgKGlzbnVsbHN0YXJ0YmxvY2soUklHSFQuYnJfc3RhcnRibG9jaykpCiAJCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX0RFTEFZOwpAQCAtNzA4LDM4ICs0ODYsNDEgQEAKIAkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCiAJCSAqIFRoZSBsZWZ0IGFuZCByaWdodCBuZWlnaGJvcnMgYXJlIGJvdGggY29udGlndW91cyB3aXRoIG5ldy4KIAkJICovCi0JCS0tKmlkeDsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4KSwKKwkJYm1hLT5pZHgtLTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksCiAJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBQUkVWLmJyX2Jsb2NrY291bnQgKwogCQkJUklHSFQuYnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCXhmc19pZXh0X3JlbW92ZShpcCwgKmlkeCArIDEsIDIsIHN0YXRlKTsKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cy0tOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXhmc19pZXh0X3JlbW92ZShibWEtPmlwLCBibWEtPmlkeCArIDEsIDIsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzLS07CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAogCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCWVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQllcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoYm1hLT5jdXIsIDAsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShibWEtPmN1ciwgTEVGVC5icl9zdGFydG9mZiwKIAkJCQkJTEVGVC5icl9zdGFydGJsb2NrLAogCQkJCQlMRUZULmJyX2Jsb2NrY291bnQgKwogCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQgKwotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBMRUZULmJyX3N0YXRlKSkpCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfTEVGVF9DT05USUc6CkBAIC03NDcsMzAgKzUyOCwzMSBAQAogCQkgKiBGaWxsaW5nIGluIGFsbCBvZiBhIHByZXZpb3VzbHkgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KIAkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cywgdGhlIHJpZ2h0IGlzIG5vdC4KIAkJICovCi0JCS0tKmlkeDsKKwkJYm1hLT5pZHgtLTsKIAotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCUxFRlQuYnJfYmxvY2tjb3VudCArIFBSRVYuYnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCXhmc19pZXh0X3JlbW92ZShpcCwgKmlkeCArIDEsIDEsIHN0YXRlKTsKLQkJaWYgKGN1ciA9PSBOVUxMKQorCQl4ZnNfaWV4dF9yZW1vdmUoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBzdGF0ZSk7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKLQkJCQkJJmkpKSkKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCiAJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCi0JCQkJCVBSRVYuYnJfYmxvY2tjb3VudCwgTEVGVC5icl9zdGF0ZSkpKQorCQkJCQlQUkVWLmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORyB8IEJNQVBfUklHSFRfQ09OVElHOgpAQCAtNzc4LDMwICs1NjAsMzAgQEAKIAkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCiAJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzLCB0aGUgbGVmdCBpcyBub3QuCiAJCSAqLwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBuZXctPmJyX3N0YXJ0YmxvY2spOwogCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKIAkJCVBSRVYuYnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAotCQl4ZnNfaWV4dF9yZW1vdmUoaXAsICppZHggKyAxLCAxLCBzdGF0ZSk7Ci0JCWlmIChjdXIgPT0gTlVMTCkKKwkJeGZzX2lleHRfcmVtb3ZlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgMSwgc3RhdGUpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSAwOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAogCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAotCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIFBSRVYuYnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKIAkJCQkJUFJFVi5icl9ibG9ja2NvdW50ICsKLQkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgUFJFVi5icl9zdGF0ZSkpKQorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCBQUkVWLmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQotCQkqZG5ldyA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX0xFRlRfRklMTElORyB8IEJNQVBfUklHSFRfRklMTElORzoKQEAgLTgxMCwyNyArNTkyLDI3IEBACiAJCSAqIE5laXRoZXIgdGhlIGxlZnQgbm9yIHJpZ2h0IG5laWdoYm9ycyBhcmUgY29udGlndW91cyB3aXRoCiAJCSAqIHRoZSBuZXcgb25lLgogCQkgKi8KLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbmV3LT5icl9zdGFydGJsb2NrKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOwotCQlpZiAoY3VyID09IE5VTEwpCisJCWJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKIAkJZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAotCQkJCQkmaSkpKQorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKLQkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQllcnJvciA9IHhmc19idHJlZV9pbnNlcnQoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0KLQkJKmRuZXcgPSAwOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHOgpAQCAtODM4LDM5ICs2MjAsNDAgQEAKIAkJICogRmlsbGluZyBpbiB0aGUgZmlyc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KIAkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cy4KIAkJICovCi0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHggLSAxLCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggLSAxKSwKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHggLSAxKSwKIAkJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7CiAJCXhmc19ibWJ0X3NldF9zdGFydG9mZihlcCwKIAkJCVBSRVYuYnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCAtIDEsIHN0YXRlLCBfVEhJU19JUF8pOwogCiAJCXRlbXAgPSBQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQ7Ci0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOwotCQlpZiAoY3VyID09IE5VTEwpCisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKLQkJCQkJJmkpKSkKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGJtYS0+Y3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCiAJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCiAJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCwKLQkJCQkJTEVGVC5icl9zdGF0ZSkpKQorCQkJCQlMRUZULmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spKTsKLQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jayhkYV9uZXcpKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCS0tKmlkeDsKLQkJKmRuZXcgPSB0ZW1wOworCQlibWEtPmlkeC0tOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkc6CkBAIC04NzgsNDMgKzY2MSw0MyBAQAogCQkgKiBGaWxsaW5nIGluIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uLgogCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBub3QgY29udGlndW91cy4KIAkJICovCi0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAkJeGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKGVwLCBuZXdfZW5kb2ZmKTsKIAkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKIAkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOwotCQl4ZnNfaWV4dF9pbnNlcnQoaXAsICppZHgsIDEsIG5ldywgc3RhdGUpOwotCQlpcC0+aV9kLmRpX25leHRlbnRzKys7Ci0JCWlmIChjdXIgPT0gTlVMTCkKKwkJeGZzX2lleHRfaW5zZXJ0KGJtYS0+aXAsIGJtYS0+aWR4LCAxLCBuZXcsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJCSZpKSkpCisJCQkJCSZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWJtYS0+Y3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luc2VydChibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KLQkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7Ci0JCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLAotCQkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKLQkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlmIChibWEtPmlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkJICAgIGJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cyA+IGJtYS0+aXAtPmlfZGYuaWZfZXh0X21heCkgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGJtYS0+dHAsIGJtYS0+aXAsCisJCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwKKwkJCQkJJmJtYS0+Y3VyLCAxLCAmdG1wX3J2YWwsIFhGU19EQVRBX0ZPUkspOwogCQkJcnZhbCB8PSB0bXBfcnZhbDsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spIC0KLQkJCShjdXIgPyBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7Ci0JCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggKyAxKTsKLQkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOwotCi0JCSpkbmV3ID0gdGVtcDsKKwkJCShibWEtPmN1ciA/IGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkIDogMCkpOworCQllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCArIDEpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soZGFfbmV3KSk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX1JJR0hUX0ZJTExJTkcgfCBCTUFQX1JJR0hUX0NPTlRJRzoKQEAgLTkyMywzOCArNzA2LDM5IEBACiAJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzIHdpdGggdGhlIG5ldyBhbGxvY2F0aW9uLgogCQkgKi8KIAkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKLQkJeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHggKyAxKSwKKwkJeGZzX2JtYnRfc2V0X2FsbGYoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMSksCiAJCQluZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCiAJCQluZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50LAogCQkJUklHSFQuYnJfc3RhdGUpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDEsIHN0YXRlLCBfVEhJU19JUF8pOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMSwgc3RhdGUsIF9USElTX0lQXyk7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CiAJCWVsc2UgewogCQkJcnZhbCA9IDA7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCiAJCQkJCVJJR0hULmJyX3N0YXJ0YmxvY2ssCi0JCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLAogCQkJCQluZXctPmJyX2Jsb2NrY291bnQgKwogCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LAotCQkJCQlSSUdIVC5icl9zdGF0ZSkpKQorCQkJCQlSSUdIVC5icl9zdGF0ZSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9CiAKLQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQlkYV9uZXcgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApLAogCQkJc3RhcnRibG9ja3ZhbChQUkVWLmJyX3N0YXJ0YmxvY2spKTsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jaygoaW50KXRlbXApKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKGRhX25ldykpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJKysqaWR4OwotCQkqZG5ldyA9IHRlbXA7CisJCWJtYS0+aWR4Kys7CiAJCWJyZWFrOwogCiAJY2FzZSBCTUFQX1JJR0hUX0ZJTExJTkc6CkBAIC05NjMsNDIgKzc0Nyw0MyBAQAogCQkgKiBUaGUgcmlnaHQgbmVpZ2hib3IgaXMgbm90IGNvbnRpZ3VvdXMuCiAJCSAqLwogCQl0ZW1wID0gUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4ICsgMSwgMSwgbmV3LCBzdGF0ZSk7Ci0JCWlwLT5pX2QuZGlfbmV4dGVudHMrKzsKLQkJaWYgKGN1ciA9PSBOVUxMKQorCQl4ZnNfaWV4dF9pbnNlcnQoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBuZXcsIHN0YXRlKTsKKwkJYm1hLT5pcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChibWEtPmN1ciA9PSBOVUxMKQogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOwogCQllbHNlIHsKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQllcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShibWEtPmN1ciwgbmV3LT5icl9zdGFydG9mZiwKIAkJCQkJbmV3LT5icl9zdGFydGJsb2NrLCBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJCSZpKSkpCisJCQkJCSZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCWJtYS0+Y3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWVycm9yID0geGZzX2J0cmVlX2luc2VydChibWEtPmN1ciwgJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7CiAJCX0KLQkJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkJICAgIGlwLT5pX2QuZGlfbmV4dGVudHMgPiBpcC0+aV9kZi5pZl9leHRfbWF4KSB7Ci0JCQllcnJvciA9IHhmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUodHAsIGlwLAotCQkJCWZpcnN0LCBmbGlzdCwgJmN1ciwgMSwgJnRtcF9ydmFsLAotCQkJCVhGU19EQVRBX0ZPUkspOworCQlpZiAoYm1hLT5pcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBibWEtPmlwLT5pX2QuZGlfbmV4dGVudHMgPiBibWEtPmlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwgJmJtYS0+Y3VyLCAxLAorCQkJCSZ0bXBfcnZhbCwgWEZTX0RBVEFfRk9SSyk7CiAJCQlydmFsIHw9IHRtcF9ydmFsOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQotCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCWRhX25ldyA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oYm1hLT5pcCwgdGVtcCksCiAJCQlzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jaykgLQotCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKLQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCk7Ci0JCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBudWxsc3RhcnRibG9jaygoaW50KXRlbXApKTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQkJKGJtYS0+Y3VyID8gYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7CisJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKGRhX25ldykpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJKysqaWR4OwotCQkqZG5ldyA9IHRlbXA7CisJCWJtYS0+aWR4Kys7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgpAQCAtMTAyNCw4MiArODA5LDY1IEBACiAJCSAqLwogCQl0ZW1wID0gbmV3LT5icl9zdGFydG9mZiAtIFBSRVYuYnJfc3RhcnRvZmY7CiAJCXRlbXAyID0gUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7Ci0JCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoaXAsICppZHgsIDAsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIDAsIF9USElTX0lQXyk7CiAJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsJLyogdHJ1bmNhdGUgUFJFViAqLwogCQlMRUZUID0gKm5ldzsKIAkJUklHSFQuYnJfc3RhdGUgPSBQUkVWLmJyX3N0YXRlOwogCQlSSUdIVC5icl9zdGFydGJsb2NrID0gbnVsbHN0YXJ0YmxvY2soCi0JCQkJKGludCl4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXAyKSk7CisJCQkJKGludCl4ZnNfYm1hcF93b3JzdF9pbmRsZW4oYm1hLT5pcCwgdGVtcDIpKTsKIAkJUklHSFQuYnJfc3RhcnRvZmYgPSBuZXdfZW5kb2ZmOwogCQlSSUdIVC5icl9ibG9ja2NvdW50ID0gdGVtcDI7CiAJCS8qIGluc2VydCBMRUZUIChyWzBdKSBhbmQgUklHSFQgKHJbMV0pIGF0IHRoZSBzYW1lIHRpbWUgKi8KLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4ICsgMSwgMiwgJkxFRlQsIHN0YXRlKTsKLQkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOwotCQlpZiAoY3VyID09IE5VTEwpCisJCXhmc19pZXh0X2luc2VydChibWEtPmlwLCBibWEtPmlkeCArIDEsIDIsICZMRUZULCBzdGF0ZSk7CisJCWJtYS0+aXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkKIAkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKIAkJZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAotCQkJCQkmaSkpKQorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBkb25lKTsKLQkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQllcnJvciA9IHhmc19idHJlZV9pbnNlcnQoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwogCQl9Ci0JCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCi0JCSAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCkgewotCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwKLQkJCQkJZmlyc3QsIGZsaXN0LCAmY3VyLCAxLCAmdG1wX3J2YWwsCi0JCQkJCVhGU19EQVRBX0ZPUkspOworCQlpZiAoYm1hLT5pcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBibWEtPmlwLT5pX2QuZGlfbmV4dGVudHMgPiBibWEtPmlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCQlibWEtPmZpcnN0YmxvY2ssIGJtYS0+Zmxpc3QsICZibWEtPmN1ciwKKwkJCQkJMSwgJnRtcF9ydmFsLCBYRlNfREFUQV9GT1JLKTsKIAkJCXJ2YWwgfD0gdG1wX3J2YWw7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9Ci0JCXRlbXAgPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApOwotCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcDIpOworCQl0ZW1wID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGJtYS0+aXAsIHRlbXApOworCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihibWEtPmlwLCB0ZW1wMik7CiAJCWRpZmYgPSAoaW50KSh0ZW1wICsgdGVtcDIgLSBzdGFydGJsb2NrdmFsKFBSRVYuYnJfc3RhcnRibG9jaykgLQotCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKLQkJaWYgKGRpZmYgPiAwICYmCi0JCSAgICB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsCi0JCQkJCSAgICAgLSgoaW50NjRfdClkaWZmKSwgMCkpIHsKLQkJCS8qCi0JCQkgKiBJY2sgZ3Jvc3MgZ2FnIG1lIHdpdGggYSBzcG9vbi4KLQkJCSAqLwotCQkJQVNTRVJUKDApOwkvKiB3YW50IHRvIHNlZSBpZiB0aGlzIGV2ZXIgaGFwcGVucyEgKi8KLQkJCXdoaWxlIChkaWZmID4gMCkgewotCQkJCWlmICh0ZW1wKSB7Ci0JCQkJCXRlbXAtLTsKLQkJCQkJZGlmZi0tOwotCQkJCQlpZiAoIWRpZmYgfHwKLQkJCQkJICAgICF4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsCi0JCQkJCQkgICAgWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCSAgICAtKChpbnQ2NF90KWRpZmYpLCAwKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGVtcDIpIHsKLQkJCQkJdGVtcDItLTsKLQkJCQkJZGlmZi0tOwotCQkJCQlpZiAoIWRpZmYgfHwKLQkJCQkJICAgICF4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMoaXAtPmlfbW91bnQsCi0JCQkJCQkgICAgWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCSAgICAtKChpbnQ2NF90KWRpZmYpLCAwKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKwkJCShibWEtPmN1ciA/IGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkIDogMCkpOworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWVycm9yID0geGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKGJtYS0+aXAtPmlfbW91bnQsCisJCQkJCVhGU19TQlNfRkRCTE9DS1MsCisJCQkJCS0oKGludDY0X3QpZGlmZiksIDApOworCQkJQVNTRVJUKCFlcnJvcik7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBkb25lOwogCQl9Ci0JCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpOwotCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wKSk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCArIDIsIHN0YXRlLCBfVEhJU19JUF8pOwotCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCArIDIpLAotCQkJbnVsbHN0YXJ0YmxvY2soKGludCl0ZW1wMikpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCArIDIsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCSsrKmlkeDsKLQkJKmRuZXcgPSB0ZW1wICsgdGVtcDI7CisJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIG51bGxzdGFydGJsb2NrKChpbnQpdGVtcCkpOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3ByZV91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHggKyAyLCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4ICsgMiksCisJCQludWxsc3RhcnRibG9jaygoaW50KXRlbXAyKSk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4ICsgMiwgc3RhdGUsIF9USElTX0lQXyk7CisKKwkJYm1hLT5pZHgrKzsKKwkJZGFfbmV3ID0gdGVtcCArIHRlbXAyOwogCQlicmVhazsKIAogCWNhc2UgQk1BUF9MRUZUX0ZJTExJTkcgfCBCTUFQX0xFRlRfQ09OVElHIHwgQk1BUF9SSUdIVF9DT05USUc6CkBAIC0xMTE0LDkgKzg4Miw0MCBAQAogCQkgKi8KIAkJQVNTRVJUKDApOwogCX0KLQkqY3VycCA9IGN1cjsKKworCS8qIGNvbnZlcnQgdG8gYSBidHJlZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChibWEtPmlwLCBYRlNfREFUQV9GT1JLKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhibWEtPmlwLCBYRlNfREFUQV9GT1JLKSA+IGlmcC0+aWZfZXh0X21heCkgeworCQlpbnQJdG1wX2xvZ2ZsYWdzOwkvKiBwYXJ0aWFsIGxvZyBmbGFnIHJldHVybiB2YWwgKi8KKworCQlBU1NFUlQoYm1hLT5jdXIgPT0gTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShibWEtPnRwLCBibWEtPmlwLAorCQkJCWJtYS0+Zmlyc3RibG9jaywgYm1hLT5mbGlzdCwgJmJtYS0+Y3VyLAorCQkJCWRhX29sZCA+IDAsICZ0bXBfbG9nZmxhZ3MsIFhGU19EQVRBX0ZPUkspOworCQlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCX0KKworCS8qIGFkanVzdCBmb3IgY2hhbmdlcyBpbiByZXNlcnZlZCBkZWxheWVkIGluZGlyZWN0IGJsb2NrcyAqLworCWlmIChkYV9vbGQgfHwgZGFfbmV3KSB7CisJCXRlbXAgPSBkYV9uZXc7CisJCWlmIChibWEtPmN1cikKKwkJCXRlbXAgKz0gYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7CisJCUFTU0VSVCh0ZW1wIDw9IGRhX29sZCk7CisJCWlmICh0ZW1wIDwgZGFfb2xkKQorCQkJeGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKGJtYS0+aXAtPmlfbW91bnQsCisJCQkJCVhGU19TQlNfRkRCTE9DS1MsCisJCQkJCShpbnQ2NF90KShkYV9vbGQgLSB0ZW1wKSwgMCk7CisJfQorCisJLyogY2xlYXIgb3V0IHRoZSBhbGxvY2F0ZWQgZmllbGQsIGRvbmUgd2l0aCBpdCBub3cgaW4gYW55IGNhc2UuICovCisJaWYgKGJtYS0+Y3VyKQorCQlibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisKKwl4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoYm1hLT5jdXIsIGJtYS0+aXAsIFhGU19EQVRBX0ZPUkspOwogZG9uZToKLQkqbG9nZmxhZ3NwID0gcnZhbDsKKwlibWEtPmxvZ2ZsYWdzIHw9IHJ2YWw7CiAJcmV0dXJuIGVycm9yOwogI3VuZGVmCUxFRlQKICN1bmRlZglSSUdIVApAQCAtMTEyNCwxNSArOTIzLDE3IEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KLSAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KKyAqIENvbnZlcnQgYW4gdW53cml0dGVuIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KICAqLwogU1RBVElDIGludAkJCQkvKiBlcnJvciAqLwogeGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKIAl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwogCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCiAJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCiAJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCiAJaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwogewogCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yICovCkBAIC0xMTQ4LDE1ICs5NDksMjUgQEAKIAlpbnQJCQlydmFsPTA7CS8qIHJldHVybiB2YWx1ZSAobG9nZ2luZyBmbGFncykgKi8KIAlpbnQJCQlzdGF0ZSA9IDA7Lyogc3RhdGUgYml0cywgYWNjZXNzZWQgdGhydSBtYWNyb3MgKi8KIAorCSpsb2dmbGFnc3AgPSAwOworCisJY3VyID0gKmN1cnA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisKKwlBU1NFUlQoKmlkeCA+PSAwKTsKKwlBU1NFUlQoKmlkeCA8PSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHN0cnVjdCB4ZnNfYm1idF9yZWMpKTsKKwlBU1NFUlQoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2FkZF9leGxpc3QpOworCiAjZGVmaW5lCUxFRlQJCXJbMF0KICNkZWZpbmUJUklHSFQJCXJbMV0KICNkZWZpbmUJUFJFVgkJclsyXQorCiAJLyoKIAkgKiBTZXQgdXAgYSBidW5jaCBvZiB2YXJpYWJsZXMgdG8gbWFrZSB0aGUgdGVzdHMgc2ltcGxlci4KIAkgKi8KIAllcnJvciA9IDA7Ci0JY3VyID0gKmN1cnA7Ci0JaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CiAJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCk7CiAJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJlBSRVYpOwogCW5ld2V4dCA9IG5ldy0+YnJfc3RhdGU7CkBAIC0xNDA2LDEwICsxMjE3LDExIEBACiAJCQkJZ290byBkb25lOwogCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQogCQkJCWdvdG8gZG9uZTsKLQkJCWlmICh4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAogCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKIAkJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQsCi0JCQkJTEVGVC5icl9zdGF0ZSkpCisJCQkJTEVGVC5icl9zdGF0ZSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQl9CiAJCWJyZWFrOwpAQCAtMTYwNyw5ICsxNDE5LDI5IEBACiAJCSAqLwogCQlBU1NFUlQoMCk7CiAJfQotCSpjdXJwID0gY3VyOworCisJLyogY29udmVydCB0byBhIGJ0cmVlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCBYRlNfREFUQV9GT1JLKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhpcCwgWEZTX0RBVEFfRk9SSykgPiBpZnAtPmlmX2V4dF9tYXgpIHsKKwkJaW50CXRtcF9sb2dmbGFnczsJLyogcGFydGlhbCBsb2cgZmxhZyByZXR1cm4gdmFsICovCisKKwkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwgZmlyc3QsIGZsaXN0LCAmY3VyLAorCQkJCTAsICZ0bXBfbG9nZmxhZ3MsIFhGU19EQVRBX0ZPUkspOworCQkqbG9nZmxhZ3NwIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCX0KKworCS8qIGNsZWFyIG91dCB0aGUgYWxsb2NhdGVkIGZpZWxkLCBkb25lIHdpdGggaXQgbm93IGluIGFueSBjYXNlLiAqLworCWlmIChjdXIpIHsKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJKmN1cnAgPSBjdXI7CisJfQorCisJeGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKCpjdXJwLCBpcCwgWEZTX0RBVEFfRk9SSyk7CiBkb25lOgotCSpsb2dmbGFnc3AgPSBydmFsOworCSpsb2dmbGFnc3AgfD0gcnZhbDsKIAlyZXR1cm4gZXJyb3I7CiAjdW5kZWYJTEVGVAogI3VuZGVmCVJJR0hUCkBAIC0xNjE3LDE2ICsxNDQ5LDEzIEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKLSAqIHRvIGEgZGVsYXllZCBhbGxvY2F0aW9uLgorICogQ29udmVydCBhIGhvbGUgdG8gYSBkZWxheWVkIGFsbG9jYXRpb24uCiAgKi8KLS8qQVJHU1VTRUQqLwotU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworU1RBVElDIHZvaWQKIHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheSgKIAl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwogCXhmc19leHRudW1fdAkJKmlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldykJLyogbmV3IGRhdGEgdG8gYWRkIHRvIGZpbGUgZXh0ZW50cyAqLwogewogCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KIAl4ZnNfYm1idF9pcmVjX3QJCWxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCkBAIC0xNzYxLDIzICsxNTkwLDE3IEBACiAJCSAqIE5vdGhpbmcgdG8gZG8gZm9yIGRpc2sgcXVvdGEgYWNjb3VudGluZyBoZXJlLgogCQkgKi8KIAl9Ci0JKmxvZ2ZsYWdzcCA9IDA7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKLSAqIHRvIGEgcmVhbCBhbGxvY2F0aW9uLgorICogQ29udmVydCBhIGhvbGUgdG8gYSByZWFsIGFsbG9jYXRpb24uCiAgKi8KIFNUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KIHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9yZWFsKAotCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CQkqaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KLQl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCi0JeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBhZGQgdG8gZmlsZSBleHRlbnRzICovCi0JaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLwotCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJd2hpY2hmb3JrKQogeworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpuZXcgPSAmYm1hLT5nb3Q7CiAJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwogCWludAkJCWk7CS8qIHRlbXAgc3RhdGUgKi8KIAl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwb2ludGVyICovCkBAIC0xNzg2LDE5ICsxNjA5LDI2IEBACiAJaW50CQkJcnZhbD0wOwkvKiByZXR1cm4gdmFsdWUgKGxvZ2dpbmcgZmxhZ3MpICovCiAJaW50CQkJc3RhdGU7CS8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCiAKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCUFTU0VSVCgqaWR4IDw9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKLQlzdGF0ZSA9IDA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOwogCisJQVNTRVJUKGJtYS0+aWR4ID49IDApOworCUFTU0VSVChibWEtPmlkeCA8PSBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHN0cnVjdCB4ZnNfYm1idF9yZWMpKTsKKwlBU1NFUlQoIWlzbnVsbHN0YXJ0YmxvY2sobmV3LT5icl9zdGFydGJsb2NrKSk7CisJQVNTRVJUKCFibWEtPmN1ciB8fAorCSAgICAgICAhKGJtYS0+Y3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9XQVNERUwpKTsKKworCVhGU19TVEFUU19JTkMoeHNfYWRkX2V4bGlzdCk7CisKKwlzdGF0ZSA9IDA7CiAJaWYgKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKQogCQlzdGF0ZSB8PSBCTUFQX0FUVFJGT1JLOwogCiAJLyoKIAkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSBsZWZ0IG5laWdoYm9yLgogCSAqLwotCWlmICgqaWR4ID4gMCkgeworCWlmIChibWEtPmlkeCA+IDApIHsKIAkJc3RhdGUgfD0gQk1BUF9MRUZUX1ZBTElEOwotCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4IC0gMSksICZsZWZ0KTsKKwkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHggLSAxKSwgJmxlZnQpOwogCQlpZiAoaXNudWxsc3RhcnRibG9jayhsZWZ0LmJyX3N0YXJ0YmxvY2spKQogCQkJc3RhdGUgfD0gQk1BUF9MRUZUX0RFTEFZOwogCX0KQEAgLTE4MDcsOSArMTYzNyw5IEBACiAJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgY3VycmVudCB2YWx1ZS4KIAkgKiBOb3QgdHJ1ZSBpZiB3ZSdyZSBpbnNlcnRpbmcgaW50byB0aGUgImhvbGUiIGF0IGVvZi4KIAkgKi8KLQlpZiAoKmlkeCA8IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSB7CisJaWYgKGJtYS0+aWR4IDwgaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpIHsKIAkJc3RhdGUgfD0gQk1BUF9SSUdIVF9WQUxJRDsKLQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgKmlkeCksICZyaWdodCk7CisJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwgJnJpZ2h0KTsKIAkJaWYgKGlzbnVsbHN0YXJ0YmxvY2socmlnaHQuYnJfc3RhcnRibG9jaykpCiAJCQlzdGF0ZSB8PSBCTUFQX1JJR0hUX0RFTEFZOwogCX0KQEAgLTE4NDYsMzkgKzE2NzYsNDIgQEAKIAkJICogbGVmdCBhbmQgb24gdGhlIHJpZ2h0LgogCQkgKiBNZXJnZSBhbGwgdGhyZWUgaW50byBhIHNpbmdsZSBleHRlbnQgcmVjb3JkLgogCQkgKi8KLQkJLS0qaWR4OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQktLWJtYS0+aWR4OworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCiAJCQlyaWdodC5icl9ibG9ja2NvdW50KTsKLQkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoaXAsICppZHgsIHN0YXRlLCBfVEhJU19JUF8pOworCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CiAKLQkJeGZzX2lleHRfcmVtb3ZlKGlwLCAqaWR4ICsgMSwgMSwgc3RhdGUpOworCQl4ZnNfaWV4dF9yZW1vdmUoYm1hLT5pcCwgYm1hLT5pZHggKyAxLCAxLCBzdGF0ZSk7CiAKLQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCi0JCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgLSAxKTsKLQkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCVhGU19JRk9SS19ORVhUX1NFVChibWEtPmlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoYm1hLT5pcCwgd2hpY2hmb3JrKSAtIDEpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAotCQkJCQlyaWdodC5icl9zdGFydG9mZiwKLQkJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywKLQkJCQkJcmlnaHQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCWVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGJtYS0+Y3VyLCByaWdodC5icl9zdGFydG9mZiwKKwkJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywgcmlnaHQuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZG9uZSk7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2RlbGV0ZShjdXIsICZpKSkpCisJCQllcnJvciA9IHhmc19idHJlZV9kZWxldGUoYm1hLT5jdXIsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGRvbmUpOwotCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KGJtYS0+Y3VyLCAwLCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBsZWZ0LmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCiAJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKIAkJCQkJbGVmdC5icl9ibG9ja2NvdW50ICsKIAkJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCArCiAJCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LAotCQkJCQlsZWZ0LmJyX3N0YXRlKSkpCisJCQkJCWxlZnQuYnJfc3RhdGUpOworCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZG9uZTsKIAkJfQogCQlicmVhazsKQEAgLTE4ODksMjcgKzE3MjIsMjggQEAKIAkJICogb24gdGhlIGxlZnQuCiAJCSAqIE1lcmdlIHRoZSBuZXcgYWxsb2NhdGlvbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yLgogCQkgKi8KLQkJLS0qaWR4OwotCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKLQkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsICppZHgpLAorCQktLWJtYS0+aWR4OworCQl0cmFjZV94ZnNfYm1hcF9wcmVfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGJtYS0+aWR4KSwKIAkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7Ci0JCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGlwLCAqaWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKKwkJdHJhY2VfeGZzX2JtYXBfcG9zdF91cGRhdGUoYm1hLT5pcCwgYm1hLT5pZHgsIHN0YXRlLCBfVEhJU19JUF8pOwogCi0JCWlmIChjdXIgPT0gTlVMTCkgeworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKTsKIAkJfSBlbHNlIHsKIAkJCXJ2YWwgPSAwOwotCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsCi0JCQkJCWxlZnQuYnJfc3RhcnRvZmYsCi0JCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKLQkJCQkJbGVmdC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCisJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywgbGVmdC5icl9ibG9ja2NvdW50LAorCQkJCQkmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBsZWZ0LmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIGxlZnQuYnJfc3RhcnRvZmYsCiAJCQkJCWxlZnQuYnJfc3RhcnRibG9jaywKIAkJCQkJbGVmdC5icl9ibG9ja2NvdW50ICsKIAkJCQkJCW5ldy0+YnJfYmxvY2tjb3VudCwKLQkJCQkJbGVmdC5icl9zdGF0ZSkpKQorCQkJCQlsZWZ0LmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJYnJlYWs7CkBAIC0xOTIwLDI4ICsxNzU0LDMwIEBACiAJCSAqIG9uIHRoZSByaWdodC4KIAkJICogTWVyZ2UgdGhlIG5ldyBhbGxvY2F0aW9uIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yLgogCQkgKi8KLQkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7Ci0JCXhmc19ibWJ0X3NldF9hbGxmKHhmc19pZXh0X2dldF9leHQoaWZwLCAqaWR4KSwKKwkJdHJhY2VfeGZzX2JtYXBfcHJlX3VwZGF0ZShibWEtPmlwLCBibWEtPmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXhmc19ibWJ0X3NldF9hbGxmKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksCiAJCQluZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCiAJCQluZXctPmJyX2Jsb2NrY291bnQgKyByaWdodC5icl9ibG9ja2NvdW50LAogCQkJcmlnaHQuYnJfc3RhdGUpOwotCQl0cmFjZV94ZnNfYm1hcF9wb3N0X3VwZGF0ZShpcCwgKmlkeCwgc3RhdGUsIF9USElTX0lQXyk7CisJCXRyYWNlX3hmc19ibWFwX3Bvc3RfdXBkYXRlKGJtYS0+aXAsIGJtYS0+aWR4LCBzdGF0ZSwgX1RISVNfSVBfKTsKIAotCQlpZiAoY3VyID09IE5VTEwpIHsKKwkJaWYgKGJtYS0+Y3VyID09IE5VTEwpIHsKIAkJCXJ2YWwgPSB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gMDsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsCiAJCQkJCXJpZ2h0LmJyX3N0YXJ0b2ZmLAogCQkJCQlyaWdodC5icl9zdGFydGJsb2NrLAotCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQlyaWdodC5icl9ibG9ja2NvdW50LCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoYm1hLT5jdXIsIG5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKIAkJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsKIAkJCQkJCXJpZ2h0LmJyX2Jsb2NrY291bnQsCi0JCQkJCXJpZ2h0LmJyX3N0YXRlKSkpCisJCQkJCXJpZ2h0LmJyX3N0YXRlKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJYnJlYWs7CkBAIC0xOTUyLDI4ICsxNzg4LDUwIEBACiAJCSAqIHJlYWwgYWxsb2NhdGlvbi4KIAkJICogSW5zZXJ0IGEgbmV3IGVudHJ5LgogCQkgKi8KLQkJeGZzX2lleHRfaW5zZXJ0KGlwLCAqaWR4LCAxLCBuZXcsIHN0YXRlKTsKLQkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCi0JCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKyAxKTsKLQkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCXhmc19pZXh0X2luc2VydChibWEtPmlwLCBibWEtPmlkeCwgMSwgbmV3LCBzdGF0ZSk7CisJCVhGU19JRk9SS19ORVhUX1NFVChibWEtPmlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoYm1hLT5pcCwgd2hpY2hmb3JrKSArIDEpOworCQlpZiAoYm1hLT5jdXIgPT0gTlVMTCkgewogCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCB4ZnNfaWxvZ19mZXh0KHdoaWNoZm9yayk7CiAJCX0gZWxzZSB7CiAJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKLQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLAorCQkJZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoYm1hLT5jdXIsCiAJCQkJCW5ldy0+YnJfc3RhcnRvZmYsCiAJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKLQkJCQkJbmV3LT5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCQluZXctPmJyX2Jsb2NrY291bnQsICZpKTsKKwkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGRvbmU7CiAJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDAsIGRvbmUpOwotCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IG5ldy0+YnJfc3RhdGU7Ci0JCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luc2VydChjdXIsICZpKSkpCisJCQlibWEtPmN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBuZXctPmJyX3N0YXRlOworCQkJZXJyb3IgPSB4ZnNfYnRyZWVfaW5zZXJ0KGJtYS0+Y3VyLCAmaSk7CisJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBkb25lOwogCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBkb25lKTsKIAkJfQogCQlicmVhazsKIAl9CisKKwkvKiBjb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKFhGU19JRk9SS19GT1JNQVQoYm1hLT5pcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19ORVhURU5UUyhibWEtPmlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7CisJCWludAl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nIGZsYWcgcmV0dXJuIHZhbCAqLworCisJCUFTU0VSVChibWEtPmN1ciA9PSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGJtYS0+dHAsIGJtYS0+aXAsCisJCQkJYm1hLT5maXJzdGJsb2NrLCBibWEtPmZsaXN0LCAmYm1hLT5jdXIsCisJCQkJMCwgJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrKTsKKwkJYm1hLT5sb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBjbGVhciBvdXQgdGhlIGFsbG9jYXRlZCBmaWVsZCwgZG9uZSB3aXRoIGl0IG5vdyBpbiBhbnkgY2FzZS4gKi8KKwlpZiAoYm1hLT5jdXIpCisJCWJtYS0+Y3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKworCXhmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cyhibWEtPmN1ciwgYm1hLT5pcCwgd2hpY2hmb3JrKTsKIGRvbmU6Ci0JKmxvZ2ZsYWdzcCA9IHJ2YWw7CisJYm1hLT5sb2dmbGFncyB8PSBydmFsOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjE2MCwyNiArMjAxOCwyNiBAQAogCQlYRlNfRlNCX1RPX0FHQk5PKG1wLCB4KSA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKQogCiAJbXAgPSBhcC0+aXAtPmlfbW91bnQ7Ci0JbnVsbGZiID0gYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CisJbnVsbGZiID0gKmFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOwogCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYgYXAtPnVzZXJkYXRhOwotCWZiX2Fnbm8gPSBudWxsZmIgPyBOVUxMQUdOVU1CRVIgOiBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5maXJzdGJsb2NrKTsKKwlmYl9hZ25vID0gbnVsbGZiID8gTlVMTEFHTlVNQkVSIDogWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spOwogCS8qCiAJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKIAkgKiB0cnkgdG8gdXNlIGl0cyBsYXN0IGJsb2NrIGFzIG91ciBzdGFydGluZyBwb2ludC4KIAkgKi8KLQlpZiAoYXAtPmVvZiAmJiBhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCi0JICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykgJiYKLQkgICAgSVNWQUxJRChhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2sgKyBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQsCi0JCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKSB7Ci0JCWFwLT5ydmFsID0gYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50OworCWlmIChhcC0+ZW9mICYmIGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2LmJyX3N0YXJ0YmxvY2spICYmCisJICAgIElTVkFMSUQoYXAtPnByZXYuYnJfc3RhcnRibG9jayArIGFwLT5wcmV2LmJyX2Jsb2NrY291bnQsCisJCSAgICBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkgeworCQlhcC0+Ymxrbm8gPSBhcC0+cHJldi5icl9zdGFydGJsb2NrICsgYXAtPnByZXYuYnJfYmxvY2tjb3VudDsKIAkJLyoKIAkJICogQWRqdXN0IGZvciB0aGUgZ2FwIGJldHdlZW4gcHJldnAgYW5kIHVzLgogCQkgKi8KLQkJYWRqdXN0ID0gYXAtPm9mZiAtCi0JCQkoYXAtPnByZXZwLT5icl9zdGFydG9mZiArIGFwLT5wcmV2cC0+YnJfYmxvY2tjb3VudCk7CisJCWFkanVzdCA9IGFwLT5vZmZzZXQgLQorCQkJKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICsgYXAtPnByZXYuYnJfYmxvY2tjb3VudCk7CiAJCWlmIChhZGp1c3QgJiYKLQkJICAgIElTVkFMSUQoYXAtPnJ2YWwgKyBhZGp1c3QsIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpCi0JCQlhcC0+cnZhbCArPSBhZGp1c3Q7CisJCSAgICBJU1ZBTElEKGFwLT5ibGtubyArIGFkanVzdCwgYXAtPnByZXYuYnJfc3RhcnRibG9jaykpCisJCQlhcC0+Ymxrbm8gKz0gYWRqdXN0OwogCX0KIAkvKgogCSAqIElmIG5vdCBhdCBlb2YsIHRoZW4gY29tcGFyZSB0aGUgdHdvIG5laWdoYm9yIGJsb2Nrcy4KQEAgLTIxOTYsMTcgKzIwNTQsMTcgQEAKIAkJICogSWYgdGhlcmUncyBhIHByZXZpb3VzIChsZWZ0KSBibG9jaywgc2VsZWN0IGEgcmVxdWVzdGVkCiAJCSAqIHN0YXJ0IGJsb2NrIGJhc2VkIG9uIGl0LgogCQkgKi8KLQkJaWYgKGFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgIT0gTlVMTEZJTEVPRkYgJiYKLQkJICAgICFpc251bGxzdGFydGJsb2NrKGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykgJiYKLQkJICAgIChwcmV2Ym5vID0gYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsKLQkJCSAgICAgICBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQpICYmCi0JCSAgICBJU1ZBTElEKHByZXZibm8sIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpIHsKKwkJaWYgKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJCSAgICAhaXNudWxsc3RhcnRibG9jayhhcC0+cHJldi5icl9zdGFydGJsb2NrKSAmJgorCQkgICAgKHByZXZibm8gPSBhcC0+cHJldi5icl9zdGFydGJsb2NrICsKKwkJCSAgICAgICBhcC0+cHJldi5icl9ibG9ja2NvdW50KSAmJgorCQkgICAgSVNWQUxJRChwcmV2Ym5vLCBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkgewogCQkJLyoKIAkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gZW5kIG9mIHByZXZpb3VzIGJsb2NrLgogCQkJICovCi0JCQlhZGp1c3QgPSBwcmV2ZGlmZiA9IGFwLT5vZmYgLQotCQkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsKLQkJCQkgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKKwkJCWFkanVzdCA9IHByZXZkaWZmID0gYXAtPm9mZnNldCAtCisJCQkJKGFwLT5wcmV2LmJyX3N0YXJ0b2ZmICsKKwkJCQkgYXAtPnByZXYuYnJfYmxvY2tjb3VudCk7CiAJCQkvKgogCQkJICogRmlndXJlIHRoZSBzdGFydGJsb2NrIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBibG9jaydzCiAJCQkgKiBlbmQgYW5kIHRoZSBnYXAgc2l6ZS4KQEAgLTIyMTUsOSArMjA3Myw5IEBACiAJCQkgKiBhbGxvY2F0aW5nLCBvciB1c2luZyBpdCBnaXZlcyB1cyBhbiBpbnZhbGlkIGJsb2NrCiAJCQkgKiBudW1iZXIsIHRoZW4ganVzdCB1c2UgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYmxvY2suCiAJCQkgKi8KLQkJCWlmIChwcmV2ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmFsZW4gJiYKKwkJCWlmIChwcmV2ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmxlbmd0aCAmJgogCQkJICAgIElTVkFMSUQocHJldmJubyArIHByZXZkaWZmLAotCQkJCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKQorCQkJCSAgICBhcC0+cHJldi5icl9zdGFydGJsb2NrKSkKIAkJCQlwcmV2Ym5vICs9IGFkanVzdDsKIAkJCWVsc2UKIAkJCQlwcmV2ZGlmZiArPSBhZGp1c3Q7CkBAIC0yMjM4LDE2ICsyMDk2LDE2IEBACiAJCSAqIElmIHRoZXJlJ3MgYSBmb2xsb3dpbmcgKHJpZ2h0KSBibG9jaywgc2VsZWN0IGEgcmVxdWVzdGVkCiAJCSAqIHN0YXJ0IGJsb2NrIGJhc2VkIG9uIGl0LgogCQkgKi8KLQkJaWYgKCFpc251bGxzdGFydGJsb2NrKGFwLT5nb3RwLT5icl9zdGFydGJsb2NrKSkgeworCQlpZiAoIWlzbnVsbHN0YXJ0YmxvY2soYXAtPmdvdC5icl9zdGFydGJsb2NrKSkgewogCQkJLyoKIAkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gc3RhcnQgb2YgbmV4dCBibG9jay4KIAkJCSAqLwotCQkJYWRqdXN0ID0gZ290ZGlmZiA9IGFwLT5nb3RwLT5icl9zdGFydG9mZiAtIGFwLT5vZmY7CisJCQlhZGp1c3QgPSBnb3RkaWZmID0gYXAtPmdvdC5icl9zdGFydG9mZiAtIGFwLT5vZmZzZXQ7CiAJCQkvKgogCQkJICogRmlndXJlIHRoZSBzdGFydGJsb2NrIGJhc2VkIG9uIHRoZSBuZXh0IGJsb2NrJ3MKIAkJCSAqIHN0YXJ0IGFuZCB0aGUgZ2FwIHNpemUuCiAJCQkgKi8KLQkJCWdvdGJubyA9IGFwLT5nb3RwLT5icl9zdGFydGJsb2NrOworCQkJZ290Ym5vID0gYXAtPmdvdC5icl9zdGFydGJsb2NrOwogCQkJLyoKIAkJCSAqIEhldXJpc3RpYyEKIAkJCSAqIElmIHRoZSBnYXAgaXMgbGFyZ2UgcmVsYXRpdmUgdG8gdGhlIHBpZWNlIHdlJ3JlCkBAIC0yMjU1LDEyICsyMTEzLDEyIEBACiAJCQkgKiBudW1iZXIsIHRoZW4ganVzdCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrCiAJCQkgKiBvZmZzZXQgYnkgb3VyIGxlbmd0aC4KIAkJCSAqLwotCQkJaWYgKGdvdGRpZmYgPD0gWEZTX0FMTE9DX0dBUF9VTklUUyAqIGFwLT5hbGVuICYmCisJCQlpZiAoZ290ZGlmZiA8PSBYRlNfQUxMT0NfR0FQX1VOSVRTICogYXAtPmxlbmd0aCAmJgogCQkJICAgIElTVkFMSUQoZ290Ym5vIC0gZ290ZGlmZiwgZ290Ym5vKSkKIAkJCQlnb3Ribm8gLT0gYWRqdXN0OwotCQkJZWxzZSBpZiAoSVNWQUxJRChnb3Ribm8gLSBhcC0+YWxlbiwgZ290Ym5vKSkgewotCQkJCWdvdGJubyAtPSBhcC0+YWxlbjsKLQkJCQlnb3RkaWZmICs9IGFkanVzdCAtIGFwLT5hbGVuOworCQkJZWxzZSBpZiAoSVNWQUxJRChnb3Ribm8gLSBhcC0+bGVuZ3RoLCBnb3Ribm8pKSB7CisJCQkJZ290Ym5vIC09IGFwLT5sZW5ndGg7CisJCQkJZ290ZGlmZiArPSBhZGp1c3QgLSBhcC0+bGVuZ3RoOwogCQkJfSBlbHNlCiAJCQkJZ290ZGlmZiArPSBhZGp1c3Q7CiAJCQkvKgpAQCAtMjI3OCwxNCArMjEzNiwxNCBAQAogCQkJZ290Ym5vID0gTlVMTEZTQkxPQ0s7CiAJCS8qCiAJCSAqIElmIGJvdGggdmFsaWQsIHBpY2sgdGhlIGJldHRlciBvbmUsIGVsc2UgdGhlIG9ubHkgZ29vZAotCQkgKiBvbmUsIGVsc2UgYXAtPnJ2YWwgaXMgYWxyZWFkeSBzZXQgKHRvIDAgb3IgdGhlIGlub2RlIGJsb2NrKS4KKwkJICogb25lLCBlbHNlIGFwLT5ibGtubyBpcyBhbHJlYWR5IHNldCAodG8gMCBvciB0aGUgaW5vZGUgYmxvY2spLgogCQkgKi8KIAkJaWYgKHByZXZibm8gIT0gTlVMTEZTQkxPQ0sgJiYgZ290Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBwcmV2ZGlmZiA8PSBnb3RkaWZmID8gcHJldmJubyA6IGdvdGJubzsKKwkJCWFwLT5ibGtubyA9IHByZXZkaWZmIDw9IGdvdGRpZmYgPyBwcmV2Ym5vIDogZ290Ym5vOwogCQllbHNlIGlmIChwcmV2Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBwcmV2Ym5vOworCQkJYXAtPmJsa25vID0gcHJldmJubzsKIAkJZWxzZSBpZiAoZ290Ym5vICE9IE5VTExGU0JMT0NLKQotCQkJYXAtPnJ2YWwgPSBnb3Ribm87CisJCQlhcC0+Ymxrbm8gPSBnb3Ribm87CiAJfQogI3VuZGVmIElTVkFMSUQKIH0KQEAgLTIzMDUsMjQgKzIxNjMsMjQgQEAKIAltcCA9IGFwLT5pcC0+aV9tb3VudDsKIAlhbGlnbiA9IHhmc19nZXRfZXh0c3pfaGludChhcC0+aXApOwogCXByb2QgPSBhbGlnbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOwotCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwgYXAtPmdvdHAsIGFwLT5wcmV2cCwKKwllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsICZhcC0+Z290LCAmYXAtPnByZXYsCiAJCQkJCWFsaWduLCAxLCBhcC0+ZW9mLCAwLAotCQkJCQlhcC0+Y29udiwgJmFwLT5vZmYsICZhcC0+YWxlbik7CisJCQkJCWFwLT5jb252LCAmYXAtPm9mZnNldCwgJmFwLT5sZW5ndGgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCUFTU0VSVChhcC0+YWxlbik7Ci0JQVNTRVJUKGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CisJQVNTRVJUKGFwLT5sZW5ndGgpOworCUFTU0VSVChhcC0+bGVuZ3RoICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCk7CiAKIAkvKgogCSAqIElmIHRoZSBvZmZzZXQgJiBsZW5ndGggYXJlIG5vdCBwZXJmZWN0bHkgYWxpZ25lZAogCSAqIHRoZW4ga2lsbCBwcm9kLCBpdCB3aWxsIGp1c3QgZ2V0IHVzIGluIHRyb3VibGUuCiAJICovCi0JaWYgKGRvX21vZChhcC0+b2ZmLCBhbGlnbikgfHwgYXAtPmFsZW4gJSBhbGlnbikKKwlpZiAoZG9fbW9kKGFwLT5vZmZzZXQsIGFsaWduKSB8fCBhcC0+bGVuZ3RoICUgYWxpZ24pCiAJCXByb2QgPSAxOwogCS8qCiAJICogU2V0IHJhbGVuIHRvIGJlIHRoZSBhY3R1YWwgcmVxdWVzdGVkIGxlbmd0aCBpbiBydGV4dGVudHMuCiAJICovCi0JcmFsZW4gPSBhcC0+YWxlbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCXJhbGVuID0gYXAtPmxlbmd0aCAvIG1wLT5tX3NiLnNiX3JleHRzaXplOwogCS8qCiAJICogSWYgdGhlIG9sZCB2YWx1ZSB3YXMgY2xvc2UgZW5vdWdoIHRvIE1BWEVYVExFTiB0aGF0CiAJICogd2Ugcm91bmRlZCB1cCB0byBpdCwgY3V0IGl0IGJhY2sgc28gaXQncyB2YWxpZCBhZ2Fpbi4KQEAgLTIzMzcsMjEgKzIxOTUsMjEgQEAKIAkgKiBMb2NrIG91dCBvdGhlciBtb2RpZmljYXRpb25zIHRvIHRoZSBSVCBiaXRtYXAgaW5vZGUuCiAJICovCiAJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZihhcC0+dHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKGFwLT50cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCiAJICogSWYgaXQncyBhbiBhbGxvY2F0aW9uIHRvIGFuIGVtcHR5IGZpbGUgYXQgb2Zmc2V0IDAsCiAJICogcGljayBhbiBleHRlbnQgdGhhdCB3aWxsIHNwYWNlIHRoaW5ncyBvdXQgaW4gdGhlIHJ0IGFyZWEuCiAJICovCi0JaWYgKGFwLT5lb2YgJiYgYXAtPm9mZiA9PSAwKSB7CisJaWYgKGFwLT5lb2YgJiYgYXAtPm9mZnNldCA9PSAwKSB7CiAJCXhmc19ydGJsb2NrX3QgdW5pbml0aWFsaXplZF92YXIocnR4KTsgLyogcmVhbHRpbWUgZXh0ZW50IG5vICovCiAKIAkJZXJyb3IgPSB4ZnNfcnRwaWNrX2V4dGVudChtcCwgYXAtPnRwLCByYWxlbiwgJnJ0eCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKLQkJYXAtPnJ2YWwgPSBydHggKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJYXAtPmJsa25vID0gcnR4ICogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CiAJfSBlbHNlIHsKLQkJYXAtPnJ2YWwgPSAwOworCQlhcC0+Ymxrbm8gPSAwOwogCX0KIAogCXhmc19ibWFwX2FkamFjZW50KGFwKTsKQEAgLTIzNTksMjMgKzIyMTcsMjMgQEAKIAkvKgogCSAqIFJlYWx0aW1lIGFsbG9jYXRpb24sIGRvbmUgdGhyb3VnaCB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQuCiAJICovCi0JYXR5cGUgPSBhcC0+cnZhbCA9PSAwID8gIFhGU19BTExPQ1RZUEVfQU5ZX0FHIDogWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKLQlkb19kaXYoYXAtPnJ2YWwsIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKLQlydGIgPSBhcC0+cnZhbDsKLQlhcC0+YWxlbiA9IHJhbGVuOwotCWlmICgoZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQoYXAtPnRwLCBhcC0+cnZhbCwgMSwgYXAtPmFsZW4sCisJYXR5cGUgPSBhcC0+Ymxrbm8gPT0gMCA/ICBYRlNfQUxMT0NUWVBFX0FOWV9BRyA6IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJZG9fZGl2KGFwLT5ibGtubywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCXJ0YiA9IGFwLT5ibGtubzsKKwlhcC0+bGVuZ3RoID0gcmFsZW47CisJaWYgKChlcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudChhcC0+dHAsIGFwLT5ibGtubywgMSwgYXAtPmxlbmd0aCwKIAkJCQkmcmFsZW4sIGF0eXBlLCBhcC0+d2FzZGVsLCBwcm9kLCAmcnRiKSkpCiAJCXJldHVybiBlcnJvcjsKIAlpZiAocnRiID09IE5VTExGU0JMT0NLICYmIHByb2QgPiAxICYmCi0JICAgIChlcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudChhcC0+dHAsIGFwLT5ydmFsLCAxLAotCQkJCQkgICBhcC0+YWxlbiwgJnJhbGVuLCBhdHlwZSwKKwkgICAgKGVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50KGFwLT50cCwgYXAtPmJsa25vLCAxLAorCQkJCQkgICBhcC0+bGVuZ3RoLCAmcmFsZW4sIGF0eXBlLAogCQkJCQkgICBhcC0+d2FzZGVsLCAxLCAmcnRiKSkpCiAJCXJldHVybiBlcnJvcjsKLQlhcC0+cnZhbCA9IHJ0YjsKLQlpZiAoYXAtPnJ2YWwgIT0gTlVMTEZTQkxPQ0spIHsKLQkJYXAtPnJ2YWwgKj0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJYXAtPmJsa25vID0gcnRiOworCWlmIChhcC0+Ymxrbm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJYXAtPmJsa25vICo9IG1wLT5tX3NiLnNiX3JleHRzaXplOwogCQlyYWxlbiAqPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQkJYXAtPmFsZW4gPSByYWxlbjsKKwkJYXAtPmxlbmd0aCA9IHJhbGVuOwogCQlhcC0+aXAtPmlfZC5kaV9uYmxvY2tzICs9IHJhbGVuOwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKIAkJaWYgKGFwLT53YXNkZWwpCkBAIC0yMzg4LDcgKzIyNDYsNyBAQAogCQkJYXAtPndhc2RlbCA/IFhGU19UUkFOU19EUV9ERUxSVEJDT1VOVCA6CiAJCQkJCVhGU19UUkFOU19EUV9SVEJDT1VOVCwgKGxvbmcpIHJhbGVuKTsKIAl9IGVsc2UgewotCQlhcC0+YWxlbiA9IDA7CisJCWFwLT5sZW5ndGggPSAwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI1MDMsNyArMjM2MSw3IEBACiAJICogQUcgYXMgdGhlIHN0cmVhbSBtYXkgaGF2ZSBtb3ZlZC4KIAkgKi8KIAlpZiAoeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkKLQkJYXAtPnJ2YWwgPSBhcmdzLT5mc2JubyA9IFhGU19BR0JfVE9fRlNCKG1wLCBhZywgMCk7CisJCWFwLT5ibGtubyA9IGFyZ3MtPmZzYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjUyOCw1MiArMjM4Niw1MiBAQAogCW1wID0gYXAtPmlwLT5pX21vdW50OwogCWFsaWduID0gYXAtPnVzZXJkYXRhID8geGZzX2dldF9leHRzel9oaW50KGFwLT5pcCkgOiAwOwogCWlmICh1bmxpa2VseShhbGlnbikpIHsKLQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRzaXplX2FsaWduKG1wLCBhcC0+Z290cCwgYXAtPnByZXZwLAorCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsICZhcC0+Z290LCAmYXAtPnByZXYsCiAJCQkJCQlhbGlnbiwgMCwgYXAtPmVvZiwgMCwgYXAtPmNvbnYsCi0JCQkJCQkmYXAtPm9mZiwgJmFwLT5hbGVuKTsKKwkJCQkJCSZhcC0+b2Zmc2V0LCAmYXAtPmxlbmd0aCk7CiAJCUFTU0VSVCghZXJyb3IpOwotCQlBU1NFUlQoYXAtPmFsZW4pOworCQlBU1NFUlQoYXAtPmxlbmd0aCk7CiAJfQotCW51bGxmYiA9IGFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOwotCWZiX2Fnbm8gPSBudWxsZmIgPyBOVUxMQUdOVU1CRVIgOiBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5maXJzdGJsb2NrKTsKKwludWxsZmIgPSAqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CisJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgKmFwLT5maXJzdGJsb2NrKTsKIAlpZiAobnVsbGZiKSB7CiAJCWlmIChhcC0+dXNlcmRhdGEgJiYgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkgewogCQkJYWcgPSB4ZnNfZmlsZXN0cmVhbV9sb29rdXBfYWcoYXAtPmlwKTsKIAkJCWFnID0gKGFnICE9IE5VTExBR05VTUJFUikgPyBhZyA6IDA7Ci0JCQlhcC0+cnZhbCA9IFhGU19BR0JfVE9fRlNCKG1wLCBhZywgMCk7CisJCQlhcC0+Ymxrbm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWcsIDApOwogCQl9IGVsc2UgewotCQkJYXAtPnJ2YWwgPSBYRlNfSU5PX1RPX0ZTQihtcCwgYXAtPmlwLT5pX2lubyk7CisJCQlhcC0+Ymxrbm8gPSBYRlNfSU5PX1RPX0ZTQihtcCwgYXAtPmlwLT5pX2lubyk7CiAJCX0KIAl9IGVsc2UKLQkJYXAtPnJ2YWwgPSBhcC0+Zmlyc3RibG9jazsKKwkJYXAtPmJsa25vID0gKmFwLT5maXJzdGJsb2NrOwogCiAJeGZzX2JtYXBfYWRqYWNlbnQoYXApOwogCiAJLyoKLQkgKiBJZiBhbGxvd2VkLCB1c2UgYXAtPnJ2YWw7IG90aGVyd2lzZSBtdXN0IHVzZSBmaXJzdGJsb2NrIHNpbmNlCisJICogSWYgYWxsb3dlZCwgdXNlIGFwLT5ibGtubzsgb3RoZXJ3aXNlIG11c3QgdXNlIGZpcnN0YmxvY2sgc2luY2UKIAkgKiBpdCdzIGluIHRoZSByaWdodCBhbGxvY2F0aW9uIGdyb3VwLgogCSAqLwotCWlmIChudWxsZmIgfHwgWEZTX0ZTQl9UT19BR05PKG1wLCBhcC0+cnZhbCkgPT0gZmJfYWdubykKKwlpZiAobnVsbGZiIHx8IFhGU19GU0JfVE9fQUdOTyhtcCwgYXAtPmJsa25vKSA9PSBmYl9hZ25vKQogCQk7CiAJZWxzZQotCQlhcC0+cnZhbCA9IGFwLT5maXJzdGJsb2NrOworCQlhcC0+Ymxrbm8gPSAqYXAtPmZpcnN0YmxvY2s7CiAJLyoKIAkgKiBOb3JtYWwgYWxsb2NhdGlvbiwgZG9uZSB0aHJvdWdoIHhmc19hbGxvY192ZXh0ZW50LgogCSAqLwogCXRyeWFnYWluID0gaXNhbGlnbmVkID0gMDsKIAlhcmdzLnRwID0gYXAtPnRwOwogCWFyZ3MubXAgPSBtcDsKLQlhcmdzLmZzYm5vID0gYXAtPnJ2YWw7CisJYXJncy5mc2JubyA9IGFwLT5ibGtubzsKIAogCS8qIFRyaW0gdGhlIGFsbG9jYXRpb24gYmFjayB0byB0aGUgbWF4aW11bSBhbiBBRyBjYW4gZml0LiAqLwotCWFyZ3MubWF4bGVuID0gTUlOKGFwLT5hbGVuLCBYRlNfQUxMT0NfQUdfTUFYX1VTQUJMRShtcCkpOwotCWFyZ3MuZmlyc3RibG9jayA9IGFwLT5maXJzdGJsb2NrOworCWFyZ3MubWF4bGVuID0gTUlOKGFwLT5sZW5ndGgsIFhGU19BTExPQ19BR19NQVhfVVNBQkxFKG1wKSk7CisJYXJncy5maXJzdGJsb2NrID0gKmFwLT5maXJzdGJsb2NrOwogCWJsZW4gPSAwOwogCWlmIChudWxsZmIpIHsKIAkJZXJyb3IgPSB4ZnNfYm1hcF9idGFsbG9jX251bGxmYihhcCwgJmFyZ3MsICZibGVuKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwotCX0gZWxzZSBpZiAoYXAtPmxvdykgeworCX0gZWxzZSBpZiAoYXAtPmZsaXN0LT54YmZfbG93KSB7CiAJCWlmICh4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC0+aXApKQogCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKIAkJZWxzZQpAQCAtMjU4NywxNCArMjQ0NSwxNCBAQAogCS8qIGFwcGx5IGV4dGVudCBzaXplIGhpbnRzIGlmIG9idGFpbmVkIGVhcmxpZXIgKi8KIAlpZiAodW5saWtlbHkoYWxpZ24pKSB7CiAJCWFyZ3MucHJvZCA9IGFsaWduOwotCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdClkb19tb2QoYXAtPm9mZiwgYXJncy5wcm9kKSkpCisJCWlmICgoYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KWRvX21vZChhcC0+b2Zmc2V0LCBhcmdzLnByb2QpKSkKIAkJCWFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoYXJncy5wcm9kIC0gYXJncy5tb2QpOwogCX0gZWxzZSBpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgewogCQlhcmdzLnByb2QgPSAxOwogCQlhcmdzLm1vZCA9IDA7CiAJfSBlbHNlIHsKIAkJYXJncy5wcm9kID0gUEFHRV9DQUNIRV9TSVpFID4+IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOwotCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoZG9fbW9kKGFwLT5vZmYsIGFyZ3MucHJvZCkpKSkKKwkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGRvX21vZChhcC0+b2Zmc2V0LCBhcmdzLnByb2QpKSkpCiAJCQlhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGFyZ3MucHJvZCAtIGFyZ3MubW9kKTsKIAl9CiAJLyoKQEAgLTI2MDYsOCArMjQ2NCw4IEBACiAJICogaXMgPj0gdGhlIHN0cmlwZSB1bml0IGFuZCB0aGUgYWxsb2NhdGlvbiBvZmZzZXQgaXMKIAkgKiBhdCB0aGUgZW5kIG9mIGZpbGUuCiAJICovCi0JaWYgKCFhcC0+bG93ICYmIGFwLT5hZW9mKSB7Ci0JCWlmICghYXAtPm9mZikgeworCWlmICghYXAtPmZsaXN0LT54YmZfbG93ICYmIGFwLT5hZW9mKSB7CisJCWlmICghYXAtPm9mZnNldCkgewogCQkJYXJncy5hbGlnbm1lbnQgPSBtcC0+bV9kYWxpZ247CiAJCQlhdHlwZSA9IGFyZ3MudHlwZTsKIAkJCWlzYWxpZ25lZCA9IDE7CkBAIC0yNjYwLDcgKzI1MTgsNyBAQAogCQkgKiB0dXJuZWQgb24uCiAJCSAqLwogCQlhcmdzLnR5cGUgPSBhdHlwZTsKLQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQlhcmdzLmZzYm5vID0gYXAtPmJsa25vOwogCQlhcmdzLmFsaWdubWVudCA9IG1wLT5tX2RhbGlnbjsKIAkJYXJncy5taW5sZW4gPSBuZXh0bWlubGVuOwogCQlhcmdzLm1pbmFsaWduc2xvcCA9IDA7CkBAIC0yNjc0LDcgKzI1MzIsNyBAQAogCQkgKiB0cnkgYWdhaW4uCiAJCSAqLwogCQlhcmdzLnR5cGUgPSBhdHlwZTsKLQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQlhcmdzLmZzYm5vID0gYXAtPmJsa25vOwogCQlhcmdzLmFsaWdubWVudCA9IDA7CiAJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjY4Myw3ICsyNTQxLDcgQEAKIAkgICAgYXJncy5taW5sZW4gPiBhcC0+bWlubGVuKSB7CiAJCWFyZ3MubWlubGVuID0gYXAtPm1pbmxlbjsKIAkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87Ci0JCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJYXJncy5mc2JubyA9IGFwLT5ibGtubzsKIAkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCiAJCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMjY5NCwxMyArMjU1MiwyNiBAQAogCQlhcmdzLm1pbmxlZnQgPSAwOwogCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkKIAkJCXJldHVybiBlcnJvcjsKLQkJYXAtPmxvdyA9IDE7CisJCWFwLT5mbGlzdC0+eGJmX2xvdyA9IDE7CiAJfQogCWlmIChhcmdzLmZzYm5vICE9IE5VTExGU0JMT0NLKSB7Ci0JCWFwLT5maXJzdGJsb2NrID0gYXAtPnJ2YWwgPSBhcmdzLmZzYm5vOworCQkvKgorCQkgKiBjaGVjayB0aGUgYWxsb2NhdGlvbiBoYXBwZW5lZCBhdCB0aGUgc2FtZSBvciBoaWdoZXIgQUcgdGhhbgorCQkgKiB0aGUgZmlyc3QgYmxvY2sgdGhhdCB3YXMgYWxsb2NhdGVkLgorCQkgKi8KKwkJQVNTRVJUKCphcC0+Zmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAorCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spID09CisJCSAgICAgICBYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MuZnNibm8pIHx8CisJCSAgICAgICAoYXAtPmZsaXN0LT54YmZfbG93ICYmCisJCQlYRlNfRlNCX1RPX0FHTk8obXAsICphcC0+Zmlyc3RibG9jaykgPAorCQkJWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLmZzYm5vKSkpOworCisJCWFwLT5ibGtubyA9IGFyZ3MuZnNibm87CisJCWlmICgqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spCisJCQkqYXAtPmZpcnN0YmxvY2sgPSBhcmdzLmZzYm5vOwogCQlBU1NFUlQobnVsbGZiIHx8IGZiX2Fnbm8gPT0gYXJncy5hZ25vIHx8Ci0JCSAgICAgICAoYXAtPmxvdyAmJiBmYl9hZ25vIDwgYXJncy5hZ25vKSk7Ci0JCWFwLT5hbGVuID0gYXJncy5sZW47CisJCSAgICAgICAoYXAtPmZsaXN0LT54YmZfbG93ICYmIGZiX2Fnbm8gPCBhcmdzLmFnbm8pKTsKKwkJYXAtPmxlbmd0aCA9IGFyZ3MubGVuOwogCQlhcC0+aXAtPmlfZC5kaV9uYmxvY2tzICs9IGFyZ3MubGVuOwogCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKIAkJaWYgKGFwLT53YXNkZWwpCkBAIC0yNzE0LDggKzI1ODUsOCBAQAogCQkJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULAogCQkJKGxvbmcpIGFyZ3MubGVuKTsKIAl9IGVsc2UgewotCQlhcC0+cnZhbCA9IE5VTExGU0JMT0NLOwotCQlhcC0+YWxlbiA9IDA7CisJCWFwLT5ibGtubyA9IE5VTExGU0JMT0NLOworCQlhcC0+bGVuZ3RoID0gMDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTg5LDcgKzM0NjAsNyBAQAogCX0KIAlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAKIAlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CkBAIC0zNzgyLDE5ICszNjUzLDExIEBACiAgKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCiAgKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQogICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4gIFdlIG5ldmVyIGZyZWUgYW55IGV4dGVudHMgaW4KLSAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBtYWtlIHRoZSBmaXJzdAotICogdHJhbnNhY3Rpb24gYSBzeW5jaHJvbm91cyBvbmUgc28gdGhhdCB0aGUgcG9pbnRlcnMgdG8gdGhlIGRhdGEgYmVpbmcKLSAqIGJyb2tlbiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgYmUgcGVybWFuZW50IGJlZm9yZSB0aGUgZGF0YSBpcyBhY3R1YWxseQotICogZnJlZWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGJsb2NrcyBmcm9tIGJlaW5nIHJlYWxsb2NhdGVkCi0gKiBhbmQgd3JpdHRlbiB0byBiZWZvcmUgdGhlIGZyZWUgYW5kIHJlYWxsb2NhdGlvbiBhcmUgYWN0dWFsbHkgcGVybWFuZW50LgotICogV2UgZG8gbm90IGp1c3QgbWFrZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gc3luY2hyb25vdXMgaGVyZSwgYmVjYXVzZQotICogdGhlcmUgYXJlIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gZ2FpbiB0aGUgc2FtZSBwcm90ZWN0aW9uIGluIHNvbWUgY2FzZXMKLSAqIChzZWUgdGhlIGZpbGUgdHJ1bmNhdGlvbiBjb2RlKS4KKyAqIHRoZSBmaXJzdCB0cmFuc2FjdGlvbi4KICAqCiAgKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lCiAgKiBzdGFydGVkLCBhbmQgMCBvdGhlcndpc2UgaW4gdGhlIGNvbW1pdHRlZCBwYXJhbWV0ZXIuCiAgKi8KLS8qQVJHU1VTRUQqLwogaW50CQkJCQkJLyogZXJyb3IgKi8KIHhmc19ibWFwX2ZpbmlzaCgKIAl4ZnNfdHJhbnNfdAkJKip0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgYWRkciAqLwpAQCAtMzk5NCw0MiArMzg1NywxMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorU1RBVElDIGludAoreGZzX2JtYXBfbGFzdF9leHRlbnQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJaW50CQkJd2hpY2hmb3JrLAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpyZWMsCisJaW50CQkJKmlzX2VtcHR5KQoreworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaW50CQkJZXJyb3I7CisJaW50CQkJbmV4dGVudHM7CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCSppc19lbXB0eSA9IDE7CisJCXJldHVybiAwOworCX0KKworCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSksIHJlYyk7CisJKmlzX2VtcHR5ID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHRoZSBsYXN0IGlub2RlIGV4dGVudCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGFsbG9jYXRpb24gd2lsbCByZXN1bHQKKyAqIGluIGJsb2NrcyBiZWluZyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gV2hlbiB3ZSBhbGxvY2F0ZSBuZXcgZGF0YQorICogYmxvY2tzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgd2hpY2ggZG8gbm90IHN0YXJ0IGF0IHRoZSBwcmV2aW91cyBkYXRhIGJsb2NrLAorICogd2Ugd2lsbCB0cnkgdG8gYWxpZ24gdGhlIG5ldyBibG9ja3MgYXQgc3RyaXBlIHVuaXQgYm91bmRhcmllcy4KKyAqCisgKiBSZXR1cm5zIDAgaW4gYm1hLT5hZW9mIGlmIHRoZSBmaWxlIChmb3JrKSBpcyBlbXB0eSBhcyBhbnkgbmV3IHdyaXRlIHdpbGwgYmUKKyAqIGF0LCBvciBwYXN0IHRoZSBFT0YuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19ibWFwX2lzYWVvZigKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJd2hpY2hmb3JrKQoreworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXJlYzsKKwlpbnQJCQlpc19lbXB0eTsKKwlpbnQJCQllcnJvcjsKKworCWJtYS0+YWVvZiA9IDA7CisJZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X2V4dGVudChOVUxMLCBibWEtPmlwLCB3aGljaGZvcmssICZyZWMsCisJCQkJICAgICAmaXNfZW1wdHkpOworCWlmIChlcnJvciB8fCBpc19lbXB0eSkKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBhcmUgYWxsb2NhdGlvbiBvciBwYXN0IHRoZSBsYXN0IGV4dGVudCwgb3IgYXQgbGVhc3QgaW50bworCSAqIHRoZSBsYXN0IGRlbGF5ZWQgYWxsb2NhdGVkIGV4dGVudC4KKwkgKi8KKwlibWEtPmFlb2YgPSBibWEtPm9mZnNldCA+PSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudCB8fAorCQkoYm1hLT5vZmZzZXQgPj0gcmVjLmJyX3N0YXJ0b2ZmICYmCisJCSBpc251bGxzdGFydGJsb2NrKHJlYy5icl9zdGFydGJsb2NrKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdworICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeS4gIEFsbCBvZmZzZXRzIGFyZSBjb25zaWRlcmVkIG91dHNpZGUKKyAqIHRoZSBlbmQgb2YgZmlsZSBmb3IgYW4gZW1wdHkgZm9yaywgc28gMSBpcyByZXR1cm5lZCBpbiAqZW9mIGluIHRoYXQgY2FzZS4KKyAqLworaW50Cit4ZnNfYm1hcF9lb2YoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJZW5kb2ZmLAorCWludAkJCXdoaWNoZm9yaywKKwlpbnQJCQkqZW9mKQoreworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXJlYzsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0geGZzX2JtYXBfbGFzdF9leHRlbnQoTlVMTCwgaXAsIHdoaWNoZm9yaywgJnJlYywgZW9mKTsKKwlpZiAoZXJyb3IgfHwgKmVvZikKKwkJcmV0dXJuIGVycm9yOworCisJKmVvZiA9IGVuZG9mZiA+PSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudDsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayBwYXN0IGVvZiBpbgogICogdGhlIGZpbGUuICBUaGlzIGlzIG5vdCBiYXNlZCBvbiBpX3NpemUsIGl0IGlzIGJhc2VkIG9uIHRoZSBleHRlbnQgcmVjb3Jkcy4KICAqIFJldHVybnMgMCBmb3IgbG9jYWwgZmlsZXMsIGFzIHRoZXkgZG8gbm90IGhhdmUgZXh0ZW50IHJlY29yZHMuCiAgKi8KLWludAkJCQkJCS8qIGVycm9yICovCitpbnQKIHhmc19ibWFwX2xhc3Rfb2Zmc2V0KAotCXhmc190cmFuc190CSp0cCwJCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19maWxlb2ZmX3QJKmxhc3RfYmxvY2ssCQkvKiBsYXN0IGJsb2NrICovCi0JaW50CQl3aGljaGZvcmspCQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19maWxlb2ZmX3QJCSpsYXN0X2Jsb2NrLAorCWludAkJCXdoaWNoZm9yaykKIHsKLQl4ZnNfYm1idF9yZWNfaG9zdF90ICplcDsJCS8qIHBvaW50ZXIgdG8gbGFzdCBleHRlbnQgKi8KLQlpbnQJCWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLwotCXhmc19pZm9ya190CSppZnA7CQkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCi0JeGZzX2V4dG51bV90CW5leHRlbnRzOwkJLyogbnVtYmVyIG9mIGV4dGVudCBlbnRyaWVzICovCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJcmVjOworCWludAkJCWlzX2VtcHR5OworCWludAkJCWVycm9yOworCisJKmxhc3RfYmxvY2sgPSAwOworCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJldHVybiAwOwogCiAJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKLQkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCi0JICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykKIAkgICAgICAgcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7Ci0JCSpsYXN0X2Jsb2NrID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7Ci0JaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCi0JICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisKKwllcnJvciA9IHhmc19ibWFwX2xhc3RfZXh0ZW50KE5VTEwsIGlwLCB3aGljaGZvcmssICZyZWMsICZpc19lbXB0eSk7CisJaWYgKGVycm9yIHx8IGlzX2VtcHR5KQogCQlyZXR1cm4gZXJyb3I7Ci0JbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQlpZiAoIW5leHRlbnRzKSB7Ci0JCSpsYXN0X2Jsb2NrID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSk7Ci0JKmxhc3RfYmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXApICsgeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOworCisJKmxhc3RfYmxvY2sgPSByZWMuYnJfc3RhcnRvZmYgKyByZWMuYnJfYmxvY2tjb3VudDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDE1OSw3ICs0MTAyLDYgQEAKIAkJeGZzX2V4dG51bV90CW51bV9yZWNzOwogCQl4ZnNfZXh0bnVtX3QJc3RhcnQ7CiAKLQogCQludW1fcmVjcyA9IHhmc19idHJlZV9nZXRfbnVtcmVjcyhibG9jayk7CiAJCWlmICh1bmxpa2VseShpICsgbnVtX3JlY3MgPiByb29tKSkgewogCQkJQVNTRVJUKGkgKyBudW1fcmVjcyA8PSByb29tKTsKQEAgLTQyODIsOSArNDIyNCw4IEBACiAJCUFTU0VSVChpID09IDAgfHwKIAkJICAgICAgIG12YWxbaSAtIDFdLmJyX3N0YXJ0b2ZmICsgbXZhbFtpIC0gMV0uYnJfYmxvY2tjb3VudCA9PQogCQkgICAgICAgbXZhbFtpXS5icl9zdGFydG9mZik7Ci0JCWlmICgoZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUpICYmICEoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpKQotCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgICAgICBtdmFsW2ldLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOworCQlBU1NFUlQobXZhbFtpXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICAgICAgbXZhbFtpXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKTsKIAkJQVNTRVJUKG12YWxbaV0uYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNIHx8CiAJCSAgICAgICBtdmFsW2ldLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKIAl9CkBAIC00MjkzLDM5OSArNDIzNCwxNjggQEAKIAogCiAvKgotICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLgotICogRmlsZSByYW5nZSBpcyBnaXZlbiBieSB0aGUgYm5vL2xlbiBwYWlyLgotICogQWRkcyBibG9ja3MgdG8gZmlsZSBpZiBhIHdyaXRlICgiZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUiIHNldCkKLSAqIGludG8gYSBob2xlIG9yIHBhc3QgZW9mLgotICogT25seSBhbGxvY2F0ZXMgYmxvY2tzIGZyb20gYSBzaW5nbGUgYWxsb2NhdGlvbiBncm91cCwKLSAqIHRvIGF2b2lkIGxvY2tpbmcgcHJvYmxlbXMuCi0gKiBUaGUgcmV0dXJuZWQgdmFsdWUgaW4gImZpcnN0YmxvY2siIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gYSB0cmFuc2FjdGlvbgotICogbXVzdCBiZSByZW1lbWJlcmVkIGFuZCBwcmVzZW50ZWQgdG8gc3Vic2VxdWVudCBjYWxscyBpbiAiZmlyc3RibG9jayIuCi0gKiBBbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGlzIHN1cHBsaWVkIHRvCi0gKiB0aGUgZmlyc3QgY2FsbCBpbiAidG90YWwiOyBpZiBubyBhbGxvY2F0aW9uIGdyb3VwIGhhcyB0aGF0IG1hbnkgZnJlZQotICogYmxvY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBmYWlsIChyZXR1cm4gTlVMTEZTQkxPQ0sgaW4gImZpcnN0YmxvY2siKS4KKyAqIFRyaW0gdGhlIHJldHVybmVkIG1hcCB0byB0aGUgcmVxdWlyZWQgYm91bmRzCiAgKi8KLWludAkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwaSgKLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAlibm8sCQkvKiBzdGFydGluZyBmaWxlIG9mZnMuIG1hcHBlZCAqLwotCXhmc19maWxibGtzX3QJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCi0JaW50CQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KLQl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sKLQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2V4dGxlbl90CXRvdGFsLAkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCAqLwotCXhmc19ibWJ0X2lyZWNfdAkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLwotCWludAkJKm5tYXAsCQkvKiBpL286IG12YWwgc2l6ZS9jb3VudCAqLwotCXhmc19ibWFwX2ZyZWVfdAkqZmxpc3QpCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBpX3RyaW1fbWFwKAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpnb3QsCisJeGZzX2ZpbGVvZmZfdAkJKmJubywKKwl4ZnNfZmlsYmxrc190CQlsZW4sCisJeGZzX2ZpbGVvZmZfdAkJb2JubywKKwl4ZnNfZmlsZW9mZl90CQllbmQsCisJaW50CQkJbiwKKwlpbnQJCQlmbGFncykKIHsKLQl4ZnNfZnNibG9ja190CWFibm87CQkvKiBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyICovCi0JeGZzX2V4dGxlbl90CWFsZW47CQkvKiBhbGxvY2F0ZWQgZXh0ZW50IGxlbmd0aCAqLwotCXhmc19maWxlb2ZmX3QJYW9mZjsJCS8qIGFsbG9jYXRlZCBmaWxlIG9mZnNldCAqLwotCXhmc19ibWFsbG9jYV90CWJtYSA9IHsgMCB9OwkvKiBhcmdzIGZvciB4ZnNfYm1hcF9hbGxvYyAqLwotCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KLQl4ZnNfZmlsZW9mZl90CWVuZDsJCS8qIGVuZCBvZiBtYXBwZWQgZmlsZSByZWdpb24gKi8KLQlpbnQJCWVvZjsJCS8qIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIGV4dGVudHMgKi8KLQl4ZnNfYm1idF9yZWNfaG9zdF90ICplcDsJLyogZXh0ZW50IHJlY29yZCBwb2ludGVyICovCi0JaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwotCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KLQl4ZnNfZXh0bGVuX3QJaW5kbGVuOwkJLyogaW5kaXJlY3QgYmxvY2tzIGxlbmd0aCAqLwotCXhmc19leHRudW1fdAlsYXN0eDsJCS8qIGxhc3QgdXNlZnVsIGV4dGVudCBudW1iZXIgKi8KLQlpbnQJCWxvZ2ZsYWdzOwkvKiBmbGFncyBmb3IgdHJhbnNhY3Rpb24gbG9nZ2luZyAqLwotCXhmc19leHRsZW5fdAltaW5sZWZ0OwkvKiBtaW4gYmxvY2tzIGxlZnQgYWZ0ZXIgYWxsb2NhdGlvbiAqLwotCXhmc19leHRsZW5fdAltaW5sZW47CQkvKiBtaW4gYWxsb2NhdGlvbiBzaXplICovCi0JeGZzX21vdW50X3QJKm1wOwkJLyogeGZzIG1vdW50IHN0cnVjdHVyZSAqLwotCWludAkJbjsJCS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCi0JaW50CQluYWxsb2NzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBhbGxvYydkICovCi0JeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBmaWxlICovCi0JeGZzX2ZpbGVvZmZfdAlvYm5vOwkJLyogb2xkIGJsb2NrIG51bWJlciAob2Zmc2V0KSAqLwotCXhmc19ibWJ0X2lyZWNfdAlwcmV2OwkJLyogcHJldmlvdXMgZmlsZSBleHRlbnQgcmVjb3JkICovCi0JaW50CQl0bXBfbG9nZmxhZ3M7CS8qIHRlbXAgZmxhZ3MgaG9sZGVyICovCi0JaW50CQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0JY2hhcgkJaW5ob2xlOwkJLyogY3VycmVudCBsb2NhdGlvbiBpcyBob2xlIGluIGZpbGUgKi8KLQljaGFyCQl3YXNkZWxheTsJLyogb2xkIGV4dGVudCB3YXMgZGVsYXllZCAqLwotCWNoYXIJCXdyOwkJLyogdGhpcyBpcyBhIHdyaXRlIHJlcXVlc3QgKi8KLQljaGFyCQlydDsJCS8qIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlICovCi0jaWZkZWYgREVCVUcKLQl4ZnNfZmlsZW9mZl90CW9yaWdfYm5vOwkvKiBvcmlnaW5hbCBibG9jayBudW1iZXIgdmFsdWUgKi8KLQlpbnQJCW9yaWdfZmxhZ3M7CS8qIG9yaWdpbmFsIGZsYWdzIGFyZyB2YWx1ZSAqLwotCXhmc19maWxibGtzX3QJb3JpZ19sZW47CS8qIG9yaWdpbmFsIHZhbHVlIG9mIGxlbiBhcmcgKi8KLQl4ZnNfYm1idF9pcmVjX3QJKm9yaWdfbXZhbDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgbXZhbCAqLwotCWludAkJb3JpZ19ubWFwOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiAqbm1hcCAqLworCWlmICgoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSB8fAorCSAgICBnb3QtPmJyX3N0YXJ0b2ZmICsgZ290LT5icl9ibG9ja2NvdW50IDw9IG9ibm8pIHsKKwkJKm12YWwgPSAqZ290OworCQlpZiAoaXNudWxsc3RhcnRibG9jayhnb3QtPmJyX3N0YXJ0YmxvY2spKQorCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKKwkJcmV0dXJuOworCX0KIAotCW9yaWdfYm5vID0gYm5vOwotCW9yaWdfbGVuID0gbGVuOwotCW9yaWdfZmxhZ3MgPSBmbGFnczsKLQlvcmlnX212YWwgPSBtdmFsOwotCW9yaWdfbm1hcCA9ICpubWFwOwotI2VuZGlmCisJaWYgKG9ibm8gPiAqYm5vKQorCQkqYm5vID0gb2JubzsKKwlBU1NFUlQoKCpibm8gPj0gb2JubykgfHwgKG4gPT0gMCkpOworCUFTU0VSVCgqYm5vIDwgZW5kKTsKKwltdmFsLT5icl9zdGFydG9mZiA9ICpibm87CisJaWYgKGlzbnVsbHN0YXJ0YmxvY2soZ290LT5icl9zdGFydGJsb2NrKSkKKwkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKKwllbHNlCisJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBnb3QtPmJyX3N0YXJ0YmxvY2sgKworCQkJCQkoKmJubyAtIGdvdC0+YnJfc3RhcnRvZmYpOworCS8qCisJICogUmV0dXJuIHRoZSBtaW5pbXVtIG9mIHdoYXQgd2UgZ290IGFuZCB3aGF0IHdlIGFza2VkIGZvciBmb3IKKwkgKiB0aGUgbGVuZ3RoLiAgV2UgY2FuIHVzZSB0aGUgbGVuIHZhcmlhYmxlIGhlcmUgYmVjYXVzZSBpdCBpcworCSAqIG1vZGlmaWVkIGJlbG93IGFuZCB3ZSBjb3VsZCBoYXZlIGJlZW4gdGhlcmUgYmVmb3JlIGNvbWluZworCSAqIGhlcmUgaWYgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGFsbG9jYXRpb24gZGlkbid0IG92ZXJsYXAgd2hhdAorCSAqIHdhcyBhc2tlZCBmb3IuCisJICovCisJbXZhbC0+YnJfYmxvY2tjb3VudCA9IFhGU19GSUxCTEtTX01JTihlbmQgLSAqYm5vLAorCQkJZ290LT5icl9ibG9ja2NvdW50IC0gKCpibm8gLSBnb3QtPmJyX3N0YXJ0b2ZmKSk7CisJbXZhbC0+YnJfc3RhdGUgPSBnb3QtPmJyX3N0YXRlOworCUFTU0VSVChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbik7CisJcmV0dXJuOworfQorCisvKgorICogVXBkYXRlIGFuZCB2YWxpZGF0ZSB0aGUgZXh0ZW50IG1hcCB0byByZXR1cm4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwaV91cGRhdGVfbWFwKAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSoqbWFwLAorCXhmc19maWxlb2ZmX3QJCSpibm8sCisJeGZzX2ZpbGJsa3NfdAkJKmxlbiwKKwl4ZnNfZmlsZW9mZl90CQlvYm5vLAorCXhmc19maWxlb2ZmX3QJCWVuZCwKKwlpbnQJCQkqbiwKKwlpbnQJCQlmbGFncykKK3sKKwl4ZnNfYm1idF9pcmVjX3QJKm12YWwgPSAqbWFwOworCisJQVNTRVJUKChmbGFncyAmIFhGU19CTUFQSV9FTlRJUkUpIHx8CisJICAgICAgICgobXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50KSA8PSBlbmQpKTsKKwlBU1NFUlQoKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgfHwgKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gKmxlbikgfHwKKwkgICAgICAgKG12YWwtPmJyX3N0YXJ0b2ZmIDwgb2JubykpOworCisJKmJubyA9IG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkqbGVuID0gZW5kIC0gKmJubzsKKwlpZiAoKm4gPiAwICYmIG12YWwtPmJyX3N0YXJ0b2ZmID09IG12YWxbLTFdLmJyX3N0YXJ0b2ZmKSB7CisJCS8qIHVwZGF0ZSBwcmV2aW91cyBtYXAgd2l0aCBuZXcgaW5mb3JtYXRpb24gKi8KKwkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gbXZhbFstMV0uYnJfc3RhcnRibG9jayk7CisJCUFTU0VSVChtdmFsLT5icl9ibG9ja2NvdW50ID4gbXZhbFstMV0uYnJfYmxvY2tjb3VudCk7CisJCUFTU0VSVChtdmFsLT5icl9zdGF0ZSA9PSBtdmFsWy0xXS5icl9zdGF0ZSk7CisJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQltdmFsWy0xXS5icl9zdGF0ZSA9IG12YWwtPmJyX3N0YXRlOworCX0gZWxzZSBpZiAoKm4gPiAwICYmIG12YWwtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLICYmCisJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLICYmCisJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKKwkJICAgbXZhbC0+YnJfc3RhcnRibG9jayA9PSBtdmFsWy0xXS5icl9zdGFydGJsb2NrICsKKwkJCQkJICBtdmFsWy0xXS5icl9ibG9ja2NvdW50ICYmCisJCSAgICgoZmxhZ3MgJiBYRlNfQk1BUElfSUdTVEFURSkgfHwKKwkJCW12YWxbLTFdLmJyX3N0YXRlID09IG12YWwtPmJyX3N0YXRlKSkgeworCQlBU1NFUlQobXZhbC0+YnJfc3RhcnRvZmYgPT0KKwkJICAgICAgIG12YWxbLTFdLmJyX3N0YXJ0b2ZmICsgbXZhbFstMV0uYnJfYmxvY2tjb3VudCk7CisJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKKwl9IGVsc2UgaWYgKCpuID4gMCAmJgorCQkgICBtdmFsLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICBtdmFsWy0xXS5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgorCQkgICBtdmFsLT5icl9zdGFydG9mZiA9PQorCQkgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpIHsKKwkJbXZhbFstMV0uYnJfYmxvY2tjb3VudCArPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQltdmFsWy0xXS5icl9zdGF0ZSA9IG12YWwtPmJyX3N0YXRlOworCX0gZWxzZSBpZiAoISgoKm4gPT0gMCkgJiYKKwkJICAgICAoKG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudCkgPD0KKwkJICAgICAgb2JubykpKSB7CisJCW12YWwrKzsKKwkJKCpuKSsrOworCX0KKwkqbWFwID0gbXZhbDsKK30KKworLyoKKyAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2NrcyB3aXRob3V0IGFsbG9jYXRpb24uCisgKi8KK2ludAoreGZzX2JtYXBpX3JlYWQoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwKKwlpbnQJCQkqbm1hcCwKKwlpbnQJCQlmbGFncykKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcDsKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlnb3Q7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJcHJldjsKKwl4ZnNfZmlsZW9mZl90CQlvYm5vOworCXhmc19maWxlb2ZmX3QJCWVuZDsKKwl4ZnNfZXh0bnVtX3QJCWxhc3R4OworCWludAkJCWVycm9yOworCWludAkJCWVvZjsKKwlpbnQJCQluID0gMDsKKwlpbnQJCQl3aGljaGZvcmsgPSAoZmxhZ3MgJiBYRlNfQk1BUElfQVRUUkZPUkspID8KKwkJCQkJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOworCiAJQVNTRVJUKCpubWFwID49IDEpOwotCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCB8fCAhKGZsYWdzICYgWEZTX0JNQVBJX1dSSVRFKSk7Ci0Jd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/Ci0JCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOwotCW1wID0gaXAtPmlfbW91bnQ7CisJQVNTRVJUKCEoZmxhZ3MgJiB+KFhGU19CTUFQSV9BVFRSRk9SS3xYRlNfQk1BUElfRU5USVJFfAorCQkJICAgWEZTX0JNQVBJX0lHU1RBVEUpKSk7CisKIAlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoCiAJICAgIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKLQkgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpLAorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSksCiAJICAgICBtcCwgWEZTX0VSUlRBR19CTUFQSUZPUk1BVCwgWEZTX1JBTkRPTV9CTUFQSUZPUk1BVCkpKSB7Ci0JCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwaSIsIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3JlYWQiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CiAJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKIAl9CisKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKLQlydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOworCiAJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKIAlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CiAJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7Ci0JaWYgKCh3ciA9IChmbGFncyAmIFhGU19CTUFQSV9XUklURSkpICE9IDApCi0JCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOwotCWVsc2UKLQkJWEZTX1NUQVRTX0lOQyh4c19ibGtfbWFwcik7Ci0JLyoKLQkgKiBJR1NUQVRFIGZsYWcgaXMgdXNlZCB0byBjb21iaW5lIGV4dGVudHMgd2hpY2gKLQkgKiBkaWZmZXIgb25seSBkdWUgdG8gdGhlIHN0YXRlIG9mIHRoZSBleHRlbnRzLgotCSAqIFRoaXMgdGVjaG5pcXVlIGlzIHVzZWQgZnJvbSB4ZnNfZ2V0Ym1hcCgpCi0JICogd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IHdpc2ggdG8gc2VlIHRoZQotCSAqIHNlcGFyYXRpb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KLQkgKgotCSAqIFRoaXMgdGVjaG5pcXVlIGlzIGFsc28gdXNlZCB3aGVuIHdyaXRpbmcgYQotCSAqIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBwYXJ0aWFsbHkgd3JpdHRlbiwKLQkgKiAodXN1YWxseSBieSBiZWluZyBmbHVzaGVkIGR1cmluZyBhIGNodW5rcmVhZCksCi0JICogdG8gZW5zdXJlIG9uZSB3cml0ZSB0YWtlcyBwbGFjZS4gVGhpcyBhbHNvCi0JICogcHJldmVudHMgYSBjaGFuZ2UgaW4gdGhlIHhmcyBpbm9kZSBleHRlbnRzIGF0Ci0JICogdGhpcyB0aW1lLCBpbnRlbnRpb25hbGx5LiBUaGlzIGNoYW5nZSBvY2N1cnMKLQkgKiBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24sIGluCi0JICogeGZzX3N0cmF0X2NvbXAoKSwgd2hlcmUgdGhlIHhmc19ibWFwaSgpIGNhbGwKLQkgKiBpcyB0cmFuc2FjdGlvbmVkLCBhbmQgdGhlIGV4dGVudHMgY29tYmluZWQuCi0JICovCi0JaWYgKChmbGFncyAmIFhGU19CTUFQSV9JR1NUQVRFKSAmJiB3cikJLyogaWYgd3JpdGluZyB1bndyaXR0ZW4gc3BhY2UgKi8KLQkJd3IgPSAwOwkJCQkvKiBubyBhbGxvY2F0aW9ucyBhcmUgYWxsb3dlZCAqLwotCUFTU0VSVCh3ciB8fCAhKGZsYWdzICYgWEZTX0JNQVBJX0RFTEFZKSk7Ci0JbG9nZmxhZ3MgPSAwOwotCW5hbGxvY3MgPSAwOwotCWN1ciA9IE5VTEw7Ci0JaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKLQkJQVNTRVJUKHdyICYmIHRwKTsKLQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2xvY2FsX3RvX2V4dGVudHModHAsIGlwLAotCQkJCWZpcnN0YmxvY2ssIHRvdGFsLCAmbG9nZmxhZ3MsIHdoaWNoZm9yaykpKQotCQkJZ290byBlcnJvcjA7CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOwogCX0KLQlpZiAod3IgJiYgKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spIHsKLQkJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpCi0JCQltaW5sZWZ0ID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKLQkJZWxzZQotCQkJbWlubGVmdCA9IDE7Ci0JfSBlbHNlCi0JCW1pbmxlZnQgPSAwOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQotCQlnb3RvIGVycm9yMDsKLQllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAotCQkmcHJldik7Ci0JbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQluID0gMDsKKworCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LCAmcHJldik7CiAJZW5kID0gYm5vICsgbGVuOwogCW9ibm8gPSBibm87Ci0JYm1hLmlwID0gTlVMTDsKIAogCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7Ci0JCS8qCi0JCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKLQkJICogdXAgdG8gZW5kLgotCQkgKi8KLQkJaWYgKGVvZiAmJiAhd3IpCisJCS8qIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUgdXAgdG8gZW5kLiAqLworCQlpZiAoZW9mKQogCQkJZ290LmJyX3N0YXJ0b2ZmID0gZW5kOwotCQlpbmhvbGUgPSBlb2YgfHwgZ290LmJyX3N0YXJ0b2ZmID4gYm5vOwotCQl3YXNkZWxheSA9IHdyICYmICFpbmhvbGUgJiYgIShmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkgJiYKLQkJCWlzbnVsbHN0YXJ0YmxvY2soZ290LmJyX3N0YXJ0YmxvY2spOwotCQkvKgotCQkgKiBGaXJzdCwgZGVhbCB3aXRoIHRoZSBob2xlIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHNwYWNlCi0JCSAqIHRoYXQgd2UgZm91bmQsIGlmIGFueS4KLQkJICovCi0JCWlmICh3ciAmJiAoaW5ob2xlIHx8IHdhc2RlbGF5KSkgewotCQkJLyoKLQkJCSAqIEZvciB0aGUgd2FzZGVsYXkgY2FzZSwgd2UgY291bGQgYWxzbyBqdXN0Ci0JCQkgKiBhbGxvY2F0ZSB0aGUgc3R1ZmYgYXNrZWQgZm9yIGluIHRoaXMgYm1hcCBjYWxsCi0JCQkgKiBidXQgdGhhdCB3b3VsZG4ndCBiZSBhcyBnb29kLgotCQkJICovCi0JCQlpZiAod2FzZGVsYXkpIHsKLQkJCQlhbGVuID0gKHhmc19leHRsZW5fdClnb3QuYnJfYmxvY2tjb3VudDsKLQkJCQlhb2ZmID0gZ290LmJyX3N0YXJ0b2ZmOwotCQkJCWlmIChsYXN0eCAhPSBOVUxMRVhUTlVNICYmIGxhc3R4KSB7Ci0JCQkJCWVwID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIGxhc3R4IC0gMSk7Ci0JCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZwcmV2KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KQotCQkJCQlYRlNfRklMQkxLU19NSU4obGVuLCBNQVhFWFRMRU4pOwotCQkJCWlmICghZW9mKQotCQkJCQlhbGVuID0gKHhmc19leHRsZW5fdCkKLQkJCQkJCVhGU19GSUxCTEtTX01JTihhbGVuLAotCQkJCQkJCWdvdC5icl9zdGFydG9mZiAtIGJubyk7Ci0JCQkJYW9mZiA9IGJubzsKLQkJCX0KLQkJCW1pbmxlbiA9IChmbGFncyAmIFhGU19CTUFQSV9DT05USUcpID8gYWxlbiA6IDE7Ci0JCQlpZiAoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpIHsKLQkJCQl4ZnNfZXh0bGVuX3QJZXh0c3o7Ci0KLQkJCQkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KLQkJCQlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7Ci0JCQkJaWYgKGV4dHN6KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIG1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgYSBzaW5nbGUKLQkJCQkJICogZXh0ZW50IGxlbmd0aCB3aGVuIHdlIGFsaWduIHRoZQotCQkJCQkgKiBleHRlbnQgYnkgcmVkdWNpbmcgbGVuZ3RoIHdlIGFyZQotCQkJCQkgKiBnb2luZyB0byBhbGxvY2F0ZSBieSB0aGUgbWF4aW11bQotCQkJCQkgKiBhbW91bnQgZXh0ZW50IHNpemUgYWxpZ21lbnQgbWF5Ci0JCQkJCSAqIHJlcXVpcmUuCi0JCQkJCSAqLwotCQkJCQlhbGVuID0gWEZTX0ZJTEJMS1NfTUlOKGxlbiwKLQkJCQkJCSAgIE1BWEVYVExFTiAtICgyICogZXh0c3ogLSAxKSk7Ci0JCQkJCWVycm9yID0geGZzX2JtYXBfZXh0c2l6ZV9hbGlnbihtcCwKLQkJCQkJCQkmZ290LCAmcHJldiwgZXh0c3osCi0JCQkJCQkJcnQsIGVvZiwKLQkJCQkJCQlmbGFncyZYRlNfQk1BUElfREVMQVksCi0JCQkJCQkJZmxhZ3MmWEZTX0JNQVBJX0NPTlZFUlQsCi0JCQkJCQkJJmFvZmYsICZhbGVuKTsKLQkJCQkJQVNTRVJUKCFlcnJvcik7Ci0JCQkJfQotCi0JCQkJaWYgKHJ0KQotCQkJCQlleHRzeiA9IGFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKLQotCQkJCS8qCi0JCQkJICogTWFrZSBhIHRyYW5zYWN0aW9uLWxlc3MgcXVvdGEgcmVzZXJ2YXRpb24gZm9yCi0JCQkJICogZGVsYXllZCBhbGxvY2F0aW9uIGJsb2Nrcy4gVGhpcyBudW1iZXIgZ2V0cwotCQkJCSAqIGFkanVzdGVkIGxhdGVyLiAgV2UgcmV0dXJuIGlmIHdlIGhhdmVuJ3QKLQkJCQkgKiBhbGxvY2F0ZWQgYmxvY2tzIGFscmVhZHkgaW5zaWRlIHRoaXMgbG9vcC4KLQkJCQkgKi8KLQkJCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlX3F1b3RhX25ibGtzKAotCQkJCQkJTlVMTCwgaXAsIChsb25nKWFsZW4sIDAsCi0JCQkJCQlydCA/IFhGU19RTU9QVF9SRVNfUlRCTEtTIDoKLQkJCQkJCSAgICAgWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKG4gPT0gMCkgewotCQkJCQkJKm5tYXAgPSAwOwotCQkJCQkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKLQkJCQkJCXJldHVybiBlcnJvcjsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFNwbGl0IGNoYW5naW5nIHNiIGZvciBhbGVuIGFuZCBpbmRsZW4gc2luY2UKLQkJCQkgKiB0aGV5IGNvdWxkIGJlIGNvbWluZyBmcm9tIGRpZmZlcmVudCBwbGFjZXMuCi0JCQkJICovCi0JCQkJaW5kbGVuID0gKHhmc19leHRsZW5fdCkKLQkJCQkJeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCBhbGVuKTsKLQkJCQlBU1NFUlQoaW5kbGVuID4gMCk7Ci0KLQkJCQlpZiAocnQpIHsKLQkJCQkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwKLQkJCQkJCQlYRlNfU0JTX0ZSRVhURU5UUywKLQkJCQkJCQktKChpbnQ2NF90KWV4dHN6KSwgMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3IgPSB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsCi0JCQkJCQkJWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCQktKChpbnQ2NF90KWFsZW4pLCAwKTsKLQkJCQl9Ci0JCQkJaWYgKCFlcnJvcikgewotCQkJCQllcnJvciA9IHhmc19pY3NiX21vZGlmeV9jb3VudGVycyhtcCwKLQkJCQkJCQlYRlNfU0JTX0ZEQkxPQ0tTLAotCQkJCQkJCS0oKGludDY0X3QpaW5kbGVuKSwgMCk7Ci0JCQkJCWlmIChlcnJvciAmJiBydCkKLQkJCQkJCXhmc19tb2RfaW5jb3JlX3NiKG1wLAotCQkJCQkJCVhGU19TQlNfRlJFWFRFTlRTLAotCQkJCQkJCShpbnQ2NF90KWV4dHN6LCAwKTsKLQkJCQkJZWxzZSBpZiAoZXJyb3IpCi0JCQkJCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsCi0JCQkJCQkJWEZTX1NCU19GREJMT0NLUywKLQkJCQkJCQkoaW50NjRfdClhbGVuLCAwKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJaWYgKFhGU19JU19RVU9UQV9PTihtcCkpCi0JCQkJCQkvKiB1bnJlc2VydmUgdGhlIGJsb2NrcyBub3cgKi8KLQkJCQkJCSh2b2lkKQotCQkJCQkJeGZzX3RyYW5zX3VucmVzZXJ2ZV9xdW90YV9uYmxrcygKLQkJCQkJCQlOVUxMLCBpcCwKLQkJCQkJCQkobG9uZylhbGVuLCAwLCBydCA/Ci0JCQkJCQkJWEZTX1FNT1BUX1JFU19SVEJMS1MgOgotCQkJCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlwLT5pX2RlbGF5ZWRfYmxrcyArPSBhbGVuOwotCQkJCWFibm8gPSBudWxsc3RhcnRibG9jayhpbmRsZW4pOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIElmIGZpcnN0IHRpbWUsIGFsbG9jYXRlIGFuZCBmaWxsIGluCi0JCQkJICogb25jZS1vbmx5IGJtYSBmaWVsZHMuCi0JCQkJICovCi0JCQkJaWYgKGJtYS5pcCA9PSBOVUxMKSB7Ci0JCQkJCWJtYS50cCA9IHRwOwotCQkJCQlibWEuaXAgPSBpcDsKLQkJCQkJYm1hLnByZXZwID0gJnByZXY7Ci0JCQkJCWJtYS5nb3RwID0gJmdvdDsKLQkJCQkJYm1hLnRvdGFsID0gdG90YWw7Ci0JCQkJCWJtYS51c2VyZGF0YSA9IDA7Ci0JCQkJfQotCQkJCS8qIEluZGljYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIgZGF0YQotCQkJCSAqIGluIHRoZSBmaWxlLCBvciBqdXN0IGFueSB1c2VyIGRhdGEuCi0JCQkJICovCi0JCQkJaWYgKCEoZmxhZ3MgJiBYRlNfQk1BUElfTUVUQURBVEEpKSB7Ci0JCQkJCWJtYS51c2VyZGF0YSA9IChhb2ZmID09IDApID8KLQkJCQkJCVhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSA6Ci0JCQkJCQlYRlNfQUxMT0NfVVNFUkRBVEE7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogRmlsbCBpbiBjaGFuZ2VhYmxlIGJtYSBmaWVsZHMuCi0JCQkJICovCi0JCQkJYm1hLmVvZiA9IGVvZjsKLQkJCQlibWEuZmlyc3RibG9jayA9ICpmaXJzdGJsb2NrOwotCQkJCWJtYS5hbGVuID0gYWxlbjsKLQkJCQlibWEub2ZmID0gYW9mZjsKLQkJCQlibWEuY29udiA9ICEhKGZsYWdzICYgWEZTX0JNQVBJX0NPTlZFUlQpOwotCQkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKLQkJCQlibWEubWlubGVuID0gbWlubGVuOwotCQkJCWJtYS5sb3cgPSBmbGlzdC0+eGJmX2xvdzsKLQkJCQlibWEubWlubGVmdCA9IG1pbmxlZnQ7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IHdhbnQgdG8gZG8gdGhlIGFsaWdubWVudCBhdCB0aGUKLQkJCQkgKiBlb2YgaWYgaXQgaXMgdXNlcmRhdGEgYW5kIGFsbG9jYXRpb24gbGVuZ3RoCi0JCQkJICogaXMgbGFyZ2VyIHRoYW4gYSBzdHJpcGUgdW5pdC4KLQkJCQkgKi8KLQkJCQlpZiAobXAtPm1fZGFsaWduICYmIGFsZW4gPj0gbXAtPm1fZGFsaWduICYmCi0JCQkJICAgICghKGZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSkgJiYKLQkJCQkgICAgKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSkgewotCQkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfaXNhZW9mKGlwLCBhb2ZmLAotCQkJCQkJCXdoaWNoZm9yaywgJmJtYS5hZW9mKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQl9IGVsc2UKLQkJCQkJYm1hLmFlb2YgPSAwOwotCQkJCS8qCi0JCQkJICogQ2FsbCBhbGxvY2F0b3IuCi0JCQkJICovCi0JCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FsbG9jKCZibWEpKSkKLQkJCQkJZ290byBlcnJvcjA7Ci0JCQkJLyoKLQkJCQkgKiBDb3B5IG91dCByZXN1bHQgZmllbGRzLgotCQkJCSAqLwotCQkJCWFibm8gPSBibWEucnZhbDsKLQkJCQlpZiAoKGZsaXN0LT54YmZfbG93ID0gYm1hLmxvdykpCi0JCQkJCW1pbmxlZnQgPSAwOwotCQkJCWFsZW4gPSBibWEuYWxlbjsKLQkJCQlhb2ZmID0gYm1hLm9mZjsKLQkJCQlBU1NFUlQoKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0sgfHwKLQkJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgPT0KLQkJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCBibWEuZmlyc3RibG9jaykgfHwKLQkJCQkgICAgICAgKGZsaXN0LT54YmZfbG93ICYmCi0JCQkJCVhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spIDwKLQkJCQkJWEZTX0ZTQl9UT19BR05PKG1wLCBibWEuZmlyc3RibG9jaykpKTsKLQkJCQkqZmlyc3RibG9jayA9IGJtYS5maXJzdGJsb2NrOwotCQkJCWlmIChjdXIpCi0JCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPQotCQkJCQkJKmZpcnN0YmxvY2s7Ci0JCQkJaWYgKGFibm8gPT0gTlVMTEZTQkxPQ0spCi0JCQkJCWJyZWFrOwotCQkJCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhY3VyKSB7Ci0JCQkJCWN1ciA9IHhmc19ibWJ0X2luaXRfY3Vyc29yKG1wLCB0cCwKLQkJCQkJCWlwLCB3aGljaGZvcmspOwotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KLQkJCQkJCSpmaXJzdGJsb2NrOwotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGZsaXN0OwotCQkJCX0KLQkJCQkvKgotCQkJCSAqIEJ1bXAgdGhlIG51bWJlciBvZiBleHRlbnRzIHdlJ3ZlIGFsbG9jYXRlZAotCQkJCSAqIGluIHRoaXMgY2FsbC4KLQkJCQkgKi8KLQkJCQluYWxsb2NzKys7Ci0JCQl9Ci0JCQlpZiAoY3VyKQotCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0KLQkJCQkJd2FzZGVsYXkgPyBYRlNfQlRDVVJfQlBSVl9XQVNERUwgOiAwOwotCQkJZ290LmJyX3N0YXJ0b2ZmID0gYW9mZjsKLQkJCWdvdC5icl9zdGFydGJsb2NrID0gYWJubzsKLQkJCWdvdC5icl9ibG9ja2NvdW50ID0gYWxlbjsKLQkJCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsJLyogYXNzdW1lIG5vcm1hbCAqLwotCQkJLyoKLQkJCSAqIERldGVybWluZSBzdGF0ZSBvZiBleHRlbnQsIGFuZCB0aGUgZmlsZXN5c3RlbS4KLQkJCSAqIEEgd2FzZGVsYXkgZXh0ZW50IGhhcyBiZWVuIGluaXRpYWxpemVkLCBzbwotCQkJICogc2hvdWxkbid0IGJlIGZsYWdnZWQgYXMgdW53cml0dGVuLgotCQkJICovCi0JCQlpZiAod3IgJiYgeGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KCZtcC0+bV9zYikpIHsKLQkJCQlpZiAoIXdhc2RlbGF5ICYmIChmbGFncyAmIFhGU19CTUFQSV9QUkVBTExPQykpCi0JCQkJCWdvdC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOwotCQkJfQotCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KHRwLCBpcCwgJmxhc3R4LCAmY3VyLCAmZ290LAotCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmdG1wX2xvZ2ZsYWdzLAotCQkJCXdoaWNoZm9yayk7Ci0JCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJZ290byBlcnJvcjA7Ci0JCQllcCA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBsYXN0eCk7Ci0JCQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7Ci0JCQlBU1NFUlQoZ290LmJyX3N0YXJ0b2ZmIDw9IGFvZmYpOwotCQkJQVNTRVJUKGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50ID49Ci0JCQkJYW9mZiArIGFsZW4pOwotI2lmZGVmIERFQlVHCi0JCQlpZiAoZmxhZ3MgJiBYRlNfQk1BUElfREVMQVkpIHsKLQkJCQlBU1NFUlQoaXNudWxsc3RhcnRibG9jayhnb3QuYnJfc3RhcnRibG9jaykpOwotCQkJCUFTU0VSVChzdGFydGJsb2NrdmFsKGdvdC5icl9zdGFydGJsb2NrKSA+IDApOwotCQkJfQotCQkJQVNTRVJUKGdvdC5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0gfHwKLQkJCSAgICAgICBnb3QuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pOwotI2VuZGlmCi0JCQkvKgotCQkJICogRmFsbCBkb3duIGludG8gdGhlIGZvdW5kIGFsbG9jYXRlZCBzcGFjZSBjYXNlLgotCQkJICovCi0JCX0gZWxzZSBpZiAoaW5ob2xlKSB7Ci0JCQkvKgotCQkJICogUmVhZGluZyBpbiBhIGhvbGUuCi0JCQkgKi8KKwkJaWYgKGdvdC5icl9zdGFydG9mZiA+IGJubykgeworCQkJLyogUmVhZGluZyBpbiBhIGhvbGUuICAqLwogCQkJbXZhbC0+YnJfc3RhcnRvZmYgPSBibm87CiAJCQltdmFsLT5icl9zdGFydGJsb2NrID0gSE9MRVNUQVJUQkxPQ0s7CiAJCQltdmFsLT5icl9ibG9ja2NvdW50ID0KQEAgLTQ2OTcsMTUxICs0NDA3LDU3MCBAQAogCQkJbisrOwogCQkJY29udGludWU7CiAJCX0KKworCQkvKiBzZXQgdXAgdGhlIGV4dGVudCBtYXAgdG8gcmV0dXJuLiAqLworCQl4ZnNfYm1hcGlfdHJpbV9tYXAobXZhbCwgJmdvdCwgJmJubywgbGVuLCBvYm5vLCBlbmQsIG4sIGZsYWdzKTsKKwkJeGZzX2JtYXBpX3VwZGF0ZV9tYXAoJm12YWwsICZibm8sICZsZW4sIG9ibm8sIGVuZCwgJm4sIGZsYWdzKTsKKworCQkvKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gKi8KKwkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCkKKwkJCWJyZWFrOworCisJCS8qIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLiAqLworCQlpZiAoKytsYXN0eCA8IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKQorCQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpLCAmZ290KTsKKwkJZWxzZQorCQkJZW9mID0gMTsKKwl9CisJKm5tYXAgPSBuOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYygKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwl4ZnNfZmlsZW9mZl90CQlhb2ZmLAorCXhmc19maWxibGtzX3QJCWxlbiwKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqZ290LAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpwcmV2LAorCXhmc19leHRudW1fdAkJKmxhc3R4LAorCWludAkJCWVvZikKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOworCXhmc19leHRsZW5fdAkJYWxlbjsKKwl4ZnNfZXh0bGVuX3QJCWluZGxlbjsKKwljaGFyCQkJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApOworCXhmc19leHRsZW5fdAkJZXh0c3o7CisJaW50CQkJZXJyb3I7CisKKwlhbGVuID0gWEZTX0ZJTEJMS1NfTUlOKGxlbiwgTUFYRVhUTEVOKTsKKwlpZiAoIWVvZikKKwkJYWxlbiA9IFhGU19GSUxCTEtTX01JTihhbGVuLCBnb3QtPmJyX3N0YXJ0b2ZmIC0gYW9mZik7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBleHRlbnQgc2l6ZSwgYWRqdXN0IGFsZW4gKi8KKwlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7CisJaWYgKGV4dHN6KSB7CiAJCS8qCi0JCSAqIFRoZW4gZGVhbCB3aXRoIHRoZSBhbGxvY2F0ZWQgc3BhY2Ugd2UgZm91bmQuCisJCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgYSBzaW5nbGUgZXh0ZW50IGxlbmd0aCB3aGVuIHdlCisJCSAqIGFsaWduIHRoZSBleHRlbnQgYnkgcmVkdWNpbmcgbGVuZ3RoIHdlIGFyZSBnb2luZyB0bworCQkgKiBhbGxvY2F0ZSBieSB0aGUgbWF4aW11bSBhbW91bnQgZXh0ZW50IHNpemUgYWxpZ21lbnQgbWF5CisJCSAqIHJlcXVpcmUuCiAJCSAqLwotCQlBU1NFUlQoZXAgIT0gTlVMTCk7Ci0JCWlmICghKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgJiYKLQkJICAgIChnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCA+IG9ibm8pKSB7Ci0JCQlpZiAob2JubyA+IGJubykKLQkJCQlibm8gPSBvYm5vOwotCQkJQVNTRVJUKChibm8gPj0gb2JubykgfHwgKG4gPT0gMCkpOwotCQkJQVNTRVJUKGJubyA8IGVuZCk7Ci0JCQltdmFsLT5icl9zdGFydG9mZiA9IGJubzsKLQkJCWlmIChpc251bGxzdGFydGJsb2NrKGdvdC5icl9zdGFydGJsb2NrKSkgewotCQkJCUFTU0VSVCghd3IgfHwgKGZsYWdzICYgWEZTX0JNQVBJX0RFTEFZKSk7Ci0JCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9IERFTEFZU1RBUlRCTE9DSzsKLQkJCX0gZWxzZQotCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPQotCQkJCQlnb3QuYnJfc3RhcnRibG9jayArCi0JCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpOwotCQkJLyoKLQkJCSAqIFJldHVybiB0aGUgbWluaW11bSBvZiB3aGF0IHdlIGdvdCBhbmQgd2hhdCB3ZQotCQkJICogYXNrZWQgZm9yIGZvciB0aGUgbGVuZ3RoLiAgV2UgY2FuIHVzZSB0aGUgbGVuCi0JCQkgKiB2YXJpYWJsZSBoZXJlIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYmVsb3cKLQkJCSAqIGFuZCB3ZSBjb3VsZCBoYXZlIGJlZW4gdGhlcmUgYmVmb3JlIGNvbWluZwotCQkJICogaGVyZSBpZiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgYWxsb2NhdGlvbgotCQkJICogZGlkbid0IG92ZXJsYXAgd2hhdCB3YXMgYXNrZWQgZm9yLgotCQkJICovCi0JCQltdmFsLT5icl9ibG9ja2NvdW50ID0KLQkJCQlYRlNfRklMQkxLU19NSU4oZW5kIC0gYm5vLCBnb3QuYnJfYmxvY2tjb3VudCAtCi0JCQkJCShibm8gLSBnb3QuYnJfc3RhcnRvZmYpKTsKLQkJCW12YWwtPmJyX3N0YXRlID0gZ290LmJyX3N0YXRlOwotCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKLQkJfSBlbHNlIHsKLQkJCSptdmFsID0gZ290OwotCQkJaWYgKGlzbnVsbHN0YXJ0YmxvY2sobXZhbC0+YnJfc3RhcnRibG9jaykpIHsKLQkJCQlBU1NFUlQoIXdyIHx8IChmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkpOwotCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBERUxBWVNUQVJUQkxPQ0s7CisJCWFsZW4gPSBYRlNfRklMQkxLU19NSU4obGVuLCBNQVhFWFRMRU4gLSAoMiAqIGV4dHN6IC0gMSkpOworCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsIGdvdCwgcHJldiwgZXh0c3osIHJ0LCBlb2YsCisJCQkJCSAgICAgICAxLCAwLCAmYW9mZiwgJmFsZW4pOworCQlBU1NFUlQoIWVycm9yKTsKKwl9CisKKwlpZiAocnQpCisJCWV4dHN6ID0gYWxlbiAvIG1wLT5tX3NiLnNiX3JleHRzaXplOworCisJLyoKKwkgKiBNYWtlIGEgdHJhbnNhY3Rpb24tbGVzcyBxdW90YSByZXNlcnZhdGlvbiBmb3IgZGVsYXllZCBhbGxvY2F0aW9uCisJICogYmxvY2tzLiAgVGhpcyBudW1iZXIgZ2V0cyBhZGp1c3RlZCBsYXRlci4gIFdlIHJldHVybiBpZiB3ZSBoYXZlbid0CisJICogYWxsb2NhdGVkIGJsb2NrcyBhbHJlYWR5IGluc2lkZSB0aGlzIGxvb3AuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9uYmxrcyhOVUxMLCBpcCwgKGxvbmcpYWxlbiwgMCwKKwkJCXJ0ID8gWEZTX1FNT1BUX1JFU19SVEJMS1MgOiBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBTcGxpdCBjaGFuZ2luZyBzYiBmb3IgYWxlbiBhbmQgaW5kbGVuIHNpbmNlIHRoZXkgY291bGQgYmUgY29taW5nCisJICogZnJvbSBkaWZmZXJlbnQgcGxhY2VzLgorCSAqLworCWluZGxlbiA9ICh4ZnNfZXh0bGVuX3QpeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCBhbGVuKTsKKwlBU1NFUlQoaW5kbGVuID4gMCk7CisKKwlpZiAocnQpIHsKKwkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYihtcCwgWEZTX1NCU19GUkVYVEVOVFMsCisJCQkJCSAgLSgoaW50NjRfdClleHRzeiksIDApOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCQkJIC0oKGludDY0X3QpYWxlbiksIDApOworCX0KKworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZXNlcnZlX3F1b3RhOworCisJZXJyb3IgPSB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCSAtKChpbnQ2NF90KWluZGxlbiksIDApOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5yZXNlcnZlX2Jsb2NrczsKKworCisJaXAtPmlfZGVsYXllZF9ibGtzICs9IGFsZW47CisKKwlnb3QtPmJyX3N0YXJ0b2ZmID0gYW9mZjsKKwlnb3QtPmJyX3N0YXJ0YmxvY2sgPSBudWxsc3RhcnRibG9jayhpbmRsZW4pOworCWdvdC0+YnJfYmxvY2tjb3VudCA9IGFsZW47CisJZ290LT5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwl4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfZGVsYXkoaXAsIGxhc3R4LCBnb3QpOworCisJLyoKKwkgKiBVcGRhdGUgb3VyIGV4dGVudCBwb2ludGVyLCBnaXZlbiB0aGF0IHhmc19ibWFwX2FkZF9leHRlbnRfaG9sZV9kZWxheQorCSAqIG1pZ2h0IGhhdmUgbWVyZ2VkIGl0IGludG8gb25lIG9mIHRoZSBuZWlnaGJvdXJpbmcgb25lcy4KKwkgKi8KKwl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCAqbGFzdHgpLCBnb3QpOworCisJQVNTRVJUKGdvdC0+YnJfc3RhcnRvZmYgPD0gYW9mZik7CisJQVNTRVJUKGdvdC0+YnJfc3RhcnRvZmYgKyBnb3QtPmJyX2Jsb2NrY291bnQgPj0gYW9mZiArIGFsZW4pOworCUFTU0VSVChpc251bGxzdGFydGJsb2NrKGdvdC0+YnJfc3RhcnRibG9jaykpOworCUFTU0VSVChnb3QtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJcmV0dXJuIDA7CisKK291dF91bnJlc2VydmVfYmxvY2tzOgorCWlmIChydCkKKwkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRlJFWFRFTlRTLCBleHRzeiwgMCk7CisJZWxzZQorCQl4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsIFhGU19TQlNfRkRCTE9DS1MsIGFsZW4sIDApOworb3V0X3VucmVzZXJ2ZV9xdW90YToKKwlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJeGZzX3RyYW5zX3VucmVzZXJ2ZV9xdW90YV9uYmxrcyhOVUxMLCBpcCwgYWxlbiwgMCwgcnQgPworCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MsIGFkZGluZyBkZWxheWVkIGFsbG9jYXRpb25zIGFzIG5lZWRlZC4KKyAqLworaW50Cit4ZnNfYm1hcGlfZGVsYXkoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCS8qIGxlbmd0aCB0byBtYXAgaW4gZmlsZSAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAkvKiBvdXRwdXQ6IG1hcCB2YWx1ZXMgKi8KKwlpbnQJCQkqbm1hcCwJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwlpbnQJCQlmbGFncykJLyogWEZTX0JNQVBJXy4uLiAqLworeworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJZ290OwkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CS8qIHByZXZpb3VzIGZpbGUgZXh0ZW50IHJlY29yZCAqLworCXhmc19maWxlb2ZmX3QJCW9ibm87CS8qIG9sZCBibG9jayBudW1iZXIgKG9mZnNldCkgKi8KKwl4ZnNfZmlsZW9mZl90CQllbmQ7CS8qIGVuZCBvZiBtYXBwZWQgZmlsZSByZWdpb24gKi8KKwl4ZnNfZXh0bnVtX3QJCWxhc3R4OwkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCisJaW50CQkJZW9mOwkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnRzICovCisJaW50CQkJbiA9IDA7CS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCisJaW50CQkJZXJyb3IgPSAwOworCisJQVNTRVJUKCpubWFwID49IDEpOworCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCk7CisJQVNTRVJUKCEoZmxhZ3MgJiB+WEZTX0JNQVBJX0VOVElSRSkpOworCisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpLAorCSAgICAgbXAsIFhGU19FUlJUQUdfQk1BUElGT1JNQVQsIFhGU19SQU5ET01fQk1BUElGT1JNQVQpKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcGlfZGVsYXkiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOworCisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7CisJCWVycm9yID0geGZzX2lyZWFkX2V4dGVudHMoTlVMTCwgaXAsIFhGU19EQVRBX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgWEZTX0RBVEFfRk9SSywgJmVvZiwgJmxhc3R4LCAmZ290LCAmcHJldik7CisJZW5kID0gYm5vICsgbGVuOworCW9ibm8gPSBibm87CisKKwl3aGlsZSAoYm5vIDwgZW5kICYmIG4gPCAqbm1hcCkgeworCQlpZiAoZW9mIHx8IGdvdC5icl9zdGFydG9mZiA+IGJubykgeworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYyhpcCwgYm5vLCBsZW4sICZnb3QsCisJCQkJCQkJICAgJnByZXYsICZsYXN0eCwgZW9mKTsKKwkJCWlmIChlcnJvcikgeworCQkJCWlmIChuID09IDApIHsKKwkJCQkJKm5tYXAgPSAwOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKKwkJLyogc2V0IHVwIHRoZSBleHRlbnQgbWFwIHRvIHJldHVybi4gKi8KKwkJeGZzX2JtYXBpX3RyaW1fbWFwKG12YWwsICZnb3QsICZibm8sIGxlbiwgb2JubywgZW5kLCBuLCBmbGFncyk7CisJCXhmc19ibWFwaV91cGRhdGVfbWFwKCZtdmFsLCAmYm5vLCAmbGVuLCBvYm5vLCBlbmQsICZuLCBmbGFncyk7CisKKwkJLyogSWYgd2UncmUgZG9uZSwgc3RvcCBub3cuICovCisJCWlmIChibm8gPj0gZW5kIHx8IG4gPj0gKm5tYXApCisJCQlicmVhazsKKworCQkvKiBFbHNlIGdvIG9uIHRvIHRoZSBuZXh0IHJlY29yZC4gKi8KKwkJcHJldiA9IGdvdDsKKwkJaWYgKCsrbGFzdHggPCBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSkKKwkJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGxhc3R4KSwgJmdvdCk7CisJCWVsc2UKKwkJCWVvZiA9IDE7CisJfQorCisJKm5tYXAgPSBuOworCXJldHVybiAwOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19ibWFwaV9hbGxvY2F0ZSgKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJaW50CQkJZmxhZ3MpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBibWEtPmlwLT5pX21vdW50OworCWludAkJCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQkJCQkJWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOworCWludAkJCXRtcF9sb2dmbGFncyA9IDA7CisJaW50CQkJZXJyb3I7CisJaW50CQkJcnQ7CisKKwlydCA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgJiYgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGJtYS0+aXApOworCisJLyoKKwkgKiBGb3IgdGhlIHdhc2RlbGF5IGNhc2UsIHdlIGNvdWxkIGFsc28ganVzdCBhbGxvY2F0ZSB0aGUgc3R1ZmYgYXNrZWQKKwkgKiBmb3IgaW4gdGhpcyBibWFwIGNhbGwgYnV0IHRoYXQgd291bGRuJ3QgYmUgYXMgZ29vZC4KKwkgKi8KKwlpZiAoYm1hLT53YXNkZWwpIHsKKwkJYm1hLT5sZW5ndGggPSAoeGZzX2V4dGxlbl90KWJtYS0+Z290LmJyX2Jsb2NrY291bnQ7CisJCWJtYS0+b2Zmc2V0ID0gYm1hLT5nb3QuYnJfc3RhcnRvZmY7CisJCWlmIChibWEtPmlkeCAhPSBOVUxMRVhUTlVNICYmIGJtYS0+aWR4KSB7CisJCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCAtIDEpLAorCQkJCQkgJmJtYS0+cHJldik7CisJCX0KKwl9IGVsc2UgeworCQlibWEtPmxlbmd0aCA9IFhGU19GSUxCTEtTX01JTihibWEtPmxlbmd0aCwgTUFYRVhUTEVOKTsKKwkJaWYgKCFibWEtPmVvZikKKwkJCWJtYS0+bGVuZ3RoID0gWEZTX0ZJTEJMS1NfTUlOKGJtYS0+bGVuZ3RoLAorCQkJCQlibWEtPmdvdC5icl9zdGFydG9mZiAtIGJtYS0+b2Zmc2V0KTsKKwl9CisKKwkvKgorCSAqIEluZGljYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIgZGF0YSBpbiB0aGUgZmlsZSwgb3IganVzdCBhbnkKKwkgKiB1c2VyIGRhdGEuCisJICovCisJaWYgKCEoZmxhZ3MgJiBYRlNfQk1BUElfTUVUQURBVEEpKSB7CisJCWJtYS0+dXNlcmRhdGEgPSAoYm1hLT5vZmZzZXQgPT0gMCkgPworCQkJWEZTX0FMTE9DX0lOSVRJQUxfVVNFUl9EQVRBIDogWEZTX0FMTE9DX1VTRVJEQVRBOworCX0KKworCWJtYS0+bWlubGVuID0gKGZsYWdzICYgWEZTX0JNQVBJX0NPTlRJRykgPyBibWEtPmxlbmd0aCA6IDE7CisKKwkvKgorCSAqIE9ubHkgd2FudCB0byBkbyB0aGUgYWxpZ25tZW50IGF0IHRoZSBlb2YgaWYgaXQgaXMgdXNlcmRhdGEgYW5kCisJICogYWxsb2NhdGlvbiBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gYSBzdHJpcGUgdW5pdC4KKwkgKi8KKwlpZiAobXAtPm1fZGFsaWduICYmIGJtYS0+bGVuZ3RoID49IG1wLT5tX2RhbGlnbiAmJgorCSAgICAhKGZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSAmJiB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQllcnJvciA9IHhmc19ibWFwX2lzYWVvZihibWEsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHhmc19ibWFwX2FsbG9jKGJtYSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoYm1hLT5mbGlzdC0+eGJmX2xvdykKKwkJYm1hLT5taW5sZWZ0ID0gMDsKKwlpZiAoYm1hLT5jdXIpCisJCWJtYS0+Y3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9ICpibWEtPmZpcnN0YmxvY2s7CisJaWYgKGJtYS0+Ymxrbm8gPT0gTlVMTEZTQkxPQ0spCisJCXJldHVybiAwOworCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhYm1hLT5jdXIpIHsKKwkJYm1hLT5jdXIgPSB4ZnNfYm1idF9pbml0X2N1cnNvcihtcCwgYm1hLT50cCwgYm1hLT5pcCwgd2hpY2hmb3JrKTsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmJtYS0+Zmlyc3RibG9jazsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGJtYS0+Zmxpc3Q7CisJfQorCS8qCisJICogQnVtcCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2UndmUgYWxsb2NhdGVkCisJICogaW4gdGhpcyBjYWxsLgorCSAqLworCWJtYS0+bmFsbG9jcysrOworCisJaWYgKGJtYS0+Y3VyKQorCQlibWEtPmN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0KKwkJCWJtYS0+d2FzZGVsID8gWEZTX0JUQ1VSX0JQUlZfV0FTREVMIDogMDsKKworCWJtYS0+Z290LmJyX3N0YXJ0b2ZmID0gYm1hLT5vZmZzZXQ7CisJYm1hLT5nb3QuYnJfc3RhcnRibG9jayA9IGJtYS0+Ymxrbm87CisJYm1hLT5nb3QuYnJfYmxvY2tjb3VudCA9IGJtYS0+bGVuZ3RoOworCWJtYS0+Z290LmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOworCisJLyoKKwkgKiBBIHdhc2RlbGF5IGV4dGVudCBoYXMgYmVlbiBpbml0aWFsaXplZCwgc28gc2hvdWxkbid0IGJlIGZsYWdnZWQKKwkgKiBhcyB1bndyaXR0ZW4uCisJICovCisJaWYgKCFibWEtPndhc2RlbCAmJiAoZmxhZ3MgJiBYRlNfQk1BUElfUFJFQUxMT0MpICYmCisJICAgIHhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCgmbXAtPm1fc2IpKQorCQlibWEtPmdvdC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOworCisJaWYgKGJtYS0+d2FzZGVsKQorCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbChibWEpOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbChibWEsIHdoaWNoZm9yayk7CisKKwlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogVXBkYXRlIG91ciBleHRlbnQgcG9pbnRlciwgZ2l2ZW4gdGhhdCB4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwKKwkgKiBvciB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbCBtaWdodCBoYXZlIG1lcmdlZCBpdCBpbnRvIG9uZSBvZgorCSAqIHRoZSBuZWlnaGJvdXJpbmcgb25lcy4KKwkgKi8KKwl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEtPmlkeCksICZibWEtPmdvdCk7CisKKwlBU1NFUlQoYm1hLT5nb3QuYnJfc3RhcnRvZmYgPD0gYm1hLT5vZmZzZXQpOworCUFTU0VSVChibWEtPmdvdC5icl9zdGFydG9mZiArIGJtYS0+Z290LmJyX2Jsb2NrY291bnQgPj0KKwkgICAgICAgYm1hLT5vZmZzZXQgKyBibWEtPmxlbmd0aCk7CisJQVNTRVJUKGJtYS0+Z290LmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAorCSAgICAgICBibWEtPmdvdC5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTik7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ibWFwaV9jb252ZXJ0X3Vud3JpdHRlbigKKwlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEsCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJKm12YWwsCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzKQoreworCWludAkJCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQkJCQkJWEZTX0FUVFJfRk9SSyA6IFhGU19EQVRBX0ZPUks7CisJc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihibWEtPmlwLCB3aGljaGZvcmspOworCWludAkJCXRtcF9sb2dmbGFncyA9IDA7CisJaW50CQkJZXJyb3I7CisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvIHVud3JpdHRlbi0+cmVhbCBjb252ZXJzaW9uICovCisJaWYgKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOICYmCisJICAgIChmbGFncyAmIFhGU19CTUFQSV9QUkVBTExPQykpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBkbyByZWFsLT51bndyaXR0ZW4gY29udmVyc2lvbiAqLworCWlmIChtdmFsLT5icl9zdGF0ZSA9PSBYRlNfRVhUX05PUk0gJiYKKwkgICAgKGZsYWdzICYgKFhGU19CTUFQSV9QUkVBTExPQyB8IFhGU19CTUFQSV9DT05WRVJUKSkgIT0KKwkJCShYRlNfQk1BUElfUFJFQUxMT0MgfCBYRlNfQk1BUElfQ09OVkVSVCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBNb2RpZnkgKGJ5IGFkZGluZykgdGhlIHN0YXRlIGZsYWcsIGlmIHdyaXRpbmcuCisJICovCisJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKKwlpZiAoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZCUk9PVCkgJiYgIWJtYS0+Y3VyKSB7CisJCWJtYS0+Y3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IoYm1hLT5pcC0+aV9tb3VudCwgYm1hLT50cCwKKwkJCQkJYm1hLT5pcCwgd2hpY2hmb3JrKTsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmJtYS0+Zmlyc3RibG9jazsKKwkJYm1hLT5jdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGJtYS0+Zmxpc3Q7CisJfQorCW12YWwtPmJyX3N0YXRlID0gKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQorCQkJCT8gWEZTX0VYVF9OT1JNIDogWEZTX0VYVF9VTldSSVRURU47CisKKwllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwoYm1hLT50cCwgYm1hLT5pcCwgJmJtYS0+aWR4LAorCQkJJmJtYS0+Y3VyLCBtdmFsLCBibWEtPmZpcnN0YmxvY2ssIGJtYS0+Zmxpc3QsCisJCQkmdG1wX2xvZ2ZsYWdzKTsKKwlibWEtPmxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogVXBkYXRlIG91ciBleHRlbnQgcG9pbnRlciwgZ2l2ZW4gdGhhdAorCSAqIHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwgbWlnaHQgaGF2ZSBtZXJnZWQgaXQgaW50byBvbmUKKwkgKiBvZiB0aGUgbmVpZ2hib3VyaW5nIG9uZXMuCisJICovCisJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgYm1hLT5pZHgpLCAmYm1hLT5nb3QpOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBjb21iaW5lZCBwcmV2aW91c2x5IHVud3JpdHRlbiBzcGFjZSB3aXRoIHdyaXR0ZW4gc3BhY2UsCisJICogc28gZ2VuZXJhdGUgYW5vdGhlciByZXF1ZXN0LgorCSAqLworCWlmIChtdmFsLT5icl9ibG9ja2NvdW50IDwgbGVuKQorCQlyZXR1cm4gRUFHQUlOOworCXJldHVybiAwOworfQorCisvKgorICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLCBhbmQgYWxsb2NhdGUgYmxvY2tzIG9yIGNvbnZlcnQgdGhlCisgKiBleHRlbnQgc3RhdGUgaWYgbmVjZXNzYXJ5LiAgRGV0YWlscyBiZWhhdmlvdXIgaXMgY29udHJvbGxlZCBieSB0aGUgZmxhZ3MKKyAqIHBhcmFtZXRlci4gIE9ubHkgYWxsb2NhdGVzIGJsb2NrcyBmcm9tIGEgc2luZ2xlIGFsbG9jYXRpb24gZ3JvdXAsIHRvIGF2b2lkCisgKiBsb2NraW5nIHByb2JsZW1zLgorICoKKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpbiAiZmlyc3RibG9jayIgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiBhIHRyYW5zYWN0aW9uCisgKiBtdXN0IGJlIHJlbWVtYmVyZWQgYW5kIHByZXNlbnRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIGluICJmaXJzdGJsb2NrIi4KKyAqIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgaXMgc3VwcGxpZWQgdG8KKyAqIHRoZSBmaXJzdCBjYWxsIGluICJ0b3RhbCI7IGlmIG5vIGFsbG9jYXRpb24gZ3JvdXAgaGFzIHRoYXQgbWFueSBmcmVlCisgKiBibG9ja3MgdGhlbiB0aGUgY2FsbCB3aWxsIGZhaWwgKHJldHVybiBOVUxMRlNCTE9DSyBpbiAiZmlyc3RibG9jayIpLgorICovCitpbnQKK3hmc19ibWFwaV93cml0ZSgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCisJaW50CQkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jaworCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCisJeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLworCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KKwlzdHJ1Y3QgeGZzX2JtYXBfZnJlZQkqZmxpc3QpCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnA7CisJc3RydWN0IHhmc19ibWFsbG9jYQlibWEgPSB7IDAgfTsJLyogYXJncyBmb3IgeGZzX2JtYXBfYWxsb2MgKi8KKwl4ZnNfZmlsZW9mZl90CQllbmQ7CQkvKiBlbmQgb2YgbWFwcGVkIGZpbGUgcmVnaW9uICovCisJaW50CQkJZW9mOwkJLyogYWZ0ZXIgdGhlIGVuZCBvZiBleHRlbnRzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gKi8KKwlpbnQJCQluOwkJLyogY3VycmVudCBleHRlbnQgaW5kZXggKi8KKwl4ZnNfZmlsZW9mZl90CQlvYm5vOwkJLyogb2xkIGJsb2NrIG51bWJlciAob2Zmc2V0KSAqLworCWludAkJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwljaGFyCQkJaW5ob2xlOwkJLyogY3VycmVudCBsb2NhdGlvbiBpcyBob2xlIGluIGZpbGUgKi8KKwljaGFyCQkJd2FzZGVsYXk7CS8qIG9sZCBleHRlbnQgd2FzIGRlbGF5ZWQgKi8KKworI2lmZGVmIERFQlVHCisJeGZzX2ZpbGVvZmZfdAkJb3JpZ19ibm87CS8qIG9yaWdpbmFsIGJsb2NrIG51bWJlciB2YWx1ZSAqLworCWludAkJCW9yaWdfZmxhZ3M7CS8qIG9yaWdpbmFsIGZsYWdzIGFyZyB2YWx1ZSAqLworCXhmc19maWxibGtzX3QJCW9yaWdfbGVuOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiBsZW4gYXJnICovCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJKm9yaWdfbXZhbDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgbXZhbCAqLworCWludAkJCW9yaWdfbm1hcDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgKm5tYXAgKi8KKworCW9yaWdfYm5vID0gYm5vOworCW9yaWdfbGVuID0gbGVuOworCW9yaWdfZmxhZ3MgPSBmbGFnczsKKwlvcmlnX212YWwgPSBtdmFsOworCW9yaWdfbm1hcCA9ICpubWFwOworI2VuZGlmCisKKwlBU1NFUlQoKm5tYXAgPj0gMSk7CisJQVNTRVJUKCpubWFwIDw9IFhGU19CTUFQX01BWF9OTUFQKTsKKwlBU1NFUlQoIShmbGFncyAmIFhGU19CTUFQSV9JR1NUQVRFKSk7CisJQVNTRVJUKHRwICE9IE5VTEwpOworCisJd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/CisJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOworCisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSwKKwkgICAgIG1wLCBYRlNfRVJSVEFHX0JNQVBJRk9STUFULCBYRlNfUkFORE9NX0JNQVBJRk9STUFUKSkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3dyaXRlIiwgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHcpOworCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9sb2NhbF90b19leHRlbnRzKHRwLCBpcCwgZmlyc3RibG9jaywgdG90YWwsCisJCQkJCQkgICZibWEubG9nZmxhZ3MsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKworCWlmICgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSykgeworCQlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKKwkJCWJtYS5taW5sZWZ0ID0gYmUxNl90b19jcHUoaWZwLT5pZl9icm9vdC0+YmJfbGV2ZWwpICsgMTsKKwkJZWxzZQorCQkJYm1hLm1pbmxlZnQgPSAxOworCX0gZWxzZSB7CisJCWJtYS5taW5sZWZ0ID0gMDsKKwl9CisKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKworCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmJtYS5pZHgsICZibWEuZ290LAorCQkJCSZibWEucHJldik7CisJbiA9IDA7CisJZW5kID0gYm5vICsgbGVuOworCW9ibm8gPSBibm87CisKKwlibWEudHAgPSB0cDsKKwlibWEuaXAgPSBpcDsKKwlibWEudG90YWwgPSB0b3RhbDsKKwlibWEudXNlcmRhdGEgPSAwOworCWJtYS5mbGlzdCA9IGZsaXN0OworCWJtYS5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKKworCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7CisJCWluaG9sZSA9IGVvZiB8fCBibWEuZ290LmJyX3N0YXJ0b2ZmID4gYm5vOworCQl3YXNkZWxheSA9ICFpbmhvbGUgJiYgaXNudWxsc3RhcnRibG9jayhibWEuZ290LmJyX3N0YXJ0YmxvY2spOworCiAJCS8qCi0JCSAqIENoZWNrIGlmIHdyaXRpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnV0Ci0JCSAqIHVud3JpdHRlbiBleHRlbnRzLgorCQkgKiBGaXJzdCwgZGVhbCB3aXRoIHRoZSBob2xlIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHNwYWNlCisJCSAqIHRoYXQgd2UgZm91bmQsIGlmIGFueS4KIAkJICovCi0JCWlmICh3ciAmJgotCQkgICAgKChtdmFsLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTiAmJgotCQkgICAgICAoKGZsYWdzICYgKFhGU19CTUFQSV9QUkVBTExPQ3xYRlNfQk1BUElfREVMQVkpKSA9PSAwKSkgfHwKLQkJICAgICAobXZhbC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNICYmCi0JCSAgICAgICgoZmxhZ3MgJiAoWEZTX0JNQVBJX1BSRUFMTE9DfFhGU19CTUFQSV9DT05WRVJUKSkgPT0KLQkJCQkoWEZTX0JNQVBJX1BSRUFMTE9DfFhGU19CTUFQSV9DT05WRVJUKSkpKSkgewotCQkJLyoKLQkJCSAqIE1vZGlmeSAoYnkgYWRkaW5nKSB0aGUgc3RhdGUgZmxhZywgaWYgd3JpdGluZy4KLQkJCSAqLwotCQkJQVNTRVJUKG12YWwtPmJyX2Jsb2NrY291bnQgPD0gbGVuKTsKLQkJCWlmICgoaWZwLT5pZl9mbGFncyAmIFhGU19JRkJST09UKSAmJiAhY3VyKSB7Ci0JCQkJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IobXAsCi0JCQkJCXRwLCBpcCwgd2hpY2hmb3JrKTsKLQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KLQkJCQkJKmZpcnN0YmxvY2s7Ci0JCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKLQkJCX0KLQkJCW12YWwtPmJyX3N0YXRlID0gKG12YWwtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQotCQkJCQkJPyBYRlNfRVhUX05PUk0KLQkJCQkJCTogWEZTX0VYVF9VTldSSVRURU47Ci0JCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQodHAsIGlwLCAmbGFzdHgsICZjdXIsIG12YWwsCi0JCQkJZmlyc3RibG9jaywgZmxpc3QsICZ0bXBfbG9nZmxhZ3MsCi0JCQkJd2hpY2hmb3JrKTsKLQkJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGluaG9sZSB8fCB3YXNkZWxheSkgeworCQkJYm1hLmVvZiA9IGVvZjsKKwkJCWJtYS5jb252ID0gISEoZmxhZ3MgJiBYRlNfQk1BUElfQ09OVkVSVCk7CisJCQlibWEud2FzZGVsID0gd2FzZGVsYXk7CisJCQlibWEubGVuZ3RoID0gbGVuOworCQkJYm1hLm9mZnNldCA9IGJubzsKKworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfYWxsb2NhdGUoJmJtYSwgZmxhZ3MpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZXJyb3IwOwotCQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpOwotCQkJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKLQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOwotCQkJLyoKLQkJCSAqIFdlIG1heSBoYXZlIGNvbWJpbmVkIHByZXZpb3VzbHkgdW53cml0dGVuCi0JCQkgKiBzcGFjZSB3aXRoIHdyaXR0ZW4gc3BhY2UsIHNvIGdlbmVyYXRlCi0JCQkgKiBhbm90aGVyIHJlcXVlc3QuCi0JCQkgKi8KLQkJCWlmIChtdmFsLT5icl9ibG9ja2NvdW50IDwgbGVuKQotCQkJCWNvbnRpbnVlOworCQkJaWYgKGJtYS5ibGtubyA9PSBOVUxMRlNCTE9DSykKKwkJCQlicmVhazsKIAkJfQogCi0JCUFTU0VSVCgoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSB8fAotCQkgICAgICAgKChtdmFsLT5icl9zdGFydG9mZiArIG12YWwtPmJyX2Jsb2NrY291bnQpIDw9IGVuZCkpOwotCQlBU1NFUlQoKGZsYWdzICYgWEZTX0JNQVBJX0VOVElSRSkgfHwKLQkJICAgICAgIChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbikgfHwKLQkJICAgICAgIChtdmFsLT5icl9zdGFydG9mZiA8IG9ibm8pKTsKLQkJYm5vID0gbXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50OwotCQlsZW4gPSBlbmQgLSBibm87Ci0JCWlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydG9mZiA9PSBtdmFsWy0xXS5icl9zdGFydG9mZikgewotCQkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gbXZhbFstMV0uYnJfc3RhcnRibG9jayk7Ci0JCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA+IG12YWxbLTFdLmJyX2Jsb2NrY291bnQpOwotCQkJQVNTRVJUKG12YWwtPmJyX3N0YXRlID09IG12YWxbLTFdLmJyX3N0YXRlKTsKLQkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgPSBtdmFsLT5icl9ibG9ja2NvdW50OwotCQkJbXZhbFstMV0uYnJfc3RhdGUgPSBtdmFsLT5icl9zdGF0ZTsKLQkJfSBlbHNlIGlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgotCQkJICAgbXZhbFstMV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0KLQkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgKyBtdmFsWy0xXS5icl9ibG9ja2NvdW50ICYmCi0JCQkgICAoKGZsYWdzICYgWEZTX0JNQVBJX0lHU1RBVEUpIHx8Ci0JCQkJbXZhbFstMV0uYnJfc3RhdGUgPT0gbXZhbC0+YnJfc3RhdGUpKSB7Ci0JCQlBU1NFUlQobXZhbC0+YnJfc3RhcnRvZmYgPT0KLQkJCSAgICAgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpOwotCQkJbXZhbFstMV0uYnJfYmxvY2tjb3VudCArPSBtdmFsLT5icl9ibG9ja2NvdW50OwotCQl9IGVsc2UgaWYgKG4gPiAwICYmCi0JCQkgICBtdmFsLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyAmJgotCQkJICAgbXZhbFstMV0uYnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0sgJiYKLQkJCSAgIG12YWwtPmJyX3N0YXJ0b2ZmID09Ci0JCQkgICBtdmFsWy0xXS5icl9zdGFydG9mZiArIG12YWxbLTFdLmJyX2Jsb2NrY291bnQpIHsKLQkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKLQkJCW12YWxbLTFdLmJyX3N0YXRlID0gbXZhbC0+YnJfc3RhdGU7Ci0JCX0gZWxzZSBpZiAoISgobiA9PSAwKSAmJgotCQkJICAgICAoKG12YWwtPmJyX3N0YXJ0b2ZmICsgbXZhbC0+YnJfYmxvY2tjb3VudCkgPD0KLQkJCSAgICAgIG9ibm8pKSkgewotCQkJbXZhbCsrOwotCQkJbisrOwotCQl9CisJCS8qIERlYWwgd2l0aCB0aGUgYWxsb2NhdGVkIHNwYWNlIHdlIGZvdW5kLiAgKi8KKwkJeGZzX2JtYXBpX3RyaW1fbWFwKG12YWwsICZibWEuZ290LCAmYm5vLCBsZW4sIG9ibm8sCisJCQkJCQkJZW5kLCBuLCBmbGFncyk7CisKKwkJLyogRXhlY3V0ZSB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5ICovCisJCWVycm9yID0geGZzX2JtYXBpX2NvbnZlcnRfdW53cml0dGVuKCZibWEsIG12YWwsIGxlbiwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPT0gRUFHQUlOKQorCQkJY29udGludWU7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCisJCS8qIHVwZGF0ZSB0aGUgZXh0ZW50IG1hcCB0byByZXR1cm4gKi8KKwkJeGZzX2JtYXBpX3VwZGF0ZV9tYXAoJm12YWwsICZibm8sICZsZW4sIG9ibm8sIGVuZCwgJm4sIGZsYWdzKTsKKwogCQkvKgogCQkgKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gIFN0b3Agd2hlbiB3ZSd2ZSBhbGxvY2F0ZWQKIAkJICogWEZTX0JNQVBfTUFYX05NQVAgZXh0ZW50cyBubyBtYXR0ZXIgd2hhdC4gIE90aGVyd2lzZQogCQkgKiB0aGUgdHJhbnNhY3Rpb24gbWF5IGdldCB0b28gYmlnLgogCQkgKi8KLQkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCB8fCBuYWxsb2NzID49ICpubWFwKQorCQlpZiAoYm5vID49IGVuZCB8fCBuID49ICpubWFwIHx8IGJtYS5uYWxsb2NzID49ICpubWFwKQogCQkJYnJlYWs7Ci0JCS8qCi0JCSAqIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLgotCQkgKi8KLQkJcHJldiA9IGdvdDsKLQkJaWYgKCsrbGFzdHggPCBuZXh0ZW50cykgewotCQkJZXAgPSB4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpOwotCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7Ci0JCX0gZWxzZSB7CisKKwkJLyogRWxzZSBnbyBvbiB0byB0aGUgbmV4dCByZWNvcmQuICovCisJCWJtYS5wcmV2ID0gYm1hLmdvdDsKKwkJaWYgKCsrYm1hLmlkeCA8IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSB7CisJCQl4ZnNfYm1idF9nZXRfYWxsKHhmc19pZXh0X2dldF9leHQoaWZwLCBibWEuaWR4KSwKKwkJCQkJICZibWEuZ290KTsKKwkJfSBlbHNlCiAJCQllb2YgPSAxOwotCQl9CiAJfQogCSpubWFwID0gbjsKKwogCS8qCiAJICogVHJhbnNmb3JtIGZyb20gYnRyZWUgdG8gZXh0ZW50cywgZ2l2ZSBpdCBjdXIuCiAJICovCi0JaWYgKHRwICYmIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgogCSAgICBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPD0gaWZwLT5pZl9leHRfbWF4KSB7Ci0JCUFTU0VSVCh3ciAmJiBjdXIpOwotCQllcnJvciA9IHhmc19ibWFwX2J0cmVlX3RvX2V4dGVudHModHAsIGlwLCBjdXIsCisJCWludAkJdG1wX2xvZ2ZsYWdzID0gMDsKKworCQlBU1NFUlQoYm1hLmN1cik7CisJCWVycm9yID0geGZzX2JtYXBfYnRyZWVfdG9fZXh0ZW50cyh0cCwgaXAsIGJtYS5jdXIsCiAJCQkmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmspOwotCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWJtYS5sb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwogCX0KQEAgLTQ4NTUsMzQgKzQ5ODQsMzMgQEAKIAkgKiBMb2cgZXZlcnl0aGluZy4gIERvIHRoaXMgYWZ0ZXIgY29udmVyc2lvbiwgdGhlcmUncyBubyBwb2ludCBpbgogCSAqIGxvZ2dpbmcgdGhlIGV4dGVudCByZWNvcmRzIGlmIHdlJ3ZlIGNvbnZlcnRlZCB0byBidHJlZSBmb3JtYXQuCiAJICovCi0JaWYgKChsb2dmbGFncyAmIHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKSkgJiYKKwlpZiAoKGJtYS5sb2dmbGFncyAmIHhmc19pbG9nX2ZleHQod2hpY2hmb3JrKSkgJiYKIAkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKQotCQlsb2dmbGFncyAmPSB+eGZzX2lsb2dfZmV4dCh3aGljaGZvcmspOwotCWVsc2UgaWYgKChsb2dmbGFncyAmIHhmc19pbG9nX2Zicm9vdCh3aGljaGZvcmspKSAmJgorCQlibWEubG9nZmxhZ3MgJj0gfnhmc19pbG9nX2ZleHQod2hpY2hmb3JrKTsKKwllbHNlIGlmICgoYm1hLmxvZ2ZsYWdzICYgeGZzX2lsb2dfZmJyb290KHdoaWNoZm9yaykpICYmCiAJCSBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKQotCQlsb2dmbGFncyAmPSB+eGZzX2lsb2dfZmJyb290KHdoaWNoZm9yayk7CisJCWJtYS5sb2dmbGFncyAmPSB+eGZzX2lsb2dfZmJyb290KHdoaWNoZm9yayk7CiAJLyoKIAkgKiBMb2cgd2hhdGV2ZXIgdGhlIGZsYWdzIHNheSwgZXZlbiBpZiBlcnJvci4gIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzCiAJICogZGV0ZWN0aW5nIGEgY2FzZSB3aGVyZSB0aGUgZGF0YSBpcyBjaGFuZ2VkLCB0aGVyZSdzIGFuIGVycm9yLAogCSAqIGFuZCBpdCdzIG5vdCBsb2dnZWQgc28gd2UgZG9uJ3Qgc2h1dGRvd24gd2hlbiB3ZSBzaG91bGQuCiAJICovCi0JaWYgKGxvZ2ZsYWdzKSB7Ci0JCUFTU0VSVCh0cCAmJiB3cik7Ci0JCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBsb2dmbGFncyk7Ci0JfQotCWlmIChjdXIpIHsKKwlpZiAoYm1hLmxvZ2ZsYWdzKQorCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgYm1hLmxvZ2ZsYWdzKTsKKworCWlmIChibWEuY3VyKSB7CiAJCWlmICghZXJyb3IpIHsKIAkJCUFTU0VSVCgqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSyB8fAogCQkJICAgICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spID09CiAJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLAotCQkJCSAgICAgICBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrKSB8fAorCQkJCSAgICAgICBibWEuY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jaykgfHwKIAkJCSAgICAgICAoZmxpc3QtPnhiZl9sb3cgJiYKIAkJCQlYRlNfRlNCX1RPX0FHTk8obXAsICpmaXJzdGJsb2NrKSA8CiAJCQkJWEZTX0ZTQl9UT19BR05PKG1wLAotCQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrKSkpOwotCQkJKmZpcnN0YmxvY2sgPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOworCQkJCQlibWEuY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jaykpKTsKKwkJCSpmaXJzdGJsb2NrID0gYm1hLmN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CiAJCX0KLQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLAorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibWEuY3VyLAogCQkJZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOiBYRlNfQlRSRUVfTk9FUlJPUik7CiAJfQogCWlmICghZXJyb3IpCkBAIC00ODkyLDU4ICs1MDIwLDYgQEAKIH0KIAogLyoKLSAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCi0gKiBPbmUgYmxvY2sgKGV4dGVudCkgb25seSwgcmVhZC1vbmx5LgotICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KLSAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCi0gKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgotICovCi1pbnQJCQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBpX3NpbmdsZSgKLQl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JaW50CQl3aGljaGZvcmssCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0JeGZzX2ZzYmxvY2tfdAkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KLQl4ZnNfZmlsZW9mZl90CWJubykJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCi17Ci0JaW50CQllb2Y7CQkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnRzICovCi0JaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLwotCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KLQl4ZnNfZXh0bnVtX3QJbGFzdHg7CQkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCi0JeGZzX2JtYnRfaXJlY190CXByZXY7CQkvKiBwcmV2aW91cyBmaWxlIGV4dGVudCByZWNvcmQgKi8KLQotCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7Ci0JaWYgKHVubGlrZWx5KAotCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCi0JICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykpIHsKLQkgICAgICAgWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3NpbmdsZSIsIFhGU19FUlJMRVZFTF9MT1csCi0JCQkJaXAtPmlfbW91bnQpOwotCSAgICAgICByZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Ci0JfQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQotCQlyZXR1cm4gZXJyb3I7Ci0JKHZvaWQpeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgd2hpY2hmb3JrLCAmZW9mLCAmbGFzdHgsICZnb3QsCi0JCSZwcmV2KTsKLQkvKgotCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKLQkgKiB1cCB0byBlbmQuCi0JICovCi0JaWYgKGVvZiB8fCBnb3QuYnJfc3RhcnRvZmYgPiBibm8pIHsKLQkJKmZzYiA9IE5VTExGU0JMT0NLOwotCQlyZXR1cm4gMDsKLQl9Ci0JQVNTRVJUKCFpc251bGxzdGFydGJsb2NrKGdvdC5icl9zdGFydGJsb2NrKSk7Ci0JQVNTRVJUKGJubyA8IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50KTsKLQkqZnNiID0gZ290LmJyX3N0YXJ0YmxvY2sgKyAoYm5vIC0gZ290LmJyX3N0YXJ0b2ZmKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KICAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KICAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KQEAgLTUxMTQsOSArNTE5MCw5IEBACiAJCQkJZGVsLmJyX2Jsb2NrY291bnQgPSBtb2Q7CiAJCQl9CiAJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKLQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKLQkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzLAotCQkJCVhGU19EQVRBX0ZPUkspOworCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLCBpcCwKKwkJCQkJJmxhc3R4LCAmY3VyLCAmZGVsLCBmaXJzdGJsb2NrLCBmbGlzdCwKKwkJCQkJJmxvZ2ZsYWdzKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGVycm9yMDsKIAkJCWdvdG8gbm9kZWxldGU7CkBAIC01MTcyLDE4ICs1MjQ4LDE4IEBACiAJCQkJfQogCQkJCXByZXYuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKIAkJCQlsYXN0eC0tOwotCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudCh0cCwgaXAsICZsYXN0eCwKLQkJCQkJCSZjdXIsICZwcmV2LCBmaXJzdGJsb2NrLCBmbGlzdCwKLQkJCQkJCSZsb2dmbGFncywgWEZTX0RBVEFfRk9SSyk7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLAorCQkJCQkJaXAsICZsYXN0eCwgJmN1ciwgJnByZXYsCisJCQkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gZXJyb3IwOwogCQkJCWdvdG8gbm9kZWxldGU7CiAJCQl9IGVsc2UgewogCQkJCUFTU0VSVChkZWwuYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKTsKIAkJCQlkZWwuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKLQkJCQllcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnQodHAsIGlwLCAmbGFzdHgsCi0JCQkJCQkmY3VyLCAmZGVsLCBmaXJzdGJsb2NrLCBmbGlzdCwKLQkJCQkJCSZsb2dmbGFncywgWEZTX0RBVEFfRk9SSyk7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKHRwLAorCQkJCQkJaXAsICZsYXN0eCwgJmN1ciwgJmRlbCwKKwkJCQkJCWZpcnN0YmxvY2ssIGZsaXN0LCAmbG9nZmxhZ3MpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJZ290byBlcnJvcjA7CiAJCQkJZ290byBub2RlbGV0ZTsKQEAgLTU1MDUsMTAgKzU1ODEsOSBAQAogCiAJZG8gewogCQlubWFwID0gKG5leGxlZnQgPiBzdWJuZXgpID8gc3VibmV4IDogbmV4bGVmdDsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAotCQkJCSAgWEZTX0JCX1RPX0ZTQihtcCwgYm12LT5ibXZfbGVuZ3RoKSwKLQkJCQkgIGJtYXBpX2ZsYWdzLCBOVUxMLCAwLCBtYXAsICZubWFwLAotCQkJCSAgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAorCQkJCSAgICAgICBYRlNfQkJfVE9fRlNCKG1wLCBibXYtPmJtdl9sZW5ndGgpLAorCQkJCSAgICAgICBtYXAsICZubWFwLCBibWFwaV9mbGFncyk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2ZyZWVfbWFwOwogCQlBU1NFUlQobm1hcCA8PSBzdWJuZXgpOwpAQCAtNTU4Miw4OSArNTY1Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAotICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCi0gKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCi0gKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgotICovCi1TVEFUSUMgaW50CQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9pc2Flb2YoCi0JeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQl4ZnNfZmlsZW9mZl90ICAgb2ZmLAkJLyogZmlsZSBvZmZzZXQgaW4gZnNibG9ja3MgKi8KLQlpbnQgICAgICAgICAgICAgd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JY2hhcgkJKmFlb2YpCQkvKiByZXR1cm4gdmFsdWUgKi8KLXsKLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLwotCXhmc19ibWJ0X3JlY19ob3N0X3QgKmxhc3RyZWM7CS8qIGV4dGVudCByZWNvcmQgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogbnVtYmVyIG9mIGZpbGUgZXh0ZW50cyAqLwotCXhmc19ibWJ0X2lyZWNfdAlzOwkJLyogZXhwYW5kZWQgZXh0ZW50IHJlY29yZCAqLwotCi0JQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCi0JCXJldHVybiBlcnJvcjsKLQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCWlmIChuZXh0ZW50cyA9PSAwKSB7Ci0JCSphZW9mID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qCi0JICogR28gdG8gdGhlIGxhc3QgZXh0ZW50Ci0JICovCi0JbGFzdHJlYyA9IHhmc19pZXh0X2dldF9leHQoaWZwLCBuZXh0ZW50cyAtIDEpOwotCXhmc19ibWJ0X2dldF9hbGwobGFzdHJlYywgJnMpOwotCS8qCi0JICogQ2hlY2sgd2UgYXJlIGFsbG9jYXRpbmcgaW4gdGhlIGxhc3QgZXh0ZW50IChmb3IgZGVsYXllZCBhbGxvY2F0aW9ucykKLQkgKiBvciBwYXN0IHRoZSBsYXN0IGV4dGVudCBmb3Igbm9uLWRlbGF5ZWQgYWxsb2NhdGlvbnMuCi0JICovCi0JKmFlb2YgPSAob2ZmID49IHMuYnJfc3RhcnRvZmYgJiYKLQkJIG9mZiA8IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQgJiYKLQkJIGlzbnVsbHN0YXJ0YmxvY2socy5icl9zdGFydGJsb2NrKSkgfHwKLQkJb2ZmID49IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdwotICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeS4KLSAqLwotaW50CQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBfZW9mKAotCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCi0JeGZzX2ZpbGVvZmZfdAllbmRvZmYsCQkvKiBmaWxlIG9mZnNldCBpbiBmc2Jsb2NrcyAqLwotCWludAkJd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCi0JaW50CQkqZW9mKQkJLyogcmVzdWx0IHZhbHVlICovCi17Ci0JeGZzX2ZzYmxvY2tfdAlibG9ja2NvdW50OwkvKiBleHRlbnQgYmxvY2sgY291bnQgKi8KLQlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCi0JeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLwotCXhmc19ibWJ0X3JlY19ob3N0X3QgKmxhc3RyZWM7CS8qIGV4dGVudCByZWNvcmQgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogbnVtYmVyIG9mIGZpbGUgZXh0ZW50cyAqLwotCXhmc19maWxlb2ZmX3QJc3RhcnRvZmY7CS8qIGV4dGVudCBzdGFydGluZyBmaWxlIG9mZnNldCAqLwotCi0JQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKTsKLQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOwotCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgotCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgd2hpY2hmb3JrKSkpCi0JCXJldHVybiBlcnJvcjsKLQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOwotCWlmIChuZXh0ZW50cyA9PSAwKSB7Ci0JCSplb2YgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoKLQkgKiBHbyB0byB0aGUgbGFzdCBleHRlbnQKLQkgKi8KLQlsYXN0cmVjID0geGZzX2lleHRfZ2V0X2V4dChpZnAsIG5leHRlbnRzIC0gMSk7Ci0Jc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYobGFzdHJlYyk7Ci0JYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGxhc3RyZWMpOwotCSplb2YgPSBlbmRvZmYgPj0gc3RhcnRvZmYgKyBibG9ja2NvdW50OwotCXJldHVybiAwOwotfQotCiAjaWZkZWYgREVCVUcKIFNUQVRJQyBzdHJ1Y3QgeGZzX2J1ZiAqCiB4ZnNfYm1hcF9nZXRfYnAoCkBAIC02MDk5LDkgKzYwOTEsOCBAQAogCQkgKiB0cnlpbmcgdG8gcmVtb3ZlIGEgcmVhbCBleHRlbnQgKHdoaWNoIHJlcXVpcmVzIGEKIAkJICogdHJhbnNhY3Rpb24pIG9yIGEgaG9sZSwgd2hpY2ggaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4uLgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0X2ZzYiwgMSwKLQkJCQlYRlNfQk1BUElfRU5USVJFLCAgTlVMTCwgMCwgJmltYXAsCi0JCQkJJm5pbWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIHN0YXJ0X2ZzYiwgMSwgJmltYXAsICZuaW1hcHMsCisJCQkJICAgICAgIFhGU19CTUFQSV9FTlRJUkUpOwogCiAJCWlmIChlcnJvcikgewogCQkJLyogc29tZXRoaW5nIHNjcmV3ZWQsIGp1c3QgYmFpbCAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmggYi9mcy94ZnMveGZzX2JtYXAuaAppbmRleCBjNjIyMzRiLi44OWVlNjcyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuaAorKysgYi9mcy94ZnMveGZzX2JtYXAuaApAQCAtNjIsMjcgKzYyLDIzIEBACiAjZGVmaW5lCVhGU19CTUFQX01BWF9OTUFQCTQKIAogLyoKLSAqIEZsYWdzIGZvciB4ZnNfYm1hcGkKKyAqIEZsYWdzIGZvciB4ZnNfYm1hcGlfKgogICovCi0jZGVmaW5lCVhGU19CTUFQSV9XUklURQkJMHgwMDEJLyogd3JpdGUgb3BlcmF0aW9uOiBhbGxvY2F0ZSBzcGFjZSAqLwotI2RlZmluZSBYRlNfQk1BUElfREVMQVkJCTB4MDAyCS8qIGRlbGF5ZWQgd3JpdGUgb3BlcmF0aW9uICovCi0jZGVmaW5lIFhGU19CTUFQSV9FTlRJUkUJMHgwMDQJLyogcmV0dXJuIGVudGlyZSBleHRlbnQsIG5vdCB0cmltbWVkICovCi0jZGVmaW5lIFhGU19CTUFQSV9NRVRBREFUQQkweDAwOAkvKiBtYXBwaW5nIG1ldGFkYXRhIG5vdCB1c2VyIGRhdGEgKi8KLSNkZWZpbmUgWEZTX0JNQVBJX0FUVFJGT1JLCTB4MDEwCS8qIHVzZSBhdHRyaWJ1dGUgZm9yayBub3QgZGF0YSAqLwotI2RlZmluZQlYRlNfQk1BUElfUFJFQUxMT0MJMHgwNDAJLyogcHJlYWxsb2NhdGlvbiBvcDogdW53cml0dGVuIHNwYWNlICovCi0jZGVmaW5lCVhGU19CTUFQSV9JR1NUQVRFCTB4MDgwCS8qIElnbm9yZSBzdGF0ZSAtICovCisjZGVmaW5lIFhGU19CTUFQSV9FTlRJUkUJMHgwMDEJLyogcmV0dXJuIGVudGlyZSBleHRlbnQsIG5vdCB0cmltbWVkICovCisjZGVmaW5lIFhGU19CTUFQSV9NRVRBREFUQQkweDAwMgkvKiBtYXBwaW5nIG1ldGFkYXRhIG5vdCB1c2VyIGRhdGEgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0FUVFJGT1JLCTB4MDA0CS8qIHVzZSBhdHRyaWJ1dGUgZm9yayBub3QgZGF0YSAqLworI2RlZmluZSBYRlNfQk1BUElfUFJFQUxMT0MJMHgwMDgJLyogcHJlYWxsb2NhdGlvbiBvcDogdW53cml0dGVuIHNwYWNlICovCisjZGVmaW5lIFhGU19CTUFQSV9JR1NUQVRFCTB4MDEwCS8qIElnbm9yZSBzdGF0ZSAtICovCiAJCQkJCS8qIGNvbWJpbmUgY29udGlnLiBzcGFjZSAqLwotI2RlZmluZQlYRlNfQk1BUElfQ09OVElHCTB4MTAwCS8qIG11c3QgYWxsb2NhdGUgb25seSBvbmUgZXh0ZW50ICovCisjZGVmaW5lIFhGU19CTUFQSV9DT05USUcJMHgwMjAJLyogbXVzdCBhbGxvY2F0ZSBvbmx5IG9uZSBleHRlbnQgKi8KIC8qCiAgKiB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gLSB0aGlzIG5lZWRzIHdyaXRlIGNhY2hlIGZsdXNoaW5nIGFuZCBubyBhZGRpdGlvbmFsCiAgKiBhbGxvY2F0aW9uIGFsaWdubWVudHMuIFdoZW4gc3BlY2lmaWVkIHdpdGggWEZTX0JNQVBJX1BSRUFMTE9DIGl0IGNvbnZlcnRzCiAgKiBmcm9tIHdyaXR0ZW4gdG8gdW53cml0dGVuLCBvdGhlcndpc2UgY29udmVydCBmcm9tIHVud3JpdHRlbiB0byB3cml0dGVuLgogICovCi0jZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MjAwCisjZGVmaW5lIFhGU19CTUFQSV9DT05WRVJUCTB4MDQwCiAKICNkZWZpbmUgWEZTX0JNQVBJX0ZMQUdTIFwKLQl7IFhGU19CTUFQSV9XUklURSwJIldSSVRFIiB9LCBcCi0JeyBYRlNfQk1BUElfREVMQVksCSJERUxBWSIgfSwgXAogCXsgWEZTX0JNQVBJX0VOVElSRSwJIkVOVElSRSIgfSwgXAogCXsgWEZTX0JNQVBJX01FVEFEQVRBLAkiTUVUQURBVEEiIH0sIFwKIAl7IFhGU19CTUFQSV9BVFRSRk9SSywJIkFUVFJGT1JLIiB9LCBcCkBAIC0xMTMsMjEgKzEwOSwyOCBAQAogICogQXJndW1lbnQgc3RydWN0dXJlIGZvciB4ZnNfYm1hcF9hbGxvYy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYWxsb2NhIHsKLQl4ZnNfZnNibG9ja190CQlmaXJzdGJsb2NrOyAvKiBpL28gZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCi0JeGZzX2ZzYmxvY2tfdAkJcnZhbDsJLyogc3RhcnRpbmcgYmxvY2sgb2YgbmV3IGV4dGVudCAqLwotCXhmc19maWxlb2ZmX3QJCW9mZjsJLyogb2Zmc2V0IGluIGZpbGUgZmlsbGluZyBpbiAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrOyAvKiBpL28gZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJc3RydWN0IHhmc19ibWFwX2ZyZWUJKmZsaXN0OwkvKiBibWFwIGZyZWVsaXN0ICovCiAJc3RydWN0IHhmc190cmFucwkqdHA7CS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAlzdHJ1Y3QgeGZzX2lub2RlCSppcDsJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqcHJldnA7CS8qIGV4dGVudCBiZWZvcmUgdGhlIG5ldyBvbmUgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqZ290cDsJLyogZXh0ZW50IGFmdGVyLCBvciBkZWxheWVkICovCi0JeGZzX2V4dGxlbl90CQlhbGVuOwkvKiBpL28gbGVuZ3RoIGFza2VkL2FsbG9jYXRlZCAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CS8qIGV4dGVudCBiZWZvcmUgdGhlIG5ldyBvbmUgKi8KKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlnb3Q7CS8qIGV4dGVudCBhZnRlciwgb3IgZGVsYXllZCAqLworCisJeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSBmaWxsaW5nIGluICovCisJeGZzX2V4dGxlbl90CQlsZW5ndGg7CS8qIGkvbyBsZW5ndGggYXNrZWQvYWxsb2NhdGVkICovCisJeGZzX2ZzYmxvY2tfdAkJYmxrbm87CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIG5ldyBleHRlbnQgKi8KKworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19leHRudW1fdAkJaWR4OwkvKiBjdXJyZW50IGV4dGVudCBpbmRleCAqLworCWludAkJCW5hbGxvY3M7LyogbnVtYmVyIG9mIGV4dGVudHMgYWxsb2MnZCAqLworCWludAkJCWxvZ2ZsYWdzOy8qIGZsYWdzIGZvciB0cmFuc2FjdGlvbiBsb2dnaW5nICovCisKIAl4ZnNfZXh0bGVuX3QJCXRvdGFsOwkvKiB0b3RhbCBibG9ja3MgbmVlZGVkIGZvciB4YWN0aW9uICovCiAJeGZzX2V4dGxlbl90CQltaW5sZW47CS8qIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplIChibG9ja3MpICovCiAJeGZzX2V4dGxlbl90CQltaW5sZWZ0OyAvKiBhbW91bnQgbXVzdCBiZSBsZWZ0IGFmdGVyIGFsbG9jICovCiAJY2hhcgkJCWVvZjsJLyogc2V0IGlmIGFsbG9jYXRpbmcgcGFzdCBsYXN0IGV4dGVudCAqLwogCWNoYXIJCQl3YXNkZWw7CS8qIHJlcGxhY2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbiAqLwogCWNoYXIJCQl1c2VyZGF0YTsvKiBzZXQgaWYgaXMgdXNlciBkYXRhICovCi0JY2hhcgkJCWxvdzsJLyogbG93IG9uIHNwYWNlLCB1c2luZyBzZXEnbCBhZ3MgKi8KIAljaGFyCQkJYWVvZjsJLyogYWxsb2NhdGVkIHNwYWNlIGF0IGVvZiAqLwogCWNoYXIJCQljb252OwkvKiBvdmVyd3JpdGluZyB1bndyaXR0ZW4gZXh0ZW50cyAqLwogfSB4ZnNfYm1hbGxvY2FfdDsKQEAgLTE1MiwyNTEgKzE1NSw2MiBAQAogCXsgQk1BUF9SSUdIVF9GSUxMSU5HLAkiUkYiIH0sIFwKIAl7IEJNQVBfQVRUUkZPUkssCSJBVFRSIiB9CiAKLS8qCi0gKiBBZGQgYm1hcCB0cmFjZSBpbnNlcnQgZW50cmllcyBmb3IgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZW50IGxpc3QuCi0gKgotICogUXVpdGUgZXhjZXNzaXZlIHRyYWNpbmcuICBPbmx5IGRvIHRoaXMgZm9yIGRlYnVnIGJ1aWxkcy4KLSAqLwogI2lmIGRlZmluZWQoX19LRVJORUwpICYmIGRlZmluZWQoREVCVUcpCi12b2lkCi14ZnNfYm1hcF90cmFjZV9leGxpc3QoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCXhmc19leHRudW1fdAkJY250LAkJLyogY291bnQgb2YgZW50cmllcyBpbiBsaXN0ICovCi0JaW50CQkJd2hpY2hmb3JrLAotCXVuc2lnbmVkIGxvbmcJCWNhbGxlcl9pcCk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit2b2lkCXhmc19ibWFwX3RyYWNlX2V4bGlzdChzdHJ1Y3QgeGZzX2lub2RlICppcCwgeGZzX2V4dG51bV90IGNudCwKKwkJaW50IHdoaWNoZm9yaywgdW5zaWduZWQgbG9uZyBjYWxsZXJfaXApOwogI2RlZmluZQlYRlNfQk1BUF9UUkFDRV9FWExJU1QoaXAsYyx3KQlcCiAJeGZzX2JtYXBfdHJhY2VfZXhsaXN0KGlwLGMsdywgX1RISVNfSVBfKQogI2Vsc2UKICNkZWZpbmUJWEZTX0JNQVBfVFJBQ0VfRVhMSVNUKGlwLGMsdykKICNlbmRpZgogCi0vKgotICogQ29udmVydCBpbm9kZSBmcm9tIG5vbi1hdHRyaWJ1dGVkIHRvIGF0dHJpYnV0ZWQuCi0gKiBNdXN0IG5vdCBiZSBpbiBhIHRyYW5zYWN0aW9uLCBpcCBtdXN0IG5vdCBiZSBsb2NrZWQuCi0gKi8KLWludAkJCQkJLyogZXJyb3IgY29kZSAqLwoteGZzX2JtYXBfYWRkX2F0dHJmb3JrKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLwotCWludAkJCXNpemUsCS8qIHNwYWNlIG5lZWRlZCBmb3IgbmV3IGF0dHJpYnV0ZSAqLwotCWludAkJCXJzdmQpOwkvKiBmbGFnIGZvciByZXNlcnZlZCBibG9jayBhbGxvY2F0aW9uICovCi0KLS8qCi0gKiBBZGQgdGhlIGV4dGVudCB0byB0aGUgbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWUgYXQgdHJhbnNhY3Rpb24gZW5kLgotICogVGhlIGxpc3QgaXMgbWFpbnRhaW5lZCBzb3J0ZWQgKGJ5IGJsb2NrIG51bWJlcikuCi0gKi8KLXZvaWQKLXhmc19ibWFwX2FkZF9mcmVlKAotCXhmc19mc2Jsb2NrX3QJCWJubywJCS8qIGZzIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KLQl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBsaXN0IG9mIGV4dGVudHMgKi8KLQlzdHJ1Y3QgeGZzX21vdW50CSptcCk7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KLQotLyoKLSAqIFJvdXRpbmUgdG8gY2xlYW4gdXAgdGhlIGZyZWUgbGlzdCBkYXRhIHN0cnVjdHVyZSB3aGVuCi0gKiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCi0gKi8KLXZvaWQKLXhmc19ibWFwX2NhbmNlbCgKLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGZyZWUgbGlzdCB0byBjbGVhbiB1cCAqLwotCi0vKgotICogQ29tcHV0ZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWUgb2YgdGhlIG1heGltdW0gZGVwdGggb2YgYSBibWFwIGJ0cmVlCi0gKiBpbiB0aGlzIGZpbGVzeXN0ZW0uICBEb25lIG9uY2UsIGR1cmluZyBtb3VudC4KLSAqLwotdm9pZAoteGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLwotCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdW51c2VkIGJsb2NrIGluIHRoZSBmaWxlLgotICogVGhpcyBpcyB0aGUgbG93ZXN0LWFkZHJlc3MgaG9sZSBpZiB0aGUgZmlsZSBoYXMgaG9sZXMsIGVsc2UgdGhlIGZpcnN0IGJsb2NrCi0gKiBwYXN0IHRoZSBlbmQgb2YgZmlsZS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2ZpcnN0X3VudXNlZCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19leHRsZW5fdAkJbGVuLAkJLyogc2l6ZSBvZiBob2xlIHRvIGZpbmQgKi8KLQl4ZnNfZmlsZW9mZl90CQkqdW51c2VkLAkvKiB1bnVzZWQgYmxvY2sgbnVtICovCi0JaW50CQkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KLQotLyoKLSAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBsYXN0IGJsb2NrICsgMSBiZWZvcmUKLSAqIGxhc3RfYmxvY2sgKGlucHV0IHZhbHVlKSBpbiB0aGUgZmlsZS4KLSAqIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgotICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2xhc3RfYmVmb3JlKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJKmxhc3RfYmxvY2ssCS8qIGxhc3QgYmxvY2sgKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIHBhc3QgZW9mIGluCi0gKiB0aGUgZmlsZS4gIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgotICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2xhc3Rfb2Zmc2V0KAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJKnVudXNlZCwJLyogbGFzdCBibG9jayBudW0gKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3RlZCBmb3JrIG9mIHRoZSBpbm9kZSBoYXMgZXhhY3RseSBvbmUKLSAqIGJsb2NrIG9yIG5vdC4gIEZvciB0aGUgZGF0YSBmb3JrIHdlIGNoZWNrIHRoaXMgbWF0Y2hlcyBkaV9zaXplLAotICogaW1wbHlpbmcgdGhlIGZpbGUncyByYW5nZSBpcyAwLi5ic2l6ZS0xLgotICovCi1pbnQKLXhmc19ibWFwX29uZV9ibG9jaygKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCi0KLS8qCi0gKiBSZWFkIGluIHRoZSBleHRlbnRzIHRvIGl1X2V4dGVudHMuCi0gKiBBbGwgaW5vZGUgZmllbGRzIGFyZSBzZXQgdXAgYnkgY2FsbGVyLCB3ZSBqdXN0IHRyYXZlcnNlIHRoZSBidHJlZQotICogYW5kIGNvcHkgdGhlIHJlY29yZHMgaW4uCi0gKi8KLWludAkJCQkJCS8qIGVycm9yICovCi14ZnNfYm1hcF9yZWFkX2V4dGVudHMoCi0Jc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KLQlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwotCi0vKgotICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLgotICogRmlsZSByYW5nZSBpcyBnaXZlbiBieSB0aGUgYm5vL2xlbiBwYWlyLgotICogQWRkcyBibG9ja3MgdG8gZmlsZSBpZiBhIHdyaXRlICgiZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUiIHNldCkKLSAqIGludG8gYSBob2xlIG9yIHBhc3QgZW9mLgotICogT25seSBhbGxvY2F0ZXMgYmxvY2tzIGZyb20gYSBzaW5nbGUgYWxsb2NhdGlvbiBncm91cCwKLSAqIHRvIGF2b2lkIGxvY2tpbmcgcHJvYmxlbXMuCi0gKiBUaGUgcmV0dXJuZWQgdmFsdWUgaW4gImZpcnN0YmxvY2siIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gYSB0cmFuc2FjdGlvbgotICogbXVzdCBiZSByZW1lbWJlcmVkIGFuZCBwcmVzZW50ZWQgdG8gc3Vic2VxdWVudCBjYWxscyBpbiAiZmlyc3RibG9jayIuCi0gKiBBbiB1cHBlciBib3VuZCBmb3IgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGlzIHN1cHBsaWVkIHRvCi0gKiB0aGUgZmlyc3QgY2FsbCBpbiAidG90YWwiOyBpZiBubyBhbGxvY2F0aW9uIGdyb3VwIGhhcyB0aGF0IG1hbnkgZnJlZQotICogYmxvY2tzIHRoZW4gdGhlIGNhbGwgd2lsbCBmYWlsIChyZXR1cm4gTlVMTEZTQkxPQ0sgaW4gImZpcnN0YmxvY2siKS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwaSgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCi0JeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCi0JaW50CQkJZmxhZ3MsCQkvKiBYRlNfQk1BUElfLi4uICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jawotCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2V4dGxlbl90CQl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLwotCWludAkJCSpubWFwLAkJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQotLyoKLSAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcywgc2ltcGxlIHZlcnNpb24uCi0gKiBPbmUgYmxvY2sgb25seSwgcmVhZC1vbmx5LgotICogRm9yIGZsYWdzLCBvbmx5IHRoZSBYRlNfQk1BUElfQVRUUkZPUksgZmxhZyBpcyBleGFtaW5lZC4KLSAqIEZvciB0aGUgb3RoZXIgZmxhZyB2YWx1ZXMsIHRoZSBlZmZlY3QgaXMgYXMgaWYgWEZTX0JNQVBJX01FVEFEQVRBCi0gKiB3YXMgc2V0IGFuZCBhbGwgdGhlIG90aGVycyB3ZXJlIGNsZWFyLgotICovCi1pbnQJCQkJCQkvKiBlcnJvciAqLwoteGZzX2JtYXBpX3NpbmdsZSgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLwotCWludAkJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KLQl4ZnNfZnNibG9ja190CQkqZnNiLAkJLyogb3V0cHV0OiBtYXBwZWQgYmxvY2sgKi8KLQl4ZnNfZmlsZW9mZl90CQlibm8pOwkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KLQotLyoKLSAqIFVubWFwIChyZW1vdmUpIGJsb2NrcyBmcm9tIGEgZmlsZS4KLSAqIElmIG5leHRzIGlzIG5vbnplcm8gdGhlbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgdG8gcmVtb3ZlIGlzIGxpbWl0ZWQgdG8KLSAqIHRoYXQgdmFsdWUuICBJZiBub3QgYWxsIGV4dGVudHMgaW4gdGhlIGJsb2NrIHJhbmdlIGNhbiBiZSByZW1vdmVkIHRoZW4KLSAqICpkb25lIGlzIHNldC4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19idW5tYXBpKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCi0JeGZzX2ZpbGVvZmZfdAkJYm5vLAkJLyogc3RhcnRpbmcgb2Zmc2V0IHRvIHVubWFwICovCi0JeGZzX2ZpbGJsa3NfdAkJbGVuLAkJLyogbGVuZ3RoIHRvIHVubWFwIGluIGZpbGUgKi8KLQlpbnQJCQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KLQl4ZnNfZXh0bnVtX3QJCW5leHRzLAkJLyogbnVtYmVyIG9mIGV4dGVudHMgbWF4ICovCi0JeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGFsbG9jYXRlZCBibG9jawotCQkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCi0JeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCi0JaW50CQkJKmRvbmUpOwkJLyogc2V0IGlmIG5vdCBkb25lIHlldCAqLwotCi0vKgotICogQ2hlY2sgYW4gZXh0ZW50IGxpc3QsIHdoaWNoIGhhcyBqdXN0IGJlZW4gcmVhZCwgZm9yCi0gKiBhbnkgYml0IGluIHRoZSBleHRlbnQgZmxhZyBmaWVsZC4KLSAqLwotaW50Ci14ZnNfY2hlY2tfbm9zdGF0ZV9leHRlbnRzKAotCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCwKLQl4ZnNfZXh0bnVtX3QJCWlkeCwKLQl4ZnNfZXh0bnVtX3QJCW51bSk7Ci0KLXVpbnQKLXhmc19kZWZhdWx0X2F0dHJvZmZzZXQoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXApOworaW50CXhmc19ibWFwX2FkZF9hdHRyZm9yayhzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IHNpemUsIGludCByc3ZkKTsKK3ZvaWQJeGZzX2JtYXBfYWRkX2ZyZWUoeGZzX2ZzYmxvY2tfdCBibm8sIHhmc19maWxibGtzX3QgbGVuLAorCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK3ZvaWQJeGZzX2JtYXBfY2FuY2VsKHN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdCk7Cit2b2lkCXhmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgd2hpY2hmb3JrKTsKK2ludAl4ZnNfYm1hcF9maXJzdF91bnVzZWQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZXh0bGVuX3QgbGVuLCB4ZnNfZmlsZW9mZl90ICp1bnVzZWQsIGludCB3aGljaGZvcmspOworaW50CXhmc19ibWFwX2xhc3RfYmVmb3JlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJeGZzX2ZpbGVvZmZfdCAqbGFzdF9ibG9jaywgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBfbGFzdF9vZmZzZXQoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZmlsZW9mZl90ICp1bnVzZWQsIGludCB3aGljaGZvcmspOworaW50CXhmc19ibWFwX29uZV9ibG9jayhzdHJ1Y3QgeGZzX2lub2RlICppcCwgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBfcmVhZF9leHRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2JtYXBpX3JlYWQoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAorCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCisJCWludCAqbm1hcCwgaW50IGZsYWdzKTsKK2ludAl4ZnNfYm1hcGlfZGVsYXkoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAorCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCisJCWludCAqbm1hcCwgaW50IGZsYWdzKTsKK2ludAl4ZnNfYm1hcGlfd3JpdGUoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAorCQl4ZnNfZmlsZW9mZl90IGJubywgeGZzX2ZpbGJsa3NfdCBsZW4sIGludCBmbGFncywKKwkJeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywgeGZzX2V4dGxlbl90IHRvdGFsLAorCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqbXZhbCwgaW50ICpubWFwLAorCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QpOworaW50CXhmc19idW5tYXBpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJeGZzX2ZpbGVvZmZfdCBibm8sIHhmc19maWxibGtzX3QgbGVuLCBpbnQgZmxhZ3MsCisJCXhmc19leHRudW1fdCBuZXh0cywgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKmZsaXN0LCBpbnQgKmRvbmUpOworaW50CXhmc19jaGVja19ub3N0YXRlX2V4dGVudHMoc3RydWN0IHhmc19pZm9yayAqaWZwLCB4ZnNfZXh0bnVtX3QgaWR4LAorCQl4ZnNfZXh0bnVtX3QgbnVtKTsKK3VpbnQJeGZzX2RlZmF1bHRfYXR0cm9mZnNldChzdHJ1Y3QgeGZzX2lub2RlICppcCk7CiAKICNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCi0gKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQotICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4KLSAqCi0gKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lIGFsbG9jYXRlZCwKLSAqIGFuZCAwIG90aGVyd2lzZS4KLSAqLwotaW50CQkJCQkJLyogZXJyb3IgKi8KLXhmc19ibWFwX2ZpbmlzaCgKLQlzdHJ1Y3QgeGZzX3RyYW5zCSoqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyIGFkZHIgKi8KLQl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KLQlpbnQJCQkqY29tbWl0dGVkKTsJLyogeGFjdCBjb21taXR0ZWQgb3Igbm90ICovCi0KIC8qIGJtYXAgdG8gdXNlcnNwYWNlIGZvcm1hdHRlciAtIGNvcHkgdG8gdXNlciAmIGFkdmFuY2UgcG9pbnRlciAqLwogdHlwZWRlZiBpbnQgKCp4ZnNfYm1hcF9mb3JtYXRfdCkodm9pZCAqKiwgc3RydWN0IGdldGJtYXB4ICosIGludCAqKTsKIAotLyoKLSAqIEdldCBpbm9kZSdzIGV4dGVudHMgYXMgZGVzY3JpYmVkIGluIGJtdiwgYW5kIGZvcm1hdCBmb3Igb3V0cHV0LgotICovCi1pbnQJCQkJCQkvKiBlcnJvciBjb2RlICovCi14ZnNfZ2V0Ym1hcCgKLQl4ZnNfaW5vZGVfdAkJKmlwLAotCXN0cnVjdCBnZXRibWFweAkJKmJtdiwJCS8qIHVzZXIgYm1hcCBzdHJ1Y3R1cmUgKi8KLQl4ZnNfYm1hcF9mb3JtYXRfdAlmb3JtYXR0ZXIsCS8qIGZvcm1hdCB0byB1c2VyICovCi0Jdm9pZAkJCSphcmcpOwkJLyogZm9ybWF0dGVyIGFyZyAqLwotCi0vKgotICogQ2hlY2sgaWYgdGhlIGVuZG9mZiBpcyBvdXRzaWRlIHRoZSBsYXN0IGV4dGVudC4gSWYgc28gdGhlIGNhbGxlciB3aWxsIGdyb3cKLSAqIHRoZSBhbGxvY2F0aW9uIHRvIGEgc3RyaXBlIHVuaXQgYm91bmRhcnkKLSAqLwotaW50Ci14ZnNfYm1hcF9lb2YoCi0Jc3RydWN0IHhmc19pbm9kZSAgICAgICAgKmlwLAotCXhmc19maWxlb2ZmX3QgICAgICAgICAgIGVuZG9mZiwKLQlpbnQgICAgICAgICAgICAgICAgICAgICB3aGljaGZvcmssCi0JaW50ICAgICAgICAgICAgICAgICAgICAgKmVvZik7Ci0KLS8qCi0gKiBDb3VudCBmc2Jsb2NrcyBvZiB0aGUgZ2l2ZW4gZm9yay4KLSAqLwotaW50Ci14ZnNfYm1hcF9jb3VudF9ibG9ja3MoCi0JeGZzX3RyYW5zX3QJCSp0cCwKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQlpbnQJCQl3aGljaGZvcmssCi0JaW50CQkJKmNvdW50KTsKLQotaW50Ci14ZnNfYm1hcF9wdW5jaF9kZWxhbGxvY19yYW5nZSgKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQl4ZnNfZmlsZW9mZl90CQlzdGFydF9mc2IsCi0JeGZzX2ZpbGVvZmZfdAkJbGVuZ3RoKTsKK2ludAl4ZnNfYm1hcF9maW5pc2goc3RydWN0IHhmc190cmFucyAqKnRwLCBzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCisJCWludCAqY29tbWl0dGVkKTsKK2ludAl4ZnNfZ2V0Ym1hcChzdHJ1Y3QgeGZzX2lub2RlICppcCwgc3RydWN0IGdldGJtYXB4ICpibXYsCisJCXhmc19ibWFwX2Zvcm1hdF90IGZvcm1hdHRlciwgdm9pZCAqYXJnKTsKK2ludAl4ZnNfYm1hcF9lb2Yoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgZW5kb2ZmLAorCQlpbnQgd2hpY2hmb3JrLCBpbnQgKmVvZik7CitpbnQJeGZzX2JtYXBfY291bnRfYmxvY2tzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKKwkJaW50IHdoaWNoZm9yaywgaW50ICpjb3VudCk7CitpbnQJeGZzX2JtYXBfcHVuY2hfZGVsYWxsb2NfcmFuZ2Uoc3RydWN0IHhmc19pbm9kZSAqaXAsCisJCXhmc19maWxlb2ZmX3Qgc3RhcnRfZnNiLCB4ZnNfZmlsZW9mZl90IGxlbmd0aCk7CiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX19YRlNfQk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwppbmRleCAyYjlmZDM4Li4xZjE5ZjAzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19idHJlZS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAl9CiAJQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKGJwKSk7CiAJaWYgKGJwKQotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCByZWZ2YWwpOworCQl4ZnNfYnVmX3NldF9yZWYoYnAsIHJlZnZhbCk7CiAJKmJwcCA9IGJwOwogCXJldHVybiAwOwogfQpAQCAtOTM5LDEzICs5MzksMTMgQEAKIAlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKIAljYXNlIFhGU19CVE5VTV9CTk86CiAJY2FzZSBYRlNfQlROVU1fQ05UOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCBYRlNfQUxMT0NfQlRSRUVfUkVGKTsKKwkJeGZzX2J1Zl9zZXRfcmVmKGJwLCBYRlNfQUxMT0NfQlRSRUVfUkVGKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQlROVU1fSU5POgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfSU5PTUFQLCBYRlNfSU5PX0JUUkVFX1JFRik7CisJCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0lOT19CVFJFRV9SRUYpOwogCQlicmVhazsKIAljYXNlIFhGU19CVE5VTV9CTUFQOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCBYRlNfQk1BUF9CVFJFRV9SRUYpOworCQl4ZnNfYnVmX3NldF9yZWYoYnAsIFhGU19CTUFQX0JUUkVFX1JFRik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKQEAgLTk3MCw3ICs5NzAsOCBAQAogCSpicHAgPSB4ZnNfdHJhbnNfZ2V0X2J1ZihjdXItPmJjX3RwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLAogCQkJCSBtcC0+bV9ic2l6ZSwgZmxhZ3MpOwogCi0JQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKCpicHApKTsKKwlpZiAoISpicHApCisJCXJldHVybiBFTk9NRU07CiAKIAkqYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKCpicHApOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWYuYyBiL2ZzL3hmcy94ZnNfYnVmLmMKaW5kZXggYzU3ODM2ZC4uY2YwYWMwNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWYuYworKysgYi9mcy94ZnMveGZzX2J1Zi5jCkBAIC00Myw3ICs0Myw2IEBACiAKIHN0YXRpYyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOwogU1RBVElDIGludCB4ZnNidWZkKHZvaWQgKik7Ci1TVEFUSUMgdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNsb2dkX3dvcmtxdWV1ZTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CkBAIC02NiwxMCArNjUsNiBAQAogI2RlZmluZSB4Yl90b19rbShmbGFncykgXAogCSAoKChmbGFncykgJiBYQkZfRE9OVF9CTE9DSykgPyBLTV9OT0ZTIDogS01fU0xFRVApCiAKLSNkZWZpbmUgeGZzX2J1Zl9hbGxvY2F0ZShmbGFncykgXAotCWttZW1fem9uZV9hbGxvYyh4ZnNfYnVmX3pvbmUsIHhiX3RvX2ttKGZsYWdzKSkKLSNkZWZpbmUgeGZzX2J1Zl9kZWFsbG9jYXRlKGJwKSBcCi0Ja21lbV96b25lX2ZyZWUoeGZzX2J1Zl96b25lLCAoYnApKTsKIAogc3RhdGljIGlubGluZSBpbnQKIHhmc19idWZfaXNfdm1hcHBlZCgKQEAgLTE1Miw2ICsxNDcsNyBAQAogCXN0cnVjdCB4ZnNfYnVmCSpicCkKIHsKIAlicC0+Yl9mbGFncyB8PSBYQkZfU1RBTEU7CisJeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZShicCk7CiAJYXRvbWljX3NldCgmKGJwKS0+Yl9scnVfcmVmLCAwKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmJwLT5iX2xydSkpIHsKIAkJc3RydWN0IHhmc19idWZ0YXJnICpidHAgPSBicC0+Yl90YXJnZXQ7CkBAIC0xNjcsMTQgKzE2MywxOSBAQAogCUFTU0VSVChhdG9taWNfcmVhZCgmYnAtPmJfaG9sZCkgPj0gMSk7CiB9CiAKLVNUQVRJQyB2b2lkCi1feGZzX2J1Zl9pbml0aWFsaXplKAotCXhmc19idWZfdAkJKmJwLAotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCitzdHJ1Y3QgeGZzX2J1ZiAqCit4ZnNfYnVmX2FsbG9jKAorCXN0cnVjdCB4ZnNfYnVmdGFyZwkqdGFyZ2V0LAogCXhmc19vZmZfdAkJcmFuZ2VfYmFzZSwKIAlzaXplX3QJCQlyYW5nZV9sZW5ndGgsCiAJeGZzX2J1Zl9mbGFnc190CQlmbGFncykKIHsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOworCisJYnAgPSBrbWVtX3pvbmVfYWxsb2MoeGZzX2J1Zl96b25lLCB4Yl90b19rbShmbGFncykpOworCWlmICh1bmxpa2VseSghYnApKQorCQlyZXR1cm4gTlVMTDsKKwogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCBjZXJ0YWluIGZsYWdzIHRvIGFwcGVhciBpbiBiX2ZsYWdzLgogCSAqLwpAQCAtMjAzLDggKzIwNCw5IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYnAtPmJfd2FpdGVycyk7CiAKIAlYRlNfU1RBVFNfSU5DKHhiX2NyZWF0ZSk7Ci0KIAl0cmFjZV94ZnNfYnVmX2luaXQoYnAsIF9SRVRfSVBfKTsKKworCXJldHVybiBicDsKIH0KIAogLyoKQEAgLTI3Nyw3ICsyNzksNyBAQAogCX0gZWxzZSBpZiAoYnAtPmJfZmxhZ3MgJiBfWEJGX0tNRU0pCiAJCWttZW1fZnJlZShicC0+Yl9hZGRyKTsKIAlfeGZzX2J1Zl9mcmVlX3BhZ2VzKGJwKTsKLQl4ZnNfYnVmX2RlYWxsb2NhdGUoYnApOworCWttZW1fem9uZV9mcmVlKHhmc19idWZfem9uZSwgYnApOwogfQogCiAvKgpAQCAtNDE2LDEwICs0MTgsNyBAQAogLyoKICAqCUxvb2sgdXAsIGFuZCBjcmVhdGVzIGlmIGFic2VudCwgYSBsb2NrYWJsZSBidWZmZXIgZm9yCiAgKglhIGdpdmVuIHJhbmdlIG9mIGFuIGlub2RlLiAgVGhlIGJ1ZmZlciBpcyByZXR1cm5lZAotICoJbG9ja2VkLgkgSWYgb3RoZXIgb3ZlcmxhcHBpbmcgYnVmZmVycyBleGlzdCwgdGhleSBhcmUKLSAqCXJlbGVhc2VkIGJlZm9yZSB0aGUgbmV3IGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBsb2NrZWQsCi0gKgl3aGljaCBtYXkgaW1wbHkgdGhhdCB0aGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aG9zZSBidWZmZXJzCi0gKglhcmUgdW5sb2NrZWQuICBObyBJL08gaXMgaW1wbGllZCBieSB0aGlzIGNhbGwuCisgKglsb2NrZWQuCU5vIEkvTyBpcyBpbXBsaWVkIGJ5IHRoaXMgY2FsbC4KICAqLwogeGZzX2J1Zl90ICoKIF94ZnNfYnVmX2ZpbmQoCkBAIC00ODEsOCArNDgwLDYgQEAKIAogCS8qIE5vIG1hdGNoIGZvdW5kICovCiAJaWYgKG5ld19icCkgewotCQlfeGZzX2J1Zl9pbml0aWFsaXplKG5ld19icCwgYnRwLCByYW5nZV9iYXNlLAotCQkJCXJhbmdlX2xlbmd0aCwgZmxhZ3MpOwogCQlyYl9saW5rX25vZGUoJm5ld19icC0+Yl9yYm5vZGUsIHBhcmVudCwgcmJwKTsKIAkJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnAtPmJfcmJub2RlLCAmcGFnLT5wYWdfYnVmX3RyZWUpOwogCQkvKiB0aGUgYnVmZmVyIGtlZXBzIHRoZSBwZXJhZyByZWZlcmVuY2UgdW50aWwgaXQgaXMgZnJlZWQgKi8KQEAgLTUyNSwzNSArNTIyLDUxIEBACiB9CiAKIC8qCi0gKglBc3NlbWJsZXMgYSBidWZmZXIgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByYW5nZS4KLSAqCVN0b3JhZ2UgaW4gbWVtb3J5IGZvciBhbGwgcG9ydGlvbnMgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIGFsbG9jYXRlZCwKLSAqCWFsdGhvdWdoIGJhY2tpbmcgc3RvcmFnZSBtYXkgbm90IGJlLgorICogQXNzZW1ibGVzIGEgYnVmZmVyIGNvdmVyaW5nIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSBjb2RlIGlzIG9wdGltaXNlZCBmb3IKKyAqIGNhY2hlIGhpdHMsIGFzIG1ldGFkYXRhIGludGVuc2l2ZSB3b3JrbG9hZHMgd2lsbCBzZWUgMyBvcmRlcnMgb2YgbWFnbml0dWRlCisgKiBtb3JlIGhpdHMgdGhhbiBtaXNzZXMuCiAgKi8KLXhmc19idWZfdCAqCitzdHJ1Y3QgeGZzX2J1ZiAqCiB4ZnNfYnVmX2dldCgKIAl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LC8qIHRhcmdldCBmb3IgYnVmZmVyCQkqLwogCXhmc19vZmZfdAkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCiAJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KIAl4ZnNfYnVmX2ZsYWdzX3QJCWZsYWdzKQogewotCXhmc19idWZfdAkJKmJwLCAqbmV3X2JwOworCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CisJc3RydWN0IHhmc19idWYJCSpuZXdfYnA7CiAJaW50CQkJZXJyb3IgPSAwOwogCi0JbmV3X2JwID0geGZzX2J1Zl9hbGxvY2F0ZShmbGFncyk7CisJYnAgPSBfeGZzX2J1Zl9maW5kKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzLCBOVUxMKTsKKwlpZiAobGlrZWx5KGJwKSkKKwkJZ290byBmb3VuZDsKKworCW5ld19icCA9IHhmc19idWZfYWxsb2ModGFyZ2V0LCBpb2ZmIDw8IEJCU0hJRlQsIGlzaXplIDw8IEJCU0hJRlQsCisJCQkgICAgICAgZmxhZ3MpOwogCWlmICh1bmxpa2VseSghbmV3X2JwKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlicCA9IF94ZnNfYnVmX2ZpbmQodGFyZ2V0LCBpb2ZmLCBpc2l6ZSwgZmxhZ3MsIG5ld19icCk7CisJaWYgKCFicCkgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIG5ld19icCk7CisJCXJldHVybiBOVUxMOworCX0KKwogCWlmIChicCA9PSBuZXdfYnApIHsKIAkJZXJyb3IgPSB4ZnNfYnVmX2FsbG9jYXRlX21lbW9yeShicCwgZmxhZ3MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG5vX2J1ZmZlcjsKLQl9IGVsc2UgewotCQl4ZnNfYnVmX2RlYWxsb2NhdGUobmV3X2JwKTsKLQkJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorCX0gZWxzZQorCQlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX3pvbmUsIG5ld19icCk7CiAKKwkvKgorCSAqIE5vdyB3ZSBoYXZlIGEgd29ya2FibGUgYnVmZmVyLCBmaWxsIGluIHRoZSBibG9jayBudW1iZXIgc28KKwkgKiB0aGF0IHdlIGNhbiBkbyBJTyBvbiBpdC4KKwkgKi8KKwlicC0+Yl9ibiA9IGlvZmY7CisJYnAtPmJfY291bnRfZGVzaXJlZCA9IGJwLT5iX2J1ZmZlcl9sZW5ndGg7CisKK2ZvdW5kOgogCWlmICghKGJwLT5iX2ZsYWdzICYgWEJGX01BUFBFRCkpIHsKIAkJZXJyb3IgPSBfeGZzX2J1Zl9tYXBfcGFnZXMoYnAsIGZsYWdzKTsKIAkJaWYgKHVubGlrZWx5KGVycm9yKSkgewpAQCAtNTY0LDE4ICs1NzcsMTAgQEAKIAl9CiAKIAlYRlNfU1RBVFNfSU5DKHhiX2dldCk7Ci0KLQkvKgotCSAqIEFsd2F5cyBmaWxsIGluIHRoZSBibG9jayBudW1iZXIgbm93LCB0aGUgbWFwcGVkIGNhc2VzIGNhbiBkbwotCSAqIHRoZWlyIG93biBvdmVybGF5IG9mIHRoaXMgbGF0ZXIuCi0JICovCi0JYnAtPmJfYm4gPSBpb2ZmOwotCWJwLT5iX2NvdW50X2Rlc2lyZWQgPSBicC0+Yl9idWZmZXJfbGVuZ3RoOwotCiAJdHJhY2VfeGZzX2J1Zl9nZXQoYnAsIGZsYWdzLCBfUkVUX0lQXyk7CiAJcmV0dXJuIGJwOwogCi0gbm9fYnVmZmVyOgorbm9fYnVmZmVyOgogCWlmIChmbGFncyAmIChYQkZfTE9DSyB8IFhCRl9UUllMT0NLKSkKIAkJeGZzX2J1Zl91bmxvY2soYnApOwogCXhmc19idWZfcmVsZShicCk7CkBAIC02ODksMTkgKzY5NCw2IEBACiAJcmV0dXJuIGJwOwogfQogCi14ZnNfYnVmX3QgKgoteGZzX2J1Zl9nZXRfZW1wdHkoCi0Jc2l6ZV90CQkJbGVuLAotCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQpCi17Ci0JeGZzX2J1Zl90CQkqYnA7Ci0KLQlicCA9IHhmc19idWZfYWxsb2NhdGUoMCk7Ci0JaWYgKGJwKQotCQlfeGZzX2J1Zl9pbml0aWFsaXplKGJwLCB0YXJnZXQsIDAsIGxlbiwgMCk7Ci0JcmV0dXJuIGJwOwotfQotCiAvKgogICogUmV0dXJuIGEgYnVmZmVyIGFsbG9jYXRlZCBhcyBhbiBlbXB0eSBidWZmZXIgYW5kIGFzc29jaWF0ZWQgdG8gZXh0ZXJuYWwKICAqIG1lbW9yeSB2aWEgeGZzX2J1Zl9hc3NvY2lhdGVfbWVtb3J5KCkgYmFjayB0byBpdCdzIGVtcHR5IHN0YXRlLgpAQCAtNzg3LDEwICs3NzksOSBAQAogCWludAkJCWVycm9yLCBpOwogCXhmc19idWZfdAkJKmJwOwogCi0JYnAgPSB4ZnNfYnVmX2FsbG9jYXRlKDApOworCWJwID0geGZzX2J1Zl9hbGxvYyh0YXJnZXQsIDAsIGxlbiwgMCk7CiAJaWYgKHVubGlrZWx5KGJwID09IE5VTEwpKQogCQlnb3RvIGZhaWw7Ci0JX3hmc19idWZfaW5pdGlhbGl6ZShicCwgdGFyZ2V0LCAwLCBsZW4sIDApOwogCiAJZXJyb3IgPSBfeGZzX2J1Zl9nZXRfcGFnZXMoYnAsIHBhZ2VfY291bnQsIDApOwogCWlmIChlcnJvcikKQEAgLTgxOCw3ICs4MDksNyBAQAogCQlfX2ZyZWVfcGFnZShicC0+Yl9wYWdlc1tpXSk7CiAJX3hmc19idWZfZnJlZV9wYWdlcyhicCk7CiAgZmFpbF9mcmVlX2J1ZjoKLQl4ZnNfYnVmX2RlYWxsb2NhdGUoYnApOworCWttZW1fem9uZV9mcmVlKHhmc19idWZfem9uZSwgYnApOwogIGZhaWw6CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC05MzcsMTIgKzkyOCw2IEBACiB4ZnNfYnVmX3VubG9jaygKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQogewotCWlmICgoYnAtPmJfZmxhZ3MgJiAoWEJGX0RFTFdSSXxfWEJGX0RFTFdSSV9RKSkgPT0gWEJGX0RFTFdSSSkgewotCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKLQkJYnAtPmJfZmxhZ3MgfD0gWEJGX0FTWU5DOwotCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgMCk7Ci0JfQotCiAJWEJfQ0xFQVJfT1dORVIoYnApOwogCXVwKCZicC0+Yl9zZW1hKTsKIApAQCAtMTAxOSw5ICsxMDA0LDE5IEBACiAJdHJhY2VfeGZzX2J1Zl9pb2Vycm9yKGJwLCBlcnJvciwgX1JFVF9JUF8pOwogfQogCit2b2lkCit4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoCisJc3RydWN0IHhmc19idWYJCSpicCwKKwljb25zdCBjaGFyCQkqZnVuYykKK3sKKwl4ZnNfYWxlcnQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCwKKyJtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4JWxseCAoXCIlc1wiKSBlcnJvciAlZCBidWYgY291bnQgJXpkIiwKKwkJKF9fdWludDY0X3QpWEZTX0JVRl9BRERSKGJwKSwgZnVuYywKKwkJYnAtPmJfZXJyb3IsIFhGU19CVUZfQ09VTlQoYnApKTsKK30KKwogaW50CiB4ZnNfYndyaXRlKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXN0cnVjdCB4ZnNfYnVmCQkqYnApCiB7CiAJaW50CQkJZXJyb3I7CkBAIC0xMDMzLDI1ICsxMDI4LDEzIEBACiAJeGZzX2Jkc3RyYXRfY2IoYnApOwogCiAJZXJyb3IgPSB4ZnNfYnVmX2lvd2FpdChicCk7Ci0JaWYgKGVycm9yKQotCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFNIVVRET1dOX01FVEFfSU9fRVJST1IpOwotCXhmc19idWZfcmVsc2UoYnApOworCWlmIChlcnJvcikgeworCQl4ZnNfZm9yY2Vfc2h1dGRvd24oYnAtPmJfdGFyZ2V0LT5idF9tb3VudCwKKwkJCQkgICBTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKKwl9CiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkCi14ZnNfYmR3cml0ZSgKLQl2b2lkCQkJKm1wLAotCXN0cnVjdCB4ZnNfYnVmCQkqYnApCi17Ci0JdHJhY2VfeGZzX2J1Zl9iZHdyaXRlKGJwLCBfUkVUX0lQXyk7Ci0KLQlicC0+Yl9mbGFncyAmPSB+WEJGX1JFQUQ7Ci0JYnAtPmJfZmxhZ3MgfD0gKFhCRl9ERUxXUkkgfCBYQkZfQVNZTkMpOwotCi0JeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnAsIDEpOwotfQotCiAvKgogICogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0byBzdG9wIGEgYnVmZmVyIGZyb20gZ2V0dGluZyB3cml0dGVuIG9yIHJlYWQuCiAgKiBXZSBhdHRhY2ggdGhlIEVJTyBlcnJvciwgbXVjayB3aXRoIGl0cyBmbGFncywgYW5kIGNhbGwgeGZzX2J1Zl9pb2VuZApAQCAtMTA3NCw5ICsxMDU3LDggQEAKIAkgKiBXZSdyZSBjYWxsaW5nIHhmc19idWZfaW9lbmQsIHNvIGRlbGV0ZSBYQkZfRE9ORSBmbGFnLgogCSAqLwogCVhGU19CVUZfVU5SRUFEKGJwKTsKLQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9VTkRPTkUoYnApOwotCVhGU19CVUZfU1RBTEUoYnApOworCXhmc19idWZfc3RhbGUoYnApOwogCiAJeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAKQEAgLTExMDMsOSArMTA4NSw4IEBACiAJICogY2hhbmdlIHRoYXQgaW50ZXJmYWNlLgogCSAqLwogCVhGU19CVUZfVU5SRUFEKGJwKTsKLQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9ET05FKGJwKTsKLQlYRlNfQlVGX1NUQUxFKGJwKTsKKwl4ZnNfYnVmX3N0YWxlKGJwKTsKIAlicC0+Yl9pb2RvbmUgPSBOVUxMOwogCWlmICghKGZsICYgWEJGX0FTWU5DKSkgewogCQkvKgpAQCAtMTExNSw3ICsxMDk2LDcgQEAKIAkJICogQVNZTkMgYnVmZmVycy4KIAkJICovCiAJCXhmc19idWZfaW9lcnJvcihicCwgRUlPKTsKLQkJWEZTX0JVRl9GSU5JU0hfSU9XQUlUKGJwKTsKKwkJY29tcGxldGUoJmJwLT5iX2lvd2FpdCk7CiAJfSBlbHNlIHsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJfQpAQCAtMTI3NSwxNSArMTI1NiwxMCBAQAogewogCXRyYWNlX3hmc19idWZfaW9yZXF1ZXN0KGJwLCBfUkVUX0lQXyk7CiAKLQlpZiAoYnAtPmJfZmxhZ3MgJiBYQkZfREVMV1JJKSB7Ci0JCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCAxKTsKLQkJcmV0dXJuIDA7Ci0JfQorCUFTU0VSVCghKGJwLT5iX2ZsYWdzICYgWEJGX0RFTFdSSSkpOwogCi0JaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSB7CisJaWYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKQogCQl4ZnNfYnVmX3dhaXRfdW5waW4oYnApOwotCX0KLQogCXhmc19idWZfaG9sZChicCk7CiAKIAkvKiBTZXQgdGhlIGNvdW50IHRvIDEgaW5pdGlhbGx5LCB0aGlzIHdpbGwgc3RvcCBhbiBJL08KQEAgLTE0ODEsOSArMTQ1NywxMyBAQAogCWJ0cC0+YnRfc21hc2sgPSBzZWN0b3JzaXplIC0gMTsKIAogCWlmIChzZXRfYmxvY2tzaXplKGJ0cC0+YnRfYmRldiwgc2VjdG9yc2l6ZSkpIHsKKwkJY2hhciBuYW1lW0JERVZOQU1FX1NJWkVdOworCisJCWJkZXZuYW1lKGJ0cC0+YnRfYmRldiwgbmFtZSk7CisKIAkJeGZzX3dhcm4oYnRwLT5idF9tb3VudCwKIAkJCSJDYW5ub3Qgc2V0X2Jsb2Nrc2l6ZSB0byAldSBvbiBkZXZpY2UgJXNcbiIsCi0JCQlzZWN0b3JzaXplLCB4ZnNfYnVmX3RhcmdldF9uYW1lKGJ0cCkpOworCQkJc2VjdG9yc2l6ZSwgbmFtZSk7CiAJCXJldHVybiBFSU5WQUw7CiAJfQogCkBAIC0xNTE0LDEyICsxNDk0LDEyIEBACiB9CiAKIFNUQVRJQyBpbnQKLXhmc19hbGxvY19kZWx3cml0ZV9xdWV1ZSgKK3hmc19hbGxvY19kZWx3cmlfcXVldWUoCiAJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKIAljb25zdCBjaGFyCQkqZnNuYW1lKQogewotCUlOSVRfTElTVF9IRUFEKCZidHAtPmJ0X2RlbHdyaXRlX3F1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9kZWx3cml0ZV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9kZWx3cmlfcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKIAlidHAtPmJ0X2ZsYWdzID0gMDsKIAlidHAtPmJ0X3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBidHAsICJ4ZnNidWZkLyVzIiwgZnNuYW1lKTsKIAlpZiAoSVNfRVJSKGJ0cC0+YnRfdGFzaykpCkBAIC0xNTQ5LDcgKzE1MjksNyBAQAogCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2xydV9sb2NrKTsKIAlpZiAoeGZzX3NldHNpemVfYnVmdGFyZ19lYXJseShidHAsIGJkZXYpKQogCQlnb3RvIGVycm9yOwotCWlmICh4ZnNfYWxsb2NfZGVsd3JpdGVfcXVldWUoYnRwLCBmc25hbWUpKQorCWlmICh4ZnNfYWxsb2NfZGVsd3JpX3F1ZXVlKGJ0cCwgZnNuYW1lKSkKIAkJZ290byBlcnJvcjsKIAlidHAtPmJ0X3Nocmlua2VyLnNocmluayA9IHhmc19idWZ0YXJnX3NocmluazsKIAlidHAtPmJ0X3Nocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKQEAgLTE1NjUsNTYgKzE1NDUsNDggQEAKIC8qCiAgKglEZWxheWVkIHdyaXRlIGJ1ZmZlciBoYW5kbGluZwogICovCi1TVEFUSUMgdm9pZAordm9pZAogeGZzX2J1Zl9kZWx3cmlfcXVldWUoCi0JeGZzX2J1Zl90CQkqYnAsCi0JaW50CQkJdW5sb2NrKQorCXhmc19idWZfdAkJKmJwKQogewotCXN0cnVjdCBsaXN0X2hlYWQJKmR3cSA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOwotCXNwaW5sb2NrX3QJCSpkd2xrID0gJmJwLT5iX3RhcmdldC0+YnRfZGVsd3JpdGVfbG9jazsKKwlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmJ0cCA9IGJwLT5iX3RhcmdldDsKIAogCXRyYWNlX3hmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCBfUkVUX0lQXyk7CiAKLQlBU1NFUlQoKGJwLT5iX2ZsYWdzJihYQkZfREVMV1JJfFhCRl9BU1lOQykpID09IChYQkZfREVMV1JJfFhCRl9BU1lOQykpOworCUFTU0VSVCghKGJwLT5iX2ZsYWdzICYgWEJGX1JFQUQpKTsKIAotCXNwaW5fbG9jayhkd2xrKTsKLQkvKiBJZiBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgZGVxdWV1ZSBhbmQgcGxhY2UgYXQgdGFpbCAqLworCXNwaW5fbG9jaygmYnRwLT5idF9kZWx3cmlfbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZicC0+Yl9saXN0KSkgeworCQkvKiBpZiBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgbW92ZSBpdCB0byB0aGUgdGFpbCAqLwogCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiBfWEJGX0RFTFdSSV9RKTsKLQkJaWYgKHVubG9jaykKLQkJCWF0b21pY19kZWMoJmJwLT5iX2hvbGQpOwotCQlsaXN0X2RlbCgmYnAtPmJfbGlzdCk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoZHdxKSkgeworCQlsaXN0X21vdmVfdGFpbCgmYnAtPmJfbGlzdCwgJmJ0cC0+YnRfZGVsd3JpX3F1ZXVlKTsKKwl9IGVsc2UgewogCQkvKiBzdGFydCB4ZnNidWZkIGFzIGl0IGlzIGFib3V0IHRvIGhhdmUgc29tZXRoaW5nIHRvIGRvICovCi0JCXdha2VfdXBfcHJvY2VzcyhicC0+Yl90YXJnZXQtPmJ0X3Rhc2spOworCQlpZiAobGlzdF9lbXB0eSgmYnRwLT5idF9kZWx3cmlfcXVldWUpKQorCQkJd2FrZV91cF9wcm9jZXNzKGJwLT5iX3RhcmdldC0+YnRfdGFzayk7CisKKwkJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CisJCWJwLT5iX2ZsYWdzIHw9IFhCRl9ERUxXUkkgfCBfWEJGX0RFTFdSSV9RIHwgWEJGX0FTWU5DOworCQlsaXN0X2FkZF90YWlsKCZicC0+Yl9saXN0LCAmYnRwLT5idF9kZWx3cmlfcXVldWUpOwogCX0KLQotCWJwLT5iX2ZsYWdzIHw9IF9YQkZfREVMV1JJX1E7Ci0JbGlzdF9hZGRfdGFpbCgmYnAtPmJfbGlzdCwgZHdxKTsKIAlicC0+Yl9xdWV1ZXRpbWUgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKGR3bGspOwotCi0JaWYgKHVubG9jaykKLQkJeGZzX2J1Zl91bmxvY2soYnApOworCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKIH0KIAogdm9pZAogeGZzX2J1Zl9kZWx3cmlfZGVxdWV1ZSgKIAl4ZnNfYnVmX3QJCSpicCkKIHsKLQlzcGlubG9ja190CQkqZHdsayA9ICZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaXRlX2xvY2s7CiAJaW50CQkJZGVxdWV1ZWQgPSAwOwogCi0Jc3Bpbl9sb2NrKGR3bGspOworCXNwaW5fbG9jaygmYnAtPmJfdGFyZ2V0LT5idF9kZWx3cmlfbG9jayk7CiAJaWYgKChicC0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpICYmICFsaXN0X2VtcHR5KCZicC0+Yl9saXN0KSkgewogCQlBU1NFUlQoYnAtPmJfZmxhZ3MgJiBfWEJGX0RFTFdSSV9RKTsKIAkJbGlzdF9kZWxfaW5pdCgmYnAtPmJfbGlzdCk7CiAJCWRlcXVldWVkID0gMTsKIAl9CiAJYnAtPmJfZmxhZ3MgJj0gfihYQkZfREVMV1JJfF9YQkZfREVMV1JJX1EpOwotCXNwaW5fdW5sb2NrKGR3bGspOworCXNwaW5fdW5sb2NrKCZicC0+Yl90YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKIAogCWlmIChkZXF1ZXVlZCkKIAkJeGZzX2J1Zl9yZWxlKGJwKTsKQEAgLTE2NDYsMTYgKzE2MTgsOSBAQAogCWlmIChicC0+Yl9xdWV1ZXRpbWUgPCBqaWZmaWVzIC0gYWdlKQogCQlyZXR1cm47CiAJYnAtPmJfcXVldWV0aW1lID0gamlmZmllcyAtIGFnZTsKLQlzcGluX2xvY2soJmJ0cC0+YnRfZGVsd3JpdGVfbG9jayk7Ci0JbGlzdF9tb3ZlKCZicC0+Yl9saXN0LCAmYnRwLT5idF9kZWx3cml0ZV9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2soJmJ0cC0+YnRfZGVsd3JpdGVfbG9jayk7Ci19Ci0KLVNUQVRJQyB2b2lkCi14ZnNfYnVmX3J1bmFsbF9xdWV1ZXMoCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKnF1ZXVlKQotewotCWZsdXNoX3dvcmtxdWV1ZShxdWV1ZSk7CisJc3Bpbl9sb2NrKCZidHAtPmJ0X2RlbHdyaV9sb2NrKTsKKwlsaXN0X21vdmUoJmJwLT5iX2xpc3QsICZidHAtPmJ0X2RlbHdyaV9xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmJ0cC0+YnRfZGVsd3JpX2xvY2spOwogfQogCiAvKgpAQCAtMTY2OSwxNSArMTYzNCwxMyBAQAogCXVuc2lnbmVkIGxvbmcJYWdlKQogewogCXhmc19idWZfdAkqYnAsICpuOwotCXN0cnVjdCBsaXN0X2hlYWQgKmR3cSA9ICZ0YXJnZXQtPmJ0X2RlbHdyaXRlX3F1ZXVlOwotCXNwaW5sb2NrX3QJKmR3bGsgPSAmdGFyZ2V0LT5idF9kZWx3cml0ZV9sb2NrOwogCWludAkJc2tpcHBlZCA9IDA7CiAJaW50CQlmb3JjZTsKIAogCWZvcmNlID0gdGVzdF9hbmRfY2xlYXJfYml0KFhCVF9GT1JDRV9GTFVTSCwgJnRhcmdldC0+YnRfZmxhZ3MpOwogCUlOSVRfTElTVF9IRUFEKGxpc3QpOwotCXNwaW5fbG9jayhkd2xrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sIGR3cSwgYl9saXN0KSB7CisJc3Bpbl9sb2NrKCZ0YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnAsIG4sICZ0YXJnZXQtPmJ0X2RlbHdyaV9xdWV1ZSwgYl9saXN0KSB7CiAJCUFTU0VSVChicC0+Yl9mbGFncyAmIFhCRl9ERUxXUkkpOwogCiAJCWlmICgheGZzX2J1Zl9pc3Bpbm5lZChicCkgJiYgeGZzX2J1Zl90cnlsb2NrKGJwKSkgewpAQCAtMTY5NCwxMCArMTY1Nyw5IEBACiAJCX0gZWxzZQogCQkJc2tpcHBlZCsrOwogCX0KLQlzcGluX3VubG9jayhkd2xrKTsKIAorCXNwaW5fdW5sb2NrKCZ0YXJnZXQtPmJ0X2RlbHdyaV9sb2NrKTsKIAlyZXR1cm4gc2tpcHBlZDsKLQogfQogCiAvKgpAQCAtMTc0Nyw3ICsxNzA5LDcgQEAKIAkJfQogCiAJCS8qIHNsZWVwIGZvciBhIGxvbmcgdGltZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwotCQlpZiAobGlzdF9lbXB0eSgmdGFyZ2V0LT5idF9kZWx3cml0ZV9xdWV1ZSkpCisJCWlmIChsaXN0X2VtcHR5KCZ0YXJnZXQtPmJ0X2RlbHdyaV9xdWV1ZSkpCiAJCQl0b3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0b3V0KTsKIApAQCAtMTc4Myw5ICsxNzQ1LDcgQEAKIAlMSVNUX0hFQUQod2FpdF9saXN0KTsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNjb252ZXJ0ZF93b3JrcXVldWUpOwotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNkYXRhZF93b3JrcXVldWUpOwotCXhmc19idWZfcnVuYWxsX3F1ZXVlcyh4ZnNsb2dkX3dvcmtxdWV1ZSk7CisJZmx1c2hfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKIAogCXNldF9iaXQoWEJUX0ZPUkNFX0ZMVVNILCAmdGFyZ2V0LT5idF9mbGFncyk7CiAJcGluY291bnQgPSB4ZnNfYnVmX2RlbHdyaV9zcGxpdCh0YXJnZXQsICZ0bXBfbGlzdCwgMCk7CkBAIC0xODY2LDExICsxODI2LDMgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl96b25lKTsKIH0KLQotI2lmZGVmIENPTkZJR19LREJfTU9EVUxFUwotc3RydWN0IGxpc3RfaGVhZCAqCi14ZnNfZ2V0X2J1ZnRhcmdfbGlzdCh2b2lkKQotewotCXJldHVybiAmeGZzX2J1ZnRhcmdfbGlzdDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWYuaCBiL2ZzL3hmcy94ZnNfYnVmLmgKaW5kZXggNjIwOTcyYi4uNWJhYjA0NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWYuaAorKysgYi9mcy94ZnMveGZzX2J1Zi5oCkBAIC0xMDUsOCArMTA1LDggQEAKIAogCS8qIHBlciBkZXZpY2UgZGVsd3JpIHF1ZXVlICovCiAJc3RydWN0IHRhc2tfc3RydWN0CSpidF90YXNrOwotCXN0cnVjdCBsaXN0X2hlYWQJYnRfZGVsd3JpdGVfcXVldWU7Ci0Jc3BpbmxvY2tfdAkJYnRfZGVsd3JpdGVfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2RlbHdyaV9xdWV1ZTsKKwlzcGlubG9ja190CQlidF9kZWx3cmlfbG9jazsKIAl1bnNpZ25lZCBsb25nCQlidF9mbGFnczsKIAogCS8qIExSVSBjb250cm9sIHN0cnVjdHVyZXMgKi8KQEAgLTE3NSw3ICsxNzUsOCBAQAogZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9yZWFkKHhmc19idWZ0YXJnX3QgKiwgeGZzX29mZl90LCBzaXplX3QsCiAJCQkJeGZzX2J1Zl9mbGFnc190KTsKIAotZXh0ZXJuIHhmc19idWZfdCAqeGZzX2J1Zl9nZXRfZW1wdHkoc2l6ZV90LCB4ZnNfYnVmdGFyZ190ICopOworc3RydWN0IHhmc19idWYgKnhmc19idWZfYWxsb2Moc3RydWN0IHhmc19idWZ0YXJnICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJICAgICAgeGZzX2J1Zl9mbGFnc190KTsKIGV4dGVybiB2b2lkIHhmc19idWZfc2V0X2VtcHR5KHN0cnVjdCB4ZnNfYnVmICpicCwgc2l6ZV90IGxlbik7CiBleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF91bmNhY2hlZChzdHJ1Y3QgeGZzX2J1ZnRhcmcgKiwgc2l6ZV90LCBpbnQpOwogZXh0ZXJuIGludCB4ZnNfYnVmX2Fzc29jaWF0ZV9tZW1vcnkoeGZzX2J1Zl90ICosIHZvaWQgKiwgc2l6ZV90KTsKQEAgLTE5NywxNCArMTk4LDE0IEBACiAJKChicCktPmJfc2VtYS5jb3VudCA8PSAwKQogCiAvKiBCdWZmZXIgUmVhZCBhbmQgV3JpdGUgUm91dGluZXMgKi8KLWV4dGVybiBpbnQgeGZzX2J3cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IHhmc19idWYgKmJwKTsKLWV4dGVybiB2b2lkIHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKTsKK2V4dGVybiBpbnQgeGZzX2J3cml0ZShzdHJ1Y3QgeGZzX2J1ZiAqYnApOwogCiBleHRlcm4gdm9pZCB4ZnNiZHN0cmF0KHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc19idWYgKik7CiBleHRlcm4gaW50IHhmc19iZHN0cmF0X2NiKHN0cnVjdCB4ZnNfYnVmICopOwogCiBleHRlcm4gdm9pZCB4ZnNfYnVmX2lvZW5kKHhmc19idWZfdCAqLAlpbnQpOwogZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yKHhmc19idWZfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KHN0cnVjdCB4ZnNfYnVmICosIGNvbnN0IGNoYXIgKmZ1bmMpOwogZXh0ZXJuIGludCB4ZnNfYnVmX2lvcmVxdWVzdCh4ZnNfYnVmX3QgKik7CiBleHRlcm4gaW50IHhmc19idWZfaW93YWl0KHhmc19idWZfdCAqKTsKIGV4dGVybiB2b2lkIHhmc19idWZfaW9tb3ZlKHhmc19idWZfdCAqLCBzaXplX3QsIHNpemVfdCwgdm9pZCAqLApAQCAtMjIxLDM4ICsyMjIsMjIgQEAKIGV4dGVybiB4ZnNfY2FkZHJfdCB4ZnNfYnVmX29mZnNldCh4ZnNfYnVmX3QgKiwgc2l6ZV90KTsKIAogLyogRGVsYXllZCBXcml0ZSBCdWZmZXIgUm91dGluZXMgKi8KLWV4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoeGZzX2J1Zl90ICopOwotZXh0ZXJuIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcHJvbW90ZSh4ZnNfYnVmX3QgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZShzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2V4dGVybiB2b2lkIHhmc19idWZfZGVsd3JpX2RlcXVldWUoc3RydWN0IHhmc19idWYgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVmX2RlbHdyaV9wcm9tb3RlKHN0cnVjdCB4ZnNfYnVmICopOwogCiAvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCiBleHRlcm4gaW50IHhmc19idWZfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHhmc19idWZfdGVybWluYXRlKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgoteGZzX2J1Zl90YXJnZXRfbmFtZShzdHJ1Y3QgeGZzX2J1ZnRhcmcgKnRhcmdldCkKLXsKLQlzdGF0aWMgY2hhciBfX2JbQkRFVk5BTUVfU0laRV07Ci0KLQlyZXR1cm4gYmRldm5hbWUodGFyZ2V0LT5idF9iZGV2LCBfX2IpOwotfQotCi0KICNkZWZpbmUgWEZTX0JVRl9aRVJPRkxBR1MoYnApIFwKIAkoKGJwKS0+Yl9mbGFncyAmPSB+KFhCRl9SRUFEfFhCRl9XUklURXxYQkZfQVNZTkN8WEJGX0RFTFdSSXwgXAogCQkJICAgIFhCRl9TWU5DSU98WEJGX0ZVQXxYQkZfRkxVU0gpKQogCiB2b2lkIHhmc19idWZfc3RhbGUoc3RydWN0IHhmc19idWYgKmJwKTsKLSNkZWZpbmUgWEZTX0JVRl9TVEFMRShicCkJeGZzX2J1Zl9zdGFsZShicCk7CiAjZGVmaW5lIFhGU19CVUZfVU5TVEFMRShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9TVEFMRSkKICNkZWZpbmUgWEZTX0JVRl9JU1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9TVEFMRSkKLSNkZWZpbmUgWEZTX0JVRl9TVVBFUl9TVEFMRShicCkJZG8gewkJCQlcCi0JCQkJCVhGU19CVUZfU1RBTEUoYnApOwlcCi0JCQkJCXhmc19idWZfZGVsd3JpX2RlcXVldWUoYnApOwlcCi0JCQkJCVhGU19CVUZfRE9ORShicCk7CVwKLQkJCQl9IHdoaWxlICgwKQogCi0jZGVmaW5lIFhGU19CVUZfREVMQVlXUklURShicCkJCSgoYnApLT5iX2ZsYWdzIHw9IFhCRl9ERUxXUkkpCi0jZGVmaW5lIFhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKQl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKQogI2RlZmluZSBYRlNfQlVGX0lTREVMQVlXUklURShicCkJKChicCktPmJfZmxhZ3MgJiBYQkZfREVMV1JJKQogCiAjZGVmaW5lIFhGU19CVUZfRE9ORShicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX0RPTkUpCkBAIC0yODAsMjMgKzI2NSwxNiBAQAogI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCQkoKGJwKS0+Yl9idWZmZXJfbGVuZ3RoKQogI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKIAotc3RhdGljIGlubGluZSB2b2lkCi14ZnNfYnVmX3NldF9yZWYoCi0Jc3RydWN0IHhmc19idWYJKmJwLAotCWludAkJbHJ1X3JlZikKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3NldF9yZWYoc3RydWN0IHhmc19idWYgKmJwLCBpbnQgbHJ1X3JlZikKIHsKIAlhdG9taWNfc2V0KCZicC0+Yl9scnVfcmVmLCBscnVfcmVmKTsKIH0KLSNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCXhmc19idWZfc2V0X3JlZihicCwgcmVmKQotI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRShicCwgdHlwZSkJCWRvIHsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBpbnQgeGZzX2J1Zl9pc3Bpbm5lZChzdHJ1Y3QgeGZzX2J1ZiAqYnApCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZicC0+Yl9waW5fY291bnQpOwogfQogCi0jZGVmaW5lIFhGU19CVUZfRklOSVNIX0lPV0FJVChicCkJY29tcGxldGUoJmJwLT5iX2lvd2FpdCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZnNfYnVmX3JlbHNlKHhmc19idWZfdCAqYnApCiB7CiAJeGZzX2J1Zl91bmxvY2soYnApOwpAQCAtMzEzLDE0ICsyOTEsNyBAQAogZXh0ZXJuIGludCB4ZnNfc2V0c2l6ZV9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCB4ZnNfZmx1c2hfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIGludCk7CiAKLSNpZmRlZiBDT05GSUdfS0RCX01PRFVMRVMKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICp4ZnNfZ2V0X2J1ZnRhcmdfbGlzdCh2b2lkKTsKLSNlbmRpZgotCiAjZGVmaW5lIHhmc19nZXRzaXplX2J1ZnRhcmcoYnVmdGFyZykJYmxvY2tfc2l6ZSgoYnVmdGFyZyktPmJ0X2JkZXYpCiAjZGVmaW5lIHhmc19yZWFkb25seV9idWZ0YXJnKGJ1ZnRhcmcpCWJkZXZfcmVhZF9vbmx5KChidWZ0YXJnKS0+YnRfYmRldikKIAotI2RlZmluZSB4ZnNfYmludmFsKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQotI2RlZmluZSBYRlNfYmZsdXNoKGJ1ZnRhcmcpCQl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQotCiAjZW5kaWYJLyogX19YRlNfQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCmluZGV4IGVmNDNmY2UuLmVhYzk3ZWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgogICovCi1zdGF0aWMgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfYnVmX2l0ZW1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2J1Zl9pdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfYnVmX2l0ZW1fc2l6ZSwKIAkuaW9wX2Zvcm1hdAk9IHhmc19idWZfaXRlbV9mb3JtYXQsCiAJLmlvcF9waW4JPSB4ZnNfYnVmX2l0ZW1fcGluLApAQCAtOTY3LDcgKzk2Nyw4IEBACiAJICogSS9PIGVycm9ycywgdGhlcmUncyBubyBwb2ludCBpbiBnaXZpbmcgdGhpcyBhIHJldHJ5LgogCSAqLwogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKKwkJeGZzX2J1Zl9zdGFsZShicCk7CisJCVhGU19CVUZfRE9ORShicCk7CiAJCXRyYWNlX3hmc19idWZfaXRlbV9pb2RvbmUoYnAsIF9SRVRfSVBfKTsKIAkJZ290byBkb19jYWxsYmFja3M7CiAJfQpAQCAtOTc1LDkgKzk3Niw3IEBACiAJaWYgKGJwLT5iX3RhcmdldCAhPSBsYXN0dGFyZyB8fAogCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIChsYXN0dGltZSArIDUqSFopKSkgewogCQlsYXN0dGltZSA9IGppZmZpZXM7Ci0JCXhmc19hbGVydChtcCwgIkRldmljZSAlczogbWV0YWRhdGEgd3JpdGUgZXJyb3IgYmxvY2sgMHglbGx4IiwKLQkJCXhmc19idWZfdGFyZ2V0X25hbWUoYnAtPmJfdGFyZ2V0KSwKLQkJICAgICAgKF9fdWludDY0X3QpWEZTX0JVRl9BRERSKGJwKSk7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOwogCX0KIAlsYXN0dGFyZyA9IGJwLT5iX3RhcmdldDsKIApAQCAtOTkzLDcgKzk5Miw3IEBACiAJCXhmc19idWZfaW9lcnJvcihicCwgMCk7IC8qIGVycm5vIG9mIDAgdW5zZXRzIHRoZSBmbGFnICovCiAKIAkJaWYgKCFYRlNfQlVGX0lTU1RBTEUoYnApKSB7Ci0JCQlYRlNfQlVGX0RFTEFZV1JJVEUoYnApOworCQkJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnApOwogCQkJWEZTX0JVRl9ET05FKGJwKTsKIAkJfQogCQlBU1NFUlQoYnAtPmJfaW9kb25lICE9IE5VTEwpOwpAQCAtMTAwNiw5ICsxMDA1LDggQEAKIAkgKiBJZiB0aGUgd3JpdGUgb2YgdGhlIGJ1ZmZlciB3YXMgc3luY2hyb25vdXMsIHdlIHdhbnQgdG8gbWFrZQogCSAqIHN1cmUgdG8gcmV0dXJuIHRoZSBlcnJvciB0byB0aGUgY2FsbGVyIG9mIHhmc19id3JpdGUoKS4KIAkgKi8KLQlYRlNfQlVGX1NUQUxFKGJwKTsKKwl4ZnNfYnVmX3N0YWxlKGJwKTsKIAlYRlNfQlVGX0RPTkUoYnApOwotCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKIAogCXRyYWNlX3hmc19idWZfZXJyb3JfcmVsc2UoYnAsIF9SRVRfSVBfKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kYV9idHJlZS5jIGIvZnMveGZzL3hmc19kYV9idHJlZS5jCmluZGV4IGVlOWQ1NDIuLjc3Yzc0MjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKQEAgLTE1NzgsOSArMTU3OCw4IEBACiAJICovCiAJbm1hcCA9IDE7CiAJQVNTRVJUKGFyZ3MtPmZpcnN0YmxvY2sgIT0gTlVMTCk7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCAqYm5vLCBjb3VudCwKLQkJCXhmc19ibWFwaV9hZmxhZyh3KXxYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBfAotCQkJWEZTX0JNQVBJX0NPTlRJRywKKwllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgZHAsICpibm8sIGNvdW50LAorCQkJeGZzX2JtYXBpX2FmbGFnKHcpfFhGU19CTUFQSV9NRVRBREFUQXxYRlNfQk1BUElfQ09OVElHLAogCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsICZtYXAsICZubWFwLAogCQkJYXJncy0+Zmxpc3QpOwogCWlmIChlcnJvcikKQEAgLTE2MDIsOSArMTYwMSw4IEBACiAJCWZvciAoYiA9ICpibm8sIG1hcGkgPSAwOyBiIDwgKmJubyArIGNvdW50OyApIHsKIAkJCW5tYXAgPSBNSU4oWEZTX0JNQVBfTUFYX05NQVAsIGNvdW50KTsKIAkJCWMgPSAoaW50KSgqYm5vICsgY291bnQgLSBiKTsKLQkJCWVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwgYiwgYywKLQkJCQkJeGZzX2JtYXBpX2FmbGFnKHcpfFhGU19CTUFQSV9XUklURXwKLQkJCQkJWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGRwLCBiLCBjLAorCQkJCQl4ZnNfYm1hcGlfYWZsYWcodyl8WEZTX0JNQVBJX01FVEFEQVRBLAogCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKIAkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCk7CiAJCQlpZiAoZXJyb3IpCkBAIC0xOTc1LDMzICsxOTczLDE2IEBACiAJCS8qCiAJCSAqIE9wdGltaXplIHRoZSBvbmUtYmxvY2sgY2FzZS4KIAkJICovCi0JCWlmIChuZnNiID09IDEpIHsKLQkJCXhmc19mc2Jsb2NrX3QJZnNiOwotCi0JCQlpZiAoKGVycm9yID0KLQkJCSAgICB4ZnNfYm1hcGlfc2luZ2xlKHRyYW5zLCBkcCwgd2hpY2hmb3JrLCAmZnNiLAotCQkJCSAgICAoeGZzX2ZpbGVvZmZfdClibm8pKSkgewotCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KKwkJaWYgKG5mc2IgPT0gMSkKIAkJCW1hcHAgPSAmbWFwOwotCQkJaWYgKGZzYiA9PSBOVUxMRlNCTE9DSykgewotCQkJCW5tYXAgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQltYXAuYnJfc3RhcnRibG9jayA9IGZzYjsKLQkJCQltYXAuYnJfc3RhcnRvZmYgPSAoeGZzX2ZpbGVvZmZfdClibm87Ci0JCQkJbWFwLmJyX2Jsb2NrY291bnQgPSAxOwotCQkJCW5tYXAgPSAxOwotCQkJfQotCQl9IGVsc2UgeworCQllbHNlCiAJCQltYXBwID0ga21lbV9hbGxvYyhzaXplb2YoKm1hcHApICogbmZzYiwgS01fU0xFRVApOwotCQkJbm1hcCA9IG5mc2I7Ci0JCQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRyYW5zLCBkcCwgKHhmc19maWxlb2ZmX3QpYm5vLAotCQkJCQluZnNiLAotCQkJCQlYRlNfQk1BUElfTUVUQURBVEEgfAotCQkJCQkJeGZzX2JtYXBpX2FmbGFnKHdoaWNoZm9yayksCi0JCQkJCU5VTEwsIDAsIG1hcHAsICZubWFwLCBOVUxMKSkpCi0JCQkJZ290byBleGl0MDsKLQkJfQorCisJCW5tYXAgPSBuZnNiOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGRwLCAoeGZzX2ZpbGVvZmZfdClibm8sIG5mc2IsIG1hcHAsCisJCQkJICAgICAgICZubWFwLCB4ZnNfYm1hcGlfYWZsYWcod2hpY2hmb3JrKSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXhpdDA7CiAJfSBlbHNlIHsKIAkJbWFwLmJyX3N0YXJ0YmxvY2sgPSBYRlNfREFERFJfVE9fRlNCKG1wLCBtYXBwZWRibm8pOwogCQltYXAuYnJfc3RhcnRvZmYgPSAoeGZzX2ZpbGVvZmZfdClibm87CkBAIC0yMDcyLDEzICsyMDUzLDEwIEBACiAJCWlmICghYnApCiAJCQljb250aW51ZTsKIAkJaWYgKGNhbGxlciA9PSAxKSB7Ci0JCQlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKLQkJCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfQVRUUl9CVFJFRSwKLQkJCQkJCVhGU19BVFRSX0JUUkVFX1JFRik7Ci0JCQl9IGVsc2UgewotCQkJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19ESVJfQlRSRUUsCi0JCQkJCQlYRlNfRElSX0JUUkVFX1JFRik7Ci0JCQl9CisJCQlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspCisJCQkJeGZzX2J1Zl9zZXRfcmVmKGJwLCBYRlNfQVRUUl9CVFJFRV9SRUYpOworCQkJZWxzZQorCQkJCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0RJUl9CVFJFRV9SRUYpOwogCQl9CiAJCWlmIChicGxpc3QpIHsKIAkJCWJwbGlzdFtuYnBsaXN0KytdID0gYnA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RmcmFnLmMgYi9mcy94ZnMveGZzX2RmcmFnLmMKaW5kZXggOWE4NGE4NS4uNjU0ZGM2ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kZnJhZy5jCisrKyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpAQCAtNDI1LDggKzQyNSw4IEBACiAJfQogCiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHRpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwogCiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsICBpbGZfZmllbGRzKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB0aXAsIHRpbGZfZmllbGRzKTsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykKIAkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKIAotCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1NXQVBFWFQpOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAKIAl0cmFjZV94ZnNfc3dhcF9leHRlbnRfYWZ0ZXIoaXAsIDApOwogCXRyYWNlX3hmc19zd2FwX2V4dGVudF9hZnRlcih0aXAsIDEpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKaW5kZXggY2EyMzg2ZC4uNjZlMTA4ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCkBAIC04ODgsMTIgKzg4OCwxMCBAQAogCQkJCSAqIHdlIGFscmVhZHkgaGF2ZSBpbiB0aGUgdGFibGUuCiAJCQkJICovCiAJCQkJbm1hcCA9IG1hcF9zaXplIC0gbWFwX3ZhbGlkOwotCQkJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGRwLAotCQkJCQltYXBfb2ZmLAorCQkJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoZHAsIG1hcF9vZmYsCiAJCQkJCXhmc19kaXIyX2J5dGVfdG9fZGEobXAsCiAJCQkJCQlYRlNfRElSMl9MRUFGX09GRlNFVCkgLSBtYXBfb2ZmLAotCQkJCQlYRlNfQk1BUElfTUVUQURBVEEsIE5VTEwsIDAsCi0JCQkJCSZtYXBbbWFwX3ZhbGlkXSwgJm5tYXAsIE5VTEwpOworCQkJCQkmbWFwW21hcF92YWxpZF0sICZubWFwLCAwKTsKIAkJCQkvKgogCQkJCSAqIERvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIG9yCiAJCQkJICogdHJ5IHRvIHJldHVybiBhbiBlcnJvci4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jIGIvZnMveGZzL3hmc19kaXNjYXJkLmMKaW5kZXggMjQ0ZTc5Ny4uOGEyNGYwYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXNjYXJkLmMKKysrIGIvZnMveGZzL3hmc19kaXNjYXJkLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAl4ZnNfYWdudW1iZXJfdAkJYWdubywKIAl4ZnNfZnNibG9ja190CQlzdGFydCwKLQl4ZnNfZnNibG9ja190CQlsZW4sCisJeGZzX2ZzYmxvY2tfdAkJZW5kLAogCXhmc19mc2Jsb2NrX3QJCW1pbmxlbiwKIAlfX3VpbnQ2NF90CQkqYmxvY2tzX3RyaW1tZWQpCiB7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJICogZG93biBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgcmFuZ2VzIGZvciBub3cuCiAJCSAqLwogCQlpZiAoWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGZibm8pICsgZmxlbiA8IHN0YXJ0IHx8Ci0JCSAgICBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywgZmJubykgPj0gc3RhcnQgKyBsZW4pIHsKKwkJICAgIFhGU19BR0JfVE9fRlNCKG1wLCBhZ25vLCBmYm5vKSA+IGVuZCkgewogCQkJdHJhY2VfeGZzX2Rpc2NhcmRfZXhjbHVkZShtcCwgYWdubywgZmJubywgZmxlbik7CiAJCQlnb3RvIG5leHRfZXh0ZW50OwogCQl9CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqcSA9IG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYtPmJkX2Rpc2stPnF1ZXVlOwogCXVuc2lnbmVkIGludAkJZ3JhbnVsYXJpdHkgPSBxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eTsKIAlzdHJ1Y3QgZnN0cmltX3JhbmdlCXJhbmdlOwotCXhmc19mc2Jsb2NrX3QJCXN0YXJ0LCBsZW4sIG1pbmxlbjsKKwl4ZnNfZnNibG9ja190CQlzdGFydCwgZW5kLCBtaW5sZW47CiAJeGZzX2FnbnVtYmVyX3QJCXN0YXJ0X2Fnbm8sIGVuZF9hZ25vLCBhZ25vOwogCV9fdWludDY0X3QJCWJsb2Nrc190cmltbWVkID0gMDsKIAlpbnQJCQllcnJvciwgbGFzdF9lcnJvciA9IDA7CkBAIC0xNjUsMTkgKzE2NSwxOSBAQAogCSAqIG1hdHRlciBhcyB0cmltbWluZyBibG9ja3MgaXMgYW4gYWR2aXNvcnkgaW50ZXJmYWNlLgogCSAqLwogCXN0YXJ0ID0gWEZTX0JfVE9fRlNCVChtcCwgcmFuZ2Uuc3RhcnQpOwotCWxlbiA9IFhGU19CX1RPX0ZTQlQobXAsIHJhbmdlLmxlbik7CisJZW5kID0gc3RhcnQgKyBYRlNfQl9UT19GU0JUKG1wLCByYW5nZS5sZW4pIC0gMTsKIAltaW5sZW4gPSBYRlNfQl9UT19GU0IobXAsIG1heF90KHU2NCwgZ3JhbnVsYXJpdHksIHJhbmdlLm1pbmxlbikpOwogCi0Jc3RhcnRfYWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgc3RhcnQpOwotCWlmIChzdGFydF9hZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpCisJaWYgKHN0YXJ0ID49IG1wLT5tX3NiLnNiX2RibG9ja3MpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisJaWYgKGVuZCA+IG1wLT5tX3NiLnNiX2RibG9ja3MgLSAxKQorCQllbmQgPSBtcC0+bV9zYi5zYl9kYmxvY2tzIC0gMTsKIAotCWVuZF9hZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBzdGFydCArIGxlbik7Ci0JaWYgKGVuZF9hZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpCi0JCWVuZF9hZ25vID0gbXAtPm1fc2Iuc2JfYWdjb3VudCAtIDE7CisJc3RhcnRfYWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgc3RhcnQpOworCWVuZF9hZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBlbmQpOwogCiAJZm9yIChhZ25vID0gc3RhcnRfYWdubzsgYWdubyA8PSBlbmRfYWdubzsgYWdubysrKSB7Ci0JCWVycm9yID0gLXhmc190cmltX2V4dGVudHMobXAsIGFnbm8sIHN0YXJ0LCBsZW4sIG1pbmxlbiwKKwkJZXJyb3IgPSAteGZzX3RyaW1fZXh0ZW50cyhtcCwgYWdubywgc3RhcnQsIGVuZCwgbWlubGVuLAogCQkJCQkgICZibG9ja3NfdHJpbW1lZCk7CiAJCWlmIChlcnJvcikKIAkJCWxhc3RfZXJyb3IgPSBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZHF1b3QuYyBiL2ZzL3hmcy94ZnNfZHF1b3QuYwppbmRleCBkYjYyOTU5Li4yNWQ3MjgwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RxdW90LmMKKysrIGIvZnMveGZzL3hmc19kcXVvdC5jCkBAIC0zNzcsMTYgKzM3NywxNCBAQAogCQlyZXR1cm4gKEVTUkNIKTsKIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBxdW90aXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCW5tYXBzID0gMTsKLQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBxdW90aXAsCi0JCQkgICAgICBvZmZzZXRfZnNiLCBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQiwKLQkJCSAgICAgIFhGU19CTUFQSV9NRVRBREFUQSB8IFhGU19CTUFQSV9XUklURSwKLQkJCSAgICAgICZmaXJzdGJsb2NrLAotCQkJICAgICAgWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKSwKLQkJCSAgICAgICZtYXAsICZubWFwcywgJmZsaXN0KSkpIHsKKwllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgcXVvdGlwLCBvZmZzZXRfZnNiLAorCQkJCVhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJJmZpcnN0YmxvY2ssIFhGU19RTV9EUUFMTE9DX1NQQUNFX1JFUyhtcCksCisJCQkJJm1hcCwgJm5tYXBzLCAmZmxpc3QpOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjA7Ci0JfQogCUFTU0VSVChtYXAuYnJfYmxvY2tjb3VudCA9PSBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQik7CiAJQVNTRVJUKG5tYXBzID09IDEpOwogCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgpAQCAtNDAyLDggKzQwMCwxMSBAQAogCQkJICAgICAgIGRxcC0+cV9ibGtubywKIAkJCSAgICAgICBtcC0+bV9xdW90YWluZm8tPnFpX2RxY2h1bmtsZW4sCiAJCQkgICAgICAgMCk7Ci0JaWYgKCFicCB8fCAoZXJyb3IgPSB4ZnNfYnVmX2dldGVycm9yKGJwKSkpCisKKwllcnJvciA9IHhmc19idWZfZ2V0ZXJyb3IoYnApOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjE7CisKIAkvKgogCSAqIE1ha2UgYSBjaHVuayBvZiBkcXVvdHMgb3V0IG9mIHRoaXMgYnVmZmVyIGFuZCBsb2cKIAkgKiB0aGUgZW50aXJlIHRoaW5nLgpAQCAtNDg1LDkgKzQ4Niw4IEBACiAJLyoKIAkgKiBGaW5kIHRoZSBibG9jayBtYXA7IG5vIGFsbG9jYXRpb25zIHlldAogCSAqLwotCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIHF1b3RpcCwgZHFwLT5xX2ZpbGVvZmZzZXQsCi0JCQkgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCBYRlNfQk1BUElfTUVUQURBVEEsCi0JCQkgIE5VTEwsIDAsICZtYXAsICZubWFwcywgTlVMTCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChxdW90aXAsIGRxcC0+cV9maWxlb2Zmc2V0LAorCQkJICAgICAgIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCLCAmbWFwLCAmbm1hcHMsIDApOwogCiAJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAlpZiAoZXJyb3IpCkBAIC02MDUsNyArNjA1LDcgQEAKIAlkcXAtPnFfcmVzX3J0YmNvdW50ID0gYmU2NF90b19jcHUoZGRxcC0+ZF9ydGJjb3VudCk7CiAKIAkvKiBNYXJrIHRoZSBidWYgc28gdGhhdCB0aGlzIHdpbGwgc3RheSBpbmNvcmUgYSBsaXR0bGUgbG9uZ2VyICovCi0JWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0RRVU9ULCBYRlNfRFFVT1RfUkVGKTsKKwl4ZnNfYnVmX3NldF9yZWYoYnAsIFhGU19EUVVPVF9SRUYpOwogCiAJLyoKIAkgKiBXZSBnb3QgdGhlIGJ1ZmZlciB3aXRoIGEgeGZzX3RyYW5zX3JlYWRfYnVmKCkgKGluIGRxdG9icCgpKQpAQCAtMTI0Miw5ICsxMjQyLDExIEBACiAJfQogCiAJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAllbHNlCi0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKworCXhmc19idWZfcmVsc2UoYnApOwogCiAJdHJhY2VfeGZzX2RxZmx1c2hfZG9uZShkcXApOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RxdW90X2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCmluZGV4IGJiM2Y3MWQuLjBkZWUwYjcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfZHF1b3RfaXRlbS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIGZvciBkcXVvdHMKICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2RxdW90X2l0ZW1fb3BzID0gewogCS5pb3Bfc2l6ZQk9IHhmc19xbV9kcXVvdF9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9mb3JtYXQsCiAJLmlvcF9waW4JPSB4ZnNfcW1fZHF1b3RfbG9naXRlbV9waW4sCkBAIC00ODMsNyArNDgzLDcgQEAKIHsKIH0KIAotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfcW1fcW9mZmVuZF9sb2dpdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluLApAQCAtNDk4LDcgKzQ5OCw3IEBACiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIHF1b3Rhb2ZmLXN0YXJ0IGxvZyBpdGVtcy4KICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZfbG9naXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfcW1fcW9mZl9sb2dpdGVtX29wcyA9IHsKIAkuaW9wX3NpemUJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19xbV9xb2ZmX2xvZ2l0ZW1fcGluLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHBvcnQuYyBiL2ZzL3hmcy94ZnNfZXhwb3J0LmMKaW5kZXggNzVlNWQzMi4uZGExMDg5NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHBvcnQuYworKysgYi9mcy94ZnMveGZzX2V4cG9ydC5jCkBAIC0yMjksMTYgKzIyOSwxNiBAQAogewogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0JaW50CQkJZXJyb3IgPSAwOworCXhmc19sc25fdAkJbHNuID0gMDsKIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JaWYgKHhmc19pcGluY291bnQoaXApKSB7Ci0JCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLCBpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuLAotCQkJCVhGU19MT0dfU1lOQywgTlVMTCk7Ci0JfQorCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkKKwkJbHNuID0gaXAtPmlfaXRlbXAtPmlsaV9sYXN0X2xzbjsKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAKLQlyZXR1cm4gZXJyb3I7CisJaWYgKCFsc24pCisJCXJldHVybiAwOworCXJldHVybiBfeGZzX2xvZ19mb3JjZV9sc24obXAsIGxzbiwgWEZTX0xPR19TWU5DLCBOVUxMKTsKIH0KIAogY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHhmc19leHBvcnRfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCmluZGV4IGQyMmU2MjYuLjM1YzJhZmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAvKgogICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIGVmaSBsb2cgaXRlbXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmlfaXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfZWZpX2l0ZW1fb3BzID0gewogCS5pb3Bfc2l6ZQk9IHhmc19lZmlfaXRlbV9zaXplLAogCS5pb3BfZm9ybWF0CT0geGZzX2VmaV9pdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19lZmlfaXRlbV9waW4sCkBAIC00NzcsNyArNDc3LDcgQEAKIC8qCiAgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIHNoYXJlZCBieSBhbGwgZWZkIGxvZyBpdGVtcy4KICAqLwotc3RhdGljIHN0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX2VmZF9pdGVtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmRfaXRlbV9vcHMgPSB7CiAJLmlvcF9zaXplCT0geGZzX2VmZF9pdGVtX3NpemUsCiAJLmlvcF9mb3JtYXQJPSB4ZnNfZWZkX2l0ZW1fZm9ybWF0LAogCS5pb3BfcGluCT0geGZzX2VmZF9pdGVtX3BpbiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZS5jIGIvZnMveGZzL3hmc19maWxlLmMKaW5kZXggN2Y3YjQyNC4uNzUzZWQ5YiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlLmMKKysrIGIvZnMveGZzL3hmc19maWxlLmMKQEAgLTEyNCw2ICsxMjQsMzUgQEAKIAlyZXR1cm4gKC1zdGF0dXMpOwogfQogCisvKgorICogRnN5bmMgb3BlcmF0aW9ucyBvbiBkaXJlY3RvcmllcyBhcmUgbXVjaCBzaW1wbGVyIHRoYW4gb24gcmVndWxhciBmaWxlcywKKyAqIGFzIHRoZXJlIGlzIG5vIGZpbGUgZGF0YSB0byBmbHVzaCwgYW5kIHRodXMgYWxzbyBubyBuZWVkIGZvciBleHBsaWNpdAorICogY2FjaGUgZmx1c2ggb3BlcmF0aW9ucywgYW5kIHRoZXJlIGFyZSBubyBub24tdHJhbnNhY3Rpb24gbWV0YWRhdGEgdXBkYXRlcworICogb24gZGlyZWN0b3JpZXMgZWl0aGVyLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2ZzeW5jKAorCXN0cnVjdCBmaWxlCQkqZmlsZSwKKwlsb2ZmX3QJCQlzdGFydCwKKwlsb2ZmX3QJCQllbmQsCisJaW50CQkJZGF0YXN5bmMpCit7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX2xzbl90CQlsc24gPSAwOworCisJdHJhY2VfeGZzX2Rpcl9mc3luYyhpcCk7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkKKwkJbHNuID0gaXAtPmlfaXRlbXAtPmlsaV9sYXN0X2xzbjsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlpZiAoIWxzbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF94ZnNfbG9nX2ZvcmNlX2xzbihtcCwgbHNuLCBYRlNfTE9HX1NZTkMsIE5VTEwpOworfQorCiBTVEFUSUMgaW50CiB4ZnNfZmlsZV9mc3luYygKIAlzdHJ1Y3QgZmlsZQkJKmZpbGUsCkBAIC0xMzcsNiArMTY2LDcgQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsKIAlpbnQJCQllcnJvciA9IDA7CiAJaW50CQkJbG9nX2ZsdXNoZWQgPSAwOworCXhmc19sc25fdAkJbHNuID0gMDsKIAogCXRyYWNlX3hmc19maWxlX2ZzeW5jKGlwKTsKIApAQCAtMTQ5LDEwICsxNzksNiBAQAogCiAJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lUUlVOQ0FURUQpOwogCi0JeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7Ci0JeGZzX2lvZW5kX3dhaXQoaXApOwotCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7Ci0KIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikgewogCQkvKgogCQkgKiBJZiB3ZSBoYXZlIGFuIFJUIGFuZC9vciBsb2cgc3Vidm9sdW1lIHdlIG5lZWQgdG8gbWFrZSBzdXJlCkBAIC0yMTYsMTEgKzI0MiwxMSBAQAogCQkgKiB0cmFuc2FjdGlvbi4JIFNvIHdlIHBsYXkgaXQgc2FmZSBhbmQgZmlyZSBvZmYgdGhlCiAJCSAqIHRyYW5zYWN0aW9uIGFueXdheS4KIAkJICovCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwotCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCQllcnJvciA9IF94ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCAmbG9nX2ZsdXNoZWQpOworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDApOwogCisJCWxzbiA9IGlwLT5pX2l0ZW1wLT5pbGlfbGFzdF9sc247CiAJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTIzMSwxNCArMjU3LDE0IEBACiAJCSAqIGRpc2sgeWV0LCB0aGUgaW5vZGUgd2lsbCBiZSBzdGlsbCBiZSBwaW5uZWQuICBJZiBpdCBpcywKIAkJICogZm9yY2UgdGhlIGxvZy4KIAkJICovCi0JCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkgewotCQkJZXJyb3IgPSBfeGZzX2xvZ19mb3JjZV9sc24obXAsCi0JCQkJCWlwLT5pX2l0ZW1wLT5pbGlfbGFzdF9sc24sCi0JCQkJCVhGU19MT0dfU1lOQywgJmxvZ19mbHVzaGVkKTsKLQkJfQorCQlpZiAoeGZzX2lwaW5jb3VudChpcCkpCisJCQlsc24gPSBpcC0+aV9pdGVtcC0+aWxpX2xhc3RfbHNuOwogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAJfQogCisJaWYgKCFlcnJvciAmJiBsc24pCisJCWVycm9yID0gX3hmc19sb2dfZm9yY2VfbHNuKG1wLCBsc24sIFhGU19MT0dfU1lOQywgJmxvZ19mbHVzaGVkKTsKKwogCS8qCiAJICogSWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRldmljZSwgYW5kIHRoZSBsb2cgZm9yY2UgYWJvdXQgd2FzCiAJICogYSBuby1vcCB3ZSBtaWdodCBoYXZlIHRvIGZsdXNoIHRoZSBkYXRhIGRldmljZSBjYWNoZSBoZXJlLgpAQCAtMzE3LDcgKzM0MywxOSBAQAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgeworCS8qCisJICogTG9ja2luZyBpcyBhIGJpdCB0cmlja3kgaGVyZS4gSWYgd2UgdGFrZSBhbiBleGNsdXNpdmUgbG9jaworCSAqIGZvciBkaXJlY3QgSU8sIHdlIGVmZmVjdGl2ZWx5IHNlcmlhbGlzZSBhbGwgbmV3IGNvbmN1cnJlbnQKKwkgKiByZWFkIElPIHRvIHRoaXMgZmlsZSBhbmQgYmxvY2sgaXQgYmVoaW5kIElPIHRoYXQgaXMgY3VycmVudGx5IGluCisJICogcHJvZ3Jlc3MgYmVjYXVzZSBJTyBpbiBwcm9ncmVzcyBob2xkcyB0aGUgSU8gbG9jayBzaGFyZWQuIFdlIG9ubHkKKwkgKiBuZWVkIHRvIGhvbGQgdGhlIGxvY2sgZXhjbHVzaXZlIHRvIGJsb3cgYXdheSB0aGUgcGFnZSBjYWNoZSwgc28KKwkgKiBvbmx5IHRha2UgbG9jayBleGNsdXNpdmVseSBpZiB0aGUgcGFnZSBjYWNoZSBuZWVkcyBpbnZhbGlkYXRpb24uCisJICogVGhpcyBhbGxvd3MgdGhlIG5vcm1hbCBkaXJlY3QgSU8gY2FzZSBvZiBubyBwYWdlIGNhY2hlIHBhZ2VzIHRvCisJICogcHJvY2VlZWQgY29uY3VycmVudGx5IHdpdGhvdXQgc2VyaWFsaXNhdGlvbi4KKwkgKi8KKwl4ZnNfcndfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKwlpZiAoKGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkgJiYgaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykgeworCQl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCQl4ZnNfcndfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAKIAkJaWYgKGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpIHsKQEAgLTMzMCw4ICszNjgsNyBAQAogCQkJfQogCQl9CiAJCXhmc19yd19pbG9ja19kZW1vdGUoaXAsIFhGU19JT0xPQ0tfRVhDTCk7Ci0JfSBlbHNlCi0JCXhmc19yd19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCX0KIAogCXRyYWNlX3hmc19maWxlX3JlYWQoaXAsIHNpemUsIGlvY2ItPmtpX3BvcywgaW9mbGFncyk7CiAKQEAgLTQwNywxMSArNDQ0LDEzIEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwKQorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19mc2l6ZV90CQluZXdfc2l6ZSkKIHsKLQlpZiAoaXAtPmlfbmV3X3NpemUpIHsKKwlpZiAobmV3X3NpemUgPT0gaXAtPmlfbmV3X3NpemUpIHsKIAkJeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWlwLT5pX25ld19zaXplID0gMDsKKwkJaWYgKG5ld19zaXplID09IGlwLT5pX25ld19zaXplKQorCQkJaXAtPmlfbmV3X3NpemUgPSAwOwogCQlpZiAoaXAtPmlfZC5kaV9zaXplID4gaXAtPmlfc2l6ZSkKIAkJCWlwLT5pX2QuZGlfc2l6ZSA9IGlwLT5pX3NpemU7CiAJCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CkBAIC00NjIsNyArNTAxLDcgQEAKIAlyZXQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlKHBpcGUsIG91dGZpbHAsIHBwb3MsIGNvdW50LCBmbGFncyk7CiAKIAl4ZnNfYWlvX3dyaXRlX2lzaXplX3VwZGF0ZShpbm9kZSwgcHBvcywgcmV0KTsKLQl4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKGlwKTsKKwl4ZnNfYWlvX3dyaXRlX25ld3NpemVfdXBkYXRlKGlwLCBuZXdfc2l6ZSk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUwMCwxMSArNTM5LDkgQEAKIAogCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgaXNpemUpOwogCW5pbWFwcyA9IDE7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGxhc3RfZnNiLCAxLCAwLCBOVUxMLCAwLCAmaW1hcCwKLQkJCSAgJm5pbWFwcywgTlVMTCk7Ci0JaWYgKGVycm9yKSB7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgbGFzdF9mc2IsIDEsICZpbWFwLCAmbmltYXBzLCAwKTsKKwlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKLQl9CiAJQVNTRVJUKG5pbWFwcyA+IDApOwogCS8qCiAJICogSWYgdGhlIGJsb2NrIHVuZGVybHlpbmcgaXNpemUgaXMganVzdCBhIGhvbGUsIHRoZW4gdGhlcmUKQEAgLTU5NSw4ICs2MzIsOCBAQAogCXdoaWxlIChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpIHsKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBzdGFydF96ZXJvX2ZzYiwgemVyb19jb3VudF9mc2IsCi0JCQkJICAwLCBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIHN0YXJ0X3plcm9fZnNiLCB6ZXJvX2NvdW50X2ZzYiwKKwkJCQkJICAmaW1hcCwgJm5pbWFwcywgMCk7CiAJCWlmIChlcnJvcikgewogCQkJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMfFhGU19JT0xPQ0tfRVhDTCkpOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtNjU5LDYgKzY5Niw3IEBACiAJc3RydWN0IGZpbGUJCSpmaWxlLAogCWxvZmZfdAkJCSpwb3MsCiAJc2l6ZV90CQkJKmNvdW50LAorCXhmc19mc2l6ZV90CQkqbmV3X3NpemVwLAogCWludAkJCSppb2xvY2spCiB7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC02NjYsNiArNzA0LDkgQEAKIAl4ZnNfZnNpemVfdAkJbmV3X3NpemU7CiAJaW50CQkJZXJyb3IgPSAwOwogCisJeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJKm5ld19zaXplcCA9IDA7CityZXN0YXJ0OgogCWVycm9yID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgcG9zLCBjb3VudCwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSk7CiAJaWYgKGVycm9yKSB7CiAJCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOwpAQCAtNjczLDIwICs3MTQsNDEgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCW5ld19zaXplID0gKnBvcyArICpjb3VudDsKLQlpZiAobmV3X3NpemUgPiBpcC0+aV9zaXplKQotCQlpcC0+aV9uZXdfc2l6ZSA9IG5ld19zaXplOwotCiAJaWYgKGxpa2VseSghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX05PQ01USU1FKSkpCiAJCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAKIAkvKgogCSAqIElmIHRoZSBvZmZzZXQgaXMgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBmaWxlLCB3ZSBuZWVkIHRvIHplcm8gYW55CiAJICogYmxvY2tzIHRoYXQgZmFsbCBiZXR3ZWVuIHRoZSBleGlzdGluZyBFT0YgYW5kIHRoZSBzdGFydCBvZiB0aGlzCi0JICogd3JpdGUuCisJICogd3JpdGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gaXNzdWUgemVyb2luZyBpZiBhbm90aGVyIGluLWZsZ2h0IElPIGVuZHMKKwkgKiBhdCBvciBiZWZvcmUgdGhpcyBvbmUgSWYgemVyb25pZyBpcyBuZWVkZWQgYW5kIHdlIGFyZSBjdXJyZW50bHkKKwkgKiBob2xkaW5nIHRoZSBpb2xvY2sgc2hhcmVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSBpdCB0byBleGNsdXNpdmUgd2hpY2gKKwkgKiBpbnZvbHZlcyBkcm9wcGluZyBhbGwgbG9ja3MgYW5kIHJlbG9ja2luZyB0byBtYWludGFpbiBjb3JyZWN0IGxvY2tpbmcKKwkgKiBvcmRlci4gSWYgd2UgZG8gdGhpcywgcmVzdGFydCB0aGUgZnVuY3Rpb24gdG8gZW5zdXJlIGFsbCBjaGVja3MgYW5kCisJICogdmFsdWVzIGFyZSBzdGlsbCB2YWxpZC4KIAkgKi8KLQlpZiAoKnBvcyA+IGlwLT5pX3NpemUpCisJaWYgKChpcC0+aV9uZXdfc2l6ZSAmJiAqcG9zID4gaXAtPmlfbmV3X3NpemUpIHx8CisJICAgICghaXAtPmlfbmV3X3NpemUgJiYgKnBvcyA+IGlwLT5pX3NpemUpKSB7CisJCWlmICgqaW9sb2NrID09IFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCQl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCAqaW9sb2NrKTsKKwkJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CisJCQl4ZnNfcndfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgKmlvbG9jayk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAkJZXJyb3IgPSAteGZzX3plcm9fZW9mKGlwLCAqcG9zLCBpcC0+aV9zaXplKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgSU8gZXh0ZW5kcyBiZXlvbmQgRU9GLCB3ZSBtYXkgbmVlZCB0byB1cGRhdGUgaXAtPmlfbmV3X3NpemUuCisJICogV2UgaGF2ZSBhbHJlYWR5IHplcm9lZCBzcGFjZSBiZXlvbmQgRU9GIChpZiBuZWNlc3NhcnkpLiAgT25seSB1cGRhdGUKKwkgKiBpcC0+aV9uZXdfc2l6ZSBpZiB0aGlzIElPIGVuZHMgYmV5b25kIGFueSBvdGhlciBpbi1mbGlnaHQgd3JpdGVzLgorCSAqLworCW5ld19zaXplID0gKnBvcyArICpjb3VudDsKKwlpZiAobmV3X3NpemUgPiBpcC0+aV9zaXplKSB7CisJCWlmIChuZXdfc2l6ZSA+IGlwLT5pX25ld19zaXplKQorCQkJaXAtPmlfbmV3X3NpemUgPSBuZXdfc2l6ZTsKKwkJKm5ld19zaXplcCA9IG5ld19zaXplOworCX0KIAogCXhmc19yd19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJaWYgKGVycm9yKQpAQCAtNzIxLDcgKzc4Myw3IEBACiAgKiB0aGUgZGlvIGxheWVyLiAgVG8gYXZvaWQgdGhlIHByb2JsZW0gd2l0aCBhaW8sIHdlIGFsc28gbmVlZCB0byB3YWl0IGZvcgogICogb3V0c3RhbmRpbmcgSU9zIHRvIGNvbXBsZXRlIHNvIHRoYXQgdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlZAogICogYmVmb3JlIHdlIHRyeSB0byBtYXAgdGhlIG92ZXJsYXBwaW5nIGJsb2NrLiBUaGlzIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieQotICogaGl0dGluZyBpdCB3aXRoIGEgYmlnIGhhbW1lciAoaS5lLiB4ZnNfaW9lbmRfd2FpdCgpKS4KKyAqIGhpdHRpbmcgaXQgd2l0aCBhIGJpZyBoYW1tZXIgKGkuZS4gaW5vZGVfZGlvX3dhaXQoKSkuCiAgKgogICogUmV0dXJucyB3aXRoIGxvY2tzIGhlbGQgaW5kaWNhdGVkIGJ5IEBpb2xvY2sgYW5kIGVycm9ycyBpbmRpY2F0ZWQgYnkKICAqIG5lZ2F0aXZlIHJldHVybiB2YWx1ZXMuCkBAIC03MzMsNiArNzk1LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAogCWxvZmZfdAkJCXBvcywKIAlzaXplX3QJCQlvY291bnQsCisJeGZzX2ZzaXplX3QJCSpuZXdfc2l6ZSwKIAlpbnQJCQkqaW9sb2NrKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC03NTMsMTggKzgxNiwzNSBAQAogCWlmICgocG9zICYgbXAtPm1fYmxvY2ttYXNrKSB8fCAoKHBvcyArIGNvdW50KSAmIG1wLT5tX2Jsb2NrbWFzaykpCiAJCXVuYWxpZ25lZF9pbyA9IDE7CiAKLQlpZiAodW5hbGlnbmVkX2lvIHx8IG1hcHBpbmctPm5ycGFnZXMgfHwgcG9zID4gaXAtPmlfc2l6ZSkKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbiBleGNsdXNpdmUgbG9jayB1bmxlc3MgdGhlcmUgcGFnZSBjYWNoZSBuZWVkcworCSAqIHRvIGJlIGludmFsaWRhdGVkIG9yIHVuYWxpZ25lZCBJTyBpcyBiZWluZyBleGVjdXRlZC4gV2UgZG9uJ3QgbmVlZCB0bworCSAqIGNvbnNpZGVyIHRoZSBFT0YgZXh0ZW5zaW9uIGNhc2UgaGVyZSBiZWNhdXNlCisJICogeGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcygpIHdpbGwgcmVsb2NrIHRoZSBpbm9kZSBhcyBuZWNlc3NhcnkgZm9yCisJICogRU9GIHplcm9pbmcgY2FzZXMgYW5kIGZpbGwgb3V0IHRoZSBuZXcgaW5vZGUgc2l6ZSBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAodW5hbGlnbmVkX2lvIHx8IG1hcHBpbmctPm5ycGFnZXMpCiAJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CiAJZWxzZQogCQkqaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOworCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CiAKLQlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgaW9sb2NrKTsKKwkvKgorCSAqIFJlY2hlY2sgaWYgdGhlcmUgYXJlIGNhY2hlZCBwYWdlcyB0aGF0IG5lZWQgaW52YWxpZGF0ZSBhZnRlciB3ZSBnb3QKKwkgKiB0aGUgaW9sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBvdGhlciB0aHJlYWRzIGFkZGluZyBuZXcgcGFnZXMgd2hpbGUKKwkgKiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBpb2xvY2suCisJICovCisJaWYgKG1hcHBpbmctPm5ycGFnZXMgJiYgKmlvbG9jayA9PSBYRlNfSU9MT0NLX1NIQVJFRCkgeworCQl4ZnNfcndfaXVubG9jayhpcCwgKmlvbG9jayk7CisJCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CisJCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CisJfQorCisJcmV0ID0geGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcyhmaWxlLCAmcG9zLCAmY291bnQsIG5ld19zaXplLCBpb2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlXQVJOX09OKCppb2xvY2sgIT0gWEZTX0lPTE9DS19FWENMKTsKIAkJcmV0ID0gLXhmc19mbHVzaGludmFsX3BhZ2VzKGlwLCAocG9zICYgUEFHRV9DQUNIRV9NQVNLKSwgLTEsCiAJCQkJCQkJRklfUkVNQVBGX0xPQ0tFRCk7CiAJCWlmIChyZXQpCkBAIC03NzYsNyArODU2LDcgQEAKIAkgKiBvdGhlcndpc2UgZGVtb3RlIHRoZSBsb2NrIGlmIHdlIGhhZCB0byBmbHVzaCBjYWNoZWQgcGFnZXMKIAkgKi8KIAlpZiAodW5hbGlnbmVkX2lvKQotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CisJCWlub2RlX2Rpb193YWl0KGlub2RlKTsKIAllbHNlIGlmICgqaW9sb2NrID09IFhGU19JT0xPQ0tfRVhDTCkgewogCQl4ZnNfcndfaWxvY2tfZGVtb3RlKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOwogCQkqaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7CkBAIC03OTgsNiArODc4LDcgQEAKIAl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAogCWxvZmZfdAkJCXBvcywKIAlzaXplX3QJCQlvY291bnQsCisJeGZzX2ZzaXplX3QJCSpuZXdfc2l6ZSwKIAlpbnQJCQkqaW9sb2NrKQogewogCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC04MDksOSArODkwLDkgQEAKIAlzaXplX3QJCQljb3VudCA9IG9jb3VudDsKIAogCSppb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7Ci0JeGZzX3J3X2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8ICppb2xvY2spOworCXhmc19yd19pbG9jayhpcCwgKmlvbG9jayk7CiAKLQlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgaW9sb2NrKTsKKwlyZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgbmV3X3NpemUsIGlvbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODUxLDYgKzkzMiw3IEBACiAJc3NpemVfdAkJCXJldDsKIAlpbnQJCQlpb2xvY2s7CiAJc2l6ZV90CQkJb2NvdW50ID0gMDsKKwl4ZnNfZnNpemVfdAkJbmV3X3NpemUgPSAwOwogCiAJWEZTX1NUQVRTX0lOQyh4c193cml0ZV9jYWxscyk7CiAKQEAgLTg3MCwxMCArOTUyLDEwIEBACiAKIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkKIAkJcmV0ID0geGZzX2ZpbGVfZGlvX2Fpb193cml0ZShpb2NiLCBpb3ZwLCBucl9zZWdzLCBwb3MsCi0JCQkJCQlvY291bnQsICZpb2xvY2spOworCQkJCQkJb2NvdW50LCAmbmV3X3NpemUsICZpb2xvY2spOwogCWVsc2UKIAkJcmV0ID0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dyaXRlKGlvY2IsIGlvdnAsIG5yX3NlZ3MsIHBvcywKLQkJCQkJCW9jb3VudCwgJmlvbG9jayk7CisJCQkJCQlvY291bnQsICZuZXdfc2l6ZSwgJmlvbG9jayk7CiAKIAl4ZnNfYWlvX3dyaXRlX2lzaXplX3VwZGF0ZShpbm9kZSwgJmlvY2ItPmtpX3BvcywgcmV0KTsKIApAQCAtODk0LDcgKzk3Niw3IEBACiAJfQogCiBvdXRfdW5sb2NrOgotCXhmc19haW9fd3JpdGVfbmV3c2l6ZV91cGRhdGUoaXApOworCXhmc19haW9fd3JpdGVfbmV3c2l6ZV91cGRhdGUoaXAsIG5ld19zaXplKTsKIAl4ZnNfcndfaXVubG9jayhpcCwgaW9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA4Nyw3ICsxMTY5LDcgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IHhmc19maWxlX2NvbXBhdF9pb2N0bCwKICNlbmRpZgotCS5mc3luYwkJPSB4ZnNfZmlsZV9mc3luYywKKwkuZnN5bmMJCT0geGZzX2Rpcl9mc3luYywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgeGZzX2ZpbGVfdm1fb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwppbmRleCAzZmYzZDllLi41MTcwMzA2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYworKysgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwpAQCAtNjgyLDcgKzY4Miw3IEBACiAJaXAgPSBhcC0+aXA7CiAJbXAgPSBpcC0+aV9tb3VudDsKIAljYWNoZSA9IG1wLT5tX2ZpbGVzdHJlYW07Ci0JbWlubGVuID0gYXAtPmFsZW47CisJbWlubGVuID0gYXAtPmxlbmd0aDsKIAkqYWdwID0gTlVMTEFHTlVNQkVSOwogCiAJLyoKQEAgLTc2MSw3ICs3NjEsNyBAQAogCSAqLwogCWFnID0gKGFnID09IE5VTExBR05VTUJFUikgPyAwIDogKGFnICsgMSkgJSBtcC0+bV9zYi5zYl9hZ2NvdW50OwogCWZsYWdzID0gKGFwLT51c2VyZGF0YSA/IFhGU19QSUNLX1VTRVJEQVRBIDogMCkgfAotCSAgICAgICAgKGFwLT5sb3cgPyBYRlNfUElDS19MT1dTUEFDRSA6IDApOworCSAgICAgICAgKGFwLT5mbGlzdC0+eGJmX2xvdyA/IFhGU19QSUNLX0xPV1NQQUNFIDogMCk7CiAKIAllcnIgPSBfeGZzX2ZpbGVzdHJlYW1fcGlja19hZyhtcCwgYWcsIGFncCwgZmxhZ3MsIG1pbmxlbik7CiAJaWYgKGVyciB8fCAqYWdwID09IE5VTExBR05VTUJFUikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwppbmRleCA5MTUzZDJjLi4xYzZmZGViIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmMKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC0xOTQsNiArMTk0LDEwIEBACiAJCWJwID0geGZzX2J1Zl9nZXQobXAtPm1fZGRldl90YXJncCwKIAkJCQkgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCiAJCQkJIFhGU19GU1NfVE9fQkIobXAsIDEpLCBYQkZfTE9DSyB8IFhCRl9NQVBQRUQpOworCQlpZiAoIWJwKSB7CisJCQllcnJvciA9IEVOT01FTTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CiAJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKIAkJbWVtc2V0KGFnZiwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOwogCQlhZ2YtPmFnZl9tYWdpY251bSA9IGNwdV90b19iZTMyKFhGU19BR0ZfTUFHSUMpOwpAQCAtMjE2LDE2ICsyMjAsMjEgQEAKIAkJdG1wc2l6ZSA9IGFnc2l6ZSAtIFhGU19QUkVBTExPQ19CTE9DS1MobXApOwogCQlhZ2YtPmFnZl9mcmVlYmxrcyA9IGNwdV90b19iZTMyKHRtcHNpemUpOwogCQlhZ2YtPmFnZl9sb25nZXN0ID0gY3B1X3RvX2JlMzIodG1wc2l6ZSk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogQUcgaW5vZGUgaGVhZGVyIGJsb2NrCiAJCSAqLwogCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCiAJCQkJIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAogCQkJCSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CiAJCW1lbXNldChhZ2ksIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplKTsKIAkJYWdpLT5hZ2lfbWFnaWNudW0gPSBjcHVfdG9fYmUzMihYRlNfQUdJX01BR0lDKTsKQEAgLTI0MCwxMCArMjQ5LDExIEBACiAJCWFnaS0+YWdpX2RpcmlubyA9IGNwdV90b19iZTMyKE5VTExBR0lOTyk7CiAJCWZvciAoYnVja2V0ID0gMDsgYnVja2V0IDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBidWNrZXQrKykKIAkJCWFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF0gPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pOwotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKLQkJaWYgKGVycm9yKSB7CisJCWVycm9yID0geGZzX2J3cml0ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMDsKLQkJfQorCiAJCS8qCiAJCSAqIEJOTyBidHJlZSByb290IGJsb2NrCiAJCSAqLwpAQCAtMjUxLDYgKzI2MSwxMCBAQAogCQkJCSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfQk5PX0JMT0NLKG1wKSksCiAJCQkJIEJUT0JCKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSksCiAJCQkJIFhCRl9MT0NLIHwgWEJGX01BUFBFRCk7CisJCWlmICghYnApIHsKKwkJCWVycm9yID0gRU5PTUVNOworCQkJZ290byBlcnJvcjA7CisJCX0KIAkJYmxvY2sgPSBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKIAkJbWVtc2V0KGJsb2NrLCAwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUpOwogCQlibG9jay0+YmJfbWFnaWMgPSBjcHVfdG9fYmUzMihYRlNfQUJUQl9NQUdJQyk7CkBAIC0yNjIsMTAgKzI3NiwxMSBAQAogCQlhcmVjLT5hcl9zdGFydGJsb2NrID0gY3B1X3RvX2JlMzIoWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkpOwogCQlhcmVjLT5hcl9ibG9ja2NvdW50ID0gY3B1X3RvX2JlMzIoCiAJCQlhZ3NpemUgLSBiZTMyX3RvX2NwdShhcmVjLT5hcl9zdGFydGJsb2NrKSk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogQ05UIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCkBAIC0yNzMsNiArMjg4LDEwIEBACiAJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19DTlRfQkxPQ0sobXApKSwKIAkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19BQlRDX01BR0lDKTsKQEAgLTI4NSwxMCArMzA0LDExIEBACiAJCWFyZWMtPmFyX2Jsb2NrY291bnQgPSBjcHVfdG9fYmUzMigKIAkJCWFnc2l6ZSAtIGJlMzJfdG9fY3B1KGFyZWMtPmFyX3N0YXJ0YmxvY2spKTsKIAkJbmZyZWUgKz0gYmUzMl90b19jcHUoYXJlYy0+YXJfYmxvY2tjb3VudCk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CisKIAkJLyoKIAkJICogSU5PIGJ0cmVlIHJvb3QgYmxvY2sKIAkJICovCkBAIC0yOTYsNiArMzE2LDEwIEBACiAJCQkJIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIFhGU19JQlRfQkxPQ0sobXApKSwKIAkJCQkgQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwKIAkJCQkgWEJGX0xPQ0sgfCBYQkZfTUFQUEVEKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMDsKKwkJfQogCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOwogCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CiAJCWJsb2NrLT5iYl9tYWdpYyA9IGNwdV90b19iZTMyKFhGU19JQlRfTUFHSUMpOwpAQCAtMzAzLDEwICszMjcsMTAgQEAKIAkJYmxvY2stPmJiX251bXJlY3MgPSAwOwogCQlibG9jay0+YmJfdS5zLmJiX2xlZnRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7CiAJCWJsb2NrLT5iYl91LnMuYmJfcmlnaHRzaWIgPSBjcHVfdG9fYmUzMihOVUxMQUdCTE9DSyk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOwotCQlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwotCQl9CiAJfQogCXhmc190cmFuc19hZ2Jsb2Nrc19kZWx0YSh0cCwgbmZyZWUpOwogCS8qCkBAIC0zOTYsOSArNDIwLDkgQEAKIAkJICoganVzdCBpc3N1ZSBhIHdhcm5pbmcgYW5kIGNvbnRpbnVlLiAgVGhlIHJlYWwgd29yayBpcwogCQkgKiBhbHJlYWR5IGRvbmUgYW5kIGNvbW1pdHRlZC4KIAkJICovCi0JCWlmICghKGVycm9yID0geGZzX2J3cml0ZShtcCwgYnApKSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2J3cml0ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlpZiAoZXJyb3IpIHsKIAkJCXhmc193YXJuKG1wLAogCQkid3JpdGUgZXJyb3IgJWQgdXBkYXRpbmcgc2Vjb25kYXJ5IHN1cGVyYmxvY2sgZm9yIGFnICVkIiwKIAkJCQllcnJvciwgYWdubyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwppbmRleCA5ZjI0ZWMyLi4xNjkzODBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogLyoKICAqIEluaXRpYWxpc2UgYSBuZXcgc2V0IG9mIGlub2Rlcy4KICAqLwotU1RBVElDIHZvaWQKK1NUQVRJQyBpbnQKIHhmc19pYWxsb2NfaW5vZGVfaW5pdCgKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKQEAgLTIwMiw4ICsyMDIsOCBAQAogCQlmYnVmID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCiAJCQkJCSBtcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCiAJCQkJCSBYQkZfTE9DSyk7Ci0JCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihmYnVmKSk7Ci0KKwkJaWYgKCFmYnVmKQorCQkJcmV0dXJuIEVOT01FTTsKIAkJLyoKIAkJICogSW5pdGlhbGl6ZSBhbGwgaW5vZGVzIGluIHRoaXMgYnVmZmVyIGFuZCB0aGVuIGxvZyB0aGVtLgogCQkgKgpAQCAtMjI1LDYgKzIyNSw3IEBACiAJCX0KIAkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih0cCwgZmJ1Zik7CiAJfQorCXJldHVybiAwOwogfQogCiAvKgpAQCAtMzY5LDkgKzM3MCwxMSBAQAogCSAqIHJhdGhlciB0aGFuIGEgbGluZWFyIHByb2dyZXNzaW9uIHRvIHByZXZlbnQgdGhlIG5leHQgZ2VuZXJhdGlvbgogCSAqIG51bWJlciBmcm9tIGJlaW5nIGVhc2lseSBndWVzc2FibGUuCiAJICovCi0JeGZzX2lhbGxvY19pbm9kZV9pbml0KGFyZ3MubXAsIHRwLCBhZ25vLCBhcmdzLmFnYm5vLCBhcmdzLmxlbiwKLQkJCSAgICAgIHJhbmRvbTMyKCkpOworCWVycm9yID0geGZzX2lhbGxvY19pbm9kZV9pbml0KGFyZ3MubXAsIHRwLCBhZ25vLCBhcmdzLmFnYm5vLAorCQkJYXJncy5sZW4sIHJhbmRvbTMyKCkpOwogCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAJLyoKIAkgKiBDb252ZXJ0IHRoZSByZXN1bHRzLgogCSAqLwpAQCAtMTUwMiw3ICsxNTA1LDcgQEAKIAkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KIAotCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX0FHSSwgWEZTX0FHSV9SRUYpOworCXhmc19idWZfc2V0X3JlZigqYnBwLCBYRlNfQUdJX1JFRik7CiAKIAl4ZnNfY2hlY2tfYWdpX3VubGlua2VkKGFnaSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IDc3NTk4MTIuLjBmYTk4YjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC03NSw3ICs3NSw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfaW9jb3VudCkgPT0gMCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPT0gMCk7CiAJQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmaXAtPmlfZmxhZ3NfbG9jaykpOwogCUFTU0VSVChjb21wbGV0aW9uX2RvbmUoJmlwLT5pX2ZsdXNoKSk7CkBAIC0xNTAsNyArMTQ5LDYgQEAKIAl9CiAKIAkvKiBhc3NlcnRzIHRvIHZlcmlmeSBhbGwgc3RhdGUgaXMgY29ycmVjdCBoZXJlICovCi0JQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9pb2NvdW50KSA9PSAwKTsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA9PSAwKTsKIAlBU1NFUlQoIXNwaW5faXNfbG9ja2VkKCZpcC0+aV9mbGFnc19sb2NrKSk7CiAJQVNTRVJUKGNvbXBsZXRpb25fZG9uZSgmaXAtPmlfZmx1c2gpKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwppbmRleCAwMjM5YTdjLi5jMDIzN2M2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0xOTAsMTIgKzE5MCw2IEBACiAJfQogCiAJeGZzX2lub2JwX2NoZWNrKG1wLCBicCk7Ci0KLQkvKgotCSAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBhbiBpbm9kZSBidWZmZXIgbm93IHRoYXQgaXQgbG9va3MgZ29vZAotCSAqLwotCVhGU19CVUZfU0VUX1ZUWVBFKGJwLCBCX0ZTX0lOTyk7Ci0KIAkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTUyLDcgKzExNDYsNyBAQAogCS8qCiAJICogTG9nIHRoZSBuZXcgdmFsdWVzIHN0dWZmZWQgaW50byB0aGUgaW5vZGUuCiAJICovCi0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIGZsYWdzKTsKIAogCS8qIG5vdyB0aGF0IHdlIGhhdmUgYW4gaV9tb2RlIHdlIGNhbiBzZXR1cCBpbm9kZSBvcHMgYW5kIHVubG9jayAqLwpAQCAtMTE4Nyw2ICsxMTgxLDcgQEAKIAl4ZnNfZmlsZW9mZl90CQltYXBfZmlyc3Q7CiAJaW50CQkJbmltYXBzOwogCXhmc19ibWJ0X2lyZWNfdAkJaW1hcHNbMl07CisJaW50CQkJZXJyb3I7CiAKIAlpZiAoIVNfSVNSRUcoaXAtPmlfZC5kaV9tb2RlKSkKIAkJcmV0dXJuOwpAQCAtMTIwMywxMyArMTE5OCwxMiBAQAogCSAqIFRoZSBmaWxlc3lzdGVtIGNvdWxkIGJlIHNodXR0aW5nIGRvd24sIHNvIGJtYXBpIG1heSByZXR1cm4KIAkgKiBhbiBlcnJvci4KIAkgKi8KLQlpZiAoeGZzX2JtYXBpKE5VTEwsIGlwLCBtYXBfZmlyc3QsCisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgbWFwX2ZpcnN0LAogCQkJIChYRlNfQl9UT19GU0IobXAsCi0JCQkJICAgICAgICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKSAtCi0JCQkgIG1hcF9maXJzdCksCi0JCQkgWEZTX0JNQVBJX0VOVElSRSwgTlVMTCwgMCwgaW1hcHMsICZuaW1hcHMsCi0JCQkgTlVMTCkpCi0JICAgIHJldHVybjsKKwkJCSAgICAgICAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSkgLSBtYXBfZmlyc3QpLAorCQkJIGltYXBzLCAmbmltYXBzLCBYRlNfQk1BUElfRU5USVJFKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybjsKIAlBU1NFUlQobmltYXBzID09IDEpOwogCUFTU0VSVChpbWFwc1swXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKTsKIH0KQEAgLTEyOTcsNyArMTI5MSw3IEBACiAJCSAqLwogCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsICZjb21taXR0ZWQpOwogCQlpZiAoY29tbWl0dGVkKQotCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYm1hcF9jYW5jZWw7CiAKQEAgLTEzMTMsNyArMTMwNyw3IEBACiAJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAJCXRwID0gbnRwOwogCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKQEAgLTE2NDQsNyArMTYzOCw3IEBACiAgKiBpbm9kZXMgdGhhdCBhcmUgaW4gbWVtb3J5IC0gdGhleSBhbGwgbXVzdCBiZSBtYXJrZWQgc3RhbGUgYW5kIGF0dGFjaGVkIHRvCiAgKiB0aGUgY2x1c3RlciBidWZmZXIuCiAgKi8KLVNUQVRJQyB2b2lkCitTVEFUSUMgaW50CiB4ZnNfaWZyZWVfY2x1c3RlcigKIAl4ZnNfaW5vZGVfdAkqZnJlZV9pcCwKIAl4ZnNfdHJhbnNfdAkqdHAsCkBAIC0xNjkwLDYgKzE2ODQsOCBAQAogCQkJCQltcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCiAJCQkJCVhCRl9MT0NLKTsKIAorCQlpZiAoIWJwKQorCQkJcmV0dXJuIEVOT01FTTsKIAkJLyoKIAkJICogV2FsayB0aGUgaW5vZGVzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciBhbmQgbWFyayB0aGVtCiAJCSAqIHN0YWxlLiBUaGVzZSB3aWxsIGFsbCBoYXZlIHRoZSBmbHVzaCBsb2NrcyBoZWxkLCBzbyBhbgpAQCAtMTc5OSw2ICsxNzk1LDcgQEAKIAl9CiAKIAl4ZnNfcGVyYWdfcHV0KHBhZyk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xODc4LDEwICsxODc1LDEwIEBACiAJZGlwLT5kaV9tb2RlID0gMDsKIAogCWlmIChkZWxldGUpIHsKLQkJeGZzX2lmcmVlX2NsdXN0ZXIoaXAsIHRwLCBmaXJzdF9pbm8pOworCQllcnJvciA9IHhmc19pZnJlZV9jbHVzdGVyKGlwLCB0cCwgZmlyc3RfaW5vKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0yNDcyLDExICsyNDY5LDExIEBACiAJCSAqLwogCQlpZiAoYnAtPmJfaW9kb25lKSB7CiAJCQlYRlNfQlVGX1VORE9ORShicCk7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJeGZzX2J1Zl9pb2Vycm9yKGJwLCBFSU8pOwogCQkJeGZzX2J1Zl9pb2VuZChicCwgMCk7CiAJCX0gZWxzZSB7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCX0KIAl9CkBAIC0yNTk3LDkgKzI1OTQsMTEgQEAKIAkJZ290byBjbHVzdGVyX2NvcnJ1cHRfb3V0OwogCiAJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQotCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAllbHNlCi0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKworCXhmc19idWZfcmVsc2UoYnApOwogCXJldHVybiBlcnJvcjsKIAogY29ycnVwdF9vdXQ6CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggMjM4MGE0Yi4uNzYwMTQwZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMjU3LDcgKzI1Nyw2IEBACiAKIAl4ZnNfZnNpemVfdAkJaV9zaXplOwkJLyogaW4tbWVtb3J5IHNpemUgKi8KIAl4ZnNfZnNpemVfdAkJaV9uZXdfc2l6ZTsJLyogc2l6ZSB3aGVuIHdyaXRlIGNvbXBsZXRlcyAqLwotCWF0b21pY190CQlpX2lvY291bnQ7CS8qIG91dHN0YW5kaW5nIEkvTyBjb3VudCAqLwogCiAJLyogVkZTIGlub2RlICovCiAJc3RydWN0IGlub2RlCQlpX3Zub2RlOwkvKiBlbWJlZGRlZCBWRlMgaW5vZGUgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggODM2YWQ4MC4uYWJhYWZkYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTY1OCwxMCArNjU4LDggQEAKIAogCWxvY2tfZmxhZ3MgPSBpaXAtPmlsaV9sb2NrX2ZsYWdzOwogCWlpcC0+aWxpX2xvY2tfZmxhZ3MgPSAwOwotCWlmIChsb2NrX2ZsYWdzKSB7CisJaWYgKGxvY2tfZmxhZ3MpCiAJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQkJSVJFTEUoaXApOwotCX0KIH0KIAogLyoKQEAgLTc5Nyw3ICs3OTUsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgogICovCi1zdGF0aWMgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfaW5vZGVfaXRlbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfaW5vZGVfaXRlbV9vcHMgPSB7CiAJLmlvcF9zaXplCT0geGZzX2lub2RlX2l0ZW1fc2l6ZSwKIAkuaW9wX2Zvcm1hdAk9IHhmc19pbm9kZV9pdGVtX2Zvcm1hdCwKIAkuaW9wX3Bpbgk9IHhmc19pbm9kZV9pdGVtX3BpbiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9jdGwuYyBiL2ZzL3hmcy94ZnNfaW9jdGwuYwppbmRleCBmN2NlN2RlLi5kOTlhOTA1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL3hmc19pb2N0bC5jCkBAIC0xMDY5LDcgKzEwNjksNyBAQAogCQl9CiAJfQogCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkvKgogCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggMDkxZDgyYi4uOWFmYTI4MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5jCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwpAQCAtMjA4LDIyICsyMDgsMjAgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IxOwogCi0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKLQlibWFwaV9mbGFnID0gWEZTX0JNQVBJX1dSSVRFOworCWJtYXBpX2ZsYWcgPSAwOwogCWlmIChvZmZzZXQgPCBpcC0+aV9zaXplIHx8IGV4dHN6KQogCQlibWFwaV9mbGFnIHw9IFhGU19CTUFQSV9QUkVBTExPQzsKIAogCS8qCi0JICogSXNzdWUgdGhlIHhmc19ibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2Nrcy4KLQkgKgogCSAqIEZyb20gdGhpcyBwb2ludCBvbndhcmRzIHdlIG92ZXJ3cml0ZSB0aGUgaW1hcCBwb2ludGVyIHRoYXQgdGhlCiAJICogY2FsbGVyIGdhdmUgdG8gdXMuCiAJICovCiAJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwogCW5pbWFwcyA9IDE7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCi0JCSZmaXJzdGZzYiwgMCwgaW1hcCwgJm5pbWFwcywgJmZyZWVfbGlzdCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCisJCQkJJmZpcnN0ZnNiLCAwLCBpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCkBAIC0zMDAsOCArMjk4LDggQEAKIAl3aGlsZSAoY291bnRfZnNiID4gMCkgewogCQlpbWFwcyA9IG5pbWFwczsKIAkJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOwotCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRfZnNiLCBjb3VudF9mc2IsIDAsCi0JCQkJICAmZmlyc3RibG9jaywgMCwgaW1hcCwgJmltYXBzLCBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgc3RhcnRfZnNiLCBjb3VudF9mc2IsIGltYXAsICZpbWFwcywKKwkJCQkgICAgICAgMCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIAkJZm9yIChuID0gMDsgbiA8IGltYXBzOyBuKyspIHsKQEAgLTM4MSw3ICszNzksNiBAQAogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7CiAJeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OwogCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKLQl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CiAJeGZzX2V4dGxlbl90CWV4dHN6OwogCWludAkJbmltYXBzOwogCXhmc19ibWJ0X2lyZWNfdCBpbWFwW1hGU19XUklURV9JTUFQU107CkBAIC00MjUsMTIgKzQyMiw4IEBACiAJfQogCiAJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOwotCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKLQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwKLQkJCSAgKHhmc19maWxibGtzX3QpKGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYiksCi0JCQkgIFhGU19CTUFQSV9ERUxBWSB8IFhGU19CTUFQSV9XUklURSB8Ci0JCQkgIFhGU19CTUFQSV9FTlRJUkUsICZmaXJzdGJsb2NrLCAxLCBpbWFwLAotCQkJICAmbmltYXBzLCBOVUxMKTsKKwllcnJvciA9IHhmc19ibWFwaV9kZWxheShpcCwgb2Zmc2V0X2ZzYiwgbGFzdF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJCWltYXAsICZuaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUpOwogCXN3aXRjaCAoZXJyb3IpIHsKIAljYXNlIDA6CiAJY2FzZSBFTk9TUEM6CkBAIC01MzUsNyArNTI4LDcgQEAKIAkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAkJCX0KIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCQkJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOwogCkBAIC01ODcsMTQgKzU4MCwxMiBAQAogCQkJfQogCiAJCQkvKgotCQkJICogR28gZ2V0IHRoZSBhY3R1YWwgYmxvY2tzLgotCSAJIAkgKgogCQkJICogRnJvbSB0aGlzIHBvaW50IG9ud2FyZHMgd2Ugb3ZlcndyaXRlIHRoZSBpbWFwCiAJCQkgKiBwb2ludGVyIHRoYXQgdGhlIGNhbGxlciBnYXZlIHRvIHVzLgogCQkJICovCi0JCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG1hcF9zdGFydF9mc2IsIGNvdW50X2ZzYiwKLQkJCQkJWEZTX0JNQVBJX1dSSVRFLCAmZmlyc3RfYmxvY2ssIDEsCi0JCQkJCWltYXAsICZuaW1hcHMsICZmcmVlX2xpc3QpOworCQkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBtYXBfc3RhcnRfZnNiLAorCQkJCQkJY291bnRfZnNiLCAwLCAmZmlyc3RfYmxvY2ssIDEsCisJCQkJCQlpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIHRyYW5zX2NhbmNlbDsKIApAQCAtNzAxLDE1ICs2OTIsMTUgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJLyoKIAkJICogTW9kaWZ5IHRoZSB1bndyaXR0ZW4gZXh0ZW50IHN0YXRlIG9mIHRoZSBidWZmZXIuCiAJCSAqLwogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCW5pbWFwcyA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAotCQkJCSAgWEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9DT05WRVJULCAmZmlyc3Rmc2IsCisJCWVycm9yID0geGZzX2JtYXBpX3dyaXRlKHRwLCBpcCwgb2Zmc2V0X2ZzYiwgY291bnRfZnNiLAorCQkJCSAgWEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKIAkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9wcy5jIGIvZnMveGZzL3hmc19pb3BzLmMKaW5kZXggMjg4NTZhYy4uMjNjZTkyNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb3BzLmMKKysrIGIvZnMveGZzL3hmc19pb3BzLmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXRyYWNlX3hmc19nZXRhdHRyKGlwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJc3RhdC0+c2l6ZSA9IFhGU19JU0laRShpcCk7CiAJc3RhdC0+ZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OwpAQCAtNjEyLDcgKzYxMiw3IEBACiAJCX0KIAl9CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAogCS8qCiAJICogQ2hhbmdlIGZpbGUgb3duZXJzaGlwLiAgTXVzdCBiZSB0aGUgb3duZXIgb3IgcHJpdmlsZWdlZC4KQEAgLTgzNCwxNiArODM0LDE2IEBACiAJICogY2FyZSBhYm91dCBoZXJlLgogCSAqLwogCWlmIChpcC0+aV9zaXplICE9IGlwLT5pX2QuZGlfc2l6ZSAmJiBpYXR0ci0+aWFfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSkgewotCQllcnJvciA9IHhmc19mbHVzaF9wYWdlcyhpcCwgaXAtPmlfZC5kaV9zaXplLCBpYXR0ci0+aWFfc2l6ZSwKLQkJCQkJWEJGX0FTWU5DLCBGSV9OT05FKTsKKwkJZXJyb3IgPSB4ZnNfZmx1c2hfcGFnZXMoaXAsIGlwLT5pX2QuZGlfc2l6ZSwgaWF0dHItPmlhX3NpemUsIDAsCisJCQkJCUZJX05PTkUpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyoKLQkgKiBXYWl0IGZvciBhbGwgSS9PIHRvIGNvbXBsZXRlLgorCSAqIFdhaXQgZm9yIGFsbCBkaXJlY3QgSS9PIHRvIGNvbXBsZXRlLgogCSAqLwotCXhmc19pb2VuZF93YWl0KGlwKTsKKwlpbm9kZV9kaW9fd2FpdChpbm9kZSk7CiAKIAllcnJvciA9IC1ibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlhdHRyLT5pYV9zaXplLAogCQkJCSAgICAgeGZzX2dldF9ibG9ja3MpOwpAQCAtODY0LDcgKzg2NCw3IEBACiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIDApOwogCiAJLyoKIAkgKiBPbmx5IGNoYW5nZSB0aGUgYy9tdGltZSBpZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUgb3Igd2UgYXJlCkBAIC0xMTUzLDcgKzExNTMsNyBAQAogCWhsaXN0X2FkZF9mYWtlKCZpbm9kZS0+aV9oYXNoKTsKIAogCWlub2RlLT5pX21vZGUJPSBpcC0+aV9kLmRpX21vZGU7Ci0JaW5vZGUtPmlfbmxpbmsJPSBpcC0+aV9kLmRpX25saW5rOworCXNldF9ubGluayhpbm9kZSwgaXAtPmlfZC5kaV9ubGluayk7CiAJaW5vZGUtPmlfdWlkCT0gaXAtPmlfZC5kaV91aWQ7CiAJaW5vZGUtPmlfZ2lkCT0gaXAtPmlfZC5kaV9naWQ7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IDNhOGQ0ZjYuLmExNGNkODkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtNjI2LDcgKzYyNiw3IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqaXRlbSwKIAlpbnQJCQl0eXBlLAotCXN0cnVjdCB4ZnNfaXRlbV9vcHMJKm9wcykKKwljb25zdCBzdHJ1Y3QgeGZzX2l0ZW1fb3BzICpvcHMpCiB7CiAJaXRlbS0+bGlfbW91bnRwID0gbXA7CiAJaXRlbS0+bGlfYWlscCA9IG1wLT5tX2FpbDsKQEAgLTg4MCw4ICs4ODAsOCBAQAogCSAqLwogCWlmIChYRlNfVEVTVF9FUlJPUigoeGZzX2J1Zl9nZXRlcnJvcihicCkpLCBsLT5sX21wLAogCQkJWEZTX0VSUlRBR19JT0RPTkVfSU9FUlIsIFhGU19SQU5ET01fSU9ET05FX0lPRVJSKSkgewotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19pb2RvbmUiLCBsLT5sX21wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7Ci0JCVhGU19CVUZfU1RBTEUoYnApOworCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKKwkJeGZzX2J1Zl9zdGFsZShicCk7CiAJCXhmc19mb3JjZV9zaHV0ZG93bihsLT5sX21wLCBTSFVURE9XTl9MT0dfSU9fRVJST1IpOwogCQkvKgogCQkgKiBUaGlzIGZsYWcgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSB0cmFucy1jb21taXR0ZWQKQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAJeGxvZ19nZXRfaWNsb2dfYnVmZmVyX3NpemUobXAsIGxvZyk7CiAKIAllcnJvciA9IEVOT01FTTsKLQlicCA9IHhmc19idWZfZ2V0X2VtcHR5KGxvZy0+bF9pY2xvZ19zaXplLCBtcC0+bV9sb2dkZXZfdGFyZ3ApOworCWJwID0geGZzX2J1Zl9hbGxvYyhtcC0+bV9sb2dkZXZfdGFyZ3AsIDAsIGxvZy0+bF9pY2xvZ19zaXplLCAwKTsKIAlpZiAoIWJwKQogCQlnb3RvIG91dF9mcmVlX2xvZzsKIAlicC0+Yl9pb2RvbmUgPSB4bG9nX2lvZG9uZTsKQEAgLTEyNDcsNyArMTI0Nyw3IEBACiAKIAlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CiAJCXhmc19idWZfaW9lcnJvcihicCwgRUlPKTsKLQkJWEZTX0JVRl9TVEFMRShicCk7CisJCXhmc19idWZfc3RhbGUoYnApOwogCQl4ZnNfYnVmX2lvZW5kKGJwLCAwKTsKIAkJLyoKIAkJICogSXQgd291bGQgc2VlbSBsb2dpY2FsIHRvIHJldHVybiBFSU8gaGVyZSwgYnV0IHdlIHJlbHkgb24KQEAgLTEzODcsOSArMTM4Nyw5IEBACiAJICovCiAJWEZTX0JVRl9XUklURShicCk7CiAKLQlpZiAoKGVycm9yID0geGxvZ19iZHN0cmF0KGJwKSkpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyIsIGxvZy0+bF9tcCwgYnAsCi0JCQkJICBYRlNfQlVGX0FERFIoYnApKTsKKwllcnJvciA9IHhsb2dfYmRzdHJhdChicCk7CisJaWYgKGVycm9yKSB7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgInhsb2dfc3luYyIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCWlmIChzcGxpdCkgewpAQCAtMTQyMyw5ICsxNDIzLDkgQEAKIAkJLyogYWNjb3VudCBmb3IgaW50ZXJuYWwgbG9nIHdoaWNoIGRvZXNuJ3Qgc3RhcnQgYXQgYmxvY2sgIzAgKi8KIAkJWEZTX0JVRl9TRVRfQUREUihicCwgWEZTX0JVRl9BRERSKGJwKSArIGxvZy0+bF9sb2dCQnN0YXJ0KTsKIAkJWEZTX0JVRl9XUklURShicCk7Ci0JCWlmICgoZXJyb3IgPSB4bG9nX2Jkc3RyYXQoYnApKSkgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfc3luYyAoc3BsaXQpIiwgbG9nLT5sX21wLAotCQkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJZXJyb3IgPSB4bG9nX2Jkc3RyYXQoYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgInhsb2dfc3luYyAoc3BsaXQpIik7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5oIGIvZnMveGZzL3hmc19sb2cuaAppbmRleCA3OGM5MDM5Li4zZjdiZjQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmgKQEAgLTEzNyw3ICsxMzcsNyBAQAogdm9pZAl4ZnNfbG9nX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAkJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKml0ZW0sCiAJCQlpbnQJCQl0eXBlLAotCQkJc3RydWN0IHhmc19pdGVtX29wcwkqb3BzKTsKKwkJCWNvbnN0IHN0cnVjdCB4ZnNfaXRlbV9vcHMgKm9wcyk7CiAKIHhmc19sc25fdCB4ZnNfbG9nX2RvbmUoc3RydWN0IHhmc19tb3VudCAqbXAsCiAJCSAgICAgICBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpY2tldCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCBhMTk5ZGJjLi41NDFhNTA4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC0xODMsOCArMTgzLDcgQEAKIAl4ZnNiZHN0cmF0KGxvZy0+bF9tcCwgYnApOwogCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOwogCWlmIChlcnJvcikKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfYnJlYWQiLCBsb2ctPmxfbXAsCi0JCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjY4LDkgKzI2NywxMCBAQAogCXhmc19idWZfbG9jayhicCk7CiAJWEZTX0JVRl9TRVRfQ09VTlQoYnAsIEJCVE9CKG5iYmxrcykpOwogCi0JaWYgKChlcnJvciA9IHhmc19id3JpdGUobG9nLT5sX21wLCBicCkpKQotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19id3JpdGUiLCBsb2ctPmxfbXAsCi0JCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwlpZiAoZXJyb3IpCisJCXhmc19idWZfaW9lcnJvcl9hbGVydChicCwgX19mdW5jX18pOworCXhmc19idWZfcmVsc2UoYnApOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzYxLDkgKzM2MSw3IEBACiAJCSAqIFdlJ3JlIG5vdCBnb2luZyB0byBib3RoZXIgYWJvdXQgcmV0cnlpbmcKIAkJICogdGhpcyBkdXJpbmcgcmVjb3ZlcnkuIE9uZSBzdHJpa2UhCiAJCSAqLwotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2lvZG9uZSIsCi0JCQkJCWJwLT5iX3RhcmdldC0+YnRfbW91bnQsIGJwLAotCQkJCQlYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCXhmc19mb3JjZV9zaHV0ZG93bihicC0+Yl90YXJnZXQtPmJ0X21vdW50LAogCQkJCQlTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKIAl9CkBAIC0yMTM1LDggKzIxMzMsNyBAQAogCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CiAJZXJyb3IgPSBicC0+Yl9lcnJvcjsKIAlpZiAoZXJyb3IpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMSkiLCBtcCwKLQkJCQkgIGJwLCBidWZfZi0+YmxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMxKSIpOwogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTIxNzEsMTUgKzIxNjgsMTYgQEAKIAkgICAgYmUxNl90b19jcHUoKigoX19iZTE2ICopeGZzX2J1Zl9vZmZzZXQoYnAsIDApKSkgJiYKIAkgICAgKFhGU19CVUZfQ09VTlQoYnApICE9IE1BWChsb2ctPmxfbXAtPm1fc2Iuc2JfYmxvY2tzaXplLAogCQkJKF9fdWludDMyX3QpWEZTX0lOT0RFX0NMVVNURVJfU0laRShsb2ctPmxfbXApKSkpIHsKLQkJWEZTX0JVRl9TVEFMRShicCk7Ci0JCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQl4ZnNfYnVmX3N0YWxlKGJwKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKIAl9IGVsc2UgewogCQlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7CiAJCWJwLT5iX2lvZG9uZSA9IHhsb2dfcmVjb3Zlcl9pb2RvbmU7Ci0JCXhmc19iZHdyaXRlKG1wLCBicCk7CisJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKIAl9CiAKLQlyZXR1cm4gKGVycm9yKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTIyMzAsOCArMjIyOCw3IEBACiAJfQogCWVycm9yID0gYnAtPmJfZXJyb3I7CiAJaWYgKGVycm9yKSB7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzIpIiwgbXAsCi0JCQkJICBicCwgaW5fZi0+aWxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMyKSIpOwogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0yNDM5LDcgKzI0MzYsOCBAQAogd3JpdGVfaW5vZGVfYnVmZmVyOgogCUFTU0VSVChicC0+Yl90YXJnZXQtPmJ0X21vdW50ID09IG1wKTsKIAlicC0+Yl9pb2RvbmUgPSB4bG9nX3JlY292ZXJfaW9kb25lOwotCXhmc19iZHdyaXRlKG1wLCBicCk7CisJeGZzX2J1Zl9kZWx3cmlfcXVldWUoYnApOworCXhmc19idWZfcmVsc2UoYnApOwogZXJyb3I6CiAJaWYgKG5lZWRfZnJlZSkKIAkJa21lbV9mcmVlKGluX2YpOwpAQCAtMjUzNyw4ICsyNTM1LDcgQEAKIAkJCSAgICAgWEZTX0ZTQl9UT19CQihtcCwgZHFfZi0+cWxmX2xlbiksCiAJCQkgICAgIDAsICZicCk7CiAJaWYgKGVycm9yKSB7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzMpIiwgbXAsCi0JCQkJICBicCwgZHFfZi0+cWxmX2Jsa25vKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCAieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMzKSIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCUFTU0VSVChicCk7CkBAIC0yNTYxLDcgKzI1NTgsOCBAQAogCUFTU0VSVChkcV9mLT5xbGZfc2l6ZSA9PSAyKTsKIAlBU1NFUlQoYnAtPmJfdGFyZ2V0LT5idF9tb3VudCA9PSBtcCk7CiAJYnAtPmJfaW9kb25lID0geGxvZ19yZWNvdmVyX2lvZG9uZTsKLQl4ZnNfYmR3cml0ZShtcCwgYnApOworCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKIAogCXJldHVybiAoMCk7CiB9CkBAIC0zNjU2LDcgKzM2NTQsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JWEZTX2JmbHVzaChsb2ctPmxfbXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobG9nLT5sX21wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCiAJLyoKIAkgKiBJZiBJTyBlcnJvcnMgaGFwcGVuZWQgZHVyaW5nIHJlY292ZXJ5LCBiYWlsIG91dC4KQEAgLTM2ODksOCArMzY4Nyw3IEBACiAJeGZzYmRzdHJhdChsb2ctPmxfbXAsIGJwKTsKIAllcnJvciA9IHhmc19idWZfaW93YWl0KGJwKTsKIAlpZiAoZXJyb3IpIHsKLQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfZG9fcmVjb3ZlciIsCi0JCQkJICBsb2ctPmxfbXAsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCUFTU0VSVCgwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbWVzc2FnZS5oIGIvZnMveGZzL3hmc19tZXNzYWdlLmgKaW5kZXggN2ZiN2VhMC4uNTZkYzBjMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tZXNzYWdlLmgKKysrIGIvZnMveGZzL3hmc19tZXNzYWdlLmgKQEAgLTMsMzEgKzMsMjkgQEAKIAogc3RydWN0IHhmc19tb3VudDsKIAotZXh0ZXJuIHZvaWQgeGZzX2VtZXJnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2FsZXJ0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2FsZXJ0X3RhZyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHRhZywKLQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgeGZzX2NyaXQoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCB4ZnNfZXJyKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX3dhcm4oY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCB4ZnNfbm90aWNlKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIHZvaWQgeGZzX2luZm8oY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2VtZXJnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2FsZXJ0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgeGZzX2FsZXJ0X3RhZyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHRhZywgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19jcml0KGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX2Vycihjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc193YXJuKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK3ZvaWQgeGZzX25vdGljZShjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19pbmZvKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKICNpZmRlZiBERUJVRwotZXh0ZXJuIHZvaWQgeGZzX2RlYnVnKGNvbnN0IHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSAgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIHhmc19kZWJ1Zyhjb25zdCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCi14ZnNfZGVidWcoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQordm9pZCB4ZnNfZGVidWcoY29uc3Qgc3RydWN0IHhmc19tb3VudCAqbXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggMDA4MTY1Ny4uZDA2YWZiYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNDQsOSArNDQsNiBAQAogI2luY2x1ZGUgInhmc190cmFjZS5oIgogCiAKLVNUQVRJQyB2b2lkCXhmc191bm1vdW50ZnNfd2FpdCh4ZnNfbW91bnRfdCAqKTsKLQotCiAjaWZkZWYgSEFWRV9QRVJDUFVfU0IKIFNUQVRJQyB2b2lkCXhmc19pY3NiX2JhbGFuY2VfY291bnRlcih4ZnNfbW91bnRfdCAqLCB4ZnNfc2JfZmllbGRfdCwKIAkJCQkJCWludCk7CkBAIC0xNDg0LDcgKzE0ODEsNyBAQAogCSAqIHN0YXRlIGFzIG11Y2ggYXMgcG9zc2libGUuCiAJICovCiAJeGZzX3JlY2xhaW1faW5vZGVzKG1wLCAwKTsKLQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCXhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCXhmc19yZWNsYWltX2lub2RlcyhtcCwgU1lOQ19XQUlUKTsKIAogCXhmc19xbV91bm1vdW50KG1wKTsKQEAgLTE0OTYsMTEgKzE0OTMsNiBAQAogCSAqLwogCXhmc19sb2dfZm9yY2UobXAsIFhGU19MT0dfU1lOQyk7CiAKLQl4ZnNfYmludmFsKG1wLT5tX2RkZXZfdGFyZ3ApOwotCWlmIChtcC0+bV9ydGRldl90YXJncCkgewotCQl4ZnNfYmludmFsKG1wLT5tX3J0ZGV2X3RhcmdwKTsKLQl9Ci0KIAkvKgogCSAqIFVucmVzZXJ2ZSBhbnkgYmxvY2tzIHdlIGhhdmUgc28gdGhhdCB3aGVuIHdlIHVubW91bnQgd2UgZG9uJ3QgYWNjb3VudAogCSAqIHRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGFzIHVzZWQuIFRoaXMgaXMgcmVhbGx5IG9ubHkgbmVjZXNzYXJ5IGZvcgpAQCAtMTUyNiw3ICsxNTE4LDE2IEBACiAJCXhmc193YXJuKG1wLCAiVW5hYmxlIHRvIHVwZGF0ZSBzdXBlcmJsb2NrIGNvdW50ZXJzLiAiCiAJCQkJIkZyZWVzcGFjZSBtYXkgbm90IGJlIGNvcnJlY3Qgb24gbmV4dCBtb3VudC4iKTsKIAl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOwotCXhmc191bm1vdW50ZnNfd2FpdChtcCk7IAkJLyogd2FpdCBmb3IgYXN5bmMgYnVmcyAqLworCisJLyoKKwkgKiBNYWtlIHN1cmUgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGZsdXNoZWQgYW5kIGNvbXBsZXRlZCBiZWZvcmUKKwkgKiB1bm1vdW50aW5nIHRoZSBsb2cuCisJICovCisJZXJyb3IgPSB4ZnNfZmx1c2hfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCAxKTsKKwlpZiAoZXJyb3IpCisJCXhmc193YXJuKG1wLCAiJWQgYnVzeSBidWZmZXJzIGR1cmluZyB1bm1vdW50LiIsIGVycm9yKTsKKwl4ZnNfd2FpdF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApOworCiAJeGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKIAl4ZnNfbG9nX3VubW91bnQobXApOwogCXhmc191dWlkX3VubW91bnQobXApOwpAQCAtMTUzNywxNiArMTUzOCw2IEBACiAJeGZzX2ZyZWVfcGVyYWcobXApOwogfQogCi1TVEFUSUMgdm9pZAoteGZzX3VubW91bnRmc193YWl0KHhmc19tb3VudF90ICptcCkKLXsKLQlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCi0JCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwKTsKLQlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApCi0JCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3ApOwotCXhmc193YWl0X2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCk7Ci19Ci0KIGludAogeGZzX2ZzX3dyaXRhYmxlKHhmc19tb3VudF90ICptcCkKIHsKQEAgLTE2MTIsMTUgKzE2MDMsMTQgQEAKIAogCQlYRlNfQlVGX1VORE9ORShzYnApOwogCQlYRlNfQlVGX1VOUkVBRChzYnApOwotCQlYRlNfQlVGX1VOREVMQVlXUklURShzYnApOworCQl4ZnNfYnVmX2RlbHdyaV9kZXF1ZXVlKHNicCk7CiAJCVhGU19CVUZfV1JJVEUoc2JwKTsKIAkJWEZTX0JVRl9VTkFTWU5DKHNicCk7CiAJCUFTU0VSVChzYnAtPmJfdGFyZ2V0ID09IG1wLT5tX2RkZXZfdGFyZ3ApOwogCQl4ZnNiZHN0cmF0KG1wLCBzYnApOwogCQllcnJvciA9IHhmc19idWZfaW93YWl0KHNicCk7CiAJCWlmIChlcnJvcikKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdW5tb3VudGZzX3dyaXRlc2IiLAotCQkJCQkgIG1wLCBzYnAsIFhGU19CVUZfQUREUihzYnApKTsKKwkJCXhmc19idWZfaW9lcnJvcl9hbGVydChzYnAsIF9fZnVuY19fKTsKIAkJeGZzX2J1Zl9yZWxzZShzYnApOwogCX0KIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3FtLmMgYi9mcy94ZnMveGZzX3FtLmMKaW5kZXggOWEwYWE3Ni4uNWNmZjQ0MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19xbS5jCisrKyBiL2ZzL3hmcy94ZnNfcW0uYwpAQCAtMTI5Niw3ICsxMjk2LDggQEAKIAkJCWJyZWFrOwogCiAJCXhmc19xbV9yZXNldF9kcWNvdW50cyhtcCwgYnAsIGZpcnN0aWQsIHR5cGUpOwotCQl4ZnNfYmR3cml0ZShtcCwgYnApOworCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOwogCQkvKgogCQkgKiBnb3RvIHRoZSBuZXh0IGJsb2NrLgogCQkgKi8KQEAgLTEzNDYsMTEgKzEzNDcsOCBAQAogCQkgKiB0aGUgaW5vZGUgaXMgbmV2ZXIgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLgogCQkgKi8KIAkJeGZzX2lsb2NrKHFpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIHFpcCwgbGJsa25vLAotCQkJCSAgbWF4bGJsa2NudCAtIGxibGtubywKLQkJCQkgIFhGU19CTUFQSV9NRVRBREFUQSwKLQkJCQkgIE5VTEwsCi0JCQkJICAwLCBtYXAsICZubWFwcywgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQocWlwLCBsYmxrbm8sIG1heGxibGtjbnQgLSBsYmxrbm8sCisJCQkJICAgICAgIG1hcCwgJm5tYXBzLCAwKTsKIAkJeGZzX2l1bmxvY2socWlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CkBAIC0xNjgzLDcgKzE2ODEsNyBAQAogCSAqIHF1b3RhY2hlY2snZCBzdGFtcCBvbiB0aGUgc3VwZXJibG9jay4gU28sIGhlcmUgd2UgZG8gYSBzeW5jaHJvbm91cwogCSAqIGZsdXNoLgogCSAqLwotCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMSk7CiAKIAkvKgogCSAqIElmIG9uZSB0eXBlIG9mIHF1b3RhcyBpcyBvZmYsIHRoZW4gaXQgd2lsbCBsb3NlIGl0cwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xbV9zeXNjYWxscy5jIGIvZnMveGZzL3hmc19xbV9zeXNjYWxscy5jCmluZGV4IDYwOTI0NmYuLjVjYzNkZGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcW1fc3lzY2FsbHMuYworKysgYi9mcy94ZnMveGZzX3FtX3N5c2NhbGxzLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCX0KIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIDApOwogCiAJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgMCk7CiAJaWYgKGVycm9yKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JlbmFtZS5jIGIvZnMveGZzL3hmc19yZW5hbWUuYwppbmRleCBkZjc4YzI5Li44NjZkZTI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JlbmFtZS5jCisrKyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKQEAgLTE3MCwxMiArMTcwLDEyIEBACiAJICogd2UgY2FuIHJlbHkgb24gZWl0aGVyIHRyYW5zX2NvbW1pdCBvciB0cmFuc19jYW5jZWwgdG8gdW5sb2NrCiAJICogdGhlbS4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBzcmNfZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19kcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWlmIChuZXdfcGFyZW50KQotCQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBzcmNfaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19pcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWlmICh0YXJnZXRfaXApCi0JCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRhcmdldF9pcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIHRhcmdldF9pcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgdXNpbmcgcHJvamVjdCBpbmhlcml0YW5jZSwgd2Ugb25seSBhbGxvdyByZW5hbWVzCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCmluZGV4IDM1NTYxYTUuLjg3MzIzZjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJICogTG9jayB0aGUgaW5vZGUuCiAJCSAqLwogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJCXhmc19ibWFwX2luaXQoJmZsaXN0LCAmZmlyc3RibG9jayk7CiAJCS8qCkBAIC0xMjAsOSArMTIwLDkgQEAKIAkJICovCiAJCW5tYXAgPSAxOwogCQljYW5jZWxmbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgb2Jsb2NrcywgbmJsb2NrcyAtIG9ibG9ja3MsCi0JCQlYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsICZmaXJzdGJsb2NrLAotCQkJcmVzYmxrcywgJm1hcCwgJm5tYXAsICZmbGlzdCk7CisJCWVycm9yID0geGZzX2JtYXBpX3dyaXRlKHRwLCBpcCwgb2Jsb2NrcywgbmJsb2NrcyAtIG9ibG9ja3MsCisJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwgJmZpcnN0YmxvY2ssCisJCQkJCXJlc2Jsa3MsICZtYXAsICZubWFwLCAmZmxpc3QpOwogCQlpZiAoIWVycm9yICYmIG5tYXAgPCAxKQogCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKIAkJaWYgKGVycm9yKQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCQkgKiBMb2NrIHRoZSBiaXRtYXAgaW5vZGUuCiAJCQkgKi8KIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAkJCS8qCiAJCQkgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jay4KIAkJCSAqLwpAQCAtODU2LDMzICs4NTYsMjMgQEAKIAl4ZnNfYnVmX3QJKipicHApCQkvKiBvdXRwdXQ6IGJ1ZmZlciBmb3IgdGhlIGJsb2NrICovCiB7CiAJeGZzX2J1Zl90CSpicDsJCS8qIGJsb2NrIGJ1ZmZlciwgcmVzdWx0ICovCi0JeGZzX2RhZGRyX3QJZDsJCS8qIGRpc2sgYWRkciBvZiBibG9jayAqLwotCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLwotCXhmc19mc2Jsb2NrX3QJZnNiOwkJLyogZnMgYmxvY2sgbnVtYmVyIGZvciBibG9jayAqLwogCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBvciBzdW1tYXJ5IGlub2RlICovCisJeGZzX2JtYnRfaXJlY190CW1hcDsKKwlpbnQJCW5tYXA7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCiAKIAlpcCA9IGlzc3VtID8gbXAtPm1fcnN1bWlwIDogbXAtPm1fcmJtaXA7Ci0JLyoKLQkgKiBNYXAgZnJvbSB0aGUgZmlsZSBvZmZzZXQgKGJsb2NrKSBhbmQgaW5vZGUgbnVtYmVyIHRvIHRoZQotCSAqIGZpbGUgc3lzdGVtIGJsb2NrLgotCSAqLwotCWVycm9yID0geGZzX2JtYXBpX3NpbmdsZSh0cCwgaXAsIFhGU19EQVRBX0ZPUkssICZmc2IsIGJsb2NrKTsKLQlpZiAoZXJyb3IpIHsKKworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIGJsb2NrLCAxLCAmbWFwLCAmbm1hcCwgWEZTX0RBVEFfRk9SSyk7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JfQotCUFTU0VSVChmc2IgIT0gTlVMTEZTQkxPQ0spOwotCS8qCi0JICogQ29udmVydCB0byBkaXNrIGFkZHJlc3MgZm9yIGJ1ZmZlciBjYWNoZS4KLQkgKi8KLQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNiKTsKLQkvKgotCSAqIFJlYWQgdGhlIGJ1ZmZlci4KLQkgKi8KLQllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisKKwlBU1NFUlQobWFwLmJyX3N0YXJ0YmxvY2sgIT0gTlVMTEZTQkxPQ0spOworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwKKwkJCQkgICBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayksCiAJCQkJICAgbXAtPm1fYnNpemUsIDAsICZicCk7Ci0JaWYgKGVycm9yKSB7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JfQogCUFTU0VSVCgheGZzX2J1Zl9nZXRlcnJvcihicCkpOwogCSpicHAgPSBicDsKIAlyZXR1cm4gMDsKQEAgLTE5NzAsNyArMTk2MCw3IEBACiAJCSAqIExvY2sgb3V0IG90aGVyIGNhbGxlcnMgYnkgZ3JhYmJpbmcgdGhlIGJpdG1hcCBpbm9kZSBsb2NrLgogCQkgKi8KIAkJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc190cmFuc19pam9pbl9yZWYodHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKIAkJLyoKIAkJICogVXBkYXRlIHRoZSBiaXRtYXAgaW5vZGUncyBzaXplLgogCQkgKi8KQEAgLTE5ODIsNyArMTk3Miw3IEBACiAJCSAqIEdldCB0aGUgc3VtbWFyeSBpbm9kZSBpbnRvIHRoZSB0cmFuc2FjdGlvbi4KIAkJICovCiAJCXhmc19pbG9jayhtcC0+bV9yc3VtaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgbXAtPm1fcnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19pam9pbih0cCwgbXAtPm1fcnN1bWlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJCS8qCiAJCSAqIFVwZGF0ZSB0aGUgc3VtbWFyeSBpbm9kZSdzIHNpemUuCiAJCSAqLwpAQCAtMjE1Myw3ICsyMTQzLDcgQEAKIAkgKiBTeW5jaHJvbml6ZSBieSBsb2NraW5nIHRoZSBiaXRtYXAgaW5vZGUuCiAJICovCiAJeGZzX2lsb2NrKG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgbXAtPm1fcmJtaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKICNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoREVCVUcpCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuYyBiL2ZzL3hmcy94ZnNfcncuYwppbmRleCBjOTZhOGEwLi41OTdkMDQ0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3J3LmMKKysrIGIvZnMveGZzL3hmc19ydy5jCkBAIC05MiwyNCArOTIsNiBAQAogfQogCiAvKgotICogUHJpbnRzIG91dCBhbiBBTEVSVCBtZXNzYWdlIGFib3V0IEkvTyBlcnJvci4KLSAqLwotdm9pZAoteGZzX2lvZXJyb3JfYWxlcnQoCi0JY2hhcgkJCSpmdW5jLAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCXhmc19idWZfdAkJKmJwLAotCXhmc19kYWRkcl90CQlibGtubykKLXsKLQl4ZnNfYWxlcnQobXAsCi0JCSAiSS9PIGVycm9yIG9jY3VycmVkOiBtZXRhLWRhdGEgZGV2ICVzIGJsb2NrIDB4JWxseCIKLQkJICIgICAgICAgKFwiJXNcIikgZXJyb3IgJWQgYnVmIGNvdW50ICV6ZCIsCi0JCXhmc19idWZfdGFyZ2V0X25hbWUoYnAtPmJfdGFyZ2V0KSwKLQkJKF9fdWludDY0X3QpYmxrbm8sIGZ1bmMsCi0JCWJwLT5iX2Vycm9yLCBYRlNfQlVGX0NPVU5UKGJwKSk7Ci19Ci0KLS8qCiAgKiBUaGlzIGlzbid0IGFuIGFic29sdXRlIHJlcXVpcmVtZW50LCBidXQgaXQgaXMKICAqIGp1c3QgYSBnb29kIGlkZWEgdG8gY2FsbCB4ZnNfcmVhZF9idWYgaW5zdGVhZCBvZgogICogZGlyZWN0bHkgZG9pbmcgYSByZWFkX2J1ZiBjYWxsLiBGb3Igb25lLCB3ZSBzaG91bGRuJ3QKQEAgLTE0MywxNCArMTI1LDEzIEBACiAJfSBlbHNlIHsKIAkJKmJwcCA9IE5VTEw7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkX2J1ZiIsIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKIAkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CiAJCX0KIAkJaWYgKGJwKSB7CiAJCQlYRlNfQlVGX1VORE9ORShicCk7Ci0JCQlYRlNfQlVGX1VOREVMQVlXUklURShicCk7Ci0JCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfc3RhbGUoYnApOwogCQkJLyoKIAkJCSAqIGJyZWxzZSBjbGVhcnMgQl9FUlJPUiBhbmQgYl9lcnJvcgogCQkJICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKaW5kZXggMTFjNDFlYy4uYmJkYjlhZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5oCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtNDIsOCArNDIsNiBAQAogZXh0ZXJuIGludCB4ZnNfcmVhZF9idWYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19idWZ0YXJnX3QgKmJ0cCwKIAkJCXhmc19kYWRkcl90IGJsa25vLCBpbnQgbGVuLCB1aW50IGZsYWdzLAogCQkJc3RydWN0IHhmc19idWYgKipicHApOwotZXh0ZXJuIHZvaWQgeGZzX2lvZXJyb3JfYWxlcnQoY2hhciAqZnVuYywgc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQkJeGZzX2J1Zl90ICpicCwgeGZzX2RhZGRyX3QgYmxrbm8pOwogZXh0ZXJuIHhmc19leHRsZW5fdCB4ZnNfZ2V0X2V4dHN6X2hpbnQoc3RydWN0IHhmc19pbm9kZSAqaXApOwogCiAjZW5kaWYgLyogX19YRlNfUldfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3N1cGVyLmMgYi9mcy94ZnMveGZzX3N1cGVyLmMKaW5kZXggNWNmMDZiOC4uM2VjYTU4ZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy94ZnNfc3VwZXIuYwpAQCAtNzk2LDggKzc5Niw2IEBACiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCWdvdG8gb3V0X3JlY2xhaW07CiAKLQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KIAlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOwogCiAJLyoKQEAgLTgzNyw3ICs4MzUsNiBAQAogCWlub2RlX2luaXRfb25jZShWRlNfSShpcCkpOwogCiAJLyogeGZzIGlub2RlICovCi0JYXRvbWljX3NldCgmaXAtPmlfaW9jb3VudCwgMCk7CiAJYXRvbWljX3NldCgmaXAtPmlfcGluY291bnQsIDApOwogCXNwaW5fbG9ja19pbml0KCZpcC0+aV9mbGFnc19sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcC0+aV9pcGluX3dhaXQpOwpAQCAtODg3LDcgKzg4NCw3IEBACiAJfQogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCXJldHVybiB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKIH0KQEAgLTkxNCw5ICs5MTEsOCBAQAogCQkgKiBvZiBmb3JjaW5nIGl0IGFsbCB0aGUgd2F5IHRvIHN0YWJsZSBzdG9yYWdlIHVzaW5nIGEKIAkJICogc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gd2UgbGV0IHRoZSBsb2cgZm9yY2UgaW5zaWRlIHRoZQogCQkgKiAtPnN5bmNfZnMgY2FsbCBkbyB0aGF0IGZvciB0aHVzLCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIKLQkJICogb2Ygc3luY2hyb25vdXMgbG9nIGZvY2VzIGRyYW1hdGljYWxseS4KKwkJICogb2Ygc3luY2hyb25vdXMgbG9nIGZvcmNlcyBkcmFtYXRpY2FsbHkuCiAJCSAqLwotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CiAJCWVycm9yID0geGZzX2xvZ19pbm9kZShpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwpAQCAtMTAxOSw3ICsxMDE1LDcgQEAKIAkgKi8KIAl4ZnNfZmlsZXN0cmVhbV91bm1vdW50KG1wKTsKIAotCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMSk7CiAKIAl4ZnNfdW5tb3VudGZzKG1wKTsKIAl4ZnNfZnJlZXNiKG1wKTsKQEAgLTE0NDMsNyArMTQzOSw3IEBACiAJICovCiAJeGZzX2ZpbGVzdHJlYW1fdW5tb3VudChtcCk7CiAKLQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCXhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOwogCiAJeGZzX3VubW91bnRmcyhtcCk7CiAJZ290byBvdXRfZnJlZV9zYjsKQEAgLTE2NzAsNyArMTY2Niw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyBYRlNfVkVSU0lPTl9TVFJJTkcgIiB3aXRoICIKIAkJCSBYRlNfQlVJTERfT1BUSU9OUyAiIGVuYWJsZWRcbiIpOwogCi0JeGZzX2lvZW5kX2luaXQoKTsKIAl4ZnNfZGlyX3N0YXJ0dXAoKTsKIAogCWVycm9yID0geGZzX2luaXRfem9uZXMoKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3luYy5jIGIvZnMveGZzL3hmc19zeW5jLmMKaW5kZXggNDYwNGY5MC4uYWEzZGMxYSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zeW5jLmMKKysrIGIvZnMveGZzL3hmc19zeW5jLmMKQEAgLTIyNywyMSArMjI3LDE3IEBACiAJaW50CQkJZXJyb3IgPSAwOwogCiAJaWYgKCFtYXBwaW5nX3RhZ2dlZChtYXBwaW5nLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKSkKLQkJZ290byBvdXRfd2FpdDsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfU0hBUkVEKSkgewogCQlpZiAoZmxhZ3MgJiBTWU5DX1RSWUxPQ0spCi0JCQlnb3RvIG91dF93YWl0OworCQkJcmV0dXJuIDA7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCX0KIAogCWVycm9yID0geGZzX2ZsdXNoX3BhZ2VzKGlwLCAwLCAtMSwgKGZsYWdzICYgU1lOQ19XQUlUKSA/CiAJCQkJMCA6IFhCRl9BU1lOQywgRklfTk9ORSk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKLQotIG91dF93YWl0OgotCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKLQkJeGZzX2lvZW5kX3dhaXQoaXApOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzIyLDYgKzMxOCw3IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXApCiB7CiAJc3RydWN0IHhmc19idWYJCSpicDsKKwlpbnQJCQllcnJvcjsKIAogCS8qCiAJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QgZ2V0IHN0dWNrCkBAIC0zMzQsOCArMzMxLDkgQEAKIAlicCA9IHhmc19nZXRzYihtcCwgMCk7CiAJaWYgKHhmc19idWZfaXNwaW5uZWQoYnApKQogCQl4ZnNfbG9nX2ZvcmNlKG1wLCAwKTsKLQotCXJldHVybiB4ZnNfYndyaXRlKG1wLCBicCk7CisJZXJyb3IgPSB4ZnNfYndyaXRlKGJwKTsKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCkBAIC0zNzksNyArMzc3LDcgQEAKIAogCS8qIGZsdXNoIGRhdGEtb25seSBkZXZpY2VzICovCiAJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwKQotCQlYRlNfYmZsdXNoKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwkJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3AsIDEpOwogCiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBlcnJvcjI7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYWNlLmggYi9mcy94ZnMveGZzX3RyYWNlLmgKaW5kZXggNjkwZmM3YS4uZjFkMjgwMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFjZS5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhY2UuaApAQCAtMzAsNiArMzAsNyBAQAogc3RydWN0IHhmc19kYV9hcmdzOwogc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5Owogc3RydWN0IHhmc19kcXVvdDsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW07CiBzdHJ1Y3QgeGxvZ190aWNrZXQ7CiBzdHJ1Y3QgbG9nOwogc3RydWN0IHhsb2dfcmVjb3ZlcjsKQEAgLTMyMCw3ICszMjEsNiBAQAogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2lvZG9uZSk7CiBERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfaW9yZXF1ZXN0KTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9iYXdyaXRlKTsKLURFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9iZHdyaXRlKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9sb2NrKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9sb2NrX2RvbmUpOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX3RyeWxvY2spOwpAQCAtNTc3LDYgKzU3Nyw3IEBACiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX2ZpbGVfaW9jdGwpOwogREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2NvbXBhdF9pb2N0bCk7CiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX2lvY3RsX3NldGF0dHIpOworREVGSU5FX0lOT0RFX0VWRU5UKHhmc19kaXJfZnN5bmMpOwogREVGSU5FX0lOT0RFX0VWRU5UKHhmc19maWxlX2ZzeW5jKTsKIERFRklORV9JTk9ERV9FVkVOVCh4ZnNfZGVzdHJveV9pbm9kZSk7CiBERUZJTkVfSU5PREVfRVZFTlQoeGZzX3dyaXRlX2lub2RlKTsKQEAgLTg1Myw2ICs4NTQsNDIgQEAKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3VuZ3JhbnRfZXhpdCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ191bmdyYW50X3N1Yik7CiAKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoeGZzX2xvZ19pdGVtX2NsYXNzLAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCksCisJVFBfQVJHUyhsaXApLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh2b2lkICosIGxpcCkKKwkJX19maWVsZCh1aW50LCB0eXBlKQorCQlfX2ZpZWxkKHVpbnQsIGZsYWdzKQorCQlfX2ZpZWxkKHhmc19sc25fdCwgbHNuKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldiA9IGxpcC0+bGlfbW91bnRwLT5tX3N1cGVyLT5zX2RldjsKKwkJX19lbnRyeS0+bGlwID0gbGlwOworCQlfX2VudHJ5LT50eXBlID0gbGlwLT5saV90eXBlOworCQlfX2VudHJ5LT5mbGFncyA9IGxpcC0+bGlfZmxhZ3M7CisJCV9fZW50cnktPmxzbiA9IGxpcC0+bGlfbHNuOworCSksCisJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgbGlwIDB4JXAgbHNuICVkLyVkIHR5cGUgJXMgZmxhZ3MgJXMiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bGlwLAorCQkgIENZQ0xFX0xTTihfX2VudHJ5LT5sc24pLCBCTE9DS19MU04oX19lbnRyeS0+bHNuKSwKKwkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPnR5cGUsIFhGU19MSV9UWVBFX0RFU0MpLAorCQkgIF9fcHJpbnRfZmxhZ3MoX19lbnRyeS0+ZmxhZ3MsICJ8IiwgWEZTX0xJX0ZMQUdTKSkKKykKKworI2RlZmluZSBERUZJTkVfTE9HX0lURU1fRVZFTlQobmFtZSkgXAorREVGSU5FX0VWRU5UKHhmc19sb2dfaXRlbV9jbGFzcywgbmFtZSwgXAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCksIFwKKwlUUF9BUkdTKGxpcCkpCitERUZJTkVfTE9HX0lURU1fRVZFTlQoeGZzX2FpbF9wdXNoKTsKK0RFRklORV9MT0dfSVRFTV9FVkVOVCh4ZnNfYWlsX3B1c2hidWYpOworREVGSU5FX0xPR19JVEVNX0VWRU5UKHhmc19haWxfcHVzaGJ1Zl9waW5uZWQpOworREVGSU5FX0xPR19JVEVNX0VWRU5UKHhmc19haWxfcGlubmVkKTsKK0RFRklORV9MT0dfSVRFTV9FVkVOVCh4ZnNfYWlsX2xvY2tlZCk7CisKKwogREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfZmlsZV9jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgZmxhZ3MpLAogCVRQX0FSR1MoaXAsIGNvdW50LCBvZmZzZXQsIGZsYWdzKSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCBlZmMxNDdmLi4xZjM1YjJmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0xNzkwLDkgKzE3OTAsNyBAQAogfQogCiAvKgotICogeGZzX3RyYW5zX2NvbW1pdAotICoKLSAqIENvbW1pdCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gdG8gdGhlIGxvZyBhL3N5bmNocm9ub3VzbHkuCisgKiBDb21taXQgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuCiAgKgogICogWEZTIGRpc2sgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtIGlzIG5vdCBiYXNlZCBvbiBhIHR5cGljYWwKICAqIHRyYW5zYWN0aW9uIGFib3J0IG1lY2hhbmlzbS4gTG9naWNhbGx5IGFmdGVyIHRoZSBmaWxlc3lzdGVtCkBAIC0xODA0LDEwICsxODAyLDkgQEAKICAqIERvIG5vdCByZWZlcmVuY2UgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBhZnRlciB0aGlzIGNhbGwuCiAgKi8KIGludAotX3hmc190cmFuc19jb21taXQoCit4ZnNfdHJhbnNfY29tbWl0KAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAotCXVpbnQJCQlmbGFncywKLQlpbnQJCQkqbG9nX2ZsdXNoZWQpCisJdWludAkJCWZsYWdzKQogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gdHAtPnRfbW91bnRwOwogCXhmc19sc25fdAkJY29tbWl0X2xzbiA9IC0xOwpAQCAtMTg2Niw3ICsxODYzLDcgQEAKIAlpZiAoc3luYykgewogCQlpZiAoIWVycm9yKSB7CiAJCQllcnJvciA9IF94ZnNfbG9nX2ZvcmNlX2xzbihtcCwgY29tbWl0X2xzbiwKLQkJCQkgICAgICBYRlNfTE9HX1NZTkMsIGxvZ19mbHVzaGVkKTsKKwkJCQkgICAgICBYRlNfTE9HX1NZTkMsIE5VTEwpOwogCQl9CiAJCVhGU19TVEFUU19JTkMoeHNfdHJhbnNfc3luYyk7CiAJfSBlbHNlIHsKQEAgLTIwMjEsNiArMjAxOCw2IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHJhbnMsIGRwLCAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCA1MzU5N2Y0Li4zYWU3MTNjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJCQkJCSBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwogCQkJCQkJCS8qIGJ1ZmZlciBpdGVtIGlvZG9uZSAqLwogCQkJCQkJCS8qIGNhbGxiYWNrIGZ1bmMgKi8KLQlzdHJ1Y3QgeGZzX2l0ZW1fb3BzCQkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCisJY29uc3Qgc3RydWN0IHhmc19pdGVtX29wcwkqbGlfb3BzOwkvKiBmdW5jdGlvbiBsaXN0ICovCiAKIAkvKiBkZWxheWVkIGxvZ2dpbmcgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaV9jaWw7CQkvKiBDSUwgcG9pbnRlcnMgKi8KQEAgLTM0MSw3ICszNDEsNyBAQAogCXsgWEZTX0xJX0lOX0FJTCwJIklOX0FJTCIgfSwgXAogCXsgWEZTX0xJX0FCT1JURUQsCSJBQk9SVEVEIiB9CiAKLXR5cGVkZWYgc3RydWN0IHhmc19pdGVtX29wcyB7CitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHsKIAl1aW50ICgqaW9wX3NpemUpKHhmc19sb2dfaXRlbV90ICopOwogCXZvaWQgKCppb3BfZm9ybWF0KSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyAqKTsKIAl2b2lkICgqaW9wX3BpbikoeGZzX2xvZ19pdGVtX3QgKik7CkBAIC0zNTIsNyArMzUyLDcgQEAKIAl2b2lkICgqaW9wX3B1c2gpKHhmc19sb2dfaXRlbV90ICopOwogCWJvb2wgKCppb3BfcHVzaGJ1ZikoeGZzX2xvZ19pdGVtX3QgKik7CiAJdm9pZCAoKmlvcF9jb21taXR0aW5nKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfbHNuX3QpOwotfSB4ZnNfaXRlbV9vcHNfdDsKK307CiAKICNkZWZpbmUgSU9QX1NJWkUoaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3NpemUpKGlwKQogI2RlZmluZSBJT1BfRk9STUFUKGlwLHZwKQkoKihpcCktPmxpX29wcy0+aW9wX2Zvcm1hdCkoaXAsIHZwKQpAQCAtNDcwLDggKzQ3MCw3IEBACiB2b2lkCQl4ZnNfdHJhbnNfZHF1b3RfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICosIHVpbnQpOwogdm9pZAkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJCXhmc190cmFuc19pY2hndGltZShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgaW50KTsKLXZvaWQJCXhmc190cmFuc19pam9pbl9yZWYoc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX2lub2RlICosIHVpbnQpOwotdm9pZAkJeGZzX3RyYW5zX2lqb2luKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqKTsKK3ZvaWQJCXhmc190cmFuc19pam9pbihzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CiB2b2lkCQl4ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50LCB1aW50KTsKIHZvaWQJCXhmc190cmFuc19sb2dfaW5vZGUoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZ2V0X2VmaSh4ZnNfdHJhbnNfdCAqLCB1aW50KTsKQEAgLTQ4NywxMCArNDg2LDcgQEAKIAkJCQkJIHN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICosCiAJCQkJCSB4ZnNfZnNibG9ja190LAogCQkJCQkgeGZzX2V4dGxlbl90KTsKLWludAkJX3hmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwKLQkJCQkgIHVpbnQgZmxhZ3MsCi0JCQkJICBpbnQgKik7Ci0jZGVmaW5lIHhmc190cmFuc19jb21taXQodHAsIGZsYWdzKQlfeGZzX3RyYW5zX2NvbW1pdCh0cCwgZmxhZ3MsIE5VTEwpCitpbnQJCXhmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwgdWludCBmbGFncyk7CiB2b2lkCQl4ZnNfdHJhbnNfY2FuY2VsKHhmc190cmFuc190ICosIGludCk7CiBpbnQJCXhmc190cmFuc19haWxfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwogdm9pZAkJeGZzX3RyYW5zX2FpbF9kZXN0cm95KHN0cnVjdCB4ZnNfbW91bnQgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jIGIvZnMveGZzL3hmc190cmFuc19haWwuYwppbmRleCAzYTFlN2NhNS4uZWQ5MjUyYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAieGZzX2FnLmgiCiAjaW5jbHVkZSAieGZzX21vdW50LmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAogI2lmZGVmIERFQlVHCkBAIC0zNjQsMTIgKzM2NSwyNCBAQAogCXhmc19sc25fdAkJbHNuOwogCXhmc19sc25fdAkJdGFyZ2V0OwogCWxvbmcJCQl0b3V0ID0gMTA7Ci0JaW50CQkJZmx1c2hfbG9nID0gMDsKIAlpbnQJCQlzdHVjayA9IDA7CiAJaW50CQkJY291bnQgPSAwOwogCWludAkJCXB1c2hfeGZzYnVmZCA9IDA7CiAKKwkvKgorCSAqIElmIGxhc3QgdGltZSB3ZSByYW4gd2UgZW5jb3VudGVyZWQgcGlubmVkIGl0ZW1zLCBmb3JjZSB0aGUgbG9nIGZpcnN0CisJICogYW5kIHdhaXQgZm9yIGl0IGJlZm9yZSBwdXNoaW5nIGFnYWluLgorCSAqLwogCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJaWYgKGFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9PSAwICYmIGFpbHAtPnhhX2xvZ19mbHVzaCAmJgorCSAgICAhbGlzdF9lbXB0eSgmYWlscC0+eGFfYWlsKSkgeworCQlhaWxwLT54YV9sb2dfZmx1c2ggPSAwOworCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfZmx1c2gpOworCQl4ZnNfbG9nX2ZvcmNlKG1wLCBYRlNfTE9HX1NZTkMpOworCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCX0KKwogCXRhcmdldCA9IGFpbHAtPnhhX3RhcmdldDsKIAlsaXAgPSB4ZnNfdHJhbnNfYWlsX2N1cnNvcl9maXJzdChhaWxwLCAmY3VyLCBhaWxwLT54YV9sYXN0X3B1c2hlZF9sc24pOwogCWlmICghbGlwIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CkBAIC00MTMsMTYgKzQyNiwyMCBAQAogCQlzd2l0Y2ggKGxvY2tfcmVzdWx0KSB7CiAJCWNhc2UgWEZTX0lURU1fU1VDQ0VTUzoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfc3VjY2Vzcyk7CisJCQl0cmFjZV94ZnNfYWlsX3B1c2gobGlwKTsKKwogCQkJSU9QX1BVU0gobGlwKTsKIAkJCWFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9IGxzbjsKIAkJCWJyZWFrOwogCiAJCWNhc2UgWEZTX0lURU1fUFVTSEJVRjoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcHVzaGJ1Zik7CisJCQl0cmFjZV94ZnNfYWlsX3B1c2hidWYobGlwKTsKIAogCQkJaWYgKCFJT1BfUFVTSEJVRihsaXApKSB7CisJCQkJdHJhY2VfeGZzX2FpbF9wdXNoYnVmX3Bpbm5lZChsaXApOwogCQkJCXN0dWNrKys7Ci0JCQkJZmx1c2hfbG9nID0gMTsKKwkJCQlhaWxwLT54YV9sb2dfZmx1c2grKzsKIAkJCX0gZWxzZSB7CiAJCQkJYWlscC0+eGFfbGFzdF9wdXNoZWRfbHNuID0gbHNuOwogCQkJfQpAQCAtNDMxLDEyICs0NDgsMTUgQEAKIAogCQljYXNlIFhGU19JVEVNX1BJTk5FRDoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcGlubmVkKTsKKwkJCXRyYWNlX3hmc19haWxfcGlubmVkKGxpcCk7CisKIAkJCXN0dWNrKys7Ci0JCQlmbHVzaF9sb2cgPSAxOworCQkJYWlscC0+eGFfbG9nX2ZsdXNoKys7CiAJCQlicmVhazsKIAogCQljYXNlIFhGU19JVEVNX0xPQ0tFRDoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfbG9ja2VkKTsKKwkJCXRyYWNlX3hmc19haWxfbG9ja2VkKGxpcCk7CiAJCQlzdHVjaysrOwogCQkJYnJlYWs7CiAKQEAgLTQ3NiwxNiArNDk2LDYgQEAKIAl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9kb25lKGFpbHAsICZjdXIpOwogCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAotCWlmIChmbHVzaF9sb2cpIHsKLQkJLyoKLQkJICogSWYgc29tZXRoaW5nIHdlIG5lZWQgdG8gcHVzaCBvdXQgd2FzIHBpbm5lZCwgdGhlbgotCQkgKiBwdXNoIG91dCB0aGUgbG9nIHNvIGl0IHdpbGwgYmVjb21lIHVucGlubmVkIGFuZAotCQkgKiBtb3ZlIGZvcndhcmQgaW4gdGhlIEFJTC4KLQkJICovCi0JCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfZmx1c2gpOwotCQl4ZnNfbG9nX2ZvcmNlKG1wLCAwKTsKLQl9Ci0KIAlpZiAocHVzaF94ZnNidWZkKSB7CiAJCS8qIHdlJ3ZlIGdvdCBkZWxheWVkIHdyaXRlIGJ1ZmZlcnMgdG8gZmx1c2ggKi8KIAkJd2FrZV91cF9wcm9jZXNzKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X3Rhc2spOwpAQCAtNDk2LDYgKzUwNiw3IEBACiAJaWYgKCFjb3VudCkgewogCQkvKiBXZSdyZSBwYXN0IG91ciB0YXJnZXQgb3IgZW1wdHksIHNvIGlkbGUgKi8KIAkJYWlscC0+eGFfbGFzdF9wdXNoZWRfbHNuID0gMDsKKwkJYWlscC0+eGFfbG9nX2ZsdXNoID0gMDsKIAogCQl0b3V0ID0gNTA7CiAJfSBlbHNlIGlmIChYRlNfTFNOX0NNUChsc24sIHRhcmdldCkgPj0gMCkgewpAQCAtNTE0LDkgKzUyNSwxMyBAQAogCQkgKiB3ZXJlIHN0dWNrLgogCQkgKgogCQkgKiBCYWNrb2ZmIGEgYml0IG1vcmUgdG8gYWxsb3cgc29tZSBJL08gdG8gY29tcGxldGUgYmVmb3JlCi0JCSAqIGNvbnRpbnVpbmcgZnJvbSB3aGVyZSB3ZSB3ZXJlLgorCQkgKiByZXN0YXJ0aW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBBSUwuIFRoaXMgcHJldmVudHMgdXMKKwkJICogZnJvbSBzcGlubmluZyBvbiB0aGUgc2FtZSBpdGVtcywgYW5kIGlmIHRoZXkgYXJlIHBpbm5lZCB3aWxsCisJCSAqIGFsbCB0aGUgcmVzdGFydCB0byBpc3N1ZSBhIGxvZyBmb3JjZSB0byB1bnBpbiB0aGUgc3R1Y2sKKwkJICogaXRlbXMuCiAJCSAqLwogCQl0b3V0ID0gMjA7CisJCWFpbHAtPnhhX2xhc3RfcHVzaGVkX2xzbiA9IDA7CiAJfQogCiAJcmV0dXJuIHRvdXQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jIGIvZnMveGZzL3hmc190cmFuc19idWYuYwppbmRleCAxMzdlMmI5Li40NzVhNGRlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKQEAgLTE2MCw4ICsxNjAsMTAgQEAKIAlicCA9IHhmc190cmFuc19idWZfaXRlbV9tYXRjaCh0cCwgdGFyZ2V0X2RldiwgYmxrbm8sIGxlbik7CiAJaWYgKGJwICE9IE5VTEwpIHsKIAkJQVNTRVJUKHhmc19idWZfaXNsb2NrZWQoYnApKTsKLQkJaWYgKFhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKLQkJCVhGU19CVUZfU1VQRVJfU1RBTEUoYnApOworCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTih0cC0+dF9tb3VudHApKSB7CisJCQl4ZnNfYnVmX3N0YWxlKGJwKTsKKwkJCVhGU19CVUZfRE9ORShicCk7CisJCX0KIAogCQkvKgogCQkgKiBJZiB0aGUgYnVmZmVyIGlzIHN0YWxlIHRoZW4gaXQgd2FzIGJpbnZhbCdlZApAQCAtMjk0LDggKzI5Niw3IEBACiAKIAkJaWYgKGJwLT5iX2Vycm9yKSB7CiAJCQllcnJvciA9IGJwLT5iX2Vycm9yOwotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc190cmFuc19yZWFkX2J1ZiIsIG1wLAotCQkJCQkgIGJwLCBibGtubyk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJCXhmc19idWZfcmVsc2UoYnApOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC0zMzcsOCArMzM4LDcgQEAKIAkJCXhmc2Jkc3RyYXQodHAtPnRfbW91bnRwLCBicCk7CiAJCQllcnJvciA9IHhmc19idWZfaW93YWl0KGJwKTsKIAkJCWlmIChlcnJvcikgewotCQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdHJhbnNfcmVhZF9idWYiLCBtcCwKLQkJCQkJCSAgYnAsIGJsa25vKTsKKwkJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCQkvKgogCQkJCSAqIFdlIGNhbiBncmFjZWZ1bGx5IHJlY292ZXIgZnJvbSBtb3N0IHJlYWQKQEAgLTM4Nyw5ICszODcsOSBAQAogCX0KIAlpZiAoYnAtPmJfZXJyb3IpIHsKIAkJZXJyb3IgPSBicC0+Yl9lcnJvcjsKLQkJWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdHJhbnNfcmVhZF9idWYiLCBtcCwKLQkJCQkgIGJwLCBibGtubyk7CisJCXhmc19idWZfc3RhbGUoYnApOworCQlYRlNfQlVGX0RPTkUoYnApOworCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsIF9fZnVuY19fKTsKIAkJaWYgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKQogCQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgU0hVVERPV05fTUVUQV9JT19FUlJPUik7CiAJCXhmc19idWZfcmVsc2UoYnApOwpAQCAtNjQzLDEzICs2NDMsMTQgQEAKIAkgKiBpbnNpZGUgdGhlIGJfYmRzdHJhdCBjYWxsYmFjayBzbyB0aGF0IHRoaXMgd29uJ3QgZ2V0IHdyaXR0ZW4gdG8KIAkgKiBkaXNrLgogCSAqLwotCVhGU19CVUZfREVMQVlXUklURShicCk7CiAJWEZTX0JVRl9ET05FKGJwKTsKIAogCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CiAJYnAtPmJfaW9kb25lID0geGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzOwogCWJpcC0+YmxpX2l0ZW0ubGlfY2IgPSB4ZnNfYnVmX2lvZG9uZTsKIAorCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwKTsKKwogCXRyYWNlX3hmc190cmFuc19sb2dfYnVmKGJpcCk7CiAKIAkvKgpAQCAtNzM4LDggKzczOSw3IEBACiAJICogV2Ugc2V0IHRoZSBzdGFsZSBiaXQgaW4gdGhlIGJ1ZmZlciBhcyB3ZWxsIHNpbmNlIHdlJ3JlIGdldHRpbmcKIAkgKiByaWQgb2YgaXQuCiAJICovCi0JWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOwotCVhGU19CVUZfU1RBTEUoYnApOworCXhmc19idWZfc3RhbGUoYnApOwogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfU1RBTEU7CiAJYmlwLT5ibGlfZmxhZ3MgJj0gfihYRlNfQkxJX0lOT0RFX0JVRiB8IFhGU19CTElfTE9HR0VEIHwgWEZTX0JMSV9ESVJUWSk7CiAJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmPSB+WEZTX0JMRl9JTk9ERV9CVUY7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKaW5kZXggYzhkZWEyZmQuLjMyZjAyODggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2lub2RlLmMKQEAgLTQ3LDExICs0NywxMyBAQAogICogQWRkIGEgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KICAqCiAgKiBUaGUgaW5vZGUgbXVzdCBiZSBsb2NrZWQsIGFuZCBpdCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSB0cmFuc2FjdGlvbi4KKyAqIElmIGxvY2tfZmxhZ3MgaXMgbm9uLXplcm8gdGhlIGlub2RlIHdpbGwgYmUgdW5sb2NrZWQgb24gdHJhbnNhY3Rpb24gY29tbWl0LgogICovCiB2b2lkCiB4ZnNfdHJhbnNfaWpvaW4oCiAJc3RydWN0IHhmc190cmFucwkqdHAsCi0Jc3RydWN0IHhmc19pbm9kZQkqaXApCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJdWludAkJCWxvY2tfZmxhZ3MpCiB7CiAJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKIApAQCAtNTksNyArNjEsOSBAQAogCWlmIChpcC0+aV9pdGVtcCA9PSBOVUxMKQogCQl4ZnNfaW5vZGVfaXRlbV9pbml0KGlwLCBpcC0+aV9tb3VudCk7CiAJaWlwID0gaXAtPmlfaXRlbXA7CisKIAlBU1NFUlQoaWlwLT5pbGlfbG9ja19mbGFncyA9PSAwKTsKKwlpaXAtPmlsaV9sb2NrX2ZsYWdzID0gbG9ja19mbGFnczsKIAogCS8qCiAJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCkBAIC03MCwyNSArNzQsNiBAQAogfQogCiAvKgotICogQWRkIGEgbG9ja2VkIGlub2RlIHRvIHRoZSB0cmFuc2FjdGlvbi4KLSAqCi0gKgotICogR3JhYnMgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHdoaWNoIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoZSB0cmFuc2FjdGlvbgotICogaXMgY29tbWl0dGVkLiAgVGhlIGlub2RlIHdpbGwgYWxzbyBiZSB1bmxvY2tlZCBhdCB0aGF0IHBvaW50LiAgVGhlIGlub2RlCi0gKiBtdXN0IGJlIGxvY2tlZCwgYW5kIGl0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHRyYW5zYWN0aW9uLgotICovCi12b2lkCi14ZnNfdHJhbnNfaWpvaW5fcmVmKAotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXVpbnQJCQlsb2NrX2ZsYWdzKQotewotCXhmc190cmFuc19pam9pbih0cCwgaXApOwotCUlIT0xEKGlwKTsKLQlpcC0+aV9pdGVtcC0+aWxpX2xvY2tfZmxhZ3MgPSBsb2NrX2ZsYWdzOwotfQotCi0vKgogICogVHJhbnNhY3Rpb25hbCBpbm9kZSB0aW1lc3RhbXAgdXBkYXRlLiBSZXF1aXJlcyB0aGUgaW5vZGUgdG8gYmUgbG9ja2VkIGFuZAogICogam9pbmVkIHRvIHRoZSB0cmFuc2FjdGlvbiBzdXBwbGllZC4gUmVsaWVzIG9uIHRoZSB0cmFuc2FjdGlvbiBzdWJzeXN0ZW0gdG8KICAqIHRyYWNrIGRpcnR5IHN0YXRlIGFuZCB1cGRhdGUvd3JpdGViYWNrIHRoZSBpbm9kZSBhY2NvcmRpbmdseS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKaW5kZXggMjI3NTBiNS4uNDQ4MjBiOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19wcml2LmgKKysrIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKQEAgLTcwLDYgKzcwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXhhX2N1cnNvcnM7CiAJc3BpbmxvY2tfdAkJeGFfbG9jazsKIAl4ZnNfbHNuX3QJCXhhX2xhc3RfcHVzaGVkX2xzbjsKKwlpbnQJCQl4YV9sb2dfZmx1c2g7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc192bm9kZW9wcy5jIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCmluZGV4IDUxZmM0MjkuLmNlOTI2OGEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYworKysgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKQEAgLTcyLDggKzcyLDggQEAKIAl4ZnNfYnVmX3QJKmJwOwogCWludAkJZXJyb3IgPSAwOwogCi0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbiksIDAsIE5VTEwsIDAsCi0JCQltdmFsLCAmbm1hcHMsIE5VTEwpOworCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIDAsIFhGU19CX1RPX0ZTQihtcCwgcGF0aGxlbiksIG12YWwsICZubWFwcywKKwkJCSAgICAgICAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC04Nyw4ICs4Nyw3IEBACiAJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT01FTSk7CiAJCWVycm9yID0gYnAtPmJfZXJyb3I7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc19yZWFkbGluayIsCi0JCQkJICBpcC0+aV9tb3VudCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQkJeGZzX2J1Zl9pb2Vycm9yX2FsZXJ0KGJwLCBfX2Z1bmNfXyk7CiAJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMTMsNyArMTEyLDcgQEAKIAljaGFyCQkqbGluaykKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQlpbnQJCXBhdGhsZW47CisJeGZzX2ZzaXplX3QJcGF0aGxlbjsKIAlpbnQJCWVycm9yID0gMDsKIAogCXRyYWNlX3hmc19yZWFkbGluayhpcCk7CkBAIC0xMjMsMTMgKzEyMiwxOSBAQAogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIAotCUFTU0VSVChTX0lTTE5LKGlwLT5pX2QuZGlfbW9kZSkpOwotCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPD0gTUFYUEFUSExFTik7Ci0KIAlwYXRobGVuID0gaXAtPmlfZC5kaV9zaXplOwogCWlmICghcGF0aGxlbikKIAkJZ290byBvdXQ7CiAKKwlpZiAocGF0aGxlbiA8IDAgfHwgcGF0aGxlbiA+IE1BWFBBVEhMRU4pIHsKKwkJeGZzX2FsZXJ0KG1wLCAiJXM6IGlub2RlICglbGx1KSBiYWQgc3ltbGluayBsZW5ndGggKCVsbGQpIiwKKwkJCSBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLAorCQkJIChsb25nIGxvbmcpIHBhdGhsZW4pOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwogCWlmIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSkgewogCQltZW1jcHkobGluaywgaXAtPmlfZGYuaWZfdTEuaWZfZGF0YSwgcGF0aGxlbik7CiAJCWxpbmtbcGF0aGxlbl0gPSAnXDAnOwpAQCAtMTc4LDggKzE4Myw3IEBACiAKIAluaW1hcHMgPSAxOwogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0JZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZF9mc2IsIG1hcF9sZW4sIDAsCi0JCQkgIE5VTEwsIDAsICZpbWFwLCAmbmltYXBzLCBOVUxMKTsKKwllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBlbmRfZnNiLCBtYXBfbGVuLCAmaW1hcCwgJm5pbWFwcywgMCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCiAJaWYgKCFlcnJvciAmJiAobmltYXBzICE9IDApICYmCkBAIC0yMjAsNyArMjI0LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgaXAtPmlfc2l6ZSk7CiAJCWlmIChlcnJvcikgewpAQCAtMjg5LDcgKzI5Myw3IEBACiAJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CiAJc2l6ZSA9IChpbnQpaXAtPmlfZC5kaV9zaXplOwogCWlwLT5pX2QuZGlfc2l6ZSA9IDA7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCS8qCiAJICogRmluZCB0aGUgYmxvY2socykgc28gd2UgY2FuIGludmFsIGFuZCB1bm1hcCB0aGVtLgpAQCAtMjk3LDkgKzMwMSw5IEBACiAJZG9uZSA9IDA7CiAJeGZzX2JtYXBfaW5pdCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOwogCW5tYXBzID0gQVJSQVlfU0laRShtdmFsKTsKLQlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBzaXplKSwKLQkJCVhGU19CTUFQSV9NRVRBREFUQSwgJmZpcnN0X2Jsb2NrLCAwLCBtdmFsLCAmbm1hcHMsCi0JCQkmZnJlZV9saXN0KSkpCisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBzaXplKSwKKwkJCQltdmFsLCAmbm1hcHMsIDApOworCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjA7CiAJLyoKIAkgKiBJbnZhbGlkYXRlIHRoZSBibG9jayhzKS4KQEAgLTMwOCw2ICszMTIsMTAgQEAKIAkJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwKIAkJCVhGU19GU0JfVE9fREFERFIobXAsIG12YWxbaV0uYnJfc3RhcnRibG9jayksCiAJCQlYRlNfRlNCX1RPX0JCKG1wLCBtdmFsW2ldLmJyX2Jsb2NrY291bnQpLCAwKTsKKwkJaWYgKCFicCkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIGVycm9yMTsKKwkJfQogCQl4ZnNfdHJhbnNfYmludmFsKHRwLCBicCk7CiAJfQogCS8qCkBAIC0zMzMsNyArMzQxLDcgQEAKIAkgKiBNYXJrIGl0IGRpcnR5IHNvIGl0IHdpbGwgYmUgbG9nZ2VkIGFuZCBtb3ZlZCBmb3J3YXJkIGluIHRoZSBsb2cgYXMKIAkgKiBwYXJ0IG9mIGV2ZXJ5IGNvbW1pdC4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJLyoKIAkgKiBHZXQgYSBuZXcsIGVtcHR5IHRyYW5zYWN0aW9uIHRvIHJldHVybiB0byBvdXIgY2FsbGVyLgpAQCAtNDY2LDcgKzQ3NCw3IEBACiAJCWdvdG8gZXJyb3JfY2FuY2VsOwogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOwogCiAJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOwpAQCAtNjQ3LDggKzY1NSw2IEBACiAJaWYgKHRydW5jYXRlKSB7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAotCQl4ZnNfaW9lbmRfd2FpdChpcCk7Ci0KIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKIAkJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLAogCQkJCQkgIDAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCkBAIC02NjIsNyArNjY4LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2RhdGEoJnRwLCBpcCwgMCk7CiAJCWlmIChlcnJvcikgewpAQCAtNjg2LDcgKzY5Miw3IEBACiAJCQlyZXR1cm4gVk5fSU5BQ1RJVkVfQ0FDSEU7CiAJCX0KIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKIAkJCQkJICBYRlNfSUZSRUVfTE9HX1JFUyhtcCksCkBAIC02OTksNyArNzA1LDcgQEAKIAkJfQogCiAJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOwotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAJfQogCiAJLyoKQEAgLTkzOSw3ICs5NDUsNyBAQAogCSAqIHRoZSB0cmFuc2FjdGlvbiBjYW5jZWwgdW5sb2NraW5nIGRwIHNvIGRvbid0IGRvIGl0IGV4cGxpY2l0bHkgaW4gdGhlCiAJICogZXJyb3IgcGF0aC4KIAkgKi8KLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKIAl1bmxvY2tfZHBfb25fZXJyb3IgPSBCX0ZBTFNFOwogCiAJZXJyb3IgPSB4ZnNfZGlyX2NyZWF0ZW5hbWUodHAsIGRwLCBuYW1lLCBpcC0+aV9pbm8sCkBAIC0xMjYwLDggKzEyNjYsOCBAQAogCiAJeGZzX2xvY2tfdHdvX2lub2RlcyhkcCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2lqb2luX3JlZih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJLyoKIAkgKiBJZiB3ZSdyZSByZW1vdmluZyBhIGRpcmVjdG9yeSBwZXJmb3JtIHNvbWUgYWRkaXRpb25hbCB2YWxpZGF0aW9uLgpAQCAtMTQwNiw4ICsxNDEyLDggQEAKIAogCXhmc19sb2NrX3R3b19pbm9kZXMoc2lwLCB0ZHAsIFhGU19JTE9DS19FWENMKTsKIAotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHNpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIHRkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgc2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCB0ZHAsIFhGU19JTE9DS19FWENMKTsKIAogCS8qCiAJICogSWYgdGhlIHNvdXJjZSBoYXMgdG9vIG1hbnkgbGlua3MsIHdlIGNhbid0IG1ha2UgYW55IG1vcmUgdG8gaXQuCkBAIC0xNjAxLDcgKzE2MDcsNyBAQAogCSAqIHRyYW5zYWN0aW9uIGNhbmNlbCB1bmxvY2tpbmcgZHAgc28gZG9uJ3QgZG8gaXQgZXhwbGljaXRseSBpbiB0aGUKIAkgKiBlcnJvciBwYXRoLgogCSAqLwotCXhmc190cmFuc19pam9pbl9yZWYodHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOwogCXVubG9ja19kcF9vbl9lcnJvciA9IEJfRkFMU0U7CiAKIAkvKgpAQCAtMTYzMiwxMCArMTYzOCw5IEBACiAJCWZpcnN0X2ZzYiA9IDA7CiAJCW5tYXBzID0gU1lNTElOS19NQVBTOwogCi0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgZmlyc3RfZnNiLCBmc19ibG9ja3MsCi0JCQkJICBYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsCi0JCQkJICAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsIG12YWwsICZubWFwcywKLQkJCQkgICZmcmVlX2xpc3QpOworCQllcnJvciA9IHhmc19ibWFwaV93cml0ZSh0cCwgaXAsIGZpcnN0X2ZzYiwgZnNfYmxvY2tzLAorCQkJCSAgWEZTX0JNQVBJX01FVEFEQVRBLCAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsCisJCQkJICBtdmFsLCAmbm1hcHMsICZmcmVlX2xpc3QpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMjsKIApAQCAtMTY1MCw3ICsxNjU1LDEwIEBACiAJCQlieXRlX2NudCA9IFhGU19GU0JfVE9fQihtcCwgbXZhbFtuXS5icl9ibG9ja2NvdW50KTsKIAkJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCiAJCQkJCSAgICAgICBCVE9CQihieXRlX2NudCksIDApOwotCQkJQVNTRVJUKCF4ZnNfYnVmX2dldGVycm9yKGJwKSk7CisJCQlpZiAoIWJwKSB7CisJCQkJZXJyb3IgPSBFTk9NRU07CisJCQkJZ290byBlcnJvcjI7CisJCQl9CiAJCQlpZiAocGF0aGxlbiA8IGJ5dGVfY250KSB7CiAJCQkJYnl0ZV9jbnQgPSBwYXRobGVuOwogCQkJfQpAQCAtMTczMiw3ICsxNzQwLDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW5fcmVmKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAogCWlwLT5pX2QuZGlfZG1ldm1hc2sgPSBldm1hc2s7CiAJaXAtPmlfZC5kaV9kbXN0YXRlICA9IHN0YXRlOwpAQCAtMTc3OCw3ICsxNzg2LDYgQEAKIAl4ZnNfZmlsZW9mZl90CQlzdGFydG9mZnNldF9mc2I7CiAJeGZzX2ZzYmxvY2tfdAkJZmlyc3Rmc2I7CiAJaW50CQkJbmltYXBzOwotCWludAkJCWJtYXBpX2ZsYWc7CiAJaW50CQkJcXVvdGFfZmxhZzsKIAlpbnQJCQlydDsKIAl4ZnNfdHJhbnNfdAkJKnRwOwpAQCAtMTgwNiw3ICsxODEzLDYgQEAKIAljb3VudCA9IGxlbjsKIAlpbWFwcCA9ICZpbWFwc1swXTsKIAluaW1hcHMgPSAxOwotCWJtYXBpX2ZsYWcgPSBYRlNfQk1BUElfV1JJVEUgfCBhbGxvY190eXBlOwogCXN0YXJ0b2Zmc2V0X2ZzYgk9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CiAJYWxsb2NhdGVzaXplX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgY291bnQpOwogCkBAIC0xODc3LDE2ICsxODgzLDEyIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IxOwogCi0JCXhmc190cmFuc19pam9pbih0cCwgaXApOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKIAotCQkvKgotCQkgKiBJc3N1ZSB0aGUgeGZzX2JtYXBpKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzCi0JCSAqLwogCQl4ZnNfYm1hcF9pbml0KCZmcmVlX2xpc3QsICZmaXJzdGZzYik7Ci0JCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAotCQkJCSAgYWxsb2NhdGVzaXplX2ZzYiwgYm1hcGlfZmxhZywKLQkJCQkgICZmaXJzdGZzYiwgMCwgaW1hcHAsICZuaW1hcHMsCi0JCQkJICAmZnJlZV9saXN0KTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGlfd3JpdGUodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCisJCQkJCWFsbG9jYXRlc2l6ZV9mc2IsIGFsbG9jX3R5cGUsICZmaXJzdGZzYiwKKwkJCQkJMCwgaW1hcHAsICZuaW1hcHMsICZmcmVlX2xpc3QpOwogCQlpZiAoZXJyb3IpIHsKIAkJCWdvdG8gZXJyb3IwOwogCQl9CkBAIC0xOTc2LDggKzE5NzgsNyBAQAogCWZvciAob2Zmc2V0ID0gc3RhcnRvZmY7IG9mZnNldCA8PSBlbmRvZmY7IG9mZnNldCA9IGxhc3RvZmZzZXQgKyAxKSB7CiAJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCQluaW1hcCA9IDE7Ci0JCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLCAxLCAwLAotCQkJTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIG9mZnNldF9mc2IsIDEsICZpbWFwLCAmbmltYXAsIDApOwogCQlpZiAoZXJyb3IgfHwgbmltYXAgPCAxKQogCQkJYnJlYWs7CiAJCUFTU0VSVChpbWFwLmJyX2Jsb2NrY291bnQgPj0gMSk7CkBAIC0xOTk3LDggKzE5OTgsOCBAQAogCQl4ZnNiZHN0cmF0KG1wLCBicCk7CiAJCWVycm9yID0geGZzX2J1Zl9pb3dhaXQoYnApOwogCQlpZiAoZXJyb3IpIHsKLQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMocmVhZCkiLAotCQkJCQkgIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsCisJCQkJCSJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMocmVhZCkiKTsKIAkJCWJyZWFrOwogCQl9CiAJCW1lbXNldChicC0+Yl9hZGRyICsKQEAgLTIwMTAsOCArMjAxMSw4IEBACiAJCXhmc2Jkc3RyYXQobXAsIGJwKTsKIAkJZXJyb3IgPSB4ZnNfYnVmX2lvd2FpdChicCk7CiAJCWlmIChlcnJvcikgewotCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc196ZXJvX3JlbWFpbmluZ19ieXRlcyh3cml0ZSkiLAotCQkJCQkgIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQl4ZnNfYnVmX2lvZXJyb3JfYWxlcnQoYnAsCisJCQkJCSJ4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMod3JpdGUpIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIwNzYsNyArMjA3Nyw3IEBACiAJaWYgKG5lZWRfaW9sb2NrKSB7CiAJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAkJLyogd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW55IHBlbmRpbmcgRElPcyAqLwotCQl4ZnNfaW9lbmRfd2FpdChpcCk7CisJCWlub2RlX2Rpb193YWl0KFZGU19JKGlwKSk7CiAJfQogCiAJcm91bmRpbmcgPSBtYXhfdCh1aW50LCAxIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nLCBQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtMjA5Niw4ICsyMDk3LDggQEAKIAkgKi8KIAlpZiAocnQgJiYgIXhmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCgmbXAtPm1fc2IpKSB7CiAJCW5pbWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKLQkJCTEsIDAsIE5VTEwsIDAsICZpbWFwLCAmbmltYXAsIE5VTEwpOworCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBzdGFydG9mZnNldF9mc2IsIDEsCisJCQkJCSZpbWFwLCAmbmltYXAsIDApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2tfaW9sb2NrOwogCQlBU1NFUlQobmltYXAgPT0gMCB8fCBuaW1hcCA9PSAxKTsKQEAgLTIxMTEsOCArMjExMiw4IEBACiAJCQkJc3RhcnRvZmZzZXRfZnNiICs9IG1wLT5tX3NiLnNiX3JleHRzaXplIC0gbW9kOwogCQl9CiAJCW5pbWFwID0gMTsKLQkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZG9mZnNldF9mc2IgLSAxLAotCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIGVuZG9mZnNldF9mc2IgLSAxLCAxLAorCQkJCQkmaW1hcCwgJm5pbWFwLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKIAkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CkBAIC0yMTgwLDcgKzIxODEsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yMTsKIAotCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKIAkJLyoKIAkJICogaXNzdWUgdGhlIGJ1bm1hcGkoKSBjYWxsIHRvIGZyZWUgdGhlIGJsb2NrcwpAQCAtMjM1Myw4ICsyMzU0LDcgQEAKIAl9CiAKIAl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQotCXhmc190cmFuc19pam9pbih0cCwgaXApOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKIAogCWlmICgoYXR0cl9mbGFncyAmIFhGU19BVFRSX0RNSSkgPT0gMCkgewogCQlpcC0+aV9kLmRpX21vZGUgJj0gflNfSVNVSUQ7CkBAIC0yMzc5LDEwICsyMzc5LDUgQEAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJaWYgKGF0dHJfZmxhZ3MgJiBYRlNfQVRUUl9TWU5DKQogCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCi0JZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLQotCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHhmc190cmFuc19jb21taXQodHAsIDApOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IGU0OWMzNmQuLmJiMTQ1ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogewogfQogc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKIAkJCQkJICAgICAgIHZvaWQgKmNvbnRleHQpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDQ1NDNiNmYuLjgzMDYyZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC0xODksNiArMTg5LDggQEAKIC8qCiAgKiBUaHJlYWRzIGFuZCBTY2hlZHVsaW5nCiAgKi8KK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlfaG90cGx1Z193cTsKKwogYWNwaV90aHJlYWRfaWQgYWNwaV9vc19nZXRfdGhyZWFkX2lkKHZvaWQpOwogCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggYjY3MjMxYi4uZWQ3M2Y2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC00NzAsNyArNDcwLDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX0ZVTExfSU5JVElBTElaQVRJT04gICAgICAgIDB4MDAKICNkZWZpbmUgQUNQSV9OT19BRERSRVNTX1NQQUNFX0lOSVQgICAgICAweDAxCi0jZGVmaW5lIEFDUElfTk9fSEFSRFdBUkVfSU5JVCAgICAgICAgICAgMHgwMgogI2RlZmluZSBBQ1BJX05PX0VWRU5UX0lOSVQgICAgICAgICAgICAgIDB4MDQKICNkZWZpbmUgQUNQSV9OT19IQU5ETEVSX0lOSVQgICAgICAgICAgICAweDA4CiAjZGVmaW5lIEFDUElfTk9fQUNQSV9FTkFCTEUgICAgICAgICAgICAgMHgxMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggZjcyNDAzYy4uZjRiMmVmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC01NSw3ICs1NSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDY3MDU1ZjEuLjYxMGY2ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTMyOSw2ICszMjksNyBAQAogaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKIAkJCSAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CitpbnQgYWNwaV9wcm9jZXNzb3JfaG90cGx1ZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgYWNwaV9wcm9jZXNzb3Jfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCBkZmIwZWM2Li44NDQ1OGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTYxLDExICs2MSwxMiBAQAogICovCiAjaWZuZGVmIF9fV0FSTl9UQUlOVAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLWV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfZm10KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLAotCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfZm10X3RhaW50KGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLAotCQkJCSAgICB1bnNpZ25lZCB0YWludCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCB3YXJuX3Nsb3dwYXRoX2ZtdChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50Zig0LCA1KQordm9pZCB3YXJuX3Nsb3dwYXRoX2ZtdF90YWludChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwgdW5zaWduZWQgdGFpbnQsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIHdhcm5fc2xvd3BhdGhfbnVsbChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSk7CiAjZGVmaW5lIFdBTlRfV0FSTl9PTl9TTE9XUEFUSAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NoZWNrc3VtLmgKaW5kZXggNDY0N2M3Ni4uYzA4NDc2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY2hlY2tzdW0uaApAQCAtMzMsOCArMzMsMTAgQEAKIGV4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKIAkJCQkJaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICpjc3VtX2Vycik7CiAKKyNpZm5kZWYgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjawogI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkJXAogCWNzdW1fcGFydGlhbF9jb3B5KChzcmMpLCAoZHN0KSwgKGxlbiksIChzdW0pKQorI2VuZGlmCiAKIC8qCiAgKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCkBAIC02MywxMiArNjUsMTQgQEAKIAkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pOwogI2VuZGlmCiAKKyNpZm5kZWYgY3N1bV90Y3B1ZHBfbWFnaWMKIHN0YXRpYyBpbmxpbmUgX19zdW0xNgogY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkciwgZGFkZHIsIGxlbiwgcHJvdG8sIHN1bSkpOwogfQorI2VuZGlmCiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1jb21tb24uaAppbmRleCAwYzgwYmIzLi45ZmEzZjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctY29tbW9uLmgKQEAgLTEyMyw3ICsxMjMsMTIgQEAKIAkJCQkJCSBzaXplX3Qgc2l6ZSwKIAkJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBhZGRyICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCWNvbnN0IHN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKwlpZiAob3BzLT5zeW5jX3NpbmdsZV9mb3JfY3B1KQorCQlvcHMtPnN5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBhZGRyICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCWRlYnVnX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KGRldiwgYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTMyLDcgKzEzNywxMiBAQAogCQkJCQkJICAgIHNpemVfdCBzaXplLAogCQkJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGFkZHIgKyBvZmZzZXQsIHNpemUsIGRpcik7CisJY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOworCWlmIChvcHMtPnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpCisJCW9wcy0+c3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGFkZHIgKyBvZmZzZXQsIHNpemUsIGRpcik7CisJZGVidWdfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UoZGV2LCBhZGRyLCBvZmZzZXQsIHNpemUsIGRpcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9ncGlvLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAppbmRleCBkNDk0MDAxLi44Yzg2MjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2dwaW8uaApAQCAtNDEsNiArNDEsNyBAQAogfQogCiBzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGdwaW87CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGRldmljZV9ub2RlOwpAQCAtMTcwLDE4ICsxNzEsNiBAQAogCiBleHRlcm4gaW50IF9fZ3Bpb190b19pcnEodW5zaWduZWQgZ3Bpbyk7CiAKLS8qKgotICogc3RydWN0IGdwaW8gLSBhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgR1BJTyB3aXRoIGNvbmZpZ3VyYXRpb24KLSAqIEBncGlvOgl0aGUgR1BJTyBudW1iZXIKLSAqIEBmbGFnczoJR1BJTyBjb25maWd1cmF0aW9uIGFzIHNwZWNpZmllZCBieSBHUElPRl8qCi0gKiBAbGFiZWw6CWEgbGl0ZXJhbCBkZXNjcmlwdGlvbiBzdHJpbmcgb2YgdGhpcyBHUElPCi0gKi8KLXN0cnVjdCBncGlvIHsKLQl1bnNpZ25lZAlncGlvOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JY29uc3QgY2hhcgkqbGFiZWw7Ci19OwotCiBleHRlcm4gaW50IGdwaW9fcmVxdWVzdF9vbmUodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbGFiZWwpOwogZXh0ZXJuIGludCBncGlvX3JlcXVlc3RfYXJyYXkoY29uc3Qgc3RydWN0IGdwaW8gKmFycmF5LCBzaXplX3QgbnVtKTsKIGV4dGVybiB2b2lkIGdwaW9fZnJlZV9hcnJheShjb25zdCBzdHJ1Y3QgZ3BpbyAqYXJyYXksIHNpemVfdCBudW0pOwpAQCAtMjIwLDEzICsyMDksMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHVuc2lnbmVkIGdwaW8pCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQlncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CisJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CiB9CiAKICNlbmRpZiAvKiAhQ09ORklHX0dQSU9MSUIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGFnZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKaW5kZXggNzVmZWMxOC4uMzUxODg5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmgKQEAgLTc5LDggKzc5LDggQEAKICNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpCShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBwZm5fdG9fdmlydChwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKIAotI2RlZmluZSB2aXJ0X3RvX3BhZ2UoYWRkcikJKG1lbV9tYXAgKyAoKCh1bnNpZ25lZCBsb25nKShhZGRyKS1QQUdFX09GRlNFVCkgPj4gUEFHRV9TSElGVCkpCi0jZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQkoKCgocGFnZSkgLSBtZW1fbWFwKSA8PCBQQUdFX1NISUZUKSArIFBBR0VfT0ZGU0VUKQorI2RlZmluZSB2aXJ0X3RvX3BhZ2UoYWRkcikJcGZuX3RvX3BhZ2UodmlydF90b19wZm4oYWRkcikpCisjZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQlwZm5fdG9fdmlydChwYWdlX3RvX3BmbihwYWdlKSkKIAogI2lmbmRlZiBwYWdlX3RvX3BoeXMKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpICAgICAgKChkbWFfYWRkcl90KXBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3J3c2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZTJjZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcndzZW0uaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfUldTRU1fSAorI2RlZmluZSBfQVNNX1BPV0VSUENfUldTRU1fSAorCisjaWZuZGVmIF9MSU5VWF9SV1NFTV9ICisjZXJyb3IgIlBsZWFzZSBkb24ndCBpbmNsdWRlIDxhc20vcndzZW0uaD4gZGlyZWN0bHksIHVzZSA8bGludXgvcndzZW0uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIFIvVyBzZW1hcGhvcmVzIGZvciBQUEMgdXNpbmcgdGhlIHN0dWZmIGluIGxpYi9yd3NlbS5jLgorICogQWRhcHRlZCBsYXJnZWx5IGZyb20gaW5jbHVkZS9hc20taTM4Ni9yd3NlbS5oCisgKiBieSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4uCisgKi8KKworLyoKKyAqIHRoZSBzZW1hcGhvcmUgZGVmaW5pdGlvbgorICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisjIGRlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHhmZmZmZmZmZkwKKyNlbHNlCisjIGRlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHgwMDAwZmZmZkwKKyNlbmRpZgorCisjZGVmaW5lIFJXU0VNX1VOTE9DS0VEX1ZBTFVFCQkweDAwMDAwMDAwTAorI2RlZmluZSBSV1NFTV9BQ1RJVkVfQklBUwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgUldTRU1fV0FJVElOR19CSUFTCQkoLVJXU0VNX0FDVElWRV9NQVNLLTEpCisjZGVmaW5lIFJXU0VNX0FDVElWRV9SRUFEX0JJQVMJCVJXU0VNX0FDVElWRV9CSUFTCisjZGVmaW5lIFJXU0VNX0FDVElWRV9XUklURV9CSUFTCQkoUldTRU1fV0FJVElOR19CSUFTICsgUldTRU1fQUNUSVZFX0JJQVMpCisKKy8qCisgKiBsb2NrIGZvciByZWFkaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Rvd25fcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19sb25nX2luY19yZXR1cm4oKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCkgPD0gMCkpCisJCXJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQoc2VtKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJbG9uZyB0bXA7CisKKwl3aGlsZSAoKHRtcCA9IHNlbS0+Y291bnQpID49IDApIHsKKwkJaWYgKHRtcCA9PSBjbXB4Y2hnKCZzZW0tPmNvdW50LCB0bXAsCisJCQkJICAgdG1wICsgUldTRU1fQUNUSVZFX1JFQURfQklBUykpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogbG9jayBmb3Igd3JpdGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duX3dyaXRlX25lc3RlZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sIGludCBzdWJjbGFzcykKK3sKKwlsb25nIHRtcDsKKworCXRtcCA9IGF0b21pY19sb25nX2FkZF9yZXR1cm4oUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMsCisJCQkJICAgICAoYXRvbWljX2xvbmdfdCAqKSZzZW0tPmNvdW50KTsKKwlpZiAodW5saWtlbHkodG1wICE9IFJXU0VNX0FDVElWRV9XUklURV9CSUFTKSkKKwkJcndzZW1fZG93bl93cml0ZV9mYWlsZWQoc2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJX19kb3duX3dyaXRlX25lc3RlZChzZW0sIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2Rvd25fd3JpdGVfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJbG9uZyB0bXA7CisKKwl0bXAgPSBjbXB4Y2hnKCZzZW0tPmNvdW50LCBSV1NFTV9VTkxPQ0tFRF9WQUxVRSwKKwkJICAgICAgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpOworCXJldHVybiB0bXAgPT0gUldTRU1fVU5MT0NLRURfVkFMVUU7Cit9CisKKy8qCisgKiB1bmxvY2sgYWZ0ZXIgcmVhZGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX191cF9yZWFkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlsb25nIHRtcDsKKworCXRtcCA9IGF0b21pY19sb25nX2RlY19yZXR1cm4oKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7CisJaWYgKHVubGlrZWx5KHRtcCA8IC0xICYmICh0bXAgJiBSV1NFTV9BQ1RJVkVfTUFTSykgPT0gMCkpCisJCXJ3c2VtX3dha2Uoc2VtKTsKK30KKworLyoKKyAqIHVubG9jayBhZnRlciB3cml0aW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VwX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2xvbmdfc3ViX3JldHVybihSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUywKKwkJCQkgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCkgPCAwKSkKKwkJcndzZW1fd2FrZShzZW0pOworfQorCisvKgorICogaW1wbGVtZW50IGF0b21pYyBhZGQgZnVuY3Rpb25hbGl0eQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fYXRvbWljX2FkZChsb25nIGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJYXRvbWljX2xvbmdfYWRkKGRlbHRhLCAoYXRvbWljX2xvbmdfdCAqKSZzZW0tPmNvdW50KTsKK30KKworLyoKKyAqIGRvd25ncmFkZSB3cml0ZSBsb2NrIHRvIHJlYWQgbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWxvbmcgdG1wOworCisJdG1wID0gYXRvbWljX2xvbmdfYWRkX3JldHVybigtUldTRU1fV0FJVElOR19CSUFTLAorCQkJCSAgICAgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7CisJaWYgKHRtcCA8IDApCisJCXJ3c2VtX2Rvd25ncmFkZV93YWtlKHNlbSk7Cit9CisKKy8qCisgKiBpbXBsZW1lbnQgZXhjaGFuZ2UgYW5kIGFkZCBmdW5jdGlvbmFsaXR5CisgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyByd3NlbV9hdG9taWNfdXBkYXRlKGxvbmcgZGVsdGEsIHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlyZXR1cm4gYXRvbWljX2xvbmdfYWRkX3JldHVybihkZWx0YSwgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7Cit9CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX1JXU0VNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKaW5kZXggNTljM2U1Yi4uZWNjNzIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3QgcnRhdHRyOwpAQCAtMjYsNiArMjcsNyBAQAogCWludCAoKmluaXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiB0eXBlLCB1MzIgbWFzayk7CiAJaW50ICgqaW5pdF90Zm0pKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwogCXZvaWQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOworCWludCAoKnJlcG9ydCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CiAJc3RydWN0IGNyeXB0b19hbGcgKigqbG9va3VwKShjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogCiAJdW5zaWduZWQgaW50IHR5cGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9ibG93ZmlzaC5oIGIvaW5jbHVkZS9jcnlwdG8vYmxvd2Zpc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDUwZDRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jcnlwdG8vYmxvd2Zpc2guaApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29tbW9uIHZhbHVlcyBmb3IgYmxvd2Zpc2ggYWxnb3JpdGhtcworICovCisKKyNpZm5kZWYgX0NSWVBUT19CTE9XRklTSF9ICisjZGVmaW5lIF9DUllQVE9fQkxPV0ZJU0hfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKworI2RlZmluZSBCRl9CTE9DS19TSVpFIDgKKyNkZWZpbmUgQkZfTUlOX0tFWV9TSVpFIDQKKyNkZWZpbmUgQkZfTUFYX0tFWV9TSVpFIDU2CisKK3N0cnVjdCBiZl9jdHggeworCXUzMiBwWzE4XTsKKwl1MzIgc1sxMDI0XTsKK307CisKK2ludCBibG93ZmlzaF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKwkJICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9zaGEuaCBiL2luY2x1ZGUvY3J5cHRvL3NoYS5oCmluZGV4IDA2OWU4NWIuLmM2YzljMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY3J5cHRvL3NoYS5oCisrKyBiL2luY2x1ZGUvY3J5cHRvL3NoYS5oCkBAIC04Miw0ICs4Miw5IEBACiAJdTggYnVmW1NIQTUxMl9CTE9DS19TSVpFXTsKIH07CiAKK3N0cnVjdCBzaGFzaF9kZXNjOworCitleHRlcm4gaW50IGNyeXB0b19zaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1QLmggYi9pbmNsdWRlL2RybS9kcm1QLmgKaW5kZXggOWI3YzJiYi4uMWY5ZTk1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtUC5oCisrKyBiL2luY2x1ZGUvZHJtL2RybVAuaApAQCAtNDIsNyArNDIsNiBAQAogICogY2FuIGJ1aWxkIHRoZSBEUk0gKHBhcnQgb2YgUEkgRFJJKS4gNC8yMS8yMDAwIFMgKyBCICovCiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNlbmRpZgkJCQkvKiBfX2FscGhhX18gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTgwLDYgKzc5LDggQEAKICNkZWZpbmUgX19PU19IQVNfQUdQIChkZWZpbmVkKENPTkZJR19BR1ApIHx8IChkZWZpbmVkKENPTkZJR19BR1BfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpKQogI2RlZmluZSBfX09TX0hBU19NVFJSIChkZWZpbmVkKENPTkZJR19NVFJSKSkKIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IGRybV9maWxlOwogc3RydWN0IGRybV9kZXZpY2U7CiAKQEAgLTEyMiwxMiArMTIzLDEyIEBACiAgKiB1c2luZyB0aGUgRFJNX0RFQlVHX0tNUyBhbmQgRFJNX0RFQlVHLgogICovCiAKLWV4dGVybiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKQorZXh0ZXJuIF9fcHJpbnRmKDQsIDUpCiB2b2lkIGRybV91dF9kZWJ1Z19wcmludGsodW5zaWduZWQgaW50IHJlcXVlc3RfbGV2ZWwsCi0JCQkJY29uc3QgY2hhciAqcHJlZml4LAotCQkJCWNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCQkJY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwotZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCisJCQkgY29uc3QgY2hhciAqcHJlZml4LAorCQkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCQkgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCiBpbnQgZHJtX2Vycihjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk4OSw3ICs5OTAsOSBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290OyAgLyoqPCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLwogCXN0cnVjdCBkcm1faW5mb19ub2RlIHByb2Nfbm9kZXM7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OwotCXN0cnVjdCBkcm1faW5mb19ub2RlIGRlYnVnZnNfbm9kZXM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlYnVnZnNfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXggZGVidWdmc19sb2NrOyAvKiBQcm90ZWN0cyBkZWJ1Z2ZzX2xpc3QuICovCiAKIAlzdHJ1Y3QgZHJtX21hc3RlciAqbWFzdGVyOyAvKiBjdXJyZW50bHkgYWN0aXZlIG1hc3RlciBmb3IgdGhpcyBub2RlICovCiAJc3RydWN0IGxpc3RfaGVhZCBtYXN0ZXJfbGlzdDsKQEAgLTE2MjQsNiArMTYyNyw5IEBACiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKIH0KIAordm9pZCBkcm1fZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworaW50IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKKwogc3RydWN0IGRybV9nZW1fb2JqZWN0ICpkcm1fZ2VtX29iamVjdF9sb29rdXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHAsCiAJCQkJCSAgICAgdTMyIGhhbmRsZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAppbmRleCA0NDMzNWU1Li44MDIwNzk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKQEAgLTQ2Niw2ICs0NjYsOCBAQAogLyogREFDcyBzaG91bGQgcmFyZWx5IGRvIHRoaXMgd2l0aG91dCBhIGxvdCBvZiB0ZXN0aW5nICovCiAjZGVmaW5lIERSTV9DT05ORUNUT1JfUE9MTF9ESVNDT05ORUNUICgxIDw8IDIpCiAKKyNkZWZpbmUgTUFYX0VMRF9CWVRFUwkxMjgKKwogLyoqCiAgKiBkcm1fY29ubmVjdG9yIC0gY2VudHJhbCBEUk0gY29ubmVjdG9yIGNvbnRyb2wgc3RydWN0dXJlCiAgKiBAY3J0YzogQ1JUQyB0aGlzIGNvbm5lY3RvciBpcyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLCBOVUxMIGlmIG5vbmUKQEAgLTUyMyw2ICs1MjUsMTMgQEAKIAl1aW50MzJfdCBmb3JjZV9lbmNvZGVyX2lkOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsgLyogY3VycmVudGx5IGFjdGl2ZSBlbmNvZGVyICovCiAKKwkvKiBFRElEIGJpdHMgKi8KKwl1aW50OF90IGVsZFtNQVhfRUxEX0JZVEVTXTsKKwlib29sIGR2aV9kdWFsOworCWludCBtYXhfdG1kc19jbG9jazsJLyogaW4gTUh6ICovCisJYm9vbCBsYXRlbmN5X3ByZXNlbnRbMl07CisJaW50IHZpZGVvX2xhdGVuY3lbMl07CS8qIFswXTogcHJvZ3Jlc3NpdmUsIFsxXTogaW50ZXJsYWNlZCAqLworCWludCBhdWRpb19sYXRlbmN5WzJdOwogCWludCBudWxsX2VkaWRfY291bnRlcjsgLyogbmVlZGVkIHRvIHdvcmthcm91bmQgc29tZSBIVyBidWdzIHdoZXJlIHdlIGdldCBhbGwgMHMgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaAppbmRleCA5MTU2N2JiLi45M2RmMmQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZHBfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCkBAIC03Miw4ICs3MiwyMyBAQAogCiAjZGVmaW5lIERQX01BSU5fTElOS19DSEFOTkVMX0NPRElORyAgICAgICAgIDB4MDA2CiAKKyNkZWZpbmUgRFBfRURQX0NPTkZJR1VSQVRJT05fQ0FQICAgICAgICAgICAgMHgwMGQKICNkZWZpbmUgRFBfVFJBSU5JTkdfQVVYX1JEX0lOVEVSVkFMICAgICAgICAgMHgwMGUKIAorI2RlZmluZSBEUF9QU1JfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAweDA3MAorIyBkZWZpbmUgRFBfUFNSX0lTX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERQX1BTUl9DQVBTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxCisjIGRlZmluZSBEUF9QU1JfTk9fVFJBSU5fT05fRVhJVCAgICAgICAgICAgIDEKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzMzMCAgICAgICAgICAgICAgKDAgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzI3NSAgICAgICAgICAgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzIyMCAgICAgICAgICAgICAgKDIgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzE2NSAgICAgICAgICAgICAgKDMgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzExMCAgICAgICAgICAgICAgKDQgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzU1ICAgICAgICAgICAgICAgKDUgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FXzAgICAgICAgICAgICAgICAgKDYgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FX01BU0sgICAgICAgICAgICAgKDcgPDwgMSkKKyMgZGVmaW5lIERQX1BTUl9TRVRVUF9USU1FX1NISUZUICAgICAgICAgICAgMQorCiAvKiBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUJRFBfTElOS19CV19TRVQJCSAgICAgICAgICAgIDB4MTAwCiAjIGRlZmluZSBEUF9MSU5LX0JXXzFfNjIJCSAgICAweDA2CkBAIC0xMzMsNiArMTQ4LDIwIEBACiAjZGVmaW5lIERQX01BSU5fTElOS19DSEFOTkVMX0NPRElOR19TRVQJICAgIDB4MTA4CiAjIGRlZmluZSBEUF9TRVRfQU5TSV84QjEwQgkJICAgICgxIDw8IDApCiAKKyNkZWZpbmUgRFBfUFNSX0VOX0NGRwkJCSAgICAweDE3MAorIyBkZWZpbmUgRFBfUFNSX0VOQUJMRQkJCSAgICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfUFNSX01BSU5fTElOS19BQ1RJVkUJICAgICgxIDw8IDEpCisjIGRlZmluZSBEUF9QU1JfQ1JDX1ZFUklGSUNBVElPTgkgICAgKDEgPDwgMikKKyMgZGVmaW5lIERQX1BTUl9GUkFNRV9DQVBUVVJFCQkgICAgKDEgPDwgMykKKworI2RlZmluZSBEUF9ERVZJQ0VfU0VSVklDRV9JUlFfVkVDVE9SCSAgICAweDIwMQorIyBkZWZpbmUgRFBfUkVNT1RFX0NPTlRST0xfQ09NTUFORF9QRU5ESU5HICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfQVVUT01BVEVEX1RFU1RfUkVRVUVTVAkgICAgKDEgPDwgMSkKKyMgZGVmaW5lIERQX0NQX0lSUQkJCSAgICAoMSA8PCAyKQorIyBkZWZpbmUgRFBfU0lOS19TUEVDSUZJQ19JUlEJCSAgICAoMSA8PCA2KQorCisjZGVmaW5lIERQX0VEUF9DT05GSUdVUkFUSU9OX1NFVCAgICAgICAgICAgIDB4MTBhCisKICNkZWZpbmUgRFBfTEFORTBfMV9TVEFUVVMJCSAgICAweDIwMgogI2RlZmluZSBEUF9MQU5FMl8zX1NUQVRVUwkJICAgIDB4MjAzCiAjIGRlZmluZSBEUF9MQU5FX0NSX0RPTkUJCSAgICAoMSA8PCAwKQpAQCAtMTY1LDEwICsxOTQsNDUgQEAKICMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfTUFTSyAgIDB4YzAKICMgZGVmaW5lIERQX0FESlVTVF9QUkVfRU1QSEFTSVNfTEFORTFfU0hJRlQgIDYKIAorI2RlZmluZSBEUF9URVNUX1JFUVVFU1QJCQkgICAgMHgyMTgKKyMgZGVmaW5lIERQX1RFU1RfTElOS19UUkFJTklORwkJICAgICgxIDw8IDApCisjIGRlZmluZSBEUF9URVNUX0xJTktfUEFUVEVSTgkJICAgICgxIDw8IDEpCisjIGRlZmluZSBEUF9URVNUX0xJTktfRURJRF9SRUFECQkgICAgKDEgPDwgMikKKyMgZGVmaW5lIERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOCSAgICAoMSA8PCAzKSAvKiBEUENEID49IDEuMSAqLworCisjZGVmaW5lIERQX1RFU1RfTElOS19SQVRFCQkgICAgMHgyMTkKKyMgZGVmaW5lIERQX0xJTktfUkFURV8xNjIJCSAgICAoMHg2KQorIyBkZWZpbmUgRFBfTElOS19SQVRFXzI3CQkgICAgKDB4YSkKKworI2RlZmluZSBEUF9URVNUX0xBTkVfQ09VTlQJCSAgICAweDIyMAorCisjZGVmaW5lIERQX1RFU1RfUEFUVEVSTgkJCSAgICAweDIyMQorCisjZGVmaW5lIERQX1RFU1RfUkVTUE9OU0UJCSAgICAweDI2MAorIyBkZWZpbmUgRFBfVEVTVF9BQ0sJCQkgICAgKDEgPDwgMCkKKyMgZGVmaW5lIERQX1RFU1RfTkFLCQkJICAgICgxIDw8IDEpCisjIGRlZmluZSBEUF9URVNUX0VESURfQ0hFQ0tTVU1fV1JJVEUJICAgICgxIDw8IDIpCisKICNkZWZpbmUgRFBfU0VUX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAKICMgZGVmaW5lIERQX1NFVF9QT1dFUl9EMCAgICAgICAgICAgICAgICAgICAgMHgxCiAjIGRlZmluZSBEUF9TRVRfUE9XRVJfRDMgICAgICAgICAgICAgICAgICAgIDB4MgogCisjZGVmaW5lIERQX1BTUl9FUlJPUl9TVEFUVVMgICAgICAgICAgICAgICAgIDB4MjAwNgorIyBkZWZpbmUgRFBfUFNSX0xJTktfQ1JDX0VSUk9SICAgICAgICAgICAgICAoMSA8PCAwKQorIyBkZWZpbmUgRFBfUFNSX1JGQl9TVE9SQUdFX0VSUk9SICAgICAgICAgICAoMSA8PCAxKQorCisjZGVmaW5lIERQX1BTUl9FU0kgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNworIyBkZWZpbmUgRFBfUFNSX0NBUFNfQ0hBTkdFICAgICAgICAgICAgICAgICAoMSA8PCAwKQorCisjZGVmaW5lIERQX1BTUl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAorIyBkZWZpbmUgRFBfUFNSX1NJTktfSU5BQ1RJVkUgICAgICAgICAgICAgICAwCisjIGRlZmluZSBEUF9QU1JfU0lOS19BQ1RJVkVfU1JDX1NZTkNFRCAgICAgIDEKKyMgZGVmaW5lIERQX1BTUl9TSU5LX0FDVElWRV9SRkIgICAgICAgICAgICAgMgorIyBkZWZpbmUgRFBfUFNSX1NJTktfQUNUSVZFX1NJTktfU1lOQ0VEICAgICAzCisjIGRlZmluZSBEUF9QU1JfU0lOS19BQ1RJVkVfUkVTWU5DICAgICAgICAgIDQKKyMgZGVmaW5lIERQX1BTUl9TSU5LX0lOVEVSTkFMX0VSUk9SICAgICAgICAgNworIyBkZWZpbmUgRFBfUFNSX1NJTktfU1RBVEVfTUFTSyAgICAgICAgICAgICAweDA3CisKICNkZWZpbmUgTU9ERV9JMkNfU1RBUlQJMQogI2RlZmluZSBNT0RFX0kyQ19XUklURQkyCiAjZGVmaW5lIE1PREVfSTJDX1JFQUQJNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaCBiL2luY2x1ZGUvZHJtL2RybV9lZGlkLmgKaW5kZXggZWFjYjQxNS4uNzRjZTkxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2VkaWQuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZWRpZC5oCkBAIC0yMzAsNCArMjMwLDEzIEBACiAKICNkZWZpbmUgRURJRF9QUk9EVUNUX0lEKGUpICgoZSktPnByb2RfY29kZVswXSB8ICgoZSktPnByb2RfY29kZVsxXSA8PCA4KSkKIAorc3RydWN0IGRybV9lbmNvZGVyOworc3RydWN0IGRybV9jb25uZWN0b3I7CitzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZTsKK3ZvaWQgZHJtX2VkaWRfdG9fZWxkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBlZGlkICplZGlkKTsKK2ludCBkcm1fYXZfc3luY19kZWxheShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CitzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqZHJtX3NlbGVjdF9lbGQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOworCiAjZW5kaWYgLyogX19EUk1fRURJRF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2RlLmggYi9pbmNsdWRlL2RybS9kcm1fbW9kZS5oCmluZGV4IGM0OTYxZWEuLmQzMGJlZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9tb2RlLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX21vZGUuaApAQCAtMTIwLDExICsxMjAsMTIgQEAKIAlzdHJ1Y3QgZHJtX21vZGVfbW9kZWluZm8gbW9kZTsKIH07CiAKLSNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9OT05FCTAKLSNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9EQUMJMQotI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RNRFMJMgotI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0xWRFMJMwotI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1RWREFDCTQKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9OT05FCSAwCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfREFDCSAxCisjZGVmaW5lIERSTV9NT0RFX0VOQ09ERVJfVE1EUwkgMgorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX0xWRFMJIDMKKyNkZWZpbmUgRFJNX01PREVfRU5DT0RFUl9UVkRBQwkgNAorI2RlZmluZSBEUk1fTU9ERV9FTkNPREVSX1ZJUlRVQUwgNQogCiBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2VuY29kZXIgewogCV9fdTMyIGVuY29kZXJfaWQ7CkBAIC0xNjIsNiArMTYzLDcgQEAKICNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCCTEyCiAjZGVmaW5lIERSTV9NT0RFX0NPTk5FQ1RPUl9UVgkJMTMKICNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX2VEUAkJMTQKKyNkZWZpbmUgRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwgICAgICAxNQogCiBzdHJ1Y3QgZHJtX21vZGVfZ2V0X2Nvbm5lY3RvciB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2V4eW5vc19kcm0uaCBiL2luY2x1ZGUvZHJtL2V4eW5vc19kcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE2MWNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vZXh5bm9zX2RybS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBleHlub3NfZHJtLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcnM6CisgKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+CisgKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+CisgKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0VYWU5PU19EUk1fSF8KKyNkZWZpbmUgX0VYWU5PU19EUk1fSF8KKworLyoqCisgKiBVc2VyLWRlc2lyZWQgYnVmZmVyIGNyZWF0aW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKyAqCisgKiBAc2l6ZTogcmVxdWVzdGVkIHNpemUgZm9yIHRoZSBvYmplY3QuCisgKgktIHRoaXMgc2l6ZSB2YWx1ZSB3b3VsZCBiZSBwYWdlLWFsaWduZWQgaW50ZXJuYWxseS4KKyAqIEBmbGFnczogdXNlciByZXF1ZXN0IGZvciBzZXR0aW5nIG1lbW9yeSB0eXBlIG9yIGNhY2hlIGF0dHJpYnV0ZXMuCisgKiBAaGFuZGxlOiByZXR1cm5lZCBoYW5kbGUgZm9yIHRoZSBvYmplY3QuCisgKiBAcGFkOiBqdXN0IHBhZGRpbmcgdG8gYmUgNjQtYml0IGFsaWduZWQuCisgKi8KK3N0cnVjdCBkcm1fZXh5bm9zX2dlbV9jcmVhdGUgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCXVuc2lnbmVkIGludCBwYWQ7Cit9OworCisvKioKKyAqIEEgc3RydWN0dXJlIGZvciBnZXR0aW5nIGJ1ZmZlciBvZmZzZXQuCisgKgorICogQGhhbmRsZTogYSBwb2ludGVyIHRvIGdlbSBvYmplY3QgY3JlYXRlZC4KKyAqIEBwYWQ6IGp1c3QgcGFkZGluZyB0byBiZSA2NC1iaXQgYWxpZ25lZC4KKyAqIEBvZmZzZXQ6IHJlbGF0aXZlZCBvZmZzZXQgdmFsdWUgb2YgdGhlIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkLgorICoJLSB0aGlzIHZhbHVlIHNob3VsZCBiZSBzZXQgYnkgdXNlci4KKyAqLworc3RydWN0IGRybV9leHlub3NfZ2VtX21hcF9vZmYgeworCXVuc2lnbmVkIGludCBoYW5kbGU7CisJdW5zaWduZWQgaW50IHBhZDsKKwl1aW50NjRfdCBvZmZzZXQ7Cit9OworCisvKioKKyAqIEEgc3RydWN0dXJlIGZvciBtYXBwaW5nIGJ1ZmZlci4KKyAqCisgKiBAaGFuZGxlOiBhIGhhbmRsZSB0byBnZW0gb2JqZWN0IGNyZWF0ZWQuCisgKiBAc2l6ZTogbWVtb3J5IHNpemUgdG8gYmUgbWFwcGVkLgorICogQG1hcHBlZDogaGF2aW5nIHVzZXIgdmlydHVhbCBhZGRyZXNzIG1tYXBlZC4KKyAqCS0gdGhpcyB2YXJpYWJsZSB3b3VsZCBiZSBmaWxsZWQgYnkgZXh5bm9zIGdlbSBtb2R1bGUKKyAqCW9mIGtlcm5lbCBzaWRlIHdpdGggdXNlciB2aXJ0dWFsIGFkZHJlc3Mgd2hpY2ggaXMgYWxsb2NhdGVkCisgKglieSBkb19tbWFwKCkuCisgKi8KK3N0cnVjdCBkcm1fZXh5bm9zX2dlbV9tbWFwIHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCXVuc2lnbmVkIGludCBzaXplOworCXVpbnQ2NF90IG1hcHBlZDsKK307CisKKyNkZWZpbmUgRFJNX0VYWU5PU19HRU1fQ1JFQVRFCQkweDAwCisjZGVmaW5lIERSTV9FWFlOT1NfR0VNX01BUF9PRkZTRVQJMHgwMQorI2RlZmluZSBEUk1fRVhZTk9TX0dFTV9NTUFQCQkweDAyCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0VYWU5PU19HRU1fQ1JFQVRFCQlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgXAorCQlEUk1fRVhZTk9TX0dFTV9DUkVBVEUsIHN0cnVjdCBkcm1fZXh5bm9zX2dlbV9jcmVhdGUpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0VYWU5PU19HRU1fTUFQX09GRlNFVAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgXAorCQlEUk1fRVhZTk9TX0dFTV9NQVBfT0ZGU0VULCBzdHJ1Y3QgZHJtX2V4eW5vc19nZW1fbWFwX29mZikKKworI2RlZmluZSBEUk1fSU9DVExfRVhZTk9TX0dFTV9NTUFQCURSTV9JT1dSKERSTV9DT01NQU5EX0JBU0UgKyBcCisJCURSTV9FWFlOT1NfR0VNX01NQVAsIHN0cnVjdCBkcm1fZXh5bm9zX2dlbV9tbWFwKQorCisvKioKKyAqIFBsYXRmb3JtIFNwZWNpZmljIFN0cnVjdHVyZSBmb3IgRFJNIGJhc2VkIEZJTUQuCisgKgorICogQHRpbWluZzogZGVmYXVsdCB2aWRlbyBtb2RlIGZvciBpbml0aWFsaXppbmcKKyAqIEBkZWZhdWx0X3dpbjogZGVmYXVsdCB3aW5kb3cgbGF5ZXIgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIFVJLgorICogQGJwcDogZGVmYXVsdCBiaXQgcGVyIHBpeGVsLgorICovCitzdHJ1Y3QgZXh5bm9zX2RybV9maW1kX3BkYXRhIHsKKwlzdHJ1Y3QgZmJfdmlkZW9tb2RlCQl0aW1pbmc7CisJdTMyCQkJCXZpZGNvbjA7CisJdTMyCQkJCXZpZGNvbjE7CisJdW5zaWduZWQgaW50CQkJZGVmYXVsdF93aW47CisJdW5zaWduZWQgaW50CQkJYnBwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9pbnRlbC1ndHQuaCBiL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oCmluZGV4IDllMzQzYzAuLmIxNzQ2MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oCisrKyBiL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oCkBAIC0xMyw2ICsxMyw4IEBACiAJdW5zaWduZWQgaW50IGd0dF9tYXBwYWJsZV9lbnRyaWVzOwogCS8qIFdoZXRoZXIgaTkxNSBuZWVkcyB0byB1c2UgdGhlIGRtYXIgYXBpcyBvciBub3QuICovCiAJdW5zaWduZWQgaW50IG5lZWRzX2RtYXIgOiAxOworCS8qIFdoZXRoZXIgd2UgaWRsZSB0aGUgZ3B1IGJlZm9yZSBtYXBwaW5nL3VubWFwcGluZyAqLworCXVuc2lnbmVkIGludCBkb19pZGxlX21hcHMgOiAxOwogfSAqaW50ZWxfZ3R0X2dldCh2b2lkKTsKIAogdm9pZCBpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3Ztd2dmeF9kcm0uaCBiL2luY2x1ZGUvZHJtL3Ztd2dmeF9kcm0uaAppbmRleCA1YzM2NDMyZC4uYmNiMDkxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdm13Z2Z4X2RybS5oCisrKyBiL2luY2x1ZGUvZHJtL3Ztd2dmeF9kcm0uaApAQCAtMzEsNyArMzEsNiBAQAogI2RlZmluZSBEUk1fVk1XX01BWF9TVVJGQUNFX0ZBQ0VTIDYKICNkZWZpbmUgRFJNX1ZNV19NQVhfTUlQX0xFVkVMUyAyNAogCi0jZGVmaW5lIERSTV9WTVdfRVhUX05BTUVfTEVOIDEyOAogCiAjZGVmaW5lIERSTV9WTVdfR0VUX1BBUkFNICAgICAgICAgICAgMAogI2RlZmluZSBEUk1fVk1XX0FMTE9DX0RNQUJVRiAgICAgICAgIDEKQEAgLTQ4LDExICs0NywxNCBAQAogI2RlZmluZSBEUk1fVk1XX1VOUkVGX1NVUkZBQ0UgICAgICAgIDEwCiAjZGVmaW5lIERSTV9WTVdfUkVGX1NVUkZBQ0UgICAgICAgICAgMTEKICNkZWZpbmUgRFJNX1ZNV19FWEVDQlVGICAgICAgICAgICAgICAxMgotI2RlZmluZSBEUk1fVk1XX0ZJRk9fREVCVUcgICAgICAgICAgIDEzCisjZGVmaW5lIERSTV9WTVdfR0VUXzNEX0NBUCAgICAgICAgICAgMTMKICNkZWZpbmUgRFJNX1ZNV19GRU5DRV9XQUlUICAgICAgICAgICAxNAotLyogZ3VhcmRlZCBieSBtaW5vciB2ZXJzaW9uID49IDIgKi8KLSNkZWZpbmUgRFJNX1ZNV19VUERBVEVfTEFZT1VUICAgICAgICAxNQotCisjZGVmaW5lIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgICAgICAgMTUKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9VTlJFRiAgICAgICAgICAxNgorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX0VWRU5UICAgICAgICAgIDE3CisjZGVmaW5lIERSTV9WTVdfUFJFU0VOVCAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgRFJNX1ZNV19QUkVTRU5UX1JFQURCQUNLICAgICAxOQorI2RlZmluZSBEUk1fVk1XX1VQREFURV9MQVlPVVQgICAgICAgIDIwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCkBAIC02OSwxMCArNzEsMTAgQEAKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV9OVU1fU1RSRUFNUyAgICAgIDAKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV9OVU1fRlJFRV9TVFJFQU1TIDEKICNkZWZpbmUgRFJNX1ZNV19QQVJBTV8zRCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX09GRlNFVCAgICAgIDMKLSNkZWZpbmUgRFJNX1ZNV19QQVJBTV9IV19DQVBTICAgICAgICAgIDQKLSNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0NBUFMgICAgICAgIDUKLSNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRSAgICAgIDYKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9IV19DQVBTICAgICAgICAgIDMKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0NBUFMgICAgICAgIDQKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9NQVhfRkJfU0laRSAgICAgIDUKKyNkZWZpbmUgRFJNX1ZNV19QQVJBTV9GSUZPX0hXX1ZFUlNJT04gIDYKIAogLyoqCiAgKiBzdHJ1Y3QgZHJtX3Ztd19nZXRwYXJhbV9hcmcKQEAgLTkxLDQ5ICs5Myw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCi0gKiBEUk1fVk1XX0VYVEVOU0lPTiAtIFF1ZXJ5IGRldmljZSBleHRlbnNpb25zLgotICovCi0KLS8qKgotICogc3RydWN0IGRybV92bXdfZXh0ZW5zaW9uX3JlcAotICoKLSAqIEBleGlzdHM6IFRoZSBxdWVyaWVkIGV4dGVuc2lvbiBleGlzdHMuCi0gKiBAZHJpdmVyX2lvY3RsX29mZnNldDogSW9jdGwgbnVtYmVyIG9mIHRoZSBmaXJzdCBpb2N0bCBpbiB0aGUgZXh0ZW5zaW9uLgotICogQGRyaXZlcl9zYXJlYV9vZmZzZXQ6IE9mZnNldCB0byBhbnkgc3BhY2UgaW4gdGhlIERSSSBTQVJFQQotICogdXNlZCBieSB0aGUgZXh0ZW5zaW9uLgotICogQG1ham9yOiBNYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLgotICogQG1pbm9yOiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLgotICogQHBsOiBQYXRjaCBsZXZlbCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0ZW5zaW9uLgotICoKLSAqIE91dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19FWFRFTlNJT04gSW9jdGwuCi0gKi8KLQotc3RydWN0IGRybV92bXdfZXh0ZW5zaW9uX3JlcCB7Ci0JaW50MzJfdCBleGlzdHM7Ci0JdWludDMyX3QgZHJpdmVyX2lvY3RsX29mZnNldDsKLQl1aW50MzJfdCBkcml2ZXJfc2FyZWFfb2Zmc2V0OwotCXVpbnQzMl90IG1ham9yOwotCXVpbnQzMl90IG1pbm9yOwotCXVpbnQzMl90IHBsOwotCXVpbnQzMl90IHBhZDY0OwotfTsKLQotLyoqCi0gKiB1bmlvbiBkcm1fdm13X2V4dGVuc2lvbl9hcmcKLSAqCi0gKiBAZXh0ZW5zaW9uIC0gQXNjaWkgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIGJlIHF1ZXJpZWQuIC8vSW4KLSAqIEByZXAgLSBSZXBseSBhcyBkZWZpbmVkIGFib3ZlLiAvL091dAotICoKLSAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0VYVEVOU0lPTiBJb2N0bC4KLSAqLwotCi11bmlvbiBkcm1fdm13X2V4dGVuc2lvbl9hcmcgewotCWNoYXIgZXh0ZW5zaW9uW0RSTV9WTVdfRVhUX05BTUVfTEVOXTsKLQlzdHJ1Y3QgZHJtX3Ztd19leHRlbnNpb25fcmVwIHJlcDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCiAgKiBEUk1fVk1XX0NSRUFURV9DT05URVhUIC0gQ3JlYXRlIGEgaG9zdCBjb250ZXh0LgogICoKICAqIEFsbG9jYXRlcyBhIGRldmljZSB1bmlxdWUgY29udGV4dCBpZCwgYW5kIHF1ZXVlcyBhIGNyZWF0ZSBjb250ZXh0IGNvbW1hbmQKQEAgLTI5Miw3ICsyNTEsNyBAQAogICogRFJNX1ZNV19FWEVDQlVGCiAgKgogICogU3VibWl0IGEgY29tbWFuZCBidWZmZXIgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgaG9zdCwgYW5kIHJldHVybiBhCi0gKiBmZW5jZSBzZXF1ZW5jZSB0aGF0IHdoZW4gc2lnbmFsZWQsIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIGJ1ZmZlciBoYXMKKyAqIGZlbmNlIHNlcW5vIHRoYXQgd2hlbiBzaWduYWxlZCwgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgYnVmZmVyIGhhcwogICogZXhlY3V0ZWQuCiAgKi8KIApAQCAtMzE0LDIxICsyNzMsMzAgQEAKICAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0VYRUNCVUYgSW9jdGwuCiAgKi8KIAotI2RlZmluZSBEUk1fVk1XX0VYRUNCVUZfVkVSU0lPTiAwCisjZGVmaW5lIERSTV9WTVdfRVhFQ0JVRl9WRVJTSU9OIDEKIAogc3RydWN0IGRybV92bXdfZXhlY2J1Zl9hcmcgewogCXVpbnQ2NF90IGNvbW1hbmRzOwogCXVpbnQzMl90IGNvbW1hbmRfc2l6ZTsKIAl1aW50MzJfdCB0aHJvdHRsZV91czsKIAl1aW50NjRfdCBmZW5jZV9yZXA7Ci0JIHVpbnQzMl90IHZlcnNpb247Ci0JIHVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgZmxhZ3M7CiB9OwogCiAvKioKICAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcAogICoKLSAqIEBmZW5jZV9zZXE6IEZlbmNlIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqIEBoYW5kbGU6IEZlbmNlIG9iamVjdCBoYW5kbGUgZm9yIGZlbmNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQgc3VibWlzc2lvbi4KKyAqIEBtYXNrOiBGZW5jZSBmbGFncyByZWxldmFudCBmb3IgdGhpcyBmZW5jZSBvYmplY3QuCisgKiBAc2Vxbm86IEZlbmNlIHNlcXVlbmNlIG51bWJlciBpbiBmaWZvLiBBIGZlbmNlIG9iamVjdCB3aXRoIGEgbG93ZXIKKyAqIHNlcW5vIHdpbGwgc2lnbmFsIHRoZSBFWEVDIGZsYWcgYmVmb3JlIGEgZmVuY2Ugb2JqZWN0IHdpdGggYSBoaWdoZXIKKyAqIHNlcW5vLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHVzZXItc3BhY2UgdG8gYXZvaWQga2VybmVsIGNhbGxzIHRvIGRldGVybWluZQorICogd2hldGhlciBhIGZlbmNlIGhhcyBzaWduYWxlZCB0aGUgRVhFQyBmbGFnLiBOb3RlIHRoYXQgQHNlcW5vIHdpbGwKKyAqIHdyYXAgYXQgMzItYml0LgorICogQHBhc3NlZF9zZXFubzogVGhlIGhpZ2hlc3Qgc2Vxbm8gbnVtYmVyIHByb2Nlc3NlZCBieSB0aGUgaGFyZHdhcmUKKyAqIHNvIGZhci4gVGhpcyBjYW4gYmUgdXNlZCB0byBtYXJrIHVzZXItc3BhY2UgZmVuY2Ugb2JqZWN0cyBhcyBzaWduYWxlZCwgYW5kCisgKiB0byBkZXRlcm1pbmUgd2hldGhlciBhIGZlbmNlIHNlcW5vIG1pZ2h0IGJlIHN0YWxlLgogICogQGVycm9yOiBUaGlzIG1lbWJlciBzaG91bGQndmUgYmVlbiBzZXQgdG8gLUVGQVVMVCBvbiBzdWJtaXNzaW9uLgogICogVGhlIGZvbGxvd2luZyBhY3Rpb25zIHNob3VsZCBiZSB0YWtlIG9uIGNvbXBsZXRpb246CiAgKiBlcnJvciA9PSAtRUZBVUxUOiBGZW5jZSBjb21tdW5pY2F0aW9uIGZhaWxlZC4gVGhlIGhvc3QgaXMgc3luY2hyb25pemVkLgpAQCAtMzQyLDkgKzMxMCwxMiBAQAogICovCiAKIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3JlcCB7Ci0JdWludDY0X3QgZmVuY2Vfc2VxOwotCWludDMyX3QgZXJyb3I7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IG1hc2s7CisJdWludDMyX3Qgc2Vxbm87CisJdWludDMyX3QgcGFzc2VkX3NlcW5vOwogCXVpbnQzMl90IHBhZDY0OworCWludDMyX3QgZXJyb3I7CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQzNSwzOSArNDA2LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKLSAqIERSTV9WTVdfRklGT19ERUJVRyAtIEdldCBsYXN0IEZJRk8gc3VibWlzc2lvbi4KLSAqCi0gKiBUaGlzIElPQ1RMIGNvcGllcyB0aGUgbGFzdCBGSUZPIHN1Ym1pc3Npb24gZGlyZWN0bHkgb3V0IG9mIHRoZSBGSUZPIGJ1ZmZlci4KLSAqLwotCi0vKioKLSAqIHN0cnVjdCBkcm1fdm13X2ZpZm9fZGVidWdfYXJnCi0gKgotICogQGRlYnVnX2J1ZmZlcjogVXNlciBzcGFjZSBhZGRyZXNzIG9mIGEgZGVidWdfYnVmZmVyIGNhc3QgdG8gYW4gdWludDY0X3QgLy9JbgotICogQGRlYnVnX2J1ZmZlcl9zaXplOiBTaXplIGluIGJ5dGVzIG9mIGRlYnVnIGJ1ZmZlciAvL0luCi0gKiBAdXNlZF9zaXplOiBOdW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBidWZmZXIgLy8gT3V0Ci0gKiBAZGlkX25vdF9maXQ6IEJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBmaWZvIGNvbnRlbnRzIGRpZCBub3QgZml0LiAvL091dAotICoKLSAqIEFyZ3VtZW50IHRvIHRoZSBEUk1fVk1XX0ZJRk9fREVCVUcgSW9jdGwuCi0gKi8KLQotc3RydWN0IGRybV92bXdfZmlmb19kZWJ1Z19hcmcgewotCXVpbnQ2NF90IGRlYnVnX2J1ZmZlcjsKLQl1aW50MzJfdCBkZWJ1Z19idWZmZXJfc2l6ZTsKLQl1aW50MzJfdCB1c2VkX3NpemU7Ci0JaW50MzJfdCBkaWRfbm90X2ZpdDsKLQl1aW50MzJfdCBwYWQ2NDsKLX07Ci0KLXN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnIHsKLQl1aW50NjRfdCBzZXF1ZW5jZTsKLQl1aW50NjRfdCBrZXJuZWxfY29va2llOwotCWludDMyX3QgY29va2llX3ZhbGlkOwotCWludDMyX3QgcGFkNjQ7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgogICogRFJNX1ZNV19DT05UUk9MX1NUUkVBTSAtIENvbnRyb2wgb3ZlcmxheXMsIGFrYSBzdHJlYW1zLgogICoKICAqIFRoaXMgSU9DVEwgY29udHJvbHMgdGhlIG92ZXJsYXkgdW5pdHMgb2YgdGhlIHN2Z2EgZGV2aWNlLgpAQCAtNTkwLDIyICs1MjgsMjU5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCisgKiBEUk1fVk1XX0dFVF8zRF9DQVAKKyAqCisgKiBSZWFkIDNEIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBGSUZPCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZ2V0XzNkX2NhcF9hcmcKKyAqCisgKiBAYnVmZmVyOiBQb2ludGVyIHRvIGEgYnVmZmVyIGZvciBjYXBhYmlsaXR5IGRhdGEsIGNhc3QgdG8gYW4gdWludDY0X3QKKyAqIEBzaXplOiBNYXggc2l6ZSB0byBjb3B5CisgKgorICogSW5wdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfR0VUXzNEX0NBUF9JT0NUTAorICogaW9jdGxzLgorICovCisKK3N0cnVjdCBkcm1fdm13X2dldF8zZF9jYXBfYXJnIHsKKwl1aW50NjRfdCBidWZmZXI7CisJdWludDMyX3QgbWF4X3NpemU7CisJdWludDMyX3QgcGFkNjQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRFJNX1ZNV19GRU5DRV9XQUlUCisgKgorICogV2FpdHMgZm9yIGEgZmVuY2Ugb2JqZWN0IHRvIHNpZ25hbC4gVGhlIHdhaXQgaXMgaW50ZXJydXB0aWJsZSwgc28gdGhhdAorICogc2lnbmFscyBtYXkgYmUgZGVsaXZlcmVkIGR1cmluZyB0aGUgaW50ZXJydXB0LiBUaGUgd2FpdCBtYXkgdGltZW91dCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIGNhbGxzIHJldHVybnMgLUVCVVNZLiBJZiB0aGUgd2FpdCBpcyByZXN0YXJ0ZWQsCisgKiB0aGF0IGlzIHJlc3RhcnRpbmcgd2l0aG91dCByZXNldHRpbmcgQGNvb2tpZV92YWxpZCB0byB6ZXJvLAorICogdGhlIHRpbWVvdXQgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZmlyc3QgY2FsbC4KKyAqCisgKiBUaGUgZmxhZ3MgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfV0FJVCBpb2N0bCBpbmRpY2F0ZXMgd2hhdCB0byB3YWl0CisgKiBvbjoKKyAqIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDOiBBbGwgY29tbWFuZHMgYWhlYWQgb2YgdGhlIGZlbmNlIGluIHRoZSBjb21tYW5kCisgKiBzdHJlYW0KKyAqIGhhdmUgZXhlY3V0ZWQuCisgKiBEUk1fVk1XX0ZFTkNFX0ZMQUdfUVVFUlk6IEFsbCBxdWVyeSByZXN1bHRzIHJlc3VsdGluZyBmcm9tIHF1ZXJ5IGZpbmlzaAorICogY29tbWFuZHMKKyAqIGluIHRoZSBidWZmZXIgZ2l2ZW4gdG8gdGhlIEVYRUNCVUYgaW9jdGwgcmV0dXJuaW5nIHRoZSBmZW5jZSBvYmplY3QgaGFuZGxlCisgKiBhcmUgYXZhaWxhYmxlIHRvIHVzZXItc3BhY2UuCisgKgorICogRFJNX1ZNV19XQUlUX09QVElPTl9VTlJFRjogSWYgdGhpcyB3YWl0IG9wdGlvbiBpcyBnaXZlbiwgYW5kIHRoZQorICogZmVuYyB3YWl0IGlvY3RsIHJldHVybnMgMCwgdGhlIGZlbmNlIG9iamVjdCBoYXMgYmVlbiB1bnJlZmVyZW5jZWQgYWZ0ZXIKKyAqIHRoZSB3YWl0LgorICovCisKKyNkZWZpbmUgRFJNX1ZNV19GRU5DRV9GTEFHX0VYRUMgICAoMSA8PCAwKQorI2RlZmluZSBEUk1fVk1XX0ZFTkNFX0ZMQUdfUVVFUlkgICgxIDw8IDEpCisKKyNkZWZpbmUgRFJNX1ZNV19XQUlUX09QVElPTl9VTlJFRiAoMSA8PCAwKQorCisvKioKKyAqIHN0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICogQGNvb2tpZV92YWxpZDogTXVzdCBiZSByZXNldCB0byAwIG9uIGZpcnN0IGNhbGwuIExlZnQgYWxvbmUgb24gcmVzdGFydC4KKyAqIEBrZXJuZWxfY29va2llOiBTZXQgdG8gMCBvbiBmaXJzdCBjYWxsLiBMZWZ0IGFsb25lIG9uIHJlc3RhcnQuCisgKiBAdGltZW91dF91czogV2FpdCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4gMCBmb3IgaW5kZWZpbml0ZSB0aW1lb3V0LgorICogQGxhenk6IFNldCB0byAxIGlmIHRpbWluZyBpcyBub3QgY3JpdGljYWwuIEFsbG93IG1vcmUgdGhhbiBhIGtlcm5lbCB0aWNrCisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICogQGZsYWdzOiBGZW5jZSBmbGFncyB0byB3YWl0IG9uLgorICogQHdhaXRfb3B0aW9uczogT3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIGJlaGF2aW91ciBvZiB0aGUgd2FpdCBpb2N0bC4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9XQUlUIGlvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X2ZlbmNlX3dhaXRfYXJnIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJaW50MzJfdCAgY29va2llX3ZhbGlkOworCXVpbnQ2NF90IGtlcm5lbF9jb29raWU7CisJdWludDY0X3QgdGltZW91dF91czsKKwlpbnQzMl90IGxhenk7CisJaW50MzJfdCBmbGFnczsKKwlpbnQzMl90IHdhaXRfb3B0aW9uczsKKwlpbnQzMl90IHBhZDY0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQKKyAqCisgKiBDaGVja3MgaWYgYSBmZW5jZSBvYmplY3QgaXMgc2lnbmFsZWQuLgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2Vfc2lnbmFsZWRfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICogQGZsYWdzOiBGZW5jZSBvYmplY3QgZmxhZ3MgaW5wdXQgdG8gRFJNX1ZNV19GRU5DRV9TSUdOQUxFRCBpb2N0bAorICogQHNpZ25hbGVkOiBPdXQ6IEZsYWdzIHNpZ25hbGVkLgorICogQHNlcXVlbmNlOiBPdXQ6IEhpZ2hlc3Qgc2VxdWVuY2UgcGFzc2VkIHNvIGZhci4gQ2FuIGJlIHVzZWQgdG8gc2lnbmFsIHRoZQorICogRVhFQyBmbGFnIG9mIHVzZXItc3BhY2UgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBJbnB1dC9PdXRwdXQgYXJndW1lbnQgdG8gdGhlIERSTV9WTVdfRkVOQ0VfU0lHTkFMRUQgYW5kIERSTV9WTVdfRkVOQ0VfVU5SRUYKKyAqIGlvY3Rscy4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9zaWduYWxlZF9hcmcgeworCSB1aW50MzJfdCBoYW5kbGU7CisJIHVpbnQzMl90IGZsYWdzOworCSBpbnQzMl90IHNpZ25hbGVkOworCSB1aW50MzJfdCBwYXNzZWRfc2Vxbm87CisJIHVpbnQzMl90IHNpZ25hbGVkX2ZsYWdzOworCSB1aW50MzJfdCBwYWQ2NDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX0ZFTkNFX1VOUkVGCisgKgorICogVW5yZWZlcmVuY2VzIGEgZmVuY2Ugb2JqZWN0LCBhbmQgY2F1c2VzIGl0IHRvIGJlIGRlc3Ryb3llZCBpZiB0aGVyZSBhcmUgbm8KKyAqIG90aGVyIHJlZmVyZW5jZXMgdG8gaXQuCisgKgorICovCisKKy8qKgorICogc3RydWN0IGRybV92bXdfZmVuY2VfYXJnCisgKgorICogQGhhbmRsZTogRmVuY2Ugb2JqZWN0IGhhbmRsZSBhcyByZXR1cm5lZCBieSB0aGUgRFJNX1ZNV19FWEVDQlVGIGlvY3RsLgorICoKKyAqIElucHV0L091dHB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19GRU5DRV9VTlJFRiBpb2N0bC4uCisgKi8KKworc3RydWN0IGRybV92bXdfZmVuY2VfYXJnIHsKKwkgdWludDMyX3QgaGFuZGxlOworCSB1aW50MzJfdCBwYWQ2NDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfRkVOQ0VfRVZFTlQKKyAqCisgKiBRdWV1ZXMgYW4gZXZlbnQgb24gYSBmZW5jZSB0byBiZSBkZWxpdmVyZWQgb24gdGhlIGRybSBjaGFyYWN0ZXIgZGV2aWNlCisgKiB3aGVuIHRoZSBmZW5jZSBoYXMgc2lnbmFsZWQgdGhlIERSTV9WTVdfRkVOQ0VfRkxBR19FWEVDIGZsYWcuCisgKiBPcHRpb25hbGx5IHRoZSBhcHByb3hpbWF0ZSB0aW1lIHdoZW4gdGhlIGZlbmNlIHNpZ25hbGVkIGlzCisgKiBnaXZlbiBieSB0aGUgZXZlbnQuCisgKi8KKworLyoKKyAqIFRoZSBldmVudCB0eXBlCisgKi8KKyNkZWZpbmUgRFJNX1ZNV19FVkVOVF9GRU5DRV9TSUdOQUxFRCAweDgwMDAwMDAwCisKK3N0cnVjdCBkcm1fdm13X2V2ZW50X2ZlbmNlIHsKKwlzdHJ1Y3QgZHJtX2V2ZW50IGJhc2U7CisJdWludDY0X3QgdXNlcl9kYXRhOworCXVpbnQzMl90IHR2X3NlYzsKKwl1aW50MzJfdCB0dl91c2VjOworfTsKKworLyoKKyAqIEZsYWdzIHRoYXQgbWF5IGJlIGdpdmVuIHRvIHRoZSBjb21tYW5kLgorICovCisvKiBSZXF1ZXN0IGZlbmNlIHNpZ25hbGVkIHRpbWUgb24gdGhlIGV2ZW50LiAqLworI2RlZmluZSBEUk1fVk1XX0ZFX0ZMQUdfUkVRX1RJTUUgKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19mZW5jZV9ldmVudF9hcmcKKyAqCisgKiBAZmVuY2VfcmVwOiBQb2ludGVyIHRvIGZlbmNlX3JlcCBzdHJ1Y3R1cmUgY2FzdCB0byB1aW50NjRfdCBvciAwIGlmCisgKiB0aGUgZmVuY2UgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlZmVyZW5jZWQgYnkgdXNlci1zcGFjZS4KKyAqIEB1c2VyX2luZm86IEluZm8gdG8gYmUgZGVsaXZlcmVkIHdpdGggdGhlIGV2ZW50LgorICogQGhhbmRsZTogQXR0YWNoIHRoZSBldmVudCB0byB0aGlzIGZlbmNlIG9ubHkuCisgKiBAZmxhZ3M6IEEgc2V0IG9mIGZsYWdzIGFzIGRlZmluZWQgYWJvdmUuCisgKi8KK3N0cnVjdCBkcm1fdm13X2ZlbmNlX2V2ZW50X2FyZyB7CisJdWludDY0X3QgZmVuY2VfcmVwOworCXVpbnQ2NF90IHVzZXJfZGF0YTsKKwl1aW50MzJfdCBoYW5kbGU7CisJdWludDMyX3QgZmxhZ3M7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBEUk1fVk1XX1BSRVNFTlQKKyAqCisgKiBFeGVjdXRlcyBhbiBTVkdBIHByZXNlbnQgb24gYSBnaXZlbiBmYiBmb3IgYSBnaXZlbiBzdXJmYWNlLiBUaGUgc3VyZmFjZQorICogaXMgcGxhY2VkIG9uIHRoZSBmcmFtZWJ1ZmZlci4gQ2xpcHJlY3RzIGFyZSBnaXZlbiByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4KKyAqIHBvaW50ICh0aGUgcG9pbnQgZGlzaWduYXRlZCBieSBkZXN0X3t4fHl9KS4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZworICogQGZiX2lkOiBmcmFtZWJ1ZmZlciBpZCB0byBwcmVzZW50IC8gcmVhZCBiYWNrIGZyb20uCisgKiBAc2lkOiBTdXJmYWNlIGlkIHRvIHByZXNlbnQgZnJvbS4KKyAqIEBkZXN0X3g6IFggcGxhY2VtZW50IGNvb3JkaW5hdGUgZm9yIHN1cmZhY2UuCisgKiBAZGVzdF95OiBZIHBsYWNlbWVudCBjb29yZGluYXRlIGZvciBzdXJmYWNlLgorICogQGNsaXBzX3B0cjogUG9pbnRlciB0byBhbiBhcnJheSBvZiBjbGlwIHJlY3RzIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBAbnVtX2NsaXBzOiBOdW1iZXIgb2YgY2xpcHJlY3RzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBmcmFtZWJ1ZmZlciBvcmlnaW4sCisgKiBpbiB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBmcmFtZSBidWZmZXIuCisgKiBAcGFkNjQ6IFVudXNlZCA2NC1iaXQgcGFkZGluZy4KKyAqCisgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19QUkVTRU5UIGlvY3RsLgorICovCisKK3N0cnVjdCBkcm1fdm13X3ByZXNlbnRfYXJnIHsKKwl1aW50MzJfdCBmYl9pZDsKKwl1aW50MzJfdCBzaWQ7CisJaW50MzJfdCBkZXN0X3g7CisJaW50MzJfdCBkZXN0X3k7CisJdWludDY0X3QgY2xpcHNfcHRyOworCXVpbnQzMl90IG51bV9jbGlwczsKKwl1aW50MzJfdCBwYWQ2NDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIERSTV9WTVdfUFJFU0VOVF9SRUFEQkFDSworICoKKyAqIEV4ZWN1dGVzIGFuIFNWR0EgcHJlc2VudCByZWFkYmFjayBmcm9tIGEgZ2l2ZW4gZmIgdG8gdGhlIGRtYSBidWZmZXIKKyAqIGN1cnJlbnRseSBib3VuZCBhcyB0aGUgZmIuIElmIHRoZXJlIGlzIG5vIGRtYSBidWZmZXIgYm91bmQgdG8gdGhlIGZiLAorICogYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X2FyZworICogQGZiX2lkOiBmYl9pZCB0byBwcmVzZW50IC8gcmVhZCBiYWNrIGZyb20uCisgKiBAbnVtX2NsaXBzOiBOdW1iZXIgb2YgY2xpcHJlY3RzLgorICogQGNsaXBzX3B0cjogUG9pbnRlciB0byBhbiBhcnJheSBvZiBjbGlwIHJlY3RzIGNhc3QgdG8gYW4gdWludDY0X3QuCisgKiBAZmVuY2VfcmVwOiBQb2ludGVyIHRvIGEgc3RydWN0IGRybV92bXdfZmVuY2VfcmVwLCBjYXN0IHRvIGFuIHVpbnQ2NF90LgorICogSWYgdGhpcyBtZW1iZXIgaXMgTlVMTCwgdGhlbiB0aGUgaW9jdGwgc2hvdWxkIG5vdCByZXR1cm4gYSBmZW5jZS4KKyAqLworCitzdHJ1Y3QgZHJtX3Ztd19wcmVzZW50X3JlYWRiYWNrX2FyZyB7CisJIHVpbnQzMl90IGZiX2lkOworCSB1aW50MzJfdCBudW1fY2xpcHM7CisJIHVpbnQ2NF90IGNsaXBzX3B0cjsKKwkgdWludDY0X3QgZmVuY2VfcmVwOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKICAqIERSTV9WTVdfVVBEQVRFX0xBWU9VVCAtIFVwZGF0ZSBsYXlvdXQKICAqCiAgKiBVcGRhdGVzIHRoZSBwcmVmZXJyZWQgbW9kZXMgYW5kIGNvbm5lY3Rpb24gc3RhdHVzIGZvciBjb25uZWN0b3JzLiBUaGUKLSAqIGNvbW1hbmQgY29uaXNpdHMgb2Ygb25lIGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgcG9pbnRpbmcgb3V0IGEgYXJyYXkKKyAqIGNvbW1hbmQgY29uc2lzdHMgb2Ygb25lIGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcgcG9pbnRpbmcgdG8gYW4gYXJyYXkKICAqIG9mIG51bV9vdXRwdXRzIGRybV92bXdfcmVjdCdzLgogICovCiAKIC8qKgogICogc3RydWN0IGRybV92bXdfdXBkYXRlX2xheW91dF9hcmcKICAqCi0gKiBAbnVtX291dHB1dHM6IG51bWJlciBvZiBhY3RpdmUKLSAqIEByZWN0czogcG9pbnRlciB0byBhcnJheSBvZiBkcm1fdm13X3JlY3QKKyAqIEBudW1fb3V0cHV0czogbnVtYmVyIG9mIGFjdGl2ZSBjb25uZWN0b3JzCisgKiBAcmVjdHM6IHBvaW50ZXIgdG8gYXJyYXkgb2YgZHJtX3Ztd19yZWN0IGNhc3QgdG8gYW4gdWludDY0X3QKICAqCiAgKiBJbnB1dCBhcmd1bWVudCB0byB0aGUgRFJNX1ZNV19VUERBVEVfTEFZT1VUIElvY3RsLgogICovCi0KIHN0cnVjdCBkcm1fdm13X3VwZGF0ZV9sYXlvdXRfYXJnIHsKIAl1aW50MzJfdCBudW1fb3V0cHV0czsKIAl1aW50MzJfdCBwYWQ2NDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWlvLmggYi9pbmNsdWRlL2xpbnV4L2Fpby5oCmluZGV4IDJkY2I3MmIuLjIzMTRhZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9haW8uaApAQCAtMTE3LDYgKzExNyw3IEBACiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWtpX2xpc3Q7CS8qIHRoZSBhaW8gY29yZSB1c2VzIHRoaXMKIAkJCQkJCSAqIGZvciBjYW5jZWxsYXRpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWtpX2JhdGNoOwkvKiBiYXRjaCBhbGxvY2F0aW9uICovCiAKIAkvKgogCSAqIElmIHRoZSBhaW9fcmVzZmQgZmllbGQgb2YgdGhlIHVzZXJzcGFjZSBpb2NiIGlzIG5vdCB6ZXJvLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbWJhL3BsMDYxLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwNjEuaAppbmRleCA1ZGRkOWFkLi4yNDEyYWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwNjEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwNjEuaApAQCAtNyw4ICs3LDcgQEAKIAl1bnNpZ25lZAlncGlvX2Jhc2U7CiAKIAkvKiBudW1iZXIgb2YgdGhlIGZpcnN0IElSUS4KLQkgKiBJZiB0aGUgSVJRIGZ1bmN0aW9uYWxpdHkgaW4gbm90IGRlc2lyZWQgdGhpcyBtdXN0IGJlIHNldCB0bwotCSAqICh1bnNpZ25lZCkgLTEuCisJICogSWYgdGhlIElSUSBmdW5jdGlvbmFsaXR5IGluIG5vdCBkZXNpcmVkIHRoaXMgbXVzdCBiZSBzZXQgdG8gTk9fSVJRLgogCSAqLwogCXVuc2lnbmVkCWlycV9iYXNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwOHguaCBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCmluZGV4IGU2ZTI4ZjMuLjllYWJmZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCkBAIC00Nyw2ICs0Nyw5IEBACiAgKiBAbXV4dmFsOiBhIG51bWJlciB1c3VhbGx5IHVzZWQgdG8gcG9rZSBpbnRvIHNvbWUgbXV4IHJlZ2lzZXIgdG8KICAqIG11eCBpbiB0aGUgc2lnbmFsIHRvIHRoaXMgY2hhbm5lbAogICogQGNjdGxfb3B0OiBkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjaGFubmVsIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEBkZXZpY2VfZmM6IEZsb3cgQ29udHJvbGxlciBTZXR0aW5ncyBmb3IgY2NmZyByZWdpc3Rlci4gT25seSB2YWxpZCBmb3Igc2xhdmUKKyAqIGNoYW5uZWxzLiBGaWxsIHdpdGggJ3RydWUnIGlmIHBlcmlwaGVyYWwgc2hvdWxkIGJlIGZsb3cgY29udHJvbGxlci4gRGlyZWN0aW9uCisgKiB3aWxsIGJlIHNlbGVjdGVkIGF0IFJ1bnRpbWUuCiAgKiBAYWRkcjogc291cmNlL3RhcmdldCBhZGRyZXNzIGluIHBoeXNpY2FsIG1lbW9yeSBmb3IgdGhpcyBETUEgY2hhbm5lbCwKICAqIGNhbiBiZSB0aGUgYWRkcmVzcyBvZiBhIEZJRk8gcmVnaXN0ZXIgZm9yIGJ1cnN0IHJlcXVlc3RzIGZvciBleGFtcGxlLgogICogVGhpcyBjYW4gYmUgbGVmdCB1bmRlZmluZWQgaWYgdGhlIFByaW1lQ2VsbCBBUEkgaXMgdXNlZCBmb3IgY29uZmlndXJpbmcKQEAgLTY1LDYgKzY4LDcgQEAKIAlpbnQgbWF4X3NpZ25hbDsKIAl1MzIgbXV4dmFsOwogCXUzMiBjY3RsOworCWJvb2wgZGV2aWNlX2ZjOwogCWRtYV9hZGRyX3QgYWRkcjsKIAlib29sIGNpcmN1bGFyX2J1ZmZlcjsKIAlib29sIHNpbmdsZTsKQEAgLTc3LDEzICs4MSwxMSBAQAogICogQGFkZHI6IGN1cnJlbnQgYWRkcmVzcwogICogQG1heHdpZHRoOiB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHRyYW5zZmVyIG9uIHRoaXMgYnVzCiAgKiBAYnVzd2lkdGg6IHRoZSB3aWR0aCBvZiB0aGlzIGJ1cyBpbiBieXRlczogMSwgMiBvciA0Ci0gKiBAZmlsbF9ieXRlczogYnl0ZXMgcmVxdWlyZWQgdG8gZmlsbCB0byB0aGUgbmV4dCBidXMgbWVtb3J5IGJvdW5kYXJ5CiAgKi8KIHN0cnVjdCBwbDA4eF9idXNfZGF0YSB7CiAJZG1hX2FkZHJfdCBhZGRyOwogCXU4IG1heHdpZHRoOwogCXU4IGJ1c3dpZHRoOwotCXNpemVfdCBmaWxsX2J5dGVzOwogfTsKIAogLyoqCkBAIC0xMDQsMTcgKzEwNiwzNSBAQAogfTsKIAogLyoqCisgKiBzdHJ1Y3QgcGwwOHhfc2cgLSBzdHJ1Y3R1cmUgY29udGFpbmluZyBkYXRhIHBlciBzZworICogQHNyY19hZGRyOiBzcmMgYWRkcmVzcyBvZiBzZworICogQGRzdF9hZGRyOiBkc3QgYWRkcmVzcyBvZiBzZworICogQGxlbjogdHJhbnNmZXIgbGVuIGluIGJ5dGVzCisgKiBAbm9kZTogbm9kZSBmb3IgdHhkJ3MgZHNnX2xpc3QKKyAqLworc3RydWN0IHBsMDh4X3NnIHsKKwlkbWFfYWRkcl90IHNyY19hZGRyOworCWRtYV9hZGRyX3QgZHN0X2FkZHI7CisJc2l6ZV90IGxlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisvKioKICAqIHN0cnVjdCBwbDA4eF90eGQgLSB3cmFwcGVyIGZvciBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IKKyAqIEB0eDogYXN5bmMgdHggZGVzY3JpcHRvcgorICogQG5vZGU6IG5vZGUgZm9yIHR4ZCBsaXN0IGZvciBjaGFubmVscworICogQGRzZ19saXN0OiBsaXN0IG9mIGNoaWxkcmVuIHNnJ3MKKyAqIEBkaXJlY3Rpb246IGRpcmVjdGlvbiBvZiB0cmFuc2ZlcgogICogQGxsaXNfYnVzOiBETUEgbWVtb3J5IGFkZHJlc3MgKHBoeXNpY2FsKSBzdGFydCBmb3IgdGhlIExMSXMKICAqIEBsbGlzX3ZhOiB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHN0YXJ0IGZvciB0aGUgTExJcworICogQGNjdGw6IGNvbnRyb2wgcmVnIHZhbHVlcyBmb3IgY3VycmVudCB0eGQKKyAqIEBjY2ZnOiBjb25maWcgcmVnIHZhbHVlcyBmb3IgY3VycmVudCB0eGQKICAqLwogc3RydWN0IHBsMDh4X3R4ZCB7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yIHR4OwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRzZ19saXN0OwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCWRpcmVjdGlvbjsKLQlkbWFfYWRkcl90IHNyY19hZGRyOwotCWRtYV9hZGRyX3QgZHN0X2FkZHI7Ci0Jc2l6ZV90IGxlbjsKIAlkbWFfYWRkcl90IGxsaXNfYnVzOwogCXN0cnVjdCBwbDA4eF9sbGkgKmxsaXNfdmE7CiAJLyogRGVmYXVsdCBjY3RsIHZhbHVlIGZvciBMTElzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwzMzAuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDMzMC5oCmluZGV4IGNiZWU3ZGUuLmQxMmYwNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDMzMC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDMzMC5oCkBAIC0xOSwxMiArMTksOCBAQAogCSAqIFBlcmlfUmVxIGkvZiBvZiB0aGUgRE1BQyB0aGF0IGlzCiAJICogcGVyaXBoZXJhbCBjb3VsZCBiZSByZWFjaGVkIGZyb20uCiAJICovCi0JdTggcGVyaV9pZDsgLyogezAsIDMxfSAqLworCXU4IHBlcmlfaWQ7IC8qIHNwZWNpZmljIGRtYSBpZCAqLwogCWVudW0gcGwzMzBfcmVxdHlwZSBycXR5cGU7Ci0KLQkvKiBGb3IgTS0+RCBhbmQgRC0+TSBDaGFubmVscyAqLwotCWludCBidXJzdF9zejsgLyogaW4gcG93ZXIgb2YgMiAqLwotCWRtYV9hZGRyX3QgZmlmb19hZGRyOwogfTsKIAogc3RydWN0IGRtYV9wbDMzMF9wbGF0ZGF0YSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsLW1jaS5oIGIvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaAppbmRleCAzZTA5YjM0Li40YzdhNGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWVsLW1jaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fTElOVVhfQVRNRUxfTUNJX0gKICNkZWZpbmUgX19MSU5VWF9BVE1FTF9NQ0lfSAogCi0jZGVmaW5lIEFUTUVMX01DSV9NQVhfTlJfU0xPVFMJMgorI2RlZmluZSBBVE1DSV9NQVhfTlJfU0xPVFMJMgogCiAvKioKICAqIHN0cnVjdCBtY2lfc2xvdF9wZGF0YSAtIGJvYXJkLXNwZWNpZmljIHBlci1zbG90IGNvbmZpZ3VyYXRpb24KQEAgLTMzLDcgKzMzLDcgQEAKICAqLwogc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgbWNpX2RtYV9kYXRhCSpkbWFfc2xhdmU7Ci0Jc3RydWN0IG1jaV9zbG90X3BkYXRhCXNsb3RbQVRNRUxfTUNJX01BWF9OUl9TTE9UU107CisJc3RydWN0IG1jaV9zbG90X3BkYXRhCXNsb3RbQVRNQ0lfTUFYX05SX1NMT1RTXTsKIH07CiAKICNlbmRpZiAvKiBfX0xJTlVYX0FUTUVMX01DSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3BkYy5oIGIvaW5jbHVkZS9saW51eC9hdG1lbF9wZGMuaAppbmRleCA1MDU4YTMxLi42MzQ5OWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3BkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWxfcGRjLmgKQEAgLTMzLDQgKzMzLDYgQEAKIAogI2RlZmluZSBBVE1FTF9QRENfUFRTUgkJMHgxMjQJLyogVHJhbnNmZXIgU3RhdHVzIFJlZ2lzdGVyICovCiAKKyNkZWZpbmUgQVRNRUxfUERDX1NDTkRfQlVGX09GRgkweDEwCS8qIE9mZnNldCBiZXR3ZWVuIGZpcnN0IGFuZCBzZWNvbmQgYnVmZmVyIHJlZ2lzdGVycyAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvYXVkaXQuaAppbmRleCAwYzgwMDYxLi4yZjgxYzZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC01ODQsMTQgKzU4NCwxMyBAQAogI2lmZGVmIENPTkZJR19BVURJVAogLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gYXVkaXQuYyAqLwogCQkJCS8qIFB1YmxpYyBBUEkgKi8KLWV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nKHN0cnVjdCBhdWRpdF9jb250ZXh0ICpjdHgsIGdmcF90IGdmcF9tYXNrLAotCQkJCSAgICAgIGludCB0eXBlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCQkgICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDQsNSkpKTsKK2V4dGVybiBfX3ByaW50Zig0LCA1KQordm9pZCBhdWRpdF9sb2coc3RydWN0IGF1ZGl0X2NvbnRleHQgKmN0eCwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB0eXBlLAorCSAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGV4dGVybiBzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9sb2dfc3RhcnQoc3RydWN0IGF1ZGl0X2NvbnRleHQgKmN0eCwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB0eXBlKTsKLWV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2Zvcm1hdChzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwKLQkJCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDIsMykpKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQordm9pZCBhdWRpdF9sb2dfZm9ybWF0KHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gdm9pZAkJICAgIGF1ZGl0X2xvZ19lbmQoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIpOwogZXh0ZXJuIGludAkJICAgIGF1ZGl0X3N0cmluZ19jb250YWluc19jb250cm9sKGNvbnN0IGNoYXIgKnN0cmluZywKIAkJCQkJCQkgIHNpemVfdCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oIGIvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCmluZGV4IDNiMmY5Y2IuLmIxMDM4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTQwLDYgKzQwLDcgQEAKIGVudW0gYmRpX3N0YXRfaXRlbSB7CiAJQkRJX1JFQ0xBSU1BQkxFLAogCUJESV9XUklURUJBQ0ssCisJQkRJX0RJUlRJRUQsCiAJQkRJX1dSSVRURU4sCiAJTlJfQkRJX1NUQVRfSVRFTVMKIH07CkBAIC03NCwxMCArNzUsMjAgQEAKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgYmRpX3N0YXRbTlJfQkRJX1NUQVRfSVRFTVNdOwogCiAJdW5zaWduZWQgbG9uZyBid190aW1lX3N0YW1wOwkvKiBsYXN0IHRpbWUgd3JpdGUgYncgaXMgdXBkYXRlZCAqLworCXVuc2lnbmVkIGxvbmcgZGlydGllZF9zdGFtcDsKIAl1bnNpZ25lZCBsb25nIHdyaXR0ZW5fc3RhbXA7CS8qIHBhZ2VzIHdyaXR0ZW4gYXQgYndfdGltZV9zdGFtcCAqLwogCXVuc2lnbmVkIGxvbmcgd3JpdGVfYmFuZHdpZHRoOwkvKiB0aGUgZXN0aW1hdGVkIHdyaXRlIGJhbmR3aWR0aCAqLwogCXVuc2lnbmVkIGxvbmcgYXZnX3dyaXRlX2JhbmR3aWR0aDsgLyogZnVydGhlciBzbW9vdGhlZCB3cml0ZSBidyAqLwogCisJLyoKKwkgKiBUaGUgYmFzZSBkaXJ0eSB0aHJvdHRsZSByYXRlLCByZS1jYWxjdWxhdGVkIG9uIGV2ZXJ5IDIwMG1zLgorCSAqIEFsbCB0aGUgYmRpIHRhc2tzJyBkaXJ0eSByYXRlIHdpbGwgYmUgY3VyYmVkIHVuZGVyIGl0LgorCSAqIEBkaXJ0eV9yYXRlbGltaXQgdHJhY2tzIHRoZSBlc3RpbWF0ZWQgQGJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdAorCSAqIGluIHNtYWxsIHN0ZXBzIGFuZCBpcyBtdWNoIG1vcmUgc21vb3RoL3N0YWJsZSB0aGFuIHRoZSBsYXR0ZXIuCisJICovCisJdW5zaWduZWQgbG9uZyBkaXJ0eV9yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQ7CisKIAlzdHJ1Y3QgcHJvcF9sb2NhbF9wZXJjcHUgY29tcGxldGlvbnM7CiAJaW50IGRpcnR5X2V4Y2VlZGVkOwogCkBAIC0xMDcsNyArMTE4LDggQEAKIGludCBiZGlfcmVnaXN0ZXJfZGV2KHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGRldl90IGRldik7CiB2b2lkIGJkaV91bnJlZ2lzdGVyKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpOwogaW50IGJkaV9zZXR1cF9hbmRfcmVnaXN0ZXIoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotdm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMpOwordm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMsCisJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pOwogdm9pZCBiZGlfc3RhcnRfYmFja2dyb3VuZF93cml0ZWJhY2soc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSk7CiBpbnQgYmRpX3dyaXRlYmFja190aHJlYWQodm9pZCAqZGF0YSk7CiBpbnQgYmRpX2hhc19kaXJ0eV9pbyhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCmluZGV4IDVkYmQ3MDUuLmY0YjgzNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaApAQCAtMTcwLDEwICsxNzAsOSBAQAogfTsKIGV4dGVybgogaW50IF9fYmNtYV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgaW50IGJjbWFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBiY21hX2RyaXZlciAqZHJ2KQotewotCXJldHVybiBfX2JjbWFfZHJpdmVyX3JlZ2lzdGVyKGRydiwgVEhJU19NT0RVTEUpOwotfQorI2RlZmluZSBiY21hX2RyaXZlcl9yZWdpc3RlcihkcnYpIFwKKwlfX2JjbWFfZHJpdmVyX3JlZ2lzdGVyKGRydiwgVEhJU19NT0RVTEUpCisKIGV4dGVybiB2b2lkIGJjbWFfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJpdmVyICpkcnYpOwogCiBzdHJ1Y3QgYmNtYV9idXMgewpAQCAtMjA2LDYxICsyMDUsODIgQEAKIAlzdHJ1Y3Qgc3NiX3Nwcm9tIHNwcm9tOwogfTsKIAotZXh0ZXJuIGlubGluZSB1MzIgYmNtYV9yZWFkOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBiY21hX3JlYWQ4KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKIAlyZXR1cm4gY29yZS0+YnVzLT5vcHMtPnJlYWQ4KGNvcmUsIG9mZnNldCk7CiB9Ci1leHRlcm4gaW5saW5lIHUzMiBiY21hX3JlYWQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBiY21hX3JlYWQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCiB7CiAJcmV0dXJuIGNvcmUtPmJ1cy0+b3BzLT5yZWFkMTYoY29yZSwgb2Zmc2V0KTsKIH0KLWV4dGVybiBpbmxpbmUgdTMyIGJjbWFfcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGJjbWFfcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKIAlyZXR1cm4gY29yZS0+YnVzLT5vcHMtPnJlYWQzMihjb3JlLCBvZmZzZXQpOwogfQotZXh0ZXJuIGlubGluZQorc3RhdGljIGlubGluZQogdm9pZCBiY21hX3dyaXRlOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKIAljb3JlLT5idXMtPm9wcy0+d3JpdGU4KGNvcmUsIG9mZnNldCwgdmFsdWUpOwogfQotZXh0ZXJuIGlubGluZQorc3RhdGljIGlubGluZQogdm9pZCBiY21hX3dyaXRlMTYoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CiAJY29yZS0+YnVzLT5vcHMtPndyaXRlMTYoY29yZSwgb2Zmc2V0LCB2YWx1ZSk7CiB9Ci1leHRlcm4gaW5saW5lCitzdGF0aWMgaW5saW5lCiB2b2lkIGJjbWFfd3JpdGUzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKIAljb3JlLT5idXMtPm9wcy0+d3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIH0KICNpZmRlZiBDT05GSUdfQkNNQV9CTE9DS0lPCi1leHRlcm4gaW5saW5lIHZvaWQgYmNtYV9ibG9ja19yZWFkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdm9pZCAqYnVmZmVyLAorc3RhdGljIGlubGluZSB2b2lkIGJjbWFfYmxvY2tfcmVhZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHZvaWQgKmJ1ZmZlciwKIAkJCQkgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKIHsKIAljb3JlLT5idXMtPm9wcy0+YmxvY2tfcmVhZChjb3JlLCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7CiB9Ci1leHRlcm4gaW5saW5lIHZvaWQgYmNtYV9ibG9ja193cml0ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9ibG9ja193cml0ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsCisJCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJCSAgICB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpCiB7CiAJY29yZS0+YnVzLT5vcHMtPmJsb2NrX3dyaXRlKGNvcmUsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKIH0KICNlbmRpZgotZXh0ZXJuIGlubGluZSB1MzIgYmNtYV9hcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGJjbWFfYXJlYWQzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCiB7CiAJcmV0dXJuIGNvcmUtPmJ1cy0+b3BzLT5hcmVhZDMyKGNvcmUsIG9mZnNldCk7CiB9Ci1leHRlcm4gaW5saW5lCitzdGF0aWMgaW5saW5lCiB2b2lkIGJjbWFfYXdyaXRlMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CiAJY29yZS0+YnVzLT5vcHMtPmF3cml0ZTMyKGNvcmUsIG9mZnNldCwgdmFsdWUpOwogfQogCi0jZGVmaW5lIGJjbWFfbWFzazMyKGNjLCBvZmZzZXQsIG1hc2spIFwKLQliY21hX3dyaXRlMzIoY2MsIG9mZnNldCwgYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiAobWFzaykpCi0jZGVmaW5lIGJjbWFfc2V0MzIoY2MsIG9mZnNldCwgc2V0KSBcCi0JYmNtYV93cml0ZTMyKGNjLCBvZmZzZXQsIGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpIHwgKHNldCkpCi0jZGVmaW5lIGJjbWFfbWFza3NldDMyKGNjLCBvZmZzZXQsIG1hc2ssIHNldCkgXAotCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiAobWFzaykpIHwgKHNldCkpCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjYywgdTE2IG9mZnNldCwgdTMyIG1hc2spCit7CisJYmNtYV93cml0ZTMyKGNjLCBvZmZzZXQsIGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpICYgbWFzayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9zZXQzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjLCB1MTYgb2Zmc2V0LCB1MzIgc2V0KQoreworCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCBiY21hX3JlYWQzMihjYywgb2Zmc2V0KSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrc2V0MzIoc3RydWN0IGJjbWFfZGV2aWNlICpjYywKKwkJCQkgIHUxNiBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgc2V0KQoreworCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrMTYoc3RydWN0IGJjbWFfZGV2aWNlICpjYywgdTE2IG9mZnNldCwgdTE2IG1hc2spCit7CisJYmNtYV93cml0ZTE2KGNjLCBvZmZzZXQsIGJjbWFfcmVhZDE2KGNjLCBvZmZzZXQpICYgbWFzayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9zZXQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjLCB1MTYgb2Zmc2V0LCB1MTYgc2V0KQoreworCWJjbWFfd3JpdGUxNihjYywgb2Zmc2V0LCBiY21hX3JlYWQxNihjYywgb2Zmc2V0KSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrc2V0MTYoc3RydWN0IGJjbWFfZGV2aWNlICpjYywKKwkJCQkgIHUxNiBvZmZzZXQsIHUxNiBtYXNrLCB1MTYgc2V0KQoreworCWJjbWFfd3JpdGUxNihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMTYoY2MsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Cit9CiAKIGV4dGVybiBib29sIGJjbWFfY29yZV9pc19lbmFibGVkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSk7CiBleHRlcm4gdm9pZCBiY21hX2NvcmVfZGlzYWJsZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaAppbmRleCAxNTI2ZDk2Li5hMzMwODZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmgKQEAgLTIwMyw2ICsyMDMsNyBAQAogI2RlZmluZSBCQ01BX0NDX1BNVV9DVEwJCQkweDA2MDAgLyogUE1VIGNvbnRyb2wgKi8KICNkZWZpbmUgIEJDTUFfQ0NfUE1VX0NUTF9JTFBfRElWCTB4RkZGRjAwMDAgLyogSUxQIGRpdiBtYXNrICovCiAjZGVmaW5lICBCQ01BX0NDX1BNVV9DVExfSUxQX0RJVl9TSElGVAkxNgorI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQJMHgwMDAwMDQwMAogI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX05PSUxQT05XCTB4MDAwMDAyMDAgLyogTm8gSUxQIG9uIHdhaXQgKi8KICNkZWZpbmUgIEJDTUFfQ0NfUE1VX0NUTF9IVFJFUUVOCTB4MDAwMDAxMDAgLyogSFQgcmVxIGVuYWJsZSAqLwogI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX0FMUFJFUUVOCTB4MDAwMDAwODAgLyogQUxQIHJlcSBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmlvLmggYi9pbmNsdWRlL2xpbnV4L2Jpby5oCmluZGV4IGNlMzNlNjguLmEzYzA3MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW8uaApAQCAtMjY5LDE0ICsyNjksNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBidmVjX25yX3ZlY3ModW5zaWduZWQgc2hvcnQgaWR4KTsKIAogLyoKLSAqIEFsbG93IHF1ZXVlciB0byBzcGVjaWZ5IGEgY29tcGxldGlvbiBDUFUgZm9yIHRoaXMgYmlvCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiaW9fc2V0X2NvbXBsZXRpb25fY3B1KHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGNwdSkKLXsKLQliaW8tPmJpX2NvbXBfY3B1ID0gY3B1OwotfQotCi0vKgogICogYmlvX3NldCBpcyB1c2VkIHRvIGFsbG93IG90aGVyIHBvcnRpb25zIG9mIHRoZSBJTyBzeXN0ZW0gdG8KICAqIGFsbG9jYXRlIHRoZWlyIG93biBwcml2YXRlIG1lbW9yeSBwb29scyBmb3IgYmlvIGFuZCBpb3ZlYyBzdHJ1Y3R1cmVzLgogICogVGhlc2UgbWVtb3J5IHBvb2xzIGluIHR1cm4gYWxsIGFsbG9jYXRlIGZyb20gdGhlIGJpb19zbGFiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAppbmRleCA3MWZjNTNiLi40MDUzY2JkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKQEAgLTU5LDggKzU5LDYgQEAKIAogCXVuc2lnbmVkIGludAkJYmlfbWF4X3ZlY3M7CS8qIG1heCBidmxfdmVjcyB3ZSBjYW4gaG9sZCAqLwogCi0JdW5zaWduZWQgaW50CQliaV9jb21wX2NwdTsJLyogY29tcGxldGlvbiBDUFUgKi8KLQogCWF0b21pY190CQliaV9jbnQ7CQkvKiBwaW4gY291bnQgKi8KIAogCXN0cnVjdCBiaW9fdmVjCQkqYmlfaW9fdmVjOwkvKiB0aGUgYWN0dWFsIHZlYyBsaXN0ICovCkBAIC05MywxMSArOTEsMTAgQEAKICNkZWZpbmUgQklPX0JPVU5DRUQJNQkvKiBiaW8gaXMgYSBib3VuY2UgYmlvICovCiAjZGVmaW5lIEJJT19VU0VSX01BUFBFRCA2CS8qIGNvbnRhaW5zIHVzZXIgcGFnZXMgKi8KICNkZWZpbmUgQklPX0VPUE5PVFNVUFAJNwkvKiBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIEJJT19DUFVfQUZGSU5FCTgJLyogY29tcGxldGUgYmlvIG9uIHNhbWUgQ1BVIGFzIHN1Ym1pdHRlZCAqLwotI2RlZmluZSBCSU9fTlVMTF9NQVBQRUQgOQkvKiBjb250YWlucyBpbnZhbGlkIHVzZXIgcGFnZXMgKi8KLSNkZWZpbmUgQklPX0ZTX0lOVEVHUklUWSAxMAkvKiBmcyBvd25zIGludGVncml0eSBkYXRhLCBub3QgYmxvY2sgbGF5ZXIgKi8KLSNkZWZpbmUgQklPX1FVSUVUCTExCS8qIE1ha2UgQklPIFF1aWV0ICovCi0jZGVmaW5lIEJJT19NQVBQRURfSU5URUdSSVRZIDEyLyogaW50ZWdyaXR5IG1ldGFkYXRhIGhhcyBiZWVuIHJlbWFwcGVkICovCisjZGVmaW5lIEJJT19OVUxMX01BUFBFRCA4CS8qIGNvbnRhaW5zIGludmFsaWQgdXNlciBwYWdlcyAqLworI2RlZmluZSBCSU9fRlNfSU5URUdSSVRZIDkJLyogZnMgb3ducyBpbnRlZ3JpdHkgZGF0YSwgbm90IGJsb2NrIGxheWVyICovCisjZGVmaW5lIEJJT19RVUlFVAkxMAkvKiBNYWtlIEJJTyBRdWlldCAqLworI2RlZmluZSBCSU9fTUFQUEVEX0lOVEVHUklUWSAxMS8qIGludGVncml0eSBtZXRhZGF0YSBoYXMgYmVlbiByZW1hcHBlZCAqLwogI2RlZmluZSBiaW9fZmxhZ2dlZChiaW8sIGZsYWcpCSgoYmlvKS0+YmlfZmxhZ3MgJiAoMSA8PCAoZmxhZykpKQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggN2ZiYWE5MS4uYzdhNmQzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9ic2cuaD4KQEAgLTIyLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZDsKIAogc3RydWN0IHJlcXVlc3RfcXVldWU7CkBAIC0xOTUsNyArMTk1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lbGV2YXRvci5oPgogCiB0eXBlZGVmIHZvaWQgKHJlcXVlc3RfZm5fcHJvYykgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKLXR5cGVkZWYgaW50IChtYWtlX3JlcXVlc3RfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKK3R5cGVkZWYgdm9pZCAobWFrZV9yZXF1ZXN0X2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyk7CiB0eXBlZGVmIGludCAocHJlcF9ycV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkICh1bnByZXBfcnFfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIApAQCAtNjgwLDYgKzY4MCw4IEBACiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IGdlbmRpc2sgKiwgZm1vZGVfdCwKIAkJCSBzdHJ1Y3Qgc2NzaV9pb2N0bF9jb21tYW5kIF9fdXNlciAqKTsKIAorZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2JpbyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKKwogLyoKICAqIEEgcXVldWUgaGFzIGp1c3QgZXhpdHRlZCBjb25nZXN0aW9uLiAgTm90ZSB0aGlzIGluIHRoZSBnbG9iYWwgY291bnRlciBvZgogICogY29uZ2VzdGVkIHF1ZXVlcywgYW5kIHdha2UgdXAgYW55b25lIHdobyB3YXMgd2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gYmUKQEAgLTg2MywxNiArODY1LDIyIEBACiBleHRlcm4gdm9pZCBibGtfcHV0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogCiAvKgotICogTm90ZTogQ29kZSBpbiBiZXR3ZWVuIGNoYW5naW5nIHRoZSBibGtfcGx1ZyBsaXN0L2NiX2xpc3Qgb3IgZWxlbWVudCBvZiBzdWNoCi0gKiBsaXN0cyBpcyBwcmVlbXB0YWJsZSwgYnV0IHN1Y2ggY29kZSBjYW4ndCBkbyBzbGVlcCAob3IgYmUgdmVyeSBjYXJlZnVsKSwKLSAqIG90aGVyd2lzZSBkYXRhIGlzIGNvcnJ1cHRlZC4gRm9yIGRldGFpbHMsIHBsZWFzZSBjaGVjayBzY2hlZHVsZSgpIHdoZXJlCi0gKiBibGtfc2NoZWR1bGVfZmx1c2hfcGx1ZygpIGlzIGNhbGxlZC4KKyAqIGJsa19wbHVnIHBlcm1pdHMgYnVpbGRpbmcgYSBxdWV1ZSBvZiByZWxhdGVkIHJlcXVlc3RzIGJ5IGhvbGRpbmcgdGhlIEkvTworICogZnJhZ21lbnRzIGZvciBhIHNob3J0IHBlcmlvZC4gVGhpcyBhbGxvd3MgbWVyZ2luZyBvZiBzZXF1ZW50aWFsIHJlcXVlc3RzCisgKiBpbnRvIHNpbmdsZSBsYXJnZXIgcmVxdWVzdC4gQXMgdGhlIHJlcXVlc3RzIGFyZSBtb3ZlZCBmcm9tIGEgcGVyLXRhc2sgbGlzdCB0bworICogdGhlIGRldmljZSdzIHJlcXVlc3RfcXVldWUgaW4gYSBiYXRjaCwgdGhpcyByZXN1bHRzIGluIGltcHJvdmVkIHNjYWxhYmlsaXR5CisgKiBhcyB0aGUgbG9jayBjb250ZW50aW9uIGZvciByZXF1ZXN0X3F1ZXVlIGxvY2sgaXMgcmVkdWNlZC4KKyAqCisgKiBJdCBpcyBvayBub3QgdG8gZGlzYWJsZSBwcmVlbXB0aW9uIHdoZW4gYWRkaW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBwbHVnIGxpc3QKKyAqIG9yIHdoZW4gYXR0ZW1wdGluZyBhIG1lcmdlLCBiZWNhdXNlIGJsa19zY2hlZHVsZV9mbHVzaF9saXN0KCkgd2lsbCBvbmx5IGZsdXNoCisgKiB0aGUgcGx1ZyBsaXN0IHdoZW4gdGhlIHRhc2sgc2xlZXBzIGJ5IGl0c2VsZi4gRm9yIGRldGFpbHMsIHBsZWFzZSBzZWUKKyAqIHNjaGVkdWxlKCkgd2hlcmUgYmxrX3NjaGVkdWxlX2ZsdXNoX3BsdWcoKSBpcyBjYWxsZWQuCiAgKi8KIHN0cnVjdCBibGtfcGx1ZyB7Ci0JdW5zaWduZWQgbG9uZyBtYWdpYzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjYl9saXN0OwotCXVuc2lnbmVkIGludCBzaG91bGRfc29ydDsKKwl1bnNpZ25lZCBsb25nIG1hZ2ljOyAvKiBkZXRlY3QgdW5pbml0aWFsaXplZCB1c2UtY2FzZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIHJlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZCBjYl9saXN0OyAvKiBtZCByZXF1aXJlcyBhbiB1bnBsdWcgY2FsbGJhY2sgKi8KKwl1bnNpZ25lZCBpbnQgc2hvdWxkX3NvcnQ7IC8qIGxpc3QgdG8gYmUgc29ydGVkIGJlZm9yZSBmbHVzaGluZz8gKi8KIH07CiAjZGVmaW5lIEJMS19NQVhfUkVRVUVTVF9DT1VOVCAxNgogCkBAIC0xMTg5LDIwICsxMTk3LDYgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfVEhST1RUTElORwotZXh0ZXJuIGludCBibGtfdGhyb3RsX2luaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwotZXh0ZXJuIHZvaWQgYmxrX3Rocm90bF9leGl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKLWV4dGVybiBpbnQgYmxrX3Rocm90bF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKipiaW8pOwotI2Vsc2UgLyogQ09ORklHX0JMS19ERVZfVEhST1RUTElORyAqLwotc3RhdGljIGlubGluZSBpbnQgYmxrX3Rocm90bF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKipiaW8pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJsa190aHJvdGxfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgYmxrX3Rocm90bF9leGl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfVEhST1RUTElORyAqLwotCiAjZGVmaW5lIE1PRFVMRV9BTElBU19CTE9DS0RFVihtYWpvcixtaW5vcikgXAogCU1PRFVMRV9BTElBUygiYmxvY2stbWFqb3ItIiBfX3N0cmluZ2lmeShtYWpvcikgIi0iIF9fc3RyaW5naWZ5KG1pbm9yKSkKICNkZWZpbmUgTU9EVUxFX0FMSUFTX0JMT0NLREVWX01BSk9SKG1ham9yKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCA4ZTllNGJjLi40ZDFhMDc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTE3MCw3ICsxNzAsNyBAQAogZXh0ZXJuIGludCBkb19ibGtfdHJhY2Vfc2V0dXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUsCiAJCQkgICAgICBkZXZfdCBkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgKmJ1dHMpOwotZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK2V4dGVybiBfX3ByaW50ZigyLCAzKQogdm9pZCBfX3RyYWNlX25vdGVfbWVzc2FnZShzdHJ1Y3QgYmxrX3RyYWNlICosIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JtYTE1MC5oIGIvaW5jbHVkZS9saW51eC9ibWExNTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTExZmRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ibWExNTAuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJvc2NoIFNlbnNvcnRlYyBHbWJICisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVW5peHBoZXJlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQk1BMTUwX0hfCisjZGVmaW5lIF9CTUExNTBfSF8KKworI2RlZmluZSBCTUExNTBfRFJJVkVSCQkiYm1hMTUwIgorCitzdHJ1Y3QgYm1hMTUwX2NmZyB7CisJYm9vbCBhbnlfbW90aW9uX2ludDsJCS8qIFNldCB0byBlbmFibGUgYW55LW1vdGlvbiBpbnRlcnJ1cHQgKi8KKwlib29sIGhnX2ludDsJCQkvKiBTZXQgdG8gZW5hYmxlIGhpZ2gtRyBpbnRlcnJ1cHQgKi8KKwlib29sIGxnX2ludDsJCQkvKiBTZXQgdG8gZW5hYmxlIGxvdy1HIGludGVycnVwdCAqLworCXVuc2lnbmVkIGNoYXIgYW55X21vdGlvbl9kdXI7CS8qIEFueS1tb3Rpb24gZHVyYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGFueV9tb3Rpb25fdGhyZXM7CS8qIEFueS1tb3Rpb24gdGhyZXNob2xkICovCisJdW5zaWduZWQgY2hhciBoZ19oeXN0OwkJLyogSGlnaC1HIGh5c3RlcmlzaXMgKi8KKwl1bnNpZ25lZCBjaGFyIGhnX2R1cjsJCS8qIEhpZ2gtRyBkdXJhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgaGdfdGhyZXM7CQkvKiBIaWdoLUcgdGhyZXNob2xkICovCisJdW5zaWduZWQgY2hhciBsZ19oeXN0OwkJLyogTG93LUcgaHlzdGVyaXNpcyAqLworCXVuc2lnbmVkIGNoYXIgbGdfZHVyOwkJLyogTG93LUcgZHVyYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGxnX3RocmVzOwkJLyogTG93LUcgdGhyZXNob2xkICovCisJdW5zaWduZWQgY2hhciByYW5nZTsJCS8qIEJNQTAxNTBfUkFOR0VfeHh4IChpbiBHKSAqLworCXVuc2lnbmVkIGNoYXIgYmFuZHdpZHRoOwkvKiBCTUEwMTUwX0JXX3h4eCAoaW4gSHopICovCit9OworCitzdHJ1Y3QgYm1hMTUwX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBibWExNTBfY2ZnIGNmZzsKKwlpbnQgKCppcnFfZ3Bpb19jZmcpKHZvaWQpOworfTsKKworI2VuZGlmIC8qIF9CTUExNTBfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvbGliY2VwaC5oCmluZGV4IDU2Mzc1NTEuLjk1YmQ4NTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2VwaC9saWJjZXBoLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZXBoL2xpYmNlcGguaApAQCAtMjE1LDcgKzIxNSw5IEBACiBleHRlcm4gaW50IGNlcGhfY29tcGFyZV9vcHRpb25zKHN0cnVjdCBjZXBoX29wdGlvbnMgKm5ld19vcHQsCiAJCQkJc3RydWN0IGNlcGhfY2xpZW50ICpjbGllbnQpOwogZXh0ZXJuIHN0cnVjdCBjZXBoX2NsaWVudCAqY2VwaF9jcmVhdGVfY2xpZW50KHN0cnVjdCBjZXBoX29wdGlvbnMgKm9wdCwKLQkJCQkJICAgICAgdm9pZCAqcHJpdmF0ZSk7CisJCQkJCSAgICAgIHZvaWQgKnByaXZhdGUsCisJCQkJCSAgICAgIHVuc2lnbmVkIHN1cHBvcnRlZF9mZWF0dXJlcywKKwkJCQkJICAgICAgdW5zaWduZWQgcmVxdWlyZWRfZmVhdHVyZXMpOwogZXh0ZXJuIHU2NCBjZXBoX2NsaWVudF9pZChzdHJ1Y3QgY2VwaF9jbGllbnQgKmNsaWVudCk7CiBleHRlcm4gdm9pZCBjZXBoX2Rlc3Ryb3lfY2xpZW50KHN0cnVjdCBjZXBoX2NsaWVudCAqY2xpZW50KTsKIGV4dGVybiBpbnQgX19jZXBoX29wZW5fc2Vzc2lvbihzdHJ1Y3QgY2VwaF9jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2VwaC9tZXNzZW5nZXIuaCBiL2luY2x1ZGUvbGludXgvY2VwaC9tZXNzZW5nZXIuaAppbmRleCBjYTc2OGFlLi5mZmJlYjJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZXBoL21lc3Nlbmdlci5oCkBAIC0yMzcsNyArMjM3LDggQEAKIGV4dGVybiBzdHJ1Y3QgY2VwaF9jb25uZWN0aW9uICpjZXBoX2Nvbl9nZXQoc3RydWN0IGNlcGhfY29ubmVjdGlvbiAqY29uKTsKIGV4dGVybiB2b2lkIGNlcGhfY29uX3B1dChzdHJ1Y3QgY2VwaF9jb25uZWN0aW9uICpjb24pOwogCi1leHRlcm4gc3RydWN0IGNlcGhfbXNnICpjZXBoX21zZ19uZXcoaW50IHR5cGUsIGludCBmcm9udF9sZW4sIGdmcF90IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgY2VwaF9tc2cgKmNlcGhfbXNnX25ldyhpbnQgdHlwZSwgaW50IGZyb250X2xlbiwgZ2ZwX3QgZmxhZ3MsCisJCQkJICAgICBib29sIGNhbl9mYWlsKTsKIGV4dGVybiB2b2lkIGNlcGhfbXNnX2tmcmVlKHN0cnVjdCBjZXBoX21zZyAqbSk7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggZGE3ZTRiYy4uMWI3ZjlkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC01MTYsNyArNTE2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmxpbmc7CiAJLyogdXNlZCB3aGVuIHVzZV9pZCA9PSB0cnVlICovCiAJc3RydWN0IGlkciBpZHI7Ci0Jc3BpbmxvY2tfdCBpZF9sb2NrOworCXJ3bG9ja190IGlkX2xvY2s7CiAKIAkvKiBzaG91bGQgYmUgZGVmaW5lZCBvbmx5IGJ5IG1vZHVsYXIgc3Vic3lzdGVtcyAqLwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xrLmggYi9pbmNsdWRlL2xpbnV4L2Nsay5oCmluZGV4IDFkMzdmNDIuLjcyMTNiNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xrLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbGsuaApAQCAtMTEsNiArMTEsOCBAQAogI2lmbmRlZiBfX0xJTlVYX0NMS19ICiAjZGVmaW5lIF9fTElOVVhfQ0xLX0gKIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCiBzdHJ1Y3QgZGV2aWNlOwogCiAvKgpAQCAtNDEsMTEgKzQzLDMxIEBACiBzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpOwogCiAvKioKKyAqIGNsa19wcmVwYXJlIC0gcHJlcGFyZSBhIGNsb2NrIHNvdXJjZQorICogQGNsazogY2xvY2sgc291cmNlCisgKgorICogVGhpcyBwcmVwYXJlcyB0aGUgY2xvY2sgc291cmNlIGZvciB1c2UuCisgKgorICogTXVzdCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGF0b21pYyBjb250ZXh0LgorICovCisjaWZkZWYgQ09ORklHX0hBVkVfQ0xLX1BSRVBBUkUKK2ludCBjbGtfcHJlcGFyZShzdHJ1Y3QgY2xrICpjbGspOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNsa19wcmVwYXJlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwltaWdodF9zbGVlcCgpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKgogICogY2xrX2VuYWJsZSAtIGluZm9ybSB0aGUgc3lzdGVtIHdoZW4gdGhlIGNsb2NrIHNvdXJjZSBzaG91bGQgYmUgcnVubmluZy4KICAqIEBjbGs6IGNsb2NrIHNvdXJjZQogICoKICAqIElmIHRoZSBjbG9jayBjYW4gbm90IGJlIGVuYWJsZWQvZGlzYWJsZWQsIHRoaXMgc2hvdWxkIHJldHVybiBzdWNjZXNzLgogICoKKyAqIE1heSBiZSBjYWxsZWQgZnJvbSBhdG9taWMgY29udGV4dHMuCisgKgogICogUmV0dXJucyBzdWNjZXNzICgwKSBvciBuZWdhdGl2ZSBlcnJuby4KICAqLwogaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKQEAgLTU3LDYgKzc5LDggQEAKICAqIEluZm9ybSB0aGUgc3lzdGVtIHRoYXQgYSBjbG9jayBzb3VyY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGJ5CiAgKiBhIGRyaXZlciBhbmQgbWF5IGJlIHNodXQgZG93bi4KICAqCisgKiBNYXkgYmUgY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHRzLgorICoKICAqIEltcGxlbWVudGF0aW9uIGRldGFpbDogaWYgdGhlIGNsb2NrIHNvdXJjZSBpcyBzaGFyZWQgYmV0d2VlbgogICogbXVsdGlwbGUgZHJpdmVycywgY2xrX2VuYWJsZSgpIGNhbGxzIG11c3QgYmUgYmFsYW5jZWQgYnkgdGhlCiAgKiBzYW1lIG51bWJlciBvZiBjbGtfZGlzYWJsZSgpIGNhbGxzIGZvciB0aGUgY2xvY2sgc291cmNlIHRvIGJlCkBAIC02NCw2ICs4OCwyNSBAQAogICovCiB2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsayk7CiAKKworLyoqCisgKiBjbGtfdW5wcmVwYXJlIC0gdW5kbyBwcmVwYXJhdGlvbiBvZiBhIGNsb2NrIHNvdXJjZQorICogQGNsazogY2xvY2sgc291cmNlCisgKgorICogVGhpcyB1bmRvZXMgYSBwcmV2aW91c2x5IHByZXBhcmVkIGNsb2NrLiAgVGhlIGNhbGxlciBtdXN0IGJhbGFuY2UKKyAqIHRoZSBudW1iZXIgb2YgcHJlcGFyZSBhbmQgdW5wcmVwYXJlIGNhbGxzLgorICoKKyAqIE11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhdG9taWMgY29udGV4dC4KKyAqLworI2lmZGVmIENPTkZJR19IQVZFX0NMS19QUkVQQVJFCit2b2lkIGNsa191bnByZXBhcmUoc3RydWN0IGNsayAqY2xrKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrX3VucHJlcGFyZShzdHJ1Y3QgY2xrICpjbGspCit7CisJbWlnaHRfc2xlZXAoKTsKK30KKyNlbmRpZgorCiAvKioKICAqIGNsa19nZXRfcmF0ZSAtIG9idGFpbiB0aGUgY3VycmVudCBjbG9jayByYXRlIChpbiBIeikgZm9yIGEgY2xvY2sgc291cmNlLgogICoJCSAgVGhpcyBpcyBvbmx5IHZhbGlkIG9uY2UgdGhlIGNsb2NrIHNvdXJjZSBoYXMgYmVlbiBlbmFibGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbGtkZXYuaCBiL2luY2x1ZGUvbGludXgvY2xrZGV2LmgKaW5kZXggNDU3YmNiMC4uZDlhNGZkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsa2Rldi5oCkBAIC0yNCw2ICsyNCwxMyBAQAogCXN0cnVjdCBjbGsJCSpjbGs7CiB9OwogCisjZGVmaW5lIENMS0RFVl9JTklUKGQsIG4sIGMpCVwKKwl7CQkJXAorCQkuZGV2X2lkID0gZCwJXAorCQkuY29uX2lkID0gbiwJXAorCQkuY2xrID0gYywJXAorCX0KKwogc3RydWN0IGNsa19sb29rdXAgKmNsa2Rldl9hbGxvYyhzdHJ1Y3QgY2xrICpjbGssIGNvbnN0IGNoYXIgKmNvbl9pZCwKIAljb25zdCBjaGFyICpkZXZfZm10LCAuLi4pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsa3NyYy1kYng1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvY2xrc3JjLWRieDUwMC1wcmNtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjgxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsa3NyYy1kYng1MDAtcHJjbXUuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDExCisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqIEF1dGhvcjogTWF0dGlhcyBXYWxsaW4gPG1hdHRpYXMud2FsbGluQHN0ZXJpY3Nzb24uY29tPgorICoKKyAqLworI2lmbmRlZiBfX0NMS1NSQ19EQlg1MDBfUFJDTVVfSAorI2RlZmluZSBfX0NMS1NSQ19EQlg1MDBfUFJDTVVfSAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpZmRlZiBDT05GSUdfQ0xLU1JDX0RCWDUwMF9QUkNNVQordm9pZCBfX2luaXQgY2xrc3JjX2RieDUwMF9wcmNtdV9pbml0KHZvaWQgX19pb21lbSAqYmFzZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBjbGtzcmNfZGJ4NTAwX3ByY211X2luaXQodm9pZCBfX2lvbWVtICpiYXNlKSB7fQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaAppbmRleCBjYzlmN2E0Li5iYjJiYmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaApAQCAtMjQsOCArMjQsNiBAQAogCQkJaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaywgbm9kZW1hc2tfdCAqbWFzaywKIAkJCWJvb2wgc3luYyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb21wYWN0aW9uX3N1aXRhYmxlKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCi0JCQkJCWdmcF90IGdmcF9tYXNrLCBib29sIHN5bmMpOwogCiAvKiBEbyBub3Qgc2tpcCBjb21wYWN0aW9uIG1vcmUgdGhhbiA2NCB0aW1lcyAqLwogI2RlZmluZSBDT01QQUNUX01BWF9ERUZFUl9TSElGVCA2CkBAIC02OSwxMiArNjcsNiBAQAogCXJldHVybiBDT01QQUNUX1NLSVBQRUQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb21wYWN0X3pvbmVfb3JkZXIoc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwKLQkJCQkJICAgICAgIGdmcF90IGdmcF9tYXNrLCBib29sIHN5bmMpCi17Ci0JcmV0dXJuIENPTVBBQ1RfQ09OVElOVUU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWZlcl9jb21wYWN0aW9uKHN0cnVjdCB6b25lICp6b25lKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggYzZlNzUyMy4uMTU0YmY1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC01NDcsNyArNTQ3LDggQEAKIAkJY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnV2ZWN0b3IsCiAJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywKIAkJdW5zaWduZWQgbG9uZyBmYXN0X3NlZ3MsIHN0cnVjdCBpb3ZlYyAqZmFzdF9wb2ludGVyLAotCQlzdHJ1Y3QgaW92ZWMgKipyZXRfcG9pbnRlcik7CisJCXN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyLAorCQlpbnQgY2hlY2tfYWNjZXNzKTsKIAogZXh0ZXJuIHZvaWQgX191c2VyICpjb21wYXRfYWxsb2NfdXNlcl9zcGFjZSh1bnNpZ25lZCBsb25nIGxlbik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IGIxYTYzNWEuLjZjYjYwZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtMTk2LDEzICsxOTYsOSBAQAogI2VuZGlmCQkvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUF9TTVAKLWV4dGVybiBpbnQgc3VzcGVuZF9jcHVfaG90cGx1ZzsKLQogZXh0ZXJuIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCk7CiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQX1NNUCAqLwotI2RlZmluZSBzdXNwZW5kX2NwdV9ob3RwbHVnCTAKLQogc3RhdGljIGlubGluZSBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCkge30KICNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQX1NNUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVfcG0uaCBiL2luY2x1ZGUvbGludXgvY3B1X3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3B1X3BtLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlLCBJbmMuCisgKgorICogQXV0aG9yOgorICoJQ29saW4gQ3Jvc3MgPGNjcm9zc0BhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9DUFVfUE1fSAorI2RlZmluZSBfTElOVVhfQ1BVX1BNX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKy8qCisgKiBXaGVuIGEgQ1BVIGdvZXMgdG8gYSBsb3cgcG93ZXIgc3RhdGUgdGhhdCB0dXJucyBvZmYgcG93ZXIgdG8gdGhlIENQVSdzCisgKiBwb3dlciBkb21haW4sIHRoZSBjb250ZW50cyBvZiBzb21lIGJsb2NrcyAoZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3JzLAorICogaW50ZXJydXB0IGNvbnRyb2xsZXJzLCBjYWNoZXMsIHRpbWVycykgaW4gdGhlIHNhbWUgcG93ZXIgZG9tYWluIGNhbgorICogYmUgbG9zdC4gIFRoZSBjcG1fcG0gbm90aWZpZXJzIHByb3ZpZGUgYSBtZXRob2QgZm9yIHBsYXRmb3JtIGlkbGUsIHN1c3BlbmQsCisgKiBhbmQgaG90cGx1ZyBpbXBsZW1lbnRhdGlvbnMgdG8gbm90aWZ5IHRoZSBkcml2ZXJzIGZvciB0aGVzZSBibG9ja3MgdGhhdAorICogdGhleSBtYXkgYmUgcmVzZXQuCisgKgorICogQWxsIGNwdV9wbSBub3RpZmljYXRpb25zIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBUaGUgbm90aWZpY2F0aW9ucyBhcmUgc3BsaXQgaW50byB0d28gY2xhc3NlczogQ1BVIG5vdGlmaWNhdGlvbnMgYW5kIENQVQorICogY2x1c3RlciBub3RpZmljYXRpb25zLgorICoKKyAqIENQVSBub3RpZmljYXRpb25zIGFwcGx5IHRvIGEgc2luZ2xlIENQVSBhbmQgbXVzdCBiZSBjYWxsZWQgb24gdGhlIGFmZmVjdGVkCisgKiBDUFUuICBUaGV5IGFyZSB1c2VkIHRvIHNhdmUgcGVyLWNwdSBjb250ZXh0IGZvciBhZmZlY3RlZCBibG9ja3MuCisgKgorICogQ1BVIGNsdXN0ZXIgbm90aWZpY2F0aW9ucyBhcHBseSB0byBhbGwgQ1BVcyBpbiBhIHNpbmdsZSBwb3dlciBkb21haW4uIFRoZXkKKyAqIGFyZSB1c2VkIHRvIHNhdmUgYW55IGdsb2JhbCBjb250ZXh0IGZvciBhZmZlY3RlZCBibG9ja3MsIGFuZCBtdXN0IGJlIGNhbGxlZAorICogYWZ0ZXIgYWxsIHRoZSBDUFVzIGluIHRoZSBwb3dlciBkb21haW4gaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIHRoZSBsb3cgcG93ZXIKKyAqIHN0YXRlLgorICovCisKKy8qCisgKiBFdmVudCBjb2RlcyBwYXNzZWQgYXMgdW5zaWduZWQgbG9uZyB2YWwgdG8gbm90aWZpZXIgY2FsbHMKKyAqLworZW51bSBjcHVfcG1fZXZlbnQgeworCS8qIEEgc2luZ2xlIGNwdSBpcyBlbnRlcmluZyBhIGxvdyBwb3dlciBzdGF0ZSAqLworCUNQVV9QTV9FTlRFUiwKKworCS8qIEEgc2luZ2xlIGNwdSBmYWlsZWQgdG8gZW50ZXIgYSBsb3cgcG93ZXIgc3RhdGUgKi8KKwlDUFVfUE1fRU5URVJfRkFJTEVELAorCisJLyogQSBzaW5nbGUgY3B1IGlzIGV4aXRpbmcgYSBsb3cgcG93ZXIgc3RhdGUgKi8KKwlDUFVfUE1fRVhJVCwKKworCS8qIEEgY3B1IHBvd2VyIGRvbWFpbiBpcyBlbnRlcmluZyBhIGxvdyBwb3dlciBzdGF0ZSAqLworCUNQVV9DTFVTVEVSX1BNX0VOVEVSLAorCisJLyogQSBjcHUgcG93ZXIgZG9tYWluIGZhaWxlZCB0byBlbnRlciBhIGxvdyBwb3dlciBzdGF0ZSAqLworCUNQVV9DTFVTVEVSX1BNX0VOVEVSX0ZBSUxFRCwKKworCS8qIEEgY3B1IHBvd2VyIGRvbWFpbiBpcyBleGl0aW5nIGEgbG93IHBvd2VyIHN0YXRlICovCisJQ1BVX0NMVVNURVJfUE1fRVhJVCwKK307CisKKyNpZmRlZiBDT05GSUdfQ1BVX1BNCitpbnQgY3B1X3BtX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IGNwdV9wbV9lbnRlcih2b2lkKTsKK2ludCBjcHVfcG1fZXhpdCh2b2lkKTsKK2ludCBjcHVfY2x1c3Rlcl9wbV9lbnRlcih2b2lkKTsKK2ludCBjcHVfY2x1c3Rlcl9wbV9leGl0KHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBjcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3B1X3BtX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3B1X3BtX2VudGVyKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9wbV9leGl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9jbHVzdGVyX3BtX2VudGVyKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9jbHVzdGVyX3BtX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaCBiL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCmluZGV4IGI1MTYyOWUuLjc0MDhhZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIApAQCAtMjEsNTggKzIwLDY1IEBACiAjZGVmaW5lIENQVUlETEVfTkFNRV9MRU4JMTYKICNkZWZpbmUgQ1BVSURMRV9ERVNDX0xFTgkzMgogCitzdHJ1Y3QgbW9kdWxlOworCiBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2U7CitzdHJ1Y3QgY3B1aWRsZV9kcml2ZXI7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENQVUlETEUgREVWSUNFIElOVEVSRkFDRSAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UgeworCXZvaWQJCSpkcml2ZXJfZGF0YTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwl1c2FnZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcJdGltZTsgLyogaW4gVVMgKi8KK307CisKIHN0cnVjdCBjcHVpZGxlX3N0YXRlIHsKIAljaGFyCQluYW1lW0NQVUlETEVfTkFNRV9MRU5dOwogCWNoYXIJCWRlc2NbQ1BVSURMRV9ERVNDX0xFTl07Ci0Jdm9pZAkJKmRyaXZlcl9kYXRhOwogCiAJdW5zaWduZWQgaW50CWZsYWdzOwogCXVuc2lnbmVkIGludAlleGl0X2xhdGVuY3k7IC8qIGluIFVTICovCiAJdW5zaWduZWQgaW50CXBvd2VyX3VzYWdlOyAvKiBpbiBtVyAqLwogCXVuc2lnbmVkIGludAl0YXJnZXRfcmVzaWRlbmN5OyAvKiBpbiBVUyAqLwogCi0JdW5zaWduZWQgbG9uZyBsb25nCXVzYWdlOwotCXVuc2lnbmVkIGxvbmcgbG9uZwl0aW1lOyAvKiBpbiBVUyAqLwotCiAJaW50ICgqZW50ZXIpCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpOworCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsCisJCQlpbnQgaW5kZXgpOwogfTsKIAogLyogSWRsZSBTdGF0ZSBGbGFncyAqLwogI2RlZmluZSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRAkoMHgwMSkgLyogaXMgcmVzaWRlbmN5IHRpbWUgbWVhc3VyYWJsZT8gKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX0lHTk9SRQkoMHgxMDApIC8qIGlnbm9yZSBkdXJpbmcgdGhpcyBpZGxlIHBlcmlvZCAqLwogCiAjZGVmaW5lIENQVUlETEVfRFJJVkVSX0ZMQUdTX01BU0sgKDB4RkZGRjAwMDApCiAKIC8qKgogICogY3B1aWRsZV9nZXRfc3RhdGVkYXRhIC0gcmV0cmlldmVzIHByaXZhdGUgZHJpdmVyIHN0YXRlIGRhdGEKLSAqIEBzdGF0ZTogdGhlIHN0YXRlCisgKiBAc3RfdXNhZ2U6IHRoZSBzdGF0ZSB1c2FnZSBzdGF0aXN0aWNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqIGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgKmNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RfdXNhZ2UpCiB7Ci0JcmV0dXJuIHN0YXRlLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gc3RfdXNhZ2UtPmRyaXZlcl9kYXRhOwogfQogCiAvKioKICAqIGNwdWlkbGVfc2V0X3N0YXRlZGF0YSAtIHN0b3JlcyBwcml2YXRlIGRyaXZlciBzdGF0ZSBkYXRhCi0gKiBAc3RhdGU6IHRoZSBzdGF0ZQorICogQHN0X3VzYWdlOiB0aGUgc3RhdGUgdXNhZ2Ugc3RhdGlzdGljcwogICogQGRhdGE6IHRoZSBwcml2YXRlIGRhdGEKICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1jcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0YXRlLCB2b2lkICpkYXRhKQorY3B1aWRsZV9zZXRfc3RhdGVkYXRhKHN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlICpzdF91c2FnZSwgdm9pZCAqZGF0YSkKIHsKLQlzdGF0ZS0+ZHJpdmVyX2RhdGEgPSBkYXRhOworCXN0X3VzYWdlLT5kcml2ZXJfZGF0YSA9IGRhdGE7CiB9CiAKIHN0cnVjdCBjcHVpZGxlX3N0YXRlX2tvYmogewogCXN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV91c2FnZSAqc3RhdGVfdXNhZ2U7CiAJc3RydWN0IGNvbXBsZXRpb24ga29ial91bnJlZ2lzdGVyOwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiB9OwpAQCAtODAsMjIgKzg2LDE3IEBACiBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgewogCXVuc2lnbmVkIGludAkJcmVnaXN0ZXJlZDoxOwogCXVuc2lnbmVkIGludAkJZW5hYmxlZDoxOwotCXVuc2lnbmVkIGludAkJcG93ZXJfc3BlY2lmaWVkOjE7CiAJdW5zaWduZWQgaW50CQljcHU7CiAKIAlpbnQJCQlsYXN0X3Jlc2lkZW5jeTsKIAlpbnQJCQlzdGF0ZV9jb3VudDsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZQlzdGF0ZXNbQ1BVSURMRV9TVEFURV9NQVhdOworCXN0cnVjdCBjcHVpZGxlX3N0YXRlX3VzYWdlCXN0YXRlc191c2FnZVtDUFVJRExFX1NUQVRFX01BWF07CiAJc3RydWN0IGNwdWlkbGVfc3RhdGVfa29iaiAqa29ianNbQ1BVSURMRV9TVEFURV9NQVhdOwotCXN0cnVjdCBjcHVpZGxlX3N0YXRlCSpsYXN0X3N0YXRlOwogCiAJc3RydWN0IGxpc3RfaGVhZCAJZGV2aWNlX2xpc3Q7CiAJc3RydWN0IGtvYmplY3QJCWtvYmo7CiAJc3RydWN0IGNvbXBsZXRpb24Ja29ial91bnJlZ2lzdGVyOwogCXZvaWQJCQkqZ292ZXJub3JfZGF0YTsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZQkqc2FmZV9zdGF0ZTsKLQotCWludCAoKnByZXBhcmUpCQkoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOwogfTsKIAogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqLCBjcHVpZGxlX2RldmljZXMpOwpAQCAtMTE5LDYgKzEyMCwxMSBAQAogc3RydWN0IGNwdWlkbGVfZHJpdmVyIHsKIAljaGFyCQkJbmFtZVtDUFVJRExFX05BTUVfTEVOXTsKIAlzdHJ1Y3QgbW9kdWxlIAkJKm93bmVyOworCisJdW5zaWduZWQgaW50CQlwb3dlcl9zcGVjaWZpZWQ6MTsKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZQlzdGF0ZXNbQ1BVSURMRV9TVEFURV9NQVhdOworCWludAkJCXN0YXRlX2NvdW50OworCWludAkJCXNhZmVfc3RhdGVfaW5kZXg7CiB9OwogCiAjaWZkZWYgQ09ORklHX0NQVV9JRExFCkBAIC0xNjUsMTEgKzE3MSwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgCWdvdmVybm9yX2xpc3Q7CiAJdW5zaWduZWQgaW50CQlyYXRpbmc7CiAKLQlpbnQgICgqZW5hYmxlKQkJKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKLQl2b2lkICgqZGlzYWJsZSkJCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CisJaW50ICAoKmVuYWJsZSkJCShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworCXZvaWQgKCpkaXNhYmxlKQkJKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJCQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CiAKLQlpbnQgICgqc2VsZWN0KQkJKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKLQl2b2lkICgqcmVmbGVjdCkJCShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CisJaW50ICAoKnNlbGVjdCkJCShzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQkJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZWZsZWN0KQkJKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpOwogCiAJc3RydWN0IG1vZHVsZSAJCSpvd25lcjsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyYXNoX2R1bXAuaCBiL2luY2x1ZGUvbGludXgvY3Jhc2hfZHVtcC5oCmluZGV4IDc0MDU0MDcuLjVjNGFiY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3Jhc2hfZHVtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvY3Jhc2hfZHVtcC5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIEVMRkNPUkVfQUREUl9FUlIJKC0yVUxMKQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGVsZmNvcmVoZHJfYWRkcjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgZWxmY29yZWhkcl9zaXplOwogCiBleHRlcm4gc3NpemVfdCBjb3B5X29sZG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcsIGNoYXIgKiwgc2l6ZV90LAogCQkJCQkJdW5zaWduZWQgbG9uZywgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IGU1ZTQ2OGUuLjhhOTQyMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBfTElOVVhfQ1JZUFRPX0gKIAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC03Miw2ICs3MSwxMSBAQAogI2RlZmluZSBDUllQVE9fQUxHX1RFU1RFRAkJMHgwMDAwMDQwMAogCiAvKgorICogU2V0IGlmIHRoZSBhbGdvcml0aG0gaXMgYW4gaW5zdGFuY2UgdGhhdCBpcyBidWlsZCBmcm9tIHRlbXBsYXRlcy4KKyAqLworI2RlZmluZSBDUllQVE9fQUxHX0lOU1RBTkNFCQkweDAwMDAwODAwCisKKy8qCiAgKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAgKi8KICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMApAQCAtNTA1LDExICs1MDksNiBAQAogCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX3ByaW9yaXR5OwogfQogCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gbW9kdWxlX25hbWUodGZtLT5fX2NydF9hbGctPmNyYV9tb2R1bGUpOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CiAJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvdXNlci5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyZmI1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3J5cHRvdXNlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ3J5cHRvIHVzZXIgY29uZmlndXJhdGlvbiBBUEkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIHNlY3VuZXQgU2VjdXJpdHkgTmV0d29ya3MgQUcKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTdGVmZmVuIEtsYXNzZXJ0IDxzdGVmZmVuLmtsYXNzZXJ0QHNlY3VuZXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyogTmV0bGluayBjb25maWd1cmF0aW9uIG1lc3NhZ2VzLiAgKi8KK2VudW0geworCUNSWVBUT19NU0dfQkFTRSA9IDB4MTAsCisJQ1JZUFRPX01TR19ORVdBTEcgPSAweDEwLAorCUNSWVBUT19NU0dfREVMQUxHLAorCUNSWVBUT19NU0dfVVBEQVRFQUxHLAorCUNSWVBUT19NU0dfR0VUQUxHLAorCV9fQ1JZUFRPX01TR19NQVgKK307CisjZGVmaW5lIENSWVBUT19NU0dfTUFYIChfX0NSWVBUT19NU0dfTUFYIC0gMSkKKyNkZWZpbmUgQ1JZUFRPX05SX01TR1RZUEVTIChDUllQVE9fTVNHX01BWCArIDEgLSBDUllQVE9fTVNHX0JBU0UpCisKKyNkZWZpbmUgQ1JZUFRPX01BWF9OQU1FIENSWVBUT19NQVhfQUxHX05BTUUKKworLyogTmV0bGluayBtZXNzYWdlIGF0dHJpYnV0ZXMuICAqLworZW51bSBjcnlwdG9fYXR0cl90eXBlX3QgeworCUNSWVBUT0NGR0FfVU5TUEVDLAorCUNSWVBUT0NGR0FfUFJJT1JJVFlfVkFMLAkvKiBfX3UzMiAqLworCUNSWVBUT0NGR0FfUkVQT1JUX0xBUlZBTCwJLyogc3RydWN0IGNyeXB0b19yZXBvcnRfbGFydmFsICovCisJQ1JZUFRPQ0ZHQV9SRVBPUlRfSEFTSCwJCS8qIHN0cnVjdCBjcnlwdG9fcmVwb3J0X2hhc2ggKi8KKwlDUllQVE9DRkdBX1JFUE9SVF9CTEtDSVBIRVIsCS8qIHN0cnVjdCBjcnlwdG9fcmVwb3J0X2Jsa2NpcGhlciAqLworCUNSWVBUT0NGR0FfUkVQT1JUX0FFQUQsCQkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9hZWFkICovCisJQ1JZUFRPQ0ZHQV9SRVBPUlRfQ09NUFJFU1MsCS8qIHN0cnVjdCBjcnlwdG9fcmVwb3J0X2NvbXAgKi8KKwlDUllQVE9DRkdBX1JFUE9SVF9STkcsCQkvKiBzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ybmcgKi8KKwlDUllQVE9DRkdBX1JFUE9SVF9DSVBIRVIsCS8qIHN0cnVjdCBjcnlwdG9fcmVwb3J0X2NpcGhlciAqLworCV9fQ1JZUFRPQ0ZHQV9NQVgKKworI2RlZmluZSBDUllQVE9DRkdBX01BWCAoX19DUllQVE9DRkdBX01BWCAtIDEpCit9OworCitzdHJ1Y3QgY3J5cHRvX3VzZXJfYWxnIHsKKwljaGFyIGNydV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCWNoYXIgY3J1X2RyaXZlcl9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCWNoYXIgY3J1X21vZHVsZV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCV9fdTMyIGNydV90eXBlOworCV9fdTMyIGNydV9tYXNrOworCV9fdTMyIGNydV9yZWZjbnQ7CisJX191MzIgY3J1X2ZsYWdzOworfTsKKworc3RydWN0IGNyeXB0b19yZXBvcnRfbGFydmFsIHsKKwljaGFyIHR5cGVbQ1JZUFRPX01BWF9OQU1FXTsKK307CisKK3N0cnVjdCBjcnlwdG9fcmVwb3J0X2hhc2ggeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX05BTUVdOworCXVuc2lnbmVkIGludCBibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGRpZ2VzdHNpemU7Cit9OworCitzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9jaXBoZXIgeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBtaW5fa2V5c2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWF4X2tleXNpemU7Cit9OworCitzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ibGtjaXBoZXIgeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX05BTUVdOworCWNoYXIgZ2VuaXZbQ1JZUFRPX01BWF9OQU1FXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBtaW5fa2V5c2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWF4X2tleXNpemU7CisJdW5zaWduZWQgaW50IGl2c2l6ZTsKK307CisKK3N0cnVjdCBjcnlwdG9fcmVwb3J0X2FlYWQgeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX05BTUVdOworCWNoYXIgZ2VuaXZbQ1JZUFRPX01BWF9OQU1FXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBtYXhhdXRoc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaXZzaXplOworfTsKKworc3RydWN0IGNyeXB0b19yZXBvcnRfY29tcCB7CisJY2hhciB0eXBlW0NSWVBUT19NQVhfTkFNRV07Cit9OworCitzdHJ1Y3QgY3J5cHRvX3JlcG9ydF9ybmcgeworCWNoYXIgdHlwZVtDUllQVE9fTUFYX05BTUVdOworCXVuc2lnbmVkIGludCBzZWVkc2l6ZTsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA2MjE1N2MwLi40ZGY5MjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTE2NSw2ICsxNjUsNyBAQAogCQkJdW5zaWduZWQgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBxc3RyICopOwogCWludCAoKmRfZGVsZXRlKShjb25zdCBzdHJ1Y3QgZGVudHJ5ICopOwogCXZvaWQgKCpkX3JlbGVhc2UpKHN0cnVjdCBkZW50cnkgKik7CisJdm9pZCAoKmRfcHJ1bmUpKHN0cnVjdCBkZW50cnkgKik7CiAJdm9pZCAoKmRfaXB1dCkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiAJY2hhciAqKCpkX2RuYW1lKShzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgaW50KTsKIAlzdHJ1Y3QgdmZzbW91bnQgKigqZF9hdXRvbW91bnQpKHN0cnVjdCBwYXRoICopOwpAQCAtMTg0LDggKzE4NSw5IEBACiAjZGVmaW5lIERDQUNIRV9PUF9DT01QQVJFCTB4MDAwMgogI2RlZmluZSBEQ0FDSEVfT1BfUkVWQUxJREFURQkweDAwMDQKICNkZWZpbmUgRENBQ0hFX09QX0RFTEVURQkweDAwMDgKKyNkZWZpbmUgRENBQ0hFX09QX1BSVU5FICAgICAgICAgMHgwMDEwCiAKLSNkZWZpbmUJRENBQ0hFX0RJU0NPTk5FQ1RFRAkweDAwMTAKKyNkZWZpbmUJRENBQ0hFX0RJU0NPTk5FQ1RFRAkweDAwMjAKICAgICAgLyogVGhpcyBkZW50cnkgaXMgcG9zc2libHkgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIGRjYWNoZSB0cmVlLCBpbgogICAgICAgKiB3aGljaCBjYXNlIGl0cyBwYXJlbnQgd2lsbCBlaXRoZXIgYmUgaXRzZWxmLCBvciB3aWxsIGhhdmUgdGhpcyBmbGFnIGFzCiAgICAgICAqIHdlbGwuICBuZnNkIHdpbGwgbm90IHVzZSBhIGRlbnRyeSB3aXRoIHRoaXMgYml0IHNldCwgYnV0IHdpbGwgZmlyc3QKQEAgLTE5Niw4ICsxOTgsOCBAQAogICAgICAgKiBkZW50cnkgaW50byBwbGFjZSBhbmQgcmV0dXJuIHRoYXQgZGVudHJ5IHJhdGhlciB0aGFuIHRoZSBwYXNzZWQgb25lLAogICAgICAgKiB0eXBpY2FsbHkgdXNpbmcgZF9zcGxpY2VfYWxpYXMuICovCiAKLSNkZWZpbmUgRENBQ0hFX1JFRkVSRU5DRUQJMHgwMDIwICAvKiBSZWNlbnRseSB1c2VkLCBkb24ndCBkaXNjYXJkLiAqLwotI2RlZmluZSBEQ0FDSEVfUkNVQUNDRVNTCTB4MDA0MAkvKiBFbnRyeSBoYXMgZXZlciBiZWVuIFJDVS12aXNpYmxlICovCisjZGVmaW5lIERDQUNIRV9SRUZFUkVOQ0VECTB4MDA0MCAgLyogUmVjZW50bHkgdXNlZCwgZG9uJ3QgZGlzY2FyZC4gKi8KKyNkZWZpbmUgRENBQ0hFX1JDVUFDQ0VTUwkweDAwODAJLyogRW50cnkgaGFzIGV2ZXIgYmVlbiBSQ1UtdmlzaWJsZSAqLwogCiAjZGVmaW5lIERDQUNIRV9DQU5UX01PVU5UCTB4MDEwMAogI2RlZmluZSBEQ0FDSEVfR0VOT0NJREUJCTB4MDIwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2RldmZyZXEuaAppbmRleCBhZmI5NDU4Li45OGNlODEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmZyZXEuaApAQCAtNDEsNyArNDEsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG90YWxfdGltZTsKIAl1bnNpZ25lZCBsb25nIGJ1c3lfdGltZTsKIAl1bnNpZ25lZCBsb25nIGN1cnJlbnRfZnJlcXVlbmN5OwotCXZvaWQgKnByaXZhdGVfZGF0ZTsKKwl2b2lkICpwcml2YXRlX2RhdGE7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggOTllM2U1MC4uOThmMzRiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCiBzdHJ1Y3QgZG1fZGV2Owogc3RydWN0IGRtX3RhcmdldDsKQEAgLTEyNywxMCArMTI4LDYgQEAKICAqIEluZm9ybWF0aW9uIGFib3V0IGEgdGFyZ2V0IHR5cGUKICAqLwogCi0vKgotICogVGFyZ2V0IGZlYXR1cmVzCi0gKi8KLQogc3RydWN0IHRhcmdldF90eXBlIHsKIAl1aW50NjRfdCBmZWF0dXJlczsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMTU5LDYgKzE1NiwzMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKKy8qCisgKiBUYXJnZXQgZmVhdHVyZXMKKyAqLworCisvKgorICogQW55IHRhYmxlIHRoYXQgY29udGFpbnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0YXJnZXQgbXVzdCBoYXZlIG9ubHkgb25lLgorICovCisjZGVmaW5lIERNX1RBUkdFVF9TSU5HTEVUT04JCTB4MDAwMDAwMDEKKyNkZWZpbmUgZG1fdGFyZ2V0X25lZWRzX3NpbmdsZXRvbih0eXBlKQkoKHR5cGUpLT5mZWF0dXJlcyAmIERNX1RBUkdFVF9TSU5HTEVUT04pCisKKy8qCisgKiBJbmRpY2F0ZXMgdGhhdCBhIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHJlYWQtb25seSBkZXZpY2VzLgorICovCisjZGVmaW5lIERNX1RBUkdFVF9BTFdBWVNfV1JJVEVBQkxFCTB4MDAwMDAwMDIKKyNkZWZpbmUgZG1fdGFyZ2V0X2Fsd2F5c193cml0ZWFibGUodHlwZSkgXAorCQkoKHR5cGUpLT5mZWF0dXJlcyAmIERNX1RBUkdFVF9BTFdBWVNfV1JJVEVBQkxFKQorCisvKgorICogQW55IGRldmljZSB0aGF0IGNvbnRhaW5zIGEgdGFibGUgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHRhcmdldCBtYXkgbmV2ZXIKKyAqIGhhdmUgdGFibGVzIGNvbnRhaW5pbmcgYW55IGRpZmZlcmVudCB0YXJnZXQgdHlwZS4KKyAqLworI2RlZmluZSBETV9UQVJHRVRfSU1NVVRBQkxFCQkweDAwMDAwMDA0CisjZGVmaW5lIGRtX3RhcmdldF9pc19pbW11dGFibGUodHlwZSkJKCh0eXBlKS0+ZmVhdHVyZXMgJiBETV9UQVJHRVRfSU1NVVRBQkxFKQorCiBzdHJ1Y3QgZG1fdGFyZ2V0IHsKIAlzdHJ1Y3QgZG1fdGFibGUgKnRhYmxlOwogCXN0cnVjdCB0YXJnZXRfdHlwZSAqdHlwZTsKQEAgLTM3NSw2ICszOTYsMTQgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgRE1fTkFNRSAiZGV2aWNlLW1hcHBlciIKIAorI2lmZGVmIENPTkZJR19QUklOVEsKK2V4dGVybiBzdHJ1Y3QgcmF0ZWxpbWl0X3N0YXRlIGRtX3JhdGVsaW1pdF9zdGF0ZTsKKworI2RlZmluZSBkbV9yYXRlbGltaXQoKQlfX3JhdGVsaW1pdCgmZG1fcmF0ZWxpbWl0X3N0YXRlKQorI2Vsc2UKKyNkZWZpbmUgZG1fcmF0ZWxpbWl0KCkJMAorI2VuZGlmCisKICNkZWZpbmUgRE1DUklUKGYsIGFyZy4uLikgXAogCXByaW50ayhLRVJOX0NSSVQgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKIApAQCAtMzgyLDcgKzQxMSw3IEBACiAJcHJpbnRrKEtFUk5fRVJSIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAjZGVmaW5lIERNRVJSX0xJTUlUKGYsIGFyZy4uLikgXAogCWRvIHsgXAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQlcCisJCWlmIChkbV9yYXRlbGltaXQoKSkJXAogCQkJcHJpbnRrKEtFUk5fRVJSIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgXAogCQkJICAgICAgIGYgIlxuIiwgIyMgYXJnKTsgXAogCX0gd2hpbGUgKDApCkBAIC0zOTEsNyArNDIwLDcgQEAKIAlwcmludGsoS0VSTl9XQVJOSU5HIERNX05BTUUgIjogIiBETV9NU0dfUFJFRklYICI6ICIgZiAiXG4iLCAjIyBhcmcpCiAjZGVmaW5lIERNV0FSTl9MSU1JVChmLCBhcmcuLi4pIFwKIAlkbyB7IFwKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkJXAorCQlpZiAoZG1fcmF0ZWxpbWl0KCkpCVwKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBcCiAJCQkgICAgICAgZiAiXG4iLCAjIyBhcmcpOyBcCiAJfSB3aGlsZSAoMCkKQEAgLTQwMCw3ICs0MjksNyBAQAogCXByaW50ayhLRVJOX0lORk8gRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKICNkZWZpbmUgRE1JTkZPX0xJTUlUKGYsIGFyZy4uLikgXAogCWRvIHsgXAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQlcCisJCWlmIChkbV9yYXRlbGltaXQoKSkJXAogCQkJcHJpbnRrKEtFUk5fSU5GTyBETV9OQU1FICI6ICIgRE1fTVNHX1BSRUZJWCAiOiAiIGYgXAogCQkJICAgICAgICJcbiIsICMjIGFyZyk7IFwKIAl9IHdoaWxlICgwKQpAQCAtNDEwLDcgKzQzOSw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIiBERUJVRzogIiBmICJcbiIsICMjIGFyZykKICMgIGRlZmluZSBETURFQlVHX0xJTUlUKGYsIGFyZy4uLikgXAogCWRvIHsgXAotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQlcCisJCWlmIChkbV9yYXRlbGltaXQoKSkJXAogCQkJcHJpbnRrKEtFUk5fREVCVUcgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmIFwKIAkJCSAgICAgICAiXG4iLCAjIyBhcmcpOyBcCiAJfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGJkY2YzNjEuLmZmYmNmOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9kZXZpY2UuaD4KQEAgLTI5LDEwICsyOSwxMiBAQAogc3RydWN0IGRldmljZV9wcml2YXRlOwogc3RydWN0IGRldmljZV9kcml2ZXI7CiBzdHJ1Y3QgZHJpdmVyX3ByaXZhdGU7CitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGNsYXNzOwogc3RydWN0IHN1YnN5c19wcml2YXRlOwogc3RydWN0IGJ1c190eXBlOwogc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGlvbW11X29wczsKIAogc3RydWN0IGJ1c19hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUJYXR0cjsKQEAgLTY3LDYgKzY5LDkgQEAKICAqIEByZXN1bWU6CUNhbGxlZCB0byBicmluZyBhIGRldmljZSBvbiB0aGlzIGJ1cyBvdXQgb2Ygc2xlZXAgbW9kZS4KICAqIEBwbToJCVBvd2VyIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyBvZiB0aGlzIGJ1cywgY2FsbGJhY2sgdGhlIHNwZWNpZmljCiAgKgkJZGV2aWNlIGRyaXZlcidzIHBtLW9wcy4KKyAqIEBpb21tdV9vcHMgICBJT01NVSBzcGVjaWZpYyBvcGVyYXRpb25zIGZvciB0aGlzIGJ1cywgdXNlZCB0byBhdHRhY2ggSU9NTVUKKyAqICAgICAgICAgICAgICBkcml2ZXIgaW1wbGVtZW50YXRpb25zIHRvIGEgYnVzIGFuZCBhbGxvdyB0aGUgZHJpdmVyIHRvIGRvCisgKiAgICAgICAgICAgICAgYnVzLXNwZWNpZmljIHNldHVwCiAgKiBAcDoJCVRoZSBwcml2YXRlIGRhdGEgb2YgdGhlIGRyaXZlciBjb3JlLCBvbmx5IHRoZSBkcml2ZXIgY29yZSBjYW4KICAqCQl0b3VjaCB0aGlzLgogICoKQEAgLTk2LDYgKzEwMSw4IEBACiAKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAKKwlzdHJ1Y3QgaW9tbXVfb3BzICppb21tdV9vcHM7CisKIAlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnA7CiB9OwogCkBAIC02MTYsOCArNjIzLDggQEAKIAlyZXR1cm4ga29iamVjdF9uYW1lKCZkZXYtPmtvYmopOwogfQogCi1leHRlcm4gaW50IGRldl9zZXRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIC4uLikKLQkJCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfc2V0X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCAuLi4pOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIHN0YXRpYyBpbmxpbmUgaW50IGRldl90b19ub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTcxNywxMCArNzI0LDE0IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgZGV2aWNlICpfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpyb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiBfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIFRISVNfTU9EVUxFKTsKLX0KKworLyoKKyAqIFRoaXMgaXMgYSBtYWNybyB0byBhdm9pZCBpbmNsdWRlIHByb2JsZW1zIHdpdGggVEhJU19NT0RVTEUsCisgKiBqdXN0IGFzIHBlciB3aGF0IGlzIGRvbmUgZm9yIGRldmljZV9zY2hlZHVsZV9jYWxsYmFjaygpIGFib3ZlLgorICovCisjZGVmaW5lIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKG5hbWUpIFwKKwlfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIFRISVNfTU9EVUxFKQorCiBleHRlcm4gdm9pZCByb290X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnJvb3QpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmRldl9nZXRfcGxhdGRhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNzQ3LDEwICs3NTgsMTAgQEAKIAkJCQkJICB2b2lkICpkcnZkYXRhLAogCQkJCQkgIGNvbnN0IGNoYXIgKmZtdCwKIAkJCQkJICB2YV9saXN0IHZhcmdzKTsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpkZXZpY2VfY3JlYXRlKHN0cnVjdCBjbGFzcyAqY2xzLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCi0JCQkJICAgIGRldl90IGRldnQsIHZvaWQgKmRydmRhdGEsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA1LCA2KSkpOworZXh0ZXJuIF9fcHJpbnRmKDUsIDYpCitzdHJ1Y3QgZGV2aWNlICpkZXZpY2VfY3JlYXRlKHN0cnVjdCBjbGFzcyAqY2xzLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkgICAgIGRldl90IGRldnQsIHZvaWQgKmRydmRhdGEsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIGRldmljZV9kZXN0cm95KHN0cnVjdCBjbGFzcyAqY2xzLCBkZXZfdCBkZXZ0KTsKIAogLyoKQEAgLTc5NCw2NCArODA1LDU2IEBACiAKIGV4dGVybiBpbnQgX19kZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpOwotZXh0ZXJuIGludCBkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBkZXZfYWxlcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IGRldl9jcml0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgZGV2X25vdGljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCitpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCSAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKKwk7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfZW1lcmcoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfYWxlcnQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfY3JpdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IGRldl9lcnIoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBfZGV2X2luZm8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCB2YV9mb3JtYXQgKnZhZikKLQkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCSB7IHJldHVybiAwOyB9Cit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDMsIDQpCitpbnQgZGV2X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCSAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sgcmV0dXJuIDA7IH0KIAotc3RhdGljIGlubGluZSBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgZGV2X2VtZXJnKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgZGV2X2NyaXQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfY3JpdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl9hbGVydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLXN0YXRpYyBpbmxpbmUgaW50IGRldl9hbGVydChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl9lcnIoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfZXJyKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgZGV2X3dhcm4oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfd2Fybihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1zdGF0aWMgaW5saW5lIGludCBkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotc3RhdGljIGlubGluZSBpbnQgX2Rldl9pbmZvKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl9jcml0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X2FsZXJ0KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X2Vycihjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IGRldl93YXJuKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDIsIDMpCitpbnQgZGV2X25vdGljZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBfX3ByaW50ZigyLCAzKQoraW50IF9kZXZfaW5mbyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreyByZXR1cm4gMDsgfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2VfY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaAppbmRleCA3YWFkMWY0Li44YjY0MjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZV9jZ3JvdXAuaApAQCAtMSw0ICsxLDMgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9ERVZJQ0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaCBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAppbmRleCAwY2I4ZWZmLi43NWZkNTU3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApAQCAtMjY3LDkgKzI2Nyw5IEBACiAjZGVmaW5lIERNX0RFVl9TRVRfR0VPTUVUUlkJX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TRVRfR0VPTUVUUllfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCiAKICNkZWZpbmUgRE1fVkVSU0lPTl9NQUpPUgk0Ci0jZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMjEKKyNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkyMgogI2RlZmluZSBETV9WRVJTSU9OX1BBVENITEVWRUwJMAotI2RlZmluZSBETV9WRVJTSU9OX0VYVFJBCSItaW9jdGwgKDIwMTEtMDctMDYpIgorI2RlZmluZSBETV9WRVJTSU9OX0VYVFJBCSItaW9jdGwgKDIwMTEtMTAtMTkpIgogCiAvKiBTdGF0dXMgYml0cyAqLwogI2RlZmluZSBETV9SRUFET05MWV9GTEFHCSgxIDw8IDApIC8qIEluL091dCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaCBiL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmgKaW5kZXggNWU1NDQ1OC4uNDdkOWQzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCkBAIC01Nyw1ICs1Nyw5IEBACiAJCQkJIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOwogdm9pZCBkbV9rY29weWRfZG9fY2FsbGJhY2sodm9pZCAqam9iLCBpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyKTsKIAoraW50IGRtX2tjb3B5ZF96ZXJvKHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYywKKwkJICAgdW5zaWduZWQgbnVtX2Rlc3RzLCBzdHJ1Y3QgZG1faW9fcmVnaW9uICpkZXN0cywKKwkJICAgdW5zaWduZWQgZmxhZ3MsIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9ETV9LQ09QWURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1sb2ctdXNlcnNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaAppbmRleCBlZWFjZTdkLi4wNjc4YzJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaApAQCAtNTIsMTUgKzUyLDIwIEBACiAgKiBQYXlsb2FkLXRvLXVzZXJzcGFjZToKICAqCUEgc2luZ2xlIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgYXJndiBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5ICcgJ3MKICAqIFBheWxvYWQtdG8ta2VybmVsOgotICoJTm9uZS4gICgnZGF0YV9zaXplJyBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdCBzaG91bGQgYmUgMC4pCisgKglBIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCBpcyB1c2VkCisgKglhcyB0aGUgYmFja2luZyBzdG9yZSBmb3IgdGhlIGxvZyBkYXRhLiAgJ2RtX2dldF9kZXZpY2UnIHdpbGwgYmUgY2FsbGVkCisgKglvbiB0aGlzIGRldmljZS4gICgnZG1fcHV0X2RldmljZScgd2lsbCBiZSBjYWxsZWQgb24gdGhpcyBkZXZpY2UKKyAqCWF1dG9tYXRpY2FsbHkgYWZ0ZXIgY2FsbGluZyBETV9VTE9HX0RUUi4pICBJZiB0aGVyZSBpcyBubyBkZXZpY2UgbmVlZGVkCisgKglmb3IgbG9nIGRhdGEsICdkYXRhX3NpemUnIGluIHRoZSBkbV91bG9nX3JlcXVlc3Qgc3RydWN0IHNob3VsZCBiZSAwLgogICoKICAqIFRoZSBVVUlEIGNvbnRhaW5lZCBpbiB0aGUgZG1fdWxvZ19yZXF1ZXN0IHN0cnVjdHVyZSBpcyB0aGUgcmVmZXJlbmNlIHRoYXQKICAqIHdpbGwgYmUgdXNlZCBieSBhbGwgcmVxdWVzdCB0eXBlcyB0byBhIHNwZWNpZmljIGxvZy4gIFRoZSBjb25zdHJ1Y3RvciBtdXN0Ci0gKiByZWNvcmQgdGhpcyBhc3NvdGlhdGlvbiB3aXRoIGluc3RhbmNlIGNyZWF0ZWQuCisgKiByZWNvcmQgdGhpcyBhc3NvY2lhdGlvbiB3aXRoIHRoZSBpbnN0YW5jZSBjcmVhdGVkLgogICoKICAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB1c2VyLXNwYWNlIG11c3QgcmV0dXJuIHRoZQotICogZG1fdWxvZ19yZXF1ZXN0IHRvIHRoZSBrZXJuZWwgLSBzZXR0aW5nIHRoZSAnZXJyb3InIGZpZWxkIGFuZAotICogJ2RhdGFfc2l6ZScgYXBwcm9wcmlhdGVseS4KKyAqIGRtX3Vsb2dfcmVxdWVzdCB0byB0aGUga2VybmVsIC0gc2V0dGluZyB0aGUgJ2Vycm9yJyBmaWVsZCwgZmlsbGluZyB0aGUKKyAqIGRhdGEgZmllbGQgd2l0aCB0aGUgbG9nIGRldmljZSBpZiBuZWNlc3NhcnksIGFuZCBzZXR0aW5nICdkYXRhX3NpemUnCisgKiBhcHByb3ByaWF0ZWx5LgogICovCiAjZGVmaW5lIERNX1VMT0dfQ1RSICAgICAgICAgICAgICAgICAgICAxCiAKQEAgLTM3Nyw4ICszODIsMTEgQEAKICAqIGRtX3Vsb2dfcmVxdWVzdCBvciBhIGNoYW5nZSBpbiB0aGUgd2F5IHJlcXVlc3RzIGFyZQogICogaXNzdWVkL2hhbmRsZWQuICBDaGFuZ2VzIGFyZSBvdXRsaW5lZCBoZXJlOgogICoJdmVyc2lvbiAxOiAgSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoJdmVyc2lvbiAyOiAgRE1fVUxPR19DVFIgYWxsb3dlZCB0byByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhCisgKgkgICAgICAgICAgICBkZXZpY2UgbmFtZSB0aGF0IGlzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBETSB2aWEKKyAqCSAgICAgICAgICAgICdkbV9nZXRfZGV2aWNlJy4KICAqLwotI2RlZmluZSBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiAxCisjZGVmaW5lIERNX1VMT0dfUkVRVUVTVF9WRVJTSU9OIDIKIAogc3RydWN0IGRtX3Vsb2dfcmVxdWVzdCB7CiAJLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAppbmRleCAzNDdmZGMzLi5lMTMxMTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfTElOVVhfRE1BX01BUFBJTkdfSAogI2RlZmluZSBfTElOVVhfRE1BX01BUFBJTkdfSAogCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWF0dHJzLmg+CkBAIC00MSw2ICs0Miw5IEBACiAJaW50ICgqbWFwcGluZ19lcnJvcikoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKIAlpbnQgKCpkbWFfc3VwcG9ydGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKIAlpbnQgKCpzZXRfZG1hX21hc2spKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworI2lmZGVmIEFSQ0hfSEFTX0RNQV9HRVRfUkVRVUlSRURfTUFTSworCXU2NCAoKmdldF9yZXF1aXJlZF9tYXNrKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCiAJaW50IGlzX3BoeXM7CiB9OwogCkBAIC0xMTcsNiArMTIxLDE1IEBACiAJCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV96YWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKK3sKKwl2b2lkICpyZXQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKKwlpZiAocmV0KQorCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwlyZXR1cm4gcmV0OworfQorCiAjaWZkZWYgQ09ORklHX0hBU19ETUEKIHN0YXRpYyBpbmxpbmUgaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oIGIvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAppbmRleCA4ZmJmNDBlLi43NWY1M2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKQEAgLTI0LDggKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+Ci0KLXN0cnVjdCBzY2F0dGVybGlzdDsKKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qKgogICogdHlwZWRlZiBkbWFfY29va2llX3QgLSBhbiBvcGFxdWUgRE1BIGNvb2tpZQpAQCAtNTE5LDYgKzUyMCwxNiBAQAogCQkJKHVuc2lnbmVkIGxvbmcpY29uZmlnKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZSgKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCXNnX2luaXRfb25lKCZzZywgYnVmLCBsZW4pOworCisJcmV0dXJuIGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwgJnNnLCAxLCBkaXIsIGZsYWdzKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXJldHVybiBkbWFlbmdpbmVfZGV2aWNlX2NvbnRyb2woY2hhbiwgRE1BX1RFUk1JTkFURV9BTEwsIDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFyLmggYi9pbmNsdWRlL2xpbnV4L2RtYXIuaAppbmRleCBhOGIxYTg0Li43MzFhNjA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYXIuaApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogCitzdHJ1Y3QgYWNwaV9kbWFyX2hlYWRlcjsKKwogLyogRE1BUiBGbGFncyAqLwogI2RlZmluZSBETUFSX0lOVFJfUkVNQVAJCTB4MQogI2RlZmluZSBETUFSX1gyQVBJQ19PUFRfT1VUCTB4MgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCBiL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgKaW5kZXggMzZhM2VkNi4uMWIxMDk0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oCkBAIC0zNDksNiArMzQ5LDcgQEAKIAlTWVNfQ01NQiwKIAlTWVNfREFCLAogCVNZU19EVkJUMiwKKwlTWVNfVFVSQk8sCiB9IGZlX2RlbGl2ZXJ5X3N5c3RlbV90OwogCiBzdHJ1Y3QgZHR2X2NtZHNfaCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmggYi9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKaW5kZXggMTQyMWNjOC4uNjY1OTRiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaApAQCAtMjQsNiArMjQsNiBAQAogI2RlZmluZSBfRFZCVkVSU0lPTl9IXwogCiAjZGVmaW5lIERWQl9BUElfVkVSU0lPTiA1Ci0jZGVmaW5lIERWQl9BUElfVkVSU0lPTl9NSU5PUiAzCisjZGVmaW5lIERWQl9BUElfVkVSU0lPTl9NSU5PUiA0CiAKICNlbmRpZiAvKl9EVkJWRVJTSU9OX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9keW5hbWljX2RlYnVnLmgKaW5kZXggMTNhYWU4MC4uMDU2NGUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9keW5hbWljX2RlYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9keW5hbWljX2RlYnVnLmgKQEAgLTM3LDIyICszNywyMSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19ERUJVRykKIGV4dGVybiBpbnQgZGRlYnVnX3JlbW92ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kX25hbWUpOwotZXh0ZXJuIGludCBfX2R5bmFtaWNfcHJfZGVidWcoc3RydWN0IF9kZGVidWcgKmRlc2NyaXB0b3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IF9fZHluYW1pY19wcl9kZWJ1ZyhzdHJ1Y3QgX2RkZWJ1ZyAqZGVzY3JpcHRvciwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgZGV2aWNlOwogCi1leHRlcm4gaW50IF9fZHluYW1pY19kZXZfZGJnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQoraW50IF9fZHluYW1pY19kZXZfZGJnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLCBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IG5ldF9kZXZpY2U7CiAKLWV4dGVybiBpbnQgX19keW5hbWljX25ldGRldl9kYmcoc3RydWN0IF9kZGVidWcgKmRlc2NyaXB0b3IsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQoraW50IF9fZHluYW1pY19uZXRkZXZfZGJnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLAorCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAjZGVmaW5lIERFRklORV9EWU5BTUlDX0RFQlVHX01FVEFEQVRBKG5hbWUsIGZtdCkJCVwKIAlzdGF0aWMgc3RydWN0IF9kZGVidWcgX191c2VkIF9fYWxpZ25lZCg4KQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZGFjLmggYi9pbmNsdWRlL2xpbnV4L2VkYWMuaAppbmRleCA0YTczMjU3Li4wNTViMjQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VkYWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VkYWMuaApAQCAtNDIsNCArNDIsMzU0IEBACiAJcmV0dXJuOwogfQogCisjZGVmaW5lIEVEQUNfTUNfTEFCRUxfTEVOCTMxCisjZGVmaW5lIE1DX1BST0NfTkFNRV9NQVhfTEVOCTcKKworLyogbWVtb3J5IGRldmljZXMgKi8KK2VudW0gZGV2X3R5cGUgeworCURFVl9VTktOT1dOID0gMCwKKwlERVZfWDEsCisJREVWX1gyLAorCURFVl9YNCwKKwlERVZfWDgsCisJREVWX1gxNiwKKwlERVZfWDMyLAkJLyogRG8gdGhlc2UgcGFydHMgZXhpc3Q/ICovCisJREVWX1g2NAkJCS8qIERvIHRoZXNlIHBhcnRzIGV4aXN0PyAqLworfTsKKworI2RlZmluZSBERVZfRkxBR19VTktOT1dOCUJJVChERVZfVU5LTk9XTikKKyNkZWZpbmUgREVWX0ZMQUdfWDEJCUJJVChERVZfWDEpCisjZGVmaW5lIERFVl9GTEFHX1gyCQlCSVQoREVWX1gyKQorI2RlZmluZSBERVZfRkxBR19YNAkJQklUKERFVl9YNCkKKyNkZWZpbmUgREVWX0ZMQUdfWDgJCUJJVChERVZfWDgpCisjZGVmaW5lIERFVl9GTEFHX1gxNgkJQklUKERFVl9YMTYpCisjZGVmaW5lIERFVl9GTEFHX1gzMgkJQklUKERFVl9YMzIpCisjZGVmaW5lIERFVl9GTEFHX1g2NAkJQklUKERFVl9YNjQpCisKKy8qIG1lbW9yeSB0eXBlcyAqLworZW51bSBtZW1fdHlwZSB7CisJTUVNX0VNUFRZID0gMCwJCS8qIEVtcHR5IGNzcm93ICovCisJTUVNX1JFU0VSVkVELAkJLyogUmVzZXJ2ZWQgY3Nyb3cgdHlwZSAqLworCU1FTV9VTktOT1dOLAkJLyogVW5rbm93biBjc3JvdyB0eXBlICovCisJTUVNX0ZQTSwJCS8qIEZhc3QgcGFnZSBtb2RlICovCisJTUVNX0VETywJCS8qIEV4dGVuZGVkIGRhdGEgb3V0ICovCisJTUVNX0JFRE8sCQkvKiBCdXJzdCBFeHRlbmRlZCBkYXRhIG91dCAqLworCU1FTV9TRFIsCQkvKiBTaW5nbGUgZGF0YSByYXRlIFNEUkFNICovCisJTUVNX1JEUiwJCS8qIFJlZ2lzdGVyZWQgc2luZ2xlIGRhdGEgcmF0ZSBTRFJBTSAqLworCU1FTV9ERFIsCQkvKiBEb3VibGUgZGF0YSByYXRlIFNEUkFNICovCisJTUVNX1JERFIsCQkvKiBSZWdpc3RlcmVkIERvdWJsZSBkYXRhIHJhdGUgU0RSQU0gKi8KKwlNRU1fUk1CUywJCS8qIFJhbWJ1cyBEUkFNICovCisJTUVNX0REUjIsCQkvKiBERFIyIFJBTSAqLworCU1FTV9GQl9ERFIyLAkJLyogZnVsbHkgYnVmZmVyZWQgRERSMiAqLworCU1FTV9SRERSMiwJCS8qIFJlZ2lzdGVyZWQgRERSMiBSQU0gKi8KKwlNRU1fWERSLAkJLyogUmFtYnVzIFhEUiAqLworCU1FTV9ERFIzLAkJLyogRERSMyBSQU0gKi8KKwlNRU1fUkREUjMsCQkvKiBSZWdpc3RlcmVkIEREUjMgUkFNICovCit9OworCisjZGVmaW5lIE1FTV9GTEFHX0VNUFRZCQlCSVQoTUVNX0VNUFRZKQorI2RlZmluZSBNRU1fRkxBR19SRVNFUlZFRAlCSVQoTUVNX1JFU0VSVkVEKQorI2RlZmluZSBNRU1fRkxBR19VTktOT1dOCUJJVChNRU1fVU5LTk9XTikKKyNkZWZpbmUgTUVNX0ZMQUdfRlBNCQlCSVQoTUVNX0ZQTSkKKyNkZWZpbmUgTUVNX0ZMQUdfRURPCQlCSVQoTUVNX0VETykKKyNkZWZpbmUgTUVNX0ZMQUdfQkVETwkJQklUKE1FTV9CRURPKQorI2RlZmluZSBNRU1fRkxBR19TRFIJCUJJVChNRU1fU0RSKQorI2RlZmluZSBNRU1fRkxBR19SRFIJCUJJVChNRU1fUkRSKQorI2RlZmluZSBNRU1fRkxBR19ERFIJCUJJVChNRU1fRERSKQorI2RlZmluZSBNRU1fRkxBR19SRERSCQlCSVQoTUVNX1JERFIpCisjZGVmaW5lIE1FTV9GTEFHX1JNQlMJCUJJVChNRU1fUk1CUykKKyNkZWZpbmUgTUVNX0ZMQUdfRERSMiAgICAgICAgICAgQklUKE1FTV9ERFIyKQorI2RlZmluZSBNRU1fRkxBR19GQl9ERFIyICAgICAgICBCSVQoTUVNX0ZCX0REUjIpCisjZGVmaW5lIE1FTV9GTEFHX1JERFIyICAgICAgICAgIEJJVChNRU1fUkREUjIpCisjZGVmaW5lIE1FTV9GTEFHX1hEUiAgICAgICAgICAgIEJJVChNRU1fWERSKQorI2RlZmluZSBNRU1fRkxBR19ERFIzCQkgQklUKE1FTV9ERFIzKQorI2RlZmluZSBNRU1fRkxBR19SRERSMwkJIEJJVChNRU1fUkREUjMpCisKKy8qIGNoaXBzZXQgRXJyb3IgRGV0ZWN0aW9uIGFuZCBDb3JyZWN0aW9uIGNhcGFiaWxpdGllcyBhbmQgbW9kZSAqLworZW51bSBlZGFjX3R5cGUgeworCUVEQUNfVU5LTk9XTiA9IDAsCS8qIFVua25vd24gaWYgRUNDIGlzIGF2YWlsYWJsZSAqLworCUVEQUNfTk9ORSwJCS8qIERvZXNuJ3Qgc3VwcG9ydCBFQ0MgKi8KKwlFREFDX1JFU0VSVkVELAkJLyogUmVzZXJ2ZWQgRUNDIHR5cGUgKi8KKwlFREFDX1BBUklUWSwJCS8qIERldGVjdHMgcGFyaXR5IGVycm9ycyAqLworCUVEQUNfRUMsCQkvKiBFcnJvciBDaGVja2luZyAtIG5vIGNvcnJlY3Rpb24gKi8KKwlFREFDX1NFQ0RFRCwJCS8qIFNpbmdsZSBiaXQgZXJyb3IgY29ycmVjdGlvbiwgRG91YmxlIGRldGVjdGlvbiAqLworCUVEQUNfUzJFQ0QyRUQsCQkvKiBDaGlwa2lsbCB4MiBkZXZpY2VzIC0gZG8gdGhlc2UgZXhpc3Q/ICovCisJRURBQ19TNEVDRDRFRCwJCS8qIENoaXBraWxsIHg0IGRldmljZXMgKi8KKwlFREFDX1M4RUNEOEVELAkJLyogQ2hpcGtpbGwgeDggZGV2aWNlcyAqLworCUVEQUNfUzE2RUNEMTZFRCwJLyogQ2hpcGtpbGwgeDE2IGRldmljZXMgKi8KK307CisKKyNkZWZpbmUgRURBQ19GTEFHX1VOS05PV04JQklUKEVEQUNfVU5LTk9XTikKKyNkZWZpbmUgRURBQ19GTEFHX05PTkUJCUJJVChFREFDX05PTkUpCisjZGVmaW5lIEVEQUNfRkxBR19QQVJJVFkJQklUKEVEQUNfUEFSSVRZKQorI2RlZmluZSBFREFDX0ZMQUdfRUMJCUJJVChFREFDX0VDKQorI2RlZmluZSBFREFDX0ZMQUdfU0VDREVECUJJVChFREFDX1NFQ0RFRCkKKyNkZWZpbmUgRURBQ19GTEFHX1MyRUNEMkVECUJJVChFREFDX1MyRUNEMkVEKQorI2RlZmluZSBFREFDX0ZMQUdfUzRFQ0Q0RUQJQklUKEVEQUNfUzRFQ0Q0RUQpCisjZGVmaW5lIEVEQUNfRkxBR19TOEVDRDhFRAlCSVQoRURBQ19TOEVDRDhFRCkKKyNkZWZpbmUgRURBQ19GTEFHX1MxNkVDRDE2RUQJQklUKEVEQUNfUzE2RUNEMTZFRCkKKworLyogc2NydWJiaW5nIGNhcGFiaWxpdGllcyAqLworZW51bSBzY3J1Yl90eXBlIHsKKwlTQ1JVQl9VTktOT1dOID0gMCwJLyogVW5rbm93biBpZiBzY3J1YmJlciBpcyBhdmFpbGFibGUgKi8KKwlTQ1JVQl9OT05FLAkJLyogTm8gc2NydWJiZXIgKi8KKwlTQ1JVQl9TV19QUk9HLAkJLyogU1cgcHJvZ3Jlc3NpdmUgKHNlcXVlbnRpYWwpIHNjcnViYmluZyAqLworCVNDUlVCX1NXX1NSQywJCS8qIFNvZnR3YXJlIHNjcnViIG9ubHkgZXJyb3JzICovCisJU0NSVUJfU1dfUFJPR19TUkMsCS8qIFByb2dyZXNzaXZlIHNvZnR3YXJlIHNjcnViIGZyb20gYW4gZXJyb3IgKi8KKwlTQ1JVQl9TV19UVU5BQkxFLAkvKiBTb2Z0d2FyZSBzY3J1YiBmcmVxdWVuY3kgaXMgdHVuYWJsZSAqLworCVNDUlVCX0hXX1BST0csCQkvKiBIVyBwcm9ncmVzc2l2ZSAoc2VxdWVudGlhbCkgc2NydWJiaW5nICovCisJU0NSVUJfSFdfU1JDLAkJLyogSGFyZHdhcmUgc2NydWIgb25seSBlcnJvcnMgKi8KKwlTQ1JVQl9IV19QUk9HX1NSQywJLyogUHJvZ3Jlc3NpdmUgaGFyZHdhcmUgc2NydWIgZnJvbSBhbiBlcnJvciAqLworCVNDUlVCX0hXX1RVTkFCTEUJLyogSGFyZHdhcmUgc2NydWIgZnJlcXVlbmN5IGlzIHR1bmFibGUgKi8KK307CisKKyNkZWZpbmUgU0NSVUJfRkxBR19TV19QUk9HCUJJVChTQ1JVQl9TV19QUk9HKQorI2RlZmluZSBTQ1JVQl9GTEFHX1NXX1NSQwlCSVQoU0NSVUJfU1dfU1JDKQorI2RlZmluZSBTQ1JVQl9GTEFHX1NXX1BST0dfU1JDCUJJVChTQ1JVQl9TV19QUk9HX1NSQykKKyNkZWZpbmUgU0NSVUJfRkxBR19TV19UVU4JQklUKFNDUlVCX1NXX1NDUlVCX1RVTkFCTEUpCisjZGVmaW5lIFNDUlVCX0ZMQUdfSFdfUFJPRwlCSVQoU0NSVUJfSFdfUFJPRykKKyNkZWZpbmUgU0NSVUJfRkxBR19IV19TUkMJQklUKFNDUlVCX0hXX1NSQykKKyNkZWZpbmUgU0NSVUJfRkxBR19IV19QUk9HX1NSQwlCSVQoU0NSVUJfSFdfUFJPR19TUkMpCisjZGVmaW5lIFNDUlVCX0ZMQUdfSFdfVFVOCUJJVChTQ1JVQl9IV19UVU5BQkxFKQorCisvKiBGSVhNRSAtIHNob3VsZCBoYXZlIG5vdGlmeSBjYXBhYmlsaXRpZXM6IE5NSSwgTE9HLCBQUk9DLCBldGMgKi8KKworLyogRURBQyBpbnRlcm5hbCBvcGVyYXRpb24gc3RhdGVzICovCisjZGVmaW5lCU9QX0FMTE9DCQkweDEwMAorI2RlZmluZSBPUF9SVU5OSU5HX1BPTEwJCTB4MjAxCisjZGVmaW5lIE9QX1JVTk5JTkdfSU5URVJSVVBUCTB4MjAyCisjZGVmaW5lIE9QX1JVTk5JTkdfUE9MTF9JTlRSCTB4MjAzCisjZGVmaW5lIE9QX09GRkxJTkUJCTB4MzAwCisKKy8qCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdG8gYmUgYXdhcmUgb2YgdGhhdCBhcmVuJ3QgYXQgYWxsIG9idmlvdXM6CisgKgorICoKKyAqIFNPQ0tFVFMsIFNPQ0tFVCBTRVRTLCBCQU5LUywgUk9XUywgQ0hJUC1TRUxFQ1QgUk9XUywgQ0hBTk5FTFMsIGV0Yy4uCisgKgorICogVGhlc2UgYXJlIHNvbWUgb2YgdGhlIG1hbnkgdGVybXMgdGhhdCBhcmUgdGhyb3duIGFib3V0IHRoYXQgZG9uJ3QgYWx3YXlzCisgKiBtZWFuIHdoYXQgcGVvcGxlIHRoaW5rIHRoZXkgbWVhbiAoSW5jb25jZWl2YWJsZSEpLiAgSW4gdGhlIGludGVyZXN0IG9mCisgKiBjcmVhdGluZyBhIGNvbW1vbiBncm91bmQgZm9yIGRpc2N1c3Npb24sIHRlcm1zIGFuZCB0aGVpciBkZWZpbml0aW9ucworICogd2lsbCBiZSBlc3RhYmxpc2hlZC4KKyAqCisgKiBNZW1vcnkgZGV2aWNlczoJVGhlIGluZGl2aWR1YWwgY2hpcCBvbiBhIG1lbW9yeSBzdGljay4gIFRoZXNlIGRldmljZXMKKyAqCQkJY29tbW9ubHkgb3V0cHV0IDQgYW5kIDggYml0cyBlYWNoLiAgR3JvdXBpbmcgc2V2ZXJhbAorICoJCQlvZiB0aGVzZSBpbiBwYXJhbGxlbCBwcm92aWRlcyA2NCBiaXRzIHdoaWNoIGlzIGNvbW1vbgorICoJCQlmb3IgYSBtZW1vcnkgc3RpY2suCisgKgorICogTWVtb3J5IFN0aWNrOglBIHByaW50ZWQgY2lyY3VpdCBib2FyZCB0aGF0IGFnZ3JlZ2F0ZXMgbXVsdGlwbGUKKyAqCQkJbWVtb3J5IGRldmljZXMgaW4gcGFyYWxsZWwuICBUaGlzIGlzIHRoZSBhdG9taWMKKyAqCQkJbWVtb3J5IGNvbXBvbmVudCB0aGF0IGlzIHB1cmNoYXNlYWJsZSBieSBKb2UgY29uc3VtZXIKKyAqCQkJYW5kIGxvYWRlZCBpbnRvIGEgbWVtb3J5IHNvY2tldC4KKyAqCisgKiBTb2NrZXQ6CQlBIHBoeXNpY2FsIGNvbm5lY3RvciBvbiB0aGUgbW90aGVyYm9hcmQgdGhhdCBhY2NlcHRzCisgKgkJCWEgc2luZ2xlIG1lbW9yeSBzdGljay4KKyAqCisgKiBDaGFubmVsOgkJU2V0IG9mIG1lbW9yeSBkZXZpY2VzIG9uIGEgbWVtb3J5IHN0aWNrIHRoYXQgbXVzdCBiZQorICoJCQlncm91cGVkIGluIHBhcmFsbGVsIHdpdGggb25lIG9yIG1vcmUgYWRkaXRpb25hbAorICoJCQljaGFubmVscyBmcm9tIG90aGVyIG1lbW9yeSBzdGlja3MuICBUaGlzIHBhcmFsbGVsCisgKgkJCWdyb3VwaW5nIG9mIHRoZSBvdXRwdXQgZnJvbSBtdWx0aXBsZSBjaGFubmVscyBhcmUKKyAqCQkJbmVjZXNzYXJ5IGZvciB0aGUgc21hbGxlc3QgZ3JhbnVsYXJpdHkgb2YgbWVtb3J5IGFjY2Vzcy4KKyAqCQkJU29tZSBtZW1vcnkgY29udHJvbGxlcnMgYXJlIGNhcGFibGUgb2Ygc2luZ2xlIGNoYW5uZWwgLQorICoJCQl3aGljaCBtZWFucyB0aGF0IG1lbW9yeSBzdGlja3MgY2FuIGJlIGxvYWRlZAorICoJCQlpbmRpdmlkdWFsbHkuICBPdGhlciBtZW1vcnkgY29udHJvbGxlcnMgYXJlIG9ubHkKKyAqCQkJY2FwYWJsZSBvZiBkdWFsIGNoYW5uZWwgLSB3aGljaCBtZWFucyB0aGF0IG1lbW9yeQorICoJCQlzdGlja3MgbXVzdCBiZSBsb2FkZWQgYXMgcGFpcnMgKHNlZSAic29ja2V0IHNldCIpLgorICoKKyAqIENoaXAtc2VsZWN0IHJvdzoJQWxsIG9mIHRoZSBtZW1vcnkgZGV2aWNlcyB0aGF0IGFyZSBzZWxlY3RlZCB0b2dldGhlci4KKyAqCQkJZm9yIGEgc2luZ2xlLCBtaW5pbXVtIGdyYWluIG9mIG1lbW9yeSBhY2Nlc3MuCisgKgkJCVRoaXMgc2VsZWN0cyBhbGwgb2YgdGhlIHBhcmFsbGVsIG1lbW9yeSBkZXZpY2VzIGFjcm9zcworICoJCQlhbGwgb2YgdGhlIHBhcmFsbGVsIGNoYW5uZWxzLiAgQ29tbW9uIGNoaXAtc2VsZWN0IHJvd3MKKyAqCQkJZm9yIHNpbmdsZSBjaGFubmVsIGFyZSA2NCBiaXRzLCBmb3IgZHVhbCBjaGFubmVsIDEyOAorICoJCQliaXRzLgorICoKKyAqIFNpbmdsZS1SYW5rZWQgc3RpY2s6CUEgU2luZ2xlLXJhbmtlZCBzdGljayBoYXMgMSBjaGlwLXNlbGVjdCByb3cgb2YgbWVtb3J5LgorICoJCQlNb3RoZXJib2FyZHMgY29tbW9ubHkgZHJpdmUgdHdvIGNoaXAtc2VsZWN0IHBpbnMgdG8KKyAqCQkJYSBtZW1vcnkgc3RpY2suIEEgc2luZ2xlLXJhbmtlZCBzdGljaywgd2lsbCBvY2N1cHkKKyAqCQkJb25seSBvbmUgb2YgdGhvc2Ugcm93cy4gVGhlIG90aGVyIHdpbGwgYmUgdW51c2VkLgorICoKKyAqIERvdWJsZS1SYW5rZWQgc3RpY2s6CUEgZG91YmxlLXJhbmtlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKKyAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bworICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuCisgKgorICogRG91YmxlLXNpZGVkIHN0aWNrOglERVBSRUNBVEVEIFRFUk0sIHNlZSBEb3VibGUtUmFua2VkIHN0aWNrLgorICoJCQlBIGRvdWJsZS1zaWRlZCBzdGljayBoYXMgdHdvIGNoaXAtc2VsZWN0IHJvd3Mgd2hpY2gKKyAqCQkJYWNjZXNzIGRpZmZlcmVudCBzZXRzIG9mIG1lbW9yeSBkZXZpY2VzLiAgVGhlIHR3bworICoJCQlyb3dzIGNhbm5vdCBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkuICAiRG91YmxlLXNpZGVkIgorICoJCQlpcyBpcnJlc3BlY3RpdmUgb2YgdGhlIG1lbW9yeSBkZXZpY2VzIGJlaW5nIG1vdW50ZWQKKyAqCQkJb24gYm90aCBzaWRlcyBvZiB0aGUgbWVtb3J5IHN0aWNrLgorICoKKyAqIFNvY2tldCBzZXQ6CQlBbGwgb2YgdGhlIG1lbW9yeSBzdGlja3MgdGhhdCBhcmUgcmVxdWlyZWQgZm9yCisgKgkJCWEgc2luZ2xlIG1lbW9yeSBhY2Nlc3Mgb3IgYWxsIG9mIHRoZSBtZW1vcnkgc3RpY2tzCisgKgkJCXNwYW5uZWQgYnkgYSBjaGlwLXNlbGVjdCByb3cuICBBIHNpbmdsZSBzb2NrZXQgc2V0CisgKgkJCWhhcyB0d28gY2hpcC1zZWxlY3Qgcm93cyBhbmQgaWYgZG91YmxlLXNpZGVkIHN0aWNrcworICoJCQlhcmUgdXNlZCB0aGVzZSB3aWxsIG9jY3VweSB0aG9zZSBjaGlwLXNlbGVjdCByb3dzLgorICoKKyAqIEJhbms6CQlUaGlzIHRlcm0gaXMgYXZvaWRlZCBiZWNhdXNlIGl0IGlzIHVuY2xlYXIgd2hlbgorICoJCQluZWVkaW5nIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gY2hpcC1zZWxlY3Qgcm93cyBhbmQKKyAqCQkJc29ja2V0IHNldHMuCisgKgorICogQ29udHJvbGxlciBwYWdlczoKKyAqCisgKiBQaHlzaWNhbCBwYWdlczoKKyAqCisgKiBWaXJ0dWFsIHBhZ2VzOgorICoKKyAqCisgKiBTVFJVQ1RVUkUgT1JHQU5JWkFUSU9OIEFORCBDSE9JQ0VTCisgKgorICoKKyAqCisgKiBQUyAtIEkgZW5qb3llZCB3cml0aW5nIGFsbCB0aGF0IGFib3V0IGFzIG11Y2ggYXMgeW91IGVuam95ZWQgcmVhZGluZyBpdC4KKyAqLworCitzdHJ1Y3QgY2hhbm5lbF9pbmZvIHsKKwlpbnQgY2hhbl9pZHg7CQkvKiBjaGFubmVsIGluZGV4ICovCisJdTMyIGNlX2NvdW50OwkJLyogQ29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIENIQU5ORUwgKi8KKwljaGFyIGxhYmVsW0VEQUNfTUNfTEFCRUxfTEVOICsgMV07CS8qIERJTU0gbGFiZWwgb24gbW90aGVyYm9hcmQgKi8KKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CS8qIHRoZSBwYXJlbnQgKi8KK307CisKK3N0cnVjdCBjc3Jvd19pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3BhZ2U7CS8qIGZpcnN0IHBhZ2UgbnVtYmVyIGluIGRpbW0gKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFnZTsJLyogbGFzdCBwYWdlIG51bWJlciBpbiBkaW1tICovCisJdW5zaWduZWQgbG9uZyBwYWdlX21hc2s7CS8qIHVzZWQgZm9yIGludGVybGVhdmluZyAtCisJCQkJCSAqIDBVTCBmb3Igbm9uIGludGx2CisJCQkJCSAqLworCXUzMiBucl9wYWdlczsJCS8qIG51bWJlciBvZiBwYWdlcyBpbiBjc3JvdyAqLworCXUzMiBncmFpbjsJCS8qIGdyYW51bGFyaXR5IG9mIHJlcG9ydGVkIGVycm9yIGluIGJ5dGVzICovCisJaW50IGNzcm93X2lkeDsJCS8qIHRoZSBjaGlwLXNlbGVjdCByb3cgKi8KKwllbnVtIGRldl90eXBlIGR0eXBlOwkvKiBtZW1vcnkgZGV2aWNlIHR5cGUgKi8KKwl1MzIgdWVfY291bnQ7CQkvKiBVbmNvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBjc3JvdyAqLworCXUzMiBjZV9jb3VudDsJCS8qIENvcnJlY3RhYmxlIEVycm9ycyBmb3IgdGhpcyBjc3JvdyAqLworCWVudW0gbWVtX3R5cGUgbXR5cGU7CS8qIG1lbW9yeSBjc3JvdyB0eXBlICovCisJZW51bSBlZGFjX3R5cGUgZWRhY19tb2RlOwkvKiBFREFDIG1vZGUgZm9yIHRoaXMgY3Nyb3cgKi8KKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CS8qIHRoZSBwYXJlbnQgKi8KKworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CS8qIHN5c2ZzIGtvYmplY3QgZm9yIHRoaXMgY3Nyb3cgKi8KKworCS8qIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoaXMgY3Nyb3cgKi8KKwl1MzIgbnJfY2hhbm5lbHM7CisJc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbHM7Cit9OworCitzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwIHsKKwljb25zdCBjaGFyICpuYW1lOwkJCQkvKiBncm91cCBuYW1lICovCisJY29uc3Qgc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgKm1jaWRldl9hdHRyOyAvKiBncm91cCBhdHRyaWJ1dGVzICovCit9OworCitzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2dyb3VwX2tvYmogeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3QgZm9yIGFsbCBpbnN0YW5jZXMgd2l0aGluIGEgbWMgKi8KKworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CQkvKiBrb2JqIGZvciB0aGUgZ3JvdXAgKi8KKworCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfZ3JvdXAgKmdycDsJLyogZ3JvdXAgZGVzY3JpcHRpb24gdGFibGUgKi8KKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CS8qIHRoZSBwYXJlbnQgKi8KK307CisKKy8qIG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgc3RydWN0dXJlCisgKgl1c2VkIGZvciBkcml2ZXIgc3lzZnMgYXR0cmlidXRlcyBhbmQgaW4gbWVtX2N0bF9pbmZvCisgKiAJc3lzZnMgdG9wIGxldmVsIGVudHJpZXMKKyAqLworc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgeworCS8qIEl0IHNob3VsZCB1c2UgZWl0aGVyIGF0dHIgb3IgZ3JwICovCisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCWNvbnN0IHN0cnVjdCBtY2lkZXZfc3lzZnNfZ3JvdXAgKmdycDsJLyogUG9pbnRzIHRvIGEgZ3JvdXAgb2YgYXR0cmlidXRlcyAqLworCisJLyogT3BzIGZvciBzaG93L3N0b3JlIHZhbHVlcyBhdCB0aGUgYXR0cmlidXRlIC0gbm90IHVzZWQgb24gZ3JvdXAgKi8KKyAgICAgICAgc3NpemVfdCAoKnNob3cpKHN0cnVjdCBtZW1fY3RsX2luZm8gKixjaGFyICopOworICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtZW1fY3RsX2luZm8gKiwgY29uc3QgY2hhciAqLHNpemVfdCk7Cit9OworCisvKiBNRU1PUlkgY29udHJvbGxlciBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IG1lbV9jdGxfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwkvKiBmb3IgZ2xvYmFsIGxpc3Qgb2YgbWVtX2N0bF9pbmZvIHN0cnVjdHMgKi8KKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOwkvKiBNb2R1bGUgb3duZXIgb2YgdGhpcyBjb250cm9sIHN0cnVjdCAqLworCisJdW5zaWduZWQgbG9uZyBtdHlwZV9jYXA7CS8qIG1lbW9yeSB0eXBlcyBzdXBwb3J0ZWQgYnkgbWMgKi8KKwl1bnNpZ25lZCBsb25nIGVkYWNfY3RsX2NhcDsJLyogTWVtIGNvbnRyb2xsZXIgRURBQyBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGVkYWNfY2FwOwkvKiBjb25maWd1cmF0aW9uIGNhcGFiaWxpdGllcyAtIHRoaXMgaXMKKwkJCQkgKiBjbG9zZWx5IHJlbGF0ZWQgdG8gZWRhY19jdGxfY2FwLiAgVGhlCisJCQkJICogZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBjb250cm9sbGVyIG1heSBiZQorCQkJCSAqIGNhcGFibGUgb2YgczRlY2Q0ZWQgd2hpY2ggd291bGQgYmUgbGlzdGVkCisJCQkJICogaW4gZWRhY19jdGxfY2FwLCBidXQgaWYgY2hhbm5lbHMgYXJlbid0CisJCQkJICogY2FwYWJsZSBvZiBzNGVjZDRlZCB0aGVuIHRoZSBlZGFjX2NhcCB3b3VsZAorCQkJCSAqIG5vdCBoYXZlIHRoYXQgY2FwYWJpbGl0eS4KKwkJCQkgKi8KKwl1bnNpZ25lZCBsb25nIHNjcnViX2NhcDsJLyogY2hpcHNldCBzY3J1YiBjYXBhYmlsaXRpZXMgKi8KKwllbnVtIHNjcnViX3R5cGUgc2NydWJfbW9kZTsJLyogY3VycmVudCBzY3J1YiBtb2RlICovCisKKwkvKiBUcmFuc2xhdGVzIHNkcmFtIG1lbW9yeSBzY3J1YiByYXRlIGdpdmVuIGluIGJ5dGVzL3NlYyB0byB0aGUKKwkgICBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBhbmQgY29uZmlndXJlcyB3aGF0ZXZlciBlbHNlIG5lZWRzCisJICAgdG8gYmUgY29uZmlndXJlZC4KKwkgKi8KKwlpbnQgKCpzZXRfc2RyYW1fc2NydWJfcmF0ZSkgKHN0cnVjdCBtZW1fY3RsX2luZm8gKiBtY2ksIHUzMiBidyk7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc2RyYW0gbWVtb3J5IHNjcnViIHJhdGUgZnJvbSB0aGUgaW50ZXJuYWwKKwkgICByZXByZXNlbnRhdGlvbiBhbmQgY29udmVydHMgaXQgdG8gdGhlIGNsb3Nlc3QgbWF0Y2hpbmcKKwkgICBiYW5kd2lkdGggaW4gYnl0ZXMvc2VjLgorCSAqLworCWludCAoKmdldF9zZHJhbV9zY3J1Yl9yYXRlKSAoc3RydWN0IG1lbV9jdGxfaW5mbyAqIG1jaSk7CisKKworCS8qIHBvaW50ZXIgdG8gZWRhYyBjaGVja2luZyByb3V0aW5lICovCisJdm9pZCAoKmVkYWNfY2hlY2spIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpKTsKKworCS8qCisJICogUmVtYXBzIG1lbW9yeSBwYWdlczogY29udHJvbGxlciBwYWdlcyB0byBwaHlzaWNhbCBwYWdlcy4KKwkgKiBGb3IgbW9zdCBNQydzLCB0aGlzIHdpbGwgYmUgTlVMTC4KKwkgKi8KKwkvKiBGSVhNRSAtIHdoeSBub3Qgc2VuZCB0aGUgcGh5cyBwYWdlIHRvIGJlZ2luIHdpdGg/ICovCisJdW5zaWduZWQgbG9uZyAoKmN0bF9wYWdlX3RvX3BoeXMpIChzdHJ1Y3QgbWVtX2N0bF9pbmZvICogbWNpLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHBhZ2UpOworCWludCBtY19pZHg7CisJaW50IG5yX2Nzcm93czsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3dzOworCS8qCisJICogRklYTUUgLSB3aGF0IGFib3V0IGNvbnRyb2xsZXJzIG9uIG90aGVyIGJ1c3Nlcz8gLSBJRHMgbXVzdCBiZQorCSAqIHVuaXF1ZS4gIGRldiBwb2ludGVyIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgdW5pcXVlLCBidXQKKwkgKiBCVVM6U0xPVC5GVU5DIG51bWJlcnMgbWF5IG5vdCBiZSB1bmlxdWUuCisJICovCisJc3RydWN0IGRldmljZSAqZGV2OworCWNvbnN0IGNoYXIgKm1vZF9uYW1lOworCWNvbnN0IGNoYXIgKm1vZF92ZXI7CisJY29uc3QgY2hhciAqY3RsX25hbWU7CisJY29uc3QgY2hhciAqZGV2X25hbWU7CisJY2hhciBwcm9jX25hbWVbTUNfUFJPQ19OQU1FX01BWF9MRU4gKyAxXTsKKwl2b2lkICpwdnRfaW5mbzsKKwl1MzIgdWVfbm9pbmZvX2NvdW50OwkvKiBVbmNvcnJlY3RhYmxlIEVycm9ycyB3L28gaW5mbyAqLworCXUzMiBjZV9ub2luZm9fY291bnQ7CS8qIENvcnJlY3RhYmxlIEVycm9ycyB3L28gaW5mbyAqLworCXUzMiB1ZV9jb3VudDsJCS8qIFRvdGFsIFVuY29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIE1DICovCisJdTMyIGNlX2NvdW50OwkJLyogVG90YWwgQ29ycmVjdGFibGUgRXJyb3JzIGZvciB0aGlzIE1DICovCisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwkvKiBtY2kgbG9hZCBzdGFydCB0aW1lIChpbiBqaWZmaWVzKSAqLworCisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisKKwkvKiBlZGFjIHN5c2ZzIGRldmljZSBjb250cm9sICovCisJc3RydWN0IGtvYmplY3QgZWRhY19tY2lfa29iajsKKworCS8qIGxpc3QgZm9yIGFsbCBncnAgaW5zdGFuY2VzIHdpdGhpbiBhIG1jICovCisJc3RydWN0IGxpc3RfaGVhZCBncnBfa29ial9saXN0OworCisJLyogQWRkaXRpb25hbCB0b3AgY29udHJvbGxlciBsZXZlbCBhdHRyaWJ1dGVzLCBidXQgc3BlY2lmaWVkCisJICogYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIuCisJICoKKwkgKiBTZXQgYnkgdGhlIGxvdyBsZXZlbCBkcml2ZXIgdG8gcHJvdmlkZSBhdHRyaWJ1dGVzIGF0IHRoZQorCSAqIGNvbnRyb2xsZXIgbGV2ZWwsIHNhbWUgbGV2ZWwgYXMgJ3VlX2NvdW50JyBhbmQgJ2NlX2NvdW50JyBhYm92ZS4KKwkgKiBBbiBhcnJheSBvZiBzdHJ1Y3R1cmVzLCBOVUxMIHRlcm1pbmF0ZWQKKwkgKgorCSAqIElmIGF0dHJpYnV0ZXMgYXJlIGRlc2lyZWQsIHRoZW4gc2V0IHRvIGFycmF5IG9mIGF0dHJpYnV0ZXMKKwkgKiBJZiBubyBhdHRyaWJ1dGVzIGFyZSBkZXNpcmVkLCBsZWF2ZSBOVUxMCisJICovCisJY29uc3Qgc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgKm1jX2RyaXZlcl9zeXNmc19hdHRyaWJ1dGVzOworCisJLyogd29yayBzdHJ1Y3QgZm9yIHRoaXMgTUMgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CisKKwkvKiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBjb250cm9sbGVyIGluc3RhbmNlICovCisJaW50IG9wX3N0YXRlOworfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VkYWNfbWNlLmggYi9pbmNsdWRlL2xpbnV4L2VkYWNfbWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzRmYzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9lZGFjX21jZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogUHJvdmlkZXMgZWRhYyBpbnRlcmZhY2UgdG8gbWNlbG9nIGV2ZW50cwotICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieToKLSAqCSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KLSAqCi0gKiBSZWQgSGF0IEluYy4gaHR0cDovL3d3dy5yZWRoYXQuY29tCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0VEQUNfTUNFKSB8fCBcCi0JCQkoZGVmaW5lZChDT05GSUdfRURBQ19NQ0VfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi0KLSNpbmNsdWRlIDxhc20vbWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi1zdHJ1Y3QgZWRhY19tY2UgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXZvaWQgKnByaXY7Ci0JaW50ICgqY2hlY2tfZXJyb3IpKHZvaWQgKnByaXYsIHN0cnVjdCBtY2UgKm1jZSk7Ci19OwotCi1pbnQgZWRhY19tY2VfcmVnaXN0ZXIoc3RydWN0IGVkYWNfbWNlICplZGFjX21jZSk7Ci12b2lkIGVkYWNfbWNlX3VucmVnaXN0ZXIoc3RydWN0IGVkYWNfbWNlICplZGFjX21jZSk7Ci1pbnQgZWRhY19tY2VfcGFyc2Uoc3RydWN0IG1jZSAqbWNlKTsKLQotI2Vsc2UKLSNkZWZpbmUgZWRhY19tY2VfcGFyc2UobWNlKSAoMCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCmluZGV4IGQ4MDBkNTEuLjFkMGY3YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKQEAgLTM4LDYgKzM4LDEyIEBACiAJZWxldmF0b3JfbWVyZ2VkX2ZuICplbGV2YXRvcl9tZXJnZWRfZm47CiAJZWxldmF0b3JfbWVyZ2VfcmVxX2ZuICplbGV2YXRvcl9tZXJnZV9yZXFfZm47CiAJZWxldmF0b3JfYWxsb3dfbWVyZ2VfZm4gKmVsZXZhdG9yX2FsbG93X21lcmdlX2ZuOworCisJLyoKKwkgKiBVc2VkIGZvciBib3RoIHBsdWdnZWQgbGlzdCBhbmQgZWxldmF0b3IgbWVyZ2luZyBhbmQgaW4gdGhlCisJICogZm9ybWVyIGNhc2UgY2FsbGVkIHdpdGhvdXQgcXVldWVfbG9jay4gIFJlYWQgY29tbWVudCBvbiB0b3Agb2YKKwkgKiBhdHRlbXB0X3BsdWdfbWVyZ2UoKSBmb3IgZGV0YWlscy4KKwkgKi8KIAllbGV2YXRvcl9iaW9fbWVyZ2VkX2ZuICplbGV2YXRvcl9iaW9fbWVyZ2VkX2ZuOwogCiAJZWxldmF0b3JfZGlzcGF0Y2hfZm4gKmVsZXZhdG9yX2Rpc3BhdGNoX2ZuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggMTEwODIxYy4uMzFmMDUwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0zOTUsNiArMzk1LDcgQEAKICNkZWZpbmUgTlRfUzM5MF9DVFJTCTB4MzA0CQkvKiBzMzkwIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE5UX1MzOTBfUFJFRklYCTB4MzA1CQkvKiBzMzkwIHByZWZpeCByZWdpc3RlciAqLwogI2RlZmluZSBOVF9TMzkwX0xBU1RfQlJFQUsJMHgzMDYJLyogczM5MCBicmVha2luZyBldmVudCBhZGRyZXNzICovCisjZGVmaW5lIE5UX1MzOTBfU1lTVEVNX0NBTEwJMHgzMDcJLyogczM5MCBzeXN0ZW0gY2FsbCByZXN0YXJ0IGRhdGEgKi8KICNkZWZpbmUgTlRfQVJNX1ZGUAkweDQwMAkJLyogQVJNIFZGUC9ORU9OIHJlZ2lzdGVycyAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKaW5kZXggNDVmMDBiNi4uZGUzM2RlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKQEAgLTEwOTcsMTAgKzEwOTcsMTIgQEAKICNkZWZpbmUgU1BFRURfMTAwMAkJMTAwMAogI2RlZmluZSBTUEVFRF8yNTAwCQkyNTAwCiAjZGVmaW5lIFNQRUVEXzEwMDAwCQkxMDAwMAorI2RlZmluZSBTUEVFRF9VTktOT1dOCQktMQogCiAvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KICNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKICNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX1VOS05PV04JCTB4ZmYKIAogLyogV2hpY2ggY29ubmVjdG9yIHBvcnQuICovCiAjZGVmaW5lIFBPUlRfVFAJCQkweDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4cG9ydC5oIGIvaW5jbHVkZS9saW51eC9leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTZjMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9leHBvcnQuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIF9MSU5VWF9FWFBPUlRfSAorI2RlZmluZSBfTElOVVhfRVhQT1JUX0gKKy8qCisgKiBFeHBvcnQgc3ltYm9scyBmcm9tIHRoZSBrZXJuZWwgdG8gbW9kdWxlcy4gIEZvcmtlZCBmcm9tIG1vZHVsZS5oCisgKiB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBwb2ludGxlc3MgY3J1ZnQgd2UgZmVlZCB0byBnY2Mgd2hlbiBvbmx5CisgKiBleHBvcnRpbmcgYSBzaW1wbGUgc3ltYm9sIG9yIHR3by4KKyAqCisgKiBJZiB5b3UgZmVlbCB0aGUgbmVlZCB0byBhZGQgI2luY2x1ZGUgPGxpbnV4L2Zvby5oPiB0byB0aGlzIGZpbGUKKyAqIHRoZW4geW91IGFyZSBkb2luZyBzb21ldGhpbmcgd3JvbmcgYW5kIHNob3VsZCBnbyBhd2F5IHNpbGVudGx5LgorICovCisKKy8qIFNvbWUgdG9vbGNoYWlucyB1c2UgYSBgXycgcHJlZml4IGZvciBhbGwgdXNlciBzeW1ib2xzLiAqLworI2lmZGVmIENPTkZJR19TWU1CT0xfUFJFRklYCisjZGVmaW5lIE1PRFVMRV9TWU1CT0xfUFJFRklYIENPTkZJR19TWU1CT0xfUFJFRklYCisjZWxzZQorI2RlZmluZSBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiIgorI2VuZGlmCisKK3N0cnVjdCBrZXJuZWxfc3ltYm9sCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworI2lmZGVmIE1PRFVMRQorZXh0ZXJuIHN0cnVjdCBtb2R1bGUgX190aGlzX21vZHVsZTsKKyNkZWZpbmUgVEhJU19NT0RVTEUgKCZfX3RoaXNfbW9kdWxlKQorI2Vsc2UKKyNkZWZpbmUgVEhJU19NT0RVTEUgKChzdHJ1Y3QgbW9kdWxlICopMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworI2lmbmRlZiBfX0dFTktTWU1TX18KKyNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKy8qIE1hcmsgdGhlIENSQyB3ZWFrIHNpbmNlIGdlbmtzeW1zIGFwcGFyZW50bHkgZGVjaWRlcyBub3QgdG8KKyAqIGdlbmVyYXRlIGEgY2hlY2tzdW1zIGZvciBzb21lIHN5bWJvbHMgKi8KKyNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQkJCQkJXAorCWV4dGVybiB2b2lkICpfX2NyY18jI3N5bSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CQlcCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19rY3JjdGFiXyMjc3ltCQlcCisJX191c2VkCQkJCQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rY3JjdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCisJPSAodW5zaWduZWQgbG9uZykgJl9fY3JjXyMjc3ltOworI2Vsc2UKKyNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQorI2VuZGlmCisKKy8qIEZvciBldmVyeSBleHBvcnRlZCBzeW1ib2wsIHBsYWNlIGEgc3RydWN0IGluIHRoZSBfX2tzeW10YWIgc2VjdGlvbiAqLworI2RlZmluZSBfX0VYUE9SVF9TWU1CT0woc3ltLCBzZWMpCQkJCVwKKwlleHRlcm4gdHlwZW9mKHN5bSkgc3ltOwkJCQkJXAorCV9fQ1JDX1NZTUJPTChzeW0sIHNlYykJCQkJCVwKKwlzdGF0aWMgY29uc3QgY2hhciBfX2tzdHJ0YWJfIyNzeW1bXQkJCVwKKwlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWJfc3RyaW5ncyIpLCBhbGlnbmVkKDEpKSkgXAorCT0gTU9EVUxFX1NZTUJPTF9QUkVGSVggI3N5bTsJCQkJXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCBfX2tzeW10YWJfIyNzeW0JXAorCV9fdXNlZAkJCQkJCQlcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19fa3N5bXRhYiIgc2VjICIrIiAjc3ltKSwgdW51c2VkKSkJXAorCT0geyAodW5zaWduZWQgbG9uZykmc3ltLCBfX2tzdHJ0YWJfIyNzeW0gfQorCisjZGVmaW5lIEVYUE9SVF9TWU1CT0woc3ltKQkJCQkJXAorCV9fRVhQT1JUX1NZTUJPTChzeW0sICIiKQorCisjZGVmaW5lIEVYUE9SVF9TWU1CT0xfR1BMKHN5bSkJCQkJCVwKKwlfX0VYUE9SVF9TWU1CT0woc3ltLCAiX2dwbCIpCisKKyNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUExfRlVUVVJFKHN5bSkJCQkJXAorCV9fRVhQT1JUX1NZTUJPTChzeW0sICJfZ3BsX2Z1dHVyZSIpCisKKyNpZmRlZiBDT05GSUdfVU5VU0VEX1NZTUJPTFMKKyNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0woc3ltKSBfX0VYUE9SVF9TWU1CT0woc3ltLCAiX3VudXNlZCIpCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pIF9fRVhQT1JUX1NZTUJPTChzeW0sICJfdW51c2VkX2dwbCIpCisjZWxzZQorI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTChzeW0pCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pCisjZW5kaWYKKworI2VuZGlmCS8qIF9fR0VOS1NZTVNfXyAqLworCisjZWxzZSAvKiAhQ09ORklHX01PRFVMRVMuLi4gKi8KKworI2RlZmluZSBFWFBPUlRfU1lNQk9MKHN5bSkKKyNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUEwoc3ltKQorI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoc3ltKQorI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTChzeW0pCisjZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MX0dQTChzeW0pCisKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCisjZW5kaWYgLyogX0xJTlVYX0VYUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCmluZGV4IDUzNzkyYmYuLmNlMWI3MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCkBAIC0xOTcsOCArMTk3LDggQEAKIAogLyogRmxhZ3MgdGhhdCBzaG91bGQgYmUgaW5oZXJpdGVkIGJ5IG5ldyBpbm9kZXMgZnJvbSB0aGVpciBwYXJlbnQuICovCiAjZGVmaW5lIEVYVDJfRkxfSU5IRVJJVEVEIChFWFQyX1NFQ1JNX0ZMIHwgRVhUMl9VTlJNX0ZMIHwgRVhUMl9DT01QUl9GTCB8XAotCQkJICAgRVhUMl9TWU5DX0ZMIHwgRVhUMl9JTU1VVEFCTEVfRkwgfCBFWFQyX0FQUEVORF9GTCB8XAotCQkJICAgRVhUMl9OT0RVTVBfRkwgfCBFWFQyX05PQVRJTUVfRkwgfCBFWFQyX0NPTVBSQkxLX0ZMfFwKKwkJCSAgIEVYVDJfU1lOQ19GTCB8IEVYVDJfTk9EVU1QX0ZMIHxcCisJCQkgICBFWFQyX05PQVRJTUVfRkwgfCBFWFQyX0NPTVBSQkxLX0ZMIHxcCiAJCQkgICBFWFQyX05PQ09NUF9GTCB8IEVYVDJfSk9VUk5BTF9EQVRBX0ZMIHxcCiAJCQkgICBFWFQyX05PVEFJTF9GTCB8IEVYVDJfRElSU1lOQ19GTCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCA2N2E4MDNhLi5kZWM5OTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtMTgwLDggKzE4MCw4IEBACiAKIC8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLwogI2RlZmluZSBFWFQzX0ZMX0lOSEVSSVRFRCAoRVhUM19TRUNSTV9GTCB8IEVYVDNfVU5STV9GTCB8IEVYVDNfQ09NUFJfRkwgfFwKLQkJCSAgIEVYVDNfU1lOQ19GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMIHwgRVhUM19BUFBFTkRfRkwgfFwKLQkJCSAgIEVYVDNfTk9EVU1QX0ZMIHwgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTHxcCisJCQkgICBFWFQzX1NZTkNfRkwgfCBFWFQzX05PRFVNUF9GTCB8XAorCQkJICAgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTCB8XAogCQkJICAgRVhUM19OT0NPTVBSX0ZMIHwgRVhUM19KT1VSTkFMX0RBVEFfRkwgfFwKIAkJCSAgIEVYVDNfTk9UQUlMX0ZMIHwgRVhUM19ESVJTWU5DX0ZMKQogCkBAIC0zODEsNyArMzgxLDcgQEAKICAqIE1vdW50IGZsYWdzCiAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLwotI2RlZmluZSBFWFQzX01PVU5UX09MREFMTE9DCQkweDAwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KKy8qIEVYVDNfTU9VTlRfT0xEQUxMT0Mgd2FzIHRoZXJlICovCiAjZGVmaW5lIEVYVDNfTU9VTlRfR1JQSUQJCTB4MDAwMDQJLyogQ3JlYXRlIGZpbGVzIHdpdGggZGlyZWN0b3J5J3MgZ3JvdXAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9ERUJVRwkJMHgwMDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogI2RlZmluZSBFWFQzX01PVU5UX0VSUk9SU19DT05UCQkweDAwMDEwCS8qIENvbnRpbnVlIG9uIGVycm9ycyAqLwpAQCAtOTM3LDE1ICs5MzcsMTUgQEAKIAkJCQlleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOwogCiAvKiBzdXBlci5jICovCi1leHRlcm4gdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBfX2V4dDNfc3RkX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXh0M19hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIHZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci1leHRlcm4gdm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M19hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZXh0M193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KQordm9pZCBleHQzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiBleHRlcm4gdm9pZCBleHQzX3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKICNkZWZpbmUgZXh0M19zdGRfZXJyb3Ioc2IsIGVycm5vKQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IDI1ODA4OGEuLjY0MzY1MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC03NiwxMCArNzYsNiBAQAogCXN0cnVjdCBtdXRleCBzX3Jlc2l6ZV9sb2NrOwogCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqam91cm5hbF9iZGV2OwotI2lmZGVmIENPTkZJR19KQkRfREVCVUcKLQlzdHJ1Y3QgdGltZXJfbGlzdCB0dXJuX3JvX3RpbWVyOwkvKiBGb3IgdHVybmluZyByZWFkLW9ubHkgKGNyYXNoIHNpbXVsYXRpb24pICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgcm9fd2FpdF9xdWV1ZTsJLyogRm9yIHBlb3BsZSB3YWl0aW5nIGZvciB0aGUgZnMgdG8gZ28gcmVhZC1vbmx5ICovCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfUVVPVEEKIAljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CQkvKiBOYW1lcyBvZiBxdW90YSBmaWxlcyB3aXRoIGpvdXJuYWxsZWQgcXVvdGEgKi8KIAlpbnQgc19qcXVvdGFfZm10OwkJCS8qIEZvcm1hdCBvZiBxdW90YSB0byB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaCBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUuaAppbmRleCAyMWIzZTc1Li4xZTdjMDExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfTElOVVhfRklSTVdBUkVfSAogI2RlZmluZSBfTElOVVhfRklSTVdBUkVfSAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtMTUsNiArMTQsNyBAQAogCXN0cnVjdCBwYWdlICoqcGFnZXM7CiB9OwogCitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGRldmljZTsKIAogc3RydWN0IGJ1aWx0aW5fZncgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmggYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAppbmRleCBhYTU2Y2YzLi5hNTM4NmUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaApAQCAtMTM1LDEwICsxMzUsMjAgQEAKIH0KIAogLyoKLSAqIEZyZWV6ZXItZnJpZW5kbHkgd3JhcHBlcnMgYXJvdW5kIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIGFuZAotICogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKSwgb3JpZ2luYWxseSBkZWZpbmVkIGluIDxsaW51eC93YWl0Lmg+CisgKiBGcmVlemVyLWZyaWVuZGx5IHdyYXBwZXJzIGFyb3VuZCB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwKKyAqIHdhaXRfZXZlbnRfa2lsbGFibGUoKSBhbmQgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKSwgb3JpZ2luYWxseQorICogZGVmaW5lZCBpbiA8bGludXgvd2FpdC5oPgogICovCiAKKyNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemVraWxsYWJsZSh3cSwgY29uZGl0aW9uKQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX3JldHZhbDsJCQkJCQkJXAorCWZyZWV6ZXJfZG9fbm90X2NvdW50KCk7CQkJCQkJXAorCV9fcmV0dmFsID0gd2FpdF9ldmVudF9raWxsYWJsZSh3cSwgKGNvbmRpdGlvbikpOwkJXAorCWZyZWV6ZXJfY291bnQoKTsJCQkJCQlcCisJX19yZXR2YWw7CQkJCQkJCVwKK30pCisKICNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemFibGUod3EsIGNvbmRpdGlvbikJCQkJXAogKHsJCQkJCQkJCQlcCiAJaW50IF9fcmV0dmFsOwkJCQkJCQlcCkBAIC0xOTAsNiArMjAwLDkgQEAKICNkZWZpbmUgd2FpdF9ldmVudF9mcmVlemFibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQkJXAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KQogCisjZGVmaW5lIHdhaXRfZXZlbnRfZnJlZXpla2lsbGFibGUod3EsIGNvbmRpdGlvbikJCVwKKwkJd2FpdF9ldmVudF9raWxsYWJsZSh3cSwgY29uZGl0aW9uKQorCiAjZW5kaWYgLyogIUNPTkZJR19GUkVFWkVSICovCiAKICNlbmRpZgkvKiBGUkVFWkVSX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBiYTk4NjY4Li4wYzRkZjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC01OCwxNCArNTgsMTUgQEAKIAogI2RlZmluZSBOUl9GSUxFICA4MTkyCS8qIHRoaXMgY2FuIHdlbGwgYmUgbGFyZ2VyIG9uIGEgbGFyZ2VyIHN5c3RlbSAqLwogCi0jZGVmaW5lIE1BWV9FWEVDIDEKLSNkZWZpbmUgTUFZX1dSSVRFIDIKLSNkZWZpbmUgTUFZX1JFQUQgNAotI2RlZmluZSBNQVlfQVBQRU5EIDgKLSNkZWZpbmUgTUFZX0FDQ0VTUyAxNgotI2RlZmluZSBNQVlfT1BFTiAzMgotI2RlZmluZSBNQVlfQ0hESVIgNjQKLSNkZWZpbmUgTUFZX05PVF9CTE9DSyAxMjgJLyogY2FsbGVkIGZyb20gUkNVIG1vZGUsIGRvbid0IGJsb2NrICovCisjZGVmaW5lIE1BWV9FWEVDCQkweDAwMDAwMDAxCisjZGVmaW5lIE1BWV9XUklURQkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVlfUkVBRAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVlfQVBQRU5ECQkweDAwMDAwMDA4CisjZGVmaW5lIE1BWV9BQ0NFU1MJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFZX09QRU4JCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFZX0NIRElSCQkweDAwMDAwMDQwCisvKiBjYWxsZWQgZnJvbSBSQ1UgbW9kZSwgZG9uJ3QgYmxvY2sgKi8KKyNkZWZpbmUgTUFZX05PVF9CTE9DSwkJMHgwMDAwMDA4MAogCiAvKgogICogZmxhZ3MgaW4gZmlsZS5mX21vZGUuICBOb3RlIHRoYXQgRk1PREVfUkVBRCBhbmQgRk1PREVfV1JJVEUgbXVzdCBjb3JyZXNwb25kCkBAIC03NjcsMTQgKzc2OCwyNSBAQAogCiAJLyogU3RhdCBkYXRhLCBub3QgYWNjZXNzZWQgZnJvbSBwYXRoIHdhbGtpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQlpX2lubzsKLQl1bnNpZ25lZCBpbnQJCWlfbmxpbms7CisJLyoKKwkgKiBGaWxlc3lzdGVtcyBtYXkgb25seSByZWFkIGlfbmxpbmsgZGlyZWN0bHkuICBUaGV5IHNoYWxsIHVzZSB0aGUKKwkgKiBmb2xsb3dpbmcgZnVuY3Rpb25zIGZvciBtb2RpZmljYXRpb246CisJICoKKwkgKiAgICAoc2V0fGNsZWFyfGluY3xkcm9wKV9ubGluaworCSAqICAgIGlub2RlXyhpbmN8ZGVjKV9saW5rX2NvdW50CisJICovCisJdW5pb24geworCQljb25zdCB1bnNpZ25lZCBpbnQgaV9ubGluazsKKwkJdW5zaWduZWQgaW50IF9faV9ubGluazsKKwl9OwogCWRldl90CQkJaV9yZGV2OwotCWxvZmZfdAkJCWlfc2l6ZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCWlfYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQlpX210aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJaV9jdGltZTsKLQl1bnNpZ25lZCBpbnQJCWlfYmxrYml0czsKKwlzcGlubG9ja190CQlpX2xvY2s7CS8qIGlfYmxvY2tzLCBpX2J5dGVzLCBtYXliZSBpX3NpemUgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBpX2J5dGVzOwogCWJsa2NudF90CQlpX2Jsb2NrczsKKwlsb2ZmX3QJCQlpX3NpemU7CiAKICNpZmRlZiBfX05FRURfSV9TSVpFX09SREVSRUQKIAlzZXFjb3VudF90CQlpX3NpemVfc2VxY291bnQ7CkBAIC03ODIsNyArNzk0LDYgQEAKIAogCS8qIE1pc2MgKi8KIAl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOwotCXNwaW5sb2NrX3QJCWlfbG9jazsJLyogaV9ibG9ja3MsIGlfYnl0ZXMsIG1heWJlIGlfc2l6ZSAqLwogCXN0cnVjdCBtdXRleAkJaV9tdXRleDsKIAogCXVuc2lnbmVkIGxvbmcJCWRpcnRpZWRfd2hlbjsJLyogamlmZmllcyBvZiBmaXJzdCBkaXJ0eWluZyAqLwpAQCAtNzk2LDkgKzgwNywxMCBAQAogCQlzdHJ1Y3QgcmN1X2hlYWQJCWlfcmN1OwogCX07CiAJYXRvbWljX3QJCWlfY291bnQ7CisJdW5zaWduZWQgaW50CQlpX2Jsa2JpdHM7CiAJdTY0CQkJaV92ZXJzaW9uOwotCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlfYnl0ZXM7CiAJYXRvbWljX3QJCWlfZGlvX2NvdW50OworCWF0b21pY190CQlpX3dyaXRlY291bnQ7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqaV9mb3A7CS8qIGZvcm1lciAtPmlfb3AtPmRlZmF1bHRfZmlsZV9vcHMgKi8KIAlzdHJ1Y3QgZmlsZV9sb2NrCSppX2Zsb2NrOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlCWlfZGF0YTsKQEAgLTgyMiw3ICs4MzQsNiBAQAogI2lmZGVmIENPTkZJR19JTUEKIAlhdG9taWNfdAkJaV9yZWFkY291bnQ7IC8qIHN0cnVjdCBmaWxlcyBvcGVuIFJPICovCiAjZW5kaWYKLQlhdG9taWNfdAkJaV93cml0ZWNvdW50OwogCXZvaWQJCQkqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovCiB9OwogCkBAIC05NjMsNyArOTc0LDEyIEBACiAjZGVmaW5lIGZfZGVudHJ5CWZfcGF0aC5kZW50cnkKICNkZWZpbmUgZl92ZnNtbnQJZl9wYXRoLm1udAogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJKmZfb3A7Ci0Jc3BpbmxvY2tfdAkJZl9sb2NrOyAgLyogZl9lcF9saW5rcywgZl9mbGFncywgbm8gSVJRICovCisKKwkvKgorCSAqIFByb3RlY3RzIGZfZXBfbGlua3MsIGZfZmxhZ3MsIGZfcG9zIHZzIGlfc2l6ZSBpbiBsc2VlayBTRUVLX0NVUi4KKwkgKiBNdXN0IG5vdCBiZSB0YWtlbiBmcm9tIElSUSBjb250ZXh0LgorCSAqLworCXNwaW5sb2NrX3QJCWZfbG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAJaW50CQkJZl9zYl9saXN0X2NwdTsKICNlbmRpZgpAQCAtMTYyNyw5ICsxNjQzLDEwIEBACiBzdHJ1Y3Qgc2VxX2ZpbGU7CiAKIHNzaXplX3QgcndfY29weV9jaGVja191dmVjdG9yKGludCB0eXBlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICogdXZlY3RvciwKLQkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHVuc2lnbmVkIGxvbmcgZmFzdF9zZWdzLAotCQkJCXN0cnVjdCBpb3ZlYyAqZmFzdF9wb2ludGVyLAotCQkJCXN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyKTsKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgdW5zaWduZWQgbG9uZyBmYXN0X3NlZ3MsCisJCQkgICAgICBzdHJ1Y3QgaW92ZWMgKmZhc3RfcG9pbnRlciwKKwkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyLAorCQkJICAgICAgaW50IGNoZWNrX2FjY2Vzcyk7CiAKIGV4dGVybiBzc2l6ZV90IHZmc19yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgdmZzX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwpAQCAtMTc0OCw2ICsxNzY1LDE5IEBACiB9CiAKIC8qKgorICogc2V0X25saW5rIC0gZGlyZWN0bHkgc2V0IGFuIGlub2RlJ3MgbGluayBjb3VudAorICogQGlub2RlOiBpbm9kZQorICogQG5saW5rOiBuZXcgbmxpbmsgKHNob3VsZCBiZSBub24temVybykKKyAqCisgKiBUaGlzIGlzIGEgbG93LWxldmVsIGZpbGVzeXN0ZW0gaGVscGVyIHRvIHJlcGxhY2UgYW55CisgKiBkaXJlY3QgZmlsZXN5c3RlbSBtYW5pcHVsYXRpb24gb2YgaV9ubGluay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9ubGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgbmxpbmspCit7CisJaW5vZGUtPl9faV9ubGluayA9IG5saW5rOworfQorCisvKioKICAqIGluY19ubGluayAtIGRpcmVjdGx5IGluY3JlbWVudCBhbiBpbm9kZSdzIGxpbmsgY291bnQKICAqIEBpbm9kZTogaW5vZGUKICAqCkBAIC0xNzU3LDcgKzE3ODcsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX25saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaW5vZGUtPmlfbmxpbmsrKzsKKwlpbm9kZS0+X19pX25saW5rKys7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9pbmNfbGlua19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMTc3OSw3ICsxODA5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGRyb3Bfbmxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9ubGluay0tOworCWlub2RlLT5fX2lfbmxpbmstLTsKIH0KIAogLyoqCkBAIC0xNzkyLDcgKzE4MjIsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbmxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPl9faV9ubGluayA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9kZWNfbGlua19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMjQwMSw4ICsyNDMxLDggQEAKIGV4dGVybiBsb2ZmX3Qgbm9vcF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pOwogZXh0ZXJuIGxvZmZfdCBub19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pOwogZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKTsKLWV4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2Vla191bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwKLQkJCWludCBvcmlnaW4pOworZXh0ZXJuIGxvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsCisJCWludCBvcmlnaW4sIGxvZmZfdCBtYXhzaXplKTsKIGV4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiBleHRlcm4gaW50IG5vbnNlZWthYmxlX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiAKQEAgLTI2MjgsOCArMjY1OCw4IEBACiAJLmxsc2VlawkgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKLV9fc2ltcGxlX2F0dHJfY2hlY2tfZm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigxLCAyKQordm9pZCBfX3NpbXBsZV9hdHRyX2NoZWNrX2Zvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAkvKiBkb24ndCBkbyBhbnl0aGluZywganVzdCBsZXQgdGhlIGNvbXBpbGVyIGNoZWNrIHRoZSBhcmd1bWVudHM7ICovCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzY2FjaGUtY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCmluZGV4IGFmMDk1YjUuLmNlMzE0MDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNjYWNoZS1jYWNoZS5oCkBAIC00OTIsMTAgKzQ5MiwxMCBAQAogLyoKICAqIG91dC1vZi1saW5lIGNhY2hlIGJhY2tlbmQgZnVuY3Rpb25zCiAgKi8KLWV4dGVybiB2b2lkIGZzY2FjaGVfaW5pdF9jYWNoZShzdHJ1Y3QgZnNjYWNoZV9jYWNoZSAqY2FjaGUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGZzY2FjaGVfY2FjaGVfb3BzICpvcHMsCi0JCQkgICAgICAgY29uc3QgY2hhciAqaWRmbXQsCi0JCQkgICAgICAgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK3ZvaWQgZnNjYWNoZV9pbml0X2NhY2hlKHN0cnVjdCBmc2NhY2hlX2NhY2hlICpjYWNoZSwKKwkJCWNvbnN0IHN0cnVjdCBmc2NhY2hlX2NhY2hlX29wcyAqb3BzLAorCQkJY29uc3QgY2hhciAqaWRmbXQsIC4uLik7CiAKIGV4dGVybiBpbnQgZnNjYWNoZV9hZGRfY2FjaGUoc3RydWN0IGZzY2FjaGVfY2FjaGUgKmNhY2hlLAogCQkJICAgICBzdHJ1Y3QgZnNjYWNoZV9vYmplY3QgKmZzZGVmLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2wtZGl1LWZiLmggYi9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaAppbmRleCBkYWE5OTUyLi4xMWMxNmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbC1kaXUtZmIuaApAQCAtMjAsMTggKzIwLDggQEAKICNpZm5kZWYgX19GU0xfRElVX0ZCX0hfXwogI2RlZmluZSBfX0ZTTF9ESVVfRkJfSF9fCiAKLS8qIEFyYml0cmFyeSB0aHJlc2hvbGQgdG8gZGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIG1ldGhvZAotICogU2VlIG1wYzg2MTBmYl9zZXRfcGFyKCksIG1hcF92aWRlb19tZW1vcnkoKSwgYW5kIHVubWFwX3ZpZGVvX21lbW9yeSgpCi0gKi8KLSNkZWZpbmUgTUVNX0FMTE9DX1RIUkVTSE9MRCAoMTAyNCo3NjgqNCszMikKLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXN0cnVjdCBtZmJfYWxwaGEgewotCWludCBlbmFibGU7Ci0JaW50IGFscGhhOwotfTsKLQogc3RydWN0IG1mYl9jaHJvbWFfa2V5IHsKIAlpbnQgZW5hYmxlOwogCV9fdTggIHJlZF9tYXg7CkBAIC00MywyNSArMzMsMjkgQEAKIH07CiAKIHN0cnVjdCBhb2lfZGlzcGxheV9vZmZzZXQgewotCWludCB4X2FvaV9kOwotCWludCB5X2FvaV9kOworCV9fczMyIHhfYW9pX2Q7CisJX19zMzIgeV9hb2lfZDsKIH07CiAKICNkZWZpbmUgTUZCX1NFVF9DSFJPTUFfS0VZCV9JT1coJ00nLCAxLCBzdHJ1Y3QgbWZiX2Nocm9tYV9rZXkpCiAjZGVmaW5lIE1GQl9TRVRfQlJJR0hUTkVTUwlfSU9XKCdNJywgMywgX191OCkKKyNkZWZpbmUgTUZCX1NFVF9BTFBIQQkJX0lPVygnTScsIDAsIF9fdTgpCisjZGVmaW5lIE1GQl9HRVRfQUxQSEEJCV9JT1IoJ00nLCAwLCBfX3U4KQorI2RlZmluZSBNRkJfU0VUX0FPSUQJCV9JT1coJ00nLCA0LCBzdHJ1Y3QgYW9pX2Rpc3BsYXlfb2Zmc2V0KQorI2RlZmluZSBNRkJfR0VUX0FPSUQJCV9JT1IoJ00nLCA0LCBzdHJ1Y3QgYW9pX2Rpc3BsYXlfb2Zmc2V0KQorI2RlZmluZSBNRkJfU0VUX1BJWEZNVAkJX0lPVygnTScsIDgsIF9fdTMyKQorI2RlZmluZSBNRkJfR0VUX1BJWEZNVAkJX0lPUignTScsIDgsIF9fdTMyKQogCi0jZGVmaW5lIE1GQl9TRVRfQUxQSEEJCTB4ODAwMTRkMDAKLSNkZWZpbmUgTUZCX0dFVF9BTFBIQQkJMHg0MDAxNGQwMAotI2RlZmluZSBNRkJfU0VUX0FPSUQJCTB4ODAwODRkMDQKLSNkZWZpbmUgTUZCX0dFVF9BT0lECQkweDQwMDg0ZDA0Ci0jZGVmaW5lIE1GQl9TRVRfUElYRk1UCQkweDgwMDE0ZDA4Ci0jZGVmaW5lIE1GQl9HRVRfUElYRk1UCQkweDQwMDE0ZDA4Ci0KLSNkZWZpbmUgRkJJT0dFVF9HV0lORk8JCTB4NDZFMAotI2RlZmluZSBGQklPUFVUX0dXSU5GTwkJMHg0NkUxCisvKgorICogVGhlIG9yaWdpbmFsIGRlZmluaXRpb25zIG9mIE1GQl9TRVRfUElYRk1UIGFuZCBNRkJfR0VUX1BJWEZNVCB1c2VkIHRoZQorICogd3JvbmcgdmFsdWUgZm9yICdzaXplJyBmaWVsZCBvZiB0aGUgaW9jdGwuICBUaGUgY3VycmVudCBtYWNyb3MgYWJvdmUgdXNlIHRoZQorICogcmlnaHQgc2l6ZSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYXQgbGVhc3QKKyAqIGZvciBhIHdoaWxlLgorKi8KKyNkZWZpbmUgTUZCX1NFVF9QSVhGTVRfT0xECTB4ODAwMTRkMDgKKyNkZWZpbmUgTUZCX0dFVF9QSVhGTVRfT0xECTB4NDAwMTRkMDgKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAvKgogICogVGhlc2UgYXJlIHRoZSBmaWVsZHMgb2YgYXJlYSBkZXNjcmlwdG9yKGluIEREUiBtZW1vcnkpIGZvciBldmVyeSBwbGFuZQpAQCAtMTU5LDU4ICsxNTMsMTIgQEAKIAlfX2JlMzIgcGx1dDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgZGl1X2h3IHsKLQlzdHJ1Y3QgZGl1ICpkaXVfcmVnOwotCXNwaW5sb2NrX3QgcmVnX2xvY2s7Ci0KLQlfX3UzMiBtb2RlOwkJLyogRElVIG9wZXJhdGlvbiBtb2RlICovCi19OwotCi1zdHJ1Y3QgZGl1X2FkZHIgewotCV9fdTggX19pb21lbSAqdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLwotCWRtYV9hZGRyX3QgcGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KLQlfX3UzMiAJICAgb2Zmc2V0OwotfTsKLQotc3RydWN0IGRpdV9wb29sIHsKLQlzdHJ1Y3QgZGl1X2FkZHIgYWQ7Ci0Jc3RydWN0IGRpdV9hZGRyIGdhbW1hOwotCXN0cnVjdCBkaXVfYWRkciBwYWxsZXRlOwotCXN0cnVjdCBkaXVfYWRkciBjdXJzb3I7Ci19OwotCi0jZGVmaW5lIEZTTF9ESVVfQkFTRV9PRkZTRVQJMHgyQzAwMAkvKiBPZmZzZXQgb2YgRElVICovCi0jZGVmaW5lIElOVF9MQ0RDCQk2NAkvKiBESVUgaW50ZXJydXB0IG51bWJlciAqLwotCi0jZGVmaW5lIEZTTF9BT0lfTlVNCTYJLyogNSBBT0lzIGFuZCBvbmUgZHVtbXkgQU9JICovCi0JCQkJLyogMSBmb3IgcGxhbmUgMCwgMiBmb3IgcGxhbmUgMSYyIGVhY2ggKi8KLQotLyogTWluaW11bSBYIGFuZCBZIHJlc29sdXRpb25zICovCi0jZGVmaW5lIE1JTl9YUkVTCTY0Ci0jZGVmaW5lIE1JTl9ZUkVTCTY0Ci0KLS8qIEhXIGN1cnNvciBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIE1BWF9DVVJTCQkzMgotCi0vKiBNb2RlcyBvZiBvcGVyYXRpb24gb2YgRElVICovCisvKgorICogTW9kZXMgb2Ygb3BlcmF0aW9uIG9mIERJVS4gIFRoZSBESVUgc3VwcG9ydHMgZml2ZSBkaWZmZXJlbnQgbW9kZXMsIGJ1dAorICogdGhlIGRyaXZlciBvbmx5IHN1cHBvcnRzIG1vZGVzIDAgYW5kIDEuCisgKi8KICNkZWZpbmUgTUZCX01PREUwCTAJLyogRElVIG9mZiAqLwogI2RlZmluZSBNRkJfTU9ERTEJMQkvKiBBbGwgdGhyZWUgcGxhbmVzIG91dHB1dCB0byBkaXNwbGF5ICovCi0jZGVmaW5lIE1GQl9NT0RFMgkyCS8qIFBsYW5lIDEgdG8gZGlzcGxheSwgcGxhbmVzIDIrMyB3cml0dGVuIGJhY2sqLwotI2RlZmluZSBNRkJfTU9ERTMJMwkvKiBBbGwgdGhyZWUgcGxhbmVzIHdyaXR0ZW4gYmFjayB0byBtZW1vcnkgKi8KLSNkZWZpbmUgTUZCX01PREU0CTQJLyogQ29sb3IgYmFyIGdlbmVyYXRpb24gKi8KLQotLyogSU5UX1NUQVRVUy9JTlRfTUFTSyBmaWVsZCBkZXNjcmlwdGlvbnMgKi8KLSNkZWZpbmUgSU5UX1ZTWU5DCTB4MDEJLyogVnN5bmMgaW50ZXJydXB0ICAqLwotI2RlZmluZSBJTlRfVlNZTkNfV0IJMHgwMgkvKiBWc3luYyBpbnRlcnJ1cHQgZm9yIHdyaXRlIGJhY2sgb3BlcmF0aW9uICovCi0jZGVmaW5lIElOVF9VTkRSVU4JMHgwNAkvKiBVbmRlciBydW4gZXhjZXB0aW9uIGludGVycnVwdCAqLwotI2RlZmluZSBJTlRfUEFSRVJSCTB4MDgJLyogRGlzcGxheSBwYXJhbWV0ZXJzIGVycm9yIGludGVycnVwdCAqLwotI2RlZmluZSBJTlRfTFNfQkZfVlMJMHgxMAkvKiBMaW5lcyBiZWZvcmUgdnN5bmMuIGludGVycnVwdCAqLwotCi0vKiBQYW5lbHMnb3BlcmF0aW9uIG1vZGVzICovCi0jZGVmaW5lIE1GQl9UWVBFX09VVFBVVAkwCS8qIFBhbmVsIG91dHB1dCB0byBkaXNwbGF5ICovCi0jZGVmaW5lIE1GQl9UWVBFX09GRgkxCS8qIFBhbmVsIG9mZiAqLwotI2RlZmluZSBNRkJfVFlQRV9XQgkyCS8qIFBhbmVsIHdyaXR0ZW4gYmFjayB0byBtZW1vcnkgKi8KLSNkZWZpbmUgTUZCX1RZUEVfVEVTVAkzCS8qIFBhbmVsIGdlbmVyYXRlIGNvbG9yIGJhciAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fRlNMX0RJVV9GQl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCmluZGV4IGYwYzBlOGEuLjI2ZWFmY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTksNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2Z0cmFjZS5oPgogCitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGZ0cmFjZV9oYXNoOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oIGIvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCmluZGV4IGI2NWE2ZjQuLmI0NTZiMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKQEAgLTcxLDE1ICs3MSwxNCBAQAogI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCiAKIHZvaWQgX19nYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0JX19nYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdhbWVwb3J0LCBUSElTX01PRFVMRSk7Ci19CisvKiB1c2UgYSBkZWZpbmUgdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChnYW1lcG9ydCkgXAorCV9fZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChnYW1lcG9ydCwgVEhJU19NT0RVTEUpCiAKIHZvaWQgZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpOwogCi12b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpCit2b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2Vsc2UKIApAQCAtOTMsOCArOTIsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGdhbWVwb3J0X3NldF9waHlzKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsCi0JCQkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKK3ZvaWQgZ2FtZXBvcnRfc2V0X3BoeXMoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJcmV0dXJuOwogfQpAQCAtMTQ1LDEyICsxNDQsMTIgQEAKIAltdXRleF91bmxvY2soJmdhbWVwb3J0LT5kcnZfbXV0ZXgpOwogfQogCi1pbnQgX19nYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2LAoraW50IF9fbXVzdF9jaGVjayBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYsCiAJCQkJc3RydWN0IG1vZHVsZSAqb3duZXIsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBnYW1lcG9ydF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQotewotCXJldHVybiBfX2dhbWVwb3J0X3JlZ2lzdGVyX2RyaXZlcihkcnYsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7Ci19CisKKy8qIHVzZSBhIGRlZmluZSB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRSAmIGZyaWVuZHMgKi8KKyNkZWZpbmUgZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKGRydikgXAorCV9fZ2FtZXBvcnRfcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQogCiB2b2lkIGdhbWVwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaCBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaAppbmRleCAwMmZhNDY5Li45ZGUzMWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCkBAIC0yMSw2ICsyMSw4IEBACiAjZGVmaW5lIGRldl90b19wYXJ0KGRldmljZSkJY29udGFpbmVyX29mKChkZXZpY2UpLCBzdHJ1Y3QgaGRfc3RydWN0LCBfX2RldikKICNkZWZpbmUgZGlza190b19kZXYoZGlzaykJKCYoZGlzayktPnBhcnQwLl9fZGV2KQogI2RlZmluZSBwYXJ0X3RvX2RldihwYXJ0KQkoJigocGFydCktPl9fZGV2KSkKKyNkZWZpbmUgYWxpYXNfbmFtZShkaXNrKQkoKGRpc2spLT5hbGlhcyA/IChkaXNrKS0+YWxpYXMgOiBcCisJCQkJCQkgKGRpc2spLT5kaXNrX25hbWUpCiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgcGFydF90eXBlOwogZXh0ZXJuIHN0cnVjdCBrb2JqZWN0ICpibG9ja19kZXByOwpAQCAtNTgsNiArNjAsNyBAQAogCiAjZGVmaW5lIERJU0tfTUFYX1BBUlRTCQkJMjU2CiAjZGVmaW5lIERJU0tfTkFNRV9MRU4JCQkzMgorI2RlZmluZSBBTElBU19MRU4JCQkyNTYKIAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xMjgsNiArMTMxLDcgQEAKICNkZWZpbmUgR0VOSERfRkxfRVhUX0RFVlQJCQk2NCAvKiBhbGxvdyBleHRlbmRlZCBkZXZ0ICovCiAjZGVmaW5lIEdFTkhEX0ZMX05BVElWRV9DQVBBQ0lUWQkJMTI4CiAjZGVmaW5lIEdFTkhEX0ZMX0JMT0NLX0VWRU5UU19PTl9FWENMX1dSSVRFCTI1NgorI2RlZmluZSBHRU5IRF9GTF9OT19QQVJUX1NDQU4JCQk1MTIKIAogZW51bSB7CiAJRElTS19FVkVOVF9NRURJQV9DSEFOR0UJCQk9IDEgPDwgMCwgLyogbWVkaWEgY2hhbmdlZCAqLwpAQCAtMTYyLDYgKzE2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGlza3MgdGhhdCBjYW4ndCBiZSBwYXJ0aXRpb25lZC4gKi8KIAogCWNoYXIgZGlza19uYW1lW0RJU0tfTkFNRV9MRU5dOwkvKiBuYW1lIG9mIG1ham9yIGRyaXZlciAqLworCWNoYXIgKmFsaWFzOwkJCS8qIGFsaWFzIG5hbWUgb2YgZGlzayAqLwogCWNoYXIgKigqZGV2bm9kZSkoc3RydWN0IGdlbmRpc2sgKmdkLCBtb2RlX3QgKm1vZGUpOwogCiAJdW5zaWduZWQgaW50IGV2ZW50czsJCS8qIHN1cHBvcnRlZCBldmVudHMgKi8KQEAgLTIzNCw5ICsyMzksMTAgQEAKIAlyZXR1cm4gZGlzay0+bWlub3JzOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZGlza19wYXJ0aXRpb25hYmxlKHN0cnVjdCBnZW5kaXNrICpkaXNrKQorc3RhdGljIGlubGluZSBib29sIGRpc2tfcGFydF9zY2FuX2VuYWJsZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JcmV0dXJuIGRpc2tfbWF4X3BhcnRzKGRpc2spID4gMTsKKwlyZXR1cm4gZGlza19tYXhfcGFydHMoZGlzaykgPiAxICYmCisJCSEoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9OT19QQVJUX1NDQU4pOwogfQogCiBzdGF0aWMgaW5saW5lIGRldl90IGRpc2tfZGV2dChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKaW5kZXggMTdiNWEwZC4uMzhhYzQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKQEAgLTE0LDYgKzE0LDE4IEBACiAjZGVmaW5lIEdQSU9GX09VVF9JTklUX0xPVwkoR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XKQogI2RlZmluZSBHUElPRl9PVVRfSU5JVF9ISUdICShHUElPRl9ESVJfT1VUIHwgR1BJT0ZfSU5JVF9ISUdIKQogCisvKioKKyAqIHN0cnVjdCBncGlvIC0gYSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gd2l0aCBjb25maWd1cmF0aW9uCisgKiBAZ3BpbzoJdGhlIEdQSU8gbnVtYmVyCisgKiBAZmxhZ3M6CUdQSU8gY29uZmlndXJhdGlvbiBhcyBzcGVjaWZpZWQgYnkgR1BJT0ZfKgorICogQGxhYmVsOglhIGxpdGVyYWwgZGVzY3JpcHRpb24gc3RyaW5nIG9mIHRoaXMgR1BJTworICovCitzdHJ1Y3QgZ3BpbyB7CisJdW5zaWduZWQJZ3BpbzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWNvbnN0IGNoYXIJKmxhYmVsOworfTsKKwogI2lmZGVmIENPTkZJR19HRU5FUklDX0dQSU8KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCkBAIC0yNCwxOCArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZ3BpbzsKIHN0cnVjdCBncGlvX2NoaXA7CiAKLS8qCi0gKiBTb21lIHBsYXRmb3JtcyBkb24ndCBzdXBwb3J0IHRoZSBHUElPIHByb2dyYW1taW5nIGludGVyZmFjZS4KLSAqCi0gKiBJbiBjYXNlIHNvbWUgZHJpdmVyIHVzZXMgaXQgYW55d2F5IChpdCBzaG91bGQgbm9ybWFsbHkgaGF2ZQotICogZGVwZW5kZWQgb24gR0VORVJJQ19HUElPKSwgdGhlc2Ugcm91dGluZXMgaGVscCB0aGUgY29tcGlsZXIKLSAqIG9wdGltaXplIG91dCBtdWNoIEdQSU8tcmVsYXRlZCBjb2RlIC4uLiBvciB0cmlnZ2VyIGEgcnVudGltZQotICogd2FybmluZyB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZ2x5IGNhbGxlZC4KLSAqLwotCiBzdGF0aWMgaW5saW5lIGJvb2wgZ3Bpb19pc192YWxpZChpbnQgbnVtYmVyKQogewogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IGRlZWQ1ZjkuLmMyMzVlNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtNjk3LDEwICs2OTcsMTEgQEAKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgX19oaWRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICosCiAJCXN0cnVjdCBtb2R1bGUgKiwgY29uc3QgY2hhciAqbW9kX25hbWUpOwotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGhpZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmRyaXZlcikKLXsKLQlyZXR1cm4gX19oaWRfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSBoaWRfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcikgXAorCV9faGlkX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogZXh0ZXJuIHZvaWQgaGlkX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBoaWRfZHJpdmVyICopOwogCiBleHRlcm4gdm9pZCBoaWRpbnB1dF9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGhpZF9maWVsZCAqLCBzdHJ1Y3QgaGlkX3VzYWdlICosIF9fczMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZV9tbS5oIGIvaW5jbHVkZS9saW51eC9odWdlX21tLmgKaW5kZXggNDhjMzJlYi4uYTlhY2U5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdlX21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdlX21tLmgKQEAgLTIyLDYgKzIyLDExIEBACiBleHRlcm4gaW50IG1pbmNvcmVfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkJdW5zaWduZWQgY2hhciAqdmVjKTsKK2V4dGVybiBpbnQgbW92ZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm5ld192bWEsCisJCQkgdW5zaWduZWQgbG9uZyBvbGRfYWRkciwKKwkJCSB1bnNpZ25lZCBsb25nIG5ld19hZGRyLCB1bnNpZ25lZCBsb25nIG9sZF9lbmQsCisJCQkgcG1kX3QgKm9sZF9wbWQsIHBtZF90ICpuZXdfcG1kKTsKIGV4dGVybiBpbnQgY2hhbmdlX2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQkJdW5zaWduZWQgbG9uZyBhZGRyLCBwZ3Byb3RfdCBuZXdwcm90KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaAppbmRleCA4MzkwZWZjLi5hYWQ2YmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2h3c3BpbmxvY2suaApAQCAtMjAsMTcgKzIwLDQ5IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAvKiBod3NwaW5sb2NrIG1vZGUgYXJndW1lbnQgKi8KICNkZWZpbmUgSFdMT0NLX0lSUVNUQVRFCTB4MDEJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBzYXZlIHN0YXRlICovCiAjZGVmaW5lIEhXTE9DS19JUlEJMHgwMgkvKiBEaXNhYmxlIGludGVycnVwdHMsIGRvbid0IHNhdmUgc3RhdGUgKi8KIAogc3RydWN0IGh3c3BpbmxvY2s7CitzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2U7CitzdHJ1Y3QgaHdzcGlubG9ja19vcHM7CisKKy8qKgorICogc3RydWN0IGh3c3BpbmxvY2tfcGRhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBod3NwaW5sb2NrIGRyaXZlcnMKKyAqIEBiYXNlX2lkOiBiYXNlIGlkIGZvciB0aGlzIGh3c3BpbmxvY2sgZGV2aWNlCisgKgorICogaHdzcGlubG9jayBkZXZpY2VzIHByb3ZpZGUgc3lzdGVtLXdpZGUgaGFyZHdhcmUgbG9ja3MgdGhhdCBhcmUgdXNlZAorICogYnkgcmVtb3RlIHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vIG90aGVyIHdheSB0byBhY2hpZXZlIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBUbyBhY2hpZXZlIHRoYXQsIGVhY2ggcGh5c2ljYWwgbG9jayBtdXN0IGhhdmUgYSBzeXN0ZW0td2lkZSBpZCBudW1iZXIKKyAqIHRoYXQgaXMgYWdyZWVkIHVwb24sIG90aGVyd2lzZSByZW1vdGUgcHJvY2Vzc29ycyBjYW4ndCBwb3NzaWJseSBhc3N1bWUKKyAqIHRoZXkncmUgdXNpbmcgdGhlIHNhbWUgaGFyZHdhcmUgbG9jay4KKyAqCisgKiBVc3VhbGx5IGJvYXJkcyBoYXZlIGEgc2luZ2xlIGh3c3BpbmxvY2sgZGV2aWNlLCB3aGljaCBwcm92aWRlcyBzZXZlcmFsCisgKiBod3NwaW5sb2NrcywgYW5kIGluIHRoaXMgY2FzZSwgdGhleSBjYW4gYmUgdHJpdmlhbGx5IG51bWJlcmVkIDAgdG8KKyAqIChudW0tb2YtbG9ja3MgLSAxKS4KKyAqCisgKiBJbiBjYXNlIGJvYXJkcyBoYXZlIHNldmVyYWwgaHdzcGlubG9ja3MgZGV2aWNlcywgYSBkaWZmZXJlbnQgYmFzZSBpZAorICogc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2ggaHdzcGlubG9jayBkZXZpY2UgKHRoZXkgY2FuJ3QgYWxsIHVzZSAwIGFzCisgKiBhIHN0YXJ0aW5nIGlkISkuCisgKgorICogVGhpcyBwbGF0Zm9ybSBkYXRhIHN0cnVjdHVyZSBzaG91bGQgYmUgdXNlZCB0byBwcm92aWRlIHRoZSBiYXNlIGlkCisgKiBmb3IgZWFjaCBkZXZpY2UgKHdoaWNoIGlzIHRyaXZpYWxseSAwIHdoZW4gb25seSBhIHNpbmdsZSBod3NwaW5sb2NrCisgKiBkZXZpY2UgZXhpc3RzKS4gSXQgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBwbGF0Zm9ybXMsIGhlbmNlCisgKiBpdHMgbG9jYXRpb24uCisgKi8KK3N0cnVjdCBod3NwaW5sb2NrX3BkYXRhIHsKKwlpbnQgYmFzZV9pZDsKK307CiAKICNpZiBkZWZpbmVkKENPTkZJR19IV1NQSU5MT0NLKSB8fCBkZWZpbmVkKENPTkZJR19IV1NQSU5MT0NLX01PRFVMRSkKIAotaW50IGh3c3Bpbl9sb2NrX3JlZ2lzdGVyKHN0cnVjdCBod3NwaW5sb2NrICpsb2NrKTsKLXN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpZCk7CitpbnQgaHdzcGluX2xvY2tfcmVnaXN0ZXIoc3RydWN0IGh3c3BpbmxvY2tfZGV2aWNlICpiYW5rLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWNvbnN0IHN0cnVjdCBod3NwaW5sb2NrX29wcyAqb3BzLCBpbnQgYmFzZV9pZCwgaW50IG51bV9sb2Nrcyk7CitpbnQgaHdzcGluX2xvY2tfdW5yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9ja19kZXZpY2UgKmJhbmspOwogc3RydWN0IGh3c3BpbmxvY2sgKmh3c3Bpbl9sb2NrX3JlcXVlc3Qodm9pZCk7CiBzdHJ1Y3QgaHdzcGlubG9jayAqaHdzcGluX2xvY2tfcmVxdWVzdF9zcGVjaWZpYyh1bnNpZ25lZCBpbnQgaWQpOwogaW50IGh3c3Bpbl9sb2NrX2ZyZWUoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jayk7CkBAIC04Niw3ICsxMTgsNiBAQAogc3RhdGljIGlubGluZQogdm9pZCBfX2h3c3Bpbl91bmxvY2soc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaywgaW50IG1vZGUsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBod3NwaW5fbG9ja19nZXRfaWQoc3RydWN0IGh3c3BpbmxvY2sgKmh3bG9jaykKQEAgLTk0LDE2ICsxMjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBod3NwaW5fbG9ja19yZWdpc3RlcihzdHJ1Y3QgaHdzcGlubG9jayAqaHdsb2NrKQotewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBod3NwaW5sb2NrICpod3NwaW5fbG9ja191bnJlZ2lzdGVyKHVuc2lnbmVkIGludCBpZCkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQogI2VuZGlmIC8qICFDT05GSUdfSFdTUElOTE9DSyAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLW9tYXAuaCBiL2luY2x1ZGUvbGludXgvaTJjLW9tYXAuaAppbmRleCAwYWEwY2JkLi45MmEwZGM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1vbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtb21hcC5oCkBAIC0zMiwxMCArMzIsOSBAQAogCiBzdHJ1Y3Qgb21hcF9pMmNfYnVzX3BsYXRmb3JtX2RhdGEgewogCXUzMgkJY2xrcmF0ZTsKKwl1MzIJCXJldjsKKwl1MzIJCWZsYWdzOwogCXZvaWQJCSgqc2V0X21wdV93a3VwX2xhdCkoc3RydWN0IGRldmljZSAqZGV2LCBsb25nIHNldCk7Ci0JaW50CQkoKmRldmljZV9lbmFibGUpIChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLQlpbnQJCSgqZGV2aWNlX3NodXRkb3duKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0JaW50CQkoKmRldmljZV9pZGxlKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IGE2YzY1MmUuLmE4MWJmNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMjgsMTIgKzI4LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4JLyogZm9yIHN0cnVjdCBkZXZpY2UgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgY29tcGxldGlvbiAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4JCS8qIGZvciBzdHJ1Y3QgZGV2aWNlX25vZGUgKi8KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CQkvKiBmb3Igc3dhYjE2ICovCiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBpMmNfYWRhcHRlcl90eXBlOwpAQCAtNDgsNiArNDgsOCBAQAogdW5pb24gaTJjX3NtYnVzX2RhdGE7CiBzdHJ1Y3QgaTJjX2JvYXJkX2luZm87CiAKK3N0cnVjdCBtb2R1bGU7CisKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCiAvKgogICogVGhlIG1hc3RlciByb3V0aW5lcyBhcmUgdGhlIG9uZXMgbm9ybWFsbHkgdXNlZCB0byB0cmFuc21pdCBkYXRhIHRvIGRldmljZXMKQEAgLTg4LDYgKzkwLDIyIEBACiAJCQkJICAgIHU4IGNvbW1hbmQpOwogZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOworCitzdGF0aWMgaW5saW5lIHMzMgoraTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQpCit7CisJczMyIHZhbHVlID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgY29tbWFuZCk7CisKKwlyZXR1cm4gKHZhbHVlIDwgMCkgPyB2YWx1ZSA6IHN3YWIxNih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyCitpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIGNvbW1hbmQsIHN3YWIxNih2YWx1ZSkpOworfQorCiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcyAqLwogZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1OCAqdmFsdWVzKTsKQEAgLTQzNCwxMCArNDUyLDkgQEAKIGV4dGVybiBpbnQgaTJjX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbW9kdWxlICosIHN0cnVjdCBpMmNfZHJpdmVyICopOwogZXh0ZXJuIHZvaWQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGkyY19hZGRfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpCi17Ci0JcmV0dXJuIGkyY19yZWdpc3Rlcl9kcml2ZXIoVEhJU19NT0RVTEUsIGRyaXZlcik7Ci19CisvKiB1c2UgYSBkZWZpbmUgdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgaTJjX2FkZF9kcml2ZXIoZHJpdmVyKSBcCisJaTJjX3JlZ2lzdGVyX2RyaXZlcihUSElTX01PRFVMRSwgZHJpdmVyKQogCiBleHRlcm4gc3RydWN0IGkyY19jbGllbnQgKmkyY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogZXh0ZXJuIHZvaWQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oIGIvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oCmluZGV4IDU5MTQyN2EuLjUwNmE5ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy90c2MyMDA3LmgKQEAgLTUsNyArNSw3IEBACiAKIHN0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgewogCXUxNgltb2RlbDsJCQkJLyogMjAwNy4gKi8KLQl1MTYJeF9wbGF0ZV9vaG1zOworCXUxNgl4X3BsYXRlX29obXM7CS8qIG11c3QgYmUgbm9uLXplcm8gdmFsdWUgKi8KIAl1MTYJbWF4X3J0OyAvKiBtYXguIHJlc2lzdGFuY2UgYWJvdmUgd2hpY2ggc2FtcGxlcyBhcmUgaWdub3JlZCAqLwogCXVuc2lnbmVkIGxvbmcgcG9sbF9kZWxheTsgLyogZGVsYXkgKGluIG1zKSBhZnRlciBwZW4tZG93biBldmVudAogCQkJCSAgICAgYmVmb3JlIHBvbGxpbmcgc3RhcnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLW1hZGMuaCBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCmluZGV4IDY0MjdkMjkuLjUzMGUxMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAtbWFkYy5oCkBAIC0xMjksNiArMTI5LDEwIEBACiAjZGVmaW5lIFJFR19CQ0lDVEwyICAgICAgICAgICAgIDB4MDI0CiAjZGVmaW5lIFRXTDQwMzBfQkNJX0lUSFNFTlMJMHgwMDcKIAorLyogUmVnaXN0ZXIgYW5kIGJpdHMgZm9yIEdQQlIxIHJlZ2lzdGVyICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX0dQQlIxCQkweDBjCisjZGVmaW5lIFRXTDQwMzBfR1BCUjFfTUFEQ19IRkNMS19FTgkoMSA8PCA3KQorCiBzdHJ1Y3QgdHdsNDAzMF9tYWRjX3VzZXJfcGFybXMgewogCWludCBjaGFubmVsOwogCWludCBhdmVyYWdlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKaW5kZXggNjZjZWRmNi4uMjEwZTJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCkBAIC01NDQsNiArNTQ0LDE1IEBACiAJICAgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyk7CiB9CiAKKy8qKgorICogaWVlZTgwMjExX2lzX2ZpcnN0X2ZyYWcgLSBjaGVjayBpZiBJRUVFODAyMTFfU0NUTF9GUkFHIGlzIG5vdCBzZXQKKyAqIEBzZXFfY3RybDogZnJhbWUgc2VxdWVuY2UgY29udHJvbCBieXRlcyBpbiBsaXR0bGUtZW5kaWFuIGJ5dGVvcmRlcgorICovCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfZmlyc3RfZnJhZyhfX2xlMTYgc2VxX2N0cmwpCit7CisJcmV0dXJuIChzZXFfY3RybCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpKSA9PSAwOworfQorCiBzdHJ1Y3QgaWVlZTgwMjExc19oZHIgewogCXU4IGZsYWdzOwogCXU4IHR0bDsKQEAgLTE2OTUsNiArMTcwNCwyMyBAQAogfQogCiAvKioKKyAqIGllZWU4MDIxMV9pc19wdWJsaWNfYWN0aW9uIC0gY2hlY2sgaWYgZnJhbWUgaXMgYSBwdWJsaWMgYWN0aW9uIGZyYW1lCisgKiBAaGRyOiB0aGUgZnJhbWUKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgZnJhbWUKKyAqLworc3RhdGljIGlubGluZSBib29sIGllZWU4MDIxMV9pc19wdWJsaWNfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJCSAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHZvaWQgKiloZHI7CisKKwlpZiAobGVuIDwgSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfUFVCTElDOworfQorCisvKioKICAqIGllZWU4MDIxMV9maHNzX2NoYW5fdG9fZnJlcSAtIGdldCBjaGFubmVsIGZyZXF1ZW5jeQogICogQGNoYW5uZWw6IHRoZSBGSFNTIGNoYW5uZWwKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKaW5kZXggYTYzN2U3OC4uMzg2MmUzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtNTA1LDYgKzUwNSw3IEBACiAjZGVmaW5lIEJUTl9UT09MX0ZJTkdFUgkJMHgxNDUKICNkZWZpbmUgQlROX1RPT0xfTU9VU0UJCTB4MTQ2CiAjZGVmaW5lIEJUTl9UT09MX0xFTlMJCTB4MTQ3CisjZGVmaW5lIEJUTl9UT09MX1FVSU5UVEFQCTB4MTQ4CS8qIEZpdmUgZmluZ2VycyBvbiB0cmFja3BhZCAqLwogI2RlZmluZSBCVE5fVE9VQ0gJCTB4MTRhCiAjZGVmaW5lIEJUTl9TVFlMVVMJCTB4MTRiCiAjZGVmaW5lIEJUTl9TVFlMVVMyCQkweDE0YwpAQCAtODE0LDYgKzgxNSw3IEBACiAjZGVmaW5lIFNXX0tFWVBBRF9TTElERQkJMHgwYSAgLyogc2V0ID0ga2V5cGFkIHNsaWRlIG91dCAqLwogI2RlZmluZSBTV19GUk9OVF9QUk9YSU1JVFkJMHgwYiAgLyogc2V0ID0gZnJvbnQgcHJveGltaXR5IHNlbnNvciBhY3RpdmUgKi8KICNkZWZpbmUgU1dfUk9UQVRFX0xPQ0sJCTB4MGMgIC8qIHNldCA9IHJvdGF0ZSBsb2NrZWQvZGlzYWJsZWQgKi8KKyNkZWZpbmUgU1dfTElORUlOX0lOU0VSVAkweDBkICAvKiBzZXQgPSBpbnNlcnRlZCAqLwogI2RlZmluZSBTV19NQVgJCQkweDBmCiAjZGVmaW5lIFNXX0NOVAkJCShTV19NQVgrMSkKIApAQCAtMTYwOSw3ICsxNjExLDcgQEAKIAlzdHJ1Y3QgZmlsZSAqZWZmZWN0X293bmVyc1tdOwogfTsKIAotaW50IGlucHV0X2ZmX2NyZWF0ZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBtYXhfZWZmZWN0cyk7CitpbnQgaW5wdXRfZmZfY3JlYXRlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IG1heF9lZmZlY3RzKTsKIHZvaWQgaW5wdXRfZmZfZGVzdHJveShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOwogCiBpbnQgaW5wdXRfZmZfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lucHV0L2FkcDU1ODkuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCmluZGV4IGVmNzkyZWMuLjFhMDVlZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvYWRwNTU4OS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEFuYWxvZyBEZXZpY2VzIEFEUDU1ODkgSS9PIEV4cGFuZGVyIGFuZCBRV0VSVFkgS2V5cGFkIENvbnRyb2xsZXIKKyAqIEFuYWxvZyBEZXZpY2VzIEFEUDU1ODkvQURQNTU4NSBJL08gRXhwYW5kZXIgYW5kIFFXRVJUWSBLZXlwYWQgQ29udHJvbGxlcgogICoKICAqIENvcHlyaWdodCAyMDEwLTIwMTEgQW5hbG9nIERldmljZXMgSW5jLgogICoKQEAgLTksODkgKzksOSBAQAogI2lmbmRlZiBfQURQNTU4OV9ICiAjZGVmaW5lIF9BRFA1NTg5X0gKIAotI2RlZmluZSBBRFA1NTg5X0lECQkJMHgwMAotI2RlZmluZSBBRFA1NTg5X0lOVF9TVEFUVVMJCTB4MDEKLSNkZWZpbmUgQURQNTU4OV9TVEFUVVMJCQkweDAyCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xCQkJMHgwMwotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMgkJCTB4MDQKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzMJCQkweDA1Ci0jZGVmaW5lIEFEUDU1ODlfRklGT180CQkJMHgwNgotI2RlZmluZSBBRFA1NTg5X0ZJRk9fNQkJCTB4MDcKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzYJCQkweDA4Ci0jZGVmaW5lIEFEUDU1ODlfRklGT183CQkJMHgwOQotI2RlZmluZSBBRFA1NTg5X0ZJRk9fOAkJCTB4MEEKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzkJCQkweDBCCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xMAkJCTB4MEMKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzExCQkJMHgwRAotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMTIJCQkweDBFCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xMwkJCTB4MEYKLSNkZWZpbmUgQURQNTU4OV9GSUZPXzE0CQkJMHgxMAotI2RlZmluZSBBRFA1NTg5X0ZJRk9fMTUJCQkweDExCi0jZGVmaW5lIEFEUDU1ODlfRklGT18xNgkJCTB4MTIKLSNkZWZpbmUgQURQNTU4OV9HUElfSU5UX1NUQVRfQQkJMHgxMwotI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRfU1RBVF9CCQkweDE0Ci0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9TVEFUX0MJCTB4MTUKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0EJCTB4MTYKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0IJCTB4MTcKLSNkZWZpbmUgQURQNTU4OV9HUElfU1RBVFVTX0MJCTB4MTgKLSNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfQQkJMHgxOQotI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19CCQkweDFBCi0jZGVmaW5lIEFEUDU1ODlfUlBVTExfQ09ORklHX0MJCTB4MUIKLSNkZWZpbmUgQURQNTU4OV9SUFVMTF9DT05GSUdfRAkJMHgxQwotI2RlZmluZSBBRFA1NTg5X1JQVUxMX0NPTkZJR19FCQkweDFECi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9BCQkweDFFCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9CCQkweDFGCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVF9MRVZFTF9DCQkweDIwCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0VWRU5UX0VOX0EJCTB4MjEKLSNkZWZpbmUgQURQNTU4OV9HUElfRVZFTlRfRU5fQgkJMHgyMgotI2RlZmluZSBBRFA1NTg5X0dQSV9FVkVOVF9FTl9DCQkweDIzCi0jZGVmaW5lIEFEUDU1ODlfR1BJX0lOVEVSUlVQVF9FTl9BCTB4MjQKLSNkZWZpbmUgQURQNTU4OV9HUElfSU5URVJSVVBUX0VOX0IJMHgyNQotI2RlZmluZSBBRFA1NTg5X0dQSV9JTlRFUlJVUFRfRU5fQwkweDI2Ci0jZGVmaW5lIEFEUDU1ODlfREVCT1VOQ0VfRElTX0EJCTB4MjcKLSNkZWZpbmUgQURQNTU4OV9ERUJPVU5DRV9ESVNfQgkJMHgyOAotI2RlZmluZSBBRFA1NTg5X0RFQk9VTkNFX0RJU19DCQkweDI5Ci0jZGVmaW5lIEFEUDU1ODlfR1BPX0RBVEFfT1VUX0EJCTB4MkEKLSNkZWZpbmUgQURQNTU4OV9HUE9fREFUQV9PVVRfQgkJMHgyQgotI2RlZmluZSBBRFA1NTg5X0dQT19EQVRBX09VVF9DCQkweDJDCi0jZGVmaW5lIEFEUDU1ODlfR1BPX09VVF9NT0RFX0EJCTB4MkQKLSNkZWZpbmUgQURQNTU4OV9HUE9fT1VUX01PREVfQgkJMHgyRQotI2RlZmluZSBBRFA1NTg5X0dQT19PVVRfTU9ERV9DCQkweDJGCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQQkweDMwCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQgkweDMxCi0jZGVmaW5lIEFEUDU1ODlfR1BJT19ESVJFQ1RJT05fQwkweDMyCi0jZGVmaW5lIEFEUDU1ODlfVU5MT0NLMQkJCTB4MzMKLSNkZWZpbmUgQURQNTU4OV9VTkxPQ0syCQkJMHgzNAotI2RlZmluZSBBRFA1NTg5X0VYVF9MT0NLX0VWRU5UCQkweDM1Ci0jZGVmaW5lIEFEUDU1ODlfVU5MT0NLX1RJTUVSUwkJMHgzNgotI2RlZmluZSBBRFA1NTg5X0xPQ0tfQ0ZHCQkweDM3Ci0jZGVmaW5lIEFEUDU1ODlfUkVTRVQxX0VWRU5UX0EJCTB4MzgKLSNkZWZpbmUgQURQNTU4OV9SRVNFVDFfRVZFTlRfQgkJMHgzOQotI2RlZmluZSBBRFA1NTg5X1JFU0VUMV9FVkVOVF9DCQkweDNBCi0jZGVmaW5lIEFEUDU1ODlfUkVTRVQyX0VWRU5UX0EJCTB4M0IKLSNkZWZpbmUgQURQNTU4OV9SRVNFVDJfRVZFTlRfQgkJMHgzQwotI2RlZmluZSBBRFA1NTg5X1JFU0VUX0NGRwkJMHgzRAotI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0xPVwkJMHgzRQotI2RlZmluZSBBRFA1NTg5X1BXTV9PRkZUX0hJR0gJCTB4M0YKLSNkZWZpbmUgQURQNTU4OV9QV01fT05UX0xPVwkJMHg0MAotI2RlZmluZSBBRFA1NTg5X1BXTV9PTlRfSElHSAkJMHg0MQotI2RlZmluZSBBRFA1NTg5X1BXTV9DRkcJCQkweDQyCi0jZGVmaW5lIEFEUDU1ODlfQ0xPQ0tfRElWX0NGRwkJMHg0MwotI2RlZmluZSBBRFA1NTg5X0xPR0lDXzFfQ0ZHCQkweDQ0Ci0jZGVmaW5lIEFEUDU1ODlfTE9HSUNfMl9DRkcJCTB4NDUKLSNkZWZpbmUgQURQNTU4OV9MT0dJQ19GRl9DRkcJCTB4NDYKLSNkZWZpbmUgQURQNTU4OV9MT0dJQ19JTlRfRVZFTlRfRU4JMHg0NwotI2RlZmluZSBBRFA1NTg5X1BPTExfUFRJTUVfQ0ZHCQkweDQ4Ci0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19BCQkweDQ5Ci0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19CCQkweDRBCi0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19DCQkweDRCCi0jZGVmaW5lIEFEUDU1ODlfUElOX0NPTkZJR19ECQkweDRDCi0jZGVmaW5lIEFEUDU1ODlfR0VORVJBTF9DRkcJCTB4NEQKLSNkZWZpbmUgQURQNTU4OV9JTlRfRU4JCQkweDRFCi0KLSNkZWZpbmUgQURQNTU4OV9ERVZJQ0VfSURfTUFTSwkweEYKLQotLyogUHV0IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGluIGkyY19ib2FyZF9pbmZvIHBsYXRmb3JtX2RhdGEgKi8KKy8qCisgKiBBRFA1NTg5IHNwZWNpZmljIEdQSSBhbmQgS2V5bWFwIGRlZmluZXMKKyAqLwogCiAjZGVmaW5lIEFEUDU1ODlfS0VZTUFQU0laRQk4OAogCkBAIC0xMjcsNiArNDcsMzUgQEAKIAogI2RlZmluZSBBRFA1NTg5X0dQSU1BUFNJWkVfTUFYIChBRFA1NTg5X0dQSV9QSU5fRU5EIC0gQURQNTU4OV9HUElfUElOX0JBU0UgKyAxKQogCisvKgorICogQURQNTU4NSBzcGVjaWZpYyBHUEkgYW5kIEtleW1hcCBkZWZpbmVzCisgKi8KKworI2RlZmluZSBBRFA1NTg1X0tFWU1BUFNJWkUJMzAKKworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMCAzNworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMSAzOAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMiAzOQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XMyA0MAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XNCA0MQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XNSA0MgorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMCA0MworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMSA0NAorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMiA0NQorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MMyA0NgorI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fQ09MNCA0NworI2RlZmluZSBHUElfTE9HSUMgNDgKKworI2RlZmluZSBBRFA1NTg1X0dQSV9QSU5fUk9XX0JBU0UgQURQNTU4NV9HUElfUElOX1JPVzAKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX1JPV19FTkQgQURQNTU4NV9HUElfUElOX1JPVzUKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX0NPTF9CQVNFIEFEUDU1ODVfR1BJX1BJTl9DT0wwCisjZGVmaW5lIEFEUDU1ODVfR1BJX1BJTl9DT0xfRU5EIEFEUDU1ODVfR1BJX1BJTl9DT0w0CisKKyNkZWZpbmUgQURQNTU4NV9HUElfUElOX0JBU0UgQURQNTU4NV9HUElfUElOX1JPV19CQVNFCisjZGVmaW5lIEFEUDU1ODVfR1BJX1BJTl9FTkQgQURQNTU4NV9HUElfUElOX0NPTF9FTkQKKworI2RlZmluZSBBRFA1NTg1X0dQSU1BUFNJWkVfTUFYIChBRFA1NTg1X0dQSV9QSU5fRU5EIC0gQURQNTU4NV9HUElfUElOX0JBU0UgKyAxKQorCiBzdHJ1Y3QgYWRwNTU4OV9ncGlfbWFwIHsKIAl1bnNpZ25lZCBzaG9ydCBwaW47CiAJdW5zaWduZWQgc2hvcnQgc3dfZXZ0OwpAQCAtMTU5LDcgKzEwOCw3IEBACiAjZGVmaW5lIFJFU0VUMl9QT0xfSElHSAkJCSgxIDw8IDcpCiAjZGVmaW5lIFJFU0VUMl9QT0xfTE9XCQkJKDAgPDwgNykKIAotLyogTWFzayBCaXRzOgorLyogQURQNTU4OSBNYXNrIEJpdHM6CiAgKiBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgfCBSIFIgUiBSIFIgUiBSIFIKICAqIDEgOSA4IDcgNiA1IDQgMyAyIDEgMCB8IDcgNiA1IDQgMyAyIDEgMAogICogMApAQCAtMTY4LDE4ICsxMTcsNDQgQEAKICAqIDggNyA2IDUgNCAzIDIgMSAwIDkgOCB8IDcgNiA1IDQgMyAyIDEgMAogICovCiAKLSNkZWZpbmUgQURQX1JPVyh4KQkJCSgxIDw8ICh4KSkKLSNkZWZpbmUgQURQX0NPTCh4KQkJCSgxIDw8ICh4ICsgOCkpCisjZGVmaW5lIEFEUF9ST1coeCkJKDEgPDwgKHgpKQorI2RlZmluZSBBRFBfQ09MKHgpCSgxIDw8ICh4ICsgOCkpCisjZGVmaW5lIEFEUDU1ODlfUk9XX01BU0sJCTB4RkYKKyNkZWZpbmUgQURQNTU4OV9DT0xfTUFTSwkJMHhGRgorI2RlZmluZSBBRFA1NTg5X0NPTF9TSElGVAkJOAorI2RlZmluZSBBRFA1NTg5X01BWF9ST1dfTlVNCQk3CisjZGVmaW5lIEFEUDU1ODlfTUFYX0NPTF9OVU0JCTEwCisKKy8qIEFEUDU1ODUgTWFzayBCaXRzOgorICogQyBDIEMgQyBDIHwgUiBSIFIgUiBSIFIKKyAqIDQgMyAyIDEgMCB8IDUgNCAzIDIgMSAwCisgKgorICogLS0tLSBCSVQgLS0gLS0tLS0tLS0tLS0KKyAqIDEgMCAwIDAgMCB8IDAgMCAwIDAgMCAwCisgKiAwIDkgOCA3IDYgfCA1IDQgMyAyIDEgMAorICovCisKKyNkZWZpbmUgQURQNTU4NV9ST1dfTUFTSwkJMHgzRgorI2RlZmluZSBBRFA1NTg1X0NPTF9NQVNLCQkweDFGCisjZGVmaW5lIEFEUDU1ODVfUk9XX1NISUZUCQkwCisjZGVmaW5lIEFEUDU1ODVfQ09MX1NISUZUCQk2CisjZGVmaW5lIEFEUDU1ODVfTUFYX1JPV19OVU0JCTUKKyNkZWZpbmUgQURQNTU4NV9NQVhfQ09MX05VTQkJNAorCisjZGVmaW5lIEFEUDU1ODVfUk9XKHgpCSgxIDw8ICgoeCkgJiBBRFA1NTg1X1JPV19NQVNLKSkKKyNkZWZpbmUgQURQNTU4NV9DT0woeCkJKDEgPDwgKCgoeCkgJiBBRFA1NTg1X0NPTF9NQVNLKSArIEFEUDU1ODVfQ09MX1NISUZUKSkKKworLyogUHV0IG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGluIGkyY19ib2FyZF9pbmZvIHBsYXRmb3JtX2RhdGEgKi8KIAogc3RydWN0IGFkcDU1ODlfa3BhZF9wbGF0Zm9ybV9kYXRhIHsKIAl1bnNpZ25lZCBrZXlwYWRfZW5fbWFzazsJLyogS2V5cGFkIChSb3dzL0NvbHVtbnMpIGVuYWJsZSBtYXNrICovCiAJY29uc3QgdW5zaWduZWQgc2hvcnQgKmtleW1hcDsJLyogUG9pbnRlciB0byBrZXltYXAgKi8KIAl1bnNpZ25lZCBzaG9ydCBrZXltYXBzaXplOwkvKiBLZXltYXAgc2l6ZSAqLwogCWJvb2wgcmVwZWF0OwkJCS8qIEVuYWJsZSBrZXkgcmVwZWF0ICovCi0JYm9vbCBlbl9rZXlsb2NrOwkJLyogRW5hYmxlIGtleSBsb2NrIGZlYXR1cmUgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja19rZXkxOwkvKiBVbmxvY2sgS2V5IDEgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja19rZXkyOwkvKiBVbmxvY2sgS2V5IDIgKi8KLQl1bnNpZ25lZCBjaGFyIHVubG9ja190aW1lcjsJLyogVGltZSBpbiBzZWNvbmRzIFswLi43XSBiZXR3ZWVuIHRoZSB0d28gdW5sb2NrIGtleXMgMD1kaXNhYmxlICovCisJYm9vbCBlbl9rZXlsb2NrOwkJLyogRW5hYmxlIGtleSBsb2NrIGZlYXR1cmUgKEFEUDU1ODkgb25seSkqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX2tleTE7CS8qIFVubG9jayBLZXkgMSAoQURQNTU4OSBvbmx5KSAqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX2tleTI7CS8qIFVubG9jayBLZXkgMiAoQURQNTU4OSBvbmx5KSAqLworCXVuc2lnbmVkIGNoYXIgdW5sb2NrX3RpbWVyOwkvKiBUaW1lIGluIHNlY29uZHMgWzAuLjddIGJldHdlZW4gdGhlIHR3byB1bmxvY2sga2V5cyAwPWRpc2FibGUgKEFEUDU1ODkgb25seSkgKi8KIAl1bnNpZ25lZCBjaGFyIHNjYW5fY3ljbGVfdGltZTsJLyogVGltZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHNjYW4gY3ljbGVzICovCiAJdW5zaWduZWQgY2hhciByZXNldF9jZmc7CS8qIFJlc2V0IGNvbmZpZyAqLwogCXVuc2lnbmVkIHNob3J0IHJlc2V0MV9rZXlfMTsJLyogUmVzZXQgS2V5IDEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQvYWR4bDM0eC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKaW5kZXggZGYwMGQ5OS4uNTdlMDFhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC9hZHhsMzR4LmgKQEAgLTMwLDggKzMwLDkgQEAKIAkgKiBZLCBvciBaIHBhcnRpY2lwYXRpb24gaW4gVGFwIGRldGVjdGlvbi4gQSAnMCcgZXhjbHVkZXMgdGhlCiAJICogc2VsZWN0ZWQgYXhpcyBmcm9tIHBhcnRpY2lwYXRpb24gaW4gVGFwIGRldGVjdGlvbi4KIAkgKiBTZXR0aW5nIHRoZSBTVVBQUkVTUyBiaXQgc3VwcHJlc3NlcyBEb3VibGUgVGFwIGRldGVjdGlvbiBpZgotCSAqIGFjY2VsZXJhdGlvbiBncmVhdGVyIHRoYW4gdGFwX3RocmVzaG9sZCBpcyBwcmVzZW50IGJldHdlZW4KLQkgKiB0YXBzLgorCSAqIGFjY2VsZXJhdGlvbiBncmVhdGVyIHRoYW4gdGFwX3RocmVzaG9sZCBpcyBwcmVzZW50IGR1cmluZyB0aGUKKwkgKiB0YXBfbGF0ZW5jeSBwZXJpb2QsIGkuZS4gYWZ0ZXIgdGhlIGZpcnN0IHRhcCBidXQgYmVmb3JlIHRoZQorCSAqIG9wZW5pbmcgb2YgdGhlIHNlY29uZCB0YXAgd2luZG93LgogCSAqLwogCiAjZGVmaW5lIEFEWExfU1VQUFJFU1MJKDEgPDwgMykKQEAgLTIyNiwxMyArMjI3LDEzIEBACiAJICogZGV0ZWN0aW9uIHdpbGwgYmVnaW4gYW5kIHByZXZlbnQgdGhlIGRldGVjdGlvbiBvZiBhY3Rpdml0eS4gVGhpcwogCSAqIGJpdCBzZXJpYWxseSBsaW5rcyB0aGUgYWN0aXZpdHkgYW5kIGluYWN0aXZpdHkgZnVuY3Rpb25zLiBXaGVuICcwJwogCSAqIHRoZSBpbmFjdGl2aXR5IGFuZCBhY3Rpdml0eSBmdW5jdGlvbnMgYXJlIGNvbmN1cnJlbnQuIEFkZGl0aW9uYWwKLQkgKiBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIEFwcGxpY2F0aW9uIHNlY3Rpb24gdW5kZXIgTGluawotCSAqIE1vZGUuCisJICogaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBBRFhMMzR4IGRhdGFzaGVldCdzIEFwcGxpY2F0aW9uCisJICogc2VjdGlvbiB1bmRlciBMaW5rIE1vZGUuCiAJICogQVVUT19TTEVFUDogQSAnMScgc2V0cyB0aGUgQURYTDM0eCB0byBzd2l0Y2ggdG8gU2xlZXAgTW9kZQogCSAqIHdoZW4gaW5hY3Rpdml0eSAoYWNjZWxlcmF0aW9uIGhhcyBiZWVuIGJlbG93IGluYWN0aXZpdHlfdGhyZXNob2xkCiAJICogZm9yIGF0IGxlYXN0IGluYWN0aXZpdHlfdGltZSkgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBMSU5LIGJpdCBpcyBzZXQuCi0JICogQSAnMCcgZGlzYWJsZXMgYXV0b21hdGljIHN3aXRjaGluZyB0byBTbGVlcCBNb2RlLiBTZWUgU0xFRVAKLQkgKiBmb3IgZnVydGhlciBkZXNjcmlwdGlvbi4KKwkgKiBBICcwJyBkaXNhYmxlcyBhdXRvbWF0aWMgc3dpdGNoaW5nIHRvIFNsZWVwIE1vZGUuIFNlZSB0aGUKKwkgKiBTbGVlcCBCaXQgc2VjdGlvbiBvZiB0aGUgQURYTDM0eCBkYXRhc2hlZXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAJICovCiAKICNkZWZpbmUgQURYTF9MSU5LCSgxIDw8IDUpCkBAIC0yNjYsNiArMjY3LDEyIEBACiAKIAl1OCB3YXRlcm1hcms7CiAKKwkvKgorCSAqIFdoZW4gYWNjZWxlcmF0aW9uIG1lYXN1cmVtZW50cyBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgQURYTDM0eAorCSAqIGV2ZW50cyBhcmUgc2VudCB0byB0aGUgZXZlbnQgc3Vic3lzdGVtLiBUaGUgZm9sbG93aW5nIHNldHRpbmdzCisJICogc2VsZWN0IHRoZSBldmVudCB0eXBlIGFuZCBldmVudCBjb2RlIGZvciBuZXcgeCwgeSBhbmQgeiBheGlzIGRhdGEKKwkgKiByZXNwZWN0aXZlbHkuCisJICovCiAJdTMyIGV2X3R5cGU7CS8qIEVWX0FCUyBvciBFVl9SRUwgKi8KIAogCXUzMiBldl9jb2RlX3g7CS8qIEFCU19YLFksWiBvciBSRUxfWCxZLFogKi8KQEAgLTI4OSw3ICsyOTYsNyBAQAogCXUzMiBldl9jb2RlX2FjdF9pbmFjdGl2aXR5OwkvKiBFVl9LRVkgKi8KIAogCS8qCi0JICogVXNlIEFEWEwzNHggSU5UMiBpbnN0ZWFkIG9mIElOVDEKKwkgKiBVc2UgQURYTDM0eCBJTlQyIHBpbiBpbnN0ZWFkIG9mIElOVDEgcGluIGZvciBpbnRlcnJ1cHQgb3V0cHV0CiAJICovCiAJdTggdXNlX2ludDI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8tbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKaW5kZXggYzgxZWQyYS4uZTQ0ZTg0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby1tYXBwaW5nLmgKQEAgLTExNyw2ICsxMTcsOCBAQAogCiAjZWxzZQogCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCiAvKiB0aGlzIHN0cnVjdCBpc24ndCBhY3R1YWxseSBkZWZpbmVkIGFueXdoZXJlICovCiBzdHJ1Y3QgaW9fbWFwcGluZzsKIApAQCAtMTM4LDEyICsxNDAsMTQgQEAKIGlvX21hcHBpbmdfbWFwX2F0b21pY193YyhzdHJ1Y3QgaW9fbWFwcGluZyAqbWFwcGluZywKIAkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCXJldHVybiAoKGNoYXIgX19mb3JjZSBfX2lvbWVtICopIG1hcHBpbmcpICsgb2Zmc2V0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHZvaWQgX19pb21lbSAqdmFkZHIpCiB7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogfQogCiAvKiBOb24tYXRvbWljIG1hcC91bm1hcCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCmluZGV4IDk5NDAzMTkuLjQzMmFjYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9tbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKQEAgLTI1LDE1ICsyNSwyOSBAQAogI2RlZmluZSBJT01NVV9XUklURQkoMikKICNkZWZpbmUgSU9NTVVfQ0FDSEUJKDQpIC8qIERNQSBjYWNoZSBjb2hlcmVuY3kgKi8KIAorc3RydWN0IGlvbW11X29wczsKK3N0cnVjdCBidXNfdHlwZTsKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgaW9tbXVfZG9tYWluOworCisvKiBpb21tdSBmYXVsdCBmbGFncyAqLworI2RlZmluZSBJT01NVV9GQVVMVF9SRUFECTB4MAorI2RlZmluZSBJT01NVV9GQVVMVF9XUklURQkweDEKKwordHlwZWRlZiBpbnQgKCppb21tdV9mYXVsdF9oYW5kbGVyX3QpKHN0cnVjdCBpb21tdV9kb21haW4gKiwKKwkJCQlzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIGludCk7CiAKIHN0cnVjdCBpb21tdV9kb21haW4geworCXN0cnVjdCBpb21tdV9vcHMgKm9wczsKIAl2b2lkICpwcml2OworCWlvbW11X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyOwogfTsKIAogI2RlZmluZSBJT01NVV9DQVBfQ0FDSEVfQ09IRVJFTkNZCTB4MQogI2RlZmluZSBJT01NVV9DQVBfSU5UUl9SRU1BUAkJMHgyCS8qIGlzb2xhdGVzIGRldmljZSBpbnRycyAqLwogCisjaWZkZWYgQ09ORklHX0lPTU1VX0FQSQorCiBzdHJ1Y3QgaW9tbXVfb3BzIHsKIAlpbnQgKCpkb21haW5faW5pdCkoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKTsKIAl2b2lkICgqZG9tYWluX2Rlc3Ryb3kpKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbik7CkBAIC00OSwxMSArNjMsOSBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBjYXApOwogfTsKIAotI2lmZGVmIENPTkZJR19JT01NVV9BUEkKLQotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfaW9tbXUoc3RydWN0IGlvbW11X29wcyAqb3BzKTsKLWV4dGVybiBib29sIGlvbW11X2ZvdW5kKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyh2b2lkKTsKK2V4dGVybiBpbnQgYnVzX3NldF9pb21tdShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgc3RydWN0IGlvbW11X29wcyAqb3BzKTsKK2V4dGVybiBib29sIGlvbW11X3ByZXNlbnQoc3RydWN0IGJ1c190eXBlICpidXMpOworZXh0ZXJuIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyk7CiBleHRlcm4gdm9pZCBpb21tdV9kb21haW5fZnJlZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pOwogZXh0ZXJuIGludCBpb21tdV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtNjcsMTkgKzc5LDU4IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpb3ZhKTsKIGV4dGVybiBpbnQgaW9tbXVfZG9tYWluX2hhc19jYXAoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAogCQkJCXVuc2lnbmVkIGxvbmcgY2FwKTsKK2V4dGVybiB2b2lkIGlvbW11X3NldF9mYXVsdF9oYW5kbGVyKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKKwkJCQkJaW9tbXVfZmF1bHRfaGFuZGxlcl90IGhhbmRsZXIpOworCisvKioKKyAqIHJlcG9ydF9pb21tdV9mYXVsdCgpIC0gcmVwb3J0IGFib3V0IGFuIElPTU1VIGZhdWx0IHRvIHRoZSBJT01NVSBmcmFtZXdvcmsKKyAqIEBkb21haW46IHRoZSBpb21tdSBkb21haW4gd2hlcmUgdGhlIGZhdWx0IGhhcyBoYXBwZW5lZAorICogQGRldjogdGhlIGRldmljZSB3aGVyZSB0aGUgZmF1bHQgaGFzIGhhcHBlbmVkCisgKiBAaW92YTogdGhlIGZhdWx0aW5nIGFkZHJlc3MKKyAqIEBmbGFnczogbW11IGZhdWx0IGZsYWdzIChlLmcuIElPTU1VX0ZBVUxUX1JFQUQvSU9NTVVfRkFVTFRfV1JJVEUvLi4uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgbG93LWxldmVsIElPTU1VIGltcGxlbWVudGF0aW9ucworICogd2hlbmV2ZXIgSU9NTVUgZmF1bHRzIGhhcHBlbiwgdG8gYWxsb3cgaGlnaC1sZXZlbCB1c2VycywgdGhhdCBhcmUKKyAqIGludGVyZXN0ZWQgaW4gc3VjaCBldmVudHMsIHRvIGtub3cgYWJvdXQgdGhlbS4KKyAqCisgKiBUaGlzIGV2ZW50IG1heSBiZSB1c2VmdWwgZm9yIHNldmVyYWwgcG9zc2libGUgdXNlIGNhc2VzOgorICogLSBtZXJlIGxvZ2dpbmcgb2YgdGhlIGV2ZW50CisgKiAtIGR5bmFtaWMgVExCL1BURSBsb2FkaW5nCisgKiAtIGlmIHJlc3RhcnRpbmcgb2YgdGhlIGZhdWx0aW5nIGRldmljZSBpcyByZXF1aXJlZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZSAoaWYgZHluYW1pYworICogUFRFL1RMQiBsb2FkaW5nIHdpbGwgb25lIGRheSBiZSBzdXBwb3J0ZWQsIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIGFibGUKKyAqIHRvIHRlbGwgd2hldGhlciBpdCBzdWNjZWVkZWQgb3Igbm90IGFjY29yZGluZyB0byB0aGlzIHJldHVybiB2YWx1ZSkuCisgKgorICogU3BlY2lmaWNhbGx5LCAtRU5PU1lTIGlzIHJldHVybmVkIGlmIGEgZmF1bHQgaGFuZGxlciBpc24ndCBpbnN0YWxsZWQKKyAqICh0aG91Z2ggZmF1bHQgaGFuZGxlcnMgY2FuIGFsc28gcmV0dXJuIC1FTk9TWVMsIGluIGNhc2UgdGhleSB3YW50IHRvCisgKiBlbGljaXQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIElPTU1VIGRyaXZlcnMpLgorICovCitzdGF0aWMgaW5saW5lIGludCByZXBvcnRfaW9tbXVfZmF1bHQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGZsYWdzKQoreworCWludCByZXQgPSAtRU5PU1lTOworCisJLyoKKwkgKiBpZiB1cHBlciBsYXllcnMgc2hvd2VkIGludGVyZXN0IGFuZCBpbnN0YWxsZWQgYSBmYXVsdCBoYW5kbGVyLAorCSAqIGludm9rZSBpdC4KKwkgKi8KKwlpZiAoZG9tYWluLT5oYW5kbGVyKQorCQlyZXQgPSBkb21haW4tPmhhbmRsZXIoZG9tYWluLCBkZXYsIGlvdmEsIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CiAKICNlbHNlIC8qIENPTkZJR19JT01NVV9BUEkgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX2lvbW11KHN0cnVjdCBpb21tdV9vcHMgKm9wcykKLXsKLX0KK3N0cnVjdCBpb21tdV9vcHMge307CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpb21tdV9mb3VuZCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIGlvbW11X3ByZXNlbnQoc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbl9hbGxvYyh2b2lkKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW5fYWxsb2Moc3RydWN0IGJ1c190eXBlICpidXMpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMjMsNiArMTc0LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb21tdV9zZXRfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkJCWlvbW11X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyKQoreworfQorCiAjZW5kaWYgLyogQ09ORklHX0lPTU1VX0FQSSAqLwogCiAjZW5kaWYgLyogX19MSU5VWF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWkuaCBiL2luY2x1ZGUvbGludXgvaXBtaS5oCmluZGV4IGNhODVjZjguLmJiZDE1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBtaS5oCkBAIC0yMjAsMTAgKzIyMCwxMSBAQAogICogVGhlIGluLWtlcm5lbCBpbnRlcmZhY2UuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCitzdHJ1Y3QgbW9kdWxlOworCiAvKiBPcGFxdWUgdHlwZSBmb3IgYSBJUE1JIG1lc3NhZ2UgdXNlci4gIE9uZSBvZiB0aGVzZSBpcyBuZWVkZWQgdG8KICAgIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuICovCiB0eXBlZGVmIHN0cnVjdCBpcG1pX3VzZXIgKmlwbWlfdXNlcl90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oIGIvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oCmluZGV4IDIwNGY5Y2QuLjNlZjBkOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaV9zbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWlfc21pLmgKQEAgLTM2LDcgKzM2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lwbWlfbXNnZGVmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA1OWU0OWM4Li5iZmYyOWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTIzLDEzICsyMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCiBzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IGlycV9kZXNjOwogc3RydWN0IGlycV9kYXRhOwogdHlwZWRlZgl2b2lkICgqaXJxX2Zsb3dfaGFuZGxlcl90KSh1bnNpZ25lZCBpbnQgaXJxLApAQCAtNTY3LDMwICs1NjcsMjIgQEAKIGludCBfX2lycV9hbGxvY19kZXNjcyhpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IGNudCwgaW50IG5vZGUsCiAJCXN0cnVjdCBtb2R1bGUgKm93bmVyKTsKIAotc3RhdGljIGlubGluZSBpbnQgaXJxX2FsbG9jX2Rlc2NzKGludCBpcnEsIHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgY250LAotCQlpbnQgbm9kZSkKLXsKLQlyZXR1cm4gX19pcnFfYWxsb2NfZGVzY3MoaXJxLCBmcm9tLCBjbnQsIG5vZGUsIFRISVNfTU9EVUxFKTsKLX0KKy8qIHVzZSBtYWNyb3MgdG8gYXZvaWQgbmVlZGluZyBleHBvcnQuaCBmb3IgVEhJU19NT0RVTEUgKi8KKyNkZWZpbmUgaXJxX2FsbG9jX2Rlc2NzKGlycSwgZnJvbSwgY250LCBub2RlKQlcCisJX19pcnFfYWxsb2NfZGVzY3MoaXJxLCBmcm9tLCBjbnQsIG5vZGUsIFRISVNfTU9EVUxFKQorCisjZGVmaW5lIGlycV9hbGxvY19kZXNjKG5vZGUpCQkJXAorCWlycV9hbGxvY19kZXNjcygtMSwgMCwgMSwgbm9kZSkKKworI2RlZmluZSBpcnFfYWxsb2NfZGVzY19hdChhdCwgbm9kZSkJCVwKKwlpcnFfYWxsb2NfZGVzY3MoYXQsIGF0LCAxLCBub2RlKQorCisjZGVmaW5lIGlycV9hbGxvY19kZXNjX2Zyb20oZnJvbSwgbm9kZSkJCVwKKwlpcnFfYWxsb2NfZGVzY3MoLTEsIGZyb20sIDEsIG5vZGUpCiAKIHZvaWQgaXJxX2ZyZWVfZGVzY3ModW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNudCk7CiBpbnQgaXJxX3Jlc2VydmVfaXJxcyh1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IGNudCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlycV9hbGxvY19kZXNjKGludCBub2RlKQotewotCXJldHVybiBpcnFfYWxsb2NfZGVzY3MoLTEsIDAsIDEsIG5vZGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcnFfYWxsb2NfZGVzY19hdCh1bnNpZ25lZCBpbnQgYXQsIGludCBub2RlKQotewotCXJldHVybiBpcnFfYWxsb2NfZGVzY3MoYXQsIGF0LCAxLCBub2RlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxX2FsbG9jX2Rlc2NfZnJvbSh1bnNpZ25lZCBpbnQgZnJvbSwgaW50IG5vZGUpCi17Ci0JcmV0dXJuIGlycV9hbGxvY19kZXNjcygtMSwgZnJvbSwgMSwgbm9kZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZnJlZV9kZXNjKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaXJxX2ZyZWVfZGVzY3MoaXJxLCAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKaW5kZXggNmI2OWMyYy4uZjFlMjUyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKQEAgLTExLDYgKzExLDcgQEAKIHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5Owogc3RydWN0IHByb2NfZGlyX2VudHJ5Owogc3RydWN0IHRpbWVyX3JhbmRfc3RhdGU7CitzdHJ1Y3QgbW9kdWxlOwogLyoqCiAgKiBzdHJ1Y3QgaXJxX2Rlc2MgLSBpbnRlcnJ1cHQgZGVzY3JpcHRvcgogICogQGlycV9kYXRhOgkJcGVyIGlycSBhbmQgY2hpcCBkYXRhIHBhc3NlZCBkb3duIHRvIGNoaXAgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaAppbmRleCAzYWQ1NTNlLi45OTgzNGU1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oCkBAIC00Nyw2ICs0Nyw3IEBACiAgKiAgICAgICAgICAgIG9mIHRoZSBpcnFfZG9tYWluIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBhcnJheSBvZgogICogICAgICAgICAgICBpcnFfZGVzYyBzdHJ1Y3R1cmVzLgogICogQG5yX2lycTogTnVtYmVyIG9mIGlycXMgbWFuYWdlZCBieSB0aGUgaXJxIGRvbWFpbgorICogQGh3aXJxX2Jhc2U6IFN0YXJ0aW5nIG51bWJlciBmb3IgaHdpcnFzIG1hbmFnZWQgYnkgdGhlIGlycSBkb21haW4KICAqIEBvcHM6IHBvaW50ZXIgdG8gaXJxX2RvbWFpbiBtZXRob2RzCiAgKiBAcHJpdjogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm9yIHVzZSBieSBvd25lci4gIE5vdCB0b3VjaGVkIGJ5IGlycV9kb21haW4KICAqICAgICAgICBjb3JlIGNvZGUuCkBAIC01Nyw2ICs1OCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKIAl1bnNpZ25lZCBpbnQgbnJfaXJxOworCXVuc2lnbmVkIGludCBod2lycV9iYXNlOwogCWNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqb3BzOwogCXZvaWQgKnByaXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwpAQCAtNzIsOSArNzQsMjEgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycV9kb21haW5fdG9faXJxKHN0cnVjdCBpcnFfZG9tYWluICpkLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaHdpcnEpCiB7Ci0JcmV0dXJuIGQtPm9wcy0+dG9faXJxID8gZC0+b3BzLT50b19pcnEoZCwgaHdpcnEpIDogZC0+aXJxX2Jhc2UgKyBod2lycTsKKwlpZiAoZC0+b3BzLT50b19pcnEpCisJCXJldHVybiBkLT5vcHMtPnRvX2lycShkLCBod2lycSk7CisJaWYgKFdBUk5fT04oaHdpcnEgPCBkLT5od2lycV9iYXNlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGQtPmlycV9iYXNlICsgaHdpcnEgLSBkLT5od2lycV9iYXNlOwogfQogCisjZGVmaW5lIGlycV9kb21haW5fZm9yX2VhY2hfaHdpcnEoZCwgaHcpIFwKKwlmb3IgKGh3ID0gZC0+aHdpcnFfYmFzZTsgaHcgPCBkLT5od2lycV9iYXNlICsgZC0+bnJfaXJxOyBodysrKQorCisjZGVmaW5lIGlycV9kb21haW5fZm9yX2VhY2hfaXJxKGQsIGh3LCBpcnEpIFwKKwlmb3IgKGh3ID0gZC0+aHdpcnFfYmFzZSwgaXJxID0gaXJxX2RvbWFpbl90b19pcnEoZCwgaHcpOyBcCisJICAgICBodyA8IGQtPmh3aXJxX2Jhc2UgKyBkLT5ucl9pcnE7IFwKKwkgICAgIGh3KyssIGlycSA9IGlycV9kb21haW5fdG9faXJxKGQsIGh3KSkKKwogZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9hZGQoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbik7CiBleHRlcm4gdm9pZCBpcnFfZG9tYWluX2RlbChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKTsKICNlbmRpZiAvKiBDT05GSUdfSVJRX0RPTUFJTiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQuaCBiL2luY2x1ZGUvbGludXgvamJkLmgKaW5kZXggZTZhNWUzNC4uYzdhY2RkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZC5oCkBAIC0yNDQsNiArMjQ0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmRfY29tbW9uLmg+CiAKICNkZWZpbmUgSl9BU1NFUlQoYXNzZXJ0KQlCVUdfT04oIShhc3NlcnQpKQogCkBAIC0yNzAsNjkgKzI3MSw2IEBACiAjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCV9fam91cm5hbF9leHBlY3QoZXhwciwgIyMgd2h5KQogI2VuZGlmCiAKLWVudW0gamJkX3N0YXRlX2JpdHMgewotCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLwotCSAgPSBCSF9Qcml2YXRlU3RhcnQsCi0JQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCi0JQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLwotCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLwotCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCi0JQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCi0JQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCi0JQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCi0JQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLwotfTsKLQotQlVGRkVSX0ZOUyhKQkQsIGpiZCkKLUJVRkZFUl9GTlMoSldyaXRlLCBqd3JpdGUpCi1CVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKLVRBU19CVUZGRVJfRk5TKEpCRERpcnR5LCBqYmRkaXJ0eSkKLUJVRkZFUl9GTlMoUmV2b2tlZCwgcmV2b2tlZCkKLVRBU19CVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCi1CVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKLVRBU19CVUZGRVJfRk5TKFJldm9rZVZhbGlkLCByZXZva2V2YWxpZCkKLUJVRkZFUl9GTlMoRnJlZWQsIGZyZWVkKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqamgyYmgoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCi17Ci0JcmV0dXJuIGpoLT5iX2JoOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBqb3VybmFsX2hlYWQgKmJoMmpoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJoLT5iX3ByaXZhdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX2xvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZF90cnlsb2NrX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJpdF9zcGluX3RyeWxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZF9pc19sb2NrZWRfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlyZXR1cm4gYml0X3NwaW5faXNfbG9ja2VkKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX3VubG9jayhCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX2xvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfdW5sb2NrX2JoX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWJpdF9zcGluX3VubG9jayhCSF9Kb3VybmFsSGVhZCwgJmJoLT5iX3N0YXRlKTsKLX0KLQogc3RydWN0IGpiZF9yZXZva2VfdGFibGVfczsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IDM4ZjMwN2IuLjIwOTJlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC0yNzUsNiArMjc1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmRfY29tbW9uLmg+CiAKICNkZWZpbmUgSl9BU1NFUlQoYXNzZXJ0KQlCVUdfT04oIShhc3NlcnQpKQogCkBAIC0zMDIsNzAgKzMwMyw2IEBACiAjZGVmaW5lIEpfRVhQRUNUX0pIKGpoLCBleHByLCB3aHkuLi4pCV9fam91cm5hbF9leHBlY3QoZXhwciwgIyMgd2h5KQogI2VuZGlmCiAKLWVudW0gamJkX3N0YXRlX2JpdHMgewotCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLwotCSAgPSBCSF9Qcml2YXRlU3RhcnQsCi0JQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCi0JQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLwotCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLwotCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCi0JQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCi0JQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCi0JQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCi0JQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLwotCUJIX0pCRFByaXZhdGVTdGFydCwJLyogRmlyc3QgYml0IGF2YWlsYWJsZSBmb3IgcHJpdmF0ZSB1c2UgYnkgRlMgKi8KLX07Ci0KLUJVRkZFUl9GTlMoSkJELCBqYmQpCi1CVUZGRVJfRk5TKEpXcml0ZSwgandyaXRlKQotQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCi1UQVNfQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCi1CVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCi1UQVNfQlVGRkVSX0ZOUyhSZXZva2VkLCByZXZva2VkKQotQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCi1UQVNfQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCi1CVUZGRVJfRk5TKEZyZWVkLCBmcmVlZCkKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpoMmJoKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQotewotCXJldHVybiBqaC0+Yl9iaDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgam91cm5hbF9oZWFkICpiaDJqaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXJldHVybiBiaC0+Yl9wcml2YXRlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX2xvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl9sb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBqYmRfdHJ5bG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCXJldHVybiBiaXRfc3Bpbl90cnlsb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpiZF91bmxvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl91bmxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl9sb2NrKEJIX0pvdXJuYWxIZWFkLCAmYmgtPmJfc3RhdGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQliaXRfc3Bpbl91bmxvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Ci19Ci0KIC8qIEZsYWdzIGluIGpiZF9pbm9kZS0+aV9mbGFncyAqLwogI2RlZmluZSBfX0pJX0NPTU1JVF9SVU5OSU5HIDAKIC8qIENvbW1pdCBvZiB0aGUgaW5vZGUgZGF0YSBpbiBwcm9ncmVzcy4gV2UgdXNlIHRoaXMgZmxhZyB0byBwcm90ZWN0IHVzIGZyb20KQEAgLTExMDYsOSArMTA0Myw5IEBACiAgKi8KIAogZXh0ZXJuIGhhbmRsZV90ICpqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzKTsKLWV4dGVybiBoYW5kbGVfdCAqamJkMl9fam91cm5hbF9zdGFydChqb3VybmFsX3QgKiwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzayk7CitleHRlcm4gaGFuZGxlX3QgKmpiZDJfX2pvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzLCBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfcmVzdGFydChoYW5kbGVfdCAqLCBpbnQgbmJsb2Nrcyk7Ci1leHRlcm4gaW50CSBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKiwgaW50IG5ibG9ja3MsIGludCBnZnBfbWFzayk7CitleHRlcm4gaW50CSBqYmQyX19qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKiwgaW50IG5ibG9ja3MsIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9leHRlbmQgKGhhbmRsZV90ICosIGludCBuYmxvY2tzKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmRfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L2piZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMwZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9qYmRfY29tbW9uLmgKQEAgLTAsMCArMSw2OCBAQAorI2lmbmRlZiBfTElOVVhfSkJEX1NUQVRFX0gKKyNkZWZpbmUgX0xJTlVYX0pCRF9TVEFURV9ICisKK2VudW0gamJkX3N0YXRlX2JpdHMgeworCUJIX0pCRAkJCS8qIEhhcyBhbiBhdHRhY2hlZCBleHQzIGpvdXJuYWxfaGVhZCAqLworCSAgPSBCSF9Qcml2YXRlU3RhcnQsCisJQkhfSldyaXRlLAkJLyogQmVpbmcgd3JpdHRlbiB0byBsb2cgKEBAQCBERUJVR0dJTkcpICovCisJQkhfRnJlZWQsCQkvKiBIYXMgYmVlbiBmcmVlZCAodHJ1bmNhdGVkKSAqLworCUJIX1Jldm9rZWQsCQkvKiBIYXMgYmVlbiByZXZva2VkIGZyb20gdGhlIGxvZyAqLworCUJIX1Jldm9rZVZhbGlkLAkJLyogUmV2b2tlZCBmbGFnIGlzIHZhbGlkICovCisJQkhfSkJERGlydHksCQkvKiBJcyBkaXJ0eSBidXQgam91cm5hbGVkICovCisJQkhfU3RhdGUsCQkvKiBQaW5zIG1vc3Qgam91cm5hbF9oZWFkIHN0YXRlICovCisJQkhfSm91cm5hbEhlYWQsCQkvKiBQaW5zIGJoLT5iX3ByaXZhdGUgYW5kIGpoLT5iX2JoICovCisJQkhfVW5zaGFkb3csCQkvKiBEdW1teSBiaXQsIGZvciBCSl9TaGFkb3cgd2FrZXVwIGZpbHRlcmluZyAqLworCUJIX0pCRFByaXZhdGVTdGFydCwJLyogRmlyc3QgYml0IGF2YWlsYWJsZSBmb3IgcHJpdmF0ZSB1c2UgYnkgRlMgKi8KK307CisKK0JVRkZFUl9GTlMoSkJELCBqYmQpCitCVUZGRVJfRk5TKEpXcml0ZSwgandyaXRlKQorQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCitUQVNfQlVGRkVSX0ZOUyhKQkREaXJ0eSwgamJkZGlydHkpCitCVUZGRVJfRk5TKFJldm9rZWQsIHJldm9rZWQpCitUQVNfQlVGRkVSX0ZOUyhSZXZva2VkLCByZXZva2VkKQorQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCitUQVNfQlVGRkVSX0ZOUyhSZXZva2VWYWxpZCwgcmV2b2tldmFsaWQpCitCVUZGRVJfRk5TKEZyZWVkLCBmcmVlZCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpoMmJoKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXJldHVybiBqaC0+Yl9iaDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgam91cm5hbF9oZWFkICpiaDJqaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaC0+Yl9wcml2YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkX2xvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl9sb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBqYmRfdHJ5bG9ja19iaF9zdGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBiaXRfc3Bpbl90cnlsb2NrKEJIX1N0YXRlLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChCSF9TdGF0ZSwgJmJoLT5iX3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZF91bmxvY2tfYmhfc3RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl91bmxvY2soQkhfU3RhdGUsICZiaC0+Yl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmRfbG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl9sb2NrKEJIX0pvdXJuYWxIZWFkLCAmYmgtPmJfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaXRfc3Bpbl91bmxvY2soQkhfSm91cm5hbEhlYWQsICZiaC0+Yl9zdGF0ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmggYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAppbmRleCA2NmYyM2RjLi4zODhiMGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaApAQCAtMTYsNyArMTYsNyBAQAogCiAjIGluY2x1ZGUgPGFzbS9qdW1wX2xhYmVsLmg+CiAjIGRlZmluZSBIQVZFX0pVTVBfTEFCRUwKLSNlbmRpZgorI2VuZGlmCS8qIENDX0hBVkVfQVNNX0dPVE8gJiYgQ09ORklHX0pVTVBfTEFCRUwgKi8KIAogZW51bSBqdW1wX2xhYmVsX3R5cGUgewogCUpVTVBfTEFCRUxfRElTQUJMRSA9IDAsCkBAIC0yOCw5ICsyOCw5IEBACiAjaWZkZWYgSEFWRV9KVU1QX0xBQkVMCiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwotI2RlZmluZSBKVU1QX0xBQkVMX0lOSVQge3sgMCB9LCBOVUxMLCBOVUxMfQorI2RlZmluZSBKVU1QX0xBQkVMX0lOSVQge0FUT01JQ19JTklUKDApLCBOVUxMLCBOVUxMfQogI2Vsc2UKLSNkZWZpbmUgSlVNUF9MQUJFTF9JTklUIHt7IDAgfSwgTlVMTH0KKyNkZWZpbmUgSlVNUF9MQUJFTF9JTklUIHtBVE9NSUNfSU5JVCgwKSwgTlVMTH0KICNlbmRpZgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgc3RhdGljX2JyYW5jaChzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKQEAgLTQxLDE4ICs0MSwyMCBAQAogZXh0ZXJuIHN0cnVjdCBqdW1wX2VudHJ5IF9fc3RhcnRfX19qdW1wX3RhYmxlW107CiBleHRlcm4gc3RydWN0IGp1bXBfZW50cnkgX19zdG9wX19fanVtcF90YWJsZVtdOwogCitleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX3VubG9jayh2b2lkKTsKIGV4dGVybiB2b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAotCQkJCSBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKTsKLWV4dGVybiB2b2lkIGFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoanVtcF9sYWJlbF90IGFkZHIpOworCQkJCSAgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpOworZXh0ZXJuIHZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorCQkJCQkgICAgIGVudW0ganVtcF9sYWJlbF90eXBlIHR5cGUpOwogZXh0ZXJuIGludCBqdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2luYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CiBleHRlcm4gdm9pZCBqdW1wX2xhYmVsX2RlYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSk7CiBleHRlcm4gYm9vbCBqdW1wX2xhYmVsX2VuYWJsZWQoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpOwogZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9hcHBseV9ub3BzKHN0cnVjdCBtb2R1bGUgKm1vZCk7CiAKLSNlbHNlCisjZWxzZSAgLyogIUhBVkVfSlVNUF9MQUJFTCAqLwogCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKQEAgLTYyLDYgKzY0LDEwIEBACiAJYXRvbWljX3QgZW5hYmxlZDsKIH07CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBqdW1wX2xhYmVsX2luaXQodm9pZCkKK3sKK30KKwogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19icmFuY2goc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCiB7CiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZrZXktPmVuYWJsZWQpKSkKQEAgLTk2LDcgKzEwMiw2IEBACiB7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYJLyogSEFWRV9KVU1QX0xBQkVMICovCiAKLSNlbmRpZgotCi0jZW5kaWYKKyNlbmRpZgkvKiBfTElOVVhfSlVNUF9MQUJFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmggYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKaW5kZXggMGRmNTEzYi4uMzg3NTcxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCisrKyBiL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaApAQCAtMTAxLDkgKzEwMSw4IEBACiAjZW5kaWYgLypDT05GSUdfS0FMTFNZTVMqLwogCiAvKiBUaGlzIG1hY3JvIGFsbG93cyB1cyB0byBrZWVwIHByaW50ayB0eXBlY2hlY2tpbmcgKi8KLXN0YXRpYyB2b2lkIF9fY2hlY2tfcHJpbnRzeW1fZm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwxLDIpKSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19jaGVja19wcmludHN5bV9mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMSwgMikKK3ZvaWQgX19jaGVja19wcmludHN5bV9mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2RiLmggYi9pbmNsdWRlL2xpbnV4L2tkYi5oCmluZGV4IDUyOWQ5YTAuLjA2NDcyNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2RiLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZGIuaApAQCAtMTE0LDEyICsxMTQsOSBAQAogfSBrZGJfcmVhc29uX3Q7CiAKIGV4dGVybiBpbnQga2RiX3RyYXBfcHJpbnRrOwotZXh0ZXJuIGludCB2a2RiX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKLQkgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAwKSkpOwotZXh0ZXJuIGludCBrZGJfcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKQotCSAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci10eXBlZGVmIGludCAoKmtkYl9wcmludGZfdCkoY29uc3QgY2hhciAqLCAuLi4pCi0JICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gX19wcmludGYoMSwgMCkgaW50IHZrZGJfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBfX3ByaW50ZigxLCAyKSBpbnQga2RiX3ByaW50Zihjb25zdCBjaGFyICosIC4uLik7Cit0eXBlZGVmIF9fcHJpbnRmKDEsIDIpIGludCAoKmtkYl9wcmludGZfdCkoY29uc3QgY2hhciAqLCAuLi4pOwogCiBleHRlcm4gdm9pZCBrZGJfaW5pdChpbnQgbGV2ZWwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCA4ZWVmY2Y3Li5lOGIxNTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTI4Nyw2ICsyODcsOCBAQAogCXJldHVybiBrc3RydG9pbnRfZnJvbV91c2VyKHMsIGNvdW50LCBiYXNlLCByZXMpOwogfQogCisvKiBPYnNvbGV0ZSwgZG8gbm90IHVzZS4gIFVzZSBrc3RydG88Zm9vPiBpbnN0ZWFkICovCisKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKixjaGFyICoqLHVuc2lnbmVkIGludCk7CiBleHRlcm4gbG9uZyBzaW1wbGVfc3RydG9sKGNvbnN0IGNoYXIgKixjaGFyICoqLHVuc2lnbmVkIGludCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHNpbXBsZV9zdHJ0b3VsbChjb25zdCBjaGFyICosY2hhciAqKix1bnNpZ25lZCBpbnQpOwpAQCAtMjk2LDIwICsyOTgsMjAgQEAKICNkZWZpbmUgc3RyaWN0X3N0cnRvdWxsCWtzdHJ0b3VsbAogI2RlZmluZSBzdHJpY3Rfc3RydG9sbAlrc3RydG9sbAogCi1leHRlcm4gaW50IHNwcmludGYoY2hhciAqIGJ1ZiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICosIHZhX2xpc3QpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOwotZXh0ZXJuIGludCBzbnByaW50ZihjaGFyICogYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiBpbnQgdnNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgMCkpKTsKLWV4dGVybiBpbnQgc2NucHJpbnRmKGNoYXIgKiBidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICogZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIGludCB2c2NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgMCkpKTsKLWV4dGVybiBjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisvKiBsaWIvcHJpbnRmIHV0aWxpdGllcyAqLworCitleHRlcm4gX19wcmludGYoMiwgMykgaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICogZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDApIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMywgMCkKK2ludCB2c25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCitpbnQgc2NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigzLCAwKQoraW50IHZzY25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gY2hhciAqa3Zhc3ByaW50ZihnZnBfdCBnZnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIAogZXh0ZXJuIGludCBzc2NhbmYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKQEAgLTM2OSwxOCArMzcxLDI0IEBACiAjZGVmaW5lIFRBSU5UX1dBUk4JCQk5CiAjZGVmaW5lIFRBSU5UX0NSQVAJCQkxMAogI2RlZmluZSBUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ECTExCisjZGVmaW5lIFRBSU5UX09PVF9NT0RVTEUJCTEyCiAKIGV4dGVybiBjb25zdCBjaGFyIGhleF9hc2NbXTsKICNkZWZpbmUgaGV4X2FzY19sbyh4KQloZXhfYXNjWygoeCkgJiAweDBmKV0KICNkZWZpbmUgaGV4X2FzY19oaSh4KQloZXhfYXNjWygoeCkgJiAweGYwKSA+PiA0XQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnBhY2tfaGV4X2J5dGUoY2hhciAqYnVmLCB1OCBieXRlKQorc3RhdGljIGlubGluZSBjaGFyICpoZXhfYnl0ZV9wYWNrKGNoYXIgKmJ1ZiwgdTggYnl0ZSkKIHsKIAkqYnVmKysgPSBoZXhfYXNjX2hpKGJ5dGUpOwogCSpidWYrKyA9IGhleF9hc2NfbG8oYnl0ZSk7CiAJcmV0dXJuIGJ1ZjsKIH0KIAorc3RhdGljIGlubGluZSBjaGFyICogX19kZXByZWNhdGVkIHBhY2tfaGV4X2J5dGUoY2hhciAqYnVmLCB1OCBieXRlKQoreworCXJldHVybiBoZXhfYnl0ZV9wYWNrKGJ1ZiwgYnl0ZSk7Cit9CisKIGV4dGVybiBpbnQgaGV4X3RvX2JpbihjaGFyIGNoKTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpOwogCkBAIC00MjcsOCArNDM1LDggQEAKIGV4dGVybiB2b2lkIHRyYWNpbmdfc3RvcCh2b2lkKTsKIGV4dGVybiB2b2lkIGZ0cmFjZV9vZmZfcGVybWFuZW50KHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCi1fX19fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikKK3ZvaWQgX19fX3RyYWNlX3ByaW50a19jaGVja19mb3JtYXQoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiB9CiAjZGVmaW5lIF9fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChmbXQsIGFyZ3MuLi4pCQkJXApAQCAtNDY3LDEzICs0NzUsMTEgQEAKIAkJX190cmFjZV9wcmludGsoX1RISVNfSVBfLCBmbXQsICMjYXJncyk7CQlcCiB9IHdoaWxlICgwKQogCi1leHRlcm4gaW50Ci1fX3RyYWNlX2JwcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX190cmFjZV9icHJpbnRrKHVuc2lnbmVkIGxvbmcgaXAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAotZXh0ZXJuIGludAotX190cmFjZV9wcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX190cmFjZV9wcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBleHRlcm4gdm9pZCB0cmFjZV9kdW1wX3N0YWNrKHZvaWQpOwogCkBAIC01MDIsOCArNTA4LDggQEAKIAogZXh0ZXJuIHZvaWQgZnRyYWNlX2R1bXAoZW51bSBmdHJhY2VfZHVtcF9tb2RlIG9vcHNfZHVtcF9tb2RlKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludAotdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCitpbnQgdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNpbmdfc3RhcnQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2luZ19zdG9wKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXhlYy5oIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCmluZGV4IGMyNDc4YTMuLjJmYTA5MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKQEAgLTMzLDYgKzMzLDE0IEBACiAjZXJyb3IgS0VYRUNfQVJDSCBub3QgZGVmaW5lZAogI2VuZGlmCiAKKyNpZm5kZWYgS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQKKyNkZWZpbmUgS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQKKyNlbmRpZgorCisjaWZuZGVmIEtFWEVDX0NSQVNIX01FTV9BTElHTgorI2RlZmluZSBLRVhFQ19DUkFTSF9NRU1fQUxJR04gUEFHRV9TSVpFCisjZW5kaWYKKwogI2RlZmluZSBLRVhFQ19OT1RFX0hFQURfQllURVMgQUxJR04oc2l6ZW9mKHN0cnVjdCBlbGZfbm90ZSksIDQpCiAjZGVmaW5lIEtFWEVDX0NPUkVfTk9URV9OQU1FICJDT1JFIgogI2RlZmluZSBLRVhFQ19DT1JFX05PVEVfTkFNRV9CWVRFUyBBTElHTihzaXplb2YoS0VYRUNfQ09SRV9OT1RFX05BTUUpLCA0KQpAQCAtMTI5LDkgKzEzNywxMSBAQAogaW50IGtleGVjX3Nob3VsZF9jcmFzaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiB2b2lkIGNyYXNoX3NhdmVfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KTsKIHZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpOwordm9pZCBjcmFzaF9tYXBfcmVzZXJ2ZWRfcGFnZXModm9pZCk7Cit2b2lkIGNyYXNoX3VubWFwX3Jlc2VydmVkX3BhZ2VzKHZvaWQpOwogdm9pZCBhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbyh2b2lkKTsKLXZvaWQgdm1jb3JlaW5mb19hcHBlbmRfc3RyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK19fcHJpbnRmKDEsIDIpCit2b2lkIHZtY29yZWluZm9fYXBwZW5kX3N0cihjb25zdCBjaGFyICpmbXQsIC4uLik7CiB1bnNpZ25lZCBsb25nIHBhZGRyX3ZtY29yZWluZm9fbm90ZSh2b2lkKTsKIAogI2RlZmluZSBWTUNPUkVJTkZPX09TUkVMRUFTRSh2YWx1ZSkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbW9kLmggYi9pbmNsdWRlL2xpbnV4L2ttb2QuaAppbmRleCAwZGEzOGNmLi5iMTZmNjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ttb2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ttb2QuaApAQCAtMzIsOCArMzIsOCBAQAogZXh0ZXJuIGNoYXIgbW9kcHJvYmVfcGF0aFtdOyAvKiBmb3Igc3lzY3RsICovCiAvKiBtb2Rwcm9iZSBleGl0IHN0YXR1cyBvbiBzdWNjZXNzLCAtdmUgb24gZXJyb3IuICBSZXR1cm4gdmFsdWUKICAqIHVzdWFsbHkgdXNlbGVzcyB0aG91Z2guICovCi1leHRlcm4gaW50IF9fcmVxdWVzdF9tb2R1bGUoYm9vbCB3YWl0LCBjb25zdCBjaGFyICpuYW1lLCAuLi4pIFwKLQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgX19yZXF1ZXN0X21vZHVsZShib29sIHdhaXQsIGNvbnN0IGNoYXIgKm5hbWUsIC4uLik7CiAjZGVmaW5lIHJlcXVlc3RfbW9kdWxlKG1vZC4uLikgX19yZXF1ZXN0X21vZHVsZSh0cnVlLCBtb2QpCiAjZGVmaW5lIHJlcXVlc3RfbW9kdWxlX25vd2FpdChtb2QuLi4pIF9fcmVxdWVzdF9tb2R1bGUoZmFsc2UsIG1vZCkKICNkZWZpbmUgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeCwgbW9kLi4uKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaCBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCmluZGV4IDY2ODcyOWMuLmFkODFlMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva29iamVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCkBAIC03Miw4ICs3Miw4IEBACiAJdW5zaWduZWQgaW50IHVldmVudF9zdXBwcmVzczoxOwogfTsKIAotZXh0ZXJuIGludCBrb2JqZWN0X3NldF9uYW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjb25zdCBjaGFyICpuYW1lLCAuLi4pCi0JCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IGtvYmplY3Rfc2V0X25hbWUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5hbWUsIC4uLik7CiBleHRlcm4gaW50IGtvYmplY3Rfc2V0X25hbWVfdmFyZ3Moc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKmZtdCwKIAkJCQkgIHZhX2xpc3QgdmFyZ3MpOwogCkBAIC04MywxNSArODMsMTMgQEAKIH0KIAogZXh0ZXJuIHZvaWQga29iamVjdF9pbml0KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial90eXBlICprdHlwZSk7Ci1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBrb2JqZWN0X2FkZChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgc3RydWN0IGtvYmplY3QgKnBhcmVudCwKLQkJCQkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKLWV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfaW5pdF9hbmRfYWRkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgICAgIHN0cnVjdCBrb2JqX3R5cGUgKmt0eXBlLAotCQkJCQkgICAgIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsCi0JCQkJCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKK2V4dGVybiBfX3ByaW50ZigzLCA0KSBfX211c3RfY2hlY2sKK2ludCBrb2JqZWN0X2FkZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKnBhcmVudCwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDQsIDUpIF9fbXVzdF9jaGVjaworaW50IGtvYmplY3RfaW5pdF9hbmRfYWRkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJIHN0cnVjdCBrb2JqX3R5cGUgKmt0eXBlLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LAorCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogZXh0ZXJuIHZvaWQga29iamVjdF9kZWwoc3RydWN0IGtvYmplY3QgKmtvYmopOwogCkBAIC0yMTIsOCArMjEwLDggQEAKIGludCBrb2JqZWN0X3VldmVudF9lbnYoc3RydWN0IGtvYmplY3QgKmtvYmosIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uLAogCQkJY2hhciAqZW52cFtdKTsKIAotaW50IGFkZF91ZXZlbnRfdmFyKHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitfX3ByaW50ZigyLCAzKQoraW50IGFkZF91ZXZlbnRfdmFyKHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogCiBpbnQga29iamVjdF9hY3Rpb25fdHlwZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCWVudW0ga29iamVjdF9hY3Rpb24gKnR5cGUpOwpAQCAtMjI2LDcgKzIyNCw3IEBACiAJCQkJICAgICAgY2hhciAqZW52cFtdKQogeyByZXR1cm4gMDsgfQogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMiwgMykKIGludCBhZGRfdWV2ZW50X3ZhcihzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogeyByZXR1cm4gMDsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aHJlYWQuaCBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCmluZGV4IDFlOTIzZTUuLjVjYWMxOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RocmVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCkBAIC00LDExICs0LDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAorX19wcmludGYoNCwgNSkKIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF9jcmVhdGVfb25fbm9kZShpbnQgKCp0aHJlYWRmbikodm9pZCAqZGF0YSksCiAJCQkJCSAgIHZvaWQgKmRhdGEsCiAJCQkJCSAgIGludCBub2RlLAotCQkJCQkgICBjb25zdCBjaGFyIG5hbWVmbXRbXSwgLi4uKQotCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDQsIDUpKSk7CisJCQkJCSAgIGNvbnN0IGNoYXIgbmFtZWZtdFtdLCAuLi4pOwogCiAjZGVmaW5lIGt0aHJlYWRfY3JlYXRlKHRocmVhZGZuLCBkYXRhLCBuYW1lZm10LCBhcmcuLi4pIFwKIAlrdGhyZWFkX2NyZWF0ZV9vbl9ub2RlKHRocmVhZGZuLCBkYXRhLCAtMSwgbmFtZWZtdCwgIyNhcmcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS9saW51eC9rdm0uaAppbmRleCBhYWNlNmI4Li5mNDdmY2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bS5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtLmgKQEAgLTM3MSw2ICszNzEsNyBAQAogI2RlZmluZSBLVk1fUzM5MF9JTlRfVklSVElPCQkweGZmZmYyNjAzdQogI2RlZmluZSBLVk1fUzM5MF9JTlRfU0VSVklDRQkJMHhmZmZmMjQwMXUKICNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWQkJMHhmZmZmMTIwMXUKKyNkZWZpbmUgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEwJMHhmZmZmMTIwMnUKIAogc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdCB7CiAJX191MzIgdHlwZTsKQEAgLTQ2Myw3ICs0NjQsNyBAQAogI2RlZmluZSBLVk1fQ0FQX1ZBUElDIDYKICNkZWZpbmUgS1ZNX0NBUF9FWFRfQ1BVSUQgNwogI2RlZmluZSBLVk1fQ0FQX0NMT0NLU09VUkNFIDgKLSNkZWZpbmUgS1ZNX0NBUF9OUl9WQ1BVUyA5ICAgICAgIC8qIHJldHVybnMgbWF4IHZjcHVzIHBlciB2bSAqLworI2RlZmluZSBLVk1fQ0FQX05SX1ZDUFVTIDkgICAgICAgLyogcmV0dXJucyByZWNvbW1lbmRlZCBtYXggdmNwdXMgcGVyIHZtICovCiAjZGVmaW5lIEtWTV9DQVBfTlJfTUVNU0xPVFMgMTAgICAvKiByZXR1cm5zIG1heCBtZW1vcnkgc2xvdHMgcGVyIHZtICovCiAjZGVmaW5lIEtWTV9DQVBfUElUIDExCiAjZGVmaW5lIEtWTV9DQVBfTk9QX0lPX0RFTEFZIDEyCkBAIC01NTMsNiArNTU0LDkgQEAKICNkZWZpbmUgS1ZNX0NBUF9TUEFQUl9UQ0UgNjMKICNkZWZpbmUgS1ZNX0NBUF9QUENfU01UIDY0CiAjZGVmaW5lIEtWTV9DQVBfUFBDX1JNQQk2NQorI2RlZmluZSBLVk1fQ0FQX01BWF9WQ1BVUyA2NiAgICAgICAvKiByZXR1cm5zIG1heCB2Y3B1cyBwZXIgdm0gKi8KKyNkZWZpbmUgS1ZNX0NBUF9QUENfSElPUiA2NworI2RlZmluZSBLVk1fQ0FQX1BQQ19QQVBSIDY4CiAjZGVmaW5lIEtWTV9DQVBfUzM5MF9HTUFQIDcxCiAKICNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggZWFiYjIxYS4uZDUyNjIzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21zaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgpAQCAtNDgsNiArNDksNyBAQAogI2RlZmluZSBLVk1fUkVRX0VWRU5UICAgICAgICAgICAgIDExCiAjZGVmaW5lIEtWTV9SRVFfQVBGX0hBTFQgICAgICAgICAgMTIKICNkZWZpbmUgS1ZNX1JFUV9TVEVBTF9VUERBVEUgICAgICAxMworI2RlZmluZSBLVk1fUkVRX05NSSAgICAgICAgICAgICAgIDE0CiAKICNkZWZpbmUgS1ZNX1VTRVJTUEFDRV9JUlFfU09VUkNFX0lECTAKIApAQCAtNTUsMTYgKzU3LDE2IEBACiBzdHJ1Y3Qga3ZtX3ZjcHU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmt2bV92Y3B1X2NhY2hlOwogCi0vKgotICogSXQgd291bGQgYmUgbmljZSB0byB1c2Ugc29tZXRoaW5nIHNtYXJ0ZXIgdGhhbiBhIGxpbmVhciBzZWFyY2gsIFRCRC4uLgotICogVGhhbmtmdWxseSB3ZSBkb250IGV4cGVjdCBtYW55IGRldmljZXMgdG8gcmVnaXN0ZXIgKGZhbW91cyBsYXN0IHdvcmRzIDopLAotICogc28gdW50aWwgdGhlbiBpdCB3aWxsIHN1ZmZpY2UuICBBdCBsZWFzdCBpdHMgYWJzdHJhY3RlZCBzbyB3ZSBjYW4gY2hhbmdlCi0gKiBpbiBvbmUgcGxhY2UuCi0gKi8KK3N0cnVjdCBrdm1faW9fcmFuZ2UgeworCWdwYV90IGFkZHI7CisJaW50IGxlbjsKKwlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2OworfTsKKwogc3RydWN0IGt2bV9pb19idXMgewogCWludCAgICAgICAgICAgICAgICAgICBkZXZfY291bnQ7Ci0jZGVmaW5lIE5SX0lPQlVTX0RFVlMgMjAwCi0Jc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldnNbTlJfSU9CVVNfREVWU107CisjZGVmaW5lIE5SX0lPQlVTX0RFVlMgMzAwCisJc3RydWN0IGt2bV9pb19yYW5nZSByYW5nZVtOUl9JT0JVU19ERVZTXTsKIH07CiAKIGVudW0ga3ZtX2J1cyB7CkBAIC03Nyw4ICs3OSw4IEBACiAJCSAgICAgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKTsKIGludCBrdm1faW9fYnVzX3JlYWQoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwgZ3BhX3QgYWRkciwgaW50IGxlbiwKIAkJICAgIHZvaWQgKnZhbCk7Ci1pbnQga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKLQkJCSAgICBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2KTsKK2ludCBrdm1faW9fYnVzX3JlZ2lzdGVyX2RldihzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAorCQkJICAgIGludCBsZW4sIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogaW50IGt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKIAkJCSAgICAgIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogCkBAIC0yNTYsOCArMjU4LDkgQEAKIAlzdHJ1Y3Qga3ZtX2FyY2ggYXJjaDsKIAlhdG9taWNfdCB1c2Vyc19jb3VudDsKICNpZmRlZiBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQKLQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqY29hbGVzY2VkX21taW9fZGV2OwogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqY29hbGVzY2VkX21taW9fcmluZzsKKwlzcGlubG9ja190IHJpbmdfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvYWxlc2NlZF96b25lczsKICNlbmRpZgogCiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwpAQCAtMjgxLDExICsyODQsOCBAQAogCiAvKiBUaGUgZ3Vlc3QgZGlkIHNvbWV0aGluZyB3ZSBkb24ndCBzdXBwb3J0LiAqLwogI2RlZmluZSBwcl91bmltcGwodmNwdSwgZm10LCAuLi4pCQkJCQlcCi0gZG8gewkJCQkJCQkJCVwKLQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQkJCQkJCVwKLQkJcHJpbnRrKEtFUk5fRVJSICJrdm06ICVpOiBjcHUlaSAiIGZtdCwJCQlcCi0JCSAgICAgICBjdXJyZW50LT50Z2lkLCAodmNwdSktPnZjcHVfaWQgLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSB9IHdoaWxlICgwKQorCXByX2Vycl9yYXRlbGltaXRlZCgia3ZtOiAlaTogY3B1JWkgIiBmbXQsCQkJXAorCQkJICAgY3VycmVudC0+dGdpZCwgKHZjcHUpLT52Y3B1X2lkICwgIyMgX19WQV9BUkdTX18pCiAKICNkZWZpbmUga3ZtX3ByaW50Zihrdm0sIGZtdCAuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZtdCkKICNkZWZpbmUgdmNwdV9wcmludGYodmNwdSwgZm10Li4uKSBrdm1fcHJpbnRmKHZjcHUtPmt2bSwgZm10KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggZWZkNmY5OC4uY2FmYzA5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0xMDUyLDYgKzEwNTIsOCBAQAogZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogZXh0ZXJuIGludCBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJCSAgICAgICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pOworZXh0ZXJuIGludCBfX2F0YV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICBpbnQgcXVldWVfZGVwdGgsIGludCByZWFzb24pOwogZXh0ZXJuIHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2X3BhaXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogZXh0ZXJuIGludCBhdGFfZG9fc2V0X21vZGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2Rldik7CiBleHRlcm4gdm9pZCBhdGFfc2NzaV9wb3J0X2Vycm9yX2hhbmRsZXIoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC0xMjU0LDEzICsxMjU2LDEzIEBACiAvKgogICogcHJpbnRrIGhlbHBlcnMKICAqLwotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXRhX3BvcnRfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IGNoYXIgKmxldmVsLAogCQkgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXRhX2xpbmtfcHJpbnRrKGNvbnN0IHN0cnVjdCBhdGFfbGluayAqbGluaywgY29uc3QgY2hhciAqbGV2ZWwsCiAJCSAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1fX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIGludCBhdGFfZGV2X3ByaW50ayhjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpsZXZlbCwKIAkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCkBAIC0xMzAyLDEwICsxMzA0LDEwIEBACiAvKgogICogYXRhX2VoX2luZm8gaGVscGVycwogICovCi1leHRlcm4gdm9pZCBfX2F0YV9laGlfcHVzaF9kZXNjKHN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gdm9pZCBhdGFfZWhpX3B1c2hfZGVzYyhzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIF9fYXRhX2VoaV9wdXNoX2Rlc2Moc3RydWN0IGF0YV9laF9pbmZvICplaGksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQordm9pZCBhdGFfZWhpX3B1c2hfZGVzYyhzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIHZvaWQgYXRhX2VoaV9jbGVhcl9kZXNjKHN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGF0YV9laGlfaG90cGx1Z2dlZChzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSkKQEAgLTEzMTksOCArMTMyMSw4IEBACiAvKgogICogcG9ydCBkZXNjcmlwdGlvbiBoZWxwZXJzCiAgKi8KLWV4dGVybiB2b2lkIGF0YV9wb3J0X2Rlc2Moc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCit2b2lkIGF0YV9wb3J0X2Rlc2Moc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB2b2lkIGF0YV9wb3J0X3BiYXJfZGVzYyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgYmFyLCBzc2l6ZV90IG9mZnNldCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlzM2x2MDJkLmggYi9pbmNsdWRlL2xpbnV4L2xpczNsdjAyZC5oCmluZGV4IGQ0MjkyYzguLmYxNjY0YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzM2x2MDJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9saXMzbHYwMmQuaApAQCAtMTEzLDcgKzExMyw2IEBACiAJczggYXhpc194OwogCXM4IGF4aXNfeTsKIAlzOCBheGlzX3o7Ci0jZGVmaW5lIExJUzNfVVNFX1JFR1VMQVRPUl9DVFJMIDB4MDEKICNkZWZpbmUgTElTM19VU0VfQkxPQ0tfUkVBRAkweDAyCiAJdTE2IGRyaXZlcl9mZWF0dXJlczsKIAlpbnQgZGVmYXVsdF9yYXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sbGlzdC5oIGIvaW5jbHVkZS9saW51eC9sbGlzdC5oCmluZGV4IDcyODc3MzQuLjgwMWI0NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGxpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xsaXN0LmgKQEAgLTE0OCw3ICsxNDgsNyBAQAogICogQG5ldzoJbmV3IGVudHJ5IHRvIGJlIGFkZGVkCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbG9jay1sZXNzIGxpc3QKICAqCi0gKiBSZXR1cm4gd2hldGhlciBsaXN0IGlzIGVtcHR5IGJlZm9yZSBhZGRpbmcuCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxpc3Qgd2FzIGVtcHR5IHByaW9yIHRvIGFkZGluZyB0aGlzIGVudHJ5LgogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9ub2RlICpuZXcsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb29wLmggYi9pbmNsdWRlL2xpbnV4L2xvb3AuaAppbmRleCA2ODNkNjk4Li4xMWE0MWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvb3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvb3AuaApAQCAtNzMsOCArNzMsOCBAQAogICovCiBlbnVtIHsKIAlMT19GTEFHU19SRUFEX09OTFkJPSAxLAotCUxPX0ZMQUdTX1VTRV9BT1BTCT0gMiwKIAlMT19GTEFHU19BVVRPQ0xFQVIJPSA0LAorCUxPX0ZMQUdTX1BBUlRTQ0FOCT0gOCwKIH07CiAKICNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4JLyogZm9yIF9fa2VybmVsX29sZF9kZXZfdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCmluZGV4IDFlNWRmMmFmLi4yZDRiZWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKKysrIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCkBAIC0zMCwxMSArMzAsMTEgQEAKICNkZWZpbmUgQU5PTl9JTk9ERV9GU19NQUdJQwkweDA5MDQxOTM0CiAjZGVmaW5lIFBTVE9SRUZTX01BR0lDCQkweDYxNjU2NzZDCiAKLSNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwotI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLwotI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMJMHgyNDY4CQkvKiBtaW5peCBWMiBmcyAqLwotI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KLSNkZWZpbmUgTUlOSVgzX1NVUEVSX01BR0lDCTB4NGQ1YQkJLyogbWluaXggVjMgZnMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBtaW5peCB2MSBmcywgMTQgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCB2MSBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMJMHgyNDY4CQkvKiBtaW5peCB2MiBmcywgMTQgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkJLyogbWluaXggdjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgzX1NVUEVSX01BR0lDCTB4NGQ1YQkJLyogbWluaXggdjMgZnMsIDYwIGNoYXIgbmFtZXMgKi8KIAogI2RlZmluZSBNU0RPU19TVVBFUl9NQUdJQwkweDRkNDQJCS8qIE1EICovCiAjZGVmaW5lIE5DUF9TVVBFUl9NQUdJQwkJMHg1NjRjCQkvKiBHdWVzcywgd2hhdCAweDU2NGMgaXMgOi0pICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21kaW8tYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9tZGlvLWJpdGJhbmcuaAppbmRleCA4ZWE5YTQyLi4wZmUwMGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21kaW8tYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWRpby1iaXRiYW5nLmgKQEAgLTIsNyArMiw4IEBACiAjZGVmaW5lIF9fTElOVVhfTURJT19CSVRCQU5HX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdHJ1Y3QgbW9kdWxlOwogCiBzdHJ1Y3QgbWRpb2JiX2N0cmw7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaCBiL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAppbmRleCA3NTI1ZTM4Li5lNmI4NDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oCkBAIC04MCw2ICs4MCw3IEBACiAJCQkJCSAgIHBoeXNfYWRkcl90IGFsaWduLAogCQkJCQkgICBwaHlzX2FkZHJfdCBtYXhfYWRkcik7CiBleHRlcm4gcGh5c19hZGRyX3QgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSh2b2lkKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19zdGFydF9vZl9EUkFNKHZvaWQpOwogZXh0ZXJuIHBoeXNfYWRkcl90IG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQocGh5c19hZGRyX3QgbWVtb3J5X2xpbWl0KTsKIGV4dGVybiBpbnQgbWVtYmxvY2tfaXNfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmggYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAppbmRleCAzNDNiZDc2Li5iODcwNjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaApAQCAtMzUsNyArMzUsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZHN0LAogCQkJCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsCi0JCQkJCWludCBtb2RlLCBzdHJ1Y3Qgem9uZSAqeiwKKwkJCQkJaXNvbGF0ZV9tb2RlX3QgbW9kZSwKKwkJCQkJc3RydWN0IHpvbmUgKnosCiAJCQkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKIAkJCQkJaW50IGFjdGl2ZSwgaW50IGZpbGUpOwogCkBAIC03Nyw4ICs3OCw4IEBACiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9vdXRfb2ZfbWVtb3J5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGdmcF90IGdmcF9tYXNrKTsKLWludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrKTsKK2ludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogCiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpAQCAtODcsMjYgKzg4LDI4IEBACiBzdGF0aWMgaW5saW5lCiBpbnQgbW1fbWF0Y2hfY2dyb3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqY2dyb3VwKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UoKG1tKS0+b3duZXIpKTsKKwltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZSgobW0pLT5vd25lcikpOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBjZ3JvdXAgPT0gbWVtOworCXJldHVybiBjZ3JvdXAgPT0gbWVtY2c7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqbWVtX2Nncm91cF9jc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CitleHRlcm4gc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKm1lbV9jZ3JvdXBfY3NzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIGV4dGVybiBpbnQKIG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyLCBnZnBfdCBnZnBfbWFzayk7Ci1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLCBib29sIG1pZ3JhdGlvbl9vayk7CiAKIC8qCiAgKiBGb3IgbWVtb3J5IHJlY2xhaW0uCiAgKi8KLWludCBtZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7Ci1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworaW50IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgICBzdHJ1Y3Qgem9uZSAqem9uZSk7CitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJICAgIHN0cnVjdCB6b25lICp6b25lKTsKIGludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJaW50IG5pZCwgaW50IHppZCwgdW5zaWduZWQgaW50IGxydW1hc2spOwpAQCAtMTQ3LDcgKzE1MCw3IEBACiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc29mdF9saW1pdF9yZWNsYWltKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCiAJCQkJCQlnZnBfdCBnZnBfbWFzaywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgKnRvdGFsX3NjYW5uZWQpOwotdTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwordTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIHZvaWQgbWVtX2Nncm91cF9jb3VudF92bV9ldmVudChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZW51bSB2bV9ldmVudF9pdGVtIGlkeCk7CiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCkBAIC0yNDMsMTggKzI0NiwyMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtbV9tYXRjaF9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW5saW5lIGludCBtbV9tYXRjaF9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKm1lbV9jZ3JvdXBfY3NzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlCisJCSptZW1fY2dyb3VwX2NzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yNjYsMjIgKzI3MSwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLCBib29sIG1pZ3JhdGlvbl9vaykKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfbm90ZV9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJCWludCBwcmlvcml0eSkKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJCWludCBwcmlvcml0eSkKIHsKIH0KQEAgLTI5MiwxMyArMjk3LDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1tZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK21lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLW1lbV9jZ3JvdXBfaW5hY3RpdmVfZmlsZV9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQorbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewogCXJldHVybiAxOwogfQpAQCAtMzQ3LDcgKzM1Miw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUKLXU2NCBtZW1fY2dyb3VwX2dldF9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQordTY0IG1lbV9jZ3JvdXBfZ2V0X2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FiNTUwMC9hYjU1MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzIwMDUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiAyMDExCisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqLworI2lmbmRlZiBNRkRfQUI1NTAwX0gKKyNkZWZpbmUgTUZEX0FCNTUwMF9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworZW51bSBhYjU1MDBfZGV2aWQgeworCUFCNTUwMF9ERVZJRF9BREMsCisJQUI1NTAwX0RFVklEX0xFRFMsCisJQUI1NTAwX0RFVklEX1BPV0VSLAorCUFCNTUwMF9ERVZJRF9SRUdVTEFUT1JTLAorCUFCNTUwMF9ERVZJRF9TSU0sCisJQUI1NTAwX0RFVklEX1JUQywKKwlBQjU1MDBfREVWSURfQ0hBUkdFUiwKKwlBQjU1MDBfREVWSURfRlVFTEdBVUdFLAorCUFCNTUwMF9ERVZJRF9WSUJSQVRPUiwKKwlBQjU1MDBfREVWSURfQ09ERUMsCisJQUI1NTAwX0RFVklEX1VTQiwKKwlBQjU1MDBfREVWSURfT1RQLAorCUFCNTUwMF9ERVZJRF9WSURFTywKKwlBQjU1MDBfREVWSURfREJJRUNJLAorCUFCNTUwMF9ERVZJRF9PTlNXQSwKKwlBQjU1MDBfTlVNX0RFVklDRVMsCit9OworCitlbnVtIGFiNTUwMF9iYW5rcyB7CisJQUI1NTAwX0JBTktfVklUX0lPX0kyQ19DTEtfVFNUX09UUCA9IDAsCisJQUI1NTAwX0JBTktfVkRERElHX0lPX0kyQ19DTEtfVFNUID0gMSwKKwlBQjU1MDBfQkFOS19WREVOQyA9IDIsCisJQUI1NTAwX0JBTktfU0lNX1VTQlNJTSAgPSAzLAorCUFCNTUwMF9CQU5LX0xFRCA9IDQsCisJQUI1NTAwX0JBTktfQURDICA9IDUsCisJQUI1NTAwX0JBTktfUlRDICA9IDYsCisJQUI1NTAwX0JBTktfU1RBUlRVUCAgPSA3LAorCUFCNTUwMF9CQU5LX0RCSV9FQ0kgID0gOCwKKwlBQjU1MDBfQkFOS19DSEcgID0gOSwKKwlBQjU1MDBfQkFOS19GR19CQVRUQ09NX0FDQyA9IDEwLAorCUFCNTUwMF9CQU5LX1VTQiA9IDExLAorCUFCNTUwMF9CQU5LX0lUID0gMTIsCisJQUI1NTAwX0JBTktfVklCUkEgPSAxMywKKwlBQjU1MDBfQkFOS19BVURJT19IRUFEU0VUVVNCID0gMTQsCisJQUI1NTAwX05VTV9CQU5LUyA9IDE1LAorfTsKKworZW51bSBhYjU1MDBfYmFua3NfYWRkciB7CisJQUI1NTAwX0FERFJfVklUX0lPX0kyQ19DTEtfVFNUX09UUCA9IDB4NEEsCisJQUI1NTAwX0FERFJfVkRERElHX0lPX0kyQ19DTEtfVFNUID0gMHg0QiwKKwlBQjU1MDBfQUREUl9WREVOQyA9IDB4MDYsCisJQUI1NTAwX0FERFJfU0lNX1VTQlNJTSAgPSAweDA0LAorCUFCNTUwMF9BRERSX0xFRCA9IDB4MTAsCisJQUI1NTAwX0FERFJfQURDICA9IDB4MEEsCisJQUI1NTAwX0FERFJfUlRDICA9IDB4MEYsCisJQUI1NTAwX0FERFJfU1RBUlRVUCAgPSAweDAzLAorCUFCNTUwMF9BRERSX0RCSV9FQ0kgID0gMHgwNywKKwlBQjU1MDBfQUREUl9DSEcgID0gMHgwQiwKKwlBQjU1MDBfQUREUl9GR19CQVRUQ09NX0FDQyA9IDB4MEMsCisJQUI1NTAwX0FERFJfVVNCID0gMHgwNSwKKwlBQjU1MDBfQUREUl9JVCA9IDB4MEUsCisJQUI1NTAwX0FERFJfVklCUkEgPSAweDAyLAorCUFCNTUwMF9BRERSX0FVRElPX0hFQURTRVRVU0IgPSAweDBELAorfTsKKworLyoKKyAqIEludGVycnVwdCByZWdpc3RlciBvZmZzZXRzCisgKiBCYW5rIDogMHgwRQorICovCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UwX1JFRwkJMHgyMAorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMV9SRUcJCTB4MjEKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTJfUkVHCQkweDIyCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UzX1JFRwkJMHgyMworI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFNF9SRUcJCTB4MjQKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTVfUkVHCQkweDI1CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0U2X1JFRwkJMHgyNgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFN19SRUcJCTB4MjcKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRThfUkVHCQkweDI4CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0U5X1JFRwkJMHgyOQorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTBfUkVHCQkweDJBCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxMV9SRUcJCTB4MkIKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTEyX1JFRwkJMHgyQworI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTNfUkVHCQkweDJECisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxNF9SRUcJCTB4MkUKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTE1X1JFRwkJMHgyRgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTZfUkVHCQkweDMwCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UxN19SRUcJCTB4MzEKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTE4X1JFRwkJMHgzMgorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMTlfUkVHCQkweDMzCisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UyMF9SRUcJCTB4MzQKKyNkZWZpbmUgQUI1NTAwX0lUX1NPVVJDRTIxX1JFRwkJMHgzNQorI2RlZmluZSBBQjU1MDBfSVRfU09VUkNFMjJfUkVHCQkweDM2CisjZGVmaW5lIEFCNTUwMF9JVF9TT1VSQ0UyM19SRUcJCTB4MzcKKworI2RlZmluZSBBQjU1MDBfTlVNX0lSUV9SRUdTCQkyMworCisvKioKKyAqIHN0cnVjdCBhYjU1MDAKKyAqIEBhY2Nlc3NfbXV0ZXg6IGxvY2sgb3V0IGNvbmN1cnJlbnQgYWNjZXNzZXMgdG8gdGhlIEFCIHJlZ2lzdGVycworICogQGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0IGZvciB0aGlzIGNoaXAgZHJpdmVyCisgKiBAYWI1NTAwX2lycTogdGhlIGFuYWxvZyBiYXNlYmFuZCBpcnEKKyAqIEBpcnFfYmFzZTogdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaXJxIGJhc2UgZm9yIHN1YmRldmljZXMKKyAqIEBjaGlwX25hbWU6IG5hbWUgb2YgdGhpcyBjaGlwIHZhcmlhbnQKKyAqIEBjaGlwX2lkOiA4IGJpdCBjaGlwIElEIGZvciB0aGlzIGNoaXAgdmFyaWFudAorICogQGlycV9sb2NrOiBhIGxvY2sgdG8gcHJvdGVjdCB0aGUgbWFzaworICogQGFiYl9ldmVudHM6IGEgbG9jYWwgYml0IG1hc2sgb2YgdGhlIHByY211IHdha2V1cCBldmVudHMKKyAqIEBldmVudF9tYXNrOiBhIGxvY2FsIGNvcHkgb2YgdGhlIG1hc2sgZXZlbnQgcmVnaXN0ZXJzCisgKiBAbGFzdF9ldmVudF9tYXNrOiBhIGNvcHkgb2YgdGhlIGxhc3QgZXZlbnRfbWFzayB3cml0dGVuIHRvIGhhcmR3YXJlCisgKiBAc3RhcnR1cF9ldmVudHM6IGEgY29weSBvZiB0aGUgZmlyc3QgcmVhZGluZyBvZiB0aGUgZXZlbnQgcmVnaXN0ZXJzCisgKiBAc3RhcnR1cF9ldmVudHNfcmVhZDogd2hldGhlciB0aGUgZmlyc3QgZXZlbnRzIGhhdmUgYmVlbiByZWFkCisgKi8KK3N0cnVjdCBhYjU1MDAgeworCXN0cnVjdCBtdXRleCBhY2Nlc3NfbXV0ZXg7CisJc3RydWN0IGRldmljZSAqZGV2OworCXVuc2lnbmVkIGludCBhYjU1MDBfaXJxOworCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwljaGFyIGNoaXBfbmFtZVszMl07CisJdTggY2hpcF9pZDsKKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJdTMyIGFiYl9ldmVudHM7CisJdTggbWFza1tBQjU1MDBfTlVNX0lSUV9SRUdTXTsKKwl1OCBvbGRtYXNrW0FCNTUwMF9OVU1fSVJRX1JFR1NdOworCXU4IHN0YXJ0dXBfZXZlbnRzW0FCNTUwMF9OVU1fSVJRX1JFR1NdOworCWJvb2wgc3RhcnR1cF9ldmVudHNfcmVhZDsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwl1bnNpZ25lZCBpbnQgZGVidWdfYmFuazsKKwl1bnNpZ25lZCBpbnQgZGVidWdfYWRkcmVzczsKKyNlbmRpZgorfTsKKworc3RydWN0IGFiNTUwMF9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3Qge3Vuc2lnbmVkIGludCBiYXNlOyB1bnNpZ25lZCBpbnQgY291bnQ7IH0gaXJxOworCXZvaWQgKmRldl9kYXRhW0FCNTUwMF9OVU1fREVWSUNFU107CisJc3RydWN0IGFieDUwMF9pbml0X3NldHRpbmdzICppbml0X3NldHRpbmdzOworCXVuc2lnbmVkIGludCBpbml0X3NldHRpbmdzX3N6OworCWJvb2wgcG1fcG93ZXJfb2ZmOworfTsKKworI2VuZGlmIC8qIE1GRF9BQjU1MDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwL2dwYWRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaAppbmRleCA0NmI5NTQwLi4yNTI5NjY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAvZ3BhZGMuaApAQCAtMjcsNiArMjcsOSBAQAogc3RydWN0IGFiODUwMF9ncGFkYzsKIAogc3RydWN0IGFiODUwMF9ncGFkYyAqYWI4NTAwX2dwYWRjX2dldChjaGFyICpuYW1lKTsKLWludCBhYjg1MDBfZ3BhZGNfY29udmVydChzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYywgdTggaW5wdXQpOworaW50IGFiODUwMF9ncGFkY19jb252ZXJ0KHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLCB1OCBjaGFubmVsKTsKK2ludCBhYjg1MDBfZ3BhZGNfcmVhZF9yYXcoc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGMsIHU4IGNoYW5uZWwpOworaW50IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKHN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjLAorICAgIHU4IGNoYW5uZWwsIGludCBhZF92YWx1ZSk7CiAKICNlbmRpZiAvKiBfQUI4NTAwX0dQQURDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FieDUwMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKaW5kZXggODk2YjVlNC4uOTk3MDMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwLmgKQEAgLTYsNyArNiw3IEBACiAgKgogICogQUJYNTAwIGNvcmUgYWNjZXNzIGZ1bmN0aW9ucy4KICAqIFRoZSBhYng1MDAgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIHRoZSBBbmFsb2cgQmFzZWJhbmQgY2hpcAotICogYWIzMTAwLCBhYjM1NTAsIGFiNTUwMCwgYW5kIGFiODUwMC4KKyAqIGFiMzEwMCwgYWI1NTAwLCBhbmQgYWI4NTAwLgogICoKICAqIEF1dGhvcjogTWF0dGlhcyBXYWxsaW4gPG1hdHRpYXMud2FsbGluQHN0ZXJpY3Nzb24uY29tPgogICogQXV0aG9yOiBNYXR0aWFzIE5pbHNzb24gPG1hdHRpYXMuaS5uaWxzc29uQHN0ZXJpY3Nzb24uY29tPgpAQCAtMjksMTcgKzI5LDE2IEBACiAjZGVmaW5lIEFCMzEwMF9QMUcJMHhjNgogI2RlZmluZSBBQjMxMDBfUjJBCTB4YzcKICNkZWZpbmUgQUIzMTAwX1IyQgkweGM4Ci0jZGVmaW5lIEFCMzU1MF9QMUEJMHgxMAogI2RlZmluZSBBQjU1MDBfMV8wCTB4MjAKLSNkZWZpbmUgQUI1NTAwXzJfMAkweDIxCi0jZGVmaW5lIEFCNTUwMF8yXzEJMHgyMgorI2RlZmluZSBBQjU1MDBfMV8xCTB4MjEKKyNkZWZpbmUgQUI1NTAwXzJfMAkweDI0CiAKIC8qIEFCODUwMCBDSURzKi8KLSNkZWZpbmUgQUI4NTAwX0NVVEVBUkxZCTB4MDAKICNkZWZpbmUgQUI4NTAwX0NVVDFQMAkweDEwCiAjZGVmaW5lIEFCODUwMF9DVVQxUDEJMHgxMQogI2RlZmluZSBBQjg1MDBfQ1VUMlAwCTB4MjAKICNkZWZpbmUgQUI4NTAwX0NVVDNQMAkweDMwCisjZGVmaW5lIEFCODUwMF9DVVQzUDMJMHgzMwogCiAvKgogICogQUIzMTAwLCBFVkVOVEExLCBBMiBhbmQgQTMgZXZlbnQgcmVnaXN0ZXIgZmxhZ3MKQEAgLTE0MywzOSArMTQyLDYgQEAKIGludCBhYjMxMDBfZXZlbnRfdW5yZWdpc3RlcihzdHJ1Y3QgYWIzMTAwICphYjMxMDAsCiAJCQkgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiAKLS8qIEFCMzU1MCwgU1RSIHJlZ2lzdGVyIGZsYWdzICovCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0EJCQkJKDB4MDEpCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0IJCQkJKDB4MDIpCi0jZGVmaW5lIEFCMzU1MF9TVFJfT05TV0MJCQkJKDB4MDQpCi0jZGVmaW5lIEFCMzU1MF9TVFJfRENJTwkJCQkJKDB4MDgpCi0jZGVmaW5lIEFCMzU1MF9TVFJfQk9PVF9NT0RFCQkJCSgweDEwKQotI2RlZmluZSBBQjM1NTBfU1RSX1NJTV9PRkYJCQkJKDB4MjApCi0jZGVmaW5lIEFCMzU1MF9TVFJfQkFUVF9SRU1PVkFMCQkJCSgweDQwKQotI2RlZmluZSBBQjM1NTBfU1RSX1ZCVVMJCQkJCSgweDgwKQotCi0vKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQUIzNTUwX0lNUjEgMHgyOQotI2RlZmluZSBBQjM1NTBfSU1SMiAweDJhCi0jZGVmaW5lIEFCMzU1MF9JTVIzIDB4MmIKLSNkZWZpbmUgQUIzNTUwX0lNUjQgMHgyYwotI2RlZmluZSBBQjM1NTBfSU1SNSAweDJkCi0KLWVudW0gYWIzNTUwX2RldmlkIHsKLQlBQjM1NTBfREVWSURfQURDLAotCUFCMzU1MF9ERVZJRF9EQUMsCi0JQUIzNTUwX0RFVklEX0xFRFMsCi0JQUIzNTUwX0RFVklEX1BPV0VSLAotCUFCMzU1MF9ERVZJRF9SRUdVTEFUT1JTLAotCUFCMzU1MF9ERVZJRF9TSU0sCi0JQUIzNTUwX0RFVklEX1VBUlQsCi0JQUIzNTUwX0RFVklEX1JUQywKLQlBQjM1NTBfREVWSURfQ0hBUkdFUiwKLQlBQjM1NTBfREVWSURfRlVFTEdBVUdFLAotCUFCMzU1MF9ERVZJRF9WSUJSQVRPUiwKLQlBQjM1NTBfREVWSURfQ09ERUMsCi0JQUIzNTUwX05VTV9ERVZJQ0VTLAotfTsKLQogLyoqCiAgKiBzdHJ1Y3QgYWJ4NTAwX2luaXRfc2V0dGluZwogICogSW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXJzIGZvciBkcml2ZXIgdG8gdXNlIGR1cmluZyBzZXR1cC4KQEAgLTE4NiwxOCArMTUyLDYgQEAKIAl1OCBzZXR0aW5nOwogfTsKIAotLyoqCi0gKiBzdHJ1Y3QgYWIzNTUwX3BsYXRmb3JtX2RhdGEKLSAqIERhdGEgc3VwcGxpZWQgdG8gaW5pdGlhbGl6ZSBib2FyZCBjb25uZWN0aW9ucyB0byB0aGUgQUIzNTUwCi0gKi8KLXN0cnVjdCBhYjM1NTBfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IHt1bnNpZ25lZCBpbnQgYmFzZTsgdW5zaWduZWQgaW50IGNvdW50OyB9IGlycTsKLQl2b2lkICpkZXZfZGF0YVtBQjM1NTBfTlVNX0RFVklDRVNdOwotCXNpemVfdCBkZXZfZGF0YV9zeltBQjM1NTBfTlVNX0RFVklDRVNdOwotCXN0cnVjdCBhYng1MDBfaW5pdF9zZXR0aW5ncyAqaW5pdF9zZXR0aW5nczsKLQl1bnNpZ25lZCBpbnQgaW5pdF9zZXR0aW5nc19zejsKLX07Ci0KIGludCBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCBiYW5rLCB1OCByZWcsCiAJdTggdmFsdWUpOwogaW50IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGJhbmssIHU4IHJlZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RiNTUwMC1wcmNtdS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKaW5kZXggZjA5Nzc5OC4uOTg5MDY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGI1NTAwLXByY211LmgKQEAgLTUsMjEgKzUsMzUgQEAKICAqCiAgKiBVNTUwMCBQUkNNVSBBUEkuCiAgKi8KLSNpZm5kZWYgX19NQUNIX1BSQ01VX1U1NTAwX0gKLSNkZWZpbmUgX19NQUNIX1BSQ01VX1U1NTAwX0gKKyNpZm5kZWYgX19NRkRfREI1NTAwX1BSQ01VX0gKKyNkZWZpbmUgX19NRkRfREI1NTAwX1BSQ01VX0gKIAotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCisjaWZkZWYgQ09ORklHX01GRF9EQjU1MDBfUFJDTVUKIAogdm9pZCBkYjU1MDBfcHJjbXVfZWFybHlfaW5pdCh2b2lkKTsKLQoraW50IGRiNTUwMF9wcmNtdV9zZXRfZXBvZCh1MTYgZXBvZF9pZCwgdTggZXBvZF9zdGF0ZSk7CitpbnQgZGI1NTAwX3ByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKTsKK2ludCBkYjU1MDBfcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCk7CitpbnQgZGI1NTAwX3ByY211X2VuYWJsZV9kc2lwbGwodm9pZCk7CiBpbnQgZGI1NTAwX3ByY211X2FiYl9yZWFkKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CiBpbnQgZGI1NTAwX3ByY211X2FiYl93cml0ZSh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpOwordm9pZCBkYjU1MDBfcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpOworaW50IGRiNTUwMF9wcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSk7Cit2b2lkIGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpOwordm9pZCBkYjU1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIodm9pZCBfX2lvbWVtICoqYnVmKTsKK2ludCBwcmNtdV9yZXNldG91dCh1OCByZXNvdXRuLCB1OCBzdGF0ZSk7CitpbnQgZGI1NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCk7CitpbnQgZGI1NTAwX3ByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSk7Cit2b2lkIGRiNTUwMF9wcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpOwordTE2IGRiNTUwMF9wcmNtdV9nZXRfcmVzZXRfY29kZSh2b2lkKTsKK2Jvb2wgZGI1NTAwX3ByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpOworaW50IGRiNTUwMF9wcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApOworaW50IGRiNTUwMF9wcmNtdV9nZXRfYXJtX29wcCh2b2lkKTsKIAogI2Vsc2UgLyogIUNPTkZJR19VWDUwMF9TT0NfREI1NTAwICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZWFybHlfaW5pdCh2b2lkKQotewotfQorc3RhdGljIGlubGluZSB2b2lkIGRiNTUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9hYmJfcmVhZCh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCiB7CkBAIC0zMSwxNSArNDUsNzUgQEAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19VWDUwMF9TT0NfREI1NTAwICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCiB7Ci0jaWZkZWYgQ09ORklHX01BQ0hfVTU1MDBfU0lNVUxBVE9SCiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgogfQogCi0jZW5kaWYgLyogX19NQUNIX1BSQ01VX1U1NTAwX0ggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGI1NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Jlc2V0b3V0KHU4IHJlc291dG4sIHU4IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIodm9pZCBfX2lvbWVtICoqYnVmKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGRiNTUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiNTUwMF9wcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLAorCWJvb2wga2VlcF9hcF9wbGwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjU1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKSB7fQorCitzdGF0aWMgaW5saW5lIHUxNiBkYjU1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIGRiNTUwMF9wcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfc2V0X2FybV9vcHAodTggb3BwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjU1MDBfcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYgLyogQ09ORklHX01GRF9EQjU1MDBfUFJDTVUgKi8KKworI2VuZGlmIC8qIF9fTUZEX0RCNTUwMF9QUkNNVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RiODUwMC1wcmNtdS5oCmluZGV4IDkxN2RiY2FiLi42MGQyN2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaApAQCAtMTEsNyArMTEsNiBAQAogI2RlZmluZSBfX01GRF9EQjg1MDBfUFJDTVVfSAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogLyogVGhpcyBwb3J0aW9uIHByZXZpb3VzbHkga25vd24gYXMgPG1hY2gvcHJjbXUtZnctZGVmc192MS5oPiAqLwogCkBAIC0xMzMsNyArMTMyLDcgQEAKICAqIEBBUEVYRUNVVEVfVE9fQVBJRExFOiBQb3dlciBzdGF0ZSB0cmFuc2l0aW9uIGZyb20gQXBFeGVjdXRlIHRvIEFwSWRsZQogICovCiBlbnVtIGFwX3B3cnN0X3RyYW5zIHsKLQlOT19UUkFOU0lUSU9OCQkJPSAweDAwLAorCVBSQ01VX0FQX05PX0NIQU5HRQkJPSAweDAwLAogCUFQRVhFQ1VURV9UT19BUFNMRUVQCQk9IDB4MDEsCiAJQVBJRExFX1RPX0FQU0xFRVAJCT0gMHgwMiwgLyogVG8gYmUgcmVtb3ZlZCAqLwogCVBSQ01VX0FQX1NMRUVQCQkJPSAweDAxLApAQCAtMTQ2LDU0ICsxNDUsNiBAQAogfTsKIAogLyoqCi0gKiBlbnVtIGRkcl9wd3JzdCAtIEREUiBwb3dlciBzdGF0ZXMgZGVmaW5pdGlvbgotICogQEREUl9QV1JfU1RBVEVfVU5DSEFOR0VEOiBTRFJBTSBhbmQgRERSIGNvbnRyb2xsZXIgc3RhdGUgaXMgdW5jaGFuZ2VkCi0gKiBARERSX1BXUl9TVEFURV9PTjoKLSAqIEBERFJfUFdSX1NUQVRFX09GRkxPV0xBVDoKLSAqIEBERFJfUFdSX1NUQVRFX09GRkhJR0hMQVQ6Ci0gKi8KLWVudW0gZGRyX3B3cnN0IHsKLQlERFJfUFdSX1NUQVRFX1VOQ0hBTkdFRCAgICAgPSAweDAwLAotCUREUl9QV1JfU1RBVEVfT04gICAgICAgICAgICA9IDB4MDEsCi0JRERSX1BXUl9TVEFURV9PRkZMT1dMQVQgICAgID0gMHgwMiwKLQlERFJfUFdSX1NUQVRFX09GRkhJR0hMQVQgICAgPSAweDAzCi19OwotCi0vKioKLSAqIGVudW0gYXJtX29wcCAtIEFSTSBPUFAgc3RhdGVzIGRlZmluaXRpb24KLSAqIEBBUk1fT1BQX0lOSVQ6Ci0gKiBAQVJNX05PX0NIQU5HRTogVGhlIEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgdW5jaGFuZ2VkCi0gKiBAQVJNXzEwMF9PUFA6IFRoZSBuZXcgQVJNIG9wZXJhdGluZyBwb2ludCBpcyBhcm0xMDBvcHAKLSAqIEBBUk1fNTBfT1BQOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtNTBvcHAKLSAqIEBBUk1fTUFYX09QUDogT3BlcmF0aW5nIHBvaW50IGlzICJtYXgiIChtb3JlIHRoYW4gMTAwKQotICogQEFSTV9NQVhfRlJFUTEwME9QUDogU2V0IG1heCBvcHAgaWYgYXZhaWxhYmxlLCBlbHNlIDEwMAotICogQEFSTV9FWFRDTEs6IFRoZSBuZXcgQVJNIG9wZXJhdGluZyBwb2ludCBpcyBhcm1FeHRDbGsKLSAqLwotZW51bSBhcm1fb3BwIHsKLQlBUk1fT1BQX0lOSVQgPSAweDAwLAotCUFSTV9OT19DSEFOR0UgPSAweDAxLAotCUFSTV8xMDBfT1BQID0gMHgwMiwKLQlBUk1fNTBfT1BQID0gMHgwMywKLQlBUk1fTUFYX09QUCA9IDB4MDQsCi0JQVJNX01BWF9GUkVRMTAwT1BQID0gMHgwNSwKLQlBUk1fRVhUQ0xLID0gMHgwNwotfTsKLQotLyoqCi0gKiBlbnVtIGFwZV9vcHAgLSBBUEUgT1BQIHN0YXRlcyBkZWZpbml0aW9uCi0gKiBAQVBFX09QUF9JTklUOgotICogQEFQRV9OT19DSEFOR0U6IFRoZSBBUEUgb3BlcmF0aW5nIHBvaW50IGlzIHVuY2hhbmdlZAotICogQEFQRV8xMDBfT1BQOiBUaGUgbmV3IEFQRSBvcGVyYXRpbmcgcG9pbnQgaXMgYXBlMTAwb3BwCi0gKiBAQVBFXzUwX09QUDogNTAlCi0gKi8KLWVudW0gYXBlX29wcCB7Ci0JQVBFX09QUF9JTklUID0gMHgwMCwKLQlBUEVfTk9fQ0hBTkdFID0gMHgwMSwKLQlBUEVfMTAwX09QUCA9IDB4MDIsCi0JQVBFXzUwX09QUCA9IDB4MDMKLX07Ci0KLS8qKgogICogZW51bSBod19hY2Nfc3RhdGUgLSBTdGF0ZSBkZWZpbml0aW9uIGZvciBoYXJkd2FyZSBhY2NlbGVyYXRvcgogICogQEhXX05PX0NIQU5HRTogVGhlIGhhcmR3YXJlIGFjY2VsZXJhdG9yIHN0YXRlIG11c3QgcmVtYWluIHVuY2hhbmdlZAogICogQEhXX09GRjogVGhlIGhhcmR3YXJlIGFjY2VsZXJhdG9yIG11c3QgYmUgc3dpdGNoZWQgb2ZmCkBAIC00NjksMjYgKzQyMCw2IEBACiAKIC8qIEVuZCBvZiBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgcHJjbXUtZnctZGVmc192MS5oICovCiAKLS8qIFBSQ01VIFdha2V1cCBkZWZpbmVzICovCi1lbnVtIHByY211X3dha2V1cF9pbmRleCB7Ci0JUFJDTVVfV0FLRVVQX0lOREVYX1JUQywKLQlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMCwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMSwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMCwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMSwKLQlQUkNNVV9XQUtFVVBfSU5ERVhfVVNCLAotCVBSQ01VX1dBS0VVUF9JTkRFWF9BQkIsCi0JUFJDTVVfV0FLRVVQX0lOREVYX0FCQl9GSUZPLAotCVBSQ01VX1dBS0VVUF9JTkRFWF9BUk0sCi0JTlVNX1BSQ01VX1dBS0VVUF9JTkRJQ0VTCi19OwotI2RlZmluZSBQUkNNVV9XQUtFVVAoX25hbWUpIChCSVQoUFJDTVVfV0FLRVVQX0lOREVYXyMjX25hbWUpKQotCi0vKiBQUkNNVSBRb1MgQVBFIE9QUCBjbGFzcyAqLwotI2RlZmluZSBQUkNNVV9RT1NfQVBFX09QUCAxCi0jZGVmaW5lIFBSQ01VX1FPU19ERFJfT1BQIDIKLSNkZWZpbmUgUFJDTVVfUU9TX0RFRkFVTFRfVkFMVUUgLTEKLQogLyoqCiAgKiBlbnVtIGh3X2FjY19kZXYgLSBlbnVtIGZvciBodyBhY2NlbGVyYXRvcnMKICAqIEBIV19BQ0NfU1ZBTU1EU1A6IGZvciBTVkFNTURTUApAQCAtNTI3LDY0ICs0NTgsNiBAQAogfTsKIAogLyoKLSAqIElkcyBmb3IgYWxsIEVQT0RzIChwb3dlciBkb21haW5zKQotICogLSBFUE9EX0lEX1NWQU1NRFNQOiBwb3dlciBkb21haW4gZm9yIFNWQSBNTURTUAotICogLSBFUE9EX0lEX1NWQVBJUEU6IHBvd2VyIGRvbWFpbiBmb3IgU1ZBIHBpcGUKLSAqIC0gRVBPRF9JRF9TSUFNTURTUDogcG93ZXIgZG9tYWluIGZvciBTSUEgTU1EU1AKLSAqIC0gRVBPRF9JRF9TSUFQSVBFOiBwb3dlciBkb21haW4gZm9yIFNJQSBwaXBlCi0gKiAtIEVQT0RfSURfU0dBOiBwb3dlciBkb21haW4gZm9yIFNHQQotICogLSBFUE9EX0lEX0IyUjJfTUNERTogcG93ZXIgZG9tYWluIGZvciBCMlIyIGFuZCBNQ0RFCi0gKiAtIEVQT0RfSURfRVNSQU0xMjogcG93ZXIgZG9tYWluIGZvciBFU1JBTSAxIGFuZCAyCi0gKiAtIEVQT0RfSURfRVNSQU0zNDogcG93ZXIgZG9tYWluIGZvciBFU1JBTSAzIGFuZCA0Ci0gKiAtIE5VTV9FUE9EX0lEOiBudW1iZXIgb2YgcG93ZXIgZG9tYWlucwotICovCi0jZGVmaW5lIEVQT0RfSURfU1ZBTU1EU1AJMAotI2RlZmluZSBFUE9EX0lEX1NWQVBJUEUJCTEKLSNkZWZpbmUgRVBPRF9JRF9TSUFNTURTUAkyCi0jZGVmaW5lIEVQT0RfSURfU0lBUElQRQkJMwotI2RlZmluZSBFUE9EX0lEX1NHQQkJNAotI2RlZmluZSBFUE9EX0lEX0IyUjJfTUNERQk1Ci0jZGVmaW5lIEVQT0RfSURfRVNSQU0xMgkJNgotI2RlZmluZSBFUE9EX0lEX0VTUkFNMzQJCTcKLSNkZWZpbmUgTlVNX0VQT0RfSUQJCTgKLQotLyoKLSAqIHN0YXRlIGRlZmluaXRpb24gZm9yIEVQT0QgKHBvd2VyIGRvbWFpbikKLSAqIC0gRVBPRF9TVEFURV9OT19DSEFOR0U6IFRoZSBFUE9EIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCi0gKiAtIEVQT0RfU1RBVEVfT0ZGOiBUaGUgRVBPRCBpcyBzd2l0Y2hlZCBvZmYKLSAqIC0gRVBPRF9TVEFURV9SQU1SRVQ6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9mZiB3aXRoIGl0cyBpbnRlcm5hbCBSQU0gaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHJldGVudGlvbgotICogLSBFUE9EX1NUQVRFX09OX0NMS19PRkY6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9uLCBjbG9jayBpcyBzdGlsbCBvZmYKLSAqIC0gRVBPRF9TVEFURV9PTjogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggY2xvY2sgZW5hYmxlZAotICovCi0jZGVmaW5lIEVQT0RfU1RBVEVfTk9fQ0hBTkdFCTB4MDAKLSNkZWZpbmUgRVBPRF9TVEFURV9PRkYJCTB4MDEKLSNkZWZpbmUgRVBPRF9TVEFURV9SQU1SRVQJMHgwMgotI2RlZmluZSBFUE9EX1NUQVRFX09OX0NMS19PRkYJMHgwMwotI2RlZmluZSBFUE9EX1NUQVRFX09OCQkweDA0Ci0KLS8qCi0gKiBDTEtPVVQgc291cmNlcwotICovCi0jZGVmaW5lIFBSQ01VX0NMS1NSQ19DTEszOE0JCTB4MDAKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FDTEsJCTB4MDEKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NZU0NMSwkJMHgwMgotI2RlZmluZSBQUkNNVV9DTEtTUkNfTENEQ0xLCQkweDAzCi0jZGVmaW5lIFBSQ01VX0NMS1NSQ19TRE1NQ0NMSwkJMHgwNAotI2RlZmluZSBQUkNNVV9DTEtTUkNfVFZDTEsJCTB4MDUKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1RJTUNMSwkJMHgwNgotI2RlZmluZSBQUkNNVV9DTEtTUkNfQ0xLMDA5CQkweDA3Ci0vKiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgQ0xLT1VUMTogKi8KLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NJQU1NRFNQQ0xLCTB4NDAKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0kyQ0NMSwkJMHg0MQotI2RlZmluZSBQUkNNVV9DTEtTUkNfTVNQMDJDTEsJCTB4NDIKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FSTVBMTF9PQlNDTEsJMHg0MwotI2RlZmluZSBQUkNNVV9DTEtTUkNfSFNJUlhDTEsJCTB4NDQKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0hTSVRYQ0xLCQkweDQ1Ci0jZGVmaW5lIFBSQ01VX0NMS1NSQ19BUk1DTEtGSVgJCTB4NDYKLSNkZWZpbmUgUFJDTVVfQ0xLU1JDX0hETUlDTEsJCTB4NDcKLQotLyoKICAqIERlZmluaXRpb25zIGZvciBhdXRvbm9tb3VzIHBvd2VyIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbi4KICAqLwogCkBAIC02MjAsODggKzQ5MywxMiBAQAogCXU4IHN2YV9wb2xpY3k7CiB9OwogCi0vKioKLSAqIGVudW0gZGRyX29wcCAtIEREUiBPUFAgc3RhdGVzIGRlZmluaXRpb24KLSAqIEBERFJfMTAwX09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjEwMG9wcAotICogQEREUl81MF9PUFA6IFRoZSBuZXcgRERSIG9wZXJhdGluZyBwb2ludCBpcyBkZHI1MG9wcAotICogQEREUl8yNV9PUFA6IFRoZSBuZXcgRERSIG9wZXJhdGluZyBwb2ludCBpcyBkZHIyNW9wcAotICovCi1lbnVtIGRkcl9vcHAgewotCUREUl8xMDBfT1BQID0gMHgwMCwKLQlERFJfNTBfT1BQID0gMHgwMSwKLQlERFJfMjVfT1BQID0gMHgwMiwKLX07Ci0KLS8qCi0gKiBDbG9jayBpZGVudGlmaWVycy4KLSAqLwotZW51bSBwcmNtdV9jbG9jayB7Ci0JUFJDTVVfU0dBQ0xLLAotCVBSQ01VX1VBUlRDTEssCi0JUFJDTVVfTVNQMDJDTEssCi0JUFJDTVVfTVNQMUNMSywKLQlQUkNNVV9JMkNDTEssCi0JUFJDTVVfU0RNTUNDTEssCi0JUFJDTVVfU0xJTUNMSywKLQlQUkNNVV9QRVIxQ0xLLAotCVBSQ01VX1BFUjJDTEssCi0JUFJDTVVfUEVSM0NMSywKLQlQUkNNVV9QRVI1Q0xLLAotCVBSQ01VX1BFUjZDTEssCi0JUFJDTVVfUEVSN0NMSywKLQlQUkNNVV9MQ0RDTEssCi0JUFJDTVVfQk1MQ0xLLAotCVBSQ01VX0hTSVRYQ0xLLAotCVBSQ01VX0hTSVJYQ0xLLAotCVBSQ01VX0hETUlDTEssCi0JUFJDTVVfQVBFQVRDTEssCi0JUFJDTVVfQVBFVFJBQ0VDTEssCi0JUFJDTVVfTUNERUNMSywKLQlQUkNNVV9JUEkyQ0NMSywKLQlQUkNNVV9EU0lBTFRDTEssCi0JUFJDTVVfRE1BQ0xLLAotCVBSQ01VX0IyUjJDTEssCi0JUFJDTVVfVFZDTEssCi0JUFJDTVVfU1NQQ0xLLAotCVBSQ01VX1JOR0NMSywKLQlQUkNNVV9VSUNDQ0xLLAotCVBSQ01VX05VTV9SRUdfQ0xPQ0tTLAotCVBSQ01VX1NZU0NMSyA9IFBSQ01VX05VTV9SRUdfQ0xPQ0tTLAotCVBSQ01VX1RJTUNMSywKLX07Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgY29udHJvbGxpbmcgRVNSQU0wIGluIGRlZXAgc2xlZXAuCi0gKi8KLSNkZWZpbmUgRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfT0ZGIDEKLSNkZWZpbmUgRVNSQU0wX0RFRVBfU0xFRVBfU1RBVEVfUkVUIDIKLQotI2lmZGVmIENPTkZJR19NRkRfREI4NTAwX1BSQ01VCi12b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpOwotaW50IHByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKTsKLWludCBwcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKTsKLWludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcHJjbXVfZWFybHlfaW5pdCh2b2lkKSB7fQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUZEX0RCODUwMF9QUkNNVQogCit2b2lkIGRiODUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpOwogaW50IHByY211X3NldF9yY19hMnAoZW51bSByb21jb2RlX3dyaXRlKTsKIGVudW0gcm9tY29kZV9yZWFkIHByY211X2dldF9yY19wMmEodm9pZCk7CiBlbnVtIGFwX3B3cnN0IHByY211X2dldF94cDcwX2N1cnJlbnRfc3RhdGUodm9pZCk7Ci1pbnQgcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywgYm9vbCBrZWVwX2FwX3BsbCk7Ci0KLXZvaWQgcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpOwotc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKQotewotCXByY211X2VuYWJsZV93YWtldXBzKDApOwotfQotCi12b2lkIHByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cyk7Ci12b2lkIHByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zik7Ci1pbnQgcHJjbXVfc2V0X2FybV9vcHAodTggb3BwKTsKLWludCBwcmNtdV9nZXRfYXJtX29wcCh2b2lkKTsKIGJvb2wgcHJjbXVfaGFzX2FybV9tYXhvcHAodm9pZCk7CiBib29sIHByY211X2lzX3U4NDAwKHZvaWQpOwogaW50IHByY211X3NldF9hcGVfb3BwKHU4IG9wcCk7CkBAIC03MTAsMTkgKzUwNywxNCBAQAogaW50IHByY211X3JlbGVhc2VfdXNiX3dha2V1cF9zdGF0ZSh2b2lkKTsKIGludCBwcmNtdV9zZXRfZGRyX29wcCh1OCBvcHApOwogaW50IHByY211X2dldF9kZHJfb3BwKHZvaWQpOwotdW5zaWduZWQgbG9uZyBwcmNtdV9xb3NfZ2V0X2NwdWZyZXFfb3BwX2RlbGF5KHZvaWQpOwotdm9pZCBwcmNtdV9xb3Nfc2V0X2NwdWZyZXFfb3BwX2RlbGF5KHVuc2lnbmVkIGxvbmcpOwogLyogTk9URSEgVXNlIHJlZ3VsYXRvciBmcmFtZXdvcmsgaW5zdGVhZCAqLwogaW50IHByY211X3NldF9od2FjYyh1MTYgaHdfYWNjX2RldiwgdTggc3RhdGUpOwotaW50IHByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKTsKIHZvaWQgcHJjbXVfY29uZmlndXJlX2F1dG9fcG0oc3RydWN0IHByY211X2F1dG9fcG1fY29uZmlnICpzbGVlcCwKIAlzdHJ1Y3QgcHJjbXVfYXV0b19wbV9jb25maWcgKmlkbGUpOwogYm9vbCBwcmNtdV9pc19hdXRvX3BtX2VuYWJsZWQodm9pZCk7CiAKIGludCBwcmNtdV9jb25maWdfY2xrb3V0KHU4IGNsa291dCwgdTggc291cmNlLCB1OCBkaXYpOwotaW50IHByY211X3JlcXVlc3RfY2xvY2sodTggY2xvY2ssIGJvb2wgZW5hYmxlKTsKIGludCBwcmNtdV9zZXRfY2xvY2tfZGl2aWRlcih1OCBjbG9jaywgdTggZGl2aWRlcik7Ci1pbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKTsKIGludCBwcmNtdV9jb25maWdfaG90ZG9nKHU4IHRocmVzaG9sZCk7CiBpbnQgcHJjbXVfY29uZmlnX2hvdG1vbih1OCBsb3csIHU4IGhpZ2gpOwogaW50IHByY211X3N0YXJ0X3RlbXBfc2Vuc2UodTE2IGN5Y2xlczMyayk7CkBAIC03MzIsMTQgKzUyNCwzNiBAQAogCiB2b2lkIHByY211X2FjX3dha2VfcmVxKHZvaWQpOwogdm9pZCBwcmNtdV9hY19zbGVlcF9yZXEodm9pZCk7Ci12b2lkIHByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSk7CiB2b2lkIHByY211X21vZGVtX3Jlc2V0KHZvaWQpOwotYm9vbCBwcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKTsKIHZvaWQgcHJjbXVfZW5hYmxlX3NwaTIodm9pZCk7CiB2b2lkIHByY211X2Rpc2FibGVfc3BpMih2b2lkKTsKIAoraW50IHByY211X2NvbmZpZ19hOXdkb2codTggbnVtLCBib29sIHNsZWVwX2F1dG9fb2ZmKTsKK2ludCBwcmNtdV9lbmFibGVfYTl3ZG9nKHU4IGlkKTsKK2ludCBwcmNtdV9kaXNhYmxlX2E5d2RvZyh1OCBpZCk7CitpbnQgcHJjbXVfa2lja19hOXdkb2codTggaWQpOworaW50IHByY211X2xvYWRfYTl3ZG9nKHU4IGlkLCB1MzIgdmFsKTsKKwordm9pZCBkYjg1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKTsKK2ludCBkYjg1MDBfcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywgYm9vbCBrZWVwX2FwX3BsbCk7Cit2b2lkIGRiODUwMF9wcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcyk7CitpbnQgZGI4NTAwX3ByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKTsKK2ludCBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpOworaW50IGRiODUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCk7CitpbnQgZGI4NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpOworaW50IGRiODUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpOwordm9pZCBkYjg1MDBfcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKTsKK3ZvaWQgZGI4NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zik7CitpbnQgZGI4NTAwX3ByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSk7Cit1MTYgZGI4NTAwX3ByY211X2dldF9yZXNldF9jb2RlKHZvaWQpOworYm9vbCBkYjg1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQodm9pZCk7CitpbnQgZGI4NTAwX3ByY211X3NldF9hcm1fb3BwKHU4IG9wcCk7CitpbnQgZGI4NTAwX3ByY211X2dldF9hcm1fb3BwKHZvaWQpOworCiAjZWxzZSAvKiAhQ09ORklHX01GRF9EQjg1MDBfUFJDTVUgKi8KIAorc3RhdGljIGlubGluZSB2b2lkIGRiODUwMF9wcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CisKIHN0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9yY19hMnAoZW51bSByb21jb2RlX3dyaXRlIGNvZGUpCiB7CiAJcmV0dXJuIDA7CkBAIC03NTUsMzQgKzU2OSwxMiBAQAogCXJldHVybiBBUF9FWEVDVVRFOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfcG93ZXJfc3RhdGUodTggc3RhdGUsIGJvb2wga2VlcF91bHBfY2xrLAotCWJvb2wga2VlcF9hcF9wbGwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KLQotc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKSB7fQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKSB7fQotCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X2dldF9hcm1fb3BwKHZvaWQpCi17Ci0JcmV0dXJuIEFSTV8xMDBfT1BQOwotfQotCi1zdGF0aWMgYm9vbCBwcmNtdV9oYXNfYXJtX21heG9wcCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIHByY211X2hhc19hcm1fbWF4b3BwKHZvaWQpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBwcmNtdV9pc191ODQwMCh2b2lkKQorc3RhdGljIGlubGluZSBib29sIHByY211X2lzX3U4NDAwKHZvaWQpCiB7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtODE3LDEzICs2MDksNiBAQAogCXJldHVybiBERFJfMTAwX09QUDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyBuKSB7fQotCiBzdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfaHdhY2ModTE2IGh3X2FjY19kZXYsIHU4IHN0YXRlKQogewogCXJldHVybiAwOwpAQCAtODQ0LDIxICs2MjksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9jbG9ja19kaXZpZGVyKHU4IGNsb2NrLCB1OCBkaXZpZGVyKQogewogCXJldHVybiAwOwogfQogCi1pbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwcmNtdV9jb25maWdfaG90ZG9nKHU4IHRocmVzaG9sZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTg5MywzMiArNjY4LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHByY211X2FjX3NsZWVwX3JlcSh2b2lkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfc3lzdGVtX3Jlc2V0KHUxNiByZXNldF9jb2RlKSB7fQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfbW9kZW1fcmVzZXQodm9pZCkge30KIAotc3RhdGljIGlubGluZSBib29sIHByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZGlzYWJsZV9kc2lwbGwodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZW5hYmxlX2RzaXBsbCh2b2lkKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgaW50IHByY211X2VuYWJsZV9zcGkyKHZvaWQpCiB7CiAJcmV0dXJuIDA7CkBAIC05MjksNTAgKzY4MCw5NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZGI4NTAwX3ByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkge30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiODUwMF9wcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X3NldF9lcG9kKHUxNiBlcG9kX2lkLCB1OCBlcG9kX3N0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYjg1MDBfcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3Modm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGI4NTAwX3ByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAodTggc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYjg1MDBfcHJjbXVfY29uZmlnX2FiYl9ldmVudF9yZWFkb3V0KHUzMiBhYmJfZXZlbnRzKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGI4NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1Zikge30KKworc3RhdGljIGlubGluZSB1MTYgZGI4NTAwX3ByY211X2dldF9yZXNldF9jb2RlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19hOXdkb2codTggbnVtLCBib29sIHNsZWVwX2F1dG9fb2ZmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfYTl3ZG9nKHU4IGlkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9kaXNhYmxlX2E5d2RvZyh1OCBpZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfa2lja19hOXdkb2codTggaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2xvYWRfYTl3ZG9nKHU4IGlkLCB1MzIgdmFsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZGI4NTAwX3ByY211X2lzX2FjX3dha2VfcmVxdWVzdGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9zZXRfYXJtX29wcCh1OCBvcHApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9nZXRfYXJtX29wcCh2b2lkKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogIUNPTkZJR19NRkRfREI4NTAwX1BSQ01VICovCiAKLSNpZmRlZiBDT05GSUdfVVg1MDBfUFJDTVVfUU9TX1BPV0VSCi1pbnQgcHJjbXVfcW9zX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MpOwotaW50IHByY211X3Fvc19hZGRfcmVxdWlyZW1lbnQoaW50IHBtX3Fvc19jbGFzcywgY2hhciAqbmFtZSwgczMyIHZhbHVlKTsKLWludCBwcmNtdV9xb3NfdXBkYXRlX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUsIHMzMiBuZXdfdmFsdWUpOwotdm9pZCBwcmNtdV9xb3NfcmVtb3ZlX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUpOwotaW50IHByY211X3Fvc19hZGRfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCSAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwotaW50IHByY211X3Fvc19yZW1vdmVfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19yZXF1aXJlbWVudChpbnQgcHJjbXVfcW9zX2NsYXNzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9xb3NfYWRkX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MsCi0JCQkJCSAgICBjaGFyICpuYW1lLCBzMzIgdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc191cGRhdGVfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywKLQkJCQkJICAgICAgIGNoYXIgKm5hbWUsIHMzMiBuZXdfdmFsdWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9xb3NfcmVtb3ZlX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19hZGRfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKLQkJCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBwcmNtdV9xb3NfcmVtb3ZlX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCi0JCQkJCSAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fTUZEX0RCODUwMF9QUkNNVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYng1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RieDUwMC1wcmNtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzk0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYng1MDAtcHJjbXUuaApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QgRXJpY3Nzb24gU0EgMjAxMQorICoKKyAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKgorICogU1RFIFV4NTAwIFBSQ01VIEFQSQorICovCisjaWZuZGVmIF9fTUFDSF9QUkNNVV9ICisjZGVmaW5lIF9fTUFDSF9QUkNNVV9ICisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKy8qIFBSQ01VIFdha2V1cCBkZWZpbmVzICovCitlbnVtIHByY211X3dha2V1cF9pbmRleCB7CisJUFJDTVVfV0FLRVVQX0lOREVYX1JUQywKKwlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMCwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfUlRUMSwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMCwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfSFNJMSwKKwlQUkNNVV9XQUtFVVBfSU5ERVhfVVNCLAorCVBSQ01VX1dBS0VVUF9JTkRFWF9BQkIsCisJUFJDTVVfV0FLRVVQX0lOREVYX0FCQl9GSUZPLAorCVBSQ01VX1dBS0VVUF9JTkRFWF9BUk0sCisJUFJDTVVfV0FLRVVQX0lOREVYX0NEX0lSUSwKKwlOVU1fUFJDTVVfV0FLRVVQX0lORElDRVMKK307CisjZGVmaW5lIFBSQ01VX1dBS0VVUChfbmFtZSkgKEJJVChQUkNNVV9XQUtFVVBfSU5ERVhfIyNfbmFtZSkpCisKKy8qIEVQT0QgKHBvd2VyIGRvbWFpbikgSURzICovCisKKy8qCisgKiBEQjg1MDAgRVBPRHMKKyAqIC0gRVBPRF9JRF9TVkFNTURTUDogcG93ZXIgZG9tYWluIGZvciBTVkEgTU1EU1AKKyAqIC0gRVBPRF9JRF9TVkFQSVBFOiBwb3dlciBkb21haW4gZm9yIFNWQSBwaXBlCisgKiAtIEVQT0RfSURfU0lBTU1EU1A6IHBvd2VyIGRvbWFpbiBmb3IgU0lBIE1NRFNQCisgKiAtIEVQT0RfSURfU0lBUElQRTogcG93ZXIgZG9tYWluIGZvciBTSUEgcGlwZQorICogLSBFUE9EX0lEX1NHQTogcG93ZXIgZG9tYWluIGZvciBTR0EKKyAqIC0gRVBPRF9JRF9CMlIyX01DREU6IHBvd2VyIGRvbWFpbiBmb3IgQjJSMiBhbmQgTUNERQorICogLSBFUE9EX0lEX0VTUkFNMTI6IHBvd2VyIGRvbWFpbiBmb3IgRVNSQU0gMSBhbmQgMgorICogLSBFUE9EX0lEX0VTUkFNMzQ6IHBvd2VyIGRvbWFpbiBmb3IgRVNSQU0gMyBhbmQgNAorICogLSBOVU1fRVBPRF9JRDogbnVtYmVyIG9mIHBvd2VyIGRvbWFpbnMKKyAqCisgKiBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcHJlZml4ZWQuCisgKi8KKyNkZWZpbmUgRVBPRF9JRF9TVkFNTURTUAkwCisjZGVmaW5lIEVQT0RfSURfU1ZBUElQRQkJMQorI2RlZmluZSBFUE9EX0lEX1NJQU1NRFNQCTIKKyNkZWZpbmUgRVBPRF9JRF9TSUFQSVBFCQkzCisjZGVmaW5lIEVQT0RfSURfU0dBCQk0CisjZGVmaW5lIEVQT0RfSURfQjJSMl9NQ0RFCTUKKyNkZWZpbmUgRVBPRF9JRF9FU1JBTTEyCQk2CisjZGVmaW5lIEVQT0RfSURfRVNSQU0zNAkJNworI2RlZmluZSBOVU1fRVBPRF9JRAkJOAorCisvKgorICogREI1NTAwIEVQT0RzCisgKi8KKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfQkFTRSAweDAxMDAKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfU0dBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfSFZBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMSkKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfU0lBIChEQjU1MDBfRVBPRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgREI1NTAwX0VQT0RfSURfRElTUCAoREI1NTAwX0VQT0RfSURfQkFTRSArIDMpCisjZGVmaW5lIERCNTUwMF9FUE9EX0lEX0VTUkFNMTIgKERCNTUwMF9FUE9EX0lEX0JBU0UgKyA2KQorI2RlZmluZSBEQjU1MDBfTlVNX0VQT0RfSUQgNworCisvKgorICogc3RhdGUgZGVmaW5pdGlvbiBmb3IgRVBPRCAocG93ZXIgZG9tYWluKQorICogLSBFUE9EX1NUQVRFX05PX0NIQU5HRTogVGhlIEVQT0Qgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKKyAqIC0gRVBPRF9TVEFURV9PRkY6IFRoZSBFUE9EIGlzIHN3aXRjaGVkIG9mZgorICogLSBFUE9EX1NUQVRFX1JBTVJFVDogVGhlIEVQT0QgaXMgc3dpdGNoZWQgb2ZmIHdpdGggaXRzIGludGVybmFsIFJBTSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW50aW9uCisgKiAtIEVQT0RfU1RBVEVfT05fQ0xLX09GRjogVGhlIEVQT0QgaXMgc3dpdGNoZWQgb24sIGNsb2NrIGlzIHN0aWxsIG9mZgorICogLSBFUE9EX1NUQVRFX09OOiBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBjbG9jayBlbmFibGVkCisgKi8KKyNkZWZpbmUgRVBPRF9TVEFURV9OT19DSEFOR0UJMHgwMAorI2RlZmluZSBFUE9EX1NUQVRFX09GRgkJMHgwMQorI2RlZmluZSBFUE9EX1NUQVRFX1JBTVJFVAkweDAyCisjZGVmaW5lIEVQT0RfU1RBVEVfT05fQ0xLX09GRgkweDAzCisjZGVmaW5lIEVQT0RfU1RBVEVfT04JCTB4MDQKKworLyoKKyAqIENMS09VVCBzb3VyY2VzCisgKi8KKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX0NMSzM4TQkJMHgwMAorI2RlZmluZSBQUkNNVV9DTEtTUkNfQUNMSwkJMHgwMQorI2RlZmluZSBQUkNNVV9DTEtTUkNfU1lTQ0xLCQkweDAyCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19MQ0RDTEsJCTB4MDMKKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX1NETU1DQ0xLCQkweDA0CisjZGVmaW5lIFBSQ01VX0NMS1NSQ19UVkNMSwkJMHgwNQorI2RlZmluZSBQUkNNVV9DTEtTUkNfVElNQ0xLCQkweDA2CisjZGVmaW5lIFBSQ01VX0NMS1NSQ19DTEswMDkJCTB4MDcKKy8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciBDTEtPVVQxOiAqLworI2RlZmluZSBQUkNNVV9DTEtTUkNfU0lBTU1EU1BDTEsJMHg0MAorI2RlZmluZSBQUkNNVV9DTEtTUkNfSTJDQ0xLCQkweDQxCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19NU1AwMkNMSwkJMHg0MgorI2RlZmluZSBQUkNNVV9DTEtTUkNfQVJNUExMX09CU0NMSwkweDQzCisjZGVmaW5lIFBSQ01VX0NMS1NSQ19IU0lSWENMSwkJMHg0NAorI2RlZmluZSBQUkNNVV9DTEtTUkNfSFNJVFhDTEsJCTB4NDUKKyNkZWZpbmUgUFJDTVVfQ0xLU1JDX0FSTUNMS0ZJWAkJMHg0NgorI2RlZmluZSBQUkNNVV9DTEtTUkNfSERNSUNMSwkJMHg0NworCisvKgorICogQ2xvY2sgaWRlbnRpZmllcnMuCisgKi8KK2VudW0gcHJjbXVfY2xvY2sgeworCVBSQ01VX1NHQUNMSywKKwlQUkNNVV9VQVJUQ0xLLAorCVBSQ01VX01TUDAyQ0xLLAorCVBSQ01VX01TUDFDTEssCisJUFJDTVVfSTJDQ0xLLAorCVBSQ01VX1NETU1DQ0xLLAorCVBSQ01VX1NMSU1DTEssCisJUFJDTVVfUEVSMUNMSywKKwlQUkNNVV9QRVIyQ0xLLAorCVBSQ01VX1BFUjNDTEssCisJUFJDTVVfUEVSNUNMSywKKwlQUkNNVV9QRVI2Q0xLLAorCVBSQ01VX1BFUjdDTEssCisJUFJDTVVfTENEQ0xLLAorCVBSQ01VX0JNTENMSywKKwlQUkNNVV9IU0lUWENMSywKKwlQUkNNVV9IU0lSWENMSywKKwlQUkNNVV9IRE1JQ0xLLAorCVBSQ01VX0FQRUFUQ0xLLAorCVBSQ01VX0FQRVRSQUNFQ0xLLAorCVBSQ01VX01DREVDTEssCisJUFJDTVVfSVBJMkNDTEssCisJUFJDTVVfRFNJQUxUQ0xLLAorCVBSQ01VX0RNQUNMSywKKwlQUkNNVV9CMlIyQ0xLLAorCVBSQ01VX1RWQ0xLLAorCVBSQ01VX1NTUENMSywKKwlQUkNNVV9STkdDTEssCisJUFJDTVVfVUlDQ0NMSywKKwlQUkNNVV9QV01DTEssCisJUFJDTVVfSVJEQUNMSywKKwlQUkNNVV9JUlJDQ0xLLAorCVBSQ01VX1NJQUNMSywKKwlQUkNNVV9TVkFDTEssCisJUFJDTVVfTlVNX1JFR19DTE9DS1MsCisJUFJDTVVfU1lTQ0xLID0gUFJDTVVfTlVNX1JFR19DTE9DS1MsCisJUFJDTVVfVElNQ0xLLAorCVBSQ01VX1BMTFNPQzAsCisJUFJDTVVfUExMU09DMSwKKwlQUkNNVV9QTExERFIsCit9OworCisvKioKKyAqIGVudW0gYXBlX29wcCAtIEFQRSBPUFAgc3RhdGVzIGRlZmluaXRpb24KKyAqIEBBUEVfT1BQX0lOSVQ6CisgKiBAQVBFX05PX0NIQU5HRTogVGhlIEFQRSBvcGVyYXRpbmcgcG9pbnQgaXMgdW5jaGFuZ2VkCisgKiBAQVBFXzEwMF9PUFA6IFRoZSBuZXcgQVBFIG9wZXJhdGluZyBwb2ludCBpcyBhcGUxMDBvcHAKKyAqIEBBUEVfNTBfT1BQOiA1MCUKKyAqLworZW51bSBhcGVfb3BwIHsKKwlBUEVfT1BQX0lOSVQgPSAweDAwLAorCUFQRV9OT19DSEFOR0UgPSAweDAxLAorCUFQRV8xMDBfT1BQID0gMHgwMiwKKwlBUEVfNTBfT1BQID0gMHgwMworfTsKKworLyoqCisgKiBlbnVtIGFybV9vcHAgLSBBUk0gT1BQIHN0YXRlcyBkZWZpbml0aW9uCisgKiBAQVJNX09QUF9JTklUOgorICogQEFSTV9OT19DSEFOR0U6IFRoZSBBUk0gb3BlcmF0aW5nIHBvaW50IGlzIHVuY2hhbmdlZAorICogQEFSTV8xMDBfT1BQOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtMTAwb3BwCisgKiBAQVJNXzUwX09QUDogVGhlIG5ldyBBUk0gb3BlcmF0aW5nIHBvaW50IGlzIGFybTUwb3BwCisgKiBAQVJNX01BWF9PUFA6IE9wZXJhdGluZyBwb2ludCBpcyAibWF4IiAobW9yZSB0aGFuIDEwMCkKKyAqIEBBUk1fTUFYX0ZSRVExMDBPUFA6IFNldCBtYXggb3BwIGlmIGF2YWlsYWJsZSwgZWxzZSAxMDAKKyAqIEBBUk1fRVhUQ0xLOiBUaGUgbmV3IEFSTSBvcGVyYXRpbmcgcG9pbnQgaXMgYXJtRXh0Q2xrCisgKi8KK2VudW0gYXJtX29wcCB7CisJQVJNX09QUF9JTklUID0gMHgwMCwKKwlBUk1fTk9fQ0hBTkdFID0gMHgwMSwKKwlBUk1fMTAwX09QUCA9IDB4MDIsCisJQVJNXzUwX09QUCA9IDB4MDMsCisJQVJNX01BWF9PUFAgPSAweDA0LAorCUFSTV9NQVhfRlJFUTEwME9QUCA9IDB4MDUsCisJQVJNX0VYVENMSyA9IDB4MDcKK307CisKKy8qKgorICogZW51bSBkZHJfb3BwIC0gRERSIE9QUCBzdGF0ZXMgZGVmaW5pdGlvbgorICogQEREUl8xMDBfT1BQOiBUaGUgbmV3IEREUiBvcGVyYXRpbmcgcG9pbnQgaXMgZGRyMTAwb3BwCisgKiBARERSXzUwX09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjUwb3BwCisgKiBARERSXzI1X09QUDogVGhlIG5ldyBERFIgb3BlcmF0aW5nIHBvaW50IGlzIGRkcjI1b3BwCisgKi8KK2VudW0gZGRyX29wcCB7CisJRERSXzEwMF9PUFAgPSAweDAwLAorCUREUl81MF9PUFAgPSAweDAxLAorCUREUl8yNV9PUFAgPSAweDAyLAorfTsKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBjb250cm9sbGluZyBFU1JBTTAgaW4gZGVlcCBzbGVlcC4KKyAqLworI2RlZmluZSBFU1JBTTBfREVFUF9TTEVFUF9TVEFURV9PRkYgMQorI2RlZmluZSBFU1JBTTBfREVFUF9TTEVFUF9TVEFURV9SRVQgMgorCisvKioKKyAqIGVudW0gZGRyX3B3cnN0IC0gRERSIHBvd2VyIHN0YXRlcyBkZWZpbml0aW9uCisgKiBARERSX1BXUl9TVEFURV9VTkNIQU5HRUQ6IFNEUkFNIGFuZCBERFIgY29udHJvbGxlciBzdGF0ZSBpcyB1bmNoYW5nZWQKKyAqIEBERFJfUFdSX1NUQVRFX09OOgorICogQEREUl9QV1JfU1RBVEVfT0ZGTE9XTEFUOgorICogQEREUl9QV1JfU1RBVEVfT0ZGSElHSExBVDoKKyAqLworZW51bSBkZHJfcHdyc3QgeworCUREUl9QV1JfU1RBVEVfVU5DSEFOR0VEICAgICA9IDB4MDAsCisJRERSX1BXUl9TVEFURV9PTiAgICAgICAgICAgID0gMHgwMSwKKwlERFJfUFdSX1NUQVRFX09GRkxPV0xBVCAgICAgPSAweDAyLAorCUREUl9QV1JfU1RBVEVfT0ZGSElHSExBVCAgICA9IDB4MDMKK307CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvZGI4NTAwLXByY211Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RiNTUwMC1wcmNtdS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCODUwMCkgfHwgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCNTUwMCkKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9lYXJseV9pbml0KCk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X2Vhcmx5X2luaXQoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X3Bvd2VyX3N0YXRlKHU4IHN0YXRlLCBib29sIGtlZXBfdWxwX2NsaywKKwkJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3NldF9wb3dlcl9zdGF0ZShzdGF0ZSwga2VlcF91bHBfY2xrLAorCQkJa2VlcF9hcF9wbGwpOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9zZXRfcG93ZXJfc3RhdGUoc3RhdGUsIGtlZXBfdWxwX2NsaywKKwkJCWtlZXBfYXBfcGxsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X3NldF9lcG9kKGVwb2RfaWQsIGVwb2Rfc3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfZW5hYmxlX3dha2V1cHModTMyIHdha2V1cHMpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2VuYWJsZV93YWtldXBzKHdha2V1cHMpOworCWVsc2UKKwkJZGI4NTAwX3ByY211X2VuYWJsZV93YWtldXBzKHdha2V1cHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfZGlzYWJsZV93YWtldXBzKHZvaWQpCit7CisJcHJjbXVfZW5hYmxlX3dha2V1cHMoMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQodTMyIGFiYl9ldmVudHMpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dChhYmJfZXZlbnRzKTsKKwllbHNlCisJCWRiODUwMF9wcmNtdV9jb25maWdfYWJiX2V2ZW50X3JlYWRvdXQoYWJiX2V2ZW50cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9nZXRfYWJiX2V2ZW50X2J1ZmZlcih2b2lkIF9faW9tZW0gKipidWYpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJZGI1NTAwX3ByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKGJ1Zik7CisJZWxzZQorCQlkYjg1MDBfcHJjbXVfZ2V0X2FiYl9ldmVudF9idWZmZXIoYnVmKTsKK30KKworaW50IHByY211X2FiYl9yZWFkKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CitpbnQgcHJjbXVfYWJiX3dyaXRlKHU4IHNsYXZlLCB1OCByZWcsIHU4ICp2YWx1ZSwgdTggc2l6ZSk7CisKK2ludCBwcmNtdV9jb25maWdfY2xrb3V0KHU4IGNsa291dCwgdTggc291cmNlLCB1OCBkaXYpOworCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9yZXF1ZXN0X2Nsb2NrKHU4IGNsb2NrLCBib29sIGVuYWJsZSkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3JlcXVlc3RfY2xvY2soY2xvY2ssIGVuYWJsZSk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X3JlcXVlc3RfY2xvY2soY2xvY2ssIGVuYWJsZSk7Cit9CisKK2ludCBwcmNtdV9zZXRfYXBlX29wcCh1OCBvcHApOworaW50IHByY211X2dldF9hcGVfb3BwKHZvaWQpOworaW50IHByY211X3NldF9kZHJfb3BwKHU4IG9wcCk7CitpbnQgcHJjbXVfZ2V0X2Rkcl9vcHAodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcm1fb3BwKHU4IG9wcCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc2V0X2FybV9vcHAob3BwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfZ2V0X2FybV9vcHAoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3N5c3RlbV9yZXNldCh1MTYgcmVzZXRfY29kZSkKK3sKKwlpZiAobWFjaGluZV9pc191NTUwMCgpKQorCQlyZXR1cm4gZGI1NTAwX3ByY211X3N5c3RlbV9yZXNldChyZXNldF9jb2RlKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc3lzdGVtX3Jlc2V0KHJlc2V0X2NvZGUpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBwcmNtdV9nZXRfcmVzZXRfY29kZSh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiBkYjU1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfZ2V0X3Jlc2V0X2NvZGUoKTsKK30KKwordm9pZCBwcmNtdV9hY193YWtlX3JlcSh2b2lkKTsKK3ZvaWQgcHJjbXVfYWNfc2xlZXBfcmVxKHZvaWQpOwordm9pZCBwcmNtdV9tb2RlbV9yZXNldCh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcmNtdV9pc19hY193YWtlX3JlcXVlc3RlZCh2b2lkKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiBkYjU1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9zZXRfZGlzcGxheV9jbG9ja3MoKTsKKwllbHNlCisJCXJldHVybiBkYjg1MDBfcHJjbXVfc2V0X2Rpc3BsYXlfY2xvY2tzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2Rpc2FibGVfZHNpcGxsKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9kaXNhYmxlX2RzaXBsbCgpOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9kaXNhYmxlX2RzaXBsbCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJaWYgKG1hY2hpbmVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIGRiNTUwMF9wcmNtdV9lbmFibGVfZHNpcGxsKCk7CisJZWxzZQorCQlyZXR1cm4gZGI4NTAwX3ByY211X2VuYWJsZV9kc2lwbGwoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfY29uZmlnX2VzcmFtMF9kZWVwX3NsZWVwKHU4IHN0YXRlKQoreworCWlmIChtYWNoaW5lX2lzX3U1NTAwKCkpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJcmV0dXJuIGRiODUwMF9wcmNtdV9jb25maWdfZXNyYW0wX2RlZXBfc2xlZXAoc3RhdGUpOworfQorI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwcmNtdV9lYXJseV9pbml0KHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9wb3dlcl9zdGF0ZSh1OCBzdGF0ZSwgYm9vbCBrZWVwX3VscF9jbGssCisJYm9vbCBrZWVwX2FwX3BsbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Vwb2QodTE2IGVwb2RfaWQsIHU4IGVwb2Rfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9lbmFibGVfd2FrZXVwcyh1MzIgd2FrZXVwcykge30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2Rpc2FibGVfd2FrZXVwcyh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9hYmJfcmVhZCh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2FiYl93cml0ZSh1OCBzbGF2ZSwgdTggcmVnLCB1OCAqdmFsdWUsIHU4IHNpemUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19jbGtvdXQodTggY2xrb3V0LCB1OCBzb3VyY2UsIHU4IGRpdikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcmVxdWVzdF9jbG9jayh1OCBjbG9jaywgYm9vbCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcGVfb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FwZV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gQVBFXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9hcm1fb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2FybV9vcHAodm9pZCkKK3sKKwlyZXR1cm4gQVJNXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9kZHJfb3BwKHU4IG9wcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfZ2V0X2Rkcl9vcHAodm9pZCkKK3sKKwlyZXR1cm4gRERSXzEwMF9PUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9zeXN0ZW1fcmVzZXQodTE2IHJlc2V0X2NvZGUpIHt9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHByY211X2dldF9yZXNldF9jb2RlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9hY193YWtlX3JlcSh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfYWNfc2xlZXBfcmVxKHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmNtdV9tb2RlbV9yZXNldCh2b2lkKSB7fQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHJjbXVfaXNfYWNfd2FrZV9yZXF1ZXN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3NldF9kaXNwbGF5X2Nsb2Nrcyh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9kaXNhYmxlX2RzaXBsbCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcmNtdV9lbmFibGVfZHNpcGxsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X2NvbmZpZ19lc3JhbTBfZGVlcF9zbGVlcCh1OCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2NvbmZpZ19hYmJfZXZlbnRfcmVhZG91dCh1MzIgYWJiX2V2ZW50cykge30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X2dldF9hYmJfZXZlbnRfYnVmZmVyKHZvaWQgX19pb21lbSAqKmJ1ZikKK3sKKwkqYnVmID0gTlVMTDsKK30KKworI2VuZGlmCisKKy8qIFBSQ01VIFFvUyBBUEUgT1BQIGNsYXNzICovCisjZGVmaW5lIFBSQ01VX1FPU19BUEVfT1BQIDEKKyNkZWZpbmUgUFJDTVVfUU9TX0REUl9PUFAgMgorI2RlZmluZSBQUkNNVV9RT1NfREVGQVVMVF9WQUxVRSAtMQorCisjaWZkZWYgQ09ORklHX1VYNTAwX1BSQ01VX1FPU19QT1dFUgorCit1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCk7Cit2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyk7Cit2b2lkIHByY211X3Fvc19mb3JjZV9vcHAoaW50LCBzMzIpOworaW50IHByY211X3Fvc19yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzKTsKK2ludCBwcmNtdV9xb3NfYWRkX3JlcXVpcmVtZW50KGludCBwbV9xb3NfY2xhc3MsIGNoYXIgKm5hbWUsIHMzMiB2YWx1ZSk7CitpbnQgcHJjbXVfcW9zX3VwZGF0ZV9yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzLCBjaGFyICpuYW1lLCBzMzIgbmV3X3ZhbHVlKTsKK3ZvaWQgcHJjbXVfcW9zX3JlbW92ZV9yZXF1aXJlbWVudChpbnQgcG1fcW9zX2NsYXNzLCBjaGFyICpuYW1lKTsKK2ludCBwcmNtdV9xb3NfYWRkX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCisJCQkgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTsKK2ludCBwcmNtdV9xb3NfcmVtb3ZlX25vdGlmaWVyKGludCBwcmNtdV9xb3NfY2xhc3MsCisJCQkgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByY211X3Fvc19nZXRfY3B1ZnJlcV9vcHBfZGVsYXkodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19zZXRfY3B1ZnJlcV9vcHBfZGVsYXkodW5zaWduZWQgbG9uZyBuKSB7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJjbXVfcW9zX2ZvcmNlX29wcChpbnQgcHJjbXVfcW9zX2NsYXNzLCBzMzIgaSkge30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX3JlcXVpcmVtZW50KGludCBwcmNtdV9xb3NfY2xhc3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19hZGRfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywKKwkJCQkJICAgIGNoYXIgKm5hbWUsIHMzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX3VwZGF0ZV9yZXF1aXJlbWVudChpbnQgcHJjbXVfcW9zX2NsYXNzLAorCQkJCQkgICAgICAgY2hhciAqbmFtZSwgczMyIG5ld192YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByY211X3Fvc19yZW1vdmVfcmVxdWlyZW1lbnQoaW50IHByY211X3Fvc19jbGFzcywgY2hhciAqbmFtZSkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJjbXVfcW9zX2FkZF9ub3RpZmllcihpbnQgcHJjbXVfcW9zX2NsYXNzLAorCQkJCQkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHByY211X3Fvc19yZW1vdmVfbm90aWZpZXIoaW50IHByY211X3Fvc19jbGFzcywKKwkJCQkJICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogX19NQUNIX1BSQ01VX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2ludGVsX21zaWMuaCBiL2luY2x1ZGUvbGludXgvbWZkL2ludGVsX21zaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzlhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvaW50ZWxfbXNpYy5oCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogaW5jbHVkZS9saW51eC9tZmQvaW50ZWxfbXNpYy5oIC0gQ29yZSBpbnRlcmZhY2UgZm9yIEludGVsIE1TSUMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IE1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18KKyNkZWZpbmUgX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18KKworLyogSUQgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19JRDAJCQkweDAwMAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lEMQkJCTB4MDAxCS8qIFJPICovCisKKy8qIElSUSAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lSUUxWTDEJCTB4MDAyCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUlOVAkJMHgwMDMKKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0lOVAkJMHgwMDQKKyNkZWZpbmUgSU5URUxfTVNJQ19QV1JTUkNJTlQJCTB4MDA1CisjZGVmaW5lIElOVEVMX01TSUNfUFdSU1JDSU5UMQkJMHgwMDYKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJJTlQJCTB4MDA3CisjZGVmaW5lIElOVEVMX01TSUNfQ0hSSU5UMQkJMHgwMDgKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENJUlEJCTB4MDA5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVklSUQkJMHgwMGEKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWSVJRCQkweDAwYgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU9IVklSUQkJMHgwMGMKKyNkZWZpbmUgSU5URUxfTVNJQ19WUklOVAkJMHgwMGQKKyNkZWZpbmUgSU5URUxfTVNJQ19PQ0FVRElPCQkweDAwZQorI2RlZmluZSBJTlRFTF9NU0lDX0FDQ0RFVAkJMHgwMGYKKyNkZWZpbmUgSU5URUxfTVNJQ19SRVNFVElSUTEJCTB4MDEwCisjZGVmaW5lIElOVEVMX01TSUNfUkVTRVRJUlEyCQkweDAxMQorI2RlZmluZSBJTlRFTF9NU0lDX01BREMxSU5UCQkweDAxMgorI2RlZmluZSBJTlRFTF9NU0lDX01DQ0lOVAkJMHgwMTMKKyNkZWZpbmUgSU5URUxfTVNJQ19NUFdSU1JDSU5UCQkweDAxNAorI2RlZmluZSBJTlRFTF9NU0lDX01QV1JTUkNJTlQxCQkweDAxNQorI2RlZmluZSBJTlRFTF9NU0lDX01DSFJJTlQJCTB4MDE2CisjZGVmaW5lIElOVEVMX01TSUNfTUNIUklOVDEJCTB4MDE3CisjZGVmaW5lIElOVEVMX01TSUNfUlRDSVJRTUFTSwkJMHgwMTgKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWSVJRTUFTSwkweDAxOQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFZJUlFNQVNLCTB4MDFhCisjZGVmaW5lIElOVEVMX01TSUNfR1BJT0hWSVJRTUFTSwkweDAxYgorI2RlZmluZSBJTlRFTF9NU0lDX1ZSSU5UTUFTSwkJMHgwMWMKKyNkZWZpbmUgSU5URUxfTVNJQ19PQ0FVRElPTUFTSwkJMHgwMWQKKyNkZWZpbmUgSU5URUxfTVNJQ19BQ0NERVRNQVNLCQkweDAxZQorI2RlZmluZSBJTlRFTF9NU0lDX1JFU0VUSVJRMU1BU0sJMHgwMWYKKyNkZWZpbmUgSU5URUxfTVNJQ19SRVNFVElSUTJNQVNLCTB4MDIwCisjZGVmaW5lIElOVEVMX01TSUNfSVJRTFZMMU1TSwkJMHgwMjEKKyNkZWZpbmUgSU5URUxfTVNJQ19QQkNPTkZJRwkJMHgwM2UKKyNkZWZpbmUgSU5URUxfTVNJQ19QQlNUQVRVUwkJMHgwM2YJLyogUk8gKi8KKworLyogR1BJTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY3Q1RMTwkJMHgwNDAKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWNkNUTE8JCTB4MDQxCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjVDVExPCQkweDA0MgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY0Q1RMTwkJMHgwNDMKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWM0NUTE8JCTB4MDQ0CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjJDVExPCQkweDA0NQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFYxQ1RMTwkJMHgwNDYKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWMENUTE8JCTB4MDQ3CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjdDVExPUwkweDA0OAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY2Q1RMTwkJMHgwNDkKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWNUNUTE8JCTB4MDRhCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjRDVExPCQkweDA0YgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYzQ1RMTwkJMHgwNGMKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWMkNUTE8JCTB4MDRkCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjFDVExPCQkweDA0ZQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYwQ1RMTwkJMHgwNGYKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWN0NUTEkJCTB4MDUwCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjZDVExJCQkweDA1MQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFY1Q1RMSQkJMHgwNTIKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWNENUTEkJCTB4MDUzCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjNDVExJCQkweDA1NAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wTFYyQ1RMSQkJMHgwNTUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMExWMUNUTEkJCTB4MDU2CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBMVjBDVExJCQkweDA1NworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY3Q1RMSVMJMHgwNTgKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWNkNUTEkJCTB4MDU5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjVDVExJCQkweDA1YQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFY0Q1RMSQkJMHgwNWIKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWM0NUTEkJCTB4MDVjCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFMVjJDVExJCQkweDA1ZAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xTFYxQ1RMSQkJMHgwNWUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUxWMENUTEkJCTB4MDVmCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMENMS0RJVjEJCTB4MDYxCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMENMS0RJVjAJCTB4MDYyCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMUNMS0RJVjEJCTB4MDYzCisjZGVmaW5lIElOVEVMX01TSUNfUFdNMUNMS0RJVjAJCTB4MDY0CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMkNMS0RJVjEJCTB4MDY1CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMkNMS0RJVjAJCTB4MDY2CisjZGVmaW5lIElOVEVMX01TSUNfUFdNMERVVFlDWUNMRQkweDA2NworI2RlZmluZSBJTlRFTF9NU0lDX1BXTTFEVVRZQ1lDTEUJMHgwNjgKKyNkZWZpbmUgSU5URUxfTVNJQ19QV00yRFVUWUNZQ0xFCTB4MDY5CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjNDVExPCQkweDA2ZAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wSFYyQ1RMTwkJMHgwNmUKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWMUNUTE8JCTB4MDZmCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjBDVExPCQkweDA3MAorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYzQ1RMTwkJMHgwNzEKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUhWMkNUTE8JCTB4MDcyCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjFDVExPCQkweDA3MworI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYwQ1RMTwkJMHgwNzQKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWM0NUTEkJCTB4MDc1CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzBIVjJDVExJCQkweDA3NgorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8wSFYxQ1RMSQkJMHgwNzcKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMEhWMENUTEkJCTB4MDc4CisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjNDVExJCQkweDA3OQorI2RlZmluZSBJTlRFTF9NU0lDX0dQSU8xSFYyQ1RMSQkJMHgwN2EKKyNkZWZpbmUgSU5URUxfTVNJQ19HUElPMUhWMUNUTEkJCTB4MDdiCisjZGVmaW5lIElOVEVMX01TSUNfR1BJTzFIVjBDVExJCQkweDA3YworCisvKiBTVklEICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRENUUkwwCQkweDA4MAorI2RlZmluZSBJTlRFTF9NU0lDX1NWSURDVFJMMQkJMHgwODEKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEQ1RSTDIJCTB4MDgyCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFRYTEFTVFBLVDMJMHgwODMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEVFhMQVNUUEtUMgkweDA4NAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURUWExBU1RQS1QxCTB4MDg1CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFRYTEFTVFBLVDAJMHgwODYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTMJMHgwODcKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTIJMHgwODgKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTEJMHgwODkKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUEtUT1VUQllURTAJMHgwOGEKKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhWUERFQlVHMQkweDA4YgorI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWFZQREVCVUcwCTB4MDhjCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYTEFTVFBLVDMJMHgwOGQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhMQVNUUEtUMgkweDA4ZQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWExBU1RQS1QxCTB4MDhmCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYTEFTVFBLVDAJMHgwOTAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhDSEtTVEFUVVMzCTB4MDkxCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfU1ZJRFJYQ0hLU1RBVFVTMgkweDA5MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NWSURSWENIS1NUQVRVUzEJMHgwOTMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19TVklEUlhDSEtTVEFUVVMwCTB4MDk0CS8qIFJPICovCisKKy8qIFZSRUcgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NMQVRDSAkJMHgwYzAKKyNkZWZpbmUgSU5URUxfTVNJQ19WTk5MQVRDSAkJMHgwYzEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NDTlQJCTB4MGMyCisjZGVmaW5lIElOVEVMX01TSUNfU01QU1JBTVAJCTB4MGMzCisjZGVmaW5lIElOVEVMX01TSUNfVk5OQ05UCQkweDBjNAorI2RlZmluZSBJTlRFTF9NU0lDX1ZOTkFPTkNOVAkJMHgwYzUKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0MxMjJBT05DTlQJCTB4MGM2CisjZGVmaW5lIElOVEVMX01TSUNfVjE4MEFPTkNOVAkJMHgwYzcKKyNkZWZpbmUgSU5URUxfTVNJQ19WNTAwQ05UCQkweDBjOAorI2RlZmluZSBJTlRFTF9NU0lDX1ZJSEZDTlQJCTB4MGM5CisjZGVmaW5lIElOVEVMX01TSUNfTERPUkFNUDEJCTB4MGNhCisjZGVmaW5lIElOVEVMX01TSUNfTERPUkFNUDIJCTB4MGNiCisjZGVmaW5lIElOVEVMX01TSUNfVkNDMTA4QU9OQ05UCQkweDBjYworI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzEwOEFTQ05UCQkweDBjZAorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzEwOENOVAkJMHgwY2UKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0NBMTAwQVNDTlQJCTB4MGNmCisjZGVmaW5lIElOVEVMX01TSUNfVkNDQTEwMENOVAkJMHgwZDAKKyNkZWZpbmUgSU5URUxfTVNJQ19WQ0MxODBBT05DTlQJCTB4MGQxCisjZGVmaW5lIElOVEVMX01TSUNfVkNDMTgwQ05UCQkweDBkMgorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQzMzMENOVAkJMHgwZDMKKyNkZWZpbmUgSU5URUxfTVNJQ19WVVNCMzMwQ05UCQkweDBkNAorI2RlZmluZSBJTlRFTF9NU0lDX1ZDQ1NESU9DTlQJCTB4MGQ1CisjZGVmaW5lIElOVEVMX01TSUNfVlBST0cxQ05UCQkweDBkNgorI2RlZmluZSBJTlRFTF9NU0lDX1ZQUk9HMkNOVAkJMHgwZDcKKyNkZWZpbmUgSU5URUxfTVNJQ19WRU1NQ1NDTlQJCTB4MGQ4CisjZGVmaW5lIElOVEVMX01TSUNfVkVNTUMxQ05UCQkweDBkOQorI2RlZmluZSBJTlRFTF9NU0lDX1ZFTU1DMkNOVAkJMHgwZGEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQVVEQUNOVAkJMHgwZGIKKyNkZWZpbmUgSU5URUxfTVNJQ19WSFNQQ05UCQkweDBkYworI2RlZmluZSBJTlRFTF9NU0lDX1ZIU05DTlQJCTB4MGRkCisjZGVmaW5lIElOVEVMX01TSUNfVkhETUlDTlQJCTB4MGRlCisjZGVmaW5lIElOVEVMX01TSUNfVk9UR0NOVAkJMHgwZGYKKyNkZWZpbmUgSU5URUxfTVNJQ19WMVAzNUNOVAkJMHgwZTAKKyNkZWZpbmUgSU5URUxfTVNJQ19WMzMwQU9OQ05UCQkweDBlMQorCisvKiBSRVNFVCAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NISVBDTlRSTAkJMHgxMDAJLyogV08gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19FUkNPTkZJRwkJMHgxMDEKKworLyogQlVSU1QgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19CQVRDVVJSRU5UTElNSVQxMgkweDEwMgorI2RlZmluZSBJTlRFTF9NU0lDX0JBVFRJTUVMSU1JVDEyCTB4MTAzCisjZGVmaW5lIElOVEVMX01TSUNfQkFUVElNRUxJTUlUMwkweDEwNAorI2RlZmluZSBJTlRFTF9NU0lDX0JBVFRJTUVEQgkJMHgxMDUKKyNkZWZpbmUgSU5URUxfTVNJQ19CUlNUQ09ORklHT1VUUFVUUwkweDEwNgorI2RlZmluZSBJTlRFTF9NU0lDX0JSU1RDT05GSUdBQ1RJT05TCTB4MTA3CisjZGVmaW5lIElOVEVMX01TSUNfQlVSU1RDT05UUk9MU1RBVFVTCTB4MTA4CisKKy8qIFJUQyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IxCQkweDE0MAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IyCQkweDE0MQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0IzCQkweDE0MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0I0CQkweDE0MwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ09CMQkJMHgxNDQKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENPQjIJCTB4MTQ1CisjZGVmaW5lIElOVEVMX01TSUNfUlRDT0IzCQkweDE0NgorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ09CNAkJMHgxNDcKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENBQjEJCTB4MTQ4CisjZGVmaW5lIElOVEVMX01TSUNfUlRDQUIyCQkweDE0OQorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0FCMwkJMHgxNGEKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENBQjQJCTB4MTRiCisjZGVmaW5lIElOVEVMX01TSUNfUlRDV0FCMQkJMHgxNGMKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENXQUIyCQkweDE0ZAorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ1dBQjMJCTB4MTRlCisjZGVmaW5lIElOVEVMX01TSUNfUlRDV0FCNAkJMHgxNGYKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENTQzEJCTB4MTUwCisjZGVmaW5lIElOVEVMX01TSUNfUlRDU0MyCQkweDE1MQorI2RlZmluZSBJTlRFTF9NU0lDX1JUQ1NDMwkJMHgxNTIKKyNkZWZpbmUgSU5URUxfTVNJQ19SVENTQzQJCTB4MTUzCisjZGVmaW5lIElOVEVMX01TSUNfUlRDU1RBVFVTCQkweDE1NAkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1JUQ0NPTkZJRzEJCTB4MTU1CisjZGVmaW5lIElOVEVMX01TSUNfUlRDQ09ORklHMgkJMHgxNTYKKworLyogQ0hBUkdFUiAqLworI2RlZmluZSBJTlRFTF9NU0lDX0JEVElNRVIJCTB4MTgwCisjZGVmaW5lIElOVEVMX01TSUNfQkFUVFJNVgkJMHgxODEKKyNkZWZpbmUgSU5URUxfTVNJQ19WQlVTREVUCQkweDE4MgorI2RlZmluZSBJTlRFTF9NU0lDX1ZCVVNERVQxCQkweDE4MworI2RlZmluZSBJTlRFTF9NU0lDX0FEUEhWREVUCQkweDE4NAorI2RlZmluZSBJTlRFTF9NU0lDX0FEUExWREVUCQkweDE4NQorI2RlZmluZSBJTlRFTF9NU0lDX0FEUERFVERCRE0JCTB4MTg2CisjZGVmaW5lIElOVEVMX01TSUNfTE9XQkFUVERFVAkJMHgxODcKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJDVFJMCQkweDE4OAorI2RlZmluZSBJTlRFTF9NU0lDX0NIUkNWT0xUQUdFCQkweDE4OQorI2RlZmluZSBJTlRFTF9NU0lDX0NIUkNDVVJSRU5UCQkweDE4YQorI2RlZmluZSBJTlRFTF9NU0lDX1NQQ0hBUkdFUgkJMHgxOGIKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJUVElNRQkJMHgxOGMKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJDVFJMMQkJMHgxOGQKKyNkZWZpbmUgSU5URUxfTVNJQ19QV1JTUkNMTVQJCTB4MThlCisjZGVmaW5lIElOVEVMX01TSUNfQ0hSU1RXRFQJCTB4MThmCisjZGVmaW5lIElOVEVMX01TSUNfV0RUV1JJVEUJCTB4MTkwCS8qIFdPICovCisjZGVmaW5lIElOVEVMX01TSUNfQ0hSU0FGRUxNVAkJMHgxOTEKKyNkZWZpbmUgSU5URUxfTVNJQ19TUFdSU1JDSU5UCQkweDE5MgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX1NQV1JTUkNJTlQxCQkweDE5MwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NIUkxFRFBXTQkJMHgxOTQKKyNkZWZpbmUgSU5URUxfTVNJQ19DSFJMRURDVFJMCQkweDE5NQorCisvKiBBREMgKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQ05UTDEJCTB4MWMwCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUNOVEwyCQkweDFjMQorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFDTlRMMwkJMHgxYzIKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxT0ZGU0VUSAkJMHgxYzMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxT0ZGU0VUTAkJMHgxYzQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjAJCTB4MWM1CisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxCQkweDFjNgorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSMgkJMHgxYzcKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjMJCTB4MWM4CisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFI0CQkweDFjOQorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSNQkJMHgxY2EKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjYJCTB4MWNiCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFI3CQkweDFjYworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSOAkJMHgxY2QKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjkJCTB4MWNlCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxMAkJMHgxY2YKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjExCQkweDFkMAorI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFBRERSMTIJCTB4MWQxCisjZGVmaW5lIElOVEVMX01TSUNfQURDMUFERFIxMwkJMHgxZDIKKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQUREUjE0CQkweDFkMworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMwSAkJMHgxZDQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMEwJCTB4MWQ1CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzFICQkweDFkNgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxTAkJMHgxZDcJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMkgJCTB4MWQ4CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzJMCQkweDFkOQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMzSAkJMHgxZGEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TM0wJCTB4MWRiCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzRICQkweDFkYwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM0TAkJMHgxZGQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TNUgJCTB4MWRlCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzVMCQkweDFkZgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM2SAkJMHgxZTAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TNkwJCTB4MWUxCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzdICQkweDFlMgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM3TAkJMHgxZTMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TOEgJCTB4MWU0CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzhMCQkweDFlNQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlM5SAkJMHgxZTYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TOUwJCTB4MWU3CS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzEwSAkJMHgxZTgJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTBMCQkweDFlOQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxMUgJCTB4MWVhCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzExTAkJMHgxZWIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTJICQkweDFlYwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxMkwJCTB4MWVkCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzEzSAkJMHgxZWUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxU05TMTNMCQkweDFlZgkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0FEQzFTTlMxNEgJCTB4MWYwCS8qIFJPICovCisjZGVmaW5lIElOVEVMX01TSUNfQURDMVNOUzE0TAkJMHgxZjEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYwSAkJMHgxZjIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYwTAkJMHgxZjMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYxSAkJMHgxZjQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYxTAkJMHgxZjUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYySAkJMHgxZjYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYyTAkJMHgxZjcJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYzSAkJMHgxZjgJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQlYzTAkJMHgxZjkJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkwSAkJMHgxZmEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkwTAkJMHgxZmIJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkxSAkJMHgxZmMJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkxTAkJMHgxZmQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkySAkJMHgxZmUJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkyTAkJMHgxZmYJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkzSAkJMHgyMDAJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19BREMxQkkzTAkJMHgyMDEJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0NOVEwJCTB4MjAyCisjZGVmaW5lIElOVEVMX01TSUNfQ0NPRkZTRVRICQkweDIwMwkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NDT0ZGU0VUTAkJMHgyMDQJLyogUk8gKi8KKyNkZWZpbmUgSU5URUxfTVNJQ19DQ0FEQ0hBCQkweDIwNQkvKiBSTyAqLworI2RlZmluZSBJTlRFTF9NU0lDX0NDQURDTEEJCTB4MjA2CS8qIFJPICovCisKKy8qIEFVRElPICovCisjZGVmaW5lIElOVEVMX01TSUNfQVVEUExMQ1RSTAkJMHgyNDAKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDQlVGMDEyMwkJMHgyNDEKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDQlVGNDUJCTB4MjQyCisjZGVmaW5lIElOVEVMX01TSUNfRE1JQ0dQTwkJMHgyNDQKKyNkZWZpbmUgSU5URUxfTVNJQ19ETUlDTVVYCQkweDI0NQorI2RlZmluZSBJTlRFTF9NU0lDX0RNSUNDTEsJCTB4MjQ2CisjZGVmaW5lIElOVEVMX01TSUNfTUlDQklBUwkJMHgyNDcKKyNkZWZpbmUgSU5URUxfTVNJQ19BRENDT05GSUcJCTB4MjQ4CisjZGVmaW5lIElOVEVMX01TSUNfTUlDQU1QMQkJMHgyNDkKKyNkZWZpbmUgSU5URUxfTVNJQ19NSUNBTVAyCQkweDI0YQorI2RlZmluZSBJTlRFTF9NU0lDX05PSVNFTVVYCQkweDI0YgorI2RlZmluZSBJTlRFTF9NU0lDX0FVRElPTVVYMTIJCTB4MjRjCisjZGVmaW5lIElOVEVMX01TSUNfQVVESU9NVVgzNAkJMHgyNGQKKyNkZWZpbmUgSU5URUxfTVNJQ19BVURJT1NJTkMJCTB4MjRlCisjZGVmaW5lIElOVEVMX01TSUNfQVVESU9UWEVOCQkweDI0ZgorI2RlZmluZSBJTlRFTF9NU0lDX0hTRVBSWENUUkwJCTB4MjUwCisjZGVmaW5lIElOVEVMX01TSUNfSUhGUlhDVFJMCQkweDI1MQorI2RlZmluZSBJTlRFTF9NU0lDX1ZPSUNFVFhWT0wJCTB4MjUyCisjZGVmaW5lIElOVEVMX01TSUNfU0lERVRPTkVWT0wJCTB4MjUzCisjZGVmaW5lIElOVEVMX01TSUNfTVVTSUNTSEFSVk9MCQkweDI1NAorI2RlZmluZSBJTlRFTF9NU0lDX1ZPSUNFVFhDVFJMCQkweDI1NQorI2RlZmluZSBJTlRFTF9NU0lDX0hTTUlYRVIJCTB4MjU2CisjZGVmaW5lIElOVEVMX01TSUNfREFDQ09ORklHCQkweDI1NworI2RlZmluZSBJTlRFTF9NU0lDX1NPRlRNVVRFCQkweDI1OAorI2RlZmluZSBJTlRFTF9NU0lDX0hTTFZPTENUUkwJCTB4MjU5CisjZGVmaW5lIElOVEVMX01TSUNfSFNSVk9MQ1RSTAkJMHgyNWEKKyNkZWZpbmUgSU5URUxfTVNJQ19JSEZMVk9MQ1RSTAkJMHgyNWIKKyNkZWZpbmUgSU5URUxfTVNJQ19JSEZSVk9MQ1RSTAkJMHgyNWMKKyNkZWZpbmUgSU5URUxfTVNJQ19EUklWRVJFTgkJMHgyNWQKKyNkZWZpbmUgSU5URUxfTVNJQ19MSU5FT1VUQ1RSTAkJMHgyNWUKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIxQ1RSTDEJCTB4MjVmCisjZGVmaW5lIElOVEVMX01TSUNfVklCMUNUUkwyCQkweDI2MAorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjFDVFJMMwkJMHgyNjEKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIxU1BJUENNXzEJCTB4MjYyCisjZGVmaW5lIElOVEVMX01TSUNfVklCMVNQSVBDTV8yCQkweDI2MworI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjFDVFJMNQkJMHgyNjQKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIyQ1RSTDEJCTB4MjY1CisjZGVmaW5lIElOVEVMX01TSUNfVklCMkNUUkwyCQkweDI2NgorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjJDVFJMMwkJMHgyNjcKKyNkZWZpbmUgSU5URUxfTVNJQ19WSUIyU1BJUENNXzEJCTB4MjY4CisjZGVmaW5lIElOVEVMX01TSUNfVklCMlNQSVBDTV8yCQkweDI2OQorI2RlZmluZSBJTlRFTF9NU0lDX1ZJQjJDVFJMNQkJMHgyNmEKKyNkZWZpbmUgSU5URUxfTVNJQ19CVE5DVFJMMQkJMHgyNmIKKyNkZWZpbmUgSU5URUxfTVNJQ19CVE5DVFJMMgkJMHgyNmMKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xVFhTTE9UMDEJCTB4MjZkCisjZGVmaW5lIElOVEVMX01TSUNfUENNMVRYU0xPVDIzCQkweDI2ZQorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFUWFNMT1Q0NQkJMHgyNmYKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xUlhTTE9UMDEyMwkweDI3MAorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFSWFNMT1QwNDUJMHgyNzEKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yVFhTTE9UMDEJCTB4MjcyCisjZGVmaW5lIElOVEVMX01TSUNfUENNMlRYU0xPVDIzCQkweDI3MworI2RlZmluZSBJTlRFTF9NU0lDX1BDTTJUWFNMT1Q0NQkJMHgyNzQKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yUlhTTE9UMDEJCTB4Mjc1CisjZGVmaW5lIElOVEVMX01TSUNfUENNMlJYU0xPVDIzCQkweDI3NgorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTJSWFNMT1Q0NQkJMHgyNzcKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00xQ1RSTDEJCTB4Mjc4CisjZGVmaW5lIElOVEVMX01TSUNfUENNMUNUUkwyCQkweDI3OQorI2RlZmluZSBJTlRFTF9NU0lDX1BDTTFDVFJMMwkJMHgyN2EKKyNkZWZpbmUgSU5URUxfTVNJQ19QQ00yQ1RSTDEJCTB4MjdiCisjZGVmaW5lIElOVEVMX01TSUNfUENNMkNUUkwyCQkweDI3YworCisvKiBIRE1JICovCisjZGVmaW5lIElOVEVMX01TSUNfSERNSVBVRU4JCTB4MjgwCisjZGVmaW5lIElOVEVMX01TSUNfSERNSVNUQVRVUwkJMHgyODEJLyogUk8gKi8KKworLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIE1TSUMgaW50ZXJydXB0IHRyZWUgaW4gU1JBTSAqLworI2RlZmluZSBJTlRFTF9NU0lDX0lSUV9QSFlTX0JBU0UJMHhmZmZmN2ZjMAorCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX2dwaW9fcGRhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBHUElPIGRyaXZlcgorICogQGdwaW9fYmFzZTogYmFzZSBudW1iZXIgZm9yIHRoZSBHUElPcworICovCitzdHJ1Y3QgaW50ZWxfbXNpY19ncGlvX3BkYXRhIHsKKwl1bnNpZ25lZAlncGlvX2Jhc2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX29jZF9wZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBNU0lDIE9DRCBkcml2ZXIKKyAqIEBncGlvOiBHUElPIG51bWJlciB1c2VkIGZvciBPQ0QgaW50ZXJydXB0cworICoKKyAqIFRoZSBNU0lDIE1GRCBkcml2ZXIgY29udmVydHMgQGdwaW8gaW50byBhbiBJUlEgbnVtYmVyIGFuZCBwYXNzZXMgaXQgdG8KKyAqIHRoZSBPQ0QgZHJpdmVyIGFzICVJT1JFU09VUkNFX0lSUS4KKyAqLworc3RydWN0IGludGVsX21zaWNfb2NkX3BkYXRhIHsKKwl1bnNpZ25lZAlncGlvOworfTsKKworLyogTVNJQyBlbWJlZGRlZCBibG9ja3MgKHN1YmRldmljZXMpICovCitlbnVtIGludGVsX21zaWNfYmxvY2sgeworCUlOVEVMX01TSUNfQkxPQ0tfVE9VQ0gsCisJSU5URUxfTVNJQ19CTE9DS19BREMsCisJSU5URUxfTVNJQ19CTE9DS19CQVRURVJZLAorCUlOVEVMX01TSUNfQkxPQ0tfR1BJTywKKwlJTlRFTF9NU0lDX0JMT0NLX0FVRElPLAorCUlOVEVMX01TSUNfQkxPQ0tfSERNSSwKKwlJTlRFTF9NU0lDX0JMT0NLX1RIRVJNQUwsCisJSU5URUxfTVNJQ19CTE9DS19QT1dFUl9CVE4sCisJSU5URUxfTVNJQ19CTE9DS19PQ0QsCisKKwlJTlRFTF9NU0lDX0JMT0NLX0xBU1QsCit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9tc2ljX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBkcml2ZXIKKyAqIEBpcnE6IGFycmF5IG9mIGludGVycnVwdCBudW1iZXJzLCBvbmUgcGVyIGRldmljZS4gSWYgQGlycSBpcyBzZXQgdG8gJTAKKyAqCSBmb3IgYSBnaXZlbiBibG9jaywgdGhlIGNvcnJlc3BvbmRpbmcgcGxhdGZvcm0gZGV2aWNlIGlzIG5vdAorICoJIGNyZWF0ZWQuIEZvciBkZXZpY2VzIHdoaWNoIGRvbid0IGhhdmUgYW4gaW50ZXJydXB0LCB1c2UgJTB4ZmYKKyAqCSAodGhpcyBpcyBzYW1lIGFzIGluIFNGSSBzcGVjKS4KKyAqIEBncGlvOiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgTVNJQyBHUElPIGRyaXZlcgorICogQG9jZDogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIE1TSUMgT0NEIGRyaXZlcgorICoKKyAqIE9uY2UgdGhlIE1TSUMgZHJpdmVyIGlzIGluaXRpYWxpemVkLCB0aGUgcmVnaXN0ZXIgaW50ZXJmYWNlIGlzIHJlYWR5IHRvCisgKiB1c2UuIEFsbCB0aGUgcGxhdGZvcm0gZGV2aWNlcyBmb3Igc3ViZGV2aWNlcyBhcmUgY3JlYXRlZCBhZnRlciB0aGUKKyAqIHJlZ2lzdGVyIGludGVyZmFjZSBpcyByZWFkeSBzbyB0aGF0IHdlIGNhbiBndWFyYW50ZWUgaXRzIGF2YWlsYWJpbGl0eSB0bworICogdGhlIHN1YmRldmljZSBkcml2ZXJzLgorICoKKyAqIEludGVycnVwdCBudW1iZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHN1YmRldmljZXMgdmlhICVJT1JFU09VUkNFX0lSUQorICogcmVzb3VyY2VzIG9mIHRoZSBjcmVhdGVkIHBsYXRmb3JtIGRldmljZS4KKyAqLworc3RydWN0IGludGVsX21zaWNfcGxhdGZvcm1fZGF0YSB7CisJaW50CQkJCWlycVtJTlRFTF9NU0lDX0JMT0NLX0xBU1RdOworCXN0cnVjdCBpbnRlbF9tc2ljX2dwaW9fcGRhdGEJKmdwaW87CisJc3RydWN0IGludGVsX21zaWNfb2NkX3BkYXRhCSpvY2Q7Cit9OworCitzdHJ1Y3QgaW50ZWxfbXNpYzsKKworZXh0ZXJuIGludCBpbnRlbF9tc2ljX3JlZ19yZWFkKHVuc2lnbmVkIHNob3J0IHJlZywgdTggKnZhbCk7CitleHRlcm4gaW50IGludGVsX21zaWNfcmVnX3dyaXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdTggdmFsKTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19yZWdfdXBkYXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdTggdmFsLCB1OCBtYXNrKTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19idWxrX3JlYWQodW5zaWduZWQgc2hvcnQgKnJlZywgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19idWxrX3dyaXRlKHVuc2lnbmVkIHNob3J0ICpyZWcsIHU4ICpidWYsIHNpemVfdCBjb3VudCk7CisKKy8qCisgKiBwZGV2X3RvX2ludGVsX21zaWMgLSBnZXRzIGFuIE1TSUMgaW5zdGFuY2UgZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBUaGUgY2xpZW50IGRyaXZlcnMgbmVlZCB0byBoYXZlIHBvaW50ZXIgdG8gdGhlIE1TSUMgaW5zdGFuY2UgaWYgdGhleQorICogd2FudCB0byBjYWxsIGludGVsX21zaWNfaXJxX3JlYWQoKS4gVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBmb3IKKyAqIGNvbnZlbmllbmNlIHRvIGdldCB0aGUgTVNJQyBwb2ludGVyIGZyb20gQHBkZXYgd2hlcmUgbmVlZGVkLiBUaGlzIGlzCisgKiBfb25seV8gdmFsaWQgZm9yIGRldmljZXMgd2hpY2ggYXJlIG1hbmFnZWQgYnkgdGhlIE1TSUMuCisgKi8KKyNkZWZpbmUgcGRldl90b19pbnRlbF9tc2ljKHBkZXYpCShkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCkpCisKK2V4dGVybiBpbnQgaW50ZWxfbXNpY19pcnFfcmVhZChzdHJ1Y3QgaW50ZWxfbXNpYyAqbXNpYywgdW5zaWduZWQgc2hvcnQgcmVnLAorCQkJICAgICAgIHU4ICp2YWwpOworCisjZW5kaWYgLyogX19MSU5VWF9NRkRfSU5URUxfTVNJQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTctcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKaW5kZXggNWZmMjQwMC4uM2Y0ZGViNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmgKQEAgLTMyNiw3ICszMjYsNiBAQAogCWludCBpcnE7CiAJaW50IG9ubzsKIAlpbnQgaXJxX2Jhc2U7Ci0JYm9vbCB3YWtldXA7CiAJc3RydWN0IG11dGV4IGlycWxvY2s7CiAJaW50IGlycV9tYXNrc19jdXJbTUFYODk5N19JUlFfR1JPVVBfTlJdOwogCWludCBpcnFfbWFza3NfY2FjaGVbTUFYODk5N19JUlFfR1JPVVBfTlJdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oCmluZGV4IDdkMGYzZDYuLmE4ZWVkYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLmgKQEAgLTEyLDExNyArMTIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbWZkL21jMTN4eHguaD4KIAotc3RydWN0IG1jMTM3ODM7Ci0KLXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzX3RvX21jMTN4eHgoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWMxMzc4M19sb2NrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzKQotewotCW1jMTN4eHhfbG9jayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWMxMzc4M191bmxvY2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMpCi17Ci0JbWMxM3h4eF91bmxvY2sobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19yZWdfcmVhZChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywKLQkJdW5zaWduZWQgaW50IG9mZnNldCwgdTMyICp2YWwpCi17Ci0JcmV0dXJuIG1jMTN4eHhfcmVnX3JlYWQobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpLCBvZmZzZXQsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfcmVnX3dyaXRlKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1MzIgdmFsKQotewotCXJldHVybiBtYzEzeHh4X3JlZ193cml0ZShtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIG9mZnNldCwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19yZWdfcm13KHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLAotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1MzIgbWFzaywgdTMyIHZhbCkKLXsKLQlyZXR1cm4gbWMxM3h4eF9yZWdfcm13KG1jMTM3ODNfdG9fbWMxM3h4eChtYzEzNzgzKSwgb2Zmc2V0LCBtYXNrLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2dldF9mbGFncyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MykKLXsKLQlyZXR1cm4gbWMxM3h4eF9nZXRfZmxhZ3MobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19pcnFfcmVxdWVzdChzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKLQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkZXYpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX3JlcXVlc3QobWMxMzc4M190b19tYzEzeHh4KG1jMTM3ODMpLCBpcnEsCi0JCQloYW5kbGVyLCBuYW1lLCBkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2lycV9yZXF1ZXN0X25vdW5tYXNrKHN0cnVjdCBtYzEzNzgzICptYzEzNzgzLCBpbnQgaXJxLAotCQlpcnFfaGFuZGxlcl90IGhhbmRsZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRldikKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfcmVxdWVzdF9ub3VubWFzayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSwKLQkJCWhhbmRsZXIsIG5hbWUsIGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX2ZyZWUoc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEsIHZvaWQgKmRldikKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfZnJlZShtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSwgZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbWMxMzc4M19pcnFfbWFzayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSkKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfbWFzayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX3VubWFzayhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSkKLXsKLQlyZXR1cm4gbWMxM3h4eF9pcnFfdW5tYXNrKG1jMTM3ODNfdG9fbWMxM3h4eChtYzEzNzgzKSwgaXJxKTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IG1jMTM3ODNfaXJxX3N0YXR1cyhzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MywgaW50IGlycSwKLQkJaW50ICplbmFibGVkLCBpbnQgKnBlbmRpbmcpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX3N0YXR1cyhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksCi0JCQlpcnEsIGVuYWJsZWQsIHBlbmRpbmcpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtYzEzNzgzX2lycV9hY2soc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIGludCBpcnEpCi17Ci0JcmV0dXJuIG1jMTN4eHhfaXJxX2FjayhtYzEzNzgzX3RvX21jMTN4eHgobWMxMzc4MyksIGlycSk7Ci19Ci0KLSNkZWZpbmUgTUMxMzc4M19BREMwCQk0MwotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURSRUZFTgkJKDEgPDwgMTApCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9BRFJFRk1PREUJCSgxIDw8IDExKQotI2RlZmluZSBNQzEzNzgzX0FEQzBfVFNNT0QwCQkoMSA8PCAxMikKLSNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EMQkJKDEgPDwgMTMpCi0jZGVmaW5lIE1DMTM3ODNfQURDMF9UU01PRDIJCSgxIDw8IDE0KQotI2RlZmluZSBNQzEzNzgzX0FEQzBfQURJTkMxCQkoMSA8PCAxNikKLSNkZWZpbmUgTUMxMzc4M19BREMwX0FESU5DMgkJKDEgPDwgMTcpCi0KLSNkZWZpbmUgTUMxMzc4M19BREMwX1RTTU9EX01BU0sJCShNQzEzNzgzX0FEQzBfVFNNT0QwIHwgXAotCQkJCQlNQzEzNzgzX0FEQzBfVFNNT0QxIHwgXAotCQkJCQlNQzEzNzgzX0FEQzBfVFNNT0QyKQotCi0jZGVmaW5lIG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSBtYzEzeHh4X3JlZ3VsYXRvcl9pbml0X2RhdGEKLSNkZWZpbmUgbWMxMzc4M19yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhCi0jZGVmaW5lIG1jMTM3ODNfbGVkX3BsYXRmb3JtX2RhdGEgbWMxM3h4eF9sZWRfcGxhdGZvcm1fZGF0YQotI2RlZmluZSBtYzEzNzgzX2xlZHNfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X2xlZHNfcGxhdGZvcm1fZGF0YQotCi0jZGVmaW5lIG1jMTM3ODNfcGxhdGZvcm1fZGF0YSBtYzEzeHh4X3BsYXRmb3JtX2RhdGEKLSNkZWZpbmUgTUMxMzc4M19VU0VfVE9VQ0hTQ1JFRU4JTUMxM1hYWF9VU0VfVE9VQ0hTQ1JFRU4KLSNkZWZpbmUgTUMxMzc4M19VU0VfQ09ERUMJTUMxM1hYWF9VU0VfQ09ERUMKLSNkZWZpbmUgTUMxMzc4M19VU0VfQURDCQlNQzEzWFhYX1VTRV9BREMKLSNkZWZpbmUgTUMxMzc4M19VU0VfUlRDCQlNQzEzWFhYX1VTRV9SVEMKLSNkZWZpbmUgTUMxMzc4M19VU0VfUkVHVUxBVE9SCU1DMTNYWFhfVVNFX1JFR1VMQVRPUgotI2RlZmluZSBNQzEzNzgzX1VTRV9MRUQJCU1DMTNYWFhfVVNFX0xFRAotCi0jZGVmaW5lIE1DMTM3ODNfQURDX01PREVfVFMJCTEKLSNkZWZpbmUgTUMxMzc4M19BRENfTU9ERV9TSU5HTEVfQ0hBTgkyCi0jZGVmaW5lIE1DMTM3ODNfQURDX01PREVfTVVMVF9DSEFOCTMKLQotaW50IG1jMTM3ODNfYWRjX2RvX2NvbnZlcnNpb24oc3RydWN0IG1jMTM3ODMgKm1jMTM3ODMsIHVuc2lnbmVkIGludCBtb2RlLAotCQl1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50ICpzYW1wbGUpOwotCi0KICNkZWZpbmUJTUMxMzc4M19SRUdfU1cxQQkJMAogI2RlZmluZQlNQzEzNzgzX1JFR19TVzFCCQkxCiAjZGVmaW5lCU1DMTM3ODNfUkVHX1NXMkEJCTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21jMTN4eHguaCBiL2luY2x1ZGUvbGludXgvbWZkL21jMTN4eHguaAppbmRleCBjMDY0YmVhLi4zODE2YzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzeHh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxM3h4eC5oCkBAIC0zNyw2ICszNyw5IEBACiAKIGludCBtYzEzeHh4X2dldF9mbGFncyhzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCk7CiAKK2ludCBtYzEzeHh4X2FkY19kb19jb252ZXJzaW9uKHN0cnVjdCBtYzEzeHh4ICptYzEzeHh4LAorCQl1bnNpZ25lZCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCAqc2FtcGxlKTsKKwogI2RlZmluZSBNQzEzWFhYX0lSUV9BRENET05FCTAKICNkZWZpbmUgTUMxM1hYWF9JUlFfQURDQklTRE9ORQkxCiAjZGVmaW5lIE1DMTNYWFhfSVJRX1RTCQkyCkBAIC0xMzcsMTcgKzE0MCw0OCBAQAogCWNoYXIgdGMzX3BlcmlvZDsKIH07CiAKK3N0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSB7CisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfME1TCQkwCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfMzBNUwkxCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX0RCTkNfMTUwTVMJMgorI2RlZmluZSBNQzEzNzgzX0JVVFRPTl9EQk5DXzc1ME1TCTMKKyNkZWZpbmUgTUMxMzc4M19CVVRUT05fRU5BQkxFCQkoMSA8PCAyKQorI2RlZmluZSBNQzEzNzgzX0JVVFRPTl9QT0xfSU5WRVJUCSgxIDw8IDMpCisjZGVmaW5lIE1DMTM3ODNfQlVUVE9OX1JFU0VUX0VOCQkoMSA8PCA0KQorCWludCBiMW9uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIxb25fa2V5OworCWludCBiMm9uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIyb25fa2V5OworCWludCBiM29uX2ZsYWdzOworCXVuc2lnbmVkIHNob3J0IGIzb25fa2V5OworfTsKKwogc3RydWN0IG1jMTN4eHhfcGxhdGZvcm1fZGF0YSB7CiAjZGVmaW5lIE1DMTNYWFhfVVNFX1RPVUNIU0NSRUVOICgxIDw8IDApCiAjZGVmaW5lIE1DMTNYWFhfVVNFX0NPREVDCSgxIDw8IDEpCiAjZGVmaW5lIE1DMTNYWFhfVVNFX0FEQwkJKDEgPDwgMikKICNkZWZpbmUgTUMxM1hYWF9VU0VfUlRDCQkoMSA8PCAzKQotI2RlZmluZSBNQzEzWFhYX1VTRV9SRUdVTEFUT1IJKDEgPDwgNCkKLSNkZWZpbmUgTUMxM1hYWF9VU0VfTEVECQkoMSA8PCA1KQogCXVuc2lnbmVkIGludCBmbGFnczsKIAogCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhIHJlZ3VsYXRvcnM7CiAJc3RydWN0IG1jMTN4eHhfbGVkc19wbGF0Zm9ybV9kYXRhICpsZWRzOworCXN0cnVjdCBtYzEzeHh4X2J1dHRvbnNfcGxhdGZvcm1fZGF0YSAqYnV0dG9uczsKIH07CiAKKyNkZWZpbmUgTUMxM1hYWF9BRENfTU9ERV9UUwkJMQorI2RlZmluZSBNQzEzWFhYX0FEQ19NT0RFX1NJTkdMRV9DSEFOCTIKKyNkZWZpbmUgTUMxM1hYWF9BRENfTU9ERV9NVUxUX0NIQU4JMworCisjZGVmaW5lIE1DMTNYWFhfQURDMAkJNDMKKyNkZWZpbmUgTUMxM1hYWF9BREMwX0FEUkVGRU4JCSgxIDw8IDEwKQorI2RlZmluZSBNQzEzWFhYX0FEQzBfVFNNT0QwCQkoMSA8PCAxMikKKyNkZWZpbmUgTUMxM1hYWF9BREMwX1RTTU9EMQkJKDEgPDwgMTMpCisjZGVmaW5lIE1DMTNYWFhfQURDMF9UU01PRDIJCSgxIDw8IDE0KQorI2RlZmluZSBNQzEzWFhYX0FEQzBfQURJTkMxCQkoMSA8PCAxNikKKyNkZWZpbmUgTUMxM1hYWF9BREMwX0FESU5DMgkJKDEgPDwgMTcpCisKKyNkZWZpbmUgTUMxM1hYWF9BREMwX1RTTU9EX01BU0sJCShNQzEzWFhYX0FEQzBfVFNNT0QwIHwgXAorCQkJCQlNQzEzWFhYX0FEQzBfVFNNT0QxIHwgXAorCQkJCQlNQzEzWFhYX0FEQzBfVFNNT0QyKQorCiAjZW5kaWYgLyogaWZuZGVmIF9fTElOVVhfTUZEX01DMTNYWFhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvY29yZS5oCmluZGV4IDUwZDRhMDQuLmE4MDg0MDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvYmFja2xpZ2h0Lmg+CiAKIHN0cnVjdCBwY2Y1MDYzMzsKK3N0cnVjdCByZWdtYXA7CiAKICNkZWZpbmUgUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMJMTEKIApAQCAtMTM0LDcgKzEzNSw3IEBACiAKIHN0cnVjdCBwY2Y1MDYzMyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAogCXN0cnVjdCBwY2Y1MDYzM19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlpbnQgaXJxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU4NnguaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1ODZ4LmgKaW5kZXggYjZiYWIxYi4uYjE5MTc2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU4NnguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTg2eC5oCkBAIC0xLDYgKzEsMTggQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfVFBTNjU4NlhfSAogI2RlZmluZSBfX0xJTlVYX01GRF9UUFM2NTg2WF9ICiAKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFX0lOU1RBTlRMWQkweDAwCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8xMTBVVgkweDAxCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8yMjBVVgkweDAyCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV80NDBVVgkweDAzCisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV84ODBVVgkweDA0CisjZGVmaW5lIFRQUzY1ODZYX1NMRVdfUkFURV8xNzYwVVYJMHgwNQorI2RlZmluZSBUUFM2NTg2WF9TTEVXX1JBVEVfMzUyMFVWCTB4MDYKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFXzcwNDBVVgkweDA3CisKKyNkZWZpbmUgVFBTNjU4NlhfU0xFV19SQVRFX1NFVAkJMHgwOAorI2RlZmluZSBUUFM2NTg2WF9TTEVXX1JBVEVfTUFTSyAgICAgICAgIDB4MDcKKwogZW51bSB7CiAJVFBTNjU4NlhfSURfU01fMCwKIAlUUFM2NTg2WF9JRF9TTV8xLApAQCAtNDgsNiArNjAsMTAgQEAKIAlUUFM2NTg2WF9JTlRfUlRDX0FMTTIsCiB9OwogCitzdHJ1Y3QgdHBzNjU4Nnhfc2V0dGluZ3MgeworCWludCBzbGV3X3JhdGU7Cit9OworCiBzdHJ1Y3QgdHBzNjU4Nnhfc3ViZGV2X2luZm8gewogCWludAkJaWQ7CiAJY29uc3QgY2hhcgkqbmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaAppbmRleCA0YzgwNmY2Li4yNDYzYzI2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHdsNjA0MC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaApAQCAtNjgsMTEgKzY4LDYgQEAKICNkZWZpbmUgVFdMNjA0MF9SRUdfQUNDQ1RMCQkweDJECiAjZGVmaW5lIFRXTDYwNDBfUkVHX1NUQVRVUwkJMHgyRQogCi0jZGVmaW5lIFRXTDYwNDBfQ0FDSEVSRUdOVU0JCShUV0w2MDQwX1JFR19TVEFUVVMgKyAxKQotCi0jZGVmaW5lIFRXTDYwNDBfVklPUkVHTlVNCQkxOAotI2RlZmluZSBUV0w2MDQwX1ZERFJFR05VTQkJMjEKLQogLyogSU5USUQgKDB4MDMpIGZpZWxkcyAqLwogCiAjZGVmaW5lIFRXTDYwNDBfVEhJTlQJCQkweDAxCkBAIC0xMjUsMzQgKzEyMCwyNCBAQAogI2RlZmluZSBUV0w2MDQwX0xQTExGSU4JCQkweDA4CiAjZGVmaW5lIFRXTDYwNDBfSFBMTFNFTAkJCTB4MTAKIAotLyogSFNMQ1RMICgweDEwKSBmaWVsZHMgKi8KKy8qIEhTTENUTC9SICgweDEwLzB4MTEpIGZpZWxkcyAqLwogCi0jZGVmaW5lIFRXTDYwNDBfSFNEQUNNT0RFTAkJMHgwMgotI2RlZmluZSBUV0w2MDQwX0hTRFJWTU9ERUwJCTB4MDgKKyNkZWZpbmUgVFdMNjA0MF9IU0RBQ0VOQQkJKDEgPDwgMCkKKyNkZWZpbmUgVFdMNjA0MF9IU0RBQ01PREUJCSgxIDw8IDEpCisjZGVmaW5lIFRXTDYwNDBfSFNEUlZNT0RFCQkoMSA8PCAzKQogCi0vKiBIU1JDVEwgKDB4MTEpIGZpZWxkcyAqLworLyogVklCQ1RMTC9SICgweDE4LzB4MUEpIGZpZWxkcyAqLwogCi0jZGVmaW5lIFRXTDYwNDBfSFNEQUNNT0RFUgkJMHgwMgotI2RlZmluZSBUV0w2MDQwX0hTRFJWTU9ERVIJCTB4MDgKKyNkZWZpbmUgVFdMNjA0MF9WSUJFTkEJCQkoMSA8PCAwKQorI2RlZmluZSBUV0w2MDQwX1ZJQlNFTAkJCSgxIDw8IDEpCisjZGVmaW5lIFRXTDYwNDBfVklCQ1RSTAkJCSgxIDw8IDIpCisjZGVmaW5lIFRXTDYwNDBfVklCQ1RSTF9QCQkoMSA8PCAzKQorI2RlZmluZSBUV0w2MDQwX1ZJQkNUUkxfTgkJKDEgPDwgNCkKIAotLyogVklCQ1RMTCAoMHgxOCkgZmllbGRzICovCi0KLSNkZWZpbmUgVFdMNjA0MF9WSUJFTkFMCQkJMHgwMQotI2RlZmluZSBUV0w2MDQwX1ZJQkNUUkxMCQkweDA0Ci0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTExQCQkweDA4Ci0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTExOCQkweDEwCi0KLS8qIFZJQkRBVEwgKDB4MTkpIGZpZWxkcyAqLworLyogVklCREFUTC9SICgweDE5LzB4MUIpIGZpZWxkcyAqLwogCiAjZGVmaW5lIFRXTDYwNDBfVklCREFUX01BWAkJMHg2NAogCi0vKiBWSUJDVExSICgweDFBKSBmaWVsZHMgKi8KLQotI2RlZmluZSBUV0w2MDQwX1ZJQkVOQVIJCQkweDAxCi0jZGVmaW5lIFRXTDYwNDBfVklCQ1RSTFIJCTB4MDQKLSNkZWZpbmUgVFdMNjA0MF9WSUJDVFJMUlAJCTB4MDgKLSNkZWZpbmUgVFdMNjA0MF9WSUJDVFJMUk4JCTB4MTAKLQogLyogR1BPQ1RMICgweDFFKSBmaWVsZHMgKi8KIAogI2RlZmluZSBUV0w2MDQwX0dQTzEJCQkweDAxCkBAIC0yMDAsNiArMTg1LDcgQEAKIAlpbnQgYXVkcHdyb247CiAJaW50IHBvd2VyX2NvdW50OwogCWludCByZXY7CisJdTggdmlicmFfY3RybF9jYWNoZVsyXTsKIAogCWludCBwbGw7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKQEAgLTIyNCw1ICsyMTAsMTMgQEAKIHVuc2lnbmVkIGludCB0d2w2MDQwX2dldF9zeXNjbGsoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOwogaW50IHR3bDYwNDBfaXJxX2luaXQoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOwogdm9pZCB0d2w2MDQwX2lycV9leGl0KHN0cnVjdCB0d2w2MDQwICp0d2w2MDQwKTsKKy8qIEdldCB0aGUgY29tYmluZWQgc3RhdHVzIG9mIHRoZSB2aWJyYSBjb250cm9sIHJlZ2lzdGVyICovCitpbnQgdHdsNjA0MF9nZXRfdmlicmFscl9zdGF0dXMoc3RydWN0IHR3bDYwNDAgKnR3bDYwNDApOworCitzdGF0aWMgaW5saW5lIGludCB0d2w2MDQwX2dldF9yZXZpZChzdHJ1Y3QgdHdsNjA0MCAqdHdsNjA0MCkKK3sKKwlyZXR1cm4gdHdsNjA0MC0+cmV2OworfQorCiAKICNlbmRpZiAgLyogRW5kIG9mIF9fVFdMNjA0MF9DT0RFQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCmluZGV4IGVkOGZlMGQuLjRiMTIxMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaApAQCAtMzgyLDYgKzM4Miw3IEBACiAKIAkvKiBVc2VkIGJ5IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBjb2RlIHRvIHBvc3Qgd3JpdGVzICovCiAJaW50IGdwaW9fdXBkYXRlW1dNODMxWF9OVU1fR1BJT19SRUdTXTsKKwlib29sIGdwaW9fbGV2ZWxbV004MzFYX05VTV9HUElPX1JFR1NdOwogCiAJc3RydWN0IG11dGV4IGF1eGFkY19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYXV4YWRjX3BlbmRpbmc7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L2NvcmUuaAppbmRleCA0NWRmNDUwLi5mNDRiZGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9jb3JlLmgKQEAgLTIwLDYgKzIwLDcgQEAKIGVudW0gd204OTk0X3R5cGUgewogCVdNODk5NCA9IDAsCiAJV004OTU4ID0gMSwKKwlXTTE4MTEgPSAyLAogfTsKIAogc3RydWN0IHJlZ3VsYXRvcl9kZXY7CkBAIC01OCw2ICs1OSw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAorCWJvb2wgbGRvX2VuYV9hbHdheXNfZHJpdmVuOworCiAJaW50IGdwaW9fYmFzZTsKIAlpbnQgaXJxX2Jhc2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKaW5kZXggOTdjZjRmMi4uZWEzMmYzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3BkYXRhLmgKQEAgLTE2Nyw2ICsxNjcsMTMgQEAKIAogCS8qIFdNODk1OCBtaWNyb3Bob25lIGJpYXMgY29uZmlndXJhdGlvbiAqLwogCWludCBtaWNiaWFzWzJdOworCisJLyogRGlzYWJsZSB0aGUgaW50ZXJuYWwgcHVsbCBkb3ducyBvbiB0aGUgTERPcyBpZiB0aGV5IGFyZQorCSAqIGFsd2F5cyBkcml2ZW4gKGVnLCBjb25uZWN0ZWQgdG8gYW4gYWx3YXlzIG9uIHN1cHBseSBvcgorCSAqIEdQSU8gdGhhdCBhbHdheXMgZHJpdmVzIGFuIG91dHB1dC4gIElmIHRoZXkgZmxvYXQgcG93ZXIKKwkgKiBjb25zdW1wdGlvbiB3aWxsIHJpc2UuCisJICovCisJYm9vbCBsZG9fZW5hX2Fsd2F5c19kcml2ZW47CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaAppbmRleCBmM2VlODQyLi44M2E5Y2FlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvcmVnaXN0ZXJzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3JlZ2lzdGVycy5oCkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT18yICAgICAgICAgICAgICAgICAgICAgICAweDU1CiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT180ICAgICAgICAgICAgICAgICAgICAgICAweDU3CiAjZGVmaW5lIFdNODk5NF9EQ19TRVJWT19SRUFEQkFDSyAgICAgICAgICAgICAgICAweDU4CisjZGVmaW5lIFdNODk5NF9EQ19TRVJWT180RQkJCTB4NTkKICNkZWZpbmUgV004OTk0X0FOQUxPR1VFX0hQXzEgICAgICAgICAgICAgICAgICAgIDB4NjAKICNkZWZpbmUgV004OTU4X01JQ19ERVRFQ1RfMSAgICAgICAgICAgICAgICAgICAgIDB4RDAKICNkZWZpbmUgV004OTU4X01JQ19ERVRFQ1RfMiAgICAgICAgICAgICAgICAgICAgIDB4RDEKQEAgLTEzMyw2ICsxMzQsOCBAQAogI2RlZmluZSBXTTg5OTRfQUlGMV9EQUMxX0ZJTFRFUlNfMiAgICAgICAgICAgICAgMHg0MjEKICNkZWZpbmUgV004OTk0X0FJRjFfREFDMl9GSUxURVJTXzEgICAgICAgICAgICAgIDB4NDIyCiAjZGVmaW5lIFdNODk5NF9BSUYxX0RBQzJfRklMVEVSU18yICAgICAgICAgICAgICAweDQyMworI2RlZmluZSBXTTg5NThfQUlGMV9EQUMxX05PSVNFX0dBVEUgICAgICAgICAgICAgMHg0MzAKKyNkZWZpbmUgV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFICAgICAgICAgICAgIDB4NDMxCiAjZGVmaW5lIFdNODk5NF9BSUYxX0RSQzFfMSAgICAgICAgICAgICAgICAgICAgICAweDQ0MAogI2RlZmluZSBXTTg5OTRfQUlGMV9EUkMxXzIgICAgICAgICAgICAgICAgICAgICAgMHg0NDEKICNkZWZpbmUgV004OTk0X0FJRjFfRFJDMV8zICAgICAgICAgICAgICAgICAgICAgIDB4NDQyCkBAIC0xOTAsNiArMTkzLDcgQEAKICNkZWZpbmUgV004OTk0X0FJRjJfQURDX0ZJTFRFUlMgICAgICAgICAgICAgICAgIDB4NTEwCiAjZGVmaW5lIFdNODk5NF9BSUYyX0RBQ19GSUxURVJTXzEgICAgICAgICAgICAgICAweDUyMAogI2RlZmluZSBXTTg5OTRfQUlGMl9EQUNfRklMVEVSU18yICAgICAgICAgICAgICAgMHg1MjEKKyNkZWZpbmUgV004OTU4X0FJRjJfREFDX05PSVNFX0dBVEUgICAgICAgICAgICAgIDB4NTMwCiAjZGVmaW5lIFdNODk5NF9BSUYyX0RSQ18xICAgICAgICAgICAgICAgICAgICAgICAweDU0MAogI2RlZmluZSBXTTg5OTRfQUlGMl9EUkNfMiAgICAgICAgICAgICAgICAgICAgICAgMHg1NDEKICNkZWZpbmUgV004OTk0X0FJRjJfRFJDXzMgICAgICAgICAgICAgICAgICAgICAgIDB4NTQyCkBAIC0xOTIxLDYgKzE5MjUsNTkgQEAKICNkZWZpbmUgV004OTk0X0xETzJfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMl9ESVNDSCAqLwogCiAvKgorICogUjYxICgweDNEKSAtIE1JQ0JJQVMxCisgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMV9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBNSUNCMV9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQ0IxX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IxX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTUlDQjFfTU9ERSAqLworI2RlZmluZSBXTTg5NThfTUlDQjFfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMV9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMEUgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1JQ0IxX0xWTCAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk1OF9NSUNCMV9ESVNDSF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0RJU0NIICovCisKKy8qCisgKiBSNjIgKDB4M0UpIC0gTUlDQklBUzIKKyAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IyX1JBVEUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIE1JQ0IyX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX01PREVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTUlDQjJfTU9ERSAqLworI2RlZmluZSBXTTg5NThfTUlDQjJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBNSUNCMl9NT0RFICovCisjZGVmaW5lIFdNODk1OF9NSUNCMl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IyX01PREUgKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwRSAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUlDQjJfTFZMIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTU4X01JQ0IyX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRElTQ0ggKi8KKworLyoKKyAqIFIyMTAgKDB4RDIpIC0gTWljIERldGVjdCAzCisgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDdGQyAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogTUlDRF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5NThfTUlDRF9WQUxJRF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNEX1ZBTElEICovCisjZGVmaW5lIFdNODk1OF9NSUNEX1ZBTElEX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfVkFMSURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5NThfTUlDRF9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNEX1NUUyAqLworCisvKgogICogUjc2ICgweDRDKSAtIENoYXJnZSBQdW1wICgxKQogICovCiAjZGVmaW5lIFdNODk5NF9DUF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENQX0VOQSAqLwpAQCAtMjAyNyw2ICsyMDg0LDEwIEBACiAvKgogICogUjk2ICgweDYwKSAtIEFuYWxvZ3VlIEhQICgxKQogICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTiAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9NQVNLICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEhQT1VUMV9BVFROICovCisjZGVmaW5lIFdNMTgxMV9IUE9VVDFfQVRUTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQT1VUMV9BVFROICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVCAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVF9NQVNLICAgICAgICAgICAweDAwODAgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCiAjZGVmaW5lIFdNODk5NF9IUE9VVDFMX1JNVl9TSE9SVF9TSElGVCAgICAgICAgICAgICAgIDcgIC8qIEhQT1VUMUxfUk1WX1NIT1JUICovCkBAIC0yOTQ5LDYgKzMwMTAsMzQgQEAKICNkZWZpbmUgV004OTk0X0FJRjFEQUMyXzNEX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQUlGMURBQzJfM0RfRU5BICovCiAKIC8qCisgKiBSMTA3MiAoMHg0MzApIC0gQUlGMSBEQUMxIE5vaXNlIEdhdGUKKyAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX01BU0sgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX1NISUZUICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfSExEX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBBSUYxREFDMV9OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX01BU0sgICAgICAgICAgICAgMHgwMDBFICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX1NISUZUICAgICAgICAgICAgICAgICAxICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAzICAvKiBBSUYxREFDMV9OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfRU5BICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYxREFDMV9OR19FTkEgKi8KKyNkZWZpbmUgV004OTU4X0FJRjFEQUMxX05HX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMURBQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMV9OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFEQUMxX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzFfTkdfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBSUYxREFDMV9OR19FTkEgKi8KKworLyoKKyAqIFIxMDczICgweDQzMSkgLSBBSUYxIERBQzIgTm9pc2UgR2F0ZQorICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfTUFTSyAgICAgICAgICAgICAweDAwNjAgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfU0hJRlQgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19ITERfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFEQUMyX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfTUFTSyAgICAgICAgICAgICAweDAwMEUgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfU0hJRlQgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19USFJfV0lEVEggICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFEQUMyX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFEQUMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMURBQzJfTkdfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYxREFDMl9OR19FTkEgKi8KKyNkZWZpbmUgV004OTU4X0FJRjFEQUMyX05HX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGMURBQzJfTkdfRU5BICovCisjZGVmaW5lIFdNODk1OF9BSUYxREFDMl9OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFEQUMyX05HX0VOQSAqLworCisvKgogICogUjEwODggKDB4NDQwKSAtIEFJRjEgRFJDMSAoMSkKICAqLwogI2RlZmluZSBXTTg5OTRfQUlGMURSQzFfU0lHX0RFVF9STVNfTUFTSyAgICAgICAgMHhGODAwICAvKiBBSUYxRFJDMV9TSUdfREVUX1JNUyAtIFsxNToxMV0gKi8KQEAgLTM1NjAsNiArMzY0OSwyMCBAQAogI2RlZmluZSBXTTg5OTRfQUlGMkRBQ18zRF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYyREFDXzNEX0VOQSAqLwogCiAvKgorICogUjEzMjggKDB4NTMwKSAtIEFJRjIgREFDIE5vaXNlIEdhdGUKKyAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19ITERfTUFTSyAgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUYyREFDX05HX0hMRCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYyREFDX05HX0hMRF9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjJEQUNfTkdfSExEIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjJEQUNfTkdfSExEX1dJRFRIICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMkRBQ19OR19ITEQgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19USFJfTUFTSyAgICAgICAgICAgICAgMHgwMDBFICAvKiBBSUYyREFDX05HX1RIUiAtIFszOjFdICovCisjZGVmaW5lIFdNODk1OF9BSUYyREFDX05HX1RIUl9TSElGVCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJEQUNfTkdfVEhSIC0gWzM6MV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjJEQUNfTkdfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMkRBQ19OR19USFIgLSBbMzoxXSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkEgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfTUFTSyAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyREFDX05HX0VOQSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYyREFDX05HX0VOQSAqLworCisvKgogICogUjEzNDQgKDB4NTQwKSAtIEFJRjIgRFJDICgxKQogICovCiAjZGVmaW5lIFdNODk5NF9BSUYyRFJDX1NJR19ERVRfUk1TX01BU0sgICAgICAgICAweEY4MDAgIC8qIEFJRjJEUkNfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IGMzMDliMWUuLmM0MWQ3MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0xLDcgKzEsOCBAQAogI2lmbmRlZiBfTElOVVhfTUlTQ0RFVklDRV9ICiAjZGVmaW5lIF9MSU5VWF9NSVNDREVWSUNFX0gKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICoJVGhlc2UgYWxsb2NhdGlvbnMgYXJlIG1hbmFnZWQgYnkgZGV2aWNlQGxhbmFuYS5vcmcuIElmIHlvdSB1c2UgYW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAppbmRleCAyMzY2Zjk0Li44NGIwYjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCkBAIC02MSw2ICs2MSw3IEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfUkMJCT0gMUxMIDw8ICAwLAogCU1MWDRfREVWX0NBUF9GTEFHX1VDCQk9IDFMTCA8PCAgMSwKIAlNTFg0X0RFVl9DQVBfRkxBR19VRAkJPSAxTEwgPDwgIDIsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDCQk9IDFMTCA8PCAgMywKIAlNTFg0X0RFVl9DQVBfRkxBR19TUlEJCT0gMUxMIDw8ICA2LAogCU1MWDRfREVWX0NBUF9GTEFHX0lQT0lCX0NTVU0JPSAxTEwgPDwgIDcsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfQkFEX1BLRVlfQ05UUgk9IDFMTCA8PCAgOCwKQEAgLTgzLDYgKzg0LDEyIEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfQ09VTlRFUlMJPSAxTEwgPDwgNDgKIH07CiAKKyNkZWZpbmUgTUxYNF9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTwljcHVfdG9fYmUxNigweGZmOTApCisKK2VudW0geworCU1MWF9FWFRfUE9SVF9DQVBfRkxBR19FWFRFTkRFRF9QT1JUX0lORk8JPSAxIDw8ICAwCit9OworCiBlbnVtIHsKIAlNTFg0X0JNTUVfRkxBR19MT0NBTF9JTlYJPSAxIDw8ICA2LAogCU1MWDRfQk1NRV9GTEFHX1JFTU9URV9JTlYJPSAxIDw8ICA3LApAQCAtMjU3LDYgKzI2NCw4IEBACiAJaW50CQkJbnVtX3FwX3Blcl9tZ207CiAJaW50CQkJbnVtX3BkczsKIAlpbnQJCQlyZXNlcnZlZF9wZHM7CisJaW50CQkJbWF4X3hyY2RzOworCWludAkJCXJlc2VydmVkX3hyY2RzOwogCWludAkJCW10dF9lbnRyeV9zejsKIAl1MzIJCQltYXhfbXNnX3N6OwogCXUzMgkJCXBhZ2Vfc2l6ZV9jYXA7CkBAIC0yNzcsNiArMjg2LDcgQEAKIAl1MzIJCQlwb3J0X21hc2s7CiAJZW51bSBtbHg0X3BvcnRfdHlwZQlwb3NzaWJsZV90eXBlW01MWDRfTUFYX1BPUlRTICsgMV07CiAJdTMyCQkJbWF4X2NvdW50ZXJzOworCXU4CQkJZXh0X3BvcnRfY2FwW01MWDRfTUFYX1BPUlRTICsgMV07CiB9OwogCiBzdHJ1Y3QgbWx4NF9idWZfbGlzdCB7CkBAIC01MDAsNiArNTEwLDggQEAKIAogaW50IG1seDRfcGRfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiAqcGRuKTsKIHZvaWQgbWx4NF9wZF9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuKTsKK2ludCBtbHg0X3hyY2RfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiAqeHJjZG4pOwordm9pZCBtbHg0X3hyY2RfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHhyY2RuKTsKIAogaW50IG1seDRfdWFyX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF91YXIgKnVhcik7CiB2b2lkIG1seDRfdWFyX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3VhciAqdWFyKTsKQEAgLTUzOSw4ICs1NTEsOCBAQAogaW50IG1seDRfcXBfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBxcG4sIHN0cnVjdCBtbHg0X3FwICpxcCk7CiB2b2lkIG1seDRfcXBfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwKTsKIAotaW50IG1seDRfc3JxX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuLCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKLQkJICAgdTY0IGRiX3JlYywgc3RydWN0IG1seDRfc3JxICpzcnEpOworaW50IG1seDRfc3JxX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcGRuLCB1MzIgY3FuLCB1MTYgeHJjZG4sCisJCSAgIHN0cnVjdCBtbHg0X210dCAqbXR0LCB1NjQgZGJfcmVjLCBzdHJ1Y3QgbWx4NF9zcnEgKnNycSk7CiB2b2lkIG1seDRfc3JxX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3NycSAqc3JxKTsKIGludCBtbHg0X3NycV9hcm0oc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3NycSAqc3JxLCBpbnQgbGltaXRfd2F0ZXJtYXJrKTsKIGludCBtbHg0X3NycV9xdWVyeShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfc3JxICpzcnEsIGludCAqbGltaXRfd2F0ZXJtYXJrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKaW5kZXggNDAwMWM4Mi4uNDhjYzRjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKQEAgLTc1LDYgKzc1LDcgQEAKIAlNTFg0X1FQX1NUX1VDCQkJCT0gMHgxLAogCU1MWDRfUVBfU1RfUkQJCQkJPSAweDIsCiAJTUxYNF9RUF9TVF9VRAkJCQk9IDB4MywKKwlNTFg0X1FQX1NUX1hSQwkJCQk9IDB4NiwKIAlNTFg0X1FQX1NUX01MWAkJCQk9IDB4NwogfTsKIApAQCAtMTM3LDcgKzEzOCw3IEBACiAJX19iZTMyCQkJc3NuOwogCV9fYmUzMgkJCXBhcmFtczI7CiAJX19iZTMyCQkJcm5yX25leHRyZWN2cHNuOwotCV9fYmUzMgkJCXNyY2Q7CisJX19iZTMyCQkJeHJjZDsKIAlfX2JlMzIJCQljcW5fcmVjdjsKIAlfX2JlNjQJCQlkYl9yZWNfYWRkcjsKIAlfX2JlMzIJCQlxa2V5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDc0MzgwNzEuLjNkYzNhOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTM1NiwzNiArMzU2LDUwIEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKKy8qCisgKiBUaGUgYXRvbWljIHBhZ2UtPl9tYXBjb3VudCwgc3RhcnRzIGZyb20gLTE6IHNvIHRoYXQgdHJhbnNpdGlvbnMKKyAqIGJvdGggZnJvbSBpdCBhbmQgdG8gaXQgY2FuIGJlIHRyYWNrZWQsIHVzaW5nIGF0b21pY19pbmNfYW5kX3Rlc3QKKyAqIGFuZCBhdG9taWNfYWRkX25lZ2F0aXZlKC0xKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X3BhZ2VfbWFwY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJYXRvbWljX3NldCgmKHBhZ2UpLT5fbWFwY291bnQsIC0xKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFnZV9tYXBjb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJihwYWdlKS0+X21hcGNvdW50KSArIDE7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZjb21wb3VuZF9oZWFkKHBhZ2UpLT5fY291bnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQogewogCS8qCi0JICogR2V0dGluZyBhIG5vcm1hbCBwYWdlIG9yIHRoZSBoZWFkIG9mIGEgY29tcG91bmQgcGFnZQotCSAqIHJlcXVpcmVzIHRvIGFscmVhZHkgaGF2ZSBhbiBlbGV2YXRlZCBwYWdlLT5fY291bnQuIE9ubHkgaWYKLQkgKiB3ZSdyZSBnZXR0aW5nIGEgdGFpbCBwYWdlLCB0aGUgZWxldmF0ZWQgcGFnZS0+X2NvdW50IGlzCi0JICogcmVxdWlyZWQgb25seSBpbiB0aGUgaGVhZCBwYWdlLCBzbyBmb3IgdGFpbCBwYWdlcyB0aGUKLQkgKiBidWdjaGVjayBvbmx5IHZlcmlmaWVzIHRoYXQgdGhlIHBhZ2UtPl9jb3VudCBpc24ndAotCSAqIG5lZ2F0aXZlLgorCSAqIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50KCkgY2Fubm90IHJ1bgorCSAqIGZyb20gdW5kZXIgdXMuCiAJICovCi0JVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpIDwgIVBhZ2VUYWlsKHBhZ2UpKTsKLQlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOworCVZNX0JVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCk7CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpICE9IDApOworCWF0b21pY19pbmMoJnBhZ2UtPl9tYXBjb3VudCk7Cit9CisKK2V4dGVybiBib29sIF9fZ2V0X3BhZ2VfdGFpbChzdHJ1Y3QgcGFnZSAqcGFnZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAodW5saWtlbHkoUGFnZVRhaWwocGFnZSkpKQorCQlpZiAobGlrZWx5KF9fZ2V0X3BhZ2VfdGFpbChwYWdlKSkpCisJCQlyZXR1cm47CiAJLyoKLQkgKiBHZXR0aW5nIGEgdGFpbCBwYWdlIHdpbGwgZWxldmF0ZSBib3RoIHRoZSBoZWFkIGFuZCB0YWlsCi0JICogcGFnZS0+X2NvdW50KHMpLgorCSAqIEdldHRpbmcgYSBub3JtYWwgcGFnZSBvciB0aGUgaGVhZCBvZiBhIGNvbXBvdW5kIHBhZ2UKKwkgKiByZXF1aXJlcyB0byBhbHJlYWR5IGhhdmUgYW4gZWxldmF0ZWQgcGFnZS0+X2NvdW50LgogCSAqLwotCWlmICh1bmxpa2VseShQYWdlVGFpbChwYWdlKSkpIHsKLQkJLyoKLQkJICogVGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZQotCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBjYW4ndCBydW4gdW5kZXIKLQkJICogZ2V0X3BhZ2UoKS4KLQkJICovCi0JCVZNX0JVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+Zmlyc3RfcGFnZS0+X2NvdW50KSA8PSAwKTsKLQkJYXRvbWljX2luYygmcGFnZS0+Zmlyc3RfcGFnZS0+X2NvdW50KTsKLQl9CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpIDw9IDApOworCWF0b21pY19pbmMoJnBhZ2UtPl9jb3VudCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnZpcnRfdG9faGVhZF9wYWdlKGNvbnN0IHZvaWQgKngpCkBAIC04MDQsMjEgKzgxOCw2IEBACiB9CiAKIC8qCi0gKiBUaGUgYXRvbWljIHBhZ2UtPl9tYXBjb3VudCwgbGlrZSBfY291bnQsIHN0YXJ0cyBmcm9tIC0xOgotICogc28gdGhhdCB0cmFuc2l0aW9ucyBib3RoIGZyb20gaXQgYW5kIHRvIGl0IGNhbiBiZSB0cmFja2VkLAotICogdXNpbmcgYXRvbWljX2luY19hbmRfdGVzdCBhbmQgYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9wYWdlX21hcGNvdW50KHN0cnVjdCBwYWdlICpwYWdlKQotewotCWF0b21pY19zZXQoJihwYWdlKS0+X21hcGNvdW50LCAtMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfbWFwY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCYocGFnZSktPl9tYXBjb3VudCkgKyAxOwotfQotCi0vKgogICogUmV0dXJuIHRydWUgaWYgdGhpcyBwYWdlIGlzIG1hcHBlZCBpbnRvIHBhZ2V0YWJsZXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfbWFwcGVkKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMTMzNCw3ICsxMzMzLDggQEAKIGV4dGVybiB2b2lkIHNpX21lbWluZm9fbm9kZShzdHJ1Y3Qgc3lzaW5mbyAqdmFsLCBpbnQgbmlkKTsKIGV4dGVybiBpbnQgYWZ0ZXJfYm9vdG1lbTsKIAotZXh0ZXJuIHZvaWQgd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDMsIDQpCit2b2lkIHdhcm5fYWxsb2NfZmFpbGVkKGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogZXh0ZXJuIHZvaWQgc2V0dXBfcGVyX2NwdV9wYWdlc2V0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKaW5kZXggYzkzZDAwYS4uNWI0MmYxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaApAQCAtNjIsMTAgKzYyLDIzIEBACiAJCQlzdHJ1Y3QgewogCiAJCQkJdW5pb24gewotCQkJCQlhdG9taWNfdCBfbWFwY291bnQ7CS8qIENvdW50IG9mIHB0ZXMgbWFwcGVkIGluIG1tcywKLQkJCQkJCQkgKiB0byBzaG93IHdoZW4gcGFnZSBpcyBtYXBwZWQKLQkJCQkJCQkgKiAmIGxpbWl0IHJldmVyc2UgbWFwIHNlYXJjaGVzLgotCQkJCQkJCSAqLworCQkJCQkvKgorCQkJCQkgKiBDb3VudCBvZiBwdGVzIG1hcHBlZCBpbgorCQkJCQkgKiBtbXMsIHRvIHNob3cgd2hlbiBwYWdlIGlzCisJCQkJCSAqIG1hcHBlZCAmIGxpbWl0IHJldmVyc2UgbWFwCisJCQkJCSAqIHNlYXJjaGVzLgorCQkJCQkgKgorCQkJCQkgKiBVc2VkIGFsc28gZm9yIHRhaWwgcGFnZXMKKwkJCQkJICogcmVmY291bnRpbmcgaW5zdGVhZCBvZgorCQkJCQkgKiBfY291bnQuIFRhaWwgcGFnZXMgY2Fubm90CisJCQkJCSAqIGJlIG1hcHBlZCBhbmQga2VlcGluZyB0aGUKKwkJCQkJICogdGFpbCBwYWdlIF9jb3VudCB6ZXJvIGF0CisJCQkJCSAqIGFsbCB0aW1lcyBndWFyYW50ZWVzCisJCQkJCSAqIGdldF9wYWdlX3VubGVzc196ZXJvKCkgd2lsbAorCQkJCQkgKiBuZXZlciBzdWNjZWVkIG9uIHRhaWwKKwkJCQkJICogcGFnZXMuCisJCQkJCSAqLworCQkJCQlhdG9taWNfdCBfbWFwY291bnQ7CiAKIAkJCQkJc3RydWN0IHsKIAkJCQkJCXVuc2lnbmVkIGludXNlOjE2OwpAQCAtMzA0LDggKzMxNywxNSBAQAogCXVuc2lnbmVkIGxvbmcgaGl3YXRlcl9yc3M7CS8qIEhpZ2gtd2F0ZXJtYXJrIG9mIFJTUyB1c2FnZSAqLwogCXVuc2lnbmVkIGxvbmcgaGl3YXRlcl92bTsJLyogSGlnaC13YXRlciB2aXJ0dWFsIG1lbW9yeSB1c2FnZSAqLwogCi0JdW5zaWduZWQgbG9uZyB0b3RhbF92bSwgbG9ja2VkX3ZtLCBzaGFyZWRfdm0sIGV4ZWNfdm07Ci0JdW5zaWduZWQgbG9uZyBzdGFja192bSwgcmVzZXJ2ZWRfdm0sIGRlZl9mbGFncywgbnJfcHRlczsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3ZtOwkJLyogVG90YWwgcGFnZXMgbWFwcGVkICovCisJdW5zaWduZWQgbG9uZyBsb2NrZWRfdm07CS8qIFBhZ2VzIHRoYXQgaGF2ZSBQR19tbG9ja2VkIHNldCAqLworCXVuc2lnbmVkIGxvbmcgcGlubmVkX3ZtOwkvKiBSZWZjb3VudCBwZXJtYW5lbnRseSBpbmNyZWFzZWQgKi8KKwl1bnNpZ25lZCBsb25nIHNoYXJlZF92bTsJLyogU2hhcmVkIHBhZ2VzIChmaWxlcykgKi8KKwl1bnNpZ25lZCBsb25nIGV4ZWNfdm07CQkvKiBWTV9FWEVDICYgflZNX1dSSVRFICovCisJdW5zaWduZWQgbG9uZyBzdGFja192bTsJCS8qIFZNX0dST1dTVVAvRE9XTiAqLworCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfdm07CS8qIFZNX1JFU0VSVkVEfFZNX0lPIHBhZ2VzICovCisJdW5zaWduZWQgbG9uZyBkZWZfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBucl9wdGVzOwkJLyogUGFnZSB0YWJsZSBwYWdlcyAqLwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZSwgZW5kX2NvZGUsIHN0YXJ0X2RhdGEsIGVuZF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYnJrLCBicmssIHN0YXJ0X3N0YWNrOwogCXVuc2lnbmVkIGxvbmcgYXJnX3N0YXJ0LCBhcmdfZW5kLCBlbnZfc3RhcnQsIGVudl9lbmQ7CkBAIC0zMzYsOSArMzU2LDYgQEAKIAl1bnNpZ25lZCBpbnQgdG9rZW5fcHJpb3JpdHk7CiAJdW5zaWduZWQgaW50IGxhc3RfaW50ZXJ2YWw7CiAKLQkvKiBIb3cgbWFueSB0YXNrcyBzaGFyaW5nIHRoaXMgbW0gYXJlIE9PTV9ESVNBQkxFICovCi0JYXRvbWljX3Qgb29tX2Rpc2FibGVfY291bnQ7Ci0KIAl1bnNpZ25lZCBsb25nIGZsYWdzOyAvKiBNdXN0IHVzZSBhdG9taWMgYml0b3BzIHRvIGFjY2VzcyB0aGUgYml0cyAqLwogCiAJc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7IC8qIGNvcmVkdW1waW5nIHN1cHBvcnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAppbmRleCBiNDYwZmMyLi40MTVmMmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCkBAIC01MCw4ICs1MCwxMiBAQAogCXU4CQkJcmVsX3NlY3RvcnM7CiAJdTgJCQlyZWxfcGFyYW07CiAJdTgJCQlwYXJ0X2NvbmZpZzsKKwl1OAkJCWNhY2hlX2N0cmw7CisJdTgJCQlyc3Rfbl9mdW5jdGlvbjsKIAl1bnNpZ25lZCBpbnQJCXBhcnRfdGltZTsJCS8qIFVuaXRzOiBtcyAqLwogCXVuc2lnbmVkIGludAkJc2FfdGltZW91dDsJCS8qIFVuaXRzOiAxMDBucyAqLworCXVuc2lnbmVkIGludAkJZ2VuZXJpY19jbWQ2X3RpbWU7CS8qIFVuaXRzOiAxMG1zICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcG93ZXJfb2ZmX2xvbmd0aW1lOyAgICAgLyogVW5pdHM6IG1zICovCiAJdW5zaWduZWQgaW50CQloc19tYXhfZHRyOwogCXVuc2lnbmVkIGludAkJc2VjdG9yczsKIAl1bnNpZ25lZCBpbnQJCWNhcmRfdHlwZTsKQEAgLTYzLDExICs2NywxNSBAQAogCWJvb2wJCQllbmhhbmNlZF9hcmVhX2VuOwkvKiBlbmFibGUgYml0ICovCiAJdW5zaWduZWQgbG9uZyBsb25nCWVuaGFuY2VkX2FyZWFfb2Zmc2V0OwkvKiBVbml0czogQnl0ZSAqLwogCXVuc2lnbmVkIGludAkJZW5oYW5jZWRfYXJlYV9zaXplOwkvKiBVbml0czogS0IgKi8KLQl1bnNpZ25lZCBpbnQJCWJvb3Rfc2l6ZTsJCS8qIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CQljYWNoZV9zaXplOwkJLyogVW5pdHM6IEtCICovCisJYm9vbAkJCWhwaV9lbjsJCQkvKiBIUEkgZW5hYmxlYml0ICovCisJYm9vbAkJCWhwaTsJCQkvKiBIUEkgc3VwcG9ydCBiaXQgKi8KKwl1bnNpZ25lZCBpbnQJCWhwaV9jbWQ7CQkvKiBjbWQgdXNlZCBhcyBIUEkgKi8KIAl1OAkJCXJhd19wYXJ0aXRpb25fc3VwcG9ydDsJLyogMTYwICovCiAJdTgJCQlyYXdfZXJhc2VkX21lbV9jb3VudDsJLyogMTgxICovCiAJdTgJCQlyYXdfZXh0X2NzZF9zdHJ1Y3R1cmU7CS8qIDE5NCAqLwogCXU4CQkJcmF3X2NhcmRfdHlwZTsJCS8qIDE5NiAqLworCXU4CQkJb3V0X29mX2ludF90aW1lOwkvKiAxOTggKi8KIAl1OAkJCXJhd19zX2FfdGltZW91dDsJCS8qIDIxNyAqLwogCXU4CQkJcmF3X2hjX2VyYXNlX2dhcF9zaXplOwkvKiAyMjEgKi8KIAl1OAkJCXJhd19lcmFzZV90aW1lb3V0X211bHQ7CS8qIDIyMyAqLwpAQCAtNzcsNiArODUsOSBAQAogCXU4CQkJcmF3X3NlY19mZWF0dXJlX3N1cHBvcnQ7LyogMjMxICovCiAJdTgJCQlyYXdfdHJpbV9tdWx0OwkJLyogMjMyICovCiAJdTgJCQlyYXdfc2VjdG9yc1s0XTsJCS8qIDIxMiAtIDQgYnl0ZXMgKi8KKworCXVuc2lnbmVkIGludCAgICAgICAgICAgIGZlYXR1cmVfc3VwcG9ydDsKKyNkZWZpbmUgTU1DX0RJU0NBUkRfRkVBVFVSRQlCSVQoMCkgICAgICAgICAgICAgICAgICAvKiBDTUQzOCBmZWF0dXJlICovCiB9OwogCiBzdHJ1Y3Qgc2Rfc2NyIHsKQEAgLTE1Nyw2ICsxNjgsMjQgQEAKIAogI2RlZmluZSBTRElPX01BWF9GVU5DUwkJNwogCisvKiBUaGUgbnVtYmVyIG9mIE1NQyBwaHlzaWNhbCBwYXJ0aXRpb25zLiAgVGhlc2UgY29uc2lzdCBvZjoKKyAqIGJvb3QgcGFydGl0aW9ucyAoMiksIGdlbmVyYWwgcHVycG9zZSBwYXJ0aXRpb25zICg0KSBpbiBNTUMgdjQuNC4KKyAqLworI2RlZmluZSBNTUNfTlVNX0JPT1RfUEFSVElUSU9OCTIKKyNkZWZpbmUgTU1DX05VTV9HUF9QQVJUSVRJT04JNAorI2RlZmluZSBNTUNfTlVNX1BIWV9QQVJUSVRJT04JNgorI2RlZmluZSBNQVhfTU1DX1BBUlRfTkFNRV9MRU4JMjAKKworLyoKKyAqIE1NQyBQaHlzaWNhbCBwYXJ0aXRpb25zCisgKi8KK3N0cnVjdCBtbWNfcGFydCB7CisJdW5zaWduZWQgaW50CXNpemU7CS8qIHBhcnRpdGlvbiBzaXplIChpbiBieXRlcykgKi8KKwl1bnNpZ25lZCBpbnQJcGFydF9jZmc7CS8qIHBhcnRpdGlvbiB0eXBlICovCisJY2hhcgluYW1lW01BWF9NTUNfUEFSVF9OQU1FX0xFTl07CisJYm9vbAlmb3JjZV9ybzsJLyogdG8gbWFrZSBib290IHBhcnRzIFJPIGJ5IGRlZmF1bHQgKi8KK307CisKIC8qCiAgKiBNTUMgZGV2aWNlCiAgKi8KQEAgLTE4OCw2ICsyMTcsMTMgQEAKICNkZWZpbmUgTU1DX1FVSVJLX0RJU0FCTEVfQ0QJKDE8PDUpCQkvKiBkaXNjb25uZWN0IENEL0RBVFszXSByZXNpc3RvciAqLwogI2RlZmluZSBNTUNfUVVJUktfSU5BTkRfQ01EMzgJKDE8PDYpCQkvKiBpTkFORCBkZXZpY2VzIGhhdmUgYnJva2VuIENNRDM4ICovCiAjZGVmaW5lIE1NQ19RVUlSS19CTEtfTk9fQ01EMjMJKDE8PDcpCQkvKiBBdm9pZCBDTUQyMyBmb3IgcmVndWxhciBtdWx0aWJsb2NrICovCisjZGVmaW5lIE1NQ19RVUlSS19CUk9LRU5fQllURV9NT0RFXzUxMiAoMTw8OCkJLyogQXZvaWQgc2VuZGluZyA1MTIgYnl0ZXMgaW4gKi8KKwkJCQkJCS8qIGJ5dGUgbW9kZSAqLworCXVuc2lnbmVkIGludCAgICBwb3dlcm9mZl9ub3RpZnlfc3RhdGU7CS8qIGVNTUM0LjUgbm90aWZ5IGZlYXR1cmUgKi8KKyNkZWZpbmUgTU1DX05PX1BPV0VSX05PVElGSUNBVElPTgkwCisjZGVmaW5lIE1NQ19QT1dFUkVEX09OCQkJMQorI2RlZmluZSBNTUNfUE9XRVJPRkZfU0hPUlQJCTIKKyNkZWZpbmUgTU1DX1BPV0VST0ZGX0xPTkcJCTMKIAogCXVuc2lnbmVkIGludAkJZXJhc2Vfc2l6ZTsJLyogZXJhc2Ugc2l6ZSBpbiBzZWN0b3JzICovCiAgCXVuc2lnbmVkIGludAkJZXJhc2Vfc2hpZnQ7CS8qIGlmIGVyYXNlIHVuaXQgaXMgcG93ZXIgMiAqLwpAQCAtMjE2LDkgKzI1MiwyNCBAQAogCXVuc2lnbmVkIGludAkJc2RfYnVzX3NwZWVkOwkvKiBCdXMgU3BlZWQgTW9kZSBzZXQgZm9yIHRoZSBjYXJkICovCiAKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVidWdmc19yb290OworCXN0cnVjdCBtbWNfcGFydAlwYXJ0W01NQ19OVU1fUEhZX1BBUlRJVElPTl07IC8qIHBoeXNpY2FsIHBhcnRpdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgICAgbnJfcGFydHM7CiB9OwogCiAvKgorICogVGhpcyBmdW5jdGlvbiBmaWxsIGNvbnRlbnRzIGluIG1tY19wYXJ0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3BhcnRfYWRkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHNpemUsCisJCQl1bnNpZ25lZCBpbnQgcGFydF9jZmcsIGNoYXIgKm5hbWUsIGludCBpZHgsIGJvb2wgcm8pCit7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10uc2l6ZSA9IHNpemU7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10ucGFydF9jZmcgPSBwYXJ0X2NmZzsKKwlzcHJpbnRmKGNhcmQtPnBhcnRbY2FyZC0+bnJfcGFydHNdLm5hbWUsIG5hbWUsIGlkeCk7CisJY2FyZC0+cGFydFtjYXJkLT5ucl9wYXJ0c10uZm9yY2Vfcm8gPSBybzsKKwljYXJkLT5ucl9wYXJ0cysrOworfQorCisvKgogICogIFRoZSB3b3JsZCBpcyBub3QgcGVyZmVjdCBhbmQgc3VwcGxpZXMgdXMgd2l0aCBicm9rZW4gbW1jL3NkaW8gZGV2aWNlcy4KICAqICBGb3IgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBidWdzIHdlIG5lZWQgYSB3b3JrLWFyb3VuZC4KICAqLwpAQCAtMzc3LDYgKzQyOCwxMSBAQAogCXJldHVybiBjLT5xdWlya3MgJiBNTUNfUVVJUktfTk9OU1REX0ZVTkNfSUY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tY19jYXJkX2Jyb2tlbl9ieXRlX21vZGVfNTEyKGNvbnN0IHN0cnVjdCBtbWNfY2FyZCAqYykKK3sKKwlyZXR1cm4gYy0+cXVpcmtzICYgTU1DX1FVSVJLX0JST0tFTl9CWVRFX01PREVfNTEyOworfQorCiAjZGVmaW5lIG1tY19jYXJkX25hbWUoYykJKChjKS0+Y2lkLnByb2RfbmFtZSkKICNkZWZpbmUgbW1jX2NhcmRfaWQoYykJCShkZXZfbmFtZSgmKGMpLT5kZXYpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKaW5kZXggYjhiMWI3YS4uMTc0YTg0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaApAQCAtMTM2LDYgKzEzNiw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqbW1jX3N0YXJ0X3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwKIAkJCQkJICAgc3RydWN0IG1tY19hc3luY19yZXEgKiwgaW50ICopOworZXh0ZXJuIGludCBtbWNfaW50ZXJydXB0X2hwaShzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gdm9pZCBtbWNfd2FpdF9mb3JfcmVxKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CiBleHRlcm4gaW50IG1tY193YWl0X2Zvcl9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY29tbWFuZCAqLCBpbnQpOwogZXh0ZXJuIGludCBtbWNfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jYXJkICopOwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAjZGVmaW5lIE1NQ19FUkFTRV9BUkcJCTB4MDAwMDAwMDAKICNkZWZpbmUgTU1DX1NFQ1VSRV9FUkFTRV9BUkcJMHg4MDAwMDAwMAogI2RlZmluZSBNTUNfVFJJTV9BUkcJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTU1DX0RJU0NBUkRfQVJHCQkweDAwMDAwMDAzCiAjZGVmaW5lIE1NQ19TRUNVUkVfVFJJTTFfQVJHCTB4ODAwMDAwMDEKICNkZWZpbmUgTU1DX1NFQ1VSRV9UUklNMl9BUkcJMHg4MDAwODAwMAogCkBAIC0xNTYsMTIgKzE1OCwxNyBAQAogCQkgICAgIHVuc2lnbmVkIGludCBhcmcpOwogZXh0ZXJuIGludCBtbWNfY2FuX2VyYXNlKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiBleHRlcm4gaW50IG1tY19jYW5fdHJpbShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOworZXh0ZXJuIGludCBtbWNfY2FuX2Rpc2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKK2V4dGVybiBpbnQgbW1jX2Nhbl9zYW5pdGl6ZShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwogZXh0ZXJuIGludCBtbWNfY2FuX3NlY3VyZV9lcmFzZV90cmltKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiBleHRlcm4gaW50IG1tY19lcmFzZV9ncm91cF9hbGlnbmVkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGZyb20sCiAJCQkJICAgdW5zaWduZWQgaW50IG5yKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbW1jX2NhbGNfbWF4X2Rpc2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIAogZXh0ZXJuIGludCBtbWNfc2V0X2Jsb2NrbGVuKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGJsb2NrbGVuKTsKK2V4dGVybiBpbnQgbW1jX2h3X3Jlc2V0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CitleHRlcm4gaW50IG1tY19od19yZXNldF9jaGVjayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOworZXh0ZXJuIGludCBtbWNfY2FuX3Jlc2V0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCk7CiAKIGV4dGVybiB2b2lkIG1tY19zZXRfZGF0YV90aW1lb3V0KHN0cnVjdCBtbWNfZGF0YSAqLCBjb25zdCBzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IG1tY19hbGlnbl9kYXRhX3NpemUoc3RydWN0IG1tY19jYXJkICosIHVuc2lnbmVkIGludCk7CkBAIC0xNzEsNiArMTc4LDggQEAKIGV4dGVybiB2b2lkIG1tY19kb19yZWxlYXNlX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIGV4dGVybiBpbnQgbW1jX3RyeV9jbGFpbV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAKK2V4dGVybiBpbnQgbW1jX2ZsdXNoX2NhY2hlKHN0cnVjdCBtbWNfY2FyZCAqKTsKKwogLyoqCiAgKgltbWNfY2xhaW1faG9zdCAtIGV4Y2x1c2l2ZWx5IGNsYWltIGEgaG9zdAogICoJQGhvc3Q6IG1tYyBob3N0IHRvIGNsYWltCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCmluZGV4IDZiNDY4MTkuLjZkYzliODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCkBAIC03Miw2ICs3Miw4IEBACiAgKglyYXRlIGFuZCB0aW1lb3V0IGNhbGN1bGF0aW9ucy4KICAqIEBjdXJyZW50X3NwZWVkOiBDb25maWd1cmVkIHJhdGUgb2YgdGhlIGNvbnRyb2xsZXIuCiAgKiBAbnVtX3Nsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgYXZhaWxhYmxlLgorICogQHZlcmlkOiBEZW5vdGUgVmVyc2lvbiBJRC4KKyAqIEBkYXRhX29mZnNldDogU2V0IHRoZSBvZmZzZXQgb2YgREFUQSByZWdpc3RlciBhY2NvcmRpbmcgdG8gVkVSSUQuCiAgKiBAcGRldjogUGxhdGZvcm0gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTU1DIGNvbnRyb2xsZXIuCiAgKiBAcGRhdGE6IFBsYXRmb3JtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KICAqIEBzbG90OiBTbG90cyBzaGFyaW5nIHRoaXMgTU1DIGNvbnRyb2xsZXIuCkBAIC0xNDcsNiArMTQ5LDggQEAKIAl1MzIJCQljdXJyZW50X3NwZWVkOwogCXUzMgkJCW51bV9zbG90czsKIAl1MzIJCQlmaWZvdGhfdmFsOworCXUxNgkJCXZlcmlkOworCXUxNgkJCWRhdGFfb2Zmc2V0OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CiAJc3RydWN0IGR3X21jaV9ib2FyZAkqcGRhdGE7CiAJc3RydWN0IGR3X21jaV9zbG90CSpzbG90W01BWF9NQ0lfU0xPVFNdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IDFkMDk1NjIuLmEzYWM5YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvcG0uaD4KQEAgLTEwOCw2ICsxMDksOSBAQAogCSAqIEl0IGlzIG9wdGlvbmFsIGZvciB0aGUgaG9zdCB0byBpbXBsZW1lbnQgcHJlX3JlcSBhbmQgcG9zdF9yZXEgaW4KIAkgKiBvcmRlciB0byBzdXBwb3J0IGRvdWJsZSBidWZmZXJpbmcgb2YgcmVxdWVzdHMgKHByZXBhcmUgb25lCiAJICogcmVxdWVzdCB3aGlsZSBhbm90aGVyIHJlcXVlc3QgaXMgYWN0aXZlKS4KKwkgKiBwcmVfcmVxKCkgbXVzdCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgYSBwb3N0X3JlcSgpLgorCSAqIFRvIHVuZG8gYSBjYWxsIG1hZGUgdG8gcHJlX3JlcSgpLCBjYWxsIHBvc3RfcmVxKCkgd2l0aAorCSAqIGEgbm9uemVybyBlcnIgY29uZGl0aW9uLgogCSAqLwogCXZvaWQJKCpwb3N0X3JlcSkoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcSwKIAkJCSAgICBpbnQgZXJyKTsKQEAgLTE0Nyw2ICsxNTEsNyBAQAogCWludAkoKmV4ZWN1dGVfdHVuaW5nKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogCXZvaWQJKCplbmFibGVfcHJlc2V0X3ZhbHVlKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIGJvb2wgZW5hYmxlKTsKIAlpbnQJKCpzZWxlY3RfZHJpdmVfc3RyZW5ndGgpKHVuc2lnbmVkIGludCBtYXhfZHRyLCBpbnQgaG9zdF9kcnYsIGludCBjYXJkX2Rydik7CisJdm9pZAkoKmh3X3Jlc2V0KShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogfTsKIAogc3RydWN0IG1tY19jYXJkOwpAQCAtMjI5LDggKzIzNCwyMCBAQAogI2RlZmluZSBNTUNfQ0FQX01BWF9DVVJSRU5UXzYwMAkoMSA8PCAyOCkJLyogSG9zdCBtYXggY3VycmVudCBsaW1pdCBpcyA2MDBtQSAqLwogI2RlZmluZSBNTUNfQ0FQX01BWF9DVVJSRU5UXzgwMAkoMSA8PCAyOSkJLyogSG9zdCBtYXggY3VycmVudCBsaW1pdCBpcyA4MDBtQSAqLwogI2RlZmluZSBNTUNfQ0FQX0NNRDIzCQkoMSA8PCAzMCkJLyogQ01EMjMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBNTUNfQ0FQX0hXX1JFU0VUCSgxIDw8IDMxKQkvKiBIYXJkd2FyZSByZXNldCAqLworCisJdW5zaWduZWQgaW50CQljYXBzMjsJCS8qIE1vcmUgaG9zdCBjYXBhYmlsaXRpZXMgKi8KKworI2RlZmluZSBNTUNfQ0FQMl9CT09UUEFSVF9OT0FDQwkoMSA8PCAwKQkvKiBCb290IHBhcnRpdGlvbiBubyBhY2Nlc3MgKi8KKyNkZWZpbmUgTU1DX0NBUDJfQ0FDSEVfQ1RSTAkoMSA8PCAxKQkvKiBBbGxvdyBjYWNoZSBjb250cm9sICovCisjZGVmaW5lIE1NQ19DQVAyX1BPV0VST0ZGX05PVElGWSAoMSA8PCAyKQkvKiBOb3RpZnkgcG93ZXJvZmYgc3VwcG9ydGVkICovCisjZGVmaW5lIE1NQ19DQVAyX05PX01VTFRJX1JFQUQJKDEgPDwgMykJLyogTXVsdGlibG9jayByZWFkcyBkb24ndCB3b3JrICovCiAKIAltbWNfcG1fZmxhZ190CQlwbV9jYXBzOwkvKiBzdXBwb3J0ZWQgcG0gZmVhdHVyZXMgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgIHBvd2VyX25vdGlmeV90eXBlOworI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfTk9ORQkJMAorI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfU0hPUlQJMQorI2RlZmluZSBNTUNfSE9TVF9QV19OT1RJRllfTE9ORwkJMgogCiAjaWZkZWYgQ09ORklHX01NQ19DTEtHQVRFCiAJaW50CQkJY2xrX3JlcXVlc3RzOwkvKiBpbnRlcm5hbCByZWZlcmVuY2UgY291bnRlciAqLwpAQCAtMzAyLDYgKzMxOSwxMCBAQAogCiAJc3RydWN0IG1tY19hc3luY19yZXEJKmFyZXE7CQkvKiBhY3RpdmUgYXN5bmMgcmVxICovCiAKKyNpZmRlZiBDT05GSUdfRkFJTF9NTUNfUkVRVUVTVAorCXN0cnVjdCBmYXVsdF9hdHRyCWZhaWxfbW1jX3JlcXVlc3Q7CisjZW5kaWYKKwogCXVuc2lnbmVkIGxvbmcJCXByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKIApAQCAtMzMwLDYgKzM1MSw4IEBACiBleHRlcm4gdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKiwgdW5zaWduZWQgbG9uZyBkZWxheSk7CiBleHRlcm4gdm9pZCBtbWNfcmVxdWVzdF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CiAKK2V4dGVybiBpbnQgbW1jX2NhY2hlX2N0cmwoc3RydWN0IG1tY19ob3N0ICosIHU4KTsKKwogc3RhdGljIGlubGluZSB2b2lkIG1tY19zaWduYWxfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWhvc3QtPm9wcy0+ZW5hYmxlX3NkaW9faXJxKGhvc3QsIDApOwpAQCAtMzk0LDQgKzQxNywxMCBAQAogewogCXJldHVybiBob3N0LT5jYXBzICYgTU1DX0NBUF9DTUQyMzsKIH0KKworc3RhdGljIGlubGluZSBpbnQgbW1jX2Jvb3RfcGFydGl0aW9uX2FjY2VzcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuICEoaG9zdC0+Y2FwczIgJiBNTUNfQ0FQMl9CT09UUEFSVF9OT0FDQyk7Cit9CisKICNlbmRpZiAvKiBMSU5VWF9NTUNfSE9TVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IDVhNzk0Y2IuLjBlNzEzNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCkBAIC0yNzAsMTggKzI3MCwzMSBAQAogICogRVhUX0NTRCBmaWVsZHMKICAqLwogCisjZGVmaW5lIEVYVF9DU0RfRkxVU0hfQ0FDSEUJCTMyICAgICAgLyogVyAqLworI2RlZmluZSBFWFRfQ1NEX0NBQ0hFX0NUUkwJCTMzICAgICAgLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX05PVElGSUNBVElPTgkzNAkvKiBSL1cgKi8KKyNkZWZpbmUgRVhUX0NTRF9HUF9TSVpFX01VTFQJCTE0MwkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUSVRJT05fQVRUUklCVVRFCTE1NgkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUSVRJT05fU1VQUE9SVAkxNjAJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9IUElfTUdNVAkJMTYxCS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX1JTVF9OX0ZVTkNUSU9OCQkxNjIJLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfU0FOSVRJWkVfU1RBUlQJCTE2NSAgICAgLyogVyAqLwogI2RlZmluZSBFWFRfQ1NEX1dSX1JFTF9QQVJBTQkJMTY2CS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfRVJBU0VfR1JPVVBfREVGCQkxNzUJLyogUi9XICovCiAjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUcJCTE3OQkvKiBSL1cgKi8KICNkZWZpbmUgRVhUX0NTRF9FUkFTRURfTUVNX0NPTlQJCTE4MQkvKiBSTyAqLwogI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSAkJMTgzCS8qIFIvVyAqLwogI2RlZmluZSBFWFRfQ1NEX0hTX1RJTUlORwkJMTg1CS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX1BPV0VSX0NMQVNTCQkxODcJLyogUi9XICovCiAjZGVmaW5lIEVYVF9DU0RfUkVWCQkJMTkyCS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfU1RSVUNUVVJFCQkxOTQJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9DQVJEX1RZUEUJCTE5NgkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX09VVF9PRl9JTlRFUlJVUFRfVElNRQkxOTgJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9QQVJUX1NXSVRDSF9USU1FICAgICAgICAxOTkgICAgIC8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzUyXzE5NQkJMjAwCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzI2XzE5NQkJMjAxCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzUyXzM2MAkJMjAyCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzI2XzM2MAkJMjAzCS8qIFJPICovCiAjZGVmaW5lIEVYVF9DU0RfU0VDX0NOVAkJCTIxMgkvKiBSTywgNCBieXRlcyAqLwogI2RlZmluZSBFWFRfQ1NEX1NfQV9USU1FT1VUCQkyMTcJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9SRUxfV1JfU0VDX0MJCTIyMgkvKiBSTyAqLwpAQCAtMjkzLDYgKzMwNiwxNCBAQAogI2RlZmluZSBFWFRfQ1NEX1NFQ19FUkFTRV9NVUxUCQkyMzAJLyogUk8gKi8KICNkZWZpbmUgRVhUX0NTRF9TRUNfRkVBVFVSRV9TVVBQT1JUCTIzMQkvKiBSTyAqLwogI2RlZmluZSBFWFRfQ1NEX1RSSU1fTVVMVAkJMjMyCS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzIwMF8xOTUJCTIzNgkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX1BXUl9DTF8yMDBfMzYwCQkyMzcJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfRERSXzUyXzE5NQkyMzgJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfRERSXzUyXzM2MAkyMzkJLyogUk8gKi8KKyNkZWZpbmUgRVhUX0NTRF9QT1dFUl9PRkZfTE9OR19USU1FCTI0NwkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX0dFTkVSSUNfQ01ENl9USU1FCTI0OAkvKiBSTyAqLworI2RlZmluZSBFWFRfQ1NEX0NBQ0hFX1NJWkUJCTI0OQkvKiBSTywgNCBieXRlcyAqLworI2RlZmluZSBFWFRfQ1NEX0hQSV9GRUFUVVJFUwkJNTAzCS8qIFJPICovCiAKIC8qCiAgKiBFWFRfQ1NEIGZpZWxkIGRlZmluaXRpb25zCkBAIC0zMDIsNyArMzIzLDkgQEAKIAogI2RlZmluZSBFWFRfQ1NEX1BBUlRfQ09ORklHX0FDQ19NQVNLCSgweDcpCiAjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QwCSgweDEpCi0jZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0JPT1QxCSgweDIpCisjZGVmaW5lIEVYVF9DU0RfUEFSVF9DT05GSUdfQUNDX0dQMAkoMHg0KQorCisjZGVmaW5lIEVYVF9DU0RfUEFSVF9TVVBQT1JUX1BBUlRfRU4JKDB4MSkKIAogI2RlZmluZSBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMCQkoMTw8MCkKICNkZWZpbmUgRVhUX0NTRF9DTURfU0VUX1NFQ1VSRQkJKDE8PDEpCkBAIC0zMjcsNyArMzUwLDIwIEBACiAjZGVmaW5lIEVYVF9DU0RfU0VDX0VSX0VOCUJJVCgwKQogI2RlZmluZSBFWFRfQ1NEX1NFQ19CRF9CTEtfRU4JQklUKDIpCiAjZGVmaW5lIEVYVF9DU0RfU0VDX0dCX0NMX0VOCUJJVCg0KQorI2RlZmluZSBFWFRfQ1NEX1NFQ19TQU5JVElaRQlCSVQoNikgIC8qIHY0LjUgb25seSAqLwogCisjZGVmaW5lIEVYVF9DU0RfUlNUX05fRU5fTUFTSwkweDMKKyNkZWZpbmUgRVhUX0NTRF9SU1RfTl9FTkFCTEVECTEJLyogUlNUX24gaXMgZW5hYmxlZCBvbiBjYXJkICovCisKKyNkZWZpbmUgRVhUX0NTRF9OT19QT1dFUl9OT1RJRklDQVRJT04JMAorI2RlZmluZSBFWFRfQ1NEX1BPV0VSX09OCQkxCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX1NIT1JUCQkyCisjZGVmaW5lIEVYVF9DU0RfUE9XRVJfT0ZGX0xPTkcJCTMKKworI2RlZmluZSBFWFRfQ1NEX1BXUl9DTF84QklUX01BU0sJMHhGMAkvKiA4IGJpdCBQV1IgQ0xTICovCisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzRCSVRfTUFTSwkweDBGCS8qIDggYml0IFBXUiBDTFMgKi8KKyNkZWZpbmUgRVhUX0NTRF9QV1JfQ0xfOEJJVF9TSElGVAk0CisjZGVmaW5lIEVYVF9DU0RfUFdSX0NMXzRCSVRfU0hJRlQJMAogLyoKICAqIE1NQ19TV0lUQ0ggYWNjZXNzIG1vZGVzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCmluZGV4IDU2NjZmM2EuLmU0YjY5MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaApAQCAtODgsNiArODgsMTAgQEAKIC8qIFRoZSByZWFkLW9ubHkgZGV0ZWN0aW9uIHZpYSBTREhDSV9QUkVTRU5UX1NUQVRFIHJlZ2lzdGVyIGlzIHVuc3RhYmxlICovCiAjZGVmaW5lIFNESENJX1FVSVJLX1VOU1RBQkxFX1JPX0RFVEVDVAkJCSgxPDwzMSkKIAorCXVuc2lnbmVkIGludCBxdWlya3MyOwkvKiBNb3JlIGRldmlhdGlvbnMgZnJvbSBzcGVjLiAqLworCisjZGVmaW5lIFNESENJX1FVSVJLMl9PV05fQ0FSRF9ERVRFQ1RJT04JCQkoMTw8MCkKKwogCWludCBpcnE7CQkvKiBEZXZpY2UgSVJRICovCiAJdm9pZCBfX2lvbWVtICppb2FkZHI7CS8qIE1hcHBlZCBhZGRyZXNzICovCiAKQEAgLTExNSw2ICsxMTksOCBAQAogI2RlZmluZSBTREhDSV9ORUVEU19SRVRVTklORwkoMTw8NSkJLyogSG9zdCBuZWVkcyByZXR1bmluZyAqLwogI2RlZmluZSBTREhDSV9BVVRPX0NNRDEyCSgxPDw2KQkvKiBBdXRvIENNRDEyIHN1cHBvcnQgKi8KICNkZWZpbmUgU0RIQ0lfQVVUT19DTUQyMwkoMTw8NykJLyogQXV0byBDTUQyMyBzdXBwb3J0ICovCisjZGVmaW5lIFNESENJX1BWX0VOQUJMRUQJKDE8PDgpCS8qIFByZXNldCB2YWx1ZSBlbmFibGVkICovCisjZGVmaW5lIFNESENJX1NESU9fSVJRX0VOQUJMRUQJKDE8PDkpCS8qIFNESU8gaXJxIGVuYWJsZWQgKi8KIAogCXVuc2lnbmVkIGludCB2ZXJzaW9uOwkvKiBTREhDSSBzcGVjLiB2ZXJzaW9uICovCiAKQEAgLTEyNSw2ICsxMzEsOCBAQAogCXVuc2lnbmVkIGludCBjbG9jazsJLyogQ3VycmVudCBjbG9jayAoTUh6KSAqLwogCXU4IHB3cjsJCQkvKiBDdXJyZW50IHZvbHRhZ2UgKi8KIAorCWJvb2wgcnVudGltZV9zdXNwZW5kZWQ7CS8qIEhvc3QgaXMgcnVudGltZSBzdXNwZW5kZWQgKi8KKwogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwkvKiBDdXJyZW50IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsJLyogQ3VycmVudCBjb21tYW5kICovCiAJc3RydWN0IG1tY19kYXRhICpkYXRhOwkvKiBDdXJyZW50IGRhdGEgcmVxdWVzdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpby5oCmluZGV4IDJhMmU5OTAuLmUwYjExMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvLmgKQEAgLTcyLDExICs3MiwxMyBAQAogI2RlZmluZSAgU0RJT19DQ0NSX1JFVl8xXzAwCTAJLyogQ0NDUi9GQlIgVmVyc2lvbiAxLjAwICovCiAjZGVmaW5lICBTRElPX0NDQ1JfUkVWXzFfMTAJMQkvKiBDQ0NSL0ZCUiBWZXJzaW9uIDEuMTAgKi8KICNkZWZpbmUgIFNESU9fQ0NDUl9SRVZfMV8yMAkyCS8qIENDQ1IvRkJSIFZlcnNpb24gMS4yMCAqLworI2RlZmluZSAgU0RJT19DQ0NSX1JFVl8zXzAwCTMJLyogQ0NDUi9GQlIgVmVyc2lvbiAzLjAwICovCiAKICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8wMAkwCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMDAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8xMAkxCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMTAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMV8yMAkyCS8qIFNESU8gU3BlYyBWZXJzaW9uIDEuMjAgKi8KICNkZWZpbmUgIFNESU9fU0RJT19SRVZfMl8wMAkzCS8qIFNESU8gU3BlYyBWZXJzaW9uIDIuMDAgKi8KKyNkZWZpbmUgIFNESU9fU0RJT19SRVZfM18wMAk0CS8qIFNESU8gU3BlYyBWZXJzaW9uIDMuMDAgKi8KIAogI2RlZmluZSBTRElPX0NDQ1JfU0QJCTB4MDEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NoX21tY2lmLmgKaW5kZXggMDIyMmNkOC4uMDRmZjQ1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tbWNpZi5oCkBAIC00MSw3ICs0MSw5IEBACiAJdm9pZCAoKnNldF9wd3IpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBzdGF0ZSk7CiAJdm9pZCAoKmRvd25fcHdyKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAlpbnQgKCpnZXRfY2QpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZWYpOwotCXN0cnVjdCBzaF9tbWNpZl9kbWEJKmRtYTsKKwlzdHJ1Y3Qgc2hfbW1jaWZfZG1hCSpkbWE7CQkvKiBEZXByZWNhdGVkLiBJbnN0ZWFkICovCisJdW5zaWduZWQgaW50CQlzbGF2ZV9pZF90eDsJLyogdXNlIGVtYmVkZGVkIHNsYXZlX2lkX1t0cl14ICovCisJdW5zaWduZWQgaW50CQlzbGF2ZV9pZF9yeDsKIAl1OAkJCXN1cF9wY2xrOwkvKiAxIDpTSDc3NTcsIDA6IFNINzcyNC9TSDczNzIgKi8KIAl1bnNpZ25lZCBsb25nCQljYXBzOwogCXUzMgkJCW9jcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tb2JpbGVfc2RoaS5oCmluZGV4IGJkNTBiMzYuLjcxYjgwNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21vYmlsZV9zZGhpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2hfbW9iaWxlX3NkaGkuaApAQCAtNiw2ICs2LDEwIEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOwogc3RydWN0IHRtaW9fbW1jX2RhdGE7CiAKKyNkZWZpbmUgU0hfTU9CSUxFX1NESElfSVJRX0NBUkRfREVURUNUCSJjYXJkX2RldGVjdCIKKyNkZWZpbmUgU0hfTU9CSUxFX1NESElfSVJRX1NEQ0FSRAkic2RjYXJkIgorI2RlZmluZSBTSF9NT0JJTEVfU0RISV9JUlFfU0RJTwkJInNkaW8iCisKIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHsKIAlpbnQgZG1hX3NsYXZlX3R4OwogCWludCBkbWFfc2xhdmVfcng7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oIGIvaW5jbHVkZS9saW51eC9tbWlvdHJhY2UuaAppbmRleCA5NzQ5MWY3Li5jNWQ1Mjc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1pb3RyYWNlLmgKQEAgLTQ5LDggKzQ5LDcgQEAKIGV4dGVybiB2b2lkIG1taW90cmFjZV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKIC8qIEZvciBhbnlvbmUgdG8gaW5zZXJ0IG1hcmtlcnMuIFJlbWVtYmVyIHRyYWlsaW5nIG5ld2xpbmUuICovCi1leHRlcm4gaW50IG1taW90cmFjZV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCi0JCQkJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIF9fcHJpbnRmKDEsIDIpIGludCBtbWlvdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKICNlbHNlIC8qICFDT05GSUdfTU1JT1RSQUNFOiAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfa21taW9fYWN0aXZlKHZvaWQpCiB7CkBAIC03MSwxMCArNzAsNyBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBtbWlvdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCQkJCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMCkpKTsKLQotc3RhdGljIGlubGluZSBpbnQgbW1pb3RyYWNlX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikgaW50IG1taW90cmFjZV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCBiZTFhYzhkLi4xODhjYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTEwMCw2ICsxMDAsNyBAQAogCU5SX1VOU1RBQkxFX05GUywJLyogTkZTIHVuc3RhYmxlIHBhZ2VzICovCiAJTlJfQk9VTkNFLAogCU5SX1ZNU0NBTl9XUklURSwKKwlOUl9WTVNDQU5fSU1NRURJQVRFLAkvKiBQcmlvcml0aXNlIGZvciByZWNsYWltIHdoZW4gd3JpdGViYWNrIGVuZHMgKi8KIAlOUl9XUklURUJBQ0tfVEVNUCwJLyogV3JpdGViYWNrIHVzaW5nIHRlbXBvcmFyeSBidWZmZXJzICovCiAJTlJfSVNPTEFURURfQU5PTiwJLyogVGVtcG9yYXJ5IGlzb2xhdGVkIHBhZ2VzIGZyb20gYW5vbiBscnUgKi8KIAlOUl9JU09MQVRFRF9GSUxFLAkvKiBUZW1wb3JhcnkgaXNvbGF0ZWQgcGFnZXMgZnJvbSBmaWxlIGxydSAqLwpAQCAtMTY0LDYgKzE2NSwxOCBAQAogI2RlZmluZSBMUlVfQUxMX0VWSUNUQUJMRSAoTFJVX0FMTF9GSUxFIHwgTFJVX0FMTF9BTk9OKQogI2RlZmluZSBMUlVfQUxMCSAgICAgKCgxIDw8IE5SX0xSVV9MSVNUUykgLSAxKQogCisvKiBJc29sYXRlIGluYWN0aXZlIHBhZ2VzICovCisjZGVmaW5lIElTT0xBVEVfSU5BQ1RJVkUJKChfX2ZvcmNlIGlzb2xhdGVfbW9kZV90KTB4MSkKKy8qIElzb2xhdGUgYWN0aXZlIHBhZ2VzICovCisjZGVmaW5lIElTT0xBVEVfQUNUSVZFCQkoKF9fZm9yY2UgaXNvbGF0ZV9tb2RlX3QpMHgyKQorLyogSXNvbGF0ZSBjbGVhbiBmaWxlICovCisjZGVmaW5lIElTT0xBVEVfQ0xFQU4JCSgoX19mb3JjZSBpc29sYXRlX21vZGVfdCkweDQpCisvKiBJc29sYXRlIHVubWFwcGVkIGZpbGUgKi8KKyNkZWZpbmUgSVNPTEFURV9VTk1BUFBFRAkoKF9fZm9yY2UgaXNvbGF0ZV9tb2RlX3QpMHg4KQorCisvKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLwordHlwZWRlZiB1bnNpZ25lZCBfX2JpdHdpc2VfXyBpc29sYXRlX21vZGVfdDsKKwogZW51bSB6b25lX3dhdGVybWFya3MgewogCVdNQVJLX01JTiwKIAlXTUFSS19MT1csCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCA4NjM5MjE2Li4zY2I3ODM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vbW9kdWxlLmg+CkBAIC0yNSwyMSArMjYsOCBAQAogLyogTm90IFlldCBJbXBsZW1lbnRlZCAqLwogI2RlZmluZSBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShuYW1lKQogCi0vKiBTb21lIHRvb2xjaGFpbnMgdXNlIGEgYF8nIHByZWZpeCBmb3IgYWxsIHVzZXIgc3ltYm9scy4gKi8KLSNpZmRlZiBDT05GSUdfU1lNQk9MX1BSRUZJWAotI2RlZmluZSBNT0RVTEVfU1lNQk9MX1BSRUZJWCBDT05GSUdfU1lNQk9MX1BSRUZJWAotI2Vsc2UKLSNkZWZpbmUgTU9EVUxFX1NZTUJPTF9QUkVGSVggIiIKLSNlbmRpZgotCiAjZGVmaW5lIE1PRFVMRV9OQU1FX0xFTiBNQVhfUEFSQU1fUFJFRklYX0xFTgogCi1zdHJ1Y3Qga2VybmVsX3N5bWJvbAotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KIHN0cnVjdCBtb2R2ZXJzaW9uX2luZm8KIHsKIAl1bnNpZ25lZCBsb25nIGNyYzsKQEAgLTk4LDExICs4Niw4IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGd0eXBlIyNfaWQgX19tb2RfIyNndHlwZSMjX3RhYmxlCQlcCiAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIGFsaWFzKF9fc3RyaW5naWZ5KG5hbWUpKSkpCiAKLWV4dGVybiBzdHJ1Y3QgbW9kdWxlIF9fdGhpc19tb2R1bGU7Ci0jZGVmaW5lIFRISVNfTU9EVUxFICgmX190aGlzX21vZHVsZSkKICNlbHNlICAvKiAhTU9EVUxFICovCiAjZGVmaW5lIE1PRFVMRV9HRU5FUklDX1RBQkxFKGd0eXBlLG5hbWUpCi0jZGVmaW5lIFRISVNfTU9EVUxFICgoc3RydWN0IG1vZHVsZSAqKTApCiAjZW5kaWYKIAogLyogR2VuZXJpYyBpbmZvIG9mIGZvcm0gdGFnID0gImluZm8iICovCkBAIC0xNTAsMTEgKzEzNSw2IEBACiAvKiBXaGF0IHlvdXIgbW9kdWxlIGRvZXMuICovCiAjZGVmaW5lIE1PRFVMRV9ERVNDUklQVElPTihfZGVzY3JpcHRpb24pIE1PRFVMRV9JTkZPKGRlc2NyaXB0aW9uLCBfZGVzY3JpcHRpb24pCiAKLS8qIE9uZSBmb3IgZWFjaCBwYXJhbWV0ZXIsIGRlc2NyaWJpbmcgaG93IHRvIHVzZSBpdC4gIFNvbWUgZmlsZXMgZG8KLSAgIG11bHRpcGxlIG9mIHRoZXNlIHBlciBsaW5lLCBzbyBjYW4ndCBqdXN0IHVzZSBNT0RVTEVfSU5GTy4gKi8KLSNkZWZpbmUgTU9EVUxFX1BBUk1fREVTQyhfcGFybSwgZGVzYykgXAotCV9fTU9EVUxFX0lORk8ocGFybSwgX3Bhcm0sICNfcGFybSAiOiIgZGVzYykKLQogI2RlZmluZSBNT0RVTEVfREVWSUNFX1RBQkxFKHR5cGUsbmFtZSkJCVwKICAgTU9EVUxFX0dFTkVSSUNfVEFCTEUodHlwZSMjX2RldmljZSxuYW1lKQogCkBAIC0yMTgsNTIgKzE5OCw2IEBACiAJc3RydWN0IG1vZHVsZSAqc291cmNlLCAqdGFyZ2V0OwogfTsKIAotI2lmbmRlZiBfX0dFTktTWU1TX18KLSNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKLS8qIE1hcmsgdGhlIENSQyB3ZWFrIHNpbmNlIGdlbmtzeW1zIGFwcGFyZW50bHkgZGVjaWRlcyBub3QgdG8KLSAqIGdlbmVyYXRlIGEgY2hlY2tzdW1zIGZvciBzb21lIHN5bWJvbHMgKi8KLSNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQkJCQkJXAotCWV4dGVybiB2b2lkICpfX2NyY18jI3N5bSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CQlcCi0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19rY3JjdGFiXyMjc3ltCQlcCi0JX191c2VkCQkJCQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rY3JjdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCi0JPSAodW5zaWduZWQgbG9uZykgJl9fY3JjXyMjc3ltOwotI2Vsc2UKLSNkZWZpbmUgX19DUkNfU1lNQk9MKHN5bSwgc2VjKQotI2VuZGlmCi0KLS8qIEZvciBldmVyeSBleHBvcnRlZCBzeW1ib2wsIHBsYWNlIGEgc3RydWN0IGluIHRoZSBfX2tzeW10YWIgc2VjdGlvbiAqLwotI2RlZmluZSBfX0VYUE9SVF9TWU1CT0woc3ltLCBzZWMpCQkJCVwKLQlleHRlcm4gdHlwZW9mKHN5bSkgc3ltOwkJCQkJXAotCV9fQ1JDX1NZTUJPTChzeW0sIHNlYykJCQkJCVwKLQlzdGF0aWMgY29uc3QgY2hhciBfX2tzdHJ0YWJfIyNzeW1bXQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX2tzeW10YWJfc3RyaW5ncyIpLCBhbGlnbmVkKDEpKSkgXAotCT0gTU9EVUxFX1NZTUJPTF9QUkVGSVggI3N5bTsgICAgICAgICAgICAgICAgICAgIAlcCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sIF9fa3N5bXRhYl8jI3N5bQlcCi0JX191c2VkCQkJCQkJCVwKLQlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX19rc3ltdGFiIiBzZWMgIisiICNzeW0pLCB1bnVzZWQpKQlcCi0JPSB7ICh1bnNpZ25lZCBsb25nKSZzeW0sIF9fa3N0cnRhYl8jI3N5bSB9Ci0KLSNkZWZpbmUgRVhQT1JUX1NZTUJPTChzeW0pCQkJCQlcCi0JX19FWFBPUlRfU1lNQk9MKHN5bSwgIiIpCi0KLSNkZWZpbmUgRVhQT1JUX1NZTUJPTF9HUEwoc3ltKQkJCQkJXAotCV9fRVhQT1JUX1NZTUJPTChzeW0sICJfZ3BsIikKLQotI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoc3ltKQkJCQlcCi0JX19FWFBPUlRfU1lNQk9MKHN5bSwgIl9ncGxfZnV0dXJlIikKLQotCi0jaWZkZWYgQ09ORklHX1VOVVNFRF9TWU1CT0xTCi0jZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MKHN5bSkgX19FWFBPUlRfU1lNQk9MKHN5bSwgIl91bnVzZWQiKQotI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwoc3ltKSBfX0VYUE9SVF9TWU1CT0woc3ltLCAiX3VudXNlZF9ncGwiKQotI2Vsc2UKLSNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0woc3ltKQotI2RlZmluZSBFWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwoc3ltKQotI2VuZGlmCi0KLSNlbmRpZgotCiBlbnVtIG1vZHVsZV9zdGF0ZQogewogCU1PRFVMRV9TVEFURV9MSVZFLApAQCAtNTgxLDExICs1MTUsNiBAQAogZXh0ZXJuIHZvaWQgcHJpbnRfbW9kdWxlcyh2b2lkKTsKIAogI2Vsc2UgLyogIUNPTkZJR19NT0RVTEVTLi4uICovCi0jZGVmaW5lIEVYUE9SVF9TWU1CT0woc3ltKQotI2RlZmluZSBFWFBPUlRfU1lNQk9MX0dQTChzeW0pCi0jZGVmaW5lIEVYUE9SVF9TWU1CT0xfR1BMX0ZVVFVSRShzeW0pCi0jZGVmaW5lIEVYUE9SVF9VTlVTRURfU1lNQk9MKHN5bSkKLSNkZWZpbmUgRVhQT1JUX1VOVVNFRF9TWU1CT0xfR1BMKHN5bSkKIAogLyogR2l2ZW4gYW4gYWRkcmVzcywgbG9vayBmb3IgaXQgaW4gdGhlIGV4Y2VwdGlvbiB0YWJsZXMuICovCiBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oCmluZGV4IGZmZmIxMGIuLjc5MzlmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZXBhcmFtLmgKQEAgLTMxLDYgKzMxLDExIEBACiAjZGVmaW5lIF9fTU9EVUxFX1BBUk1fVFlQRShuYW1lLCBfdHlwZSkJCQkJCSAgXAogICBfX01PRFVMRV9JTkZPKHBhcm10eXBlLCBuYW1lIyN0eXBlLCAjbmFtZSAiOiIgX3R5cGUpCiAKKy8qIE9uZSBmb3IgZWFjaCBwYXJhbWV0ZXIsIGRlc2NyaWJpbmcgaG93IHRvIHVzZSBpdC4gIFNvbWUgZmlsZXMgZG8KKyAgIG11bHRpcGxlIG9mIHRoZXNlIHBlciBsaW5lLCBzbyBjYW4ndCBqdXN0IHVzZSBNT0RVTEVfSU5GTy4gKi8KKyNkZWZpbmUgTU9EVUxFX1BBUk1fREVTQyhfcGFybSwgZGVzYykgXAorCV9fTU9EVUxFX0lORk8ocGFybSwgX3Bhcm0sICNfcGFybSAiOiIgZGVzYykKKwogc3RydWN0IGtlcm5lbF9wYXJhbTsKIAogc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvYmJtLmggYi9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaAppbmRleCA1N2NjMGU2Li5jNGVlYzIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9iYm0uaApAQCAtODYsMjQgKzg2LDM5IEBACiAjZGVmaW5lIE5BTkRfQkJUX1ZFUlNJT04JMHgwMDAwMDEwMAogLyogQ3JlYXRlIGEgYmJ0IGlmIG5vbmUgZXhpc3RzICovCiAjZGVmaW5lIE5BTkRfQkJUX0NSRUFURQkJMHgwMDAwMDIwMAorLyoKKyAqIENyZWF0ZSBhbiBlbXB0eSBCQlQgd2l0aCBubyB2ZW5kb3IgaW5mb3JtYXRpb24uIFZlbmRvcidzIGluZm9ybWF0aW9uIG1heSBiZQorICogdW5hdmFpbGFibGUsIGZvciBleGFtcGxlLCBpZiB0aGUgTkFORCBjb250cm9sbGVyIGhhcyBhIGRpZmZlcmVudCBkYXRhIGFuZCBPT0IKKyAqIGxheW91dCBvciBpZiB0aGlzIGluZm9ybWF0aW9uIGlzIGFscmVhZHkgcHVyZ2VkLiBNdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24KKyAqIHdpdGggTkFORF9CQlRfQ1JFQVRFLgorICovCisjZGVmaW5lIE5BTkRfQkJUX0NSRUFURV9FTVBUWQkweDAwMDAwNDAwCiAvKiBTZWFyY2ggZ29vZCAvIGJhZCBwYXR0ZXJuIHRocm91Z2ggYWxsIHBhZ2VzIG9mIGEgYmxvY2sgKi8KLSNkZWZpbmUgTkFORF9CQlRfU0NBTkFMTFBBR0VTCTB4MDAwMDA0MDAKKyNkZWZpbmUgTkFORF9CQlRfU0NBTkFMTFBBR0VTCTB4MDAwMDA4MDAKIC8qIFNjYW4gYmxvY2sgZW1wdHkgZHVyaW5nIGdvb2QgLyBiYWQgYmxvY2sgc2NhbiAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FORU1QVFkJMHgwMDAwMDgwMAorI2RlZmluZSBOQU5EX0JCVF9TQ0FORU1QVFkJMHgwMDAwMTAwMAogLyogV3JpdGUgYmJ0IGlmIG5lY2NlY2FyeSAqLwotI2RlZmluZSBOQU5EX0JCVF9XUklURQkJMHgwMDAwMTAwMAorI2RlZmluZSBOQU5EX0JCVF9XUklURQkJMHgwMDAwMjAwMAogLyogUmVhZCBhbmQgd3JpdGUgYmFjayBibG9jayBjb250ZW50cyB3aGVuIHdyaXRpbmcgYmJ0ICovCi0jZGVmaW5lIE5BTkRfQkJUX1NBVkVDT05URU5UCTB4MDAwMDIwMDAKKyNkZWZpbmUgTkFORF9CQlRfU0FWRUNPTlRFTlQJMHgwMDAwNDAwMAogLyogU2VhcmNoIGdvb2QgLyBiYWQgcGF0dGVybiBvbiB0aGUgZmlyc3QgYW5kIHRoZSBzZWNvbmQgcGFnZSAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOMk5EUEFHRQkweDAwMDA0MDAwCisjZGVmaW5lIE5BTkRfQkJUX1NDQU4yTkRQQUdFCTB4MDAwMDgwMDAKIC8qIFNlYXJjaCBnb29kIC8gYmFkIHBhdHRlcm4gb24gdGhlIGxhc3QgcGFnZSBvZiB0aGUgZXJhc2VibG9jayAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOTEFTVFBBR0UJMHgwMDAwODAwMAotLyogQ2hpcCBzdG9yZXMgYmFkIGJsb2NrIG1hcmtlciBvbiBCT1RIIDFzdCBhbmQgNnRoIGJ5dGVzIG9mIE9PQiAqLwotI2RlZmluZSBOQU5EX0JCVF9TQ0FOQllURTFBTkQ2IDB4MDAxMDAwMDAKLS8qIFRoZSBuYW5kX2JidF9kZXNjciB3YXMgY3JlYXRlZCBkeW5hbWljYWx5IGFuZCBtdXN0IGJlIGZyZWVkICovCi0jZGVmaW5lIE5BTkRfQkJUX0RZTkFNSUNTVFJVQ1QgMHgwMDIwMDAwMAotLyogVGhlIGJhZCBibG9jayB0YWJsZSBkb2VzIG5vdCBPT0IgZm9yIG1hcmtlciAqLwotI2RlZmluZSBOQU5EX0JCVF9OT19PT0IJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTkFORF9CQlRfU0NBTkxBU1RQQUdFCTB4MDAwMTAwMDAKKy8qCisgKiBVc2UgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUuIEJ5IGRlZmF1bHQsIE9PQiBpZGVudGlmaWVyIGlzIHNhdmVkIGluCisgKiBPT0IgYXJlYS4gVGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBOQU5EX0JCVF9VU0VfRkxBU0gJMHgwMDAyMDAwMAorLyogRG8gbm90IHN0b3JlIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSBpbiBPT0IgYXJlYTsgc3RvcmUgaXQgaW4tYmFuZCAqLworI2RlZmluZSBOQU5EX0JCVF9OT19PT0IJCTB4MDAwNDAwMDAKKworLyoKKyAqIEZsYWcgc2V0IGJ5IG5hbmRfY3JlYXRlX2RlZmF1bHRfYmJ0X2Rlc2NyKCksIG1hcmtpbmcgdGhhdCB0aGUgbmFuZF9iYnRfZGVzY3IKKyAqIHdhcyBhbGxvY2F0ZWQgZHluYW1pY2FseSBhbmQgbXVzdCBiZSBmcmVlZCBpbiBuYW5kX3JlbGVhc2UoKS4gSGFzIG5vIG1lYW5pbmcKKyAqIGluIG5hbmRfY2hpcC5iYnRfb3B0aW9ucy4KKyAqLworI2RlZmluZSBOQU5EX0JCVF9EWU5BTUlDU1RSVUNUCTB4ODAwMDAwMDAKIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB0byBzY2FuIGZvciBhIGJidCAqLwogI2RlZmluZSBOQU5EX0JCVF9TQ0FOX01BWEJMT0NLUwk0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCmluZGV4IDI1NDFmYjguLjlmNWIzMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC0yMSw3ICsyMSw2IEBACiAjZGVmaW5lIF9fTVREX01URF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTMzLDE3ICszMiwxOSBAQAogI2RlZmluZSBNVERfQ0hBUl9NQUpPUiA5MAogI2RlZmluZSBNVERfQkxPQ0tfTUFKT1IgMzEKIAotI2RlZmluZSBNVERfRVJBU0VfUEVORElORyAgICAgIAkweDAxCisjZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HCTB4MDEKICNkZWZpbmUgTVREX0VSQVNJTkcJCTB4MDIKICNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAotI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4Ci0jZGVmaW5lIE1URF9FUkFTRV9GQUlMRUQgICAgICAgIDB4MTAKKyNkZWZpbmUgTVREX0VSQVNFX0RPTkUJCTB4MDgKKyNkZWZpbmUgTVREX0VSQVNFX0ZBSUxFRAkweDEwCiAKICNkZWZpbmUgTVREX0ZBSUxfQUREUl9VTktOT1dOIC0xTEwKIAotLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgotICAgZmFpbF9hZGRyID0gTVREX0ZBSUxfQUREUl9VTktOT1dOLCB0aGUgZmFpbHVyZSB3YXMgbm90IGF0IHRoZSBkZXZpY2UgbGV2ZWwgb3Igd2FzIG5vdAotICAgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgYmxvY2suICovCisvKgorICogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuIElmCisgKiBmYWlsX2FkZHIgPSBNVERfRkFJTF9BRERSX1VOS05PV04sIHRoZSBmYWlsdXJlIHdhcyBub3QgYXQgdGhlIGRldmljZSBsZXZlbAorICogb3Igd2FzIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBibG9jay4KKyAqLwogc3RydWN0IGVyYXNlX2luZm8gewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCXVpbnQ2NF90IGFkZHI7CkBAIC02MCwyNiArNjEsMTIgQEAKIH07CiAKIHN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gewotCXVpbnQ2NF90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdWludDY0X3Qgb2Zmc2V0OwkJLyogQXQgd2hpY2ggdGhpcyByZWdpb24gc3RhcnRzLCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLwogCXVpbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwogCXVpbnQzMl90IG51bWJsb2NrczsJCS8qIE51bWJlciBvZiBibG9ja3Mgb2YgZXJhc2VzaXplIGluIHRoaXMgcmVnaW9uICovCiAJdW5zaWduZWQgbG9uZyAqbG9ja21hcDsJCS8qIElmIGtlZXBpbmcgYml0bWFwIG9mIGxvY2tzICovCiB9OwogCi0vKgotICogb29iIG9wZXJhdGlvbiBtb2RlcwotICoKLSAqIE1URF9PT0JfUExBQ0U6CW9vYiBkYXRhIGFyZSBwbGFjZWQgYXQgdGhlIGdpdmVuIG9mZnNldAotICogTVREX09PQl9BVVRPOglvb2IgZGF0YSBhcmUgYXV0b21hdGljYWxseSBwbGFjZWQgYXQgdGhlIGZyZWUgYXJlYXMKLSAqCQkJd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIGVjY2xheW91dAotICogTVREX09PQl9SQVc6CQltb2RlIHRvIHJlYWQgb29iIGFuZCBkYXRhIHdpdGhvdXQgZG9pbmcgRUNDIGNoZWNraW5nCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0JTVREX09PQl9QTEFDRSwKLQlNVERfT09CX0FVVE8sCi0JTVREX09PQl9SQVcsCi19IG10ZF9vb2JfbW9kZV90OwotCiAvKioKICAqIHN0cnVjdCBtdGRfb29iX29wcyAtIG9vYiBvcGVyYXRpb24gb3BlcmFuZHMKICAqIEBtb2RlOglvcGVyYXRpb24gbW9kZQpAQCAtOTEsNyArNzgsNyBAQAogICogQG9vYmxlbjoJbnVtYmVyIG9mIG9vYiBieXRlcyB0byB3cml0ZS9yZWFkCiAgKiBAb29icmV0bGVuOgludW1iZXIgb2Ygb29iIGJ5dGVzIHdyaXR0ZW4vcmVhZAogICogQG9vYm9mZnM6CW9mZnNldCBvZiBvb2IgZGF0YSBpbiB0aGUgb29iIGFyZWEgKG9ubHkgcmVsZXZhbnQgd2hlbgotICoJCW1vZGUgPSBNVERfT09CX1BMQUNFKQorICoJCW1vZGUgPSBNVERfT1BTX1BMQUNFX09PQiBvciBNVERfT1BTX1JBVykKICAqIEBkYXRidWY6CWRhdGEgYnVmZmVyIC0gaWYgTlVMTCBvbmx5IG9vYiBkYXRhIGFyZSByZWFkL3dyaXR0ZW4KICAqIEBvb2JidWY6CW9vYiBkYXRhIGJ1ZmZlcgogICoKQEAgLTEwMCw3ICs4Nyw3IEBACiAgKiBPT0IgYXJlYS4KICAqLwogc3RydWN0IG10ZF9vb2Jfb3BzIHsKLQltdGRfb29iX21vZGVfdAltb2RlOworCXVuc2lnbmVkIGludAltb2RlOwogCXNpemVfdAkJbGVuOwogCXNpemVfdAkJcmV0bGVuOwogCXNpemVfdAkJb29ibGVuOwpAQCAtMTI1LDYgKzExMiw4IEBACiAJc3RydWN0IG5hbmRfb29iZnJlZSBvb2JmcmVlW01URF9NQVhfT09CRlJFRV9FTlRSSUVTX0xBUkdFXTsKIH07CiAKK3N0cnVjdCBtb2R1bGU7CS8qIG9ubHkgbmVlZGVkIGZvciBvd25lciBmaWVsZCBpbiBtdGRfaW5mbyAqLworCiBzdHJ1Y3QgbXRkX2luZm8gewogCXVfY2hhciB0eXBlOwogCXVpbnQzMl90IGZsYWdzOwpAQCAtMTcyLDcgKzE2MSw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgaW5kZXg7CiAKLQkvKiBlY2MgbGF5b3V0IHN0cnVjdHVyZSBwb2ludGVyIC0gcmVhZCBvbmx5ICEgKi8KKwkvKiBFQ0MgbGF5b3V0IHN0cnVjdHVyZSBwb2ludGVyIC0gcmVhZCBvbmx5ISAqLwogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0OwogCiAJLyogRGF0YSBmb3IgdmFyaWFibGUgZXJhc2UgcmVnaW9ucy4gSWYgbnVtZXJhc2VyZWdpb25zIGlzIHplcm8sCkBAIC0zMjMsMTAgKzMxMiwxNSBAQAogCS8qIEtlcm5lbC1zaWRlIGlvY3RsIGRlZmluaXRpb25zICovCiAKIHN0cnVjdCBtdGRfcGFydGl0aW9uOworc3RydWN0IG10ZF9wYXJ0X3BhcnNlcl9kYXRhOwogCi1leHRlcm4gaW50IG10ZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IG10ZF9pbmZvICptYXN0ZXIsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLAotCQkJICAgICAgIGludCBucl9wYXJ0cyk7CitleHRlcm4gaW50IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgICBjb25zdCBjaGFyICoqcGFydF9wcm9iZV90eXBlcywKKwkJCSAgICAgIHN0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSAqcGFyc2VyX2RhdGEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqZGVmcGFydHMsCisJCQkgICAgICBpbnQgZGVmbnJfcGFydHMpOworI2RlZmluZSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG1hc3RlciwgcGFydHMsIG5yX3BhcnRzKQlcCisJbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtYXN0ZXIsIE5VTEwsIE5VTEwsIHBhcnRzLCBucl9wYXJ0cykKIGV4dGVybiBpbnQgbXRkX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyKTsKIGV4dGVybiBzdHJ1Y3QgbXRkX2luZm8gKmdldF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbnVtKTsKIGV4dGVybiBpbnQgX19nZXRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CkBAIC0zNTUsMjcgKzM0OSwxNiBAQAogCiB2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOwogCi0vKgotICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCi0gKi8KLSNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMAkoMCkJLyogUXVpZXQgICAqLwotI2RlZmluZSBNVERfREVCVUdfTEVWRUwxCSgxKQkvKiBBdWRpYmxlICovCi0jZGVmaW5lIE1URF9ERUJVR19MRVZFTDIJKDIpCS8qIExvdWQgICAgKi8KLSNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMwkoMykJLyogTm9pc3kgICAqLworc3RhdGljIGlubGluZSBpbnQgbXRkX2lzX2JpdGZsaXAoaW50IGVycikgeworCXJldHVybiBlcnIgPT0gLUVVQ0xFQU47Cit9CiAKLSNpZmRlZiBDT05GSUdfTVREX0RFQlVHCi0jZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpZiAobiA8PSBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UpCVwKLQkJCXByaW50ayhLRVJOX0lORk8gYXJncyk7CQlcCi0JfSB3aGlsZSgwKQotI2Vsc2UgLyogQ09ORklHX01URF9ERUJVRyAqLwotI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaWYgKDApCQkJCQlcCi0JCQlwcmludGsoS0VSTl9JTkZPIGFyZ3MpOwkJXAotCX0gd2hpbGUoMCkKK3N0YXRpYyBpbmxpbmUgaW50IG10ZF9pc19lY2NlcnIoaW50IGVycikgeworCXJldHVybiBlcnIgPT0gLUVCQURNU0c7Cit9CiAKLSNlbmRpZiAvKiBDT05GSUdfTVREX0RFQlVHICovCitzdGF0aWMgaW5saW5lIGludCBtdGRfaXNfYml0ZmxpcF9vcl9lY2NlcnIoaW50IGVycikgeworCXJldHVybiBtdGRfaXNfYml0ZmxpcChlcnIpIHx8IG10ZF9pc19lY2NlcnIoZXJyKTsKK30KIAogI2VuZGlmIC8qIF9fTVREX01URF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAppbmRleCBjMmI5YWM0Li45MDQxMzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIEludGVybmFsIGhlbHBlciBmb3IgYm9hcmQgZHJpdmVycyB3aGljaCBuZWVkIHRvIG92ZXJyaWRlIGNvbW1hbmQgZnVuY3Rpb24gKi8KIGV4dGVybiB2b2lkIG5hbmRfd2FpdF9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CiAKLS8qIGxvY2tzIGFsbCBibG9ja2VzIHByZXNlbnQgaW4gdGhlIGRldmljZSAqLworLyogbG9ja3MgYWxsIGJsb2NrcyBwcmVzZW50IGluIHRoZSBkZXZpY2UgKi8KIGV4dGVybiBpbnQgbmFuZF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOwogCi0vKiB1bmxvY2tzIHNwZWNpZmllZCBsb2NrZWQgYmxvY2tlcyAqLworLyogdW5sb2NrcyBzcGVjaWZpZWQgbG9ja2VkIGJsb2NrcyAqLwogZXh0ZXJuIGludCBuYW5kX3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKIAogLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIE5BTkQgY2hpcHMgaW4gYW4gYXJyYXkgKi8KQEAgLTE1MCw3ICsxNTAsNyBAQAogI2RlZmluZSBOQU5EX0VDQ19SRUFECQkwCiAvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHdyaXRlICovCiAjZGVmaW5lIE5BTkRfRUNDX1dSSVRFCQkxCi0vKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tIGlzIHJlYWQgYmFjayBmcm9tIGZsYXNoICovCisvKiBFbmFibGUgSGFyZHdhcmUgRUNDIGJlZm9yZSBzeW5kcm9tZSBpcyByZWFkIGJhY2sgZnJvbSBmbGFzaCAqLwogI2RlZmluZSBOQU5EX0VDQ19SRUFEU1lOCTIKIAogLyogQml0IG1hc2sgZm9yIGZsYWdzIHBhc3NlZCB0byBkb19uYW5kX3JlYWRfZWNjICovCkBAIC0xNjMsNyArMTYzLDcgQEAKICAqLwogLyogQ2hpcCBjYW4gbm90IGF1dG8gaW5jcmVtZW50IHBhZ2VzICovCiAjZGVmaW5lIE5BTkRfTk9fQVVUT0lOQ1IJMHgwMDAwMDAwMQotLyogQnVzd2l0ZGggaXMgMTYgYml0ICovCisvKiBCdXN3aWR0aCBpcyAxNiBiaXQgKi8KICNkZWZpbmUgTkFORF9CVVNXSURUSF8xNgkweDAwMDAwMDAyCiAvKiBEZXZpY2Ugc3VwcG9ydHMgcGFydGlhbCBwcm9ncmFtbWluZyB3aXRob3V0IHBhZGRpbmcgKi8KICNkZWZpbmUgTkFORF9OT19QQURESU5HCQkweDAwMDAwMDA0CkBAIC0yMTksMjcgKzIxOSwxNSBAQAogI2RlZmluZSBOQU5EX0NISVBPUFRJT05TX01TSwkoMHgwMDAwZmZmZiAmIH5OQU5EX05PX0FVVE9JTkNSKQogCiAvKiBOb24gY2hpcCByZWxhdGVkIG9wdGlvbnMgKi8KLS8qCi0gKiBVc2UgYSBmbGFzaCBiYXNlZCBiYWQgYmxvY2sgdGFibGUuIE9PQiBpZGVudGlmaWVyIGlzIHNhdmVkIGluIE9PQiBhcmVhLgotICogVGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGJhZCBibG9jayB0YWJsZSBmdW5jdGlvbi4KLSAqLwotI2RlZmluZSBOQU5EX1VTRV9GTEFTSF9CQlQJMHgwMDAxMDAwMAogLyogVGhpcyBvcHRpb24gc2tpcHMgdGhlIGJidCBzY2FuIGR1cmluZyBpbml0aWFsaXphdGlvbi4gKi8KLSNkZWZpbmUgTkFORF9TS0lQX0JCVFNDQU4JMHgwMDAyMDAwMAorI2RlZmluZSBOQU5EX1NLSVBfQkJUU0NBTgkweDAwMDEwMDAwCiAvKgogICogVGhpcyBvcHRpb24gaXMgZGVmaW5lZCBpZiB0aGUgYm9hcmQgZHJpdmVyIGFsbG9jYXRlcyBpdHMgb3duIGJ1ZmZlcnMKICAqIChlLmcuIGJlY2F1c2UgaXQgbmVlZHMgdGhlbSBETUEtY29oZXJlbnQpLgogICovCi0jZGVmaW5lIE5BTkRfT1dOX0JVRkZFUlMJMHgwMDA0MDAwMAorI2RlZmluZSBOQU5EX09XTl9CVUZGRVJTCTB4MDAwMjAwMDAKIC8qIENoaXAgbWF5IG5vdCBleGlzdCwgc28gc2lsZW5jZSBhbnkgZXJyb3JzIGluIHNjYW4gKi8KLSNkZWZpbmUgTkFORF9TQ0FOX1NJTEVOVF9OT0RFVgkweDAwMDgwMDAwCi0vKgotICogSWYgcGFzc2VkIGFkZGl0aW9uYWxseSB0byBOQU5EX1VTRV9GTEFTSF9CQlQgdGhlbiBCQlQgY29kZSB3aWxsIG5vdCB0b3VjaAotICogdGhlIE9PQiBhcmVhLgotICovCi0jZGVmaW5lIE5BTkRfVVNFX0ZMQVNIX0JCVF9OT19PT0IJMHgwMDgwMDAwMAotLyogQ3JlYXRlIGFuIGVtcHR5IEJCVCB3aXRoIG5vIHZlbmRvciBpbmZvcm1hdGlvbiBpZiB0aGUgQkJUIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBOQU5EX0NSRUFURV9FTVBUWV9CQlQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTkFORF9TQ0FOX1NJTEVOVF9OT0RFVgkweDAwMDQwMDAwCiAKIC8qIE9wdGlvbnMgc2V0IGJ5IG5hbmQgc2NhbiAqLwogLyogTmFuZCBzY2FuIGhhcyBhbGxvY2F0ZWQgY29udHJvbGxlciBzdHJ1Y3QgKi8KQEAgLTMzMSwyNyArMzE5LDI5IEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBuYW5kX2VjY19jdHJsIC0gQ29udHJvbCBzdHJ1Y3R1cmUgZm9yIGVjYwotICogQG1vZGU6CWVjYyBtb2RlCi0gKiBAc3RlcHM6CW51bWJlciBvZiBlY2Mgc3RlcHMgcGVyIHBhZ2UKLSAqIEBzaXplOglkYXRhIGJ5dGVzIHBlciBlY2Mgc3RlcAotICogQGJ5dGVzOgllY2MgYnl0ZXMgcGVyIHN0ZXAKLSAqIEB0b3RhbDoJdG90YWwgbnVtYmVyIG9mIGVjYyBieXRlcyBwZXIgcGFnZQotICogQHByZXBhZDoJcGFkZGluZyBpbmZvcm1hdGlvbiBmb3Igc3luZHJvbWUgYmFzZWQgZWNjIGdlbmVyYXRvcnMKLSAqIEBwb3N0cGFkOglwYWRkaW5nIGluZm9ybWF0aW9uIGZvciBzeW5kcm9tZSBiYXNlZCBlY2MgZ2VuZXJhdG9ycworICogc3RydWN0IG5hbmRfZWNjX2N0cmwgLSBDb250cm9sIHN0cnVjdHVyZSBmb3IgRUNDCisgKiBAbW9kZToJRUNDIG1vZGUKKyAqIEBzdGVwczoJbnVtYmVyIG9mIEVDQyBzdGVwcyBwZXIgcGFnZQorICogQHNpemU6CWRhdGEgYnl0ZXMgcGVyIEVDQyBzdGVwCisgKiBAYnl0ZXM6CUVDQyBieXRlcyBwZXIgc3RlcAorICogQHRvdGFsOgl0b3RhbCBudW1iZXIgb2YgRUNDIGJ5dGVzIHBlciBwYWdlCisgKiBAcHJlcGFkOglwYWRkaW5nIGluZm9ybWF0aW9uIGZvciBzeW5kcm9tZSBiYXNlZCBFQ0MgZ2VuZXJhdG9ycworICogQHBvc3RwYWQ6CXBhZGRpbmcgaW5mb3JtYXRpb24gZm9yIHN5bmRyb21lIGJhc2VkIEVDQyBnZW5lcmF0b3JzCiAgKiBAbGF5b3V0OglFQ0MgbGF5b3V0IGNvbnRyb2wgc3RydWN0IHBvaW50ZXIKLSAqIEBwcml2Oglwb2ludGVyIHRvIHByaXZhdGUgZWNjIGNvbnRyb2wgZGF0YQotICogQGh3Y3RsOglmdW5jdGlvbiB0byBjb250cm9sIGhhcmR3YXJlIGVjYyBnZW5lcmF0b3IuIE11c3Qgb25seQorICogQHByaXY6CXBvaW50ZXIgdG8gcHJpdmF0ZSBFQ0MgY29udHJvbCBkYXRhCisgKiBAaHdjdGw6CWZ1bmN0aW9uIHRvIGNvbnRyb2wgaGFyZHdhcmUgRUNDIGdlbmVyYXRvci4gTXVzdCBvbmx5CiAgKgkJYmUgcHJvdmlkZWQgaWYgYW4gaGFyZHdhcmUgRUNDIGlzIGF2YWlsYWJsZQotICogQGNhbGN1bGF0ZToJZnVuY3Rpb24gZm9yIGVjYyBjYWxjdWxhdGlvbiBvciByZWFkYmFjayBmcm9tIGVjYyBoYXJkd2FyZQotICogQGNvcnJlY3Q6CWZ1bmN0aW9uIGZvciBlY2MgY29ycmVjdGlvbiwgbWF0Y2hpbmcgdG8gZWNjIGdlbmVyYXRvciAoc3cvaHcpCisgKiBAY2FsY3VsYXRlOglmdW5jdGlvbiBmb3IgRUNDIGNhbGN1bGF0aW9uIG9yIHJlYWRiYWNrIGZyb20gRUNDIGhhcmR3YXJlCisgKiBAY29ycmVjdDoJZnVuY3Rpb24gZm9yIEVDQyBjb3JyZWN0aW9uLCBtYXRjaGluZyB0byBFQ0MgZ2VuZXJhdG9yIChzdy9odykKICAqIEByZWFkX3BhZ2VfcmF3OglmdW5jdGlvbiB0byByZWFkIGEgcmF3IHBhZ2Ugd2l0aG91dCBFQ0MKICAqIEB3cml0ZV9wYWdlX3JhdzoJZnVuY3Rpb24gdG8gd3JpdGUgYSByYXcgcGFnZSB3aXRob3V0IEVDQwotICogQHJlYWRfcGFnZToJZnVuY3Rpb24gdG8gcmVhZCBhIHBhZ2UgYWNjb3JkaW5nIHRvIHRoZSBlY2MgZ2VuZXJhdG9yCisgKiBAcmVhZF9wYWdlOglmdW5jdGlvbiB0byByZWFkIGEgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIEVDQyBnZW5lcmF0b3IKICAqCQlyZXF1aXJlbWVudHMuCiAgKiBAcmVhZF9zdWJwYWdlOglmdW5jdGlvbiB0byByZWFkIHBhcnRzIG9mIHRoZSBwYWdlIGNvdmVyZWQgYnkgRUNDLgotICogQHdyaXRlX3BhZ2U6CWZ1bmN0aW9uIHRvIHdyaXRlIGEgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIGVjYyBnZW5lcmF0b3IKKyAqIEB3cml0ZV9wYWdlOglmdW5jdGlvbiB0byB3cml0ZSBhIHBhZ2UgYWNjb3JkaW5nIHRvIHRoZSBFQ0MgZ2VuZXJhdG9yCiAgKgkJcmVxdWlyZW1lbnRzLgorICogQHdyaXRlX29vYl9yYXc6CWZ1bmN0aW9uIHRvIHdyaXRlIGNoaXAgT09CIGRhdGEgd2l0aG91dCBFQ0MKKyAqIEByZWFkX29vYl9yYXc6CWZ1bmN0aW9uIHRvIHJlYWQgY2hpcCBPT0IgZGF0YSB3aXRob3V0IEVDQwogICogQHJlYWRfb29iOglmdW5jdGlvbiB0byByZWFkIGNoaXAgT09CIGRhdGEKICAqIEB3cml0ZV9vb2I6CWZ1bmN0aW9uIHRvIHdyaXRlIGNoaXAgT09CIGRhdGEKICAqLwpAQCAtMzgwLDYgKzM3MCwxMCBAQAogCQkJdWludDMyX3Qgb2ZmcywgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpOwogCXZvaWQgKCp3cml0ZV9wYWdlKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCWNvbnN0IHVpbnQ4X3QgKmJ1Zik7CisJaW50ICgqd3JpdGVfb29iX3Jhdykoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQlpbnQgcGFnZSk7CisJaW50ICgqcmVhZF9vb2JfcmF3KShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCWludCBwYWdlLCBpbnQgc25kY21kKTsKIAlpbnQgKCpyZWFkX29vYikoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlLAogCQkJaW50IHNuZGNtZCk7CiAJaW50ICgqd3JpdGVfb29iKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKQEAgLTM4OCw4ICszODIsOCBAQAogCiAvKioKICAqIHN0cnVjdCBuYW5kX2J1ZmZlcnMgLSBidWZmZXIgc3RydWN0dXJlIGZvciByZWFkL3dyaXRlCi0gKiBAZWNjY2FsYzoJYnVmZmVyIGZvciBjYWxjdWxhdGVkIGVjYwotICogQGVjY2NvZGU6CWJ1ZmZlciBmb3IgZWNjIHJlYWQgZnJvbSBmbGFzaAorICogQGVjY2NhbGM6CWJ1ZmZlciBmb3IgY2FsY3VsYXRlZCBFQ0MKKyAqIEBlY2Njb2RlOglidWZmZXIgZm9yIEVDQyByZWFkIGZyb20gZmxhc2gKICAqIEBkYXRhYnVmOglidWZmZXIgZm9yIGRhdGEgLSBkeW5hbWljYWxseSBzaXplZAogICoKICAqIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIGJ1ZmZlcnMuIGRhdGFidWYgYW5kIG9vYnJidWYgbXVzdCBiZSBpbgpAQCAtNDIyLDcgKzQxNiw3IEBACiAgKgkJCW10ZC0+b29ic2l6ZSwgbXRkLT53cml0ZXNpemUgYW5kIHNvIG9uLgogICoJCQlAaWRfZGF0YSBjb250YWlucyB0aGUgOCBieXRlcyB2YWx1ZXMgb2YgTkFORF9DTURfUkVBRElELgogICoJCQlSZXR1cm4gd2l0aCB0aGUgYnVzIHdpZHRoLgotICogQGRldl9yZWFkeToJCVtCT0FSRFNQRUNJRklDXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc2luZworICogQGRldl9yZWFkeToJCVtCT0FSRFNQRUNJRklDXSBoYXJkd2FyZXNwZWNpZmljIGZ1bmN0aW9uIGZvciBhY2Nlc3NpbmcKICAqCQkJZGV2aWNlIHJlYWR5L2J1c3kgbGluZS4gSWYgc2V0IHRvIE5VTEwgbm8gYWNjZXNzIHRvCiAgKgkJCXJlYWR5L2J1c3kgaXMgYXZhaWxhYmxlIGFuZCB0aGUgcmVhZHkvYnVzeSBpbmZvcm1hdGlvbgogICoJCQlpcyByZWFkIGZyb20gdGhlIGNoaXAgc3RhdHVzIHJlZ2lzdGVyLgpAQCAtNDMwLDE3ICs0MjQsMTcgQEAKICAqCQkJY29tbWFuZHMgdG8gdGhlIGNoaXAuCiAgKiBAd2FpdGZ1bmM6CQlbUkVQTEFDRUFCTEVdIGhhcmR3YXJlc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHdhaXQgb24KICAqCQkJcmVhZHkuCi0gKiBAZWNjOgkJW0JPQVJEU1BFQ0lGSUNdIGVjYyBjb250cm9sIGN0cnVjdHVyZQorICogQGVjYzoJCVtCT0FSRFNQRUNJRklDXSBFQ0MgY29udHJvbCBzdHJ1Y3R1cmUKICAqIEBidWZmZXJzOgkJYnVmZmVyIHN0cnVjdHVyZSBmb3IgcmVhZC93cml0ZQogICogQGh3Y29udHJvbDoJCXBsYXRmb3JtLXNwZWNpZmljIGhhcmR3YXJlIGNvbnRyb2wgc3RydWN0dXJlCi0gKiBAb3BzOgkJb29iIG9wZXJhdGlvbiBvcGVyYW5kcwogICogQGVyYXNlX2NtZDoJCVtJTlRFUk5dIGVyYXNlIGNvbW1hbmQgd3JpdGUgZnVuY3Rpb24sIHNlbGVjdGFibGUgZHVlCiAgKgkJCXRvIEFORCBzdXBwb3J0LgogICogQHNjYW5fYmJ0OgkJW1JFUExBQ0VBQkxFXSBmdW5jdGlvbiB0byBzY2FuIGJhZCBibG9jayB0YWJsZQogICogQGNoaXBfZGVsYXk6CQlbQk9BUkRTUEVDSUZJQ10gY2hpcCBkZXBlbmRlbnQgZGVsYXkgZm9yIHRyYW5zZmVycmluZwogICoJCQlkYXRhIGZyb20gYXJyYXkgdG8gcmVhZCByZWdzICh0UikuCiAgKiBAc3RhdGU6CQlbSU5URVJOXSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTkFORCBkZXZpY2UKLSAqIEBvb2JfcG9pOgkJcG9pc29uIHZhbHVlIGJ1ZmZlcgorICogQG9vYl9wb2k6CQkicG9pc29uIHZhbHVlIGJ1ZmZlciwiIHVzZWQgZm9yIGxheWluZyBvdXQgT09CIGRhdGEKKyAqCQkJYmVmb3JlIHdyaXRpbmcKICAqIEBwYWdlX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBhZ2UgKGNvbHVtbgogICoJCQlhZGRyZXNzIGJpdHMpLgogICogQHBoeXNfZXJhc2Vfc2hpZnQ6CVtJTlRFUk5dIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgaW4gYSBwaHlzaWNhbCBlcmFzZWJsb2NrCkBAIC00NDksNiArNDQzLDkgQEAKICAqIEBvcHRpb25zOgkJW0JPQVJEU1BFQ0lGSUNdIHZhcmlvdXMgY2hpcCBvcHRpb25zLiBUaGV5IGNhbiBwYXJ0bHkKICAqCQkJYmUgc2V0IHRvIGluZm9ybSBuYW5kX3NjYW4gYWJvdXQgc3BlY2lhbCBmdW5jdGlvbmFsaXR5LgogICoJCQlTZWUgdGhlIGRlZmluZXMgZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb24uCisgKiBAYmJ0X29wdGlvbnM6CVtJTlRFUk5dIGJhZCBibG9jayBzcGVjaWZpYyBvcHRpb25zLiBBbGwgb3B0aW9ucyB1c2VkCisgKgkJCWhlcmUgbXVzdCBjb21lIGZyb20gYmJtLmguIEJ5IGRlZmF1bHQsIHRoZXNlIG9wdGlvbnMKKyAqCQkJd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbmRfYmJ0X2Rlc2NyJ3MuCiAgKiBAYmFkYmxvY2twb3M6CVtJTlRFUk5dIHBvc2l0aW9uIG9mIHRoZSBiYWQgYmxvY2sgbWFya2VyIGluIHRoZSBvb2IKICAqCQkJYXJlYS4KICAqIEBiYWRibG9ja2JpdHM6CVtJTlRFUk5dIG51bWJlciBvZiBiaXRzIHRvIGxlZnQtc2hpZnQgdGhlIGJhZCBibG9jawpAQCAtNDY0LDcgKzQ2MSw3IEBACiAgKgkJCW5vbiAwIGlmIE9ORkkgc3VwcG9ydGVkLgogICogQG9uZmlfcGFyYW1zOglbSU5URVJOXSBob2xkcyB0aGUgT05GSSBwYWdlIHBhcmFtZXRlciB3aGVuIE9ORkkgaXMKICAqCQkJc3VwcG9ydGVkLCAwIG90aGVyd2lzZS4KLSAqIEBlY2NsYXlvdXQ6CQlbUkVQTEFDRUFCTEVdIHRoZSBkZWZhdWx0IGVjYyBwbGFjZW1lbnQgc2NoZW1lCisgKiBAZWNjbGF5b3V0OgkJW1JFUExBQ0VBQkxFXSB0aGUgZGVmYXVsdCBFQ0MgcGxhY2VtZW50IHNjaGVtZQogICogQGJidDoJCVtJTlRFUk5dIGJhZCBibG9jayB0YWJsZSBwb2ludGVyCiAgKiBAYmJ0X3RkOgkJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgdGFibGUgZGVzY3JpcHRvciBmb3IgZmxhc2gKICAqCQkJbG9va3VwLgpAQCAtNDcyLDkgKzQ2OSw5IEBACiAgKiBAYmFkYmxvY2tfcGF0dGVybjoJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgc2NhbiBwYXR0ZXJuIHVzZWQgZm9yIGluaXRpYWwKICAqCQkJYmFkIGJsb2NrIHNjYW4uCiAgKiBAY29udHJvbGxlcjoJCVtSRVBMQUNFQUJMRV0gYSBwb2ludGVyIHRvIGEgaGFyZHdhcmUgY29udHJvbGxlcgotICoJCQlzdHJ1Y3R1cmUgd2hpY2ggaXMgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluZGVwZW5kZW5kCisgKgkJCXN0cnVjdHVyZSB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5kZXBlbmRlbnQKICAqCQkJZGV2aWNlcy4KLSAqIEBwcml2OgkJW09QVElPTkFMXSBwb2ludGVyIHRvIHByaXZhdGUgY2hpcCBkYXRlCisgKiBAcHJpdjoJCVtPUFRJT05BTF0gcG9pbnRlciB0byBwcml2YXRlIGNoaXAgZGF0YQogICogQGVycnN0YXQ6CQlbT1BUSU9OQUxdIGhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHBlcmZvcm0KICAqCQkJYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzIChkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZQogICoJCQljb3JyZWN0YWJsZSkuCkBAIC01MDksNiArNTA2LDcgQEAKIAogCWludCBjaGlwX2RlbGF5OwogCXVuc2lnbmVkIGludCBvcHRpb25zOworCXVuc2lnbmVkIGludCBiYnRfb3B0aW9uczsKIAogCWludCBwYWdlX3NoaWZ0OwogCWludCBwaHlzX2VyYXNlX3NoaWZ0OwpAQCAtNTM2LDggKzUzNCw2IEBACiAJc3RydWN0IG5hbmRfYnVmZmVycyAqYnVmZmVyczsKIAlzdHJ1Y3QgbmFuZF9od19jb250cm9sIGh3Y29udHJvbDsKIAotCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7Ci0KIAl1aW50OF90ICpiYnQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiYnRfdGQ7CiAJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiYnRfbWQ7CkBAIC02MTEsMTAgKzYwNyw5IEBACiAgKiBAcGFydGl0aW9uczoJCW10ZCBwYXJ0aXRpb24gbGlzdAogICogQGNoaXBfZGVsYXk6CQlSL0IgZGVsYXkgdmFsdWUgaW4gdXMKICAqIEBvcHRpb25zOgkJT3B0aW9uIGZsYWdzLCBlLmcuIDE2Yml0IGJ1c3dpZHRoCi0gKiBAZWNjbGF5b3V0OgkJZWNjIGxheW91dCBpbmZvIHN0cnVjdHVyZQorICogQGJidF9vcHRpb25zOglCQlQgb3B0aW9uIGZsYWdzLCBlLmcuIE5BTkRfQkJUX1VTRV9GTEFTSAorICogQGVjY2xheW91dDoJCUVDQyBsYXlvdXQgaW5mbyBzdHJ1Y3R1cmUKICAqIEBwYXJ0X3Byb2JlX3R5cGVzOglOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgcHJvYmUgdHlwZXMKLSAqIEBzZXRfcGFydHM6CQlwbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgcGFydGl0aW9ucwotICogQHByaXY6CQloYXJkd2FyZSBjb250cm9sbGVyIHNwZWNpZmljIHNldHRpbmdzCiAgKi8KIHN0cnVjdCBwbGF0Zm9ybV9uYW5kX2NoaXAgewogCWludCBucl9jaGlwczsKQEAgLTYyNCw5ICs2MTksOCBAQAogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0OwogCWludCBjaGlwX2RlbGF5OwogCXVuc2lnbmVkIGludCBvcHRpb25zOworCXVuc2lnbmVkIGludCBiYnRfb3B0aW9uczsKIAljb25zdCBjaGFyICoqcGFydF9wcm9iZV90eXBlczsKLQl2b2lkICgqc2V0X3BhcnRzKSh1aW50NjRfdCBzaXplLCBzdHJ1Y3QgcGxhdGZvcm1fbmFuZF9jaGlwICpjaGlwKTsKLQl2b2lkICpwcml2OwogfTsKIAogLyogS2VlcCBnY2MgaGFwcHkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmQuaAppbmRleCA1MmI2ZjE4Li40NTk2NTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZC5oCkBAIC0xODQsNiArMTg0LDkgQEAKICNkZWZpbmUgT05FTkFORF9JU19DQUNIRV9QUk9HUkFNKHRoaXMpCQkJCQlcCiAJKHRoaXMtPm9wdGlvbnMgJiBPTkVOQU5EX0hBU19DQUNIRV9QUk9HUkFNKQogCisjZGVmaW5lIE9ORU5BTkRfSVNfTk9QXzEodGhpcykJCQkJCQlcCisJKHRoaXMtPm9wdGlvbnMgJiBPTkVOQU5EX0hBU19OT1BfMSkKKwogLyogQ2hlY2sgYnl0ZSBhY2Nlc3MgaW4gT25lTkFORCAqLwogI2RlZmluZSBPTkVOQU5EX0NIRUNLX0JZVEVfQUNDRVNTKGFkZHIpCQkoYWRkciAmIDB4MSkKIApAQCAtMTk1LDYgKzE5OCw3IEBACiAjZGVmaW5lIE9ORU5BTkRfSEFTXzJQTEFORQkJKDB4MDAwNCkKICNkZWZpbmUgT05FTkFORF9IQVNfNEtCX1BBR0UJCSgweDAwMDgpCiAjZGVmaW5lIE9ORU5BTkRfSEFTX0NBQ0hFX1BST0dSQU0JKDB4MDAxMCkKKyNkZWZpbmUgT05FTkFORF9IQVNfTk9QXzEJCSgweDAwMjApCiAjZGVmaW5lIE9ORU5BTkRfU0tJUF9VTkxPQ0tfQ0hFQ0sJKDB4MDEwMCkKICNkZWZpbmUgT05FTkFORF9QQUdFQlVGX0FMTE9DCQkoMHgxMDAwKQogI2RlZmluZSBPTkVOQU5EX09PQkJVRl9BTExPQwkJKDB4MjAwMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaAppbmRleCAzYTZmMDM3Li4yNDc1MjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGFydGl0aW9ucy5oCkBAIC0yNCw3ICsyNCw5IEBACiAgKiAJd2lsbCBleHRlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbWFzdGVyIE1URCBkZXZpY2UuCiAgKiBvZmZzZXQ6IGFic29sdXRlIHN0YXJ0aW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgbWFzdGVyIE1URCBkZXZpY2U7IGlmCiAgKiAJZGVmaW5lZCBhcyBNVERQQVJUX09GU19BUFBFTkQsIHRoZSBwYXJ0aXRpb24gd2lsbCBzdGFydCB3aGVyZSB0aGUKLSAqIAlwcmV2aW91cyBvbmUgZW5kZWQ7IGlmIE1URFBBUlRfT0ZTX05YVEJMSywgYXQgdGhlIG5leHQgZXJhc2UgYmxvY2suCisgKglwcmV2aW91cyBvbmUgZW5kZWQ7IGlmIE1URFBBUlRfT0ZTX05YVEJMSywgYXQgdGhlIG5leHQgZXJhc2UgYmxvY2s7CisgKglpZiBNVERQQVJUX09GU19SRVRBSU4sIGNvbnN1bWUgYXMgbXVjaCBhcyBwb3NzaWJsZSwgbGVhdmluZyBzaXplCisgKglhZnRlciB0aGUgZW5kIG9mIHBhcnRpdGlvbi4KICAqIG1hc2tfZmxhZ3M6IGNvbnRhaW5zIGZsYWdzIHRoYXQgaGF2ZSB0byBiZSBtYXNrZWQgKHJlbW92ZWQpIGZyb20gdGhlCiAgKiAJbWFzdGVyIE1URCBmbGFnIHNldCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgTVREIHBhcnRpdGlvbi4KICAqIAlGb3IgZXhhbXBsZSwgdG8gZm9yY2UgYSByZWFkLW9ubHkgcGFydGl0aW9uLCBzaW1wbHkgYWRkaW5nCkBAIC00MiwxMiArNDQsMjUgQEAKIAlzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgKmVjY2xheW91dDsJLyogb3V0IG9mIGJhbmQgbGF5b3V0IGZvciB0aGlzIHBhcnRpdGlvbiAoTkFORCBvbmx5KSAqLwogfTsKIAorI2RlZmluZSBNVERQQVJUX09GU19SRVRBSU4JKC0zKQogI2RlZmluZSBNVERQQVJUX09GU19OWFRCTEsJKC0yKQogI2RlZmluZSBNVERQQVJUX09GU19BUFBFTkQJKC0xKQogI2RlZmluZSBNVERQQVJUX1NJWl9GVUxMCSgwKQogCiAKIHN0cnVjdCBtdGRfaW5mbzsKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworLyoqCisgKiBzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgLSB1c2VkIHRvIHBhc3MgZGF0YSB0byBNVEQgcGFydGl0aW9uIHBhcnNlcnMuCisgKiBAb3JpZ2luOiBmb3IgUmVkQm9vdCwgc3RhcnQgYWRkcmVzcyBvZiBNVEQgZGV2aWNlCisgKiBAb2Zfbm9kZTogZm9yIE9GIHBhcnNlcnMsIGRldmljZSBub2RlIGNvbnRhaW5pbmcgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBtdGRfcGFydF9wYXJzZXJfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBvcmlnaW47CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworfTsKKwogCiAvKgogICogRnVuY3Rpb25zIGRlYWxpbmcgd2l0aCB0aGUgdmFyaW91cyB3YXlzIG9mIHBhcnRpdGlvbmluZyB0aGUgc3BhY2UKQEAgLTU3LDM3ICs3MiwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAljb25zdCBjaGFyICpuYW1lOwotCWludCAoKnBhcnNlX2ZuKShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiosIHVuc2lnbmVkIGxvbmcpOworCWludCAoKnBhcnNlX2ZuKShzdHJ1Y3QgbXRkX2luZm8gKiwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKiosCisJCQlzdHJ1Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKik7CiB9OwogCiBleHRlcm4gaW50IHJlZ2lzdGVyX210ZF9wYXJzZXIoc3RydWN0IG10ZF9wYXJ0X3BhcnNlciAqcGFyc2VyKTsKIGV4dGVybiBpbnQgZGVyZWdpc3Rlcl9tdGRfcGFyc2VyKHN0cnVjdCBtdGRfcGFydF9wYXJzZXIgKnBhcnNlcik7Ci1leHRlcm4gaW50IHBhcnNlX210ZF9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBjb25zdCBjaGFyICoqdHlwZXMsCi0JCQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsIHVuc2lnbmVkIGxvbmcgb3JpZ2luKTsKLQotI2RlZmluZSBwdXRfcGFydGl0aW9uX3BhcnNlcihwKSBkbyB7IG1vZHVsZV9wdXQoKHApLT5vd25lcik7IH0gd2hpbGUoMCkKLQotc3RydWN0IGRldmljZTsKLXN0cnVjdCBkZXZpY2Vfbm9kZTsKLQotI2lmZGVmIENPTkZJR19NVERfT0ZfUEFSVFMKLWludCBfX2RldmluaXQgb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCQkgIHN0cnVjdCBtdGRfcGFydGl0aW9uICoqcHBhcnRzKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLXN0YXRpYyBpbmxpbmUgaW50IG10ZF9oYXNfY21kbGluZXBhcnQodm9pZCkgeyByZXR1cm4gMTsgfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG10ZF9oYXNfY21kbGluZXBhcnQodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCiAKIGludCBtdGRfaXNfcGFydGl0aW9uKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIGludCBtdGRfYWRkX3BhcnRpdGlvbihzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciwgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaAppbmRleCBlNWYyMWQyLi4wNGUwMTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9waHlzbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCkBAIC0zMiwyMSArMzIsNCBAQAogCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIH07CiAKLS8qCi0gKiBCb2FyZCBuZWVkcyB0byBzcGVjaWZ5IHRoZSBleGFjdCBtYXBwaW5nIGR1cmluZyB0aGVpciBzZXR1cCB0aW1lLgotICovCi12b2lkIHBoeXNtYXBfY29uZmlndXJlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQlpbnQgYmFua3dpZHRoLCB2b2lkICgqc2V0X3ZwcCkoc3RydWN0IG1hcF9pbmZvICosIGludCkgKTsKLQotLyoKLSAqIE1hY2hpbmVzIHRoYXQgd2lzaCB0byBkbyBmbGFzaCBwYXJ0aXRpb24gbWF5IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGluCi0gKiB0aGVpciBzZXR1cCByb3V0aW5lLgotICoKLSAqCXBoeXNtYXBfc2V0X3BhcnRpdGlvbnMobXlwYXJ0aXRpb25zLCBudW1fcGFydHMpOwotICoKLSAqIE5vdGUgdGhhdCBvbmUgY2FuIGFsd2F5cyBvdmVycmlkZSB0aGlzIGhhcmQtY29kZWQgcGFydGl0aW9uIHdpdGgKLSAqIGNvbW1hbmQgbGluZSBwYXJ0aXRpb24gKHlvdSBuZWVkIHRvIGVuYWJsZSBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMpLgotICovCi12b2lkIHBoeXNtYXBfc2V0X3BhcnRpdGlvbnMoc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzLCBpbnQgbnVtX3BhcnRzKTsKLQogI2VuZGlmIC8qIF9fTElOVVhfTVREX1BIWVNNQVBfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYW1laS5oIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCmluZGV4IDQwOTMyOGQuLmZmYzAyMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmFtZWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKQEAgLTY3LDYgKzY3LDcgQEAKICNkZWZpbmUgTE9PS1VQX0VNUFRZCQkweDQwMDAKIAogZXh0ZXJuIGludCB1c2VyX3BhdGhfYXQoaW50LCBjb25zdCBjaGFyIF9fdXNlciAqLCB1bnNpZ25lZCwgc3RydWN0IHBhdGggKik7CitleHRlcm4gaW50IHVzZXJfcGF0aF9hdF9lbXB0eShpbnQsIGNvbnN0IGNoYXIgX191c2VyICosIHVuc2lnbmVkLCBzdHJ1Y3QgcGF0aCAqLCBpbnQgKmVtcHR5KTsKIAogI2RlZmluZSB1c2VyX3BhdGgobmFtZSwgcGF0aCkgdXNlcl9wYXRoX2F0KEFUX0ZEQ1dELCBuYW1lLCBMT09LVVBfRk9MTE9XLCBwYXRoKQogI2RlZmluZSB1c2VyX2xwYXRoKG5hbWUsIHBhdGgpIHVzZXJfcGF0aF9hdChBVF9GRENXRCwgbmFtZSwgMCwgcGF0aCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGRmMWM4MzYuLmNiZWI1ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMjYyMiwyMyArMjYyMiwyMyBAQAogZXh0ZXJuIGludCBfX25ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpOwogCi1leHRlcm4gaW50IG5ldGRldl9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwotZXh0ZXJuIGludCBuZXRkZXZfZW1lcmcoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfYWxlcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfY3JpdChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IG5ldGRldl9lcnIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfd2Fybihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50IG5ldGRldl9ub3RpY2UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludCBuZXRkZXZfaW5mbyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gX19wcmludGYoMywgNCkKK2ludCBuZXRkZXZfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IG5ldGRldl9lbWVyZyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfYWxlcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgbmV0ZGV2X2NyaXQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgbmV0ZGV2X2Vycihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfd2Fybihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMykKK2ludCBuZXRkZXZfbm90aWNlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiBfX3ByaW50ZigyLCAzKQoraW50IG5ldGRldl9pbmZvKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKIAogI2RlZmluZSBNT0RVTEVfQUxJQVNfTkVUREVWKGRldmljZSkgXAogCU1PRFVMRV9BTElBUygibmV0ZGV2LSIgZGV2aWNlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAppbmRleCBmOTkzMGM4Li5jM2I0NTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZApAQCAtMTIsMyArMTIsNCBAQAogaGVhZGVyLXkgKz0gaXB0X2Vjbi5oCiBoZWFkZXIteSArPSBpcHRfcmVhbG0uaAogaGVhZGVyLXkgKz0gaXB0X3R0bC5oCitoZWFkZXIteSArPSBuZl9uYXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NjFkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBfTElOVVhfTkZfTkFUX0gKKyNkZWZpbmUgX0xJTlVYX05GX05BVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIElQX05BVF9SQU5HRV9NQVBfSVBTIDEKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCAyCisjZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00gNAorI2RlZmluZSBJUF9OQVRfUkFOR0VfUEVSU0lTVEVOVCA4CisKKy8qIFRoZSBwcm90b2NvbC1zcGVjaWZpYyBtYW5pcHVsYWJsZSBwYXJ0cyBvZiB0aGUgdHVwbGUuICovCit1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvIHsKKwkvKiBBZGQgb3RoZXIgcHJvdG9jb2xzIGhlcmUuICovCisJX19iZTE2IGFsbDsKKworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gdGNwOworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gdWRwOworCXN0cnVjdCB7CisJCV9fYmUxNiBpZDsKKwl9IGljbXA7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSBkY2NwOworCXN0cnVjdCB7CisJCV9fYmUxNiBwb3J0OworCX0gc2N0cDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYga2V5OwkvKiBHUkUga2V5IGlzIDMyYml0LCBQUHRQIG9ubHkgdXNlcyAxNmJpdCAqLworCX0gZ3JlOworfTsKKworLyogU2luZ2xlIHJhbmdlIHNwZWNpZmljYXRpb24uICovCitzdHJ1Y3QgbmZfbmF0X3JhbmdlIHsKKwkvKiBTZXQgdG8gT1Igb2YgZmxhZ3MgYWJvdmUuICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLworCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKKworCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlciAqLworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gbWluLCBtYXg7Cit9OworCisvKiBGb3IgYmFja3dhcmRzIGNvbXBhdDogZG9uJ3QgdXNlIGluIG1vZGVybiBjb2RlLiAqLworc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgeworCXVuc2lnbmVkIGludCByYW5nZXNpemU7IC8qIE11c3QgYmUgMS4gKi8KKworCS8qIGhhbmdzIG9mZiBlbmQuICovCisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVsxXTsKK307CisKKyNkZWZpbmUgbmZfbmF0X211bHRpX3JhbmdlIG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCmluZGV4IDgxODBjZDkuLjgzNzRkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIE5FVExJTktfU0NTSVRSQU5TUE9SVAkxOAkvKiBTQ1NJIFRyYW5zcG9ydHMgKi8KICNkZWZpbmUgTkVUTElOS19FQ1JZUFRGUwkxOQogI2RlZmluZSBORVRMSU5LX1JETUEJCTIwCisjZGVmaW5lIE5FVExJTktfQ1JZUFRPCQkyMQkvKiBDcnlwdG8gbGF5ZXIgKi8KIAogI2RlZmluZSBNQVhfTElOS1MgMzIJCQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mYy5oIGIvaW5jbHVkZS9saW51eC9uZmMuaAppbmRleCAzNmNiOTU1Li44OWZlZTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZjLmgKQEAgLTYyLDYgKzYyLDggQEAKIAlORkNfQ01EX0dFVF9ERVZJQ0UsCiAJTkZDX0NNRF9ERVZfVVAsCiAJTkZDX0NNRF9ERVZfRE9XTiwKKwlORkNfQ01EX0RFUF9MSU5LX1VQLAorCU5GQ19DTURfREVQX0xJTktfRE9XTiwKIAlORkNfQ01EX1NUQVJUX1BPTEwsCiAJTkZDX0NNRF9TVE9QX1BPTEwsCiAJTkZDX0NNRF9HRVRfVEFSR0VULApAQCAtODYsNiArODgsOCBAQAogICogQE5GQ19BVFRSX1RBUkdFVF9TRU5TX1JFUzogTkZDLUEgdGFyZ2V0cyBleHRyYSBpbmZvcm1hdGlvbiBzdWNoIGFzIE5GQ0lECiAgKiBATkZDX0FUVFJfVEFSR0VUX1NFTF9SRVM6IE5GQy1BIHRhcmdldHMgZXh0cmEgaW5mb3JtYXRpb24gKHVzZWZ1bCBpZiB0aGUKICAqCXRhcmdldCBpcyBub3QgTkZDLUZvcnVtIGNvbXBsaWFudCkKKyAqIEBORkNfQVRUUl9DT01NX01PREU6IFBhc3NpdmUgb3IgYWN0aXZlIG1vZGUKKyAqIEBORkNfQVRUUl9SRl9NT0RFOiBJbml0aWF0b3Igb3IgdGFyZ2V0CiAgKi8KIGVudW0gbmZjX2F0dHJzIHsKIAlORkNfQVRUUl9VTlNQRUMsCkBAIC05NSw2ICs5OSw4IEBACiAJTkZDX0FUVFJfVEFSR0VUX0lOREVYLAogCU5GQ19BVFRSX1RBUkdFVF9TRU5TX1JFUywKIAlORkNfQVRUUl9UQVJHRVRfU0VMX1JFUywKKwlORkNfQVRUUl9DT01NX01PREUsCisJTkZDX0FUVFJfUkZfTU9ERSwKIC8qIHByaXZhdGU6IGludGVybmFsIHVzZSBvbmx5ICovCiAJX19ORkNfQVRUUl9BRlRFUl9MQVNUCiB9OwpAQCAtMTExLDYgKzExNywxNCBAQAogCiAjZGVmaW5lIE5GQ19QUk9UT19NQVgJCTYKIAorLyogTkZDIGNvbW11bmljYXRpb24gbW9kZXMgKi8KKyNkZWZpbmUgTkZDX0NPTU1fQUNUSVZFICAwCisjZGVmaW5lIE5GQ19DT01NX1BBU1NJVkUgMQorCisvKiBORkMgUkYgbW9kZXMgKi8KKyNkZWZpbmUgTkZDX1JGX0lOSVRJQVRPUiAwCisjZGVmaW5lIE5GQ19SRl9UQVJHRVQgICAgMQorCiAvKiBORkMgcHJvdG9jb2xzIG1hc2tzIHVzZWQgaW4gYml0c2V0cyAqLwogI2RlZmluZSBORkNfUFJPVE9fSkVXRUxfTUFTSwkoMSA8PCBORkNfUFJPVE9fSkVXRUwpCiAjZGVmaW5lIE5GQ19QUk9UT19NSUZBUkVfTUFTSwkoMSA8PCBORkNfUFJPVE9fTUlGQVJFKQpAQCAtMTI1LDkgKzEzOSwyMiBAQAogCV9fdTMyIG5mY19wcm90b2NvbDsKIH07CiAKKyNkZWZpbmUgTkZDX0xMQ1BfTUFYX1NFUlZJQ0VfTkFNRSA2Mworc3RydWN0IHNvY2thZGRyX25mY19sbGNwIHsKKwlzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisJX191MzIgZGV2X2lkeDsKKwlfX3UzMiB0YXJnZXRfaWR4OworCV9fdTMyIG5mY19wcm90b2NvbDsKKwlfX3U4IGRzYXA7IC8qIERlc3RpbmF0aW9uIFNBUCwgaWYga25vd24gKi8KKwlfX3U4IHNzYXA7IC8qIFNvdXJjZSBTQVAgdG8gYmUgYm91bmQgdG8gKi8KKwljaGFyIHNlcnZpY2VfbmFtZVtORkNfTExDUF9NQVhfU0VSVklDRV9OQU1FXTsgLyogU2VydmljZSBuYW1lIFVSSSAqLzsKKwlzaXplX3Qgc2VydmljZV9uYW1lX2xlbjsKK307CisKIC8qIE5GQyBzb2NrZXQgcHJvdG9jb2xzICovCiAjZGVmaW5lIE5GQ19TT0NLUFJPVE9fUkFXCTAKLSNkZWZpbmUgTkZDX1NPQ0tQUk9UT19NQVgJMQorI2RlZmluZSBORkNfU09DS1BST1RPX0xMQ1AJMQorI2RlZmluZSBORkNfU09DS1BST1RPX01BWAkyCiAKICNkZWZpbmUgTkZDX0hFQURFUl9TSVpFIDEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKaW5kZXggNjBhMTM3Yi4uYWIyYzYzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCkBAIC0yMjksNiArMjI5LDcgQEAKICNkZWZpbmUgTkZTX0lOT19DT01NSVQJCSg3KQkJLyogaW5vZGUgaXMgY29tbWl0dGluZyB1bnN0YWJsZSB3cml0ZXMgKi8KICNkZWZpbmUgTkZTX0lOT19QTkZTX0NPTU1JVAkoOCkJCS8qIHVzZSBwbmZzIGNvZGUgZm9yIGNvbW1pdCAqLwogI2RlZmluZSBORlNfSU5PX0xBWU9VVENPTU1JVAkoOSkJCS8qIGxheW91dGNvbW1pdCByZXF1aXJlZCAqLworI2RlZmluZSBORlNfSU5PX0xBWU9VVENPTU1JVFRJTkcgKDEwKQkJLyogbGF5b3V0Y29tbWl0IGluZmxpZ2h0ICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mc19pbm9kZSAqTkZTX0koY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKaW5kZXggMzE1MmRkZi4uZjc5NWNiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKKysrIGIvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKQEAgLTUzOCw2ICs1MzgsOSBAQAogICoJT0xCQyBoYW5kbGluZyBpbiBob3N0YXBkLiBCZWFjb25zIGFyZSByZXBvcnRlZCBpbiAlTkw4MDIxMV9DTURfRlJBTUUKICAqCW1lc3NhZ2VzLiBOb3RlIHRoYXQgcGVyIFBIWSBvbmx5IG9uZSBhcHBsaWNhdGlvbiBtYXkgcmVnaXN0ZXIuCiAgKgorICogQE5MODAyMTFfQ01EX1NFVF9OT0FDS19NQVA6IHNldHMgYSBiaXRtYXAgZm9yIHRoZSBpbmRpdmlkdWFsIFRJRHMgd2hldGhlcgorICogICAgICBObyBBY2tub3dsZWRnZW1lbnQgUG9saWN5IHNob3VsZCBiZSBhcHBsaWVkLgorICoKICAqIEBOTDgwMjExX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICogQF9fTkw4MDIxMV9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTY3NSw2ICs2NzgsOCBAQAogCiAJTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF80QUREUl9GUkFNRSwKIAorCU5MODAyMTFfQ01EX1NFVF9OT0FDS19NQVAsCisKIAkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KIAogCS8qIHVzZWQgdG8gZGVmaW5lIE5MODAyMTFfQ01EX01BWCBiZWxvdyAqLwpAQCAtMTE2MCw2ICsxMTY1LDMzIEBACiAgKgogICogQE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTOiBUaGlzIHUzMiBhdHRyaWJ1dGUgY29udGFpbnMgZmxhZ3MgZnJvbQogICoJJmVudW0gbmw4MDIxMV9mZWF0dXJlX2ZsYWdzIGFuZCBpcyBhZHZlcnRpc2VkIGluIHdpcGh5IGluZm9ybWF0aW9uLgorICogQE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQ6IEluZGljYXRlcyB0aGF0IHRoZSBIVyByZXNwb25kcyB0byBwcm9iZQorICoKKyAqCXJlcXVlc3RzIHdoaWxlIG9wZXJhdGluZyBpbiBBUC1tb2RlLgorICoJVGhpcyBhdHRyaWJ1dGUgaG9sZHMgYSBiaXRtYXAgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yCisgKglvZmZsb2FkaW5nIChzZWUgJmVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BST0JFX1JFU1A6IFByb2JlIFJlc3BvbnNlIHRlbXBsYXRlIGRhdGEuIENvbnRhaW5zIHRoZSBlbnRpcmUKKyAqCXByb2JlLXJlc3BvbnNlIGZyYW1lLiBUaGUgREEgZmllbGQgaW4gdGhlIDgwMi4xMSBoZWFkZXIgaXMgemVyby1lZCBvdXQsCisgKgl0byBiZSBmaWxsZWQgYnkgdGhlIEZXLgorICogQE5MODAyMTFfQVRUUl9ESVNBQkxFX0hUOiAgRm9yY2UgSFQgY2FwYWJsZSBpbnRlcmZhY2VzIHRvIGRpc2FibGUKKyAqICAgICAgdGhpcyBmZWF0dXJlLiAgQ3VycmVudGx5LCBvbmx5IHN1cHBvcnRlZCBpbiBtYWM4MDIxMSBkcml2ZXJzLgorICogQE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0s6IFNwZWNpZnkgd2hpY2ggYml0cyBvZiB0aGUKKyAqICAgICAgQVRUUl9IVF9DQVBBQklMSVRZIHRvIHdoaWNoIGF0dGVudGlvbiBzaG91bGQgYmUgcGFpZC4KKyAqICAgICAgQ3VycmVudGx5LCBvbmx5IG1hYzgwMjExIE5JQ3Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisgKiAgICAgIFRoZSB2YWx1ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBhcmU6CisgKiAgICAgICBNQ1MgcmF0ZXMsIE1BWC1BTVNEVSwgSFQtMjAtNDAgYW5kIEhUX0NBUF9TR0lfNDAKKyAqICAgICAgIEFNUERVIGRlbnNpdHkgYW5kIEFNUERVIGZhY3Rvci4KKyAqICAgICAgQWxsIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBzdWdnZXN0aW9ucyBhbmQgbWF5IGJlIGlnbm9yZWQKKyAqICAgICAgYnkgdGhlIGRyaXZlciBhcyByZXF1aXJlZC4gIFRoZSBhY3R1YWwgdmFsdWVzIG1heSBiZSBzZWVuIGluCisgKiAgICAgIHRoZSBzdGF0aW9uIGRlYnVnZnMgaHRfY2FwcyBmaWxlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfREZTX1JFR0lPTjogcmVnaW9uIGZvciByZWd1bGF0b3J5IHJ1bGVzIHdoaWNoIHRoaXMgY291bnRyeQorICogICAgYWJpZGVzIHRvIHdoZW4gaW5pdGlhdGluZyByYWRpYXRpb24gb24gREZTIGNoYW5uZWxzLiBBIGNvdW50cnkgbWFwcworICogICAgdG8gb25lIERGUyByZWdpb24uCisgKgorICogQE5MODAyMTFfQVRUUl9OT0FDS19NQVA6IFRoaXMgdTE2IGJpdG1hcCBjb250YWlucyB0aGUgTm8gQWNrIFBvbGljeSBvZgorICogICAgICB1cCB0byAxNiBUSURzLgogICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKQEAgLTEzOTUsNiArMTQyNywxNyBAQAogCiAJTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsCiAKKwlOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF9PRkZMT0FELAorCisJTkw4MDIxMV9BVFRSX1BST0JFX1JFU1AsCisKKwlOTDgwMjExX0FUVFJfREZTX1JFR0lPTiwKKworCU5MODAyMTFfQVRUUl9ESVNBQkxFX0hULAorCU5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisKKwlOTDgwMjExX0FUVFJfTk9BQ0tfTUFQLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMTQ5Myw3ICsxNTM2LDExIEBACiAgKiBATkw4MDIxMV9TVEFfRkxBR19XTUU6IHN0YXRpb24gaXMgV01FL1FvUyBjYXBhYmxlCiAgKiBATkw4MDIxMV9TVEFfRkxBR19NRlA6IHN0YXRpb24gdXNlcyBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24KICAqIEBOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQ6IHN0YXRpb24gaXMgYXV0aGVudGljYXRlZAotICogQE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSOiBzdGF0aW9uIGlzIGEgVERMUyBwZWVyCisgKiBATkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVI6IHN0YXRpb24gaXMgYSBURExTIHBlZXIgLS0gdGhpcyBmbGFnIHNob3VsZAorICoJb25seSBiZSB1c2VkIGluIG1hbmFnZWQgbW9kZSAoZXZlbiBpbiB0aGUgZmxhZ3MgbWFzaykuIE5vdGUgdGhhdCB0aGUKKyAqCWZsYWcgY2FuJ3QgYmUgY2hhbmdlZCwgaXQgaXMgb25seSB2YWxpZCB3aGlsZSBhZGRpbmcgYSBzdGF0aW9uLCBhbmQKKyAqCWF0dGVtcHRzIHRvIGNoYW5nZSBpdCB3aWxsIHNpbGVudGx5IGJlIGlnbm9yZWQgKHJhdGhlciB0aGFuIHJlamVjdGVkCisgKglhcyBlcnJvcnMuKQogICogQE5MODAyMTFfU1RBX0ZMQUdfTUFYOiBoaWdoZXN0IHN0YXRpb24gZmxhZyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTE5MDQsNiArMTk1MSwyMSBAQAogfTsKIAogLyoqCisgKiBlbnVtIG5sODAyMTFfZGZzX3JlZ2lvbnMgLSByZWd1bGF0b3J5IERGUyByZWdpb25zCisgKgorICogQE5MODAyMTFfREZTX1VOU0VUOiBDb3VudHJ5IGhhcyBubyBERlMgbWFzdGVyIHJlZ2lvbiBzcGVjaWZpZWQKKyAqIEBOTDgwMjExX0RGU19GQ0NfOiBDb3VudHJ5IGZvbGxvd3MgREZTIG1hc3RlciBydWxlcyBmcm9tIEZDQworICogQE5MODAyMTFfREZTX0ZDQ186IENvdW50cnkgZm9sbG93cyBERlMgbWFzdGVyIHJ1bGVzIGZyb20gRVRTSQorICogQE5MODAyMTFfREZTX0pQXzogQ291bnRyeSBmb2xsb3dzIERGUyBtYXN0ZXIgcnVsZXMgZnJvbSBKUC9NS0svVGVsZWMKKyAqLworZW51bSBubDgwMjExX2Rmc19yZWdpb25zIHsKKwlOTDgwMjExX0RGU19VTlNFVAk9IDAsCisJTkw4MDIxMV9ERlNfRkNDCQk9IDEsCisJTkw4MDIxMV9ERlNfRVRTSQk9IDIsCisJTkw4MDIxMV9ERlNfSlAJCT0gMywKK307CisKKy8qKgogICogZW51bSBubDgwMjExX3N1cnZleV9pbmZvIC0gc3VydmV5IGluZm9ybWF0aW9uCiAgKgogICogVGhlc2UgYXR0cmlidXRlIHR5cGVzIGFyZSB1c2VkIHdpdGggJU5MODAyMTFfQVRUUl9TVVJWRVlfSU5GTwpAQCAtMjAzNiw2ICsyMDk4LDEwIEBACiAgKiBhY2Nlc3MgdG8gYSBicm9hZGVyIG5ldHdvcmsgYmV5b25kIHRoZSBNQlNTLiAgVGhpcyBpcyBkb25lIHZpYSBSb290CiAgKiBBbm5vdW5jZW1lbnQgZnJhbWVzLgogICoKKyAqIEBOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUw6IFRoZSBtaW5pbXVtIGludGVydmFsIG9mIHRpbWUgKGluCisgKiBUVXMpIGR1cmluZyB3aGljaCBhIG1lc2ggU1RBIGNhbiBzZW5kIG9ubHkgb25lIEFjdGlvbiBmcmFtZSBjb250YWluaW5nIGEKKyAqIFBFUlIgZWxlbWVudC4KKyAqCiAgKiBATkw4MDIxMV9NRVNIQ09ORl9BVFRSX01BWDogaGlnaGVzdCBwb3NzaWJsZSBtZXNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlCiAgKgogICogQF9fTkw4MDIxMV9NRVNIQ09ORl9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQpAQCAtMjA1OSw2ICsyMTI1LDcgQEAKIAlOTDgwMjExX01FU0hDT05GX0VMRU1FTlRfVFRMLAogCU5MODAyMTFfTUVTSENPTkZfSFdNUF9SQU5OX0lOVEVSVkFMLAogCU5MODAyMTFfTUVTSENPTkZfR0FURV9BTk5PVU5DRU1FTlRTLAorCU5MODAyMTFfTUVTSENPTkZfSFdNUF9QRVJSX01JTl9JTlRFUlZBTCwKIAogCS8qIGtlZXAgbGFzdCAqLwogCV9fTkw4MDIxMV9NRVNIQ09ORl9BVFRSX0FGVEVSX0xBU1QsCkBAIC0yNzIyLDkgKzI3ODksMzIgQEAKICAqIEBOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTOiBUaGlzIGRyaXZlciBzdXBwb3J0cyByZWZsZWN0aW5nIGJhY2sKICAqCVRYIHN0YXR1cyB0byB0aGUgc29ja2V0IGVycm9yIHF1ZXVlIHdoZW4gcmVxdWVzdGVkIHdpdGggdGhlCiAgKglzb2NrZXQgb3B0aW9uLgorICogQE5MODAyMTFfRkVBVFVSRV9IVF9JQlNTOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBJQlNTIHdpdGggSFQgZGF0YXJhdGVzLgogICovCiBlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncyB7CiAJTkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUwk9IDEgPDwgMCwKKwlOTDgwMjExX0ZFQVRVUkVfSFRfSUJTUwkJPSAxIDw8IDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyIC0gb3B0aW9uYWwgc3VwcG9ydGVkCisgKglwcm90b2NvbHMgZm9yIHByb2JlLXJlc3BvbnNlIG9mZmxvYWRpbmcgYnkgdGhlIGRyaXZlci9GVy4KKyAqCVRvIGJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQgYXR0cmlidXRlLgorICoJRWFjaCBlbnVtIHZhbHVlIHJlcHJlc2VudHMgYSBiaXQgaW4gdGhlIGJpdG1hcCBvZiBzdXBwb3J0ZWQKKyAqCXByb3RvY29scy4gVHlwaWNhbGx5IGEgc3Vic2V0IG9mIHByb2JlLXJlcXVlc3RzIGJlbG9uZ2luZyB0byBhCisgKglzdXBwb3J0ZWQgcHJvdG9jb2wgd2lsbCBiZSBleGNsdWRlZCBmcm9tIG9mZmxvYWQgYW5kIHVwbG9hZGVkCisgKgl0byB0aGUgaG9zdC4KKyAqCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF9XUFM6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDEKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzI6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDIKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1AyUDogU3VwcG9ydCBmb3IgUDJQCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF84MDIxMVU6IFN1cHBvcnQgZm9yIDgwMi4xMXUKKyAqLworZW51bSBubDgwMjExX3Byb2JlX3Jlc3Bfb2ZmbG9hZF9zdXBwb3J0X2F0dHIgeworCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfV1BTID0JMTw8MCwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzIgPQkxPDwxLAorCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQID0JMTw8MiwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUXzgwMjExVSA9CTE8PDMsCiB9OwogCiAjZW5kaWYgLyogX19MSU5VWF9OTDgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2YuaCBiL2luY2x1ZGUvbGludXgvb2YuaAppbmRleCA5MTgwZGM1Li40OTQ4NTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZi5oCkBAIC0xNywxMSArMTcsMTMgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAogdHlwZWRlZiB1MzIgcGhhbmRsZTsKIHR5cGVkZWYgdTMyIGloYW5kbGU7CkBAIC02OCw2ICs3MCw3IEBACiAvKiBQb2ludGVyIGZvciBmaXJzdCBlbnRyeSBpbiBjaGFpbiBvZiBhbGwgbm9kZXMuICovCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICphbGxub2RlczsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2Nob3NlbjsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2FsaWFzZXM7CiBleHRlcm4gcndsb2NrX3QgZGV2dHJlZV9sb2NrOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQodm9pZCkKQEAgLTE5OSwxNiArMjAyLDI2IEBACiAJCQkJICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgdTMyICpvdXRfdmFsdWVzLAogCQkJCSAgICAgIHNpemVfdCBzeik7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTY0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU2NCAqb3V0X3ZhbHVlKTsKIAogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgaW50IGluZGV4LCBjb25zdCBjaGFyICoqb3V0cHV0KTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUpOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKIAkJCQkgICBjb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKIGV4dGVybiBjb25zdCB2b2lkICpvZl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJaW50ICpsZW5wKTsKKyNkZWZpbmUgZm9yX2VhY2hfcHJvcGVydHkocHAsIHByb3BlcnRpZXMpIFwKKwlmb3IgKHBwID0gcHJvcGVydGllczsgcHAgIT0gTlVMTDsgcHAgPSBwcC0+bmV4dCkKKwogZXh0ZXJuIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gaW50IG9mX25fc2l6ZV9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9ub2RlKApAQCAtMjIxLDYgKzIzNCw5IEBACiAJY29uc3QgY2hhciAqbGlzdF9uYW1lLCBjb25zdCBjaGFyICpjZWxsc19uYW1lLCBpbnQgaW5kZXgsCiAJc3RydWN0IGRldmljZV9ub2RlICoqb3V0X25vZGUsIGNvbnN0IHZvaWQgKipvdXRfYXJncyk7CiAKK2V4dGVybiB2b2lkIG9mX2FsaWFzX3NjYW4odm9pZCAqICgqZHRfYWxsb2MpKHU2NCBzaXplLCB1NjQgYWxpZ24pKTsKK2V4dGVybiBpbnQgb2ZfYWxpYXNfZ2V0X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnN0ZW0pOworCiBleHRlcm4gaW50IG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZShjb25zdCBjaGFyICpjb21wYXQpOwogCiBleHRlcm4gaW50IHByb21fYWRkX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSogbnAsIHN0cnVjdCBwcm9wZXJ0eSogcHJvcCk7CkBAIC0yMzUsNiArMjUxLDcgQEAKIGV4dGVybiB2b2lkIG9mX2RldGFjaF9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKICNlbmRpZgogCisjZGVmaW5lIG9mX21hdGNoX3B0cihfcHRyKQkoX3B0cikKICNlbHNlIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW5saW5lIGJvb2wgb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQodm9pZCkKQEAgLTI0Miw2ICsyNTksMjIgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKyNkZWZpbmUgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwYXJlbnQsIGNoaWxkKSBcCisJd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCQkJaW50ICpsZW5wKQoreworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCQkgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQpAQCAtMjU2LDYgKzI4OSwxOSBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCwKKwkJCQkJCWNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpwcm9wbmFtZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpvZl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJaW50ICpsZW5wKQpAQCAtMjYzLDYgKzMwOSwzMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTY0ICpvdXRfdmFsdWUpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZV9ub2RlICpvZl9wYXJzZV9waGFuZGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQkgICBjb25zdCBjaGFyICpwaGFuZGxlX25hbWUsCisJCQkJCQkgICBpbnQgaW5kZXgpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2FsaWFzX2dldF9pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpzdGVtKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqY29tcGF0KQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIG9mX21hdGNoX3B0cihfcHRyKQlOVUxMCisjZGVmaW5lIG9mX21hdGNoX25vZGUoX21hdGNoZXMsIF9ub2RlKQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaAppbmRleCBjZDJlNjFjLi5kMDMwN2VlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfaXJxLmgKQEAgLTMzLDYgKzMzLDggQEAKIAl1MzIgc3BlY2lmaWVyW09GX01BWF9JUlFfU1BFQ107IC8qIFNwZWNpZmllciBjb3B5ICovCiB9OwogCit0eXBlZGVmIGludCAoKm9mX2lycV9pbml0X2NiX3QpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CisKIC8qCiAgKiBXb3JrYXJvdW5kcyBvbmx5IGFwcGxpZWQgdG8gMzJiaXQgcG93ZXJtYWMgbWFjaGluZXMKICAqLwpAQCAtNzMsNiArNzUsNyBAQAogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IG5yX2lycXMpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2ZpbmRfcGFyZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQpOwogCitleHRlcm4gdm9pZCBvZl9pcnFfaW5pdChjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzKTsKIAogI2VuZGlmIC8qIENPTkZJR19PRl9JUlEgKi8KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbGludXgvb2ZfcGxhdGZvcm0uaAppbmRleCA1YTZmNDU4Li4wNDBjZTJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9wbGF0Zm9ybS5oCkBAIC0xMiw3ICsxMiw2IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19PRl9ERVZJQ0UKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oIGIvaW5jbHVkZS9saW51eC9vbWFwM2lzcC5oCmluZGV4IGI2MTExZjguLmM3M2EzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb21hcDNpc3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L29tYXAzaXNwLmgKQEAgLTYyLDE0ICs2MiwxMiBAQAogICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCOiBBRVdCIHN0YXRpc3RpY3MgZGF0YSByZWFkeQogICogVjRMMl9FVkVOVF9PTUFQM0lTUF9BRjogQUYgc3RhdGlzdGljcyBkYXRhIHJlYWR5CiAgKiBWNEwyX0VWRU5UX09NQVAzSVNQX0hJU1Q6IEhpc3RvZ3JhbSBzdGF0aXN0aWNzIGRhdGEgcmVhZHkKLSAqIFY0TDJfRVZFTlRfT01BUDNJU1BfSFNfVlM6IEhvcml6b250YWwvdmVydGljYWwgc3luY2hyb25pemF0aW9uIGRldGVjdGVkCiAgKi8KIAogI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTCShWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQgfCAweDEwMCkKICNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9BRVdCCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgxKQogI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0FGCQkoVjRMMl9FVkVOVF9PTUFQM0lTUF9DTEFTUyB8IDB4MikKICNkZWZpbmUgVjRMMl9FVkVOVF9PTUFQM0lTUF9ISVNUCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHgzKQotI2RlZmluZSBWNEwyX0VWRU5UX09NQVAzSVNQX0hTX1ZTCShWNEwyX0VWRU5UX09NQVAzSVNQX0NMQVNTIHwgMHg0KQogCiBzdHJ1Y3Qgb21hcDNpc3Bfc3RhdF9ldmVudF9zdGF0dXMgewogCV9fdTMyIGZyYW1lX251bWJlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb29tLmggYi9pbmNsdWRlL2xpbnV4L29vbS5oCmluZGV4IDEzYjdiMDIuLjZmOWQwNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb29tLmgKKysrIGIvaW5jbHVkZS9saW51eC9vb20uaApAQCAtNDAsNiArNDAsNyBAQAogCUNPTlNUUkFJTlRfTUVNQ0csCiB9OwogCitleHRlcm4gdm9pZCBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihpbnQgb2xkX3ZhbCwgaW50IG5ld192YWwpOwogZXh0ZXJuIGludCB0ZXN0X3NldF9vb21fc2NvcmVfYWRqKGludCBuZXdfdmFsKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBvb21fYmFkbmVzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29wcC5oIGIvaW5jbHVkZS9saW51eC9vcHAuaAppbmRleCA4N2E5MjA4Li5lZTk0YjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29wcC5oCisrKyBiL2luY2x1ZGUvbGludXgvb3BwLmgKQEAgLTk3LDExICs5NywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc3JjdV9ub3RpZmllcl9oZWFkICpvcHBfZ2V0X25vdGlmaWVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNyY3Vfbm90aWZpZXJfaGVhZCAqb3BwX2dldF9ub3RpZmllcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9Ci0jZW5kaWYJCS8qIENPTkZJR19QTSAqLworI2VuZGlmCQkvKiBDT05GSUdfUE1fT1BQICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfRlJFUSkgJiYgZGVmaW5lZChDT05GSUdfUE1fT1BQKQogaW50IG9wcF9pbml0X2NwdWZyZXFfdGFibGUoc3RydWN0IGRldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2ktYXRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaAppbmRleCA2NTU4MjRmLi5lM2QwYjM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hdHMuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgTElOVVhfUENJX0FUU19ICiAjZGVmaW5lIExJTlVYX1BDSV9BVFNfSAogCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKIC8qIEFkZHJlc3MgVHJhbnNsYXRpb24gU2VydmljZSAqLwogc3RydWN0IHBjaV9hdHMgewogCWludCBwb3M7ICAgICAgICAvKiBjYXBhYmlsaXR5IHBvc2l0aW9uICovCkBAIC0xNSw2ICsxNyw3IEBACiBleHRlcm4gaW50IHBjaV9lbmFibGVfYXRzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcyk7CiBleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9hdHMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IHBjaV9hdHNfcXVldWVfZGVwdGgoc3RydWN0IHBjaV9kZXYgKmRldik7CisKIC8qKgogICogcGNpX2F0c19lbmFibGVkIC0gcXVlcnkgdGhlIEFUUyBzdGF0dXMKICAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCkBAIC00OSw0ICs1Miw3NiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BDSV9JT1YgKi8KIAorI2lmZGVmIENPTkZJR19QQ0lfUFJJCisKK2V4dGVybiBpbnQgIHBjaV9lbmFibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgcmVxcyk7CitleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGJvb2wgcGNpX3ByaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2V4dGVybiBpbnQgIHBjaV9yZXNldF9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGJvb2wgcGNpX3ByaV9zdG9wcGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2V4dGVybiBpbnQgIHBjaV9wcmlfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworI2Vsc2UgLyogQ09ORklHX1BDSV9QUkkgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGNpX2VuYWJsZV9wcmkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiByZXFzKQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2Rpc2FibGVfcHJpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcGNpX3ByaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpX3Jlc2V0X3ByaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSBib29sIHBjaV9wcmlfc3RvcHBlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNpX3ByaV9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSV9QUkkgKi8KKworI2lmZGVmIENPTkZJR19QQ0lfUEFTSUQKKworZXh0ZXJuIGludCBwY2lfZW5hYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZmVhdHVyZXMpOworZXh0ZXJuIHZvaWQgcGNpX2Rpc2FibGVfcGFzaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGludCBwY2lfcGFzaWRfZmVhdHVyZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworZXh0ZXJuIGludCBwY2lfbWF4X3Bhc2lkcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKKyNlbHNlICAvKiBDT05GSUdfUENJX1BBU0lEICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9lbmFibGVfcGFzaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBmZWF0dXJlcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9kaXNhYmxlX3Bhc2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBwY2lfcGFzaWRfZmVhdHVyZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9tYXhfcGFzaWRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiAtRUlOVkFMOworfQorCisjZW5kaWYgLyogQ09ORklHX1BDSV9QQVNJRCAqLworCisKICNlbmRpZiAvKiBMSU5VWF9QQ0lfQVRTX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggZjFiMWNhMS4uMzM3ZGYwZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAJdW5zaWduZWQgaW50CXBtZV9zdXBwb3J0OjU7CS8qIEJpdG1hc2sgb2Ygc3RhdGVzIGZyb20gd2hpY2ggUE1FIwogCQkJCQkgICBjYW4gYmUgZ2VuZXJhdGVkICovCiAJdW5zaWduZWQgaW50CXBtZV9pbnRlcnJ1cHQ6MTsKKwl1bnNpZ25lZCBpbnQJcG1lX3BvbGw6MTsJLyogUG9sbCBkZXZpY2UncyBQTUUgc3RhdHVzIGJpdCAqLwogCXVuc2lnbmVkIGludAlkMV9zdXBwb3J0OjE7CS8qIExvdyBwb3dlciBzdGF0ZSBEMSBpcyBzdXBwb3J0ZWQgKi8KIAl1bnNpZ25lZCBpbnQJZDJfc3VwcG9ydDoxOwkvKiBMb3cgcG93ZXIgc3RhdGUgRDIgaXMgc3VwcG9ydGVkICovCiAJdW5zaWduZWQgaW50CW5vX2QxZDI6MTsJLyogT25seSBhbGxvdyBEMCBhbmQgRDMgKi8KQEAgLTk1Nyw2ICs5NTgsNyBAQAogaW50IHBjaV9jZmdfc3BhY2Vfc2l6ZV9leHQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2NmZ19zcGFjZV9zaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdW5zaWduZWQgY2hhciBwY2lfYnVzX21heF9idXNucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKK3ZvaWQgcGNpX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogI2RlZmluZSBQQ0lfVkdBX1NUQVRFX0NIQU5HRV9CUklER0UgKDEgPDwgMCkKICNkZWZpbmUgUENJX1ZHQV9TVEFURV9DSEFOR0VfREVDT0RFUyAoMSA8PCAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCmluZGV4IDVkMDljYmEuLjQ1ZmMxNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKQEAgLTEzMiwxMyArMTMyLDkgQEAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIHBjaV9ocF9jaGFuZ2Vfc2xvdF9pbmZvCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LAogCQkJCQkJIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9ocF9yZWdpc3RlcihzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LAotCQkJCSAgc3RydWN0IHBjaV9idXMgKnBidXMsCi0JCQkJICBpbnQgZGV2bnIsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIF9fcGNpX2hwX3JlZ2lzdGVyKHNsb3QsIHBidXMsIGRldm5yLCBuYW1lLAotCQkJCSBUSElTX01PRFVMRSwgS0JVSUxEX01PRE5BTUUpOwotfQorLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSBwY2lfaHBfcmVnaXN0ZXIoc2xvdCwgcGJ1cywgZGV2bnIsIG5hbWUpIFwKKwlfX3BjaV9ocF9yZWdpc3RlcihzbG90LCBwYnVzLCBkZXZuciwgbmFtZSwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQogCiAvKiBQQ0kgU2V0dGluZyBSZWNvcmQgKFR5cGUgMCkgKi8KIHN0cnVjdCBocHBfdHlwZTAgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBhZTk2YmJlLi4xNzJiYTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMjMwMiw2ICsyMzAyLDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVORVNBU19TSDc3ODUJMHgwMDA3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVORVNBU19TSDc3ODYJMHgwMDEwCiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFCTB4MTkyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NPTEFSRkxBUkVfU0ZDNDAwMEFfMAkweDA3MDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TT0xBUkZMQVJFX1NGQzQwMDBBXzEJMHg2NzAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU09MQVJGTEFSRV9TRkM0MDAwQgkweDA3MTAKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RESSAgICAgICAgICAgICAgIDB4MTkyRQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RESV9FSENJICAgICAgICAgIDB4MDEwMQogCkBAIC0yNDAwLDYgKzI0MDUsOCBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQVpXQVZFCQkweDFhM2IKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FTTUVESUEJCTB4MWIyMQorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfVEVLUkFNCQkweDFkZTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9URUtSQU1fREMyOTAJMHhkYzI5CiAKQEAgLTI4NjgsMyArMjg3NSw1IEBACiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YRU4JCTB4NTg1MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1hFTl9QTEFURk9STQkweDAwMDEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX09DWgkJMHgxYjg1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggZTg4NDA5Ni4uYjVkOTY1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtNjYzLDYgKzY2MywyNiBAQAogI2RlZmluZSAgUENJX0FUU19DVFJMX1NUVSh4KQkoKHgpICYgMHgxZikJLyogU21hbGxlc3QgVHJhbnNsYXRpb24gVW5pdCAqLwogI2RlZmluZSAgUENJX0FUU19NSU5fU1RVCTEyCS8qIHNoaWZ0IG9mIG1pbmltdW0gU1RVIGJsb2NrICovCiAKKy8qIFBhZ2UgUmVxdWVzdCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgUENJX1BSSV9DQVAJCTB4MTMgICAgLyogUFJJIGNhcGFiaWxpdHkgSUQgKi8KKyNkZWZpbmUgUENJX1BSSV9DT05UUk9MX09GRgkweDA0CS8qIE9mZnNldCBvZiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9QUklfU1RBVFVTX09GRgkweDA2CS8qIE9mZnNldCBvZiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BSSV9FTkFCTEUJCTB4MDAwMQkvKiBFbmFibGUgbWFzayAqLworI2RlZmluZSBQQ0lfUFJJX1JFU0VUCQkweDAwMDIJLyogUmVzZXQgYml0IG1hc2sgKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfUkYJMHgwMDAxICAvKiBSZXF1ZXN0IEZhaWx1cmUgKi8KKyNkZWZpbmUgUENJX1BSSV9TVEFUVVNfVVBSR0kJMHgwMDAyICAvKiBVbmV4cGVjdGVkIFBSRyBpbmRleCAqLworI2RlZmluZSBQQ0lfUFJJX1NUQVRVU19TVE9QUEVECTB4MDEwMCAgLyogUFJJIFN0b3BwZWQgKi8KKyNkZWZpbmUgUENJX1BSSV9NQVhfUkVRX09GRgkweDA4CS8qIENhcCBvZmZzZXQgZm9yIG1heCByZXFzIHN1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfUFJJX0FMTE9DX1JFUV9PRkYJMHgwYwkvKiBDYXAgb2Zmc2V0IGZvciBtYXggcmVxcyBhbGxvd2VkICovCisKKy8qIFBBU0lEIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0NBUAkJMHgxYiAgICAvKiBQQVNJRCBjYXBhYmlsaXR5IElEICovCisjZGVmaW5lIFBDSV9QQVNJRF9DQVBfT0ZGCTB4MDQgICAgLyogUEFTSUQgZmVhdHVyZSByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfUEFTSURfQ09OVFJPTF9PRkYgICAweDA2ICAgIC8qIFBBU0lEIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BBU0lEX0VOQUJMRQkweDAxCS8qIEVuYWJsZS9TdXBwb3J0ZWQgYml0ICovCisjZGVmaW5lIFBDSV9QQVNJRF9FWEVDCQkweDAyCS8qIEV4ZWMgcGVybWlzc2lvbnMgRW5hYmxlL1N1cHBvcnRlZCAqLworI2RlZmluZSBQQ0lfUEFTSURfUFJJVgkJMHgwNAkvKiBQcml2aWxlZGdlIE1vZGUgRW5hYmxlL1N1cHBvcnQgKi8KKwogLyogU2luZ2xlIFJvb3QgSS9PIFZpcnR1YWxpemF0aW9uICovCiAjZGVmaW5lIFBDSV9TUklPVl9DQVAJCTB4MDQJLyogU1ItSU9WIENhcGFiaWxpdGllcyAqLwogI2RlZmluZSAgUENJX1NSSU9WX0NBUF9WRk0JMHgwMQkvKiBWRiBNaWdyYXRpb24gQ2FwYWJsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waW5jdHJsL3BpbmN0cmwuaCBiL2luY2x1ZGUvbGludXgvcGluY3RybC9waW5jdHJsLmgKaW5kZXggMzYwNWU5NC4uMDRjMDExMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waW5jdHJsL3BpbmN0cmwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpbmN0cmwvcGluY3RybC5oCkBAIC0xMjEsNiArMTIxLDcgQEAKIGV4dGVybiB2b2lkICpwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpOwogI2Vsc2UKIAorc3RydWN0IHBpbmN0cmxfZGV2OwogCiAvKiBTdWZmaWNpZW50bHkgc3R1cGlkIGRlZmF1bHQgZnVuY3Rpb24gd2hlbiBwaW5jdHJsIGlzIG5vdCBpbiB1c2UgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBwaW5faXNfdmFsaWQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCBpbnQgcGluKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2xlZHMtcmVuZXNhcy10cHUuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXJlbmVzYXMtdHB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1Mzg3MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXJlbmVzYXMtdHB1LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX0xFRFNfUkVORVNBU19UUFVfSF9fCisjZGVmaW5lIF9fTEVEU19SRU5FU0FTX1RQVV9IX18KKworc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgcGluX2dwaW9fZm47CisJdW5zaWduZWQgcGluX2dwaW87CisJdW5zaWduZWQgaW50IGNoYW5uZWxfb2Zmc2V0OworCXVuc2lnbmVkIGludCB0aW1lcl9iaXQ7CisJdW5zaWduZWQgaW50IG1heF9icmlnaHRuZXNzOworCXVuc2lnbmVkIGludCByZWZyZXNoX3JhdGU7Cit9OworCisjZW5kaWYgLyogX19MRURTX1JFTkVTQVNfVFBVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggNjUxYTA2Ni4uMmEyM2Y3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC0xOTAsNiArMTkwLDIzIEBACiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRhdGEpOwogfQogCisvKiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBkbworICogYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUgaW5pdC9leGl0LiAgVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mCisgKiBib2lsZXJwbGF0ZS4gIEVhY2ggbW9kdWxlIG1heSBvbmx5IHVzZSB0aGlzIG1hY3JvIG9uY2UsIGFuZAorICogY2FsbGluZyBpdCByZXBsYWNlcyBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpCisgKi8KKyNkZWZpbmUgbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihfX3BsYXRmb3JtX2RyaXZlcikgXAorc3RhdGljIGludCBfX2luaXQgX19wbGF0Zm9ybV9kcml2ZXIjI19pbml0KHZvaWQpIFwKK3sgXAorCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJihfX3BsYXRmb3JtX2RyaXZlcikpOyBcCit9IFwKK21vZHVsZV9pbml0KF9fcGxhdGZvcm1fZHJpdmVyIyNfaW5pdCk7IFwKK3N0YXRpYyB2b2lkIF9fZXhpdCBfX3BsYXRmb3JtX2RyaXZlciMjX2V4aXQodm9pZCkgXAoreyBcCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJihfX3BsYXRmb3JtX2RyaXZlcikpOyBcCit9IFwKK21vZHVsZV9leGl0KF9fcGxhdGZvcm1fZHJpdmVyIyNfZXhpdCk7CisKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9jcmVhdGVfYnVuZGxlKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRyaXZlciwKIAkJCQkJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiksCiAJCQkJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbl9yZXMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaCBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCmluZGV4IDcwYjI4NDAuLmQ4ZDkwMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIF9MSU5VWF9QTV9SVU5USU1FX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHBzLWdwaW8uaCBiL2luY2x1ZGUvbGludXgvcHBzLWdwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM1YWJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wcHMtZ3Bpby5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBwcHMtZ3Bpby5oIC0tIFBQUyBjbGllbnQgZm9yIEdQSU9zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKYW1lcyBOdXNzIDxqYW1lc251c3NAbmFub21ldHJpY3MuY2E+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1BQU19HUElPX0gKKyNkZWZpbmUgX1BQU19HUElPX0gKKworc3RydWN0IHBwc19ncGlvX3BsYXRmb3JtX2RhdGEgeworCWJvb2wgYXNzZXJ0X2ZhbGxpbmdfZWRnZTsKKwlib29sIGNhcHR1cmVfY2xlYXI7CisJdW5zaWduZWQgaW50IGdwaW9fcGluOworCWNvbnN0IGNoYXIgKmdwaW9fbGFiZWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJpbnRrLmggYi9pbmNsdWRlL2xpbnV4L3ByaW50ay5oCmluZGV4IDAxMDFkNTUuLmYwZTIyZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJpbnRrLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmludGsuaApAQCAtODIsMjIgKzgyLDIyIEBACiAgKiBEdW1teSBwcmludGsgZm9yIGRpc2FibGVkIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHVzZSB3aGlsc3QgbWFpbnRhaW5pbmcKICAqIGdjYydzIGZvcm1hdCBhbmQgc2lkZS1lZmZlY3QgY2hlY2tpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCiBpbnQgbm9fcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXJldHVybiAwOwogfQogCi1leHRlcm4gYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKK2V4dGVybiBhc21saW5rYWdlIF9fcHJpbnRmKDEsIDIpCiB2b2lkIGVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGV4dGVybiBpbnQgcHJpbnRrX25lZWRzX2NwdShpbnQgY3B1KTsKIGV4dGVybiB2b2lkIHByaW50a190aWNrKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1BSSU5USwotYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDApKSkKK2FzbWxpbmthZ2UgX19wcmludGYoMSwgMCkKIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKLWFzbWxpbmthZ2UgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIF9fY29sZAorYXNtbGlua2FnZSBfX3ByaW50ZigxLCAyKSBfX2NvbGQKIGludCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKgpAQCAtMTE3LDEyICsxMTcsMTIgQEAKIHZvaWQgbG9nX2J1Zl9rZXhlY19zZXR1cCh2b2lkKTsKIHZvaWQgX19pbml0IHNldHVwX2xvZ19idWYoaW50IGVhcmx5KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMCkpKQorc3RhdGljIGlubGluZSBfX3ByaW50ZigxLCAwKQogaW50IHZwcmludGsoY29uc3QgY2hhciAqcywgdmFfbGlzdCBhcmdzKQogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgX19jb2xkCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpIF9fY29sZAogaW50IHByaW50ayhjb25zdCBjaGFyICpzLCAuLi4pCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaAppbmRleCBjYzAzYmJmLi5lYTU2NzMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKQEAgLTMyLDE1ICszMiwxNSBAQAogc3RydWN0IHBzdG9yZV9pbmZvIHsKIAlzdHJ1Y3QgbW9kdWxlCSpvd25lcjsKIAljaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbXV0ZXgJYnVmX211dGV4OwkvKiBzZXJpYWxpemUgYWNjZXNzIHRvICdidWYnICovCisJc3BpbmxvY2tfdAlidWZfbG9jazsJLyogc2VyaWFsaXplIGFjY2VzcyB0byAnYnVmJyAqLwogCWNoYXIJCSpidWY7CiAJc2l6ZV90CQlidWZzaXplOwogCWludAkJKCpvcGVuKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJaW50CQkoKmNsb3NlKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJc3NpemVfdAkJKCpyZWFkKSh1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAogCQkJc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7Ci0JdTY0CQkoKndyaXRlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAotCQkJc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKKwlpbnQJCSgqd3JpdGUpKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0ICppZCwKKwkJCXVuc2lnbmVkIGludCBwYXJ0LCBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogCWludAkJKCplcmFzZSkoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCiAJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJdm9pZAkJKmRhdGE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmggYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKaW5kZXggMjZmOWUzNi4uZDkzZjk1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaApAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBxdW90YV9lcnJvcihzYiwgZm10LCBhcmdzLi4uKSBcCiAJX19xdW90YV9lcnJvcigoc2IpLCBfX2Z1bmNfXywgZm10ICwgIyMgYXJncykKIAotZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitleHRlcm4gX19wcmludGYoMywgNCkKIHZvaWQgX19xdW90YV9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jLAogCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCmluZGV4IGQxMzA1OWYuLjhmNzQ1MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaApAQCAtOTEsNiArOTEsMTkgQEAKIAlzdGF0ZS0+czMgPSBfX3NlZWQoaSwgMTUpOwogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfUkFORE9NCisjIGluY2x1ZGUgPGFzbS9hcmNocmFuZG9tLmg+CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYXJjaF9nZXRfcmFuZG9tX2xvbmcodW5zaWduZWQgbG9uZyAqdikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfZ2V0X3JhbmRvbV9pbnQodW5zaWduZWQgaW50ICp2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1JBTkRPTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaAppbmRleCAzZGFhYzJkLi42OTAyNzZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKQEAgLTE1LDggKzE1LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorc3RydWN0IG1vZHVsZTsKIHN0cnVjdCBpMmNfY2xpZW50Owogc3RydWN0IHNwaV9kZXZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCmluZGV4IGI0Nzc3MWEuLmY3NzU2ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaApAQCAtMTQxLDYgKzE0MSw3IEBACiBpbnQgcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKTsKIGludCByZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpOwogaW50IHJlZ3VsYXRvcl9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcik7CitpbnQgcmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbXMpOwogCiBpbnQgcmVndWxhdG9yX2J1bGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG51bV9jb25zdW1lcnMsCiAJCSAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqY29uc3VtZXJzKTsKQEAgLTIxMSw2ICsyMTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmVndWxhdG9yX2Rpc2FibGVfZGVmZXJyZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCQkgICAgIGludCBtcykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCAxYTgwYmM3Li41MmM4OWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBfX0xJTlVYX1JFR1VMQVRPUl9EUklWRVJfSF8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKIHN0cnVjdCByZWd1bGF0b3JfZGV2OwpAQCAtMTk5LDYgKzIwMCw5IEBACiAJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzOwogCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsJLyogZm9yIHRyZWUgKi8KIAorCXN0cnVjdCBkZWxheWVkX3dvcmsgZGlzYWJsZV93b3JrOworCWludCBkZWZlcnJlZF9kaXNhYmxlczsKKwogCXZvaWQgKnJlZ19kYXRhOwkJLyogcmVndWxhdG9yX2RldiBkYXRhICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2dwaW8tcmVndWxhdG9yLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZmJkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9ncGlvLXJlZ3VsYXRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBncGlvLXJlZ3VsYXRvci5oCisgKgorICogQ29weXJpZ2h0IDIwMTEgSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4KKyAqCisgKiBiYXNlZCBvbiBmaXhlZC5oCisgKgorICogQ29weXJpZ2h0IDIwMDggV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbgorICogUm9nZXIgUXVhZHJvcyA8ZXh0LXJvZ2VyLnF1YWRyb3NAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1JFR1VMQVRPUl9HUElPX0gKKyNkZWZpbmUgX19SRUdVTEFUT1JfR1BJT19ICisKK3N0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOworCitlbnVtIHJlZ3VsYXRvcl90eXBlOworCisvKioKKyAqIHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSAtIHN0YXRlIGRlc2NyaXB0aW9uCisgKiBAdmFsdWU6CQltaWNyb3ZvbHRzIG9yIG1pY3JvYW1wcworICogQGdwaW9zOgkJYml0ZmllbGQgb2YgZ3BpbyB0YXJnZXQtc3RhdGVzIGZvciB0aGUgdmFsdWUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzdXBwb3J0ZWQgc2V0dGluZyBvZiB0aGUgcmVndWxhdG9yCisgKiBhbmQgdGhlIG5lY2Vzc2FyeSBncGlvLXN0YXRlIHRvIGFjaGlldmUgaXQuCisgKgorICogVGhlIG4tdGggYml0IGluIHRoZSBiaXRmaWVsZCBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBuLXRoIEdQSU8KKyAqIGZyb20gdGhlIGdwaW9zLWFycmF5IGRlZmluZWQgaW4gZ3Bpb19yZWd1bGF0b3JfY29uZmlnIGJlbG93LgorICovCitzdHJ1Y3QgZ3Bpb19yZWd1bGF0b3Jfc3RhdGUgeworCWludCB2YWx1ZTsKKwlpbnQgZ3Bpb3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBncGlvX3JlZ3VsYXRvcl9jb25maWcgLSBjb25maWcgc3RydWN0dXJlCisgKiBAc3VwcGx5X25hbWU6CU5hbWUgb2YgdGhlIHJlZ3VsYXRvciBzdXBwbHkKKyAqIEBlbmFibGVfZ3BpbzoJR1BJTyB0byB1c2UgZm9yIGVuYWJsZSBjb250cm9sCisgKgkJCXNldCB0byAtRUlOVkFMIGlmIG5vdCB1c2VkCisgKiBAZW5hYmxlX2hpZ2g6CVBvbGFyaXR5IG9mIGVuYWJsZSBHUElPCisgKgkJCTEgPSBBY3RpdmUgaGlnaCwgMCA9IEFjdGl2ZSBsb3cKKyAqIEBlbmFibGVkX2F0X2Jvb3Q6CVdoZXRoZXIgcmVndWxhdG9yIGhhcyBiZWVuIGVuYWJsZWQgYXQKKyAqCQkJYm9vdCBvciBub3QuIDEgPSBZZXMsIDAgPSBObworICoJCQlUaGlzIGlzIHVzZWQgdG8ga2VlcCB0aGUgcmVndWxhdG9yIGF0CisgKgkJCXRoZSBkZWZhdWx0IHN0YXRlCisgKiBAc3RhcnR1cF9kZWxheToJU3RhcnQtdXAgdGltZSBpbiBtaWNyb3NlY29uZHMKKyAqIEBncGlvczoJCUFycmF5IGNvbnRhaW5pbmcgdGhlIGdwaW9zIG5lZWRlZCB0byBjb250cm9sCisgKgkJCXRoZSBzZXR0aW5nIG9mIHRoZSByZWd1bGF0b3IKKyAqIEBucl9ncGlvczoJCU51bWJlciBvZiBncGlvcworICogQHN0YXRlczoJCUFycmF5IG9mIGdwaW9fcmVndWxhdG9yX3N0YXRlIGVudHJpZXMgZGVzY3JpYmluZworICoJCQl0aGUgZ3BpbyBzdGF0ZSBmb3Igc3BlY2lmaWMgdm9sdGFnZXMKKyAqIEBucl9zdGF0ZXM6CQlOdW1iZXIgb2Ygc3RhdGVzIGF2YWlsYWJsZQorICogQHJlZ3VsYXRvcl90eXBlOgllaXRoZXIgUkVHVUxBVE9SX0NVUlJFTlQgb3IgUkVHVUxBVE9SX1ZPTFRBR0UKKyAqIEBpbml0X2RhdGE6CQlyZWd1bGF0b3JfaW5pdF9kYXRhCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZ3Bpby12b2x0YWdlIHJlZ3VsYXRvciBjb25maWd1cmF0aW9uCisgKiBpbmZvcm1hdGlvbiB0aGF0IG11c3QgYmUgcGFzc2VkIGJ5IHBsYXRmb3JtIGNvZGUgdG8gdGhlCisgKiBncGlvLXZvbHRhZ2UgcmVndWxhdG9yIGRyaXZlci4KKyAqLworc3RydWN0IGdwaW9fcmVndWxhdG9yX2NvbmZpZyB7CisJY29uc3QgY2hhciAqc3VwcGx5X25hbWU7CisKKwlpbnQgZW5hYmxlX2dwaW87CisJdW5zaWduZWQgZW5hYmxlX2hpZ2g6MTsKKwl1bnNpZ25lZCBlbmFibGVkX2F0X2Jvb3Q6MTsKKwl1bnNpZ25lZCBzdGFydHVwX2RlbGF5OworCisJc3RydWN0IGdwaW8gKmdwaW9zOworCWludCBucl9ncGlvczsKKworCXN0cnVjdCBncGlvX3JlZ3VsYXRvcl9zdGF0ZSAqc3RhdGVzOworCWludCBucl9zdGF0ZXM7CisKKwllbnVtIHJlZ3VsYXRvcl90eXBlIHR5cGU7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCmluZGV4IGNlMzEyN2EuLmYzZjEzZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAqLwogc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgewogCi0JY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpuYW1lOwogCiAJLyogdm9sdGFnZSBvdXRwdXQgcmFuZ2UgKGluY2x1c2l2ZSkgLSBmb3Igdm9sdGFnZSBjb250cm9sICovCiAJaW50IG1pbl91VjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvX2lkcy5oIGIvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKaW5kZXggMGNlZTAxNS4uYjY2ZDEzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW9faWRzLmgKQEAgLTM5LDUgKzM5LDYgQEAKICNkZWZpbmUgUklPX0RJRF9JRFRDUFMxNjE2CQkweDAzNzkKICNkZWZpbmUgUklPX0RJRF9JRFRWUFMxNjE2CQkweDAzNzcKICNkZWZpbmUgUklPX0RJRF9JRFRTUFMxNjE2CQkweDAzNzgKKyNkZWZpbmUgUklPX0RJRF9UU0k3MjEJCQkweDgwYWIKIAogI2VuZGlmCQkJCS8qIExJTlVYX1JJT19JRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMvc2lyZnNvY19ydGNpb2JyZy5oIGIvaW5jbHVkZS9saW51eC9ydGMvc2lyZnNvY19ydGNpb2JyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOTJlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy9zaXJmc29jX3J0Y2lvYnJnLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIFJUQyBJL08gQnJpZGdlIGludGVyZmFjZXMgZm9yIENTUiBTaVJGcHJpbWFJSQorICogQVJNIGFjY2VzcyB0aGUgcmVnaXN0ZXJzIG9mIFNZU1JUQywgR1BTUlRDIGFuZCBQV1JDIHRocm91Z2ggdGhpcyBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQ2FtYnJpZGdlIFNpbGljb24gUmFkaW8gTGltaXRlZCwgYSBDU1IgcGxjIGdyb3VwIGNvbXBhbnkuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIuCisgKi8KKyNpZm5kZWYgX1NJUkZTT0NfUlRDX0lPQlJHX0hfCisjZGVmaW5lIF9TSVJGU09DX1JUQ19JT0JSR19IXworCitleHRlcm4gdm9pZCBzaXJmc29jX3J0Y19pb2JyZ19iZXN5bmNpbmcodm9pZCk7CisKK2V4dGVybiB1MzIgc2lyZnNvY19ydGNfaW9icmdfcmVhZGwodTMyIGFkZHIpOworCitleHRlcm4gdm9pZCBzaXJmc29jX3J0Y19pb2JyZ193cml0ZWwodTMyIHZhbCwgdTMyIGFkZHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBlOGFjY2U3Li42OGRhZjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNTIyLDYgKzE1MjIsMTMgQEAKIAlpbnQgbWFrZV9pdF9mYWlsOwogI2VuZGlmCiAJc3RydWN0IHByb3BfbG9jYWxfc2luZ2xlIGRpcnRpZXM7CisJLyoKKwkgKiB3aGVuIChucl9kaXJ0aWVkID49IG5yX2RpcnRpZWRfcGF1c2UpLCBpdCdzIHRpbWUgdG8gY2FsbAorCSAqIGJhbGFuY2VfZGlydHlfcGFnZXMoKSBmb3Igc29tZSBkaXJ0eSB0aHJvdHRsaW5nIHBhdXNlCisJICovCisJaW50IG5yX2RpcnRpZWQ7CisJaW50IG5yX2RpcnRpZWRfcGF1c2U7CisKICNpZmRlZiBDT05GSUdfTEFURU5DWVRPUAogCWludCBsYXRlbmN5X3JlY29yZF9jb3VudDsKIAlzdHJ1Y3QgbGF0ZW5jeV9yZWNvcmQgbGF0ZW5jeV9yZWNvcmRbTFRfU0FWRUNPVU5UXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VtLmggYi9pbmNsdWRlL2xpbnV4L3NlbS5oCmluZGV4IDFmZWIyZGUuLjEwZDZiMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZW0uaApAQCAtODMsMTMgKzgzLDYgQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCi0vKiBPbmUgc2VtYXBob3JlIHN0cnVjdHVyZSBmb3IgZWFjaCBzZW1hcGhvcmUgaW4gdGhlIHN5c3RlbS4gKi8KLXN0cnVjdCBzZW0gewotCWludAlzZW12YWw7CQkvKiBjdXJyZW50IHZhbHVlICovCi0JaW50CXNlbXBpZDsJCS8qIHBpZCBvZiBsYXN0IG9wZXJhdGlvbiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2VtX3BlbmRpbmc7IC8qIHBlbmRpbmcgc2luZ2xlLXNvcCBvcGVyYXRpb25zICovCi19OwotCiAvKiBPbmUgc2VtX2FycmF5IGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIHNldCBvZiBzZW1hcGhvcmVzIGluIHRoZSBzeXN0ZW0uICovCiBzdHJ1Y3Qgc2VtX2FycmF5IHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybQlfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wCkBAIC0xMDMsNTEgKzk2LDIxIEBACiAJaW50CQkJY29tcGxleF9jb3VudDsJLyogcGVuZGluZyBjb21wbGV4IG9wZXJhdGlvbnMgKi8KIH07CiAKLS8qIE9uZSBxdWV1ZSBmb3IgZWFjaCBzbGVlcGluZyBwcm9jZXNzIGluIHRoZSBzeXN0ZW0uICovCi1zdHJ1Y3Qgc2VtX3F1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNpbXBsZV9saXN0OyAvKiBxdWV1ZSBvZiBwZW5kaW5nIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CSAvKiBxdWV1ZSBvZiBwZW5kaW5nIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnNsZWVwZXI7IC8qIHRoaXMgcHJvY2VzcyAqLwotCXN0cnVjdCBzZW1fdW5kbwkJKnVuZG87CSAvKiB1bmRvIHN0cnVjdHVyZSAqLwotCWludCAgICAJCQlwaWQ7CSAvKiBwcm9jZXNzIGlkIG9mIHJlcXVlc3RpbmcgcHJvY2VzcyAqLwotCWludCAgICAJCQlzdGF0dXM7CSAvKiBjb21wbGV0aW9uIHN0YXR1cyBvZiBvcGVyYXRpb24gKi8KLQlzdHJ1Y3Qgc2VtYnVmCQkqc29wczsJIC8qIGFycmF5IG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLwotCWludAkJCW5zb3BzOwkgLyogbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KLQlpbnQJCQlhbHRlcjsgICAvKiBkb2VzIHRoZSBvcGVyYXRpb24gYWx0ZXIgdGhlIGFycmF5PyAqLwotfTsKLQotLyogRWFjaCB0YXNrIGhhcyBhIGxpc3Qgb2YgdW5kbyByZXF1ZXN0cy4gVGhleSBhcmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseQotICogd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4KLSAqLwotc3RydWN0IHNlbV91bmRvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfcHJvYzsJLyogcGVyLXByb2Nlc3MgbGlzdDogYWxsIHVuZG9zIGZyb20gb25lIHByb2Nlc3MuICovCi0JCQkJCQkvKiByY3UgcHJvdGVjdGVkICovCi0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7CQkvKiByY3Ugc3RydWN0IGZvciBzZW1fdW5kbygpICovCi0Jc3RydWN0IHNlbV91bmRvX2xpc3QJKnVscDsJCS8qIHNlbV91bmRvX2xpc3QgZm9yIHRoZSBwcm9jZXNzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0X2lkOwkvKiBwZXIgc2VtYXBob3JlIGFycmF5IGxpc3Q6IGFsbCB1bmRvcyBmb3Igb25lIGFycmF5ICovCi0JaW50CQkJc2VtaWQ7CQkvKiBzZW1hcGhvcmUgc2V0IGlkZW50aWZpZXIgKi8KLQlzaG9ydCAqCQkJc2VtYWRqOwkJLyogYXJyYXkgb2YgYWRqdXN0bWVudHMsIG9uZSBwZXIgc2VtYXBob3JlICovCi19OwotCi0vKiBzZW1fdW5kb19saXN0IGNvbnRyb2xzIHNoYXJlZCBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2Ygc2VtX3VuZG8gc3RydWN0dXJlcwotICogdGhhdCBtYXkgYmUgc2hhcmVkIGFtb25nIGFsbCBhIENMT05FX1NZU1ZTRU0gdGFzayBncm91cC4KLSAqLyAKLXN0cnVjdCBzZW1fdW5kb19saXN0IHsKLQlhdG9taWNfdAkJcmVmY250OwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0X3Byb2M7Ci19OworI2lmZGVmIENPTkZJR19TWVNWSVBDCiAKIHN0cnVjdCBzeXN2X3NlbSB7CiAJc3RydWN0IHNlbV91bmRvX2xpc3QgKnVuZG9fbGlzdDsKIH07CiAKLSNpZmRlZiBDT05GSUdfU1lTVklQQwotCiBleHRlcm4gaW50IGNvcHlfc2VtdW5kbyh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiBleHRlcm4gdm9pZCBleGl0X3NlbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKICNlbHNlCisKK3N0cnVjdCBzeXN2X3NlbSB7CisJLyogZW1wdHkgKi8KK307CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvcHlfc2VtdW5kbyh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaAppbmRleCBiZTcyMGNkLi4wYjY5YTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oCkBAIC04NCw4ICs4NCw3IEBACiBpbnQgc2VxX3B1dHMoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICpzKTsKIGludCBzZXFfd3JpdGUoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOwogCi1pbnQgc2VxX3ByaW50ZihzdHJ1Y3Qgc2VxX2ZpbGUgKiwgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLDIsMykpKTsKK19fcHJpbnRmKDIsIDMpIGludCBzZXFfcHJpbnRmKHN0cnVjdCBzZXFfZmlsZSAqLCBjb25zdCBjaGFyICosIC4uLik7CiAKIGludCBzZXFfcGF0aChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHBhdGggKiwgY2hhciAqKTsKIGludCBzZXFfZGVudHJ5KHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IDhiZmZlOWEuLjM2OTI3M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC02Nyw2ICs2Nyw3IEBACiAJU0NJeF9JUkRBX1JFR1RZUEUsCiAJU0NJeF9TQ0lGQV9SRUdUWVBFLAogCVNDSXhfU0NJRkJfUkVHVFlQRSwKKwlTQ0l4X1NIMl9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiAJU0NJeF9TSDNfU0NJRl9SRUdUWVBFLAogCVNDSXhfU0g0X1NDSUZfUkVHVFlQRSwKIAlTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLApAQCAtMTMxLDggKzEzMiw2IEBACiAKIAlzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMJKm9wczsKIAotCXN0cnVjdCBkZXZpY2UJKmRtYV9kZXY7Ci0KIAl1bnNpZ25lZCBpbnQJZG1hX3NsYXZlX3R4OwogCXVuc2lnbmVkIGludAlkbWFfc2xhdmVfcng7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IGUyNmY0NzguLmNhODI4NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTc5LDE5ICs3OSwyMSBAQAogaXJxcmV0dXJuX3Qgc2VyaW9faW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIAogdm9pZCBfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotc3RhdGljIGlubGluZSB2b2lkIHNlcmlvX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbykKLXsKLQlfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8sIFRISVNfTU9EVUxFKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICovCisjZGVmaW5lIHNlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8pIFwKKwlfX3NlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8sIFRISVNfTU9EVUxFKQogCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogCi1pbnQgX19zZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpOwotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KK2ludCBfX211c3RfY2hlY2sgX19zZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2LAorCQkJCXN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSk7CisKKy8qIHVzZSBhIGRlZmluZSB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRSAmIGZyaWVuZHMgKi8KKyNkZWZpbmUgc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydikgXAorCV9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQorCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlcmlvX3dyaXRlKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSkKQEAgLTE5OSw1ICsyMDEsNiBAQAogI2RlZmluZSBTRVJJT19EWU5BUFJPCTB4M2EKICNkZWZpbmUgU0VSSU9fSEFNUFNISVJFCTB4M2IKICNkZWZpbmUgU0VSSU9fUFMyTVVMVAkweDNjCisjZGVmaW5lIFNFUklPX1RTQzQwCTB4M2QKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oIGIvaW5jbHVkZS9saW51eC9zaF9jbGsuaAppbmRleCAzY2NmMTg2Li5hMjA4MzFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oCisrKyBiL2luY2x1ZGUvbGludXgvc2hfY2xrLmgKQEAgLTUyLDcgKzUyLDYgQEAKIAogCXVuc2lnbmVkIGxvbmcJCWFyY2hfZmxhZ3M7CiAJdm9pZAkJCSpwcml2OwotCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGNsa19tYXBwaW5nCSptYXBwaW5nOwogCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZTsKIAl1bnNpZ25lZCBpbnQJCW5yX2ZyZXFzOwpAQCAtOTQsNiArOTMsOSBAQAogbG9uZyBjbGtfcmF0ZV9kaXZfcmFuZ2Vfcm91bmQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBpbnQgZGl2X21pbiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBkaXZfbWF4LCB1bnNpZ25lZCBsb25nIHJhdGUpOwogCitsb25nIGNsa19yYXRlX211bHRfcmFuZ2Vfcm91bmQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBpbnQgbXVsdF9taW4sCisJCQkgICAgICAgdW5zaWduZWQgaW50IG11bHRfbWF4LCB1bnNpZ25lZCBsb25nIHJhdGUpOworCiBsb25nIGNsa19yb3VuZF9wYXJlbnQoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHRhcmdldCwKIAkJICAgICAgdW5zaWduZWQgbG9uZyAqYmVzdF9mcmVxLCB1bnNpZ25lZCBsb25nICpwYXJlbnRfZnJlcSwKIAkJICAgICAgdW5zaWduZWQgaW50IGRpdl9taW4sIHVuc2lnbmVkIGludCBkaXZfbWF4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hfcGZjLmggYi9pbmNsdWRlL2xpbnV4L3NoX3BmYy5oCmluZGV4IDMwY2FlNzAuLjg0NDY3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2hfcGZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaF9wZmMuaApAQCAtNjEsNiArNjEsMTQgQEAKIAkucmVnID0gciwgLnJlZ193aWR0aCA9IHJfd2lkdGgsCVwKIAkuZW51bV9pZHMgPSAocGlubXV4X2VudW1fdCBbcl93aWR0aF0pIFwKIAorc3RydWN0IHBpbm11eF9pcnEgeworCWludCBpcnE7CisJcGlubXV4X2VudW1fdCAqZW51bV9pZHM7Cit9OworCisjZGVmaW5lIFBJTk1VWF9JUlEoaXJxX25yLCBpZHMuLi4pCQkJICAgXAorCXsgLmlycSA9IGlycV9uciwgLmVudW1faWRzID0gKHBpbm11eF9lbnVtX3QgW10pIHsgaWRzLCAwIH0gfQlcCisKIHN0cnVjdCBwaW5tdXhfcmFuZ2UgewogCXBpbm11eF9lbnVtX3QgYmVnaW47CiAJcGlubXV4X2VudW1fdCBlbmQ7CkBAIC04NywxMSArOTUsODkgQEAKIAlwaW5tdXhfZW51bV90ICpncGlvX2RhdGE7CiAJdW5zaWduZWQgaW50IGdwaW9fZGF0YV9zaXplOwogCi0JdW5zaWduZWQgbG9uZyAqZ3Bpb19pbl91c2U7CisJc3RydWN0IHBpbm11eF9pcnEgKmdwaW9faXJxOworCXVuc2lnbmVkIGludCBncGlvX2lycV9zaXplOworCiAJc3RydWN0IGdwaW9fY2hpcCBjaGlwOwogfTsKIAogaW50IHJlZ2lzdGVyX3Bpbm11eChzdHJ1Y3QgcGlubXV4X2luZm8gKnBpcCk7CiBpbnQgdW5yZWdpc3Rlcl9waW5tdXgoc3RydWN0IHBpbm11eF9pbmZvICpwaXApOwogCisvKiBoZWxwZXIgbWFjcm8gZm9yIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF8xKGZuLCBwZngsIHNmeCkgZm4ocGZ4LCBzZngpCisKKyNkZWZpbmUgUE9SVF8xMChmbiwgcGZ4LCBzZngpIFwKKwlQT1JUXzEoZm4sIHBmeCMjMCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzEsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjMiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzMsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjNCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzUsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjNiwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzcsIHNmeCksCVwKKwlQT1JUXzEoZm4sIHBmeCMjOCwgc2Z4KSwgUE9SVF8xKGZuLCBwZngjIzksIHNmeCkKKworI2RlZmluZSBQT1JUXzkwKGZuLCBwZngsIHNmeCkgXAorCVBPUlRfMTAoZm4sIHBmeCMjMSwgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyMyLCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyMzLCBzZngpLCBQT1JUXzEwKGZuLCBwZngjIzQsIHNmeCksCVwKKwlQT1JUXzEwKGZuLCBwZngjIzUsIHNmeCksIFBPUlRfMTAoZm4sIHBmeCMjNiwgc2Z4KSwJXAorCVBPUlRfMTAoZm4sIHBmeCMjNywgc2Z4KSwgUE9SVF8xMChmbiwgcGZ4IyM4LCBzZngpLAlcCisJUE9SVF8xMChmbiwgcGZ4IyM5LCBzZngpCisKKyNkZWZpbmUgX1BPUlRfQUxMKHBmeCwgc2Z4KSBwZngjI18jI3NmeAorI2RlZmluZSBfR1BJT19QT1JUKHBmeCwgc2Z4KSBQSU5NVVhfR1BJTyhHUElPX1BPUlQjI3BmeCwgUE9SVCMjcGZ4IyNfREFUQSkKKyNkZWZpbmUgUE9SVF9BTEwoc3RyKQlDUFVfQUxMX1BPUlQoX1BPUlRfQUxMLCBQT1JULCBzdHIpCisjZGVmaW5lIEdQSU9fUE9SVF9BTEwoKQlDUFVfQUxMX1BPUlQoX0dQSU9fUE9SVCwgLCB1bnVzZWQpCisjZGVmaW5lIEdQSU9fRk4oc3RyKSBQSU5NVVhfR1BJTyhHUElPX0ZOXyMjc3RyLCBzdHIjI19NQVJLKQorCisvKiBoZWxwZXIgbWFjcm8gZm9yIHBpbm11eF9lbnVtX3QgKi8KKyNkZWZpbmUgUE9SVF9EQVRBX0kobnIpCVwKKwlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLCBQT1JUIyNuciMjX0lOKQorCisjZGVmaW5lIFBPUlRfREFUQV9JX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwJXAorCQkgICAgUE9SVCMjbnIjI19JTiwgUE9SVCMjbnIjI19JTl9QRCkKKworI2RlZmluZSBQT1JUX0RBVEFfSV9QVShucikJXAorCVBJTk1VWF9EQVRBKFBPUlQjI25yIyNfREFUQSwgUE9SVCMjbnIjI19GTjAsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lfUFVfUEQobnIpCVwKKwlQSU5NVVhfREFUQShQT1JUIyNuciMjX0RBVEEsIFBPUlQjI25yIyNfRk4wLAkJCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX08obnIpCQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4pCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUFUpCisKKyNkZWZpbmUgUE9SVF9EQVRBX0lPX1BVX1BEKG5yKQlcCisJUElOTVVYX0RBVEEoUE9SVCMjbnIjI19EQVRBLCBQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19PVVQsCVwKKwkJICAgIFBPUlQjI25yIyNfSU4sIFBPUlQjI25yIyNfSU5fUEQsIFBPUlQjI25yIyNfSU5fUFUpCisKKy8qIGhlbHBlciBtYWNybyBmb3IgdG9wIDQgYml0cyBpbiBQT1JUbkNSICovCisjZGVmaW5lIF9QQ1JIKGluLCBpbl9wZCwgaW5fcHUsIG91dCkJXAorCTAsIChvdXQpLCAoaW4pLCAwLAkJXAorCTAsIDAsIDAsIDAsCQkJXAorCTAsIDAsIChpbl9wZCksIDAsCQlcCisJMCwgMCwgKGluX3B1KSwgMAorCisjZGVmaW5lIFBPUlRDUihuciwgcmVnKQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQlQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CQlcCisJCQlfUENSSChQT1JUIyNuciMjX0lOLCBQT1JUIyNuciMjX0lOX1BELAkJXAorCQkJICAgICAgUE9SVCMjbnIjI19JTl9QVSwgUE9SVCMjbnIjI19PVVQpLAlcCisJCQkJUE9SVCMjbnIjI19GTjAsIFBPUlQjI25yIyNfRk4xLAkJXAorCQkJCVBPUlQjI25yIyNfRk4yLCBQT1JUIyNuciMjX0ZOMywJCVwKKwkJCQlQT1JUIyNuciMjX0ZONCwgUE9SVCMjbnIjI19GTjUsCQlcCisJCQkJUE9SVCMjbnIjI19GTjYsIFBPUlQjI25yIyNfRk43IH0JXAorCX0KKwogI2VuZGlmIC8qIF9fU0hfUEZDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaCBiL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaAppbmRleCA3OTA2NTFiLi5hODM4MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Nocmlua2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaHJpbmtlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAgKiAnbnJfdG9fc2NhbicgZW50cmllcyBhbmQgYXR0ZW1wdCB0byBmcmVlIHRoZW0gdXAuICBJdCBzaG91bGQgcmV0dXJuCiAgKiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd2hpY2ggcmVtYWluIGluIHRoZSBjYWNoZS4gIElmIGl0IHJldHVybnMgLTEsIGl0IG1lYW5zCiAgKiBpdCBjYW5ub3QgZG8gYW55IHNjYW5uaW5nIGF0IHRoaXMgdGltZSAoZWcuIHRoZXJlIGlzIGEgcmlzayBvZiBkZWFkbG9jaykuCisgKiBUaGUgY2FsbGJhY2sgbXVzdCBub3QgcmV0dXJuIC0xIGlmIG5yX3RvX3NjYW4gaXMgemVyby4KICAqCiAgKiBUaGUgJ2dmcG1hc2snIHJlZmVycyB0byB0aGUgYWxsb2NhdGlvbiB3ZSBhcmUgY3VycmVudGx5IHRyeWluZyB0bwogICogZnVsZmlsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggZmY3ZTEzMC4uZjQ0NDI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0xODEyLDEyICsxODEyLDEyIEBACiAKIC8qKgogICogc2tiX2ZyYWdfZG1hX21hcCAtIG1hcHMgYSBwYWdlZCBmcmFnbWVudCB2aWEgdGhlIERNQSBBUEkKLSAqIEBkZXZpY2U6IHRoZSBkZXZpY2UgdG8gbWFwIHRoZSBmcmFnbWVudCB0bworICogQGRldjogdGhlIGRldmljZSB0byBtYXAgdGhlIGZyYWdtZW50IHRvCiAgKiBAZnJhZzogdGhlIHBhZ2VkIGZyYWdtZW50IHRvIG1hcAogICogQG9mZnNldDogdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZyYWdtZW50IChzdGFydGluZyBhdCB0aGUKICAqICAgICAgICAgIGZyYWdtZW50J3Mgb3duIG9mZnNldCkKICAqIEBzaXplOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hcAotICogQGRpcmVjdGlvbjogdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWFwcGluZyAoJVBDSV9ETUFfKikKKyAqIEBkaXI6IHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1hcHBpbmcgKCVQQ0lfRE1BXyopCiAgKgogICogTWFwcyB0aGUgcGFnZSBhc3NvY2lhdGVkIHdpdGggQGZyYWcgdG8gQGRldmljZS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvbDRmMDAyNDJ0MDMuaCBiL2luY2x1ZGUvbGludXgvc3BpL2w0ZjAwMjQydDAzLmgKaW5kZXggYWVlMWRiZC4uYmM4Njc3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvbDRmMDAyNDJ0MDMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9sNGYwMDI0MnQwMy5oCkBAIC0yNCw4ICsyNCw2IEBACiBzdHJ1Y3QgbDRmMDAyNDJ0MDNfcGRhdGEgewogCXVuc2lnbmVkIGludAlyZXNldF9ncGlvOwogCXVuc2lnbmVkIGludAlkYXRhX2VuYWJsZV9ncGlvOwotCWNvbnN0IGNoYXIgCSppb19zdXBwbHk7CS8qIHdpbGwgYmUgc2V0IHRvIDEuOCBWICovCi0JY29uc3QgY2hhciAJKmNvcmVfc3VwcGx5OwkvKiB3aWxsIGJlIHNldCB0byAyLjggViAqLwogfTsKIAogI2VuZGlmIC8qIF9JTkNMVURFX0xJTlVYX1NQSV9MNEYwMDI0MlQwM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmggYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAppbmRleCBmMTBlZDdiLi5kY2YzNWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaApAQCAtOTQsNiArOTQsMTUgQEAKIAkJfSBnaHo1OwkJLyogNUdIeiBiYW5kICovCiAJfSBhbnRlbm5hX2dhaW47CiAKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdTggdHNzaXBvcywgZXh0cGFfZ2FpbiwgcGRldF9yYW5nZSwgdHJfaXNvLCBhbnRzd2x1dDsKKwkJfSBnaHoyOworCQlzdHJ1Y3QgeworCQkJdTggdHNzaXBvcywgZXh0cGFfZ2FpbiwgcGRldF9yYW5nZSwgdHJfaXNvLCBhbnRzd2x1dDsKKwkJfSBnaHo1OworCX0gZmVtOworCiAJLyogVE9ETyAtIGFkZCBhbnkgcGFyYW1ldGVycyBuZWVkZWQgZnJvbSByZXYgMiwgMywgNCwgNSBvciA4IFNQUk9NcyAqLwogfTsKIApAQCAtMjMxLDEwICsyNDAsOSBAQAogI2RlZmluZSBkcnZfdG9fc3NiX2RydihfZHJ2KSBjb250YWluZXJfb2YoX2Rydiwgc3RydWN0IHNzYl9kcml2ZXIsIGRydikKIAogZXh0ZXJuIGludCBfX3NzYl9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHNzYl9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotc3RhdGljIGlubGluZSBpbnQgc3NiX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc3NiX2RyaXZlciAqZHJ2KQotewotCXJldHVybiBfX3NzYl9kcml2ZXJfcmVnaXN0ZXIoZHJ2LCBUSElTX01PRFVMRSk7Ci19CisjZGVmaW5lIHNzYl9kcml2ZXJfcmVnaXN0ZXIoZHJ2KSBcCisJX19zc2JfZHJpdmVyX3JlZ2lzdGVyKGRydiwgVEhJU19NT0RVTEUpCisKIGV4dGVybiB2b2lkIHNzYl9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc3NiX2RyaXZlciAqZHJ2KTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2JfcmVncy5oIGIvaW5jbHVkZS9saW51eC9zc2Ivc3NiX3JlZ3MuaAppbmRleCA5ODk0MTIwLi5jODE0YWU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2JfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3NiL3NzYl9yZWdzLmgKQEAgLTQzMiw2ICs0MzIsMjMgQEAKICNkZWZpbmUgIFNTQl9TUFJPTThfUlhQTzJHCQkweDAwRkYJLyogMkdIeiBSWCBwb3dlciBvZmZzZXQgKi8KICNkZWZpbmUgIFNTQl9TUFJPTThfUlhQTzVHCQkweEZGMDAJLyogNUdIeiBSWCBwb3dlciBvZmZzZXQgKi8KICNkZWZpbmUgIFNTQl9TUFJPTThfUlhQTzVHX1NISUZUCTgKKyNkZWZpbmUgU1NCX1NQUk9NOF9GRU0yRwkJMHgwMEFFCisjZGVmaW5lIFNTQl9TUFJPTThfRkVNNUcJCTB4MDBCMAorI2RlZmluZSAgU1NCX1NST004X0ZFTV9UU1NJUE9TCQkweDAwMDEKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fVFNTSVBPU19TSElGVAkwCisjZGVmaW5lICBTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU4JMHgwMDA2CisjZGVmaW5lICBTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU5fU0hJRlQJMQorI2RlZmluZSAgU1NCX1NST004X0ZFTV9QREVUX1JBTkdFCTB4MDBGOAorI2RlZmluZSAgU1NCX1NST004X0ZFTV9QREVUX1JBTkdFX1NISUZUCTMKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fVFJfSVNPCQkweDA3MDAKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fVFJfSVNPX1NISUZUCTgKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fQU5UU1dMVVQJCTB4RjgwMAorI2RlZmluZSAgU1NCX1NST004X0ZFTV9BTlRTV0xVVF9TSElGVAkxMQorI2RlZmluZSBTU0JfU1BST004X1RIRVJNQUwJCTB4MDBCMgorI2RlZmluZSBTU0JfU1BST004X01QV1JfUkFXVFMJCTB4MDBCNAorI2RlZmluZSBTU0JfU1BST004X1RTX1NMUF9PUFRfQ09SUlgJMHgwMEI2CisjZGVmaW5lIFNTQl9TUFJPTThfRk9DX0hXSVFfSVFTV1AJMHgwMEI4CisjZGVmaW5lIFNTQl9TUFJPTThfUEhZQ0FMX1RFTVBERUxUQQkweDAwQkEKICNkZWZpbmUgU1NCX1NQUk9NOF9NQVhQX0JHCQkweDAwQzAgIC8qIE1heCBQb3dlciAyR0h6IGluIHBhdGggMSAqLwogI2RlZmluZSAgU1NCX1NQUk9NOF9NQVhQX0JHX01BU0sJMHgwMEZGICAvKiBNYXNrIGZvciBNYXggUG93ZXIgMkdIeiAqLwogI2RlZmluZSAgU1NCX1NQUk9NOF9JVFNTSV9CRwkJMHhGRjAwCS8qIE1hc2sgZm9yIHBhdGggMSBpdHNzaV9iZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaCBiL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmgKaW5kZXggMmQwNGVhOS4uYzE3MGVkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0b3BfbWFjaGluZS5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IGExNzZkYjIuLmUwMzM1NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtMTE0LDYgKzExNCw3IEBACiAjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNIUgogZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOwogI2VuZGlmCit2b2lkICptZW1jaHJfaW52KGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CiAKIGV4dGVybiBjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGdmcF90IGdmcCk7CiBleHRlcm4gY2hhciAqa3N0cm5kdXAoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgZ2ZwX3QgZ2ZwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaAppbmRleCA0OTI0ODZhLi4zZDhmOWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCkBAIC0xMzYsNiArMTM2LDggQEAKIHZvaWQJCXJwY19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgcnBjX2NsbnQgKik7CiB2b2lkCQlycGNfdGFza19yZWxlYXNlX2NsaWVudChzdHJ1Y3QgcnBjX3Rhc2sgKik7CiAKK2ludAkJcnBjYl9jcmVhdGVfbG9jYWwodm9pZCk7Cit2b2lkCQlycGNiX3B1dF9sb2NhbCh2b2lkKTsKIGludAkJcnBjYl9yZWdpc3Rlcih1MzIsIHUzMiwgaW50LCB1bnNpZ25lZCBzaG9ydCk7CiBpbnQJCXJwY2JfdjRfcmVnaXN0ZXIoY29uc3QgdTMyIHByb2dyYW0sIGNvbnN0IHUzMiB2ZXJzaW9uLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJlc3MsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IGQ4ZDVkOTMuLjM1YjM3YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC00MTMsNiArNDEzLDcgQEAKIC8qCiAgKiBGdW5jdGlvbiBwcm90b3R5cGVzLgogICovCit2b2lkIHN2Y19ycGNiX2NsZWFudXAoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KTsKIHN0cnVjdCBzdmNfc2VydiAqc3ZjX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKiwgdW5zaWduZWQgaW50LAogCQkJICAgIHZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHN2Y19zZXJ2ICopKTsKIHN0cnVjdCBzdmNfcnFzdCAqc3ZjX3ByZXBhcmVfdGhyZWFkKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oCmluZGV4IDdhZDk3NTEuLjg2MjBmNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3hwcnQuaApAQCAtOCw3ICs4LDggQEAKICNkZWZpbmUgU1VOUlBDX1NWQ19YUFJUX0gKIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RydWN0IG1vZHVsZTsKIAogc3RydWN0IHN2Y194cHJ0X29wcyB7CiAJc3RydWN0IHN2Y194cHJ0CSooKnhwb19jcmVhdGUpKHN0cnVjdCBzdmNfc2VydiAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBjNzFmODRiLi4xZTIyZTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjQzLDE1ICsyNDMsMTAgQEAKIAlfX2xydV9jYWNoZV9hZGQocGFnZSwgTFJVX0lOQUNUSVZFX0ZJTEUpOwogfQogCi0vKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLwotI2RlZmluZSBJU09MQVRFX0lOQUNUSVZFIDAJLyogSXNvbGF0ZSBpbmFjdGl2ZSBwYWdlcy4gKi8KLSNkZWZpbmUgSVNPTEFURV9BQ1RJVkUgMQkvKiBJc29sYXRlIGFjdGl2ZSBwYWdlcy4gKi8KLSNkZWZpbmUgSVNPTEFURV9CT1RIIDIJCS8qIElzb2xhdGUgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIHBhZ2VzLiAqLwotCiAvKiBsaW51eC9tbS92bXNjYW4uYyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IG9yZGVyLAogCQkJCQlnZnBfdCBnZnBfbWFzaywgbm9kZW1hc2tfdCAqbWFzayk7Ci1leHRlcm4gaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKTsKK2V4dGVybiBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpc29sYXRlX21vZGVfdCBtb2RlLCBpbnQgZmlsZSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCQkgIGdmcF90IGdmcF9tYXNrLCBib29sIG5vc3dhcCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlX3pvbmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAxZmYwZWMyLi44NmEyNGIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtODQ0LDQgKzg0NCwxNyBAQAogCQkJCSAgICAgIHN0cnVjdCBmaWxlX2hhbmRsZSBfX3VzZXIgKmhhbmRsZSwKIAkJCQkgICAgICBpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19zZXRucyhpbnQgZmQsIGludCBuc3R5cGUpOworYXNtbGlua2FnZSBsb25nIHN5c19wcm9jZXNzX3ZtX3JlYWR2KHBpZF90IHBpZCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGxpb3ZjbnQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpydmVjLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cithc21saW5rYWdlIGxvbmcgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KHBpZF90IHBpZCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpsdmVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICpydmVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmlvdmNudCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA5YTFlYzEwLi43MDNjZmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTkzMSw2ICs5MzEsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKIC8qIEZvciB0aGUgL3Byb2Mvc3lzIHN1cHBvcnQgKi8KIHN0cnVjdCBjdGxfdGFibGU7CkBAIC0xMDExLDYgKzEwMTIsMjYgQEAKICAqIGNvdmVyIGNvbW1vbiBjYXNlcy4KICAqLwogCisvKiBTdXBwb3J0IGZvciB1c2Vyc3BhY2UgcG9sbCgpIHRvIHdhdGNoIGZvciBjaGFuZ2VzICovCitzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgeworCWF0b21pY190IGV2ZW50OworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgKnByb2Nfc3lzX3BvbGxfZXZlbnQoc3RydWN0IGN0bF90YWJsZV9wb2xsICpwb2xsKQoreworCXJldHVybiAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWF0b21pY19yZWFkKCZwb2xsLT5ldmVudCk7Cit9CisKK3ZvaWQgcHJvY19zeXNfcG9sbF9ub3RpZnkoc3RydWN0IGN0bF90YWJsZV9wb2xsICpwb2xsKTsKKworI2RlZmluZSBfX0NUTF9UQUJMRV9QT0xMX0lOSVRJQUxJWkVSKG5hbWUpIHsJCQkJXAorCS5ldmVudCA9IEFUT01JQ19JTklUKDApLAkJCQkJXAorCS53YWl0ID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIobmFtZS53YWl0KSB9CisKKyNkZWZpbmUgREVGSU5FX0NUTF9UQUJMRV9QT0xMKG5hbWUpCQkJCQlcCisJc3RydWN0IGN0bF90YWJsZV9wb2xsIG5hbWUgPSBfX0NUTF9UQUJMRV9QT0xMX0lOSVRJQUxJWkVSKG5hbWUpCisKIC8qIEEgc3lzY3RsIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBjdGxfdGFibGU6ICovCiBzdHJ1Y3QgY3RsX3RhYmxlIAogewpAQCAtMTAyMSw2ICsxMDQyLDcgQEAKIAlzdHJ1Y3QgY3RsX3RhYmxlICpjaGlsZDsKIAlzdHJ1Y3QgY3RsX3RhYmxlICpwYXJlbnQ7CS8qIEF1dG9tYXRpY2FsbHkgc2V0ICovCiAJcHJvY19oYW5kbGVyICpwcm9jX2hhbmRsZXI7CS8qIENhbGxiYWNrIGZvciB0ZXh0IGZvcm1hdHRpbmcgKi8KKwlzdHJ1Y3QgY3RsX3RhYmxlX3BvbGwgKnBvbGw7CiAJdm9pZCAqZXh0cmExOwogCXZvaWQgKmV4dHJhMjsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2Rldi5oIGIvaW5jbHVkZS9saW51eC9zeXNkZXYuaAppbmRleCBkMzVlNzgzLi4yMGY2M2QzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZGV2LmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX1NZU0RFVl9IXwogCiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmggYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaAppbmRleCBkOWE4NWQ2Li5jZmFlZTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaAorKysgYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaApAQCAtNCwxMCArNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IHRzX2NvbmZpZzsKIAogI2RlZmluZSBUU19BVVRPTE9BRAkxIC8qIEF1dG9tYXRpY2FsbHkgbG9hZCB0ZXh0c2VhcmNoIG1vZHVsZXMgd2hlbiBuZWVkZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAppbmRleCBmYzgzOWJmLi5lMjZkYjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCkBAIC0yMDEsNiArMjAxLDEwIEBACiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSA2NCwJCQkJCVwKIH0KIAorI2lmbmRlZiBTRF9OT0RFU19QRVJfRE9NQUlOCisjZGVmaW5lIFNEX05PREVTX1BFUl9ET01BSU4gMTYKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1NDSEVEX0JPT0sKICNpZm5kZWYgU0RfQk9PS19JTklUCiAjZXJyb3IgUGxlYXNlIGRlZmluZSBhbiBhcHByb3ByaWF0ZSBTRF9CT09LX0lOSVQgaW4gaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCEhIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vfc2VxLmgKaW5kZXggNWNmMzk3Yy4uN2RhZGMzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oCkBAIC0yOSwxMCArMjksMTAgQEAKICAqIEN1cnJlbnRseSBvbmx5IGRlZmluZWQgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuCiAgKi8KICNpZmRlZiBDT05GSUdfVFJBQ0lORwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHJpbnRmKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3ZwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIF9fcHJpbnRmKDIsIDMpCitpbnQgdHJhY2Vfc2VxX3ByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gX19wcmludGYoMiwgMCkKK2ludCB0cmFjZV9zZXFfdnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7CiBleHRlcm4gaW50CiB0cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KTsKIGV4dGVybiBpbnQgdHJhY2VfcHJpbnRfc2VxKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRyYWNlX3NlcSAqcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oIGIvaW5jbHVkZS9saW51eC91aW5wdXQuaAppbmRleCBkMjhjNzI2Li4yYWEyODgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlucHV0LmgKQEAgLTY4LDcgKzY4LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQloZWFkOwogCXVuc2lnbmVkIGNoYXIJCXRhaWw7CiAJc3RydWN0IGlucHV0X2V2ZW50CWJ1ZmZbVUlOUFVUX0JVRkZFUl9TSVpFXTsKLQlpbnQJCQlmZl9lZmZlY3RzX21heDsKKwl1bnNpZ25lZCBpbnQJCWZmX2VmZmVjdHNfbWF4OwogCiAJc3RydWN0IHVpbnB1dF9yZXF1ZXN0CSpyZXF1ZXN0c1tVSU5QVVRfTlVNX1JFUVVFU1RTXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZXF1ZXN0c193YWl0cTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKaW5kZXggZmQ5OWZmOS4uMWFkNDcyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKQEAgLTE0LDEwICsxNCwxMCBAQAogI2lmbmRlZiBfVUlPX0RSSVZFUl9IXwogI2RlZmluZSBfVUlPX0RSSVZFUl9IXwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorc3RydWN0IG1vZHVsZTsKIHN0cnVjdCB1aW9fbWFwOwogCiAvKioKQEAgLTEwMSwxMSArMTAxLDExIEBACiAJX191aW9fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtb2R1bGUgKm93bmVyLAogCQkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJICAgICAgc3RydWN0IHVpb19pbmZvICppbmZvKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjawotCXVpb19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgdWlvX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIF9fdWlvX3JlZ2lzdGVyX2RldmljZShUSElTX01PRFVMRSwgcGFyZW50LCBpbmZvKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICovCisjZGVmaW5lIHVpb19yZWdpc3Rlcl9kZXZpY2UocGFyZW50LCBpbmZvKSBcCisJX191aW9fcmVnaXN0ZXJfZGV2aWNlKFRISVNfTU9EVUxFLCBwYXJlbnQsIGluZm8pCisKIGV4dGVybiB2b2lkIHVpb191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdWlvX2luZm8gKmluZm8pOwogZXh0ZXJuIHZvaWQgdWlvX2V2ZW50X25vdGlmeShzdHJ1Y3QgdWlvX2luZm8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCA2ZjQ5YTFiLi5kM2QwYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTk0NiwxMCArOTQ2LDExIEBACiAgKi8KIGV4dGVybiBpbnQgdXNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2RyaXZlciAqLCBzdHJ1Y3QgbW9kdWxlICosCiAJCQkgICAgICAgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyKQotewotCXJldHVybiB1c2JfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKworLyogdXNlIGEgZGVmaW5lIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFICYgZnJpZW5kcyAqLworI2RlZmluZSB1c2JfcmVnaXN0ZXIoZHJpdmVyKSBcCisJdXNiX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogZXh0ZXJuIHZvaWQgdXNiX2RlcmVnaXN0ZXIoc3RydWN0IHVzYl9kcml2ZXIgKik7CiAKIGV4dGVybiBpbnQgdXNiX3JlZ2lzdGVyX2RldmljZV9kcml2ZXIoc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L3VzYi9LYnVpbGQKaW5kZXggZWQ5MWZiNi4uYjYwN2YzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL0tidWlsZApAQCAtNywzICs3LDQgQEAKIGhlYWRlci15ICs9IG1pZGkuaAogaGVhZGVyLXkgKz0gZ19wcmludGVyLmgKIGhlYWRlci15ICs9IHRtYy5oCitoZWFkZXIteSArPSB2aWRlby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCmluZGV4IGYzMmE2NGUuLmQ1ZGE2YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC0zODMsMTIgKzM4Myw2IEBACiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSwkweDBmCS8qIGluIGJFbmRwb2ludEFkZHJlc3MgKi8KICNkZWZpbmUgVVNCX0VORFBPSU5UX0RJUl9NQVNLCQkweDgwCiAKLSNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNUWVBFCQkweDBjCi0jZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX05PTkUJCSgwIDw8IDIpCi0jZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX0FTWU5DCQkoMSA8PCAyKQotI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19BREFQVElWRQkoMiA8PCAyKQotI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19TWU5DCQkoMyA8PCAyKQotCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLCTB4MDMJLyogaW4gYm1BdHRyaWJ1dGVzICovCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wJMAogI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DCQkxCkBAIC0zOTYsNiArMzkwLDE3IEBACiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lOVAkJMwogI2RlZmluZSBVU0JfRU5EUE9JTlRfTUFYX0FESlVTVEFCTEUJMHg4MAogCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DVFlQRQkJMHgwYworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19OT05FCQkoMCA8PCAyKQorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1lOQ19BU1lOQwkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfQURBUFRJVkUJKDIgPDwgMikKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNfU1lOQwkJKDMgPDwgMikKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfTUFTSwkJMHgzMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfREFUQQkJMHgwMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfRkVFREJBQ0sJMHgxMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfSU1QTElDSVRfRkIJMHgyMAkvKiBJbXBsaWNpdCBmZWVkYmFjayBEYXRhIGVuZHBvaW50ICovCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCA0ZTViMDIxLi5jNzE0ZWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtMzcsNiArMzcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKK2VudW0gdXRzX3Byb2MgeworCVVUU19QUk9DX09TVFlQRSwKKwlVVFNfUFJPQ19PU1JFTEVBU0UsCisJVVRTX1BST0NfVkVSU0lPTiwKKwlVVFNfUFJPQ19IT1NUTkFNRSwKKwlVVFNfUFJPQ19ET01BSU5OQU1FLAorfTsKKwogc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogZXh0ZXJuIHN0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnM7CiAKQEAgLTgwLDYgKzg4LDE0IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAorZXh0ZXJuIHZvaWQgdXRzX3Byb2Nfbm90aWZ5KGVudW0gdXRzX3Byb2MgcHJvYyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHV0c19wcm9jX25vdGlmeShlbnVtIHV0c19wcm9jIHByb2MpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV3X3V0c25hbWUgKnV0c25hbWUodm9pZCkKIHsKIAlyZXR1cm4gJmN1cnJlbnQtPm5zcHJveHktPnV0c19ucy0+bmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXdiLmggYi9pbmNsdWRlL2xpbnV4L3V3Yi5oCmluZGV4IGIwYzU2NGUuLjdkYmJlZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXdiLmgKKysrIGIvaW5jbHVkZS9saW51eC91d2IuaApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC91d2Ivc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIHN0cnVjdCB1d2JfZGV2Owogc3RydWN0IHV3Yl9iZWNhX2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3V3Yi91bWMuaCBiL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCmluZGV4IDdiNDg0MjAuLjg5MWQxZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oCkBAIC0xMTEsMTAgKzExMSw5IEBACiAgKiB1bWNfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBVTUMgY2FwYWJpbHRpdHkgZHJpdmVyLgogICogQHVtY19kcnY6ICBwb2ludGVyIHRvIHRoZSBkcml2ZXIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayB1bWNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCB1bWNfZHJpdmVyICp1bWNfZHJ2KQotewotCXJldHVybiBfX3VtY19kcml2ZXJfcmVnaXN0ZXIodW1jX2RydiwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKTsKLX0KKyNkZWZpbmUgdW1jX2RyaXZlcl9yZWdpc3Rlcih1bWNfZHJ2KSBcCisJX191bWNfZHJpdmVyX3JlZ2lzdGVyKHVtY19kcnYsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKwogdm9pZCB1bWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHVtY19kcml2ZXIgKnVtY19kcnYpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92ZXJtYWdpYy5oIGIvaW5jbHVkZS9saW51eC92ZXJtYWdpYy5oCmluZGV4IGNmOTdiNWIuLjZmOGZiY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmVybWFnaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Zlcm1hZ2ljLmgKQEAgLTEsNSArMSw0IEBACiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogU2ltcGx5IHNhbml0eSB2ZXJzaW9uIHN0YW1wIGZvciBtb2R1bGVzLiAqLwogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IGZjYTI0Y2MuLjRiNzUyZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtNjUzLDYgKzY1MywxMCBAQAogI2RlZmluZSBWNEwyX0JVRl9GTEFHX0VSUk9SCTB4MDA0MAogI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVDT0RFCTB4MDEwMAkvKiB0aW1lY29kZSBmaWVsZCBpcyB2YWxpZCAqLwogI2RlZmluZSBWNEwyX0JVRl9GTEFHX0lOUFVUICAgICAweDAyMDAgIC8qIGlucHV0IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUFJFUEFSRUQJMHgwNDAwCS8qIEJ1ZmZlciBpcyBwcmVwYXJlZCBmb3IgcXVldWluZyAqLworLyogQ2FjaGUgaGFuZGxpbmcgZmxhZ3MgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19OT19DQUNIRV9JTlZBTElEQVRFCTB4MDgwMAorI2RlZmluZSBWNEwyX0JVRl9GTEFHX05PX0NBQ0hFX0NMRUFOCQkweDEwMDAKIAogLyoKICAqCU8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCkBAIC03NTksMTAgKzc2MywxMCBAQAogI2RlZmluZSBWNEwyX1NURF9QQUxfTmMgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA0MDApCiAjZGVmaW5lIFY0TDJfU1REX1BBTF82MCAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDgwMCkKIAotI2RlZmluZSBWNEwyX1NURF9OVFNDX00gICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDEwMDApCi0jZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQkvKiBCVFNDICovCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkJLyogRUlBLUogKi8KICNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQotI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9LUiAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwODAwMCkJLyogRk0gQTIgKi8KIAogI2RlZmluZSBWNEwyX1NURF9TRUNBTV9CICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMTAwMDApCiAjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0QgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAyMDAwMCkKQEAgLTc4Niw0NyArNzkwLDg2IEBACiAgICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KICAqLwogCi0vKiBzb21lIG1lcmdlZCBzdGFuZGFyZHMgKi8KLSNkZWZpbmUgVjRMMl9TVERfTU4JKFY0TDJfU1REX1BBTF9NfFY0TDJfU1REX1BBTF9OfFY0TDJfU1REX1BBTF9OY3xWNEwyX1NURF9OVFNDKQotI2RlZmluZSBWNEwyX1NURF9CCShWNEwyX1NURF9QQUxfQnxWNEwyX1NURF9QQUxfQjF8VjRMMl9TVERfU0VDQU1fQikKLSNkZWZpbmUgVjRMMl9TVERfR0gJKFY0TDJfU1REX1BBTF9HfFY0TDJfU1REX1BBTF9IfFY0TDJfU1REX1NFQ0FNX0d8VjRMMl9TVERfU0VDQU1fSCkKLSNkZWZpbmUgVjRMMl9TVERfREsJKFY0TDJfU1REX1BBTF9ES3xWNEwyX1NURF9TRUNBTV9ESykKKy8qCisgKiBTb21lIG1hY3JvcyB0byBtZXJnZSB2aWRlbyBzdGFuZGFyZHMgaW4gb3JkZXIgdG8gbWFrZSBsaXZlIGVhc2llciBmb3IgdGhlCisgKiBkcml2ZXJzIGFuZCBWNEwyIGFwcGxpY2F0aW9ucworICovCiAKLS8qIHNvbWUgY29tbW9uIG5lZWRlZCBzdHVmZiAqLwotI2RlZmluZSBWNEwyX1NURF9QQUxfQkcJCShWNEwyX1NURF9QQUxfQgkJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9HKQotI2RlZmluZSBWNEwyX1NURF9QQUxfREsJCShWNEwyX1NURF9QQUxfRAkJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0QxCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9LKQotI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKLQkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCi0JCQkJIFY0TDJfU1REX1BBTF9ICQl8XAotCQkJCSBWNEwyX1NURF9QQUxfSSkKKy8qCisgKiAiQ29tbW9uIiBOVFNDL00gLSBJdCBzaG91bGQgYmUgbm90aWNlZCB0aGF0IFY0TDJfU1REX05UU0NfNDQzIGlzCisgKiBNaXNzaW5nIGhlcmUuCisgKi8KICNkZWZpbmUgVjRMMl9TVERfTlRTQyAgICAgICAgICAgKFY0TDJfU1REX05UU0NfTQl8XAogCQkJCSBWNEwyX1NURF9OVFNDX01fSlAgICAgIHxcCiAJCQkJIFY0TDJfU1REX05UU0NfTV9LUikKKy8qIFNlY2FtIG1hY3JvcyAqLwogI2RlZmluZSBWNEwyX1NURF9TRUNBTV9ESyAgICAgIAkoVjRMMl9TVERfU0VDQU1fRAl8XAogCQkJCSBWNEwyX1NURF9TRUNBTV9LCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0sxKQorLyogQWxsIFNlY2FtIFN0YW5kYXJkcyAqLwogI2RlZmluZSBWNEwyX1NURF9TRUNBTQkJKFY0TDJfU1REX1NFQ0FNX0IJfFwKIAkJCQkgVjRMMl9TVERfU0VDQU1fRwl8XAogCQkJCSBWNEwyX1NURF9TRUNBTV9ICXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0RLCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgfFwKIAkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisvKiBQQUwgbWFjcm9zICovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CRwkJKFY0TDJfU1REX1BBTF9CCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfQjEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0cpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9ESwkJKFY0TDJfU1REX1BBTF9ECQl8XAorCQkJCSBWNEwyX1NURF9QQUxfRDEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0spCisvKgorICogIkNvbW1vbiIgUEFMIC0gVGhpcyBtYWNybyBpcyB0aGVyZSB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG9sZAorICogVjRMMSBjb25jZXB0IG9mICJQQUwiOiAvQkdES0hJLgorICogU2V2ZXJhbCBQQUwgc3RhbmRhcmRzIGFyZSBtaXNpbmcgaGVyZTogL00sIC9OIGFuZCAvTmMKKyAqLworI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCisJCQkJIFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSSkKKy8qIENocm9tYSAiYWdub3N0aWMiIHN0YW5kYXJkcyAqLworI2RlZmluZSBWNEwyX1NURF9CCQkoVjRMMl9TVERfUEFMX0IJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9CMQl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9CKQorI2RlZmluZSBWNEwyX1NURF9HCQkoVjRMMl9TVERfUEFMX0cJCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cpCisjZGVmaW5lIFY0TDJfU1REX0gJCShWNEwyX1NURF9QQUxfSAkJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSCkKKyNkZWZpbmUgVjRMMl9TVERfTAkJKFY0TDJfU1REX1NFQ0FNX0wJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisjZGVmaW5lIFY0TDJfU1REX0dICQkoVjRMMl9TVERfRwkJfFwKKwkJCQkgVjRMMl9TVERfSCkKKyNkZWZpbmUgVjRMMl9TVERfREsJCShWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fREspCisjZGVmaW5lIFY0TDJfU1REX0JHCQkoVjRMMl9TVERfQgkJfFwKKwkJCQkgVjRMMl9TVERfRykKKyNkZWZpbmUgVjRMMl9TVERfTU4JCShWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYwl8XAorCQkJCSBWNEwyX1NURF9OVFNDKQogCisvKiBTdGFuZGFyZHMgd2hlcmUgTVRTL0JUU0Mgc3RlcmVvIGNvdWxkIGJlIGZvdW5kICovCisjZGVmaW5lIFY0TDJfU1REX01UUwkJKFY0TDJfU1REX05UU0NfTQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTQkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYykKKworLyogU3RhbmRhcmRzIGZvciBDb3VudHJpZXMgd2l0aCA2MEh6IExpbmUgZnJlcXVlbmN5ICovCiAjZGVmaW5lIFY0TDJfU1REXzUyNV82MAkJKFY0TDJfU1REX1BBTF9NCQl8XAogCQkJCSBWNEwyX1NURF9QQUxfNjAJfFwKIAkJCQkgVjRMMl9TVERfTlRTQwkJfFwKIAkJCQkgVjRMMl9TVERfTlRTQ180NDMpCisvKiBTdGFuZGFyZHMgZm9yIENvdW50cmllcyB3aXRoIDUwSHogTGluZSBmcmVxdWVuY3kgKi8KICNkZWZpbmUgVjRMMl9TVERfNjI1XzUwCQkoVjRMMl9TVERfUEFMCQl8XAogCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKIAkJCQkgVjRMMl9TVERfUEFMX05jCXxcCiAJCQkJIFY0TDJfU1REX1NFQ0FNKQorCiAjZGVmaW5lIFY0TDJfU1REX0FUU0MgICAgICAgICAgIChWNEwyX1NURF9BVFNDXzhfVlNCICAgIHxcCiAJCQkJIFY0TDJfU1REX0FUU0NfMTZfVlNCKQotCisvKiBNYWNyb3Mgd2l0aCBub25lIGFuZCBhbGwgYW5hbG9nIHN0YW5kYXJkcyAqLwogI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCiAjZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAJfFwKIAkJCQkgVjRMMl9TVERfNjI1XzUwKQpAQCAtMTA4Miw2ICsxMTI1LDcgQEAKICNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKICNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAJMHgwMDQwCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1ZPTEFUSUxFCQkweDAwODAKIAogLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLwogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwJMHg4MDAwMDAwMApAQCAtMTEyNSw2ICsxMTY5LDcgQEAKIAlWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRAk9IDAsCiAJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWgk9IDEsCiAJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWgk9IDIsCisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfQVVUTwk9IDMsCiB9OwogI2RlZmluZSBWNEwyX0NJRF9IVUVfQVVUTwkJCShWNEwyX0NJRF9CQVNFKzI1KQogI2RlZmluZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFCShWNEwyX0NJRF9CQVNFKzI2KQpAQCAtMjAwNiw2ICsyMDUxLDcgQEAKICNkZWZpbmUgVjRMMl9FVkVOVF9WU1lOQwkJCTEKICNkZWZpbmUgVjRMMl9FVkVOVF9FT1MJCQkJMgogI2RlZmluZSBWNEwyX0VWRU5UX0NUUkwJCQkJMworI2RlZmluZSBWNEwyX0VWRU5UX0ZSQU1FX1NZTkMJCQk0CiAjZGVmaW5lIFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVAkJMHgwODAwMDAwMAogCiAvKiBQYXlsb2FkIGZvciBWNEwyX0VWRU5UX1ZTWU5DICovCkBAIC0yMDMyLDEyICsyMDc4LDE3IEBACiAJX19zMzIgZGVmYXVsdF92YWx1ZTsKIH07CiAKK3N0cnVjdCB2NGwyX2V2ZW50X2ZyYW1lX3N5bmMgeworCV9fdTMyIGZyYW1lX3NlcXVlbmNlOworfTsKKwogc3RydWN0IHY0bDJfZXZlbnQgewogCV9fdTMyCQkJCXR5cGU7CiAJdW5pb24gewotCQlzdHJ1Y3QgdjRsMl9ldmVudF92c3luYyB2c3luYzsKLQkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAljdHJsOwotCQlfX3U4CQkJZGF0YVs2NF07CisJCXN0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jCQl2c3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAkJY3RybDsKKwkJc3RydWN0IHY0bDJfZXZlbnRfZnJhbWVfc3luYwlmcmFtZV9zeW5jOworCQlfX3U4CQkJCWRhdGFbNjRdOwogCX0gdTsKIAlfX3UzMgkJCQlwZW5kaW5nOwogCV9fdTMyCQkJCXNlcXVlbmNlOwpAQCAtMjA5Miw2ICsyMTQzLDIzIEBACiAJX191MzIgcmV2aXNpb247ICAgIC8qIGNoaXAgcmV2aXNpb24sIGNoaXAgc3BlY2lmaWMgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKioKKyAqIHN0cnVjdCB2NGwyX2NyZWF0ZV9idWZmZXJzIC0gVklESU9DX0NSRUFURV9CVUZTIGFyZ3VtZW50CisgKiBAaW5kZXg6CW9uIHJldHVybiwgaW5kZXggb2YgdGhlIGZpcnN0IGNyZWF0ZWQgYnVmZmVyCisgKiBAY291bnQ6CWVudHJ5OiBudW1iZXIgb2YgcmVxdWVzdGVkIGJ1ZmZlcnMsCisgKgkJcmV0dXJuOiBudW1iZXIgb2YgY3JlYXRlZCBidWZmZXJzCisgKiBAbWVtb3J5OglidWZmZXIgbWVtb3J5IHR5cGUKKyAqIEBmb3JtYXQ6CWZyYW1lIGZvcm1hdCwgZm9yIHdoaWNoIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZAorICogQHJlc2VydmVkOglmdXR1cmUgZXh0ZW5zaW9ucworICovCitzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycyB7CisJX191MzIJCQlpbmRleDsKKwlfX3UzMgkJCWNvdW50OworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQJZm9ybWF0OworCV9fdTMyCQkJcmVzZXJ2ZWRbOF07Cit9OworCiAvKgogICoJSSBPIEMgVCBMICAgQyBPIEQgRSBTICAgRiBPIFIgICBWIEkgRCBFIE8gICBEIEUgViBJIEMgRSBTCiAgKgpAQCAtMjE4Miw2ICsyMjUwLDExIEBACiAjZGVmaW5lCVZJRElPQ19TVUJTQ1JJQkVfRVZFTlQJIF9JT1coJ1YnLCA5MCwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQogI2RlZmluZQlWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgX0lPVygnVicsIDkxLCBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pCiAKKy8qIEV4cGVyaW1lbnRhbCwgdGhlIGJlbG93IHR3byBpb2N0bHMgbWF5IGNoYW5nZSBvdmVyIHRoZSBuZXh0IGNvdXBsZSBvZiBrZXJuZWwKKyAgIHZlcnNpb25zICovCisjZGVmaW5lIFZJRElPQ19DUkVBVEVfQlVGUwlfSU9XUignVicsIDkyLCBzdHJ1Y3QgdjRsMl9jcmVhdGVfYnVmZmVycykKKyNkZWZpbmUgVklESU9DX1BSRVBBUkVfQlVGCV9JT1dSKCdWJywgOTMsIHN0cnVjdCB2NGwyX2J1ZmZlcikKKwogLyogUmVtaW5kZXI6IHdoZW4gYWRkaW5nIG5ldyBpb2N0bHMgcGxlYXNlIGFkZCBzdXBwb3J0IGZvciB0aGVtIHRvCiAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBhcyB3ZWxsISAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW8uaAppbmRleCA4NTFlYmYxLi40YzA2OWQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpby5oCkBAIC0xMzEsMTAgKzEzMSwxMCBAQAogICogdmlydGlvX2RyaXZlciAtIG9wZXJhdGlvbnMgZm9yIGEgdmlydGlvIEkvTyBkcml2ZXIKICAqIEBkcml2ZXI6IHVuZGVybHlpbmcgZGV2aWNlIGRyaXZlciAocG9wdWxhdGUgbmFtZSBhbmQgb3duZXIpLgogICogQGlkX3RhYmxlOiB0aGUgaWRzIHNlcnZpY2VkIGJ5IHRoaXMgZHJpdmVyLgotICogQGZlYXR1cmVfdGFibGU6IGFuIGFycmF5IG9mIGZlYXR1cmUgbnVtYmVycyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisgKiBAZmVhdHVyZV90YWJsZTogYW4gYXJyYXkgb2YgZmVhdHVyZSBudW1iZXJzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KICAqIEBmZWF0dXJlX3RhYmxlX3NpemU6IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmZWF0dXJlIHRhYmxlIGFycmF5LgogICogQHByb2JlOiB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGV2aWNlIGlzIGZvdW5kLiAgUmV0dXJucyAwIG9yIC1lcnJuby4KLSAqIEByZW1vdmU6IHRoZSBmdW5jdGlvbiB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQuCisgKiBAcmVtb3ZlOiB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQuCiAgKiBAY29uZmlnX2NoYW5nZWQ6IG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAqICAgIGNoYW5nZXM7IG1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKaW5kZXggMzljODhjNS4uYWRkNDc5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKQEAgLTE1NSw2ICsxNTUsOSBAQAogI2RlZmluZSB2aXJ0aW9fY29uZmlnX3ZhbCh2ZGV2LCBmYml0LCBvZmZzZXQsIHYpIFwKIAl2aXJ0aW9fY29uZmlnX2J1ZigodmRldiksIChmYml0KSwgKG9mZnNldCksICh2KSwgc2l6ZW9mKCp2KSkKIAorI2RlZmluZSB2aXJ0aW9fY29uZmlnX3ZhbF9sZW4odmRldiwgZmJpdCwgb2Zmc2V0LCB2LCBsZW4pIFwKKwl2aXJ0aW9fY29uZmlnX2J1ZigodmRldiksIChmYml0KSwgKG9mZnNldCksICh2KSwgKGxlbikpCisKIHN0YXRpYyBpbmxpbmUgaW50IHZpcnRpb19jb25maWdfYnVmKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZmJpdCwKIAkJCQkgICAgdW5zaWduZWQgaW50IG9mZnNldCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX21taW8uaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX21taW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M3ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fbW1pby5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogVmlydGlvIHBsYXRmb3JtIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSwgQVJNIEx0ZC4KKyAqCisgKiBCYXNlZCBvbiBWaXJ0aW8gUENJIGRyaXZlciBieSBBbnRob255IExpZ3VvcmksIGNvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50CisgKiBjb21wYXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSUJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBJQk0gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9WSVJUSU9fTU1JT19ICisjZGVmaW5lIF9MSU5VWF9WSVJUSU9fTU1JT19ICisKKy8qCisgKiBDb250cm9sIHJlZ2lzdGVycworICovCisKKy8qIE1hZ2ljIHZhbHVlICgidmlydCIgc3RyaW5nKSAtIFJlYWQgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19NQUdJQ19WQUxVRQkJMHgwMDAKKworLyogVmlydGlvIGRldmljZSB2ZXJzaW9uIC0gUmVhZCBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1ZFUlNJT04JCTB4MDA0CisKKy8qIFZpcnRpbyBkZXZpY2UgSUQgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fREVWSUNFX0lECQkweDAwOAorCisvKiBWaXJ0aW8gdmVuZG9yIElEIC0gUmVhZCBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1ZFTkRPUl9JRAkJMHgwMGMKKworLyogQml0bWFzayBvZiB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBob3N0CisgKiAoMzIgYml0cyBwZXIgc2V0KSAtIFJlYWQgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTCTB4MDEwCisKKy8qIEhvc3QgZmVhdHVyZXMgc2V0IHNlbGVjdG9yIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19IT1NUX0ZFQVRVUkVTX1NFTAkweDAxNAorCisvKiBCaXRtYXNrIG9mIGZlYXR1cmVzIGFjdGl2YXRlZCBieSB0aGUgZ3Vlc3QKKyAqICgzMiBiaXRzIHBlciBzZXQpIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFUwkweDAyMAorCisvKiBBY3RpdmF0ZWQgZmVhdHVyZXMgc2V0IHNlbGVjdG9yIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9GRUFUVVJFU19TRVQJMHgwMjQKKworLyogR3Vlc3QncyBtZW1vcnkgcGFnZSBzaXplIGluIGJ5dGVzIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19HVUVTVF9QQUdFX1NJWkUJMHgwMjgKKworLyogUXVldWUgc2VsZWN0b3IgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1FVRVVFX1NFTAkJMHgwMzAKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfTlVNX01BWAkweDAzNAorCisvKiBRdWV1ZSBzaXplIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHF1ZXVlIC0gV3JpdGUgT25seSAqLworI2RlZmluZSBWSVJUSU9fTU1JT19RVUVVRV9OVU0JCTB4MDM4CisKKy8qIFVzZWQgUmluZyBhbGlnbm1lbnQgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcXVldWUgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX1FVRVVFX0FMSUdOCQkweDAzYworCisvKiBHdWVzdCdzIFBGTiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBxdWV1ZSAtIFJlYWQgV3JpdGUgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfUEZOCQkweDA0MAorCisvKiBRdWV1ZSBub3RpZmllciAtIFdyaXRlIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fUVVFVUVfTk9USUZZCTB4MDUwCisKKy8qIEludGVycnVwdCBzdGF0dXMgLSBSZWFkIE9ubHkgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fSU5URVJSVVBUX1NUQVRVUwkweDA2MAorCisvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgLSBXcml0ZSBPbmx5ICovCisjZGVmaW5lIFZJUlRJT19NTUlPX0lOVEVSUlVQVF9BQ0sJMHgwNjQKKworLyogRGV2aWNlIHN0YXR1cyByZWdpc3RlciAtIFJlYWQgV3JpdGUgKi8KKyNkZWZpbmUgVklSVElPX01NSU9fU1RBVFVTCQkweDA3MAorCisvKiBUaGUgY29uZmlnIHNwYWNlIGlzIGRlZmluZWQgYnkgZWFjaCBkcml2ZXIgYXMKKyAqIHRoZSBwZXItZHJpdmVyIGNvbmZpZ3VyYXRpb24gc3BhY2UgLSBSZWFkIFdyaXRlICovCisjZGVmaW5lIFZJUlRJT19NTUlPX0NPTkZJRwkJMHgxMDAKKworCisKKy8qCisgKiBJbnRlcnJ1cHQgZmxhZ3MgKHJlOiBpbnRlcnJ1cHQgc3RhdHVzICYgYWNrbm93bGVkZ2UgcmVnaXN0ZXJzKQorICovCisKKyNkZWZpbmUgVklSVElPX01NSU9fSU5UX1ZSSU5HCQkoMSA8PCAwKQorI2RlZmluZSBWSVJUSU9fTU1JT19JTlRfQ09ORklHCQkoMSA8PCAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX3JpbmcuaAppbmRleCA0YTMyY2I2Li4zNmJlMGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19yaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC92aXJ0aW9fcmluZy5oCkBAIC0xMzUsMTMgKzEzNSwxMyBAQAogCXZyLT5udW0gPSBudW07CiAJdnItPmRlc2MgPSBwOwogCXZyLT5hdmFpbCA9IHAgKyBudW0qc2l6ZW9mKHN0cnVjdCB2cmluZ19kZXNjKTsKLQl2ci0+dXNlZCA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykmdnItPmF2YWlsLT5yaW5nW251bV0gKyBhbGlnbi0xKQotCQkJICAgICYgfihhbGlnbiAtIDEpKTsKKwl2ci0+dXNlZCA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZykmdnItPmF2YWlsLT5yaW5nW251bV0gKyBzaXplb2YoX191MTYpCisJCSsgYWxpZ24tMSkgJiB+KGFsaWduIC0gMSkpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHZyaW5nX3NpemUodW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKLQlyZXR1cm4gKChzaXplb2Yoc3RydWN0IHZyaW5nX2Rlc2MpICogbnVtICsgc2l6ZW9mKF9fdTE2KSAqICgyICsgbnVtKQorCXJldHVybiAoKHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYykgKiBudW0gKyBzaXplb2YoX191MTYpICogKDMgKyBudW0pCiAJCSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSkpCiAJCSsgc2l6ZW9mKF9fdTE2KSAqIDMgKyBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkgKiBudW07CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZseW5xLmggYi9pbmNsdWRlL2xpbnV4L3ZseW5xLmgKaW5kZXggOGY2YTk1OC4uMDE3ZDRhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bHlucS5oCisrKyBiL2luY2x1ZGUvbGludXgvdmx5bnEuaApAQCAtMjAsOSArMjAsMTAgQEAKICNkZWZpbmUgX19WTFlOUV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKK3N0cnVjdCBtb2R1bGU7CisKICNkZWZpbmUgVkxZTlFfTlVNX0lSUVMgMzIKIAogc3RydWN0IHZseW5xX21hcHBpbmcgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCA5MzMyZTUyLi42ODdmYjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBWTV9NQVAJCTB4MDAwMDAwMDQJLyogdm1hcCgpZWQgcGFnZXMgKi8KICNkZWZpbmUgVk1fVVNFUk1BUAkweDAwMDAwMDA4CS8qIHN1aXRhYmxlIGZvciByZW1hcF92bWFsbG9jX3JhbmdlICovCiAjZGVmaW5lIFZNX1ZQQUdFUwkweDAwMDAwMDEwCS8qIGJ1ZmZlciBmb3IgcGFnZXMgd2FzIHZtYWxsb2MnZWQgKi8KKyNkZWZpbmUgVk1fVU5MSVNUCTB4MDAwMDAwMjAJLyogdm1fc3RydWN0IGlzIG5vdCBsaXN0ZWQgaW4gdm1saXN0ICovCiAvKiBiaXRzIFsyMC4uMzJdIHJlc2VydmVkIGZvciBhcmNoIHNwZWNpZmljIGlvcmVtYXAgaW50ZXJuYWxzICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dsMTJ4eC5oIGIvaW5jbHVkZS9saW51eC93bDEyeHguaAppbmRleCA0YjY5NzM5Li4wZDYzNzMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dsMTJ4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvd2wxMnh4LmgKQEAgLTU0LDYgKzU0LDkgQEAKIAlpbnQgYm9hcmRfcmVmX2Nsb2NrOwogCWludCBib2FyZF90Y3hvX2Nsb2NrOwogCXVuc2lnbmVkIGxvbmcgcGxhdGZvcm1fcXVpcmtzOworCWJvb2wgcHdyX2luX3N1c3BlbmQ7CisKKwlzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgKm9wczsKIH07CiAKIC8qIFBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgbGV2ZWwgdHJpZ2dlciBpbnRlcnJ1cHRzICovCkBAIC03Myw2ICs3Niw2IEBACiAKICNlbmRpZgogCi1jb25zdCBzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKndsMTJ4eF9nZXRfcGxhdGZvcm1fZGF0YSh2b2lkKTsKK3N0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqd2wxMnh4X2dldF9wbGF0Zm9ybV9kYXRhKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IDJiODk2M2YuLmEzNzhjMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMzksNiArMzksMjMgQEAKIH07CiAKIC8qCisgKiB3aHkgc29tZSB3cml0ZWJhY2sgd29yayB3YXMgaW5pdGlhdGVkCisgKi8KK2VudW0gd2JfcmVhc29uIHsKKwlXQl9SRUFTT05fQkFDS0dST1VORCwKKwlXQl9SRUFTT05fVFJZX1RPX0ZSRUVfUEFHRVMsCisJV0JfUkVBU09OX1NZTkMsCisJV0JfUkVBU09OX1BFUklPRElDLAorCVdCX1JFQVNPTl9MQVBUT1BfVElNRVIsCisJV0JfUkVBU09OX0ZSRUVfTU9SRV9NRU0sCisJV0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UsCisJV0JfUkVBU09OX0ZPUktFUl9USFJFQUQsCisKKwlXQl9SRUFTT05fTUFYLAorfTsKK2V4dGVybiBjb25zdCBjaGFyICp3Yl9yZWFzb25fbmFtZVtdOworCisvKgogICogQSBjb250cm9sIHN0cnVjdHVyZSB3aGljaCB0ZWxscyB0aGUgd3JpdGViYWNrIGNvZGUgd2hhdCB0byBkby4gIFRoZXNlIGFyZQogICogYWx3YXlzIG9uIHRoZSBzdGFjaywgYW5kIGhlbmNlIG5lZWQgbm8gbG9ja2luZy4gIFRoZXkgYXJlIGFsd2F5cyBpbml0aWFsaXNlZAogICogaW4gYSBtYW5uZXIgc3VjaCB0aGF0IHVuc3BlY2lmaWVkIGZpZWxkcyBhcmUgc2V0IHRvIHplcm8uCkBAIC02OSwxNCArODYsMTcgQEAKICAqLwkKIHN0cnVjdCBiZGlfd3JpdGViYWNrOwogaW50IGlub2RlX3dhaXQodm9pZCAqKTsKLXZvaWQgd3JpdGViYWNrX2lub2Rlc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci12b2lkIHdyaXRlYmFja19pbm9kZXNfc2JfbnIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgbnIpOwotaW50IHdyaXRlYmFja19pbm9kZXNfc2JfaWZfaWRsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1pbnQgd3JpdGViYWNrX2lub2Rlc19zYl9ucl9pZl9pZGxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nIG5yKTsKK3ZvaWQgd3JpdGViYWNrX2lub2Rlc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZW51bSB3Yl9yZWFzb24gcmVhc29uKTsKK3ZvaWQgd3JpdGViYWNrX2lub2Rlc19zYl9ucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBuciwKKwkJCQkJCQllbnVtIHdiX3JlYXNvbiByZWFzb24pOworaW50IHdyaXRlYmFja19pbm9kZXNfc2JfaWZfaWRsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZW51bSB3Yl9yZWFzb24gcmVhc29uKTsKK2ludCB3cml0ZWJhY2tfaW5vZGVzX3NiX25yX2lmX2lkbGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgbnIsCisJCQkJCQkJZW51bSB3Yl9yZWFzb24gcmVhc29uKTsKIHZvaWQgc3luY19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOwotbG9uZyB3cml0ZWJhY2tfaW5vZGVzX3diKHN0cnVjdCBiZGlfd3JpdGViYWNrICp3YiwgbG9uZyBucl9wYWdlcyk7Citsb25nIHdyaXRlYmFja19pbm9kZXNfd2Ioc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLCBsb25nIG5yX3BhZ2VzLAorCQkJCWVudW0gd2JfcmVhc29uIHJlYXNvbik7CiBsb25nIHdiX2RvX3dyaXRlYmFjayhzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IsIGludCBmb3JjZV93YWl0KTsKLXZvaWQgd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsb25nIG5yX3BhZ2VzKTsKK3ZvaWQgd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsb25nIG5yX3BhZ2VzLCBlbnVtIHdiX3JlYXNvbiByZWFzb24pOwogCiAvKiB3cml0ZWJhY2suaCByZXF1aXJlcyBmcy5oOyBpdCwgdG9vLCBpcyBub3QgaW5jbHVkZWQgZnJvbSBoZXJlLiAqLwogc3RhdGljIGlubGluZSB2b2lkIHdhaXRfb25faW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTE0Myw2ICsxNjMsNyBAQAogCiB2b2lkIF9fYmRpX3VwZGF0ZV9iYW5kd2lkdGgoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHRocmVzaCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGRpcnR5LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmggYi9pbmNsdWRlL21lZGlhL201bW9scy5oCmluZGV4IGFhYzJjMGUuLjRhODI1YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbTVtb2xzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tNW1vbHMuaApAQCAtMTgsMTUgKzE4LDEzIEBACiAKIC8qKgogICogc3RydWN0IG01bW9sc19wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gZGF0YSBmb3IgTS01TU9MUyBkcml2ZXIKLSAqIEBpcnE6CUdQSU8gZ2V0dGluZyB0aGUgaXJxIHBpbiBvZiBNLTVNT0xTCiAgKiBAZ3Bpb19yZXNldDoJR1BJTyBkcml2aW5nIHRoZSByZXNldCBwaW4gb2YgTS01TU9MUwotICogQHJlc2V0X3BvbGFyaXR5OiBhY3RpdmUgc3RhdGUgZm9yIGdwaW9fcnN0IHBpbiwgMCBvciAxCisgKiBAcmVzZXRfcG9sYXJpdHk6IGFjdGl2ZSBzdGF0ZSBmb3IgZ3Bpb19yZXNldCBwaW4sIDAgb3IgMQogICogQHNldF9wb3dlcjoJYW4gYWRkaXRpb25hbCBjYWxsYmFjayB0byB0aGUgYm9hcmQgc2V0dXAgY29kZQogICoJCXRvIGJlIGNhbGxlZCBhZnRlciBlbmFibGluZyBhbmQgYmVmb3JlIGRpc2FibGluZwogICoJCXRoZSBzZW5zb3IncyBzdXBwbHkgcmVndWxhdG9ycwogICovCiBzdHJ1Y3QgbTVtb2xzX3BsYXRmb3JtX2RhdGEgewotCWludCBpcnE7CiAJaW50IGdwaW9fcmVzZXQ7CiAJdTggcmVzZXRfcG9sYXJpdHk7CiAJaW50ICgqc2V0X3Bvd2VyKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBvbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL210OXAwMzEuaCBiL2luY2x1ZGUvbWVkaWEvbXQ5cDAzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL210OXAwMzEuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIE1UOVAwMzFfSAorI2RlZmluZSBNVDlQMDMxX0gKKworc3RydWN0IHY0bDJfc3ViZGV2OworCitlbnVtIHsKKwlNVDlQMDMxX0NPTE9SX1ZFUlNJT04sCisJTVQ5UDAzMV9NT05PQ0hST01FX1ZFUlNJT04sCit9OworCitzdHJ1Y3QgbXQ5cDAzMV9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCpzZXRfeGNsaykoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBoeik7CisJaW50ICgqcmVzZXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBpbnQgYWN0aXZlKTsKKwlpbnQgZXh0X2ZyZXE7IC8qIGlucHV0IGZyZXF1ZW5jeSB0byB0aGUgbXQ5cDAzMSBmb3IgUExMIGRpdmlkZXJzICovCisJaW50IHRhcmdldF9mcmVxOyAvKiBmcmVxdWVuY3kgdGFyZ2V0IGZvciB0aGUgUExMICovCisJaW50IHZlcnNpb247IC8qIE1UOVAwMzFfQ09MT1JfVkVSU0lPTiBvciBNVDlQMDMxX01PTk9DSFJPTUVfVkVSU0lPTiAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL210OXQwMDEuaCBiL2luY2x1ZGUvbWVkaWEvbXQ5dDAwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzlhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL210OXQwMDEuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX01FRElBX01UOVQwMDFfSAorI2RlZmluZSBfTUVESUFfTVQ5VDAwMV9ICisKK3N0cnVjdCBtdDl0MDAxX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCBjbGtfcG9sOjE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb21hcDNpc3AuaCBiL2luY2x1ZGUvbWVkaWEvb21hcDNpc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE3YjFkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbWFwM2lzcC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogb21hcDNpc3AuaAorICoKKyAqIFRJIE9NQVAzIElTUCAtIFBsYXRmb3JtIGRhdGEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0czogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgorICoJICAgICBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bpa2kuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19NRURJQV9PTUFQM0lTUF9IX18KKyNkZWZpbmUgX19NRURJQV9PTUFQM0lTUF9IX18KKworc3RydWN0IGkyY19ib2FyZF9pbmZvOworc3RydWN0IGlzcF9kZXZpY2U7CisKK2VudW0gaXNwX2ludGVyZmFjZV90eXBlIHsKKwlJU1BfSU5URVJGQUNFX1BBUkFMTEVMLAorCUlTUF9JTlRFUkZBQ0VfQ1NJMkFfUEhZMiwKKwlJU1BfSU5URVJGQUNFX0NDUDJCX1BIWTEsCisJSVNQX0lOVEVSRkFDRV9DQ1AyQl9QSFkyLAorCUlTUF9JTlRFUkZBQ0VfQ1NJMkNfUEhZMSwKK307CisKK2VudW0geworCUlTUF9CUklER0VfRElTQUJMRSA9IDAsCisJSVNQX0JSSURHRV9MSVRUTEVfRU5ESUFOID0gMiwKKwlJU1BfQlJJREdFX0JJR19FTkRJQU4gPSAzLAorfTsKKworZW51bSB7CisJSVNQX0xBTkVfU0hJRlRfMCA9IDAsCisJSVNQX0xBTkVfU0hJRlRfMiA9IDEsCisJSVNQX0xBTkVfU0hJRlRfNCA9IDIsCisJSVNQX0xBTkVfU0hJRlRfNiA9IDMsCit9OworCisvKioKKyAqIHN0cnVjdCBpc3BfcGFyYWxsZWxfcGxhdGZvcm1fZGF0YSAtIFBhcmFsbGVsIGludGVyZmFjZSBwbGF0Zm9ybSBkYXRhCisgKiBAZGF0YV9sYW5lX3NoaWZ0OiBEYXRhIGxhbmUgc2hpZnRlcgorICoJCUlTUF9MQU5FX1NISUZUXzAgLSBDQU1FWFRbMTM6MF0gLT4gQ0FNWzEzOjBdCisgKgkJSVNQX0xBTkVfU0hJRlRfMiAtIENBTUVYVFsxMzoyXSAtPiBDQU1bMTE6MF0KKyAqCQlJU1BfTEFORV9TSElGVF80IC0gQ0FNRVhUWzEzOjRdIC0+IENBTVs5OjBdCisgKgkJSVNQX0xBTkVfU0hJRlRfNiAtIENBTUVYVFsxMzo2XSAtPiBDQU1bNzowXQorICogQGNsa19wb2w6IFBpeGVsIGNsb2NrIHBvbGFyaXR5CisgKgkJMCAtIE5vbiBJbnZlcnRlZCwgMSAtIEludmVydGVkCisgKiBAaHNfcG9sOiBIb3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBwb2xhcml0eQorICoJCTAgLSBBY3RpdmUgaGlnaCwgMSAtIEFjdGl2ZSBsb3cKKyAqIEB2c19wb2w6IFZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb2xhcml0eQorICoJCTAgLSBBY3RpdmUgaGlnaCwgMSAtIEFjdGl2ZSBsb3cKKyAqIEBicmlkZ2U6IENDREMgQnJpZGdlIGlucHV0IGNvbnRyb2wKKyAqCQlJU1BfQlJJREdFX0RJU0FCTEUgLSBEaXNhYmxlCisgKgkJSVNQX0JSSURHRV9MSVRUTEVfRU5ESUFOIC0gTGl0dGxlIGVuZGlhbgorICoJCUlTUF9CUklER0VfQklHX0VORElBTiAtIEJpZyBlbmRpYW4KKyAqLworc3RydWN0IGlzcF9wYXJhbGxlbF9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sYW5lX3NoaWZ0OjI7CisJdW5zaWduZWQgaW50IGNsa19wb2w6MTsKKwl1bnNpZ25lZCBpbnQgaHNfcG9sOjE7CisJdW5zaWduZWQgaW50IHZzX3BvbDoxOworCXVuc2lnbmVkIGludCBicmlkZ2U6MjsKK307CisKK2VudW0geworCUlTUF9DQ1AyX1BIWV9EQVRBX0NMT0NLID0gMCwKKwlJU1BfQ0NQMl9QSFlfREFUQV9TVFJPQkUgPSAxLAorfTsKKworZW51bSB7CisJSVNQX0NDUDJfTU9ERV9NSVBJID0gMCwKKwlJU1BfQ0NQMl9NT0RFX0NDUDIgPSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaXNwX2NjcDJfcGxhdGZvcm1fZGF0YSAtIENDUDIgaW50ZXJmYWNlIHBsYXRmb3JtIGRhdGEKKyAqIEBzdHJvYmVfY2xrX3BvbDogU3Ryb2JlL2Nsb2NrIHBvbGFyaXR5CisgKgkJMCAtIE5vbiBJbnZlcnRlZCwgMSAtIEludmVydGVkCisgKiBAY3JjOiBFbmFibGUgdGhlIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrCisgKiBAY2NwMl9tb2RlOiBFbmFibGUgQ0NQMiBjb21wYXRpYmlsaXR5IG1vZGUKKyAqCQlJU1BfQ0NQMl9NT0RFX01JUEkgLSBNSVBJLUNTSTEgbW9kZQorICoJCUlTUF9DQ1AyX01PREVfQ0NQMiAtIENDUDIgbW9kZQorICogQHBoeV9sYXllcjogUGh5c2ljYWwgbGF5ZXIgc2VsZWN0aW9uCisgKgkJSVNQX0NDUDJfUEhZX0RBVEFfQ0xPQ0sgLSBEYXRhL2Nsb2NrIHBoeXNpY2FsIGxheWVyCisgKgkJSVNQX0NDUDJfUEhZX0RBVEFfU1RST0JFIC0gRGF0YS9zdHJvYmUgcGh5c2ljYWwgbGF5ZXIKKyAqIEB2cGNsa19kaXY6IFZpZGVvIHBvcnQgb3V0cHV0IGNsb2NrIGNvbnRyb2wKKyAqLworc3RydWN0IGlzcF9jY3AyX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCBzdHJvYmVfY2xrX3BvbDoxOworCXVuc2lnbmVkIGludCBjcmM6MTsKKwl1bnNpZ25lZCBpbnQgY2NwMl9tb2RlOjE7CisJdW5zaWduZWQgaW50IHBoeV9sYXllcjoxOworCXVuc2lnbmVkIGludCB2cGNsa19kaXY6MjsKK307CisKKy8qKgorICogc3RydWN0IGlzcF9jc2kyX3BsYXRmb3JtX2RhdGEgLSBDU0kyIGludGVyZmFjZSBwbGF0Zm9ybSBkYXRhCisgKiBAY3JjOiBFbmFibGUgdGhlIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrCisgKiBAdnBjbGtfZGl2OiBWaWRlbyBwb3J0IG91dHB1dCBjbG9jayBjb250cm9sCisgKi8KK3N0cnVjdCBpc3BfY3NpMl9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBjcmM6MTsKKwl1bnNpZ25lZCB2cGNsa19kaXY6MjsKK307CisKK3N0cnVjdCBpc3Bfc3ViZGV2X2kyY19ib2FyZF9pbmZvIHsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmJvYXJkX2luZm87CisJaW50IGkyY19hZGFwdGVyX2lkOworfTsKKworc3RydWN0IGlzcF92NGwyX3N1YmRldnNfZ3JvdXAgeworCXN0cnVjdCBpc3Bfc3ViZGV2X2kyY19ib2FyZF9pbmZvICpzdWJkZXZzOworCWVudW0gaXNwX2ludGVyZmFjZV90eXBlIGludGVyZmFjZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBpc3BfcGFyYWxsZWxfcGxhdGZvcm1fZGF0YSBwYXJhbGxlbDsKKwkJc3RydWN0IGlzcF9jY3AyX3BsYXRmb3JtX2RhdGEgY2NwMjsKKwkJc3RydWN0IGlzcF9jc2kyX3BsYXRmb3JtX2RhdGEgY3NpMjsKKwl9IGJ1czsgLyogZ2NjIDwgNC42LjAgY2hva2VzIG9uIGFub255bW91cyB1bmlvbiBpbml0aWFsaXplcnMgKi8KK307CisKK3N0cnVjdCBpc3BfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IGlzcF92NGwyX3N1YmRldnNfZ3JvdXAgKnN1YmRldnM7CisJdm9pZCAoKnNldF9jb25zdHJhaW50cykoc3RydWN0IGlzcF9kZXZpY2UgKmlzcCwgYm9vbCBlbmFibGUpOworfTsKKworI2VuZGlmCS8qIF9fTUVESUFfT01BUDNJU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL292NzcyeC5oIGIvaW5jbHVkZS9tZWRpYS9vdjc3MnguaAppbmRleCA1NDhiZjExLi4wMGRiYjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL292NzcyeC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Y3NzJ4LmgKQEAgLTEyLDEyICsxMiw5IEBACiAjaWZuZGVmIF9fT1Y3NzJYX0hfXwogI2RlZmluZSBfX09WNzcyWF9IX18KIAotI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KLQogLyogZm9yIGZsYWdzICovCiAjZGVmaW5lIE9WNzcyWF9GTEFHX1ZGTElQCSgxIDw8IDApIC8qIFZlcnRpY2FsIGZsaXAgaW1hZ2UgKi8KICNkZWZpbmUgT1Y3NzJYX0ZMQUdfSEZMSVAJKDEgPDwgMSkgLyogSG9yaXpvbnRhbCBmbGlwIGltYWdlICovCi0jZGVmaW5lIE9WNzcyWF9GTEFHXzhCSVQJKDEgPDwgMikgLyogZGVmYXVsdCAxMCBiaXQgKi8KIAogLyoKICAqIGZvciBFZGdlIGN0cmwKQEAgLTMyLDIyICsyOSwyMyBAQAogCXVuc2lnbmVkIGNoYXIgbG93ZXI7CiB9OwogCi0jZGVmaW5lIE9WNzcyWF9NQU5VQUxfRURHRV9DVFJMCTB4ODAgLyogdW4tdXNlZCBiaXQgb2Ygc3RyZW5ndGggKi8KLSNkZWZpbmUgRURHRV9TVFJFTkdUSF9NQVNLCTB4MUYKLSNkZWZpbmUgRURHRV9USFJFU0hPTERfTUFTSwkweDBGCi0jZGVmaW5lIEVER0VfVVBQRVJfTUFTSwkJMHhGRgotI2RlZmluZSBFREdFX0xPV0VSX01BU0sJCTB4RkYKKyNkZWZpbmUgT1Y3NzJYX01BTlVBTF9FREdFX0NUUkwJCTB4ODAgLyogdW4tdXNlZCBiaXQgb2Ygc3RyZW5ndGggKi8KKyNkZWZpbmUgT1Y3NzJYX0VER0VfU1RSRU5HVEhfTUFTSwkweDFGCisjZGVmaW5lIE9WNzcyWF9FREdFX1RIUkVTSE9MRF9NQVNLCTB4MEYKKyNkZWZpbmUgT1Y3NzJYX0VER0VfVVBQRVJfTUFTSwkJMHhGRgorI2RlZmluZSBPVjc3MlhfRURHRV9MT1dFUl9NQVNLCQkweEZGCiAKICNkZWZpbmUgT1Y3NzJYX0FVVE9fRURHRUNUUkwodSwgbCkJXAogewkJCQkJXAotCS51cHBlciA9ICh1ICYgRURHRV9VUFBFUl9NQVNLKSwJXAotCS5sb3dlciA9IChsICYgRURHRV9MT1dFUl9NQVNLKSwJXAorCS51cHBlciA9ICh1ICYgT1Y3NzJYX0VER0VfVVBQRVJfTUFTSyksCVwKKwkubG93ZXIgPSAobCAmIE9WNzcyWF9FREdFX0xPV0VSX01BU0spLAlcCiB9CiAKLSNkZWZpbmUgT1Y3NzJYX01BTlVBTF9FREdFQ1RSTChzLCB0KQkJCQkJXAotewkJCQkJCQkJCVwKLQkuc3RyZW5ndGggID0gKHMgJiBFREdFX1NUUkVOR1RIX01BU0spIHwgT1Y3NzJYX01BTlVBTF9FREdFX0NUUkwsXAotCS50aHJlc2hvbGQgPSAodCAmIEVER0VfVEhSRVNIT0xEX01BU0spLAkJCQlcCisjZGVmaW5lIE9WNzcyWF9NQU5VQUxfRURHRUNUUkwocywgdCkJCQlcCit7CQkJCQkJCVwKKwkuc3RyZW5ndGggID0gKHMgJiBPVjc3MlhfRURHRV9TVFJFTkdUSF9NQVNLKSB8CVwKKwkJCU9WNzcyWF9NQU5VQUxfRURHRV9DVFJMLAlcCisJLnRocmVzaG9sZCA9ICh0ICYgT1Y3NzJYX0VER0VfVEhSRVNIT0xEX01BU0spLAlcCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaCBiL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCmluZGV4IGIxZjE5YjcuLmIwYzQ5NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCkBAIC0yMyw4ICsyMywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3JjLW1hcC5oPgogCiBleHRlcm4gaW50IHJjX2NvcmVfZGVidWc7Ci0jZGVmaW5lIElSX2RwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKQlpZiAocmNfY29yZV9kZWJ1ZyA+PSBsZXZlbCkgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQgLCBfX2Z1bmNfXywgIyMgYXJnKQorI2RlZmluZSBJUl9kcHJpbnRrKGxldmVsLCBmbXQsIC4uLikJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmIChyY19jb3JlX2RlYnVnID49IGxldmVsKQkJCQlcCisJCXByX2RlYnVnKCIlczogIiBmbXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKTsJXAorfSB3aGlsZSAoMCkKIAogZW51bSByY19kcml2ZXJfdHlwZSB7CiAJUkNfRFJJVkVSX1NDQU5DT0RFID0gMCwJLyogRHJpdmVyIG9yIGhhcmR3YXJlIGdlbmVyYXRlcyBhIHNjYW5jb2RlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oIGIvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaAppbmRleCAxN2M5NzU5Li4yNmEzYmQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKQEAgLTYxLDYgKzYxLDcgQEAKICNkZWZpbmUgUkNfTUFQX0FQQUNfVklFV0NPTVAgICAgICAgICAgICAgInJjLWFwYWMtdmlld2NvbXAiCiAjZGVmaW5lIFJDX01BUF9BU1VTX1BDMzkgICAgICAgICAgICAgICAgICJyYy1hc3VzLXBjMzkiCiAjZGVmaW5lIFJDX01BUF9BVElfVFZfV09OREVSX0hEXzYwMCAgICAgICJyYy1hdGktdHYtd29uZGVyLWhkLTYwMCIKKyNkZWZpbmUgUkNfTUFQX0FUSV9YMTAgICAgICAgICAgICAgICAgICAgInJjLWF0aS14MTAiCiAjZGVmaW5lIFJDX01BUF9BVkVSTUVESUFfQTE2RCAgICAgICAgICAgICJyYy1hdmVybWVkaWEtYTE2ZCIKICNkZWZpbmUgUkNfTUFQX0FWRVJNRURJQV9DQVJEQlVTICAgICAgICAgInJjLWF2ZXJtZWRpYS1jYXJkYnVzIgogI2RlZmluZSBSQ19NQVBfQVZFUk1FRElBX0RWQlQgICAgICAgICAgICAicmMtYXZlcm1lZGlhLWR2YnQiCkBAIC0xMDYsNiArMTA3LDcgQEAKICNkZWZpbmUgUkNfTUFQX0xJUkMgICAgICAgICAgICAgICAgICAgICAgInJjLWxpcmMiCiAjZGVmaW5lIFJDX01BUF9MTUUyNTEwICAgICAgICAgICAgICAgICAgICJyYy1sbWUyNTEwIgogI2RlZmluZSBSQ19NQVBfTUFOTEkgICAgICAgICAgICAgICAgICAgICAicmMtbWFubGkiCisjZGVmaW5lIFJDX01BUF9NRURJT05fWDEwICAgICAgICAgICAgICAgICJyYy1tZWRpb24teDEwIgogI2RlZmluZSBSQ19NQVBfTVNJX0RJR0lWT1hfSUkgICAgICAgICAgICAicmMtbXNpLWRpZ2l2b3gtaWkiCiAjZGVmaW5lIFJDX01BUF9NU0lfRElHSVZPWF9JSUkgICAgICAgICAgICJyYy1tc2ktZGlnaXZveC1paWkiCiAjZGVmaW5lIFJDX01BUF9NU0lfVFZBTllXSEVSRV9QTFVTICAgICAgICJyYy1tc2ktdHZhbnl3aGVyZS1wbHVzIgpAQCAtMTMwLDYgKzEzMiw3IEBACiAjZGVmaW5lIFJDX01BUF9SQzVfVFYgICAgICAgICAgICAgICAgICAgICJyYy1yYzUtdHYiCiAjZGVmaW5lIFJDX01BUF9SQzZfTUNFICAgICAgICAgICAgICAgICAgICJyYy1yYzYtbWNlIgogI2RlZmluZSBSQ19NQVBfUkVBTF9BVURJT18yMjBfMzJfS0VZUyAgICAicmMtcmVhbC1hdWRpby0yMjAtMzIta2V5cyIKKyNkZWZpbmUgUkNfTUFQX1NOQVBTVFJFQU1fRklSRUZMWSAgICAgICAgInJjLXNuYXBzdHJlYW0tZmlyZWZseSIKICNkZWZpbmUgUkNfTUFQX1NUUkVBTVpBUCAgICAgICAgICAgICAgICAgInJjLXN0cmVhbXphcCIKICNkZWZpbmUgUkNfTUFQX1RCU19ORUMgICAgICAgICAgICAgICAgICAgInJjLXRicy1uZWMiCiAjZGVmaW5lIFJDX01BUF9URUNITklTQVRfVVNCMiAgICAgICAgICAgICJyYy10ZWNobmlzYXQtdXNiMiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvczVrNmFhLmggYi9pbmNsdWRlL21lZGlhL3M1azZhYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzRmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3M1azZhYS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBTNUs2QUFGWCBjYW1lcmEgc2Vuc29yIGRyaXZlciBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVLNkFBX0gKKyNkZWZpbmUgUzVLNkFBX0gKKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KKworLyoqCisgKiBzdHJ1Y3QgczVrNmFhX2dwaW8gLSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgR1BJTworICogQGdwaW86ICBHUElPIG51bWJlcgorICogQGxldmVsOiBpbmRpY2F0ZXMgYWN0aXZlIHN0YXRlIG9mIHRoZSBAZ3BpbworICovCitzdHJ1Y3QgczVrNmFhX2dwaW8geworCWludCBncGlvOworCWludCBsZXZlbDsKK307CisKKy8qKgorICogc3RydWN0IHM1azZhYV9wbGF0Zm9ybV9kYXRhIC0gczVrNmFhIGRyaXZlciBwbGF0Zm9ybSBkYXRhCisgKiBAc2V0X3Bvd2VyOiAgIGFuIGFkZGl0aW9uYWwgY2FsbGJhY2sgdG8gdGhlIGJvYXJkIGNvZGUsIGNhbGxlZAorICogICAgICAgICAgICAgICBhZnRlciBlbmFibGluZyB0aGUgcmVndWxhdG9ycyBhbmQgYmVmb3JlIHN3aXRjaGluZworICogICAgICAgICAgICAgICB0aGUgc2Vuc29yIG9mZgorICogQG1jbGtfZnJlcXVlbmN5OiBzZW5zb3IncyBtYXN0ZXIgY2xvY2sgZnJlcXVlbmN5IGluIEh6CisgKiBAZ3Bpb19yZXNldDogIEdQSU8gZHJpdmluZyBSRVNFVCBwaW4KKyAqIEBncGlvX3N0Ynk6ICAgR1BJTyBkcml2aW5nIFNUQlkgcGluCisgKiBAbmxhbmVzOiAgICAgIG1heGltdW0gbnVtYmVyIG9mIE1JUEktQ1NJIGxhbmVzIHVzZWQKKyAqIEBob3Jpel9mbGlwOiAgZGVmYXVsdCBob3Jpem9udGFsIGltYWdlIGZsaXAgdmFsdWUsIG5vbiB6ZXJvIHRvIGVuYWJsZQorICogQHZlcnRfZmxpcDogICBkZWZhdWx0IHZlcnRpY2FsIGltYWdlIGZsaXAgdmFsdWUsIG5vbiB6ZXJvIHRvIGVuYWJsZQorICovCisKK3N0cnVjdCBzNWs2YWFfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqc2V0X3Bvd2VyKShpbnQgZW5hYmxlKTsKKwl1bnNpZ25lZCBsb25nIG1jbGtfZnJlcXVlbmN5OworCXN0cnVjdCBzNWs2YWFfZ3BpbyBncGlvX3Jlc2V0OworCXN0cnVjdCBzNWs2YWFfZ3BpbyBncGlvX3N0Ynk7CisJZW51bSB2NGwyX21idXNfdHlwZSBidXNfdHlwZTsKKwl1OCBubGFuZXM7CisJdTggaG9yaXpfZmxpcDsKKwl1OCB2ZXJ0X2ZsaXA7Cit9OworCisjZW5kaWYgLyogUzVLNkFBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvczVwX2ZpbWMuaCBiL2luY2x1ZGUvbWVkaWEvczVwX2ZpbWMuaAppbmRleCA5ZmRmZjhhNC4uNjg4ZmIzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zNXBfZmltYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvczVwX2ZpbWMuaApAQCAtMTksMTEgKzE5LDYgQEAKIAlGSU1DX0xDRF9XQiwgLyogRklGTyBsaW5rIGZyb20gTENEIG1peGVyICovCiB9OwogCi0jZGVmaW5lIEZJTUNfQ0xLX0lOVl9QQ0xLCSgxIDw8IDApCi0jZGVmaW5lIEZJTUNfQ0xLX0lOVl9WU1lOQwkoMSA8PCAxKQotI2RlZmluZSBGSU1DX0NMS19JTlZfSFJFRgkoMSA8PCAyKQotI2RlZmluZSBGSU1DX0NMS19JTlZfSFNZTkMJKDEgPDwgMykKLQogc3RydWN0IGkyY19ib2FyZF9pbmZvOwogCiAvKioKQEAgLTM2LDcgKzMxLDggQEAKICAqIEBjc2lfZGF0YV9hbGlnbjogTUlQSS1DU0kgaW50ZXJmYWNlIGRhdGEgYWxpZ25tZW50IGluIGJpdHMKICAqIEBpMmNfYnVzX251bTogaTJjIGNvbnRyb2wgYnVzIGlkIHRoZSBzZW5zb3IgaXMgYXR0YWNoZWQgdG8KICAqIEBtdXhfaWQ6IEZJTUMgY2FtZXJhIGludGVyZmFjZSBtdWx0aXBsZXhlciBpbmRleCAoc2VwYXJhdGUgZm9yIE1JUEkgYW5kIElUVSkKLSAqIEBmbGFnczogZmxhZ3MgZGVmaW5pbmcgYnVzIHNpZ25hbHMgcG9sYXJpdHkgaW52ZXJzaW9uIChIaWdoIGJ5IGRlZmF1bHQpCisgKiBAY2xrX2lkOiBpbmRleCBvZiB0aGUgU29DIHBlcmlwaGVyYWwgY2xvY2sgZm9yIHNlbnNvcnMKKyAqIEBmbGFnczogdGhlIHBhcmFsbGVsIGJ1cyBmbGFncyBkZWZpbmluZyBzaWduYWxzIHBvbGFyaXR5IChWNEwyX01CVVNfKikKICAqLwogc3RydWN0IHM1cF9maW1jX2lzcF9pbmZvIHsKIAlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmJvYXJkX2luZm87CkBAIC00Niw2ICs0Miw3IEBACiAJdTE2IGkyY19idXNfbnVtOwogCXUxNiBtdXhfaWQ7CiAJdTE2IGZsYWdzOworCXU4IGNsa19pZDsKIH07CiAKIC8qKgpAQCAtNTgsNCArNTUsMTMgQEAKIAlzdHJ1Y3QgczVwX2ZpbWNfaXNwX2luZm8gKmlzcF9pbmZvOwogCWludCBudW1fY2xpZW50czsKIH07CisKKy8qCisgKiB2NGwyX2RldmljZSBub3RpZmljYXRpb24gaWQuIFRoaXMgaXMgb25seSBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBrZXJuZWwuCisgKiBTZW5zb3Igc3ViZGV2cyBzaG91bGQgaXNzdWUgUzVQX0ZJTUNfVFhfRU5EX05PVElGWSBub3RpZmljYXRpb24gaW4gc2luZ2xlCisgKiBmcmFtZSBjYXB0dXJlIG1vZGUgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBWU1lOQyBwdWxzZSBpc3N1ZWQgYnkgdGhlIHNlbnNvcgorICogYXQgYmVnaW5pbmcgb2YgdGhlIGZyYW1lIHRyYW5zbWlzc2lvbi4KKyAqLworI2RlZmluZSBTNVBfRklNQ19UWF9FTkRfTk9USUZZIF9JTygnZScsIDApCisKICNlbmRpZiAvKiBTNVBfRklNQ19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAppbmRleCA3OTgyNzE0Li4wZjAzN2U4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX19TQUE3MTQ2X18KICNkZWZpbmUgX19TQUE3MTQ2X18KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBmb3IgbW9kdWxlLXZlcnNpb24gKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgZGVsYXktc3R1ZmYgKi8KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBmb3Iga21hbGxvYy9rZnJlZSAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIHBjaS1jb25maWctc3R1ZmYsIHZlbmRvciBpZHMgZXRjLiAqLwpAQCAtMjUsMjggKzI0LDM4IEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2FhNzE0Nl9kZWJ1ZzsKIAotLy8jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIigweCUwOHgpKDB4JTA4eCkgJXM6ICVzKCk6ICIsKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixSUFNfQUREUjApKSksKGRldj09MD8tMTooZGV2LT5tZW09PTA/LTE6c2FhNzE0Nl9yZWFkKGRldixJRVIpKSksS0JVSUxEX01PRE5BTUUsX19mdW5jX18pCi0KICNpZm5kZWYgREVCVUdfVkFSSUFCTEUKIAkjZGVmaW5lIERFQlVHX1ZBUklBQkxFIHNhYTcxNDZfZGVidWcKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHX1BST0xPRyBwcmludGsoIiVzOiAlcygpOiAiLEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXykKLSNkZWZpbmUgSU5GTyh4KSB7IHByaW50aygiJXM6ICIsS0JVSUxEX01PRE5BTUUpOyBwcmludGsgeDsgfQorI2RlZmluZSBFUlIoZm10LCAuLi4pCXByX2VycigiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKIAotI2RlZmluZSBFUlIoeCkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9CisjZGVmaW5lIF9EQkcobWFzaywgZm10LCAuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoREVCVUdfVkFSSUFCTEUgJiBtYXNrKQkJCQkJXAorCQlwcl9kZWJ1ZygiJXMoKTogIiBmbXQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKTsJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBERUJfUyh4KSAgICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MDEpKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogc2ltcGxlIGRlYnVnIG1lc3NhZ2VzICovCi0jZGVmaW5lIERFQl9EKHgpICAgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHgwMikpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBtb3JlIGRldGFpbGVkIGRlYnVnIG1lc3NhZ2VzICovCi0jZGVmaW5lIERFQl9FRSh4KSAgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHgwNCkpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBwcmludCBlbnRlciBhbmQgZXhpdCBvZiBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgREVCX0kyQyh4KSAgaWYgKDAhPShERUJVR19WQVJJQUJMRSYweDA4KSkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9IC8qIGkyYyBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBERUJfVkJJKHgpICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MTApKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogdmJpIGRlYnVnIG1lc3NhZ2VzICovCi0jZGVmaW5lIERFQl9JTlQoeCkgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHgyMCkpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBpbnRlcnJ1cHQgZGVidWcgbWVzc2FnZXMgKi8KLSNkZWZpbmUgREVCX0NBUCh4KSAgaWYgKDAhPShERUJVR19WQVJJQUJMRSYweDQwKSkgeyBERUJVR19QUk9MT0c7IHByaW50ayB4OyB9IC8qIGNhcHR1cmUgZGVidWcgbWVzc2FnZXMgKi8KKy8qIHNpbXBsZSBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBERUJfUyhmbXQsIC4uLikJCV9EQkcoMHgwMSwgZm10LCAjI19fVkFfQVJHU19fKQorLyogbW9yZSBkZXRhaWxlZCBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBERUJfRChmbXQsIC4uLikJCV9EQkcoMHgwMiwgZm10LCAjI19fVkFfQVJHU19fKQorLyogcHJpbnQgZW50ZXIgYW5kIGV4aXQgb2YgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQl9FRShmbXQsIC4uLikJX0RCRygweDA0LCBmbXQsICMjX19WQV9BUkdTX18pCisvKiBpMmMgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCX0kyQyhmbXQsIC4uLikJX0RCRygweDA4LCBmbXQsICMjX19WQV9BUkdTX18pCisvKiB2YmkgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCX1ZCSShmbXQsIC4uLikJX0RCRygweDEwLCBmbXQsICMjX19WQV9BUkdTX18pCisvKiBpbnRlcnJ1cHQgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCX0lOVChmbXQsIC4uLikJX0RCRygweDIwLCBmbXQsICMjX19WQV9BUkdTX18pCisvKiBjYXB0dXJlIGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQl9DQVAoZm10LCAuLi4pCV9EQkcoMHg0MCwgZm10LCAjI19fVkFfQVJHU19fKQogCiAjZGVmaW5lIFNBQTcxNDZfSVNSX0NMRUFSKHgseSkgXAogCXNhYTcxNDZfd3JpdGUoeCwgSVNSLCAoeSkpOwogCitzdHJ1Y3QgbW9kdWxlOworCiBzdHJ1Y3Qgc2FhNzE0Nl9kZXY7CiBzdHJ1Y3Qgc2FhNzE0Nl9leHRlbnNpb247CiBzdHJ1Y3Qgc2FhNzE0Nl92djsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKaW5kZXggNzU4Mjk1Mi4uYjEzNzdiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKQEAgLTEyLDEyICsxMiwxNCBAQAogI2lmbmRlZiBTT0NfQ0FNRVJBX0gKICNkZWZpbmUgU09DX0NBTUVSQV9ICiAKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtY29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKIHN0cnVjdCBmaWxlOwpAQCAtMzcsOCArMzksOCBAQAogCXVuc2lnbmVkIGNoYXIgaWZhY2U7CQkvKiBIb3N0IG51bWJlciAqLwogCXVuc2lnbmVkIGNoYXIgZGV2bnVtOwkJLyogRGV2aWNlIG51bWJlciBwZXIgaG9zdCAqLwogCXN0cnVjdCBzb2NfY2FtZXJhX3NlbnNlICpzZW5zZTsJLyogU2VlIGNvbW1lbnQgaW4gc3RydWN0IGRlZmluaXRpb24gKi8KLQlzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgKm9wczsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsX2hhbmRsZXI7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICpjdXJyZW50X2ZtdDsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnVzZXJfZm9ybWF0czsKIAlpbnQgbnVtX3VzZXJfZm9ybWF0czsKQEAgLTkzLDE0ICs5NSwxMCBAQAogCWludCAoKnJlcWJ1ZnMpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqKTsKIAlpbnQgKCpxdWVyeWNhcCkoc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICopOwogCWludCAoKnNldF9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBfX3UzMik7Ci0JaW50ICgqZ2V0X2N0cmwpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9jb250cm9sICopOwotCWludCAoKnNldF9jdHJsKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfY29udHJvbCAqKTsKIAlpbnQgKCpnZXRfcGFybSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKik7CiAJaW50ICgqc2V0X3Bhcm0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICopOwogCWludCAoKmVudW1fZnNpemVzKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKik7CiAJdW5zaWduZWQgaW50ICgqcG9sbCkoc3RydWN0IGZpbGUgKiwgcG9sbF90YWJsZSAqKTsKLQljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmNvbnRyb2xzOwotCWludCBudW1fY29udHJvbHM7CiB9OwogCiAjZGVmaW5lIFNPQ0FNX1NFTlNPUl9JTlZFUlRfUENMSwkoMSA8PCAwKQpAQCAtMTkzLDEzICsxOTEsNiBAQAogCWNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCAqaG9zdF9mbXQ7CiB9OwogCi1zdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgewotCXVuc2lnbmVkIGxvbmcgKCpxdWVyeV9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKLQlpbnQgKCpzZXRfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7Ci0JY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjb250cm9sczsKLQlpbnQgbnVtX2NvbnRyb2xzOwotfTsKLQogI2RlZmluZSBTT0NBTV9TRU5TRV9QQ0xLX0NIQU5HRUQJKDEgPDwgMCkKIAogLyoqCkBAIC0yMjYsNjUgKzIxNywxOCBAQAogCXVuc2lnbmVkIGxvbmcgcGl4ZWxfY2xvY2s7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBjb25zdCAqc29jX2NhbWVyYV9maW5kX3FjdHJsKAotCXN0cnVjdCBzb2NfY2FtZXJhX29wcyAqb3BzLCBpbnQgaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3BzLT5udW1fY29udHJvbHM7IGkrKykKLQkJaWYgKG9wcy0+Y29udHJvbHNbaV0uaWQgPT0gaWQpCi0JCQlyZXR1cm4gJm9wcy0+Y29udHJvbHNbaV07Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBTT0NBTV9NQVNURVIJCQkoMSA8PCAwKQotI2RlZmluZSBTT0NBTV9TTEFWRQkJCSgxIDw8IDEpCi0jZGVmaW5lIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdICQkoMSA8PCAyKQotI2RlZmluZSBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XCQkoMSA8PCAzKQotI2RlZmluZSBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSAkJKDEgPDwgNCkKLSNkZWZpbmUgU09DQU1fVlNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgNSkKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzQJCSgxIDw8IDYpCi0jZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF84CQkoMSA8PCA3KQotI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfOQkJKDEgPDwgOCkKLSNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzEwCQkoMSA8PCA5KQotI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTUJCSgxIDw8IDEwKQotI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTYJCSgxIDw8IDExKQotI2RlZmluZSBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcJKDEgPDwgMTIpCi0jZGVmaW5lIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcJKDEgPDwgMTMpCi0jZGVmaW5lIFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0gJCSgxIDw8IDE0KQotI2RlZmluZSBTT0NBTV9EQVRBX0FDVElWRV9MT1cJCSgxIDw8IDE1KQotI2RlZmluZSBTT0NBTV9NSVBJXzFMQU5FCQkoMSA8PCAxNikKLSNkZWZpbmUgU09DQU1fTUlQSV8yTEFORQkJKDEgPDwgMTcpCi0jZGVmaW5lIFNPQ0FNX01JUElfM0xBTkUJCSgxIDw8IDE4KQotI2RlZmluZSBTT0NBTV9NSVBJXzRMQU5FCQkoMSA8PCAxOSkKLSNkZWZpbmUgU09DQU1fTUlQSQkoU09DQU1fTUlQSV8xTEFORSB8IFNPQ0FNX01JUElfMkxBTkUgfCBcCi0JCQlTT0NBTV9NSVBJXzNMQU5FIHwgU09DQU1fTUlQSV80TEFORSkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIKHgpCUJJVCgoeCkgLSAxKQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfNAlTT0NBTV9EQVRBV0lEVEgoNCkKKyNkZWZpbmUgU09DQU1fREFUQVdJRFRIXzgJU09DQU1fREFUQVdJRFRIKDgpCisjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF85CVNPQ0FNX0RBVEFXSURUSCg5KQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTAJU09DQU1fREFUQVdJRFRIKDEwKQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTUJU09DQU1fREFUQVdJRFRIKDE1KQorI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfMTYJU09DQU1fREFUQVdJRFRIKDE2KQogCiAjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF9NQVNLIChTT0NBTV9EQVRBV0lEVEhfNCB8IFNPQ0FNX0RBVEFXSURUSF84IHwgXAogCQkJICAgICAgU09DQU1fREFUQVdJRFRIXzkgfCBTT0NBTV9EQVRBV0lEVEhfMTAgfCBcCiAJCQkgICAgICBTT0NBTV9EQVRBV0lEVEhfMTUgfCBTT0NBTV9EQVRBV0lEVEhfMTYpCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKAotCQkJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgY29tbW9uX2ZsYWdzLCBoc3luYywgdnN5bmMsIHBjbGssIGRhdGEsIGJ1c3dpZHRoLCBtb2RlOwotCXVuc2lnbmVkIGxvbmcgbWlwaTsKLQotCWNvbW1vbl9mbGFncyA9IGNhbWVyYV9mbGFncyAmIGJ1c19mbGFnczsKLQotCWhzeW5jID0gY29tbW9uX2ZsYWdzICYgKFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwgU09DQU1fSFNZTkNfQUNUSVZFX0xPVyk7Ci0JdnN5bmMgPSBjb21tb25fZmxhZ3MgJiAoU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfCBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKTsKLQlwY2xrID0gY29tbW9uX2ZsYWdzICYgKFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8IFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpOwotCWRhdGEgPSBjb21tb25fZmxhZ3MgJiAoU09DQU1fREFUQV9BQ1RJVkVfSElHSCB8IFNPQ0FNX0RBVEFfQUNUSVZFX0xPVyk7Ci0JbW9kZSA9IGNvbW1vbl9mbGFncyAmIChTT0NBTV9NQVNURVIgfCBTT0NBTV9TTEFWRSk7Ci0JYnVzd2lkdGggPSBjb21tb25fZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSzsKLQltaXBpID0gY29tbW9uX2ZsYWdzICYgU09DQU1fTUlQSTsKLQotCXJldHVybiAoKCFoc3luYyB8fCAhdnN5bmMgfHwgIXBjbGsgfHwgIWRhdGEgfHwgIW1vZGUgfHwgIWJ1c3dpZHRoKSAmJiAhbWlwaSkgPyAwIDoKLQkJY29tbW9uX2ZsYWdzOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc29jX2NhbWVyYV9saW1pdF9zaWRlKGludCAqc3RhcnQsIGludCAqbGVuZ3RoLAogCQl1bnNpZ25lZCBpbnQgc3RhcnRfbWluLAogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoX21pbiwgdW5zaWduZWQgaW50IGxlbmd0aF9tYXgpCkBAIC0zMDAsMjMgKzI0NCwzNyBAQAogCQkqc3RhcnQgPSBzdGFydF9taW4gKyBsZW5ndGhfbWF4IC0gKmxlbmd0aDsKIH0KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3Moc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyBzb2NfY2FtZXJhX2FwcGx5X2JvYXJkX2ZsYWdzKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZyk7CiAKIC8qIFRoaXMgaXMgb25seSB0ZW1wb3JhcnkgaGVyZSAtIHVudGlsIHY0bDItc3ViZGV2IGJlZ2lucyB0byBsaW5rIHRvIHZpZGVvX2RldmljZSAqLwogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlkZW9fZGV2aWNlICpzb2NfY2FtZXJhX2kyY190b192ZGV2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2aWRlb19kZXZpY2UgKnNvY19jYW1lcmFfaTJjX3RvX3ZkZXYoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcmV0dXJuIGljZC0+dmRldjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopc2QtPmdycF9pZDsKKwlyZXR1cm4gaWNkID8gaWNkLT52ZGV2IDogTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnNvY19jYW1lcmFfZnJvbV92YjJxKHN0cnVjdCB2YjJfcXVldWUgKnZxKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICpzb2NfY2FtZXJhX2kyY190b19saW5rKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHY0bDJfc3ViZGV2ICpzb2NfY2FtZXJhX3ZkZXZfdG9fc3ViZGV2KGNvbnN0IHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+cGFyZW50KTsKKwlyZXR1cm4gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnNvY19jYW1lcmFfZnJvbV92YjJxKGNvbnN0IHN0cnVjdCB2YjJfcXVldWUgKnZxKQogewogCXJldHVybiBjb250YWluZXJfb2YodnEsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqc29jX2NhbWVyYV9mcm9tX3ZicShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnNvY19jYW1lcmFfZnJvbV92YnEoY29uc3Qgc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKHZxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiX3ZpZHEpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmggYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaAppbmRleCA3NGYwZmExLi44YWE0MjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KIAogc3RydWN0IGRldmljZTsKIApAQCAtMjAsNyArMjEsOCBAQAogCWNvbnN0IGNoYXIgKmZvcm1hdF9uYW1lOwogCXVuc2lnbmVkIGxvbmcgZm9ybWF0X2RlcHRoOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OwotCXVuc2lnbmVkIGxvbmcgYnVzX3BhcmFtOworCXVuc2lnbmVkIGxvbmcgbWJ1c19wYXJhbTsKKwllbnVtIHY0bDJfbWJ1c190eXBlIG1idXNfdHlwZTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZDsKIAlpbnQgKCpzZXRfY2FwdHVyZSkoc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqaW5mbywgaW50IGVuYWJsZSk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfbWVkaWFidXMuaCBiL2luY2x1ZGUvbWVkaWEvc29jX21lZGlhYnVzLmgKaW5kZXggZmFlNDMyNS4uNzNmMWU3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfbWVkaWFidXMuaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19tZWRpYWJ1cy5oCkBAIC04Miw1ICs4Miw3IEBACiBzMzIgc29jX21idXNfYnl0ZXNfcGVyX2xpbmUodTMyIHdpZHRoLCBjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKm1mKTsKIGludCBzb2NfbWJ1c19zYW1wbGVzX3Blcl9waXhlbChjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKm1mLAogCQkJdW5zaWduZWQgaW50ICpudW1lcmF0b3IsIHVuc2lnbmVkIGludCAqZGVub21pbmF0b3IpOwordW5zaWduZWQgaW50IHNvY19tYnVzX2NvbmZpZ19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcsCisJCQkJCXVuc2lnbmVkIGludCBmbGFncyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKaW5kZXggNjNmZDlkMy4uODEwYTIwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCkBAIC0yMTIsOSArMjEyLDYgQEAKIAkvKiBtb2R1bGUgc245YzIweDoganVzdCBpZGVudCAxMDAwMCAqLwogCVY0TDJfSURFTlRfU045QzIwWCA9IDEwMDAwLAogCi0JLyogU2lsaWNvbmZpbGUgc2Vuc29yczogcmVzZXJ2ZWQgcmFuZ2UgMTAxMDAgLSAxMDE5OSAqLwotCVY0TDJfSURFTlRfTk9PTjAxMFBDMzAJPSAxMDEwMCwKLQogCS8qIG1vZHVsZSBjeDIzMXh4IGFuZCBjeDI1ODQwICovCiAJVjRMMl9JREVOVF9DWDIzMTBYX0FWID0gMjMwOTksIC8qIEludGVncmF0ZWQgQS9WIGRlY29kZXI7IG5vdCBpbiAnMTAwICovCiAJVjRMMl9JREVOVF9DWDIzMTAwICAgID0gMjMxMDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCmluZGV4IDEzZmU0ZDcuLmVlYjNkZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCkBAIC02NSwxNCArNjUsMTIgQEAKICAgKiBAaXNfcHJpdmF0ZTogSWYgc2V0LCB0aGVuIHRoaXMgY29udHJvbCBpcyBwcml2YXRlIHRvIGl0cyBoYW5kbGVyIGFuZCBpdAogICAqCQl3aWxsIG5vdCBiZSBhZGRlZCB0byBhbnkgb3RoZXIgaGFuZGxlcnMuIERyaXZlcnMgY2FuIHNldAogICAqCQl0aGlzIGZsYWcuCi0gICogQGlzX3ZvbGF0aWxlOiBJZiBzZXQsIHRoZW4gdGhpcyBjb250cm9sIGlzIHZvbGF0aWxlLiBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICoJCWNvbnRyb2wncyBjdXJyZW50IHZhbHVlIGNhbm5vdCBiZSBjYWNoZWQgYW5kIG5lZWRzIHRvIGJlCi0gICoJCXJldHJpZXZlZCB0aHJvdWdoIHRoZSBnX3ZvbGF0aWxlX2N0cmwgb3AuIERyaXZlcnMgY2FuIHNldAotICAqCQl0aGlzIGZsYWcuCiAgICogQGlzX2F1dG86ICAgSWYgc2V0LCB0aGVuIHRoaXMgY29udHJvbCBzZWxlY3RzIHdoZXRoZXIgdGhlIG90aGVyIGNsdXN0ZXIKICAgKgkJbWVtYmVycyBhcmUgaW4gJ2F1dG9tYXRpYycgbW9kZSBvciAnbWFudWFsJyBtb2RlLiBUaGlzIGlzCiAgICoJCXVzZWQgZm9yIGF1dG9nYWluL2dhaW4gdHlwZSBjbHVzdGVycy4gRHJpdmVycyBzaG91bGQgbmV2ZXIKICAgKgkJc2V0IHRoaXMgZmxhZyBkaXJlY3RseS4KKyAgKiBAaGFzX3ZvbGF0aWxlczogSWYgc2V0LCB0aGVuIG9uZSBvciBtb3JlIG1lbWJlcnMgb2YgdGhlIGNsdXN0ZXIgYXJlIHZvbGF0aWxlLgorICAqCQlEcml2ZXJzIHNob3VsZCBuZXZlciB0b3VjaCB0aGlzIGZsYWcuCiAgICogQG1hbnVhbF9tb2RlX3ZhbHVlOiBJZiB0aGUgaXNfYXV0byBmbGFnIGlzIHNldCwgdGhlbiB0aGlzIGlzIHRoZSB2YWx1ZQogICAqCQlvZiB0aGUgYXV0byBjb250cm9sIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGF0IGNvbnRyb2wgaXMgaW4KICAgKgkJbWFudWFsIG1vZGUuIFNvIGlmIHRoZSB2YWx1ZSBvZiB0aGUgYXV0byBjb250cm9sIGVxdWFscyB0aGlzCkBAIC0xMTgsOCArMTE2LDggQEAKIAogCXVuc2lnbmVkIGludCBpc19uZXc6MTsKIAl1bnNpZ25lZCBpbnQgaXNfcHJpdmF0ZToxOwotCXVuc2lnbmVkIGludCBpc192b2xhdGlsZToxOwogCXVuc2lnbmVkIGludCBpc19hdXRvOjE7CisJdW5zaWduZWQgaW50IGhhc192b2xhdGlsZXM6MTsKIAl1bnNpZ25lZCBpbnQgbWFudWFsX21vZGVfdmFsdWU6ODsKIAogCWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzICpvcHM7CkBAIC0yMDgsOSArMjA2LDYgQEAKICAgKgkJbXVzdCBiZSBOVUxMLgogICAqIEBpc19wcml2YXRlOiBJZiBzZXQsIHRoZW4gdGhpcyBjb250cm9sIGlzIHByaXZhdGUgdG8gaXRzIGhhbmRsZXIgYW5kIGl0CiAgICoJCXdpbGwgbm90IGJlIGFkZGVkIHRvIGFueSBvdGhlciBoYW5kbGVycy4KLSAgKiBAaXNfdm9sYXRpbGU6IElmIHNldCwgdGhlbiB0aGlzIGNvbnRyb2wgaXMgdm9sYXRpbGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgKgkJY29udHJvbCdzIGN1cnJlbnQgdmFsdWUgY2Fubm90IGJlIGNhY2hlZCBhbmQgbmVlZHMgdG8gYmUKLSAgKgkJcmV0cmlldmVkIHRocm91Z2ggdGhlIGdfdm9sYXRpbGVfY3RybCBvcC4KICAgKi8KIHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHsKIAljb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyAqb3BzOwpAQCAtMjI1LDcgKzIyMCw2IEBACiAJdTMyIG1lbnVfc2tpcF9tYXNrOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqcW1lbnU7CiAJdW5zaWduZWQgaW50IGlzX3ByaXZhdGU6MTsKLQl1bnNpZ25lZCBpbnQgaXNfdm9sYXRpbGU6MTsKIH07CiAKIC8qKiB2NGwyX2N0cmxfZmlsbCgpIC0gRmlsbCBpbiB0aGUgY29udHJvbCBmaWVsZHMgYmFzZWQgb24gdGhlIGNvbnRyb2wgSUQuCkBAIC0zODksOCArMzgzLDcgQEAKICAgKiBAbWFudWFsX3ZhbDogVGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgY2x1c3RlciB0aGF0IGVxdWFscyB0aGUKICAgKgkJbWFudWFsIHNldHRpbmcuCiAgICogQHNldF92b2xhdGlsZTogSWYgdHJ1ZSwgdGhlbiBhbGwgY29udHJvbHMgZXhjZXB0IHRoZSBmaXJzdCBhdXRvIGNvbnRyb2wgd2lsbAotICAqCQloYXZlIGlzX3ZvbGF0aWxlIHNldCB0byB0cnVlLiBJZiBmYWxzZSwgdGhlbiBpc192b2xhdGlsZSB3aWxsIG5vdAotICAqCQliZSB0b3VjaGVkLgorICAqCQliZSB2b2xhdGlsZS4KICAgKgogICAqIFVzZSBmb3IgY29udHJvbCBncm91cHMgd2hlcmUgb25lIGNvbnRyb2wgc2VsZWN0cyBzb21lIGF1dG9tYXRpYyBmZWF0dXJlIGFuZAogICAqIHRoZSBvdGhlciBjb250cm9scyBhcmUgb25seSBhY3RpdmUgd2hlbmV2ZXIgdGhlIGF1dG9tYXRpYyBmZWF0dXJlIGlzIHR1cm5lZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWludC1kZXZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1pbnQtZGV2aWNlLmgKaW5kZXggZmJmNTg1NS4uZTZhYTIzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWludC1kZXZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItaW50LWRldmljZS5oCkBAIC0yNSw3ICsyNSw2IEBACiAjaWZuZGVmIFY0TDJfSU5UX0RFVklDRV9ICiAjZGVmaW5lIFY0TDJfSU5UX0RFVklDRV9ICiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjZGVmaW5lIFY0TDJOQU1FU0laRSAzMgpAQCAtNDEsNiArNDAsOCBAQAogCXY0bDJfaW50X3R5cGVfc2xhdmUKIH07CiAKK3N0cnVjdCBtb2R1bGU7CisKIHN0cnVjdCB2NGwyX2ludF9kZXZpY2U7CiAKIHN0cnVjdCB2NGwyX2ludF9tYXN0ZXIgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWlvY3RsLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAppbmRleCBkZDlmMWU3Li40ZDFjNzRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItaW9jdGwuaApAQCAtMTIyLDYgKzEyMiw4IEBACiAJaW50ICgqdmlkaW9jX3FidWYpICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CiAJaW50ICgqdmlkaW9jX2RxYnVmKSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CiAKKwlpbnQgKCp2aWRpb2NfY3JlYXRlX2J1ZnMpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgKmIpOworCWludCAoKnZpZGlvY19wcmVwYXJlX2J1Zikoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmIpOwogCiAJaW50ICgqdmlkaW9jX292ZXJsYXkpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpKTsKIAlpbnQgKCp2aWRpb2NfZ19mYnVmKSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCmluZGV4IDYxMTQwMDcuLjgzYWUwN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCkBAIC0yMiw4ICsyMiwxMiBAQAogICovCiAjZGVmaW5lIFY0TDJfTUJVU19NQVNURVIJCQkoMSA8PCAwKQogI2RlZmluZSBWNEwyX01CVVNfU0xBVkUJCQkJKDEgPDwgMSkKLS8qIFdoaWNoIHNpZ25hbCBwb2xhcml0aWVzIGl0IHN1cHBvcnRzICovCi0vKiBOb3RlOiBpbiBCVC42NTYgbW9kZSBIU1lOQyBhbmQgVlNZTkMgYXJlIHVudXNlZCAqLworLyoKKyAqIFNpZ25hbCBwb2xhcml0eSBmbGFncworICogTm90ZTogaW4gQlQuNjU2IG1vZGUgSFNZTkMsIEZJRUxELCBhbmQgVlNZTkMgYXJlIHVudXNlZAorICogVjRMMl9NQlVTX1tIVl1TWU5DKiBmbGFncyBzaG91bGQgYmUgYWxzbyB1c2VkIGZvciBzcGVjaWZ5aW5nCisgKiBjb25maWd1cmF0aW9uIG9mIGhhcmR3YXJlIHRoYXQgdXNlcyBbSFZdUkVGIHNpZ25hbHMKKyAqLwogI2RlZmluZSBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gJCSgxIDw8IDIpCiAjZGVmaW5lIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XCQkoMSA8PCAzKQogI2RlZmluZSBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gJCSgxIDw8IDQpCkBAIC0zMiw2ICszNiwxMCBAQAogI2RlZmluZSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORwkJKDEgPDwgNykKICNkZWZpbmUgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gJCSgxIDw8IDgpCiAjZGVmaW5lIFY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1cJCSgxIDw8IDkpCisvKiBGSUVMRCA9IDAvMSAtIEZpZWxkMSAob2RkKS9GaWVsZDIgKGV2ZW4pICovCisjZGVmaW5lIFY0TDJfTUJVU19GSUVMRF9FVkVOX0hJR0gJCSgxIDw8IDEwKQorLyogRklFTEQgPSAxLzAgLSBGaWVsZDEgKG9kZCkvRmllbGQyIChldmVuKSAqLworI2RlZmluZSBWNEwyX01CVVNfRklFTERfRVZFTl9MT1cJCSgxIDw8IDExKQogCiAvKiBTZXJpYWwgZmxhZ3MgKi8KIC8qIEhvdyBtYW55IGxhbmVzIHRoZSBjbGllbnQgY2FuIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCmluZGV4IDI1N2RhMWEuLmYwZjMzNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKQEAgLTE1OCw2ICsxNTgsNyBAQAogCWludCAoKnNfZXh0X2N0cmxzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmN0cmxzKTsKIAlpbnQgKCp0cnlfZXh0X2N0cmxzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmN0cmxzKTsKIAlpbnQgKCpxdWVyeW1lbnUpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW0pOworCWludCAoKmdfc3RkKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqbm9ybSk7CiAJaW50ICgqc19zdGQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIG5vcm0pOwogCWxvbmcgKCppb2N0bCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCkBAIC01MzQsMTMgKzUzNSwxMyBAQAogCXZvaWQgKmRldl9wcml2OwogCXZvaWQgKmhvc3RfcHJpdjsKIAkvKiBzdWJkZXYgZGV2aWNlIG5vZGUgKi8KLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlIGRldm5vZGU7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2bm9kZTsKIH07CiAKICNkZWZpbmUgbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KGVudCkgXAogCWNvbnRhaW5lcl9vZihlbnQsIHN0cnVjdCB2NGwyX3N1YmRldiwgZW50aXR5KQogI2RlZmluZSB2ZGV2X3RvX3Y0bDJfc3ViZGV2KHZkZXYpIFwKLQljb250YWluZXJfb2YodmRldiwgc3RydWN0IHY0bDJfc3ViZGV2LCBkZXZub2RlKQorCXZpZGVvX2dldF9kcnZkYXRhKHZkZXYpCiAKIC8qCiAgKiBVc2VkIGZvciBzdG9yaW5nIHN1YmRldiBpbmZvcm1hdGlvbiBwZXIgZmlsZSBoYW5kbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaCBiL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWNvcmUuaAppbmRleCBmODc0NzJhLi5hMTVkMWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1jb3JlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItY29yZS5oCkBAIC03NSw3ICs3NSw2IEBACiAKIHN0cnVjdCB2YjJfcGxhbmUgewogCXZvaWQJCQkqbWVtX3ByaXY7Ci0JaW50CQkJbWFwcGVkOjE7CiB9OwogCiAvKioKQEAgLTEwNiw2ICsxMDUsNyBAQAogLyoqCiAgKiBlbnVtIHZiMl9idWZmZXJfc3RhdGUgLSBjdXJyZW50IHZpZGVvIGJ1ZmZlciBzdGF0ZQogICogQFZCMl9CVUZfU1RBVEVfREVRVUVVRUQ6CWJ1ZmZlciB1bmRlciB1c2Vyc3BhY2UgY29udHJvbAorICogQFZCMl9CVUZfU1RBVEVfUFJFUEFSRUQ6CWJ1ZmZlciBwcmVwYXJlZCBpbiB2aWRlb2J1ZiBhbmQgYnkgdGhlIGRyaXZlcgogICogQFZCMl9CVUZfU1RBVEVfUVVFVUVEOglidWZmZXIgcXVldWVkIGluIHZpZGVvYnVmLCBidXQgbm90IGluIGRyaXZlcgogICogQFZCMl9CVUZfU1RBVEVfQUNUSVZFOglidWZmZXIgcXVldWVkIGluIGRyaXZlciBhbmQgcG9zc2libHkgdXNlZAogICoJCQkJaW4gYSBoYXJkd2FyZSBvcGVyYXRpb24KQEAgLTExNyw2ICsxMTcsNyBAQAogICovCiBlbnVtIHZiMl9idWZmZXJfc3RhdGUgewogCVZCMl9CVUZfU1RBVEVfREVRVUVVRUQsCisJVkIyX0JVRl9TVEFURV9QUkVQQVJFRCwKIAlWQjJfQlVGX1NUQVRFX1FVRVVFRCwKIAlWQjJfQlVGX1NUQVRFX0FDVElWRSwKIAlWQjJfQlVGX1NUQVRFX0RPTkUsCkBAIC0xNDcsNyArMTQ4LDYgQEAKICAqIEBkb25lX2VudHJ5OgkJZW50cnkgb24gdGhlIGxpc3QgdGhhdCBzdG9yZXMgYWxsIGJ1ZmZlcnMgcmVhZHkgdG8KICAqCQkJYmUgZGVxdWV1ZWQgdG8gdXNlcnNwYWNlCiAgKiBAcGxhbmVzOgkJcHJpdmF0ZSBwZXItcGxhbmUgaW5mb3JtYXRpb247IGRvIG5vdCBjaGFuZ2UKLSAqIEBudW1fcGxhbmVzX21hcHBlZDoJbnVtYmVyIG9mIG1hcHBlZCBwbGFuZXM7IGRvIG5vdCBjaGFuZ2UKICAqLwogc3RydWN0IHZiMl9idWZmZXIgewogCXN0cnVjdCB2NGwyX2J1ZmZlcgl2NGwyX2J1ZjsKQEAgLTE2NCwxOSArMTY0LDI2IEBACiAJc3RydWN0IGxpc3RfaGVhZAlkb25lX2VudHJ5OwogCiAJc3RydWN0IHZiMl9wbGFuZQlwbGFuZXNbVklERU9fTUFYX1BMQU5FU107Ci0JdW5zaWduZWQgaW50CQludW1fcGxhbmVzX21hcHBlZDsKIH07CiAKIC8qKgogICogc3RydWN0IHZiMl9vcHMgLSBkcml2ZXItc3BlY2lmaWMgY2FsbGJhY2tzCiAgKgotICogQHF1ZXVlX3NldHVwOgljYWxsZWQgZnJvbSBhIFZJRElPQ19SRVFCVUZTIGhhbmRsZXIsIGJlZm9yZQotICoJCQltZW1vcnkgYWxsb2NhdGlvbjsgZHJpdmVyIHNob3VsZCByZXR1cm4gdGhlIHJlcXVpcmVkCi0gKgkJCW51bWJlciBvZiBidWZmZXJzIGluIG51bV9idWZmZXJzLCB0aGUgcmVxdWlyZWQgbnVtYmVyCi0gKgkJCW9mIHBsYW5lcyBwZXIgYnVmZmVyIGluIG51bV9wbGFuZXM7IHRoZSBzaXplIG9mIGVhY2gKLSAqCQkJcGxhbmUgc2hvdWxkIGJlIHNldCBpbiB0aGUgc2l6ZXNbXSBhcnJheSBhbmQgb3B0aW9uYWwKLSAqCQkJcGVyLXBsYW5lIGFsbG9jYXRvciBzcGVjaWZpYyBjb250ZXh0IGluIGFsbG9jX2N0eHNbXQotICoJCQlhcnJheQorICogQHF1ZXVlX3NldHVwOgljYWxsZWQgZnJvbSBWSURJT0NfUkVRQlVGUyBhbmQgVklESU9DX0NSRUFURV9CVUZTCisgKgkJCWhhbmRsZXJzIGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiwgb3IsIGlmCisgKgkJCSpudW1fcGxhbmVzICE9IDAsIGFmdGVyIHRoZSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBhCisgKgkJCXNtYWxsZXIgbnVtYmVyIG9mIGJ1ZmZlcnMuIERyaXZlciBzaG91bGQgcmV0dXJuCisgKgkJCXRoZSByZXF1aXJlZCBudW1iZXIgb2YgYnVmZmVycyBpbiAqbnVtX2J1ZmZlcnMsIHRoZQorICoJCQlyZXF1aXJlZCBudW1iZXIgb2YgcGxhbmVzIHBlciBidWZmZXIgaW4gKm51bV9wbGFuZXM7IHRoZQorICoJCQlzaXplIG9mIGVhY2ggcGxhbmUgc2hvdWxkIGJlIHNldCBpbiB0aGUgc2l6ZXNbXSBhcnJheQorICoJCQlhbmQgb3B0aW9uYWwgcGVyLXBsYW5lIGFsbG9jYXRvciBzcGVjaWZpYyBjb250ZXh0IGluIHRoZQorICoJCQlhbGxvY19jdHhzW10gYXJyYXkuIFdoZW4gY2FsbGVkIGZyb20gVklESU9DX1JFUUJVRlMsCisgKgkJCWZtdCA9PSBOVUxMLCB0aGUgZHJpdmVyIGhhcyB0byB1c2UgdGhlIGN1cnJlbnRseQorICoJCQljb25maWd1cmVkIGZvcm1hdCBhbmQgKm51bV9idWZmZXJzIGlzIHRoZSB0b3RhbCBudW1iZXIKKyAqCQkJb2YgYnVmZmVycywgdGhhdCBhcmUgYmVpbmcgYWxsb2NhdGVkLiBXaGVuIGNhbGxlZCBmcm9tCisgKgkJCVZJRElPQ19DUkVBVEVfQlVGUywgZm10ICE9IE5VTEwgYW5kIGl0IGRlc2NyaWJlcyB0aGUKKyAqCQkJdGFyZ2V0IGZyYW1lIGZvcm1hdC4gSW4gdGhpcyBjYXNlICpudW1fYnVmZmVycyBhcmUgYmVpbmcKKyAqCQkJYWxsb2NhdGVkIGFkZGl0aW9uYWxseSB0byBxLT5udW1fYnVmZmVycy4KICAqIEB3YWl0X3ByZXBhcmU6CXJlbGVhc2UgYW55IGxvY2tzIHRha2VuIHdoaWxlIGNhbGxpbmcgdmIyIGZ1bmN0aW9uczsKICAqCQkJaXQgaXMgY2FsbGVkIGJlZm9yZSBhbiBpb2N0bCBuZWVkcyB0byB3YWl0IGZvciBhIG5ldwogICoJCQlidWZmZXIgdG8gYXJyaXZlOyByZXF1aXJlZCB0byBhdm9pZCBhIGRlYWRsb2NrIGluCkBAIC0xODksMzAgKzE5NiwzOSBAQAogICoJCQlwZXJmb3JtIGFkZGl0aW9uYWwgYnVmZmVyLXJlbGF0ZWQgaW5pdGlhbGl6YXRpb247CiAgKgkJCWluaXRpYWxpemF0aW9uIGZhaWx1cmUgKHJldHVybiAhPSAwKSB3aWxsIHByZXZlbnQKICAqCQkJcXVldWUgc2V0dXAgZnJvbSBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseTsgb3B0aW9uYWwKLSAqIEBidWZfcHJlcGFyZToJY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGJ1ZmZlciBpcyBxdWV1ZWQgZnJvbSB1c2Vyc3BhY2U7Ci0gKgkJCWRyaXZlcnMgbWF5IHBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJlZm9yZQotICoJCQllYWNoIGhhcmR3YXJlIG9wZXJhdGlvbiBpbiB0aGlzIGNhbGxiYWNrOwotICoJCQlpZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBxdWV1ZWQKLSAqCQkJaW4gZHJpdmVyOyBvcHRpb25hbAorICogQGJ1Zl9wcmVwYXJlOgljYWxsZWQgZXZlcnkgdGltZSB0aGUgYnVmZmVyIGlzIHF1ZXVlZCBmcm9tIHVzZXJzcGFjZQorICoJCQlhbmQgZnJvbSB0aGUgVklESU9DX1BSRVBBUkVfQlVGIGlvY3RsOyBkcml2ZXJzIG1heQorICoJCQlwZXJmb3JtIGFueSBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUgZWFjaCBoYXJkd2FyZQorICoJCQlvcGVyYXRpb24gaW4gdGhpcyBjYWxsYmFjazsgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRoZQorICoJCQlidWZmZXIgd2lsbCBub3QgYmUgcXVldWVkIGluIGRyaXZlcjsgb3B0aW9uYWwKICAqIEBidWZfZmluaXNoOgkJY2FsbGVkIGJlZm9yZSBldmVyeSBkZXF1ZXVlIG9mIHRoZSBidWZmZXIgYmFjayB0bwogICoJCQl1c2Vyc3BhY2U7IGRyaXZlcnMgbWF5IHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgcmVxdWlyZWQKICAqCQkJYmVmb3JlIHVzZXJzcGFjZSBhY2Nlc3NlcyB0aGUgYnVmZmVyOyBvcHRpb25hbAogICogQGJ1Zl9jbGVhbnVwOgljYWxsZWQgb25jZSBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBmcmVlZDsgZHJpdmVycyBtYXkKICAqCQkJcGVyZm9ybSBhbnkgYWRkaXRpb25hbCBjbGVhbnVwOyBvcHRpb25hbAotICogQHN0YXJ0X3N0cmVhbWluZzoJY2FsbGVkIG9uY2UgYmVmb3JlIGVudGVyaW5nICdzdHJlYW1pbmcnIHN0YXRlOyBlbmFibGVzCi0gKgkJCWRyaXZlciB0byByZWNlaXZlIGJ1ZmZlcnMgb3ZlciBidWZfcXVldWUoKSBjYWxsYmFjaworICogQHN0YXJ0X3N0cmVhbWluZzoJY2FsbGVkIG9uY2UgdG8gZW50ZXIgJ3N0cmVhbWluZycgc3RhdGU7IHRoZSBkcml2ZXIgbWF5CisgKgkJCXJlY2VpdmUgYnVmZmVycyB3aXRoIEBidWZfcXVldWUgY2FsbGJhY2sgYmVmb3JlCisgKgkJCUBzdGFydF9zdHJlYW1pbmcgaXMgY2FsbGVkOyB0aGUgZHJpdmVyIGdldHMgdGhlIG51bWJlcgorICoJCQlvZiBhbHJlYWR5IHF1ZXVlZCBidWZmZXJzIGluIGNvdW50IHBhcmFtZXRlcjsgZHJpdmVyCisgKgkJCWNhbiByZXR1cm4gYW4gZXJyb3IgaWYgaGFyZHdhcmUgZmFpbHMgb3Igbm90IGVub3VnaAorICoJCQlidWZmZXJzIGhhcyBiZWVuIHF1ZXVlZCwgaW4gc3VjaCBjYXNlIGFsbCBidWZmZXJzIHRoYXQKKyAqCQkJaGF2ZSBiZWVuIGFscmVhZHkgZ2l2ZW4gYnkgdGhlIEBidWZfcXVldWUgY2FsbGJhY2sgYXJlCisgKgkJCWludmFsaWRhdGVkLgogICogQHN0b3Bfc3RyZWFtaW5nOgljYWxsZWQgd2hlbiAnc3RyZWFtaW5nJyBzdGF0ZSBtdXN0IGJlIGRpc2FibGVkOyBkcml2ZXIKICAqCQkJc2hvdWxkIHN0b3AgYW55IERNQSB0cmFuc2FjdGlvbnMgb3Igd2FpdCB1bnRpbCB0aGV5CiAgKgkJCWZpbmlzaCBhbmQgZ2l2ZSBiYWNrIGFsbCBidWZmZXJzIGl0IGdvdCBmcm9tIGJ1Zl9xdWV1ZSgpCiAgKgkJCWNhbGxiYWNrOyBtYXkgdXNlIHZiMl93YWl0X2Zvcl9hbGxfYnVmZmVycygpIGZ1bmN0aW9uCiAgKiBAYnVmX3F1ZXVlOgkJcGFzc2VzIGJ1ZmZlciB2YiB0byB0aGUgZHJpdmVyOyBkcml2ZXIgbWF5IHN0YXJ0CiAgKgkJCWhhcmR3YXJlIG9wZXJhdGlvbiBvbiB0aGlzIGJ1ZmZlcjsgZHJpdmVyIHNob3VsZCBnaXZlCi0gKgkJCXRoZSBidWZmZXIgYmFjayBieSBjYWxsaW5nIHZiMl9idWZmZXJfZG9uZSgpIGZ1bmN0aW9uCisgKgkJCXRoZSBidWZmZXIgYmFjayBieSBjYWxsaW5nIHZiMl9idWZmZXJfZG9uZSgpIGZ1bmN0aW9uOworICoJCQlpdCBpcyBhbGx3YXlzIGNhbGxlZCBhZnRlciBjYWxsaW5nIFNUUkVBTU9OIGlvY3RsOworICoJCQltaWdodCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0X3N0cmVhbWluZyBjYWxsYmFjayBpZiB1c2VyCisgKgkJCXByZS1xdWV1ZWQgYnVmZmVycyBiZWZvcmUgY2FsbGluZyBTVFJFQU1PTgogICovCiBzdHJ1Y3QgdmIyX29wcyB7Ci0JaW50ICgqcXVldWVfc2V0dXApKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsCi0JCQkgICB1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKLQkJCSAgIHZvaWQgKmFsbG9jX2N0eHNbXSk7CisJaW50ICgqcXVldWVfc2V0dXApKHN0cnVjdCB2YjJfcXVldWUgKnEsIGNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAorCQkJICAgdW5zaWduZWQgaW50ICpudW1fYnVmZmVycywgdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAorCQkJICAgdW5zaWduZWQgaW50IHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSk7CiAKIAl2b2lkICgqd2FpdF9wcmVwYXJlKShzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKIAl2b2lkICgqd2FpdF9maW5pc2gpKHN0cnVjdCB2YjJfcXVldWUgKnEpOwpAQCAtMjIyLDcgKzIzOCw3IEBACiAJaW50ICgqYnVmX2ZpbmlzaCkoc3RydWN0IHZiMl9idWZmZXIgKnZiKTsKIAl2b2lkICgqYnVmX2NsZWFudXApKHN0cnVjdCB2YjJfYnVmZmVyICp2Yik7CiAKLQlpbnQgKCpzdGFydF9zdHJlYW1pbmcpKHN0cnVjdCB2YjJfcXVldWUgKnEpOworCWludCAoKnN0YXJ0X3N0cmVhbWluZykoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50KTsKIAlpbnQgKCpzdG9wX3N0cmVhbWluZykoc3RydWN0IHZiMl9xdWV1ZSAqcSk7CiAKIAl2b2lkICgqYnVmX3F1ZXVlKShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpOwpAQCAtMjc2LDYgKzI5Miw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QJCWRvbmVfd3E7CiAKIAl2b2lkCQkJCSphbGxvY19jdHhbVklERU9fTUFYX1BMQU5FU107CisJdW5zaWduZWQgaW50CQkJcGxhbmVfc2l6ZXNbVklERU9fTUFYX1BMQU5FU107CiAKIAl1bnNpZ25lZCBpbnQJCQlzdHJlYW1pbmc6MTsKIApAQCAtMjkxLDYgKzMwOCw5IEBACiBpbnQgdmIyX3F1ZXJ5YnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CiBpbnQgdmIyX3JlcWJ1ZnMoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSk7CiAKK2ludCB2YjJfY3JlYXRlX2J1ZnMoc3RydWN0IHZiMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfY3JlYXRlX2J1ZmZlcnMgKmNyZWF0ZSk7CitpbnQgdmIyX3ByZXBhcmVfYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYik7CisKIGludCB2YjJfcXVldWVfaW5pdChzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKIAogdm9pZCB2YjJfcXVldWVfcmVsZWFzZShzdHJ1Y3QgdmIyX3F1ZXVlICpxKTsKQEAgLTMwMiw2ICszMjIsMTMgQEAKIGludCB2YjJfc3RyZWFtb2ZmKHN0cnVjdCB2YjJfcXVldWUgKnEsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKTsKIAogaW50IHZiMl9tbWFwKHN0cnVjdCB2YjJfcXVldWUgKnEsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKyNpZm5kZWYgQ09ORklHX01NVQordW5zaWduZWQgbG9uZyB2YjJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IHZiMl9xdWV1ZSAqcSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisjZW5kaWYKIHVuc2lnbmVkIGludCB2YjJfcG9sbChzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CiBzaXplX3QgdmIyX3JlYWQoc3RydWN0IHZiMl9xdWV1ZSAqcSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwKIAkJbG9mZl90ICpwcG9zLCBpbnQgbm9uYmxvY2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oIGIvaW5jbHVkZS9tZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oCmluZGV4IDdlNmM2OGIuLjE5YWUxZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmgKQEAgLTE3LDExICsxNywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAotdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoc3RydWN0IHZiMl9idWZmZXIgKnZiLCB1bnNpZ25lZCBpbnQgcGxhbmVfbm8pCit2YjJfZG1hX2NvbnRpZ19wbGFuZV9kbWFfYWRkcihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIsIHVuc2lnbmVkIGludCBwbGFuZV9ubykKIHsKLQlkbWFfYWRkcl90ICpwYWRkciA9IHZiMl9wbGFuZV9jb29raWUodmIsIHBsYW5lX25vKTsKKwlkbWFfYWRkcl90ICphZGRyID0gdmIyX3BsYW5lX2Nvb2tpZSh2YiwgcGxhbmVfbm8pOwogCi0JcmV0dXJuICpwYWRkcjsKKwlyZXR1cm4gKmFkZHI7CiB9CiAKIHZvaWQgKnZiMl9kbWFfY29udGlnX2luaXRfY3R4KHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5oIGIvaW5jbHVkZS9taXNjL2FsdGVyYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5oCnJlbmFtZSB0byBpbmNsdWRlL21pc2MvYWx0ZXJhLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL210ZC1hYmkuaCBiL2luY2x1ZGUvbXRkL210ZC1hYmkuaAppbmRleCAyZjdkNDViLi4xYTdlMWQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL210ZC9tdGQtYWJpLmgKKysrIGIvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCkBAIC00NSw2ICs0NSw1MSBAQAogCV9fdTY0IHVzcl9wdHI7CiB9OwogCisvKioKKyAqIE1URCBvcGVyYXRpb24gbW9kZXMKKyAqCisgKiBATVREX09QU19QTEFDRV9PT0I6CU9PQiBkYXRhIGFyZSBwbGFjZWQgYXQgdGhlIGdpdmVuIG9mZnNldCAoZGVmYXVsdCkKKyAqIEBNVERfT1BTX0FVVE9fT09COglPT0IgZGF0YSBhcmUgYXV0b21hdGljYWxseSBwbGFjZWQgYXQgdGhlIGZyZWUgYXJlYXMKKyAqCQkJd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIGludGVybmFsIGVjY2xheW91dAorICogQE1URF9PUFNfUkFXOglkYXRhIGFyZSB0cmFuc2ZlcnJlZCBhcy1pcywgd2l0aCBubyBlcnJvciBjb3JyZWN0aW9uOworICoJCQl0aGlzIG1vZGUgaW1wbGllcyAlTVREX09QU19QTEFDRV9PT0IKKyAqCisgKiBUaGVzZSBtb2RlcyBjYW4gYmUgcGFzc2VkIHRvIGlvY3RsKE1FTVdSSVRFKSBhbmQgYXJlIGFsc28gdXNlZCBpbnRlcm5hbGx5LgorICogU2VlIG5vdGVzIG9uICJNVEQgZmlsZSBtb2RlcyIgZm9yIGRpc2N1c3Npb24gb24gJU1URF9PUFNfUkFXIHZzLgorICogJU1URF9GSUxFX01PREVfUkFXLgorICovCitlbnVtIHsKKwlNVERfT1BTX1BMQUNFX09PQiA9IDAsCisJTVREX09QU19BVVRPX09PQiA9IDEsCisJTVREX09QU19SQVcgPSAyLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRkX3dyaXRlX3JlcSAtIGRhdGEgc3RydWN0dXJlIGZvciByZXF1ZXN0aW5nIGEgd3JpdGUgb3BlcmF0aW9uCisgKgorICogQHN0YXJ0OglzdGFydCBhZGRyZXNzCisgKiBAbGVuOglsZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqIEBvb2JsZW46CWxlbmd0aCBvZiBPT0IgYnVmZmVyCisgKiBAdXNyX2RhdGE6CXVzZXItcHJvdmlkZWQgZGF0YSBidWZmZXIKKyAqIEB1c3Jfb29iOgl1c2VyLXByb3ZpZGVkIE9PQiBidWZmZXIKKyAqIEBtb2RlOglNVEQgbW9kZSAoc2VlICJNVEQgb3BlcmF0aW9uIG1vZGVzIikKKyAqIEBwYWRkaW5nOglyZXNlcnZlZCwgbXVzdCBiZSBzZXQgdG8gMAorICoKKyAqIFRoaXMgc3RydWN0dXJlIHN1cHBvcnRzIGlvY3RsKE1FTVdSSVRFKSBvcGVyYXRpb25zLCBhbGxvd2luZyBkYXRhIGFuZC9vciBPT0IKKyAqIHdyaXRlcyBpbiB2YXJpb3VzIG1vZGVzLiBUbyB3cml0ZSB0byBPT0Itb25seSwgc2V0IEB1c3JfZGF0YSA9PSBOVUxMLCBhbmQgdG8KKyAqIHdyaXRlIGRhdGEtb25seSwgc2V0IEB1c3Jfb29iID09IE5VTEwuIEhvd2V2ZXIsIHNldHRpbmcgYm90aCBAdXNyX2RhdGEgYW5kCisgKiBAdXNyX29vYiB0byBOVUxMIGlzIG5vdCBhbGxvd2VkLgorICovCitzdHJ1Y3QgbXRkX3dyaXRlX3JlcSB7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuOworCV9fdTY0IG9vYmxlbjsKKwlfX3U2NCB1c3JfZGF0YTsKKwlfX3U2NCB1c3Jfb29iOworCV9fdTggbW9kZTsKKwlfX3U4IHBhZGRpbmdbN107Cit9OworCiAjZGVmaW5lIE1URF9BQlNFTlQJCTAKICNkZWZpbmUgTVREX1JBTQkJCTEKICNkZWZpbmUgTVREX1JPTQkJCTIKQEAgLTU5LDEzICsxMDQsMTMgQEAKICNkZWZpbmUgTVREX05PX0VSQVNFCQkweDEwMDAJLyogTm8gZXJhc2UgbmVjZXNzYXJ5ICovCiAjZGVmaW5lIE1URF9QT1dFUlVQX0xPQ0sJMHgyMDAwCS8qIEFsd2F5cyBsb2NrZWQgYWZ0ZXIgcmVzZXQgKi8KIAotLy8gU29tZSBjb21tb24gZGV2aWNlcyAvIGNvbWJpbmF0aW9ucyBvZiBjYXBhYmlsaXRpZXMKKy8qIFNvbWUgY29tbW9uIGRldmljZXMgLyBjb21iaW5hdGlvbnMgb2YgY2FwYWJpbGl0aWVzICovCiAjZGVmaW5lIE1URF9DQVBfUk9NCQkwCiAjZGVmaW5lIE1URF9DQVBfUkFNCQkoTVREX1dSSVRFQUJMRSB8IE1URF9CSVRfV1JJVEVBQkxFIHwgTVREX05PX0VSQVNFKQogI2RlZmluZSBNVERfQ0FQX05PUkZMQVNICShNVERfV1JJVEVBQkxFIHwgTVREX0JJVF9XUklURUFCTEUpCiAjZGVmaW5lIE1URF9DQVBfTkFOREZMQVNICShNVERfV1JJVEVBQkxFKQogCi0vKiBFQ0MgYnl0ZSBwbGFjZW1lbnQgKi8KKy8qIE9ic29sZXRlIEVDQyBieXRlIHBsYWNlbWVudCBtb2RlcyAodXNlZCB3aXRoIG9ic29sZXRlIE1FTUdFVE9PQlNFTCkgKi8KICNkZWZpbmUgTVREX05BTkRFQ0NfT0ZGCQkwCS8vIFN3aXRjaCBvZmYgRUNDIChOb3QgcmVjb21tZW5kZWQpCiAjZGVmaW5lIE1URF9OQU5ERUNDX1BMQUNFCTEJLy8gVXNlIHRoZSBnaXZlbiBwbGFjZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAoWUFGRlMxIGxlZ2FjeSBtb2RlKQogI2RlZmluZSBNVERfTkFOREVDQ19BVVRPUExBQ0UJMgkvLyBVc2UgdGhlIGRlZmF1bHQgcGxhY2VtZW50IHNjaGVtZQpAQCAtODAsMjEgKzEyNSwxOCBAQAogc3RydWN0IG10ZF9pbmZvX3VzZXIgewogCV9fdTggdHlwZTsKIAlfX3UzMiBmbGFnczsKLQlfX3UzMiBzaXplOwkgLy8gVG90YWwgc2l6ZSBvZiB0aGUgTVRECisJX191MzIgc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiB0aGUgTVREICovCiAJX191MzIgZXJhc2VzaXplOwogCV9fdTMyIHdyaXRlc2l6ZTsKLQlfX3UzMiBvb2JzaXplOyAgIC8vIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpCi0JLyogVGhlIGJlbG93IHR3byBmaWVsZHMgYXJlIG9ic29sZXRlIGFuZCBicm9rZW4sIGRvIG5vdCB1c2UgdGhlbQotCSAqIChUT0RPOiByZW1vdmUgYXQgc29tZSBwb2ludCkgKi8KLQlfX3UzMiBlY2N0eXBlOwotCV9fdTMyIGVjY3NpemU7CisJX191MzIgb29ic2l6ZTsJLyogQW1vdW50IG9mIE9PQiBkYXRhIHBlciBibG9jayAoZS5nLiAxNikgKi8KKwlfX3U2NCBwYWRkaW5nOwkvKiBPbGQgb2Jzb2xldGUgZmllbGQ7IGRvIG5vdCB1c2UgKi8KIH07CiAKIHN0cnVjdCByZWdpb25faW5mb191c2VyIHsKIAlfX3UzMiBvZmZzZXQ7CQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsCi0JCQkJCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCi0JX191MzIgZXJhc2VzaXplOwkJLyogRm9yIHRoaXMgcmVnaW9uICovCi0JX191MzIgbnVtYmxvY2tzOwkJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGlzIHJlZ2lvbiAqLworCQkJCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJX191MzIgZXJhc2VzaXplOwkvKiBGb3IgdGhpcyByZWdpb24gKi8KKwlfX3UzMiBudW1ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3MgaW4gdGhpcyByZWdpb24gKi8KIAlfX3UzMiByZWdpb25pbmRleDsKIH07CiAKQEAgLTEwNCwyOSArMTQ2LDYxIEBACiAJX191MzIgbG9ja2VkOwogfTsKIAorLyoKKyAqIE5vdGUsIHRoZSBmb2xsb3dpbmcgaW9jdGwgZXhpc3RlZCBpbiB0aGUgcGFzdCBhbmQgd2FzIHJlbW92ZWQ6CisgKiAjZGVmaW5lIE1FTVNFVE9PQlNFTCAgICAgICAgICAgX0lPVygnTScsIDksIHN0cnVjdCBuYW5kX29vYmluZm8pCisgKiBUcnkgdG8gYXZvaWQgYWRkaW5nIGEgbmV3IGlvY3RsIHdpdGggdGhlIHNhbWUgaW9jdGwgbnVtYmVyLgorICovCisKKy8qIEdldCBiYXNpYyBNVEQgY2hhcmFjdGVyaXN0aWNzIGluZm8gKGJldHRlciB0byB1c2Ugc3lzZnMpICovCiAjZGVmaW5lIE1FTUdFVElORk8JCV9JT1IoJ00nLCAxLCBzdHJ1Y3QgbXRkX2luZm9fdXNlcikKKy8qIEVyYXNlIHNlZ21lbnQgb2YgTVREICovCiAjZGVmaW5lIE1FTUVSQVNFCQlfSU9XKCdNJywgMiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qIFdyaXRlIG91dC1vZi1iYW5kIGRhdGEgZnJvbSBNVEQgKi8KICNkZWZpbmUgTUVNV1JJVEVPT0IJCV9JT1dSKCdNJywgMywgc3RydWN0IG10ZF9vb2JfYnVmKQorLyogUmVhZCBvdXQtb2YtYmFuZCBkYXRhIGZyb20gTVREICovCiAjZGVmaW5lIE1FTVJFQURPT0IJCV9JT1dSKCdNJywgNCwgc3RydWN0IG10ZF9vb2JfYnVmKQorLyogTG9jayBhIGNoaXAgKGZvciBNVEQgdGhhdCBzdXBwb3J0cyBpdCkgKi8KICNkZWZpbmUgTUVNTE9DSwkJCV9JT1coJ00nLCA1LCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyogVW5sb2NrIGEgY2hpcCAoZm9yIE1URCB0aGF0IHN1cHBvcnRzIGl0KSAqLwogI2RlZmluZSBNRU1VTkxPQ0sJCV9JT1coJ00nLCA2LCBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyKQorLyogR2V0IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVyYXNlIHJlZ2lvbnMgKi8KICNkZWZpbmUgTUVNR0VUUkVHSU9OQ09VTlQJX0lPUignTScsIDcsIGludCkKKy8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJhc2UgcmVnaW9uIGZvciBhIHNwZWNpZmljIGluZGV4ICovCiAjZGVmaW5lIE1FTUdFVFJFR0lPTklORk8JX0lPV1IoJ00nLCA4LCBzdHJ1Y3QgcmVnaW9uX2luZm9fdXNlcikKLSNkZWZpbmUgTUVNU0VUT09CU0VMCQlfSU9XKCdNJywgOSwgc3RydWN0IG5hbmRfb29iaW5mbykKKy8qIEdldCBpbmZvIGFib3V0IE9PQiBtb2RlcyAoZS5nLiwgUkFXLCBQTEFDRSwgQVVUTykgLSBsZWdhY3kgaW50ZXJmYWNlICovCiAjZGVmaW5lIE1FTUdFVE9PQlNFTAkJX0lPUignTScsIDEwLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvKQorLyogQ2hlY2sgaWYgYW4gZXJhc2VibG9jayBpcyBiYWQgKi8KICNkZWZpbmUgTUVNR0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMSwgX19rZXJuZWxfbG9mZl90KQorLyogTWFyayBhbiBlcmFzZWJsb2NrIGFzIGJhZCAqLwogI2RlZmluZSBNRU1TRVRCQURCTE9DSwkJX0lPVygnTScsIDEyLCBfX2tlcm5lbF9sb2ZmX3QpCisvKiBTZXQgT1RQIChPbmUtVGltZSBQcm9ncmFtbWFibGUpIG1vZGUgKGZhY3RvcnkgdnMuIHVzZXIpICovCiAjZGVmaW5lIE9UUFNFTEVDVAkJX0lPUignTScsIDEzLCBpbnQpCisvKiBHZXQgbnVtYmVyIG9mIE9UUCAoT25lLVRpbWUgUHJvZ3JhbW1hYmxlKSByZWdpb25zICovCiAjZGVmaW5lIE9UUEdFVFJFR0lPTkNPVU5UCV9JT1coJ00nLCAxNCwgaW50KQorLyogR2V0IGFsbCBPVFAgKE9uZS1UaW1lIFByb2dyYW1tYWJsZSkgaW5mbyBhYm91dCBNVEQgKi8KICNkZWZpbmUgT1RQR0VUUkVHSU9OSU5GTwlfSU9XKCdNJywgMTUsIHN0cnVjdCBvdHBfaW5mbykKKy8qIExvY2sgYSBnaXZlbiByYW5nZSBvZiB1c2VyIGRhdGEgKG11c3QgYmUgaW4gbW9kZSAlTVREX0ZJTEVfTU9ERV9PVFBfVVNFUikgKi8KICNkZWZpbmUgT1RQTE9DSwkJCV9JT1IoJ00nLCAxNiwgc3RydWN0IG90cF9pbmZvKQorLyogR2V0IEVDQyBsYXlvdXQgKGRlcHJlY2F0ZWQpICovCiAjZGVmaW5lIEVDQ0dFVExBWU9VVAkJX0lPUignTScsIDE3LCBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXRfdXNlcikKKy8qIEdldCBzdGF0aXN0aWNzIGFib3V0IGNvcnJlY3RlZC91bmNvcnJlY3RlZCBlcnJvcnMgKi8KICNkZWZpbmUgRUNDR0VUU1RBVFMJCV9JT1IoJ00nLCAxOCwgc3RydWN0IG10ZF9lY2Nfc3RhdHMpCisvKiBTZXQgTVREIG1vZGUgb24gYSBwZXItZmlsZS1kZXNjcmlwdG9yIGJhc2lzIChzZWUgIk1URCBmaWxlIG1vZGVzIikgKi8KICNkZWZpbmUgTVRERklMRU1PREUJCV9JTygnTScsIDE5KQorLyogRXJhc2Ugc2VnbWVudCBvZiBNVEQgKHN1cHBvcnRzIDY0LWJpdCBhZGRyZXNzKSAqLwogI2RlZmluZSBNRU1FUkFTRTY0CQlfSU9XKCdNJywgMjAsIHN0cnVjdCBlcmFzZV9pbmZvX3VzZXI2NCkKKy8qIFdyaXRlIGRhdGEgdG8gT09CICg2NC1iaXQgdmVyc2lvbikgKi8KICNkZWZpbmUgTUVNV1JJVEVPT0I2NAkJX0lPV1IoJ00nLCAyMSwgc3RydWN0IG10ZF9vb2JfYnVmNjQpCisvKiBSZWFkIGRhdGEgZnJvbSBPT0IgKDY0LWJpdCB2ZXJzaW9uKSAqLwogI2RlZmluZSBNRU1SRUFET09CNjQJCV9JT1dSKCdNJywgMjIsIHN0cnVjdCBtdGRfb29iX2J1ZjY0KQorLyogQ2hlY2sgaWYgY2hpcCBpcyBsb2NrZWQgKGZvciBNVEQgdGhhdCBzdXBwb3J0cyBpdCkgKi8KICNkZWZpbmUgTUVNSVNMT0NLRUQJCV9JT1IoJ00nLCAyMywgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKKy8qCisgKiBNb3N0IGdlbmVyaWMgd3JpdGUgaW50ZXJmYWNlOyBjYW4gd3JpdGUgaW4tYmFuZCBhbmQvb3Igb3V0LW9mLWJhbmQgaW4gdmFyaW91cworICogbW9kZXMgKHNlZSAic3RydWN0IG10ZF93cml0ZV9yZXEiKQorICovCisjZGVmaW5lIE1FTVdSSVRFCQlfSU9XUignTScsIDI0LCBzdHJ1Y3QgbXRkX3dyaXRlX3JlcSkKIAogLyoKICAqIE9ic29sZXRlIGxlZ2FjeSBpbnRlcmZhY2UuIEtlZXAgaXQgaW4gb3JkZXIgbm90IHRvIGJyZWFrIHVzZXJzcGFjZQpAQCAtMTc3LDEzICsyNTEsMjcgQEAKIH07CiAKIC8qCi0gKiBSZWFkL3dyaXRlIGZpbGUgbW9kZXMgZm9yIGFjY2VzcyB0byBNVEQKKyAqIE1URCBmaWxlIG1vZGVzIC0gZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIE1URAorICoKKyAqIEBNVERfRklMRV9NT0RFX05PUk1BTDoJT1RQIGRpc2FibGVkLCBFQ0MgZW5hYmxlZAorICogQE1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlk6CU9UUCBlbmFibGVkIGluIGZhY3RvcnkgbW9kZQorICogQE1URF9GSUxFX01PREVfT1RQX1VTRVI6CU9UUCBlbmFibGVkIGluIHVzZXIgbW9kZQorICogQE1URF9GSUxFX01PREVfUkFXOgkJT1RQIGRpc2FibGVkLCBFQ0MgZGlzYWJsZWQKKyAqCisgKiBUaGVzZSBtb2RlcyBjYW4gYmUgc2V0IHZpYSBpb2N0bChNVERGSUxFTU9ERSkuIFRoZSBtb2RlIG1vZGUgd2lsbCBiZSByZXRhaW5lZAorICogc2VwYXJhdGVseSBmb3IgZWFjaCBvcGVuIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBOb3RlOiAlTVREX0ZJTEVfTU9ERV9SQVcgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyAlTVREX09QU19SQVcgLQorICogcmF3IGFjY2VzcyB0byB0aGUgZmxhc2gsIHdpdGhvdXQgZXJyb3IgY29ycmVjdGlvbiBvciBhdXRvcGxhY2VtZW50IHNjaGVtZXMuCisgKiBXaGVyZXZlciBwb3NzaWJsZSwgdGhlIE1URF9PUFNfKiBtb2RlIHdpbGwgb3ZlcnJpZGUgdGhlIE1URF9GSUxFX01PREVfKiBtb2RlCisgKiAoZS5nLiwgd2hlbiB1c2luZyBpb2N0bChNRU1XUklURSkpLCBidXQgaW4gc29tZSBjYXNlcywgdGhlIE1URF9GSUxFX01PREUgaXMKKyAqIHVzZWQgb3V0IG9mIG5lY2Vzc2l0eSAoZS5nLiwgYHdyaXRlKCknLCBpb2N0bChNRU1XUklURU9PQjY0KSkuCiAgKi8KIGVudW0gbXRkX2ZpbGVfbW9kZXMgewotCU1URF9NT0RFX05PUk1BTCA9IE1URF9PVFBfT0ZGLAotCU1URF9NT0RFX09UUF9GQUNUT1JZID0gTVREX09UUF9GQUNUT1JZLAotCU1URF9NT0RFX09UUF9VU0VSID0gTVREX09UUF9VU0VSLAotCU1URF9NT0RFX1JBVywKKwlNVERfRklMRV9NT0RFX05PUk1BTCA9IE1URF9PVFBfT0ZGLAorCU1URF9GSUxFX01PREVfT1RQX0ZBQ1RPUlkgPSBNVERfT1RQX0ZBQ1RPUlksCisJTVREX0ZJTEVfTU9ERV9PVFBfVVNFUiA9IE1URF9PVFBfVVNFUiwKKwlNVERfRklMRV9NT0RFX1JBVywKIH07CiAKICNlbmRpZiAvKiBfX01URF9BQklfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKaW5kZXggOTcyNjRmYy4uOTgwZTU5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaApAQCAtMTA5LDcgKzEwOSw3IEBACiAgKi8KICNkZWZpbmUgQlRfQ0hBTk5FTF9QT0xJQ1lfQU1QX1BSRUZFUlJFRAkJMgogCi1fX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKQorX19wcmludGYoMiwgMykKIGludCBidF9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2RlZmluZSBCVF9JTkZPKGZtdCwgYXJnLi4uKSAgIGJ0X3ByaW50ayhLRVJOX0lORk8sIHByX2ZtdChmbXQpLCAjI2FyZykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKaW5kZXggNzRmODM1Ni4uMjVjMTYxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmgKQEAgLTU3MCwxMSArNTcwLDE1IEBACiAJCWQtPmRlc3RydWN0KGQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Rldl9wdXQoc3RydWN0IGhjaV9kZXYgKmQpCi17Ci0JX19oY2lfZGV2X3B1dChkKTsKLQltb2R1bGVfcHV0KGQtPm93bmVyKTsKLX0KKy8qCisgKiBoY2lfZGV2X3B1dCBhbmQgaGNpX2Rldl9ob2xkIGFyZSBtYWNyb3MgdG8gYXZvaWQgZHJhZ2dpbmcgYWxsIHRoZQorICogb3ZlcmhlYWQgb2YgYWxsIHRoZSBtb2R1bGFyIGluZnJhc3RydWN0dXJlIGludG8gdGhpcyBoZWFkZXIuCisgKi8KKyNkZWZpbmUgaGNpX2Rldl9wdXQoZCkJCVwKK2RvIHsJCQkJXAorCV9faGNpX2Rldl9wdXQoZCk7CVwKKwltb2R1bGVfcHV0KGQtPm93bmVyKTsJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2RldiAqX19oY2lfZGV2X2hvbGQoc3RydWN0IGhjaV9kZXYgKmQpCiB7CkBAIC01ODIsMTIgKzU4NiwxMCBAQAogCXJldHVybiBkOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBoY2lfZGV2ICpoY2lfZGV2X2hvbGQoc3RydWN0IGhjaV9kZXYgKmQpCi17Ci0JaWYgKHRyeV9tb2R1bGVfZ2V0KGQtPm93bmVyKSkKLQkJcmV0dXJuIF9faGNpX2Rldl9ob2xkKGQpOwotCXJldHVybiBOVUxMOwotfQorI2RlZmluZSBoY2lfZGV2X2hvbGQoZCkJCQkJCQlcCisoewkJCQkJCQkJXAorCXRyeV9tb2R1bGVfZ2V0KGQtPm93bmVyKSA/IF9faGNpX2Rldl9ob2xkKGQpIDogTlVMTDsJXAorfSkKIAogI2RlZmluZSBoY2lfZGV2X2xvY2soZCkJCW11dGV4X2xvY2soJmQtPmxvY2spCiAjZGVmaW5lIGhjaV9kZXZfdW5sb2NrKGQpCW11dGV4X3VubG9jaygmZC0+bG9jaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmggYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCmluZGV4IGUxZWUxNDE2Li45Zjg1ZmNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTM5MSw2ICszOTEsOCBAQAogICogQGFzc29jcmVzcF9pZXM6IGV4dHJhIGluZm9ybWF0aW9uIGVsZW1lbnQocykgdG8gYWRkIGludG8gKFJlKUFzc29jaWF0aW9uCiAgKglSZXNwb25zZSBmcmFtZXMgb3IgJU5VTEwKICAqIEBhc3NvY3Jlc3BfaWVzX2xlbjogbGVuZ3RoIG9mIGFzc29jcmVzcF9pZXMgaW4gb2N0ZXRzCisgKiBAcHJvYmVfcmVzcF9sZW46IGxlbmd0aCBvZiBwcm9iZSByZXNwb25zZSB0ZW1wbGF0ZSAoQHByb2JlX3Jlc3ApCisgKiBAcHJvYmVfcmVzcDogcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgKEFQIG1vZGUgb25seSkKICAqLwogc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzIHsKIAl1OCAqaGVhZCwgKnRhaWw7CkBAIC00MDgsNiArNDEwLDggQEAKIAlzaXplX3QgcHJvYmVyZXNwX2llc19sZW47CiAJY29uc3QgdTggKmFzc29jcmVzcF9pZXM7CiAJc2l6ZV90IGFzc29jcmVzcF9pZXNfbGVuOworCWludCBwcm9iZV9yZXNwX2xlbjsKKwl1OCAqcHJvYmVfcmVzcDsKIH07CiAKIC8qKgpAQCAtNzc4LDYgKzc4Miw3IEBACiAJdTE2IG1pbl9kaXNjb3ZlcnlfdGltZW91dDsKIAl1MzIgZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0OwogCXUxNiBkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsOworCXUxNiBkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsOwogCXUxNiBkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lOwogCXU4ICBkb3QxMU1lc2hIV01QUm9vdE1vZGU7CiAJdTE2IGRvdDExTWVzaEhXTVBSYW5uSW50ZXJ2YWw7CkBAIC03OTgsNiArODAzLDcgQEAKICAqIEBpZV9sZW46IGxlbmd0aCBvZiB2ZW5kb3IgaW5mb3JtYXRpb24gZWxlbWVudHMKICAqIEBpc19hdXRoZW50aWNhdGVkOiB0aGlzIG1lc2ggcmVxdWlyZXMgYXV0aGVudGljYXRpb24KICAqIEBpc19zZWN1cmU6IHRoaXMgbWVzaCB1c2VzIHNlY3VyaXR5CisgKiBAbWNhc3RfcmF0ZTogbXVsdGljYXQgcmF0ZSBmb3IgTWVzaCBOb2RlIFs2TWJwcyBpcyB0aGUgZGVmYXVsdCBmb3IgODAyLjExYV0KICAqCiAgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBmaXhlZCB3aGVuIHRoZSBtZXNoIGlzIGNyZWF0ZWQuCiAgKi8KQEAgLTgxMCw2ICs4MTYsNyBAQAogCXU4IGllX2xlbjsKIAlib29sIGlzX2F1dGhlbnRpY2F0ZWQ7CiAJYm9vbCBpc19zZWN1cmU7CisJaW50IG1jYXN0X3JhdGVbSUVFRTgwMjExX05VTV9CQU5EU107CiB9OwogCiAvKioKQEAgLTEwNDAsNiArMTA0NywxNSBAQAogfTsKIAogLyoqCisgKiBlbnVtIGNmZzgwMjExX2Fzc29jX3JlcV9mbGFncyAtIE92ZXItcmlkZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBhc3NvY2lhdGlvbi4KKyAqCisgKiBAQVNTT0NfUkVRX0RJU0FCTEVfSFQ6ICBEaXNhYmxlIEhUICg4MDIuMTFuKQorICovCitlbnVtIGNmZzgwMjExX2Fzc29jX3JlcV9mbGFncyB7CisJQVNTT0NfUkVRX0RJU0FCTEVfSFQJCT0gQklUKDApLAorfTsKKworLyoqCiAgKiBzdHJ1Y3QgY2ZnODAyMTFfYXNzb2NfcmVxdWVzdCAtIChSZSlBc3NvY2lhdGlvbiByZXF1ZXN0IGRhdGEKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29tcGxldGUgSUVFRSA4MDIuMTEKQEAgLTEwNTAsNiArMTA2NiwxMCBAQAogICogQHVzZV9tZnA6IFVzZSBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24gKElFRUUgODAyLjExdykgaW4gdGhpcyBhc3NvY2lhdGlvbgogICogQGNyeXB0bzogY3J5cHRvIHNldHRpbmdzCiAgKiBAcHJldl9ic3NpZDogcHJldmlvdXMgQlNTSUQsIGlmIG5vdCAlTlVMTCB1c2UgcmVhc3NvY2lhdGUgZnJhbWUKKyAqIEBmbGFnczogIFNlZSAmZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MKKyAqIEBodF9jYXBhOiAgSFQgQ2FwYWJpbGl0aWVzIG92ZXItcmlkZXMuICBWYWx1ZXMgc2V0IGluIGh0X2NhcGFfbWFzaworICogICB3aWxsIGJlIHVzZWQgaW4gaHRfY2FwYS4gIFVuLXN1cHBvcnRlZCB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLgorICogQGh0X2NhcGFfbWFzazogIFRoZSBiaXRzIG9mIGh0X2NhcGEgd2hpY2ggYXJlIHRvIGJlIHVzZWQuCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9hc3NvY19yZXF1ZXN0IHsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CkBAIC0xMDU3LDYgKzEwNzcsOSBAQAogCXNpemVfdCBpZV9sZW47CiAJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyBjcnlwdG87CiAJYm9vbCB1c2VfbWZwOworCXUzMiBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGFfbWFzazsKIH07CiAKIC8qKgpAQCAtMTEyNiw2ICsxMTQ5LDcgQEAKIAl1OCAqc3NpZDsKIAl1OCAqYnNzaWQ7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwogCXU4ICppZTsKIAl1OCBzc2lkX2xlbiwgaWVfbGVuOwogCXUxNiBiZWFjb25faW50ZXJ2YWw7CkBAIC0xMTU1LDYgKzExNzksMTAgQEAKICAqIEBrZXlfbGVuOiBsZW5ndGggb2YgV0VQIGtleSBmb3Igc2hhcmVkIGtleSBhdXRoZW50aWNhdGlvbgogICogQGtleV9pZHg6IGluZGV4IG9mIFdFUCBrZXkgZm9yIHNoYXJlZCBrZXkgYXV0aGVudGljYXRpb24KICAqIEBrZXk6IFdFUCBrZXkgZm9yIHNoYXJlZCBrZXkgYXV0aGVudGljYXRpb24KKyAqIEBmbGFnczogIFNlZSAmZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MKKyAqIEBodF9jYXBhOiAgSFQgQ2FwYWJpbGl0aWVzIG92ZXItcmlkZXMuICBWYWx1ZXMgc2V0IGluIGh0X2NhcGFfbWFzaworICogICB3aWxsIGJlIHVzZWQgaW4gaHRfY2FwYS4gIFVuLXN1cHBvcnRlZCB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkLgorICogQGh0X2NhcGFfbWFzazogIFRoZSBiaXRzIG9mIGh0X2NhcGEgd2hpY2ggYXJlIHRvIGJlIHVzZWQuCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwpAQCAtMTE2OCw2ICsxMTk2LDkgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzIGNyeXB0bzsKIAljb25zdCB1OCAqa2V5OwogCXU4IGtleV9sZW4sIGtleV9pZHg7CisJdTMyIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGE7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYV9tYXNrOwogfTsKIAogLyoqCkBAIC0xMzE1LDcgKzEzNDYsMTIgQEAKICAqCiAgKiBAYWRkX3N0YXRpb246IEFkZCBhIG5ldyBzdGF0aW9uLgogICogQGRlbF9zdGF0aW9uOiBSZW1vdmUgYSBzdGF0aW9uOyBAbWFjIG1heSBiZSBOVUxMIHRvIHJlbW92ZSBhbGwgc3RhdGlvbnMuCi0gKiBAY2hhbmdlX3N0YXRpb246IE1vZGlmeSBhIGdpdmVuIHN0YXRpb24uCisgKiBAY2hhbmdlX3N0YXRpb246IE1vZGlmeSBhIGdpdmVuIHN0YXRpb24uIE5vdGUgdGhhdCBmbGFncyBjaGFuZ2VzIGFyZSBub3QgbXVjaAorICoJdmFsaWRhdGVkIGluIGNmZzgwMjExLCBpbiBwYXJ0aWN1bGFyIHRoZSBhdXRoL2Fzc29jL2F1dGhvcml6ZWQgZmxhZ3MKKyAqCW1pZ2h0IGNvbWUgdG8gdGhlIGRyaXZlciBpbiBpbnZhbGlkIGNvbWJpbmF0aW9ucyAtLSBtYWtlIHN1cmUgdG8gY2hlY2sKKyAqCXRoZW0sIGFsc28gYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc3RhdGUhIEFsc28sIHN1cHBvcnRlZF9yYXRlcyBjaGFuZ2VzIGFyZQorICoJbm90IGNoZWNrZWQgaW4gc3RhdGlvbiBtb2RlIC0tIGRyaXZlcnMgbmVlZCB0byByZWplY3QgKG9yIGlnbm9yZSkgdGhlbQorICoJZm9yIGFueXRoaW5nIGJ1dCBURExTIHBlZXJzLgogICogQGdldF9zdGF0aW9uOiBnZXQgc3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHN0YXRpb24gaWRlbnRpZmllZCBieSBAbWFjCiAgKiBAZHVtcF9zdGF0aW9uOiBkdW1wIHN0YXRpb24gY2FsbGJhY2sgLS0gcmVzdW1lIGR1bXAgYXQgaW5kZXggQGlkeAogICoKQEAgLTEzNDIsNiArMTM3OCw5IEBACiAgKglkb2Vzbid0IHZlcmlmeSBtdWNoLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBwYXNzZWQgbmV0ZGV2IG1heSBiZQogICoJJU5VTEwgYXMgd2VsbCBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgY2hhbmdpbmcgdGhlIGNoYW5uZWwgZm9yIHRoZQogICoJZGV2aWNlIGl0c2VsZiwgb3IgZm9yIGEgbW9uaXRvciBpbnRlcmZhY2UuCisgKiBAZ2V0X2NoYW5uZWw6IEdldCB0aGUgY3VycmVudCBvcGVyYXRpbmcgY2hhbm5lbCwgc2hvdWxkIHJldHVybiAlTlVMTCBpZgorICoJdGhlcmUncyBubyBzaW5nbGUgZGVmaW5lZCBvcGVyYXRpbmcgY2hhbm5lbCBpZiBmb3IgZXhhbXBsZSB0aGUKKyAqCWRldmljZSBpbXBsZW1lbnRzIGNoYW5uZWwgaG9wcGluZyBmb3IgbXVsdGktY2hhbm5lbCB2aXJ0dWFsIGludGVyZmFjZXMuCiAgKgogICogQHNjYW46IFJlcXVlc3QgdG8gZG8gYSBzY2FuLiBJZiByZXR1cm5pbmcgemVybywgdGhlIHNjYW4gcmVxdWVzdCBpcyBnaXZlbgogICoJdGhlIGRyaXZlciwgYW5kIHdpbGwgYmUgdmFsaWQgdW50aWwgcGFzc2VkIHRvIGNmZzgwMjExX3NjYW5fZG9uZSgpLgpAQCAtMTM2OSw3ICsxNDA4LDggQEAKICAqCWhhdmUgY2hhbmdlZC4gVGhlIGFjdHVhbCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBhdmFpbGFibGUgaW4KICAqCXN0cnVjdCB3aXBoeS4gSWYgcmV0dXJuaW5nIGFuIGVycm9yLCBubyB2YWx1ZSBzaG91bGQgYmUgY2hhbmdlZC4KICAqCi0gKiBAc2V0X3R4X3Bvd2VyOiBzZXQgdGhlIHRyYW5zbWl0IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycworICogQHNldF90eF9wb3dlcjogc2V0IHRoZSB0cmFuc21pdCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMsCisgKgl0aGUgcG93ZXIgcGFzc2VkIGlzIGluIG1CbSwgdG8gZ2V0IGRCbSB1c2UgTUJNX1RPX0RCTSgpLgogICogQGdldF90eF9wb3dlcjogc3RvcmUgdGhlIGN1cnJlbnQgVFggcG93ZXIgaW50byB0aGUgZGJtIHZhcmlhYmxlOwogICoJcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bAogICoKQEAgLTE0MzUsNiArMTQ3NSw4IEBACiAgKgogICogQHByb2JlX2NsaWVudDogcHJvYmUgYW4gYXNzb2NpYXRlZCBjbGllbnQsIG11c3QgcmV0dXJuIGEgY29va2llIHRoYXQgaXQKICAqCWxhdGVyIHBhc3NlcyB0byBjZmc4MDIxMV9wcm9iZV9zdGF0dXMoKS4KKyAqCisgKiBAc2V0X25vYWNrX21hcDogU2V0IHRoZSBOb0FjayBNYXAgZm9yIHRoZSBUSURzLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKIAlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOwpAQCAtMTYyNyw2ICsxNjY5LDEyIEBACiAKIAlpbnQJKCpwcm9iZV9jbGllbnQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJY29uc3QgdTggKnBlZXIsIHU2NCAqY29va2llKTsKKworCWludAkoKnNldF9ub2Fja19tYXApKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTE2IG5vYWNrX21hcCk7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKigqZ2V0X2NoYW5uZWwpKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwogfTsKIAogLyoKQEAgLTE2NTEsNyArMTY5OSw5IEBACiAgKglyZWd1bGF0b3J5IGRvbWFpbiBubyB1c2VyIHJlZ3VsYXRvcnkgZG9tYWluIGNhbiBlbmFibGUgdGhlc2UgY2hhbm5lbHMKICAqCWF0IGEgbGF0ZXIgdGltZS4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgZGV2aWNlcyB3aGljaCBkbyBub3QgaGF2ZQogICoJY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gZ3VhcmFudGVlZCBmb3IgZnJlcXVlbmNpZXMgb3Igc2V0dGluZ3MKLSAqCW91dHNpZGUgb2YgaXRzIHJlZ3VsYXRvcnkgZG9tYWluLgorICoJb3V0c2lkZSBvZiBpdHMgcmVndWxhdG9yeSBkb21haW4uIElmIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorICoJV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB0aGUgaW5zcGVjdGVkIGNvdW50cnkgSUUgcG93ZXIgc2V0dGluZ3MKKyAqCXdpbGwgYmUgZm9sbG93ZWQuCiAgKiBAV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUzogZW5hYmxlIHRoaXMgaWYgeW91ciBkcml2ZXIgbmVlZHMgdG8gZW5zdXJlCiAgKgl0aGF0IHBhc3NpdmUgc2NhbiBmbGFncyBhbmQgYmVhY29uaW5nIGZsYWdzIG1heSBub3QgYmUgbGlmdGVkIGJ5CiAgKgljZmc4MDIxMSBkdWUgdG8gcmVndWxhdG9yeSBiZWFjb24gaGludHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJlYWNvbgpAQCAtMTY4OSw2ICsxNzM5LDEwIEBACiAgKiBAV0lQSFlfRkxBR19SRVBPUlRTX09CU1M6IHRoZSBkZXZpY2Ugd2lsbCByZXBvcnQgYmVhY29ucyBmcm9tIG90aGVyIEJTU2VzCiAgKgl3aGVuIHRoZXJlIGFyZSB2aXJ0dWFsIGludGVyZmFjZXMgaW4gQVAgbW9kZSBieSBjYWxsaW5nCiAgKgljZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24oKS4KKyAqIEBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRDogV2hlbiBvcGVyYXRpbmcgYXMgYW4gQVAsIHRoZSBkZXZpY2UKKyAqCXJlc3BvbmRzIHRvIHByb2JlLXJlcXVlc3RzIGluIGhhcmR3YXJlLgorICogQFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWDogRGV2aWNlIHN1cHBvcnRzIGRpcmVjdCBvZmYtY2hhbm5lbCBUWC4KKyAqIEBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTDogRGV2aWNlIHN1cHBvcnRzIHJlbWFpbi1vbi1jaGFubmVsIGNhbGwuCiAgKi8KIGVudW0gd2lwaHlfZmxhZ3MgewogCVdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkJCT0gQklUKDApLApAQCAtMTcwOSw2ICsxNzYzLDkgQEAKIAlXSVBIWV9GTEFHX1RETFNfRVhURVJOQUxfU0VUVVAJCT0gQklUKDE2KSwKIAlXSVBIWV9GTEFHX0hBVkVfQVBfU01FCQkJPSBCSVQoMTcpLAogCVdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTCQkJPSBCSVQoMTgpLAorCVdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FECT0gQklUKDE5KSwKKwlXSVBIWV9GTEFHX09GRkNIQU5fVFgJCQk9IEJJVCgyMCksCisJV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwJPSBCSVQoMjEpLAogfTsKIAogLyoqCkBAIC0xOTIyLDYgKzE5NzksOCBAQAogICogQHdvd2xhbjogV29XTEFOIHN1cHBvcnQgaW5mb3JtYXRpb24KICAqCiAgKiBAYXBfc21lX2NhcGE6IEFQIFNNRSBjYXBhYmlsaXRpZXMsIGZsYWdzIGZyb20gJmVudW0gbmw4MDIxMV9hcF9zbWVfZmVhdHVyZXMuCisgKiBAaHRfY2FwYV9tb2RfbWFzazogIFNwZWNpZnkgd2hhdCBodF9jYXAgdmFsdWVzIGNhbiBiZSBvdmVyLXJpZGRlbi4KKyAqCUlmIG51bGwsIHRoZW4gbm9uZSBjYW4gYmUgb3Zlci1yaWRkZW4uCiAgKi8KIHN0cnVjdCB3aXBoeSB7CiAJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLwpAQCAtMTk3Nyw2ICsyMDM2LDEzIEBACiAJdTMyIGF2YWlsYWJsZV9hbnRlbm5hc190eDsKIAl1MzIgYXZhaWxhYmxlX2FudGVubmFzX3J4OwogCisJLyoKKwkgKiBCaXRtYXAgb2Ygc3VwcG9ydGVkIHByb3RvY29scyBmb3IgcHJvYmUgcmVzcG9uc2Ugb2ZmbG9hZGluZworCSAqIHNlZSAmZW51bSBubDgwMjExX3Byb2JlX3Jlc3Bfb2ZmbG9hZF9zdXBwb3J0X2F0dHIuIE9ubHkgdmFsaWQKKwkgKiB3aGVuIHRoZSB3aXBoeSBmbGFnIEBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRCBpcyBzZXQuCisJICovCisJdTMyIHByb2JlX3Jlc3Bfb2ZmbG9hZDsKKwogCS8qIElmIG11bHRpcGxlIHdpcGh5cyBhcmUgcmVnaXN0ZXJlZCBhbmQgeW91J3JlIGhhbmRlZCBlLmcuCiAJICogYSByZWd1bGFyIG5ldGRldiB3aXRoIGFzc2lnbmVkIGllZWU4MDIxMV9wdHIsIHlvdSB3b24ndAogCSAqIGtub3cgd2hldGhlciBpdCBwb2ludHMgdG8gYSB3aXBoeSB5b3VyIGRyaXZlciBoYXMgcmVnaXN0ZXJlZApAQCAtMjAwNCw2ICsyMDcwLDggQEAKIAkvKiBkaXIgaW4gZGVidWdmczogaWVlZTgwMjExLzx3aXBoeW5hbWU+ICovCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcjsKIAorCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21vZF9tYXNrOworCiAjaWZkZWYgQ09ORklHX05FVF9OUwogCS8qIHRoZSBuZXR3b3JrIG5hbWVzcGFjZSB0aGlzIHBoeSBsaXZlcyBpbiBjdXJyZW50bHkgKi8KIAlzdHJ1Y3QgbmV0ICpfbmV0OwpAQCAtMjM2OCw2OSArMjQzNiw2IEBACiBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcls2XTsKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyWzZdOwogCi0vKiBQYXJzZWQgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLXN0cnVjdCBpZWVlODAyXzExX2VsZW1zIHsKLQl1OCAqaWVfc3RhcnQ7Ci0Jc2l6ZV90IHRvdGFsX2xlbjsKLQotCS8qIHBvaW50ZXJzIHRvIElFcyAqLwotCXU4ICpzc2lkOwotCXU4ICpzdXBwX3JhdGVzOwotCXU4ICpmaF9wYXJhbXM7Ci0JdTggKmRzX3BhcmFtczsKLQl1OCAqY2ZfcGFyYW1zOwotCXN0cnVjdCBpZWVlODAyMTFfdGltX2llICp0aW07Ci0JdTggKmlic3NfcGFyYW1zOwotCXU4ICpjaGFsbGVuZ2U7Ci0JdTggKndwYTsKLQl1OCAqcnNuOwotCXU4ICplcnBfaW5mbzsKLQl1OCAqZXh0X3N1cHBfcmF0ZXM7Ci0JdTggKndtbV9pbmZvOwotCXU4ICp3bW1fcGFyYW07Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9lbGVtOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mb19lbGVtOwotCXN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUgKm1lc2hfY29uZmlnOwotCXU4ICptZXNoX2lkOwotCXU4ICpwZWVyaW5nOwotCXU4ICpwcmVxOwotCXU4ICpwcmVwOwotCXU4ICpwZXJyOwotCXN0cnVjdCBpZWVlODAyMTFfcmFubl9pZSAqcmFubjsKLQl1OCAqY2hfc3dpdGNoX2VsZW07Ci0JdTggKmNvdW50cnlfZWxlbTsKLQl1OCAqcHdyX2NvbnN0cl9lbGVtOwotCXU4ICpxdWlldF9lbGVtOwkvKiBmaXJzdCBxdWl0ZSBlbGVtZW50ICovCi0JdTggKnRpbWVvdXRfaW50OwotCi0JLyogbGVuZ3RoIG9mIHRoZW0sIHJlc3BlY3RpdmVseSAqLwotCXU4IHNzaWRfbGVuOwotCXU4IHN1cHBfcmF0ZXNfbGVuOwotCXU4IGZoX3BhcmFtc19sZW47Ci0JdTggZHNfcGFyYW1zX2xlbjsKLQl1OCBjZl9wYXJhbXNfbGVuOwotCXU4IHRpbV9sZW47Ci0JdTggaWJzc19wYXJhbXNfbGVuOwotCXU4IGNoYWxsZW5nZV9sZW47Ci0JdTggd3BhX2xlbjsKLQl1OCByc25fbGVuOwotCXU4IGVycF9pbmZvX2xlbjsKLQl1OCBleHRfc3VwcF9yYXRlc19sZW47Ci0JdTggd21tX2luZm9fbGVuOwotCXU4IHdtbV9wYXJhbV9sZW47Ci0JdTggbWVzaF9pZF9sZW47Ci0JdTggcGVlcmluZ19sZW47Ci0JdTggcHJlcV9sZW47Ci0JdTggcHJlcF9sZW47Ci0JdTggcGVycl9sZW47Ci0JdTggY2hfc3dpdGNoX2VsZW1fbGVuOwotCXU4IGNvdW50cnlfZWxlbV9sZW47Ci0JdTggcHdyX2NvbnN0cl9lbGVtX2xlbjsKLQl1OCBxdWlldF9lbGVtX2xlbjsKLQl1OCBudW1fb2ZfcXVpZXRfZWxlbTsJLyogY2FuIGJlIG1vcmUgdGhlIG9uZSAqLwotCXU4IHRpbWVvdXRfaW50X2xlbjsKLX07Ci0KIC8qKgogICogaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2IgLSBnZXQgaGVhZGVyIGxlbmd0aCBmcm9tIGRhdGEKICAqCkBAIC0zMDY2LDYgKzMwNzEsMzIgQEAKIAkJICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApOwogCiAvKioKKyAqIGNmZzgwMjExX3JvYW1lZF9ic3MgLSBub3RpZnkgY2ZnODAyMTEgb2Ygcm9hbWluZworICoKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKiBAYnNzOiBlbnRyeSBvZiBic3MgdG8gd2hpY2ggU1RBIGdvdCByb2FtZWQKKyAqIEByZXFfaWU6IGFzc29jaWF0aW9uIHJlcXVlc3QgSUVzIChtYXliZSBiZSAlTlVMTCkKKyAqIEByZXFfaWVfbGVuOiBhc3NvY2lhdGlvbiByZXF1ZXN0IElFcyBsZW5ndGgKKyAqIEByZXNwX2llOiBhc3NvY2lhdGlvbiByZXNwb25zZSBJRXMgKG1heSBiZSAlTlVMTCkKKyAqIEByZXNwX2llX2xlbjogYXNzb2MgcmVzcG9uc2UgSUVzIGxlbmd0aAorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgdG8gbm90aWZ5IGNmZzgwMjExIG9mIHJvYW1pbmcgZXZlbnQgd2l0aCBkcml2ZXIKKyAqIHBhc3NpbmcgYnNzIHRvIGF2b2lkIGEgcmFjZSBpbiB0aW1lb3V0IG9mIHRoZSBic3MgZW50cnkuIEl0IHNob3VsZCBiZQorICogY2FsbGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGRyaXZlciB3aGVuZXZlciBpdCByb2FtZWQgZnJvbSBvbmUgQVAgdG8gYW5vdGhlcgorICogd2hpbGUgY29ubmVjdGVkLiBEcml2ZXJzIHdoaWNoIGhhdmUgcm9hbWluZyBpbXBsZW1lbnRlZCBpbiBmaXJtd2FyZQorICogbWF5IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGF2b2lkIGEgcmFjZSBpbiBic3MgZW50cnkgdGltZW91dCB3aGVyZSB0aGUgYnNzCisgKiBlbnRyeSBvZiB0aGUgbmV3IEFQIGlzIHNlZW4gaW4gdGhlIGRyaXZlciwgYnV0IGdldHMgdGltZWQgb3V0IGJ5IHRoZSB0aW1lCisgKiBpdCBpcyBhY2Nlc3NlZCBpbiBfX2NmZzgwMjExX3JvYW1lZCgpIGR1ZSB0byBkZWxheSBpbiBzY2hlZHVsaW5nCisgKiByZGV2LT5ldmVudF93b3JrLiBJbiBjYXNlIG9mIGFueSBmYWlsdXJlcywgdGhlIHJlZmVyZW5jZSBpcyByZWxlYXNlZAorICogZWl0aGVyIGluIGNmZzgwMjExX3JvYW1lZF9ic3MoKSBvciBpbiBfX2NmZzgwMjExX3JvbWVkKCksIE90aGVyd2lzZSwKKyAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hpbGUgZGljb25uZXRpbmcgZnJvbSB0aGUgY3VycmVudCBic3MuCisgKi8KK3ZvaWQgY2ZnODAyMTFfcm9hbWVkX2JzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MsCisJCQkgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCisJCQkgY29uc3QgdTggKnJlc3BfaWUsIHNpemVfdCByZXNwX2llX2xlbiwgZ2ZwX3QgZ2ZwKTsKKworLyoqCiAgKiBjZmc4MDIxMV9kaXNjb25uZWN0ZWQgLSBub3RpZnkgY2ZnODAyMTEgdGhhdCBjb25uZWN0aW9uIHdhcyBkcm9wcGVkCiAgKgogICogQGRldjogbmV0d29yayBkZXZpY2UKQEAgLTMyNzAsNiArMzMwMSwxNiBAQAogCQkJCSBjb25zdCB1OCAqZnJhbWUsIHNpemVfdCBsZW4sCiAJCQkJIGludCBmcmVxLCBnZnBfdCBnZnApOwogCisvKgorICogY2ZnODAyMTFfY2FuX2JlYWNvbl9zZWNfY2hhbiAtIHRlc3QgaWYgaHQ0MCBvbiBleHRlbnNpb24gY2hhbm5lbCBjYW4gYmUgdXNlZAorICogQHdpcGh5OiB0aGUgd2lwaHkKKyAqIEBjaGFuOiBtYWluIGNoYW5uZWwKKyAqIEBjaGFubmVsX3R5cGU6IEhUIG1vZGUKKyAqLworaW50IGNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorCQkJCSBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSk7CisKIC8qIExvZ2dpbmcsIGRlYnVnZ2luZyBhbmQgdHJvdWJsZXNob290aW5nL2RpYWdub3N0aWMgaGVscGVycy4gKi8KIAogLyogd2lwaHlfcHJpbnRrIGhlbHBlcnMsIHNpbWlsYXIgdG8gZGV2X3ByaW50ayAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAppbmRleCA3ZTJjNGQ0Li43MTM5MjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAorKysgYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaApAQCAtMjcxLDE0ICsyNzEsNiBAQAogI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfTUNTX0ZFQ19MRFBDCQkweDEwCiAKIAotLyogVWdseSBtYWNybyB0byBjb252ZXJ0IGxpdGVyYWwgY2hhbm5lbCBudW1iZXJzIGludG8gdGhlaXIgbWh6IGVxdWl2YWxlbnRzCi0gKiBUaGVyZSBhcmUgY2VydGlhbmx5IHNvbWUgY29uZGl0aW9ucyB0aGF0IHdpbGwgYnJlYWsgdGhpcyAobGlrZSBmZWVkaW5nIGl0ICczMCcpCi0gKiBidXQgdGhleSBzaG91bGRuJ3QgYXJpc2Ugc2luY2Ugbm90aGluZyB0YWxrcyBvbiBjaGFubmVsIDMwLiAqLwotI2RlZmluZSBpZWVlODAyMTFjaGFuMm1oeih4KSBcCi0JKCgoeCkgPD0gMTQpID8gXAotCSgoKHgpID09IDE0KSA/IDI0ODQgOiAoKHgpICogNSkgKyAyNDA3KSA6IFwKLQkoKHgpICsgMTAwMCkgKiA1KQotCiAvKiBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbih1bnNpZ25lZCBjaGFyICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAppbmRleCBmOTFhMWZiLi5lOGMyNWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaApAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX3ZzLmggYi9pbmNsdWRlL25ldC9pcF92cy5oCmluZGV4IDhmYTQ0MzAuLjg3M2Q1YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX3ZzLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfdnMuaApAQCAtNDI1LDkgKzQyNSw5IEBACiAKIAljb25zdCBjaGFyICooKnN0YXRlX25hbWUpKGludCBzdGF0ZSk7CiAKLQlpbnQgKCpzdGF0ZV90cmFuc2l0aW9uKShzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCi0JCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpOworCXZvaWQgKCpzdGF0ZV90cmFuc2l0aW9uKShzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsIGludCBkaXJlY3Rpb24sCisJCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCk7CiAKIAlpbnQgKCpyZWdpc3Rlcl9hcHApKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwX3ZzX2FwcCAqaW5jKTsKIApAQCAtMTEyNiwxNyArMTEyNiwxNiBAQAogc3RydWN0IGlwX3ZzX3BlICppcF92c19wZV9nZXRieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgaXBfdnNfcGUgKl9faXBfdnNfcGVfZ2V0YnluYW1lKGNvbnN0IGNoYXIgKnBlX25hbWUpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfcGVfZ2V0KGNvbnN0IHN0cnVjdCBpcF92c19wZSAqcGUpCi17Ci0JaWYgKHBlICYmIHBlLT5tb2R1bGUpCisvKgorICogVXNlIGEgI2RlZmluZSB0byBhdm9pZCBhbGwgb2YgbW9kdWxlLmgganVzdCBmb3IgdGhlc2UgdHJpdmlhbCBvcHMKKyAqLworI2RlZmluZSBpcF92c19wZV9nZXQocGUpCQkJXAorCWlmIChwZSAmJiBwZS0+bW9kdWxlKQkJCVwKIAkJX19tb2R1bGVfZ2V0KHBlLT5tb2R1bGUpOwotfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdnNfcGVfcHV0KGNvbnN0IHN0cnVjdCBpcF92c19wZSAqcGUpCi17Ci0JaWYgKHBlICYmIHBlLT5tb2R1bGUpCisjZGVmaW5lIGlwX3ZzX3BlX3B1dChwZSkJCQlcCisJaWYgKHBlICYmIHBlLT5tb2R1bGUpCQkJXAogCQltb2R1bGVfcHV0KHBlLT5tb2R1bGUpOwotfQogCiAvKgogICoJSVBWUyBwcm90b2NvbCBmdW5jdGlvbnMgKGZyb20gaXBfdnNfcHJvdG8uYykKQEAgLTEzNzgsNyArMTM3Nyw3IEBACiAKIGV4dGVybiB2b2lkIGlwX3ZzX3VwZGF0ZV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAogCQkJCSAgIGludCBvdXRpbik7Ci1leHRlcm4gaW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCk7CitleHRlcm4gaW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQgaXBfdnNfbmZjdF9leHBlY3RfcmVsYXRlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkJICAgICAgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCB1X2ludDhfdCBwcm90bywKIAkJCQkgICAgICBjb25zdCBfX2JlMTYgcG9ydCwgaW50IGZyb21fcnMpOwpAQCAtMTM5Niw4ICsxMzk1LDcgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXBfdnNfY29uZmlybV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICBzdHJ1Y3QgaXBfdnNfY29ubiAqY3ApCitzdGF0aWMgaW5saW5lIGludCBpcF92c19jb25maXJtX2Nvbm50cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBORl9BQ0NFUFQ7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9saWI4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbGliODAyMTEuaAppbmRleCAyZWM4OTZiLi5kMTc4YzI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9saWI4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2xpYjgwMjExLmgKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC00Miw2ICs0MSw4IEBACiAJSUVFRTgwMjExX0NSWVBUT19US0lQX0NPVU5URVJNRUFTVVJFUyA9ICgxIDw8IDApLAogfTsKIAorc3RydWN0IG1vZHVsZTsKKwogc3RydWN0IGxpYjgwMjExX2NyeXB0b19vcHMgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKaW5kZXggMjcxNDY0Ni4uNWI1YzhhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCkBAIC0xNjYsNiArMTY2LDcgQEAKICAqCXRoYXQgaXQgaXMgb25seSBldmVyIGRpc2FibGVkIGZvciBzdGF0aW9uIG1vZGUuCiAgKiBAQlNTX0NIQU5HRURfSURMRTogSWRsZSBjaGFuZ2VkIGZvciB0aGlzIEJTUy9pbnRlcmZhY2UuCiAgKiBAQlNTX0NIQU5HRURfU1NJRDogU1NJRCBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKKyAqIEBCU1NfQ0hBTkdFRF9BUF9QUk9CRV9SRVNQOiBQcm9iZSBSZXNwb25zZSBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKICAqLwogZW51bSBpZWVlODAyMTFfYnNzX2NoYW5nZSB7CiAJQlNTX0NIQU5HRURfQVNTT0MJCT0gMTw8MCwKQEAgLTE4NCw2ICsxODUsNyBAQAogCUJTU19DSEFOR0VEX1FPUwkJCT0gMTw8MTMsCiAJQlNTX0NIQU5HRURfSURMRQkJPSAxPDwxNCwKIAlCU1NfQ0hBTkdFRF9TU0lECQk9IDE8PDE1LAorCUJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1AJPSAxPDwxNiwKIAogCS8qIHdoZW4gYWRkaW5nIGhlcmUsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgaWVlZTgwMjExX3JlY29uZmlnICovCiB9OwpAQCAtMTc1OCwxMSArMTc2MCwyMSBAQAogICoJc2tiIGNvbnRhaW5zIHRoZSBidWZmZXIgc3RhcnRpbmcgZnJvbSB0aGUgSUVFRSA4MDIuMTEgaGVhZGVyLgogICoJVGhlIGxvdy1sZXZlbCBkcml2ZXIgc2hvdWxkIHNlbmQgdGhlIGZyYW1lIG91dCBiYXNlZCBvbgogICoJY29uZmlndXJhdGlvbiBpbiB0aGUgVFggY29udHJvbCBkYXRhLiBUaGlzIGhhbmRsZXIgc2hvdWxkLAotICoJcHJlZmVyYWJseSwgbmV2ZXIgZmFpbCBhbmQgc3RvcCBxdWV1ZXMgYXBwcm9wcmlhdGVseSwgbW9yZQotICoJaW1wb3J0YW50bHksIGhvd2V2ZXIsIGl0IG11c3QgbmV2ZXIgZmFpbCBmb3IgQS1NUERVLXF1ZXVlcy4KLSAqCVRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBORVRERVZfVFhfT0sgZXhjZXB0IGluIHZlcnkKLSAqCWxpbWl0ZWQgY2FzZXMuCi0gKglNdXN0IGJlIGltcGxlbWVudGVkIGFuZCBhdG9taWMuCisgKglwcmVmZXJhYmx5LCBuZXZlciBmYWlsIGFuZCBzdG9wIHF1ZXVlcyBhcHByb3ByaWF0ZWx5LgorICoJVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGlmIEB0eF9mcmFncyBpcyBub3QuCisgKglNdXN0IGJlIGF0b21pYy4KKyAqCisgKiBAdHhfZnJhZ3M6IENhbGxlZCB0byB0cmFuc21pdCBtdWx0aXBsZSBmcmFnbWVudHMgb2YgYSBzaW5nbGUgTVNEVS4KKyAqCVRoaXMgaGFuZGxlciBtdXN0IGNvbnN1bWUgYWxsIGZyYWdtZW50cywgc2VuZGluZyBvdXQgc29tZSBvZgorICoJdGhlbSBvbmx5IGlzIHVzZWxlc3MgYW5kIGl0IGNhbid0IGFzayBmb3Igc29tZSBvZiB0aGVtIHRvIGJlCisgKglxdWV1ZWQgYWdhaW4uIElmIHRoZSBmcmFtZSBpcyBub3QgZnJhZ21lbnRlZCB0aGUgcXVldWUgaGFzIGEKKyAqCXNpbmdsZSBTS0Igb25seS4gVG8gYXZvaWQgaXNzdWVzIHdpdGggdGhlIG5ldHdvcmtpbmcgc3RhY2sKKyAqCXdoZW4gVFggc3RhdHVzIGlzIHJlcG9ydGVkIHRoZSBmcmFtZXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbQorICoJdGhlIHNrYiBxdWV1ZS4KKyAqCUlmIHRoaXMgaXMgdXNlZCwgdGhlIHR4X2luZm8gQHZpZiBhbmQgQHN0YSBwb2ludGVycyB3aWxsIGJlCisgKglpbnZhbGlkIC0tIHlvdSBtdXN0IG5vdCB1c2UgdGhlbSBpbiB0aGF0IGNhc2UuCisgKglUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaWYgQHR4IGlzbid0LgorICoJTXVzdCBiZSBhdG9taWMuCiAgKgogICogQHN0YXJ0OiBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBuZXRkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIGhhcmR3YXJlCiAgKglpcyBlbmFibGVkLiBUaGlzIHNob3VsZCB0dXJuIG9uIHRoZSBoYXJkd2FyZSBhbmQgbXVzdCB0dXJuIG9uCkBAIC0yMDk5LDYgKzIxMTEsOCBAQAogICovCiBzdHJ1Y3QgaWVlZTgwMjExX29wcyB7CiAJdm9pZCAoKnR4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZCAoKnR4X2ZyYWdzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JzKTsKIAlpbnQgKCpzdGFydCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAjaWZkZWYgQ09ORklHX1BNCkBAIC0yNjc1LDYgKzI2ODksMTkgQEAKIH0KIAogLyoqCisgKiBpZWVlODAyMTFfcHJvYmVyZXNwX2dldCAtIHJldHJpZXZlIGEgUHJvYmUgUmVzcG9uc2UgdGVtcGxhdGUKKyAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqCisgKiBDcmVhdGVzIGEgUHJvYmUgUmVzcG9uc2UgdGVtcGxhdGUgd2hpY2ggY2FuLCBmb3IgZXhhbXBsZSwgYmUgdXBsb2FkZWQgdG8KKyAqIGhhcmR3YXJlLiBUaGUgZGVzdGluYXRpb24gYWRkcmVzcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGluIEFQIG1vZGUuCisgKi8KK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVyZXNwX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CisKKy8qKgogICogaWVlZTgwMjExX3BzcG9sbF9nZXQgLSByZXRyaWV2ZSBhIFBTIFBvbGwgdGVtcGxhdGUKICAqIEBodzogcG9pbnRlciBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpLgogICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAppbmRleCAwYjdmMDVlLi44YTJiMGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCkBAIC0zMTMsNiArMzEzLDggQEAKIAlyZXR1cm4gc2tiLT5kZXYgJiYgc2tiLT5za2JfaWlmICYmIHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKIH0KIAorc3RydWN0IGtlcm5lbF9wYXJhbTsKKwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKaW5kZXggN2NhNmJkZC4uMmY4ZmI3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaApAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0X251bGxzLmg+CiAKIC8qIEEgYHR1cGxlJyBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiB0byB1bmlxdWVseQpAQCAtMjQsMzIgKzI1LDYgQEAKIAogI2RlZmluZSBORl9DVF9UVVBMRV9MM1NJWkUJQVJSQVlfU0laRSgoKHVuaW9uIG5mX2luZXRfYWRkciAqKU5VTEwpLT5hbGwpCiAKLS8qIFRoZSBwcm90b2NvbC1zcGVjaWZpYyBtYW5pcHVsYWJsZSBwYXJ0cyBvZiB0aGUgdHVwbGU6IGFsd2F5cyBpbgotICAgbmV0d29yayBvcmRlciEgKi8KLXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gewotCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KLQlfX2JlMTYgYWxsOwotCi0Jc3RydWN0IHsKLQkJX19iZTE2IHBvcnQ7Ci0JfSB0Y3A7Ci0Jc3RydWN0IHsKLQkJX19iZTE2IHBvcnQ7Ci0JfSB1ZHA7Ci0Jc3RydWN0IHsKLQkJX19iZTE2IGlkOwotCX0gaWNtcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IGRjY3A7Ci0Jc3RydWN0IHsKLQkJX19iZTE2IHBvcnQ7Ci0JfSBzY3RwOwotCXN0cnVjdCB7Ci0JCV9fYmUxNiBrZXk7CS8qIEdSRSBrZXkgaXMgMzJiaXQsIFBQdFAgb25seSB1c2VzIDE2Yml0ICovCi0JfSBncmU7Ci19OwotCiAvKiBUaGUgbWFuaXB1bGFibGUgcGFydCBvZiB0aGUgdHVwbGUuICovCiBzdHJ1Y3QgbmZfY29ubnRyYWNrX21hbiB7CiAJdW5pb24gbmZfaW5ldF9hZGRyIHUzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCmluZGV4IDkyMDk5N2YuLmU5OTFiZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKQEAgLTUzLDEyICs1MywxMyBAQAogdm9pZCBuZl9sb2dfdW5iaW5kX3BmKHVfaW50OF90IHBmKTsKIAogLyogQ2FsbHMgdGhlIHJlZ2lzdGVyZWQgYmFja2VuZCBsb2dnaW5nIGZ1bmN0aW9uICovCitfX3ByaW50Zig3LCA4KQogdm9pZCBuZl9sb2dfcGFja2V0KHVfaW50OF90IHBmLAogCQkgICB1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqbGksCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50Ziw3LDgpKSk7CisJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogI2VuZGlmIC8qIF9ORl9MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCmluZGV4IDAzNDZiMDAuLmI4ODcyZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9ORl9OQVRfSAogI2RlZmluZSBfTkZfTkFUX0gKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmg+CiAKICNkZWZpbmUgTkZfTkFUX01BUFBJTkdfVFlQRV9NQVhfTkFNRUxFTiAxNgpAQCAtMTQsMTEgKzE1LDYgQEAKICNkZWZpbmUgSE9PSzJNQU5JUChob29rbnVtKSAoKGhvb2tudW0pICE9IE5GX0lORVRfUE9TVF9ST1VUSU5HICYmIFwKIAkJCSAgICAgKGhvb2tudW0pICE9IE5GX0lORVRfTE9DQUxfSU4pCiAKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQotI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0Ci0jZGVmaW5lIElQX05BVF9SQU5HRV9QRVJTSVNURU5UIDgKLQogLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCiBzdHJ1Y3QgbmZfbmF0X3NlcSB7CiAJLyogcG9zaXRpb24gb2YgdGhlIGxhc3QgVENQIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb24gKGlmIGFueSkgKi8KQEAgLTI4LDI2ICsyNCw2IEBACiAJaW50MTZfdCBvZmZzZXRfYmVmb3JlLCBvZmZzZXRfYWZ0ZXI7CiB9OwogCi0vKiBTaW5nbGUgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4gKi8KLXN0cnVjdCBuZl9uYXRfcmFuZ2UgewotCS8qIFNldCB0byBPUiBvZiBmbGFncyBhYm92ZS4gKi8KLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0KLQkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIuICovCi0JX19iZTMyIG1pbl9pcCwgbWF4X2lwOwotCi0JLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyICovCi0JdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byBtaW4sIG1heDsKLX07Ci0KLS8qIEZvciBiYWNrd2FyZHMgY29tcGF0OiBkb24ndCB1c2UgaW4gbW9kZXJuIGNvZGUuICovCi1zdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCB7Ci0JdW5zaWduZWQgaW50IHJhbmdlc2l6ZTsgLyogTXVzdCBiZSAxLiAqLwotCi0JLyogaGFuZ3Mgb2ZmIGVuZC4gKi8KLQlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlWzFdOwotfTsKLQogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaAppbmRleCA5OGMxODU0Li5jYjFmMzUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCkBAIC0xOTIsOCArMTkyLDE1IEBACiAgKiAgICBOTEFfTlVMX1NUUklORyAgICAgICBNYXhpbXVtIGxlbmd0aCBvZiBzdHJpbmcgKGV4Y2x1ZGluZyBOVUwpCiAgKiAgICBOTEFfRkxBRyAgICAgICAgICAgICBVbnVzZWQKICAqICAgIE5MQV9CSU5BUlkgICAgICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCi0gKiAgICBOTEFfTkVTVEVEX0NPTVBBVCAgICBFeGFjdCBsZW5ndGggb2Ygc3RydWN0dXJlIHBheWxvYWQKLSAqICAgIEFsbCBvdGhlciAgICAgICAgICAgIEV4YWN0IGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICogICAgTkxBX05FU1RFRCAgICAgICAgICAgRG9uJ3QgdXNlIGBsZW4nIGZpZWxkIC0tIGxlbmd0aCB2ZXJpZmljYXRpb24gaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgYnkgY2hlY2tpbmcgbGVuIG9mIG5lc3RlZCBoZWFkZXIgKG9yIGVtcHR5KQorICogICAgTkxBX05FU1RFRF9DT01QQVQgICAgTWluaW11bSBsZW5ndGggb2Ygc3RydWN0dXJlIHBheWxvYWQKKyAqICAgIE5MQV9VOCwgTkxBX1UxNiwKKyAqICAgIE5MQV9VMzIsIE5MQV9VNjQsCisgKiAgICBOTEFfTVNFQ1MgICAgICAgICAgICBMZWF2aW5nIHRoZSBsZW5ndGggZmllbGQgemVybyB3aWxsIHZlcmlmeSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIHR5cGUgZml0cywgdXNpbmcgaXQgdmVyaWZpZXMgbWluaW11bSBsZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgbGlrZSAiQWxsIG90aGVyIgorICogICAgQWxsIG90aGVyICAgICAgICAgICAgTWluaW11bSBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKICAqCiAgKiBFeGFtcGxlOgogICogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG15X3BvbGljeVtBVFRSX01BWCsxXSA9IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy9uY2kuaCBiL2luY2x1ZGUvbmV0L25mYy9uY2kuaAppbmRleCAzOWI4NWJjLi5iNjFlYjZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZmMvbmNpLmgKKysrIGIvaW5jbHVkZS9uZXQvbmZjL25jaS5oCkBAIC0zNCwzMSArMzQsMzAgQEAKICNkZWZpbmUgTkNJX01BWF9OVU1fQ09OTgkJCQkJMTAKIAogLyogTkNJIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX09LCQkJCQkJMHgwMAotI2RlZmluZQlOQ0lfU1RBVFVTX1JFSkVDVEVECQkJCQkweDAxCi0jZGVmaW5lCU5DSV9TVEFUVVNfTUVTU0FHRV9DT1JSVVBURUQJCQkJMHgwMgotI2RlZmluZQlOQ0lfU1RBVFVTX0JVRkZFUl9GVUxMCQkJCQkweDAzCi0jZGVmaW5lCU5DSV9TVEFUVVNfRkFJTEVECQkJCQkweDA0Ci0jZGVmaW5lCU5DSV9TVEFUVVNfTk9UX0lOSVRJQUxJWkVECQkJCTB4MDUKLSNkZWZpbmUJTkNJX1NUQVRVU19TWU5UQVhfRVJST1IJCQkJCTB4MDYKLSNkZWZpbmUJTkNJX1NUQVRVU19TRU1BTlRJQ19FUlJPUgkJCQkweDA3Ci0jZGVmaW5lCU5DSV9TVEFUVVNfVU5LTk9XTl9HSUQJCQkJCTB4MDgKLSNkZWZpbmUJTkNJX1NUQVRVU19VTktOT1dOX09JRAkJCQkJMHgwOQotI2RlZmluZQlOQ0lfU1RBVFVTX0lOVkFMSURfUEFSQU0JCQkJMHgwYQotI2RlZmluZQlOQ0lfU1RBVFVTX01FU1NBR0VfU0laRV9FWENFRURFRAkJCTB4MGIKKyNkZWZpbmUgTkNJX1NUQVRVU19PSwkJCQkJCTB4MDAKKyNkZWZpbmUgTkNJX1NUQVRVU19SRUpFQ1RFRAkJCQkJMHgwMQorI2RlZmluZSBOQ0lfU1RBVFVTX1JGX0ZSQU1FX0NPUlJVUFRFRAkJCQkweDAyCisjZGVmaW5lIE5DSV9TVEFUVVNfRkFJTEVECQkJCQkweDAzCisjZGVmaW5lIE5DSV9TVEFUVVNfTk9UX0lOSVRJQUxJWkVECQkJCTB4MDQKKyNkZWZpbmUgTkNJX1NUQVRVU19TWU5UQVhfRVJST1IJCQkJCTB4MDUKKyNkZWZpbmUgTkNJX1NUQVRVU19TRU1BTlRJQ19FUlJPUgkJCQkweDA2CisjZGVmaW5lIE5DSV9TVEFUVVNfVU5LTk9XTl9HSUQJCQkJCTB4MDcKKyNkZWZpbmUgTkNJX1NUQVRVU19VTktOT1dOX09JRAkJCQkJMHgwOAorI2RlZmluZSBOQ0lfU1RBVFVTX0lOVkFMSURfUEFSQU0JCQkJMHgwOQorI2RlZmluZSBOQ0lfU1RBVFVTX01FU1NBR0VfU0laRV9FWENFRURFRAkJCTB4MGEKIC8qIERpc2NvdmVyeSBTcGVjaWZpYyBTdGF0dXMgQ29kZXMgKi8KLSNkZWZpbmUJTkNJX1NUQVRVU19ESVNDT1ZFUllfQUxSRUFEWV9TVEFSVEVECQkJMHhhMAotI2RlZmluZQlOQ0lfU1RBVFVTX0RJU0NPVkVSWV9UQVJHRVRfQUNUSVZBVElPTl9GQUlMRUQJCTB4YTEKKyNkZWZpbmUgTkNJX1NUQVRVU19ESVNDT1ZFUllfQUxSRUFEWV9TVEFSVEVECQkJMHhhMAorI2RlZmluZSBOQ0lfU1RBVFVTX0RJU0NPVkVSWV9UQVJHRVRfQUNUSVZBVElPTl9GQUlMRUQJCTB4YTEKKyNkZWZpbmUgTkNJX1NUQVRVU19ESVNDT1ZFUllfVEVBUl9ET1dOCQkJCTB4YTIKIC8qIFJGIEludGVyZmFjZSBTcGVjaWZpYyBTdGF0dXMgQ29kZXMgKi8KLSNkZWZpbmUJTkNJX1NUQVRVU19SRl9UUkFOU01JU1NJT05fRVJST1IJCQkweGIwCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkZfUFJPVE9DT0xfRVJST1IJCQkJMHhiMQotI2RlZmluZQlOQ0lfU1RBVFVTX1JGX1RJTUVPVVRfRVJST1IJCQkJMHhiMgotI2RlZmluZQlOQ0lfU1RBVFVTX1JGX0xJTktfTE9TU19FUlJPUgkJCQkweGIzCisjZGVmaW5lIE5DSV9TVEFUVVNfUkZfVFJBTlNNSVNTSU9OX0VSUk9SCQkJMHhiMAorI2RlZmluZSBOQ0lfU1RBVFVTX1JGX1BST1RPQ09MX0VSUk9SCQkJCTB4YjEKKyNkZWZpbmUgTkNJX1NUQVRVU19SRl9USU1FT1VUX0VSUk9SCQkJCTB4YjIKIC8qIE5GQ0VFIEludGVyZmFjZSBTcGVjaWZpYyBTdGF0dXMgQ29kZXMgKi8KLSNkZWZpbmUJTkNJX1NUQVRVU19NQVhfQUNUSVZFX05GQ0VFX0lOVEVSRkFDRVNfUkVBQ0hFRAkJMHhjMAotI2RlZmluZQlOQ0lfU1RBVFVTX05GQ0VFX0lOVEVSRkFDRV9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhjMQotI2RlZmluZQlOQ0lfU1RBVFVTX05GQ0VFX1RSQU5TTUlTU0lPTl9FUlJPUgkJCTB4YzIKLSNkZWZpbmUJTkNJX1NUQVRVU19ORkNFRV9QUk9UT0NPTF9FUlJPUgkJCQkweGMzCisjZGVmaW5lIE5DSV9TVEFUVVNfTUFYX0FDVElWRV9ORkNFRV9JTlRFUkZBQ0VTX1JFQUNIRUQJCTB4YzAKKyNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9JTlRFUkZBQ0VfQUNUSVZBVElPTl9GQUlMRUQJCTB4YzEKKyNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9UUkFOU01JU1NJT05fRVJST1IJCQkweGMyCisjZGVmaW5lIE5DSV9TVEFUVVNfTkZDRUVfUFJPVE9DT0xfRVJST1IJCQkJMHhjMwogI2RlZmluZSBOQ0lfU1RBVFVTX05GQ0VFX1RJTUVPVVRfRVJST1IJCQkJMHhjNAogCiAvKiBOQ0kgUkYgVGVjaG5vbG9neSBhbmQgTW9kZSAqLwpAQCAtNzMsNiArNzIsMjEgQEAKICNkZWZpbmUgTkNJX05GQ19BX0FDVElWRV9MSVNURU5fTU9ERQkJCQkweDgzCiAjZGVmaW5lIE5DSV9ORkNfRl9BQ1RJVkVfTElTVEVOX01PREUJCQkJMHg4NQogCisvKiBOQ0kgUkYgVGVjaG5vbG9naWVzICovCisjZGVmaW5lIE5DSV9ORkNfUkZfVEVDSE5PTE9HWV9BCQkJCQkweDAwCisjZGVmaW5lIE5DSV9ORkNfUkZfVEVDSE5PTE9HWV9CCQkJCQkweDAxCisjZGVmaW5lIE5DSV9ORkNfUkZfVEVDSE5PTE9HWV9GCQkJCQkweDAyCisjZGVmaW5lIE5DSV9ORkNfUkZfVEVDSE5PTE9HWV8xNTY5MwkJCQkweDAzCisKKy8qIE5DSSBCaXQgUmF0ZXMgKi8KKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV8xMDYJCQkJCTB4MDAKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV8yMTIJCQkJCTB4MDEKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV80MjQJCQkJCTB4MDIKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV84NDgJCQkJCTB4MDMKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV8xNjk2CQkJCQkweDA0CisjZGVmaW5lIE5DSV9ORkNfQklUX1JBVEVfMzM5MgkJCQkJMHgwNQorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzY3ODQJCQkJCTB4MDYKKwogLyogTkNJIFJGIFByb3RvY29scyAqLwogI2RlZmluZSBOQ0lfUkZfUFJPVE9DT0xfVU5LTk9XTgkJCQkJMHgwMAogI2RlZmluZSBOQ0lfUkZfUFJPVE9DT0xfVDFUCQkJCQkweDAxCkBAIC04MiwxMCArOTYsMjAgQEAKICNkZWZpbmUgTkNJX1JGX1BST1RPQ09MX05GQ19ERVAJCQkJCTB4MDUKIAogLyogTkNJIFJGIEludGVyZmFjZXMgKi8KLSNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9SRlUJCQkJCTB4MDAKLSNkZWZpbmUJTkNJX1JGX0lOVEVSRkFDRV9GUkFNRQkJCQkJMHgwMQotI2RlZmluZQlOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVAJCQkJMHgwMgotI2RlZmluZQlOQ0lfUkZfSU5URVJGQUNFX05GQ19ERVAJCQkJMHgwMworI2RlZmluZSBOQ0lfUkZfSU5URVJGQUNFX05GQ0VFX0RJUkVDVAkJCQkweDAwCisjZGVmaW5lIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUUJCQkJCTB4MDEKKyNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9JU09fREVQCQkJCTB4MDIKKyNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9ORkNfREVQCQkJCTB4MDMKKworLyogTkNJIFJlc2V0IHR5cGVzICovCisjZGVmaW5lIE5DSV9SRVNFVF9UWVBFX0tFRVBfQ09ORklHCQkJCTB4MDAKKyNkZWZpbmUgTkNJX1JFU0VUX1RZUEVfUkVTRVRfQ09ORklHCQkJCTB4MDEKKworLyogTkNJIFN0YXRpYyBSRiBjb25uZWN0aW9uIElEICovCisjZGVmaW5lIE5DSV9TVEFUSUNfUkZfQ09OTl9JRAkJCQkJMHgwMAorCisvKiBOQ0kgRGF0YSBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgTkNJX0RBVEFfRkxPV19DT05UUk9MX05PVF9VU0VECQkJCTB4ZmYKIAogLyogTkNJIFJGX0RJU0NPVkVSX01BUF9DTUQgbW9kZXMgKi8KICNkZWZpbmUgTkNJX0RJU0NfTUFQX01PREVfUE9MTAkJCQkJMHgwMQpAQCAtOTQsMjUgKzExOCwyMiBAQAogCiAvKiBOQ0kgRGlzY292ZXJ5IFR5cGVzICovCiAjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0FfUEFTU0lWRQkJCTB4MDAKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQl9QQVNTSVZFCQkJMHgwMQotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9GX1BBU1NJVkUJCQkweDAyCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0FfQUNUSVZFCQkJMHgwMwotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9GX0FDVElWRQkJCTB4MDUKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1dBS0VVUF9BX1BBU1NJVkUJCQkweDA2Ci0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9XQUtFVVBfQl9QQVNTSVZFCQkJMHgwNwotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfV0FLRVVQX0FfQUNUSVZFCQkJMHgwOQotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0FfUEFTU0lWRQkJCTB4ODAKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX0xJU1RFTl9CX1BBU1NJVkUJCQkweDgxCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fRl9QQVNTSVZFCQkJMHg4MgotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0FfQUNUSVZFCQkJMHg4MwotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0ZfQUNUSVZFCQkJMHg4NQorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9CX1BBU1NJVkUJCQkweDAxCisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfUEFTU0lWRQkJCTB4MDIKKyNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9BQ1RJVkUJCQkweDAzCisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfQUNUSVZFCQkJMHgwNQorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfV0FLRVVQX0FfQUNUSVZFCQkJMHgwOQorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0FfUEFTU0lWRQkJCTB4ODAKKyNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX0xJU1RFTl9CX1BBU1NJVkUJCQkweDgxCisjZGVmaW5lIE5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fRl9QQVNTSVZFCQkJMHg4MgorI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0FfQUNUSVZFCQkJMHg4MworI2RlZmluZSBOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0ZfQUNUSVZFCQkJMHg4NQogCiAvKiBOQ0kgRGVhY3RpdmF0aW9uIFR5cGUgKi8KLSNkZWZpbmUJTkNJX0RFQUNUSVZBVEVfVFlQRV9JRExFX01PREUJCQkJMHgwMAotI2RlZmluZQlOQ0lfREVBQ1RJVkFURV9UWVBFX1NMRUVQX01PREUJCQkJMHgwMQotI2RlZmluZQlOQ0lfREVBQ1RJVkFURV9UWVBFX1NMRUVQX0FGX01PREUJCQkweDAyCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfUkZfTElOS19MT1NTCQkJMHgwMwotI2RlZmluZQlOQ0lfREVBQ1RJVkFURV9UWVBFX0RJU0NPVkVSWV9FUlJPUgkJCTB4MDQKKyNkZWZpbmUgTkNJX0RFQUNUSVZBVEVfVFlQRV9JRExFX01PREUJCQkJMHgwMAorI2RlZmluZSBOQ0lfREVBQ1RJVkFURV9UWVBFX1NMRUVQX01PREUJCQkJMHgwMQorI2RlZmluZSBOQ0lfREVBQ1RJVkFURV9UWVBFX1NMRUVQX0FGX01PREUJCQkweDAyCisjZGVmaW5lIE5DSV9ERUFDVElWQVRFX1RZUEVfRElTQ09WRVJZCQkJCTB4MDMKIAogLyogTWVzc2FnZSBUeXBlIChNVCkgKi8KICNkZWZpbmUgTkNJX01UX0RBVEFfUEtUCQkJCQkJMHgwMApAQCAtMTQ0LDEwICsxNjUsMTAgQEAKICNkZWZpbmUgbmNpX2Nvbm5faWQoaGRyKQkJKF9fdTgpKCgoaGRyKVswXSkmMHgwZikKIAogLyogR0lEIHZhbHVlcyAqLwotI2RlZmluZQlOQ0lfR0lEX0NPUkUJCQkJCQkweDAKLSNkZWZpbmUJTkNJX0dJRF9SRl9NR01UCQkJCQkJMHgxCi0jZGVmaW5lCU5DSV9HSURfTkZDRUVfTUdNVAkJCQkJMHgyCi0jZGVmaW5lCU5DSV9HSURfUFJPUFJJRVRBUlkJCQkJCTB4ZgorI2RlZmluZSBOQ0lfR0lEX0NPUkUJCQkJCQkweDAKKyNkZWZpbmUgTkNJX0dJRF9SRl9NR01UCQkJCQkJMHgxCisjZGVmaW5lIE5DSV9HSURfTkZDRUVfTUdNVAkJCQkJMHgyCisjZGVmaW5lIE5DSV9HSURfUFJPUFJJRVRBUlkJCQkJCTB4ZgogCiAvKiAtLS0tIE5DSSBQYWNrZXQgc3RydWN0dXJlcyAtLS0tICovCiAjZGVmaW5lIE5DSV9DVFJMX0hEUl9TSVpFCQkJCQkzCkBAIC0xNjksMTggKzE5MCwxMSBAQAogLyogLS0tLS0gIE5DSSBDb21tYW5kcyAtLS0tICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICNkZWZpbmUgTkNJX09QX0NPUkVfUkVTRVRfQ01ECQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDAwKQotCi0jZGVmaW5lIE5DSV9PUF9DT1JFX0lOSVRfQ01ECQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDAxKQotCi0jZGVmaW5lIE5DSV9PUF9DT1JFX1NFVF9DT05GSUdfQ01ECW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDIpCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfQ09OTl9DUkVBVEVfQ01ECW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDQpCi1zdHJ1Y3QgbmNpX2NvcmVfY29ubl9jcmVhdGVfY21kIHsKLQlfX3U4CXRhcmdldF9oYW5kbGU7Ci0JX191OAludW1fdGFyZ2V0X3NwZWNpZmljX3BhcmFtczsKK3N0cnVjdCBuY2lfY29yZV9yZXNldF9jbWQgeworCV9fdTgJcmVzZXRfdHlwZTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTkNJX09QX0NPUkVfQ09OTl9DTE9TRV9DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNikKKyNkZWZpbmUgTkNJX09QX0NPUkVfSU5JVF9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDEpCiAKICNkZWZpbmUgTkNJX09QX1JGX0RJU0NPVkVSX01BUF9DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwMCkKIHN0cnVjdCBkaXNjX21hcF9jb25maWcgewpAQCAtMjE4LDYgKzIzMiw3IEBACiBzdHJ1Y3QgbmNpX2NvcmVfcmVzZXRfcnNwIHsKIAlfX3U4CXN0YXR1czsKIAlfX3U4CW5jaV92ZXI7CisJX191OAljb25maWdfc3RhdHVzOwogfSBfX3BhY2tlZDsKIAogI2RlZmluZSBOQ0lfT1BfQ09SRV9JTklUX1JTUAkJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMSkKQEAgLTIzMiwyNCArMjQ3LDE0IEBACiBzdHJ1Y3QgbmNpX2NvcmVfaW5pdF9yc3BfMiB7CiAJX191OAltYXhfbG9naWNhbF9jb25uZWN0aW9uczsKIAlfX2xlMTYJbWF4X3JvdXRpbmdfdGFibGVfc2l6ZTsKLQlfX3U4CW1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aDsKLQlfX2xlMTYJcmZfc2VuZGluZ19idWZmZXJfc2l6ZTsKLQlfX2xlMTYJcmZfcmVjZWl2aW5nX2J1ZmZlcl9zaXplOwotCV9fbGUxNgltYW51ZmFjdHVyZXJfaWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIE5DSV9PUF9DT1JFX1NFVF9DT05GSUdfUlNQCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDIpCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfQ09OTl9DUkVBVEVfUlNQCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDQpCi1zdHJ1Y3QgbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwIHsKLQlfX3U4CXN0YXR1czsKLQlfX3U4CW1heF9wa3RfcGF5bG9hZF9zaXplOworCV9fdTgJbWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuOworCV9fbGUxNgltYXhfc2l6ZV9mb3JfbGFyZ2VfcGFyYW1zOworCV9fdTgJbWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZTsKIAlfX3U4CWluaXRpYWxfbnVtX2NyZWRpdHM7Ci0JX191OAljb25uX2lkOworCV9fdTgJbWFudWZhY3RfaWQ7CisJX19sZTMyCW1hbnVmYWN0X3NwZWNpZmljX2luZm87CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE5DSV9PUF9DT1JFX0NPTk5fQ0xPU0VfUlNQCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDYpCi0KICNkZWZpbmUgTkNJX09QX1JGX0RJU0NPVkVSX01BUF9SU1AJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwMCkKIAogI2RlZmluZSBOQ0lfT1BfUkZfRElTQ09WRVJfUlNQCQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDAzKQpAQCAtMjcwLDEyICsyNzUsNyBAQAogCXN0cnVjdCBjb25uX2NyZWRpdF9lbnRyeQljb25uX2VudHJpZXNbTkNJX01BWF9OVU1fQ09OTl07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE5DSV9PUF9SRl9GSUVMRF9JTkZPX05URgluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDA4KQotc3RydWN0IG5jaV9yZl9maWVsZF9pbmZvX250ZiB7Ci0JX191OAlyZl9maWVsZF9zdGF0dXM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIE5DSV9PUF9SRl9BQ1RJVkFURV9OVEYJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDUpCisjZGVmaW5lIE5DSV9PUF9SRl9JTlRGX0FDVElWQVRFRF9OVEYJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwNSkKIHN0cnVjdCByZl90ZWNoX3NwZWNpZmljX3BhcmFtc19uZmNhX3BvbGwgewogCV9fdTE2CXNlbnNfcmVzOwogCV9fdTgJbmZjaWQxX2xlbjsJLyogMCwgNCwgNywgb3IgMTAgQnl0ZXMgKi8KQEAgLTI4OSwxNyArMjg5LDIwIEBACiAJX191OAlyYXRzX3Jlc1syMF07CiB9OwogCi1zdHJ1Y3QgbmNpX3JmX2FjdGl2YXRlX250ZiB7Ci0JX191OAl0YXJnZXRfaGFuZGxlOworc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgeworCV9fdTgJcmZfZGlzY292ZXJ5X2lkOworCV9fdTgJcmZfaW50ZXJmYWNlX3R5cGU7CiAJX191OAlyZl9wcm90b2NvbDsKLQlfX3U4CXJmX3RlY2hfYW5kX21vZGU7CisJX191OAlhY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGU7CiAJX191OAlyZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW47CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCByZl90ZWNoX3NwZWNpZmljX3BhcmFtc19uZmNhX3BvbGwgbmZjYV9wb2xsOwogCX0gcmZfdGVjaF9zcGVjaWZpY19wYXJhbXM7CiAKLQlfX3U4CXJmX2ludGVyZmFjZV90eXBlOworCV9fdTgJZGF0YV9leGNoX3JmX3RlY2hfYW5kX21vZGU7CisJX191OAlkYXRhX2V4Y2hfdHhfYml0X3JhdGU7CisJX191OAlkYXRhX2V4Y2hfcnhfYml0X3JhdGU7CiAJX191OAlhY3RpdmF0aW9uX3BhcmFtc19sZW47CiAKIAl1bmlvbiB7CkBAIC0zMDksNSArMzEyLDkgQEAKIH0gX19wYWNrZWQ7CiAKICNkZWZpbmUgTkNJX09QX1JGX0RFQUNUSVZBVEVfTlRGCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDYpCitzdHJ1Y3QgbmNpX3JmX2RlYWN0aXZhdGVfbnRmIHsKKwlfX3U4CXR5cGU7CisJX191OAlyZWFzb247Cit9IF9fcGFja2VkOwogCiAjZW5kaWYgLyogX19OQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25jaV9jb3JlLmggYi9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaAppbmRleCBiOGI0YmJkLi5jOTJiNjlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaApAQCAtMTA5LDE1ICsxMDksMTIgQEAKIAkJCQlbTkNJX01BWF9TVVBQT1JURURfUkZfSU5URVJGQUNFU107CiAJX191OAkJCW1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zOwogCV9fdTE2CQkJbWF4X3JvdXRpbmdfdGFibGVfc2l6ZTsKLQlfX3U4CQkJbWF4X2NvbnRyb2xfcGFja2V0X3BheWxvYWRfbGVuZ3RoOwotCV9fdTE2CQkJcmZfc2VuZGluZ19idWZmZXJfc2l6ZTsKLQlfX3UxNgkJCXJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZTsKLQlfX3UxNgkJCW1hbnVmYWN0dXJlcl9pZDsKLQotCS8qIHJlY2VpdmVkIGR1cmluZyBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9SU1AgZm9yIHN0YXRpYyBjb25uIDAgKi8KLQlfX3U4CQkJbWF4X3BrdF9wYXlsb2FkX3NpemU7CisJX191OAkJCW1heF9jdHJsX3BrdF9wYXlsb2FkX2xlbjsKKwlfX3UxNgkJCW1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXM7CisJX191OAkJCW1heF9kYXRhX3BrdF9wYXlsb2FkX3NpemU7CiAJX191OAkJCWluaXRpYWxfbnVtX2NyZWRpdHM7Ci0JX191OAkJCWNvbm5faWQ7CisJX191OAkJCW1hbnVmYWN0X2lkOworCV9fdTMyCQkJbWFudWZhY3Rfc3BlY2lmaWNfaW5mbzsKIAogCS8qIHN0b3JlZCBkdXJpbmcgbmNpX2RhdGFfZXhjaGFuZ2UgKi8KIAlkYXRhX2V4Y2hhbmdlX2NiX3QJZGF0YV9leGNoYW5nZV9jYjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy9uZmMuaCBiL2luY2x1ZGUvbmV0L25mYy9uZmMuaAppbmRleCA2YTdmNjAyLi5jY2ZlNzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZmMvbmZjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmZjL25mYy5oCkBAIC01Miw2ICs1Miw5IEBACiAJaW50ICgqZGV2X2Rvd24pKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwogCWludCAoKnN0YXJ0X3BvbGwpKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiBwcm90b2NvbHMpOwogCXZvaWQgKCpzdG9wX3BvbGwpKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworCWludCAoKmRlcF9saW5rX3VwKShzdHJ1Y3QgbmZjX2RldiAqZGV2LCBpbnQgdGFyZ2V0X2lkeCwKKwkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworCWludCAoKmRlcF9saW5rX2Rvd24pKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwogCWludCAoKmFjdGl2YXRlX3RhcmdldCkoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCiAJCQkJCQkJdTMyIHByb3RvY29sKTsKIAl2b2lkICgqZGVhY3RpdmF0ZV90YXJnZXQpKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4KTsKQEAgLTYwLDYgKzYzLDkgQEAKIAkJCQkJCQl2b2lkICpjYl9jb250ZXh0KTsKIH07CiAKKyNkZWZpbmUgTkZDX1RBUkdFVF9JRFhfQU5ZIC0xCisjZGVmaW5lIE5GQ19NQVhfR1RfTEVOIDQ4CisKIHN0cnVjdCBuZmNfdGFyZ2V0IHsKIAl1MzIgaWR4OwogCXUzMiBzdXBwb3J0ZWRfcHJvdG9jb2xzOwpAQCAtODMsNiArODksOCBAQAogCWJvb2wgZGV2X3VwOwogCWJvb2wgcG9sbGluZzsKIAlib29sIHJlbW90ZV9hY3RpdmF0ZWQ7CisJYm9vbCBkZXBfbGlua191cDsKKwl1MzIgZGVwX3JmX21vZGU7CiAJc3RydWN0IG5mY19nZW5sX2RhdGEgZ2VubF9kYXRhOwogCXUzMiBzdXBwb3J0ZWRfcHJvdG9jb2xzOwogCkBAIC0xNTcsOSArMTY1LDIwIEBACiAJcmV0dXJuIGRldl9uYW1lKCZkZXYtPmRldik7CiB9CiAKLXN0cnVjdCBza19idWZmICpuZmNfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnApOworc3RydWN0IHNrX2J1ZmYgKm5mY19hbGxvY19zZW5kX3NrYihzdHJ1Y3QgbmZjX2RldiAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCXVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCXVuc2lnbmVkIGludCAqZXJyKTsKK3N0cnVjdCBza19idWZmICpuZmNfYWxsb2NfcmVjdl9za2IodW5zaWduZWQgaW50IHNpemUsIGdmcF90IGdmcCk7CisKK2ludCBuZmNfc2V0X3JlbW90ZV9nZW5lcmFsX2J5dGVzKHN0cnVjdCBuZmNfZGV2ICpkZXYsCisJCQkJCXU4ICpndCwgdTggZ3RfbGVuKTsKKwordTggKm5mY19nZXRfbG9jYWxfZ2VuZXJhbF9ieXRlcyhzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ3RfbGVuKTsKIAogaW50IG5mY190YXJnZXRzX2ZvdW5kKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXRzLAogCQkJCQkJCWludCBudGFyZ2V0cyk7CiAKK2ludCBuZmNfZGVwX2xpbmtfaXNfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCSAgICAgICB1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworCiAjZW5kaWYgLyogX19ORVRfTkZDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaCBiL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaAppbmRleCBlYjdkM2MyLi5hNWY3OTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9yZWd1bGF0b3J5LmgKKysrIGIvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oCkBAIC00OCw2ICs0OCwxMCBAQAogICogCTk5IC0gYnVpbHQgYnkgZHJpdmVyIGJ1dCBhIHNwZWNpZmljIGFscGhhMiBjYW5ub3QgYmUgZGV0ZXJtaW5lZAogICogCTk4IC0gcmVzdWx0IG9mIGFuIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byByZWd1bGF0b3J5IGRvbWFpbnMKICAqCTk3IC0gcmVndWxhdG9yeSBkb21haW4gaGFzIG5vdCB5ZXQgYmVlbiBjb25maWd1cmVkCisgKiBAZGZzX3JlZ2lvbjogSWYgQ1JEQSByZXNwb25kZWQgd2l0aCBhIHJlZ3VsYXRvcnkgZG9tYWluIHRoYXQgcmVxdWlyZXMKKyAqCURGUyBtYXN0ZXIgb3BlcmF0aW9uIG9uIGEga25vd24gREZTIHJlZ2lvbiAoTkw4MDIxMV9ERlNfKiksCisgKglkZnNfcmVnaW9uIHJlcHJlc2VudHMgdGhhdCByZWdpb24uIERyaXZlcnMgY2FuIHVzZSB0aGlzIGFuZCB0aGUKKyAqCUBhbHBoYTIgdG8gYWRqdXN0IHRoZWlyIGRldmljZSdzIERGUyBwYXJhbWV0ZXJzIGFzIHJlcXVpcmVkLgogICogQGludGVyc2VjdDogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdpcmVsZXNzIGNvcmUgc2hvdWxkIGludGVyc2VjdAogICogCXRoZSByZXF1ZXN0ZWQgcmVndWxhdG9yeSBkb21haW4gd2l0aCB0aGUgcHJlc2VudGx5IHNldCByZWd1bGF0b3J5CiAgKiAJZG9tYWluLgpAQCAtNjcsNiArNzEsNyBAQAogCWludCB3aXBoeV9pZHg7CiAJZW51bSBubDgwMjExX3JlZ19pbml0aWF0b3IgaW5pdGlhdG9yOwogCWNoYXIgYWxwaGEyWzJdOworCXU4IGRmc19yZWdpb247CiAJYm9vbCBpbnRlcnNlY3Q7CiAJYm9vbCBwcm9jZXNzZWQ7CiAJZW51bSBlbnZpcm9ubWVudF9jYXAgY291bnRyeV9pZV9lbnY7CkBAIC05Myw2ICs5OCw3IEBACiBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiB7CiAJdTMyIG5fcmVnX3J1bGVzOwogCWNoYXIgYWxwaGEyWzJdOworCXU4IGRmc19yZWdpb247CiAJc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSByZWdfcnVsZXNbXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmggYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCmluZGV4IDJlYjIwN2UuLmY2YmIwOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaApAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgogI2luY2x1ZGUgPG5ldC9nZW5fc3RhdHMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBmYTZmNTM4Li5jMGMzMmE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdF9udWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CS8qIHN0cnVjdCBza19idWZmICovCkBAIC03Niw4ICs3NSw4IEBACiAJCQkJCXByaW50ayhLRVJOX0RFQlVHIG1zZyk7IH0gd2hpbGUgKDApCiAjZWxzZQogLyogVmFsaWRhdGUgYXJndW1lbnRzIGFuZCBkbyBub3RoaW5nICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCi1TT0NLX0RFQlVHKHN0cnVjdCBzb2NrICpzaywgY29uc3QgY2hhciAqbXNnLCAuLi4pCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDIsIDMpCit2b2lkIFNPQ0tfREVCVUcoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBjaGFyICptc2csIC4uLikKIHsKIH0KICNlbmRpZgpAQCAtNzMwLDYgKzcyOSw3IEBACiBzdHJ1Y3QgdGltZXdhaXRfc29ja19vcHM7CiBzdHJ1Y3QgaW5ldF9oYXNoaW5mbzsKIHN0cnVjdCByYXdfaGFzaGluZm87CitzdHJ1Y3QgbW9kdWxlOwogCiAvKiBOZXR3b3JraW5nIHByb3RvY29sIGJsb2NrcyB3ZSBhdHRhY2ggdG8gc29ja2V0cy4KICAqIHNvY2tldCBsYXllciAtPiB0cmFuc3BvcnQgbGF5ZXIgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IGUxNDdmNDIuLmJiMThjNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC0xNDAzLDExICsxNDAzLDEzIEBACiAJVENQX1NFUV9TVEFURV9USU1FX1dBSVQsCiB9OwogCitpbnQgdGNwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKKwogc3RydWN0IHRjcF9zZXFfYWZpbmZvIHsKLQljaGFyCQkJKm5hbWU7Ci0Jc2FfZmFtaWx5X3QJCWZhbWlseTsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXNlcV9mb3BzOwotCXN0cnVjdCBzZXFfb3BlcmF0aW9ucwlzZXFfb3BzOworCWNoYXIJCQkJKm5hbWU7CisJc2FfZmFtaWx5X3QJCQlmYW1pbHk7CisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqc2VxX2ZvcHM7CisJc3RydWN0IHNlcV9vcGVyYXRpb25zCQlzZXFfb3BzOwogfTsKIAogc3RydWN0IHRjcF9pdGVyX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggNjdlYTZmYy4uM2IyODVmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTIzMCwxMiArMjMwLDE0IEBACiAjZW5kaWYKIAogLyogL3Byb2MgKi8KK2ludCB1ZHBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCiBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gewotCWNoYXIJCQkqbmFtZTsKLQlzYV9mYW1pbHlfdAkJZmFtaWx5OwotCXN0cnVjdCB1ZHBfdGFibGUJKnVkcF90YWJsZTsKLQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCXNlcV9mb3BzOwotCXN0cnVjdCBzZXFfb3BlcmF0aW9ucwlzZXFfb3BzOworCWNoYXIJCQkJKm5hbWU7CisJc2FfZmFtaWx5X3QJCQlmYW1pbHk7CisJc3RydWN0IHVkcF90YWJsZQkJKnVkcF90YWJsZTsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSpzZXFfZm9wczsKKwlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMJCXNlcV9vcHM7CiB9OwogCiBzdHJ1Y3QgdWRwX2l0ZXJfc3RhdGUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKaW5kZXggZmU1YjA1MS4uODFhYmEzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCkBAIC04MSw3ICs4MSwxMSBAQAogCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9TUlEsCiAJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfU1JRLAogCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfU1JRLAotCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfU1JRX1JFQ1YKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1NSUV9SRUNWLAorCUlCX1VTRVJfVkVSQlNfQ01EX09QRU5fWFJDRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DTE9TRV9YUkNELAorCUlCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9YU1JRLAorCUlCX1VTRVJfVkVSQlNfQ01EX09QRU5fUVAKIH07CiAKIC8qCkBAIC0yMjIsNiArMjI2LDIxIEBACiAJX191MzIgcGRfaGFuZGxlOwogfTsKIAorc3RydWN0IGliX3V2ZXJic19vcGVuX3hyY2QgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGZkOworCV9fdTMyIG9mbGFnczsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl94cmNkX3Jlc3AgeworCV9fdTMyIHhyY2RfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jbG9zZV94cmNkIHsKKwlfX3UzMiB4cmNkX2hhbmRsZTsKK307CisKIHN0cnVjdCBpYl91dmVyYnNfcmVnX21yIHsKIAlfX3U2NCByZXNwb25zZTsKIAlfX3U2NCBzdGFydDsKQEAgLTQwNCw2ICs0MjMsMTcgQEAKIAlfX3U2NCBkcml2ZXJfZGF0YVswXTsKIH07CiAKK3N0cnVjdCBpYl91dmVyYnNfb3Blbl9xcCB7CisJX191NjQgcmVzcG9uc2U7CisJX191NjQgdXNlcl9oYW5kbGU7CisJX191MzIgcGRfaGFuZGxlOworCV9fdTMyIHFwbjsKKwlfX3U4ICBxcF90eXBlOworCV9fdTggIHJlc2VydmVkWzddOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworLyogYWxzbyB1c2VkIGZvciBvcGVuIHJlc3BvbnNlICovCiBzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcF9yZXNwIHsKIAlfX3UzMiBxcF9oYW5kbGU7CiAJX191MzIgcXBuOwpAQCAtNjQ4LDExICs2NzgsMjUgQEAKIAlfX3U2NCBkcml2ZXJfZGF0YVswXTsKIH07CiAKK3N0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3hzcnEgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHNycV90eXBlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBtYXhfd3I7CisJX191MzIgbWF4X3NnZTsKKwlfX3UzMiBzcnFfbGltaXQ7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191MzIgeHJjZF9oYW5kbGU7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKwogc3RydWN0IGliX3V2ZXJic19jcmVhdGVfc3JxX3Jlc3AgewogCV9fdTMyIHNycV9oYW5kbGU7CiAJX191MzIgbWF4X3dyOwogCV9fdTMyIG1heF9zZ2U7Ci0JX191MzIgcmVzZXJ2ZWQ7CisJX191MzIgc3JxbjsKIH07CiAKIHN0cnVjdCBpYl91dmVyYnNfbW9kaWZ5X3NycSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IDIyOGJlM2UuLmJmNWRhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC0xMTIsNiArMTEyLDcgQEAKIAkgKi8KIAlJQl9ERVZJQ0VfVURfSVBfQ1NVTQkJPSAoMTw8MTgpLAogCUlCX0RFVklDRV9VRF9UU08JCT0gKDE8PDE5KSwKKwlJQl9ERVZJQ0VfWFJDCQkJPSAoMTw8MjApLAogCUlCX0RFVklDRV9NRU1fTUdUX0VYVEVOU0lPTlMJPSAoMTw8MjEpLAogCUlCX0RFVklDRV9CTE9DS19NVUxUSUNBU1RfTE9PUEJBQ0sgPSAoMTw8MjIpLAogfTsKQEAgLTIwNyw2ICsyMDgsNyBAQAogCUlCX1BPUlRfU01fRElTQUJMRUQJCQk9IDEgPDwgMTAsCiAJSUJfUE9SVF9TWVNfSU1BR0VfR1VJRF9TVVAJCT0gMSA8PCAxMSwKIAlJQl9QT1JUX1BLRVlfU1dfRVhUX1BPUlRfVFJBUF9TVVAJPSAxIDw8IDEyLAorCUlCX1BPUlRfRVhURU5ERURfU1BFRURTX1NVUCAgICAgICAgICAgICA9IDEgPDwgMTQsCiAJSUJfUE9SVF9DTV9TVVAJCQkJPSAxIDw8IDE2LAogCUlCX1BPUlRfU05NUF9UVU5ORUxfU1VQCQkJPSAxIDw8IDE3LAogCUlCX1BPUlRfUkVJTklUX1NVUAkJCT0gMSA8PCAxOCwKQEAgLTQxNSw3ICs0MTcsMTUgQEAKIAlJQl9SQVRFXzQwX0dCUFMgID0gNywKIAlJQl9SQVRFXzYwX0dCUFMgID0gOCwKIAlJQl9SQVRFXzgwX0dCUFMgID0gOSwKLQlJQl9SQVRFXzEyMF9HQlBTID0gMTAKKwlJQl9SQVRFXzEyMF9HQlBTID0gMTAsCisJSUJfUkFURV8xNF9HQlBTICA9IDExLAorCUlCX1JBVEVfNTZfR0JQUyAgPSAxMiwKKwlJQl9SQVRFXzExMl9HQlBTID0gMTMsCisJSUJfUkFURV8xNjhfR0JQUyA9IDE0LAorCUlCX1JBVEVfMjVfR0JQUyAgPSAxNSwKKwlJQl9SQVRFXzEwMF9HQlBTID0gMTYsCisJSUJfUkFURV8yMDBfR0JQUyA9IDE3LAorCUlCX1JBVEVfMzAwX0dCUFMgPSAxOAogfTsKIAogLyoqCkBAIC00MjcsNiArNDM3LDEzIEBACiBpbnQgaWJfcmF0ZV90b19tdWx0KGVudW0gaWJfcmF0ZSByYXRlKSBfX2F0dHJpYnV0ZV9jb25zdF9fOwogCiAvKioKKyAqIGliX3JhdGVfdG9fbWJwcyAtIENvbnZlcnQgdGhlIElCIHJhdGUgZW51bSB0byBNYnBzLgorICogRm9yIGV4YW1wbGUsIElCX1JBVEVfMl81X0dCUFMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMjUwMC4KKyAqIEByYXRlOiByYXRlIHRvIGNvbnZlcnQuCisgKi8KK2ludCBpYl9yYXRlX3RvX21icHMoZW51bSBpYl9yYXRlIHJhdGUpIF9fYXR0cmlidXRlX2NvbnN0X187CisKKy8qKgogICogbXVsdF90b19pYl9yYXRlIC0gQ29udmVydCBhIG11bHRpcGxlIG9mIDIuNSBHYml0L3NlYyB0byBhbiBJQiByYXRlCiAgKiBlbnVtLgogICogQG11bHQ6IG11bHRpcGxlIHRvIGNvbnZlcnQuCkBAIC01MjIsNiArNTM5LDExIEBACiAJSUJfQ1FfUkVQT1JUX01JU1NFRF9FVkVOVFMJPSAxIDw8IDIsCiB9OwogCitlbnVtIGliX3NycV90eXBlIHsKKwlJQl9TUlFUX0JBU0lDLAorCUlCX1NSUVRfWFJDCit9OworCiBlbnVtIGliX3NycV9hdHRyX21hc2sgewogCUlCX1NSUV9NQVhfV1IJPSAxIDw8IDAsCiAJSUJfU1JRX0xJTUlUCT0gMSA8PCAxLApAQCAtNTM3LDYgKzU1OSwxNCBAQAogCXZvaWQJCSAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CiAJdm9pZAkJICAgICAgICpzcnFfY29udGV4dDsKIAlzdHJ1Y3QgaWJfc3JxX2F0dHIJYXR0cjsKKwllbnVtIGliX3NycV90eXBlCXNycV90eXBlOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGliX3hyY2QgKnhyY2Q7CisJCQlzdHJ1Y3QgaWJfY3EgICAqY3E7CisJCX0geHJjOworCX0gZXh0OwogfTsKIAogc3RydWN0IGliX3FwX2NhcCB7CkBAIC01NjUsNyArNTk1LDExIEBACiAJSUJfUVBUX1VDLAogCUlCX1FQVF9VRCwKIAlJQl9RUFRfUkFXX0lQVjYsCi0JSUJfUVBUX1JBV19FVEhFUlRZUEUKKwlJQl9RUFRfUkFXX0VUSEVSVFlQRSwKKwkvKiBTYXZlIDggZm9yIFJBV19QQUNLRVQgKi8KKwlJQl9RUFRfWFJDX0lOSSA9IDksCisJSUJfUVBUX1hSQ19UR1QsCisJSUJfUVBUX01BWAogfTsKIAogZW51bSBpYl9xcF9jcmVhdGVfZmxhZ3MgewpAQCAtNTc5LDYgKzYxMyw3IEBACiAJc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcTsKIAlzdHJ1Y3QgaWJfY3EJICAgICAgICpyZWN2X2NxOwogCXN0cnVjdCBpYl9zcnEJICAgICAgICpzcnE7CisJc3RydWN0IGliX3hyY2QJICAgICAgICp4cmNkOyAgICAgLyogWFJDIFRHVCBRUHMgb25seSAqLwogCXN0cnVjdCBpYl9xcF9jYXAJY2FwOwogCWVudW0gaWJfc2lnX3R5cGUJc3Ffc2lnX3R5cGU7CiAJZW51bSBpYl9xcF90eXBlCQlxcF90eXBlOwpAQCAtNTg2LDYgKzYyMSwxMyBAQAogCXU4CQkJcG9ydF9udW07IC8qIHNwZWNpYWwgUVAgdHlwZXMgb25seSAqLwogfTsKIAorc3RydWN0IGliX3FwX29wZW5fYXR0ciB7CisJdm9pZCAgICAgICAgICAgICAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CisJdm9pZAkJICAgICAgICpxcF9jb250ZXh0OworCXUzMgkJCXFwX251bTsKKwllbnVtIGliX3FwX3R5cGUJCXFwX3R5cGU7Cit9OworCiBlbnVtIGliX3Jucl90aW1lb3V0IHsKIAlJQl9STlJfVElNRVJfNjU1XzM2ID0gIDAsCiAJSUJfUk5SX1RJTUVSXzAwMF8wMSA9ICAxLApAQCAtNzcwLDYgKzgxMiw3IEBACiAJCQl1MzIJCQkJcmtleTsKIAkJfSBmYXN0X3JlZzsKIAl9IHdyOworCXUzMgkJCXhyY19yZW1vdGVfc3JxX251bTsJLyogWFJDIFRHVCBRUHMgb25seSAqLwogfTsKIAogc3RydWN0IGliX3JlY3Zfd3IgewpAQCAtODMxLDYgKzg3NCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxcF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJc3JxX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlhaF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJeHJjZF9saXN0OwogCWludAkJCWNsb3Npbmc7CiB9OwogCkBAIC04NTgsNiArOTAyLDE1IEBACiAJYXRvbWljX3QgICAgICAgICAgCXVzZWNudDsgLyogY291bnQgYWxsIHJlc291cmNlcyAqLwogfTsKIAorc3RydWN0IGliX3hyY2QgeworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgKmRldmljZTsKKwlhdG9taWNfdAkJdXNlY250OyAvKiBjb3VudCBhbGwgZXhwb3NlZCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaW5vZGUJICAgICAgICppbm9kZTsKKworCXN0cnVjdCBtdXRleAkJdGd0X3FwX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQJdGd0X3FwX2xpc3Q7Cit9OworCiBzdHJ1Y3QgaWJfYWggewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKQEAgLTg4Miw3ICs5MzUsMTYgQEAKIAlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICp1b2JqZWN0OwogCXZvaWQJCSAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CiAJdm9pZAkJICAgICAgICpzcnFfY29udGV4dDsKKwllbnVtIGliX3NycV90eXBlCXNycV90eXBlOwogCWF0b21pY190CQl1c2VjbnQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgaWJfeHJjZCAqeHJjZDsKKwkJCXN0cnVjdCBpYl9jcSAgICpjcTsKKwkJCXUzMgkJc3JxX251bTsKKwkJfSB4cmM7CisJfSBleHQ7CiB9OwogCiBzdHJ1Y3QgaWJfcXAgewpAQCAtODkxLDYgKzk1MywxMSBAQAogCXN0cnVjdCBpYl9jcQkgICAgICAgKnNlbmRfY3E7CiAJc3RydWN0IGliX2NxCSAgICAgICAqcmVjdl9jcTsKIAlzdHJ1Y3QgaWJfc3JxCSAgICAgICAqc3JxOworCXN0cnVjdCBpYl94cmNkCSAgICAgICAqeHJjZDsgLyogWFJDIFRHVCBRUHMgb25seSAqLworCXN0cnVjdCBsaXN0X2hlYWQJeHJjZF9saXN0OworCWF0b21pY190CQl1c2VjbnQ7IC8qIGNvdW50IHRpbWVzIG9wZW5lZCAqLworCXN0cnVjdCBsaXN0X2hlYWQJb3Blbl9saXN0OworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgKnJlYWxfcXA7CiAJc3RydWN0IGliX3VvYmplY3QgICAgICAqdW9iamVjdDsKIAl2b2lkICAgICAgICAgICAgICAgICAgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgICAgKnFwX2NvbnRleHQ7CkBAIC0xMTQ5LDYgKzEyMTYsMTAgQEAKIAkJCQkJCSAgc3RydWN0IGliX2dyaCAqaW5fZ3JoLAogCQkJCQkJICBzdHJ1Y3QgaWJfbWFkICppbl9tYWQsCiAJCQkJCQkgIHN0cnVjdCBpYl9tYWQgKm91dF9tYWQpOworCXN0cnVjdCBpYl94cmNkICoJICAgKCphbGxvY194cmNkKShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgc3RydWN0IGliX3Vjb250ZXh0ICp1Y29udGV4dCwKKwkJCQkJCSBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKTsKKwlpbnQJCQkgICAoKmRlYWxsb2NfeHJjZCkoc3RydWN0IGliX3hyY2QgKnhyY2QpOwogCiAJc3RydWN0IGliX2RtYV9tYXBwaW5nX29wcyAgICpkbWFfb3BzOwogCkBAIC0xNDQzLDYgKzE1MTQsMjUgQEAKIGludCBpYl9kZXN0cm95X3FwKHN0cnVjdCBpYl9xcCAqcXApOwogCiAvKioKKyAqIGliX29wZW5fcXAgLSBPYnRhaW4gYSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgc2hhcmFibGUgUVAuCisgKiBAeHJjZCAtIFhSQyBkb21haW4KKyAqIEBxcF9vcGVuX2F0dHI6IEF0dHJpYnV0ZXMgaWRlbnRpZnlpbmcgdGhlIFFQIHRvIG9wZW4uCisgKgorICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHNoYXJhYmxlIFFQLgorICovCitzdHJ1Y3QgaWJfcXAgKmliX29wZW5fcXAoc3RydWN0IGliX3hyY2QgKnhyY2QsCisJCQkgc3RydWN0IGliX3FwX29wZW5fYXR0ciAqcXBfb3Blbl9hdHRyKTsKKworLyoqCisgKiBpYl9jbG9zZV9xcCAtIFJlbGVhc2UgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIGEgUVAuCisgKiBAcXA6IFRoZSBRUCBoYW5kbGUgdG8gcmVsZWFzZQorICoKKyAqIFRoZSBvcGVuZWQgUVAgaGFuZGxlIGlzIHJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIuICBUaGUgdW5kZXJseWluZworICogc2hhcmVkIFFQIGlzIG5vdCBkZXN0cm95ZWQgdW50aWwgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLgorICovCitpbnQgaWJfY2xvc2VfcXAoc3RydWN0IGliX3FwICpxcCk7CisKKy8qKgogICogaWJfcG9zdF9zZW5kIC0gUG9zdHMgYSBsaXN0IG9mIHdvcmsgcmVxdWVzdHMgdG8gdGhlIHNlbmQgcXVldWUgb2YKICAqICAgdGhlIHNwZWNpZmllZCBRUC4KICAqIEBxcDogVGhlIFFQIHRvIHBvc3QgdGhlIHdvcmsgcmVxdWVzdCBvbi4KQEAgLTIwNjAsNCArMjE1MCwxNiBAQAogICovCiBpbnQgaWJfZGV0YWNoX21jYXN0KHN0cnVjdCBpYl9xcCAqcXAsIHVuaW9uIGliX2dpZCAqZ2lkLCB1MTYgbGlkKTsKIAorLyoqCisgKiBpYl9hbGxvY194cmNkIC0gQWxsb2NhdGVzIGFuIFhSQyBkb21haW4uCisgKiBAZGV2aWNlOiBUaGUgZGV2aWNlIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBYUkMgZG9tYWluLgorICovCitzdHJ1Y3QgaWJfeHJjZCAqaWJfYWxsb2NfeHJjZChzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpOworCisvKioKKyAqIGliX2RlYWxsb2NfeHJjZCAtIERlYWxsb2NhdGVzIGFuIFhSQyBkb21haW4uCisgKiBAeHJjZDogVGhlIFhSQyBkb21haW4gdG8gZGVhbGxvY2F0ZS4KKyAqLworaW50IGliX2RlYWxsb2NfeHJjZChzdHJ1Y3QgaWJfeHJjZCAqeHJjZCk7CisKICNlbmRpZiAvKiBJQl9WRVJCU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaXdfY20uaCBiL2luY2x1ZGUvcmRtYS9pd19jbS5oCmluZGV4IDJkMDE5MWMuLjFhMDQ2YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pd19jbS5oCisrKyBiL2luY2x1ZGUvcmRtYS9pd19jbS5oCkBAIC01Miw4ICs1MiwxMCBAQAogCXN0cnVjdCBzb2NrYWRkcl9pbiBsb2NhbF9hZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKIAl2b2lkICpwcml2YXRlX2RhdGE7Ci0JdTggcHJpdmF0ZV9kYXRhX2xlbjsKIAl2b2lkICpwcm92aWRlcl9kYXRhOworCXU4IHByaXZhdGVfZGF0YV9sZW47CisJdTggb3JkOworCXU4IGlyZDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWFfY20uaCBiL2luY2x1ZGUvcmRtYS9yZG1hX2NtLmgKaW5kZXggMjY5NzdjMS4uNTE5ODhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL3JkbWFfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYV9jbS5oCkBAIC02NSw2ICs2NSw3IEBACiBlbnVtIHJkbWFfcG9ydF9zcGFjZSB7CiAJUkRNQV9QU19TRFAgICA9IDB4MDAwMSwKIAlSRE1BX1BTX0lQT0lCID0gMHgwMDAyLAorCVJETUFfUFNfSUIgICAgPSAweDAxM0YsCiAJUkRNQV9QU19UQ1AgICA9IDB4MDEwNiwKIAlSRE1BX1BTX1VEUCAgID0gMHgwMTExLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaCBiL2luY2x1ZGUvcmRtYS9yZG1hX3VzZXJfY20uaAppbmRleCBmYzgyYzE4Li41MzQ4YTAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvcmRtYV91c2VyX2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCkBAIC03Nyw3ICs3Nyw4IEBACiAJX191NjQgdWlkOwogCV9fdTY0IHJlc3BvbnNlOwogCV9fdTE2IHBzOwotCV9fdTggIHJlc2VydmVkWzZdOworCV9fdTggIHFwX3R5cGU7CisJX191OCAgcmVzZXJ2ZWRbNV07CiB9OwogCiBzdHJ1Y3QgcmRtYV91Y21fY3JlYXRlX2lkX3Jlc3AgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX2lmLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAppbmRleCBkZGIwNDU2Li4yNzAzZTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfaWYuaApAQCAtNTksNiArNTksNyBAQAogCUlTQ1NJX1VFVkVOVF9UUkFOU1BPUlRfRVBfQ09OTkVDVF9USFJPVUdIX0hPU1QJPSBVRVZFTlRfQkFTRSArIDE5LAogCiAJSVNDU0lfVUVWRU5UX1BBVEhfVVBEQVRFCT0gVUVWRU5UX0JBU0UgKyAyMCwKKwlJU0NTSV9VRVZFTlRfU0VUX0lGQUNFX1BBUkFNUwk9IFVFVkVOVF9CQVNFICsgMjEsCiAKIAkvKiB1cCBldmVudHMgKi8KIAlJU0NTSV9LRVZFTlRfUkVDVl9QRFUJCT0gS0VWRU5UX0JBU0UgKyAxLApAQCAtNzAsNiArNzEsNyBAQAogCiAJSVNDU0lfS0VWRU5UX1BBVEhfUkVRCQk9IEtFVkVOVF9CQVNFICsgNywKIAlJU0NTSV9LRVZFTlRfSUZfRE9XTgkJPSBLRVZFTlRfQkFTRSArIDgsCisJSVNDU0lfS0VWRU5UX0NPTk5fTE9HSU5fU1RBVEUgICA9IEtFVkVOVF9CQVNFICsgOSwKIH07CiAKIGVudW0gaXNjc2lfdGd0X2RzY3ZyIHsKQEAgLTE3Miw2ICsxNzQsMTAgQEAKIAkJc3RydWN0IG1zZ19zZXRfcGF0aCB7CiAJCQl1aW50MzJfdAlob3N0X25vOwogCQl9IHNldF9wYXRoOworCQlzdHJ1Y3QgbXNnX3NldF9pZmFjZV9wYXJhbXMgeworCQkJdWludDMyX3QJaG9zdF9ubzsKKwkJCXVpbnQzMl90CWNvdW50OworCQl9IHNldF9pZmFjZV9wYXJhbXM7CiAJfSB1OwogCXVuaW9uIHsKIAkJLyogbWVzc2FnZXMgayAtPiB1ICovCkBAIC0xOTMsNiArMTk5LDExIEBACiAJCQl1aW50MzJfdAljaWQ7CiAJCQl1aW50NjRfdAlyZWN2X2hhbmRsZTsKIAkJfSByZWN2X3JlcTsKKwkJc3RydWN0IG1zZ19jb25uX2xvZ2luIHsKKwkJCXVpbnQzMl90ICAgICAgICBzaWQ7CisJCQl1aW50MzJfdCAgICAgICAgY2lkOworCQkJdWludDMyX3QgICAgICAgIHN0YXRlOyAvKiBlbnVtIGlzY3NpX2Nvbm5fc3RhdGUgKi8KKwkJfSBjb25uX2xvZ2luOwogCQlzdHJ1Y3QgbXNnX2Nvbm5fZXJyb3IgewogCQkJdWludDMyX3QJc2lkOwogCQkJdWludDMyX3QJY2lkOwpAQCAtMjE0LDYgKzIyNSwyMSBAQAogCX0gcjsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKHNpemVvZih1aW50NjRfdCkpKSk7CiAKK2VudW0gaXNjc2lfcGFyYW1fdHlwZSB7CisJSVNDU0lfUEFSQU0sCQkvKiBpc2NzaV9wYXJhbSAoc2Vzc2lvbiwgY29ubiwgdGFyZ2V0LCBMVSkgKi8KKwlJU0NTSV9IT1NUX1BBUkFNLAkvKiBpc2NzaV9ob3N0X3BhcmFtICovCisJSVNDU0lfTkVUX1BBUkFNLAkvKiBpc2NzaV9uZXRfcGFyYW0gKi8KK307CisKK3N0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvIHsKKwl1aW50MzJfdCBpZmFjZV9udW07CS8qIGlmYWNlIG51bWJlciwgMCAtIG4gKi8KKwl1aW50MzJfdCBsZW47CQkvKiBBY3R1YWwgbGVuZ3RoIG9mIHRoZSBwYXJhbSAqLworCXVpbnQxNl90IHBhcmFtOwkJLyogaXNjc2kgcGFyYW0gdmFsdWUgKi8KKwl1aW50OF90IGlmYWNlX3R5cGU7CS8qIElQdjQgb3IgSVB2NiAqLworCXVpbnQ4X3QgcGFyYW1fdHlwZTsJLyogaXNjc2lfcGFyYW1fdHlwZSAqLworCXVpbnQ4X3QgdmFsdWVbMF07CS8qIGxlbmd0aCBzaXplZCB2YWx1ZSBmb2xsb3dzICovCit9IF9fcGFja2VkOworCiAvKgogICogVG8ga2VlcCB0aGUgc3RydWN0IGlzY3NpX3VldmVudCBzaXplIHRoZSBzYW1lIGZvciB1c2Vyc3BhY2UgY29kZQogICogY29tcGF0aWJpbGl0eSwgdGhlIG1haW4gc3RydWN0dXJlIGZvciBJU0NTSV9VRVZFTlRfUEFUSF9VUERBVEUgYW5kCkBAIC0yMzcsNiArMjYzLDcxIEBACiAJdWludDE2X3QJcG10dTsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKHNpemVvZih1aW50NjRfdCkpKSk7CiAKKy8qIGlzY3NpIGlmYWNlIGVuYWJsZWQvZGlzYWJsZWQgc2V0dGluZyAqLworI2RlZmluZSBJU0NTSV9JRkFDRV9ESVNBQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSUZBQ0VfRU5BQkxFCTB4MDIKKworLyogaXB2NCBib290cHJvdG8gKi8KKyNkZWZpbmUgSVNDU0lfQk9PVFBST1RPX1NUQVRJQwkJMHgwMQorI2RlZmluZSBJU0NTSV9CT09UUFJPVE9fREhDUAkJMHgwMgorCisvKiBpcHY2IGFkZHIgYXV0b2NvbmZpZyB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfQVVUT0NGR19ESVNBQkxFCQkweDAxCisjZGVmaW5lIElTQ1NJX0lQVjZfQVVUT0NGR19ORF9FTkFCTEUJCTB4MDIKKyNkZWZpbmUgSVNDU0lfSVBWNl9BVVRPQ0ZHX0RIQ1BWNl9FTkFCTEUJMHgwMworCisvKiBpcHY2IGxpbmsgbG9jYWwgYWRkciB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkdfRU5BQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSVBWNl9MSU5LTE9DQUxfQVVUT0NGR19ESVNBQkxFCTB4MDIKKworLyogaXB2NiByb3V0ZXIgYWRkciB0eXBlICovCisjZGVmaW5lIElTQ1NJX0lQVjZfUk9VVEVSX0FVVE9DRkdfRU5BQkxFCTB4MDEKKyNkZWZpbmUgSVNDU0lfSVBWNl9ST1VURVJfQVVUT0NGR19ESVNBQkxFCTB4MDIKKworI2RlZmluZSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQJCTB4MDEKKyNkZWZpbmUgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2CQkweDAyCisKKyNkZWZpbmUgSVNDU0lfTUFYX1ZMQU5fSUQJCTQwOTUKKyNkZWZpbmUgSVNDU0lfTUFYX1ZMQU5fUFJJT1JJVFkJCTcKKworLyogaXNjc2kgdmxhbiBlbmFibGUvZGlzYWJsZWQgc2V0dGluZyAqLworI2RlZmluZSBJU0NTSV9WTEFOX0RJU0FCTEUJMHgwMQorI2RlZmluZSBJU0NTSV9WTEFOX0VOQUJMRQkweDAyCisKKy8qIGlTQ1NJIG5ldHdvcmsgcGFyYW1zICovCitlbnVtIGlzY3NpX25ldF9wYXJhbSB7CisJSVNDU0lfTkVUX1BBUkFNX0lQVjRfQUREUgkJPSAxLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVAkJPSAyLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X0dXCQkJPSAzLAorCUlTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTwkJPSA0LAorCUlTQ1NJX05FVF9QQVJBTV9NQUMJCQk9IDUsCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMCQk9IDYsCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUgkJPSA3LAorCUlTQ1NJX05FVF9QQVJBTV9JUFY2X1JPVVRFUgkJPSA4LAorCUlTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFJfQVVUT0NGRwk9IDksCisJSVNDU0lfTkVUX1BBUkFNX0lQVjZfTElOS0xPQ0FMX0FVVE9DRkcJPSAxMCwKKwlJU0NTSV9ORVRfUEFSQU1fSVBWNl9ST1VURVJfQVVUT0NGRwk9IDExLAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9FTkFCTEUJCT0gMTIsCisJSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQJCQk9IDEzLAorCUlTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZCQk9IDE0LAorCUlTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQJCT0gMTUsCisJSVNDU0lfTkVUX1BBUkFNX1ZMQU5fVEFHCQk9IDE2LAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9UWVBFCQk9IDE3LAorCUlTQ1NJX05FVF9QQVJBTV9JRkFDRV9OQU1FCQk9IDE4LAorCUlTQ1NJX05FVF9QQVJBTV9NVFUJCQk9IDE5LAorCUlTQ1NJX05FVF9QQVJBTV9QT1JUCQkJPSAyMCwKK307CisKK2VudW0gaXNjc2lfY29ubl9zdGF0ZSB7CisJSVNDU0lfQ09OTl9TVEFURV9GUkVFLAorCUlTQ1NJX0NPTk5fU1RBVEVfWFBUX1dBSVQsCisJSVNDU0lfQ09OTl9TVEFURV9JTl9MT0dJTiwKKwlJU0NTSV9DT05OX1NUQVRFX0xPR0dFRF9JTiwKKwlJU0NTSV9DT05OX1NUQVRFX0lOX0xPR09VVCwKKwlJU0NTSV9DT05OX1NUQVRFX0xPR09VVF9SRVFVRVNURUQsCisJSVNDU0lfQ09OTl9TVEFURV9DTEVBTlVQX1dBSVQsCit9OworCiAvKgogICogQ29tbW9uIGVycm9yIGNvZGVzCiAgKi8KQEAgLTMxOSw0NCArNDEwLDYgQEAKIAlJU0NTSV9QQVJBTV9NQVgsCiB9OwogCi0jZGVmaW5lIElTQ1NJX01BWF9SRUNWX0RMRU5HVEgJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9SRUNWX0RMRU5HVEgpCi0jZGVmaW5lIElTQ1NJX01BWF9YTUlUX0RMRU5HVEgJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9YTUlUX0RMRU5HVEgpCi0jZGVmaW5lIElTQ1NJX0hEUkRHU1RfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0hEUkRHU1RfRU4pCi0jZGVmaW5lIElTQ1NJX0RBVEFER1NUX0VOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9EQVRBREdTVF9FTikKLSNkZWZpbmUgSVNDU0lfSU5JVElBTF9SMlRfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lOSVRJQUxfUjJUX0VOKQotI2RlZmluZSBJU0NTSV9NQVhfUjJUCQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fTUFYX1IyVCkKLSNkZWZpbmUgSVNDU0lfSU1NX0RBVEFfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lNTV9EQVRBX0VOKQotI2RlZmluZSBJU0NTSV9GSVJTVF9CVVJTVAkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fRklSU1RfQlVSU1QpCi0jZGVmaW5lIElTQ1NJX01BWF9CVVJTVAkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX01BWF9CVVJTVCkKLSNkZWZpbmUgSVNDU0lfUERVX0lOT1JERVJfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BEVV9JTk9SREVSX0VOKQotI2RlZmluZSBJU0NTSV9EQVRBU0VRX0lOT1JERVJfRU4JKDFVTEwgPDwgSVNDU0lfUEFSQU1fREFUQVNFUV9JTk9SREVSX0VOKQotI2RlZmluZSBJU0NTSV9FUkwJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9FUkwpCi0jZGVmaW5lIElTQ1NJX0lGTUFSS0VSX0VOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JRk1BUktFUl9FTikKLSNkZWZpbmUgSVNDU0lfT0ZNQVJLRVJfRU4JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX09GTUFSS0VSX0VOKQotI2RlZmluZSBJU0NTSV9FWFBfU1RBVFNOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9FWFBfU1RBVFNOKQotI2RlZmluZSBJU0NTSV9UQVJHRVRfTkFNRQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fVEFSR0VUX05BTUUpCi0jZGVmaW5lIElTQ1NJX1RQR1QJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9UUEdUKQotI2RlZmluZSBJU0NTSV9QRVJTSVNURU5UX0FERFJFU1MJKDFVTEwgPDwgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTKQotI2RlZmluZSBJU0NTSV9QRVJTSVNURU5UX1BPUlQJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BFUlNJU1RFTlRfUE9SVCkKLSNkZWZpbmUgSVNDU0lfU0VTU19SRUNPVkVSWV9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1NFU1NfUkVDT1ZFUllfVE1PKQotI2RlZmluZSBJU0NTSV9DT05OX1BPUlQJCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9DT05OX1BPUlQpCi0jZGVmaW5lIElTQ1NJX0NPTk5fQUREUkVTUwkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fQ09OTl9BRERSRVNTKQotI2RlZmluZSBJU0NTSV9VU0VSTkFNRQkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1VTRVJOQU1FKQotI2RlZmluZSBJU0NTSV9VU0VSTkFNRV9JTgkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fVVNFUk5BTUVfSU4pCi0jZGVmaW5lIElTQ1NJX1BBU1NXT1JECQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fUEFTU1dPUkQpCi0jZGVmaW5lIElTQ1NJX1BBU1NXT1JEX0lOCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9QQVNTV09SRF9JTikKLSNkZWZpbmUgSVNDU0lfRkFTVF9BQk9SVAkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fRkFTVF9BQk9SVCkKLSNkZWZpbmUgSVNDU0lfQUJPUlRfVE1PCQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fQUJPUlRfVE1PKQotI2RlZmluZSBJU0NTSV9MVV9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0xVX1JFU0VUX1RNTykKLSNkZWZpbmUgSVNDU0lfSE9TVF9SRVNFVF9UTU8JCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0hPU1RfUkVTRVRfVE1PKQotI2RlZmluZSBJU0NTSV9QSU5HX1RNTwkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1BJTkdfVE1PKQotI2RlZmluZSBJU0NTSV9SRUNWX1RNTwkJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1JFQ1ZfVE1PKQotI2RlZmluZSBJU0NTSV9JRkFDRV9OQU1FCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9JRkFDRV9OQU1FKQotI2RlZmluZSBJU0NTSV9JU0lECQkJKDFVTEwgPDwgSVNDU0lfUEFSQU1fSVNJRCkKLSNkZWZpbmUgSVNDU0lfSU5JVElBVE9SX05BTUUJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX0lOSVRJQVRPUl9OQU1FKQotI2RlZmluZSBJU0NTSV9UR1RfUkVTRVRfVE1PCQkoMVVMTCA8PCBJU0NTSV9QQVJBTV9UR1RfUkVTRVRfVE1PKQotI2RlZmluZSBJU0NTSV9UQVJHRVRfQUxJQVMJCSgxVUxMIDw8IElTQ1NJX1BBUkFNX1RBUkdFVF9BTElBUykKLQogLyogaVNDU0kgSEJBIHBhcmFtcyAqLwogZW51bSBpc2NzaV9ob3N0X3BhcmFtIHsKIAlJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUywKQEAgLTM2NiwxMSArNDE5LDYgQEAKIAlJU0NTSV9IT1NUX1BBUkFNX01BWCwKIH07CiAKLSNkZWZpbmUgSVNDU0lfSE9TVF9IV0FERFJFU1MJCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fSFdBRERSRVNTKQotI2RlZmluZSBJU0NTSV9IT1NUX0lOSVRJQVRPUl9OQU1FCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fSU5JVElBVE9SX05BTUUpCi0jZGVmaW5lIElTQ1NJX0hPU1RfTkVUREVWX05BTUUJCSgxVUxMIDw8IElTQ1NJX0hPU1RfUEFSQU1fTkVUREVWX05BTUUpCi0jZGVmaW5lIElTQ1NJX0hPU1RfSVBBRERSRVNTCQkoMVVMTCA8PCBJU0NTSV9IT1NUX1BBUkFNX0lQQUREUkVTUykKLQogI2RlZmluZSBpc2NzaV9wdHIoX2hhbmRsZSkgKCh2b2lkKikodW5zaWduZWQgbG9uZylfaGFuZGxlKQogI2RlZmluZSBpc2NzaV9oYW5kbGUoX3B0cikgKCh1aW50NjRfdCkodW5zaWduZWQgbG9uZylfcHRyKQogCkBAIC0zOTIsNiArNDQwLDcgQEAKICNkZWZpbmUgQ0FQX0RJR0VTVF9PRkZMT0FECTB4MTAwMAkvKiBvZmZsb2FkIGhkciBhbmQgZGF0YSBkaWdlc3RzICovCiAjZGVmaW5lIENBUF9QQURESU5HX09GRkxPQUQJMHgyMDAwCS8qIG9mZmxvYWQgcGFkZGluZyBpbnNlcnRpb24sIHJlbW92YWwsCiAJCQkJCSBhbmQgdmVyaWZpY2F0aW9uICovCisjZGVmaW5lIENBUF9MT0dJTl9PRkZMT0FECTB4NDAwMCAgLyogb2ZmbG9hZCBzZXNzaW9uIGxvZ2luICovCiAKIC8qCiAgKiBUaGVzZSBmbGFncyBkZXNjcmliZXMgcmVhc29uIG9mIHN0b3BfY29ubigpIGNhbGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJmYy5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjLmgKaW5kZXggN2Q5NjgyOS4uNWQxYTc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYmZjLmgKQEAgLTI4MSw5ICsyODEsNiBAQAogICogQHRpbWVyOiAgICAgICAgICAgVGhlIGNvbW1hbmQgdGltZXIKICAqIEB0bV9kb25lOiAgICAgICAgIENvbXBsZXRpb24gaW5kaWNhdG9yCiAgKiBAd2FpdF9mb3JfY29tcDogICBJbmRpY2F0b3IgdG8gd2FpdCBmb3IgY29tcGxldGlvbiBvZiB0aGUgSS9PIChpbiBqaWZmaWVzKQotICogQHN0YXJ0X3RpbWU6ICAgICAgVGltZXN0YW1wIGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBJL08gKGluIGppZmZpZXMpCi0gKiBAZW5kX3RpbWU6ICAgICAgICBUaW1lc3RhbXAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBJL08gKGluIGppZmZpZXMpCi0gKiBAbGFzdF9wa3RfdGltZTogICBUaW1lc3RhbXAgb2YgdGhlIGxhc3QgZnJhbWUgcmVjZWl2ZWQgKGluIGppZmZpZXMpCiAgKiBAZGF0YV9sZW46ICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCiAgKiBAY2RiX2NtZDogICAgICAgICBUaGUgQ0RCIGNvbW1hbmQKICAqIEB4ZmVyX2xlbjogICAgICAgIFRoZSB0cmFuc2ZlciBsZW5ndGgKQEAgLTMwNCw1MCArMzAxLDQ2IEBACiAgKiBAcmVjb3Zfc2VxOiAgICAgICBUaGUgc2VxdWVuY2UgZm9yIFJFQyBvciBTUlIKICAqLwogc3RydWN0IGZjX2ZjcF9wa3QgewotCS8qIEhvdXNla2VlcGluZyBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCBmY19scG9ydCAgICpscDsKLQl1MTYJCSAgc3RhdGU7Ci0JYXRvbWljX3QJICByZWZfY250OwogCXNwaW5sb2NrX3QJICBzY3NpX3BrdF9sb2NrOworCWF0b21pY190CSAgcmVmX2NudDsKKworCS8qIFNDU0kgY29tbWFuZCBhbmQgZGF0YSB0cmFuc2ZlciBpbmZvcm1hdGlvbiAqLworCXUzMgkJICBkYXRhX2xlbjsKIAogCS8qIFNDU0kgSS9PIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kICAqY21kOwogCXN0cnVjdCBsaXN0X2hlYWQgIGxpc3Q7CiAKLQkvKiBUaW1lb3V0IHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOwotCWludAkgICAgICAgICAgd2FpdF9mb3JfY29tcDsKLQl1bnNpZ25lZCBsb25nCSAgc3RhcnRfdGltZTsKLQl1bnNpZ25lZCBsb25nCSAgZW5kX3RpbWU7Ci0JdW5zaWduZWQgbG9uZwkgIGxhc3RfcGt0X3RpbWU7Ci0KLQkvKiBTQ1NJIGNvbW1hbmQgYW5kIGRhdGEgdHJhbnNmZXIgaW5mb3JtYXRpb24gKi8KLQl1MzIJCSAgZGF0YV9sZW47Ci0KLQkvKiBUcmFuc3BvcnQgcmVsYXRlZCB2ZXJpYWJsZXMgKi8KLQlzdHJ1Y3QgZmNwX2NtbmQgICBjZGJfY21kOwotCXNpemVfdAkJICB4ZmVyX2xlbjsKLQl1MTYJCSAgeGZlcl9kZHA7Ci0JdTMyCQkgIHhmZXJfY29udGlnX2VuZDsKLQl1MTYJCSAgbWF4X3BheWxvYWQ7CisJLyogSG91c2VrZWVwaW5nIGluZm9ybWF0aW9uICovCisJc3RydWN0IGZjX2xwb3J0ICAgKmxwOworCXU4CQkgIHN0YXRlOwogCiAJLyogU0NTSS9GQ1AgcmV0dXJuIHN0YXR1cyAqLwotCXUzMgkJICBpb19zdGF0dXM7CiAJdTgJCSAgY2RiX3N0YXR1czsKIAl1OAkJICBzdGF0dXNfY29kZTsKIAl1OAkJICBzY3NpX2NvbXBfZmxhZ3M7CisJdTMyCQkgIGlvX3N0YXR1czsKIAl1MzIJCSAgcmVxX2ZsYWdzOwogCXUzMgkJICBzY3NpX3Jlc2lkOwogCisJLyogVHJhbnNwb3J0IHJlbGF0ZWQgdmVyaWFibGVzICovCisJc2l6ZV90CQkgIHhmZXJfbGVuOworCXN0cnVjdCBmY3BfY21uZCAgIGNkYl9jbWQ7CisJdTMyCQkgIHhmZXJfY29udGlnX2VuZDsKKwl1MTYJCSAgbWF4X3BheWxvYWQ7CisJdTE2CQkgIHhmZXJfZGRwOworCiAJLyogQXNzb2NpYXRlZCBzdHJ1Y3R1cmVzICovCiAJc3RydWN0IGZjX3Jwb3J0CSAgKnJwb3J0OwogCXN0cnVjdCBmY19zZXEJICAqc2VxX3B0cjsKIAotCS8qIEVycm9yIFByb2Nlc3NpbmcgaW5mb3JtYXRpb24gKi8KLQl1OAkJICByZWNvdl9yZXRyeTsKKwkvKiBUaW1lb3V0L2Vycm9yIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQJICAgICAgICAgIHdhaXRfZm9yX2NvbXA7CisJdTMyCQkgIHJlY292X3JldHJ5OwogCXN0cnVjdCBmY19zZXEJICAqcmVjb3Zfc2VxOwotfTsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiAvKgogICogU3RydWN0dXJlIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbWFuYWdpbmcgRmlicmUgQ2hhbm5lbCBFeGNoYW5nZXMKQEAgLTQxMywzNSArNDA2LDMyIEBACiAgKglzZXF1ZW5jZSBhbGxvY2F0aW9uCiAgKi8KIHN0cnVjdCBmY19leGNoIHsKLQlzdHJ1Y3QgZmNfZXhjaF9tZ3IgICplbTsKLQlzdHJ1Y3QgZmNfZXhjaF9wb29sICpwb29sOwotCXUzMgkJICAgIHN0YXRlOwotCXUxNgkJICAgIHhpZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgIGV4X2xpc3Q7CiAJc3BpbmxvY2tfdAkgICAgZXhfbG9jazsKIAlhdG9taWNfdAkgICAgZXhfcmVmY250OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgdGltZW91dF93b3JrOworCWVudW0gZmNfY2xhc3MJICAgIGNsYXNzOworCXN0cnVjdCBmY19leGNoX21nciAgKmVtOworCXN0cnVjdCBmY19leGNoX3Bvb2wgKnBvb2w7CisJc3RydWN0IGxpc3RfaGVhZCAgICBleF9saXN0OwogCXN0cnVjdCBmY19scG9ydAkgICAgKmxwOworCXUzMgkJICAgIGVzYl9zdGF0OworCXU4CQkgICAgc3RhdGU7CisJdTgJCSAgICBmaF90eXBlOworCXU4CQkgICAgc2VxX2lkOworCXU4CQkgICAgZW5jYXBzOworCXUxNgkJICAgIHhpZDsKIAl1MTYJCSAgICBveGlkOwogCXUxNgkJICAgIHJ4aWQ7CiAJdTMyCQkgICAgb2lkOwogCXUzMgkJICAgIHNpZDsKIAl1MzIJCSAgICBkaWQ7Ci0JdTMyCQkgICAgZXNiX3N0YXQ7CiAJdTMyCQkgICAgcl9hX3RvdjsKLQl1OAkJICAgIHNlcV9pZDsKLQl1OAkJICAgIGVuY2FwczsKIAl1MzIJCSAgICBmX2N0bDsKLQl1OAkJICAgIGZoX3R5cGU7Ci0JZW51bSBmY19jbGFzcwkgICAgY2xhc3M7Ci0Jc3RydWN0IGZjX3NlcQkgICAgc2VxOwotCisJc3RydWN0IGZjX3NlcSAgICAgICBzZXE7CiAJdm9pZAkJICAgICgqcmVzcCkoc3RydWN0IGZjX3NlcSAqLCBzdHJ1Y3QgZmNfZnJhbWUgKiwgdm9pZCAqKTsKIAl2b2lkCQkgICAgKmFyZzsKLQogCXZvaWQJCSAgICAoKmRlc3RydWN0b3IpKHN0cnVjdCBmY19zZXEgKiwgdm9pZCAqKTsKLQotfTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfd29yazsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKICNkZWZpbmUJZmNfc2VxX2V4Y2goc3ApIGNvbnRhaW5lcl9vZihzcCwgc3RydWN0IGZjX2V4Y2gsIHNlcSkKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oIGIvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaAppbmRleCA4YzE2MzhiLi5kMWU5NWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJmY29lLmgKQEAgLTIyOSw2ICsyMjksMTEgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGxpYmZjX2Z1bmN0aW9uX3RlbXBsYXRlICosIGludCBpbml0X2ZjcCk7CiB1MzIgZmNvZV9mY19jcmMoc3RydWN0IGZjX2ZyYW1lICpmcCk7CiBpbnQgZmNvZV9zdGFydF9pbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBmY29lX2dldF93d24oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTY0ICp3d24sIGludCB0eXBlKTsKK3ZvaWQgX19mY29lX2dldF9sZXNiKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBmY19lbHNfbGVzYiAqZmNfbGVzYiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3ZvaWQgZmNvZV93d25fdG9fc3RyKHU2NCB3d24sIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgZmNvZV92YWxpZGF0ZV92cG9ydF9jcmVhdGUoc3RydWN0IGZjX3Zwb3J0ICp2cG9ydCk7CiAKIC8qKgogICogaXNfZmlwX21vZGUoKSAtIHJldHVybnMgdHJ1ZSBpZiBGSVAgbW9kZSBzZWxlY3RlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJzYXMuaCBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaAppbmRleCBlZTg2NjA2Li42YTMwOGQ0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtMTQyLDggKzE0MiwxMSBAQAogCXUxNiAgICBleF9jaGFuZ2VfY291bnQ7CiAJdTE2ICAgIG1heF9yb3V0ZV9pbmRleGVzOwogCXU4ICAgICBudW1fcGh5czsKKworCXU4ICAgICB0MnRfc3VwcDoxOwogCXU4ICAgICBjb25maWd1cmluZzoxOwogCXU4ICAgICBjb25mX3JvdXRlX3RhYmxlOjE7CisKIAl1OCAgICAgZW5jbG9zdXJlX2xvZ2ljYWxfaWRbOF07CiAKIAlzdHJ1Y3QgZXhfcGh5ICpleF9waHk7CkBAIC0zODYsNiArMzg5LDExIEBACiAJcmV0dXJuIHN0YXJnZXRfdG9fZG9tYWluX2RldihzZGV2LT5zZGV2X3RhcmdldCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF0YV9kZXZpY2UgKnNhc190b19hdGFfZGV2KHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICZkZXYtPnNhdGFfZGV2LmFwLT5saW5rLmRldmljZVswXTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZG9tYWluX2RldmljZSAqCiBjbWRfdG9fZG9tYWluX2RldihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CkBAIC00MDUsNiArNDEzLDIwIEBACiAJcGh5LT5saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdG9fc2FzX2dwaW9fb2QoaW50IGRldmljZSwgaW50IGJpdCkKK3sKKwlyZXR1cm4gMyAqIGRldmljZSArIGJpdDsKK30KKworI2lmZGVmIENPTkZJR19TQ1NJX1NBU19IT1NUX1NNUAoraW50IHRyeV90ZXN0X3Nhc19ncGlvX2dwX2JpdCh1bnNpZ25lZCBpbnQgb2QsIHU4ICpkYXRhLCB1OCBpbmRleCwgdTggY291bnQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90ZXN0X3Nhc19ncGlvX2dwX2JpdCh1bnNpZ25lZCBpbnQgb2QsIHU4ICpkYXRhLCB1OCBpbmRleCwgdTggY291bnQpCit7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCisKIC8qIC0tLS0tLS0tLS0gVGFza3MgLS0tLS0tLS0tLSAqLwogLyoKICAgICAgIHNlcnZpY2VfcmVzcG9uc2UgfCAgU0FTX1RBU0tfQ09NUExFVEUgIHwgIFNBU19UQVNLX1VOREVMSVZFUkVEIHwKQEAgLTU1NSwzNiArNTc3LDE0IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3dvcms7CiB9OwogCi1leHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnNhc190YXNrX2NhY2hlOwotCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcgICAgICAxCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0RPTkUgICAgICAgICAyCiAjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0FCT1JURUQgICAgICA0CiAjZGVmaW5lIFNBU19UQVNLX05FRURfREVWX1JFU0VUICAgICA4CiAjZGVmaW5lIFNBU19UQVNLX0FUX0lOSVRJQVRPUiAgICAgICAxNgogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzYXNfdGFzayAqc2FzX2FsbG9jX3Rhc2soZ2ZwX3QgZmxhZ3MpCi17Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0ga21lbV9jYWNoZV96YWxsb2Moc2FzX3Rhc2tfY2FjaGUsIGZsYWdzKTsKLQotCWlmICh0YXNrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0YXNrLT5saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7Ci0JCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgPSBTQVNfVEFTS19TVEFURV9QRU5ESU5HOwotCQlpbml0X3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCWluaXRfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7Ci0JfQotCi0JcmV0dXJuIHRhc2s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKLXsKLQlpZiAodGFzaykgewotCQlCVUdfT04oIWxpc3RfZW1wdHkoJnRhc2stPmxpc3QpKTsKLQkJa21lbV9jYWNoZV9mcmVlKHNhc190YXNrX2NhY2hlLCB0YXNrKTsKLQl9Ci19CitleHRlcm4gc3RydWN0IHNhc190YXNrICpzYXNfYWxsb2NfdGFzayhnZnBfdCBmbGFncyk7CitleHRlcm4gdm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzayk7CiAKIHN0cnVjdCBzYXNfZG9tYWluX2Z1bmN0aW9uX3RlbXBsYXRlIHsKIAkvKiBUaGUgY2xhc3MgY2FsbHMgdGhlc2UgdG8gbm90aWZ5IHRoZSBMTEREIG9mIGFuIGV2ZW50LiAqLwpAQCAtNjE0LDYgKzYxNCwxMCBAQAogCiAJLyogUGh5IG1hbmFnZW1lbnQgKi8KIAlpbnQgKCpsbGRkX2NvbnRyb2xfcGh5KShzdHJ1Y3QgYXNkX3Nhc19waHkgKiwgZW51bSBwaHlfZnVuYywgdm9pZCAqKTsKKworCS8qIEdQSU8gc3VwcG9ydCAqLworCWludCAoKmxsZGRfd3JpdGVfZ3Bpbykoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKiwgdTggcmVnX3R5cGUsCisJCQkgICAgICAgdTggcmVnX2luZGV4LCB1OCByZWdfY291bnQsIHU4ICp3cml0ZV9kYXRhKTsKIH07CiAKIGV4dGVybiBpbnQgc2FzX3JlZ2lzdGVyX2hhKHN0cnVjdCBzYXNfaGFfc3RydWN0ICopOwpAQCAtNjUyLDcgKzY1Niw3IEBACiBpbnQgIHNhc19kaXNjb3Zlcl9zYXRhKHN0cnVjdCBkb21haW5fZGV2aWNlICopOwogaW50ICBzYXNfZGlzY292ZXJfZW5kX2RldihzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKIAotdm9pZCBzYXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7Cit2b2lkIHNhc191bnJlZ2lzdGVyX2RldihzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0LCBzdHJ1Y3QgZG9tYWluX2RldmljZSAqKTsKIAogdm9pZCBzYXNfaW5pdF9kZXYoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zYXMuaCBiL2luY2x1ZGUvc2NzaS9zYXMuaAppbmRleCBlOWZkMDIyLi4zNjczZDY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Nhcy5oCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlTQVNfUFJPVE9DT0xfU1RQCQk9IDB4MDQsCiAJU0FTX1BST1RPQ09MX1NTUAkJPSAweDA4LAogCVNBU19QUk9UT0NPTF9BTEwJCT0gMHgwRSwKKwlTQVNfUFJPVE9DT0xfU1RQX0FMTAkJPSBTQVNfUFJPVE9DT0xfU1RQfFNBU19QUk9UT0NPTF9TQVRBLAogfTsKIAogLyogRnJvbSB0aGUgc3BlYzsgbG9jYWwgcGh5cyBvbmx5ICovCkBAIC0xMjEsNiArMTIyLDcgQEAKIAlQSFlfRlVOQ19UWF9TQVRBX1BTX1NJR05BTCwKIAlQSFlfRlVOQ19SRUxFQVNFX1NQSU5VUF9IT0xEID0gMHgxMCwgLyogTE9DQUwgUE9SVCBPTkxZISAqLwogCVBIWV9GVU5DX1NFVF9MSU5LX1JBVEUsCisJUEhZX0ZVTkNfR0VUX0VWRU5UUywKIH07CiAKIC8qIFNBUyBMTEREIHdvdWxkIG5lZWQgdG8gcmVwb3J0IG9ubHkgX3ZlcnlfZmV3XyBvZiB0aG9zZSwgbGlrZSBCUk9BRENBU1QuCkBAIC0xOTUsNiArMTk3LDE0IEBACiAJU0FTX09SRUpfUlNWRF9SRVRSWSA9IDE4LAogfTsKIAorZW51bSBzYXNfZ3Bpb19yZWdfdHlwZSB7CisJU0FTX0dQSU9fUkVHX0NGRyAgID0gMCwKKwlTQVNfR1BJT19SRUdfUlggICAgPSAxLAorCVNBU19HUElPX1JFR19SWF9HUCA9IDIsCisJU0FTX0dQSU9fUkVHX1RYICAgID0gMywKKwlTQVNfR1BJT19SRUdfVFhfR1AgPSA0LAorfTsKKwogc3RydWN0ICBkZXZfdG9faG9zdF9maXMgewogCXU4ICAgICBmaXNfdHlwZTsJICAvKiAweDM0ICovCiAJdTggICAgIGZsYWdzOwpAQCAtMzQxLDcgKzM1MSwxMiBAQAogCiAJdTggICAgICBjb25mX3JvdXRlX3RhYmxlOjE7CiAJdTggICAgICBjb25maWd1cmluZzoxOwotCXU4ICAgICAgX3JfYjo2OworCXU4CWNvbmZpZ19vdGhlcnM6MTsKKwl1OAlvcmVqX3JldHJ5X3N1cHA6MTsKKwl1OAlzdHBfY29udF9hd3Q6MTsKKwl1OAlzZWxmX2NvbmZpZzoxOworCXU4CXpvbmVfY29uZmlnOjE7CisJdTgJdDJ0X3N1cHA6MTsKIAogCXU4ICAgICAgX3JfYzsKIApAQCAtNTI4LDcgKzU0MywxMiBAQAogCXU4ICAgICAgX3JfYTsKIAl1OCAgICAgIG51bV9waHlzOwogCi0JdTggICAgICBfcl9iOjY7CisJdTgJdDJ0X3N1cHA6MTsKKwl1OAl6b25lX2NvbmZpZzoxOworCXU4CXNlbGZfY29uZmlnOjE7CisJdTgJc3RwX2NvbnRfYXd0OjE7CisJdTgJb3Jlal9yZXRyeV9zdXBwOjE7CisJdTgJY29uZmlnX290aGVyczoxOwogCXU4ICAgICAgY29uZmlndXJpbmc6MTsKIAl1OCAgICAgIGNvbmZfcm91dGVfdGFibGU6MTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfYnNnX2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ic2dfaXNjc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU2ODlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfYnNnX2lzY3NpLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiAgaVNDU0kgVHJhbnNwb3J0IEJTRyBJbnRlcmZhY2UKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICAgSmFtZXMgU21hcnQsIEVtdWxleCBDb3Jwb3JhdGlvbgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIFNDU0lfQlNHX0lTQ1NJX0gKKyNkZWZpbmUgU0NTSV9CU0dfSVNDU0lfSAorCisvKgorICogVGhpcyBmaWxlIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGJ5IGJvdGgga2VybmVsIGFuZCB1c2VyIHNwYWNlCisgKi8KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorCisvKgorICogaVNDU0kgVHJhbnNwb3J0IFNHSU8gdjQgQlNHIE1lc3NhZ2UgU3VwcG9ydAorICovCisKKy8qIERlZmF1bHQgQlNHIHJlcXVlc3QgdGltZW91dCAoaW4gc2Vjb25kcykgKi8KKyNkZWZpbmUgSVNDU0lfREVGQVVMVF9CU0dfVElNRU9VVCAgICAgICgxMCAqIEhaKQorCisKKy8qCisgKiBSZXF1ZXN0IE1lc3NhZ2UgQ29kZXMgc3VwcG9ydGVkIGJ5IHRoZSBpU0NTSSBUcmFuc3BvcnQKKyAqLworCisvKiBkZWZpbmUgdGhlIGNsYXNzIG1hc2tzIGZvciB0aGUgbWVzc2FnZSBjb2RlcyAqLworI2RlZmluZSBJU0NTSV9CU0dfQ0xTX01BU0sgICAgIDB4RjAwMDAwMDAgICAgICAvKiBmaW5kIG9iamVjdCBjbGFzcyAqLworI2RlZmluZSBJU0NTSV9CU0dfSFNUX01BU0sgICAgIDB4ODAwMDAwMDAgICAgICAvKiBpc2NzaSBob3N0IGNsYXNzICovCisKKy8qIGlzY3NpIGhvc3QgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBJU0NTSV9CU0dfSFNUX1ZFTkRPUiAgICAgICAgICAgKElTQ1NJX0JTR19IU1RfTUFTSyB8IDB4MDAwMDAwRkYpCisKKworLyoKKyAqIGlTQ1NJIEhvc3QgTWVzc2FnZXMKKyAqLworCisvKiBJU0NTSV9CU0dfSFNUX1ZFTkRPUiA6ICovCisKKy8qIFJlcXVlc3Q6CisgKiBOb3RlOiBXaGVuIHNwZWNpZnlpbmcgdmVuZG9yX2lkLCBiZSBzdXJlIHRvIHJlYWQgdGhlIFZlbmRvciBUeXBlIGFuZCBJRAorICogICBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgaW4gc2NzaV9uZXRsaW5rLmgKKyAqLworc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvciB7CisJLyoKKwkgKiBJZGVudGlmaWVzIHRoZSB2ZW5kb3IgdGhhdCB0aGUgbWVzc2FnZSBpcyBmb3JtYXR0ZWQgZm9yLiBUaGlzCisJICogc2hvdWxkIGJlIHRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UuCisJICovCisJdWludDY0X3QgdmVuZG9yX2lkOworCisJLyogc3RhcnQgb2YgdmVuZG9yIGNvbW1hbmQgYXJlYSAqLworCXVpbnQzMl90IHZlbmRvcl9jbWRbMF07Cit9OworCisvKiBSZXNwb25zZToKKyAqLworc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvcl9yZXBseSB7CisJLyogc3RhcnQgb2YgdmVuZG9yIHJlc3BvbnNlIGFyZWEgKi8KKwl1aW50MzJfdCB2ZW5kb3JfcnNwWzBdOworfTsKKworCisvKiByZXF1ZXN0IChDREIpIHN0cnVjdHVyZSBvZiB0aGUgc2dfaW9fdjQgKi8KK3N0cnVjdCBpc2NzaV9ic2dfcmVxdWVzdCB7CisJdWludDMyX3QgbXNnY29kZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBpc2NzaV9ic2dfaG9zdF92ZW5kb3IgICAgaF92ZW5kb3I7CisJfSBycXN0X2RhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIHJlc3BvbnNlIChyZXF1ZXN0IHNlbnNlIGRhdGEpIHN0cnVjdHVyZSBvZiB0aGUgc2dfaW9fdjQgKi8KK3N0cnVjdCBpc2NzaV9ic2dfcmVwbHkgeworCS8qCisJICogVGhlIGNvbXBsZXRpb24gcmVzdWx0LiBSZXN1bHQgZXhpc3RzIGluIHR3byBmb3JtczoKKwkgKiBpZiBuZWdhdGl2ZSwgaXQgaXMgYW4gLUV4eHggc3lzdGVtIGVycm5vIHZhbHVlLiBUaGVyZSB3aWxsCisJICogYmUgbm8gZnVydGhlciByZXBseSBpbmZvcm1hdGlvbiBzdXBwbGllZC4KKwkgKiBlbHNlLCBpdCdzIHRoZSA0LWJ5dGUgc2NzaSBlcnJvciByZXN1bHQsIHdpdGggZHJpdmVyLCBob3N0LAorCSAqIG1zZyBhbmQgc3RhdHVzIGZpZWxkcy4gVGhlIHBlci1tc2djb2RlIHJlcGx5IHN0cnVjdHVyZQorCSAqIHdpbGwgY29udGFpbiB2YWxpZCBkYXRhLgorCSAqLworCXVpbnQzMl90IHJlc3VsdDsKKworCS8qIElmIHRoZXJlIHdhcyByZXBseV9wYXlsb2FkLCBob3cgbXVjaCB3YXMgcmVjZXZpZWQgPyAqLworCXVpbnQzMl90IHJlcGx5X3BheWxvYWRfcmN2X2xlbjsKKworCXVuaW9uIHsKKwkJc3RydWN0IGlzY3NpX2JzZ19ob3N0X3ZlbmRvcl9yZXBseSAgICAgIHZlbmRvcl9yZXBseTsKKwl9IHJlcGx5X2RhdGE7Cit9OworCisKKyNlbmRpZiAvKiBTQ1NJX0JTR19JU0NTSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCmluZGV4IGQzNzFjM2MuLjU1OTFlZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCkBAIC0xOTcsNiArMTk3LDcgQEAKIAlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IHNjc2lfZGV2aWNlICosIGFjdGl2YXRlX2NvbXBsZXRlLCB2b2lkICopOwogCWludCAoKnByZXBfZm4pKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAlpbnQgKCpzZXRfcGFyYW1zKShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgY29uc3QgY2hhciAqKTsKKwlib29sICgqbWF0Y2gpKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKIH07CiAKIHN0cnVjdCBzY3NpX2RoX2RhdGEgewpAQCAtNDcxLDYgKzQ3MiwxMSBAQAogCXJldHVybiBzZGV2LT5zY3NpX2xldmVsID4gU0NTSV8yICYmIHNkZXYtPmlucXVpcnlbNV0gJiAoMTw8MCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfZGV2aWNlX3RwZ3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXJldHVybiBzZGV2LT5pbnF1aXJ5ID8gKHNkZXYtPmlucXVpcnlbNV0gPj4gNCkgJiAweDMgOiAwOworfQorCiAjZGVmaW5lIE1PRFVMRV9BTElBU19TQ1NJX0RFVklDRSh0eXBlKSBcCiAJTU9EVUxFX0FMSUFTKCJzY3NpOnQtIiBfX3N0cmluZ2lmeSh0eXBlKSAiKiIpCiAjZGVmaW5lIFNDU0lfREVWSUNFX01PREFMSUFTX0ZNVCAic2NzaTp0LTB4JTAyeCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAppbmRleCBmMWYyNjQ0Li41MDI2NmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCkBAIC0zNTUsNiArMzU1LDE5IEBACiAJICovCiAJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuICgqZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCisJLyogVGhpcyBpcyBhbiBvcHRpb25hbCByb3V0aW5lIHRoYXQgYWxsb3dzIHRyYW5zcG9ydCB0byBpbml0aWF0ZQorCSAqIExMRCBhZGFwdGVyIG9yIGZpcm13YXJlIHJlc2V0IHVzaW5nIHN5c2ZzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIFJldHVybiB2YWx1ZXM6IDAgb24gc3VjY2VzcywgLXZlIHZhbHVlIG9uIGZhaWx1cmUuCisJICoKKwkgKiBTdGF0dXM6IE9QVElPTkFMCisJICovCisKKwlpbnQgKCpob3N0X3Jlc2V0KShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IHJlc2V0X3R5cGUpOworI2RlZmluZSBTQ1NJX0FEQVBURVJfUkVTRVQJMQorI2RlZmluZSBTQ1NJX0ZJUk1XQVJFX1JFU0VUCTIKKworCiAJLyoKIAkgKiBOYW1lIG9mIHByb2MgZGlyZWN0b3J5CiAJICovCkBAIC03OTEsNyArODA0LDggQEAKICAqKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNjc2lfaG9zdF9zY2FuX2FsbG93ZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0JcmV0dXJuIHNob3N0LT5zaG9zdF9zdGF0ZSA9PSBTSE9TVF9SVU5OSU5HOworCXJldHVybiBzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUlVOTklORyB8fAorCSAgICAgICBzaG9zdC0+c2hvc3Rfc3RhdGUgPT0gU0hPU1RfUkVDT1ZFUlk7CiB9CiAKIGV4dGVybiB2b2lkIHNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAppbmRleCBiZjhmNTI5Li41OTk0YmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaApAQCAtMzcsNiArMzcsOCBAQAogc3RydWN0IGlzY3NpX2Nvbm47CiBzdHJ1Y3QgaXNjc2lfdGFzazsKIHN0cnVjdCBzb2NrYWRkcjsKK3N0cnVjdCBpc2NzaV9pZmFjZTsKK3N0cnVjdCBic2dfam9iOwogCiAvKioKICAqIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQgLSBpU0NTSSBUcmFuc3BvcnQgdGVtcGxhdGUKQEAgLTg0LDkgKzg2LDcgQEAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAljaGFyICpuYW1lOwogCXVuc2lnbmVkIGludCBjYXBzOwotCS8qIExMRCBzZXRzIHRoaXMgdG8gaW5kaWNhdGUgd2hhdCB2YWx1ZXMgaXQgY2FuIGV4cG9ydCB0byBzeXNmcyAqLwotCXVpbnQ2NF90IHBhcmFtX21hc2s7Ci0JdWludDY0X3QgaG9zdF9wYXJhbV9tYXNrOworCiAJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICooKmNyZWF0ZV9zZXNzaW9uKSAoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCwKIAkJCQkJdWludDE2X3QgY21kc19tYXgsIHVpbnQxNl90IHFkZXB0aCwKIAkJCQkJdWludDMyX3Qgc24pOwpAQCAtMTM3LDYgKzEzNywxMyBAQAogCWludCAoKnRndF9kc2N2cikgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBlbnVtIGlzY3NpX3RndF9kc2N2ciB0eXBlLAogCQkJICB1aW50MzJfdCBlbmFibGUsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIpOwogCWludCAoKnNldF9wYXRoKSAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBpc2NzaV9wYXRoICpwYXJhbXMpOworCWludCAoKnNldF9pZmFjZV9wYXJhbSkgKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB2b2lkICpkYXRhLAorCQkJCXVpbnQzMl90IGxlbik7CisJaW50ICgqZ2V0X2lmYWNlX3BhcmFtKSAoc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSwKKwkJCQllbnVtIGlzY3NpX3BhcmFtX3R5cGUgcGFyYW1fdHlwZSwKKwkJCQlpbnQgcGFyYW0sIGNoYXIgKmJ1Zik7CisJbW9kZV90ICgqYXR0cl9pc192aXNpYmxlKShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKTsKKwlpbnQgKCpic2dfcmVxdWVzdCkoc3RydWN0IGJzZ19qb2IgKmpvYik7CiB9OwogCiAvKgpAQCAtMTUwLDYgKzE1Nyw4IEBACiAgKi8KIGV4dGVybiB2b2lkIGlzY3NpX2Nvbm5fZXJyb3JfZXZlbnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAogCQkJCSAgIGVudW0gaXNjc2lfZXJyIGVycm9yKTsKK2V4dGVybiB2b2lkIGlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLAorCQkJCSAgIGVudW0gaXNjc2lfY29ubl9zdGF0ZSBzdGF0ZSk7CiBleHRlcm4gaW50IGlzY3NpX3JlY3ZfcGR1KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAogCQkJICBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpOwogCkBAIC0xNzEsNiArMTgwLDkgQEAKICNkZWZpbmUgaXNjc2lfZGV2X3RvX2Nvbm4oX2RldikgXAogCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4sIGRldikKIAorI2RlZmluZSB0cmFuc3BvcnRfY2xhc3NfdG9fY29ubihfY2RldikgXAorCWlzY3NpX2Rldl90b19jb25uKF9jZGV2LT5wYXJlbnQpCisKICNkZWZpbmUgaXNjc2lfY29ubl90b19zZXNzaW9uKF9jb25uKSBcCiAJaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2Nvbm4tPmRldi5wYXJlbnQpCiAKQEAgLTE5Nyw2ICsyMDksNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVjb3Zlcnlfd29yazsKIAogCXVuc2lnbmVkIGludCB0YXJnZXRfaWQ7CisJYm9vbCBpZGFfdXNlZDsKIAogCWludCBzdGF0ZTsKIAlpbnQgc2lkOwkJCQkvKiBzZXNzaW9uIGlkICovCkBAIC0yMDcsNiArMjIwLDkgQEAKICNkZWZpbmUgaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2RldikgXAogCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24sIGRldikKIAorI2RlZmluZSB0cmFuc3BvcnRfY2xhc3NfdG9fc2Vzc2lvbihfY2RldikgXAorCWlzY3NpX2Rldl90b19zZXNzaW9uKF9jZGV2LT5wYXJlbnQpCisKICNkZWZpbmUgaXNjc2lfc2Vzc2lvbl90b19zaG9zdChfc2Vzc2lvbikgXAogCWRldl90b19zaG9zdChfc2Vzc2lvbi0+ZGV2LnBhcmVudCkKIApAQCAtMjE2LDggKzIzMiwxMiBAQAogc3RydWN0IGlzY3NpX2Nsc19ob3N0IHsKIAlhdG9taWNfdCBucl9zY2FuczsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKmJzZ19xOwogfTsKIAorI2RlZmluZSBpc2NzaV9qb2JfdG9fc2hvc3QoX2pvYikgXAorICAgICAgICBkZXZfdG9fc2hvc3QoX2pvYi0+ZGV2KQorCiBleHRlcm4gdm9pZCBpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJdm9pZCAoKmZuKShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKikpOwogCkBAIC0yMjgsNiArMjQ4LDIwIEBACiAJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uOwogfTsKIAorc3RydWN0IGlzY3NpX2lmYWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgaXNjc2lfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisJdWludDMyX3QgaWZhY2VfdHlwZTsJLyogSVB2NCBvciBJUHY2ICovCisJdWludDMyX3QgaWZhY2VfbnVtOwkvKiBpZmFjZSBudW1iZXIsIDAgLSBuICovCisJdm9pZCAqZGRfZGF0YTsJCS8qIExMRCBwcml2YXRlIGRhdGEgKi8KK307CisKKyNkZWZpbmUgaXNjc2lfZGV2X3RvX2lmYWNlKF9kZXYpIFwKKwljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGlzY3NpX2lmYWNlLCBkZXYpCisKKyNkZWZpbmUgaXNjc2lfaWZhY2VfdG9fc2hvc3QoX2lmYWNlKSBcCisJZGV2X3RvX3Nob3N0KF9pZmFjZS0+ZGV2LnBhcmVudCkKKwogLyoKICAqIHNlc3Npb24gYW5kIGNvbm5lY3Rpb24gZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgSFcgaVNDU0kgTExEcwogICovCkBAIC0yMzgsNiArMjcyLDcgQEAKIAlkZXZfcHJpbnRrKHByZWZpeCwgJihfY2xzX2Nvbm4pLT5kZXYsIGZtdCwgIyNhKQogCiBleHRlcm4gaW50IGlzY3NpX3Nlc3Npb25fY2hrcmVhZHkoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKK2V4dGVybiBpbnQgaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKTsKIGV4dGVybiBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmlzY3NpX2FsbG9jX3Nlc3Npb24oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0LCBpbnQgZGRfc2l6ZSk7CiBleHRlcm4gaW50IGlzY3NpX2FkZF9zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiwKQEAgLTI2MSw1ICsyOTYsMTEgQEAKIGV4dGVybiB2b2lkIGlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcCk7CiBleHRlcm4gc3RydWN0IGlzY3NpX2VuZHBvaW50ICppc2NzaV9sb29rdXBfZW5kcG9pbnQodTY0IGhhbmRsZSk7CiBleHRlcm4gaW50IGlzY3NpX2Jsb2NrX3Njc2lfZWgoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiBzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlzY3NpX2NyZWF0ZV9pZmFjZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJICAgICAgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdCwKKwkJCQkJICAgICAgdWludDMyX3QgaWZhY2VfdHlwZSwKKwkJCQkJICAgICAgdWludDMyX3QgaWZhY2VfbnVtLCBpbnQgZGRfc2l6ZSk7CitleHRlcm4gdm9pZCBpc2NzaV9kZXN0cm95X2lmYWNlKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UpOworZXh0ZXJuIHN0cnVjdCBpc2NzaV9pZmFjZSAqaXNjc2lfbG9va3VwX2lmYWNlKGludCBoYW5kbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWRhdTEzNzMuaCBiL2luY2x1ZGUvc291bmQvYWRhdTEzNzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE5Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9hZGF1MTM3My5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBBbmFsb2cgRGV2aWNlcyBBREFVMTM3MyBBdWRpbyBDb2RlYyBkcml2ZQorICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIEF1dGhvcjogTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19TT1VORF9BREFVMTM3M19IX18KKyNkZWZpbmUgX19TT1VORF9BREFVMTM3M19IX18KKworZW51bSBhZGF1MTM3M19taWNiaWFzX3ZvbHRhZ2UgeworCUFEQVUxMzczX01JQ0JJQVNfMl85ViA9IDAsCisJQURBVTEzNzNfTUlDQklBU18yXzJWID0gMSwKKwlBREFVMTM3M19NSUNCSUFTXzJfNlYgPSAyLAorCUFEQVUxMzczX01JQ0JJQVNfMV84ViA9IDMsCit9OworCisjZGVmaW5lIEFEQVUxMzczX0RSQ19TSVpFIDEzCisKK3N0cnVjdCBhZGF1MTM3M19wbGF0Zm9ybV9kYXRhIHsKKwlib29sIGlucHV0X2RpZmZlcmVudGlhbFs0XTsKKwlib29sIGxpbmVvdXRfZGlmZmVyZW50aWFsOworCWJvb2wgbGluZW91dF9ncm91bmRfc2Vuc2U7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2RyYzsKKwl1aW50OF90IGRyY19zZXR0aW5nWzNdW0FEQVUxMzczX0RSQ19TSVpFXTsKKworCWVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMxOworCWVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oIGIvaW5jbHVkZS9zb3VuZC9hc291bmQuaAppbmRleCA1ZDYwNzRmLi5hMmU0ZmY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKQEAgLTcwNiw3ICs3MDYsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFNORFJWX0NUTF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDYpCisjZGVmaW5lIFNORFJWX0NUTF9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDcpCiAKIHN0cnVjdCBzbmRfY3RsX2NhcmRfaW5mbyB7CiAJaW50IGNhcmQ7CQkJLyogY2FyZCBudW1iZXIgKi8KQEAgLTgwMyw2ICs4MDMsOCBAQAogCQkJdW5zaWduZWQgaW50IGl0ZW1zOwkvKiBSOiBudW1iZXIgb2YgaXRlbXMgKi8KIAkJCXVuc2lnbmVkIGludCBpdGVtOwkvKiBXOiBpdGVtIG51bWJlciAqLwogCQkJY2hhciBuYW1lWzY0XTsJCS8qIFI6IHZhbHVlIG5hbWUgKi8KKwkJCV9fdTY0IG5hbWVzX3B0cjsJLyogVzogbmFtZXMgbGlzdCAoRUxFTV9BREQgb25seSkgKi8KKwkJCXVuc2lnbmVkIGludCBuYW1lc19sZW5ndGg7CiAJCX0gZW51bWVyYXRlZDsKIAkJdW5zaWduZWQgY2hhciByZXNlcnZlZFsxMjhdOwogCX0gdmFsdWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2NvcmUuaCBiL2luY2x1ZGUvc291bmQvY29yZS5oCmluZGV4IDFmYTI0MDcuLjNiZTVhYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvY29yZS5oCisrKyBiL2luY2x1ZGUvc291bmQvY29yZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkJLyogd2FrZV91cCgpICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4JCS8qIHN0cnVjdCBtdXRleCAqLwogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CQkvKiBzdHJ1Y3Qgcndfc2VtYXBob3JlICovCkBAIC00Myw2ICs0Miw3IEBACiAjaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IHBjaV9kZXY7CiAjZW5kaWYKK3N0cnVjdCBtb2R1bGU7CiAKIC8qIGRldmljZSBhbGxvY2F0aW9uIHN0dWZmICovCiAKQEAgLTMyNiw5ICszMjYsOSBAQAogLyogLS0tICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USykKK19fcHJpbnRmKDQsIDUpCiB2b2lkIF9fc25kX3ByaW50ayh1bnNpZ25lZCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisJCSAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwogI2Vsc2UKICNkZWZpbmUgX19zbmRfcHJpbnRrKGxldmVsLCBmaWxlLCBsaW5lLCBmb3JtYXQsIGFyZ3MuLi4pIFwKIAlwcmludGsoZm9ybWF0LCAjI2FyZ3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2luZm8uaCBiL2luY2x1ZGUvc291bmQvaW5mby5oCmluZGV4IDRlOTRjZjEuLjU0OTJjYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaW5mby5oCisrKyBiL2luY2x1ZGUvc291bmQvaW5mby5oCkBAIC0xMTAsOCArMTEwLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY2FyZF9pbmZvX3JlYWRfb3NzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikge30KICNlbmRpZgogCi1pbnQgc25kX2lwcmludGYoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgXAotCQkJCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK19fcHJpbnRmKDIsIDMpCitpbnQgc25kX2lwcmludGYoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiBpbnQgc25kX2luZm9faW5pdCh2b2lkKTsKIGludCBzbmRfaW5mb19kb25lKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaCBiL2luY2x1ZGUvc291bmQvaW5pdHZhbC5oCmluZGV4IDFkYWE2ZGZmLi5mOTlhMGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaAorKysgYi9pbmNsdWRlL3NvdW5kL2luaXR2YWwuaApAQCAtNjIsNyArNjIsNyBAQAogewogCXdoaWxlICgqaXJxX3RhYmxlICE9IC0xKSB7CiAJCWlmICghcmVxdWVzdF9pcnEoKmlycV90YWJsZSwgc25kX2xlZ2FjeV9lbXB0eV9pcnFfaGFuZGxlciwKLQkJCQkgSVJRRl9ESVNBQkxFRCB8IElSUUZfUFJPQkVfU0hBUkVELCAiQUxTQSBUZXN0IElSUSIsCisJCQkJIElSUUZfUFJPQkVfU0hBUkVELCAiQUxTQSBUZXN0IElSUSIsCiAJCQkJICh2b2lkICopIGlycV90YWJsZSkpIHsKIAkJCWZyZWVfaXJxKCppcnFfdGFibGUsICh2b2lkICopIGlycV90YWJsZSk7CiAJCQlyZXR1cm4gKmlycV90YWJsZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvamFjay5oIGIvaW5jbHVkZS9zb3VuZC9qYWNrLmgKaW5kZXggYzE0MGZjNy4uNjNjNzkwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9qYWNrLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9qYWNrLmgKQEAgLTQyLDYgKzQyLDcgQEAKIAlTTkRfSkFDS19NRUNIQU5JQ0FMCT0gMHgwMDA4LCAvKiBJZiBkZXRlY3RlZCBzZXBhcmF0ZWx5ICovCiAJU05EX0pBQ0tfVklERU9PVVQJPSAweDAwMTAsCiAJU05EX0pBQ0tfQVZPVVQJCT0gU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX1ZJREVPT1VULAorCVNORF9KQUNLX0xJTkVJTgkJPSAweDAwMjAsCiAKIAkvKiBLZXB0IHNlcGFyYXRlIGZyb20gc3dpdGNoZXMgdG8gZmFjaWxpdGF0ZSBpbXBsZW1lbnRhdGlvbiAqLwogCVNORF9KQUNLX0JUTl8wCQk9IDB4NDAwMCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmggYi9pbmNsdWRlL3NvdW5kL21wdTQwMS5oCmluZGV4IDFmMWQ1M2YuLjIwMjMwZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9tcHU0MDEuaApAQCAtNTAsNyArNTAsMTAgQEAKICNkZWZpbmUgTVBVNDAxX0lORk9fSU5URUdSQVRFRAkoMSA8PCAyKQkvKiBpbnRlZ3JhdGVkIGgvdyBwb3J0ICovCiAjZGVmaW5lIE1QVTQwMV9JTkZPX01NSU8JKDEgPDwgMykJLyogTU1JTyBhY2Nlc3MgKi8KICNkZWZpbmUgTVBVNDAxX0lORk9fVFhfSVJRCSgxIDw8IDQpCS8qIGluZGVwZW5kZW50IFRYIGlycSAqLworI2RlZmluZSBNUFU0MDFfSU5GT19JUlFfSE9PSwkoMSA8PCA1KQkvKiBtcHU0MDEgaXJxIGhhbmRsZXIgaXMgY2FsbGVkCisJCQkJCQkgICBmcm9tIGRyaXZlciBpcnEgaGFuZGxlciAqLwogI2RlZmluZSBNUFU0MDFfSU5GT19OT19BQ0sJKDEgPDwgNikJLyogTm8gQUNLIGNtZCBuZWVkZWQgKi8KKyNkZWZpbmUgTVBVNDAxX0lORk9fVVNFX1RJTUVSCSgxIDw8IDE1KQkvKiBpbnRlcm5hbCAqLwogCiAjZGVmaW5lIE1QVTQwMV9NT0RFX0JJVF9JTlBVVAkJMAogI2RlZmluZSBNUFU0MDFfTU9ERV9CSVRfT1VUUFVUCQkxCkBAIC03Myw4ICs3Niw3IEBACiAJdW5zaWduZWQgbG9uZyBwb3J0OwkJLyogYmFzZSBwb3J0IG9mIE1QVS00MDEgY2hpcCAqLwogCXVuc2lnbmVkIGxvbmcgY3BvcnQ7CQkvKiBwb3J0ICsgMSAodXN1YWxseSkgKi8KIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsJCS8qIHBvcnQgcmVzb3VyY2UgKi8KLQlpbnQgaXJxOwkJCS8qIElSUSBudW1iZXIgb2YgTVBVLTQwMSBjaGlwICgtMSA9IHBvbGwpICovCi0JaW50IGlycV9mbGFnczsKKwlpbnQgaXJxOwkJCS8qIElSUSBudW1iZXIgb2YgTVBVLTQwMSBjaGlwICovCiAKIAl1bnNpZ25lZCBsb25nIG1vZGU7CQkvKiBNUFU0MDFfTU9ERV9YWFhYICovCiAJaW50IHRpbWVyX2ludm9rZWQ7CkBAIC0xMzEsNyArMTMzLDYgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcG9ydCwKIAkJCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzLAogCQkJaW50IGlycSwKLQkJCWludCBpcnFfZmxhZ3MsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpOwogCiAjZW5kaWYgLyogX19TT1VORF9NUFU0MDFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggNTRjYjA3OS4uMGNmOTFiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC04MjUsNiArODI1LDggQEAKIGludCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcG93MihzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjb25kLAogCQkJICAgICAgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIpOworaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhc2VfcmF0ZSk7CiBpbnQgc25kX3BjbV9od19ydWxlX2FkZChzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJdW5zaWduZWQgaW50IGNvbmQsCiAJCQlpbnQgdmFyLApAQCAtMTAzNSw2ICsxMDM3LDggQEAKIAlhdG9taWNfZGVjKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpOwogfQogCitpbnQgc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpOwogLyogbW1hcCBmb3IgaW8tbWVtb3J5IGFyZWEgKi8KICNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEEpCiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX01NQVBfSU9NRU0JU05EUlZfUENNX0lORk9fTU1BUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zYWlmLmggYi9pbmNsdWRlL3NvdW5kL3NhaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUwZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9zYWlmLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fU09VTkRfU0FJRl9IX18KKyNkZWZpbmUgX19TT1VORF9TQUlGX0hfXworCitzdHJ1Y3QgbXhzX3NhaWZfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqaW5pdCkgKHZvaWQpOworCWludCAoKmdldF9tYXN0ZXJfaWQpICh1bnNpZ25lZCBpbnQgc2FpZl9pZCk7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NlcV9rZXJuZWwuaCBiL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCmluZGV4IDNkOWFmYjYuLmYzNTJhOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvc291bmQvc2VxX2tlcm5lbC5oCkBAIC03NSw5ICs3NSw5IEBACiB9OwogCiAvKiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBjbGllbnQgKi8KK19fcHJpbnRmKDMsIDQpCiBpbnQgc25kX3NlcV9jcmVhdGVfa2VybmVsX2NsaWVudChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBjbGllbnRfaW5kZXgsCi0JCQkJIGNvbnN0IGNoYXIgKm5hbWVfZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCQkJCSBjb25zdCBjaGFyICpuYW1lX2ZtdCwgLi4uKTsKIGludCBzbmRfc2VxX2RlbGV0ZV9rZXJuZWxfY2xpZW50KGludCBjbGllbnQpOwogaW50IHNuZF9zZXFfa2VybmVsX2NsaWVudF9lbnF1ZXVlKGludCBjbGllbnQsIHN0cnVjdCBzbmRfc2VxX2V2ZW50ICpldiwgaW50IGF0b21pYywgaW50IGhvcCk7CiBpbnQgc25kX3NlcV9rZXJuZWxfY2xpZW50X2Rpc3BhdGNoKGludCBjbGllbnQsIHN0cnVjdCBzbmRfc2VxX2V2ZW50ICpldiwgaW50IGF0b21pYywgaW50IGhvcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYWkuaCBiL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCmluZGV4IDVhZDVmM2EuLjI0MTNhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhaS5oCkBAIC0yNCwxMyArMjQsMTMgQEAKICAqIERlc2NyaWJlcyB0aGUgcGh5c2ljYWwgUENNIGRhdGEgZm9ybWF0aW5nIGFuZCBjbG9ja2luZy4gQWRkIG5ldyBmb3JtYXRzCiAgKiB0byB0aGUgZW5kLgogICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0kyUwkJMCAvKiBJMlMgbW9kZSAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KCQkxIC8qIFJpZ2h0IEp1c3RpZmllZCBtb2RlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0xFRlRfSgkJMiAvKiBMZWZ0IEp1c3RpZmllZCBtb2RlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9BCQkzIC8qIEwgZGF0YSBNU0IgYWZ0ZXIgRlJNIExSQyAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQgkJNCAvKiBMIGRhdGEgTVNCIGR1cmluZyBGUk0gTFJDICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0FDOTcJCTUgLyogQUM5NyAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9QRE0JCTYgLyogUHVsc2UgZGVuc2l0eSBtb2R1bGF0aW9uICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0kyUwkJMSAvKiBJMlMgbW9kZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KCQkyIC8qIFJpZ2h0IEp1c3RpZmllZCBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0xFRlRfSgkJMyAvKiBMZWZ0IEp1c3RpZmllZCBtb2RlICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0RTUF9BCQk0IC8qIEwgZGF0YSBNU0IgYWZ0ZXIgRlJNIExSQyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9EU1BfQgkJNSAvKiBMIGRhdGEgTVNCIGR1cmluZyBGUk0gTFJDICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0FDOTcJCTYgLyogQUM5NyAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9QRE0JCTcgLyogUHVsc2UgZGVuc2l0eSBtb2R1bGF0aW9uICovCiAKIC8qIGxlZnQgYW5kIHJpZ2h0IGp1c3RpZmllZCBhbHNvIGtub3duIGFzIE1TQiBhbmQgTFNCIHJlc3BlY3RpdmVseSAqLwogI2RlZmluZSBTTkRfU09DX0RBSUZNVF9NU0IJCVNORF9TT0NfREFJRk1UX0xFRlRfSgpAQCAtNDIsOCArNDIsOCBAQAogICogREFJIGJpdCBjbG9ja3MgY2FuIGJlIGJlIGdhdGVkIChkaXNhYmxlZCkgd2hlbiB0aGUgREFJIGlzIG5vdAogICogc2VuZGluZyBvciByZWNlaXZpbmcgUENNIGRhdGEgaW4gYSBmcmFtZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzYXZlIHBvd2VyLgogICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0NPTlQJCSgwIDw8IDQpIC8qIGNvbnRpbnVvdXMgY2xvY2sgKi8KLSNkZWZpbmUgU05EX1NPQ19EQUlGTVRfR0FURUQJCSgxIDw8IDQpIC8qIGNsb2NrIGlzIGdhdGVkICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NPTlQJCSgxIDw8IDQpIC8qIGNvbnRpbnVvdXMgY2xvY2sgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfR0FURUQJCSgyIDw8IDQpIC8qIGNsb2NrIGlzIGdhdGVkICovCiAKIC8qCiAgKiBEQUkgaGFyZHdhcmUgc2lnbmFsIGludmVyc2lvbnMuCkBAIC01MSwxMCArNTEsMTAgQEAKICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBEQUkgY2FuIGFsc28gc3VwcG9ydCBpbnZlcnRlZCBjbG9ja3MgZm9yIHRoZSBzcGVjaWZpZWQKICAqIGZvcm1hdC4KICAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9OQl9ORgkJKDAgPDwgOCkgLyogbm9ybWFsIGJpdCBjbG9jayArIGZyYW1lICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX05CX0lGCQkoMSA8PCA4KSAvKiBub3JtYWwgQkNMSyArIGludiBGUk0gKi8KLSNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSUJfTkYJCSgyIDw8IDgpIC8qIGludmVydCBCQ0xLICsgbm9yIEZSTSAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9JQl9JRgkJKDMgPDwgOCkgLyogaW52ZXJ0IEJDTEsgKyBGUk0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfTkJfTkYJCSgxIDw8IDgpIC8qIG5vcm1hbCBiaXQgY2xvY2sgKyBmcmFtZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9OQl9JRgkJKDIgPDwgOCkgLyogbm9ybWFsIEJDTEsgKyBpbnYgRlJNICovCisjZGVmaW5lIFNORF9TT0NfREFJRk1UX0lCX05GCQkoMyA8PCA4KSAvKiBpbnZlcnQgQkNMSyArIG5vciBGUk0gKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfSUJfSUYJCSg0IDw8IDgpIC8qIGludmVydCBCQ0xLICsgRlJNICovCiAKIC8qCiAgKiBEQUkgaGFyZHdhcmUgY2xvY2sgbWFzdGVycy4KQEAgLTYzLDEwICs2MywxMCBAQAogICogaS5lLiBpZiB0aGUgY29kZWMgaXMgY2xrIGFuZCBGUk0gbWFzdGVyIHRoZW4gdGhlIGludGVyZmFjZSBpcwogICogY2xrIGFuZCBmcmFtZSBzbGF2ZS4KICAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNCQkoMCA8PCAxMikgLyogY29kZWMgY2xrICYgRlJNIG1hc3RlciAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZNCQkoMSA8PCAxMikgLyogY29kZWMgY2xrIHNsYXZlICYgRlJNIG1hc3RlciAqLwotI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTCQkoMiA8PCAxMikgLyogY29kZWMgY2xrIG1hc3RlciAmIGZyYW1lIHNsYXZlICovCi0jZGVmaW5lIFNORF9TT0NfREFJRk1UX0NCU19DRlMJCSgzIDw8IDEyKSAvKiBjb2RlYyBjbGsgJiBGUk0gc2xhdmUgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTQkJKDEgPDwgMTIpIC8qIGNvZGVjIGNsayAmIEZSTSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTQkJKDIgPDwgMTIpIC8qIGNvZGVjIGNsayBzbGF2ZSAmIEZSTSBtYXN0ZXIgKi8KKyNkZWZpbmUgU05EX1NPQ19EQUlGTVRfQ0JNX0NGUwkJKDMgPDwgMTIpIC8qIGNvZGVjIGNsayBtYXN0ZXIgJiBmcmFtZSBzbGF2ZSAqLworI2RlZmluZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTCQkoNCA8PCAxMikgLyogY29kZWMgY2xrICYgRlJNIHNsYXZlICovCiAKICNkZWZpbmUgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0sJMHgwMDBmCiAjZGVmaW5lIFNORF9TT0NfREFJRk1UX0NMT0NLX01BU0sJMHgwMGYwCkBAIC0yNDIsNiArMjQyLDkgQEAKIAl2b2lkICpwbGF5YmFja19kbWFfZGF0YTsKIAl2b2lkICpjYXB0dXJlX2RtYV9kYXRhOwogCisJLyogU3ltbWV0cnkgZGF0YSAtIG9ubHkgdmFsaWQgaWYgc3ltbWV0cnkgaXMgYmVpbmcgZW5mb3JjZWQgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKwogCS8qIHBhcmVudCBwbGF0Zm9ybS9jb2RlYyAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCmluZGV4IGUwNTgzYjcuLjE3YTRjMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKQEAgLTM4MSw2ICszODEsOSBAQAogaW50IHNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluKTsKIAorLyogTW9zdGx5IGludGVybmFsIC0gc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkICovCit2b2lkIGRhcG1fbWFya19kaXJ0eShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgY29uc3QgY2hhciAqcmVhc29uKTsKKwogLyogZGFwbSB3aWRnZXQgdHlwZXMgKi8KIGVudW0gc25kX3NvY19kYXBtX3R5cGUgewogCXNuZF9zb2NfZGFwbV9pbnB1dCA9IDAsCQkvKiBpbnB1dCBwaW4gKi8KQEAgLTQ3Myw2ICs0NzYsOCBAQAogCXVuc2lnbmVkIGNoYXIgZXh0OjE7CQkJLyogaGFzIGV4dGVybmFsIHdpZGdldHMgKi8KIAl1bnNpZ25lZCBjaGFyIGZvcmNlOjE7CQkJLyogZm9yY2Ugc3RhdGUgKi8KIAl1bnNpZ25lZCBjaGFyIGlnbm9yZV9zdXNwZW5kOjE7ICAgICAgICAgLyoga2VwdCBlbmFibGVkIG92ZXIgc3VzcGVuZCAqLworCXVuc2lnbmVkIGNoYXIgbmV3X3Bvd2VyOjE7CQkvKiBwb3dlciBmcm9tIHRoaXMgcnVuICovCisJdW5zaWduZWQgY2hhciBwb3dlcl9jaGVja2VkOjE7CQkvKiBwb3dlciBjaGVja2VkIHRoaXMgcnVuICovCiAJaW50IHN1YnNlcTsJCQkJLyogc29ydCB3aXRoaW4gd2lkZ2V0IHR5cGUgKi8KIAogCWludCAoKnBvd2VyX2NoZWNrKShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdyk7CkBAIC00OTIsNiArNDk3LDkgQEAKIAogCS8qIHVzZWQgZHVyaW5nIERBUE0gdXBkYXRlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcG93ZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRpcnR5OworCWludCBpbnB1dHM7CisJaW50IG91dHB1dHM7CiB9OwogCiBzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSB7CkBAIC01MjQsNiArNTMyLDggQEAKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCB0YXJnZXRfYmlhc19sZXZlbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKKwlpbnQgKCpzdHJlYW1fZXZlbnQpKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwgaW50IGV2ZW50KTsKKwogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGFwbTsKICNlbmRpZgpAQCAtNTM1LDQgKzU0NSwxMCBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXRzWzBdOwogfTsKIAorc3RydWN0IHNuZF9zb2NfZGFwbV9zdGF0cyB7CisJaW50IHBvd2VyX2NoZWNrczsKKwlpbnQgcGF0aF9jaGVja3M7CisJaW50IG5laWdoYm91cl9jaGVja3M7Cit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLmggYi9pbmNsdWRlL3NvdW5kL3NvYy5oCmluZGV4IGFhMTlmNWEuLjExY2ZiNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC0yNywxMyArMjgsMjAgQEAKIC8qCiAgKiBDb252ZW5pZW5jZSBrY29udHJvbCBidWlsZGVycwogICovCi0jZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0KSBcCisjZGVmaW5lIFNPQ19ET1VCTEVfVkFMVUUoeHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIHhtYXgsIHhpbnZlcnQpIFwKIAkoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgLm1heCA9IHhtYXgsIFwKLQkucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQorCXsucmVnID0geHJlZywgLnJyZWcgPSB4cmVnLCAuc2hpZnQgPSBzaGlmdF9sZWZ0LCBcCisJLnJzaGlmdCA9IHNoaWZ0X3JpZ2h0LCAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIFwKKwkuaW52ZXJ0ID0geGludmVydH0pCisjZGVmaW5lIFNPQ19TSU5HTEVfVkFMVUUoeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0KSBcCisJU09DX0RPVUJMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1heCwgeGludmVydCkKICNkZWZpbmUgU09DX1NJTkdMRV9WQUxVRV9FWFQoeHJlZywgeG1heCwgeGludmVydCkgXAogCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAogCXsucmVnID0geHJlZywgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0pCisjZGVmaW5lIFNPQ19ET1VCTEVfUl9WQUxVRSh4bHJlZywgeHJyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCkgXAorCSgodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCXsucmVnID0geGxyZWcsIC5ycmVnID0geHJyZWcsIC5zaGlmdCA9IHhzaGlmdCwgLnJzaGlmdCA9IHhzaGlmdCwgXAorCS5tYXggPSB4bWF4LCAucGxhdGZvcm1fbWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9KQogI2RlZmluZSBTT0NfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCAuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3csXApAQCAtNDcsNDAgKzU1LDM2IEBACiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX2dldF92b2xzdyxcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCiAJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQotI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCwgeGludmVydCkgXAorI2RlZmluZSBTT0NfRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXgsIGludmVydCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCwgXAotCQkgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9WQUxVRShyZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBcCisJCQkJCSAgbWF4LCBpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9SKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQotI2RlZmluZSBTT0NfRE9VQkxFX1RMVih4bmFtZSwgeHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIHhtYXgsIHhpbnZlcnQsIHRsdl9hcnJheSkgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFNPQ19ET1VCTEVfUl9WQUxVRShyZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIFwKKwkJCQkJICAgIHhtYXgsIHhpbnZlcnQpIH0KKyNkZWZpbmUgU09DX0RPVUJMRV9UTFYoeG5hbWUsIHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0LCB0bHZfYXJyYXkpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAogCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCiAJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisJLnByaXZhdGVfdmFsdWUgPSBTT0NfRE9VQkxFX1ZBTFVFKHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIFwKKwkJCQkJICBtYXgsIGludmVydCkgfQogI2RlZmluZSBTT0NfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLFwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHxcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLFwKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAotCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3XzJyLCBcCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19wdXRfdm9sc3csIFwKKwkucHJpdmF0ZV92YWx1ZSA9IFNPQ19ET1VCTEVfUl9WQUxVRShyZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIFwKKwkJCQkJICAgIHhtYXgsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9TOF9UTFYoeG5hbWUsIHhyZWcsIHhtaW4sIHhtYXgsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCkBAIC0xMjAsMTQgKzEyNCwxMyBAQAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAogCS5wcml2YXRlX3ZhbHVlID0gU09DX1NJTkdMRV9WQUxVRSh4cmVnLCB4c2hpZnQsIHhtYXgsIHhpbnZlcnQpIH0KLSNkZWZpbmUgU09DX0RPVUJMRV9FWFQoeG5hbWUsIHhyZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCB4bWF4LCB4aW52ZXJ0LFwKKyNkZWZpbmUgU09DX0RPVUJMRV9FWFQoeG5hbWUsIHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKIAkuZ2V0ID0geGhhbmRsZXJfZ2V0LCAucHV0ID0geGhhbmRsZXJfcHV0LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCwgXAotCQkgLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gXAorCQlTT0NfRE9VQkxFX1ZBTFVFKHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1heCwgaW52ZXJ0KSB9CiAjZGVmaW5lIFNPQ19TSU5HTEVfRVhUX1RMVih4bmFtZSwgeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQsIHRsdl9hcnJheSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXApAQCAtMTQ1LDIwICsxNDgsMTggQEAKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSB4cmVnLCAuc2hpZnQgPSBzaGlmdF9sZWZ0LCAucnNoaWZ0ID0gc2hpZnRfcmlnaHQsIFwKLQkJLm1heCA9IHhtYXgsIC5wbGF0Zm9ybV9tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0gfQorCS5wcml2YXRlX3ZhbHVlID0gU09DX0RPVUJMRV9WQUxVRSh4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgXAorCQkJCQkgIHhtYXgsIHhpbnZlcnQpIH0KICNkZWZpbmUgU09DX0RPVUJMRV9SX0VYVF9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0LCB0bHZfYXJyYXkpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAogCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCiAJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLCBcCiAJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LCBcCiAJLmdldCA9IHhoYW5kbGVyX2dldCwgLnB1dCA9IHhoYW5kbGVyX3B1dCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSByZWdfbGVmdCwgLnJyZWcgPSByZWdfcmlnaHQsIC5zaGlmdCA9IHhzaGlmdCwgXAotCQkubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisJLnByaXZhdGVfdmFsdWUgPSBTT0NfRE9VQkxFX1JfVkFMVUUocmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCBcCisJCQkJCSAgICB4bWF4LCB4aW52ZXJ0KSB9CiAjZGVmaW5lIFNPQ19TSU5HTEVfQk9PTF9FWFQoeG5hbWUsIHhkYXRhLCB4aGFuZGxlcl9nZXQsIHhoYW5kbGVyX3B1dCkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAogCS5pbmZvID0gc25kX3NvY19pbmZvX2Jvb2xfZXh0LCBcCkBAIC0yNjAsNiArMjYxLDcgQEAKIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgewogCVNORF9TT0NfSTJDID0gMSwKIAlTTkRfU09DX1NQSSwKKwlTTkRfU09DX1JFR01BUCwKIH07CiAKIGVudW0gc25kX3NvY19jb21wcmVzc190eXBlIHsKQEAgLTI3NCw3ICsyNzYsNyBAQAogfTsKIAogaW50IHNuZF9zb2NfY29kZWNfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBjbGtfaWQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKTsKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOwogaW50IHNuZF9zb2NfY29kZWNfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBwbGxfaWQsIGludCBzb3VyY2UsCiAJCQkgIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpOwogCkBAIC0zOTEsMTIgKzM5Myw4IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfcHV0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2luZm9fdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7Ci1pbnQgc25kX3NvY19nZXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKKyNkZWZpbmUgc25kX3NvY19nZXRfdm9sc3dfMnIgc25kX3NvY19nZXRfdm9sc3cKKyNkZWZpbmUgc25kX3NvY19wdXRfdm9sc3dfMnIgc25kX3NvY19wdXRfdm9sc3cKIGludCBzbmRfc29jX2luZm9fdm9sc3dfczgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CiBpbnQgc25kX3NvY19nZXRfdm9sc3dfczgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC01NzYsOSArNTc0LDExIEBACiAJY29uc3Qgdm9pZCAqcmVnX2RlZl9jb3B5OwogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NhY2hlX29wcyAqY2FjaGVfb3BzOwogCXN0cnVjdCBtdXRleCBjYWNoZV9yd19tdXRleDsKKwlpbnQgdmFsX2J5dGVzOwogCiAJLyogZGFwbSAqLwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCBkYXBtOworCXVuc2lnbmVkIGludCBpZ25vcmVfcG1kb3duX3RpbWU6MTsgLyogcG1kb3duX3RpbWUgaXMgaWdub3JlZCBhdCBzdG9wICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CkBAIC02MDcsNyArNjA3LDcgQEAKIAogCS8qIGNvZGVjIHdpZGUgb3BlcmF0aW9ucyAqLwogCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOworCQkJICBpbnQgY2xrX2lkLCBpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcik7CiAJaW50ICgqc2V0X3BsbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcGxsX2lkLCBpbnQgc291cmNlLAogCQl1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KTsKIApAQCAtNjE5LDcgKzYxOSw3IEBACiAJaW50ICgqdm9sYXRpbGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJaW50ICgqcmVhZGFibGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CiAJaW50ICgqd3JpdGFibGVfcmVnaXN0ZXIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7Ci0Jc2hvcnQgcmVnX2NhY2hlX3NpemU7CisJdW5zaWduZWQgaW50IHJlZ19jYWNoZV9zaXplOwogCXNob3J0IHJlZ19jYWNoZV9zdGVwOwogCXNob3J0IHJlZ193b3JkX3NpemU7CiAJY29uc3Qgdm9pZCAqcmVnX2NhY2hlX2RlZmF1bHQ7CkBAIC02MzAsMTAgKzYzMCwxNCBAQAogCS8qIGNvZGVjIGJpYXMgbGV2ZWwgKi8KIAlpbnQgKCpzZXRfYmlhc19sZXZlbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKIAkJCSAgICAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKTsKKwlib29sIGlkbGVfYmlhc19vZmY7CiAKIAl2b2lkICgqc2VxX25vdGlmaWVyKShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKiwKIAkJCSAgICAgZW51bSBzbmRfc29jX2RhcG1fdHlwZSwgaW50KTsKIAorCS8qIGNvZGVjIHN0cmVhbSBjb21wbGV0aW9uIGV2ZW50ICovCisJaW50ICgqc3RyZWFtX2V2ZW50KShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGludCBldmVudCk7CisKIAkvKiBwcm9iZSBvcmRlcmluZyAtIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZSBkZXBlbmRlbmNpZXMgKi8KIAlpbnQgcHJvYmVfb3JkZXI7CiAJaW50IHJlbW92ZV9vcmRlcjsKQEAgLTY2OSw2ICs2NzMsOSBAQAogCS8qIHBsYXRmb3JtIHN0cmVhbSBvcHMgKi8KIAlzdHJ1Y3Qgc25kX3BjbV9vcHMgKm9wczsKIAorCS8qIHBsYXRmb3JtIHN0cmVhbSBjb21wbGV0aW9uIGV2ZW50ICovCisJaW50ICgqc3RyZWFtX2V2ZW50KShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGludCBldmVudCk7CisKIAkvKiBwcm9iZSBvcmRlcmluZyAtIGZvciBjb21wb25lbnRzIHdpdGggcnVudGltZSBkZXBlbmRlbmNpZXMgKi8KIAlpbnQgcHJvYmVfb3JkZXI7CiAJaW50IHJlbW92ZV9vcmRlcjsKQEAgLTcwMyw2ICs3MTAsOCBAQAogCWNvbnN0IGNoYXIgKmNwdV9kYWlfbmFtZTsKIAljb25zdCBjaGFyICpjb2RlY19kYWlfbmFtZTsKIAorCXVuc2lnbmVkIGludCBkYWlfZm10OyAgICAgICAgICAgLyogZm9ybWF0IHRvIHNldCBvbiBpbml0ICovCisKIAkvKiBLZWVwIERBSSBhY3RpdmUgb3ZlciBzdXNwZW5kICovCiAJdW5zaWduZWQgaW50IGlnbm9yZV9zdXNwZW5kOjE7CiAKQEAgLTgxNSw5ICs4MjQsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdpZGdldHM7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fZGlydHk7CiAKIAkvKiBHZW5lcmljIERBUE0gY29udGV4dCBmb3IgdGhlIGNhcmQgKi8KIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3N0YXRzIGRhcG1fc3RhdHM7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NhcmRfcm9vdDsKQEAgLTg0MCw4ICs4NTEsNiBAQAogCXVuc2lnbmVkIGludCBjb21wbGV0ZToxOwogCXVuc2lnbmVkIGludCBkZXZfcmVnaXN0ZXJlZDoxOwogCi0JLyogU3ltbWV0cnkgZGF0YSAtIG9ubHkgdmFsaWQgaWYgc3ltbWV0cnkgaXMgYmVpbmcgZW5mb3JjZWQgKi8KLQl1bnNpZ25lZCBpbnQgcmF0ZTsKIAlsb25nIHBtZG93bl90aW1lOwogCiAJLyogcnVudGltZSBkZXZpY2VzICovCkBAIC05MzYsNiArOTQ1LDE4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRhcG1fbGlzdCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jKQoreworCWlmIChtYy0+cmVnID09IG1jLT5ycmVnICYmIG1jLT5zaGlmdCA9PSBtYy0+cnNoaWZ0KQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIG1jLT5yZWcgPT0gbWMtPnJyZWcgJiYgbWMtPnNoaWZ0ICE9IG1jLT5yc2hpZnQsIG9yCisJICogbWMtPnJlZyAhPSBtYy0+cnJlZyBtZWFucyB0aGF0IHRoZSBjb250cm9sIGlzCisJICogc3RlcmVvIChiaXRzIGluIG9uZSByZWdpc3RlciBvciBpbiB0d28gcmVnaXN0ZXJzKQorCSAqLworCXJldHVybiAxOworfQorCiBpbnQgc25kX3NvY191dGlsX2luaXQodm9pZCk7CiB2b2lkIHNuZF9zb2NfdXRpbF9leGl0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmggYi9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmgKaW5kZXggODliZWNjYjUuLjRjYzEwOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdHBhNjEzMGEyLXBsYXQuaAorKysgYi9pbmNsdWRlL3NvdW5kL3RwYTYxMzBhMi1wbGF0LmgKQEAgLTIzLDEzICsyMyw3IEBACiAjaWZuZGVmIFRQQTYxMzBBMl9QTEFUX0gKICNkZWZpbmUgVFBBNjEzMEEyX1BMQVRfSAogCi1lbnVtIHRwYV9tb2RlbCB7Ci0JVFBBNjEzMEEyLAotCVRQQTYxNDBBMiwKLX07Ci0KIHN0cnVjdCB0cGE2MTMwYTJfcGxhdGZvcm1fZGF0YSB7Ci0JZW51bSB0cGFfbW9kZWwgaWQ7CiAJaW50IHBvd2VyX2dwaW87CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3dtMTI1MC1ldjEuaCBiL2luY2x1ZGUvc291bmQvd20xMjUwLWV2MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmY4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3dtMTI1MC1ldjEuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogbGludXgvc291bmQvd20xMjUwLWV2MS5oIC0gUGxhdGZvcm0gZGF0YSBmb3IgV00xMjUwLUVWMQorICoKKyAqIENvcHlyaWdodCAyMDExIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NORF9XTTEyNTBfRVYxX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfV00xMjUwX0VWMV9ICisKKyNkZWZpbmUgV00xMjUwX0VWMV9OVU1fR1BJT1MgNQorCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfRU5BICAwCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfU0VMMCAxCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19DTEtfU0VMMSAyCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19PU1IgICAgICAzCisjZGVmaW5lIFdNMTI1MF9FVjFfR1BJT19NQVNURVIgICA0CisKKworc3RydWN0IHdtMTI1MF9ldjFfcGRhdGEgeworCWludCBncGlvc1tXTTEyNTBfRVYxX05VTV9HUElPU107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvd201MTAwLmggYi9pbmNsdWRlL3NvdW5kL3dtNTEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxN2QwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3dtNTEwMC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBsaW51eC9zb3VuZC93bTUxMDAuaCAtLSBQbGF0Zm9ybSBkYXRhIGZvciBXTTUxMDAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MuIFBMQy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTkRfV001MTAwX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfV001MTAwX0gKKworZW51bSB3bTUxMDBfaW5fbW9kZSB7CisJV001MTAwX0lOX1NFID0gMCwKKwlXTTUxMDBfSU5fRElGRiA9IDEsCisJV001MTAwX0lOX0RNSUMgPSAyLAorfTsKKworZW51bSB3bTUxMDBfZG1pY19zdXAgeworCVdNNTEwMF9ETUlDX1NVUF9NSUNWREQgPSAwLAorCVdNNTEwMF9ETUlDX1NVUF9NSUNCSUFTMSA9IDEsCisJV001MTAwX0RNSUNfU1VQX01JQ0JJQVMyID0gMiwKKwlXTTUxMDBfRE1JQ19TVVBfTUlDQklBUzMgPSAzLAorfTsKKworZW51bSB3bTUxMDBfbWljZGV0X2JpYXMgeworCVdNNTEwMF9NSUNERVRfTUlDQklBUzEgPSAwLAorCVdNNTEwMF9NSUNERVRfTUlDQklBUzIgPSAxLAorCVdNNTEwMF9NSUNERVRfTUlDQklBUzMgPSAyLAorfTsKKworc3RydWN0IHdtNTEwMF9qYWNrX21vZGUgeworCWVudW0gd201MTAwX21pY2RldF9iaWFzIGJpYXM7CisJaW50IGhwX3BvbDsKKwlpbnQgbWljZF9zcmM7Cit9OworCisjZGVmaW5lIFdNNTEwMF9HUElPX1NFVCAweDEwMDAwCisKK3N0cnVjdCB3bTUxMDBfcGRhdGEgeworCWludCByZXNldDsgICAgICAvKiogR1BJTyBjb250cm9sbGluZyAvUkVTRVQsIGlmIGFueSAqLworCWludCBsZG9fZW5hOyAgICAvKiogR1BJTyBjb250cm9sbGluZyBMT0RFTkEsIGlmIGFueSAqLworCWludCBocF9wb2w7ICAgICAvKiogR1BJTyBjb250cm9sbGluZyBoZWFkc2V0IHBvbGFyaXR5LCBpZiBhbnkgKi8KKwlpbnQgaXJxX2ZsYWdzOworCWludCBncGlvX2Jhc2U7CisKKwlzdHJ1Y3Qgd201MTAwX2phY2tfbW9kZSBqYWNrX21vZGVzWzJdOworCisJLyogSW5wdXQgcGluIG1vZGUgc2VsZWN0aW9uICovCisJZW51bSB3bTUxMDBfaW5fbW9kZSBpbl9tb2RlWzRdOworCisJLyogRE1JQyBzdXBwbHkgc2VsZWN0aW9uICovCisJZW51bSB3bTUxMDBfZG1pY19zdXAgZG1pY19zdXBbNF07CisKKwlpbnQgZ3Bpb19kZWZhdWx0c1s2XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCmluZGV4IDM1YWE3ODZmLi43ZjVmZWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCkBAIC04OSw3ICs4OSw2IEBACiAJVFJBTlNQT1JUX1BST0NFU1NfVE1SCT0gOSwKIAlUUkFOU1BPUlRfSVNUQVRFX1BST0NFU1NJTkcgPSAxMSwKIAlUUkFOU1BPUlRfTkVXX0NNRF9NQVAJPSAxNiwKLQlUUkFOU1BPUlRfRlJFRV9DTURfSU5UUiA9IDE3LAogCVRSQU5TUE9SVF9DT01QTEVURV9RRl9XUCA9IDE4LAogCVRSQU5TUE9SVF9DT01QTEVURV9RRl9PSyA9IDE5LAogfTsKQEAgLTExNSw3ICsxMTQsNiBAQAogCVNDRl9ERUxBWUVEX0NNRF9GUk9NX1NBTV9BVFRSCT0gMHgwMDA4MDAwMCwKIAlTQ0ZfVU5VU0VECQkJPSAweDAwMTAwMDAwLAogCVNDRl9QQVNTVEhST1VHSF9TR19UT19NRU1fTk9BTExPQyA9IDB4MDA0MDAwMDAsCi0JU0NGX0VNVUxBVEVfQ0RCX0FTWU5DCQk9IDB4MDEwMDAwMDAsCiB9OwogCiAvKiBzdHJ1Y3Qgc2VfZGV2X2VudHJ5LT5sdW5fZmxhZ3MgYW5kIHN0cnVjdCBzZV9sdW4tPmx1bl9hY2Nlc3MgKi8KQEAgLTQyNiw2ICs0MjQsOSBAQAogCWVudW0gdHJhbnNwb3J0X3N0YXRlX3RhYmxlIHRfc3RhdGU7CiAJLyogVHJhbnNwb3J0IHNwZWNpZmljIGVycm9yIHN0YXR1cyAqLwogCWludAkJCXRyYW5zcG9ydF9lcnJvcl9zdGF0dXM7CisJLyogVXNlZCB0byBzaWduYWwgY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKCkgdXNhZ2UgcGVyIGNtZCAqLworCWludAkJCWNoZWNrX3JlbGVhc2U6MTsKKwlpbnQJCQljbWRfd2FpdF9zZXQ6MTsKIAkvKiBTZWUgc2VfY21kX2ZsYWdzX3RhYmxlICovCiAJdTMyCQkJc2VfY21kX2ZsYWdzOwogCXUzMgkJCXNlX29yZGVyZWRfaWQ7CkBAIC00NTIsOCArNDUzLDEwIEBACiAJc3RydWN0IHNlX3Nlc3Npb24JKnNlX3Nlc3M7CiAJc3RydWN0IHNlX3Rtcl9yZXEJKnNlX3Rtcl9yZXE7CiAJc3RydWN0IGxpc3RfaGVhZAlzZV9xdWV1ZV9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJc2VfY21kX2xpc3Q7CisJc3RydWN0IGNvbXBsZXRpb24JY21kX3dhaXRfY29tcDsKIAlzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyAqc2VfdGZvOwotCWludCAoKnRyYW5zcG9ydF9lbXVsYXRlX2NkYikoc3RydWN0IHNlX2NtZCAqKTsKKwlpbnQgKCpleGVjdXRlX3Rhc2spKHN0cnVjdCBzZV90YXNrICopOwogCXZvaWQgKCp0cmFuc3BvcnRfY29tcGxldGVfY2FsbGJhY2spKHN0cnVjdCBzZV9jbWQgKik7CiAKIAl1bnNpZ25lZCBjaGFyCQkqdF90YXNrX2NkYjsKQEAgLTU1OSwxMiArNTYyLDE2IEBACiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogc3RydWN0IHNlX3Nlc3Npb24geworCWludAkJCXNlc3NfdGVhcmluZ19kb3duOjE7CiAJdTY0CQkJc2Vzc19iaW5faXNpZDsKIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wJKnNlX25vZGVfYWNsOwogCXN0cnVjdCBzZV9wb3J0YWxfZ3JvdXAgKnNlX3RwZzsKIAl2b2lkCQkJKmZhYnJpY19zZXNzX3B0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3NfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3NfYWNsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlzZXNzX2NtZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJc2Vzc193YWl0X2xpc3Q7CisJc3BpbmxvY2tfdAkJc2Vzc19jbWRfbG9jazsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCiBzdHJ1Y3Qgc2VfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAppbmRleCA0NjU3MTkxLi4yYmUzMWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuaApAQCAtMTcsNyArMTcsNyBAQAogCQkJCQlzdHJ1Y3Qgc2VfbHVuICopOwogZXh0ZXJuIHZvaWQgY29yZV9kZXZfdW5leHBvcnQoc3RydWN0IHNlX2RldmljZSAqLCBzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICosCiAJCQkJCXN0cnVjdCBzZV9sdW4gKik7Ci1leHRlcm4gaW50IHRyYW5zcG9ydF9jb3JlX3JlcG9ydF9sdW5fcmVzcG9uc2Uoc3RydWN0IHNlX2NtZCAqKTsKK2V4dGVybiBpbnQgdGFyZ2V0X3JlcG9ydF9sdW5zKHN0cnVjdCBzZV90YXNrICopOwogZXh0ZXJuIHZvaWQgc2VfcmVsZWFzZV9kZXZpY2VfZm9yX2hiYShzdHJ1Y3Qgc2VfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgc2VfcmVsZWFzZV92cGRfZm9yX2RldihzdHJ1Y3Qgc2VfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgc2VfY2xlYXJfZGV2X3BvcnRzKHN0cnVjdCBzZV9kZXZpY2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9mYWJyaWNfb3BzLmgKaW5kZXggMTI2YzY3NS4uMDI1NjgyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfZmFicmljX29wcy5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2ZhYnJpY19vcHMuaApAQCAtNDYsOSArNDYsMTYgQEAKIAlpbnQgKCpuZXdfY21kX21hcCkoc3RydWN0IHNlX2NtZCAqKTsKIAkvKgogCSAqIE9wdGlvbmFsIHRvIHJlbGVhc2Ugc3RydWN0IHNlX2NtZCBhbmQgZmFicmljIGRlcGVuZGVudCBhbGxvY2F0ZWQKLQkgKiBJL08gZGVzY3JpcHRvciBpbiB0cmFuc3BvcnRfY21kX2NoZWNrX3N0b3AoKQorCSAqIEkvTyBkZXNjcmlwdG9yIGluIHRyYW5zcG9ydF9jbWRfY2hlY2tfc3RvcCgpLgorCSAqCisJICogUmV0dXJuaW5nIDEgd2lsbCBzaWduYWwgYSBkZXNjcmlwdG9yIGhhcyBiZWVuIHJlbGVhc2VkLgorCSAqIFJldHVybmluZyAwIHdpbGwgc2lnbmFsIGEgZGVzY3JpcHRvciBoYXMgbm90IGJlZW4gcmVsZWFzZWQuCiAJICovCi0Jdm9pZCAoKmNoZWNrX3N0b3BfZnJlZSkoc3RydWN0IHNlX2NtZCAqKTsKKwlpbnQgKCpjaGVja19zdG9wX2ZyZWUpKHN0cnVjdCBzZV9jbWQgKik7CisJLyoKKwkgKiBPcHRpb25hbCBjaGVjayBmb3IgYWN0aXZlIEkvTyBzaHV0ZG93bgorCSAqLworCWludCAoKmNoZWNrX3JlbGVhc2VfY21kKShzdHJ1Y3Qgc2VfY21kICopOwogCXZvaWQgKCpyZWxlYXNlX2NtZCkoc3RydWN0IHNlX2NtZCAqKTsKIAkvKgogCSAqIENhbGxlZCB3aXRoIHNwaW5fbG9ja19iaChzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwLT5zZXNzaW9uX2xvY2sgaGVsZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKaW5kZXggYTAzN2ExYS4uYzE2ZTk0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKQEAgLTE2MCwxNyArMTYwLDIwIEBACiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV9kYXRhKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfbmV3X2NtZF9mYWlsdXJlKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX2hhbmRsZV90bXIoc3RydWN0IHNlX2NtZCAqKTsKLWV4dGVybiB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kX2ludHIoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiBib29sIHRhcmdldF9zdG9wX3Rhc2soc3RydWN0IHNlX3Rhc2sgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKTsKIGV4dGVybiBpbnQgdHJhbnNwb3J0X2dlbmVyaWNfbWFwX21lbV90b19jbWQoc3RydWN0IHNlX2NtZCAqY21kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdTMyLAogCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqLCB1MzIpOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfY2xlYXJfbHVuX2Zyb21fc2Vzc2lvbnMoc3RydWN0IHNlX2x1biAqKTsKLWV4dGVybiB2b2lkIHRyYW5zcG9ydF93YWl0X2Zvcl90YXNrcyhzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGJvb2wgdHJhbnNwb3J0X3dhaXRfZm9yX3Rhc2tzKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9jaGVja19hYm9ydGVkX3N0YXR1cyhzdHJ1Y3Qgc2VfY21kICosIGludCk7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2Uoc3RydWN0IHNlX2NtZCAqLCB1OCwgaW50KTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9zZW5kX3Rhc2tfYWJvcnQoc3RydWN0IHNlX2NtZCAqKTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9yZWxlYXNlX2NtZChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoc3RydWN0IHNlX2NtZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdGFyZ2V0X2dldF9zZXNzX2NtZChzdHJ1Y3Qgc2Vfc2Vzc2lvbiAqLCBzdHJ1Y3Qgc2VfY21kICopOworZXh0ZXJuIGludCB0YXJnZXRfcHV0X3Nlc3NfY21kKHN0cnVjdCBzZV9zZXNzaW9uICosIHN0cnVjdCBzZV9jbWQgKik7CitleHRlcm4gdm9pZCB0YXJnZXRfc3BsaWNlX3Nlc3NfY21kX2xpc3Qoc3RydWN0IHNlX3Nlc3Npb24gKik7CitleHRlcm4gdm9pZCB0YXJnZXRfd2FpdF9mb3Jfc2Vzc19jbWRzKHN0cnVjdCBzZV9zZXNzaW9uICosIGludCk7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY193YWl0X2Zvcl9jbWRzKHN0cnVjdCBzZV9jbWQgKiwgaW50KTsKIGV4dGVybiB2b2lkIHRyYW5zcG9ydF9kb190YXNrX3NnX2NoYWluKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19wcm9jZXNzX3dyaXRlKHN0cnVjdCBzZV9jbWQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaAppbmRleCBkYTM5YjIyLi5iMGI0ZWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmgKQEAgLTIxLDE2ICsyMSw2IEBACiAjdW5kZWYgQ1JFQVRFX1RSQUNFX1BPSU5UUwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0vKgotICogbW9kdWxlLmggaW5jbHVkZXMgdHJhY2Vwb2ludHMsIGFuZCBiZWNhdXNlIGZ0cmFjZS5oCi0gKiBwdWxscyBpbiBtb2R1bGUuaDoKLSAqICB0cmFjZS9mdHJhY2UuaCAtPiBsaW51eC9mdHJhY2VfZXZlbnQuaCAtPiBsaW51eC9wZXJmX2V2ZW50LmggLT4KLSAqICBsaW51eC9mdHJhY2UuaCAtPiBsaW51eC9tb2R1bGUuaAotICogd2UgbXVzdCBpbmNsdWRlIG1vZHVsZS5oIGhlcmUgYmVmb3JlIHdlIHBsYXkgd2l0aCBhbnkgb2YKLSAqIHRoZSBUUkFDRV9FVkVOVCgpIG1hY3Jvcywgb3RoZXJ3aXNlIHRoZSB0cmFjZXBvaW50cyBpbmNsdWRlZAotICogYnkgbW9kdWxlLmggbWF5IGJyZWFrIHRoZSBidWlsZC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjdW5kZWYgVFJBQ0VfRVZFTlQKICNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaAppbmRleCA2MDNmNWEwLi5hYjI2ZjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9hc29jLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYXNvYy5oCkBAIC0yMTYsNiArMjE2LDMxIEBACiAKICk7CiAKK1RSQUNFX0VWRU5UKHNuZF9zb2NfZGFwbV93YWxrX2RvbmUsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKSwKKworCVRQX0FSR1MoY2FyZCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZygJbmFtZSwJY2FyZC0+bmFtZQkJKQorCQlfX2ZpZWxkKAlpbnQsCXBvd2VyX2NoZWNrcwkJKQorCQlfX2ZpZWxkKAlpbnQsCXBhdGhfY2hlY2tzCQkpCisJCV9fZmllbGQoCWludCwJbmVpZ2hib3VyX2NoZWNrcwkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgY2FyZC0+bmFtZSk7CisJCV9fZW50cnktPnBvd2VyX2NoZWNrcyA9IGNhcmQtPmRhcG1fc3RhdHMucG93ZXJfY2hlY2tzOworCQlfX2VudHJ5LT5wYXRoX2NoZWNrcyA9IGNhcmQtPmRhcG1fc3RhdHMucGF0aF9jaGVja3M7CisJCV9fZW50cnktPm5laWdoYm91cl9jaGVja3MgPSBjYXJkLT5kYXBtX3N0YXRzLm5laWdoYm91cl9jaGVja3M7CisJKSwKKworCVRQX3ByaW50aygiJXM6IGNoZWNrcyAlZCBwb3dlciwgJWQgcGF0aCwgJWQgbmVpZ2hib3VyIiwKKwkJICBfX2dldF9zdHIobmFtZSksIChpbnQpX19lbnRyeS0+cG93ZXJfY2hlY2tzLAorCQkgIChpbnQpX19lbnRyeS0+cGF0aF9jaGVja3MsIChpbnQpX19lbnRyeS0+bmVpZ2hib3VyX2NoZWNrcykKKyk7CisKIFRSQUNFX0VWRU5UKHNuZF9zb2NfamFja19pcnEsCiAKIAlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCBiNTBhNTQ3Li43NDhmZjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC05LDkgKzksMTIgQEAKIAogc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0Owogc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0Oworc3RydWN0IGV4dDRfZXh0ZW50Owogc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2U7CiBzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvOwogc3RydWN0IG1wYWdlX2RhX2RhdGE7CitzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzOworc3RydWN0IGV4dDRfZXh0ZW50OwogCiAjZGVmaW5lIEVYVDRfSShpbm9kZSkgKGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKIApAQCAtMTAzMiw5ICsxMDM1LDkgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UsCi0JVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVzZWRfYmxvY2tzKSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdXNlZF9ibG9ja3MsIGludCBxdW90YV9jbGFpbSksCiAKLQlUUF9BUkdTKGlub2RlLCB1c2VkX2Jsb2NrcyksCisJVFBfQVJHUyhpbm9kZSwgdXNlZF9ibG9ja3MsIHF1b3RhX2NsYWltKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCkBAIC0xMDQ1LDYgKzEwNDgsNyBAQAogCQlfX2ZpZWxkKAlpbnQsCXJlc2VydmVkX2RhdGFfYmxvY2tzCSkKIAkJX19maWVsZCgJaW50LAlyZXNlcnZlZF9tZXRhX2Jsb2NrcwkpCiAJCV9fZmllbGQoCWludCwJYWxsb2NhdGVkX21ldGFfYmxvY2tzCSkKKwkJX19maWVsZCgJaW50LAlxdW90YV9jbGFpbQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEwNTMsMTkgKzEwNTcsMjQgQEAKIAkJX19lbnRyeS0+bW9kZQk9IGlub2RlLT5pX21vZGU7CiAJCV9fZW50cnktPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxvY2tzOwogCQlfX2VudHJ5LT51c2VkX2Jsb2NrcyA9IHVzZWRfYmxvY2tzOwotCQlfX2VudHJ5LT5yZXNlcnZlZF9kYXRhX2Jsb2NrcyA9IEVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7Ci0JCV9fZW50cnktPnJlc2VydmVkX21ldGFfYmxvY2tzID0gRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKLQkJX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzID0gRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CisJCV9fZW50cnktPnJlc2VydmVkX2RhdGFfYmxvY2tzID0KKwkJCQlFWFQ0X0koaW5vZGUpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzOworCQlfX2VudHJ5LT5yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9CisJCQkJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKKwkJX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzID0KKwkJCQlFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKKwkJX19lbnRyeS0+cXVvdGFfY2xhaW0gPSBxdW90YV9jbGFpbTsKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBtb2RlIDAlbyBpX2Jsb2NrcyAlbGx1IHVzZWRfYmxvY2tzICVkICIKIAkJICAicmVzZXJ2ZWRfZGF0YV9ibG9ja3MgJWQgcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgJWQgIgotCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQiLAorCQkgICJhbGxvY2F0ZWRfbWV0YV9ibG9ja3MgJWQgcXVvdGFfY2xhaW0gJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKIAkJICBfX2VudHJ5LT5tb2RlLCBfX2VudHJ5LT5pX2Jsb2NrcywKIAkJICBfX2VudHJ5LT51c2VkX2Jsb2NrcywgX19lbnRyeS0+cmVzZXJ2ZWRfZGF0YV9ibG9ja3MsCi0JCSAgX19lbnRyeS0+cmVzZXJ2ZWRfbWV0YV9ibG9ja3MsIF9fZW50cnktPmFsbG9jYXRlZF9tZXRhX2Jsb2NrcykKKwkJICBfX2VudHJ5LT5yZXNlcnZlZF9tZXRhX2Jsb2NrcywgX19lbnRyeS0+YWxsb2NhdGVkX21ldGFfYmxvY2tzLAorCQkgIF9fZW50cnktPnF1b3RhX2NsYWltKQogKTsKIAogVFJBQ0VfRVZFTlQoZXh0NF9kYV9yZXNlcnZlX3NwYWNlLApAQCAtMTM4Niw2ICsxMzk1LDg3IEBACiAJVFBfQVJHUyhpbm9kZSkKICk7CiAKKy8qICd1eCcgaXMgdGhlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LiAqLworVFJBQ0VfRVZFTlQoZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZF9lbnRlciwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCSBzdHJ1Y3QgZXh0NF9leHRlbnQgKnV4KSwKKworCVRQX0FSR1MoaW5vZGUsIG1hcCwgdXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAltX2xibGsJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJdV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCXVfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAl1X3BibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bV9sYmxrCQk9IG1hcC0+bV9sYmxrOworCQlfX2VudHJ5LT5tX2xlbgkJPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT51X2xibGsJCT0gbGUzMl90b19jcHUodXgtPmVlX2Jsb2NrKTsKKwkJX19lbnRyeS0+dV9sZW4JCT0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4odXgpOworCQlfX2VudHJ5LT51X3BibGsJCT0gZXh0NF9leHRfcGJsb2NrKHV4KTsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBtX2xibGsgJXUgbV9sZW4gJXUgdV9sYmxrICV1IHVfbGVuICV1ICIKKwkJICAidV9wYmxrICVsbHUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICBfX2VudHJ5LT5tX2xibGssIF9fZW50cnktPm1fbGVuLAorCQkgIF9fZW50cnktPnVfbGJsaywgX19lbnRyeS0+dV9sZW4sIF9fZW50cnktPnVfcGJsaykKKyk7CisKKy8qCisgKiAndXgnIGlzIHRoZSB1bmluaXRpYWxpemVkIGV4dGVudC4KKyAqICdpeCcgaXMgdGhlIGluaXRpYWxpemVkIGV4dGVudCB0byB3aGljaCBibG9ja3MgYXJlIHRyYW5zZmVycmVkLgorICovCitUUkFDRV9FVkVOVChleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkX2Zhc3RwYXRoLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwKKwkJIHN0cnVjdCBleHQ0X2V4dGVudCAqdXgsIHN0cnVjdCBleHQ0X2V4dGVudCAqaXgpLAorCisJVFBfQVJHUyhpbm9kZSwgbWFwLCB1eCwgaXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAltX2xibGsJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCwJbV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJdV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCXVfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAl1X3BibGsJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJaV9sYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQsCWlfbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlpX3BibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bV9sYmxrCQk9IG1hcC0+bV9sYmxrOworCQlfX2VudHJ5LT5tX2xlbgkJPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT51X2xibGsJCT0gbGUzMl90b19jcHUodXgtPmVlX2Jsb2NrKTsKKwkJX19lbnRyeS0+dV9sZW4JCT0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4odXgpOworCQlfX2VudHJ5LT51X3BibGsJCT0gZXh0NF9leHRfcGJsb2NrKHV4KTsKKwkJX19lbnRyeS0+aV9sYmxrCQk9IGxlMzJfdG9fY3B1KGl4LT5lZV9ibG9jayk7CisJCV9fZW50cnktPmlfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGl4KTsKKwkJX19lbnRyeS0+aV9wYmxrCQk9IGV4dDRfZXh0X3BibG9jayhpeCk7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbV9sYmxrICV1IG1fbGVuICV1ICIKKwkJICAidV9sYmxrICV1IHVfbGVuICV1IHVfcGJsayAlbGx1ICIKKwkJICAiaV9sYmxrICV1IGlfbGVuICV1IGlfcGJsayAlbGx1ICIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgIF9fZW50cnktPm1fbGJsaywgX19lbnRyeS0+bV9sZW4sCisJCSAgX19lbnRyeS0+dV9sYmxrLCBfX2VudHJ5LT51X2xlbiwgX19lbnRyeS0+dV9wYmxrLAorCQkgIF9fZW50cnktPmlfbGJsaywgX19lbnRyeS0+aV9sZW4sIF9fZW50cnktPmlfcGJsaykKKyk7CisKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fbWFwX2Jsb2Nrc19lbnRlciwKIAlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAogCQkgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKSwKQEAgLTE1ODksNiArMTY3OSwzODIgQEAKIAlUUF9BUkdTKHNiLCBncm91cCwgc3RhcnQsIGxlbikKICk7CiAKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X2hhbmRsZV91bmluaXRpYWxpemVkX2V4dGVudHMsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkgdW5zaWduZWQgaW50IGFsbG9jYXRlZCwgZXh0NF9mc2Jsa190IG5ld2Jsb2NrKSwKKworCVRQX0FSR1MoaW5vZGUsIG1hcCwgYWxsb2NhdGVkLCBuZXdibG9jayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbm9fdCwJCWlubwkJKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBibGsJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JCSkKKwkJX19maWVsZCgJaW50LAkJZmxhZ3MJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlhbGxvY2F0ZWQJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCW5ld2JsawkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawkJPSBtYXAtPm1fbGJsazsKKwkJX19lbnRyeS0+cGJsawkJPSBtYXAtPm1fcGJsazsKKwkJX19lbnRyeS0+bGVuCQk9IG1hcC0+bV9sZW47CisJCV9fZW50cnktPmZsYWdzCQk9IG1hcC0+bV9mbGFnczsKKwkJX19lbnRyeS0+YWxsb2NhdGVkCT0gYWxsb2NhdGVkOworCQlfX2VudHJ5LT5uZXdibGsJCT0gbmV3YmxvY2s7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbV9sYmxrICV1IG1fcGJsayAlbGx1IG1fbGVuICV1IGZsYWdzICVkIgorCQkgICJhbGxvY2F0ZWQgJWQgbmV3YmxvY2sgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzLAorCQkgICh1bnNpZ25lZCBpbnQpIF9fZW50cnktPmFsbG9jYXRlZCwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5uZXdibGspCispOworCitUUkFDRV9FVkVOVChleHQ0X2dldF9pbXBsaWVkX2NsdXN0ZXJfYWxsb2NfZXhpdCwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsIGludCByZXQpLAorCisJVFBfQVJHUyhzYiwgbWFwLCByZXQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWV4dDRfZnNibGtfdCwJcGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJbGVuCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlmbGFncwkpCisJCV9fZmllbGQoCWludCwJCXJldAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJPSBzYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBtYXAtPm1fbGJsazsKKwkJX19lbnRyeS0+cGJsawk9IG1hcC0+bV9wYmxrOworCQlfX2VudHJ5LT5sZW4JPSBtYXAtPm1fbGVuOworCQlfX2VudHJ5LT5mbGFncwk9IG1hcC0+bV9mbGFnczsKKwkJX19lbnRyeS0+cmV0CT0gcmV0OworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBtX2xibGsgJXUgbV9wYmxrICVsbHUgbV9sZW4gJXUgbV9mbGFncyAldSByZXQgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bGJsaywgKHVuc2lnbmVkIGxvbmcgbG9uZykgX19lbnRyeS0+cGJsaywKKwkJICBfX2VudHJ5LT5sZW4sIF9fZW50cnktPmZsYWdzLCBfX2VudHJ5LT5yZXQpCispOworCitUUkFDRV9FVkVOVChleHQ0X2V4dF9wdXRfaW5fY2FjaGUsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgdW5zaWduZWQgaW50IGxlbiwKKwkJIGV4dDRfZnNibGtfdCBzdGFydCksCisKKwlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4sIHN0YXJ0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJbGVuCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlzdGFydAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawk9IGxibGs7CisJCV9fZW50cnktPmxlbgk9IGxlbjsKKwkJX19lbnRyeS0+c3RhcnQJPSBzdGFydDsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IGxlbiAldSBzdGFydCAlbGx1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5sYmxrLAorCQkgIF9fZW50cnktPmxlbiwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5zdGFydCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X2luX2NhY2hlLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibGssIGludCByZXQpLAorCisJVFBfQVJHUyhpbm9kZSwgbGJsaywgcmV0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWludCwJCXJldAkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+bGJsawk9IGxibGs7CisJCV9fZW50cnktPnJldAk9IHJldDsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBsYmxrICV1IHJldCAlZCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywKKwkJICBfX2VudHJ5LT5yZXQpCisKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZmluZF9kZWxhbGxvY19yYW5nZSwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBmcm9tLCBleHQ0X2xibGtfdCB0bywKKwkJaW50IHJldmVyc2UsIGludCBmb3VuZCwgZXh0NF9sYmxrX3QgZm91bmRfYmxrKSwKKworCVRQX0FSR1MoaW5vZGUsIGZyb20sIHRvLCByZXZlcnNlLCBmb3VuZCwgZm91bmRfYmxrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCQkpCisJCV9fZmllbGQoCWRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmcm9tCQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAl0bwkJKQorCQlfX2ZpZWxkKAlpbnQsCQlyZXZlcnNlCQkpCisJCV9fZmllbGQoCWludCwJCWZvdW5kCQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmb3VuZF9ibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+ZnJvbQkJPSBmcm9tOworCQlfX2VudHJ5LT50bwkJPSB0bzsKKwkJX19lbnRyeS0+cmV2ZXJzZQk9IHJldmVyc2U7CisJCV9fZW50cnktPmZvdW5kCQk9IGZvdW5kOworCQlfX2VudHJ5LT5mb3VuZF9ibGsJPSBmb3VuZF9ibGs7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgZnJvbSAldSB0byAldSByZXZlcnNlICVkIGZvdW5kICVkICIKKwkJICAiKGJsayA9ICV1KSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+ZnJvbSwgKHVuc2lnbmVkKSBfX2VudHJ5LT50bywKKwkJICBfX2VudHJ5LT5yZXZlcnNlLCBfX2VudHJ5LT5mb3VuZCwKKwkJICAodW5zaWduZWQpIF9fZW50cnktPmZvdW5kX2JsaykKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZ2V0X3Jlc2VydmVkX2NsdXN0ZXJfYWxsb2MsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgdW5zaWduZWQgaW50IGxlbiksCisKKwlUUF9BUkdTKGlub2RlLCBsYmxrLCBsZW4pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlsYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAlsZW4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBsYmxrOworCQlfX2VudHJ5LT5sZW4JPSBsZW47CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgbGJsayAldSBsZW4gJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPmxibGssCisJCSAgX19lbnRyeS0+bGVuKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9leHRfc2hvd19leHRlbnQsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsaywgZXh0NF9mc2Jsa190IHBibGssCisJCSB1bnNpZ25lZCBzaG9ydCBsZW4pLAorCisJVFBfQVJHUyhpbm9kZSwgbGJsaywgcGJsaywgbGVuKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJbGJsawkpCisJCV9fZmllbGQoCWV4dDRfZnNibGtfdCwJcGJsawkpCisJCV9fZmllbGQoCXVuc2lnbmVkIHNob3J0LAlsZW4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmxibGsJPSBsYmxrOworCQlfX2VudHJ5LT5wYmxrCT0gcGJsazsKKwkJX19lbnRyeS0+bGVuCT0gbGVuOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGxibGsgJXUgcGJsayAlbGx1IGxlbiAldSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+bGJsaywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5wYmxrLAorCQkgICh1bnNpZ25lZCBzaG9ydCkgX19lbnRyeS0+bGVuKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9yZW1vdmVfYmxvY2tzLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAorCQlleHQ0X2xibGtfdCBmcm9tLCBleHQ0X2ZzYmxrX3QgdG8sCisJCWV4dDRfZnNibGtfdCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfQVJHUyhpbm9kZSwgZXgsIGZyb20sIHRvLCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAllZV9sYmxrCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAllZV9wYmxrCSkKKwkJX19maWVsZCgJdW5zaWduZWQgc2hvcnQsCWVlX2xlbgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlmcm9tCSkKKwkJX19maWVsZCgJZXh0NF9sYmxrX3QsCXRvCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAlwYXJ0aWFsCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlubwkJPSBpbm9kZS0+aV9pbm87CisJCV9fZW50cnktPmRldgkJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPmVlX2xibGsJPSBjcHVfdG9fbGUzMihleC0+ZWVfYmxvY2spOworCQlfX2VudHJ5LT5lZV9wYmxrCT0gZXh0NF9leHRfcGJsb2NrKGV4KTsKKwkJX19lbnRyeS0+ZWVfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwkJX19lbnRyeS0+ZnJvbQkJPSBmcm9tOworCQlfX2VudHJ5LT50bwkJPSB0bzsKKwkJX19lbnRyeS0+cGFydGlhbAk9IHBhcnRpYWxfY2x1c3RlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBleHRlbnQgWyV1KCVsbHUpLCAldV0iCisJCSAgImZyb20gJXUgdG8gJXUgcGFydGlhbF9jbHVzdGVyICV1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5lZV9sYmxrLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPmVlX3BibGssCisJCSAgKHVuc2lnbmVkIHNob3J0KSBfX2VudHJ5LT5lZV9sZW4sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5mcm9tLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+dG8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5wYXJ0aWFsKQorKTsKKworVFJBQ0VfRVZFTlQoZXh0NF9leHRfcm1fbGVhZiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCwKKwkJIHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsIGV4dDRfZnNibGtfdCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfQVJHUyhpbm9kZSwgc3RhcnQsIGV4LCBwYXJ0aWFsX2NsdXN0ZXIpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAllZV9sYmxrCSkKKwkJX19maWVsZCgJZXh0NF9mc2Jsa190LAllZV9wYmxrCSkKKwkJX19maWVsZCgJc2hvcnQsCQllZV9sZW4JKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBhcnRpYWwJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCQk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CQk9IGlub2RlLT5pX3NiLT5zX2RldjsKKwkJX19lbnRyeS0+c3RhcnQJCT0gc3RhcnQ7CisJCV9fZW50cnktPmVlX2xibGsJPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCQlfX2VudHJ5LT5lZV9wYmxrCT0gZXh0NF9leHRfcGJsb2NrKGV4KTsKKwkJX19lbnRyeS0+ZWVfbGVuCQk9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKKwkJX19lbnRyeS0+cGFydGlhbAk9IHBhcnRpYWxfY2x1c3RlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzdGFydF9sYmxrICV1IGxhc3RfZXh0ZW50IFsldSglbGx1KSwgJXVdIgorCQkgICJwYXJ0aWFsX2NsdXN0ZXIgJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPnN0YXJ0LAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+ZWVfbGJsaywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKSBfX2VudHJ5LT5lZV9wYmxrLAorCQkgICh1bnNpZ25lZCBzaG9ydCkgX19lbnRyeS0+ZWVfbGVuLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+cGFydGlhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X3JtX2lkeCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgcGJsayksCisKKwlUUF9BUkdTKGlub2RlLCBwYmxrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCSkKKwkJX19maWVsZCgJZGV2X3QsCQlkZXYJKQorCQlfX2ZpZWxkKAlleHQ0X2ZzYmxrX3QsCXBibGsJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCV9fZW50cnktPnBibGsJPSBwYmxrOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGluZGV4X3BibGsgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIF9fZW50cnktPnBibGspCispOworCitUUkFDRV9FVkVOVChleHQ0X2V4dF9yZW1vdmVfc3BhY2UsCisJVFBfUFJPVE8oc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsIGludCBkZXB0aCksCisKKwlUUF9BUkdTKGlub2RlLCBzdGFydCwgZGVwdGgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW5vX3QsCQlpbm8JKQorCQlfX2ZpZWxkKAlkZXZfdCwJCWRldgkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkpCisJCV9fZmllbGQoCWludCwJCWRlcHRoCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlubwk9IGlub2RlLT5pX2lubzsKKwkJX19lbnRyeS0+ZGV2CT0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5zdGFydAk9IHN0YXJ0OworCQlfX2VudHJ5LT5kZXB0aAk9IGRlcHRoOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IHNpbmNlICV1IGRlcHRoICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sCisJCSAgKHVuc2lnbmVkKSBfX2VudHJ5LT5zdGFydCwKKwkJICBfX2VudHJ5LT5kZXB0aCkKKyk7CisKK1RSQUNFX0VWRU5UKGV4dDRfZXh0X3JlbW92ZV9zcGFjZV9kb25lLAorCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LCBpbnQgZGVwdGgsCisJCWV4dDRfbGJsa190IHBhcnRpYWwsIHVuc2lnbmVkIHNob3J0IGVoX2VudHJpZXMpLAorCisJVFBfQVJHUyhpbm9kZSwgc3RhcnQsIGRlcHRoLCBwYXJ0aWFsLCBlaF9lbnRyaWVzKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWlub190LAkJaW5vCQkpCisJCV9fZmllbGQoCWRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoCWV4dDRfbGJsa190LAlzdGFydAkJKQorCQlfX2ZpZWxkKAlpbnQsCQlkZXB0aAkJKQorCQlfX2ZpZWxkKAlleHQ0X2xibGtfdCwJcGFydGlhbAkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBzaG9ydCwJZWhfZW50cmllcwkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pbm8JCT0gaW5vZGUtPmlfaW5vOworCQlfX2VudHJ5LT5kZXYJCT0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlfX2VudHJ5LT5zdGFydAkJPSBzdGFydDsKKwkJX19lbnRyeS0+ZGVwdGgJCT0gZGVwdGg7CisJCV9fZW50cnktPnBhcnRpYWwJPSBwYXJ0aWFsOworCQlfX2VudHJ5LT5laF9lbnRyaWVzCT0gZWhfZW50cmllczsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBzaW5jZSAldSBkZXB0aCAlZCBwYXJ0aWFsICV1ICIKKwkJICAicmVtYWluaW5nX2VudHJpZXMgJXUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubywKKwkJICAodW5zaWduZWQpIF9fZW50cnktPnN0YXJ0LAorCQkgIF9fZW50cnktPmRlcHRoLAorCQkgICh1bnNpZ25lZCkgX19lbnRyeS0+cGFydGlhbCwKKwkJICAodW5zaWduZWQgc2hvcnQpIF9fZW50cnktPmVoX2VudHJpZXMpCispOworCiAjZW5kaWYgLyogX1RSQUNFX0VYVDRfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21vZHVsZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKaW5kZXggMjFhNTQ2ZC4uMTYxOTMyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogQmVjYXVzZSBsaW51eC9tb2R1bGUuaCBoYXMgdHJhY2Vwb2ludHMgaW4gdGhlIGhlYWRlciwgYW5kIGZ0cmFjZS5oCi0gKiBldmVudHVhbGx5IGluY2x1ZGVzIHRoaXMgZmlsZSwgZGVmaW5lX3RyYWNlLmggaW5jbHVkZXMgbGludXgvbW9kdWxlLmgKKyAqIHVzZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUsIGRlZmluZV90cmFjZS5oIGluY2x1ZGVzIGxpbnV4L21vZHVsZS5oCiAgKiBCdXQgd2UgZG8gbm90IHdhbnQgdGhlIG1vZHVsZS5oIHRvIG92ZXJyaWRlIHRoZSBUUkFDRV9TWVNURU0gbWFjcm8KICAqIHZhcmlhYmxlIHRoYXQgZGVmaW5lX3RyYWNlLmggaXMgcHJvY2Vzc2luZywgc28gd2Ugb25seSBzZXQgaXQKICAqIHdoZW4gbW9kdWxlIGV2ZW50cyBhcmUgYmVpbmcgcHJvY2Vzc2VkLCB3aGljaCB3b3VsZCBoYXBwZW4gd2hlbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCAzNjg1MWY3Li5lZGM0YjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtMjY2LDcgKzI2Niw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4sCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZGlydHksCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZmFpbGVkLAotCQlpbnQgaXNvbGF0ZV9tb2RlKSwKKwkJaXNvbGF0ZV9tb2RlX3QgaXNvbGF0ZV9tb2RlKSwKIAogCVRQX0FSR1Mob3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIG5yX2x1bXB5X3Rha2VuLCBucl9sdW1weV9kaXJ0eSwgbnJfbHVtcHlfZmFpbGVkLCBpc29sYXRlX21vZGUpLAogCkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV90YWtlbikKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV9kaXJ0eSkKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9sdW1weV9mYWlsZWQpCi0JCV9fZmllbGQoaW50LCBpc29sYXRlX21vZGUpCisJCV9fZmllbGQoaXNvbGF0ZV9tb2RlX3QsIGlzb2xhdGVfbW9kZSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV90YWtlbiwKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV9kaXJ0eSwKIAkJdW5zaWduZWQgbG9uZyBucl9sdW1weV9mYWlsZWQsCi0JCWludCBpc29sYXRlX21vZGUpLAorCQlpc29sYXRlX21vZGVfdCBpc29sYXRlX21vZGUpLAogCiAJVFBfQVJHUyhvcmRlciwgbnJfcmVxdWVzdGVkLCBucl9zY2FubmVkLCBucl90YWtlbiwgbnJfbHVtcHlfdGFrZW4sIG5yX2x1bXB5X2RpcnR5LCBucl9sdW1weV9mYWlsZWQsIGlzb2xhdGVfbW9kZSkKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4sCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZGlydHksCiAJCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfZmFpbGVkLAotCQlpbnQgaXNvbGF0ZV9tb2RlKSwKKwkJaXNvbGF0ZV9tb2RlX3QgaXNvbGF0ZV9tb2RlKSwKIAogCVRQX0FSR1Mob3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIG5yX2x1bXB5X3Rha2VuLCBucl9sdW1weV9kaXJ0eSwgbnJfbHVtcHlfZmFpbGVkLCBpc29sYXRlX21vZGUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKaW5kZXggNWYxNzI3MC4uYjk5Y2FhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmgKQEAgLTM0LDYgKzM0LDcgQEAKIAkJX19maWVsZChpbnQsIGZvcl9rdXBkYXRlKQogCQlfX2ZpZWxkKGludCwgcmFuZ2VfY3ljbGljKQogCQlfX2ZpZWxkKGludCwgZm9yX2JhY2tncm91bmQpCisJCV9fZmllbGQoaW50LCByZWFzb24pCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKIAkJc3RybmNweShfX2VudHJ5LT5uYW1lLCBkZXZfbmFtZShiZGktPmRldiksIDMyKTsKQEAgLTQzLDE2ICs0NCwxOCBAQAogCQlfX2VudHJ5LT5mb3Jfa3VwZGF0ZSA9IHdvcmstPmZvcl9rdXBkYXRlOwogCQlfX2VudHJ5LT5yYW5nZV9jeWNsaWMgPSB3b3JrLT5yYW5nZV9jeWNsaWM7CiAJCV9fZW50cnktPmZvcl9iYWNrZ3JvdW5kCT0gd29yay0+Zm9yX2JhY2tncm91bmQ7CisJCV9fZW50cnktPnJlYXNvbiA9IHdvcmstPnJlYXNvbjsKIAkpLAogCVRQX3ByaW50aygiYmRpICVzOiBzYl9kZXYgJWQ6JWQgbnJfcGFnZXM9JWxkIHN5bmNfbW9kZT0lZCAiCi0JCSAgImt1cGRhdGU9JWQgcmFuZ2VfY3ljbGljPSVkIGJhY2tncm91bmQ9JWQiLAorCQkgICJrdXBkYXRlPSVkIHJhbmdlX2N5Y2xpYz0lZCBiYWNrZ3JvdW5kPSVkIHJlYXNvbj0lcyIsCiAJCSAgX19lbnRyeS0+bmFtZSwKIAkJICBNQUpPUihfX2VudHJ5LT5zYl9kZXYpLCBNSU5PUihfX2VudHJ5LT5zYl9kZXYpLAogCQkgIF9fZW50cnktPm5yX3BhZ2VzLAogCQkgIF9fZW50cnktPnN5bmNfbW9kZSwKIAkJICBfX2VudHJ5LT5mb3Jfa3VwZGF0ZSwKIAkJICBfX2VudHJ5LT5yYW5nZV9jeWNsaWMsCi0JCSAgX19lbnRyeS0+Zm9yX2JhY2tncm91bmQKKwkJICBfX2VudHJ5LT5mb3JfYmFja2dyb3VuZCwKKwkJICB3Yl9yZWFzb25fbmFtZVtfX2VudHJ5LT5yZWFzb25dCiAJKQogKTsKICNkZWZpbmUgREVGSU5FX1dSSVRFQkFDS19XT1JLX0VWRU5UKG5hbWUpIFwKQEAgLTEwNCwzMCArMTA3LDYgQEAKIERFRklORV9XUklURUJBQ0tfRVZFTlQod3JpdGViYWNrX2JkaV91bnJlZ2lzdGVyKTsKIERFRklORV9XUklURUJBQ0tfRVZFTlQod3JpdGViYWNrX3RocmVhZF9zdGFydCk7CiBERUZJTkVfV1JJVEVCQUNLX0VWRU5UKHdyaXRlYmFja190aHJlYWRfc3RvcCk7Ci1ERUZJTkVfV1JJVEVCQUNLX0VWRU5UKGJhbGFuY2VfZGlydHlfc3RhcnQpOwotREVGSU5FX1dSSVRFQkFDS19FVkVOVChiYWxhbmNlX2RpcnR5X3dhaXQpOwotCi1UUkFDRV9FVkVOVChiYWxhbmNlX2RpcnR5X3dyaXR0ZW4sCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgd3JpdHRlbiksCi0KLQlUUF9BUkdTKGJkaSwgd3JpdHRlbiksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2FycmF5KGNoYXIsCW5hbWUsIDMyKQotCQlfX2ZpZWxkKGludCwJd3JpdHRlbikKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCXN0cm5jcHkoX19lbnRyeS0+bmFtZSwgZGV2X25hbWUoYmRpLT5kZXYpLCAzMik7Ci0JCV9fZW50cnktPndyaXR0ZW4gPSB3cml0dGVuOwotCSksCi0KLQlUUF9wcmludGsoImJkaSAlcyB3cml0dGVuICVkIiwKLQkJICBfX2VudHJ5LT5uYW1lLAotCQkgIF9fZW50cnktPndyaXR0ZW4KLQkpCi0pOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHdiY19jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSksCkBAIC0xODEsMjcgKzE2MCwzMSBAQAogCiBUUkFDRV9FVkVOVCh3cml0ZWJhY2tfcXVldWVfaW8sCiAJVFBfUFJPVE8oc3RydWN0IGJkaV93cml0ZWJhY2sgKndiLAotCQkgdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzLAorCQkgc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrLAogCQkgaW50IG1vdmVkKSwKLQlUUF9BUkdTKHdiLCBvbGRlcl90aGFuX3RoaXMsIG1vdmVkKSwKKwlUUF9BUkdTKHdiLCB3b3JrLCBtb3ZlZCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19hcnJheShjaGFyLAkJbmFtZSwgMzIpCiAJCV9fZmllbGQodW5zaWduZWQgbG9uZywJb2xkZXIpCiAJCV9fZmllbGQobG9uZywJCWFnZSkKIAkJX19maWVsZChpbnQsCQltb3ZlZCkKKwkJX19maWVsZChpbnQsCQlyZWFzb24pCiAJKSwKIAlUUF9mYXN0X2Fzc2lnbigKKwkJdW5zaWduZWQgbG9uZyAqb2xkZXJfdGhhbl90aGlzID0gd29yay0+b2xkZXJfdGhhbl90aGlzOwogCQlzdHJuY3B5KF9fZW50cnktPm5hbWUsIGRldl9uYW1lKHdiLT5iZGktPmRldiksIDMyKTsKIAkJX19lbnRyeS0+b2xkZXIJPSBvbGRlcl90aGFuX3RoaXMgPyAgKm9sZGVyX3RoYW5fdGhpcyA6IDA7CiAJCV9fZW50cnktPmFnZQk9IG9sZGVyX3RoYW5fdGhpcyA/CiAJCQkJICAoamlmZmllcyAtICpvbGRlcl90aGFuX3RoaXMpICogMTAwMCAvIEhaIDogLTE7CiAJCV9fZW50cnktPm1vdmVkCT0gbW92ZWQ7CisJCV9fZW50cnktPnJlYXNvbgk9IHdvcmstPnJlYXNvbjsKIAkpLAotCVRQX3ByaW50aygiYmRpICVzOiBvbGRlcj0lbHUgYWdlPSVsZCBlbnF1ZXVlPSVkIiwKKwlUUF9wcmludGsoImJkaSAlczogb2xkZXI9JWx1IGFnZT0lbGQgZW5xdWV1ZT0lZCByZWFzb249JXMiLAogCQlfX2VudHJ5LT5uYW1lLAogCQlfX2VudHJ5LT5vbGRlciwJLyogb2xkZXJfdGhhbl90aGlzIGluIGppZmZpZXMgKi8KIAkJX19lbnRyeS0+YWdlLAkvKiBvbGRlcl90aGFuX3RoaXMgaW4gcmVsYXRpdmUgbWlsbGlzZWNvbmRzICovCi0JCV9fZW50cnktPm1vdmVkKQorCQlfX2VudHJ5LT5tb3ZlZCwKKwkJd2JfcmVhc29uX25hbWVbX19lbnRyeS0+cmVhc29uXSkKICk7CiAKIFRSQUNFX0VWRU5UKGdsb2JhbF9kaXJ0eV9zdGF0ZSwKQEAgLTI1MCw2ICsyMzMsMTI0IEBACiAJKQogKTsKIAorI2RlZmluZSBLQnBzKHgpCQkJKCh4KSA8PCAoUEFHRV9TSElGVCAtIDEwKSkKKworVFJBQ0VfRVZFTlQoYmRpX2RpcnR5X3JhdGVsaW1pdCwKKworCVRQX1BST1RPKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5X3JhdGUsCisJCSB1bnNpZ25lZCBsb25nIHRhc2tfcmF0ZWxpbWl0KSwKKworCVRQX0FSR1MoYmRpLCBkaXJ0eV9yYXRlLCB0YXNrX3JhdGVsaW1pdCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KGNoYXIsCQliZGksIDMyKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCXdyaXRlX2J3KQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWF2Z193cml0ZV9idykKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlkaXJ0eV9yYXRlKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWRpcnR5X3JhdGVsaW1pdCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAl0YXNrX3JhdGVsaW1pdCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAliYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlzdHJsY3B5KF9fZW50cnktPmJkaSwgZGV2X25hbWUoYmRpLT5kZXYpLCAzMik7CisJCV9fZW50cnktPndyaXRlX2J3CT0gS0JwcyhiZGktPndyaXRlX2JhbmR3aWR0aCk7CisJCV9fZW50cnktPmF2Z193cml0ZV9idwk9IEtCcHMoYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoKTsKKwkJX19lbnRyeS0+ZGlydHlfcmF0ZQk9IEtCcHMoZGlydHlfcmF0ZSk7CisJCV9fZW50cnktPmRpcnR5X3JhdGVsaW1pdCA9IEtCcHMoYmRpLT5kaXJ0eV9yYXRlbGltaXQpOworCQlfX2VudHJ5LT50YXNrX3JhdGVsaW1pdAk9IEtCcHModGFza19yYXRlbGltaXQpOworCQlfX2VudHJ5LT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQgPQorCQkJCQkgIEtCcHMoYmRpLT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpOworCSksCisKKwlUUF9wcmludGsoImJkaSAlczogIgorCQkgICJ3cml0ZV9idz0lbHUgYXdyaXRlX2J3PSVsdSBkaXJ0eV9yYXRlPSVsdSAiCisJCSAgImRpcnR5X3JhdGVsaW1pdD0lbHUgdGFza19yYXRlbGltaXQ9JWx1ICIKKwkJICAiYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0PSVsdSIsCisJCSAgX19lbnRyeS0+YmRpLAorCQkgIF9fZW50cnktPndyaXRlX2J3LAkJLyogd3JpdGUgYmFuZHdpZHRoICovCisJCSAgX19lbnRyeS0+YXZnX3dyaXRlX2J3LAkvKiBhdmcgd3JpdGUgYmFuZHdpZHRoICovCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZSwJCS8qIGJkaSBkaXJ0eSByYXRlICovCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZWxpbWl0LAkvKiBiYXNlIHJhdGVsaW1pdCAqLworCQkgIF9fZW50cnktPnRhc2tfcmF0ZWxpbWl0LCAvKiByYXRlbGltaXQgd2l0aCBwb3NpdGlvbiBjb250cm9sICovCisJCSAgX19lbnRyeS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0IC8qIHRoZSBiYWxhbmNlZCByYXRlbGltaXQgKi8KKwkpCispOworCitUUkFDRV9FVkVOVChiYWxhbmNlX2RpcnR5X3BhZ2VzLAorCisJVFBfUFJPVE8oc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKKwkJIHVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkgdW5zaWduZWQgbG9uZyBiZ190aHJlc2gsCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5LAorCQkgdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAorCQkgdW5zaWduZWQgbG9uZyBiZGlfZGlydHksCisJCSB1bnNpZ25lZCBsb25nIGRpcnR5X3JhdGVsaW1pdCwKKwkJIHVuc2lnbmVkIGxvbmcgdGFza19yYXRlbGltaXQsCisJCSB1bnNpZ25lZCBsb25nIGRpcnRpZWQsCisJCSBsb25nIHBhdXNlLAorCQkgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lKSwKKworCVRQX0FSR1MoYmRpLCB0aHJlc2gsIGJnX3RocmVzaCwgZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJZGlydHlfcmF0ZWxpbWl0LCB0YXNrX3JhdGVsaW1pdCwKKwkJZGlydGllZCwgcGF1c2UsIHN0YXJ0X3RpbWUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19hcnJheSgJIGNoYXIsCWJkaSwgMzIpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJc2V0cG9pbnQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJZGlydHkpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJYmRpX3NldHBvaW50KQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWJkaV9kaXJ0eSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlkaXJ0eV9yYXRlbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJdGFza19yYXRlbGltaXQpCisJCV9fZmllbGQodW5zaWduZWQgaW50LAlkaXJ0aWVkKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwJZGlydGllZF9wYXVzZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlwYXVzZWQpCisJCV9fZmllbGQoCSBsb25nLAlwYXVzZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCXVuc2lnbmVkIGxvbmcgZnJlZXJ1biA9ICh0aHJlc2ggKyBiZ190aHJlc2gpIC8gMjsKKwkJc3RybGNweShfX2VudHJ5LT5iZGksIGRldl9uYW1lKGJkaS0+ZGV2KSwgMzIpOworCisJCV9fZW50cnktPmxpbWl0CQk9IGdsb2JhbF9kaXJ0eV9saW1pdDsKKwkJX19lbnRyeS0+c2V0cG9pbnQJPSAoZ2xvYmFsX2RpcnR5X2xpbWl0ICsgZnJlZXJ1bikgLyAyOworCQlfX2VudHJ5LT5kaXJ0eQkJPSBkaXJ0eTsKKwkJX19lbnRyeS0+YmRpX3NldHBvaW50CT0gX19lbnRyeS0+c2V0cG9pbnQgKgorCQkJCQkJYmRpX3RocmVzaCAvICh0aHJlc2ggKyAxKTsKKwkJX19lbnRyeS0+YmRpX2RpcnR5CT0gYmRpX2RpcnR5OworCQlfX2VudHJ5LT5kaXJ0eV9yYXRlbGltaXQgPSBLQnBzKGRpcnR5X3JhdGVsaW1pdCk7CisJCV9fZW50cnktPnRhc2tfcmF0ZWxpbWl0CT0gS0Jwcyh0YXNrX3JhdGVsaW1pdCk7CisJCV9fZW50cnktPmRpcnRpZWQJPSBkaXJ0aWVkOworCQlfX2VudHJ5LT5kaXJ0aWVkX3BhdXNlCT0gY3VycmVudC0+bnJfZGlydGllZF9wYXVzZTsKKwkJX19lbnRyeS0+cGF1c2UJCT0gcGF1c2UgKiAxMDAwIC8gSFo7CisJCV9fZW50cnktPnBhdXNlZAkJPSAoamlmZmllcyAtIHN0YXJ0X3RpbWUpICogMTAwMCAvIEhaOworCSksCisKKworCVRQX3ByaW50aygiYmRpICVzOiAiCisJCSAgImxpbWl0PSVsdSBzZXRwb2ludD0lbHUgZGlydHk9JWx1ICIKKwkJICAiYmRpX3NldHBvaW50PSVsdSBiZGlfZGlydHk9JWx1ICIKKwkJICAiZGlydHlfcmF0ZWxpbWl0PSVsdSB0YXNrX3JhdGVsaW1pdD0lbHUgIgorCQkgICJkaXJ0aWVkPSV1IGRpcnRpZWRfcGF1c2U9JXUgIgorCQkgICJwYXVzZWQ9JWx1IHBhdXNlPSVsZCIsCisJCSAgX19lbnRyeS0+YmRpLAorCQkgIF9fZW50cnktPmxpbWl0LAorCQkgIF9fZW50cnktPnNldHBvaW50LAorCQkgIF9fZW50cnktPmRpcnR5LAorCQkgIF9fZW50cnktPmJkaV9zZXRwb2ludCwKKwkJICBfX2VudHJ5LT5iZGlfZGlydHksCisJCSAgX19lbnRyeS0+ZGlydHlfcmF0ZWxpbWl0LAorCQkgIF9fZW50cnktPnRhc2tfcmF0ZWxpbWl0LAorCQkgIF9fZW50cnktPmRpcnRpZWQsCisJCSAgX19lbnRyeS0+ZGlydGllZF9wYXVzZSwKKwkJICBfX2VudHJ5LT5wYXVzZWQsCS8qIG1zICovCisJCSAgX19lbnRyeS0+cGF1c2UJLyogbXMgKi8KKwkgICkKKyk7CisKIERFQ0xBUkVfRVZFTlRfQ0xBU1Mod3JpdGViYWNrX2Nvbmdlc3Rfd2FpdGVkX3RlbXBsYXRlLAogCiAJVFBfUFJPVE8odW5zaWduZWQgaW50IHVzZWNfdGltZW91dCwgdW5zaWduZWQgaW50IHVzZWNfZGVsYXllZCksCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmggYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhZDU2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtZHZpLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEhlYWRlciBmb3IgRFZJIG91dHB1dCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fT01BUF9QQU5FTF9EVklfSAorI2RlZmluZSBfX09NQVBfUEFORUxfRFZJX0gKKworc3RydWN0IG9tYXBfZHNzX2RldmljZTsKKworLyoqCisgKiBzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgLSBwYW5lbCBkcml2ZXIgY29uZmlndXJhdGlvbiBkYXRhCisgKiBAcGxhdGZvcm1fZW5hYmxlOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYW5lbCBlbmFibGUgZnVuY3Rpb24KKyAqIEBwbGF0Zm9ybV9kaXNhYmxlOiBwbGF0Zm9ybSBzcGVjaWZpYyBwYW5lbCBkaXNhYmxlIGZ1bmN0aW9uCisgKiBAaTJjX2J1c19udW06IGkyYyBidXMgaWQgZm9yIHRoZSBwYW5lbAorICovCitzdHJ1Y3QgcGFuZWxfZHZpX3BsYXRmb3JtX2RhdGEgeworCWludCAoKnBsYXRmb3JtX2VuYWJsZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwl2b2lkICgqcGxhdGZvcm1fZGlzYWJsZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKKwl1MTYgaTJjX2J1c19udW07Cit9OworCisjZW5kaWYgLyogX19PTUFQX1BBTkVMX0RWSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtbjh4MC5oIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW44eDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGExMzAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW44eDAuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9fT01BUF9QQU5FTF9OOFgwX0gKKyNkZWZpbmUgX19PTUFQX1BBTkVMX044WDBfSAorCitzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlOworCitzdHJ1Y3QgcGFuZWxfbjh4MF9kYXRhIHsKKwlpbnQgKCpwbGF0Zm9ybV9lbmFibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJdm9pZCAoKnBsYXRmb3JtX2Rpc2FibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJaW50IHBhbmVsX3Jlc2V0OworCWludCBjdHJsX3B3cmRvd247CisKKwlpbnQgKCpzZXRfYmFja2xpZ2h0KShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBsZXZlbCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1ub2tpYS1kc2kuaCBiL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1ub2tpYS1kc2kuaAppbmRleCA5MjFhZTkzLi43ZGM3MWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtbm9raWEtZHNpLmgKKysrIGIvaW5jbHVkZS92aWRlby9vbWFwLXBhbmVsLW5va2lhLWRzaS5oCkBAIC0xMCw5ICsxMCw3IEBACiAgKiBAZXh0X3RlX2dwaW86IGV4dGVybmFsIFRFIEdQSU8KICAqIEBlc2RfaW50ZXJ2YWw6IGludGVydmFsIG9mIEVTRCBjaGVja3MsIDAgPSBkaXNhYmxlZCAobXMpCiAgKiBAdWxwc190aW1lb3V0OiB0aW1lIHRvIHdhaXQgYmVmb3JlIGVudGVyaW5nIFVMUFMsIDAgPSBkaXNhYmxlZCAobXMpCi0gKiBAbWF4X2JhY2tsaWdodF9sZXZlbDogbWF4aW11bSBiYWNrbGlnaHQgbGV2ZWwKLSAqIEBzZXRfYmFja2xpZ2h0OiBwb2ludGVyIHRvIGJhY2tsaWdodCBzZXQgZnVuY3Rpb24KLSAqIEBnZXRfYmFja2xpZ2h0OiBwb2ludGVyIHRvIGJhY2tsaWdodCBnZXQgZnVuY3Rpb24KKyAqIEB1c2VfZHNpX2JhY2tsaWdodDogdHJ1ZSBpZiBwYW5lbCB1c2VzIERTSSBjb21tYW5kIHRvIGNvbnRyb2wgYmFja2xpZ2h0CiAgKi8KIHN0cnVjdCBub2tpYV9kc2lfcGFuZWxfZGF0YSB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTI1LDkgKzIzLDcgQEAKIAl1bnNpZ25lZCBlc2RfaW50ZXJ2YWw7CiAJdW5zaWduZWQgdWxwc190aW1lb3V0OwogCi0JaW50IG1heF9iYWNrbGlnaHRfbGV2ZWw7Ci0JaW50ICgqc2V0X2JhY2tsaWdodCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgbGV2ZWwpOwotCWludCAoKmdldF9iYWNrbGlnaHQpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJYm9vbCB1c2VfZHNpX2JhY2tsaWdodDsKIH07CiAKICNlbmRpZiAvKiBfX09NQVBfTk9LSUFfRFNJX1BBTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vb21hcC1wYW5lbC1waWNvZGxwLmggYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzQyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVvL29tYXAtcGFuZWwtcGljb2RscC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBwYW5lbCBkYXRhIGZvciBwaWNvZGxwIHBhbmVsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzCisgKgorICogQXV0aG9yOiBNYXl1cmVzaCBKYW5vcmthciA8bWF5dXJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19QQU5FTF9QSUNPRExQX0gKKyNkZWZpbmUgX19QQU5FTF9QSUNPRExQX0gKKy8qKgorICogc3RydWN0IDogcGljb2RscCBwYW5lbCBkYXRhCisgKiBwaWNvZGxwX2FkYXB0ZXJfaWQ6CWkyY19hZGFwdGVyIG51bWJlciBmb3IgcGljb2RscAorICovCitzdHJ1Y3QgcGljb2RscF9wYW5lbF9kYXRhIHsKKwlpbnQgcGljb2RscF9hZGFwdGVyX2lkOworCWludCBlbXVfZG9uZV9ncGlvOworCWludCBwd3Jnb29kX2dwaW87Cit9OworI2VuZGlmIC8qIF9fUEFORUxfUElDT0RMUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaCBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCmluZGV4IDNiNTVlZjIuLmI2NmViYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCkBAIC00MSw4ICs0MSwxMyBAQAogI2RlZmluZSBESVNQQ19JUlFfV0FLRVVQCQkoMSA8PCAxNikKICNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVDIJCSgxIDw8IDE3KQogI2RlZmluZSBESVNQQ19JUlFfVlNZTkMyCQkoMSA8PCAxOCkKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDNfRU5EX1dJTgkJKDEgPDwgMTkpCisjZGVmaW5lIERJU1BDX0lSUV9WSUQzX0ZJRk9fVU5ERVJGTE9XCSgxIDw8IDIwKQogI2RlZmluZSBESVNQQ19JUlFfQUNCSUFTX0NPVU5UX1NUQVQyCSgxIDw8IDIxKQogI2RlZmluZSBESVNQQ19JUlFfRlJBTUVET05FMgkJKDEgPDwgMjIpCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkVXQgkJKDEgPDwgMjMpCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkVUVgkJKDEgPDwgMjQpCisjZGVmaW5lIERJU1BDX0lSUV9XQkJVRkZFUk9WRVJGTE9XCSgxIDw8IDI1KQogCiBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlOwogc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyOwpAQCAtNjAsNyArNjUsOCBAQAogZW51bSBvbWFwX3BsYW5lIHsKIAlPTUFQX0RTU19HRlgJPSAwLAogCU9NQVBfRFNTX1ZJREVPMQk9IDEsCi0JT01BUF9EU1NfVklERU8yCT0gMgorCU9NQVBfRFNTX1ZJREVPMgk9IDIsCisJT01BUF9EU1NfVklERU8zCT0gMywKIH07CiAKIGVudW0gb21hcF9jaGFubmVsIHsKQEAgLTEyOSw2ICsxMzUsMTggQEAKIAlPTUFQX0RTU19WRU5DX1RZUEVfU1ZJREVPLAogfTsKIAorZW51bSBvbWFwX2Rzc19kc2lfcGl4ZWxfZm9ybWF0IHsKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjg4OCwKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjY2NiwKKwlPTUFQX0RTU19EU0lfRk1UX1JHQjY2Nl9QQUNLRUQsCisJT01BUF9EU1NfRFNJX0ZNVF9SR0I1NjUsCit9OworCitlbnVtIG9tYXBfZHNzX2RzaV9tb2RlIHsKKwlPTUFQX0RTU19EU0lfQ01EX01PREUgPSAwLAorCU9NQVBfRFNTX0RTSV9WSURFT19NT0RFLAorfTsKKwogZW51bSBvbWFwX2Rpc3BsYXlfY2FwcyB7CiAJT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURQk9IDEgPDwgMCwKIAlPTUFQX0RTU19ESVNQTEFZX0NBUF9URUFSX0VMSU0JCT0gMSA8PCAxLApAQCAtMTYyLDExICsxODAsMTMgQEAKIAogZW51bSBvbWFwX292ZXJsYXlfY2FwcyB7CiAJT01BUF9EU1NfT1ZMX0NBUF9TQ0FMRSA9IDEgPDwgMCwKLQlPTUFQX0RTU19PVkxfQ0FQX0RJU1BDID0gMSA8PCAxLAorCU9NQVBfRFNTX09WTF9DQVBfR0xPQkFMX0FMUEhBID0gMSA8PCAxLAorCU9NQVBfRFNTX09WTF9DQVBfUFJFX01VTFRfQUxQSEEgPSAxIDw8IDIsCisJT01BUF9EU1NfT1ZMX0NBUF9aT1JERVIgPSAxIDw8IDMsCiB9OwogCiBlbnVtIG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2NhcHMgewotCU9NQVBfRFNTX09WTF9NR1JfQ0FQX0RJU1BDID0gMSA8PCAwLAorCU9NQVBfRFNTX0RVTU1ZX1ZBTFVFLCAvKiBhZGQgYSBkdW1teSB2YWx1ZSB0byBwcmV2ZW50IGNvbXBpbGVyIGVycm9yICovCiB9OwogCiBlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgewpAQCAtMjE1LDI2ICsyMzUsNjcgQEAKIHZvaWQgcmZiaV9idXNfdW5sb2NrKHZvaWQpOwogCiAvKiBEU0kgKi8KKworc3RydWN0IG9tYXBfZHNzX2RzaV92aWRlb21vZGVfZGF0YSB7CisJLyogRFNJIHZpZGVvIG1vZGUgYmxhbmtpbmcgZGF0YSAqLworCS8qIFVuaXQ6IGJ5dGUgY2xvY2sgY3ljbGVzICovCisJdTE2IGhzYTsKKwl1MTYgaGZwOworCXUxNiBoYnA7CisJLyogVW5pdDogbGluZSBjbG9ja3MgKi8KKwl1MTYgdnNhOworCXUxNiB2ZnA7CisJdTE2IHZicDsKKworCS8qIERTSSBibGFua2luZyBtb2RlcyAqLworCWludCBibGFua2luZ19tb2RlOworCWludCBoc2FfYmxhbmtpbmdfbW9kZTsKKwlpbnQgaGJwX2JsYW5raW5nX21vZGU7CisJaW50IGhmcF9ibGFua2luZ19tb2RlOworCisJLyogVmlkZW8gcG9ydCBzeW5jIGV2ZW50cyAqLworCWludCB2cF9kZV9wb2w7CisJaW50IHZwX2hzeW5jX3BvbDsKKwlpbnQgdnBfdnN5bmNfcG9sOworCWJvb2wgdnBfdnN5bmNfZW5kOworCWJvb2wgdnBfaHN5bmNfZW5kOworCisJYm9vbCBkZHJfY2xrX2Fsd2F5c19vbjsKKwlpbnQgd2luZG93X3N5bmM7Cit9OworCiB2b2lkIGRzaV9idXNfbG9jayhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogdm9pZCBkc2lfYnVzX3VubG9jayhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwogaW50IGRzaV92Y19kY3Nfd3JpdGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmRhdGEsCiAJCWludCBsZW4pOwotaW50IGRzaV92Y19kY3Nfd3JpdGVfMChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAotCQl1OCBkY3NfY21kKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLCB1OCAqZGF0YSwKKwkJaW50IGxlbik7CitpbnQgZHNpX3ZjX2Rjc193cml0ZV8wKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQpOworaW50IGRzaV92Y19nZW5lcmljX3dyaXRlXzAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CiBpbnQgZHNpX3ZjX2Rjc193cml0ZV8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQsCiAJCXU4IHBhcmFtKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtKTsKK2ludCBkc2lfdmNfZ2VuZXJpY193cml0ZV8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4IHBhcmFtMSwgdTggcGFyYW0yKTsKIGludCBkc2lfdmNfZGNzX3dyaXRlX25vc3luYyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGludCBjaGFubmVsLAogCQl1OCAqZGF0YSwgaW50IGxlbik7CitpbnQgZHNpX3ZjX2dlbmVyaWNfd3JpdGVfbm9zeW5jKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCisJCXU4ICpkYXRhLCBpbnQgbGVuKTsKIGludCBkc2lfdmNfZGNzX3JlYWQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKIAkJdTggKmJ1ZiwgaW50IGJ1Zmxlbik7Ci1pbnQgZHNpX3ZjX2Rjc19yZWFkXzEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggZGNzX2NtZCwKLQkJdTggKmRhdGEpOwotaW50IGRzaV92Y19kY3NfcmVhZF8yKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IGRjc19jbWQsCi0JCXU4ICpkYXRhMSwgdTggKmRhdGEyKTsKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzAoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwgdTggKmJ1ZiwKKwkJaW50IGJ1Zmxlbik7CitpbnQgZHNpX3ZjX2dlbmVyaWNfcmVhZF8xKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsIHU4IHBhcmFtLAorCQl1OCAqYnVmLCBpbnQgYnVmbGVuKTsKK2ludCBkc2lfdmNfZ2VuZXJpY19yZWFkXzIoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCwKKwkJdTggcGFyYW0xLCB1OCBwYXJhbTIsIHU4ICpidWYsIGludCBidWZsZW4pOwogaW50IGRzaV92Y19zZXRfbWF4X3J4X3BhY2tldF9zaXplKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwsCiAJCXUxNiBsZW4pOwogaW50IGRzaV92Y19zZW5kX251bGwoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CiBpbnQgZHNpX3ZjX3NlbmRfYnRhX3N5bmMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCBpbnQgY2hhbm5lbCk7CitpbnQgZHNpX3ZpZGVvX21vZGVfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpOwordm9pZCBkc2lfdmlkZW9fbW9kZV9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGNoYW5uZWwpOwogCiAvKiBCb2FyZCBzcGVjaWZpYyBkYXRhICovCiBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyB7CkBAIC0yNDIsNyArMzAzLDggQEAKIAlpbnQgbnVtX2RldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqKmRldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGVmYXVsdF9kZXZpY2U7Ci0Jdm9pZCAoKmRzaV9tdXhfcGFkcykoYm9vbCBlbmFibGUpOworCWludCAoKmRzaV9lbmFibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKKwl2b2lkICgqZHNpX2Rpc2FibGVfcGFkcykoaW50IGRzaV9pZCwgdW5zaWduZWQgbGFuZV9tYXNrKTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1NfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1MpCkBAIC0zMDAsNyArMzYyLDYgQEAKIAlib29sIGVuYWJsZWQ7CiAKIAl1MzIgcGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICp2YWRkcjsKIAl1MzIgcF91dl9hZGRyOyAgLyogZm9yIE5WMTIgZm9ybWF0ICovCiAJdTE2IHNjcmVlbl93aWR0aDsKIAl1MTYgd2lkdGg7CkBAIC0zMTYsNiArMzc3LDcgQEAKIAl1MTYgb3V0X2hlaWdodDsJLyogaWYgMCwgb3V0X2hlaWdodCA9PSBoZWlnaHQgKi8KIAl1OCBnbG9iYWxfYWxwaGE7CiAJdTggcHJlX211bHRfYWxwaGE7CisJdTggem9yZGVyOwogfTsKIAogc3RydWN0IG9tYXBfb3ZlcmxheSB7CkBAIC0zMjQsNyArMzg2LDcgQEAKIAogCS8qIHN0YXRpYyBmaWVsZHMgKi8KIAljb25zdCBjaGFyICpuYW1lOwotCWludCBpZDsKKwllbnVtIG9tYXBfcGxhbmUgaWQ7CiAJZW51bSBvbWFwX2NvbG9yX21vZGUgc3VwcG9ydGVkX21vZGVzOwogCWVudW0gb21hcF9vdmVybGF5X2NhcHMgY2FwczsKIApAQCAtMzMyLDYgKzM5NCw3IEBACiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCisJYm9vbCBtYW5hZ2VyX2NoYW5nZWQ7CiAJLyogaWYgdHJ1ZSwgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgbm90IGFwcGxpZWQoKSB5ZXQgKi8KIAlib29sIGluZm9fZGlydHk7CiAKQEAgLTM1NCw3ICs0MTcsNyBAQAogCXUzMiB0cmFuc19rZXk7CiAJYm9vbCB0cmFuc19lbmFibGVkOwogCi0JYm9vbCBhbHBoYV9lbmFibGVkOworCWJvb2wgcGFydGlhbF9hbHBoYV9lbmFibGVkOwogCiAJYm9vbCBjcHJfZW5hYmxlOwogCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgY3ByX2NvZWZzOwpAQCAtMzY2LDcgKzQyOSw3IEBACiAKIAkvKiBzdGF0aWMgZmllbGRzICovCiAJY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgaWQ7CisJZW51bSBvbWFwX2NoYW5uZWwgaWQ7CiAJZW51bSBvbWFwX292ZXJsYXlfbWFuYWdlcl9jYXBzIGNhcHM7CiAJaW50IG51bV9vdmVybGF5czsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5ICoqb3ZlcmxheXM7CkBAIC00NTQsNiArNTE3LDcgQEAKIAkJfSBkaXNwYzsKIAogCQlzdHJ1Y3QgeworCQkJLyogcmVnbiBpcyBvbmUgZ3JlYXRlciB0aGFuIFRSTSdzIFJFR04gdmFsdWUgKi8KIAkJCXUxNiByZWduOwogCQkJdTE2IHJlZ207CiAJCQl1MTYgcmVnbV9kaXNwYzsKQEAgLTQ2NCw2ICs1MjgsNyBAQAogCQl9IGRzaTsKIAogCQlzdHJ1Y3QgeworCQkJLyogcmVnbiBpcyBvbmUgZ3JlYXRlciB0aGFuIFRSTSdzIFJFR04gdmFsdWUgKi8KIAkJCXUxNiByZWduOwogCQkJdTE2IHJlZ20yOwogCQl9IGhkbWk7CkBAIC00NzcsNiArNTQyLDEwIEBACiAJCWludCBhY2I7CS8qIGFjLWJpYXMgcGluIGZyZXF1ZW5jeSAqLwogCiAJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnOworCisJCWVudW0gb21hcF9kc3NfZHNpX3BpeGVsX2Zvcm1hdCBkc2lfcGl4X2ZtdDsKKwkJZW51bSBvbWFwX2Rzc19kc2lfbW9kZSBkc2lfbW9kZTsKKwkJc3RydWN0IG9tYXBfZHNzX2RzaV92aWRlb21vZGVfZGF0YSBkc2lfdm1fZGF0YTsKIAl9IHBhbmVsOwogCiAJc3RydWN0IHsKQEAgLTU1Nyw2ICs2MjYsOSBAQAogCiAJaW50ICgqc2V0X3dzcykoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1MzIgd3NzKTsKIAl1MzIgKCpnZXRfd3NzKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOworCisJaW50ICgqcmVhZF9lZGlkKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIHU4ICpidWYsIGludCBsZW4pOworCWJvb2wgKCpkZXRlY3QpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CiB9OwogCiBpbnQgb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3NoX21vYmlsZV9sY2RjLmggYi9pbmNsdWRlL3ZpZGVvL3NoX21vYmlsZV9sY2RjLmgKaW5kZXggZDk2NGU2OC4uODEwMWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9zaF9tb2JpbGVfbGNkYy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vc2hfbW9iaWxlX2xjZGMuaApAQCAtNCwyNiArNCwxMjMgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9tZXJhbS5oPgogCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfTEREQ0tSCQkJMHg0MTAKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9CVVMJKDAgPDwgMTYpCisjZGVmaW5lIExERENLUl9JQ0tTRUxfTUlQSQkoMSA8PCAxNikKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9IRE1JCSgyIDw8IDE2KQorI2RlZmluZSBMRERDS1JfSUNLU0VMX0VYVAkoMyA8PCAxNikKKyNkZWZpbmUgTEREQ0tSX0lDS1NFTF9NQVNLCSg3IDw8IDE2KQorI2RlZmluZSBMRERDS1JfTU9TRUwJCSgxIDw8IDYpCisjZGVmaW5lIF9MRERDS1NUUFIJCTB4NDE0CisjZGVmaW5lIF9MRElOVFIJCQkweDQ2OAorI2RlZmluZSBMRElOVFJfRkUJCSgxIDw8IDEwKQorI2RlZmluZSBMRElOVFJfVlNFCQkoMSA8PCA5KQorI2RlZmluZSBMRElOVFJfVkVFCQkoMSA8PCA4KQorI2RlZmluZSBMRElOVFJfRlMJCSgxIDw8IDIpCisjZGVmaW5lIExESU5UUl9WU1MJCSgxIDw8IDEpCisjZGVmaW5lIExESU5UUl9WRVMJCSgxIDw8IDApCisjZGVmaW5lIExESU5UUl9TVEFUVVNfTUFTSwkoMHhmZiA8PCAwKQorI2RlZmluZSBfTERTUgkJCTB4NDZjCisjZGVmaW5lIExEU1JfTVNTCQkoMSA8PCAxMCkKKyNkZWZpbmUgTERTUl9NUlMJCSgxIDw8IDgpCisjZGVmaW5lIExEU1JfQVMJCQkoMSA8PCAxKQorI2RlZmluZSBfTERDTlQxUgkJMHg0NzAKKyNkZWZpbmUgTERDTlQxUl9ERQkJKDEgPDwgMCkKKyNkZWZpbmUgX0xEQ05UMlIJCTB4NDc0CisjZGVmaW5lIExEQ05UMlJfQlIJCSgxIDw8IDgpCisjZGVmaW5lIExEQ05UMlJfTUQJCSgxIDw8IDMpCisjZGVmaW5lIExEQ05UMlJfU0UJCSgxIDw8IDIpCisjZGVmaW5lIExEQ05UMlJfTUUJCSgxIDw8IDEpCisjZGVmaW5lIExEQ05UMlJfRE8JCSgxIDw8IDApCisjZGVmaW5lIF9MRFJDTlRSCQkweDQ3OAorI2RlZmluZSBMRFJDTlRSX1NSUwkJKDEgPDwgMTcpCisjZGVmaW5lIExEUkNOVFJfU1JDCQkoMSA8PCAxNikKKyNkZWZpbmUgTERSQ05UUl9NUlMJCSgxIDw8IDEpCisjZGVmaW5lIExEUkNOVFJfTVJDCQkoMSA8PCAwKQorI2RlZmluZSBfTERERFNSCQkJMHg0N2MKKyNkZWZpbmUgTERERFNSX0xTCQkoMSA8PCAyKQorI2RlZmluZSBMREREU1JfV1MJCSgxIDw8IDEpCisjZGVmaW5lIExERERTUl9CUwkJKDEgPDwgMCkKKworI2RlZmluZSBMRE1UMVJfVlBPTAkJKDEgPDwgMjgpCisjZGVmaW5lIExETVQxUl9IUE9MCQkoMSA8PCAyNykKKyNkZWZpbmUgTERNVDFSX0RXUE9MCQkoMSA8PCAyNikKKyNkZWZpbmUgTERNVDFSX0RJUE9MCQkoMSA8PCAyNSkKKyNkZWZpbmUgTERNVDFSX0RBUE9MCQkoMSA8PCAyNCkKKyNkZWZpbmUgTERNVDFSX0hTQ05UCQkoMSA8PCAxNykKKyNkZWZpbmUgTERNVDFSX0RXQ05UCQkoMSA8PCAxNikKKyNkZWZpbmUgTERNVDFSX0lGTQkJKDEgPDwgMTIpCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCOAkoMHgwIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCOQkoMHg0IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCMTJBCSgweDUgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9SR0IxMkIJKDB4NiA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1JHQjE2CSgweDcgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9SR0IxOAkoMHhhIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfUkdCMjQJKDB4YiA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1lDQkNSCSgweGYgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVM4QQkoMHgwIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTOEIJKDB4MSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzhDCSgweDIgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVM4RAkoMHgzIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTOQkoMHg0IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTMTIJKDB4NSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzE2QQkoMHg3IDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfU1lTMTZCCSgweDggPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVMxNkMJKDB4OSA8PCAwKQorI2RlZmluZSBMRE1UMVJfTUlGVFlQX1NZUzE4CSgweGEgPDwgMCkKKyNkZWZpbmUgTERNVDFSX01JRlRZUF9TWVMyNAkoMHhiIDw8IDApCisjZGVmaW5lIExETVQxUl9NSUZUWVBfTUFTSwkoMHhmIDw8IDApCisKKyNkZWZpbmUgTERERlJfQ0YxCQkoMSA8PCAxOCkKKyNkZWZpbmUgTERERlJfQ0YwCQkoMSA8PCAxNykKKyNkZWZpbmUgTERERlJfQ0MJCSgxIDw8IDE2KQorI2RlZmluZSBMRERGUl9ZRl80MjAJCSgwIDw8IDgpCisjZGVmaW5lIExEREZSX1lGXzQyMgkJKDEgPDwgOCkKKyNkZWZpbmUgTERERlJfWUZfNDQ0CQkoMiA8PCA4KQorI2RlZmluZSBMRERGUl9ZRl9NQVNLCQkoMyA8PCA4KQorI2RlZmluZSBMRERGUl9QS0ZfQVJHQjMyCSgweDAwIDw8IDApCisjZGVmaW5lIExEREZSX1BLRl9SR0IxNgkJKDB4MDMgPDwgMCkKKyNkZWZpbmUgTERERlJfUEtGX1JHQjI0CQkoMHgwYiA8PCAwKQorI2RlZmluZSBMRERGUl9QS0ZfTUFTSwkJKDB4MWYgPDwgMCkKKworI2RlZmluZSBMRFNNMVJfT1MJCSgxIDw8IDApCisKKyNkZWZpbmUgTERTTTJSX09TVFJHCQkoMSA8PCAwKQorCisjZGVmaW5lIExEUE1SX0xQUwkJKDMgPDwgMCkKKworI2RlZmluZSBfTEREV0QwUgkJMHg4MDAKKyNkZWZpbmUgTEREV0R4Ul9XREFDVAkJKDEgPDwgMjgpCisjZGVmaW5lIExERFdEeFJfUlNXCQkoMSA8PCAyNCkKKyNkZWZpbmUgX0xERFJEUgkJCTB4ODQwCisjZGVmaW5lIExERFJEUl9SU1IJCSgxIDw8IDI0KQorI2RlZmluZSBMRERSRFJfRFJEX01BU0sJCSgweDNmZmZmIDw8IDApCisjZGVmaW5lIF9MRERXQVIJCQkweDkwMAorI2RlZmluZSBMRERXQVJfV0EJCSgxIDw8IDApCisjZGVmaW5lIF9MRERSQVIJCQkweDkwNAorI2RlZmluZSBMRERSQVJfUkEJCSgxIDw8IDApCisKIGVudW0gewotCVJHQjgsICAgLyogMjRicHAsIDg6ODo4ICovCi0JUkdCOSwgICAvKiAxOGJwcCwgOTo5ICovCi0JUkdCMTJBLCAvKiAyNGJwcCwgMTI6MTIgKi8KLQlSR0IxMkIsIC8qIDEyYnBwICovCi0JUkdCMTYsICAvKiAxNmJwcCAqLwotCVJHQjE4LCAgLyogMThicHAgKi8KLQlSR0IyNCwgIC8qIDI0YnBwICovCi0JWVVWNDIyLCAvKiAxNmJwcCAqLwotCVNZUzhBLCAgLyogMjRicHAsIDg6ODo4ICovCi0JU1lTOEIsICAvKiAxOGJwcCwgODo4OjIgKi8KLQlTWVM4QywgIC8qIDE4YnBwLCAyOjg6OCAqLwotCVNZUzhELCAgLyogMTZicHAsIDg6OCAqLwotCVNZUzksICAgLyogMThicHAsIDk6OSAqLwotCVNZUzEyLCAgLyogMjRicHAsIDEyOjEyICovCi0JU1lTMTZBLCAvKiAxNmJwcCAqLwotCVNZUzE2QiwgLyogMThicHAsIDE2OjIgKi8KLQlTWVMxNkMsIC8qIDE4YnBwLCAyOjE2ICovCi0JU1lTMTgsICAvKiAxOGJwcCAqLwotCVNZUzI0LCAgLyogMjRicHAgKi8KKwlSR0I4CT0gTERNVDFSX01JRlRZUF9SR0I4LAkvKiAyNGJwcCwgODo4OjggKi8KKwlSR0I5CT0gTERNVDFSX01JRlRZUF9SR0I5LAkvKiAxOGJwcCwgOTo5ICovCisJUkdCMTJBCT0gTERNVDFSX01JRlRZUF9SR0IxMkEsCS8qIDI0YnBwLCAxMjoxMiAqLworCVJHQjEyQgk9IExETVQxUl9NSUZUWVBfUkdCMTJCLAkvKiAxMmJwcCAqLworCVJHQjE2CT0gTERNVDFSX01JRlRZUF9SR0IxNiwJLyogMTZicHAgKi8KKwlSR0IxOAk9IExETVQxUl9NSUZUWVBfUkdCMTgsCS8qIDE4YnBwICovCisJUkdCMjQJPSBMRE1UMVJfTUlGVFlQX1JHQjI0LAkvKiAyNGJwcCAqLworCVlVVjQyMgk9IExETVQxUl9NSUZUWVBfWUNCQ1IsCS8qIDE2YnBwICovCisJU1lTOEEJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QSwJLyogMjRicHAsIDg6ODo4ICovCisJU1lTOEIJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QiwJLyogMThicHAsIDg6ODoyICovCisJU1lTOEMJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4QywJLyogMThicHAsIDI6ODo4ICovCisJU1lTOEQJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM4RCwJLyogMTZicHAsIDg6OCAqLworCVNZUzkJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVM5LAkvKiAxOGJwcCwgOTo5ICovCisJU1lTMTIJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxMiwJLyogMjRicHAsIDEyOjEyICovCisJU1lTMTZBCT0gTERNVDFSX0lGTSB8IExETVQxUl9NSUZUWVBfU1lTMTZBLAkvKiAxNmJwcCAqLworCVNZUzE2Qgk9IExETVQxUl9JRk0gfCBMRE1UMVJfTUlGVFlQX1NZUzE2QiwJLyogMThicHAsIDE2OjIgKi8KKwlTWVMxNkMJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxNkMsCS8qIDE4YnBwLCAyOjE2ICovCisJU1lTMTgJPSBMRE1UMVJfSUZNIHwgTERNVDFSX01JRlRZUF9TWVMxOCwJLyogMThicHAgKi8KKwlTWVMyNAk9IExETVQxUl9JRk0gfCBMRE1UMVJfTUlGVFlQX1NZUzI0LAkvKiAyNGJwcCAqLwogfTsKIAogZW51bSB7IExDRENfQ0hBTl9ESVNBQkxFRCA9IDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3VkbGZiLmggYi9pbmNsdWRlL3ZpZGVvL3VkbGZiLmgKaW5kZXggNjlkNDg1YS4uYzQxZjMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby91ZGxmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vdWRsZmIuaApAQCAtNTAsNiArNTAsNyBAQAogCWludCBiYXNlMTY7CiAJaW50IGJhc2U4OwogCXUzMiBwc2V1ZG9fcGFsZXR0ZVsyNTZdOworCWludCBibGFua19tb2RlOyAvKm9uZSBvZiBGQl9CTEFOS18gKi8KIAkvKiBibGl0LW9ubHkgcmVuZGVyaW5nIHBhdGggbWV0cmljcywgZXhwb3NlZCB0aHJvdWdoIHN5c2ZzICovCiAJYXRvbWljX3QgYnl0ZXNfcmVuZGVyZWQ7IC8qIHJhdyBwaXhlbC1ieXRlcyBkcml2ZXIgYXNrZWQgdG8gcmVuZGVyICovCiAJYXRvbWljX3QgYnl0ZXNfaWRlbnRpY2FsOyAvKiBzYXZlZCBlZmZvcnQgd2l0aCBiYWNrYnVmZmVyIGNvbXBhcmlzb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmggYi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDZiOTliZmIuLjExZTJkZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKKysrIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvZ3JhbnRfdGFibGUuaD4KIAogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgotI2luY2x1ZGUgPGFzbS94ZW4vZ3JhbnRfdGFibGUuaD4KIAogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9odmMtY29uc29sZS5oIGIvaW5jbHVkZS94ZW4vaHZjLWNvbnNvbGUuaAppbmRleCA5MDE3MjRkLi5iNjJkZmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9odmMtY29uc29sZS5oCisrKyBiL2luY2x1ZGUveGVuL2h2Yy1jb25zb2xlLmgKQEAgLTYsMTIgKzYsMTIgQEAKICNpZmRlZiBDT05GSUdfSFZDX1hFTgogdm9pZCB4ZW5fY29uc29sZV9yZXN1bWUodm9pZCk7CiB2b2lkIHhlbl9yYXdfY29uc29sZV93cml0ZShjb25zdCBjaGFyICpzdHIpOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQorX19wcmludGYoMSwgMikKIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fY29uc29sZV9yZXN1bWUodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3Jhd19jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKnN0cikgeyB9Ci1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKK3N0YXRpYyBpbmxpbmUgX19wcmludGYoMSwgMikKIHZvaWQgeGVuX3Jhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIHsgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9ibGtpZi5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKaW5kZXggM2Q1ZDZkYi4uOTMyNDQ4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2Jsa2lmLmgKQEAgLTU3LDYgKzU3LDM2IEBACiAgKiAiZmVhdHVyZS1mbHVzaC1jYWNoZSIgbm9kZSEKICAqLwogI2RlZmluZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEUgICAzCisKKy8qCisgKiBSZWNvZ25pc2VkIG9ubHkgaWYgImZlYXR1cmUtZGlzY2FyZCIgaXMgcHJlc2VudCBpbiBiYWNrZW5kIHhlbmJ1cyBpbmZvLgorICogVGhlICJmZWF0dXJlLWRpc2NhcmQiIG5vZGUgY29udGFpbnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0cmltCisgKiAoQVRBKSBvciB1bm1hcCAoU0NTSSkgLSBjb252aWVudGx5IGNhbGxlZCBkaXNjYXJkIHJlcXVlc3RzIGFyZSBsaWtlbHkKKyAqIHRvIHN1Y2NlZWQgb3IgZmFpbC4gRWl0aGVyIHdheSwgYSBkaXNjYXJkIHJlcXVlc3QKKyAqIG1heSBmYWlsIGF0IGFueSB0aW1lIHdpdGggQkxLSUZfUlNQX0VPUE5PVFNVUFAgaWYgaXQgaXMgdW5zdXBwb3J0ZWQgYnkKKyAqIHRoZSB1bmRlcmx5aW5nIGJsb2NrLWRldmljZSBoYXJkd2FyZS4gVGhlIGJvb2xlYW4gc2ltcGx5IGluZGljYXRlcyB3aGV0aGVyCisgKiBvciBub3QgaXQgaXMgd29ydGh3aGlsZSBmb3IgdGhlIGZyb250ZW5kIHRvIGF0dGVtcHQgZGlzY2FyZCByZXF1ZXN0cy4KKyAqIElmIGEgYmFja2VuZCBkb2VzIG5vdCByZWNvZ25pc2UgQkxLSUZfT1BfRElTQ0FSRCwgaXQgc2hvdWxkICpub3QqCisgKiBjcmVhdGUgdGhlICJmZWF0dXJlLWRpc2NhcmQiIG5vZGUhCisgKgorICogRGlzY2FyZCBvcGVyYXRpb24gaXMgYSByZXF1ZXN0IGZvciB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgdG8gbWFyaworICogZXh0ZW50cyB0byBiZSBlcmFzZWQuIEhvd2V2ZXIsIGRpc2NhcmQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGJsb2NrcworICogd2lsbCBiZSBlcmFzZWQgZnJvbSB0aGUgZGV2aWNlIC0gaXQgaXMganVzdCBhIGhpbnQgdG8gdGhlIGRldmljZQorICogY29udHJvbGxlciB0aGF0IHRoZXNlIGJsb2NrcyBhcmUgbm8gbG9uZ2VyIGluIHVzZS4gV2hhdCB0aGUgZGV2aWNlCisgKiBjb250cm9sbGVyIGRvZXMgd2l0aCB0aGF0IGluZm9ybWF0aW9uIGlzIGxlZnQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBEaXNjYXJkIG9wZXJhdGlvbnMgYXJlIHBhc3NlZCB3aXRoIHNlY3Rvcl9udW1iZXIgYXMgdGhlCisgKiBzZWN0b3IgaW5kZXggdG8gYmVnaW4gZGlzY2FyZCBvcGVyYXRpb25zIGF0IGFuZCBucl9zZWN0b3JzIGFzIHRoZSBudW1iZXIgb2YKKyAqIHNlY3RvcnMgdG8gYmUgZGlzY2FyZGVkLiBUaGUgc3BlY2lmaWVkIHNlY3RvcnMgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUKKyAqIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIHN1cHBvcnRzIHRyaW0gKEFUQSkgb3IgdW5tYXAgKFNDU0kpIG9wZXJhdGlvbnMsCisgKiBvciBhIEJMS0lGX1JTUF9FT1BOT1RTVVBQICBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRyaW0vdW5tYXAgb3BlcmF0aW9ucyBhdDoKKyAqIGh0dHA6Ly90MTMub3JnL0RvY3VtZW50cy9VcGxvYWRlZERvY3VtZW50cy9kb2NzMjAwOC8KKyAqICAgICBlMDcxNTRyNi1EYXRhX1NldF9NYW5hZ2VtZW50X1Byb3Bvc2FsX2Zvcl9BVEEtQUNTMi5kb2MKKyAqIGh0dHA6Ly93d3cuc2VhZ2F0ZS5jb20vc3RhdGljZmlsZXMvc3VwcG9ydC9kaXNjL21hbnVhbHMvCisgKiAgICAgSW50ZXJmYWNlJTIwbWFudWFscy8xMDAyOTMwNjhjLnBkZgorICovCisjZGVmaW5lIEJMS0lGX09QX0RJU0NBUkQgICAgICAgICAgIDUKKwogLyoKICAqIE1heGltdW0gc2NhdHRlci9nYXRoZXIgc2VnbWVudHMgcGVyIHJlcXVlc3QuCiAgKiBUaGlzIGlzIGNhcmVmdWxseSBjaG9zZW4gc28gdGhhdCBzaXplb2Yoc3RydWN0IGJsa2lmX3JpbmcpIDw9IFBBR0VfU0laRS4KQEAgLTc0LDYgKzEwNCwxMSBAQAogCX0gc2VnW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07CiB9OwogCitzdHJ1Y3QgYmxraWZfcmVxdWVzdF9kaXNjYXJkIHsKKwlibGtpZl9zZWN0b3JfdCBzZWN0b3JfbnVtYmVyOworCXVpbnQ2NF90IG5yX3NlY3RvcnM7Cit9OworCiBzdHJ1Y3QgYmxraWZfcmVxdWVzdCB7CiAJdWludDhfdCAgICAgICAgb3BlcmF0aW9uOyAgICAvKiBCTEtJRl9PUF8/Pz8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1aW50OF90ICAgICAgICBucl9zZWdtZW50czsgIC8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgICAgICAgICAqLwpAQCAtODEsNiArMTE2LDcgQEAKIAl1aW50NjRfdCAgICAgICBpZDsgICAgICAgICAgIC8qIHByaXZhdGUgZ3Vlc3QgdmFsdWUsIGVjaG9lZCBpbiByZXNwICAqLwogCXVuaW9uIHsKIAkJc3RydWN0IGJsa2lmX3JlcXVlc3Rfcncgcnc7CisJCXN0cnVjdCBibGtpZl9yZXF1ZXN0X2Rpc2NhcmQgZGlzY2FyZDsKIAl9IHU7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjg0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaApAQCAtMCwwICsxLDMyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcGxhdGZvcm0uaAorICoKKyAqIEhhcmR3YXJlIHBsYXRmb3JtIG9wZXJhdGlvbnMuIEludGVuZGVkIGZvciB1c2UgYnkgZG9tYWluLTAga2VybmVsLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgSyBGcmFzZXIKKyAqLworCisjaWZuZGVmIF9fWEVOX1BVQkxJQ19QTEFURk9STV9IX18KKyNkZWZpbmUgX19YRU5fUFVCTElDX1BMQVRGT1JNX0hfXworCisjaW5jbHVkZSAieGVuLmgiCisKKyNkZWZpbmUgWEVOUEZfSU5URVJGQUNFX1ZFUlNJT04gMHgwMzAwMDAwMQorCisvKgorICogU2V0IGNsb2NrIHN1Y2ggdGhhdCBpdCB3b3VsZCByZWFkIDxzZWNzLG5zZWNzPiBhZnRlciAwMDowMDowMCBVVEMsCisgKiAxIEphbnVhcnksIDE5NzAgaWYgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgd2FzIDxzeXN0ZW1fdGltZT4uCisgKi8KKyNkZWZpbmUgWEVOUEZfc2V0dGltZSAgICAgICAgICAgICAxNworc3RydWN0IHhlbnBmX3NldHRpbWUgeworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCBzZWNzOworCXVpbnQzMl90IG5zZWNzOworCXVpbnQ2NF90IHN5c3RlbV90aW1lOworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbnBmX3NldHRpbWVfdCk7CisKKy8qCisgKiBSZXF1ZXN0IG1lbW9yeSByYW5nZSAoQG1mbiwgQG1mbitAbnJfbWZucy0xKSB0byBoYXZlIHR5cGUgQHR5cGUuCisgKiBPbiB4ODYsIEB0eXBlIGlzIGFuIGFyY2hpdGVjdHVyZS1kZWZpbmVkIE1UUlIgbWVtb3J5IHR5cGUuCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBNVFJSIHRoYXQgd2FzIHVzZWQgKEByZWcpIGFuZCBhIGhhbmRsZSB0aGF0IGNhbgorICogYmUgcGFzc2VkIHRvIFhFTlBGX0RFTF9NRU1UWVBFIHRvIGFjY3VyYXRlbHkgdGVhciBkb3duIHRoZSBuZXcgc2V0dGluZy4KKyAqICh4ODYtc3BlY2lmaWMpLgorICovCisjZGVmaW5lIFhFTlBGX2FkZF9tZW10eXBlICAgICAgICAgMzEKK3N0cnVjdCB4ZW5wZl9hZGRfbWVtdHlwZSB7CisJLyogSU4gdmFyaWFibGVzLiAqLworCXVuc2lnbmVkIGxvbmcgbWZuOworCXVpbnQ2NF90IG5yX21mbnM7CisJdWludDMyX3QgdHlwZTsKKwkvKiBPVVQgdmFyaWFibGVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCByZWc7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfYWRkX21lbXR5cGVfdCk7CisKKy8qCisgKiBUZWFyIGRvd24gYW4gZXhpc3RpbmcgbWVtb3J5LXJhbmdlIHR5cGUuIElmIEBoYW5kbGUgaXMgcmVtZW1iZXJlZCB0aGVuIGl0CisgKiBzaG91bGQgYmUgcGFzc2VkIGluIHRvIGFjY3VyYXRlbHkgdGVhciBkb3duIHRoZSBjb3JyZWN0IHNldHRpbmcgKGluIGNhc2UKKyAqIG9mIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zIHdpdGggZGlmZmVyaW5nIHR5cGVzKS4gSWYgaXQgaXMgbm90IGtub3duCisgKiB0aGVuIEBoYW5kbGUgc2hvdWxkIGJlIHNldCB0byB6ZXJvLiBJbiBhbGwgY2FzZXMgQHJlZyBtdXN0IGJlIHNldC4KKyAqICh4ODYtc3BlY2lmaWMpLgorICovCisjZGVmaW5lIFhFTlBGX2RlbF9tZW10eXBlICAgICAgICAgMzIKK3N0cnVjdCB4ZW5wZl9kZWxfbWVtdHlwZSB7CisJLyogSU4gdmFyaWFibGVzLiAqLworCXVpbnQzMl90IGhhbmRsZTsKKwl1aW50MzJfdCByZWc7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfZGVsX21lbXR5cGVfdCk7CisKKy8qIFJlYWQgY3VycmVudCB0eXBlIG9mIGFuIE1UUlIgKHg4Ni1zcGVjaWZpYykuICovCisjZGVmaW5lIFhFTlBGX3JlYWRfbWVtdHlwZSAgICAgICAgMzMKK3N0cnVjdCB4ZW5wZl9yZWFkX21lbXR5cGUgeworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCByZWc7CisJLyogT1VUIHZhcmlhYmxlcy4gKi8KKwl1bnNpZ25lZCBsb25nIG1mbjsKKwl1aW50NjRfdCBucl9tZm5zOworCXVpbnQzMl90IHR5cGU7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfcmVhZF9tZW10eXBlX3QpOworCisjZGVmaW5lIFhFTlBGX21pY3JvY29kZV91cGRhdGUgICAgMzUKK3N0cnVjdCB4ZW5wZl9taWNyb2NvZGVfdXBkYXRlIHsKKwkvKiBJTiB2YXJpYWJsZXMuICovCisJR1VFU1RfSEFORExFKHZvaWQpIGRhdGE7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gbWljcm9jb2RlIGRhdGEgKi8KKwl1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIG1pY3JvY29kZSBkYXRhLiAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbnBmX21pY3JvY29kZV91cGRhdGVfdCk7CisKKyNkZWZpbmUgWEVOUEZfcGxhdGZvcm1fcXVpcmsgICAgICAzOQorI2RlZmluZSBRVUlSS19OT0lSUUJBTEFOQ0lORyAgICAgIDEgLyogRG8gbm90IHJlc3RyaWN0IElPLUFQSUMgUlRFIHRhcmdldHMgKi8KKyNkZWZpbmUgUVVJUktfSU9BUElDX0JBRF9SRUdTRUwgICAyIC8qIElPLUFQSUMgUkVHU0VMIGZvcmdldHMgaXRzIHZhbHVlICAgICovCisjZGVmaW5lIFFVSVJLX0lPQVBJQ19HT09EX1JFR1NFTCAgMyAvKiBJTy1BUElDIFJFR1NFTCBiZWhhdmVzIHByb3Blcmx5ICAgICAqLworc3RydWN0IHhlbnBmX3BsYXRmb3JtX3F1aXJrIHsKKwkvKiBJTiB2YXJpYWJsZXMuICovCisJdWludDMyX3QgcXVpcmtfaWQ7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfcGxhdGZvcm1fcXVpcmtfdCk7CisKKyNkZWZpbmUgWEVOUEZfZmlybXdhcmVfaW5mbyAgICAgICA1MAorI2RlZmluZSBYRU5fRldfRElTS19JTkZPICAgICAgICAgIDEgLyogZnJvbSBpbnQgMTMgQUg9MDgvNDEvNDggKi8KKyNkZWZpbmUgWEVOX0ZXX0RJU0tfTUJSX1NJR05BVFVSRSAyIC8qIGZyb20gTUJSIG9mZnNldCAweDFiOCAqLworI2RlZmluZSBYRU5fRldfVkJFRERDX0lORk8gICAgICAgIDMgLyogZnJvbSBpbnQgMTAgQVg9NGYxNSAqLworc3RydWN0IHhlbnBmX2Zpcm13YXJlX2luZm8geworCS8qIElOIHZhcmlhYmxlcy4gKi8KKwl1aW50MzJfdCB0eXBlOworCXVpbnQzMl90IGluZGV4OworCS8qIE9VVCB2YXJpYWJsZXMuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogSW50MTMsIEZuNDg6IENoZWNrIEV4dGVuc2lvbnMgUHJlc2VudC4gKi8KKwkJCXVpbnQ4X3QgZGV2aWNlOyAgICAgICAgICAgICAgICAgICAvKiAlZGw6IGJpb3MgZGV2aWNlIG51bWJlciAqLworCQkJdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8qICVhaDogbWFqb3IgdmVyc2lvbiAgICAgICovCisJCQl1aW50MTZfdCBpbnRlcmZhY2Vfc3VwcG9ydDsgICAgICAgLyogJWN4OiBzdXBwb3J0IGJpdG1hcCAgICAgKi8KKwkJCS8qIEludDEzLCBGbjA4OiBMZWdhY3kgR2V0IERldmljZSBQYXJhbWV0ZXJzLiAqLworCQkJdWludDE2X3QgbGVnYWN5X21heF9jeWxpbmRlcjsgICAgIC8qICVjbFs3OjZdOiVjaDogbWF4IGN5bCAjICovCisJCQl1aW50OF90IGxlZ2FjeV9tYXhfaGVhZDsgICAgICAgICAgLyogJWRoOiBtYXggaGVhZCAjICAgICAgICAgKi8KKwkJCXVpbnQ4X3QgbGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrOyAvKiAlY2xbNTowXTogbWF4IHNlY3RvciAjICAqLworCQkJLyogSW50MTMsIEZuNDE6IEdldCBEZXZpY2UgUGFyYW1ldGVycyAoYXMgZmlsbGVkIGludG8gJWRzOiVlc2kpLiAqLworCQkJLyogTkIuIEZpcnN0IHVpbnQxNl90IG9mIGJ1ZmZlciBtdXN0IGJlIHNldCB0byBidWZmZXIgc2l6ZS4gICAgICAqLworCQkJR1VFU1RfSEFORExFKHZvaWQpIGVkZF9wYXJhbXM7CisJCX0gZGlza19pbmZvOyAvKiBYRU5fRldfRElTS19JTkZPICovCisJCXN0cnVjdCB7CisJCQl1aW50OF90IGRldmljZTsgICAgICAgICAgICAgICAgICAgLyogYmlvcyBkZXZpY2UgbnVtYmVyICAqLworCQkJdWludDMyX3QgbWJyX3NpZ25hdHVyZTsgICAgICAgICAgIC8qIG9mZnNldCAweDFiOCBpbiBtYnIgKi8KKwkJfSBkaXNrX21icl9zaWduYXR1cmU7IC8qIFhFTl9GV19ESVNLX01CUl9TSUdOQVRVUkUgKi8KKwkJc3RydWN0IHsKKwkJCS8qIEludDEwLCBBWD00RjE1OiBHZXQgRURJRCBpbmZvLiAqLworCQkJdWludDhfdCBjYXBhYmlsaXRpZXM7CisJCQl1aW50OF90IGVkaWRfdHJhbnNmZXJfdGltZTsKKwkJCS8qIG11c3QgcmVmZXIgdG8gMTI4LWJ5dGUgYnVmZmVyICovCisJCQlHVUVTVF9IQU5ETEUodWNoYXIpIGVkaWQ7CisJCX0gdmJlZGRjX2luZm87IC8qIFhFTl9GV19WQkVERENfSU5GTyAqLworCX0gdTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9maXJtd2FyZV9pbmZvX3QpOworCisjZGVmaW5lIFhFTlBGX2VudGVyX2FjcGlfc2xlZXAgICAgNTEKK3N0cnVjdCB4ZW5wZl9lbnRlcl9hY3BpX3NsZWVwIHsKKwkvKiBJTiB2YXJpYWJsZXMgKi8KKwl1aW50MTZfdCBwbTFhX2NudF92YWw7ICAgICAgLyogUE0xYSBjb250cm9sIHZhbHVlLiAqLworCXVpbnQxNl90IHBtMWJfY250X3ZhbDsgICAgICAvKiBQTTFiIGNvbnRyb2wgdmFsdWUuICovCisJdWludDMyX3Qgc2xlZXBfc3RhdGU7ICAgICAgIC8qIFdoaWNoIHN0YXRlIHRvIGVudGVyIChTbikuICovCisJdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qIE11c3QgYmUgemVyby4gKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9lbnRlcl9hY3BpX3NsZWVwX3QpOworCisjZGVmaW5lIFhFTlBGX2NoYW5nZV9mcmVxICAgICAgICAgNTIKK3N0cnVjdCB4ZW5wZl9jaGFuZ2VfZnJlcSB7CisJLyogSU4gdmFyaWFibGVzICovCisJdWludDMyX3QgZmxhZ3M7IC8qIE11c3QgYmUgemVyby4gKi8KKwl1aW50MzJfdCBjcHU7ICAgLyogUGh5c2ljYWwgY3B1LiAqLworCXVpbnQ2NF90IGZyZXE7ICAvKiBOZXcgZnJlcXVlbmN5IChIeikuICovCit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1QoeGVucGZfY2hhbmdlX2ZyZXFfdCk7CisKKy8qCisgKiBHZXQgaWRsZSB0aW1lcyAobmFub3NlY29uZHMgc2luY2UgYm9vdCkgZm9yIHBoeXNpY2FsIENQVXMgc3BlY2lmaWVkIGluIHRoZQorICogQGNwdW1hcF9iaXRtYXAgd2l0aCByYW5nZSBbMC4uQGNwdW1hcF9ucl9jcHVzLTFdLiBUaGUgQGlkbGV0aW1lIGFycmF5IGlzCisgKiBpbmRleGVkIGJ5IENQVSBudW1iZXI7IG9ubHkgZW50cmllcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEBjcHVtYXBfYml0bWFwCisgKiBiaXQgc2V0IGFyZSB3cml0dGVuIHRvLiBPbiByZXR1cm4sIEBjcHVtYXBfYml0bWFwIGlzIG1vZGlmaWVkIHNvIHRoYXQgYW55CisgKiBub24tZXhpc3RlbnQgQ1BVcyBhcmUgY2xlYXJlZC4gU3VjaCBDUFVzIGhhdmUgdGhlaXIgQGlkbGV0aW1lIGFycmF5IGVudHJ5CisgKiBjbGVhcmVkLgorICovCisjZGVmaW5lIFhFTlBGX2dldGlkbGV0aW1lICAgICAgICAgNTMKK3N0cnVjdCB4ZW5wZl9nZXRpZGxldGltZSB7CisJLyogSU4vT1VUIHZhcmlhYmxlcyAqLworCS8qIElOOiBDUFVzIHRvIGludGVycm9nYXRlOyBPVVQ6IHN1YnNldCBvZiBJTiB3aGljaCBhcmUgcHJlc2VudCAqLworCUdVRVNUX0hBTkRMRSh1Y2hhcikgY3B1bWFwX2JpdG1hcDsKKwkvKiBJTiB2YXJpYWJsZXMgKi8KKwkvKiBTaXplIG9mIGNwdW1hcCBiaXRtYXAuICovCisJdWludDMyX3QgY3B1bWFwX25yX2NwdXM7CisJLyogTXVzdCBiZSBpbmRleGFibGUgZm9yIGV2ZXJ5IGNwdSBpbiBjcHVtYXBfYml0bWFwLiAqLworCUdVRVNUX0hBTkRMRSh1aW50NjRfdCkgaWRsZXRpbWU7CisJLyogT1VUIHZhcmlhYmxlcyAqLworCS8qIFN5c3RlbSB0aW1lIHdoZW4gdGhlIGlkbGV0aW1lIHNuYXBzaG90cyB3ZXJlIHRha2VuLiAqLworCXVpbnQ2NF90IG5vdzsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9nZXRpZGxldGltZV90KTsKKworI2RlZmluZSBYRU5QRl9zZXRfcHJvY2Vzc29yX3BtaW5mbyAgICAgIDU0CisKKy8qIGFiaWxpdHkgYml0cyAqLworI2RlZmluZSBYRU5fUFJPQ0VTU09SX1BNX0NYCTEKKyNkZWZpbmUgWEVOX1BST0NFU1NPUl9QTV9QWAkyCisjZGVmaW5lIFhFTl9QUk9DRVNTT1JfUE1fVFgJNAorCisvKiBjbWQgdHlwZSAqLworI2RlZmluZSBYRU5fUE1fQ1ggICAwCisjZGVmaW5lIFhFTl9QTV9QWCAgIDEKKyNkZWZpbmUgWEVOX1BNX1RYICAgMgorCisvKiBQeCBzdWIgaW5mbyB0eXBlICovCisjZGVmaW5lIFhFTl9QWF9QQ1QgICAxCisjZGVmaW5lIFhFTl9QWF9QU1MgICAyCisjZGVmaW5lIFhFTl9QWF9QUEMgICA0CisjZGVmaW5lIFhFTl9QWF9QU0QgICA4CisKK3N0cnVjdCB4ZW5fcG93ZXJfcmVnaXN0ZXIgeworCXVpbnQzMl90ICAgICBzcGFjZV9pZDsKKwl1aW50MzJfdCAgICAgYml0X3dpZHRoOworCXVpbnQzMl90ICAgICBiaXRfb2Zmc2V0OworCXVpbnQzMl90ICAgICBhY2Nlc3Nfc2l6ZTsKKwl1aW50NjRfdCAgICAgYWRkcmVzczsKK307CisKK3N0cnVjdCB4ZW5fcHJvY2Vzc29yX2NzZCB7CisJdWludDMyX3QgICAgZG9tYWluOyAgICAgIC8qIGRvbWFpbiBudW1iZXIgb2Ygb25lIGRlcGVuZGVudCBncm91cCAqLworCXVpbnQzMl90ICAgIGNvb3JkX3R5cGU7ICAvKiBjb29yZGluYXRpb24gdHlwZSAqLworCXVpbnQzMl90ICAgIG51bTsgICAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBpbiBzYW1lIGRvbWFpbiAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfY3NkKTsKKworc3RydWN0IHhlbl9wcm9jZXNzb3JfY3ggeworCXN0cnVjdCB4ZW5fcG93ZXJfcmVnaXN0ZXIgIHJlZzsgLyogR0FTIGZvciBDeCB0cmlnZ2VyIHJlZ2lzdGVyICovCisJdWludDhfdCAgICAgdHlwZTsgICAgIC8qIGNzdGF0ZSB2YWx1ZSwgYzA6IDAsIGMxOiAxLCAuLi4gKi8KKwl1aW50MzJfdCAgICBsYXRlbmN5OyAgLyogd29yc3QgbGF0ZW5jeSAobXMpIHRvIGVudGVyL2V4aXQgdGhpcyBjc3RhdGUgKi8KKwl1aW50MzJfdCAgICBwb3dlcjsgICAgLyogYXZlcmFnZSBwb3dlciBjb25zdW1wdGlvbihtVykgKi8KKwl1aW50MzJfdCAgICBkcGNudDsgICAgLyogbnVtYmVyIG9mIGRlcGVuZGVuY3kgZW50cmllcyAqLworCUdVRVNUX0hBTkRMRSh4ZW5fcHJvY2Vzc29yX2NzZCkgZHA7IC8qIE5VTEwgaWYgbm8gZGVwZW5kZW5jeSAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfY3gpOworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9mbGFncyB7CisJdWludDMyX3QgYm1fY29udHJvbDoxOworCXVpbnQzMl90IGJtX2NoZWNrOjE7CisJdWludDMyX3QgaGFzX2NzdDoxOworCXVpbnQzMl90IHBvd2VyX3NldHVwX2RvbmU6MTsKKwl1aW50MzJfdCBibV9ybGRfc2V0OjE7Cit9OworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wb3dlciB7CisJdWludDMyX3QgY291bnQ7ICAvKiBudW1iZXIgb2YgQyBzdGF0ZSBlbnRyaWVzIGluIGFycmF5IGJlbG93ICovCisJc3RydWN0IHhlbl9wcm9jZXNzb3JfZmxhZ3MgZmxhZ3M7ICAvKiBnbG9iYWwgZmxhZ3Mgb2YgdGhpcyBwcm9jZXNzb3IgKi8KKwlHVUVTVF9IQU5ETEUoeGVuX3Byb2Nlc3Nvcl9jeCkgc3RhdGVzOyAvKiBzdXBwb3J0ZWQgYyBzdGF0ZXMgKi8KK307CisKK3N0cnVjdCB4ZW5fcGN0X3JlZ2lzdGVyIHsKKwl1aW50OF90ICBkZXNjcmlwdG9yOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50OF90ICBzcGFjZV9pZDsKKwl1aW50OF90ICBiaXRfd2lkdGg7CisJdWludDhfdCAgYml0X29mZnNldDsKKwl1aW50OF90ICByZXNlcnZlZDsKKwl1aW50NjRfdCBhZGRyZXNzOworfTsKKworc3RydWN0IHhlbl9wcm9jZXNzb3JfcHggeworCXVpbnQ2NF90IGNvcmVfZnJlcXVlbmN5OyAvKiBtZWdhaGVydHogKi8KKwl1aW50NjRfdCBwb3dlcjsgICAgICAvKiBtaWxsaVdhdHRzICovCisJdWludDY0X3QgdHJhbnNpdGlvbl9sYXRlbmN5OyAvKiBtaWNyb3NlY29uZHMgKi8KKwl1aW50NjRfdCBidXNfbWFzdGVyX2xhdGVuY3k7IC8qIG1pY3Jvc2Vjb25kcyAqLworCXVpbnQ2NF90IGNvbnRyb2w7ICAgICAgICAvKiBjb250cm9sIHZhbHVlICovCisJdWludDY0X3Qgc3RhdHVzOyAgICAgLyogc3VjY2VzcyBpbmRpY2F0b3IgKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5fcHJvY2Vzc29yX3B4KTsKKworc3RydWN0IHhlbl9wc2RfcGFja2FnZSB7CisJdWludDY0X3QgbnVtX2VudHJpZXM7CisJdWludDY0X3QgcmV2aXNpb247CisJdWludDY0X3QgZG9tYWluOworCXVpbnQ2NF90IGNvb3JkX3R5cGU7CisJdWludDY0X3QgbnVtX3Byb2Nlc3NvcnM7Cit9OworCitzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSB7CisJdWludDMyX3QgZmxhZ3M7ICAgICAvKiBmbGFnIGZvciBQeCBzdWIgaW5mbyB0eXBlICovCisJdWludDMyX3QgcGxhdGZvcm1fbGltaXQ7ICAvKiBQbGF0Zm9ybSBsaW1pdGF0aW9uIG9uIGZyZXEgdXNhZ2UgKi8KKwlzdHJ1Y3QgeGVuX3BjdF9yZWdpc3RlciBjb250cm9sX3JlZ2lzdGVyOworCXN0cnVjdCB4ZW5fcGN0X3JlZ2lzdGVyIHN0YXR1c19yZWdpc3RlcjsKKwl1aW50MzJfdCBzdGF0ZV9jb3VudDsgICAgIC8qIHRvdGFsIGF2YWlsYWJsZSBwZXJmb3JtYW5jZSBzdGF0ZXMgKi8KKwlHVUVTVF9IQU5ETEUoeGVuX3Byb2Nlc3Nvcl9weCkgc3RhdGVzOworCXN0cnVjdCB4ZW5fcHNkX3BhY2thZ2UgZG9tYWluX2luZm87CisJdWludDMyX3Qgc2hhcmVkX3R5cGU7ICAgICAvKiBjb29yZGluYXRpb24gdHlwZSBvZiB0aGlzIHByb2Nlc3NvciAqLworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHhlbl9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpOworCitzdHJ1Y3QgeGVucGZfc2V0X3Byb2Nlc3Nvcl9wbWluZm8geworCS8qIElOIHZhcmlhYmxlcyAqLworCXVpbnQzMl90IGlkOyAgICAvKiBBQ1BJIENQVSBJRCAqLworCXVpbnQzMl90IHR5cGU7ICAvKiB7WEVOX1BNX0NYLCBYRU5fUE1fUFh9ICovCisJdW5pb24geworCQlzdHJ1Y3QgeGVuX3Byb2Nlc3Nvcl9wb3dlciAgICAgICAgICBwb3dlcjsvKiBDeDogX0NTVC9fQ1NEICovCisJCXN0cnVjdCB4ZW5fcHJvY2Vzc29yX3BlcmZvcm1hbmNlICAgIHBlcmY7IC8qIFB4OiBfUFBDL19QQ1QvX1BTUy9fUFNEICovCisJfTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5wZl9zZXRfcHJvY2Vzc29yX3BtaW5mbyk7CisKK3N0cnVjdCB4ZW5fcGxhdGZvcm1fb3AgeworCXVpbnQzMl90IGNtZDsKKwl1aW50MzJfdCBpbnRlcmZhY2VfdmVyc2lvbjsgLyogWEVOUEZfSU5URVJGQUNFX1ZFUlNJT04gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB4ZW5wZl9zZXR0aW1lICAgICAgICAgICBzZXR0aW1lOworCQlzdHJ1Y3QgeGVucGZfYWRkX21lbXR5cGUgICAgICAgYWRkX21lbXR5cGU7CisJCXN0cnVjdCB4ZW5wZl9kZWxfbWVtdHlwZSAgICAgICBkZWxfbWVtdHlwZTsKKwkJc3RydWN0IHhlbnBmX3JlYWRfbWVtdHlwZSAgICAgIHJlYWRfbWVtdHlwZTsKKwkJc3RydWN0IHhlbnBmX21pY3JvY29kZV91cGRhdGUgIG1pY3JvY29kZTsKKwkJc3RydWN0IHhlbnBmX3BsYXRmb3JtX3F1aXJrICAgIHBsYXRmb3JtX3F1aXJrOworCQlzdHJ1Y3QgeGVucGZfZmlybXdhcmVfaW5mbyAgICAgZmlybXdhcmVfaW5mbzsKKwkJc3RydWN0IHhlbnBmX2VudGVyX2FjcGlfc2xlZXAgIGVudGVyX2FjcGlfc2xlZXA7CisJCXN0cnVjdCB4ZW5wZl9jaGFuZ2VfZnJlcSAgICAgICBjaGFuZ2VfZnJlcTsKKwkJc3RydWN0IHhlbnBmX2dldGlkbGV0aW1lICAgICAgIGdldGlkbGV0aW1lOworCQlzdHJ1Y3QgeGVucGZfc2V0X3Byb2Nlc3Nvcl9wbWluZm8gc2V0X3BtaW5mbzsKKwkJdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgIHBhZFsxMjhdOworCX0gdTsKK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVCh4ZW5fcGxhdGZvcm1fb3BfdCk7CisKKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfUExBVEZPUk1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UveGVuLmgKaW5kZXggNmFjZDljZS4uNmE2ZTkxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3hlbi5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS94ZW4uaApAQCAtNDkyLDYgKzQ5Miw3IEBACiAvKiBUaGVzZSBmbGFncyBhcmUgcGFzc2VkIGluIHRoZSAnZmxhZ3MnIGZpZWxkIG9mIHN0YXJ0X2luZm9fdC4gKi8KICNkZWZpbmUgU0lGX1BSSVZJTEVHRUQgICAgKDE8PDApICAvKiBJcyB0aGUgZG9tYWluIHByaXZpbGVnZWQ/ICovCiAjZGVmaW5lIFNJRl9JTklURE9NQUlOICAgICgxPDwxKSAgLyogSXMgdGhpcyB0aGUgaW5pdGlhbCBjb250cm9sIGRvbWFpbj8gKi8KKyNkZWZpbmUgU0lGX1BNX01BU0sgICAgICAgKDB4RkY8PDgpIC8qIHJlc2VydmUgMSBieXRlIGZvciB4ZW4tcG0gb3B0aW9ucyAqLwogCiB0eXBlZGVmIHVpbnQ2NF90IGNwdW1hcF90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IGFjZWVjYTcuLmIxYjY2NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTU2LDkgKzE1Nyw5IEBACiAJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHNjYW5mLCA0LCA1KSkpOwogCiAvKiBTaW5nbGUgcHJpbnRmIGFuZCB3cml0ZTogcmV0dXJucyAtZXJybm8gb3IgMC4gKi8KK19fcHJpbnRmKDQsIDUpCiBpbnQgeGVuYnVzX3ByaW50ZihzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHQsCi0JCSAgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpub2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCA0LCA1KSkpOworCQkgIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbm9kZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKiBHZW5lcmljIHJlYWQgZnVuY3Rpb246IE5VTEwtdGVybWluYXRlZCB0cmlwbGVzIG9mIG5hbWUsCiAgKiBzcHJpbnRmLXN0eWxlIHR5cGUgc3RyaW5nLCBhbmQgcG9pbnRlci4gUmV0dXJucyAwIG9yIGVycm5vLiovCkBAIC0yMDAsMTEgKzIwMSwxMSBAQAogCQkgICAgICBzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJICAgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgeGVuYnVzX3dhdGNoICosCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCkpOworX19wcmludGYoNCwgNSkKIGludCB4ZW5idXNfd2F0Y2hfcGF0aGZtdChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKIAkJCSB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKiwKIAkJCQkJICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQpLAotCQkJIGNvbnN0IGNoYXIgKnBhdGhmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisJCQkgY29uc3QgY2hhciAqcGF0aGZtdCwgLi4uKTsKIAogaW50IHhlbmJ1c19zd2l0Y2hfc3RhdGUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgZW51bSB4ZW5idXNfc3RhdGUgbmV3X3N0YXRlKTsKIGludCB4ZW5idXNfZ3JhbnRfcmluZyhzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHJpbmdfbWZuKTsKQEAgLTIyMyw5ICsyMjQsOSBAQAogCiBlbnVtIHhlbmJ1c19zdGF0ZSB4ZW5idXNfcmVhZF9kcml2ZXJfc3RhdGUoY29uc3QgY2hhciAqcGF0aCk7CiAKLV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkKK19fcHJpbnRmKDMsIDQpCiB2b2lkIHhlbmJ1c19kZXZfZXJyb3Ioc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQorX19wcmludGYoMywgNCkKIHZvaWQgeGVuYnVzX2Rldl9mYXRhbChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIGNvbnN0IGNoYXIgKnhlbmJ1c19zdHJzdGF0ZShlbnVtIHhlbmJ1c19zdGF0ZSBzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMzFiYTBmZC4uNDMyOThmOSAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtOTQ3LDcgKzk0Nyw3IEBACiBjb25maWcgU1lTQ1RMX1NZU0NBTEwKIAlib29sICJTeXNjdGwgc3lzY2FsbCBzdXBwb3J0IiBpZiBFWFBFUlQKIAlkZXBlbmRzIG9uIFBST0NfU1lTQ1RMCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJc2VsZWN0IFNZU0NUTAogCS0tLWhlbHAtLS0KIAkgIHN5c19zeXNjdGwgdXNlcyBiaW5hcnkgcGF0aHMgdGhhdCBoYXZlIGJlZW4gZm91bmQgY2hhbGxlbmdpbmcKQEAgLTk1OSw3ICs5NTksNyBAQAogCSAgdHJ5aW5nIHRvIHNhdmUgc29tZSBzcGFjZSBpdCBpcyBwcm9iYWJseSBzYWZlIHRvIGRpc2FibGUgdGhpcywKIAkgIG1ha2luZyB5b3VyIGtlcm5lbCBtYXJnaW5hbGx5IHNtYWxsZXIuCiAKLQkgIElmIHVuc3VyZSBzYXkgWSBoZXJlLgorCSAgSWYgdW5zdXJlIHNheSBOIGhlcmUuCiAKIGNvbmZpZyBLQUxMU1lNUwogCSBib29sICJMb2FkIGFsbCBzeW1ib2xzIGZvciBkZWJ1Z2dpbmcva3N5bW9vcHMiIGlmIEVYUEVSVApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggYzA4NTFhOC4uMGY2ZTFkOSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0yOCw3ICsyOCw3IEBACiBpbnQgcm9vdF9tb3VudGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfU0lMRU5UOwogc3RhdGljIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfZGV2aWNlX25hbWU7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIHNhdmVkX3Jvb3RfbmFtZVs2NF07Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgcm9vdF93YWl0Oworc3RhdGljIGludCByb290X3dhaXQ7CiAKIGRldl90IFJPT1RfREVWOwogCkBAIC04NSwxMiArODUsMTUgQEAKIAogLyoqCiAgKiBkZXZ0X2Zyb21fcGFydHV1aWQgLSBsb29rcyB1cCB0aGUgZGV2X3Qgb2YgYSBwYXJ0aXRpb24gYnkgaXRzIFVVSUQKLSAqIEB1dWlkOgkzNiBieXRlIGNoYXIgYXJyYXkgY29udGFpbmluZyBhIGhleCBhc2NpaSBVVUlECisgKiBAdXVpZDoJbWluIDM2IGJ5dGUgY2hhciBhcnJheSBjb250YWluaW5nIGEgaGV4IGFzY2lpIFVVSUQKICAqCiAgKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGZpcnN0IHBhcnRpdGlvbiB3aGljaCBjb250YWlucyBhIG1hdGNoaW5nCiAgKiBVVUlEIHZhbHVlIGluIGl0cyBwYXJ0aXRpb25fbWV0YV9pbmZvIHN0cnVjdC4gIFRoaXMgZG9lcyBub3Qgc2VhcmNoCiAgKiBieSBmaWxlc3lzdGVtIFVVSURzLgogICoKKyAqIElmIEB1dWlkIGlzIGZvbGxvd2VkIGJ5IGEgIi9QQVJUTlJPRkY9JWQiLCB0aGVuIHRoZSBudW1iZXIgd2lsbCBiZQorICogZXh0cmFjdGVkIGFuZCB1c2VkIGFzIGFuIG9mZnNldCBmcm9tIHRoZSBwYXJ0aXRpb24gaWRlbnRpZmllZCBieSB0aGUgVVVJRC4KKyAqCiAgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBkZXZfdCBvbiBzdWNjZXNzIG9yIDAgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGRldl90IGRldnRfZnJvbV9wYXJ0dXVpZChjaGFyICp1dWlkX3N0cikKQEAgLTk4LDYgKzEwMSwyOCBAQAogCWRldl90IHJlcyA9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKIAl1OCB1dWlkWzE2XTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCWludCBvZmZzZXQgPSAwOworCisJaWYgKHN0cmxlbih1dWlkX3N0cikgPCAzNikKKwkJZ290byBkb25lOworCisJLyogQ2hlY2sgZm9yIG9wdGlvbmFsIHBhcnRpdGlvbiBudW1iZXIgb2Zmc2V0IGF0dHJpYnV0ZXMuICovCisJaWYgKHV1aWRfc3RyWzM2XSkgeworCQljaGFyIGMgPSAwOworCQkvKiBFeHBsaWNpdGx5IGZhaWwgb24gcG9vciBQQVJUVVVJRCBzeW50YXguICovCisJCWlmIChzc2NhbmYoJnV1aWRfc3RyWzM2XSwKKwkJCSAgICIvUEFSVE5ST0ZGPSVkJWMiLCAmb2Zmc2V0LCAmYykgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFBBUlRVVUlEPSBpcyBpbnZhbGlkLlxuIgorCQkJICJFeHBlY3RlZCBQQVJUVVVJRD08dmFsaWQtdXVpZC1pZD5bL1BBUlROUk9GRj0lJWRdXG4iKTsKKwkJCWlmIChyb290X3dhaXQpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAiRGlzYWJsaW5nIHJvb3R3YWl0OyByb290PSBpcyBpbnZhbGlkLlxuIik7CisJCQlyb290X3dhaXQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQogCiAJLyogUGFjayB0aGUgcmVxdWVzdGVkIFVVSUQgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdC4gKi8KIAlwYXJ0X3BhY2tfdXVpZCh1dWlkX3N0ciwgdXVpZCk7CkBAIC0xMDcsOCArMTMyLDIxIEBACiAJCWdvdG8gZG9uZTsKIAogCXJlcyA9IGRldi0+ZGV2dDsKLQlwdXRfZGV2aWNlKGRldik7CiAKKwkvKiBBdHRlbXB0IHRvIGZpbmQgdGhlIHBhcnRpdGlvbiBieSBvZmZzZXQuICovCisJaWYgKCFvZmZzZXQpCisJCWdvdG8gbm9fb2Zmc2V0OworCisJcmVzID0gMDsKKwlkaXNrID0gcGFydF90b19kaXNrKGRldl90b19wYXJ0KGRldikpOworCXBhcnQgPSBkaXNrX2dldF9wYXJ0KGRpc2ssIGRldl90b19wYXJ0KGRldiktPnBhcnRubyArIG9mZnNldCk7CisJaWYgKHBhcnQpIHsKKwkJcmVzID0gcGFydF9kZXZ0KHBhcnQpOworCQlwdXRfZGV2aWNlKHBhcnRfdG9fZGV2KHBhcnQpKTsKKwl9CisKK25vX29mZnNldDoKKwlwdXRfZGV2aWNlKGRldik7CiBkb25lOgogCXJldHVybiByZXM7CiB9CkBAIC0xMjYsNiArMTY0LDggQEAKICAqCSAgIHVzZWQgd2hlbiBkaXNrIG5hbWUgb2YgcGFydGl0aW9uZWQgZGlzayBlbmRzIG9uIGEgZGlnaXQuCiAgKgk2KSBQQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYgcmVwcmVzZW50aW5nIHRoZQogICoJICAgdW5pcXVlIGlkIG9mIGEgcGFydGl0aW9uIGlmIHRoZSBwYXJ0aXRpb24gdGFibGUgcHJvdmlkZXMgaXQuCisgKgk3KSBQQVJUVVVJRD08VVVJRD4vUEFSVE5ST0ZGPTxpbnQ+IHRvIHNlbGVjdCBhIHBhcnRpdGlvbiBpbiByZWxhdGlvbiB0bworICoJICAgYSBwYXJ0aXRpb24gd2l0aCBhIGtub3duIHVuaXF1ZSBpZC4KICAqCiAgKglJZiBuYW1lIGRvZXNuJ3QgaGF2ZSBmYWxsIGludG8gdGhlIGNhdGVnb3JpZXMgYWJvdmUsIHdlIHJldHVybiAoMCwwKS4KICAqCWJsb2NrX2NsYXNzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZXRoaW5nIGlzIGEgZGlzayBuYW1lLiBJZiB0aGUgZGlzawpAQCAtMTQzLDggKzE4Myw2IEBACiAjaWZkZWYgQ09ORklHX0JMT0NLCiAJaWYgKHN0cm5jbXAobmFtZSwgIlBBUlRVVUlEPSIsIDkpID09IDApIHsKIAkJbmFtZSArPSA5OwotCQlpZiAoc3RybGVuKG5hbWUpICE9IDM2KQotCQkJZ290byBmYWlsOwogCQlyZXMgPSBkZXZ0X2Zyb21fcGFydHV1aWQobmFtZSk7CiAJCWlmICghcmVzKQogCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfcmQuYyBiL2luaXQvZG9fbW91bnRzX3JkLmMKaW5kZXggZmU5YWNiMC4uODg3NjI5ZSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfcmQuYworKysgYi9pbml0L2RvX21vdW50c19yZC5jCkBAIC0xMjAsNiArMTIwLDIwIEBACiAJfQogCiAJLyoKKwkgKiBSZWFkIDUxMiBieXRlcyBmdXJ0aGVyIHRvIGNoZWNrIGlmIGNyYW1mcyBpcyBwYWRkZWQKKwkgKi8KKwlzeXNfbHNlZWsoZmQsIHN0YXJ0X2Jsb2NrICogQkxPQ0tfU0laRSArIDB4MjAwLCAwKTsKKwlzeXNfcmVhZChmZCwgYnVmLCBzaXplKTsKKworCWlmIChjcmFtZnNiLT5tYWdpYyA9PSBDUkFNRlNfTUFHSUMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICAgICAiUkFNRElTSzogY3JhbWZzIGZpbGVzeXN0ZW0gZm91bmQgYXQgYmxvY2sgJWRcbiIsCisJCSAgICAgICBzdGFydF9ibG9jayk7CisJCW5ibG9ja3MgPSAoY3JhbWZzYi0+c2l6ZSArIEJMT0NLX1NJWkUgLSAxKSA+PiBCTE9DS19TSVpFX0JJVFM7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgogCSAqIFJlYWQgYmxvY2sgMSB0byB0ZXN0IGZvciBtaW5peCBhbmQgZXh0MiBzdXBlcmJsb2NrCiAJICovCiAJc3lzX2xzZWVrKGZkLCAoc3RhcnRfYmxvY2srMSkgKiBCTE9DS19TSVpFLCAwKTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggNjNmNWY2Zi4uMjE3ZWQyMyAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTUxMiw2ICs1MTIsOSBAQAogCXBhcnNlX2FyZ3MoIkJvb3Rpbmcga2VybmVsIiwgc3RhdGljX2NvbW1hbmRfbGluZSwgX19zdGFydF9fX3BhcmFtLAogCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKIAkJICAgJnVua25vd25fYm9vdG9wdGlvbik7CisKKwlqdW1wX2xhYmVsX2luaXQoKTsKKwogCS8qCiAJICogVGhlc2UgdXNlIGxhcmdlIGJvb3RtZW0gYWxsb2NhdGlvbnMgYW5kIG11c3QgcHJlY2VkZQogCSAqIGttZW1fY2FjaGVfaW5pdCgpCmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggZWQwNDllYS4uMmUwZWNmYyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtNDQ5LDggKzQ0OSw4IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQl0aW1lID0gc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlX2Nsb2NrKHRpbWVvdXQsCi0JCSAgICBIUlRJTUVSX01PREVfQUJTLCAwLCBDTE9DS19SRUFMVElNRSk7CisJCXRpbWUgPSBzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2VfY2xvY2sodGltZW91dCwgMCwKKwkJCUhSVElNRVJfTU9ERV9BQlMsIENMT0NLX1JFQUxUSU1FKTsKIAogCQl3aGlsZSAoZXdwLT5zdGF0ZSA9PSBTVEFURV9QRU5ESU5HKQogCQkJY3B1X3JlbGF4KCk7CmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggYzhlMDBmOC4uNTIxNWE4MSAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtOTAsNiArOTAsNTIgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInV0aWwuaCIKIAorLyogT25lIHNlbWFwaG9yZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggc2VtYXBob3JlIGluIHRoZSBzeXN0ZW0uICovCitzdHJ1Y3Qgc2VtIHsKKwlpbnQJc2VtdmFsOwkJLyogY3VycmVudCB2YWx1ZSAqLworCWludAlzZW1waWQ7CQkvKiBwaWQgb2YgbGFzdCBvcGVyYXRpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlbV9wZW5kaW5nOyAvKiBwZW5kaW5nIHNpbmdsZS1zb3Agb3BlcmF0aW9ucyAqLworfTsKKworLyogT25lIHF1ZXVlIGZvciBlYWNoIHNsZWVwaW5nIHByb2Nlc3MgaW4gdGhlIHN5c3RlbS4gKi8KK3N0cnVjdCBzZW1fcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQJc2ltcGxlX2xpc3Q7IC8qIHF1ZXVlIG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJIC8qIHF1ZXVlIG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqc2xlZXBlcjsgLyogdGhpcyBwcm9jZXNzICovCisJc3RydWN0IHNlbV91bmRvCQkqdW5kbzsJIC8qIHVuZG8gc3RydWN0dXJlICovCisJaW50CQkJcGlkOwkgLyogcHJvY2VzcyBpZCBvZiByZXF1ZXN0aW5nIHByb2Nlc3MgKi8KKwlpbnQJCQlzdGF0dXM7CSAvKiBjb21wbGV0aW9uIHN0YXR1cyBvZiBvcGVyYXRpb24gKi8KKwlzdHJ1Y3Qgc2VtYnVmCQkqc29wczsJIC8qIGFycmF5IG9mIHBlbmRpbmcgb3BlcmF0aW9ucyAqLworCWludAkJCW5zb3BzOwkgLyogbnVtYmVyIG9mIG9wZXJhdGlvbnMgKi8KKwlpbnQJCQlhbHRlcjsJIC8qIGRvZXMgKnNvcHMgYWx0ZXIgdGhlIGFycmF5PyAqLworfTsKKworLyogRWFjaCB0YXNrIGhhcyBhIGxpc3Qgb2YgdW5kbyByZXF1ZXN0cy4gVGhleSBhcmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseQorICogd2hlbiB0aGUgcHJvY2VzcyBleGl0cy4KKyAqLworc3RydWN0IHNlbV91bmRvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfcHJvYzsJLyogcGVyLXByb2Nlc3MgbGlzdDogKgorCQkJCQkJICogYWxsIHVuZG9zIGZyb20gb25lIHByb2Nlc3MKKwkJCQkJCSAqIHJjdSBwcm90ZWN0ZWQgKi8KKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsJCS8qIHJjdSBzdHJ1Y3QgZm9yIHNlbV91bmRvICovCisJc3RydWN0IHNlbV91bmRvX2xpc3QJKnVscDsJCS8qIGJhY2sgcHRyIHRvIHNlbV91bmRvX2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfaWQ7CS8qIHBlciBzZW1hcGhvcmUgYXJyYXkgbGlzdDoKKwkJCQkJCSAqIGFsbCB1bmRvcyBmb3Igb25lIGFycmF5ICovCisJaW50CQkJc2VtaWQ7CQkvKiBzZW1hcGhvcmUgc2V0IGlkZW50aWZpZXIgKi8KKwlzaG9ydAkJCSpzZW1hZGo7CS8qIGFycmF5IG9mIGFkanVzdG1lbnRzICovCisJCQkJCQkvKiBvbmUgcGVyIHNlbWFwaG9yZSAqLworfTsKKworLyogc2VtX3VuZG9fbGlzdCBjb250cm9scyBzaGFyZWQgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIHNlbV91bmRvIHN0cnVjdHVyZXMKKyAqIHRoYXQgbWF5IGJlIHNoYXJlZCBhbW9uZyBhbGwgYSBDTE9ORV9TWVNWU0VNIHRhc2sgZ3JvdXAuCisgKi8KK3N0cnVjdCBzZW1fdW5kb19saXN0IHsKKwlhdG9taWNfdAkJcmVmY250OworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0X3Byb2M7Cit9OworCisKICNkZWZpbmUgc2VtX2lkcyhucykJKChucyktPmlkc1tJUENfU0VNX0lEU10pCiAKICNkZWZpbmUgc2VtX3VubG9jayhzbWEpCQlpcGNfdW5sb2NrKCYoc21hKS0+c2VtX3Blcm0pCkBAIC0xNDI2LDYgKzE0NzIsOCBAQAogCiAJcXVldWUuc3RhdHVzID0gLUVJTlRSOwogCXF1ZXVlLnNsZWVwZXIgPSBjdXJyZW50OworCitzbGVlcF9hZ2FpbjoKIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAlzZW1fdW5sb2NrKHNtYSk7CiAKQEAgLTE0NjAsNyArMTUwOCw2IEBACiAJICogQXJyYXkgcmVtb3ZlZD8gSWYgeWVzLCBsZWF2ZSB3aXRob3V0IHNlbV91bmxvY2soKS4KIAkgKi8KIAlpZiAoSVNfRVJSKHNtYSkpIHsKLQkJZXJyb3IgPSAtRUlEUk07CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCkBAIC0xNDc5LDYgKzE1MjYsMTMgQEAKIAkgKi8KIAlpZiAodGltZW91dCAmJiBqaWZmaWVzX2xlZnQgPT0gMCkKIAkJZXJyb3IgPSAtRUFHQUlOOworCisJLyoKKwkgKiBJZiB0aGUgd2FrZXVwIHdhcyBzcHVyaW91cywganVzdCByZXRyeQorCSAqLworCWlmIChlcnJvciA9PSAtRUlOVFIgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlnb3RvIHNsZWVwX2FnYWluOworCiAJdW5saW5rX3F1ZXVlKHNtYSwgJnF1ZXVlKTsKIAogb3V0X3VubG9ja19mcmVlOgpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDJkYTQ4ZDMuLmU4OThjNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTEwMSw2ICsxMDEsNyBAQAogb2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19TTVApICs9IHNjaGVkX2NwdXByaS5vCiBvYmotJChDT05GSUdfSVJRX1dPUkspICs9IGlycV93b3JrLm8KK29iai0kKENPTkZJR19DUFVfUE0pICs9IGNwdV9wbS5vCiAKIG9iai0kKENPTkZJR19QRVJGX0VWRU5UUykgKz0gZXZlbnRzLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXN5bmMuYyBiL2tlcm5lbC9hc3luYy5jCmluZGV4IDRjMjg0M2MuLjgwYjc0Yjg4IDEwMDY0NAotLS0gYS9rZXJuZWwvYXN5bmMuYworKysgYi9rZXJuZWwvYXN5bmMuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDBhMTM1NWMuLjA5ZmFlMjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggY2U0YjA1NC4uNDdiN2ZjMSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC00OCw3ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY2FwYWJpbGl0eS5jIGIva2VybmVsL2NhcGFiaWxpdHkuYwppbmRleCAyODNjNTI5Li5iNDYzODcxIDEwMDY0NAotLS0gYS9rZXJuZWwvY2FwYWJpbGl0eS5jCisrKyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggNDUzMTAwYS4uZDlkNTY0OCAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMjAyNyw3ICsyMDI3LDcgQEAKIAkJZ290byBvdXRfZnJlZV9ncm91cF9saXN0OwogCiAJLyogcHJldmVudCBjaGFuZ2VzIHRvIHRoZSB0aHJlYWRncm91cCBsaXN0IHdoaWxlIHdlIHRha2UgYSBzbmFwc2hvdC4gKi8KLQlyY3VfcmVhZF9sb2NrKCk7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIobGVhZGVyKSkgewogCQkvKgogCQkgKiBhIHJhY2Ugd2l0aCBkZV90aHJlYWQgZnJvbSBhbm90aGVyIHRocmVhZCdzIGV4ZWMoKSBtYXkgc3RyaXAKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAJCSAqIHRocm93IHRoaXMgdGFzayBhd2F5IGFuZCB0cnkgYWdhaW4gKGZyb20gY2dyb3VwX3Byb2NzX3dyaXRlKTsKIAkJICogdGhpcyBpcyAiZG91YmxlLWRvdWJsZS10b2lsLWFuZC10cm91YmxlLWNoZWNrIGxvY2tpbmciLgogCQkgKi8KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJcmV0dmFsID0gLUVBR0FJTjsKIAkJZ290byBvdXRfZnJlZV9ncm91cF9saXN0OwogCX0KQEAgLTIwNTcsNyArMjA1Nyw3IEBACiAJfSB3aGlsZV9lYWNoX3RocmVhZChsZWFkZXIsIHRzayk7CiAJLyogcmVtZW1iZXIgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBhcnJheSBmb3IgbGF0ZXIuICovCiAJZ3JvdXBfc2l6ZSA9IGk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKIAkgKiBzdGVwIDE6IGNoZWNrIHRoYXQgd2UgY2FuIGxlZ2l0aW1hdGVseSBhdHRhY2ggdG8gdGhlIGNncm91cC4KQEAgLTIxMzUsMTQgKzIxMzUsMTcgQEAKIAkJb2xkY2dycCA9IHRhc2tfY2dyb3VwX2Zyb21fcm9vdCh0c2ssIHJvb3QpOwogCQlpZiAoY2dycCA9PSBvbGRjZ3JwKQogCQkJY29udGludWU7Ci0JCS8qIGF0dGFjaCBlYWNoIHRhc2sgdG8gZWFjaCBzdWJzeXN0ZW0gKi8KLQkJZm9yX2VhY2hfc3Vic3lzKHJvb3QsIHNzKSB7Ci0JCQlpZiAoc3MtPmF0dGFjaF90YXNrKQotCQkJCXNzLT5hdHRhY2hfdGFzayhjZ3JwLCB0c2spOwotCQl9CiAJCS8qIGlmIHRoZSB0aHJlYWQgaXMgUEZfRVhJVElORywgaXQgY2FuIGp1c3QgZ2V0IHNraXBwZWQuICovCiAJCXJldHZhbCA9IGNncm91cF90YXNrX21pZ3JhdGUoY2dycCwgb2xkY2dycCwgdHNrLCB0cnVlKTsKLQkJQlVHX09OKHJldHZhbCAhPSAwICYmIHJldHZhbCAhPSAtRVNSQ0gpOworCQlpZiAocmV0dmFsID09IDApIHsKKwkJCS8qIGF0dGFjaCBlYWNoIHRhc2sgdG8gZWFjaCBzdWJzeXN0ZW0gKi8KKwkJCWZvcl9lYWNoX3N1YnN5cyhyb290LCBzcykgeworCQkJCWlmIChzcy0+YXR0YWNoX3Rhc2spCisJCQkJCXNzLT5hdHRhY2hfdGFzayhjZ3JwLCB0c2spOworCQkJfQorCQl9IGVsc2UgeworCQkJQlVHX09OKHJldHZhbCAhPSAtRVNSQ0gpOworCQl9CiAJfQogCS8qIG5vdGhpbmcgaXMgc2Vuc2l0aXZlIHRvIGZvcmsoKSBhZnRlciB0aGlzIHBvaW50LiAqLwogCkBAIC00ODgwLDkgKzQ4ODMsOSBAQAogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGlkLT5jc3MsIE5VTEwpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihjc3MtPmlkLCBOVUxMKTsKLQlzcGluX2xvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZzcy0+aWRfbG9jayk7CiAJaWRyX3JlbW92ZSgmc3MtPmlkciwgaWQtPmlkKTsKLQlzcGluX3VubG9jaygmc3MtPmlkX2xvY2spOworCXdyaXRlX3VubG9jaygmc3MtPmlkX2xvY2spOwogCWtmcmVlX3JjdShpZCwgcmN1X2hlYWQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9jc3NfaWQpOwpAQCAtNDkwOCwxMCArNDkxMSwxMCBAQAogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9Ci0Jc3Bpbl9sb2NrKCZzcy0+aWRfbG9jayk7CisJd3JpdGVfbG9jaygmc3MtPmlkX2xvY2spOwogCS8qIERvbid0IHVzZSAwLiBhbGxvY2F0ZXMgYW4gSUQgb2YgMS02NTUzNSAqLwogCWVycm9yID0gaWRyX2dldF9uZXdfYWJvdmUoJnNzLT5pZHIsIG5ld2lkLCAxLCAmbXlpZCk7Ci0Jc3Bpbl91bmxvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnNzLT5pZF9sb2NrKTsKIAogCS8qIFJldHVybnMgZXJyb3Igd2hlbiB0aGVyZSBhcmUgbm8gZnJlZSBzcGFjZXMgZm9yIG5ldyBJRC4qLwogCWlmIChlcnJvcikgewpAQCAtNDkyNiw5ICs0OTI5LDkgQEAKIAlyZXR1cm4gbmV3aWQ7CiByZW1vdmVfaWRyOgogCWVycm9yID0gLUVOT1NQQzsKLQlzcGluX2xvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZzcy0+aWRfbG9jayk7CiAJaWRyX3JlbW92ZSgmc3MtPmlkciwgbXlpZCk7Ci0Jc3Bpbl91bmxvY2soJnNzLT5pZF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnNzLT5pZF9sb2NrKTsKIGVycl9vdXQ6CiAJa2ZyZWUobmV3aWQpOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKQEAgLTQ5NDAsNyArNDk0Myw3IEBACiB7CiAJc3RydWN0IGNzc19pZCAqbmV3aWQ7CiAKLQlzcGluX2xvY2tfaW5pdCgmc3MtPmlkX2xvY2spOworCXJ3bG9ja19pbml0KCZzcy0+aWRfbG9jayk7CiAJaWRyX2luaXQoJnNzLT5pZHIpOwogCiAJbmV3aWQgPSBnZXRfbmV3X2Nzc2lkKHNzLCAwKTsKQEAgLTUwMzUsOSArNTAzOCw5IEBACiAJCSAqIHNjYW4gbmV4dCBlbnRyeSBmcm9tIGJpdG1hcCh0cmVlKSwgdG1waWQgaXMgdXBkYXRlZCBhZnRlcgogCQkgKiBpZHJfZ2V0X25leHQoKS4KIAkJICovCi0JCXNwaW5fbG9jaygmc3MtPmlkX2xvY2spOworCQlyZWFkX2xvY2soJnNzLT5pZF9sb2NrKTsKIAkJdG1wID0gaWRyX2dldF9uZXh0KCZzcy0+aWRyLCAmdG1waWQpOwotCQlzcGluX3VubG9jaygmc3MtPmlkX2xvY2spOworCQlyZWFkX3VubG9jaygmc3MtPmlkX2xvY2spOwogCiAJCWlmICghdG1wKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwX2ZyZWV6ZXIuYyBiL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCmluZGV4IGU2OTE4MTguLjVlODI4YTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCisrKyBiL2tlcm5lbC9jZ3JvdXBfZnJlZXplci5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IGUyNDM1ZWUuLmYzNDZjZWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggMTJiNzQ1OC4uNTYzZjEzNiAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMTAsMTEgKzEwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCiAvKiBTZXJpYWxpemVzIHRoZSB1cGRhdGVzIHRvIGNwdV9vbmxpbmVfbWFzaywgY3B1X3ByZXNlbnRfbWFzayAqLwpAQCAtNDc2LDYgKzQ3Nyw3OSBAQAogCXJldHVybiAwOwogfQogY29yZV9pbml0Y2FsbChhbGxvY19mcm96ZW5fY3B1cyk7CisKKy8qCisgKiBQcmV2ZW50IHJlZ3VsYXIgQ1BVIGhvdHBsdWcgZnJvbSByYWNpbmcgd2l0aCB0aGUgZnJlZXplciwgYnkgZGlzYWJsaW5nIENQVQorICogaG90cGx1ZyB3aGVuIHRhc2tzIGFyZSBhYm91dCB0byBiZSBmcm96ZW4uIEFsc28sIGRvbid0IGFsbG93IHRoZSBmcmVlemVyCisgKiB0byBjb250aW51ZSB1bnRpbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgQ1BVIGhvdHBsdWcgb3BlcmF0aW9uIGdldHMKKyAqIGNvbXBsZXRlZC4KKyAqIFRvIG1vZGlmeSB0aGUgJ2NwdV9ob3RwbHVnX2Rpc2FibGVkJyBmbGFnLCB3ZSBuZWVkIHRvIGFjcXVpcmUgdGhlCisgKiAnY3B1X2FkZF9yZW1vdmVfbG9jaycuIEFuZCB0aGlzIHNhbWUgbG9jayBpcyBhbHNvIHRha2VuIGJ5IHRoZSByZWd1bGFyCisgKiBDUFUgaG90cGx1ZyBwYXRoIGFuZCByZWxlYXNlZCBvbmx5IGFmdGVyIGl0IGlzIGNvbXBsZXRlLiBUaHVzLCB3ZQorICogKGFuZCBoZW5jZSB0aGUgZnJlZXplcikgd2lsbCBibG9jayBoZXJlIHVudGlsIGFueSBjdXJyZW50bHkgcnVubmluZyBDUFUKKyAqIGhvdHBsdWcgb3BlcmF0aW9uIGdldHMgY29tcGxldGVkLgorICovCit2b2lkIGNwdV9ob3RwbHVnX2Rpc2FibGVfYmVmb3JlX2ZyZWV6ZSh2b2lkKQoreworCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOworCWNwdV9ob3RwbHVnX2Rpc2FibGVkID0gMTsKKwljcHVfbWFwc191cGRhdGVfZG9uZSgpOworfQorCisKKy8qCisgKiBXaGVuIHRhc2tzIGhhdmUgYmVlbiB0aGF3ZWQsIHJlLWVuYWJsZSByZWd1bGFyIENQVSBob3RwbHVnICh3aGljaCBoYWQgYmVlbgorICogZGlzYWJsZWQgd2hpbGUgYmVnaW5uaW5nIHRvIGZyZWV6ZSB0YXNrcykuCisgKi8KK3ZvaWQgY3B1X2hvdHBsdWdfZW5hYmxlX2FmdGVyX3RoYXcodm9pZCkKK3sKKwljcHVfbWFwc191cGRhdGVfYmVnaW4oKTsKKwljcHVfaG90cGx1Z19kaXNhYmxlZCA9IDA7CisJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKK30KKworLyoKKyAqIFdoZW4gY2FsbGJhY2tzIGZvciBDUFUgaG90cGx1ZyBub3RpZmljYXRpb25zIGFyZSBiZWluZyBleGVjdXRlZCwgd2UgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gd2l0aCByZXNwZWN0IHRvIHRoZSB0YXNrcyBiZWluZyBmcm96ZW4KKyAqIG9yIG5vdCwgYXMgcmVwb3J0ZWQgYnkgdGhlIG5vdGlmaWNhdGlvbiwgcmVtYWlucyB1bmNoYW5nZWQgKnRocm91Z2hvdXQgdGhlCisgKiBkdXJhdGlvbiogb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGJhY2tzLgorICogSGVuY2Ugd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBmcmVlemVyIGZyb20gcmFjaW5nIHdpdGggcmVndWxhciBDUFUgaG90cGx1Zy4KKyAqCisgKiBUaGlzIHN5bmNocm9uaXphdGlvbiBpcyBpbXBsZW1lbnRlZCBieSBtdXR1YWxseSBleGNsdWRpbmcgcmVndWxhciBDUFUKKyAqIGhvdHBsdWcgYW5kIFN1c3BlbmQvSGliZXJuYXRlIGNhbGwgcGF0aHMgYnkgaG9va2luZyBvbnRvIHRoZSBTdXNwZW5kLworICogSGliZXJuYXRlIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK2NwdV9ob3RwbHVnX3BtX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqcHRyKQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisKKwljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKwljYXNlIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkU6CisJCWNwdV9ob3RwbHVnX2Rpc2FibGVfYmVmb3JlX2ZyZWV6ZSgpOworCQlicmVhazsKKworCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgorCWNhc2UgUE1fUE9TVF9ISUJFUk5BVElPTjoKKwkJY3B1X2hvdHBsdWdfZW5hYmxlX2FmdGVyX3RoYXcoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworCitpbnQgY3B1X2hvdHBsdWdfcG1fc3luY19pbml0KHZvaWQpCit7CisJcG1fbm90aWZpZXIoY3B1X2hvdHBsdWdfcG1fY2FsbGJhY2ssIDApOworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChjcHVfaG90cGx1Z19wbV9zeW5jX2luaXQpOworCiAjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQX1NNUCAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVfcG0uYyBiL2tlcm5lbC9jcHVfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDkxNTJlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2NwdV9wbS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqCUNvbGluIENyb3NzIDxjY3Jvc3NAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhjcHVfcG1fbm90aWZpZXJfbG9jayk7CitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQoY3B1X3BtX25vdGlmaWVyX2NoYWluKTsKKworc3RhdGljIGludCBjcHVfcG1fbm90aWZ5KGVudW0gY3B1X3BtX2V2ZW50IGV2ZW50LCBpbnQgbnJfdG9fY2FsbCwgaW50ICpucl9jYWxscykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19yYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X3BtX25vdGlmaWVyX2NoYWluLCBldmVudCwgTlVMTCwKKwkJbnJfdG9fY2FsbCwgbnJfY2FsbHMpOworCisJcmV0dXJuIG5vdGlmaWVyX3RvX2Vycm5vKHJldCk7Cit9CisKKy8qKgorICogY3B1X3BtX3JlZ2lzdGVyX25vdGlmaWVyIC0gcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCBjcHVfcG0KKyAqIEBuYjogbm90aWZpZXIgYmxvY2sgdG8gcmVnaXN0ZXIKKyAqCisgKiBBZGQgYSBkcml2ZXIgdG8gYSBsaXN0IG9mIGRyaXZlcnMgdGhhdCBhcmUgbm90aWZpZWQgYWJvdXQKKyAqIENQVSBhbmQgQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGVudHJ5IGFuZCBleGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLCBhbmQgaGFzIHRoZSBzYW1lIHJldHVybiBjb25kaXRpb25zIGFzCisgKiByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIuCisgKi8KK2ludCBjcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNwdV9wbV9ub3RpZmllcl9sb2NrLCBmbGFncyk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZjcHVfcG1fbm90aWZpZXJfY2hhaW4sIG5iKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X3BtX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIpOworCisvKioKKyAqIGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIGRyaXZlciB3aXRoIGNwdV9wbQorICogQG5iOiBub3RpZmllciBibG9jayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqCisgKiBSZW1vdmUgYSBkcml2ZXIgZnJvbSB0aGUgQ1BVIFBNIG5vdGlmaWVyIGxpc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAsIGFuZCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbmRpdGlvbnMgYXMKKyAqIHJhd19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyLgorICovCitpbnQgY3B1X3BtX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNwdV9wbV9ub3RpZmllcl9sb2NrLCBmbGFncyk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmNwdV9wbV9ub3RpZmllcl9jaGFpbiwgbmIpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfcG1fbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9wbV91bnJlZ2lzdGVyX25vdGlmaWVyKTsKKworLyoqCisgKiBjcG1fcG1fZW50ZXIgLSBDUFUgbG93IHBvd2VyIGVudHJ5IG5vdGlmaWVyCisgKgorICogTm90aWZpZXMgbGlzdGVuZXJzIHRoYXQgYSBzaW5nbGUgQ1BVIGlzIGVudGVyaW5nIGEgbG93IHBvd2VyIHN0YXRlIHRoYXQgbWF5CisgKiBjYXVzZSBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gYXMgdGhlIGNwdSB0byByZXNldC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgYWZmZWN0ZWQgQ1BVIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gIFBsYXRmb3JtIGlzCisgKiByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCBjcHVfcG1fZW50ZXIgaXMgbm90IGNhbGxlZCB0d2ljZSBvbiB0aGUgc2FtZQorICogQ1BVIGJlZm9yZSBjcHVfcG1fZXhpdCBpcyBjYWxsZWQuIE5vdGlmaWVkIGRyaXZlcnMgY2FuIGluY2x1ZGUgVkZQCisgKiBjby1wcm9jZXNzb3IsIGludGVycnVwdCBjb250cm9sbGVyIGFuZCBpdCdzIFBNIGV4dGVuc2lvbnMsIGxvY2FsIENQVQorICogdGltZXJzIGNvbnRleHQgc2F2ZS9yZXN0b3JlIHdoaWNoIHNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZC4gSGVuY2UgaXQKKyAqIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm4gY29uZGl0aW9ucyBhcmUgc2FtZSBhcyBfX3Jhd19ub3RpZmllcl9jYWxsX2NoYWluLgorICovCitpbnQgY3B1X3BtX2VudGVyKHZvaWQpCit7CisJaW50IG5yX2NhbGxzOworCWludCByZXQgPSAwOworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfUE1fRU5URVIsIC0xLCAmbnJfY2FsbHMpOworCWlmIChyZXQpCisJCS8qCisJCSAqIEluZm9ybSBsaXN0ZW5lcnMgKG5yX2NhbGxzIC0gMSkgYWJvdXQgZmFpbHVyZSBvZiBDUFUgUE0KKwkJICogUE0gZW50cnkgd2hvIGFyZSBub3RpZmllZCBlYXJsaWVyIHRvIHByZXBhcmUgZm9yIGl0LgorCQkgKi8KKwkJY3B1X3BtX25vdGlmeShDUFVfUE1fRU5URVJfRkFJTEVELCBucl9jYWxscyAtIDEsIE5VTEwpOworCXJlYWRfdW5sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X3BtX2VudGVyKTsKKworLyoqCisgKiBjcG1fcG1fZXhpdCAtIENQVSBsb3cgcG93ZXIgZXhpdCBub3RpZmllcgorICoKKyAqIE5vdGlmaWVzIGxpc3RlbmVycyB0aGF0IGEgc2luZ2xlIENQVSBpcyBleGl0aW5nIGEgbG93IHBvd2VyIHN0YXRlIHRoYXQgbWF5CisgKiBoYXZlIGNhdXNlZCBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gYXMgdGhlIGNwdSB0byByZXNldC4KKyAqCisgKiBOb3RpZmllZCBkcml2ZXJzIGNhbiBpbmNsdWRlIFZGUCBjby1wcm9jZXNzb3IsIGludGVycnVwdCBjb250cm9sbGVyCisgKiBhbmQgaXQncyBQTSBleHRlbnNpb25zLCBsb2NhbCBDUFUgdGltZXJzIGNvbnRleHQgc2F2ZS9yZXN0b3JlIHdoaWNoCisgKiBzaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQuIEhlbmNlIGl0IG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm4gY29uZGl0aW9ucyBhcmUgc2FtZSBhcyBfX3Jhd19ub3RpZmllcl9jYWxsX2NoYWluLgorICovCitpbnQgY3B1X3BtX2V4aXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfUE1fRVhJVCwgLTEsIE5VTEwpOworCXJlYWRfdW5sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X3BtX2V4aXQpOworCisvKioKKyAqIGNwbV9jbHVzdGVyX3BtX2VudGVyIC0gQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGVudHJ5IG5vdGlmaWVyCisgKgorICogTm90aWZpZXMgbGlzdGVuZXJzIHRoYXQgYWxsIGNwdXMgaW4gYSBwb3dlciBkb21haW4gYXJlIGVudGVyaW5nIGEgbG93IHBvd2VyCisgKiBzdGF0ZSB0aGF0IG1heSBjYXVzZSBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4gdG8gcmVzZXQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY3B1X3BtX2VudGVyIGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgY3B1cyBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbiwgYW5kIGJlZm9yZSBjcHVfcG1fZXhpdCBoYXMgYmVlbiBjYWxsZWQgb24gYW55IGNwdSBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbi4gTm90aWZpZWQgZHJpdmVycyBjYW4gaW5jbHVkZSBWRlAgY28tcHJvY2Vzc29yLCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogYW5kIGl0J3MgUE0gZXh0ZW5zaW9ucywgbG9jYWwgQ1BVIHRpbWVycyBjb250ZXh0IHNhdmUvcmVzdG9yZSB3aGljaAorICogc2hvdWxkbid0IGJlIGludGVycnVwdGVkLiBIZW5jZSBpdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFJldHVybiBjb25kaXRpb25zIGFyZSBzYW1lIGFzIF9fcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4uCisgKi8KK2ludCBjcHVfY2x1c3Rlcl9wbV9lbnRlcih2b2lkKQoreworCWludCBucl9jYWxsczsKKwlpbnQgcmV0ID0gMDsKKworCXJlYWRfbG9jaygmY3B1X3BtX25vdGlmaWVyX2xvY2spOworCXJldCA9IGNwdV9wbV9ub3RpZnkoQ1BVX0NMVVNURVJfUE1fRU5URVIsIC0xLCAmbnJfY2FsbHMpOworCWlmIChyZXQpCisJCS8qCisJCSAqIEluZm9ybSBsaXN0ZW5lcnMgKG5yX2NhbGxzIC0gMSkgYWJvdXQgZmFpbHVyZSBvZiBDUFUgY2x1c3RlcgorCQkgKiBQTSBlbnRyeSB3aG8gYXJlIG5vdGlmaWVkIGVhcmxpZXIgdG8gcHJlcGFyZSBmb3IgaXQuCisJCSAqLworCQljcHVfcG1fbm90aWZ5KENQVV9DTFVTVEVSX1BNX0VOVEVSX0ZBSUxFRCwgbnJfY2FsbHMgLSAxLCBOVUxMKTsKKwlyZWFkX3VubG9jaygmY3B1X3BtX25vdGlmaWVyX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9jbHVzdGVyX3BtX2VudGVyKTsKKworLyoqCisgKiBjcG1fY2x1c3Rlcl9wbV9leGl0IC0gQ1BVIGNsdXN0ZXIgbG93IHBvd2VyIGV4aXQgbm90aWZpZXIKKyAqCisgKiBOb3RpZmllcyBsaXN0ZW5lcnMgdGhhdCBhbGwgY3B1cyBpbiBhIHBvd2VyIGRvbWFpbiBhcmUgZXhpdGluZyBmb3JtIGEKKyAqIGxvdyBwb3dlciBzdGF0ZSB0aGF0IG1heSBoYXZlIGNhdXNlZCBzb21lIGJsb2NrcyBpbiB0aGUgc2FtZSBwb3dlciBkb21haW4KKyAqIHRvIHJlc2V0LgorICoKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNwdV9wbV9leGl0IGhhcyBiZWVuIGNhbGxlZCBvbiBhbGwgY3B1cyBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbiwgYW5kIGJlZm9yZSBjcHVfcG1fZXhpdCBoYXMgYmVlbiBjYWxsZWQgb24gYW55IGNwdSBpbiB0aGUgcG93ZXIKKyAqIGRvbWFpbi4gTm90aWZpZWQgZHJpdmVycyBjYW4gaW5jbHVkZSBWRlAgY28tcHJvY2Vzc29yLCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogYW5kIGl0J3MgUE0gZXh0ZW5zaW9ucywgbG9jYWwgQ1BVIHRpbWVycyBjb250ZXh0IHNhdmUvcmVzdG9yZSB3aGljaAorICogc2hvdWxkbid0IGJlIGludGVycnVwdGVkLiBIZW5jZSBpdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogUmV0dXJuIGNvbmRpdGlvbnMgYXJlIHNhbWUgYXMgX19yYXdfbm90aWZpZXJfY2FsbF9jaGFpbi4KKyAqLworaW50IGNwdV9jbHVzdGVyX3BtX2V4aXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmVhZF9sb2NrKCZjcHVfcG1fbm90aWZpZXJfbG9jayk7CisJcmV0ID0gY3B1X3BtX25vdGlmeShDUFVfQ0xVU1RFUl9QTV9FWElULCAtMSwgTlVMTCk7CisJcmVhZF91bmxvY2soJmNwdV9wbV9ub3RpZmllcl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfY2x1c3Rlcl9wbV9leGl0KTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjcHVfcG1fc3VzcGVuZCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVfcG1fZW50ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3B1X2NsdXN0ZXJfcG1fZW50ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjcHVfcG1fcmVzdW1lKHZvaWQpCit7CisJY3B1X2NsdXN0ZXJfcG1fZXhpdCgpOworCWNwdV9wbV9leGl0KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgY3B1X3BtX3N5c2NvcmVfb3BzID0geworCS5zdXNwZW5kID0gY3B1X3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IGNwdV9wbV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IGNwdV9wbV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmNwdV9wbV9zeXNjb3JlX29wcyk7CisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKGNwdV9wbV9pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDEwMTMxZmQuLjlmZTU4YzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC05NDksNiArOTQ5LDggQEAKIHN0YXRpYyB2b2lkIGNwdXNldF9jaGFuZ2VfdGFza19ub2RlbWFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQkJbm9kZW1hc2tfdCAqbmV3bWVtcykKIHsKKwlib29sIG1hc2tzX2Rpc2pvaW50ID0gIW5vZGVzX2ludGVyc2VjdHMoKm5ld21lbXMsIHRzay0+bWVtc19hbGxvd2VkKTsKKwogcmVwZWF0OgogCS8qCiAJICogQWxsb3cgdGFza3MgdGhhdCBoYXZlIGFjY2VzcyB0byBtZW1vcnkgcmVzZXJ2ZXMgYmVjYXVzZSB0aGV5IGhhdmUKQEAgLTk2Myw3ICs5NjUsNiBAQAogCW5vZGVzX29yKHRzay0+bWVtc19hbGxvd2VkLCB0c2stPm1lbXNfYWxsb3dlZCwgKm5ld21lbXMpOwogCW1wb2xfcmViaW5kX3Rhc2sodHNrLCBuZXdtZW1zLCBNUE9MX1JFQklORF9TVEVQMSk7CiAKLQogCS8qCiAJICogZW5zdXJlIGNoZWNraW5nIC0+bWVtc19hbGxvd2VkX2NoYW5nZV9kaXNhYmxlIGFmdGVyIHNldHRpbmcgYWxsIG5ldwogCSAqIGFsbG93ZWQgbm9kZXMuCkBAIC05ODAsOSArOTgxLDExIEBACiAKIAkvKgogCSAqIEFsbG9jYXRpb24gb2YgbWVtb3J5IGlzIHZlcnkgZmFzdCwgd2UgbmVlZG4ndCBzbGVlcCB3aGVuIHdhaXRpbmcKLQkgKiBmb3IgdGhlIHJlYWQtc2lkZS4KKwkgKiBmb3IgdGhlIHJlYWQtc2lkZS4gIE5vIHdhaXQgaXMgbmVjZXNzYXJ5LCBob3dldmVyLCBpZiBhdCBsZWFzdCBvbmUKKwkgKiBub2RlIHJlbWFpbnMgdW5jaGFuZ2VkLgogCSAqLwotCXdoaWxlIChBQ0NFU1NfT05DRSh0c2stPm1lbXNfYWxsb3dlZF9jaGFuZ2VfZGlzYWJsZSkpIHsKKwl3aGlsZSAobWFza3NfZGlzam9pbnQgJiYKKwkJCUFDQ0VTU19PTkNFKHRzay0+bWVtc19hbGxvd2VkX2NoYW5nZV9kaXNhYmxlKSkgewogCQl0YXNrX3VubG9jayh0c2spOwogCQlpZiAoIXRhc2tfY3Vycih0c2spKQogCQkJeWllbGQoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9rZXJuZWwvY3Jhc2hfZHVtcC5jCmluZGV4IDVmODU2OTAuLmM3NjZlZTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcmFzaF9kdW1wLmMKKysrIGIva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBJZiB3ZSBoYXZlIGJvb3RlZCBkdWUgdG8gYSBjcmFzaCwgbWF4X3BmbiB3aWxsIGJlIGEgdmVyeSBsb3cgdmFsdWUuIFdlIG5lZWQKQEAgLTIwLDggKzIwLDE1IEBACiB1bnNpZ25lZCBsb25nIGxvbmcgZWxmY29yZWhkcl9hZGRyID0gRUxGQ09SRV9BRERSX01BWDsKIAogLyoKKyAqIHN0b3JlcyB0aGUgc2l6ZSBvZiBlbGYgaGVhZGVyIG9mIGNyYXNoIGltYWdlCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX3NpemU7CisKKy8qCiAgKiBlbGZjb3JlaGRyPSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGVsZiBjb3JlIGhlYWRlciBzdG9yZWQgYnkgdGhlIGNyYXNoZWQKICAqIGtlcm5lbC4gVGhpcyBvcHRpb24gd2lsbCBiZSBwYXNzZWQgYnkga2V4ZWMgbG9hZGVyIHRvIHRoZSBjYXB0dXJlIGtlcm5lbC4KKyAqCisgKiBTeW50YXg6IGVsZmNvcmVoZHI9W3NpemVbS01HXUBdb2Zmc2V0W0tNR10KICAqLwogc3RhdGljIGludCBfX2luaXQgc2V0dXBfZWxmY29yZWhkcihjaGFyICphcmcpCiB7CkBAIC0yOSw2ICszNiwxMCBAQAogCWlmICghYXJnKQogCQlyZXR1cm4gLUVJTlZBTDsKIAllbGZjb3JlaGRyX2FkZHIgPSBtZW1wYXJzZShhcmcsICZlbmQpOworCWlmICgqZW5kID09ICdAJykgeworCQllbGZjb3JlaGRyX3NpemUgPSBlbGZjb3JlaGRyX2FkZHI7CisJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGVuZCArIDEsICZlbmQpOworCX0KIAlyZXR1cm4gZW5kID4gYXJnID8gMCA6IC1FSU5WQUw7CiB9CiBlYXJseV9wYXJhbSgiZWxmY29yZWhkciIsIHNldHVwX2VsZmNvcmVoZHIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggYmI1NWQwNS4uNTc5MTYxMiAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC04LDcgKzgsNyBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYyBiL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKaW5kZXggMzQ4NzI0OC4uYzIyZDhjMiAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYworKysgYi9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCQkvKiBQYWNrIGluIGhleCBjaGFycyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgd2NvdW50OyBpKyspCi0JCQlidWZwdHIgPSBwYWNrX2hleF9ieXRlKGJ1ZnB0ciwgc1tpXSk7CisJCQlidWZwdHIgPSBoZXhfYnl0ZV9wYWNrKGJ1ZnB0ciwgc1tpXSk7CiAJCSpidWZwdHIgPSAnXDAnOwogCiAJCS8qIE1vdmUgdXAgKi8KQEAgLTI0OSw3ICsyNDksNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBOVUxMOwogCXdoaWxlIChjb3VudCA+IDApIHsKLQkJYnVmID0gcGFja19oZXhfYnl0ZShidWYsICp0bXApOworCQlidWYgPSBoZXhfYnl0ZV9wYWNrKGJ1ZiwgKnRtcCk7CiAJCXRtcCsrOwogCQljb3VudC0tOwogCX0KQEAgLTQxMSwxNCArNDExLDE0IEBACiAJbGltaXQgPSBpZCArIChCVUZfVEhSRUFEX0lEX1NJWkUgLyAyKTsKIAl3aGlsZSAoaWQgPCBsaW1pdCkgewogCQlpZiAoIWx6ZXJvIHx8ICppZCAhPSAwKSB7Ci0JCQlwa3QgPSBwYWNrX2hleF9ieXRlKHBrdCwgKmlkKTsKKwkJCXBrdCA9IGhleF9ieXRlX3BhY2socGt0LCAqaWQpOwogCQkJbHplcm8gPSAwOwogCQl9CiAJCWlkKys7CiAJfQogCiAJaWYgKGx6ZXJvKQotCQlwa3QgPSBwYWNrX2hleF9ieXRlKHBrdCwgMCk7CisJCXBrdCA9IGhleF9ieXRlX3BhY2socGt0LCAwKTsKIAogCXJldHVybiBwa3Q7CiB9CkBAIC00ODYsNyArNDg2LDcgQEAKIAlkYmdfcmVtb3ZlX2FsbF9icmVhaygpOwogCiAJcmVtY29tX291dF9idWZmZXJbMF0gPSAnUyc7Ci0JcGFja19oZXhfYnl0ZSgmcmVtY29tX291dF9idWZmZXJbMV0sIGtzLT5zaWdubyk7CisJaGV4X2J5dGVfcGFjaygmcmVtY29tX291dF9idWZmZXJbMV0sIGtzLT5zaWdubyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdkYl9nZXRfcmVnc19oZWxwZXIoc3RydWN0IGtnZGJfc3RhdGUgKmtzKQpAQCAtOTU0LDcgKzk1NCw3IEBACiAJCS8qIFJlcGx5IHRvIGhvc3QgdGhhdCBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkICovCiAJCXB0ciA9IHJlbWNvbV9vdXRfYnVmZmVyOwogCQkqcHRyKysgPSAnVCc7Ci0JCXB0ciA9IHBhY2tfaGV4X2J5dGUocHRyLCBrcy0+c2lnbm8pOworCQlwdHIgPSBoZXhfYnl0ZV9wYWNrKHB0ciwga3MtPnNpZ25vKTsKIAkJcHRyICs9IHN0cmxlbihzdHJjcHkocHRyLCAidGhyZWFkOiIpKTsKIAkJaW50X3RvX3RocmVhZHJlZih0aHJlZiwgc2hhZG93X3BpZChjdXJyZW50LT5waWQpKTsKIAkJcHRyID0gcGFja190aHJlYWRpZChwdHIsIHRocmVmKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jCmluZGV4IGQ5Y2E5YWEuLjhiNjhjZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJrZGJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIi4uL2RlYnVnX2NvcmUuaCIKIApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS5jIGIva2VybmVsL2RtYS5jCmluZGV4IGY5MDMxODkuLjY4YTIzMDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEuYworKysgYi9rZXJuZWwvZG1hLmMKQEAgLTksNyArOSw3IEBACiAgKiAgIFtJdCBhbHNvIGhhcHBlbmVkIHRvIHJlbW92ZSB0aGUgc2l6ZW9mKGNoYXIgKikgPT0gc2l6ZW9mKGludCkKICAqICAgYXNzdW1wdGlvbiBpbnRyb2R1Y2VkIGJlY2F1c2Ugb2YgdGhvc2UgL3Byb2MvZG1hIHBhdGNoZXMuIC0tIEhlbm51c10KICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZDFhMWJlZS4uMGU4NDU3ZCAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTI1LDExICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9hbm9uX2lub2Rlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CkBAIC0zNTQ0LDcgKzM1NDQsNyBAQAogCQlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gZXZlbnQtPnJiOwogCiAJCWF0b21pY19sb25nX3N1Yigoc2l6ZSA+PiBQQUdFX1NISUZUKSArIDEsICZ1c2VyLT5sb2NrZWRfdm0pOwotCQl2bWEtPnZtX21tLT5sb2NrZWRfdm0gLT0gZXZlbnQtPm1tYXBfbG9ja2VkOworCQl2bWEtPnZtX21tLT5waW5uZWRfdm0gLT0gZXZlbnQtPm1tYXBfbG9ja2VkOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCBOVUxMKTsKIAkJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CiAKQEAgLTM2MjUsNyArMzYyNSw3IEBACiAKIAlsb2NrX2xpbWl0ID0gcmxpbWl0KFJMSU1JVF9NRU1MT0NLKTsKIAlsb2NrX2xpbWl0ID4+PSBQQUdFX1NISUZUOwotCWxvY2tlZCA9IHZtYS0+dm1fbW0tPmxvY2tlZF92bSArIGV4dHJhOworCWxvY2tlZCA9IHZtYS0+dm1fbW0tPnBpbm5lZF92bSArIGV4dHJhOwogCiAJaWYgKChsb2NrZWQgPiBsb2NrX2xpbWl0KSAmJiBwZXJmX3BhcmFub2lkX3RyYWNlcG9pbnRfcmF3KCkgJiYKIAkJIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkgewpAQCAtMzY1MSw3ICszNjUxLDcgQEAKIAlhdG9taWNfbG9uZ19hZGQodXNlcl9leHRyYSwgJnVzZXItPmxvY2tlZF92bSk7CiAJZXZlbnQtPm1tYXBfbG9ja2VkID0gZXh0cmE7CiAJZXZlbnQtPm1tYXBfdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsKLQl2bWEtPnZtX21tLT5sb2NrZWRfdm0gKz0gZXZlbnQtPm1tYXBfbG9ja2VkOworCXZtYS0+dm1fbW0tPnBpbm5lZF92bSArPSBldmVudC0+bW1hcF9sb2NrZWQ7CiAKIHVubG9jazoKIAlpZiAoIXJldCkKQEAgLTY4NTMsNyArNjg1Myw3IEBACiAJc3RydWN0IHN3ZXZlbnRfaHRhYmxlICpzd2hhc2ggPSAmcGVyX2NwdShzd2V2ZW50X2h0YWJsZSwgY3B1KTsKIAogCW11dGV4X2xvY2soJnN3aGFzaC0+aGxpc3RfbXV0ZXgpOwotCWlmIChzd2hhc2gtPmhsaXN0X3JlZmNvdW50ID4gMCAmJiAhc3doYXNoLT5zd2V2ZW50X2hsaXN0KSB7CisJaWYgKHN3aGFzaC0+aGxpc3RfcmVmY291bnQgPiAwKSB7CiAJCXN0cnVjdCBzd2V2ZW50X2hsaXN0ICpobGlzdDsKIAogCQlobGlzdCA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmhsaXN0KSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CkBAIC02OTQyLDE0ICs2OTQyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKIAotCS8qCi0JICogSWdub3JlIHN1c3BlbmQvcmVzdW1lIGFjdGlvbiwgdGhlIHBlcmZfcG1fbm90aWZpZXIgd2lsbAotCSAqIHRha2UgY2FyZSBvZiB0aGF0LgotCSAqLwotCWlmIChhY3Rpb24gJiBDUFVfVEFTS1NfRlJPWkVOKQotCQlyZXR1cm4gTk9USUZZX09LOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CiAKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgpAQCAtNjk2OCw5MCArNjk2MSw2IEBACiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9wbV9yZXN1bWVfY3B1KHZvaWQgKnVudXNlZCkKLXsKLQlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OwotCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eDsKLQlzdHJ1Y3QgcG11ICpwbXU7Ci0JaW50IGlkeDsKLQotCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZwbXVzX3NyY3UpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBtdSwgJnBtdXMsIGVudHJ5KSB7Ci0JCWNwdWN0eCA9IHRoaXNfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7Ci0JCWN0eCA9IGNwdWN0eC0+dGFza19jdHg7Ci0KLQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGN0eCk7Ci0JCXBlcmZfcG11X2Rpc2FibGUoY3B1Y3R4LT5jdHgucG11KTsKLQotCQljcHVfY3R4X3NjaGVkX291dChjcHVjdHgsIEVWRU5UX0FMTCk7Ci0JCWlmIChjdHgpCi0JCQljdHhfc2NoZWRfb3V0KGN0eCwgY3B1Y3R4LCBFVkVOVF9BTEwpOwotCi0JCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjdHgpOwotCX0KLQlzcmN1X3JlYWRfdW5sb2NrKCZwbXVzX3NyY3UsIGlkeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcmZfcG1fc3VzcGVuZF9jcHUodm9pZCAqdW51c2VkKQotewotCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7Ci0Jc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4OwotCXN0cnVjdCBwbXUgKnBtdTsKLQlpbnQgaWR4OwotCi0JaWR4ID0gc3JjdV9yZWFkX2xvY2soJnBtdXNfc3JjdSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG11LCAmcG11cywgZW50cnkpIHsKLQkJY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKLQkJY3R4ID0gY3B1Y3R4LT50YXNrX2N0eDsKLQotCQlwZXJmX2N0eF9sb2NrKGNwdWN0eCwgY3R4KTsKLQkJcGVyZl9wbXVfZGlzYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCi0JCXBlcmZfZXZlbnRfc2NoZWRfaW4oY3B1Y3R4LCBjdHgsIGN1cnJlbnQpOwotCi0JCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjdHgpOwotCX0KLQlzcmN1X3JlYWRfdW5sb2NrKCZwbXVzX3NyY3UsIGlkeCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyZl9yZXN1bWUodm9pZCkKLXsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQlzbXBfY2FsbF9mdW5jdGlvbihwZXJmX3BtX3Jlc3VtZV9jcHUsIE5VTEwsIDEpOwotCXB1dF9vbmxpbmVfY3B1cygpOwotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIGludCBwZXJmX3N1c3BlbmQodm9pZCkKLXsKLQlnZXRfb25saW5lX2NwdXMoKTsKLQlzbXBfY2FsbF9mdW5jdGlvbihwZXJmX3BtX3N1c3BlbmRfY3B1LCBOVUxMLCAxKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyZl9wbShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpwdHIpCi17Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFBNX1BPU1RfSElCRVJOQVRJT046Ci0JY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCXJldHVybiBwZXJmX3Jlc3VtZSgpOwotCWNhc2UgUE1fSElCRVJOQVRJT05fUFJFUEFSRToKLQljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKLQkJcmV0dXJuIHBlcmZfc3VzcGVuZCgpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGVyZl9wbV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHBlcmZfcG0sCi19OwotCiB2b2lkIF9faW5pdCBwZXJmX2V2ZW50X2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtNzA2Niw3ICs2OTc1LDYgQEAKIAlwZXJmX3RwX3JlZ2lzdGVyKCk7CiAJcGVyZl9jcHVfbm90aWZpZXIocGVyZl9jcHVfbm90aWZ5KTsKIAlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBlcmZfcmVib290X25vdGlmaWVyKTsKLQlyZWdpc3Rlcl9wbV9ub3RpZmllcigmcGVyZl9wbV9ub3RpZmllcik7CiAKIAlyZXQgPSBpbml0X2h3X2JyZWFrcG9pbnQoKTsKIAlXQVJOKHJldCwgImh3X2JyZWFrcG9pbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIHdpdGg6ICVkIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IDI5MTNiMzUuLmQwYjdkOTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNjgxLDggKzY4MSw2IEBACiAJZW50ZXJfbGF6eV90bGIobW0sIGN1cnJlbnQpOwogCS8qIFdlIGRvbid0IHdhbnQgdGhpcyB0YXNrIHRvIGJlIGZyb3plbiBwcmVtYXR1cmVseSAqLwogCWNsZWFyX2ZyZWV6ZV9mbGFnKHRzayk7Ci0JaWYgKHRzay0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQlhdG9taWNfZGVjKCZtbS0+b29tX2Rpc2FibGVfY291bnQpOwogCXRhc2tfdW5sb2NrKHRzayk7CiAJbW1fdXBkYXRlX25leHRfb3duZXIobW0pOwogCW1tcHV0KG1tKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDhlNmI2ZjQuLmJhMGQxNzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtNTAxLDcgKzUwMSw2IEBACiAJbW0tPmNhY2hlZF9ob2xlX3NpemUgPSB+MFVMOwogCW1tX2luaXRfYWlvKG1tKTsKIAltbV9pbml0X293bmVyKG1tLCBwKTsKLQlhdG9taWNfc2V0KCZtbS0+b29tX2Rpc2FibGVfY291bnQsIDApOwogCiAJaWYgKGxpa2VseSghbW1fYWxsb2NfcGdkKG1tKSkpIHsKIAkJbW0tPmRlZl9mbGFncyA9IDA7CkBAIC04MTYsOCArODE1LDYgQEAKIAkvKiBJbml0aWFsaXppbmcgZm9yIFN3YXAgdG9rZW4gc3R1ZmYgKi8KIAltbS0+dG9rZW5fcHJpb3JpdHkgPSAwOwogCW1tLT5sYXN0X2ludGVydmFsID0gMDsKLQlpZiAodHNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gT09NX1NDT1JFX0FESl9NSU4pCi0JCWF0b21pY19pbmMoJm1tLT5vb21fZGlzYWJsZV9jb3VudCk7CiAKIAl0c2stPm1tID0gbW07CiAJdHNrLT5hY3RpdmVfbW0gPSBtbTsKQEAgLTEzMDIsNiArMTI5OSw5IEBACiAJcC0+cGRlYXRoX3NpZ25hbCA9IDA7CiAJcC0+ZXhpdF9zdGF0ZSA9IDA7CiAKKwlwLT5ucl9kaXJ0aWVkID0gMDsKKwlwLT5ucl9kaXJ0aWVkX3BhdXNlID0gMTI4ID4+IChQQUdFX1NISUZUIC0gMTApOworCiAJLyoKIAkgKiBPaywgbWFrZSBpdCB2aXNpYmxlIHRvIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCiAJICogV2UgZG9udCB3YWtlIGl0IHVwIHlldC4KQEAgLTEzOTEsMTMgKzEzOTEsOCBAQAogYmFkX2ZvcmtfY2xlYW51cF9uYW1lc3BhY2VzOgogCWV4aXRfdGFza19uYW1lc3BhY2VzKHApOwogYmFkX2ZvcmtfY2xlYW51cF9tbToKLQlpZiAocC0+bW0pIHsKLQkJdGFza19sb2NrKHApOwotCQlpZiAocC0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQkJYXRvbWljX2RlYygmcC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KTsKLQkJdGFza191bmxvY2socCk7CisJaWYgKHAtPm1tKQogCQltbXB1dChwLT5tbSk7Ci0JfQogYmFkX2ZvcmtfY2xlYW51cF9zaWduYWw6CiAJaWYgKCEoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpKQogCQlmcmVlX3NpZ25hbF9zdHJ1Y3QocC0+c2lnbmFsKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mcmVlemVyLmMgYi9rZXJuZWwvZnJlZXplci5jCmluZGV4IDY2YTU5NGUuLjdiZTU2YzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mcmVlemVyLmMKKysrIGIva2VybmVsL2ZyZWV6ZXIuYwpAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIApAQCAtNjcsNyArNjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCXNpZ25hbF93YWtlX3VwKHAsIDEpOworCXNpZ25hbF93YWtlX3VwKHAsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCAxNTExZGZmLi5lYTg3ZjRkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2dyb3Vwcy5jIGIva2VybmVsL2dyb3Vwcy5jCmluZGV4IDFjYzQ3NmQuLjk5YjUzZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ncm91cHMuYworKysgYi9rZXJuZWwvZ3JvdXBzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBTdXBwbGVtZW50YXJ5IGdyb3VwIElEcwogICovCiAjaW5jbHVkZSA8bGludXgvY3JlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBhOTIwNWUzLi40MjJlNTY3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvaHVuZ190YXNrLmMgYi9rZXJuZWwvaHVuZ190YXNrLmMKaW5kZXggZWE2NDAxMi4uOGIxNzQ4ZCAxMDA2NDQKLS0tIGEva2VybmVsL2h1bmdfdGFzay5jCisrKyBiL2tlcm5lbC9odW5nX3Rhc2suYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKaW5kZXggZTM4NTQ0ZC4uYzg5Mjk1YSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYworKysgYi9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KQEAgLTIxMSw2ICsyMTIsNyBAQAogCX0KIAlyZXR1cm4gZ2M7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKTsKIAogLyoKICAqIFNlcGFyYXRlIGxvY2tkZXAgY2xhc3MgZm9yIGludGVycnVwdCBjaGlwIHdoaWNoIGNhbiBuZXN0IGlycV9kZXNjCkBAIC0yNTgsNiArMjYwLDcgQEAKIAl9CiAJZ2MtPmlycV9jbnQgPSBpIC0gZ2MtPmlycV9iYXNlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX3NldHVwX2dlbmVyaWNfY2hpcCk7CiAKIC8qKgogICogaXJxX3NldHVwX2FsdF9jaGlwIC0gU3dpdGNoIHRvIGFsdGVybmF0aXZlIGNoaXAKQEAgLTI4MSw2ICsyODQsNyBAQAogCX0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9zZXR1cF9hbHRfY2hpcCk7CiAKIC8qKgogICogaXJxX3JlbW92ZV9nZW5lcmljX2NoaXAgLSBSZW1vdmUgYSBjaGlwCkBAIC0zMTEsNiArMzE1LDcgQEAKIAkJaXJxX21vZGlmeV9zdGF0dXMoaSwgY2xyLCBzZXQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9yZW1vdmVfZ2VuZXJpY19jaGlwKTsKIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBpcnFfZ2Nfc3VzcGVuZCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCAxNTUwZTg0Li5kODZlMjU0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCmluZGV4IGI1N2EzNzcuLjIwMGNlODMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKKysrIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpAQCAtMjAsMTUgKzIwLDE1IEBACiB2b2lkIGlycV9kb21haW5fYWRkKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCiB7CiAJc3RydWN0IGlycV9kYXRhICpkOwotCWludCBod2lycTsKKwlpbnQgaHdpcnEsIGlycTsKIAogCS8qCiAJICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGlycV9kb21haW4gb3duZXIgaGFzIGFscmVhZHkgYWxsb2NhdGVkCiAJICogdGhlIGlycV9kZXNjcy4gIFRoaXMgYmxvY2sgd2lsbCBiZSByZW1vdmVkIHdoZW4gc3VwcG9ydCBmb3IgZHluYW1pYwogCSAqIGFsbG9jYXRpb24gb2YgaXJxX2Rlc2NzIGlzIGFkZGVkIHRvIGlycV9kb21haW4uCiAJICovCi0JZm9yIChod2lycSA9IDA7IGh3aXJxIDwgZG9tYWluLT5ucl9pcnE7IGh3aXJxKyspIHsKLQkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxX2RvbWFpbl90b19pcnEoZG9tYWluLCBod2lycSkpOworCWlycV9kb21haW5fZm9yX2VhY2hfaXJxKGRvbWFpbiwgaHdpcnEsIGlycSkgeworCQlkID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwogCQlpZiAoIWQpIHsKIAkJCVdBUk4oMSwgImVycm9yOiBhc3NpZ25pbmcgZG9tYWluIHRvIG5vbiBleGlzdGFudCBpcnFfZGVzYyIpOwogCQkJcmV0dXJuOwpAQCAtNTQsMTUgKzU0LDE1IEBACiB2b2lkIGlycV9kb21haW5fZGVsKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCiB7CiAJc3RydWN0IGlycV9kYXRhICpkOwotCWludCBod2lycTsKKwlpbnQgaHdpcnEsIGlycTsKIAogCW11dGV4X2xvY2soJmlycV9kb21haW5fbXV0ZXgpOwogCWxpc3RfZGVsKCZkb21haW4tPmxpc3QpOwogCW11dGV4X3VubG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CiAKIAkvKiBDbGVhciB0aGUgaXJxX2RvbWFpbiBhc3NpZ25tZW50cyAqLwotCWZvciAoaHdpcnEgPSAwOyBod2lycSA8IGRvbWFpbi0+bnJfaXJxOyBod2lycSsrKSB7Ci0JCWQgPSBpcnFfZ2V0X2lycV9kYXRhKGlycV9kb21haW5fdG9faXJxKGRvbWFpbiwgaHdpcnEpKTsKKwlpcnFfZG9tYWluX2Zvcl9lYWNoX2lycShkb21haW4sIGh3aXJxLCBpcnEpIHsKKwkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxKTsKIAkJZC0+ZG9tYWluID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxX3dvcmsuYyBiL2tlcm5lbC9pcnFfd29yay5jCmluZGV4IDBlMmNkZTQuLmMzYzQ2YzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnFfd29yay5jCisrKyBiL2tlcm5lbC9pcnFfd29yay5jCkBAIC02LDkgKzYsMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAvKgogICogQW4gZW50cnkgY2FuIGJlIGluIG9uZSBvZiBmb3VyIHN0YXRlczoKZGlmZiAtLWdpdCBhL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGE4Y2U0NTAuLmJiZGZlMmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtMTA0LDYgKzEwNCwxOCBAQAogCXJldHVybiAwOwogfQogCisvKiAKKyAqIFVwZGF0ZSBjb2RlIHdoaWNoIGlzIGRlZmluaXRlbHkgbm90IGN1cnJlbnRseSBleGVjdXRpbmcuCisgKiBBcmNoaXRlY3R1cmVzIHdoaWNoIG5lZWQgaGVhdnl3ZWlnaHQgc3luY2hyb25pemF0aW9uIHRvIG1vZGlmeQorICogcnVubmluZyBjb2RlIGNhbiBvdmVycmlkZSB0aGlzIHRvIG1ha2UgdGhlIG5vbi1saXZlIHVwZGF0ZSBjYXNlCisgKiBjaGVhcGVyLgorICovCit2b2lkIF9fd2VhayBhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtX3N0YXRpYyhzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCisJCQkJCSAgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKQoreworCWFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm0oZW50cnksIHR5cGUpOwkKK30KKwogc3RhdGljIHZvaWQgX19qdW1wX2xhYmVsX3VwZGF0ZShzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSwKIAkJCQlzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksCiAJCQkJc3RydWN0IGp1bXBfZW50cnkgKnN0b3AsIGludCBlbmFibGUpCkBAIC0xMjEsMTQgKzEzMyw3IEBACiAJfQogfQogCi0vKgotICogTm90IGFsbCBhcmNocyBuZWVkIHRoaXMuCi0gKi8KLXZvaWQgX193ZWFrIGFyY2hfanVtcF9sYWJlbF90ZXh0X3Bva2VfZWFybHkoanVtcF9sYWJlbF90IGFkZHIpCi17Ci19Ci0KLXN0YXRpYyBfX2luaXQgaW50IGp1bXBfbGFiZWxfaW5pdCh2b2lkKQordm9pZCBfX2luaXQganVtcF9sYWJlbF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGp1bXBfZW50cnkgKml0ZXJfc3RhcnQgPSBfX3N0YXJ0X19fanVtcF90YWJsZTsKIAlzdHJ1Y3QganVtcF9lbnRyeSAqaXRlcl9zdG9wID0gX19zdG9wX19fanVtcF90YWJsZTsKQEAgLTEzOSwyMiArMTQ0LDIyIEBACiAJanVtcF9sYWJlbF9zb3J0X2VudHJpZXMoaXRlcl9zdGFydCwgaXRlcl9zdG9wKTsKIAogCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykgewotCQlhcmNoX2p1bXBfbGFiZWxfdGV4dF9wb2tlX2Vhcmx5KGl0ZXItPmNvZGUpOwotCQlpZiAoaXRlci0+a2V5ID09IChqdW1wX2xhYmVsX3QpKHVuc2lnbmVkIGxvbmcpa2V5KQorCQlzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKml0ZXJrOworCisJCWl0ZXJrID0gKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqKSh1bnNpZ25lZCBsb25nKWl0ZXItPmtleTsKKwkJYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoaXRlciwganVtcF9sYWJlbF9lbmFibGVkKGl0ZXJrKSA/CisJCQkJCQkgSlVNUF9MQUJFTF9FTkFCTEUgOiBKVU1QX0xBQkVMX0RJU0FCTEUpOworCQlpZiAoaXRlcmsgPT0ga2V5KQogCQkJY29udGludWU7CiAKLQkJa2V5ID0gKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqKSh1bnNpZ25lZCBsb25nKWl0ZXItPmtleTsKLQkJYXRvbWljX3NldCgma2V5LT5lbmFibGVkLCAwKTsKKwkJa2V5ID0gaXRlcms7CiAJCWtleS0+ZW50cmllcyA9IGl0ZXI7CiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIAkJa2V5LT5uZXh0ID0gTlVMTDsKICNlbmRpZgogCX0KIAlqdW1wX2xhYmVsX3VubG9jaygpOwotCi0JcmV0dXJuIDA7CiB9Ci1lYXJseV9pbml0Y2FsbChqdW1wX2xhYmVsX2luaXQpOwogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIApAQCAtMjEyLDcgKzIxNyw3IEBACiAJCXJldHVybjsKIAogCWZvciAoaXRlciA9IGl0ZXJfc3RhcnQ7IGl0ZXIgPCBpdGVyX3N0b3A7IGl0ZXIrKykKLQkJYXJjaF9qdW1wX2xhYmVsX3RleHRfcG9rZV9lYXJseShpdGVyLT5jb2RlKTsKKwkJYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoaXRlciwgSlVNUF9MQUJFTF9ESVNBQkxFKTsKIH0KIAogc3RhdGljIGludCBqdW1wX2xhYmVsX2FkZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kKQpkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCAyOTZmYmM4Li5kYzdiYzA4IDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJd2hpbGUgKGhvbGVfZW5kIDw9IGNyYXNoa19yZXMuZW5kKSB7CiAJCXVuc2lnbmVkIGxvbmcgaTsKIAotCQlpZiAoaG9sZV9lbmQgPiBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCkKKwkJaWYgKGhvbGVfZW5kID4gS0VYRUNfQ1JBU0hfQ09OVFJPTF9NRU1PUllfTElNSVQpCiAJCQlicmVhazsKIAkJaWYgKGhvbGVfZW5kID4gY3Jhc2hrX3Jlcy5lbmQpCiAJCQlicmVhazsKQEAgLTk5OSw2ICs5OTksNyBAQAogCQkJa2ltYWdlX2ZyZWUoeGNoZygma2V4ZWNfY3Jhc2hfaW1hZ2UsIE5VTEwpKTsKIAkJCXJlc3VsdCA9IGtpbWFnZV9jcmFzaF9hbGxvYygmaW1hZ2UsIGVudHJ5LAogCQkJCQkJICAgICBucl9zZWdtZW50cywgc2VnbWVudHMpOworCQkJY3Jhc2hfbWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAJCX0KIAkJaWYgKHJlc3VsdCkKIAkJCWdvdG8gb3V0OwpAQCAtMTAxNSw2ICsxMDE2LDggQEAKIAkJCQlnb3RvIG91dDsKIAkJfQogCQlraW1hZ2VfdGVybWluYXRlKGltYWdlKTsKKwkJaWYgKGZsYWdzICYgS0VYRUNfT05fQ1JBU0gpCisJCQljcmFzaF91bm1hcF9yZXNlcnZlZF9wYWdlcygpOwogCX0KIAkvKiBJbnN0YWxsIHRoZSBuZXcga2VybmVsLCBhbmQgIFVuaW5zdGFsbCB0aGUgb2xkICovCiAJaW1hZ2UgPSB4Y2hnKGRlc3RfaW1hZ2UsIGltYWdlKTsKQEAgLTEwMjYsNiArMTAyOSwxOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBBZGQgYW5kIHJlbW92ZSBwYWdlIHRhYmxlcyBmb3IgY3Jhc2hrZXJuZWwgbWVtb3J5CisgKgorICogUHJvdmlkZSBhbiBlbXB0eSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhlcmUgLS0gYXJjaGl0ZWN0dXJlCisgKiBjb2RlIG1heSBvdmVycmlkZSB0aGlzCisgKi8KK3ZvaWQgX193ZWFrIGNyYXNoX21hcF9yZXNlcnZlZF9wYWdlcyh2b2lkKQore30KKwordm9pZCBfX3dlYWsgY3Jhc2hfdW5tYXBfcmVzZXJ2ZWRfcGFnZXModm9pZCkKK3t9CisKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCiAJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKQEAgLTExMzQsMTQgKzExNDksMTYgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0Jc3RhcnQgPSByb3VuZHVwKHN0YXJ0LCBQQUdFX1NJWkUpOwotCWVuZCA9IHJvdW5kdXAoc3RhcnQgKyBuZXdfc2l6ZSwgUEFHRV9TSVpFKTsKKwlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIEtFWEVDX0NSQVNIX01FTV9BTElHTik7CisJZW5kID0gcm91bmR1cChzdGFydCArIG5ld19zaXplLCBLRVhFQ19DUkFTSF9NRU1fQUxJR04pOwogCisJY3Jhc2hfbWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAJY3Jhc2hfZnJlZV9yZXNlcnZlZF9waHlzX3JhbmdlKGVuZCwgY3Jhc2hrX3Jlcy5lbmQpOwogCiAJaWYgKChzdGFydCA9PSBlbmQpICYmIChjcmFzaGtfcmVzLnBhcmVudCAhPSBOVUxMKSkKIAkJcmVsZWFzZV9yZXNvdXJjZSgmY3Jhc2hrX3Jlcyk7CiAJY3Jhc2hrX3Jlcy5lbmQgPSBlbmQgLSAxOworCWNyYXNoX3VubWFwX3Jlc2VydmVkX3BhZ2VzKCk7CiAKIHVubG9jazoKIAltdXRleF91bmxvY2soJmtleGVjX211dGV4KTsKQEAgLTEzODAsMjQgKzEzOTcsMjMgQEAKIH0KIAogCi0KLXZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCitzdGF0aWMgdm9pZCB1cGRhdGVfdm1jb3JlaW5mb19ub3RlKHZvaWQpCiB7Ci0JdTMyICpidWY7CisJdTMyICpidWYgPSB2bWNvcmVpbmZvX25vdGU7CiAKIAlpZiAoIXZtY29yZWluZm9fc2l6ZSkKIAkJcmV0dXJuOwotCi0Jdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJDUkFTSFRJTUU9JWxkIiwgZ2V0X3NlY29uZHMoKSk7Ci0KLQlidWYgPSAodTMyICopdm1jb3JlaW5mb19ub3RlOwotCiAJYnVmID0gYXBwZW5kX2VsZl9ub3RlKGJ1ZiwgVk1DT1JFSU5GT19OT1RFX05BTUUsIDAsIHZtY29yZWluZm9fZGF0YSwKIAkJCSAgICAgIHZtY29yZWluZm9fc2l6ZSk7Ci0KIAlmaW5hbF9ub3RlKGJ1Zik7CiB9CiAKK3ZvaWQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCit7CisJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJDUkFTSFRJTUU9JWxkIiwgZ2V0X3NlY29uZHMoKSk7CisJdXBkYXRlX3ZtY29yZWluZm9fbm90ZSgpOworfQorCiB2b2lkIHZtY29yZWluZm9fYXBwZW5kX3N0cihjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CkBAIC0xNDgzLDYgKzE0OTksNyBAQAogCVZNQ09SRUlORk9fTlVNQkVSKFBHX3N3YXBjYWNoZSk7CiAKIAlhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbygpOworCXVwZGF0ZV92bWNvcmVpbmZvX25vdGUoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2tmaWZvLmMgYi9rZXJuZWwva2ZpZm8uYwppbmRleCAwMWEwNzAwLi5jNzQ0Yjg4IDEwMDY0NAotLS0gYS9rZXJuZWwva2ZpZm8uYworKysgYi9rZXJuZWwva2ZpZm8uYwpAQCAtMjAsNyArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2twcm9iZXMuYyBiL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMmYxOTNkMC4uZTVkODQ2NCAxMDA2NDQKLS0tIGEva2VybmVsL2twcm9iZXMuYworKysgYi9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAzYjA1M2MwLi40ZTMxNmUxIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0xMSwxMCArMTEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCA0YmE3Y2NjLi5iNmQyMTZhIDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL2xhdGVuY3l0b3AuYyBiL2tlcm5lbC9sYXRlbmN5dG9wLmMKaW5kZXggNGFjOGViZi4uYTQ2MmIzMSAxMDA2NDQKLS0tIGEva2VybmVsL2xhdGVuY3l0b3AuYworKysgYi9rZXJuZWwvbGF0ZW5jeXRvcC5jCkBAIC01Myw3ICs1Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcF9wcm9jLmMgYi9rZXJuZWwvbG9ja2RlcF9wcm9jLmMKaW5kZXggNzFlZGQyZi4uOTFjMzJhMCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXBfcHJvYy5jCisrKyBiL2tlcm5lbC9sb2NrZGVwX3Byb2MuYwpAQCAtMTEsNyArMTEsNyBAQAogICogQ29kZSBmb3IgL3Byb2MvbG9ja2RlcCBhbmQgL3Byb2MvbG9ja2RlcF9zdGF0czoKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDkzMzQyZDkuLjE3ODMzM2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjQ4Nyw2ICsyNDg3LDkgQEAKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KIAorCWlmICghZ2V0X21vZGluZm8oaW5mbywgImludHJlZSIpKQorCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfT09UX01PRFVMRSk7CisKIAlpZiAoZ2V0X21vZGluZm8oaW5mbywgInN0YWdpbmciKSkgewogCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfQ1JBUCk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtb2R1bGUgaXMgZnJvbSB0aGUgc3RhZ2luZyBkaXJlY3RvcnksIgpAQCAtMjg3OCw4ICsyODgxLDcgQEAKIAl9CiAKIAkvKiBUaGlzIGhhcyB0byBiZSBkb25lIG9uY2Ugd2UncmUgc3VyZSBtb2R1bGUgbmFtZSBpcyB1bmlxdWUuICovCi0JaWYgKCFtb2QtPnRhaW50cyB8fCBtb2QtPnRhaW50cyA9PSAoMVU8PFRBSU5UX0NSQVApKQotCQlkeW5hbWljX2RlYnVnX3NldHVwKGluZm8uZGVidWcsIGluZm8ubnVtX2RlYnVnKTsKKwlkeW5hbWljX2RlYnVnX3NldHVwKGluZm8uZGVidWcsIGluZm8ubnVtX2RlYnVnKTsKIAogCS8qIEZpbmQgZHVwbGljYXRlIHN5bWJvbHMgKi8KIAllcnIgPSB2ZXJpZnlfZXhwb3J0X3N5bWJvbHMobW9kKTsKQEAgLTI5MTUsOCArMjkxNyw3IEBACiAJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiAKICBkZGVidWc6Ci0JaWYgKCFtb2QtPnRhaW50cyB8fCBtb2QtPnRhaW50cyA9PSAoMVU8PFRBSU5UX0NSQVApKQotCQlkeW5hbWljX2RlYnVnX3JlbW92ZShpbmZvLmRlYnVnKTsKKwlkeW5hbWljX2RlYnVnX3JlbW92ZShpbmZvLmRlYnVnKTsKICB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCXN5bmNocm9uaXplX3NjaGVkKCk7CkBAIC0zMjU3LDYgKzMyNTgsOCBAQAogCQlidWZbYngrK10gPSAnKCc7CiAJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSkpCiAJCQlidWZbYngrK10gPSAnUCc7CisJCWVsc2UgaWYgKG1vZC0+dGFpbnRzICYgKDEgPDwgVEFJTlRfT09UX01PRFVMRSkpCisJCQlidWZbYngrK10gPSAnTyc7CiAJCWlmIChtb2QtPnRhaW50cyAmICgxIDw8IFRBSU5UX0ZPUkNFRF9NT0RVTEUpKQogCQkJYnVmW2J4KytdID0gJ0YnOwogCQlpZiAobW9kLT50YWludHMgJiAoMSA8PCBUQUlOVF9DUkFQKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jIGIva2VybmVsL211dGV4LWRlYnVnLmMKaW5kZXggNzNkYTgzYS4uN2UzNDQzZiAxMDA2NDQKLS0tIGEva2VybmVsL211dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL211dGV4LWRlYnVnLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IGQ2MDdlZDUuLjg5MDk2ZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL25vdGlmaWVyLmMgYi9rZXJuZWwvbm90aWZpZXIuYwppbmRleCA4ZDdiNDM1Li4yZDVjYzRjIDEwMDY0NAotLS0gYS9rZXJuZWwvbm90aWZpZXIuYworKysgYi9rZXJuZWwvbm90aWZpZXIuYwpAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3Byb3h5LmMgYi9rZXJuZWwvbnNwcm94eS5jCmluZGV4IDlhZWFiNGIuLmI1NzZmN2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9uc3Byb3h5LmMKKysrIGIva2VybmVsL25zcHJveHkuYwpAQCAtMTQsNyArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuYwppbmRleCBiOTE5NDFkLi5iNDUyNTk5IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFkYXRhLmMKKysrIGIva2VybmVsL3BhZGF0YS5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IGQ3YmI2OTcuLmIyNjU5MzYwIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAJeyBUQUlOVF9XQVJOLAkJCSdXJywgJyAnIH0sCiAJeyBUQUlOVF9DUkFQLAkJCSdDJywgJyAnIH0sCiAJeyBUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ELAknSScsICcgJyB9LAorCXsgVEFJTlRfT09UX01PRFVMRSwJCSdPJywgJyAnIH0sCiB9OwogCiAvKioKQEAgLTE5NCw2ICsxOTUsNyBAQAogICogICdXJyAtIFRhaW50IG9uIHdhcm5pbmcuCiAgKiAgJ0MnIC0gbW9kdWxlcyBmcm9tIGRyaXZlcnMvc3RhZ2luZyBhcmUgbG9hZGVkLgogICogICdJJyAtIFdvcmtpbmcgYXJvdW5kIHNldmVyZSBmaXJtd2FyZSBidWcuCisgKiAgJ08nIC0gT3V0LW9mLXRyZWUgbW9kdWxlIGhhcyBiZWVuIGxvYWRlZC4KICAqCiAgKglUaGUgc3RyaW5nIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IGNhbGwgdG8gcHJpbnRfdGFpbnRlZCgpLgogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFyYW1zLmMgYi9rZXJuZWwvcGFyYW1zLmMKaW5kZXggODIxNzg4OS4uNjVhYWUxMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYXJhbXMuYworKysgYi9rZXJuZWwvcGFyYW1zLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IDhjYWZlN2UuLmZhNWY3MjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwppbmRleCA0NTU2MTgyLi42OTE4NWFlIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBNYW5hZ2VtZW50IGFycmF5cyBmb3IgUE9TSVggdGltZXJzLgkgVGltZXJzIGFyZSBrZXB0IGluIHNsYWIgbWVtb3J5CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IGNlZGQ5OTguLmRlYjU0NjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0yMzksMyArMjM5LDcgQEAKIGNvbmZpZyBQTV9HRU5FUklDX0RPTUFJTlNfUlVOVElNRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFBNX1JVTlRJTUUgJiYgUE1fR0VORVJJQ19ET01BSU5TCisKK2NvbmZpZyBDUFVfUE0KKwlib29sCisJZGVwZW5kcyBvbiBTVVNQRU5EIHx8IENQVV9JRExFCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMWM1M2Y3Zi4uYjQ1MTFiNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCisrKyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwpAQCAtOSw2ICs5LDcgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggYTUyZTg4NC4uNzFmNDlmZSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC04LDYgKzgsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Fvcy5jIGIva2VybmVsL3Bvd2VyL3Fvcy5jCmluZGV4IDFjMTc5N2QuLjk5NWUzYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9xb3MuYworKysgYi9rZXJuZWwvcG93ZXIvcW9zLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyoKICAqIGxvY2tpbmcgcnVsZTogYWxsIGNoYW5nZXMgdG8gY29uc3RyYWludHMgb3Igbm90aWZpZXJzIGxpc3RzCkBAIC02OSw2ICs3MCw3IEBACiB9Owogc3RhdGljIHN0cnVjdCBwbV9xb3Nfb2JqZWN0IGNwdV9kbWFfcG1fcW9zID0gewogCS5jb25zdHJhaW50cyA9ICZjcHVfZG1hX2NvbnN0cmFpbnRzLAorCS5uYW1lID0gImNwdV9kbWFfbGF0ZW5jeSIsCiB9OwogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChuZXR3b3JrX2xhdF9ub3RpZmllcik7CkBAIC0zODYsOCArMzg4LDcgQEAKIAkJcG1fcW9zX2FkZF9yZXF1ZXN0KHJlcSwgcG1fcW9zX2NsYXNzLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CiAJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJlcTsKIAotCQlpZiAoZmlscC0+cHJpdmF0ZV9kYXRhKQotCQkJcmV0dXJuIDA7CisJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVQRVJNOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKaW5kZXggZmRkNDI2My4uNDk1M2RjMCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC0yMSw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjb3JlX29wcy5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmMKaW5kZXggNDJkZGJjNi4uNmQ4ZjUzNSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3VzZXIuYworKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCBiN2RhMTgzLi4xNDU1YTBkIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC01MzIsNiArNTMyLDkgQEAKIH0KIAogZWFybHlfcGFyYW0oImlnbm9yZV9sb2dsZXZlbCIsIGlnbm9yZV9sb2dsZXZlbF9zZXR1cCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoaWdub3JlX2xvZ2xldmVsLCBpZ25vcmVfbG9nbGV2ZWwsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2xvZ2xldmVsLCAiaWdub3JlIGxvZ2xldmVsIHNldHRpbmcsIHRvIgorCSJwcmludCBhbGwga2VybmVsIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLiIpOwogCiAvKgogICogV3JpdGUgb3V0IGNoYXJzIGZyb20gc3RhcnQgdG8gZW5kIC0gMSBpbmNsdXNpdmUKQEAgLTU5Miw5ICs1OTUsNiBAQAogCQkvKiBtdWx0aSBkaWdpdCBpbmNsdWRpbmcgdGhlIGxldmVsIGFuZCBmYWNpbGl0eSBudW1iZXIgKi8KIAkJY2hhciAqZW5kcCA9IE5VTEw7CiAKLQkJaWYgKHBbMV0gPCAnMCcgJiYgcFsxXSA+ICc5JykKLQkJCXJldHVybiAwOwotCiAJCWxldiA9IChzaW1wbGVfc3RydG91bCgmcFsxXSwgJmVuZHAsIDEwKSAmIDcpOwogCQlpZiAoZW5kcCA9PSBOVUxMIHx8IGVuZHBbMF0gIT0gJz4nKQogCQkJcmV0dXJuIDA7CkBAIC0xMTA4LDYgKzExMDgsMTAgQEAKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoIm5vX2NvbnNvbGVfc3VzcGVuZCIsIGNvbnNvbGVfc3VzcGVuZF9kaXNhYmxlKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjb25zb2xlX3N1c3BlbmQsIGNvbnNvbGVfc3VzcGVuZF9lbmFibGVkLAorCQlib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbnNvbGVfc3VzcGVuZCwgInN1c3BlbmQgY29uc29sZSBkdXJpbmcgc3VzcGVuZCIKKwkiIGFuZCBoaWJlcm5hdGUgb3BlcmF0aW9ucyIpOwogCiAvKioKICAqIHN1c3BlbmRfY29uc29sZSAtIHN1c3BlbmQgdGhlIGNvbnNvbGUgc3Vic3lzdGVtCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCA5NjFiMzg5Li43NmI4ZTc3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCXRvIHJlc29sdmUgdGltZXIgaW50ZXJydXB0IGxpdmVsb2NrcywgV2lsbGlhbSBJcndpbiwgT3JhY2xlLCAyMDA0CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhNzBkMmE1Li4yNGQwNDQ3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC04LDcgKzgsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcmFuZ2UuYyBiL2tlcm5lbC9yYW5nZS5jCmluZGV4IDM3ZmE5YjkuLjliOGFlMmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yYW5nZS5jCisrKyBiL2tlcm5lbC9yYW5nZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFJhbmdlIGFkZCBhbmQgc3VidHJhY3QKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3VwZGF0ZS5jIGIva2VybmVsL3JjdXBkYXRlLmMKaW5kZXggY2EwZDIzYi4uYzViOThlNSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXBkYXRlLmMKKysrIGIva2VybmVsL3JjdXBkYXRlLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0aW55LmMgYi9rZXJuZWwvcmN1dGlueS5jCmluZGV4IGRhNzc1YzguLjYzNmFmNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0aW55LmMKKysrIGIva2VybmVsL3JjdXRpbnkuYwpAQCAtMjIsMTMgKzIyLDEyIEBACiAgKiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgUmVhZC1Db3B5IFVwZGF0ZSBtZWNoYW5pc20gc2VlIC0KICAqCQlEb2N1bWVudGF0aW9uL1JDVQogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRpbnlfcGx1Z2luLmggYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAppbmRleCAwMmFhNzEzLi4yYjA0ODRhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1dGlueV9wbHVnaW4uaApAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IGUyMzRlYjkuLjZiNzZkODEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25taS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3JlbGF5LmMgYi9rZXJuZWwvcmVsYXkuYwppbmRleCA4NTllYTVhLi4yMjZmYWRlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVsYXkuYworKysgYi9rZXJuZWwvcmVsYXkuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCBjOGRjMjQ5Li43NjQwYjNhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtNyw3ICs3LDcgQEAKICAqIEFyYml0cmFyeSByZXNvdXJjZSBtYW5hZ2VtZW50LgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IGEyZTdlNzIuLjhlYWZkMWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMTgsNyArMTgsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXgtdGVzdGVyLmMgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwppbmRleCA1YzljY2QzLi4zZDlmMzFjIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYworKysgYi9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNWU4ZDljYy4uZjlkODQ4MiAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgU2VlIERvY3VtZW50YXRpb24vcnQtbXV0ZXgtZGVzaWduLnR4dCBmb3IgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCmRpZmYgLS1naXQgYS9rZXJuZWwvcndzZW0uYyBiL2tlcm5lbC9yd3NlbS5jCmluZGV4IDlmNDhmM2QuLmIxNTJmNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yd3NlbS5jCisrKyBiL2tlcm5lbC9yd3NlbS5jCkBAIC03LDcgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBkODdjNmU1Li4wZTkzNDRhIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNzA4Nyw4ICs3MDg3LDYgQEAKIAogX19zZXR1cCgiaXNvbGNwdXM9IiwgaXNvbGF0ZWRfY3B1X3NldHVwKTsKIAotI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDE2Ci0KICNpZmRlZiBDT05GSUdfTlVNQQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9jbG9jay5jIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKaW5kZXggOWQ4YWYwYi4uYzY4NWUzMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2Nsb2NrLmMKKysrIGIva2VybmVsL3NjaGVkX2Nsb2NrLmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zZW1hcGhvcmUuYyBiL2tlcm5lbC9zZW1hcGhvcmUuYwppbmRleCBkODMxODQxLi42MDYzNmE0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2VtYXBob3JlLmMKKysrIGIva2VybmVsL3NlbWFwaG9yZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBkMjUyYmUyLi5iM2Y3OGQwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NtcC5jIGIva2VybmVsL3NtcC5jCmluZGV4IGZiNjdkZmEuLmRiMTk3ZDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zbXAuYworKysgYi9rZXJuZWwvc21wLmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggZmNhODJjMy4uMmM3MWQ5MSAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKglSZW1vdGUgc29mdGlycSBpbmZyYXN0cnVjdHVyZSBpcyBieSBKZW5zIEF4Ym9lLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC9zcGlubG9jay5jIGIva2VybmVsL3NwaW5sb2NrLmMKaW5kZXggYmU2NTE3Zi4uODRjN2Q5NiAxMDA2NDQKLS0tIGEva2VybmVsL3NwaW5sb2NrLmMKKysrIGIva2VybmVsL3NwaW5sb2NrLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBJZiBsb2NrZGVwIGlzIGVuYWJsZWQgdGhlbiB3ZSB1c2UgdGhlIG5vbi1wcmVlbXB0aW9uIHNwaW4tb3BzCmRpZmYgLS1naXQgYS9rZXJuZWwvc3JjdS5jIGIva2VybmVsL3NyY3UuYwppbmRleCA3M2NlMjNmLi4wZmViZjYxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3JjdS5jCisrKyBiL2tlcm5lbC9zcmN1LmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3N0YWNrdHJhY2UuYyBiL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZDIwYzY5OC4uMDBmZTU1YyAxMDA2NDQKLS0tIGEva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC03LDcgKzcsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N0b3BfbWFjaGluZS5jIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCmluZGV4IGJhNTA3MGMuLjJmMTk0ZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYworKysgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CkBAIC00MSw2ICs0MSw3IEBACiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9zdG9wcGVyLCBjcHVfc3RvcHBlcik7CitzdGF0aWMgYm9vbCBzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAogc3RhdGljIHZvaWQgY3B1X3N0b3BfaW5pdF9kb25lKHN0cnVjdCBjcHVfc3RvcF9kb25lICpkb25lLCB1bnNpZ25lZCBpbnQgbnJfdG9kbykKIHsKQEAgLTM4Niw2ICszODcsOCBAQAogCWNwdV9zdG9wX2NwdV9jYWxsYmFjaygmY3B1X3N0b3BfY3B1X25vdGlmaWVyLCBDUFVfT05MSU5FLCBiY3B1KTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdV9zdG9wX2NwdV9ub3RpZmllcik7CiAKKwlzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQgPSB0cnVlOworCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9pbml0Y2FsbChjcHVfc3RvcF9pbml0KTsKQEAgLTQ4NSw2ICs0ODgsMjUgQEAKIAkJCQkJICAgIC5udW1fdGhyZWFkcyA9IG51bV9vbmxpbmVfY3B1cygpLAogCQkJCQkgICAgLmFjdGl2ZV9jcHVzID0gY3B1cyB9OwogCisJaWYgKCFzdG9wX21hY2hpbmVfaW5pdGlhbGl6ZWQpIHsKKwkJLyoKKwkJICogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN0b3BfbWFjaGluZSgpIGlzIGNhbGxlZAorCQkgKiBlYXJseSBpbiBib290IGJlZm9yZSBzdG9wX21hY2hpbmUoKSBoYXMgYmVlbgorCQkgKiBpbml0aWFsaXplZC4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCByZXQ7CisKKwkJV0FSTl9PTl9PTkNFKHNtZGF0YS5udW1fdGhyZWFkcyAhPSAxKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWhhcmRfaXJxX2Rpc2FibGUoKTsKKwkJcmV0ID0gKCpmbikoZGF0YSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlyZXR1cm4gcmV0OworCX0KKwogCS8qIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgc3RvcCBhbGwgb25saW5lIGNwdXMuICovCiAJc2V0X3N0YXRlKCZzbWRhdGEsIFNUT1BNQUNISU5FX1BSRVBBUkUpOwogCXJldHVybiBzdG9wX2NwdXMoY3B1X29ubGluZV9tYXNrLCBzdG9wX21hY2hpbmVfY3B1X3N0b3AsICZzbWRhdGEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDU4NDU5NTAuLjQ4MTYxMWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xMjg2LDYgKzEyODcsNyBAQAogCQltZW1zZXQodS0+bm9kZW5hbWUgKyBsZW4sIDAsIHNpemVvZih1LT5ub2RlbmFtZSkgLSBsZW4pOwogCQllcnJubyA9IDA7CiAJfQorCXV0c19wcm9jX25vdGlmeShVVFNfUFJPQ19IT1NUTkFNRSk7CiAJdXBfd3JpdGUoJnV0c19zZW0pOwogCXJldHVybiBlcnJubzsKIH0KQEAgLTEzMzYsNiArMTMzOCw3IEBACiAJCW1lbXNldCh1LT5kb21haW5uYW1lICsgbGVuLCAwLCBzaXplb2YodS0+ZG9tYWlubmFtZSkgLSBsZW4pOwogCQllcnJubyA9IDA7CiAJfQorCXV0c19wcm9jX25vdGlmeShVVFNfUFJPQ19ET01BSU5OQU1FKTsKIAl1cF93cml0ZSgmdXRzX3NlbSk7CiAJcmV0dXJuIGVycm5vOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IGE5YTVkZTAuLjQ3YmZhMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTE0NSw2ICsxNDUsMTAgQEAKIGNvbmRfc3lzY2FsbChzeXNfaW9fY2FuY2VsKTsKIGNvbmRfc3lzY2FsbChzeXNfaW9fZ2V0ZXZlbnRzKTsKIGNvbmRfc3lzY2FsbChzeXNfc3lzbG9nKTsKK2NvbmRfc3lzY2FsbChzeXNfcHJvY2Vzc192bV9yZWFkdik7Citjb25kX3N5c2NhbGwoc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KTsKK2NvbmRfc3lzY2FsbChjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpOworY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfcHJvY2Vzc192bV93cml0ZXYpOwogCiAvKiBhcmNoLXNwZWNpZmljIHdlYWsgc3lzY2FsbCBlbnRyaWVzICovCiBjb25kX3N5c2NhbGwoc3lzX3BjaWNvbmZpZ19yZWFkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCAyZDJlY2RjLi5hZTI3MTk2IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CiAjaW5jbHVkZSA8bGludXgvb29tLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMTM0LDYgKzEzNSw3IEBACiBzdGF0aWMgaW50IG1pbl9wZXJjcHVfcGFnZWxpc3RfZnJhY3QgPSA4OwogCiBzdGF0aWMgaW50IG5ncm91cHNfbWF4ID0gTkdST1VQU19NQVg7CitzdGF0aWMgY29uc3QgaW50IGNhcF9sYXN0X2NhcCA9IENBUF9MQVNUX0NBUDsKIAogI2lmZGVmIENPTkZJR19JTk9USUZZX1VTRVIKICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CkBAIC0xNTEsMTQgKzE1Myw2IEBACiBleHRlcm4gaW50IHVuYWxpZ25lZF9lbmFibGVkOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUzM5MAotI2lmZGVmIENPTkZJR19NQVRIRU1VCi1leHRlcm4gaW50IHN5c2N0bF9pZWVlX2VtdWxhdGlvbl93YXJuaW5nczsKLSNlbmRpZgotZXh0ZXJuIGludCBzeXNjdGxfdXNlcnByb2Nlc3NfZGVidWc7Ci1leHRlcm4gaW50IHNwaW5fcmV0cnk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19JQTY0CiBleHRlcm4gaW50IG5vX3VuYWxpZ25lZF93YXJuaW5nOwogZXh0ZXJuIGludCB1bmFsaWduZWRfZHVtcF9zdGFjazsKQEAgLTc0MCw2ICs3MzQsMTMgQEAKIAkJLm1vZGUJCT0gMDQ0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJjYXBfbGFzdF9jYXAiLAorCQkuZGF0YQkJPSAodm9pZCAqKSZjYXBfbGFzdF9jYXAsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCiAjaWYgZGVmaW5lZChDT05GSUdfTE9DS1VQX0RFVEVDVE9SKQogCXsKIAkJLnByb2NuYW1lICAgICAgID0gIndhdGNoZG9nIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGQ3NzYwNjIuLjczZTQxNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMjcsNyArMjcsNyBAQAogICoJd2l0aCBuYW5vc2Vjb25kIGFjY3VyYWN5CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9wb3NpeC1jbG9jay5jIGIva2VybmVsL3RpbWUvcG9zaXgtY2xvY2suYwppbmRleCBjMzQwY2E2Li5jZTAzM2M3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9wb3NpeC1jbG9jay5jCisrKyBiL2tlcm5lbC90aW1lL3Bvc2l4LWNsb2NrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeC1jbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggOGNmZjM2MS4uZGJhYTYyNCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCmluZGV4IDdjOTEwYTUuLjE2ZmMzNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCAwNzdkODUzLi45MDBiNDA5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwppbmRleCBlZTdiNWEwLi5jYjY1NDU0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIGZvciBNT0RVTEVfTkFNRV9MRU4gdmlhIEtTWU1fU1lNQk9MX0xFTiAqLwogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3VwLmMgYi9rZXJuZWwvdXAuYwppbmRleCAxZmYyN2EyLi5jNTRjNzVlIDEwMDY0NAotLS0gYS9rZXJuZWwvdXAuYworKysgYi9rZXJuZWwvdXAuYwpAQCAtNCw3ICs0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiBpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGludCBjcHUsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci1yZXR1cm4tbm90aWZpZXIuYyBiL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCmluZGV4IDkyY2I3MDYuLjE3NDRiYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCisrKyBiL2tlcm5lbC91c2VyLXJldHVybi1ub3RpZmllci5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzZXItcmV0dXJuLW5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBobGlzdF9oZWFkLCByZXR1cm5fbm90aWZpZXJfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IDllMDNlOWMuLjcxZGQyMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCmluZGV4IDlkYTI4OWMuLjNiOTA2ZTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC01LDcgKzUsNyBAQAogICogIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lLmMgYi9rZXJuZWwvdXRzbmFtZS5jCmluZGV4IGJmZjEzMWIuLjQwNWNhZjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lLmMKKysrIGIva2VybmVsL3V0c25hbWUuYwpAQCAtOSw3ICs5LDcgQEAKICAqICBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91dHMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCmluZGV4IGEyY2Q3N2UuLjYzZGEzOGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCisrKyBiL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jCkBAIC05LDEwICs5LDExIEBACiAgKiAgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogc3RhdGljIHZvaWQgKmdldF91dHMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlKQogewpAQCAtNTEsMTIgKzUyLDE5IEBACiAJdXRzX3RhYmxlLmRhdGEgPSBnZXRfdXRzKHRhYmxlLCB3cml0ZSk7CiAJciA9IHByb2NfZG9zdHJpbmcoJnV0c190YWJsZSx3cml0ZSxidWZmZXIsbGVucCwgcHBvcyk7CiAJcHV0X3V0cyh0YWJsZSwgd3JpdGUsIHV0c190YWJsZS5kYXRhKTsKKworCWlmICh3cml0ZSkKKwkJcHJvY19zeXNfcG9sbF9ub3RpZnkodGFibGUtPnBvbGwpOworCiAJcmV0dXJuIHI7CiB9CiAjZWxzZQogI2RlZmluZSBwcm9jX2RvX3V0c19zdHJpbmcgTlVMTAogI2VuZGlmCiAKK3N0YXRpYyBERUZJTkVfQ1RMX1RBQkxFX1BPTEwoaG9zdG5hbWVfcG9sbCk7CitzdGF0aWMgREVGSU5FX0NUTF9UQUJMRV9QT0xMKGRvbWFpbm5hbWVfcG9sbCk7CisKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHV0c19rZXJuX3RhYmxlW10gPSB7CiAJewogCQkucHJvY25hbWUJPSAib3N0eXBlIiwKQEAgLTg1LDYgKzkzLDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW5pdF91dHNfbnMubmFtZS5ub2RlbmFtZSksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvX3V0c19zdHJpbmcsCisJCS5wb2xsCQk9ICZob3N0bmFtZV9wb2xsLAogCX0sCiAJewogCQkucHJvY25hbWUJPSAiZG9tYWlubmFtZSIsCkBAIC05Miw2ICsxMDEsNyBAQAogCQkubWF4bGVuCQk9IHNpemVvZihpbml0X3V0c19ucy5uYW1lLmRvbWFpbm5hbWUpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb191dHNfc3RyaW5nLAorCQkucG9sbAkJPSAmZG9tYWlubmFtZV9wb2xsLAogCX0sCiAJe30KIH07CkBAIC0xMDUsNiArMTE1LDE5IEBACiAJe30KIH07CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKKy8qCisgKiBOb3RpZnkgdXNlcnNwYWNlIGFib3V0IGEgY2hhbmdlIGluIGEgY2VydGFpbiBlbnRyeSBvZiB1dHNfa2Vybl90YWJsZSwKKyAqIGlkZW50aWZpZWQgYnkgdGhlIHBhcmFtZXRlciBwcm9jLgorICovCit2b2lkIHV0c19wcm9jX25vdGlmeShlbnVtIHV0c19wcm9jIHByb2MpCit7CisJc3RydWN0IGN0bF90YWJsZSAqdGFibGUgPSAmdXRzX2tlcm5fdGFibGVbcHJvY107CisKKwlwcm9jX3N5c19wb2xsX25vdGlmeSh0YWJsZS0+cG9sbCk7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgdXRzbmFtZV9zeXNjdGxfaW5pdCh2b2lkKQogewogCXJlZ2lzdGVyX3N5c2N0bF90YWJsZSh1dHNfcm9vdF90YWJsZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2FpdC5jIGIva2VybmVsL3dhaXQuYwppbmRleCBmNDVlYThkLi4yNmZhNzc5IDEwMDY0NAotLS0gYS9rZXJuZWwvd2FpdC5jCisrKyBiL2tlcm5lbC93YWl0LmMKQEAgLTQsNyArNCw3IEBACiAgKiAoQykgMjAwNCBXaWxsaWFtIElyd2luLCBPcmFjbGUKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3dhdGNoZG9nLmMgYi9rZXJuZWwvd2F0Y2hkb2cuYwppbmRleCBkNjgwMzgxLi4xZDdiY2E3IDEwMDY0NAotLS0gYS9rZXJuZWwvd2F0Y2hkb2cuYworKysgYi9rZXJuZWwvd2F0Y2hkb2cuYwpAQCAtNDgxLDYgKzQ4MSw4IEBACiAJfQogfQogCisvKiBzeXNjdGwgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIHZvaWQgd2F0Y2hkb2dfZW5hYmxlX2FsbF9jcHVzKHZvaWQpCiB7CiAJaW50IGNwdTsKQEAgLTUxMCw4ICs1MTIsNiBAQAogfQogCiAKLS8qIHN5c2N0bCBmdW5jdGlvbnMgKi8KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCiAvKgogICogcHJvYyBoYW5kbGVyIGZvciAvcHJvYy9zeXMva2VybmVsL25taV93YXRjaGRvZyx3YXRjaGRvZ190aHJlc2gKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDE3ODNhYWIuLjQyZmE5YWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIFBsZWFzZSByZWFkIERvY3VtZW50YXRpb24vd29ya3F1ZXVlLnR4dCBmb3IgZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDc1MzMwYmQuLjgyOTI4ZjUgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0yNDgsOCArMjQ4LDkgQEAKIAkgIHRvIGRldGVybWluZSB3aGVuIGEgdGFzayBoYXMgYmVjb21lIG5vbi1yZXNwb25zaXZlIGFuZCBzaG91bGQKIAkgIGJlIGNvbnNpZGVyZWQgaHVuZy4KIAotCSAgSXQgY2FuIGJlIGFkanVzdGVkIGF0IHJ1bnRpbWUgdmlhIHRoZSBrZXJuZWwuaHVuZ190YXNrX3RpbWVvdXQKLQkgIHN5c2N0bCBvciBieSB3cml0aW5nIGEgdmFsdWUgdG8gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dC4KKwkgIEl0IGNhbiBiZSBhZGp1c3RlZCBhdCBydW50aW1lIHZpYSB0aGUga2VybmVsLmh1bmdfdGFza190aW1lb3V0X3NlY3MKKwkgIHN5c2N0bCBvciBieSB3cml0aW5nIGEgdmFsdWUgdG8KKwkgIC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vjcy4KIAogCSAgQSB0aW1lb3V0IG9mIDAgZGlzYWJsZXMgdGhlIGNoZWNrLiAgVGhlIGRlZmF1bHQgaXMgdHdvIG1pbnV0ZXMuCiAJICBLZWVwaW5nIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBmaW5lIGluIG1vc3QgY2FzZXMuCkBAIC0xMDcwLDYgKzEwNzEsMTcgQEAKIAkgIE9ubHkgd29ya3Mgd2l0aCBkcml2ZXJzIHRoYXQgdXNlIHRoZSBnZW5lcmljIHRpbWVvdXQgaGFuZGxpbmcsCiAJICBmb3Igb3RoZXJzIGl0IHdvbnQgZG8gYW55dGhpbmcuCiAKK2NvbmZpZyBGQUlMX01NQ19SRVFVRVNUCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIE1NQyBJTyIKKwlzZWxlY3QgREVCVUdfRlMKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTiAmJiBNTUMKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBNTUMgSU8uCisJICBUaGlzIHdpbGwgbWFrZSB0aGUgbW1jIGNvcmUgcmV0dXJuIGRhdGEgZXJyb3JzLiBUaGlzIGlzCisJICB1c2VmdWwgdG8gdGVzdCB0aGUgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIG1tYyBibG9jayBkZXZpY2UKKwkgIGFuZCB0byB0ZXN0IGhvdyB0aGUgbW1jIGhvc3QgZHJpdmVyIGhhbmRsZXMgcmV0cmllcyBmcm9tCisJICB0aGUgYmxvY2sgZGV2aWNlLgorCiBjb25maWcgRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAJYm9vbCAiRGVidWdmcyBlbnRyaWVzIGZvciBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0aWVzIgogCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OICYmIFNZU0ZTICYmIERFQlVHX0ZTCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggMmY0NDEyZS4uMGQ0YTEyNyAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtNDE5LDcgKzQxOSw3IEBACiB7CiAJaW50IGMsIG9sZF9jLCB0b3RhbGRpZ2l0cywgbmRpZ2l0cywgbmNodW5rcywgbmJpdHM7CiAJdTMyIGNodW5rOwotCWNvbnN0IGNoYXIgX191c2VyICp1YnVmID0gYnVmOworCWNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKnVidWYgPSAoY29uc3QgY2hhciBfX3VzZXIgX19mb3JjZSAqKWJ1ZjsKIAogCWJpdG1hcF96ZXJvKG1hc2twLCBubWFza2JpdHMpOwogCkBAIC01MDQsNyArNTA0LDkgQEAKIHsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWJ1ZiwgdWxlbikpCiAJCXJldHVybiAtRUZBVUxUOwotCXJldHVybiBfX2JpdG1hcF9wYXJzZSgoY29uc3QgY2hhciAqKXVidWYsIHVsZW4sIDEsIG1hc2twLCBubWFza2JpdHMpOworCXJldHVybiBfX2JpdG1hcF9wYXJzZSgoY29uc3QgY2hhciBfX2ZvcmNlICopdWJ1ZiwKKwkJCQl1bGVuLCAxLCBtYXNrcCwgbm1hc2tiaXRzKTsKKwogfQogRVhQT1JUX1NZTUJPTChiaXRtYXBfcGFyc2VfdXNlcik7CiAKQEAgLTU5NCw3ICs1OTYsNyBAQAogewogCXVuc2lnbmVkIGEsIGI7CiAJaW50IGMsIG9sZF9jLCB0b3RhbGRpZ2l0czsKLQljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiA9IGJ1ZjsKKwljb25zdCBjaGFyIF9fdXNlciBfX2ZvcmNlICp1YnVmID0gKGNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKilidWY7CiAJaW50IGV4cF9kaWdpdCwgaW5fcmFuZ2U7CiAKIAl0b3RhbGRpZ2l0cyA9IGMgPSAwOwpAQCAtNjk0LDcgKzY5Niw3IEBACiB7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVidWYsIHVsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gX19iaXRtYXBfcGFyc2VsaXN0KChjb25zdCBjaGFyICopdWJ1ZiwKKwlyZXR1cm4gX19iaXRtYXBfcGFyc2VsaXN0KChjb25zdCBjaGFyIF9fZm9yY2UgKil1YnVmLAogCQkJCQl1bGVuLCAxLCBtYXNrcCwgbm1hc2tiaXRzKTsKIH0KIEVYUE9SVF9TWU1CT0woYml0bWFwX3BhcnNlbGlzdF91c2VyKTsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCBkYjA3YmZkLi43NGM2YzdmIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTYyLDYgKzYzLDggQEAKICNlbmRpZgogfTsKIAordHlwZWRlZiBib29sICgqbWF0Y2hfZm4pKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKiwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqKTsKKwogc3RydWN0IGhhc2hfYnVja2V0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtMjQwLDE4ICsyNDMsMzcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWNrZXQtPmxvY2ssIF9fZmxhZ3MpOwogfQogCitzdGF0aWMgYm9vbCBleGFjdF9tYXRjaChzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICphLCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpiKQoreworCXJldHVybiAoKGEtPmRldl9hZGRyID09IGEtPmRldl9hZGRyKSAmJgorCQkoYS0+ZGV2ID09IGItPmRldikpID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjb250YWluaW5nX21hdGNoKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmEsCisJCQkgICAgIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmIpCit7CisJaWYgKGEtPmRldiAhPSBiLT5kZXYpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgoYi0+ZGV2X2FkZHIgPD0gYS0+ZGV2X2FkZHIpICYmCisJICAgICgoYi0+ZGV2X2FkZHIgKyBiLT5zaXplKSA+PSAoYS0+ZGV2X2FkZHIgKyBhLT5zaXplKSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogU2VhcmNoIGEgZ2l2ZW4gZW50cnkgaW4gdGhlIGhhc2ggYnVja2V0IGxpc3QKICAqLwotc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmhhc2hfYnVja2V0X2ZpbmQoc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQsCi0JCQkJCQlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYpCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqX19oYXNoX2J1Y2tldF9maW5kKHN0cnVjdCBoYXNoX2J1Y2tldCAqYnVja2V0LAorCQkJCQkJICBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYsCisJCQkJCQkgIG1hdGNoX2ZuIG1hdGNoKQogewogCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCAqcmV0ID0gTlVMTDsKIAlpbnQgbWF0Y2hlcyA9IDAsIG1hdGNoX2x2bCwgbGFzdF9sdmwgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgewotCQlpZiAoKGVudHJ5LT5kZXZfYWRkciAhPSByZWYtPmRldl9hZGRyKSB8fAotCQkgICAgKGVudHJ5LT5kZXYgIT0gcmVmLT5kZXYpKQorCQlpZiAoIW1hdGNoKHJlZiwgZW50cnkpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTI5Myw2ICszMTUsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqYnVja2V0X2ZpbmRfZXhhY3Qoc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQsCisJCQkJCQkgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmKQoreworCXJldHVybiBfX2hhc2hfYnVja2V0X2ZpbmQoYnVja2V0LCByZWYsIGV4YWN0X21hdGNoKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmJ1Y2tldF9maW5kX2NvbnRhaW4oc3RydWN0IGhhc2hfYnVja2V0ICoqYnVja2V0LAorCQkJCQkJICAgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmLAorCQkJCQkJICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisKKwl1bnNpZ25lZCBpbnQgbWF4X3JhbmdlID0gZG1hX2dldF9tYXhfc2VnX3NpemUocmVmLT5kZXYpOworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCBpbmRleCA9ICpyZWY7CisJdW5zaWduZWQgaW50IHJhbmdlID0gMDsKKworCXdoaWxlIChyYW5nZSA8PSBtYXhfcmFuZ2UpIHsKKwkJZW50cnkgPSBfX2hhc2hfYnVja2V0X2ZpbmQoKmJ1Y2tldCwgJmluZGV4LCBjb250YWluaW5nX21hdGNoKTsKKworCQlpZiAoZW50cnkpCisJCQlyZXR1cm4gZW50cnk7CisKKwkJLyoKKwkJICogTm90aGluZyBmb3VuZCwgZ28gYmFjayBhIGhhc2ggYnVja2V0CisJCSAqLworCQlwdXRfaGFzaF9idWNrZXQoKmJ1Y2tldCwgZmxhZ3MpOworCQlyYW5nZSAgICAgICAgICArPSAoMSA8PCBIQVNIX0ZOX1NISUZUKTsKKwkJaW5kZXguZGV2X2FkZHIgLT0gKDEgPDwgSEFTSF9GTl9TSElGVCk7CisJCSpidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQoJmluZGV4LCBmbGFncyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qCiAgKiBBZGQgYW4gZW50cnkgdG8gYSBoYXNoIGJ1Y2tldAogICovCkBAIC04MDIsNyArODU3LDcgQEAKIAl9CiAKIAlidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQocmVmLCAmZmxhZ3MpOwotCWVudHJ5ID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsIHJlZik7CisJZW50cnkgPSBidWNrZXRfZmluZF9leGFjdChidWNrZXQsIHJlZik7CiAKIAlpZiAoIWVudHJ5KSB7CiAJCWVycl9wcmludGsocmVmLT5kZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHRyaWVzICIKQEAgLTkwMiw3ICs5NTcsNyBAQAogCiAJYnVja2V0ID0gZ2V0X2hhc2hfYnVja2V0KHJlZiwgJmZsYWdzKTsKIAotCWVudHJ5ID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsIHJlZik7CisJZW50cnkgPSBidWNrZXRfZmluZF9jb250YWluKCZidWNrZXQsIHJlZiwgJmZsYWdzKTsKIAogCWlmICghZW50cnkpIHsKIAkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHRyaWVzICIKQEAgLTEwNjAsNyArMTExNSw3IEBACiAJaW50IG1hcHBlZF9lbnRzOwogCiAJYnVja2V0ICAgICAgID0gZ2V0X2hhc2hfYnVja2V0KHJlZiwgJmZsYWdzKTsKLQllbnRyeSAgICAgICAgPSBoYXNoX2J1Y2tldF9maW5kKGJ1Y2tldCwgcmVmKTsKKwllbnRyeSAgICAgICAgPSBidWNrZXRfZmluZF9leGFjdChidWNrZXQsIHJlZik7CiAJbWFwcGVkX2VudHMgID0gMDsKIAogCWlmIChlbnRyeSkKZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCBmMTkzYjc3Li40Zjc1NTQwIDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBzZXR1cF9mYXVsdF9hdHRyKCkgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHZhcmlvdXMgX19zZXR1cCBoYW5kbGVycywgc28gaXQKICAqIHJldHVybnMgMCBvbiBlcnJvciwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgX19zZXR1cCBoYW5kbGVycyBkby4KICAqLwotaW50IF9faW5pdCBzZXR1cF9mYXVsdF9hdHRyKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLCBjaGFyICpzdHIpCitpbnQgc2V0dXBfZmF1bHRfYXR0cihzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwgY2hhciAqc3RyKQogewogCXVuc2lnbmVkIGxvbmcgcHJvYmFiaWxpdHk7CiAJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKQEAgLTM2LDYgKzM2LDcgQEAKIAogCXJldHVybiAxOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0dXBfZmF1bHRfYXR0cik7CiAKIHN0YXRpYyB2b2lkIGZhaWxfZHVtcChzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKIHsKQEAgLTEzMCw2ICsxMzEsNyBAQAogCiAJcmV0dXJuIHRydWU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzaG91bGRfZmFpbCk7CiAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAKQEAgLTI0Myw1ICsyNDUsNiBAQAogCiAJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKTsKIAogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCA1YWNmOWJiLi5lZDA1NWIyIDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC03NjcsOCArNzY3LDggQEAKICAqIEBzdGFydGluZ19pZDogaWQgdG8gc3RhcnQgc2VhcmNoIGF0CiAgKiBAcF9pZDoJcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGhhbmRsZQogICoKLSAqIEFsbG9jYXRlIG5ldyBJRCBhYm92ZSBvciBlcXVhbCB0byBAaWRhLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoCi0gKiBhbnkgcmVxdWlyZWQgbG9ja3MuCisgKiBBbGxvY2F0ZSBuZXcgSUQgYWJvdmUgb3IgZXF1YWwgdG8gQHN0YXJ0aW5nX2lkLiAgSXQgc2hvdWxkIGJlIGNhbGxlZAorICogd2l0aCBhbnkgcmVxdWlyZWQgbG9ja3MuCiAgKgogICogSWYgbWVtb3J5IGlzIHJlcXVpcmVkLCBpdCB3aWxsIHJldHVybiAlLUVBR0FJTiwgeW91IHNob3VsZCB1bmxvY2sKICAqIGFuZCBnbyBiYWNrIHRvIHRoZSBpZGFfcHJlX2dldCgpIGNhbGwuICBJZiB0aGUgaWRhIGlzIGZ1bGwsIGl0IHdpbGwKQEAgLTk0NCw2ICs5NDQsNyBAQAogewogCWludCByZXQsIGlkOwogCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUJVR19PTigoaW50KXN0YXJ0IDwgMCk7CiAJQlVHX09OKChpbnQpZW5kIDwgMCk7CkBAIC05NTksNyArOTYwLDcgQEAKIAlpZiAoIWlkYV9wcmVfZ2V0KGlkYSwgZ2ZwX21hc2spKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiAJcmV0ID0gaWRhX2dldF9uZXdfYWJvdmUoaWRhLCBzdGFydCwgJmlkKTsKIAlpZiAoIXJldCkgewogCQlpZiAoaWQgPiBtYXgpIHsKQEAgLTk2OSw3ICs5NzAsNyBAQAogCQkJcmV0ID0gaWQ7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiAKIAlpZiAodW5saWtlbHkocmV0ID09IC1FQUdBSU4pKQogCQlnb3RvIGFnYWluOwpAQCAtOTg1LDEwICs5ODYsMTIgQEAKICAqLwogdm9pZCBpZGFfc2ltcGxlX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBpZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJQlVHX09OKChpbnQpaWQgPCAwKTsKLQlzcGluX2xvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNpbXBsZV9pZGFfbG9jaywgZmxhZ3MpOwogCWlkYV9yZW1vdmUoaWRhLCBpZCk7Ci0Jc3Bpbl91bmxvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfcmVtb3ZlKTsKIApkaWZmIC0tZ2l0IGEvbGliL2tzdHJ0b3guYyBiL2xpYi9rc3RydG94LmMKaW5kZXggNWUwNjY3NS4uN2E5NGM4ZiAxMDA2NDQKLS0tIGEvbGliL2tzdHJ0b3guYworKysgYi9saWIva3N0cnRveC5jCkBAIC0xOCwyNiArMTgsNDAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAia3N0cnRveC5oIgogCi1zdGF0aWMgaW50IF9rc3RydG91bGwoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQorY29uc3QgY2hhciAqX3BhcnNlX2ludGVnZXJfZml4dXBfcmFkaXgoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50ICpiYXNlKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyBhY2M7Ci0JaW50IG9rOwotCi0JaWYgKGJhc2UgPT0gMCkgeworCWlmICgqYmFzZSA9PSAwKSB7CiAJCWlmIChzWzBdID09ICcwJykgewogCQkJaWYgKF90b2xvd2VyKHNbMV0pID09ICd4JyAmJiBpc3hkaWdpdChzWzJdKSkKLQkJCQliYXNlID0gMTY7CisJCQkJKmJhc2UgPSAxNjsKIAkJCWVsc2UKLQkJCQliYXNlID0gODsKKwkJCQkqYmFzZSA9IDg7CiAJCX0gZWxzZQotCQkJYmFzZSA9IDEwOworCQkJKmJhc2UgPSAxMDsKIAl9Ci0JaWYgKGJhc2UgPT0gMTYgJiYgc1swXSA9PSAnMCcgJiYgX3RvbG93ZXIoc1sxXSkgPT0gJ3gnKQorCWlmICgqYmFzZSA9PSAxNiAmJiBzWzBdID09ICcwJyAmJiBfdG9sb3dlcihzWzFdKSA9PSAneCcpCiAJCXMgKz0gMjsKKwlyZXR1cm4gczsKK30KIAotCWFjYyA9IDA7Ci0Jb2sgPSAwOworLyoKKyAqIENvbnZlcnQgbm9uLW5lZ2F0aXZlIGludGVnZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGV4cGxpY2l0bHkgZ2l2ZW4gcmFkaXgKKyAqIHRvIGFuIGludGVnZXIuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29uc3VtZWQgbWF5YmUgb3ItZWQgd2l0aCBvdmVyZmxvdyBiaXQuCisgKiBJZiBvdmVyZmxvdyBvY2N1cnMsIHJlc3VsdCBpbnRlZ2VyIChpbmNvcnJlY3QpIGlzIHN0aWxsIHJldHVybmVkLgorICoKKyAqIERvbid0IHlvdSBkYXJlIHVzZSB0aGlzIGZ1bmN0aW9uLgorICovCit1bnNpZ25lZCBpbnQgX3BhcnNlX2ludGVnZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQoreworCXVuc2lnbmVkIGludCBydjsKKwlpbnQgb3ZlcmZsb3c7CisKKwkqcmVzID0gMDsKKwlydiA9IDA7CisJb3ZlcmZsb3cgPSAwOwogCXdoaWxlICgqcykgewogCQl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00NSwyMyArNTksNDAgQEAKIAkJCXZhbCA9ICpzIC0gJzAnOwogCQllbHNlIGlmICgnYScgPD0gX3RvbG93ZXIoKnMpICYmIF90b2xvd2VyKCpzKSA8PSAnZicpCiAJCQl2YWwgPSBfdG9sb3dlcigqcykgLSAnYScgKyAxMDsKLQkJZWxzZSBpZiAoKnMgPT0gJ1xuJyAmJiAqKHMgKyAxKSA9PSAnXDAnKQotCQkJYnJlYWs7CiAJCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJaWYgKHZhbCA+PSBiYXNlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChhY2MgPiBkaXZfdTY0KFVMTE9OR19NQVggLSB2YWwsIGJhc2UpKQotCQkJcmV0dXJuIC1FUkFOR0U7Ci0JCWFjYyA9IGFjYyAqIGJhc2UgKyB2YWw7Ci0JCW9rID0gMTsKLQorCQkJYnJlYWs7CisJCWlmICgqcmVzID4gZGl2X3U2NChVTExPTkdfTUFYIC0gdmFsLCBiYXNlKSkKKwkJCW92ZXJmbG93ID0gMTsKKwkJKnJlcyA9ICpyZXMgKiBiYXNlICsgdmFsOworCQlydisrOwogCQlzKys7CiAJfQotCWlmICghb2spCisJaWYgKG92ZXJmbG93KQorCQlydiB8PSBLU1RSVE9YX09WRVJGTE9XOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBfa3N0cnRvdWxsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgX3JlczsKKwl1bnNpZ25lZCBpbnQgcnY7CisKKwlzID0gX3BhcnNlX2ludGVnZXJfZml4dXBfcmFkaXgocywgJmJhc2UpOworCXJ2ID0gX3BhcnNlX2ludGVnZXIocywgYmFzZSwgJl9yZXMpOworCWlmIChydiAmIEtTVFJUT1hfT1ZFUkZMT1cpCisJCXJldHVybiAtRVJBTkdFOworCXJ2ICY9IH5LU1RSVE9YX09WRVJGTE9XOworCWlmIChydiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkqcmVzID0gYWNjOworCXMgKz0gcnY7CisJaWYgKCpzID09ICdcbicpCisJCXMrKzsKKwlpZiAoKnMpCisJCXJldHVybiAtRUlOVkFMOworCSpyZXMgPSBfcmVzOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWIva3N0cnRveC5oIGIvbGliL2tzdHJ0b3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNlZWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2tzdHJ0b3guaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0xJQl9LU1RSVE9YX0gKKyNkZWZpbmUgX0xJQl9LU1RSVE9YX0gKKworI2RlZmluZSBLU1RSVE9YX09WRVJGTE9XCSgxVSA8PCAzMSkKK2NvbnN0IGNoYXIgKl9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqYmFzZSk7Cit1bnNpZ25lZCBpbnQgX3BhcnNlX2ludGVnZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbmxhdHRyLmMgYi9saWIvbmxhdHRyLmMKaW5kZXggYWMwOWYyMi4uYTg0MDhiNiAxMDA2NDQKLS0tIGEvbGliL25sYXR0ci5jCisrKyBiL2xpYi9ubGF0dHIuYwpAQCAtMjAsNiArMjAsNyBAQAogCVtOTEFfVTE2XQk9IHNpemVvZih1MTYpLAogCVtOTEFfVTMyXQk9IHNpemVvZih1MzIpLAogCVtOTEFfVTY0XQk9IHNpemVvZih1NjQpLAorCVtOTEFfTVNFQ1NdCT0gc2l6ZW9mKHU2NCksCiAJW05MQV9ORVNURURdCT0gTkxBX0hEUkxFTiwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJjcHVfY291bnRlci5jIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKaW5kZXggZjA4NzEwNS4uZjhhM2YxYSAxMDA2NDQKLS0tIGEvbGliL3BlcmNwdV9jb3VudGVyLmMKKysrIGIvbGliL3BlcmNwdV9jb3VudGVyLmMKQEAgLTEwLDggKzEwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBMSVNUX0hFQUQocGVyY3B1X2NvdW50ZXJzKTsKIHN0YXRpYyBERUZJTkVfTVVURVgocGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19QRVJDUFVfQ09VTlRFUgogCmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCBhMmY5ZGE1Li5kOWRmNzQ1IDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTU3Niw3ICs1NzYsNiBAQAogewogCXVuc2lnbmVkIGludCBoZWlnaHQsIHNoaWZ0OwogCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7Ci0JaW50IHNhd191bnNldF90YWcgPSAwOwogCiAJLyogY2hlY2sgdGhlIHJvb3QncyB0YWcgYml0ICovCiAJaWYgKCFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKQEAgLTYwMywxNSArNjAyLDEwIEBACiAJCQlyZXR1cm4gMDsKIAogCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKLQotCQkvKgotCQkgKiBUaGlzIGlzIGp1c3QgYSBkZWJ1ZyBjaGVjay4gIExhdGVyLCB3ZSBjYW4gYmFsZSBhcyBzb29uIGFzCi0JCSAqIHdlIHNlZSBhbiB1bnNldCB0YWcuCi0JCSAqLwogCQlpZiAoIXRhZ19nZXQobm9kZSwgdGFnLCBvZmZzZXQpKQotCQkJc2F3X3Vuc2V0X3RhZyA9IDE7CisJCQlyZXR1cm4gMDsKIAkJaWYgKGhlaWdodCA9PSAxKQotCQkJcmV0dXJuICEhdGFnX2dldChub2RlLCB0YWcsIG9mZnNldCk7CisJCQlyZXR1cm4gMTsKIAkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobm9kZS0+c2xvdHNbb2Zmc2V0XSk7CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQloZWlnaHQtLTsKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9hbGdvcy5jIGIvbGliL3JhaWQ2L2FsZ29zLmMKaW5kZXggYjU5NWY1Ni4uOGIwMmY2MCAxMDA2NDQKLS0tIGEvbGliL3JhaWQ2L2FsZ29zLmMKKysrIGIvbGliL3JhaWQ2L2FsZ29zLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2lmbmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzdGRpby5oPgpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L21rdGFibGVzLmMgYi9saWIvcmFpZDYvbWt0YWJsZXMuYwppbmRleCAzYjE1MDA4Li44YTM3ODA5IDEwMDY0NAotLS0gYS9saWIvcmFpZDYvbWt0YWJsZXMuYworKysgYi9saWIvcmFpZDYvbWt0YWJsZXMuYwpAQCAtNjAsNiArNjAsNyBAQAogCXVpbnQ4X3QgZXhwdGJsWzI1Nl0sIGludnRibFsyNTZdOwogCiAJcHJpbnRmKCIjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPlxuIik7CisJcHJpbnRmKCIjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+XG4iKTsKIAogCS8qIENvbXB1dGUgbXVsdGlwbGljYXRpb24gdGFibGUgKi8KIAlwcmludGYoIlxuY29uc3QgdTggIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCmRpZmYgLS1naXQgYS9saWIvcmFpZDYvcmVjb3YuYyBiL2xpYi9yYWlkNi9yZWNvdi5jCmluZGV4IDg1OTBkMTkuLmZlMjc1ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi9yZWNvdi5jCisrKyBiL2xpYi9yYWlkNi9yZWNvdi5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiB0aGUgc3luZHJvbWUuKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CiAKIC8qIFJlY292ZXIgdHdvIGZhaWxlZCBkYXRhIGJsb2Nrcy4gKi8KZGlmZiAtLWdpdCBhL2xpYi9zcGlubG9ja19kZWJ1Zy5jIGIvbGliL3NwaW5sb2NrX2RlYnVnLmMKaW5kZXggNDc1NWI5OC4uNWYzZWFjZGQgMTAwNjQ0Ci0tLSBhL2xpYi9zcGlubG9ja19kZWJ1Zy5jCisrKyBiL2xpYi9zcGlubG9ja19kZWJ1Zy5jCkBAIC00OSwxMyArNDksMTAgQEAKIAogRVhQT1JUX1NZTUJPTChfX3J3bG9ja19pbml0KTsKIAotc3RhdGljIHZvaWQgc3Bpbl9idWcocmF3X3NwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIgKm1zZykKK3N0YXRpYyB2b2lkIHNwaW5fZHVtcChyYXdfc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXIgPSBOVUxMOwogCi0JaWYgKCFkZWJ1Z19sb2Nrc19vZmYoKSkKLQkJcmV0dXJuOwotCiAJaWYgKGxvY2stPm93bmVyICYmIGxvY2stPm93bmVyICE9IFNQSU5MT0NLX09XTkVSX0lOSVQpCiAJCW93bmVyID0gbG9jay0+b3duZXI7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkJVRzogc3BpbmxvY2sgJXMgb24gQ1BVIyVkLCAlcy8lZFxuIiwKQEAgLTcwLDYgKzY3LDE0IEBACiAJZHVtcF9zdGFjaygpOwogfQogCitzdGF0aWMgdm9pZCBzcGluX2J1ZyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhciAqbXNnKQoreworCWlmICghZGVidWdfbG9ja3Nfb2ZmKCkpCisJCXJldHVybjsKKworCXNwaW5fZHVtcChsb2NrLCBtc2cpOworfQorCiAjZGVmaW5lIFNQSU5fQlVHX09OKGNvbmQsIGxvY2ssIG1zZykgaWYgKHVubGlrZWx5KGNvbmQpKSBzcGluX2J1Zyhsb2NrLCBtc2cpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTEzLDExICsxMTgsNyBAQAogCQkvKiBsb2NrdXAgc3VzcGVjdGVkOiAqLwogCQlpZiAocHJpbnRfb25jZSkgewogCQkJcHJpbnRfb25jZSA9IDA7Ci0JCQlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiBzcGlubG9jayBsb2NrdXAgb24gQ1BVIyVkLCAiCi0JCQkJCSIlcy8lZCwgJXBcbiIsCi0JCQkJcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudC0+Y29tbSwKLQkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwgbG9jayk7Ci0JCQlkdW1wX3N0YWNrKCk7CisJCQlzcGluX2R1bXAobG9jaywgImxvY2t1cCIpOwogI2lmZGVmIENPTkZJR19TTVAKIAkJCXRyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2UoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N0cmluZy5jIGIvbGliL3N0cmluZy5jCmluZGV4IDAxZmFkOWIuLmRjNGE4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9zdHJpbmcuYworKysgYi9saWIvc3RyaW5nLmMKQEAgLTM2MCw3ICszNjAsNiBAQAogCXNpemVfdCBzaXplOwogCWNoYXIgKmVuZDsKIAotCXMgPSBza2lwX3NwYWNlcyhzKTsKIAlzaXplID0gc3RybGVuKHMpOwogCWlmICghc2l6ZSkKIAkJcmV0dXJuIHM7CkBAIC0zNzAsNyArMzY5LDcgQEAKIAkJZW5kLS07CiAJKihlbmQgKyAxKSA9ICdcMCc7CiAKLQlyZXR1cm4gczsKKwlyZXR1cm4gc2tpcF9zcGFjZXMocyk7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmltKTsKIApAQCAtNzU2LDMgKzc1NSw1NyBAQAogfQogRVhQT1JUX1NZTUJPTChtZW1jaHIpOwogI2VuZGlmCisKK3N0YXRpYyB2b2lkICpjaGVja19ieXRlczgoY29uc3QgdTggKnN0YXJ0LCB1OCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXdoaWxlIChieXRlcykgeworCQlpZiAoKnN0YXJ0ICE9IHZhbHVlKQorCQkJcmV0dXJuICh2b2lkICopc3RhcnQ7CisJCXN0YXJ0Kys7CisJCWJ5dGVzLS07CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG1lbWNocl9pbnYgLSBGaW5kIGFuIHVubWF0Y2hpbmcgY2hhcmFjdGVyIGluIGFuIGFyZWEgb2YgbWVtb3J5LgorICogQHN0YXJ0OiBUaGUgbWVtb3J5IGFyZWEKKyAqIEBjOiBGaW5kIGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gYworICogQGJ5dGVzOiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBAYywgb3IgJU5VTEwKKyAqIGlmIHRoZSB3aG9sZSBidWZmZXIgY29udGFpbnMganVzdCBAYy4KKyAqLwordm9pZCAqbWVtY2hyX2ludihjb25zdCB2b2lkICpzdGFydCwgaW50IGMsIHNpemVfdCBieXRlcykKK3sKKwl1OCB2YWx1ZSA9IGM7CisJdTY0IHZhbHVlNjQ7CisJdW5zaWduZWQgaW50IHdvcmRzLCBwcmVmaXg7CisKKwlpZiAoYnl0ZXMgPD0gMTYpCisJCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBieXRlcyk7CisKKwl2YWx1ZTY0ID0gdmFsdWUgfCB2YWx1ZSA8PCA4IHwgdmFsdWUgPDwgMTYgfCB2YWx1ZSA8PCAyNDsKKwl2YWx1ZTY0ID0gKHZhbHVlNjQgJiAweGZmZmZmZmZmKSB8IHZhbHVlNjQgPDwgMzI7CisJcHJlZml4ID0gOCAtICgodW5zaWduZWQgbG9uZylzdGFydCkgJSA4OworCisJaWYgKHByZWZpeCkgeworCQl1OCAqciA9IGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIHByZWZpeCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCXN0YXJ0ICs9IHByZWZpeDsKKwkJYnl0ZXMgLT0gcHJlZml4OworCX0KKworCXdvcmRzID0gYnl0ZXMgLyA4OworCisJd2hpbGUgKHdvcmRzKSB7CisJCWlmICgqKHU2NCAqKXN0YXJ0ICE9IHZhbHVlNjQpCisJCQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgOCk7CisJCXN0YXJ0ICs9IDg7CisJCXdvcmRzLS07CisJfQorCisJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIGJ5dGVzICUgOCk7Cit9CitFWFBPUlRfU1lNQk9MKG1lbWNocl9pbnYpOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBkNzIyMmE5Li45OTM1OTllIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMzEsMTcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4JLyogZm9yIGRlcmVmZXJlbmNlX2Z1bmN0aW9uX2Rlc2NyaXB0b3IoKSAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpbXBsZV9ndWVzc19iYXNlKGNvbnN0IGNoYXIgKmNwKQotewotCWlmIChjcFswXSA9PSAnMCcpIHsKLQkJaWYgKF90b2xvd2VyKGNwWzFdKSA9PSAneCcgJiYgaXN4ZGlnaXQoY3BbMl0pKQotCQkJcmV0dXJuIDE2OwotCQllbHNlCi0JCQlyZXR1cm4gODsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTA7Ci0JfQotfQorI2luY2x1ZGUgImtzdHJ0b3guaCIKIAogLyoqCiAgKiBzaW1wbGVfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZwpAQCAtNTEsMjMgKzQxLDE0IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBzaW1wbGVfc3RydG91bGwoY29uc3QgY2hhciAqY3AsIGNoYXIgKiplbmRwLCB1bnNpZ25lZCBpbnQgYmFzZSkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGludCBydjsKIAotCWlmICghYmFzZSkKLQkJYmFzZSA9IHNpbXBsZV9ndWVzc19iYXNlKGNwKTsKKwljcCA9IF9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNwLCAmYmFzZSk7CisJcnYgPSBfcGFyc2VfaW50ZWdlcihjcCwgYmFzZSwgJnJlc3VsdCk7CisJLyogRklYTUUgKi8KKwljcCArPSAocnYgJiB+S1NUUlRPWF9PVkVSRkxPVyk7CiAKLQlpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgX3RvbG93ZXIoY3BbMV0pID09ICd4JykKLQkJY3AgKz0gMjsKLQotCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7Ci0JCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCQl2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcCAtICcwJyA6IF90b2xvd2VyKCpjcCkgLSAnYScgKyAxMDsKLQkJaWYgKHZhbHVlID49IGJhc2UpCi0JCQlicmVhazsKLQkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwotCQljcCsrOwotCX0KIAlpZiAoZW5kcCkKIAkJKmVuZHAgPSAoY2hhciAqKWNwOwogCkBAIC01NjYsNyArNTQ3LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCXAgPSBwYWNrX2hleF9ieXRlKHAsIGFkZHJbaV0pOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCBhZGRyW2ldKTsKIAkJaWYgKGZtdFswXSA9PSAnTScgJiYgaSAhPSA1KQogCQkJKnArKyA9IHNlcGFyYXRvcjsKIAl9CkBAIC02ODYsMTMgKzY2NywxMyBAQAogCQlsbyA9IHdvcmQgJiAweGZmOwogCQlpZiAoaGkpIHsKIAkJCWlmIChoaSA+IDB4MGYpCi0JCQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgaGkpOworCQkJCXAgPSBoZXhfYnl0ZV9wYWNrKHAsIGhpKTsKIAkJCWVsc2UKIAkJCQkqcCsrID0gaGV4X2FzY19sbyhoaSk7Ci0JCQlwID0gcGFja19oZXhfYnl0ZShwLCBsbyk7CisJCQlwID0gaGV4X2J5dGVfcGFjayhwLCBsbyk7CiAJCX0KIAkJZWxzZSBpZiAobG8gPiAweDBmKQotCQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgbG8pOworCQkJcCA9IGhleF9ieXRlX3BhY2socCwgbG8pOwogCQllbHNlCiAJCQkqcCsrID0gaGV4X2FzY19sbyhsbyk7CiAJCW5lZWRjb2xvbiA9IHRydWU7CkBAIC03MTQsOCArNjk1LDggQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgKmFkZHIrKyk7Ci0JCXAgPSBwYWNrX2hleF9ieXRlKHAsICphZGRyKyspOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCAqYWRkcisrKTsKKwkJcCA9IGhleF9ieXRlX3BhY2socCwgKmFkZHIrKyk7CiAJCWlmIChmbXRbMF0gPT0gJ0knICYmIGkgIT0gNykKIAkJCSpwKysgPSAnOic7CiAJfQpAQCAtNzczLDcgKzc1NCw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJcCA9IHBhY2tfaGV4X2J5dGUocCwgYWRkcltpbmRleFtpXV0pOworCQlwID0gaGV4X2J5dGVfcGFjayhwLCBhZGRyW2luZGV4W2ldXSk7CiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDM6CiAJCWNhc2UgNToKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IGYyZjFjYTEuLjAxMWIxMTAgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMTMxLDYgKzEzMSw5IEBACiBjb25maWcgSEFWRV9NRU1CTE9DSwogCWJvb2xlYW4KIAorY29uZmlnIE5PX0JPT1RNRU0KKwlib29sZWFuCisKICMgZXZlbnR1YWxseSwgd2UgY2FuIGhhdmUgdGhpcyBvcHRpb24ganVzdCAnc2VsZWN0IFNQQVJTRU1FTScKIGNvbmZpZyBNRU1PUllfSE9UUExVRwogCWJvb2wgIkFsbG93IGZvciBtZW1vcnkgaG90LWFkZCIKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggODM2ZTQxNi4uNTBlYzAwZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTUsNyArNSw4IEBACiBtbXUteQkJCTo9IG5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZyZW1hcC5vIGhpZ2htZW0ubyBtYWR2aXNlLm8gbWVtb3J5Lm8gbWluY29yZS5vIFwKIAkJCSAgIG1sb2NrLm8gbW1hcC5vIG1wcm90ZWN0Lm8gbXJlbWFwLm8gbXN5bmMubyBybWFwLm8gXAotCQkJICAgdm1hbGxvYy5vIHBhZ2V3YWxrLm8gcGd0YWJsZS1nZW5lcmljLm8KKwkJCSAgIHZtYWxsb2MubyBwYWdld2Fsay5vIHBndGFibGUtZ2VuZXJpYy5vIFwKKwkJCSAgIHByb2Nlc3Nfdm1fYWNjZXNzLm8KIAogb2JqLXkJCQk6PSBmaWxlbWFwLm8gbWVtcG9vbC5vIG9vbV9raWxsLm8gZmFkdmlzZS5vIFwKIAkJCSAgIG1hY2Nlc3MubyBwYWdlX2FsbG9jLm8gcGFnZS13cml0ZWJhY2subyBcCmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCBhODdkYTUyLi5hMDg2MDY0IDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTk3LDYgKzk3LDcgQEAKIAkJICAgIkJkaURpcnR5VGhyZXNoOiAgICAgJTEwbHUga0JcbiIKIAkJICAgIkRpcnR5VGhyZXNoOiAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJhY2tncm91bmRUaHJlc2g6ICAgJTEwbHUga0JcbiIKKwkJICAgIkJkaURpcnRpZWQ6ICAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJkaVdyaXR0ZW46ICAgICAgICAgJTEwbHUga0JcbiIKIAkJICAgIkJkaVdyaXRlQmFuZHdpZHRoOiAgJTEwbHUga0Jwc1xuIgogCQkgICAiYl9kaXJ0eTogICAgICAgICAgICAlMTBsdVxuIgpAQCAtMTA5LDYgKzExMCw3IEBACiAJCSAgIEsoYmRpX3RocmVzaCksCiAJCSAgIEsoZGlydHlfdGhyZXNoKSwKIAkJICAgSyhiYWNrZ3JvdW5kX3RocmVzaCksCisJCSAgICh1bnNpZ25lZCBsb25nKSBLKGJkaV9zdGF0KGJkaSwgQkRJX0RJUlRJRUQpKSwKIAkJICAgKHVuc2lnbmVkIGxvbmcpIEsoYmRpX3N0YXQoYmRpLCBCRElfV1JJVFRFTikpLAogCQkgICAodW5zaWduZWQgbG9uZykgSyhiZGktPndyaXRlX2JhbmR3aWR0aCksCiAJCSAgIG5yX2RpcnR5LApAQCAtNDA0LDkgKzQwNiw4IEBACiAJCS8qCiAJCSAqIEluIHRoZSBmb2xsb3dpbmcgbG9vcCB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgd2hldGhlciB3ZSBoYXZlCiAJCSAqIHNvbWUgd29yayB0byBkbyB3aXRob3V0IGFueSBzeW5jaHJvbml6YXRpb24gd2l0aCB0YXNrcwotCQkgKiB3YWtpbmcgdXMgdXAgdG8gZG8gd29yayBmb3IgdGhlbS4gU28gd2UgaGF2ZSB0byBzZXQgdGFzawotCQkgKiBzdGF0ZSBhbHJlYWR5IGhlcmUgc28gdGhhdCB3ZSBkb24ndCBtaXNzIHdha2V1cHMgY29taW5nCi0JCSAqIGFmdGVyIHdlIHZlcmlmeSBzb21lIGNvbmRpdGlvbi4KKwkJICogd2FraW5nIHVzIHVwIHRvIGRvIHdvcmsgZm9yIHRoZW0uIFNldCB0aGUgdGFzayBzdGF0ZSBoZXJlCisJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgbWlzcyB3YWtldXBzIGFmdGVyIHZlcmlmeWluZyBjb25kaXRpb25zLgogCQkgKi8KIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIApAQCAtNDc0LDcgKzQ3NSw4IEBACiAJCQkJICogdGhlIGJkaSBmcm9tIHRoZSB0aHJlYWQuIEhvcGVmdWxseSAxMDI0IGlzCiAJCQkJICogbGFyZ2UgZW5vdWdoIGZvciBlZmZpY2llbnQgSU8uCiAJCQkJICovCi0JCQkJd3JpdGViYWNrX2lub2Rlc193YigmYmRpLT53YiwgMTAyNCk7CisJCQkJd3JpdGViYWNrX2lub2Rlc193YigmYmRpLT53YiwgMTAyNCwKKwkJCQkJCSAgICBXQl9SRUFTT05fRk9SS0VSX1RIUkVBRCk7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogVGhlIHNwaW5sb2NrIG1ha2VzIHN1cmUgd2UgZG8gbm90IGxvc2UKQEAgLTY4NCw2ICs2ODYsOCBAQAogCWJkaS0+YndfdGltZV9zdGFtcCA9IGppZmZpZXM7CiAJYmRpLT53cml0dGVuX3N0YW1wID0gMDsKIAorCWJkaS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0ID0gSU5JVF9CVzsKKwliZGktPmRpcnR5X3JhdGVsaW1pdCA9IElOSVRfQlc7CiAJYmRpLT53cml0ZV9iYW5kd2lkdGggPSBJTklUX0JXOwogCWJkaS0+YXZnX3dyaXRlX2JhbmR3aWR0aCA9IElOSVRfQlc7CiAKZGlmZiAtLWdpdCBhL21tL2Jvb3RtZW0uYyBiL21tL2Jvb3RtZW0uYwppbmRleCAwMWQ1YTRiMy4uMWE3NzAxMiAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CmRpZmYgLS1naXQgYS9tbS9ib3VuY2UuYyBiL21tL2JvdW5jZS5jCmluZGV4IDE0ODFkZTYuLjRlOWFlNzIgMTAwNjQ0Ci0tLSBhL21tL2JvdW5jZS5jCisrKyBiL21tL2JvdW5jZS5jCkBAIC00LDcgKzQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KQEAgLTI2LDEyICsyNywxMCBAQAogI2lmZGVmIENPTkZJR19ISUdITUVNCiBzdGF0aWMgX19pbml0IGludCBpbml0X2VtZXJnZW5jeV9wb29sKHZvaWQpCiB7Ci0Jc3RydWN0IHN5c2luZm8gaTsKLQlzaV9tZW1pbmZvKCZpKTsKLQlzaV9zd2FwaW5mbygmaSk7Ci0KLQlpZiAoIWkudG90YWxoaWdoKQorI2lmbmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKKwlpZiAobWF4X3BmbiA8PSBtYXhfbG93X3BmbikKIAkJcmV0dXJuIDA7CisjZW5kaWYKIAogCXBhZ2VfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3BhZ2VfcG9vbChQT09MX1NJWkUsIDApOwogCUJVR19PTighcGFnZV9wb29sKTsKZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uYwppbmRleCA2Y2M2MDRiLi44OTlkOTU2IDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKKysrIGIvbW0vY29tcGFjdGlvbi5jCkBAIC0zNSwxMCArMzUsNiBAQAogCXVuc2lnbmVkIGxvbmcgbWlncmF0ZV9wZm47CS8qIGlzb2xhdGVfbWlncmF0ZXBhZ2VzIHNlYXJjaCBiYXNlICovCiAJYm9vbCBzeW5jOwkJCS8qIFN5bmNocm9ub3VzIG1pZ3JhdGlvbiAqLwogCi0JLyogQWNjb3VudCBmb3IgaXNvbGF0ZWQgYW5vbiBhbmQgZmlsZSBwYWdlcyAqLwotCXVuc2lnbmVkIGxvbmcgbnJfYW5vbjsKLQl1bnNpZ25lZCBsb25nIG5yX2ZpbGU7Ci0KIAl1bnNpZ25lZCBpbnQgb3JkZXI7CQkvKiBvcmRlciBhIGRpcmVjdCBjb21wYWN0b3IgbmVlZHMgKi8KIAlpbnQgbWlncmF0ZXR5cGU7CQkvKiBNT1ZBQkxFLCBSRUNMQUlNQUJMRSBldGMgKi8KIAlzdHJ1Y3Qgem9uZSAqem9uZTsKQEAgLTIyMywxNyArMjE5LDEzIEBACiBzdGF0aWMgdm9pZCBhY2N0X2lzb2xhdGVkKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBpbnQgY291bnRbTlJfTFJVX0xJU1RTXSA9IHsgMCwgfTsKKwl1bnNpZ25lZCBpbnQgY291bnRbMl0gPSB7IDAsIH07CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZjYy0+bWlncmF0ZXBhZ2VzLCBscnUpIHsKLQkJaW50IGxydSA9IHBhZ2VfbHJ1X2Jhc2VfdHlwZShwYWdlKTsKLQkJY291bnRbbHJ1XSsrOwotCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZjYy0+bWlncmF0ZXBhZ2VzLCBscnUpCisJCWNvdW50WyEhcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpXSsrOwogCi0JY2MtPm5yX2Fub24gPSBjb3VudFtMUlVfQUNUSVZFX0FOT05dICsgY291bnRbTFJVX0lOQUNUSVZFX0FOT05dOwotCWNjLT5ucl9maWxlID0gY291bnRbTFJVX0FDVElWRV9GSUxFXSArIGNvdW50W0xSVV9JTkFDVElWRV9GSUxFXTsKLQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSVNPTEFURURfQU5PTiwgY2MtPm5yX2Fub24pOwotCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JU09MQVRFRF9GSUxFLCBjYy0+bnJfZmlsZSk7CisJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lTT0xBVEVEX0FOT04sIGNvdW50WzBdKTsKKwlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSVNPTEFURURfRklMRSwgY291bnRbMV0pOwogfQogCiAvKiBTaW1pbGFyIHRvIHJlY2xhaW0sIGJ1dCBkaWZmZXJlbnQgZW5vdWdoIHRoYXQgdGhleSBkb24ndCBzaGFyZSBsb2dpYyAqLwpAQCAtMjY5LDYgKzI2MSw3IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3BhZ2VibG9ja19uciA9IDAsIHBhZ2VibG9ja19ucjsKIAl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQgPSAwLCBucl9pc29sYXRlZCA9IDA7CiAJc3RydWN0IGxpc3RfaGVhZCAqbWlncmF0ZWxpc3QgPSAmY2MtPm1pZ3JhdGVwYWdlczsKKwlpc29sYXRlX21vZGVfdCBtb2RlID0gSVNPTEFURV9BQ1RJVkV8SVNPTEFURV9JTkFDVElWRTsKIAogCS8qIERvIG5vdCBzY2FuIG91dHNpZGUgem9uZSBib3VuZGFyaWVzICovCiAJbG93X3BmbiA9IG1heChjYy0+bWlncmF0ZV9wZm4sIHpvbmUtPnpvbmVfc3RhcnRfcGZuKTsKQEAgLTM1Niw4ICszNDksMTEgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJaWYgKCFjYy0+c3luYykKKwkJCW1vZGUgfD0gSVNPTEFURV9DTEVBTjsKKwogCQkvKiBUcnkgaXNvbGF0ZSB0aGUgcGFnZSAqLwotCQlpZiAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIElTT0xBVEVfQk9USCwgMCkgIT0gMCkKKwkJaWYgKF9faXNvbGF0ZV9scnVfcGFnZShwYWdlLCBtb2RlLCAwKSAhPSAwKQogCQkJY29udGludWU7CiAKIAkJVk1fQlVHX09OKFBhZ2VUcmFuc0NvbXBvdW5kKHBhZ2UpKTsKQEAgLTU4Niw3ICs1ODIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLAogCQkJCSBpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrLAogCQkJCSBib29sIHN5bmMpCiB7CmRpZmYgLS1naXQgYS9tbS9kZWJ1Zy1wYWdlYWxsb2MuYyBiL21tL2RlYnVnLXBhZ2VhbGxvYy5jCmluZGV4IGExZTMzMjQuLjdjZWE1NTcgMTAwNjQ0Ci0tLSBhL21tL2RlYnVnLXBhZ2VhbGxvYy5jCisrKyBiL21tL2RlYnVnLXBhZ2VhbGxvYy5jCkBAIC0xLDcgKzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlLWRlYnVnLWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFnZV9wb2lzb24oc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC0xOCwyOCArMjEsMTMgQEAKIAlyZXR1cm4gdGVzdF9iaXQoUEFHRV9ERUJVR19GTEFHX1BPSVNPTiwgJnBhZ2UtPmRlYnVnX2ZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcG9pc29uX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCS8qCi0JICogUGFnZSBwb2lzb25pbmcgZm9yIGhpZ2htZW0gcGFnZXMgaXMgbm90IGltcGxlbWVudGVkLgotCSAqCi0JICogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHRzLgotCSAqIFNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGttYXBfYXRvbWljIHNsb3QgZm9yIHRoaXMKLQkgKiBhcHBsaWNhdGlvbiBhbmQgaXQgd2lsbCBuZWVkIGludGVycnVwdCBwcm90ZWN0aW9uLgotCSAqLwotfQotCiBzdGF0aWMgdm9pZCBwb2lzb25fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl2b2lkICphZGRyOworCXZvaWQgKmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAotCWlmIChQYWdlSGlnaE1lbShwYWdlKSkgewotCQlwb2lzb25faGlnaHBhZ2UocGFnZSk7Ci0JCXJldHVybjsKLQl9CiAJc2V0X3BhZ2VfcG9pc29uKHBhZ2UpOwotCWFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJbWVtc2V0KGFkZHIsIFBBR0VfUE9JU09OLCBQQUdFX1NJWkUpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIHBvaXNvbl9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG4pCkBAIC01OSwxNCArNDcsMTIgQEAKIAogc3RhdGljIHZvaWQgY2hlY2tfcG9pc29uX21lbSh1bnNpZ25lZCBjaGFyICptZW0sIHNpemVfdCBieXRlcykKIHsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUgKiBIWiwgMTApOwogCXVuc2lnbmVkIGNoYXIgKnN0YXJ0OwogCXVuc2lnbmVkIGNoYXIgKmVuZDsKIAotCWZvciAoc3RhcnQgPSBtZW07IHN0YXJ0IDwgbWVtICsgYnl0ZXM7IHN0YXJ0KyspIHsKLQkJaWYgKCpzdGFydCAhPSBQQUdFX1BPSVNPTikKLQkJCWJyZWFrOwotCX0KLQlpZiAoc3RhcnQgPT0gbWVtICsgYnl0ZXMpCisJc3RhcnQgPSBtZW1jaHJfaW52KG1lbSwgUEFHRV9QT0lTT04sIGJ5dGVzKTsKKwlpZiAoIXN0YXJ0KQogCQlyZXR1cm47CiAKIAlmb3IgKGVuZCA9IG1lbSArIGJ5dGVzIC0gMTsgZW5kID4gc3RhcnQ7IGVuZC0tKSB7CkBAIC03NCw3ICs2MCw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwlpZiAoIV9fcmF0ZWxpbWl0KCZyYXRlbGltaXQpKQogCQlyZXR1cm47CiAJZWxzZSBpZiAoc3RhcnQgPT0gZW5kICYmIHNpbmdsZV9iaXRfZmxpcCgqc3RhcnQsIFBBR0VfUE9JU09OKSkKIAkJcHJpbnRrKEtFUk5fRVJSICJwYWdlYWxsb2M6IHNpbmdsZSBiaXQgZXJyb3JcbiIpOwpAQCAtODYsMjcgKzcyLDE3IEBACiAJZHVtcF9zdGFjaygpOwogfQogCi1zdGF0aWMgdm9pZCB1bnBvaXNvbl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQkvKgotCSAqIFNlZSBjb21tZW50IGluIHBvaXNvbl9oaWdocGFnZSgpLgotCSAqIEhpZ2htZW0gcGFnZXMgc2hvdWxkIG5vdCBiZSBwb2lzb25lZCBmb3Igbm93Ci0JICovCi0JQlVHX09OKHBhZ2VfcG9pc29uKHBhZ2UpKTsKLX0KLQogc3RhdGljIHZvaWQgdW5wb2lzb25fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKLQkJdW5wb2lzb25faGlnaHBhZ2UocGFnZSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBhZ2VfcG9pc29uKHBhZ2UpKSB7Ci0JCXZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdm9pZCAqYWRkcjsKIAotCQljaGVja19wb2lzb25fbWVtKGFkZHIsIFBBR0VfU0laRSk7Ci0JCWNsZWFyX3BhZ2VfcG9pc29uKHBhZ2UpOwotCX0KKwlpZiAoIXBhZ2VfcG9pc29uKHBhZ2UpKQorCQlyZXR1cm47CisKKwlhZGRyID0ga21hcF9hdG9taWMocGFnZSk7CisJY2hlY2tfcG9pc29uX21lbShhZGRyLCBQQUdFX1NJWkUpOworCWNsZWFyX3BhZ2VfcG9pc29uKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIHVucG9pc29uX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbikKZGlmZiAtLWdpdCBhL21tL2RtYXBvb2wuYyBiL21tL2RtYXBvb2wuYwppbmRleCBmYmI1OGUzLi5jNWFiMzNiIDEwMDY0NAotLS0gYS9tbS9kbWFwb29sLmMKKysrIGIvbW0vZG1hcG9vbC5jCkBAIC0yNywxMSArMjcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA3NzcxODcxLi5jMDAxOGYyIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC05LDcgKzksNyBAQAogICogbW9zdCAibm9ybWFsIiBmaWxlc3lzdGVtcyAoYnV0IHlvdSBkb24ndCAvaGF2ZS8gdG8gdXNlIHRoaXM6CiAgKiB0aGUgTkZTIGZpbGVzeXN0ZW0gdXNlZCB0byBkbyB0aGlzIGRpZmZlcmVudGx5LCBmb3IgZXhhbXBsZSkKICAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CkBAIC0yMTE1LDYgKzIxMTUsNyBAQAogCX0gZWxzZSB7CiAJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ID0gaS0+aW92OwogCQlzaXplX3QgYmFzZSA9IGktPmlvdl9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbnJfc2VncyA9IGktPm5yX3NlZ3M7CiAKIAkJLyoKIAkJICogVGhlICFpb3YtPmlvdl9sZW4gY2hlY2sgZW5zdXJlcyB3ZSBza2lwIG92ZXIgdW5saWtlbHkKQEAgLTIxMzAsMTEgKzIxMzEsMTMgQEAKIAkJCWJhc2UgKz0gY29weTsKIAkJCWlmIChpb3YtPmlvdl9sZW4gPT0gYmFzZSkgewogCQkJCWlvdisrOworCQkJCW5yX3NlZ3MtLTsKIAkJCQliYXNlID0gMDsKIAkJCX0KIAkJfQogCQlpLT5pb3YgPSBpb3Y7CiAJCWktPmlvdl9vZmZzZXQgPSBiYXNlOworCQlpLT5ucl9zZWdzID0gbnJfc2VnczsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2FkdmFuY2UpOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggOTMzNTZjZC4uZjkxYjJmNiAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CmRpZmYgLS1naXQgYS9tbS9mcmVtYXAuYyBiL21tL2ZyZW1hcC5jCmluZGV4IGI4ZTBlMmQuLjllZDRmZDQgMTAwNjQ0Ci0tLSBhL21tL2ZyZW1hcC5jCisrKyBiL21tL2ZyZW1hcC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KIApkaWZmIC0tZ2l0IGEvbW0vaGlnaG1lbS5jIGIvbW0vaGlnaG1lbS5jCmluZGV4IDVlZjY3MmMuLjU3ZDgyYzYgMTAwNjQ0Ci0tLSBhL21tL2hpZ2htZW0uYworKysgYi9tbS9oaWdobWVtLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtMjUwLDcgKzI1MCw3IEBACiAjZW5kaWYKIAogLyoqCi0gKiBrdW5tYXBfaGlnaCAtIG1hcCBhIGhpZ2htZW0gcGFnZSBpbnRvIG1lbW9yeQorICoga3VubWFwX2hpZ2ggLSB1bm1hcCBhIGhpZ2htZW0gcGFnZSBpbnRvIG1lbW9yeQogICogQHBhZ2U6ICZzdHJ1Y3QgcGFnZSB0byB1bm1hcAogICoKICAqIElmIEFSQ0hfTkVFRFNfS01BUF9ISUdIX0dFVCBpcyBub3QgZGVmaW5lZCB0aGVuIHRoaXMgbWF5IGJlIGNhbGxlZApkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggZTJkMTU4Ny4uNDI5OGFiYSAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYworKysgYi9tbS9odWdlX21lbW9yeS5jCkBAIC04OSw3ICs4OSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBtbV9oZWFkOwogCXN0cnVjdCBtbV9zbG90ICptbV9zbG90OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLX0ga2h1Z2VwYWdlZF9zY2FuID0geworfTsKK3N0YXRpYyBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIGtodWdlcGFnZWRfc2NhbiA9IHsKIAkubW1faGVhZCA9IExJU1RfSEVBRF9JTklUKGtodWdlcGFnZWRfc2Nhbi5tbV9oZWFkKSwKIH07CiAKQEAgLTgyOSw3ICs4MzAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CiAJCWNvcHlfdXNlcl9oaWdocGFnZShwYWdlc1tpXSwgcGFnZSArIGksCi0JCQkJICAgaGFkZHIgKyBQQUdFX1NISUZUKmksIHZtYSk7CisJCQkJICAgaGFkZHIgKyBQQUdFX1NJWkUgKiBpLCB2bWEpOwogCQlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KQEAgLTk4OSw3ICs5OTAsNyBAQAogCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CiAJVk1fQlVHX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOwogCWlmIChmbGFncyAmIEZPTExfR0VUKQotCQlnZXRfcGFnZShwYWdlKTsKKwkJZ2V0X3BhZ2VfZm9sbChwYWdlKTsKIAogb3V0OgogCXJldHVybiBwYWdlOwpAQCAtMTA1Miw2ICsxMDUzLDUxIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IG1vdmVfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbmV3X3ZtYSwKKwkJICB1bnNpZ25lZCBsb25nIG9sZF9hZGRyLAorCQkgIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIsIHVuc2lnbmVkIGxvbmcgb2xkX2VuZCwKKwkJICBwbWRfdCAqb2xkX3BtZCwgcG1kX3QgKm5ld19wbWQpCit7CisJaW50IHJldCA9IDA7CisJcG1kX3QgcG1kOworCisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCisJaWYgKChvbGRfYWRkciAmIH5IUEFHRV9QTURfTUFTSykgfHwKKwkgICAgKG5ld19hZGRyICYgfkhQQUdFX1BNRF9NQVNLKSB8fAorCSAgICBvbGRfZW5kIC0gb2xkX2FkZHIgPCBIUEFHRV9QTURfU0laRSB8fAorCSAgICAobmV3X3ZtYS0+dm1fZmxhZ3MgJiBWTV9OT0hVR0VQQUdFKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRoZSBkZXN0aW5hdGlvbiBwbWQgc2hvdWxkbid0IGJlIGVzdGFibGlzaGVkLCBmcmVlX3BndGFibGVzKCkKKwkgKiBzaG91bGQgaGF2ZSByZWxlYXNlIGl0LgorCSAqLworCWlmIChXQVJOX09OKCFwbWRfbm9uZSgqbmV3X3BtZCkpKSB7CisJCVZNX0JVR19PTihwbWRfdHJhbnNfaHVnZSgqbmV3X3BtZCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWlmIChsaWtlbHkocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKSkgeworCQlpZiAocG1kX3RyYW5zX3NwbGl0dGluZygqb2xkX3BtZCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJCXdhaXRfc3BsaXRfaHVnZV9wYWdlKHZtYS0+YW5vbl92bWEsIG9sZF9wbWQpOworCQkJcmV0ID0gLTE7CisJCX0gZWxzZSB7CisJCQlwbWQgPSBwbWRwX2dldF9hbmRfY2xlYXIobW0sIG9sZF9hZGRyLCBvbGRfcG1kKTsKKwkJCVZNX0JVR19PTighcG1kX25vbmUoKm5ld19wbWQpKTsKKwkJCXNldF9wbWRfYXQobW0sIG5ld19hZGRyLCBuZXdfcG1kLCBwbWQpOworCQkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJcmV0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogaW50IGNoYW5nZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkJdW5zaWduZWQgbG9uZyBhZGRyLCBwZ3Byb3RfdCBuZXdwcm90KQogewpAQCAtMTE1Niw2ICsxMjAyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGhlYWRfaW5kZXggPSBwYWdlLT5pbmRleDsKIAlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKIAlpbnQgem9uZXN0YXQ7CisJaW50IHRhaWxfY291bnQgPSAwOwogCiAJLyogcHJldmVudCBQYWdlTFJVIHRvIGdvIGF3YXkgZnJvbSB1bmRlciB1cywgYW5kIGZyZWV6ZSBscnUgc3RhdHMgKi8KIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CkBAIC0xMTY0LDExICsxMjExLDI3IEBACiAJZm9yIChpID0gMTsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlX3RhaWwgPSBwYWdlICsgaTsKIAotCQkvKiB0YWlsX3BhZ2UtPl9jb3VudCBjYW5ub3QgY2hhbmdlICovCi0JCWF0b21pY19zdWIoYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSwgJnBhZ2UtPl9jb3VudCk7Ci0JCUJVR19PTihwYWdlX2NvdW50KHBhZ2UpIDw9IDApOwotCQlhdG9taWNfYWRkKHBhZ2VfbWFwY291bnQocGFnZSkgKyAxLCAmcGFnZV90YWlsLT5fY291bnQpOwotCQlCVUdfT04oYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSA8PSAwKTsKKwkJLyogdGFpbF9wYWdlLT5fbWFwY291bnQgY2Fubm90IGNoYW5nZSAqLworCQlCVUdfT04ocGFnZV9tYXBjb3VudChwYWdlX3RhaWwpIDwgMCk7CisJCXRhaWxfY291bnQgKz0gcGFnZV9tYXBjb3VudChwYWdlX3RhaWwpOworCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkJQlVHX09OKHRhaWxfY291bnQgPCAwKTsKKwkJQlVHX09OKGF0b21pY19yZWFkKCZwYWdlX3RhaWwtPl9jb3VudCkgIT0gMCk7CisJCS8qCisJCSAqIHRhaWxfcGFnZS0+X2NvdW50IGlzIHplcm8gYW5kIG5vdCBjaGFuZ2luZyBmcm9tCisJCSAqIHVuZGVyIHVzLiBCdXQgZ2V0X3BhZ2VfdW5sZXNzX3plcm8oKSBtYXkgYmUgcnVubmluZworCQkgKiBmcm9tIHVuZGVyIHVzIG9uIHRoZSB0YWlsX3BhZ2UuIElmIHdlIHVzZWQKKwkJICogYXRvbWljX3NldCgpIGJlbG93IGluc3RlYWQgb2YgYXRvbWljX2FkZCgpLCB3ZQorCQkgKiB3b3VsZCB0aGVuIHJ1biBhdG9taWNfc2V0KCkgY29uY3VycmVudGx5IHdpdGgKKwkJICogZ2V0X3BhZ2VfdW5sZXNzX3plcm8oKSwgYW5kIGF0b21pY19zZXQoKSBpcworCQkgKiBpbXBsZW1lbnRlZCBpbiBDIG5vdCB1c2luZyBsb2NrZWQgb3BzLiBzcGluX3VubG9jaworCQkgKiBvbiB4ODYgc29tZXRpbWUgdXNlcyBsb2NrZWQgb3BzIGJlY2F1c2Ugb2YgUFBybworCQkgKiBlcnJhdGEgNjYsIDkyLCBzbyB1bmxlc3Mgc29tZWJvZHkgY2FuIGd1YXJhbnRlZQorCQkgKiBhdG9taWNfc2V0KCkgaGVyZSB3b3VsZCBiZSBzYWZlIG9uIGFsbCBhcmNocyAoYW5kCisJCSAqIG5vdCBvbmx5IG9uIHg4NiksIGl0J3Mgc2FmZXIgdG8gdXNlIGF0b21pY19hZGQoKS4KKwkJICovCisJCWF0b21pY19hZGQocGFnZV9tYXBjb3VudChwYWdlKSArIHBhZ2VfbWFwY291bnQocGFnZV90YWlsKSArIDEsCisJCQkgICAmcGFnZV90YWlsLT5fY291bnQpOwogCiAJCS8qIGFmdGVyIGNsZWFyaW5nIFBhZ2VUYWlsIHRoZSBndXAgcmVmY291bnQgY2FuIGJlIHJlbGVhc2VkICovCiAJCXNtcF9tYigpOwpAQCAtMTE4NiwxMCArMTI0OSw3IEBACiAJCQkJICAgICAgKDFMIDw8IFBHX3VwdG9kYXRlKSkpOwogCQlwYWdlX3RhaWwtPmZsYWdzIHw9ICgxTCA8PCBQR19kaXJ0eSk7CiAKLQkJLyoKLQkJICogMSkgY2xlYXIgUGFnZVRhaWwgYmVmb3JlIG92ZXJ3cml0aW5nIGZpcnN0X3BhZ2UKLQkJICogMikgY2xlYXIgUGFnZVRhaWwgYmVmb3JlIGNsZWFyaW5nIFBhZ2VIZWFkIGZvciBWTV9CVUdfT04KLQkJICovCisJCS8qIGNsZWFyIFBhZ2VUYWlsIGJlZm9yZSBvdmVyd3JpdGluZyBmaXJzdF9wYWdlICovCiAJCXNtcF93bWIoKTsKIAogCQkvKgpAQCAtMTIwNiw3ICsxMjY2LDYgQEAKIAkJICogc3RhdHVzIGlzIGFjaGlldmVkIHNldHRpbmcgYSByZXNlcnZlZCBiaXQgaW4gdGhlCiAJCSAqIHBtZCwgbm90IGJ5IGNsZWFyaW5nIHRoZSBwcmVzZW50IGJpdC4KIAkJKi8KLQkJQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZV90YWlsKSk7CiAJCXBhZ2VfdGFpbC0+X21hcGNvdW50ID0gcGFnZS0+X21hcGNvdW50OwogCiAJCUJVR19PTihwYWdlX3RhaWwtPm1hcHBpbmcpOwpAQCAtMTIyMyw2ICsxMjgyLDggQEAKIAogCQlscnVfYWRkX3BhZ2VfdGFpbCh6b25lLCBwYWdlLCBwYWdlX3RhaWwpOwogCX0KKwlhdG9taWNfc3ViKHRhaWxfY291bnQsICZwYWdlLT5fY291bnQpOworCUJVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSA8PSAwKTsKIAogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9BTk9OX1RSQU5TUEFSRU5UX0hVR0VQQUdFUyk7CiAJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FOT05fUEFHRVMsIEhQQUdFX1BNRF9OUik7CkBAIC0xOTA2LDcgKzE5NjcsNyBAQAogCUJVR19PTighcG1kX25vbmUoKnBtZCkpOwogCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkcmVzcyk7CiAJc2V0X3BtZF9hdChtbSwgYWRkcmVzcywgcG1kLCBfcG1kKTsKLQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOworCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBfcG1kKTsKIAlwcmVwYXJlX3BtZF9odWdlX3B0ZShwZ3RhYmxlLCBtbSk7CiAJbW0tPm5yX3B0ZXMtLTsKIAlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CkBAIC0yMDI0LDYgKzIwODUsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwYWdlcywKIAkJCQkJICAgIHN0cnVjdCBwYWdlICoqaHBhZ2UpCisJX19yZWxlYXNlcygma2h1Z2VwYWdlZF9tbV9sb2NrKQorCV9fYWNxdWlyZXMoJmtodWdlcGFnZWRfbW1fbG9jaykKIHsKIAlzdHJ1Y3QgbW1fc2xvdCAqbW1fc2xvdDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IGQwNzFkMzguLjIxODlhZjQgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtMzcsNiArMzcsNTIgQEAKIAlhdG9taWNfZGVjKCZwYWdlLT5fY291bnQpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19nZXRfcGFnZV90YWlsX2ZvbGwoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCWJvb2wgZ2V0X3BhZ2VfaGVhZCkKK3sKKwkvKgorCSAqIElmIHdlJ3JlIGdldHRpbmcgYSB0YWlsIHBhZ2UsIHRoZSBlbGV2YXRlZCBwYWdlLT5fY291bnQgaXMKKwkgKiByZXF1aXJlZCBvbmx5IGluIHRoZSBoZWFkIHBhZ2UgYW5kIHdlIHdpbGwgZWxldmF0ZSB0aGUgaGVhZAorCSAqIHBhZ2UtPl9jb3VudCBhbmQgdGFpbCBwYWdlLT5fbWFwY291bnQuCisJICoKKwkgKiBXZSBlbGV2YXRlIHBhZ2VfdGFpbC0+X21hcGNvdW50IGZvciB0YWlsIHBhZ2VzIHRvIGZvcmNlCisJICogcGFnZV90YWlsLT5fY291bnQgdG8gYmUgemVybyBhdCBhbGwgdGltZXMgdG8gYXZvaWQgZ2V0dGluZworCSAqIGZhbHNlIHBvc2l0aXZlcyBmcm9tIGdldF9wYWdlX3VubGVzc196ZXJvKCkgd2l0aAorCSAqIHNwZWN1bGF0aXZlIHBhZ2UgYWNjZXNzIChsaWtlIGluCisJICogcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUoKSkgb24gdGFpbCBwYWdlcy4KKwkgKi8KKwlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPmZpcnN0X3BhZ2UtPl9jb3VudCkgPD0gMCk7CisJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpICE9IDApOworCVZNX0JVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCk7CisJaWYgKGdldF9wYWdlX2hlYWQpCisJCWF0b21pY19pbmMoJnBhZ2UtPmZpcnN0X3BhZ2UtPl9jb3VudCk7CisJYXRvbWljX2luYygmcGFnZS0+X21hcGNvdW50KTsKK30KKworLyoKKyAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGFzIHRoZSBGT0xMX0dFVCBvcGVyYXRpb24gb2YKKyAqIGZvbGxvd19wYWdlKCkgYW5kIGl0IG11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIHByb3BlciBQVAorICogbG9jayB3aGlsZSB0aGUgcHRlIChvciBwbWRfdHJhbnNfaHVnZSkgaXMgc3RpbGwgbWFwcGluZyB0aGUgcGFnZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGdldF9wYWdlX2ZvbGwoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKHVubGlrZWx5KFBhZ2VUYWlsKHBhZ2UpKSkKKwkJLyoKKwkJICogVGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZQorCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGNhbid0IHJ1biB1bmRlcgorCQkgKiBnZXRfcGFnZV9mb2xsKCkgYmVjYXVzZSB3ZSBob2xkIHRoZSBwcm9wZXIgUFQgbG9jay4KKwkJICovCisJCV9fZ2V0X3BhZ2VfdGFpbF9mb2xsKHBhZ2UsIHRydWUpOworCWVsc2UgeworCQkvKgorCQkgKiBHZXR0aW5nIGEgbm9ybWFsIHBhZ2Ugb3IgdGhlIGhlYWQgb2YgYSBjb21wb3VuZCBwYWdlCisJCSAqIHJlcXVpcmVzIHRvIGFscmVhZHkgaGF2ZSBhbiBlbGV2YXRlZCBwYWdlLT5fY291bnQuCisJCSAqLworCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPD0gMCk7CisJCWF0b21pY19pbmMoJnBhZ2UtPl9jb3VudCk7CisJfQorfQorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm47CiAKIC8qCmRpZmYgLS1naXQgYS9tbS9rbWVtbGVhay5jIGIvbW0va21lbWxlYWsuYwppbmRleCBkNjg4MGY1Li5mM2IyYTAwIDEwMDY0NAotLS0gYS9tbS9rbWVtbGVhay5jCisrKyBiL21tL2ttZW1sZWFrLmMKQEAgLTY5LDcgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvbW0va3NtLmMgYi9tbS9rc20uYwppbmRleCA5YTY4YjBjLi4zMTA1NDRhIDEwMDY0NAotLS0gYS9tbS9rc20uYworKysgYi9tbS9rc20uYwpAQCAtMTkwNSw3ICsxOTA1LDggQEAKIAogCQkJb29tX3Njb3JlX2FkaiA9IHRlc3Rfc2V0X29vbV9zY29yZV9hZGooT09NX1NDT1JFX0FESl9NQVgpOwogCQkJZXJyID0gdW5tZXJnZV9hbmRfcmVtb3ZlX2FsbF9ybWFwX2l0ZW1zKCk7Ci0JCQl0ZXN0X3NldF9vb21fc2NvcmVfYWRqKG9vbV9zY29yZV9hZGopOworCQkJY29tcGFyZV9zd2FwX29vbV9zY29yZV9hZGooT09NX1NDT1JFX0FESl9NQVgsCisJCQkJCQkJCW9vbV9zY29yZV9hZGopOwogCQkJaWYgKGVycikgewogCQkJCWtzbV9ydW4gPSBLU01fUlVOX1NUT1A7CiAJCQkJY291bnQgPSBlcnI7CmRpZmYgLS1naXQgYS9tbS9tYWNjZXNzLmMgYi9tbS9tYWNjZXNzLmMKaW5kZXggNGNlZTE4Mi4uZDUzYWRmOSAxMDA2NDQKLS0tIGEvbW0vbWFjY2Vzcy5jCisrKyBiL21tL21hY2Nlc3MuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBY2Nlc3Mga2VybmVsIG1lbW9yeSB3aXRob3V0IGZhdWx0aW5nLgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IGNjYmY5NzMuLjg0YmVjNDkgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtNTgsNyArNTgsOCBAQAogCXJldHVybiAoKGJhc2UxIDwgKGJhc2UyICsgc2l6ZTIpKSAmJiAoYmFzZTIgPCAoYmFzZTEgKyBzaXplMSkpKTsKIH0KIAotbG9uZyBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfb3ZlcmxhcHNfcmVnaW9uKHN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlLCBwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQorc3RhdGljIGxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX292ZXJsYXBzX3JlZ2lvbihzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwKKwkJCQkJcGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTI2Nyw3ICsyNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1leHRlcm4gaW50IF9faW5pdF9tZW1ibG9jayBfX3dlYWsgbWVtYmxvY2tfbWVtb3J5X2Nhbl9jb2FsZXNjZShwaHlzX2FkZHJfdCBhZGRyMSwgcGh5c19hZGRyX3Qgc2l6ZTEsCitpbnQgX19pbml0X21lbWJsb2NrIF9fd2VhayBtZW1ibG9ja19tZW1vcnlfY2FuX2NvYWxlc2NlKHBoeXNfYWRkcl90IGFkZHIxLCBwaHlzX2FkZHJfdCBzaXplMSwKIAkJCQkJICBwaHlzX2FkZHJfdCBhZGRyMiwgcGh5c19hZGRyX3Qgc2l6ZTIpCiB7CiAJcmV0dXJuIDE7CkBAIC02MjYsNiArNjI3LDEyIEBACiAJcmV0dXJuIG1lbWJsb2NrLm1lbW9yeV9zaXplOwogfQogCisvKiBsb3dlc3QgYWRkcmVzcyAqLworcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0odm9pZCkKK3sKKwlyZXR1cm4gbWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbMF0uYmFzZTsKK30KKwogcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2VuZF9vZl9EUkFNKHZvaWQpCiB7CiAJaW50IGlkeCA9IG1lbWJsb2NrLm1lbW9yeS5jbnQgLSAxOwpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDM1MDg3NzcuLjZhZmY5M2MgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjAxLDggKzIwMiw4IEBACiAJc3RydWN0IGV2ZW50ZmRfY3R4ICpldmVudGZkOwogfTsKIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF90aHJlc2hvbGQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7Ci1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX29vbV9ub3RpZnkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3RocmVzaG9sZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9vb21fbm90aWZ5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CiAKIC8qCiAgKiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgZGF0YSBzdHJ1Y3R1cmUuIFRoZSBtZW1vcnkgY29udHJvbGxlciBjb250cm9scyBib3RoCkBAIC0zNjIsMjkgKzM2MywyOSBAQAogI2RlZmluZSBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQJMHgyCiAjZGVmaW5lIE1FTV9DR1JPVVBfUkVDTEFJTV9TT0ZUCQkoMSA8PCBNRU1fQ0dST1VQX1JFQ0xBSU1fU09GVF9CSVQpCiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7Ci1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKLW1lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5pZCwgaW50IHppZCkKK21lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgbmlkLCBpbnQgemlkKQogewotCXJldHVybiAmbWVtLT5pbmZvLm5vZGVpbmZvW25pZF0tPnpvbmVpbmZvW3ppZF07CisJcmV0dXJuICZtZW1jZy0+aW5mby5ub2RlaW5mb1tuaWRdLT56b25laW5mb1t6aWRdOwogfQogCi1zdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqbWVtX2Nncm91cF9jc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICptZW1fY2dyb3VwX2NzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JcmV0dXJuICZtZW0tPmNzczsKKwlyZXR1cm4gJm1lbWNnLT5jc3M7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqCi1wYWdlX2Nncm91cF96b25laW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3BhZ2VfY2dyb3VwX3pvbmVpbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaW50IG5pZCA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwogCWludCB6aWQgPSBwYWdlX3pvbmVudW0ocGFnZSk7CiAKLQlyZXR1cm4gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5pZCwgemlkKTsKKwlyZXR1cm4gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOwogfQogCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqCkBAIC00MDMsNyArNDA0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK19fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6LAogCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdXNhZ2VfaW5fZXhjZXNzKQpAQCAtNDM3LDcgKzQzOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1fX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosCiAJCQkJc3RydWN0IG1lbV9jZ3JvdXBfdHJlZV9wZXJfem9uZSAqbWN0eikKIHsKQEAgLTQ0OCwxNyArNDQ5LDE3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cF90cmVlX3Blcl96b25lICptY3R6KQogewogCXNwaW5fbG9jaygmbWN0ei0+bG9jayk7Ci0JX19tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW0sIG16LCBtY3R6KTsKKwlfX21lbV9jZ3JvdXBfcmVtb3ZlX2V4Y2VlZGVkKG1lbWNnLCBteiwgbWN0eik7CiAJc3Bpbl91bmxvY2soJm1jdHotPmxvY2spOwogfQogCiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfdXBkYXRlX3RyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV90cmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGV4Y2VzczsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC00NzEsOSArNDcyLDkgQEAKIAkgKiBOZWNlc3NhcnkgdG8gdXBkYXRlIGFsbCBhbmNlc3RvcnMgd2hlbiBoaWVyYXJjaHkgaXMgdXNlZC4KIAkgKiBiZWNhdXNlIHRoZWlyIGV2ZW50IGNvdW50ZXIgaXMgbm90IHRvdWNoZWQuCiAJICovCi0JZm9yICg7IG1lbTsgbWVtID0gcGFyZW50X21lbV9jZ3JvdXAobWVtKSkgewotCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7Ci0JCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZtZW0tPnJlcyk7CisJZm9yICg7IG1lbWNnOyBtZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKSkgeworCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKKwkJZXhjZXNzID0gcmVzX2NvdW50ZXJfc29mdF9saW1pdF9leGNlc3MoJm1lbWNnLT5yZXMpOwogCQkvKgogCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSB0aGUgdHJlZSBpZiBteiBpcyBvbiBSQi10cmVlIG9yCiAJCSAqIG1lbSBpcyBvdmVyIGl0cyBzb2Z0bGltaXQuCkBAIC00ODIsMTggKzQ4MywxOCBAQAogCQkJc3Bpbl9sb2NrKCZtY3R6LT5sb2NrKTsKIAkJCS8qIGlmIG9uLXRyZWUsIHJlbW92ZSBpdCAqLwogCQkJaWYgKG16LT5vbl90cmVlKQotCQkJCV9fbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQobWVtLCBteiwgbWN0eik7CisJCQkJX19tZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW1jZywgbXosIG1jdHopOwogCQkJLyoKIAkJCSAqIEluc2VydCBhZ2Fpbi4gbXotPnVzYWdlX2luX2V4Y2VzcyB3aWxsIGJlIHVwZGF0ZWQuCiAJCQkgKiBJZiBleGNlc3MgaXMgMCwgbm8gdHJlZSBvcHMuCiAJCQkgKi8KLQkJCV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQobWVtLCBteiwgbWN0eiwgZXhjZXNzKTsKKwkJCV9fbWVtX2Nncm91cF9pbnNlcnRfZXhjZWVkZWQobWVtY2csIG16LCBtY3R6LCBleGNlc3MpOwogCQkJc3Bpbl91bmxvY2soJm1jdHotPmxvY2spOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3JlbW92ZV9mcm9tX3RyZWVzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3JlbW92ZV9mcm9tX3RyZWVzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZSwgem9uZTsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC01MDEsOSArNTAyLDkgQEAKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkgewogCQlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKLQkJCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5vZGUsIHpvbmUpOworCQkJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbWNnLCBub2RlLCB6b25lKTsKIAkJCW1jdHogPSBzb2Z0X2xpbWl0X3RyZWVfbm9kZV96b25lKG5vZGUsIHpvbmUpOwotCQkJbWVtX2Nncm91cF9yZW1vdmVfZXhjZWVkZWQobWVtLCBteiwgbWN0eik7CisJCQltZW1fY2dyb3VwX3JlbW92ZV9leGNlZWRlZChtZW1jZywgbXosIG1jdHopOwogCQl9CiAJfQogfQpAQCAtNTY0LDcgKzU2NSw3IEBACiAgKiBjb21tb24gd29ya2xvYWQsIHRocmVhc2hvbGQgYW5kIHN5bmNob25pemF0aW9uIGFzIHZtc3RhdFtdIHNob3VsZCBiZQogICogaW1wbGVtZW50ZWQuCiAgKi8KLXN0YXRpYyBsb25nIG1lbV9jZ3JvdXBfcmVhZF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgbG9uZyBtZW1fY2dyb3VwX3JlYWRfc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJIGVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKIHsKIAlsb25nIHZhbCA9IDA7CkBAIC01NzIsODEgKzU3Myw4MyBAQAogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXZhbCArPSBwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbaWR4XSwgY3B1KTsKKwkJdmFsICs9IHBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W2lkeF0sIGNwdSk7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOwotCXZhbCArPSBtZW0tPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwlzcGluX2xvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKKwl2YWwgKz0gbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogI2VuZGlmCiAJcHV0X29ubGluZV9jcHVzKCk7CiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfc3dhcF9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJIGJvb2wgY2hhcmdlKQogewogCWludCB2YWwgPSAoY2hhcmdlKSA/IDEgOiAtMTsKLQl0aGlzX2NwdV9hZGQobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVF0sIHZhbCk7CisJdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVF0sIHZhbCk7CiB9CiAKLXZvaWQgbWVtX2Nncm91cF9wZ2ZhdWx0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCB2YWwpCit2b2lkIG1lbV9jZ3JvdXBfcGdmYXVsdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCB2YWwpCiB7Ci0JdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFRdLCB2YWwpOworCXRoaXNfY3B1X2FkZChtZW1jZy0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFRdLCB2YWwpOwogfQogCi12b2lkIG1lbV9jZ3JvdXBfcGdtYWpmYXVsdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgdmFsKQordm9pZCBtZW1fY2dyb3VwX3BnbWFqZmF1bHQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgdmFsKQogewotCXRoaXNfY3B1X2FkZChtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR01BSkZBVUxUXSwgdmFsKTsKKwl0aGlzX2NwdV9hZGQobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR01BSkZBVUxUXSwgdmFsKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCSAgICBlbnVtIG1lbV9jZ3JvdXBfZXZlbnRzX2luZGV4IGlkeCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CiAJaW50IGNwdTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQl2YWwgKz0gcGVyX2NwdShtZW0tPnN0YXQtPmV2ZW50c1tpZHhdLCBjcHUpOworCQl2YWwgKz0gcGVyX2NwdShtZW1jZy0+c3RhdC0+ZXZlbnRzW2lkeF0sIGNwdSk7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOwotCXZhbCArPSBtZW0tPm5vY3B1X2Jhc2UuZXZlbnRzW2lkeF07Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJc3Bpbl9sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CisJdmFsICs9IG1lbWNnLT5ub2NwdV9iYXNlLmV2ZW50c1tpZHhdOworCXNwaW5fdW5sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJIGJvb2wgZmlsZSwgaW50IG5yX3BhZ2VzKQogewogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJaWYgKGZpbGUpCi0JCV9fdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0NBQ0hFXSwgbnJfcGFnZXMpOworCQlfX3RoaXNfY3B1X2FkZChtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0NBQ0hFXSwKKwkJCQlucl9wYWdlcyk7CiAJZWxzZQotCQlfX3RoaXNfY3B1X2FkZChtZW0tPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfU1RBVF9SU1NdLCBucl9wYWdlcyk7CisJCV9fdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfUlNTXSwKKwkJCQlucl9wYWdlcyk7CiAKIAkvKiBwYWdlaW4gb2YgYSBiaWcgcGFnZSBpcyBhbiBldmVudC4gU28sIGlnbm9yZSBwYWdlIHNpemUgKi8KIAlpZiAobnJfcGFnZXMgPiAwKQotCQlfX3RoaXNfY3B1X2luYyhtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR1BHSU5dKTsKKwkJX190aGlzX2NwdV9pbmMobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19QR1BHSU5dKTsKIAllbHNlIHsKLQkJX190aGlzX2NwdV9pbmMobWVtLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVF0pOworCQlfX3RoaXNfY3B1X2luYyhtZW1jZy0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX1BHUEdPVVRdKTsKIAkJbnJfcGFnZXMgPSAtbnJfcGFnZXM7IC8qIGZvciBldmVudCAqLwogCX0KIAotCV9fdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX0NPVU5UXSwgbnJfcGFnZXMpOworCV9fdGhpc19jcHVfYWRkKG1lbWNnLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfQ09VTlRdLCBucl9wYWdlcyk7CiAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCiB1bnNpZ25lZCBsb25nCi1tZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBuaWQsIGludCB6aWQsCittZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IG5pZCwgaW50IHppZCwKIAkJCXVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CiAJZW51bSBscnVfbGlzdCBsOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKIAotCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5pZCwgemlkKTsKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKIAogCWZvcl9lYWNoX2xydShsKSB7CiAJCWlmIChCSVQobCkgJiBscnVfbWFzaykKQEAgLTY1Niw0NCArNjU5LDQ1IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1tZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCittZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCWludCBuaWQsIHVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAl1NjQgdG90YWwgPSAwOwogCWludCB6aWQ7CiAKIAlmb3IgKHppZCA9IDA7IHppZCA8IE1BWF9OUl9aT05FUzsgemlkKyspCi0JCXRvdGFsICs9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtLCBuaWQsIHppZCwgbHJ1X21hc2spOworCQl0b3RhbCArPSBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKG1lbWNnLAorCQkJCQkJbmlkLCB6aWQsIGxydV9tYXNrKTsKIAogCXJldHVybiB0b3RhbDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9ucl9scnVfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCXVuc2lnbmVkIGludCBscnVfbWFzaykKIHsKIAlpbnQgbmlkOwogCXU2NCB0b3RhbCA9IDA7CiAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5pZCwgTl9ISUdIX01FTU9SWSkKLQkJdG90YWwgKz0gbWVtX2Nncm91cF9ub2RlX25yX2xydV9wYWdlcyhtZW0sIG5pZCwgbHJ1X21hc2spOworCQl0b3RhbCArPSBtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIGxydV9tYXNrKTsKIAlyZXR1cm4gdG90YWw7CiB9CiAKLXN0YXRpYyBib29sIF9fbWVtY2dfZXZlbnRfY2hlY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IHRhcmdldCkKK3N0YXRpYyBib29sIF9fbWVtY2dfZXZlbnRfY2hlY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgdGFyZ2V0KQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBuZXh0OwogCi0JdmFsID0gdGhpc19jcHVfcmVhZChtZW0tPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19DT1VOVF0pOwotCW5leHQgPSB0aGlzX2NwdV9yZWFkKG1lbS0+c3RhdC0+dGFyZ2V0c1t0YXJnZXRdKTsKKwl2YWwgPSBfX3RoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPmV2ZW50c1tNRU1fQ0dST1VQX0VWRU5UU19DT1VOVF0pOworCW5leHQgPSBfX3RoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPnRhcmdldHNbdGFyZ2V0XSk7CiAJLyogZnJvbSB0aW1lX2FmdGVyKCkgaW4gamlmZmllcy5oICovCiAJcmV0dXJuICgobG9uZyluZXh0IC0gKGxvbmcpdmFsIDwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCB0YXJnZXQpCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCB0YXJnZXQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwsIG5leHQ7CiAKLQl2YWwgPSB0aGlzX2NwdV9yZWFkKG1lbS0+c3RhdC0+ZXZlbnRzW01FTV9DR1JPVVBfRVZFTlRTX0NPVU5UXSk7CisJdmFsID0gX190aGlzX2NwdV9yZWFkKG1lbWNnLT5zdGF0LT5ldmVudHNbTUVNX0NHUk9VUF9FVkVOVFNfQ09VTlRdKTsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0g6CkBAIC03MDksMzQgKzcxMywzNiBAQAogCQlyZXR1cm47CiAJfQogCi0JdGhpc19jcHVfd3JpdGUobWVtLT5zdGF0LT50YXJnZXRzW3RhcmdldF0sIG5leHQpOworCV9fdGhpc19jcHVfd3JpdGUobWVtY2ctPnN0YXQtPnRhcmdldHNbdGFyZ2V0XSwgbmV4dCk7CiB9CiAKIC8qCiAgKiBDaGVjayBldmVudHMgaW4gb3JkZXIuCiAgKgogICovCi1zdGF0aWMgdm9pZCBtZW1jZ19jaGVja19ldmVudHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBtZW1jZ19jaGVja19ldmVudHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKiB0aHJlc2hvbGQgZXZlbnQgaXMgdHJpZ2dlcmVkIGluIGZpbmVyIGdyYWluIHRoYW4gc29mdCBsaW1pdCAqLwotCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwgTUVNX0NHUk9VUF9UQVJHRVRfVEhSRVNIKSkpIHsKLQkJbWVtX2Nncm91cF90aHJlc2hvbGQobWVtKTsKLQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLCBNRU1fQ0dST1VQX1RBUkdFVF9USFJFU0gpOwotCQlpZiAodW5saWtlbHkoX19tZW1jZ19ldmVudF9jaGVjayhtZW0sCisJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtY2csIE1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCkpKSB7CisJCW1lbV9jZ3JvdXBfdGhyZXNob2xkKG1lbWNnKTsKKwkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtY2csIE1FTV9DR1JPVVBfVEFSR0VUX1RIUkVTSCk7CisJCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbWNnLAogCQkJICAgICBNRU1fQ0dST1VQX1RBUkdFVF9TT0ZUTElNSVQpKSkgewotCQkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW0sIHBhZ2UpOwotCQkJX19tZW1fY2dyb3VwX3RhcmdldF91cGRhdGUobWVtLAorCQkJbWVtX2Nncm91cF91cGRhdGVfdHJlZShtZW1jZywgcGFnZSk7CisJCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW1jZywKIAkJCQkJCSAgIE1FTV9DR1JPVVBfVEFSR0VUX1NPRlRMSU1JVCk7CiAJCX0KICNpZiBNQVhfTlVNTk9ERVMgPiAxCi0JCWlmICh1bmxpa2VseShfX21lbWNnX2V2ZW50X2NoZWNrKG1lbSwKKwkJaWYgKHVubGlrZWx5KF9fbWVtY2dfZXZlbnRfY2hlY2sobWVtY2csCiAJCQlNRU1fQ0dST1VQX1RBUkdFVF9OVU1BSU5GTykpKSB7Ci0JCQlhdG9taWNfaW5jKCZtZW0tPm51bWFpbmZvX2V2ZW50cyk7Ci0JCQlfX21lbV9jZ3JvdXBfdGFyZ2V0X3VwZGF0ZShtZW0sCisJCQlhdG9taWNfaW5jKCZtZW1jZy0+bnVtYWluZm9fZXZlbnRzKTsKKwkJCV9fbWVtX2Nncm91cF90YXJnZXRfdXBkYXRlKG1lbWNnLAogCQkJCU1FTV9DR1JPVVBfVEFSR0VUX05VTUFJTkZPKTsKIAkJfQogI2VuZGlmCiAJfQorCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX2NvbnQoc3RydWN0IGNncm91cCAqY29udCkKQEAgLTc2Miw3ICs3NjgsNyBAQAogCiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAogCWlmICghbW0pCiAJCXJldHVybiBOVUxMOwpAQCAtNzczLDI1ICs3NzksMjUgQEAKIAkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJZG8gewotCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7Ci0JCWlmICh1bmxpa2VseSghbWVtKSkKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7CisJCWlmICh1bmxpa2VseSghbWVtY2cpKQogCQkJYnJlYWs7Ci0JfSB3aGlsZSAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSk7CisJfSB3aGlsZSAoIWNzc190cnlnZXQoJm1lbWNnLT5jc3MpKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gbWVtOworCXJldHVybiBtZW1jZzsKIH0KIAogLyogVGhlIGNhbGxlciBoYXMgdG8gZ3VhcmFudGVlICJtZW0iIGV4aXN0cyBiZWZvcmUgY2FsbGluZyB0aGlzICovCi1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfc3RhcnRfbG9vcChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX3N0YXJ0X2xvb3Aoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7CiAJaW50IGZvdW5kOwogCi0JaWYgKCFtZW0pIC8qIFJPT1QgY2dyb3VwIGhhcyB0aGUgc21hbGxlc3QgSUQgKi8KKwlpZiAoIW1lbWNnKSAvKiBST09UIGNncm91cCBoYXMgdGhlIHNtYWxsZXN0IElEICovCiAJCXJldHVybiByb290X21lbV9jZ3JvdXA7IC8qY3NzX3B1dC9nZXQgYWdhaW5zdCByb290IGlzIGlnbm9yZWQqLwotCWlmICghbWVtLT51c2VfaGllcmFyY2h5KSB7Ci0JCWlmIChjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpCi0JCQlyZXR1cm4gbWVtOworCWlmICghbWVtY2ctPnVzZV9oaWVyYXJjaHkpIHsKKwkJaWYgKGNzc190cnlnZXQoJm1lbWNnLT5jc3MpKQorCQkJcmV0dXJuIG1lbWNnOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNzk5LDEzICs4MDUsMTMgQEAKIAkgKiBzZWFyY2hpbmcgYSBtZW1vcnkgY2dyb3VwIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgSUQgdW5kZXIgZ2l2ZW4KIAkgKiBST09UIGNncm91cC4gKElEID49IDEpCiAJICovCi0JY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgMSwgJm1lbS0+Y3NzLCAmZm91bmQpOworCWNzcyA9IGNzc19nZXRfbmV4dCgmbWVtX2Nncm91cF9zdWJzeXMsIDEsICZtZW1jZy0+Y3NzLCAmZm91bmQpOwogCWlmIChjc3MgJiYgY3NzX3RyeWdldChjc3MpKQotCQltZW0gPSBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKKwkJbWVtY2cgPSBjb250YWluZXJfb2YoY3NzLCBzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKIAllbHNlCi0JCW1lbSA9IE5VTEw7CisJCW1lbWNnID0gTlVMTDsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gbWVtOworCXJldHVybiBtZW1jZzsKIH0KIAogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2dldF9uZXh0KHN0cnVjdCBtZW1fY2dyb3VwICppdGVyLApAQCAtODU5LDI5ICs4NjUsMjkgQEAKIAlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWVfY29uZChpdGVyLCBOVUxMLCB0cnVlKQogCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2lzX3Jvb3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2lzX3Jvb3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCXJldHVybiAobWVtID09IHJvb3RfbWVtX2Nncm91cCk7CisJcmV0dXJuIChtZW1jZyA9PSByb290X21lbV9jZ3JvdXApOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfY291bnRfdm1fZXZlbnQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGVudW0gdm1fZXZlbnRfaXRlbSBpZHgpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKIAlpZiAoIW1tKQogCQlyZXR1cm47CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOwotCWlmICh1bmxpa2VseSghbWVtKSkKKwltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZShtbS0+b3duZXIpKTsKKwlpZiAodW5saWtlbHkoIW1lbWNnKSkKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgUEdNQUpGQVVMVDoKLQkJbWVtX2Nncm91cF9wZ21hamZhdWx0KG1lbSwgMSk7CisJCW1lbV9jZ3JvdXBfcGdtYWpmYXVsdChtZW1jZywgMSk7CiAJCWJyZWFrOwogCWNhc2UgUEdGQVVMVDoKLQkJbWVtX2Nncm91cF9wZ2ZhdWx0KG1lbSwgMSk7CisJCW1lbV9jZ3JvdXBfcGdmYXVsdChtZW1jZywgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtOTkwLDYgKzk5NiwxNiBAQAogCQlyZXR1cm47CiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJVk1fQlVHX09OKFBhZ2VDZ3JvdXBBY2N0TFJVKHBjKSk7CisJLyoKKwkgKiBwdXRiYWNrOgkJCQljaGFyZ2U6CisJICogU2V0UGFnZUxSVQkJCQlTZXRQYWdlQ2dyb3VwVXNlZAorCSAqIHNtcF9tYgkJCQlzbXBfbWIKKwkgKiBQYWdlQ2dyb3VwVXNlZCAmJiBhZGQgdG8gbWVtY2cgTFJVCVBhZ2VMUlUgJiYgYWRkIHRvIG1lbWNnIExSVQorCSAqCisJICogRW5zdXJlIHRoYXQgb25lIG9mIHRoZSB0d28gc2lkZXMgYWRkcyB0aGUgcGFnZSB0byB0aGUgbWVtY2cKKwkgKiBMUlUgZHVyaW5nIGEgcmFjZS4KKwkgKi8KKwlzbXBfbWIoKTsKIAlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKIAkJcmV0dXJuOwogCS8qIEVuc3VyZSBwYy0+bWVtX2Nncm91cCBpcyB2aXNpYmxlIGFmdGVyIHJlYWRpbmcgUENHX1VTRUQuICovCkBAIC0xMDQxLDcgKzEwNTcsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB6b25lICp6b25lID0gcGFnZV96b25lKHBhZ2UpOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7Ci0KKwkvKgorCSAqIHB1dGJhY2s6CQkJCWNoYXJnZToKKwkgKiBTZXRQYWdlTFJVCQkJCVNldFBhZ2VDZ3JvdXBVc2VkCisJICogc21wX21iCQkJCXNtcF9tYgorCSAqIFBhZ2VDZ3JvdXBVc2VkICYmIGFkZCB0byBtZW1jZyBMUlUJUGFnZUxSVSAmJiBhZGQgdG8gbWVtY2cgTFJVCisJICoKKwkgKiBFbnN1cmUgdGhhdCBvbmUgb2YgdGhlIHR3byBzaWRlcyBhZGRzIHRoZSBwYWdlIHRvIHRoZSBtZW1jZworCSAqIExSVSBkdXJpbmcgYSByYWNlLgorCSAqLworCXNtcF9tYigpOwogCS8qIHRha2luZyBjYXJlIG9mIHRoYXQgdGhlIHBhZ2UgaXMgYWRkZWQgdG8gTFJVIHdoaWxlIHdlIGNvbW1pdCBpdCAqLwogCWlmIChsaWtlbHkoIVBhZ2VMUlUocGFnZSkpKQogCQlyZXR1cm47CkBAIC0xMDYzLDIxICsxMDg4LDIxIEBACiB9CiAKIC8qCi0gKiBDaGVja3Mgd2hldGhlciBnaXZlbiBtZW0gaXMgc2FtZSBvciBpbiB0aGUgcm9vdF9tZW0ncworICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gbWVtIGlzIHNhbWUgb3IgaW4gdGhlIHJvb3RfbWVtX2Nncm91cCdzCiAgKiBoaWVyYXJjaHkgc3VidHJlZQogICovCi1zdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0sCi0JCXN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZywKKwkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCWlmIChyb290X21lbSAhPSBtZW0pIHsKLQkJcmV0dXJuIChyb290X21lbS0+dXNlX2hpZXJhcmNoeSAmJgotCQkJY3NzX2lzX2FuY2VzdG9yKCZtZW0tPmNzcywgJnJvb3RfbWVtLT5jc3MpKTsKKwlpZiAocm9vdF9tZW1jZyAhPSBtZW1jZykgeworCQlyZXR1cm4gKHJvb3RfbWVtY2ctPnVzZV9oaWVyYXJjaHkgJiYKKwkJCWNzc19pc19hbmNlc3RvcigmbWVtY2ctPmNzcywgJnJvb3RfbWVtY2ctPmNzcykpOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCi1pbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK2ludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqY3VyciA9IE5VTEw7CkBAIC0xMDkxLDI1ICsxMTE2LDI5IEBACiAJaWYgKCFjdXJyKQogCQlyZXR1cm4gMDsKIAkvKgotCSAqIFdlIHNob3VsZCBjaGVjayB1c2VfaGllcmFyY2h5IG9mICJtZW0iIG5vdCAiY3VyciIuIEJlY2F1c2UgY2hlY2tpbmcKKwkgKiBXZSBzaG91bGQgY2hlY2sgdXNlX2hpZXJhcmNoeSBvZiAibWVtY2ciIG5vdCAiY3VyciIuIEJlY2F1c2UgY2hlY2tpbmcKIAkgKiB1c2VfaGllcmFyY2h5IG9mICJjdXJyIiBoZXJlIG1ha2UgdGhpcyBmdW5jdGlvbiB0cnVlIGlmIGhpZXJhcmNoeSBpcwotCSAqIGVuYWJsZWQgaW4gImN1cnIiIGFuZCAiY3VyciIgaXMgYSBjaGlsZCBvZiAibWVtIiBpbiAqY2dyb3VwKgotCSAqIGhpZXJhcmNoeShldmVuIGlmIHVzZV9oaWVyYXJjaHkgaXMgZGlzYWJsZWQgaW4gIm1lbSIpLgorCSAqIGVuYWJsZWQgaW4gImN1cnIiIGFuZCAiY3VyciIgaXMgYSBjaGlsZCBvZiAibWVtY2ciIGluICpjZ3JvdXAqCisJICogaGllcmFyY2h5KGV2ZW4gaWYgdXNlX2hpZXJhcmNoeSBpcyBkaXNhYmxlZCBpbiAibWVtY2ciKS4KIAkgKi8KLQlyZXQgPSBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW0sIGN1cnIpOworCXJldCA9IG1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKG1lbWNnLCBjdXJyKTsKIAljc3NfcHV0KCZjdXJyLT5jc3MpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2FsY19pbmFjdGl2ZV9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgKnByZXNlbnRfcGFnZXMpCitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewotCXVuc2lnbmVkIGxvbmcgYWN0aXZlOwotCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBnYjsKIAl1bnNpZ25lZCBsb25nIGluYWN0aXZlX3JhdGlvOworCWludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTsKKwlpbnQgemlkID0gem9uZV9pZHgoem9uZSk7CisJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGdiOwogCi0JaW5hY3RpdmUgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9JTkFDVElWRV9BTk9OKSk7Ci0JYWN0aXZlID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKKwlpbmFjdGl2ZSA9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgemlkLAorCQkJCQkJQklUKExSVV9JTkFDVElWRV9BTk9OKSk7CisJYWN0aXZlID0gbWVtX2Nncm91cF96b25lX25yX2xydV9wYWdlcyhtZW1jZywgbmlkLCB6aWQsCisJCQkJCSAgICAgIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKIAogCWdiID0gKGluYWN0aXZlICsgYWN0aXZlKSA+PiAoMzAgLSBQQUdFX1NISUZUKTsKIAlpZiAoZ2IpCkBAIC0xMTE3LDM5ICsxMTQ2LDIwIEBACiAJZWxzZQogCQlpbmFjdGl2ZV9yYXRpbyA9IDE7CiAKLQlpZiAocHJlc2VudF9wYWdlcykgewotCQlwcmVzZW50X3BhZ2VzWzBdID0gaW5hY3RpdmU7Ci0JCXByZXNlbnRfcGFnZXNbMV0gPSBhY3RpdmU7Ci0JfQotCi0JcmV0dXJuIGluYWN0aXZlX3JhdGlvOworCXJldHVybiBpbmFjdGl2ZSAqIGluYWN0aXZlX3JhdGlvIDwgYWN0aXZlOwogfQogCi1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQogewogCXVuc2lnbmVkIGxvbmcgYWN0aXZlOwogCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBwcmVzZW50X3BhZ2VzWzJdOwotCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfcmF0aW87CisJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOworCWludCBuaWQgPSB6b25lX3RvX25pZCh6b25lKTsKIAotCWluYWN0aXZlX3JhdGlvID0gY2FsY19pbmFjdGl2ZV9yYXRpbyhtZW1jZywgcHJlc2VudF9wYWdlcyk7Ci0KLQlpbmFjdGl2ZSA9IHByZXNlbnRfcGFnZXNbMF07Ci0JYWN0aXZlID0gcHJlc2VudF9wYWdlc1sxXTsKLQotCWlmIChpbmFjdGl2ZSAqIGluYWN0aXZlX3JhdGlvIDwgYWN0aXZlKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9maWxlX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCi17Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKLQotCWluYWN0aXZlID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfSU5BQ1RJVkVfRklMRSkpOwotCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CisJaW5hY3RpdmUgPSBtZW1fY2dyb3VwX3pvbmVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIHppZCwKKwkJCQkJCUJJVChMUlVfSU5BQ1RJVkVfRklMRSkpOworCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfem9uZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgemlkLAorCQkJCQkgICAgICBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CiAKIAlyZXR1cm4gKGFjdGl2ZSA+IGluYWN0aXZlKTsKIH0KQEAgLTExODUsNyArMTE5NSw4IEBACiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKIAkJCQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLAotCQkJCQlpbnQgbW9kZSwgc3RydWN0IHpvbmUgKnosCisJCQkJCWlzb2xhdGVfbW9kZV90IG1vZGUsCisJCQkJCXN0cnVjdCB6b25lICp6LAogCQkJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQsCiAJCQkJCWludCBhY3RpdmUsIGludCBmaWxlKQogewpAQCAtMTI1MywxMyArMTI2NCwxMyBAQAogICogUmV0dXJucyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IEBtZW0gY2FuIGJlIGNoYXJnZWQgd2l0aCwgaW4KICAqIHBhZ2VzLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX21hcmdpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9tYXJnaW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXJnaW47CiAKLQltYXJnaW4gPSByZXNfY291bnRlcl9tYXJnaW4oJm1lbS0+cmVzKTsKKwltYXJnaW4gPSByZXNfY291bnRlcl9tYXJnaW4oJm1lbWNnLT5yZXMpOwogCWlmIChkb19zd2FwX2FjY291bnQpCi0JCW1hcmdpbiA9IG1pbihtYXJnaW4sIHJlc19jb3VudGVyX21hcmdpbigmbWVtLT5tZW1zdykpOworCQltYXJnaW4gPSBtaW4obWFyZ2luLCByZXNfY291bnRlcl9tYXJnaW4oJm1lbWNnLT5tZW1zdykpOwogCXJldHVybiBtYXJnaW4gPj4gUEFHRV9TSElGVDsKIH0KIApAQCAtMTI3NCwzMyArMTI4NSwzMyBAQAogCXJldHVybiBtZW1jZy0+c3dhcHBpbmVzczsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9zdGFydF9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3N0YXJ0X21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBjcHU7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKLQlzcGluX2xvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJc3Bpbl9sb2NrKCZtZW1jZy0+cGNwX2NvdW50ZXJfbG9jayk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXBlcl9jcHUobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdLCBjcHUpICs9IDE7Ci0JbWVtLT5ub2NwdV9iYXNlLmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0gKz0gMTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwkJcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSArPSAxOworCW1lbWNnLT5ub2NwdV9iYXNlLmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0gKz0gMTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZW5kX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZW5kX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBjcHU7CiAKLQlpZiAoIW1lbSkKKwlpZiAoIW1lbWNnKQogCQlyZXR1cm47CiAJZ2V0X29ubGluZV9jcHVzKCk7Ci0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOworCXNwaW5fbG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSAtPSAxOwotCW1lbS0+bm9jcHVfYmFzZS5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdIC09IDE7Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJCXBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0sIGNwdSkgLT0gMTsKKwltZW1jZy0+bm9jcHVfYmFzZS5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdIC09IDE7CisJc3Bpbl91bmxvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIC8qCkBAIC0xMzE1LDEzICsxMzI2LDEzIEBACiAgKgkJCSAgd2FpdGluZyBhdCBoaXRoLW1lbW9yeSBwcnJlc3N1cmUgY2F1c2VkIGJ5ICJtb3ZlIi4KICAqLwogCi1zdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3N0ZWFsZWQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfc3RlYWxlZChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJVk1fQlVHX09OKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0JcmV0dXJuIHRoaXNfY3B1X3JlYWQobWVtLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX09OX01PVkVdKSA+IDA7CisJcmV0dXJuIHRoaXNfY3B1X3JlYWQobWVtY2ctPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfT05fTU9WRV0pID4gMDsKIH0KIAotc3RhdGljIGJvb2wgbWVtX2Nncm91cF91bmRlcl9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX3VuZGVyX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICpmcm9tOwogCXN0cnVjdCBtZW1fY2dyb3VwICp0bzsKQEAgLTEzMzYsMTcgKzEzNDcsMTcgQEAKIAlpZiAoIWZyb20pCiAJCWdvdG8gdW5sb2NrOwogCi0JcmV0ID0gbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUobWVtLCBmcm9tKQotCQl8fCBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW0sIHRvKTsKKwlyZXQgPSBtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShtZW1jZywgZnJvbSkKKwkJfHwgbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUobWVtY2csIHRvKTsKIHVubG9jazoKIAlzcGluX3VubG9jaygmbWMubG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgbWVtX2Nncm91cF93YWl0X2FjY3RfbW92ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGJvb2wgbWVtX2Nncm91cF93YWl0X2FjY3RfbW92ZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaWYgKG1jLm1vdmluZ190YXNrICYmIGN1cnJlbnQgIT0gbWMubW92aW5nX3Rhc2spIHsKLQkJaWYgKG1lbV9jZ3JvdXBfdW5kZXJfbW92ZShtZW0pKSB7CisJCWlmIChtZW1fY2dyb3VwX3VuZGVyX21vdmUobWVtY2cpKSB7CiAJCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJCXByZXBhcmVfdG9fd2FpdCgmbWMud2FpdHEsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJLyogbW92aW5nIGNoYXJnZSBjb250ZXh0IG1pZ2h0IGhhdmUgZmluaXNoZWQuICovCkBAIC0xNDMwLDEyICsxNDQxLDEyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBtZW1jZyB1bmRlciBoaWVyYXJjaHkgdHJlZS4gUmV0dXJucwogICogMShzZWxmIGNvdW50KSBpZiBubyBjaGlsZHJlbi4KICAqLwotc3RhdGljIGludCBtZW1fY2dyb3VwX2NvdW50X2NoaWxkcmVuKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfY291bnRfY2hpbGRyZW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBudW0gPSAwOwogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyOwogCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbSkKKwlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtY2cpCiAJCW51bSsrOwogCXJldHVybiBudW07CiB9CkBAIC0xNDY1LDIxICsxNDc2LDIxIEBACiAgKiB0aGF0IHRvIHJlY2xhaW0gZnJlZSBwYWdlcyBmcm9tLgogICovCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKgotbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSkKK21lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbShzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqcmV0ID0gTlVMTDsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwogCWludCBuZXh0aWQsIGZvdW5kOwogCi0JaWYgKCFyb290X21lbS0+dXNlX2hpZXJhcmNoeSkgewotCQljc3NfZ2V0KCZyb290X21lbS0+Y3NzKTsKLQkJcmV0ID0gcm9vdF9tZW07CisJaWYgKCFyb290X21lbWNnLT51c2VfaGllcmFyY2h5KSB7CisJCWNzc19nZXQoJnJvb3RfbWVtY2ctPmNzcyk7CisJCXJldCA9IHJvb3RfbWVtY2c7CiAJfQogCiAJd2hpbGUgKCFyZXQpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluZXh0aWQgPSByb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkICsgMTsKLQkJY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgbmV4dGlkLCAmcm9vdF9tZW0tPmNzcywKKwkJbmV4dGlkID0gcm9vdF9tZW1jZy0+bGFzdF9zY2FubmVkX2NoaWxkICsgMTsKKwkJY3NzID0gY3NzX2dldF9uZXh0KCZtZW1fY2dyb3VwX3N1YnN5cywgbmV4dGlkLCAmcm9vdF9tZW1jZy0+Y3NzLAogCQkJCSAgICZmb3VuZCk7CiAJCWlmIChjc3MgJiYgY3NzX3RyeWdldChjc3MpKQogCQkJcmV0ID0gY29udGFpbmVyX29mKGNzcywgc3RydWN0IG1lbV9jZ3JvdXAsIGNzcyk7CkBAIC0xNDg4LDkgKzE0OTksOSBAQAogCQkvKiBVcGRhdGVzIHNjYW5uaW5nIHBhcmFtZXRlciAqLwogCQlpZiAoIWNzcykgewogCQkJLyogdGhpcyBtZWFucyBzdGFydCBzY2FuIGZyb20gSUQ6MSAqLwotCQkJcm9vdF9tZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IDA7CisJCQlyb290X21lbWNnLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSAwOwogCQl9IGVsc2UKLQkJCXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBmb3VuZDsKKwkJCXJvb3RfbWVtY2ctPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IGZvdW5kOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNTA2LDE0ICsxNTE3LDE0IEBACiAgKiByZWNsYWltYWJsZSBwYWdlcyBvbiBhIG5vZGUuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHJlY2xhaW1hYmxlCiAgKiBwYWdlcyBpbiB0aGUgbm9kZS4KICAqLwotc3RhdGljIGJvb2wgdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKK3N0YXRpYyBib29sIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJaW50IG5pZCwgYm9vbCBub3N3YXApCiB7Ci0JaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtLCBuaWQsIExSVV9BTExfRklMRSkpCisJaWYgKG1lbV9jZ3JvdXBfbm9kZV9ucl9scnVfcGFnZXMobWVtY2csIG5pZCwgTFJVX0FMTF9GSUxFKSkKIAkJcmV0dXJuIHRydWU7CiAJaWYgKG5vc3dhcCB8fCAhdG90YWxfc3dhcF9wYWdlcykKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbSwgbmlkLCBMUlVfQUxMX0FOT04pKQorCWlmIChtZW1fY2dyb3VwX25vZGVfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBuaWQsIExSVV9BTExfQU5PTikpCiAJCXJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIApAQCAtMTUyNiwyOSArMTUzNywyOSBAQAogICogbm9kZXMgYmFzZWQgb24gdGhlIHpvbmVsaXN0LiBTbyB1cGRhdGUgdGhlIGxpc3QgbG9vc2VseSBvbmNlIHBlciAxMCBzZWNzLgogICoKICAqLwotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXlfdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21heV91cGRhdGVfbm9kZW1hc2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWludCBuaWQ7CiAJLyoKIAkgKiBudW1haW5mb19ldmVudHMgPiAwIG1lYW5zIHRoZXJlIHdhcyBhdCBsZWFzdCBOVU1BSU5GT19FVkVOVFNfVEFSR0VUCiAJICogcGFnZWluL3BhZ2VvdXQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCiAJICovCi0JaWYgKCFhdG9taWNfcmVhZCgmbWVtLT5udW1haW5mb19ldmVudHMpKQorCWlmICghYXRvbWljX3JlYWQoJm1lbWNnLT5udW1haW5mb19ldmVudHMpKQogCQlyZXR1cm47Ci0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtZW0tPm51bWFpbmZvX3VwZGF0aW5nKSA+IDEpCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtZW1jZy0+bnVtYWluZm9fdXBkYXRpbmcpID4gMSkKIAkJcmV0dXJuOwogCiAJLyogbWFrZSBhIG5vZGVtYXNrIHdoZXJlIHRoaXMgbWVtY2cgdXNlcyBtZW1vcnkgZnJvbSAqLwotCW1lbS0+c2Nhbl9ub2RlcyA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOworCW1lbWNnLT5zY2FuX25vZGVzID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CiAKIAlmb3JfZWFjaF9ub2RlX21hc2sobmlkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkgewogCi0JCWlmICghdGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIGZhbHNlKSkKLQkJCW5vZGVfY2xlYXIobmlkLCBtZW0tPnNjYW5fbm9kZXMpOworCQlpZiAoIXRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbWNnLCBuaWQsIGZhbHNlKSkKKwkJCW5vZGVfY2xlYXIobmlkLCBtZW1jZy0+c2Nhbl9ub2Rlcyk7CiAJfQogCi0JYXRvbWljX3NldCgmbWVtLT5udW1haW5mb19ldmVudHMsIDApOwotCWF0b21pY19zZXQoJm1lbS0+bnVtYWluZm9fdXBkYXRpbmcsIDApOworCWF0b21pY19zZXQoJm1lbWNnLT5udW1haW5mb19ldmVudHMsIDApOworCWF0b21pY19zZXQoJm1lbWNnLT5udW1haW5mb191cGRhdGluZywgMCk7CiB9CiAKIC8qCkBAIC0xNTYzLDE2ICsxNTc0LDE2IEBACiAgKgogICogTm93LCB3ZSB1c2Ugcm91bmQtcm9iaW4uIEJldHRlciBhbGdvcml0aG0gaXMgd2VsY29tZWQuCiAgKi8KLWludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoraW50IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbV9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZTsKIAotCW1lbV9jZ3JvdXBfbWF5X3VwZGF0ZV9ub2RlbWFzayhtZW0pOwotCW5vZGUgPSBtZW0tPmxhc3Rfc2Nhbm5lZF9ub2RlOworCW1lbV9jZ3JvdXBfbWF5X3VwZGF0ZV9ub2RlbWFzayhtZW1jZyk7CisJbm9kZSA9IG1lbWNnLT5sYXN0X3NjYW5uZWRfbm9kZTsKIAotCW5vZGUgPSBuZXh0X25vZGUobm9kZSwgbWVtLT5zY2FuX25vZGVzKTsKKwlub2RlID0gbmV4dF9ub2RlKG5vZGUsIG1lbWNnLT5zY2FuX25vZGVzKTsKIAlpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpCi0JCW5vZGUgPSBmaXJzdF9ub2RlKG1lbS0+c2Nhbl9ub2Rlcyk7CisJCW5vZGUgPSBmaXJzdF9ub2RlKG1lbWNnLT5zY2FuX25vZGVzKTsKIAkvKgogCSAqIFdlIGNhbGwgdGhpcyB3aGVuIHdlIGhpdCBsaW1pdCwgbm90IHdoZW4gcGFnZXMgYXJlIGFkZGVkIHRvIExSVS4KIAkgKiBObyBMUlUgbWF5IGhvbGQgcGFnZXMgYmVjYXVzZSBhbGwgcGFnZXMgYXJlIFVORVZJQ1RBQkxFIG9yCkBAIC0xNTgyLDcgKzE1OTMsNyBAQAogCWlmICh1bmxpa2VseShub2RlID09IE1BWF9OVU1OT0RFUykpCiAJCW5vZGUgPSBudW1hX25vZGVfaWQoKTsKIAotCW1lbS0+bGFzdF9zY2FubmVkX25vZGUgPSBub2RlOworCW1lbWNnLT5sYXN0X3NjYW5uZWRfbm9kZSA9IG5vZGU7CiAJcmV0dXJuIG5vZGU7CiB9CiAKQEAgLTE1OTIsNyArMTYwMyw3IEBACiAgKiB1bnVzZWQgbm9kZXMuIEJ1dCBzY2FuX25vZGVzIGlzIGxhemlseSB1cGRhdGVkIGFuZCBtYXkgbm90IGNvdGFpbgogICogZW5vdWdoIG5ldyBpbmZvcm1hdGlvbi4gV2UgbmVlZCB0byBkbyBkb3VibGUgY2hlY2suCiAgKi8KLWJvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgbm9zd2FwKQogewogCWludCBuaWQ7CiAKQEAgLTE2MDAsMTIgKzE2MTEsMTIgQEAKIAkgKiBxdWljayBjaGVjay4uLm1ha2luZyB1c2Ugb2Ygc2Nhbl9ub2RlLgogCSAqIFdlIGNhbiBza2lwIHVudXNlZCBub2Rlcy4KIAkgKi8KLQlpZiAoIW5vZGVzX2VtcHR5KG1lbS0+c2Nhbl9ub2RlcykpIHsKLQkJZm9yIChuaWQgPSBmaXJzdF9ub2RlKG1lbS0+c2Nhbl9ub2Rlcyk7CisJaWYgKCFub2Rlc19lbXB0eShtZW1jZy0+c2Nhbl9ub2RlcykpIHsKKwkJZm9yIChuaWQgPSBmaXJzdF9ub2RlKG1lbWNnLT5zY2FuX25vZGVzKTsKIAkJICAgICBuaWQgPCBNQVhfTlVNTk9ERVM7Ci0JCSAgICAgbmlkID0gbmV4dF9ub2RlKG5pZCwgbWVtLT5zY2FuX25vZGVzKSkgeworCQkgICAgIG5pZCA9IG5leHRfbm9kZShuaWQsIG1lbWNnLT5zY2FuX25vZGVzKSkgewogCi0JCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtLCBuaWQsIG5vc3dhcCkpCisJCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtY2csIG5pZCwgbm9zd2FwKSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KQEAgLTE2MTMsMjMgKzE2MjQsMjMgQEAKIAkgKiBDaGVjayByZXN0IG9mIG5vZGVzLgogCSAqLwogCWZvcl9lYWNoX25vZGVfc3RhdGUobmlkLCBOX0hJR0hfTUVNT1JZKSB7Ci0JCWlmIChub2RlX2lzc2V0KG5pZCwgbWVtLT5zY2FuX25vZGVzKSkKKwkJaWYgKG5vZGVfaXNzZXQobmlkLCBtZW1jZy0+c2Nhbl9ub2RlcykpCiAJCQljb250aW51ZTsKLQkJaWYgKHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbSwgbmlkLCBub3N3YXApKQorCQlpZiAodGVzdF9tZW1fY2dyb3VwX25vZGVfcmVjbGFpbWFibGUobWVtY2csIG5pZCwgbm9zd2FwKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CiAKICNlbHNlCi1pbnQgbWVtX2Nncm91cF9zZWxlY3RfdmljdGltX25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK2ludCBtZW1fY2dyb3VwX3NlbGVjdF92aWN0aW1fbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLWJvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIG5vc3dhcCkKK2Jvb2wgbWVtX2Nncm91cF9yZWNsYWltYWJsZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGJvb2wgbm9zd2FwKQogewotCXJldHVybiB0ZXN0X21lbV9jZ3JvdXBfbm9kZV9yZWNsYWltYWJsZShtZW0sIDAsIG5vc3dhcCk7CisJcmV0dXJuIHRlc3RfbWVtX2Nncm91cF9ub2RlX3JlY2xhaW1hYmxlKG1lbWNnLCAwLCBub3N3YXApOwogfQogI2VuZGlmCiAKQEAgLTE2MzgsMTQgKzE2NDksMTQgQEAKICAqIHdlIHJlY2xhaW1lZCBmcm9tLCBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBwZW5hbGl6aW5nIG9uZSBjaGlsZCBleHRlbnNpdmVseQogICogYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHRoZSBjaGlsZHJlbiBsaXN0LgogICoKLSAqIHJvb3RfbWVtIGlzIHRoZSBvcmlnaW5hbCBhbmNlc3RvciB0aGF0IHdlJ3ZlIGJlZW4gcmVjbGFpbSBmcm9tLgorICogcm9vdF9tZW1jZyBpcyB0aGUgb3JpZ2luYWwgYW5jZXN0b3IgdGhhdCB3ZSd2ZSBiZWVuIHJlY2xhaW0gZnJvbS4KICAqCi0gKiBXZSBnaXZlIHVwIGFuZCByZXR1cm4gdG8gdGhlIGNhbGxlciB3aGVuIHdlIHZpc2l0IHJvb3RfbWVtIHR3aWNlLgorICogV2UgZ2l2ZSB1cCBhbmQgcmV0dXJuIHRvIHRoZSBjYWxsZXIgd2hlbiB3ZSB2aXNpdCByb290X21lbWNnIHR3aWNlLgogICogKG90aGVyIGdyb3VwcyBjYW4gYmUgcmVtb3ZlZCB3aGlsZSB3ZSdyZSB3YWxraW5nLi4uLikKICAqCiAgKiBJZiBzaHJpbms9PXRydWUsIGZvciBhdm9pZGluZyB0byBmcmVlIHRvbyBtdWNoLCB0aGlzIHJldHVybnMgaW1tZWRpZWF0ZWx5LgogICovCi1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtLAorc3RhdGljIGludCBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnLAogCQkJCQkJc3RydWN0IHpvbmUgKnpvbmUsCiAJCQkJCQlnZnBfdCBnZnBfbWFzaywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcmVjbGFpbV9vcHRpb25zLApAQCAtMTY2MCwxNSArMTY3MSwxNSBAQAogCXVuc2lnbmVkIGxvbmcgZXhjZXNzOwogCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZDsKIAotCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbS0+cmVzKSA+PiBQQUdFX1NISUZUOworCWV4Y2VzcyA9IHJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbWNnLT5yZXMpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKiBJZiBtZW1zd19pc19taW5pbXVtPT0xLCBzd2FwLW91dCBpcyBvZi1uby11c2UuICovCi0JaWYgKCFjaGVja19zb2Z0ICYmICFzaHJpbmsgJiYgcm9vdF9tZW0tPm1lbXN3X2lzX21pbmltdW0pCisJaWYgKCFjaGVja19zb2Z0ICYmICFzaHJpbmsgJiYgcm9vdF9tZW1jZy0+bWVtc3dfaXNfbWluaW11bSkKIAkJbm9zd2FwID0gdHJ1ZTsKIAogCXdoaWxlICgxKSB7Ci0JCXZpY3RpbSA9IG1lbV9jZ3JvdXBfc2VsZWN0X3ZpY3RpbShyb290X21lbSk7Ci0JCWlmICh2aWN0aW0gPT0gcm9vdF9tZW0pIHsKKwkJdmljdGltID0gbWVtX2Nncm91cF9zZWxlY3RfdmljdGltKHJvb3RfbWVtY2cpOworCQlpZiAodmljdGltID09IHJvb3RfbWVtY2cpIHsKIAkJCWxvb3ArKzsKIAkJCS8qCiAJCQkgKiBXZSBhcmUgbm90IGRyYWluaW5nIHBlciBjcHUgY2FjaGVkIGNoYXJnZXMgZHVyaW5nCkBAIC0xNjc3LDcgKzE2ODgsNyBAQAogCQkJICogY2hhcmdlcyB3aWxsIG5vdCBnaXZlIGFueS4KIAkJCSAqLwogCQkJaWYgKCFjaGVja19zb2Z0ICYmIGxvb3AgPj0gMSkKLQkJCQlkcmFpbl9hbGxfc3RvY2tfYXN5bmMocm9vdF9tZW0pOworCQkJCWRyYWluX2FsbF9zdG9ja19hc3luYyhyb290X21lbWNnKTsKIAkJCWlmIChsb29wID49IDIpIHsKIAkJCQkvKgogCQkJCSAqIElmIHdlIGhhdmUgbm90IGJlZW4gYWJsZSB0byByZWNsYWltCkBAIC0xNzI0LDkgKzE3MzUsOSBAQAogCQkJcmV0dXJuIHJldDsKIAkJdG90YWwgKz0gcmV0OwogCQlpZiAoY2hlY2tfc29mdCkgewotCQkJaWYgKCFyZXNfY291bnRlcl9zb2Z0X2xpbWl0X2V4Y2Vzcygmcm9vdF9tZW0tPnJlcykpCisJCQlpZiAoIXJlc19jb3VudGVyX3NvZnRfbGltaXRfZXhjZXNzKCZyb290X21lbWNnLT5yZXMpKQogCQkJCXJldHVybiB0b3RhbDsKLQkJfSBlbHNlIGlmIChtZW1fY2dyb3VwX21hcmdpbihyb290X21lbSkpCisJCX0gZWxzZSBpZiAobWVtX2Nncm91cF9tYXJnaW4ocm9vdF9tZW1jZykpCiAJCQlyZXR1cm4gdG90YWw7CiAJfQogCXJldHVybiB0b3RhbDsKQEAgLTE3MzcsMTIgKzE3NDgsMTIgQEAKICAqIElmIHNvbWVvbmUgaXMgcnVubmluZywgcmV0dXJuIGZhbHNlLgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIG1lbWNnX29vbV9sb2NrCiAgKi8KLXN0YXRpYyBib29sIG1lbV9jZ3JvdXBfb29tX2xvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfb29tX2xvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyLCAqZmFpbGVkID0gTlVMTDsKIAlib29sIGNvbmQgPSB0cnVlOwogCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlX2NvbmQoaXRlciwgbWVtLCBjb25kKSB7CisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlX2NvbmQoaXRlciwgbWVtY2csIGNvbmQpIHsKIAkJaWYgKGl0ZXItPm9vbV9sb2NrKSB7CiAJCQkvKgogCQkJICogdGhpcyBzdWJ0cmVlIG9mIG91ciBoaWVyYXJjaHkgaXMgYWxyZWFkeSBsb2NrZWQKQEAgLTE3NjIsNyArMTc3Myw3IEBACiAJICogd2hhdCB3ZSBzZXQgdXAgdG8gdGhlIGZhaWxpbmcgc3VidHJlZQogCSAqLwogCWNvbmQgPSB0cnVlOwotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZV9jb25kKGl0ZXIsIG1lbSwgY29uZCkgeworCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZV9jb25kKGl0ZXIsIG1lbWNnLCBjb25kKSB7CiAJCWlmIChpdGVyID09IGZhaWxlZCkgewogCQkJY29uZCA9IGZhbHNlOwogCQkJY29udGludWU7CkBAIC0xNzc1LDI0ICsxNzg2LDI0IEBACiAvKgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIG1lbWNnX29vbV9sb2NrCiAgKi8KLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9vb21fdW5sb2NrKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX3VubG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJaXRlci0+b29tX2xvY2sgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJYXRvbWljX2luYygmaXRlci0+dW5kZXJfb29tKTsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF91bm1hcmtfdW5kZXJfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3VubWFya191bmRlcl9vb20oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyOwogCkBAIC0xODAxLDcgKzE4MTIsNyBAQAogCSAqIG1lbV9jZ3JvdXBfb29tX2xvY2soKSBtYXkgbm90IGJlIGNhbGxlZC4gV2UgaGF2ZSB0byB1c2UKIAkgKiBhdG9taWNfYWRkX3VubGVzcygpIGhlcmUuCiAJICovCi0JZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbSkKKwlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtY2cpCiAJCWF0b21pY19hZGRfdW5sZXNzKCZpdGVyLT51bmRlcl9vb20sIC0xLCAwKTsKIH0KIApAQCAtMTgxNiw4NSArMTgyNyw4NSBAQAogc3RhdGljIGludCBtZW1jZ19vb21fd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsCiAJdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqd2FrZV9tZW0gPSAoc3RydWN0IG1lbV9jZ3JvdXAgKilhcmcsCi0JCQkgICpvb21fd2FpdF9tZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKndha2VfbWVtY2cgPSAoc3RydWN0IG1lbV9jZ3JvdXAgKilhcmcsCisJCQkgICpvb21fd2FpdF9tZW1jZzsKIAlzdHJ1Y3Qgb29tX3dhaXRfaW5mbyAqb29tX3dhaXRfaW5mbzsKIAogCW9vbV93YWl0X2luZm8gPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IG9vbV93YWl0X2luZm8sIHdhaXQpOwotCW9vbV93YWl0X21lbSA9IG9vbV93YWl0X2luZm8tPm1lbTsKKwlvb21fd2FpdF9tZW1jZyA9IG9vbV93YWl0X2luZm8tPm1lbTsKIAogCS8qCiAJICogQm90aCBvZiBvb21fd2FpdF9pbmZvLT5tZW0gYW5kIHdha2VfbWVtIGFyZSBzdGFibGUgdW5kZXIgdXMuCiAJICogVGhlbiB3ZSBjYW4gdXNlIGNzc19pc19hbmNlc3RvciB3aXRob3V0IHRha2luZyBjYXJlIG9mIFJDVS4KIAkgKi8KLQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKG9vbV93YWl0X21lbSwgd2FrZV9tZW0pCi0JCQkmJiAhbWVtX2Nncm91cF9zYW1lX29yX3N1YnRyZWUod2FrZV9tZW0sIG9vbV93YWl0X21lbSkpCisJaWYgKCFtZW1fY2dyb3VwX3NhbWVfb3Jfc3VidHJlZShvb21fd2FpdF9tZW1jZywgd2FrZV9tZW1jZykKKwkJJiYgIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHdha2VfbWVtY2csIG9vbV93YWl0X21lbWNnKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0LCBtb2RlLCBzeW5jLCBhcmcpOwogfQogCi1zdGF0aWMgdm9pZCBtZW1jZ193YWtldXBfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1jZ193YWtldXBfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKLQkvKiBmb3IgZmlsdGVyaW5nLCBwYXNzICJtZW0iIGFzIGFyZ3VtZW50LiAqLwotCV9fd2FrZV91cCgmbWVtY2dfb29tX3dhaXRxLCBUQVNLX05PUk1BTCwgMCwgbWVtKTsKKwkvKiBmb3IgZmlsdGVyaW5nLCBwYXNzICJtZW1jZyIgYXMgYXJndW1lbnQuICovCisJX193YWtlX3VwKCZtZW1jZ19vb21fd2FpdHEsIFRBU0tfTk9STUFMLCAwLCBtZW1jZyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbWNnX29vbV9yZWNvdmVyKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1jZ19vb21fcmVjb3ZlcihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JaWYgKG1lbSAmJiBhdG9taWNfcmVhZCgmbWVtLT51bmRlcl9vb20pKQotCQltZW1jZ193YWtldXBfb29tKG1lbSk7CisJaWYgKG1lbWNnICYmIGF0b21pY19yZWFkKCZtZW1jZy0+dW5kZXJfb29tKSkKKwkJbWVtY2dfd2FrZXVwX29vbShtZW1jZyk7CiB9CiAKIC8qCiAgKiB0cnkgdG8gY2FsbCBPT00ga2lsbGVyLiByZXR1cm5zIGZhbHNlIGlmIHdlIHNob3VsZCBleGl0IG1lbW9yeS1yZWNsYWltIGxvb3AuCiAgKi8KLWJvb2wgbWVtX2Nncm91cF9oYW5kbGVfb29tKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGdmcF90IG1hc2spCitib29sIG1lbV9jZ3JvdXBfaGFuZGxlX29vbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IG1hc2spCiB7CiAJc3RydWN0IG9vbV93YWl0X2luZm8gb3dhaXQ7CiAJYm9vbCBsb2NrZWQsIG5lZWRfdG9fa2lsbDsKIAotCW93YWl0Lm1lbSA9IG1lbTsKKwlvd2FpdC5tZW0gPSBtZW1jZzsKIAlvd2FpdC53YWl0LmZsYWdzID0gMDsKIAlvd2FpdC53YWl0LmZ1bmMgPSBtZW1jZ19vb21fd2FrZV9mdW5jdGlvbjsKIAlvd2FpdC53YWl0LnByaXZhdGUgPSBjdXJyZW50OwogCUlOSVRfTElTVF9IRUFEKCZvd2FpdC53YWl0LnRhc2tfbGlzdCk7CiAJbmVlZF90b19raWxsID0gdHJ1ZTsKLQltZW1fY2dyb3VwX21hcmtfdW5kZXJfb29tKG1lbSk7CisJbWVtX2Nncm91cF9tYXJrX3VuZGVyX29vbShtZW1jZyk7CiAKLQkvKiBBdCBmaXJzdCwgdHJ5IHRvIE9PTSBsb2NrIGhpZXJhcmNoeSB1bmRlciBtZW0uKi8KKwkvKiBBdCBmaXJzdCwgdHJ5IHRvIE9PTSBsb2NrIGhpZXJhcmNoeSB1bmRlciBtZW1jZy4qLwogCXNwaW5fbG9jaygmbWVtY2dfb29tX2xvY2spOwotCWxvY2tlZCA9IG1lbV9jZ3JvdXBfb29tX2xvY2sobWVtKTsKKwlsb2NrZWQgPSBtZW1fY2dyb3VwX29vbV9sb2NrKG1lbWNnKTsKIAkvKgogCSAqIEV2ZW4gaWYgc2lnbmFsX3BlbmRpbmcoKSwgd2UgY2FuJ3QgcXVpdCBjaGFyZ2UoKSBsb29wIHdpdGhvdXQKIAkgKiBhY2NvdW50aW5nLiBTbywgVU5JTlRFUlJVUFRJQkxFIGlzIGFwcHJvcHJpYXRlLiBCdXQgU0lHS0lMTAogCSAqIHVuZGVyIE9PTSBpcyBhbHdheXMgd2VsY29tZWQsIHVzZSBUQVNLX0tJTExBQkxFIGhlcmUuCiAJICovCiAJcHJlcGFyZV90b193YWl0KCZtZW1jZ19vb21fd2FpdHEsICZvd2FpdC53YWl0LCBUQVNLX0tJTExBQkxFKTsKLQlpZiAoIWxvY2tlZCB8fCBtZW0tPm9vbV9raWxsX2Rpc2FibGUpCisJaWYgKCFsb2NrZWQgfHwgbWVtY2ctPm9vbV9raWxsX2Rpc2FibGUpCiAJCW5lZWRfdG9fa2lsbCA9IGZhbHNlOwogCWlmIChsb2NrZWQpCi0JCW1lbV9jZ3JvdXBfb29tX25vdGlmeShtZW0pOworCQltZW1fY2dyb3VwX29vbV9ub3RpZnkobWVtY2cpOwogCXNwaW5fdW5sb2NrKCZtZW1jZ19vb21fbG9jayk7CiAKIAlpZiAobmVlZF90b19raWxsKSB7CiAJCWZpbmlzaF93YWl0KCZtZW1jZ19vb21fd2FpdHEsICZvd2FpdC53YWl0KTsKLQkJbWVtX2Nncm91cF9vdXRfb2ZfbWVtb3J5KG1lbSwgbWFzayk7CisJCW1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShtZW1jZywgbWFzayk7CiAJfSBlbHNlIHsKIAkJc2NoZWR1bGUoKTsKIAkJZmluaXNoX3dhaXQoJm1lbWNnX29vbV93YWl0cSwgJm93YWl0LndhaXQpOwogCX0KIAlzcGluX2xvY2soJm1lbWNnX29vbV9sb2NrKTsKIAlpZiAobG9ja2VkKQotCQltZW1fY2dyb3VwX29vbV91bmxvY2sobWVtKTsKLQltZW1jZ193YWtldXBfb29tKG1lbSk7CisJCW1lbV9jZ3JvdXBfb29tX3VubG9jayhtZW1jZyk7CisJbWVtY2dfd2FrZXVwX29vbShtZW1jZyk7CiAJc3Bpbl91bmxvY2soJm1lbWNnX29vbV9sb2NrKTsKIAotCW1lbV9jZ3JvdXBfdW5tYXJrX3VuZGVyX29vbShtZW0pOworCW1lbV9jZ3JvdXBfdW5tYXJrX3VuZGVyX29vbShtZW1jZyk7CiAKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSB8fCBmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuIGZhbHNlOwogCS8qIEdpdmUgY2hhbmNlIHRvIGR5aW5nIHByb2Nlc3MgKi8KLQlzY2hlZHVsZV90aW1lb3V0KDEpOworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xOTI1LDcgKzE5MzYsNyBAQAogdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV9wYWdlX3N0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJIGVudW0gbWVtX2Nncm91cF9wYWdlX3N0YXRfaXRlbSBpZHgsIGludCB2YWwpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAlib29sIG5lZWRfdW5sb2NrID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihmbGFncyk7CkBAIC0xOTM0LDE2ICsxOTQ1LDE2IEBACiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBwYy0+bWVtX2Nncm91cDsKLQlpZiAodW5saWtlbHkoIW1lbSB8fCAhUGFnZUNncm91cFVzZWQocGMpKSkKKwltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOworCWlmICh1bmxpa2VseSghbWVtY2cgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkpCiAJCWdvdG8gb3V0OwogCS8qIHBjLT5tZW1fY2dyb3VwIGlzIHVuc3RhYmxlID8gKi8KLQlpZiAodW5saWtlbHkobWVtX2Nncm91cF9zdGVhbGVkKG1lbSkpIHx8IFBhZ2VUcmFuc0h1Z2UocGFnZSkpIHsKKwlpZiAodW5saWtlbHkobWVtX2Nncm91cF9zdGVhbGVkKG1lbWNnKSkgfHwgUGFnZVRyYW5zSHVnZShwYWdlKSkgewogCQkvKiB0YWtlIGEgbG9jayBhZ2FpbnN0IHRvIGFjY2VzcyBwYy0+bWVtX2Nncm91cCAqLwogCQltb3ZlX2xvY2tfcGFnZV9jZ3JvdXAocGMsICZmbGFncyk7CiAJCW5lZWRfdW5sb2NrID0gdHJ1ZTsKLQkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7Ci0JCWlmICghbWVtIHx8ICFQYWdlQ2dyb3VwVXNlZChwYykpCisJCW1lbWNnID0gcGMtPm1lbV9jZ3JvdXA7CisJCWlmICghbWVtY2cgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtMTk1OSw3ICsxOTcwLDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+Y291bnRbaWR4XSwgdmFsKTsKKwl0aGlzX2NwdV9hZGQobWVtY2ctPnN0YXQtPmNvdW50W2lkeF0sIHZhbCk7CiAKIG91dDoKIAlpZiAodW5saWtlbHkobmVlZF91bmxvY2spKQpAQCAtMTk5MCwxMyArMjAwMSwxMyBAQAogICogY2dyb3VwIHdoaWNoIGlzIG5vdCBjdXJyZW50IHRhcmdldCwgcmV0dXJucyBmYWxzZS4gVGhpcyBzdG9jayB3aWxsIGJlCiAgKiByZWZpbGxlZC4KICAqLwotc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2s7CiAJYm9vbCByZXQgPSB0cnVlOwogCiAJc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOwotCWlmIChtZW0gPT0gc3RvY2stPmNhY2hlZCAmJiBzdG9jay0+bnJfcGFnZXMpCisJaWYgKG1lbWNnID09IHN0b2NrLT5jYWNoZWQgJiYgc3RvY2stPm5yX3BhZ2VzKQogCQlzdG9jay0+bnJfcGFnZXMtLTsKIAllbHNlIC8qIG5lZWQgdG8gY2FsbCByZXNfY291bnRlcl9jaGFyZ2UgKi8KIAkJcmV0ID0gZmFsc2U7CkBAIC0yMDM3LDI0ICsyMDQ4LDI0IEBACiAgKiBDYWNoZSBjaGFyZ2VzKHZhbCkgd2hpY2ggaXMgZnJvbSByZXNfY291bnRlciwgdG8gbG9jYWwgcGVyX2NwdSBhcmVhLgogICogVGhpcyB3aWxsIGJlIGNvbnN1bWVkIGJ5IGNvbnN1bWVfc3RvY2soKSBmdW5jdGlvbiwgbGF0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJlZmlsbF9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCitzdGF0aWMgdm9pZCByZWZpbGxfc3RvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCiB7CiAJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOwogCi0JaWYgKHN0b2NrLT5jYWNoZWQgIT0gbWVtKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLworCWlmIChzdG9jay0+Y2FjaGVkICE9IG1lbWNnKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLwogCQlkcmFpbl9zdG9jayhzdG9jayk7Ci0JCXN0b2NrLT5jYWNoZWQgPSBtZW07CisJCXN0b2NrLT5jYWNoZWQgPSBtZW1jZzsKIAl9CiAJc3RvY2stPm5yX3BhZ2VzICs9IG5yX3BhZ2VzOwogCXB1dF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKIH0KIAogLyoKLSAqIERyYWlucyBhbGwgcGVyLUNQVSBjaGFyZ2UgY2FjaGVzIGZvciBnaXZlbiByb290X21lbSByZXNwLiBzdWJ0cmVlCisgKiBEcmFpbnMgYWxsIHBlci1DUFUgY2hhcmdlIGNhY2hlcyBmb3IgZ2l2ZW4gcm9vdF9tZW1jZyByZXNwLiBzdWJ0cmVlCiAgKiBvZiB0aGUgaGllcmFyY2h5IHVuZGVyIGl0LiBzeW5jIGZsYWcgc2F5cyB3aGV0aGVyIHdlIHNob3VsZCBibG9jawogICogdW50aWwgdGhlIHdvcmsgaXMgZG9uZS4KICAqLwotc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSwgYm9vbCBzeW5jKQorc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnLCBib29sIHN5bmMpCiB7CiAJaW50IGNwdSwgY3VyY3B1OwogCkBAIC0yMDYzLDEyICsyMDc0LDEyIEBACiAJY3VyY3B1ID0gZ2V0X2NwdSgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrID0gJnBlcl9jcHUobWVtY2dfc3RvY2ssIGNwdSk7Ci0JCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKIAotCQltZW0gPSBzdG9jay0+Y2FjaGVkOwotCQlpZiAoIW1lbSB8fCAhc3RvY2stPm5yX3BhZ2VzKQorCQltZW1jZyA9IHN0b2NrLT5jYWNoZWQ7CisJCWlmICghbWVtY2cgfHwgIXN0b2NrLT5ucl9wYWdlcykKIAkJCWNvbnRpbnVlOwotCQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHJvb3RfbWVtLCBtZW0pKQorCQlpZiAoIW1lbV9jZ3JvdXBfc2FtZV9vcl9zdWJ0cmVlKHJvb3RfbWVtY2csIG1lbWNnKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxVU0hJTkdfQ0FDSEVEX0NIQVJHRSwgJnN0b2NrLT5mbGFncykpIHsKIAkJCWlmIChjcHUgPT0gY3VyY3B1KQpAQCAtMjA5NywyMyArMjEwOCwyMyBAQAogICogZXhwZWN0cyBzb21lIGNoYXJnZXMgd2lsbCBiZSBiYWNrIHRvIHJlc19jb3VudGVyIGxhdGVyIGJ1dCBjYW5ub3Qgd2FpdCBmb3IKICAqIGl0LgogICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfYXN5bmMoc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtKQorc3RhdGljIHZvaWQgZHJhaW5fYWxsX3N0b2NrX2FzeW5jKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbWNnKQogewogCS8qCiAJICogSWYgc29tZW9uZSBjYWxscyBkcmFpbmluZywgYXZvaWQgYWRkaW5nIG1vcmUga3dvcmtlciBydW5zLgogCSAqLwogCWlmICghbXV0ZXhfdHJ5bG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCkpCiAJCXJldHVybjsKLQlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW0sIGZhbHNlKTsKKwlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW1jZywgZmFsc2UpOwogCW11dGV4X3VubG9jaygmcGVyY3B1X2NoYXJnZV9tdXRleCk7CiB9CiAKIC8qIFRoaXMgaXMgYSBzeW5jaHJvbm91cyBkcmFpbiBpbnRlcmZhY2UuICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCitzdGF0aWMgdm9pZCBkcmFpbl9hbGxfc3RvY2tfc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW1jZykKIHsKIAkvKiBjYWxsZWQgd2hlbiBmb3JjZV9lbXB0eSBpcyBjYWxsZWQgKi8KIAltdXRleF9sb2NrKCZwZXJjcHVfY2hhcmdlX211dGV4KTsKLQlkcmFpbl9hbGxfc3RvY2socm9vdF9tZW0sIHRydWUpOworCWRyYWluX2FsbF9zdG9jayhyb290X21lbWNnLCB0cnVlKTsKIAltdXRleF91bmxvY2soJnBlcmNwdV9jaGFyZ2VfbXV0ZXgpOwogfQogCkBAIC0yMTIxLDM1ICsyMTMyLDM1IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGRyYWlucyBwZXJjcHUgY291bnRlciB2YWx1ZSBmcm9tIERFQUQgY3B1IGFuZAogICogbW92ZSBpdCB0byBsb2NhbCBjcHUuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBwcmVlbXB0ZWQuCiAgKi8KLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZHJhaW5fcGNwX2NvdW50ZXIoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IGNwdSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZHJhaW5fcGNwX2NvdW50ZXIoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY3B1KQogewogCWludCBpOwogCi0Jc3Bpbl9sb2NrKCZtZW0tPnBjcF9jb3VudGVyX2xvY2spOworCXNwaW5fbG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBNRU1fQ0dST1VQX1NUQVRfREFUQTsgaSsrKSB7Ci0JCWxvbmcgeCA9IHBlcl9jcHUobWVtLT5zdGF0LT5jb3VudFtpXSwgY3B1KTsKKwkJbG9uZyB4ID0gcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbaV0sIGNwdSk7CiAKLQkJcGVyX2NwdShtZW0tPnN0YXQtPmNvdW50W2ldLCBjcHUpID0gMDsKLQkJbWVtLT5ub2NwdV9iYXNlLmNvdW50W2ldICs9IHg7CisJCXBlcl9jcHUobWVtY2ctPnN0YXQtPmNvdW50W2ldLCBjcHUpID0gMDsKKwkJbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaV0gKz0geDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IE1FTV9DR1JPVVBfRVZFTlRTX05TVEFUUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgeCA9IHBlcl9jcHUobWVtLT5zdGF0LT5ldmVudHNbaV0sIGNwdSk7CisJCXVuc2lnbmVkIGxvbmcgeCA9IHBlcl9jcHUobWVtY2ctPnN0YXQtPmV2ZW50c1tpXSwgY3B1KTsKIAotCQlwZXJfY3B1KG1lbS0+c3RhdC0+ZXZlbnRzW2ldLCBjcHUpID0gMDsKLQkJbWVtLT5ub2NwdV9iYXNlLmV2ZW50c1tpXSArPSB4OworCQlwZXJfY3B1KG1lbWNnLT5zdGF0LT5ldmVudHNbaV0sIGNwdSkgPSAwOworCQltZW1jZy0+bm9jcHVfYmFzZS5ldmVudHNbaV0gKz0geDsKIAl9CiAJLyogbmVlZCB0byBjbGVhciBPTl9NT1ZFIHZhbHVlLCB3b3JrcyBhcyBhIGtpbmQgb2YgbG9jay4gKi8KLQlwZXJfY3B1KG1lbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSA9IDA7Ci0Jc3Bpbl91bmxvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7CisJcGVyX2NwdShtZW1jZy0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9PTl9NT1ZFXSwgY3B1KSA9IDA7CisJc3Bpbl91bmxvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgc3luY2hyb25pemVfbWVtX2Nncm91cF9vbl9tb3ZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBjcHUpCitzdGF0aWMgdm9pZCBzeW5jaHJvbml6ZV9tZW1fY2dyb3VwX29uX21vdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY3B1KQogewogCWludCBpZHggPSBNRU1fQ0dST1VQX09OX01PVkU7CiAKLQlzcGluX2xvY2soJm1lbS0+cGNwX2NvdW50ZXJfbG9jayk7Ci0JcGVyX2NwdShtZW0tPnN0YXQtPmNvdW50W2lkeF0sIGNwdSkgPSBtZW0tPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKLQlzcGluX3VubG9jaygmbWVtLT5wY3BfY291bnRlcl9sb2NrKTsKKwlzcGluX2xvY2soJm1lbWNnLT5wY3BfY291bnRlcl9sb2NrKTsKKwlwZXJfY3B1KG1lbWNnLT5zdGF0LT5jb3VudFtpZHhdLCBjcHUpID0gbWVtY2ctPm5vY3B1X2Jhc2UuY291bnRbaWR4XTsKKwlzcGluX3VubG9jaygmbWVtY2ctPnBjcF9jb3VudGVyX2xvY2spOwogfQogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBtZW1jZ19jcHVfaG90cGx1Z19jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLApAQCAtMjE4Nyw3ICsyMTk4LDcgQEAKIAlDSEFSR0VfT09NX0RJRSwJCS8qIHRoZSBjdXJyZW50IGlzIGtpbGxlZCBiZWNhdXNlIG9mIE9PTSAqLwogfTsKIAotc3RhdGljIGludCBtZW1fY2dyb3VwX2RvX2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBnZnBfdCBnZnBfbWFzaywKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9kb19jaGFyZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBnZnBfdCBnZnBfbWFzaywKIAkJCQl1bnNpZ25lZCBpbnQgbnJfcGFnZXMsIGJvb2wgb29tX2NoZWNrKQogewogCXVuc2lnbmVkIGxvbmcgY3NpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKQEAgLTIxOTYsMTYgKzIyMDcsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW0tPnJlcywgY3NpemUsICZmYWlsX3Jlcyk7CisJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+cmVzLCBjc2l6ZSwgJmZhaWxfcmVzKTsKIAogCWlmIChsaWtlbHkoIXJldCkpIHsKIAkJaWYgKCFkb19zd2FwX2FjY291bnQpCiAJCQlyZXR1cm4gQ0hBUkdFX09LOwotCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+bWVtc3csIGNzaXplLCAmZmFpbF9yZXMpOworCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbWNnLT5tZW1zdywgY3NpemUsICZmYWlsX3Jlcyk7CiAJCWlmIChsaWtlbHkoIXJldCkpCiAJCQlyZXR1cm4gQ0hBUkdFX09LOwogCi0JCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgY3NpemUpOworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgY3NpemUpOwogCQltZW1fb3Zlcl9saW1pdCA9IG1lbV9jZ3JvdXBfZnJvbV9yZXNfY291bnRlcihmYWlsX3JlcywgbWVtc3cpOwogCQlmbGFncyB8PSBNRU1fQ0dST1VQX1JFQ0xBSU1fTk9TV0FQOwogCX0gZWxzZQpAQCAtMjI2MywxMiArMjI3NCwxMiBAQAogc3RhdGljIGludCBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICBnZnBfdCBnZnBfbWFzaywKIAkJCQkgICB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCi0JCQkJICAgc3RydWN0IG1lbV9jZ3JvdXAgKiptZW1jZywKKwkJCQkgICBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0ciwKIAkJCQkgICBib29sIG9vbSkKIHsKIAl1bnNpZ25lZCBpbnQgYmF0Y2ggPSBtYXgoQ0hBUkdFX0JBVENILCBucl9wYWdlcyk7CiAJaW50IG5yX29vbV9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTIyODYsMTcgKzIyOTcsMTcgQEAKIAkgKiB0aHJlYWQgZ3JvdXAgbGVhZGVyIG1pZ3JhdGVzLiBJdCdzIHBvc3NpYmxlIHRoYXQgbW0gaXMgbm90CiAJICogc2V0LCBpZiBzbyBjaGFyZ2UgdGhlIGluaXRfbW0gKGhhcHBlbnMgZm9yIHBhZ2VjYWNoZSB1c2FnZSkuCiAJICovCi0JaWYgKCEqbWVtY2cgJiYgIW1tKQorCWlmICghKnB0ciAmJiAhbW0pCiAJCWdvdG8gYnlwYXNzOwogYWdhaW46Ci0JaWYgKCptZW1jZykgeyAvKiBjc3Mgc2hvdWxkIGJlIGEgdmFsaWQgb25lICovCi0JCW1lbSA9ICptZW1jZzsKLQkJVk1fQlVHX09OKGNzc19pc19yZW1vdmVkKCZtZW0tPmNzcykpOwotCQlpZiAobWVtX2Nncm91cF9pc19yb290KG1lbSkpCisJaWYgKCpwdHIpIHsgLyogY3NzIHNob3VsZCBiZSBhIHZhbGlkIG9uZSAqLworCQltZW1jZyA9ICpwdHI7CisJCVZNX0JVR19PTihjc3NfaXNfcmVtb3ZlZCgmbWVtY2ctPmNzcykpOworCQlpZiAobWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkKIAkJCWdvdG8gZG9uZTsKLQkJaWYgKG5yX3BhZ2VzID09IDEgJiYgY29uc3VtZV9zdG9jayhtZW0pKQorCQlpZiAobnJfcGFnZXMgPT0gMSAmJiBjb25zdW1lX3N0b2NrKG1lbWNnKSkKIAkJCWdvdG8gZG9uZTsKLQkJY3NzX2dldCgmbWVtLT5jc3MpOworCQljc3NfZ2V0KCZtZW1jZy0+Y3NzKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKQEAgLTIzMDQsNyArMjMxNSw3IEBACiAJCXAgPSByY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKTsKIAkJLyoKIAkJICogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRhc2tfbG9jaygpLCAicCIgY2FuIGV4aXQuCi0JCSAqIEluIHRoYXQgY2FzZSwgIm1lbSIgY2FuIHBvaW50IHRvIHJvb3Qgb3IgcCBjYW4gYmUgTlVMTCB3aXRoCisJCSAqIEluIHRoYXQgY2FzZSwgIm1lbWNnIiBjYW4gcG9pbnQgdG8gcm9vdCBvciBwIGNhbiBiZSBOVUxMIHdpdGgKIAkJICogcmFjZSB3aXRoIHN3YXBvZmYuIFRoZW4sIHdlIGhhdmUgc21hbGwgcmlzayBvZiBtaXMtYWNjb3VuaW5nLgogCQkgKiBCdXQgc3VjaCBraW5kIG9mIG1pcy1hY2NvdW50IGJ5IHJhY2UgYWx3YXlzIGhhcHBlbnMgYmVjYXVzZQogCQkgKiB3ZSBkb24ndCBoYXZlIGNncm91cF9tdXRleCgpLiBJdCdzIG92ZXJraWxsIGFuZCB3ZSBhbGxvIHRoYXQKQEAgLTIzMTIsMTIgKzIzMjMsMTIgQEAKIAkJICogKCopIHN3YXBvZmYgYXQgZWwgd2lsbCBjaGFyZ2UgYWdhaW5zdCBtbS1zdHJ1Y3Qgbm90IGFnYWluc3QKIAkJICogdGFzay1zdHJ1Y3QuIFNvLCBtbS0+b3duZXIgY2FuIGJlIE5VTEwuCiAJCSAqLwotCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKLQkJaWYgKCFtZW0gfHwgbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKKwkJaWYgKCFtZW1jZyB8fCBtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQlpZiAobnJfcGFnZXMgPT0gMSAmJiBjb25zdW1lX3N0b2NrKG1lbSkpIHsKKwkJaWYgKG5yX3BhZ2VzID09IDEgJiYgY29uc3VtZV9zdG9jayhtZW1jZykpIHsKIAkJCS8qCiAJCQkgKiBJdCBzZWVtcyBkYWdlcm91cyB0byBhY2Nlc3MgbWVtY2cgd2l0aG91dCBjc3NfZ2V0KCkuCiAJCQkgKiBCdXQgY29uc2lkZXJpbmcgaG93IGNvbnN1bWVfc3RvayB3b3JrcywgaXQncyBub3QKQEAgLTIzMzAsNyArMjM0MSw3IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJLyogYWZ0ZXIgaGVyZSwgd2UgbWF5IGJlIGJsb2NrZWQuIHdlIG5lZWQgdG8gZ2V0IHJlZmNudCAqLwotCQlpZiAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkgeworCQlpZiAoIWNzc190cnlnZXQoJm1lbWNnLT5jc3MpKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWdvdG8gYWdhaW47CiAJCX0KQEAgLTIzNDIsNyArMjM1Myw3IEBACiAKIAkJLyogSWYga2lsbGVkLCBieXBhc3MgY2hhcmdlICovCiAJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CiAJCQlnb3RvIGJ5cGFzczsKIAkJfQogCkBAIC0yMzUyLDQzICsyMzYzLDQzIEBACiAJCQlucl9vb21fcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOwogCQl9CiAKLQkJcmV0ID0gbWVtX2Nncm91cF9kb19jaGFyZ2UobWVtLCBnZnBfbWFzaywgYmF0Y2gsIG9vbV9jaGVjayk7CisJCXJldCA9IG1lbV9jZ3JvdXBfZG9fY2hhcmdlKG1lbWNnLCBnZnBfbWFzaywgYmF0Y2gsIG9vbV9jaGVjayk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgQ0hBUkdFX09LOgogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBUkdFX1JFVFJZOiAvKiBub3QgaW4gT09NIHNpdHVhdGlvbiBidXQgcmV0cnkgKi8KIAkJCWJhdGNoID0gbnJfcGFnZXM7Ci0JCQljc3NfcHV0KCZtZW0tPmNzcyk7Ci0JCQltZW0gPSBOVUxMOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CisJCQltZW1jZyA9IE5VTEw7CiAJCQlnb3RvIGFnYWluOwogCQljYXNlIENIQVJHRV9XT1VMREJMT0NLOiAvKiAhX19HRlBfV0FJVCAqLwotCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJY3NzX3B1dCgmbWVtY2ctPmNzcyk7CiAJCQlnb3RvIG5vbWVtOwogCQljYXNlIENIQVJHRV9OT01FTTogLyogT09NIHJvdXRpbmUgd29ya3MgKi8KIAkJCWlmICghb29tKSB7Ci0JCQkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQkJCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogCQkJCWdvdG8gbm9tZW07CiAJCQl9CiAJCQkvKiBJZiBvb20sIHdlIG5ldmVyIHJldHVybiAtRU5PTUVNICovCiAJCQlucl9vb21fcmV0cmllcy0tOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBUkdFX09PTV9ESUU6IC8qIEtpbGxlZCBieSBPT00gS2lsbGVyICovCi0JCQljc3NfcHV0KCZtZW0tPmNzcyk7CisJCQljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKIAkJCWdvdG8gYnlwYXNzOwogCQl9CiAJfSB3aGlsZSAocmV0ICE9IENIQVJHRV9PSyk7CiAKIAlpZiAoYmF0Y2ggPiBucl9wYWdlcykKLQkJcmVmaWxsX3N0b2NrKG1lbSwgYmF0Y2ggLSBucl9wYWdlcyk7Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCQlyZWZpbGxfc3RvY2sobWVtY2csIGJhdGNoIC0gbnJfcGFnZXMpOworCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogZG9uZToKLQkqbWVtY2cgPSBtZW07CisJKnB0ciA9IG1lbWNnOwogCXJldHVybiAwOwogbm9tZW06Ci0JKm1lbWNnID0gTlVMTDsKKwkqcHRyID0gTlVMTDsKIAlyZXR1cm4gLUVOT01FTTsKIGJ5cGFzczoKLQkqbWVtY2cgPSBOVUxMOworCSpwdHIgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC0yMzk3LDE1ICsyNDA4LDE1IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB0aGF0IGFuZCBkbyB1bmNoYXJnZSwgcHV0IGNzcydzIHJlZmNudC4KICAqIGdvdHRlbiBieSB0cnlfY2hhcmdlKCkuCiAgKi8KLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9wYWdlcykKIHsKLQlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJaWYgKCFtZW1fY2dyb3VwX2lzX3Jvb3QobWVtY2cpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKIAotCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIGJ5dGVzKTsKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbWNnLT5yZXMsIGJ5dGVzKTsKIAkJaWYgKGRvX3N3YXBfYWNjb3VudCkKLQkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBieXRlcyk7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBieXRlcyk7CiAJfQogfQogCkBAIC0yNDMwLDcgKzI0NDEsNyBAQAogCiBzdHJ1Y3QgbWVtX2Nncm91cCAqdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CiAJdW5zaWduZWQgc2hvcnQgaWQ7CiAJc3dwX2VudHJ5X3QgZW50OwpAQCAtMjQ0MCwyMyArMjQ1MSwyMyBAQAogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwogCWxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKLQkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7Ci0JCWlmIChtZW0gJiYgIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkKLQkJCW1lbSA9IE5VTEw7CisJCW1lbWNnID0gcGMtPm1lbV9jZ3JvdXA7CisJCWlmIChtZW1jZyAmJiAhY3NzX3RyeWdldCgmbWVtY2ctPmNzcykpCisJCQltZW1jZyA9IE5VTEw7CiAJfSBlbHNlIGlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCWVudC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSk7CiAJCWlkID0gbG9va3VwX3N3YXBfY2dyb3VwKGVudCk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJbWVtID0gbWVtX2Nncm91cF9sb29rdXAoaWQpOwotCQlpZiAobWVtICYmICFjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpCi0JCQltZW0gPSBOVUxMOworCQltZW1jZyA9IG1lbV9jZ3JvdXBfbG9va3VwKGlkKTsKKwkJaWYgKG1lbWNnICYmICFjc3NfdHJ5Z2V0KCZtZW1jZy0+Y3NzKSkKKwkJCW1lbWNnID0gTlVMTDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JcmV0dXJuIG1lbTsKKwlyZXR1cm4gbWVtY2c7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCiAJCQkJICAgICAgIHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCkBAIC0yNDY1LDE0ICsyNDc2LDE0IEBACiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAJaWYgKHVubGlrZWx5KFBhZ2VDZ3JvdXBVc2VkKHBjKSkpIHsKIAkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJX19tZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UobWVtLCBucl9wYWdlcyk7CisJCV9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbWNnLCBucl9wYWdlcyk7CiAJCXJldHVybjsKIAl9CiAJLyoKIAkgKiB3ZSBkb24ndCBuZWVkIHBhZ2VfY2dyb3VwX2xvY2sgYWJvdXQgdGFpbCBwYWdlcywgYmVjYXNlIHRoZXkgYXJlIG5vdAogCSAqIGFjY2Vzc2VkIGJ5IGFueSBvdGhlciBjb250ZXh0IGF0IHRoaXMgcG9pbnQuCiAJICovCi0JcGMtPm1lbV9jZ3JvdXAgPSBtZW07CisJcGMtPm1lbV9jZ3JvdXAgPSBtZW1jZzsKIAkvKgogCSAqIFdlIGFjY2VzcyBhIHBhZ2VfY2dyb3VwIGFzeW5jaHJvbm91c2x5IHdpdGhvdXQgbG9ja19wYWdlX2Nncm91cCgpLgogCSAqIEVzcGVjaWFsbHkgd2hlbiBhIHBhZ2VfY2dyb3VwIGlzIHRha2VuIGZyb20gYSBwYWdlLCBwYy0+bWVtX2Nncm91cApAQCAtMjQ5NSwxNCArMjUwNiwxNCBAQAogCQlicmVhazsKIAl9CiAKLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgUGFnZUNncm91cENhY2hlKHBjKSwgbnJfcGFnZXMpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtY2csIFBhZ2VDZ3JvdXBDYWNoZShwYyksIG5yX3BhZ2VzKTsKIAl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCS8qCiAJICogImNoYXJnZV9zdGF0aXN0aWNzIiB1cGRhdGVkIGV2ZW50IGNvdW50ZXIuIFRoZW4sIGNoZWNrIGl0LgogCSAqIEluc2VydCBhbmNlc3RvciAoYW5kIGFuY2VzdG9yJ3MgYW5jZXN0b3JzKSwgdG8gc29mdGxpbWl0IFJCLXRyZWUuCiAJICogaWYgdGhleSBleGNlZWRzIHNvZnRsaW1pdC4KIAkgKi8KLQltZW1jZ19jaGVja19ldmVudHMobWVtLCBwYWdlKTsKKwltZW1jZ19jaGVja19ldmVudHMobWVtY2csIHBhZ2UpOwogfQogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCkBAIC0yNjg5LDcgKzI3MDAsNyBAQAogc3RhdGljIGludCBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdmcF90IGdmcF9tYXNrLCBlbnVtIGNoYXJnZV90eXBlIGN0eXBlKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gMTsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCWJvb2wgb29tID0gdHJ1ZTsKQEAgLTI3MDgsMTEgKzI3MTksMTEgQEAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAlCVUdfT04oIXBjKTsgLyogWFhYOiByZW1vdmUgdGhpcyBhbmQgbW92ZSBwYyBsb29rdXAgaW50byBjb21taXQgKi8KIAotCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgbnJfcGFnZXMsICZtZW0sIG9vbSk7Ci0JaWYgKHJldCB8fCAhbWVtKQorCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgbnJfcGFnZXMsICZtZW1jZywgb29tKTsKKwlpZiAocmV0IHx8ICFtZW1jZykKIAkJcmV0dXJuIHJldDsKIAotCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbSwgcGFnZSwgbnJfcGFnZXMsIHBjLCBjdHlwZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtY2csIHBhZ2UsIG5yX3BhZ2VzLCBwYywgY3R5cGUpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzQxLDcgKzI3NTIsNyBAQAogCQkJCQllbnVtIGNoYXJnZV90eXBlIGN0eXBlKTsKIAogc3RhdGljIHZvaWQKLV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX2xydWNhcmUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9scnVjYXJlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCWVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKQEAgLTI3NTEsNyArMjc2Miw3IEBACiAJICogTFJVLiBUYWtlIGNhcmUgb2YgaXQuCiAJICovCiAJbWVtX2Nncm91cF9scnVfZGVsX2JlZm9yZV9jb21taXQocGFnZSk7Ci0JX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtLCBwYWdlLCAxLCBwYywgY3R5cGUpOworCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbWNnLCBwYWdlLCAxLCBwYywgY3R5cGUpOwogCW1lbV9jZ3JvdXBfbHJ1X2FkZF9hZnRlcl9jb21taXQocGFnZSk7CiAJcmV0dXJuOwogfQpAQCAtMjc1OSw3ICsyNzcwLDcgQEAKIGludCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IE5VTEw7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKQEAgLTI3NzEsOCArMjc4Miw4IEBACiAJCW1tID0gJmluaXRfbW07CiAKIAlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKSB7Ci0JCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgMSwgJm1lbSwgdHJ1ZSk7Ci0JCWlmIChyZXQgfHwgIW1lbSkKKwkJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIGdmcF9tYXNrLCAxLCAmbWVtY2csIHRydWUpOworCQlpZiAocmV0IHx8ICFtZW1jZykKIAkJCXJldHVybiByZXQ7CiAKIAkJLyoKQEAgLTI3ODAsMTUgKzI3OTEsMTUgQEAKIAkJICogcHV0IHRoYXQgd291bGQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgTFJVIGxpc3QsIG1ha2UKIAkJICogc3VyZSB0aGF0IHRoZXkgZ2V0IHJlbGlua2VkIHByb3Blcmx5LgogCQkgKi8KLQkJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2VfbHJ1Y2FyZShwYWdlLCBtZW0sCisJCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX2xydWNhcmUocGFnZSwgbWVtY2csCiAJCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBzaG1lbSAqLwogCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7Ci0JCXJldCA9IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4obW0sIHBhZ2UsIGdmcF9tYXNrLCAmbWVtKTsKKwkJcmV0ID0gbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihtbSwgcGFnZSwgZ2ZwX21hc2ssICZtZW1jZyk7CiAJCWlmICghcmV0KQotCQkJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Vfc3dhcGluKHBhZ2UsIG1lbSwKKwkJCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihwYWdlLCBtZW1jZywKIAkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTSk7CiAJfSBlbHNlCiAJCXJldCA9IG1lbV9jZ3JvdXBfY2hhcmdlX2NvbW1vbihwYWdlLCBtbSwgZ2ZwX21hc2ssCkBAIC0yODA3LDcgKzI4MTgsNyBAQAogCQkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkgZ2ZwX3QgbWFzaywgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAJaW50IHJldDsKIAogCSpwdHIgPSBOVUxMOwpAQCAtMjgyNSwxMiArMjgzNiwxMiBAQAogCSAqLwogCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKIAkJZ290byBjaGFyZ2VfY3VyX21tOwotCW1lbSA9IHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3BhZ2UocGFnZSk7Ci0JaWYgKCFtZW0pCisJbWVtY2cgPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9wYWdlKHBhZ2UpOworCWlmICghbWVtY2cpCiAJCWdvdG8gY2hhcmdlX2N1cl9tbTsKLQkqcHRyID0gbWVtOworCSpwdHIgPSBtZW1jZzsKIAlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBtYXNrLCAxLCBwdHIsIHRydWUpOwotCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKIAlyZXR1cm4gcmV0OwogY2hhcmdlX2N1cl9tbToKIAlpZiAodW5saWtlbHkoIW1tKSkKQEAgLTI4OTAsMTYgKzI5MDEsMTYgQEAKIAkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQpOwogfQogCi12b2lkIG1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3ZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwotCWlmICghbWVtKQorCWlmICghbWVtY2cpCiAJCXJldHVybjsKLQlfX21lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShtZW0sIDEpOworCV9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbWNnLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kb191bmNoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kb191bmNoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJICAgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAogCQkJCSAgIGNvbnN0IGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CkBAIC0yOTE3LDcgKzI5MjgsNyBAQAogCSAqIHVuY2hhcmdlcy4gVGhlbiwgaXQncyBvayB0byBpZ25vcmUgbWVtY2cncyByZWZjbnQuCiAJICovCiAJaWYgKCFiYXRjaC0+bWVtY2cpCi0JCWJhdGNoLT5tZW1jZyA9IG1lbTsKKwkJYmF0Y2gtPm1lbWNnID0gbWVtY2c7CiAJLyoKIAkgKiBkb19iYXRjaCA+IDAgd2hlbiB1bm1hcHBpbmcgcGFnZXMgb3IgaW5vZGUgaW52YWxpZGF0ZS90cnVuY2F0ZS4KIAkgKiBJbiB0aG9zZSBjYXNlcywgYWxsIHBhZ2VzIGZyZWVkIGNvbnRpbnVvdXNseSBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgaW4KQEAgLTI5MzcsNyArMjk0OCw3IEBACiAJICogbWVyZ2UgYSBzZXJpZXMgb2YgdW5jaGFyZ2VzIHRvIGFuIHVuY2hhcmdlIG9mIHJlc19jb3VudGVyLgogCSAqIElmIG5vdCwgd2UgdW5jaGFyZ2UgcmVzX2NvdW50ZXIgb255IGJ5IG9uZS4KIAkgKi8KLQlpZiAoYmF0Y2gtPm1lbWNnICE9IG1lbSkKKwlpZiAoYmF0Y2gtPm1lbWNnICE9IG1lbWNnKQogCQlnb3RvIGRpcmVjdF91bmNoYXJnZTsKIAkvKiByZW1lbWJlciBmcmVlZCBjaGFyZ2UgYW5kIHVuY2hhcmdlIGl0IGxhdGVyICovCiAJYmF0Y2gtPm5yX3BhZ2VzKys7CkBAIC0yOTQ1LDExICsyOTU2LDExIEBACiAJCWJhdGNoLT5tZW1zd19ucl9wYWdlcysrOwogCXJldHVybjsKIGRpcmVjdF91bmNoYXJnZToKLQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKKwlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwogCWlmICh1bmNoYXJnZV9tZW1zdykKLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKLQlpZiAodW5saWtlbHkoYmF0Y2gtPm1lbWNnICE9IG1lbSkpCi0JCW1lbWNnX29vbV9yZWNvdmVyKG1lbSk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW1jZy0+bWVtc3csIG5yX3BhZ2VzICogUEFHRV9TSVpFKTsKKwlpZiAodW5saWtlbHkoYmF0Y2gtPm1lbWNnICE9IG1lbWNnKSkKKwkJbWVtY2dfb29tX3JlY292ZXIobWVtY2cpOwogCXJldHVybjsKIH0KIApAQCAtMjk1OSw3ICsyOTcwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqCiBfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGNoYXJnZV90eXBlIGN0eXBlKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gMTsKIAlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwogCkBAIC0yOTgyLDcgKzI5OTMsNyBAQAogCiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAKLQltZW0gPSBwYy0+bWVtX2Nncm91cDsKKwltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOwogCiAJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCiAJCWdvdG8gdW5sb2NrX291dDsKQEAgLTMwMDUsNyArMzAxNiw3IEBACiAJCWJyZWFrOwogCX0KIAotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBQYWdlQ2dyb3VwQ2FjaGUocGMpLCAtbnJfcGFnZXMpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtY2csIFBhZ2VDZ3JvdXBDYWNoZShwYyksIC1ucl9wYWdlcyk7CiAKIAlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKIAkvKgpAQCAtMzAxNywxOCArMzAyOCwxOCBAQAogCiAJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKIAkvKgotCSAqIGV2ZW4gYWZ0ZXIgdW5sb2NrLCB3ZSBoYXZlIG1lbS0+cmVzLnVzYWdlIGhlcmUgYW5kIHRoaXMgbWVtY2cKKwkgKiBldmVuIGFmdGVyIHVubG9jaywgd2UgaGF2ZSBtZW1jZy0+cmVzLnVzYWdlIGhlcmUgYW5kIHRoaXMgbWVtY2cKIAkgKiB3aWxsIG5ldmVyIGJlIGZyZWVkLgogCSAqLwotCW1lbWNnX2NoZWNrX2V2ZW50cyhtZW0sIHBhZ2UpOworCW1lbWNnX2NoZWNrX2V2ZW50cyhtZW1jZywgcGFnZSk7CiAJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBjdHlwZSA9PSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NXQVBPVVQpIHsKLQkJbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3MobWVtLCB0cnVlKTsKLQkJbWVtX2Nncm91cF9nZXQobWVtKTsKKwkJbWVtX2Nncm91cF9zd2FwX3N0YXRpc3RpY3MobWVtY2csIHRydWUpOworCQltZW1fY2dyb3VwX2dldChtZW1jZyk7CiAJfQotCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbSkpCi0JCW1lbV9jZ3JvdXBfZG9fdW5jaGFyZ2UobWVtLCBucl9wYWdlcywgY3R5cGUpOworCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkKKwkJbWVtX2Nncm91cF9kb191bmNoYXJnZShtZW1jZywgbnJfcGFnZXMsIGN0eXBlKTsKIAotCXJldHVybiBtZW07CisJcmV0dXJuIG1lbWNnOwogCiB1bmxvY2tfb3V0OgogCXVubG9ja19wYWdlX2Nncm91cChwYyk7CkBAIC0zMjE4LDcgKzMyMjksNyBAQAogaW50IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsCiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyLCBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CiAJZW51bSBjaGFyZ2VfdHlwZSBjdHlwZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTMyMzIsOCArMzI0Myw4IEBACiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJbG9ja19wYWdlX2Nncm91cChwYyk7CiAJaWYgKFBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQltZW0gPSBwYy0+bWVtX2Nncm91cDsKLQkJY3NzX2dldCgmbWVtLT5jc3MpOworCQltZW1jZyA9IHBjLT5tZW1fY2dyb3VwOworCQljc3NfZ2V0KCZtZW1jZy0+Y3NzKTsKIAkJLyoKIAkJICogQXQgbWlncmF0aW5nIGFuIGFub255bW91cyBwYWdlLCBpdHMgbWFwY291bnQgZ29lcyBkb3duCiAJCSAqIHRvIDAgYW5kIHVuY2hhcmdlKCkgd2lsbCBiZSBjYWxsZWQuIEJ1dCwgZXZlbiBpZiBpdCdzIGZ1bGx5CkBAIC0zMjcxLDEyICszMjgyLDEyIEBACiAJICogSWYgdGhlIHBhZ2UgaXMgbm90IGNoYXJnZWQgYXQgdGhpcyBwb2ludCwKIAkgKiB3ZSByZXR1cm4gaGVyZS4KIAkgKi8KLQlpZiAoIW1lbSkKKwlpZiAoIW1lbWNnKQogCQlyZXR1cm4gMDsKIAotCSpwdHIgPSBtZW07CisJKnB0ciA9IG1lbWNnOwogCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIGdmcF9tYXNrLCAxLCBwdHIsIGZhbHNlKTsKLQljc3NfcHV0KCZtZW0tPmNzcyk7LyogZHJvcCBleHRyYSByZWZjbnQgKi8KKwljc3NfcHV0KCZtZW1jZy0+Y3NzKTsvKiBkcm9wIGV4dHJhIHJlZmNudCAqLwogCWlmIChyZXQgfHwgKnB0ciA9PSBOVUxMKSB7CiAJCWlmIChQYWdlQW5vbihwYWdlKSkgewogCQkJbG9ja19wYWdlX2Nncm91cChwYyk7CkBAIC0zMzAyLDIxICszMzEzLDIxIEBACiAJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9DQUNIRTsKIAllbHNlCiAJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTTsKLQlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBhZ2UsIDEsIHBjLCBjdHlwZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtY2csIHBhZ2UsIDEsIHBjLCBjdHlwZSk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogcmVtb3ZlIHJlZHVuZGFudCBjaGFyZ2UgaWYgbWlncmF0aW9uIGZhaWxlZCovCi12b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAordm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCXN0cnVjdCBwYWdlICpvbGRwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgYm9vbCBtaWdyYXRpb25fb2spCiB7CiAJc3RydWN0IHBhZ2UgKnVzZWQsICp1bnVzZWQ7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAotCWlmICghbWVtKQorCWlmICghbWVtY2cpCiAJCXJldHVybjsKIAkvKiBibG9ja3Mgcm1kaXIoKSAqLwotCWNncm91cF9leGNsdWRlX3JtZGlyKCZtZW0tPmNzcyk7CisJY2dyb3VwX2V4Y2x1ZGVfcm1kaXIoJm1lbWNnLT5jc3MpOwogCWlmICghbWlncmF0aW9uX29rKSB7CiAJCXVzZWQgPSBvbGRwYWdlOwogCQl1bnVzZWQgPSBuZXdwYWdlOwpAQCAtMzM1Miw3ICszMzYzLDcgQEAKIAkgKiBTbywgcm1kaXIoKS0+cHJlX2Rlc3Ryb3koKSBjYW4gYmUgY2FsbGVkIHdoaWxlIHdlIGRvIHRoaXMgY2hhcmdlLgogCSAqIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBjYWxsIHByZV9kZXN0cm95KCkgYWdhaW4uIGNoZWNrIGl0IGhlcmUuCiAJICovCi0JY2dyb3VwX3JlbGVhc2VfYW5kX3dha2V1cF9ybWRpcigmbWVtLT5jc3MpOworCWNncm91cF9yZWxlYXNlX2FuZF93YWtldXBfcm1kaXIoJm1lbWNnLT5jc3MpOwogfQogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCkBAIC0zNDMxLDcgKzM0NDIsNyBAQAogCQkvKgogCQkgKiBSYXRoZXIgdGhhbiBoaWRlIGFsbCBpbiBzb21lIGZ1bmN0aW9uLCBJIGRvIHRoaXMgaW4KIAkJICogb3BlbiBjb2RlZCBtYW5uZXIuIFlvdSBzZWUgd2hhdCB0aGlzIHJlYWxseSBkb2VzLgotCQkgKiBXZSBoYXZlIHRvIGd1YXJhbnRlZSBtZW0tPnJlcy5saW1pdCA8IG1lbS0+bWVtc3cubGltaXQuCisJCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbWNnLT5yZXMubGltaXQgPCBtZW1jZy0+bWVtc3cubGltaXQuCiAJCSAqLwogCQltdXRleF9sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOwogCQltZW1zd2xpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX0xJTUlUKTsKQEAgLTM0OTMsNyArMzUwNCw3IEBACiAJCS8qCiAJCSAqIFJhdGhlciB0aGFuIGhpZGUgYWxsIGluIHNvbWUgZnVuY3Rpb24sIEkgZG8gdGhpcyBpbgogCQkgKiBvcGVuIGNvZGVkIG1hbm5lci4gWW91IHNlZSB3aGF0IHRoaXMgcmVhbGx5IGRvZXMuCi0JCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbS0+cmVzLmxpbWl0IDwgbWVtLT5tZW1zdy5saW1pdC4KKwkJICogV2UgaGF2ZSB0byBndWFyYW50ZWUgbWVtY2ctPnJlcy5saW1pdCA8IG1lbWNnLT5tZW1zdy5saW1pdC4KIAkJICovCiAJCW11dGV4X2xvY2soJnNldF9saW1pdF9tdXRleCk7CiAJCW1lbWxpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CkBAIC0zNjMxLDcgKzM2NDIsNyBAQAogICogVGhpcyByb3V0aW5lIHRyYXZlcnNlIHBhZ2VfY2dyb3VwIGluIGdpdmVuIGxpc3QgYW5kIGRyb3AgdGhlbSBhbGwuCiAgKiAqQW5kKiB0aGlzIHJvdXRpbmUgZG9lc24ndCByZWNsYWltIHBhZ2UgaXRzZWxmLCBqdXN0IHJlbW92ZXMgcGFnZV9jZ3JvdXAuCiAgKi8KLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJaW50IG5vZGUsIGludCB6aWQsIGVudW0gbHJ1X2xpc3QgbHJ1KQogewogCXN0cnVjdCB6b25lICp6b25lOwpAQCAtMzY0Miw3ICszNjUzLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCXpvbmUgPSAmTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3pvbmVzW3ppZF07Ci0JbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbm9kZSwgemlkKTsKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5vZGUsIHppZCk7CiAJbGlzdCA9ICZtei0+bGlzdHNbbHJ1XTsKIAogCWxvb3AgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOwpAQCAtMzY2OSw3ICszNjgwLDcgQEAKIAogCQlwYWdlID0gbG9va3VwX2Nncm91cF9wYWdlKHBjKTsKIAotCQlyZXQgPSBtZW1fY2dyb3VwX21vdmVfcGFyZW50KHBhZ2UsIHBjLCBtZW0sIEdGUF9LRVJORUwpOworCQlyZXQgPSBtZW1fY2dyb3VwX21vdmVfcGFyZW50KHBhZ2UsIHBjLCBtZW1jZywgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQgPT0gLUVOT01FTSkKIAkJCWJyZWFrOwogCkBAIC0zNjkwLDE0ICszNzAxLDE0IEBACiAgKiBtYWtlIG1lbV9jZ3JvdXAncyBjaGFyZ2UgdG8gYmUgMCBpZiB0aGVyZSBpcyBubyB0YXNrLgogICogVGhpcyBlbmFibGVzIGRlbGV0aW5nIHRoaXMgbWVtX2Nncm91cC4KICAqLwotc3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgZnJlZV9hbGwpCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIGZyZWVfYWxsKQogewogCWludCByZXQ7CiAJaW50IG5vZGUsIHppZCwgc2hyaW5rOwogCWludCBucl9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7Ci0Jc3RydWN0IGNncm91cCAqY2dycCA9IG1lbS0+Y3NzLmNncm91cDsKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gbWVtY2ctPmNzcy5jZ3JvdXA7CiAKLQljc3NfZ2V0KCZtZW0tPmNzcyk7CisJY3NzX2dldCgmbWVtY2ctPmNzcyk7CiAKIAlzaHJpbmsgPSAwOwogCS8qIHNob3VsZCBmcmVlIGFsbCA/ICovCkBAIC0zNzEzLDE0ICszNzI0LDE0IEBACiAJCQlnb3RvIG91dDsKIAkJLyogVGhpcyBpcyBmb3IgbWFraW5nIGFsbCAqdXNlZCogcGFnZXMgdG8gYmUgb24gTFJVLiAqLwogCQlscnVfYWRkX2RyYWluX2FsbCgpOwotCQlkcmFpbl9hbGxfc3RvY2tfc3luYyhtZW0pOworCQlkcmFpbl9hbGxfc3RvY2tfc3luYyhtZW1jZyk7CiAJCXJldCA9IDA7Ci0JCW1lbV9jZ3JvdXBfc3RhcnRfbW92ZShtZW0pOworCQltZW1fY2dyb3VwX3N0YXJ0X21vdmUobWVtY2cpOwogCQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fSElHSF9NRU1PUlkpIHsKIAkJCWZvciAoemlkID0gMDsgIXJldCAmJiB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CiAJCQkJZW51bSBscnVfbGlzdCBsOwogCQkJCWZvcl9lYWNoX2xydShsKSB7Ci0JCQkJCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW0sCisJCQkJCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW1jZywKIAkJCQkJCQlub2RlLCB6aWQsIGwpOwogCQkJCQlpZiAocmV0KQogCQkJCQkJYnJlYWs7CkBAIC0zNzI5LDE2ICszNzQwLDE2IEBACiAJCQlpZiAocmV0KQogCQkJCWJyZWFrOwogCQl9Ci0JCW1lbV9jZ3JvdXBfZW5kX21vdmUobWVtKTsKLQkJbWVtY2dfb29tX3JlY292ZXIobWVtKTsKKwkJbWVtX2Nncm91cF9lbmRfbW92ZShtZW1jZyk7CisJCW1lbWNnX29vbV9yZWNvdmVyKG1lbWNnKTsKIAkJLyogaXQgc2VlbXMgcGFyZW50IGNncm91cCBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbSAqLwogCQlpZiAocmV0ID09IC1FTk9NRU0pCiAJCQlnb3RvIHRyeV90b19mcmVlOwogCQljb25kX3Jlc2NoZWQoKTsKIAkvKiAicmV0IiBzaG91bGQgYWxzbyBiZSBjaGVja2VkIHRvIGVuc3VyZSBhbGwgbGlzdHMgYXJlIGVtcHR5LiAqLwotCX0gd2hpbGUgKG1lbS0+cmVzLnVzYWdlID4gMCB8fCByZXQpOworCX0gd2hpbGUgKG1lbWNnLT5yZXMudXNhZ2UgPiAwIHx8IHJldCk7CiBvdXQ6Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCWNzc19wdXQoJm1lbWNnLT5jc3MpOwogCXJldHVybiByZXQ7CiAKIHRyeV90b19mcmVlOgpAQCAtMzc1MSwxNCArMzc2MiwxNCBAQAogCWxydV9hZGRfZHJhaW5fYWxsKCk7CiAJLyogdHJ5IHRvIGZyZWUgYWxsIHBhZ2VzIGluIHRoaXMgY2dyb3VwICovCiAJc2hyaW5rID0gMTsKLQl3aGlsZSAobnJfcmV0cmllcyAmJiBtZW0tPnJlcy51c2FnZSA+IDApIHsKKwl3aGlsZSAobnJfcmV0cmllcyAmJiBtZW1jZy0+cmVzLnVzYWdlID4gMCkgewogCQlpbnQgcHJvZ3Jlc3M7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCQlyZXQgPSAtRUlOVFI7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBHRlBfS0VSTkVMLAorCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIEdGUF9LRVJORUwsCiAJCQkJCQlmYWxzZSk7CiAJCWlmICghcHJvZ3Jlc3MpIHsKIAkJCW5yX3JldHJpZXMtLTsKQEAgLTM3ODcsMTIgKzM3OTgsMTIgQEAKIAkJCQkJdTY0IHZhbCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CiAJc3RydWN0IGNncm91cCAqcGFyZW50ID0gY29udC0+cGFyZW50OwotCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnRfbWVtID0gTlVMTDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbWNnID0gTlVMTDsKIAogCWlmIChwYXJlbnQpCi0JCXBhcmVudF9tZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChwYXJlbnQpOworCQlwYXJlbnRfbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChwYXJlbnQpOwogCiAJY2dyb3VwX2xvY2soKTsKIAkvKgpAQCAtMzgwMywxMCArMzgxNCwxMCBAQAogCSAqIEZvciB0aGUgcm9vdCBjZ3JvdXAsIHBhcmVudF9tZW0gaXMgTlVMTCwgd2UgYWxsb3cgdmFsdWUgdG8gYmUKIAkgKiBzZXQgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgogCSAqLwotCWlmICgoIXBhcmVudF9tZW0gfHwgIXBhcmVudF9tZW0tPnVzZV9oaWVyYXJjaHkpICYmCisJaWYgKCghcGFyZW50X21lbWNnIHx8ICFwYXJlbnRfbWVtY2ctPnVzZV9oaWVyYXJjaHkpICYmCiAJCQkJKHZhbCA9PSAxIHx8IHZhbCA9PSAwKSkgewogCQlpZiAobGlzdF9lbXB0eSgmY29udC0+Y2hpbGRyZW4pKQotCQkJbWVtLT51c2VfaGllcmFyY2h5ID0gdmFsOworCQkJbWVtY2ctPnVzZV9oaWVyYXJjaHkgPSB2YWw7CiAJCWVsc2UKIAkJCXJldHZhbCA9IC1FQlVTWTsKIAl9IGVsc2UKQEAgLTM4MTcsMTQgKzM4MjgsMTQgQEAKIH0KIAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJCQkJICAgICAgIGVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqaXRlcjsKIAlsb25nIHZhbCA9IDA7CiAKIAkvKiBQZXItY3B1IHZhbHVlcyBjYW4gYmUgbmVnYXRpdmUsIHVzZSBhIHNpZ25lZCBhY2N1bXVsYXRvciAqLwotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW0pCisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbWNnKQogCQl2YWwgKz0gbWVtX2Nncm91cF9yZWFkX3N0YXQoaXRlciwgaWR4KTsKIAogCWlmICh2YWwgPCAwKSAvKiByYWNlID8gKi8KQEAgLTM4MzIsMjkgKzM4NDMsMjkgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBtZW1fY2dyb3VwX3VzYWdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgc3dhcCkKK3N0YXRpYyBpbmxpbmUgdTY0IG1lbV9jZ3JvdXBfdXNhZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBib29sIHN3YXApCiB7CiAJdTY0IHZhbDsKIAotCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbSkpIHsKKwlpZiAoIW1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpIHsKIAkJaWYgKCFzd2FwKQotCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPnJlcywgUkVTX1VTQUdFKTsKKwkJCXJldHVybiByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX1VTQUdFKTsKIAkJZWxzZQotCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPm1lbXN3LCBSRVNfVVNBR0UpOworCQkJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19VU0FHRSk7CiAJfQogCi0JdmFsID0gbWVtX2Nncm91cF9yZWN1cnNpdmVfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9DQUNIRSk7Ci0JdmFsICs9IG1lbV9jZ3JvdXBfcmVjdXJzaXZlX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKKwl2YWwgPSBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOworCXZhbCArPSBtZW1fY2dyb3VwX3JlY3Vyc2l2ZV9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKIAogCWlmIChzd2FwKQotCQl2YWwgKz0gbWVtX2Nncm91cF9yZWN1cnNpdmVfc3RhdChtZW0sIE1FTV9DR1JPVVBfU1RBVF9TV0FQT1VUKTsKKwkJdmFsICs9IG1lbV9jZ3JvdXBfcmVjdXJzaXZlX3N0YXQobWVtY2csIE1FTV9DR1JPVVBfU1RBVF9TV0FQT1VUKTsKIAogCXJldHVybiB2YWwgPDwgUEFHRV9TSElGVDsKIH0KIAogc3RhdGljIHU2NCBtZW1fY2dyb3VwX3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAl1NjQgdmFsOwogCWludCB0eXBlLCBuYW1lOwogCkBAIC0zODYzLDE1ICszODc0LDE1IEBACiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBfTUVNOgogCQlpZiAobmFtZSA9PSBSRVNfVVNBR0UpCi0JCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbSwgZmFsc2UpOworCQkJdmFsID0gbWVtX2Nncm91cF91c2FnZShtZW1jZywgZmFsc2UpOwogCQllbHNlCi0JCQl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtLT5yZXMsIG5hbWUpOworCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIG5hbWUpOwogCQlicmVhazsKIAljYXNlIF9NRU1TV0FQOgogCQlpZiAobmFtZSA9PSBSRVNfVVNBR0UpCi0JCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbSwgdHJ1ZSk7CisJCQl2YWwgPSBtZW1fY2dyb3VwX3VzYWdlKG1lbWNnLCB0cnVlKTsKIAkJZWxzZQotCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+bWVtc3csIG5hbWUpOworCQkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgbmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMzk1OSwyNCArMzk3MCwyNCBAQAogCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcmVzZXQoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCWludCB0eXBlLCBuYW1lOwogCi0JbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAl0eXBlID0gTUVNRklMRV9UWVBFKGV2ZW50KTsKIAluYW1lID0gTUVNRklMRV9BVFRSKGV2ZW50KTsKIAlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIFJFU19NQVhfVVNBR0U6CiAJCWlmICh0eXBlID09IF9NRU0pCi0JCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbS0+cmVzKTsKKwkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtY2ctPnJlcyk7CiAJCWVsc2UKLQkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtLT5tZW1zdyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbWNnLT5tZW1zdyk7CiAJCWJyZWFrOwogCWNhc2UgUkVTX0ZBSUxDTlQ6CiAJCWlmICh0eXBlID09IF9NRU0pCi0JCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW0tPnJlcyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW1jZy0+cmVzKTsKIAkJZWxzZQotCQkJcmVzX2NvdW50ZXJfcmVzZXRfZmFpbGNudCgmbWVtLT5tZW1zdyk7CisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW1jZy0+bWVtc3cpOwogCQlicmVhazsKIAl9CiAKQEAgLTM5OTMsNyArNDAwNCw3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9jaGFyZ2Vfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwKIAkJCQkJc3RydWN0IGNmdHlwZSAqY2Z0LCB1NjQgdmFsKQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKIAogCWlmICh2YWwgPj0gKDEgPDwgTlJfTU9WRV9UWVBFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MDAzLDcgKzQwMTQsNyBAQAogCSAqIGluY29uc2lzdGVudC4KIAkgKi8KIAljZ3JvdXBfbG9jaygpOwotCW1lbS0+bW92ZV9jaGFyZ2VfYXRfaW1taWdyYXRlID0gdmFsOworCW1lbWNnLT5tb3ZlX2NoYXJnZV9hdF9pbW1pZ3JhdGUgPSB2YWw7CiAJY2dyb3VwX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CkBAIC00MDYwLDQ5ICs0MDcxLDQ5IEBACiAKIAogc3RhdGljIHZvaWQKLW1lbV9jZ3JvdXBfZ2V0X2xvY2FsX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IG1jc190b3RhbF9zdGF0ICpzKQorbWVtX2Nncm91cF9nZXRfbG9jYWxfc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCBtY3NfdG90YWxfc3RhdCAqcykKIHsKIAlzNjQgdmFsOwogCiAJLyogcGVyIGNwdSBzdGF0ICovCi0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUpOwogCXMtPnN0YXRbTUNTX0NBQ0hFXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfUlNTKTsKKwl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfc3RhdChtZW1jZywgTUVNX0NHUk9VUF9TVEFUX1JTUyk7CiAJcy0+c3RhdFtNQ1NfUlNTXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQpOwogCXMtPnN0YXRbTUNTX0ZJTEVfTUFQUEVEXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW0sIE1FTV9DR1JPVVBfRVZFTlRTX1BHUEdJTik7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR0lOKTsKIAlzLT5zdGF0W01DU19QR1BHSU5dICs9IHZhbDsKLQl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfZXZlbnRzKG1lbSwgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVCk7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdQR09VVCk7CiAJcy0+c3RhdFtNQ1NfUEdQR09VVF0gKz0gdmFsOwogCWlmIChkb19zd2FwX2FjY291bnQpIHsKLQkJdmFsID0gbWVtX2Nncm91cF9yZWFkX3N0YXQobWVtLCBNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVCk7CisJCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KG1lbWNnLCBNRU1fQ0dST1VQX1NUQVRfU1dBUE9VVCk7CiAJCXMtPnN0YXRbTUNTX1NXQVBdICs9IHZhbCAqIFBBR0VfU0laRTsKIAl9Ci0JdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW0sIE1FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFQpOworCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9ldmVudHMobWVtY2csIE1FTV9DR1JPVVBfRVZFTlRTX1BHRkFVTFQpOwogCXMtPnN0YXRbTUNTX1BHRkFVTFRdICs9IHZhbDsKLQl2YWwgPSBtZW1fY2dyb3VwX3JlYWRfZXZlbnRzKG1lbSwgTUVNX0NHUk9VUF9FVkVOVFNfUEdNQUpGQVVMVCk7CisJdmFsID0gbWVtX2Nncm91cF9yZWFkX2V2ZW50cyhtZW1jZywgTUVNX0NHUk9VUF9FVkVOVFNfUEdNQUpGQVVMVCk7CiAJcy0+c3RhdFtNQ1NfUEdNQUpGQVVMVF0gKz0gdmFsOwogCiAJLyogcGVyIHpvbmUgc3RhdCAqLwotCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbSwgQklUKExSVV9JTkFDVElWRV9BTk9OKSk7CisJdmFsID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtY2csIEJJVChMUlVfSU5BQ1RJVkVfQU5PTikpOwogCXMtPnN0YXRbTUNTX0lOQUNUSVZFX0FOT05dICs9IHZhbCAqIFBBR0VfU0laRTsKLQl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW0sIEJJVChMUlVfQUNUSVZFX0FOT04pKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9BQ1RJVkVfQU5PTikpOwogCXMtPnN0YXRbTUNTX0FDVElWRV9BTk9OXSArPSB2YWwgKiBQQUdFX1NJWkU7Ci0JdmFsID0gbWVtX2Nncm91cF9ucl9scnVfcGFnZXMobWVtLCBCSVQoTFJVX0lOQUNUSVZFX0ZJTEUpKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9JTkFDVElWRV9GSUxFKSk7CiAJcy0+c3RhdFtNQ1NfSU5BQ1RJVkVfRklMRV0gKz0gdmFsICogUEFHRV9TSVpFOwotCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbSwgQklUKExSVV9BQ1RJVkVfRklMRSkpOworCXZhbCA9IG1lbV9jZ3JvdXBfbnJfbHJ1X3BhZ2VzKG1lbWNnLCBCSVQoTFJVX0FDVElWRV9GSUxFKSk7CiAJcy0+c3RhdFtNQ1NfQUNUSVZFX0ZJTEVdICs9IHZhbCAqIFBBR0VfU0laRTsKLQl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW0sIEJJVChMUlVfVU5FVklDVEFCTEUpKTsKKwl2YWwgPSBtZW1fY2dyb3VwX25yX2xydV9wYWdlcyhtZW1jZywgQklUKExSVV9VTkVWSUNUQUJMRSkpOwogCXMtPnN0YXRbTUNTX1VORVZJQ1RBQkxFXSArPSB2YWwgKiBQQUdFX1NJWkU7CiB9CiAKIHN0YXRpYyB2b2lkCi1tZW1fY2dyb3VwX2dldF90b3RhbF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHN0cnVjdCBtY3NfdG90YWxfc3RhdCAqcykKK21lbV9jZ3JvdXBfZ2V0X3RvdGFsX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3QgbWNzX3RvdGFsX3N0YXQgKnMpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKml0ZXI7CiAKLQlmb3JfZWFjaF9tZW1fY2dyb3VwX3RyZWUoaXRlciwgbWVtKQorCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykKIAkJbWVtX2Nncm91cF9nZXRfbG9jYWxfc3RhdChpdGVyLCBzKTsKIH0KIApAQCAtNDE4OCw4ICs0MTk5LDYgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfVk0KLQljYi0+ZmlsbChjYiwgImluYWN0aXZlX3JhdGlvIiwgY2FsY19pbmFjdGl2ZV9yYXRpbyhtZW1fY29udCwgTlVMTCkpOwotCiAJewogCQlpbnQgbmlkLCB6aWQ7CiAJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKQEAgLTQzMjYsMjAgKzQzMzUsMjAgQEAKIAlyZXR1cm4gX2EtPnRocmVzaG9sZCAtIF9iLT50aHJlc2hvbGQ7CiB9CiAKLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9vb21fbm90aWZ5X2NiKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX25vdGlmeV9jYihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXBfZXZlbnRmZF9saXN0ICpldjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZXYsICZtZW0tPm9vbV9ub3RpZnksIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJm1lbWNnLT5vb21fbm90aWZ5LCBsaXN0KQogCQlldmVudGZkX3NpZ25hbChldi0+ZXZlbnRmZCwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfb29tX25vdGlmeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9vb21fbm90aWZ5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqaXRlcjsKIAotCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW0pCisJZm9yX2VhY2hfbWVtX2Nncm91cF90cmVlKGl0ZXIsIG1lbWNnKQogCQltZW1fY2dyb3VwX29vbV9ub3RpZnlfY2IoaXRlcik7CiB9CiAKQEAgLTQ1MjksNyArNDUzOCw3IEBACiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX29vbV91bnJlZ2lzdGVyX2V2ZW50KHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJc3RydWN0IGNmdHlwZSAqY2Z0LCBzdHJ1Y3QgZXZlbnRmZF9jdHggKmV2ZW50ZmQpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCXN0cnVjdCBtZW1fY2dyb3VwX2V2ZW50ZmRfbGlzdCAqZXYsICp0bXA7CiAJaW50IHR5cGUgPSBNRU1GSUxFX1RZUEUoY2Z0LT5wcml2YXRlKTsKIApAQCAtNDUzNyw3ICs0NTQ2LDcgQEAKIAogCXNwaW5fbG9jaygmbWVtY2dfb29tX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2LCB0bXAsICZtZW0tPm9vbV9ub3RpZnksIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXYsIHRtcCwgJm1lbWNnLT5vb21fbm90aWZ5LCBsaXN0KSB7CiAJCWlmIChldi0+ZXZlbnRmZCA9PSBldmVudGZkKSB7CiAJCQlsaXN0X2RlbCgmZXYtPmxpc3QpOwogCQkJa2ZyZWUoZXYpOwpAQCAtNDU1MCwxMSArNDU1OSwxMSBAQAogc3RhdGljIGludCBtZW1fY2dyb3VwX29vbV9jb250cm9sX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQsICBzdHJ1Y3QgY2dyb3VwX21hcF9jYiAqY2IpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCi0JY2ItPmZpbGwoY2IsICJvb21fa2lsbF9kaXNhYmxlIiwgbWVtLT5vb21fa2lsbF9kaXNhYmxlKTsKKwljYi0+ZmlsbChjYiwgIm9vbV9raWxsX2Rpc2FibGUiLCBtZW1jZy0+b29tX2tpbGxfZGlzYWJsZSk7CiAKLQlpZiAoYXRvbWljX3JlYWQoJm1lbS0+dW5kZXJfb29tKSkKKwlpZiAoYXRvbWljX3JlYWQoJm1lbWNnLT51bmRlcl9vb20pKQogCQljYi0+ZmlsbChjYiwgInVuZGVyX29vbSIsIDEpOwogCWVsc2UKIAkJY2ItPmZpbGwoY2IsICJ1bmRlcl9vb20iLCAwKTsKQEAgLTQ1NjQsNyArNDU3Myw3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfb29tX2NvbnRyb2xfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQsIHU2NCB2YWwpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOwogCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnQ7CiAKIAkvKiBjYW5ub3Qgc2V0IHRvIHJvb3QgY2dyb3VwIGFuZCBvbmx5IDAgYW5kIDEgYXJlIGFsbG93ZWQgKi8KQEAgLTQ1NzYsMTMgKzQ1ODUsMTMgQEAKIAljZ3JvdXBfbG9jaygpOwogCS8qIG9vbS1raWxsLWRpc2FibGUgaXMgYSBmbGFnIGZvciBzdWJoaWVyYXJjaHkuICovCiAJaWYgKChwYXJlbnQtPnVzZV9oaWVyYXJjaHkpIHx8Ci0JICAgIChtZW0tPnVzZV9oaWVyYXJjaHkgJiYgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSkpIHsKKwkgICAgKG1lbWNnLT51c2VfaGllcmFyY2h5ICYmICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikpKSB7CiAJCWNncm91cF91bmxvY2soKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCW1lbS0+b29tX2tpbGxfZGlzYWJsZSA9IHZhbDsKKwltZW1jZy0+b29tX2tpbGxfZGlzYWJsZSA9IHZhbDsKIAlpZiAoIXZhbCkKLQkJbWVtY2dfb29tX3JlY292ZXIobWVtKTsKKwkJbWVtY2dfb29tX3JlY292ZXIobWVtY2cpOwogCWNncm91cF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3MTgsNyArNDcyNyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBhbGxvY19tZW1fY2dyb3VwX3Blcl96b25lX2luZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5vZGUpCitzdGF0aWMgaW50IGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGludCBub2RlKQogewogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlICpwbjsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CkBAIC00NzM4LDIxICs0NzQ3LDIxIEBACiAJaWYgKCFwbikKIAkJcmV0dXJuIDE7CiAKLQltZW0tPmluZm8ubm9kZWluZm9bbm9kZV0gPSBwbjsKIAlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKIAkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOwogCQlmb3JfZWFjaF9scnUobCkKIAkJCUlOSVRfTElTVF9IRUFEKCZtei0+bGlzdHNbbF0pOwogCQltei0+dXNhZ2VfaW5fZXhjZXNzID0gMDsKIAkJbXotPm9uX3RyZWUgPSBmYWxzZTsKLQkJbXotPm1lbSA9IG1lbTsKKwkJbXotPm1lbSA9IG1lbWNnOwogCX0KKwltZW1jZy0+aW5mby5ub2RlaW5mb1tub2RlXSA9IHBuOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIGZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IG5vZGUpCiB7Ci0Ja2ZyZWUobWVtLT5pbmZvLm5vZGVpbmZvW25vZGVdKTsKKwlrZnJlZShtZW1jZy0+aW5mby5ub2RlaW5mb1tub2RlXSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9hbGxvYyh2b2lkKQpAQCAtNDc5NCw1MSArNDgwMyw1MSBAQAogICogUmVtb3ZhbCBvZiBjZ3JvdXAgaXRzZWxmIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2YgcmVmcyBmcm9tIHN3YXAuCiAgKi8KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9mcmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpbnQgbm9kZTsKIAotCW1lbV9jZ3JvdXBfcmVtb3ZlX2Zyb21fdHJlZXMobWVtKTsKLQlmcmVlX2Nzc19pZCgmbWVtX2Nncm91cF9zdWJzeXMsICZtZW0tPmNzcyk7CisJbWVtX2Nncm91cF9yZW1vdmVfZnJvbV90cmVlcyhtZW1jZyk7CisJZnJlZV9jc3NfaWQoJm1lbV9jZ3JvdXBfc3Vic3lzLCAmbWVtY2ctPmNzcyk7CiAKIAlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCi0JCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSk7CisJCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbWNnLCBub2RlKTsKIAotCWZyZWVfcGVyY3B1KG1lbS0+c3RhdCk7CisJZnJlZV9wZXJjcHUobWVtY2ctPnN0YXQpOwogCWlmIChzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXApIDwgUEFHRV9TSVpFKQotCQlrZnJlZShtZW0pOworCQlrZnJlZShtZW1jZyk7CiAJZWxzZQotCQl2ZnJlZShtZW0pOworCQl2ZnJlZShtZW1jZyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2dldChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiB7Ci0JYXRvbWljX2luYygmbWVtLT5yZWZjbnQpOworCWF0b21pY19pbmMoJm1lbWNnLT5yZWZjbnQpOwogfQogCi1zdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgY291bnQpCiB7Ci0JaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoY291bnQsICZtZW0tPnJlZmNudCkpIHsKLQkJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudCA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbSk7Ci0JCV9fbWVtX2Nncm91cF9mcmVlKG1lbSk7CisJaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoY291bnQsICZtZW1jZy0+cmVmY250KSkgeworCQlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50ID0gcGFyZW50X21lbV9jZ3JvdXAobWVtY2cpOworCQlfX21lbV9jZ3JvdXBfZnJlZShtZW1jZyk7CiAJCWlmIChwYXJlbnQpCiAJCQltZW1fY2dyb3VwX3B1dChwYXJlbnQpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9wdXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKLQlfX21lbV9jZ3JvdXBfcHV0KG1lbSwgMSk7CisJX19tZW1fY2dyb3VwX3B1dChtZW1jZywgMSk7CiB9CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbWVtX2Nncm91cCBpbiBtZW1jZ3JvdXAgaGllcmFyY2h5IHdpdGggaGllcmFyY2h5IGVuYWJsZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewotCWlmICghbWVtLT5yZXMucGFyZW50KQorCWlmICghbWVtY2ctPnJlcy5wYXJlbnQpCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIobWVtLT5yZXMucGFyZW50LCByZXMpOworCXJldHVybiBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIobWVtY2ctPnJlcy5wYXJlbnQsIHJlcyk7CiB9CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCkBAIC00ODgxLDE2ICs0ODkwLDE2IEBACiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKiBfX3JlZgogbWVtX2Nncm91cF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0sICpwYXJlbnQ7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCAqcGFyZW50OwogCWxvbmcgZXJyb3IgPSAtRU5PTUVNOwogCWludCBub2RlOwogCi0JbWVtID0gbWVtX2Nncm91cF9hbGxvYygpOwotCWlmICghbWVtKQorCW1lbWNnID0gbWVtX2Nncm91cF9hbGxvYygpOworCWlmICghbWVtY2cpCiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKLQkJaWYgKGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpKQorCQlpZiAoYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbWNnLCBub2RlKSkKIAkJCWdvdG8gZnJlZV9vdXQ7CiAKIAkvKiByb290ID8gKi8KQEAgLTQ4OTgsNyArNDkwNyw3IEBACiAJCWludCBjcHU7CiAJCWVuYWJsZV9zd2FwX2Nncm91cCgpOwogCQlwYXJlbnQgPSBOVUxMOwotCQlyb290X21lbV9jZ3JvdXAgPSBtZW07CisJCXJvb3RfbWVtX2Nncm91cCA9IG1lbWNnOwogCQlpZiAobWVtX2Nncm91cF9zb2Z0X2xpbWl0X3RyZWVfaW5pdCgpKQogCQkJZ290byBmcmVlX291dDsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewpAQCAtNDkwOSwxMyArNDkxOCwxMyBAQAogCQlob3RjcHVfbm90aWZpZXIobWVtY2dfY3B1X2hvdHBsdWdfY2FsbGJhY2ssIDApOwogCX0gZWxzZSB7CiAJCXBhcmVudCA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQtPnBhcmVudCk7Ci0JCW1lbS0+dXNlX2hpZXJhcmNoeSA9IHBhcmVudC0+dXNlX2hpZXJhcmNoeTsKLQkJbWVtLT5vb21fa2lsbF9kaXNhYmxlID0gcGFyZW50LT5vb21fa2lsbF9kaXNhYmxlOworCQltZW1jZy0+dXNlX2hpZXJhcmNoeSA9IHBhcmVudC0+dXNlX2hpZXJhcmNoeTsKKwkJbWVtY2ctPm9vbV9raWxsX2Rpc2FibGUgPSBwYXJlbnQtPm9vbV9raWxsX2Rpc2FibGU7CiAJfQogCiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnVzZV9oaWVyYXJjaHkpIHsKLQkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMsICZwYXJlbnQtPnJlcyk7Ci0JCXJlc19jb3VudGVyX2luaXQoJm1lbS0+bWVtc3csICZwYXJlbnQtPm1lbXN3KTsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtY2ctPnJlcywgJnBhcmVudC0+cmVzKTsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtY2ctPm1lbXN3LCAmcGFyZW50LT5tZW1zdyk7CiAJCS8qCiAJCSAqIFdlIGluY3JlbWVudCByZWZjbnQgb2YgdGhlIHBhcmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW4KIAkJICogc2FmZWx5IGFjY2VzcyBpdCBvbiByZXNfY291bnRlcl9jaGFyZ2UvdW5jaGFyZ2UuCkBAIC00OTI0LDIxICs0OTMzLDIxIEBACiAJCSAqLwogCQltZW1fY2dyb3VwX2dldChwYXJlbnQpOwogCX0gZWxzZSB7Ci0JCXJlc19jb3VudGVyX2luaXQoJm1lbS0+cmVzLCBOVUxMKTsKLQkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5tZW1zdywgTlVMTCk7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbWNnLT5yZXMsIE5VTEwpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW1jZy0+bWVtc3csIE5VTEwpOwogCX0KLQltZW0tPmxhc3Rfc2Nhbm5lZF9jaGlsZCA9IDA7Ci0JbWVtLT5sYXN0X3NjYW5uZWRfbm9kZSA9IE1BWF9OVU1OT0RFUzsKLQlJTklUX0xJU1RfSEVBRCgmbWVtLT5vb21fbm90aWZ5KTsKKwltZW1jZy0+bGFzdF9zY2FubmVkX2NoaWxkID0gMDsKKwltZW1jZy0+bGFzdF9zY2FubmVkX25vZGUgPSBNQVhfTlVNTk9ERVM7CisJSU5JVF9MSVNUX0hFQUQoJm1lbWNnLT5vb21fbm90aWZ5KTsKIAogCWlmIChwYXJlbnQpCi0JCW1lbS0+c3dhcHBpbmVzcyA9IG1lbV9jZ3JvdXBfc3dhcHBpbmVzcyhwYXJlbnQpOwotCWF0b21pY19zZXQoJm1lbS0+cmVmY250LCAxKTsKLQltZW0tPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSA9IDA7Ci0JbXV0ZXhfaW5pdCgmbWVtLT50aHJlc2hvbGRzX2xvY2spOwotCXJldHVybiAmbWVtLT5jc3M7CisJCW1lbWNnLT5zd2FwcGluZXNzID0gbWVtX2Nncm91cF9zd2FwcGluZXNzKHBhcmVudCk7CisJYXRvbWljX3NldCgmbWVtY2ctPnJlZmNudCwgMSk7CisJbWVtY2ctPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSA9IDA7CisJbXV0ZXhfaW5pdCgmbWVtY2ctPnRocmVzaG9sZHNfbG9jayk7CisJcmV0dXJuICZtZW1jZy0+Y3NzOwogZnJlZV9vdXQ6Ci0JX19tZW1fY2dyb3VwX2ZyZWUobWVtKTsKKwlfX21lbV9jZ3JvdXBfZnJlZShtZW1jZyk7CiAJcm9vdF9tZW1fY2dyb3VwID0gTlVMTDsKIAlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiB9CkBAIC00OTQ2LDE3ICs0OTU1LDE3IEBACiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcHJlX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAotCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbSwgZmFsc2UpOworCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbWNnLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkJc3RydWN0IGNncm91cCAqY29udCkKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CiAKLQltZW1fY2dyb3VwX3B1dChtZW0pOworCW1lbV9jZ3JvdXBfcHV0KG1lbWNnKTsKIH0KIAogc3RhdGljIGludCBtZW1fY2dyb3VwX3BvcHVsYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKQEAgLTQ5NzksOSArNDk4OCw5IEBACiB7CiAJaW50IHJldCA9IDA7CiAJaW50IGJhdGNoX2NvdW50ID0gUFJFQ0hBUkdFX0NPVU5UX0FUX09OQ0U7Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1jLnRvOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1jLnRvOwogCi0JaWYgKG1lbV9jZ3JvdXBfaXNfcm9vdChtZW0pKSB7CisJaWYgKG1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpIHsKIAkJbWMucHJlY2hhcmdlICs9IGNvdW50OwogCQkvKiB3ZSBkb24ndCBuZWVkIGNzc19nZXQgZm9yIHJvb3QgKi8KIAkJcmV0dXJuIHJldDsKQEAgLTQ5OTAsMTYgKzQ5OTksMTYgQEAKIAlpZiAoY291bnQgPiAxKSB7CiAJCXN0cnVjdCByZXNfY291bnRlciAqZHVtbXk7CiAJCS8qCi0JCSAqICJtZW0iIGNhbm5vdCBiZSB1bmRlciBybWRpcigpIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBjaGVja2VkCisJCSAqICJtZW1jZyIgY2Fubm90IGJlIHVuZGVyIHJtZGlyKCkgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQKIAkJICogYnkgY2dyb3VwX2xvY2tfbGl2ZV9jZ3JvdXAoKSB0aGF0IGl0IGlzIG5vdCByZW1vdmVkIGFuZCB3ZQogCQkgKiBhcmUgc3RpbGwgdW5kZXIgdGhlIHNhbWUgY2dyb3VwX211dGV4LiBTbyB3ZSBjYW4gcG9zdHBvbmUKIAkJICogY3NzX2dldCgpLgogCQkgKi8KLQkJaWYgKHJlc19jb3VudGVyX2NoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSAqIGNvdW50LCAmZHVtbXkpKQorCQlpZiAocmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+cmVzLCBQQUdFX1NJWkUgKiBjb3VudCwgJmR1bW15KSkKIAkJCWdvdG8gb25lX2J5X29uZTsKLQkJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+bWVtc3csCisJCWlmIChkb19zd2FwX2FjY291bnQgJiYgcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW1jZy0+bWVtc3csCiAJCQkJCQlQQUdFX1NJWkUgKiBjb3VudCwgJmR1bW15KSkgewotCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPnJlcywgUEFHRV9TSVpFICogY291bnQpOwogCQkJZ290byBvbmVfYnlfb25lOwogCQl9CiAJCW1jLnByZWNoYXJnZSArPSBjb3VudDsKQEAgLTUwMTYsOCArNTAyNSw5IEBACiAJCQliYXRjaF9jb3VudCA9IFBSRUNIQVJHRV9DT1VOVF9BVF9PTkNFOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KLQkJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgR0ZQX0tFUk5FTCwgMSwgJm1lbSwgZmFsc2UpOwotCQlpZiAocmV0IHx8ICFtZW0pCisJCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsCisJCQkJCUdGUF9LRVJORUwsIDEsICZtZW1jZywgZmFsc2UpOworCQlpZiAocmV0IHx8ICFtZW1jZykKIAkJCS8qIG1lbV9jZ3JvdXBfY2xlYXJfbWMoKSB3aWxsIGRvIHVuY2hhcmdlIGxhdGVyICovCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJbWMucHJlY2hhcmdlKys7CkBAIC01MjkxLDEzICs1MzAxLDEzIEBACiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JvdXApOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CiAKLQlpZiAobWVtLT5tb3ZlX2NoYXJnZV9hdF9pbW1pZ3JhdGUpIHsKKwlpZiAobWVtY2ctPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSkgewogCQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAkJc3RydWN0IG1lbV9jZ3JvdXAgKmZyb20gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhwKTsKIAotCQlWTV9CVUdfT04oZnJvbSA9PSBtZW0pOworCQlWTV9CVUdfT04oZnJvbSA9PSBtZW1jZyk7CiAKIAkJbW0gPSBnZXRfdGFza19tbShwKTsKIAkJaWYgKCFtbSkKQEAgLTUzMTIsNyArNTMyMiw3IEBACiAJCQltZW1fY2dyb3VwX3N0YXJ0X21vdmUoZnJvbSk7CiAJCQlzcGluX2xvY2soJm1jLmxvY2spOwogCQkJbWMuZnJvbSA9IGZyb207Ci0JCQltYy50byA9IG1lbTsKKwkJCW1jLnRvID0gbWVtY2c7CiAJCQlzcGluX3VubG9jaygmbWMubG9jayk7CiAJCQkvKiBXZSBzZXQgbWMubW92aW5nX3Rhc2sgbGF0ZXIgKi8KIApkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggMmI0M2JhMC4uMDZkMzQ3OSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rc20uaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgpAQCAtMTMxMCw3ICsxMzExLDcgQEAKIAkJICogdG8gdGhlIGVuZC4KIAkJICovCiAJCWlmIChQYWdlSHVnZShwYWdlKSkgewotCQkJcHJfZGVidWcoIk1DRTogTWVtb3J5IGZhaWx1cmUgaXMgbm93IHJ1bm5pbmcgb24gZnJlZSBodWdlcGFnZSAlI2x4XG4iLCBwZm4pOworCQkJcHJfaW5mbygiTUNFOiBNZW1vcnkgZmFpbHVyZSBpcyBub3cgcnVubmluZyBvbiBmcmVlIGh1Z2VwYWdlICUjbHhcbiIsIHBmbik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAoVGVzdENsZWFyUGFnZUhXUG9pc29uKHApKQpAQCAtMTQxOSw3ICsxNDIwLDcgQEAKIAogCWlmIChQYWdlSFdQb2lzb24oaHBhZ2UpKSB7CiAJCXB1dF9wYWdlKGhwYWdlKTsKLQkJcHJfZGVidWcoInNvZnQgb2ZmbGluZTogJSNseCBodWdlcGFnZSBhbHJlYWR5IHBvaXNvbmVkXG4iLCBwZm4pOworCQlwcl9pbmZvKCJzb2Z0IG9mZmxpbmU6ICUjbHggaHVnZXBhZ2UgYWxyZWFkeSBwb2lzb25lZFxuIiwgcGZuKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTE0MzMsOCArMTQzNCw4IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlMSwgcGFnZTIsICZwYWdlbGlzdCwgbHJ1KQogCQkJcHV0X3BhZ2UocGFnZTEpOwogCi0JCXByX2RlYnVnKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IG1pZ3JhdGlvbiBmYWlsZWQgJWQsIHR5cGUgJWx4XG4iLAotCQkJIHBmbiwgcmV0LCBwYWdlLT5mbGFncyk7CisJCXByX2luZm8oInNvZnQgb2ZmbGluZTogJSNseDogbWlncmF0aW9uIGZhaWxlZCAlZCwgdHlwZSAlbHhcbiIsCisJCQlwZm4sIHJldCwgcGFnZS0+ZmxhZ3MpOwogCQlpZiAocmV0ID4gMCkKIAkJCXJldCA9IC1FSU87CiAJCXJldHVybiByZXQ7CkBAIC0xNTA1LDcgKzE1MDYsNyBAQAogCX0KIAlpZiAoIVBhZ2VMUlUocGFnZSkpIHsKIAkJcHJfaW5mbygic29mdF9vZmZsaW5lOiAlI2x4OiB1bmtub3duIG5vbiBMUlUgcGFnZSB0eXBlICVseFxuIiwKLQkJCQlwZm4sIHBhZ2UtPmZsYWdzKTsKKwkJCXBmbiwgcGFnZS0+ZmxhZ3MpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE1NjYsNyArMTU2Nyw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlwcl9pbmZvKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IGlzb2xhdGlvbiBmYWlsZWQ6ICVkLCBwYWdlIGNvdW50ICVkLCB0eXBlICVseFxuIiwKLQkJCQlwZm4sIHJldCwgcGFnZV9jb3VudChwYWdlKSwgcGFnZS0+ZmxhZ3MpOworCQkJcGZuLCByZXQsIHBhZ2VfY291bnQocGFnZSksIHBhZ2UtPmZsYWdzKTsKIAl9CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggYTU2ZTNiYS4uODI5ZDQzNyAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgva3NtLmg+CiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KQEAgLTE1MDMsNyArMTUwMyw3IEBACiAJfQogCiAJaWYgKGZsYWdzICYgRk9MTF9HRVQpCi0JCWdldF9wYWdlKHBhZ2UpOworCQlnZXRfcGFnZV9mb2xsKHBhZ2UpOwogCWlmIChmbGFncyAmIEZPTExfVE9VQ0gpIHsKIAkJaWYgKChmbGFncyAmIEZPTExfV1JJVEUpICYmCiAJCSAgICAhcHRlX2RpcnR5KHB0ZSkgJiYgIVBhZ2VEaXJ0eShwYWdlKSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDZlN2Q4YjIuLjIxNjg0ODkgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCA5YzUxZjlmLi5hZGMzOTU0IDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtNzUsNyArNzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTExLDcgKzExMSw3IEBACiAvKgogICogcnVuLXRpbWUgc3lzdGVtLXdpZGUgZGVmYXVsdCBwb2xpY3kgPT4gbG9jYWwgYWxsb2NhdGlvbgogICovCi1zdHJ1Y3QgbWVtcG9saWN5IGRlZmF1bHRfcG9saWN5ID0geworc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgZGVmYXVsdF9wb2xpY3kgPSB7CiAJLnJlZmNudCA9IEFUT01JQ19JTklUKDEpLCAvKiBuZXZlciBmcmVlIGl0ICovCiAJLm1vZGUgPSBNUE9MX1BSRUZFUlJFRCwKIAkuZmxhZ3MgPSBNUE9MX0ZfTE9DQUwsCmRpZmYgLS1naXQgYS9tbS9tZW1wb29sLmMgYi9tbS9tZW1wb29sLmMKaW5kZXggMWEzYmMzZC4uZTczNjQxYiAxMDA2NDQKLS0tIGEvbW0vbWVtcG9vbC5jCisrKyBiL21tL21lbXBvb2wuYwpAQCAtMTAsNyArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDE0ZDBhNmEuLjU3OGUyOTEgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtNjIxLDM4ICs2MjEsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qCi0gKiBPYnRhaW4gdGhlIGxvY2sgb24gcGFnZSwgcmVtb3ZlIGFsbCBwdGVzIGFuZCBtaWdyYXRlIHRoZSBwYWdlCi0gKiB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHBhZ2UgaW4gbmV3cGFnZS4KLSAqLwotc3RhdGljIGludCB1bm1hcF9hbmRfbW92ZShuZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLAotCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBmb3JjZSwgYm9vbCBvZmZsaW5pbmcsIGJvb2wgc3luYykKK3N0YXRpYyBpbnQgX191bm1hcF9hbmRfbW92ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UsCisJCQkJaW50IGZvcmNlLCBib29sIG9mZmxpbmluZywgYm9vbCBzeW5jKQogewotCWludCByYyA9IDA7Ci0JaW50ICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOworCWludCByYyA9IC1FQUdBSU47CiAJaW50IHJlbWFwX3N3YXBjYWNoZSA9IDE7CiAJaW50IGNoYXJnZSA9IDA7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gTlVMTDsKIAotCWlmICghbmV3cGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocGFnZV9jb3VudChwYWdlKSA9PSAxKSB7Ci0JCS8qIHBhZ2Ugd2FzIGZyZWVkIGZyb20gdW5kZXIgdXMuIFNvIHdlIGFyZSBkb25lLiAqLwotCQlnb3RvIG1vdmVfbmV3cGFnZTsKLQl9Ci0JaWYgKHVubGlrZWx5KFBhZ2VUcmFuc0h1Z2UocGFnZSkpKQotCQlpZiAodW5saWtlbHkoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKSkKLQkJCWdvdG8gbW92ZV9uZXdwYWdlOwotCi0JLyogcHJlcGFyZSBjZ3JvdXAganVzdCByZXR1cm5zIDAgb3IgLUVOT01FTSAqLwotCXJjID0gLUVBR0FJTjsKLQogCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CiAJCWlmICghZm9yY2UgfHwgIXN5bmMpCi0JCQlnb3RvIG1vdmVfbmV3cGFnZTsKKwkJCWdvdG8gb3V0OwogCiAJCS8qCiAJCSAqIEl0J3Mgbm90IHNhZmUgZm9yIGRpcmVjdCBjb21wYWN0aW9uIHRvIGNhbGwgbG9ja19wYWdlLgpAQCAtNjY4LDcgKzY0OCw3IEBACiAJCSAqIGFsdG9nZXRoZXIuCiAJCSAqLwogCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKLQkJCWdvdG8gbW92ZV9uZXdwYWdlOworCQkJZ290byBvdXQ7CiAKIAkJbG9ja19wYWdlKHBhZ2UpOwogCX0KQEAgLTc4NSwyNyArNzY1LDUyIEBACiAJCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihtZW0sIHBhZ2UsIG5ld3BhZ2UsIHJjID09IDApOwogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiByYzsKK30KIAotbW92ZV9uZXdwYWdlOgorLyoKKyAqIE9idGFpbiB0aGUgbG9jayBvbiBwYWdlLCByZW1vdmUgYWxsIHB0ZXMgYW5kIG1pZ3JhdGUgdGhlIHBhZ2UKKyAqIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcGFnZSBpbiBuZXdwYWdlLgorICovCitzdGF0aWMgaW50IHVubWFwX2FuZF9tb3ZlKG5ld19wYWdlX3QgZ2V0X25ld19wYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGZvcmNlLCBib29sIG9mZmxpbmluZywgYm9vbCBzeW5jKQoreworCWludCByYyA9IDA7CisJaW50ICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOworCisJaWYgKCFuZXdwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwYWdlX2NvdW50KHBhZ2UpID09IDEpIHsKKwkJLyogcGFnZSB3YXMgZnJlZWQgZnJvbSB1bmRlciB1cy4gU28gd2UgYXJlIGRvbmUuICovCisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseShQYWdlVHJhbnNIdWdlKHBhZ2UpKSkKKwkJaWYgKHVubGlrZWx5KHNwbGl0X2h1Z2VfcGFnZShwYWdlKSkpCisJCQlnb3RvIG91dDsKKworCXJjID0gX191bm1hcF9hbmRfbW92ZShwYWdlLCBuZXdwYWdlLCBmb3JjZSwgb2ZmbGluaW5nLCBzeW5jKTsKK291dDoKIAlpZiAocmMgIT0gLUVBR0FJTikgewotIAkJLyoKLSAJCSAqIEEgcGFnZSB0aGF0IGhhcyBiZWVuIG1pZ3JhdGVkIGhhcyBhbGwgcmVmZXJlbmNlcwotIAkJICogcmVtb3ZlZCBhbmQgd2lsbCBiZSBmcmVlZC4gQSBwYWdlIHRoYXQgaGFzIG5vdCBiZWVuCi0gCQkgKiBtaWdyYXRlZCB3aWxsIGhhdmUga2VwdHMgaXRzIHJlZmVyZW5jZXMgYW5kIGJlCi0gCQkgKiByZXN0b3JlZC4KLSAJCSAqLwotIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCS8qCisJCSAqIEEgcGFnZSB0aGF0IGhhcyBiZWVuIG1pZ3JhdGVkIGhhcyBhbGwgcmVmZXJlbmNlcworCQkgKiByZW1vdmVkIGFuZCB3aWxsIGJlIGZyZWVkLiBBIHBhZ2UgdGhhdCBoYXMgbm90IGJlZW4KKwkJICogbWlncmF0ZWQgd2lsbCBoYXZlIGtlcHRzIGl0cyByZWZlcmVuY2VzIGFuZCBiZQorCQkgKiByZXN0b3JlZC4KKwkJICovCisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCQlkZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0lTT0xBVEVEX0FOT04gKwogCQkJCXBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSk7CiAJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CiAJfQotCiAJLyoKIAkgKiBNb3ZlIHRoZSBuZXcgcGFnZSB0byB0aGUgTFJVLiBJZiBtaWdyYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsCiAJICogdGhlbiB0aGlzIHdpbGwgZnJlZSB0aGUgcGFnZS4KIAkgKi8KIAlwdXRiYWNrX2xydV9wYWdlKG5ld3BhZ2UpOwotCiAJaWYgKHJlc3VsdCkgewogCQlpZiAocmMpCiAJCQkqcmVzdWx0ID0gcmM7CmRpZmYgLS1naXQgYS9tbS9tbG9jay5jIGIvbW0vbWxvY2suYwppbmRleCAwNDgyNjBjLi40ZjRmNTNiIDEwMDY0NAotLS0gYS9tbS9tbG9jay5jCisrKyBiL21tL21sb2NrLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KQEAgLTExMCw3ICsxMTAsMTUgQEAKIAlpZiAoVGVzdENsZWFyUGFnZU1sb2NrZWQocGFnZSkpIHsKIAkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9NTE9DSyk7CiAJCWlmICghaXNvbGF0ZV9scnVfcGFnZShwYWdlKSkgewotCQkJaW50IHJldCA9IHRyeV90b19tdW5sb2NrKHBhZ2UpOworCQkJaW50IHJldCA9IFNXQVBfQUdBSU47CisKKwkJCS8qCisJCQkgKiBPcHRpbWl6YXRpb246IGlmIHRoZSBwYWdlIHdhcyBtYXBwZWQganVzdCBvbmNlLAorCQkJICogdGhhdCdzIG91ciBtYXBwaW5nIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFsbCB0aGUKKwkJCSAqIG90aGVyIHZtYXMuCisJCQkgKi8KKwkJCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpID4gMSkKKwkJCQlyZXQgPSB0cnlfdG9fbXVubG9jayhwYWdlKTsKIAkJCS8qCiAJCQkgKiBkaWQgdHJ5X3RvX3VubG9jaygpIHN1Y2NlZWQgb3IgcHVudD8KIAkJCSAqLwpAQCAtNTQ5LDcgKzU1Nyw4IEBACiAJaWYgKCFjYW5fZG9fbWxvY2soKSkKIAkJZ290byBvdXQ7CiAKLQlscnVfYWRkX2RyYWluX2FsbCgpOwkvKiBmbHVzaCBwYWdldmVjICovCisJaWYgKGZsYWdzICYgTUNMX0NVUlJFTlQpCisJCWxydV9hZGRfZHJhaW5fYWxsKCk7CS8qIGZsdXNoIHBhZ2V2ZWMgKi8KIAogCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKZGlmZiAtLWdpdCBhL21tL21tX2luaXQuYyBiL21tL21tX2luaXQuYwppbmRleCA0ZTBlMjY1Li4xZmZkOTdhIDEwMDY0NAotLS0gYS9tbS9tbV9pbml0LmMKKysrIGIvbW0vbW1faW5pdC5jCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmZGVmIENPTkZJR19ERUJVR19NRU1PUllfSU5JVApkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGE2NWVmZDQuLmVhZTkwYWYgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CkBAIC0yNTU4LDcgKzI1NTgsNiBAQAogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqYXZjOwotCWludCByZXQgPSAtRUlOVFI7CiAKIAlCVUdfT04oZG93bl9yZWFkX3RyeWxvY2soJm1tLT5tbWFwX3NlbSkpOwogCkBAIC0yNTc5LDEzICsyNTc4LDExIEBACiAJCQkJdm1fbG9ja19hbm9uX3ZtYShtbSwgYXZjLT5hbm9uX3ZtYSk7CiAJfQogCi0JcmV0ID0gMDsKKwlyZXR1cm4gMDsKIAogb3V0X3VubG9jazoKLQlpZiAocmV0KQotCQltbV9kcm9wX2FsbF9sb2NrcyhtbSk7Ci0KLQlyZXR1cm4gcmV0OworCW1tX2Ryb3BfYWxsX2xvY2tzKG1tKTsKKwlyZXR1cm4gLUVJTlRSOwogfQogCiBzdGF0aWMgdm9pZCB2bV91bmxvY2tfYW5vbl92bWEoc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSkKZGlmZiAtLWdpdCBhL21tL21tdV9jb250ZXh0LmMgYi9tbS9tbXVfY29udGV4dC5jCmluZGV4IDllODJlOTMuLmNmMzMyYmMgMTAwNjQ0Ci0tLSBhL21tL21tdV9jb250ZXh0LmMKKysrIGIvbW0vbW11X2NvbnRleHQuYwpAQCAtNSw3ICs1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9ub3RpZmllci5jCmluZGV4IDhkMDMyZGUuLjlhNjExZDMgMTAwNjQ0Ci0tLSBhL21tL21tdV9ub3RpZmllci5jCisrKyBiL21tL21tdV9ub3RpZmllci5jCkBAIC0xMSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgpkaWZmIC0tZ2l0IGEvbW0vbW16b25lLmMgYi9tbS9tbXpvbmUuYwppbmRleCBmNWI3ZDE3Li43Y2Y3YjdkIDEwMDY0NAotLS0gYS9tbS9tbXpvbmUuYworKysgYi9tbS9tbXpvbmUuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKmZpcnN0X29ubGluZV9wZ2RhdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYwppbmRleCA1MDZmYTQ0Li5kNjk1OWNiIDEwMDY0NAotLS0gYS9tbS9tcmVtYXAuYworKysgYi9tbS9tcmVtYXAuYwpAQCAtNDEsOCArNDEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKLQlzcGxpdF9odWdlX3BhZ2VfcG1kKG1tLCBwbWQpOwotCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKKwlpZiAocG1kX25vbmUoKnBtZCkpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHBtZDsKQEAgLTY1LDggKzY0LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlWTV9CVUdfT04ocG1kX3RyYW5zX2h1Z2UoKnBtZCkpOwotCWlmIChwbWRfbm9uZSgqcG1kKSAmJiBfX3B0ZV9hbGxvYyhtbSwgdm1hLCBwbWQsIGFkZHIpKQotCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwbWQ7CiB9CkBAIC04MCwxMSArNzcsNyBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlwdGVfdCAqb2xkX3B0ZSwgKm5ld19wdGUsIHB0ZTsKIAlzcGlubG9ja190ICpvbGRfcHRsLCAqbmV3X3B0bDsKLQl1bnNpZ25lZCBsb25nIG9sZF9zdGFydDsKIAotCW9sZF9zdGFydCA9IG9sZF9hZGRyOwotCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KHZtYS0+dm1fbW0sCi0JCQkJCSAgICBvbGRfc3RhcnQsIG9sZF9lbmQpOwogCWlmICh2bWEtPnZtX2ZpbGUpIHsKIAkJLyoKIAkJICogU3VidGxlIHBvaW50IGZyb20gUmFqZXNoIFZlbmthdGFzdWJyYW1hbmlhbjogYmVmb3JlCkBAIC0xMTEsNyArMTA0LDcgQEAKIAkJCQkgICBuZXdfcHRlKyssIG5ld19hZGRyICs9IFBBR0VfU0laRSkgewogCQlpZiAocHRlX25vbmUoKm9sZF9wdGUpKQogCQkJY29udGludWU7Ci0JCXB0ZSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBvbGRfYWRkciwgb2xkX3B0ZSk7CisJCXB0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgb2xkX2FkZHIsIG9sZF9wdGUpOwogCQlwdGUgPSBtb3ZlX3B0ZShwdGUsIG5ld192bWEtPnZtX3BhZ2VfcHJvdCwgb2xkX2FkZHIsIG5ld19hZGRyKTsKIAkJc2V0X3B0ZV9hdChtbSwgbmV3X2FkZHIsIG5ld19wdGUsIHB0ZSk7CiAJfQpAQCAtMTIzLDcgKzExNiw2IEBACiAJcHRlX3VubWFwX3VubG9jayhvbGRfcHRlIC0gMSwgb2xkX3B0bCk7CiAJaWYgKG1hcHBpbmcpCiAJCW11dGV4X3VubG9jaygmbWFwcGluZy0+aV9tbWFwX211dGV4KTsKLQltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQodm1hLT52bV9tbSwgb2xkX3N0YXJ0LCBvbGRfZW5kKTsKIH0KIAogI2RlZmluZSBMQVRFTkNZX0xJTUlUCSg2NCAqIFBBR0VfU0laRSkKQEAgLTEzNCwyMiArMTI2LDQzIEBACiB7CiAJdW5zaWduZWQgbG9uZyBleHRlbnQsIG5leHQsIG9sZF9lbmQ7CiAJcG1kX3QgKm9sZF9wbWQsICpuZXdfcG1kOworCWJvb2wgbmVlZF9mbHVzaCA9IGZhbHNlOwogCiAJb2xkX2VuZCA9IG9sZF9hZGRyICsgbGVuOwogCWZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgb2xkX2FkZHIsIG9sZF9lbmQpOwogCisJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQodm1hLT52bV9tbSwgb2xkX2FkZHIsIG9sZF9lbmQpOworCiAJZm9yICg7IG9sZF9hZGRyIDwgb2xkX2VuZDsgb2xkX2FkZHIgKz0gZXh0ZW50LCBuZXdfYWRkciArPSBleHRlbnQpIHsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCW5leHQgPSAob2xkX2FkZHIgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKLQkJaWYgKG5leHQgLSAxID4gb2xkX2VuZCkKLQkJCW5leHQgPSBvbGRfZW5kOworCQkvKiBldmVuIGlmIG5leHQgb3ZlcmZsb3dlZCwgZXh0ZW50IGJlbG93IHdpbGwgYmUgb2sgKi8KIAkJZXh0ZW50ID0gbmV4dCAtIG9sZF9hZGRyOworCQlpZiAoZXh0ZW50ID4gb2xkX2VuZCAtIG9sZF9hZGRyKQorCQkJZXh0ZW50ID0gb2xkX2VuZCAtIG9sZF9hZGRyOwogCQlvbGRfcG1kID0gZ2V0X29sZF9wbWQodm1hLT52bV9tbSwgb2xkX2FkZHIpOwogCQlpZiAoIW9sZF9wbWQpCiAJCQljb250aW51ZTsKIAkJbmV3X3BtZCA9IGFsbG9jX25ld19wbWQodm1hLT52bV9tbSwgdm1hLCBuZXdfYWRkcik7CiAJCWlmICghbmV3X3BtZCkKIAkJCWJyZWFrOworCQlpZiAocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKSB7CisJCQlpbnQgZXJyID0gMDsKKwkJCWlmIChleHRlbnQgPT0gSFBBR0VfUE1EX1NJWkUpCisJCQkJZXJyID0gbW92ZV9odWdlX3BtZCh2bWEsIG5ld192bWEsIG9sZF9hZGRyLAorCQkJCQkJICAgIG5ld19hZGRyLCBvbGRfZW5kLAorCQkJCQkJICAgIG9sZF9wbWQsIG5ld19wbWQpOworCQkJaWYgKGVyciA+IDApIHsKKwkJCQluZWVkX2ZsdXNoID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIWVycikgeworCQkJCXNwbGl0X2h1Z2VfcGFnZV9wbWQodm1hLT52bV9tbSwgb2xkX3BtZCk7CisJCQl9CisJCQlWTV9CVUdfT04ocG1kX3RyYW5zX2h1Z2UoKm9sZF9wbWQpKTsKKwkJfQorCQlpZiAocG1kX25vbmUoKm5ld19wbWQpICYmIF9fcHRlX2FsbG9jKG5ld192bWEtPnZtX21tLCBuZXdfdm1hLAorCQkJCQkJICAgICAgbmV3X3BtZCwgbmV3X2FkZHIpKQorCQkJYnJlYWs7CiAJCW5leHQgPSAobmV3X2FkZHIgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKIAkJaWYgKGV4dGVudCA+IG5leHQgLSBuZXdfYWRkcikKIAkJCWV4dGVudCA9IG5leHQgLSBuZXdfYWRkcjsKQEAgLTE1Nyw3ICsxNzAsMTIgQEAKIAkJCWV4dGVudCA9IExBVEVOQ1lfTElNSVQ7CiAJCW1vdmVfcHRlcyh2bWEsIG9sZF9wbWQsIG9sZF9hZGRyLCBvbGRfYWRkciArIGV4dGVudCwKIAkJCQluZXdfdm1hLCBuZXdfcG1kLCBuZXdfYWRkcik7CisJCW5lZWRfZmx1c2ggPSB0cnVlOwogCX0KKwlpZiAobGlrZWx5KG5lZWRfZmx1c2gpKQorCQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBvbGRfZW5kLWxlbiwgb2xkX2FkZHIpOworCisJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKHZtYS0+dm1fbW0sIG9sZF9lbmQtbGVuLCBvbGRfZW5kKTsKIAogCXJldHVybiBsZW4gKyBvbGRfYWRkciAtIG9sZF9lbmQ7CS8qIGhvdyBtdWNoIGRvbmUgKi8KIH0KZGlmZiAtLWdpdCBhL21tL25vYm9vdG1lbS5jIGIvbW0vbm9ib290bWVtLmMKaW5kZXggNmU5M2RjNy4uN2ZhNDFiNCAxMDA2NDQKLS0tIGEvbW0vbm9ib290bWVtLmMKKysrIGIvbW0vbm9ib290bWVtLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgpkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggNDM1ODAzMi4uNzM0MTljNSAxMDA2NDQKLS0tIGEvbW0vbm9tbXUuYworKysgYi9tbS9ub21tdS5jCkBAIC0xMyw3ICsxMyw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNjI2MzAzYi4uNDcxZGVkYiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yNiwxOCArMjYsMzggQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogaW50IHN5c2N0bF9wYW5pY19vbl9vb207CiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKIGludCBzeXNjdGxfb29tX2R1bXBfdGFza3MgPSAxOwogc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbG9jayk7CiAKKy8qCisgKiBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaigpIC0gY29tcGFyZSBhbmQgc3dhcCBjdXJyZW50J3Mgb29tX3Njb3JlX2FkagorICogQG9sZF92YWw6IG9sZCBvb21fc2NvcmVfYWRqIGZvciBjb21wYXJlCisgKiBAbmV3X3ZhbDogbmV3IG9vbV9zY29yZV9hZGogZm9yIHN3YXAKKyAqCisgKiBTZXRzIHRoZSBvb21fc2NvcmVfYWRqIHZhbHVlIGZvciBjdXJyZW50IHRvIEBuZXdfdmFsIGlmZiBpdHMgcHJlc2VudCB2YWx1ZSBpcworICogQG9sZF92YWwuICBVc3VhbGx5IHVzZWQgdG8gcmVpbnN0YXRlIGEgcHJldmlvdXMgdmFsdWUgdG8gcHJldmVudCByYWNpbmcgd2l0aAorICogdXNlcnNwYWNpbmcgdHVuaW5nIHRoZSB2YWx1ZSBpbiB0aGUgaW50ZXJpbS4KKyAqLwordm9pZCBjb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihpbnQgb2xkX3ZhbCwgaW50IG5ld192YWwpCit7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kID0gY3VycmVudC0+c2lnaGFuZDsKKworCXNwaW5fbG9ja19pcnEoJnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChjdXJyZW50LT5zaWduYWwtPm9vbV9zY29yZV9hZGogPT0gb2xkX3ZhbCkKKwkJY3VycmVudC0+c2lnbmFsLT5vb21fc2NvcmVfYWRqID0gbmV3X3ZhbDsKKwlzcGluX3VubG9ja19pcnEoJnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCiAvKioKICAqIHRlc3Rfc2V0X29vbV9zY29yZV9hZGooKSAtIHNldCBjdXJyZW50J3Mgb29tX3Njb3JlX2FkaiBhbmQgcmV0dXJuIG9sZCB2YWx1ZQogICogQG5ld192YWw6IG5ldyBvb21fc2NvcmVfYWRqIHZhbHVlCkBAIC01MywxMyArNzMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycSgmc2lnaGFuZC0+c2lnbG9jayk7CiAJb2xkX3ZhbCA9IGN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkajsKLQlpZiAobmV3X3ZhbCAhPSBvbGRfdmFsKSB7Ci0JCWlmIChuZXdfdmFsID09IE9PTV9TQ09SRV9BREpfTUlOKQotCQkJYXRvbWljX2luYygmY3VycmVudC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KTsKLQkJZWxzZSBpZiAob2xkX3ZhbCA9PSBPT01fU0NPUkVfQURKX01JTikKLQkJCWF0b21pY19kZWMoJmN1cnJlbnQtPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7Ci0JCWN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9IG5ld192YWw7Ci0JfQorCWN1cnJlbnQtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9IG5ld192YWw7CiAJc3Bpbl91bmxvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKIAogCXJldHVybiBvbGRfdmFsOwpAQCAtMTcyLDE2ICsxODYsNiBAQAogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogU2hvcnRjdXQgY2hlY2sgZm9yIGEgdGhyZWFkIHNoYXJpbmcgcC0+bW0gdGhhdCBpcyBPT01fU0NPUkVfQURKX01JTgotCSAqIHNvIHRoZSBlbnRpcmUgaGV1cmlzdGljIGRvZXNuJ3QgbmVlZCB0byBiZSBleGVjdXRlZCBmb3Igc29tZXRoaW5nCi0JICogdGhhdCBjYW5ub3QgYmUga2lsbGVkLgotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmcC0+bW0tPm9vbV9kaXNhYmxlX2NvdW50KSkgewotCQl0YXNrX3VubG9jayhwKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKIAkgKiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgbWF5IGhhdmUgYSBsaW1pdCBvZiAwIGJ5dGVzLCBzbyBhdm9pZCBhIGRpdmlkZQogCSAqIGJ5IHplcm8sIGlmIG5lY2Vzc2FyeS4KIAkgKi8KQEAgLTMxNyw4ICszMjEsMTEgQEAKIAkJICogYmxvY2tlZCB3YWl0aW5nIGZvciBhbm90aGVyIHRhc2sgd2hpY2ggaXRzZWxmIGlzIHdhaXRpbmcKIAkJICogZm9yIG1lbW9yeS4gSXMgdGhlcmUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmU/CiAJCSAqLwotCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX01FTURJRSkpCisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSkgeworCQkJaWYgKHVubGlrZWx5KGZyb3plbihwKSkpCisJCQkJdGhhd19wcm9jZXNzKHApOwogCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CisJCX0KIAkJaWYgKCFwLT5tbSkKIAkJCWNvbnRpbnVlOwogCkBAIC00MzUsNyArNDQyLDcgQEAKIAl0YXNrX3VubG9jayhwKTsKIAogCS8qCi0JICogS2lsbCBhbGwgcHJvY2Vzc2VzIHNoYXJpbmcgcC0+bW0gaW4gb3RoZXIgdGhyZWFkIGdyb3VwcywgaWYgYW55LgorCSAqIEtpbGwgYWxsIHVzZXIgcHJvY2Vzc2VzIHNoYXJpbmcgcC0+bW0gaW4gb3RoZXIgdGhyZWFkIGdyb3VwcywgaWYgYW55LgogCSAqIFRoZXkgZG9uJ3QgZ2V0IGFjY2VzcyB0byBtZW1vcnkgcmVzZXJ2ZXMgb3IgYSBoaWdoZXIgc2NoZWR1bGVyCiAJICogcHJpb3JpdHksIHRob3VnaCwgdG8gYXZvaWQgZGVwbGV0aW9uIG9mIGFsbCBtZW1vcnkgb3IgdGFzawogCSAqIHN0YXJ2YXRpb24uICBUaGlzIHByZXZlbnRzIG1tLT5tbWFwX3NlbSBsaXZlbG9jayB3aGVuIGFuIG9vbSBraWxsZWQKQEAgLTQ0NSw3ICs0NTIsMTEgQEAKIAkgKiBzaWduYWwuCiAJICovCiAJZm9yX2VhY2hfcHJvY2VzcyhxKQotCQlpZiAocS0+bW0gPT0gbW0gJiYgIXNhbWVfdGhyZWFkX2dyb3VwKHEsIHApKSB7CisJCWlmIChxLT5tbSA9PSBtbSAmJiAhc2FtZV90aHJlYWRfZ3JvdXAocSwgcCkgJiYKKwkJICAgICEocS0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgeworCQkJaWYgKHEtPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9PSBPT01fU0NPUkVfQURKX01JTikKKwkJCQljb250aW51ZTsKKwogCQkJdGFza19sb2NrKHEpOwkvKiBQcm90ZWN0IC0+Y29tbSBmcm9tIHByY3RsKCkgKi8KIAkJCXByX2VycigiS2lsbCBwcm9jZXNzICVkICglcykgc2hhcmluZyBzYW1lIG1lbW9yeVxuIiwKIAkJCQl0YXNrX3BpZF9ucihxKSwgcS0+Y29tbSk7CkBAIC03MjIsNyArNzMzLDcgQEAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrICYmCiAJICAgICFvb21fdW5raWxsYWJsZV90YXNrKGN1cnJlbnQsIE5VTEwsIG5vZGVtYXNrKSAmJgotCSAgICBjdXJyZW50LT5tbSAmJiAhYXRvbWljX3JlYWQoJmN1cnJlbnQtPm1tLT5vb21fZGlzYWJsZV9jb3VudCkpIHsKKwkgICAgY3VycmVudC0+bW0pIHsKIAkJLyoKIAkJICogb29tX2tpbGxfcHJvY2VzcygpIG5lZWRzIHRhc2tsaXN0X2xvY2sgaGVsZC4gIElmIGl0IHJldHVybnMKIAkJICogbm9uLXplcm8sIGN1cnJlbnQgY291bGQgbm90IGJlIGtpbGxlZCBzbyB3ZSBtdXN0IGZhbGxiYWNrIHRvCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCAwZTMwOWNkLi5hMzI3OGYwIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC00NiwyNiArNDYsMTQgQEAKICAqLwogI2RlZmluZSBCQU5EV0lEVEhfSU5URVJWQUwJbWF4KEhaLzUsIDEpCiAKKyNkZWZpbmUgUkFURUxJTUlUX0NBTENfU0hJRlQJMTAKKwogLyoKICAqIEFmdGVyIGEgQ1BVIGhhcyBkaXJ0aWVkIHRoaXMgbWFueSBwYWdlcywgYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZAogICogd2lsbCBsb29rIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBmb3JjZSB3cml0ZWJhY2sgb3IgdGhyb3R0bGluZy4KICAqLwogc3RhdGljIGxvbmcgcmF0ZWxpbWl0X3BhZ2VzID0gMzI7CiAKLS8qCi0gKiBXaGVuIGJhbGFuY2VfZGlydHlfcGFnZXMgZGVjaWRlcyB0aGF0IHRoZSBjYWxsZXIgbmVlZHMgdG8gcGVyZm9ybSBzb21lCi0gKiBub24tYmFja2dyb3VuZCB3cml0ZWJhY2ssIHRoaXMgaXMgaG93IG1hbnkgcGFnZXMgaXQgd2lsbCBhdHRlbXB0IHRvIHdyaXRlLgotICogSXQgc2hvdWxkIGJlIHNvbWV3aGF0IGxhcmdlciB0aGFuIGRpcnRpZWQgcGFnZXMgdG8gZW5zdXJlIHRoYXQgcmVhc29uYWJseQotICogbGFyZ2UgYW1vdW50cyBvZiBJL08gYXJlIHN1Ym1pdHRlZC4KLSAqLwotc3RhdGljIGlubGluZSBsb25nIHN5bmNfd3JpdGViYWNrX3BhZ2VzKHVuc2lnbmVkIGxvbmcgZGlydGllZCkKLXsKLQlpZiAoZGlydGllZCA8IHJhdGVsaW1pdF9wYWdlcykKLQkJZGlydGllZCA9IHJhdGVsaW1pdF9wYWdlczsKLQotCXJldHVybiBkaXJ0aWVkICsgZGlydGllZCAvIDI7Ci19Ci0KIC8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZXhwb3J0ZWQgdmlhIC9wcm9jL3N5cy92bSAqLwogCiAvKgpAQCAtMTY3LDYgKzE1NSw4IEBACiAJaW50IHNoaWZ0ID0gY2FsY19wZXJpb2Rfc2hpZnQoKTsKIAlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fY29tcGxldGlvbnMsIHNoaWZ0KTsKIAlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fZGlydGllcywgc2hpZnQpOworCisJd3JpdGViYWNrX3NldF9yYXRlbGltaXQoKTsKIH0KIAogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLApAQCAtMjYwLDUyICsyNTAsMTAgQEAKIAkJCQludW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRhc2tfZGlydGllc19mcmFjdGlvbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJbG9uZyAqbnVtZXJhdG9yLCBsb25nICpkZW5vbWluYXRvcikKLXsKLQlwcm9wX2ZyYWN0aW9uX3NpbmdsZSgmdm1fZGlydGllcywgJnRzay0+ZGlydGllcywKLQkJCQludW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKLX0KLQogLyoKLSAqIHRhc2tfZGlydHlfbGltaXQgLSBzY2FsZSBkb3duIGRpcnR5IHRocm90dGxpbmcgdGhyZXNob2xkIGZvciBvbmUgdGFzawotICoKLSAqIHRhc2sgc3BlY2lmaWMgZGlydHkgbGltaXQ6Ci0gKgotICogICBkaXJ0eSAtPSAoZGlydHkvOCkgKiBwX3t0fQotICoKLSAqIFRvIHByb3RlY3QgbGlnaHQvc2xvdyBkaXJ0eWluZyB0YXNrcyBmcm9tIGhlYXZpZXIvZmFzdCBvbmVzLCB3ZSBzdGFydAotICogdGhyb3R0bGluZyBpbmRpdmlkdWFsIHRhc2tzIGJlZm9yZSByZWFjaGluZyB0aGUgYmRpIGRpcnR5IGxpbWl0LgotICogUmVsYXRpdmVseSBsb3cgdGhyZXNob2xkcyB3aWxsIGJlIGFsbG9jYXRlZCB0byBoZWF2eSBkaXJ0aWVycy4gU28gd2hlbgotICogZGlydHkgcGFnZXMgZ3JvdyBsYXJnZSwgaGVhdnkgZGlydGllcnMgd2lsbCBiZSB0aHJvdHRsZWQgZmlyc3QsIHdoaWNoIHdpbGwKLSAqIGVmZmVjdGl2ZWx5IGN1cmIgdGhlIGdyb3d0aCBvZiBkaXJ0eSBwYWdlcy4gTGlnaHQgZGlydGllcnMgd2l0aCBoaWdoIGVub3VnaAotICogZGlydHkgdGhyZXNob2xkIG1heSBuZXZlciBnZXQgdGhyb3R0bGVkLgotICovCi0jZGVmaW5lIFRBU0tfTElNSVRfRlJBQ1RJT04gOAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFza19kaXJ0eV9saW1pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBiZGlfZGlydHkpCi17Ci0JbG9uZyBudW1lcmF0b3IsIGRlbm9taW5hdG9yOwotCXVuc2lnbmVkIGxvbmcgZGlydHkgPSBiZGlfZGlydHk7Ci0JdTY0IGludiA9IGRpcnR5IC8gVEFTS19MSU1JVF9GUkFDVElPTjsKLQotCXRhc2tfZGlydGllc19mcmFjdGlvbih0c2ssICZudW1lcmF0b3IsICZkZW5vbWluYXRvcik7Ci0JaW52ICo9IG51bWVyYXRvcjsKLQlkb19kaXYoaW52LCBkZW5vbWluYXRvcik7Ci0KLQlkaXJ0eSAtPSBpbnY7Ci0KLQlyZXR1cm4gbWF4KGRpcnR5LCBiZGlfZGlydHkvMik7Ci19Ci0KLS8qIE1pbmltdW0gbGltaXQgZm9yIGFueSB0YXNrICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0YXNrX21pbl9kaXJ0eV9saW1pdCh1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSkKLXsKLQlyZXR1cm4gYmRpX2RpcnR5IC0gYmRpX2RpcnR5IC8gVEFTS19MSU1JVF9GUkFDVElPTjsKLX0KLQotLyoKLSAqCisgKiBiZGlfbWluX3JhdGlvIGtlZXBzIHRoZSBzdW0gb2YgdGhlIG1pbmltdW0gZGlydHkgc2hhcmVzIG9mIGFsbAorICogcmVnaXN0ZXJlZCBiYWNraW5nIGRldmljZXMsIHdoaWNoLCBmb3Igb2J2aW91cyByZWFzb25zLCBjYW4gbm90CisgKiBleGNlZWQgMTAwJS4KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBiZGlfbWluX3JhdGlvOwogCkBAIC00MTEsNiArMzU5LDEyIEBACiAJcmV0dXJuIHggKyAxOwkvKiBFbnN1cmUgdGhhdCB3ZSBuZXZlciByZXR1cm4gMCAqLwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJ0eV9mcmVlcnVuX2NlaWxpbmcodW5zaWduZWQgbG9uZyB0aHJlc2gsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYmdfdGhyZXNoKQoreworCXJldHVybiAodGhyZXNoICsgYmdfdGhyZXNoKSAvIDI7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhhcmRfZGlydHlfbGltaXQodW5zaWduZWQgbG9uZyB0aHJlc2gpCiB7CiAJcmV0dXJuIG1heCh0aHJlc2gsIGdsb2JhbF9kaXJ0eV9saW1pdCk7CkBAIC00OTUsNiArNDQ5LDE5OCBAQAogCXJldHVybiBiZGlfZGlydHk7CiB9CiAKKy8qCisgKiBEaXJ0eSBwb3NpdGlvbiBjb250cm9sLgorICoKKyAqIChvKSBnbG9iYWwvYmRpIHNldHBvaW50cworICoKKyAqIFdlIHdhbnQgdGhlIGRpcnR5IHBhZ2VzIGJlIGJhbGFuY2VkIGFyb3VuZCB0aGUgZ2xvYmFsL2JkaSBzZXRwb2ludHMuCisgKiBXaGVuIHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgaXMgaGlnaGVyL2xvd2VyIHRoYW4gdGhlIHNldHBvaW50LCB0aGUKKyAqIGRpcnR5IHBvc2l0aW9uIGNvbnRyb2wgcmF0aW8gKGFuZCBoZW5jZSB0YXNrIGRpcnR5IHJhdGVsaW1pdCkgd2lsbCBiZQorICogZGVjcmVhc2VkL2luY3JlYXNlZCB0byBicmluZyB0aGUgZGlydHkgcGFnZXMgYmFjayB0byB0aGUgc2V0cG9pbnQuCisgKgorICogICAgIHBvc19yYXRpbyA9IDEgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQKKyAqCisgKiAgICAgaWYgKGRpcnR5IDwgc2V0cG9pbnQpIHNjYWxlIHVwICAgcG9zX3JhdGlvCisgKiAgICAgaWYgKGRpcnR5ID4gc2V0cG9pbnQpIHNjYWxlIGRvd24gcG9zX3JhdGlvCisgKgorICogICAgIGlmIChiZGlfZGlydHkgPCBiZGlfc2V0cG9pbnQpIHNjYWxlIHVwICAgcG9zX3JhdGlvCisgKiAgICAgaWYgKGJkaV9kaXJ0eSA+IGJkaV9zZXRwb2ludCkgc2NhbGUgZG93biBwb3NfcmF0aW8KKyAqCisgKiAgICAgdGFza19yYXRlbGltaXQgPSBkaXJ0eV9yYXRlbGltaXQgKiBwb3NfcmF0aW8gPj4gUkFURUxJTUlUX0NBTENfU0hJRlQKKyAqCisgKiAobykgZ2xvYmFsIGNvbnRyb2wgbGluZQorICoKKyAqICAgICBeIHBvc19yYXRpbworICogICAgIHwKKyAqICAgICB8ICAgICAgICAgICAgfDw9PT09PSBnbG9iYWwgZGlydHkgY29udHJvbCBzY29wZSA9PT09PT0+fAorICogMi4wIC4uLi4uLi4uLi4uLi4qCisgKiAgICAgfCAgICAgICAgICAgIC4qCisgKiAgICAgfCAgICAgICAgICAgIC4gKgorICogICAgIHwgICAgICAgICAgICAuICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAqCisgKiAgICAgfCAgICAgICAgICAgIC4gICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICoKKyAqIDEuMCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgIC4gICAgICoKKyAqICAgICB8ICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgKgorICogICAwICstLS0tLS0tLS0tLS0uLS0tLS0tLS0tLS0tLS0tLS0tLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLT4KKyAqICAgICAgICAgICBmcmVlcnVuXiAgICAgICAgICBzZXRwb2ludF4gICAgICAgICAgICAgICAgIGxpbWl0XiAgIGRpcnR5IHBhZ2VzCisgKgorICogKG8pIGJkaSBjb250cm9sIGxpbmUKKyAqCisgKiAgICAgXiBwb3NfcmF0aW8KKyAqICAgICB8CisgKiAgICAgfCAgICAgICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICoKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAqIHw8PT09PT09PT09PT0gc3BhbiA9PT09PT09PT09PT0+fAorICogMS4wIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgKgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgKgorICogMS80IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKiAqICogKiAqICogKiAqICogKiAqICoKKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgLgorICogICAgIHwgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICAgMCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi0tLS0tLS0tLS0tLS0+CisgKiAgICAgICAgICAgICAgICBiZGlfc2V0cG9pbnReICAgICAgICAgICAgICAgICAgICB4X2ludGVyY2VwdF4KKyAqCisgKiBUaGUgYmRpIGNvbnRyb2wgbGluZSB3b24ndCBkcm9wIGJlbG93IHBvc19yYXRpbz0xLzQsIHNvIHRoYXQgYmRpX2RpcnR5IGNhbgorICogYmUgc21vb3RobHkgdGhyb3R0bGVkIGRvd24gdG8gbm9ybWFsIGlmIGl0IHN0YXJ0cyBoaWdoIGluIHNpdHVhdGlvbnMgbGlrZQorICogLSBzdGFydCB3cml0aW5nIHRvIGEgc2xvdyBTRCBjYXJkIGFuZCBhIGZhc3QgZGlzayBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgU0QKKyAqICAgY2FyZCdzIGJkaV9kaXJ0eSBtYXkgcnVzaCB0byBtYW55IHRpbWVzIGhpZ2hlciB0aGFuIGJkaV9zZXRwb2ludC4KKyAqIC0gdGhlIGJkaSBkaXJ0eSB0aHJlc2ggZHJvcHMgcXVpY2tseSBkdWUgdG8gY2hhbmdlIG9mIEpCT0Qgd29ya2xvYWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmRpX3Bvc2l0aW9uX3JhdGlvKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCQkJCXVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkJCQl1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKKwkJCQkJdW5zaWduZWQgbG9uZyBkaXJ0eSwKKwkJCQkJdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAorCQkJCQl1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSkKK3sKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2J3ID0gYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoOworCXVuc2lnbmVkIGxvbmcgZnJlZXJ1biA9IGRpcnR5X2ZyZWVydW5fY2VpbGluZyh0aHJlc2gsIGJnX3RocmVzaCk7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGhhcmRfZGlydHlfbGltaXQodGhyZXNoKTsKKwl1bnNpZ25lZCBsb25nIHhfaW50ZXJjZXB0OworCXVuc2lnbmVkIGxvbmcgc2V0cG9pbnQ7CQkvKiBkaXJ0eSBwYWdlcycgdGFyZ2V0IGJhbGFuY2UgcG9pbnQgKi8KKwl1bnNpZ25lZCBsb25nIGJkaV9zZXRwb2ludDsKKwl1bnNpZ25lZCBsb25nIHNwYW47CisJbG9uZyBsb25nIHBvc19yYXRpbzsJCS8qIGZvciBzY2FsaW5nIHVwL2Rvd24gdGhlIHJhdGUgbGltaXQgKi8KKwlsb25nIHg7CisKKwlpZiAodW5saWtlbHkoZGlydHkgPj0gbGltaXQpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZ2xvYmFsIHNldHBvaW50CisJICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHBvaW50IC0gZGlydHkgMworCSAqICAgICAgICBmKGRpcnR5KSA6PSAxLjAgKyAoLS0tLS0tLS0tLS0tLS0tLSkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IC0gc2V0cG9pbnQKKwkgKgorCSAqIGl0J3MgYSAzcmQgb3JkZXIgcG9seW5vbWlhbCB0aGF0IHN1YmplY3RzIHRvCisJICoKKwkgKiAoMSkgZihmcmVlcnVuKSAgPSAyLjAgPT4gcmFtcHVwIGRpcnR5X3JhdGVsaW1pdCByZWFzb25hYmx5IGZhc3QKKwkgKiAoMikgZihzZXRwb2ludCkgPSAxLjAgPT4gdGhlIGJhbGFuY2UgcG9pbnQKKwkgKiAoMykgZihsaW1pdCkgICAgPSAwICAgPT4gdGhlIGhhcmQgbGltaXQKKwkgKiAoNCkgZGYvZHggICAgICA8PSAwCSA9PiBuZWdhdGl2ZSBmZWVkYmFjayBjb250cm9sCisJICogKDUpIHRoZSBjbG9zZXIgdG8gc2V0cG9pbnQsIHRoZSBzbWFsbGVyIHxkZi9keHwgKGFuZCB0aGUgcmV2ZXJzZSkKKwkgKiAgICAgPT4gZmFzdCByZXNwb25zZSBvbiBsYXJnZSBlcnJvcnM7IHNtYWxsIG9zY2lsbGF0aW9uIG5lYXIgc2V0cG9pbnQKKwkgKi8KKwlzZXRwb2ludCA9IChmcmVlcnVuICsgbGltaXQpIC8gMjsKKwl4ID0gZGl2X3M2NCgoc2V0cG9pbnQgLSBkaXJ0eSkgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQsCisJCSAgICBsaW1pdCAtIHNldHBvaW50ICsgMSk7CisJcG9zX3JhdGlvID0geDsKKwlwb3NfcmF0aW8gPSBwb3NfcmF0aW8gKiB4ID4+IFJBVEVMSU1JVF9DQUxDX1NISUZUOworCXBvc19yYXRpbyA9IHBvc19yYXRpbyAqIHggPj4gUkFURUxJTUlUX0NBTENfU0hJRlQ7CisJcG9zX3JhdGlvICs9IDEgPDwgUkFURUxJTUlUX0NBTENfU0hJRlQ7CisKKwkvKgorCSAqIFdlIGhhdmUgY29tcHV0ZWQgYmFzaWMgcG9zX3JhdGlvIGFib3ZlIGJhc2VkIG9uIGdsb2JhbCBzaXR1YXRpb24uIElmCisJICogdGhlIGJkaSBpcyBvdmVyL3VuZGVyIGl0cyBzaGFyZSBvZiBkaXJ0eSBwYWdlcywgd2Ugd2FudCB0byBzY2FsZQorCSAqIHBvc19yYXRpbyBmdXJ0aGVyIGRvd24vdXAuIFRoYXQgaXMgZG9uZSBieSB0aGUgZm9sbG93aW5nIG1lY2hhbmlzbS4KKwkgKi8KKworCS8qCisJICogYmRpIHNldHBvaW50CisJICoKKwkgKiAgICAgICAgZihiZGlfZGlydHkpIDo9IDEuMCArIGsgKiAoYmRpX2RpcnR5IC0gYmRpX3NldHBvaW50KQorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICB4X2ludGVyY2VwdCAtIGJkaV9kaXJ0eQorCSAqICAgICAgICAgICAgICAgICAgICAgOj0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIHhfaW50ZXJjZXB0IC0gYmRpX3NldHBvaW50CisJICoKKwkgKiBUaGUgbWFpbiBiZGkgY29udHJvbCBsaW5lIGlzIGEgbGluZWFyIGZ1bmN0aW9uIHRoYXQgc3ViamVjdHMgdG8KKwkgKgorCSAqICgxKSBmKGJkaV9zZXRwb2ludCkgPSAxLjAKKwkgKiAoMikgayA9IC0gMSAvICg4ICogd3JpdGVfYncpICAoaW4gc2luZ2xlIGJkaSBjYXNlKQorCSAqICAgICBvciBlcXVhbGx5OiB4X2ludGVyY2VwdCA9IGJkaV9zZXRwb2ludCArIDggKiB3cml0ZV9idworCSAqCisJICogRm9yIHNpbmdsZSBiZGkgY2FzZSwgdGhlIGRpcnR5IHBhZ2VzIGFyZSBvYnNlcnZlZCB0byBmbHVjdHVhdGUKKwkgKiByZWd1bGFybHkgd2l0aGluIHJhbmdlCisJICogICAgICAgIFtiZGlfc2V0cG9pbnQgLSB3cml0ZV9idy8yLCBiZGlfc2V0cG9pbnQgKyB3cml0ZV9idy8yXQorCSAqIGZvciB2YXJpb3VzIGZpbGVzeXN0ZW1zLCB3aGVyZSAoMikgY2FuIHlpZWxkIGluIGEgcmVhc29uYWJsZSAxMi41JQorCSAqIGZsdWN0dWF0aW9uIHJhbmdlIGZvciBwb3NfcmF0aW8uCisJICoKKwkgKiBGb3IgSkJPRCBjYXNlLCBiZGlfdGhyZXNoIChub3QgYmRpX2RpcnR5ISkgY291bGQgZmx1Y3R1YXRlIHVwIHRvIGl0cworCSAqIG93biBzaXplLCBzbyBtb3ZlIHRoZSBzbG9wZSBvdmVyIGFjY29yZGluZ2x5IGFuZCBjaG9vc2UgYSBzbG9wZSB0aGF0CisJICogeWllbGRzIDEwMCUgcG9zX3JhdGlvIGZsdWN0dWF0aW9uIG9uIHN1ZGRlbmx5IGRvdWJsZWQgYmRpX3RocmVzaC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYmRpX3RocmVzaCA+IHRocmVzaCkpCisJCWJkaV90aHJlc2ggPSB0aHJlc2g7CisJYmRpX3RocmVzaCA9IG1heChiZGlfdGhyZXNoLCAobGltaXQgLSBkaXJ0eSkgLyA4KTsKKwkvKgorCSAqIHNjYWxlIGdsb2JhbCBzZXRwb2ludCB0byBiZGknczoKKwkgKgliZGlfc2V0cG9pbnQgPSBzZXRwb2ludCAqIGJkaV90aHJlc2ggLyB0aHJlc2gKKwkgKi8KKwl4ID0gZGl2X3U2NCgodTY0KWJkaV90aHJlc2ggPDwgMTYsIHRocmVzaCArIDEpOworCWJkaV9zZXRwb2ludCA9IHNldHBvaW50ICogKHU2NCl4ID4+IDE2OworCS8qCisJICogVXNlIHNwYW49KDgqd3JpdGVfYncpIGluIHNpbmdsZSBiZGkgY2FzZSBhcyBpbmRpY2F0ZWQgYnkKKwkgKiAodGhyZXNoIC0gYmRpX3RocmVzaCB+PSAwKSBhbmQgdHJhbnNpdCB0byBiZGlfdGhyZXNoIGluIEpCT0QgY2FzZS4KKwkgKgorCSAqICAgICAgICBiZGlfdGhyZXNoICAgICAgICAgICAgICAgICAgICB0aHJlc2ggLSBiZGlfdGhyZXNoCisJICogc3BhbiA9IC0tLS0tLS0tLS0gKiAoOCAqIHdyaXRlX2J3KSArIC0tLS0tLS0tLS0tLS0tLS0tLS0gKiBiZGlfdGhyZXNoCisJICogICAgICAgICAgdGhyZXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaAorCSAqLworCXNwYW4gPSAodGhyZXNoIC0gYmRpX3RocmVzaCArIDggKiB3cml0ZV9idykgKiAodTY0KXggPj4gMTY7CisJeF9pbnRlcmNlcHQgPSBiZGlfc2V0cG9pbnQgKyBzcGFuOworCisJaWYgKGJkaV9kaXJ0eSA8IHhfaW50ZXJjZXB0IC0gc3BhbiAvIDQpIHsKKwkJcG9zX3JhdGlvID0gZGl2X3U2NChwb3NfcmF0aW8gKiAoeF9pbnRlcmNlcHQgLSBiZGlfZGlydHkpLAorCQkJCSAgICB4X2ludGVyY2VwdCAtIGJkaV9zZXRwb2ludCArIDEpOworCX0gZWxzZQorCQlwb3NfcmF0aW8gLz0gNDsKKworCS8qCisJICogYmRpIHJlc2VydmUgYXJlYSwgc2FmZWd1YXJkIGFnYWluc3QgZGlydHkgcG9vbCB1bmRlcnJ1biBhbmQgZGlzayBpZGxlCisJICogSXQgbWF5IHB1c2ggdGhlIGRlc2lyZWQgY29udHJvbCBwb2ludCBvZiBnbG9iYWwgZGlydHkgcGFnZXMgaGlnaGVyCisJICogdGhhbiBzZXRwb2ludC4KKwkgKi8KKwl4X2ludGVyY2VwdCA9IGJkaV90aHJlc2ggLyAyOworCWlmIChiZGlfZGlydHkgPCB4X2ludGVyY2VwdCkgeworCQlpZiAoYmRpX2RpcnR5ID4geF9pbnRlcmNlcHQgLyA4KQorCQkJcG9zX3JhdGlvID0gZGl2X3U2NChwb3NfcmF0aW8gKiB4X2ludGVyY2VwdCwgYmRpX2RpcnR5KTsKKwkJZWxzZQorCQkJcG9zX3JhdGlvICo9IDg7CisJfQorCisJcmV0dXJuIHBvc19yYXRpbzsKK30KKwogc3RhdGljIHZvaWQgYmRpX3VwZGF0ZV93cml0ZV9iYW5kd2lkdGgoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbGFwc2VkLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHdyaXR0ZW4pCkBAIC01OTEsOCArNzM3LDE1MyBAQAogCXNwaW5fdW5sb2NrKCZkaXJ0eV9sb2NrKTsKIH0KIAorLyoKKyAqIE1haW50YWluIGJkaS0+ZGlydHlfcmF0ZWxpbWl0LCB0aGUgYmFzZSBkaXJ0eSB0aHJvdHRsZSByYXRlLgorICoKKyAqIE5vcm1hbCBiZGkgdGFza3Mgd2lsbCBiZSBjdXJiZWQgYXQgb3IgYmVsb3cgaXQgaW4gbG9uZyB0ZXJtLgorICogT2J2aW91c2x5IGl0IHNob3VsZCBiZSBhcm91bmQgKHdyaXRlX2J3IC8gTikgd2hlbiB0aGVyZSBhcmUgTiBkZCB0YXNrcy4KKyAqLworc3RhdGljIHZvaWQgYmRpX3VwZGF0ZV9kaXJ0eV9yYXRlbGltaXQoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB0aHJlc2gsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmdfdGhyZXNoLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRpcnR5LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGJkaV90aHJlc2gsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmRpX2RpcnR5LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRpcnRpZWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZWxhcHNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVydW4gPSBkaXJ0eV9mcmVlcnVuX2NlaWxpbmcodGhyZXNoLCBiZ190aHJlc2gpOworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSBoYXJkX2RpcnR5X2xpbWl0KHRocmVzaCk7CisJdW5zaWduZWQgbG9uZyBzZXRwb2ludCA9IChmcmVlcnVuICsgbGltaXQpIC8gMjsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2J3ID0gYmRpLT5hdmdfd3JpdGVfYmFuZHdpZHRoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfcmF0ZWxpbWl0ID0gYmRpLT5kaXJ0eV9yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV9yYXRlOworCXVuc2lnbmVkIGxvbmcgdGFza19yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQ7CisJdW5zaWduZWQgbG9uZyBwb3NfcmF0aW87CisJdW5zaWduZWQgbG9uZyBzdGVwOworCXVuc2lnbmVkIGxvbmcgeDsKKworCS8qCisJICogVGhlIGRpcnR5IHJhdGUgd2lsbCBtYXRjaCB0aGUgd3JpdGVvdXQgcmF0ZSBpbiBsb25nIHRlcm0sIGV4Y2VwdAorCSAqIHdoZW4gZGlydHkgcGFnZXMgYXJlIHRydW5jYXRlZCBieSB1c2Vyc3BhY2Ugb3IgcmUtZGlydGllZCBieSBGUy4KKwkgKi8KKwlkaXJ0eV9yYXRlID0gKGRpcnRpZWQgLSBiZGktPmRpcnRpZWRfc3RhbXApICogSFogLyBlbGFwc2VkOworCisJcG9zX3JhdGlvID0gYmRpX3Bvc2l0aW9uX3JhdGlvKGJkaSwgdGhyZXNoLCBiZ190aHJlc2gsIGRpcnR5LAorCQkJCSAgICAgICBiZGlfdGhyZXNoLCBiZGlfZGlydHkpOworCS8qCisJICogdGFza19yYXRlbGltaXQgcmVmbGVjdHMgZWFjaCBkZCdzIGRpcnR5IHJhdGUgZm9yIHRoZSBwYXN0IDIwMG1zLgorCSAqLworCXRhc2tfcmF0ZWxpbWl0ID0gKHU2NClkaXJ0eV9yYXRlbGltaXQgKgorCQkJCQlwb3NfcmF0aW8gPj4gUkFURUxJTUlUX0NBTENfU0hJRlQ7CisJdGFza19yYXRlbGltaXQrKzsgLyogaXQgaGVscHMgcmFtcHVwIGRpcnR5X3JhdGVsaW1pdCBmcm9tIHRpbnkgdmFsdWVzICovCisKKwkvKgorCSAqIEEgbGluZWFyIGVzdGltYXRpb24gb2YgdGhlICJiYWxhbmNlZCIgdGhyb3R0bGUgcmF0ZS4gVGhlIHRoZW9yeSBpcywKKwkgKiBpZiB0aGVyZSBhcmUgTiBkZCB0YXNrcywgZWFjaCB0aHJvdHRsZWQgYXQgdGFza19yYXRlbGltaXQsIHRoZSBiZGkncworCSAqIGRpcnR5X3JhdGUgd2lsbCBiZSBtZWFzdXJlZCB0byBiZSAoTiAqIHRhc2tfcmF0ZWxpbWl0KS4gU28gdGhlIGJlbG93CisJICogZm9ybXVsYSB3aWxsIHlpZWxkIHRoZSBiYWxhbmNlZCByYXRlIGxpbWl0ICh3cml0ZV9idyAvIE4pLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSBleHBhbmRlZCBmb3JtIGlzIG5vdCBhIHB1cmUgcmF0ZSBmZWVkYmFjazoKKwkgKglyYXRlXyhpKzEpID0gcmF0ZV8oaSkgKiAod3JpdGVfYncgLyBkaXJ0eV9yYXRlKQkJICAgICAoMSkKKwkgKiBidXQgYWxzbyB0YWtlcyBwb3NfcmF0aW8gaW50byBhY2NvdW50OgorCSAqCXJhdGVfKGkrMSkgPSByYXRlXyhpKSAqICh3cml0ZV9idyAvIGRpcnR5X3JhdGUpICogcG9zX3JhdGlvICAoMikKKwkgKgorCSAqICgxKSBpcyBub3QgcmVhbGlzdGljIGJlY2F1c2UgcG9zX3JhdGlvIGFsc28gdGFrZXMgcGFydCBpbiBiYWxhbmNpbmcKKwkgKiB0aGUgZGlydHkgcmF0ZS4gIENvbnNpZGVyIHRoZSBzdGF0ZQorCSAqCXBvc19yYXRpbyA9IDAuNQkJCQkJCSAgICAgKDMpCisJICoJcmF0ZSA9IDIgKiAod3JpdGVfYncgLyBOKQkJCQkgICAgICg0KQorCSAqIElmICgxKSBpcyB1c2VkLCBpdCB3aWxsIHN0dWNrIGluIHRoYXQgc3RhdGUhIEJlY2F1c2UgZWFjaCBkZCB3aWxsCisJICogYmUgdGhyb3R0bGVkIGF0CisJICoJdGFza19yYXRlbGltaXQgPSBwb3NfcmF0aW8gKiByYXRlID0gKHdyaXRlX2J3IC8gTikJICAgICAoNSkKKwkgKiB5aWVsZGluZworCSAqCWRpcnR5X3JhdGUgPSBOICogdGFza19yYXRlbGltaXQgPSB3cml0ZV9idwkJICAgICAoNikKKwkgKiBwdXQgKDYpIGludG8gKDEpIHdlIGdldAorCSAqCXJhdGVfKGkrMSkgPSByYXRlXyhpKQkJCQkJICAgICAoNykKKwkgKgorCSAqIFNvIHdlIGVuZCB1cCB1c2luZyAoMikgdG8gYWx3YXlzIGtlZXAKKwkgKglyYXRlXyhpKzEpIH49ICh3cml0ZV9idyAvIE4pCQkJCSAgICAgKDgpCisJICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgcG9zX3JhdGlvLiBBcyBsb25nIGFzICg4KSBpcyBzYXRpc2ZpZWQsCisJICogcG9zX3JhdGlvIGlzIGFibGUgdG8gZHJpdmUgaXRzZWxmIHRvIDEuMCwgd2hpY2ggaXMgbm90IG9ubHkgd2hlcmUKKwkgKiB0aGUgZGlydHkgY291bnQgbWVldCB0aGUgc2V0cG9pbnQsIGJ1dCBhbHNvIHdoZXJlIHRoZSBzbG9wZSBvZgorCSAqIHBvc19yYXRpbyBpcyBtb3N0IGZsYXQgYW5kIGhlbmNlIHRhc2tfcmF0ZWxpbWl0IGlzIGxlYXN0IGZsdWN0dWF0ZWQuCisJICovCisJYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0ID0gZGl2X3U2NCgodTY0KXRhc2tfcmF0ZWxpbWl0ICogd3JpdGVfYncsCisJCQkJCSAgIGRpcnR5X3JhdGUgfCAxKTsKKworCS8qCisJICogV2UgY291bGQgc2FmZWx5IGRvIHRoaXMgYW5kIHJldHVybiBpbW1lZGlhdGVseToKKwkgKgorCSAqCWJkaS0+ZGlydHlfcmF0ZWxpbWl0ID0gYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0OworCSAqCisJICogSG93ZXZlciB0byBnZXQgYSBtb3JlIHN0YWJsZSBkaXJ0eV9yYXRlbGltaXQsIHRoZSBiZWxvdyBlbGFib3JhdGVkCisJICogY29kZSBtYWtlcyB1c2Ugb2YgdGFza19yYXRlbGltaXQgdG8gZmlsdGVyIG91dCBzaWd1bGFyIHBvaW50cyBhbmQKKwkgKiBsaW1pdCB0aGUgc3RlcCBzaXplLgorCSAqCisJICogVGhlIGJlbG93IGNvZGUgZXNzZW50aWFsbHkgb25seSB1c2VzIHRoZSByZWxhdGl2ZSB2YWx1ZSBvZgorCSAqCisJICoJdGFza19yYXRlbGltaXQgLSBkaXJ0eV9yYXRlbGltaXQKKwkgKgk9IChwb3NfcmF0aW8gLSAxKSAqIGRpcnR5X3JhdGVsaW1pdAorCSAqCisJICogd2hpY2ggcmVmbGVjdHMgdGhlIGRpcmVjdGlvbiBhbmQgc2l6ZSBvZiBkaXJ0eSBwb3NpdGlvbiBlcnJvci4KKwkgKi8KKworCS8qCisJICogZGlydHlfcmF0ZWxpbWl0IHdpbGwgZm9sbG93IGJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdCBpZmYKKwkgKiB0YXNrX3JhdGVsaW1pdCBpcyBvbiB0aGUgc2FtZSBzaWRlIG9mIGRpcnR5X3JhdGVsaW1pdCwgdG9vLgorCSAqIEZvciBleGFtcGxlLCB3aGVuCisJICogLSBkaXJ0eV9yYXRlbGltaXQgPiBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQKKwkgKiAtIGRpcnR5X3JhdGVsaW1pdCA+IHRhc2tfcmF0ZWxpbWl0IChkaXJ0eSBwYWdlcyBhcmUgYWJvdmUgc2V0cG9pbnQpCisJICogbG93ZXJpbmcgZGlydHlfcmF0ZWxpbWl0IHdpbGwgaGVscCBtZWV0IGJvdGggdGhlIHBvc2l0aW9uIGFuZCByYXRlCisJICogY29udHJvbCB0YXJnZXRzLiBPdGhlcndpc2UsIGRvbid0IHVwZGF0ZSBkaXJ0eV9yYXRlbGltaXQgaWYgaXQgd2lsbAorCSAqIG9ubHkgaGVscCBtZWV0IHRoZSByYXRlIHRhcmdldC4gQWZ0ZXIgYWxsLCB3aGF0IHRoZSB1c2VycyB1bHRpbWF0ZWx5CisJICogZmVlbCBhbmQgY2FyZSBhcmUgc3RhYmxlIGRpcnR5IHJhdGUgYW5kIHNtYWxsIHBvc2l0aW9uIGVycm9yLgorCSAqCisJICogfHRhc2tfcmF0ZWxpbWl0IC0gZGlydHlfcmF0ZWxpbWl0fCBpcyB1c2VkIHRvIGxpbWl0IHRoZSBzdGVwIHNpemUKKwkgKiBhbmQgZmlsdGVyIG91dCB0aGUgc2lndWxhciBwb2ludHMgb2YgYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LiBXaGljaAorCSAqIGtlZXBzIGp1bXBpbmcgYXJvdW5kIHJhbmRvbWx5IGFuZCBjYW4gZXZlbiBsZWFwIGZhciBhd2F5IGF0IHRpbWVzCisJICogZHVlIHRvIHRoZSBzbWFsbCAyMDBtcyBlc3RpbWF0aW9uIHBlcmlvZCBvZiBkaXJ0eV9yYXRlICh3ZSB3YW50IHRvCisJICoga2VlcCB0aGF0IHBlcmlvZCBzbWFsbCB0byByZWR1Y2UgdGltZSBsYWdzKS4KKwkgKi8KKwlzdGVwID0gMDsKKwlpZiAoZGlydHkgPCBzZXRwb2ludCkgeworCQl4ID0gbWluKGJkaS0+YmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LAorCQkJIG1pbihiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQsIHRhc2tfcmF0ZWxpbWl0KSk7CisJCWlmIChkaXJ0eV9yYXRlbGltaXQgPCB4KQorCQkJc3RlcCA9IHggLSBkaXJ0eV9yYXRlbGltaXQ7CisJfSBlbHNlIHsKKwkJeCA9IG1heChiZGktPmJhbGFuY2VkX2RpcnR5X3JhdGVsaW1pdCwKKwkJCSBtYXgoYmFsYW5jZWRfZGlydHlfcmF0ZWxpbWl0LCB0YXNrX3JhdGVsaW1pdCkpOworCQlpZiAoZGlydHlfcmF0ZWxpbWl0ID4geCkKKwkJCXN0ZXAgPSBkaXJ0eV9yYXRlbGltaXQgLSB4OworCX0KKworCS8qCisJICogRG9uJ3QgcHVyc3VlIDEwMCUgcmF0ZSBtYXRjaGluZy4gSXQncyBpbXBvc3NpYmxlIHNpbmNlIHRoZSBiYWxhbmNlZAorCSAqIHJhdGUgaXRzZWxmIGlzIGNvbnN0YW50bHkgZmx1Y3R1YXRpbmcuIFNvIGRlY3JlYXNlIHRoZSB0cmFjayBzcGVlZAorCSAqIHdoZW4gaXQgZ2V0cyBjbG9zZSB0byB0aGUgdGFyZ2V0LiBIZWxwcyBlbGltaW5hdGUgcG9pbnRsZXNzIHRyZW1vcnMuCisJICovCisJc3RlcCA+Pj0gZGlydHlfcmF0ZWxpbWl0IC8gKDIgKiBzdGVwICsgMSk7CisJLyoKKwkgKiBMaW1pdCB0aGUgdHJhY2tpbmcgc3BlZWQgdG8gYXZvaWQgb3ZlcnNob290aW5nLgorCSAqLworCXN0ZXAgPSAoc3RlcCArIDcpIC8gODsKKworCWlmIChkaXJ0eV9yYXRlbGltaXQgPCBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQpCisJCWRpcnR5X3JhdGVsaW1pdCArPSBzdGVwOworCWVsc2UKKwkJZGlydHlfcmF0ZWxpbWl0IC09IHN0ZXA7CisKKwliZGktPmRpcnR5X3JhdGVsaW1pdCA9IG1heChkaXJ0eV9yYXRlbGltaXQsIDFVTCk7CisJYmRpLT5iYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQgPSBiYWxhbmNlZF9kaXJ0eV9yYXRlbGltaXQ7CisKKwl0cmFjZV9iZGlfZGlydHlfcmF0ZWxpbWl0KGJkaSwgZGlydHlfcmF0ZSwgdGFza19yYXRlbGltaXQpOworfQorCiB2b2lkIF9fYmRpX3VwZGF0ZV9iYW5kd2lkdGgoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHRocmVzaCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGRpcnR5LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYmRpX3RocmVzaCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSwKQEAgLTYwMCw2ICs4OTEsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBub3cgLSBiZGktPmJ3X3RpbWVfc3RhbXA7CisJdW5zaWduZWQgbG9uZyBkaXJ0aWVkOwogCXVuc2lnbmVkIGxvbmcgd3JpdHRlbjsKIAogCS8qCkBAIC02MDgsNiArOTAwLDcgQEAKIAlpZiAoZWxhcHNlZCA8IEJBTkRXSURUSF9JTlRFUlZBTCkKIAkJcmV0dXJuOwogCisJZGlydGllZCA9IHBlcmNwdV9jb3VudGVyX3JlYWQoJmJkaS0+YmRpX3N0YXRbQkRJX0RJUlRJRURdKTsKIAl3cml0dGVuID0gcGVyY3B1X2NvdW50ZXJfcmVhZCgmYmRpLT5iZGlfc3RhdFtCRElfV1JJVFRFTl0pOwogCiAJLyoKQEAgLTYxNywxOCArOTEwLDIzIEBACiAJaWYgKGVsYXBzZWQgPiBIWiAmJiB0aW1lX2JlZm9yZShiZGktPmJ3X3RpbWVfc3RhbXAsIHN0YXJ0X3RpbWUpKQogCQlnb3RvIHNuYXBzaG90OwogCi0JaWYgKHRocmVzaCkKKwlpZiAodGhyZXNoKSB7CiAJCWdsb2JhbF91cGRhdGVfYmFuZHdpZHRoKHRocmVzaCwgZGlydHksIG5vdyk7Ci0KKwkJYmRpX3VwZGF0ZV9kaXJ0eV9yYXRlbGltaXQoYmRpLCB0aHJlc2gsIGJnX3RocmVzaCwgZGlydHksCisJCQkJCSAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJCQkJICAgZGlydGllZCwgZWxhcHNlZCk7CisJfQogCWJkaV91cGRhdGVfd3JpdGVfYmFuZHdpZHRoKGJkaSwgZWxhcHNlZCwgd3JpdHRlbik7CiAKIHNuYXBzaG90OgorCWJkaS0+ZGlydGllZF9zdGFtcCA9IGRpcnRpZWQ7CiAJYmRpLT53cml0dGVuX3N0YW1wID0gd3JpdHRlbjsKIAliZGktPmJ3X3RpbWVfc3RhbXAgPSBub3c7CiB9CiAKIHN0YXRpYyB2b2lkIGJkaV91cGRhdGVfYmFuZHdpZHRoKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCiAJCQkJIHVuc2lnbmVkIGxvbmcgdGhyZXNoLAorCQkJCSB1bnNpZ25lZCBsb25nIGJnX3RocmVzaCwKIAkJCQkgdW5zaWduZWQgbG9uZyBkaXJ0eSwKIAkJCQkgdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoLAogCQkJCSB1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eSwKQEAgLTYzNywzNyArOTM1LDk5IEBACiAJaWYgKHRpbWVfaXNfYWZ0ZXJfZXFfamlmZmllcyhiZGktPmJ3X3RpbWVfc3RhbXAgKyBCQU5EV0lEVEhfSU5URVJWQUwpKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrKCZiZGktPndiLmxpc3RfbG9jayk7Ci0JX19iZGlfdXBkYXRlX2JhbmR3aWR0aChiZGksIHRocmVzaCwgZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKLQkJCSAgICAgICBzdGFydF90aW1lKTsKKwlfX2JkaV91cGRhdGVfYmFuZHdpZHRoKGJkaSwgdGhyZXNoLCBiZ190aHJlc2gsIGRpcnR5LAorCQkJICAgICAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwgc3RhcnRfdGltZSk7CiAJc3Bpbl91bmxvY2soJmJkaS0+d2IubGlzdF9sb2NrKTsKIH0KIAogLyoKKyAqIEFmdGVyIGEgdGFzayBkaXJ0aWVkIHRoaXMgbWFueSBwYWdlcywgYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucigpCisgKiB3aWxsIGxvb2sgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIHN0YXJ0IGRpcnR5IHRocm90dGxpbmcuCisgKgorICogSWYgZGlydHlfcG9sbF9pbnRlcnZhbCBpcyB0b28gbG93LCBiaWcgTlVNQSBtYWNoaW5lcyB3aWxsIGNhbGwgdGhlIGV4cGVuc2l2ZQorICogZ2xvYmFsX3BhZ2Vfc3RhdGUoKSB0b28gb2Z0ZW4uIFNvIHNjYWxlIGl0IG5lYXItc3FydCB0byB0aGUgc2FmZXR5IG1hcmdpbgorICogKHRoZSBudW1iZXIgb2YgcGFnZXMgd2UgbWF5IGRpcnR5IHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBkaXJ0eSBsaW1pdHMpLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXJ0eV9wb2xsX2ludGVydmFsKHVuc2lnbmVkIGxvbmcgZGlydHksCisJCQkJCSB1bnNpZ25lZCBsb25nIHRocmVzaCkKK3sKKwlpZiAodGhyZXNoID4gZGlydHkpCisJCXJldHVybiAxVUwgPDwgKGlsb2cyKHRocmVzaCAtIGRpcnR5KSA+PiAxKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiZGlfbWF4X3BhdXNlKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCisJCQkJICAgdW5zaWduZWQgbG9uZyBiZGlfZGlydHkpCit7CisJdW5zaWduZWQgbG9uZyBidyA9IGJkaS0+YXZnX3dyaXRlX2JhbmR3aWR0aDsKKwl1bnNpZ25lZCBsb25nIGhpID0gaWxvZzIoYncpOworCXVuc2lnbmVkIGxvbmcgbG8gPSBpbG9nMihiZGktPmRpcnR5X3JhdGVsaW1pdCk7CisJdW5zaWduZWQgbG9uZyB0OworCisJLyogdGFyZ2V0IGZvciAyMG1zIG1heCBwYXVzZSBvbiAxLWRkIGNhc2UgKi8KKwl0ID0gSFogLyA1MDsKKworCS8qCisJICogU2NhbGUgdXAgcGF1c2UgdGltZSBmb3IgY29uY3VycmVudCBkaXJ0aWVycyBpbiBvcmRlciB0byByZWR1Y2UgQ1BVCisJICogb3ZlcmhlYWRzLgorCSAqCisJICogKE4gKiAyMG1zKSBvbiAyXk4gY29uY3VycmVudCB0YXNrcy4KKwkgKi8KKwlpZiAoaGkgPiBsbykKKwkJdCArPSAoaGkgLSBsbykgKiAoMjAgKiBIWikgLyAxMDI0OworCisJLyoKKwkgKiBMaW1pdCBwYXVzZSB0aW1lIGZvciBzbWFsbCBtZW1vcnkgc3lzdGVtcy4gSWYgc2xlZXBpbmcgZm9yIHRvbyBsb25nCisJICogdGltZSwgYSBzbWFsbCBwb29sIG9mIGRpcnR5L3dyaXRlYmFjayBwYWdlcyBtYXkgZ28gZW1wdHkgYW5kIGRpc2sgZ28KKwkgKiBpZGxlLgorCSAqCisJICogOCBzZXJ2ZXMgYXMgdGhlIHNhZmV0eSByYXRpby4KKwkgKi8KKwlpZiAoYmRpX2RpcnR5KQorCQl0ID0gbWluKHQsIGJkaV9kaXJ0eSAqIEhaIC8gKDggKiBidyArIDEpKTsKKworCS8qCisJICogVGhlIHBhdXNlIHRpbWUgd2lsbCBiZSBzZXR0bGVkIHdpdGhpbiByYW5nZSAobWF4X3BhdXNlLzQsIG1heF9wYXVzZSkuCisJICogQXBwbHkgYSBtaW5pbWFsIHZhbHVlIG9mIDQgdG8gZ2V0IGEgbm9uLXplcm8gbWF4X3BhdXNlLzQuCisJICovCisJcmV0dXJuIGNsYW1wX3ZhbCh0LCA0LCBNQVhfUEFVU0UpOworfQorCisvKgogICogYmFsYW5jZV9kaXJ0eV9wYWdlcygpIG11c3QgYmUgY2FsbGVkIGJ5IHByb2Nlc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGluZyBkaXJ0eQogICogZGF0YS4gIEl0IGxvb2tzIGF0IHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgaW4gdGhlIG1hY2hpbmUgYW5kIHdpbGwgZm9yY2UKLSAqIHRoZSBjYWxsZXIgdG8gcGVyZm9ybSB3cml0ZWJhY2sgaWYgdGhlIHN5c3RlbSBpcyBvdmVyIGB2bV9kaXJ0eV9yYXRpbycuCisgKiB0aGUgY2FsbGVyIHRvIHdhaXQgb25jZSBjcm9zc2luZyB0aGUgKGJhY2tncm91bmRfdGhyZXNoICsgZGlydHlfdGhyZXNoKSAvIDIuCiAgKiBJZiB3ZSdyZSBvdmVyIGBiYWNrZ3JvdW5kX3RocmVzaCcgdGhlbiB0aGUgd3JpdGViYWNrIHRocmVhZHMgYXJlIHdva2VuIHRvCiAgKiBwZXJmb3JtIHNvbWUgd3JpdGVvdXQuCiAgKi8KIHN0YXRpYyB2b2lkIGJhbGFuY2VfZGlydHlfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJdW5zaWduZWQgbG9uZyB3cml0ZV9jaHVuaykKKwkJCQl1bnNpZ25lZCBsb25nIHBhZ2VzX2RpcnRpZWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltYWJsZSwgYmRpX25yX3JlY2xhaW1hYmxlOworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWFibGU7CS8qID0gZmlsZV9kaXJ0eSArIHVuc3RhYmxlX25mcyAqLworCXVuc2lnbmVkIGxvbmcgYmRpX3JlY2xhaW1hYmxlOwogCXVuc2lnbmVkIGxvbmcgbnJfZGlydHk7ICAvKiA9IGZpbGVfZGlydHkgKyB3cml0ZWJhY2sgKyB1bnN0YWJsZV9uZnMgKi8KIAl1bnNpZ25lZCBsb25nIGJkaV9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIGZyZWVydW47CiAJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKIAl1bnNpZ25lZCBsb25nIGJkaV90aHJlc2g7Ci0JdW5zaWduZWQgbG9uZyB0YXNrX2JkaV90aHJlc2g7Ci0JdW5zaWduZWQgbG9uZyBtaW5fdGFza19iZGlfdGhyZXNoOwotCXVuc2lnbmVkIGxvbmcgcGFnZXNfd3JpdHRlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBwYXVzZSA9IDE7CisJbG9uZyBwYXVzZSA9IDA7CisJbG9uZyB1bmluaXRpYWxpemVkX3ZhcihtYXhfcGF1c2UpOwogCWJvb2wgZGlydHlfZXhjZWVkZWQgPSBmYWxzZTsKLQlib29sIGNsZWFyX2RpcnR5X2V4Y2VlZGVkID0gdHJ1ZTsKKwl1bnNpZ25lZCBsb25nIHRhc2tfcmF0ZWxpbWl0OworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZGlydHlfcmF0ZWxpbWl0KTsKKwl1bnNpZ25lZCBsb25nIHBvc19yYXRpbzsKIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCiAJZm9yICg7OykgeworCQkvKgorCQkgKiBVbnN0YWJsZSB3cml0ZXMgYXJlIGEgZmVhdHVyZSBvZiBjZXJ0YWluIG5ldHdvcmtlZAorCQkgKiBmaWxlc3lzdGVtcyAoaS5lLiBORlMpIGluIHdoaWNoIGRhdGEgbWF5IGhhdmUgYmVlbgorCQkgKiB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIncyB3cml0ZSBjYWNoZSwgYnV0IGhhcyBub3QgeWV0CisJCSAqIGJlZW4gZmx1c2hlZCB0byBwZXJtYW5lbnQgc3RvcmFnZS4KKwkJICovCiAJCW5yX3JlY2xhaW1hYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkgKwogCQkJCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpOwogCQlucl9kaXJ0eSA9IG5yX3JlY2xhaW1hYmxlICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfV1JJVEVCQUNLKTsKQEAgLTY3OSwxMiArMTAzOSwyOCBAQAogCQkgKiBjYXRjaC11cC4gVGhpcyBhdm9pZHMgKGV4Y2Vzc2l2ZWx5KSBzbWFsbCB3cml0ZW91dHMKIAkJICogd2hlbiB0aGUgYmRpIGxpbWl0cyBhcmUgcmFtcGluZyB1cC4KIAkJICovCi0JCWlmIChucl9kaXJ0eSA8PSAoYmFja2dyb3VuZF90aHJlc2ggKyBkaXJ0eV90aHJlc2gpIC8gMikKKwkJZnJlZXJ1biA9IGRpcnR5X2ZyZWVydW5fY2VpbGluZyhkaXJ0eV90aHJlc2gsCisJCQkJCQliYWNrZ3JvdW5kX3RocmVzaCk7CisJCWlmIChucl9kaXJ0eSA8PSBmcmVlcnVuKQogCQkJYnJlYWs7CiAKKwkJaWYgKHVubGlrZWx5KCF3cml0ZWJhY2tfaW5fcHJvZ3Jlc3MoYmRpKSkpCisJCQliZGlfc3RhcnRfYmFja2dyb3VuZF93cml0ZWJhY2soYmRpKTsKKworCQkvKgorCQkgKiBiZGlfdGhyZXNoIGlzIG5vdCB0cmVhdGVkIGFzIHNvbWUgbGltaXRpbmcgZmFjdG9yIGFzCisJCSAqIGRpcnR5X3RocmVzaCwgZHVlIHRvIHJlYXNvbnMKKwkJICogLSBpbiBKQk9EIHNldHVwLCBiZGlfdGhyZXNoIGNhbiBmbHVjdHVhdGUgYSBsb3QKKwkJICogLSBpbiBhIHN5c3RlbSB3aXRoIEhERCBhbmQgVVNCIGtleSwgdGhlIFVTQiBrZXkgbWF5IHNvbWVob3cKKwkJICogICBnbyBpbnRvIHN0YXRlIChiZGlfZGlydHkgPj4gYmRpX3RocmVzaCkgZWl0aGVyIGJlY2F1c2UKKwkJICogICBiZGlfZGlydHkgc3RhcnRzIGhpZ2gsIG9yIGJlY2F1c2UgYmRpX3RocmVzaCBkcm9wcyBsb3cuCisJCSAqICAgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gaGFyZCB0aHJvdHRsZSB0aGUgVVNCIGtleQorCQkgKiAgIGRpcnRpZXJzIGZvciAxMDAgc2Vjb25kcyB1bnRpbCBiZGlfZGlydHkgZHJvcHMgdW5kZXIKKwkJICogICBiZGlfdGhyZXNoLiBJbnN0ZWFkIHRoZSBhdXhpbGlhcnkgYmRpIGNvbnRyb2wgbGluZSBpbgorCQkgKiAgIGJkaV9wb3NpdGlvbl9yYXRpbygpIHdpbGwgbGV0IHRoZSBkaXJ0aWVyIHRhc2sgcHJvZ3Jlc3MKKwkJICogICBhdCBzb21lIHJhdGUgPD0gKHdyaXRlX2J3IC8gMikgZm9yIGJyaW5naW5nIGRvd24gYmRpX2RpcnR5LgorCQkgKi8KIAkJYmRpX3RocmVzaCA9IGJkaV9kaXJ0eV9saW1pdChiZGksIGRpcnR5X3RocmVzaCk7Ci0JCW1pbl90YXNrX2JkaV90aHJlc2ggPSB0YXNrX21pbl9kaXJ0eV9saW1pdChiZGlfdGhyZXNoKTsKLQkJdGFza19iZGlfdGhyZXNoID0gdGFza19kaXJ0eV9saW1pdChjdXJyZW50LCBiZGlfdGhyZXNoKTsKIAogCQkvKgogCQkgKiBJbiBvcmRlciB0byBhdm9pZCB0aGUgc3RhY2tlZCBCREkgZGVhZGxvY2sgd2UgbmVlZApAQCAtNjk2LDU2ICsxMDcyLDY5IEBACiAJCSAqIGFjdHVhbGx5IGRpcnR5OyB3aXRoIG0rbiBzaXR0aW5nIGluIHRoZSBwZXJjcHUKIAkJICogZGVsdGFzLgogCQkgKi8KLQkJaWYgKHRhc2tfYmRpX3RocmVzaCA8IDIgKiBiZGlfc3RhdF9lcnJvcihiZGkpKSB7Ci0JCQliZGlfbnJfcmVjbGFpbWFibGUgPSBiZGlfc3RhdF9zdW0oYmRpLCBCRElfUkVDTEFJTUFCTEUpOwotCQkJYmRpX2RpcnR5ID0gYmRpX25yX3JlY2xhaW1hYmxlICsKKwkJaWYgKGJkaV90aHJlc2ggPCAyICogYmRpX3N0YXRfZXJyb3IoYmRpKSkgeworCQkJYmRpX3JlY2xhaW1hYmxlID0gYmRpX3N0YXRfc3VtKGJkaSwgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJCWJkaV9kaXJ0eSA9IGJkaV9yZWNsYWltYWJsZSArCiAJCQkJICAgIGJkaV9zdGF0X3N1bShiZGksIEJESV9XUklURUJBQ0spOwogCQl9IGVsc2UgewotCQkJYmRpX25yX3JlY2xhaW1hYmxlID0gYmRpX3N0YXQoYmRpLCBCRElfUkVDTEFJTUFCTEUpOwotCQkJYmRpX2RpcnR5ID0gYmRpX25yX3JlY2xhaW1hYmxlICsKKwkJCWJkaV9yZWNsYWltYWJsZSA9IGJkaV9zdGF0KGJkaSwgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJCWJkaV9kaXJ0eSA9IGJkaV9yZWNsYWltYWJsZSArCiAJCQkJICAgIGJkaV9zdGF0KGJkaSwgQkRJX1dSSVRFQkFDSyk7CiAJCX0KIAotCQkvKgotCQkgKiBUaGUgYmRpIHRocmVzaCBpcyBzb21laG93ICJzb2Z0IiBsaW1pdCBkZXJpdmVkIGZyb20gdGhlCi0JCSAqIGdsb2JhbCAiaGFyZCIgbGltaXQuIFRoZSBmb3JtZXIgaGVscHMgdG8gcHJldmVudCBoZWF2eSBJTwotCQkgKiBiZGkgb3IgcHJvY2VzcyBmcm9tIGhvbGRpbmcgYmFjayBsaWdodCBvbmVzOyBUaGUgbGF0dGVyIGlzCi0JCSAqIHRoZSBsYXN0IHJlc29ydCBzYWZlZ3VhcmQuCi0JCSAqLwotCQlkaXJ0eV9leGNlZWRlZCA9IChiZGlfZGlydHkgPiB0YXNrX2JkaV90aHJlc2gpIHx8CisJCWRpcnR5X2V4Y2VlZGVkID0gKGJkaV9kaXJ0eSA+IGJkaV90aHJlc2gpIHx8CiAJCQkJICAobnJfZGlydHkgPiBkaXJ0eV90aHJlc2gpOwotCQljbGVhcl9kaXJ0eV9leGNlZWRlZCA9IChiZGlfZGlydHkgPD0gbWluX3Rhc2tfYmRpX3RocmVzaCkgJiYKLQkJCQkJKG5yX2RpcnR5IDw9IGRpcnR5X3RocmVzaCk7Ci0KLQkJaWYgKCFkaXJ0eV9leGNlZWRlZCkKLQkJCWJyZWFrOwotCi0JCWlmICghYmRpLT5kaXJ0eV9leGNlZWRlZCkKKwkJaWYgKGRpcnR5X2V4Y2VlZGVkICYmICFiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQkJYmRpLT5kaXJ0eV9leGNlZWRlZCA9IDE7CiAKLQkJYmRpX3VwZGF0ZV9iYW5kd2lkdGgoYmRpLCBkaXJ0eV90aHJlc2gsIG5yX2RpcnR5LAotCQkJCSAgICAgYmRpX3RocmVzaCwgYmRpX2RpcnR5LCBzdGFydF90aW1lKTsKKwkJYmRpX3VwZGF0ZV9iYW5kd2lkdGgoYmRpLCBkaXJ0eV90aHJlc2gsIGJhY2tncm91bmRfdGhyZXNoLAorCQkJCSAgICAgbnJfZGlydHksIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSwKKwkJCQkgICAgIHN0YXJ0X3RpbWUpOwogCi0JCS8qIE5vdGU6IG5yX3JlY2xhaW1hYmxlIGRlbm90ZXMgbnJfZGlydHkgKyBucl91bnN0YWJsZS4KLQkJICogVW5zdGFibGUgd3JpdGVzIGFyZSBhIGZlYXR1cmUgb2YgY2VydGFpbiBuZXR3b3JrZWQKLQkJICogZmlsZXN5c3RlbXMgKGkuZS4gTkZTKSBpbiB3aGljaCBkYXRhIG1heSBoYXZlIGJlZW4KLQkJICogd3JpdHRlbiB0byB0aGUgc2VydmVyJ3Mgd3JpdGUgY2FjaGUsIGJ1dCBoYXMgbm90IHlldAotCQkgKiBiZWVuIGZsdXNoZWQgdG8gcGVybWFuZW50IHN0b3JhZ2UuCi0JCSAqIE9ubHkgbW92ZSBwYWdlcyB0byB3cml0ZWJhY2sgaWYgdGhpcyBiZGkgaXMgb3ZlciBpdHMKLQkJICogdGhyZXNob2xkIG90aGVyd2lzZSB3YWl0IHVudGlsIHRoZSBkaXNrIHdyaXRlcyBjYXRjaAotCQkgKiB1cC4KLQkJICovCi0JCXRyYWNlX2JhbGFuY2VfZGlydHlfc3RhcnQoYmRpKTsKLQkJaWYgKGJkaV9ucl9yZWNsYWltYWJsZSA+IHRhc2tfYmRpX3RocmVzaCkgewotCQkJcGFnZXNfd3JpdHRlbiArPSB3cml0ZWJhY2tfaW5vZGVzX3diKCZiZGktPndiLAotCQkJCQkJCSAgICAgd3JpdGVfY2h1bmspOwotCQkJdHJhY2VfYmFsYW5jZV9kaXJ0eV93cml0dGVuKGJkaSwgcGFnZXNfd3JpdHRlbik7Ci0JCQlpZiAocGFnZXNfd3JpdHRlbiA+PSB3cml0ZV9jaHVuaykKLQkJCQlicmVhazsJCS8qIFdlJ3ZlIGRvbmUgb3VyIGR1dHkgKi8KKwkJbWF4X3BhdXNlID0gYmRpX21heF9wYXVzZShiZGksIGJkaV9kaXJ0eSk7CisKKwkJZGlydHlfcmF0ZWxpbWl0ID0gYmRpLT5kaXJ0eV9yYXRlbGltaXQ7CisJCXBvc19yYXRpbyA9IGJkaV9wb3NpdGlvbl9yYXRpbyhiZGksIGRpcnR5X3RocmVzaCwKKwkJCQkJICAgICAgIGJhY2tncm91bmRfdGhyZXNoLCBucl9kaXJ0eSwKKwkJCQkJICAgICAgIGJkaV90aHJlc2gsIGJkaV9kaXJ0eSk7CisJCXRhc2tfcmF0ZWxpbWl0ID0gKCh1NjQpZGlydHlfcmF0ZWxpbWl0ICogcG9zX3JhdGlvKSA+PgorCQkJCQkJCVJBVEVMSU1JVF9DQUxDX1NISUZUOworCQlpZiAodW5saWtlbHkodGFza19yYXRlbGltaXQgPT0gMCkpIHsKKwkJCXBhdXNlID0gbWF4X3BhdXNlOworCQkJZ290byBwYXVzZTsKIAkJfQorCQlwYXVzZSA9IEhaICogcGFnZXNfZGlydGllZCAvIHRhc2tfcmF0ZWxpbWl0OworCQlpZiAodW5saWtlbHkocGF1c2UgPD0gMCkpIHsKKwkJCXRyYWNlX2JhbGFuY2VfZGlydHlfcGFnZXMoYmRpLAorCQkJCQkJICBkaXJ0eV90aHJlc2gsCisJCQkJCQkgIGJhY2tncm91bmRfdGhyZXNoLAorCQkJCQkJICBucl9kaXJ0eSwKKwkJCQkJCSAgYmRpX3RocmVzaCwKKwkJCQkJCSAgYmRpX2RpcnR5LAorCQkJCQkJICBkaXJ0eV9yYXRlbGltaXQsCisJCQkJCQkgIHRhc2tfcmF0ZWxpbWl0LAorCQkJCQkJICBwYWdlc19kaXJ0aWVkLAorCQkJCQkJICBwYXVzZSwKKwkJCQkJCSAgc3RhcnRfdGltZSk7CisJCQlwYXVzZSA9IDE7IC8qIGF2b2lkIHJlc2V0dGluZyBucl9kaXJ0aWVkX3BhdXNlIGJlbG93ICovCisJCQlicmVhazsKKwkJfQorCQlwYXVzZSA9IG1pbihwYXVzZSwgbWF4X3BhdXNlKTsKKworcGF1c2U6CisJCXRyYWNlX2JhbGFuY2VfZGlydHlfcGFnZXMoYmRpLAorCQkJCQkgIGRpcnR5X3RocmVzaCwKKwkJCQkJICBiYWNrZ3JvdW5kX3RocmVzaCwKKwkJCQkJICBucl9kaXJ0eSwKKwkJCQkJICBiZGlfdGhyZXNoLAorCQkJCQkgIGJkaV9kaXJ0eSwKKwkJCQkJICBkaXJ0eV9yYXRlbGltaXQsCisJCQkJCSAgdGFza19yYXRlbGltaXQsCisJCQkJCSAgcGFnZXNfZGlydGllZCwKKwkJCQkJICBwYXVzZSwKKwkJCQkJICBzdGFydF90aW1lKTsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCWlvX3NjaGVkdWxlX3RpbWVvdXQocGF1c2UpOwotCQl0cmFjZV9iYWxhbmNlX2RpcnR5X3dhaXQoYmRpKTsKIAogCQlkaXJ0eV90aHJlc2ggPSBoYXJkX2RpcnR5X2xpbWl0KGRpcnR5X3RocmVzaCk7CiAJCS8qCkBAIC03NTQsMjQgKzExNDMsMzAgQEAKIAkJICogMjAwbXMgaXMgdHlwaWNhbGx5IG1vcmUgdGhhbiBlbm91Z2ggdG8gY3VyYiBoZWF2eSBkaXJ0aWVyczsKIAkJICogKGIpIHRoZSBwYXVzZSB0aW1lIGxpbWl0IG1ha2VzIHRoZSBkaXJ0aWVycyBtb3JlIHJlc3BvbnNpdmUuCiAJCSAqLwotCQlpZiAobnJfZGlydHkgPCBkaXJ0eV90aHJlc2ggJiYKLQkJICAgIGJkaV9kaXJ0eSA8ICh0YXNrX2JkaV90aHJlc2ggKyBiZGlfdGhyZXNoKSAvIDIgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnRfdGltZSArIE1BWF9QQVVTRSkpCisJCWlmIChucl9kaXJ0eSA8IGRpcnR5X3RocmVzaCkKIAkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIEluY3JlYXNlIHRoZSBkZWxheSBmb3IgZWFjaCBsb29wLCB1cCB0byBvdXIgcHJldmlvdXMKLQkJICogZGVmYXVsdCBvZiB0YWtpbmcgYSAxMDBtcyBuYXAuCi0JCSAqLwotCQlwYXVzZSA8PD0gMTsKLQkJaWYgKHBhdXNlID4gSFogLyAxMCkKLQkJCXBhdXNlID0gSFogLyAxMDsKIAl9CiAKLQkvKiBDbGVhciBkaXJ0eV9leGNlZWRlZCBmbGFnIG9ubHkgd2hlbiBubyB0YXNrIGNhbiBleGNlZWQgdGhlIGxpbWl0ICovCi0JaWYgKGNsZWFyX2RpcnR5X2V4Y2VlZGVkICYmIGJkaS0+ZGlydHlfZXhjZWVkZWQpCisJaWYgKCFkaXJ0eV9leGNlZWRlZCAmJiBiZGktPmRpcnR5X2V4Y2VlZGVkKQogCQliZGktPmRpcnR5X2V4Y2VlZGVkID0gMDsKIAorCWN1cnJlbnQtPm5yX2RpcnRpZWQgPSAwOworCWlmIChwYXVzZSA9PSAwKSB7IC8qIGluIGZyZWVydW4gYXJlYSAqLworCQljdXJyZW50LT5ucl9kaXJ0aWVkX3BhdXNlID0KKwkJCQlkaXJ0eV9wb2xsX2ludGVydmFsKG5yX2RpcnR5LCBkaXJ0eV90aHJlc2gpOworCX0gZWxzZSBpZiAocGF1c2UgPD0gbWF4X3BhdXNlIC8gNCAmJgorCQkgICBwYWdlc19kaXJ0aWVkID49IGN1cnJlbnQtPm5yX2RpcnRpZWRfcGF1c2UpIHsKKwkJY3VycmVudC0+bnJfZGlydGllZF9wYXVzZSA9IGNsYW1wX3ZhbCgKKwkJCQkJZGlydHlfcmF0ZWxpbWl0ICogKG1heF9wYXVzZSAvIDIpIC8gSFosCisJCQkJCXBhZ2VzX2RpcnRpZWQgKyBwYWdlc19kaXJ0aWVkIC8gOCwKKwkJCQkJcGFnZXNfZGlydGllZCAqIDQpOworCX0gZWxzZSBpZiAocGF1c2UgPj0gbWF4X3BhdXNlKSB7CisJCWN1cnJlbnQtPm5yX2RpcnRpZWRfcGF1c2UgPSAxIHwgY2xhbXBfdmFsKAorCQkJCQlkaXJ0eV9yYXRlbGltaXQgKiAobWF4X3BhdXNlIC8gMikgLyBIWiwKKwkJCQkJcGFnZXNfZGlydGllZCAvIDQsCisJCQkJCXBhZ2VzX2RpcnRpZWQgLSBwYWdlc19kaXJ0aWVkIC8gOCk7CisJfQorCiAJaWYgKHdyaXRlYmFja19pbl9wcm9ncmVzcyhiZGkpKQogCQlyZXR1cm47CiAKQEAgLTc4Myw4ICsxMTc4LDEwIEBACiAJICogSW4gbm9ybWFsIG1vZGUsIHdlIHN0YXJ0IGJhY2tncm91bmQgd3JpdGVvdXQgYXQgdGhlIGxvd2VyCiAJICogYmFja2dyb3VuZF90aHJlc2gsIHRvIGtlZXAgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgbG93LgogCSAqLwotCWlmICgobGFwdG9wX21vZGUgJiYgcGFnZXNfd3JpdHRlbikgfHwKLQkgICAgKCFsYXB0b3BfbW9kZSAmJiAobnJfcmVjbGFpbWFibGUgPiBiYWNrZ3JvdW5kX3RocmVzaCkpKQorCWlmIChsYXB0b3BfbW9kZSkKKwkJcmV0dXJuOworCisJaWYgKG5yX3JlY2xhaW1hYmxlID4gYmFja2dyb3VuZF90aHJlc2gpCiAJCWJkaV9zdGFydF9iYWNrZ3JvdW5kX3dyaXRlYmFjayhiZGkpOwogfQogCkBAIC03OTgsNyArMTE5NSw3IEBACiAJfQogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgYmRwX3JhdGVsaW1pdHMpID0gMDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGJkcF9yYXRlbGltaXRzKTsKIAogLyoqCiAgKiBiYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yIC0gYmFsYW5jZSBkaXJ0eSBtZW1vcnkgc3RhdGUKQEAgLTgxOCwzMSArMTIxNSwzOSBAQAogCQkJCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzX2RpcnRpZWQpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JdW5zaWduZWQgbG9uZyByYXRlbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyAqcDsKKwlpbnQgcmF0ZWxpbWl0OworCWludCAqcDsKIAogCWlmICghYmRpX2NhcF9hY2NvdW50X2RpcnR5KGJkaSkpCiAJCXJldHVybjsKIAotCXJhdGVsaW1pdCA9IHJhdGVsaW1pdF9wYWdlczsKLQlpZiAobWFwcGluZy0+YmFja2luZ19kZXZfaW5mby0+ZGlydHlfZXhjZWVkZWQpCi0JCXJhdGVsaW1pdCA9IDg7CisJcmF0ZWxpbWl0ID0gY3VycmVudC0+bnJfZGlydGllZF9wYXVzZTsKKwlpZiAoYmRpLT5kaXJ0eV9leGNlZWRlZCkKKwkJcmF0ZWxpbWl0ID0gbWluKHJhdGVsaW1pdCwgMzIgPj4gKFBBR0VfU0hJRlQgLSAxMCkpOwogCi0JLyoKLQkgKiBDaGVjayB0aGUgcmF0ZSBsaW1pdGluZy4gQWxzbywgd2UgZG8gbm90IHdhbnQgdG8gdGhyb3R0bGUgcmVhbC10aW1lCi0JICogdGFza3MgaW4gYmFsYW5jZV9kaXJ0eV9wYWdlcygpLiBQZXJpb2QuCi0JICovCisJY3VycmVudC0+bnJfZGlydGllZCArPSBucl9wYWdlc19kaXJ0aWVkOworCiAJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBUaGlzIHByZXZlbnRzIG9uZSBDUFUgdG8gYWNjdW11bGF0ZSB0b28gbWFueSBkaXJ0aWVkIHBhZ2VzIHdpdGhvdXQKKwkgKiBjYWxsaW5nIGludG8gYmFsYW5jZV9kaXJ0eV9wYWdlcygpLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgYXJlCisJICogMTAwMCsgdGFza3MsIGFsbCBvZiB0aGVtIHN0YXJ0IGRpcnR5aW5nIHBhZ2VzIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkgKiB0aW1lLCBoZW5jZSBhbGwgaG9ub3VyZWQgdG9vIGxhcmdlIGluaXRpYWwgdGFzay0+bnJfZGlydGllZF9wYXVzZS4KKwkgKi8KIAlwID0gICZfX2dldF9jcHVfdmFyKGJkcF9yYXRlbGltaXRzKTsKLQkqcCArPSBucl9wYWdlc19kaXJ0aWVkOwotCWlmICh1bmxpa2VseSgqcCA+PSByYXRlbGltaXQpKSB7Ci0JCXJhdGVsaW1pdCA9IHN5bmNfd3JpdGViYWNrX3BhZ2VzKCpwKTsKKwlpZiAodW5saWtlbHkoY3VycmVudC0+bnJfZGlydGllZCA+PSByYXRlbGltaXQpKQogCQkqcCA9IDA7Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JCWJhbGFuY2VfZGlydHlfcGFnZXMobWFwcGluZywgcmF0ZWxpbWl0KTsKLQkJcmV0dXJuOworCWVsc2UgeworCQkqcCArPSBucl9wYWdlc19kaXJ0aWVkOworCQlpZiAodW5saWtlbHkoKnAgPj0gcmF0ZWxpbWl0X3BhZ2VzKSkgeworCQkJKnAgPSAwOworCQkJcmF0ZWxpbWl0ID0gMDsKKwkJfQogCX0KIAlwcmVlbXB0X2VuYWJsZSgpOworCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPm5yX2RpcnRpZWQgPj0gcmF0ZWxpbWl0KSkKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlcyhtYXBwaW5nLCBjdXJyZW50LT5ucl9kaXJ0aWVkKTsKIH0KIEVYUE9SVF9TWU1CT0woYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucik7CiAKQEAgLTg5OCw3ICsxMzAzLDggQEAKIAkgKiB0aHJlc2hvbGQKIAkgKi8KIAlpZiAoYmRpX2hhc19kaXJ0eV9pbygmcS0+YmFja2luZ19kZXZfaW5mbykpCi0JCWJkaV9zdGFydF93cml0ZWJhY2soJnEtPmJhY2tpbmdfZGV2X2luZm8sIG5yX3BhZ2VzKTsKKwkJYmRpX3N0YXJ0X3dyaXRlYmFjaygmcS0+YmFja2luZ19kZXZfaW5mbywgbnJfcGFnZXMsCisJCQkJCVdCX1JFQVNPTl9MQVBUT1BfVElNRVIpOwogfQogCiAvKgpAQCAtOTM3LDIyICsxMzQzLDE3IEBACiAgKgogICogSGVyZSB3ZSBzZXQgcmF0ZWxpbWl0X3BhZ2VzIHRvIGEgbGV2ZWwgd2hpY2ggZW5zdXJlcyB0aGF0IHdoZW4gYWxsIENQVXMgYXJlCiAgKiBkaXJ0eWluZyBpbiBwYXJhbGxlbCwgd2UgY2Fubm90IGdvIG1vcmUgdGhhbiAzJSAoMS8zMikgb3ZlciB0aGUgZGlydHkgbWVtb3J5Ci0gKiB0aHJlc2hvbGRzIGJlZm9yZSB3cml0ZWJhY2sgY3V0cyBpbi4KLSAqCi0gKiBCdXQgdGhlIGxpbWl0IHNob3VsZCBub3QgYmUgc2V0IHRvbyBoaWdoLiAgQmVjYXVzZSBpdCBhbHNvIGNvbnRyb2xzIHRoZQotICogYW1vdW50IG9mIG1lbW9yeSB3aGljaCB0aGUgYmFsYW5jZV9kaXJ0eV9wYWdlcygpIGNhbGxlciBoYXMgdG8gd3JpdGUgYmFjay4KLSAqIElmIHRoaXMgaXMgdG9vIGxhcmdlIHRoZW4gdGhlIGNhbGxlciB3aWxsIGJsb2NrIG9uIHRoZSBJTyBxdWV1ZSBhbGwgdGhlCi0gKiB0aW1lLiAgU28gbGltaXQgaXQgdG8gZm91ciBtZWdhYnl0ZXMgLSB0aGUgYmFsYW5jZV9kaXJ0eV9wYWdlcygpIGNhbGxlcgotICogd2lsbCB3cml0ZSBzaXggbWVnYWJ5dGUgY2h1bmtzLCBtYXguCisgKiB0aHJlc2hvbGRzLgogICovCiAKIHZvaWQgd3JpdGViYWNrX3NldF9yYXRlbGltaXQodm9pZCkKIHsKLQlyYXRlbGltaXRfcGFnZXMgPSB2bV90b3RhbF9wYWdlcyAvIChudW1fb25saW5lX2NwdXMoKSAqIDMyKTsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOworCWdsb2JhbF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoKTsKKwlyYXRlbGltaXRfcGFnZXMgPSBkaXJ0eV90aHJlc2ggLyAobnVtX29ubGluZV9jcHVzKCkgKiAzMik7CiAJaWYgKHJhdGVsaW1pdF9wYWdlcyA8IDE2KQogCQlyYXRlbGltaXRfcGFnZXMgPSAxNjsKLQlpZiAocmF0ZWxpbWl0X3BhZ2VzICogUEFHRV9DQUNIRV9TSVpFID4gNDA5NiAqIDEwMjQpCi0JCXJhdGVsaW1pdF9wYWdlcyA9ICg0MDk2ICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7CiB9CiAKIHN0YXRpYyBpbnQgX19jcHVpbml0CkBAIC0xMzIyLDYgKzE3MjMsNyBAQAogCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7CiAJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9ESVJUSUVEKTsKIAkJX19pbmNfYmRpX3N0YXQobWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJX19pbmNfYmRpX3N0YXQobWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywgQkRJX0RJUlRJRUQpOwogCQl0YXNrX2RpcnR5X2luYyhjdXJyZW50KTsKIAkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDZlOGVjYjYuLjlkZDQ0M2QgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTMxOCw2ICszMTgsNyBAQAogCQljdXJyZW50LT5jb21tLCBwYWdlX3RvX3BmbihwYWdlKSk7CiAJZHVtcF9wYWdlKHBhZ2UpOwogCisJcHJpbnRfbW9kdWxlcygpOwogCWR1bXBfc3RhY2soKTsKIG91dDoKIAkvKiBMZWF2ZSBiYWQgZmllbGRzIGZvciBkZWJ1ZywgZXhjZXB0IFBhZ2VCdWRkeSBjb3VsZCBtYWtlIHRyb3VibGUgKi8KQEAgLTE3NTMsNyArMTc1NCw2IEBACiAKIHZvaWQgd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlciwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcmdzOwogCXVuc2lnbmVkIGludCBmaWx0ZXIgPSBTSE9XX01FTV9GSUxURVJfTk9ERVM7CiAKIAlpZiAoKGdmcF9tYXNrICYgX19HRlBfTk9XQVJOKSB8fCAhX19yYXRlbGltaXQoJm5vcGFnZV9ycykpCkBAIC0xNzcyLDE0ICsxNzcyLDIxIEBACiAJCWZpbHRlciAmPSB+U0hPV19NRU1fRklMVEVSX05PREVTOwogCiAJaWYgKGZtdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HKTsKKwkJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJCXZhX2xpc3QgYXJnczsKKwogCQl2YV9zdGFydChhcmdzLCBmbXQpOwotCQl2cHJpbnRrKGZtdCwgYXJncyk7CisKKwkJdmFmLmZtdCA9IGZtdDsKKwkJdmFmLnZhID0gJmFyZ3M7CisKKwkJcHJfd2FybigiJXBWIiwgJnZhZik7CisKIAkJdmFfZW5kKGFyZ3MpOwogCX0KIAotCXByX3dhcm5pbmcoIiVzOiBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZTogb3JkZXI6JWQsIG1vZGU6MHgleFxuIiwKLQkJICAgY3VycmVudC0+Y29tbSwgb3JkZXIsIGdmcF9tYXNrKTsKKwlwcl93YXJuKCIlczogcGFnZSBhbGxvY2F0aW9uIGZhaWx1cmU6IG9yZGVyOiVkLCBtb2RlOjB4JXhcbiIsCisJCWN1cnJlbnQtPmNvbW0sIG9yZGVyLCBnZnBfbWFzayk7CiAKIAlkdW1wX3N0YWNrKCk7CiAJaWYgKCFzaG91bGRfc3VwcHJlc3Nfc2hvd19tZW0oKSkKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IDZiZGM2N2QuLjJkMTIzZjkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtMTMzLDEwICsxMzMsMTMgQEAKIHN0YXRpYyB2b2lkICpfX21lbWluaXQgYWxsb2NfcGFnZV9jZ3JvdXAoc2l6ZV90IHNpemUsIGludCBuaWQpCiB7CiAJdm9pZCAqYWRkciA9IE5VTEw7CisJZ2ZwX3QgZmxhZ3MgPSBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOOwogCi0JYWRkciA9IGFsbG9jX3BhZ2VzX2V4YWN0X25pZChuaWQsIHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOwotCWlmIChhZGRyKQorCWFkZHIgPSBhbGxvY19wYWdlc19leGFjdF9uaWQobmlkLCBzaXplLCBmbGFncyk7CisJaWYgKGFkZHIpIHsKKwkJa21lbWxlYWtfYWxsb2MoYWRkciwgc2l6ZSwgMSwgZmxhZ3MpOwogCQlyZXR1cm4gYWRkcjsKKwl9CiAKIAlpZiAobm9kZV9zdGF0ZShuaWQsIE5fSElHSF9NRU1PUlkpKQogCQlhZGRyID0gdm1hbGxvY19ub2RlKHNpemUsIG5pZCk7CkBAIC0zNTcsNyArMzYwLDcgQEAKIAlzcGlubG9ja190CWxvY2s7CiB9OwogCi1zdHJ1Y3Qgc3dhcF9jZ3JvdXBfY3RybCBzd2FwX2Nncm91cF9jdHJsW01BWF9TV0FQRklMRVNdOworc3RhdGljIHN0cnVjdCBzd2FwX2Nncm91cF9jdHJsIHN3YXBfY2dyb3VwX2N0cmxbTUFYX1NXQVBGSUxFU107CiAKIHN0cnVjdCBzd2FwX2Nncm91cCB7CiAJdW5zaWduZWQgc2hvcnQJCWlkOwpkaWZmIC0tZ2l0IGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyMGFhMwotLS0gL2Rldi9udWxsCisrKyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBsaW51eC9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQ2hyaXN0b3BoZXIgWWVvaCA8Y3llb2hAYXUxLmlibS5jb20+LCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2VuZGlmCisKKy8qKgorICogcHJvY2Vzc192bV9yd19wYWdlcyAtIHJlYWQvd3JpdGUgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQHRhc2s6IHRhc2sgdG8gcmVhZC93cml0ZSBmcm9tCisgKiBAbW06IG1tIGZvciB0YXNrCisgKiBAcHJvY2Vzc19wYWdlczogc3RydWN0IHBhZ2VzIGFyZWEgdGhhdCBjYW4gc3RvcmUgYXQgbGVhc3QKKyAqICBucl9wYWdlc190b19jb3B5IHN0cnVjdCBwYWdlIHBvaW50ZXJzCisgKiBAcGE6IGFkZHJlc3Mgb2YgcGFnZSBpbiB0YXNrIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS90bworICogQHN0YXJ0X29mZnNldDogb2Zmc2V0IGluIHBhZ2UgdG8gc3RhcnQgY29weWluZyBmcm9tL3RvCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQGx2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tCisgKiBAbHZlY19jbnQ6IG51bWJlciBvZiBlbGVtZW50cyBpbiBpb3ZlYyBhcnJheQorICogQGx2ZWNfY3VycmVudDogaW5kZXggaW4gaW92ZWMgYXJyYXkgd2UgYXJlIHVwIHRvCisgKiBAbHZlY19vZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmcm9tIGN1cnJlbnQgaW92ZWMgaW92X2Jhc2Ugd2UgYXJlIHVwIHRvCisgKiBAdm1fd3JpdGU6IDAgbWVhbnMgY29weSBmcm9tLCAxIG1lYW5zIGNvcHkgdG8KKyAqIEBucl9wYWdlc190b19jb3B5OiBudW1iZXIgb2YgcGFnZXMgdG8gY29weQorICogQGJ5dGVzX2NvcGllZDogcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IGNvcGllZAorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc192bV9yd19wYWdlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGEsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9vZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICpsdmVjLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbHZlY19jbnQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbHZlY19jdXJyZW50LAorCQkJICAgICAgIHNpemVfdCAqbHZlY19vZmZzZXQsCisJCQkgICAgICAgaW50IHZtX3dyaXRlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9wYWdlc190b19jb3B5LAorCQkJICAgICAgIHNzaXplX3QgKmJ5dGVzX2NvcGllZCkKK3sKKwlpbnQgcGFnZXNfcGlubmVkOworCXZvaWQgKnRhcmdldF9rYWRkcjsKKwlpbnQgcGdzX2NvcGllZCA9IDA7CisJaW50IGo7CisJaW50IHJldDsKKwlzc2l6ZV90IGJ5dGVzX3RvX2NvcHk7CisJc3NpemVfdCByYyA9IDA7CisKKwkqYnl0ZXNfY29waWVkID0gMDsKKworCS8qIEdldCB0aGUgcGFnZXMgd2UncmUgaW50ZXJlc3RlZCBpbiAqLworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlwYWdlc19waW5uZWQgPSBnZXRfdXNlcl9wYWdlcyh0YXNrLCBtbSwgcGEsCisJCQkJICAgICAgbnJfcGFnZXNfdG9fY29weSwKKwkJCQkgICAgICB2bV93cml0ZSwgMCwgcHJvY2Vzc19wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKworCWlmIChwYWdlc19waW5uZWQgIT0gbnJfcGFnZXNfdG9fY29weSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kOworCX0KKworCS8qIERvIHRoZSBjb3B5IGZvciBlYWNoIHBhZ2UgKi8KKwlmb3IgKHBnc19jb3BpZWQgPSAwOworCSAgICAgKHBnc19jb3BpZWQgPCBucl9wYWdlc190b19jb3B5KSAmJiAoKmx2ZWNfY3VycmVudCA8IGx2ZWNfY250KTsKKwkgICAgIHBnc19jb3BpZWQrKykgeworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIG5vbiB6ZXJvIGxlbmd0aCBpb3ZlYyAqLworCQl3aGlsZSAoKmx2ZWNfY3VycmVudCA8IGx2ZWNfY250CisJCSAgICAgICAmJiBsdmVjWypsdmVjX2N1cnJlbnRdLmlvdl9sZW4gPT0gMCkKKwkJCSgqbHZlY19jdXJyZW50KSsrOworCQlpZiAoKmx2ZWNfY3VycmVudCA9PSBsdmVjX2NudCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdpbGwgY29weSBzbWFsbGVzdCBvZjoKKwkJICogLSBieXRlcyByZW1haW5pbmcgaW4gcGFnZQorCQkgKiAtIGJ5dGVzIHJlbWFpbmluZyBpbiBkZXN0aW5hdGlvbiBpb3ZlYworCQkgKi8KKwkJYnl0ZXNfdG9fY29weSA9IG1pbl90KHNzaXplX3QsIFBBR0VfU0laRSAtIHN0YXJ0X29mZnNldCwKKwkJCQkgICAgICBsZW4gLSAqYnl0ZXNfY29waWVkKTsKKwkJYnl0ZXNfdG9fY29weSA9IG1pbl90KHNzaXplX3QsIGJ5dGVzX3RvX2NvcHksCisJCQkJICAgICAgbHZlY1sqbHZlY19jdXJyZW50XS5pb3ZfbGVuCisJCQkJICAgICAgLSAqbHZlY19vZmZzZXQpOworCisJCXRhcmdldF9rYWRkciA9IGttYXAocHJvY2Vzc19wYWdlc1twZ3NfY29waWVkXSkgKyBzdGFydF9vZmZzZXQ7CisKKwkJaWYgKHZtX3dyaXRlKQorCQkJcmV0ID0gY29weV9mcm9tX3VzZXIodGFyZ2V0X2thZGRyLAorCQkJCQkgICAgIGx2ZWNbKmx2ZWNfY3VycmVudF0uaW92X2Jhc2UKKwkJCQkJICAgICArICpsdmVjX29mZnNldCwKKwkJCQkJICAgICBieXRlc190b19jb3B5KTsKKwkJZWxzZQorCQkJcmV0ID0gY29weV90b191c2VyKGx2ZWNbKmx2ZWNfY3VycmVudF0uaW92X2Jhc2UKKwkJCQkJICAgKyAqbHZlY19vZmZzZXQsCisJCQkJCSAgIHRhcmdldF9rYWRkciwgYnl0ZXNfdG9fY29weSk7CisJCWt1bm1hcChwcm9jZXNzX3BhZ2VzW3Bnc19jb3BpZWRdKTsKKwkJaWYgKHJldCkgeworCQkJKmJ5dGVzX2NvcGllZCArPSBieXRlc190b19jb3B5IC0gcmV0OworCQkJcGdzX2NvcGllZCsrOworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBlbmQ7CisJCX0KKwkJKmJ5dGVzX2NvcGllZCArPSBieXRlc190b19jb3B5OworCQkqbHZlY19vZmZzZXQgKz0gYnl0ZXNfdG9fY29weTsKKwkJaWYgKCpsdmVjX29mZnNldCA9PSBsdmVjWypsdmVjX2N1cnJlbnRdLmlvdl9sZW4pIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGNvcHkgcmVtYWluaW5nIHBhcnQgb2YgcGFnZSBpbnRvIHRoZQorCQkJICogbmV4dCBpb3ZlYyBpZiB0aGVyZSBhcmUgYW55IGJ5dGVzIGxlZnQgaW4gcGFnZQorCQkJICovCisJCQkoKmx2ZWNfY3VycmVudCkrKzsKKwkJCSpsdmVjX29mZnNldCA9IDA7CisJCQlzdGFydF9vZmZzZXQgPSAoc3RhcnRfb2Zmc2V0ICsgYnl0ZXNfdG9fY29weSkKKwkJCQklIFBBR0VfU0laRTsKKwkJCWlmIChzdGFydF9vZmZzZXQpCisJCQkJcGdzX2NvcGllZC0tOworCQl9IGVsc2UgeworCQkJc3RhcnRfb2Zmc2V0ID0gMDsKKwkJfQorCX0KKworZW5kOgorCWlmICh2bV93cml0ZSkgeworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNfcGlubmVkOyBqKyspIHsKKwkJCWlmIChqIDwgcGdzX2NvcGllZCkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHByb2Nlc3NfcGFnZXNbal0pOworCQkJcHV0X3BhZ2UocHJvY2Vzc19wYWdlc1tqXSk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNfcGlubmVkOyBqKyspCisJCQlwdXRfcGFnZShwcm9jZXNzX3BhZ2VzW2pdKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIGttYWxsb2MnZCB0byBob2xkIHN0cnVjdCBwYWdlJ3MgZHVyaW5nIGNvcHkgKi8KKyNkZWZpbmUgUFZNX01BWF9LTUFMTE9DX1BBR0VTIChQQUdFX1NJWkUgKiAyKQorCisvKioKKyAqIHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYyAtIHJlYWQvd3JpdGUgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQGFkZHI6IHN0YXJ0IG1lbW9yeSBhZGRyZXNzIG9mIHRhcmdldCBwcm9jZXNzCisgKiBAbGVuOiBzaXplIG9mIGFyZWEgdG8gY29weSB0by9mcm9tCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGx2ZWNfY250OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaW92ZWMgYXJyYXkKKyAqIEBsdmVjX2N1cnJlbnQ6IGluZGV4IGluIGlvdmVjIGFycmF5IHdlIGFyZSB1cCB0bworICogQGx2ZWNfb2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBjdXJyZW50IGlvdmVjIGlvdl9iYXNlIHdlIGFyZSB1cCB0bworICogQHByb2Nlc3NfcGFnZXM6IHN0cnVjdCBwYWdlcyBhcmVhIHRoYXQgY2FuIHN0b3JlIGF0IGxlYXN0CisgKiAgbnJfcGFnZXNfdG9fY29weSBzdHJ1Y3QgcGFnZSBwb2ludGVycworICogQG1tOiBtbSBmb3IgdGFzaworICogQHRhc2s6IHRhc2sgdG8gcmVhZC93cml0ZSBmcm9tCisgKiBAdm1fd3JpdGU6IDAgbWVhbnMgY29weSBmcm9tLCAxIG1lYW5zIGNvcHkgdG8KKyAqIEBieXRlc19jb3BpZWQ6IHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSBjb3BpZWQKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG9uIGZhaWx1cmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYyh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmx2ZWMsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbHZlY19jbnQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKmx2ZWNfY3VycmVudCwKKwkJCQkgICAgc2l6ZV90ICpsdmVjX29mZnNldCwKKwkJCQkgICAgc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzLAorCQkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICBpbnQgdm1fd3JpdGUsCisJCQkJICAgIHNzaXplX3QgKmJ5dGVzX2NvcGllZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBhID0gYWRkciAmIFBBR0VfTUFTSzsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X29mZnNldCA9IGFkZHIgLSBwYTsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCXNzaXplX3QgYnl0ZXNfY29waWVkX2xvb3A7CisJc3NpemVfdCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlc19jb3BpZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfdG9fY29weTsKKwl1bnNpZ25lZCBsb25nIG1heF9wYWdlc19wZXJfbG9vcCA9IFBWTV9NQVhfS01BTExPQ19QQUdFUworCQkvIHNpemVvZihzdHJ1Y3QgcGFnZXMgKik7CisKKwkqYnl0ZXNfY29waWVkID0gMDsKKworCS8qIFdvcmsgb3V0IGFkZHJlc3MgYW5kIHBhZ2UgcmFuZ2UgcmVxdWlyZWQgKi8KKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCW5yX3BhZ2VzID0gKGFkZHIgKyBsZW4gLSAxKSAvIFBBR0VfU0laRSAtIGFkZHIgLyBQQUdFX1NJWkUgKyAxOworCisJd2hpbGUgKChucl9wYWdlc19jb3BpZWQgPCBucl9wYWdlcykgJiYgKCpsdmVjX2N1cnJlbnQgPCBsdmVjX2NudCkpIHsKKwkJbnJfcGFnZXNfdG9fY29weSA9IG1pbihucl9wYWdlcyAtIG5yX3BhZ2VzX2NvcGllZCwKKwkJCQkgICAgICAgbWF4X3BhZ2VzX3Blcl9sb29wKTsKKworCQlyYyA9IHByb2Nlc3Nfdm1fcndfcGFnZXModGFzaywgbW0sIHByb2Nlc3NfcGFnZXMsIHBhLAorCQkJCQkgc3RhcnRfb2Zmc2V0LCBsZW4sCisJCQkJCSBsdmVjLCBsdmVjX2NudCwKKwkJCQkJIGx2ZWNfY3VycmVudCwgbHZlY19vZmZzZXQsCisJCQkJCSB2bV93cml0ZSwgbnJfcGFnZXNfdG9fY29weSwKKwkJCQkJICZieXRlc19jb3BpZWRfbG9vcCk7CisJCXN0YXJ0X29mZnNldCA9IDA7CisJCSpieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkX2xvb3A7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJbGVuIC09IGJ5dGVzX2NvcGllZF9sb29wOworCQkJbnJfcGFnZXNfY29waWVkICs9IG5yX3BhZ2VzX3RvX2NvcHk7CisJCQlwYSArPSBucl9wYWdlc190b19jb3B5ICogUEFHRV9TSVpFOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGZvciBwcm9jZXNzIHBhZ2VzIGFycmF5CisgICB3aGljaCBsaXZlcyBvbiBzdGFjayAqLworI2RlZmluZSBQVk1fTUFYX1BQX0FSUkFZX0NPVU5UIDE2CisKKy8qKgorICogcHJvY2Vzc192bV9yd19jb3JlIC0gY29yZSBvZiByZWFkaW5nL3dyaXRpbmcgcGFnZXMgZnJvbSB0YXNrIHNwZWNpZmllZAorICogQHBpZDogUElEIG9mIHByb2Nlc3MgdG8gcmVhZC93cml0ZSBmcm9tL3RvCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGxpb3ZjbnQ6IHNpemUgb2YgbHZlYyBhcnJheQorICogQHJ2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tIGluIHRoZSBvdGhlciBwcm9jZXNzCisgKiBAcmlvdmNudDogc2l6ZSBvZiBydmVjIGFycmF5CisgKiBAZmxhZ3M6IGN1cnJlbnRseSB1bnVzZWQKKyAqIEB2bV93cml0ZTogMCBpZiByZWFkaW5nIGZyb20gb3RoZXIgcHJvY2VzcywgMSBpZiB3cml0aW5nIHRvIG90aGVyIHByb2Nlc3MKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkL3dyaXR0ZW4gb3IgZXJyb3IgY29kZS4gTWF5CisgKiAgcmV0dXJuIGxlc3MgYnl0ZXMgdGhhbiBleHBlY3RlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5aW5nCisgKiAgcHJvY2Vzcy4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY2Vzc192bV9yd19jb3JlKHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGlvdmVjICpsdmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkJCSAgY29uc3Qgc3RydWN0IGlvdmVjICpydmVjLAorCQkJCSAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHZtX3dyaXRlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgcGFnZSAqcHBfc3RhY2tbUFZNX01BWF9QUF9BUlJBWV9DT1VOVF07CisJc3RydWN0IHBhZ2UgKipwcm9jZXNzX3BhZ2VzID0gcHBfc3RhY2s7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJdW5zaWduZWQgbG9uZyBpOworCXNzaXplX3QgcmMgPSAwOworCXNzaXplX3QgYnl0ZXNfY29waWVkX2xvb3A7CisJc3NpemVfdCBieXRlc19jb3BpZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXNfaW92OworCXVuc2lnbmVkIGxvbmcgaW92X2xfY3Vycl9pZHggPSAwOworCXNpemVfdCBpb3ZfbF9jdXJyX29mZnNldCA9IDA7CisJc3NpemVfdCBpb3ZfbGVuOworCisJLyoKKwkgKiBXb3JrIG91dCBob3cgbWFueSBwYWdlcyBvZiBzdHJ1Y3QgcGFnZXMgd2UncmUgZ29pbmcgdG8gbmVlZAorCSAqIHdoZW4gZXZlbnR1YWxseSBjYWxsaW5nIGdldF91c2VyX3BhZ2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IHJpb3ZjbnQ7IGkrKykgeworCQlpb3ZfbGVuID0gcnZlY1tpXS5pb3ZfbGVuOworCQlpZiAoaW92X2xlbiA+IDApIHsKKwkJCW5yX3BhZ2VzX2lvdiA9ICgodW5zaWduZWQgbG9uZylydmVjW2ldLmlvdl9iYXNlCisJCQkJCSsgaW92X2xlbikKKwkJCQkvIFBBR0VfU0laRSAtICh1bnNpZ25lZCBsb25nKXJ2ZWNbaV0uaW92X2Jhc2UKKwkJCQkvIFBBR0VfU0laRSArIDE7CisJCQlucl9wYWdlcyA9IG1heChucl9wYWdlcywgbnJfcGFnZXNfaW92KTsKKwkJfQorCX0KKworCWlmIChucl9wYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChucl9wYWdlcyA+IFBWTV9NQVhfUFBfQVJSQVlfQ09VTlQpIHsKKwkJLyogRm9yIHJlbGlhYmlsaXR5IGRvbid0IHRyeSB0byBrbWFsbG9jIG1vcmUgdGhhbgorCQkgICAyIHBhZ2VzIHdvcnRoICovCisJCXByb2Nlc3NfcGFnZXMgPSBrbWFsbG9jKG1pbl90KHNpemVfdCwgUFZNX01BWF9LTUFMTE9DX1BBR0VTLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHBhZ2VzICopKm5yX3BhZ2VzKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFwcm9jZXNzX3BhZ2VzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogR2V0IHByb2Nlc3MgaW5mb3JtYXRpb24gKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJdGFzayA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CisJaWYgKHRhc2spCisJCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoIXRhc2spIHsKKwkJcmMgPSAtRVNSQ0g7CisJCWdvdG8gZnJlZV9wcm9jX3BhZ2VzOworCX0KKworCXRhc2tfbG9jayh0YXNrKTsKKwlpZiAoX19wdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9BVFRBQ0gpKSB7CisJCXRhc2tfdW5sb2NrKHRhc2spOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBwdXRfdGFza19zdHJ1Y3Q7CisJfQorCW1tID0gdGFzay0+bW07CisKKwlpZiAoIW1tIHx8ICh0YXNrLT5mbGFncyAmIFBGX0tUSFJFQUQpKSB7CisJCXRhc2tfdW5sb2NrKHRhc2spOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gcHV0X3Rhc2tfc3RydWN0OworCX0KKworCWF0b21pY19pbmMoJm1tLT5tbV91c2Vycyk7CisJdGFza191bmxvY2sodGFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmlvdmNudCAmJiBpb3ZfbF9jdXJyX2lkeCA8IGxpb3ZjbnQ7IGkrKykgeworCQlyYyA9IHByb2Nlc3Nfdm1fcndfc2luZ2xlX3ZlYygKKwkJCSh1bnNpZ25lZCBsb25nKXJ2ZWNbaV0uaW92X2Jhc2UsIHJ2ZWNbaV0uaW92X2xlbiwKKwkJCWx2ZWMsIGxpb3ZjbnQsICZpb3ZfbF9jdXJyX2lkeCwgJmlvdl9sX2N1cnJfb2Zmc2V0LAorCQkJcHJvY2Vzc19wYWdlcywgbW0sIHRhc2ssIHZtX3dyaXRlLCAmYnl0ZXNfY29waWVkX2xvb3ApOworCQlieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkX2xvb3A7CisJCWlmIChyYyAhPSAwKSB7CisJCQkvKiBJZiB3ZSBoYXZlIG1hbmFnZWQgdG8gY29weSBhbnkgZGF0YSBhdCBhbGwgdGhlbgorCQkJICAgd2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLiBPdGhlcndpc2UKKwkJCSAgIHdlIHJldHVybiB0aGUgZXJyb3IgY29kZSAqLworCQkJaWYgKGJ5dGVzX2NvcGllZCkKKwkJCQlyYyA9IGJ5dGVzX2NvcGllZDsKKwkJCWdvdG8gcHV0X21tOworCQl9CisJfQorCisJcmMgPSBieXRlc19jb3BpZWQ7CitwdXRfbW06CisJbW1wdXQobW0pOworCitwdXRfdGFza19zdHJ1Y3Q6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCitmcmVlX3Byb2NfcGFnZXM6CisJaWYgKHByb2Nlc3NfcGFnZXMgIT0gcHBfc3RhY2spCisJCWtmcmVlKHByb2Nlc3NfcGFnZXMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBwcm9jZXNzX3ZtX3J3IC0gY2hlY2sgaW92ZWNzIGJlZm9yZSBjYWxsaW5nIGNvcmUgcm91dGluZQorICogQHBpZDogUElEIG9mIHByb2Nlc3MgdG8gcmVhZC93cml0ZSBmcm9tL3RvCisgKiBAbHZlYzogaW92ZWMgYXJyYXkgc3BlY2lmeWluZyB3aGVyZSB0byBjb3B5IHRvL2Zyb20gbG9jYWxseQorICogQGxpb3ZjbnQ6IHNpemUgb2YgbHZlYyBhcnJheQorICogQHJ2ZWM6IGlvdmVjIGFycmF5IHNwZWNpZnlpbmcgd2hlcmUgdG8gY29weSB0by9mcm9tIGluIHRoZSBvdGhlciBwcm9jZXNzCisgKiBAcmlvdmNudDogc2l6ZSBvZiBydmVjIGFycmF5CisgKiBAZmxhZ3M6IGN1cnJlbnRseSB1bnVzZWQKKyAqIEB2bV93cml0ZTogMCBpZiByZWFkaW5nIGZyb20gb3RoZXIgcHJvY2VzcywgMSBpZiB3cml0aW5nIHRvIG90aGVyIHByb2Nlc3MKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkL3dyaXR0ZW4gb3IgZXJyb3IgY29kZS4gTWF5CisgKiAgcmV0dXJuIGxlc3MgYnl0ZXMgdGhhbiBleHBlY3RlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5aW5nCisgKiAgcHJvY2Vzcy4KKyAqLworc3RhdGljIHNzaXplX3QgcHJvY2Vzc192bV9ydyhwaWRfdCBwaWQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgdm1fd3JpdGUpCit7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrX2xbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja19yW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9sID0gaW92c3RhY2tfbDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9yID0gaW92c3RhY2tfcjsKKwlzc2l6ZV90IHJjOworCisJaWYgKGZsYWdzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgaW92ZWNzICovCisJaWYgKHZtX3dyaXRlKQorCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgbHZlYywgbGlvdmNudCwgVUlPX0ZBU1RJT1YsCisJCQkJCSAgIGlvdnN0YWNrX2wsICZpb3ZfbCwgMSk7CisJZWxzZQorCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihSRUFELCBsdmVjLCBsaW92Y250LCBVSU9fRkFTVElPViwKKwkJCQkJICAgaW92c3RhY2tfbCwgJmlvdl9sLCAxKTsKKwlpZiAocmMgPD0gMCkKKwkJZ290byBmcmVlX2lvdmVjczsKKworCXJjID0gcndfY29weV9jaGVja191dmVjdG9yKFJFQUQsIHJ2ZWMsIHJpb3ZjbnQsIFVJT19GQVNUSU9WLAorCQkJCSAgIGlvdnN0YWNrX3IsICZpb3ZfciwgMCk7CisJaWYgKHJjIDw9IDApCisJCWdvdG8gZnJlZV9pb3ZlY3M7CisKKwlyYyA9IHByb2Nlc3Nfdm1fcndfY29yZShwaWQsIGlvdl9sLCBsaW92Y250LCBpb3ZfciwgcmlvdmNudCwgZmxhZ3MsCisJCQkJdm1fd3JpdGUpOworCitmcmVlX2lvdmVjczoKKwlpZiAoaW92X3IgIT0gaW92c3RhY2tfcikKKwkJa2ZyZWUoaW92X3IpOworCWlmIChpb3ZfbCAhPSBpb3ZzdGFja19sKQorCQlrZnJlZShpb3ZfbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK1NZU0NBTExfREVGSU5FNihwcm9jZXNzX3ZtX3JlYWR2LCBwaWRfdCwgcGlkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICosIGx2ZWMsCisJCXVuc2lnbmVkIGxvbmcsIGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiwgcnZlYywKKwkJdW5zaWduZWQgbG9uZywgcmlvdmNudCwJdW5zaWduZWQgbG9uZywgZmxhZ3MpCit7CisJcmV0dXJuIHByb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLCByaW92Y250LCBmbGFncywgMCk7Cit9CisKK1NZU0NBTExfREVGSU5FNihwcm9jZXNzX3ZtX3dyaXRldiwgcGlkX3QsIHBpZCwKKwkJY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqLCBsdmVjLAorCQl1bnNpZ25lZCBsb25nLCBsaW92Y250LCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICosIHJ2ZWMsCisJCXVuc2lnbmVkIGxvbmcsIHJpb3ZjbnQsCXVuc2lnbmVkIGxvbmcsIGZsYWdzKQoreworCXJldHVybiBwcm9jZXNzX3ZtX3J3KHBpZCwgbHZlYywgbGlvdmNudCwgcnZlYywgcmlvdmNudCwgZmxhZ3MsIDEpOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9wcm9jZXNzX3ZtX3J3KGNvbXBhdF9waWRfdCBwaWQsCisJCSAgICAgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKmx2ZWMsCisJCSAgICAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkgICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcmlvdmNudCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgdm1fd3JpdGUpCit7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrX2xbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja19yW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9sID0gaW92c3RhY2tfbDsKKwlzdHJ1Y3QgaW92ZWMgKmlvdl9yID0gaW92c3RhY2tfcjsKKwlzc2l6ZV90IHJjID0gLUVGQVVMVDsKKworCWlmIChmbGFncyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBsdmVjLCBsaW92Y250ICogc2l6ZW9mKCpsdmVjKSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJ2ZWMsIHJpb3ZjbnQgKiBzaXplb2YoKnJ2ZWMpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodm1fd3JpdGUpCisJCXJjID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgbHZlYywgbGlvdmNudCwKKwkJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX2wsCisJCQkJCQkgICZpb3ZfbCwgMSk7CisJZWxzZQorCQlyYyA9IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IoUkVBRCwgbHZlYywgbGlvdmNudCwKKwkJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX2wsCisJCQkJCQkgICZpb3ZfbCwgMSk7CisJaWYgKHJjIDw9IDApCisJCWdvdG8gZnJlZV9pb3ZlY3M7CisJcmMgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKFJFQUQsIHJ2ZWMsIHJpb3ZjbnQsCisJCQkJCSAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrX3IsCisJCQkJCSAgJmlvdl9yLCAwKTsKKwlpZiAocmMgPD0gMCkKKwkJZ290byBmcmVlX2lvdmVjczsKKworCXJjID0gcHJvY2Vzc192bV9yd19jb3JlKHBpZCwgaW92X2wsIGxpb3ZjbnQsIGlvdl9yLCByaW92Y250LCBmbGFncywKKwkJCSAgIHZtX3dyaXRlKTsKKworZnJlZV9pb3ZlY3M6CisJaWYgKGlvdl9yICE9IGlvdnN0YWNrX3IpCisJCWtmcmVlKGlvdl9yKTsKKwlpZiAoaW92X2wgIT0gaW92c3RhY2tfbCkKKwkJa2ZyZWUoaW92X2wpOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdihjb21wYXRfcGlkX3QgcGlkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbGlvdmNudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHJpb3ZjbnQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gY29tcGF0X3Byb2Nlc3Nfdm1fcncocGlkLCBsdmVjLCBsaW92Y250LCBydmVjLAorCQkJCSAgICByaW92Y250LCBmbGFncywgMCk7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldihjb21wYXRfcGlkX3QgcGlkLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBsaW92Y250LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyByaW92Y250LAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBjb21wYXRfcHJvY2Vzc192bV9ydyhwaWQsIGx2ZWMsIGxpb3ZjbnQsIHJ2ZWMsCisJCQkJICAgIHJpb3ZjbnQsIGZsYWdzLCAxKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9xdWlja2xpc3QuYyBiL21tL3F1aWNrbGlzdC5jCmluZGV4IDI4NzYzNDkuLjk0MjIxMjkgMTAwNjQ0Ci0tLSBhL21tL3F1aWNrbGlzdC5jCisrKyBiL21tL3F1aWNrbGlzdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9xdWlja2xpc3QuaD4KIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHF1aWNrbGlzdCBbQ09ORklHX05SX1FVSUNLXSwgcXVpY2tsaXN0KTsKZGlmZiAtLWdpdCBhL21tL3JlYWRhaGVhZC5jIGIvbW0vcmVhZGFoZWFkLmMKaW5kZXggODY3ZjlkZC4uY2JjYmIwMiAxMDA2NDQKLS0tIGEvbW0vcmVhZGFoZWFkLmMKKysrIGIvbW0vcmVhZGFoZWFkLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggODAwNTA4MC4uYTRmZDM2OCAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CkBAIC0xMTY0LDcgKzExNjQsNyBAQAogCiAvKgogICogU3ViZnVuY3Rpb25zIG9mIHRyeV90b191bm1hcDogdHJ5X3RvX3VubWFwX29uZSBjYWxsZWQKLSAqIHJlcGVhdGVkbHkgZnJvbSBlaXRoZXIgdHJ5X3RvX3VubWFwX2Fub24gb3IgdHJ5X3RvX3VubWFwX2ZpbGUuCisgKiByZXBlYXRlZGx5IGZyb20gdHJ5X3RvX3VubWFwX2tzbSwgdHJ5X3RvX3VubWFwX2Fub24gb3IgdHJ5X3RvX3VubWFwX2ZpbGUuCiAgKi8KIGludCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGVudW0gdHR1X2ZsYWdzIGZsYWdzKQpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMmQzNTc3Mi4uZDY3MjI1MDYgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7CkBAIC0xMDY4LDYgKzEwNjgsMTIgQEAKIAkJdXNlcl9zaG1fdW5sb2NrKGlub2RlLT5pX3NpemUsIHVzZXIpOwogCQlpbmZvLT5mbGFncyAmPSB+Vk1fTE9DS0VEOwogCQltYXBwaW5nX2NsZWFyX3VuZXZpY3RhYmxlKGZpbGUtPmZfbWFwcGluZyk7CisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IGEgcmFjaW5nIHB1dGJhY2tfbHJ1X3BhZ2UoKSBjYW4gc2VlCisJCSAqIHRoZSBwYWdlcyBvZiB0aGlzIG1hcHBpbmcgYXJlIGV2aWN0YWJsZSB3aGVuIHdlCisJCSAqIHNraXAgdGhlbSBkdWUgdG8gIVBhZ2VMUlUgZHVyaW5nIHRoZSBzY2FuLgorCQkgKi8KKwkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIAkJc2Nhbl9tYXBwaW5nX3VuZXZpY3RhYmxlX3BhZ2VzKGZpbGUtPmZfbWFwcGluZyk7CiAJfQogCXJldHZhbCA9IDA7CkBAIC0yNDk3LDcgKzI1MDMsNyBAQAogCiAJZF9pbnN0YW50aWF0ZShwYXRoLmRlbnRyeSwgaW5vZGUpOwogCWlub2RlLT5pX3NpemUgPSBzaXplOwotCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KKwljbGVhcl9ubGluayhpbm9kZSk7CS8qIEl0IGlzIHVubGlua2VkICovCiAjaWZuZGVmIENPTkZJR19NTVUKIAllcnJvciA9IHJhbWZzX25vbW11X2V4cGFuZF9mb3JfbWFwcGluZyhpbm9kZSwgc2l6ZSk7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IGJmMzkxODEuLjgxMDViZTQgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTYzLDcgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+IC8qIHN0cnVjdCByZWNsYWltX3N0YXRlICovCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA5NTIxNWFhLi43ZDJhOTk2IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC02NTUsNDkgKzY1NSw2IEBACiAJCW1lbXNldChwICsgcy0+b2Jqc2l6ZSwgdmFsLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpOwogfQogCi1zdGF0aWMgdTggKmNoZWNrX2J5dGVzOCh1OCAqc3RhcnQsIHU4IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCi17Ci0Jd2hpbGUgKGJ5dGVzKSB7Ci0JCWlmICgqc3RhcnQgIT0gdmFsdWUpCi0JCQlyZXR1cm4gc3RhcnQ7Ci0JCXN0YXJ0Kys7Ci0JCWJ5dGVzLS07Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdTggKmNoZWNrX2J5dGVzKHU4ICpzdGFydCwgdTggdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKLXsKLQl1NjQgdmFsdWU2NDsKLQl1bnNpZ25lZCBpbnQgd29yZHMsIHByZWZpeDsKLQotCWlmIChieXRlcyA8PSAxNikKLQkJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIGJ5dGVzKTsKLQotCXZhbHVlNjQgPSB2YWx1ZSB8IHZhbHVlIDw8IDggfCB2YWx1ZSA8PCAxNiB8IHZhbHVlIDw8IDI0OwotCXZhbHVlNjQgPSAodmFsdWU2NCAmIDB4ZmZmZmZmZmYpIHwgdmFsdWU2NCA8PCAzMjsKLQlwcmVmaXggPSA4IC0gKCh1bnNpZ25lZCBsb25nKXN0YXJ0KSAlIDg7Ci0KLQlpZiAocHJlZml4KSB7Ci0JCXU4ICpyID0gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgcHJlZml4KTsKLQkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKLQkJc3RhcnQgKz0gcHJlZml4OwotCQlieXRlcyAtPSBwcmVmaXg7Ci0JfQotCi0Jd29yZHMgPSBieXRlcyAvIDg7Ci0KLQl3aGlsZSAod29yZHMpIHsKLQkJaWYgKCoodTY0ICopc3RhcnQgIT0gdmFsdWU2NCkKLQkJCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCA4KTsKLQkJc3RhcnQgKz0gODsKLQkJd29yZHMtLTsKLQl9Ci0KLQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgYnl0ZXMgJSA4KTsKLX0KLQogc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKIAkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQogewpAQCAtNzEyLDcgKzY2OSw3IEBACiAJdTggKmZhdWx0OwogCXU4ICplbmQ7CiAKLQlmYXVsdCA9IGNoZWNrX2J5dGVzKHN0YXJ0LCB2YWx1ZSwgYnl0ZXMpOworCWZhdWx0ID0gbWVtY2hyX2ludihzdGFydCwgdmFsdWUsIGJ5dGVzKTsKIAlpZiAoIWZhdWx0KQogCQlyZXR1cm4gMTsKIApAQCAtODA1LDcgKzc2Miw3IEBACiAJaWYgKCFyZW1haW5kZXIpCiAJCXJldHVybiAxOwogCi0JZmF1bHQgPSBjaGVja19ieXRlcyhlbmQgLSByZW1haW5kZXIsIFBPSVNPTl9JTlVTRSwgcmVtYWluZGVyKTsKKwlmYXVsdCA9IG1lbWNocl9pbnYoZW5kIC0gcmVtYWluZGVyLCBQT0lTT05fSU5VU0UsIHJlbWFpbmRlcik7CiAJaWYgKCFmYXVsdCkKIAkJcmV0dXJuIDE7CiAJd2hpbGUgKGVuZCA+IGZhdWx0ICYmIGVuZFstMV0gPT0gUE9JU09OX0lOVVNFKQpkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLXZtZW1tYXAuYyBiL21tL3NwYXJzZS12bWVtbWFwLmMKaW5kZXggNjRiOTg0MC4uMWI3ZTIyYSAxMDA2NDQKLS0tIGEvbW0vc3BhcnNlLXZtZW1tYXAuYworKysgYi9tbS9zcGFyc2Utdm1lbW1hcC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CmRpZmYgLS1naXQgYS9tbS9zcGFyc2UuYyBiL21tL3NwYXJzZS5jCmluZGV4IDg1OGUxZGYuLjYxZDdjZGUgMTAwNjQ0Ci0tLSBhL21tL3NwYXJzZS5jCisrKyBiL21tL3NwYXJzZS5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL21tL3N3YXAuYyBiL21tL3N3YXAuYwppbmRleCAzYTQ0MmYxLi5hOTFjYWY3IDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JLyogZm9yIHRyeV90b19yZWxlYXNlX3BhZ2UoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CkBAIC03OCwzOSArNzgsMjIgQEAKIHsKIAlpZiAodW5saWtlbHkoUGFnZVRhaWwocGFnZSkpKSB7CiAJCS8qIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IGNhbiBydW4gdW5kZXIgdXMgKi8KLQkJc3RydWN0IHBhZ2UgKnBhZ2VfaGVhZCA9IHBhZ2UtPmZpcnN0X3BhZ2U7Ci0JCXNtcF9ybWIoKTsKLQkJLyoKLQkJICogSWYgUGFnZVRhaWwgaXMgc3RpbGwgc2V0IGFmdGVyIHNtcF9ybWIoKSB3ZSBjYW4gYmUgc3VyZQotCQkgKiB0aGF0IHRoZSBwYWdlLT5maXJzdF9wYWdlIHdlIHJlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlci4KLQkJICogU2VlIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50KCkgc21wX3dtYigpLgotCQkgKi8KLQkJaWYgKGxpa2VseShQYWdlVGFpbChwYWdlKSAmJiBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZV9oZWFkID0gY29tcG91bmRfdHJhbnNfaGVhZChwYWdlKTsKKworCQlpZiAobGlrZWx5KHBhZ2UgIT0gcGFnZV9oZWFkICYmCisJCQkgICBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgewogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJCS8qCi0JCQkgKiBWZXJpZnkgdGhhdCBvdXIgcGFnZV9oZWFkIHdhc24ndCBjb252ZXJ0ZWQKLQkJCSAqIHRvIGEgYSByZWd1bGFyIHBhZ2UgYmVmb3JlIHdlIGdvdCBhCi0JCQkgKiByZWZlcmVuY2Ugb24gaXQuCisJCQkgKiBwYWdlX2hlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlciBidXQgaXQKKwkJCSAqIG1heSBub3QgYmUgYSBoZWFkIHBhZ2UgYW55bW9yZSBieSB0aGUgdGltZQorCQkJICogd2Ugb2J0YWluIHRoZSBsb2NrLiBUaGF0IGlzIG9rIGFzIGxvbmcgYXMgaXQKKwkJCSAqIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuCiAJCQkgKi8KLQkJCWlmICh1bmxpa2VseSghUGFnZUhlYWQocGFnZV9oZWFkKSkpIHsKLQkJCQkvKiBQYWdlSGVhZCBpcyBjbGVhcmVkIGFmdGVyIFBhZ2VUYWlsICovCi0JCQkJc21wX3JtYigpOwotCQkJCVZNX0JVR19PTihQYWdlVGFpbChwYWdlKSk7Ci0JCQkJZ290byBvdXRfcHV0X2hlYWQ7Ci0JCQl9Ci0JCQkvKgotCQkJICogT25seSBydW4gY29tcG91bmRfbG9jayBvbiBhIHZhbGlkIFBhZ2VIZWFkLAotCQkJICogYWZ0ZXIgaGF2aW5nIGl0IHBpbm5lZCB3aXRoCi0JCQkgKiBnZXRfcGFnZV91bmxlc3NfemVybygpIGFib3ZlLgotCQkJICovCi0JCQlzbXBfbWIoKTsKLQkJCS8qIHBhZ2VfaGVhZCB3YXNuJ3QgYSBkYW5nbGluZyBwb2ludGVyICovCiAJCQlmbGFncyA9IGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShwYWdlX2hlYWQpOwogCQkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwYWdlKSkpIHsKIAkJCQkvKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBydW4gYmVmb3JlIHVzICovCiAJCQkJY29tcG91bmRfdW5sb2NrX2lycXJlc3RvcmUocGFnZV9oZWFkLCBmbGFncyk7CiAJCQkJVk1fQlVHX09OKFBhZ2VIZWFkKHBhZ2VfaGVhZCkpOwotCQkJb3V0X3B1dF9oZWFkOgogCQkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlX2hlYWQpKQogCQkJCQlfX3B1dF9zaW5nbGVfcGFnZShwYWdlX2hlYWQpOwogCQkJb3V0X3B1dF9zaW5nbGU6CkBAIC0xMjEsMTYgKzEwNCwxNyBAQAogCQkJVk1fQlVHX09OKHBhZ2VfaGVhZCAhPSBwYWdlLT5maXJzdF9wYWdlKTsKIAkJCS8qCiAJCQkgKiBXZSBjYW4gcmVsZWFzZSB0aGUgcmVmY291bnQgdGFrZW4gYnkKLQkJCSAqIGdldF9wYWdlX3VubGVzc196ZXJvIG5vdyB0aGF0Ci0JCQkgKiBzcGxpdF9odWdlX3BhZ2VfcmVmY291bnQgaXMgYmxvY2tlZCBvbiB0aGUKLQkJCSAqIGNvbXBvdW5kX2xvY2suCisJCQkgKiBnZXRfcGFnZV91bmxlc3NfemVybygpIG5vdyB0aGF0CisJCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGlzIGJsb2NrZWQgb24KKwkJCSAqIHRoZSBjb21wb3VuZF9sb2NrLgogCQkJICovCiAJCQlpZiAocHV0X3BhZ2VfdGVzdHplcm8ocGFnZV9oZWFkKSkKIAkJCQlWTV9CVUdfT04oMSk7CiAJCQkvKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCB3aWxsIHdhaXQgbm93ICovCi0JCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPD0gMCk7Ci0JCQlhdG9taWNfZGVjKCZwYWdlLT5fY291bnQpOworCQkJVk1fQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZSkgPD0gMCk7CisJCQlhdG9taWNfZGVjKCZwYWdlLT5fbWFwY291bnQpOwogCQkJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlX2hlYWQtPl9jb3VudCkgPD0gMCk7CisJCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgIT0gMCk7CiAJCQljb21wb3VuZF91bmxvY2tfaXJxcmVzdG9yZShwYWdlX2hlYWQsIGZsYWdzKTsKIAkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlX2hlYWQpKSB7CiAJCQkJaWYgKFBhZ2VIZWFkKHBhZ2VfaGVhZCkpCkBAIC0xNjAsNiArMTQ0LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHB1dF9wYWdlKTsKIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnV0IG11c3Qgbm90IGJlIGNhbGxlZCBieSBhbnl0aGluZyBvdGhlcgorICogdGhhbiBnZXRfcGFnZSgpLiBJdCBpbXBsZW1lbnRzIHRoZSBzbG93IHBhdGggb2YgZ2V0X3BhZ2UoKS4KKyAqLworYm9vbCBfX2dldF9wYWdlX3RhaWwoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJLyoKKwkgKiBUaGlzIHRha2VzIGNhcmUgb2YgZ2V0X3BhZ2UoKSBpZiBydW4gb24gYSB0YWlsIHBhZ2UKKwkgKiByZXR1cm5lZCBieSBvbmUgb2YgdGhlIGdldF91c2VyX3BhZ2VzL2ZvbGxvd19wYWdlIHZhcmlhbnRzLgorCSAqIGdldF91c2VyX3BhZ2VzL2ZvbGxvd19wYWdlIGl0c2VsZiBkb2Vzbid0IG5lZWQgdGhlIGNvbXBvdW5kCisJICogbG9jayBiZWNhdXNlIGl0IHJ1bnMgX19nZXRfcGFnZV90YWlsX2ZvbGwoKSB1bmRlciB0aGUKKwkgKiBwcm9wZXIgUFQgbG9jayB0aGF0IGFscmVhZHkgc2VyaWFsaXplcyBhZ2FpbnN0CisJICogc3BsaXRfaHVnZV9wYWdlKCkuCisJICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGdvdCA9IGZhbHNlOworCXN0cnVjdCBwYWdlICpwYWdlX2hlYWQgPSBjb21wb3VuZF90cmFuc19oZWFkKHBhZ2UpOworCisJaWYgKGxpa2VseShwYWdlICE9IHBhZ2VfaGVhZCAmJiBnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlX2hlYWQpKSkgeworCQkvKgorCQkgKiBwYWdlX2hlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlciBidXQgaXQKKwkJICogbWF5IG5vdCBiZSBhIGhlYWQgcGFnZSBhbnltb3JlIGJ5IHRoZSB0aW1lCisJCSAqIHdlIG9idGFpbiB0aGUgbG9jay4gVGhhdCBpcyBvayBhcyBsb25nIGFzIGl0CisJCSAqIGNhbid0IGJlIGZyZWVkIGZyb20gdW5kZXIgdXMuCisJCSAqLworCQlmbGFncyA9IGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShwYWdlX2hlYWQpOworCQkvKiBoZXJlIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IHdvbid0IHJ1biBhbnltb3JlICovCisJCWlmIChsaWtlbHkoUGFnZVRhaWwocGFnZSkpKSB7CisJCQlfX2dldF9wYWdlX3RhaWxfZm9sbChwYWdlLCBmYWxzZSk7CisJCQlnb3QgPSB0cnVlOworCQl9CisJCWNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHBhZ2VfaGVhZCwgZmxhZ3MpOworCQlpZiAodW5saWtlbHkoIWdvdCkpCisJCQlwdXRfcGFnZShwYWdlX2hlYWQpOworCX0KKwlyZXR1cm4gZ290OworfQorRVhQT1JUX1NZTUJPTChfX2dldF9wYWdlX3RhaWwpOworCiAvKioKICAqIHB1dF9wYWdlc19saXN0KCkgLSByZWxlYXNlIGEgbGlzdCBvZiBwYWdlcwogICogQHBhZ2VzOiBsaXN0IG9mIHBhZ2VzIHRocmVhZGVkIG9uIHBhZ2UtPmxydQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDQ2NjgwNDYxLi43OGNjNGQxIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC02LDcgKzYsNiBAQAogICoKICAqICBSZXdyaXR0ZW4gdG8gdXNlIHBhZ2UgY2FjaGUsIChDKSAxOTk4IFN0ZXBoZW4gVHdlZWRpZQogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggMTdiYzIyNC4uYjFjZDEyMCAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMTYxNyw3ICsxNjE2LDcgQEAKIAogCW9vbV9zY29yZV9hZGogPSB0ZXN0X3NldF9vb21fc2NvcmVfYWRqKE9PTV9TQ09SRV9BREpfTUFYKTsKIAllcnIgPSB0cnlfdG9fdW51c2UodHlwZSk7Ci0JdGVzdF9zZXRfb29tX3Njb3JlX2Fkaihvb21fc2NvcmVfYWRqKTsKKwljb21wYXJlX3N3YXBfb29tX3Njb3JlX2FkaihPT01fU0NPUkVfQURKX01BWCwgb29tX3Njb3JlX2Fkaik7CiAKIAlpZiAoZXJyKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9tbS90aHJhc2guYyBiL21tL3RocmFzaC5jCmluZGV4IGU1M2Y3ZDAuLjU3YWQ0OTUgMTAwNjQ0Ci0tLSBhL21tL3RocmFzaC5jCisrKyBiL21tL3RocmFzaC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF90b2tlbl9sb2NrKTsKIHN0cnVjdCBtbV9zdHJ1Y3QgKnN3YXBfdG9rZW5fbW07Ci1zdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF90b2tlbl9tZW1jZzsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfdG9rZW5fbWVtY2dfZnJvbV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IGI0MGFjNmQuLjYzMmIxNWUgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgpkaWZmIC0tZ2l0IGEvbW0vdXRpbC5jIGIvbW0vdXRpbC5jCmluZGV4IDg4ZWExYmQuLjEzNmFjNGYgMTAwNjQ0Ci0tLSBhL21tL3V0aWwuYworKysgYi9tbS91dGlsLmMKQEAgLTEsNyArMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDUwMTZmMTkuLmI2NjlhYTYgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTEyNTMsMTggKzEyNTMsMjIgQEAKIERFRklORV9SV0xPQ0sodm1saXN0X2xvY2spOwogc3RydWN0IHZtX3N0cnVjdCAqdm1saXN0OwogCi1zdGF0aWMgdm9pZCBpbnNlcnRfdm1hbGxvY192bShzdHJ1Y3Qgdm1fc3RydWN0ICp2bSwgc3RydWN0IHZtYXBfYXJlYSAqdmEsCitzdGF0aWMgdm9pZCBzZXR1cF92bWFsbG9jX3ZtKHN0cnVjdCB2bV9zdHJ1Y3QgKnZtLCBzdHJ1Y3Qgdm1hcF9hcmVhICp2YSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNhbGxlcikKIHsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXAsICoqcDsKLQogCXZtLT5mbGFncyA9IGZsYWdzOwogCXZtLT5hZGRyID0gKHZvaWQgKil2YS0+dmFfc3RhcnQ7CiAJdm0tPnNpemUgPSB2YS0+dmFfZW5kIC0gdmEtPnZhX3N0YXJ0OwogCXZtLT5jYWxsZXIgPSBjYWxsZXI7CiAJdmEtPnByaXZhdGUgPSB2bTsKIAl2YS0+ZmxhZ3MgfD0gVk1fVk1fQVJFQTsKK30KIAorc3RhdGljIHZvaWQgaW5zZXJ0X3ZtYWxsb2Nfdm1saXN0KHN0cnVjdCB2bV9zdHJ1Y3QgKnZtKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKnRtcCwgKipwOworCisJdm0tPmZsYWdzICY9IH5WTV9VTkxJU1Q7CiAJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwogCWZvciAocCA9ICZ2bWxpc3Q7ICh0bXAgPSAqcCkgIT0gTlVMTDsgcCA9ICZ0bXAtPm5leHQpIHsKIAkJaWYgKHRtcC0+YWRkciA+PSB2bS0+YWRkcikKQEAgLTEyNzUsNiArMTI3OSwxMyBAQAogCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBpbnNlcnRfdm1hbGxvY192bShzdHJ1Y3Qgdm1fc3RydWN0ICp2bSwgc3RydWN0IHZtYXBfYXJlYSAqdmEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpjYWxsZXIpCit7CisJc2V0dXBfdm1hbGxvY192bSh2bSwgdmEsIGZsYWdzLCBjYWxsZXIpOworCWluc2VydF92bWFsbG9jX3ZtbGlzdCh2bSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2dldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLAogCQl1bnNpZ25lZCBsb25nIGFsaWduLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrLCB2b2lkICpjYWxsZXIpCkBAIC0xMzEzLDcgKzEzMjQsMTggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaW5zZXJ0X3ZtYWxsb2Nfdm0oYXJlYSwgdmEsIGZsYWdzLCBjYWxsZXIpOworCS8qCisJICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIF9fdm1hbGxvY19ub2RlX3JhbmdlLAorCSAqIHdlIGRvIG5vdCBhZGQgdm1fc3RydWN0IHRvIHZtbGlzdCBoZXJlIHRvIGF2b2lkCisJICogYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgbWVtYmVycyBvZiB2bV9zdHJ1Y3Qgc3VjaCBhcworCSAqIHBhZ2VzIGFuZCBucl9wYWdlcyBmaWVsZHMuIFRoZXkgd2lsbCBiZSBzZXQgbGF0ZXIuCisJICogVG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlcnMsIHdlIHVzZSBhIFZNX1VOTElTVCBmbGFnLgorCSAqLworCWlmIChmbGFncyAmIFZNX1VOTElTVCkKKwkJc2V0dXBfdm1hbGxvY192bShhcmVhLCB2YSwgZmxhZ3MsIGNhbGxlcik7CisJZWxzZQorCQlpbnNlcnRfdm1hbGxvY192bShhcmVhLCB2YSwgZmxhZ3MsIGNhbGxlcik7CisKIAlyZXR1cm4gYXJlYTsKIH0KIApAQCAtMTM4MSwxNyArMTQwMywyMCBAQAogCXZhID0gZmluZF92bWFwX2FyZWEoKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJaWYgKHZhICYmIHZhLT5mbGFncyAmIFZNX1ZNX0FSRUEpIHsKIAkJc3RydWN0IHZtX3N0cnVjdCAqdm0gPSB2YS0+cHJpdmF0ZTsKLQkJc3RydWN0IHZtX3N0cnVjdCAqdG1wLCAqKnA7Ci0JCS8qCi0JCSAqIHJlbW92ZSBmcm9tIGxpc3QgYW5kIGRpc2FsbG93IGFjY2VzcyB0byB0aGlzIHZtX3N0cnVjdAotCQkgKiBiZWZvcmUgdW5tYXAuIChhZGRyZXNzIHJhbmdlIGNvbmZsaWN0aW9uIGlzIG1haW50YWluZWQgYnkKLQkJICogdm1hcC4pCi0JCSAqLwotCQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7Ci0JCWZvciAocCA9ICZ2bWxpc3Q7ICh0bXAgPSAqcCkgIT0gdm07IHAgPSAmdG1wLT5uZXh0KQotCQkJOwotCQkqcCA9IHRtcC0+bmV4dDsKLQkJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CisKKwkJaWYgKCEodm0tPmZsYWdzICYgVk1fVU5MSVNUKSkgeworCQkJc3RydWN0IHZtX3N0cnVjdCAqdG1wLCAqKnA7CisJCQkvKgorCQkJICogcmVtb3ZlIGZyb20gbGlzdCBhbmQgZGlzYWxsb3cgYWNjZXNzIHRvCisJCQkgKiB0aGlzIHZtX3N0cnVjdCBiZWZvcmUgdW5tYXAuIChhZGRyZXNzIHJhbmdlCisJCQkgKiBjb25mbGljdGlvbiBpcyBtYWludGFpbmVkIGJ5IHZtYXAuKQorCQkJICovCisJCQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7CisJCQlmb3IgKHAgPSAmdm1saXN0OyAodG1wID0gKnApICE9IHZtOyBwID0gJnRtcC0+bmV4dCkKKwkJCQk7CisJCQkqcCA9IHRtcC0+bmV4dDsKKwkJCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOworCQl9CiAKIAkJdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKHZhLT52YV9zdGFydCwgdmEtPnZhX2VuZCk7CiAJCWZyZWVfdW5tYXBfdm1hcF9hcmVhKHZhKTsKQEAgLTE1NjgsOCArMTU5Myw4IEBACiAJcmV0dXJuIGFyZWEtPmFkZHI7CiAKIGZhaWw6Ci0Jd2Fybl9hbGxvY19mYWlsZWQoZ2ZwX21hc2ssIG9yZGVyLCAidm1hbGxvYzogYWxsb2NhdGlvbiBmYWlsdXJlLCAiCi0JCQkgICJhbGxvY2F0ZWQgJWxkIG9mICVsZCBieXRlc1xuIiwKKwl3YXJuX2FsbG9jX2ZhaWxlZChnZnBfbWFzaywgb3JkZXIsCisJCQkgICJ2bWFsbG9jOiBhbGxvY2F0aW9uIGZhaWx1cmUsIGFsbG9jYXRlZCAlbGQgb2YgJWxkIGJ5dGVzXG4iLAogCQkJICAoYXJlYS0+bnJfcGFnZXMqUEFHRV9TSVpFKSwgYXJlYS0+c2l6ZSk7CiAJdmZyZWUoYXJlYS0+YWRkcik7CiAJcmV0dXJuIE5VTEw7CkBAIC0xNjAwLDE3ICsxNjI1LDIyIEBACiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiB0b3RhbHJhbV9wYWdlcykKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKIAotCWFyZWEgPSBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgYWxpZ24sIFZNX0FMTE9DLCBzdGFydCwgZW5kLCBub2RlLAotCQkJCSAgZ2ZwX21hc2ssIGNhbGxlcik7Ci0KKwlhcmVhID0gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGFsaWduLCBWTV9BTExPQyB8IFZNX1VOTElTVCwKKwkJCQkgIHN0YXJ0LCBlbmQsIG5vZGUsIGdmcF9tYXNrLCBjYWxsZXIpOwogCWlmICghYXJlYSkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZmFpbDsKIAogCWFkZHIgPSBfX3ZtYWxsb2NfYXJlYV9ub2RlKGFyZWEsIGdmcF9tYXNrLCBwcm90LCBub2RlLCBjYWxsZXIpOwogCiAJLyoKKwkgKiBJbiB0aGlzIGZ1bmN0aW9uLCBuZXdseSBhbGxvY2F0ZWQgdm1fc3RydWN0IGlzIG5vdCBhZGRlZAorCSAqIHRvIHZtbGlzdCBhdCBfX2dldF92bV9hcmVhX25vZGUoKS4gc28sIGl0IGlzIGFkZGVkIGhlcmUuCisJICovCisJaW5zZXJ0X3ZtYWxsb2Nfdm1saXN0KGFyZWEpOworCisJLyoKIAkgKiBBIHJlZl9jb3VudCA9IDMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHZtX3N0cnVjdCBhbmQgdm1hcF9hcmVhCiAJICogc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gdGhlIF9fZ2V0X3ZtX2FyZWFfbm9kZSgpIGZ1bmN0aW9uIGNvbnRhaW4KIAkgKiByZWZlcmVuY2VzIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHZtYWxsb2MnZWQgYmxvY2suCkBAIC0xNjE4LDYgKzE2NDgsMTIgQEAKIAlrbWVtbGVha19hbGxvYyhhZGRyLCByZWFsX3NpemUsIDMsIGdmcF9tYXNrKTsKIAogCXJldHVybiBhZGRyOworCitmYWlsOgorCXdhcm5fYWxsb2NfZmFpbGVkKGdmcF9tYXNrLCAwLAorCQkJICAidm1hbGxvYzogYWxsb2NhdGlvbiBmYWlsdXJlOiAlbHUgYnl0ZXNcbiIsCisJCQkgIHJlYWxfc2l6ZSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCA5ZmRmY2U3Li5hMTg5M2MwIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNDk1LDE1ICs0OTUsNiBAQAogCQkJcmV0dXJuIFBBR0VfQUNUSVZBVEU7CiAJCX0KIAotCQkvKgotCQkgKiBXYWl0IG9uIHdyaXRlYmFjayBpZiByZXF1ZXN0ZWQgdG8uIFRoaXMgaGFwcGVucyB3aGVuCi0JCSAqIGRpcmVjdCByZWNsYWltaW5nIGEgbGFyZ2UgY29udGlndW91cyBhcmVhIGFuZCB0aGUKLQkJICogZmlyc3QgYXR0ZW1wdCB0byBmcmVlIGEgcmFuZ2Ugb2YgcGFnZXMgZmFpbHMuCi0JCSAqLwotCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSAmJgotCQkgICAgKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykpCi0JCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCiAJCWlmICghUGFnZVdyaXRlYmFjayhwYWdlKSkgewogCQkJLyogc3luY2hyb25vdXMgd3JpdGUgb3IgYnJva2VuIGFfb3BzPyAqLwogCQkJQ2xlYXJQYWdlUmVjbGFpbShwYWdlKTsKQEAgLTY0MiwxMyArNjMzLDE0IEBACiAJCWxydSA9IExSVV9VTkVWSUNUQUJMRTsKIAkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKIAkJLyoKLQkJICogV2hlbiByYWNpbmcgd2l0aCBhbiBtbG9jayBjbGVhcmluZyAocGFnZSBpcwotCQkgKiB1bmxvY2tlZCksIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBvdGhlciB0aHJlYWQgZG9lcwotCQkgKiBub3Qgb2JzZXJ2ZSBvdXIgc2V0dGluZyBvZiBQR19scnUgYW5kIGZhaWxzCi0JCSAqIGlzb2xhdGlvbiwgd2Ugc2VlIFBHX21sb2NrZWQgY2xlYXJlZCBiZWxvdyBhbmQgbW92ZQorCQkgKiBXaGVuIHJhY2luZyB3aXRoIGFuIG1sb2NrIG9yIEFTX1VORVZJQ1RBQkxFIGNsZWFyaW5nCisJCSAqIChwYWdlIGlzIHVubG9ja2VkKSBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgb3RoZXIgdGhyZWFkCisJCSAqIGRvZXMgbm90IG9ic2VydmUgb3VyIHNldHRpbmcgb2YgUEdfbHJ1IGFuZCBmYWlscworCQkgKiBpc29sYXRpb24vY2hlY2tfbW92ZV91bmV2aWN0YWJsZV9wYWdlLAorCQkgKiB3ZSBzZWUgUEdfbWxvY2tlZC9BU19VTkVWSUNUQUJMRSBjbGVhcmVkIGJlbG93IGFuZCBtb3ZlCiAJCSAqIHRoZSBwYWdlIGJhY2sgdG8gdGhlIGV2aWN0YWJsZSBsaXN0LgogCQkgKgotCQkgKiBUaGUgb3RoZXIgc2lkZSBpcyBUZXN0Q2xlYXJQYWdlTWxvY2tlZCgpLgorCQkgKiBUaGUgb3RoZXIgc2lkZSBpcyBUZXN0Q2xlYXJQYWdlTWxvY2tlZCgpIG9yIHNobWVtX2xvY2soKS4KIAkJICovCiAJCXNtcF9tYigpOwogCX0KQEAgLTc1OSw3ICs3NTEsMTAgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3BhZ2VfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlX2xpc3QsCiAJCQkJICAgICAgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJICAgICAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCisJCQkJICAgICAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsCisJCQkJICAgICAgaW50IHByaW9yaXR5LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnJldF9ucl9kaXJ0eSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpyZXRfbnJfd3JpdGViYWNrKQogewogCUxJU1RfSEVBRChyZXRfcGFnZXMpOwogCUxJU1RfSEVBRChmcmVlX3BhZ2VzKTsKQEAgLTc2Nyw2ICs3NjIsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSAwOwogCXVuc2lnbmVkIGxvbmcgbnJfY29uZ2VzdGVkID0gMDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CisJdW5zaWduZWQgbG9uZyBucl93cml0ZWJhY2sgPSAwOwogCiAJY29uZF9yZXNjaGVkKCk7CiAKQEAgLTgwMywxMyArNzk5LDEyIEBACiAJCQkoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiAoc2MtPmdmcF9tYXNrICYgX19HRlBfSU8pKTsKIAogCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJbnJfd3JpdGViYWNrKys7CiAJCQkvKgotCQkJICogU3luY2hyb25vdXMgcmVjbGFpbSBpcyBwZXJmb3JtZWQgaW4gdHdvIHBhc3NlcywKLQkJCSAqIGZpcnN0IGFuIGFzeW5jaHJvbm91cyBwYXNzIG92ZXIgdGhlIGxpc3QgdG8KLQkJCSAqIHN0YXJ0IHBhcmFsbGVsIHdyaXRlYmFjaywgYW5kIGEgc2Vjb25kIHN5bmNocm9ub3VzCi0JCQkgKiBwYXNzIHRvIHdhaXQgZm9yIHRoZSBJTyB0byBjb21wbGV0ZS4gIFdhaXQgaGVyZQotCQkJICogZm9yIGFueSBwYWdlIGZvciB3aGljaCB3cml0ZWJhY2sgaGFzIGFscmVhZHkKLQkJCSAqIHN0YXJ0ZWQuCisJCQkgKiBTeW5jaHJvbm91cyByZWNsYWltIGNhbm5vdCBxdWV1ZSBwYWdlcyBmb3IKKwkJCSAqIHdyaXRlYmFjayBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIHN0YWNrIG92ZXJmbG93CisJCQkgKiBidXQgaWYgaXQgZW5jb3VudGVycyBhIHBhZ2UgdW5kZXIgd3JpdGViYWNrLCB3YWl0CisJCQkgKiBmb3IgdGhlIElPIHRvIGNvbXBsZXRlLgogCQkJICovCiAJCQlpZiAoKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykgJiYKIAkJCSAgICBtYXlfZW50ZXJfZnMpCkBAIC04NjUsNiArODYwLDI1IEBACiAJCWlmIChQYWdlRGlydHkocGFnZSkpIHsKIAkJCW5yX2RpcnR5Kys7CiAKKwkJCS8qCisJCQkgKiBPbmx5IGtzd2FwZCBjYW4gd3JpdGViYWNrIGZpbGVzeXN0ZW0gcGFnZXMgdG8KKwkJCSAqIGF2b2lkIHJpc2sgb2Ygc3RhY2sgb3ZlcmZsb3cgYnV0IGRvIG5vdCB3cml0ZWJhY2sKKwkJCSAqIHVubGVzcyB1bmRlciBzaWduaWZpY2FudCBwcmVzc3VyZS4KKwkJCSAqLworCQkJaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSAmJgorCQkJCQkoIWN1cnJlbnRfaXNfa3N3YXBkKCkgfHwgcHJpb3JpdHkgPj0gREVGX1BSSU9SSVRZIC0gMikpIHsKKwkJCQkvKgorCQkJCSAqIEltbWVkaWF0ZWx5IHJlY2xhaW0gd2hlbiB3cml0dGVuIGJhY2suCisJCQkJICogU2ltaWxhciBpbiBwcmluY2lwYWwgdG8gZGVhY3RpdmF0ZV9wYWdlKCkKKwkJCQkgKiBleGNlcHQgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYWdlIGlzb2xhdGVkCisJCQkJICogYW5kIGtub3cgaXQncyBkaXJ0eQorCQkJCSAqLworCQkJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfVk1TQ0FOX0lNTUVESUFURSk7CisJCQkJU2V0UGFnZVJlY2xhaW0ocGFnZSk7CisKKwkJCQlnb3RvIGtlZXBfbG9ja2VkOworCQkJfQorCiAJCQlpZiAocmVmZXJlbmNlcyA9PSBQQUdFUkVGX1JFQ0xBSU1fQ0xFQU4pCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKIAkJCWlmICghbWF5X2VudGVyX2ZzKQpAQCAtOTk5LDYgKzEwMTMsOCBAQAogCiAJbGlzdF9zcGxpY2UoJnJldF9wYWdlcywgcGFnZV9saXN0KTsKIAljb3VudF92bV9ldmVudHMoUEdBQ1RJVkFURSwgcGdhY3RpdmF0ZSk7CisJKnJldF9ucl9kaXJ0eSArPSBucl9kaXJ0eTsKKwkqcmV0X25yX3dyaXRlYmFjayArPSBucl93cml0ZWJhY2s7CiAJcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIApAQCAtMTAxMiwyMyArMTAyOCwyNyBAQAogICoKICAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtdmUgZXJybm8gb24gZmFpbHVyZS4KICAqLwotaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKQoraW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaXNvbGF0ZV9tb2RlX3QgbW9kZSwgaW50IGZpbGUpCiB7CisJYm9vbCBhbGxfbHJ1X21vZGU7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAkvKiBPbmx5IHRha2UgcGFnZXMgb24gdGhlIExSVS4gKi8KIAlpZiAoIVBhZ2VMUlUocGFnZSkpCiAJCXJldHVybiByZXQ7CiAKKwlhbGxfbHJ1X21vZGUgPSAobW9kZSAmIChJU09MQVRFX0FDVElWRXxJU09MQVRFX0lOQUNUSVZFKSkgPT0KKwkJKElTT0xBVEVfQUNUSVZFfElTT0xBVEVfSU5BQ1RJVkUpOworCiAJLyoKIAkgKiBXaGVuIGNoZWNraW5nIHRoZSBhY3RpdmUgc3RhdGUsIHdlIG5lZWQgdG8gYmUgc3VyZSB3ZSBhcmUKIAkgKiBkZWFsaW5nIHdpdGggY29tcGFyaWJsZSBib29sZWFuIHZhbHVlcy4gIFRha2UgdGhlIGxvZ2ljYWwgbm90CiAJICogb2YgZWFjaC4KIAkgKi8KLQlpZiAobW9kZSAhPSBJU09MQVRFX0JPVEggJiYgKCFQYWdlQWN0aXZlKHBhZ2UpICE9ICFtb2RlKSkKKwlpZiAoIWFsbF9scnVfbW9kZSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAhPSAhKG1vZGUgJiBJU09MQVRFX0FDVElWRSkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAobW9kZSAhPSBJU09MQVRFX0JPVEggJiYgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpICE9IGZpbGUpCisJaWYgKCFhbGxfbHJ1X21vZGUgJiYgISFwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkgIT0gZmlsZSkKIAkJcmV0dXJuIHJldDsKIAogCS8qCkBAIC0xMDQxLDYgKzEwNjEsMTIgQEAKIAogCXJldCA9IC1FQlVTWTsKIAorCWlmICgobW9kZSAmIElTT0xBVEVfQ0xFQU4pICYmIChQYWdlRGlydHkocGFnZSkgfHwgUGFnZVdyaXRlYmFjayhwYWdlKSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKG1vZGUgJiBJU09MQVRFX1VOTUFQUEVEKSAmJiBwYWdlX21hcHBlZChwYWdlKSkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChsaWtlbHkoZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpKSB7CiAJCS8qCiAJCSAqIEJlIGNhcmVmdWwgbm90IHRvIGNsZWFyIFBhZ2VMUlUgdW50aWwgYWZ0ZXIgd2UncmUKQEAgLTEwNzYsNyArMTEwMiw4IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfbHJ1X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJc3RydWN0IGxpc3RfaGVhZCAqc3JjLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCi0JCXVuc2lnbmVkIGxvbmcgKnNjYW5uZWQsIGludCBvcmRlciwgaW50IG1vZGUsIGludCBmaWxlKQorCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsIGlzb2xhdGVfbW9kZV90IG1vZGUsCisJCWludCBmaWxlKQogewogCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgbnJfbHVtcHlfdGFrZW4gPSAwOwpAQCAtMTIwMSw4ICsxMjI4LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlzb2xhdGVfcGFnZXNfZ2xvYmFsKHVuc2lnbmVkIGxvbmcgbnIsCiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKIAkJCQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLAotCQkJCQlpbnQgbW9kZSwgc3RydWN0IHpvbmUgKnosCi0JCQkJCWludCBhY3RpdmUsIGludCBmaWxlKQorCQkJCQlpc29sYXRlX21vZGVfdCBtb2RlLAorCQkJCQlzdHJ1Y3Qgem9uZSAqeiwJaW50IGFjdGl2ZSwgaW50IGZpbGUpCiB7CiAJaW50IGxydSA9IExSVV9CQVNFOwogCWlmIChhY3RpdmUpCkBAIC0xMzk0LDcgKzE0MjEsNyBAQAogfQogCiAvKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHdhaXQgdG8gY2xlYW4gZGlydHkvd3JpdGViYWNrIHBhZ2VzLgorICogUmV0dXJucyB0cnVlIGlmIGEgZGlyZWN0IHJlY2xhaW0gc2hvdWxkIHdhaXQgb24gcGFnZXMgdW5kZXIgd3JpdGViYWNrLgogICoKICAqIElmIHdlIGFyZSBkaXJlY3QgcmVjbGFpbWluZyBmb3IgY29udGlndW91cyBwYWdlcyBhbmQgd2UgZG8gbm90IHJlY2xhaW0KICAqIGV2ZXJ5dGhpbmcgaW4gdGhlIGxpc3QsIHRyeSBhZ2FpbiBhbmQgd2FpdCBmb3Igd3JpdGViYWNrIElPIHRvIGNvbXBsZXRlLgpAQCAtMTQ0OCw2ICsxNDc1LDkgQEAKIAl1bnNpZ25lZCBsb25nIG5yX3Rha2VuOwogCXVuc2lnbmVkIGxvbmcgbnJfYW5vbjsKIAl1bnNpZ25lZCBsb25nIG5yX2ZpbGU7CisJdW5zaWduZWQgbG9uZyBucl9kaXJ0eSA9IDA7CisJdW5zaWduZWQgbG9uZyBucl93cml0ZWJhY2sgPSAwOworCWlzb2xhdGVfbW9kZV90IHJlY2xhaW1fbW9kZSA9IElTT0xBVEVfSU5BQ1RJVkU7CiAKIAl3aGlsZSAodW5saWtlbHkodG9vX21hbnlfaXNvbGF0ZWQoem9uZSwgZmlsZSwgc2MpKSkgewogCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi8xMCk7CkBAIC0xNDU4LDE1ICsxNDg4LDIxIEBACiAJfQogCiAJc2V0X3JlY2xhaW1fbW9kZShwcmlvcml0eSwgc2MsIGZhbHNlKTsKKwlpZiAoc2MtPnJlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU0pCisJCXJlY2xhaW1fbW9kZSB8PSBJU09MQVRFX0FDVElWRTsKKwogCWxydV9hZGRfZHJhaW4oKTsKKworCWlmICghc2MtPm1heV91bm1hcCkKKwkJcmVjbGFpbV9tb2RlIHw9IElTT0xBVEVfVU5NQVBQRUQ7CisJaWYgKCFzYy0+bWF5X3dyaXRlcGFnZSkKKwkJcmVjbGFpbV9tb2RlIHw9IElTT0xBVEVfQ0xFQU47CisKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKLQkJbnJfdGFrZW4gPSBpc29sYXRlX3BhZ2VzX2dsb2JhbChucl90b19zY2FuLAotCQkJJnBhZ2VfbGlzdCwgJm5yX3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCXNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfTFVNUFlSRUNMQUlNID8KLQkJCQkJSVNPTEFURV9CT1RIIDogSVNPTEFURV9JTkFDVElWRSwKLQkJCXpvbmUsIDAsIGZpbGUpOworCQlucl90YWtlbiA9IGlzb2xhdGVfcGFnZXNfZ2xvYmFsKG5yX3RvX3NjYW4sICZwYWdlX2xpc3QsCisJCQkmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLCByZWNsYWltX21vZGUsIHpvbmUsIDAsIGZpbGUpOwogCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW5uZWQ7CiAJCWlmIChjdXJyZW50X2lzX2tzd2FwZCgpKQogCQkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NDQU5fS1NXQVBELCB6b25lLApAQCAtMTQ3NSwxMiArMTUxMSw5IEBACiAJCQlfX2NvdW50X3pvbmVfdm1fZXZlbnRzKFBHU0NBTl9ESVJFQ1QsIHpvbmUsCiAJCQkJCSAgICAgICBucl9zY2FubmVkKTsKIAl9IGVsc2UgewotCQlucl90YWtlbiA9IG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyhucl90b19zY2FuLAotCQkJJnBhZ2VfbGlzdCwgJm5yX3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCXNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfTFVNUFlSRUNMQUlNID8KLQkJCQkJSVNPTEFURV9CT1RIIDogSVNPTEFURV9JTkFDVElWRSwKLQkJCXpvbmUsIHNjLT5tZW1fY2dyb3VwLAotCQkJMCwgZmlsZSk7CisJCW5yX3Rha2VuID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKG5yX3RvX3NjYW4sICZwYWdlX2xpc3QsCisJCQkmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLCByZWNsYWltX21vZGUsIHpvbmUsCisJCQlzYy0+bWVtX2Nncm91cCwgMCwgZmlsZSk7CiAJCS8qCiAJCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcygpIGtlZXBzIHRyYWNrIG9mCiAJCSAqIHNjYW5uZWQgcGFnZXMgb24gaXRzIG93bi4KQEAgLTE0OTYsMTIgKzE1MjksMTQgQEAKIAogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCi0JbnJfcmVjbGFpbWVkID0gc2hyaW5rX3BhZ2VfbGlzdCgmcGFnZV9saXN0LCB6b25lLCBzYyk7CisJbnJfcmVjbGFpbWVkID0gc2hyaW5rX3BhZ2VfbGlzdCgmcGFnZV9saXN0LCB6b25lLCBzYywgcHJpb3JpdHksCisJCQkJCQkmbnJfZGlydHksICZucl93cml0ZWJhY2spOwogCiAJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHN5bmNyb25vdXNseSB3YWl0IGZvciB3cml0ZWJhY2sgKi8KIAlpZiAoc2hvdWxkX3JlY2xhaW1fc3RhbGwobnJfdGFrZW4sIG5yX3JlY2xhaW1lZCwgcHJpb3JpdHksIHNjKSkgewogCQlzZXRfcmVjbGFpbV9tb2RlKHByaW9yaXR5LCBzYywgdHJ1ZSk7Ci0JCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfcGFnZV9saXN0KCZwYWdlX2xpc3QsIHpvbmUsIHNjKTsKKwkJbnJfcmVjbGFpbWVkICs9IHNocmlua19wYWdlX2xpc3QoJnBhZ2VfbGlzdCwgem9uZSwgc2MsCisJCQkJCXByaW9yaXR5LCAmbnJfZGlydHksICZucl93cml0ZWJhY2spOwogCX0KIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC0xNTExLDYgKzE1NDYsMzIgQEAKIAogCXB1dGJhY2tfbHJ1X3BhZ2VzKHpvbmUsIHNjLCBucl9hbm9uLCBucl9maWxlLCAmcGFnZV9saXN0KTsKIAorCS8qCisJICogSWYgcmVjbGFpbSBpcyBpc29sYXRpbmcgZGlydHkgcGFnZXMgdW5kZXIgd3JpdGViYWNrLCBpdCBpbXBsaWVzCisJICogdGhhdCB0aGUgbG9uZy1saXZlZCBwYWdlIGFsbG9jYXRpb24gcmF0ZSBpcyBleGNlZWRpbmcgdGhlIHBhZ2UKKwkgKiBsYXVuZGVyaW5nIHJhdGUuIEVpdGhlciB0aGUgZ2xvYmFsIGxpbWl0cyBhcmUgbm90IGJlaW5nIGVmZmVjdGl2ZQorCSAqIGF0IHRocm90dGxpbmcgcHJvY2Vzc2VzIGR1ZSB0byB0aGUgcGFnZSBkaXN0cmlidXRpb24gdGhyb3VnaG91dAorCSAqIHpvbmVzIG9yIHRoZXJlIGlzIGhlYXZ5IHVzYWdlIG9mIGEgc2xvdyBiYWNraW5nIGRldmljZS4gVGhlCisJICogb25seSBvcHRpb24gaXMgdG8gdGhyb3R0bGUgZnJvbSByZWNsYWltIGNvbnRleHQgd2hpY2ggaXMgbm90IGlkZWFsCisJICogYXMgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSBkaXJ0eWluZyBwcm9jZXNzIGlzIHRocm90dGxlZCBpbiB0aGUKKwkgKiBzYW1lIHdheSBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkgbWFuYWdlcy4KKwkgKgorCSAqIFRoaXMgc2NhbGVzIHRoZSBudW1iZXIgb2YgZGlydHkgcGFnZXMgdGhhdCBtdXN0IGJlIHVuZGVyIHdyaXRlYmFjaworCSAqIGJlZm9yZSB0aHJvdHRsaW5nIGRlcGVuZGluZyBvbiBwcmlvcml0eS4gSXQgaXMgYSBzaW1wbGUgYmFja29mZgorCSAqIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBtb3N0IGVmZmVjdCBpbiB0aGUgcmFuZ2UgREVGX1BSSU9SSVRZIHRvCisJICogREVGX1BSSU9SSVRZLTIgd2hpY2ggaXMgdGhlIHByaW9yaXR5IHJlY2xhaW0gaXMgY29uc2lkZXJlZCB0byBiZQorCSAqIGluIHRyb3VibGUgYW5kIHJlY2xhaW0gaXMgY29uc2lkZXJlZCB0byBiZSBpbiB0cm91YmxlLgorCSAqCisJICogREVGX1BSSU9SSVRZICAgMTAwJSBpc29sYXRlZCBwYWdlcyBtdXN0IGJlIFBhZ2VXcml0ZWJhY2sgdG8gdGhyb3R0bGUKKwkgKiBERUZfUFJJT1JJVFktMSAgNTAlIG11c3QgYmUgUGFnZVdyaXRlYmFjaworCSAqIERFRl9QUklPUklUWS0yICAyNSUgbXVzdCBiZSBQYWdlV3JpdGViYWNrLCBrc3dhcGQgaW4gdHJvdWJsZQorCSAqIC4uLgorCSAqIERFRl9QUklPUklUWS02IEZvciBTV0FQX0NMVVNURVJfTUFYIGlzb2xhdGVkIHBhZ2VzLCB0aHJvdHRsZSBpZiBhbnkKKwkgKiAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkIHBhZ2UgaXMgUGFnZVdyaXRlYmFjaworCSAqLworCWlmIChucl93cml0ZWJhY2sgJiYgbnJfd3JpdGViYWNrID49IChucl90YWtlbiA+PiAoREVGX1BSSU9SSVRZLXByaW9yaXR5KSkpCisJCXdhaXRfaWZmX2Nvbmdlc3RlZCh6b25lLCBCTEtfUldfQVNZTkMsIEhaLzEwKTsKKwogCXRyYWNlX21tX3Ztc2Nhbl9scnVfc2hyaW5rX2luYWN0aXZlKHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQsCiAJCXpvbmVfaWR4KHpvbmUpLAogCQlucl9zY2FubmVkLCBucl9yZWNsYWltZWQsCkBAIC0xNTgyLDE5ICsxNjQzLDI2IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAl1bnNpZ25lZCBsb25nIG5yX3JvdGF0ZWQgPSAwOworCWlzb2xhdGVfbW9kZV90IHJlY2xhaW1fbW9kZSA9IElTT0xBVEVfQUNUSVZFOwogCiAJbHJ1X2FkZF9kcmFpbigpOworCisJaWYgKCFzYy0+bWF5X3VubWFwKQorCQlyZWNsYWltX21vZGUgfD0gSVNPTEFURV9VTk1BUFBFRDsKKwlpZiAoIXNjLT5tYXlfd3JpdGVwYWdlKQorCQlyZWNsYWltX21vZGUgfD0gSVNPTEFURV9DTEVBTjsKKwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJbnJfdGFrZW4gPSBpc29sYXRlX3BhZ2VzX2dsb2JhbChucl9wYWdlcywgJmxfaG9sZCwKIAkJCQkJCSZwZ3NjYW5uZWQsIHNjLT5vcmRlciwKLQkJCQkJCUlTT0xBVEVfQUNUSVZFLCB6b25lLAorCQkJCQkJcmVjbGFpbV9tb2RlLCB6b25lLAogCQkJCQkJMSwgZmlsZSk7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOwogCX0gZWxzZSB7CiAJCW5yX3Rha2VuID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKG5yX3BhZ2VzLCAmbF9ob2xkLAogCQkJCQkJJnBnc2Nhbm5lZCwgc2MtPm9yZGVyLAotCQkJCQkJSVNPTEFURV9BQ1RJVkUsIHpvbmUsCisJCQkJCQlyZWNsYWltX21vZGUsIHpvbmUsCiAJCQkJCQlzYy0+bWVtX2Nncm91cCwgMSwgZmlsZSk7CiAJCS8qCiAJCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcygpIGtlZXBzIHRyYWNrIG9mCkBAIC0xNjk5LDcgKzE3NjcsNyBAQAogCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKIAkJbG93ID0gaW5hY3RpdmVfYW5vbl9pc19sb3dfZ2xvYmFsKHpvbmUpOwogCWVsc2UKLQkJbG93ID0gbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzYy0+bWVtX2Nncm91cCk7CisJCWxvdyA9IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc2MtPm1lbV9jZ3JvdXAsIHpvbmUpOwogCXJldHVybiBsb3c7CiB9CiAjZWxzZQpAQCAtMTc0Miw3ICsxODEwLDcgQEAKIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWxvdyA9IGluYWN0aXZlX2ZpbGVfaXNfbG93X2dsb2JhbCh6b25lKTsKIAllbHNlCi0JCWxvdyA9IG1lbV9jZ3JvdXBfaW5hY3RpdmVfZmlsZV9pc19sb3coc2MtPm1lbV9jZ3JvdXApOworCQlsb3cgPSBtZW1fY2dyb3VwX2luYWN0aXZlX2ZpbGVfaXNfbG93KHNjLT5tZW1fY2dyb3VwLCB6b25lKTsKIAlyZXR1cm4gbG93OwogfQogCkBAIC0xNzk1LDEyICsxODYzLDE5IEBACiAJZW51bSBscnVfbGlzdCBsOwogCWludCBub3N3YXAgPSAwOwogCWJvb2wgZm9yY2Vfc2NhbiA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgbnJfZm9yY2Vfc2NhblsyXTsKIAotCS8qIGtzd2FwZCBkb2VzIHpvbmUgYmFsYW5jaW5nIGFuZCBuZWVkcyB0byBzY2FuIHRoaXMgem9uZSAqLworCS8qCisJICogSWYgdGhlIHpvbmUgb3IgbWVtY2cgaXMgc21hbGwsIG5yW2xdIGNhbiBiZSAwLiAgVGhpcworCSAqIHJlc3VsdHMgaW4gbm8gc2Nhbm5pbmcgb24gdGhpcyBwcmlvcml0eSBhbmQgYSBwb3RlbnRpYWwKKwkgKiBwcmlvcml0eSBkcm9wLiAgR2xvYmFsIGRpcmVjdCByZWNsYWltIGNhbiBnbyB0byB0aGUgbmV4dAorCSAqIHpvbmUgYW5kIHRlbmRzIHRvIGhhdmUgbm8gcHJvYmxlbXMuIEdsb2JhbCBrc3dhcGQgaXMgZm9yCisJICogem9uZSBiYWxhbmNpbmcgYW5kIGl0IG5lZWRzIHRvIHNjYW4gYSBtaW5pbXVtIGFtb3VudC4gV2hlbgorCSAqIHJlY2xhaW1pbmcgZm9yIGEgbWVtY2csIGEgcHJpb3JpdHkgZHJvcCBjYW4gY2F1c2UgaGlnaAorCSAqIGxhdGVuY2llcywgc28gaXQncyBiZXR0ZXIgdG8gc2NhbiBhIG1pbmltdW0gYW1vdW50IHRoZXJlIGFzCisJICogd2VsbC4KKwkgKi8KIAlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykgJiYgY3VycmVudF9pc19rc3dhcGQoKSkKIAkJZm9yY2Vfc2NhbiA9IHRydWU7Ci0JLyogbWVtY2cgbWF5IGhhdmUgc21hbGwgbGltaXQgYW5kIG5lZWQgdG8gYXZvaWQgcHJpb3JpdHkgZHJvcCAqLwogCWlmICghc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWZvcmNlX3NjYW4gPSB0cnVlOwogCkBAIC0xODEwLDggKzE4ODUsNiBAQAogCQlmcmFjdGlvblswXSA9IDA7CiAJCWZyYWN0aW9uWzFdID0gMTsKIAkJZGVub21pbmF0b3IgPSAxOwotCQlucl9mb3JjZV9zY2FuWzBdID0gMDsKLQkJbnJfZm9yY2Vfc2NhblsxXSA9IFNXQVBfQ0xVU1RFUl9NQVg7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTgyOCw4ICsxOTAxLDYgQEAKIAkJCWZyYWN0aW9uWzBdID0gMTsKIAkJCWZyYWN0aW9uWzFdID0gMDsKIAkJCWRlbm9taW5hdG9yID0gMTsKLQkJCW5yX2ZvcmNlX3NjYW5bMF0gPSBTV0FQX0NMVVNURVJfTUFYOwotCQkJbnJfZm9yY2Vfc2NhblsxXSA9IDA7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTE4NzgsMTEgKzE5NDksNiBAQAogCWZyYWN0aW9uWzBdID0gYXA7CiAJZnJhY3Rpb25bMV0gPSBmcDsKIAlkZW5vbWluYXRvciA9IGFwICsgZnAgKyAxOwotCWlmIChmb3JjZV9zY2FuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc2NhbiA9IFNXQVBfQ0xVU1RFUl9NQVg7Ci0JCW5yX2ZvcmNlX3NjYW5bMF0gPSBkaXY2NF91NjQoc2NhbiAqIGFwLCBkZW5vbWluYXRvcik7Ci0JCW5yX2ZvcmNlX3NjYW5bMV0gPSBkaXY2NF91NjQoc2NhbiAqIGZwLCBkZW5vbWluYXRvcik7Ci0JfQogb3V0OgogCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewogCQlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGwpOwpAQCAtMTg5MSwyMCArMTk1NywxMCBAQAogCQlzY2FuID0gem9uZV9ucl9scnVfcGFnZXMoem9uZSwgc2MsIGwpOwogCQlpZiAocHJpb3JpdHkgfHwgbm9zd2FwKSB7CiAJCQlzY2FuID4+PSBwcmlvcml0eTsKKwkJCWlmICghc2NhbiAmJiBmb3JjZV9zY2FuKQorCQkJCXNjYW4gPSBTV0FQX0NMVVNURVJfTUFYOwogCQkJc2NhbiA9IGRpdjY0X3U2NChzY2FuICogZnJhY3Rpb25bZmlsZV0sIGRlbm9taW5hdG9yKTsKIAkJfQotCi0JCS8qCi0JCSAqIElmIHpvbmUgaXMgc21hbGwgb3IgbWVtY2cgaXMgc21hbGwsIG5yW2xdIGNhbiBiZSAwLgotCQkgKiBUaGlzIHJlc3VsdHMgbm8tc2NhbiBvbiB0aGlzIHByaW9yaXR5IGFuZCBwcmlvcml0eSBkcm9wIGRvd24uCi0JCSAqIEZvciBnbG9iYWwgZGlyZWN0IHJlY2xhaW0sIGl0IGNhbiB2aXNpdCBuZXh0IHpvbmUgYW5kIHRlbmQKLQkJICogbm90IHRvIGhhdmUgcHJvYmxlbXMuIEZvciBnbG9iYWwga3N3YXBkLCBpdCdzIGZvciB6b25lCi0JCSAqIGJhbGFuY2luZyBhbmQgaXQgbmVlZCB0byBzY2FuIGEgc21hbGwgYW1vdW50cy4gV2hlbiB1c2luZwotCQkgKiBtZW1jZywgcHJpb3JpdHkgZHJvcCBjYW4gY2F1c2UgYmlnIGxhdGVuY3kuIFNvLCBpdCdzIGJldHRlcgotCQkgKiB0byBzY2FuIHNtYWxsIGFtb3VudC4gU2VlIG1heV9ub3NjYW4gYWJvdmUuCi0JCSAqLwotCQlpZiAoIXNjYW4gJiYgZm9yY2Vfc2NhbikKLQkJCXNjYW4gPSBucl9mb3JjZV9zY2FuW2ZpbGVdOwogCQlucltsXSA9IHNjYW47CiAJfQogfQpAQCAtMTk4MywxMiArMjAzOSwxNCBAQAogCWVudW0gbHJ1X2xpc3QgbDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCwgbnJfc2Nhbm5lZDsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3JlY2xhaW0gPSBzYy0+bnJfdG9fcmVjbGFpbTsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAogcmVzdGFydDoKIAlucl9yZWNsYWltZWQgPSAwOwogCW5yX3NjYW5uZWQgPSBzYy0+bnJfc2Nhbm5lZDsKIAlnZXRfc2Nhbl9jb3VudCh6b25lLCBzYywgbnIsIHByaW9yaXR5KTsKIAorCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAl3aGlsZSAobnJbTFJVX0lOQUNUSVZFX0FOT05dIHx8IG5yW0xSVV9BQ1RJVkVfRklMRV0gfHwKIAkJCQkJbnJbTFJVX0lOQUNUSVZFX0ZJTEVdKSB7CiAJCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewpAQCAtMjAxMiw2ICsyMDcwLDcgQEAKIAkJaWYgKG5yX3JlY2xhaW1lZCA+PSBucl90b19yZWNsYWltICYmIHByaW9yaXR5IDwgREVGX1BSSU9SSVRZKQogCQkJYnJlYWs7CiAJfQorCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAJc2MtPm5yX3JlY2xhaW1lZCArPSBucl9yZWNsYWltZWQ7CiAKIAkvKgpAQCAtMjA0NCwxNCArMjEwMywxOSBAQAogICoKICAqIElmIGEgem9uZSBpcyBkZWVtZWQgdG8gYmUgZnVsbCBvZiBwaW5uZWQgcGFnZXMgdGhlbiBqdXN0IGdpdmUgaXQgYSBsaWdodAogICogc2NhbiB0aGVuIGdpdmUgdXAgb24gaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYSB6b25lIGlzIGJlaW5nIHJlY2xhaW1lZCBmb3IgYSBjb3N0bHkKKyAqIGhpZ2gtb3JkZXIgYWxsb2NhdGlvbiBhbmQgY29tcGFjdGlvbiBpcyBlaXRoZXIgcmVhZHkgdG8gYmVnaW4gb3IgZGVmZXJyZWQuCisgKiBUaGlzIGluZGljYXRlcyB0byB0aGUgY2FsbGVyIHRoYXQgaXQgc2hvdWxkIHJldHJ5IHRoZSBhbGxvY2F0aW9uIG9yIGZhaWwuCiAgKi8KLXN0YXRpYyB2b2lkIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCitzdGF0aWMgYm9vbCBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAogCQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAl1bnNpZ25lZCBsb25nIG5yX3NvZnRfcmVjbGFpbWVkOwogCXVuc2lnbmVkIGxvbmcgbnJfc29mdF9zY2FubmVkOworCWJvb2wgc2hvdWxkX2Fib3J0X3JlY2xhaW0gPSBmYWxzZTsKIAogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Rfbm9kZW1hc2soem9uZSwgeiwgem9uZWxpc3QsCiAJCQkJCWdmcF96b25lKHNjLT5nZnBfbWFzayksIHNjLT5ub2RlbWFzaykgewpAQCAtMjA2Niw2ICsyMTMwLDIzIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUgJiYgcHJpb3JpdHkgIT0gREVGX1BSSU9SSVRZKQogCQkJCWNvbnRpbnVlOwkvKiBMZXQga3N3YXBkIHBvbGwgaXQgKi8KKwkJCWlmIChDT01QQUNUSU9OX0JVSUxEKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBhbHJlYWR5IGhhdmUgcGxlbnR5IG9mIG1lbW9yeSBmcmVlIGZvcgorCQkJCSAqIGNvbXBhY3Rpb24gaW4gdGhpcyB6b25lLCBkb24ndCBmcmVlIGFueSBtb3JlLgorCQkJCSAqIEV2ZW4gdGhvdWdoIGNvbXBhY3Rpb24gaXMgaW52b2tlZCBmb3IgYW55CisJCQkJICogbm9uLXplcm8gb3JkZXIsIG9ubHkgZnJlcXVlbnQgY29zdGx5IG9yZGVyCisJCQkJICogcmVjbGFtYXRpb24gaXMgZGlzcnVwdGl2ZSBlbm91Z2ggdG8gYmVjb21lIGEKKwkJCQkgKiBub3RpY2FibGUgcHJvYmxlbSwgbGlrZSB0cmFuc3BhcmVudCBodWdlIHBhZ2UKKwkJCQkgKiBhbGxvY2F0aW9ucy4KKwkJCQkgKi8KKwkJCQlpZiAoc2MtPm9yZGVyID4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYKKwkJCQkJKGNvbXBhY3Rpb25fc3VpdGFibGUoem9uZSwgc2MtPm9yZGVyKSB8fAorCQkJCQkgY29tcGFjdGlvbl9kZWZlcnJlZCh6b25lKSkpIHsKKwkJCQkJc2hvdWxkX2Fib3J0X3JlY2xhaW0gPSB0cnVlOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CiAJCQkvKgogCQkJICogVGhpcyBzdGVhbHMgcGFnZXMgZnJvbSBtZW1vcnkgY2dyb3VwcyBvdmVyIHNvZnRsaW1pdAogCQkJICogYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMgYW5kCkBAIC0yMDgzLDYgKzIxNjQsOCBAQAogCiAJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCBzYyk7CiAJfQorCisJcmV0dXJuIHNob3VsZF9hYm9ydF9yZWNsYWltOwogfQogCiBzdGF0aWMgYm9vbCB6b25lX3JlY2xhaW1hYmxlKHN0cnVjdCB6b25lICp6b25lKQpAQCAtMjE0Nyw3ICsyMjMwLDkgQEAKIAkJc2MtPm5yX3NjYW5uZWQgPSAwOwogCQlpZiAoIXByaW9yaXR5KQogCQkJZGlzYWJsZV9zd2FwX3Rva2VuKHNjLT5tZW1fY2dyb3VwKTsKLQkJc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOworCQlpZiAoc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpKQorCQkJYnJlYWs7CisKIAkJLyoKIAkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQogCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKQEAgLTIxODEsNyArMjI2Niw4IEBACiAJCSAqLwogCQl3cml0ZWJhY2tfdGhyZXNob2xkID0gc2MtPm5yX3RvX3JlY2xhaW0gKyBzYy0+bnJfdG9fcmVjbGFpbSAvIDI7CiAJCWlmICh0b3RhbF9zY2FubmVkID4gd3JpdGViYWNrX3RocmVzaG9sZCkgewotCQkJd2FrZXVwX2ZsdXNoZXJfdGhyZWFkcyhsYXB0b3BfbW9kZSA/IDAgOiB0b3RhbF9zY2FubmVkKTsKKwkJCXdha2V1cF9mbHVzaGVyX3RocmVhZHMobGFwdG9wX21vZGUgPyAwIDogdG90YWxfc2Nhbm5lZCwKKwkJCQkJCVdCX1JFQVNPTl9UUllfVE9fRlJFRV9QQUdFUyk7CiAJCQlzYy0+bWF5X3dyaXRlcGFnZSA9IDE7CiAJCX0KIApAQCAtMjY5MCw2ICsyNzc2LDggQEAKIAogCQkJLyogSWYgYmFsYW5jZWQsIGNsZWFyIHRoZSBjb25nZXN0ZWQgZmxhZyAqLwogCQkJem9uZV9jbGVhcl9mbGFnKHpvbmUsIFpPTkVfQ09OR0VTVEVEKTsKKwkJCWlmIChpIDw9ICpjbGFzc3pvbmVfaWR4KQorCQkJCWJhbGFuY2VkICs9IHpvbmUtPnByZXNlbnRfcGFnZXM7CiAJCX0KIAl9CiAKQEAgLTI3NjMsNyArMjg1MSw5IEBACiBzdGF0aWMgaW50IGtzd2FwZCh2b2lkICpwKQogewogCXVuc2lnbmVkIGxvbmcgb3JkZXIsIG5ld19vcmRlcjsKKwl1bnNpZ25lZCBiYWxhbmNlZF9vcmRlcjsKIAlpbnQgY2xhc3N6b25lX2lkeCwgbmV3X2NsYXNzem9uZV9pZHg7CisJaW50IGJhbGFuY2VkX2NsYXNzem9uZV9pZHg7CiAJcGdfZGF0YV90ICpwZ2RhdCA9IChwZ19kYXRhX3QqKXA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCkBAIC0yNzk0LDcgKzI4ODQsOSBAQAogCXNldF9mcmVlemFibGUoKTsKIAogCW9yZGVyID0gbmV3X29yZGVyID0gMDsKKwliYWxhbmNlZF9vcmRlciA9IDA7CiAJY2xhc3N6b25lX2lkeCA9IG5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsKKwliYWxhbmNlZF9jbGFzc3pvbmVfaWR4ID0gY2xhc3N6b25lX2lkeDsKIAlmb3IgKCA7IDsgKSB7CiAJCWludCByZXQ7CiAKQEAgLTI4MDMsNyArMjg5NSw4IEBACiAJCSAqIG5ldyByZXF1ZXN0IG9mIGEgc2ltaWxhciBvciBoYXJkZXIgdHlwZSB3aWxsIHN1Y2NlZWQgc29vbgogCQkgKiBzbyBjb25zaWRlciBnb2luZyB0byBzbGVlcCBvbiB0aGUgYmFzaXMgd2UgcmVjbGFpbWVkIGF0CiAJCSAqLwotCQlpZiAoY2xhc3N6b25lX2lkeCA+PSBuZXdfY2xhc3N6b25lX2lkeCAmJiBvcmRlciA9PSBuZXdfb3JkZXIpIHsKKwkJaWYgKGJhbGFuY2VkX2NsYXNzem9uZV9pZHggPj0gbmV3X2NsYXNzem9uZV9pZHggJiYKKwkJCQkJYmFsYW5jZWRfb3JkZXIgPT0gbmV3X29yZGVyKSB7CiAJCQluZXdfb3JkZXIgPSBwZ2RhdC0+a3N3YXBkX21heF9vcmRlcjsKIAkJCW5ld19jbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7CiAJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9ICAwOwpAQCAtMjgxOCw5ICsyOTExLDEyIEBACiAJCQlvcmRlciA9IG5ld19vcmRlcjsKIAkJCWNsYXNzem9uZV9pZHggPSBuZXdfY2xhc3N6b25lX2lkeDsKIAkJfSBlbHNlIHsKLQkJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KTsKKwkJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIGJhbGFuY2VkX29yZGVyLAorCQkJCQkJYmFsYW5jZWRfY2xhc3N6b25lX2lkeCk7CiAJCQlvcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOwogCQkJY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OworCQkJbmV3X29yZGVyID0gb3JkZXI7CisJCQluZXdfY2xhc3N6b25lX2lkeCA9IGNsYXNzem9uZV9pZHg7CiAJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7CiAJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IHBnZGF0LT5ucl96b25lcyAtIDE7CiAJCX0KQEAgLTI4MzUsNyArMjkzMSw5IEBACiAJCSAqLwogCQlpZiAoIXJldCkgewogCQkJdHJhY2VfbW1fdm1zY2FuX2tzd2FwZF93YWtlKHBnZGF0LT5ub2RlX2lkLCBvcmRlcik7Ci0JCQlvcmRlciA9IGJhbGFuY2VfcGdkYXQocGdkYXQsIG9yZGVyLCAmY2xhc3N6b25lX2lkeCk7CisJCQliYWxhbmNlZF9jbGFzc3pvbmVfaWR4ID0gY2xhc3N6b25lX2lkeDsKKwkJCWJhbGFuY2VkX29yZGVyID0gYmFsYW5jZV9wZ2RhdChwZ2RhdCwgb3JkZXIsCisJCQkJCQkmYmFsYW5jZWRfY2xhc3N6b25lX2lkeCk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0zMzQ3LDY2ICszNDQ1LDEyIEBACiAKIH0KIAotLyoqCi0gKiBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMgLSBjaGVjayB1bmV2aWN0YWJsZSBsaXN0IGZvciBldmljdGFibGUgcGFnZXMKLSAqIEB6b25lIC0gem9uZSBvZiB3aGljaCB0byBzY2FuIHRoZSB1bmV2aWN0YWJsZSBsaXN0Ci0gKgotICogU2NhbiBAem9uZSdzIHVuZXZpY3RhYmxlIExSVSBsaXN0cyB0byBjaGVjayBmb3IgcGFnZXMgdGhhdCBoYXZlIGJlY29tZQotICogZXZpY3RhYmxlLiAgTW92ZSB0aG9zZSB0aGF0IGhhdmUgdG8gQHpvbmUncyBpbmFjdGl2ZSBsaXN0IHdoZXJlIHRoZXkKLSAqIGJlY29tZSBjYW5kaWRhdGVzIGZvciByZWNsYWltLCB1bmxlc3Mgc2hyaW5rX2luYWN0aXZlX3pvbmUoKSBkZWNpZGVzCi0gKiB0byByZWFjdGl2YXRlIHRoZW0uICBQYWdlcyB0aGF0IGFyZSBzdGlsbCB1bmV2aWN0YWJsZSBhcmUgcm90YXRlZAotICogYmFjayBvbnRvIEB6b25lJ3MgdW5ldmljdGFibGUgbGlzdC4KLSAqLwotI2RlZmluZSBTQ0FOX1VORVZJQ1RBQkxFX0JBVENIX1NJWkUgMTZVTCAvKiBhcmJpdHJhcnkgbG9jayBob2xkIGJhdGNoIHNpemUgKi8KLXN0YXRpYyB2b2lkIHNjYW5fem9uZV91bmV2aWN0YWJsZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSkKK3N0YXRpYyB2b2lkIHdhcm5fc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxfdW5ldmljdGFibGUgPSAmem9uZS0+bHJ1W0xSVV9VTkVWSUNUQUJMRV0ubGlzdDsKLQl1bnNpZ25lZCBsb25nIHNjYW47Ci0JdW5zaWduZWQgbG9uZyBucl90b19zY2FuID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1VORVZJQ1RBQkxFKTsKLQotCXdoaWxlIChucl90b19zY2FuID4gMCkgewotCQl1bnNpZ25lZCBsb25nIGJhdGNoX3NpemUgPSBtaW4obnJfdG9fc2NhbiwKLQkJCQkJCVNDQU5fVU5FVklDVEFCTEVfQkFUQ0hfU0laRSk7Ci0KLQkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQlmb3IgKHNjYW4gPSAwOyAgc2NhbiA8IGJhdGNoX3NpemU7IHNjYW4rKykgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBscnVfdG9fcGFnZShsX3VuZXZpY3RhYmxlKTsKLQotCQkJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCi0JCQkJY29udGludWU7Ci0KLQkJCXByZWZldGNod19wcmV2X2xydV9wYWdlKHBhZ2UsIGxfdW5ldmljdGFibGUsIGZsYWdzKTsKLQotCQkJaWYgKGxpa2VseShQYWdlTFJVKHBhZ2UpICYmIFBhZ2VVbmV2aWN0YWJsZShwYWdlKSkpCi0JCQkJY2hlY2tfbW92ZV91bmV2aWN0YWJsZV9wYWdlKHBhZ2UsIHpvbmUpOwotCi0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKLQotCQlucl90b19zY2FuIC09IGJhdGNoX3NpemU7Ci0JfQotfQotCi0KLS8qKgotICogc2Nhbl9hbGxfem9uZXNfdW5ldmljdGFibGVfcGFnZXMgLSBzY2FuIGFsbCB1bmV2aWN0YWJsZSBsaXN0cyBmb3IgZXZpY3RhYmxlIHBhZ2VzCi0gKgotICogQSByZWFsbHkgYmlnIGhhbW1lcjogIHNjYW4gYWxsIHpvbmVzJyB1bmV2aWN0YWJsZSBMUlUgbGlzdHMgdG8gY2hlY2sgZm9yCi0gKiBwYWdlcyB0aGF0IGhhdmUgYmVjb21lIGV2aWN0YWJsZS4gIE1vdmUgdGhvc2UgYmFjayB0byB0aGUgem9uZXMnCi0gKiBpbmFjdGl2ZSBsaXN0IHdoZXJlIHRoZXkgYmVjb21lIGNhbmRpZGF0ZXMgZm9yIHJlY2xhaW0uCi0gKiBUaGlzIG9jY3VycyB3aGVuLCBlLmcuLCB3ZSBoYXZlIHVuc3dhcHBhYmxlIHBhZ2VzIG9uIHRoZSB1bmV2aWN0YWJsZSBsaXN0cywKLSAqIGFuZCB3ZSBhZGQgc3dhcCB0byB0aGUgc3lzdGVtLiAgQXMgc3VjaCwgaXQgcnVucyBpbiB0aGUgY29udGV4dCBvZiBhIHRhc2sKLSAqIHRoYXQgaGFzIHBvc3NpYmx5L3Byb2JhYmx5IG1hZGUgc29tZSBwcmV2aW91c2x5IHVuZXZpY3RhYmxlIHBhZ2VzCi0gKiBldmljdGFibGUuCi0gKi8KLXN0YXRpYyB2b2lkIHNjYW5fYWxsX3pvbmVzX3VuZXZpY3RhYmxlX3BhZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IHpvbmUgKnpvbmU7Ci0KLQlmb3JfZWFjaF96b25lKHpvbmUpIHsKLQkJc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHpvbmUpOwotCX0KKwlwcmludGtfb25jZShLRVJOX1dBUk5JTkcKKwkJICAgICJUaGUgc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyBzeXNjdGwvbm9kZS1pbnRlcmZhY2UgaGFzIGJlZW4gIgorCQkgICAgImRpc2FibGVkIGZvciBsYWNrIG9mIGEgbGVnaXRpbWF0ZSB1c2UgY2FzZS4gIElmIHlvdSBoYXZlICIKKwkJICAgICJvbmUsIHBsZWFzZSBzZW5kIGFuIGVtYWlsIHRvIGxpbnV4LW1tQGt2YWNrLm9yZy5cbiIpOwogfQogCiAvKgpAQCAtMzQxOSwxMSArMzQ2Myw4IEBACiAJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLAogCQkJICAgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKIHsKKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwotCi0JaWYgKHdyaXRlICYmICoodW5zaWduZWQgbG9uZyAqKXRhYmxlLT5kYXRhKQotCQlzY2FuX2FsbF96b25lc191bmV2aWN0YWJsZV9wYWdlcygpOwotCiAJc2Nhbl91bmV2aWN0YWJsZV9wYWdlcyA9IDA7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNDM4LDYgKzM0NzksNyBAQAogCQkJCQkgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAogCQkJCQkgIGNoYXIgKmJ1ZikKIHsKKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsJLyogYWx3YXlzIHplcm87IHNob3VsZCBmaXQuLi4gKi8KIH0KIApAQCAtMzQ0NSwxOSArMzQ4Nyw3IEBACiAJCQkJCSAgIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLAogCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3Qgem9uZSAqbm9kZV96b25lcyA9IE5PREVfREFUQShkZXYtPmlkKS0+bm9kZV96b25lczsKLQlzdHJ1Y3Qgem9uZSAqem9uZTsKLQl1bnNpZ25lZCBsb25nIHJlczsKLQl1bnNpZ25lZCBsb25nIHJlcSA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZyZXMpOwotCi0JaWYgKCFyZXEpCi0JCXJldHVybiAxOwkvKiB6ZXJvIGlzIG5vLW9wICovCi0KLQlmb3IgKHpvbmUgPSBub2RlX3pvbmVzOyB6b25lIC0gbm9kZV96b25lcyA8IE1BWF9OUl9aT05FUzsgKyt6b25lKSB7Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCi0JCQljb250aW51ZTsKLQkJc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHpvbmUpOwotCX0KKwl3YXJuX3NjYW5fdW5ldmljdGFibGVfcGFnZXMoKTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCBkNTJiMTNkLi44ZmQ2MDNiIDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtNzgsNyArNzgsNyBAQAogICoKICAqIHZtX3N0YXQgY29udGFpbnMgdGhlIGdsb2JhbCBjb3VudGVycwogICovCi1hdG9taWNfbG9uZ190IHZtX3N0YXRbTlJfVk1fWk9ORV9TVEFUX0lURU1TXTsKK2F0b21pY19sb25nX3Qgdm1fc3RhdFtOUl9WTV9aT05FX1NUQVRfSVRFTVNdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogRVhQT1JUX1NZTUJPTCh2bV9zdGF0KTsKIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTcwMiw2ICs3MDIsNyBAQAogCSJucl91bnN0YWJsZSIsCiAJIm5yX2JvdW5jZSIsCiAJIm5yX3Ztc2Nhbl93cml0ZSIsCisJIm5yX3Ztc2Nhbl9pbW1lZGlhdGVfcmVjbGFpbSIsCiAJIm5yX3dyaXRlYmFja190ZW1wIiwKIAkibnJfaXNvbGF0ZWRfYW5vbiIsCiAJIm5yX2lzb2xhdGVkX2ZpbGUiLApkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mYy5jIGIvbmV0LzgwMi9mYy5jCmluZGV4IDFlNDlmMmQuLmJkMzQ1ZjMgMTAwNjQ0Ci0tLSBhL25ldC84MDIvZmMuYworKysgYi9uZXQvODAyL2ZjLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KIAogLyoKZGlmZiAtLWdpdCBhL25ldC84MDIvZ2FycC5jIGIvbmV0LzgwMi9nYXJwLmMKaW5kZXggMDcwYmY0NC4uOGUyMWI2ZCAxMDA2NDQKLS0tIGEvbmV0LzgwMi9nYXJwLmMKKysrIGIvbmV0LzgwMi9nYXJwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9sbGMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2xsYy5oPgogI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CiAjaW5jbHVkZSA8bmV0L2dhcnAuaD4KZGlmZiAtLWdpdCBhL25ldC84MDIvc3RwLmMgYi9uZXQvODAyL3N0cC5jCmluZGV4IDBlMTM2ZWYuLjE1NTQwYjcgMTAwNjQ0Ci0tLSBhL25ldC84MDIvc3RwLmMKKysrIGIvbmV0LzgwMi9zdHAuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGxjLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9sbGMuaD4KICNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgogI2luY2x1ZGUgPG5ldC9zdHAuaD4KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2NvcmUuYyBiL25ldC84MDIxcS92bGFuX2NvcmUuYwppbmRleCAxNjMzOTdmLi5mNWZmYzAyIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAidmxhbi5oIgogCiBib29sIHZsYW5fZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsIGJvb2wgbGFzdF9oYW5kbGVyKQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCBjOGNmOTM5Li5iYzI1Mjg2IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtNDcwLDEwICs0NzAsMTIgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OwogCi0JaWYgKGNoYW5nZSAmIElGRl9BTExNVUxUSSkKLQkJZGV2X3NldF9hbGxtdWx0aShyZWFsX2RldiwgZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSA/IDEgOiAtMSk7Ci0JaWYgKGNoYW5nZSAmIElGRl9QUk9NSVNDKQotCQlkZXZfc2V0X3Byb21pc2N1aXR5KHJlYWxfZGV2LCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAxIDogLTEpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCWlmIChjaGFuZ2UgJiBJRkZfQUxMTVVMVEkpCisJCQlkZXZfc2V0X2FsbG11bHRpKHJlYWxfZGV2LCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gMSA6IC0xKTsKKwkJaWYgKGNoYW5nZSAmIElGRl9QUk9NSVNDKQorCQkJZGV2X3NldF9wcm9taXNjdWl0eShyZWFsX2RldiwgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDID8gMSA6IC0xKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldikKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX25ldGxpbmsuYyBiL25ldC84MDIxcS92bGFuX25ldGxpbmsuYwppbmRleCBiZTlhNWMxLi4yMzVjMjE5IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9uZXRsaW5rLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fbmV0bGluay5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2FhcnAuYyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCmluZGV4IDFhY2M2OTUuLjE3M2EyZTggMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvYWFycC5jCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBpbnQgc3lzY3RsX2FhcnBfZXhwaXJ5X3RpbWUgPSBBQVJQX0VYUElSWV9USU1FOwogaW50IHN5c2N0bF9hYXJwX3RpY2tfdGltZSA9IEFBUlBfVElDS19USU1FOwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hdGFsa19wcm9jLmMgYi9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYwppbmRleCA2ZWYwZTc2Li5iNWIxYTIyIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYworKysgYi9uZXQvYXBwbGV0YWxrL2F0YWxrX3Byb2MuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBhdGFsa19pZmFjZSAqYXRhbGtfZ2V0X2ludGVyZmFjZV9pZHgobG9mZl90IHBvcykKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHZjLmMgYi9uZXQvYXRtL3B2Yy5jCmluZGV4IDQzN2VlNzAuLjNhNzM0OTEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vcHZjLmMKKysrIGIvbmV0L2F0bS9wdmMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogZm9yIHNvY2tfbm9fKiAqLwogCiAjaW5jbHVkZSAicmVzb3VyY2VzLmgiCQkvKiBkZXZzIGFuZCB2Y2NzICovCmRpZmYgLS1naXQgYS9uZXQvYXRtL3N2Yy5jIGIvbmV0L2F0bS9zdmMuYwppbmRleCA3NTRlZTQ3Li4xMjgxMDQ5IDEwMDY0NAotLS0gYS9uZXQvYXRtL3N2Yy5jCisrKyBiL25ldC9hdG0vc3ZjLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogZm9yIHNvY2tfbm9fKiAqLwogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJlc291cmNlcy5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgkJLyogY29tbW9uIGZvciBQVkNzIGFuZCBTVkNzICovCmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X3JvdXRlLmMgYi9uZXQvYXgyNS9heDI1X3JvdXRlLmMKaW5kZXggYTE2OTA4NC4uODdmZGRhYiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCisrKyBiL25ldC9heDI1L2F4MjVfcm91dGUuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgYXgyNV9yb3V0ZSAqYXgyNV9yb3V0ZV9saXN0Owogc3RhdGljIERFRklORV9SV0xPQ0soYXgyNV9yb3V0ZV9sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfdWlkLmMgYi9uZXQvYXgyNS9heDI1X3VpZC5jCmluZGV4IGQzNDliZTkuLjRjODMxMzcgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfdWlkLmMKKysrIGIvbmV0L2F4MjUvYXgyNV91aWQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCmluZGV4IGRiNmFmNzAuLjUyMTA5NTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggNWUwOTc2Ni4uOWNhNTYxNiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTI4LDYgKzI4LDcgQEAKIC8qIEJsdWV0b290aCBMMkNBUCBzb2NrZXRzLiAqLwogCiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210LmMgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwppbmRleCA4NDEzZjU1Li5mYmNiZWY2IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXQuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggNmY5ZjhjMC4uNWEzMTczMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKIAogLyogQnJpZGdlIGdyb3VwIG11bHRpY2FzdCBhZGRyZXNzIDgwMi4xZCAocGcgNTEpLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKaW5kZXggMTBlZGEzYy4uMTkzMDhlMyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwppbmRleCBiZjJhMzMzLi41NDQ5Mjk0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKQEAgLTEwMiwxNiArMTAyLDE1IEBACiAJdW5zaWduZWQgaW50IG47CiAKIAluID0gbWF4KHNpemUsIG5sYnVmc2l6KTsKLQlza2IgPSBhbGxvY19za2IobiwgR0ZQX0FUT01JQyk7CisJc2tiID0gYWxsb2Nfc2tiKG4sIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4pOwogCWlmICghc2tiKSB7Ci0JCXByX2RlYnVnKCJjYW5ub3QgYWxsb2Mgd2hvbGUgYnVmZmVyIG9mIHNpemUgJXViIVxuIiwgbik7CiAJCWlmIChuID4gc2l6ZSkgewogCQkJLyogdHJ5IHRvIGFsbG9jYXRlIG9ubHkgYXMgbXVjaCBhcyB3ZSBuZWVkIGZvcgogCQkJICogY3VycmVudCBwYWNrZXQgKi8KIAkJCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghc2tiKQotCQkJCXByX2RlYnVnKCJjYW5ub3QgZXZlbiBhbGxvY2F0ZSAiCi0JCQkJCSAiYnVmZmVyIG9mIHNpemUgJXViXG4iLCBzaXplKTsKKwkJCQlwcl9kZWJ1ZygiY2Fubm90IGV2ZW4gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgJXViXG4iLAorCQkJCQkgc2l6ZSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NhaWZfZGV2LmMgYi9uZXQvY2FpZi9jYWlmX2Rldi5jCmluZGV4IDQ3ZmM4ZjMuLmYxZmExZjYgMTAwNjQ0Ci0tLSBhL25ldC9jYWlmL2NhaWZfZGV2LmMKKysrIGIvbmV0L2NhaWYvY2FpZl9kZXYuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmcGt0X3NrYnVmZi5jIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKaW5kZXggNzVkNGJmYS4uZGYwOGM0NyAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKKysrIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NmcGt0Lmg+CiAKICNkZWZpbmUgUEtUX1BSRUZJWCAgNDgKZGlmZiAtLWdpdCBhL25ldC9jZXBoL0tjb25maWcgYi9uZXQvY2VwaC9LY29uZmlnCmluZGV4IGJlNjgzZjIuLmNjMDRkZDYgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL0tjb25maWcKKysrIGIvbmV0L2NlcGgvS2NvbmZpZwpAQCAtMjcsMyArMjcsMTcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIENFUEhfTElCX1VTRV9ETlNfUkVTT0xWRVIKKwlib29sICJVc2UgaW4ta2VybmVsIHN1cHBvcnQgZm9yIEROUyBsb29rdXAiCisJZGVwZW5kcyBvbiBDRVBIX0xJQgorCXNlbGVjdCBETlNfUkVTT0xWRVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaG9zdG5hbWVzIChlLmcuIG1vbml0b3IgYWRkcmVzc2VzKSB3aWxsCisJICBiZSByZXNvbHZlZCB1c2luZyB0aGUgQ09ORklHX0ROU19SRVNPTFZFUiBmYWNpbGl0eS4KKworCSAgRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgQ09ORklHX0ROU19SRVNPTFZFUiBjb25zdWx0CisJICBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZG5zX3Jlc29sdmVyLnR4dAorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvY2VwaC9jZXBoX2NvbW1vbi5jIGIvbmV0L2NlcGgvY2VwaF9jb21tb24uYwppbmRleCAyODgzZWEwLi45N2Y3MGU1IDEwMDY0NAotLS0gYS9uZXQvY2VwaC9jZXBoX2NvbW1vbi5jCisrKyBiL25ldC9jZXBoL2NlcGhfY29tbW9uLmMKQEAgLTQzMiw5ICs0MzIsMTIgQEAKIC8qCiAgKiBjcmVhdGUgYSBmcmVzaCBjbGllbnQgaW5zdGFuY2UKICAqLwotc3RydWN0IGNlcGhfY2xpZW50ICpjZXBoX2NyZWF0ZV9jbGllbnQoc3RydWN0IGNlcGhfb3B0aW9ucyAqb3B0LCB2b2lkICpwcml2YXRlKQorc3RydWN0IGNlcGhfY2xpZW50ICpjZXBoX2NyZWF0ZV9jbGllbnQoc3RydWN0IGNlcGhfb3B0aW9ucyAqb3B0LCB2b2lkICpwcml2YXRlLAorCQkJCSAgICAgICB1bnNpZ25lZCBzdXBwb3J0ZWRfZmVhdHVyZXMsCisJCQkJICAgICAgIHVuc2lnbmVkIHJlcXVpcmVkX2ZlYXR1cmVzKQogewogCXN0cnVjdCBjZXBoX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBjZXBoX2VudGl0eV9hZGRyICpteWFkZHIgPSBOVUxMOwogCWludCBlcnIgPSAtRU5PTUVNOwogCiAJY2xpZW50ID0ga3phbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOwpAQCAtNDQ5LDE1ICs0NTIsMjcgQEAKIAljbGllbnQtPmF1dGhfZXJyID0gMDsKIAogCWNsaWVudC0+ZXh0cmFfbW9uX2Rpc3BhdGNoID0gTlVMTDsKLQljbGllbnQtPnN1cHBvcnRlZF9mZWF0dXJlcyA9IENFUEhfRkVBVFVSRV9TVVBQT1JURURfREVGQVVMVDsKLQljbGllbnQtPnJlcXVpcmVkX2ZlYXR1cmVzID0gQ0VQSF9GRUFUVVJFX1JFUVVJUkVEX0RFRkFVTFQ7CisJY2xpZW50LT5zdXBwb3J0ZWRfZmVhdHVyZXMgPSBDRVBIX0ZFQVRVUkVfU1VQUE9SVEVEX0RFRkFVTFQgfAorCQlzdXBwb3J0ZWRfZmVhdHVyZXM7CisJY2xpZW50LT5yZXF1aXJlZF9mZWF0dXJlcyA9IENFUEhfRkVBVFVSRV9SRVFVSVJFRF9ERUZBVUxUIHwKKwkJcmVxdWlyZWRfZmVhdHVyZXM7CiAKLQljbGllbnQtPm1zZ3IgPSBOVUxMOworCS8qIG1zZ3IgKi8KKwlpZiAoY2VwaF90ZXN0X29wdChjbGllbnQsIE1ZSVApKQorCQlteWFkZHIgPSAmY2xpZW50LT5vcHRpb25zLT5teV9hZGRyOworCWNsaWVudC0+bXNnciA9IGNlcGhfbWVzc2VuZ2VyX2NyZWF0ZShteWFkZHIsCisJCQkJCSAgICAgY2xpZW50LT5zdXBwb3J0ZWRfZmVhdHVyZXMsCisJCQkJCSAgICAgY2xpZW50LT5yZXF1aXJlZF9mZWF0dXJlcyk7CisJaWYgKElTX0VSUihjbGllbnQtPm1zZ3IpKSB7CisJCWVyciA9IFBUUl9FUlIoY2xpZW50LT5tc2dyKTsKKwkJZ290byBmYWlsOworCX0KKwljbGllbnQtPm1zZ3ItPm5vY3JjID0gY2VwaF90ZXN0X29wdChjbGllbnQsIE5PQ1JDKTsKIAogCS8qIHN1YnN5c3RlbXMgKi8KIAllcnIgPSBjZXBoX21vbmNfaW5pdCgmY2xpZW50LT5tb25jLCBjbGllbnQpOwogCWlmIChlcnIgPCAwKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbF9tc2dyOwogCWVyciA9IGNlcGhfb3NkY19pbml0KCZjbGllbnQtPm9zZGMsIGNsaWVudCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZmFpbF9tb25jOwpAQCAtNDY2LDYgKzQ4MSw4IEBACiAKIGZhaWxfbW9uYzoKIAljZXBoX21vbmNfc3RvcCgmY2xpZW50LT5tb25jKTsKK2ZhaWxfbXNncjoKKwljZXBoX21lc3Nlbmdlcl9kZXN0cm95KGNsaWVudC0+bXNncik7CiBmYWlsOgogCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTQ5MCw4ICs1MDcsNyBAQAogCiAJY2VwaF9kZWJ1Z2ZzX2NsaWVudF9jbGVhbnVwKGNsaWVudCk7CiAKLQlpZiAoY2xpZW50LT5tc2dyKQotCQljZXBoX21lc3Nlbmdlcl9kZXN0cm95KGNsaWVudC0+bXNncik7CisJY2VwaF9tZXNzZW5nZXJfZGVzdHJveShjbGllbnQtPm1zZ3IpOwogCiAJY2VwaF9kZXN0cm95X29wdGlvbnMoY2xpZW50LT5vcHRpb25zKTsKIApAQCAtNTE0LDI0ICs1MzAsOSBAQAogICovCiBpbnQgX19jZXBoX29wZW5fc2Vzc2lvbihzdHJ1Y3QgY2VwaF9jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgbG9uZyBzdGFydGVkKQogewotCXN0cnVjdCBjZXBoX2VudGl0eV9hZGRyICpteWFkZHIgPSBOVUxMOwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gY2xpZW50LT5vcHRpb25zLT5tb3VudF90aW1lb3V0ICogSFo7CiAKLQkvKiBpbml0aWFsaXplIHRoZSBtZXNzZW5nZXIgKi8KLQlpZiAoY2xpZW50LT5tc2dyID09IE5VTEwpIHsKLQkJaWYgKGNlcGhfdGVzdF9vcHQoY2xpZW50LCBNWUlQKSkKLQkJCW15YWRkciA9ICZjbGllbnQtPm9wdGlvbnMtPm15X2FkZHI7Ci0JCWNsaWVudC0+bXNnciA9IGNlcGhfbWVzc2VuZ2VyX2NyZWF0ZShteWFkZHIsCi0JCQkJCWNsaWVudC0+c3VwcG9ydGVkX2ZlYXR1cmVzLAotCQkJCQljbGllbnQtPnJlcXVpcmVkX2ZlYXR1cmVzKTsKLQkJaWYgKElTX0VSUihjbGllbnQtPm1zZ3IpKSB7Ci0JCQljbGllbnQtPm1zZ3IgPSBOVUxMOwotCQkJcmV0dXJuIFBUUl9FUlIoY2xpZW50LT5tc2dyKTsKLQkJfQotCQljbGllbnQtPm1zZ3ItPm5vY3JjID0gY2VwaF90ZXN0X29wdChjbGllbnQsIE5PQ1JDKTsKLQl9Ci0KIAkvKiBvcGVuIHNlc3Npb24sIGFuZCB3YWl0IGZvciBtb24gYW5kIG9zZCBtYXBzICovCiAJZXJyID0gY2VwaF9tb25jX29wZW5fc2Vzc2lvbigmY2xpZW50LT5tb25jKTsKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9jZXBoL21lc3Nlbmdlci5jIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKaW5kZXggOTkxOGU5ZS4uYWQ1YjcwOCAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKKysrIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKQEAgLTExLDEyICsxMSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Ruc19yZXNvbHZlci5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NlcGgvbGliY2VwaC5oPgogI2luY2x1ZGUgPGxpbnV4L2NlcGgvbWVzc2VuZ2VyLmg+CiAjaW5jbHVkZSA8bGludXgvY2VwaC9kZWNvZGUuaD4KICNpbmNsdWRlIDxsaW51eC9jZXBoL3BhZ2VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qCiAgKiBDZXBoIHVzZXMgdGhlIG1lc3NlbmdlciB0byBleGNoYW5nZSBjZXBoX21zZyBtZXNzYWdlcyB3aXRoIG90aGVyCkBAIC0xMDc4LDYgKzEwODAsMTAxIEBACiB9CiAKIC8qCisgKiBVbmxpa2Ugb3RoZXIgKl9wdG9uIGZ1bmN0aW9uIHNlbWFudGljcywgemVybyBpbmRpY2F0ZXMgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBjZXBoX3B0b24oY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MsCisJCWNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKippcGVuZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNCA9ICh2b2lkICopc3M7CisJc3RydWN0IHNvY2thZGRyX2luNiAqaW42ID0gKHZvaWQgKilzczsKKworCW1lbXNldChzcywgMCwgc2l6ZW9mKCpzcykpOworCisJaWYgKGluNF9wdG9uKHN0ciwgbGVuLCAodTggKikmaW40LT5zaW5fYWRkci5zX2FkZHIsIGRlbGltLCBpcGVuZCkpIHsKKwkJc3MtPnNzX2ZhbWlseSA9IEFGX0lORVQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbjZfcHRvbihzdHIsIGxlbiwgKHU4ICopJmluNi0+c2luNl9hZGRyLnM2X2FkZHIsIGRlbGltLCBpcGVuZCkpIHsKKwkJc3MtPnNzX2ZhbWlseSA9IEFGX0lORVQ2OworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIEV4dHJhY3QgaG9zdG5hbWUgc3RyaW5nIGFuZCByZXNvbHZlIHVzaW5nIGtlcm5lbCBETlMgZmFjaWxpdHkuCisgKi8KKyNpZmRlZiBDT05GSUdfQ0VQSF9MSUJfVVNFX0ROU19SRVNPTFZFUgorc3RhdGljIGludCBjZXBoX2Ruc19yZXNvbHZlX25hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzcywgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmlwZW5kKQoreworCWNvbnN0IGNoYXIgKmVuZCwgKmRlbGltX3A7CisJY2hhciAqY29sb25fcCwgKmlwX2FkZHIgPSBOVUxMOworCWludCBpcF9sZW4sIHJldDsKKworCS8qCisJICogVGhlIGVuZCBvZiB0aGUgaG9zdG5hbWUgb2NjdXJzIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgZGVsaW1pdGVyIG9yCisJICogdGhlIHBvcnQgbWFya2VyICgnOicpIHdoZXJlIHRoZSBkZWxpbWl0ZXIgdGFrZXMgcHJlY2VkZW5jZS4KKwkgKi8KKwlkZWxpbV9wID0gbWVtY2hyKG5hbWUsIGRlbGltLCBuYW1lbGVuKTsKKwljb2xvbl9wID0gbWVtY2hyKG5hbWUsICc6JywgbmFtZWxlbik7CisKKwlpZiAoZGVsaW1fcCAmJiBjb2xvbl9wKQorCQllbmQgPSBkZWxpbV9wIDwgY29sb25fcCA/IGRlbGltX3AgOiBjb2xvbl9wOworCWVsc2UgaWYgKCFkZWxpbV9wICYmIGNvbG9uX3ApCisJCWVuZCA9IGNvbG9uX3A7CisJZWxzZSB7CisJCWVuZCA9IGRlbGltX3A7CisJCWlmICghZW5kKSAvKiBjYXNlOiBob3N0bmFtZTovICovCisJCQllbmQgPSBuYW1lICsgbmFtZWxlbjsKKwl9CisKKwlpZiAoZW5kIDw9IG5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZG8gZG5zX3Jlc29sdmUgdXBjYWxsICovCisJaXBfbGVuID0gZG5zX3F1ZXJ5KE5VTEwsIG5hbWUsIGVuZCAtIG5hbWUsIE5VTEwsICZpcF9hZGRyLCBOVUxMKTsKKwlpZiAoaXBfbGVuID4gMCkKKwkJcmV0ID0gY2VwaF9wdG9uKGlwX2FkZHIsIGlwX2xlbiwgc3MsIC0xLCBOVUxMKTsKKwllbHNlCisJCXJldCA9IC1FU1JDSDsKKworCWtmcmVlKGlwX2FkZHIpOworCisJKmlwZW5kID0gZW5kOworCisJcHJfaW5mbygicmVzb2x2ZSAnJS4qcycgKHJldD0lZCk6ICVzXG4iLCAoaW50KShlbmQgLSBuYW1lKSwgbmFtZSwKKwkJCXJldCwgcmV0ID8gImZhaWxlZCIgOiBjZXBoX3ByX2FkZHIoc3MpKTsKKworCXJldHVybiByZXQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY2VwaF9kbnNfcmVzb2x2ZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MsIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKippcGVuZCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZgorCisvKgorICogUGFyc2UgYSBzZXJ2ZXIgbmFtZSAoSVAgb3IgaG9zdG5hbWUpLiBJZiBhIHZhbGlkIElQIGFkZHJlc3MgaXMgbm90IGZvdW5kCisgKiB0aGVuIHRyeSB0byBleHRyYWN0IGEgaG9zdG5hbWUgdG8gcmVzb2x2ZSB1c2luZyB1c2Vyc3BhY2UgRE5TIHVwY2FsbC4KKyAqLworc3RhdGljIGludCBjZXBoX3BhcnNlX3NlcnZlcl9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQkJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNzLCBjaGFyIGRlbGltLCBjb25zdCBjaGFyICoqaXBlbmQpCit7CisJaW50IHJldDsKKworCXJldCA9IGNlcGhfcHRvbihuYW1lLCBuYW1lbGVuLCBzcywgZGVsaW0sIGlwZW5kKTsKKwlpZiAocmV0KQorCQlyZXQgPSBjZXBoX2Ruc19yZXNvbHZlX25hbWUobmFtZSwgbmFtZWxlbiwgc3MsIGRlbGltLCBpcGVuZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogUGFyc2UgYW4gaXBbOnBvcnRdIGxpc3QgaW50byBhbiBhZGRyIGFycmF5LiAgVXNlIHRoZSBkZWZhdWx0CiAgKiBtb25pdG9yIHBvcnQgaWYgYSBwb3J0IGlzbid0IHNwZWNpZmllZC4KICAqLwpAQCAtMTA4NSwxNSArMTE4MiwxMyBAQAogCQkgICBzdHJ1Y3QgY2VwaF9lbnRpdHlfYWRkciAqYWRkciwKIAkJICAgaW50IG1heF9jb3VudCwgaW50ICpjb3VudCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0ID0gLUVJTlZBTDsKIAljb25zdCBjaGFyICpwID0gYzsKIAogCWRvdXQoInBhcnNlX2lwcyBvbiAnJS4qcydcbiIsIChpbnQpKGVuZC1jKSwgYyk7CiAJZm9yIChpID0gMDsgaSA8IG1heF9jb3VudDsgaSsrKSB7CiAJCWNvbnN0IGNoYXIgKmlwZW5kOwogCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc3MgPSAmYWRkcltpXS5pbl9hZGRyOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNCA9ICh2b2lkICopc3M7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNiA9ICh2b2lkICopc3M7CiAJCWludCBwb3J0OwogCQljaGFyIGRlbGltID0gJywnOwogCkBAIC0xMTAyLDE1ICsxMTk3LDExIEBACiAJCQlwKys7CiAJCX0KIAotCQltZW1zZXQoc3MsIDAsIHNpemVvZigqc3MpKTsKLQkJaWYgKGluNF9wdG9uKHAsIGVuZCAtIHAsICh1OCAqKSZpbjQtPnNpbl9hZGRyLnNfYWRkciwKLQkJCSAgICAgZGVsaW0sICZpcGVuZCkpCi0JCQlzcy0+c3NfZmFtaWx5ID0gQUZfSU5FVDsKLQkJZWxzZSBpZiAoaW42X3B0b24ocCwgZW5kIC0gcCwgKHU4ICopJmluNi0+c2luNl9hZGRyLnM2X2FkZHIsCi0JCQkJICBkZWxpbSwgJmlwZW5kKSkKLQkJCXNzLT5zc19mYW1pbHkgPSBBRl9JTkVUNjsKLQkJZWxzZQorCQlyZXQgPSBjZXBoX3BhcnNlX3NlcnZlcl9uYW1lKHAsIGVuZCAtIHAsIHNzLCBkZWxpbSwgJmlwZW5kKTsKKwkJaWYgKHJldCkKIAkJCWdvdG8gYmFkOworCQlyZXQgPSAtRUlOVkFMOworCiAJCXAgPSBpcGVuZDsKIAogCQlpZiAoZGVsaW0gPT0gJ10nKSB7CkBAIC0xMTU1LDcgKzEyNDYsNyBAQAogCiBiYWQ6CiAJcHJfZXJyKCJwYXJzZV9pcHMgYmFkIGlwICclLipzJ1xuIiwgKGludCkoZW5kIC0gYyksIGMpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNlcGhfcGFyc2VfaXBzKTsKIApAQCAtMjI4MSw3ICsyMzcyLDggQEAKICAqIGNvbnN0cnVjdCBhIG5ldyBtZXNzYWdlIHdpdGggZ2l2ZW4gdHlwZSwgc2l6ZQogICogdGhlIG5ldyBtc2cgaGFzIGEgcmVmIGNvdW50IG9mIDEuCiAgKi8KLXN0cnVjdCBjZXBoX21zZyAqY2VwaF9tc2dfbmV3KGludCB0eXBlLCBpbnQgZnJvbnRfbGVuLCBnZnBfdCBmbGFncykKK3N0cnVjdCBjZXBoX21zZyAqY2VwaF9tc2dfbmV3KGludCB0eXBlLCBpbnQgZnJvbnRfbGVuLCBnZnBfdCBmbGFncywKKwkJCSAgICAgIGJvb2wgY2FuX2ZhaWwpCiB7CiAJc3RydWN0IGNlcGhfbXNnICptOwogCkBAIC0yMzMzLDcgKzI0MjUsNyBAQAogCQkJbS0+ZnJvbnQuaW92X2Jhc2UgPSBrbWFsbG9jKGZyb250X2xlbiwgZmxhZ3MpOwogCQl9CiAJCWlmIChtLT5mcm9udC5pb3ZfYmFzZSA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIm1zZ19uZXcgY2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXNcbiIsCisJCQlkb3V0KCJjZXBoX21zZ19uZXcgY2FuJ3QgYWxsb2NhdGUgJWQgYnl0ZXNcbiIsCiAJCQkgICAgIGZyb250X2xlbik7CiAJCQlnb3RvIG91dDI7CiAJCX0KQEAgLTIzNDgsNyArMjQ0MCwxNCBAQAogb3V0MjoKIAljZXBoX21zZ19wdXQobSk7CiBvdXQ6Ci0JcHJfZXJyKCJtc2dfbmV3IGNhbid0IGNyZWF0ZSB0eXBlICVkIGZyb250ICVkXG4iLCB0eXBlLCBmcm9udF9sZW4pOworCWlmICghY2FuX2ZhaWwpIHsKKwkJcHJfZXJyKCJtc2dfbmV3IGNhbid0IGNyZWF0ZSB0eXBlICVkIGZyb250ICVkXG4iLCB0eXBlLAorCQkgICAgICAgZnJvbnRfbGVuKTsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UgeworCQlkb3V0KCJtc2dfbmV3IGNhbid0IGNyZWF0ZSB0eXBlICVkIGZyb250ICVkXG4iLCB0eXBlLAorCQkgICAgIGZyb250X2xlbik7CisJfQogCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChjZXBoX21zZ19uZXcpOwpAQCAtMjM5OCw3ICsyNDk3LDcgQEAKIAl9CiAJaWYgKCFtc2cpIHsKIAkJKnNraXAgPSAwOwotCQltc2cgPSBjZXBoX21zZ19uZXcodHlwZSwgZnJvbnRfbGVuLCBHRlBfTk9GUyk7CisJCW1zZyA9IGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udF9sZW4sIEdGUF9OT0ZTLCBmYWxzZSk7CiAJCWlmICghbXNnKSB7CiAJCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtc2cgdHlwZSAlZCBsZW4gJWRcbiIsCiAJCQkgICAgICAgdHlwZSwgZnJvbnRfbGVuKTsKZGlmZiAtLWdpdCBhL25ldC9jZXBoL21vbl9jbGllbnQuYyBiL25ldC9jZXBoL21vbl9jbGllbnQuYwppbmRleCBjYmUzMWZhLi4wYjYyZGVhIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9tb25fY2xpZW50LmMKKysrIGIvbmV0L2NlcGgvbW9uX2NsaWVudC5jCkBAIC0xMTYsMTQgKzExNiwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBfX2Nsb3NlX3Nlc3Npb24oc3RydWN0IGNlcGhfbW9uX2NsaWVudCAqbW9uYykKIHsKLQlpZiAobW9uYy0+Y29uKSB7Ci0JCWRvdXQoIl9fY2xvc2Vfc2Vzc2lvbiBjbG9zaW5nIG1vbiVkXG4iLCBtb25jLT5jdXJfbW9uKTsKLQkJY2VwaF9jb25fcmV2b2tlKG1vbmMtPmNvbiwgbW9uYy0+bV9hdXRoKTsKLQkJY2VwaF9jb25fY2xvc2UobW9uYy0+Y29uKTsKLQkJbW9uYy0+Y3VyX21vbiA9IC0xOwotCQltb25jLT5wZW5kaW5nX2F1dGggPSAwOwotCQljZXBoX2F1dGhfcmVzZXQobW9uYy0+YXV0aCk7Ci0JfQorCWRvdXQoIl9fY2xvc2Vfc2Vzc2lvbiBjbG9zaW5nIG1vbiVkXG4iLCBtb25jLT5jdXJfbW9uKTsKKwljZXBoX2Nvbl9yZXZva2UobW9uYy0+Y29uLCBtb25jLT5tX2F1dGgpOworCWNlcGhfY29uX2Nsb3NlKG1vbmMtPmNvbik7CisJbW9uYy0+Y3VyX21vbiA9IC0xOworCW1vbmMtPnBlbmRpbmdfYXV0aCA9IDA7CisJY2VwaF9hdXRoX3Jlc2V0KG1vbmMtPmF1dGgpOwogfQogCiAvKgpAQCAtMzAyLDE1ICszMDAsNiBAQAogICovCiBpbnQgY2VwaF9tb25jX29wZW5fc2Vzc2lvbihzdHJ1Y3QgY2VwaF9tb25fY2xpZW50ICptb25jKQogewotCWlmICghbW9uYy0+Y29uKSB7Ci0JCW1vbmMtPmNvbiA9IGttYWxsb2Moc2l6ZW9mKCptb25jLT5jb24pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtb25jLT5jb24pCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJY2VwaF9jb25faW5pdChtb25jLT5jbGllbnQtPm1zZ3IsIG1vbmMtPmNvbik7Ci0JCW1vbmMtPmNvbi0+cHJpdmF0ZSA9IG1vbmM7Ci0JCW1vbmMtPmNvbi0+b3BzID0gJm1vbl9jb25fb3BzOwotCX0KLQogCW11dGV4X2xvY2soJm1vbmMtPm11dGV4KTsKIAlfX29wZW5fc2Vzc2lvbihtb25jKTsKIAlfX3NjaGVkdWxlX2RlbGF5ZWQobW9uYyk7CkBAIC01MjgsMTAgKzUxNywxMiBAQAogCWluaXRfY29tcGxldGlvbigmcmVxLT5jb21wbGV0aW9uKTsKIAogCWVyciA9IC1FTk9NRU07Ci0JcmVxLT5yZXF1ZXN0ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1NUQVRGUywgc2l6ZW9mKCpoKSwgR0ZQX05PRlMpOworCXJlcS0+cmVxdWVzdCA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19TVEFURlMsIHNpemVvZigqaCksIEdGUF9OT0ZTLAorCQkJCSAgICB0cnVlKTsKIAlpZiAoIXJlcS0+cmVxdWVzdCkKIAkJZ290byBvdXQ7Ci0JcmVxLT5yZXBseSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19TVEFURlNfUkVQTFksIDEwMjQsIEdGUF9OT0ZTKTsKKwlyZXEtPnJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1NUQVRGU19SRVBMWSwgMTAyNCwgR0ZQX05PRlMsCisJCQkJICB0cnVlKTsKIAlpZiAoIXJlcS0+cmVwbHkpCiAJCWdvdG8gb3V0OwogCkBAIC02MjYsMTAgKzYxNywxMiBAQAogCWluaXRfY29tcGxldGlvbigmcmVxLT5jb21wbGV0aW9uKTsKIAogCWVyciA9IC1FTk9NRU07Ci0JcmVxLT5yZXF1ZXN0ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1BPT0xPUCwgc2l6ZW9mKCpoKSwgR0ZQX05PRlMpOworCXJlcS0+cmVxdWVzdCA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19QT09MT1AsIHNpemVvZigqaCksIEdGUF9OT0ZTLAorCQkJCSAgICB0cnVlKTsKIAlpZiAoIXJlcS0+cmVxdWVzdCkKIAkJZ290byBvdXQ7Ci0JcmVxLT5yZXBseSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19QT09MT1BfUkVQTFksIDEwMjQsIEdGUF9OT0ZTKTsKKwlyZXEtPnJlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX1BPT0xPUF9SRVBMWSwgMTAyNCwgR0ZQX05PRlMsCisJCQkJICB0cnVlKTsKIAlpZiAoIXJlcS0+cmVwbHkpCiAJCWdvdG8gb3V0OwogCkBAIC03NTUsMTMgKzc0OCwyMSBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JbW9uYy0+Y29uID0gTlVMTDsKKwkvKiBjb25uZWN0aW9uICovCisJbW9uYy0+Y29uID0ga21hbGxvYyhzaXplb2YoKm1vbmMtPmNvbiksIEdGUF9LRVJORUwpOworCWlmICghbW9uYy0+Y29uKQorCQlnb3RvIG91dF9tb25tYXA7CisJY2VwaF9jb25faW5pdChtb25jLT5jbGllbnQtPm1zZ3IsIG1vbmMtPmNvbik7CisJbW9uYy0+Y29uLT5wcml2YXRlID0gbW9uYzsKKwltb25jLT5jb24tPm9wcyA9ICZtb25fY29uX29wczsKIAogCS8qIGF1dGhlbnRpY2F0aW9uICovCiAJbW9uYy0+YXV0aCA9IGNlcGhfYXV0aF9pbml0KGNsLT5vcHRpb25zLT5uYW1lLAogCQkJCSAgICBjbC0+b3B0aW9ucy0+a2V5KTsKLQlpZiAoSVNfRVJSKG1vbmMtPmF1dGgpKQotCQlyZXR1cm4gUFRSX0VSUihtb25jLT5hdXRoKTsKKwlpZiAoSVNfRVJSKG1vbmMtPmF1dGgpKSB7CisJCWVyciA9IFBUUl9FUlIobW9uYy0+YXV0aCk7CisJCWdvdG8gb3V0X2NvbjsKKwl9CiAJbW9uYy0+YXV0aC0+d2FudF9rZXlzID0KIAkJQ0VQSF9FTlRJVFlfVFlQRV9BVVRIIHwgQ0VQSF9FTlRJVFlfVFlQRV9NT04gfAogCQlDRVBIX0VOVElUWV9UWVBFX09TRCB8IENFUEhfRU5USVRZX1RZUEVfTURTOwpAQCAtNzcwLDE5ICs3NzEsMjEgQEAKIAllcnIgPSAtRU5PTUVNOwogCW1vbmMtPm1fc3Vic2NyaWJlX2FjayA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19NT05fU1VCU0NSSUJFX0FDSywKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3QgY2VwaF9tb25fc3Vic2NyaWJlX2FjayksCi0JCQkJICAgICBHRlBfTk9GUyk7CisJCQkJICAgICBHRlBfTk9GUywgdHJ1ZSk7CiAJaWYgKCFtb25jLT5tX3N1YnNjcmliZV9hY2spCi0JCWdvdG8gb3V0X21vbm1hcDsKKwkJZ290byBvdXRfYXV0aDsKIAotCW1vbmMtPm1fc3Vic2NyaWJlID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX01PTl9TVUJTQ1JJQkUsIDk2LCBHRlBfTk9GUyk7CisJbW9uYy0+bV9zdWJzY3JpYmUgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfTU9OX1NVQlNDUklCRSwgOTYsIEdGUF9OT0ZTLAorCQkJCQkgdHJ1ZSk7CiAJaWYgKCFtb25jLT5tX3N1YnNjcmliZSkKIAkJZ290byBvdXRfc3Vic2NyaWJlX2FjazsKIAotCW1vbmMtPm1fYXV0aF9yZXBseSA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19BVVRIX1JFUExZLCA0MDk2LCBHRlBfTk9GUyk7CisJbW9uYy0+bV9hdXRoX3JlcGx5ID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX0FVVEhfUkVQTFksIDQwOTYsIEdGUF9OT0ZTLAorCQkJCQkgIHRydWUpOwogCWlmICghbW9uYy0+bV9hdXRoX3JlcGx5KQogCQlnb3RvIG91dF9zdWJzY3JpYmU7CiAKLQltb25jLT5tX2F1dGggPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfQVVUSCwgNDA5NiwgR0ZQX05PRlMpOworCW1vbmMtPm1fYXV0aCA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19BVVRILCA0MDk2LCBHRlBfTk9GUywgdHJ1ZSk7CiAJbW9uYy0+cGVuZGluZ19hdXRoID0gMDsKIAlpZiAoIW1vbmMtPm1fYXV0aCkKIAkJZ290byBvdXRfYXV0aF9yZXBseTsKQEAgLTgwOCw2ICs4MTEsMTAgQEAKIAljZXBoX21zZ19wdXQobW9uYy0+bV9zdWJzY3JpYmUpOwogb3V0X3N1YnNjcmliZV9hY2s6CiAJY2VwaF9tc2dfcHV0KG1vbmMtPm1fc3Vic2NyaWJlX2Fjayk7CitvdXRfYXV0aDoKKwljZXBoX2F1dGhfZGVzdHJveShtb25jLT5hdXRoKTsKK291dF9jb246CisJbW9uYy0+Y29uLT5vcHMtPnB1dChtb25jLT5jb24pOwogb3V0X21vbm1hcDoKIAlrZnJlZShtb25jLT5tb25tYXApOwogb3V0OgpAQCAtODIyLDExICs4MjksMTEgQEAKIAogCW11dGV4X2xvY2soJm1vbmMtPm11dGV4KTsKIAlfX2Nsb3NlX3Nlc3Npb24obW9uYyk7Ci0JaWYgKG1vbmMtPmNvbikgewotCQltb25jLT5jb24tPnByaXZhdGUgPSBOVUxMOwotCQltb25jLT5jb24tPm9wcy0+cHV0KG1vbmMtPmNvbik7Ci0JCW1vbmMtPmNvbiA9IE5VTEw7Ci0JfQorCisJbW9uYy0+Y29uLT5wcml2YXRlID0gTlVMTDsKKwltb25jLT5jb24tPm9wcy0+cHV0KG1vbmMtPmNvbik7CisJbW9uYy0+Y29uID0gTlVMTDsKKwogCW11dGV4X3VubG9jaygmbW9uYy0+bXV0ZXgpOwogCiAJY2VwaF9hdXRoX2Rlc3Ryb3kobW9uYy0+YXV0aCk7CkBAIC05NzMsNyArOTgwLDcgQEAKIAljYXNlIENFUEhfTVNHX01PTl9NQVA6CiAJY2FzZSBDRVBIX01TR19NRFNfTUFQOgogCWNhc2UgQ0VQSF9NU0dfT1NEX01BUDoKLQkJbSA9IGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udF9sZW4sIEdGUF9OT0ZTKTsKKwkJbSA9IGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udF9sZW4sIEdGUF9OT0ZTLCBmYWxzZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTAwMCw3ICsxMDA3LDcgQEAKIAlpZiAoIWNvbi0+cHJpdmF0ZSkKIAkJZ290byBvdXQ7CiAKLQlpZiAobW9uYy0+Y29uICYmICFtb25jLT5odW50aW5nKQorCWlmICghbW9uYy0+aHVudGluZykKIAkJcHJfaW5mbygibW9uJWQgJXMgc2Vzc2lvbiBsb3N0LCAiCiAJCQkiaHVudGluZyBmb3IgbmV3IG1vblxuIiwgbW9uYy0+Y3VyX21vbiwKIAkJCWNlcGhfcHJfYWRkcigmbW9uYy0+Y29uLT5wZWVyX2FkZHIuaW5fYWRkcikpOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvbXNncG9vbC5jIGIvbmV0L2NlcGgvbXNncG9vbC5jCmluZGV4IDFmNGNiMzAuLjExZDVmNDEgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL21zZ3Bvb2wuYworKysgYi9uZXQvY2VwaC9tc2dwb29sLmMKQEAgLTEyLDcgKzEyLDcgQEAKIAlzdHJ1Y3QgY2VwaF9tc2dwb29sICpwb29sID0gYXJnOwogCXN0cnVjdCBjZXBoX21zZyAqbXNnOwogCi0JbXNnID0gY2VwaF9tc2dfbmV3KDAsIHBvb2wtPmZyb250X2xlbiwgZ2ZwX21hc2spOworCW1zZyA9IGNlcGhfbXNnX25ldygwLCBwb29sLT5mcm9udF9sZW4sIGdmcF9tYXNrLCB0cnVlKTsKIAlpZiAoIW1zZykgewogCQlkb3V0KCJtc2dwb29sX2FsbG9jICVzIGZhaWxlZFxuIiwgcG9vbC0+bmFtZSk7CiAJfSBlbHNlIHsKQEAgLTYxLDcgKzYxLDcgQEAKIAkJV0FSTl9PTigxKTsKIAogCQkvKiB0cnkgdG8gYWxsb2MgYSBmcmVzaCBtZXNzYWdlICovCi0JCXJldHVybiBjZXBoX21zZ19uZXcoMCwgZnJvbnRfbGVuLCBHRlBfTk9GUyk7CisJCXJldHVybiBjZXBoX21zZ19uZXcoMCwgZnJvbnRfbGVuLCBHRlBfTk9GUywgZmFsc2UpOwogCX0KIAogCW1zZyA9IG1lbXBvb2xfYWxsb2MocG9vbC0+cG9vbCwgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvb3NkX2NsaWVudC5jIGIvbmV0L2NlcGgvb3NkX2NsaWVudC5jCmluZGV4IDg4YWQ4YTIuLjczM2U0NjAwIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9vc2RfY2xpZW50LmMKKysrIGIvbmV0L2NlcGgvb3NkX2NsaWVudC5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJbXNnID0gY2VwaF9tc2dwb29sX2dldCgmb3NkYy0+bXNncG9vbF9vcF9yZXBseSwgMCk7CiAJZWxzZQogCQltc2cgPSBjZXBoX21zZ19uZXcoQ0VQSF9NU0dfT1NEX09QUkVQTFksCi0JCQkJICAgT1NEX09QUkVQTFlfRlJPTlRfTEVOLCBnZnBfZmxhZ3MpOworCQkJCSAgIE9TRF9PUFJFUExZX0ZST05UX0xFTiwgZ2ZwX2ZsYWdzLCB0cnVlKTsKIAlpZiAoIW1zZykgewogCQljZXBoX29zZGNfcHV0X3JlcXVlc3QocmVxKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAlpZiAodXNlX21lbXBvb2wpCiAJCW1zZyA9IGNlcGhfbXNncG9vbF9nZXQoJm9zZGMtPm1zZ3Bvb2xfb3AsIDApOwogCWVsc2UKLQkJbXNnID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX09TRF9PUCwgbXNnX3NpemUsIGdmcF9mbGFncyk7CisJCW1zZyA9IGNlcGhfbXNnX25ldyhDRVBIX01TR19PU0RfT1AsIG1zZ19zaXplLCBnZnBfZmxhZ3MsIHRydWUpOwogCWlmICghbXNnKSB7CiAJCWNlcGhfb3NkY19wdXRfcmVxdWVzdChyZXEpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTk0Myw3ICs5NDMsNyBAQAogICogQ2FsbGVyIHNob3VsZCBob2xkIG1hcF9zZW0gZm9yIHJlYWQgYW5kIHJlcXVlc3RfbXV0ZXguCiAgKi8KIHN0YXRpYyBpbnQgX19tYXBfcmVxdWVzdChzdHJ1Y3QgY2VwaF9vc2RfY2xpZW50ICpvc2RjLAotCQkJIHN0cnVjdCBjZXBoX29zZF9yZXF1ZXN0ICpyZXEpCisJCQkgc3RydWN0IGNlcGhfb3NkX3JlcXVlc3QgKnJlcSwgaW50IGZvcmNlX3Jlc2VuZCkKIHsKIAlzdHJ1Y3QgY2VwaF9vc2RfcmVxdWVzdF9oZWFkICpyZXFoZWFkID0gcmVxLT5yX3JlcXVlc3QtPmZyb250Lmlvdl9iYXNlOwogCXN0cnVjdCBjZXBoX3BnIHBnaWQ7CkBAIC05NjcsNyArOTY3LDggQEAKIAkJbnVtID0gZXJyOwogCX0KIAotCWlmICgocmVxLT5yX29zZCAmJiByZXEtPnJfb3NkLT5vX29zZCA9PSBvICYmCisJaWYgKCghZm9yY2VfcmVzZW5kICYmCisJICAgICByZXEtPnJfb3NkICYmIHJlcS0+cl9vc2QtPm9fb3NkID09IG8gJiYKIAkgICAgIHJlcS0+cl9zZW50ID49IHJlcS0+cl9vc2QtPm9faW5jYXJuYXRpb24gJiYKIAkgICAgIHJlcS0+cl9udW1fcGdfb3NkcyA9PSBudW0gJiYKIAkgICAgIG1lbWNtcChyZXEtPnJfcGdfb3NkcywgYWN0aW5nLCBzaXplb2YoYWN0aW5nWzBdKSpudW0pID09IDApIHx8CkBAIC0xMjg5LDE4ICsxMjkwLDE4IEBACiAgKgogICogQ2FsbGVyIHNob3VsZCBob2xkIG1hcF9zZW0gZm9yIHJlYWQgYW5kIHJlcXVlc3RfbXV0ZXguCiAgKi8KLXN0YXRpYyB2b2lkIGtpY2tfcmVxdWVzdHMoc3RydWN0IGNlcGhfb3NkX2NsaWVudCAqb3NkYykKK3N0YXRpYyB2b2lkIGtpY2tfcmVxdWVzdHMoc3RydWN0IGNlcGhfb3NkX2NsaWVudCAqb3NkYywgaW50IGZvcmNlX3Jlc2VuZCkKIHsKIAlzdHJ1Y3QgY2VwaF9vc2RfcmVxdWVzdCAqcmVxLCAqbnJlcTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAlpbnQgbmVlZG1hcCA9IDA7CiAJaW50IGVycjsKIAotCWRvdXQoImtpY2tfcmVxdWVzdHNcbiIpOworCWRvdXQoImtpY2tfcmVxdWVzdHMgJXNcbiIsIGZvcmNlX3Jlc2VuZCA/ICIgKGZvcmNlIHJlc2VuZCkiIDogIiIpOwogCW11dGV4X2xvY2soJm9zZGMtPnJlcXVlc3RfbXV0ZXgpOwogCWZvciAocCA9IHJiX2ZpcnN0KCZvc2RjLT5yZXF1ZXN0cyk7IHA7IHAgPSByYl9uZXh0KHApKSB7CiAJCXJlcSA9IHJiX2VudHJ5KHAsIHN0cnVjdCBjZXBoX29zZF9yZXF1ZXN0LCByX25vZGUpOwotCQllcnIgPSBfX21hcF9yZXF1ZXN0KG9zZGMsIHJlcSk7CisJCWVyciA9IF9fbWFwX3JlcXVlc3Qob3NkYywgcmVxLCBmb3JjZV9yZXNlbmQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWNvbnRpbnVlOyAgLyogZXJyb3IgKi8KIAkJaWYgKHJlcS0+cl9vc2QgPT0gTlVMTCkgewpAQCAtMTMxOCw3ICsxMzE5LDcgQEAKIAkJCQkgcl9saW5nZXJfaXRlbSkgewogCQlkb3V0KCJsaW5nZXIgcmVxPSVwIHJlcS0+cl9vc2Q9JXBcbiIsIHJlcSwgcmVxLT5yX29zZCk7CiAKLQkJZXJyID0gX19tYXBfcmVxdWVzdChvc2RjLCByZXEpOworCQllcnIgPSBfX21hcF9yZXF1ZXN0KG9zZGMsIHJlcSwgZm9yY2VfcmVzZW5kKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJY29udGludWU7ICAvKiBubyBjaGFuZ2UgYW5kIG5vIG9zZCB3YXMgc3BlY2lmaWVkICovCiAJCWlmIChlcnIgPCAwKQpAQCAtMTM5NSw3ICsxMzk2LDcgQEAKIAkJCQljZXBoX29zZG1hcF9kZXN0cm95KG9zZGMtPm9zZG1hcCk7CiAJCQkJb3NkYy0+b3NkbWFwID0gbmV3bWFwOwogCQkJfQotCQkJa2lja19yZXF1ZXN0cyhvc2RjKTsKKwkJCWtpY2tfcmVxdWVzdHMob3NkYywgMCk7CiAJCQlyZXNldF9jaGFuZ2VkX29zZHMob3NkYyk7CiAJCX0gZWxzZSB7CiAJCQlkb3V0KCJpZ25vcmluZyBpbmNyZW1lbnRhbCBtYXAgJXUgbGVuICVkXG4iLApAQCAtMTQyMyw2ICsxNDI0LDggQEAKIAkJCSAgICAgIm9sZGVyIHRoYW4gb3VyICV1XG4iLCBlcG9jaCwgbWFwbGVuLAogCQkJICAgICBvc2RjLT5vc2RtYXAtPmVwb2NoKTsKIAkJfSBlbHNlIHsKKwkJCWludCBza2lwcGVkX21hcCA9IDA7CisKIAkJCWRvdXQoInRha2luZyBmdWxsIG1hcCAldSBsZW4gJWRcbiIsIGVwb2NoLCBtYXBsZW4pOwogCQkJbmV3bWFwID0gb3NkbWFwX2RlY29kZSgmcCwgcCttYXBsZW4pOwogCQkJaWYgKElTX0VSUihuZXdtYXApKSB7CkBAIC0xNDMyLDkgKzE0MzUsMTIgQEAKIAkJCUJVR19PTighbmV3bWFwKTsKIAkJCW9sZG1hcCA9IG9zZGMtPm9zZG1hcDsKIAkJCW9zZGMtPm9zZG1hcCA9IG5ld21hcDsKLQkJCWlmIChvbGRtYXApCisJCQlpZiAob2xkbWFwKSB7CisJCQkJaWYgKG9sZG1hcC0+ZXBvY2ggKyAxIDwgbmV3bWFwLT5lcG9jaCkKKwkJCQkJc2tpcHBlZF9tYXAgPSAxOwogCQkJCWNlcGhfb3NkbWFwX2Rlc3Ryb3kob2xkbWFwKTsKLQkJCWtpY2tfcmVxdWVzdHMob3NkYyk7CisJCQl9CisJCQlraWNrX3JlcXVlc3RzKG9zZGMsIHNraXBwZWRfbWFwKTsKIAkJfQogCQlwICs9IG1hcGxlbjsKIAkJbnJfbWFwcy0tOwpAQCAtMTcwNyw3ICsxNzEzLDcgQEAKIAkgKiB0aGUgcmVxdWVzdCBzdGlsbCBoYW4ndCBiZWVuIHRvdWNoZWQgeWV0LgogCSAqLwogCWlmIChyZXEtPnJfc2VudCA9PSAwKSB7Ci0JCXJjID0gX19tYXBfcmVxdWVzdChvc2RjLCByZXEpOworCQlyYyA9IF9fbWFwX3JlcXVlc3Qob3NkYywgcmVxLCAwKTsKIAkJaWYgKHJjIDwgMCkgewogCQkJaWYgKG5vZmFpbCkgewogCQkJCWRvdXQoIm9zZGNfc3RhcnRfcmVxdWVzdCBmYWlsZWQgbWFwLCAiCkBAIC0yMDMyLDcgKzIwMzgsNyBAQAogCWlmIChmcm9udCA+IHJlcS0+cl9yZXBseS0+ZnJvbnQuaW92X2xlbikgewogCQlwcl93YXJuaW5nKCJnZXRfcmVwbHkgZnJvbnQgJWQgPiBwcmVhbGxvY2F0ZWQgJWRcbiIsCiAJCQkgICBmcm9udCwgKGludClyZXEtPnJfcmVwbHktPmZyb250Lmlvdl9sZW4pOwotCQltID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX09TRF9PUFJFUExZLCBmcm9udCwgR0ZQX05PRlMpOworCQltID0gY2VwaF9tc2dfbmV3KENFUEhfTVNHX09TRF9PUFJFUExZLCBmcm9udCwgR0ZQX05PRlMsIGZhbHNlKTsKIAkJaWYgKCFtKQogCQkJZ290byBvdXQ7CiAJCWNlcGhfbXNnX3B1dChyZXEtPnJfcmVwbHkpOwpAQCAtMjA4MCw3ICsyMDg2LDcgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIENFUEhfTVNHX09TRF9NQVA6CiAJY2FzZSBDRVBIX01TR19XQVRDSF9OT1RJRlk6Ci0JCXJldHVybiBjZXBoX21zZ19uZXcodHlwZSwgZnJvbnQsIEdGUF9OT0ZTKTsKKwkJcmV0dXJuIGNlcGhfbXNnX25ldyh0eXBlLCBmcm9udCwgR0ZQX05PRlMsIGZhbHNlKTsKIAljYXNlIENFUEhfTVNHX09TRF9PUFJFUExZOgogCQlyZXR1cm4gZ2V0X3JlcGx5KGNvbiwgaGRyLCBza2lwKTsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2NvbXBhdC5jIGIvbmV0L2NvbXBhdC5jCmluZGV4IGM1NzhkOTMuLjZkZWY5MGUgMTAwNjQ0Ci0tLSBhL25ldC9jb21wYXQuYworKysgYi9uZXQvY29tcGF0LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L3NjbS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jIGIvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYwppbmRleCAyODNkMWI4Li4yNzdmYWVmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jCisrKyBiL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKaW5kZXggNTdlOGY5NS4uYzAyZTYzYyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZWlnaGJvdXIuYyBiL25ldC9jb3JlL25laWdoYm91ci5jCmluZGV4IDkwOWVjYjMuLjAzOWQ1MWUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25laWdoYm91ci5jCisrKyBiL25ldC9jb3JlL25laWdoYm91ci5jCkBAIC04NzIsMTIgKzg3Miw4IEBACiAJbm93ID0gamlmZmllczsKIAluZXh0ID0gbm93ICsgSFo7CiAKLQlpZiAoIShzdGF0ZSAmIE5VRF9JTl9USU1FUikpIHsKLSNpZm5kZWYgQ09ORklHX1NNUAotCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZWlnaDogdGltZXIgJiAhbnVkX2luX3RpbWVyXG4iKTsKLSNlbmRpZgorCWlmICghKHN0YXRlICYgTlVEX0lOX1RJTUVSKSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaWYgKHN0YXRlICYgTlVEX1JFQUNIQUJMRSkgewogCQlpZiAodGltZV9iZWZvcmVfZXEobm93LApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMgYi9uZXQvY29yZS9uZXQtc3lzZnMuYwppbmRleCA3NjA0YTYzLi5jNzFjNDM0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXQtc3lzZnMuYworKysgYi9uZXQvY29yZS9uZXQtc3lzZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC93ZXh0Lmg+CiAKICNpbmNsdWRlICJuZXQtc3lzZnMuaCIKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC10cmFjZXMuYyBiL25ldC9jb3JlL25ldC10cmFjZXMuYwppbmRleCA1MjM4MGIxLi5iYTNjMDEyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXQtdHJhY2VzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXRyYWNlcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCmluZGV4IDViYmRiZjAuLmFlZmNkN2EgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYworKysgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldGV2ZW50LmMgYi9uZXQvY29yZS9uZXRldmVudC5jCmluZGV4IDg2NWYwY2UuLmYxN2NjZDIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldGV2ZW50LmMKKysrIGIvbmV0L2NvcmUvbmV0ZXZlbnQuYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KIAogc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKG5ldGV2ZW50X25vdGlmX2NoYWluKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBmNTdkOTQ2Li5jZjY0YzFmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDJmNmJhYmQuLjA2NDM4ZjkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0xODksNiArMTg5LDcgQEAKIAkgKiBhbGlnbmVkIG1lbW9yeSBibG9ja3MsIHVubGVzcyBTTFVCL1NMQUIgZGVidWcgaXMgZW5hYmxlZC4KIAkgKiBCb3RoIHNrYi0+aGVhZCBhbmQgc2tiX3NoYXJlZF9pbmZvIGFyZSBjYWNoZSBsaW5lIGFsaWduZWQuCiAJICovCisJc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKHNpemUpOwogCXNpemUgKz0gU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKIAlkYXRhID0ga21hbGxvY19ub2RlX3RyYWNrX2NhbGxlcihzaXplLCBnZnBfbWFzaywgbm9kZSk7CiAJaWYgKCFkYXRhKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdGltZXN0YW1waW5nLmMgYi9uZXQvY29yZS90aW1lc3RhbXBpbmcuYwppbmRleCA4MmZiMjg4Li42NjFiNWE0IDEwMDY0NAotLS0gYS9uZXQvY29yZS90aW1lc3RhbXBpbmcuYworKysgYi9uZXQvY29yZS90aW1lc3RhbXBpbmcuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cF9jbGFzc2lmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgc3RydWN0IHNvY2tfZmlsdGVyIHB0cF9maWx0ZXJbXSA9IHsKIAlQVFBfRklMVEVSCmRpZmYgLS1naXQgYS9uZXQvY29yZS91c2VyX2RtYS5jIGIvbmV0L2NvcmUvdXNlcl9kbWEuYwppbmRleCAyZDdjZjNkLi4xYjVmZWZkIDEwMDY0NAotLS0gYS9uZXQvY29yZS91c2VyX2RtYS5jCisrKyBiL25ldC9jb3JlL3VzZXJfZG1hLmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZG1hLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9kY2IvZGNiZXZlbnQuYyBiL25ldC9kY2IvZGNiZXZlbnQuYwppbmRleCA2NjVhODgwLi4xZDllYjdjIDEwMDY0NAotLS0gYS9uZXQvZGNiL2RjYmV2ZW50LmMKKysrIGIvbmV0L2RjYi9kY2JldmVudC5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdGF0aWMgQVRPTUlDX05PVElGSUVSX0hFQUQoZGNiZXZlbnRfbm90aWZfY2hhaW4pOwogCmRpZmYgLS1naXQgYS9uZXQvZGNiL2RjYm5sLmMgYi9uZXQvZGNiL2RjYm5sLmMKaW5kZXggOWJmYmMxZC4uZDg2MDUzMCAxMDA2NDQKLS0tIGEvbmV0L2RjYi9kY2JubC5jCisrKyBiL25ldC9kY2IvZGNibmwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RjYm5sLmg+CiAjaW5jbHVkZSA8bmV0L2RjYmV2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuYyBiL25ldC9kY2NwL2Fja3ZlYy5jCmluZGV4IDI1YjdhOGQuLmJhMDc4MjQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5jCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiZGNjcC5oIgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkY2NwX2Fja3ZlY19zbGFiOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkY2NwX2Fja3ZlY19yZWNvcmRfc2xhYjsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCmluZGV4IDQ5MDIwMjkuLjFmOTRiN2UgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgVW5pdmVyc2l0eSBvZiBBYmVyZGVlbiwgU2NvdGxhbmQsIFVLCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQHJlZGhhdC5jb20+CiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgInRmcmMuaCIKIAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX1RGUkNfREVCVUcKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCAzMzI2MzliLi45MGE5MTlhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC00MzMsNiArNDMzLDcgQEAKIAlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX0xJU1RFTkRST1BTKTsKIAlyZXR1cm4gTlVMTDsKIHB1dF9hbmRfZXhpdDoKKwliaF91bmxvY2tfc29jayhuZXdzayk7CiAJc29ja19wdXQobmV3c2spOwogCWdvdG8gZXhpdDsKIH0KZGlmZiAtLWdpdCBhL25ldC9kY2NwL3RpbWVyLmMgYi9uZXQvZGNjcC90aW1lci5jCmluZGV4IDc1ODc4NzAuLjE2ZjBiMjIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3RpbWVyLmMKKysrIGIvbmV0L2RjY3AvdGltZXIuYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGNjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiZGNjcC5oIgogCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggNDM0NTBjMS4uYTc3ZDE2MSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtNzcsNiArNzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9kZWNuZXQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCmluZGV4IGYwZWZiMGMuLmY2NWM5ZGQgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYworKysgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhLmMgYi9uZXQvZHNhL2RzYS5jCmluZGV4IDNmYjE0YjcuLjBkYzE1ODkgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhLmMKKysrIGIvbmV0L2RzYS9kc2EuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSAiZHNhX3ByaXYuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMgYi9uZXQvaWVlZTgwMjE1NC9ubC1tYWMuYwppbmRleCA3MWVlMTEwLi5hZGFmNDYyIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC9ubC1tYWMuYworKysgYi9uZXQvaWVlZTgwMjE1NC9ubC1tYWMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L25sODAyMTU0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2FmX2llZWU4MDIxNTQuaD4KICNpbmNsdWRlIDxuZXQvbmw4MDIxNTQuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjE1NC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3J1bGVzLmMgYi9uZXQvaXB2NC9maWJfcnVsZXMuYwppbmRleCBhNTNiYjFiLi40NjMzOWJhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfcnVsZXMuYworKysgYi9uZXQvaXB2NC9maWJfcnVsZXMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCA4OWQ2ZjcxLi4zN2I2NzExIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKaW5kZXggNDRkNjVkNS4uODkxNjhjNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rbWVtY2hlY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfaGFzaHRhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X3RpbWV3YWl0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IDQ3MmE4YzQuLjBkYTJhZmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDYxNjRlOTguLjc2YTdmMDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9pcGlwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKaW5kZXggOTI5YjI3Yi4uOTg5OTYxOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggZGI4ZDIyZC4uYTYzOTk2NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0zOTUsNyArMzk1LDYgQEAKIAkJCWNvbmZpZyA9IGNsdXN0ZXJpcF9jb25maWdfaW5pdChjaXBpbmZvLAogCQkJCQkJCWUtPmlwLmRzdC5zX2FkZHIsIGRldik7CiAJCQlpZiAoIWNvbmZpZykgewotCQkJCXByX2luZm8oImNhbm5vdCBhbGxvY2F0ZSBjb25maWdcbiIpOwogCQkJCWRldl9wdXQoZGV2KTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKaW5kZXggNDQ2ZTBmNC4uYjU1MDgxNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMKQEAgLTEzNSwxMCArMTM1LDggQEAKIAkgKiBkdWUgdG8gc2xhYiBhbGxvY2F0b3IgcmVzdHJpY3Rpb25zICovCiAKIAluID0gbWF4KHNpemUsIG5sYnVmc2l6KTsKLQlza2IgPSBhbGxvY19za2IobiwgR0ZQX0FUT01JQyk7CisJc2tiID0gYWxsb2Nfc2tiKG4sIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4pOwogCWlmICghc2tiKSB7Ci0JCXByX2RlYnVnKCJjYW5ub3QgYWxsb2Mgd2hvbGUgYnVmZmVyICV1YiFcbiIsIG4pOwotCiAJCWlmIChuID4gc2l6ZSkgewogCQkJLyogdHJ5IHRvIGFsbG9jYXRlIG9ubHkgYXMgbXVjaCBhcyB3ZSBuZWVkIGZvcgogCQkJICogY3VycmVudCBwYWNrZXQgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKaW5kZXggNTU4NTk4MC4uOTY4MmIzNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdF9udWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiBzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSB7CiAJc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSBwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMKaW5kZXggZjUyZDQxZS4uYTNkOTk3NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zZWN1cmVfc2VxLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCmluZGV4IDU3NDRjM2UuLjlmNGRjMTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMKaW5kZXggNzU2MzMxZC4uYmQ1YTgwYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19zY3RwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NjdHAvY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYwppbmRleCBhYTQ2MGE1Li4wZDY3YmI4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYwppbmRleCBkZmU2NWM3Li4wYjFiODYwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcGxpdGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCmluZGV4IDNjYzhjOGEuLmY4M2VmMjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc25tcF9iYXNpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKaW5kZXggZDFjYjQxMi4uMjEzM2MzMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMKQEAgLTQwMCwxMSArNDAwLDggQEAKIAkqbGVuID0gMDsKIAogCSpvY3RldHMgPSBrbWFsbG9jKGVvYyAtIGN0eC0+cG9pbnRlciwgR0ZQX0FUT01JQyk7Ci0JaWYgKCpvY3RldHMgPT0gTlVMTCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOworCWlmICgqb2N0ZXRzID09IE5VTEwpCiAJCXJldHVybiAwOwotCX0KIAogCXB0ciA9ICpvY3RldHM7CiAJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgewpAQCAtNDUxLDExICs0NDgsOCBAQAogCQlyZXR1cm4gMDsKIAogCSpvaWQgPSBrbWFsbG9jKHNpemUgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9BVE9NSUMpOwotCWlmICgqb2lkID09IE5VTEwpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKKwlpZiAoKm9pZCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlvcHRyID0gKm9pZDsKIApAQCAtNzI4LDggKzcyMiw2IEBACiAJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCpvYmogPT0gTlVMTCkgewogCQkJa2ZyZWUoaWQpOwotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcl9ub3RpY2UoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQkoKm9iaiktPnN5bnRheC5sWzBdID0gbDsKQEAgLTc0NCw4ICs3MzYsNiBAQAogCQlpZiAoKm9iaiA9PSBOVUxMKSB7CiAJCQlrZnJlZShwKTsKIAkJCWtmcmVlKGlkKTsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LmMsIHAsIGxlbik7CkBAIC03NTksOCArNzQ5LDYgQEAKIAkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCksIEdGUF9BVE9NSUMpOwogCQlpZiAoKm9iaiA9PSBOVUxMKSB7CiAJCQlrZnJlZShpZCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmICghYXNuMV9udWxsX2RlY29kZShjdHgsIGVuZCkpIHsKQEAgLTc4MCw4ICs3NjgsNiBAQAogCQlpZiAoKm9iaiA9PSBOVUxMKSB7CiAJCQlrZnJlZShscCk7CiAJCQlrZnJlZShpZCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCW1lbWNweSgoKm9iaiktPnN5bnRheC51bCwgbHAsIGxlbik7CkBAIC04MDEsOCArNzg3LDYgQEAKIAkJaWYgKCpvYmogPT0gTlVMTCkgewogCQkJa2ZyZWUocCk7CiAJCQlrZnJlZShpZCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByX25vdGljZSgiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCW1lbWNweSgoKm9iaiktPnN5bnRheC51YywgcCwgbGVuKTsKQEAgLTgxOSw4ICs4MDMsNiBAQAogCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICgqb2JqID09IE5VTEwpIHsKIAkJCWtmcmVlKGlkKTsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJfbm90aWNlKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJKCpvYmopLT5zeW50YXgudWxbMF0gPSB1bDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3BpbmcuYyBiL25ldC9pcHY0L3BpbmcuYwppbmRleCAzOWI0MDNmLi5hMDZmNzNmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9waW5nLmMKKysrIGIvbmV0L2lwdjQvcGluZy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BpbmcuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9wcm9jLmMgYi9uZXQvaXB2NC9wcm9jLmMKaW5kZXggNGJmYWQ1ZC4uNDY2ZWE4YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcHJvYy5jCisrKyBiL25ldC9pcHY0L3Byb2MuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9yYXcuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCA2MTcxNGJkLi4wMDdlMmViIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggZDdiODliMS4uOTBmNjU0NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCmluZGV4IDBlYTEwZWUuLmE3NDQzMTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwpAQCAtMTUxMCw2ICsxNTEwLDcgQEAKIAlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX0xJU1RFTkRST1BTKTsKIAlyZXR1cm4gTlVMTDsKIHB1dF9hbmRfZXhpdDoKKwliaF91bmxvY2tfc29jayhuZXdzayk7CiAJc29ja19wdXQobmV3c2spOwogCWdvdG8gZXhpdDsKIH0KQEAgLTIzMzksNyArMjM0MCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHRjcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK2ludCB0Y3Bfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHRjcF9zZXFfYWZpbmZvICphZmluZm8gPSBQREUoaW5vZGUpLT5kYXRhOwogCXN0cnVjdCB0Y3BfaXRlcl9zdGF0ZSAqczsKQEAgLTIzNTUsMjMgKzIzNTYsMTkgQEAKIAlzLT5sYXN0X3BvcyAJCT0gMDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3NlcV9vcGVuKTsKIAogaW50IHRjcF9wcm9jX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjcF9zZXFfYWZpbmZvICphZmluZm8pCiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CiAKLQlhZmluZm8tPnNlcV9mb3BzLm9wZW4JCT0gdGNwX3NlcV9vcGVuOwotCWFmaW5mby0+c2VxX2ZvcHMucmVhZAkJPSBzZXFfcmVhZDsKLQlhZmluZm8tPnNlcV9mb3BzLmxsc2VlawkJPSBzZXFfbHNlZWs7Ci0JYWZpbmZvLT5zZXFfZm9wcy5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfbmV0OwotCiAJYWZpbmZvLT5zZXFfb3BzLnN0YXJ0CQk9IHRjcF9zZXFfc3RhcnQ7CiAJYWZpbmZvLT5zZXFfb3BzLm5leHQJCT0gdGNwX3NlcV9uZXh0OwogCWFmaW5mby0+c2VxX29wcy5zdG9wCQk9IHRjcF9zZXFfc3RvcDsKIAogCXAgPSBwcm9jX2NyZWF0ZV9kYXRhKGFmaW5mby0+bmFtZSwgU19JUlVHTywgbmV0LT5wcm9jX25ldCwKLQkJCSAgICAgJmFmaW5mby0+c2VxX2ZvcHMsIGFmaW5mbyk7CisJCQkgICAgIGFmaW5mby0+c2VxX2ZvcHMsIGFmaW5mbyk7CiAJaWYgKCFwKQogCQlyYyA9IC1FTk9NRU07CiAJcmV0dXJuIHJjOwpAQCAtMjUyMCwxMiArMjUxNywxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0Y3BfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB0Y3Bfc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogc3RhdGljIHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyB0Y3A0X3NlcV9hZmluZm8gPSB7CiAJLm5hbWUJCT0gInRjcCIsCiAJLmZhbWlseQkJPSBBRl9JTkVULAotCS5zZXFfZm9wcwk9IHsKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnRjcF9hZmluZm9fc2VxX2ZvcHMsCiAJLnNlcV9vcHMJPSB7CiAJCS5zaG93CQk9IHRjcDRfc2VxX3Nob3csCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggZWJhYTk2Yi4uYWIwOTY2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTEzOTcsNiArMTM5Nyw4IEBACiAJbmZfcmVzZXQoc2tiKTsKIAogCWlmICh1cC0+ZW5jYXBfdHlwZSkgeworCQlpbnQgKCplbmNhcF9yY3YpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKIAkJLyoKIAkJICogVGhpcyBpcyBhbiBlbmNhcHN1bGF0aW9uIHNvY2tldCBzbyBwYXNzIHRoZSBza2IgdG8KIAkJICogdGhlIHNvY2tldCdzIHVkcF9lbmNhcF9yY3YoKSBob29rLiBPdGhlcndpc2UsIGp1c3QKQEAgLTE0MDksMTEgKzE0MTEsMTEgQEAKIAkJICovCiAKIAkJLyogaWYgd2UncmUgb3Zlcmx5IHNob3J0LCBsZXQgVURQIGhhbmRsZSBpdCAqLwotCQlpZiAoc2tiLT5sZW4gPiBzaXplb2Yoc3RydWN0IHVkcGhkcikgJiYKLQkJICAgIHVwLT5lbmNhcF9yY3YgIT0gTlVMTCkgeworCQllbmNhcF9yY3YgPSBBQ0NFU1NfT05DRSh1cC0+ZW5jYXBfcmN2KTsKKwkJaWYgKHNrYi0+bGVuID4gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICYmIGVuY2FwX3JjdiAhPSBOVUxMKSB7CiAJCQlpbnQgcmV0OwogCi0JCQlyZXQgPSAoKnVwLT5lbmNhcF9yY3YpKHNrLCBza2IpOworCQkJcmV0ID0gZW5jYXBfcmN2KHNrLCBza2IpOwogCQkJaWYgKHJldCA8PSAwKSB7CiAJCQkJVURQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCiAJCQkJCQkgVURQX01JQl9JTkRBVEFHUkFNUywKQEAgLTIwMzcsNyArMjAzOSw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+dWRwX3RhYmxlLT5oYXNoW3N0YXRlLT5idWNrZXRdLmxvY2spOwogfQogCi1zdGF0aWMgaW50IHVkcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK2ludCB1ZHBfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHVkcF9zZXFfYWZpbmZvICphZmluZm8gPSBQREUoaW5vZGUpLT5kYXRhOwogCXN0cnVjdCB1ZHBfaXRlcl9zdGF0ZSAqczsKQEAgLTIwNTMsNiArMjA1NSw3IEBACiAJcy0+dWRwX3RhYmxlCQk9IGFmaW5mby0+dWRwX3RhYmxlOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKHVkcF9zZXFfb3Blbik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IHVkcF9wcm9jX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHVkcF9zZXFfYWZpbmZvICphZmluZm8pCkBAIC0yMDYwLDE3ICsyMDYzLDEyIEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwogCWludCByYyA9IDA7CiAKLQlhZmluZm8tPnNlcV9mb3BzLm9wZW4JCT0gdWRwX3NlcV9vcGVuOwotCWFmaW5mby0+c2VxX2ZvcHMucmVhZAkJPSBzZXFfcmVhZDsKLQlhZmluZm8tPnNlcV9mb3BzLmxsc2VlawkJPSBzZXFfbHNlZWs7Ci0JYWZpbmZvLT5zZXFfZm9wcy5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfbmV0OwotCiAJYWZpbmZvLT5zZXFfb3BzLnN0YXJ0CQk9IHVkcF9zZXFfc3RhcnQ7CiAJYWZpbmZvLT5zZXFfb3BzLm5leHQJCT0gdWRwX3NlcV9uZXh0OwogCWFmaW5mby0+c2VxX29wcy5zdG9wCQk9IHVkcF9zZXFfc3RvcDsKIAogCXAgPSBwcm9jX2NyZWF0ZV9kYXRhKGFmaW5mby0+bmFtZSwgU19JUlVHTywgbmV0LT5wcm9jX25ldCwKLQkJCSAgICAgJmFmaW5mby0+c2VxX2ZvcHMsIGFmaW5mbyk7CisJCQkgICAgIGFmaW5mby0+c2VxX2ZvcHMsIGFmaW5mbyk7CiAJaWYgKCFwKQogCQlyYyA9IC1FTk9NRU07CiAJcmV0dXJuIHJjOwpAQCAtMjEyMCwxNCArMjExOCwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHBfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICA9IHVkcF9zZXFfb3BlbiwKKwkucmVhZCAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgID0gc2VxX3JlbGVhc2VfbmV0Cit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gdWRwNF9zZXFfYWZpbmZvID0gewogCS5uYW1lCQk9ICJ1ZHAiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudWRwX3RhYmxlCT0gJnVkcF90YWJsZSwKLQkuc2VxX2ZvcHMJPSB7Ci0JCS5vd25lcgk9CVRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnVkcF9hZmluZm9fc2VxX2ZvcHMsCiAJLnNlcV9vcHMJPSB7CiAJCS5zaG93CQk9IHVkcDRfc2VxX3Nob3csCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcGxpdGUuYyBiL25ldC9pcHY0L3VkcGxpdGUuYwppbmRleCBhZWU5OTYzLi4xMmU5NDk5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAKIHN0cnVjdCB1ZHBfdGFibGUgCXVkcGxpdGVfdGFibGUgX19yZWFkX21vc3RseTsKQEAgLTcxLDEzICs3MiwyMCBAQAogfTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcGxpdGVfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICA9IHVkcF9zZXFfb3BlbiwKKwkucmVhZCAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgID0gc2VxX3JlbGVhc2VfbmV0Cit9OworCiBzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcGxpdGU0X3NlcV9hZmluZm8gPSB7CiAJLm5hbWUJCT0gInVkcGxpdGUiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudWRwX3RhYmxlIAk9ICZ1ZHBsaXRlX3RhYmxlLAotCS5zZXFfZm9wcwk9IHsKLQkJLm93bmVyCT0JVEhJU19NT0RVTEUsCi0JfSwKKwkuc2VxX2ZvcHMJPSAmdWRwbGl0ZV9hZmluZm9fc2VxX2ZvcHMsCiAJLnNlcV9vcHMJPSB7CiAJCS5zaG93CQk9IHVkcDRfc2VxX3Nob3csCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMgYi9uZXQvaXB2NC94ZnJtNF9zdGF0ZS5jCmluZGV4IGQ5YWMwYTAuLjkyNThlNzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3N0YXRlLmMKKysrIGIvbmV0L2lwdjQveGZybTRfc3RhdGUuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bma2V5djIuaD4KICNpbmNsdWRlIDxsaW51eC9pcHNlYy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBpbnQgeGZybTRfaW5pdF9mbGFncyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGQwNjExYTUuLmNmODhkZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtODcsNiArODcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIC8qIFNldCB0byAzIHRvIGdldCB0cmFjaW5nLi4uICovCiAjZGVmaW5lIEFDT05GX0RFQlVHIDIKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mX2NvcmUuYyBiL25ldC9pcHY2L2FkZHJjb25mX2NvcmUuYwppbmRleCA2YjAzODI2Li4zOTkyODdlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmZfY29yZS5jCkBAIC0zLDYgKzMsNyBAQAogICogbm90IGNvbmZpZ3VyZWQgb3Igc3RhdGljLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogCiAjZGVmaW5lIElQVjZfQUREUl9TQ09QRV9UWVBFKHNjb3BlKQkoKHNjb3BlKSA8PCAxNikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2V4dGhkcnMuYyBiL25ldC9pcHY2L2V4dGhkcnMuYwppbmRleCAxMzE4ZGU0Li5iZjIyYTIyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzLmMKKysrIGIvbmV0L2lwdjYvZXh0aGRycy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYyBiL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCmluZGV4IDE0ZWQwYTkuLjM3ZjU0OGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCkBAIC0yLDYgKzIsNyBAQAogICogSVB2NiBsaWJyYXJ5IGNvZGUsIG5lZWRlZCBieSBzdGF0aWMgY29tcG9uZW50cyB3aGVuIGZ1bGwgSVB2NiBzdXBwb3J0IGlzCiAgKiBub3QgY29uZmlndXJlZCBvciBzdGF0aWMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCmluZGV4IDM0ZDI0NGQuLjI5NTU3MTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYworKysgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCA1NDMwMzk0Li40NTY2ZGJkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2bXIuYyBiL25ldC9pcHY2L2lwNm1yLmMKaW5kZXggZGVmMDUzOC4uNDQ5YTkxOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2bXIuYworKysgYi9uZXQvaXB2Ni9pcDZtci5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGltLmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAKIHN0cnVjdCBtcjZfdGFibGUgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwppbmRleCAzMGZjZWU0Li5kYjMxNTYxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwpAQCAtMyw2ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CkBAIC0xMDAsOSArMTAxLDE2IEBACiAJCS5waW5ldDYgPSAoc3RydWN0IGlwdjZfcGluZm8gKikgJmZha2VfcGluZm8sCiAJfTsKIAljb25zdCB2b2lkICpzayA9IHN0cmljdCA/ICZmYWtlX3NrIDogTlVMTDsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpyZXN1bHQ7CisJaW50IGVycjsKIAotCSpkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgc2ssICZmbC0+dS5pcDYpOwotCXJldHVybiAoKmRzdCktPmVycm9yOworCXJlc3VsdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBzaywgJmZsLT51LmlwNik7CisJZXJyID0gcmVzdWx0LT5lcnJvcjsKKwlpZiAoZXJyKQorCQlkc3RfcmVsZWFzZShyZXN1bHQpOworCWVsc2UKKwkJKmRzdCA9IHJlc3VsdDsKKwlyZXR1cm4gZXJyOwogfQogCiBfX3N1bTE2IG5mX2lwNl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCBlODc2MmM3Li4zOGYwMGIwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC0xODIsNyArMTgyLDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHEsIHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSwgcSk7CiAKIG9vbToKLQlwcl9kZWJ1ZygiQ2FuJ3QgYWxsb2MgbmV3IHF1ZXVlXG4iKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzcwLDEwICszNjksMTAgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmNsb25lOwogCQlpbnQgaSwgcGxlbiA9IDA7CiAKLQkJaWYgKChjbG9uZSA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQkJcHJfZGVidWcoIkNhbid0IGFsbG9jIHNrYlxuIik7CisJCWNsb25lID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAoY2xvbmUgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X29vbTsKLQkJfQorCiAJCWNsb25lLT5uZXh0ID0gaGVhZC0+bmV4dDsKIAkJaGVhZC0+bmV4dCA9IGNsb25lOwogCQlza2Jfc2hpbmZvKGNsb25lKS0+ZnJhZ19saXN0ID0gc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcHJvYy5jIGIvbmV0L2lwdjYvcHJvYy5jCmluZGV4IDE4ZmY1ZGYuLjEwMDhjZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Byb2MuYworKysgYi9uZXQvaXB2Ni9wcm9jLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDZmNzgyNGUuLjMzMWFmM2I4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtNjEsNiArNjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmF3X2hhc2hpbmZvIHJhd192Nl9oYXNoaW5mbyA9IHsKIAkubG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChyYXdfdjZfaGFzaGluZm8ubG9jayksCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKaW5kZXggY2MyMjA5OS4uZGZiMTY0ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jCisrKyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvc25tcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKaW5kZXggNTdiODJkYy4uODQ3MzAxNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcm91dGUuYworKysgYi9uZXQvaXB2Ni9yb3V0ZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYyBiL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCmluZGV4IDZkY2Y1ZTcuLjE2NmE1N2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggMTBiMmIzMS4uMzYxMzFkMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0yMTYxLDEyICsyMTYxLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRjcDZfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB0Y3Bfc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldAorfTsKKwogc3RhdGljIHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyB0Y3A2X3NlcV9hZmluZm8gPSB7CiAJLm5hbWUJCT0gInRjcDYiLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCi0JLnNlcV9mb3BzCT0gewotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JfSwKKwkuc2VxX2ZvcHMJPSAmdGNwNl9hZmluZm9fc2VxX2ZvcHMsCiAJLnNlcV9vcHMJPSB7CiAJCS5zaG93CQk9IHRjcDZfc2VxX3Nob3csCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggZjRjYTBhNS4uODQ2ZjQ3NTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC0xNDI0LDEzICsxNDI0LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcDZfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICA9IHVkcF9zZXFfb3BlbiwKKwkucmVhZCAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgID0gc2VxX3JlbGVhc2VfbmV0Cit9OworCiBzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcDZfc2VxX2FmaW5mbyA9IHsKIAkubmFtZQkJPSAidWRwNiIsCiAJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkudWRwX3RhYmxlCT0gJnVkcF90YWJsZSwKLQkuc2VxX2ZvcHMJPSB7Ci0JCS5vd25lcgk9CVRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnVkcDZfYWZpbmZvX3NlcV9mb3BzLAogCS5zZXFfb3BzCT0gewogCQkuc2hvdwkJPSB1ZHA2X3NlcV9zaG93LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBsaXRlLmMgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKaW5kZXggOTg2YzRkZS4uMWQwOGUyMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY2L3VkcGxpdGUuYwpAQCAtMTEsNiArMTEsNyBAQAogICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ1ZHBfaW1wbC5oIgogCiBzdGF0aWMgaW50IHVkcGxpdGV2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTkzLDEzICs5NCwyMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWRwbGl0ZTZfYWZpbmZvX3NlcV9mb3BzID0geworCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgICA9IHVkcF9zZXFfb3BlbiwKKwkucmVhZCAgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgID0gc2VxX3JlbGVhc2VfbmV0Cit9OworCiBzdGF0aWMgc3RydWN0IHVkcF9zZXFfYWZpbmZvIHVkcGxpdGU2X3NlcV9hZmluZm8gPSB7CiAJLm5hbWUJCT0gInVkcGxpdGU2IiwKIAkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCS51ZHBfdGFibGUJPSAmdWRwbGl0ZV90YWJsZSwKLQkuc2VxX2ZvcHMJPSB7Ci0JCS5vd25lcgk9CVRISVNfTU9EVUxFLAotCX0sCisJLnNlcV9mb3BzCT0gJnVkcGxpdGU2X2FmaW5mb19zZXFfZm9wcywKIAkuc2VxX29wcwk9IHsKIAkJLnNob3cJCT0gdWRwNl9zZXFfc2hvdywKIAl9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYyBiL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKaW5kZXggMjQ4ZjBiMi4uZjJkNzJiOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGZrZXl2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwc2VjLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB4L2lweF9wcm9jLmMgYi9uZXQvaXB4L2lweF9wcm9jLmMKaW5kZXggMjZiNWJmYy4uZjhiYTMwZCAxMDA2NDQKLS0tIGEvbmV0L2lweC9pcHhfcHJvYy5jCisrKyBiL25ldC9pcHgvaXB4X3Byb2MuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KICNpbmNsdWRlIDxuZXQvaXB4Lmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9kaXNjb3ZlcnkuYyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCmluZGV4IDM2YzNmMDMuLmIwYjU2YTMgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2Rpc2NvdmVyeS5jCisrKyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KICNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYyBiL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKaW5kZXggM2VjYTM1Zi4uMTQ2NTNiOCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYworKysgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnR0cC5jIGIvbmV0L2lyZGEvaXJ0dHAuYwppbmRleCAyODVjY2Q2Li4zMmUzYmIwIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnR0cC5jCisrKyBiL25ldC9pcmRhL2lydHRwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KZGlmZiAtLWdpdCBhL25ldC9pcmRhL3Fvcy5jIGIvbmV0L2lyZGEvcW9zLmMKaW5kZXggNDM2OWY3Zi4uNzk4ZmZkOSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvcW9zLmMKKysrIGIvbmV0L2lyZGEvcW9zLmMKQEAgLTMwLDYgKzMwLDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKwogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5jIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKaW5kZXggMzRiMmRkZS4uYmY4ZDUwYyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKQEAgLTM5Nyw2ICszOTcsNyBAQAogCSAqIGV4cGVjdCB0byBzZW5kIHVwIG5leHQsIGRlcXVldWUgaXQgYW5kIGFueSBvdGhlcgogCSAqIGluLXNlcXVlbmNlIHBhY2tldHMgYmVoaW5kIGl0LgogCSAqLworc3RhcnQ6CiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5yZW9yZGVyX3EubG9jayk7CiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmc2Vzc2lvbi0+cmVvcmRlcl9xLCBza2IsIHRtcCkgewogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBMMlRQX1NLQl9DQihza2IpLT5leHBpcmVzKSkgewpAQCAtNDMzLDcgKzQzNCw3IEBACiAJCSAqLwogCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+cmVvcmRlcl9xLmxvY2spOwogCQlsMnRwX3JlY3ZfZGVxdWV1ZV9za2Ioc2Vzc2lvbiwgc2tiKTsKLQkJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5yZW9yZGVyX3EubG9jayk7CisJCWdvdG8gc3RhcnQ7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19pbnB1dC5jIGIvbmV0L2xsYy9sbGNfaW5wdXQuYwppbmRleCA5MDMyNDIxLi5lMzJjYWI0IDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19pbnB1dC5jCisrKyBiL25ldC9sbGMvbGxjX2lucHV0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9sbGMuaD4KICNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfb3V0cHV0LmMgYi9uZXQvbGxjL2xsY19vdXRwdXQuYwppbmRleCBiMzhhMTA3Li5iNjU4Y2JhIDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19vdXRwdXQuYworKysgYi9uZXQvbGxjL2xsY19vdXRwdXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2xsYy5oPgogI2luY2x1ZGUgPG5ldC9sbGNfcGR1Lmg+CiAKZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX3Byb2MuYyBiL25ldC9sbGMvbGxjX3Byb2MuYwppbmRleCA3YWYxZmYyLi5hMTgzOWMwIDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19wcm9jLmMKKysrIGIvbmV0L2xsYy9sbGNfcHJvYy5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2xsYy5oPgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL0tjb25maWcgYi9uZXQvbWFjODAyMTEvS2NvbmZpZwppbmRleCA3ZDNiNDM4Li45NmRkYjcyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvS2NvbmZpZworKysgYi9uZXQvbWFjODAyMTEvS2NvbmZpZwpAQCAtMjQ3LDE1ICsyNDcsMyBAQAogCSAgYW5kIHNob3cgdGhlbSBpbiBkZWJ1Z2ZzLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgTUFDODAyMTFfRFJJVkVSX0FQSV9UUkFDRVIKLQlib29sICJEcml2ZXIgQVBJIHRyYWNlciIKLQlkZXBlbmRzIG9uIE1BQzgwMjExX0RFQlVHX01FTlUKLQlkZXBlbmRzIG9uIEVWRU5UX1RSQUNJTkcKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIG1ha2UgbWFjODAyMTEgcmVnaXN0ZXIgd2l0aCB0aGUgZnRyYWNlCi0JICBmcmFtZXdvcmsgZm9yIHRoZSBkcml2ZXIgQVBJIC0tIHlvdSBjYW4gdGhlbiBzZWUgd2hpY2gKLQkgIGRyaXZlciBtZXRob2RzIGl0IGlzIGNhbGxpbmcgYW5kIHdoaWNoIEFQSSBmdW5jdGlvbnMKLQkgIGRyaXZlcnMgYXJlIGNhbGxpbmcgYnkgbG9va2luZyBhdCB0aGUgdHJhY2UuCi0KLQkgIElmIHVuc3VyZSwgc2F5IFkuCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvTWFrZWZpbGUgYi9uZXQvbWFjODAyMTEvTWFrZWZpbGUKaW5kZXggZmRiNTRlNi4uZDU0MGMzYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL01ha2VmaWxlCisrKyBiL25ldC9tYWM4MDIxMS9NYWtlZmlsZQpAQCAtMjQsNyArMjQsOCBAQAogCXV0aWwubyBcCiAJd21lLm8gXAogCWV2ZW50Lm8gXAotCWNoYW4ubworCWNoYW4ubyBcCisJZHJpdmVyLXRyYWNlLm8KIAogbWFjODAyMTEtJChDT05GSUdfTUFDODAyMTFfTEVEUykgKz0gbGVkLm8KIG1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0RFQlVHRlMpICs9IFwKQEAgLTQxLDcgKzQyLDYgQEAKIAogbWFjODAyMTEtJChDT05GSUdfUE0pICs9IHBtLm8KIAotbWFjODAyMTEtJChDT05GSUdfTUFDODAyMTFfRFJJVkVSX0FQSV9UUkFDRVIpICs9IGRyaXZlci10cmFjZS5vCiBDRkxBR1NfZHJpdmVyLXRyYWNlLm8gOj0gLUkkKHNyYykKIAogIyBvYmplY3RzIGZvciBQSUQgYWxnb3JpdGhtCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWdnLXJ4LmMgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKaW5kZXggZjllYzBkOS4uOTZkZWJiYSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2FnZy1yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9hZ2ctcnguYwpAQCAtMzgsNiArMzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAiZHJpdmVyLW9wcy5oIgpAQCAtNzIsOCArNzMsMTEgQEAKIAlSQ1VfSU5JVF9QT0lOVEVSKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSwgTlVMTCk7CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiUnggQkEgc2Vzc2lvbiBzdG9wIHJlcXVlc3RlZCBmb3IgJXBNIHRpZCAldVxuIiwKLQkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiUnggQkEgc2Vzc2lvbiBzdG9wIHJlcXVlc3RlZCBmb3IgJXBNIHRpZCAldSAlcyByZWFzb246ICVkXG4iLAorCSAgICAgICBzdGEtPnN0YS5hZGRyLCB0aWQsCisJICAgICAgIGluaXRpYXRvciA9PSBXTEFOX0JBQ0tfUkVDSVBJRU5UID8gInJlY2lwaWVudCIgOiAiaW5pdGl0YXRvciIsCisJICAgICAgIChpbnQpcmVhc29uKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KIAogCWlmIChkcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzdGEtPnNkYXRhLCBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUCwKQEAgLTg0LDcgKzg4LDcgQEAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGEgc2VsZiBnZW5lcmF0ZWQgYWdncmVnYXRpb24gaGFsdCAqLwogCWlmIChpbml0aWF0b3IgPT0gV0xBTl9CQUNLX1JFQ0lQSUVOVCAmJiB0eCkKIAkJaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RhLT5zZGF0YSwgc3RhLT5zdGEuYWRkciwKLQkJCQkgICAgIHRpZCwgMCwgcmVhc29uKTsKKwkJCQkgICAgIHRpZCwgV0xBTl9CQUNLX1JFQ0lQSUVOVCwgcmVhc29uKTsKIAogCWRlbF90aW1lcl9zeW5jKCZ0aWRfcngtPnNlc3Npb25fdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZ0aWRfcngtPnJlb3JkZXJfdGltZXIpOwpAQCAtMTA4LDcgKzExMiw3IEBACiAJaW50IGk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBhZGRyKTsKKwlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBhZGRyKTsKIAlpZiAoIXN0YSkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwpAQCAtMTgxLDYgKzE4NSw4IEBACiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUubWdkLmJzc2lkLCBFVEhfQUxFTik7CisJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQsIEVUSF9BTEVOKTsKIAogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWdnLXR4LmMgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKaW5kZXggZmVmYzdlNS4uZTkyZjk4ZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2FnZy10eC5jCisrKyBiL25ldC9tYWM4MDIxMS9hZ2ctdHguYwpAQCAtMTUsNiArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAiZHJpdmVyLW9wcy5oIgpAQCAtNTQsNiArNTUsOCBAQAogICogQGFtcGR1X2FjdGlvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBhY3Rpb24KICAqICVJRUVFODAyMTFfQU1QRFVfVFhfU1RPUC4gSW4gdGhpcyBjYXNlLCB0aGUgY2FsbCBtdXN0IG5vdCBmYWlsLAogICogYW5kIHRoZSBkcml2ZXIgbXVzdCBsYXRlciBjYWxsIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoKS4KKyAqIE5vdGUgdGhhdCB0aGUgc3RhIGNhbiBnZXQgZGVzdHJveWVkIGJlZm9yZSB0aGUgQkEgdGVhciBkb3duIGlzCisgKiBjb21wbGV0ZS4KICAqLwogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXF1ZXN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtODIsNiArODUsOCBAQAogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCWVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lm1nZC5ic3NpZCwgRVRIX0FMRU4pOworCWVsc2UgaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5pYnNzLmJzc2lkLCBFVEhfQUxFTik7CiAKIAltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwpAQCAtMTAyLDcgKzEwNyw3IEBACiAJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuc3RhcnRfc2VxX251bSA9CiAJCQkJCWNwdV90b19sZTE2KHN0YXJ0X3NlcV9udW0gPDwgNCk7CiAKLQlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IpOworCWllZWU4MDIxMV90eF9za2JfdGlkKHNkYXRhLCBza2IsIHRpZCk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX3NlbmRfYmFyKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICpyYSwgdTE2IHRpZCwgdTE2IHNzbikKQEAgLTEzMSw3ICsxMzYsNyBAQAogCWJhci0+c3RhcnRfc2VxX251bSA9IGNwdV90b19sZTE2KHNzbik7CiAKIAlJRUVFODAyMTFfU0tCX0NCKHNrYiktPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ET05UX0VOQ1JZUFQ7Ci0JaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiKTsKKwlpZWVlODAyMTFfdHhfc2tiX3RpZChzZGF0YSwgc2tiLCB0aWQpOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc2VuZF9iYXIpOwogCkBAIC0xNjEsNiArMTY2LDEyIEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCS8qIGlmIHdlJ3JlIGFscmVhZHkgc3RvcHBpbmcgaWdub3JlIGFueSBuZXcgcmVxdWVzdHMgdG8gc3RvcCAqLworCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfU1RPUFBJTkcsICZ0aWRfdHgtPnN0YXRlKSkgeworCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwl9CisKIAlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKSkgewogCQkvKiBub3QgZXZlbiBzdGFydGVkIHlldCEgKi8KIAkJaWVlZTgwMjExX2Fzc2lnbl90aWRfdHgoc3RhLCB0aWQsIE5VTEwpOwpAQCAtMTY5LDYgKzE4MCw4IEBACiAJCXJldHVybiAwOwogCX0KIAorCXNldF9iaXQoSFRfQUdHX1NUQVRFX1NUT1BQSU5HLCAmdGlkX3R4LT5zdGF0ZSk7CisKIAlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwpAQCAtMTc2LDkgKzE4OSw4IEBACiAJICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCiAKLQlzZXRfYml0KEhUX0FHR19TVEFURV9TVE9QUElORywgJnRpZF90eC0+c3RhdGUpOwotCiAJZGVsX3RpbWVyX3N5bmMoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnRpZF90eC0+c2Vzc2lvbl90aW1lcik7CiAKIAkvKgogCSAqIEFmdGVyIHRoaXMgcGFja2V0cyBhcmUgbm8gbG9uZ2VyIGhhbmRlZCByaWdodCB0aHJvdWdoCkBAIC0xODcsNiArMTk5LDIwIEBACiAJICovCiAJY2xlYXJfYml0KEhUX0FHR19TVEFURV9PUEVSQVRJT05BTCwgJnRpZF90eC0+c3RhdGUpOwogCisJLyoKKwkgKiBUaGVyZSBtaWdodCBiZSBhIGZldyBwYWNrZXRzIGJlaW5nIHByb2Nlc3NlZCByaWdodCBub3cgKG9uCisJICogYW5vdGhlciBDUFUpIHRoYXQgaGF2ZSBhbHJlYWR5IGdvdHRlbiBwYXN0IHRoZSBhZ2dyZWdhdGlvbgorCSAqIGNoZWNrIHdoZW4gaXQgd2FzIHN0aWxsIE9QRVJBVElPTkFMIGFuZCBjb25zZXF1ZW50bHkgaGF2ZQorCSAqIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgc2V0LiBJbiB0aGF0IGNhc2UsIHRoaXMgY29kZSBtaWdodAorCSAqIGNhbGwgaW50byB0aGUgZHJpdmVyIGF0IHRoZSBzYW1lIHRpbWUgb3IgZXZlbiBiZWZvcmUgdGhlCisJICogVFggcGF0aHMgY2FsbHMgaW50byBpdCwgd2hpY2ggY291bGQgY29uZnVzZSB0aGUgZHJpdmVyLgorCSAqCisJICogV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIFRYIHBhdGhzIHRvIGZpbmlzaCBiZWZvcmUKKwkgKiB0ZWxsaW5nIHRoZSBkcml2ZXIuIE5ldyBwYWNrZXRzIHdpbGwgbm90IGdvIHRocm91Z2ggc2luY2UKKwkgKiB0aGUgYWdncmVnYXRpb24gc2Vzc2lvbiBpcyBubyBsb25nZXIgT1BFUkFUSU9OQUwuCisJICovCisJc3luY2hyb25pemVfbmV0KCk7CisKIAl0aWRfdHgtPnN0b3BfaW5pdGlhdG9yID0gaW5pdGlhdG9yOwogCXRpZF90eC0+dHhfc3RvcCA9IHR4OwogCkBAIC0yODMsNiArMzA5LDM4IEBACiAJX19yZWxlYXNlKGFnZ19xdWV1ZSk7CiB9CiAKKy8qCisgKiBzcGxpY2UgcGFja2V0cyBmcm9tIHRoZSBTVEEncyBwZW5kaW5nIHRvIHRoZSBsb2NhbCBwZW5kaW5nLAorICogcmVxdWlyZXMgYSBjYWxsIHRvIGllZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaCBsYXRlcgorICovCitzdGF0aWMgdm9pZCBfX2FjcXVpcmVzKGFnZ19xdWV1ZSkKK2llZWU4MDIxMV9hZ2dfc3BsaWNlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICAgIHN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCwgdTE2IHRpZCkKK3sKKwlpbnQgcXVldWUgPSBpZWVlODAyMTFfYWNfZnJvbV90aWQodGlkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWVlZTgwMjExX3N0b3BfcXVldWVfYWdnKGxvY2FsLCB0aWQpOworCisJaWYgKFdBUk4oIXRpZF90eCwgIlRJRCAlZCBnb25lIGJ1dCBleHBlY3RlZCB3aGVuIHNwbGljaW5nIGFnZ3JlZ2F0ZXMiCisJCQkgICIgZnJvbSB0aGUgcGVuZGluZyBxdWV1ZVxuIiwgdGlkKSkKKwkJcmV0dXJuOworCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRpZF90eC0+cGVuZGluZykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CisJCS8qIGNvcHkgb3ZlciByZW1haW5pbmcgcGFja2V0cyAqLworCQlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdCgmdGlkX3R4LT5wZW5kaW5nLAorCQkJCQkgICAmbG9jYWwtPnBlbmRpbmdbcXVldWVdKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fcmVsZWFzZXMoYWdnX3F1ZXVlKQoraWVlZTgwMjExX2FnZ19zcGxpY2VfZmluaXNoKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1MTYgdGlkKQoreworCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKK30KKwogdm9pZCBpZWVlODAyMTFfdHhfYmFfc2Vzc2lvbl9oYW5kbGVfc3RhcnQoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQpCiB7CiAJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OwpAQCAtMjk0LDE5ICszNTIsMTcgQEAKIAl0aWRfdHggPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkX3RpZF90eChzdGEsIHRpZCk7CiAKIAkvKgotCSAqIFdoaWxlIHdlJ3JlIGFza2luZyB0aGUgZHJpdmVyIGFib3V0IHRoZSBhZ2dyZWdhdGlvbiwKLQkgKiBzdG9wIHRoZSBBQyBxdWV1ZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkgKiBhYm91dCBmcmFtZXMgdGhhdCBjYW1lIGluIHdoaWxlIHdlIHdlcmUgZG9pbmcgdGhhdCwKLQkgKiB3aGljaCB3b3VsZCByZXF1aXJlIHVzIHRvIHB1dCB0aGVtIHRvIHRoZSBBQyBwZW5kaW5nCi0JICogYWZ0ZXJ3YXJkcyB3aGljaCBqdXN0IG1ha2VzIHRoZSBjb2RlIG1vcmUgY29tcGxleC4KKwkgKiBTdGFydCBxdWV1aW5nIHVwIHBhY2tldHMgZm9yIHRoaXMgYWdncmVnYXRpb24gc2Vzc2lvbi4KKwkgKiBXZSdyZSBnb2luZyB0byByZWxlYXNlIHRoZW0gb25jZSB0aGUgZHJpdmVyIGlzIE9LIHdpdGgKKwkgKiB0aGF0LgogCSAqLwotCWllZWU4MDIxMV9zdG9wX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKLQogCWNsZWFyX2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVEFSVCwgJnRpZF90eC0+c3RhdGUpOwogCiAJLyoKLQkgKiBtYWtlIHN1cmUgbm8gcGFja2V0cyBhcmUgYmVpbmcgcHJvY2Vzc2VkIHRvIGdldAotCSAqIHZhbGlkIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorCSAqIE1ha2Ugc3VyZSBubyBwYWNrZXRzIGFyZSBiZWluZyBwcm9jZXNzZWQuIFRoaXMgZW5zdXJlcyB0aGF0CisJICogd2UgaGF2ZSBhIHZhbGlkIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBhbmQgdGhhdCBpbi1mbGlnaHQKKwkgKiBwYWNrZXRzIGhhdmUgYmVlbiBmbHVzaGVkIG91dCBhbmQgbm8gcGFja2V0cyBmb3IgdGhpcyBUSUQKKwkgKiB3aWxsIGdvIGludG8gdGhlIGRyaXZlciBkdXJpbmcgdGhlIGFtcGR1X2FjdGlvbiBjYWxsLgogCSAqLwogCXN5bmNocm9uaXplX25ldCgpOwogCkBAIC0zMjAsMTcgKzM3NiwxNSBAQAogCQkJCQkiIHRpZCAlZFxuIiwgdGlkKTsKICNlbmRpZgogCQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7CisJCWllZWU4MDIxMV9hZ2dfc3BsaWNlX3BhY2tldHMobG9jYWwsIHRpZF90eCwgdGlkKTsKIAkJaWVlZTgwMjExX2Fzc2lnbl90aWRfdHgoc3RhLCB0aWQsIE5VTEwpOworCQlpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2gobG9jYWwsIHRpZCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCi0JCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKIAkJa2ZyZWVfcmN1KHRpZF90eCwgcmN1X2hlYWQpOwogCQlyZXR1cm47CiAJfQogCi0JLyogd2UgY2FuIHRha2UgcGFja2V0cyBhZ2FpbiBub3cgKi8KLQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9hZ2cobG9jYWwsIHRpZCk7Ci0KIAkvKiBhY3RpdmF0ZSB0aGUgdGltZXIgZm9yIHRoZSByZWNpcGllbnQncyBhZGRCQSByZXNwb25zZSAqLwogCW1vZF90aW1lcigmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLCBqaWZmaWVzICsgQUREQkFfUkVTUF9JTlRFUlZBTCk7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCkBAIC0zNDgsNiArNDAyLDI4IEBACiAJCQkJICAgICB0aWRfdHgtPnRpbWVvdXQpOwogfQogCisvKgorICogQWZ0ZXIgYWNjZXB0aW5nIHRoZSBBZGRCQSBSZXNwb25zZSB3ZSBhY3RpdmF0ZWQgYSB0aW1lciwKKyAqIHJlc2V0dGluZyBpdCBhZnRlciBlYWNoIGZyYW1lIHRoYXQgd2Ugc2VuZC4KKyAqLworc3RhdGljIHZvaWQgc3RhX3R4X2FnZ19zZXNzaW9uX3RpbWVyX2V4cGlyZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIG5vdCBhbiBlbGVnYW50IGRldG91ciwgYnV0IHRoZXJlIGlzIG5vIGNob2ljZSBhcyB0aGUgdGltZXIgcGFzc2VzCisJICogb25seSBvbmUgYXJndW1lbnQsIGFuZCB2YXJpb3VzIHN0YV9pbmZvIGFyZSBuZWVkZWQgaGVyZSwgc28gaW5pdAorCSAqIGZsb3cgaW4gc3RhX2luZm9fY3JlYXRlIGdpdmVzIHRoZSBUSUQgYXMgZGF0YSwgd2hpbGUgdGhlIHRpbWVyX3RvX2lkCisJICogYXJyYXkgZ2l2ZXMgdGhlIHN0YSB0aHJvdWdoIGNvbnRhaW5lcl9vZiAqLworCXU4ICpwdGlkID0gKHU4ICopZGF0YTsKKwl1OCAqdGltZXJfdG9faWQgPSBwdGlkIC0gKnB0aWQ7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YodGltZXJfdG9faWQsIHN0cnVjdCBzdGFfaW5mbywKKwkJCQkJIHRpbWVyX3RvX3RpZFswXSk7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAidHggc2Vzc2lvbiB0aW1lciBleHBpcmVkIG9uIHRpZCAlZFxuIiwgKHUxNikqcHRpZCk7CisjZW5kaWYKKworCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oJnN0YS0+c3RhLCAqcHRpZCk7Cit9CisKIGludCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhLCB1MTYgdGlkLAogCQkJCSAgdTE2IHRpbWVvdXQpCiB7CkBAIC0zNzUsNyArNDUxLDggQEAKIAlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKIAkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKIAkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKLQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQkxPQ0tfQkEpKSB7CkBAIC0zODYsNiArNDYzLDI3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qCisJICogODAyLjExbi0yMDA5IDExLjUuMS4xOiBJZiB0aGUgaW5pdGlhdGluZyBTVEEgaXMgYW4gSFQgU1RBLCBpcyBhCisJICogbWVtYmVyIG9mIGFuIElCU1MsIGFuZCBoYXMgbm8gb3RoZXIgZXhpc3RpbmcgQmxvY2sgQWNrIGFncmVlbWVudAorCSAqIHdpdGggdGhlIHJlY2lwaWVudCBTVEEsIHRoZW4gdGhlIGluaXRpYXRpbmcgU1RBIHNoYWxsIHRyYW5zbWl0IGEKKwkgKiBQcm9iZSBSZXF1ZXN0IGZyYW1lIHRvIHRoZSByZWNpcGllbnQgU1RBIGFuZCBzaGFsbCBub3QgdHJhbnNtaXQgYW4KKwkgKiBBRERCQSBSZXF1ZXN0IGZyYW1lIHVubGVzcyBpdCByZWNlaXZlcyBhIFByb2JlIFJlc3BvbnNlIGZyYW1lCisJICogZnJvbSB0aGUgcmVjaXBpZW50IHdpdGhpbiBkb3QxMUFEREJBRmFpbHVyZVRpbWVvdXQuCisJICoKKwkgKiBUaGUgcHJvYmUgcmVxdWVzdCBtZWNoYW5pc20gZm9yIEFEREJBIGlzIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQsCisJICogYnV0IHdlIG9ubHkgYnVpbGQgdXAgQmxvY2sgQWNrIHNlc3Npb24gd2l0aCBIVCBTVEFzLiBUaGlzIGluZm9ybWF0aW9uCisJICogaXMgc2V0IHdoZW4gd2UgcmVjZWl2ZSBhIGJzcyBpbmZvIGZyb20gYSBwcm9iZSByZXNwb25zZSBvciBhIGJlYWNvbi4KKwkgKi8KKwlpZiAoc3RhLT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwkgICAgIXN0YS0+c3RhLmh0X2NhcC5odF9zdXBwb3J0ZWQpIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJBIHJlcXVlc3QgZGVuaWVkIC0gSUJTUyBTVEEgJXBNIgorCQkgICAgICAgImRvZXMgbm90IGFkdmVydGlzZSBIVCBzdXBwb3J0XG4iLCBwdWJzdGEtPmFkZHIpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7CiAKIAkvKiB3ZSBoYXZlIHRyaWVkIHRvbyBtYW55IHRpbWVzLCByZWNlaXZlciBkb2VzIG5vdCB3YW50IEEtTVBEVSAqLwpAQCAtNDE3LDExICs1MTUsMTYgQEAKIAogCXRpZF90eC0+dGltZW91dCA9IHRpbWVvdXQ7CiAKLQkvKiBUeCB0aW1lciAqLworCS8qIHJlc3BvbnNlIHRpbWVyICovCiAJdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLmZ1bmN0aW9uID0gc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZDsKIAl0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOwogCWluaXRfdGltZXIoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CiAKKwkvKiB0eCB0aW1lciAqLworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5mdW5jdGlvbiA9IHN0YV90eF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkOworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnN0YS0+dGltZXJfdG9fdGlkW3RpZF07CisJaW5pdF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyKTsKKwogCS8qIGFzc2lnbiBhIGRpYWxvZyB0b2tlbiAqLwogCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7CiAJdGlkX3R4LT5kaWFsb2dfdG9rZW4gPSBzdGEtPmFtcGR1X21sbWUuZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjsKQEAgLTQ0MSwzOCArNTQ0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24pOwogCi0vKgotICogc3BsaWNlIHBhY2tldHMgZnJvbSB0aGUgU1RBJ3MgcGVuZGluZyB0byB0aGUgbG9jYWwgcGVuZGluZywKLSAqIHJlcXVpcmVzIGEgY2FsbCB0byBpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2ggbGF0ZXIKLSAqLwotc3RhdGljIHZvaWQgX19hY3F1aXJlcyhhZ2dfcXVldWUpCi1pZWVlODAyMTFfYWdnX3NwbGljZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJICAgICBzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHgsIHUxNiB0aWQpCi17Ci0JaW50IHF1ZXVlID0gaWVlZTgwMjExX2FjX2Zyb21fdGlkKHRpZCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWllZWU4MDIxMV9zdG9wX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKLQotCWlmIChXQVJOKCF0aWRfdHgsICJUSUQgJWQgZ29uZSBidXQgZXhwZWN0ZWQgd2hlbiBzcGxpY2luZyBhZ2dyZWdhdGVzIgotCQkJICAiIGZyb20gdGhlIHBlbmRpbmcgcXVldWVcbiIsIHRpZCkpCi0JCXJldHVybjsKLQotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0aWRfdHgtPnBlbmRpbmcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwotCQkvKiBjb3B5IG92ZXIgcmVtYWluaW5nIHBhY2tldHMgKi8KLQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJnRpZF90eC0+cGVuZGluZywKLQkJCQkJICAgJmxvY2FsLT5wZW5kaW5nW3F1ZXVlXSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX3JlbGVhc2VzKGFnZ19xdWV1ZSkKLWllZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgdTE2IHRpZCkKLXsKLQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9hZ2cobG9jYWwsIHRpZCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9hZ2dfdHhfb3BlcmF0aW9uYWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJCSBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgdTE2IHRpZCkKIHsKQEAgLTUyNiw3ICs1OTcsNyBAQAogCX0KIAogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHJhKTsKKwlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCByYSk7CiAJaWYgKCFzdGEpIHsKIAkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCkBAIC02NTUsNyArNzI2LDcgQEAKIAogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAotCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgcmEpOworCXN0YSA9IHN0YV9pbmZvX2dldF9ic3Moc2RhdGEsIHJhKTsKIAlpZiAoIXN0YSkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGZpbmQgc3RhdGlvbjogJXBNXG4iLCByYSk7CkBAIC03NTIsMTEgKzgyMywyNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZWxfdGltZXIoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyAic3dpdGNoZWQgb2ZmIGFkZEJBIHRpbWVyIGZvciB0aWQgJWRcbiIsIHRpZCk7CiAjZW5kaWYKKworCS8qCisJICogYWRkYmFfcmVzcF90aW1lciBtYXkgaGF2ZSBmaXJlZCBiZWZvcmUgd2UgZ290IGhlcmUsIGFuZAorCSAqIGNhdXNlZCBXQU5UX1NUT1AgdG8gYmUgc2V0LiBJZiB0aGUgc3RvcCB0aGVuIHdhcyBhbHJlYWR5CisJICogcHJvY2Vzc2VkIGZ1cnRoZXIsIFNUT1BQSU5HIG1pZ2h0IGJlIHNldC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RPUCwgJnRpZF90eC0+c3RhdGUpIHx8CisJICAgIHRlc3RfYml0KEhUX0FHR19TVEFURV9TVE9QUElORywgJnRpZF90eC0+c3RhdGUpKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiZ290IGFkZEJBIHJlc3AgZm9yIHRpZCAlZCBidXQgd2UgYWxyZWFkeSBnYXZlIHVwXG4iLAorCQkgICAgICAgdGlkKTsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKIAkvKgogCSAqIElFRUUgODAyLjExLTIwMDcgNy4zLjEuMTQ6CiAJICogSW4gYW4gQUREQkEgUmVzcG9uc2UgZnJhbWUsIHdoZW4gdGhlIFN0YXR1cyBDb2RlIGZpZWxkCkBAIC03NzcsNiArODY0LDExIEBACiAJCQlpZWVlODAyMTFfYWdnX3R4X29wZXJhdGlvbmFsKGxvY2FsLCBzdGEsIHRpZCk7CiAKIAkJc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA9IDA7CisKKwkJaWYgKHRpZF90eC0+dGltZW91dCkKKwkJCW1vZF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyLAorCQkJCSAgVFVfVE9fRVhQX1RJTUUodGlkX3R4LT50aW1lb3V0KSk7CisKIAl9IGVsc2UgewogCQlfX19pZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCBXTEFOX0JBQ0tfSU5JVElBVE9SLAogCQkJCQkJdHJ1ZSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggMDJhNDMyMy4uNjZhZDlkOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2NmZy5jCisrKyBiL25ldC9tYWM4MDIxMS9jZmcuYwpAQCAtMTAyLDYgKzEwMiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zZXRfbm9hY2tfbWFwKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTE2IG5vYWNrX21hcCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisKKwlzZGF0YS0+bm9hY2tfbWFwID0gbm9hY2tfbWFwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGllZWU4MDIxMV9hZGRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHU4IGtleV9pZHgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkciwKIAkJCSAgICAgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKQEAgLTQ5MSw2ICs1MDEsMzEgQEAKIAkJKHBhcmFtcy0+aGlkZGVuX3NzaWQgIT0gTkw4MDIxMV9ISURERU5fU1NJRF9OT1RfSU5fVVNFKTsKIH0KIAorc3RhdGljIGludCBpZWVlODAyMTFfc2V0X3Byb2JlX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgIHU4ICpyZXNwLCBzaXplX3QgcmVzcF9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ldywgKm9sZDsKKworCWlmICghcmVzcCB8fCAhcmVzcF9sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJb2xkID0gcnRubF9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5wcm9iZV9yZXNwKTsKKworCW5ldyA9IGRldl9hbGxvY19za2IocmVzcF9sZW4pOworCWlmICghbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShza2JfcHV0KG5ldywgcmVzcF9sZW4pLCByZXNwLCByZXNwX2xlbik7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2RhdGEtPnUuYXAucHJvYmVfcmVzcCwgbmV3KTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCWlmIChvbGQpCisJCWRldl9rZnJlZV9za2Iob2xkKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogVGhpcyBoYW5kbGVzIGJvdGggYWRkaW5nIGEgYmVhY29uIGFuZCBzZXR0aW5nIG5ldyBiZWFjb24gaW5mbwogICovCkBAIC01MDEsNiArNTM2LDcgQEAKIAlpbnQgbmV3X2hlYWRfbGVuLCBuZXdfdGFpbF9sZW47CiAJaW50IHNpemU7CiAJaW50IGVyciA9IC1FSU5WQUw7CisJdTMyIGNoYW5nZWQgPSAwOwogCiAJb2xkID0gcnRubF9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5iZWFjb24pOwogCkBAIC01ODQsMTEgKzYyMCwxNyBAQAogCiAJa2ZyZWUob2xkKTsKIAotCWllZWU4MDIxMV9jb25maWdfYXBfc3NpZChzZGF0YSwgcGFyYW1zKTsKKwllcnIgPSBpZWVlODAyMTFfc2V0X3Byb2JlX3Jlc3Aoc2RhdGEsIHBhcmFtcy0+cHJvYmVfcmVzcCwKKwkJCQkgICAgICAgcGFyYW1zLT5wcm9iZV9yZXNwX2xlbik7CisJaWYgKCFlcnIpCisJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQVBfUFJPQkVfUkVTUDsKIAotCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCB8Ci0JCQkJCQlCU1NfQ0hBTkdFRF9CRUFDT04gfAotCQkJCQkJQlNTX0NIQU5HRURfU1NJRCk7CisJaWVlZTgwMjExX2NvbmZpZ19hcF9zc2lkKHNkYXRhLCBwYXJhbXMpOworCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQgfAorCQkgICBCU1NfQ0hBTkdFRF9CRUFDT04gfAorCQkgICBCU1NfQ0hBTkdFRF9TU0lEOworCisJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOwogCXJldHVybiAwOwogfQogCkBAIC03MDQsMTAgKzc0NiwxMSBAQAogCW5ldGlmX3J4X25pKHNrYik7CiB9CiAKLXN0YXRpYyB2b2lkIHN0YV9hcHBseV9wYXJhbWV0ZXJzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKLQkJCQkgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCBzdGFfYXBwbHlfcGFyYW1ldGVycyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQlzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CisJaW50IHJldCA9IDA7CiAJdTMyIHJhdGVzOwogCWludCBpLCBqOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwpAQCAtNzE5LDEzICs3NjIsNTkgQEAKIAltYXNrID0gcGFyYW1zLT5zdGFfZmxhZ3NfbWFzazsKIAlzZXQgPSBwYXJhbXMtPnN0YV9mbGFnc19zZXQ7CiAKKwkvKgorCSAqIEluIG1lc2ggbW9kZSwgd2UgY2FuIGNsZWFyIEFVVEhFTlRJQ0FURUQgZmxhZyBidXQgbXVzdAorCSAqIGFsc28gbWFrZSBBU1NPQ0lBVEVEIGZvbGxvdyBhcHByb3ByaWF0ZWx5IGZvciB0aGUgZHJpdmVyCisJICogQVBJLiBTZWUgYWxzbyBiZWxvdywgYWZ0ZXIgQVVUSE9SSVpFRCBjaGFuZ2VzLgorCSAqLworCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpIHsKKwkJLyogY2ZnODAyMTEgc2hvdWxkIG5vdCBhbGxvdyB0aGlzIGluIG5vbi1tZXNoIG1vZGVzICovCisJCWlmIChXQVJOX09OKCFpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChzZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSAmJgorCQkgICAgIXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIKSkgeworCQkJcmV0ID0gc3RhX2luZm9fbW92ZV9zdGF0ZV9jaGVja2VkKHN0YSwKKwkJCQkJSUVFRTgwMjExX1NUQV9BVVRIKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IHN0YV9pbmZvX21vdmVfc3RhdGVfY2hlY2tlZChzdGEsCisJCQkJCUlFRUU4MDIxMV9TVEFfQVNTT0MpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkgewogCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkpCi0JCQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKKwkJCXJldCA9IHN0YV9pbmZvX21vdmVfc3RhdGVfY2hlY2tlZChzdGEsCisJCQkJCUlFRUU4MDIxMV9TVEFfQVVUSE9SSVpFRCk7CiAJCWVsc2UKLQkJCWNsZWFyX3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CisJCQlyZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLAorCQkJCQlJRUVFODAyMTFfU1RBX0FTU09DKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCisJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSkgeworCQkvKiBjZmc4MDIxMSBzaG91bGQgbm90IGFsbG93IHRoaXMgaW4gbm9uLW1lc2ggbW9kZXMgKi8KKwkJaWYgKFdBUk5fT04oIWllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCEoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpICYmCisJCSAgICB0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCkpIHsKKwkJCXJldCA9IHN0YV9pbmZvX21vdmVfc3RhdGVfY2hlY2tlZChzdGEsCisJCQkJCUlFRUU4MDIxMV9TVEFfQVVUSCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLAorCQkJCQlJRUVFODAyMTFfU1RBX05PTkUpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisKIAlpZiAobWFzayAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1NIT1JUX1BSRUFNQkxFKSkgewogCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfU0hPUlRfUFJFQU1CTEUpKQogCQkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfU0hPUlRfUFJFQU1CTEUpOwpAQCAtNzUwLDEzICs4MzksNiBAQAogCQkJY2xlYXJfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9NRlApOwogCX0KIAotCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpIHsKLQkJaWYgKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKQotCQkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCk7Ci0JCWVsc2UKLQkJCWNsZWFyX3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCk7Ci0JfQotCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB7CiAJCWlmIChzZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKQogCQkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKTsKQEAgLTgwMCw3ICs4ODIsNyBAQAogCX0KIAogCWlmIChwYXJhbXMtPmh0X2NhcGEpCi0JCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzYmFuZCwKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKIAkJCQkJCSAgcGFyYW1zLT5odF9jYXBhLAogCQkJCQkJICAmc3RhLT5zdGEuaHRfY2FwKTsKIApAQCAtODI4LDYgKzkxMCw4IEBACiAJCQl9CiAjZW5kaWYKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfYWRkX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTg1NCwyMiArOTM4LDI1IEBACiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hYykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogT25seSBURExTLXN1cHBvcnRpbmcgc3RhdGlvbnMgY2FuIGFkZCBURExTIHBlZXJzICovCi0JaWYgKChwYXJhbXMtPnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSAmJgotCSAgICAhKCh3aXBoeS0+ZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpICYmCi0JICAgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pKQotCQlyZXR1cm4gLUVOT1RTVVBQOwotCiAJc3RhID0gc3RhX2luZm9fYWxsb2Moc2RhdGEsIG1hYywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCk7Ci0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVNTT0MpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEgpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKIAotCXN0YV9hcHBseV9wYXJhbWV0ZXJzKGxvY2FsLCBzdGEsIHBhcmFtcyk7CisJZXJyID0gc3RhX2FwcGx5X3BhcmFtZXRlcnMobG9jYWwsIHN0YSwgcGFyYW1zKTsKKwlpZiAoZXJyKSB7CisJCXN0YV9pbmZvX2ZyZWUobG9jYWwsIHN0YSk7CisJCXJldHVybiBlcnI7CisJfQogCi0JcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCS8qCisJICogZm9yIFRETFMsIHJhdGUgY29udHJvbCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25seSB3aGVuIHN1cHBvcnRlZAorCSAqIHJhdGVzIGFyZSBrbm93bi4KKwkgKi8KKwlpZiAoIXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVIpKQorCQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKIAlsYXllcjJfdXBkYXRlID0gc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwKIAkJc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQOwpAQCAtOTEzLDE5ICsxMDAwLDE5IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqdmxhbnNkYXRhOwogCi0JcmN1X3JlYWRfbG9jaygpOworCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAogCXN0YSA9IHN0YV9pbmZvX2dldF9ic3Moc2RhdGEsIG1hYyk7CiAJaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQkvKiBUaGUgVERMUyBiaXQgY2Fubm90IGJlIHRvZ2dsZWQgYWZ0ZXIgdGhlIFNUQSB3YXMgYWRkZWQgKi8KLQlpZiAoKHBhcmFtcy0+c3RhX2ZsYWdzX21hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSAmJgotCSAgICAhIShwYXJhbXMtPnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSAhPQotCSAgICAhIXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVIpKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCS8qIGluIHN0YXRpb24gbW9kZSwgc3VwcG9ydGVkIHJhdGVzIGFyZSBvbmx5IHZhbGlkIHdpdGggVERMUyAqLworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCSAgICBwYXJhbXMtPnN1cHBvcnRlZF9yYXRlcyAmJgorCSAgICAhdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpIHsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTM0LDEzICsxMDIxLDEzIEBACiAKIAkJaWYgKHZsYW5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiAmJgogCQkgICAgdmxhbnNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJaWYgKHBhcmFtcy0+dmxhbi0+aWVlZTgwMjExX3B0ci0+dXNlXzRhZGRyKSB7CiAJCQlpZiAodmxhbnNkYXRhLT51LnZsYW4uc3RhKSB7Ci0JCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIApAQCAtOTUzLDcgKzEwNDAsMTAgQEAKIAogCXN0YV9hcHBseV9wYXJhbWV0ZXJzKGxvY2FsLCBzdGEsIHBhcmFtcyk7CiAKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikgJiYgcGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXMpCisJCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKworCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAJICAgIHBhcmFtcy0+c3RhX2ZsYWdzX21hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkKQEAgLTExNDUsNiArMTIzNSw4IEBACiB7CiAJdTggKm5ld19pZTsKIAljb25zdCB1OCAqb2xkX2llOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gY29udGFpbmVyX29mKGlmbXNoLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1Lm1lc2gpOwogCiAJLyogYWxsb2NhdGUgaW5mb3JtYXRpb24gZWxlbWVudHMgKi8KIAluZXdfaWUgPSBOVUxMOwpAQCAtMTE3MSw2ICsxMjYzLDEwIEBACiAJaWYgKHNldHVwLT5pc19zZWN1cmUpCiAJCWlmbXNoLT5zZWN1cml0eSB8PSBJRUVFODAyMTFfTUVTSF9TRUNfU0VDVVJFRDsKIAorCS8qIG1jYXN0IHJhdGUgc2V0dGluZyBpbiBNZXNoIE5vZGUgKi8KKwltZW1jcHkoc2RhdGEtPnZpZi5ic3NfY29uZi5tY2FzdF9yYXRlLCBzZXR1cC0+bWNhc3RfcmF0ZSwKKwkJCQkJCXNpemVvZihzZXR1cC0+bWNhc3RfcmF0ZSkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMTYsNiArMTMxMiw5IEBACiAJaWYgKF9jaGdfbWVzaF9hdHRyKE5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTCwgbWFzaykpCiAJCWNvbmYtPmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwgPQogCQkJbmNvbmYtPmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWw7CisJaWYgKF9jaGdfbWVzaF9hdHRyKE5MODAyMTFfTUVTSENPTkZfSFdNUF9QRVJSX01JTl9JTlRFUlZBTCwgbWFzaykpCisJCWNvbmYtPmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwgPQorCQkJbmNvbmYtPmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWw7CiAJaWYgKF9jaGdfbWVzaF9hdHRyKE5MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUUsCiAJCQkgICBtYXNrKSkKIAkJY29uZi0+ZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSA9CkBAIC0yNTMwLDEyICsyNjI5LDEzIEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBwZWVyKTsKLQlpZiAoc3RhKQorCWlmIChzdGEpIHsKIAkJcW9zID0gdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1dNRSk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAoIXN0YSkKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfSBlbHNlIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PTElOSzsKKwl9CiAKIAlpZiAocW9zKSB7CiAJCWZjID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfApAQCAtMjU4Miw2ICsyNjgyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKgoraWVlZTgwMjExX3dpcGh5X2dldF9jaGFubmVsKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCXJldHVybiBsb2NhbC0+b3Blcl9jaGFubmVsOworfQorCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIG1hYzgwMjExX2NvbmZpZ19vcHMgPSB7CiAJLmFkZF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfYWRkX2lmYWNlLAogCS5kZWxfdmlydHVhbF9pbnRmID0gaWVlZTgwMjExX2RlbF9pZmFjZSwKQEAgLTI2NDgsNCArMjc1Niw2IEBACiAJLnRkbHNfb3BlciA9IGllZWU4MDIxMV90ZGxzX29wZXIsCiAJLnRkbHNfbWdtdCA9IGllZWU4MDIxMV90ZGxzX21nbXQsCiAJLnByb2JlX2NsaWVudCA9IGllZWU4MDIxMV9wcm9iZV9jbGllbnQsCisJLmdldF9jaGFubmVsID0gaWVlZTgwMjExX3dpcGh5X2dldF9jaGFubmVsLAorCS5zZXRfbm9hY2tfbWFwID0gaWVlZTgwMjExX3NldF9ub2Fja19tYXAsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKaW5kZXggMDBjZWZjYi4uOTBiYWVhNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCkBAIC05Nyw0MCArOTcsNiBAQAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gbWFjODAyMTFfZm9ybWF0X2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsICIlZFxuIiwKLQkJCQkgICAgICBsb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbMTBdOwotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1ZltsZW5dID0gJ1wwJzsKLQotCWxvY2FsLT53aWZpX3dtZV9ub2Fja190ZXN0ID0gISFzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBub2Fja19vcHMgPSB7Ci0JLnJlYWQgPSBub2Fja19yZWFkLAotCS53cml0ZSA9IG5vYWNrX3dyaXRlLAotCS5vcGVuID0gbWFjODAyMTFfb3Blbl9maWxlX2dlbmVyaWMsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQogc3RhdGljIHNzaXplX3QgdWFwc2RfcXVldWVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0zOTgsNyArMzY0LDYgQEAKIAlERUJVR0ZTX0FERCh3ZXBfaXYpOwogCURFQlVHRlNfQUREKHF1ZXVlcyk7CiAJREVCVUdGU19BRERfTU9ERShyZXNldCwgMDIwMCk7Ci0JREVCVUdGU19BREQobm9hY2spOwogCURFQlVHRlNfQUREKHVhcHNkX3F1ZXVlcyk7CiAJREVCVUdGU19BREQodWFwc2RfbWF4X3NwX2xlbik7CiAJREVCVUdGU19BREQoY2hhbm5lbF90eXBlKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggOTM1MjgxOS4uMTc2YzA4ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTMyMSw2ICszMjEsNyBAQAogX19JRUVFODAyMTFfSUZfRklMRV9XKHRraXBfbWljX3Rlc3QpOwogCiAvKiBBUCBhdHRyaWJ1dGVzICovCitJRUVFODAyMTFfSUZfRklMRShudW1fc3RhX2F1dGhvcml6ZWQsIHUuYXAubnVtX3N0YV9hdXRob3JpemVkLCBBVE9NSUMpOwogSUVFRTgwMjExX0lGX0ZJTEUobnVtX3N0YV9wcywgdS5hcC5udW1fc3RhX3BzLCBBVE9NSUMpOwogSUVFRTgwMjExX0lGX0ZJTEUoZHRpbV9jb3VudCwgdS5hcC5kdGltX2NvdW50LCBERUMpOwogCkBAIC00MDUsNiArNDA2LDggQEAKIAkJdS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRpbWVvdXQsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsLAogCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsIERFQyk7CitJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsLAorCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lLAogCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMsCkBAIC00NTYsNiArNDU5LDcgQEAKIAlERUJVR0ZTX0FERChyY19yYXRlaWR4X21hc2tfMmdoeik7CiAJREVCVUdGU19BREQocmNfcmF0ZWlkeF9tYXNrXzVnaHopOwogCisJREVCVUdGU19BREQobnVtX3N0YV9hdXRob3JpemVkKTsKIAlERUJVR0ZTX0FERChudW1fc3RhX3BzKTsKIAlERUJVR0ZTX0FERChkdGltX2NvdW50KTsKIAlERUJVR0ZTX0FERChudW1fYnVmZmVyZWRfbXVsdGljYXN0KTsKQEAgLTUzNCw2ICs1MzgsNyBAQAogCU1FU0hQQVJBTVNfQUREKGRvdDExTWVzaE1heFBlZXJMaW5rcyk7CiAJTUVTSFBBUkFNU19BREQoZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsKTsKKwlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMpOwogCU1FU0hQQVJBTVNfQUREKHBhdGhfcmVmcmVzaF90aW1lKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKaW5kZXggYzVmMzQxNy4uMjQwNmIzZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKQEAgLTYzLDEwICs2MywxMCBAQAogCXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV8jI2ZsZykgPyAjZmxnICJcbiIgOiAiIgogCiAJaW50IHJlcyA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICIlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJCSAgICAiJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAogCQkJICAgIFRFU1QoQVVUSCksIFRFU1QoQVNTT0MpLCBURVNUKFBTX1NUQSksCiAJCQkgICAgVEVTVChQU19EUklWRVIpLCBURVNUKEFVVEhPUklaRUQpLAotCQkJICAgIFRFU1QoU0hPUlRfUFJFQU1CTEUpLCBURVNUKEFTU09DX0FQKSwKKwkJCSAgICBURVNUKFNIT1JUX1BSRUFNQkxFKSwKIAkJCSAgICBURVNUKFdNRSksIFRFU1QoV0RTKSwgVEVTVChDTEVBUl9QU19GSUxUKSwKIAkJCSAgICBURVNUKE1GUCksIFRFU1QoQkxPQ0tfQkEpLCBURVNUKFBTUE9MTCksCiAJCQkgICAgVEVTVChVQVBTRCksIFRFU1QoU1ApLCBURVNUKFRETFNfUEVFUiksCkBAIC0yNzQsOSArMjc0LDkgQEAKIAogCQlQUklOVF9IVF9DQVAoKGh0Yy0+Y2FwICYgQklUKDEwKSksICJIVCBEZWxheWVkIEJsb2NrIEFjayIpOwogCi0JCVBSSU5UX0hUX0NBUCgoaHRjLT5jYXAgJiBCSVQoMTEpKSwgIk1heCBBTVNEVSBsZW5ndGg6ICIKLQkJCSAgICAgIjM4MzkgYnl0ZXMiKTsKIAkJUFJJTlRfSFRfQ0FQKCEoaHRjLT5jYXAgJiBCSVQoMTEpKSwgIk1heCBBTVNEVSBsZW5ndGg6ICIKKwkJCSAgICAgIjM4MzkgYnl0ZXMiKTsKKwkJUFJJTlRfSFRfQ0FQKChodGMtPmNhcCAmIEJJVCgxMSkpLCAiTWF4IEFNU0RVIGxlbmd0aDogIgogCQkJICAgICAiNzkzNSBieXRlcyIpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaAppbmRleCBiMTJlZDUyLi5lODk2MGFlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKQEAgLTEwLDExICsxMCwyOSBAQAogCVdBUk5fT04oIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqCitnZXRfYnNzX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwKKwkJCQkgICAgIHUuYXApOworCisJcmV0dXJuIHNkYXRhOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWxvY2FsLT5vcHMtPnR4KCZsb2NhbC0+aHcsIHNrYik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfdHhfZnJhZ3Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpCit7CisJbG9jYWwtPm9wcy0+dHhfZnJhZ3MoJmxvY2FsLT5odywgdmlmLCBzdGEsIHNrYnMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkcnZfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJaW50IHJldDsKQEAgLTQxMyw2ICs0MzEsNyBAQAogCQkJCSAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogeworCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7CiAJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKIAogCXRyYWNlX2Rydl9zdGFfbm90aWZ5KGxvY2FsLCBzZGF0YSwgY21kLCBzdGEpOwpAQCAtNDI5LDYgKzQ0OCw3IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKIAljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOwogCiAJdHJhY2VfZHJ2X3N0YV9hZGQobG9jYWwsIHNkYXRhLCBzdGEpOwpAQCAtNDQ2LDYgKzQ2Niw3IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAorCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7CiAJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKIAogCXRyYWNlX2Rydl9zdGFfcmVtb3ZlKGxvY2FsLCBzZGF0YSwgc3RhKTsKQEAgLTUzOSw2ICs1NjAsNyBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7CiAJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKIAogCXRyYWNlX2Rydl9hbXBkdV9hY3Rpb24obG9jYWwsIHNkYXRhLCBhY3Rpb24sIHN0YSwgdGlkLCBzc24sIGJ1Zl9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaCBiL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaAppbmRleCAyYWY0ZmNhLi42ZTlkZjhmIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci10cmFjZS5oCkBAIC01LDE3ICs1LDYgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogCi0jaWYgIWRlZmluZWQoQ09ORklHX01BQzgwMjExX0RSSVZFUl9BUElfVFJBQ0VSKSB8fCBkZWZpbmVkKF9fQ0hFQ0tFUl9fKQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCAuLi4pIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8gIyMgbmFtZShwcm90bykge30KLSN1bmRlZiBERUNMQVJFX0VWRU5UX0NMQVNTCi0jZGVmaW5lIERFQ0xBUkVfRVZFTlRfQ0xBU1MoLi4uKQotI3VuZGVmIERFRklORV9FVkVOVAotI2RlZmluZSBERUZJTkVfRVZFTlQoZXZ0X2NsYXNzLCBuYW1lLCBwcm90bywgLi4uKSBcCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfICMjIG5hbWUocHJvdG8pIHt9Ci0jZW5kaWYKLQogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0gbWFjODAyMTEKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2h0LmMgYi9uZXQvbWFjODAyMTEvaHQuYwppbmRleCA5ODhjN2VjLi5mMjVmZmY3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaHQuYworKysgYi9uZXQvbWFjODAyMTEvaHQuYwpAQCAtMTQsMTEgKzE0LDg5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAicmF0ZS5oIgogCi12b2lkIGllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKK2Jvb2wgaWVlZTgwMTExX2NmZ19vdmVycmlkZV9kaXNhYmxlc19odDQwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCWNvbnN0IF9fbGUxNiBmbGcgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7CisJaWYgKChzZGF0YS0+dS5tZ2QuaHRfY2FwYV9tYXNrLmNhcF9pbmZvICYgZmxnKSAmJgorCSAgICAhKHNkYXRhLT51Lm1nZC5odF9jYXBhLmNhcF9pbmZvICYgZmxnKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBfX2NoZWNrX2h0Y2FwX2Rpc2FibGUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKKwkJCQkgIHUxNiBmbGFnKQoreworCV9fbGUxNiBsZV9mbGFnID0gY3B1X3RvX2xlMTYoZmxhZyk7CisJaWYgKHNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2suY2FwX2luZm8gJiBsZV9mbGFnKSB7CisJCWlmICghKHNkYXRhLT51Lm1nZC5odF9jYXBhLmNhcF9pbmZvICYgbGVfZmxhZykpCisJCQlodF9jYXAtPmNhcCAmPSB+ZmxhZzsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2FwcGx5X2h0Y2FwX292ZXJyaWRlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKQoreworCXU4ICpzY2FwcyA9ICh1OCAqKSgmc2RhdGEtPnUubWdkLmh0X2NhcGEubWNzLnJ4X21hc2spOworCXU4ICpzbWFzayA9ICh1OCAqKSgmc2RhdGEtPnUubWdkLmh0X2NhcGFfbWFzay5tY3MucnhfbWFzayk7CisJaW50IGk7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJLyogQVAgaW50ZXJmYWNlcyBjYWxsIHRoaXMgY29kZSB3aGVuIGFkZGluZyBuZXcgc3RhdGlvbnMsCisJCSAqIHNvIGp1c3Qgc2lsZW50bHkgaWdub3JlIG5vbiBzdGF0aW9uIGludGVyZmFjZXMuCisJCSAqLworCQlyZXR1cm47CisJfQorCisJLyogTk9URTogIElmIHlvdSBhZGQgbW9yZSBvdmVyLXJpZGVzIGhlcmUsIHVwZGF0ZSByZWdpc3Rlcl9odworCSAqIGh0X2NhcGFfbW9kX21zayBsb2dpYyBpbiBtYWluLmMgYXMgd2VsbC4KKwkgKiBBbmQsIGlmIHRoaXMgbWV0aG9kIGNhbiBldmVyIGNoYW5nZSBodF9jYXAuaHRfc3VwcG9ydGVkLCBmaXgKKwkgKiB0aGUgY2hlY2sgaW4gaWVlZTgwMjExX2FkZF9odF9pZS4KKwkgKi8KKworCS8qIGNoZWNrIGZvciBIVCBvdmVyLXJpZGVzLCBNQ1MgcmF0ZXMgZmlyc3QuICovCisJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU47IGkrKykgeworCQl1OCBtID0gc21hc2tbaV07CisJCWh0X2NhcC0+bWNzLnJ4X21hc2tbaV0gJj0gfm07IC8qIHR1cm4gb2ZmIGFsbCBtYXNrZWQgYml0cyAqLworCQkvKiBBZGQgYmFjayByYXRlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgKi8KKwkJaHRfY2FwLT5tY3MucnhfbWFza1tpXSB8PSAobSAmIHNjYXBzW2ldKTsKKwl9CisKKwkvKiBGb3JjZSByZW1vdmFsIG9mIEhULTQwIGNhcGFiaWxpdGllcz8gKi8KKwlfX2NoZWNrX2h0Y2FwX2Rpc2FibGUoc2RhdGEsIGh0X2NhcCwgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApOworCV9fY2hlY2tfaHRjYXBfZGlzYWJsZShzZGF0YSwgaHRfY2FwLCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCk7CisKKwkvKiBBbGxvdyB1c2VyIHRvIGRpc2FibGUgdGhlIG1heC1BTVNEVSBiaXQuICovCisJX19jaGVja19odGNhcF9kaXNhYmxlKHNkYXRhLCBodF9jYXAsIElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVKTsKKworCS8qIEFsbG93IHVzZXIgdG8gZGVjcmVhc2UgQU1QRFUgZmFjdG9yICovCisJaWYgKHNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2suYW1wZHVfcGFyYW1zX2luZm8gJgorCSAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpIHsKKwkJdTggbiA9IHNkYXRhLT51Lm1nZC5odF9jYXBhLmFtcGR1X3BhcmFtc19pbmZvCisJCQkmIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKKwkJaWYgKG4gPCBodF9jYXAtPmFtcGR1X2ZhY3RvcikKKwkJCWh0X2NhcC0+YW1wZHVfZmFjdG9yID0gbjsKKwl9CisKKwkvKiBBbGxvdyB0aGUgdXNlciB0byBpbmNyZWFzZSBBTVBEVSBkZW5zaXR5LiAqLworCWlmIChzZGF0YS0+dS5tZ2QuaHRfY2FwYV9tYXNrLmFtcGR1X3BhcmFtc19pbmZvICYKKwkgICAgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSkgeworCQl1OCBuID0gKHNkYXRhLT51Lm1nZC5odF9jYXBhLmFtcGR1X3BhcmFtc19pbmZvICYKKwkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpCisJCQk+PiBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZX1NISUZUOworCQlpZiAobiA+IGh0X2NhcC0+YW1wZHVfZGVuc2l0eSkKKwkJCWh0X2NhcC0+YW1wZHVfZGVuc2l0eSA9IG47CisJfQorfQorCisKK3ZvaWQgaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKIAkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9pZSwKIAkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApCiB7CkBAIC0xMDIsNiArMTgwLDEyIEBACiAJLyogaGFuZGxlIE1DUyByYXRlIDMyIHRvbyAqLwogCWlmIChzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrWzMyLzhdICYgaHRfY2FwX2llLT5tY3MucnhfbWFza1szMi84XSAmIDEpCiAJCWh0X2NhcC0+bWNzLnJ4X21hc2tbMzIvOF0gfD0gMTsKKworCS8qCisJICogSWYgdXNlciBoYXMgc3BlY2lmaWVkIGNhcGFiaWxpdHkgb3Zlci1yaWRlcywgdGFrZSBjYXJlCisJICogb2YgdGhhdCBoZXJlLgorCSAqLworCWllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc2RhdGEsIGh0X2NhcCk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX3N0YV90ZWFyX2Rvd25fQkFfc2Vzc2lvbnMoc3RydWN0IHN0YV9pbmZvICpzdGEsIGJvb2wgdHgpCkBAIC0yMDAsNiArMjg0LDggQEAKIAkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAllbHNlIGlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJbWVtY3B5KG1nbXQtPmJzc2lkLCBzZGF0YS0+dS5tZ2QuYnNzaWQsIEVUSF9BTEVOKTsKKwllbHNlIGlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUuaWJzcy5ic3NpZCwgRVRIX0FMRU4pOwogCiAJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKIAkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKQEAgLTIxNCw3ICszMDAsNyBAQAogCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucGFyYW1zID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKIAltZ210LT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlID0gY3B1X3RvX2xlMTYocmVhc29uX2NvZGUpOwogCi0JaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgc2tiKTsKKwlpZWVlODAyMTFfdHhfc2tiX3RpZChzZGF0YSwgc2tiLCB0aWQpOwogfQogCiB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX2RlbGJhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lic3MuYyBiL25ldC9tYWM4MDIxMS9pYnNzLmMKaW5kZXggZWRlOWE4Yi4uZjhhMzJiZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lic3MuYworKysgYi9uZXQvbWFjODAyMTEvaWJzcy5jCkBAIC03Nyw2ICs3Nyw3IEBACiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCXUzMiBic3NfY2hhbmdlOwogCXU4IHN1cHBfcmF0ZXNbSUVFRTgwMjExX01BWF9TVVBQX1JBVEVTXTsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlmaWJzcy0+bXR4KTsKIApAQCAtOTcsNiArOTgsNyBAQAogCS8qIGlmIG1lcmdpbmcsIGluZGljYXRlIHRvIGRyaXZlciB0aGF0IHdlIGxlYXZlIHRoZSBvbGQgSUJTUyAqLwogCWlmIChzZGF0YS0+dmlmLmJzc19jb25mLmlic3Nfam9pbmVkKSB7CiAJCXNkYXRhLT52aWYuYnNzX2NvbmYuaWJzc19qb2luZWQgPSBmYWxzZTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoc2RhdGEtPmRldik7CiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9JQlNTKTsKIAl9CiAKQEAgLTEwNCw4ICsxMDYsMTYgQEAKIAogCXNkYXRhLT5kcm9wX3VuZW5jcnlwdGVkID0gY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZID8gMSA6IDA7CiAKLQlsb2NhbC0+b3Blcl9jaGFubmVsID0gY2hhbjsKLQlXQVJOX09OKCFpZWVlODAyMTFfc2V0X2NoYW5uZWxfdHlwZShsb2NhbCwgc2RhdGEsIE5MODAyMTFfQ0hBTl9OT19IVCkpOworCWNoYW5uZWxfdHlwZSA9IGlmaWJzcy0+Y2hhbm5lbF90eXBlOworCWlmIChjaGFubmVsX3R5cGUgPiBOTDgwMjExX0NIQU5fSFQyMCAmJgorCSAgICAhY2ZnODAyMTFfY2FuX2JlYWNvbl9zZWNfY2hhbihsb2NhbC0+aHcud2lwaHksIGNoYW4sIGNoYW5uZWxfdHlwZSkpCisJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDIwOworCWlmICghaWVlZTgwMjExX3NldF9jaGFubmVsX3R5cGUobG9jYWwsIHNkYXRhLCBjaGFubmVsX3R5cGUpKSB7CisJCS8qIGNhbiBvbmx5IGZhaWwgZHVlIHRvIEhUNDArLy0gbWlzbWF0Y2ggKi8KKwkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX0hUMjA7CisJCVdBUk5fT04oIWllZWU4MDIxMV9zZXRfY2hhbm5lbF90eXBlKGxvY2FsLCBzZGF0YSwKKwkJCQkJCSAgICBOTDgwMjExX0NIQU5fSFQyMCkpOworCX0KIAlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCk7CiAKIAlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbY2hhbi0+YmFuZF07CkBAIC0xNzEsNiArMTgxLDE5IEBACiAJCW1lbWNweShza2JfcHV0KHNrYiwgaWZpYnNzLT5pZV9sZW4pLAogCQkgICAgICAgaWZpYnNzLT5pZSwgaWZpYnNzLT5pZV9sZW4pOwogCisJLyogYWRkIEhUIGNhcGFiaWxpdHkgYW5kIGluZm9ybWF0aW9uIElFcyAqLworCWlmIChjaGFubmVsX3R5cGUgJiYgc2JhbmQtPmh0X2NhcC5odF9zdXBwb3J0ZWQpIHsKKwkJcG9zID0gc2tiX3B1dChza2IsIDQgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pKTsKKwkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZzYmFuZC0+aHRfY2FwLAorCQkJCQkJc2JhbmQtPmh0X2NhcC5jYXApOworCQlwb3MgPSBpZWVlODAyMTFfaWVfYnVpbGRfaHRfaW5mbyhwb3MsCisJCQkJCQkgJnNiYW5kLT5odF9jYXAsCisJCQkJCQkgY2hhbiwKKwkJCQkJCSBjaGFubmVsX3R5cGUpOworCX0KKwogCWlmIChsb2NhbC0+aHcucXVldWVzID49IDQpIHsKIAkJcG9zID0gc2tiX3B1dChza2IsIDkpOwogCQkqcG9zKysgPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM7CkBAIC0xOTQsNiArMjE3LDcgQEAKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0JFQUNPTjsKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEOwogCWJzc19jaGFuZ2UgfD0gQlNTX0NIQU5HRURfQkFTSUNfUkFURVM7CisJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9IVDsKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0lCU1M7CiAJc2RhdGEtPnZpZi5ic3NfY29uZi5pYnNzX2pvaW5lZCA9IHRydWU7CiAJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGJzc19jaGFuZ2UpOwpAQCAtMjA3LDYgKzIzMSw3IEBACiAJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZShsb2NhbC0+aHcud2lwaHksIGxvY2FsLT5ody5jb25mLmNoYW5uZWwsCiAJCQkJCW1nbXQsIHNrYi0+bGVuLCAwLCBHRlBfS0VSTkVMKTsKIAljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisJbmV0aWZfY2Fycmllcl9vbihzZGF0YS0+ZGV2KTsKIAljZmc4MDIxMV9pYnNzX2pvaW5lZChzZGF0YS0+ZGV2LCBpZmlic3MtPmJzc2lkLCBHRlBfS0VSTkVMKTsKIH0KIApAQCAtMjUwLDYgKzI3NSw4MCBAQAogCQkJCSAgY2Jzcy0+dHNmKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzdGFfaW5mbyAqaWVlZTgwMjExX2lic3NfZmluaXNoX3N0YShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKKwlfX2FjcXVpcmVzKFJDVSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CisJdTggYWRkcltFVEhfQUxFTl07CisKKwltZW1jcHkoYWRkciwgc3RhLT5zdGEuYWRkciwgRVRIX0FMRU4pOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKKwl3aXBoeV9kZWJ1ZyhzZGF0YS0+bG9jYWwtPmh3LndpcGh5LAorCQkgICAgIkFkZGluZyBuZXcgSUJTUyBzdGF0aW9uICVwTSAoZGV2PSVzKVxuIiwKKwkJICAgIGFkZHIsIHNkYXRhLT5uYW1lKTsKKyNlbmRpZgorCisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSCk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVNTT0MpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQpOworCisJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCisJLyogSWYgaXQgZmFpbHMsIG1heWJlIHdlIHJhY2VkIGFub3RoZXIgaW5zZXJ0aW9uPyAqLworCWlmIChzdGFfaW5mb19pbnNlcnRfcmN1KHN0YSkpCisJCXJldHVybiBzdGFfaW5mb19nZXQoc2RhdGEsIGFkZHIpOworCXJldHVybiBzdGE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gKgoraWVlZTgwMjExX2lic3NfYWRkX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJICAgICAgIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKmFkZHIsCisJCSAgICAgICB1MzIgc3VwcF9yYXRlcykKKwlfX2FjcXVpcmVzKFJDVSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgKmlmaWJzcyA9ICZzZGF0YS0+dS5pYnNzOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCWludCBiYW5kID0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZDsKKworCS8qCisJICogWFhYOiBDb25zaWRlciByZW1vdmluZyB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeSBhbmQKKwkgKiAJYWxsb3cgbmV3IG9uZSB0byBiZSBhZGRlZC4KKwkgKi8KKwlpZiAobG9jYWwtPm51bV9zdGEgPj0gSUVFRTgwMjExX0lCU1NfTUFYX1NUQV9FTlRSSUVTKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIHJvb20gZm9yIGEgbmV3IElCU1MgU1RBIGVudHJ5ICVwTVxuIiwKKwkJCSAgICAgICBzZGF0YS0+bmFtZSwgYWRkcik7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGlmaWJzcy0+c3RhdGUgPT0gSUVFRTgwMjExX0lCU1NfTUxNRV9TRUFSQ0gpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGJzc2lkLCBzZGF0YS0+dS5pYnNzLmJzc2lkKSkgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0YSA9IHN0YV9pbmZvX2FsbG9jKHNkYXRhLCBhZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YSkgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0YS0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwkvKiBtYWtlIHN1cmUgbWFuZGF0b3J5IHJhdGVzIGFyZSBhbHdheXMgYWRkZWQgKi8KKwlzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdID0gc3VwcF9yYXRlcyB8CisJCQlpZWVlODAyMTFfbWFuZGF0b3J5X3JhdGVzKGxvY2FsLCBiYW5kKTsKKworCXJldHVybiBpZWVlODAyMTFfaWJzc19maW5pc2hfc3RhKHN0YSk7Cit9CisKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9yeF9ic3NfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKIAkJCQkgIHNpemVfdCBsZW4sCkBAIC0yNjYsNiArMzY1LDggQEAKIAl1NjQgYmVhY29uX3RpbWVzdGFtcCwgcnhfdGltZXN0YW1wOwogCXUzMiBzdXBwX3JhdGVzID0gMDsKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSByeF9zdGF0dXMtPmJhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdOworCWJvb2wgcmF0ZXNfdXBkYXRlZCA9IGZhbHNlOwogCiAJaWYgKGVsZW1zLT5kc19wYXJhbXMgJiYgZWxlbXMtPmRzX3BhcmFtc19sZW4gPT0gMSkKIAkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShlbGVtcy0+ZHNfcGFyYW1zWzBdLApAQCAtMzA1LDE3ICs0MDYsNTEgQEAKIAkJCQkJCXByZXZfcmF0ZXMsCiAJCQkJCQlzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdKTsKICNlbmRpZgotCQkJCQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CisJCQkJCXJhdGVzX3VwZGF0ZWQgPSB0cnVlOwogCQkJCX0KLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlzdGEgPSBpZWVlODAyMTFfaWJzc19hZGRfc3RhKHNkYXRhLCBtZ210LT5ic3NpZCwKLQkJCQkJCW1nbXQtPnNhLCBzdXBwX3JhdGVzLAotCQkJCQkJR0ZQX0FUT01JQyk7CisJCQkJCQltZ210LT5zYSwgc3VwcF9yYXRlcyk7CisJCQl9CiAJCX0KIAogCQlpZiAoc3RhICYmIGVsZW1zLT53bW1faW5mbykKIAkJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1dNRSk7CiAKKwkJaWYgKHN0YSAmJiBlbGVtcy0+aHRfaW5mb19lbGVtICYmIGVsZW1zLT5odF9jYXBfZWxlbSAmJgorCQkgICAgc2RhdGEtPnUuaWJzcy5jaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX05PX0hUKSB7CisJCQkvKiB3ZSBib3RoIHVzZSBIVCAqLworCQkJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwIHN0YV9odF9jYXBfbmV3OworCQkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUgPQorCQkJCWllZWU4MDIxMV9odF9pbmZvX3RvX2NoYW5uZWxfdHlwZSgKKwkJCQkJCQllbGVtcy0+aHRfaW5mb19lbGVtKTsKKworCQkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKKwkJCQkJCQkgIGVsZW1zLT5odF9jYXBfZWxlbSwKKwkJCQkJCQkgICZzdGFfaHRfY2FwX25ldyk7CisKKwkJCS8qCisJCQkgKiBmYWxsIGJhY2sgdG8gSFQyMCBpZiB3ZSBkb24ndCB1c2Ugb3IgdXNlCisJCQkgKiB0aGUgb3RoZXIgZXh0ZW5zaW9uIGNoYW5uZWwKKwkJCSAqLworCQkJaWYgKChjaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX0hUNDBNSU5VUyB8fAorCQkJICAgICBjaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX0hUNDBQTFVTKSAmJgorCQkJICAgIGNoYW5uZWxfdHlwZSAhPSBzZGF0YS0+dS5pYnNzLmNoYW5uZWxfdHlwZSkKKwkJCQlzdGFfaHRfY2FwX25ldy5jYXAgJj0KKwkJCQkJfklFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOworCisJCQlpZiAobWVtY21wKCZzdGEtPnN0YS5odF9jYXAsICZzdGFfaHRfY2FwX25ldywKKwkJCQkgICBzaXplb2Yoc3RhX2h0X2NhcF9uZXcpKSkgeworCQkJCW1lbWNweSgmc3RhLT5zdGEuaHRfY2FwLCAmc3RhX2h0X2NhcF9uZXcsCisJCQkJICAgICAgIHNpemVvZihzdGFfaHRfY2FwX25ldykpOworCQkJCXJhdGVzX3VwZGF0ZWQgPSB0cnVlOworCQkJfQorCQl9CisKKwkJaWYgKHN0YSAmJiByYXRlc191cGRhdGVkKQorCQkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIApAQCAtNDA0LDIxICs1MzksMTcgQEAKIAkJaWVlZTgwMjExX3N0YV9qb2luX2lic3Moc2RhdGEsIGJzcyk7CiAJCXN1cHBfcmF0ZXMgPSBpZWVlODAyMTFfc3RhX2dldF9yYXRlcyhsb2NhbCwgZWxlbXMsIGJhbmQpOwogCQlpZWVlODAyMTFfaWJzc19hZGRfc3RhKHNkYXRhLCBtZ210LT5ic3NpZCwgbWdtdC0+c2EsCi0JCQkJICAgICAgIHN1cHBfcmF0ZXMsIEdGUF9LRVJORUwpOworCQkJCSAgICAgICBzdXBwX3JhdGVzKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiAgcHV0X2JzczoKIAlpZWVlODAyMTFfcnhfYnNzX3B1dChsb2NhbCwgYnNzKTsKIH0KIAotLyoKLSAqIEFkZCBhIG5ldyBJQlNTIHN0YXRpb24sIHdpbGwgYWxzbyBiZSBjYWxsZWQgYnkgdGhlIFJYIGNvZGUgd2hlbiwKLSAqIGluIElCU1MgbW9kZSwgcmVjZWl2aW5nIGEgZnJhbWUgZnJvbSBhIHlldC11bmtub3duIHN0YXRpb24sIGhlbmNlCi0gKiBtdXN0IGJlIGNhbGxhYmxlIGluIGF0b21pYyBjb250ZXh0LgotICovCi1zdHJ1Y3Qgc3RhX2luZm8gKmllZWU4MDIxMV9pYnNzX2FkZF9zdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCXU4ICpic3NpZCwgdTggKmFkZHIsIHUzMiBzdXBwX3JhdGVzLAotCQkJCQlnZnBfdCBnZnApCit2b2lkIGllZWU4MDIxMV9pYnNzX3J4X25vX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKmFkZHIsCisJCQkgICAgICB1MzIgc3VwcF9yYXRlcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgKmlmaWJzcyA9ICZzZGF0YS0+dS5pYnNzOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwpAQCAtNDMzLDM3ICs1NjQsMjkgQEAKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gcm9vbSBmb3IgYSBuZXcgSUJTUyBTVEEgZW50cnkgJXBNXG4iLAogCQkJICAgICAgIHNkYXRhLT5uYW1lLCBhZGRyKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybjsKIAl9CiAKIAlpZiAoaWZpYnNzLT5zdGF0ZSA9PSBJRUVFODAyMTFfSUJTU19NTE1FX1NFQVJDSCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybjsKIAogCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoYnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQpKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKLQl3aXBoeV9kZWJ1Zyhsb2NhbC0+aHcud2lwaHksICJBZGRpbmcgbmV3IElCU1Mgc3RhdGlvbiAlcE0gKGRldj0lcylcbiIsCi0JCSAgICBhZGRyLCBzZGF0YS0+bmFtZSk7Ci0jZW5kaWYKLQotCXN0YSA9IHN0YV9pbmZvX2FsbG9jKHNkYXRhLCBhZGRyLCBnZnApOworCXN0YSA9IHN0YV9pbmZvX2FsbG9jKHNkYXRhLCBhZGRyLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXN0YSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybjsKIAogCXN0YS0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CiAKIAkvKiBtYWtlIHN1cmUgbWFuZGF0b3J5IHJhdGVzIGFyZSBhbHdheXMgYWRkZWQgKi8KIAlzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdID0gc3VwcF9yYXRlcyB8CiAJCQlpZWVlODAyMTFfbWFuZGF0b3J5X3JhdGVzKGxvY2FsLCBiYW5kKTsKIAotCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKLQotCS8qIElmIGl0IGZhaWxzLCBtYXliZSB3ZSByYWNlZCBhbm90aGVyIGluc2VydGlvbj8gKi8KLQlpZiAoc3RhX2luZm9faW5zZXJ0KHN0YSkpCi0JCXJldHVybiBzdGFfaW5mb19nZXQoc2RhdGEsIGFkZHIpOwotCXJldHVybiBzdGE7CisJc3Bpbl9sb2NrKCZpZmlic3MtPmluY29tcGxldGVfbG9jayk7CisJbGlzdF9hZGQoJnN0YS0+bGlzdCwgJmlmaWJzcy0+aW5jb21wbGV0ZV9zdGF0aW9ucyk7CisJc3Bpbl91bmxvY2soJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmc2RhdGEtPndvcmspOwogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxMV9zdGFfYWN0aXZlX2lic3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCkBAIC04MDIsNiArOTI1LDcgQEAKIHZvaWQgaWVlZTgwMjExX2lic3Nfd29yayhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgKmlmaWJzcyA9ICZzZGF0YS0+dS5pYnNzOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJbXV0ZXhfbG9jaygmaWZpYnNzLT5tdHgpOwogCkBAIC04MTMsNiArOTM3LDE5IEBACiAJaWYgKCFpZmlic3MtPnNzaWRfbGVuKQogCQlnb3RvIG91dDsKIAorCXNwaW5fbG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmaWZpYnNzLT5pbmNvbXBsZXRlX3N0YXRpb25zKSkgeworCQlzdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpZmlic3MtPmluY29tcGxldGVfc3RhdGlvbnMsCisJCQkJICAgICAgIHN0cnVjdCBzdGFfaW5mbywgbGlzdCk7CisJCWxpc3RfZGVsKCZzdGEtPmxpc3QpOworCQlzcGluX3VubG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCisJCWllZWU4MDIxMV9pYnNzX2ZpbmlzaF9zdGEoc3RhKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNwaW5fbG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCiAJc3dpdGNoIChpZmlic3MtPnN0YXRlKSB7CiAJY2FzZSBJRUVFODAyMTFfSUJTU19NTE1FX1NFQVJDSDoKIAkJaWVlZTgwMjExX3N0YV9maW5kX2lic3Moc2RhdGEpOwpAQCAtODcxLDYgKzEwMDgsOCBAQAogCXNldHVwX3RpbWVyKCZpZmlic3MtPnRpbWVyLCBpZWVlODAyMTFfaWJzc190aW1lciwKIAkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7CiAJbXV0ZXhfaW5pdCgmaWZpYnNzLT5tdHgpOworCUlOSVRfTElTVF9IRUFEKCZpZmlic3MtPmluY29tcGxldGVfc3RhdGlvbnMpOworCXNwaW5fbG9ja19pbml0KCZpZmlic3MtPmluY29tcGxldGVfbG9jayk7CiB9CiAKIC8qIHNjYW4gZmluaXNoZWQgbm90aWZpY2F0aW9uICovCkBAIC04OTQsMTIgKzEwMzMsMTggQEAKIAkJCXN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGNoYW5nZWQgPSAwOwogCiAJc2tiID0gZGV2X2FsbG9jX3NrYihzZGF0YS0+bG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tICsKLQkJCSAgICAzNiAvKiBiaXRyYXRlcyAqLyArCi0JCQkgICAgMzQgLyogU1NJRCAqLyArCi0JCQkgICAgMyAgLyogRFMgcGFyYW1zICovICsKLQkJCSAgICA0ICAvKiBJQlNTIHBhcmFtcyAqLyArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArCisJCQkgICAgMTIgLyogc3RydWN0IGllZWU4MDIxMV9tZ210LnUuYmVhY29uICovICsKKwkJCSAgICAyICsgSUVFRTgwMjExX01BWF9TU0lEX0xFTiAvKiBtYXggU1NJRCAqLyArCisJCQkgICAgMiArIDggLyogbWF4IFN1cHBvcnRlZCBSYXRlcyAqLyArCisJCQkgICAgMyAvKiBtYXggRFMgcGFyYW1zICovICsKKwkJCSAgICA0IC8qIElCU1MgcGFyYW1zICovICsKKwkJCSAgICAyICsgKElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUyAtIDgpICsKKwkJCSAgICAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSArCisJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pICsKIAkJCSAgICBwYXJhbXMtPmllX2xlbik7CiAJaWYgKCFza2IpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTIwLDEzICsxMDY1LDE4IEBACiAJc2RhdGEtPnZpZi5ic3NfY29uZi5iZWFjb25faW50ID0gcGFyYW1zLT5iZWFjb25faW50ZXJ2YWw7CiAKIAlzZGF0YS0+dS5pYnNzLmNoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWw7CisJc2RhdGEtPnUuaWJzcy5jaGFubmVsX3R5cGUgPSBwYXJhbXMtPmNoYW5uZWxfdHlwZTsKIAlzZGF0YS0+dS5pYnNzLmZpeGVkX2NoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWxfZml4ZWQ7CiAKIAkvKiBmaXggb3Vyc2VsdmVzIHRvIHRoYXQgY2hhbm5lbCBub3cgYWxyZWFkeSAqLwogCWlmIChwYXJhbXMtPmNoYW5uZWxfZml4ZWQpIHsKIAkJc2RhdGEtPmxvY2FsLT5vcGVyX2NoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWw7Ci0JCVdBUk5fT04oIWllZWU4MDIxMV9zZXRfY2hhbm5lbF90eXBlKHNkYXRhLT5sb2NhbCwgc2RhdGEsCi0JCQkJCQkgICAgTkw4MDIxMV9DSEFOX05PX0hUKSk7CisJCWlmICghaWVlZTgwMjExX3NldF9jaGFubmVsX3R5cGUoc2RhdGEtPmxvY2FsLCBzZGF0YSwKKwkJCQkJICAgICAgIHBhcmFtcy0+Y2hhbm5lbF90eXBlKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+dS5pYnNzLm10eCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJaWYgKHBhcmFtcy0+aWUpIHsKQEAgLTk0OSw2ICsxMDk5LDIzIEBACiAJaWVlZTgwMjExX3JlY2FsY19pZGxlKHNkYXRhLT5sb2NhbCk7CiAJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPm10eCk7CiAKKwkvKgorCSAqIDgwMi4xMW4tMjAwOSA5LjEzLjMuMTogSW4gYW4gSUJTUywgdGhlIEhUIFByb3RlY3Rpb24gZmllbGQgaXMKKwkgKiByZXNlcnZlZCwgYnV0IGFuIEhUIFNUQSBzaGFsbCBwcm90ZWN0IEhUIHRyYW5zbWlzc2lvbnMgYXMgdGhvdWdoCisJICogdGhlIEhUIFByb3RlY3Rpb24gZmllbGQgd2VyZSBzZXQgdG8gbm9uLUhUIG1peGVkIG1vZGUuCisJICoKKwkgKiBJbiBhbiBJQlNTLCB0aGUgUklGUyBNb2RlIGZpZWxkIG9mIHRoZSBIVCBPcGVyYXRpb24gZWxlbWVudCBpcworCSAqIGFsc28gcmVzZXJ2ZWQsIGJ1dCBhbiBIVCBTVEEgc2hhbGwgb3BlcmF0ZSBhcyB0aG91Z2ggdGhpcyBmaWVsZAorCSAqIHdlcmUgc2V0IHRvIDEuCisJICovCisKKwlzZGF0YS0+dmlmLmJzc19jb25mLmh0X29wZXJhdGlvbl9tb2RlIHw9CisJCSAgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05IVF9NSVhFRAorCQl8IElFRUU4MDIxMV9IVF9QQVJBTV9SSUZTX01PREU7CisKKwljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0hUOworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKKwogCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZzZGF0YS0+bG9jYWwtPmh3LCAmc2RhdGEtPndvcmspOwogCiAJcmV0dXJuIDA7CkBAIC05NjIsNiArMTEyOSw3IEBACiAJc3RydWN0IGNmZzgwMjExX2JzcyAqY2JzczsKIAl1MTYgY2FwYWJpbGl0eTsKIAlpbnQgYWN0aXZlX2lic3M7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAKIAltdXRleF9sb2NrKCZzZGF0YS0+dS5pYnNzLm10eCk7CiAKQEAgLTk5MSw2ICsxMTU5LDIwIEBACiAKIAlzdGFfaW5mb19mbHVzaChzZGF0YS0+bG9jYWwsIHNkYXRhKTsKIAorCXNwaW5fbG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmaWZpYnNzLT5pbmNvbXBsZXRlX3N0YXRpb25zKSkgeworCQlzdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpZmlic3MtPmluY29tcGxldGVfc3RhdGlvbnMsCisJCQkJICAgICAgIHN0cnVjdCBzdGFfaW5mbywgbGlzdCk7CisJCWxpc3RfZGVsKCZzdGEtPmxpc3QpOworCQlzcGluX3VubG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCisJCXN0YV9pbmZvX2ZyZWUobG9jYWwsIHN0YSk7CisJCXNwaW5fbG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCisJbmV0aWZfY2Fycmllcl9vZmYoc2RhdGEtPmRldik7CisKIAkvKiByZW1vdmUgYmVhY29uICovCiAJa2ZyZWUoc2RhdGEtPnUuaWJzcy5pZSk7CiAJc2tiID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzZGF0YS0+dS5pYnNzLnByZXNwLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmggYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAppbmRleCA3NmU2NTZiLi5jM2YzZTQzIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAorKysgYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaApAQCAtMTQyLDYgKzE0Miw3IEBACiAKIHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYnM7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CkBAIC0yMzIsNiArMjMzLDcgQEAKIAogc3RydWN0IGllZWU4MDIxMV9pZl9hcCB7CiAJc3RydWN0IGJlYWNvbl9kYXRhIF9fcmN1ICpiZWFjb247CisJc3RydWN0IHNrX2J1ZmYgX19yY3UgKnByb2JlX3Jlc3A7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZsYW5zOwogCkBAIC0yNDEsNiArMjQzLDcgQEAKIAl1OCB0aW1bc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQklUU19UT19MT05HUyhJRUVFODAyMTFfTUFYX0FJRCArIDEpXTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHBzX2JjX2J1ZjsKIAlhdG9taWNfdCBudW1fc3RhX3BzOyAvKiBudW1iZXIgb2Ygc3RhdGlvbnMgaW4gUFMgbW9kZSAqLworCWF0b21pY190IG51bV9zdGFfYXV0aG9yaXplZDsgLyogbnVtYmVyIG9mIGF1dGhvcml6ZWQgc3RhdGlvbnMgKi8KIAlpbnQgZHRpbV9jb3VudDsKIAlib29sIGR0aW1fYmNfbWM7CiB9OwpAQCAtNDQ3LDYgKzQ1MCw5IEBACiAJICovCiAJaW50IHJzc2lfbWluX3Rob2xkLCByc3NpX21heF90aG9sZDsKIAlpbnQgbGFzdF9hdmVfYmVhY29uX3NpZ25hbDsKKworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGE7IC8qIGNvbmZpZ3VyZWQgaHQtY2FwIG92ZXItcmlkZXMgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhX21hc2s7IC8qIFZhbGlkIHBhcnRzIG9mIGh0X2NhcGEgKi8KIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfaWZfaWJzcyB7CkBAIC00NjksMTIgKzQ3NSwxNiBAQAogCXU4IHNzaWRfbGVuLCBpZV9sZW47CiAJdTggKmllOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKIAogCXVuc2lnbmVkIGxvbmcgaWJzc19qb2luX3JlcTsKIAkvKiBwcm9iZSByZXNwb25zZS9iZWFjb24gZm9yIElCU1MgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiBfX3JjdSAqcHJlc3A7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAorCXNwaW5sb2NrX3QgaW5jb21wbGV0ZV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgaW5jb21wbGV0ZV9zdGF0aW9uczsKKwogCWVudW0gewogCQlJRUVFODAyMTFfSUJTU19NTE1FX1NFQVJDSCwKIAkJSUVFRTgwMjExX0lCU1NfTUxNRV9KT0lORUQsCkBAIC01MDksNyArNTE5LDkgQEAKIAlhdG9taWNfdCBtcGF0aHM7CiAJLyogVGltZXN0YW1wIG9mIGxhc3QgU04gdXBkYXRlICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3NuX3VwZGF0ZTsKLQkvKiBUaW1lc3RhbXAgb2YgbGFzdCBTTiBzZW50ICovCisJLyogVGltZSB3aGVuIGl0J3Mgb2sgdG8gc2VuZCBuZXh0IFBFUlIgKi8KKwl1bnNpZ25lZCBsb25nIG5leHRfcGVycjsKKwkvKiBUaW1lc3RhbXAgb2YgbGFzdCBQUkVRIHNlbnQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfcHJlcTsKIAlzdHJ1Y3QgbWVzaF9ybWMgKnJtYzsKIAlzcGlubG9ja190IG1lc2hfcHJlcV9xdWV1ZV9sb2NrOwpAQCAtNjA2LDYgKzYxOCw5IEBACiAJc3RydWN0IGllZWU4MDIxMV9mcmFnbWVudF9lbnRyeQlmcmFnbWVudHNbSUVFRTgwMjExX0ZSQUdNRU5UX01BWF07CiAJdW5zaWduZWQgaW50IGZyYWdtZW50X25leHQ7CiAKKwkvKiBUSUQgYml0bWFwIGZvciBOb0FjayBwb2xpY3kgKi8KKwl1MTYgbm9hY2tfbWFwOworCiAJc3RydWN0IGllZWU4MDIxMV9rZXkgX19yY3UgKmtleXNbTlVNX0RFRkFVTFRfS0VZUyArIE5VTV9ERUZBVUxUX01HTVRfS0VZU107CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgX19yY3UgKmRlZmF1bHRfdW5pY2FzdF9rZXk7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgX19yY3UgKmRlZmF1bHRfbXVsdGljYXN0X2tleTsKQEAgLTcyOCwxNyArNzQzLDE2IEBACiAgKglvcGVyYXRpbmcgY2hhbm5lbAogICogQFNDQU5fU0VUX0NIQU5ORUw6IFNldCB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQKICAqIEBTQ0FOX1NFTkRfUFJPQkU6IFNlbmQgcHJvYmUgcmVxdWVzdHMgYW5kIHdhaXQgZm9yIHByb2JlIHJlc3BvbnNlcwotICogQFNDQU5fTEVBVkVfT1BFUl9DSEFOTkVMOiBMZWF2ZSB0aGUgb3BlcmF0aW5nIGNoYW5uZWwsIG5vdGlmeSB0aGUgQVAKLSAqCWFib3V0IHVzIGxlYXZpbmcgdGhlIGNoYW5uZWwgYW5kIHN0b3AgYWxsIGFzc29jaWF0ZWQgU1RBIGludGVyZmFjZXMKLSAqIEBTQ0FOX0VOVEVSX09QRVJfQ0hBTk5FTDogRW50ZXIgdGhlIG9wZXJhdGluZyBjaGFubmVsIGFnYWluLCBub3RpZnkgdGhlCi0gKglBUCBhYm91dCB1cyBiZWluZyBiYWNrIGFuZCByZXN0YXJ0IGFsbCBhc3NvY2lhdGVkIFNUQSBpbnRlcmZhY2VzCisgKiBAU0NBTl9TVVNQRU5EOiBTdXNwZW5kIHRoZSBzY2FuIGFuZCBnbyBiYWNrIHRvIG9wZXJhdGluZyBjaGFubmVsIHRvCisgKglzZW5kIG91dCBkYXRhCisgKiBAU0NBTl9SRVNVTUU6IFJlc3VtZSB0aGUgc2NhbiBhbmQgc2NhbiB0aGUgbmV4dCBjaGFubmVsCiAgKi8KIGVudW0gbWFjODAyMTFfc2Nhbl9zdGF0ZSB7CiAJU0NBTl9ERUNJU0lPTiwKIAlTQ0FOX1NFVF9DSEFOTkVMLAogCVNDQU5fU0VORF9QUk9CRSwKLQlTQ0FOX0xFQVZFX09QRVJfQ0hBTk5FTCwKLQlTQ0FOX0VOVEVSX09QRVJfQ0hBTk5FTCwKKwlTQ0FOX1NVU1BFTkQsCisJU0NBTl9SRVNVTUUsCiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsIHsKQEAgLTg0MSwxOCArODU1LDE1IEBACiAKIAkvKiBTdGF0aW9uIGRhdGEgKi8KIAkvKgotCSAqIFRoZSBtdXRleCBvbmx5IHByb3RlY3RzIHRoZSBsaXN0IGFuZCBjb3VudGVyLAotCSAqIHJlYWRzIGFyZSBkb25lIGluIFJDVS4KLQkgKiBBZGRpdGlvbmFsbHksIHRoZSBsb2NrIHByb3RlY3RzIHRoZSBoYXNoIHRhYmxlLAotCSAqIHRoZSBwZW5kaW5nIGxpc3QgYW5kIGVhY2ggQlNTJ3MgVElNIGJpdG1hcC4KKwkgKiBUaGUgbXV0ZXggb25seSBwcm90ZWN0cyB0aGUgbGlzdCwgaGFzaCB0YWJsZSBhbmQKKwkgKiBjb3VudGVyLCByZWFkcyBhcmUgZG9uZSB3aXRoIFJDVS4KIAkgKi8KIAlzdHJ1Y3QgbXV0ZXggc3RhX210eDsKLQlzcGlubG9ja190IHN0YV9sb2NrOworCXNwaW5sb2NrX3QgdGltX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBudW1fc3RhOwotCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3QsIHN0YV9wZW5kaW5nX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBzdGFfbGlzdDsKIAlzdHJ1Y3Qgc3RhX2luZm8gX19yY3UgKnN0YV9oYXNoW1NUQV9IQVNIX1NJWkVdOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0YV9jbGVhbnVwOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGFfZmluaXNoX3dvcms7CiAJaW50IHN0YV9nZW5lcmF0aW9uOwogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZW5kaW5nW0lFRUU4MDIxMV9NQVhfUVVFVUVTXTsKQEAgLTk1Nyw3ICs5NjgsNiBAQAogCWludCB0b3RhbF9wc19idWZmZXJlZDsgLyogdG90YWwgbnVtYmVyIG9mIGFsbCBidWZmZXJlZCB1bmljYXN0IGFuZAogCQkJCSogbXVsdGljYXN0IHBhY2tldHMgZm9yIHBvd2VyIHNhdmluZyBzdGF0aW9ucwogCQkJCSovCi0JaW50IHdpZmlfd21lX25vYWNrX3Rlc3Q7CiAJdW5zaWduZWQgaW50IHdtbV9hY207IC8qIGJpdCBmaWVsZCBvZiBBQ00gYml0cyAoQklUKDgwMi4xRCB0YWcpKSAqLwogCiAJLyoKQEAgLTEwMzksNiArMTA0OSw2OSBAQAogCXUxNiB0aWQ7CiB9OwogCisvKiBQYXJzZWQgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KK3N0cnVjdCBpZWVlODAyXzExX2VsZW1zIHsKKwl1OCAqaWVfc3RhcnQ7CisJc2l6ZV90IHRvdGFsX2xlbjsKKworCS8qIHBvaW50ZXJzIHRvIElFcyAqLworCXU4ICpzc2lkOworCXU4ICpzdXBwX3JhdGVzOworCXU4ICpmaF9wYXJhbXM7CisJdTggKmRzX3BhcmFtczsKKwl1OCAqY2ZfcGFyYW1zOworCXN0cnVjdCBpZWVlODAyMTFfdGltX2llICp0aW07CisJdTggKmlic3NfcGFyYW1zOworCXU4ICpjaGFsbGVuZ2U7CisJdTggKndwYTsKKwl1OCAqcnNuOworCXU4ICplcnBfaW5mbzsKKwl1OCAqZXh0X3N1cHBfcmF0ZXM7CisJdTggKndtbV9pbmZvOworCXU4ICp3bW1fcGFyYW07CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcF9lbGVtOworCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mb19lbGVtOworCXN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUgKm1lc2hfY29uZmlnOworCXU4ICptZXNoX2lkOworCXU4ICpwZWVyaW5nOworCXU4ICpwcmVxOworCXU4ICpwcmVwOworCXU4ICpwZXJyOworCXN0cnVjdCBpZWVlODAyMTFfcmFubl9pZSAqcmFubjsKKwl1OCAqY2hfc3dpdGNoX2VsZW07CisJdTggKmNvdW50cnlfZWxlbTsKKwl1OCAqcHdyX2NvbnN0cl9lbGVtOworCXU4ICpxdWlldF9lbGVtOwkvKiBmaXJzdCBxdWl0ZSBlbGVtZW50ICovCisJdTggKnRpbWVvdXRfaW50OworCisJLyogbGVuZ3RoIG9mIHRoZW0sIHJlc3BlY3RpdmVseSAqLworCXU4IHNzaWRfbGVuOworCXU4IHN1cHBfcmF0ZXNfbGVuOworCXU4IGZoX3BhcmFtc19sZW47CisJdTggZHNfcGFyYW1zX2xlbjsKKwl1OCBjZl9wYXJhbXNfbGVuOworCXU4IHRpbV9sZW47CisJdTggaWJzc19wYXJhbXNfbGVuOworCXU4IGNoYWxsZW5nZV9sZW47CisJdTggd3BhX2xlbjsKKwl1OCByc25fbGVuOworCXU4IGVycF9pbmZvX2xlbjsKKwl1OCBleHRfc3VwcF9yYXRlc19sZW47CisJdTggd21tX2luZm9fbGVuOworCXU4IHdtbV9wYXJhbV9sZW47CisJdTggbWVzaF9pZF9sZW47CisJdTggcGVlcmluZ19sZW47CisJdTggcHJlcV9sZW47CisJdTggcHJlcF9sZW47CisJdTggcGVycl9sZW47CisJdTggY2hfc3dpdGNoX2VsZW1fbGVuOworCXU4IGNvdW50cnlfZWxlbV9sZW47CisJdTggcHdyX2NvbnN0cl9lbGVtX2xlbjsKKwl1OCBxdWlldF9lbGVtX2xlbjsKKwl1OCBudW1fb2ZfcXVpZXRfZWxlbTsJLyogY2FuIGJlIG1vcmUgdGhlIG9uZSAqLworCXU4IHRpbWVvdXRfaW50X2xlbjsKK307CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqaHdfdG9fbG9jYWwoCiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC0xMDk5LDkgKzExNzIsOCBAQAogLyogSUJTUyBjb2RlICovCiB2b2lkIGllZWU4MDIxMV9pYnNzX25vdGlmeV9zY2FuX2NvbXBsZXRlZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CiB2b2lkIGllZWU4MDIxMV9pYnNzX3NldHVwX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKLXN0cnVjdCBzdGFfaW5mbyAqaWVlZTgwMjExX2lic3NfYWRkX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJdTggKmJzc2lkLCB1OCAqYWRkciwgdTMyIHN1cHBfcmF0ZXMsCi0JCQkJCWdmcF90IGdmcCk7Cit2b2lkIGllZWU4MDIxMV9pYnNzX3J4X25vX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKmFkZHIsIHUzMiBzdXBwX3JhdGVzKTsKIGludCBpZWVlODAyMTFfaWJzc19qb2luKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICpwYXJhbXMpOwogaW50IGllZWU4MDIxMV9pYnNzX2xlYXZlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKQEAgLTExNDksMTMgKzEyMjEsMTEgQEAKIHZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qIG9mZi1jaGFubmVsIGhlbHBlcnMgKi8KLWJvb2wgaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9lbmFibGVfYWxsX3BzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJCQlib29sIHRlbGxfYXApOwogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJICAgIGJvb2wgb2ZmY2hhbm5lbF9wc19lbmFibGUpOwogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIGJvb2wgZW5hYmxlX2JlYWNvbmluZywKIAkJCQkgYm9vbCBvZmZjaGFubmVsX3BzX2Rpc2FibGUpOwogdm9pZCBpZWVlODAyMTFfaHdfcm9jX3NldHVwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKIApAQCAtMTE4OCw3ICsxMjU4LDExIEBACiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiBIVCAqLwotdm9pZCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCitib29sIGllZWU4MDExMV9jZmdfb3ZlcnJpZGVfZGlzYWJsZXNfaHQ0MChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCk7Cit2b2lkIGllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBfaWUsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKTsKIHZvaWQgaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC0xMjc1LDcgKzEzNDksMTYgQEAKIAkJCQkgICAgIGdmcF90IGdmcCk7CiB2b2lkIGllZWU4MDIxMV9zZXRfd21tX2RlZmF1bHQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIGllZWU4MDIxMV90eF9za2Ioc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IpOworCit2b2lkIGllZWU4MDIxMV90eF9za2JfdGlkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGlkKTsKK3N0YXRpYyB2b2lkIGlubGluZSBpZWVlODAyMTFfdHhfc2tiKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFNlbmQgYWxsIGludGVybmFsIG1nbXQgZnJhbWVzIG9uIFZPLiBBY2NvcmRpbmdseSBzZXQgVElEIHRvIDcuICovCisJaWVlZTgwMjExX3R4X3NrYl90aWQoc2RhdGEsIHNrYiwgNyk7Cit9CisKIHZvaWQgaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCiAJCQkgICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKTsKIHUzMiBpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCkBAIC0xMzQzLDcgKzE0MjYsNyBAQAogc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdChjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sCiAJCQkgIGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywgc2l6ZV90IG9mZnNldCk7CiBzaXplX3QgaWVlZTgwMjExX2llX3NwbGl0X3ZlbmRvcihjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sIHNpemVfdCBvZmZzZXQpOwotdTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCit1OCAqaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcCh1OCAqcG9zLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKIAkJCSAgICAgIHUxNiBjYXApOwogdTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9pbmZvKHU4ICpwb3MsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWZhY2UuYyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCmluZGV4IGI3YmM0YjcuLmU0Nzc2OGMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCkBAIC0yOTMsNyArMjkzLDggQEAKIAkJY2hhbmdlZCB8PSBpZWVlODAyMTFfcmVzZXRfZXJwX2luZm8oc2RhdGEpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJCWVsc2UKIAkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKQEAgLTMxNyw4ICszMTgsOSBAQAogCQkJZ290byBlcnJfZGVsX2ludGVyZmFjZTsKIAkJfQogCi0JCS8qIG5vIGF0b21pYyBiaXRvcCByZXF1aXJlZCBzaW5jZSBTVEEgaXMgbm90IGxpdmUgeWV0ICovCi0JCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpOworCQlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIKTsKKwkJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVNTT0MpOworCQlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKTsKIAogCQlyZXMgPSBzdGFfaW5mb19pbnNlcnQoc3RhKTsKIAkJaWYgKHJlcykgewpAQCAtNDYxLDE1ICs0NjMsMTkgQEAKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqdmxhbiwgKnRtcHNkYXRhOwogCQlzdHJ1Y3QgYmVhY29uX2RhdGEgKm9sZF9iZWFjb24gPQogCQkJcnRubF9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5iZWFjb24pOworCQlzdHJ1Y3Qgc2tfYnVmZiAqb2xkX3Byb2JlX3Jlc3AgPQorCQkJcnRubF9kZXJlZmVyZW5jZShzZGF0YS0+dS5hcC5wcm9iZV9yZXNwKTsKIAogCQkvKiBzZGF0YV9ydW5uaW5nIHdpbGwgcmV0dXJuIGZhbHNlLCBzbyB0aGlzIHdpbGwgZGlzYWJsZSAqLwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwKIAkJCQkJCSBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCk7CiAKLQkJLyogcmVtb3ZlIGJlYWNvbiAqLworCQkvKiByZW1vdmUgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAqLwogCQlSQ1VfSU5JVF9QT0lOVEVSKHNkYXRhLT51LmFwLmJlYWNvbiwgTlVMTCk7CisJCVJDVV9JTklUX1BPSU5URVIoc2RhdGEtPnUuYXAucHJvYmVfcmVzcCwgTlVMTCk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShvbGRfYmVhY29uKTsKKwkJa2ZyZWVfc2tiKG9sZF9wcm9iZV9yZXNwKTsKIAogCQkvKiBkb3duIGFsbCBkZXBlbmRlbnQgZGV2aWNlcywgdGhhdCBpcyBWTEFOcyAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmxhbiwgdG1wc2RhdGEsICZzZGF0YS0+dS5hcC52bGFucywKQEAgLTY2Nyw3ICs2NzMsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKnJ0YXAgPSAodm9pZCAqKXNrYi0+ZGF0YTsKLQl1OCAqcDsKIAogCWlmIChsb2NhbC0+aHcucXVldWVzIDwgNCkKIAkJcmV0dXJuIDA7CkBAIC02NzgsMTkgKzY4Myw3IEBACiAKIAloZHIgPSAodm9pZCAqKSgodTggKilza2ItPmRhdGEgKyBsZTE2X3RvX2NwdShydGFwLT5pdF9sZW4pKTsKIAotCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlza2ItPnByaW9yaXR5ID0gNzsKLQkJcmV0dXJuIGllZWU4MDJfMWRfdG9fYWNbc2tiLT5wcmlvcml0eV07Ci0JfQotCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc2tiLT5wcmlvcml0eSA9IDA7Ci0JCXJldHVybiBpZWVlODAyXzFkX3RvX2FjW3NrYi0+cHJpb3JpdHldOwotCX0KLQotCXAgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQlza2ItPnByaW9yaXR5ID0gKnAgJiBJRUVFODAyMTFfUU9TX0NUTF9UQUcxRF9NQVNLOwotCi0JcmV0dXJuIGllZWU4MDIxMV9kb3duZ3JhZGVfcXVldWUobG9jYWwsIHNrYik7CisJcmV0dXJuIGllZWU4MDIxMV9zZWxlY3RfcXVldWVfODAyMTEobG9jYWwsIHNrYiwgaGRyKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpZWVlODAyMTFfbW9uaXRvcmlmX29wcyA9IHsKQEAgLTg2MSw2ICs4NTQsOCBAQAogCXNkYXRhLT5jb250cm9sX3BvcnRfcHJvdG9jb2wgPSBjcHVfdG9fYmUxNihFVEhfUF9QQUUpOwogCXNkYXRhLT5jb250cm9sX3BvcnRfbm9fZW5jcnlwdCA9IGZhbHNlOwogCisJc2RhdGEtPm5vYWNrX21hcCA9IDA7CisKIAkvKiBvbmx5IG1vbml0b3IgZGlmZmVycyAqLwogCXNkYXRhLT5kZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuYyBiL25ldC9tYWM4MDIxMS9rZXkuYwppbmRleCAxN2E1MjIwLi44N2E4OTc0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmMKKysrIGIvbmV0L21hYzgwMjExL2tleS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJkcml2ZXItb3BzLmgiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbGVkLmMgYi9uZXQvbWFjODAyMTEvbGVkLmMKaW5kZXggMTQ1OTAzMy4uMWJmNzkwMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2xlZC5jCisrKyBiL25ldC9tYWM4MDIxMS9sZWQuYwpAQCAtOSw2ICs5LDcgQEAKIC8qIGp1c3QgZm9yIElGTkFNU0laICovCiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAibGVkLmgiCiAKIHZvaWQgaWVlZTgwMjExX2xlZF9yeChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tYWluLmMgYi9uZXQvbWFjODAyMTEvbWFpbi5jCmluZGV4IGUzMjNkNGUuLjBhMGQ5NGEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKKysrIGIvbmV0L21hYzgwMjExL21haW4uYwpAQCAtNDcsNyArNDcsNyBAQAogCWlmIChhdG9taWNfcmVhZCgmbG9jYWwtPmlmZl9hbGxtdWx0aXMpKQogCQluZXdfZmxhZ3MgfD0gRklGX0FMTE1VTFRJOwogCi0JaWYgKGxvY2FsLT5tb25pdG9ycyB8fCBsb2NhbC0+c2Nhbm5pbmcpCisJaWYgKGxvY2FsLT5tb25pdG9ycyB8fCB0ZXN0X2JpdChTQ0FOX1NXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5nKSkKIAkJbmV3X2ZsYWdzIHw9IEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDOwogCiAJaWYgKGxvY2FsLT5maWZfcHJvYmVfcmVxIHx8IGxvY2FsLT5wcm9iZV9yZXFfcmVnKQpAQCAtOTIsNDcgKzkyLDYgQEAKIAlpZWVlODAyMTFfY29uZmlndXJlX2ZpbHRlcihsb2NhbCk7CiB9CiAKLS8qCi0gKiBSZXR1cm5zIHRydWUgaWYgd2UgYXJlIGxvZ2ljYWxseSBjb25maWd1cmVkIHRvIGJlIG9uCi0gKiB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgQU5EIHRoZSBoYXJkd2FyZS1jb25mIGlzIGN1cnJlbnRseQotICogY29uZmlndXJlZCBvbiB0aGUgb3BlcmF0aW5nIGNoYW5uZWwuICBDb21wYXJlcyBjaGFubmVsLXR5cGUKLSAqIGFzIHdlbGwuCi0gKi8KLWJvb2wgaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwotCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwotCi0JLyogVGhpcyBsb2dpYyBuZWVkcyB0byBtYXRjaCBsb2dpYyBpbiBpZWVlODAyMTFfaHdfY29uZmlnICovCi0JaWYgKGxvY2FsLT5zY2FuX2NoYW5uZWwpIHsKLQkJY2hhbiA9IGxvY2FsLT5zY2FuX2NoYW5uZWw7Ci0JCS8qIElmIHNjYW5uaW5nIG9uIG9wZXIgY2hhbm5lbCwgdXNlIHdoYXRldmVyIGNoYW5uZWwtdHlwZQotCQkgKiBpcyBjdXJyZW50bHkgaW4gdXNlLgotCQkgKi8KLQkJaWYgKGNoYW4gPT0gbG9jYWwtPm9wZXJfY2hhbm5lbCkKLQkJCWNoYW5uZWxfdHlwZSA9IGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGU7Ci0JCWVsc2UKLQkJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKLQl9IGVsc2UgaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkgewotCQljaGFuID0gbG9jYWwtPnRtcF9jaGFubmVsOwotCQljaGFubmVsX3R5cGUgPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZTsKLQl9IGVsc2UgewotCQljaGFuID0gbG9jYWwtPm9wZXJfY2hhbm5lbDsKLQkJY2hhbm5lbF90eXBlID0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZTsKLQl9Ci0KLQlpZiAoY2hhbiAhPSBsb2NhbC0+b3Blcl9jaGFubmVsIHx8Ci0JICAgIGNoYW5uZWxfdHlwZSAhPSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBDaGVjayBjdXJyZW50IGhhcmR3YXJlLWNvbmZpZyBhZ2FpbnN0IG9wZXJfY2hhbm5lbC4gKi8KLQlpZiAobG9jYWwtPm9wZXJfY2hhbm5lbCAhPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsIHx8Ci0JICAgIGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUgIT0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbF90eXBlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogaW50IGllZWU4MDIxMV9od19jb25maWcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKQEAgLTE5MSw4ICsxNTAsOCBAQAogCQljaGFuZ2VkIHw9IElFRUU4MDIxMV9DT05GX0NIQU5HRV9TTVBTOwogCX0KIAotCWlmICgobG9jYWwtPnNjYW5uaW5nICYgU0NBTl9TV19TQ0FOTklORykgfHwKLQkgICAgKGxvY2FsLT5zY2FubmluZyAmIFNDQU5fSFdfU0NBTk5JTkcpKQorCWlmICh0ZXN0X2JpdChTQ0FOX1NXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5nKSB8fAorCSAgICB0ZXN0X2JpdChTQ0FOX0hXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5nKSkKIAkJcG93ZXIgPSBjaGFuLT5tYXhfcG93ZXI7CiAJZWxzZQogCQlwb3dlciA9IGxvY2FsLT5wb3dlcl9jb25zdHJfbGV2ZWwgPwpAQCAtNDM0LDkgKzM5Myw2IEBACiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihuZGV2KTsKIAlic3NfY29uZiA9ICZzZGF0YS0+dmlmLmJzc19jb25mOwogCi0JaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQogCS8qIEFSUCBmaWx0ZXJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gbWFuYWdlZCBtb2RlICovCiAJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC00NjUsNyArNDIxLDcgQEAKIAl9CiAJYnNzX2NvbmYtPmFycF9hZGRyX2NudCA9IGM7CiAKLQkvKiBDb25maWd1cmUgZHJpdmVyIG9ubHkgaWYgYXNzb2NpYXRlZCAqLworCS8qIENvbmZpZ3VyZSBkcml2ZXIgb25seSBpZiBhc3NvY2lhdGVkICh3aGljaCBhbHNvIGltcGxpZXMgaXQgaXMgdXApICovCiAJaWYgKGlmbWdkLT5hc3NvY2lhdGVkKSB7CiAJCWJzc19jb25mLT5hcnBfZmlsdGVyX2VuYWJsZWQgPSBzZGF0YS0+YXJwX2ZpbHRlcl9zdGF0ZTsKIAkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsCkBAIC01NTgsNiArNTE0LDE5IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBtYWM4MDIxMV9odF9jYXBhX21vZF9tYXNrID0geworCS5hbXBkdV9wYXJhbXNfaW5mbyA9IElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUiB8CisJCQkgICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFksCisKKwkuY2FwX2luZm8gPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8CisJCQkJSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUgfAorCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSwKKwkubWNzID0geworCQkucnhfbWFzayA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJCSAgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgfSwKKwl9LAorfTsKKwogc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZTgwMjExX2FsbG9jX2h3KHNpemVfdCBwcml2X2RhdGFfbGVuLAogCQkJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyAqb3BzKQogewpAQCAtNTk0LDkgKzU2MywxMiBAQAogCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX05FVE5TX09LIHwKIAkJCVdJUEhZX0ZMQUdfNEFERFJfQVAgfAogCQkJV0lQSFlfRkxBR180QUREUl9TVEFUSU9OIHwKLQkJCVdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTOworCQkJV0lQSFlfRkxBR19SRVBPUlRTX09CU1MgfAorCQkJV0lQSFlfRkxBR19PRkZDSEFOX1RYIHwKKwkJCVdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMOwogCi0Jd2lwaHktPmZlYXR1cmVzID0gTkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUzsKKwl3aXBoeS0+ZmVhdHVyZXMgPSBOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTIHwKKwkJCSAgTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1M7CiAKIAlpZiAoIW9wcy0+c2V0X2tleSkKIAkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSUJTU19SU047CkBAIC02MDksNyArNTgxLDcgQEAKIAogCWxvY2FsLT5ody5wcml2ID0gKGNoYXIgKilsb2NhbCArIEFMSUdOKHNpemVvZigqbG9jYWwpLCBORVRERVZfQUxJR04pOwogCi0JQlVHX09OKCFvcHMtPnR4KTsKKwlCVUdfT04oIW9wcy0+dHggJiYgIW9wcy0+dHhfZnJhZ3MpOwogCUJVR19PTighb3BzLT5zdGFydCk7CiAJQlVHX09OKCFvcHMtPnN0b3ApOwogCUJVR19PTighb3BzLT5jb25maWcpOwpAQCAtNjI5LDYgKzYwMSw3IEBACiAJbG9jYWwtPnVzZXJfcG93ZXJfbGV2ZWwgPSAtMTsKIAlsb2NhbC0+dWFwc2RfcXVldWVzID0gSUVFRTgwMjExX0RFRkFVTFRfVUFQU0RfUVVFVUVTOwogCWxvY2FsLT51YXBzZF9tYXhfc3BfbGVuID0gSUVFRTgwMjExX0RFRkFVTFRfTUFYX1NQX0xFTjsKKwl3aXBoeS0+aHRfY2FwYV9tb2RfbWFzayA9ICZtYWM4MDIxMV9odF9jYXBhX21vZF9tYXNrOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5pbnRlcmZhY2VzKTsKIApAQCAtNzYzLDYgKzczNiwxMiBAQAogCWlmICghbG9jYWwtPmludF9zY2FuX3JlcSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CisJCWlmICghbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXSkKKwkJCWNvbnRpbnVlOworCQlsb2NhbC0+aW50X3NjYW5fcmVxLT5yYXRlc1tiYW5kXSA9ICh1MzIpIC0xOworCX0KKwogCS8qIGlmIGxvdy1sZXZlbCBkcml2ZXIgc3VwcG9ydHMgQVAsIHdlIGFsc28gc3VwcG9ydCBWTEFOICovCiAJaWYgKGxvY2FsLT5ody53aXBoeS0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX0FQKSkgewogCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfQVBfVkxBTik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5jIGIvbmV0L21hYzgwMjExL21lc2guYwppbmRleCBiM2ExMjVmLi5jNzA3YzhiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKQEAgLTM2Niw3ICszNjYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0JaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsIHNiYW5kLCBzYmFuZC0+aHRfY2FwLmNhcCk7CisJaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZzYmFuZC0+aHRfY2FwLCBzYmFuZC0+aHRfY2FwLmNhcCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0OSw2ICs3NDksNyBAQAogCWF0b21pY19zZXQoJmlmbXNoLT5tcGF0aHMsIDApOwogCW1lc2hfcm1jX2luaXQoc2RhdGEpOwogCWlmbXNoLT5sYXN0X3ByZXEgPSBqaWZmaWVzOworCWlmbXNoLT5uZXh0X3BlcnIgPSBqaWZmaWVzOwogCS8qIEFsbG9jYXRlIGFsbCBtZXNoIHN0cnVjdHVyZXMgd2hlbiBjcmVhdGluZyB0aGUgZmlyc3QgbWVzaCBpbnRlcmZhY2UuICovCiAJaWYgKCFtZXNoX2FsbG9jYXRlZCkKIAkJaWVlZTgwMjExc19pbml0KCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5oIGIvbmV0L21hYzgwMjExL21lc2guaAppbmRleCA2MjJjYzk2Li5iZDE0YmQyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5oCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmgKQEAgLTIzMyw2ICsyMzMsOCBAQAogLyogTWVzaCBwYXRocyAqLwogaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHN0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXAodTggKmRzdCwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCmluZGV4IGE3YWZiMmQuLjczYWJiNzUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKQEAgLTI0MSwxMSArMjQxLDE1IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCXU4ICpwb3MsIGllX2xlbjsKIAlpbnQgaGRyX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hY3Rpb24udS5tZXNoX2FjdGlvbikgKwogCQkgICAgICBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbik7CiAKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaWZtc2gtPm5leHRfcGVycikpCisJCXJldHVybiAtRUFHQUlOOworCiAJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKwogCQkJICAgIGhkcl9sZW4gKwogCQkJICAgIDIgKyAxNSAvKiBQRVJSIElFICovKTsKQEAgLTI5MCw2ICsyOTQsOCBAQAogCiAJLyogc2VlIG5vdGUgaW4gZnVuY3Rpb24gaGVhZGVyICovCiAJcHJlcGFyZV9mcmFtZV9mb3JfZGVmZXJyZWRfdHgoc2RhdGEsIHNrYik7CisJaWZtc2gtPm5leHRfcGVyciA9IFRVX1RPX0VYUF9USU1FKAorCQkJCSAgIGlmbXNoLT5tc2hjZmcuZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbCk7CiAJaWVlZTgwMjExX2FkZF9wZW5kaW5nX3NrYihsb2NhbCwgc2tiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM5MywxNSArMzk5LDEzIEBACiAJCW9yaWdfbWV0cmljID0gUFJFUV9JRV9NRVRSSUMoaHdtcF9pZSk7CiAJCWJyZWFrOwogCWNhc2UgTVBBVEhfUFJFUDoKLQkJLyogT3JpZ2luYXRvciBoZXJlIHJlZmVycyB0byB0aGUgTVAgdGhhdCB3YXMgdGhlIGRlc3RpbmF0aW9uIGluCi0JCSAqIHRoZSBQYXRoIFJlcXVlc3QuIFRoZSBkcmFmdCByZWZlcnMgdG8gdGhhdCBNUCBhcyB0aGUKLQkJICogZGVzdGluYXRpb24gYWRkcmVzcywgZXZlbiB0aG91Z2ggdXN1YWxseSBpdCBpcyB0aGUgb3JpZ2luIG9mCi0JCSAqIHRoZSBQUkVQIGZyYW1lLiBXZSBkaXZlcnQgZnJvbSB0aGUgbm9tZW5jbGF0dXJlIGluIHRoZSBkcmFmdAorCQkvKiBPcmlnaW5hdG9yIGhlcmUgcmVmZXJzIHRvIHRoZSBNUCB0aGF0IHdhcyB0aGUgdGFyZ2V0IGluIHRoZQorCQkgKiBQYXRoIFJlcXVlc3QuIFdlIGRpdmVydCBmcm9tIHRoZSBub21lbmNsYXR1cmUgaW4gdGhlIGRyYWZ0CiAJCSAqIHNvIHRoYXQgd2UgY2FuIGVhc2lseSB1c2UgYSBzaW5nbGUgZnVuY3Rpb24gdG8gZ2F0aGVyIHBhdGgKIAkJICogaW5mb3JtYXRpb24gZnJvbSBib3RoIFBSRVEgYW5kIFBSRVAgZnJhbWVzLgogCQkgKi8KLQkJb3JpZ19hZGRyID0gUFJFUF9JRV9PUklHX0FERFIoaHdtcF9pZSk7Ci0JCW9yaWdfc24gPSBQUkVQX0lFX09SSUdfU04oaHdtcF9pZSk7CisJCW9yaWdfYWRkciA9IFBSRVBfSUVfVEFSR0VUX0FERFIoaHdtcF9pZSk7CisJCW9yaWdfc24gPSBQUkVQX0lFX1RBUkdFVF9TTihod21wX2llKTsKIAkJb3JpZ19saWZldGltZSA9IFBSRVBfSUVfTElGRVRJTUUoaHdtcF9pZSk7CiAJCW9yaWdfbWV0cmljID0gUFJFUF9JRV9NRVRSSUMoaHdtcF9pZSk7CiAJCWJyZWFrOwpAQCAtNTYyLDkgKzU2Niw5IEBACiAJCXR0bCA9IGlmbXNoLT5tc2hjZmcuZWxlbWVudF90dGw7CiAJCWlmICh0dGwgIT0gMCkgewogCQkJbWh3bXBfZGJnKCJyZXBseWluZyB0byB0aGUgUFJFUSIpOwotCQkJbWVzaF9wYXRoX3NlbF9mcmFtZV90eChNUEFUSF9QUkVQLCAwLCB0YXJnZXRfYWRkciwKLQkJCQljcHVfdG9fbGUzMih0YXJnZXRfc24pLCAwLCBvcmlnX2FkZHIsCi0JCQkJY3B1X3RvX2xlMzIob3JpZ19zbiksIG1nbXQtPnNhLCAwLCB0dGwsCisJCQltZXNoX3BhdGhfc2VsX2ZyYW1lX3R4KE1QQVRIX1BSRVAsIDAsIG9yaWdfYWRkciwKKwkJCQljcHVfdG9fbGUzMihvcmlnX3NuKSwgMCwgdGFyZ2V0X2FkZHIsCisJCQkJY3B1X3RvX2xlMzIodGFyZ2V0X3NuKSwgbWdtdC0+c2EsIDAsIHR0bCwKIAkJCQljcHVfdG9fbGUzMihsaWZldGltZSksIGNwdV90b19sZTMyKG1ldHJpYyksCiAJCQkJMCwgc2RhdGEpOwogCQl9IGVsc2UKQEAgLTYxOCwxNCArNjIyLDggQEAKIAogCW1od21wX2RiZygicmVjZWl2ZWQgUFJFUCBmcm9tICVwTSIsIFBSRVBfSUVfT1JJR19BRERSKHByZXBfZWxlbSkpOwogCi0JLyogTm90ZSB0aGF0IHdlIGRpdmVydCBmcm9tIHRoZSBkcmFmdCBub21lbmNsYXR1cmUgYW5kIGRlbm9taW5hdGUKLQkgKiBkZXN0aW5hdGlvbiB0byB3aGF0IHRoZSBkcmFmdCByZWZlcnMgdG8gYXMgb3JpZ2luaW5hdG9yLiBTbyBpbiB0aGlzCi0JICogZnVuY3Rpb24gZGVzdG5hdGlvbiByZWZlcnMgdG8gdGhlIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBQUkVQLAotCSAqIHdoaWNoIGNvcnJlc3BvbmRzIHdpdGggdGhlIG9yaWdpbmF0b3Igb2YgdGhlIFBSRVEgd2hpY2ggdGhpcyBQUkVQCi0JICogcmVwbGllcwotCSAqLwotCXRhcmdldF9hZGRyID0gUFJFUF9JRV9UQVJHRVRfQUREUihwcmVwX2VsZW0pOwotCWlmIChtZW1jbXAodGFyZ2V0X2FkZHIsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pID09IDApCisJb3JpZ19hZGRyID0gUFJFUF9JRV9PUklHX0FERFIocHJlcF9lbGVtKTsKKwlpZiAobWVtY21wKG9yaWdfYWRkciwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTikgPT0gMCkKIAkJLyogZGVzdGluYXRpb24sIG5vIGZvcndhcmRpbmcgcmVxdWlyZWQgKi8KIAkJcmV0dXJuOwogCkBAIC02MzYsNyArNjM0LDcgQEAKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CisJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKG9yaWdfYWRkciwgc2RhdGEpOwogCWlmIChtcGF0aCkKIAkJc3Bpbl9sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJZWxzZQpAQCAtNjUxLDcgKzY0OSw3IEBACiAJZmxhZ3MgPSBQUkVQX0lFX0ZMQUdTKHByZXBfZWxlbSk7CiAJbGlmZXRpbWUgPSBQUkVQX0lFX0xJRkVUSU1FKHByZXBfZWxlbSk7CiAJaG9wY291bnQgPSBQUkVQX0lFX0hPUENPVU5UKHByZXBfZWxlbSkgKyAxOwotCW9yaWdfYWRkciA9IFBSRVBfSUVfT1JJR19BRERSKHByZXBfZWxlbSk7CisJdGFyZ2V0X2FkZHIgPSBQUkVQX0lFX1RBUkdFVF9BRERSKHByZXBfZWxlbSk7CiAJdGFyZ2V0X3NuID0gUFJFUF9JRV9UQVJHRVRfU04ocHJlcF9lbGVtKTsKIAlvcmlnX3NuID0gUFJFUF9JRV9PUklHX1NOKHByZXBfZWxlbSk7CiAKQEAgLTg2NywxMCArODY1LDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2soJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFUV9RVUVVRUQpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlmbXNoLT5tZXNoX3ByZXFfcXVldWVfbG9jayk7CisJCWtmcmVlKHByZXFfbm9kZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg3OCw3ICs4NzcsNyBAQAogCXByZXFfbm9kZS0+ZmxhZ3MgPSBmbGFnczsKIAogCW1wYXRoLT5mbGFncyB8PSBNRVNIX1BBVEhfUkVRX1FVRVVFRDsKLQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOworCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAKIAlsaXN0X2FkZF90YWlsKCZwcmVxX25vZGUtPmxpc3QsICZpZm1zaC0+cHJlcV9xdWV1ZS5saXN0KTsKIAkrK2lmbXNoLT5wcmVxX3F1ZXVlX2xlbjsKQEAgLTk4Myw3MSArOTgyLDk3IEBACiAJa2ZyZWUocHJlcV9ub2RlKTsKIH0KIAotLyoqCi0gKiBtZXNoX25leHRob3BfbG9va3VwIC0gcHV0IHRoZSBhcHByb3ByaWF0ZSBuZXh0IGhvcCBvbiBhIG1lc2ggZnJhbWUKKy8qIG1lc2hfbmV4dGhvcF9yZXNvbHZlIC0gbG9va3VwIG5leHQgaG9wIGZvciBnaXZlbiBza2IgYW5kIHN0YXJ0IHBhdGgKKyAqIGRpc2NvdmVyeSBpZiBubyBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGlzIGZvdW5kLgogICoKICAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CiAgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCiAgKgotICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4gSWYgbm8gbmV4dCBob3AgaXMKLSAqIGZvdW5kLCB0aGUgZnVuY3Rpb24gd2lsbCBzdGFydCBhIHBhdGggZGlzY292ZXJ5IGFuZCBxdWV1ZSB0aGUgZnJhbWUgc28gaXQgaXMKLSAqIHNlbnQgd2hlbiB0aGUgcGF0aCBpcyByZXNvbHZlZC4gVGhpcyBtZWFucyB0aGUgY2FsbGVyIG11c3Qgbm90IGZyZWUgdGhlIHNrYgotICogaW4gdGhpcyBjYXNlLgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kIGFuZCAtRU5PRU5UIGlmIHRoZSBmcmFtZSB3YXMgcXVldWVkLgorICogc2tiIGlzIGZyZWVlZCBoZXJlIGlmIG5vIG1wYXRoIGNvdWxkIGJlIGFsbG9jYXRlZC4KICAqLwotaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoraW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl90b19mcmVlID0gTlVMTDsKLQlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3RvX2ZyZWUgPSBOVUxMOwogCXU4ICp0YXJnZXRfYWRkciA9IGhkci0+YWRkcjM7CiAJaW50IGVyciA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CisJZXJyID0gbWVzaF9uZXh0aG9wX2xvb2t1cChza2IsIHNkYXRhKTsKKwlpZiAoIWVycikKKwkJZ290byBlbmRsb29rdXA7CiAKKwkvKiBubyBuZXh0aG9wIGZvdW5kLCBzdGFydCByZXNvbHZpbmcgKi8KKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAlpZiAoIW1wYXRoKSB7CiAJCW1lc2hfcGF0aF9hZGQodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CiAJCWlmICghbXBhdGgpIHsKLQkJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKKwkJCW1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lKHNrYiwgc2RhdGEpOwogCQkJZXJyID0gLUVOT1NQQzsKIAkJCWdvdG8gZW5kbG9va3VwOwogCQl9CiAJfQogCi0JaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9BQ1RJVkUpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCSAgICAgICBtcGF0aC0+ZXhwX3RpbWUgLQotCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgotCQkgICAgIW1lbWNtcChzZGF0YS0+dmlmLmFkZHIsIGhkci0+YWRkcjQsIEVUSF9BTEVOKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKSB7Ci0JCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsCi0JCQkJCVBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7Ci0JCX0KLQkJbmV4dF9ob3AgPSByY3VfZGVyZWZlcmVuY2UobXBhdGgtPm5leHRfaG9wKTsKLQkJaWYgKG5leHRfaG9wKQotCQkJbWVtY3B5KGhkci0+YWRkcjEsIG5leHRfaG9wLT5zdGEuYWRkciwgRVRIX0FMRU4pOwotCQllbHNlCi0JCQllcnIgPSAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQkJaWYgKCEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykpIHsKLQkJCS8qIFN0YXJ0IGRpc2NvdmVyeSBvbmx5IGlmIGl0IGlzIG5vdCBydW5uaW5nIHlldCAqLwotCQkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7Ci0JCX0KKwlpZiAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSkKKwkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJm1wYXRoLT5mcmFtZV9xdWV1ZSkgPj0gTUVTSF9GUkFNRV9RVUVVRV9MRU4pCi0JCQlza2JfdG9fZnJlZSA9IHNrYl9kZXF1ZXVlKCZtcGF0aC0+ZnJhbWVfcXVldWUpOworCWlmIChza2JfcXVldWVfbGVuKCZtcGF0aC0+ZnJhbWVfcXVldWUpID49IE1FU0hfRlJBTUVfUVVFVUVfTEVOKQorCQlza2JfdG9fZnJlZSA9IHNrYl9kZXF1ZXVlKCZtcGF0aC0+ZnJhbWVfcXVldWUpOwogCi0JCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKLQkJaWVlZTgwMjExX3NldF9xb3NfaGRyKHNkYXRhLCBza2IpOwotCQlza2JfcXVldWVfdGFpbCgmbXBhdGgtPmZyYW1lX3F1ZXVlLCBza2IpOwotCQlpZiAoc2tiX3RvX2ZyZWUpCi0JCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2JfdG9fZnJlZSwgc2RhdGEpOwotCQllcnIgPSAtRU5PRU5UOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKKwlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIHNrYik7CisJc2tiX3F1ZXVlX3RhaWwoJm1wYXRoLT5mcmFtZV9xdWV1ZSwgc2tiKTsKKwllcnIgPSAtRU5PRU5UOworCWlmIChza2JfdG9fZnJlZSkKKwkJbWVzaF9wYXRoX2Rpc2NhcmRfZnJhbWUoc2tiX3RvX2ZyZWUsIHNkYXRhKTsKKworZW5kbG9va3VwOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisvKioKKyAqIG1lc2hfbmV4dGhvcF9sb29rdXAgLSBwdXQgdGhlIGFwcHJvcHJpYXRlIG5leHQgaG9wIG9uIGEgbWVzaCBmcmFtZS4gQ2FsbGluZworICogdGhpcyBmdW5jdGlvbiBpcyBjb25zaWRlcmVkICJ1c2luZyIgdGhlIGFzc29jaWF0ZWQgbXBhdGgsIHNvIHByZWVtcHQgYSBwYXRoCisgKiByZWZyZXNoIGlmIHRoaXMgbXBhdGggZXhwaXJlcyBzb29uLgorICoKKyAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CisgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCisgKgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOworCXN0cnVjdCBzdGFfaW5mbyAqbmV4dF9ob3A7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJdTggKnRhcmdldF9hZGRyID0gaGRyLT5hZGRyMzsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKKworCWlmICghbXBhdGggfHwgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFKSkKKwkJZ290byBlbmRsb29rdXA7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbXBhdGgtPmV4cF90aW1lIC0KKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgorCSAgICAhbWVtY21wKHNkYXRhLT52aWYuYWRkciwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pICYmCisJICAgICEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykgJiYKKwkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKQorCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsIFBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7CisKKwluZXh0X2hvcCA9IHJjdV9kZXJlZmVyZW5jZShtcGF0aC0+bmV4dF9ob3ApOworCWlmIChuZXh0X2hvcCkgeworCQltZW1jcHkoaGRyLT5hZGRyMSwgbmV4dF9ob3AtPnN0YS5hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShoZHItPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwkJZXJyID0gMDsKIAl9CiAKIGVuZGxvb2t1cDoKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwppbmRleCA0ZmMyM2QxLi5lZGYxNjdlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCkBAIC02OSw4ICs2OSw2IEBACiAJCWxvY2tkZXBfaXNfaGVsZCgmcGF0aHRibF9yZXNpemVfbG9jaykpOwogfQogCi1zdGF0aWMgaW50IG1lc2hfZ2F0ZV9hZGQoc3RydWN0IG1lc2hfdGFibGUgKnRibCwgc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpOwotCiAvKgogICogQ0FSRUZVTCAtLSAidGJsIiBtdXN0IG5vdCBiZSBhbiBleHByZXNzaW9uLAogICogaW4gcGFydGljdWxhciBub3QgYW4gcmN1X2RlcmVmZXJlbmNlKCksIHNpbmNlCkBAIC0yMjMsNiArMjIxLDcgQEAKIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJm1wYXRoLT5mcmFtZV9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAkJbWVtY3B5KGhkci0+YWRkcjEsIHN0YS0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGhkci0+YWRkcjIsIG1wYXRoLT5zZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAkJX19za2JfcXVldWVfdGFpbCgmdG1wcSwgc2tiKTsKIAl9CiAKQEAgLTI2Niw2ICsyNjUsNyBAQAogCW5leHRfaG9wID0gcmN1X2RlcmVmZXJlbmNlKGdhdGVfbXBhdGgtPm5leHRfaG9wKS0+c3RhLmFkZHI7CiAJbWVtY3B5KGhkci0+YWRkcjEsIG5leHRfaG9wLCBFVEhfQUxFTik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJbWVtY3B5KGhkci0+YWRkcjIsIGdhdGVfbXBhdGgtPnNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmFkZHIzLCBkc3RfYWRkciwgRVRIX0FMRU4pOwogfQogCkBAIC00MjAsMjEgKzQyMCwxOCBAQAogfQogCiAvKioKLSAqIG1lc2hfZ2F0ZV9hZGQgLSBtYXJrIG1wYXRoIGFzIHBhdGggdG8gYSBtZXNoIGdhdGUgYW5kIGFkZCB0byBrbm93bl9nYXRlcwotICogQG1lc2hfdGJsOiB0YWJsZSB3aGljaCBjb250YWlucyBrbm93bl9nYXRlcyBsaXN0Ci0gKiBAbXBhdGg6IG1wYXRoIHRvIGtub3duIG1lc2ggZ2F0ZQotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcwotICoKKyAqIG1lc2hfcGF0aF9hZGRfZ2F0ZSAtIGFkZCB0aGUgZ2l2ZW4gbXBhdGggdG8gYSBtZXNoIGdhdGUgdG8gb3VyIHBhdGggdGFibGUKKyAqIEBtcGF0aDogZ2F0ZSBwYXRoIHRvIGFkZCB0byB0YWJsZQogICovCi1zdGF0aWMgaW50IG1lc2hfZ2F0ZV9hZGQoc3RydWN0IG1lc2hfdGFibGUgKnRibCwgc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpCitpbnQgbWVzaF9wYXRoX2FkZF9nYXRlKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKQogeworCXN0cnVjdCBtZXNoX3RhYmxlICp0Ymw7CiAJc3RydWN0IG1wYXRoX25vZGUgKmdhdGUsICpuZXdfZ2F0ZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKIAlpbnQgZXJyOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXRibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwpOworCXRibCA9IHJjdV9kZXJlZmVyZW5jZShtZXNoX3BhdGhzKTsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnYXRlLCBuLCB0YmwtPmtub3duX2dhdGVzLCBsaXN0KQogCQlpZiAoZ2F0ZS0+bXBhdGggPT0gbXBhdGgpIHsKQEAgLTQ3OCw4ICs0NzUsNiBAQAogCXN0cnVjdCBtcGF0aF9ub2RlICpnYXRlOwogCXN0cnVjdCBobGlzdF9ub2RlICpwLCAqcTsKIAotCXRibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwpOwotCiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShnYXRlLCBwLCBxLCB0YmwtPmtub3duX2dhdGVzLCBsaXN0KQogCQlpZiAoZ2F0ZS0+bXBhdGggPT0gbXBhdGgpIHsKIAkJCXNwaW5fbG9ja19iaCgmdGJsLT5nYXRlc19sb2NrKTsKQEAgLTQ5OCwxNiArNDkzLDYgQEAKIH0KIAogLyoqCi0gKgotICogbWVzaF9wYXRoX2FkZF9nYXRlIC0gYWRkIHRoZSBnaXZlbiBtcGF0aCB0byBhIG1lc2ggZ2F0ZSB0byBvdXIgcGF0aCB0YWJsZQotICogQG1wYXRoOiBnYXRlIHBhdGggdG8gYWRkIHRvIHRhYmxlCi0gKi8KLWludCBtZXNoX3BhdGhfYWRkX2dhdGUoc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpCi17Ci0JcmV0dXJuIG1lc2hfZ2F0ZV9hZGQobWVzaF9wYXRocywgbXBhdGgpOwotfQotCi0vKioKICAqIG1lc2hfZ2F0ZV9udW0gLSBudW1iZXIgb2YgZ2F0ZXMga25vd24gdG8gdGhpcyBpbnRlcmZhY2UKICAqIEBzZGF0YTogc3ViaWYgZGF0YQogICovCkBAIC05ODgsMzggKzk3MywxMSBAQAogICogQHNrYjogZnJhbWUgdG8gZGlzY2FyZAogICogQHNkYXRhOiBuZXR3b3JrIHN1YmlmIHRoZSBmcmFtZSB3YXMgdG8gYmUgc2VudCB0aHJvdWdoCiAgKgotICogSWYgdGhlIGZyYW1lIHdhcyBiZWluZyBmb3J3YXJkZWQgZnJvbSBhbm90aGVyIE1QLCBhIFBFUlIgZnJhbWUgd2lsbCBiZSBzZW50Ci0gKiB0byB0aGUgcHJlY3Vyc29yLiAgVGhlIHByZWN1cnNvcidzIGFkZHJlc3MgKGkuZS4gdGhlIHByZXZpb3VzIGhvcCkgd2FzIHNhdmVkCi0gKiBpbiBhZGRyMSBvZiB0aGUgZnJhbWUtdG8tYmUtZm9yd2FyZGVkLCBhbmQgd291bGQgb25seSBiZSBvdmVyd3JpdHRlbiBvbmNlCi0gKiB0aGUgZGVzdGluYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLgotICoKICAqIExvY2tpbmc6IHRoZSBmdW5jdGlvbiBtdXN0IG1lIGNhbGxlZCB3aXRoaW4gYSByY3VfcmVhZF9sb2NrIHJlZ2lvbgogICovCiB2b2lkIG1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOwotCXUzMiBzbiA9IDA7Ci0JX19sZTE2IHJlYXNvbiA9IGNwdV90b19sZTE2KFdMQU5fUkVBU09OX01FU0hfUEFUSF9OT0ZPUldBUkQpOwotCi0JaWYgKG1lbWNtcChoZHItPmFkZHI0LCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKSAhPSAwKSB7Ci0JCXU4ICpyYSwgKmRhOwotCi0JCWRhID0gaGRyLT5hZGRyMzsKLQkJcmEgPSBoZHItPmFkZHIxOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW1wYXRoID0gbWVzaF9wYXRoX2xvb2t1cChkYSwgc2RhdGEpOwotCQlpZiAobXBhdGgpIHsKLQkJCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwotCQkJc24gPSArK21wYXRoLT5zbjsKLQkJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7Ci0JCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCW1lc2hfcGF0aF9lcnJvcl90eChzZGF0YS0+dS5tZXNoLm1zaGNmZy5lbGVtZW50X3R0bCwgc2tiLT5kYXRhLAotCQkJCSAgIGNwdV90b19sZTMyKHNuKSwgcmVhc29uLCByYSwgc2RhdGEpOwotCX0KLQogCWtmcmVlX3NrYihza2IpOwogCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCmluZGV4IDAxNDBlODguLjQxZWYxYjQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYwpAQCAtOTYsMTIgKzk2LDE2IEBACiAJaWYgKCFzdGEpCiAJCXJldHVybiBOVUxMOwogCi0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCk7Ci0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSCk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVNTT0MpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQpOworCiAJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfV01FKTsKKwogCXN0YS0+c3RhLnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKIAlpZiAoZWxlbXMtPmh0X2NhcF9lbGVtKQotCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2JhbmQsIGVsZW1zLT5odF9jYXBfZWxlbSwKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKKwkJCQkJCSAgZWxlbXMtPmh0X2NhcF9lbGVtLAogCQkJCQkJICAmc3RhLT5zdGEuaHRfY2FwKTsKIAlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tbG1lLmMgYi9uZXQvbWFjODAyMTEvbWxtZS5jCmluZGV4IGIyNTU2N2EuLmE5ODRmMWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tbG1lLmMKKysrIGIvbmV0L21hYzgwMjExL21sbWUuYwpAQCAtMTYsMTAgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMjA3LDYgKzIwOSw3IEBACiAJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDIwOwogCiAJCWlmICghKGFwX2h0X2NhcF9mbGFncyAmIElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCkgJiYKKwkJICAgICFpZWVlODAxMTFfY2ZnX292ZXJyaWRlX2Rpc2FibGVzX2h0NDAoc2RhdGEpICYmCiAJCSAgICAoc2JhbmQtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgJiYKIAkJICAgIChodGktPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSkgewogCQkJc3dpdGNoKGh0aS0+aHRfcGFyYW0gJiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpIHsKQEAgLTgxNiw3ICs4MTksNyBAQAogCX0KIAogCWlmICgobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLKSAmJgotCSAgICAoIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX05VTExGVU5DX0FDS0VEKSkpIHsKKwkgICAgIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX05VTExGVU5DX0FDS0VEKSkgewogCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CiAKIAkJaWYgKGRydl90eF9mcmFtZXNfcGVuZGluZyhsb2NhbCkpCkBAIC0xMTE4LDYgKzExMjEsOCBAQAogCiAJLyogb24gdGhlIG5leHQgYXNzb2MsIHJlLXByb2dyYW0gSFQgcGFyYW1ldGVycyAqLwogCXNkYXRhLT5odF9vcG1vZGVfdmFsaWQgPSBmYWxzZTsKKwltZW1zZXQoJmlmbWdkLT5odF9jYXBhLCAwLCBzaXplb2YoaWZtZ2QtPmh0X2NhcGEpKTsKKwltZW1zZXQoJmlmbWdkLT5odF9jYXBhX21hc2ssIDAsIHNpemVvZihpZm1nZC0+aHRfY2FwYV9tYXNrKSk7CiAKIAlsb2NhbC0+cG93ZXJfY29uc3RyX2xldmVsID0gMDsKIApAQCAtMTM1Nyw5ICsxMzYyLDYgQEAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCB0cnVlLCB0cnVlKTsKIAltdXRleF91bmxvY2soJmlmbWdkLT5tdHgpOwogCi0JbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7Ci0JaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKLQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCS8qCiAJICogbXVzdCBiZSBvdXRzaWRlIGxvY2sgZHVlIHRvIGNmZzgwMjExLAogCSAqIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbS4KQEAgLTEzNjgsNiArMTM3MCwxMCBAQAogCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfREVBVVRILAogCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSwKIAkJCQkgICAgICAgTlVMTCwgdHJ1ZSk7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKKwlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX2JlYWNvbl9jb25uZWN0aW9uX2xvc3Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xNTcxLDExICsxNTc3LDEwIEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIKTsKLQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BU1NPQyk7Ci0Jc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVNTT0NfQVApOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEgpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKIAlpZiAoIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0NPTlRST0xfUE9SVCkpCi0JCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpOworCQlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKTsKIAogCXJhdGVzID0gMDsKIAliYXNpY19yYXRlcyA9IDA7CkBAIC0xNjExLDcgKzE2MTYsNyBAQAogCQlzZGF0YS0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9TREFUQV9PUEVSQVRJTkdfR01PREU7CiAKIAlpZiAoZWxlbXMuaHRfY2FwX2VsZW0gJiYgIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX0RJU0FCTEVfMTFOKSkKLQkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNiYW5kLAorCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2RhdGEsIHNiYW5kLAogCQkJCWVsZW1zLmh0X2NhcF9lbGVtLCAmc3RhLT5zdGEuaHRfY2FwKTsKIAogCWFwX2h0X2NhcF9mbGFncyA9IHN0YS0+c3RhLmh0X2NhcC5jYXA7CkBAIC0xOTgwLDcgKzE5ODUsNyBAQAogCiAJCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXTsKIAotCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2JhbmQsCisJCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzZGF0YSwgc2JhbmQsCiAJCQkJZWxlbXMuaHRfY2FwX2VsZW0sICZzdGEtPnN0YS5odF9jYXApOwogCiAJCWFwX2h0X2NhcF9mbGFncyA9IHN0YS0+c3RhLmh0X2NhcC5jYXA7CkBAIC0yMTM0LDkgKzIxMzksNiBAQAogCiAJaWVlZTgwMjExX3NldF9kaXNhc3NvYyhzZGF0YSwgdHJ1ZSwgdHJ1ZSk7CiAJbXV0ZXhfdW5sb2NrKCZpZm1nZC0+bXR4KTsKLQltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKLQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwotCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAJLyoKIAkgKiBtdXN0IGJlIG91dHNpZGUgbG9jayBkdWUgdG8gY2ZnODAyMTEsCiAJICogYnV0IHRoYXQncyBub3QgYSBwcm9ibGVtLgpAQCAtMjE0NCw2ICsyMTQ2LDExIEBACiAJaWVlZTgwMjExX3NlbmRfZGVhdXRoX2Rpc2Fzc29jKHNkYXRhLCBic3NpZCwKIAkJCUlFRUU4MDIxMV9TVFlQRV9ERUFVVEgsIHJlYXNvbiwKIAkJCU5VTEwsIHRydWUpOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKKwltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOworCiAJbXV0ZXhfbG9jaygmaWZtZ2QtPm10eCk7CiB9CiAKQEAgLTIyOTQsNiArMjMwMSw3IEBACiAKIAljYW5jZWxfd29ya19zeW5jKCZpZm1nZC0+cmVxdWVzdF9zbXBzX3dvcmspOwogCisJY2FuY2VsX3dvcmtfc3luYygmaWZtZ2QtPm1vbml0b3Jfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmaWZtZ2QtPmJlYWNvbl9jb25uZWN0aW9uX2xvc3Nfd29yayk7CiAJaWYgKGRlbF90aW1lcl9zeW5jKCZpZm1nZC0+dGltZXIpKQogCQlzZXRfYml0KFRNUl9SVU5OSU5HX1RJTUVSLCAmaWZtZ2QtPnRpbWVyc19ydW5uaW5nKTsKQEAgLTIzMDIsNyArMjMxMCw2IEBACiAJaWYgKGRlbF90aW1lcl9zeW5jKCZpZm1nZC0+Y2hzd2l0Y2hfdGltZXIpKQogCQlzZXRfYml0KFRNUl9SVU5OSU5HX0NIQU5TVywgJmlmbWdkLT50aW1lcnNfcnVubmluZyk7CiAKLQljYW5jZWxfd29ya19zeW5jKCZpZm1nZC0+bW9uaXRvcl93b3JrKTsKIAkvKiB0aGVzZSB3aWxsIGp1c3QgYmUgcmUtZXN0YWJsaXNoZWQgb24gY29ubmVjdGlvbiAqLwogCWRlbF90aW1lcl9zeW5jKCZpZm1nZC0+Y29ubl9tb25fdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZpZm1nZC0+YmNuX21vbl90aW1lcik7CkBAIC0yMzY0LDYgKzIzNzEsNyBAQAogCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNkYXRhKTsKIAogCWlmbWdkLT5mbGFncyA9IDA7CisJaWZtZ2QtPnBvd2Vyc2F2ZSA9IHNkYXRhLT53ZGV2LnBzOwogCiAJbXV0ZXhfaW5pdCgmaWZtZ2QtPm10eCk7CiAKQEAgLTI2MzgsNiArMjY0NiwxMyBAQAogCQkJaWZtZ2QtPmZsYWdzIHw9IElFRUU4MDIxMV9TVEFfRElTQUJMRV8xMU47CiAKIAorCWlmIChyZXEtPmZsYWdzICYgQVNTT0NfUkVRX0RJU0FCTEVfSFQpCisJCWlmbWdkLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0RJU0FCTEVfMTFOOworCisJbWVtY3B5KCZpZm1nZC0+aHRfY2FwYSwgJnJlcS0+aHRfY2FwYSwgc2l6ZW9mKGlmbWdkLT5odF9jYXBhKSk7CisJbWVtY3B5KCZpZm1nZC0+aHRfY2FwYV9tYXNrLCAmcmVxLT5odF9jYXBhX21hc2ssCisJICAgICAgIHNpemVvZihpZm1nZC0+aHRfY2FwYV9tYXNrKSk7CisKIAlpZiAocmVxLT5pZSAmJiByZXEtPmllX2xlbikgewogCQltZW1jcHkod2stPmllLCByZXEtPmllLCByZXEtPmllX2xlbik7CiAJCXdrLT5pZV9sZW4gPSByZXEtPmllX2xlbjsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMgYi9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCmluZGV4IDEzNDI3YjEuLmU0MzMwZDg0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCisrKyBiL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAiZHJpdmVyLXRyYWNlLmgiCkBAIC0xNTUsNyArMTU2LDYgQEAKIH0KIAogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIGJvb2wgZW5hYmxlX2JlYWNvbmluZywKIAkJCQkgYm9vbCBvZmZjaGFubmVsX3BzX2Rpc2FibGUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CkBAIC0xODcsMTEgKzE4Nyw5IEBACiAJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CiAJCX0KIAotCQkvKiBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlLWVuYWJsZSBiZWFjb25pbmcgKi8KLQkJaWYgKGVuYWJsZV9iZWFjb25pbmcgJiYKLQkJICAgIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkJICAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKLQkJICAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkpCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeSgKIAkJCQlzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpOwogCX0KQEAgLTIxMSw4ICsyMDksNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKLQogCWlmIChsb2NhbC0+aHdfcm9jX3NrYikgewogCQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGxvY2FsLT5od19yb2NfZGV2KTsKIAkJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgbG9jYWwtPmh3X3JvY19za2IpOwpAQCAtMjI2LDYgKzIyMiw4IEBACiAJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJfQogCisJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKKwogCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYXRlLmMgYi9uZXQvbWFjODAyMTEvcmF0ZS5jCmluZGV4IGZmNWMzYWEuLjVhNWE3NzYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYXRlLmMKKysrIGIvbmV0L21hYzgwMjExL3JhdGUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJyYXRlLmgiCiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJkZWJ1Z2ZzLmgiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwppbmRleCA1OGE4OTU1Li5iMzlkZGE1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKQEAgLTMzNCw4ICszMzQsOCBAQAogCiAKIHN0YXRpYyB2b2lkCi1jYWxjX3JhdGVfZHVyYXRpb25zKHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWksIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWluc3RyZWxfcmF0ZSAqZCwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlKQorY2FsY19yYXRlX2R1cmF0aW9ucyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IG1pbnN0cmVsX3JhdGUgKmQsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGUpCiB7CiAJaW50IGVycCA9ICEhKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1JBVEVfRVJQX0cpOwogCkBAIC00MDIsOCArNDAyLDcgQEAKIAogCQltci0+cml4ID0gaTsKIAkJbXItPmJpdHJhdGUgPSBzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZSAvIDU7Ci0JCWNhbGNfcmF0ZV9kdXJhdGlvbnMobWksIGxvY2FsLCBtciwKLQkJCQkmc2JhbmQtPmJpdHJhdGVzW2ldKTsKKwkJY2FsY19yYXRlX2R1cmF0aW9ucyhsb2NhbCwgbXIsICZzYmFuZC0+Yml0cmF0ZXNbaV0pOwogCiAJCS8qIGNhbGN1bGF0ZSBtYXhpbXVtIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgYmVmb3JlCiAJCSAqIGZhbGxiYWNrIChiYXNlZCBvbiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSkgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwppbmRleCBhMjkwYWQyMy4uZDVhNTYyMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAicmM4MDIxMV9taW5zdHJlbC5oIgogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCBjZGIyODUzLi5mZjVmN2I4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTM2LDggKzM2LDE3IEBACiAvKiBUcmFuc21pdCBkdXJhdGlvbiBmb3IgdGhlIHJhdyBkYXRhIHBhcnQgb2YgYW4gYXZlcmFnZSBzaXplZCBwYWNrZXQgKi8KICNkZWZpbmUgTUNTX0RVUkFUSU9OKHN0cmVhbXMsIHNnaSwgYnBzKSBNQ1NfU1lNQk9MX1RJTUUoc2dpLCBNQ1NfTlNZTVMoKHN0cmVhbXMpICogKGJwcykpKQogCisvKgorICogRGVmaW5lIGdyb3VwIHNvcnQgb3JkZXI6IEhUNDAgLT4gU0dJIC0+ICNzdHJlYW1zCisgKi8KKyNkZWZpbmUgR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogMiAqIF9odDQwICsJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogX3NnaSArCQlcCisJX3N0cmVhbXMgLSAxCisKIC8qIE1DUyByYXRlIGluZm9ybWF0aW9uIGZvciBhbiBNQ1MgZ3JvdXAgKi8KLSNkZWZpbmUgTUNTX0dST1VQKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkgewkJCQlcCisjZGVmaW5lIE1DU19HUk9VUChfc3RyZWFtcywgX3NnaSwgX2h0NDApCQkJCVwKKwlbR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCldID0gewkJCQlcCiAJLnN0cmVhbXMgPSBfc3RyZWFtcywJCQkJCQlcCiAJLmZsYWdzID0JCQkJCQkJXAogCQkoX3NnaSA/IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSA6IDApIHwJCQlcCkBAIC01OCw2ICs2Nyw5IEBACiAgKiBUbyBlbmFibGUgc3VmZmljaWVudGx5IHRhcmdldGVkIHJhdGUgc2FtcGxpbmcsIE1DUyByYXRlcyBhcmUgZGl2aWRlZCBpbnRvCiAgKiBncm91cHMsIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyBhbmQgZmxhZ3MgKEhUNDAsIFNHSSkgdGhhdCB0aGV5CiAgKiB1c2UuCisgKgorICogU29ydG9yZGVyIGhhcyB0byBiZSBmaXhlZCBmb3IgR1JPVVBfSURYIG1hY3JvIHRvIGJlIGFwcGxpY2FibGU6CisgKiBIVDQwIC0+IFNHSSAtPiAjc3RyZWFtcwogICovCiBjb25zdCBzdHJ1Y3QgbWNzX2dyb3VwIG1pbnN0cmVsX21jc19ncm91cHNbXSA9IHsKIAlNQ1NfR1JPVVAoMSwgMCwgMCksCkBAIC0xMDIsMjEgKzExNCw5IEBACiBzdGF0aWMgaW50CiBtaW5zdHJlbF9odF9nZXRfZ3JvdXBfaWR4KHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpbnQgc3RyZWFtcyA9IChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMTsKLQl1MzIgZmxhZ3MgPSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kgfCBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWluc3RyZWxfbWNzX2dyb3Vwcyk7IGkrKykgewotCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5zdHJlYW1zICE9IHN0cmVhbXMpCi0JCQljb250aW51ZTsKLQkJaWYgKG1pbnN0cmVsX21jc19ncm91cHNbaV0uZmxhZ3MgIT0gKHJhdGUtPmZsYWdzICYgZmxhZ3MpKQotCQkJY29udGludWU7Ci0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JV0FSTl9PTigxKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gR1JPVVBfSURYKChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMSwKKwkJCSAhIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSksCisJCQkgISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKgpAQCAtMTMwLDcgKzEzMCw3IEBACiAgKiBSZWNhbGN1bGF0ZSBzdWNjZXNzIHByb2JhYmlsaXRpZXMgYW5kIGNvdW50ZXJzIGZvciBhIHJhdGUgdXNpbmcgRVdNQQogICovCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfY2FsY19yYXRlX2V3bWEoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCittaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCiB7CiAJaWYgKHVubGlrZWx5KG1yLT5hdHRlbXB0cyA+IDApKSB7CiAJCW1yLT5zYW1wbGVfc2tpcHBlZCA9IDA7CkBAIC0xNTYsOCArMTU2LDcgQEAKICAqIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGFuZCB0aGVpciBleHBlY3RlZCBsZW5ndGgKICAqLwogc3RhdGljIHZvaWQKLW1pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwLCBpbnQgcmF0ZSkKK21pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIGludCBncm91cCwgaW50IHJhdGUpCiB7CiAJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOwogCXVuc2lnbmVkIGludCB1c2VjczsKQEAgLTIyNiw4ICsyMjUsOCBAQAogCQkJbXIgPSAmbWctPnJhdGVzW2ldOwogCQkJbXItPnJldHJ5X3VwZGF0ZWQgPSBmYWxzZTsKIAkJCWluZGV4ID0gTUNTX0dST1VQX1JBVEVTICogZ3JvdXAgKyBpOwotCQkJbWluc3RyZWxfY2FsY19yYXRlX2V3bWEobXAsIG1yKTsKLQkJCW1pbnN0cmVsX2h0X2NhbGNfdHAobXAsIG1pLCBncm91cCwgaSk7CisJCQltaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShtcik7CisJCQltaW5zdHJlbF9odF9jYWxjX3RwKG1pLCBncm91cCwgaSk7CiAKIAkJCWlmICghbXItPmN1cl90cCkKIAkJCQljb250aW51ZTsKQEAgLTMwMCwxMCArMjk5LDEwIEBACiBzdGF0aWMgYm9vbAogbWluc3RyZWxfaHRfdHhzdGF0X3ZhbGlkKHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpZiAoIXJhdGUtPmNvdW50KQorCWlmIChyYXRlLT5pZHggPCAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAocmF0ZS0+aWR4IDwgMCkKKwlpZiAoIXJhdGUtPmNvdW50KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKTsKQEAgLTM1Nyw3ICszNTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfYWdncl9jaGVjayhzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCittaW5zdHJlbF9hZ2dyX2NoZWNrKHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YocHVic3RhLCBzdHJ1Y3Qgc3RhX2luZm8sIHN0YSk7CkBAIC00NTUsNyArNDU0LDcgQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtaS0+c3RhdHNfdXBkYXRlICsgKG1wLT51cGRhdGVfaW50ZXJ2YWwgLyAyICogSFopIC8gMTAwMCkpIHsKIAkJbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CiAJCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpCi0JCQltaW5zdHJlbF9hZ2dyX2NoZWNrKG1wLCBzdGEsIHNrYik7CisJCQltaW5zdHJlbF9hZ2dyX2NoZWNrKHN0YSwgc2tiKTsKIAl9CiB9CiAKQEAgLTUxNSw3ICs1MTQsNiBAQAogc3RhdGljIHZvaWQKIG1pbnN0cmVsX2h0X3NldF9yYXRlKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYW1wbGUsIGJvb2wgcnRzY3RzKQogewogCWNvbnN0IHN0cnVjdCBtY3NfZ3JvdXAgKmdyb3VwID0gJm1pbnN0cmVsX21jc19ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdOwpAQCAtNjI4LDExICs2MjYsMTEgQEAKIAlpZiAoc2FtcGxlX2lkeCA+PSAwKSB7CiAJCXNhbXBsZSA9IHRydWU7CiAJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzBdLCBzYW1wbGVfaWR4LAotCQkJdHhyYywgdHJ1ZSwgZmFsc2UpOworCQkJdHJ1ZSwgZmFsc2UpOwogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKIAl9IGVsc2UgewogCQltaW5zdHJlbF9odF9zZXRfcmF0ZShtcCwgbWksICZhclswXSwgbWktPm1heF90cF9yYXRlLAotCQkJdHhyYywgZmFsc2UsIGZhbHNlKTsKKwkJCWZhbHNlLCBmYWxzZSk7CiAJfQogCiAJaWYgKG1wLT5ody0+bWF4X3JhdGVzID49IDMpIHsKQEAgLTY0MywxMyArNjQxLDEzIEBACiAJCSAqLwogCQlpZiAoc2FtcGxlX2lkeCA+PSAwKQogCQkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfdHBfcmF0ZSwKLQkJCQl0eHJjLCBmYWxzZSwgZmFsc2UpOworCQkJCWZhbHNlLCBmYWxzZSk7CiAJCWVsc2UKIAkJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzFdLCBtaS0+bWF4X3RwX3JhdGUyLAotCQkJCXR4cmMsIGZhbHNlLCB0cnVlKTsKKwkJCQlmYWxzZSwgdHJ1ZSk7CiAKIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMl0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzNdLmNvdW50ID0gMDsKIAkJYXJbM10uaWR4ID0gLTE7CkBAIC02NjAsNyArNjU4LDcgQEAKIAkJICogbWF4X3RwX3JhdGUgLT4gbWF4X3Byb2JfcmF0ZSBieSBkZWZhdWx0LgogCQkgKi8KIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzJdLmNvdW50ID0gMDsKIAkJYXJbMl0uaWR4ID0gLTE7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMKaW5kZXggY2VmY2I1ZC4uZTc4OGY3NiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHRfZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsLmgiCiAjaW5jbHVkZSAicmM4MDIxMV9taW5zdHJlbF9odC5oIgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9kZWJ1Z2ZzLmMKaW5kZXggNDg1MWU5ZS4uYzk3YTA2NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfZGVidWdmcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlICJyYXRlLmgiCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcnguYyBiL25ldC9tYWM4MDIxMS9yeC5jCmluZGV4IDVmNjc1MWEuLjJiZTViN2QgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9yeC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KIApAQCAtMTQwLDggKzE0MSw5IEBACiAJcG9zKys7CiAKIAkvKiBJRUVFODAyMTFfUkFESU9UQVBfUkFURSAqLwotCWlmIChzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX0hUKSB7CisJaWYgKCFyYXRlIHx8IHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSFQpIHsKIAkJLyoKKwkJICogV2l0aG91dCByYXRlIGluZm9ybWF0aW9uIGRvbid0IGFkZCBpdC4gSWYgd2UgaGF2ZSwKIAkJICogTUNTIGluZm9ybWF0aW9uIGlzIGEgc2VwYXJhdGUgZmllbGQgaW4gcmFkaW90YXAsCiAJCSAqIGFkZGVkIGJlbG93LiBUaGUgYnl0ZSBoZXJlIGlzIG5lZWRlZCBhcyBwYWRkaW5nCiAJCSAqIGZvciB0aGUgY2hhbm5lbCB0aG91Z2gsIHNvIGluaXRpYWxpc2UgaXQgdG8gMC4KQEAgLTE2MiwxMiArMTY0LDE0IEBACiAJZWxzZSBpZiAoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCkKIAkJcHV0X3VuYWxpZ25lZF9sZTE2KElFRUU4MDIxMV9DSEFOX0RZTiB8IElFRUU4MDIxMV9DSEFOXzJHSFosCiAJCQkJICAgcG9zKTsKLQllbHNlIGlmIChyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX0VSUF9HKQorCWVsc2UgaWYgKHJhdGUgJiYgcmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9FUlBfRykKIAkJcHV0X3VuYWxpZ25lZF9sZTE2KElFRUU4MDIxMV9DSEFOX09GRE0gfCBJRUVFODAyMTFfQ0hBTl8yR0haLAogCQkJCSAgIHBvcyk7Ci0JZWxzZQorCWVsc2UgaWYgKHJhdGUpCiAJCXB1dF91bmFsaWduZWRfbGUxNihJRUVFODAyMTFfQ0hBTl9DQ0sgfCBJRUVFODAyMTFfQ0hBTl8yR0haLAogCQkJCSAgIHBvcyk7CisJZWxzZQorCQlwdXRfdW5hbGlnbmVkX2xlMTYoSUVFRTgwMjExX0NIQU5fMkdIWiwgcG9zKTsKIAlwb3MgKz0gMjsKIAogCS8qIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMICovCkBAIC0xODkxLDEzICsxODk1LDE2IEBACiBzdGF0aWMgaWVlZTgwMjExX3J4X3Jlc3VsdAogaWVlZTgwMjExX3J4X2hfbWVzaF9md2Rpbmcoc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhICpyeCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpmd2RfaGRyLCAqaGRyOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgaWVlZTgwMjExc19oZHIgKm1lc2hfaGRyOwotCXVuc2lnbmVkIGludCBoZHJsZW47CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4LT5za2IsICpmd2Rfc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gcngtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gcngtPnNkYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMgPSBJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CisJX19sZTE2IHJlYXNvbiA9IGNwdV90b19sZTE2KFdMQU5fUkVBU09OX01FU0hfUEFUSF9OT0ZPUldBUkQpOworCXUxNiBxLCBoZHJsZW47CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwogCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKQEAgLTE5MTMsMTUgKzE5MjAsOCBAQAogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAKIAlpZiAoIW1lc2hfaGRyLT50dGwpCi0JCS8qIGlsbGVnYWwgZnJhbWUgKi8KIAkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAotCWlmIChpZWVlODAyMTFfcXVldWVfc3RvcHBlZCgmbG9jYWwtPmh3LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSkpIHsKLQkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQygmc2RhdGEtPnUubWVzaCwKLQkJCQkJCWRyb3BwZWRfZnJhbWVzX2Nvbmdlc3Rpb24pOwotCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwotCX0KLQogCWlmIChtZXNoX2hkci0+ZmxhZ3MgJiBNRVNIX0ZMQUdTX0FFKSB7CiAJCXN0cnVjdCBtZXNoX3BhdGggKm1wcGF0aDsKIAkJY2hhciAqcHJveGllZF9hZGRyOwpAQCAtMTk1Myw1OSArMTk1Myw1MCBAQAogCSAgICBjb21wYXJlX2V0aGVyX2FkZHIoc2RhdGEtPnZpZi5hZGRyLCBoZHItPmFkZHIzKSA9PSAwKQogCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAKLQlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlKHNkYXRhLCBza2IpKTsKLQltZXNoX2hkci0+dHRsLS07CisJcSA9IGllZWU4MDIxMV9zZWxlY3RfcXVldWVfODAyMTEobG9jYWwsIHNrYiwgaGRyKTsKKwlpZiAoaWVlZTgwMjExX3F1ZXVlX3N0b3BwZWQoJmxvY2FsLT5odywgcSkpIHsKKwkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZHJvcHBlZF9mcmFtZXNfY29uZ2VzdGlvbik7CisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisJfQorCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIHEpOwogCi0JaWYgKHN0YXR1cy0+cnhfZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpIHsKLQkJaWYgKCFtZXNoX2hkci0+dHRsKQotCQkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQygmcngtPnNkYXRhLT51Lm1lc2gsCi0JCQkJCQkgICAgIGRyb3BwZWRfZnJhbWVzX3R0bCk7Ci0JCWVsc2UgewotCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmZ3ZF9oZHI7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCisJCWdvdG8gb3V0OwogCi0JCQlmd2Rfc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKLQotCQkJaWYgKCFmd2Rfc2tiICYmIG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBjbG9uZSBtZXNoIGZyYW1lXG4iLAotCQkJCQkJICAgc2RhdGEtPm5hbWUpOwotCQkJaWYgKCFmd2Rfc2tiKQotCQkJCWdvdG8gb3V0OwotCi0JCQlmd2RfaGRyID0gIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBmd2Rfc2tiLT5kYXRhOwotCQkJbWVtY3B5KGZ3ZF9oZHItPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKLQkJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGZ3ZF9za2IpOwotCQkJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwotCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05FRURfVFhQUk9DRVNTSU5HOwotCQkJaW5mby0+Y29udHJvbC52aWYgPSAmcngtPnNkYXRhLT52aWY7Ci0JCQlpbmZvLT5jb250cm9sLmppZmZpZXMgPSBqaWZmaWVzOwotCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGZ3ZF9oZHItPmFkZHIxKSkgewotCQkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnNkYXRhLT51Lm1lc2gsCi0JCQkJCQkJCWZ3ZGVkX21jYXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGVycjsKLQkJCQkvKgotCQkJCSAqIFNhdmUgVEEgdG8gYWRkcjEgdG8gc2VuZCBUQSBhIHBhdGggZXJyb3IgaWYgYQotCQkJCSAqIHN1aXRhYmxlIG5leHQgaG9wIGlzIG5vdCBmb3VuZAotCQkJCSAqLwotCQkJCW1lbWNweShmd2RfaGRyLT5hZGRyMSwgZndkX2hkci0+YWRkcjIsCi0JCQkJCQlFVEhfQUxFTik7Ci0JCQkJZXJyID0gbWVzaF9uZXh0aG9wX2xvb2t1cChmd2Rfc2tiLCBzZGF0YSk7Ci0JCQkJLyogRmFpbGVkIHRvIGltbWVkaWF0ZWx5IHJlc29sdmUgbmV4dCBob3A6Ci0JCQkJICogZndkZWQgZnJhbWUgd2FzIGRyb3BwZWQgb3Igd2lsbCBiZSBhZGRlZAotCQkJCSAqIGxhdGVyIHRvIHRoZSBwZW5kaW5nIHNrYiBxdWV1ZS4gICovCi0JCQkJaWYgKGVycikKLQkJCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQotCQkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnNkYXRhLT51Lm1lc2gsCi0JCQkJCQkJCWZ3ZGVkX3VuaWNhc3QpOwotCQkJfQotCQkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQygmc2RhdGEtPnUubWVzaCwKLQkJCQkJCSAgICAgZndkZWRfZnJhbWVzKTsKLQkJCWllZWU4MDIxMV9hZGRfcGVuZGluZ19za2IobG9jYWwsIGZ3ZF9za2IpOwotCQl9CisJaWYgKCEtLW1lc2hfaGRyLT50dGwpIHsKKwkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZHJvcHBlZF9mcmFtZXNfdHRsKTsKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKIAl9CiAKKwlmd2Rfc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWZ3ZF9za2IpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGNsb25lIG1lc2ggZnJhbWVcbiIsCisJCQkJCXNkYXRhLT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZndkX2hkciA9ICAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZndkX3NrYi0+ZGF0YTsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihmd2Rfc2tiKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05FRURfVFhQUk9DRVNTSU5HOworCWluZm8tPmNvbnRyb2wudmlmID0gJnJ4LT5zZGF0YS0+dmlmOworCWluZm8tPmNvbnRyb2wuamlmZmllcyA9IGppZmZpZXM7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGZ3ZF9oZHItPmFkZHIxKSkgeworCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBmd2RlZF9tY2FzdCk7CisJCW1lbWNweShmd2RfaGRyLT5hZGRyMiwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CisJfSBlbHNlIGlmICghbWVzaF9uZXh0aG9wX2xvb2t1cChmd2Rfc2tiLCBzZGF0YSkpIHsKKwkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZndkZWRfdW5pY2FzdCk7CisJfSBlbHNlIHsKKwkJLyogdW5hYmxlIHRvIHJlc29sdmUgbmV4dCBob3AgKi8KKwkJbWVzaF9wYXRoX2Vycm9yX3R4KGlmbXNoLT5tc2hjZmcuZWxlbWVudF90dGwsIGZ3ZF9oZHItPmFkZHIzLAorCQkJCSAgICAwLCByZWFzb24sIGZ3ZF9oZHItPmFkZHIyLCBzZGF0YSk7CisJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGRyb3BwZWRfZnJhbWVzX25vX3JvdXRlKTsKKwkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKKwl9CisKKwlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBmd2RlZF9mcmFtZXMpOworCWllZWU4MDIxMV9hZGRfcGVuZGluZ19za2IobG9jYWwsIGZ3ZF9za2IpOwogIG91dDoKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwKIAkgICAgc2RhdGEtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKQEAgLTIyNDYsNyArMjIzNyw4IEBACiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKIAkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCi0JCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCWJyZWFrOwogCiAJCS8qIHZlcmlmeSBhY3Rpb25fY29kZSBpcyBwcmVzZW50ICovCkBAIC0yNzgzLDggKzI3NzUsOCBAQAogCQkJCXJhdGVfaWR4ID0gMDsgLyogVE9ETzogSFQgcmF0ZXMgKi8KIAkJCWVsc2UKIAkJCQlyYXRlX2lkeCA9IHN0YXR1cy0+cmF0ZV9pZHg7Ci0JCQlyeC0+c3RhID0gaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgYnNzaWQsCi0JCQkJCWhkci0+YWRkcjIsIEJJVChyYXRlX2lkeCksIEdGUF9BVE9NSUMpOworCQkJaWVlZTgwMjExX2lic3Nfcnhfbm9fc3RhKHNkYXRhLCBic3NpZCwgaGRyLT5hZGRyMiwKKwkJCQkJCSBCSVQocmF0ZV9pZHgpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CkBAIC0yODA1LDEwICsyNzk3LDE3IEBACiAJCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSBpZiAoIWllZWU4MDIxMV9ic3NpZF9tYXRjaChic3NpZCwKIAkJCQkJc2RhdGEtPnZpZi5hZGRyKSkgeworCQkJLyoKKwkJCSAqIEFjY2VwdCBwdWJsaWMgYWN0aW9uIGZyYW1lcyBldmVuIHdoZW4gdGhlCisJCQkgKiBCU1NJRCBkb2Vzbid0IG1hdGNoLCB0aGlzIGlzIHVzZWQgZm9yIFAyUAorCQkJICogYW5kIGxvY2F0aW9uIHVwZGF0ZXMuIE5vdGUgdGhhdCBtYWM4MDIxMQorCQkJICogaXRzZWxmIG5ldmVyIGxvb2tzIGF0IHRoZXNlIGZyYW1lcy4KKwkJCSAqLwogCQkJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9JTl9TQ0FOKSAmJgotCQkJICAgICFpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJCSAgICAhKGllZWU4MDIxMV9pc19hY3Rpb24oaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkJICAgICAgc2RhdGEtPnZpZi5wMnApKQorCQkJICAgIGllZWU4MDIxMV9pc19wdWJsaWNfYWN0aW9uKGhkciwgc2tiLT5sZW4pKQorCQkJCXJldHVybiAxOworCQkJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9JTl9TQ0FOKSAmJgorCQkJICAgICFpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCQkJcmV0dXJuIDA7CiAJCQlzdGF0dXMtPnJ4X2ZsYWdzICY9IH5JRUVFODAyMTFfUlhfUkFfTUFUQ0g7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zY2FuLmMgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCmluZGV4IDgzYTBiMDUuLjJjNTA0MWMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zY2FuLmMKKysrIGIvbmV0L21hYzgwMjExL3NjYW4uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgogI2luY2x1ZGUgPG5ldC9zY2hfZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCkBAIC0yMTIsMTIgKzIxMyw3IEBACiAJaWYgKGJzcykKIAkJaWVlZTgwMjExX3J4X2Jzc19wdXQoc2RhdGEtPmxvY2FsLCBic3MpOwogCi0JLyogSWYgd2UgYXJlIG9uLW9wZXJhdGluZy1jaGFubmVsLCBhbmQgdGhpcyBwYWNrZXQgaXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgY2hhbm5lbCwgcGFzcyB0aGUgcGt0IG9uIHVwIHRoZSBzdGFjayBzbyB0aGF0Ci0JICogdGhlIHJlc3Qgb2YgdGhlIHN0YWNrIGNhbiBtYWtlIHVzZSBvZiBpdC4KLQkgKi8KLQlpZiAoaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwoc2RhdGEtPmxvY2FsKQotCSAgICAmJiAoY2hhbm5lbCA9PSBzZGF0YS0+bG9jYWwtPm9wZXJfY2hhbm5lbCkpCisJaWYgKGNoYW5uZWwgPT0gc2RhdGEtPmxvY2FsLT5vcGVyX2NoYW5uZWwpCiAJCXJldHVybiBSWF9DT05USU5VRTsKIAogCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTI2Myw4ICsyNTksNiBAQAogCQkJCSAgICAgICBib29sIHdhc19od19zY2FuKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCWJvb2wgb25fb3Blcl9jaGFuOwotCWJvb2wgZW5hYmxlX2JlYWNvbnMgPSBmYWxzZTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOwogCkBAIC0yOTcsMjUgKzI5MSwxMyBAQAogCWxvY2FsLT5zY2FubmluZyA9IDA7CiAJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IE5VTEw7CiAKLQlvbl9vcGVyX2NoYW4gPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0KLQlpZiAod2FzX2h3X3NjYW4gfHwgIW9uX29wZXJfY2hhbikKLQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpOwotCWVsc2UKLQkJLyogU2V0IHBvd2VyIGJhY2sgdG8gbm9ybWFsIG9wZXJhdGluZyBsZXZlbHMuICovCi0JCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOworCS8qIFNldCBwb3dlciBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpbmcgbGV2ZWxzLiAqLworCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwogCiAJaWYgKCF3YXNfaHdfc2NhbikgewotCQlib29sIG9uX29wZXJfY2hhbjI7CiAJCWllZWU4MDIxMV9jb25maWd1cmVfZmlsdGVyKGxvY2FsKTsKIAkJZHJ2X3N3X3NjYW5fY29tcGxldGUobG9jYWwpOwotCQlvbl9vcGVyX2NoYW4yID0gaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpOwotCQkvKiBXZSBzaG91bGQgYWx3YXlzIGJlIG9uLWNoYW5uZWwgYXQgdGhpcyBwb2ludC4gKi8KLQkJV0FSTl9PTighb25fb3Blcl9jaGFuMik7Ci0JCWlmIChvbl9vcGVyX2NoYW4yICYmIChvbl9vcGVyX2NoYW4gIT0gb25fb3Blcl9jaGFuMikpCi0JCQllbmFibGVfYmVhY29ucyA9IHRydWU7Ci0KLQkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCBlbmFibGVfYmVhY29ucywgdHJ1ZSk7CisJCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwgdHJ1ZSk7CiAJfQogCiAJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKQEAgLTM2MCwxMSArMzQyLDcgQEAKIAlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9ERUNJU0lPTjsKIAlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA9IDA7CiAKLQkvKiBXZSBhbHdheXMgd2FudCB0byB1c2Ugb2ZmLWNoYW5uZWwgUFMsIGV2ZW4gaWYgd2UKLQkgKiBhcmUgbm90IHJlYWxseSBsZWF2aW5nIG9wZXItY2hhbm5lbC4gIERvbid0Ci0JICogdGVsbCB0aGUgQVAgdGhvdWdoLCBhcyBsb25nIGFzIHdlIGFyZSBvbi1jaGFubmVsLgotCSAqLwotCWllZWU4MDIxMV9vZmZjaGFubmVsX2VuYWJsZV9hbGxfcHMobG9jYWwsIGZhbHNlKTsKKwlpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMobG9jYWwsIHRydWUpOwogCiAJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwogCkBAIC0zNzIsOCArMzUwLDcgQEAKIAlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKIAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoJmxvY2FsLT5odywKLQkJCQkgICAgICZsb2NhbC0+c2Nhbl93b3JrLAotCQkJCSAgICAgSUVFRTgwMjExX0NIQU5ORUxfVElNRSk7CisJCQkJICAgICAmbG9jYWwtPnNjYW5fd29yaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwOSw5OCArNDg2LDQxIEBACiAKIAluZXh0X2NoYW4gPSBsb2NhbC0+c2Nhbl9yZXEtPmNoYW5uZWxzW2xvY2FsLT5zY2FuX2NoYW5uZWxfaWR4XTsKIAotCWlmIChpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCkpIHsKLQkJLyogV2UncmUgY3VycmVudGx5IG9uIG9wZXJhdGluZyBjaGFubmVsLiAqLwotCQlpZiAobmV4dF9jaGFuID09IGxvY2FsLT5vcGVyX2NoYW5uZWwpCi0JCQkvKiBXZSBkb24ndCBuZWVkIHRvIG1vdmUgb2ZmIG9mIG9wZXJhdGluZyBjaGFubmVsLiAqLwotCQkJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fU0VUX0NIQU5ORUw7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBXZSBkbyBuZWVkIHRvIGxlYXZlIG9wZXJhdGluZyBjaGFubmVsLCBhcyBuZXh0Ci0JCQkgKiBzY2FuIGlzIHNvbWV3aGVyZSBlbHNlLgotCQkJICovCi0JCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9MRUFWRV9PUEVSX0NIQU5ORUw7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogd2UncmUgY3VycmVudGx5IHNjYW5uaW5nIGEgZGlmZmVyZW50IGNoYW5uZWwsIGxldCdzCi0JCSAqIHNlZSBpZiB3ZSBjYW4gc2NhbiBhbm90aGVyIGNoYW5uZWwgd2l0aG91dCBpbnRlcmZlcmluZwotCQkgKiB3aXRoIHRoZSBjdXJyZW50IHRyYWZmaWMgc2l0dWF0aW9uLgotCQkgKgotCQkgKiBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBBUCBoYXMgcGVuZGluZyBmcmFtZXMgZm9yIHVzCi0JCSAqIHdlIGNhbiBvbmx5IGNoZWNrIGZvciBvdXIgdHggcXVldWVzIGFuZCB1c2UgdGhlIGN1cnJlbnQKLQkJICogcG1fcW9zIHJlcXVpcmVtZW50cyBmb3IgcnguIEhlbmNlLCBpZiBubyB0eCB0cmFmZmljIG9jY3VycwotCQkgKiBhdCBhbGwgd2Ugd2lsbCBzY2FuIGFzIG1hbnkgY2hhbm5lbHMgaW4gYSByb3cgYXMgdGhlIHBtX3FvcwotCQkgKiBsYXRlbmN5IGFsbG93cyB1cyB0by4gQWRkaXRpb25hbGx5IHdlIGFsc28gY2hlY2sgZm9yIHRoZQotCQkgKiBjdXJyZW50bHkgbmVnb3RpYXRlZCBsaXN0ZW4gaW50ZXJ2YWwgdG8gcHJldmVudCBsb3NpbmcKLQkJICogZnJhbWVzIHVubmVjZXNzYXJpbHkuCi0JCSAqCi0JCSAqIE90aGVyd2lzZSBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwuCi0JCSAqLworCS8qCisJICogd2UncmUgY3VycmVudGx5IHNjYW5uaW5nIGEgZGlmZmVyZW50IGNoYW5uZWwsIGxldCdzCisJICogc2VlIGlmIHdlIGNhbiBzY2FuIGFub3RoZXIgY2hhbm5lbCB3aXRob3V0IGludGVyZmVyaW5nCisJICogd2l0aCB0aGUgY3VycmVudCB0cmFmZmljIHNpdHVhdGlvbi4KKwkgKgorCSAqIFNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlIEFQIGhhcyBwZW5kaW5nIGZyYW1lcyBmb3IgdXMKKwkgKiB3ZSBjYW4gb25seSBjaGVjayBmb3Igb3VyIHR4IHF1ZXVlcyBhbmQgdXNlIHRoZSBjdXJyZW50CisJICogcG1fcW9zIHJlcXVpcmVtZW50cyBmb3IgcnguIEhlbmNlLCBpZiBubyB0eCB0cmFmZmljIG9jY3VycworCSAqIGF0IGFsbCB3ZSB3aWxsIHNjYW4gYXMgbWFueSBjaGFubmVscyBpbiBhIHJvdyBhcyB0aGUgcG1fcW9zCisJICogbGF0ZW5jeSBhbGxvd3MgdXMgdG8uIEFkZGl0aW9uYWxseSB3ZSBhbHNvIGNoZWNrIGZvciB0aGUKKwkgKiBjdXJyZW50bHkgbmVnb3RpYXRlZCBsaXN0ZW4gaW50ZXJ2YWwgdG8gcHJldmVudCBsb3NpbmcKKwkgKiBmcmFtZXMgdW5uZWNlc3NhcmlseS4KKwkgKgorCSAqIE90aGVyd2lzZSBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwuCisJICovCiAKLQkJYmFkX2xhdGVuY3kgPSB0aW1lX2FmdGVyKGppZmZpZXMgKwotCQkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKLQkJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKwotCQkJCXVzZWNzX3RvX2ppZmZpZXMocG1fcW9zX3JlcXVlc3QoUE1fUU9TX05FVFdPUktfTEFURU5DWSkpKTsKKwliYWRfbGF0ZW5jeSA9IHRpbWVfYWZ0ZXIoamlmZmllcyArCisJCQlpZWVlODAyMTFfc2Nhbl9nZXRfY2hhbm5lbF90aW1lKG5leHRfY2hhbiksCisJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKworCQkJdXNlY3NfdG9famlmZmllcyhwbV9xb3NfcmVxdWVzdChQTV9RT1NfTkVUV09SS19MQVRFTkNZKSkpOwogCi0JCWxpc3Rlbl9pbnRfZXhjZWVkZWQgPSB0aW1lX2FmdGVyKGppZmZpZXMgKwotCQkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKLQkJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKwotCQkJCXVzZWNzX3RvX2ppZmZpZXMobWluX2JlYWNvbl9pbnQgKiAxMDI0KSAqCi0JCQkJbG9jYWwtPmh3LmNvbmYubGlzdGVuX2ludGVydmFsKTsKKwlsaXN0ZW5faW50X2V4Y2VlZGVkID0gdGltZV9hZnRlcihqaWZmaWVzICsKKwkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKKwkJCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSArCisJCQl1c2Vjc190b19qaWZmaWVzKG1pbl9iZWFjb25faW50ICogMTAyNCkgKgorCQkJbG9jYWwtPmh3LmNvbmYubGlzdGVuX2ludGVydmFsKTsKIAotCQlpZiAoYXNzb2NpYXRlZCAmJiAoICF0eF9lbXB0eSB8fCBiYWRfbGF0ZW5jeSB8fAotCQkgICAgbGlzdGVuX2ludF9leGNlZWRlZCkpCi0JCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9FTlRFUl9PUEVSX0NIQU5ORUw7Ci0JCWVsc2UKLQkJCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1NFVF9DSEFOTkVMOwotCX0KKwlpZiAoYXNzb2NpYXRlZCAmJiAoIXR4X2VtcHR5IHx8IGJhZF9sYXRlbmN5IHx8IGxpc3Rlbl9pbnRfZXhjZWVkZWQpKQorCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TVVNQRU5EOworCWVsc2UKKwkJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fU0VUX0NIQU5ORUw7CiAKIAkqbmV4dF9kZWxheSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zY2FuX3N0YXRlX2xlYXZlX29wZXJfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQotewotCS8qIFBTIHdpbGwgYWxyZWFkeSBiZSBpbiBvZmYtY2hhbm5lbCBtb2RlLAotCSAqIHdlIGRvIHRoYXQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHNjYW5uaW5nLgotCSAqLwotCWllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3Bfdmlmcyhsb2NhbCwgZmFsc2UpOwotCi0JLyoKLQkgKiBXaGF0IGlmIHRoZSBudWxsZnVuYyBmcmFtZXMgZGlkbid0IGFycml2ZT8KLQkgKi8KLQlkcnZfZmx1c2gobG9jYWwsIGZhbHNlKTsKLQlpZiAobG9jYWwtPm9wcy0+Zmx1c2gpCi0JCSpuZXh0X2RlbGF5ID0gMDsKLQllbHNlCi0JCSpuZXh0X2RlbGF5ID0gSFogLyAxMDsKLQotCS8qIHJlbWVtYmVyIHdoZW4gd2UgbGVmdCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KLQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgPSBqaWZmaWVzOwotCi0JLyogYWR2YW5jZSB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KLQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKLX0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fc3RhdGVfZW50ZXJfb3Blcl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5leHRfZGVsYXkpCi17Ci0JLyogc3dpdGNoIGJhY2sgdG8gdGhlIG9wZXJhdGluZyBjaGFubmVsICovCi0JbG9jYWwtPnNjYW5fY2hhbm5lbCA9IE5VTEw7Ci0JaWYgKCFpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCkpCi0JCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKLQotCS8qCi0JICogUmUtZW5hYmxlIHZpZnMgYW5kIGJlYWNvbmluZy4gIExlYXZlIFBTCi0JICogaW4gb2ZmLWNoYW5uZWwgc3RhdGUuLndpbGwgcHV0IHRoYXQgYmFjawotCSAqIG9uLWNoYW5uZWwgYXQgdGhlIGVuZCBvZiBzY2FubmluZy4KLQkgKi8KLQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIHRydWUsIGZhbHNlKTsKLQotCSpuZXh0X2RlbGF5ID0gSFogLyA1OwotCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOwotfQotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9zZXRfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQogewpAQCAtNjEyLDEwICs1MzIsOCBAQAogCiAJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IGNoYW47CiAKLQkvKiBPbmx5IGNhbGwgaHctY29uZmlnIGlmIHdlIHJlYWxseSBuZWVkIHRvIGNoYW5nZSBjaGFubmVscy4gKi8KLQlpZiAoY2hhbiAhPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsKQotCQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKQotCQkJc2tpcCA9IDE7CisJaWYgKGllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkKKwkJc2tpcCA9IDE7CiAKIAkvKiBhZHZhbmNlIHN0YXRlIG1hY2hpbmUgdG8gbmV4dCBjaGFubmVsL2JhbmQgKi8KIAlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCsrOwpAQCAtNjcyLDYgKzU5MCw0NCBAQAogCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOwogfQogCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV4dF9kZWxheSkKK3sKKwkvKiBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlsb2NhbC0+c2Nhbl9jaGFubmVsID0gTlVMTDsKKwlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCk7CisKKwkvKgorCSAqIFJlLWVuYWJsZSB2aWZzIGFuZCBiZWFjb25pbmcuICBMZWF2ZSBQUworCSAqIGluIG9mZi1jaGFubmVsIHN0YXRlLi53aWxsIHB1dCB0aGF0IGJhY2sKKwkgKiBvbi1jaGFubmVsIGF0IHRoZSBlbmQgb2Ygc2Nhbm5pbmcuCisJICovCisJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCBmYWxzZSk7CisKKwkqbmV4dF9kZWxheSA9IEhaIC8gNTsKKwkvKiBhZnRlcndhcmRzLCByZXN1bWUgc2NhbiAmIGdvIHRvIG5leHQgY2hhbm5lbCAqLworCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1JFU1VNRTsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fc3RhdGVfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQl1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQoreworCS8qIFBTIGFscmVhZHkgaXMgaW4gb2ZmLWNoYW5uZWwgbW9kZSAqLworCWllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3Bfdmlmcyhsb2NhbCwgZmFsc2UpOworCisJaWYgKGxvY2FsLT5vcHMtPmZsdXNoKSB7CisJCWRydl9mbHVzaChsb2NhbCwgZmFsc2UpOworCQkqbmV4dF9kZWxheSA9IDA7CisJfSBlbHNlCisJCSpuZXh0X2RlbGF5ID0gSFogLyAxMDsKKworCS8qIHJlbWVtYmVyIHdoZW4gd2UgbGVmdCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgPSBqaWZmaWVzOworCisJLyogYWR2YW5jZSB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KKwlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9ERUNJU0lPTjsKK30KKwogdm9pZCBpZWVlODAyMTFfc2Nhbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9CkBAIC03NDIsMTEgKzY5OCwxMSBAQAogCQljYXNlIFNDQU5fU0VORF9QUk9CRToKIAkJCWllZWU4MDIxMV9zY2FuX3N0YXRlX3NlbmRfcHJvYmUobG9jYWwsICZuZXh0X2RlbGF5KTsKIAkJCWJyZWFrOwotCQljYXNlIFNDQU5fTEVBVkVfT1BFUl9DSEFOTkVMOgotCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfbGVhdmVfb3Blcl9jaGFubmVsKGxvY2FsLCAmbmV4dF9kZWxheSk7CisJCWNhc2UgU0NBTl9TVVNQRU5EOgorCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfc3VzcGVuZChsb2NhbCwgJm5leHRfZGVsYXkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgU0NBTl9FTlRFUl9PUEVSX0NIQU5ORUw6Ci0JCQlpZWVlODAyMTFfc2Nhbl9zdGF0ZV9lbnRlcl9vcGVyX2NoYW5uZWwobG9jYWwsICZuZXh0X2RlbGF5KTsKKwkJY2FzZSBTQ0FOX1JFU1VNRToKKwkJCWllZWU4MDIxMV9zY2FuX3N0YXRlX3Jlc3VtZShsb2NhbCwgJm5leHRfZGVsYXkpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChuZXh0X2RlbGF5ID09IDApOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwppbmRleCA4ZWFhNzQ2Li4yZGIwMWU5IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtNjIsMTQgKzYyLDE0IEBACiAgKiBmcmVlZCBiZWZvcmUgdGhleSBhcmUgZG9uZSB1c2luZyBpdC4KICAqLwogCi0vKiBDYWxsZXIgbXVzdCBob2xkIGxvY2FsLT5zdGFfbG9jayAqLworLyogQ2FsbGVyIG11c3QgaG9sZCBsb2NhbC0+c3RhX210eCAqLwogc3RhdGljIGludCBzdGFfaW5mb19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpzOwogCiAJcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+c3RhLmFkZHIpXSwKLQkJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykpOworCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAlpZiAoIXMpCiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChzID09IHN0YSkgewpAQCAtODEsNyArODEsNyBAQAogCXdoaWxlIChyY3VfYWNjZXNzX3BvaW50ZXIocy0+aG5leHQpICYmCiAJICAgICAgIHJjdV9hY2Nlc3NfcG9pbnRlcihzLT5obmV4dCkgIT0gc3RhKQogCQlzID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzLT5obmV4dCwKLQkJCQkJbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spKTsKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIocy0+aG5leHQpKSB7CiAJCVJDVV9JTklUX1BPSU5URVIocy0+aG5leHQsIHN0YS0+aG5leHQpOwogCQlyZXR1cm4gMDsKQEAgLTk4LDE0ICs5OCwxMiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJd2hpbGUgKHN0YSkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSAmJiAhc3RhLT5kdW1teSAmJgogCQkgICAgbWVtY21wKHN0YS0+c3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJfQogCXJldHVybiBzdGE7CkBAIC0xMTksMTQgKzExNywxMiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJd2hpbGUgKHN0YSkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSAmJgogCQkgICAgbWVtY21wKHN0YS0+c3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJfQogCXJldHVybiBzdGE7CkBAIC0xNDMsNyArMTM5LDYgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAogCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goYWRkcildLAotCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykgfHwKIAkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCXdoaWxlIChzdGEpIHsKIAkJaWYgKChzdGEtPnNkYXRhID09IHNkYXRhIHx8CkBAIC0xNTIsNyArMTQ3LDYgQEAKIAkJICAgIG1lbWNtcChzdGEtPnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTikgPT0gMCkKIAkJCWJyZWFrOwogCQlzdGEgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2soc3RhLT5obmV4dCwKLQkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCX0KIAlyZXR1cm4gc3RhOwpAQCAtMTY5LDcgKzE2Myw2IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAKIAlzdGEgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKGFkZHIpXSwKLQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAl3aGlsZSAoc3RhKSB7CiAJCWlmICgoc3RhLT5zZGF0YSA9PSBzZGF0YSB8fApAQCAtMTc3LDcgKzE3MCw2IEBACiAJCSAgICBtZW1jbXAoc3RhLT5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pID09IDApCiAJCQlicmVhazsKIAkJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHN0YS0+aG5leHQsCi0JCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykgfHwKIAkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAl9CiAJcmV0dXJuIHN0YTsKQEAgLTIwNCwxNiArMTk2LDE3IEBACiB9CiAKIC8qKgotICogX19zdGFfaW5mb19mcmVlIC0gaW50ZXJuYWwgU1RBIGZyZWUgaGVscGVyCisgKiBzdGFfaW5mb19mcmVlIC0gZnJlZSBTVEEKICAqCiAgKiBAbG9jYWw6IHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBpbmZvcm1hdGlvbgogICogQHN0YTogU1RBIGluZm8gdG8gZnJlZQogICoKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCB1bmRvIGV2ZXJ5dGhpbmcgZG9uZSBieSBzdGFfaW5mb19hbGxvYygpCi0gKiB0aGF0IG1heSBoYXBwZW4gYmVmb3JlIHN0YV9pbmZvX2luc2VydCgpLgorICogdGhhdCBtYXkgaGFwcGVuIGJlZm9yZSBzdGFfaW5mb19pbnNlcnQoKS4gSXQgbWF5IG9ubHkgYmUKKyAqIGNhbGxlZCB3aGVuIHN0YV9pbmZvX2luc2VydCgpIGhhcyBub3QgYmVlbiBhdHRlbXB0ZWQgKGFuZAorICogaWYgdGhhdCBmYWlscywgdGhlIHN0YXRpb24gaXMgZnJlZWQgYW55d2F5LikKICAqLwotc3RhdGljIHZvaWQgX19zdGFfaW5mb19mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQordm9pZCBzdGFfaW5mb19mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlpZiAoc3RhLT5yYXRlX2N0cmwpIHsKIAkJcmF0ZV9jb250cm9sX2ZyZWVfc3RhKHN0YSk7CkBAIC0yMjcsMTAgKzIyMCwxMSBAQAogCWtmcmVlKHN0YSk7CiB9CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgbG9jYWwtPnN0YV9sb2NrICovCisvKiBDYWxsZXIgbXVzdCBob2xkIGxvY2FsLT5zdGFfbXR4ICovCiBzdGF0aWMgdm9pZCBzdGFfaW5mb19oYXNoX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogeworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5zdGFfbXR4KTsKIAlzdGEtPmhuZXh0ID0gbG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+c3RhLmFkZHIpXTsKIAlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPnN0YS5hZGRyKV0sIHN0YSk7CiB9CkBAIC0yODAsNyArMjc0LDcgQEAKIH0KIAogc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19hbGxvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQl1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQorCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CkBAIC0zMzgsMTAyICszMzIsNiBAQAogCXJldHVybiBzdGE7CiB9CiAKLXN0YXRpYyBpbnQgc3RhX2luZm9fZmluaXNoX2luc2VydChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKLQkJCQlib29sIGFzeW5jLCBib29sIGR1bW15X3JlaW5zZXJ0KQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc3RhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7Ci0Jc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPnN0YV9tdHgpOwotCi0JaWYgKCFzdGEtPmR1bW15IHx8IGR1bW15X3JlaW5zZXJ0KSB7Ci0JCS8qIG5vdGlmeSBkcml2ZXIgKi8KLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQotCQkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKLQkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAotCQkJCQkgICAgIHUuYXApOwotCQllcnIgPSBkcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsICZzdGEtPnN0YSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlmICghYXN5bmMpCi0JCQkJcmV0dXJuIGVycjsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFkZCBJQlNTIFNUQSAlcE0gdG8gIgotCQkJCQkgICJkcml2ZXIgKCVkKSAtIGtlZXBpbmcgaXQgYW55d2F5LlxuIiwKLQkJCSAgICAgICBzZGF0YS0+bmFtZSwgc3RhLT5zdGEuYWRkciwgZXJyKTsKLQkJfSBlbHNlIHsKLQkJCXN0YS0+dXBsb2FkZWQgPSB0cnVlOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0JCQlpZiAoYXN5bmMpCi0JCQkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LAotCQkJCQkgICAgIkZpbmlzaGVkIGFkZGluZyBJQlNTIFNUQSAlcE1cbiIsCi0JCQkJCSAgICBzdGEtPnN0YS5hZGRyKTsKLSNlbmRpZgotCQl9Ci0KLQkJc2RhdGEgPSBzdGEtPnNkYXRhOwotCX0KLQotCWlmICghZHVtbXlfcmVpbnNlcnQpIHsKLQkJaWYgKCFhc3luYykgewotCQkJbG9jYWwtPm51bV9zdGErKzsKLQkJCWxvY2FsLT5zdGFfZ2VuZXJhdGlvbisrOwotCQkJc21wX21iKCk7Ci0KLQkJCS8qIG1ha2UgdGhlIHN0YXRpb24gdmlzaWJsZSAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCQkJc3RhX2luZm9faGFzaF9hZGQobG9jYWwsIHN0YSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWxpc3RfYWRkKCZzdGEtPmxpc3QsICZsb2NhbC0+c3RhX2xpc3QpOwotCX0gZWxzZSB7Ci0JCXN0YS0+ZHVtbXkgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoIXN0YS0+ZHVtbXkpIHsKLQkJaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX2FkZChzdGEpOwotCQlyYXRlX2NvbnRyb2xfYWRkX3N0YV9kZWJ1Z2ZzKHN0YSk7Ci0KLQkJbWVtc2V0KCZzaW5mbywgMCwgc2l6ZW9mKHNpbmZvKSk7Ci0JCXNpbmZvLmZpbGxlZCA9IDA7Ci0JCXNpbmZvLmdlbmVyYXRpb24gPSBsb2NhbC0+c3RhX2dlbmVyYXRpb247Ci0JCWNmZzgwMjExX25ld19zdGEoc2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3RhX2luZm9fZmluaXNoX3BlbmRpbmcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmxvY2FsLT5zdGFfcGVuZGluZ19saXN0KSkgewotCQlzdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZsb2NhbC0+c3RhX3BlbmRpbmdfbGlzdCwKLQkJCQkgICAgICAgc3RydWN0IHN0YV9pbmZvLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnN0YS0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JCXN0YV9pbmZvX2ZpbmlzaF9pbnNlcnQoc3RhLCB0cnVlLCBmYWxzZSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhX2luZm9fZmluaXNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIHN0YV9maW5pc2hfd29yayk7Ci0KLQltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7Ci0Jc3RhX2luZm9fZmluaXNoX3BlbmRpbmcobG9jYWwpOwotCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwotfQotCiBzdGF0aWMgaW50IHN0YV9pbmZvX2luc2VydF9jaGVjayhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CkBAIC00NTMsNTAgKzM1MSwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0YV9pbmZvX2luc2VydF9pYnNzKHN0cnVjdCBzdGFfaW5mbyAqc3RhKSBfX2FjcXVpcmVzKFJDVSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0JLyogY2hlY2sgaWYgU1RBIGV4aXN0cyBhbHJlYWR5ICovCi0JaWYgKHN0YV9pbmZvX2dldF9ic3Nfcngoc2RhdGEsIHN0YS0+c3RhLmFkZHIpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQotCWxvY2FsLT5udW1fc3RhKys7Ci0JbG9jYWwtPnN0YV9nZW5lcmF0aW9uKys7Ci0Jc21wX21iKCk7Ci0Jc3RhX2luZm9faGFzaF9hZGQobG9jYWwsIHN0YSk7Ci0KLQlsaXN0X2FkZF90YWlsKCZzdGEtPmxpc3QsICZsb2NhbC0+c3RhX3BlbmRpbmdfbGlzdCk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwotCXdpcGh5X2RlYnVnKGxvY2FsLT5ody53aXBoeSwgIkFkZGVkIElCU1MgU1RBICVwTVxuIiwKLQkJCXN0YS0+c3RhLmFkZHIpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHICovCi0KLQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmbG9jYWwtPnN0YV9maW5pc2hfd29yayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBzdGFfbXR4IGxvY2tlZAogICogdGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgbXV0ZXggbG9jawogICogd2l0aCBhIFJDVSBsb2NrCiAgKi8KLXN0YXRpYyBpbnQgc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0cnVjdCBzdGFfaW5mbyAqc3RhKSBfX2FjcXVpcmVzKFJDVSkKK3N0YXRpYyBpbnQgc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzdGFfaW5mbyAqZXhpc3Rfc3RhOwogCWJvb2wgZHVtbXlfcmVpbnNlcnQgPSBmYWxzZTsKIAlpbnQgZXJyID0gMDsKQEAgLTUwNCwxOSArMzY3LDggQEAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+c3RhX210eCk7CiAKIAkvKgotCSAqIE9uIGZpcnN0IGdsYW5jZSwgdGhpcyB3aWxsIGxvb2sgcmFjeSwgYmVjYXVzZSB0aGUgY29kZQotCSAqIGluIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGluc2VydHMgYSBzdGF0aW9uIHdpdGggc2xlZXBpbmcsCi0JICogdW5sb2NrcyB0aGUgc3RhX2xvY2sgYmV0d2VlbiBjaGVja2luZyBleGlzdGVuY2UgaW4gdGhlCi0JICogaGFzaCB0YWJsZSBhbmQgaW5zZXJ0aW5nIGludG8gaXQuCi0JICoKLQkgKiBIb3dldmVyLCBpdCBpcyBub3QgcmFjeSBhZ2FpbnN0IGl0c2VsZiBiZWNhdXNlIGl0IGtlZXBzCi0JICogdGhlIG11dGV4IGxvY2tlZC4KLQkgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQkvKgogCSAqIGNoZWNrIGlmIFNUQSBleGlzdHMgYWxyZWFkeS4KLQkgKiBvbmx5IGFjY2VwdCBhIHNjZW5hcmlvIG9mIGEgc2Vjb25kIGNhbGwgdG8gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzCisJICogb25seSBhY2NlcHQgYSBzY2VuYXJpbyBvZiBhIHNlY29uZCBjYWxsIHRvIHN0YV9pbmZvX2luc2VydF9maW5pc2gKIAkgKiB3aXRoIGEgZHVtbXkgc3RhdGlvbiBlbnRyeSB0aGF0IHdhcyBpbnNlcnRlZCBlYXJsaWVyCiAJICogaW4gdGhhdCBjYXNlIC0gYXNzdW1lIHRoYXQgdGhlIGR1bW15IHN0YXRpb24gZmxhZyBzaG91bGQKIAkgKiBiZSByZW1vdmVkLgpAQCAtNTI2LDIwICszNzgsNDcgQEAKIAkJaWYgKGV4aXN0X3N0YSA9PSBzdGEgJiYgc3RhLT5kdW1teSkgewogCQkJZHVtbXlfcmVpbnNlcnQgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXJldHVybiAtRUVYSVNUOworCQkJZXJyID0gLUVFWElTVDsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlmICghc3RhLT5kdW1teSB8fCBkdW1teV9yZWluc2VydCkgeworCQkvKiBub3RpZnkgZHJpdmVyICovCisJCWVyciA9IGRydl9zdGFfYWRkKGxvY2FsLCBzZGF0YSwgJnN0YS0+c3RhKTsKKwkJaWYgKGVycikgeworCQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJCQlnb3RvIG91dF9lcnI7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhZGQgSUJTUyBTVEEgJXBNIHRvICIKKwkJCQkJICAiZHJpdmVyICglZCkgLSBrZWVwaW5nIGl0IGFueXdheS5cbiIsCisJCQkgICAgICAgc2RhdGEtPm5hbWUsIHN0YS0+c3RhLmFkZHIsIGVycik7CisJCX0gZWxzZQorCQkJc3RhLT51cGxvYWRlZCA9IHRydWU7CisJfQogCi0JZXJyID0gc3RhX2luZm9fZmluaXNoX2luc2VydChzdGEsIGZhbHNlLCBkdW1teV9yZWluc2VydCk7Ci0JaWYgKGVycikgewotCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlyZXR1cm4gZXJyOworCWlmICghZHVtbXlfcmVpbnNlcnQpIHsKKwkJbG9jYWwtPm51bV9zdGErKzsKKwkJbG9jYWwtPnN0YV9nZW5lcmF0aW9uKys7CisJCXNtcF9tYigpOworCisJCS8qIG1ha2UgdGhlIHN0YXRpb24gdmlzaWJsZSAqLworCQlzdGFfaW5mb19oYXNoX2FkZChsb2NhbCwgc3RhKTsKKworCQlsaXN0X2FkZCgmc3RhLT5saXN0LCAmbG9jYWwtPnN0YV9saXN0KTsKKwl9IGVsc2UgeworCQlzdGEtPmR1bW15ID0gZmFsc2U7CisJfQorCisJaWYgKCFzdGEtPmR1bW15KSB7CisJCXN0cnVjdCBzdGF0aW9uX2luZm8gc2luZm87CisKKwkJaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX2FkZChzdGEpOworCQlyYXRlX2NvbnRyb2xfYWRkX3N0YV9kZWJ1Z2ZzKHN0YSk7CisKKwkJbWVtc2V0KCZzaW5mbywgMCwgc2l6ZW9mKHNpbmZvKSk7CisJCXNpbmZvLmZpbGxlZCA9IDA7CisJCXNpbmZvLmdlbmVyYXRpb24gPSBsb2NhbC0+c3RhX2dlbmVyYXRpb247CisJCWNmZzgwMjExX25ld19zdGEoc2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKIAl9CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwpAQCAtNTU1LDU0ICs0MzQsMzUgQEAKIAkJbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzZGF0YSk7CiAKIAlyZXR1cm4gMDsKKyBvdXRfZXJyOgorCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgc3RhX2luZm9faW5zZXJ0X3JjdShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKIAlpbnQgZXJyID0gMDsKIAorCW1pZ2h0X3NsZWVwKCk7CisKIAllcnIgPSBzdGFfaW5mb19pbnNlcnRfY2hlY2soc3RhKTsKIAlpZiAoZXJyKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQkvKgotCSAqIEluIGFkLWhvYyBtb2RlLCB3ZSBzb21ldGltZXMgbmVlZCB0byBpbnNlcnQgc3RhdGlvbnMKLQkgKiBmcm9tIHRhc2tsZXQgY29udGV4dCBmcm9tIHRoZSBSWCBwYXRoLiBUbyBhdm9pZCByYWNlcywKLQkgKiBhbHdheXMgZG8gc28gaW4gdGhhdCBjYXNlIC0tIHNlZSB0aGUgY29tbWVudCBiZWxvdy4KLQkgKi8KLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCWVyciA9IHN0YV9pbmZvX2luc2VydF9pYnNzKHN0YSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9mcmVlOwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogSXQgbWlnaHQgc2VlbSB0aGF0IHRoZSBmdW5jdGlvbiBjYWxsZWQgYmVsb3cgaXMgaW4gcmFjZSBhZ2FpbnN0Ci0JICogdGhlIGZ1bmN0aW9uIGNhbGwgYWJvdmUgdGhhdCBhdG9taWNhbGx5IGluc2VydHMgdGhlIHN0YXRpb24uLi4gVGhhdCwKLQkgKiBob3dldmVyLCBpcyBub3QgdHJ1ZSBiZWNhdXNlIHRoZSBhYm92ZSBjb2RlIGNhbiBvbmx5Ci0JICogYmUgaW52b2tlZCBmb3IgSUJTUyBpbnRlcmZhY2VzLCBhbmQgdGhlIGJlbG93IGNvZGUgd2lsbAotCSAqIG5vdCBiZSAtLSBhbmQgdGhlIHR3byBkbyBub3QgcmFjZSBhZ2FpbnN0IGVhY2ggb3RoZXIgYXMKLQkgKiB0aGUgaGFzaCB0YWJsZSBhbHNvIGtleXMgb2ZmIHRoZSBpbnRlcmZhY2UuCi0JICovCi0KLQltaWdodF9zbGVlcCgpOwotCiAJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCi0JZXJyID0gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0YSk7CisJZXJyID0gc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdGEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXR1cm4gMDsKICBvdXRfZnJlZToKIAlCVUdfT04oIWVycik7Ci0JX19zdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOworCXN0YV9pbmZvX2ZyZWUobG9jYWwsIHN0YSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjI5LDcgKzQ4OSw3IEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JZXJyID0gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0YSk7CisJZXJyID0gc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdGEpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBlcnI7CiB9CkBAIC03MTYsNyArNTc2LDcgQEAKIAl9CiAKICBkb25lOgotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnRpbV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoaW5kaWNhdGVfdGltKQogCQlfX2Jzc190aW1fc2V0KGJzcywgc3RhLT5zdGEuYWlkKTsKQEAgLTcyOSw3ICs1ODksNyBAQAogCQlsb2NhbC0+dGltX2luX2xvY2tlZF9zZWN0aW9uID0gZmFsc2U7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnRpbV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBib29sIHN0YV9pbmZvX2J1ZmZlcl9leHBpcmVkKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODUzLDggKzcxMyw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0LCBpLCBhYzsKKwlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHg7CiAKIAltaWdodF9zbGVlcCgpOwogCkBAIC04NzMsMTUgKzczMywxMiBAQAogCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0JMT0NLX0JBKTsKIAlpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdGEsIHRydWUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwogCXJldCA9IHN0YV9pbmZvX2hhc2hfZGVsKGxvY2FsLCBzdGEpOwotCS8qIHRoaXMgbWlnaHQgc3RpbGwgYmUgdGhlIHBlbmRpbmcgbGlzdCAuLi4gd2hpY2ggaXMgZmluZSAqLwotCWlmICghcmV0KQotCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJbGlzdF9kZWwoJnN0YS0+bGlzdCk7CisKIAltdXRleF9sb2NrKCZsb2NhbC0+a2V5X210eCk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9ERUZBVUxUX0tFWVM7IGkrKykKIAkJX19pZWVlODAyMTFfa2V5X2ZyZWUoa2V5X210eF9kZXJlZmVyZW5jZShsb2NhbCwgc3RhLT5ndGtbaV0pKTsKQEAgLTkwOCw2ICs3NjUsOSBAQAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dS52bGFuLnN0YSwgTlVMTCk7CiAKKwl3aGlsZSAoc3RhLT5zdGFfc3RhdGUgPiBJRUVFODAyMTFfU1RBX05PTkUpCisJCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBzdGEtPnN0YV9zdGF0ZSAtIDEpOworCiAJaWYgKHN0YS0+dXBsb2FkZWQpIHsKIAkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQogCQkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKQEAgLTk1Myw3ICs4MTMsMzEgQEAKIAl9CiAjZW5kaWYKIAotCV9fc3RhX2luZm9fZnJlZShsb2NhbCwgc3RhKTsKKwkvKiBUaGVyZSBjb3VsZCBiZSBzb21lIG1lbW9yeSBsZWFrcyBiZWNhdXNlIG9mIGFtcGR1IHR4IHBlbmRpbmcgcXVldWUKKwkgKiBub3QgYmVpbmcgZnJlZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIHN0YXRpb24gaW5mby4KKwkgKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHN1Y2ggcXVldWVzIGFyZSBwdXJnZWQgYmVmb3JlIGZyZWVpbmcgdGhlIHN0YXRpb24KKwkgKiBpbmZvLgorCSAqIFRPRE86IFdlIGhhdmUgdG8gc29tZWhvdyBwb3N0cG9uZSB0aGUgZnVsbCBkZXN0cnVjdGlvbgorCSAqIHVudGlsIHRoZSBhZ2dyZWdhdGlvbiBzdG9wIGNvbXBsZXRlcy4gUmVmZXIKKwkgKiBodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5saW51eC5rZXJuZWwud2lyZWxlc3MuZ2VuZXJhbC84MTkzNgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBTVEFfVElEX05VTTsgaSsrKSB7CisJCWlmICghc3RhLT5hbXBkdV9tbG1lLnRpZF90eFtpXSkKKwkJCWNvbnRpbnVlOworCQl0aWRfdHggPSBzdGEtPmFtcGR1X21sbWUudGlkX3R4W2ldOworCQlpZiAoc2tiX3F1ZXVlX2xlbigmdGlkX3R4LT5wZW5kaW5nKSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LCAiVFggQS1NUERVICBwdXJnaW5nICVkICIKKwkJCQkicGFja2V0cyBmb3IgdGlkPSVkXG4iLAorCQkJCXNrYl9xdWV1ZV9sZW4oJnRpZF90eC0+cGVuZGluZyksIGkpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCQkJX19za2JfcXVldWVfcHVyZ2UoJnRpZF90eC0+cGVuZGluZyk7CisJCX0KKwkJa2ZyZWVfcmN1KHRpZF90eCwgcmN1X2hlYWQpOworCX0KKworCXN0YV9pbmZvX2ZyZWUobG9jYWwsIHN0YSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDksMTEgKzg5Myw5IEBACiAKIHZvaWQgc3RhX2luZm9faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKLQlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9jYWwtPnRpbV9sb2NrKTsKIAltdXRleF9pbml0KCZsb2NhbC0+c3RhX210eCk7CiAJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5zdGFfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5zdGFfcGVuZGluZ19saXN0KTsKLQlJTklUX1dPUksoJmxvY2FsLT5zdGFfZmluaXNoX3dvcmssIHN0YV9pbmZvX2ZpbmlzaF93b3JrKTsKIAogCXNldHVwX3RpbWVyKCZsb2NhbC0+c3RhX2NsZWFudXAsIHN0YV9pbmZvX2NsZWFudXAsCiAJCSAgICAodW5zaWduZWQgbG9uZylsb2NhbCk7CkBAIC0xMDQyLDkgKzkyNCw2IEBACiAJbWlnaHRfc2xlZXAoKTsKIAogCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQotCXN0YV9pbmZvX2ZpbmlzaF9wZW5kaW5nKGxvY2FsKTsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGEsIHRtcCwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewogCQlpZiAoIXNkYXRhIHx8IHNkYXRhID09IHN0YS0+c2RhdGEpCiAJCQlXQVJOX09OKF9fc3RhX2luZm9fZGVzdHJveShzdGEpKTsKQEAgLTE1MTcsMyArMTM5Niw1NiBAQAogCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9zZXRfYnVmZmVyZWQpOworCitpbnQgc3RhX2luZm9fbW92ZV9zdGF0ZV9jaGVja2VkKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCWVudW0gaWVlZTgwMjExX3N0YV9zdGF0ZSBuZXdfc3RhdGUpCit7CisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBuZXdfc3RhdGUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChuZXdfc3RhdGUpIHsKKwljYXNlIElFRUU4MDIxMV9TVEFfTk9ORToKKwkJaWYgKHN0YS0+c3RhX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCkKKwkJCWNsZWFyX2JpdChXTEFOX1NUQV9BVVRILCAmc3RhLT5fZmxhZ3MpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RBX0FVVEg6CisJCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PTkUpCisJCQlzZXRfYml0KFdMQU5fU1RBX0FVVEgsICZzdGEtPl9mbGFncyk7CisJCWVsc2UgaWYgKHN0YS0+c3RhX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MpCisJCQljbGVhcl9iaXQoV0xBTl9TVEFfQVNTT0MsICZzdGEtPl9mbGFncyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVEFfQVNTT0M6CisJCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEgpIHsKKwkJCXNldF9iaXQoV0xBTl9TVEFfQVNTT0MsICZzdGEtPl9mbGFncyk7CisJCX0gZWxzZSBpZiAoc3RhLT5zdGFfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKSB7CisJCQlpZiAoc3RhLT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQkJYXRvbWljX2RlYygmc3RhLT5zZGF0YS0+dS5hcC5udW1fc3RhX2F1dGhvcml6ZWQpOworCQkJY2xlYXJfYml0KFdMQU5fU1RBX0FVVEhPUklaRUQsICZzdGEtPl9mbGFncyk7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEOgorCQlpZiAoc3RhLT5zdGFfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BU1NPQykgeworCQkJaWYgKHN0YS0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCWF0b21pY19pbmMoJnN0YS0+c2RhdGEtPnUuYXAubnVtX3N0YV9hdXRob3JpemVkKTsKKwkJCXNldF9iaXQoV0xBTl9TVEFfQVVUSE9SSVpFRCwgJnN0YS0+X2ZsYWdzKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiaW52YWxpZCBzdGF0ZSAlZCIsIG5ld19zdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogbW92aW5nIFNUQSAlcE0gdG8gc3RhdGUgJWRcbiIsCisJCXN0YS0+c2RhdGEtPm5hbWUsIHN0YS0+c3RhLmFkZHIsIG5ld19zdGF0ZSk7CisJc3RhLT5zdGFfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKaW5kZXggYzU5MjNhYi4uMTViM2JiNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKQEAgLTMwLDcgKzMwLDYgQEAKICAqCXdoZW4gdmlydHVhbCBwb3J0IGNvbnRyb2wgaXMgbm90IGluIHVzZS4KICAqIEBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRTogU3RhdGlvbiBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBzaG9ydC1wcmVhbWJsZQogICoJZnJhbWVzLgotICogQFdMQU5fU1RBX0FTU09DX0FQOiBXZSdyZSBhc3NvY2lhdGVkIHRvIHRoYXQgc3RhdGlvbiwgaXQgaXMgYW4gQVAuCiAgKiBAV0xBTl9TVEFfV01FOiBTdGF0aW9uIGlzIGEgUW9TLVNUQS4KICAqIEBXTEFOX1NUQV9XRFM6IFN0YXRpb24gaXMgb25lIG9mIG91ciBXRFMgcGVlcnMuCiAgKiBAV0xBTl9TVEFfQ0xFQVJfUFNfRklMVDogQ2xlYXIgUFMgZmlsdGVyIGluIGhhcmR3YXJlICh1c2luZyB0aGUKQEAgLTYwLDcgKzU5LDYgQEAKIAlXTEFOX1NUQV9QU19TVEEsCiAJV0xBTl9TVEFfQVVUSE9SSVpFRCwKIAlXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRSwKLQlXTEFOX1NUQV9BU1NPQ19BUCwKIAlXTEFOX1NUQV9XTUUsCiAJV0xBTl9TVEFfV0RTLAogCVdMQU5fU1RBX0NMRUFSX1BTX0ZJTFQsCkBAIC03NSw2ICs3MywxNCBAQAogCVdMQU5fU1RBXzRBRERSX0VWRU5ULAogfTsKIAorZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIHsKKwkvKiBOT1RFOiBUaGVzZSBuZWVkIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5ISAqLworCUlFRUU4MDIxMV9TVEFfTk9ORSwKKwlJRUVFODAyMTFfU1RBX0FVVEgsCisJSUVFRTgwMjExX1NUQV9BU1NPQywKKwlJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQsCit9OworCiAjZGVmaW5lIFNUQV9USURfTlVNIDE2CiAjZGVmaW5lIEFEREJBX1JFU1BfSU5URVJWQUwgSFoKICNkZWZpbmUgSFRfQUdHX01BWF9SRVRSSUVTCQkweDMKQEAgLTkwLDYgKzk2LDcgQEAKICAqIHN0cnVjdCB0aWRfYW1wZHVfdHggLSBUSUQgYWdncmVnYXRpb24gaW5mb3JtYXRpb24gKFR4KS4KICAqCiAgKiBAcmN1X2hlYWQ6IHJjdSBoZWFkIGZvciBmcmVlaW5nIHN0cnVjdHVyZQorICogQHNlc3Npb25fdGltZXI6IGNoZWNrIGlmIHdlIGtlZXAgVHgtaW5nIG9uIHRoZSBUSUQgKGJ5IHRpbWVvdXQgdmFsdWUpCiAgKiBAYWRkYmFfcmVzcF90aW1lcjogdGltZXIgZm9yIHBlZXIncyByZXNwb25zZSB0byBhZGRiYSByZXF1ZXN0CiAgKiBAcGVuZGluZzogcGVuZGluZyBmcmFtZXMgcXVldWUgLS0gdXNlIHN0YSdzIHNwaW5sb2NrIHRvIHByb3RlY3QKICAqIEBkaWFsb2dfdG9rZW46IGRpYWxvZyB0b2tlbiBmb3IgYWdncmVnYXRpb24gc2Vzc2lvbgpAQCAtMTEyLDYgKzExOSw3IEBACiAgKi8KIHN0cnVjdCB0aWRfYW1wZHVfdHggewogCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzZXNzaW9uX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IGFkZGJhX3Jlc3BfdGltZXI7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZW5kaW5nOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CkBAIC0yNjIsNiArMjcwLDcgQEAKICAqIEBkdW1teTogaW5kaWNhdGUgYSBkdW1teSBzdGF0aW9uIGNyZWF0ZWQgZm9yIHJlY2VpdmluZwogICoJRUFQIGZyYW1lcyBiZWZvcmUgYXNzb2NpYXRpb24KICAqIEBzdGE6IHN0YXRpb24gaW5mb3JtYXRpb24gd2Ugc2hhcmUgd2l0aCB0aGUgZHJpdmVyCisgKiBAc3RhX3N0YXRlOiBkdXBsaWNhdGVzIGluZm9ybWF0aW9uIGFib3V0IHN0YXRpb24gc3RhdGUgKGZvciBkZWJ1ZykKICAqLwogc3RydWN0IHN0YV9pbmZvIHsKIAkvKiBHZW5lcmFsIGluZm9ybWF0aW9uLCBtb3N0bHkgc3RhdGljICovCkBAIC0yODMsNiArMjkyLDggQEAKIAogCWJvb2wgdXBsb2FkZWQ7CiAKKwllbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUgc3RhX3N0YXRlOworCiAJLyogdXNlIHRoZSBhY2Nlc3NvcnMgZGVmaW5lZCBiZWxvdyAqLwogCXVuc2lnbmVkIGxvbmcgX2ZsYWdzOwogCkBAIC0zNzEsMTIgKzM4MiwxOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldF9zdGFfZmxhZyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQllbnVtIGllZWU4MDIxMV9zdGFfaW5mb19mbGFncyBmbGFnKQogeworCVdBUk5fT04oZmxhZyA9PSBXTEFOX1NUQV9BVVRIIHx8CisJCWZsYWcgPT0gV0xBTl9TVEFfQVNTT0MgfHwKKwkJZmxhZyA9PSBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKIAlzZXRfYml0KGZsYWcsICZzdGEtPl9mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zdGFfZmxhZyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQkgIGVudW0gaWVlZTgwMjExX3N0YV9pbmZvX2ZsYWdzIGZsYWcpCiB7CisJV0FSTl9PTihmbGFnID09IFdMQU5fU1RBX0FVVEggfHwKKwkJZmxhZyA9PSBXTEFOX1NUQV9BU1NPQyB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FVVEhPUklaRUQpOwogCWNsZWFyX2JpdChmbGFnLCAmc3RhLT5fZmxhZ3MpOwogfQogCkBAIC0zODksMTUgKzQwNiwzMiBAQAogc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJCSAgZW51bSBpZWVlODAyMTFfc3RhX2luZm9fZmxhZ3MgZmxhZykKIHsKKwlXQVJOX09OKGZsYWcgPT0gV0xBTl9TVEFfQVVUSCB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FTU09DIHx8CisJCWZsYWcgPT0gV0xBTl9TVEFfQVVUSE9SSVpFRCk7CiAJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChmbGFnLCAmc3RhLT5fZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJCWVudW0gaWVlZTgwMjExX3N0YV9pbmZvX2ZsYWdzIGZsYWcpCiB7CisJV0FSTl9PTihmbGFnID09IFdMQU5fU1RBX0FVVEggfHwKKwkJZmxhZyA9PSBXTEFOX1NUQV9BU1NPQyB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FVVEhPUklaRUQpOwogCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KGZsYWcsICZzdGEtPl9mbGFncyk7CiB9CiAKK2ludCBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIG5ld19zdGF0ZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFfaW5mb19tb3ZlX3N0YXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUgbmV3X3N0YXRlKQoreworCWludCByZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLCBuZXdfc3RhdGUpOworCVdBUk5fT05fT05DRShyZXQpOworfQorCisKIHZvaWQgaWVlZTgwMjExX2Fzc2lnbl90aWRfdHgoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQsCiAJCQkgICAgIHN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCk7CiAKQEAgLTQ4OCw3ICs1MjIsMTAgQEAKICAqIHVudGlsIHN0YV9pbmZvX2luc2VydCgpLgogICovCiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCXU4ICphZGRyLCBnZnBfdCBnZnApOworCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApOworCit2b2lkIHN0YV9pbmZvX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKKwogLyoKICAqIEluc2VydCBTVEEgaW5mbyBpbnRvIGhhc2ggdGFibGUvbGlzdCwgcmV0dXJucyB6ZXJvIG9yIGEKICAqIC1FRVhJU1QgaWYgKGlmIHRoZSBzYW1lIE1BQyBhZGRyZXNzIGlzIGFscmVhZHkgcHJlc2VudCkuCkBAIC00OTksNyArNTM2LDYgQEAKICAqLwogaW50IHN0YV9pbmZvX2luc2VydChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiBpbnQgc3RhX2luZm9faW5zZXJ0X3JjdShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpOwotaW50IHN0YV9pbmZvX2luc2VydF9hdG9taWMoc3RydWN0IHN0YV9pbmZvICpzdGEpOwogaW50IHN0YV9pbmZvX3JlaW5zZXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIAogaW50IHN0YV9pbmZvX2Rlc3Ryb3lfYWRkcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwppbmRleCA4M2I4MDBkLi4zMGMyNjVjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCkBAIC05LDYgKzksNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCiAjaW5jbHVkZSAicmF0ZS5oIgpAQCAtMjU5LDcgKzI2MCw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKnJ0aGRyOwogCXVuc2lnbmVkIGNoYXIgKnBvczsKLQlfX2xlMTYgdHhmbGFnczsKKwl1MTYgdHhmbGFnczsKIAogCXJ0aGRyID0gKHN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyICopIHNrYl9wdXNoKHNrYiwgcnRhcF9sZW4pOwogCkBAIC0yODksMTMgKzI5MCwxMyBAQAogCXR4ZmxhZ3MgPSAwOwogCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSAmJgogCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCi0JCXR4ZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfRkFJTCk7CisJCXR4ZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfRkFJTDsKIAogCWlmICgoaW5mby0+c3RhdHVzLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB8fAogCSAgICAoaW5mby0+c3RhdHVzLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkpCi0JCXR4ZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfQ1RTKTsKKwkJdHhmbGFncyB8PSBJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9DVFM7CiAJZWxzZSBpZiAoaW5mby0+c3RhdHVzLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKQotCQl0eGZsYWdzIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX1JUUyk7CisJCXR4ZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfUlRTOwogCiAJcHV0X3VuYWxpZ25lZF9sZTE2KHR4ZmxhZ3MsIHBvcyk7CiAJcG9zICs9IDI7CkBAIC0zMzksNyArMzQwLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0JdTE2IGZyYWcsIHR5cGU7CiAJX19sZTE2IGZjOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwpAQCAtNDc1LDEyICs0NzUsOCBAQAogCSAqIEZyYWdtZW50cyBhcmUgcGFzc2VkIHRvIGxvdy1sZXZlbCBkcml2ZXJzIGFzIHNlcGFyYXRlIHNrYnMsIHNvIHRoZXNlCiAJICogYXJlIGFjdHVhbGx5IGZyYWdtZW50cywgbm90IGZyYW1lcy4gVXBkYXRlIGZyYW1lIGNvdW50ZXJzIG9ubHkgZm9yCiAJICogdGhlIGZpcnN0IGZyYWdtZW50IG9mIHRoZSBmcmFtZS4gKi8KLQotCWZyYWcgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUc7Ci0JdHlwZSA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9GVFlQRTsKLQogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSykgewotCQlpZiAoZnJhZyA9PSAwKSB7CisJCWlmIChpZWVlODAyMTFfaXNfZmlyc3RfZnJhZyhoZHItPnNlcV9jdHJsKSkgewogCQkJbG9jYWwtPmRvdDExVHJhbnNtaXR0ZWRGcmFtZUNvdW50Kys7CiAJCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCiAJCQkJbG9jYWwtPmRvdDExTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50Kys7CkBAIC00OTUsMTEgKzQ5MSwxMSBAQAogCQkgKiB3aXRoIGEgbXVsdGljYXN0IGFkZHJlc3MgaW4gdGhlIGFkZHJlc3MgMSBmaWVsZCBvZiB0eXBlIERhdGEKIAkJICogb3IgTWFuYWdlbWVudC4gKi8KIAkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAotCQkgICAgdHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSB8fAotCQkgICAgdHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkKKwkJICAgIGllZWU4MDIxMV9pc19kYXRhKGZjKSB8fAorCQkgICAgaWVlZTgwMjExX2lzX21nbXQoZmMpKQogCQkJbG9jYWwtPmRvdDExVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50Kys7CiAJfSBlbHNlIHsKLQkJaWYgKGZyYWcgPT0gMCkKKwkJaWYgKGllZWU4MDIxMV9pc19maXJzdF9mcmFnKGhkci0+c2VxX2N0cmwpKQogCQkJbG9jYWwtPmRvdDExRmFpbGVkQ291bnQrKzsKIAl9CiAKQEAgLTU3MSw3ICs1NjcsNyBAQAogCiAJLyogTmVlZCB0byBtYWtlIGEgY29weSBiZWZvcmUgc2tiLT5jYiBnZXRzIGNsZWFyZWQgKi8KIAlzZW5kX3RvX2Nvb2tlZCA9ICEhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9JTkpFQ1RFRCkgfHwKLQkJCSh0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9EQVRBKTsKKwkJCSAhKGllZWU4MDIxMV9pc19kYXRhKGZjKSk7CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBiaXQgcmFjeSBidXQgd2UgY2FuIGF2b2lkIGEgbG90IG9mIHdvcmsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90a2lwLmMgYi9uZXQvbWFjODAyMTEvdGtpcC5jCmluZGV4IGY0OWQwMGEuLjUxMDc3YTkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90a2lwLmMKKysrIGIvbmV0L21hYzgwMjExL3RraXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IGFiNmNiNTYuLmVkY2QxYzcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgpAQCAtMzUsNyArMzYsOCBAQAogCiAvKiBtaXNjIHV0aWxzICovCiAKLXN0YXRpYyBfX2xlMTYgaWVlZTgwMjExX2R1cmF0aW9uKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgsIGludCBncm91cF9hZGRyLAorc3RhdGljIF9fbGUxNiBpZWVlODAyMTFfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdyb3VwX2FkZHIsCiAJCQkJIGludCBuZXh0X2ZyYWdfbGVuKQogewogCWludCByYXRlLCBtcmF0ZSwgZXJwLCBkdXIsIGk7CkBAIC00Myw3ICs0NSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB0eC0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCS8qIGFzc3VtZSBIVyBoYW5kbGVzIHRoaXMgKi8KIAlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCkBAIC03NSw3ICs3Nyw3IEBACiAJICogICBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSByYXRlIGJlbG9uZ2luZyB0byB0aGUgUEhZIHJhdGVzIGluIHRoZQogCSAqICAgQlNTQmFzaWNSYXRlU2V0CiAJICovCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHgtPnNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJaWYgKGllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSkgewogCQkvKiBUT0RPOiBUaGVzZSBjb250cm9sIGZyYW1lcyBhcmUgbm90IGN1cnJlbnRseSBzZW50IGJ5CiAJCSAqIG1hYzgwMjExLCBidXQgc2hvdWxkIHRoZXkgYmUgaW1wbGVtZW50ZWQsIHRoaXMgZnVuY3Rpb24KQEAgLTE0OSwxMSArMTUxLDE1IEBACiAJCXJhdGUgPSBtcmF0ZTsKIAl9CiAKLQkvKiBUaW1lIG5lZWRlZCB0byB0cmFuc21pdCBBQ0sKLQkgKiAoMTAgYnl0ZXMgKyA0LWJ5dGUgRkNTID0gMTEyIGJpdHMpIHBsdXMgU0lGUzsgcm91bmRlZCB1cAotCSAqIHRvIGNsb3Nlc3QgaW50ZWdlciAqLwotCi0JZHVyID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwgcmF0ZSwgZXJwLAorCS8qIERvbid0IGNhbGN1bGF0ZSBBQ0tzIGZvciBRb1MgRnJhbWVzIHdpdGggTm9BY2sgUG9saWN5IHNldCAqLworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCSAgICAqKGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpKSB8IElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTk9BQ0spCisJCWR1ciA9IDA7CisJZWxzZQorCQkvKiBUaW1lIG5lZWRlZCB0byB0cmFuc21pdCBBQ0sKKwkJICogKDEwIGJ5dGVzICsgNC1ieXRlIEZDUyA9IDExMiBiaXRzKSBwbHVzIFNJRlM7IHJvdW5kZWQgdXAKKwkJICogdG8gY2xvc2VzdCBpbnRlZ2VyICovCisJCWR1ciA9IGllZWU4MDIxMV9mcmFtZV9kdXJhdGlvbihsb2NhbCwgMTAsIHJhdGUsIGVycCwKIAkJCQl0eC0+c2RhdGEtPnZpZi5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpOwogCiAJaWYgKG5leHRfZnJhZ19sZW4pIHsKQEAgLTI4OSw3ICsyOTUsNiBAQAogCiAJaWYgKGxpa2VseSh0eC0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfVU5JQ0FTVCkpIHsKIAkJaWYgKHVubGlrZWx5KCFhc3NvYyAmJgotCQkJICAgICB0eC0+c2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCiAJCQkgICAgIGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpKSB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX1ZFUkJPU0VfREVCVUcKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZHJvcHBlZCBkYXRhIGZyYW1lIHRvIG5vdCAiCkBAIC0yOTksMTcgKzMwNCwxNCBAQAogCQkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19kcm9wX25vdF9hc3NvYyk7CiAJCQlyZXR1cm4gVFhfRFJPUDsKIAkJfQotCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseShpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JCQkgICAgIHR4LT5sb2NhbC0+bnVtX3N0YSA9PSAwICYmCi0JCQkgICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7Ci0JCQkvKgotCQkJICogTm8gYXNzb2NpYXRlZCBTVEFzIC0gbm8gbmVlZCB0byBzZW5kIG11bHRpY2FzdAotCQkJICogZnJhbWVzLgotCQkJICovCi0JCQlyZXR1cm4gVFhfRFJPUDsKLQkJfQotCQlyZXR1cm4gVFhfQ09OVElOVUU7CisJfSBlbHNlIGlmICh1bmxpa2VseSh0eC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCisJCQkgICAgaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCQkJICAgICFhdG9taWNfcmVhZCgmdHgtPnNkYXRhLT51LmFwLm51bV9zdGFfYXV0aG9yaXplZCkpKSB7CisJCS8qCisJCSAqIE5vIGFzc29jaWF0ZWQgU1RBcyAtIG5vIG5lZWQgdG8gc2VuZCBtdWx0aWNhc3QKKwkJICogZnJhbWVzLgorCQkgKi8KKwkJcmV0dXJuIFRYX0RST1A7CiAJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwpAQCAtNTcxLDggKzU3Myw2IEBACiAJCXN3aXRjaCAodHgtPmtleS0+Y29uZi5jaXBoZXIpIHsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQlpZiAoaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgogCQkJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCQkJdHgtPmtleSA9IE5VTEw7CkBAIC02MzYsNiArNjM2LDcgQEAKIAllbHNlCiAJCXR4cmMubWF4X3JhdGVfaWR4ID0gZmxzKHR4cmMucmF0ZV9pZHhfbWFzaykgLSAxOwogCXR4cmMuYnNzID0gKHR4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCB8fAogCQkgICAgdHgtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyk7CiAKIAkvKiBzZXQgdXAgUlRTIHByb3RlY3Rpb24gaWYgZGVzaXJlZCAqLwpAQCAtODQzLDExICs4NDQsMTMgQEAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX2ZyYWdtZW50KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorc3RhdGljIGludCBpZWVlODAyMTFfZnJhZ21lbnQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwKIAkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJsZW4sCiAJCQkgICAgICBpbnQgZnJhZ190aHJlc2hvbGQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnRhaWwgPSBza2IsICp0bXA7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSB0eC0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBza19idWZmICp0bXA7CiAJaW50IHBlcl9mcmFnbSA9IGZyYWdfdGhyZXNob2xkIC0gaGRybGVuIC0gRkNTX0xFTjsKIAlpbnQgcG9zID0gaGRybGVuICsgcGVyX2ZyYWdtOwogCWludCByZW0gPSBza2ItPmxlbiAtIGhkcmxlbiAtIHBlcl9mcmFnbTsKQEAgLTg1NSw2ICs4NTgsOCBAQAogCWlmIChXQVJOX09OKHJlbSA8IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIGZpcnN0IGZyYWdtZW50IHdhcyBhbHJlYWR5IGFkZGVkIHRvIHF1ZXVlIGJ5IGNhbGxlciAqLworCiAJd2hpbGUgKHJlbSkgewogCQlpbnQgZnJhZ2xlbiA9IHBlcl9mcmFnbTsKIApAQCAtODY3LDEyICs4NzIsMjEgQEAKIAkJCQkgICAgSUVFRTgwMjExX0VOQ1JZUFRfVEFJTFJPT00pOwogCQlpZiAoIXRtcCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl0YWlsLT5uZXh0ID0gdG1wOwotCQl0YWlsID0gdG1wOworCisJCV9fc2tiX3F1ZXVlX3RhaWwoJnR4LT5za2JzLCB0bXApOworCiAJCXNrYl9yZXNlcnZlKHRtcCwgbG9jYWwtPnR4X2hlYWRyb29tICsKIAkJCQkgSUVFRTgwMjExX0VOQ1JZUFRfSEVBRFJPT00pOwogCQkvKiBjb3B5IGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KIAkJbWVtY3B5KHRtcC0+Y2IsIHNrYi0+Y2IsIHNpemVvZih0bXAtPmNiKSk7CisKKwkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodG1wKTsKKwkJaW5mby0+ZmxhZ3MgJj0gfihJRUVFODAyMTFfVFhfQ1RMX0NMRUFSX1BTX0ZJTFQgfAorCQkJCSBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UKTsKKworCQlpZiAocmVtKQorCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9NT1JFX0ZSQU1FUzsKKwogCQlza2JfY29weV9xdWV1ZV9tYXBwaW5nKHRtcCwgc2tiKTsKIAkJdG1wLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7CiAJCXRtcC0+ZGV2ID0gc2tiLT5kZXY7CkBAIC04ODQsNiArODk4LDcgQEAKIAkJcG9zICs9IGZyYWdsZW47CiAJfQogCisJLyogYWRqdXN0IGZpcnN0IGZyYWdtZW50J3MgbGVuZ3RoICovCiAJc2tiLT5sZW4gPSBoZHJsZW4gKyBwZXJfZnJhZ207CiAJcmV0dXJuIDA7CiB9CkBAIC04OTgsNiArOTEzLDEwIEBACiAJaW50IGhkcmxlbjsKIAlpbnQgZnJhZ251bTsKIAorCS8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIHR4LT5za2IgbW92ZXMgdG8gdHgtPnNrYnMgKi8KKwlfX3NrYl9xdWV1ZV90YWlsKCZ0eC0+c2ticywgc2tiKTsKKwl0eC0+c2tiID0gTlVMTDsKKwogCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRE9OVEZSQUcpCiAJCXJldHVybiBUWF9DT05USU5VRTsKIApAQCAtOTI2LDIxICs5NDUsMjEgQEAKIAkgKiBvZiB0aGUgZnJhZ21lbnRzIHRoZW4gd2Ugd2lsbCBzaW1wbHkgcHJldGVuZCB0byBhY2NlcHQgdGhlIHNrYgogCSAqIGJ1dCBzdG9yZSBpdCBhd2F5IGFzIHBlbmRpbmcuCiAJICovCi0JaWYgKGllZWU4MDIxMV9mcmFnbWVudCh0eC0+bG9jYWwsIHNrYiwgaGRybGVuLCBmcmFnX3RocmVzaG9sZCkpCisJaWYgKGllZWU4MDIxMV9mcmFnbWVudCh0eCwgc2tiLCBoZHJsZW4sIGZyYWdfdGhyZXNob2xkKSkKIAkJcmV0dXJuIFRYX0RST1A7CiAKIAkvKiB1cGRhdGUgZHVyYXRpb24vc2VxL2ZsYWdzIG9mIGZyYWdtZW50cyAqLwogCWZyYWdudW0gPSAwOwotCWRvIHsKKworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWludCBuZXh0X2xlbjsKIAkJY29uc3QgX19sZTE2IG1vcmVmcmFncyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CiAKIAkJaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CiAJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKLQkJaWYgKHNrYi0+bmV4dCkgeworCQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KCZ0eC0+c2ticywgc2tiKSkgewogCQkJaGRyLT5mcmFtZV9jb250cm9sIHw9IG1vcmVmcmFnczsKLQkJCW5leHRfbGVuID0gc2tiLT5uZXh0LT5sZW47CiAJCQkvKgogCQkJICogTm8gbXVsdGktcmF0ZSByZXRyaWVzIGZvciBmcmFnbWVudGVkIGZyYW1lcywgdGhhdAogCQkJICogd291bGQgY29tcGxldGVseSB0aHJvdyBvZmYgdGhlIE5BViBhdCBvdGhlciBTVEFzLgpAQCAtOTU1LDEwICs5NzQsOSBAQAogCQkJaGRyLT5mcmFtZV9jb250cm9sICY9IH5tb3JlZnJhZ3M7CiAJCQluZXh0X2xlbiA9IDA7CiAJCX0KLQkJaGRyLT5kdXJhdGlvbl9pZCA9IGllZWU4MDIxMV9kdXJhdGlvbih0eCwgMCwgbmV4dF9sZW4pOwogCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KGZyYWdudW0gJiBJRUVFODAyMTFfU0NUTF9GUkFHKTsKIAkJZnJhZ251bSsrOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC05NjYsMTYgKzk4NCwxNiBAQAogc3RhdGljIGllZWU4MDIxMV90eF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKIGllZWU4MDIxMV90eF9oX3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWlmICghdHgtPnN0YSkKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJdHgtPnN0YS0+dHhfcGFja2V0cysrOwotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQl0eC0+c3RhLT50eF9mcmFnbWVudHMrKzsKIAkJdHgtPnN0YS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOworCX0KIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTEwMTQsMjEgKzEwMzIsMjUgQEAKIHN0YXRpYyBpZWVlODAyMTFfdHhfcmVzdWx0IGRlYnVnX25vaW5saW5lCiBpZWVlODAyMTFfdHhfaF9jYWxjdWxhdGVfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJaW50IG5leHRfbGVuOwogCWJvb2wgZ3JvdXBfYWRkcjsKIAotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQloZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAJCWlmICh1bmxpa2VseShpZWVlODAyMTFfaXNfcHNwb2xsKGhkci0+ZnJhbWVfY29udHJvbCkpKQogCQkJYnJlYWs7IC8qIG11c3Qgbm90IG92ZXJ3cml0ZSBBSUQgKi8KLQkJbmV4dF9sZW4gPSBza2ItPm5leHQgPyBza2ItPm5leHQtPmxlbiA6IDA7CisJCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QoJnR4LT5za2JzLCBza2IpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYl9xdWV1ZV9uZXh0KCZ0eC0+c2ticywgc2tiKTsKKwkJCW5leHRfbGVuID0gbmV4dC0+bGVuOworCQl9IGVsc2UKKwkJCW5leHRfbGVuID0gMDsKIAkJZ3JvdXBfYWRkciA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOwogCiAJCWhkci0+ZHVyYXRpb25faWQgPQotCQkJaWVlZTgwMjExX2R1cmF0aW9uKHR4LCBncm91cF9hZGRyLCBuZXh0X2xlbik7Ci0JfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOworCQkJaWVlZTgwMjExX2R1cmF0aW9uKHR4LCBza2IsIGdyb3VwX2FkZHIsIG5leHRfbGVuKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC0xMDQyLDkgKzEwNjQsMTEgQEAKIAkJCQkgIGludCB0aWQpCiB7CiAJYm9vbCBxdWV1ZWQgPSBmYWxzZTsKKwlib29sIHJlc2V0X2FnZ190aW1lciA9IGZhbHNlOwogCiAJaWYgKHRlc3RfYml0KEhUX0FHR19TVEFURV9PUEVSQVRJT05BTCwgJnRpZF90eC0+c3RhdGUpKSB7CiAJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQU1QRFU7CisJCXJlc2V0X2FnZ190aW1lciA9IHRydWU7CiAJfSBlbHNlIGlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVEFSVCwgJnRpZF90eC0+c3RhdGUpKSB7CiAJCS8qCiAJCSAqIG5vdGhpbmcgLS0gdGhpcyBhZ2dyZWdhdGlvbiBzZXNzaW9uIGlzIGJlaW5nIHN0YXJ0ZWQKQEAgLTEwNzYsNiArMTEwMCw3IEBACiAJCQkvKiBkbyBub3RoaW5nLCBsZXQgcGFja2V0IHBhc3MgdGhyb3VnaCAqLwogCQl9IGVsc2UgaWYgKHRlc3RfYml0KEhUX0FHR19TVEFURV9PUEVSQVRJT05BTCwgJnRpZF90eC0+c3RhdGUpKSB7CiAJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FNUERVOworCQkJcmVzZXRfYWdnX3RpbWVyID0gdHJ1ZTsKIAkJfSBlbHNlIHsKIAkJCXF1ZXVlZCA9IHRydWU7CiAJCQlpbmZvLT5jb250cm9sLnZpZiA9ICZ0eC0+c2RhdGEtPnZpZjsKQEAgLTEwODUsNiArMTExMCwxMSBAQAogCQlzcGluX3VubG9jaygmdHgtPnN0YS0+bG9jayk7CiAJfQogCisJLyogcmVzZXQgc2Vzc2lvbiB0aW1lciAqLworCWlmIChyZXNldF9hZ2dfdGltZXIgJiYgdGlkX3R4LT50aW1lb3V0KQorCQltb2RfdGltZXIoJnRpZF90eC0+c2Vzc2lvbl90aW1lciwKKwkJCSAgVFVfVE9fRVhQX1RJTUUodGlkX3R4LT50aW1lb3V0KSk7CisKIAlyZXR1cm4gcXVldWVkOwogfQogCkBAIC0xMTA3LDYgKzExMzcsNyBAQAogCXR4LT5sb2NhbCA9IGxvY2FsOwogCXR4LT5zZGF0YSA9IHNkYXRhOwogCXR4LT5jaGFubmVsID0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbDsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnR4LT5za2JzKTsKIAogCS8qCiAJICogSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIGFueXdoZXJlLCBhbmQgd2UgZ2V0IGhlcmUsCkBAIC0xMTUxLDE2ICsxMTgyLDggQEAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKIAkJdHgtPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfVU5JQ0FTVDsKIAkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJdHgtPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9VTklDQVNUOwotCQlpZiAodW5saWtlbHkobG9jYWwtPndpZmlfd21lX25vYWNrX3Rlc3QpKQotCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7Ci0JCS8qCi0JCSAqIEZsYWdzIGFyZSBpbml0aWFsaXplZCB0byAwLiBIZW5jZSwgbm8gbmVlZCB0bwotCQkgKiBleHBsaWNpdGx5IHVuc2V0IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLIHNpbmNlCi0JCSAqIGl0IG1pZ2h0IGFscmVhZHkgYmUgc2V0IGZvciBpbmplY3RlZCBmcmFtZXMuCi0JCSAqLwotCX0KIAogCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9ET05URlJBRykpIHsKIAkJaWYgKCEodHgtPmZsYWdzICYgSUVFRTgwMjExX1RYX1VOSUNBU1QpIHx8CkBAIC0xMTc5LDIyICsxMjAyLDE4IEBACiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQogCi0vKgotICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZnJhbWUgY291bGRuJ3QgYmUgdHJhbnNtaXR0ZWQgYnV0IHdhcyBxdWV1ZWQgaW5zdGVhZC4KLSAqLwotc3RhdGljIGJvb2wgX19pZWVlODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHN0cnVjdCBza19idWZmICoqc2ticCwKLQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBib29sIHR4cGVuZGluZykKK3N0YXRpYyBib29sIGllZWU4MDIxMV90eF9mcmFncyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticywKKwkJCSAgICAgICBib29sIHR4cGVuZGluZykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxlbjsKLQlib29sIGZyYWdtID0gZmFsc2U7CiAKLQl3aGlsZSAoc2tiKSB7CisJc2tiX3F1ZXVlX3dhbGtfc2FmZShza2JzLCBza2IsIHRtcCkgewogCQlpbnQgcSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwotCQlfX2xlMTYgZmM7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CiAJCWlmIChsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25zW3FdIHx8CkBAIC0xMjA0LDI0ICsxMjIzLDExIEBACiAJCQkgKiB0cmFuc21pc3Npb24gZnJvbSB0aGUgdHgtcGVuZGluZyB0YXNrbGV0IHdoZW4gdGhlCiAJCQkgKiBxdWV1ZSBpcyB3b2tlbiBhZ2Fpbi4KIAkJCSAqLwotCi0JCQlkbyB7Ci0JCQkJbmV4dCA9IHNrYi0+bmV4dDsKLQkJCQlza2ItPm5leHQgPSBOVUxMOwotCQkJCS8qCi0JCQkJICogTkI6IElmIHR4cGVuZGluZyBpcyB0cnVlLCBuZXh0IG11c3QgYWxyZWFkeQotCQkJCSAqIGJlIE5VTEwgc2luY2Ugd2UgbXVzdCd2ZSBnb25lIHRocm91Z2ggdGhpcwotCQkJCSAqIGxvb3AgYmVmb3JlIGFscmVhZHk7IHRoZXJlZm9yZSB3ZSBjYW4ganVzdAotCQkJCSAqIHF1ZXVlIHRoZSBmcmFtZSB0byB0aGUgaGVhZCB3aXRob3V0IHdvcnJ5aW5nCi0JCQkJICogYWJvdXQgcmVvcmRlcmluZyBvZiBmcmFnbWVudHMuCi0JCQkJICovCi0JCQkJaWYgKHVubGlrZWx5KHR4cGVuZGluZykpCi0JCQkJCV9fc2tiX3F1ZXVlX2hlYWQoJmxvY2FsLT5wZW5kaW5nW3FdLAotCQkJCQkJCSBza2IpOwotCQkJCWVsc2UKLQkJCQkJX19za2JfcXVldWVfdGFpbCgmbG9jYWwtPnBlbmRpbmdbcV0sCi0JCQkJCQkJIHNrYik7Ci0JCQl9IHdoaWxlICgoc2tiID0gbmV4dCkpOworCQkJaWYgKHR4cGVuZGluZykKKwkJCQlza2JfcXVldWVfc3BsaWNlX2luaXQoc2ticywgJmxvY2FsLT5wZW5kaW5nW3FdKTsKKwkJCWVsc2UKKwkJCQlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdChza2JzLAorCQkJCQkJCSAgICZsb2NhbC0+cGVuZGluZ1txXSk7CiAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLAogCQkJCQkgICAgICAgZmxhZ3MpOwpAQCAtMTIzMCw1NyArMTIzNiw4MSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwogCiAJCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJCWluZm8tPmNvbnRyb2wudmlmID0gdmlmOworCQlpbmZvLT5jb250cm9sLnN0YSA9IHN0YTsKIAotCQlpZiAoZnJhZ20pCi0JCQlpbmZvLT5mbGFncyAmPSB+KElFRUU4MDIxMV9UWF9DVExfQ0xFQVJfUFNfRklMVCB8Ci0JCQkJCSBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UKTsKLQotCQluZXh0ID0gc2tiLT5uZXh0OwotCQlsZW4gPSBza2ItPmxlbjsKLQotCQlpZiAobmV4dCkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTU9SRV9GUkFNRVM7Ci0KLQkJc2RhdGEgPSB2aWZfdG9fc2RhdGEoaW5mby0+Y29udHJvbC52aWYpOwotCi0JCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJCWluZm8tPmNvbnRyb2wudmlmID0gTlVMTDsKLQkJCWJyZWFrOwotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46Ci0JCQlpbmZvLT5jb250cm9sLnZpZiA9ICZjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1LmFwKS0+dmlmOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBrZWVwICovCi0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzdGEgJiYgc3RhLT51cGxvYWRlZCkKLQkJCWluZm8tPmNvbnRyb2wuc3RhID0gJnN0YS0+c3RhOwotCQllbHNlCi0JCQlpbmZvLT5jb250cm9sLnN0YSA9IE5VTEw7Ci0KLQkJZmMgPSAoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhKS0+ZnJhbWVfY29udHJvbDsKKwkJX19za2JfdW5saW5rKHNrYiwgc2ticyk7CiAJCWRydl90eChsb2NhbCwgc2tiKTsKLQotCQlpZWVlODAyMTFfdHB0X2xlZF90cmlnX3R4KGxvY2FsLCBmYywgbGVuKTsKLQkJKnNrYnAgPSBza2IgPSBuZXh0OwotCQlpZWVlODAyMTFfbGVkX3R4KGxvY2FsLCAxKTsKLQkJZnJhZ20gPSB0cnVlOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCiAvKgorICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZnJhbWUgY291bGRuJ3QgYmUgdHJhbnNtaXR0ZWQgYnV0IHdhcyBxdWV1ZWQgaW5zdGVhZC4KKyAqLworc3RhdGljIGJvb2wgX19pZWVlODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JzLCBpbnQgbGVkX2xlbiwKKwkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBib29sIHR4cGVuZGluZykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhOworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCByZXN1bHQgPSB0cnVlOworCV9fbGUxNiBmYzsKKworCWlmIChXQVJOX09OKHNrYl9xdWV1ZV9lbXB0eShza2JzKSkpCisJCXJldHVybiB0cnVlOworCisJc2tiID0gc2tiX3BlZWsoc2ticyk7CisJZmMgPSAoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhKS0+ZnJhbWVfY29udHJvbDsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXNkYXRhID0gdmlmX3RvX3NkYXRhKGluZm8tPmNvbnRyb2wudmlmKTsKKwlpZiAoc3RhICYmICFzdGEtPnVwbG9hZGVkKQorCQlzdGEgPSBOVUxMOworCisJaWYgKHN0YSkKKwkJcHVic3RhID0gJnN0YS0+c3RhOworCWVsc2UKKwkJcHVic3RhID0gTlVMTDsKKworCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCQlzZGF0YSA9IE5VTEw7CisJCXZpZiA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuYXApOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQl2aWYgPSAmc2RhdGEtPnZpZjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGxvY2FsLT5vcHMtPnR4X2ZyYWdzKQorCQlkcnZfdHhfZnJhZ3MobG9jYWwsIHZpZiwgcHVic3RhLCBza2JzKTsKKwllbHNlCisJCXJlc3VsdCA9IGllZWU4MDIxMV90eF9mcmFncyhsb2NhbCwgdmlmLCBwdWJzdGEsIHNrYnMsCisJCQkJCSAgICB0eHBlbmRpbmcpOworCisJaWVlZTgwMjExX3RwdF9sZWRfdHJpZ190eChsb2NhbCwgZmMsIGxlZF9sZW4pOworCWllZWU4MDIxMV9sZWRfdHgobG9jYWwsIDEpOworCisJV0FSTl9PTl9PTkNFKCFza2JfcXVldWVfZW1wdHkoc2ticykpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKICAqIEludm9rZSBUWCBoYW5kbGVycywgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gaWYgdGhlCiAgKiBmcmFtZSB3YXMgZHJvcHBlZCBvciBxdWV1ZWQuCiAgKi8KIHN0YXRpYyBpbnQgaW52b2tlX3R4X2hhbmRsZXJzKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHgtPnNrYik7CiAJaWVlZTgwMjExX3R4X3Jlc3VsdCByZXMgPSBUWF9EUk9QOwogCiAjZGVmaW5lIENBTExfVFhIKHR4aCkgXApAQCAtMTI5OCw4ICsxMzI4LDExIEBACiAJaWYgKCEodHgtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19IQVNfUkFURV9DT05UUk9MKSkKIAkJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKTsKIAotCWlmICh1bmxpa2VseShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9JTlRGTF9SRVRSQU5TTUlTU0lPTikpCisJaWYgKHVubGlrZWx5KGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0lOVEZMX1JFVFJBTlNNSVNTSU9OKSkgeworCQlfX3NrYl9xdWV1ZV90YWlsKCZ0eC0+c2ticywgdHgtPnNrYik7CisJCXR4LT5za2IgPSBOVUxMOwogCQlnb3RvIHR4aF9kb25lOworCX0KIAogCUNBTExfVFhIKGllZWU4MDIxMV90eF9oX21pY2hhZWxfbWljX2FkZCk7CiAJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfc2VxdWVuY2UpOwpAQCAtMTMxNCwxMyArMTM0NywxMCBAQAogIHR4aF9kb25lOgogCWlmICh1bmxpa2VseShyZXMgPT0gVFhfRFJPUCkpIHsKIAkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19kcm9wKTsKLQkJd2hpbGUgKHNrYikgewotCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQ7Ci0KLQkJCW5leHQgPSBza2ItPm5leHQ7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQlza2IgPSBuZXh0OwotCQl9CisJCWlmICh0eC0+c2tiKQorCQkJZGV2X2tmcmVlX3NrYih0eC0+c2tiKTsKKwkJZWxzZQorCQkJX19za2JfcXVldWVfcHVyZ2UoJnR4LT5za2JzKTsKIAkJcmV0dXJuIC0xOwogCX0gZWxzZSBpZiAodW5saWtlbHkocmVzID09IFRYX1FVRVVFRCkpIHsKIAkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19xdWV1ZWQpOwpAQCAtMTM0MSw2ICsxMzcxLDcgQEAKIAlpZWVlODAyMTFfdHhfcmVzdWx0IHJlc19wcmVwYXJlOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlib29sIHJlc3VsdCA9IHRydWU7CisJaW50IGxlZF9sZW47CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCAxMCkpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMTM1MCw2ICsxMzgxLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAkvKiBpbml0aWFsaXNlcyB0eCAqLworCWxlZF9sZW4gPSBza2ItPmxlbjsKIAlyZXNfcHJlcGFyZSA9IGllZWU4MDIxMV90eF9wcmVwYXJlKHNkYXRhLCAmdHgsIHNrYik7CiAKIAlpZiAodW5saWtlbHkocmVzX3ByZXBhcmUgPT0gVFhfRFJPUCkpIHsKQEAgLTEzNjMsNyArMTM5NSw4IEBACiAJaW5mby0+YmFuZCA9IHR4LmNoYW5uZWwtPmJhbmQ7CiAKIAlpZiAoIWludm9rZV90eF9oYW5kbGVycygmdHgpKQotCQlyZXN1bHQgPSBfX2llZWU4MDIxMV90eChsb2NhbCwgJnR4LnNrYiwgdHguc3RhLCB0eHBlbmRpbmcpOworCQlyZXN1bHQgPSBfX2llZWU4MDIxMV90eChsb2NhbCwgJnR4LnNrYnMsIGxlZF9sZW4sCisJCQkJCXR4LnN0YSwgdHhwZW5kaW5nKTsKICBvdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE0MzAsNyArMTQ2Myw3IEBACiAJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikgJiYKIAkgICAgaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCQkhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCi0JCQlpZiAobWVzaF9uZXh0aG9wX2xvb2t1cChza2IsIHNkYXRhKSkgeworCQkJaWYgKG1lc2hfbmV4dGhvcF9yZXNvbHZlKHNrYiwgc2RhdGEpKSB7CiAJCQkJLyogc2tiIHF1ZXVlZDogZG9uJ3QgZnJlZSAqLwogCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCXJldHVybjsKQEAgLTIxMTEsMTAgKzIxNDQsMTUgQEAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxfTkVFRF9UWFBST0NFU1NJTkcpIHsKIAkJcmVzdWx0ID0gaWVlZTgwMjExX3R4KHNkYXRhLCBza2IsIHRydWUpOwogCX0gZWxzZSB7CisJCXN0cnVjdCBza19idWZmX2hlYWQgc2ticzsKKworCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYnMpOworCQlfX3NrYl9xdWV1ZV90YWlsKCZza2JzLCBza2IpOworCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBoZHItPmFkZHIxKTsKIAotCQlyZXN1bHQgPSBfX2llZWU4MDIxMV90eChsb2NhbCwgJnNrYiwgc3RhLCB0cnVlKTsKKwkJcmVzdWx0ID0gX19pZWVlODAyMTFfdHgobG9jYWwsICZza2JzLCBza2ItPmxlbiwgc3RhLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjIyNywxMCArMjI2NSwxMCBAQAogCQkvKiBCaXRtYXAgY29udHJvbCAqLwogCQkqcG9zKysgPSBuMSB8IGFpZDA7CiAJCS8qIFBhcnQgVmlydCBCaXRtYXAgKi8KKwkJc2tiX3B1dChza2IsIG4yIC0gbjEpOwogCQltZW1jcHkocG9zLCBic3MtPnRpbSArIG4xLCBuMiAtIG4xICsgMSk7CiAKIAkJdGltWzFdID0gbjIgLSBuMSArIDQ7Ci0JCXNrYl9wdXQoc2tiLCBuMiAtIG4xKTsKIAl9IGVsc2UgewogCQkqcG9zKysgPSBhaWQwOyAvKiBCaXRtYXAgY29udHJvbCAqLwogCQkqcG9zKysgPSAwOyAvKiBQYXJ0IFZpcnQgQml0bWFwICovCkBAIC0yMjk1LDkgKzIzMzMsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+dGltX2xvY2ssIGZsYWdzKTsKIAkJCQlpZWVlODAyMTFfYmVhY29uX2FkZF90aW0oYXAsIHNrYiwgYmVhY29uKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+dGltX2xvY2ssIGZsYWdzKTsKIAkJCX0KIAogCQkJaWYgKHRpbV9vZmZzZXQpCkBAIC0yNDE1LDYgKzI0NTMsMzcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2JlYWNvbl9nZXRfdGltKTsKIAorc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfaWZfYXAgKmFwID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcHJlc3AgPSBOVUxMLCAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQorCQlyZXR1cm4gTlVMTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWFwID0gJnNkYXRhLT51LmFwOworCXByZXNwID0gcmN1X2RlcmVmZXJlbmNlKGFwLT5wcm9iZV9yZXNwKTsKKwlpZiAoIXByZXNwKQorCQlnb3RvIG91dDsKKworCXNrYiA9IHNrYl9jb3B5KHByZXNwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCW1lbXNldChoZHItPmFkZHIxLCAwLCBzaXplb2YoaGRyLT5hZGRyMSkpOworCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHNrYjsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3Byb2JlcmVzcF9nZXQpOworCiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3BzcG9sbF9nZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtMjYyNywxNSArMjY5NiwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2J1ZmZlcmVkX2JjKTsKIAotdm9pZCBpZWVlODAyMTFfdHhfc2tiKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCBpZWVlODAyMTFfdHhfc2tiX3RpZChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRpZCkKIHsKIAlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAwKTsKIAlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgMCk7CiAJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgMCk7CiAKLQkvKiBTZW5kIGFsbCBpbnRlcm5hbCBtZ210IGZyYW1lcyBvbiBWTy4gQWNjb3JkaW5nbHkgc2V0IFRJRCB0byA3LiAqLwotCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIElFRUU4MDIxMV9BQ19WTyk7Ci0Jc2tiLT5wcmlvcml0eSA9IDc7CisJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgaWVlZTgwMl8xZF90b19hY1t0aWRdKTsKKwlza2ItPnByaW9yaXR5ID0gdGlkOwogCiAJLyoKIAkgKiBUaGUgb3RoZXIgcGF0aCBjYWxsaW5nIGllZWU4MDIxMV94bWl0IGlzIGZyb20gdGhlIHRhc2tsZXQsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdXRpbC5jIGIvbmV0L21hYzgwMjExL3V0aWwuYwppbmRleCA5OGNhNTQ3Li5lYjFhNWY3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdXRpbC5jCisrKyBiL25ldC9tYWM4MDIxMS91dGlsLmMKQEAgLTEzLDEyICsxMywxNCBAQAogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgpAQCAtOTUsMTMgKzk3LDEzIEBACiAKIHZvaWQgaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAKLQlkbyB7CisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0JfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOworCX0KIH0KIAogaW50IGllZWU4MDIxMV9mcmFtZV9kdXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc2l6ZV90IGxlbiwKQEAgLTU2Myw2ICs1NjUsMTcyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmspOwogCit1MzIgaWVlZTgwMl8xMV9wYXJzZV9lbGVtc19jcmModTggKnN0YXJ0LCBzaXplX3QgbGVuLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKKwkJCSAgICAgICB1NjQgZmlsdGVyLCB1MzIgY3JjKQoreworCXNpemVfdCBsZWZ0ID0gbGVuOworCXU4ICpwb3MgPSBzdGFydDsKKwlib29sIGNhbGNfY3JjID0gZmlsdGVyICE9IDA7CisKKwltZW1zZXQoZWxlbXMsIDAsIHNpemVvZigqZWxlbXMpKTsKKwllbGVtcy0+aWVfc3RhcnQgPSBzdGFydDsKKwllbGVtcy0+dG90YWxfbGVuID0gbGVuOworCisJd2hpbGUgKGxlZnQgPj0gMikgeworCQl1OCBpZCwgZWxlbjsKKworCQlpZCA9ICpwb3MrKzsKKwkJZWxlbiA9ICpwb3MrKzsKKwkJbGVmdCAtPSAyOworCisJCWlmIChlbGVuID4gbGVmdCkKKwkJCWJyZWFrOworCisJCWlmIChjYWxjX2NyYyAmJiBpZCA8IDY0ICYmIChmaWx0ZXIgJiAoMVVMTCA8PCBpZCkpKQorCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7CisKKwkJc3dpdGNoIChpZCkgeworCQljYXNlIFdMQU5fRUlEX1NTSUQ6CisJCQllbGVtcy0+c3NpZCA9IHBvczsKKwkJCWVsZW1zLT5zc2lkX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgorCQkJZWxlbXMtPnN1cHBfcmF0ZXMgPSBwb3M7CisJCQllbGVtcy0+c3VwcF9yYXRlc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgorCQkJZWxlbXMtPmZoX3BhcmFtcyA9IHBvczsKKwkJCWVsZW1zLT5maF9wYXJhbXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKKwkJCWVsZW1zLT5kc19wYXJhbXMgPSBwb3M7CisJCQllbGVtcy0+ZHNfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6CisJCQllbGVtcy0+Y2ZfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmNmX3BhcmFtc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfVElNOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX2llKSkgeworCQkJCWVsZW1zLT50aW0gPSAodm9pZCAqKXBvczsKKwkJCQllbGVtcy0+dGltX2xlbiA9IGVsZW47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9JQlNTX1BBUkFNUzoKKwkJCWVsZW1zLT5pYnNzX3BhcmFtcyA9IHBvczsKKwkJCWVsZW1zLT5pYnNzX3BhcmFtc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgorCQkJZWxlbXMtPmNoYWxsZW5nZSA9IHBvczsKKwkJCWVsZW1zLT5jaGFsbGVuZ2VfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKKwkJCWlmIChlbGVuID49IDQgJiYgcG9zWzBdID09IDB4MDAgJiYgcG9zWzFdID09IDB4NTAgJiYKKwkJCSAgICBwb3NbMl0gPT0gMHhmMikgeworCQkJCS8qIE1pY3Jvc29mdCBPVUkgKDAwOjUwOkYyKSAqLworCisJCQkJaWYgKGNhbGNfY3JjKQorCQkJCQljcmMgPSBjcmMzMl9iZShjcmMsIHBvcyAtIDIsIGVsZW4gKyAyKTsKKworCQkJCWlmIChwb3NbM10gPT0gMSkgeworCQkJCQkvKiBPVUkgVHlwZSAxIC0gV1BBIElFICovCisJCQkJCWVsZW1zLT53cGEgPSBwb3M7CisJCQkJCWVsZW1zLT53cGFfbGVuID0gZWxlbjsKKwkJCQl9IGVsc2UgaWYgKGVsZW4gPj0gNSAmJiBwb3NbM10gPT0gMikgeworCQkJCQkvKiBPVUkgVHlwZSAyIC0gV01NIElFICovCisJCQkJCWlmIChwb3NbNF0gPT0gMCkgeworCQkJCQkJZWxlbXMtPndtbV9pbmZvID0gcG9zOworCQkJCQkJZWxlbXMtPndtbV9pbmZvX2xlbiA9IGVsZW47CisJCQkJCX0gZWxzZSBpZiAocG9zWzRdID09IDEpIHsKKwkJCQkJCWVsZW1zLT53bW1fcGFyYW0gPSBwb3M7CisJCQkJCQllbGVtcy0+d21tX3BhcmFtX2xlbiA9IGVsZW47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9SU046CisJCQllbGVtcy0+cnNuID0gcG9zOworCQkJZWxlbXMtPnJzbl9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfRVJQX0lORk86CisJCQllbGVtcy0+ZXJwX2luZm8gPSBwb3M7CisJCQllbGVtcy0+ZXJwX2luZm9fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgorCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzID0gcG9zOworCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkKKwkJCQllbGVtcy0+aHRfY2FwX2VsZW0gPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0hUX0lORk9STUFUSU9OOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCisJCQkJZWxlbXMtPmh0X2luZm9fZWxlbSA9ICh2b2lkICopcG9zOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoKKwkJCWVsZW1zLT5tZXNoX2lkID0gcG9zOworCQkJZWxlbXMtPm1lc2hfaWRfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOgorCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKQorCQkJCWVsZW1zLT5tZXNoX2NvbmZpZyA9ICh2b2lkICopcG9zOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUEVFUl9NR01UOgorCQkJZWxlbXMtPnBlZXJpbmcgPSBwb3M7CisJCQllbGVtcy0+cGVlcmluZ19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUFJFUToKKwkJCWVsZW1zLT5wcmVxID0gcG9zOworCQkJZWxlbXMtPnByZXFfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BSRVA6CisJCQllbGVtcy0+cHJlcCA9IHBvczsKKwkJCWVsZW1zLT5wcmVwX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QRVJSOgorCQkJZWxlbXMtPnBlcnIgPSBwb3M7CisJCQllbGVtcy0+cGVycl9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUkFOTjoKKwkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUpKQorCQkJCWVsZW1zLT5yYW5uID0gKHZvaWQgKilwb3M7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSDoKKwkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbSA9IHBvczsKKwkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUVVJRVQ6CisJCQlpZiAoIWVsZW1zLT5xdWlldF9lbGVtKSB7CisJCQkJZWxlbXMtPnF1aWV0X2VsZW0gPSBwb3M7CisJCQkJZWxlbXMtPnF1aWV0X2VsZW1fbGVuID0gZWxlbjsKKwkJCX0KKwkJCWVsZW1zLT5udW1fb2ZfcXVpZXRfZWxlbSsrOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfQ09VTlRSWToKKwkJCWVsZW1zLT5jb3VudHJ5X2VsZW0gPSBwb3M7CisJCQllbGVtcy0+Y291bnRyeV9lbGVtX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDoKKwkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW0gPSBwb3M7CisJCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgorCQkJZWxlbXMtPnRpbWVvdXRfaW50ID0gcG9zOworCQkJZWxlbXMtPnRpbWVvdXRfaW50X2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJbGVmdCAtPSBlbGVuOworCQlwb3MgKz0gZWxlbjsKKwl9CisKKwlyZXR1cm4gY3JjOworfQorCiB2b2lkIGllZWU4MDJfMTFfcGFyc2VfZWxlbXModTggKnN0YXJ0LCBzaXplX3QgbGVuLAogCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcykKIHsKQEAgLTgxMiw3ICs5ODAsOCBAQAogCX0KIAogCWlmIChzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKLQkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsIHNiYW5kLCBzYmFuZC0+aHRfY2FwLmNhcCk7CisJCXBvcyA9IGllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAocG9zLCAmc2JhbmQtPmh0X2NhcCwKKwkJCQkJCXNiYW5kLT5odF9jYXAuY2FwKTsKIAogCS8qCiAJICogSWYgYWRkaW5nIG1vcmUgaGVyZSwgYWRqdXN0IGNvZGUgaW4gbWFpbi5jCkBAIC04NjUsNiArMTAzNCw4IEBACiAJc2tiID0gaWVlZTgwMjExX3Byb2JlcmVxX2dldCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwKIAkJCQkgICAgIHNzaWQsIHNzaWRfbGVuLAogCQkJCSAgICAgYnVmLCBidWZfbGVuKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CiAKIAlpZiAoZHN0KSB7CiAJCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKQEAgLTg3Myw2ICsxMDQ0LDggQEAKIAl9CiAKIAlJRUVFODAyMTFfU0tCX0NCKHNrYiktPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ET05UX0VOQ1JZUFQ7CisKKyBvdXQ6CiAJa2ZyZWUoYnVmKTsKIAogCXJldHVybiBza2I7CkBAIC0xMDE5LDcgKzExOTIsNiBAQAogCQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsCiAJCQkJCSAgICAgdS5hcCk7CiAKLQkJCW1lbXNldCgmc3RhLT5zdGEuZHJ2X3ByaXYsIDAsIGh3LT5zdGFfZGF0YV9zaXplKTsKIAkJCVdBUk5fT04oZHJ2X3N0YV9hZGQobG9jYWwsIHNkYXRhLCAmc3RhLT5zdGEpKTsKIAkJfQogCX0KQEAgLTEwNjIsNyArMTIzNCw4IEBACiAKIAkJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BU1NPQzsKKwkJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQVNTT0MgfAorCQkJCSAgIEJTU19DSEFOR0VEX0FSUF9GSUxURVI7CiAJCQltdXRleF9sb2NrKCZzZGF0YS0+dS5tZ2QubXR4KTsKIAkJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIAkJCW11dGV4X3VubG9jaygmc2RhdGEtPnUubWdkLm10eCk7CkBAIC0xMDcyLDYgKzEyNDUsMTAgQEAKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9TU0lEOworCisJCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQVBfUFJPQkVfUkVTUDsKKwogCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJCWNoYW5nZWQgfD0gQlNTX0NIQU5HRURfQkVBQ09OIHwKQEAgLTEwOTMsNiArMTI3MCw4IEBACiAJCX0KIAl9CiAKKwlpZWVlODAyMTFfcmVjYWxjX3BzKGxvY2FsLCAtMSk7CisKIAkvKgogCSAqIENsZWFyIHRoZSBXTEFOX1NUQV9CTE9DS19CQSBmbGFnIHNvIG5ldyBhZ2dyZWdhdGlvbgogCSAqIHNlc3Npb25zIGNhbiBiZSBlc3RhYmxpc2hlZCBhZnRlciBhIHJlc3VtZS4KQEAgLTEzNDgsNyArMTUyNyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9kaXNhYmxlX3Jzc2lfcmVwb3J0cyk7CiAKLXU4ICppZWVlODAyMTFfaWVfYnVpbGRfaHRfY2FwKHU4ICpwb3MsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAordTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCiAJCQkgICAgICB1MTYgY2FwKQogewogCV9fbGUxNiB0bXA7CkBAIC0xMzYzLDEzICsxNTQyLDEzIEBACiAJcG9zICs9IHNpemVvZih1MTYpOwogCiAJLyogQU1QRFUgcGFyYW1ldGVycyAqLwotCSpwb3MrKyA9IHNiYW5kLT5odF9jYXAuYW1wZHVfZmFjdG9yIHwKLQkJIChzYmFuZC0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPDwKKwkqcG9zKysgPSBodF9jYXAtPmFtcGR1X2ZhY3RvciB8CisJCSAoaHRfY2FwLT5hbXBkdV9kZW5zaXR5IDw8CiAJCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZX1NISUZUKTsKIAogCS8qIE1DUyBzZXQgKi8KLQltZW1jcHkocG9zLCAmc2JhbmQtPmh0X2NhcC5tY3MsIHNpemVvZihzYmFuZC0+aHRfY2FwLm1jcykpOwotCXBvcyArPSBzaXplb2Yoc2JhbmQtPmh0X2NhcC5tY3MpOworCW1lbWNweShwb3MsICZodF9jYXAtPm1jcywgc2l6ZW9mKGh0X2NhcC0+bWNzKSk7CisJcG9zICs9IHNpemVvZihodF9jYXAtPm1jcyk7CiAKIAkvKiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KIAlwb3MgKz0gc2l6ZW9mKF9fbGUxNik7CkBAIC0xNDA5LDYgKzE1ODgsMTEgQEAKIAl9CiAJaWYgKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApCiAJCWh0X2luZm8tPmh0X3BhcmFtIHw9IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWTsKKworCS8qCisJICogTm90ZTogQWNjb3JkaW5nIHRvIDgwMi4xMW4tMjAwOSA5LjEzLjMuMSwgSFQgUHJvdGVjdGlvbiBmaWVsZCBhbmQKKwkgKiBSSUZTIE1vZGUgYXJlIHJlc2VydmVkIGluIElCU1MgbW9kZSwgdGhlcmVmb3JlIGtlZXAgdGhlbSBhdCAwCisJICovCiAJaHRfaW5mby0+b3BlcmF0aW9uX21vZGUgPSAweDAwMDA7CiAJaHRfaW5mby0+c3RiY19wYXJhbSA9IDB4MDAwMDsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dlcC5jIGIvbmV0L21hYzgwMjExL3dlcC5jCmluZGV4IGExYzZiZmQuLjY4YWQzNTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93ZXAuYworKysgYi9uZXQvbWFjODAyMTEvd2VwLmMKQEAgLTMzMCwxMyArMzMwLDEyIEBACiAKIAlpZWVlODAyMTFfdHhfc2V0X3Byb3RlY3RlZCh0eCk7CiAKLQlza2IgPSB0eC0+c2tiOwotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQlpZiAod2VwX2VuY3J5cHRfc2tiKHR4LCBza2IpIDwgMCkgewogCQkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19kcm9wX3dlcCk7CiAJCQlyZXR1cm4gVFhfRFJPUDsKIAkJfQotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd21lLmMgYi9uZXQvbWFjODAyMTEvd21lLmMKaW5kZXggNDMzMjcxMS4uODk1MTFiZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dtZS5jCisrKyBiL25ldC9tYWM4MDIxMS93bWUuYwpAQCAtNTIsNiArNTIsMzAgQEAKIAl9CiB9CiAKKy8qIEluZGljYXRlIHdoaWNoIHF1ZXVlIHRvIHVzZSBmb3IgdGhpcyBmdWxseSBmb3JtZWQgODAyLjExIGZyYW1lICovCit1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZV84MDIxMShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwl1OCAqcDsKKworCWlmIChsb2NhbC0+aHcucXVldWVzIDwgNCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJc2tiLT5wcmlvcml0eSA9IDc7CisJCXJldHVybiBpZWVlODAyXzFkX3RvX2FjW3NrYi0+cHJpb3JpdHldOworCX0KKwlpZiAoIWllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXNrYi0+cHJpb3JpdHkgPSAwOworCQlyZXR1cm4gaWVlZTgwMl8xZF90b19hY1tza2ItPnByaW9yaXR5XTsKKwl9CisKKwlwID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJc2tiLT5wcmlvcml0eSA9ICpwICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKKworCXJldHVybiBpZWVlODAyMTFfZG93bmdyYWRlX3F1ZXVlKGxvY2FsLCBza2IpOworfQogCiAvKiBJbmRpY2F0ZSB3aGljaCBxdWV1ZSB0byB1c2UuICovCiB1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTEzOSw2ICsxNjMsNyBAQAogCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCiAJLyogRmlsbCBpbiB0aGUgUW9TIGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICovCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CkBAIC0xNTAsOSArMTc1LDEyIEBACiAJCS8qIHByZXNlcnZlIEVPU1AgYml0ICovCiAJCWFja19wb2xpY3kgPSAqcCAmIElFRUU4MDIxMV9RT1NfQ1RMX0VPU1A7CiAKLQkJaWYgKHVubGlrZWx5KHNkYXRhLT5sb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCkgfHwKLQkJICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQorCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwKKwkJICAgIHNkYXRhLT5ub2Fja19tYXAgJiBCSVQodGlkKSkgewogCQkJYWNrX3BvbGljeSB8PSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX05PQUNLOworCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7CisJCX0KKwogCQkvKiBxb3MgaGVhZGVyIGlzIDIgYnl0ZXMgKi8KIAkJKnArKyA9IGFja19wb2xpY3kgfCB0aWQ7CiAJCSpwID0gaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSA/CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd21lLmggYi9uZXQvbWFjODAyMTEvd21lLmgKaW5kZXggMzRlMTY2Zi4uOTRlZGNlYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dtZS5oCisrKyBiL25ldC9tYWM4MDIxMS93bWUuaApAQCAtMTUsNiArMTUsOSBAQAogCiBleHRlcm4gY29uc3QgaW50IGllZWU4MDJfMWRfdG9fYWNbOF07CiAKK3UxNiBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlXzgwMjExKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKTsKIHUxNiBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGllZWU4MDIxMV9zZXRfcW9zX2hkcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93b3JrLmMgYi9uZXQvbWFjODAyMTEvd29yay5jCmluZGV4IDNkZDVhODkuLmM2ZGQwMWEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93b3JrLmMKKysrIGIvbmV0L21hYzgwMjExL3dvcmsuYwpAQCAtOTQsNyArOTQsOCBAQAogCiAvKiBmcmFtZSBzZW5kaW5nIGZ1bmN0aW9ucyAqLwogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfYWRkX2h0X2llKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHU4ICpodF9pbmZvX2llLAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2FkZF9odF9pZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1OCAqaHRfaW5mb19pZSwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCQkJZW51bSBpZWVlODAyMTFfc21wc19tb2RlIHNtcHMpCkBAIC0xMDIsNyArMTAzLDEwIEBACiAJc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICpodF9pbmZvOwogCXU4ICpwb3M7CiAJdTMyIGZsYWdzID0gY2hhbm5lbC0+ZmxhZ3M7Ci0JdTE2IGNhcCA9IHNiYW5kLT5odF9jYXAuY2FwOworCXUxNiBjYXA7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwIGh0X2NhcDsKKworCUJVSUxEX0JVR19PTihzaXplb2YoaHRfY2FwKSAhPSBzaXplb2Yoc2JhbmQtPmh0X2NhcCkpOwogCiAJaWYgKCFzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKIAkJcmV0dXJuOwpAQCAtMTEzLDkgKzExNywxMyBAQAogCWlmIChodF9pbmZvX2llWzFdIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCiAJCXJldHVybjsKIAorCW1lbWNweSgmaHRfY2FwLCAmc2JhbmQtPmh0X2NhcCwgc2l6ZW9mKGh0X2NhcCkpOworCWllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc2RhdGEsICZodF9jYXApOworCiAJaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKikoaHRfaW5mb19pZSArIDIpOwogCiAJLyogZGV0ZXJtaW5lIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKwljYXAgPSBodF9jYXAuY2FwOwogCiAJc3dpdGNoIChodF9pbmZvLT5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewogCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CkBAIC0xNTQsNyArMTYyLDcgQEAKIAogCS8qIHJlc2VydmUgYW5kIGZpbGwgSUUgKi8KIAlwb3MgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSArIDIpOwotCWllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAocG9zLCBzYmFuZCwgY2FwKTsKKwlpZWVlODAyMTFfaWVfYnVpbGRfaHRfY2FwKHBvcywgJmh0X2NhcCwgY2FwKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfYXNzb2Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC0zMjksNyArMzM3LDcgQEAKIAogCWlmICh3ay0+YXNzb2MudXNlXzExbiAmJiB3ay0+YXNzb2Mud21tX3VzZWQgJiYKIAkgICAgbG9jYWwtPmh3LnF1ZXVlcyA+PSA0KQotCQlpZWVlODAyMTFfYWRkX2h0X2llKHNrYiwgd2stPmFzc29jLmh0X2luZm9ybWF0aW9uX2llLAorCQlpZWVlODAyMTFfYWRkX2h0X2llKHNkYXRhLCBza2IsIHdrLT5hc3NvYy5odF9pbmZvcm1hdGlvbl9pZSwKIAkJCQkgICAgc2JhbmQsIHdrLT5jaGFuLCB3ay0+YXNzb2Muc21wcyk7CiAKIAkvKiBpZiBwcmVzZW50LCBhZGQgYW55IGN1c3RvbSBub24tdmVuZG9yIElFcyB0aGF0IGdvIGFmdGVyIEhUICovCkBAIC04NTQsNDQgKzg2Miw2IEBACiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKLXN0YXRpYyBib29sIGllZWU4MDIxMV93b3JrX2N0X2NvZXhpc3RzKGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgd2tfY3QsCi0JCQkJICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgb3Blcl9jdCkKLXsKLQlzd2l0Y2ggKHdrX2N0KSB7Ci0JY2FzZSBOTDgwMjExX0NIQU5fTk9fSFQ6Ci0JCXJldHVybiB0cnVlOwotCWNhc2UgTkw4MDIxMV9DSEFOX0hUMjA6Ci0JCWlmIChvcGVyX2N0ICE9IE5MODAyMTFfQ0hBTl9OT19IVCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgotCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBQTFVTOgotCQlyZXR1cm4gKHdrX2N0ID09IG9wZXJfY3QpOwotCX0KLQlXQVJOX09OKDEpOyAvKiBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlCi1pZWVlODAyMTFfY2FsY19jdChlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHdrX2N0LAotCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgb3Blcl9jdCkKLXsKLQlzd2l0Y2ggKHdrX2N0KSB7Ci0JY2FzZSBOTDgwMjExX0NIQU5fTk9fSFQ6Ci0JCXJldHVybiBvcGVyX2N0OwotCWNhc2UgTkw4MDIxMV9DSEFOX0hUMjA6Ci0JCWlmIChvcGVyX2N0ICE9IE5MODAyMTFfQ0hBTl9OT19IVCkKLQkJCXJldHVybiBvcGVyX2N0OwotCQlyZXR1cm4gd2tfY3Q7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgotCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBQTFVTOgotCQlyZXR1cm4gd2tfY3Q7Ci0JfQotCVdBUk5fT04oMSk7IC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwotCXJldHVybiB3a19jdDsKLX0KLQotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfd29ya190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSAodm9pZCAqKSBkYXRhOwpAQCAtOTQyLDQwICs5MTIsMTIgQEAKIAkJfQogCiAJCWlmICghc3RhcnRlZCAmJiAhbG9jYWwtPnRtcF9jaGFubmVsKSB7Ci0JCQlib29sIG9uX29wZXJfY2hhbiwgb25fb3Blcl9jaGFuMjsKLQkJCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgd2tfY3Q7Ci0KLQkJCW9uX29wZXJfY2hhbiA9IGllZWU4MDIxMV9jZmdfb25fb3Blcl9jaGFubmVsKGxvY2FsKTsKLQotCQkJLyogV29yayB3aXRoIGV4aXN0aW5nIGNoYW5uZWwgdHlwZSBpZiBwb3NzaWJsZS4gKi8KLQkJCXdrX2N0ID0gd2stPmNoYW5fdHlwZTsKLQkJCWlmICh3ay0+Y2hhbiA9PSBsb2NhbC0+aHcuY29uZi5jaGFubmVsKQotCQkJCXdrX2N0ID0gaWVlZTgwMjExX2NhbGNfY3Qod2stPmNoYW5fdHlwZSwKLQkJCQkJCWxvY2FsLT5ody5jb25mLmNoYW5uZWxfdHlwZSk7CisJCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMobG9jYWwsIHRydWUpOwogCiAJCQlsb2NhbC0+dG1wX2NoYW5uZWwgPSB3ay0+Y2hhbjsKLQkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlID0gd2tfY3Q7Ci0JCQkvKgotCQkJICogTGVhdmUgdGhlIHN0YXRpb24gdmlmcyBpbiBhd2FrZSBtb2RlIGlmIHRoZXkKLQkJCSAqIGhhcHBlbiB0byBiZSBvbiB0aGUgc2FtZSBjaGFubmVsIGFzCi0JCQkgKiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuCi0JCQkgKi8KLQkJCW9uX29wZXJfY2hhbjIgPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0JCQlpZiAob25fb3Blcl9jaGFuICE9IG9uX29wZXJfY2hhbjIpIHsKLQkJCQlpZiAob25fb3Blcl9jaGFuMikgewotCQkJCQkvKiBnb2luZyBvZmYgb3BlciBjaGFubmVsLCBQUyB0b28gKi8KLQkJCQkJaWVlZTgwMjExX29mZmNoYW5uZWxfc3RvcF92aWZzKGxvY2FsLAotCQkJCQkJCQkgICAgICAgdHJ1ZSk7Ci0JCQkJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIGdvaW5nIG9uIGNoYW5uZWwsIGJ1dCBsZWF2ZSBQUwotCQkJCQkgKiBvZmYtY2hhbm5lbC4gKi8KLQkJCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7Ci0JCQkJCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwKLQkJCQkJCQkJICAgIHRydWUsCi0JCQkJCQkJCSAgICBmYWxzZSk7Ci0JCQkJfQotCQkJfQorCQkJbG9jYWwtPnRtcF9jaGFubmVsX3R5cGUgPSB3ay0+Y2hhbl90eXBlOworCisJCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKIAogCQkJc3RhcnRlZCA9IHRydWU7CiAJCQl3ay0+dGltZW91dCA9IGppZmZpZXM7CkBAIC0xMDQ0LDM0ICs5ODYsMTcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdrLCAmbG9jYWwtPndvcmtfbGlzdCwgbGlzdCkgewogCQlpZiAoIXdrLT5zdGFydGVkKQogCQkJY29udGludWU7Ci0JCWlmICh3ay0+Y2hhbiAhPSBsb2NhbC0+dG1wX2NoYW5uZWwpCi0JCQljb250aW51ZTsKLQkJaWYgKCFpZWVlODAyMTFfd29ya19jdF9jb2V4aXN0cyh3ay0+Y2hhbl90eXBlLAotCQkJCQkJbG9jYWwtPnRtcF9jaGFubmVsX3R5cGUpKQorCQlpZiAod2stPmNoYW4gIT0gbG9jYWwtPnRtcF9jaGFubmVsIHx8CisJCSAgICB3ay0+Y2hhbl90eXBlICE9IGxvY2FsLT50bXBfY2hhbm5lbF90eXBlKQogCQkJY29udGludWU7CiAJCXJlbWFpbl9vZmZfY2hhbm5lbCA9IHRydWU7CiAJfQogCiAJaWYgKCFyZW1haW5fb2ZmX2NoYW5uZWwgJiYgbG9jYWwtPnRtcF9jaGFubmVsKSB7CiAJCWxvY2FsLT50bXBfY2hhbm5lbCA9IE5VTEw7Ci0JCS8qIElmIHRtcF9jaGFubmVsIHdhc24ndCBvcGVyYXRpbmcgY2hhbm5lbCwgdGhlbgotCQkgKiB3ZSBuZWVkIHRvIGdvIGJhY2sgb24tY2hhbm5lbC4KLQkJICogTk9URTogIElmIHdlIGNhbiBldmVyIGJlIGhlcmUgd2hpbGUgc2Nhbm5uaW5nLAotCQkgKiBvciBpZiB0aGUgaHdfY29uZmlnKCkgY2hhbm5lbCBjb25maWcgbG9naWMgY2hhbmdlcywKLQkJICogdGhlbiB3ZSBtYXkgbmVlZCB0byBkbyBhIG1vcmUgdGhvcm91Z2ggY2hlY2sgdG8gc2VlIGlmCi0JCSAqIHdlIHN0aWxsIG5lZWQgdG8gZG8gYSBoYXJkd2FyZSBjb25maWcuICBDdXJyZW50bHksCi0JCSAqIHdlIGNhbm5vdCBiZSBoZXJlIHdoaWxlIHNjYW5uaW5nLCBob3dldmVyLgotCQkgKi8KLQkJaWYgKCFpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCkpCi0JCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKKwkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CiAKLQkJLyogQXQgdGhlIGxlYXN0LCB3ZSBuZWVkIHRvIGRpc2FibGUgb2ZmY2hhbm5lbF9wcywKLQkJICogc28ganVzdCBnbyBhaGVhZCBhbmQgcnVuIHRoZSBlbnRpcmUgb2ZmY2hhbm5lbAotCQkgKiByZXR1cm4gbG9naWMgaGVyZS4gIFdlICpjb3VsZCogc2tpcCBlbmFibGluZwotCQkgKiBiZWFjb25pbmcgaWYgd2Ugd2VyZSBhbHJlYWR5IG9uLW9wZXItY2hhbm5lbAotCQkgKiBhcyBhIGZ1dHVyZSBvcHRpbWl6YXRpb24uCi0JCSAqLwotCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIHRydWUsIHRydWUpOworCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIHRydWUpOwogCiAJCS8qIGdpdmUgY29ubmVjdGlvbiBzb21lIHRpbWUgdG8gYnJlYXRoZSAqLwogCQlydW5fYWdhaW4obG9jYWwsIGppZmZpZXMgKyBIWi8yKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93cGEuYyBiL25ldC9tYWM4MDIxMS93cGEuYwppbmRleCAxM2VmYWI1Li45M2FhYjA3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd3BhLmMKKysrIGIvbmV0L21hYzgwMjExL3dwYS5jCkBAIC0yMjMsMTQgKzIyMywxNCBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b190a2lwX2VuY3J5cHQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWlmICh0a2lwX2VuY3J5cHRfc2tiKHR4LCBza2IpIDwgMCkKIAkJCXJldHVybiBUWF9EUk9QOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC00MTUsNyArNDE1LDggQEAKIAltZW1tb3ZlKHBvcywgcG9zICsgQ0NNUF9IRFJfTEVOLCBoZHJsZW4pOwogCiAJLyogdGhlIEhXIG9ubHkgbmVlZHMgcm9vbSBmb3IgdGhlIElWLCBidXQgbm90IHRoZSBhY3R1YWwgSVYgKi8KLQlpZiAoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkKKwlpZiAoaW5mby0+Y29udHJvbC5od19rZXkgJiYKKwkgICAgKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0UpKQogCQlyZXR1cm4gMDsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBwb3M7CkBAIC00NDgsMTQgKzQ0OSwxNCBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19jY21wX2VuY3J5cHQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWlmIChjY21wX2VuY3J5cHRfc2tiKHR4LCBza2IpIDwgMCkKIAkJCXJldHVybiBUWF9EUk9QOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC01NTMsMTUgKzU1NCwyMiBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19hZXNfY21hY19lbmNyeXB0KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSB0eC0+a2V5OwogCXN0cnVjdCBpZWVlODAyMTFfbW1pZSAqbW1pZTsKIAl1OCBhYWRbMjBdOwogCXU2NCBwbjY0OwogCisJaWYgKFdBUk5fT04oc2tiX3F1ZXVlX2xlbigmdHgtPnNrYnMpICE9IDEpKQorCQlyZXR1cm4gVFhfRFJPUDsKKworCXNrYiA9IHNrYl9wZWVrKCZ0eC0+c2ticyk7CisKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJaWYgKFdBUk5fT04oc2tiX3RhaWxyb29tKHNrYikgPCBzaXplb2YoKm1taWUpKSkKIAkJcmV0dXJuIFRYX0RST1A7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCmluZGV4IDMzNDY4MjkuLmFmY2E2YzcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCkBAIC0xODAsMTcgKzE4MCwxNiBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfUVVFVUUpIHsKLQkJcmV0ID0gbmZfcXVldWUoc2tiLCBlbGVtLCBwZiwgaG9vaywgaW5kZXYsIG91dGRldiwgb2tmbiwKLQkJCSAgICAgICB2ZXJkaWN0ID4+IE5GX1ZFUkRJQ1RfUUJJVFMpOwotCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKHJldCA9PSAtRUNBTkNFTEVEKQorCQlpbnQgZXJyID0gbmZfcXVldWUoc2tiLCBlbGVtLCBwZiwgaG9vaywgaW5kZXYsIG91dGRldiwgb2tmbiwKKwkJCQkJCXZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlpZiAoZXJyID09IC1FQ0FOQ0VMRUQpCiAJCQkJZ290byBuZXh0X2hvb2s7Ci0JCQlpZiAocmV0ID09IC1FU1JDSCAmJgorCQkJaWYgKGVyciA9PSAtRVNSQ0ggJiYKIAkJCSAgICh2ZXJkaWN0ICYgTkZfVkVSRElDVF9GTEFHX1FVRVVFX0JZUEFTUykpCiAJCQkJZ290byBuZXh0X2hvb2s7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQotCQlyZXQgPSAwOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfY29yZS5jCmluZGV4IGQ3ZTg2ZWYuLjg2MTM3YjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9jb3JlLmMKQEAgLTE2OTksMTAgKzE2OTksOCBAQAogCiAJaXBfc2V0X2xpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfc2V0ICopICogaXBfc2V0X21heCwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghaXBfc2V0X2xpc3QpIHsKLQkJcHJfZXJyKCJpcF9zZXQ6IFVuYWJsZSB0byBjcmVhdGUgaXBfc2V0X2xpc3RcbiIpOworCWlmICghaXBfc2V0X2xpc3QpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldCA9IG5mbmV0bGlua19zdWJzeXNfcmVnaXN0ZXIoJmlwX3NldF9uZXRsaW5rX3N1YnN5cyk7CiAJaWYgKHJldCAhPSAwKSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9nZXRwb3J0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9nZXRwb3J0LmMKaW5kZXggNzU3MTQzYi4uMDUyNTc5ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfZ2V0cG9ydC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2dldHBvcnQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2dldHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogLyogV2UgbXVzdCBoYW5kbGUgbm9uLWxpbmVhciBza2JzICovCiBzdGF0aWMgYm9vbApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvcGZ4bGVuLmMKaW5kZXggYmQxM2Q2Ni4uNGYyOWZhOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9wZnhsZW4uYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L3BmeGxlbi5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9wZnhsZW4uaD4KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IDRmNzdiYjEuLjA5M2NjMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtMTg4LDE0ICsxODgsMTMgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSB2b2lkCiBpcF92c19zZXRfc3RhdGUoc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyZWN0aW9uLAogCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQlzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpCiB7Ci0JaWYgKHVubGlrZWx5KCFwZC0+cHAtPnN0YXRlX3RyYW5zaXRpb24pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcGQpOworCWlmIChsaWtlbHkocGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKSkKKwkJcGQtPnBwLT5zdGF0ZV90cmFuc2l0aW9uKGNwLCBkaXJlY3Rpb24sIHNrYiwgcGQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNTMwLDcgKzUyOSw3IEBACiAJICAgYSBjYWNoZV9ieXBhc3MgY29ubmVjdGlvbiBlbnRyeSAqLwogCWlwdnMgPSBuZXRfaXB2cyhuZXQpOwogCWlmIChpcHZzLT5zeXNjdGxfY2FjaGVfYnlwYXNzICYmIHN2Yy0+ZndtYXJrICYmIHVuaWNhc3QpIHsKLQkJaW50IHJldCwgY3M7CisJCWludCByZXQ7CiAJCXN0cnVjdCBpcF92c19jb25uICpjcDsKIAkJdW5zaWduZWQgaW50IGZsYWdzID0gKHN2Yy0+ZmxhZ3MgJiBJUF9WU19TVkNfRl9PTkVQQUNLRVQgJiYKIAkJCQkgICAgICBpcGgucHJvdG9jb2wgPT0gSVBQUk9UT19VRFApPwpAQCAtNTU3LDcgKzU1Niw3IEBACiAJCWlwX3ZzX2luX3N0YXRzKGNwLCBza2IpOwogCiAJCS8qIHNldCBzdGF0ZSAqLwotCQljcyA9IGlwX3ZzX3NldF9zdGF0ZShjcCwgSVBfVlNfRElSX0lOUFVULCBza2IsIHBkKTsKKwkJaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcGQpOwogCiAJCS8qIHRyYW5zbWl0IHRoZSBmaXJzdCBTWU4gcGFja2V0ICovCiAJCXJldCA9IGNwLT5wYWNrZXRfeG1pdChza2IsIGNwLCBwZC0+cHApOwpAQCAtMTQ5MCw3ICsxNDg5LDcgQEAKIAlzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwOwogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZDsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7Ci0JaW50IHJldCwgcmVzdGFydCwgcGt0czsKKwlpbnQgcmV0LCBwa3RzOwogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJLyogQWxyZWFkeSBtYXJrZWQgYXMgSVBWUyByZXF1ZXN0IG9yIHJlcGx5PyAqLwpAQCAtMTU5MSw3ICsxNTkwLDcgQEAKIAl9CiAKIAlpcF92c19pbl9zdGF0cyhjcCwgc2tiKTsKLQlyZXN0YXJ0ID0gaXBfdnNfc2V0X3N0YXRlKGNwLCBJUF9WU19ESVJfSU5QVVQsIHNrYiwgcGQpOworCWlwX3ZzX3NldF9zdGF0ZShjcCwgSVBfVlNfRElSX0lOUFVULCBza2IsIHBkKTsKIAlpZiAoY3AtPnBhY2tldF94bWl0KQogCQlyZXQgPSBjcC0+cGFja2V0X3htaXQoc2tiLCBjcCwgcHApOwogCQkvKiBkbyBub3QgdG91Y2ggc2tiIGFueW1vcmUgKi8KQEAgLTE4NzgsMTAgKzE4NzcsOSBAQAogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJaXB2cyA9IG5ldF9nZW5lcmljKG5ldCwgaXBfdnNfbmV0X2lkKTsKLQlpZiAoaXB2cyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMoKTogbm8gbWVtb3J5LlxuIiwgX19mdW5jX18pOworCWlmIChpcHZzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCS8qIEhvbGQgdGhlIGJlYXN0IHVudGlsIGEgc2VydmljZSBpcyByZWdpc3RlcmQgKi8KIAlpcHZzLT5lbmFibGUgPSAwOwogCWlwdnMtPm5ldCA9IG5ldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwppbmRleCBlM2JlNDhiLi4wMDhiZjk3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCkBAIC04NTYsMTUgKzg1NiwxMiBAQAogCX0KIAogCWRlc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfZGVzdCksIEdGUF9LRVJORUwpOwotCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGRlc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJZGVzdC0+c3RhdHMuY3B1c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyk7Ci0JaWYgKCFkZXN0LT5zdGF0cy5jcHVzdGF0cykgewotCQlwcl9lcnIoIiVzKCkgYWxsb2NfcGVyY3B1IGZhaWxlZFxuIiwgX19mdW5jX18pOworCWlmICghZGVzdC0+c3RhdHMuY3B1c3RhdHMpCiAJCWdvdG8gZXJyX2FsbG9jOwotCX0KIAogCWRlc3QtPmFmID0gc3ZjLT5hZjsKIAlkZXN0LT5wcm90b2NvbCA9IHN2Yy0+cHJvdG9jb2w7CkBAIC0xMTY4LDEwICsxMTY1LDggQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAlzdmMtPnN0YXRzLmNwdXN0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBpcF92c19jcHVfc3RhdHMpOwotCWlmICghc3ZjLT5zdGF0cy5jcHVzdGF0cykgewotCQlwcl9lcnIoIiVzKCkgYWxsb2NfcGVyY3B1IGZhaWxlZFxuIiwgX19mdW5jX18pOworCWlmICghc3ZjLT5zdGF0cy5jcHVzdGF0cykKIAkJZ290byBvdXRfZXJyOwotCX0KIAogCS8qIEknbSB0aGUgZmlyc3QgdXNlciBvZiB0aGUgc2VydmljZSAqLwogCWF0b21pY19zZXQoJnN2Yy0+dXNlY250LCAwKTsKQEAgLTMzMjYsMTAgKzMzMjEsOCBAQAogCWludCByZXQgPSAwLCBjbWQ7CiAJaW50IG5lZWRfZnVsbF9zdmMgPSAwLCBuZWVkX2Z1bGxfZGVzdCA9IDA7CiAJc3RydWN0IG5ldCAqbmV0OwotCXN0cnVjdCBuZXRuc19pcHZzICppcHZzOwogCiAJbmV0ID0gc2tiX3NrbmV0KHNrYik7Ci0JaXB2cyA9IG5ldF9pcHZzKG5ldCk7CiAJY21kID0gaW5mby0+Z2VubGhkci0+Y21kOwogCiAJbXV0ZXhfbG9jaygmX19pcF92c19tdXRleCk7CkBAIC0zNDIxLDEwICszNDE0LDggQEAKIAl2b2lkICpyZXBseTsKIAlpbnQgcmV0LCBjbWQsIHJlcGx5X2NtZDsKIAlzdHJ1Y3QgbmV0ICpuZXQ7Ci0Jc3RydWN0IG5ldG5zX2lwdnMgKmlwdnM7CiAKIAluZXQgPSBza2Jfc2tuZXQoc2tiKTsKLQlpcHZzID0gbmV0X2lwdnMobmV0KTsKIAljbWQgPSBpbmZvLT5nZW5saGRyLT5jbWQ7CiAKIAlpZiAoY21kID09IElQVlNfQ01EX0dFVF9TRVJWSUNFKQpAQCAtMzcyMCwxMCArMzcxMSw5IEBACiAKIAkvKiBwcm9jZnMgc3RhdHMgKi8KIAlpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyk7Ci0JaWYgKCFpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMpIHsKLQkJcHJfZXJyKCIlcygpOiBhbGxvY19wZXJjcHUuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCXNwaW5fbG9ja19pbml0KCZpcHZzLT50b3Rfc3RhdHMubG9jayk7CiAKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZShuZXQsICJpcF92cyIsIDAsICZpcF92c19pbmZvX2ZvcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2RoLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYwppbmRleCA5NWZkMGQxLi4xYzI2OWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZGguYwpAQCAtMTUwLDEwICsxNTAsOSBAQAogCS8qIGFsbG9jYXRlIHRoZSBESCB0YWJsZSBmb3IgdGhpcyBzZXJ2aWNlICovCiAJdGJsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX2RoX2J1Y2tldCkqSVBfVlNfREhfVEFCX1NJWkUsCiAJCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmICh0YmwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmICh0YmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwogCUlQX1ZTX0RCRyg2LCAiREggaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Z0cC5jCmluZGV4IDQ0OTBhMzIuLjUzOGQ3NGUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZnRwLmMKQEAgLTUyLDggKzUyLDkgQEAKICAqIExpc3Qgb2YgcG9ydHMgKHVwIHRvIElQX1ZTX0FQUF9NQVhfUE9SVFMpIHRvIGJlIGhhbmRsZWQgYnkgaGVscGVyCiAgKiBGaXJzdCBwb3J0IGlzIHNldCB0byB0aGUgZGVmYXVsdCBwb3J0LgogICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzX2NvdW50ID0gMTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tJUF9WU19BUFBfTUFYX1BPUlRTXSA9IHsyMSwgMH07Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2NvdW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJQb3J0cyB0byBtb25pdG9yIGZvciBGVFAgY29udHJvbCBjb21tYW5kcyIpOwogCiAKQEAgLTQ0OSw3ICs0NTAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKLQlmb3IgKGk9MDsgaTxJUF9WU19BUFBfTUFYX1BPUlRTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfY291bnQ7IGkrKykgewogCQlpZiAoIXBvcnRzW2ldKQogCQkJY29udGludWU7CiAJCXJldCA9IHJlZ2lzdGVyX2lwX3ZzX2FwcF9pbmMobmV0LCBhcHAsIGFwcC0+cHJvdG9jb2wsIHBvcnRzW2ldKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsYy5jCmluZGV4IDg3ZTQwZWEuLjBmMTYyODMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19sYmxjLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGMuYwpAQCAtMjAyLDEwICsyMDIsOCBAQAogCWVuID0gaXBfdnNfbGJsY19nZXQoZGVzdC0+YWYsIHRibCwgZGFkZHIpOwogCWlmICghZW4pIHsKIAkJZW4gPSBrbWFsbG9jKHNpemVvZigqZW4pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlbikgewotCQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJaWYgKCFlbikKIAkJCXJldHVybiBOVUxMOwotCQl9CiAKIAkJZW4tPmFmID0gZGVzdC0+YWY7CiAJCWlwX3ZzX2FkZHJfY29weShkZXN0LT5hZiwgJmVuLT5hZGRyLCBkYWRkcik7CkBAIC0zNDUsMTAgKzM0Myw5IEBACiAJICogICAgQWxsb2NhdGUgdGhlIGlwX3ZzX2xibGNfdGFibGUgZm9yIHRoaXMgc2VydmljZQogCSAqLwogCXRibCA9IGttYWxsb2Moc2l6ZW9mKCp0YmwpLCBHRlBfQVRPTUlDKTsKLQlpZiAodGJsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwlpZiAodGJsID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCXN2Yy0+c2NoZWRfZGF0YSA9IHRibDsKIAlJUF9WU19EQkcoNiwgIkxCTEMgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLCBzaXplb2YoKnRibCkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2xibGNyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYwppbmRleCA5MGY2MThhLi5lZWM3OTdmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbGJsY3IuYwpAQCAtMTEyLDEwICsxMTIsOCBAQAogCX0KIAogCWUgPSBrbWFsbG9jKHNpemVvZigqZSksIEdGUF9BVE9NSUMpOwotCWlmIChlID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcygpOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwlpZiAoZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwogCWUtPmRlc3QgPSBkZXN0OwpAQCAtMzczLDEwICszNzEsOCBAQAogCWVuID0gaXBfdnNfbGJsY3JfZ2V0KGRlc3QtPmFmLCB0YmwsIGRhZGRyKTsKIAlpZiAoIWVuKSB7CiAJCWVuID0ga21hbGxvYyhzaXplb2YoKmVuKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZW4pIHsKLQkJCXByX2VycigiJXMoKTogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCWlmICghZW4pCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCiAJCWVuLT5hZiA9IGRlc3QtPmFmOwogCQlpcF92c19hZGRyX2NvcHkoZGVzdC0+YWYsICZlbi0+YWRkciwgZGFkZHIpOwpAQCAtNTE2LDEwICs1MTIsOSBAQAogCSAqICAgIEFsbG9jYXRlIHRoZSBpcF92c19sYmxjcl90YWJsZSBmb3IgdGhpcyBzZXJ2aWNlCiAJICovCiAJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9BVE9NSUMpOwotCWlmICh0YmwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmICh0YmwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJc3ZjLT5zY2hlZF9kYXRhID0gdGJsOwogCUlQX1ZTX0RCRyg2LCAiTEJMQ1IgaGFzaCB0YWJsZSAobWVtb3J5PSVaZGJ5dGVzKSBhbGxvY2F0ZWQgZm9yICIKIAkJICAiY3VycmVudCBzZXJ2aWNlXG4iLCBzaXplb2YoKnRibCkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMKaW5kZXggZjQ1NGM4MC4uMDIyZTc3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAluZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkoY3QsICZuZXdfdHVwbGUpOwogfQogCi1pbnQgaXBfdnNfY29uZmlybV9jb25udHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwKQoraW50IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIG5mX2Nvbm50cmFja19jb25maXJtKHNrYik7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCmluZGV4IDUyZDA3M2MuLjg1MzEyOTMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90by5jCkBAIC03NCwxMCArNzQsOSBAQAogCXN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCA9CiAJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSksIEdGUF9BVE9NSUMpOwogCi0JaWYgKCFwZCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeS5cbiIsIF9fZnVuY19fKTsKKwlpZiAoIXBkKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlwZC0+cHAgPSBwcDsJLyogRm9yIHNwZWVkIGlzc3VlcyAqLwogCXBkLT5uZXh0ID0gaXB2cy0+cHJvdG9fZGF0YV90YWJsZVtoYXNoXTsKIAlpcHZzLT5wcm90b19kYXRhX3RhYmxlW2hhc2hdID0gcGQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3NjdHAuYwppbmRleCBkMTJlZDUzLi4xZmJmN2EyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b19zY3RwLmMKQEAgLTkwNiw3ICs5MDYsNyBAQAogCXJldHVybiAiPyI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIHNldF9zY3RwX3N0YXRlKHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCwgc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLAogCQlpbnQgZGlyZWN0aW9uLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtOTI0LDcgKzkyNCw3IEBACiAJc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaWhsICsgc2l6ZW9mKHNjdHBfc2N0cGhkcl90KSwKIAkJCQlzaXplb2YoX3NjdHBjaCksICZfc2N0cGNoKTsKIAlpZiAoc2NoID09IE5VTEwpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAljaHVua190eXBlID0gc2NoLT50eXBlOwogCS8qCkBAIC05OTMsMjEgKzk5MywxNSBAQAogCQljcC0+dGltZW91dCA9IHBkLT50aW1lb3V0X3RhYmxlW2NwLT5zdGF0ZSA9IG5leHRfc3RhdGVdOwogCWVsc2UJLyogV2hhdCB0byBkbyA/ICovCiAJCWNwLT50aW1lb3V0ID0gc2N0cF90aW1lb3V0c1tjcC0+c3RhdGUgPSBuZXh0X3N0YXRlXTsKLQotCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogc2N0cF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvX2RhdGEgKnBkKQogewotCWludCByZXQgPSAwOwotCiAJc3Bpbl9sb2NrKCZjcC0+bG9jayk7Ci0JcmV0ID0gc2V0X3NjdHBfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHNrYik7CisJc2V0X3NjdHBfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHNrYik7CiAJc3Bpbl91bmxvY2soJmNwLT5sb2NrKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MTYgc2N0cF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b190Y3AuYwppbmRleCBjMGNjMzQxLi5lZjg2NDFmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIC8qCiAgKglIYW5kbGUgc3RhdGUgdHJhbnNpdGlvbnMKICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHRjcF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCkKQEAgLTU2MSwxMyArNTYxLDExIEBACiAKIAl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlobCwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCXNwaW5fbG9jaygmY3AtPmxvY2spOwogCXNldF90Y3Bfc3RhdGUocGQsIGNwLCBkaXJlY3Rpb24sIHRoKTsKIAlzcGluX3VubG9jaygmY3AtPmxvY2spOwotCi0JcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191MTYgdGNwX2FwcF9oYXNoa2V5KF9fYmUxNiBwb3J0KQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmluZGV4IGYxMjgyY2IuLmY0YjcyNjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wcm90b191ZHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKQEAgLTQ1NCwxOCArNDU0LDE3IEBACiAJcmV0dXJuIHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA/IHVkcF9zdGF0ZV9uYW1lX3RhYmxlW3N0YXRlXSA6ICI/IjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHVkcF9zdGF0ZV90cmFuc2l0aW9uKHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGRpcmVjdGlvbiwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgIHN0cnVjdCBpcF92c19wcm90b19kYXRhICpwZCkKIHsKIAlpZiAodW5saWtlbHkoIXBkKSkgewogCQlwcl9lcnIoIlVEUCBubyBucyBkYXRhXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CiAKIAljcC0+dGltZW91dCA9IHBkLT50aW1lb3V0X3RhYmxlW0lQX1ZTX1VEUF9TX05PUk1BTF07Ci0JcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIF9fdWRwX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgaXBfdnNfcHJvdG9fZGF0YSAqcGQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2guYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCmluZGV4IGI1ZTI1NTYuLjMzODE1ZjQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCkBAIC0xNDcsMTAgKzE0Nyw5IEBACiAJLyogYWxsb2NhdGUgdGhlIFNIIHRhYmxlIGZvciB0aGlzIHNlcnZpY2UgKi8KIAl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0KSpJUF9WU19TSF9UQUJfU0laRSwKIAkJICAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKHRibCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMoKTogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJaWYgKHRibCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAlzdmMtPnNjaGVkX2RhdGEgPSB0Ymw7CiAJSVBfVlNfREJHKDYsICJTSCBoYXNoIHRhYmxlIChtZW1vcnk9JVpkYnl0ZXMpIGFsbG9jYXRlZCBmb3IgIgogCQkgICJjdXJyZW50IHNlcnZpY2VcbiIsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfd3JyLmMKaW5kZXggMWVmNDFmNS4uZmQwZDRlMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3dyci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c193cnIuYwpAQCAtODUsMTAgKzg1LDkgQEAKIAkgKiAgICBBbGxvY2F0ZSB0aGUgbWFyayB2YXJpYWJsZSBmb3IgV1JSIHNjaGVkdWxpbmcKIAkgKi8KIAltYXJrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX3ZzX3dycl9tYXJrKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKG1hcmsgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzKCk6IG5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCWlmIChtYXJrID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwogCW1hcmstPmNsID0gJnN2Yy0+ZGVzdGluYXRpb25zOwogCW1hcmstPmN3ID0gMDsKIAltYXJrLT5tdyA9IGlwX3ZzX3dycl9tYXhfd2VpZ2h0KHN2Yyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBlZTMxOWE0Li5hYTJkNzIwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKQEAgLTMzOSw3ICszMzksNyBAQAogCQkJCQkJCQlcCiAJKHNrYiktPmlwdnNfcHJvcGVydHkgPSAxOwkJCQlcCiAJaWYgKHVubGlrZWx5KChjcCktPmZsYWdzICYgSVBfVlNfQ09OTl9GX05GQ1QpKQkJXAotCQlfX3JldCA9IGlwX3ZzX2NvbmZpcm1fY29ubnRyYWNrKHNrYiwgY3ApOwlcCisJCV9fcmV0ID0gaXBfdnNfY29uZmlybV9jb25udHJhY2soc2tiKTsJCVwKIAlpZiAoX19yZXQgPT0gTkZfQUNDRVBUKSB7CQkJCVwKIAkJbmZfcmVzZXQoc2tiKTsJCQkJCVwKIAkJc2tiX2ZvcndhcmRfY3N1bShza2IpOwkJCQlcCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKaW5kZXggNTE3OGM2OS4uMzY5ZGYzZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCA1YWNmYWY1Li43MjAyYjA2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC02NjEsNyArNjYxLDYgQEAKIAkgKi8KIAljdCA9IGttZW1fY2FjaGVfYWxsb2MobmV0LT5jdC5uZl9jb25udHJhY2tfY2FjaGVwLCBnZnApOwogCWlmIChjdCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJuZl9jb25udHJhY2tfYWxsb2M6IENhbid0IGFsbG9jIGNvbm50cmFjay5cbiIpOwogCQlhdG9taWNfZGVjKCZuZXQtPmN0LmNvdW50KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQpAQCAtNzQ5LDEwICs3NDgsOCBAQAogCiAJY3QgPSBfX25mX2Nvbm50cmFja19hbGxvYyhuZXQsIHpvbmUsIHR1cGxlLCAmcmVwbF90dXBsZSwgR0ZQX0FUT01JQywKIAkJCQkgIGhhc2gpOwotCWlmIChJU19FUlIoY3QpKSB7Ci0JCXByX2RlYnVnKCJDYW4ndCBhbGxvY2F0ZSBjb25udHJhY2suXG4iKTsKKwlpZiAoSVNfRVJSKGN0KSkKIAkJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKiljdDsKLQl9CiAKIAlpZiAoIWw0cHJvdG8tPm5ldyhjdCwgc2tiLCBkYXRhb2ZmKSkgewogCQluZl9jb25udHJhY2tfZnJlZShjdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCmluZGV4IDNhZGQ5OTQuLjZiMzY4YmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCmluZGV4IGNkMWU4ZTAuLjM0MGM4MGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCAyZDgxNThhLi42NmIyYzU0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtMzA3LDE3ICszMDcsMTQgQEAKIAluID0gbWF4KGluc3Rfc2l6ZSwgcGt0X3NpemUpOwogCXNrYiA9IGFsbG9jX3NrYihuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewotCQlwcl9ub3RpY2UoIm5mbmV0bGlua19sb2c6IGNhbid0IGFsbG9jIHdob2xlIGJ1ZmZlciAoJXUgYnl0ZXMpXG4iLAotCQkJaW5zdF9zaXplKTsKLQogCQlpZiAobiA+IHBrdF9zaXplKSB7CiAJCQkvKiB0cnkgdG8gYWxsb2NhdGUgb25seSBhcyBtdWNoIGFzIHdlIG5lZWQgZm9yIGN1cnJlbnQKIAkJCSAqIHBhY2tldCAqLwogCiAJCQlza2IgPSBhbGxvY19za2IocGt0X3NpemUsIEdGUF9BVE9NSUMpOwogCQkJaWYgKCFza2IpCi0JCQkJcHJfZXJyKCJuZm5ldGxpbmtfbG9nOiBjYW4ndCBldmVuIGFsbG9jICV1ICIKLQkJCQkgICAgICAgImJ5dGVzXG4iLCBwa3Rfc2l6ZSk7CisJCQkJcHJfZXJyKCJuZm5ldGxpbmtfbG9nOiBjYW4ndCBldmVuIGFsbG9jICV1IGJ5dGVzXG4iLAorCQkJCSAgICAgICBwa3Rfc2l6ZSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCA3MTQ0MWI5Li44ZDk4N2MzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKi8KICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jIGIvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYwppbmRleCAzYmRkNDQzLi5mNDA3ZWJjMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9JRExFVElNRVIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0lETEVUSU1FUi5jCkBAIC0xMjIsMTQgKzEyMiwxMiBAQAogCiAJaW5mby0+dGltZXIgPSBrbWFsbG9jKHNpemVvZigqaW5mby0+dGltZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8tPnRpbWVyKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBhbGxvYyB0aW1lclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCWluZm8tPnRpbWVyLT5hdHRyLmF0dHIubmFtZSA9IGtzdHJkdXAoaW5mby0+bGFiZWwsIEdGUF9LRVJORUwpOwogCWlmICghaW5mby0+dGltZXItPmF0dHIuYXR0ci5uYW1lKSB7Ci0JCXByX2RlYnVnKCJjb3VsZG4ndCBhbGxvYyBhdHRyaWJ1dGUgbmFtZVxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfdGltZXI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKaW5kZXggOTIyOGVlMGQuLmRmZDUyYmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwpAQCAtMTc2LDEwICsxNzYsNyBAQAogCQllbnQgPSBOVUxMOwogCX0gZWxzZQogCQllbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGhhc2hsaW1pdF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmICghZW50KSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcl9lcnIoImNhbm5vdCBhbGxvY2F0ZSBkc3RoYXNoX2VudFxuIik7Ci0JfSBlbHNlIHsKKwlpZiAoZW50KSB7CiAJCW1lbWNweSgmZW50LT5kc3QsIGRzdCwgc2l6ZW9mKGVudC0+ZHN0KSk7CiAJCXNwaW5fbG9ja19pbml0KCZlbnQtPmxvY2spOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3F1b3RhLmMKaW5kZXggNzBlYjJiNC4uNDRjOGViNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9xdW90YS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXVvdGEuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9xdW90YS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdHJ1Y3QgeHRfcXVvdGFfcHJpdiB7CiAJc3BpbmxvY2tfdAlsb2NrOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmMKaW5kZXggNDJlY2I3MS4uNGZlNGZiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zdGF0aXN0aWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRpc3RpYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCB4dF9zdGF0aXN0aWNfcHJpdiB7CiAJYXRvbWljX3QgY291bnQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX3JvdXRlLmMgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKaW5kZXggY2Q1ZGRiMi4uOTE1YTg3YiAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCisrKyBiL25ldC9uZXRyb20vbnJfcm91dGUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bmV0L25ldHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfbmVpZ2hfbm8gPSAxOwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL0tjb25maWcgYi9uZXQvbmZjL0tjb25maWcKaW5kZXggNThjZGRhZC4uNDRjODY1YiAxMDA2NDQKLS0tIGEvbmV0L25mYy9LY29uZmlnCisrKyBiL25ldC9uZmMvS2NvbmZpZwpAQCAtMTQsNSArMTQsNiBAQAogCSAgYmUgY2FsbGVkIG5mYy4KIAogc291cmNlICJuZXQvbmZjL25jaS9LY29uZmlnIgorc291cmNlICJuZXQvbmZjL2xsY3AvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL25mYy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvbmV0L25mYy9NYWtlZmlsZSBiL25ldC9uZmMvTWFrZWZpbGUKaW5kZXggZmJiNTUwZi4uN2I0YTZkYyAxMDA2NDQKLS0tIGEvbmV0L25mYy9NYWtlZmlsZQorKysgYi9uZXQvbmZjL01ha2VmaWxlCkBAIC02LDMgKzYsNCBAQAogb2JqLSQoQ09ORklHX05GQ19OQ0kpICs9IG5jaS8KIAogbmZjLW9ianMgOj0gY29yZS5vIG5ldGxpbmsubyBhZl9uZmMubyByYXdzb2NrLm8KK25mYy0kKENPTkZJR19ORkNfTExDUCkJKz0gbGxjcC9sbGNwLm8gbGxjcC9jb21tYW5kcy5vIGxsY3Avc29jay5vCmRpZmYgLS1naXQgYS9uZXQvbmZjL2FmX25mYy5jIGIvbmV0L25mYy9hZl9uZmMuYwppbmRleCBlOTgyY2VmLi5kYTY3NzU2IDEwMDY0NAotLS0gYS9uZXQvbmZjL2FmX25mYy5jCisrKyBiL25ldC9uZmMvYWZfbmZjLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbmZjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJuZmMuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9jb3JlLmMgYi9uZXQvbmZjL2NvcmUuYwppbmRleCA0N2UwMmMxLi4zZGRmNmU2IDEwMDY0NAotLS0gYS9uZXQvbmZjL2NvcmUuYworKysgYi9uZXQvbmZjL2NvcmUuYwpAQCAtMjEsMTAgKzIxLDEzIEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KIAogI2luY2x1ZGUgIm5mYy5oIgogCkBAIC0zMywyNSArMzYsNiBAQAogaW50IG5mY19kZXZsaXN0X2dlbmVyYXRpb247CiBERUZJTkVfTVVURVgobmZjX2Rldmxpc3RfbXV0ZXgpOwogCi1pbnQgbmZjX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0Jc3RydWN0IHZhX2Zvcm1hdCB2YWY7Ci0JdmFfbGlzdCBhcmdzOwotCWludCByOwotCi0JdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQotCXZhZi5mbXQgPSBmb3JtYXQ7Ci0JdmFmLnZhID0gJmFyZ3M7Ci0KLQlyID0gcHJpbnRrKCIlc05GQzogJXBWXG4iLCBsZXZlbCwgJnZhZik7Ci0KLQl2YV9lbmQoYXJncyk7Ci0KLQlyZXR1cm4gcjsKLX0KLUVYUE9SVF9TWU1CT0wobmZjX3ByaW50ayk7Ci0KIC8qKgogICogbmZjX2Rldl91cCAtIHR1cm4gb24gdGhlIE5GQyBkZXZpY2UKICAqCkBAIC02Myw3ICs0Nyw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCWRldmljZV9sb2NrKCZkZXYtPmRldik7CiAKQEAgLTk3LDcgKzgxLDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKIApAQCAtMTM5LDcgKzEyMyw4IEBACiB7CiAJaW50IHJjOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgcHJvdG9jb2xzPTB4JXgiLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBwcm90b2NvbHMpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyBwcm90b2NvbHM9MHgleFxuIiwKKwkJIGRldl9uYW1lKCZkZXYtPmRldiksIHByb3RvY29scyk7CiAKIAlpZiAoIXByb3RvY29scykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzQsNyArMTU5LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKIApAQCAtMTk2LDYgKzE4MSw4NiBAQAogCXJldHVybiByYzsKIH0KIAoraW50IG5mY19kZXBfbGlua191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCBpbnQgdGFyZ2V0X2luZGV4LAorCQkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyBjb21tOiVkIHJmOiVkXG4iLAorCQkJZGV2X25hbWUoJmRldi0+ZGV2KSwgY29tbV9tb2RlLCByZl9tb2RlKTsKKworCWlmICghZGV2LT5vcHMtPmRlcF9saW5rX3VwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOworCisJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZGV2LT5kZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoZGV2LT5kZXBfbGlua191cCA9PSB0cnVlKSB7CisJCXJjID0gLUVBTFJFQURZOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gZGV2LT5vcHMtPmRlcF9saW5rX3VwKGRldiwgdGFyZ2V0X2luZGV4LCBjb21tX21vZGUsIHJmX21vZGUpOworCitlcnJvcjoKKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisJcmV0dXJuIHJjOworfQorCitpbnQgbmZjX2RlcF9saW5rX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKworCWlmICghZGV2LT5vcHMtPmRlcF9saW5rX2Rvd24pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRldmljZV9sb2NrKCZkZXYtPmRldik7CisKKwlpZiAoIWRldmljZV9pc19yZWdpc3RlcmVkKCZkZXYtPmRldikpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChkZXYtPmRlcF9saW5rX3VwID09IGZhbHNlKSB7CisJCXJjID0gLUVBTFJFQURZOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChkZXYtPmRlcF9yZl9tb2RlID09IE5GQ19SRl9UQVJHRVQpIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYyA9IGRldi0+b3BzLT5kZXBfbGlua19kb3duKGRldik7CisJaWYgKCFyYykgeworCQlkZXYtPmRlcF9saW5rX3VwID0gZmFsc2U7CisJCW5mY19sbGNwX21hY19pc19kb3duKGRldik7CisJCW5mY19nZW5sX2RlcF9saW5rX2Rvd25fZXZlbnQoZGV2KTsKKwl9CisKK2Vycm9yOgorCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBuZmNfZGVwX2xpbmtfaXNfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlkZXYtPmRlcF9saW5rX3VwID0gdHJ1ZTsKKwlkZXYtPmRlcF9yZl9tb2RlID0gcmZfbW9kZTsKKworCW5mY19sbGNwX21hY19pc191cChkZXYsIHRhcmdldF9pZHgsIGNvbW1fbW9kZSwgcmZfbW9kZSk7CisKKwlyZXR1cm4gbmZjX2dlbmxfZGVwX2xpbmtfdXBfZXZlbnQoZGV2LCB0YXJnZXRfaWR4LCBjb21tX21vZGUsIHJmX21vZGUpOworfQorRVhQT1JUX1NZTUJPTChuZmNfZGVwX2xpbmtfaXNfdXApOworCiAvKioKICAqIG5mY19hY3RpdmF0ZV90YXJnZXQgLSBwcmVwYXJlIHRoZSB0YXJnZXQgZm9yIGRhdGEgZXhjaGFuZ2UKICAqCkBAIC0yMDcsOCArMjcyLDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBwcm90b2NvbCk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBwcm90b2NvbCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yMzYsNyArMzAxLDggQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgdGFyZ2V0X2lkeD0ldSIsIGRldl9uYW1lKCZkZXYtPmRldiksIHRhcmdldF9pZHgpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1XG4iLAorCQkgZGV2X25hbWUoJmRldi0+ZGV2KSwgdGFyZ2V0X2lkeCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yNzEsOCArMzM3LDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHNrYi0+bGVuPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBza2ItPmxlbik7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgc2tiLT5sZW49JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBza2ItPmxlbik7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yODksMTMgKzM1NSw1NCBAQAogCXJldHVybiByYzsKIH0KIAoraW50IG5mY19zZXRfcmVtb3RlX2dlbmVyYWxfYnl0ZXMoc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmdiLCB1OCBnYl9sZW4pCit7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIGdiX2xlbj0lZFxuIiwKKwkJCWRldl9uYW1lKCZkZXYtPmRldiksIGdiX2xlbik7CisKKwlpZiAoZ2JfbGVuID4gTkZDX01BWF9HVF9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG5mY19sbGNwX3NldF9yZW1vdGVfZ2IoZGV2LCBnYiwgZ2JfbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wobmZjX3NldF9yZW1vdGVfZ2VuZXJhbF9ieXRlcyk7CisKK3U4ICpuZmNfZ2V0X2xvY2FsX2dlbmVyYWxfYnl0ZXMoc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmd0X2xlbikKK3sKKwlyZXR1cm4gbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhkZXYsIGd0X2xlbik7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19nZXRfbG9jYWxfZ2VuZXJhbF9ieXRlcyk7CisKIC8qKgotICogbmZjX2FsbG9jX3NrYiAtIGFsbG9jYXRlIGEgc2tiIGZvciBkYXRhIGV4Y2hhbmdlIHJlc3BvbnNlcworICogbmZjX2FsbG9jX3NlbmRfc2tiIC0gYWxsb2NhdGUgYSBza2IgZm9yIGRhdGEgZXhjaGFuZ2UgcmVzcG9uc2VzCiAgKgogICogQHNpemU6IHNpemUgdG8gYWxsb2NhdGUKICAqIEBnZnA6IGdmcCBmbGFncwogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZ2ZwKQorc3RydWN0IHNrX2J1ZmYgKm5mY19hbGxvY19zZW5kX3NrYihzdHJ1Y3QgbmZjX2RldiAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCXVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCXVuc2lnbmVkIGludCAqZXJyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHRvdGFsX3NpemU7CisKKwl0b3RhbF9zaXplID0gc2l6ZSArCisJCWRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgdG90YWxfc2l6ZSwgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsIGVycik7CisJaWYgKHNrYikKKwkJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPnR4X2hlYWRyb29tICsgTkZDX0hFQURFUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKKy8qKgorICogbmZjX2FsbG9jX3JlY3Zfc2tiIC0gYWxsb2NhdGUgYSBza2IgZm9yIGRhdGEgZXhjaGFuZ2UgcmVzcG9uc2VzCisgKgorICogQHNpemU6IHNpemUgdG8gYWxsb2NhdGUKKyAqIEBnZnA6IGdmcCBmbGFncworICovCitzdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3JlY3Zfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZTsKQEAgLTMwOCw3ICs0MTUsNyBAQAogCiAJcmV0dXJuIHNrYjsKIH0KLUVYUE9SVF9TWU1CT0wobmZjX2FsbG9jX3NrYik7CitFWFBPUlRfU1lNQk9MKG5mY19hbGxvY19yZWN2X3NrYik7CiAKIC8qKgogICogbmZjX3RhcmdldHNfZm91bmQgLSBpbmZvcm0gdGhhdCB0YXJnZXRzIHdlcmUgZm91bmQKQEAgLTMyNiw3ICs0MzMsNyBAQAogewogCWludCBpOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgbl90YXJnZXRzPSVkIiwgZGV2X25hbWUoJmRldi0+ZGV2KSwgbl90YXJnZXRzKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXMgbl90YXJnZXRzPSVkXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBuX3RhcmdldHMpOwogCiAJZGV2LT5wb2xsaW5nID0gZmFsc2U7CiAKQEAgLTM2MCw3ICs0NjcsNyBAQAogewogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSB0b19uZmNfZGV2KGQpOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJbmZjX2dlbmxfZGF0YV9leGl0KCZkZXYtPmdlbmxfZGF0YSk7CiAJa2ZyZWUoZGV2LT50YXJnZXRzKTsKQEAgLTQ0Niw3ICs1NTMsNyBAQAogewogCWludCByYzsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW11dGV4X2xvY2soJm5mY19kZXZsaXN0X211dGV4KTsKIAluZmNfZGV2bGlzdF9nZW5lcmF0aW9uKys7CkBAIC00NTYsMTEgKzU2MywxNCBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAorCXJjID0gbmZjX2xsY3BfcmVnaXN0ZXJfZGV2aWNlKGRldik7CisJaWYgKHJjKQorCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBsbGNwIGRldmljZVxuIik7CisKIAlyYyA9IG5mY19nZW5sX2RldmljZV9hZGRlZChkZXYpOwogCWlmIChyYykKLQkJbmZjX2RiZygiVGhlIHVzZXJzcGFjZSB3b24ndCBiZSBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgJXMgd2FzIgotCQkJCQkJIiBhZGRlZCIsIGRldl9uYW1lKCZkZXYtPmRldikpOwotCisJCXByX2RlYnVnKCJUaGUgdXNlcnNwYWNlIHdvbid0IGJlIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSAlcyB3YXMgYWRkZWRcbiIsCisJCQkgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3NSw3ICs1ODUsNyBAQAogewogCWludCByYzsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW11dGV4X2xvY2soJm5mY19kZXZsaXN0X211dGV4KTsKIAluZmNfZGV2bGlzdF9nZW5lcmF0aW9uKys7CkBAIC00ODgsMTAgKzU5OCwxMiBAQAogCiAJbXV0ZXhfdW5sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CiAKKwluZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShkZXYpOworCiAJcmMgPSBuZmNfZ2VubF9kZXZpY2VfcmVtb3ZlZChkZXYpOwogCWlmIChyYykKLQkJbmZjX2RiZygiVGhlIHVzZXJzcGFjZSB3b24ndCBiZSBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgJXMiCi0JCQkJCSIgd2FzIHJlbW92ZWQiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwkJcHJfZGVidWcoIlRoZSB1c2Vyc3BhY2Ugd29uJ3QgYmUgbm90aWZpZWQgdGhhdCB0aGUgZGV2aWNlICVzIHdhcyByZW1vdmVkXG4iLAorCQkJIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiB9CiBFWFBPUlRfU1lNQk9MKG5mY191bnJlZ2lzdGVyX2RldmljZSk7CkBAIC01MDAsNyArNjEyLDcgQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfaW5mbygiTkZDIENvcmUgdmVyICVzIiwgVkVSU0lPTik7CisJcHJfaW5mbygiTkZDIENvcmUgdmVyICVzXG4iLCBWRVJTSU9OKTsKIAogCXJjID0gY2xhc3NfcmVnaXN0ZXIoJm5mY19jbGFzcyk7CiAJaWYgKHJjKQpAQCAtNTE3LDYgKzYyOSwxMCBAQAogCWlmIChyYykKIAkJZ290byBlcnJfcmF3c29jazsKIAorCXJjID0gbmZjX2xsY3BfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBlcnJfbGxjcF9zb2NrOworCiAJcmMgPSBhZl9uZmNfaW5pdCgpOwogCWlmIChyYykKIAkJZ290byBlcnJfYWZfbmZjOwpAQCAtNTI0LDYgKzY0MCw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9hZl9uZmM6CisJbmZjX2xsY3BfZXhpdCgpOworZXJyX2xsY3Bfc29jazoKIAlyYXdzb2NrX2V4aXQoKTsKIGVycl9yYXdzb2NrOgogCW5mY19nZW5sX2V4aXQoKTsKQEAgLTUzNSw2ICs2NTMsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IG5mY19leGl0KHZvaWQpCiB7CiAJYWZfbmZjX2V4aXQoKTsKKwluZmNfbGxjcF9leGl0KCk7CiAJcmF3c29ja19leGl0KCk7CiAJbmZjX2dlbmxfZXhpdCgpOwogCWNsYXNzX3VucmVnaXN0ZXIoJm5mY19jbGFzcyk7CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3AvS2NvbmZpZyBiL25ldC9uZmMvbGxjcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjVlODEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL2xsY3AvS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBORkNfTExDUAorICAgICAgIGRlcGVuZHMgb24gTkZDICYmIEVYUEVSSU1FTlRBTAorICAgICAgIGJvb2wgIk5GQyBMTENQIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgZGVmYXVsdCBuCisgICAgICAgaGVscAorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIGEga2VybmVsIE5GQyBMTENQCisJIGltcGxlbWVudGF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25ldC9uZmMvbGxjcC9jb21tYW5kcy5jIGIvbmV0L25mYy9sbGNwL2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxZjJlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZmMvbGxjcC9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImxsY3A6ICVzOiAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKworI2luY2x1ZGUgPG5ldC9uZmMvbmZjLmg+CisKKyNpbmNsdWRlICIuLi9uZmMuaCIKKyNpbmNsdWRlICJsbGNwLmgiCisKK3N0YXRpYyB1OCBsbGNwX3Rsdl9sZW5ndGhbTExDUF9UTFZfTUFYXSA9IHsKKwkwLAorCTEsIC8qIFZFUlNJT04gKi8KKwkyLCAvKiBNSVVYICovCisJMiwgLyogV0tTICovCisJMSwgLyogTFRPICovCisJMSwgLyogUlcgKi8KKwkwLCAvKiBTTiAqLworCTEsIC8qIE9QVCAqLworCTAsIC8qIFNEUkVRICovCisJMiwgLyogU0RSRVMgKi8KKworfTsKKworc3RhdGljIHU4IGxsY3BfdGx2OCh1OCAqdGx2LCB1OCB0eXBlKQoreworCWlmICh0bHZbMF0gIT0gdHlwZSB8fCB0bHZbMV0gIT0gbGxjcF90bHZfbGVuZ3RoW3RsdlswXV0pCisJCXJldHVybiAwOworCisJcmV0dXJuIHRsdlsyXTsKK30KKworc3RhdGljIHU4IGxsY3BfdGx2MTYodTggKnRsdiwgdTggdHlwZSkKK3sKKwlpZiAodGx2WzBdICE9IHR5cGUgfHwgdGx2WzFdICE9IGxsY3BfdGx2X2xlbmd0aFt0bHZbMF1dKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBiZTE2X3RvX2NwdSgqKChfX2JlMTYgKikodGx2ICsgMikpKTsKK30KKworCitzdGF0aWMgdTggbGxjcF90bHZfdmVyc2lvbih1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9WRVJTSU9OKTsKK30KKworc3RhdGljIHUxNiBsbGNwX3Rsdl9taXV4KHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2MTYodGx2LCBMTENQX1RMVl9NSVVYKSAmIDB4N2Y7Cit9CisKK3N0YXRpYyB1MTYgbGxjcF90bHZfd2tzKHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2MTYodGx2LCBMTENQX1RMVl9XS1MpOworfQorCitzdGF0aWMgdTE2IGxsY3BfdGx2X2x0byh1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9MVE8pOworfQorCitzdGF0aWMgdTggbGxjcF90bHZfb3B0KHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2OCh0bHYsIExMQ1BfVExWX09QVCk7Cit9CisKK3N0YXRpYyB1OCBsbGNwX3Rsdl9ydyh1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9SVykgJiAweGY7Cit9CisKK3U4ICpuZmNfbGxjcF9idWlsZF90bHYodTggdHlwZSwgdTggKnZhbHVlLCB1OCB2YWx1ZV9sZW5ndGgsIHU4ICp0bHZfbGVuZ3RoKQoreworCXU4ICp0bHYsIGxlbmd0aDsKKworCXByX2RlYnVnKCJ0eXBlICVkXG4iLCB0eXBlKTsKKworCWlmICh0eXBlID49IExMQ1BfVExWX01BWCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW5ndGggPSBsbGNwX3Rsdl9sZW5ndGhbdHlwZV07CisJaWYgKGxlbmd0aCA9PSAwICYmIHZhbHVlX2xlbmd0aCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCWxlbmd0aCA9IHZhbHVlX2xlbmd0aDsKKworCSp0bHZfbGVuZ3RoID0gMiArIGxlbmd0aDsKKwl0bHYgPSBremFsbG9jKDIgKyBsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICh0bHYgPT0gTlVMTCkKKwkJcmV0dXJuIHRsdjsKKworCXRsdlswXSA9IHR5cGU7CisJdGx2WzFdID0gbGVuZ3RoOworCW1lbWNweSh0bHYgKyAyLCB2YWx1ZSwgbGVuZ3RoKTsKKworCXJldHVybiB0bHY7Cit9CisKK2ludCBuZmNfbGxjcF9wYXJzZV90bHYoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCXU4ICp0bHZfYXJyYXksIHUxNiB0bHZfYXJyYXlfbGVuKQoreworCXU4ICp0bHYgPSB0bHZfYXJyYXksIHR5cGUsIGxlbmd0aCwgb2Zmc2V0ID0gMDsKKworCXByX2RlYnVnKCJUTFYgYXJyYXkgbGVuZ3RoICVkXG4iLCB0bHZfYXJyYXlfbGVuKTsKKworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlIChvZmZzZXQgPCB0bHZfYXJyYXlfbGVuKSB7CisJCXR5cGUgPSB0bHZbMF07CisJCWxlbmd0aCA9IHRsdlsxXTsKKworCQlwcl9kZWJ1ZygidHlwZSAweCV4IGxlbmd0aCAlZFxuIiwgdHlwZSwgbGVuZ3RoKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBMTENQX1RMVl9WRVJTSU9OOgorCQkJbG9jYWwtPnJlbW90ZV92ZXJzaW9uID0gbGxjcF90bHZfdmVyc2lvbih0bHYpOworCQkJYnJlYWs7CisJCWNhc2UgTExDUF9UTFZfTUlVWDoKKwkJCWxvY2FsLT5yZW1vdGVfbWl1ID0gbGxjcF90bHZfbWl1eCh0bHYpICsgMTI4OworCQkJYnJlYWs7CisJCWNhc2UgTExDUF9UTFZfV0tTOgorCQkJbG9jYWwtPnJlbW90ZV93a3MgPSBsbGNwX3Rsdl93a3ModGx2KTsKKwkJCWJyZWFrOworCQljYXNlIExMQ1BfVExWX0xUTzoKKwkJCWxvY2FsLT5yZW1vdGVfbHRvID0gbGxjcF90bHZfbHRvKHRsdikgKiAxMDsKKwkJCWJyZWFrOworCQljYXNlIExMQ1BfVExWX09QVDoKKwkJCWxvY2FsLT5yZW1vdGVfb3B0ID0gbGxjcF90bHZfb3B0KHRsdik7CisJCQlicmVhazsKKwkJY2FzZSBMTENQX1RMVl9SVzoKKwkJCWxvY2FsLT5yZW1vdGVfcncgPSBsbGNwX3Rsdl9ydyh0bHYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIkludmFsaWQgZ3QgdGx2IHZhbHVlIDB4JXhcbiIsIHR5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlvZmZzZXQgKz0gbGVuZ3RoICsgMjsKKwkJdGx2ICs9IGxlbmd0aCArIDI7CisJfQorCisJcHJfZGVidWcoInZlcnNpb24gMHgleCBtaXUgJWQgbHRvICVkIG9wdCAweCV4IHdrcyAweCV4IHJ3ICVkXG4iLAorCQlsb2NhbC0+cmVtb3RlX3ZlcnNpb24sIGxvY2FsLT5yZW1vdGVfbWl1LAorCQlsb2NhbC0+cmVtb3RlX2x0bywgbG9jYWwtPnJlbW90ZV9vcHQsCisJCWxvY2FsLT5yZW1vdGVfd2tzLCBsb2NhbC0+cmVtb3RlX3J3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWRkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqcGR1LAorCQkJCQl1OCBkc2FwLCB1OCBzc2FwLCB1OCBwdHlwZSkKK3sKKwl1OCBoZWFkZXJbMl07CisKKwlwcl9kZWJ1ZygicHR5cGUgMHgleCBkc2FwIDB4JXggc3NhcCAweCV4XG4iLCBwdHlwZSwgZHNhcCwgc3NhcCk7CisKKwloZWFkZXJbMF0gPSAodTgpKChkc2FwIDw8IDIpIHwgKHB0eXBlID4+IDIpKTsKKwloZWFkZXJbMV0gPSAodTgpKChwdHlwZSA8PCA2KSB8IHNzYXApOworCisJcHJfZGVidWcoImhlYWRlciAweCV4IDB4JXhcbiIsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKKworCW1lbWNweShza2JfcHV0KHBkdSwgTExDUF9IRUFERVJfU0laRSksIGhlYWRlciwgTExDUF9IRUFERVJfU0laRSk7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWRkX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqcGR1LCB1OCAqdGx2LCB1OCB0bHZfbGVuZ3RoKQoreworCS8qIFhYWCBBZGQgYW4gc2tiIGxlbmd0aCBjaGVjayAqLworCisJaWYgKHRsdiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweShza2JfcHV0KHBkdSwgdGx2X2xlbmd0aCksIHRsdiwgdGx2X2xlbmd0aCk7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWxsb2NhdGVfcGR1KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrLAorCQkJCQkJCXU4IGNtZCwgdTE2IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJaWYgKHNvY2stPnNzYXAgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2IgPSBuZmNfYWxsb2Nfc2VuZF9za2Ioc29jay0+ZGV2LCAmc29jay0+c2ssIE1TR19ET05UV0FJVCwKKwkJCQkJc2l6ZSArIExMQ1BfSEVBREVSX1NJWkUsICZlcnIpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBQRFVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2IgPSBsbGNwX2FkZF9oZWFkZXIoc2tiLCBzb2NrLT5kc2FwLCBzb2NrLT5zc2FwLCBjbWQpOworCisJcmV0dXJuIHNrYjsKK30KKworaW50IG5mY19sbGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJdTE2IHNpemUgPSAwOworCisJcHJfZGVidWcoIlNlbmRpbmcgRElTQ1xuIik7CisKKwlsb2NhbCA9IHNvY2stPmxvY2FsOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IHNvY2stPmRldjsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc2l6ZSArPSBMTENQX0hFQURFUl9TSVpFOworCXNpemUgKz0gZGV2LT50eF9oZWFkcm9vbSArIGRldi0+dHhfdGFpbHJvb20gKyBORkNfSEVBREVSX1NJWkU7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT50eF9oZWFkcm9vbSArIE5GQ19IRUFERVJfU0laRSk7CisKKwlza2IgPSBsbGNwX2FkZF9oZWFkZXIoc2tiLCBzb2NrLT5zc2FwLCBzb2NrLT5kc2FwLCBMTENQX1BEVV9ESVNDKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+dHhfcXVldWUsIHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NlbmRfc3ltbShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwl1MTYgc2l6ZSA9IDA7CisKKwlwcl9kZWJ1ZygiU2VuZGluZyBTWU1NXG4iKTsKKworCWxvY2FsID0gbmZjX2xsY3BfZmluZF9sb2NhbChkZXYpOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNpemUgKz0gTExDUF9IRUFERVJfU0laRTsKKwlzaXplICs9IGRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+dHhfaGVhZHJvb20gKyBORkNfSEVBREVSX1NJWkUpOworCisJc2tiID0gbGxjcF9hZGRfaGVhZGVyKHNrYiwgMCwgMCwgTExDUF9QRFVfU1lNTSk7CisKKwlyZXR1cm4gbmZjX2RhdGFfZXhjaGFuZ2UoZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwgc2tiLAorCQkJCQluZmNfbGxjcF9yZWN2LCBsb2NhbCk7Cit9CisKK2ludCBuZmNfbGxjcF9zZW5kX2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICpzZXJ2aWNlX25hbWVfdGx2ID0gTlVMTCwgc2VydmljZV9uYW1lX3Rsdl9sZW5ndGg7CisJaW50IGVycjsKKwl1MTYgc2l6ZSA9IDA7CisKKwlwcl9kZWJ1ZygiU2VuZGluZyBDT05ORUNUXG4iKTsKKworCWxvY2FsID0gc29jay0+bG9jYWw7CisJaWYgKGxvY2FsID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisJCXNlcnZpY2VfbmFtZV90bHYgPSBuZmNfbGxjcF9idWlsZF90bHYoTExDUF9UTFZfU04sCisJCQkJCXNvY2stPnNlcnZpY2VfbmFtZSwKKwkJCQkJc29jay0+c2VydmljZV9uYW1lX2xlbiwKKwkJCQkJJnNlcnZpY2VfbmFtZV90bHZfbGVuZ3RoKTsKKwkJc2l6ZSArPSBzZXJ2aWNlX25hbWVfdGx2X2xlbmd0aDsKKwl9CisKKwlwcl9kZWJ1ZygiU0tCIHNpemUgJWQgU04gbGVuZ3RoICV6dVxuIiwgc2l6ZSwgc29jay0+c2VydmljZV9uYW1lX2xlbik7CisKKwlza2IgPSBsbGNwX2FsbG9jYXRlX3BkdShzb2NrLCBMTENQX1BEVV9DT05ORUNULCBzaXplKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl90bHY7CisJfQorCisJaWYgKHNlcnZpY2VfbmFtZV90bHYgIT0gTlVMTCkKKwkJc2tiID0gbGxjcF9hZGRfdGx2KHNrYiwgc2VydmljZV9uYW1lX3RsdiwKKwkJCQkJc2VydmljZV9uYW1lX3Rsdl9sZW5ndGgpOworCisJc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT50eF9xdWV1ZSwgc2tiKTsKKworCXJldHVybiAwOworCitlcnJvcl90bHY6CisJcHJfZXJyKCJlcnJvciAlZFxuIiwgZXJyKTsKKworCWtmcmVlKHNlcnZpY2VfbmFtZV90bHYpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG5mY19sbGNwX3NlbmRfY2Moc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJcHJfZGVidWcoIlNlbmRpbmcgQ0NcbiIpOworCisJbG9jYWwgPSBzb2NrLT5sb2NhbDsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlza2IgPSBsbGNwX2FsbG9jYXRlX3BkdShzb2NrLCBMTENQX1BEVV9DQywgMCk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+dHhfcXVldWUsIHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NlbmRfZG0oc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwgdTggc3NhcCwgdTggZHNhcCwgdTggcmVhc29uKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwl1MTYgc2l6ZSA9IDE7IC8qIFJlYXNvbiBjb2RlICovCisKKwlwcl9kZWJ1ZygiU2VuZGluZyBETSByZWFzb24gMHgleFxuIiwgcmVhc29uKTsKKworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGxvY2FsLT5kZXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNpemUgKz0gTExDUF9IRUFERVJfU0laRTsKKwlzaXplICs9IGRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+dHhfaGVhZHJvb20gKyBORkNfSEVBREVSX1NJWkUpOworCisJc2tiID0gbGxjcF9hZGRfaGVhZGVyKHNrYiwgc3NhcCwgZHNhcCwgTExDUF9QRFVfRE0pOworCisJbWVtY3B5KHNrYl9wdXQoc2tiLCAxKSwgJnJlYXNvbiwgMSk7CisKKwlza2JfcXVldWVfaGVhZCgmbG9jYWwtPnR4X3F1ZXVlLCBza2IpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBuZmNfbGxjcF9zZW5kX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCisJcHJfZGVidWcoIlNlbmQgRElTQ1xuIik7CisKKwlsb2NhbCA9IHNvY2stPmxvY2FsOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNrYiA9IGxsY3BfYWxsb2NhdGVfcGR1KHNvY2ssIExMQ1BfUERVX0RJU0MsIDApOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcXVldWVfaGVhZCgmbG9jYWwtPnR4X3F1ZXVlLCBza2IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3AvbGxjcC5jIGIvbmV0L25mYy9sbGNwL2xsY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc1NmIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25mYy9sbGNwL2xsY3AuYwpAQCAtMCwwICsxLDk3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJsbGNwOiAlczogIiBmbXQsIF9fZnVuY19fCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorCisjaW5jbHVkZSAiLi4vbmZjLmgiCisjaW5jbHVkZSAibGxjcC5oIgorCitzdGF0aWMgdTggbGxjcF9tYWdpY1szXSA9IHsweDQ2LCAweDY2LCAweDZkfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbGxjcF9kZXZpY2VzOworCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9zb2NrZXRfcmVsZWFzZShzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpwYXJlbnQsICpzLCAqbjsKKwlzdHJ1Y3Qgc29jayAqc2ssICpwYXJlbnRfc2s7CisJaW50IGk7CisKKworCW11dGV4X2xvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTExDUF9NQVhfU0FQOyBpKyspIHsKKwkJcGFyZW50ID0gbG9jYWwtPnNvY2tldHNbaV07CisJCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlbGVhc2UgYWxsIGNoaWxkIHNvY2tldHMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG4sICZwYXJlbnQtPmxpc3QsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZzLT5saXN0KTsKKwkJCXNrID0gJnMtPnNrOworCisJCQlsb2NrX3NvY2soc2spOworCisJCQlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKQorCQkJCW5mY19wdXRfZGV2aWNlKHMtPmRldik7CisKKwkJCXNrLT5za19zdGF0ZSA9IExMQ1BfQ0xPU0VEOworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJfQorCisJCXBhcmVudF9zayA9ICZwYXJlbnQtPnNrOworCisJCWxvY2tfc29jayhwYXJlbnRfc2spOworCisJCWlmIChwYXJlbnRfc2stPnNrX3N0YXRlID09IExMQ1BfTElTVEVOKSB7CisJCQlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbHNrLCAqbjsKKwkJCXN0cnVjdCBzb2NrICphY2NlcHRfc2s7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2ssIG4sICZwYXJlbnQtPmFjY2VwdF9xdWV1ZSwKKwkJCQkJCQkJYWNjZXB0X3F1ZXVlKSB7CisJCQkJYWNjZXB0X3NrID0gJmxzay0+c2s7CisJCQkJbG9ja19zb2NrKGFjY2VwdF9zayk7CisKKwkJCQluZmNfbGxjcF9hY2NlcHRfdW5saW5rKGFjY2VwdF9zayk7CisKKwkJCQlhY2NlcHRfc2stPnNrX3N0YXRlID0gTExDUF9DTE9TRUQ7CisJCQkJc29ja19zZXRfZmxhZyhhY2NlcHRfc2ssIFNPQ0tfREVBRCk7CisKKwkJCQlyZWxlYXNlX3NvY2soYWNjZXB0X3NrKTsKKworCQkJCXNvY2tfb3JwaGFuKGFjY2VwdF9zayk7CisJCQl9CisJCX0KKworCQlpZiAocGFyZW50X3NrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCkKKwkJCW5mY19wdXRfZGV2aWNlKHBhcmVudC0+ZGV2KTsKKworCQlwYXJlbnRfc2stPnNrX3N0YXRlID0gTExDUF9DTE9TRUQ7CisJCXNvY2tfc2V0X2ZsYWcocGFyZW50X3NrLCBTT0NLX0RFQUQpOworCisJCXJlbGVhc2Vfc29jayhwYXJlbnRfc2spOworCX0KKworCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3BfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZmNfbGxjcF9sb2NhbCwKKwkJCQkJCQl0aW1lb3V0X3dvcmspOworCisJbmZjX2RlcF9saW5rX2Rvd24obG9jYWwtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3N5bW1fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSAoc3RydWN0IG5mY19sbGNwX2xvY2FsICopIGRhdGE7CisKKwlwcl9lcnIoIlNZTU0gdGltZW91dFxuIik7CisKKwlxdWV1ZV93b3JrKGxvY2FsLT50aW1lb3V0X3dxLCAmbG9jYWwtPnRpbWVvdXRfd29yayk7Cit9CisKK3N0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbmZjX2xsY3BfZmluZF9sb2NhbChzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2FsLCBuLCAmbGxjcF9kZXZpY2VzLCBsaXN0KQorCQlpZiAobG9jYWwtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gbG9jYWw7CisKKwlwcl9kZWJ1ZygiTm8gZGV2aWNlIGZvdW5kXG4iKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqd2tzW10gPSB7CisJTlVMTCwKKwlOVUxMLCAvKiBTRFAgKi8KKwkidXJuOm5mYzpzbjppcCIsCisJInVybjpuZmM6c246b2JleCIsCisJInVybjpuZmM6c246c25lcCIsCit9OworCitzdGF0aWMgaW50IG5mY19sbGNwX3drc19zYXAoY2hhciAqc2VydmljZV9uYW1lLCBzaXplX3Qgc2VydmljZV9uYW1lX2xlbikKK3sKKwlpbnQgc2FwLCBudW1fd2tzOworCisJcHJfZGVidWcoIiVzXG4iLCBzZXJ2aWNlX25hbWUpOworCisJaWYgKHNlcnZpY2VfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW51bV93a3MgPSBBUlJBWV9TSVpFKHdrcyk7CisKKwlmb3IgKHNhcCA9IDAgOyBzYXAgPCBudW1fd2tzOyBzYXArKykgeworCQlpZiAod2tzW3NhcF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJuY21wKHdrc1tzYXBdLCBzZXJ2aWNlX25hbWUsIHNlcnZpY2VfbmFtZV9sZW4pID09IDApCisJCQlyZXR1cm4gc2FwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCit1OCBuZmNfbGxjcF9nZXRfc2RwX3NzYXAoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaykKK3sKKwltdXRleF9sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSAhPSBOVUxMICYmIHNvY2stPnNlcnZpY2VfbmFtZV9sZW4gPiAwKSB7CisJCWludCBzc2FwID0gbmZjX2xsY3Bfd2tzX3NhcChzb2NrLT5zZXJ2aWNlX25hbWUsCisJCQkJCQlzb2NrLT5zZXJ2aWNlX25hbWVfbGVuKTsKKworCQlpZiAoc3NhcCA+IDApIHsKKwkJCXByX2RlYnVnKCJXS1MgJWRcbiIsIHNzYXApOworCisJCQkvKiBUaGlzIGlzIGEgV0tTLCBsZXQncyBjaGVjayBpZiBpdCdzIGZyZWUgKi8KKwkJCWlmIChsb2NhbC0+bG9jYWxfd2tzICYgQklUKHNzYXApKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJCQkJcmV0dXJuIExMQ1BfU0FQX01BWDsKKwkJCX0KKworCQkJc2V0X2JpdChCSVQoc3NhcCksICZsb2NhbC0+bG9jYWxfd2tzKTsKKwkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCQkJcmV0dXJuIHNzYXA7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBhIHdlbGwga25vd24gc2VydmljZSwKKwkJICogd2Ugc2hvdWxkIHRyeSB0byBmaW5kIGEgbG9jYWwgU0RQIGZyZWUgc3BvdAorCQkgKi8KKwkJc3NhcCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxvY2FsLT5sb2NhbF9zZHAsIExMQ1BfU0RQX05VTV9TQVApOworCQlpZiAoc3NhcCA9PSBMTENQX1NEUF9OVU1fU0FQKSB7CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwkJCXJldHVybiBMTENQX1NBUF9NQVg7CisJCX0KKworCQlwcl9kZWJ1ZygiU0RQIHNzYXAgJWRcbiIsIExMQ1BfV0tTX05VTV9TQVAgKyBzc2FwKTsKKworCQlzZXRfYml0KEJJVChzc2FwKSwgJmxvY2FsLT5sb2NhbF9zZHApOworCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwkJcmV0dXJuIExMQ1BfV0tTX05VTV9TQVAgKyBzc2FwOworCisJfSBlbHNlIGlmIChzb2NrLT5zc2FwICE9IDApIHsKKwkJaWYgKHNvY2stPnNzYXAgPCBMTENQX1dLU19OVU1fU0FQKSB7CisJCQlpZiAoIShsb2NhbC0+bG9jYWxfd2tzICYgQklUKHNvY2stPnNzYXApKSkgeworCQkJCXNldF9iaXQoQklUKHNvY2stPnNzYXApLCAmbG9jYWwtPmxvY2FsX3drcyk7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJCQkJcmV0dXJuIHNvY2stPnNzYXA7CisJCQl9CisKKwkJfSBlbHNlIGlmIChzb2NrLT5zc2FwIDwgTExDUF9TRFBfTlVNX1NBUCkgeworCQkJaWYgKCEobG9jYWwtPmxvY2FsX3NkcCAmCisJCQkJQklUKHNvY2stPnNzYXAgLSBMTENQX1dLU19OVU1fU0FQKSkpIHsKKwkJCQlzZXRfYml0KEJJVChzb2NrLT5zc2FwIC0gTExDUF9XS1NfTlVNX1NBUCksCisJCQkJCQkJJmxvY2FsLT5sb2NhbF9zZHApOworCQkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCQkJCXJldHVybiBzb2NrLT5zc2FwOworCQkJfQorCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJcmV0dXJuIExMQ1BfU0FQX01BWDsKK30KKwordTggbmZjX2xsY3BfZ2V0X2xvY2FsX3NzYXAoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCkKK3sKKwl1OCBsb2NhbF9zc2FwOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCWxvY2FsX3NzYXAgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZsb2NhbC0+bG9jYWxfc2FwLCBMTENQX0xPQ0FMX05VTV9TQVApOworCWlmIChsb2NhbF9zc2FwID09IExMQ1BfTE9DQUxfTlVNX1NBUCkgeworCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisJCXJldHVybiBMTENQX1NBUF9NQVg7CisJfQorCisJc2V0X2JpdChCSVQobG9jYWxfc3NhcCksICZsb2NhbC0+bG9jYWxfc2FwKTsKKworCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCXJldHVybiBsb2NhbF9zc2FwICsgTExDUF9MT0NBTF9TQVBfT0ZGU0VUOworfQorCit2b2lkIG5mY19sbGNwX3B1dF9zc2FwKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsIHU4IHNzYXApCit7CisJdTggbG9jYWxfc3NhcDsKKwl1bnNpZ25lZCBsb25nICpzZHA7CisKKwlpZiAoc3NhcCA8IExMQ1BfV0tTX05VTV9TQVApIHsKKwkJbG9jYWxfc3NhcCA9IHNzYXA7CisJCXNkcCA9ICZsb2NhbC0+bG9jYWxfd2tzOworCX0gZWxzZSBpZiAoc3NhcCA8IExMQ1BfTE9DQUxfTlVNX1NBUCkgeworCQlsb2NhbF9zc2FwID0gc3NhcCAtIExMQ1BfV0tTX05VTV9TQVA7CisJCXNkcCA9ICZsb2NhbC0+bG9jYWxfc2RwOworCX0gZWxzZSBpZiAoc3NhcCA8IExMQ1BfTUFYX1NBUCkgeworCQlsb2NhbF9zc2FwID0gc3NhcCAtIExMQ1BfTE9DQUxfTlVNX1NBUDsKKwkJc2RwID0gJmxvY2FsLT5sb2NhbF9zYXA7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwljbGVhcl9iaXQoMSA8PCBsb2NhbF9zc2FwLCBzZHApOworCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworfQorCit1OCAqbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2VuZXJhbF9ieXRlc19sZW4pCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKworCWxvY2FsID0gbmZjX2xsY3BfZmluZF9sb2NhbChkZXYpOworCWlmIChsb2NhbCA9PSBOVUxMKSB7CisJCSpnZW5lcmFsX2J5dGVzX2xlbiA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCSpnZW5lcmFsX2J5dGVzX2xlbiA9IGxvY2FsLT5nYl9sZW47CisKKwlyZXR1cm4gbG9jYWwtPmdiOworfQorCitzdGF0aWMgaW50IG5mY19sbGNwX2J1aWxkX2diKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwpCit7CisJdTggKmdiX2N1ciwgKnZlcnNpb25fdGx2LCB2ZXJzaW9uLCB2ZXJzaW9uX2xlbmd0aDsKKwl1OCAqbHRvX3RsdiwgbHRvLCBsdG9fbGVuZ3RoOworCXU4ICp3a3NfdGx2LCB3a3NfbGVuZ3RoOworCXU4IGdiX2xlbiA9IDA7CisKKwl2ZXJzaW9uID0gTExDUF9WRVJTSU9OXzExOworCXZlcnNpb25fdGx2ID0gbmZjX2xsY3BfYnVpbGRfdGx2KExMQ1BfVExWX1ZFUlNJT04sICZ2ZXJzaW9uLAorCQkJCQkJCTEsICZ2ZXJzaW9uX2xlbmd0aCk7CisJZ2JfbGVuICs9IHZlcnNpb25fbGVuZ3RoOworCisJLyogMTUwMCBtcyAqLworCWx0byA9IDE1MDsKKwlsdG9fdGx2ID0gbmZjX2xsY3BfYnVpbGRfdGx2KExMQ1BfVExWX1ZFUlNJT04sICZsdG8sIDEsICZsdG9fbGVuZ3RoKTsKKwlnYl9sZW4gKz0gbHRvX2xlbmd0aDsKKworCXByX2RlYnVnKCJMb2NhbCB3a3MgMHglbHhcbiIsIGxvY2FsLT5sb2NhbF93a3MpOworCXdrc190bHYgPSBuZmNfbGxjcF9idWlsZF90bHYoTExDUF9UTFZfV0tTLCAodTggKikmbG9jYWwtPmxvY2FsX3drcywgMiwKKwkJCQkJCQkJJndrc19sZW5ndGgpOworCWdiX2xlbiArPSB3a3NfbGVuZ3RoOworCisJZ2JfbGVuICs9IEFSUkFZX1NJWkUobGxjcF9tYWdpYyk7CisKKwlpZiAoZ2JfbGVuID4gTkZDX01BWF9HVF9MRU4pIHsKKwkJa2ZyZWUodmVyc2lvbl90bHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnYl9jdXIgPSBsb2NhbC0+Z2I7CisKKwltZW1jcHkoZ2JfY3VyLCBsbGNwX21hZ2ljLCBBUlJBWV9TSVpFKGxsY3BfbWFnaWMpKTsKKwlnYl9jdXIgKz0gQVJSQVlfU0laRShsbGNwX21hZ2ljKTsKKworCW1lbWNweShnYl9jdXIsIHZlcnNpb25fdGx2LCB2ZXJzaW9uX2xlbmd0aCk7CisJZ2JfY3VyICs9IHZlcnNpb25fbGVuZ3RoOworCisJbWVtY3B5KGdiX2N1ciwgbHRvX3RsdiwgbHRvX2xlbmd0aCk7CisJZ2JfY3VyICs9IGx0b19sZW5ndGg7CisKKwltZW1jcHkoZ2JfY3VyLCB3a3NfdGx2LCB3a3NfbGVuZ3RoKTsKKwlnYl9jdXIgKz0gd2tzX2xlbmd0aDsKKworCWtmcmVlKHZlcnNpb25fdGx2KTsKKwlrZnJlZShsdG9fdGx2KTsKKworCWxvY2FsLT5nYl9sZW4gPSBnYl9sZW47CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NldF9yZW1vdGVfZ2Ioc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmdiLCB1OCBnYl9sZW4pCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKworCWlmIChsb2NhbCA9PSBOVUxMKSB7CisJCXByX2VycigiTm8gTExDUCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1zZXQobG9jYWwtPnJlbW90ZV9nYiwgMCwgTkZDX01BWF9HVF9MRU4pOworCW1lbWNweShsb2NhbC0+cmVtb3RlX2diLCBnYiwgZ2JfbGVuKTsKKwlsb2NhbC0+cmVtb3RlX2diX2xlbiA9IGdiX2xlbjsKKworCWlmIChsb2NhbC0+cmVtb3RlX2diID09IE5VTEwgfHwKKwkJCWxvY2FsLT5yZW1vdGVfZ2JfbGVuID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG1lbWNtcChsb2NhbC0+cmVtb3RlX2diLCBsbGNwX21hZ2ljLCAzKSkgeworCQlwcl9lcnIoIk1BQyBkb2VzIG5vdCBzdXBwb3J0IExMQ1BcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gbmZjX2xsY3BfcGFyc2VfdGx2KGxvY2FsLAorCQkJJmxvY2FsLT5yZW1vdGVfZ2JbM10sIGxvY2FsLT5yZW1vdGVfZ2JfbGVuIC0gMyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5mY19sbGNwX2xvY2FsLAorCQkJCQkJCXR4X3dvcmspOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnR4X3F1ZXVlKTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJcHJfZGVidWcoIlNlbmRpbmcgcGVuZGluZyBza2JcbiIpOworCQluZmNfZGF0YV9leGNoYW5nZShsb2NhbC0+ZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwKKwkJCQkJc2tiLCBuZmNfbGxjcF9yZWN2LCBsb2NhbCk7CisJfSBlbHNlIHsKKwkJbmZjX2xsY3Bfc2VuZF9zeW1tKGxvY2FsLT5kZXYpOworCX0KKworCW1vZF90aW1lcigmbG9jYWwtPmxpbmtfdGltZXIsCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhsb2NhbC0+cmVtb3RlX2x0bykpOworfQorCitzdGF0aWMgdTggbmZjX2xsY3BfZHNhcChzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiAocGR1LT5kYXRhWzBdICYgMHhmYykgPj4gMjsKK30KKworc3RhdGljIHU4IG5mY19sbGNwX3B0eXBlKHN0cnVjdCBza19idWZmICpwZHUpCit7CisJcmV0dXJuICgocGR1LT5kYXRhWzBdICYgMHgwMykgPDwgMikgfCAoKHBkdS0+ZGF0YVsxXSAmIDB4YzApID4+IDYpOworfQorCitzdGF0aWMgdTggbmZjX2xsY3Bfc3NhcChzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiBwZHUtPmRhdGFbMV0gJiAweDNmOworfQorCitzdGF0aWMgdTggbmZjX2xsY3BfbnMoc3RydWN0IHNrX2J1ZmYgKnBkdSkKK3sKKwlyZXR1cm4gcGR1LT5kYXRhWzJdID4+IDQ7Cit9CisKK3N0YXRpYyB1OCBuZmNfbGxjcF9ucihzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiBwZHUtPmRhdGFbMl0gJiAweGY7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3NldF9ucm5zKHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXBkdS0+ZGF0YVsyXSA9IChzb2NrLT5zZW5kX24gPDwgNCkgfCAoKHNvY2stPnJlY3ZfbiAtIDEpICUgMTYpOworCXNvY2stPnNlbmRfbiA9IChzb2NrLT5zZW5kX24gKyAxKSAlIDE2OworCXNvY2stPnJlY3ZfYWNrX24gPSAoc29jay0+cmVjdl9uIC0gMSkgJSAxNjsKK30KKworc3RhdGljIHN0cnVjdCBuZmNfbGxjcF9zb2NrICpuZmNfbGxjcF9zb2NrX2dldChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCQkJdTggc3NhcCwgdTggZHNhcCkKK3sKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaywgKmxsY3Bfc29jaywgKm47CisKKwlpZiAoc3NhcCA9PSAwICYmIGRzYXAgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCXNvY2sgPSBsb2NhbC0+c29ja2V0c1tzc2FwXTsKKwlpZiAoc29jayA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJfZGVidWcoInJvb3QgZHNhcCAlZCAoJWQpXG4iLCBzb2NrLT5kc2FwLCBkc2FwKTsKKworCWlmIChzb2NrLT5kc2FwID09IGRzYXApIHsKKwkJc29ja19ob2xkKCZzb2NrLT5zayk7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJcmV0dXJuIHNvY2s7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxsY3Bfc29jaywgbiwgJnNvY2stPmxpc3QsIGxpc3QpIHsKKwkJcHJfZGVidWcoImxsY3Bfc29jayAlcCBzayAlcCBkc2FwICVkXG4iLCBsbGNwX3NvY2ssCisJCQkJJmxsY3Bfc29jay0+c2ssIGxsY3Bfc29jay0+ZHNhcCk7CisJCWlmIChsbGNwX3NvY2stPmRzYXAgPT0gZHNhcCkgeworCQkJc29ja19ob2xkKCZsbGNwX3NvY2stPnNrKTsKKwkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJCXJldHVybiBsbGNwX3NvY2s7CisJCX0KKwl9CisKKwlwcl9lcnIoIkNvdWxkIG5vdCBmaW5kIHNvY2tldCBmb3IgJWQgJWRcbiIsIHNzYXAsIGRzYXApOworCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3NvY2tfcHV0KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKQoreworCXNvY2tfcHV0KCZzb2NrLT5zayk7Cit9CisKK3N0YXRpYyB1OCAqbmZjX2xsY3BfY29ubmVjdF9zbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgKnNuX2xlbikKK3sKKwl1OCAqdGx2ID0gJnNrYi0+ZGF0YVsyXSwgdHlwZSwgbGVuZ3RoOworCXNpemVfdCB0bHZfYXJyYXlfbGVuID0gc2tiLT5sZW4gLSBMTENQX0hFQURFUl9TSVpFLCBvZmZzZXQgPSAwOworCisJd2hpbGUgKG9mZnNldCA8IHRsdl9hcnJheV9sZW4pIHsKKwkJdHlwZSA9IHRsdlswXTsKKwkJbGVuZ3RoID0gdGx2WzFdOworCisJCXByX2RlYnVnKCJ0eXBlIDB4JXggbGVuZ3RoICVkXG4iLCB0eXBlLCBsZW5ndGgpOworCisJCWlmICh0eXBlID09IExMQ1BfVExWX1NOKSB7CisJCQkqc25fbGVuID0gbGVuZ3RoOworCQkJcmV0dXJuICZ0bHZbMl07CisJCX0KKworCQlvZmZzZXQgKz0gbGVuZ3RoICsgMjsKKwkJdGx2ICs9IGxlbmd0aCArIDI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3JlY3ZfY29ubmVjdChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKm5ld19zaywgKnBhcmVudDsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaywgKm5ld19zb2NrOworCXU4IGRzYXAsIHNzYXAsIGJvdW5kX3NhcCwgcmVhc29uOworCisJZHNhcCA9IG5mY19sbGNwX2RzYXAoc2tiKTsKKwlzc2FwID0gbmZjX2xsY3Bfc3NhcChza2IpOworCisJcHJfZGVidWcoIiVkICVkXG4iLCBkc2FwLCBzc2FwKTsKKworCW5mY19sbGNwX3BhcnNlX3Rsdihsb2NhbCwgJnNrYi0+ZGF0YVtMTENQX0hFQURFUl9TSVpFXSwKKwkJCQlza2ItPmxlbiAtIExMQ1BfSEVBREVSX1NJWkUpOworCisJaWYgKGRzYXAgIT0gTExDUF9TQVBfU0RQKSB7CisJCWJvdW5kX3NhcCA9IGRzYXA7CisKKwkJbXV0ZXhfbG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJc29jayA9IGxvY2FsLT5zb2NrZXRzW2RzYXBdOworCQlpZiAoc29jayA9PSBOVUxMKSB7CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisJCQlyZWFzb24gPSBMTENQX0RNX05PQk9VTkQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlzb2NrX2hvbGQoJnNvY2stPnNrKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJCWxvY2tfc29jaygmc29jay0+c2spOworCisJCWlmIChzb2NrLT5kc2FwID09IExMQ1BfU0FQX1NEUCAmJgorCQkJCXNvY2stPnNrLnNrX3N0YXRlID09IExMQ1BfTElTVEVOKQorCQkJZ290byBlbnF1ZXVlOworCX0gZWxzZSB7CisJCXU4ICpzbjsKKwkJc2l6ZV90IHNuX2xlbjsKKworCQlzbiA9IG5mY19sbGNwX2Nvbm5lY3Rfc24oc2tiLCAmc25fbGVuKTsKKwkJaWYgKHNuID09IE5VTEwpIHsKKwkJCXJlYXNvbiA9IExMQ1BfRE1fTk9CT1VORDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXByX2RlYnVnKCJTZXJ2aWNlIG5hbWUgbGVuZ3RoICV6dVxuIiwgc25fbGVuKTsKKworCQltdXRleF9sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCQlmb3IgKGJvdW5kX3NhcCA9IDA7IGJvdW5kX3NhcCA8IExMQ1BfTE9DQUxfU0FQX09GRlNFVDsKKwkJCQkJCQkJYm91bmRfc2FwKyspIHsKKwkJCXNvY2sgPSBsb2NhbC0+c29ja2V0c1tib3VuZF9zYXBdOworCQkJaWYgKHNvY2sgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSA9PSBOVUxMIHx8CisJCQkJc29jay0+c2VydmljZV9uYW1lX2xlbiA9PSAwKQorCQkJCQljb250aW51ZTsKKworCQkJaWYgKHNvY2stPnNlcnZpY2VfbmFtZV9sZW4gIT0gc25fbGVuKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc29jay0+ZHNhcCA9PSBMTENQX1NBUF9TRFAgJiYKKwkJCQkJc29jay0+c2suc2tfc3RhdGUgPT0gTExDUF9MSVNURU4gJiYKKwkJCQkJIW1lbWNtcChzbiwgc29jay0+c2VydmljZV9uYW1lLCBzbl9sZW4pKSB7CisJCQkJcHJfZGVidWcoIkZvdW5kIHNlcnZpY2UgbmFtZSBhdCBTQVAgJWRcbiIsCisJCQkJCQkJCWJvdW5kX3NhcCk7CisJCQkJc29ja19ob2xkKCZzb2NrLT5zayk7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJCQkJbG9ja19zb2NrKCZzb2NrLT5zayk7CisKKwkJCQlnb3RvIGVucXVldWU7CisJCQl9CisJCX0KKworCX0KKworCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKworCXJlYXNvbiA9IExMQ1BfRE1fTk9CT1VORDsKKwlnb3RvIGZhaWw7CisKK2VucXVldWU6CisJcGFyZW50ID0gJnNvY2stPnNrOworCisJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChwYXJlbnQpKSB7CisJCXJlYXNvbiA9IExMQ1BfRE1fUkVKOworCQlyZWxlYXNlX3NvY2soJnNvY2stPnNrKTsKKwkJc29ja19wdXQoJnNvY2stPnNrKTsKKwkJZ290byBmYWlsOworCX0KKworCW5ld19zayA9IG5mY19sbGNwX3NvY2tfYWxsb2MoTlVMTCwgcGFyZW50LT5za190eXBlLAorCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJaWYgKG5ld19zayA9PSBOVUxMKSB7CisJCXJlYXNvbiA9IExMQ1BfRE1fUkVKOworCQlyZWxlYXNlX3NvY2soJnNvY2stPnNrKTsKKwkJc29ja19wdXQoJnNvY2stPnNrKTsKKwkJZ290byBmYWlsOworCX0KKworCW5ld19zb2NrID0gbmZjX2xsY3Bfc29jayhuZXdfc2spOworCW5ld19zb2NrLT5kZXYgPSBsb2NhbC0+ZGV2OworCW5ld19zb2NrLT5sb2NhbCA9IGxvY2FsOworCW5ld19zb2NrLT5uZmNfcHJvdG9jb2wgPSBzb2NrLT5uZmNfcHJvdG9jb2w7CisJbmV3X3NvY2stPnNzYXAgPSBib3VuZF9zYXA7CisJbmV3X3NvY2stPmRzYXAgPSBzc2FwOworCW5ld19zb2NrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlwcl9kZWJ1ZygibmV3IHNvY2sgJXAgc2sgJXBcbiIsIG5ld19zb2NrLCAmbmV3X3NvY2stPnNrKTsKKworCWxpc3RfYWRkX3RhaWwoJm5ld19zb2NrLT5saXN0LCAmc29jay0+bGlzdCk7CisKKwluZmNfbGxjcF9hY2NlcHRfZW5xdWV1ZSgmc29jay0+c2ssIG5ld19zayk7CisKKwluZmNfZ2V0X2RldmljZShsb2NhbC0+ZGV2LT5pZHgpOworCisJbmV3X3NrLT5za19zdGF0ZSA9IExMQ1BfQ09OTkVDVEVEOworCisJLyogV2FrZSB0aGUgbGlzdGVuaW5nIHByb2Nlc3NlcyAqLworCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCisJLyogU2VuZCBDQyAqLworCW5mY19sbGNwX3NlbmRfY2MobmV3X3NvY2spOworCisJcmVsZWFzZV9zb2NrKCZzb2NrLT5zayk7CisJc29ja19wdXQoJnNvY2stPnNrKTsKKworCXJldHVybjsKKworZmFpbDoKKwkvKiBTZW5kIERNICovCisJbmZjX2xsY3Bfc2VuZF9kbShsb2NhbCwgZHNhcCwgc3NhcCwgcmVhc29uKTsKKworCXJldHVybjsKKworfQorCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9yZWN2X2hkbGMoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCXU4IGRzYXAsIHNzYXAsIHB0eXBlLCBucywgbnI7CisKKwlwdHlwZSA9IG5mY19sbGNwX3B0eXBlKHNrYik7CisJZHNhcCA9IG5mY19sbGNwX2RzYXAoc2tiKTsKKwlzc2FwID0gbmZjX2xsY3Bfc3NhcChza2IpOworCW5zID0gbmZjX2xsY3BfbnMoc2tiKTsKKwluciA9IG5mY19sbGNwX25yKHNrYik7CisKKwlwcl9kZWJ1ZygiJWQgJWQgUiAlZCBTICVkXG4iLCBkc2FwLCBzc2FwLCBuciwgbnMpOworCisJbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29ja19nZXQobG9jYWwsIGRzYXAsIHNzYXApOworCWlmIChsbGNwX3NvY2sgPT0gTlVMTCkgeworCQluZmNfbGxjcF9zZW5kX2RtKGxvY2FsLCBkc2FwLCBzc2FwLCBMTENQX0RNX05PQ09OTik7CisJCXJldHVybjsKKwl9CisKKwlzayA9ICZsbGNwX3NvY2stPnNrOworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NMT1NFRCkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQluZmNfbGxjcF9zb2NrX3B1dChsbGNwX3NvY2spOworCX0KKworCWlmIChucyA9PSBsbGNwX3NvY2stPnJlY3ZfbikKKwkJbGxjcF9zb2NrLT5yZWN2X24gPSAobGxjcF9zb2NrLT5yZWN2X24gKyAxKSAlIDE2OworCWVsc2UKKwkJcHJfZXJyKCJSZWNlaXZlZCBvdXQgb2Ygc2VxdWVuY2UgSSBQRFVcbiIpOworCisJLyogUGFzcyB0aGUgcGF5bG9hZCB1cHN0cmVhbSAqLworCWlmIChwdHlwZSA9PSBMTENQX1BEVV9JKSB7CisJCXByX2RlYnVnKCJJIGZyYW1lLCBxdWV1ZWluZyBvbiAlcFxuIiwgJmxsY3Bfc29jay0+c2spOworCisJCXNrYl9wdWxsKHNrYiwgTExDUF9IRUFERVJfU0laRSArIExMQ1BfU0VRVUVOQ0VfU0laRSk7CisJCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2IoJmxsY3Bfc29jay0+c2ssIHNrYikpIHsKKwkJCXByX2VycigicmVjZWl2ZSBxdWV1ZSBpcyBmdWxsXG4iKTsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZsbGNwX3NvY2stPnR4X2JhY2tsb2dfcXVldWUsIHNrYik7CisJCX0KKwl9CisKKwkvKiBSZW1vdmUgc2ticyBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlICovCisJaWYgKGxsY3Bfc29jay0+c2VuZF9hY2tfbiAhPSBucikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqcywgKnRtcDsKKworCQlsbGNwX3NvY2stPnNlbmRfYWNrX24gPSBucjsKKworCQlza2JfcXVldWVfd2Fsa19zYWZlKCZsbGNwX3NvY2stPnR4X3BlbmRpbmdfcXVldWUsIHMsIHRtcCkKKwkJCWlmIChuZmNfbGxjcF9ucyhzKSA8PSBucikgeworCQkJCXNrYl91bmxpbmsocywgJmxsY3Bfc29jay0+dHhfcGVuZGluZ19xdWV1ZSk7CisJCQkJa2ZyZWVfc2tiKHMpOworCQkJfQorCX0KKworCS8qIFF1ZXVlIHNvbWUgSSBmcmFtZXMgZm9yIHRyYW5zbWlzc2lvbiAqLworCXdoaWxlIChsbGNwX3NvY2stPnJlbW90ZV9yZWFkeSAmJgorCQlza2JfcXVldWVfbGVuKCZsbGNwX3NvY2stPnR4X3BlbmRpbmdfcXVldWUpIDw9IGxvY2FsLT5yZW1vdGVfcncpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnBkdSwgKnBlbmRpbmdfcGR1OworCisJCXBkdSA9IHNrYl9kZXF1ZXVlKCZsbGNwX3NvY2stPnR4X3F1ZXVlKTsKKwkJaWYgKHBkdSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogVXBkYXRlIE4oUykvTihSKSAqLworCQluZmNfbGxjcF9zZXRfbnJucyhsbGNwX3NvY2ssIHBkdSk7CisKKwkJcGVuZGluZ19wZHUgPSBza2JfY2xvbmUocGR1LCBHRlBfS0VSTkVMKTsKKworCQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnR4X3F1ZXVlLCBwZHUpOworCQlza2JfcXVldWVfdGFpbCgmbGxjcF9zb2NrLT50eF9wZW5kaW5nX3F1ZXVlLCBwZW5kaW5nX3BkdSk7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKwluZmNfbGxjcF9zb2NrX3B1dChsbGNwX3NvY2spOworfQorCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9yZWN2X2Rpc2Moc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCXU4IGRzYXAsIHNzYXA7CisKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrX2dldChsb2NhbCwgZHNhcCwgc3NhcCk7CisJaWYgKGxsY3Bfc29jayA9PSBOVUxMKSB7CisJCW5mY19sbGNwX3NlbmRfZG0obG9jYWwsIGRzYXAsIHNzYXAsIExMQ1BfRE1fTk9DT05OKTsKKwkJcmV0dXJuOworCX0KKworCXNrID0gJmxsY3Bfc29jay0+c2s7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ0xPU0VEKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCW5mY19sbGNwX3NvY2tfcHV0KGxsY3Bfc29jayk7CisJfQorCisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKSB7CisJCW5mY19wdXRfZGV2aWNlKGxvY2FsLT5kZXYpOworCQlzay0+c2tfc3RhdGUgPSBMTENQX0NMT1NFRDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJfQorCisJbmZjX2xsY3Bfc2VuZF9kbShsb2NhbCwgZHNhcCwgc3NhcCwgTExDUF9ETV9ESVNDKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJbmZjX2xsY3Bfc29ja19wdXQobGxjcF9zb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3BfcmVjdl9jYyhzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jazsKKwl1OCBkc2FwLCBzc2FwOworCisKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrX2dldChsb2NhbCwgZHNhcCwgc3NhcCk7CisKKwlpZiAobGxjcF9zb2NrID09IE5VTEwpCisJCWxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2tfZ2V0KGxvY2FsLCBkc2FwLCBMTENQX1NBUF9TRFApOworCisJaWYgKGxsY3Bfc29jayA9PSBOVUxMKSB7CisJCXByX2VycigiSW52YWxpZCBDQ1xuIik7CisJCW5mY19sbGNwX3NlbmRfZG0obG9jYWwsIGRzYXAsIHNzYXAsIExMQ1BfRE1fTk9DT05OKTsKKworCQlyZXR1cm47CisJfQorCisJbGxjcF9zb2NrLT5kc2FwID0gc3NhcDsKKworCW5mY19sbGNwX3BhcnNlX3Rsdihsb2NhbCwgJnNrYi0+ZGF0YVtMTENQX0hFQURFUl9TSVpFXSwKKwkJCQlza2ItPmxlbiAtIExMQ1BfSEVBREVSX1NJWkUpOworCisJbmZjX2xsY3Bfc29ja19wdXQobGxjcF9zb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3Bfcnhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwsCisJCQkJCQkJCXJ4X3dvcmspOworCXU4IGRzYXAsIHNzYXAsIHB0eXBlOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBsb2NhbC0+cnhfcGVuZGluZzsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIk5vIHBlbmRpbmcgU0tCXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0eXBlID0gbmZjX2xsY3BfcHR5cGUoc2tiKTsKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlwcl9kZWJ1ZygicHR5cGUgMHgleCBkc2FwIDB4JXggc3NhcCAweCV4XG4iLCBwdHlwZSwgZHNhcCwgc3NhcCk7CisKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBMTENQX1BEVV9TWU1NOgorCQlwcl9kZWJ1ZygiU1lNTVxuIik7CisJCWJyZWFrOworCisJY2FzZSBMTENQX1BEVV9DT05ORUNUOgorCQlwcl9kZWJ1ZygiQ09OTkVDVFxuIik7CisJCW5mY19sbGNwX3JlY3ZfY29ubmVjdChsb2NhbCwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIExMQ1BfUERVX0RJU0M6CisJCXByX2RlYnVnKCJESVNDXG4iKTsKKwkJbmZjX2xsY3BfcmVjdl9kaXNjKGxvY2FsLCBza2IpOworCQlicmVhazsKKworCWNhc2UgTExDUF9QRFVfQ0M6CisJCXByX2RlYnVnKCJDQ1xuIik7CisJCW5mY19sbGNwX3JlY3ZfY2MobG9jYWwsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBMTENQX1BEVV9JOgorCWNhc2UgTExDUF9QRFVfUlI6CisJCXByX2RlYnVnKCJJIGZyYW1lXG4iKTsKKwkJbmZjX2xsY3BfcmVjdl9oZGxjKGxvY2FsLCBza2IpOworCQlicmVhazsKKworCX0KKworCXF1ZXVlX3dvcmsobG9jYWwtPnR4X3dxLCAmbG9jYWwtPnR4X3dvcmspOworCWtmcmVlX3NrYihsb2NhbC0+cnhfcGVuZGluZyk7CisJbG9jYWwtPnJ4X3BlbmRpbmcgPSBOVUxMOworCisJcmV0dXJuOworfQorCit2b2lkIG5mY19sbGNwX3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsID0gKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqKSBkYXRhOworCisJcHJfZGVidWcoIlJlY2VpdmVkIGFuIExMQ1AgUERVXG4iKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoImVyciAlZCIsIGVycik7CisJCXJldHVybjsKKwl9CisKKwlsb2NhbC0+cnhfcGVuZGluZyA9IHNrYl9nZXQoc2tiKTsKKwlkZWxfdGltZXIoJmxvY2FsLT5saW5rX3RpbWVyKTsKKwlxdWV1ZV93b3JrKGxvY2FsLT5yeF93cSwgJmxvY2FsLT5yeF93b3JrKTsKKworCXJldHVybjsKK30KKwordm9pZCBuZmNfbGxjcF9tYWNfaXNfZG93bihzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisKKwlsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQ2xvc2UgYW5kIHB1cmdlIGFsbCBleGlzdGluZyBzb2NrZXRzICovCisJbmZjX2xsY3Bfc29ja2V0X3JlbGVhc2UobG9jYWwpOworfQorCit2b2lkIG5mY19sbGNwX21hY19pc191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCisJcHJfZGVidWcoInJmIG1vZGUgJWRcbiIsIHJmX21vZGUpOworCisJbG9jYWwgPSBuZmNfbGxjcF9maW5kX2xvY2FsKGRldik7CisJaWYgKGxvY2FsID09IE5VTEwpCisJCXJldHVybjsKKworCWxvY2FsLT50YXJnZXRfaWR4ID0gdGFyZ2V0X2lkeDsKKwlsb2NhbC0+Y29tbV9tb2RlID0gY29tbV9tb2RlOworCWxvY2FsLT5yZl9tb2RlID0gcmZfbW9kZTsKKworCWlmIChyZl9tb2RlID09IE5GQ19SRl9JTklUSUFUT1IpIHsKKwkJcHJfZGVidWcoIlF1ZXVlaW5nIFR4IHdvcmtcbiIpOworCisJCXF1ZXVlX3dvcmsobG9jYWwtPnR4X3dxLCAmbG9jYWwtPnR4X3dvcmspOworCX0gZWxzZSB7CisJCW1vZF90aW1lcigmbG9jYWwtPmxpbmtfdGltZXIsCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhsb2NhbC0+cmVtb3RlX2x0bykpOworCX0KK30KKworaW50IG5mY19sbGNwX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqbmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbmRldi0+ZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgZXJyOworCisJbG9jYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsb2NhbC0+ZGV2ID0gbmRldjsKKwlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpc3QpOworCW11dGV4X2luaXQoJmxvY2FsLT5zZHBfbG9jayk7CisJbXV0ZXhfaW5pdCgmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwlpbml0X3RpbWVyKCZsb2NhbC0+bGlua190aW1lcik7CisJbG9jYWwtPmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBsb2NhbDsKKwlsb2NhbC0+bGlua190aW1lci5mdW5jdGlvbiA9IG5mY19sbGNwX3N5bW1fdGltZXI7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+dHhfcXVldWUpOworCUlOSVRfV09SSygmbG9jYWwtPnR4X3dvcmssIG5mY19sbGNwX3R4X3dvcmspOworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzX2xsY3BfdHhfd3EiLCBkZXZfbmFtZShkZXYpKTsKKwlsb2NhbC0+dHhfd3EgPSBhbGxvY193b3JrcXVldWUobmFtZSwKKwkJCVdRX05PTl9SRUVOVFJBTlQgfCBXUV9VTkJPVU5EIHwgV1FfTUVNX1JFQ0xBSU0sIDEpOworCWlmIChsb2NhbC0+dHhfd3EgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9sb2NhbDsKKwl9CisKKwlsb2NhbC0+cnhfcGVuZGluZyA9IE5VTEw7CisJSU5JVF9XT1JLKCZsb2NhbC0+cnhfd29yaywgbmZjX2xsY3Bfcnhfd29yayk7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfbGxjcF9yeF93cSIsIGRldl9uYW1lKGRldikpOworCWxvY2FsLT5yeF93cSA9IGFsbG9jX3dvcmtxdWV1ZShuYW1lLAorCQkJV1FfTk9OX1JFRU5UUkFOVCB8IFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSk7CisJaWYgKGxvY2FsLT5yeF93cSA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3R4X3dxOworCX0KKworCUlOSVRfV09SSygmbG9jYWwtPnRpbWVvdXRfd29yaywgbmZjX2xsY3BfdGltZW91dF93b3JrKTsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc19sbGNwX3RpbWVvdXRfd3EiLCBkZXZfbmFtZShkZXYpKTsKKwlsb2NhbC0+dGltZW91dF93cSA9IGFsbG9jX3dvcmtxdWV1ZShuYW1lLAorCQkJV1FfTk9OX1JFRU5UUkFOVCB8IFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSk7CisJaWYgKGxvY2FsLT50aW1lb3V0X3dxID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcnhfd3E7CisJfQorCisJbmZjX2xsY3BfYnVpbGRfZ2IobG9jYWwpOworCisJbG9jYWwtPnJlbW90ZV9taXUgPSBMTENQX0RFRkFVTFRfTUlVOworCWxvY2FsLT5yZW1vdGVfbHRvID0gTExDUF9ERUZBVUxUX0xUTzsKKwlsb2NhbC0+cmVtb3RlX3J3ID0gTExDUF9ERUZBVUxUX1JXOworCisJbGlzdF9hZGQoJmxsY3BfZGV2aWNlcywgJmxvY2FsLT5saXN0KTsKKworCXJldHVybiAwOworCitlcnJfcnhfd3E6CisJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPnJ4X3dxKTsKKworZXJyX3R4X3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGxvY2FsLT50eF93cSk7CisKK2Vycl9sb2NhbDoKKwlrZnJlZShsb2NhbCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSBuZmNfbGxjcF9maW5kX2xvY2FsKGRldik7CisKKwlpZiAobG9jYWwgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiTm8gc3VjaCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9kZWwoJmxvY2FsLT5saXN0KTsKKwluZmNfbGxjcF9zb2NrZXRfcmVsZWFzZShsb2NhbCk7CisJZGVsX3RpbWVyX3N5bmMoJmxvY2FsLT5saW5rX3RpbWVyKTsKKwlza2JfcXVldWVfcHVyZ2UoJmxvY2FsLT50eF9xdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPnR4X3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShsb2NhbC0+cnhfd3EpOworCWtmcmVlKGxvY2FsLT5yeF9wZW5kaW5nKTsKKwlrZnJlZShsb2NhbCk7Cit9CisKK2ludCBfX2luaXQgbmZjX2xsY3BfaW5pdCh2b2lkKQoreworCUlOSVRfTElTVF9IRUFEKCZsbGNwX2RldmljZXMpOworCisJcmV0dXJuIG5mY19sbGNwX3NvY2tfaW5pdCgpOworfQorCit2b2lkIG5mY19sbGNwX2V4aXQodm9pZCkKK3sKKwluZmNfbGxjcF9zb2NrX2V4aXQoKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZmMvbGxjcC9sbGNwLmggYi9uZXQvbmZjL2xsY3AvbGxjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDJlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL2xsY3AvbGxjcC5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKK2VudW0gbGxjcF9zdGF0ZSB7CisJTExDUF9DT05ORUNURUQgPSAxLCAvKiB3YWl0X2Zvcl9wYWNrZXQoKSB3YW50cyB0aGF0ICovCisJTExDUF9DTE9TRUQsCisJTExDUF9CT1VORCwKKwlMTENQX0xJU1RFTiwKK307CisKKyNkZWZpbmUgTExDUF9ERUZBVUxUX0xUTyAxMDAKKyNkZWZpbmUgTExDUF9ERUZBVUxUX1JXICAxCisjZGVmaW5lIExMQ1BfREVGQVVMVF9NSVUgMTI4CisKKyNkZWZpbmUgTExDUF9XS1NfTlVNX1NBUCAgIDE2CisjZGVmaW5lIExMQ1BfU0RQX05VTV9TQVAgICAxNgorI2RlZmluZSBMTENQX0xPQ0FMX05VTV9TQVAgMzIKKyNkZWZpbmUgTExDUF9MT0NBTF9TQVBfT0ZGU0VUIChMTENQX1dLU19OVU1fU0FQICsgTExDUF9TRFBfTlVNX1NBUCkKKyNkZWZpbmUgTExDUF9NQVhfU0FQIChMTENQX1dLU19OVU1fU0FQICsgTExDUF9TRFBfTlVNX1NBUCArIExMQ1BfTE9DQUxfTlVNX1NBUCkKKworc3RydWN0IG5mY19sbGNwX3NvY2s7CisKK3N0cnVjdCBuZmNfbGxjcF9sb2NhbCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisKKwlzdHJ1Y3QgbXV0ZXggc2RwX2xvY2s7CisJc3RydWN0IG11dGV4IHNvY2tldF9sb2NrOworCisJc3RydWN0IHRpbWVyX2xpc3QgbGlua190aW1lcjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp0eF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIHR4X3dvcms7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKnJ4X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdAkgcnhfd29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfcGVuZGluZzsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqdGltZW91dF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIHRpbWVvdXRfd29yazsKKworCXUzMiB0YXJnZXRfaWR4OworCXU4IHJmX21vZGU7CisJdTggY29tbV9tb2RlOworCXVuc2lnbmVkIGxvbmcgbG9jYWxfd2tzOyAgICAgIC8qIFdlbGwga25vd24gc2VydmljZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxvY2FsX3NkcDsgICAgICAvKiBMb2NhbCBzZXJ2aWNlcyAgKi8KKwl1bnNpZ25lZCBsb25nIGxvY2FsX3NhcDsgLyogTG9jYWwgU0FQcywgbm90IGF2YWlsYWJsZSBmb3IgZGlzY292ZXJ5ICovCisKKwkvKiBsb2NhbCAqLworCXU4IGdiW05GQ19NQVhfR1RfTEVOXTsKKwl1OCBnYl9sZW47CisKKwkvKiByZW1vdGUgKi8KKwl1OCByZW1vdGVfZ2JbTkZDX01BWF9HVF9MRU5dOworCXU4IHJlbW90ZV9nYl9sZW47CisKKwl1OCAgcmVtb3RlX3ZlcnNpb247CisJdTE2IHJlbW90ZV9taXU7CisJdTE2IHJlbW90ZV9sdG87CisJdTggIHJlbW90ZV9vcHQ7CisJdTE2IHJlbW90ZV93a3M7CisJdTggIHJlbW90ZV9ydzsKKworCS8qIHNvY2tldHMgYXJyYXkgKi8KKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29ja2V0c1tMTENQX01BWF9TQVBdOworfTsKKworc3RydWN0IG5mY19sbGNwX3NvY2sgeworCXN0cnVjdCBzb2NrIHNrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJdTMyIHRhcmdldF9pZHg7CisJdTMyIG5mY19wcm90b2NvbDsKKworCXU4IHNzYXA7CisJdTggZHNhcDsKKwljaGFyICpzZXJ2aWNlX25hbWU7CisJc2l6ZV90IHNlcnZpY2VfbmFtZV9sZW47CisKKwkvKiBMaW5rIHZhcmlhYmxlcyAqLworCXU4IHNlbmRfbjsKKwl1OCBzZW5kX2Fja19uOworCXU4IHJlY3ZfbjsKKwl1OCByZWN2X2Fja19uOworCisJLyogSXMgdGhlIHJlbW90ZSBwZWVyIHJlYWR5IHRvIHJlY2VpdmUgKi8KKwl1OCByZW1vdGVfcmVhZHk7CisKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOworCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcGVuZGluZ19xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X2JhY2tsb2dfcXVldWU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjY2VwdF9xdWV1ZTsKKwlzdHJ1Y3Qgc29jayAqcGFyZW50OworfTsKKworI2RlZmluZSBuZmNfbGxjcF9zb2NrKHNrKSAoKHN0cnVjdCBuZmNfbGxjcF9zb2NrICopIChzaykpCisjZGVmaW5lIG5mY19sbGNwX2RldihzaykgIChuZmNfbGxjcF9zb2NrKChzaykpLT5kZXYpCisKKyNkZWZpbmUgTExDUF9IRUFERVJfU0laRSAgIDIKKyNkZWZpbmUgTExDUF9TRVFVRU5DRV9TSVpFIDEKKworLyogTExDUCB2ZXJzaW9uczogMS4xIGlzIDEuMCBwbHVzIFNEUCAqLworI2RlZmluZSBMTENQX1ZFUlNJT05fMTAgMHgxMAorI2RlZmluZSBMTENQX1ZFUlNJT05fMTEgMHgxMQorCisvKiBMTENQIFBEVSB0eXBlcyAqLworI2RlZmluZSBMTENQX1BEVV9TWU1NICAgICAweDAKKyNkZWZpbmUgTExDUF9QRFVfUEFYICAgICAgMHgxCisjZGVmaW5lIExMQ1BfUERVX0FHRiAgICAgIDB4MgorI2RlZmluZSBMTENQX1BEVV9VSSAgICAgICAweDMKKyNkZWZpbmUgTExDUF9QRFVfQ09OTkVDVCAgMHg0CisjZGVmaW5lIExMQ1BfUERVX0RJU0MgICAgIDB4NQorI2RlZmluZSBMTENQX1BEVV9DQyAgICAgICAweDYKKyNkZWZpbmUgTExDUF9QRFVfRE0gICAgICAgMHg3CisjZGVmaW5lIExMQ1BfUERVX0ZSTVIgICAgIDB4OAorI2RlZmluZSBMTENQX1BEVV9TTkwgICAgICAweDkKKyNkZWZpbmUgTExDUF9QRFVfSSAgICAgICAgMHhjCisjZGVmaW5lIExMQ1BfUERVX1JSICAgICAgIDB4ZAorI2RlZmluZSBMTENQX1BEVV9STlIgICAgICAweGUKKworLyogUGFyYW1ldGVycyBUTFYgdHlwZXMgKi8KKyNkZWZpbmUgTExDUF9UTFZfVkVSU0lPTiAweDEKKyNkZWZpbmUgTExDUF9UTFZfTUlVWCAgICAweDIKKyNkZWZpbmUgTExDUF9UTFZfV0tTICAgICAweDMKKyNkZWZpbmUgTExDUF9UTFZfTFRPICAgICAweDQKKyNkZWZpbmUgTExDUF9UTFZfUlcgICAgICAweDUKKyNkZWZpbmUgTExDUF9UTFZfU04gICAgICAweDYKKyNkZWZpbmUgTExDUF9UTFZfT1BUICAgICAweDcKKyNkZWZpbmUgTExDUF9UTFZfU0RSRVEgICAweDgKKyNkZWZpbmUgTExDUF9UTFZfU0RSRVMgICAweDkKKyNkZWZpbmUgTExDUF9UTFZfTUFYICAgICAweGEKKworLyogV2VsbCBrbm93biBMTENQIFNBUCAqLworI2RlZmluZSBMTENQX1NBUF9TRFAgICAweDEKKyNkZWZpbmUgTExDUF9TQVBfSVAgICAgMHgyCisjZGVmaW5lIExMQ1BfU0FQX09CRVggIDB4MworI2RlZmluZSBMTENQX1NBUF9TTkVQICAweDQKKyNkZWZpbmUgTExDUF9TQVBfTUFYICAgMHhmZgorCisvKiBEaXNjb25uZWN0aW9uIHJlYXNvbiBjb2RlICovCisjZGVmaW5lIExMQ1BfRE1fRElTQyAgICAweDAwCisjZGVmaW5lIExMQ1BfRE1fTk9DT05OICAweDAxCisjZGVmaW5lIExMQ1BfRE1fTk9CT1VORCAweDAyCisjZGVmaW5lIExMQ1BfRE1fUkVKICAgICAweDAzCisKKworc3RydWN0IG5mY19sbGNwX2xvY2FsICpuZmNfbGxjcF9maW5kX2xvY2FsKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwordTggbmZjX2xsY3BfZ2V0X3NkcF9zc2FwKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOwordTggbmZjX2xsY3BfZ2V0X2xvY2FsX3NzYXAoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCk7Cit2b2lkIG5mY19sbGNwX3B1dF9zc2FwKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsIHU4IHNzYXApOworCisvKiBTb2NrIEFQSSAqLworc3RydWN0IHNvY2sgKm5mY19sbGNwX3NvY2tfYWxsb2Moc3RydWN0IHNvY2tldCAqc29jaywgaW50IHR5cGUsIGdmcF90IGdmcCk7Cit2b2lkIG5mY19sbGNwX3NvY2tfZnJlZShzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jayk7Cit2b2lkIG5mY19sbGNwX2FjY2VwdF91bmxpbmsoc3RydWN0IHNvY2sgKnNrKTsKK3ZvaWQgbmZjX2xsY3BfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrKTsKK3N0cnVjdCBzb2NrICpuZmNfbGxjcF9hY2NlcHRfZGVxdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2spOworCisvKiBUTFYgQVBJICovCitpbnQgbmZjX2xsY3BfcGFyc2VfdGx2KHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsCisJCQl1OCAqdGx2X2FycmF5LCB1MTYgdGx2X2FycmF5X2xlbik7CisKKy8qIENvbW1hbmRzIEFQSSAqLwordm9pZCBuZmNfbGxjcF9yZWN2KHZvaWQgKmRhdGEsIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIpOwordTggKm5mY19sbGNwX2J1aWxkX3Rsdih1OCB0eXBlLCB1OCAqdmFsdWUsIHU4IHZhbHVlX2xlbmd0aCwgdTggKnRsdl9sZW5ndGgpOwordm9pZCBuZmNfbGxjcF9yZWN2KHZvaWQgKmRhdGEsIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIpOworaW50IG5mY19sbGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOworaW50IG5mY19sbGNwX3NlbmRfc3ltbShzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKK2ludCBuZmNfbGxjcF9zZW5kX2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOworaW50IG5mY19sbGNwX3NlbmRfY2Moc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOworaW50IG5mY19sbGNwX3NlbmRfZG0oc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwgdTggc3NhcCwgdTggZHNhcCwgdTggcmVhc29uKTsKK2ludCBuZmNfbGxjcF9zZW5kX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOworCisvKiBTb2NrZXQgQVBJICovCitpbnQgX19pbml0IG5mY19sbGNwX3NvY2tfaW5pdCh2b2lkKTsKK3ZvaWQgbmZjX2xsY3Bfc29ja19leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9sbGNwL3NvY2suYyBiL25ldC9uZmMvbGxjcC9zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczOGNjZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZmMvbGxjcC9zb2NrLmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAibGxjcDogJXM6ICIgZm10LCBfX2Z1bmNfXworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorCisjaW5jbHVkZSAiLi4vbmZjLmgiCisjaW5jbHVkZSAibGxjcC5oIgorCitzdGF0aWMgc3RydWN0IHByb3RvIGxsY3Bfc29ja19wcm90byA9IHsKKwkubmFtZSAgICAgPSAiTkZDX0xMQ1AiLAorCS5vd25lciAgICA9IFRISVNfTU9EVUxFLAorCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZjX2xsY3Bfc29jayksCit9OworCitzdGF0aWMgaW50IGxsY3Bfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmZjX2xsY3AgbGxjcF9hZGRyOworCWludCBsZW4sIHJldCA9IDA7CisKKwlwcl9kZWJ1Zygic2sgJXAgYWRkciAlcCBmYW1pbHkgJWRcbiIsIHNrLCBhZGRyLCBhZGRyLT5zYV9mYW1pbHkpOworCisJaWYgKCFhZGRyIHx8IGFkZHItPnNhX2ZhbWlseSAhPSBBRl9ORkMpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZsbGNwX2FkZHIsIDAsIHNpemVvZihsbGNwX2FkZHIpKTsKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemVvZihsbGNwX2FkZHIpLCBhbGVuKTsKKwltZW1jcHkoJmxsY3BfYWRkciwgYWRkciwgbGVuKTsKKworCS8qIFRoaXMgaXMgZ29pbmcgdG8gYmUgYSBsaXN0ZW5pbmcgc29ja2V0LCBkc2FwIG11c3QgYmUgMCAqLworCWlmIChsbGNwX2FkZHIuZHNhcCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IExMQ1BfQ0xPU0VEKSB7CisJCXJldCA9IC1FQkFERkQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2ID0gbmZjX2dldF9kZXZpY2UobGxjcF9hZGRyLmRldl9pZHgpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWxvY2FsID0gbmZjX2xsY3BfZmluZF9sb2NhbChkZXYpOworCWlmIChsb2NhbCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcHV0X2RldjsKKwl9CisKKwlsbGNwX3NvY2stPmRldiA9IGRldjsKKwlsbGNwX3NvY2stPmxvY2FsID0gbG9jYWw7CisJbGxjcF9zb2NrLT5uZmNfcHJvdG9jb2wgPSBsbGNwX2FkZHIubmZjX3Byb3RvY29sOworCWxsY3Bfc29jay0+c2VydmljZV9uYW1lX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCWxsY3BfYWRkci5zZXJ2aWNlX25hbWVfbGVuLCBORkNfTExDUF9NQVhfU0VSVklDRV9OQU1FKTsKKwlsbGNwX3NvY2stPnNlcnZpY2VfbmFtZSA9IGttZW1kdXAobGxjcF9hZGRyLnNlcnZpY2VfbmFtZSwKKwkJCQlsbGNwX3NvY2stPnNlcnZpY2VfbmFtZV9sZW4sIEdGUF9LRVJORUwpOworCisJbGxjcF9zb2NrLT5zc2FwID0gbmZjX2xsY3BfZ2V0X3NkcF9zc2FwKGxvY2FsLCBsbGNwX3NvY2spOworCWlmIChsbGNwX3NvY2stPnNzYXAgPT0gTExDUF9NQVhfU0FQKQorCQlnb3RvIHB1dF9kZXY7CisKKwlsb2NhbC0+c29ja2V0c1tsbGNwX3NvY2stPnNzYXBdID0gbGxjcF9zb2NrOworCisJcHJfZGVidWcoIlNvY2tldCBib3VuZCB0byBTQVAgJWRcbiIsIGxsY3Bfc29jay0+c3NhcCk7CisKKwlzay0+c2tfc3RhdGUgPSBMTENQX0JPVU5EOworCitwdXRfZGV2OgorCW5mY19wdXRfZGV2aWNlKGRldik7CisKK2Vycm9yOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoInNrICVwIGJhY2tsb2cgJWRcbiIsIHNrLCBiYWNrbG9nKTsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQgJiYgc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCXx8IHNrLT5za19zdGF0ZSAhPSBMTENQX0JPVU5EKSB7CisJCXJldCA9IC1FQkFERkQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJc2stPnNrX2Fja19iYWNrbG9nID0gMDsKKworCXByX2RlYnVnKCJTb2NrZXQgbGlzdGVuaW5nXG4iKTsKKwlzay0+c2tfc3RhdGUgPSBMTENQX0xJU1RFTjsKKworZXJyb3I6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbmZjX2xsY3BfYWNjZXB0X3VubGluayhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCisJcHJfZGVidWcoInN0YXRlICVkXG4iLCBzay0+c2tfc3RhdGUpOworCisJbGlzdF9kZWxfaW5pdCgmbGxjcF9zb2NrLT5hY2NlcHRfcXVldWUpOworCXNrX2FjY2VwdHFfcmVtb3ZlZChsbGNwX3NvY2stPnBhcmVudCk7CisJbGxjcF9zb2NrLT5wYXJlbnQgPSBOVUxMOworCisJc29ja19wdXQoc2spOworfQorCit2b2lkIG5mY19sbGNwX2FjY2VwdF9lbnF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29ja19wYXJlbnQgPSBuZmNfbGxjcF9zb2NrKHBhcmVudCk7CisKKwkvKiBMb2NrIHdpbGwgYmUgZnJlZSBmcm9tIHVubGluayAqLworCXNvY2tfaG9sZChzayk7CisKKwlsaXN0X2FkZF90YWlsKCZsbGNwX3NvY2stPmFjY2VwdF9xdWV1ZSwKKwkJCSZsbGNwX3NvY2tfcGFyZW50LT5hY2NlcHRfcXVldWUpOworCWxsY3Bfc29jay0+cGFyZW50ID0gcGFyZW50OworCXNrX2FjY2VwdHFfYWRkZWQocGFyZW50KTsKK30KKworc3RydWN0IHNvY2sgKm5mY19sbGNwX2FjY2VwdF9kZXF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsCisJCQkJCXN0cnVjdCBzb2NrZXQgKm5ld3NvY2spCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxzaywgKm4sICpsbGNwX3BhcmVudDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlsbGNwX3BhcmVudCA9IG5mY19sbGNwX3NvY2socGFyZW50KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2ssIG4sICZsbGNwX3BhcmVudC0+YWNjZXB0X3F1ZXVlLAorCQkJCQkJCWFjY2VwdF9xdWV1ZSkgeworCQlzayA9ICZsc2stPnNrOworCQlsb2NrX3NvY2soc2spOworCisJCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DTE9TRUQpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQluZmNfbGxjcF9hY2NlcHRfdW5saW5rKHNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCB8fCAhbmV3c29jaykgeworCQkJbmZjX2xsY3BfYWNjZXB0X3VubGluayhzayk7CisJCQlpZiAobmV3c29jaykKKwkJCQlzb2NrX2dyYWZ0KHNrLCBuZXdzb2NrKTsKKworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKworCQkJcHJfZGVidWcoIlJldHVybmluZyBzayBzdGF0ZSAlZFxuIiwgc2stPnNrX3N0YXRlKTsKKworCQkJcmV0dXJuIHNrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssCisJCQkJCQkJCWludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5ld19zazsKKwlsb25nIHRpbWVvOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoInBhcmVudCAlcFxuIiwgc2spOworCisJbG9ja19zb2NrX25lc3RlZChzaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBMTENQX0xJU1RFTikgeworCQlyZXQgPSAtRUJBREZEOworCQlnb3RvIGVycm9yOworCX0KKworCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKTsKKworCS8qIFdhaXQgZm9yIGFuIGluY29taW5nIGNvbm5lY3Rpb24uICovCisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKHNrX3NsZWVwKHNrKSwgJndhaXQpOworCXdoaWxlICghKG5ld19zayA9IG5mY19sbGNwX2FjY2VwdF9kZXF1ZXVlKHNrLCBuZXdzb2NrKSkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlpZiAoIXRpbWVvKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29ja19uZXN0ZWQoc2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKHNrKSwgJndhaXQpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCW5ld3NvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOworCisJcHJfZGVidWcoIm5ldyBzb2NrZXQgJXBcbiIsIG5ld19zayk7CisKK2Vycm9yOgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxsY3Bfc29ja19nZXRuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgICAgaW50ICpsZW4sIGludCBwZWVyKQoreworCXN0cnVjdCBzb2NrYWRkcl9uZmNfbGxjcCAqbGxjcF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9uZmNfbGxjcCAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrKHNrKTsKKworCXByX2RlYnVnKCIlcFxuIiwgc2spOworCisJYWRkci0+c2FfZmFtaWx5ID0gQUZfTkZDOworCSpsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25mY19sbGNwKTsKKworCWxsY3BfYWRkci0+ZGV2X2lkeCA9IGxsY3Bfc29jay0+ZGV2LT5pZHg7CisJbGxjcF9hZGRyLT5kc2FwID0gbGxjcF9zb2NrLT5kc2FwOworCWxsY3BfYWRkci0+c3NhcCA9IGxsY3Bfc29jay0+c3NhcDsKKwlsbGNwX2FkZHItPnNlcnZpY2VfbmFtZV9sZW4gPSBsbGNwX3NvY2stPnNlcnZpY2VfbmFtZV9sZW47CisJbWVtY3B5KGxsY3BfYWRkci0+c2VydmljZV9uYW1lLCBsbGNwX3NvY2stPnNlcnZpY2VfbmFtZSwKKwkJCQkJbGxjcF9hZGRyLT5zZXJ2aWNlX25hbWVfbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsbGNwX2FjY2VwdF9wb2xsKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jaywgKm4sICpwYXJlbnRfc29jazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlwYXJlbnRfc29jayA9IG5mY19sbGNwX3NvY2socGFyZW50KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsbGNwX3NvY2ssIG4sICZwYXJlbnRfc29jay0+YWNjZXB0X3F1ZXVlLAorCQkJCQkJCQlhY2NlcHRfcXVldWUpIHsKKwkJc2sgPSAmbGxjcF9zb2NrLT5zazsKKworCQlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGxjcF9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCQkJcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwcl9kZWJ1ZygiJXBcbiIsIHNrKTsKKworCXNvY2tfcG9sbF93YWl0KGZpbGUsIHNrX3NsZWVwKHNrKSwgd2FpdCk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfTElTVEVOKQorCQlyZXR1cm4gbGxjcF9hY2NlcHRfcG9sbChzayk7CisKKwlpZiAoc2stPnNrX2VyciB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfZXJyb3JfcXVldWUpKQorCQltYXNrIHw9IFBPTExFUlI7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCQltYXNrIHw9IFBPTExJTjsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DTE9TRUQpCisJCW1hc2sgfD0gUE9MTEhVUDsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGxsY3Bfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCXByX2RlYnVnKCIlcFxuIiwgc2spOworCisJbG9jYWwgPSBsbGNwX3NvY2stPmxvY2FsOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisKKwlpZiAobGxjcF9zb2NrID09IGxvY2FsLT5zb2NrZXRzW2xsY3Bfc29jay0+c3NhcF0pIHsKKwkJbG9jYWwtPnNvY2tldHNbbGxjcF9zb2NrLT5zc2FwXSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc3RydWN0IG5mY19sbGNwX3NvY2sgKnBhcmVudCwgKnMsICpuOworCisJCXBhcmVudCA9IGxvY2FsLT5zb2NrZXRzW2xsY3Bfc29jay0+c3NhcF07CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG4sICZwYXJlbnQtPmxpc3QsIGxpc3QpCisJCQlpZiAobGxjcF9zb2NrID09IHMpIHsKKwkJCQlsaXN0X2RlbCgmcy0+bGlzdCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwl9CisKKwltdXRleF91bmxvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisKKwlsb2NrX3NvY2soc2spOworCisJLyogU2VuZCBhIERJU0MgKi8KKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKQorCQluZmNfbGxjcF9kaXNjb25uZWN0KGxsY3Bfc29jayk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfTElTVEVOKSB7CisJCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsc2ssICpuOworCQlzdHJ1Y3Qgc29jayAqYWNjZXB0X3NrOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2ssIG4sICZsbGNwX3NvY2stPmFjY2VwdF9xdWV1ZSwKKwkJCQkJCQkJYWNjZXB0X3F1ZXVlKSB7CisJCQlhY2NlcHRfc2sgPSAmbHNrLT5zazsKKwkJCWxvY2tfc29jayhhY2NlcHRfc2spOworCisJCQluZmNfbGxjcF9kaXNjb25uZWN0KGxzayk7CisJCQluZmNfbGxjcF9hY2NlcHRfdW5saW5rKGFjY2VwdF9zayk7CisKKwkJCXJlbGVhc2Vfc29jayhhY2NlcHRfc2spOworCisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCQkJc29ja19vcnBoYW4oYWNjZXB0X3NrKTsKKwkJCXNvY2tfcHV0KGFjY2VwdF9zayk7CisJCX0KKwl9CisKKwkvKiBGcmVlaW5nIHRoZSBTQVAgKi8KKwlpZiAoKHNrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRAorCQkJJiYgbGxjcF9zb2NrLT5zc2FwID4gTExDUF9MT0NBTF9TQVBfT0ZGU0VUKSB8fAorCSAgICBzay0+c2tfc3RhdGUgPT0gTExDUF9CT1VORCB8fAorCSAgICBzay0+c2tfc3RhdGUgPT0gTExDUF9MSVNURU4pCisJCW5mY19sbGNwX3B1dF9zc2FwKGxsY3Bfc29jay0+bG9jYWwsIGxsY3Bfc29jay0+c3NhcCk7CisKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKl9hZGRyLAorCQkJCQkJCWludCBsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisJc3RydWN0IHNvY2thZGRyX25mY19sbGNwICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9uZmNfbGxjcCAqKV9hZGRyOworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCJzb2NrICVwIHNrICVwIGZsYWdzIDB4JXhcbiIsIHNvY2ssIHNrLCBmbGFncyk7CisKKwlpZiAoIWFkZHIgfHwgbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9uZmMpIHx8CisJCQlhZGRyLT5zYV9mYW1pbHkgIT0gQUZfTkZDKSB7CisJCXByX2VycigiSW52YWxpZCBzb2NrZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRkci0+c2VydmljZV9uYW1lX2xlbiA9PSAwICYmIGFkZHItPmRzYXAgPT0gMCkgeworCQlwcl9lcnIoIk1pc3Npbmcgc2VydmljZSBuYW1lIG9yIGRzYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcl9kZWJ1ZygiYWRkciBkZXZfaWR4PSV1IHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXVcbiIsIGFkZHItPmRldl9pZHgsCisJCQkJCWFkZHItPnRhcmdldF9pZHgsIGFkZHItPm5mY19wcm90b2NvbCk7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCkgeworCQlyZXQgPSAtRUlTQ09OTjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYgPSBuZmNfZ2V0X2RldmljZShhZGRyLT5kZXZfaWR4KTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKwlpZiAobG9jYWwgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9kZXY7CisJfQorCisJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKKwlpZiAoZGV2LT5kZXBfbGlua191cCA9PSBmYWxzZSkgeworCQlyZXQgPSAtRU5PTElOSzsKKwkJZGV2aWNlX3VubG9jaygmZGV2LT5kZXYpOworCQlnb3RvIHB1dF9kZXY7CisJfQorCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKworCWlmIChsb2NhbC0+cmZfbW9kZSA9PSBORkNfUkZfSU5JVElBVE9SICYmCisJCQlhZGRyLT50YXJnZXRfaWR4ICE9IGxvY2FsLT50YXJnZXRfaWR4KSB7CisJCXJldCA9IC1FTk9MSU5LOworCQlnb3RvIHB1dF9kZXY7CisJfQorCisJbGxjcF9zb2NrLT5kZXYgPSBkZXY7CisJbGxjcF9zb2NrLT5sb2NhbCA9IGxvY2FsOworCWxsY3Bfc29jay0+c3NhcCA9IG5mY19sbGNwX2dldF9sb2NhbF9zc2FwKGxvY2FsKTsKKwlpZiAobGxjcF9zb2NrLT5zc2FwID09IExMQ1BfU0FQX01BWCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHB1dF9kZXY7CisJfQorCWlmIChhZGRyLT5zZXJ2aWNlX25hbWVfbGVuID09IDApCisJCWxsY3Bfc29jay0+ZHNhcCA9IGFkZHItPmRzYXA7CisJZWxzZQorCQlsbGNwX3NvY2stPmRzYXAgPSBMTENQX1NBUF9TRFA7CisJbGxjcF9zb2NrLT5uZmNfcHJvdG9jb2wgPSBhZGRyLT5uZmNfcHJvdG9jb2w7CisJbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWVfbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJYWRkci0+c2VydmljZV9uYW1lX2xlbiwgTkZDX0xMQ1BfTUFYX1NFUlZJQ0VfTkFNRSk7CisJbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWUgPSBrbWVtZHVwKGFkZHItPnNlcnZpY2VfbmFtZSwKKwkJCQkgbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWVfbGVuLCBHRlBfS0VSTkVMKTsKKworCWxvY2FsLT5zb2NrZXRzW2xsY3Bfc29jay0+c3NhcF0gPSBsbGNwX3NvY2s7CisKKwlyZXQgPSBuZmNfbGxjcF9zZW5kX2Nvbm5lY3QobGxjcF9zb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIHB1dF9kZXY7CisKKwlzay0+c2tfc3RhdGUgPSBMTENQX0NPTk5FQ1RFRDsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIDA7CisKK3B1dF9kZXY6CisJbmZjX3B1dF9kZXZpY2UoZGV2KTsKKworZXJyb3I6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxsY3Bfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl1bnNpZ25lZCBpbnQgY29waWVkLCBybGVuOworCXN0cnVjdCBza19idWZmICpza2IsICpjc2tiOworCWludCBlcnIgPSAwOworCisJcHJfZGVidWcoIiVwICV6dVxuIiwgc2ssIGxlbik7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NMT1NFRCAmJgorCQkJc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCWlmIChmbGFncyAmIChNU0dfT09CKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKTsKKwlpZiAoIXNrYikgeworCQlwcl9lcnIoIlJlY3YgZGF0YWdyYW0gZmFpbGVkIHN0YXRlICVkICVkICVkIiwKKwkJCQlzay0+c2tfc3RhdGUsIGVyciwgc29ja19lcnJvcihzaykpOworCisJCWlmIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gZXJyOworCX0KKworCXJsZW4gICA9IHNrYi0+bGVuOwkJLyogcmVhbCBsZW5ndGggb2Ygc2tiICovCisJY29waWVkID0gbWluX3QodW5zaWduZWQgaW50LCBybGVuLCBsZW4pOworCisJY3NrYiA9IHNrYjsKKwlpZiAobWVtY3B5X3RvaW92ZWMobXNnLT5tc2dfaW92LCBjc2tiLT5kYXRhLCBjb3BpZWQpKSB7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBNYXJrIHJlYWQgcGFydCBvZiBza2IgYXMgdXNlZCAqLworCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisKKwkJLyogU09DS19TVFJFQU06IHJlLXF1ZXVlIHNrYiBpZiBpdCBjb250YWlucyB1bnJlY2VpdmVkIGRhdGEgKi8KKwkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQlza2JfcHVsbChza2IsIGNvcGllZCk7CisJCQlpZiAoc2tiLT5sZW4pIHsKKwkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJLyogWFhYIFF1ZXVlIGJhY2tsb2dnZWQgc2ticyAqLworCitkb25lOgorCS8qIFNPQ0tfU0VRUEFDS0VUOiByZXR1cm4gcmVhbCBsZW5ndGggaWYgTVNHX1RSVU5DIGlzIHNldCAqLworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJiAoZmxhZ3MgJiBNU0dfVFJVTkMpKQorCQljb3BpZWQgPSBybGVuOworCisJcmV0dXJuIGNvcGllZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgbGxjcF9zb2NrX29wcyA9IHsKKwkuZmFtaWx5ICAgICAgICAgPSBQRl9ORkMsCisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmJpbmQgICAgICAgICAgID0gbGxjcF9zb2NrX2JpbmQsCisJLmNvbm5lY3QgICAgICAgID0gbGxjcF9zb2NrX2Nvbm5lY3QsCisJLnJlbGVhc2UgICAgICAgID0gbGxjcF9zb2NrX3JlbGVhc2UsCisJLnNvY2tldHBhaXIgICAgID0gc29ja19ub19zb2NrZXRwYWlyLAorCS5hY2NlcHQgICAgICAgICA9IGxsY3Bfc29ja19hY2NlcHQsCisJLmdldG5hbWUgICAgICAgID0gbGxjcF9zb2NrX2dldG5hbWUsCisJLnBvbGwgICAgICAgICAgID0gbGxjcF9zb2NrX3BvbGwsCisJLmlvY3RsICAgICAgICAgID0gc29ja19ub19pb2N0bCwKKwkubGlzdGVuICAgICAgICAgPSBsbGNwX3NvY2tfbGlzdGVuLAorCS5zaHV0ZG93biAgICAgICA9IHNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgICAgID0gc29ja19ub19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0ICAgICA9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuc2VuZG1zZyAgICAgICAgPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cgICAgICAgID0gbGxjcF9zb2NrX3JlY3Ztc2csCisJLm1tYXAgICAgICAgICAgID0gc29ja19ub19tbWFwLAorfTsKKworc3RhdGljIHZvaWQgbGxjcF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisKKwlwcl9kZWJ1ZygiJXBcbiIsIHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DT05ORUNURUQpCisJCW5mY19wdXRfZGV2aWNlKGxsY3Bfc29jay0+ZGV2KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJbmZjX2xsY3Bfc29ja19mcmVlKGxsY3Bfc29jayk7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQlwcl9lcnIoIkZyZWVpbmcgYWxpdmUgTkZDIExMQ1Agc29ja2V0ICVwXG4iLCBzayk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0cnVjdCBzb2NrICpuZmNfbGxjcF9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCB0eXBlLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2s7CisKKwlzayA9IHNrX2FsbG9jKCZpbml0X25ldCwgUEZfTkZDLCBnZnAsICZsbGNwX3NvY2tfcHJvdG8pOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc2stPnNrX3N0YXRlID0gTExDUF9DTE9TRUQ7CisJc2stPnNrX3Byb3RvY29sID0gTkZDX1NPQ0tQUk9UT19MTENQOworCXNrLT5za190eXBlID0gdHlwZTsKKwlzay0+c2tfZGVzdHJ1Y3QgPSBsbGNwX3NvY2tfZGVzdHJ1Y3Q7CisKKwlsbGNwX3NvY2stPnNzYXAgPSAwOworCWxsY3Bfc29jay0+ZHNhcCA9IExMQ1BfU0FQX1NEUDsKKwlsbGNwX3NvY2stPnNlbmRfbiA9IGxsY3Bfc29jay0+c2VuZF9hY2tfbiA9IDA7CisJbGxjcF9zb2NrLT5yZWN2X24gPSBsbGNwX3NvY2stPnJlY3ZfYWNrX24gPSAwOworCWxsY3Bfc29jay0+cmVtb3RlX3JlYWR5ID0gMTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsbGNwX3NvY2stPnR4X3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsbGNwX3NvY2stPnR4X3BlbmRpbmdfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxsY3Bfc29jay0+dHhfYmFja2xvZ19xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmxsY3Bfc29jay0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmxsY3Bfc29jay0+YWNjZXB0X3F1ZXVlKTsKKworCWlmIChzb2NrICE9IE5VTEwpCisJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlyZXR1cm4gc2s7Cit9CisKK3ZvaWQgbmZjX2xsY3Bfc29ja19mcmVlKHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKQoreworCWtmcmVlKHNvY2stPnNlcnZpY2VfbmFtZSk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNvY2stPnR4X3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNvY2stPnR4X3BlbmRpbmdfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc29jay0+dHhfYmFja2xvZ19xdWV1ZSk7CisKKwlsaXN0X2RlbF9pbml0KCZzb2NrLT5hY2NlcHRfcXVldWUpOworCisJc29jay0+cGFyZW50ID0gTlVMTDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQljb25zdCBzdHJ1Y3QgbmZjX3Byb3RvY29sICpuZmNfcHJvdG8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJcHJfZGVidWcoIiVwXG4iLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfU1RSRUFNICYmIHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmbGxjcF9zb2NrX29wczsKKworCXNrID0gbmZjX2xsY3Bfc29ja19hbGxvYyhzb2NrLCBzb2NrLT50eXBlLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZmNfcHJvdG9jb2wgbGxjcF9uZmNfcHJvdG8gPSB7CisJLmlkCSAgPSBORkNfU09DS1BST1RPX0xMQ1AsCisJLnByb3RvICAgID0gJmxsY3Bfc29ja19wcm90bywKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkuY3JlYXRlICAgPSBsbGNwX3NvY2tfY3JlYXRlCit9OworCitpbnQgX19pbml0IG5mY19sbGNwX3NvY2tfaW5pdCh2b2lkKQoreworCXJldHVybiBuZmNfcHJvdG9fcmVnaXN0ZXIoJmxsY3BfbmZjX3Byb3RvKTsKK30KKwordm9pZCBuZmNfbGxjcF9zb2NrX2V4aXQodm9pZCkKK3sKKwluZmNfcHJvdG9fdW5yZWdpc3RlcigmbGxjcF9uZmNfcHJvdG8pOworfQpkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvY29yZS5jIGIvbmV0L25mYy9uY2kvY29yZS5jCmluZGV4IDQwNDdlMjkuLjJkZWI0YWUgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmNpL2NvcmUuYworKysgYi9uZXQvbmZjL25jaS9jb3JlLmMKQEAgLTI1LDkgKzI1LDEyIEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTY4LDcgKzcxLDcgQEAKIAlfX3UzMiB0aW1lb3V0KQogewogCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBjb21wbGV0aW9uX3JjOworCWxvbmcgY29tcGxldGlvbl9yYzsKIAogCW5kZXYtPnJlcV9zdGF0dXMgPSBOQ0lfUkVRX1BFTkQ7CiAKQEAgLTc4LDcgKzgxLDcgQEAKIAkJCQkJCQkmbmRldi0+cmVxX2NvbXBsZXRpb24sCiAJCQkJCQkJdGltZW91dCk7CiAKLQluZmNfZGJnKCJ3YWl0X2Zvcl9jb21wbGV0aW9uIHJldHVybiAlbGQiLCBjb21wbGV0aW9uX3JjKTsKKwlwcl9kZWJ1Zygid2FpdF9mb3JfY29tcGxldGlvbiByZXR1cm4gJWxkXG4iLCBjb21wbGV0aW9uX3JjKTsKIAogCWlmIChjb21wbGV0aW9uX3JjID4gMCkgewogCQlzd2l0Y2ggKG5kZXYtPnJlcV9zdGF0dXMpIHsKQEAgLTk1LDggKzk4LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKLQkJbmZjX2Vycigid2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgZmFpbGVkICVsZCIsCi0JCQljb21wbGV0aW9uX3JjKTsKKwkJcHJfZXJyKCJ3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCBmYWlsZWQgJWxkXG4iLAorCQkgICAgICAgY29tcGxldGlvbl9yYyk7CiAKIAkJcmMgPSAoKGNvbXBsZXRpb25fcmMgPT0gMCkgPyAoLUVUSU1FRE9VVCkgOiAoY29tcGxldGlvbl9yYykpOwogCX0KQEAgLTEyNSw3ICsxMjgsMTAgQEAKIAogc3RhdGljIHZvaWQgbmNpX3Jlc2V0X3JlcShzdHJ1Y3QgbmNpX2RldiAqbmRldiwgdW5zaWduZWQgbG9uZyBvcHQpCiB7Ci0JbmNpX3NlbmRfY21kKG5kZXYsIE5DSV9PUF9DT1JFX1JFU0VUX0NNRCwgMCwgTlVMTCk7CisJc3RydWN0IG5jaV9jb3JlX3Jlc2V0X2NtZCBjbWQ7CisKKwljbWQucmVzZXRfdHlwZSA9IE5DSV9SRVNFVF9UWVBFX1JFU0VUX0NPTkZJRzsKKwluY2lfc2VuZF9jbWQobmRldiwgTkNJX09QX0NPUkVfUkVTRVRfQ01ELCAxLCAmY21kKTsKIH0KIAogc3RhdGljIHZvaWQgbmNpX2luaXRfcmVxKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCB1bnNpZ25lZCBsb25nIG9wdCkKQEAgLTEzNSwxNyArMTQxLDExIEBACiAKIHN0YXRpYyB2b2lkIG5jaV9pbml0X2NvbXBsZXRlX3JlcShzdHJ1Y3QgbmNpX2RldiAqbmRldiwgdW5zaWduZWQgbG9uZyBvcHQpCiB7Ci0Jc3RydWN0IG5jaV9jb3JlX2Nvbm5fY3JlYXRlX2NtZCBjb25uX2NtZDsKIAlzdHJ1Y3QgbmNpX3JmX2Rpc2NfbWFwX2NtZCBjbWQ7CiAJc3RydWN0IGRpc2NfbWFwX2NvbmZpZyAqY2ZnID0gY21kLm1hcHBpbmdfY29uZmlnczsKIAlfX3U4ICpudW0gPSAmY21kLm51bV9tYXBwaW5nX2NvbmZpZ3M7CiAJaW50IGk7CiAKLQkvKiBjcmVhdGUgc3RhdGljIHJmIGNvbm5lY3Rpb24gKi8KLQljb25uX2NtZC50YXJnZXRfaGFuZGxlID0gMDsKLQljb25uX2NtZC5udW1fdGFyZ2V0X3NwZWNpZmljX3BhcmFtcyA9IDA7Ci0JbmNpX3NlbmRfY21kKG5kZXYsIE5DSV9PUF9DT1JFX0NPTk5fQ1JFQVRFX0NNRCwgMiwgJmNvbm5fY21kKTsKLQogCS8qIHNldCByZiBtYXBwaW5nIGNvbmZpZ3VyYXRpb25zICovCiAJKm51bSA9IDA7CiAKQEAgLTMyNSw4ICszMjUsNiBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gKHZvaWQgKikgYXJnOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWF0b21pY19zZXQoJm5kZXYtPmNtZF9jbnQsIDEpOwogCXF1ZXVlX3dvcmsobmRldi0+Y21kX3dxLCAmbmRldi0+Y21kX3dvcmspOwogfQpAQCAtMzM1LDggKzMzMyw2IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJcmV0dXJuIG5jaV9vcGVuX2RldmljZShuZGV2KTsKIH0KIApAQCAtMzQ0LDggKzM0MCw2IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJcmV0dXJuIG5jaV9jbG9zZV9kZXZpY2UobmRldik7CiB9CiAKQEAgLTM1NCwyMCArMzQ4LDE4IEBACiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAJaW50IHJjOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICh0ZXN0X2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpKSB7Ci0JCW5mY19lcnIoInVuYWJsZSB0byBzdGFydCBwb2xsLCBzaW5jZSBwb2xsIGlzIGFscmVhZHkgYWN0aXZlIik7CisJCXByX2VycigidW5hYmxlIHRvIHN0YXJ0IHBvbGwsIHNpbmNlIHBvbGwgaXMgYWxyZWFkeSBhY3RpdmVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QpIHsKLQkJbmZjX2VycigidGhlcmUgaXMgYW4gYWN0aXZlIHRhcmdldCIpOworCQlwcl9lcnIoInRoZXJlIGlzIGFuIGFjdGl2ZSB0YXJnZXRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICh0ZXN0X2JpdChOQ0lfUE9MTF9BQ1RJVkUsICZuZGV2LT5mbGFncykpIHsKLQkJbmZjX2RiZygidGFyZ2V0IGlzIGFjdGl2ZSwgaW1wbGljaXRseSBkZWFjdGl2YXRlLi4uIik7CisJCXByX2RlYnVnKCJ0YXJnZXQgaXMgYWN0aXZlLCBpbXBsaWNpdGx5IGRlYWN0aXZhdGUuLi5cbiIpOwogCiAJCXJjID0gbmNpX3JlcXVlc3QobmRldiwgbmNpX3JmX2RlYWN0aXZhdGVfcmVxLCAwLAogCQkJbXNlY3NfdG9famlmZmllcyhOQ0lfUkZfREVBQ1RJVkFURV9USU1FT1VUKSk7CkBAIC0zODgsMTAgKzM4MCw4IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCF0ZXN0X2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpKSB7Ci0JCW5mY19lcnIoInVuYWJsZSB0byBzdG9wIHBvbGwsIHNpbmNlIHBvbGwgaXMgbm90IGFjdGl2ZSIpOworCQlwcl9lcnIoInVuYWJsZSB0byBzdG9wIHBvbGwsIHNpbmNlIHBvbGwgaXMgbm90IGFjdGl2ZVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQwNCwyMSArMzk0LDIxIEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAKLQluZmNfZGJnKCJlbnRyeSwgdGFyZ2V0X2lkeCAlZCwgcHJvdG9jb2wgMHgleCIsIHRhcmdldF9pZHgsIHByb3RvY29sKTsKKwlwcl9kZWJ1ZygidGFyZ2V0X2lkeCAlZCwgcHJvdG9jb2wgMHgleFxuIiwgdGFyZ2V0X2lkeCwgcHJvdG9jb2wpOwogCiAJaWYgKCF0ZXN0X2JpdChOQ0lfUE9MTF9BQ1RJVkUsICZuZGV2LT5mbGFncykpIHsKLQkJbmZjX2VycigidGhlcmUgaXMgbm8gYXZhaWxhYmxlIHRhcmdldCB0byBhY3RpdmF0ZSIpOworCQlwcl9lcnIoInRoZXJlIGlzIG5vIGF2YWlsYWJsZSB0YXJnZXQgdG8gYWN0aXZhdGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAobmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90KSB7Ci0JCW5mY19lcnIoInRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIHRhcmdldCIpOworCQlwcl9lcnIoInRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIHRhcmdldFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKCEobmRldi0+dGFyZ2V0X2F2YWlsYWJsZV9wcm90cyAmICgxIDw8IHByb3RvY29sKSkpIHsKLQkJbmZjX2VycigidGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCAweCV4IiwKLQkJCXByb3RvY29sKTsKKwkJcHJfZXJyKCJ0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHByb3RvY29sIDB4JXhcbiIsCisJCSAgICAgICBwcm90b2NvbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDMyLDEwICs0MjIsMTAgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAotCW5mY19kYmcoImVudHJ5LCB0YXJnZXRfaWR4ICVkIiwgdGFyZ2V0X2lkeCk7CisJcHJfZGVidWcoInRhcmdldF9pZHggJWRcbiIsIHRhcmdldF9pZHgpOwogCiAJaWYgKCFuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QpIHsKLQkJbmZjX2VycigidW5hYmxlIHRvIGRlYWN0aXZhdGUgdGFyZ2V0LCBubyBhY3RpdmUgdGFyZ2V0Iik7CisJCXByX2VycigidW5hYmxlIHRvIGRlYWN0aXZhdGUgdGFyZ2V0LCBubyBhY3RpdmUgdGFyZ2V0XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDU1LDEwICs0NDUsMTAgQEAKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJlbnRyeSwgdGFyZ2V0X2lkeCAlZCwgbGVuICVkIiwgdGFyZ2V0X2lkeCwgc2tiLT5sZW4pOworCXByX2RlYnVnKCJ0YXJnZXRfaWR4ICVkLCBsZW4gJWRcbiIsIHRhcmdldF9pZHgsIHNrYi0+bGVuKTsKIAogCWlmICghbmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90KSB7Ci0JCW5mY19lcnIoInVuYWJsZSB0byBleGNoYW5nZSBkYXRhLCBubyBhY3RpdmUgdGFyZ2V0Iik7CisJCXByX2VycigidW5hYmxlIHRvIGV4Y2hhbmdlIGRhdGEsIG5vIGFjdGl2ZSB0YXJnZXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ2OSw3ICs0NTksNyBAQAogCW5kZXYtPmRhdGFfZXhjaGFuZ2VfY2IgPSBjYjsKIAluZGV2LT5kYXRhX2V4Y2hhbmdlX2NiX2NvbnRleHQgPSBjYl9jb250ZXh0OwogCi0JcmMgPSBuY2lfc2VuZF9kYXRhKG5kZXYsIG5kZXYtPmNvbm5faWQsIHNrYik7CisJcmMgPSBuY2lfc2VuZF9kYXRhKG5kZXYsIE5DSV9TVEFUSUNfUkZfQ09OTl9JRCwgc2tiKTsKIAlpZiAocmMpCiAJCWNsZWFyX2JpdChOQ0lfREFUQV9FWENIQU5HRSwgJm5kZXYtPmZsYWdzKTsKIApAQCAtNTAxLDcgKzQ5MSw3IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXY7CiAKLQluZmNfZGJnKCJlbnRyeSwgc3VwcG9ydGVkX3Byb3RvY29scyAweCV4Iiwgc3VwcG9ydGVkX3Byb3RvY29scyk7CisJcHJfZGVidWcoInN1cHBvcnRlZF9wcm90b2NvbHMgMHgleFxuIiwgc3VwcG9ydGVkX3Byb3RvY29scyk7CiAKIAlpZiAoIW9wcy0+b3BlbiB8fCAhb3BzLT5jbG9zZSB8fCAhb3BzLT5zZW5kKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU0MSw4ICs1MzEsNiBAQAogICovCiB2b2lkIG5jaV9mcmVlX2RldmljZShzdHJ1Y3QgbmNpX2RldiAqbmRldikKIHsKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJbmZjX2ZyZWVfZGV2aWNlKG5kZXYtPm5mY19kZXYpOwogCWtmcmVlKG5kZXYpOwogfQpAQCAtNTU5LDggKzU0Nyw2IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJm5kZXYtPm5mY19kZXYtPmRldjsKIAljaGFyIG5hbWVbMzJdOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCXJjID0gbmZjX3JlZ2lzdGVyX2RldmljZShuZGV2LT5uZmNfZGV2KTsKIAlpZiAocmMpCiAJCWdvdG8gZXhpdDsKQEAgLTYyMyw4ICs2MDksNiBAQAogICovCiB2b2lkIG5jaV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmNpX2RldiAqbmRldikKIHsKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJbmNpX2Nsb3NlX2RldmljZShuZGV2KTsKIAogCWRlc3Ryb3lfd29ya3F1ZXVlKG5kZXYtPmNtZF93cSk7CkBAIC02NDQsNyArNjI4LDcgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IChzdHJ1Y3QgbmNpX2RldiAqKSBza2ItPmRldjsKIAotCW5mY19kYmcoImVudHJ5LCBsZW4gJWQiLCBza2ItPmxlbik7CisJcHJfZGVidWcoImxlbiAlZFxuIiwgc2tiLT5sZW4pOwogCiAJaWYgKCFuZGV2IHx8ICghdGVzdF9iaXQoTkNJX1VQLCAmbmRldi0+ZmxhZ3MpCiAJCSYmICF0ZXN0X2JpdChOQ0lfSU5JVCwgJm5kZXYtPmZsYWdzKSkpIHsKQEAgLTY2NCw3ICs2NDgsNyBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gKHN0cnVjdCBuY2lfZGV2ICopIHNrYi0+ZGV2OwogCi0JbmZjX2RiZygiZW50cnksIGxlbiAlZCIsIHNrYi0+bGVuKTsKKwlwcl9kZWJ1ZygibGVuICVkXG4iLCBza2ItPmxlbik7CiAKIAlpZiAoIW5kZXYpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC02ODMsMTEgKzY2NywxMSBAQAogCXN0cnVjdCBuY2lfY3RybF9oZHIgKmhkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JbmZjX2RiZygiZW50cnksIG9wY29kZSAweCV4LCBwbGVuICVkIiwgb3Bjb2RlLCBwbGVuKTsKKwlwcl9kZWJ1Zygib3Bjb2RlIDB4JXgsIHBsZW4gJWRcbiIsIG9wY29kZSwgcGxlbik7CiAKIAlza2IgPSBuY2lfc2tiX2FsbG9jKG5kZXYsIChOQ0lfQ1RSTF9IRFJfU0laRSArIHBsZW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikgewotCQluZmNfZXJyKCJubyBtZW1vcnkgZm9yIGNvbW1hbmQiKTsKKwkJcHJfZXJyKCJubyBtZW1vcnkgZm9yIGNvbW1hbmRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTcxNyw3ICs3MDEsNyBAQAogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuY2lfZGV2LCB0eF93b3JrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JbmZjX2RiZygiZW50cnksIGNyZWRpdHNfY250ICVkIiwgYXRvbWljX3JlYWQoJm5kZXYtPmNyZWRpdHNfY250KSk7CisJcHJfZGVidWcoImNyZWRpdHNfY250ICVkXG4iLCBhdG9taWNfcmVhZCgmbmRldi0+Y3JlZGl0c19jbnQpKTsKIAogCS8qIFNlbmQgcXVldWVkIHR4IGRhdGEgKi8KIAl3aGlsZSAoYXRvbWljX3JlYWQoJm5kZXYtPmNyZWRpdHNfY250KSkgewpAQCAtNzI1LDEyICs3MDksMTUgQEAKIAkJaWYgKCFza2IpCiAJCQlyZXR1cm47CiAKLQkJYXRvbWljX2RlYygmbmRldi0+Y3JlZGl0c19jbnQpOworCQkvKiBDaGVjayBpZiBkYXRhIGZsb3cgY29udHJvbCBpcyB1c2VkICovCisJCWlmIChhdG9taWNfcmVhZCgmbmRldi0+Y3JlZGl0c19jbnQpICE9CisJCQkJTkNJX0RBVEFfRkxPV19DT05UUk9MX05PVF9VU0VEKQorCQkJYXRvbWljX2RlYygmbmRldi0+Y3JlZGl0c19jbnQpOwogCi0JCW5mY19kYmcoIk5DSSBUWDogTVQ9ZGF0YSwgUEJGPSVkLCBjb25uX2lkPSVkLCBwbGVuPSVkIiwKLQkJCQluY2lfcGJmKHNrYi0+ZGF0YSksCi0JCQkJbmNpX2Nvbm5faWQoc2tiLT5kYXRhKSwKLQkJCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwkJcHJfZGVidWcoIk5DSSBUWDogTVQ9ZGF0YSwgUEJGPSVkLCBjb25uX2lkPSVkLCBwbGVuPSVkXG4iLAorCQkJIG5jaV9wYmYoc2tiLT5kYXRhKSwKKwkJCSBuY2lfY29ubl9pZChza2ItPmRhdGEpLAorCQkJIG5jaV9wbGVuKHNrYi0+ZGF0YSkpOwogCiAJCW5jaV9zZW5kX2ZyYW1lKHNrYik7CiAJfQpAQCAtNzU5LDcgKzc0Niw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJbmZjX2VycigidW5rbm93biBNVCAweCV4IiwgbmNpX210KHNrYi0+ZGF0YSkpOworCQkJcHJfZXJyKCJ1bmtub3duIE1UIDB4JXhcbiIsIG5jaV9tdChza2ItPmRhdGEpKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTc3Myw3ICs3NjAsNyBAQAogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuY2lfZGV2LCBjbWRfd29yayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCW5mY19kYmcoImVudHJ5LCBjbWRfY250ICVkIiwgYXRvbWljX3JlYWQoJm5kZXYtPmNtZF9jbnQpKTsKKwlwcl9kZWJ1ZygiY21kX2NudCAlZFxuIiwgYXRvbWljX3JlYWQoJm5kZXYtPmNtZF9jbnQpKTsKIAogCS8qIFNlbmQgcXVldWVkIGNvbW1hbmQgKi8KIAlpZiAoYXRvbWljX3JlYWQoJm5kZXYtPmNtZF9jbnQpKSB7CkBAIC03ODMsMTEgKzc3MCwxMSBAQAogCiAJCWF0b21pY19kZWMoJm5kZXYtPmNtZF9jbnQpOwogCi0JCW5mY19kYmcoIk5DSSBUWDogTVQ9Y21kLCBQQkY9JWQsIEdJRD0weCV4LCBPSUQ9MHgleCwgcGxlbj0lZCIsCi0JCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJCW5jaV9vcGNvZGVfZ2lkKG5jaV9vcGNvZGUoc2tiLT5kYXRhKSksCi0JCQkJbmNpX29wY29kZV9vaWQobmNpX29wY29kZShza2ItPmRhdGEpKSwKLQkJCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwkJcHJfZGVidWcoIk5DSSBUWDogTVQ9Y21kLCBQQkY9JWQsIEdJRD0weCV4LCBPSUQ9MHgleCwgcGxlbj0lZFxuIiwKKwkJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCQkgbmNpX29wY29kZV9naWQobmNpX29wY29kZShza2ItPmRhdGEpKSwKKwkJCSBuY2lfb3Bjb2RlX29pZChuY2lfb3Bjb2RlKHNrYi0+ZGF0YSkpLAorCQkJIG5jaV9wbGVuKHNrYi0+ZGF0YSkpOwogCiAJCW5jaV9zZW5kX2ZyYW1lKHNrYik7CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL2RhdGEuYyBiL25ldC9uZmMvbmNpL2RhdGEuYwppbmRleCBlNWVkOTBmLi5lNTc1NmIzIDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9kYXRhLmMKKysrIGIvbmV0L25mYy9uY2kvZGF0YS5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CkBAIC00MCw3ICs0Miw3IEBACiAJZGF0YV9leGNoYW5nZV9jYl90IGNiID0gbmRldi0+ZGF0YV9leGNoYW5nZV9jYjsKIAl2b2lkICpjYl9jb250ZXh0ID0gbmRldi0+ZGF0YV9leGNoYW5nZV9jYl9jb250ZXh0OwogCi0JbmZjX2RiZygiZW50cnksIGxlbiAlZCwgZXJyICVkIiwgKChza2IpID8gKHNrYi0+bGVuKSA6ICgwKSksIGVycik7CisJcHJfZGVidWcoImxlbiAlZCwgZXJyICVkXG4iLCBza2IgPyBza2ItPmxlbiA6IDAsIGVycik7CiAKIAlpZiAoY2IpIHsKIAkJbmRldi0+ZGF0YV9leGNoYW5nZV9jYiA9IE5VTEw7CkBAIC00OSw3ICs1MSw3IEBACiAJCS8qIGZvcndhcmQgc2tiIHRvIG5mYyBjb3JlICovCiAJCWNiKGNiX2NvbnRleHQsIHNrYiwgZXJyKTsKIAl9IGVsc2UgaWYgKHNrYikgewotCQluZmNfZXJyKCJubyByeCBjYWxsYmFjaywgZHJvcHBpbmcgcnggZGF0YS4uLiIpOworCQlwcl9lcnIoIm5vIHJ4IGNhbGxiYWNrLCBkcm9wcGluZyByeCBkYXRhLi4uXG4iKTsKIAogCQkvKiBubyB3YWl0aW5nIGNhbGxiYWNrLCBmcmVlIHNrYiAqLwogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTkwLDEyICs5MiwxMyBAQAogCWludCBmcmFnX2xlbjsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZW50cnksIGNvbm5faWQgMHgleCwgdG90YWxfbGVuICVkIiwgY29ubl9pZCwgdG90YWxfbGVuKTsKKwlwcl9kZWJ1ZygiY29ubl9pZCAweCV4LCB0b3RhbF9sZW4gJWRcbiIsIGNvbm5faWQsIHRvdGFsX2xlbik7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmZyYWdzX3EpOwogCiAJd2hpbGUgKHRvdGFsX2xlbikgewotCQlmcmFnX2xlbiA9IG1pbl90KGludCwgdG90YWxfbGVuLCBuZGV2LT5tYXhfcGt0X3BheWxvYWRfc2l6ZSk7CisJCWZyYWdfbGVuID0KKwkJCW1pbl90KGludCwgdG90YWxfbGVuLCBuZGV2LT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplKTsKIAogCQlza2JfZnJhZyA9IG5jaV9za2JfYWxsb2MobmRldiwKIAkJCQkJKE5DSV9EQVRBX0hEUl9TSVpFICsgZnJhZ19sZW4pLApAQCAtMTE4LDggKzEyMSw4IEBACiAJCWRhdGEgKz0gZnJhZ19sZW47CiAJCXRvdGFsX2xlbiAtPSBmcmFnX2xlbjsKIAotCQluZmNfZGJnKCJmcmFnX2xlbiAlZCwgcmVtYWluaW5nIHRvdGFsX2xlbiAlZCIsCi0JCQlmcmFnX2xlbiwgdG90YWxfbGVuKTsKKwkJcHJfZGVidWcoImZyYWdfbGVuICVkLCByZW1haW5pbmcgdG90YWxfbGVuICVkXG4iLAorCQkJIGZyYWdfbGVuLCB0b3RhbF9sZW4pOwogCX0KIAogCS8qIHF1ZXVlIGFsbCBmcmFnbWVudHMgYXRvbWljYWxseSAqLwpAQCAtMTQ4LDEwICsxNTEsMTAgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZW50cnksIGNvbm5faWQgMHgleCwgcGxlbiAlZCIsIGNvbm5faWQsIHNrYi0+bGVuKTsKKwlwcl9kZWJ1ZygiY29ubl9pZCAweCV4LCBwbGVuICVkXG4iLCBjb25uX2lkLCBza2ItPmxlbik7CiAKIAkvKiBjaGVjayBpZiB0aGUgcGFja2V0IG5lZWQgdG8gYmUgZnJhZ21lbnRlZCAqLwotCWlmIChza2ItPmxlbiA8PSBuZGV2LT5tYXhfcGt0X3BheWxvYWRfc2l6ZSkgeworCWlmIChza2ItPmxlbiA8PSBuZGV2LT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplKSB7CiAJCS8qIG5vIG5lZWQgdG8gZnJhZ21lbnQgcGFja2V0ICovCiAJCW5jaV9wdXNoX2RhdGFfaGRyKG5kZXYsIGNvbm5faWQsIHNrYiwgTkNJX1BCRl9MQVNUKTsKIApAQCAtMTYwLDcgKzE2Myw3IEBACiAJCS8qIGZyYWdtZW50IHBhY2tldCBhbmQgcXVldWUgdGhlIGZyYWdtZW50cyAqLwogCQlyYyA9IG5jaV9xdWV1ZV90eF9kYXRhX2ZyYWdzKG5kZXYsIGNvbm5faWQsIHNrYik7CiAJCWlmIChyYykgewotCQkJbmZjX2VycigiZmFpbGVkIHRvIGZyYWdtZW50IHR4IGRhdGEgcGFja2V0Iik7CisJCQlwcl9lcnIoImZhaWxlZCB0byBmcmFnbWVudCB0eCBkYXRhIHBhY2tldFxuIik7CiAJCQlnb3RvIGZyZWVfZXhpdDsKIAkJfQogCX0KQEAgLTE5MCw3ICsxOTMsNyBAQAogCiAJCS8qIGZpcnN0LCBtYWtlIGVub3VnaCByb29tIGZvciB0aGUgYWxyZWFkeSBhY2N1bXVsYXRlZCBkYXRhICovCiAJCWlmIChza2JfY293X2hlYWQoc2tiLCByZWFzc2VtYmx5X2xlbikpIHsKLQkJCW5mY19lcnIoImVycm9yIGFkZGluZyByb29tIGZvciBhY2N1bXVsYXRlZCByeCBkYXRhIik7CisJCQlwcl9lcnIoImVycm9yIGFkZGluZyByb29tIGZvciBhY2N1bXVsYXRlZCByeCBkYXRhXG4iKTsKIAogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlza2IgPSAwOwpAQCAtMjI3LDE5ICsyMzAsMTkgQEAKIHsKIAlfX3U4IHBiZiA9IG5jaV9wYmYoc2tiLT5kYXRhKTsKIAotCW5mY19kYmcoImVudHJ5LCBsZW4gJWQiLCBza2ItPmxlbik7CisJcHJfZGVidWcoImxlbiAlZFxuIiwgc2tiLT5sZW4pOwogCi0JbmZjX2RiZygiTkNJIFJYOiBNVD1kYXRhLCBQQkY9JWQsIGNvbm5faWQ9JWQsIHBsZW49JWQiLAotCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJbmNpX2Nvbm5faWQoc2tiLT5kYXRhKSwKLQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCXByX2RlYnVnKCJOQ0kgUlg6IE1UPWRhdGEsIFBCRj0lZCwgY29ubl9pZD0lZCwgcGxlbj0lZFxuIiwKKwkJIG5jaV9wYmYoc2tiLT5kYXRhKSwKKwkJIG5jaV9jb25uX2lkKHNrYi0+ZGF0YSksCisJCSBuY2lfcGxlbihza2ItPmRhdGEpKTsKIAogCS8qIHN0cmlwIHRoZSBuY2kgZGF0YSBoZWFkZXIgKi8KIAlza2JfcHVsbChza2IsIE5DSV9EQVRBX0hEUl9TSVpFKTsKIAogCWlmIChuZGV2LT50YXJnZXRfYWN0aXZlX3Byb3QgPT0gTkZDX1BST1RPX01JRkFSRSkgewogCQkvKiBmcmFtZSBJL0YgPT4gcmVtb3ZlIHRoZSBzdGF0dXMgYnl0ZSAqLwotCQluZmNfZGJnKCJORkNfUFJPVE9fTUlGQVJFID0+IHJlbW92ZSB0aGUgc3RhdHVzIGJ5dGUiKTsKKwkJcHJfZGVidWcoIk5GQ19QUk9UT19NSUZBUkUgPT4gcmVtb3ZlIHRoZSBzdGF0dXMgYnl0ZVxuIik7CiAJCXNrYl90cmltKHNrYiwgKHNrYi0+bGVuIC0gMSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvbGliLmMgYi9uZXQvbmZjL25jaS9saWIuYwppbmRleCBiMTlkYzJmLi5lOTlhZGNmIDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9saWIuYworKysgYi9uZXQvbmZjL25jaS9saWIuYwpAQCAtNDIsMTIgKzQyLDkgQEAKIAljYXNlIE5DSV9TVEFUVVNfUkVKRUNURUQ6CiAJCXJldHVybiAtRUJVU1k7CiAKLQljYXNlIE5DSV9TVEFUVVNfTUVTU0FHRV9DT1JSVVBURUQ6CisJY2FzZSBOQ0lfU1RBVFVTX1JGX0ZSQU1FX0NPUlJVUFRFRDoKIAkJcmV0dXJuIC1FQkFETVNHOwogCi0JY2FzZSBOQ0lfU1RBVFVTX0JVRkZFUl9GVUxMOgotCQlyZXR1cm4gLUVOT0JVRlM7Ci0KIAljYXNlIE5DSV9TVEFUVVNfTk9UX0lOSVRJQUxJWkVEOgogCQlyZXR1cm4gLUVIT1NURE9XTjsKIApAQCAtODAsOSArNzcsNiBAQAogCWNhc2UgTkNJX1NUQVRVU19ORkNFRV9USU1FT1VUX0VSUk9SOgogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAotCWNhc2UgTkNJX1NUQVRVU19SRl9MSU5LX0xPU1NfRVJST1I6Ci0JCXJldHVybiAtRU5PTElOSzsKLQogCWNhc2UgTkNJX1NUQVRVU19NQVhfQUNUSVZFX05GQ0VFX0lOVEVSRkFDRVNfUkVBQ0hFRDoKIAkJcmV0dXJuIC1FRFFVT1Q7CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL250Zi5jIGIvbmV0L25mYy9uY2kvbnRmLmMKaW5kZXggOTY2MzNmNS4uMDAzODQ2YiAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvbnRmLmMKKysrIGIvbmV0L25mYy9uY2kvbnRmLmMKQEAgLTI1LDYgKzI1LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAlczogIiBmbXQsIF9fZnVuY19fCisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtNDMsMTggKzQ1LDE4IEBACiAJc3RydWN0IG5jaV9jb3JlX2Nvbm5fY3JlZGl0X250ZiAqbnRmID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCWludCBpOwogCi0JbmZjX2RiZygiZW50cnksIG51bV9lbnRyaWVzICVkIiwgbnRmLT5udW1fZW50cmllcyk7CisJcHJfZGVidWcoIm51bV9lbnRyaWVzICVkXG4iLCBudGYtPm51bV9lbnRyaWVzKTsKIAogCWlmIChudGYtPm51bV9lbnRyaWVzID4gTkNJX01BWF9OVU1fQ09OTikKIAkJbnRmLT5udW1fZW50cmllcyA9IE5DSV9NQVhfTlVNX0NPTk47CiAKIAkvKiB1cGRhdGUgdGhlIGNyZWRpdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnRmLT5udW1fZW50cmllczsgaSsrKSB7Ci0JCW5mY19kYmcoImVudHJ5WyVkXTogY29ubl9pZCAlZCwgY3JlZGl0cyAlZCIsIGksCi0JCQludGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkLAotCQkJbnRmLT5jb25uX2VudHJpZXNbaV0uY3JlZGl0cyk7CisJCXByX2RlYnVnKCJlbnRyeVslZF06IGNvbm5faWQgJWQsIGNyZWRpdHMgJWRcbiIsCisJCQkgaSwgbnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCwKKwkJCSBudGYtPmNvbm5fZW50cmllc1tpXS5jcmVkaXRzKTsKIAotCQlpZiAobnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCA9PSBuZGV2LT5jb25uX2lkKSB7CisJCWlmIChudGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkID09IE5DSV9TVEFUSUNfUkZfQ09OTl9JRCkgewogCQkJLyogZm91bmQgc3RhdGljIHJmIGNvbm5lY3Rpb24gKi8KIAkJCWF0b21pY19hZGQobnRmLT5jb25uX2VudHJpZXNbaV0uY3JlZGl0cywKIAkJCQkmbmRldi0+Y3JlZGl0c19jbnQpOwpAQCAtNjYsMzEgKzY4LDIwIEBACiAJCXF1ZXVlX3dvcmsobmRldi0+dHhfd3EsICZuZGV2LT50eF93b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgbmNpX3JmX2ZpZWxkX2luZm9fbnRmX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmNpX3JmX2ZpZWxkX2luZm9fbnRmICpudGYgPSAodm9pZCAqKSBza2ItPmRhdGE7Ci0KLQluZmNfZGJnKCJlbnRyeSwgcmZfZmllbGRfc3RhdHVzICVkIiwgbnRmLT5yZl9maWVsZF9zdGF0dXMpOwotfQotCi1zdGF0aWMgaW50IG5jaV9yZl9hY3RpdmF0ZV9uZmNhX3Bhc3NpdmVfcG9sbChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCXN0cnVjdCBuY2lfcmZfYWN0aXZhdGVfbnRmICpudGYsIF9fdTggKmRhdGEpCitzdGF0aWMgX191OCAqbmNpX2V4dHJhY3RfcmZfcGFyYW1zX25mY2FfcGFzc2l2ZV9wb2xsKHN0cnVjdCBuY2lfZGV2ICpuZGV2LAorCQkJc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgKm50ZiwgX191OCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbmZjYV9wb2xsICpuZmNhX3BvbGw7Ci0Jc3RydWN0IGFjdGl2YXRpb25fcGFyYW1zX25mY2FfcG9sbF9pc29fZGVwICpuZmNhX3BvbGxfaXNvX2RlcDsKIAogCW5mY2FfcG9sbCA9ICZudGYtPnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zLm5mY2FfcG9sbDsKLQluZmNhX3BvbGxfaXNvX2RlcCA9ICZudGYtPmFjdGl2YXRpb25fcGFyYW1zLm5mY2FfcG9sbF9pc29fZGVwOwogCiAJbmZjYV9wb2xsLT5zZW5zX3JlcyA9IF9fbGUxNl90b19jcHUoKigoX191MTYgKilkYXRhKSk7CiAJZGF0YSArPSAyOwogCiAJbmZjYV9wb2xsLT5uZmNpZDFfbGVuID0gKmRhdGErKzsKIAotCW5mY19kYmcoInNlbnNfcmVzIDB4JXgsIG5mY2lkMV9sZW4gJWQiLAotCQluZmNhX3BvbGwtPnNlbnNfcmVzLAotCQluZmNhX3BvbGwtPm5mY2lkMV9sZW4pOworCXByX2RlYnVnKCJzZW5zX3JlcyAweCV4LCBuZmNpZDFfbGVuICVkXG4iLAorCQkgbmZjYV9wb2xsLT5zZW5zX3JlcywgbmZjYV9wb2xsLT5uZmNpZDFfbGVuKTsKIAogCW1lbWNweShuZmNhX3BvbGwtPm5mY2lkMSwgZGF0YSwgbmZjYV9wb2xsLT5uZmNpZDFfbGVuKTsKIAlkYXRhICs9IG5mY2FfcG9sbC0+bmZjaWQxX2xlbjsKQEAgLTEwMCwzMiArOTEsMzIgQEAKIAlpZiAobmZjYV9wb2xsLT5zZWxfcmVzX2xlbiAhPSAwKQogCQluZmNhX3BvbGwtPnNlbF9yZXMgPSAqZGF0YSsrOwogCi0JbnRmLT5yZl9pbnRlcmZhY2VfdHlwZSA9ICpkYXRhKys7Ci0JbnRmLT5hY3RpdmF0aW9uX3BhcmFtc19sZW4gPSAqZGF0YSsrOworCXByX2RlYnVnKCJzZWxfcmVzX2xlbiAlZCwgc2VsX3JlcyAweCV4XG4iLAorCQkgbmZjYV9wb2xsLT5zZWxfcmVzX2xlbiwKKwkJIG5mY2FfcG9sbC0+c2VsX3Jlcyk7CiAKLQluZmNfZGJnKCJzZWxfcmVzX2xlbiAlZCwgc2VsX3JlcyAweCV4LCByZl9pbnRlcmZhY2VfdHlwZSAlZCwgYWN0aXZhdGlvbl9wYXJhbXNfbGVuICVkIiwKLQkJbmZjYV9wb2xsLT5zZWxfcmVzX2xlbiwKLQkJbmZjYV9wb2xsLT5zZWxfcmVzLAotCQludGYtPnJmX2ludGVyZmFjZV90eXBlLAotCQludGYtPmFjdGl2YXRpb25fcGFyYW1zX2xlbik7CisJcmV0dXJuIGRhdGE7Cit9CiAKLQlzd2l0Y2ggKG50Zi0+cmZfaW50ZXJmYWNlX3R5cGUpIHsKLQljYXNlIE5DSV9SRl9JTlRFUkZBQ0VfSVNPX0RFUDoKLQkJbmZjYV9wb2xsX2lzb19kZXAtPnJhdHNfcmVzX2xlbiA9ICpkYXRhKys7Ci0JCWlmIChuZmNhX3BvbGxfaXNvX2RlcC0+cmF0c19yZXNfbGVuID4gMCkgewotCQkJbWVtY3B5KG5mY2FfcG9sbF9pc29fZGVwLT5yYXRzX3JlcywKK3N0YXRpYyBpbnQgbmNpX2V4dHJhY3RfYWN0aXZhdGlvbl9wYXJhbXNfaXNvX2RlcChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKKwkJCXN0cnVjdCBuY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmICpudGYsIF9fdTggKmRhdGEpCit7CisJc3RydWN0IGFjdGl2YXRpb25fcGFyYW1zX25mY2FfcG9sbF9pc29fZGVwICpuZmNhX3BvbGw7CisKKwlzd2l0Y2ggKG50Zi0+YWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKSB7CisJY2FzZSBOQ0lfTkZDX0FfUEFTU0lWRV9QT0xMX01PREU6CisJCW5mY2FfcG9sbCA9ICZudGYtPmFjdGl2YXRpb25fcGFyYW1zLm5mY2FfcG9sbF9pc29fZGVwOworCQluZmNhX3BvbGwtPnJhdHNfcmVzX2xlbiA9ICpkYXRhKys7CisJCWlmIChuZmNhX3BvbGwtPnJhdHNfcmVzX2xlbiA+IDApIHsKKwkJCW1lbWNweShuZmNhX3BvbGwtPnJhdHNfcmVzLAogCQkJCWRhdGEsCi0JCQkJbmZjYV9wb2xsX2lzb19kZXAtPnJhdHNfcmVzX2xlbik7CisJCQkJbmZjYV9wb2xsLT5yYXRzX3Jlc19sZW4pOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBOQ0lfUkZfSU5URVJGQUNFX0ZSQU1FOgotCQkvKiBubyBhY3RpdmF0aW9uIHBhcmFtcyAqLwotCQlicmVhazsKLQogCWRlZmF1bHQ6Ci0JCW5mY19lcnIoInVuc3VwcG9ydGVkIHJmX2ludGVyZmFjZV90eXBlIDB4JXgiLAotCQkJbnRmLT5yZl9pbnRlcmZhY2VfdHlwZSk7CisJCXByX2VycigidW5zdXBwb3J0ZWQgYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlIDB4JXhcbiIsCisJCSAgICAgICBudGYtPmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIApAQCAtMTMzLDcgKzEyNCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIG5jaV90YXJnZXRfZm91bmQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCi0JCQkJc3RydWN0IG5jaV9yZl9hY3RpdmF0ZV9udGYgKm50ZikKKwkJCQlzdHJ1Y3QgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250ZiAqbnRmKQogewogCXN0cnVjdCBuZmNfdGFyZ2V0IG5mY190Z3Q7CiAKQEAgLTE0MSw2NiArMTMyLDEwNSBAQAogCQluZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fTUlGQVJFX01BU0s7CiAJZWxzZSBpZiAobnRmLT5yZl9wcm90b2NvbCA9PSBOQ0lfUkZfUFJPVE9DT0xfSVNPX0RFUCkJLyogNEEgKi8KIAkJbmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzID0gTkZDX1BST1RPX0lTTzE0NDQzX01BU0s7CisJZWxzZQorCQluZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgPSAwOwogCiAJbmZjX3RndC5zZW5zX3JlcyA9IG50Zi0+cmZfdGVjaF9zcGVjaWZpY19wYXJhbXMubmZjYV9wb2xsLnNlbnNfcmVzOwogCW5mY190Z3Quc2VsX3JlcyA9IG50Zi0+cmZfdGVjaF9zcGVjaWZpY19wYXJhbXMubmZjYV9wb2xsLnNlbF9yZXM7CiAKIAlpZiAoIShuZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgJiBuZGV2LT5wb2xsX3Byb3RzKSkgewotCQluZmNfZGJnKCJ0aGUgdGFyZ2V0IGZvdW5kIGRvZXMgbm90IGhhdmUgdGhlIGRlc2lyZWQgcHJvdG9jb2wiKTsKKwkJcHJfZGVidWcoInRoZSB0YXJnZXQgZm91bmQgZG9lcyBub3QgaGF2ZSB0aGUgZGVzaXJlZCBwcm90b2NvbFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQluZmNfZGJnKCJuZXcgdGFyZ2V0IGZvdW5kLCAgc3VwcG9ydGVkX3Byb3RvY29scyAweCV4IiwKLQkJbmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzKTsKKwlwcl9kZWJ1ZygibmV3IHRhcmdldCBmb3VuZCwgIHN1cHBvcnRlZF9wcm90b2NvbHMgMHgleFxuIiwKKwkJIG5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyk7CiAKIAluZGV2LT50YXJnZXRfYXZhaWxhYmxlX3Byb3RzID0gbmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzOwogCiAJbmZjX3RhcmdldHNfZm91bmQobmRldi0+bmZjX2RldiwgJm5mY190Z3QsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBuY2lfcmZfYWN0aXZhdGVfbnRmX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGZfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgbmNpX3JmX2FjdGl2YXRlX250ZiBudGY7CisJc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgbnRmOwogCV9fdTggKmRhdGEgPSBza2ItPmRhdGE7Ci0JaW50IHJjID0gLTE7CisJaW50IGVyciA9IDA7CiAKIAljbGVhcl9iaXQoTkNJX0RJU0NPVkVSWSwgJm5kZXYtPmZsYWdzKTsKIAlzZXRfYml0KE5DSV9QT0xMX0FDVElWRSwgJm5kZXYtPmZsYWdzKTsKIAotCW50Zi50YXJnZXRfaGFuZGxlID0gKmRhdGErKzsKKwludGYucmZfZGlzY292ZXJ5X2lkID0gKmRhdGErKzsKKwludGYucmZfaW50ZXJmYWNlX3R5cGUgPSAqZGF0YSsrOwogCW50Zi5yZl9wcm90b2NvbCA9ICpkYXRhKys7Ci0JbnRmLnJmX3RlY2hfYW5kX21vZGUgPSAqZGF0YSsrOworCW50Zi5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgPSAqZGF0YSsrOwogCW50Zi5yZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW4gPSAqZGF0YSsrOwogCi0JbmZjX2RiZygidGFyZ2V0X2hhbmRsZSAlZCwgcmZfcHJvdG9jb2wgMHgleCwgcmZfdGVjaF9hbmRfbW9kZSAweCV4LCByZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW4gJWQiLAotCQludGYudGFyZ2V0X2hhbmRsZSwKLQkJbnRmLnJmX3Byb3RvY29sLAotCQludGYucmZfdGVjaF9hbmRfbW9kZSwKLQkJbnRmLnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbik7CisJcHJfZGVidWcoInJmX2Rpc2NvdmVyeV9pZCAlZFxuIiwgbnRmLnJmX2Rpc2NvdmVyeV9pZCk7CisJcHJfZGVidWcoInJmX2ludGVyZmFjZV90eXBlIDB4JXhcbiIsIG50Zi5yZl9pbnRlcmZhY2VfdHlwZSk7CisJcHJfZGVidWcoInJmX3Byb3RvY29sIDB4JXhcbiIsIG50Zi5yZl9wcm90b2NvbCk7CisJcHJfZGVidWcoImFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSAweCV4XG4iLAorCQkgbnRmLmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSk7CisJcHJfZGVidWcoInJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiAlZFxuIiwKKwkJIG50Zi5yZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW4pOwogCi0Jc3dpdGNoIChudGYucmZfdGVjaF9hbmRfbW9kZSkgewotCWNhc2UgTkNJX05GQ19BX1BBU1NJVkVfUE9MTF9NT0RFOgotCQlyYyA9IG5jaV9yZl9hY3RpdmF0ZV9uZmNhX3Bhc3NpdmVfcG9sbChuZGV2LCAmbnRmLAotCQkJZGF0YSk7Ci0JCWJyZWFrOworCWlmIChudGYucmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuID4gMCkgeworCQlzd2l0Y2ggKG50Zi5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUpIHsKKwkJY2FzZSBOQ0lfTkZDX0FfUEFTU0lWRV9QT0xMX01PREU6CisJCQlkYXRhID0gbmNpX2V4dHJhY3RfcmZfcGFyYW1zX25mY2FfcGFzc2l2ZV9wb2xsKG5kZXYsCisJCQkJJm50ZiwgZGF0YSk7CisJCQlicmVhazsKIAotCWRlZmF1bHQ6Ci0JCW5mY19lcnIoInVuc3VwcG9ydGVkIHJmX3RlY2hfYW5kX21vZGUgMHgleCIsCi0JCQludGYucmZfdGVjaF9hbmRfbW9kZSk7Ci0JCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCXByX2VycigidW5zdXBwb3J0ZWQgYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlIDB4JXhcbiIsCisJCQkgICAgICAgbnRmLmFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSk7CisJCQlyZXR1cm47CisJCX0KIAl9CiAKLQlpZiAoIXJjKQorCW50Zi5kYXRhX2V4Y2hfcmZfdGVjaF9hbmRfbW9kZSA9ICpkYXRhKys7CisJbnRmLmRhdGFfZXhjaF90eF9iaXRfcmF0ZSA9ICpkYXRhKys7CisJbnRmLmRhdGFfZXhjaF9yeF9iaXRfcmF0ZSA9ICpkYXRhKys7CisJbnRmLmFjdGl2YXRpb25fcGFyYW1zX2xlbiA9ICpkYXRhKys7CisKKwlwcl9kZWJ1ZygiZGF0YV9leGNoX3JmX3RlY2hfYW5kX21vZGUgMHgleFxuIiwKKwkJIG50Zi5kYXRhX2V4Y2hfcmZfdGVjaF9hbmRfbW9kZSk7CisJcHJfZGVidWcoImRhdGFfZXhjaF90eF9iaXRfcmF0ZSAweCV4XG4iLAorCQkgbnRmLmRhdGFfZXhjaF90eF9iaXRfcmF0ZSk7CisJcHJfZGVidWcoImRhdGFfZXhjaF9yeF9iaXRfcmF0ZSAweCV4XG4iLAorCQkgbnRmLmRhdGFfZXhjaF9yeF9iaXRfcmF0ZSk7CisJcHJfZGVidWcoImFjdGl2YXRpb25fcGFyYW1zX2xlbiAlZFxuIiwKKwkJIG50Zi5hY3RpdmF0aW9uX3BhcmFtc19sZW4pOworCisJaWYgKG50Zi5hY3RpdmF0aW9uX3BhcmFtc19sZW4gPiAwKSB7CisJCXN3aXRjaCAobnRmLnJmX2ludGVyZmFjZV90eXBlKSB7CisJCWNhc2UgTkNJX1JGX0lOVEVSRkFDRV9JU09fREVQOgorCQkJZXJyID0gbmNpX2V4dHJhY3RfYWN0aXZhdGlvbl9wYXJhbXNfaXNvX2RlcChuZGV2LAorCQkJCSZudGYsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOQ0lfUkZfSU5URVJGQUNFX0ZSQU1FOgorCQkJLyogbm8gYWN0aXZhdGlvbiBwYXJhbXMgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoInVuc3VwcG9ydGVkIHJmX2ludGVyZmFjZV90eXBlIDB4JXhcbiIsCisJCQkgICAgICAgbnRmLnJmX2ludGVyZmFjZV90eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmICghZXJyKQogCQluY2lfdGFyZ2V0X2ZvdW5kKG5kZXYsICZudGYpOwogfQogCiBzdGF0aWMgdm9pZCBuY2lfcmZfZGVhY3RpdmF0ZV9udGZfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCV9fdTggdHlwZSA9IHNrYi0+ZGF0YVswXTsKKwlzdHJ1Y3QgbmNpX3JmX2RlYWN0aXZhdGVfbnRmICpudGYgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAKLQluZmNfZGJnKCJlbnRyeSwgdHlwZSAweCV4IiwgdHlwZSk7CisJcHJfZGVidWcoImVudHJ5LCB0eXBlIDB4JXgsIHJlYXNvbiAweCV4XG4iLCBudGYtPnR5cGUsIG50Zi0+cmVhc29uKTsKIAogCWNsZWFyX2JpdChOQ0lfUE9MTF9BQ1RJVkUsICZuZGV2LT5mbGFncyk7CiAJbmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90ID0gMDsKQEAgLTIxNCw2ICsyNDQsOSBAQAogCQluZGV2LT5yeF9kYXRhX3JlYXNzZW1ibHkgPSAwOwogCX0KIAorCS8qIHNldCB0aGUgYXZhaWxhYmxlIGNyZWRpdHMgdG8gaW5pdGlhbCB2YWx1ZSAqLworCWF0b21pY19zZXQoJm5kZXYtPmNyZWRpdHNfY250LCBuZGV2LT5pbml0aWFsX251bV9jcmVkaXRzKTsKKwogCS8qIGNvbXBsZXRlIHRoZSBkYXRhIGV4Y2hhbmdlIHRyYW5zYWN0aW9uLCBpZiBleGlzdHMgKi8KIAlpZiAodGVzdF9iaXQoTkNJX0RBVEFfRVhDSEFOR0UsICZuZGV2LT5mbGFncykpCiAJCW5jaV9kYXRhX2V4Y2hhbmdlX2NvbXBsZXRlKG5kZXYsIE5VTEwsIC1FSU8pOwpAQCAtMjIzLDExICsyNTYsMTEgQEAKIHsKIAlfX3UxNiBudGZfb3Bjb2RlID0gbmNpX29wY29kZShza2ItPmRhdGEpOwogCi0JbmZjX2RiZygiTkNJIFJYOiBNVD1udGYsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkIiwKLQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCW5jaV9vcGNvZGVfZ2lkKG50Zl9vcGNvZGUpLAotCQkJbmNpX29wY29kZV9vaWQobnRmX29wY29kZSksCi0JCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwlwcl9kZWJ1ZygiTkNJIFJYOiBNVD1udGYsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkXG4iLAorCQkgbmNpX3BiZihza2ItPmRhdGEpLAorCQkgbmNpX29wY29kZV9naWQobnRmX29wY29kZSksCisJCSBuY2lfb3Bjb2RlX29pZChudGZfb3Bjb2RlKSwKKwkJIG5jaV9wbGVuKHNrYi0+ZGF0YSkpOwogCiAJLyogc3RyaXAgdGhlIG5jaSBjb250cm9sIGhlYWRlciAqLwogCXNrYl9wdWxsKHNrYiwgTkNJX0NUUkxfSERSX1NJWkUpOwpAQCAtMjM3LDEyICsyNzAsOCBAQAogCQluY2lfY29yZV9jb25uX2NyZWRpdHNfbnRmX3BhY2tldChuZGV2LCBza2IpOwogCQlicmVhazsKIAotCWNhc2UgTkNJX09QX1JGX0ZJRUxEX0lORk9fTlRGOgotCQluY2lfcmZfZmllbGRfaW5mb19udGZfcGFja2V0KG5kZXYsIHNrYik7Ci0JCWJyZWFrOwotCi0JY2FzZSBOQ0lfT1BfUkZfQUNUSVZBVEVfTlRGOgotCQluY2lfcmZfYWN0aXZhdGVfbnRmX3BhY2tldChuZGV2LCBza2IpOworCWNhc2UgTkNJX09QX1JGX0lOVEZfQUNUSVZBVEVEX05URjoKKwkJbmNpX3JmX2ludGZfYWN0aXZhdGVkX250Zl9wYWNrZXQobmRldiwgc2tiKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5DSV9PUF9SRl9ERUFDVElWQVRFX05URjoKQEAgLTI1MCw3ICsyNzksNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCW5mY19lcnIoInVua25vd24gbnRmIG9wY29kZSAweCV4IiwgbnRmX29wY29kZSk7CisJCXByX2VycigidW5rbm93biBudGYgb3Bjb2RlIDB4JXhcbiIsIG50Zl9vcGNvZGUpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL3JzcC5jIGIvbmV0L25mYy9uY2kvcnNwLmMKaW5kZXggMDQwM2Q0Yy4uM2Y0NDRjOCAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvcnNwLmMKKysrIGIvbmV0L25mYy9uY2kvcnNwLmMKQEAgLTI1LDYgKzI1LDggQEAKICAqCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAlczogIiBmbXQsIF9fZnVuY19fCisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtNDAsMTIgKzQyLDEzIEBACiB7CiAJc3RydWN0IG5jaV9jb3JlX3Jlc2V0X3JzcCAqcnNwID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4IiwgcnNwLT5zdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgcnNwLT5zdGF0dXMpOwogCi0JaWYgKHJzcC0+c3RhdHVzID09IE5DSV9TVEFUVVNfT0spCisJaWYgKHJzcC0+c3RhdHVzID09IE5DSV9TVEFUVVNfT0spIHsKIAkJbmRldi0+bmNpX3ZlciA9IHJzcC0+bmNpX3ZlcjsKLQotCW5mY19kYmcoIm5jaV92ZXIgMHgleCIsIG5kZXYtPm5jaV92ZXIpOworCQlwcl9kZWJ1ZygibmNpX3ZlciAweCV4LCBjb25maWdfc3RhdHVzIDB4JXhcbiIsCisJCQkgcnNwLT5uY2lfdmVyLCByc3AtPmNvbmZpZ19zdGF0dXMpOworCX0KIAogCW5jaV9yZXFfY29tcGxldGUobmRldiwgcnNwLT5zdGF0dXMpOwogfQpAQCAtNTUsMTYgKzU4LDE2IEBACiAJc3RydWN0IG5jaV9jb3JlX2luaXRfcnNwXzEgKnJzcF8xID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBuY2lfY29yZV9pbml0X3JzcF8yICpyc3BfMjsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHJzcF8xLT5zdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgcnNwXzEtPnN0YXR1cyk7CiAKIAlpZiAocnNwXzEtPnN0YXR1cyAhPSBOQ0lfU1RBVFVTX09LKQotCQlyZXR1cm47CisJCWdvdG8gZXhpdDsKIAogCW5kZXYtPm5mY2NfZmVhdHVyZXMgPSBfX2xlMzJfdG9fY3B1KHJzcF8xLT5uZmNjX2ZlYXR1cmVzKTsKIAluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgPSByc3BfMS0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzOwogCiAJaWYgKG5kZXYtPm51bV9zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcyA+Ci0JCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVMpIHsKKwkJCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVMpIHsKIAkJbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzID0KIAkJCU5DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVM7CiAJfQpAQCAtNzMsNjggKzc2LDU4IEBACiAJCXJzcF8xLT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcywKIAkJbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKIAotCXJzcF8yID0gKHZvaWQgKikgKHNrYi0+ZGF0YSArIDYgKyBuZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOworCXJzcF8yID0gKHZvaWQgKikgKHNrYi0+ZGF0YSArIDYgKyByc3BfMS0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKIAogCW5kZXYtPm1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zID0KIAkJcnNwXzItPm1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zOwogCW5kZXYtPm1heF9yb3V0aW5nX3RhYmxlX3NpemUgPQogCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5tYXhfcm91dGluZ190YWJsZV9zaXplKTsKLQluZGV2LT5tYXhfY29udHJvbF9wYWNrZXRfcGF5bG9hZF9sZW5ndGggPQotCQlyc3BfMi0+bWF4X2NvbnRyb2xfcGFja2V0X3BheWxvYWRfbGVuZ3RoOwotCW5kZXYtPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUgPQotCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5yZl9zZW5kaW5nX2J1ZmZlcl9zaXplKTsKLQluZGV2LT5yZl9yZWNlaXZpbmdfYnVmZmVyX3NpemUgPQotCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5yZl9yZWNlaXZpbmdfYnVmZmVyX3NpemUpOwotCW5kZXYtPm1hbnVmYWN0dXJlcl9pZCA9Ci0JCV9fbGUxNl90b19jcHUocnNwXzItPm1hbnVmYWN0dXJlcl9pZCk7Ci0KLQluZmNfZGJnKCJuZmNjX2ZlYXR1cmVzIDB4JXgiLAotCQluZGV2LT5uZmNjX2ZlYXR1cmVzKTsKLQluZmNfZGJnKCJudW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgJWQiLAotCQluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1swXSk7Ci0JbmZjX2RiZygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleCIsCi0JCW5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKLQluZmNfZGJnKCJzdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1syXSAweCV4IiwKLQkJbmRldi0+c3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0pOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1szXSk7Ci0JbmZjX2RiZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWQiLAotCQluZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7Ci0JbmZjX2RiZygibWF4X3JvdXRpbmdfdGFibGVfc2l6ZSAlZCIsCi0JCW5kZXYtPm1heF9yb3V0aW5nX3RhYmxlX3NpemUpOwotCW5mY19kYmcoIm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCAlZCIsCi0JCW5kZXYtPm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCk7Ci0JbmZjX2RiZygicmZfc2VuZGluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUpOwotCW5mY19kYmcoInJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSk7Ci0JbmZjX2RiZygibWFudWZhY3R1cmVyX2lkIDB4JXgiLAotCQluZGV2LT5tYW51ZmFjdHVyZXJfaWQpOwotCi0JbmNpX3JlcV9jb21wbGV0ZShuZGV2LCByc3BfMS0+c3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5jaV9jb3JlX2Nvbm5fY3JlYXRlX3JzcCAqcnNwID0gKHZvaWQgKikgc2tiLT5kYXRhOwotCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4IiwgcnNwLT5zdGF0dXMpOwotCi0JaWYgKHJzcC0+c3RhdHVzICE9IE5DSV9TVEFUVVNfT0spCi0JCXJldHVybjsKLQotCW5kZXYtPm1heF9wa3RfcGF5bG9hZF9zaXplID0gcnNwLT5tYXhfcGt0X3BheWxvYWRfc2l6ZTsKLQluZGV2LT5pbml0aWFsX251bV9jcmVkaXRzID0gcnNwLT5pbml0aWFsX251bV9jcmVkaXRzOwotCW5kZXYtPmNvbm5faWQgPSByc3AtPmNvbm5faWQ7CisJbmRldi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuID0KKwkJcnNwXzItPm1heF9jdHJsX3BrdF9wYXlsb2FkX2xlbjsKKwluZGV2LT5tYXhfc2l6ZV9mb3JfbGFyZ2VfcGFyYW1zID0KKwkJX19sZTE2X3RvX2NwdShyc3BfMi0+bWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtcyk7CisJbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSA9CisJCXJzcF8yLT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplOworCW5kZXYtPmluaXRpYWxfbnVtX2NyZWRpdHMgPQorCQlyc3BfMi0+aW5pdGlhbF9udW1fY3JlZGl0czsKKwluZGV2LT5tYW51ZmFjdF9pZCA9CisJCXJzcF8yLT5tYW51ZmFjdF9pZDsKKwluZGV2LT5tYW51ZmFjdF9zcGVjaWZpY19pbmZvID0KKwkJX19sZTMyX3RvX2NwdShyc3BfMi0+bWFudWZhY3Rfc3BlY2lmaWNfaW5mbyk7CiAKIAlhdG9taWNfc2V0KCZuZGV2LT5jcmVkaXRzX2NudCwgbmRldi0+aW5pdGlhbF9udW1fY3JlZGl0cyk7CiAKLQluZmNfZGJnKCJtYXhfcGt0X3BheWxvYWRfc2l6ZSAlZCIsIG5kZXYtPm1heF9wa3RfcGF5bG9hZF9zaXplKTsKLQluZmNfZGJnKCJpbml0aWFsX251bV9jcmVkaXRzICVkIiwgbmRldi0+aW5pdGlhbF9udW1fY3JlZGl0cyk7Ci0JbmZjX2RiZygiY29ubl9pZCAlZCIsIG5kZXYtPmNvbm5faWQpOworCXByX2RlYnVnKCJuZmNjX2ZlYXR1cmVzIDB4JXhcbiIsCisJCSBuZGV2LT5uZmNjX2ZlYXR1cmVzKTsKKwlwcl9kZWJ1ZygibnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzICVkXG4iLAorCQkgbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMF0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzJdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbM10gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdKTsKKwlwcl9kZWJ1ZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWRcbiIsCisJCSBuZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7CisJcHJfZGVidWcoIm1heF9yb3V0aW5nX3RhYmxlX3NpemUgJWRcbiIsCisJCSBuZGV2LT5tYXhfcm91dGluZ190YWJsZV9zaXplKTsKKwlwcl9kZWJ1ZygibWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuICVkXG4iLAorCQkgbmRldi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuKTsKKwlwcl9kZWJ1ZygibWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtcyAlZFxuIiwKKwkJIG5kZXYtPm1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXMpOworCXByX2RlYnVnKCJtYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplICVkXG4iLAorCQkgbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSk7CisJcHJfZGVidWcoImluaXRpYWxfbnVtX2NyZWRpdHMgJWRcbiIsCisJCSBuZGV2LT5pbml0aWFsX251bV9jcmVkaXRzKTsKKwlwcl9kZWJ1ZygibWFudWZhY3RfaWQgMHgleFxuIiwKKwkJIG5kZXYtPm1hbnVmYWN0X2lkKTsKKwlwcl9kZWJ1ZygibWFudWZhY3Rfc3BlY2lmaWNfaW5mbyAweCV4XG4iLAorCQkgbmRldi0+bWFudWZhY3Rfc3BlY2lmaWNfaW5mbyk7CisKK2V4aXQ6CisJbmNpX3JlcV9jb21wbGV0ZShuZGV2LCByc3BfMS0+c3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgbmNpX3JmX2Rpc2NfbWFwX3JzcF9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCkBAIC0xNDIsNyArMTM1LDcgQEAKIHsKIAlfX3U4IHN0YXR1cyA9IHNrYi0+ZGF0YVswXTsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOwogCiAJbmNpX3JlcV9jb21wbGV0ZShuZGV2LCBzdGF0dXMpOwogfQpAQCAtMTUxLDcgKzE0NCw3IEBACiB7CiAJX191OCBzdGF0dXMgPSBza2ItPmRhdGFbMF07CiAKLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgPT0gTkNJX1NUQVRVU19PSykKIAkJc2V0X2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwpAQCAtMTY0LDcgKzE1Nyw3IEBACiB7CiAJX191OCBzdGF0dXMgPSBza2ItPmRhdGFbMF07CiAKLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworCXByX2RlYnVnKCJzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKIAogCWNsZWFyX2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwogCkBAIC0xNzgsMTEgKzE3MSwxMSBAQAogCS8qIHdlIGdvdCBhIHJzcCwgc3RvcCB0aGUgY21kIHRpbWVyICovCiAJZGVsX3RpbWVyKCZuZGV2LT5jbWRfdGltZXIpOwogCi0JbmZjX2RiZygiTkNJIFJYOiBNVD1yc3AsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkIiwKLQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCW5jaV9vcGNvZGVfZ2lkKHJzcF9vcGNvZGUpLAotCQkJbmNpX29wY29kZV9vaWQocnNwX29wY29kZSksCi0JCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwlwcl9kZWJ1ZygiTkNJIFJYOiBNVD1yc3AsIFBCRj0lZCwgR0lEPTB4JXgsIE9JRD0weCV4LCBwbGVuPSVkXG4iLAorCQkgbmNpX3BiZihza2ItPmRhdGEpLAorCQkgbmNpX29wY29kZV9naWQocnNwX29wY29kZSksCisJCSBuY2lfb3Bjb2RlX29pZChyc3Bfb3Bjb2RlKSwKKwkJIG5jaV9wbGVuKHNrYi0+ZGF0YSkpOwogCiAJLyogc3RyaXAgdGhlIG5jaSBjb250cm9sIGhlYWRlciAqLwogCXNrYl9wdWxsKHNrYiwgTkNJX0NUUkxfSERSX1NJWkUpOwpAQCAtMTk2LDEwICsxODksNiBAQAogCQluY2lfY29yZV9pbml0X3JzcF9wYWNrZXQobmRldiwgc2tiKTsKIAkJYnJlYWs7CiAKLQljYXNlIE5DSV9PUF9DT1JFX0NPTk5fQ1JFQVRFX1JTUDoKLQkJbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwX3BhY2tldChuZGV2LCBza2IpOwotCQlicmVhazsKLQogCWNhc2UgTkNJX09QX1JGX0RJU0NPVkVSX01BUF9SU1A6CiAJCW5jaV9yZl9kaXNjX21hcF9yc3BfcGFja2V0KG5kZXYsIHNrYik7CiAJCWJyZWFrOwpAQCAtMjEzLDcgKzIwMiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5rbm93biByc3Agb3Bjb2RlIDB4JXgiLCByc3Bfb3Bjb2RlKTsKKwkJcHJfZXJyKCJ1bmtub3duIHJzcCBvcGNvZGUgMHgleFxuIiwgcnNwX29wY29kZSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uZXRsaW5rLmMgYi9uZXQvbmZjL25ldGxpbmsuYwppbmRleCAwM2Y4ODE4Li40M2ExYzQ3IDEwMDY0NAotLS0gYS9uZXQvbmZjL25ldGxpbmsuYworKysgYi9uZXQvbmZjL25ldGxpbmsuYwpAQCAtMjEsNiArMjEsOCBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICVzOiAiIGZtdCwgX19mdW5jX18KKwogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZmMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NCw2ICs0Niw4IEBACiAJW05GQ19BVFRSX0RFVklDRV9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfU1RSSU5HLAogCQkJCS5sZW4gPSBORkNfREVWSUNFX05BTUVfTUFYU0laRSB9LAogCVtORkNfQVRUUl9QUk9UT0NPTFNdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZDX0FUVFJfQ09NTV9NT0RFXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbTkZDX0FUVFJfUkZfTU9ERV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCiB9OwogCiBzdGF0aWMgaW50IG5mY19nZW5sX3NlbmRfdGFyZ2V0KHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZmNfdGFyZ2V0ICp0YXJnZXQsCkBAIC01MSw4ICs1NSw2IEBACiB7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKIAkJCQkmbmZjX2dlbmxfZmFtaWx5LCBmbGFncywgTkZDX0NNRF9HRVRfVEFSR0VUKTsKIAlpZiAoIWhkcikKQEAgLTEwNSw4ICsxMDcsNiBAQAogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CiAJaW50IHJjOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghZGV2KSB7CiAJCWRldiA9IF9fZ2V0X2RldmljZV9mcm9tX2NiKGNiKTsKIAkJaWYgKElTX0VSUihkZXYpKQpAQCAtMTM5LDggKzEzOSw2IEBACiB7CiAJc3RydWN0IG5mY19kZXYgKmRldiA9IChzdHJ1Y3QgbmZjX2RldiAqKSBjYi0+YXJnc1sxXTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoZGV2KQogCQluZmNfcHV0X2RldmljZShkZXYpOwogCkBAIC0xNTIsOCArMTUwLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXZvaWQgKmhkcjsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlkZXYtPmdlbmxfZGF0YS5wb2xsX3JlcV9waWQgPSAwOwogCiAJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfQVRPTUlDKTsKQEAgLTE4Myw4ICsxNzksNiBAQAogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjE2LDggKzIxMCw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1zZykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNDksOCArMjQxLDYgQEAKIHsKIAl2b2lkICpoZHI7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwaWQsIHNlcSwgJm5mY19nZW5sX2ZhbWlseSwgZmxhZ3MsCiAJCQkJCQkJTkZDX0NNRF9HRVRfREVWSUNFKTsKIAlpZiAoIWhkcikKQEAgLTI3Nyw4ICsyNjcsNiBAQAogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CiAJYm9vbCBmaXJzdF9jYWxsID0gZmFsc2U7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCFpdGVyKSB7CiAJCWZpcnN0X2NhbGwgPSB0cnVlOwogCQlpdGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNsYXNzX2Rldl9pdGVyKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMTksMTQgKzMwNyw4MSBAQAogewogCXN0cnVjdCBjbGFzc19kZXZfaXRlciAqaXRlciA9IChzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKikgY2ItPmFyZ3NbMF07CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJbmZjX2RldmljZV9pdGVyX2V4aXQoaXRlcik7CiAJa2ZyZWUoaXRlcik7CiAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG5mY19nZW5sX2RlcF9saW5rX3VwX2V2ZW50KHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4LAorCQkJCQkJdTggY29tbV9tb2RlLCB1OCByZl9tb2RlKQoreworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCisJcHJfZGVidWcoIkRFUCBsaW5rIGlzIHVwXG4iKTsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCAwLCAwLCAmbmZjX2dlbmxfZmFtaWx5LCAwLAorCQkJCU5GQ19DTURfREVQX0xJTktfVVApOworCWlmICghaGRyKQorCQlnb3RvIGZyZWVfbXNnOworCisJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9ERVZJQ0VfSU5ERVgsIGRldi0+aWR4KTsKKwlpZiAocmZfbW9kZSA9PSBORkNfUkZfSU5JVElBVE9SKQorCQlOTEFfUFVUX1UzMihtc2csIE5GQ19BVFRSX1RBUkdFVF9JTkRFWCwgdGFyZ2V0X2lkeCk7CisJTkxBX1BVVF9VOChtc2csIE5GQ19BVFRSX0NPTU1fTU9ERSwgY29tbV9tb2RlKTsKKwlOTEFfUFVUX1U4KG1zZywgTkZDX0FUVFJfUkZfTU9ERSwgcmZfbW9kZSk7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlkZXYtPmRlcF9saW5rX3VwID0gdHJ1ZTsKKworCWdlbmxtc2dfbXVsdGljYXN0KG1zZywgMCwgbmZjX2dlbmxfZXZlbnRfbWNncnAuaWQsIEdGUF9BVE9NSUMpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CitmcmVlX21zZzoKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworaW50IG5mY19nZW5sX2RlcF9saW5rX2Rvd25fZXZlbnQoc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCXByX2RlYnVnKCJERVAgbGluayBpcyBkb3duXG4iKTsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCAwLCAwLCAmbmZjX2dlbmxfZmFtaWx5LCAwLAorCQkJCU5GQ19DTURfREVQX0xJTktfRE9XTik7CisJaWYgKCFoZHIpCisJCWdvdG8gZnJlZV9tc2c7CisKKwlOTEFfUFVUX1UzMihtc2csIE5GQ19BVFRSX0RFVklDRV9JTkRFWCwgZGV2LT5pZHgpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJZ2VubG1zZ19tdWx0aWNhc3QobXNnLCAwLCBuZmNfZ2VubF9ldmVudF9tY2dycC5pZCwgR0ZQX0FUT01JQyk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKK2ZyZWVfbXNnOgorCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCiBzdGF0aWMgaW50IG5mY19nZW5sX2dldF9kZXZpY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwpAQCAtMzM0LDggKzM4OSw2IEBACiAJdTMyIGlkeDsKIAlpbnQgcmMgPSAtRU5PQlVGUzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNzMsOCArNDI2LDYgQEAKIAlpbnQgcmM7CiAJdTMyIGlkeDsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zOTYsOCArNDQ3LDYgQEAKIAlpbnQgcmM7CiAJdTMyIGlkeDsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00MjAsNyArNDY5LDcgQEAKIAl1MzIgaWR4OwogCXUzMiBwcm90b2NvbHM7CiAKLQluZmNfZGJnKCJlbnRyeSIpOworCXByX2RlYnVnKCJQb2xsIHN0YXJ0XG4iKTsKIAogCWlmICghaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSB8fAogCQkhaW5mby0+YXR0cnNbTkZDX0FUVFJfUFJPVE9DT0xTXSkKQEAgLTQ1MSw4ICs1MDAsNiBAQAogCWludCByYzsKIAl1MzIgaWR4OwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTQ3OCw2ICs1MjUsNjcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgbmZjX2dlbmxfZGVwX2xpbmtfdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCWludCByYywgdGd0X2lkeDsKKwl1MzIgaWR4OworCXU4IGNvbW0sIHJmOworCisJcHJfZGVidWcoIkRFUCBsaW5rIHVwXG4iKTsKKworCWlmICghaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSB8fAorCQkJIWluZm8tPmF0dHJzW05GQ19BVFRSX0NPTU1fTU9ERV0gfHwKKwkJCSFpbmZvLT5hdHRyc1tORkNfQVRUUl9SRl9NT0RFXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKTsKKwlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX1RBUkdFVF9JTkRFWF0pCisJCXRndF9pZHggPSBORkNfVEFSR0VUX0lEWF9BTlk7CisJZWxzZQorCQl0Z3RfaWR4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfVEFSR0VUX0lOREVYXSk7CisKKwljb21tID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tORkNfQVRUUl9DT01NX01PREVdKTsKKwlyZiA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkZDX0FUVFJfUkZfTU9ERV0pOworCisJaWYgKGNvbW0gIT0gTkZDX0NPTU1fQUNUSVZFICYmIGNvbW0gIT0gTkZDX0NPTU1fUEFTU0lWRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmYgIT0gTkZDX1JGX0lOSVRJQVRPUiAmJiBjb21tICE9IE5GQ19SRl9UQVJHRVQpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gbmZjX2dldF9kZXZpY2UoaWR4KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IG5mY19kZXBfbGlua191cChkZXYsIHRndF9pZHgsIGNvbW0sIHJmKTsKKworCW5mY19wdXRfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmZjX2dlbmxfZGVwX2xpbmtfZG93bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisJaW50IHJjOworCXUzMiBpZHg7CisKKwlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSk7CisKKwlkZXYgPSBuZmNfZ2V0X2RldmljZShpZHgpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjID0gbmZjX2RlcF9saW5rX2Rvd24oZGV2KTsKKworCW5mY19wdXRfZGV2aWNlKGRldik7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgc3RydWN0IGdlbmxfb3BzIG5mY19nZW5sX29wc1tdID0gewogCXsKIAkJLmNtZCA9IE5GQ19DTURfR0VUX0RFVklDRSwKQEAgLTUwNyw2ICs2MTUsMTYgQEAKIAkJLnBvbGljeSA9IG5mY19nZW5sX3BvbGljeSwKIAl9LAogCXsKKwkJLmNtZCA9IE5GQ19DTURfREVQX0xJTktfVVAsCisJCS5kb2l0ID0gbmZjX2dlbmxfZGVwX2xpbmtfdXAsCisJCS5wb2xpY3kgPSBuZmNfZ2VubF9wb2xpY3ksCisJfSwKKwl7CisJCS5jbWQgPSBORkNfQ01EX0RFUF9MSU5LX0RPV04sCisJCS5kb2l0ID0gbmZjX2dlbmxfZGVwX2xpbmtfZG93biwKKwkJLnBvbGljeSA9IG5mY19nZW5sX3BvbGljeSwKKwl9LAorCXsKIAkJLmNtZCA9IE5GQ19DTURfR0VUX1RBUkdFVCwKIAkJLmR1bXBpdCA9IG5mY19nZW5sX2R1bXBfdGFyZ2V0cywKIAkJLmRvbmUgPSBuZmNfZ2VubF9kdW1wX3RhcmdldHNfZG9uZSwKQEAgLTUyNCwxOCArNjQyLDE2IEBACiAJaWYgKGV2ZW50ICE9IE5FVExJTktfVVJFTEVBU0UgfHwgbi0+cHJvdG9jb2wgIT0gTkVUTElOS19HRU5FUklDKQogCQlnb3RvIG91dDsKIAotCW5mY19kYmcoIk5FVExJTktfVVJFTEVBU0UgZXZlbnQgZnJvbSBpZCAlZCIsIG4tPnBpZCk7CisJcHJfZGVidWcoIk5FVExJTktfVVJFTEVBU0UgZXZlbnQgZnJvbSBpZCAlZFxuIiwgbi0+cGlkKTsKIAogCW5mY19kZXZpY2VfaXRlcl9pbml0KCZpdGVyKTsKIAlkZXYgPSBuZmNfZGV2aWNlX2l0ZXJfbmV4dCgmaXRlcik7CiAKIAl3aGlsZSAoZGV2KSB7Ci0JCW11dGV4X2xvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CiAJCWlmIChkZXYtPmdlbmxfZGF0YS5wb2xsX3JlcV9waWQgPT0gbi0+cGlkKSB7CiAJCQluZmNfc3RvcF9wb2xsKGRldik7CiAJCQlkZXYtPmdlbmxfZGF0YS5wb2xsX3JlcV9waWQgPSAwOwogCQl9Ci0JCW11dGV4X3VubG9jaygmZGV2LT5nZW5sX2RhdGEuZ2VubF9kYXRhX211dGV4KTsKIAkJZGV2ID0gbmZjX2RldmljZV9pdGVyX25leHQoJml0ZXIpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uZmMuaCBiL25ldC9uZmMvbmZjLmgKaW5kZXggYjY3NTNmNC4uMmMyYzQwMSAxMDA2NDQKLS0tIGEvbmV0L25mYy9uZmMuaAorKysgYi9uZXQvbmZjL25mYy5oCkBAIC0yNywxMyArMjcsNiBAQAogI2luY2x1ZGUgPG5ldC9uZmMvbmZjLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAotX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLWludCBuZmNfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgbmZjX2luZm8oZm10LCBhcmcuLi4pIG5mY19wcmludGsoS0VSTl9JTkZPLCBmbXQsICMjYXJnKQotI2RlZmluZSBuZmNfZXJyKGZtdCwgYXJnLi4uKSBuZmNfcHJpbnRrKEtFUk5fRVJSLCBmbXQsICMjYXJnKQotI2RlZmluZSBuZmNfZGJnKGZtdCwgYXJnLi4uKSBwcl9kZWJ1ZyhmbXQgIlxuIiwgIyNhcmcpCi0KIHN0cnVjdCBuZmNfcHJvdG9jb2wgewogCWludCBpZDsKIAlzdHJ1Y3QgcHJvdG8gKnByb3RvOwpAQCAtNTMsNiArNDYsNjAgQEAKICNkZWZpbmUgdG9fcmF3c29ja19zayhfdHhfd29yaykgXAogCSgoc3RydWN0IHNvY2sgKikgY29udGFpbmVyX29mKF90eF93b3JrLCBzdHJ1Y3QgbmZjX3Jhd3NvY2ssIHR4X3dvcmspKQogCisjaWZkZWYgQ09ORklHX05GQ19MTENQCisKK3ZvaWQgbmZjX2xsY3BfbWFjX2lzX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldik7Cit2b2lkIG5mY19sbGNwX21hY19pc191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSk7CitpbnQgbmZjX2xsY3BfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwordm9pZCBuZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKK2ludCBuZmNfbGxjcF9zZXRfcmVtb3RlX2diKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHU4ICpnYiwgdTggZ2JfbGVuKTsKK3U4ICpuZmNfbGxjcF9nZW5lcmFsX2J5dGVzKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHU4ICpnZW5lcmFsX2J5dGVzX2xlbik7CitpbnQgX19pbml0IG5mY19sbGNwX2luaXQodm9pZCk7Cit2b2lkIG5mY19sbGNwX2V4aXQodm9pZCk7CisKKyNlbHNlCisKK3ZvaWQgbmZjX2xsY3BfbWFjX2lzX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldikKK3sKK30KKwordm9pZCBuZmNfbGxjcF9tYWNfaXNfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mY19sbGNwX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZjX2xsY3BfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5mY19kZXYgKmRldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZjX2xsY3Bfc2V0X3JlbW90ZV9nYihzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2IsIHU4IGdiX2xlbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1OCAqbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2JfbGVuKQoreworCSpnYl9sZW4gPSAwOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZmNfbGxjcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZmNfbGxjcF9leGl0KHZvaWQpCit7Cit9CisKKyNlbmRpZgorCiBpbnQgX19pbml0IHJhd3NvY2tfaW5pdCh2b2lkKTsKIHZvaWQgcmF3c29ja19leGl0KHZvaWQpOwogCkBAIC03NSw2ICsxMjIsMTAgQEAKIGludCBuZmNfZ2VubF9kZXZpY2VfYWRkZWQoc3RydWN0IG5mY19kZXYgKmRldik7CiBpbnQgbmZjX2dlbmxfZGV2aWNlX3JlbW92ZWQoc3RydWN0IG5mY19kZXYgKmRldik7CiAKK2ludCBuZmNfZ2VubF9kZXBfbGlua191cF9ldmVudChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCSAgICAgICB1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworaW50IG5mY19nZW5sX2RlcF9saW5rX2Rvd25fZXZlbnQoc3RydWN0IG5mY19kZXYgKmRldik7CisKIHN0cnVjdCBuZmNfZGV2ICpuZmNfZ2V0X2RldmljZSh1bnNpZ25lZCBpZHgpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZjX3B1dF9kZXZpY2Uoc3RydWN0IG5mY19kZXYgKmRldikKQEAgLTEwOSw2ICsxNjAsMTEgQEAKIAogaW50IG5mY19zdG9wX3BvbGwoc3RydWN0IG5mY19kZXYgKmRldik7CiAKK2ludCBuZmNfZGVwX2xpbmtfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgaW50IHRhcmdldF9pZHgsCisJCQkJdTggY29tbV9tb2RlLCB1OCByZl9tb2RlKTsKKworaW50IG5mY19kZXBfbGlua19kb3duKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworCiBpbnQgbmZjX2FjdGl2YXRlX3RhcmdldChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwgdTMyIHByb3RvY29sKTsKIAogaW50IG5mY19kZWFjdGl2YXRlX3RhcmdldChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCk7CmRpZmYgLS1naXQgYS9uZXQvbmZjL3Jhd3NvY2suYyBiL25ldC9uZmMvcmF3c29jay5jCmluZGV4IDlmZDY1MmEuLjJlMmY4YzYgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvcmF3c29jay5jCisrKyBiL25ldC9uZmMvcmF3c29jay5jCkBAIC0yMSwxNCArMjEsMTcgQEAKICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAlczogIiBmbXQsIF9fZnVuY19fCisKICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAibmZjLmgiCiAKIHN0YXRpYyB2b2lkIHJhd3NvY2tfd3JpdGVfcXVldWVfcHVyZ2Uoc3RydWN0IHNvY2sgKnNrKQogewotCW5mY19kYmcoInNrPSVwIiwgc2spOworCXByX2RlYnVnKCJzaz0lcFxuIiwgc2spOwogCiAJc3Bpbl9sb2NrX2JoKCZzay0+c2tfd3JpdGVfcXVldWUubG9jayk7CiAJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CkBAIC0zOCw3ICs0MSw3IEBACiAKIHN0YXRpYyB2b2lkIHJhd3NvY2tfcmVwb3J0X2Vycm9yKHN0cnVjdCBzb2NrICpzaywgaW50IGVycikKIHsKLQluZmNfZGJnKCJzaz0lcCBlcnI9JWQiLCBzaywgZXJyKTsKKwlwcl9kZWJ1Zygic2s9JXAgZXJyPSVkXG4iLCBzaywgZXJyKTsKIAogCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CiAJc2stPnNrX2VyciA9IC1lcnI7CkBAIC01MSw3ICs1NCw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAKLQluZmNfZGJnKCJzb2NrPSVwIiwgc29jayk7CisJcHJfZGVidWcoInNvY2s9JXBcbiIsIHNvY2spOwogCiAJc29ja19vcnBoYW4oc2spOwogCXNvY2tfcHV0KHNrKTsKQEAgLTY3LDE0ICs3MCwxNCBAQAogCXN0cnVjdCBuZmNfZGV2ICpkZXY7CiAJaW50IHJjID0gMDsKIAotCW5mY19kYmcoInNvY2s9JXAgc2s9JXAgZmxhZ3M9JWQiLCBzb2NrLCBzaywgZmxhZ3MpOworCXByX2RlYnVnKCJzb2NrPSVwIHNrPSVwIGZsYWdzPSVkXG4iLCBzb2NrLCBzaywgZmxhZ3MpOwogCiAJaWYgKCFhZGRyIHx8IGxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmZjKSB8fAogCQlhZGRyLT5zYV9mYW1pbHkgIT0gQUZfTkZDKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW5mY19kYmcoImFkZHIgZGV2X2lkeD0ldSB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1IiwgYWRkci0+ZGV2X2lkeCwKLQkJCQkJYWRkci0+dGFyZ2V0X2lkeCwgYWRkci0+bmZjX3Byb3RvY29sKTsKKwlwcl9kZWJ1ZygiYWRkciBkZXZfaWR4PSV1IHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXVcbiIsCisJCSBhZGRyLT5kZXZfaWR4LCBhZGRyLT50YXJnZXRfaWR4LCBhZGRyLT5uZmNfcHJvdG9jb2wpOwogCiAJbG9ja19zb2NrKHNrKTsKIApAQCAtMTM1LDcgKzEzOCw3IEBACiAKIAlCVUdfT04oaW5faXJxKCkpOwogCi0JbmZjX2RiZygic2s9JXAgZXJyPSVkIiwgc2ssIGVycik7CisJcHJfZGVidWcoInNrPSVwIGVycj0lZFxuIiwgc2ssIGVycik7CiAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yOwpAQCAtMTcxLDcgKzE3NCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJzaz0lcCB0YXJnZXRfaWR4PSV1Iiwgc2ssIHRhcmdldF9pZHgpOworCXByX2RlYnVnKCJzaz0lcCB0YXJnZXRfaWR4PSV1XG4iLCBzaywgdGFyZ2V0X2lkeCk7CiAKIAlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikgewogCQlyYXdzb2NrX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKQEAgLTE5Nyw3ICsyMDAsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJjOwogCi0JbmZjX2RiZygic29jaz0lcCBzaz0lcCBsZW49JXp1Iiwgc29jaywgc2ssIGxlbik7CisJcHJfZGVidWcoInNvY2s9JXAgc2s9JXAgbGVuPSV6dVxuIiwgc29jaywgc2ssIGxlbik7CiAKIAlpZiAobXNnLT5tc2dfbmFtZWxlbikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMjA1LDEzICsyMDgsMTAgQEAKIAlpZiAoc29jay0+c3RhdGUgIT0gU1NfQ09OTkVDVEVEKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCi0Jc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuICsgZGV2LT50eF9oZWFkcm9vbSArIGRldi0+dHhfdGFpbHJvb20gKyBORkNfSEVBREVSX1NJWkUsCi0JCQkJCW1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmcmMpOwotCWlmICghc2tiKQorCXNrYiA9IG5mY19hbGxvY19zZW5kX3NrYihkZXYsIHNrLCBtc2ctPm1zZ19mbGFncywgbGVuLCAmcmMpOworCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIHJjOwogCi0Jc2tiX3Jlc2VydmUoc2tiLCBkZXYtPnR4X2hlYWRyb29tICsgTkZDX0hFQURFUl9TSVpFKTsKLQogCXJjID0gbWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgbGVuKSwgbXNnLT5tc2dfaW92LCBsZW4pOwogCWlmIChyYyA8IDApIHsKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAlpbnQgY29waWVkOwogCWludCByYzsKIAotCW5mY19kYmcoInNvY2s9JXAgc2s9JXAgbGVuPSV6dSBmbGFncz0lZCIsIHNvY2ssIHNrLCBsZW4sIGZsYWdzKTsKKwlwcl9kZWJ1Zygic29jaz0lcCBzaz0lcCBsZW49JXp1IGZsYWdzPSVkXG4iLCBzb2NrLCBzaywgbGVuLCBmbGFncyk7CiAKIAlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZyYyk7CiAJaWYgKCFza2IpCkBAIC0yODIsNyArMjgyLDcgQEAKIAogc3RhdGljIHZvaWQgcmF3c29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JbmZjX2RiZygic2s9JXAiLCBzayk7CisJcHJfZGVidWcoInNrPSVwXG4iLCBzayk7CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCkgewogCQluZmNfZGVhY3RpdmF0ZV90YXJnZXQobmZjX3Jhd3NvY2soc2spLT5kZXYsCkBAIC0yOTMsNyArMjkzLDcgQEAKIAlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7Ci0JCW5mY19lcnIoIkZyZWVpbmcgYWxpdmUgTkZDIHJhdyBzb2NrZXQgJXAiLCBzayk7CisJCXByX2VycigiRnJlZWluZyBhbGl2ZSBORkMgcmF3IHNvY2tldCAlcFxuIiwgc2spOwogCQlyZXR1cm47CiAJfQogfQpAQCAtMzAzLDE0ICszMDMsMTQgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKLQluZmNfZGJnKCJzb2NrPSVwIiwgc29jayk7CisJcHJfZGVidWcoInNvY2s9JXBcbiIsIHNvY2spOwogCiAJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpCiAJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOwogCiAJc29jay0+b3BzID0gJnJhd3NvY2tfb3BzOwogCi0Jc2sgPSBza19hbGxvYyhuZXQsIFBGX05GQywgR0ZQX0tFUk5FTCwgbmZjX3Byb3RvLT5wcm90byk7CisJc2sgPSBza19hbGxvYyhuZXQsIFBGX05GQywgR0ZQX0FUT01JQywgbmZjX3Byb3RvLT5wcm90byk7CiAJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IDAzYmI0NWEuLjgyYTZmMzQgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJKCgoeCktPmthY3RpdmVfYmxrX251bSA8ICgoeCktPmtudW1fYmxvY2tzLTEpKSA/IFwKIAkoKHgpLT5rYWN0aXZlX2Jsa19udW0rMSkgOiAwKQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrZXRfc29jayAqcGt0X3NrKHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBrdF9zayhzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIChzdHJ1Y3QgcGFja2V0X3NvY2sgKilzazsKIH0KQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCXJldHVybiBoLnJhdzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwYWNrZXRfY3VycmVudF9mcmFtZShzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgKnBhY2tldF9jdXJyZW50X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCXN0cnVjdCBwYWNrZXRfcmluZ19idWZmZXIgKnJiLAogCQlpbnQgc3RhdHVzKQogewpAQCAtNzE1LDcgKzcxNSw3IEBACiAJc3Bpbl91bmxvY2soJnBvLT5zay5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2ZsdXNoX2Jsb2NrKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjMSwKK3N0YXRpYyB2b2lkIHByYl9mbHVzaF9ibG9jayhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYzEsCiAJCXN0cnVjdCB0cGFja2V0X2Jsb2NrX2Rlc2MgKnBiZDEsIF9fdTMyIHN0YXR1cykKIHsKIAkvKiBGbHVzaCBldmVyeXRoaW5nIG1pbnVzIHRoZSBibG9jayBoZWFkZXIgKi8KQEAgLTc5Myw3ICs3OTMsNyBAQAogCXBrYzEtPmthY3RpdmVfYmxrX251bSA9IEdFVF9ORVhUX1BSQl9CTEtfTlVNKHBrYzEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX3RoYXdfcXVldWUoc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MpCitzdGF0aWMgdm9pZCBwcmJfdGhhd19xdWV1ZShzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKIHsKIAlwa2MtPnJlc2V0X3BlbmRpbmdfb25fY3Vycl9ibGsgPSAwOwogfQpAQCAtODY5LDcgKzg2OSw3IEBACiAgKiAgICAgICAgIGNhc2UgYW5kIF9fcGFja2V0X2xvb2t1cF9mcmFtZV9pbl9ibG9jayB3aWxsIGNoZWNrIGlmIGJsb2NrLTAKICAqICAgICAgICAgaXMgZnJlZSBhbmQgY2FuIG5vdyBiZSByZS11c2VkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2ZyZWV6ZV9xdWV1ZShzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9mcmVlemVfcXVldWUoc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQkJICBzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvKQogewogCXBrYy0+cmVzZXRfcGVuZGluZ19vbl9jdXJyX2JsayA9IDE7CkBAIC05NDAsMzYgKzk0MCwzNiBAQAogCUJVRygpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmJfY3Vycl9ibGtfaW5fdXNlKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjLAorc3RhdGljIGludCBwcmJfY3Vycl9ibGtfaW5fdXNlKHN0cnVjdCB0cGFja2V0X2tiZHFfY29yZSAqcGtjLAogCQkJCSAgICAgIHN0cnVjdCB0cGFja2V0X2Jsb2NrX2Rlc2MgKnBiZCkKIHsKIAlyZXR1cm4gVFBfU1RBVFVTX1VTRVIgJiBCTE9DS19TVEFUVVMocGJkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJiX3F1ZXVlX2Zyb3plbihzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKK3N0YXRpYyBpbnQgcHJiX3F1ZXVlX2Zyb3plbihzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYykKIHsKIAlyZXR1cm4gcGtjLT5yZXNldF9wZW5kaW5nX29uX2N1cnJfYmxrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2NsZWFyX2Jsa19maWxsX3N0YXR1cyhzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKK3N0YXRpYyB2b2lkIHByYl9jbGVhcl9ibGtfZmlsbF9zdGF0dXMoc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIpCiB7CiAJc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MgID0gR0VUX1BCRFFDX0ZST01fUkIocmIpOwogCWF0b21pY19kZWMoJnBrYy0+YmxrX2ZpbGxfaW5fcHJvZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmJfZmlsbF9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCitzdGF0aWMgdm9pZCBwcmJfZmlsbF9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQlzdHJ1Y3QgdHBhY2tldDNfaGRyICpwcGQpCiB7CiAJcHBkLT5odjEudHBfcnhoYXNoID0gc2tiX2dldF9yeGhhc2gocGtjLT5za2IpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJiX2NsZWFyX3J4aGFzaChzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9jbGVhcl9yeGhhc2goc3RydWN0IHRwYWNrZXRfa2JkcV9jb3JlICpwa2MsCiAJCQlzdHJ1Y3QgdHBhY2tldDNfaGRyICpwcGQpCiB7CiAJcHBkLT5odjEudHBfcnhoYXNoID0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHByYl9maWxsX3ZsYW5faW5mbyhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKK3N0YXRpYyB2b2lkIHByYl9maWxsX3ZsYW5faW5mbyhzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKIAkJCXN0cnVjdCB0cGFja2V0M19oZHIgKnBwZCkKIHsKIAlpZiAodmxhbl90eF90YWdfcHJlc2VudChwa2MtPnNrYikpIHsKQEAgLTk5MSw3ICs5OTEsNyBAQAogCQlwcmJfY2xlYXJfcnhoYXNoKHBrYywgcHBkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHByYl9maWxsX2N1cnJfYmxvY2soY2hhciAqY3VyciwKK3N0YXRpYyB2b2lkIHByYl9maWxsX2N1cnJfYmxvY2soY2hhciAqY3VyciwKIAkJCQlzdHJ1Y3QgdHBhY2tldF9rYmRxX2NvcmUgKnBrYywKIAkJCQlzdHJ1Y3QgdHBhY2tldF9ibG9ja19kZXNjICpwYmQsCiAJCQkJdW5zaWduZWQgaW50IGxlbikKQEAgLTEwNzEsNyArMTA3MSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGFja2V0X2N1cnJlbnRfcnhfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKK3N0YXRpYyB2b2lkICpwYWNrZXRfY3VycmVudF9yeF9mcmFtZShzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAogCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgIGludCBzdGF0dXMsIHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwcmJfbG9va3VwX2Jsb2NrKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCitzdGF0aWMgdm9pZCAqcHJiX2xvb2t1cF9ibG9jayhzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAogCQkJCSAgICAgc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgcHJldmlvdXMsCiAJCQkJICAgICBpbnQgc3RhdHVzKQpAQCAtMTEwNCw3ICsxMTA0LDcgQEAKIAlyZXR1cm4gcGJkOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmJfcHJldmlvdXNfYmxrX251bShzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKK3N0YXRpYyBpbnQgcHJiX3ByZXZpb3VzX2Jsa19udW0oc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIpCiB7CiAJdW5zaWduZWQgaW50IHByZXY7CiAJaWYgKHJiLT5wcmJfYmRxYy5rYWN0aXZlX2Jsa19udW0pCkBAIC0xMTE1LDcgKzExMTUsNyBAQAogfQogCiAvKiBBc3N1bWVzIGNhbGxlciBoYXMgaGVsZCB0aGUgcnhfcXVldWUubG9jayAqLwotc3RhdGljIGlubGluZSB2b2lkICpfX3ByYl9wcmV2aW91c19ibG9jayhzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgKl9fcHJiX3ByZXZpb3VzX2Jsb2NrKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSBzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYiwKIAkJCQkJIGludCBzdGF0dXMpCiB7CkBAIC0xMTIzLDcgKzExMjMsNyBAQAogCXJldHVybiBwcmJfbG9va3VwX2Jsb2NrKHBvLCByYiwgcHJldmlvdXMsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGFja2V0X3ByZXZpb3VzX3J4X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCitzdGF0aWMgdm9pZCAqcGFja2V0X3ByZXZpb3VzX3J4X2ZyYW1lKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSAgICAgc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCQkJCSAgICAgaW50IHN0YXR1cykKIHsKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJcmV0dXJuIF9fcHJiX3ByZXZpb3VzX2Jsb2NrKHBvLCByYiwgc3RhdHVzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBhY2tldF9pbmNyZW1lbnRfcnhfaGVhZChzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLAorc3RhdGljIHZvaWQgcGFja2V0X2luY3JlbWVudF9yeF9oZWFkKHN0cnVjdCBwYWNrZXRfc29jayAqcG8sCiAJCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpyYikKIHsKIAlzd2l0Y2ggKHBvLT50cF92ZXJzaW9uKSB7CkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpwYWNrZXRfcHJldmlvdXNfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKK3N0YXRpYyB2b2lkICpwYWNrZXRfcHJldmlvdXNfZnJhbWUoc3RydWN0IHBhY2tldF9zb2NrICpwbywKIAkJc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqcmIsCiAJCWludCBzdGF0dXMpCiB7CkBAIC0xMTU2LDcgKzExNTYsNyBAQAogCXJldHVybiBwYWNrZXRfbG9va3VwX2ZyYW1lKHBvLCByYiwgcHJldmlvdXMsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYWNrZXRfaW5jcmVtZW50X2hlYWQoc3RydWN0IHBhY2tldF9yaW5nX2J1ZmZlciAqYnVmZikKK3N0YXRpYyB2b2lkIHBhY2tldF9pbmNyZW1lbnRfaGVhZChzdHJ1Y3QgcGFja2V0X3JpbmdfYnVmZmVyICpidWZmKQogewogCWJ1ZmYtPmhlYWQgPSBidWZmLT5oZWFkICE9IGJ1ZmYtPmZyYW1lX21heCA/IGJ1ZmYtPmhlYWQrMSA6IDA7CiB9CkBAIC0xNTU4LDcgKzE1NTgsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJ1bl9maWx0ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnVuX2ZpbHRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVzKQogewpAQCAtMjE2NywxMCArMjE2NywxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnBhY2tldF9hbGxvY19za2Ioc3RydWN0IHNvY2sgKnNrLCBzaXplX3QgcHJlcGFkLAotCQkJCQkgICAgICAgc2l6ZV90IHJlc2VydmUsIHNpemVfdCBsZW4sCi0JCQkJCSAgICAgICBzaXplX3QgbGluZWFyLCBpbnQgbm9ibG9jaywKLQkJCQkJICAgICAgIGludCAqZXJyKQorc3RhdGljIHN0cnVjdCBza19idWZmICpwYWNrZXRfYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgc2l6ZV90IHByZXBhZCwKKwkJCQkgICAgICAgIHNpemVfdCByZXNlcnZlLCBzaXplX3QgbGVuLAorCQkJCSAgICAgICAgc2l6ZV90IGxpbmVhciwgaW50IG5vYmxvY2ssCisJCQkJICAgICAgICBpbnQgKmVycikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0zNDk0LDcgKzM0OTQsNyBAQAogCWtmcmVlKHBnX3ZlYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqYWxsb2Nfb25lX3BnX3ZlY19wYWdlKHVuc2lnbmVkIGxvbmcgb3JkZXIpCitzdGF0aWMgY2hhciAqYWxsb2Nfb25lX3BnX3ZlY19wYWdlKHVuc2lnbmVkIGxvbmcgb3JkZXIpCiB7CiAJY2hhciAqYnVmZmVyID0gTlVMTDsKIAlnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfS0VSTkVMIHwgX19HRlBfQ09NUCB8CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L2RhdGFncmFtLmMgYi9uZXQvcGhvbmV0L2RhdGFncmFtLmMKaW5kZXggMmYwMzIzOC4uYmYzNWI0ZSAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9kYXRhZ3JhbS5jCisrKyBiL25ldC9waG9uZXQvZGF0YWdyYW0uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKICNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgogCiBzdGF0aWMgaW50IHBuX2JhY2tsb2dfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC5jIGIvbmV0L3Bob25ldC9wZXAuYwppbmRleCBmMTdmZDg0Li4yYmE2ZTlmIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3BlcC5jCisrKyBiL25ldC9waG9uZXQvcGVwLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9waG9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3Bob25ldC5oPgogI2luY2x1ZGUgPG5ldC9waG9uZXQvcGVwLmg+CiAjaW5jbHVkZSA8bmV0L3Bob25ldC9ncHJzLmg+CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3NvY2tldC5jIGIvbmV0L3Bob25ldC9zb2NrZXQuYwppbmRleCA2NzZkMThkLi4zZjhkMGIxIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3NvY2tldC5jCisrKyBiL25ldC9waG9uZXQvc29ja2V0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGhvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3Bob25ldC9waG9uZXQuaD4KICNpbmNsdWRlIDxuZXQvcGhvbmV0L3BlcC5oPgogI2luY2x1ZGUgPG5ldC9waG9uZXQvcG5fZGV2Lmg+CmRpZmYgLS1naXQgYS9uZXQvcmRzL2NvbmcuYyBiL25ldC9yZHMvY29uZy5jCmluZGV4IDZkYWFhNDkuLmU1YjY1YWMgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvY29uZy5jCisrKyBiL25ldC9yZHMvY29uZy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL2Nvbm5lY3Rpb24uYyBiL25ldC9yZHMvY29ubmVjdGlvbi5jCmluZGV4IDkzMzRkODkuLjllMDdjNzUgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvY29ubmVjdGlvbi5jCisrKyBiL25ldC9yZHMvY29ubmVjdGlvbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9oYXNodGFibGVzLmg+CiAKICNpbmNsdWRlICJyZHMuaCIKZGlmZiAtLWdpdCBhL25ldC9yZHMvaWIuYyBiL25ldC9yZHMvaWIuYwppbmRleCAzYjgzMDg2Li5iNGM4YjAwIDEwMDY0NAotLS0gYS9uZXQvcmRzL2liLmMKKysrIGIvbmV0L3Jkcy9pYi5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJyZHMuaCIKICNpbmNsdWRlICJpYi5oIgpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pbmZvLmMgYi9uZXQvcmRzL2luZm8uYwppbmRleCA0ZmRmMWI2Li5mMWMwMTZjIDEwMDY0NAotLS0gYS9uZXQvcmRzL2luZm8uYworKysgYi9uZXQvcmRzL2luZm8uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL2l3LmMgYi9uZXQvcmRzL2l3LmMKaW5kZXggZjc0NzQ4NC4uNzgyNmQ0NiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pdy5jCisrKyBiL25ldC9yZHMvaXcuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAjaW5jbHVkZSAiaXcuaCIKZGlmZiAtLWdpdCBhL25ldC9yZHMvbWVzc2FnZS5jIGIvbmV0L3Jkcy9tZXNzYWdlLmMKaW5kZXggMWZkM2QyOS4uZjBhNDY1OCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9tZXNzYWdlLmMKKysrIGIvbmV0L3Jkcy9tZXNzYWdlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3BhZ2UuYyBiL25ldC9yZHMvcGFnZS5jCmluZGV4IGI4MmQ2M2UuLjI0OTljZDEgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvcGFnZS5jCisrKyBiL25ldC9yZHMvcGFnZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvcmRtYV90cmFuc3BvcnQuYyBiL25ldC9yZHMvcmRtYV90cmFuc3BvcnQuYwppbmRleCBmODc2MGUxLi5jMmJlOTAxIDEwMDY0NAotLS0gYS9uZXQvcmRzL3JkbWFfdHJhbnNwb3J0LmMKKysrIGIvbmV0L3Jkcy9yZG1hX3RyYW5zcG9ydC5jCkBAIC0zMCw2ICszMCw3IEBACiAgKiBTT0ZUV0FSRS4KICAqCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfY20uaD4KIAogI2luY2x1ZGUgInJkbWFfdHJhbnNwb3J0LmgiCmRpZmYgLS1naXQgYS9uZXQvcmRzL3Jkcy5oIGIvbmV0L3Jkcy9yZHMuaAppbmRleCBkYThhZGFjLi43ZWFiYTE4IDEwMDY0NAotLS0gYS9uZXQvcmRzL3Jkcy5oCisrKyBiL25ldC9yZHMvcmRzLmgKQEAgLTM2LDggKzM2LDggQEAKICNkZWZpbmUgcmRzZGVidWcoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZygiJXMoKTogIiBmbXQsIF9fZnVuY19fICwgIyNhcmdzKQogI2Vsc2UKIC8qIHNpZ2gsIHByX2RlYnVnKCkgY2F1c2VzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncyAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQotcmRzZGVidWcoY2hhciAqZm10LCAuLi4pCitzdGF0aWMgaW5saW5lIF9fcHJpbnRmKDEsIDIpCit2b2lkIHJkc2RlYnVnKGNoYXIgKmZtdCwgLi4uKQogewogfQogI2VuZGlmCkBAIC02MjUsOCArNjI1LDggQEAKIAkJCSAgc3RydWN0IHJkc19pbmZvX2xlbmd0aHMgKmxlbnMsCiAJCQkgIGludCAoKnZpc2l0b3IpKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqLCB2b2lkICopLAogCQkJICBzaXplX3QgaXRlbV9sZW4pOwotdm9pZCBfX3Jkc19jb25uX2Vycm9yKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgY29uc3QgY2hhciAqLCAuLi4pCi0JCQkJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworX19wcmludGYoMiwgMykKK3ZvaWQgX19yZHNfY29ubl9lcnJvcihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sIGNvbnN0IGNoYXIgKiwgLi4uKTsKICNkZWZpbmUgcmRzX2Nvbm5fZXJyb3IoY29ubiwgZm10Li4uKSBcCiAJX19yZHNfY29ubl9lcnJvcihjb25uLCBLRVJOX1dBUk5JTkcgIlJEUzogIiBmbXQpCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvcmVjdi5jIGIvbmV0L3Jkcy9yZWN2LmMKaW5kZXggNTk2Njg5ZS4uYmMzZjhjZCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9yZWN2LmMKKysrIGIvbmV0L3Jkcy9yZWN2LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvc2VuZC5jIGIvbmV0L3Jkcy9zZW5kLmMKaW5kZXggYWE1N2UyMi4uZTJkNjNjNSAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9zZW5kLmMKKysrIGIvbmV0L3Jkcy9zZW5kLmMKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgInJkcy5oIgogCmRpZmYgLS1naXQgYS9uZXQvcmRzL3N0YXRzLmMgYi9uZXQvcmRzL3N0YXRzLmMKaW5kZXggMTBjNzU5Yy4uN2JlNzkwZCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9zdGF0cy5jCisrKyBiL25ldC9yZHMvc3RhdHMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAicmRzLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvdGNwLmMgYi9uZXQvcmRzL3RjcC5jCmluZGV4IDhlMGEzMjAuLmVkYWM5ZWYgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvdGNwLmMKKysrIGIvbmV0L3Jkcy90Y3AuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAogI2luY2x1ZGUgInJkcy5oIgpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy90aHJlYWRzLmMgYi9uZXQvcmRzL3RocmVhZHMuYwppbmRleCAwZmQ5MGY4Li42NWVhZWZjIDEwMDY0NAotLS0gYS9uZXQvcmRzL3RocmVhZHMuYworKysgYi9uZXQvcmRzL3RocmVhZHMuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlICJyZHMuaCIKIApkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9pbnB1dC5jIGIvbmV0L3Jma2lsbC9pbnB1dC5jCmluZGV4IDFiY2E2ZDQuLjI0YzU1YzUgMTAwNjQ0Ci0tLSBhL25ldC9yZmtpbGwvaW5wdXQuYworKysgYi9uZXQvcmZraWxsL2lucHV0LmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jIGIvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jCmluZGV4IDEyODY3N2QuLmNhMzU1ZTcgMTAwNjQ0Ci0tLSBhL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC1ncGlvLmMKQEAgLTIyMCwxOCArMjIwLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmZraWxsX2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJma2lsbF9ncGlvX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCByZmtpbGxfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJma2lsbF9ncGlvX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHJma2lsbF9ncGlvX2luaXQpOwotbW9kdWxlX2V4aXQocmZraWxsX2dwaW9fZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJma2lsbF9ncGlvX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiZ3BpbyByZmtpbGwiKTsKIE1PRFVMRV9BVVRIT1IoIk5WSURJQSIpOwpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwtcmVndWxhdG9yLmMgYi9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYwppbmRleCAzY2E3Mjc3Li4yZWJmZThkIDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYwpAQCAtMTQ0LDE3ICsxNDQsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCByZmtpbGxfcmVndWxhdG9yX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyZmtpbGxfcmVndWxhdG9yX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChyZmtpbGxfcmVndWxhdG9yX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcmZraWxsX3JlZ3VsYXRvcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJma2lsbF9yZWd1bGF0b3JfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHJma2lsbF9yZWd1bGF0b3JfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJma2lsbF9yZWd1bGF0b3JfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiR3VpbWluZyBaaHVvIDxnbXpodW9AZ21haWwuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiQW50b25pbyBPc3BpdGUgPG9zcGl0ZUBzdHVkZW50aS51bmluYS5pdD4iKTsKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwppbmRleCBkMzg5ZGUxLi5jZDliN2VlIDEwMDY0NAotLS0gYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPG5ldC9yb3NlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogc3RhdGljIHVuc2lnbmVkIGludCByb3NlX25laWdoX25vID0gMTsKIApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLW91dHB1dC5jIGIvbmV0L3J4cnBjL2FyLW91dHB1dC5jCmluZGV4IDVmMjJlMjYuLjMzOGQ3OTMgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1vdXRwdXQuYworKysgYi9uZXQvcnhycGMvYXItb3V0cHV0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1yZWN2bXNnLmMgYi9uZXQvcnhycGMvYXItcmVjdm1zZy5jCmluZGV4IDBjNjUwMTMuLjRiNDg2ODcgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKKysrIGIvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9hcGkuYyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKaW5kZXggZjJmYjY3ZS4uOTNmZGYxMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9hcGkuYworKysgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCmluZGV4IDllMDg3ZDguLjdiNTgyMzAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZmxvdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcS5jIGIvbmV0L3NjaGVkL3NjaF9tcS5jCmluZGV4IGVjNWNiYzguLjBhNGIyZjkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbXEuYworKysgYi9uZXQvc2NoZWQvc2NoX21xLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKaW5kZXggZWExN2NiZS4uZjg4MjU2YyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYworKysgYi9uZXQvc2NoZWQvc2NoX21xcHJpby5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvc2NoX2dlbmVyaWMuaD4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb2MuYyBiL25ldC9zY3RwL3Byb2MuYwppbmRleCAwNWE2Y2UyLi4xZTJlZWU4IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm9jLmMKKysrIGIvbmV0L3NjdHAvcHJvYy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc2N0cC9zY3RwLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+IC8qIGZvciBzbm1wX2ZvbGRfZmllbGQgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCA4MzZhYTYzLi4xM2JmNWZjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogCiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+IC8qIGZvciBzYV9mYW1pbHlfdCAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2FkZHIuYyBiL25ldC9zdW5ycGMvYWRkci5jCmluZGV4IDQ1NDg3NTcuLjY3YTY1NWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYWRkci5jCisrKyBiL25ldC9zdW5ycGMvYWRkci5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYwppbmRleCA0Y2I3MGRjLi5lNTA1MDJkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF91bml4LmMKQEAgLTEyOSw2ICsxMjksOSBAQAogCWZvciAoaSA9IDA7IGkgPCBncm91cHMgOyBpKyspCiAJCWlmIChjcmVkLT51Y19naWRzW2ldICE9IEdST1VQX0FUKGFjcmVkLT5ncm91cF9pbmZvLCBpKSkKIAkJCXJldHVybiAwOworCWlmIChncm91cHMgPCBORlNfTkdST1VQUyAmJgorCSAgICBjcmVkLT51Y19naWRzW2dyb3Vwc10gIT0gTk9HUk9VUCkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYmFja2NoYW5uZWxfcnFzdC5jIGIvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKaW5kZXggOTFlYWEyNi4uM2FkNDM1YSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKKysrIGIvbmV0L3N1bnJwYy9iYWNrY2hhbm5lbF9ycXN0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2lmZGVmIFJQQ19ERUJVRwogI2RlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX1RSQU5TCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCBmNTg4Yjg1Li44NzYxYmY4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTExNCw2ICsxMTQsOSBAQAogc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCXJwY2JfbG9jYWxfY2xudDsKIHN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKglycGNiX2xvY2FsX2NsbnQ0OwogCitERUZJTkVfU1BJTkxPQ0socnBjYl9jbG50X2xvY2spOwordW5zaWduZWQgaW50CQkJcnBjYl91c2VyczsKKwogc3RydWN0IHJwY2JpbmRfYXJncyB7CiAJc3RydWN0IHJwY194cHJ0ICoJcl94cHJ0OwogCkBAIC0xNjEsNiArMTY0LDU2IEBACiAJa2ZyZWUobWFwKTsKIH0KIAorc3RhdGljIGludCBycGNiX2dldF9sb2NhbCh2b2lkKQoreworCWludCBjbnQ7CisKKwlzcGluX2xvY2soJnJwY2JfY2xudF9sb2NrKTsKKwlpZiAocnBjYl91c2VycykKKwkJcnBjYl91c2VycysrOworCWNudCA9IHJwY2JfdXNlcnM7CisJc3Bpbl91bmxvY2soJnJwY2JfY2xudF9sb2NrKTsKKworCXJldHVybiBjbnQ7Cit9CisKK3ZvaWQgcnBjYl9wdXRfbG9jYWwodm9pZCkKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBycGNiX2xvY2FsX2NsbnQ7CisJc3RydWN0IHJwY19jbG50ICpjbG50NCA9IHJwY2JfbG9jYWxfY2xudDQ7CisJaW50IHNodXRkb3duOworCisJc3Bpbl9sb2NrKCZycGNiX2NsbnRfbG9jayk7CisJaWYgKC0tcnBjYl91c2VycyA9PSAwKSB7CisJCXJwY2JfbG9jYWxfY2xudCA9IE5VTEw7CisJCXJwY2JfbG9jYWxfY2xudDQgPSBOVUxMOworCX0KKwlzaHV0ZG93biA9ICFycGNiX3VzZXJzOworCXNwaW5fdW5sb2NrKCZycGNiX2NsbnRfbG9jayk7CisKKwlpZiAoc2h1dGRvd24pIHsKKwkJLyoKKwkJICogY2xlYW51cF9ycGNiX2NsbnQgLSByZW1vdmUgeHBydHNvY2sncyBzeXNjdGxzLCB1bnJlZ2lzdGVyCisJCSAqLworCQlpZiAoY2xudDQpCisJCQlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQ0KTsKKwkJaWYgKGNsbnQpCisJCQlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgcnBjYl9zZXRfbG9jYWwoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ0KQoreworCS8qIFByb3RlY3RlZCBieSBycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCAqLworCXJwY2JfbG9jYWxfY2xudCA9IGNsbnQ7CisJcnBjYl9sb2NhbF9jbG50NCA9IGNsbnQ0OworCXNtcF93bWIoKTsgCisJcnBjYl91c2VycyA9IDE7CisJZHByaW50aygiUlBDOiAgICAgICBjcmVhdGVkIG5ldyBycGNiIGxvY2FsIGNsaWVudHMgKHJwY2JfbG9jYWxfY2xudDogIgorCQkJIiVwLCBycGNiX2xvY2FsX2NsbnQ0OiAlcClcbiIsIHJwY2JfbG9jYWxfY2xudCwKKwkJCXJwY2JfbG9jYWxfY2xudDQpOworfQorCiAvKgogICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCiAgKiBpcyByZXR1cm5lZC4KQEAgLTIwNSw5ICsyNTgsNyBAQAogCQljbG50NCA9IE5VTEw7CiAJfQogCi0JLyogUHJvdGVjdGVkIGJ5IHJwY2JfY3JlYXRlX2xvY2FsX211dGV4ICovCi0JcnBjYl9sb2NhbF9jbG50ID0gY2xudDsKLQlycGNiX2xvY2FsX2NsbnQ0ID0gY2xudDQ7CisJcnBjYl9zZXRfbG9jYWwoY2xudCwgY2xudDQpOwogCiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI1OSw5ICszMTAsNyBAQAogCQljbG50NCA9IE5VTEw7CiAJfQogCi0JLyogUHJvdGVjdGVkIGJ5IHJwY2JfY3JlYXRlX2xvY2FsX211dGV4ICovCi0JcnBjYl9sb2NhbF9jbG50ID0gY2xudDsKLQlycGNiX2xvY2FsX2NsbnQ0ID0gY2xudDQ7CisJcnBjYl9zZXRfbG9jYWwoY2xudCwgY2xudDQpOwogCiBvdXQ6CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI3MSwxNiArMzIwLDE2IEBACiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKICAqIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgaW50IHJwY2JfY3JlYXRlX2xvY2FsKHZvaWQpCitpbnQgcnBjYl9jcmVhdGVfbG9jYWwodm9pZCkKIHsKIAlzdGF0aWMgREVGSU5FX01VVEVYKHJwY2JfY3JlYXRlX2xvY2FsX211dGV4KTsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWlmIChycGNiX2xvY2FsX2NsbnQpCisJaWYgKHJwY2JfZ2V0X2xvY2FsKCkpCiAJCXJldHVybiByZXN1bHQ7CiAKIAltdXRleF9sb2NrKCZycGNiX2NyZWF0ZV9sb2NhbF9tdXRleCk7Ci0JaWYgKHJwY2JfbG9jYWxfY2xudCkKKwlpZiAocnBjYl9nZXRfbG9jYWwoKSkKIAkJZ290byBvdXQ7CiAKIAlpZiAocnBjYl9jcmVhdGVfbG9jYWxfdW5peCgpICE9IDApCkBAIC0zODIsMTEgKzQzMSw2IEBACiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKIAkJLnJwY19hcmdwCT0gJm1hcCwKIAl9OwotCWludCBlcnJvcjsKLQotCWVycm9yID0gcnBjYl9jcmVhdGVfbG9jYWwoKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKIAogCWRwcmludGsoIlJQQzogICAgICAgJXNyZWdpc3RlcmluZyAoJXUsICV1LCAlZCwgJXUpIHdpdGggbG9jYWwgIgogCQkJInJwY2JpbmRcbiIsIChwb3J0ID8gIiIgOiAidW4iKSwKQEAgLTUyMiwxMSArNTY2LDcgQEAKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX2FyZ3AJPSAmbWFwLAogCX07Ci0JaW50IGVycm9yOwogCi0JZXJyb3IgPSBycGNiX2NyZWF0ZV9sb2NhbCgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwogCWlmIChycGNiX2xvY2FsX2NsbnQ0ID09IE5VTEwpCiAJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCkBAIC0xMDYwLDE1ICsxMTAwLDMgQEAKIAkudmVyc2lvbgk9IHJwY2JfdmVyc2lvbiwKIAkuc3RhdHMJCT0gJnJwY2Jfc3RhdHMsCiB9OwotCi0vKioKLSAqIGNsZWFudXBfcnBjYl9jbG50IC0gcmVtb3ZlIHhwcnRzb2NrJ3Mgc3lzY3RscywgdW5yZWdpc3RlcgotICoKLSAqLwotdm9pZCBjbGVhbnVwX3JwY2JfY2xudCh2b2lkKQotewotCWlmIChycGNiX2xvY2FsX2NsbnQ0KQotCQlycGNfc2h1dGRvd25fY2xpZW50KHJwY2JfbG9jYWxfY2xudDQpOwotCWlmIChycGNiX2xvY2FsX2NsbnQpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQocnBjYl9sb2NhbF9jbG50KTsKLX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc29ja2xpYi5jIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKaW5kZXggMTBiNDMxOS4uMTQ1ZTY3ODQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc29ja2xpYi5jCisrKyBiL25ldC9zdW5ycGMvc29ja2xpYi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwppbmRleCA5ZDA4MDkxLi44ZWM5Nzc4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKKysrIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCkBAIC02MSw4ICs2MSw2IEBACiAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIHVuaXhfZ2lkX2NhY2hlOwogCi1leHRlcm4gdm9pZCBjbGVhbnVwX3JwY2JfY2xudCh2b2lkKTsKLQogc3RhdGljIGludCBfX2luaXQKIGluaXRfc3VucnBjKHZvaWQpCiB7CkBAIC0xMDIsNyArMTAwLDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogY2xlYW51cF9zdW5ycGModm9pZCkKIHsKLQljbGVhbnVwX3JwY2JfY2xudCgpOwogCXJwY2F1dGhfcmVtb3ZlX21vZHVsZSgpOwogCWNsZWFudXBfc29ja2V0X3hwcnQoKTsKIAlzdmNfY2xlYW51cF94cHJ0X3NvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjLmMgYi9uZXQvc3VucnBjL3N2Yy5jCmluZGV4IDMwZDcwYWIuLjZlMDM4ODggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjLmMKKysrIGIvbmV0L3N1bnJwYy9zdmMuYwpAQCAtMzY2LDYgKzM2Niw0MiBAQAogCXJldHVybiAmc2Vydi0+c3ZfcG9vbHNbcGlkeCAlIHNlcnYtPnN2X25ycG9vbHNdOwogfQogCitzdGF0aWMgaW50IHN2Y19ycGNiX3NldHVwKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcnBjYl9jcmVhdGVfbG9jYWwoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUmVtb3ZlIGFueSBzdGFsZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbnMgKi8KKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzdmNfcnBjYl9jbGVhbnVwKHN0cnVjdCBzdmNfc2VydiAqc2VydikKK3sKKwlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlycGNiX3B1dF9sb2NhbCgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3JwY2JfY2xlYW51cCk7CisKK3N0YXRpYyBpbnQgc3ZjX3VzZXNfcnBjYmluZChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCit7CisJc3RydWN0IHN2Y19wcm9ncmFtCSpwcm9ncDsKKwl1bnNpZ25lZCBpbnQJCWk7CisKKwlmb3IgKHByb2dwID0gc2Vydi0+c3ZfcHJvZ3JhbTsgcHJvZ3A7IHByb2dwID0gcHJvZ3AtPnBnX25leHQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHByb2dwLT5wZ19udmVyczsgaSsrKSB7CisJCQlpZiAocHJvZ3AtPnBnX3ZlcnNbaV0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwcm9ncC0+cGdfdmVyc1tpXS0+dnNfaGlkZGVuID09IDApCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIENyZWF0ZSBhbiBSUEMgc2VydmljZQpAQCAtNDMxLDggKzQ2NywxNSBAQAogCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+c3BfbG9jayk7CiAJfQogCi0JLyogUmVtb3ZlIGFueSBzdGFsZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbnMgKi8KLQlzdmNfdW5yZWdpc3RlcihzZXJ2KTsKKwlpZiAoc3ZjX3VzZXNfcnBjYmluZChzZXJ2KSkgeworCSAgICAgICAJaWYgKHN2Y19ycGNiX3NldHVwKHNlcnYpIDwgMCkgeworCQkJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOworCQkJa2ZyZWUoc2Vydik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoIXNlcnYtPnN2X3NodXRkb3duKQorCQkJc2Vydi0+c3Zfc2h1dGRvd24gPSBzdmNfcnBjYl9jbGVhbnVwOworCX0KIAogCXJldHVybiBzZXJ2OwogfQpAQCAtNTAwLDcgKzU0Myw2IEBACiAJaWYgKHN2Y19zZXJ2X2lzX3Bvb2xlZChzZXJ2KSkKIAkJc3ZjX3Bvb2xfbWFwX3B1dCgpOwogCi0Jc3ZjX3VucmVnaXN0ZXIoc2Vydik7CiAJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOwogCWtmcmVlKHNlcnYpOwogfQpAQCAtOTcxLDkgKzEwMTMsOCBAQAogLyoKICAqIFByaW50ayB0aGUgZ2l2ZW4gZXJyb3Igd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgY2xpZW50IHRoYXQgY2F1c2VkIGl0LgogICovCi1zdGF0aWMgaW50Ci1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKLXN2Y19wcmludGsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgX19wcmludGYoMiwgMykKK2ludCBzdmNfcHJpbnRrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlpbnQgCXI7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKaW5kZXggZDg2YmI2Ny4uNDQ3Y2QwZSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNfeHBydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBSUENEQkdfRkFDSUxJVFkJUlBDREJHX1NWQ1hQUlQKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCBkZmQ2ODZlLi43MWJlZDFjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS9zdmNfcmRtYV90cmFuc3BvcnQuYwppbmRleCBhMzg1NDMwLi5iYTEyOTZkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3N2Y19yZG1hX3RyYW5zcG9ydC5jCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEvc3ZjX3JkbWFfdHJhbnNwb3J0LmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX2NtLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y19yZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19TVkNYUFJUCiAKZGlmZiAtLWdpdCBhL25ldC9zeXNjdGxfbmV0LmMgYi9uZXQvc3lzY3RsX25ldC5jCmluZGV4IGNhODQyMTIuLmU3NTgxMzkgMTAwNjQ0Ci0tLSBhL25ldC9zeXNjdGxfbmV0LmMKKysrIGIvbmV0L3N5c2N0bF9uZXQuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5jIGIvbmV0L3RpcGMvY29yZS5jCmluZGV4IDk0M2I2YWYuLmMyMTMzMWQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvcmUuYworKysgYi9uZXQvdGlwYy9jb3JlLmMKQEAgLTM0LDYgKzM0LDggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJyZWYuaCIKICNpbmNsdWRlICJuYW1lX3RhYmxlLmgiCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IDk0NDBhM2QuLjQyYjgzMjQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKZGlmZiAtLWdpdCBhL25ldC93YW5yb3V0ZXIvd2FucHJvYy5jIGIvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKaW5kZXggZjM0NjM5NS4uYzQzNjEyZSAxMDA2NDQKLS0tIGEvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKKysrIGIvbmV0L3dhbnJvdXRlci93YW5wcm9jLmMKQEAgLTgxLDcgKzgxLDYgQEAKICAqCUl0ZXJhdG9yCiAgKi8KIHN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCi0JX19hY3F1aXJlcyhrZXJuZWxfbG9jaykKIHsKIAlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2OwogCWxvZmZfdCBsID0gKnBvczsKQEAgLTEwMyw3ICsxMDIsNiBAQAogfQogCiBzdGF0aWMgdm9pZCByX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotCV9fcmVsZWFzZXMoa2VybmVsX2xvY2spCiB7CiAJbXV0ZXhfdW5sb2NrKCZjb25maWdfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L29wLW1zZy5jIGIvbmV0L3dpbWF4L29wLW1zZy5jCmluZGV4IGQ1YjdjMzcuLjA2OTRkNjIgMTAwNjQ0Ci0tLSBhL25ldC93aW1heC9vcC1tc2cuYworKysgYi9uZXQvd2ltYXgvb3AtbXNnLmMKQEAgLTc3LDYgKzc3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aW1heC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKIAogCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmVzZXQuYyBiL25ldC93aW1heC9vcC1yZXNldC5jCmluZGV4IDY4YmVkZjMuLjdjZWZmZTMgMTAwNjQ0Ci0tLSBhL25ldC93aW1heC9vcC1yZXNldC5jCisrKyBiL25ldC93aW1heC9vcC1yZXNldC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgogCiAjZGVmaW5lIERfU1VCTU9EVUxFIG9wX3Jlc2V0CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmZraWxsLmMgYi9uZXQvd2ltYXgvb3AtcmZraWxsLmMKaW5kZXggMjYwOWU0NC4uN2FiNjBiYSAxMDA2NDQKLS0tIGEvbmV0L3dpbWF4L29wLXJma2lsbC5jCisrKyBiL25ldC93aW1heC9vcC1yZmtpbGwuYwpAQCAtNjUsNiArNjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgogCiAjZGVmaW5lIERfU1VCTU9EVUxFIG9wX3Jma2lsbApkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L3N0YWNrLmMgYi9uZXQvd2ltYXgvc3RhY2suYwppbmRleCBlZTk5ZTdkLi4zYzY1ZWFlIDEwMDY0NAotLS0gYS9uZXQvd2ltYXgvc3RhY2suYworKysgYi9uZXQvd2ltYXgvc3RhY2suYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCiAKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCAxZjFlZjcwLi4yZTQ0NDRmIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMTIxLDE1ICsxMjEsMTYgQEAKIAogY29uZmlnIFdJUkVMRVNTX0VYVF9TWVNGUwogCWJvb2wgIldpcmVsZXNzIGV4dGVuc2lvbnMgc3lzZnMgZmlsZXMiCi0JZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBXRVhUX0NPUkUgJiYgU1lTRlMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBkZXByZWNhdGVkIHdpcmVsZXNzIHN0YXRpc3RpY3MKIAkgIGZpbGVzIGluIC9zeXMvY2xhc3MvbmV0Lyovd2lyZWxlc3MvLiBUaGUgc2FtZSBpbmZvcm1hdGlvbgogCSAgaXMgYXZhaWxhYmxlIHZpYSB0aGUgaW9jdGxzIGFzIHdlbGwuCiAKLQkgIFNheSBZIGlmIHlvdSBoYXZlIHByb2dyYW1zIHVzaW5nIGl0LCBsaWtlIG9sZCB2ZXJzaW9ucyBvZgotCSAgaGFsLgorCSAgU2F5IE4uIElmIHlvdSBrbm93IHlvdSBoYXZlIGFuY2llbnQgdG9vbHMgcmVxdWlyaW5nIGl0LAorCSAgbGlrZSB2ZXJ5IG9sZCB2ZXJzaW9ucyBvZiBoYWwgKHByaW9yIHRvIDAuNS4xMiByZWxlYXNlKSwKKwkgIHNheSBZIGFuZCB1cGRhdGUgdGhlIHRvb2xzIGFzIHNvb24gYXMgcG9zc2libGUgYXMgdGhpcworCSAgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBzb29uLgogCiBjb25maWcgTElCODAyMTEKIAl0cmlzdGF0ZSAiQ29tbW9uIHJvdXRpbmVzIGZvciBJRUVFODAyLjExIGRyaXZlcnMiCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY2hhbi5jIGIvbmV0L3dpcmVsZXNzL2NoYW4uYwppbmRleCAxN2NkMGMwLi4yZmNmZTA5IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY2hhbi5jCisrKyBiL25ldC93aXJlbGVzcy9jaGFuLmMKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgMjAwOQlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJjb3JlLmgiCiAKQEAgLTQ0LDkgKzQ1LDkgQEAKIAlyZXR1cm4gY2hhbjsKIH0KIAotc3RhdGljIGJvb2wgY2FuX2JlYWNvbl9zZWNfY2hhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKLQkJCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSkKK2ludCBjZmc4MDIxMV9jYW5fYmVhY29uX3NlY19jaGFuKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCisJCQkJICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKnNlY19jaGFuOwogCWludCBkaWZmOwpAQCAtNzUsNiArNzYsNyBAQAogCiAJcmV0dXJuIHRydWU7CiB9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4pOwogCiBpbnQgY2ZnODAyMTFfc2V0X2ZyZXEoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCBpbnQgZnJlcSwKQEAgLTEwOSw4ICsxMTEsOCBAQAogCQlzd2l0Y2ggKGNoYW5uZWxfdHlwZSkgewogCQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKIAkJY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgotCQkJaWYgKCFjYW5fYmVhY29uX3NlY19jaGFuKCZyZGV2LT53aXBoeSwgY2hhbiwKLQkJCQkJCSBjaGFubmVsX3R5cGUpKSB7CisJCQlpZiAoIWNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4oJnJkZXYtPndpcGh5LCBjaGFuLAorCQkJCQkJCSAgY2hhbm5lbF90eXBlKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJICAgICAgICJjZmc4MDIxMTogU2Vjb25kYXJ5IGNoYW5uZWwgbm90ICIKIAkJCQkgICAgICAgImFsbG93ZWQgdG8gaW5pdGlhdGUgY29tbXVuaWNhdGlvblxuIik7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5oIGIvbmV0L3dpcmVsZXNzL2NvcmUuaAppbmRleCAxYzdkNGRmLi40M2FkOWM4IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5oCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTI0OSwxMiArMjQ5LDExIEBACiAJCQl1MTYgc3RhdHVzOwogCQl9IGNyOwogCQlzdHJ1Y3QgewotCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwotCQkJdTggYnNzaWRbRVRIX0FMRU5dOwogCQkJY29uc3QgdTggKnJlcV9pZTsKIAkJCWNvbnN0IHU4ICpyZXNwX2llOwogCQkJc2l6ZV90IHJlcV9pZV9sZW47CiAJCQlzaXplX3QgcmVzcF9pZV9sZW47CisJCQlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJCX0gcm07CiAJCXN0cnVjdCB7CiAJCQljb25zdCB1OCAqaWU7CkBAIC0zNDEsMTMgKzM0MCwxNyBAQAogCQkJICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJICBjb25zdCB1OCAqc3NpZCwgaW50IHNzaWRfbGVuLAogCQkJICBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGJvb2wgdXNlX21mcCwKLQkJCSAgc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpOworCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCwKKwkJCSAgdTMyIGFzc29jX2ZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzayk7CiBpbnQgY2ZnODAyMTFfbWxtZV9hc3NvYyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQljb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJY29uc3QgdTggKnNzaWQsIGludCBzc2lkX2xlbiwKIAkJCWNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgYm9vbCB1c2VfbWZwLAotCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpOworCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQsCisJCQl1MzIgYXNzb2NfZmxhZ3MsIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzayk7CiBpbnQgX19jZmc4MDIxMV9tbG1lX2RlYXV0aChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIHUxNiByZWFzb24sCkBAIC0zNzksNiArMzgyLDggQEAKIAkJCSAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAogCQkJICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKIAkJCSAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpOwordm9pZCBjZmc4MDIxMV9vcGVyX2FuZF9odF9jYXBhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spOwogCiAvKiBTTUUgKi8KIGludCBfX2NmZzgwMjExX2Nvbm5lY3Qoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApAQCAtMzk3LDggKzQwMiw3IEBACiAJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcmVhc29uLAogCQkJYm9vbCB3ZXh0ZXYpOwogdm9pZCBfX2NmZzgwMjExX3JvYW1lZChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAotCQkgICAgICAgY29uc3QgdTggKmJzc2lkLAorCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLAogCQkgICAgICAgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCiAJCSAgICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuKTsKIGludCBjZmc4MDIxMV9tZ2Rfd2V4dF9jb25uZWN0KHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9pYnNzLmMgYi9uZXQvd2lyZWxlc3MvaWJzcy5jCmluZGV4IGYzM2ZiYjcuLjMwZjIwZmUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9pYnNzLmMKKysrIGIvbmV0L3dpcmVsZXNzL2lic3MuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJ3ZXh0LWNvbXBhdC5oIgogI2luY2x1ZGUgIm5sODAyMTEuaCIKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9tZXNoLmMgYi9uZXQvd2lyZWxlc3MvbWVzaC5jCmluZGV4IDQ0MjNlNjQuLjhjNTUwZGYgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9tZXNoLmMKKysrIGIvbmV0L3dpcmVsZXNzL21lc2guYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlICJubDgwMjExLmgiCiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtMTksNiArMjAsNyBAQAogICogaW50ZXJmYWNlCiAgKi8KICNkZWZpbmUgTUVTSF9QUkVRX01JTl9JTlQJMTAKKyNkZWZpbmUgTUVTSF9QRVJSX01JTl9JTlQJMTAwCiAjZGVmaW5lIE1FU0hfRElBTV9UUkFWRVJTQUxfVElNRSA1MAogCiAvKgpAQCAtNDYsNiArNDgsNyBAQAogCS5kb3QxMU1lc2hNYXhQZWVyTGlua3MgPSBNRVNIX01BWF9FU1RBQl9QTElOS1MsCiAJLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCA9IE1FU0hfUEFUSF9USU1FT1VULAogCS5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsID0gTUVTSF9QUkVRX01JTl9JTlQsCisJLmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwgPSBNRVNIX1BFUlJfTUlOX0lOVCwKIAkuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSA9IE1FU0hfRElBTV9UUkFWRVJTQUxfVElNRSwKIAkuZG90MTFNZXNoSFdNUG1heFBSRVFyZXRyaWVzID0gTUVTSF9NQVhfUFJFUV9SRVRSSUVTLAogCS5wYXRoX3JlZnJlc2hfdGltZSA9IE1FU0hfUEFUSF9SRUZSRVNIX1RJTUUsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvbWxtZS5jIGIvbmV0L3dpcmVsZXNzL21sbWUuYwppbmRleCA2YzFiYWZkLi40MzhkZmMxIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvbWxtZS5jCisrKyBiL25ldC93aXJlbGVzcy9tbG1lLmMKQEAgLTUwMSwxMyArNTAxLDMyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyogIERvIGEgbG9naWNhbCBodF9jYXBhICY9IGh0X2NhcGFfbWFzay4gICovCit2b2lkIGNmZzgwMjExX29wZXJfYW5kX2h0X2NhcGEoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzaykKK3sKKwlpbnQgaTsKKwl1OCAqcDEsICpwMjsKKwlpZiAoIWh0X2NhcGFfbWFzaykgeworCQltZW1zZXQoaHRfY2FwYSwgMCwgc2l6ZW9mKCpodF9jYXBhKSk7CisJCXJldHVybjsKKwl9CisKKwlwMSA9ICh1OCopKGh0X2NhcGEpOworCXAyID0gKHU4KikoaHRfY2FwYV9tYXNrKTsKKwlmb3IgKGkgPSAwOyBpPHNpemVvZigqaHRfY2FwYSk7IGkrKykKKwkJcDFbaV0gJj0gcDJbaV07Cit9CisKIGludCBfX2NmZzgwMjExX21sbWVfYXNzb2Moc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCiAJCQkgIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKnByZXZfYnNzaWQsCiAJCQkgIGNvbnN0IHU4ICpzc2lkLCBpbnQgc3NpZF9sZW4sCiAJCQkgIGNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgYm9vbCB1c2VfbWZwLAotCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCkKKwkJCSAgc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQsCisJCQkgIHUzMiBhc3NvY19mbGFncywgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3QgY2ZnODAyMTFfYXNzb2NfcmVxdWVzdCByZXE7CkBAIC01MzcsNiArNTU2LDE1IEBACiAJbWVtY3B5KCZyZXEuY3J5cHRvLCBjcnlwdCwgc2l6ZW9mKHJlcS5jcnlwdG8pKTsKIAlyZXEudXNlX21mcCA9IHVzZV9tZnA7CiAJcmVxLnByZXZfYnNzaWQgPSBwcmV2X2Jzc2lkOworCXJlcS5mbGFncyA9IGFzc29jX2ZsYWdzOworCWlmIChodF9jYXBhKQorCQltZW1jcHkoJnJlcS5odF9jYXBhLCBodF9jYXBhLCBzaXplb2YocmVxLmh0X2NhcGEpKTsKKwlpZiAoaHRfY2FwYV9tYXNrKQorCQltZW1jcHkoJnJlcS5odF9jYXBhX21hc2ssIGh0X2NhcGFfbWFzaywKKwkJICAgICAgIHNpemVvZihyZXEuaHRfY2FwYV9tYXNrKSk7CisJY2ZnODAyMTFfb3Blcl9hbmRfaHRfY2FwYSgmcmVxLmh0X2NhcGFfbWFzaywKKwkJCQkgIHJkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spOworCiAJcmVxLmJzcyA9IGNmZzgwMjExX2dldF9ic3MoJnJkZXYtPndpcGh5LCBjaGFuLCBic3NpZCwgc3NpZCwgc3NpZF9sZW4sCiAJCQkJICAgV0xBTl9DQVBBQklMSVRZX0VTUywgV0xBTl9DQVBBQklMSVRZX0VTUyk7CiAJaWYgKCFyZXEuYnNzKSB7CkBAIC01NzQsMTQgKzYwMiwxNyBAQAogCQkJY29uc3QgdTggKmJzc2lkLCBjb25zdCB1OCAqcHJldl9ic3NpZCwKIAkJCWNvbnN0IHU4ICpzc2lkLCBpbnQgc3NpZF9sZW4sCiAJCQljb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGJvb2wgdXNlX21mcCwKLQkJCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0KQorCQkJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQsCisJCQl1MzIgYXNzb2NfZmxhZ3MsIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbWFzaykKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCWludCBlcnI7CiAKIAl3ZGV2X2xvY2sod2Rldik7CiAJZXJyID0gX19jZmc4MDIxMV9tbG1lX2Fzc29jKHJkZXYsIGRldiwgY2hhbiwgYnNzaWQsIHByZXZfYnNzaWQsCi0JCQkJICAgIHNzaWQsIHNzaWRfbGVuLCBpZSwgaWVfbGVuLCB1c2VfbWZwLCBjcnlwdCk7CisJCQkJICAgIHNzaWQsIHNzaWRfbGVuLCBpZSwgaWVfbGVuLCB1c2VfbWZwLCBjcnlwdCwKKwkJCQkgICAgYXNzb2NfZmxhZ3MsIGh0X2NhcGEsIGh0X2NhcGFfbWFzayk7CiAJd2Rldl91bmxvY2sod2Rldik7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggODY0ZmNiNi4uYjA3YzRmYyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYworKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCkBAIC00NywyMiArNDcsMjEgQEAKIH07CiAKIC8qIGludGVybmFsIGhlbHBlcjogZ2V0IHJkZXYgYW5kIGRldiAqLwotc3RhdGljIGludCBnZXRfcmRldl9kZXZfYnlfaW5mb19pZmluZGV4KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCi0JCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2KQorc3RhdGljIGludCBnZXRfcmRldl9kZXZfYnlfaWZpbmRleChzdHJ1Y3QgbmV0ICpuZXRucywgc3RydWN0IG5sYXR0ciAqKmF0dHJzLAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKipkZXYpCiB7Ci0Jc3RydWN0IG5sYXR0ciAqKmF0dHJzID0gaW5mby0+YXR0cnM7CiAJaW50IGlmaW5kZXg7CiAKIAlpZiAoIWF0dHJzW05MODAyMTFfQVRUUl9JRklOREVYXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZmluZGV4ID0gbmxhX2dldF91MzIoYXR0cnNbTkw4MDIxMV9BVFRSX0lGSU5ERVhdKTsKLQkqZGV2ID0gZGV2X2dldF9ieV9pbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBpZmluZGV4KTsKKwkqZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXRucywgaWZpbmRleCk7CiAJaWYgKCEqZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCSpyZGV2ID0gY2ZnODAyMTFfZ2V0X2Rldl9mcm9tX2lmaW5kZXgoZ2VubF9pbmZvX25ldChpbmZvKSwgaWZpbmRleCk7CisJKnJkZXYgPSBjZmc4MDIxMV9nZXRfZGV2X2Zyb21faWZpbmRleChuZXRucywgaWZpbmRleCk7CiAJaWYgKElTX0VSUigqcmRldikpIHsKIAkJZGV2X3B1dCgqZGV2KTsKIAkJcmV0dXJuIFBUUl9FUlIoKnJkZXYpOwpAQCAtODksOCArODgsOCBAQAogCVtOTDgwMjExX0FUVFJfSUZJTkRFWF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtOTDgwMjExX0FUVFJfSUZOQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IElGTkFNU0laLTEgfSwKIAotCVtOTDgwMjExX0FUVFJfTUFDXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCAubGVuID0gRVRIX0FMRU4gfSwKLQlbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSBFVEhfQUxFTiB9LAorCVtOTDgwMjExX0FUVFJfTUFDXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW05MODAyMTFfQVRUUl9QUkVWX0JTU0lEXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCiAKIAlbTkw4MDIxMV9BVFRSX0tFWV0gPSB7IC50eXBlID0gTkxBX05FU1RFRCwgfSwKIAlbTkw4MDIxMV9BVFRSX0tFWV9EQVRBXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLApAQCAtMTk3LDYgKzE5NiwxNCBAQAogCVtOTDgwMjExX0FUVFJfVERMU19TVVBQT1JUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9BVFRSX0RPTlRfV0FJVF9GT1JfQUNLXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgICAubGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTiB9LAorCVtOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSA9IHsKKwkJLmxlbiA9IE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4KKwl9LAorCVtOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiAvKiBwb2xpY3kgZm9yIHRoZSBrZXkgYXR0cmlidXRlcyAqLwpAQCAtNzU5LDYgKzc2NiwxMCBAQAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfUlgsCiAJCSAgICBkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc19yeCk7CiAKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FEKQorCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQsCisJCQkgICAgZGV2LT53aXBoeS5wcm9iZV9yZXNwX29mZmxvYWQpOworCiAJaWYgKChkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc190eCB8fAogCSAgICAgZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfcngpICYmIGRldi0+b3BzLT5nZXRfYW50ZW5uYSkgewogCQl1MzIgdHhfYW50ID0gMCwgcnhfYW50ID0gMDsKQEAgLTg3NSw3ICs4ODYsOCBAQAogCUNNRChzZXRfcG1rc2EsIFNFVF9QTUtTQSk7CiAJQ01EKGRlbF9wbWtzYSwgREVMX1BNS1NBKTsKIAlDTUQoZmx1c2hfcG1rc2EsIEZMVVNIX1BNS1NBKTsKLQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMKQorCQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKIAlDTUQoc2V0X2JpdHJhdGVfbWFzaywgU0VUX1RYX0JJVFJBVEVfTUFTSyk7CiAJQ01EKG1nbXRfdHgsIEZSQU1FKTsKIAlDTUQobWdtdF90eF9jYW5jZWxfd2FpdCwgRlJBTUVfV0FJVF9DQU5DRUwpOwpAQCAtODkyLDExICs5MDQsMTYgQEAKIAlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTikKIAkJQ01EKHNjaGVkX3NjYW5fc3RhcnQsIFNUQVJUX1NDSEVEX1NDQU4pOwogCUNNRChwcm9iZV9jbGllbnQsIFBST0JFX0NMSUVOVCk7CisJQ01EKHNldF9ub2Fja19tYXAsIFNFVF9OT0FDS19NQVApOwogCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpIHsKIAkJaSsrOwogCQlOTEFfUFVUX1UzMihtc2csIGksIE5MODAyMTFfQ01EX1JFR0lTVEVSX0JFQUNPTlMpOwogCX0KIAorI2lmZGVmIENPTkZJR19OTDgwMjExX1RFU1RNT0RFCisJQ01EKHRlc3Rtb2RlX2NtZCwgVEVTVE1PREUpOworI2VuZGlmCisKICN1bmRlZiBDTUQKIAogCWlmIChkZXYtPm9wcy0+Y29ubmVjdCB8fCBkZXYtPm9wcy0+YXV0aCkgewpAQCAtOTExLDExICs5MjgsMTIgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIG5sX2NtZHMpOwogCi0JaWYgKGRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCkKKwlpZiAoZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsICYmCisJICAgIGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCkKIAkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OLAogCQkJICAgIGRldi0+d2lwaHkubWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uKTsKIAotCWlmIChkZXYtPm9wcy0+bWdtdF90eF9jYW5jZWxfd2FpdCkKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCkKIAkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX09GRkNIQU5ORUxfVFhfT0spOwogCiAJaWYgKG1nbXRfc3R5cGVzKSB7CkBAIC0xMDE5LDYgKzEwMzcsMTEgQEAKIAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsIGRldi0+d2lwaHkuZmVhdHVyZXMpOwogCisJaWYgKGRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzaykKKwkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisJCQlzaXplb2YoKmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayksCisJCQlkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spOworCiAJcmV0dXJuIGdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogIG5sYV9wdXRfZmFpbHVyZToKQEAgLTE3MzcsNiArMTc2MCwyMyBAQAogCXJldHVybiByZGV2LT5vcHMtPmRlbF92aXJ0dWFsX2ludGYoJnJkZXYtPndpcGh5LCBkZXYpOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwl1MTYgbm9hY2tfbWFwOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbm9hY2tfbWFwID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05PQUNLX01BUF0pOworCisJcmV0dXJuIHJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCgmcmRldi0+d2lwaHksIGRldiwgbm9hY2tfbWFwKTsKK30KKwogc3RydWN0IGdldF9rZXlfY29va2llIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCWludCBlcnJvcjsKQEAgLTIxNjcsNiArMjIwNywxMyBAQAogCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUF0pOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0pIHsKKwkJcGFyYW1zLnByb2JlX3Jlc3AgPQorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwkJcGFyYW1zLnByb2JlX3Jlc3BfbGVuID0KKwkJCW5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwl9CisKIAllcnIgPSBjYWxsKCZyZGV2LT53aXBoeSwgZGV2LCAmcGFyYW1zKTsKIAlpZiAoIWVyciAmJiBwYXJhbXMuaW50ZXJ2YWwpCiAJCXdkZXYtPmJlYWNvbl9pbnRlcnZhbCA9IHBhcmFtcy5pbnRlcnZhbDsKQEAgLTIxOTksNiArMjI0Niw3IEBACiAJW05MODAyMTFfU1RBX0ZMQUdfV01FXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX1NUQV9GTEFHX01GUF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUl0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIH07CiAKIHN0YXRpYyBpbnQgcGFyc2Vfc3RhdGlvbl9mbGFncyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLApAQCAtMjQ2NSwyNiArMjUxMywzNCBAQAogLyoKICAqIEdldCB2bGFuIGludGVyZmFjZSBtYWtpbmcgc3VyZSBpdCBpcyBydW5uaW5nIGFuZCBvbiB0aGUgcmlnaHQgd2lwaHkuCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X3ZsYW4oc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKLQkJICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKLQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqdmxhbikKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZ2V0X3ZsYW4oc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IG5sYXR0ciAqdmxhbmF0dHIgPSBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1ZMQU5dOwotCSp2bGFuID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdjsKKwlpbnQgcmV0OwogCi0JaWYgKHZsYW5hdHRyKSB7Ci0JCSp2bGFuID0gZGV2X2dldF9ieV9pbmRleChnZW5sX2luZm9fbmV0KGluZm8pLAotCQkJCQkgbmxhX2dldF91MzIodmxhbmF0dHIpKTsKLQkJaWYgKCEqdmxhbikKLQkJCXJldHVybiAtRU5PREVWOwotCQlpZiAoISgqdmxhbiktPmllZWU4MDIxMV9wdHIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCgqdmxhbiktPmllZWU4MDIxMV9wdHItPndpcGh5ICE9ICZyZGV2LT53aXBoeSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIW5ldGlmX3J1bm5pbmcoKnZsYW4pKQotCQkJcmV0dXJuIC1FTkVURE9XTjsKKwlpZiAoIXZsYW5hdHRyKQorCQlyZXR1cm4gTlVMTDsKKworCXYgPSBkZXZfZ2V0X2J5X2luZGV4KGdlbmxfaW5mb19uZXQoaW5mbyksIG5sYV9nZXRfdTMyKHZsYW5hdHRyKSk7CisJaWYgKCF2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmICghdi0+aWVlZTgwMjExX3B0ciB8fCB2LT5pZWVlODAyMTFfcHRyLT53aXBoeSAhPSAmcmRldi0+d2lwaHkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKIAl9Ci0JcmV0dXJuIDA7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcodikpIHsKKwkJcmV0ID0gLUVORVRET1dOOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiB2OworIGVycm9yOgorCWRldl9wdXQodik7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogc3RhdGljIGludCBubDgwMjExX3NldF9zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCkBAIC0yNTIzLDYgKzI1NzksOSBAQAogCQlwYXJhbXMuaHRfY2FwYSA9CiAJCQlubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pOwogCisJaWYgKCFyZGV2LT5vcHMtPmNoYW5nZV9zdGF0aW9uKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAocGFyc2Vfc3RhdGlvbl9mbGFncyhpbmZvLCAmcGFyYW1zKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTI1MzQsNzMgKzI1OTMsODQgQEAKIAkJcGFyYW1zLnBsaW5rX3N0YXRlID0KIAkJICAgIG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9QTElOS19TVEFURV0pOwogCi0JZXJyID0gZ2V0X3ZsYW4oaW5mbywgcmRldiwgJnBhcmFtcy52bGFuKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCS8qIHZhbGlkYXRlIHNldHRpbmdzICovCi0JZXJyID0gMDsKLQogCXN3aXRjaCAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKIAkJLyogZGlzYWxsb3cgbWVzaC1zcGVjaWZpYyB0aGluZ3MgKi8KIAkJaWYgKHBhcmFtcy5wbGlua19hY3Rpb24pCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogVERMUyBjYW4ndCBiZSBzZXQsIC4uLiAqLworCQlpZiAocGFyYW1zLnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIC4uLiBidXQgZG9uJ3QgYm90aGVyIHRoZSBkcml2ZXIgd2l0aCBpdC4gVGhpcyB3b3JrcyBhcm91bmQKKwkJICogYSBob3N0YXBkL3dwYV9zdXBwbGljYW50IGlzc3VlIC0tIGl0IGFsd2F5cyBpbmNsdWRlcyB0aGUKKwkJICogVExEU19QRUVSIGZsYWcgaW4gdGhlIG1hc2sgZXZlbiBmb3IgQVAgbW9kZS4KKwkJICovCisJCXBhcmFtcy5zdGFfZmxhZ3NfbWFzayAmPSB+QklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTsKKworCQkvKiBhY2NlcHQgb25seSB0aGUgbGlzdGVkIGJpdHMgKi8KKwkJaWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayAmCisJCQkJfihCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSB8CisJCQkJICBCSVQoTkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRSkgfAorCQkJCSAgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSB8CisJCQkJICBCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqLworCQlwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpOworCQlpZiAoSVNfRVJSKHBhcmFtcy52bGFuKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJLyogZGlzYWxsb3cgdGhpbmdzIHN0YSBkb2Vzbid0IHN1cHBvcnQgKi8KIAkJaWYgKHBhcmFtcy5wbGlua19hY3Rpb24pCi0JCQllcnIgPSAtRUlOVkFMOwotCQlpZiAocGFyYW1zLnZsYW4pCi0JCQllcnIgPSAtRUlOVkFMOwotCQlpZiAocGFyYW1zLnN1cHBvcnRlZF9yYXRlcyAmJgotCQkgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpKQotCQkJZXJyID0gLUVJTlZBTDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAocGFyYW1zLmh0X2NhcGEpCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChwYXJhbXMubGlzdGVuX2ludGVydmFsID49IDApCi0JCQllcnIgPSAtRUlOVkFMOwotCQlpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrICYKLQkJCQl+KEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpIHwKLQkJCQkgIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpKQotCQkJZXJyID0gLUVJTlZBTDsKLQkJLyogY2FuJ3QgY2hhbmdlIHRoZSBURExTIGJpdCAqLwotCQlpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpICYmCi0JCSAgICAocGFyYW1zLnN0YV9mbGFnc19tYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIERvbid0IGFsbG93IHVzZXJzcGFjZSB0byBjaGFuZ2UgdGhlIFRETFNfUEVFUiBmbGFnLAorCQkgKiBidXQgc2lsZW50bHkgaWdub3JlIGF0dGVtcHRzIHRvIGNoYW5nZSBpdCBzaW5jZSB3ZQorCQkgKiBkb24ndCBoYXZlIHN0YXRlIGhlcmUgdG8gdmVyaWZ5IHRoYXQgaXQgZG9lc24ndCB0cnkKKwkJICogdG8gY2hhbmdlIHRoZSBmbGFnLgorCQkgKi8KKwkJcGFyYW1zLnN0YV9mbGFnc19tYXNrICY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpOworCisJCS8qIHJlamVjdCBhbnkgY2hhbmdlcyBvdGhlciB0aGFuIEFVVEhPUklaRUQgKi8KKwkJaWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayAmIH5CSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CiAJCS8qIGRpc2FsbG93IHRoaW5ncyBtZXNoIGRvZXNuJ3Qgc3VwcG9ydCAqLwogCQlpZiAocGFyYW1zLnZsYW4pCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChwYXJhbXMuaHRfY2FwYSkKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPj0gMCkKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyoKKwkJICogTm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgVERMUyBoZXJlIC0tIHRoZSB1c2Vyc3BhY2UKKwkJICogbWVzaCBjb2RlIGRvZXNuJ3QgaGF2ZSB0aGlzIGJ1Zy4KKwkJICovCiAJCWlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgJgogCQkJCX4oQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfAogCQkJCSAgQklUKE5MODAyMTFfU1RBX0ZMQUdfTUZQKSB8CiAJCQkJICBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKSkpCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWlmICghcmRldi0+b3BzLT5jaGFuZ2Vfc3RhdGlvbikgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQorCS8qIGJlIGF3YXJlIG9mIHBhcmFtcy52bGFuIHdoZW4gY2hhbmdpbmcgY29kZSBoZXJlICovCiAKIAllcnIgPSByZGV2LT5vcHMtPmNoYW5nZV9zdGF0aW9uKCZyZGV2LT53aXBoeSwgZGV2LCBtYWNfYWRkciwgJnBhcmFtcyk7CiAKLSBvdXQ6CiAJaWYgKHBhcmFtcy52bGFuKQogCQlkZXZfcHV0KHBhcmFtcy52bGFuKTsKIApAQCAtMjY1NSw3MCArMjcyNSw4MSBAQAogCQlwYXJhbXMucGxpbmtfYWN0aW9uID0KIAkJICAgIG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9QTElOS19BQ1RJT05dKTsKIAorCWlmICghcmRldi0+b3BzLT5hZGRfc3RhdGlvbikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKHBhcnNlX3N0YXRpb25fZmxhZ3MoaW5mbywgJnBhcmFtcykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogcGFyc2UgV01FIGF0dHJpYnV0ZXMgaWYgc3RhIGlzIFdNRSBjYXBhYmxlICovCi0JaWYgKChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQVBfVUFQU0QpICYmCi0JICAgIChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpICYmCi0JICAgIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TVEFfV01FXSkgewotCQlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX1NUQV9XTUVfTUFYICsgMV07Ci0JCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzd2l0Y2ggKGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CisJCS8qIHBhcnNlIFdNRSBhdHRyaWJ1dGVzIGlmIHN0YSBpcyBXTUUgY2FwYWJsZSAqLworCQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19BUF9VQVBTRCkgJiYKKwkJICAgIChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpICYmCisJCSAgICBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1dNRV0pIHsKKwkJCXN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfU1RBX1dNRV9NQVggKyAxXTsKKwkJCXN0cnVjdCBubGF0dHIgKm5sYTsKIAotCQlubGEgPSBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1dNRV07Ci0JCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIE5MODAyMTFfU1RBX1dNRV9NQVgsIG5sYSwKLQkJCQkgICAgICAgbmw4MDIxMV9zdGFfd21lX3BvbGljeSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQkJbmxhID0gaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9XTUVdOworCQkJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkw4MDIxMV9TVEFfV01FX01BWCwgbmxhLAorCQkJCQkgICAgICAgbmw4MDIxMV9zdGFfd21lX3BvbGljeSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJaWYgKHRiW05MODAyMTFfU1RBX1dNRV9VQVBTRF9RVUVVRVNdKQotCQkJcGFyYW1zLnVhcHNkX3F1ZXVlcyA9Ci0JCQkgICAgIG5sYV9nZXRfdTgodGJbTkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFU10pOwotCQlpZiAocGFyYW1zLnVhcHNkX3F1ZXVlcyAmIH5JRUVFODAyMTFfV01NX0lFX1NUQV9RT1NJTkZPX0FDX01BU0spCisJCQlpZiAodGJbTkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFU10pCisJCQkJcGFyYW1zLnVhcHNkX3F1ZXVlcyA9CisJCQkJICAgICBubGFfZ2V0X3U4KHRiW05MODAyMTFfU1RBX1dNRV9VQVBTRF9RVUVVRVNdKTsKKwkJCWlmIChwYXJhbXMudWFwc2RfcXVldWVzICYKKwkJCQkJfklFRUU4MDIxMV9XTU1fSUVfU1RBX1FPU0lORk9fQUNfTUFTSykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKHRiW05MODAyMTFfU1RBX1dNRV9NQVhfU1BdKQorCQkJCXBhcmFtcy5tYXhfc3AgPQorCQkJCSAgICAgbmxhX2dldF91OCh0YltOTDgwMjExX1NUQV9XTUVfTUFYX1NQXSk7CisKKwkJCWlmIChwYXJhbXMubWF4X3NwICYKKwkJCQkJfklFRUU4MDIxMV9XTU1fSUVfU1RBX1FPU0lORk9fU1BfTUFTSykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJcGFyYW1zLnN0YV9tb2RpZnlfbWFzayB8PSBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEOworCQl9CisJCS8qIFRETFMgcGVlcnMgY2Fubm90IGJlIGFkZGVkICovCisJCWlmIChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogYnV0IGRvbid0IGJvdGhlciB0aGUgZHJpdmVyIHdpdGggaXQgKi8KKwkJcGFyYW1zLnN0YV9mbGFnc19tYXNrICY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpOwogCi0JCWlmICh0YltOTDgwMjExX1NUQV9XTUVfTUFYX1NQXSkKLQkJCXBhcmFtcy5tYXhfc3AgPQotCQkJICAgICBubGFfZ2V0X3U4KHRiW05MODAyMTFfU1RBX1dNRV9NQVhfU1BdKTsKLQotCQlpZiAocGFyYW1zLm1heF9zcCAmIH5JRUVFODAyMTFfV01NX0lFX1NUQV9RT1NJTkZPX1NQX01BU0spCisJCS8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqLworCQlwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpOworCQlpZiAoSVNfRVJSKHBhcmFtcy52bGFuKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgorCQkvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqLworCQlpZiAocGFyYW1zLnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcGFyYW1zLnN0YV9tb2RpZnlfbWFzayB8PSBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCS8qIE9ubHkgVERMUyBwZWVycyBjYW4gYmUgYWRkZWQgKi8KKwkJaWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBDYW4gb25seSBhZGQgaWYgVERMUyAuLi4gKi8KKwkJaWYgKCEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkvKiAuLi4gd2l0aCBleHRlcm5hbCBzZXR1cCBpcyBzdXBwb3J0ZWQgKi8KKwkJaWYgKCEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1RETFNfRVhURVJOQUxfU0VUVVApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JaWYgKGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JICAgIGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKLQkgICAgZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCAmJgotCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08gJiYKLQkgICAgZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKgotCSAqIE9ubHkgbWFuYWdlZCBzdGF0aW9ucyBjYW4gYWRkIFRETFMgcGVlcnMsIGFuZCBvbmx5IHdoZW4gdGhlCi0JICogd2lwaHkgc3VwcG9ydHMgZXh0ZXJuYWwgVERMUyBzZXR1cC4KLQkgKi8KLQlpZiAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCSAgICAhKChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpICYmCi0JICAgICAgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSAmJgotCSAgICAgIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVyciA9IGdldF92bGFuKGluZm8sIHJkZXYsICZwYXJhbXMudmxhbik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQkvKiB2YWxpZGF0ZSBzZXR0aW5ncyAqLwotCWVyciA9IDA7Ci0KLQlpZiAoIXJkZXYtPm9wcy0+YWRkX3N0YXRpb24pIHsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gb3V0OwotCX0KKwkvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqLwogCiAJZXJyID0gcmRldi0+b3BzLT5hZGRfc3RhdGlvbigmcmRldi0+d2lwaHksIGRldiwgbWFjX2FkZHIsICZwYXJhbXMpOwogCi0gb3V0OgogCWlmIChwYXJhbXMudmxhbikKIAkJZGV2X3B1dChwYXJhbXMudmxhbik7CiAJcmV0dXJuIGVycjsKQEAgLTMxMzksNiArMzIyMCw4IEBACiAJCQljdXJfcGFyYW1zLmRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dCk7CiAJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsCiAJCQljdXJfcGFyYW1zLmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwpOworCU5MQV9QVVRfVTE2KG1zZywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMLAorCQkJY3VyX3BhcmFtcy5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlOTEFfUFVUX1UxNihtc2csIE5MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUUsCiAJCQljdXJfcGFyYW1zLmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUpOwogCU5MQV9QVVRfVTgobXNnLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUk9PVE1PREUsCkBAIC0zMTczLDYgKzMyNTYsNyBAQAogCVtOTDgwMjExX01FU0hDT05GX01JTl9ESVNDT1ZFUllfVElNRU9VVF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfQUNUSVZFX1BBVEhfVElNRU9VVF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUxdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW05MODAyMTFfTUVTSENPTkZfSFdNUF9ORVRfRElBTV9UUlZTX1RJTUVdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JPT1RNT0RFXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKIAlbTkw4MDIxMV9NRVNIQ09ORl9IV01QX1JBTk5fSU5URVJWQUxdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKQEAgLTMyNDcsNiArMzMzMSw5IEBACiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsLAogCQkJbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BSRVFfTUlOX0lOVEVSVkFMLAogCQkJbmxhX2dldF91MTYpOworCUZJTExfSU5fTUVTSF9QQVJBTV9JRl9TRVQodGIsIGNmZywgZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbCwKKwkJCW1hc2ssIE5MODAyMTFfTUVTSENPTkZfSFdNUF9QRVJSX01JTl9JTlRFUlZBTCwKKwkJCW5sYV9nZXRfdTE2KTsKIAlGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsCiAJCQlkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lLAogCQkJbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRSwKQEAgLTMzNjksNiArMzQ1Niw5IEBACiAKIAlOTEFfUFVUX1NUUklORyhtc2csIE5MODAyMTFfQVRUUl9SRUdfQUxQSEEyLAogCQljZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMik7CisJaWYgKGNmZzgwMjExX3JlZ2RvbWFpbi0+ZGZzX3JlZ2lvbikKKwkJTkxBX1BVVF9VOChtc2csIE5MODAyMTFfQVRUUl9ERlNfUkVHSU9OLAorCQkJICAgY2ZnODAyMTFfcmVnZG9tYWluLT5kZnNfcmVnaW9uKTsKIAogCW5sX3JlZ19ydWxlcyA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX1JFR19SVUxFUyk7CiAJaWYgKCFubF9yZWdfcnVsZXMpCkBAIC0zNDI3LDYgKzM1MTcsNyBAQAogCWNoYXIgKmFscGhhMiA9IE5VTEw7CiAJaW50IHJlbV9yZWdfcnVsZXMgPSAwLCByID0gMDsKIAl1MzIgbnVtX3J1bGVzID0gMCwgcnVsZV9pZHggPSAwLCBzaXplX29mX3JlZ2Q7CisJdTggZGZzX3JlZ2lvbiA9IDA7CiAJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkID0gTlVMTDsKIAogCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKQpAQCAtMzQzNyw2ICszNTI4LDkgQEAKIAogCWFscGhhMiA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfQUxQSEEyXSk7CiAKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RGU19SRUdJT05dKQorCQlkZnNfcmVnaW9uID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0pOworCiAJbmxhX2Zvcl9lYWNoX25lc3RlZChubF9yZWdfcnVsZSwgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19SVUxFU10sCiAJCQlyZW1fcmVnX3J1bGVzKSB7CiAJCW51bV9ydWxlcysrOwpAQCAtMzQ2NCw2ICszNTU4LDEzIEBACiAJcmQtPmFscGhhMlswXSA9IGFscGhhMlswXTsKIAlyZC0+YWxwaGEyWzFdID0gYWxwaGEyWzFdOwogCisJLyoKKwkgKiBEaXNhYmxlIERGUyBtYXN0ZXIgbW9kZSBpZiB0aGUgREZTIHJlZ2lvbiB3YXMKKwkgKiBub3Qgc3VwcG9ydGVkIG9yIGtub3duIG9uIHRoaXMga2VybmVsLgorCSAqLworCWlmIChyZWdfc3VwcG9ydGVkX2Rmc19yZWdpb24oZGZzX3JlZ2lvbikpCisJCXJkLT5kZnNfcmVnaW9uID0gZGZzX3JlZ2lvbjsKKwogCW5sYV9mb3JfZWFjaF9uZXN0ZWQobmxfcmVnX3J1bGUsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9SRUdfUlVMRVNdLAogCQkJcmVtX3JlZ19ydWxlcykgewogCQlubGFfcGFyc2UodGIsIE5MODAyMTFfUkVHX1JVTEVfQVRUUl9NQVgsCkBAIC00MzcxLDYgKzQ0NzIsOSBAQAogCWNvbnN0IHU4ICpic3NpZCwgKnNzaWQsICppZSA9IE5VTEwsICpwcmV2X2Jzc2lkID0gTlVMTDsKIAlpbnQgZXJyLCBzc2lkX2xlbiwgaWVfbGVuID0gMDsKIAlib29sIHVzZV9tZnAgPSBmYWxzZTsKKwl1MzIgZmxhZ3MgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrID0gTlVMTDsKIAogCWlmICghaXNfdmFsaWRfaWVfYXR0cihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUVdKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NDE0LDExICs0NTE4LDI1IEBACiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9QUkVWX0JTU0lEXSkKIAkJcHJldl9ic3NpZCA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9QUkVWX0JTU0lEXSk7CiAKKwlpZiAobmxhX2dldF9mbGFnKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSkpCisJCWZsYWdzIHw9IEFTU09DX1JFUV9ESVNBQkxFX0hUOworCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0tdKQorCQlodF9jYXBhX21hc2sgPQorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFlfTUFTS10pOworCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSkgeworCQlpZiAoIWh0X2NhcGFfbWFzaykKKwkJCXJldHVybiAtRUlOVkFMOworCQlodF9jYXBhID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKTsKKwl9CisKIAllcnIgPSBubDgwMjExX2NyeXB0b19zZXR0aW5ncyhyZGV2LCBpbmZvLCAmY3J5cHRvLCAxKTsKIAlpZiAoIWVycikKIAkJZXJyID0gY2ZnODAyMTFfbWxtZV9hc3NvYyhyZGV2LCBkZXYsIGNoYW4sIGJzc2lkLCBwcmV2X2Jzc2lkLAogCQkJCQkgIHNzaWQsIHNzaWRfbGVuLCBpZSwgaWVfbGVuLCB1c2VfbWZwLAotCQkJCQkgICZjcnlwdG8pOworCQkJCQkgICZjcnlwdG8sIGZsYWdzLCBodF9jYXBhLAorCQkJCQkgIGh0X2NhcGFfbWFzayk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDU4OSwxMyArNDcwNyw0MSBAQAogCQlpYnNzLmllX2xlbiA9IG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0lFXSk7CiAJfQogCi0JaWJzcy5jaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LAotCQlubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfRlJFUV0pKTsKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRV0pIHsKKwkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7CisKKwkJY2hhbm5lbF90eXBlID0gbmxhX2dldF91MzIoCisJCQkJaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRV0pOworCQlpZiAoY2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9OT19IVCAmJgorCQkgICAgY2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9IVDIwICYmCisJCSAgICBjaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX0hUNDBNSU5VUyAmJgorCQkgICAgY2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9IVDQwUExVUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX05PX0hUICYmCisJCSAgICAhKHdpcGh5LT5mZWF0dXJlcyAmIE5MODAyMTFfRkVBVFVSRV9IVF9JQlNTKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlic3MuY2hhbm5lbF90eXBlID0gY2hhbm5lbF90eXBlOworCX0gZWxzZSB7CisJCWlic3MuY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX05PX0hUOworCX0KKworCWlic3MuY2hhbm5lbCA9IHJkZXZfZnJlcV90b19jaGFuKHJkZXYsCisJCW5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9GUkVRXSksCisJCWlic3MuY2hhbm5lbF90eXBlKTsKIAlpZiAoIWlic3MuY2hhbm5lbCB8fAogCSAgICBpYnNzLmNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8fAogCSAgICBpYnNzLmNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogQm90aCBjaGFubmVscyBzaG91bGQgYmUgYWJsZSB0byBpbml0aWF0ZSBjb21tdW5pY2F0aW9uICovCisJaWYgKChpYnNzLmNoYW5uZWxfdHlwZSA9PSBOTDgwMjExX0NIQU5fSFQ0MFBMVVMgfHwKKwkgICAgIGlic3MuY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMpICYmCisJICAgICFjZmc4MDIxMV9jYW5fYmVhY29uX3NlY19jaGFuKCZyZGV2LT53aXBoeSwgaWJzcy5jaGFubmVsLAorCQkJCQkgIGlic3MuY2hhbm5lbF90eXBlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpYnNzLmNoYW5uZWxfZml4ZWQgPSAhIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9GUkVRX0ZJWEVEXTsKIAlpYnNzLnByaXZhY3kgPSAhIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9QUklWQUNZXTsKIApAQCAtNDY3NCw3ICs0ODIwLDcgQEAKIHN0YXRpYyBpbnQgbmw4MDIxMV90ZXN0bW9kZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CiAJaW50IGVycjsKIAlsb25nIHBoeV9pZHg7CiAJdm9pZCAqZGF0YSA9IE5VTEw7CkBAIC00NjkyLDkgKzQ4MzgsMjEgQEAKIAkJCQkgIG5sODAyMTFfcG9saWN5KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCWlmICghbmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfV0lQSFldKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBoeV9pZHggPSBubGFfZ2V0X3UzMihubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9XSVBIWV0pOworCQlpZiAobmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfV0lQSFldKSB7CisJCQlwaHlfaWR4ID0gbmxhX2dldF91MzIoCisJCQkJbmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfV0lQSFldKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKKwkJCWVyciA9IGdldF9yZGV2X2Rldl9ieV9pZmluZGV4KHNvY2tfbmV0KHNrYi0+c2spLAorCQkJCQkJICAgICAgbmw4MDIxMV9mYW0uYXR0cmJ1ZiwKKwkJCQkJCSAgICAgICZyZGV2LCAmbmV0ZGV2KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWRldl9wdXQobmV0ZGV2KTsKKwkJCXBoeV9pZHggPSByZGV2LT53aXBoeV9pZHg7CisJCQljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKKwkJfQogCQlpZiAobmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfVEVTVERBVEFdKQogCQkJY2ItPmFyZ3NbMV0gPQogCQkJCShsb25nKW5sODAyMTFfZmFtLmF0dHJidWZbTkw4MDIxMV9BVFRSX1RFU1REQVRBXTsKQEAgLTQ3MDYsMTUgKzQ4NjQsMTUgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZjZmc4MDIxMV9tdXRleCk7Ci0JZGV2ID0gY2ZnODAyMTFfcmRldl9ieV93aXBoeV9pZHgocGh5X2lkeCk7Ci0JaWYgKCFkZXYpIHsKKwlyZGV2ID0gY2ZnODAyMTFfcmRldl9ieV93aXBoeV9pZHgocGh5X2lkeCk7CisJaWYgKCFyZGV2KSB7CiAJCW11dGV4X3VubG9jaygmY2ZnODAyMTFfbXV0ZXgpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JY2ZnODAyMTFfbG9ja19yZGV2KGRldik7CisJY2ZnODAyMTFfbG9ja19yZGV2KHJkZXYpOwogCW11dGV4X3VubG9jaygmY2ZnODAyMTFfbXV0ZXgpOwogCi0JaWYgKCFkZXYtPm9wcy0+dGVzdG1vZGVfZHVtcCkgeworCWlmICghcmRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKSB7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dF9lcnI7CiAJfQpAQCAtNDcyNSw3ICs0ODgzLDcgQEAKIAkJCQkJICAgTkw4MDIxMV9DTURfVEVTVE1PREUpOwogCQlzdHJ1Y3QgbmxhdHRyICp0bWRhdGE7CiAKLQkJaWYgKG5sYV9wdXRfdTMyKHNrYiwgTkw4MDIxMV9BVFRSX1dJUEhZLCBkZXYtPndpcGh5X2lkeCkgPCAwKSB7CisJCWlmIChubGFfcHV0X3UzMihza2IsIE5MODAyMTFfQVRUUl9XSVBIWSwgcGh5X2lkeCkgPCAwKSB7CiAJCQlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CiAJCQlicmVhazsKIAkJfQpAQCAtNDczNSw4ICs0ODkzLDggQEAKIAkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWVyciA9IGRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKCZkZXYtPndpcGh5LCBza2IsIGNiLAotCQkJCQkgICAgICBkYXRhLCBkYXRhX2xlbik7CisJCWVyciA9IHJkZXYtPm9wcy0+dGVzdG1vZGVfZHVtcCgmcmRldi0+d2lwaHksIHNrYiwgY2IsCisJCQkJCSAgICAgICBkYXRhLCBkYXRhX2xlbik7CiAJCW5sYV9uZXN0X2VuZChza2IsIHRtZGF0YSk7CiAKIAkJaWYgKGVyciA9PSAtRU5PQlVGUyB8fCBlcnIgPT0gLUVOT0VOVCkgewpAQCAtNDc1NCw3ICs0OTEyLDcgQEAKIAkvKiBzZWUgYWJvdmUgKi8KIAljYi0+YXJnc1swXSA9IHBoeV9pZHggKyAxOwogIG91dF9lcnI6Ci0JY2ZnODAyMTFfdW5sb2NrX3JkZXYoZGV2KTsKKwljZmc4MDIxMV91bmxvY2tfcmRldihyZGV2KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00OTA4LDYgKzUwNjYsMjIgQEAKIAkJCXJldHVybiBQVFJfRVJSKGNvbm5rZXlzKTsKIAl9CiAKKwlpZiAobmxhX2dldF9mbGFnKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSkpCisJCWNvbm5lY3QuZmxhZ3MgfD0gQVNTT0NfUkVRX0RJU0FCTEVfSFQ7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFlfTUFTS10pCisJCW1lbWNweSgmY29ubmVjdC5odF9jYXBhX21hc2ssCisJCSAgICAgICBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSksCisJCSAgICAgICBzaXplb2YoY29ubmVjdC5odF9jYXBhX21hc2spKTsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pIHsKKwkJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1jcHkoJmNvbm5lY3QuaHRfY2FwYSwKKwkJICAgICAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSksCisJCSAgICAgICBzaXplb2YoY29ubmVjdC5odF9jYXBhKSk7CisJfQorCiAJZXJyID0gY2ZnODAyMTFfY29ubmVjdChyZGV2LCBkZXYsICZjb25uZWN0LCBjb25ua2V5cyk7CiAJaWYgKGVycikKIAkJa2ZyZWUoY29ubmtleXMpOwpAQCAtNTA5NSw3ICs1MjY5LDggQEAKIAkgICAgZHVyYXRpb24gPiByZGV2LT53aXBoeS5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFyZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsKQorCWlmICghcmRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCB8fAorCSAgICAhKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0NIQU5ORUxfVFlQRV0pIHsKQEAgLTUyODMsNyArNTQ1OCw3IEBACiAJYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQgPSBmYWxzZTsKIAl1MzIgZnJlcTsKIAlpbnQgZXJyOwotCXZvaWQgKmhkcjsKKwl2b2lkICpoZHIgPSBOVUxMOwogCXU2NCBjb29raWU7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHdhaXQgPSAwOwpAQCAtNTMwOCw3ICs1NDgzLDcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9EVVJBVElPTl0pIHsKLQkJaWYgKCFyZGV2LT5vcHMtPm1nbXRfdHhfY2FuY2VsX3dhaXQpCisJCWlmICghKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19PRkZDSEFOX1RYKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQl3YWl0ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RVUkFUSU9OXSk7CiAJfQpAQCAtNTMyNiw2ICs1NTAxLDkgQEAKIAogCW9mZmNoYW4gPSBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfT0ZGQ0hBTk5FTF9UWF9PS107CiAKKwlpZiAob2ZmY2hhbiAmJiAhKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19PRkZDSEFOX1RYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlub19jY2sgPSBubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1RYX05PX0NDS19SQVRFXSk7CiAKIAlmcmVxID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVFdKTsKQEAgLTU1NjAsNiArNTczOCwxMSBAQAogCXNldHVwLm1lc2hfaWQgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9JRF0pOwogCXNldHVwLm1lc2hfaWRfbGVuID0gbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9JRF0pOwogCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NQ0FTVF9SQVRFXSAmJgorCSAgICAhbmw4MDIxMV9wYXJzZV9tY2FzdF9yYXRlKHJkZXYsIHNldHVwLm1jYXN0X3JhdGUsCisJCQkgICAgbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX01DQVNUX1JBVEVdKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUVTSF9TRVRVUF0pIHsKIAkJLyogcGFyc2UgYWRkaXRpb25hbCBzZXR1cCBwYXJhbWV0ZXJzIGlmIGdpdmVuICovCiAJCWVyciA9IG5sODAyMTFfcGFyc2VfbWVzaF9zZXR1cChpbmZvLCAmc2V0dXApOwpAQCAtNTk2NCw3ICs2MTQ3LDggQEAKIAkJfQogCQlpbmZvLT51c2VyX3B0clswXSA9IHJkZXY7CiAJfSBlbHNlIGlmIChvcHMtPmludGVybmFsX2ZsYWdzICYgTkw4MDIxMV9GTEFHX05FRURfTkVUREVWKSB7Ci0JCWVyciA9IGdldF9yZGV2X2Rldl9ieV9pbmZvX2lmaW5kZXgoaW5mbywgJnJkZXYsICZkZXYpOworCQllcnIgPSBnZXRfcmRldl9kZXZfYnlfaWZpbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5hdHRycywKKwkJCQkJICAgICAgJnJkZXYsICZkZXYpOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAocnRubCkKIAkJCQlydG5sX3VubG9jaygpOwpAQCAtNjUxNiw2ICs2NzAwLDE1IEBACiAJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dJUEhZIHwKIAkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCiAJfSwKKwl7CisJCS5jbWQgPSBOTDgwMjExX0NNRF9TRVRfTk9BQ0tfTUFQLAorCQkuZG9pdCA9IG5sODAyMTFfc2V0X25vYWNrX21hcCwKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX05FVERFViB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgbmw4MDIxMV9tbG1lX21jZ3JwID0gewpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JhZGlvdGFwLmMgYi9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYwppbmRleCBkYmUzNWUxLi5jNGFkNzk1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYworKysgYi9uZXQvd2lyZWxlc3MvcmFkaW90YXAuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5jIGIvbmV0L3dpcmVsZXNzL3JlZy5jCmluZGV4IDI1MjBhMWIuLmM0NWM4YjcgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9yZWcuYworKysgYi9uZXQvd2lyZWxlc3MvcmVnLmMKQEAgLTM2LDEyICszNiwxNCBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L25sODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJyZWcuaCIKQEAgLTU1LDggKzU3LDE3IEBACiAjZGVmaW5lIFJFR19EQkdfUFJJTlQoYXJncy4uLikKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCBjb3JlX3JlcXVlc3Rfd29ybGQgPSB7CisJLmluaXRpYXRvciA9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFLAorCS5hbHBoYTJbMF0gPSAnMCcsCisJLmFscGhhMlsxXSA9ICcwJywKKwkuaW50ZXJzZWN0ID0gZmFsc2UsCisJLnByb2Nlc3NlZCA9IHRydWUsCisJLmNvdW50cnlfaWVfZW52ID0gRU5WSVJPTl9BTlksCit9OworCiAvKiBSZWNlaXB0IG9mIGluZm9ybWF0aW9uIGZyb20gbGFzdCByZWd1bGF0b3J5IHJlcXVlc3QgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpsYXN0X3JlcXVlc3Q7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqbGFzdF9yZXF1ZXN0ID0gJmNvcmVfcmVxdWVzdF93b3JsZDsKIAogLyogVG8gdHJpZ2dlciB1c2Vyc3BhY2UgZXZlbnRzICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcmVnX3BkZXY7CkBAIC0xNDgsNyArMTU5LDcgQEAKIG1vZHVsZV9wYXJhbShpZWVlODAyMTFfcmVnZG9tLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGllZWU4MDIxMV9yZWdkb20sICJJRUVFIDgwMi4xMSByZWd1bGF0b3J5IGRvbWFpbiBjb2RlIik7CiAKLXN0YXRpYyB2b2lkIHJlc2V0X3JlZ2RvbWFpbnModm9pZCkKK3N0YXRpYyB2b2lkIHJlc2V0X3JlZ2RvbWFpbnMoYm9vbCBmdWxsX3Jlc2V0KQogewogCS8qIGF2b2lkIGZyZWVpbmcgc3RhdGljIGluZm9ybWF0aW9uIG9yIGZyZWVpbmcgc29tZXRoaW5nIHR3aWNlICovCiAJaWYgKGNmZzgwMjExX3JlZ2RvbWFpbiA9PSBjZmc4MDIxMV93b3JsZF9yZWdkb20pCkBAIC0xNjMsNiArMTc0LDEzIEBACiAKIAljZmc4MDIxMV93b3JsZF9yZWdkb20gPSAmd29ybGRfcmVnZG9tOwogCWNmZzgwMjExX3JlZ2RvbWFpbiA9IE5VTEw7CisKKwlpZiAoIWZ1bGxfcmVzZXQpCisJCXJldHVybjsKKworCWlmIChsYXN0X3JlcXVlc3QgIT0gJmNvcmVfcmVxdWVzdF93b3JsZCkKKwkJa2ZyZWUobGFzdF9yZXF1ZXN0KTsKKwlsYXN0X3JlcXVlc3QgPSAmY29yZV9yZXF1ZXN0X3dvcmxkOwogfQogCiAvKgpAQCAtMTczLDcgKzE5MSw3IEBACiB7CiAJQlVHX09OKCFsYXN0X3JlcXVlc3QpOwogCi0JcmVzZXRfcmVnZG9tYWlucygpOworCXJlc2V0X3JlZ2RvbWFpbnMoZmFsc2UpOwogCiAJY2ZnODAyMTFfd29ybGRfcmVnZG9tID0gcmQ7CiAJY2ZnODAyMTFfcmVnZG9tYWluID0gcmQ7CkBAIC04NTUsMTAgKzg3MywyMiBAQAogCWNoYW4tPmZsYWdzID0gZmxhZ3MgfCBid19mbGFncyB8IG1hcF9yZWdkb21fZmxhZ3MocmVnX3J1bGUtPmZsYWdzKTsKIAljaGFuLT5tYXhfYW50ZW5uYV9nYWluID0gbWluKGNoYW4tPm9yaWdfbWFnLAogCQkoaW50KSBNQklfVE9fREJJKHBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4pKTsKLQlpZiAoY2hhbi0+b3JpZ19tcHdyKQotCQljaGFuLT5tYXhfcG93ZXIgPSBtaW4oY2hhbi0+b3JpZ19tcHdyLAotCQkJKGludCkgTUJNX1RPX0RCTShwb3dlcl9ydWxlLT5tYXhfZWlycCkpOwotCWVsc2UKKwlpZiAoY2hhbi0+b3JpZ19tcHdyKSB7CisJCS8qCisJCSAqIERldmljZXMgdGhhdCBoYXZlIHRoZWlyIG93biBjdXN0b20gcmVndWxhdG9yeSBkb21haW4KKwkJICogYnV0IGFsc28gdXNlIFdJUEhZX0ZMQUdfU1RSSUNUX1JFR1VMQVRPUlkgd2lsbCBmb2xsb3cgdGhlCisJCSAqIHBhc3NlZCBjb3VudHJ5IElFIHBvd2VyIHNldHRpbmdzLgorCQkgKi8KKwkJaWYgKGluaXRpYXRvciA9PSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09VTlRSWV9JRSAmJgorCQkgICAgd2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSAmJgorCQkgICAgd2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19TVFJJQ1RfUkVHVUxBVE9SWSkgeworCQkJY2hhbi0+bWF4X3Bvd2VyID0KKwkJCQlNQk1fVE9fREJNKHBvd2VyX3J1bGUtPm1heF9laXJwKTsKKwkJfSBlbHNlIHsKKwkJCWNoYW4tPm1heF9wb3dlciA9IG1pbihjaGFuLT5vcmlnX21wd3IsCisJCQkJKGludCkgTUJNX1RPX0RCTShwb3dlcl9ydWxlLT5tYXhfZWlycCkpOworCQl9CisJfSBlbHNlCiAJCWNoYW4tPm1heF9wb3dlciA9IChpbnQpIE1CTV9UT19EQk0ocG93ZXJfcnVsZS0+bWF4X2VpcnApOwogfQogCkBAIC0xMTIxLDYgKzExNTEsOCBAQAogCWlmIChpZ25vcmVfcmVnX3VwZGF0ZSh3aXBoeSwgaW5pdGlhdG9yKSkKIAkJcmV0dXJuOwogCisJbGFzdF9yZXF1ZXN0LT5kZnNfcmVnaW9uID0gY2ZnODAyMTFfcmVnZG9tYWluLT5kZnNfcmVnaW9uOworCiAJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgewogCQlpZiAod2lwaHktPmJhbmRzW2JhbmRdKQogCQkJaGFuZGxlX2JhbmQod2lwaHksIGJhbmQsIGluaXRpYXRvcik7CkBAIC0xMTQzLDkgKzExNzUsMjEgQEAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9hbGxfd2lwaHlfcmVndWxhdG9yeShlbnVtIG5sODAyMTFfcmVnX2luaXRpYXRvciBpbml0aWF0b3IpCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2OworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpCi0JCXdpcGh5X3VwZGF0ZV9yZWd1bGF0b3J5KCZyZGV2LT53aXBoeSwgaW5pdGlhdG9yKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpIHsKKwkJd2lwaHkgPSAmcmRldi0+d2lwaHk7CisJCXdpcGh5X3VwZGF0ZV9yZWd1bGF0b3J5KHdpcGh5LCBpbml0aWF0b3IpOworCQkvKgorCQkgKiBSZWd1bGF0b3J5IHVwZGF0ZXMgc2V0IGJ5IENPUkUgYXJlIGlnbm9yZWQgZm9yIGN1c3RvbQorCQkgKiByZWd1bGF0b3J5IGNhcmRzLiBMZXQgdXMgbm90aWZ5IHRoZSBjaGFuZ2VzIHRvIHRoZSBkcml2ZXIsCisJCSAqIGFzIHNvbWUgZHJpdmVycyB1c2VkIHRoaXMgdG8gcmVzdG9yZSBpdHMgb3JpZ18qIHJlZyBkb21haW4uCisJCSAqLworCQlpZiAoaW5pdGlhdG9yID09IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1JFICYmCisJCSAgICB3aXBoeS0+ZmxhZ3MgJiBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZICYmCisJCSAgICB3aXBoeS0+cmVnX25vdGlmaWVyKQorCQkJd2lwaHktPnJlZ19ub3RpZmllcih3aXBoeSwgbGFzdF9yZXF1ZXN0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9jaGFubmVsX2N1c3RvbShzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtMTQwNSw3ICsxNDQ5LDggQEAKIAl9CiAKIG5ld19yZXF1ZXN0OgotCWtmcmVlKGxhc3RfcmVxdWVzdCk7CisJaWYgKGxhc3RfcmVxdWVzdCAhPSAmY29yZV9yZXF1ZXN0X3dvcmxkKQorCQlrZnJlZShsYXN0X3JlcXVlc3QpOwogCiAJbGFzdF9yZXF1ZXN0ID0gcGVuZGluZ19yZXF1ZXN0OwogCWxhc3RfcmVxdWVzdC0+aW50ZXJzZWN0ID0gaW50ZXJzZWN0OwpAQCAtMTU3NSw5ICsxNjIwLDYgQEAKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0OwogCi0Ja2ZyZWUobGFzdF9yZXF1ZXN0KTsKLQlsYXN0X3JlcXVlc3QgPSBOVUxMOwotCiAJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QpLAogCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcXVlc3QpCkBAIC0xNzUwLDYgKzE3OTIsMjYgQEAKIAkJUkVHX0RCR19QUklOVCgiUmVzdG9yaW5nIHJlZ3VsYXRvcnkgc2V0dGluZ3NcbiIpOwogfQogCitzdGF0aWMgdm9pZCByZXN0b3JlX2N1c3RvbV9yZWdfc2V0dGluZ3Moc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWludCBpOworCisJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgeworCQlzYmFuZCA9IHdpcGh5LT5iYW5kc1tiYW5kXTsKKwkJaWYgKCFzYmFuZCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fY2hhbm5lbHM7IGkrKykgeworCQkJY2hhbiA9ICZzYmFuZC0+Y2hhbm5lbHNbaV07CisJCQljaGFuLT5mbGFncyA9IGNoYW4tPm9yaWdfZmxhZ3M7CisJCQljaGFuLT5tYXhfYW50ZW5uYV9nYWluID0gY2hhbi0+b3JpZ19tYWc7CisJCQljaGFuLT5tYXhfcG93ZXIgPSBjaGFuLT5vcmlnX21wd3I7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBSZXN0b3JpbmcgcmVndWxhdG9yeSBzZXR0aW5ncyBpbnZvbHZlcyBpbmdvcmluZyBhbnkKICAqIHBvc3NpYmx5IHN0YWxlIGNvdW50cnkgSUUgaW5mb3JtYXRpb24gYW5kIHVzZXIgcmVndWxhdG9yeQpAQCAtMTc3MSwxMSArMTgzMywxMiBAQAogCXN0cnVjdCByZWdfYmVhY29uICpyZWdfYmVhY29uLCAqYnRtcDsKIAlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZWdfcmVxdWVzdCwgKnRtcDsKIAlMSVNUX0hFQUQodG1wX3JlZ19yZXFfbGlzdCk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2OwogCiAJbXV0ZXhfbG9jaygmY2ZnODAyMTFfbXV0ZXgpOwogCW11dGV4X2xvY2soJnJlZ19tdXRleCk7CiAKLQlyZXNldF9yZWdkb21haW5zKCk7CisJcmVzZXRfcmVnZG9tYWlucyh0cnVlKTsKIAlyZXN0b3JlX2FscGhhMihhbHBoYTIsIHJlc2V0X3VzZXIpOwogCiAJLyoKQEAgLTE4MTksNiArMTg4MiwxMSBAQAogCS8qIEZpcnN0IHJlc3RvcmUgdG8gdGhlIGJhc2ljIHJlZ3VsYXRvcnkgc2V0dGluZ3MgKi8KIAljZmc4MDIxMV9yZWdkb21haW4gPSBjZmc4MDIxMV93b3JsZF9yZWdkb207CiAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSkKKwkJCXJlc3RvcmVfY3VzdG9tX3JlZ19zZXR0aW5ncygmcmRldi0+d2lwaHkpOworCX0KKwogCW11dGV4X3VubG9jaygmcmVnX211dGV4KTsKIAltdXRleF91bmxvY2soJmNmZzgwMjExX211dGV4KTsKIApAQCAtMTk0Niw2ICsyMDE0LDQyIEBACiAJfQogfQogCitib29sIHJlZ19zdXBwb3J0ZWRfZGZzX3JlZ2lvbih1OCBkZnNfcmVnaW9uKQoreworCXN3aXRjaCAoZGZzX3JlZ2lvbikgeworCWNhc2UgTkw4MDIxMV9ERlNfVU5TRVQ6CisJY2FzZSBOTDgwMjExX0RGU19GQ0M6CisJY2FzZSBOTDgwMjExX0RGU19FVFNJOgorCWNhc2UgTkw4MDIxMV9ERlNfSlA6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCVJFR19EQkdfUFJJTlQoIklnbm9yaW5nIHVrbm93biBERlMgbWFzdGVyIHJlZ2lvbjogJWRcbiIsCisJCQkgICAgICBkZnNfcmVnaW9uKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfZGZzX3JlZ2lvbih1OCBkZnNfcmVnaW9uKQoreworCWlmICghZGZzX3JlZ2lvbikKKwkJcmV0dXJuOworCisJc3dpdGNoIChkZnNfcmVnaW9uKSB7CisJY2FzZSBOTDgwMjExX0RGU19GQ0M6CisJCXByX2luZm8oIiBERlMgTWFzdGVyIHJlZ2lvbiBGQ0MiKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0RGU19FVFNJOgorCQlwcl9pbmZvKCIgREZTIE1hc3RlciByZWdpb24gRVRTSSIpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfREZTX0pQOgorCQlwcl9pbmZvKCIgREZTIE1hc3RlciByZWdpb24gSlAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfaW5mbygiIERGUyBNYXN0ZXIgcmVnaW9uIFVrbm93biIpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHByaW50X3JlZ2RvbWFpbihjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCiB7CiAKQEAgLTE5NzMsNiArMjA3Nyw3IEBACiAJCQlwcl9pbmZvKCJSZWd1bGF0b3J5IGRvbWFpbiBjaGFuZ2VkIHRvIGNvdW50cnk6ICVjJWNcbiIsCiAJCQkJcmQtPmFscGhhMlswXSwgcmQtPmFscGhhMlsxXSk7CiAJfQorCXByaW50X2Rmc19yZWdpb24ocmQtPmRmc19yZWdpb24pOwogCXByaW50X3JkX3J1bGVzKHJkKTsKIH0KIApAQCAtMjAzNSwxMiArMjE0MCwxOCBAQAogCX0KIAogCXJlcXVlc3Rfd2lwaHkgPSB3aXBoeV9pZHhfdG9fd2lwaHkobGFzdF9yZXF1ZXN0LT53aXBoeV9pZHgpOworCWlmICghcmVxdWVzdF93aXBoeSAmJgorCSAgICAobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUiB8fAorCSAgICAgbGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUpKSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmVnX3RpbWVvdXQsIDApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlpZiAoIWxhc3RfcmVxdWVzdC0+aW50ZXJzZWN0KSB7CiAJCWludCByOwogCiAJCWlmIChsYXN0X3JlcXVlc3QtPmluaXRpYXRvciAhPSBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSKSB7Ci0JCQlyZXNldF9yZWdkb21haW5zKCk7CisJCQlyZXNldF9yZWdkb21haW5zKGZhbHNlKTsKIAkJCWNmZzgwMjExX3JlZ2RvbWFpbiA9IHJkOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIwNjEsNyArMjE3Miw3IEBACiAJCWlmIChyKQogCQkJcmV0dXJuIHI7CiAKLQkJcmVzZXRfcmVnZG9tYWlucygpOworCQlyZXNldF9yZWdkb21haW5zKGZhbHNlKTsKIAkJY2ZnODAyMTFfcmVnZG9tYWluID0gcmQ7CiAJCXJldHVybiAwOwogCX0KQEAgLTIwODYsNyArMjE5Nyw3IEBACiAKIAkJcmQgPSBOVUxMOwogCi0JCXJlc2V0X3JlZ2RvbWFpbnMoKTsKKwkJcmVzZXRfcmVnZG9tYWlucyhmYWxzZSk7CiAJCWNmZzgwMjExX3JlZ2RvbWFpbiA9IGludGVyc2VjdGVkX3JkOwogCiAJCXJldHVybiAwOwpAQCAtMjEwNiw3ICsyMjE3LDcgQEAKIAlrZnJlZShyZCk7CiAJcmQgPSBOVUxMOwogCi0JcmVzZXRfcmVnZG9tYWlucygpOworCXJlc2V0X3JlZ2RvbWFpbnMoZmFsc2UpOwogCWNmZzgwMjExX3JlZ2RvbWFpbiA9IGludGVyc2VjdGVkX3JkOwogCiAJcmV0dXJuIDA7CkBAIC0yMjU5LDkgKzIzNzAsOSBAQAogCW11dGV4X2xvY2soJmNmZzgwMjExX211dGV4KTsKIAltdXRleF9sb2NrKCZyZWdfbXV0ZXgpOwogCi0JcmVzZXRfcmVnZG9tYWlucygpOworCXJlc2V0X3JlZ2RvbWFpbnModHJ1ZSk7CiAKLQlrZnJlZShsYXN0X3JlcXVlc3QpOworCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZyZWdfcGRldi0+ZGV2LCB0cnVlKTsKIAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHJlZ19wZGV2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5oIGIvbmV0L3dpcmVsZXNzL3JlZy5oCmluZGV4IDRhNTY3OTkuLjc4NmU0MTQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9yZWcuaAorKysgYi9uZXQvd2lyZWxlc3MvcmVnLmgKQEAgLTUsNiArNSw3IEBACiAKIGJvb2wgaXNfd29ybGRfcmVnZG9tKGNvbnN0IGNoYXIgKmFscGhhMik7CiBib29sIHJlZ19pc192YWxpZF9yZXF1ZXN0KGNvbnN0IGNoYXIgKmFscGhhMik7Citib29sIHJlZ19zdXBwb3J0ZWRfZGZzX3JlZ2lvbih1OCBkZnNfcmVnaW9uKTsKIAogaW50IHJlZ3VsYXRvcnlfaGludF91c2VyKGNvbnN0IGNoYXIgKmFscGhhMik7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IGRjMjNiMzEuLjMxMTE5ZTMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMzU1LDggKzM1NSw4IEBACiAJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llKSAtIDIpID09IDA7CiB9CiAKLXN0YXRpYyBpbnQgY21wX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfYnNzICphLAotCQkgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpiKQorc3RhdGljIGludCBjbXBfYnNzX2NvcmUoc3RydWN0IGNmZzgwMjExX2JzcyAqYSwKKwkJCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmIpCiB7CiAJaW50IHI7CiAKQEAgLTM3OCw3ICszNzgsMTUgQEAKIAkJCSAgICAgICBiLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOwogCX0KIAotCXIgPSBtZW1jbXAoYS0+YnNzaWQsIGItPmJzc2lkLCBFVEhfQUxFTik7CisJcmV0dXJuIG1lbWNtcChhLT5ic3NpZCwgYi0+YnNzaWQsIEVUSF9BTEVOKTsKK30KKworc3RhdGljIGludCBjbXBfYnNzKHN0cnVjdCBjZmc4MDIxMV9ic3MgKmEsCisJCSAgIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmIpCit7CisJaW50IHI7CisKKwlyID0gY21wX2Jzc19jb3JlKGEsIGIpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIApAQCAtMzg5LDYgKzM5Nyw1MiBAQAogCQkgICAgICAgYi0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKIH0KIAorc3RhdGljIGludCBjbXBfaGlkZGVuX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfYnNzICphLAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpiKQoreworCWNvbnN0IHU4ICppZTE7CisJY29uc3QgdTggKmllMjsKKwlpbnQgaTsKKwlpbnQgcjsKKworCXIgPSBjbXBfYnNzX2NvcmUoYSwgYik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWUxID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELAorCQkJYS0+aW5mb3JtYXRpb25fZWxlbWVudHMsCisJCQlhLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOworCWllMiA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwKKwkJCWItPmluZm9ybWF0aW9uX2VsZW1lbnRzLAorCQkJYi0+bGVuX2luZm9ybWF0aW9uX2VsZW1lbnRzKTsKKworCS8qIEtleSBjb21wYXJhdG9yIG11c3QgdXNlIHNhbWUgYWxnb3JpdGhtIGluIGFueSByYi10cmVlCisJICogc2VhcmNoIGZ1bmN0aW9uIChvcmRlciBpcyBpbXBvcnRhbnQpLCBvdGhlcndpc2Ugb3JkZXJpbmcKKwkgKiBvZiBpdGVtcyBpbiB0aGUgdHJlZSBpcyBicm9rZW4gYW5kIHNlYXJjaCBnaXZlcyBpbmNvcnJlY3QKKwkgKiByZXN1bHRzLiBUaGlzIGNvZGUgdXNlcyBzYW1lIG9yZGVyIGFzIGNtcF9pZXMoKSBkb2VzLiAqLworCisJLyogc29ydCBtaXNzaW5nIElFIGJlZm9yZSAobGVmdCBvZikgcHJlc2VudCBJRSAqLworCWlmICghaWUxKQorCQlyZXR1cm4gLTE7CisJaWYgKCFpZTIpCisJCXJldHVybiAxOworCisJLyogemVyby1zaXplIFNTSUQgaXMgdXNlZCBhcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBoaWRkZW4gYnNzICovCisJaWYgKCFpZTJbMV0pCisJCXJldHVybiAwOworCisJLyogc29ydCBieSBsZW5ndGggZmlyc3QsIHRoZW4gYnkgY29udGVudHMgKi8KKwlpZiAoaWUxWzFdICE9IGllMlsxXSkKKwkJcmV0dXJuIGllMlsxXSAtIGllMVsxXTsKKworCS8qIHplcm9lZCBTU0lEIGllIGlzIGFub3RoZXIgaW5kaWNhdGlvbiBvZiBhIGhpZGRlbiBic3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWUyWzFdOyBpKyspCisJCWlmIChpZTJbaSArIDJdKQorCQkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmNmZzgwMjExX2dldF9ic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCQkJICAgICAgY29uc3QgdTggKmJzc2lkLApAQCAtNTA1LDYgKzU1OSw0OCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqCityYl9maW5kX2hpZGRlbl9ic3Moc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCisJICAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKnJlcykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IGRldi0+YnNzX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpic3M7CisJaW50IHI7CisKKwl3aGlsZSAobikgeworCQlic3MgPSByYl9lbnRyeShuLCBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzLCByYm4pOworCQlyID0gY21wX2hpZGRlbl9ic3MoJnJlcy0+cHViLCAmYnNzLT5wdWIpOworCisJCWlmIChyID09IDApCisJCQlyZXR1cm4gYnNzOworCQllbHNlIGlmIChyIDwgMCkKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlCisJCQluID0gbi0+cmJfcmlnaHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2hpZGRlbl9pZXMoc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqcmVzLAorCQkgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqaGlkZGVuKQoreworCWlmICh1bmxpa2VseShyZXMtPnB1Yi5iZWFjb25faWVzKSkKKwkJcmV0dXJuOworCWlmIChXQVJOX09OKCFoaWRkZW4tPnB1Yi5iZWFjb25faWVzKSkKKwkJcmV0dXJuOworCisJcmVzLT5wdWIuYmVhY29uX2llcyA9IGttYWxsb2MoaGlkZGVuLT5wdWIubGVuX2JlYWNvbl9pZXMsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseSghcmVzLT5wdWIuYmVhY29uX2llcykpCisJCXJldHVybjsKKworCXJlcy0+YmVhY29uX2llc19hbGxvY2F0ZWQgPSB0cnVlOworCXJlcy0+cHViLmxlbl9iZWFjb25faWVzID0gaGlkZGVuLT5wdWIubGVuX2JlYWNvbl9pZXM7CisJbWVtY3B5KHJlcy0+cHViLmJlYWNvbl9pZXMsIGhpZGRlbi0+cHViLmJlYWNvbl9pZXMsCisJCQlyZXMtPnB1Yi5sZW5fYmVhY29uX2llcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICoKIGNmZzgwMjExX2Jzc191cGRhdGUoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXYsCiAJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpyZXMpCiB7CkBAIC02MDcsNiArNzAzLDIxIEBACiAKIAkJa3JlZl9wdXQoJnJlcy0+cmVmLCBic3NfcmVsZWFzZSk7CiAJfSBlbHNlIHsKKwkJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqaGlkZGVuOworCisJCS8qIEZpcnN0IGNoZWNrIGlmIHRoZSBiZWFjb24gaXMgYSBwcm9iZSByZXNwb25zZSBmcm9tCisJCSAqIGEgaGlkZGVuIGJzcy4gSWYgc28sIGNvcHkgYmVhY29uIGllcyAod2l0aCBudWxsaWZpZWQKKwkJICogc3NpZCkgaW50byB0aGUgcHJvYmUgcmVzcG9uc2UgYnNzIGVudHJ5ICh3aXRoIHJlYWwgc3NpZCkuCisJCSAqIEl0IGlzIHJlcXVpcmVkIGJhc2ljYWxseSBmb3IgUFNNIGltcGxlbWVudGF0aW9uCisJCSAqIChwcm9iZSByZXNwb25zZXMgZG8gbm90IGNvbnRhaW4gdGltIGllKSAqLworCisJCS8qIFRPRE86IFRoZSBjb2RlIGlzIG5vdCB0cnlpbmcgdG8gdXBkYXRlIGV4aXN0aW5nIHByb2JlCisJCSAqIHJlc3BvbnNlIGJzcyBlbnRyaWVzIHdoZW4gYmVhY29uIGllcyBhcmUKKwkJICogZ2V0dGluZyBjaGFuZ2VkLiAqLworCQloaWRkZW4gPSByYl9maW5kX2hpZGRlbl9ic3MoZGV2LCByZXMpOworCQlpZiAoaGlkZGVuKQorCQkJY29weV9oaWRkZW5faWVzKHJlcywgaGlkZGVuKTsKKwogCQkvKiB0aGlzICJjb25zdW1lcyIgdGhlIHJlZmVyZW5jZSAqLwogCQlsaXN0X2FkZF90YWlsKCZyZXMtPmxpc3QsICZkZXYtPmJzc19saXN0KTsKIAkJcmJfaW5zZXJ0X2JzcyhkZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc21lLmMgYi9uZXQvd2lyZWxlc3Mvc21lLmMKaW5kZXggNmU4NmQ1YS4uN2I5ZWNhZSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NtZS5jCisrKyBiL25ldC93aXJlbGVzcy9zbWUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgpAQCAtMTg5LDcgKzE5MCw5IEBACiAJCQkJCSAgICBwcmV2X2Jzc2lkLAogCQkJCQkgICAgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuLAogCQkJCQkgICAgcGFyYW1zLT5pZSwgcGFyYW1zLT5pZV9sZW4sCi0JCQkJCSAgICBmYWxzZSwgJnBhcmFtcy0+Y3J5cHRvKTsKKwkJCQkJICAgIGZhbHNlLCAmcGFyYW1zLT5jcnlwdG8sCisJCQkJCSAgICBwYXJhbXMtPmZsYWdzLCAmcGFyYW1zLT5odF9jYXBhLAorCQkJCQkgICAgJnBhcmFtcy0+aHRfY2FwYV9tYXNrKTsKIAkJaWYgKGVycikKIAkJCV9fY2ZnODAyMTFfbWxtZV9kZWF1dGgocmRldiwgd2Rldi0+bmV0ZGV2LCBwYXJhbXMtPmJzc2lkLAogCQkJCQkgICAgICAgTlVMTCwgMCwKQEAgLTU1MCw0NSArNTUzLDM1IEBACiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KTsKIAogdm9pZCBfX2NmZzgwMjExX3JvYW1lZChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAotCQkgICAgICAgY29uc3QgdTggKmJzc2lkLAorCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLAogCQkgICAgICAgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCiAJCSAgICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuKQogewotCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKICNlbmRpZgotCiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIAogCWlmIChXQVJOX09OKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAJCSAgICB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAlpZiAod2Rldi0+c21lX3N0YXRlICE9IENGRzgwMjExX1NNRV9DT05ORUNURUQpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAkvKiBpbnRlcm5hbCBlcnJvciAtLSBob3cgZGlkIHdlIGdldCB0byBDT05ORUNURUQgdy9vIEJTUz8gKi8KIAlpZiAoV0FSTl9PTighd2Rldi0+Y3VycmVudF9ic3MpKSB7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJY2ZnODAyMTFfdW5ob2xkX2Jzcyh3ZGV2LT5jdXJyZW50X2Jzcyk7CiAJY2ZnODAyMTFfcHV0X2Jzcygmd2Rldi0+Y3VycmVudF9ic3MtPnB1Yik7CiAJd2Rldi0+Y3VycmVudF9ic3MgPSBOVUxMOwogCi0JYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyh3ZGV2LT53aXBoeSwgY2hhbm5lbCwgYnNzaWQsCi0JCQkgICAgICAgd2Rldi0+c3NpZCwgd2Rldi0+c3NpZF9sZW4sCi0JCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0VTUywgV0xBTl9DQVBBQklMSVRZX0VTUyk7Ci0KLQlpZiAoV0FSTl9PTighYnNzKSkKLQkJcmV0dXJuOwotCiAJY2ZnODAyMTFfaG9sZF9ic3MoYnNzX2Zyb21fcHViKGJzcykpOwogCXdkZXYtPmN1cnJlbnRfYnNzID0gYnNzX2Zyb21fcHViKGJzcyk7CiAKLQlubDgwMjExX3NlbmRfcm9hbWVkKHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSksIHdkZXYtPm5ldGRldiwgYnNzaWQsCisJbmw4MDIxMV9zZW5kX3JvYW1lZCh3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpLCB3ZGV2LT5uZXRkZXYsIGJzcy0+YnNzaWQsCiAJCQkgICAgcmVxX2llLCByZXFfaWVfbGVuLCByZXNwX2llLCByZXNwX2llX2xlbiwKIAkJCSAgICBHRlBfS0VSTkVMKTsKIApAQCAtNjA5LDExICs2MDIsMTUgQEAKIAogCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKIAl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkod2Rldi0+d2V4dC5wcmV2X2Jzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweSh3ZGV2LT53ZXh0LnByZXZfYnNzaWQsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKIAl3ZGV2LT53ZXh0LnByZXZfYnNzaWRfdmFsaWQgPSB0cnVlOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQod2Rldi0+bmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKICNlbmRpZgorCisJcmV0dXJuOworb3V0OgorCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIH0KIAogdm9pZCBjZmc4MDIxMV9yb2FtZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTYyMywzMiArNjIwLDU3IEBACiAJCSAgICAgY29uc3QgdTggKnJlc3BfaWUsIHNpemVfdCByZXNwX2llX2xlbiwgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOworCisJQ0ZHODAyMTFfREVWX1dBUk5fT04od2Rldi0+c21lX3N0YXRlICE9IENGRzgwMjExX1NNRV9DT05ORUNURUQpOworCisJYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyh3ZGV2LT53aXBoeSwgY2hhbm5lbCwgYnNzaWQsIHdkZXYtPnNzaWQsCisJCQkgICAgICAgd2Rldi0+c3NpZF9sZW4sIFdMQU5fQ0FQQUJJTElUWV9FU1MsCisJCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJaWYgKFdBUk5fT04oIWJzcykpCisJCXJldHVybjsKKworCWNmZzgwMjExX3JvYW1lZF9ic3MoZGV2LCBic3MsIHJlcV9pZSwgcmVxX2llX2xlbiwgcmVzcF9pZSwKKwkJCSAgICByZXNwX2llX2xlbiwgZ2ZwKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfcm9hbWVkKTsKKwordm9pZCBjZmc4MDIxMV9yb2FtZWRfYnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLCBjb25zdCB1OCAqcmVxX2llLAorCQkJIHNpemVfdCByZXFfaWVfbGVuLCBjb25zdCB1OCAqcmVzcF9pZSwKKwkJCSBzaXplX3QgcmVzcF9pZV9sZW4sIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2V2ZW50ICpldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQ0ZHODAyMTFfREVWX1dBUk5fT04od2Rldi0+c21lX3N0YXRlICE9IENGRzgwMjExX1NNRV9DT05ORUNURUQpOwogCi0JZXYgPSBremFsbG9jKHNpemVvZigqZXYpICsgcmVxX2llX2xlbiArIHJlc3BfaWVfbGVuLCBnZnApOwotCWlmICghZXYpCisJaWYgKFdBUk5fT04oIWJzcykpCiAJCXJldHVybjsKIAorCWV2ID0ga3phbGxvYyhzaXplb2YoKmV2KSArIHJlcV9pZV9sZW4gKyByZXNwX2llX2xlbiwgZ2ZwKTsKKwlpZiAoIWV2KSB7CisJCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKKwkJcmV0dXJuOworCX0KKwogCWV2LT50eXBlID0gRVZFTlRfUk9BTUVEOwotCWV2LT5ybS5jaGFubmVsID0gY2hhbm5lbDsKLQltZW1jcHkoZXYtPnJtLmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwogCWV2LT5ybS5yZXFfaWUgPSAoKHU4ICopZXYpICsgc2l6ZW9mKCpldik7CiAJZXYtPnJtLnJlcV9pZV9sZW4gPSByZXFfaWVfbGVuOwogCW1lbWNweSgodm9pZCAqKWV2LT5ybS5yZXFfaWUsIHJlcV9pZSwgcmVxX2llX2xlbik7CiAJZXYtPnJtLnJlc3BfaWUgPSAoKHU4ICopZXYpICsgc2l6ZW9mKCpldikgKyByZXFfaWVfbGVuOwogCWV2LT5ybS5yZXNwX2llX2xlbiA9IHJlc3BfaWVfbGVuOwogCW1lbWNweSgodm9pZCAqKWV2LT5ybS5yZXNwX2llLCByZXNwX2llLCByZXNwX2llX2xlbik7CisJZXYtPnJtLmJzcyA9IGJzczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmZXYtPmxpc3QsICZ3ZGV2LT5ldmVudF9saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3ZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJcXVldWVfd29yayhjZmc4MDIxMV93cSwgJnJkZXYtPmV2ZW50X3dvcmspOwogfQotRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yb2FtZWQpOworRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yb2FtZWRfYnNzKTsKIAogdm9pZCBfX2NmZzgwMjExX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1OCAqaWUsCiAJCQkgICAgIHNpemVfdCBpZV9sZW4sIHUxNiByZWFzb24sIGJvb2wgZnJvbV9hcCkKQEAgLTc3Myw2ICs3OTUsOSBAQAogCQl3ZGV2LT5jb25uZWN0X2tleXMgPSBOVUxMOwogCX0KIAorCWNmZzgwMjExX29wZXJfYW5kX2h0X2NhcGEoJmNvbm5lY3QtPmh0X2NhcGFfbWFzaywKKwkJCQkgIHJkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spOworCiAJaWYgKGNvbm5rZXlzICYmIGNvbm5rZXlzLT5kZWYgPj0gMCkgewogCQlpbnQgaWR4OwogCQl1MzIgY2lwaGVyOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3V0aWwuYyBiL25ldC93aXJlbGVzcy91dGlsLmMKaW5kZXggMmYxNzhmNy4uZTc3ZGY3NSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3V0aWwuYworKysgYi9uZXQvd2lyZWxlc3MvdXRpbC5jCkBAIC0zLDEwICszLDEwIEBACiAgKgogICogQ29weXJpZ2h0IDIwMDctMjAwOQlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlICJjb3JlLmgiCkBAIC0yMzksMTcgKzIzOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCi0vKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLwotY29uc3QgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9Ci0JeyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07Ci1FWFBPUlRfU1lNQk9MKHJmYzEwNDJfaGVhZGVyKTsKLQotLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQotCXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OwotRVhQT1JUX1NZTUJPTChicmlkZ2VfdHVubmVsX2hlYWRlcik7Ci0KIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGllZWU4MDIxMV9oZHJsZW4oX19sZTE2IGZjKQogewogCXVuc2lnbmVkIGludCBoZHJsZW4gPSAyNDsKQEAgLTc1MSw5ICs3NDAsOSBAQAogCQkJCU5VTEwpOwogCQkJYnJlYWs7CiAJCWNhc2UgRVZFTlRfUk9BTUVEOgotCQkJX19jZmc4MDIxMV9yb2FtZWQod2RldiwgZXYtPnJtLmNoYW5uZWwsIGV2LT5ybS5ic3NpZCwKLQkJCQkJICBldi0+cm0ucmVxX2llLCBldi0+cm0ucmVxX2llX2xlbiwKLQkJCQkJICBldi0+cm0ucmVzcF9pZSwgZXYtPnJtLnJlc3BfaWVfbGVuKTsKKwkJCV9fY2ZnODAyMTFfcm9hbWVkKHdkZXYsIGV2LT5ybS5ic3MsIGV2LT5ybS5yZXFfaWUsCisJCQkJCSAgZXYtPnJtLnJlcV9pZV9sZW4sIGV2LT5ybS5yZXNwX2llLAorCQkJCQkgIGV2LT5ybS5yZXNwX2llX2xlbik7CiAJCQlicmVhazsKIAkJY2FzZSBFVkVOVF9ESVNDT05ORUNURUQ6CiAJCQlfX2NmZzgwMjExX2Rpc2Nvbm5lY3RlZCh3ZGV2LT5uZXRkZXYsCkBAIC0xMDUwLDE2OSArMTAzOSwxMyBAQAogCXJldHVybiAwOwogfQogCi11MzIgaWVlZTgwMl8xMV9wYXJzZV9lbGVtc19jcmModTggKnN0YXJ0LCBzaXplX3QgbGVuLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKLQkJCSAgICAgICB1NjQgZmlsdGVyLCB1MzIgY3JjKQotewotCXNpemVfdCBsZWZ0ID0gbGVuOwotCXU4ICpwb3MgPSBzdGFydDsKLQlib29sIGNhbGNfY3JjID0gZmlsdGVyICE9IDA7CisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQorCXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworRVhQT1JUX1NZTUJPTChyZmMxMDQyX2hlYWRlcik7CiAKLQltZW1zZXQoZWxlbXMsIDAsIHNpemVvZigqZWxlbXMpKTsKLQllbGVtcy0+aWVfc3RhcnQgPSBzdGFydDsKLQllbGVtcy0+dG90YWxfbGVuID0gbGVuOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkKLQkJCWJyZWFrOwotCi0JCWlmIChjYWxjX2NyYyAmJiBpZCA8IDY0ICYmIChmaWx0ZXIgJiAoMVVMTCA8PCBpZCkpKQotCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1NTSUQ6Ci0JCQllbGVtcy0+c3NpZCA9IHBvczsKLQkJCWVsZW1zLT5zc2lkX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPnN1cHBfcmF0ZXMgPSBwb3M7Ci0JCQllbGVtcy0+c3VwcF9yYXRlc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgotCQkJZWxlbXMtPmZoX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5maF9wYXJhbXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKLQkJCWVsZW1zLT5kc19wYXJhbXMgPSBwb3M7Ci0JCQllbGVtcy0+ZHNfcGFyYW1zX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6Ci0JCQllbGVtcy0+Y2ZfcGFyYW1zID0gcG9zOwotCQkJZWxlbXMtPmNmX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfVElNOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX2llKSkgewotCQkJCWVsZW1zLT50aW0gPSAodm9pZCAqKXBvczsKLQkJCQllbGVtcy0+dGltX2xlbiA9IGVsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9JQlNTX1BBUkFNUzoKLQkJCWVsZW1zLT5pYnNzX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5pYnNzX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgotCQkJZWxlbXMtPmNoYWxsZW5nZSA9IHBvczsKLQkJCWVsZW1zLT5jaGFsbGVuZ2VfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmIChlbGVuID49IDQgJiYgcG9zWzBdID09IDB4MDAgJiYgcG9zWzFdID09IDB4NTAgJiYKLQkJCSAgICBwb3NbMl0gPT0gMHhmMikgewotCQkJCS8qIE1pY3Jvc29mdCBPVUkgKDAwOjUwOkYyKSAqLwotCi0JCQkJaWYgKGNhbGNfY3JjKQotCQkJCQljcmMgPSBjcmMzMl9iZShjcmMsIHBvcyAtIDIsIGVsZW4gKyAyKTsKLQotCQkJCWlmIChwb3NbM10gPT0gMSkgewotCQkJCQkvKiBPVUkgVHlwZSAxIC0gV1BBIElFICovCi0JCQkJCWVsZW1zLT53cGEgPSBwb3M7Ci0JCQkJCWVsZW1zLT53cGFfbGVuID0gZWxlbjsKLQkJCQl9IGVsc2UgaWYgKGVsZW4gPj0gNSAmJiBwb3NbM10gPT0gMikgewotCQkJCQkvKiBPVUkgVHlwZSAyIC0gV01NIElFICovCi0JCQkJCWlmIChwb3NbNF0gPT0gMCkgewotCQkJCQkJZWxlbXMtPndtbV9pbmZvID0gcG9zOwotCQkJCQkJZWxlbXMtPndtbV9pbmZvX2xlbiA9IGVsZW47Ci0JCQkJCX0gZWxzZSBpZiAocG9zWzRdID09IDEpIHsKLQkJCQkJCWVsZW1zLT53bW1fcGFyYW0gPSBwb3M7Ci0JCQkJCQllbGVtcy0+d21tX3BhcmFtX2xlbiA9IGVsZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQllbGVtcy0+cnNuID0gcG9zOwotCQkJZWxlbXMtPnJzbl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRVJQX0lORk86Ci0JCQllbGVtcy0+ZXJwX2luZm8gPSBwb3M7Ci0JCQllbGVtcy0+ZXJwX2luZm9fbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzID0gcG9zOwotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkKLQkJCQllbGVtcy0+aHRfY2FwX2VsZW0gPSAodm9pZCAqKXBvczsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0hUX0lORk9STUFUSU9OOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCi0JCQkJZWxlbXMtPmh0X2luZm9fZWxlbSA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoKLQkJCWVsZW1zLT5tZXNoX2lkID0gcG9zOwotCQkJZWxlbXMtPm1lc2hfaWRfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKQotCQkJCWVsZW1zLT5tZXNoX2NvbmZpZyA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUEVFUl9NR01UOgotCQkJZWxlbXMtPnBlZXJpbmcgPSBwb3M7Ci0JCQllbGVtcy0+cGVlcmluZ19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUFJFUToKLQkJCWVsZW1zLT5wcmVxID0gcG9zOwotCQkJZWxlbXMtPnByZXFfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1BSRVA6Ci0JCQllbGVtcy0+cHJlcCA9IHBvczsKLQkJCWVsZW1zLT5wcmVwX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QRVJSOgotCQkJZWxlbXMtPnBlcnIgPSBwb3M7Ci0JCQllbGVtcy0+cGVycl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUkFOTjoKLQkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUpKQotCQkJCWVsZW1zLT5yYW5uID0gKHZvaWQgKilwb3M7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSDoKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbSA9IHBvczsKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUVVJRVQ6Ci0JCQlpZiAoIWVsZW1zLT5xdWlldF9lbGVtKSB7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW0gPSBwb3M7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW1fbGVuID0gZWxlbjsKLQkJCX0KLQkJCWVsZW1zLT5udW1fb2ZfcXVpZXRfZWxlbSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ09VTlRSWToKLQkJCWVsZW1zLT5jb3VudHJ5X2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+Y291bnRyeV9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDoKLQkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgotCQkJZWxlbXMtPnRpbWVvdXRfaW50ID0gcG9zOwotCQkJZWxlbXMtPnRpbWVvdXRfaW50X2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbGVmdCAtPSBlbGVuOwotCQlwb3MgKz0gZWxlbjsKLQl9Ci0KLQlyZXR1cm4gY3JjOwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyk7CisvKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLworY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9CisJeyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CitFWFBPUlRfU1lNQk9MKGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggNjJmMTIxZC4uM2MyNGViOSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTgsNiArOCw3IEBACiAgKiBDb3B5cmlnaHQgMjAwOC0yMDA5CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpAQCAtODE4LDEyICs4MTksMjQgQEAKIAkJCQkgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAKIAlzd2l0Y2ggKHdkZXYtPmlmdHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJcmV0dXJuIGNmZzgwMjExX21nZF93ZXh0X2dpd2ZyZXEoZGV2LCBpbmZvLCBmcmVxLCBleHRyYSk7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJcmV0dXJuIGNmZzgwMjExX2lic3Nfd2V4dF9naXdmcmVxKGRldiwgaW5mbywgZnJlcSwgZXh0cmEpOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJaWYgKCFyZGV2LT5vcHMtPmdldF9jaGFubmVsKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2hhbiA9IHJkZXYtPm9wcy0+Z2V0X2NoYW5uZWwod2Rldi0+d2lwaHkpOworCQlpZiAoIWNoYW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZnJlcS0+bSA9IGNoYW4tPmNlbnRlcl9mcmVxOworCQlmcmVxLT5lID0gNjsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJaWYgKCF3ZGV2LT5jaGFubmVsKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMKaW5kZXggZmRiYzIzYy4uMGFmN2Y1NCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvcmUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCmluZGV4IDBkNGI4YzMuLjMyNjc1MGIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCkBAIC01LDYgKzUsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA5ICAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtc3B5LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYwppbmRleCA2ZGNmZTY1Li41ZDY0M2E1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zcHkuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvd2V4dC5oPgpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggNWYwM2U0ZS4uM2UxNmM2YSAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0xMjYxLDE0ICsxMjYxLDE5IEBACiAJc3RydWN0IHgyNV9zb2NrICp4MjUgPSB4MjVfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl94MjUgKnN4MjUgPSAoc3RydWN0IHNvY2thZGRyX3gyNSAqKW1zZy0+bXNnX25hbWU7CiAJc2l6ZV90IGNvcGllZDsKLQlpbnQgcWJpdCwgaGVhZGVyX2xlbiA9IHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCA/Ci0JCVgyNV9FWFRfTUlOX0xFTiA6IFgyNV9TVERfTUlOX0xFTjsKLQorCWludCBxYml0LCBoZWFkZXJfbGVuOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqYXNtcHRyOwogCWludCByYyA9IC1FTk9UQ09OTjsKIAogCWxvY2tfc29jayhzayk7CisKKwlpZiAoeDI1LT5uZWlnaGJvdXIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwloZWFkZXJfbGVuID0geDI1LT5uZWlnaGJvdXItPmV4dGVuZGVkID8KKwkJWDI1X0VYVF9NSU5fTEVOIDogWDI1X1NURF9NSU5fTEVOOworCiAJLyoKIAkgKiBUaGlzIHdvcmtzIGZvciBzZXFwYWNrZXQgdG9vLiBUaGUgcmVjZWl2ZXIgaGFzIG9yZGVyZWQgdGhlIHF1ZXVlIGZvcgogCSAqIHVzISBXZSBkbyBvbmUgcXVpY2sgY2hlY2sgZmlyc3QgdGhvdWdoCmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9wcm9jLmMgYi9uZXQveDI1L3gyNV9wcm9jLmMKaW5kZXggN2ZmMzczNy4uMmZmZGU0NiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfcHJvYy5jCisrKyBiL25ldC94MjUveDI1X3Byb2MuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3gyNS5oPgpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wcm9jLmMgYi9uZXQveGZybS94ZnJtX3Byb2MuYwppbmRleCA1OGQ5YWUwLi5kMGExYWY4IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3Byb2MuYworKysgYi9uZXQveGZybS94ZnJtX3Byb2MuYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3JlcGxheS5jIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwppbmRleCA2Y2EzNTc0Li4zOWUwMmM1IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3JlcGxheS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAKIHUzMiB4ZnJtX3JlcGxheV9zZXFoaShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIG5ldF9zZXEpCmRpZmYgLS1naXQgYS9zYW1wbGVzL0tjb25maWcgYi9zYW1wbGVzL0tjb25maWcKaW5kZXggOTZhNzU3Mi4uNDEwNjNlNyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9LY29uZmlnCisrKyBiL3NhbXBsZXMvS2NvbmZpZwpAQCAtNjEsMTAgKzYxLDQgQEAKIAkgIEJ1aWxkIGFuIGV4YW1wbGUgb2YgaG93IHRvIGR5bmFtaWNhbGx5IGFkZCB0aGUgaGVsbG8KIAkgIGNvbW1hbmQgdG8gdGhlIGtkYiBzaGVsbC4KIAotY29uZmlnIFNBTVBMRV9ISURSQVcKLQlib29sICJCdWlsZCBzaW1wbGUgaGlkcmF3IGV4YW1wbGUiCi0JZGVwZW5kcyBvbiBISURSQVcgJiYgSEVBREVSU19DSEVDSwotCWhlbHAKLQkgIEJ1aWxkIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBoaWRyYXcgZnJvbSB1c2Vyc3BhY2UuCi0KIGVuZGlmICMgU0FNUExFUwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKaW5kZXggYTBmZDUwMi4uZDJiMzY2YzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtNDYsNyArNDYsNyBAQAogIyBJZiB0aGUgc2F2ZS0qIHZhcmlhYmxlcyBjaGFuZ2VkIGVycm9yIG91dAogaWZlcSAoJChLQlVJTERfTk9QRURBTlRJQyksKQogICAgICAgICBpZm5lcSAoIiQoc2F2ZS1jZmxhZ3MpIiwiJChDRkxBR1MpIikKLSAgICAgICAgICAgICAgICAkKGVycm9yIENGTEFHUyB3YXMgY2hhbmdlZCBpbiAiJChrYnVpbGQtZmlsZSkiLiBGaXggaXQgdG8gdXNlIEVYVFJBX0NGTEFHUykKKyAgICAgICAgICAgICAgICAkKGVycm9yIENGTEFHUyB3YXMgY2hhbmdlZCBpbiAiJChrYnVpbGQtZmlsZSkiLiBGaXggaXQgdG8gdXNlIGNjZmxhZ3MteSkKICAgICAgICAgZW5kaWYKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggYWVlYTg0YS4uNWQ5ODZkOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTE2Nyw2ICsxNjcsNyBAQAogcXVpZXRfY21kX2dwZXJmID0gR1BFUkYgJEAKICAgICAgIGNtZF9ncGVyZiA9IGdwZXJmIC10IC0tb3V0cHV0LWZpbGUgJEAgLWEgLUMgLUUgLWcgLWsgMSwzLCQkIC1wIC10ICQ8CiAKKy5QUkVDSU9VUzogJChzcmMpLyUuaGFzaC5jX3NoaXBwZWQKICQoc3JjKS8lLmhhc2guY19zaGlwcGVkOiAkKHNyYykvJS5ncGVyZgogCSQoY2FsbCBjbWQsZ3BlcmYpCiAKQEAgLTE3Nyw2ICsxNzgsNyBAQAogcXVpZXRfY21kX2ZsZXggPSBMRVggICAgICRACiAgICAgICBjbWRfZmxleCA9IGZsZXggLW8kQCAtTCAtUCAkKExFWF9QUkVGSVgpICQ8CiAKKy5QUkVDSU9VUzogJChzcmMpLyUubGV4LmNfc2hpcHBlZAogJChzcmMpLyUubGV4LmNfc2hpcHBlZDogJChzcmMpLyUubAogCSQoY2FsbCBjbWQsZmxleCkKIApAQCAtMTg3LDEyICsxODksMTQgQEAKIHF1aWV0X2NtZF9iaXNvbiA9IFlBQ0MgICAgJEAKICAgICAgIGNtZF9iaXNvbiA9IGJpc29uIC1vJEAgLXQgLWwgLXAgJChZQUNDX1BSRUZJWCkgJDwKIAorLlBSRUNJT1VTOiAkKHNyYykvJS50YWIuY19zaGlwcGVkCiAkKHNyYykvJS50YWIuY19zaGlwcGVkOiAkKHNyYykvJS55CiAJJChjYWxsIGNtZCxiaXNvbikKIAogcXVpZXRfY21kX2Jpc29uX2ggPSBZQUNDICAgICRACiAgICAgICBjbWRfYmlzb25faCA9IGJpc29uIC1vL2Rldi9udWxsIC0tZGVmaW5lcz0kQCAtdCAtbCAtcCAkKFlBQ0NfUFJFRklYKSAkPAogCisuUFJFQ0lPVVM6ICQoc3JjKS8lLnRhYi5oX3NoaXBwZWQKICQoc3JjKS8lLnRhYi5oX3NoaXBwZWQ6ICQoc3JjKS8lLnkKIAkkKGNhbGwgY21kLGJpc29uX2gpCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCmluZGV4IDI5MTIyOGUuLmNiMWY1MGMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKKysrIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwpAQCAtMzQ1LDYgKzM0NSw3IEBACiAJCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOwogCQlpZiAoc3RycmNtcChzLCAiaW5jbHVkZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaCIpICYmCiAJCSAgICBzdHJyY21wKHMsICJhcmNoL3VtL2luY2x1ZGUvdW1sLWNvbmZpZy5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgImluY2x1ZGUvbGludXgva2NvbmZpZy5oIikgJiYKIAkJICAgIHN0cnJjbXAocywgIi52ZXIiKSkgewogCQkJLyoKIAkJCSAqIERvIG5vdCBsaXN0IHRoZSBzb3VyY2UgZmlsZSBhcyBkZXBlbmRlbmN5LCBzbyB0aGF0CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggMGIzZTM1Yy4uOGZkYTNiMyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMjQwLDkgKzI0MCw4IEBACiBvdXIgJFR5cGU7CiBvdXIgJERlY2xhcmU7CiAKLW91ciAkVVRGOAk9IHFyIHsKLQlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQotCXwgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAgICAgICAjIG5vbi1vdmVybG9uZyAyLWJ5dGUKK291ciAkTk9OX0FTQ0lJX1VURjgJPSBxcnsKKwlbXHhDMi1ceERGXVtceDgwLVx4QkZdICAgICAgICAgICAgICAgIyBub24tb3ZlcmxvbmcgMi1ieXRlCiAJfCAgXHhFMFtceEEwLVx4QkZdW1x4ODAtXHhCRl0gICAgICAgICMgZXhjbHVkaW5nIG92ZXJsb25ncwogCXwgW1x4RTEtXHhFQ1x4RUVceEVGXVtceDgwLVx4QkZdezJ9ICAjIHN0cmFpZ2h0IDMtYnl0ZQogCXwgIFx4RURbXHg4MC1ceDlGXVtceDgwLVx4QkZdICAgICAgICAjIGV4Y2x1ZGluZyBzdXJyb2dhdGVzCkBAIC0yNTEsNiArMjUwLDExIEBACiAJfCAgXHhGNFtceDgwLVx4OEZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmUgMTYKIH14OwogCitvdXIgJFVURjgJPSBxcnsKKwlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQorCXwgJE5PTl9BU0NJSV9VVEY4Cit9eDsKKwogb3VyICR0eXBlVHlwZWRlZnMgPSBxcnsoP3g6CiAJKD86X18pPyg/OnV8c3xiZXxsZSkoPzo4fDE2fDMyfDY0KXwKIAlhdG9taWNfdApAQCAtMTMzMCw2ICsxMzM0LDkgQEAKIAlteSAkc2lnbm9mZiA9IDA7CiAJbXkgJGlzX3BhdGNoID0gMDsKIAorCW15ICRpbl9oZWFkZXJfbGluZXMgPSAxOworCW15ICRpbl9jb21taXRfbG9nID0gMDsJCSNTY2FubmluZyBsaW5lcyBiZWZvcmUgcGF0Y2gKKwogCW91ciBAcmVwb3J0ID0gKCk7CiAJb3VyICRjbnRfbGluZXMgPSAwOwogCW91ciAkY250X2Vycm9yID0gMDsKQEAgLTE0OTcsNyArMTUwNCw2IEBACiAJCWlmICgkbGluZSA9fiAvXmRpZmYgLS1naXQuKj8oXFMrKSQvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKIAkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOwotCiAJCX0gZWxzaWYgKCRsaW5lID1+IC9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKIAkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOwpAQCAtMTUzNiw2ICsxNTQyLDcgQEAKICMgQ2hlY2sgdGhlIHBhdGNoIGZvciBhIHNpZ25vZmY6CiAJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6L2kpIHsKIAkJCSRzaWdub2ZmKys7CisJCQkkaW5fY29tbWl0X2xvZyA9IDA7CiAJCX0KIAogIyBDaGVjayBzaWduYXR1cmUgc3R5bGVzCkBAIC0xNjEzLDYgKzE2MjAsMjEgQEAKIAkJCSAgICAiSW52YWxpZCBVVEYtOCwgcGF0Y2ggYW5kIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBiZSBlbmNvZGVkIGluIFVURi04XG4iIC4gJGhlcmVwdHIpOwogCQl9CiAKKyMgQ2hlY2sgaWYgaXQncyB0aGUgc3RhcnQgb2YgYSBjb21taXQgbG9nCisjIChub3QgYSBoZWFkZXIgbGluZSBhbmQgd2UgaGF2ZW4ndCBzZWVuIHRoZSBwYXRjaCBmaWxlbmFtZSkKKwkJaWYgKCRpbl9oZWFkZXJfbGluZXMgJiYgJHJlYWxmaWxlID1+IC9eJC8gJiYKKwkJICAgICRyYXdsaW5lICF+IC9eKGNvbW1pdFxifGZyb21cYnxcdys6KS4rJC9pKSB7CisJCQkkaW5faGVhZGVyX2xpbmVzID0gMDsKKwkJCSRpbl9jb21taXRfbG9nID0gMTsKKwkJfQorCisjIFN0aWxsIG5vdCB5ZXQgaW4gYSBwYXRjaCwgY2hlY2sgZm9yIGFueSBVVEYtOAorCQlpZiAoJGluX2NvbW1pdF9sb2cgJiYgJHJlYWxmaWxlID1+IC9eJC8gJiYKKwkJICAgICRyYXdsaW5lID1+IC8kTk9OX0FTQ0lJX1VURjgvKSB7CisJCQlDSEsoIlVURjhfQkVGT1JFX1BBVENIIiwKKwkJCSAgICAiOC1iaXQgVVRGLTggdXNlZCBpbiBwb3NzaWJsZSBjb21taXQgbG9nXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGlnbm9yZSBub24taHVuayBsaW5lcyBhbmQgbGluZXMgYmVpbmcgcmVtb3ZlZAogCQluZXh0IGlmICghJGh1bmtfbGluZSB8fCAkbGluZSA9fiAvXi0vKTsKIApAQCAtMTY2MSw2ICsxNjgzLDIwIEBACiAJCQkjcHJpbnQgImlzX2VuZDwkaXNfZW5kPiBsZW5ndGg8JGxlbmd0aD5cbiI7CiAJCX0KIAorCQlpZiAoKCRyZWFsZmlsZSA9fiAvTWFrZWZpbGUuKi8gfHwgJHJlYWxmaWxlID1+IC9LYnVpbGQuKi8pICYmCisJCSAgICAoJGxpbmUgPX4gL1wrKEVYVFJBX1tBLVpdK0ZMQUdTKS4qLykpIHsKKwkJCW15ICRmbGFnID0gJDE7CisJCQlteSAkcmVwbGFjZW1lbnQgPSB7CisJCQkJJ0VYVFJBX0FGTEFHUycgPT4gICAnYXNmbGFncy15JywKKwkJCQknRVhUUkFfQ0ZMQUdTJyA9PiAgICdjY2ZsYWdzLXknLAorCQkJCSdFWFRSQV9DUFBGTEFHUycgPT4gJ2NwcGZsYWdzLXknLAorCQkJCSdFWFRSQV9MREZMQUdTJyA9PiAgJ2xkZmxhZ3MteScsCisJCQl9OworCisJCQlXQVJOKCJERVBSRUNBVEVEX1ZBUklBQkxFIiwKKwkJCSAgICAgIlVzZSBvZiAkZmxhZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIFxgJHJlcGxhY2VtZW50LT57JGZsYWd9IGluc3RlYWQuXG4iIC4gJGhlcmVjdXJyKSBpZiAoJHJlcGxhY2VtZW50LT57JGZsYWd9KTsKKwkJfQorCiAjIGNoZWNrIHdlIGFyZSBpbiBhIHZhbGlkIHNvdXJjZSBmaWxlIGlmIG5vdCB0aGVuIGlnbm9yZSB0aGlzIGh1bmsKIAkJbmV4dCBpZiAoJHJlYWxmaWxlICF+IC9cLihofGN8c3xTfHBsfHNoKSQvKTsKIApAQCAtMzE1MSwxMCArMzE4NywxMCBAQAogCQkJICAgICAiY29uc2lkZXIgdXNpbmcgYSBjb21wbGV0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAogCQl9Ci0jIHJlY29tbWVuZCBrc3RydG8qIG92ZXIgc2ltcGxlX3N0cnRvKgotCQlpZiAoJGxpbmUgPX4gL1xic2ltcGxlXyhzdHJ0by4qPylccypcKC8pIHsKKyMgcmVjb21tZW5kIGtzdHJ0byogb3ZlciBzaW1wbGVfc3RydG8qIGFuZCBzdHJpY3Rfc3RydG8qCisJCWlmICgkbGluZSA9fiAvXGIoKHNpbXBsZXxzdHJpY3QpXyhzdHJ0byhsfGxsfHVsfHVsbCkpKVxzKlwoLykgewogCQkJV0FSTigiQ09OU0lERVJfS1NUUlRPIiwKLQkJCSAgICAgImNvbnNpZGVyIHVzaW5nIGtzdHJ0byogaW4gcHJlZmVyZW5jZSB0byBzaW1wbGVfJDFcbiIgLiAkaGVyZWN1cnIpOworCQkJICAgICAiJDEgaXMgb2Jzb2xldGUsIHVzZSBrJDMgaW5zdGVhZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KICMgY2hlY2sgZm9yIF9faW5pdGNhbGwoKSwgdXNlIGRldmljZV9pbml0Y2FsbCgpIGV4cGxpY2l0bHkgcGxlYXNlCiAJCWlmICgkbGluZSA9fiAvXi5ccypfX2luaXRjYWxsXHMqXCgvKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2V4dHJhY3Qtdm1saW51eCBiL3NjcmlwdHMvZXh0cmFjdC12bWxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwNjFhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2V4dHJhY3Qtdm1saW51eApAQCAtMCwwICsxLDYyIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBleHRyYWN0LXZtbGludXggLSBFeHRyYWN0IHVuY29tcHJlc3NlZCB2bWxpbnV4IGZyb20gYSBrZXJuZWwgaW1hZ2UKKyMKKyMgSW5zcGlyZWQgZnJvbSBleHRyYWN0LWlrY29uZmlnCisjIChjKSAyMDA5LDIwMTAgRGljayBTdHJlZWZsYW5kIDxkaWNrQHN0cmVlZmxhbmQubmV0PgorIworIyAoYykgMjAxMSAgICAgIENvcmVudGluIENoYXJ5IDxjb3JlbnRpbi5jaGFyeUBnbWFpbC5jb20+CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIChHUEx2MikuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2hlY2tfdm1saW51eCgpCit7CisJIyBVc2UgcmVhZGVsZiB0byBjaGVjayBpZiBpdCdzIGEgdmFsaWQgRUxGCisJIyBUT0RPOiBmaW5kIGEgYmV0dGVyIHRvIHdheSB0byBjaGVjayB0aGF0IGl0J3MgcmVhbGx5IHZtbGludXgKKwkjICAgICAgIGFuZCBub3QganVzdCBhbiBlbGYKKwlyZWFkZWxmIC1oICQxID4gL2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDEKKworCWNhdCAkMQorCWV4aXQgMAorfQorCit0cnlfZGVjb21wcmVzcygpCit7CisJIyBUaGUgb2JzY3VyZSB1c2Ugb2YgdGhlICJ0ciIgZmlsdGVyIGlzIHRvIHdvcmsgYXJvdW5kIG9sZGVyIHZlcnNpb25zIG9mCisJIyAiZ3JlcCIgdGhhdCByZXBvcnQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBsaW5lIGluc3RlYWQgb2YgdGhlIHBhdHRlcm4uCisKKwkjIFRyeSB0byBmaW5kIHRoZSBoZWFkZXIgKCQxKSBhbmQgZGVjb21wcmVzcyBmcm9tIGhlcmUKKwlmb3IJcG9zIGluIGB0ciAiJDFcbiQyIiAiXG4kMj0iIDwgIiRpbWciIHwgZ3JlcCAtYWJvICJeJDIiYAorCWRvCisJCXBvcz0ke3BvcyUlOip9CisJCXRhaWwgLWMrJHBvcyAiJGltZyIgfCAkMyA+ICR0bXAgMj4gL2Rldi9udWxsCisJCWNoZWNrX3ZtbGludXggJHRtcAorCWRvbmUKK30KKworIyBDaGVjayBpbnZvY2F0aW9uOgorbWU9JHswIyMqL30KK2ltZz0kMQoraWYJWyAkIyAtbmUgMSAtbyAhIC1zICIkaW1nIiBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICRtZSA8a2VybmVsLWltYWdlPiIgPiYyCisJZXhpdCAyCitmaQorCisjIFByZXBhcmUgdGVtcCBmaWxlczoKK3RtcD0kKG1rdGVtcCAvdG1wL3ZtbGludXgtWFhYKQordHJhcCAicm0gLWYgJHRtcCIgMAorCisjIEluaXRpYWwgYXR0ZW1wdCBmb3IgdW5jb21wcmVzc2VkIGltYWdlcyBvciBvYmplY3RzOgorY2hlY2tfdm1saW51eCAkaW1nCisKKyMgVGhhdCBkaWRuJ3Qgd29yaywgc28gcmV0cnkgYWZ0ZXIgZGVjb21wcmVzc2lvbi4KK3RyeV9kZWNvbXByZXNzICdcMDM3XDIxM1wwMTAnIHh5ICAgIGd1bnppcAordHJ5X2RlY29tcHJlc3MgJ1wzNzU3elhaXDAwMCcgYWJjZGUgdW54egordHJ5X2RlY29tcHJlc3MgJ0JaaCcgICAgICAgICAgeHkgICAgYnVuemlwMgordHJ5X2RlY29tcHJlc3MgJ1wxMzVcMFwwXDAnICAgeHh4ICAgdW5sem1hCit0cnlfZGVjb21wcmVzcyAnXDIxMVwxMTRcMTMyJyB4eSAgICAnbHpvcCAtZCcKKworIyBCYWlsIG91dDoKK2VjaG8gIiRtZTogQ2Fubm90IGZpbmQgdm1saW51eC4iID4mMgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCmluZGV4IDZkM2ZkYTAuLjhhMTA2NDkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYworKysgYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmMKQEAgLTQwLDcgKzQwLDggQEAKIHN0YXRpYyBGSUxFICpkZWJ1Z2ZpbGU7CiAKIGludCBjdXJfbGluZSA9IDE7Ci1jaGFyICpjdXJfZmlsZW5hbWU7CitjaGFyICpjdXJfZmlsZW5hbWUsICpzb3VyY2VfZmlsZTsKK2ludCBpbl9zb3VyY2VfZmlsZTsKIAogc3RhdGljIGludCBmbGFnX2RlYnVnLCBmbGFnX2R1bXBfZGVmcywgZmxhZ19yZWZlcmVuY2UsIGZsYWdfZHVtcF90eXBlcywKIAkgICBmbGFnX3ByZXNlcnZlLCBmbGFnX3dhcm5pbmdzOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5oIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5oCmluZGV4IDdlYzUyYWUuLjNiZmZkY2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmgKQEAgLTM3LDYgKzM3LDcgQEAKIHN0cnVjdCBzdHJpbmdfbGlzdCB7CiAJc3RydWN0IHN0cmluZ19saXN0ICpuZXh0OwogCWVudW0gc3ltYm9sX3R5cGUgdGFnOworCWludCBpbl9zb3VyY2VfZmlsZTsKIAljaGFyICpzdHJpbmc7CiB9OwogCkBAIC01Nyw3ICs1OCw4IEBACiAjZGVmaW5lIFlZU1RZUEUgeXlzdHlwZQogCiBleHRlcm4gaW50IGN1cl9saW5lOwotZXh0ZXJuIGNoYXIgKmN1cl9maWxlbmFtZTsKK2V4dGVybiBjaGFyICpjdXJfZmlsZW5hbWUsICpzb3VyY2VfZmlsZTsKK2V4dGVybiBpbnQgaW5fc291cmNlX2ZpbGU7CiAKIHN0cnVjdCBzeW1ib2wgKmZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgbnMsIGludCBleGFjdCk7CiBzdHJ1Y3Qgc3ltYm9sICphZGRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgdHlwZSwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwgYi9zY3JpcHRzL2dlbmtzeW1zL2xleC5sCmluZGV4IDQwMGFlMDYuLmY3NzAwNzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubApAQCAtMTE2LDYgKzExNiw3IEBACiAJCQkgIGN1cl9ub2RlLT50YWcgPQkJCQkgICBcCiAJCQkgICAgZmluZF9zeW1ib2woY3VyX25vZGUtPnN0cmluZywgU1lNX0VOVU1fQ09OU1QsIDEpP1wKIAkJCSAgICBTWU1fRU5VTV9DT05TVCA6IFNZTV9OT1JNQUwgOwkJICAgXAorCQkJICBjdXJfbm9kZS0+aW5fc291cmNlX2ZpbGUgPSBpbl9zb3VyY2VfZmlsZTsgICAgICAgXAogCQkJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBBUFAJCV9BUFAoeXl0ZXh0LCB5eWxlbmcpCkBAIC0xNjYsNiArMTY3LDEzIEBACiAgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKICAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CiAKKyAgICAgIGlmICghc291cmNlX2ZpbGUpIHsKKyAgICAgICAgc291cmNlX2ZpbGUgPSB4c3RyZHVwKGN1cl9maWxlbmFtZSk7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gKHN0cmNtcChjdXJfZmlsZW5hbWUsIHNvdXJjZV9maWxlKSA9PSAwKTsKKyAgICAgIH0KKwogICAgICAgZ290byByZXBlYXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXgubGV4LmNfc2hpcHBlZAppbmRleCBjODNjZjYwLi4wYmY0MTU3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL2xleC5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmxleC5jX3NoaXBwZWQKQEAgLTY2MCw3ICs2NjAsNyBAQAogLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCiAgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgogICovCi0jZGVmaW5lIEVDSE8gZG8geyBpZiAoZndyaXRlKCB5eXRleHQsIHl5bGVuZywgMSwgeXlvdXQgKSkge30gfSB3aGlsZSAoMCkKKyNkZWZpbmUgRUNITyBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCiAjZW5kaWYKIAogLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLApAQCAtNjcxLDcgKzY3MSw3IEBACiAJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlICkgXAogCQl7IFwKIAkJaW50IGMgPSAnKic7IFwKLQkJdW5zaWduZWQgbjsgXAorCQlpbnQgbjsgXAogCQlmb3IgKCBuID0gMDsgbiA8IG1heF9zaXplICYmIFwKIAkJCSAgICAgKGMgPSBnZXRjKCB5eWluICkpICE9IEVPRiAmJiBjICE9ICdcbic7ICsrbiApIFwKIAkJCWJ1ZltuXSA9IChjaGFyKSBjOyBcCkBAIC0xOTI2LDYgKzE5MjYsNyBAQAogCQkJICBjdXJfbm9kZS0+dGFnID0JCQkJICAgXAogCQkJICAgIGZpbmRfc3ltYm9sKGN1cl9ub2RlLT5zdHJpbmcsIFNZTV9FTlVNX0NPTlNULCAxKT9cCiAJCQkgICAgU1lNX0VOVU1fQ09OU1QgOiBTWU1fTk9STUFMIDsJCSAgIFwKKwkJCSAgY3VyX25vZGUtPmluX3NvdXJjZV9maWxlID0gaW5fc291cmNlX2ZpbGU7ICAgICAgIFwKIAkJCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgQVBQCQlfQVBQKHl5dGV4dCwgeXlsZW5nKQpAQCAtMTk3NSw2ICsxOTc2LDEzIEBACiAgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKICAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CiAKKyAgICAgIGlmICghc291cmNlX2ZpbGUpIHsKKyAgICAgICAgc291cmNlX2ZpbGUgPSB4c3RyZHVwKGN1cl9maWxlbmFtZSk7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluX3NvdXJjZV9maWxlID0gKHN0cmNtcChjdXJfZmlsZW5hbWUsIHNvdXJjZV9maWxlKSA9PSAwKTsKKyAgICAgIH0KKwogICAgICAgZ290byByZXBlYXQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5jX3NoaXBwZWQKaW5kZXggNjFkNGE1ZC4uZWNlNTNjNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmNfc2hpcHBlZApAQCAtMSw5ICsxLDggQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMy4gICovCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi41LiAgKi8KIAotLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQworLyogQmlzb24gaW1wbGVtZW50YXRpb24gZm9yIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKICAgIAotICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAotICAgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDUsNyArNDQsNyBAQAogI2RlZmluZSBZWUJJU09OIDEKIAogLyogQmlzb24gdmVyc2lvbi4gICovCi0jZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi40LjMiCisjZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi41IgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC05Niw2ICs5NSwyNSBAQAogICBmcmVlX2xpc3QoYiwgZSk7CiB9CiAKKy8qIFJlY29yZCBkZWZpbml0aW9uIG9mIGEgc3RydWN0L3VuaW9uL2VudW0gKi8KK3N0YXRpYyB2b2lkIHJlY29yZF9jb21wb3VuZChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiprZXl3LAorCQkgICAgICAgc3RydWN0IHN0cmluZ19saXN0ICoqaWRlbnQsCisJCSAgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipib2R5LAorCQkgICAgICAgZW51bSBzeW1ib2xfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpib2R5LCAqaSA9ICppZGVudCwgKnI7CisKKwlpZiAoaS0+aW5fc291cmNlX2ZpbGUpIHsKKwkJcmVtb3ZlX25vZGUoa2V5dyk7CisJCSgqaWRlbnQpLT50YWcgPSB0eXBlOworCQlyZW1vdmVfbGlzdChib2R5LCBpZGVudCk7CisJCXJldHVybjsKKwl9CisJciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gdHlwZTsKKwlyLT5uZXh0ID0gKCprZXl3KS0+bmV4dDsgKmJvZHkgPSByOyAoKmtleXcpLT5uZXh0ID0gTlVMTDsKKwlhZGRfc3ltYm9sKGktPnN0cmluZywgdHlwZSwgYiwgaXNfZXh0ZXJuKTsKK30KKwogCiAKIApAQCAtMjgzLDExICszMDEsMTEgQEAKICMgICAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCiAjICAgZWxzZQogIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKLSMgICAgaWYgISBkZWZpbmVkIF9BTExPQ0FfSCAmJiAhIGRlZmluZWQgX1NURExJQl9IICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCisjICAgIGlmICEgZGVmaW5lZCBfQUxMT0NBX0ggJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiAjICAgICBpbmNsdWRlIDxzdGRsaWIuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgICAgaWZuZGVmIF9TVERMSUJfSAotIyAgICAgIGRlZmluZSBfU1RETElCX0ggMQorIyAgICAgaWZuZGVmIEVYSVRfU1VDQ0VTUworIyAgICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAogIyAgICAgZW5kaWYKICMgICAgZW5kaWYKICMgICBlbmRpZgpAQCAtMzEwLDI0ICszMjgsMjQgQEAKICMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KICMgICBkZWZpbmUgWVlTVEFDS19BTExPQ19NQVhJTVVNIFlZU0laRV9NQVhJTVVNCiAjICBlbmRpZgotIyAgaWYgKGRlZmluZWQgX19jcGx1c3BsdXMgJiYgISBkZWZpbmVkIF9TVERMSUJfSCBcCisjICBpZiAoZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTIFwKICAgICAgICAmJiAhICgoZGVmaW5lZCBZWU1BTExPQyB8fCBkZWZpbmVkIG1hbGxvYykgXAogCSAgICAgJiYgKGRlZmluZWQgWVlGUkVFIHx8IGRlZmluZWQgZnJlZSkpKQogIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgaWZuZGVmIF9TVERMSUJfSAotIyAgICBkZWZpbmUgX1NURExJQl9IIDEKKyMgICBpZm5kZWYgRVhJVF9TVUNDRVNTCisjICAgIGRlZmluZSBFWElUX1NVQ0NFU1MgMAogIyAgIGVuZGlmCiAjICBlbmRpZgogIyAgaWZuZGVmIFlZTUFMTE9DCiAjICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYwotIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAorIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIEVYSVRfU1VDQ0VTUyAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiB2b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwogIyAgIGVuZGlmCiAjICBlbmRpZgogIyAgaWZuZGVmIFlZRlJFRQogIyAgIGRlZmluZSBZWUZSRUUgZnJlZQotIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKKyMgICBpZiAhIGRlZmluZWQgZnJlZSAmJiAhIGRlZmluZWQgRVhJVF9TVUNDRVNTICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHZvaWQgZnJlZSAodm9pZCAqKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwogIyAgIGVuZGlmCkBAIC0zNTYsMjMgKzM3NCw3IEBACiAgICAgICgoTikgKiAoc2l6ZW9mICh5eXR5cGVfaW50MTYpICsgc2l6ZW9mIChZWVNUWVBFKSkgXAogICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQogCi0vKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KLSAgIG5vdCBvdmVybGFwLiAgKi8KLSMgaWZuZGVmIFlZQ09QWQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAxIDwgX19HTlVDX18KLSMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAotICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQotIyAgZWxzZQotIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAotICAgICAgZG8JCQkJCVwKLQl7CQkJCQlcCi0JICBZWVNJWkVfVCB5eWk7CQkJCVwKLQkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKLQkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCi0JfQkJCQkJXAotICAgICAgd2hpbGUgKFlZSUQgKDApKQotIyAgZW5kaWYKLSMgZW5kaWYKKyMgZGVmaW5lIFlZQ09QWV9ORUVERUQgMQogCiAvKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKICAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgpAQCAtMzkyLDYgKzM5NCwyNiBAQAogCiAjZW5kaWYKIAorI2lmIGRlZmluZWQgWVlDT1BZX05FRURFRCAmJiBZWUNPUFlfTkVFREVECisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICBZWVNJWkVfVCB5eWk7CQkJCVwKKwkgIGZvciAoeXlpID0gMDsgeXlpIDwgKENvdW50KTsgeXlpKyspCVwKKwkgICAgKFRvKVt5eWldID0gKEZyb20pW3l5aV07CQlcCisJfQkJCQkJXAorICAgICAgd2hpbGUgKFlZSUQgKDApKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiAhWVlDT1BZX05FRURFRCAqLworCiAvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwogI2RlZmluZSBZWUZJTkFMICA0CiAvKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KQEAgLTUxNCwyMCArNTM2LDIwIEBACiAvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAxMDQsICAgMTA0LCAgIDEwNSwgICAxMDksICAgMTA5LCAgIDExNSwgICAxMTUsICAgMTE3LCAgIDExNywKLSAgICAgMTE5LCAgIDEyMCwgICAxMjEsICAgMTIyLCAgIDEyMywgICAxMjQsICAgMTI4LCAgIDE0MiwgICAxNDMsICAgMTQ3LAotICAgICAxNTUsICAgMTY4LCAgIDE3NCwgICAxNzUsICAgMTc5LCAgIDE4MCwgICAxODQsICAgMTkwLCAgIDE5NCwgICAxOTUsCi0gICAgIDE5NiwgICAxOTcsICAgMTk4LCAgIDIwMiwgICAyMDMsICAgMjA0LCAgIDIwNSwgICAyMDksICAgMjExLCAgIDIxMywKLSAgICAgMjE3LCAgIDIyNCwgICAyMzEsICAgMjQxLCAgIDI0NCwgICAyNDUsICAgMjQ5LCAgIDI1MCwgICAyNTEsICAgMjUyLAotICAgICAyNTMsICAgMjU0LCAgIDI1NSwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYzLCAgIDI2OCwgICAyNjksCi0gICAgIDI3MywgICAyNzQsICAgMjc4LCAgIDI3OCwgICAyNzgsICAgMjc5LCAgIDI4NywgICAyODgsICAgMjkyLCAgIDMwMSwKLSAgICAgMzAzLCAgIDMwNSwgICAzMDcsICAgMzA5LCAgIDMxNiwgICAzMTcsICAgMzIxLCAgIDMyMiwgICAzMjMsICAgMzI1LAotICAgICAzMjcsICAgMzI5LCAgIDMzMSwgICAzMzYsICAgMzM3LCAgIDMzOCwgICAzNDIsICAgMzQzLCAgIDM0NywgICAzNDgsCi0gICAgIDM1MywgICAzNTgsICAgMzYwLCAgIDM2NCwgICAzNjUsICAgMzczLCAgIDM3NywgICAzNzksICAgMzgxLCAgIDM4MywKLSAgICAgMzg1LCAgIDM5MCwgICAzOTksICAgNDAwLCAgIDQwNSwgICA0MTAsICAgNDExLCAgIDQxNSwgICA0MTYsICAgNDIwLAotICAgICA0MjEsICAgNDI1LCAgIDQyNywgICA0MzIsICAgNDMzLCAgIDQzNywgICA0MzgsICAgNDQyLCAgIDQ0MywgICA0NDQsCi0gICAgIDQ0OCwgICA0NTIsICAgNDUzLCAgIDQ1NywgICA0NTgsICAgNDYyLCAgIDQ2MywgICA0NjYsICAgNDcxLCAgIDQ3OSwKLSAgICAgNDgzLCAgIDQ4NCwgICA0ODgKKyAgICAgICAwLCAgIDEyMywgICAxMjMsICAgMTI0LCAgIDEyOCwgICAxMjgsICAgMTM0LCAgIDEzNCwgICAxMzYsICAgMTM2LAorICAgICAxMzgsICAgMTM5LCAgIDE0MCwgICAxNDEsICAgMTQyLCAgIDE0MywgICAxNDcsICAgMTYxLCAgIDE2MiwgICAxNjYsCisgICAgIDE3NCwgICAxODcsICAgMTkzLCAgIDE5NCwgICAxOTgsICAgMTk5LCAgIDIwMywgICAyMDksICAgMjEzLCAgIDIxNCwKKyAgICAgMjE1LCAgIDIxNiwgICAyMTcsICAgMjIxLCAgIDIyMiwgICAyMjMsICAgMjI0LCAgIDIyOCwgICAyMzAsICAgMjMyLAorICAgICAyMzYsICAgMjM4LCAgIDI0MCwgICAyNDUsICAgMjQ4LCAgIDI0OSwgICAyNTMsICAgMjU0LCAgIDI1NSwgICAyNTYsCisgICAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjcsICAgMjcyLCAgIDI3MywKKyAgICAgMjc3LCAgIDI3OCwgICAyODIsICAgMjgyLCAgIDI4MiwgICAyODMsICAgMjkxLCAgIDI5MiwgICAyOTYsICAgMzA1LAorICAgICAzMDcsICAgMzA5LCAgIDMxMSwgICAzMTMsICAgMzIwLCAgIDMyMSwgICAzMjUsICAgMzI2LCAgIDMyNywgICAzMjksCisgICAgIDMzMSwgICAzMzMsICAgMzM1LCAgIDM0MCwgICAzNDEsICAgMzQyLCAgIDM0NiwgICAzNDcsICAgMzUxLCAgIDM1MiwKKyAgICAgMzU3LCAgIDM2MiwgICAzNjQsICAgMzY4LCAgIDM2OSwgICAzNzcsICAgMzgxLCAgIDM4MywgICAzODUsICAgMzg3LAorICAgICAzODksICAgMzk0LCAgIDQwMywgICA0MDQsICAgNDA5LCAgIDQxNCwgICA0MTUsICAgNDE5LCAgIDQyMCwgICA0MjQsCisgICAgIDQyNSwgICA0MjksICAgNDMxLCAgIDQzNiwgICA0MzcsICAgNDQxLCAgIDQ0MiwgICA0NDYsICAgNDQ3LCAgIDQ0OCwKKyAgICAgNDUyLCAgIDQ1NiwgICA0NTcsICAgNDYxLCAgIDQ2MiwgICA0NjYsICAgNDY3LCAgIDQ3MCwgICA0NzUsICAgNDgzLAorICAgICA0ODcsICAgNDg4LCAgIDQ5MgogfTsKICNlbmRpZgogCkBAIC02MTgsOCArNjQwLDggQEAKICAgICAgICAwLCAgICAgMSwgICAgIDUKIH07CiAKLS8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQotICAgU1RBVEUtTlVNIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCisvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJlZHVjdGlvbiBudW1iZXIgaW4gc3RhdGUgU1RBVEUtTlVNLgorICAgUGVyZm9ybWVkIHdoZW4gWVlUQUJMRSBkb2Vzbid0IHNwZWNpZnkgc29tZXRoaW5nIGVsc2UgdG8gZG8uICBaZXJvCiAgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQogewpAQCAtNjkyLDggKzcxNCw3IEBACiAKIC8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgogICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCi0gICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgotICAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLworICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KICNkZWZpbmUgWVlUQUJMRV9OSU5GIC0xMDkKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50MTYgeXl0YWJsZVtdID0KIHsKQEAgLTc1Myw2ICs3NzQsMTIgQEAKICAgICAgICAwLCAgICAgMCwgICAgMzQKIH07CiAKKyNkZWZpbmUgeXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQoeXlzdGF0ZSkgXAorICAoKHl5c3RhdGUpID09ICgtMTM1KSkKKworI2RlZmluZSB5eXRhYmxlX3ZhbHVlX2lzX2Vycm9yKHl5dGFibGVfdmFsdWUpIFwKKyAgWVlJRCAoMCkKKwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQxNiB5eWNoZWNrW10gPQogewogICAgICAgNTksICAgIDM4LCAgICA3OSwgICAgIDMsICAgICAxLCAgICAgOCwgICAgNTYsICAgIDM3LCAgICAyNiwgICAgMzcsCkBAIC04NjksNyArODk2LDYgQEAKICAgICB7CQkJCQkJCQlcCiAgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKICAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAotICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCiAgICAgICBZWVBPUFNUQUNLICgxKTsJCQkJCQlcCiAgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKICAgICB9CQkJCQkJCQlcCkBAIC05MTEsMTkgKzkzNywxMCBAQAogI2VuZGlmCiAKIAotLyogWVlfTE9DQVRJT05fUFJJTlQgLS0gUHJpbnQgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdHJlYW0uCi0gICBUaGlzIG1hY3JvIHdhcyBub3QgbWFuZGF0ZWQgb3JpZ2luYWxseTogZGVmaW5lIG9ubHkgaWYgd2Uga25vdwotICAgd2Ugd29uJ3QgYnJlYWsgdXNlciBjb2RlOiB3aGVuIHRoZXNlIGFyZSB0aGUgbG9jYXRpb25zIHdlIGtub3cuICAqLworLyogVGhpcyBtYWNybyBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gKi8KIAogI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAotIyBpZiBkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwKLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpCQkJXAotICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKLQkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLQkgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKLSMgZWxzZQotIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQotIyBlbmRpZgorIyBkZWZpbmUgWVlfTE9DQVRJT05fUFJJTlQoRmlsZSwgTG9jKSAoKHZvaWQpIDApCiAjZW5kaWYKIAogCkBAIC0xMTE1LDcgKzExMzIsNiBAQAogIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAogI2VuZGlmCiAKLQwKIAogI2lmIFlZRVJST1JfVkVSQk9TRQogCkBAIC0xMjE4LDExNSArMTIzNCwxNDIgQEAKIH0KICMgZW5kaWYKIAotLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KLSAgIFlZQ0hBUiB3aGlsZSBpbiBzdGF0ZSBZWVNUQVRFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAotICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKLSAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQotICAgY29waWVkLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHJldHVybiAwIGlmIGFuIG9yZGluYXJ5ICJzeW50YXggZXJyb3IiCi0gICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZwotICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCisvKiBDb3B5IGludG8gKllZTVNHLCB3aGljaCBpcyBvZiBzaXplICpZWU1TR19BTExPQywgYW4gZXJyb3IgbWVzc2FnZQorICAgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4gWVlUT0tFTiBmb3IgdGhlIHN0YXRlIHN0YWNrIHdob3NlIHRvcCBpcworICAgWVlTU1AuCisKKyAgIFJldHVybiAwIGlmICpZWU1TRyB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uICBSZXR1cm4gMSBpZiAqWVlNU0cgaXMKKyAgIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbWVzc2FnZS4gIEluIHRoYXQgY2FzZSwgYWxzbyBzZXQKKyAgICpZWU1TR19BTExPQyB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLiAgUmV0dXJuIDIgaWYgdGhlCisgICByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMgaXMgdG9vIGxhcmdlIHRvIHN0b3JlLiAgKi8KK3N0YXRpYyBpbnQKK3l5c3ludGF4X2Vycm9yIChZWVNJWkVfVCAqeXltc2dfYWxsb2MsIGNoYXIgKip5eW1zZywKKyAgICAgICAgICAgICAgICB5eXR5cGVfaW50MTYgKnl5c3NwLCBpbnQgeXl0b2tlbikKIHsKLSAgaW50IHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXRva2VuXSk7CisgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7CisgIFlZU0laRV9UIHl5c2l6ZTE7CisgIGVudW0geyBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNID0gNSB9OworICAvKiBJbnRlcm5hdGlvbmFsaXplZCBmb3JtYXQgc3RyaW5nLiAqLworICBjb25zdCBjaGFyICp5eWZvcm1hdCA9IDA7CisgIC8qIEFyZ3VtZW50cyBvZiB5eWZvcm1hdC4gKi8KKyAgY2hhciBjb25zdCAqeXlhcmdbWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTV07CisgIC8qIE51bWJlciBvZiByZXBvcnRlZCB0b2tlbnMgKG9uZSBmb3IgdGhlICJ1bmV4cGVjdGVkIiwgb25lIHBlcgorICAgICAiZXhwZWN0ZWQiKS4gKi8KKyAgaW50IHl5Y291bnQgPSAwOwogCi0gIGlmICghIChZWVBBQ1RfTklORiA8IHl5biAmJiB5eW4gPD0gWVlMQVNUKSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQorICAvKiBUaGVyZSBhcmUgbWFueSBwb3NzaWJpbGl0aWVzIGhlcmUgdG8gY29uc2lkZXI6CisgICAgIC0gQXNzdW1lIFlZRkFJTCBpcyBub3QgdXNlZC4gIEl0J3MgdG9vIGZsYXdlZCB0byBjb25zaWRlci4gIFNlZQorICAgICAgIDxodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYmlzb24tcGF0Y2hlcy8yMDA5LTEyL21zZzAwMDI0Lmh0bWw+CisgICAgICAgZm9yIGRldGFpbHMuICBZWUVSUk9SIGlzIGZpbmUgYXMgaXQgZG9lcyBub3QgaW52b2tlIHRoaXMKKyAgICAgICBmdW5jdGlvbi4KKyAgICAgLSBJZiB0aGlzIHN0YXRlIGlzIGEgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgZGVmYXVsdCBhY3Rpb24sIHRoZW4KKyAgICAgICB0aGUgb25seSB3YXkgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCBpcyBpZiB0aGUgZGVmYXVsdCBhY3Rpb24KKyAgICAgICBpcyBhbiBlcnJvciBhY3Rpb24uICBJbiB0aGF0IGNhc2UsIGRvbid0IGNoZWNrIGZvciBleHBlY3RlZAorICAgICAgIHRva2VucyBiZWNhdXNlIHRoZXJlIGFyZSBub25lLgorICAgICAtIFRoZSBvbmx5IHdheSB0aGVyZSBjYW4gYmUgbm8gbG9va2FoZWFkIHByZXNlbnQgKGluIHl5Y2hhcikgaXMgaWYKKyAgICAgICB0aGlzIHN0YXRlIGlzIGEgY29uc2lzdGVudCBzdGF0ZSB3aXRoIGEgZGVmYXVsdCBhY3Rpb24uICBUaHVzLAorICAgICAgIGRldGVjdGluZyB0aGUgYWJzZW5jZSBvZiBhIGxvb2thaGVhZCBpcyBzdWZmaWNpZW50IHRvIGRldGVybWluZQorICAgICAgIHRoYXQgdGhlcmUgaXMgbm8gdW5leHBlY3RlZCBvciBleHBlY3RlZCB0b2tlbiB0byByZXBvcnQuICBJbiB0aGF0CisgICAgICAgY2FzZSwganVzdCByZXBvcnQgYSBzaW1wbGUgInN5bnRheCBlcnJvciIuCisgICAgIC0gRG9uJ3QgYXNzdW1lIHRoZXJlIGlzbid0IGEgbG9va2FoZWFkIGp1c3QgYmVjYXVzZSB0aGlzIHN0YXRlIGlzIGEKKyAgICAgICBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBkZWZhdWx0IGFjdGlvbi4gIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBhCisgICAgICAgcHJldmlvdXMgaW5jb25zaXN0ZW50IHN0YXRlLCBjb25zaXN0ZW50IHN0YXRlIHdpdGggYSBub24tZGVmYXVsdAorICAgICAgIGFjdGlvbiwgb3IgdXNlciBzZW1hbnRpYyBhY3Rpb24gdGhhdCBtYW5pcHVsYXRlZCB5eWNoYXIuCisgICAgIC0gT2YgY291cnNlLCB0aGUgZXhwZWN0ZWQgdG9rZW4gbGlzdCBkZXBlbmRzIG9uIHN0YXRlcyB0byBoYXZlCisgICAgICAgY29ycmVjdCBsb29rYWhlYWQgaW5mb3JtYXRpb24sIGFuZCBpdCBkZXBlbmRzIG9uIHRoZSBwYXJzZXIgbm90CisgICAgICAgdG8gcGVyZm9ybSBleHRyYSByZWR1Y3Rpb25zIGFmdGVyIGZldGNoaW5nIGEgbG9va2FoZWFkIGZyb20gdGhlCisgICAgICAgc2Nhbm5lciBhbmQgYmVmb3JlIGRldGVjdGluZyBhIHN5bnRheCBlcnJvci4gIFRodXMsIHN0YXRlIG1lcmdpbmcKKyAgICAgICAoZnJvbSBMQUxSIG9yIElFTFIpIGFuZCBkZWZhdWx0IHJlZHVjdGlvbnMgY29ycnVwdCB0aGUgZXhwZWN0ZWQKKyAgICAgICB0b2tlbiBsaXN0LiAgSG93ZXZlciwgdGhlIGxpc3QgaXMgY29ycmVjdCBmb3IgY2Fub25pY2FsIExSIHdpdGgKKyAgICAgICBvbmUgZXhjZXB0aW9uOiBpdCB3aWxsIHN0aWxsIGNvbnRhaW4gYW55IHRva2VuIHRoYXQgd2lsbCBub3QgYmUKKyAgICAgICBhY2NlcHRlZCBkdWUgdG8gYW4gZXJyb3IgYWN0aW9uIGluIGEgbGF0ZXIgc3RhdGUuCisgICovCisgIGlmICh5eXRva2VuICE9IFlZRU1QVFkpCiAgICAgewotICAgICAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7Ci0gICAgICBZWVNJWkVfVCB5eXNpemUxOwotICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7Ci0gICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKLSAgICAgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOwotICAgICAgaW50IHl5eDsKKyAgICAgIGludCB5eW4gPSB5eXBhY3RbKnl5c3NwXTsKKyAgICAgIHl5YXJnW3l5Y291bnQrK10gPSB5eXRuYW1lW3l5dG9rZW5dOworICAgICAgaWYgKCF5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKyAgICAgICAgICAgICBZWUNIRUNLLiAgSW4gb3RoZXIgd29yZHMsIHNraXAgdGhlIGZpcnN0IC1ZWU4gYWN0aW9ucyBmb3IKKyAgICAgICAgICAgICB0aGlzIHN0YXRlIGJlY2F1c2UgdGhleSBhcmUgZGVmYXVsdCBhY3Rpb25zLiAgKi8KKyAgICAgICAgICBpbnQgeXl4YmVnaW4gPSB5eW4gPCAwID8gLXl5biA6IDA7CisgICAgICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCisgICAgICAgICAgaW50IHl5Y2hlY2tsaW0gPSBZWUxBU1QgLSB5eW4gKyAxOworICAgICAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKKyAgICAgICAgICBpbnQgeXl4OwogCi0jIGlmIDAKLSAgICAgIC8qIFRoaXMgaXMgc28geGdldHRleHQgc2VlcyB0aGUgdHJhbnNsYXRhYmxlIGZvcm1hdHMgdGhhdCBhcmUKLQkgY29uc3RydWN0ZWQgb24gdGhlIGZseS4gICovCi0gICAgICBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyIpOwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyBvciAlcyIpOwotIyBlbmRpZgotICAgICAgY2hhciAqeXlmbXQ7Ci0gICAgICBjaGFyIGNvbnN0ICp5eWY7Ci0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eXVuZXhwZWN0ZWRbXSA9ICJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlleHBlY3RpbmdbXSA9ICIsIGV4cGVjdGluZyAlcyI7Ci0gICAgICBzdGF0aWMgY2hhciBjb25zdCB5eW9yW10gPSAiIG9yICVzIjsKLSAgICAgIGNoYXIgeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZAotCQkgICAgKyBzaXplb2YgeXlleHBlY3RpbmcgLSAxCi0JCSAgICArICgoWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSAtIDIpCi0JCSAgICAgICAqIChzaXplb2YgeXlvciAtIDEpKV07Ci0gICAgICBjaGFyIGNvbnN0ICp5eXByZWZpeCA9IHl5ZXhwZWN0aW5nOwotCi0gICAgICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCi0JIFlZQ0hFQ0suICAqLwotICAgICAgaW50IHl5eGJlZ2luID0geXluIDwgMCA/IC15eW4gOiAwOwotCi0gICAgICAvKiBTdGF5IHdpdGhpbiBib3VuZHMgb2YgYm90aCB5eWNoZWNrIGFuZCB5eXRuYW1lLiAgKi8KLSAgICAgIGludCB5eWNoZWNrbGltID0gWVlMQVNUIC0geXluICsgMTsKLSAgICAgIGludCB5eXhlbmQgPSB5eWNoZWNrbGltIDwgWVlOVE9LRU5TID8geXljaGVja2xpbSA6IFlZTlRPS0VOUzsKLSAgICAgIGludCB5eWNvdW50ID0gMTsKLQotICAgICAgeXlhcmdbMF0gPSB5eXRuYW1lW3l5dHlwZV07Ci0gICAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZvcm1hdCwgeXl1bmV4cGVjdGVkKTsKLQotICAgICAgZm9yICh5eXggPSB5eXhiZWdpbjsgeXl4IDwgeXl4ZW5kOyArK3l5eCkKLQlpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCi0JICB7Ci0JICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCi0JICAgICAgewotCQl5eWNvdW50ID0gMTsKLQkJeXlzaXplID0geXlzaXplMDsKLQkJeXlmb3JtYXRbc2l6ZW9mIHl5dW5leHBlY3RlZCAtIDFdID0gJ1wwJzsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOwotCSAgICB5eXNpemUxID0geXlzaXplICsgeXl0bmFtZXJyICgwLCB5eXRuYW1lW3l5eF0pOwotCSAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOwotCSAgICB5eXNpemUgPSB5eXNpemUxOwotCSAgICB5eWZtdCA9IHl5c3RwY3B5ICh5eWZtdCwgeXlwcmVmaXgpOwotCSAgICB5eXByZWZpeCA9IHl5b3I7Ci0JICB9Ci0KLSAgICAgIHl5ZiA9IFlZXyh5eWZvcm1hdCk7Ci0gICAgICB5eXNpemUxID0geXlzaXplICsgeXlzdHJsZW4gKHl5Zik7Ci0gICAgICB5eXNpemVfb3ZlcmZsb3cgfD0gKHl5c2l6ZTEgPCB5eXNpemUpOwotICAgICAgeXlzaXplID0geXlzaXplMTsKLQotICAgICAgaWYgKHl5c2l6ZV9vdmVyZmxvdykKLQlyZXR1cm4gWVlTSVpFX01BWElNVU07Ci0KLSAgICAgIGlmICh5eXJlc3VsdCkKLQl7Ci0JICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCi0JICAgICBEb24ndCBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBldmVuIGlmIHRoZSB0cmFuc2xhdGlvbgotCSAgICAgcHJvZHVjZWQgYSBzdHJpbmcgd2l0aCB0aGUgd3JvbmcgbnVtYmVyIG9mICIlcyJzLiAgKi8KLQkgIGNoYXIgKnl5cCA9IHl5cmVzdWx0OwotCSAgaW50IHl5aSA9IDA7Ci0JICB3aGlsZSAoKCp5eXAgPSAqeXlmKSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5ZlsxXSA9PSAncycgJiYgeXlpIDwgeXljb3VudCkKLQkJewotCQkgIHl5cCArPSB5eXRuYW1lcnIgKHl5cCwgeXlhcmdbeXlpKytdKTsKLQkJICB5eWYgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHl5cCsrOwotCQkgIHl5ZisrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4geXlzaXplOworICAgICAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCisgICAgICAgICAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IKKyAgICAgICAgICAgICAgICAmJiAheXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXl0YWJsZVt5eXggKyB5eW5dKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh5eWNvdW50ID09IFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHl5Y291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICB5eXNpemUgPSB5eXNpemUwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB5eWFyZ1t5eWNvdW50KytdID0geXl0bmFtZVt5eXhdOworICAgICAgICAgICAgICAgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXRuYW1lcnIgKDAsIHl5dG5hbWVbeXl4XSk7CisgICAgICAgICAgICAgICAgaWYgKCEgKHl5c2l6ZSA8PSB5eXNpemUxCisgICAgICAgICAgICAgICAgICAgICAgICYmIHl5c2l6ZTEgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKworICBzd2l0Y2ggKHl5Y291bnQpCisgICAgeworIyBkZWZpbmUgWVlDQVNFXyhOLCBTKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIE46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeXlmb3JtYXQgPSBTOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsKKyAgICAgIFlZQ0FTRV8oMCwgWVlfKCJzeW50YXggZXJyb3IiKSk7CisgICAgICBZWUNBU0VfKDEsIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIikpOworICAgICAgWVlDQVNFXygyLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIikpOworICAgICAgWVlDQVNFXygzLCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg0LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIikpOworICAgICAgWVlDQVNFXyg1LCBZWV8oInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAlcywgZXhwZWN0aW5nICVzIG9yICVzIG9yICVzIG9yICVzIikpOworIyB1bmRlZiBZWUNBU0VfCisgICAgfQorCisgIHl5c2l6ZTEgPSB5eXNpemUgKyB5eXN0cmxlbiAoeXlmb3JtYXQpOworICBpZiAoISAoeXlzaXplIDw9IHl5c2l6ZTEgJiYgeXlzaXplMSA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQorICAgIHJldHVybiAyOworICB5eXNpemUgPSB5eXNpemUxOworCisgIGlmICgqeXltc2dfYWxsb2MgPCB5eXNpemUpCisgICAgeworICAgICAgKnl5bXNnX2FsbG9jID0gMiAqIHl5c2l6ZTsKKyAgICAgIGlmICghICh5eXNpemUgPD0gKnl5bXNnX2FsbG9jCisgICAgICAgICAgICAgJiYgKnl5bXNnX2FsbG9jIDw9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSkpCisgICAgICAgICp5eW1zZ19hbGxvYyA9IFlZU1RBQ0tfQUxMT0NfTUFYSU1VTTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBBdm9pZCBzcHJpbnRmLCBhcyB0aGF0IGluZnJpbmdlcyBvbiB0aGUgdXNlcidzIG5hbWUgc3BhY2UuCisgICAgIERvbid0IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGV2ZW4gaWYgdGhlIHRyYW5zbGF0aW9uCisgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCisgIHsKKyAgICBjaGFyICp5eXAgPSAqeXltc2c7CisgICAgaW50IHl5aSA9IDA7CisgICAgd2hpbGUgKCgqeXlwID0gKnl5Zm9ybWF0KSAhPSAnXDAnKQorICAgICAgaWYgKCp5eXAgPT0gJyUnICYmIHl5Zm9ybWF0WzFdID09ICdzJyAmJiB5eWkgPCB5eWNvdW50KQorICAgICAgICB7CisgICAgICAgICAgeXlwICs9IHl5dG5hbWVyciAoeXlwLCB5eWFyZ1t5eWkrK10pOworICAgICAgICAgIHl5Zm9ybWF0ICs9IDI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHl5cCsrOworICAgICAgICAgIHl5Zm9ybWF0Kys7CisgICAgICAgIH0KKyAgfQorICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQwKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gdGhpcyBzeW1ib2wuICB8CkBAIC0xMzU5LDYgKzE0MDIsNyBAQAogICAgIH0KIH0KIAorCiAvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwogI2lmZGVmIFlZUEFSU0VfUEFSQU0KICNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKQEAgLTEzODUsMTAgKzE0MjksOSBAQAogaW50IHl5bmVycnM7CiAKIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLgorfCB5eXBhcnNlLiAgfAorYC0tLS0tLS0tLS0qLwogCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCkBAIC0xNDEyLDggKzE0NTUsNiBAQAogI2VuZGlmCiAjZW5kaWYKIHsKLQotCiAgICAgaW50IHl5c3RhdGU7CiAgICAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCiAgICAgaW50IHl5ZXJyc3RhdHVzOwpAQCAtMTU2OCw3ICsxNjA5LDcgQEAKIAogICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQorICBpZiAoeXlwYWN0X3ZhbHVlX2lzX2RlZmF1bHQgKHl5bikpCiAgICAgZ290byB5eWRlZmF1bHQ7CiAKICAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KQEAgLTE1OTksOCArMTY0MCw4IEBACiAgIHl5biA9IHl5dGFibGVbeXluXTsKICAgaWYgKHl5biA8PSAwKQogICAgIHsKLSAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQotCWdvdG8geXllcnJsYWI7CisgICAgICBpZiAoeXl0YWJsZV92YWx1ZV9pc19lcnJvciAoeXluKSkKKyAgICAgICAgZ290byB5eWVycmxhYjsKICAgICAgIHl5biA9IC15eW47CiAgICAgICBnb3RvIHl5cmVkdWNlOwogICAgIH0KQEAgLTE2NTUsNDIgKzE2OTYsNDIgQEAKICAgICB7CiAgICAgICAgIGNhc2UgNDoKIAotICAgIHsgaXNfdHlwZWRlZiA9IDA7IGlzX2V4dGVybiA9IDA7IGN1cnJlbnRfbmFtZSA9IE5VTEw7IGRlY2xfc3BlYyA9IE5VTEw7IDt9CisgICAgeyBpc190eXBlZGVmID0gMDsgaXNfZXh0ZXJuID0gMDsgY3VycmVudF9uYW1lID0gTlVMTDsgZGVjbF9zcGVjID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNToKIAotICAgIHsgZnJlZV9saXN0KCooeXl2c3BbKDIpIC0gKDIpXSksIE5VTEwpOyAqKHl5dnNwWygyKSAtICgyKV0pID0gTlVMTDsgO30KKyAgICB7IGZyZWVfbGlzdCgqKHl5dnNwWygyKSAtICgyKV0pLCBOVUxMKTsgKih5eXZzcFsoMikgLSAoMildKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDY6CiAKLSAgICB7IGlzX3R5cGVkZWYgPSAxOyA7fQorICAgIHsgaXNfdHlwZWRlZiA9IDE7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4OgogCi0gICAgeyBpc190eXBlZGVmID0gMTsgO30KKyAgICB7IGlzX3R5cGVkZWYgPSAxOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTQ6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxNToKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE2OgpAQCAtMTcwNCwxMiArMTc0NSwxMiBAQAogCQkgICAgY3VycmVudF9uYW1lID0gTlVMTDsKIAkJICB9CiAJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTc6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDE5OgpAQCAtMTcyMCw3ICsxNzYxLDcgQEAKIAkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKIAkJICBjdXJyZW50X25hbWUgPSBOVUxMOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDIwOgpAQCAtMTczMywyNyArMTc3NCwyNyBAQAogCQkJICAgICBpc190eXBlZGVmID8gU1lNX1RZUEVERUYgOiBTWU1fTk9STUFMLCBkZWNsLCBpc19leHRlcm4pOwogCQkgIGN1cnJlbnRfbmFtZSA9IE5VTEw7CiAJCSAgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsKLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSkgPyAoeXl2c3BbKDQpIC0gKDQpXSkgOiAoeXl2c3BbKDMpIC0gKDQpXSkgPyAoeXl2c3BbKDMpIC0gKDQpXSkgOiAoeXl2c3BbKDIpIC0gKDQpXSkgPyAoeXl2c3BbKDIpIC0gKDQpXSkgOiAoeXl2c3BbKDEpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pID8gKHl5dnNwWyg0KSAtICg0KV0pIDogKHl5dnNwWygzKSAtICg0KV0pID8gKHl5dnNwWygzKSAtICg0KV0pIDogKHl5dnNwWygyKSAtICg0KV0pID8gKHl5dnNwWygyKSAtICg0KV0pIDogKHl5dnNwWygxKSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyMjoKIAotICAgIHsgZGVjbF9zcGVjID0gTlVMTDsgO30KKyAgICB7IGRlY2xfc3BlYyA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDI0OgogCi0gICAgeyBkZWNsX3NwZWMgPSAqKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIHsgZGVjbF9zcGVjID0gKih5eXZzcFsoMSkgLSAoMSldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMjU6CiAKLSAgICB7IGRlY2xfc3BlYyA9ICooeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyBkZWNsX3NwZWMgPSAqKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAyNjoKQEAgLTE3NjIsOTcgKzE4MDMsODIgQEAKIAkJICAgICBpcyByZWFsbHkgaXJyZWxldmFudCB0byB0aGUgbGlua2FnZS4gICovCiAJCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKIAkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAzMToKIAotICAgIHsgaXNfZXh0ZXJuID0gMTsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KKyAgICB7IGlzX2V4dGVybiA9IDE7ICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDMyOgogCi0gICAgeyBpc19leHRlcm4gPSAwOyAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOyA7fQorICAgIHsgaXNfZXh0ZXJuID0gMDsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzc6CiAKLSAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1NUUlVDVDsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1NUUlVDVDsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzg6CiAKLSAgICB7IHJlbW92ZV9ub2RlKCh5eXZzcFsoMSkgLSAoMildKSk7ICgqKHl5dnNwWygyKSAtICgyKV0pKS0+dGFnID0gU1lNX1VOSU9OOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fVU5JT047ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDM5OgogCi0gICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDIpXSkpOyAoKih5eXZzcFsoMikgLSAoMildKSktPnRhZyA9IFNZTV9FTlVNOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgyKV0pKTsgKCooeXl2c3BbKDIpIC0gKDIpXSkpLT50YWcgPSBTWU1fRU5VTTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDA6CiAKLSAgICB7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICooeXl2c3BbKDMpIC0gKDMpXSksICppID0gKih5eXZzcFsoMikgLSAoMyldKSwgKnI7Ci0JCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1NUUlVDVDsKLQkJICByLT5uZXh0ID0gKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0OyAqKHl5dnNwWygzKSAtICgzKV0pID0gcjsgKCooeXl2c3BbKDEpIC0gKDMpXSkpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1NUUlVDVCwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9TVFJVQ1QpOyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0MToKIAotICAgIHsgc3RydWN0IHN0cmluZ19saXN0ICpzID0gKih5eXZzcFsoMykgLSAoMyldKSwgKmkgPSAqKHl5dnNwWygyKSAtICgzKV0pLCAqcjsKLQkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fVU5JT047Ci0JCSAgci0+bmV4dCA9ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dDsgKih5eXZzcFsoMykgLSAoMyldKSA9IHI7ICgqKHl5dnNwWygxKSAtICgzKV0pKS0+bmV4dCA9IE5VTEw7Ci0JCSAgYWRkX3N5bWJvbChpLT5zdHJpbmcsIFNZTV9VTklPTiwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9VTklPTik7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQyOgogCi0gICAgeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqKHl5dnNwWygzKSAtICgzKV0pLCAqaSA9ICooeXl2c3BbKDIpIC0gKDMpXSksICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9FTlVNOwotCQkgIHItPm5leHQgPSAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQ7ICooeXl2c3BbKDMpIC0gKDMpXSkgPSByOyAoKih5eXZzcFsoMSkgLSAoMyldKSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKLQkJICAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOwotCQk7fQorICAgIHsgcmVjb3JkX2NvbXBvdW5kKCh5eXZzcFsoMSkgLSAoMyldKSwgKHl5dnNwWygyKSAtICgzKV0pLCAoeXl2c3BbKDMpIC0gKDMpXSksIFNZTV9FTlVNKTsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDM6CiAKLSAgICB7IGFkZF9zeW1ib2woTlVMTCwgU1lNX0VOVU0sIE5VTEwsIDApOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgYWRkX3N5bWJvbChOVUxMLCBTWU1fRU5VTSwgTlVMTCwgMCk7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDQ0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNDU6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1NjoKIAotICAgIHsgKCooeXl2c3BbKDEpIC0gKDEpXSkpLT50YWcgPSBTWU1fVFlQRURFRjsgKHl5dmFsKSA9ICh5eXZzcFsoMSkgLSAoMSldKTsgO30KKyAgICB7ICgqKHl5dnNwWygxKSAtICgxKV0pKS0+dGFnID0gU1lNX1RZUEVERUY7ICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDU3OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNTg6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDYxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjU6CkBAIC0xODYwLDEyICsxODg2LDEyIEBACiAgICAgeyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCiAJCSAgcmVtb3ZlX25vZGUoKHl5dnNwWygxKSAtICgxKV0pKTsKIAkJICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA2NjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDY4OgpAQCAtMTg3Nyw5NyArMTkwMyw5NyBAQAogCQkgICAgY3VycmVudF9uYW1lID0gKCooeXl2c3BbKDEpIC0gKDEpXSkpLT5zdHJpbmc7CiAJCSAgICAoeXl2YWwpID0gKHl5dnNwWygxKSAtICgxKV0pOwogCQkgIH0KLQkJO30KKwkJfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDcxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzI6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3MzoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDc0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzg6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3OToKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDgwOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4MjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDgzOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODU6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA4NjoKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgODk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5MDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDkxOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pID8gKHl5dnNwWygyKSAtICgyKV0pIDogKHl5dnNwWygxKSAtICgyKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTM6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk0OgpAQCAtMTk3NiwzOSArMjAwMiwzOSBAQAogCQkgICAgIHByaXZhdGUgcGFyYW1ldGVyIG5hbWVzLiAgKi8KIAkJICByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDk1OgogCiAgICAgeyByZW1vdmVfbm9kZSgoeXl2c3BbKDEpIC0gKDEpXSkpOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDEpIC0gKDEpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDk2OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgOTc6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDQpIC0gKDQpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA5ODoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDk5OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAwOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTAxOgpAQCAtMjAxNyw4NyArMjA0Myw4NyBAQAogCQkgICooeXl2c3BbKDIpIC0gKDMpXSkgPSBOVUxMOwogCQkgIGFkZF9zeW1ib2woY3VycmVudF9uYW1lLCBTWU1fTk9STUFMLCBkZWNsLCBpc19leHRlcm4pOwogCQkgICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7Ci0JCTt9CisJCX0KICAgICBicmVhazsKIAogICBjYXNlIDEwMjoKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA0OgogCi0gICAgeyByZW1vdmVfbGlzdCgoeXl2c3BbKDIpIC0gKDIpXSksICYoKih5eXZzcFsoMSkgLSAoMildKSktPm5leHQpOyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyA7fQorICAgIHsgcmVtb3ZlX2xpc3QoKHl5dnNwWygyKSAtICgyKV0pLCAmKCooeXl2c3BbKDEpIC0gKDIpXSkpLT5uZXh0KTsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA1OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA2OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTA3OgogCi0gICAgeyAoeXl2YWwpID0gTlVMTDsgO30KKyAgICB7ICh5eXZhbCkgPSBOVUxMOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTA6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTE6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTI6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMTM6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExNjoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDMpIC0gKDMpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExNzoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKSA/ICh5eXZzcFsoMikgLSAoMildKSA6ICh5eXZzcFsoMSkgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSkgPyAoeXl2c3BbKDIpIC0gKDIpXSkgOiAoeXl2c3BbKDEpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDExODoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyMDoKIAotICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMikgLSAoMildKTsgO30KKyAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEyMToKIAotICAgIHsgKHl5dmFsKSA9IE5VTEw7IDt9CisgICAgeyAoeXl2YWwpID0gTlVMTDsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTIzOgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWygzKSAtICgzKV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoMykgLSAoMyldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI0OgogCi0gICAgeyAoeXl2YWwpID0gKHl5dnNwWyg0KSAtICg0KV0pOyA7fQorICAgIHsgKHl5dmFsKSA9ICh5eXZzcFsoNCkgLSAoNCldKTsgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgMTI3OgpAQCAtMjEwNSw3ICsyMTMxLDcgQEAKICAgICB7CiAJCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgxKV0pKS0+c3RyaW5nKTsKIAkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIE5VTEwsIDApOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjg6CkBAIC0yMTE0LDI4ICsyMTQwLDM5IEBACiAJCQljb25zdCBjaGFyICpuYW1lID0gc3RyZHVwKCgqKHl5dnNwWygxKSAtICgzKV0pKS0+c3RyaW5nKTsKIAkJCXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwciA9IGNvcHlfbGlzdF9yYW5nZSgqKHl5dnNwWygzKSAtICgzKV0pLCAqKHl5dnNwWygyKSAtICgzKV0pKTsKIAkJCWFkZF9zeW1ib2wobmFtZSwgU1lNX0VOVU1fQ09OU1QsIGV4cHIsIDApOwotCQk7fQorCQl9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMjk6CiAKLSAgICB7ICh5eXZhbCkgPSAoeXl2c3BbKDIpIC0gKDIpXSk7IDt9CisgICAgeyAoeXl2YWwpID0gKHl5dnNwWygyKSAtICgyKV0pOyB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSAxMzA6CiAKLSAgICB7ICh5eXZhbCkgPSBOVUxMOyA7fQorICAgIHsgKHl5dmFsKSA9IE5VTEw7IH0KICAgICBicmVhazsKIAogICBjYXNlIDEzMjoKIAotICAgIHsgZXhwb3J0X3N5bWJvbCgoKih5eXZzcFsoMykgLSAoNSldKSktPnN0cmluZyk7ICh5eXZhbCkgPSAoeXl2c3BbKDUpIC0gKDUpXSk7IDt9CisgICAgeyBleHBvcnRfc3ltYm9sKCgqKHl5dnNwWygzKSAtICg1KV0pKS0+c3RyaW5nKTsgKHl5dmFsKSA9ICh5eXZzcFsoNSkgLSAoNSldKTsgfQogICAgIGJyZWFrOwogCiAKIAogICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgfQorICAvKiBVc2VyIHNlbWFudGljIGFjdGlvbnMgc29tZXRpbWVzIGFsdGVyIHl5Y2hhciwgYW5kIHRoYXQgcmVxdWlyZXMKKyAgICAgdGhhdCB5eXRva2VuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zbGF0aW9uLiAgV2UgdGFrZSB0aGUKKyAgICAgYXBwcm9hY2ggb2YgdHJhbnNsYXRpbmcgaW1tZWRpYXRlbHkgYmVmb3JlIGV2ZXJ5IHVzZSBvZiB5eXRva2VuLgorICAgICBPbmUgYWx0ZXJuYXRpdmUgaXMgdHJhbnNsYXRpbmcgaGVyZSBhZnRlciBldmVyeSBzZW1hbnRpYyBhY3Rpb24sCisgICAgIGJ1dCB0aGF0IHRyYW5zbGF0aW9uIHdvdWxkIGJlIG1pc3NlZCBpZiB0aGUgc2VtYW50aWMgYWN0aW9uIGludm9rZXMKKyAgICAgWVlBQk9SVCwgWVlBQ0NFUFQsIG9yIFlZRVJST1IgaW1tZWRpYXRlbHkgYWZ0ZXIgYWx0ZXJpbmcgeXljaGFyIG9yCisgICAgIGlmIGl0IGludm9rZXMgWVlCQUNLVVAuICBJbiB0aGUgY2FzZSBvZiBZWUFCT1JUIG9yIFlZQUNDRVBULCBhbgorICAgICBpbmNvcnJlY3QgZGVzdHJ1Y3RvciBtaWdodCB0aGVuIGJlIGludm9rZWQgaW1tZWRpYXRlbHkuICBJbiB0aGUKKyAgICAgY2FzZSBvZiBZWUVSUk9SIG9yIFlZQkFDS1VQLCBzdWJzZXF1ZW50IHBhcnNlciBhY3Rpb25zIG1pZ2h0IGxlYWQKKyAgICAgdG8gYW4gaW5jb3JyZWN0IGRlc3RydWN0b3IgY2FsbCBvciB2ZXJib3NlIHN5bnRheCBlcnJvciBtZXNzYWdlCisgICAgIGJlZm9yZSB0aGUgbG9va2FoZWFkIGlzIHRyYW5zbGF0ZWQuICAqLwogICBZWV9TWU1CT0xfUFJJTlQgKCItPiAkJCA9IiwgeXlyMVt5eW5dLCAmeXl2YWwsICZ5eWxvYyk7CiAKICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpAQCAtMjE2Myw2ICsyMjAwLDEwIEBACiB8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogeXllcnJsYWI6CisgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgdXNlciBzZW1hbnRpYyBhY3Rpb25zIGZvciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICAqLworICB5eXRva2VuID0geXljaGFyID09IFlZRU1QVFkgPyBZWUVNUFRZIDogWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCiAgIGlmICgheXllcnJzdGF0dXMpCiAgICAgewpAQCAtMjE3MCwzNyArMjIxMSwzNiBAQAogI2lmICEgWVlFUlJPUl9WRVJCT1NFCiAgICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKICNlbHNlCisjIGRlZmluZSBZWVNZTlRBWF9FUlJPUiB5eXN5bnRheF9lcnJvciAoJnl5bXNnX2FsbG9jLCAmeXltc2csIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eXNzcCwgeXl0b2tlbikKICAgICAgIHsKLQlZWVNJWkVfVCB5eXNpemUgPSB5eXN5bnRheF9lcnJvciAoMCwgeXlzdGF0ZSwgeXljaGFyKTsKLQlpZiAoeXltc2dfYWxsb2MgPCB5eXNpemUgJiYgeXltc2dfYWxsb2MgPCBZWVNUQUNLX0FMTE9DX01BWElNVU0pCi0JICB7Ci0JICAgIFlZU0laRV9UIHl5YWxsb2MgPSAyICogeXlzaXplOwotCSAgICBpZiAoISAoeXlzaXplIDw9IHl5YWxsb2MgJiYgeXlhbGxvYyA8PSBZWVNUQUNLX0FMTE9DX01BWElNVU0pKQotCSAgICAgIHl5YWxsb2MgPSBZWVNUQUNLX0FMTE9DX01BWElNVU07Ci0JICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKLQkgICAgICBZWVNUQUNLX0ZSRUUgKHl5bXNnKTsKLQkgICAgeXltc2cgPSAoY2hhciAqKSBZWVNUQUNLX0FMTE9DICh5eWFsbG9jKTsKLQkgICAgaWYgKHl5bXNnKQotCSAgICAgIHl5bXNnX2FsbG9jID0geXlhbGxvYzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJeXltc2cgPSB5eW1zZ2J1ZjsKLQkJeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKDAgPCB5eXNpemUgJiYgeXlzaXplIDw9IHl5bXNnX2FsbG9jKQotCSAgewotCSAgICAodm9pZCkgeXlzeW50YXhfZXJyb3IgKHl5bXNnLCB5eXN0YXRlLCB5eWNoYXIpOwotCSAgICB5eWVycm9yICh5eW1zZyk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKLQkgICAgaWYgKHl5c2l6ZSAhPSAwKQotCSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0JICB9CisgICAgICAgIGNoYXIgY29uc3QgKnl5bXNncCA9IFlZXygic3ludGF4IGVycm9yIik7CisgICAgICAgIGludCB5eXN5bnRheF9lcnJvcl9zdGF0dXM7CisgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDApCisgICAgICAgICAgeXltc2dwID0geXltc2c7CisgICAgICAgIGVsc2UgaWYgKHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh5eW1zZyAhPSB5eW1zZ2J1ZikKKyAgICAgICAgICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisgICAgICAgICAgICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5bXNnX2FsbG9jKTsKKyAgICAgICAgICAgIGlmICgheXltc2cpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5eW1zZyA9IHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IDI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHl5c3ludGF4X2Vycm9yX3N0YXR1cyA9IFlZU1lOVEFYX0VSUk9SOworICAgICAgICAgICAgICAgIHl5bXNncCA9IHl5bXNnOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB5eWVycm9yICh5eW1zZ3ApOworICAgICAgICBpZiAoeXlzeW50YXhfZXJyb3Jfc3RhdHVzID09IDIpCisgICAgICAgICAgZ290byB5eWV4aGF1c3RlZGxhYjsKICAgICAgIH0KKyMgdW5kZWYgWVlTWU5UQVhfRVJST1IKICNlbmRpZgogICAgIH0KIApAQCAtMjI1OSw3ICsyMjk5LDcgQEAKICAgZm9yICg7OykKICAgICB7CiAgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQorICAgICAgaWYgKCF5eXBhY3RfdmFsdWVfaXNfZGVmYXVsdCAoeXluKSkKIAl7CiAJICB5eW4gKz0gWVlURVJST1I7CiAJICBpZiAoMCA8PSB5eW4gJiYgeXluIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5bl0gPT0gWVlURVJST1IpCkBAIC0yMzE4LDggKzIzNTgsMTMgQEAKIAogeXlyZXR1cm46CiAgIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKLSAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwpOworICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGxhdGVzdCBsb29rYWhlYWQgdHJhbnNsYXRpb24uICBTZWUgY29tbWVudHMgYXQKKyAgICAgICAgIHVzZXIgc2VtYW50aWMgYWN0aW9ucyBmb3Igd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgKi8KKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCisgICAgICAgICAgICAgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKKyAgICB9CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuaF9zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS50YWIuaF9zaGlwcGVkCmluZGV4IDM1MGMyYjQuLjkzMjQwYTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UudGFiLmhfc2hpcHBlZAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnRhYi5oX3NoaXBwZWQKQEAgLTEsOSArMSw4IEBACi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjMuICAqLworLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNS4gICovCiAKLS8qIFNrZWxldG9uIGludGVyZmFjZSBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCisvKiBCaXNvbiBpbnRlcmZhY2UgZm9yIFlhY2MtbGlrZSBwYXJzZXJzIGluIEMKICAgIAotICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAotICAgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OS0xOTkwLCAyMDAwLTIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55CmluZGV4IGJhNWMyNDIuLjIzYzM5OTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKQEAgLTUxLDYgKzUxLDI1IEBACiAgIGZyZWVfbGlzdChiLCBlKTsKIH0KIAorLyogUmVjb3JkIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3QvdW5pb24vZW51bSAqLworc3RhdGljIHZvaWQgcmVjb3JkX2NvbXBvdW5kKHN0cnVjdCBzdHJpbmdfbGlzdCAqKmtleXcsCisJCSAgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKippZGVudCwKKwkJICAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqKmJvZHksCisJCSAgICAgICBlbnVtIHN5bWJvbF90eXBlIHR5cGUpCit7CisJc3RydWN0IHN0cmluZ19saXN0ICpiID0gKmJvZHksICppID0gKmlkZW50LCAqcjsKKworCWlmIChpLT5pbl9zb3VyY2VfZmlsZSkgeworCQlyZW1vdmVfbm9kZShrZXl3KTsKKwkJKCppZGVudCktPnRhZyA9IHR5cGU7CisJCXJlbW92ZV9saXN0KGJvZHksIGlkZW50KTsKKwkJcmV0dXJuOworCX0KKwlyID0gY29weV9ub2RlKGkpOyByLT50YWcgPSB0eXBlOworCXItPm5leHQgPSAoKmtleXcpLT5uZXh0OyAqYm9keSA9IHI7ICgqa2V5dyktPm5leHQgPSBOVUxMOworCWFkZF9zeW1ib2woaS0+c3RyaW5nLCB0eXBlLCBiLCBpc19leHRlcm4pOworfQorCiAlfQogCiAldG9rZW4gQVNNX0tFWVcKQEAgLTIxNSwyNiArMjM0LDExIEBACiAKIAkvKiBGdWxsIGRlZmluaXRpb25zIG9mIGFuIHMvdS9lLiAgUmVjb3JkIGl0LiAgKi8KIAl8IFNUUlVDVF9LRVlXIElERU5UIGNsYXNzX2JvZHkKLQkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKLQkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fU1RSVUNUOwotCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOwotCQkgICQkID0gJDM7Ci0JCX0KKwkJeyByZWNvcmRfY29tcG91bmQoJDEsICQyLCAkMywgU1lNX1NUUlVDVCk7ICQkID0gJDM7IH0KIAl8IFVOSU9OX0tFWVcgSURFTlQgY2xhc3NfYm9keQotCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9VTklPTjsKLQkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKLQkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOwotCQkgICQkID0gJDM7Ci0JCX0KKwkJeyByZWNvcmRfY29tcG91bmQoJDEsICQyLCAkMywgU1lNX1VOSU9OKTsgJCQgPSAkMzsgfQogCXwgRU5VTV9LRVlXIElERU5UIGVudW1fYm9keQotCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOwotCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9FTlVNOwotCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOwotCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKLQkJICAkJCA9ICQzOwotCQl9CisJCXsgcmVjb3JkX2NvbXBvdW5kKCQxLCAkMiwgJDMsIFNZTV9FTlVNKTsgJCQgPSAkMzsgfQogCS8qCiAJICogQW5vbnltb3VzIGVudW0gZGVmaW5pdGlvbi4gVGVsbCBhZGRfc3ltYm9sKCkgdG8gcmVzdGFydCBpdHMgY291bnRlci4KIAkgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCA4MmQyZWIyLi5iYTU3M2ZlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC0zMywxNyArMzMsOSBAQAogCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAogCSQ8IC0tJEAgJChLY29uZmlnKQogCi0jIGlmIG5vIHBhdGggaXMgZ2l2ZW4sIHRoZW4gdXNlIHNyYyBkaXJlY3RvcnkgdG8gZmluZCBmaWxlCi1pZmRlZiBMU01PRAotTFNNT0RfRiA6PSAkKExTTU9EKQotaWZlcSAoJChmaW5kc3RyaW5nIC8sJChMU01PRCkpLCkKLSAgTFNNT0RfRiA6PSAkKG9ianRyZWUpLyQoTFNNT0QpCi1lbmRpZgotZW5kaWYKLQotbG9jYWxtb2Rjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgorbG9jYWx5ZXNjb25maWcgbG9jYWxtb2Rjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgogCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAotCSQoUSlwZXJsICQ8ICQoc3JjdHJlZSkgJChLY29uZmlnKSAkKExTTU9EX0YpID4gLnRtcC5jb25maWcKKwkkKFEpcGVybCAkPCAtLSRAICQoc3JjdHJlZSkgJChLY29uZmlnKSA+IC50bXAuY29uZmlnCiAJJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuIAkJCQkJXAogCQkJY21wIC1zIC50bXAuY29uZmlnIC5jb25maWcgfHwJCQlcCiAJCQkobXYgLWYgLmNvbmZpZyAuY29uZmlnLm9sZC4xOwkJCVwKQEAgLTU2LDIyICs0OCw2IEBACiAJZmkKIAkkKFEpcm0gLWYgLnRtcC5jb25maWcKIAotbG9jYWx5ZXNjb25maWc6ICQob2JqKS9zdHJlYW1saW5lX2NvbmZpZy5wbCAkKG9iaikvY29uZgotCSQoUSlta2RpciAtcCBpbmNsdWRlL2dlbmVyYXRlZAotCSQoUSlwZXJsICQ8ICQoc3JjdHJlZSkgJChLY29uZmlnKSAkKExTTU9EX0YpID4gLnRtcC5jb25maWcKLQkkKFEpc2VkIC1pIHMvPW0vPXkvIC50bXAuY29uZmlnCi0JJChRKWlmIFsgLWYgLmNvbmZpZyBdOyB0aGVuCQkJCQlcCi0JCQljbXAgLXMgLnRtcC5jb25maWcgLmNvbmZpZyB8fAkJCVwKLQkJCShtdiAtZiAuY29uZmlnIC5jb25maWcub2xkLjE7CQkJXAotCQkJIG12IC1mIC50bXAuY29uZmlnIC5jb25maWc7CQkJXAotCQkJICQob2JqKS9jb25mIC0tc2lsZW50b2xkY29uZmlnICQoS2NvbmZpZyk7CVwKLQkJCSBtdiAtZiAuY29uZmlnLm9sZC4xIC5jb25maWcub2xkKQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJCW12IC1mIC50bXAuY29uZmlnIC5jb25maWc7CQkJXAotCQkJJChvYmopL2NvbmYgLS1zaWxlbnRvbGRjb25maWcgJChLY29uZmlnKTsJXAotCWZpCi0JJChRKXJtIC1mIC50bXAuY29uZmlnCi0KICMgQ3JlYXRlIG5ldyBsaW51eC5wb3QgZmlsZQogIyBBZGp1c3QgY2hhcnNldCB0byBVVEYtOCBpbiAucG8gZmlsZSB0byBhY2NlcHQgVVRGLTggaW4gS2NvbmZpZyBmaWxlcwogIyBUaGUgc3ltbGluayBpcyB1c2VkIHRvIHJlcGFpciBhIGRlZmljaWVuY3kgaW4gYXJjaC91bQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwppbmRleCA1OWI2NjdjLi41YTU4OTY1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtNTAzLDE3ICs1MDMsNiBAQAogCQkJZnByaW50ZihmcCwgIiNkZWZpbmUgJXMlcyVzIDFcbiIsCiAJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCBzdWZmaXgpOwogCQl9Ci0JCS8qCi0JCSAqIEdlbmVyYXRlIHRoZSBfX2VuYWJsZWRfQ09ORklHXyogYW5kCi0JCSAqIF9fZW5hYmxlZF9DT05GSUdfKl9NT0RVTEUgbWFjcm9zIGZvciB1c2UgYnkgdGhlCi0JCSAqIElTX3tFTkFCTEVELEJVSUxUSU4sTU9EVUxFfSBtYWNyb3MuIFRoZSBfTU9EVUxFIHZhcmlhbnQgaXMKLQkJICogZ2VuZXJhdGVkIGV2ZW4gZm9yIGJvb2xlYW5zIHNvIHRoYXQgdGhlIElTX0VOQUJMRUQoKSBtYWNybwotCQkgKiB3b3Jrcy4KLQkJICovCi0JCWZwcmludGYoZnAsICIjZGVmaW5lIF9fZW5hYmxlZF8iIENPTkZJR18gIiVzICVkXG4iLAotCQkJCXN5bS0+bmFtZSwgKCp2YWx1ZSA9PSAneScpKTsKLQkJZnByaW50ZihmcCwgIiNkZWZpbmUgX19lbmFibGVkXyIgQ09ORklHXyAiJXNfTU9EVUxFICVkXG4iLAotCQkJCXN5bS0+bmFtZSwgKCp2YWx1ZSA9PSAnbScpKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU19IRVg6IHsKQEAgLTU2NSw2ICs1NTQsMzUgQEAKIH07CiAKIC8qCisgKiBHZW5lcmF0ZSB0aGUgX19lbmFibGVkX0NPTkZJR18qIGFuZCBfX2VuYWJsZWRfQ09ORklHXypfTU9EVUxFIG1hY3JvcyBmb3IKKyAqIHVzZSBieSB0aGUgSVNfe0VOQUJMRUQsQlVJTFRJTixNT0RVTEV9IG1hY3Jvcy4gVGhlIF9NT0RVTEUgdmFyaWFudCBpcworICogZ2VuZXJhdGVkIGV2ZW4gZm9yIGJvb2xlYW5zIHNvIHRoYXQgdGhlIElTX0VOQUJMRUQoKSBtYWNybyB3b3Jrcy4KKyAqLworc3RhdGljIHZvaWQKK2hlYWRlcl9wcmludF9fZW5hYmxlZF9zeW1ib2woRklMRSAqZnAsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOiB7CisJCWZwcmludGYoZnAsICIjZGVmaW5lIF9fZW5hYmxlZF8iIENPTkZJR18gIiVzICVkXG4iLAorCQkgICAgc3ltLT5uYW1lLCAoKnZhbHVlID09ICd5JykpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSBfX2VuYWJsZWRfIiBDT05GSUdfICIlc19NT0RVTEUgJWRcbiIsCisJCSAgICBzeW0tPm5hbWUsICgqdmFsdWUgPT0gJ20nKSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIGhlYWRlcl9fZW5hYmxlZF9wcmludGVyX2NiID0KK3sKKwkucHJpbnRfc3ltYm9sID0gaGVhZGVyX3ByaW50X19lbmFibGVkX3N5bWJvbCwKKwkucHJpbnRfY29tbWVudCA9IGhlYWRlcl9wcmludF9jb21tZW50LAorfTsKKworLyoKICAqIFRyaXN0YXRlIHByaW50ZXIKICAqCiAgKiBUaGlzIHByaW50ZXIgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGBpbmNsdWRlL2NvbmZpZy90cmlzdGF0ZS5jb25mJyBmaWxlLgpAQCAtOTQ1LDExICs5NjMsMTYgQEAKIAljb25mX3dyaXRlX2hlYWRpbmcob3V0X2gsICZoZWFkZXJfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7Ci0JCXN5bV9jYWxjX3ZhbHVlKHN5bSk7Ci0JCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpIHx8ICFzeW0tPm5hbWUpCisJCWlmICghc3ltLT5uYW1lKQogCQkJY29udGludWU7CiAKLQkJLyogd3JpdGUgc3ltYm9sIHRvIGF1dG8uY29uZiwgdHJpc3RhdGUgYW5kIGhlYWRlciBmaWxlcyAqLworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCisJCWNvbmZfd3JpdGVfc3ltYm9sKG91dF9oLCBzeW0sICZoZWFkZXJfX2VuYWJsZWRfcHJpbnRlcl9jYiwgTlVMTCk7CisKKwkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQljb250aW51ZTsKKwogCQljb25mX3dyaXRlX3N5bWJvbChvdXQsIHN5bSwgJmtjb25maWdfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKIAogCQljb25mX3dyaXRlX3N5bWJvbCh0cmlzdGF0ZSwgc3ltLCAmdHJpc3RhdGVfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jCmluZGV4IGM3MDQ3MTIuLjE1NGMyZGQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3RleHRib3guYwpAQCAtMzIwLDcgKzMyMCw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIHByaW50X2xpbmUoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpCiB7Ci0JaW50IHksIHg7CiAJY2hhciAqbGluZTsKIAogCWxpbmUgPSBnZXRfbGluZSgpOwpAQCAtMzI5LDEwICszMjgsMTAgQEAKIAl3YWRkY2god2luLCAnICcpOwogCXdhZGRuc3RyKHdpbiwgbGluZSwgTUlOKHN0cmxlbihsaW5lKSwgd2lkdGggLSAyKSk7CiAKLQlnZXR5eCh3aW4sIHksIHgpOwogCS8qIENsZWFyICdyZXNpZHVlJyBvZiBwcmV2aW91cyBsaW5lICovCiAjaWYgT0xEX05DVVJTRVMKIAl7CisJCWludCB4ID0gZ2V0Y3VyeCh3aW4pOwogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0geDsgaSsrKQogCQkJd2FkZGNoKHdpbiwgJyAnKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKaW5kZXggODIwZDJiNi4uMTllMjAwZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsb2NhbGUuaD4KIApAQCAtMjcyLDYgKzI3Myw3IEBACiBzdGF0aWMgaW50IGNoaWxkX2NvdW50Owogc3RhdGljIGludCBzaW5nbGVfbWVudV9tb2RlOwogc3RhdGljIGludCBzaG93X2FsbF9vcHRpb25zOworc3RhdGljIGludCBzYXZlZF94LCBzYXZlZF95OwogCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKQEAgLTc5Miw5ICs3OTQsNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaGFuZGxlX2V4aXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJZGlhbG9nX2NsZWFyKCk7CisJaWYgKGNvbmZfZ2V0X2NoYW5nZWQoKSkKKwkJcmVzID0gZGlhbG9nX3llc25vKE5VTEwsCisJCQkJICAgXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIG5ldyBjb25maWd1cmF0aW9uID9cbiIKKwkJCQkgICAgICI8RVNDPjxFU0M+IHRvIGNvbnRpbnVlLiIpLAorCQkJCSAgIDYsIDYwKTsKKwllbHNlCisJCXJlcyA9IC0xOworCisJZW5kX2RpYWxvZyhzYXZlZF94LCBzYXZlZF95KTsKKworCXN3aXRjaCAocmVzKSB7CisJY2FzZSAwOgorCQlpZiAoY29uZl93cml0ZShmaWxlbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJCQkgICJFcnJvciB3aGlsZSB3cml0aW5nIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuIgorCQkJCQkgICJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJCSAgIlxuXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIC0xOgorCQlwcmludGYoXygiXG5cbiIKKwkJCSAiKioqIEVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKKwkJCSAiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIHN0YXJ0IHRoZSBidWlsZCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJICJcblxuIikpOworCQlyZXMgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiIKKwkJCQkgICJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJICAiXG5cbiIpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZXhpdChoYW5kbGVfZXhpdCgpKTsKK30KKwogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCiB7Ci0JaW50IHNhdmVkX3gsIHNhdmVkX3k7CiAJY2hhciAqbW9kZTsKIAlpbnQgcmVzOwogCkBAIC04MDIsNiArODQ5LDggQEAKIAliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogCXRleHRkb21haW4oUEFDS0FHRSk7CiAKKwlzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcik7CisKIAljb25mX3BhcnNlKGF2WzFdKTsKIAljb25mX3JlYWQoTlVMTCk7CiAKQEAgLTgyMyw0MCArODcyLDkgQEAKIAlzZXRfY29uZmlnX2ZpbGVuYW1lKGNvbmZfZ2V0X2NvbmZpZ25hbWUoKSk7CiAJZG8gewogCQljb25mKCZyb290bWVudSk7Ci0JCWRpYWxvZ19jbGVhcigpOwotCQlpZiAoY29uZl9nZXRfY2hhbmdlZCgpKQotCQkJcmVzID0gZGlhbG9nX3llc25vKE5VTEwsCi0JCQkJCSAgIF8oIkRvIHlvdSB3aXNoIHRvIHNhdmUgeW91ciAiCi0JCQkJCSAgICAgIm5ldyBjb25maWd1cmF0aW9uP1xuIgotCQkJCQkgICAgICI8RVNDPjxFU0M+IHRvIGNvbnRpbnVlLiIpLAotCQkJCQkgICA2LCA2MCk7Ci0JCWVsc2UKLQkJCXJlcyA9IC0xOworCQlyZXMgPSBoYW5kbGVfZXhpdCgpOwogCX0gd2hpbGUgKHJlcyA9PSBLRVlfRVNDKTsKLQllbmRfZGlhbG9nKHNhdmVkX3gsIHNhdmVkX3kpOwogCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIDA6Ci0JCWlmIChjb25mX3dyaXRlKGZpbGVuYW1lKSkgewotCQkJZnByaW50ZihzdGRlcnIsIF8oIlxuXG4iCi0JCQkJIkVycm9yIHdoaWxlIHdyaXRpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCi0JCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKLQkJCQkiXG5cbiIpKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgLTE6Ci0JCXByaW50ZihfKCJcblxuIgotCQkJIioqKiBFbmQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCi0JCQkiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIHN0YXJ0IHRoZSBidWlsZCBvciB0cnkgJ21ha2UgaGVscCcuIgotCQkJIlxuXG4iKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgotCQkJIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKLQkJCSJcblxuIikpOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IGQ2NjAwODYuLjhjMmE5N2UgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMTAsOCArMTAsNyBAQAogCiAjaW5jbHVkZSAibGtjLmgiCiAKLXN0YXRpYyBjb25zdCBjaGFyIG5vaGVscF90ZXh0W10gPSBOXygKLQkiVGhlcmUgaXMgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uLlxuIik7CitzdGF0aWMgY29uc3QgY2hhciBub2hlbHBfdGV4dFtdID0gIlRoZXJlIGlzIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbi4iOwogCiBzdHJ1Y3QgbWVudSByb290bWVudTsKIHN0YXRpYyBzdHJ1Y3QgbWVudSAqKmxhc3RfZW50cnlfcHRyOwpAQCAtNTk1LDE2ICs1OTQsMTQgQEAKIHZvaWQgbWVudV9nZXRfZXh0X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUsIHN0cnVjdCBnc3RyICpoZWxwKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpoZWxwX3RleHQgPSBub2hlbHBfdGV4dDsKIAogCWlmIChtZW51X2hhc19oZWxwKG1lbnUpKSB7Ci0JCWlmIChzeW0tPm5hbWUpIHsKKwkJaWYgKHN5bS0+bmFtZSkKIAkJCXN0cl9wcmludGYoaGVscCwgIiVzJXM6XG5cbiIsIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQlzdHJfYXBwZW5kKGhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwotCQkJc3RyX2FwcGVuZChoZWxwLCAiXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0cl9hcHBlbmQoaGVscCwgbm9oZWxwX3RleHQpOworCQloZWxwX3RleHQgPSBtZW51X2dldF9oZWxwKG1lbnUpOwogCX0KKwlzdHJfcHJpbnRmKGhlbHAsICIlc1xuIiwgXyhoZWxwX3RleHQpKTsKIAlpZiAoc3ltKQogCQlnZXRfc3ltYm9sX3N0cihoZWxwLCBzeW0pOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwppbmRleCAzOWNhMWYxLi43MzA3MGNiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwpAQCAtMTgyLDggKzE4Miw2IEBACiAiVGhpcyBmZWF0dXJlIGRlcGVuZHMgb24gYW5vdGhlciB3aGljaFxuIgogImhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUuXG4iCiAiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIpLAotbm9oZWxwX3RleHRbXSA9IE5fKAotIlRoZXJlIGlzIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbi5cbiIpLAogbG9hZF9jb25maWdfdGV4dFtdID0gTl8oCiAiRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB5b3Ugd2lzaCB0byBsb2FkLlxuIgogIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdVxuIgpAQCAtMjgwLDYgKzI3OCw5IEBACiAvKiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiAqLwogY29uc3QgY2hhciAqY3VycmVudF9pbnN0cnVjdGlvbnMgPSBtZW51X2luc3RydWN0aW9uczsKIAorc3RhdGljIGNoYXIgKmRpYWxvZ19pbnB1dF9yZXN1bHQ7CitzdGF0aWMgaW50IGRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuOworCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KTsKQEAgLTY5NSw3ICs2OTYsNiBAQAogewogCXN0cnVjdCBzeW1ib2wgKipzeW1fYXJyOwogCXN0cnVjdCBnc3RyIHJlczsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMTAwXTsKIAljaGFyICpkaWFsb2dfaW5wdXQ7CiAJaW50IGRyZXM7CiBhZ2FpbjoKQEAgLTcwMyw3ICs3MDMsNyBAQAogCQkJXygiU2VhcmNoIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIiksCiAJCQlfKCJFbnRlciAiIENPTkZJR18gIiAoc3ViKXN0cmluZyB0byBzZWFyY2ggZm9yICIKIAkJCQkiKHdpdGggb3Igd2l0aG91dCBcIiIgQ09ORklHXyAiXCIpIiksCi0JCQkiIiwgZGlhbG9nX2lucHV0X3Jlc3VsdCwgOTkpOworCQkJIiIsICZkaWFsb2dfaW5wdXRfcmVzdWx0LCAmZGlhbG9nX2lucHV0X3Jlc3VsdF9sZW4pOwogCXN3aXRjaCAoZHJlcykgewogCWNhc2UgMDoKIAkJYnJlYWs7CkBAIC0xMzQ4LDcgKzEzNDgsNiBAQAogc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCiB7CiAJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOwotCWNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFsyNTZdOwogCiAJd2hpbGUgKDEpIHsKIAkJaW50IHJlczsKQEAgLTEzNzEsOCArMTM3MCw4IEBACiAJCQkJcHJvbXB0ID8gXyhwcm9tcHQpIDogXygiTWFpbiBNZW51IiksCiAJCQkJaGVhZGluZywKIAkJCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pLAotCQkJCWRpYWxvZ19pbnB1dF9yZXN1bHQsCi0JCQkJc2l6ZW9mKGRpYWxvZ19pbnB1dF9yZXN1bHQpKTsKKwkJCQkmZGlhbG9nX2lucHV0X3Jlc3VsdCwKKwkJCQkmZGlhbG9nX2lucHV0X3Jlc3VsdF9sZW4pOwogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlIDA6CiAJCQlpZiAoc3ltX3NldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltLApAQCAtMTM5MiwxNCArMTM5MSwxMyBAQAogCiBzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCkKIHsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMjU2XTsKIAl3aGlsZSAoMSkgewogCQlpbnQgcmVzOwogCQlyZXMgPSBkaWFsb2dfaW5wdXRib3gobWFpbl93aW5kb3csCiAJCQkJTlVMTCwgbG9hZF9jb25maWdfdGV4dCwKIAkJCQlmaWxlbmFtZSwKLQkJCQlkaWFsb2dfaW5wdXRfcmVzdWx0LAotCQkJCXNpemVvZihkaWFsb2dfaW5wdXRfcmVzdWx0KSk7CisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHQsCisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuKTsKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFkaWFsb2dfaW5wdXRfcmVzdWx0WzBdKQpAQCAtMTQyNCwxNCArMTQyMiwxMyBAQAogCiBzdGF0aWMgdm9pZCBjb25mX3NhdmUodm9pZCkKIHsKLQljaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbMjU2XTsKIAl3aGlsZSAoMSkgewogCQlpbnQgcmVzOwogCQlyZXMgPSBkaWFsb2dfaW5wdXRib3gobWFpbl93aW5kb3csCiAJCQkJTlVMTCwgc2F2ZV9jb25maWdfdGV4dCwKIAkJCQlmaWxlbmFtZSwKLQkJCQlkaWFsb2dfaW5wdXRfcmVzdWx0LAotCQkJCXNpemVvZihkaWFsb2dfaW5wdXRfcmVzdWx0KSk7CisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHQsCisJCQkJJmRpYWxvZ19pbnB1dF9yZXN1bHRfbGVuKTsKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFkaWFsb2dfaW5wdXRfcmVzdWx0WzBdKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmd1aS5jIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmd1aS5jCmluZGV4IGY4MTM3YjMuLjNiMThkZDggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5ndWkuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuZ3VpLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCiBpbnQgZGlhbG9nX2lucHV0Ym94KFdJTkRPVyAqbWFpbl93aW5kb3csCiAJCWNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsCi0JCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKnJlc3VsdCwgaW50IHJlc3VsdF9sZW4pCisJCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKipyZXN1bHRwLCBpbnQgKnJlc3VsdF9sZW4pCiB7CiAJaW50IHByb21wdF9saW5lcyA9IDA7CiAJaW50IHByb21wdF93aWR0aCA9IDA7CkBAIC0zNjcsNyArMzY3LDEzIEBACiAJaW50IGksIHgsIHk7CiAJaW50IHJlcyA9IC0xOwogCWludCBjdXJzb3JfcG9zaXRpb24gPSBzdHJsZW4oaW5pdCk7CisJaW50IGN1cnNvcl9mb3JtX3dpbjsKKwljaGFyICpyZXN1bHQgPSAqcmVzdWx0cDsKIAorCWlmIChzdHJsZW4oaW5pdCkrMSA+ICpyZXN1bHRfbGVuKSB7CisJCSpyZXN1bHRfbGVuID0gc3RybGVuKGluaXQpKzE7CisJCSpyZXN1bHRwID0gcmVzdWx0ID0gcmVhbGxvYyhyZXN1bHQsICpyZXN1bHRfbGVuKTsKKwl9CiAKIAkvKiBmaW5kIHRoZSB3aWRlc3QgbGluZSBvZiBtc2c6ICovCiAJcHJvbXB0X2xpbmVzID0gZ2V0X2xpbmVfbm8ocHJvbXB0KTsKQEAgLTM4NCw3ICszOTAsNyBAQAogCXkgPSAoTElORVMtKHByb21wdF9saW5lcys0KSkvMjsKIAl4ID0gKENPTFMtKHByb21wdF93aWR0aCs0KSkvMjsKIAotCXN0cm5jcHkocmVzdWx0LCBpbml0LCByZXN1bHRfbGVuKTsKKwlzdHJuY3B5KHJlc3VsdCwgaW5pdCwgKnJlc3VsdF9sZW4pOwogCiAJLyogY3JlYXRlIHRoZSB3aW5kb3dzICovCiAJd2luID0gbmV3d2luKHByb21wdF9saW5lcys2LCBwcm9tcHRfd2lkdGgrNywgeSwgeCk7CkBAIC00MDUsNyArNDExLDkgQEAKIAlmaWxsX3dpbmRvdyhwcm9tcHRfd2luLCBwcm9tcHQpOwogCiAJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJSpzIiwgcHJvbXB0X3dpZHRoLCAiICIpOwotCW12d3ByaW50dyhmb3JtX3dpbiwgMCwgMCwgIiVzIiwgcmVzdWx0KTsKKwljdXJzb3JfZm9ybV93aW4gPSBtaW4oY3Vyc29yX3Bvc2l0aW9uLCBwcm9tcHRfd2lkdGgtMSk7CisJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLAorCQkgIHJlc3VsdCArIGN1cnNvcl9wb3NpdGlvbi1jdXJzb3JfZm9ybV93aW4pOwogCiAJLyogY3JlYXRlIHBhbmVscyAqLwogCXBhbmVsID0gbmV3X3BhbmVsKHdpbik7CkBAIC00MzEsNiArNDM5LDggQEAKIAkJCQkJCSZyZXN1bHRbY3Vyc29yX3Bvc2l0aW9uXSwKIAkJCQkJCWxlbi1jdXJzb3JfcG9zaXRpb24rMSk7CiAJCQkJY3Vyc29yX3Bvc2l0aW9uLS07CisJCQkJY3Vyc29yX2Zvcm1fd2luLS07CisJCQkJbGVuLS07CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBLRVlfREM6CkBAIC00MzgsMzggKzQ0OCw2MyBAQAogCQkJCW1lbW1vdmUoJnJlc3VsdFtjdXJzb3JfcG9zaXRpb25dLAogCQkJCQkJJnJlc3VsdFtjdXJzb3JfcG9zaXRpb24rMV0sCiAJCQkJCQlsZW4tY3Vyc29yX3Bvc2l0aW9uKzEpOworCQkJCWxlbi0tOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgS0VZX1VQOgogCQljYXNlIEtFWV9SSUdIVDoKLQkJCWlmIChjdXJzb3JfcG9zaXRpb24gPCBsZW4gJiYKLQkJCSAgICBjdXJzb3JfcG9zaXRpb24gPCBtaW4ocmVzdWx0X2xlbiwgcHJvbXB0X3dpZHRoKSkKKwkJCWlmIChjdXJzb3JfcG9zaXRpb24gPCBsZW4pIHsKIAkJCQljdXJzb3JfcG9zaXRpb24rKzsKKwkJCQljdXJzb3JfZm9ybV93aW4rKzsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIEtFWV9ET1dOOgogCQljYXNlIEtFWV9MRUZUOgotCQkJaWYgKGN1cnNvcl9wb3NpdGlvbiA+IDApCisJCQlpZiAoY3Vyc29yX3Bvc2l0aW9uID4gMCkgewogCQkJCWN1cnNvcl9wb3NpdGlvbi0tOworCQkJCWN1cnNvcl9mb3JtX3dpbi0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgS0VZX0hPTUU6CisJCQljdXJzb3JfcG9zaXRpb24gPSAwOworCQkJY3Vyc29yX2Zvcm1fd2luID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9FTkQ6CisJCQljdXJzb3JfcG9zaXRpb24gPSBsZW47CisJCQljdXJzb3JfZm9ybV93aW4gPSBtaW4oY3Vyc29yX3Bvc2l0aW9uLCBwcm9tcHRfd2lkdGgtMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWlmICgoaXNncmFwaChyZXMpIHx8IGlzc3BhY2UocmVzKSkgJiYKLQkJCQkJbGVuLTIgPCByZXN1bHRfbGVuKSB7CisJCQlpZiAoKGlzZ3JhcGgocmVzKSB8fCBpc3NwYWNlKHJlcykpKSB7CisJCQkJLyogb25lIGZvciBuZXcgY2hhciwgb25lIGZvciAnXDAnICovCisJCQkJaWYgKGxlbisyID4gKnJlc3VsdF9sZW4pIHsKKwkJCQkJKnJlc3VsdF9sZW4gPSBsZW4rMjsKKwkJCQkJKnJlc3VsdHAgPSByZXN1bHQgPSByZWFsbG9jKHJlc3VsdCwKKwkJCQkJCQkJKnJlc3VsdF9sZW4pOworCQkJCX0KIAkJCQkvKiBpbnNlcnQgdGhlIGNoYXIgYXQgdGhlIHByb3BlciBwb3NpdGlvbiAqLwogCQkJCW1lbW1vdmUoJnJlc3VsdFtjdXJzb3JfcG9zaXRpb24rMV0sCiAJCQkJCQkmcmVzdWx0W2N1cnNvcl9wb3NpdGlvbl0sCi0JCQkJCQlsZW4rMSk7CisJCQkJCQlsZW4tY3Vyc29yX3Bvc2l0aW9uKzEpOwogCQkJCXJlc3VsdFtjdXJzb3JfcG9zaXRpb25dID0gcmVzOwogCQkJCWN1cnNvcl9wb3NpdGlvbisrOworCQkJCWN1cnNvcl9mb3JtX3dpbisrOworCQkJCWxlbisrOwogCQkJfSBlbHNlIHsKLQkJCQltdnByaW50dygwLCAwLCAidW5rbm93IGtleTogJWRcbiIsIHJlcyk7CisJCQkJbXZwcmludHcoMCwgMCwgInVua25vd24ga2V5OiAlZFxuIiwgcmVzKTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CisJCWlmIChjdXJzb3JfZm9ybV93aW4gPCAwKQorCQkJY3Vyc29yX2Zvcm1fd2luID0gMDsKKwkJZWxzZSBpZiAoY3Vyc29yX2Zvcm1fd2luID4gcHJvbXB0X3dpZHRoLTEpCisJCQljdXJzb3JfZm9ybV93aW4gPSBwcm9tcHRfd2lkdGgtMTsKKwogCQl3bW92ZShmb3JtX3dpbiwgMCwgMCk7CiAJCXdjbHJ0b2VvbChmb3JtX3dpbik7CiAJCW12d3ByaW50dyhmb3JtX3dpbiwgMCwgMCwgIiUqcyIsIHByb21wdF93aWR0aCwgIiAiKTsKLQkJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLCByZXN1bHQpOwotCQl3bW92ZShmb3JtX3dpbiwgMCwgY3Vyc29yX3Bvc2l0aW9uKTsKKwkJbXZ3cHJpbnR3KGZvcm1fd2luLCAwLCAwLCAiJXMiLAorCQkJcmVzdWx0ICsgY3Vyc29yX3Bvc2l0aW9uLWN1cnNvcl9mb3JtX3dpbik7CisJCXdtb3ZlKGZvcm1fd2luLCAwLCBjdXJzb3JfZm9ybV93aW4pOwogCQl0b3VjaHdpbih3aW4pOwogCQlyZWZyZXNoX2FsbF93aW5kb3dzKG1haW5fd2luZG93KTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmggYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuaAppbmRleCA1OGZiZGE4Li4wZDUyNjE3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuaApAQCAtODksNyArODksNyBAQAogaW50IGJ0bl9kaWFsb2coV0lORE9XICptYWluX3dpbmRvdywgY29uc3QgY2hhciAqbXNnLCBpbnQgYnRuX251bSwgLi4uKTsKIGludCBkaWFsb2dfaW5wdXRib3goV0lORE9XICptYWluX3dpbmRvdywKIAkJY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwKLQkJY29uc3QgY2hhciAqaW5pdCwgY2hhciAqcmVzdWx0LCBpbnQgcmVzdWx0X2xlbik7CisJCWNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKipyZXN1bHRwLCBpbnQgKnJlc3VsdF9sZW4pOwogdm9pZCByZWZyZXNoX2FsbF93aW5kb3dzKFdJTkRPVyAqbWFpbl93aW5kb3cpOwogdm9pZCBzaG93X3Njcm9sbF93aW4oV0lORE9XICptYWluX3dpbmRvdywKIAkJY29uc3QgY2hhciAqdGl0bGUsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwgYi9zY3JpcHRzL2tjb25maWcvc3RyZWFtbGluZV9jb25maWcucGwKaW5kZXggYTRmZTkyMy4uZWM3YWZjZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N0cmVhbWxpbmVfY29uZmlnLnBsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zdHJlYW1saW5lX2NvbmZpZy5wbApAQCAtNDMsNiArNDMsNyBAQAogIyAgICBtYWtlIG9sZGNvbmZpZwogIwogdXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7CiAKIG15ICRjb25maWcgPSAiLmNvbmZpZyI7CiAKQEAgLTExMiwxMCArMTEzLDE3IEBACiAKIGZpbmRfY29uZmlnOwogCisjIFBhcnNlIG9wdGlvbnMKK215ICRsb2NhbG1vZGNvbmZpZyA9IDA7CitteSAkbG9jYWx5ZXNjb25maWcgPSAwOworCitHZXRPcHRpb25zKCJsb2NhbG1vZGNvbmZpZyIgPT4gXCRsb2NhbG1vZGNvbmZpZywKKwkgICAibG9jYWx5ZXNjb25maWciID0+IFwkbG9jYWx5ZXNjb25maWcpOworCiAjIEdldCB0aGUgYnVpbGQgc291cmNlIGFuZCB0b3AgbGV2ZWwgS2NvbmZpZyBmaWxlIChwYXNzZWQgaW4pCiBteSAka3NvdXJjZSA9ICRBUkdWWzBdOwogbXkgJGtjb25maWcgPSAkQVJHVlsxXTsKLW15ICRsc21vZF9maWxlID0gJEFSR1ZbMl07CitteSAkbHNtb2RfZmlsZSA9ICRFTlZ7J0xTTU9EJ307CiAKIG15IEBtYWtlZmlsZXMgPSBgZmluZCAka3NvdXJjZSAtbmFtZSBNYWtlZmlsZSAyPi9kZXYvbnVsbGA7CiBjaG9tcCBAbWFrZWZpbGVzOwpAQCAtMjk2LDcgKzMwNCwxMSBAQAogCiBpZiAoZGVmaW5lZCgkbHNtb2RfZmlsZSkpIHsKICAgICBpZiAoICEgLWYgJGxzbW9kX2ZpbGUpIHsKLQlkaWUgIiRsc21vZF9maWxlIG5vdCBmb3VuZCI7CisJaWYgKCAtZiAkRU5WeydvYmp0cmVlJ30uIi8iLiRsc21vZF9maWxlKSB7CisJICAgICRsc21vZF9maWxlID0gJEVOVnsnb2JqdHJlZSd9LiIvIi4kbHNtb2RfZmlsZTsKKwl9IGVsc2UgeworCQlkaWUgIiRsc21vZF9maWxlIG5vdCBmb3VuZCI7CisJfQogICAgIH0KICAgICBpZiAoIC14ICRsc21vZF9maWxlKSB7CiAJIyB0aGUgZmlsZSBpcyBleGVjdXRhYmxlLCBydW4gaXQKQEAgLTQyMSw3ICs0MzMsMTEgQEAKIAogICAgIGlmICgvXihDT05GSUcuKik9KG18eSkvKSB7CiAJaWYgKGRlZmluZWQoJGNvbmZpZ3N7JDF9KSkgewotCSAgICAkc2V0Y29uZmlnc3skMX0gPSAkMjsKKwkgICAgaWYgKCRsb2NhbHllc2NvbmZpZykgeworCSAgICAgICAgJHNldGNvbmZpZ3N7JDF9ID0gJ3knOworCSAgICB9IGVsc2UgeworCSAgICAgICAgJHNldGNvbmZpZ3N7JDF9ID0gJDI7CisJICAgIH0KIAl9IGVsc2lmICgkMiBlcSAibSIpIHsKIAkgICAgcHJpbnQgIiMgJDEgaXMgbm90IHNldFxuIjsKIAkgICAgbmV4dDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCBhNTA5ZmY4Li4yYmQ1OTRlIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0xODQ5LDYgKzE4NDksMTIgQEAKIAlidWZfcHJpbnRmKGIsICJ9O1xuIik7CiB9CiAKK3N0YXRpYyB2b2lkIGFkZF9pbnRyZWVfZmxhZyhzdHJ1Y3QgYnVmZmVyICpiLCBpbnQgaXNfaW50cmVlKQoreworCWlmIChpc19pbnRyZWUpCisJCWJ1Zl9wcmludGYoYiwgIlxuTU9EVUxFX0lORk8oaW50cmVlLCBcIllcIik7XG4iKTsKK30KKwogc3RhdGljIHZvaWQgYWRkX3N0YWdpbmdfZmxhZyhzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpzdGFnaW5nX2RpciA9ICJkcml2ZXJzL3N0YWdpbmciOwpAQCAtMjE2OSw2ICsyMTc1LDcgQEAKIAkJYnVmLnBvcyA9IDA7CiAKIAkJYWRkX2hlYWRlcigmYnVmLCBtb2QpOworCQlhZGRfaW50cmVlX2ZsYWcoJmJ1ZiwgIWV4dGVybmFsX21vZHVsZSk7CiAJCWFkZF9zdGFnaW5nX2ZsYWcoJmJ1ZiwgbW9kLT5uYW1lKTsKIAkJZXJyIHw9IGFkZF92ZXJzaW9ucygmYnVmLCBtb2QpOwogCQlhZGRfZGVwZW5kcygmYnVmLCBtb2QsIG1vZHVsZXMpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IDc1YzVkMjQuLjM4ZjY2MTcgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTEyOSw3ICsxMjksNyBAQAogCS1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgICAgICAgICAgXAogCS1JIERFRklORV9UUkFDRSxFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0wsRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTCBcCiAJLS1leHRyYT0rZiAtLWMta2luZHM9K3B4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLS1yZWdleC1hc209Jy9eRU5UUllcKChbXildKilcKS4qL1wxLycgICAgICAgICAgICAgICAgICBcCisJLS1yZWdleC1hc209Jy9eKEVOVFJZfF9HTE9CQUwpXCgoW14pXSopXCkuKi9cMi8nICAgICAgICBcCiAJLS1yZWdleC1jPScvXlNZU0NBTExfREVGSU5FW1s6ZGlnaXQ6XV0/XCgoW14sKV0qKS4qL3N5c19cMS8nIFwKIAktLXJlZ2V4LWMrKz0nL15UUkFDRV9FVkVOVFwoKFteLCldKikuKi90cmFjZV9cMS8nCQlcCiAJLS1yZWdleC1jKys9Jy9eREVGSU5FX0VWRU5UXChbXiwpXSosICooW14sKV0qKS4qL3RyYWNlX1wxLycKQEAgLTE1MSw3ICsxNTEsNyBAQAogZW1hY3MoKQogewogCWFsbF9zb3VyY2VzIHwgeGFyZ3MgJDEgLWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS0tcmVnZXg9Jy9eRU5UUlkoXChbXildKlwpKS4qL1wxLycgICAgICAgICAgICAgICAgICAgICAgXAorCS0tcmVnZXg9Jy9eKEVOVFJZfF9HTE9CQUwpKFwoW14pXSpcKSkuKi9cMi8nICAgICAgICAgICAgXAogCS0tcmVnZXg9Jy9eU1lTQ0FMTF9ERUZJTkVbMC05XT8oXChbXiwpXSpcKS4qL3N5c19cMS8nICAgXAogCS0tcmVnZXg9Jy9eVFJBQ0VfRVZFTlQoXChbXiwpXSpcKS4qL3RyYWNlX1wxLycJCVwKIAktLXJlZ2V4PScvXkRFRklORV9FVkVOVChbXiwpXSosICpcKFteLCldKlwpLiovdHJhY2VfXDEvJwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnCmluZGV4IDE5YzA1M2IuLjRmNTU0ZjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZworKysgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL0tjb25maWcKQEAgLTksNyArOSw3IEBACiAJc2VsZWN0IENSWVBUT19ITUFDCiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPX1NIQTEKLQlzZWxlY3QgVENHX1RQTSBpZiAhUzM5MAorCXNlbGVjdCBUQ0dfVFBNIGlmICFTMzkwICYmICFVTUwKIAlzZWxlY3QgVENHX1RJUyBpZiBUQ0dfVFBNCiAJaGVscAogCSAgVGhlIFRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwKFRDRykgcnVudGltZSBJbnRlZ3JpdHkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMgYi9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCmluZGV4IDMzOGI1MTAuLjRjNDhlMTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKKysrIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwpAQCAtMzgsNyArMzgsNyBAQAogCiAJcmV0ID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgX3BheWxvYWRfaW92LCBpb2MsCiAJCQkJCSAgIEFSUkFZX1NJWkUoaW92c3RhY2spLAotCQkJCQkgICBpb3ZzdGFjaywgJmlvdik7CisJCQkJCSAgIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYwppbmRleCBmMzM4MDRjLi5kY2M4NDNjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCS8qIGNvbnZlcnQgdGhlIGhleCBlbmNvZGVkIGl2LCBlbmNyeXB0ZWQtZGF0YSBhbmQgSE1BQyB0byBhc2NpaSAqLwogCWJ1ZnAgPSAmYXNjaWlfYnVmW2xlbl07CiAJZm9yIChpID0gMDsgaSA8IChhc2NpaWJsb2JfbGVuIC0gbGVuKSAvIDI7IGkrKykKLQkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgaXZbaV0pOworCQlidWZwID0gaGV4X2J5dGVfcGFjayhidWZwLCBpdltpXSk7CiBvdXQ6CiAJcmV0dXJuIGFzY2lpX2J1ZjsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCmluZGV4IGVjYTUxOTEuLjBiM2Y1ZDcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJZ290byBub19wYXlsb2FkOwogCiAJcmV0ID0gcndfY29weV9jaGVja191dmVjdG9yKFdSSVRFLCBfcGF5bG9hZF9pb3YsIGlvYywKLQkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKKwkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92LCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3RydXN0ZWQuYyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCmluZGV4IDA5NjRmYzIuLjBlZDVmZGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCisrKyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZC5jCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCiAJYnVmcCA9IGFzY2lpX2J1ZjsKIAlmb3IgKGkgPSAwOyBpIDwgcC0+YmxvYl9sZW47IGkrKykKLQkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgcC0+YmxvYltpXSk7CisJCWJ1ZnAgPSBoZXhfYnl0ZV9wYWNrKGJ1ZnAsIHAtPmJsb2JbaV0pOwogCWlmICgoY29weV90b191c2VyKGJ1ZmZlciwgYXNjaWlfYnVmLCAyICogcC0+YmxvYl9sZW4pKSAhPSAwKSB7CiAJCWtmcmVlKGFzY2lpX2J1Zik7CiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IGU1NDViOWYuLjExMjZjMTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTgwLDYgKzgwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNsb2cuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSAiYXZjLmgiCiAjaW5jbHVkZSAib2Jqc2VjLmgiCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxpbmsuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCmluZGV4IGNlM2Y0ODEuLjE2MWUwMWEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zZWxpbnV4X25ldGxpbmsuaD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uYyBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uYwppbmRleCAxNTA5MTFjLi5jNDdkM2NlIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vY29tbW9uLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jCkBAIC05NjYsNiArOTY2LDkgQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICp0b21veW9fZmluZF9kb21haW5fYnlfcWlkCisodW5zaWduZWQgaW50IHNlcmlhbCk7CisKIC8qKgogICogdG9tb3lvX3NlbGVjdF9kb21haW4gLSBQYXJzZSBzZWxlY3QgY29tbWFuZC4KICAqCkBAIC05OTksNiArMTAwMiw4IEBACiAJfSBlbHNlIGlmICghc3RybmNtcChkYXRhLCAiZG9tYWluPSIsIDcpKSB7CiAJCWlmICh0b21veW9fZG9tYWluX2RlZihkYXRhICsgNykpCiAJCQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW4oZGF0YSArIDcpOworCX0gZWxzZSBpZiAoc3NjYW5mKGRhdGEsICJRPSV1IiwgJnBpZCkgPT0gMSkgeworCQlkb21haW4gPSB0b21veW9fZmluZF9kb21haW5fYnlfcWlkKHBpZCk7CiAJfSBlbHNlCiAJCXJldHVybiBmYWxzZTsKIAloZWFkLT53LmRvbWFpbiA9IGRvbWFpbjsKQEAgLTE4OTQsNiArMTg5OSw3IEBACiAvKiBTdHJ1Y3R1cmUgZm9yIHF1ZXJ5LiAqLwogc3RydWN0IHRvbW95b19xdWVyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbjsKIAljaGFyICpxdWVyeTsKIAlzaXplX3QgcXVlcnlfbGVuOwogCXVuc2lnbmVkIGludCBzZXJpYWw7CkBAIC0yMDQ0LDYgKzIwNTAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJbGVuID0gdG9tb3lvX3JvdW5kMihlbnRyeS5xdWVyeV9sZW4pOworCWVudHJ5LmRvbWFpbiA9IHItPmRvbWFpbjsKIAlzcGluX2xvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOwogCWlmICh0b21veW9fbWVtb3J5X3F1b3RhW1RPTU9ZT19NRU1PUllfUVVFUlldICYmCiAJICAgIHRvbW95b19tZW1vcnlfdXNlZFtUT01PWU9fTUVNT1JZX1FVRVJZXSArIGxlbgpAQCAtMjA5MSw2ICsyMDk4LDI5IEBACiB9CiAKIC8qKgorICogdG9tb3lvX2ZpbmRfZG9tYWluX2J5X3FpZCAtIEdldCBkb21haW4gYnkgcXVlcnkgaWQuCisgKgorICogQHNlcmlhbDogUXVlcnkgSUQgYXNzaWduZWQgYnkgdG9tb3lvX3N1cGVydmlzb3IoKS4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKnRvbW95b19maW5kX2RvbWFpbl9ieV9xaWQKKyh1bnNpZ25lZCBpbnQgc2VyaWFsKQoreworCXN0cnVjdCB0b21veW9fcXVlcnkgKnB0cjsKKwlzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4gPSBOVUxMOworCXNwaW5fbG9jaygmdG9tb3lvX3F1ZXJ5X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwdHIsICZ0b21veW9fcXVlcnlfbGlzdCwgbGlzdCkgeworCQlpZiAocHRyLT5zZXJpYWwgIT0gc2VyaWFsIHx8IHB0ci0+YW5zd2VyKQorCQkJY29udGludWU7CisJCWRvbWFpbiA9IHB0ci0+ZG9tYWluOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnRvbW95b19xdWVyeV9saXN0X2xvY2spOworCXJldHVybiBkb21haW47Cit9CisKKy8qKgogICogdG9tb3lvX3BvbGxfcXVlcnkgLSBwb2xsKCkgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9xdWVyeS4KICAqCiAgKiBAZmlsZTogUG9pbnRlciB0byAic3RydWN0IGZpbGUiLgpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggMWZlZjE0MS4uMjYxYTAzYyAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAKIHNvdXJjZSAic291bmQvb3NzL2RtYXNvdW5kL0tjb25maWciCiAKLWlmICFNNjhLCitpZiAhTTY4SyAmJiAhVU1MCiAKIG1lbnVjb25maWcgU05ECiAJdHJpc3RhdGUgIkFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSIKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKaW5kZXggMzY4N2E2Yy4uNzYyYWY2OCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy9vbnl4LmMKQEAgLTEwNjcsNyArMTA2Nyw2IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJjcmVhdGVkIGFuZCBhdHRhY2hlZCBvbnl4IGluc3RhbmNlXG4iKTsKIAlyZXR1cm4gMDsKICBmYWlsOgotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwogCWtmcmVlKG9ueXgpOwogCXJldHVybiAtRU5PREVWOwogfQpAQCAtMTExMiw4ICsxMTExLDcgQEAKIAogCWFvYV9jb2RlY191bnJlZ2lzdGVyKCZvbnl4LT5jb2RlYyk7CiAJb2Zfbm9kZV9wdXQob255eC0+Y29kZWMubm9kZSk7Ci0JaWYgKG9ueXgtPmNvZGVjX2luZm8pCi0JCWtmcmVlKG9ueXgtPmNvZGVjX2luZm8pOworCWtmcmVlKG9ueXgtPmNvZGVjX2luZm8pOwogCWtmcmVlKG9ueXgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9wY20uYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvcGNtLmMKaW5kZXggYmU4Mzg5OS4uMTk0OTFlZCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9wY20uYworKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL3BjbS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL3NvdW5kYnVzLmgiCiAjaW5jbHVkZSAiaTJzYnVzLmgiCiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9hYWNpLmMgYi9zb3VuZC9hcm0vYWFjaS5jCmluZGV4IGQwY2VhZDMuLmU1MThkMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9hYWNpLmMKKysrIGIvc291bmQvYXJtL2FhY2kuYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJbXV0ZXhfbG9jaygmYWFjaS0+aXJxX2xvY2spOwogCWlmICghYWFjaS0+dXNlcnMrKykgewogCQlyZXQgPSByZXF1ZXN0X2lycShhYWNpLT5kZXYtPmlycVswXSwgYWFjaV9pcnEsCi0JCQkgICBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsIERSSVZFUl9OQU1FLCBhYWNpKTsKKwkJCSAgIElSUUZfU0hBUkVELCBEUklWRVJfTkFNRSwgYWFjaSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWFhY2ktPnVzZXJzLS07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCmluZGV4IDg4ZWVjMzguLmQxYWE0MjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KQEAgLTM1OSw3ICszNjAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2NsazI7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShJUlFfQUM5NywgcHhhMnh4X2FjOTdfaXJxLCBJUlFGX0RJU0FCTEVELCAiQUM5NyIsIE5VTEwpOworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIDAsICJBQzk3IiwgTlVMTCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2lycTsKIApkaWZmIC0tZ2l0IGEvc291bmQvYXJtL3B4YTJ4eC1wY20uYyBiL3NvdW5kL2FybS9weGEyeHgtcGNtLmMKaW5kZXggNTM1NzA0Zi4uMjY0MjJhMyAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3B4YTJ4eC1wY20uYworKysgYi9zb3VuZC9hcm0vcHhhMnh4LXBjbS5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3B4YTJ4eC1saWIuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCBmOGM1YmU0Li44MTlhNWM1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbnRyb2wuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtOTg5LDcgKzk5MCw2IEBACiAJdm9pZCAqdGx2X2RhdGE7CQkJLyogVExWIGRhdGEgKi8KIAl1bnNpZ25lZCBsb25nIHRsdl9kYXRhX3NpemU7CS8qIFRMViBkYXRhIHNpemUgKi8KIAl2b2lkICpwcml2X2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgKGxpa2Ugc3RyaW5ncyBmb3IgZW51bWVyYXRlZCB0eXBlKSAqLwotCXVuc2lnbmVkIGxvbmcgcHJpdl9kYXRhX3NpemU7CS8qIHNpemUgb2YgcHJpdmF0ZSBkYXRhIGluIGJ5dGVzICovCiB9OwogCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV91c2VyX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC0xMDAxLDYgKzEwMDEsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbmRfY3RsX2VsZW1fdXNlcl9lbnVtX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzZXJfZWxlbWVudCAqdWUgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IGNoYXIgKm5hbWVzOworCXVuc2lnbmVkIGludCBpdGVtOworCisJaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW07CisKKwkqdWluZm8gPSB1ZS0+aW5mbzsKKworCWl0ZW0gPSBtaW4oaXRlbSwgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgLSAxKTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gaXRlbTsKKworCW5hbWVzID0gdWUtPnByaXZfZGF0YTsKKwlmb3IgKDsgaXRlbSA+IDA7IC0taXRlbSkKKwkJbmFtZXMgKz0gc3RybGVuKG5hbWVzKSArIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIG5hbWVzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV91c2VyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMDU1LDExICsxMDc3LDQ2IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorc3RhdGljIGludCBzbmRfY3RsX2VsZW1faW5pdF9lbnVtX25hbWVzKHN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlKQoreworCWNoYXIgKm5hbWVzLCAqcDsKKwlzaXplX3QgYnVmX2xlbiwgbmFtZV9sZW47CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgdWludHB0cl90IHVzZXJfcHRydmFsID0gdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19wdHI7CisKKwlpZiAodWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGggPiA2NCAqIDEwMjQpCisJCXJldHVybiAtRUlOVkFMOworCisJbmFtZXMgPSBtZW1kdXBfdXNlcigoY29uc3Qgdm9pZCBfX3VzZXIgKil1c2VyX3B0cnZhbCwKKwkJdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGgpOworCWlmIChJU19FUlIobmFtZXMpKQorCQlyZXR1cm4gUFRSX0VSUihuYW1lcyk7CisKKwkvKiBjaGVjayB0aGF0IHRoZXJlIGFyZSBlbm91Z2ggdmFsaWQgbmFtZXMgKi8KKwlidWZfbGVuID0gdWUtPmluZm8udmFsdWUuZW51bWVyYXRlZC5uYW1lc19sZW5ndGg7CisJcCA9IG5hbWVzOworCWZvciAoaSA9IDA7IGkgPCB1ZS0+aW5mby52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zOyArK2kpIHsKKwkJbmFtZV9sZW4gPSBzdHJubGVuKHAsIGJ1Zl9sZW4pOworCQlpZiAobmFtZV9sZW4gPT0gMCB8fCBuYW1lX2xlbiA+PSA2NCB8fCBuYW1lX2xlbiA9PSBidWZfbGVuKSB7CisJCQlrZnJlZShuYW1lcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwICs9IG5hbWVfbGVuICsgMTsKKwkJYnVmX2xlbiAtPSBuYW1lX2xlbiArIDE7CisJfQorCisJdWUtPnByaXZfZGF0YSA9IG5hbWVzOworCXVlLT5pbmZvLnZhbHVlLmVudW1lcmF0ZWQubmFtZXNfcHRyID0gMDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQlpZiAodWUtPnRsdl9kYXRhKQotCQlrZnJlZSh1ZS0+dGx2X2RhdGEpOworCisJa2ZyZWUodWUtPnRsdl9kYXRhKTsKKwlrZnJlZSh1ZS0+cHJpdl9kYXRhKTsKIAlrZnJlZSh1ZSk7CiB9CiAKQEAgLTEwNzIsOCArMTEyOSw4IEBACiAJbG9uZyBwcml2YXRlX3NpemU7CiAJc3RydWN0IHVzZXJfZWxlbWVudCAqdWU7CiAJaW50IGlkeCwgZXJyOwotCQotCWlmIChjYXJkLT51c2VyX2N0bF9jb3VudCA+PSBNQVhfVVNFUl9DT05UUk9MUykKKworCWlmICghcmVwbGFjZSAmJiBjYXJkLT51c2VyX2N0bF9jb3VudCA+PSBNQVhfVVNFUl9DT05UUk9MUykKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGluZm8tPmNvdW50IDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTAxLDcgKzExNTgsMTAgQEAKIAltZW1jcHkoJmtjdGwuaWQsICZpbmZvLT5pZCwgc2l6ZW9mKGluZm8tPmlkKSk7CiAJa2N0bC5jb3VudCA9IGluZm8tPm93bmVyID8gaW5mby0+b3duZXIgOiAxOwogCWFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVVNFUjsKLQlrY3RsLmluZm8gPSBzbmRfY3RsX2VsZW1fdXNlcl9pbmZvOworCWlmIChpbmZvLT50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkKKwkJa2N0bC5pbmZvID0gc25kX2N0bF9lbGVtX3VzZXJfZW51bV9pbmZvOworCWVsc2UKKwkJa2N0bC5pbmZvID0gc25kX2N0bF9lbGVtX3VzZXJfaW5mbzsKIAlpZiAoYWNjZXNzICYgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQpCiAJCWtjdGwuZ2V0ID0gc25kX2N0bF9lbGVtX3VzZXJfZ2V0OwogCWlmIChhY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUpCkBAIC0xMTIyLDYgKzExODIsMTEgQEAKIAkJaWYgKGluZm8tPmNvdW50ID4gNjQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ6CisJCXByaXZhdGVfc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCQlpZiAoaW5mby0+Y291bnQgPiAxMjggfHwgaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCWNhc2UgU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzoKIAkJcHJpdmF0ZV9zaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwogCQlpZiAoaW5mby0+Y291bnQgPiA1MTIpCkBAIC0xMTQzLDkgKzEyMDgsMTcgQEAKIAl1ZS0+aW5mby5hY2Nlc3MgPSAwOwogCXVlLT5lbGVtX2RhdGEgPSAoY2hhciAqKXVlICsgc2l6ZW9mKCp1ZSk7CiAJdWUtPmVsZW1fZGF0YV9zaXplID0gcHJpdmF0ZV9zaXplOworCWlmICh1ZS0+aW5mby50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkgeworCQllcnIgPSBzbmRfY3RsX2VsZW1faW5pdF9lbnVtX25hbWVzKHVlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKHVlKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CiAJa2N0bC5wcml2YXRlX2ZyZWUgPSBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlOwogCV9rY3RsID0gc25kX2N0bF9uZXcoJmtjdGwsIGFjY2Vzcyk7CiAJaWYgKF9rY3RsID09IE5VTEwpIHsKKwkJa2ZyZWUodWUtPnByaXZfZGF0YSk7CiAJCWtmcmVlKHVlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jIGIvc291bmQvY29yZS9jb250cm9sX2NvbXBhdC5jCmluZGV4IDQyNjg3NDQuLjJiYjk1YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbF9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2xfY29tcGF0LmMKQEAgLTgzLDYgKzgzLDggQEAKIAkJCXUzMiBpdGVtczsKIAkJCXUzMiBpdGVtOwogCQkJY2hhciBuYW1lWzY0XTsKKwkJCXU2NCBuYW1lc19wdHI7CisJCQl1MzIgbmFtZXNfbGVuZ3RoOwogCQl9IGVudW1lcmF0ZWQ7CiAJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTI4XTsKIAl9IHZhbHVlOwpAQCAtMzcyLDYgKzM3NCw4IEBACiAJCQkJICAgJmRhdGEzMi0+dmFsdWUuZW51bWVyYXRlZCwKIAkJCQkgICBzaXplb2YoZGF0YS0+dmFsdWUuZW51bWVyYXRlZCkpKQogCQkJZ290byBlcnJvcjsKKwkJZGF0YS0+dmFsdWUuZW51bWVyYXRlZC5uYW1lc19wdHIgPQorCQkJKHVpbnRwdHJfdCljb21wYXRfcHRyKGRhdGEtPnZhbHVlLmVudW1lcmF0ZWQubmFtZXNfcHRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2RldmljZS5jIGIvc291bmQvY29yZS9kZXZpY2UuYwppbmRleCAyZDFhZDRiMC4uZjAzY2I1NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggYTcwZWU3Zi4uNzVlYTE2ZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgpAQCAtMjcyLDcgKzI3MywxNCBAQAogCQkJaWYgKGdldF91c2VyKGRldmljZSwgKGludCBfX3VzZXIgKilhcmcpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCQkJZGV2aWNlID0gZGV2aWNlIDwgMCA/IDAgOiBkZXZpY2UgKyAxOworCisJCQlpZiAoZGV2aWNlIDwgMCkKKwkJCQlkZXZpY2UgPSAwOworCQkJZWxzZSBpZiAoZGV2aWNlIDwgU05EUlZfTUlOT1JfSFdERVBTKQorCQkJCWRldmljZSsrOworCQkJZWxzZQorCQkJCWRldmljZSA9IFNORFJWX01JTk9SX0hXREVQUzsKKwogCQkJd2hpbGUgKGRldmljZSA8IFNORFJWX01JTk9SX0hXREVQUykgewogCQkJCWlmIChzbmRfaHdkZXBfc2VhcmNoKGNhcmQsIGRldmljZSkpCiAJCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbmZvLmMgYi9zb3VuZC9jb3JlL2luZm8uYwppbmRleCA2MDFmMGViLi5jMWU2MTFjIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luZm8uYworKysgYi9zb3VuZC9jb3JlL2luZm8uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luZm9fb3NzLmMgYi9zb3VuZC9jb3JlL2luZm9fb3NzLmMKaW5kZXggZTRhZjEzOC4uY2Y0MmFiNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvaW5mb19vc3MuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5pdC5jIGIvc291bmQvY29yZS9pbml0LmMKaW5kZXggMmMwNDFiYi4uM2FjNDliMSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pc2FkbWEuYyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKaW5kZXggOTUwZTE5Yi4uYzBmMTIwOCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pc2FkbWEuYworKysgYi9zb3VuZC9jb3JlL2lzYWRtYS5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICN1bmRlZiBIQVZFX1JFQUxMWV9TTE9XX0RNQV9DT05UUk9MTEVSCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2phY2suYyBiL3NvdW5kL2NvcmUvamFjay5jCmluZGV4IDUzYjUzZTkuLjI2ZWRmNjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvamFjay5jCisrKyBiL3NvdW5kL2NvcmUvamFjay5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCkBAIC0zMCw2ICszMSw3IEBACiAJU1dfTElORU9VVF9JTlNFUlQsCiAJU1dfSkFDS19QSFlTSUNBTF9JTlNFUlQsCiAJU1dfVklERU9PVVRfSU5TRVJULAorCVNXX0xJTkVJTl9JTlNFUlQsCiB9OwogCiBzdGF0aWMgaW50IHNuZF9qYWNrX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL21lbW9yeS5jIGIvc291bmQvY29yZS9tZW1vcnkuYwppbmRleCAxMTYxMTU4Li42NmEyNzhkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL21lbW9yeS5jCisrKyBiL3NvdW5kL2NvcmUvbWVtb3J5LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9taXNjLmMgYi9zb3VuZC9jb3JlL21pc2MuYwppbmRleCBlYjlmZTJlLi40NjVmMGNlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL21pc2MuYworKysgYi9zb3VuZC9jb3JlL21pc2MuYwpAQCAtMjAsNiArMjAsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwppbmRleCBkODM1OWNmLi4xODI5N2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTQ5OSw3ICs1MDAsNyBAQAogCQogCW1lbXNldCgmaWQsIDAsIHNpemVvZihpZCkpOwogCWlkLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7Ci0Jc3RyY3B5KGlkLm5hbWUsIG5hbWUpOworCXN0cmxjcHkoaWQubmFtZSwgbmFtZSwgc2l6ZW9mKGlkLm5hbWUpKTsKIAlpZC5pbmRleCA9IGluZGV4OwogCXJldHVybiBzbmRfY3RsX2ZpbmRfaWQoY2FyZCwgJmlkKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwppbmRleCAyM2MzNGEwLi4zY2M0Yjg2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKKysrIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCBlZTlhYmIyLi44OTI4Y2E4NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY20uYworKysgYi9zb3VuZC9jb3JlL3BjbS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggNjJlOTBiOC4uMzQyMGJkMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpAQCAtMTM5OSw2ICsxNDAwLDMyIEBACiAKIEVYUE9SVF9TWU1CT0woc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIpOwogCitzdGF0aWMgaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlX2Z1bmMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCit7CisJdW5zaWduZWQgaW50IGJhc2VfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdClydWxlLT5wcml2YXRlOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGU7CisKKwlyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KHJhdGUsIDEsICZiYXNlX3JhdGUsIDApOworfQorCisvKioKKyAqIHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlIC0gYWRkIGEgcnVsZSB0byBhbGxvdyBkaXNhYmxpbmcgaHcgcmVzYW1wbGluZworICogQHJ1bnRpbWU6IFBDTSBydW50aW1lIGluc3RhbmNlCisgKiBAYmFzZV9yYXRlOiB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgaGFyZHdhcmUgZG9lcyBub3QgcmVzYW1wbGUKKyAqLworaW50IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhc2VfcmF0ZSkKK3sKKwlyZXR1cm4gc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1TX05PUkVTQU1QTEUsCisJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGVfZnVuYywKKwkJCQkgICAodm9pZCAqKSh1aW50cHRyX3QpYmFzZV9yYXRlLAorCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKTsKKwogc3RhdGljIHZvaWQgX3NuZF9wY21faHdfcGFyYW1fYW55KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhcikKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKaW5kZXggMTUwY2I3ZS4uOTU3MTMxMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX21pc2MuYyBiL3NvdW5kL2NvcmUvcGNtX21pc2MuYwppbmRleCA4OGYwMmUzLi45YzllZmY5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9taXNjLmMKKysrIGIvc291bmQvY29yZS9wY21fbWlzYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KICAgCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNkZWZpbmUgU05EX1BDTV9GT1JNQVRfVU5LTk9XTiAoLTEpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IGM3NGUyMjguLjI1ZWQ5ZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC0yMDU4LDE2ICsyMDU5LDEyIEBACiAKIHN0YXRpYyBpbnQgc25kX3BjbV9vcGVuX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtICpwY20sCi0JCQkgICAgIGludCBzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2ZpbGUgKipycGNtX2ZpbGUpCisJCQkgICAgIGludCBzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fZmlsZSAqcGNtX2ZpbGU7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJaW50IGVycjsKIAotCWlmIChycGNtX2ZpbGUpCi0JCSpycGNtX2ZpbGUgPSBOVUxMOwotCiAJZXJyID0gc25kX3BjbV9vcGVuX3N1YnN0cmVhbShwY20sIHN0cmVhbSwgZmlsZSwgJnN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC0yMDgzLDggKzIwODAsNyBAQAogCQlzdWJzdHJlYW0tPnBjbV9yZWxlYXNlID0gcGNtX3JlbGVhc2VfcHJpdmF0ZTsKIAl9CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGNtX2ZpbGU7Ci0JaWYgKHJwY21fZmlsZSkKLQkJKnJwY21fZmlsZSA9IHBjbV9maWxlOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMTMsNyArMjEwOSw2IEBACiBzdGF0aWMgaW50IHNuZF9wY21fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBzbmRfcGNtX2ZpbGUgKnBjbV9maWxlOwogCXdhaXRfcXVldWVfdCB3YWl0OwogCiAJaWYgKHBjbSA9PSBOVUxMKSB7CkBAIC0yMTMxLDcgKzIxMjYsNyBAQAogCWFkZF93YWl0X3F1ZXVlKCZwY20tPm9wZW5fd2FpdCwgJndhaXQpOwogCW11dGV4X2xvY2soJnBjbS0+b3Blbl9tdXRleCk7CiAJd2hpbGUgKDEpIHsKLQkJZXJyID0gc25kX3BjbV9vcGVuX2ZpbGUoZmlsZSwgcGNtLCBzdHJlYW0sICZwY21fZmlsZSk7CisJCWVyciA9IHNuZF9wY21fb3Blbl9maWxlKGZpbGUsIHBjbSwgc3RyZWFtKTsKIAkJaWYgKGVyciA+PSAwKQogCQkJYnJlYWs7CiAJCWlmIChlcnIgPT0gLUVBR0FJTikgewpAQCAtMzE1Niw4ICszMTUxLDggQEAKIC8qCiAgKiBtbWFwIHRoZSBETUEgYnVmZmVyIG9uIFJBTQogICovCi1zdGF0aWMgaW50IHNuZF9wY21fZGVmYXVsdF9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK2ludCBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKIHsKIAlhcmVhLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKICNpZmRlZiBBUkNIX0hBU19ETUFfTU1BUF9DT0hFUkVOVApAQCAtMzE3Nyw2ICszMTcyLDcgQEAKIAlhcmVhLT52bV9vcHMgPSAmc25kX3BjbV92bV9vcHNfZGF0YV9mYXVsdDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcCk7CiAKIC8qCiAgKiBtbWFwIHRoZSBETUEgYnVmZmVyIG9uIEkvTyBtZW1vcnkgYXJlYQpAQCAtMzI0Miw3ICszMjM4LDcgQEAKIAlpZiAoc3Vic3RyZWFtLT5vcHMtPm1tYXApCiAJCWVyciA9IHN1YnN0cmVhbS0+b3BzLT5tbWFwKHN1YnN0cmVhbSwgYXJlYSk7CiAJZWxzZQotCQllcnIgPSBzbmRfcGNtX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIGFyZWEpOworCQllcnIgPSBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKIAlpZiAoIWVycikKIAkJYXRvbWljX2luYygmc3Vic3RyZWFtLT5tbWFwX2NvdW50KTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9yYXdtaWRpLmMgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwppbmRleCA4NDlhMGVkLi5lYmY2ZTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3Jhd21pZGkuYworKysgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCmluZGV4IGExZjFhMmYuLjhkNGQ1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYwpAQCAtMjEsNyArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwppbmRleCA2OWNkN2IzLi5lM2NiNDZmIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAic2VxX29zc190aW1lci5oIgogI2luY2x1ZGUgInNlcV9vc3NfZXZlbnQuaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCmluZGV4IGVlNDRhYjkuLmM1Yjc3M2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInNlcV9vc3NfbWlkaS5oIgogI2luY2x1ZGUgIi4uL3NlcV9sb2NrLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcS5jIGIvc291bmQvY29yZS9zZXEvc2VxLmMKaW5kZXggMTE5ZmRkYjYuLjlkODM3OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcS5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCBmMjQzNmQzLi40ZGM2YmFlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCmluZGV4IDFmOTk3NjcuLjVjZjhkNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwppbmRleCAxZDdkOTBjLi5iOWIyMjM1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJzZXFfY2xpZW50bWdyLmgiCiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2luZm8uYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9pbmZvLmMKaW5kZXggMjAxZjgxMC4uYWNmNzc2OSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2luZm8uYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfaW5mby5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAKICNpbmNsdWRlICJzZXFfaW5mby5oIgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKaW5kZXggNTRmOTIxZS4uMmNmZTUwYyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAic2VxX2xvY2suaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCmluZGV4IDdmNTBjMTQuLmY0NzhmNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKaW5kZXggZWJhZjFiNS4uNjQwNjlkYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9lbXVsLmMKaW5kZXggMDdjNjYzMS4uNmY2NDQ3MSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZW11bC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2VtdWwuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9rZXJuZWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zZXFfbWlkaV9lbXVsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9ldmVudC5jIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGlfZXZlbnQuYwppbmRleCBiNWQ2ZWE0Li4zN2RiN2JhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaV9ldmVudC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpX2V2ZW50LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2tlcm5lbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9taWRpX2V2ZW50Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcG9ydHMuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCmluZGV4IGUxMmJjZDkuLjk1MTZlNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInNlcV9zeXN0ZW0uaCIKICNpbmNsdWRlICJzZXFfcG9ydHMuaCIKICNpbmNsdWRlICJzZXFfY2xpZW50bWdyLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfc3lzdGVtLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfc3lzdGVtLmMKaW5kZXggYzM4YjkwYy4uOGNlMWQwYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3N5c3RlbS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9zeXN0ZW0uYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJzZXFfc3lzdGVtLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwppbmRleCA4NmU3NzM5Li40YjUwZTYwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NvdW5kLmMgYi9zb3VuZC9jb3JlL3NvdW5kLmMKaW5kZXggMWM3YTNlZi4uODI4YWYzNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZC5jCisrKyBiL3NvdW5kL2NvcmUvc291bmQuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvbWlub3JzLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggMGMxNjRlNS4uYzcwMDkyMCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdGltZXIuYyBiL3NvdW5kL2NvcmUvdGltZXIuYwppbmRleCA2N2ViZjFjLi44ZTc1NjFkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3RpbWVyLmMKKysrIGIvc291bmQvY29yZS90aW1lci5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3ZtYXN0ZXIuYyBiL3NvdW5kL2NvcmUvdm1hc3Rlci5jCmluZGV4IGEzOWQzZDguLjEzMGNmZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdm1hc3Rlci5jCisrKyBiL3NvdW5kL2NvcmUvdm1hc3Rlci5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgpAQCAtNTEsNiArNTIsNyBAQAogCXN0cnVjdCBsaW5rX2N0bF9pbmZvIGluZm87CiAJaW50IHZhbHNbMl07CQkvKiBjdXJyZW50IHZhbHVlcyAqLwogCXVuc2lnbmVkIGludCBmbGFnczsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOyAvKiBvcmlnaW5hbCBrY29udHJvbCBwb2ludGVyICovCiAJc3RydWN0IHNuZF9rY29udHJvbCBzbGF2ZTsgLyogdGhlIGNvcHkgb2Ygb3JpZ2luYWwgY29udHJvbCBlbnRyeSAqLwogfTsKIApAQCAtMjUxLDYgKzI1Myw3IEBACiAJCSAgICAgICBzbGF2ZS0+Y291bnQgKiBzaXplb2YoKnNsYXZlLT52ZCksIEdGUF9LRVJORUwpOwogCWlmICghc3JlYykKIAkJcmV0dXJuIC1FTk9NRU07CisJc3JlYy0+a2N0bCA9IHNsYXZlOwogCXNyZWMtPnNsYXZlID0gKnNsYXZlOwogCW1lbWNweShzcmVjLT5zbGF2ZS52ZCwgc2xhdmUtPnZkLCBzbGF2ZS0+Y291bnQgKiBzaXplb2YoKnNsYXZlLT52ZCkpOwogCXNyZWMtPm1hc3RlciA9IG1hc3Rlcl9saW5rOwpAQCAtMzMyLDEwICszMzUsMTggQEAKIHN0YXRpYyB2b2lkIG1hc3Rlcl9mcmVlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQogewogCXN0cnVjdCBsaW5rX21hc3RlciAqbWFzdGVyID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBsaW5rX3NsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgbGlua19zbGF2ZSAqc2xhdmUsICpuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzbGF2ZSwgJm1hc3Rlci0+c2xhdmVzLCBsaXN0KQotCQlzbGF2ZS0+bWFzdGVyID0gTlVMTDsKKwkvKiBmcmVlIGFsbCBzbGF2ZSBsaW5rcyBhbmQgcmV0b3JlIHRoZSBvcmlnaW5hbCBzbGF2ZSBrY3RscyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgbiwgJm1hc3Rlci0+c2xhdmVzLCBsaXN0KSB7CisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnNjdGwgPSBzbGF2ZS0+a2N0bDsKKwkJc3RydWN0IGxpc3RfaGVhZCBvbGlzdCA9IHNjdGwtPmxpc3Q7CisJCW1lbWNweShzY3RsLCAmc2xhdmUtPnNsYXZlLCBzaXplb2YoKnNjdGwpKTsKKwkJbWVtY3B5KHNjdGwtPnZkLCBzbGF2ZS0+c2xhdmUudmQsCisJCSAgICAgICBzY3RsLT5jb3VudCAqIHNpemVvZigqc2N0bC0+dmQpKTsKKwkJc2N0bC0+bGlzdCA9IG9saXN0OyAvKiBrZWVwIHRoZSBjdXJyZW50IGxpbmtlZC1saXN0ICovCisJCWtmcmVlKHNsYXZlKTsKKwl9CiAJa2ZyZWUobWFzdGVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9hbG9vcC5jIGIvc291bmQvZHJpdmVycy9hbG9vcC5jCmluZGV4IGEwZGE3NzUuLmQ4M2JhZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvYWxvb3AuYworKysgYi9zb3VuZC9kcml2ZXJzL2Fsb29wLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC01NzUsNyArNTc1LDggQEAKIHN0YXRpYyBpbnQgbG9vcGJhY2tfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJcmV0dXJuIHNuZF9wY21fbGliX2FsbG9jX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVhbSwKKwkJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CiB9CiAKIHN0YXRpYyBpbnQgbG9vcGJhY2tfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCW11dGV4X2xvY2soJmRwY20tPmxvb3BiYWNrLT5jYWJsZV9sb2NrKTsKIAljYWJsZS0+dmFsaWQgJj0gfigxIDw8IHN1YnN0cmVhbS0+c3RyZWFtKTsKIAltdXRleF91bmxvY2soJmRwY20tPmxvb3BiYWNrLT5jYWJsZV9sb2NrKTsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVhbSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2NhYmxlX2luZGV4KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtNzQwLDYgKzc0MSw4IEBACiAJLnByZXBhcmUgPQlsb29wYmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JbG9vcGJhY2tfdHJpZ2dlciwKIAkucG9pbnRlciA9CWxvb3BiYWNrX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGxvb3BiYWNrX2NhcHR1cmVfb3BzID0gewpAQCAtNzUxLDYgKzc1NCw4IEBACiAJLnByZXBhcmUgPQlsb29wYmFja19wcmVwYXJlLAogCS50cmlnZ2VyID0JbG9vcGJhY2tfdHJpZ2dlciwKIAkucG9pbnRlciA9CWxvb3BiYWNrX3BvaW50ZXIsCisJLnBhZ2UgPQkJc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKKwkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBsb29wYmFja19wY21fbmV3KHN0cnVjdCBsb29wYmFjayAqbG9vcGJhY2ssCkBAIC03NzEsMTAgKzc3Niw2IEBACiAJc3RyY3B5KHBjbS0+bmFtZSwgIkxvb3BiYWNrIFBDTSIpOwogCiAJbG9vcGJhY2stPnBjbVtkZXZpY2VdID0gcGNtOwotCi0Jc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfS0VSTkVMKSwKLQkJCTAsIDIgKiAxMDI0ICogMTAyNCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYyBiL3NvdW5kL2RyaXZlcnMvZHVtbXkuYwppbmRleCA3ZjQxOTkwLi45N2YxZjkzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL2R1bW15LmMKKysrIGIvc291bmQvZHJpdmVycy9kdW1teS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jIGIvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYwppbmRleCA1Y2ZjYjkwLi4yZWU4MmM1IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAkJICAgIjB4JXggZG9uZVxuIiwgKHVuc2lnbmVkIGludCltbDQwM19hYzk3Y3ItPnBvcnQpOwogCS8qIGdldCBpcnEgKi8KIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBmZGV2LCAwKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgMCwKIAkJCWRldl9uYW1lKCZwZmRldi0+ZGV2KSwgKHZvaWQgKiltbDQwM19hYzk3Y3IpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU05EX01MNDAzX0FDOTdDUl9EUklWRVIgIjogIgogCQkJICAgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwKQEAgLTExNjYsNyArMTE2Niw3IEBACiAJCSAgICJyZXF1ZXN0IChwbGF5YmFjaykgaXJxICVkIGRvbmVcbiIsCiAJCSAgIG1sNDAzX2FjOTdjci0+aXJxKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBmZGV2LCAxKTsKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbWw0MDNfYWM5N2NyX2lycSwgMCwKIAkJCWRldl9uYW1lKCZwZmRldi0+ZGV2KSwgKHZvaWQgKiltbDQwM19hYzk3Y3IpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU05EX01MNDAzX0FDOTdDUl9EUklWRVIgIjogIgogCQkJICAgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggMTQ5ZDA1YS4uMjU3NTY5MCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC04Niw4ICs4Niw3IEBACiAJfQogCiAJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLCBwb3J0W2Rldl0sIDAsCi0JCQkJICBpcnFbZGV2XSwgaXJxW2Rldl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAotCQkJCSAgTlVMTCk7CisJCQkJICBpcnFbZGV2XSwgTlVMTCk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNUFU0MDEgbm90IGRldGVjdGVkIGF0IDB4JWx4XG4iLCBwb3J0W2Rldl0pOwogCQlnb3RvIF9lcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxX3VhcnQuYwppbmRleCAyYWYwOTk5Li4xY2ZmMzMxIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMV91YXJ0LmMKQEAgLTMsNyArMyw3IEBACiAgKiAgUm91dGluZXMgZm9yIGNvbnRyb2wgb2YgTVBVLTQwMSBpbiBVQVJUIG1vZGUKICAqCiAgKiAgTVBVLTQwMSBzdXBwb3J0cyBVQVJUIG1vZGUgd2hpY2ggaXMgbm90IGNhcGFibGUgZ2VuZXJhdGUgdHJhbnNtaXQKLSAqICBpbnRlcnJ1cHRzIHRodXMgb3V0cHV0IGlzIGRvbmUgdmlhIHBvbGxpbmcuIEFsc28sIGlmIGlycSA8IDAsIHRoZW4KKyAqICBpbnRlcnJ1cHRzIHRodXMgb3V0cHV0IGlzIGRvbmUgdmlhIHBvbGxpbmcuIFdpdGhvdXQgaW50ZXJydXB0LAogICogIGlucHV0IGlzIGRvbmUgYWxzbyB2aWEgcG9sbGluZy4gRG8gbm90IGV4cGVjdCBnb29kIHBlcmZvcm1hbmNlLgogICoKICAqCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTM3NCw3ICszNzUsNyBAQAogCQkJLyogZmlyc3QgdGltZSAtIGZsdXNoIEZJRk8gKi8KIAkJCXdoaWxlIChtYXgtLSA+IDApCiAJCQkJbXB1LT5yZWFkKG1wdSwgTVBVNDAxRChtcHUpKTsKLQkJCWlmIChtcHUtPmlycSA8IDApCisJCQlpZiAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fVVNFX1RJTUVSKQogCQkJCXNuZF9tcHU0MDFfdWFydF9hZGRfdGltZXIobXB1LCAxKTsKIAkJfQogCQkKQEAgLTM4Myw3ICszODQsNyBAQAogCQlzbmRfbXB1NDAxX3VhcnRfaW5wdXRfcmVhZChtcHUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcHUtPmlucHV0X2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewotCQlpZiAobXB1LT5pcnEgPCAwKQorCQlpZiAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fVVNFX1RJTUVSKQogCQkJc25kX21wdTQwMV91YXJ0X3JlbW92ZV90aW1lcihtcHUsIDEpOwogCQljbGVhcl9iaXQoTVBVNDAxX01PREVfQklUX0lOUFVUX1RSSUdHRVIsICZtcHUtPm1vZGUpOwogCX0KQEAgLTQ5Niw3ICs0OTcsNyBAQAogc3RhdGljIHZvaWQgc25kX21wdTQwMV91YXJ0X2ZyZWUoc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaSkKIHsKIAlzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1ID0gcm1pZGktPnByaXZhdGVfZGF0YTsKLQlpZiAobXB1LT5pcnFfZmxhZ3MgJiYgbXB1LT5pcnEgPj0gMCkKKwlpZiAobXB1LT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEobXB1LT5pcnEsICh2b2lkICopIG1wdSk7CiAJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShtcHUtPnJlcyk7CiAJa2ZyZWUobXB1KTsKQEAgLTUwOSw4ICs1MTAsNyBAQAogICogQGhhcmR3YXJlOiB0aGUgaGFyZHdhcmUgdHlwZSwgTVBVNDAxX0hXX1hYWFgKICAqIEBwb3J0OiB0aGUgYmFzZSBhZGRyZXNzIG9mIE1QVTQwMSBwb3J0CiAgKiBAaW5mb19mbGFnczogYml0ZmxhZ3MgTVBVNDAxX0lORk9fWFhYCi0gKiBAaXJxOiB0aGUgaXJxIG51bWJlciwgLTEgaWYgbm8gaW50ZXJydXB0IGZvciBtcHUKLSAqIEBpcnFfZmxhZ3M6IHRoZSBpcnEgcmVxdWVzdCBmbGFncyAoU0FfWFhYKSwgMCBpZiBpcnEgd2FzIGFscmVhZHkgcmVzZXJ2ZWQuCisgKiBAaXJxOiB0aGUgSVNBIGlycSBudW1iZXIsIC0xIGlmIG5vdCB0byBiZSBhbGxvY2F0ZWQKICAqIEBycmF3bWlkaTogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIG5ldyByYXdtaWRpIGluc3RhbmNlCiAgKgogICogQ3JlYXRlcyBhIG5ldyBNUFUtNDAxIGluc3RhbmNlLgpAQCAtNTI1LDcgKzUyNSw3IEBACiAJCQl1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSwKIAkJCXVuc2lnbmVkIGxvbmcgcG9ydCwKIAkJCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzLAotCQkJaW50IGlycSwgaW50IGlycV9mbGFncywKKwkJCWludCBpcnEsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpCiB7CiAJc3RydWN0IHNuZF9tcHU0MDEgKm1wdTsKQEAgLTU3Nyw4ICs1NzcsOCBAQAogCQltcHUtPmNwb3J0ID0gcG9ydCArIDI7CiAJZWxzZQogCQltcHUtPmNwb3J0ID0gcG9ydCArIDE7Ci0JaWYgKGlycSA+PSAwICYmIGlycV9mbGFncykgewotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0LCBpcnFfZmxhZ3MsCisJaWYgKGlycSA+PSAwKSB7CisJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQsIDAsCiAJCQkJIk1QVTQwMSBVQVJUIiwgKHZvaWQgKikgbXB1KSkgewogCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibXB1NDAxX3VhcnQ6ICIKIAkJCQkgICAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBpcnEpOwpAQCAtNTg2LDkgKzU4NiwxMCBAQAogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KKwlpZiAoaXJxIDwgMCAmJiAhKGluZm9fZmxhZ3MgJiBNUFU0MDFfSU5GT19JUlFfSE9PSykpCisJCWluZm9fZmxhZ3MgfD0gTVBVNDAxX0lORk9fVVNFX1RJTUVSOwogCW1wdS0+aW5mb19mbGFncyA9IGluZm9fZmxhZ3M7CiAJbXB1LT5pcnEgPSBpcnE7Ci0JbXB1LT5pcnFfZmxhZ3MgPSBpcnFfZmxhZ3M7CiAJaWYgKGNhcmQtPnNob3J0bmFtZVswXSkKIAkJc25wcmludGYocm1pZGktPm5hbWUsIHNpemVvZihybWlkaS0+bmFtZSksICIlcyBNSURJIiwKIAkJCSBjYXJkLT5zaG9ydG5hbWUpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9tdHBhdi5jIGIvc291bmQvZHJpdmVycy9tdHBhdi5jCmluZGV4IDVjNDI2ZGYuLjc2OTMwNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvbXRwYXYuYworKysgYi9zb3VuZC9kcml2ZXJzL210cGF2LmMKQEAgLTUyLDYgKzUyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTU4OSw3ICs1OTAsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAltY2FyZC0+cG9ydCA9IHBvcnQ7Ci0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX210cGF2X2lycWgsIElSUUZfRElTQUJMRUQsICJNT1RVIE1UUEFWIiwgbWNhcmQpKSB7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX210cGF2X2lycWgsIDAsICJNT1RVIE1UUEFWIiwgbWNhcmQpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIk1UVkFQIElSUSAlZCBidXN5XG4iLCBpcnEpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXRzNjQuYyBiL3NvdW5kL2RyaXZlcnMvbXRzNjQuYwppbmRleCA4NTM5YWIwLi5mMjRiZjlhIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL210czY0LmMKKysrIGIvc291bmQvZHJpdmVycy9tdHM2NC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwppbmRleCA2ZTMxZTQ2Li4zM2Q5YTg1IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19saWIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19vc3MuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCmluZGV4IGFkZTNjYTUuLmMxY2IyNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJvcGwzX3ZvaWNlLmgiCiAKIHN0YXRpYyBpbnQgc25kX29wbDNfb3Blbl9zZXFfb3NzKHN0cnVjdCBzbmRfc2VxX29zc19hcmcgKmFyZywgdm9pZCAqY2xvc3VyZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCmluZGV4IDJkMzNmNTMuLjcyMzU2MmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAib3BsM192b2ljZS5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogTU9EVUxFX0FVVEhPUigiVXJvcyBCaXpqYWsgPHVyb3NAa3NzLWxva2Euc2k+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwppbmRleCAzMDFhY2I2Li43NDJhNGI2IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL29wbDMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRfZm0uaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfbGliLmMgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYwppbmRleCBmMDdlMzhkLi5iOTUzZmI0IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9saWIuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfcHJvYy5jIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfcHJvYy5jCmluZGV4IGRmODUwYjguLjliODI0YmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3Byb2MuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9wcm9jLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgIm9wbDRfbG9jYWwuaCIKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3NlcS5jIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKaW5kZXggNDNkOGEyYi4uOTkxOTc2OSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJvcGw0X2xvY2FsLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMgYi9zb3VuZC9kcml2ZXJzL3Bjc3AvcGNzcC5jCmluZGV4IGYxNjVjNzcuLjk0NmEwY2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvcGNzcC9wY3NwLmMKKysrIGIvc291bmQvZHJpdmVycy9wY3NwL3Bjc3AuYwpAQCAtNiw3ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvcG9ydG1hbjJ4NC5jIGIvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKaW5kZXggZjJiMGJhMi4uZjY2NDgyMyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKKysrIGIvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwppbmRleCBhMjVmYjdiLi44NWFhZDQzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYworKysgYi9zb3VuZC9kcml2ZXJzL3NlcmlhbC11MTY1NTAuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtODE2LDcgKzgxNiw3IEBACiAKIAlpZiAoaXJxID49IDAgJiYgaXJxICE9IFNORFJWX0FVVE9fSVJRKSB7CiAJCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF91YXJ0MTY1NTBfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQsICJTZXJpYWwgTUlESSIsIHVhcnQpKSB7CisJCQkJMCwgIlNlcmlhbCBNSURJIiwgdWFydCkpIHsKIAkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgImlycSAlZCBidXN5LiBVc2luZyBQb2xsaW5nLlxuIiwgaXJxKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKaW5kZXggZjRjZDQ5My4uZDc5ZDZlZCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMKKysrIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2VxX2tlcm5lbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV92aXJtaWRpLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2NvcmUuYyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCmluZGV4IDE5YzZlMzcuLmI4ZTUxNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMKaW5kZXggZjdhNmZiZC4uNGExZmFlOSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KICNpbmNsdWRlIDxzb3VuZC92eF9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9jbXAuYyBiL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCmluZGV4IDE0Y2FjYmMuLjc2Mjk0ZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2NtcC5jCkBAIC0zMiw3ICszMiw3IEBACiAJU1VDQ0VFRF9PTl9CVVNfUkVTRVQsCiB9OwogCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorc3RhdGljIF9fcHJpbnRmKDIsIDMpCiB2b2lkIGNtcF9lcnJvcihzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgdmE7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc2lnaHQuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCmluZGV4IDQ0MDAzMDguLmNkMDk0ZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzaWdodC5jCkBAIC01MSw3ICs1MSw2IEBACiAJc3RydWN0IGZ3X3VuaXQgKnVuaXQ7CiAJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlOwogCXU2NCBhdWRpb19iYXNlOwotCXN0cnVjdCBmd19hZGRyZXNzX2hhbmRsZXIgaXJpc19oYW5kbGVyOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVyIGJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYyBiL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYwppbmRleCBmZmUyMGI4Li41ZjE3Yjc3IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmMKKysrIGIvc291bmQvZmlyZXdpcmUvaXNvLXJlc291cmNlcy5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3BhY2tldHMtYnVmZmVyLmMgYi9zb3VuZC9maXJld2lyZS9wYWNrZXRzLWJ1ZmZlci5jCmluZGV4IDNjNjFjYTIuLmVhMTUwNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3BhY2tldHMtYnVmZmVyLmMKKysrIGIvc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZmZXIuYwpAQCAtNiw2ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAicGFja2V0cy1idWZmZXIuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyBiL3NvdW5kL2ZpcmV3aXJlL3NwZWFrZXJzLmMKaW5kZXggM2ZjMjU3ZC4uY2JlNmJiOSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYworKysgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCkBAIC03NzgsOSArNzc4LDEwIEBACiB7CiAJc3RydWN0IGZ3c3BrICpmd3NwayA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JbXV0ZXhfbG9jaygmZndzcGstPm11dGV4KTsKIAlhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCgmZndzcGstPnN0cmVhbSk7CiAJc25kX2NhcmRfZGlzY29ubmVjdChmd3Nway0+Y2FyZCk7CisKKwltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOwogCWZ3c3BrX3N0b3Bfc3RyZWFtKGZ3c3BrKTsKIAltdXRleF91bmxvY2soJmZ3c3BrLT5tdXRleCk7CiAKQEAgLTc5Niw4ICs3OTcsOCBAQAogCWZjcF9idXNfcmVzZXQoZndzcGstPnVuaXQpOwogCiAJaWYgKGNtcF9jb25uZWN0aW9uX3VwZGF0ZSgmZndzcGstPmNvbm5lY3Rpb24pIDwgMCkgewotCQltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOwogCQlhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCgmZndzcGstPnN0cmVhbSk7CisJCW11dGV4X2xvY2soJmZ3c3BrLT5tdXRleCk7CiAJCWZ3c3BrX3N0b3Bfc3RyZWFtKGZ3c3BrKTsKIAkJbXV0ZXhfdW5sb2NrKCZmd3Nway0+bXV0ZXgpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvY3M4NDI3LmMgYi9zb3VuZC9pMmMvY3M4NDI3LmMKaW5kZXggMDRhZTg3MC4uNmMyZGMzOCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL2NzODQyNy5jCisrKyBiL3NvdW5kL2kyYy9jczg0MjcuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL2kyYy5jIGIvc291bmQvaTJjL2kyYy5jCmluZGV4IGViN2M3ZDAuLjQ2NzcwMzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9pMmMuYworKysgYi9zb3VuZC9pMmMvaTJjLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKaW5kZXggYzQyNGQzMi4uZGRlNWM5YyAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExMy5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwppbmRleCBkOWZiNTM3Li5mZGYzYzFiIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNy5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNy5jCmluZGV4IDJjYWQyZDYuLmI0YjJhNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTcuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE3LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0eHh4LWFkZGEuYyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCmluZGV4IDU3Y2NiYTguLmNlZjgxM2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazR4eHgtYWRkYS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9wdDIyNTguYyBiL3NvdW5kL2kyYy9vdGhlci9wdDIyNTguYwppbmRleCA3OTdkM2E2Li45ZmEzOTBiIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvcHQyMjU4LmMKKysrIGIvc291bmQvaTJjL290aGVyL3B0MjI1OC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvaTJjLmg+CiAjaW5jbHVkZSA8c291bmQvcHQyMjU4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkpvY2hlbiBWb3NzIDx2b3NzQHNlZWh1aG4uZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlBUMjI1OCB2b2x1bWUgY29udHJvbGxlciAoUHJpbmNldG9uIFRlY2hub2xvZ3kgQ29ycC4pIik7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jIGIvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYwppbmRleCA0ODRhMzViLi42YjY4YzgyIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvdGVhNjMzMHQuYyBiL3NvdW5kL2kyYy90ZWE2MzMwdC5jCmluZGV4IDBlM2E5ZjIuLjJkMjIzMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy90ZWE2MzMwdC5jCisrKyBiL3NvdW5kL2kyYy90ZWE2MzMwdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvdGVhNjMzMHQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCAzY2I3NWJjLi5jZDQ0Yzc0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvYWQxODE2YS5oPgpAQCAtMjA0LDcgKzIwNCw3IEBACiAKIAlpZiAobXB1X3BvcnRbZGV2XSA+IDApIHsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQkJbXB1X3BvcnRbZGV2XSwgMCwgbXB1X2lycVtkZXZdLCBJUlFGX0RJU0FCTEVELAorCQkJCQltcHVfcG9ydFtkZXZdLCAwLCBtcHVfaXJxW2Rldl0sCiAJCQkJCU5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4LlxuIiwgbXB1X3BvcnRbZGV2XSk7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmFfbGliLmMKaW5kZXggMDVhZWY4Yi4uMTc3ZWVkMyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YV9saWIuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhX2xpYi5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAkJc25kX2FkMTgxNmFfZnJlZShjaGlwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FkMTgxNmFfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiQUQxODE2QSIsICh2b2lkICopIGNoaXApKSB7CisJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FkMTgxNmFfaW50ZXJydXB0LCAwLCAiQUQxODE2QSIsICh2b2lkICopIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImFkMTgxNmE6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQlzbmRfYWQxODE2YV9mcmVlKGNoaXApOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKaW5kZXggNGJlZWI2Zi4uMzRhYjY5YiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYworKysgYi9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWxzMTAwLmMgYi9zb3VuZC9pc2EvYWxzMTAwLmMKaW5kZXggMjBiZWNjOC4uZmM1YjM4ZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2FsczEwMC5jCisrKyBiL3NvdW5kL2lzYS9hbHMxMDAuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgpAQCAtMjU2LDcgKzI1Niw2IEBACiAJCQkJCW1wdV90eXBlLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLCAKIAkJCQkJbXB1X2lycVtkZXZdLAotCQkJCQltcHVfaXJxW2Rldl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAogCQkJCQlOVUxMKSA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHhcbiIsIG1wdV9wb3J0W2Rldl0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9henQyMzIwLmMgYi9zb3VuZC9pc2EvYXp0MjMyMC5jCmluZGV4IGFhYzhkYzEuLmU1NWYzZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9henQyMzIwLmMKKysrIGIvc291bmQvaXNhL2F6dDIzMjAuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3dzcy5oPgpAQCAtMjM0LDggKzIzNCw3IEBACiAJaWYgKG1wdV9wb3J0W2Rldl0gPiAwICYmIG1wdV9wb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19BWlQyMzIwLAogCQkJCW1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJbXB1X2lycVtkZXZdLCBJUlFGX0RJU0FCTEVELAotCQkJCU5VTEwpIDwgMCkKKwkJCQltcHVfaXJxW2Rldl0sIE5VTEwpIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseFxuIiwgbXB1X3BvcnRbZGV2XSk7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMzMC5jIGIvc291bmQvaXNhL2NtaTgzMzAuYwppbmRleCBmZTc5YTE2Li5jOTQ1NzhkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMzMC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CkBAIC01OTcsNyArNTk3LDcgQEAKIAlpZiAobXB1cG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewogCQlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVwb3J0W2Rldl0sIDAsIG1wdWlycVtkZXZdLAotCQkJCQlJUlFGX0RJU0FCTEVELCBOVUxMKSA8IDApCisJCQkJCU5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4LlxuIiwKIAkJCQltcHVwb3J0W2Rldl0pOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCmluZGV4IGNiOTE1M2UuLjZkODFmYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKKysrIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CkBAIC0xMzEsNyArMTMxLDYgQEAKIAkJCW1wdV9pcnFbbl0gPSAtMTsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0NTNDIzMiwKIAkJCQkJbXB1X3BvcnRbbl0sIDAsIG1wdV9pcnFbbl0sCi0JCQkJCW1wdV9pcnFbbl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAogCQkJCQlOVUxMKSA8IDApCiAJCQlkZXZfd2FybihkZXYsICJNUFU0MDEgbm90IGRldGVjdGVkXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jIGIvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYwppbmRleCA5OTlkYzFlLi5mNWE5NGI2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCisrKyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KQEAgLTQ0OSw4ICs0NDksNyBAQAogCQkJbXB1X2lycVtkZXZdID0gLTE7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19DUzQyMzIsCiAJCQkJCW1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCW1wdV9pcnFbZGV2XSwKLQkJCQkJbXB1X2lycVtkZXZdID49IDAgPyBJUlFGX0RJU0FCTEVEIDogMCwgTlVMTCkgPCAwKQorCQkJCQltcHVfaXJxW2Rldl0sIE5VTEwpIDwgMCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgSURFTlQgIjogTVBVNDAxIG5vdCBkZXRlY3RlZFxuIik7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYwppbmRleCAwY2RlODEzLi45YTFhNmYyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCisrKyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lczE2ODguaD4KQEAgLTE3NCw3ICsxNzQsNyBAQAogCQkJY2hpcC0+bXB1X3BvcnQgPiAwKSB7CiAJCWVycm9yID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxNjg4LAogCQkJCWNoaXAtPm1wdV9wb3J0LCAwLAotCQkJCW1wdV9pcnFbbl0sIElSUUZfRElTQUJMRUQsIE5VTEwpOworCQkJCW1wdV9pcnFbbl0sIE5VTEwpOwogCQlpZiAoZXJyb3IgPCAwKQogCQkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4X2xpYi5jIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKaW5kZXggMDc2NzYyMC4uMWQ0N2JlOCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKKysrIGIvc291bmQvaXNhL2VzMTY4OC9lczE2ODhfbGliLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZXMxNjg4Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpAQCAtNjYxLDcgKzY2Miw3IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTY4ODogY2FuJ3QgZ3JhYiBwb3J0IDB4JWx4XG4iLCBwb3J0ICsgNCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9lczE2ODhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiRVMxNjg4IiwgKHZvaWQgKikgY2hpcCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfZXMxNjg4X2ludGVycnVwdCwgMCwgIkVTMTY4OCIsICh2b2lkICopIGNoaXApKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImVzMTY4ODogY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2VzMTh4eC5jIGIvc291bmQvaXNhL2VzMTh4eC5jCmluZGV4IGZiNGQ2YjMuLjk4ZTNhYzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9lczE4eHguYworKysgYi9zb3VuZC9pc2EvZXMxOHh4LmMKQEAgLTgyLDcgKzgyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE4MDUsNyArMTgwNSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2VzMTh4eF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJFUzE4eHgiLAorCWlmIChyZXF1ZXN0X2lycShpcnEsIHNuZF9lczE4eHhfaW50ZXJydXB0LCAwLCAiRVMxOHh4IiwKIAkJCSh2b2lkICopIGNhcmQpKSB7CiAJCXNuZF9lczE4eHhfZnJlZShjYXJkKTsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBncmFwIElSUSAlZFxuIiwgaXJxKTsKQEAgLTIxNjAsOCArMjE2MCw4IEBACiAKIAlpZiAobXB1X3BvcnRbZGV2XSA+IDAgJiYgbXB1X3BvcnRbZGV2XSAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxOFhYLAotCQkJCQkgIG1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCSAgaXJxW2Rldl0sIDAsICZjaGlwLT5ybWlkaSk7CisJCQkJCSAgbXB1X3BvcnRbZGV2XSwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jIGIvc291bmQvaXNhL2dhbGF4eS9nYWxheHkuYwppbmRleCBlZTU0ZGYwLi5lNTFkMzI0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ2FsYXh5L2dhbGF4eS5jCisrKyBiL3NvdW5kL2lzYS9nYWxheHkvZ2FsYXh5LmMKQEAgLTU4NSw4ICs1ODUsNyBAQAogCiAJaWYgKG1wdV9wb3J0W25dID49IDApIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCQkgIG1wdV9wb3J0W25dLCAwLCBtcHVfaXJxW25dLAotCQkJCQkgIElSUUZfRElTQUJMRUQsIE5VTEwpOworCQkJCQkgIG1wdV9wb3J0W25dLCAwLCBtcHVfaXJxW25dLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYyBiL3NvdW5kL2lzYS9ndXMvZ3VzX21haW4uYwppbmRleCAxMmViOThmLi40NDkwZWU0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c19tYWluLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfbWFpbi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2d1cy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KQEAgLTE4MCw3ICsxODEsNyBAQAogCQlzbmRfZ3VzX2ZyZWUoZ3VzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JaWYgKGlycSA+PSAwICYmIHJlcXVlc3RfaXJxKGlycSwgc25kX2d1c19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsICJHVVMgR0YxIiwgKHZvaWQgKikgZ3VzKSkgeworCWlmIChpcnEgPj0gMCAmJiByZXF1ZXN0X2lycShpcnEsIHNuZF9ndXNfaW50ZXJydXB0LCAwLCAiR1VTIEdGMSIsICh2b2lkICopIGd1cykpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiZ3VzOiBjYW4ndCBncmFiIGlycSAlZFxuIiwgaXJxKTsKIAkJc25kX2d1c19mcmVlKGd1cyk7CiAJCXJldHVybiAtRUJVU1k7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c192b2x1bWUuYyBiL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCmluZGV4IGMzYzAyOGEuLjNkZDg0MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzX3ZvbHVtZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZ3VzLmg+CiAjZGVmaW5lIF9fR1VTX1RBQkxFU19BTExPQ19fCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c2NsYXNzaWMuYyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCmluZGV4IDA4NmI4ZjAuLmQ3Mjk2NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2d1cy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwppbmRleCAwMDhlOGU1Li41OTdhY2NkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTMxNyw4ICszMTcsNyBAQAogCiAJaWYgKGVzMTY4OC0+bXB1X3BvcnQgPj0gMHgzMDApIHsKIAkJZXJyb3IgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19FUzE2ODgsCi0JCQkJZXMxNjg4LT5tcHVfcG9ydCwgMCwKLQkJCQltcHVfaXJxW25dLCBJUlFGX0RJU0FCTEVELCBOVUxMKTsKKwkJCQllczE2ODgtPm1wdV9wb3J0LCAwLCBtcHVfaXJxW25dLCBOVUxMKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMgYi9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCmluZGV4IDNlNGE1OGIuLjkzM2NiMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTI5MSw3ICsyOTEsNyBAQAogCQlnb3RvIF9lcnI7CiAJfQogCi0JaWYgKHJlcXVlc3RfaXJxKHhpcnEsIHNuZF9ndXNtYXhfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAiR1VTIE1BWCIsICh2b2lkICopbWF4Y2FyZCkpIHsKKwlpZiAocmVxdWVzdF9pcnEoeGlycSwgc25kX2d1c21heF9pbnRlcnJ1cHQsIDAsICJHVVMgTUFYIiwgKHZvaWQgKiltYXhjYXJkKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCB4aXJxKTsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIF9lcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCBjN2I4MGU0Li44ZTdlMTk0IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9ndXMuaD4KQEAgLTY4NCw3ICs2ODQsNyBAQAogCWlmICgoZXJyID0gc25kX2d1c19pbml0aWFsaXplKGd1cykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmIChyZXF1ZXN0X2lycSh4aXJxLCBzbmRfaW50ZXJ3YXZlX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAocmVxdWVzdF9pcnEoeGlycSwgc25kX2ludGVyd2F2ZV9pbnRlcnJ1cHQsIDAsCiAJCQkiSW50ZXJXYXZlIiwgaXdjYXJkKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCB4aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9tc25kL21zbmQuYyBiL3NvdW5kL2lzYS9tc25kL21zbmQuYwppbmRleCAzYTE1MjZhLi4xY2VlMThmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvbXNuZC9tc25kLmMKKysrIGIvc291bmQvaXNhL21zbmQvbXNuZC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9taWRpLmMgYi9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYwppbmRleCA3ODc0OTU2Li5mZmM2N2ZkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKaW5kZXggOTFkNjAyMy4uMDk2MWUyYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCisrKyBiL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYwpAQCAtNjAwLDcgKzYwMCw3IEBACiAJCQkJCSAgbXB1X2lvWzBdLAogCQkJCQkgIE1QVTQwMV9NT0RFX0lOUFVUIHwKIAkJCQkJICBNUFU0MDFfTU9ERV9PVVRQVVQsCi0JCQkJCSAgbXB1X2lycVswXSwgSVJRRl9ESVNBQkxFRCwKKwkJCQkJICBtcHVfaXJxWzBdLAogCQkJCQkgICZjaGlwLT5ybWlkaSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZV9taXhlci5jIGIvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZV9taXhlci5jCmluZGV4IDQ5NDA1OGEuLjFkZTU5ZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGVfbWl4ZXIuYworKysgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlX21peGVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IDliOTE1ZTIuLjY0YTlhMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CkBAIC02NjcsNyArNjY3LDcgQEAKIAllcnIgPSBzbmRfb3BsM3NhMl9kZXRlY3QoY2FyZCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gcmVxdWVzdF9pcnEoeGlycSwgc25kX29wbDNzYTJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCWVyciA9IHJlcXVlc3RfaXJxKHhpcnEsIHNuZF9vcGwzc2EyX2ludGVycnVwdCwgMCwKIAkJCSAgIk9QTDMtU0EyIiwgY2FyZCk7CiAJaWYgKGVycikgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuJ3QgZ3JhYiBJUlEgJWRcbiIsIHhpcnEpOwpAQCAtNzA3LDggKzcwNyw5IEBACiAJfQogCWlmIChtaWRpX3BvcnRbZGV2XSA+PSAweDMwMCAmJiBtaWRpX3BvcnRbZGV2XSA8IDB4MzQwKSB7CiAJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfT1BMM1NBMiwKLQkJCQkJICAgICAgIG1pZGlfcG9ydFtkZXZdLCAwLAotCQkJCQkgICAgICAgeGlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKQorCQkJCQkgICAgICAgbWlkaV9wb3J0W2Rldl0sCisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsCisJCQkJCSAgICAgICAmY2hpcC0+cm1pZGkpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlZCwgZG1hICVkIiwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYyBiL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYwppbmRleCA4YzI0MTAyLi4zNzg1YjdhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC0xMzc3LDggKzEzNzcsNyBAQAogCQlybWlkaSA9IE5VTEw7CiAJZWxzZSB7CiAJCWVycm9yID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCW1wdV9wb3J0LCAwLCBtaXJvLT5tcHVfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJCSZybWlkaSk7CisJCQkJbXB1X3BvcnQsIDAsIG1pcm8tPm1wdV9pcnEsICZybWlkaSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAibm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHg/XG4iLAogCQkJCSAgIG1wdV9wb3J0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCmluZGV4IGMzNWRjNjguLjk3ODcxYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtODkyLDcgKzg5Miw3IEBACiAjZW5kaWYKICNpZmRlZiBPUFRpOTNYCiAJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHNuZF9vcHRpOTN4X2ludGVycnVwdCwKLQkJCSAgICBJUlFGX0RJU0FCTEVELCBERVZfTkFNRSIgLSBXU1MiLCBjaGlwKTsKKwkJCSAgICAwLCBERVZfTkFNRSIgLSBXU1MiLCBjaGlwKTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIm9wdGk5eHg6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQlyZXR1cm4gZXJyb3I7CkBAIC05MTQsNyArOTE0LDcgQEAKIAkJcm1pZGkgPSBOVUxMOwogCWVsc2UgewogCQllcnJvciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQltcHVfcG9ydCwgMCwgbXB1X2lycSwgSVJRRl9ESVNBQkxFRCwgJnJtaWRpKTsKKwkJCQltcHVfcG9ydCwgMCwgbXB1X2lycSwgJnJtaWRpKTsKIAkJaWYgKGVycm9yKQogCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKIAkJCQkgICBtcHVfcG9ydCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMC5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDAuYwppbmRleCA1ZDYxZjVhLi43MTg4Nzg3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvZW11ODAwMC5jCisrKyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXU4MDAwLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9jYWxsYmFjay5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDBfY2FsbGJhY2suYwppbmRleCA5YTNjNzFjYy4uMzQ0YjQzNSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfY2FsbGJhY2suYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9jYWxsYmFjay5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImVtdTgwMDBfbG9jYWwuaCIKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3BhdGNoLmMKaW5kZXggYzk5YzYwNy4uZTA5ZjE0NCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9wYXRjaC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiZW11ODAwMF9sb2NhbC5oIgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiBzdGF0aWMgaW50IGVtdTgwMDBfcmVzZXRfYWRkcjsKIG1vZHVsZV9wYXJhbShlbXU4MDAwX3Jlc2V0X2FkZHIsIGludCwgMDQ0NCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9zeW50aC5jIGIvc291bmQvaXNhL3NiL2VtdTgwMDBfc3ludGguYwppbmRleCAwYzc5MDVjLi40ZTNmY2ZiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2IvZW11ODAwMF9zeW50aC5jCisrKyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3N5bnRoLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgImVtdTgwMDBfbG9jYWwuaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWksIFN0ZXZlIFJhdGNsaWZmZSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2phenoxNi5jIGIvc291bmQvaXNhL3NiL2phenoxNi5jCmluZGV4IDhjY2JjZGQuLjU0ZTNjMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9qYXp6MTYuYworKysgYi9zb3VuZC9pc2Evc2IvamF6ejE2LmMKQEAgLTMyMiw3ICszMjIsNiBAQAogCQkJCQlNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLAogCQkJCQltcHVfaXJxW2Rldl0sCi0JCQkJCW1wdV9pcnFbZGV2XSA+PSAwID8gSVJRRl9ESVNBQkxFRCA6IDAsCiAJCQkJCU5VTEwpIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4XG4iLAogCQkJCQltcHVfcG9ydFtkZXZdKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2LmMgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCmluZGV4IDRkMWM1YTMuLjExNWM3NzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2LmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTYuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvc2IxNl9jc3AuaD4KQEAgLTM5NCw4ICszOTQsOSBAQAogCiAJaWYgKGNoaXAtPm1wdV9wb3J0ID4gMCAmJiBjaGlwLT5tcHVfcG9ydCAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19TQiwKLQkJCQkJICAgICAgIGNoaXAtPm1wdV9wb3J0LCAwLAotCQkJCQkgICAgICAgeGlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKQorCQkJCQkgICAgICAgY2hpcC0+bXB1X3BvcnQsCisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsCisJCQkJCSAgICAgICAmY2hpcC0+cm1pZGkpKSA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQljaGlwLT5ybWlkaV9jYWxsYmFjayA9IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwppbmRleCBiZGM4ZGRlLi5jMWFhMjFlIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjE2X21haW4uYwppbmRleCAyYTZjYzFjLi4wYmJjZDQ3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9tYWluLmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTZfbWFpbi5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAjaW5jbHVkZSA8c291bmQvc2IxNl9jc3AuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjguYyBiL3NvdW5kL2lzYS9zYi9zYjguYwppbmRleCAyMjU5ZTNmLi40NTNlZjI4IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2I4LmMKKysrIGIvc291bmQvaXNhL3NiL3NiOC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2IuaD4KICNpbmNsdWRlIDxzb3VuZC9vcGwzLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2I4X21haW4uYyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCmluZGV4IDdkODRjOWYuLjI0ZDQxMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjhfbWFpbi5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NiLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYl9jb21tb24uYyBiL3NvdW5kL2lzYS9zYi9zYl9jb21tb24uYwppbmRleCBlYWU2YzFjLi4zZWY5OTA2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2JfY29tbW9uLmMKKysrIGIvc291bmQvaXNhL3NiL3NiX2NvbW1vbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zYi5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KQEAgLTI0MCw3ICsyNDEsNyBAQAogCWlmIChyZXF1ZXN0X2lycShpcnEsIGlycV9oYW5kbGVyLAogCQkJKGhhcmR3YXJlID09IFNCX0hXX0FMUzQwMDAgfHwKIAkJCSBoYXJkd2FyZSA9PSBTQl9IV19DUzU1MzApID8KLQkJCUlSUUZfU0hBUkVEIDogSVJRRl9ESVNBQkxFRCwKKwkJCUlSUUZfU0hBUkVEIDogMCwKIAkJCSJTb3VuZEJsYXN0ZXIiLCAodm9pZCAqKSBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzYjogY2FuJ3QgZ3JhYiBpcnEgJWRcbiIsIGlycSk7CiAJCXNuZF9zYmRzcF9mcmVlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NjNjAwMC5jIGIvc291bmQvaXNhL3NjNjAwMC5jCmluZGV4IDlhOGJiZjYuLjIwN2MxNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYzYwMDAuYworKysgYi9zb3VuZC9pc2Evc2M2MDAwLmMKQEAgLTY1OCw4ICs2NTgsNyBAQAogCQlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLAogCQkJCQlNUFU0MDFfSFdfTVBVNDAxLAogCQkJCQltcHVfcG9ydFtkZXZdLCAwLAotCQkJCQltcHVfaXJxW2Rldl0sIElSUUZfRElTQUJMRUQsCi0JCQkJCU5VTEwpIDwgMCkKKwkJCQkJbXB1X2lycVtkZXZdLCBOVUxMKSA8IDApCiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJubyBNUFUtNDAxIGRldmljZSBhdCAweCVseCA/XG4iLAogCQkJCQltcHVfcG9ydFtkZXZdKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc3NjYXBlLmMgYi9zb3VuZC9pc2Evc3NjYXBlLmMKaW5kZXggZTJkNWQyZC4uYjRhNmFhOSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NzY2FwZS5jCisrKyBiL3NvdW5kL2lzYS9zc2NhcGUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvd3NzLmg+CkBAIC04MjUsOCArODI1LDcgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCBkZXZudW0sIE1QVTQwMV9IV19NUFU0MDEsIHBvcnQsCi0JCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELCBpcnEsIElSUUZfRElTQUJMRUQsCi0JCQkJICAmcmF3bWlkaSk7CisJCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELCBpcnEsICZyYXdtaWRpKTsKIAlpZiAoZXJyID09IDApIHsKIAkJc3RydWN0IHNuZF9tcHU0MDEgKm1wdSA9IHJhd21pZGktPnByaXZhdGVfZGF0YTsKIAkJbXB1LT5vcGVuX2lucHV0ID0gbXB1NDAxX29wZW47CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCA3MTE2NzBlLi4xNTBiOTZiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvb3BsMy5oPgpAQCAtNDE4LDcgKzQxOCw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmIChyZXF1ZXN0X2lycShpY3MyMTE1X2lycVtkZXZdLCBzbmRfd2F2ZWZyb250X2ljczIxMTVfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgIklDUzIxMTUiLCBhY2FyZCkpIHsKKwkJCTAsICJJQ1MyMTE1IiwgYWNhcmQpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byB1c2UgSUNTMjExNSBJUlEgJWRcbiIsIGljczIxMTVfaXJxW2Rldl0pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQ0OSw4ICs0NDksNyBAQAogCWlmIChjczQyMzJfbXB1X3BvcnRbZGV2XSA+IDAgJiYgY3M0MjMyX21wdV9wb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgbWlkaV9kZXYsIE1QVTQwMV9IV19DUzQyMzIsCiAJCQkJCSAgY3M0MjMyX21wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCSAgY3M0MjMyX21wdV9pcnFbZGV2XSwgSVJRRl9ESVNBQkxFRCwKLQkJCQkJICBOVUxMKTsKKwkJCQkJICBjczQyMzJfbXB1X2lycVtkZXZdLCBOVUxMKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9wcmludGsgKEtFUk5fRVJSICJjYW4ndCBhbGxvY2F0ZSBDUzQyMzIgTVBVLTQwMSBkZXZpY2VcbiIpOwogCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCmluZGV4IDY1N2UyZDYuLmU1MWUwOTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NuZF93YXZlZnJvbnQuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jCmluZGV4IDRmYjdiMTkuLjQwNWY4YjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfc3ludGguYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NuZF93YXZlZnJvbnQuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd3NzL3dzc19saWIuYyBiL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCmluZGV4IDJhNDJjYzMuLjQ5YzhhMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCisrKyBiL3NvdW5kL2lzYS93c3Mvd3NzX2xpYi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC93c3MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xODMzLDcgKzE4MzQsNyBAQAogCX0KIAljaGlwLT5jcG9ydCA9IGNwb3J0OwogCWlmICghKGh3c2hhcmUgJiBXU1NfSFdTSEFSRV9JUlEpKQotCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfd3NzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX3dzc19pbnRlcnJ1cHQsIDAsCiAJCQkJIldTUyIsICh2b2lkICopIGNoaXApKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ3c3M6IGNhbid0IGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQkJc25kX3dzc19mcmVlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9LY29uZmlnIGIvc291bmQvbWlwcy9LY29uZmlnCmluZGV4IGE5ODIzZmEuLmQyZjYxNWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvS2NvbmZpZworKysgYi9zb3VuZC9taXBzL0tjb25maWcKQEAgLTIzLDEyICsyMywxNSBAQAogCiAKIGNvbmZpZyBTTkRfQVUxWDAwCi0JdHJpc3RhdGUgIkF1MXgwMCBBQzk3IFBvcnQgRHJpdmVyIgotCWRlcGVuZHMgb24gU09DX0FVMTAwMCB8fCBTT0NfQVUxMTAwIHx8IFNPQ19BVTE1MDAKKwl0cmlzdGF0ZSAiQXUxeDAwIEFDOTcgUG9ydCBEcml2ZXIgKERFUFJFQ0FURUQpIgorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZCiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKIAloZWxwCiAJICBBTFNBIFNvdW5kIGRyaXZlciBmb3IgdGhlIEF1MXgwMCdzIEFDOTcgcG9ydC4KIAorCSAgTmV3ZXIgZHJpdmVycyBmb3IgQVNvQyBhcmUgYXZhaWxhYmxlLCBwbGVhc2UgZG8gbm90IHVzZQorCSAgdGhpcyBkcml2ZXIgYXMgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisKIGVuZGlmCSMgU05EX01JUFMKIApkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9hdTF4MDAuYyBiL3NvdW5kL21pcHMvYXUxeDAwLmMKaW5kZXggNDQ2Y2Y5Ny4uM2YzZWMwYiAxMDA2NDQKLS0tIGEvc291bmQvbWlwcy9hdTF4MDAuYworKysgYi9zb3VuZC9taXBzL2F1MXgwMC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtNDY1LDEzICs0NjYsMTMgQEAKIAogCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKIAlpZiAoKGF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKERNQV9JRF9BQzk3Q19UWCwKLQkJCSJBQzk3IFRYIiwgYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkiQUM5NyBUWCIsIGF1MTAwMF9kbWFfaW50ZXJydXB0LCAwLAogCQkJYXUxMDAwLT5zdHJlYW1bUExBWUJBQ0tdKSkgPCAwKSB7CiAJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlpZiAoKGF1MTAwMC0+c3RyZWFtW0NBUFRVUkVdLT5kbWEgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1JYLAotCQkJIkFDOTcgUlgiLCBhdTEwMDBfZG1hX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJCSJBQzk3IFJYIiwgYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIDAsCiAJCQlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkpIDwgMCl7CiAJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvc291bmQvbWlwcy9oYWwyLmMgYi9zb3VuZC9taXBzL2hhbDIuYwppbmRleCA0NTNkMzQzLi4yZTZjODU4IDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2hhbDIuYworKysgYi9zb3VuZC9taXBzL2hhbDIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CiAjaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL3NnaW8yYXVkaW8uYyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCmluZGV4IDcxNzYwNGMuLjY5NDI1ZDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCisrKyBiL3NvdW5kL21pcHMvc2dpbzJhdWRpby5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaXAzMi9pcDMyX2ludHMuaD4KICNpbmNsdWRlIDxhc20vaXAzMi9tYWNlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfdGltZXIuYyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCmluZGV4IDQ4Y2RhNmMuLjgwMjFjODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCisrKyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAluID0gc291bmRfYWxsb2NfdGltZXJkZXYoKTsKIAlpZiAobiA9PSAtMSkKIAkJbiA9IDA7CQkvKiBPdmVyd3JpdGUgdGhlIHN5c3RlbSB0aW1lciAqLwotCXN0cmNweShzb3VuZF90aW1lci5pbmZvLm5hbWUsIG5hbWUpOworCXN0cmxjcHkoc291bmRfdGltZXIuaW5mby5uYW1lLCBuYW1lLCBzaXplb2Yoc291bmRfdGltZXIuaW5mby5uYW1lKSk7CiAJc291bmRfdGltZXJfZGV2c1tuXSA9ICZzb3VuZF90aW1lcjsKIH0KIEVYUE9SVF9TWU1CT0woc291bmRfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggN2Y0ZDYxOS4uZmFjNTFlZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCmluZGV4IDQ4Y2JkYTkuLmYxNDg4ZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCAyMDE1MDM2Li42ZTMxMTE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jIGIvc291bmQvcGNpL2FrNDUzMV9jb2RlYy5jCmluZGV4IGZkMTM1ZTMuLmNhZGY3YjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hazQ1MzFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWs0NTMxX2NvZGVjLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvYWs0NTMxX2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggYjQ0NGI3NC4uZWY4NWFjNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHMzMDAuYyBiL3NvdW5kL3BjaS9hbHMzMDAuYwppbmRleCA3MzZjOGU5Li44ZGM3N2EwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzMzAwLmMKKysrIGIvc291bmQvcGNpL2FsczMwMC5jCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCBhOWMxYWYzLi4yOGVmNDBlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTY5LDcgKzY5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtOTMxLDggKzkzMSw5IEBACiAKIAlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoIGNhcmQsIDAsIE1QVTQwMV9IV19BTFM0MDAwLAogCQkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMzBfTUlESV9EQVRBLAotCQkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQlwY2ktPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAorCQkJCQlNUFU0MDFfSU5GT19JUlFfSE9PSywKKwkJCQkJLTEsICZjaGlwLT5ybWlkaSkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFsczQwMDA6IG5vIE1QVS00MDEgZGV2aWNlIGF0IDB4JWx4P1xuIiwKIAkJCQlpb2Jhc2UgKyBBTFM0S19JT0JfMzBfTUlESV9EQVRBKTsKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKaW5kZXggZWFlNjJlYi4uZjRiOWUyYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpb2N0bC5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKaW5kZXggYTMyNTAyZS4uZjZiOTUxNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaWZkZWYgTU9EVUxFX0ZJUk1XQVJFCiBNT0RVTEVfRklSTVdBUkUoImFzaWhwaS9kc3A1MDAwLmJpbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDUzN2UwYTIuLjE1ZTRlNWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKaW5kZXggNDVkZjI3NS4uNTdiZjhmNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCmluZGV4IGEzODQ2OTkuLmRjMzI2YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKKysrIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9nYW1lLmMKaW5kZXggZTI5MWFhNS4uYzA3Yzc5MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfZ2FtZS5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2dhbWUuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJhdTg4eDAuaCIKICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfbXB1NDAxLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYwppbmRleCAwZGM4ZDI1Li5lNmM2YTBmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYwpAQCAtODQsNyArODQsNyBAQAogI2lmZGVmIFZPUlRFWF9NUFU0MDFfTEVHQUNZCiAJaWYgKCh0ZW1wID0KIAkgICAgIHNuZF9tcHU0MDFfdWFydF9uZXcodm9ydGV4LT5jYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLCAweDMzMCwKLQkJCQkgMCwgMCwgMCwgJnJtaWRpKSkgIT0gMCkgeworCQkJCSBNUFU0MDFfSU5GT19JUlFfSE9PSywgLTEsICZybWlkaSkpICE9IDApIHsKIAkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLAogCQkJKGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMKSAmCiAJCQkgfkNUUkxfTUlESV9QT1JUKSAmIH5DVFJMX01JRElfRU4pOwpAQCAtOTQsOCArOTQsOCBAQAogCXBvcnQgPSAodW5zaWduZWQgbG9uZykodm9ydGV4LT5tbWlvICsgVk9SVEVYX01JRElfREFUQSk7CiAJaWYgKCh0ZW1wID0KIAkgICAgIHNuZF9tcHU0MDFfdWFydF9uZXcodm9ydGV4LT5jYXJkLCAwLCBNUFU0MDFfSFdfQVVSRUFMLCBwb3J0LAotCQkJCSBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fTU1JTywKLQkJCQkgMCwgMCwgJnJtaWRpKSkgIT0gMCkgeworCQkJCSBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fTU1JTyB8CisJCQkJIE1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwgJnJtaWRpKSkgIT0gMCkgewogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwsCiAJCQkoaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwpICYKIAkJCSB+Q1RSTF9NSURJX1BPUlQpICYgfkNUUkxfTUlESV9FTik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKaW5kZXggZjg1NjliMS4uN2E1ODExNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggNTc5ZmMwZGNlLi5iYzFlNjgzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTE4Niw3ICsxODYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CkBAIC0yNjUyLDggKzI2NTIsOSBAQAogCSAgIHNpbmNlIG91ciBoYXJkd2FyZSBvdWdodCB0byBiZSBzaW1pbGFyLCB0aHVzIHVzZSBzYW1lIElELiAqLwogCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoCiAJCWNhcmQsIDAsCi0JCU1QVTQwMV9IV19BWlQyMzIwLCBjaGlwLT5tcHVfaW8sIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCi0JCXBjaS0+aXJxLCAwLCAmY2hpcC0+cm1pZGkKKwkJTVBVNDAxX0hXX0FaVDIzMjAsIGNoaXAtPm1wdV9pbywKKwkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQktMSwgJmNoaXAtPnJtaWRpCiAJKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhemYzMzI4OiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDM5MTgwMzMuLmMxYzJkMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IDA2MWI3ZTYuLmZlOTlmZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCA5Y2Y5OWZiLi45NTRjOTkzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CkBAIC0zMjI4LDggKzMyMjgsOSBAQAogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0NNSVBDSSwKIAkJCQkJICAgICAgIGlvbWlkaSwKIAkJCQkJICAgICAgIChpbnRlZ3JhdGVkX21pZGkgPwotCQkJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCA6IDApLAotCQkJCQkgICAgICAgY20tPmlycSwgMCwgJmNtLT5ybWlkaSkpIDwgMCkgeworCQkJCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCA6IDApIHwKKwkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCQkgICAgICAgLTEsICZjbS0+cm1pZGkpKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBubyBVQVJUNDAxIGRldmljZSBhdCAweCVseFxuIiwgaW9taWRpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCAwN2YwNGUzLi5hNmM2YzVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKaW5kZXggMWFmOTU1NS4uYTRlY2I0MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jczQ2eHguaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDk1NDZiZjAuLjRmYTUzMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzMC5jIGIvc291bmQvcGNpL2NzNTUzMC5jCmluZGV4IGE0NjY5MzQuLjk1OGY0OTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzAuYworKysgYi9zb3VuZC9wY2kvY3M1NTMwLmMKQEAgLTM3LDcgKzM3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCmluZGV4IDEwZDIyZWQuLmI4OTU5ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCmluZGV4IDQ1N2QyMTEuLjJjODYyMjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCkBAIC00MDQsNyArNDA0LDcgQEAKIAlpbnQgZXJyOwogCWludCBwbGF5YmFja19jb3VudCwgY2FwdHVyZV9jb3VudDsKIAotCXBsYXliYWNrX2NvdW50ID0gKElFQzk1OCA9PSBkZXZpY2UpID8gMSA6IDg7CisJcGxheWJhY2tfY291bnQgPSAoSUVDOTU4ID09IGRldmljZSkgPyAxIDogMjU2OwogCWNhcHR1cmVfY291bnQgPSAoRlJPTlQgPT0gZGV2aWNlKSA/IDEgOiAwOwogCWVyciA9IHNuZF9wY21fbmV3KGF0Yy0+Y2FyZCwgImN0eGZpIiwgZGV2aWNlLAogCQkJICBwbGF5YmFja19jb3VudCwgY2FwdHVyZV9jb3VudCwgJnBjbSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RzcmMuYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCmluZGV4IGM3NDlmYTcuLmUxMzRiM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHNyYy5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiY3RoYXJkd2FyZS5oIgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2RlZmluZSBTUkNfUkVTT1VSQ0VfTlVNCTY0CisjZGVmaW5lIFNSQ19SRVNPVVJDRV9OVU0JMjU2CiAjZGVmaW5lIFNSQ0lNUF9SRVNPVVJDRV9OVU0JMjU2CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY29ual9tYXNrOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5oIGIvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5oCmluZGV4IGIyM2FkZmMuLmU2ZGE2MGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uaAorKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgQ1RWTUVNX0gKICNkZWZpbmUgQ1RWTUVNX0gKIAotI2RlZmluZSBDVF9QVFBfTlVNCTEJLyogbnVtIG9mIGRldmljZSBwYWdlIHRhYmxlIHBhZ2VzICovCisjZGVmaW5lIENUX1BUUF9OVU0JNAkvKiBudW0gb2YgZGV2aWNlIHBhZ2UgdGFibGUgcGFnZXMgKi8KIAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL3hmaS5jIGIvc291bmQvcGNpL2N0eGZpL3hmaS5jCmluZGV4IGIyNTlhYTAuLjMzOTMxZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS94ZmkuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkveGZpLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgImN0YXRjLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjAuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCmluZGV4IDQzYzdlMTIuLmQ0N2U3MmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jCkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwppbmRleCA5NWIwMzMwLi40MTNhY2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jCmluZGV4IDg3MjNjNDAuLjFlYzRlZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYwpAQCAtNTEsNyArNTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IGQ3MzA2OTguLjlmZDY5NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtMTYsNiArMTYsOCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiBNT0RVTEVfQVVUSE9SKCJHaXVsaWFubyBQb2NoaW5pIDxwb2NoaW5pQHNoaW55Lml0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJFY2hvYXVkaW8gIiBFQ0hPQ0FSRF9OQU1FICIgc291bmRjYXJkcyBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jCmluZGV4IDAwNThjNjcuLjAzOTEyNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjAuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNC5jCmluZGV4IDE0ZTQ5MjUuLjVlOTY2ZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYwpAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jCmluZGV4IGY0MTZiMTUuLmMxNjZiN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYwppbmRleCBlNTk0YTNiLi5hM2VmM2I5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kai5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kanguYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGp4LmMKaW5kZXggZjBkMDBiZi4uZjUxNjQ0NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kanguYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqeC5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYwppbmRleCAxYWYwMDM3Li5jMjJjODJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pb3guYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW94LmMKaW5kZXggMGI1MTE2My4uODZjZjJkMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pb3guYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lveC5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKaW5kZXggM2Y2M2FiOC4uNmEwMjdmMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCmluZGV4IDI4MzEzNzIuLjk2YTU5OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKaW5kZXggZWRkYWViNC4uYjhjZTI3ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwppbmRleCAwMzY0MDExLi4xMjgzYmZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21vbmEuYwpAQCAtNDgsNyArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwppbmRleCBhOWM0NWQyLi5lYWExOThlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCmluZGV4IDdlZjk0OWQ5Li5hMGFmYTUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX2NhbGxiYWNrLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9jYWxsYmFjay5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlICJlbXUxMGsxX3N5bnRoX2xvY2FsLmgiCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwppbmRleCBmY2Q0OTM1Li42YTNlNTY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMKaW5kZXggYWQ3YjcxNC4uNGM0MWM5MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9zeW50aC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfc3ludGguYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiZW11MTBrMV9zeW50aF9sb2NhbC5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJvdXRpbmVzIGZvciBjb250cm9sIG9mIEVNVTEwSzEgV2F2ZVRhYmxlIHN5bnRoIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwppbmRleCBkNGZkZTFiLi4yMjI4YmU5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDYyMmJhY2UuLmUyMmI4ZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC0xMTQ2LDYgKzExNDYsMTEgQEAKIAkJa2ZyZWUoZXBjbSk7CiAJCXJldHVybiBlcnI7CiAJfQorCWVyciA9IHNuZF9wY21faHdfcnVsZV9ub3Jlc2FtcGxlKHJ1bnRpbWUsIDQ4MDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShlcGNtKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAJbWl4ID0gJmVtdS0+cGNtX21peGVyW3N1YnN0cmVhbS0+bnVtYmVyXTsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQltaXgtPnNlbmRfcm91dGluZ1swXVtpXSA9IG1peC0+c2VuZF9yb3V0aW5nWzFdW2ldID0gbWl4LT5zZW5kX3JvdXRpbmdbMl1baV0gPSBpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaW8uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKaW5kZXggNWVmNzA4MC4uZTRmYmE0OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaW8uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2VtdTEwazEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgInAxN3YuaCIKIAogdW5zaWduZWQgaW50IHNuZF9lbXUxMGsxX3B0cl9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IGNobikKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKaW5kZXggYzI1MDYxNC4uNGY1MDJhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwppbmRleCAyMGI4ZGEyLi4xMDFlN2NiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9lbXUxMGsxLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbnMxMzcwLmMgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCmluZGV4IGYwMmUyZjguLmQwODVhZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbnMxMzcwLmMKKysrIGIvc291bmQvcGNpL2VuczEzNzAuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5MzguYyBiL3NvdW5kL3BjaS9lczE5MzguYwppbmRleCAyNmE1YTJmLi4wNGNjMjFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTg1NCw4ICsxODU0LDkgQEAKIAkJfQogCX0KIAlpZiAoc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCWNoaXAtPm1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCWNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSA8IDApIHsKKwkJCQljaGlwLT5tcHVfcG9ydCwKKwkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJLTEsICZjaGlwLT5ybWlkaSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXMxOTM4OiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBNUFUtNDAxXG4iKTsKIAl9IGVsc2UgewogCQkvLyB0aGlzIGxpbmUgaXMgdml0YWwgZm9yIE1JREkgaW50ZXJydXB0IGhhbmRsaW5nIG9uIGVzcy1zb2xvMQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IDk5ZWE5MzIuLjI5N2ExNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5NjguYworKysgYi9zb3VuZC9wY2kvZXMxOTY4LmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKQEAgLTI4NDMsOCArMjg0Myw5IEBACiAJaWYgKGVuYWJsZV9tcHVbZGV2XSkgewogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKIAkJCQkJICAgICAgIGNoaXAtPmlvX3BvcnQgKyBFU01fTVBVNDAxX1BPUlQsCi0JCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQkgICAgICAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKKwkJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfAorCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczE5Njg6IHNraXBwaW5nIE1QVS00MDEgTUlESSBzdXBwb3J0Li5cbiIpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCAzMmIwMmQ5Li5lYzA1ZWY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KQEAgLTcyOSwxMSArNzI5LDE0IEBACiAJeyAuZGF0YSA9IDIsIC5jbGsgPSAwLCAud3JlbiA9IDEsIC5tb3N0ID0gMywgLm5hbWUgPSAiU0Y2NC1QQ1IiIH0sCiB9OwogCisjZGVmaW5lIGdldF90ZWE1NzV4X2dwaW8oY2hpcCkgXAorCSgmc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKChjaGlwKS0+dGVhNTc1eF90dW5lciAmIFRVTkVSX1RZUEVfTUFTSykgLSAxXSkKKwogc3RhdGljIHZvaWQgc25kX2ZtODAxX3RlYTU3NXhfc2V0X3BpbnMoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEsIHU4IHBpbnMpCiB7CiAJc3RydWN0IGZtODAxICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgcmVnID0gaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKLQlzdHJ1Y3Qgc25kX2ZtODAxX3RlYTU3NXhfZ3BpbyBncGlvID0gc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIC0gMV07CisJc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9ICpnZXRfdGVhNTc1eF9ncGlvKGNoaXApOwogCiAJcmVnICY9IH4oRk04MDFfR1BJT19HUChncGlvLmRhdGEpIHwKIAkJIEZNODAxX0dQSU9fR1AoZ3Bpby5jbGspIHwKQEAgLTc1MSw3ICs3NTQsNyBAQAogewogCXN0cnVjdCBmbTgwMSAqY2hpcCA9IHRlYS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIHNob3J0IHJlZyA9IGludyhGTTgwMV9SRUcoY2hpcCwgR1BJT19DVFJMKSk7Ci0Jc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW9zWyhjaGlwLT50ZWE1NzV4X3R1bmVyICYgVFVORVJfVFlQRV9NQVNLKSAtIDFdOworCXN0cnVjdCBzbmRfZm04MDFfdGVhNTc1eF9ncGlvIGdwaW8gPSAqZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKTsKIAogCXJldHVybiAgKHJlZyAmIEZNODAxX0dQSU9fR1AoZ3Bpby5kYXRhKSkgPyBURUE1NzVYX0RBVEEgOiAwIHwKIAkJKHJlZyAmIEZNODAxX0dQSU9fR1AoZ3Bpby5tb3N0KSkgPyBURUE1NzVYX01PU1QgOiAwOwpAQCAtNzYxLDcgKzc2NCw3IEBACiB7CiAJc3RydWN0IGZtODAxICpjaGlwID0gdGVhLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgcmVnID0gaW53KEZNODAxX1JFRyhjaGlwLCBHUElPX0NUUkwpKTsKLQlzdHJ1Y3Qgc25kX2ZtODAxX3RlYTU3NXhfZ3BpbyBncGlvID0gc25kX2ZtODAxX3RlYTU3NXhfZ3Bpb3NbKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9UWVBFX01BU0spIC0gMV07CisJc3RydWN0IHNuZF9mbTgwMV90ZWE1NzV4X2dwaW8gZ3BpbyA9ICpnZXRfdGVhNTc1eF9ncGlvKGNoaXApOwogCiAJLyogdXNlIEdQSU8gbGluZXMgYW5kIHNldCB3cml0ZSBlbmFibGUgYml0ICovCiAJcmVnIHw9IEZNODAxX0dQSU9fR1MoZ3Bpby5kYXRhKSB8CkBAIC0xMjQ2LDcgKzEyNDksNyBAQAogCQkJY2hpcC0+dGVhNTc1eF90dW5lciA9IHRlYTU3NXhfdHVuZXI7CiAJCQlpZiAoIXNuZF90ZWE1NzV4X2luaXQoJmNoaXAtPnRlYSkpIHsKIAkJCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZGV0ZWN0ZWQgVEVBNTc1eCByYWRpbyB0eXBlICVzXG4iLAotCQkJCQlzbmRfZm04MDFfdGVhNTc1eF9ncGlvc1t0ZWE1NzV4X3R1bmVyIC0gMV0ubmFtZSk7CisJCQkJCSAgIGdldF90ZWE1NzV4X2dwaW8oY2hpcCktPm5hbWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xMjU2LDkgKzEyNTksNyBAQAogCQl9CiAJfQogCWlmICghKGNoaXAtPnRlYTU3NXhfdHVuZXIgJiBUVU5FUl9ESVNBQkxFRCkpIHsKLQkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwKLQkJCXNuZF9mbTgwMV90ZWE1NzV4X2dwaW9zWyh0ZWE1NzV4X3R1bmVyICYKLQkJCQkJCSBUVU5FUl9UWVBFX01BU0spIC0gMV0ubmFtZSwKKwkJc3RybGNweShjaGlwLT50ZWEuY2FyZCwgZ2V0X3RlYTU3NXhfZ3BpbyhjaGlwKS0+bmFtZSwKIAkJCXNpemVvZihjaGlwLT50ZWEuY2FyZCkpOwogCX0KICNlbmRpZgpAQCAtMTMxMSw4ICsxMzEyLDkgQEAKIAl9CiAJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19GTTgwMSwKIAkJCQkgICAgICAgRk04MDFfUkVHKGNoaXAsIE1QVTQwMV9EQVRBKSwKLQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkgICAgICAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CisJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCSAgICAgICAtMSwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZSBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKaW5kZXggODczNjVkNS4uZjkyOGQ2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC02LDYgKzYsOSBAQAogc25kLWhkYS1jb2RlYy0kKENPTkZJR19TTkRfSERBX0hXREVQKSArPSBoZGFfaHdkZXAubwogc25kLWhkYS1jb2RlYy0kKENPTkZJR19TTkRfSERBX0lOUFVUX0JFRVApICs9IGhkYV9iZWVwLm8KIAorIyBmb3IgdHJhY2UtcG9pbnRzCitDRkxBR1NfaGRhX2NvZGVjLm8gOj0gLUkkKHNyYykKKwogc25kLWhkYS1jb2RlYy1yZWFsdGVrLW9ianMgOj0JcGF0Y2hfcmVhbHRlay5vCiBzbmQtaGRhLWNvZGVjLWNtZWRpYS1vYmpzIDo9CXBhdGNoX2NtZWRpYS5vCiBzbmQtaGRhLWNvZGVjLWFuYWxvZy1vYmpzIDo9CXBhdGNoX2FuYWxvZy5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzI2MF9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCmluZGV4IDIxZWMyY2IuLjNiNTE3MGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYwX3F1aXJrcy5jCkBAIC03LDkgKzcsNiBAQAogZW51bSB7CiAJQUxDMjYwX0FVVE8sCiAJQUxDMjYwX0JBU0lDLAotCUFMQzI2MF9IUCwKLQlBTEMyNjBfSFBfREM3NjAwLAotCUFMQzI2MF9IUF8zMDEzLAogCUFMQzI2MF9GVUpJVFNVX1M3MDJYLAogCUFMQzI2MF9BQ0VSLAogCUFMQzI2MF9XSUxMLApAQCAtMTQyLDggKzEzOSw2IEBACiAvKiBNaXhlciBjb21iaW5hdGlvbnMKICAqCiAgKiBiYXNpYzogYmFzZV9vdXRwdXQgKyBpbnB1dCArIHBjX2JlZXAgKyBjYXB0dXJlCi0gKiBIUDogYmFzZV9vdXRwdXQgKyBpbnB1dCArIGNhcHR1cmVfYWx0Ci0gKiBIUF8zMDEzOiBocF8zMDEzICsgaW5wdXQgKyBjYXB0dXJlCiAgKiBmdWppdHN1OiBmdWppdHN1ICsgY2FwdHVyZQogICogYWNlcjogYWNlciArIGNhcHR1cmUKICAqLwpAQCAtMTcwLDE0NSArMTY1LDYgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi0vKiB1cGRhdGUgSFAsIGxpbmUgYW5kIG1vbm8gb3V0IHBpbnMgYWNjb3JkaW5nIHRvIHRoZSBtYXN0ZXIgc3dpdGNoICovCi1zdGF0aWMgdm9pZCBhbGMyNjBfaHBfbWFzdGVyX3VwZGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1cGRhdGVfc3BlYWtlcnMoY29kZWMpOwotfQotCi1zdGF0aWMgaW50IGFsYzI2MF9ocF9tYXN0ZXJfc3dfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCSp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSA9ICFzcGVjLT5tYXN0ZXJfbXV0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGMyNjBfaHBfbWFzdGVyX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgdmFsID0gISp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKLQotCWlmICh2YWwgPT0gc3BlYy0+bWFzdGVyX211dGUpCi0JCXJldHVybiAwOwotCXNwZWMtPm1hc3Rlcl9tdXRlID0gdmFsOwotCWFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlKGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9ocF9vdXRwdXRfbWl4ZXJbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLnN1YmRldmljZSA9IEhEQV9TVUJERVZfTklEX0ZMQUcgfCAweDExLAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCi0JCS5nZXQgPSBhbGMyNjBfaHBfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDA4LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDA5LCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBhLCAxLCAweDAsCi0JCQkgICAgICBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYSwgMSwgMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF91bnNvbF92ZXJic1tdID0gewotCXsweDEwLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MGY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDEwOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjBfaHBfMzAxM19taXhlcltdID0gewotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTEsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IGFsYzI2MF9ocF9tYXN0ZXJfc3dfZ2V0LAotCQkucHV0ID0gYWxjMjYwX2hwX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkF1eC1JbiBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA2LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJBdXgtSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDExLCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2MF9ocF8zMDEzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTA7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDExOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2MF9kYzc2MDBfYmluZF9tYXN0ZXJfdm9sID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGEsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGMyNjBfZGM3NjAwX2JpbmRfc3dpdGNoID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxMSwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9ocF9kYzc2MDBfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjMjYwX2RjNzYwMF9iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJMaW5lT3V0IFBsYXliYWNrIFN3aXRjaCIsICZhbGMyNjBfZGM3NjAwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF8zMDEzX3Vuc29sX3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9LAotfTsKLQotc3RhdGljIHZvaWQgYWxjMjYwX2hwXzMwMTJfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDEwOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgwZjsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQogLyogRnVqaXRzdSBTNzAyeCBzZXJpZXMgbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLAogICogSFAgamFjayA9IDB4MTQsIENEIGF1ZGlvID0gIDB4MTYsIGludGVybmFsIHNwZWFrZXIgPSAweDEwLgogICovCkBAIC00ODAsMTA2ICszMzYsNiBAQAogCXsgfQogfTsKIAotI2lmIDAgLyogc2hvdWxkIGJlIGlkZW50aWNhbCB3aXRoIGFsYzI2MF9pbml0X3ZlcmJzPyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfaW5pdF92ZXJic1tdID0gewotCS8qIEhlYWRwaG9uZSBhbmQgb3V0cHV0ICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogbW9ubyBvdXRwdXQgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBNaWMxIChyZWFyIHBhbmVsKSBwaW4gd2lkZ2V0IGZvciBpbnB1dCBhbmQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQkvKiBNaWMyIChmcm9udCBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTGluZSBJbiBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIExpbmUtMiBwaW4gd2lkZ2V0IGZvciBvdXRwdXQgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCS8qIHVubXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwfSwKLQkvKiBzZXQgY29ubmVjdGlvbiBzZWxlY3QgdG8gbGluZSBpbiAoZGVmYXVsdCBzZWxlY3QgZm9yIHRoaXMgQURDKSAqLwotCXsweDA0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogdW5tdXRlIExpbmUtT3V0IG1peGVyIGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKLQkvKiBtdXRlIHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBnYWluIG9uIHRoaXMgYW1wKSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDAwMDB9LAotCS8qIHVubXV0ZSBIUCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJgotCSAqIExpbmUgSW4gMiA9IDB4MDMKLQkgKi8KLQkvKiBtdXRlIGFuYWxvZyBpbnB1dHMgKi8KLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JLyogQW1wIEluZGV4ZXM6IERBQyA9IDB4MDEgJiBtaXhlciA9IDB4MDAgKi8KLQkvKiBVbm11dGUgRnJvbnQgb3V0IHBhdGggKi8KLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBIZWFkcGhvbmUgb3V0IHBhdGggKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCS8qIFVubXV0ZSBNb25vIG91dCBwYXRoICovCi0JezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7IH0KLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzW10gPSB7Ci0JLyogTGluZSBvdXQgYW5kIG91dHB1dCAqLwotCXsweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCS8qIG1vbm8gb3V0cHV0ICovCi0JezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MH0sCi0JLyogTWljMSAocmVhciBwYW5lbCkgcGluIHdpZGdldCBmb3IgaW5wdXQgYW5kIHZyZWYgYXQgODAlICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0JLyogTWljMiAoZnJvbnQgcGFuZWwpIHBpbiB3aWRnZXQgZm9yIGlucHV0IGFuZCB2cmVmIGF0IDgwJSAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCS8qIExpbmUgSW4gcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiBIZWFkcGhvbmUgcGluIHdpZGdldCBmb3Igb3V0cHV0ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQkvKiB1bm11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMH0sCi0JLyogc2V0IGNvbm5lY3Rpb24gc2VsZWN0IHRvIGxpbmUgaW4gKGRlZmF1bHQgc2VsZWN0IGZvciB0aGlzIEFEQykgKi8KLQl7MHgwNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDJ9LAotCS8qIHVubXV0ZSBMaW5lLU91dCBtaXhlciBhbXAgbGVmdCBhbmQgcmlnaHQgKHZvbHVtZSA9IDApICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCi0JLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiB1bm11dGUgSFAgbWl4ZXIgYW1wIGxlZnQgYW5kIHJpZ2h0ICh2b2x1bWUgPSAwKSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAotCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCi0JLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKLQkgKiBMaW5lIEluIDIgPSAweDAzCi0JICovCi0JLyogbXV0ZSBhbmFsb2cgaW5wdXRzICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIEFtcCBJbmRleGVzOiBEQUMgPSAweDAxICYgbWl4ZXIgPSAweDAwICovCi0JLyogVW5tdXRlIEZyb250IG91dCBwYXRoICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgSGVhZHBob25lIG91dCBwYXRoICovCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQkvKiBVbm11dGUgTW9ubyBvdXQgcGF0aCAqLwotCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JeyB9Ci19OwotCiAvKiBJbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBmb3IgQUxDMjYwIGFzIGNvbmZpZ3VyZWQgaW4gRnVqaXRzdSBTNzAyeAogICogbGFwdG9wcy4gIEFMQzI2MCBwaW4gdXNhZ2U6IE1pYy9MaW5lIGphY2sgPSAweDEyLCBIUCBqYWNrID0gMHgxNCwgQ0QKICAqIGF1ZGlvID0gMHgxNiwgaW50ZXJuYWwgc3BlYWtlciA9IDB4MTAuCkBAIC0xMDkzLDkgKzg0OSw2IEBACiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjYwX21vZGVsc1tBTEMyNjBfTU9ERUxfTEFTVF0gPSB7CiAJW0FMQzI2MF9CQVNJQ10JCT0gImJhc2ljIiwKLQlbQUxDMjYwX0hQXQkJPSAiaHAiLAotCVtBTEMyNjBfSFBfMzAxM10JPSAiaHAtMzAxMyIsCi0JW0FMQzI2MF9IUF9EQzc2MDBdCT0gImhwLWRjNzYwMCIsCiAJW0FMQzI2MF9GVUpJVFNVX1M3MDJYXQk9ICJmdWppdHN1IiwKIAlbQUxDMjYwX0FDRVJdCQk9ICJhY2VyIiwKIAlbQUxDMjYwX1dJTExdCQk9ICJ3aWxsIiwKQEAgLTExMTIsMTUgKzg2NSw2IEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA3ZiwgIkFjZXIiLCBBTEMyNjBfV0lMTCksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDA4ZiwgIkFjZXIiLCBBTEMyNjBfQUNFUiksCiAJU05EX1BDSV9RVUlSSygweDE1MDksIDB4NDU0MCwgIkZhdm9yaXQgMTAwWFMiLCBBTEMyNjBfRkFWT1JJVDEwMCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MjgwOCwgIkhQIGQ1NzAwIiwgQUxDMjYwX0hQXzMwMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MGEsICJIUCBkNTc1MCIsIEFMQzI2MF9BVVRPKSwgLyogbm8gcXVpcmsgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDEwLCAiSFAiLCBBTEMyNjBfSFBfMzAxMyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxMSwgIkhQIiwgQUxDMjYwX0hQXzMwMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTIsICJIUCIsIEFMQzI2MF9IUF9EQzc2MDApLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTMsICJIUCIsIEFMQzI2MF9IUF8zMDEzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDE0LCAiSFAiLCBBTEMyNjBfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCIsIEFMQzI2MF9IUCksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNiwgIkhQIiwgQUxDMjYwX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWJiLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNjLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MWNkLCAiU29ueSBWQUlPIiwgQUxDMjYwX0JBU0lDKSwKQEAgLTExNDQsNTQgKzg4OCw2IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAogCX0sCi0JW0FMQzI2MF9IUF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2MF9ocF9vdXRwdXRfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaW5pdF92ZXJicywKLQkJCQlhbGMyNjBfaHBfdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjBfSFBfREM3NjAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwX2RjNzYwMF9taXhlciwKLQkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2MF9pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF9kYzc2MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHNfYWx0LAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2MF9ocF8zMDEyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2MF9IUF8zMDEzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYwX2hwXzMwMTNfbWl4ZXIsCi0JCQkgICAgYWxjMjYwX2lucHV0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaHBfMzAxM19pbml0X3ZlcmJzLAotCQkJCWFsYzI2MF9ocF8zMDEzX3Vuc29sX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjYwX2FkY19uaWRzX2FsdCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjBfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjYwX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjBfaHBfMzAxM19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAogCVtBTEMyNjBfRlVKSVRTVV9TNzAyWF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2MF9mdWppdHN1X21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfZnVqaXRzdV9pbml0X3ZlcmJzIH0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzI2Ml9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCmluZGV4IDhkMjA5N2QuLjc4OTRiMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjMjYyX3F1aXJrcy5jCkBAIC0xMCwxMyArMTAsNyBAQAogCUFMQzI2Ml9ISVBQTywKIAlBTEMyNjJfSElQUE9fMSwKIAlBTEMyNjJfRlVKSVRTVSwKLQlBTEMyNjJfSFBfQlBDLAotCUFMQzI2Ml9IUF9CUENfRDcwMDBfV0wsCi0JQUxDMjYyX0hQX0JQQ19ENzAwMF9XRiwKLQlBTEMyNjJfSFBfVENfVDU3MzUsCi0JQUxDMjYyX0hQX1JQNTcwMCwKIAlBTEMyNjJfQkVOUV9FRDgsCi0JQUxDMjYyX1NPTllfQVNTQU1ELAogCUFMQzI2Ml9CRU5RX1QzMSwKIAlBTEMyNjJfVUxUUkEsCiAJQUxDMjYyX0xFTk9WT18zMDAwLApAQCAtNjYsMTYzICs2MCwzMCBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLS8qIHVwZGF0ZSBIUCwgbGluZSBhbmQgbW9uby1vdXQgcGlucyBhY2NvcmRpbmcgdG8gdGhlIG1hc3RlciBzd2l0Y2ggKi8KLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl91cGRhdGUJCWFsYzI2MF9ocF9tYXN0ZXJfdXBkYXRlCi0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF9icGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAkJYWxjMjYwX2hwX21hc3Rlcl9zd19nZXQKLSNkZWZpbmUgYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQJCWFsYzI2MF9ocF9tYXN0ZXJfc3dfcHV0Ci0KLSNkZWZpbmUgQUxDMjYyX0hQX01BU1RFUl9TV0lUQ0gJCQkJCVwKLQl7CQkJCQkJCVwKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQlcCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAkJXAotCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCQlcCi0JCS5nZXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X2dldCwJCQlcCi0JCS5wdXQgPSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dCwJCQlcCi0JfSwgXAotCXsJCQkJCQkJXAotCQkuaWZhY2UgPSBOSURfTUFQUElORywJCQkJXAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwJCVwKLQkJLnByaXZhdGVfdmFsdWUgPSAweDE1IHwgKDB4MTYgPDwgOCkgfCAoMHgxYiA8PCAxNiksCVwKLQl9Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJBVVggSU4gUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQVVYIElOIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDYsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSFBfTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZSwgMiwgMHgwLAotCQkJICAgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAyLCAweDAsCi0JCQkgICAgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJSZWFyIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiUmVhciBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjYyX2hwX3Q1NzM1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCi0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2hwX3Q1NzM1X21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfdDU3MzVfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9ocF9ycDU3MDBfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjJfaHBfcnA1NzAwX3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAwIDw8IDgpKX0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfaHBfcnA1NzAwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxLAotCS5pdGVtcyA9IHsKLQkJeyAiTGluZSIsIDB4MSB9LAotCX0sCi19OwotCiAvKiBiaW5kIGhwIGFuZCBpbnRlcm5hbCBzcGVha2VyIG11dGUgKHdpdGggcGx1ZyBjaGVjaykgYXMgbWFzdGVyIHN3aXRjaCAqLwotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3VwZGF0ZQlhbGMyNjJfaHBfbWFzdGVyX3VwZGF0ZQotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldAlhbGMyNjJfaHBfbWFzdGVyX3N3X2dldAotI2RlZmluZSBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X3B1dAlhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAorCitzdGF0aWMgaW50IGFsYzI2Ml9oaXBwb19tYXN0ZXJfc3dfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCSp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSA9ICFzcGVjLT5tYXN0ZXJfbXV0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCB2YWwgPSAhKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOworCisJaWYgKHZhbCA9PSBzcGVjLT5tYXN0ZXJfbXV0ZSkKKwkJcmV0dXJuIDA7CisJc3BlYy0+bWFzdGVyX211dGUgPSB2YWw7CisJdXBkYXRlX291dHB1dHMoY29kZWMpOworCXJldHVybiAxOworfQogCiAjZGVmaW5lIEFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENICQkJCVwKIAl7CQkJCQkJCVwKQEAgLTIzOSw2ICsxMDAsOSBAQAogCQkJICAgICAoU1VCREVWX1NQRUFLRVIoMCkgPDwgMTYpLCBcCiAJfQogCisjZGVmaW5lIGFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0CQlhbGMyNjJfaGlwcG9fbWFzdGVyX3N3X2dldAorI2RlZmluZSBhbGMyNjJfaHBfbWFzdGVyX3N3X3B1dAkJYWxjMjYyX2hpcHBvX21hc3Rlcl9zd19wdXQKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2Ml9oaXBwb19taXhlcltdID0gewogCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAogCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTI3OSw4ICsxNDMsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzI2Ml9oaXBwbzFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0yODksOCArMTUyLDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAKQEAgLTM1Myw4ICsyMTUsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIApAQCAtNDk2LDggKzM1Nyw3IEBACiAJc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwogCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKIAlzcGVjLT5hdXRvX21pYyA9IDE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX1BJTik7CiB9CiAKIC8qCkBAIC01NzEsMjcgKzQzMSw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfSFBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDUsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQkJeyAiQVVYIElOIiwgMHg2IH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgyIH0sCi0JCXsgIkxpbmUiLCAweDEgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQogc3RhdGljIHZvaWQgYWxjMjYyX2Z1aml0c3Vfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC01OTksOCArNDM4LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwYyBhbmQgMHgwZCAqLwpAQCAtNjQ2LDggKzQ4NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYyX2xlbm92b18zMDAwX21peGVyW10gPSB7CkBAIC03NTIsOCArNTg5LDggQEAKIAltdXRlID0gMDsKIAkvKiBhdXRvLW11dGUgb25seSB3aGVuIEhQIGlzIHVzZWQgYXMgSFAgKi8KIAlpZiAoIXNwZWMtPmN1cl9tdXhbMF0pIHsKLQkJc3BlYy0+amFja19wcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxNSk7Ci0JCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpCisJCXNwZWMtPmhwX2phY2tfcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MTUpOworCQlpZiAoc3BlYy0+aHBfamFja19wcmVzZW50KQogCQkJbXV0ZSA9IEhEQV9BTVBfTVVURTsKIAl9CiAJLyogbXV0ZS91bm11dGUgaW50ZXJuYWwgc3BlYWtlciAqLwpAQCAtODE3LDIwNiArNjU0LDYgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml9IUF9CUENfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAtMiBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogTXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawotCSAqIG1peGVyIHdpZGdldAotCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yCi0JICogZnJvbnQgcGFuZWwgbWljIChtaWMgMikKLQkgKi8KLQkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sCi0gICAgICAgIHsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg2KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDBjIC0gMHgwZSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNH0sCi0gICAgICAgIHsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLSAgICAgICAgezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDAwIH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCi0KLQkvKiBGSVhNRTogdXNlIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWMsIDFkLCAxNCwgMTUsIDBiLCAxMiAqLwotCS8qIElucHV0IG1peGVyMTogb25seSB1bm11dGUgTWljICovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0JLyogSW5wdXQgbWl4ZXIzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA1IDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwNiA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDcgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA4IDw8IDgpKX0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMC0yIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0KLQkvKiBNdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCi0JICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQKLQkgKiBwYW5lbCBtaWMgKG1pYyAyKQotCSAqLwotCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDIpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg0KX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg3KX0sCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGUpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAkvKiBIUCAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwJLyogTW9ubyAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogcmVhciBNSUMgKi8KLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwJLyogTGluZSBpbiAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwJLyogRnJvbnQgTUlDICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBMaW5lIG91dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAkvKiBDRCBpbiAqLwotCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0KLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0KLQkvKiB7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sICovCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHg3MDIzIH0sCi0JezB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4NzAwMCB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMDAgfSwKLQotCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLwotCS8qIElucHV0IG1peGVyMTogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDAgPDwgOCkpfSwgLypyZWFyIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LCAvKkxpbmUgaW4qLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwgLypGIE1JQyovCi0JezB4MjQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LCAvKkZyb250Ki8KLQl7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA0IDw8IDgpKX0sIC8qQ0QqLwotICAgICAgICAvKiB7MHgyNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICAqLwotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwgLypIUCovCi0JLyogSW5wdXQgbWl4ZXIyICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMCA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDEgPDwgOCkpfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAyIDw8IDgpKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMyA8PCA4KSl9LAotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKLSAgICAgICAgLyogezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNiA8PCA4KSl9LCAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDcgPDwgOCkpfSwKLQkvKiBJbnB1dCBtaXhlcjMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAzIDw8IDgpKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAotICAgICAgICAvKiB7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDA2IDw8IDgpKX0sICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNyA8PCA4KSl9LAotCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9Ci19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2Ml90b3NoaWJhX3J4MV91bnNvbF92ZXJic1tdID0gewogCiAJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAkvKiBGcm9udCBTcGVha2VyICovCkBAIC0xMDQyLDEzICs2NzksOCBAQAogCVtBTEMyNjJfSElQUE9dCQk9ICJoaXBwbyIsCiAJW0FMQzI2Ml9ISVBQT18xXQk9ICJoaXBwb18xIiwKIAlbQUxDMjYyX0ZVSklUU1VdCT0gImZ1aml0c3UiLAotCVtBTEMyNjJfSFBfQlBDXQkJPSAiaHAtYnBjIiwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XTF09ICJocC1icGMtZDcwMDAiLAotCVtBTEMyNjJfSFBfVENfVDU3MzVdCT0gImhwLXRjLXQ1NzM1IiwKLQlbQUxDMjYyX0hQX1JQNTcwMF0JPSAiaHAtcnA1NzAwIiwKIAlbQUxDMjYyX0JFTlFfRUQ4XQk9ICJiZW5xIiwKIAlbQUxDMjYyX0JFTlFfVDMxXQk9ICJiZW5xLXQzMSIsCi0JW0FMQzI2Ml9TT05ZX0FTU0FNRF0JPSAic29ueS1hc3NhbWQiLAogCVtBTEMyNjJfVE9TSElCQV9TMDZdCT0gInRvc2hpYmEtczA2IiwKIAlbQUxDMjYyX1RPU0hJQkFfUlgxXQk9ICJ0b3NoaWJhLXJ4MSIsCiAJW0FMQzI2Ml9VTFRSQV0JCT0gInVsdHJhIiwKQEAgLTEwNjEsNDEgKzY5Myw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjYyX2NmZ190YmxbXSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTAwMiwgMHg0MzdiLCAiSGlwcG8iLCBBTEMyNjJfSElQUE8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDMzLCAweDg4OTUsICJORUMgVmVyc2EgUzkxMDAiLCBBTEMyNjJfTkVDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTIwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTMwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTUwMCwgIkhQIHogc2VyaWVzIiwKLQkJCSAgIEFMQzI2Ml9IUF9CUEMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDE3MGIsICJIUCBaMjAwIiwKLQkJCSAgIEFMQzI2Ml9BVVRPKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDNjLCAweGZmMDAsIDB4MTcwMCwgIkhQIHh3IHNlcmllcyIsCi0JCQkgICBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAwLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAxLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAyLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODAzLCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA0LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA1LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA2LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODA3LCAiSFAgRDcwMDAiLCBBTEMyNjJfSFBfQlBDX0Q3MDAwX1dGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyODBjLCAiSFAgeHc0NDAwIiwgQUxDMjYyX0hQX0JQQyksCi0JU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzAxNCwgIkhQIHh3NjQwMCIsIEFMQzI2Ml9IUF9CUEMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMTUsICJIUCB4dzg0MDAiLCBBTEMyNjJfSFBfQlBDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDJmLCAiSFAgVGhpbiBDbGllbnQgVDU3MzUiLAotCQkgICAgICBBTEMyNjJfSFBfVENfVDU3MzUpLAotCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDI4MTcsICJIUCBSUDU3MDAiLCBBTEMyNjJfSFBfUlA1NzAwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHgxZjAwLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgyMDMsICJTb255IFVYLTkwIiwgQUxDMjYyX0hJUFBPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg4MjBmLCAiU29ueSBBU1NBTUQiLCBBTEMyNjJfU09OWV9BU1NBTUQpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwMTYsICJTb255IFZBSU8iLCBBTEMyNjJfQVVUTyksIC8qIGRpZy1vbmx5ICovCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAyNSwgIlNvbnkgVkFJTyBaMjFNTiIsIEFMQzI2Ml9UT1NISUJBX1MwNiksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTAzNSwgIlNvbnkgVkFJTyBWR04tRlcxNzBKIiwgQUxDMjYyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNDcsICJTb255IFZBSU8gVHlwZSBHIiwgQUxDMjYyX0FVVE8pLAotI2lmIDAgLyogZGlzYWJsZSB0aGUgcXVpcmsgc2luY2UgbW9kZWw9YXV0byB3b3JrcyBiZXR0ZXIgaW4gcmVjZW50IHZlcnNpb25zICovCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTA0ZCwgMHhmZjAwLCAweDkwMDAsICJTb255IFZBSU8iLAotCQkJICAgQUxDMjYyX1NPTllfQVNTQU1EKSwKLSNlbmRpZgogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweDAwMDEsICJUb3NoaWJhIGR5bmFib29rIFNTIFJYMSIsCiAJCSAgICAgIEFMQzI2Ml9UT1NISUJBX1JYMSksCiAJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmY3YiwgIlRvc2hpYmEgUzA2IiwgQUxDMjYyX1RPU0hJQkFfUzA2KSwKQEAgLTExNjYsNjggKzc2Myw2IEBACiAJCS5zZXR1cCA9IGFsYzI2Ml9mdWppdHN1X3NldHVwLAogCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAogCX0sCi0JW0FMQzI2Ml9IUF9CUENdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF9icGNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjYyX0hQX0JQQ19ENzAwMF9XRl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9IUF9CUENfV2lsZFdlc3RfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9ENzAwMF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hwX3dpbGR3ZXN0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0xdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyLAotCQkJICAgIGFsYzI2Ml9IUF9CUENfV2lsZFdlc3Rfb3B0aW9uX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfSFBfRDcwMDBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF93aWxkd2VzdF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfVENfVDU3MzVdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjJfaHBfdDU3MzVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2Ml9pbml0X3ZlcmJzLCBhbGMyNjJfaHBfdDU3MzVfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYyX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2Ml9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjJfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2Ml9ocF90NTczNV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjJfSFBfUlA1NzAwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjYyX2hwX3JwNTcwMF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9ocF9ycDU3MDBfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9ocF9ycDU3MDBfY2FwdHVyZV9zb3VyY2UsCi0gICAgICAgIH0sCiAJW0FMQzI2Ml9CRU5RX0VEOF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMgfSwKQEAgLTEyMzgsMTkgKzc3Myw2IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX2NhcHR1cmVfc291cmNlLAogCX0sCi0JW0FMQzI2Ml9TT05ZX0FTU0FNRF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2Ml9zb255X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX3NvbnlfdW5zb2xfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2Ml9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjYyX2hpcHBvX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCiAJW0FMQzI2Ml9CRU5RX1QzMV0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9iZW5xX3QzMV9taXhlciB9LAogCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYyX2luaXRfdmVyYnMsIGFsYzI2Ml9iZW5xX3QzMV9FQVBEX3ZlcmJzLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGMyNjhfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzI2OF9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ODc2Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzI2OF9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKgotICogQUxDMjY3L0FMQzI2OCBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzI2OCBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2OF9BVVRPLAotCUFMQzI2N19RVUFOVEFfSUwxLAotCUFMQzI2OF8zU1QsCi0JQUxDMjY4X1RPU0hJQkEsCi0JQUxDMjY4X0FDRVIsCi0JQUxDMjY4X0FDRVJfRE1JQywKLQlBTEMyNjhfQUNFUl9BU1BJUkVfT05FLAotCUFMQzI2OF9ERUxMLAotCUFMQzI2OF9aRVBUTywKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JQUxDMjY4X1RFU1QsCi0jZW5kaWYKLQlBTEMyNjhfTU9ERUxfTEFTVCAvKiBsYXN0IHRhZyAqLwotfTsKLQotLyoKLSAqICBBTEMyNjggY2hhbm5lbCBzb3VyY2Ugc2V0dGluZyAoMiBjaGFubmVsKQotICovCi0jZGVmaW5lIEFMQzI2OF9ESUdPVVRfTklECUFMQzg4MF9ESUdPVVRfTklECi0jZGVmaW5lIGFsYzI2OF9tb2RlcwkJYWxjMjYwX21vZGVzCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2RhY19uaWRzWzJdID0gewotCS8qIGZyb250LCBocCAqLwotCTB4MDIsIDB4MDMKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2FkY19uaWRzWzJdID0gewotCS8qIEFEQzAtMSAqLwotCTB4MDgsIDB4MDcKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY4X2FkY19uaWRzX2FsdFsxXSA9IHsKLQkvKiBBREMwICovCi0JMHgwOAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjhfY2Fwc3JjX25pZHNbMl0gPSB7IDB4MjMsIDB4MjQgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9iYXNlX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF90b3NoaWJhX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9lYXBkX3ZlcmJzW10gPSB7Ci0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotLyogVG9zaGliYSBzcGVjaWZpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfdG9zaGliYV92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBBY2VyIHNwZWNpZmljICovCi0vKiBiaW5kIHZvbHVtZXMgb2YgYm90aCBOSUQgMHgwMiBhbmQgMHgwMyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF92b2wsCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAyLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDAzLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjhfYWNlcl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotI2RlZmluZSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfZ2V0CWFsYzI2Ml9ocF9tYXN0ZXJfc3dfZ2V0Ci0jZGVmaW5lIGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQJYWxjMjYyX2hwX21hc3Rlcl9zd19wdXQKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9OSURfRkxBRyB8IDB4MTUsCi0JCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfYWNlcl9taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2FjZXJfZG1pY19taXhlcltdID0gewotCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzI2OF9hY2VyX2JpbmRfbWFzdGVyX3ZvbCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCS5zdWJkZXZpY2UgPSBIREFfU1VCREVWX05JRF9GTEFHIHwgMHgxNCwKLQkJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAotCQkuZ2V0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X2dldCwKLQkJLnB1dCA9IGFsYzI2OF9hY2VyX21hc3Rlcl9zd19wdXQsCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDA2fSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhhMDE3fSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2FjZXJfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAvKiBpbnRlcm5hbCBkbWljPyAqLwotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9Ci19OwotCi0vKiB1bnNvbGljaXRlZCBldmVudCBmb3IgSFAgamFjayBzZW5zaW5nICovCi0jZGVmaW5lIGFsYzI2OF90b3NoaWJhX3NldHVwCQlhbGMyNjJfaGlwcG9fc2V0dXAKLQotc3RhdGljIHZvaWQgYWxjMjY4X2FjZXJfbGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY4X2RlbGxfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY4X2RlbGxfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JeyB9Ci19OwotCi0vKiBtdXRlL3VubXV0ZSBpbnRlcm5hbCBzcGVha2VyIGFjY29yZGluZyB0byB0aGUgaHAgamFjayBhbmQgbXV0ZSBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjMjY4X2RlbGxfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjdfcXVhbnRhX2lsMV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAyLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY3X3F1YW50YV9pbDFfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX01JQ19FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyB2b2lkIGFsYzI2N19xdWFudGFfaWwxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLX0KLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyogVW5tdXRlIERBQzAtMSBhbmQgc2V0IHZvbCA9IDAgKi8KLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MGMgLSAweDBlKQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjR9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjB9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0KLQkvKiBzZXQgUENCRUVQIHZvbCA9IDAsIG11dGUgY29ubmVjdGlvbnMgKi8KLQl7MHgxZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCi0JLyogVW5tdXRlIFNlbGVjdG9yIDIzaCwyNGggYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4gKi8KLQotCXsweDIzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDI0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQl7IH0KLX07Ci0KLS8qIG9ubHkgZm9yIG1vZGVsPXRlc3QgKi8KLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OF92b2x1bWVfaW5pdF92ZXJic1tdID0gewotCS8qIHNldCBvdXRwdXQgREFDICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0fSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwfSwKLQotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19TTkRfREVCVUcgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX25vc3JjX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCV9ERUZJTkVfQ0FQU1JDKDEpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgyMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfSURYKCJDYXB0dXJlIFN3aXRjaCIsIDEsIDB4MjQsIDB4MCwgSERBX09VVFBVVCksCi0JX0RFRklORV9DQVBTUkMoMiksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2OF9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNCwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDEgfSwKLQkJeyAiTGluZSIsIDB4MiB9LAotCQl7ICJDRCIsIDB4MyB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjMjY4X2FjZXJfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI2OF9hY2VyX2RtaWNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50ZXJuYWwgTWljIiwgMHg2IH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotI2lmZGVmIENPTkZJR19TTkRfREVCVUcKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjhfdGVzdF9taXhlcltdID0gewotCS8qIFZvbHVtZSB3aWRnZXRzICovCi0JSERBX0NPREVDX1ZPTFVNRSgiTE9VVDEgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMT1VUMiBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiTW9ubyBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJMSU5FLU9VVCBzdW0gUGxheWJhY2sgU3dpdGNoIiwgMHgwZiwgMiwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJIUC1PVVQgc3VtIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDIsIEhEQV9JTlBVVCksCi0JSERBX0JJTkRfTVVURSgiTElORS1PVVQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMiwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiSFAtT1VUIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDIsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTUlDMSBDYXB0dXJlIFZvbHVtZSIsIDB4MTgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJNSUMxIENhcHR1cmUgU3dpdGNoIiwgMHgxOCwgMiwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTUlDMiBDYXB0dXJlIFZvbHVtZSIsIDB4MTksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMSU5FMSBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQklORF9NVVRFKCJMSU5FMSBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDIsIEhEQV9PVVRQVVQpLAotCS8qIFRoZSBiZWxvdyBhcHBlYXJzIHByb2JsZW1hdGljIG9uIHNvbWUgaGFyZHdhcmVzICovCi0JLypIREFfQ09ERUNfVk9MVU1FKCJQQ0JFRVAgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfSU5QVVQpLCovCi0JSERBX0NPREVDX1ZPTFVNRSgiUENNLUlOMSBDYXB0dXJlIFZvbHVtZSIsIDB4MjMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiUENNLUlOMSBDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDIsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlBDTS1JTjIgQ2FwdHVyZSBWb2x1bWUiLCAweDI0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlBDTS1JTjIgQ2FwdHVyZSBTd2l0Y2giLCAweDI0LCAyLCBIREFfT1VUUFVUKSwKLQotCS8qIE1vZGVzIGZvciByZXRhc2tpbmcgcGluIHdpZGdldHMgKi8KLQlBTENfUElOX01PREUoIkxJTkUtT1VUIHBpbiBtb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiSFAtT1VUIHBpbiBtb2RlIiwgMHgxNSwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCUFMQ19QSU5fTU9ERSgiTUlDMSBwaW4gbW9kZSIsIDB4MTgsIEFMQ19QSU5fRElSX0lOT1VUKSwKLQlBTENfUElOX01PREUoIkxJTkUxIHBpbiBtb2RlIiwgMHgxYSwgQUxDX1BJTl9ESVJfSU5PVVQpLAotCi0JLyogQ29udHJvbHMgZm9yIEdQSU8gcGlucywgYXNzdW1pbmcgdGhleSBhcmUgY29uZmlndXJlZCBhcyBvdXRwdXRzICovCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDAiLCAweDAxLCAweDAxKSwKLQlBTENfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMSIsIDB4MDEsIDB4MDIpLAotCUFMQ19HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAyIiwgMHgwMSwgMHgwNCksCi0JQUxDX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDMiLCAweDAxLCAweDA4KSwKLQotCS8qIFN3aXRjaGVzIHRvIGFsbG93IHRoZSBkaWdpdGFsIFNQRElGIG91dHB1dCBwaW4gdG8gYmUgZW5hYmxlZC4KLQkgKiBUaGUgQUxDMjY4IGRvZXMgbm90IGhhdmUgYW4gU1BESUYgaW5wdXQuCi0JICovCi0JQUxDX1NQRElGX0NUUkxfU1dJVENIKCJTUERJRiBQbGF5YmFjayBTd2l0Y2giLCAweDA2LCAweDAxKSwKLQotCS8qIEEgc3dpdGNoIGFsbG93aW5nIEVBUEQgdG8gYmUgZW5hYmxlZC4gIFNvbWUgbGFwdG9wcyBzZWVtIHRvIHVzZQotCSAqIHRoaXMgb3V0cHV0IHRvIHR1cm4gb24gYW4gZXh0ZXJuYWwgYW1wbGlmaWVyLgotCSAqLwotCUFMQ19FQVBEX0NUUkxfU1dJVENIKCJMSU5FLU9VVCBFQVBEIEVuYWJsZSBTd2l0Y2giLCAweDBmLCAweDAyKSwKLQlBTENfRUFQRF9DVFJMX1NXSVRDSCgiSFAtT1VUIEVBUEQgRW5hYmxlIFN3aXRjaCIsIDB4MTAsIDB4MDIpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLSNlbmRpZgotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjMjY4X21vZGVsc1tBTEMyNjhfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzI2N19RVUFOVEFfSUwxXQk9ICJxdWFudGEtaWwxIiwKLQlbQUxDMjY4XzNTVF0JCT0gIjNzdGFjayIsCi0JW0FMQzI2OF9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKLQlbQUxDMjY4X0FDRVJdCQk9ICJhY2VyIiwKLQlbQUxDMjY4X0FDRVJfRE1JQ10JPSAiYWNlci1kbWljIiwKLQlbQUxDMjY4X0FDRVJfQVNQSVJFX09ORV0JPSAiYWNlci1hc3BpcmUiLAotCVtBTEMyNjhfREVMTF0JCT0gImRlbGwiLAotCVtBTEMyNjhfWkVQVE9dCQk9ICJ6ZXB0byIsCi0jaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCVtBTEMyNjhfVEVTVF0JCT0gInRlc3QiLAotI2VuZGlmCi0JW0FMQzI2OF9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY4X2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTFlLCAiQWNlciBBc3BpcmUgNTcyMHoiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyNiwgIkFjZXIiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyZSwgIkFjZXIgQXNwaXJlIDUzMTAiLCBBTEMyNjhfQUNFUiksCi0JU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEzMCwgIkFjZXIgRXh0ZW5zYSA1MjEwIiwgQUxDMjY4X0FDRVIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxMzYsICJBY2VyIEFzcGlyZSA1MzE1IiwgQUxDMjY4X0FDRVIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxNWIsICJBY2VyIEFzcGlyZSBPbmUiLAotCQkJCQkJQUxDMjY4X0FDRVJfQVNQSVJFX09ORSksCi0JU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDI1MywgIkRlbGwgT0VNIiwgQUxDMjY4X0RFTEwpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyYjAsICJEZWxsIEluc3Bpcm9uIDkxMCIsIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLX01BU0soMHgxMDI4LCAweGZmZjAsIDB4MDJiMCwKLQkJCSJEZWxsIEluc3Bpcm9uIE1pbmk5L1Zvc3RybyBBOTAiLCBBTEMyNjhfREVMTCksCi0JLyogYWxtb3N0IGNvbXBhdGlibGUgd2l0aCB0b3NoaWJhIGJ1dCB3aXRoIG9wdGlvbmFsIGRpZ2l0YWwgb3V0czsKLQkgKiBhdXRvLXByb2Jpbmcgc2VlbXMgd29ya2luZyBmaW5lCi0JICovCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTAzYywgMHhmZjAwLCAweDMwMDAsICJIUCBUWDI1eHggc2VyaWVzIiwKLQkJCSAgIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEMyNjhfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3MCwgMHgwMDQwLCAiWkVQVE8iLCBBTEMyNjhfWkVQVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxNGMwLCAweDAwMjUsICJDT01QQUwgSUZMOTAvSkZMLTkyIiwgQUxDMjY4X1RPU0hJQkEpLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3NzEsICJRdWFudGEgSUwxIiwgQUxDMjY3X1FVQU5UQV9JTDEpLAotCXt9Ci19OwotCi0vKiBUb3NoaWJhIGxhcHRvcHMgaGF2ZSBubyB1bmlxdWUgUENJIFNTSUQgYnV0IG9ubHkgY29kZWMgU1NJRCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OF9zc2lkX2NmZ190YmxbXSA9IHsKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjBhLCAiVE9TSElCQSBYLTIwMCIsIEFMQzI2OF9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjBlLCAiVE9TSElCQSBYLTIwMCBIRE1JIiwgQUxDMjY4X0FVVE8pLAotCVNORF9QQ0lfUVVJUktfTUFTSygweDExNzksIDB4ZmYwMCwgMHhmZjAwLCAiVE9TSElCQSBBL0x4MDUiLAotCQkJICAgQUxDMjY4X1RPU0hJQkEpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2OF9wcmVzZXRzW10gPSB7Ci0JW0FMQzI2N19RVUFOVEFfSUwxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY3X3F1YW50YV9pbDFfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2N19xdWFudGFfaWwxX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjdfcXVhbnRhX2lsMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfM1NUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X2Jhc2VfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9hbHRfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotICAgICAgICAgICAgICAgIC5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotICAgICAgICAgICAgICAgIC5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzI2OF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDMjY4X1RPU0hJQkFdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfdG9zaGliYV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF90b3NoaWJhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfdG9zaGliYV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX21peGVyLCBhbGMyNjhfYmVlcF9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjY4X2NhcHR1cmVfYWx0X21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X2FjZXJfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAyLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjhfYWNlcl9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2FjZXJfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X0FDRVJfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OF9hY2VyX2RtaWNfbWl4ZXIsIGFsYzI2OF9iZWVwX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9hbHRfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzLCBhbGMyNjhfZWFwZF92ZXJicywKLQkJCQlhbGMyNjhfYWNlcl92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9hY2VyX2RtaWNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OF9hY2VyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI2OF9BQ0VSX0FTUElSRV9PTkVdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfYWNlcl9hc3BpcmVfb25lX21peGVyLCBhbGMyNjhfYmVlcF9taXhlcn0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjhfY2FwdHVyZV9ub3NyY19taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF9hY2VyX2FzcGlyZV9vbmVfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY4X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X2FjZXJfbGNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY4X0RFTExdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfZGVsbF9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXJ9LAotCQkuY2FwX21peGVyID0gYWxjMjY4X2NhcHR1cmVfbm9zcmNfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjhfYmFzZV9pbml0X3ZlcmJzLCBhbGMyNjhfZWFwZF92ZXJicywKLQkJCQlhbGMyNjhfZGVsbF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OF9kYWNfbmlkcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2FkY19uaWRzX2FsdCksCi0JCS5hZGNfbmlkcyA9IGFsYzI2OF9hZGNfbmlkc19hbHQsCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2OF9jYXBzcmNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDIsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjhfZGVsbF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjhfWkVQVE9dID0gewotCQkubWl4ZXJzID0geyBhbGMyNjhfYmFzZV9taXhlciwgYWxjMjY4X2JlZXBfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX2FsdF9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OF9iYXNlX2luaXRfdmVyYnMsIGFsYzI2OF9lYXBkX3ZlcmJzLAotCQkJCWFsYzI2OF90b3NoaWJhX3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY4X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY4X2RhY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjhfYWRjX25pZHNfYWx0KSwKLQkJLmFkY19uaWRzID0gYWxjMjY4X2FkY19uaWRzX2FsdCwKLQkJLmNhcHNyY19uaWRzID0gYWxjMjY4X2NhcHNyY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRpZ19vdXRfbmlkID0gQUxDMjY4X0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjhfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY4X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OF9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY4X3Rvc2hpYmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLSNpZmRlZiBDT05GSUdfU05EX0RFQlVHCi0JW0FMQzI2OF9URVNUXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY4X3Rlc3RfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY4X2Jhc2VfaW5pdF92ZXJicywgYWxjMjY4X2VhcGRfdmVyYnMsCi0JCQkJYWxjMjY4X3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OF9iZWVwX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjhfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjhfZGFjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2OF9hZGNfbmlkc19hbHQpLAotCQkuYWRjX25pZHMgPSBhbGMyNjhfYWRjX25pZHNfYWx0LAotCQkuY2Fwc3JjX25pZHMgPSBhbGMyNjhfY2Fwc3JjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGlnX291dF9uaWQgPSBBTEMyNjhfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjhfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjMjY4X2NhcHR1cmVfc291cmNlLAotCX0sCi0jZW5kaWYKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjMjY5X3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGMyNjlfcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYzBlMjEuLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL2hkYS9hbGMyNjlfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotLyoKLSAqIEFMQzI2OS9BTEMyNzAvQUxDMjc1L0FMQzI3NiBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzI2OSBtb2RlbHMgKi8KLWVudW0gewotCUFMQzI2OV9BVVRPLAotCUFMQzI2OV9CQVNJQywKLQlBTEMyNjlfUVVBTlRBX0ZMMSwKLQlBTEMyNjlfQU1JQywKLQlBTEMyNjlfRE1JQywKLQlBTEMyNjlWQl9BTUlDLAotCUFMQzI2OVZCX0RNSUMsCi0JQUxDMjY5X0ZVSklUU1UsCi0JQUxDMjY5X0xJRkVCT09LLAotCUFMQzI3MV9BQ0VSLAotCUFMQzI2OV9NT0RFTF9MQVNUIC8qIGxhc3QgdGFnICovCi19OwotCi0vKgotICogIEFMQzI2OSBjaGFubmVsIHNvdXJjZSBzZXR0aW5nICgyIGNoYW5uZWwpCi0gKi8KLSNkZWZpbmUgQUxDMjY5X0RJR09VVF9OSUQJQUxDODgwX0RJR09VVF9OSUQKLQotI2RlZmluZSBhbGMyNjlfZGFjX25pZHMJCWFsYzI2MF9kYWNfbmlkcwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OV9hZGNfbmlkc1sxXSA9IHsKLQkvKiBBREMxICovCi0JMHgwOCwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjMjY5X2NhcHNyY19uaWRzWzFdID0gewotCTB4MjMsCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI2OXZiX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzEgKi8KLQkweDA5LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNjl2Yl9jYXBzcmNfbmlkc1sxXSA9IHsKLQkweDIyLAotfTsKLQotI2RlZmluZSBhbGMyNjlfbW9kZXMJCWFsYzI2MF9tb2RlcwotI2RlZmluZSBhbGMyNjlfY2FwdHVyZV9zb3VyY2UJYWxjODgwX2xnX2x3X2NhcHR1cmVfc291cmNlCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYmFzZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X3F1YW50YV9mbDFfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKLQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKLQkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGlmZWJvb2tfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGMyNjhfYWNlcl9iaW5kX21hc3Rlcl92b2wpLAotCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAotCQkuc3ViZGV2aWNlID0gSERBX1NVQkRFVl9BTVBfRkxBRywKLQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfaW5mbywKLQkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9nZXQsCi0JCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJEb2NrIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJEb2NrIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X2xhcHRvcF9taXhlcltdID0gewotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX21peGVyW10gPSB7Ci0JSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfYXN1c19taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qIEZTQyBhbWlsbyAqLwotI2RlZmluZSBhbGMyNjlfZnVqaXRzdV9taXhlcglhbGMyNjlfbGFwdG9wX21peGVyCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X3F1YW50YV9mbDFfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTENfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGlmZWJvb2tfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUxDX0hQX0VWRU5UIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7IH0KLX07Ci0KLS8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCi0JCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAotCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7Ci0KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAotCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKLQkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOwotfQotCi0jZGVmaW5lIGFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlIFwKLQlhbGMyNjlfcXVhbnRhX2ZsMV9zcGVha2VyX2F1dG9tdXRlCi0KLXN0YXRpYyB2b2lkIGFsYzI2OV9saWZlYm9va19taWNfYXV0b3N3aXRjaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudF9sYXB0b3A7Ci0JdW5zaWduZWQgaW50IHByZXNlbnRfZG9jazsKLQotCXByZXNlbnRfbGFwdG9wCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxOCk7Ci0JcHJlc2VudF9kb2NrCT0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgxYik7Ci0KLQkvKiBMYXB0b3AgbWljIHBvcnQgb3ZlcnJpZGVzIGRvY2sgbWljIHBvcnQsIGRlc2lnbiBkZWNpc2lvbiAqLwotCWlmIChwcmVzZW50X2RvY2spCi0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjMsIDAsCi0JCQkJQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4Myk7Ci0JaWYgKHByZXNlbnRfbGFwdG9wKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIzLCAwLAotCQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDApOwotCWlmICghcHJlc2VudF9kb2NrICYmICFwcmVzZW50X2xhcHRvcCkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMywgMCwKLQkJCQlBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgIHVuc2lnbmVkIGludCByZXMpCi17Ci0Jc3dpdGNoIChyZXMgPj4gMjYpIHsKLQljYXNlIEFMQ19IUF9FVkVOVDoKLQkJYWxjMjY5X3F1YW50YV9mbDFfc3BlYWtlcl9hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWNhc2UgQUxDX01JQ19FVkVOVDoKLQkJYWxjX21pY19hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X2xpZmVib29rX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlpZiAoKHJlcyA+PiAyNikgPT0gQUxDX01JQ19FVkVOVCkKLQkJYWxjMjY5X2xpZmVib29rX21pY19hdXRvc3dpdGNoKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X3F1YW50YV9mbDFfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9xdWFudGFfZmwxX3NwZWFrZXJfYXV0b211dGUoY29kZWMpOwotCWFsY19taWNfYXV0b211dGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMV0gPSAweDFhOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotfQotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGlmZWJvb2tfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWFsYzI2OV9saWZlYm9va19zcGVha2VyX2F1dG9tdXRlKGNvZGVjKTsKLQlhbGMyNjlfbGlmZWJvb2tfbWljX2F1dG9zd2l0Y2goY29kZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDV9LAotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMjYgfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAxOSB8ICgweDAwIDw8IDgpKX0sCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJic1tdID0gewotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDI2IH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMWIgfCAoMHgwMCA8PCA4KSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9kbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwNn0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAyNiB9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDE5IHwgKDB4MDAgPDwgOCkpfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnNbXSA9IHsKLQl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwZH0sCi0JezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0MDAwfSwKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgNn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgdm9pZCBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjMjY5X2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9hbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzI2OXZiX2xhcHRvcF9kbWljX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qCi0gKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjY5X2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyoKLQkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwMiAtIDB4MDMpCi0JICovCi0JLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KLQkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIEZJWE1FOiB1c2UgTXV4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwotCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxZCwgMGIgKi8KLQkvKiBJbnB1dCBtaXhlcjE6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCi0JLyogc2V0IEVBUEQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNjl2Yl9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQotCS8qCi0JICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDAzKQotCSAqLwotCS8qIHNldCB2b2w9MCB0byBvdXRwdXQgbWl4ZXJzICovCi0JezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfWkVST30sCi0KLQkvKiBzZXQgdXAgaW5wdXQgYW1wcyBmb3IgYW5hbG9nIGxvb3BiYWNrICovCi0JLyogQW1wIEluZGljZXM6IERBQyA9IDAsIG1peGVyID0gMSAqLwotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBGSVhNRTogdXNlIE11eC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLQkvKiBNaXhlciBlbGVtZW50czogMHgxOCwgMTksIDFhLCAxYiwgMWQsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIxOiB1bm11dGUgTWljLCBGLU1pYywgTGluZSwgQ0QgaW5wdXRzICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIHNldCBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7IH0KLX07Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGMyNjlfbW9kZWxzW0FMQzI2OV9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDMjY5X0JBU0lDXQkJCT0gImJhc2ljIiwKLQlbQUxDMjY5X1FVQU5UQV9GTDFdCQk9ICJxdWFudGEiLAotCVtBTEMyNjlfQU1JQ10JCQk9ICJsYXB0b3AtYW1pYyIsCi0JW0FMQzI2OV9ETUlDXQkJCT0gImxhcHRvcC1kbWljIiwKLQlbQUxDMjY5X0ZVSklUU1VdCQk9ICJmdWppdHN1IiwKLQlbQUxDMjY5X0xJRkVCT09LXQkJPSAibGlmZWJvb2siLAotCVtBTEMyNjlfQVVUT10JCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X1FVQU5UQV9GTDEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA0N2MsICJBQ0VSIFpHQSIsIEFMQzI3MV9BQ0VSKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MzMwLCAiQVNVUyBFZWVwYyBQNzAzIFA5MDBBIiwKLQkJICAgICAgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMTMsICJBU1VTIE42MURhIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTExMywgIkFTVVMgTjYzSm4iLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTQzLCAiQVNVUyBCNTNmIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTEzMywgIkFTVVMgVUoyMGZ0IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExODMsICJBU1VTIEs3MkRSIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFiMywgIkFTVVMgSzUyRFIiLCBBTEMyNjlWQl9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWUzLCAiQVNVUyBVMzNKYyIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyNzMsICJBU1VTIFVMODBKdCIsIEFMQzI2OVZCX0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyODMsICJBU1VTIFU1M0pjIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyYjMsICJBU1VTIE44MkpWIiwgQUxDMjY5VkJfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJkMywgIkFTVVMgTjYxSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNhMywgIkFTVVMgVUwzMFZ0IiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzNzMsICJBU1VTIEc3M0pYIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzODMsICJBU1VTIFVKMzBKYyIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2QzLCAiQVNVUyBONjFKQSIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDEzLCAiQVNVUyBVTDUwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NDMsICJBU1VTIFVMMzAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ1MywgIkFTVVMgTTYwSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ4MywgIkFTVVMgVUw4MCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGYzLCAiQVNVUyBGODNWZiIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGUzLCAiQVNVUyBVTDIwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1MTMsICJBU1VTIFVYMzAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTU5MywgIkFTVVMgTjUxVm4iLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhMywgIkFTVVMgTjYwSnYiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTViMywgIkFTVVMgTjYwRHAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVjMywgIkFTVVMgTjcwRGUiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVlMywgIkFTVVMgRjgzVCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjQzLCAiQVNVUyBNNjBKIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NTMsICJBU1VTIFU1MCIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjkzLCAiQVNVUyBGNTBOIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2YTMsICJBU1VTIEY1USIsIEFMQzI2OV9BTUlDKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzIzLCAiQVNVUyBQODAiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc0MywgIkFTVVMgVTgwIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NzMsICJBU1VTIFUyMEEiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg4MywgIkFTVVMgRjgxU2UiLCBBTEMyNjlfQU1JQyksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA3MSwgIlNvbnkgVkFJTyIsIEFMQzI2OV9BVVRPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxNDc1LCAiTGlmZWJvb2sgSUNIOU0tYmFzZWQiLCBBTEMyNjlfTElGRUJPT0spLAotCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDE3NzgsICJRdWFudGEgT04xIiwgQUxDMjY5X0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDExNWQsICJGU0MgQW1pbG8iLCBBTEMyNjlfRlVKSVRTVSksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JlOSwgIlF1YW50YSBXaXN0cm9uIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X0FNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWEsICJRdWFudGEgRUwzIiwgQUxDMjY5X0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWIsICJRdWFudGEgSlIxIiwgQUxDMjY5X0RNSUMpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzI2OV9wcmVzZXRzW10gPSB7Ci0JW0FMQzI2OV9CQVNJQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9iYXNlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzI2OV9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEMyNjlfUVVBTlRBX0ZMMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9xdWFudGFfZmwxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywgYWxjMjY5X3F1YW50YV9mbDFfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzI2OV9xdWFudGFfZmwxX3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjlfcXVhbnRhX2ZsMV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzI2OV9xdWFudGFfZmwxX2luaXRfaG9vaywKLQl9LAotCVtBTEMyNjlfQU1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9sYXB0b3BfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzI2OV9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjlfaW5pdF92ZXJicywKLQkJCQlhbGMyNjlfbGFwdG9wX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjlfbGFwdG9wX2FtaWNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY5X0RNSUNdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjlfbGFwdG9wX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlWQl9BTUlDXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjY5dmJfbGFwdG9wX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjl2Yl9sYXB0b3BfYW5hbG9nX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjl2Yl9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OXZiX2xhcHRvcF9hbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5dmJfbGFwdG9wX2FtaWNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjY5VkJfRE1JQ10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OXZiX2xhcHRvcF9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjMjY5dmJfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OXZiX2luaXRfdmVyYnMsCi0JCQkJYWxjMjY5dmJfbGFwdG9wX2RtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI2OV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI2OV9kYWNfbmlkcywKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjlfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjMjY5X21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjl2Yl9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlfRlVKSVRTVV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9mdWppdHN1X21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjlfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLAotCQkJCWFsYzI2OV9sYXB0b3BfZG1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjY5X2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjY5X2RhY19uaWRzLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2OV9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGMyNjlfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzI2OV9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNjlfTElGRUJPT0tdID0gewotCQkubWl4ZXJzID0geyBhbGMyNjlfbGlmZWJvb2tfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzI2OV9pbml0X3ZlcmJzLCBhbGMyNjlfbGlmZWJvb2tfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5ocF9uaWQgPSAweDAzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsYzI2OV9saWZlYm9va191bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjMjY5X2xpZmVib29rX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjMjY5X2xpZmVib29rX2luaXRfaG9vaywKLQl9LAotCVtBTEMyNzFfQUNFUl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzI2OV9hc3VzX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNjl2Yl9sYXB0b3BfZGlnaXRhbF9jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjMjY5X2luaXRfdmVyYnMsIGFsYzI3MV9hY2VyX2RtaWNfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjlfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGMyNjlfZGFjX25pZHMsCi0JCS5hZGNfbmlkcyA9IGFsYzI2Ml9kbWljX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjJfZG1pY19hZGNfbmlkcyksCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI2Ml9kbWljX2NhcHNyY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjY5X21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2OV9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGMyNjlfY2FwdHVyZV9zb3VyY2UsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGMyNjl2Yl9sYXB0b3BfZG1pY19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotfTsKLQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM2NjJfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzY2Ml9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YTZlYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzY2Ml9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MDggKzAsMCBAQAotLyoKLSAqIEFMQzY2Mi9BTEM2NjMvQUxDNjY1L0FMQzY3MCBxdWlyayBtb2RlbHMKLSAqIGluY2x1ZGVkIGJ5IHBhdGNoX3JlYWx0ZWsuYwotICovCi0KLS8qIEFMQzY2MiBtb2RlbHMgKi8KLWVudW0gewotCUFMQzY2Ml9BVVRPLAotCUFMQzY2Ml8zU1RfMmNoX0RJRywKLQlBTEM2NjJfM1NUXzZjaF9ESUcsCi0JQUxDNjYyXzNTVF82Y2gsCi0JQUxDNjYyXzVTVF9ESUcsCi0JQUxDNjYyX0xFTk9WT18xMDFFLAotCUFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEsCi0JQUxDNjYyX0FTVVNfRUVFUENfRVAyMCwKLQlBTEM2NjNfQVNVU19NNTFWQSwKLQlBTEM2NjNfQVNVU19HNzFWLAotCUFMQzY2M19BU1VTX0gxMywKLQlBTEM2NjNfQVNVU19HNTBWLAotCUFMQzY2Ml9FQ1MsCi0JQUxDNjYzX0FTVVNfTU9ERTEsCi0JQUxDNjYyX0FTVVNfTU9ERTIsCi0JQUxDNjYzX0FTVVNfTU9ERTMsCi0JQUxDNjYzX0FTVVNfTU9ERTQsCi0JQUxDNjYzX0FTVVNfTU9ERTUsCi0JQUxDNjYzX0FTVVNfTU9ERTYsCi0JQUxDNjYzX0FTVVNfTU9ERTcsCi0JQUxDNjYzX0FTVVNfTU9ERTgsCi0JQUxDMjcyX0RFTEwsCi0JQUxDMjcyX0RFTExfWk0xLAotCUFMQzI3Ml9TQU1TVU5HX05DMTAsCi0JQUxDNjYyX01PREVMX0xBU1QsCi19OwotCi0jZGVmaW5lIEFMQzY2Ml9ESUdPVVRfTklECTB4MDYKLSNkZWZpbmUgQUxDNjYyX0RJR0lOX05JRAkweDBhCi0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2RhY19uaWRzWzNdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlICovCi0JMHgwMiwgMHgwMywgMHgwNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfZGFjX25pZHNbMl0gPSB7Ci0JMHgwMiwgMHgwMwotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2NjJfYWRjX25pZHNbMl0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOSwgMHgwOAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGMyNzJfYWRjX25pZHNbMV0gPSB7Ci0JLyogQURDMS0yICovCi0JMHgwOCwKLX07Ci0KLXN0YXRpYyBjb25zdCBoZGFfbmlkX3QgYWxjNjYyX2NhcHNyY19uaWRzWzJdID0geyAweDIyLCAweDIzIH07Ci1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzI3Ml9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMyB9OwotCi0KLS8qIGlucHV0IE1VWCAqLwotLyogRklYTUU6IHNob3VsZCBiZSBhIG1hdHJpeC10eXBlIGlucHV0IHNvdXJjZSBzZWxlY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjJfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MSB9LAotCQl7ICJMaW5lIiwgMHgyIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjNfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDMsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQl9LAotfTsKLQotI2lmIDAgLyogc2V0IHRvIDEgZm9yIHRlc3Rpbmcgb3RoZXIgaW5wdXQgc291cmNlcyBiZWxvdyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzI3Ml9uYzEwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAxNiwKLQkuaXRlbXMgPSB7Ci0JCXsgIkF1dG9zZWxlY3QgTWljIiwgMHgwIH0sCi0JCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAotCQl7ICJJbi0weDAyIiwgMHgyIH0sCi0JCXsgIkluLTB4MDMiLCAweDMgfSwKLQkJeyAiSW4tMHgwNCIsIDB4NCB9LAotCQl7ICJJbi0weDA1IiwgMHg1IH0sCi0JCXsgIkluLTB4MDYiLCAweDYgfSwKLQkJeyAiSW4tMHgwNyIsIDB4NyB9LAotCQl7ICJJbi0weDA4IiwgMHg4IH0sCi0JCXsgIkluLTB4MDkiLCAweDkgfSwKLQkJeyAiSW4tMHgwYSIsIDB4MGEgfSwKLQkJeyAiSW4tMHgwYiIsIDB4MGIgfSwKLQkJeyAiSW4tMHgwYyIsIDB4MGMgfSwKLQkJeyAiSW4tMHgwZCIsIDB4MGQgfSwKLQkJeyAiSW4tMHgwZSIsIDB4MGUgfSwKLQkJeyAiSW4tMHgwZiIsIDB4MGYgfSwKLQl9LAotfTsKLSNlbmRpZgotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml8zU1RfMmNoX21vZGVzWzFdID0gewotCXsgMiwgTlVMTCB9Ci19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfM1NUX2NoMl9pbml0W10gPSB7Ci0JeyAweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgMHgxYSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU4gfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml8zU1RfY2g2X2luaXRbXSA9IHsKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKLQl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAyIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sCi0JeyAweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfM1NUXzZjaF9tb2Rlc1syXSA9IHsKLQl7IDIsIGFsYzY2Ml8zU1RfY2gyX2luaXQgfSwKLQl7IDYsIGFsYzY2Ml8zU1RfY2g2X2luaXQgfSwKLX07Ci0KLS8qCi0gKiAyY2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDZfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zaXhzdGFja19jaDhfaW5pdFtdID0gewotCXsgMHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM2NjJfNXN0YWNrX21vZGVzWzJdID0gewotCXsgMiwgYWxjNjYyX3NpeHN0YWNrX2NoNl9pbml0IH0sCi0JeyA2LCBhbGM2NjJfc2l4c3RhY2tfY2g4X2luaXQgfSwKLX07Ci0KLS8qIFBpbiBhc3NpZ25tZW50OiBGcm9udD0weDE0LCBSZWFyPTB4MTUsIENMRkU9MHgxNiwgU2lkZT0weDE3Ci0gKiAgICAgICAgICAgICAgICAgTWljPTB4MTgsIEZyb250IE1pYz0weDE5LCBMaW5lLUluPTB4MWEsIEhQPTB4MWIKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2Jhc2VfbWl4ZXJbXSA9IHsKLQkvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JLypJbnB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHg0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHhiLCAweDAxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfM1NUXzJjaF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8zU1RfNmNoX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2xlbm92b18xMDFlX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml9lZWVwY19wNzAxX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2VlZXBjX2VwMjBfbWl4ZXJbXSA9IHsKLQlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkxGRSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIk11dGVDdHJsIFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3ZvbCwKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDIsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDMsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c19vbmVfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX201MXZhX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgJmFsYzY2M19hc3VzX2JpbmRfbWFzdGVyX3ZvbCksCi0JSERBX0JJTkRfU1coIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAmYWxjNjYzX2FzdXNfb25lX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2JpbmRfY3RscyBhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoID0gewotCS5vcHMgPSAmc25kX2hkYV9iaW5kX3N3LAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNSwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgyMSwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2M190d29faHBfbTFfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190cmVlX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkYtTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRi1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYzX3R3b19ocF9tMl9taXhlcltdID0gewotCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgJmFsYzY2M19hc3VzX2ZvdXJfYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8xYmpkX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRi1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX21hc3Rlcl92b2wgPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwMiwgMywgMCwgSERBX09VVFBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNCwgMywgMCwgSERBX09VVFBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY2M19hc3VzX3R3b19iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTYsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAotCQkJCSZhbGM2NjNfYXN1c190d29fYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfYXN1c18xNWpkX2NsZmVfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9WT0woIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAmYWxjNjYzX2FzdXNfYmluZF9tYXN0ZXJfdm9sKSwKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c190d29fYmluZF9zd2l0Y2gpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzcxdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfZzUwdl9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9hbGxfYmluZF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE0LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE1LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDE3LCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDFiLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDIxLCAzLCAwLCBIREFfT1VUUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9iaW5kX2N0bHMgYWxjNjYzX2FzdXNfbW9kZTdfOF9zcF9iaW5kX3N3aXRjaCA9IHsKLQkub3BzID0gJnNuZF9oZGFfYmluZF9zdywKLQkudmFsdWVzID0gewotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTcsIDMsIDAsIEhEQV9PVVRQVVQpLAotCQkwCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZTdfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50TWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjNfbW9kZThfbWl4ZXJbXSA9IHsKLQlIREFfQklORF9TVygiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X2FsbF9iaW5kX3N3aXRjaCksCi0JSERBX0JJTkRfVk9MKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICZhbGM2NjNfYXN1c19iaW5kX21hc3Rlcl92b2wpLAotCUhEQV9CSU5EX1NXKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsICZhbGM2NjNfYXN1c19tb2RlN184X3NwX2JpbmRfc3dpdGNoKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lMSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfY2htb2RlX21peGVyW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfaW5pdF92ZXJic1tdID0gewotCS8qIEFEQzogbXV0ZSBhbXAgbGVmdCBhbmQgcmlnaHQgKi8KLQl7MHgwOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDBkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQotCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQotCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0KLQkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KLQl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KLQl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCi0JLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi0JLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCi0JLyogSW5wdXQgbWl4ZXIgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBhbHdheXMgdHJ1biBvbiBFQVBEICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjJfc3VlX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2VlZXBjX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLS8qIFNldCBVbnNvbGljaXRlZCBFdmVudCovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tNTF2YV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2NjNfMjFqZF9hbWljX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyXzFiamRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzXzE1amRfYW1pY19pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sCS8qIEhlYWRwaG9uZSAqLwotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M190d29faHBfYW1pY19tMV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDB9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX3R3b19ocF9hbWljX20yX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19nNzF2X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCS8qIHsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sICovCi0JLyogezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgKi8gLyogSGVhZHBob25lICovCi0KLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwJLyogSGVhZHBob25lICovCi0KLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTnxBTENfRlJPTlRfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX2c1MHZfaW5pdF92ZXJic1tdID0gewotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAkvKiBIZWFkcGhvbmUgKi8KLQotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9lY3NfaW5pdF92ZXJic1tdID0gewotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweDcwMWZ9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjcyX2RlbGxfem0xX2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDIxLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAkvKiBIZWFkcGhvbmUgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDkpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19NSUNfRVZFTlR9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGMyNzJfZGVsbF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYzX21vZGU3X2luaXRfdmVyYnNbXSA9IHsKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzY2M19tb2RlOF9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgyMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDIxLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwJLyogSGVhZHBob25lICovCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg5KX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX01JQ19FVkVOVH0sCi0JezB4MjEsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlR9LAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX2F1dG9fY2FwdHVyZV9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgdm9pZCBhbGM2NjJfbGVub3ZvXzEwMWVfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5kZXRlY3RfbGluZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbGluZXMgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotfQotCi1zdGF0aWMgdm9pZCBhbGM2NjJfZWVlcGNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlhbGMyNjJfaGlwcG8xX3NldHVwKGNvZGVjKTsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjYyX2VlZXBjX2VwMjBfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxYjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY2M19tNTF2YV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX01JWEVSOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTI7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKiBNb2RlMSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTFfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzBdID0gMHgwYzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYyX21vZGUyX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX1BJTjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGUzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKLQlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7Ci0Jc3BlYy0+YXV0b19taWMgPSAxOwotfQotCi0vKiAqKioqKioqKioqKioqKioqKiBNb2RlNCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGM2NjNfbW9kZTRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgyMTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGVfbWl4ZXJfbmlkWzFdID0gMHgwZTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9NSVhFUjsKLQlzcGVjLT5leHRfbWljX3BpbiA9IDB4MTg7Ci0Jc3BlYy0+aW50X21pY19waW4gPSAweDE5OwotCXNwZWMtPmF1dG9fbWljID0gMTsKLX0KLQotLyogKioqKioqKioqKioqKioqKiogTW9kZTUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxjNjYzX21vZGU1X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZV9taXhlcl9uaWRbMF0gPSAweDBjOwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFsxXSA9IDB4MGU7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlNl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlX21peGVyX25pZFswXSA9IDB4MGM7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfTUlYRVI7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU3ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlN19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxOTsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLS8qICoqKioqKioqKioqKioqKioqIE1vZGU4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFsYzY2M19tb2RlOF9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDIxOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MTU7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9QSU47Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY2M19nNzF2X3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MjE7Ci0Jc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOwotCXNwZWMtPmRldGVjdF9saW5lID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDE7Ci0Jc3BlYy0+ZXh0X21pY19waW4gPSAweDE4OwotCXNwZWMtPmludF9taWNfcGluID0gMHgxMjsKLQlzcGVjLT5hdXRvX21pYyA9IDE7Ci19Ci0KLSNkZWZpbmUgYWxjNjYzX2c1MHZfc2V0dXAJYWxjNjYzX201MXZhX3NldHVwCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfZWNzX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JQUxDMjYyX0hJUFBPX01BU1RFUl9TV0lUQ0gsCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMvTGluZUluIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmVJbiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYy9MaW5lSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjcyX25jMTBfbWl4ZXJbXSA9IHsKLQkvKiBNYXN0ZXIgUGxheWJhY2sgYXV0b21hdGljYWxseSBjcmVhdGVkIGZyb20gU3BlYWtlciBhbmQgSGVhZHBob25lICovCi0JSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjNjYyX21vZGVsc1tBTEM2NjJfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzY2Ml8zU1RfMmNoX0RJR10JPSAiM3N0YWNrLWRpZyIsCi0JW0FMQzY2Ml8zU1RfNmNoX0RJR10JPSAiM3N0YWNrLTZjaC1kaWciLAotCVtBTEM2NjJfM1NUXzZjaF0JPSAiM3N0YWNrLTZjaCIsCi0JW0FMQzY2Ml81U1RfRElHXQk9ICI1c3RhY2stZGlnIiwKLQlbQUxDNjYyX0xFTk9WT18xMDFFXQk9ICJsZW5vdm8tMTAxZSIsCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gImVlZXBjLXA3MDEiLAotCVtBTEM2NjJfQVNVU19FRUVQQ19FUDIwXSA9ICJlZWVwYy1lcDIwIiwKLQlbQUxDNjYyX0VDU10gPSAiZWNzIiwKLQlbQUxDNjYzX0FTVVNfTTUxVkFdID0gIm01MXZhIiwKLQlbQUxDNjYzX0FTVVNfRzcxVl0gPSAiZzcxdiIsCi0JW0FMQzY2M19BU1VTX0gxM10gPSAiaDEzIiwKLQlbQUxDNjYzX0FTVVNfRzUwVl0gPSAiZzUwdiIsCi0JW0FMQzY2M19BU1VTX01PREUxXSA9ICJhc3VzLW1vZGUxIiwKLQlbQUxDNjYyX0FTVVNfTU9ERTJdID0gImFzdXMtbW9kZTIiLAotCVtBTEM2NjNfQVNVU19NT0RFM10gPSAiYXN1cy1tb2RlMyIsCi0JW0FMQzY2M19BU1VTX01PREU0XSA9ICJhc3VzLW1vZGU0IiwKLQlbQUxDNjYzX0FTVVNfTU9ERTVdID0gImFzdXMtbW9kZTUiLAotCVtBTEM2NjNfQVNVU19NT0RFNl0gPSAiYXN1cy1tb2RlNiIsCi0JW0FMQzY2M19BU1VTX01PREU3XSA9ICJhc3VzLW1vZGU3IiwKLQlbQUxDNjYzX0FTVVNfTU9ERThdID0gImFzdXMtbW9kZTgiLAotCVtBTEMyNzJfREVMTF0JCT0gImRlbGwiLAotCVtBTEMyNzJfREVMTF9aTTFdCT0gImRlbGwtem0xIiwKLQlbQUxDMjcyX1NBTVNVTkdfTkMxMF0JPSAic2Ftc3VuZy1uYzEwIiwKLQlbQUxDNjYyX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2NjJfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRUNTKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmQ2LCAiREVMTCIsIEFMQzI3Ml9ERUxMKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmY0LCAiREVMTCBaTTEiLCBBTEMyNzJfREVMTF9aTTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwMDAsICJBU1VTIE41MFZtIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEwOTIsICJBU1VTIE5CIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExNzMsICJBU1VTIEs3M0puIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExYzMsICJBU1VTIE03MFYiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFkMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTFmMywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTIwMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMwMywgIkFTVVMgRzYwSiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzMzLCAiQVNVUyBHNjBKeCIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM5LCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2UzLCAiQVNVUyBONzFKQSIsIEFMQzY2M19BU1VTX01PREU3KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDYzLCAiQVNVUyBONzEiLCBBTEM2NjNfQVNVU19NT0RFNyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTRkMywgIkFTVVMgRzcyIiwgQUxDNjYzX0FTVVNfTU9ERTgpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1NjMsICJBU1VTIE45MCIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNWQzLCAiQVNVUyBONTBTRiBGNTBTRiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmMzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNmYzLCAiQVNVUyBLNDBDIEs1MEMiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTczMywgIkFTVVMgTjgxRGUiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc1MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2MywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc2NSwgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFNiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc4MywgIkFTVVMgTkIiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc5MywgIkFTVVMgRjUwR1giLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdiMywgIkFTVVMgRjcwU0wiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTdjMywgIkFTVVMgVVgyMCIsIEFMQzY2M19BU1VTX001MVZBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxN2YzLCAiQVNVUyBYNThMRSIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODIzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU1KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODMzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU2KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODQzLCAiQVNVUyBOQiIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODUzLCAiQVNVUyBGNTBaIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NjQsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzYsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzgsICJBU1VTIE01MVZBIiwgQUxDNjYzX0FTVVNfTTUxVkEpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3OCwgIkFTVVMgTTUwVnIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODkzLCAiQVNVUyBNNTBWbSIsIEFMQzY2M19BU1VTX01PREUzKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxODk0LCAiQVNVUyBYNTUiLCBBTEM2NjNfQVNVU19NT0RFMyksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThiMywgIkFTVVMgTjgwVmMiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MThjMywgIkFTVVMgVlg1IiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZDMsICJBU1VTIE44MVRlIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4ZjMsICJBU1VTIE41MDVUcCIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTAzLCAiQVNVUyBGNUdMIiwgQUxDNjYzX0FTVVNfTU9ERTEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MTMsICJBU1VTIE5CIiwgQUxDNjYyX0FTVVNfTU9ERTIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5MzMsICJBU1VTIEY4MFEiLCBBTEM2NjJfQVNVU19NT0RFMiksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk0MywgIkFTVVMgVngzViIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTYzLCAiQVNVUyBYNzFDIiwgQUxDNjYzX0FTVVNfTU9ERTMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ODMsICJBU1VTIE41MDUxQSIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQVNVUyBOMjAiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgRzUwViIsIEFMQzY2M19BU1VTX0c1MFYpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTlhMywgIkFTVVMgTkIiLCBBTEM2NjNfQVNVU19NT0RFMSksKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWIzLCAiQVNVUyBGN1oiLCBBTEM2NjNfQVNVU19NT0RFMSksCi0JU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTljMywgIkFTVVMgRjVaL0Y2eCIsIEFMQzY2Ml9BU1VTX01PREUyKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWQzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX001MVZBKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWUzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREUxKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWYzLCAiQVNVUyBOQiIsIEFMQzY2M19BU1VTX01PREU0KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjkwLCAiQVNVUyBQNUdDLU1YIiwgQUxDNjYyXzNTVF82Y2hfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MmExLCAiQVNVUyBFZWVwYyIsIEFMQzY2Ml9BU1VTX0VFRVBDX1A3MDEpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgyZDEsICJBU1VTIEVlZXBjIEVQMjAiLCBBTEM2NjJfQVNVU19FRUVQQ19FUDIwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA1YiwgMHgwY2Q2LCAiRm94Y29ubiIsIEFMQzY2Ml9FQ1MpLAotCVNORF9QQ0lfUVVJUksoMHgxMDViLCAweDBkNDcsICJGb3hjb25uIDQ1Q01YLzQ1R01YLzQ1Q01YLUsiLAotCQkgICAgICBBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNmUsICJUb3NoaWJhIE5CMjB4IiwgQUxDNjYyX0FVVE8pLAotCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGNhMDAsICJTYW1zdW5nIE5DMTAiLCBBTEMyNzJfU0FNU1VOR19OQzEwKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhhMDAyLCAiR2lnYWJ5dGUgOTQ1R0NNLVMyTCIsCi0JCSAgICAgIEFMQzY2Ml8zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MjMwNCwgIlF1YW50YSBXSDEiLCBBTEM2NjNfQVNVU19IMTMpLAotCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGYsICJCaW9zdGFyIFRBNzgwRyBNMisiLCBBTEM2NjJfM1NUXzZjaF9ESUcpLAotCVNORF9QQ0lfUVVJUksoMHgxNjMxLCAweGMxMGMsICJQQiBSUzY1IiwgQUxDNjYzX0FTVVNfTTUxVkEpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDEwMWUsICJMZW5vdm8iLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAotCVNORF9QQ0lfUVVJUksoMHgxODQ5LCAweDM2NjIsICJBU1JPQ0sgSzEwTjc4RnVsbEhELWhTTEkgUjMuMCIsCi0JCQkJCUFMQzY2Ml8zU1RfNmNoX0RJRyksCi0JU05EX1BDSV9RVUlSS19NQVNLKDB4MTg1NCwgMHhmMDAwLCAweDIwMDAsICJBU1VTIEgxMy0yMDB4IiwKLQkJCSAgIEFMQzY2M19BU1VTX0gxMyksCi0JU05EX1BDSV9RVUlSSygweDE5OTEsIDB4NTYyOCwgIk9yZGlzc2ltbyBFVkUiLCBBTEM2NjJfTEVOT1ZPXzEwMUUpLAotCXt9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsY19jb25maWdfcHJlc2V0IGFsYzY2Ml9wcmVzZXRzW10gPSB7Ci0JW0FMQzY2Ml8zU1RfMmNoX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml8zU1RfMmNoX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjJfM1NUXzZjaF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfM1NUXzZjaF9taXhlciwgYWxjNjYyX2NobW9kZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9lYXBkX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzZjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzZjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzY2Ml8zU1RfNmNoXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLCBhbGM2NjJfZWFwZF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5uZWVkX2RhY19maXggPSAxLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM2NjJfNVNUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2Ml9iYXNlX21peGVyLCBhbGM2NjJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywgYWxjNjYyX2VhcGRfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5kaWdfaW5fbmlkID0gQUxDNjYyX0RJR0lOX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml81c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzVzdGFja19tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYyX0xFTk9WT18xMDFFXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2xlbm92b18xMDFlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9zdWVfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzY2Ml9sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2xlbm92b18xMDFlX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX1A3MDFdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfcDcwMV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWVlcGNfc3VlX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX0VFRVBDX0VQMjBdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjJfZWVlcGNfZXAyMF9taXhlciwKLQkJCSAgICBhbGM2NjJfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lZWVwY19lcDIwX3N1ZV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYyX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjJfZWVlcGNfZXAyMF9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjJfRUNTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyX2Vjc19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWNzX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX2VlZXBjX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX001MVZBXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19tNTF2YV9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfRzcxVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19nNzF2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19nNzF2X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19nNzF2X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX0gxM10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfbTUxdmFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfRzUwVl0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19nNTB2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19nNTB2X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF82Y2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF82Y2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjNjYzX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfZzUwdl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFMV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tNTF2YV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGUxX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2Ml9BU1VTX01PREUyXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYyXzFiamRfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml8xYmpkX2FtaWNfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYyX21vZGUyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREUzXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX3R3b19ocF9tMV9taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX3R3b19ocF9hbWljX20xX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTNfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTRdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfYXN1c18yMWpkX2NsZmVfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M18yMWpkX2FtaWNfaW5pdF92ZXJic30sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU0X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzY2M19BU1VTX01PREU1XSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX2FzdXNfMTVqZF9jbGZlX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfMTVqZF9hbWljX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTVfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERTZdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfdHdvX2hwX20yX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGM2NjNfdHdvX2hwX2FtaWNfbTJfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCi0JCS5ocF9uaWQgPSAweDAzLAotCQkuZGFjX25pZHMgPSBhbGM2NjJfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzY2Ml9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tb2RlNl9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEM2NjNfQVNVU19NT0RFN10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzY2M19tb2RlN19taXhlciB9LAotCQkuY2FwX21peGVyID0gYWxjNjYyX2F1dG9fY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzX21vZGU3X2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjJfZGFjX25pZHMpLAotCQkuaHBfbmlkID0gMHgwMywKLQkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTdfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDNjYzX0FTVVNfTU9ERThdID0gewotCQkubWl4ZXJzID0geyBhbGM2NjNfbW9kZThfbWl4ZXIgfSwKLQkJLmNhcF9taXhlciA9IGFsYzY2Ml9hdXRvX2NhcHR1cmVfbWl4ZXIsCi0JCS5pbml0X3ZlcmJzID0geyBhbGM2NjJfaW5pdF92ZXJicywKLQkJCQlhbGM2NjJfZWFwZF9pbml0X3ZlcmJzLAotCQkJCWFsYzY2M19tb2RlOF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKLQkJLmhwX25pZCA9IDB4MDMsCi0JCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDNjYyX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjYzX21vZGU4X3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2luaXRob29rLAotCX0sCi0JW0FMQzI3Ml9ERUxMXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGMyNzJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGMyNzJfZGVsbF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuYWRjX25pZHMgPSBhbGMyNzJfYWRjX25pZHMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI3Ml9hZGNfbmlkcyksCi0JCS5jYXBzcmNfbmlkcyA9IGFsYzI3Ml9jYXBzcmNfbmlkcywKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml8zU1RfMmNoX21vZGVzLAotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbTUxdmFfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLQlbQUxDMjcyX0RFTExfWk0xXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjNjYzX201MXZhX21peGVyIH0sCi0JCS5jYXBfbWl4ZXIgPSBhbGM2NjJfYXV0b19jYXB0dXJlX21peGVyLAotCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYyX2VhcGRfaW5pdF92ZXJicywKLQkJCQlhbGMyNzJfZGVsbF96bTFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzI3Ml9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzI3Ml9kYWNfbmlkcywKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY2Ml8zU1RfMmNoX21vZGVzKSwKLQkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAotCQkubnVtX2FkY19uaWRzID0gMSwKLQkJLmNhcHNyY19uaWRzID0gYWxjNjYyX2NhcHNyY19uaWRzLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzY2M19tNTF2YV9zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19pbml0aG9vaywKLQl9LAotCVtBTEMyNzJfU0FNU1VOR19OQzEwXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjMjcyX25jMTBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzLAotCQkJCWFsYzY2Ml9lYXBkX2luaXRfdmVyYnMsCi0JCQkJYWxjNjYzXzIxamRfYW1pY19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjcyX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjMjcyX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCi0JCS8qLmlucHV0X211eCA9ICZhbGMyNzJfbmMxMF9jYXB0dXJlX3NvdXJjZSwqLwotCQkudW5zb2xfZXZlbnQgPSBhbGNfc2t1X3Vuc29sX2V2ZW50LAotCQkuc2V0dXAgPSBhbGM2NjNfbW9kZTRfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGNfaW5pdGhvb2ssCi0JfSwKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9hbGM2ODBfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzY4MF9xdWlya3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlYjIyNy4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2FsYzY4MF9xdWlya3MuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQUxDNjgwIHF1aXJrIG1vZGVscwotICogaW5jbHVkZWQgYnkgcGF0Y2hfcmVhbHRlay5jCi0gKi8KLQotLyogQUxDNjgwIG1vZGVscyAqLwotZW51bSB7Ci0JQUxDNjgwX0FVVE8sCi0JQUxDNjgwX0JBU0UsCi0JQUxDNjgwX01PREVMX0xBU1QsCi19OwotCi0jZGVmaW5lIEFMQzY4MF9ESUdJTl9OSUQJQUxDODgwX0RJR0lOX05JRAotI2RlZmluZSBBTEM2ODBfRElHT1VUX05JRAlBTEM4ODBfRElHT1VUX05JRAotI2RlZmluZSBhbGM2ODBfbW9kZXMJCWFsYzI2MF9tb2RlcwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY4MF9kYWNfbmlkc1szXSA9IHsKLQkvKiBMb3V0MSwgTG91dDIsIGhwICovCi0JMHgwMiwgMHgwMywgMHgwNAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM2ODBfYWRjX25pZHNbM10gPSB7Ci0JLyogQURDMC0yICovCi0JLyogRE1JQywgTUlDLCBMaW5lLWluKi8KLQkweDA3LCAweDA4LCAweDA5Ci19OwotCi0vKgotICogQW5hbG9nIGNhcHR1cmUgQURDIGNnYW5nZQotICovCi1zdGF0aWMgaGRhX25pZF90IGFsYzY4MF9nZXRfY3VyX2FkYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdGF0aWMgaGRhX25pZF90IHBpbnNbXSA9IHsweDE4LCAweDE5fTsKLQlzdGF0aWMgaGRhX25pZF90IGFkY3NbXSA9IHsweDA4LCAweDA5fTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpbnMpOyBpKyspIHsKLQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIHBpbnNbaV0pKQotCQkJY29udGludWU7Ci0JCWlmIChzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBwaW5zW2ldKSkKLQkJCXJldHVybiBhZGNzW2ldOwotCX0KLQlyZXR1cm4gMHgwNzsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjgwX3JlY19hdXRvc3dpdGNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQgPSBhbGM2ODBfZ2V0X2N1cl9hZGMoY29kZWMpOwotCWlmIChzcGVjLT5jdXJfYWRjICYmIG5pZCAhPSBzcGVjLT5jdXJfYWRjKSB7Ci0JCV9fc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywgc3BlYy0+Y3VyX2FkYywgMSk7Ci0JCXNwZWMtPmN1cl9hZGMgPSBuaWQ7Ci0JCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWQsCi0JCQkJCSAgIHNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZywgMCwKLQkJCQkJICAgc3BlYy0+Y3VyX2FkY19mb3JtYXQpOwotCX0KLX0KLQotc3RhdGljIGludCBhbGM2ODBfY2FwdHVyZV9wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCi0JCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IG5pZCA9IGFsYzY4MF9nZXRfY3VyX2FkYyhjb2RlYyk7Ci0KLQlzcGVjLT5jdXJfYWRjID0gbmlkOwotCXNwZWMtPmN1cl9hZGNfc3RyZWFtX3RhZyA9IHN0cmVhbV90YWc7Ci0Jc3BlYy0+Y3VyX2FkY19mb3JtYXQgPSBmb3JtYXQ7Ci0Jc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhbGM2ODBfY2FwdHVyZV9wY21fY2xlYW51cChzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNuZF9oZGFfY29kZWNfY2xlYW51cF9zdHJlYW0oY29kZWMsIHNwZWMtPmN1cl9hZGMpOwotCXNwZWMtPmN1cl9hZGMgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzY4MF9wY21fYW5hbG9nX2F1dG9fY2FwdHVyZSA9IHsKLQkuc3Vic3RyZWFtcyA9IDEsIC8qIGNhbiBiZSBvdmVycmlkZGVuICovCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLwotCS5vcHMgPSB7Ci0JCS5wcmVwYXJlID0gYWxjNjgwX2NhcHR1cmVfcGNtX3ByZXBhcmUsCi0JCS5jbGVhbnVwID0gYWxjNjgwX2NhcHR1cmVfcGNtX2NsZWFudXAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY4MF9iYXNlX21peGVyW10gPSB7Ci0JLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4NCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTIsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY4MF9iaW5kX2NhcF92b2wgPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfdm9sLAotCS52YWx1ZXMgPSB7Ci0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwNywgMywgMCwgSERBX0lOUFVUKSwKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA4LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDksIDMsIDAsIEhEQV9JTlBVVCksCi0JCTAKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfYmluZF9jdGxzIGFsYzY4MF9iaW5kX2NhcF9zd2l0Y2ggPSB7Ci0JLm9wcyA9ICZzbmRfaGRhX2JpbmRfc3csCi0JLnZhbHVlcyA9IHsKLQkJSERBX0NPTVBPU0VfQU1QX1ZBTCgweDA3LCAzLCAwLCBIREFfSU5QVVQpLAotCQlIREFfQ09NUE9TRV9BTVBfVkFMKDB4MDgsIDMsIDAsIEhEQV9JTlBVVCksCi0JCUhEQV9DT01QT1NFX0FNUF9WQUwoMHgwOSwgMywgMCwgSERBX0lOUFVUKSwKLQkJMAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjgwX21hc3Rlcl9jYXB0dXJlX21peGVyW10gPSB7Ci0JSERBX0JJTkRfVk9MKCJDYXB0dXJlIFZvbHVtZSIsICZhbGM2ODBfYmluZF9jYXBfdm9sKSwKLQlIREFfQklORF9TVygiQ2FwdHVyZSBTd2l0Y2giLCAmYWxjNjgwX2JpbmRfY2FwX3N3aXRjaCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM2ODBfaW5pdF92ZXJic1tdID0gewotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JezB4MTIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQotCXsweDE2LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19IUF9FVkVOVCAgIHwgQUNfVVNSU1BfRU59LAotCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgIHwgQUNfVVNSU1BfRU59LAotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQ19NSUNfRVZFTlQgIHwgQUNfVVNSU1BfRU59LAotCi0JeyB9Ci19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM2ODBfYmFzZV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTY7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKLQlzcGVjLT5hdXRvY2ZnLm51bV9pbnB1dHMgPSAyOwotCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzBdLnBpbiA9IDB4MTg7Ci0Jc3BlYy0+YXV0b2NmZy5pbnB1dHNbMF0udHlwZSA9IEFVVE9fUElOX01JQzsKLQlzcGVjLT5hdXRvY2ZnLmlucHV0c1sxXS5waW4gPSAweDE5OwotCXNwZWMtPmF1dG9jZmcuaW5wdXRzWzFdLnR5cGUgPSBBVVRPX1BJTl9MSU5FX0lOOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjNjgwX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JaWYgKChyZXMgPj4gMjYpID09IEFMQ19NSUNfRVZFTlQpCi0JCWFsYzY4MF9yZWNfYXV0b3N3aXRjaChjb2RlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzY4MF9pbml0aG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCWFsYzY4MF9yZWNfYXV0b3N3aXRjaChjb2RlYyk7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM2ODBfbW9kZWxzW0FMQzY4MF9NT0RFTF9MQVNUXSA9IHsKLQlbQUxDNjgwX0JBU0VdCQk9ICJiYXNlIiwKLQlbQUxDNjgwX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2ODBfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZjMsICJBU1VTIE5YOTAiLCBBTEM2ODBfQkFTRSksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjNjgwX3ByZXNldHNbXSA9IHsKLQlbQUxDNjgwX0JBU0VdID0gewotCQkubWl4ZXJzID0geyBhbGM2ODBfYmFzZV9taXhlciB9LAotCQkuY2FwX21peGVyID0gIGFsYzY4MF9tYXN0ZXJfY2FwdHVyZV9taXhlciwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzY4MF9pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjgwX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjgwX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM2ODBfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzY4MF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM2ODBfbW9kZXMsCi0JCS51bnNvbF9ldmVudCA9IGFsYzY4MF91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjNjgwX2Jhc2Vfc2V0dXAsCi0JCS5pbml0X2hvb2sgPSBhbGM2ODBfaW5pdGhvb2ssCi0KLQl9LAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODYxX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MTllYzYuLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL2hkYS9hbGM4NjFfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoKLSAqIEFMQzY2MC9BTEM4NjEgcXVpcmsgbW9kZWxzCi0gKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKLSAqLwotCi0vKiBBTEM4NjEgbW9kZWxzICovCi1lbnVtIHsKLQlBTEM4NjFfQVVUTywKLQlBTEM4NjFfM1NULAotCUFMQzY2MF8zU1QsCi0JQUxDODYxXzNTVF9ESUcsCi0JQUxDODYxXzZTVF9ESUcsCi0JQUxDODYxX1VOSVdJTExfTTMxLAotCUFMQzg2MV9UT1NISUJBLAotCUFMQzg2MV9BU1VTLAotCUFMQzg2MV9BU1VTX0xBUFRPUCwKLQlBTEM4NjFfTU9ERUxfTEFTVCwKLX07Ci0KLS8qCi0gKiAgQUxDODYxIGNoYW5uZWwgc291cmNlIHNldHRpbmcgKDIvNiBjaGFubmVsIHNlbGVjdGlvbiBmb3IgMy1zdGFjaykKLSAqLwotCi0vKgotICogc2V0IHRoZSBwYXRoIHdheXMgZm9yIDIgY2hhbm5lbCBvdXRwdXQKLSAqIG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBsaW5lIG91dCBhbmQgbWljIDEgcGluIHdpZGdldHMgdG8gaW5wdXRzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3RocmVlc3RhY2tfY2gyX2luaXRbXSA9IHsKLQkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBpbnB1dCAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQotCSAqIHRoZSB2cmVmCi0JICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZS1pbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotLyoKLSAqIDZjaCBtb2RlCi0gKiBuZWVkIHRvIHNldCB0aGUgY29kZWMgbGluZSBvdXQgYW5kIG1pYyAxIHBpbiB3aWRnZXRzIHRvIG91dHB1dHMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdGhyZWVzdGFja19jaDZfaW5pdFtdID0gewotCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIG91dHB1dCAoQmFjayBTdXJyb3VuZCkqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0IChDTEZFKSovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQotCXsgMHgwYywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0KLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MCB9LAotI2lmIDAKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAyIDw8IDgpKSB9LCAvKmxpbmUgaW4qLwotI2VuZGlmCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MV90aHJlZXN0YWNrX21vZGVzWzJdID0gewotCXsgMiwgYWxjODYxX3RocmVlc3RhY2tfY2gyX2luaXQgfSwKLQl7IDYsIGFsYzg2MV90aHJlZXN0YWNrX2NoNl9pbml0IH0sCi19OwotLyogU2V0IG1pYzEgYXMgaW5wdXQgYW5kIHVubXV0ZSB0aGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3VuaXdpbGxfbTMxX2NoMl9pbml0W10gPSB7Ci0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0vKiBTZXQgbWljMSBhcyBvdXRwdXQgYW5kIG11dGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3VuaXdpbGxfbTMxX2NoNF9pbml0W10gPSB7Ci0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSkgfSwgLyptaWMqLwotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4NjFfdW5pd2lsbF9tMzFfY2gyX2luaXQgfSwKLQl7IDQsIGFsYzg2MV91bml3aWxsX20zMV9jaDRfaW5pdCB9LAotfTsKLQotLyogU2V0IG1pYzEgYW5kIGxpbmUtaW4gYXMgaW5wdXQgYW5kIHVubXV0ZSB0aGUgbWl4ZXIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX2FzdXNfY2gyX2luaXRbXSA9IHsKLQkvKiBzZXQgcGluIHdpZGdldCAxQWggKGxpbmUgaW4pIGZvciBpbnB1dCAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQotCSAqIHRoZSB2cmVmCi0JICovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZS1pbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotLyogU2V0IG1pYzEgbmFkIGxpbmUtaW4gYXMgb3V0cHV0IGFuZCBtdXRlIG1peGVyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2NoNl9pbml0W10gPSB7Ci0JLyogc2V0IHBpbiB3aWRnZXQgMUFoIChsaW5lIGluKSBmb3Igb3V0cHV0IChCYWNrIFN1cnJvdW5kKSovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiB7IDB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCi0JLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxKSBmb3Igb3V0cHV0IChDTEZFKSovCi0JeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiB7IDB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFIH0sICovCi0JeyAweDBjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCXsgMHgwZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDgwIH0sCi0jaWYgMAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDAxIDw8IDgpKSB9LCAvKm1pYyovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpIH0sIC8qbGluZSBpbiovCi0jZW5kaWYKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxX2FzdXNfbW9kZXNbMl0gPSB7Ci0JeyAyLCBhbGM4NjFfYXN1c19jaDJfaW5pdCB9LAotCXsgNiwgYWxjODYxX2FzdXNfY2g2X2luaXQgfSwKLX07Ci0KLS8qIHBhdGNoLUFMQzg2MSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX2Jhc2VfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAotCi0gICAgICAgIC8qSW5wdXQgbWl4ZXIgY29udHJvbCAqLwotCS8qIEhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JICAgSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV8zU1RfbWl4ZXJbXSA9IHsKLSAgICAgICAgLyogb3V0cHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwNiwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNSwgMiwgMHgwLCBIREFfT1VUUFVUKSwKLQkvKkhEQV9DT0RFQ19NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MDQsIDB4MCwgSERBX09VVFBVVCksICovCi0KLQkvKiBJbnB1dCBtaXhlciBjb250cm9sICovCi0JLyogSERBX0NPREVDX1ZPTFVNRSgiSW5wdXQgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQkgICBIREFfQ09ERUNfTVVURSgiSW5wdXQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9JTlBVVCksCi0KLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0gICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV90aHJlZXN0YWNrX21vZGVzKSwKLQl9LAotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfdG9zaGliYV9taXhlcltdID0gewotICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwotCUhEQV9DT0RFQ19NVVRFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyW10gPSB7Ci0gICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JLypIREFfQ09ERUNfTVVURSgiU2lkZSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLCAqLwotCi0JLyogSW5wdXQgbWl4ZXIgY29udHJvbCAqLwotCS8qIEhEQV9DT0RFQ19WT0xVTUUoIklucHV0IFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JICAgSERBX0NPREVDX01VVEUoIklucHV0IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksICovCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMCwgMHgwMSwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFhLCAweDAzLCBIREFfSU5QVVQpLAotCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKLQkJLmluZm8gPSBhbGNfY2hfbW9kZV9pbmZvLAotCQkuZ2V0ID0gYWxjX2NoX21vZGVfZ2V0LAotCQkucHV0ID0gYWxjX2NoX21vZGVfcHV0LAotICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAotCX0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9hc3VzX21peGVyW10gPSB7Ci0gICAgICAgIC8qIG91dHB1dCBtaXhlciBjb250cm9sICovCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MDYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDEsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEVfTU9OTygiTEZFIFBsYXliYWNrIFN3aXRjaCIsIDB4MDUsIDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIlNpZGUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKLQotCS8qIElucHV0IG1peGVyIGNvbnRyb2wgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJJbnB1dCBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnB1dCBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDE1LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX09VVFBVVCksCi0KLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0gICAgICAgICAgICAgICAgLnByaXZhdGVfdmFsdWUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKLQl9LAotCXsgfQotfTsKLQotLyogYWRkaXRpb25hbCBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCXsgfQotfTsKLQotLyoKLSAqIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24gb2YgQURDLCBpbnB1dCBtaXhlcnMgYW5kIG91dHB1dCBtaXhlcnMKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LAotCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUYgZm9yIG1pYy1pbiAoZnJvbnQgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1HIGZvciBDTEZFIChyZWFyIHBhbmVsKSAqLwotCXsgMHgxZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDFmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgyMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBDRC1pbiAqLwotCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCi0JICovCi0JLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4YzAgfSwKLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdW5pd2lsbF9tMzFfaW5pdF92ZXJic1tdID0gewotCS8qCi0JICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KLQkgKi8KLQkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JLyogcG9ydC1CIGZvciBtaWMtaW4gKHJlYXIgcGFuZWwpIHdpdGggdnJlZiAqLwotCXsgMHgwZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcG9ydC1DIGZvciBsaW5lLWluIChyZWFyIHBhbmVsKSAqLwotCXsgMHgwYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcG9ydC1EIGZvciBGcm9udCAqLwotCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQkvKiB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCi0JLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MTAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtRyBmb3IgQ0xGRSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MWYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIHBvcnQtSCBmb3Igc2lkZSAocmVhciBwYW5lbCkgKi8KLQl7IDB4MjAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAotCS8qIENELWluICovCi0JeyAweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiByb3V0ZSBmcm9udCBtaWMgdG8gQURDMSovCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCi0JezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JLyogVW5tdXRlIE1peGVyIDE0IChtaWMpIDFjIChMaW5lIGluKSovCi0JezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLSAgICAgICAgezB4MDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JLyogVW5tdXRlIFN0ZXJlbyBNaXhlciAxNSAqLwotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGN9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCi0KLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCS8qIGhwIHVzZWQgREFDIDMgKEZyb250KSAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKLSAgICAgICAgezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCS8qIHBvcnQtQSBmb3Igc3Vycm91bmQgKHJlYXIgcGFuZWwpCi0JICogYWNjb3JkaW5nIHRvIGNvZGVjIzAgdGhpcyBpcyB0aGUgSFAgamFjawotCSAqLwotCXsgMHgwZSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwIH0sIC8qIHdhcyAweDAwICovCi0JLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBlLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMSB9LAotCS8qIHBvcnQtQiBmb3IgbWljLWluIChyZWFyIHBhbmVsKSB3aXRoIHZyZWYgKi8KLQl7IDB4MGQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LAotCS8qIHBvcnQtQyBmb3IgbGluZS1pbiAocmVhciBwYW5lbCkgKi8KLQl7IDB4MGMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyMCB9LAotCS8qIHBvcnQtRCBmb3IgRnJvbnQgKi8KLQl7IDB4MGIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHg0MCB9LAotCXsgMHgwYiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDAgfSwKLQkvKiBwb3J0LUUgZm9yIEhQIG91dCAoZnJvbnQgcGFuZWwpICovCi0JLyogdGhpcyBoYXMgdG8gYmUgc2V0IHRvIFZSRUY4MCAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAotCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCi0JeyAweDEwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQkvKiBwb3J0LUcgZm9yIENMRkUgKHJlYXIgcGFuZWwpICovCi0JeyAweDFmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiBwb3J0LUggZm9yIHNpZGUgKHJlYXIgcGFuZWwpICovCi0JeyAweDIwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQkvKiBDRC1pbiAqLwotCXsgMHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDIwIH0sCi0JLyogcm91dGUgZnJvbnQgbWljIHRvIEFEQzEqLwotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCS8qIFVubXV0ZSBEQUMwfjMgJiBzcGRpZiBvdXQqLwotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDA2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBVbm11dGUgTWl4ZXIgMTQgKG1pYykgMWMgKExpbmUgaW4pKi8KLQl7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotICAgICAgICB7MHgwMTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0gICAgICAgIHsweDAxYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0KLQkvKiBVbm11dGUgU3RlcmVvIE1peGVyIDE1ICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KLQotCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7IH0KLX07Ci0KLS8qIGFkZGl0aW9uYWwgaW5pdCB2ZXJicyBmb3IgQVNVUyBsYXB0b3BzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV9hc3VzX2xhcHRvcF9pbml0X3ZlcmJzW10gPSB7Ci0JeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDUgfSwgLyogSFAtb3V0ICovCi0JeyAweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKSB9LCAvKiBtdXRlIGxpbmUtaW4gKi8KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxX3Rvc2hpYmFfaW5pdF92ZXJic1tdID0gewotCXsweDBmLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDX0hQX0VWRU5UfSwKLQotCXsgfQotfTsKLQotLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYWxjODYxX3Rvc2hpYmFfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JdW5zaWduZWQgaW50IHByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDBmKTsKLQotCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgMHgxNiwgSERBX0lOUFVULCAwLAotCQkJCSBIREFfQU1QX01VVEUsIHByZXNlbnQgPyBIREFfQU1QX01VVEUgOiAwKTsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MWEsIEhEQV9JTlBVVCwgMywKLQkJCQkgSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gMCA6IEhEQV9BTVBfTVVURSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsYzg2MV90b3NoaWJhX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVzKQotewotCWlmICgocmVzID4+IDI2KSA9PSBBTENfSFBfRVZFTlQpCi0JCWFsYzg2MV90b3NoaWJhX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotI2RlZmluZSBBTEM4NjFfRElHT1VUX05JRAkweDA3Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBhbGM4NjFfOGNoX21vZGVzWzFdID0gewotCXsgOCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9kYWNfbmlkc1s0XSA9IHsKLQkvKiBmcm9udCwgc3Vycm91bmQsIGNsZmUsIHNpZGUgKi8KLQkweDAzLCAweDA2LCAweDA1LCAweDA0Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MF9kYWNfbmlkc1szXSA9IHsKLQkvKiBmcm9udCwgY2xmZSwgc3Vycm91bmQgKi8KLQkweDAzLCAweDA1LCAweDA2Ci19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MV9hZGNfbmlkc1sxXSA9IHsKLQkvKiBBREMwLTIgKi8KLQkweDA4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MV9jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gNSwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJGcm9udCBNaWMiLCAweDMgfSwKLQkJeyAiTGluZSIsIDB4MSB9LAotCQl7ICJDRCIsIDB4NCB9LAotCQl7ICJNaXhlciIsIDB4NSB9LAotCX0sCi19OwotCi0vKgotICogY29uZmlndXJhdGlvbiBhbmQgcHJlc2V0Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxjODYxX21vZGVsc1tBTEM4NjFfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzg2MV8zU1RdCQk9ICIzc3RhY2siLAotCVtBTEM2NjBfM1NUXQkJPSAiM3N0YWNrLTY2MCIsCi0JW0FMQzg2MV8zU1RfRElHXQk9ICIzc3RhY2stZGlnIiwKLQlbQUxDODYxXzZTVF9ESUddCT0gIjZzdGFjay1kaWciLAotCVtBTEM4NjFfVU5JV0lMTF9NMzFdCT0gInVuaXdpbGwtbTMxIiwKLQlbQUxDODYxX1RPU0hJQkFdCT0gInRvc2hpYmEiLAotCVtBTEM4NjFfQVNVU10JCT0gImFzdXMiLAotCVtBTEM4NjFfQVNVU19MQVBUT1BdCT0gImFzdXMtbGFwdG9wIiwKLQlbQUxDODYxX0FVVE9dCQk9ICJhdXRvIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4NjFfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDUsICJBU1VTIFc3SiIsIEFMQzg2MV8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzUsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzgsICJBU1VTIEYyLzMiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzOTMsICJBU1VTIiwgQUxDODYxX0FTVVMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzZDcsICJBU1VTIEE5cnAiLCBBTEM4NjFfQVNVU19MQVBUT1ApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxY2IsICJBU1VTIFAxLUFIMiIsIEFMQzg2MV8zU1RfRElHKSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjAwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwKLQkvKiBGSVhNRTogdGhlIGVudHJ5IGJlbG93IGJyZWFrcyBUb3NoaWJhIEExMDAgKG1vZGVsPWF1dG8gd29ya3MhKQotCSAqICAgICAgICBBbnkgb3RoZXIgbW9kZWxzIHRoYXQgbmVlZCB0aGlzIHByZXNldD8KLQkgKi8KLQkvKiBTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjEwLCAiVG9zaGliYSIsIEFMQzg2MV9UT1NISUJBKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3MjU0LCAiSFAgZHgyMjAwIChNU0kgTVMtNzI1NCkiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg3Mjk3LCAiSFAgZHgyMjUwIChNU0kgTVMtNzI5NykiLCBBTEM4NjFfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTU4NCwgMHgyYjAxLCAiVW5pd2lsbCBYNDBBSXgiLCBBTEM4NjFfVU5JV0lMTF9NMzEpLAotCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzIsICJVbml3aWxsIG0zMSIsIEFMQzg2MV9VTklXSUxMX00zMSksCi0JU05EX1BDSV9RVUlSSygweDE1ODQsIDB4OTA3NSwgIkFpcmlzIFByYXhpcyBOMTIxMiIsIEFMQzg2MV9BU1VTX0xBUFRPUCksCi0JLyogRklYTUU6IHRoZSBiZWxvdyBzZWVtcyBjb25mbGljdCAqLwotCS8qIFNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzUsICJVbml3aWxsIiwgQUxDODYxX1VOSVdJTExfTTMxKSwgKi8KLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwNjYwLCAiQXNyb2NrIDkzOVNMSTMyIiwgQUxDNjYwXzNTVCksCi0JU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMCwgIkludGVsIiwgQUxDODYxXzNTVCksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxX3ByZXNldHNbXSA9IHsKLQlbQUxDODYxXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzNTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX3RocmVlc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxXzZTVF9ESUddID0gewotCQkubWl4ZXJzID0geyBhbGM4NjFfYmFzZV9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2Jhc2VfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfOGNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV84Y2hfbW9kZXMsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYwXzNTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV8zU1RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV90aHJlZXN0YWNrX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjBfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjBfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdGhyZWVzdGFja19tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjFfdGhyZWVzdGFja19tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX1VOSVdJTExfTTMxXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3VuaXdpbGxfbTMxX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfdW5pd2lsbF9tMzFfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxX3VuaXdpbGxfbTMxX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFfVE9TSElCQV0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV90b3NoaWJhX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYmFzZV9pbml0X3ZlcmJzLAotCQkJCWFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjFfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM4NjFfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODYxX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODYxX2FkY19uaWRzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MV9jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQsCi0JCS5pbml0X2hvb2sgPSBhbGM4NjFfdG9zaGliYV9hdXRvbXV0ZSwKLQl9LAotCVtBTEM4NjFfQVNVU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MV9hc3VzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjFfYXN1c19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MV9hc3VzX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MV9hc3VzX21vZGVzLAotCQkubmVlZF9kYWNfZml4ID0gMSwKLQkJLmhwX25pZCA9IDB4MDYsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxX0FTVVNfTEFQVE9QXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIsIGFsYzg2MV9hc3VzX2xhcHRvcF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxX2FzdXNfaW5pdF92ZXJicywKLQkJCQlhbGM4NjFfYXN1c19sYXB0b3BfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLm5lZWRfZGFjX2ZpeCA9IDEsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MV9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg2MV9hZGNfbmlkcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjFfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODYxdmRfcXVpcmtzLmMgYi9zb3VuZC9wY2kvaGRhL2FsYzg2MXZkX3F1aXJrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjI4NDUwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjODYxdmRfcXVpcmtzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoKLSAqIEFMQzY2MC1WRC9BTEM4NjEtVkQgcXVpcmsgbW9kZWxzCi0gKiBpbmNsdWRlZCBieSBwYXRjaF9yZWFsdGVrLmMKLSAqLwotCi0vKiBBTEM4NjEtVkQgbW9kZWxzICovCi1lbnVtIHsKLQlBTEM4NjFWRF9BVVRPLAotCUFMQzY2MFZEXzNTVCwKLQlBTEM2NjBWRF8zU1RfRElHLAotCUFMQzY2MFZEX0FTVVNfVjFTLAotCUFMQzg2MVZEXzNTVCwKLQlBTEM4NjFWRF8zU1RfRElHLAotCUFMQzg2MVZEXzZTVF9ESUcsCi0JQUxDODYxVkRfTEVOT1ZPLAotCUFMQzg2MVZEX0RBTExBUywKLQlBTEM4NjFWRF9IUCwKLQlBTEM4NjFWRF9NT0RFTF9MQVNULAotfTsKLQotI2RlZmluZSBBTEM4NjFWRF9ESUdPVVRfTklECTB4MDYKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9kYWNfbmlkc1s0XSA9IHsKLQkvKiBmcm9udCwgc3VyciwgY2xmZSwgc2lkZSBzdXJyICovCi0JMHgwMiwgMHgwMywgMHgwNCwgMHgwNQotfTsKLQotLyogZGFjX25pZHMgZm9yIEFMQzY2MHZkIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciAtIGFjY29yZGluZyB0bwotICogUmVhbHRlaydzIGRyaXZlci4KLSAqIFRoaXMgc2hvdWxkIHByb2JhYmx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCBtaXhlciBmb3IgNnN0YWNrIG1vZGVscwotICogb2YgQUxDNjYwdmQgY29kZWNzLCBidXQgZm9yIG5vdyB0aGVyZSBpcyBvbmx5IDNzdGFjayBtaXhlcgotICogLSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gODYxdmQuCi0gKiBhZGNfbmlkcyBpbiBBTEM2NjB2ZCBhcmUgKGlzKSB0aGUgc2FtZSBhcyBpbiA4NjF2ZAotICovCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2MHZkX2RhY19uaWRzWzNdID0gewotCS8qIGZyb250LCByZWFyLCBjbGZlLCByZWFyX3N1cnIgKi8KLQkweDAyLCAweDA0LCAweDAzCi19OwotCi1zdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzg2MXZkX2FkY19uaWRzWzFdID0gewotCS8qIEFEQzAgKi8KLQkweDA5LAotfTsKLQotc3RhdGljIGNvbnN0IGhkYV9uaWRfdCBhbGM4NjF2ZF9jYXBzcmNfbmlkc1sxXSA9IHsgMHgyMiB9OwotCi0vKiBpbnB1dCBNVVggKi8KLS8qIEZJWE1FOiBzaG91bGQgYmUgYSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UgPSB7Ci0JLm51bV9pdGVtcyA9IDQsCi0JLml0ZW1zID0gewotCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiRnJvbnQgTWljIiwgMHgxIH0sCi0JCXsgIkxpbmUiLCAweDIgfSwKLQkJeyAiQ0QiLCAweDQgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSA9IHsKLQkubnVtX2l0ZW1zID0gMiwKLQkuaXRlbXMgPSB7Ci0JCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2hwX2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAotCS5pdGVtcyA9IHsKLQkJeyAiRnJvbnQgTWljIiwgMHgwIH0sCi0JCXsgIkFUQVBJIE1pYyIsIDB4MSB9LAotCX0sCi19OwotCi0vKgotICogMmNoIG1vZGUKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXNbMV0gPSB7Ci0JeyAyLCBOVUxMIH0KLX07Ci0KLS8qCi0gKiA2Y2ggbW9kZQotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19jaDZfaW5pdFtdID0gewotCXsgMHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDAwIH0sCi0JeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyoKLSAqIDhjaCBtb2RlCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfNnN0YWNrX2NoOF9pbml0W10gPSB7Ci0JeyAweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IDB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAotCXsgMHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JeyAweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKLQl7IH0gLyogZW5kICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjODYxdmRfNnN0YWNrX21vZGVzWzJdID0gewotCXsgNiwgYWxjODYxdmRfNnN0YWNrX2NoNl9pbml0IH0sCi0JeyA4LCBhbGM4NjF2ZF82c3RhY2tfY2g4X2luaXQgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9jaG1vZGVfbWl4ZXJbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJDaGFubmVsIE1vZGUiLAotCQkuaW5mbyA9IGFsY19jaF9tb2RlX2luZm8sCi0JCS5nZXQgPSBhbGNfY2hfbW9kZV9nZXQsCi0JCS5wdXQgPSBhbGNfY2hfbW9kZV9wdXQsCi0JfSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBQaW4gYXNzaWdubWVudDogRnJvbnQ9MHgxNCwgUmVhcj0weDE1LCBDTEZFPTB4MTYsIFNpZGU9MHgxNwotICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBGcm9udCBNaWM9MHgxOSwgTGluZS1Jbj0weDFhLCBIUD0weDFiCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF82c3RfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJTdXJyb3VuZCBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIlN1cnJvdW5kIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsCi0JCQkJSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9NT05PKCJMRkUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMiwgMHgwLAotCQkJCUhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGUsIDEsIDIsIEhEQV9JTlBVVCksCi0JSERBX0JJTkRfTVVURV9NT05PKCJMRkUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZSwgMiwgMiwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF8zc3RfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQotCXsgfSAvKiBlbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9sZW5vdm9fbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAotCS8qSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwqLwotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDE0LCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0KLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotLyogUGluIGFzc2lnbm1lbnQ6IFNwZWFrZXI9MHgxNCwgSFAgPSAweDE1LAotICogICAgICAgICAgICAgICAgIE1pYz0weDE4LCBJbnRlcm5hbCBNaWMgPSAweDE5LCBDRCA9IDB4MWMsIFBDIEJlZXAgPSAweDFkCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9kYWxsYXNfbWl4ZXJbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9CSU5EX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDBkLCAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQl7IH0gLyogZW5kICovCi19OwotCi0vKiBQaW4gYXNzaWdubWVudDogU3BlYWtlcj0weDE0LCBMaW5lLW91dCA9IDB4MTUsCi0gKiAgICAgICAgICAgICAgICAgRnJvbnQgTWljPTB4MTgsIEFUQVBJIE1pYyA9IDB4MTksCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjF2ZF9ocF9taXhlcltdID0gewotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkFUQVBJIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkFUQVBJIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKgotICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBVbm11dGUgQURDMCBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgotCSAqLwotCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCi0JLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZgotCSAqIHRoZSBhbmFsb2ctbG9vcGJhY2sgbWl4ZXIgd2lkZ2V0Ci0JICovCi0JLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLwotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMil9LAotCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgzKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCS8qIENhcHR1cmUgbWl4ZXI6IHVubXV0ZSBNaWMsIEYtTWljLCBMaW5lLCBDRCBpbnB1dHMgKi8KLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCi0KLQkvKgotCSAqIFNldCB1cCBvdXRwdXQgbWl4ZXJzICgweDAyIC0gMHgwNSkKLQkgKi8KLQkvKiBzZXQgdm9sPTAgdG8gb3V0cHV0IG1peGVycyAqLwotCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAotCi0JLyogc2V0IHVwIGlucHV0IGFtcHMgZm9yIGFuYWxvZyBsb29wYmFjayAqLwotCS8qIEFtcCBJbmRpY2VzOiBEQUMgPSAwLCBtaXhlciA9IDEgKi8KLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiAzLXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgotICogZnJvbnQgPSAweDE0LCBtaWMvY2xmZSA9IDB4MTgsIEhQID0gMHgxOSwgbGluZS9zdXJyID0gMHgxYSwgZi1taWMgPSAweDFiCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnNbXSA9IHsKLQkvKgotCSAqIFNldCBwaW4gbW9kZSBhbmQgbXV0aW5nCi0JICovCi0JLyogc2V0IGZyb250IHBpbiB3aWRnZXRzIDB4MTQgZm9yIG91dHB1dCAqLwotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQotCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZSBJbiBwaW46IGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLS8qCi0gKiA2LXN0YWNrIHBpbiBjb25maWd1cmF0aW9uOgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkXzZzdGFja19pbml0X3ZlcmJzW10gPSB7Ci0JLyoKLQkgKiBTZXQgcGluIG1vZGUgYW5kIG11dGluZwotCSAqLwotCS8qIHNldCBmcm9udCBwaW4gd2lkZ2V0cyAweDE0IGZvciBvdXRwdXQgKi8KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCi0KLQkvKiBSZWFyIFBpbjogb3V0cHV0IDEgKDB4MGQpICovCi0JezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LAotCS8qIENMRkUgUGluOiBvdXRwdXQgMiAoMHgwZSkgKi8KLQl7MHgxNiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMn0sCi0JLyogU2lkZSBQaW46IG91dHB1dCAzICgweDBmKSAqLwotCXsweDE3LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAzfSwKLQotCS8qIE1pYyAocmVhcikgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLwotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAotCS8qIEZyb250IE1pYyBwaW46IGlucHV0IHZyZWYgYXQgODAlICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JLyogTGluZSBJbiBwaW46IGlucHV0ICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKLQkvKiBMaW5lLTIgSW46IEhlYWRwaG9uZSBvdXRwdXQgKG91dHB1dCAwIC0gMHgwYykgKi8KLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MWIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBDRCBwaW4gd2lkZ2V0IGZvciBpbnB1dCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0KLQl7IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODYxdmRfZWFwZF92ZXJic1tdID0gewotCXsweDE0LCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMn0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJic1tdID0gewotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDUpfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTENfTUlDX0VWRU5UfSwKLQl7fQotfTsKLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlhbGNfaHBfYXV0b211dGUoY29kZWMpOwotCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKLX0KLQotc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCQl1bnNpZ25lZCBpbnQgcmVzKQotewotCXN3aXRjaCAocmVzID4+IDI2KSB7Ci0JY2FzZSBBTENfTUlDX0VWRU5UOgotCQlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWFsY19za3VfdW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF9kYWxsYXNfdmVyYnNbXSA9IHsKLQl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKLQotCXsweDBjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MGQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKLQl7MHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAotCXsweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MGUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgwZiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAotCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0KLQl7MHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCi0JezB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY1MH0sCi0JezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwKLQotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMyl9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDQpfSwKLQotCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCi0JezB4MDksIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQl7MHgxNSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQ19IUF9FVkVOVH0sCi0KLQl7IH0gLyogZW5kICovCi19OwotCi0vKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9kYWxsYXNfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0KLQlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7Ci19Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGM4NjF2ZF9tb2RlbHNbQUxDODYxVkRfTU9ERUxfTEFTVF0gPSB7Ci0JW0FMQzY2MFZEXzNTVF0JCT0gIjNzdGFjay02NjAiLAotCVtBTEM2NjBWRF8zU1RfRElHXQk9ICIzc3RhY2stNjYwLWRpZ291dCIsCi0JW0FMQzY2MFZEX0FTVVNfVjFTXQk9ICJhc3VzLXYxcyIsCi0JW0FMQzg2MVZEXzNTVF0JCT0gIjNzdGFjayIsCi0JW0FMQzg2MVZEXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAotCVtBTEM4NjFWRF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKLQlbQUxDODYxVkRfTEVOT1ZPXQk9ICJsZW5vdm8iLAotCVtBTEM4NjFWRF9EQUxMQVNdCT0gImRhbGxhcyIsCi0JW0FMQzg2MVZEX0hQXQkJPSAiaHAiLAotCVtBTEM4NjFWRF9BVVRPXQkJPSAiYXV0byIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfY2ZnX3RibFtdID0gewotCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweGE4OGQsICJSZWFsdGVrIEFMQzY2MCBkZW1vIiwgQUxDNjYwVkRfM1NUKSwKLQlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGJmLCAiSFAgVFgxMDAwIiwgQUxDODYxVkRfSFApLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZTIsICJBc3VzIHozNW0iLCBBTEM2NjBWRF8zU1QpLAotCS8qU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFzdXMgRzEiLCBBTEM2NjBWRF8zU1QpLCovIC8qIGF1dG8gKi8KLQlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjMzLCAiQXN1cyBWMVNuIiwgQUxDNjYwVkRfQVNVU19WMVMpLAotCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZTcsICJBU1VTIiwgQUxDNjYwVkRfM1NUX0RJRyksCi0JU05EX1BDSV9RVUlSSygweDEwZGUsIDB4MDNmMCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDAsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCS8qU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYwMCwgIkRBTExBUyIsIEFMQzg2MVZEX0RBTExBUyksKi8gLypsZW5vdm8qLwotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDEsICJUb3NoaWJhIEExMzUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDMsICJUb3NoaWJhIFAyMDUiLCBBTEM4NjFWRF9MRU5PVk8pLAotCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMzEsICJUb3NoaWJhIEwzMC0xNDkiLCBBTEM4NjFWRF9EQUxMQVMpLAotCVNORF9QQ0lfUVVJUksoMHgxNTY1LCAweDgyMGQsICJCaW9zdGFyIE5GNjFTIFNFIiwgQUxDODYxVkRfNlNUX0RJRyksCi0JU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxN2FhLCAiTGVub3ZvIiwgQUxDODYxVkRfTEVOT1ZPKSwKLQlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwODYyLCAiQVNSb2NrIEs4TkY2Ry1WU1RBIiwgQUxDODYxVkRfNlNUX0RJRyksCi0Je30KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjODYxdmRfcHJlc2V0c1tdID0gewotCVtBTEM2NjBWRF8zU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDNjYwVkRfM1NUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJIGFsYzg2MXZkXzNzdGFja19pbml0X3ZlcmJzIH0sCi0JCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYwdmRfZGFjX25pZHMpLAotCQkuZGFjX25pZHMgPSBhbGM2NjB2ZF9kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODYxVkRfRElHT1VUX05JRCwKLQkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4NjF2ZF9jYXB0dXJlX3NvdXJjZSwKLQl9LAotCVtBTEM4NjFWRF8zU1RdID0gewotCQkubWl4ZXJzID0geyBhbGM4NjF2ZF8zc3RfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX3ZvbHVtZV9pbml0X3ZlcmJzLAotCQkJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxVkRfM1NUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzNzdF9taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCSAJCSBhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCi0JfSwKLQlbQUxDODYxVkRfNlNUX0RJR10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkXzZzdF9taXhlciwgYWxjODYxdmRfY2htb2RlX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKLQkJCQlhbGM4NjF2ZF82c3RhY2tfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF82c3RhY2tfbW9kZXMpLAotCQkuY2hhbm5lbF9tb2RlID0gYWxjODYxdmRfNnN0YWNrX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCX0sCi0JW0FMQzg2MVZEX0xFTk9WT10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfZWFwZF92ZXJicywKLQkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCi0JfSwKLQlbQUxDODYxVkRfREFMTEFTXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfZGFsbGFzX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF9kYWxsYXNfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4NjF2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg2MXZkX2RhY19uaWRzLAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSwKLQkJLnVuc29sX2V2ZW50ID0gYWxjX3NrdV91bnNvbF9ldmVudCwKLQkJLnNldHVwID0gYWxjODYxdmRfZGFsbGFzX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2hwX2F1dG9tdXRlLAotCX0sCi0JW0FMQzg2MVZEX0hQXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODYxdmRfaHBfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MXZkX2RhbGxhc192ZXJicywgYWxjODYxdmRfZWFwZF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2RhY19uaWRzKSwKLQkJLmRhY19uaWRzID0gYWxjODYxdmRfZGFjX25pZHMsCi0JCS5kaWdfb3V0X25pZCA9IEFMQzg2MVZEX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKLQkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCi0JCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfaHBfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2RhbGxhc19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsY19ocF9hdXRvbXV0ZSwKLQl9LAotCVtBTEM2NjBWRF9BU1VTX1YxU10gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg2MXZkX2xlbm92b19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODYxdmRfdm9sdW1lX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfM3N0YWNrX2luaXRfdmVyYnMsCi0JCQkJYWxjODYxdmRfZWFwZF92ZXJicywKLQkJCQlhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnMgfSwKLQkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM2NjB2ZF9kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzY2MHZkX2RhY19uaWRzLAotCQkuZGlnX291dF9uaWQgPSBBTEM4NjFWRF9ESUdPVVRfTklELAotCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODYxdmRfM3N0YWNrXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzLAotCQkuaW5wdXRfbXV4ID0gJmFsYzg2MXZkX2NhcHR1cmVfc291cmNlLAotCQkudW5zb2xfZXZlbnQgPSBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg2MXZkX2xlbm92b19zZXR1cCwKLQkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19pbml0X2hvb2ssCi0JfSwKLX07Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjODgwX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKaW5kZXggYzg0NGQyYi4uYmVhMjJlZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKKysrIGIvc291bmQvcGNpL2hkYS9hbGM4ODBfcXVpcmtzLmMKQEAgLTc0OSw4ICs3NDksNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNzgxLDggKzc4MCw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTA1MSw4ICsxMDQ5LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKgpAQCAtMTEzNyw4ICsxMTM0LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MWI7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgwX21lZGlvbl9yaW1fbWl4ZXJbXSA9IHsKQEAgLTExODgsNyArMTE4NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJYWxjX2hwX2F1dG9tdXRlKGNvZGVjKTsKIAkvKiB0b2dnbGUgRUFQRCAqLwotCWlmIChzcGVjLT5qYWNrX3ByZXNlbnQpCisJaWYgKHNwZWMtPmhwX2phY2tfcHJlc2VudCkKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAwKTsKIAllbHNlCiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDEsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMik7CkBAIC0xMjEwLDggKzEyMDYsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2FsYzg4Ml9xdWlya3MuYyBiL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCmluZGV4IDYxN2QwNDcuLmUyNTE1MTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvYWxjODgyX3F1aXJrcy5jCkBAIC0xNzMsOCArMTczLDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE5OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzRdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODg5X2ludGVsX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTE5MSw4ICsxOTAsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1sxXSA9IDB4MWI7IC8qIGhwICovCiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OyAvKiBzcGVha2VyICovCiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE1OyAvKiBiYXNzICovCi0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIC8qCkBAIC00NzUsOCArNDczLDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODg4X2FjZXJfYXNwaXJlXzY1MzBnX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNDg3LDggKzQ4NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4OF9hY2VyX2FzcGlyZV83NzMwZ19zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTQ5OSw4ICs0OTUsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODlfYWNlcl9hc3BpcmVfODkzMGdfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC01MTEsOCArNTA2LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMV0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzJdID0gMHgxYjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogI2RlZmluZSBBTEM4ODJfRElHT1VUX05JRAkweDA2CkBAIC0xNzExLDggKzE3MDUsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxYTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogI2RlZmluZSBhbGM4ODVfbWI1X3NldHVwCWFsYzg4NV9pbWFjMjRfc2V0dXAKQEAgLTE3MjEsMTIgKzE3MTQsMTEgQEAKIC8qIE1hY2Jvb2sgQWlyIDIsMSAqLwogc3RhdGljIHZvaWQgYWxjODg1X21iYTIxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotICAgICAgIHN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCi0gICAgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKLSAgICAgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTg7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CisJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE4OworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIApAQCAtMTczNyw4ICsxNzI5LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODVfaW1hYzkxX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMTc0OCw4ICsxNzM5LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxODsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MWE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgyX3RhcmdhX3ZlcmJzW10gPSB7CkBAIC0xNzczLDcgKzE3NjMsNyBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWFsY19ocF9hdXRvbXV0ZShjb2RlYyk7CiAJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLAotCQkJCSAgc3BlYy0+amFja19wcmVzZW50ID8gMSA6IDMpOworCQkJCSAgc3BlYy0+aHBfamFja19wcmVzZW50ID8gMSA6IDMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODJfdGFyZ2Ffc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0xNzgyLDggKzE3NzIsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MWI7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4Ml90YXJnYV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlcykKQEAgLTIxODcsOCArMjE3Niw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFhOwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19hY2VyX2FzcGlyZV9taXhlcltdID0gewpAQCAtMjM0MSw4ICsyMzI5LDcgQEAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTc7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21pdGFjX3ZlcmJzW10gPSB7CkBAIC0yNTA3LDggKzI0OTQsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1sxXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE4OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF8zc3RfaHBfdmVyYnNbXSA9IHsKQEAgLTI1NjgsOCArMjU1NCw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwpAQCAtMjU3OSw4ICsyNTY0LDcgQEAKIAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCkBAIC0yNTkzLDggKzI1NzcsNyBAQAogCiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSA9IDB4MTQ7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI2MjMsOCArMjYwNiw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX2hhaWVyX3c2Nl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI2MzMsOCArMjYxNSw3IEBACiAKIAlzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0gPSAweDFiOwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNDsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX2xlbm92b18xMDFlX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMjY0NCwxMCArMjYyNSw3IEBACiAJc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdID0gMHgxYjsKIAlzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdID0gMHgxNTsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+ZGV0ZWN0X2xpbmUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX2xpbmVzID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiAvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCkBAIC0yNjU4LDggKzI2MzYsNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTQ7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE1OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNjsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfYWNlcl9lYXBkX3ZlcmJzW10gPSB7CkBAIC0yNjg5LDggKzI2NjYsNyBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNTsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1syXSA9IDB4MTY7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbM10gPSAweDE3OwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODhfbGVub3ZvX3NreV9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTI3MDMsOCArMjY3OSw3IEBACiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMl0gPSAweDE2OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzNdID0gMHgxNzsKIAlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1s0XSA9IDB4MWE7Ci0Jc3BlYy0+YXV0b211dGUgPSAxOwotCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfQU1QOworCWFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3BlYywgQUxDX0FVVE9NVVRFX0FNUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg4M192YWlvdHRfc2V0dXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0yNzE0LDggKzI2ODksNyBAQAogCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSA9IDB4MTU7CiAJc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF0gPSAweDE0OwogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNzsKLQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0Jc3BlYy0+YXV0b211dGVfbW9kZSA9IEFMQ19BVVRPTVVURV9BTVA7CisJYWxjX3NpbXBsZV9zZXR1cF9hdXRvbXV0ZShzcGVjLCBBTENfQVVUT01VVEVfQU1QKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBhbGM4ODhfYXN1c19tOTB2X3ZlcmJzW10gPSB7CkBAIC0yNzM5LDggKzI3MTMsNyBAQAogCXNwZWMtPmV4dF9taWNfcGluID0gMHgxODsKIAlzcGVjLT5pbnRfbWljX3BpbiA9IDB4MTk7CiAJc3BlYy0+YXV0b19taWMgPSAxOwotCXNwZWMtPmF1dG9tdXRlID0gMTsKLQlzcGVjLT5hdXRvbXV0ZV9tb2RlID0gQUxDX0FVVE9NVVRFX0FNUDsKKwlhbGNfc2ltcGxlX3NldHVwX2F1dG9tdXRlKHNwZWMsIEFMQ19BVVRPTVVURV9BTVApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGFsYzg4OF9hc3VzX2VlZTE2MDFfdmVyYnNbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvYWxjX3F1aXJrcy5jIGIvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKaW5kZXggMmJlMTEyOS4uYTE4OTUyZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKKysrIGIvc291bmQvcGNpL2hkYS9hbGNfcXVpcmtzLmMKQEAgLTQ1Myw2ICs0NTMsMTkgQEAKIAlhbGNfZml4dXBfYXV0b2NmZ19waW5fbnVtcyhjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsY19zaW1wbGVfc2V0dXBfYXV0b211dGUoc3RydWN0IGFsY19zcGVjICpzcGVjLCBpbnQgbW9kZSkKK3sKKwlpbnQgbG9fcGluID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdOworCisJaWYgKGxvX3BpbiA9PSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSB8fAorCQlsb19waW4gPT0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdKQorCQlsb19waW4gPSAwOworCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBtb2RlOworCXNwZWMtPmRldGVjdF9ocCA9ICEhc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOworCXNwZWMtPmRldGVjdF9sbyA9ICEhbG9fcGluOworCXNwZWMtPmF1dG9tdXRlX2xvID0gc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUgPSAhIWxvX3BpbjsKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gc3BlYy0+YXV0b211dGVfc3BlYWtlcl9wb3NzaWJsZSA9ICEhc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnNbMF07Cit9CiAKIC8qIGF1dG8tdG9nZ2xlIGZyb250IG1pYyAqLwogc3RhdGljIHZvaWQgYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKaW5kZXggMjk3MTRjOC4uNjA3MzhlNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2JlZXAuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IGYzYWVmZWYuLmU0NGIxMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgpAQCAtMzQsNiArMzUsOSBAQAogI2luY2x1ZGUgImhkYV9iZWVwLmgiCiAjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgImhkYV90cmFjZS5oIgorCiAvKgogICogdmVuZG9yIC8gcHJlc2V0IHRhYmxlCiAgKi8KQEAgLTIwOCwxNSArMjEyLDE5IEBACiAgYWdhaW46CiAJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CiAJbXV0ZXhfbG9jaygmYnVzLT5jbWRfbXV0ZXgpOworCXRyYWNlX2hkYV9zZW5kX2NtZChjb2RlYywgY21kKTsKIAllcnIgPSBidXMtPm9wcy5jb21tYW5kKGJ1cywgY21kKTsKLQlpZiAoIWVyciAmJiByZXMpCisJaWYgKCFlcnIgJiYgcmVzKSB7CiAJCSpyZXMgPSBidXMtPm9wcy5nZXRfcmVzcG9uc2UoYnVzLCBjb2RlYy0+YWRkcik7CisJCXRyYWNlX2hkYV9nZXRfcmVzcG9uc2UoY29kZWMsICpyZXMpOworCX0KIAltdXRleF91bmxvY2soJmJ1cy0+Y21kX211dGV4KTsKIAlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCWlmIChyZXMgJiYgKnJlcyA9PSAtMSAmJiBidXMtPnJpcmJfZXJyb3IpIHsKIAkJaWYgKGJ1cy0+cmVzcG9uc2VfcmVzZXQpIHsKIAkJCXNuZF9wcmludGQoImhkYV9jb2RlYzogcmVzZXR0aW5nIEJVUyBkdWUgdG8gIgogCQkJCSAgICJmYXRhbCBjb21tdW5pY2F0aW9uIGVycm9yXG4iKTsKKwkJCXRyYWNlX2hkYV9idXNfcmVzZXQoYnVzKTsKIAkJCWJ1cy0+b3BzLmJ1c19yZXNldChidXMpOwogCQl9CiAJCWdvdG8gYWdhaW47CkBAIC02MDcsNiArNjE1LDcgQEAKIAlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CiAJdW5zaWduZWQgaW50IHdwOwogCisJdHJhY2VfaGRhX3Vuc29sX2V2ZW50KGJ1cywgcmVzLCByZXNfZXgpOwogCXVuc29sID0gYnVzLT51bnNvbDsKIAlpZiAoIXVuc29sKQogCQlyZXR1cm4gMDsKQEAgLTE0ODMsOCArMTQ5MiwxMSBAQAogCQkJCSAgc3RydWN0IGhkYV9jdnRfc2V0dXAgKnEpCiB7CiAJaGRhX25pZF90IG5pZCA9IHEtPm5pZDsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NIQU5ORUxfU1RSRUFNSUQsIDApOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfU1RSRUFNX0ZPUk1BVCwgMCk7CisJaWYgKHEtPnN0cmVhbV90YWcgfHwgcS0+Y2hhbm5lbF9pZCkKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9DSEFOTkVMX1NUUkVBTUlELCAwKTsKKwlpZiAocS0+Zm9ybWF0X2lkKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1NUUkVBTV9GT1JNQVQsIDAKKyk7CiAJbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOwogCXEtPm5pZCA9IG5pZDsKIH0KQEAgLTE2ODksNiArMTcwMSwyOSBAQAogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyk7CiAKIC8qKgorICogc25kX2hkYV9vdmVycmlkZV9waW5fY2FwcyAtIE92ZXJyaWRlIHRoZSBwaW4gY2FwYWJpbGl0aWVzCisgKiBAY29kZWM6IHRoZSBDT0RFQworICogQG5pZDogdGhlIE5JRCB0byBvdmVycmlkZQorICogQGNhcHM6IHRoZSBjYXBhYmlsaXR5IGJpdHMgdG8gc2V0CisgKgorICogT3ZlcnJpZGUgdGhlIGNhY2hlZCBQSU4gY2FwYWJpbGl0aXkgYml0cyB2YWx1ZSBieSB0aGUgZ2l2ZW4gb25lLgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY2FwcykKK3sKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOworCWluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIEhEQV9IQVNIX1BJTkNBUF9LRVkobmlkKSk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvLT5hbXBfY2FwcyA9IGNhcHM7CisJaW5mby0+aGVhZC52YWwgfD0gSU5GT19BTVBfQ0FQUzsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMpOworCisvKioKICAqIHNuZF9oZGFfcGluX3NlbnNlIC0gZXhlY3V0ZSBwaW4gc2Vuc2UgbWVhc3VyZW1lbnQKICAqIEBjb2RlYzogdGhlIENPREVDIHRvIHNlbnNlCiAgKiBAbmlkOiB0aGUgcGluIE5JRCB0byBzZW5zZQpAQCAtMjI5Niw2ICsyMzMxLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3R5cGVkZWYgaW50ICgqbWFwX3NsYXZlX2Z1bmNfdCkodm9pZCAqLCBzdHJ1Y3Qgc25kX2tjb250cm9sICopOworCisvKiBhcHBseSB0aGUgZnVuY3Rpb24gdG8gYWxsIG1hdGNoaW5nIHNsYXZlIGN0bHMgaW4gdGhlIG1peGVyIGxpc3QgKi8KK3N0YXRpYyBpbnQgbWFwX3NsYXZlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqIGNvbnN0ICpzbGF2ZXMsCisJCSAgICAgIG1hcF9zbGF2ZV9mdW5jX3QgZnVuYywgdm9pZCAqZGF0YSkgCit7CisJc3RydWN0IGhkYV9uaWRfaXRlbSAqaXRlbXM7CisJY29uc3QgY2hhciAqIGNvbnN0ICpzOworCWludCBpLCBlcnI7CisKKwlpdGVtcyA9IGNvZGVjLT5taXhlcnMubGlzdDsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm1peGVycy51c2VkOyBpKyspIHsKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqc2N0bCA9IGl0ZW1zW2ldLmtjdGw7CisJCWlmICghc2N0bCB8fCAhc2N0bC0+aWQubmFtZSB8fAorCQkgICAgc2N0bC0+aWQuaWZhY2UgIT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIpCisJCQljb250aW51ZTsKKwkJZm9yIChzID0gc2xhdmVzOyAqczsgcysrKSB7CisJCQlpZiAoIXN0cmNtcChzY3RsLT5pZC5uYW1lLCAqcykpIHsKKwkJCQllcnIgPSBmdW5jKGRhdGEsIHNjdGwpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2xhdmVfcHJlc2VudCh2b2lkICpkYXRhLCBzdHJ1Y3Qgc25kX2tjb250cm9sICpzY3RsKQoreworCXJldHVybiAxOworfQorCiAvKioKICAqIHNuZF9oZGFfYWRkX3ZtYXN0ZXIgLSBjcmVhdGUgYSB2aXJ0dWFsIG1hc3RlciBjb250cm9sIGFuZCBhZGQgc2xhdmVzCiAgKiBAY29kZWM6IEhELWF1ZGlvIGNvZGVjCkBAIC0yMzE2LDEyICsyMzg0LDEwIEBACiAJCQl1bnNpZ25lZCBpbnQgKnRsdiwgY29uc3QgY2hhciAqIGNvbnN0ICpzbGF2ZXMpCiB7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljb25zdCBjaGFyICogY29uc3QgKnM7CiAJaW50IGVycjsKIAotCWZvciAocyA9IHNsYXZlczsgKnMgJiYgIXNuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsICpzKTsgcysrKQotCQk7Ci0JaWYgKCEqcykgeworCWVyciA9IG1hcF9zbGF2ZXMoY29kZWMsIHNsYXZlcywgY2hlY2tfc2xhdmVfcHJlc2VudCwgTlVMTCk7CisJaWYgKGVyciAhPSAxKSB7CiAJCXNuZF9wcmludGRkKCJObyBzbGF2ZSBmb3VuZCBmb3IgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMyLDIzICsyMzk4LDEwIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlmb3IgKHMgPSBzbGF2ZXM7ICpzOyBzKyspIHsKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqc2N0bDsKLQkJaW50IGkgPSAwOwotCQlmb3IgKDs7KSB7Ci0JCQlzY3RsID0gX3NuZF9oZGFfZmluZF9taXhlcl9jdGwoY29kZWMsICpzLCBpKTsKLQkJCWlmICghc2N0bCkgewotCQkJCWlmICghaSkKLQkJCQkJc25kX3ByaW50ZGQoIkNhbm5vdCBmaW5kIHNsYXZlICVzLCAiCi0JCQkJCQkgICAgInNraXBwZWRcbiIsICpzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVyciA9IHNuZF9jdGxfYWRkX3NsYXZlKGtjdGwsIHNjdGwpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIGVycjsKLQkJCWkrKzsKLQkJfQotCX0KKwllcnIgPSBtYXBfc2xhdmVzKGNvZGVjLCBzbGF2ZXMsIChtYXBfc2xhdmVfZnVuY190KXNuZF9jdGxfYWRkX3NsYXZlLAorCQkJIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9hZGRfdm1hc3Rlcik7CkBAIC00MDg3LDYgKzQxNDAsNyBAQAogCQlyZXR1cm47CiAJfQogCisJdHJhY2VfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCWhkYV9jYWxsX2NvZGVjX3N1c3BlbmQoY29kZWMpOwogCWlmIChidXMtPm9wcy5wbV9ub3RpZnkpCiAJCWJ1cy0+b3BzLnBtX25vdGlmeShidXMpOwpAQCAtNDEyNSw2ICs0MTc5LDcgQEAKIAlpZiAoY29kZWMtPnBvd2VyX29uIHx8IGNvZGVjLT5wb3dlcl90cmFuc2l0aW9uKQogCQlyZXR1cm47CiAKKwl0cmFjZV9oZGFfcG93ZXJfdXAoY29kZWMpOwogCXNuZF9oZGFfdXBkYXRlX3Bvd2VyX2FjY3QoY29kZWMpOwogCWNvZGVjLT5wb3dlcl9vbiA9IDE7CiAJY29kZWMtPnBvd2VyX2ppZmZpZXMgPSBqaWZmaWVzOwpAQCAtNDUzNyw2ICs0NTkyLDExIEBACiAJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQsIHN0cmVhbV90YWcsCiAJCQkJCSAgIDAsIGZvcm1hdCk7CiAJLyogZXh0cmEgb3V0cHV0cyBjb3BpZWQgZnJvbSBmcm9udCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmhwX291dF9uaWQpOyBpKyspCisJCWlmICghbW91dC0+bm9fc2hhcmVfc3RyZWFtICYmIG1vdXQtPmhwX291dF9uaWRbaV0pCisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgIG1vdXQtPmhwX291dF9uaWRbaV0sCisJCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmV4dHJhX291dF9uaWQpOyBpKyspCiAJCWlmICghbW91dC0+bm9fc2hhcmVfc3RyZWFtICYmIG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCiAJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywKQEAgLTQ1NjksNiArNDYyOSwxMCBAQAogCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldKTsKIAlpZiAobW91dC0+aHBfbmlkKQogCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5ocF9uaWQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vdXQtPmhwX291dF9uaWQpOyBpKyspCisJCWlmIChtb3V0LT5ocF9vdXRfbmlkW2ldKQorCQkJc25kX2hkYV9jb2RlY19jbGVhbnVwX3N0cmVhbShjb2RlYywKKwkJCQkJCSAgICAgbW91dC0+aHBfb3V0X25pZFtpXSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW91dC0+ZXh0cmFfb3V0X25pZCk7IGkrKykKIAkJaWYgKG1vdXQtPmV4dHJhX291dF9uaWRbaV0pCiAJCQlzbmRfaGRhX2NvZGVjX2NsZWFudXBfc3RyZWFtKGNvZGVjLApAQCAtNDY0OSw2ICs0NzEzLDI3IEBACiAJfQogfQogCisvKiBSZW9yZGVyIHRoZSBzdXJyb3VuZCBjaGFubmVscworICogQUxTQSBzZXF1ZW5jZSBpcyBmcm9udC9zdXJyL2NsZmUvc2lkZQorICogSERBIHNlcXVlbmNlIGlzOgorICogICAgNC1jaDogZnJvbnQvc3VyciAgPT4gIE9LIGFzIGl0IGlzCisgKiAgICA2LWNoOiBmcm9udC9jbGZlL3N1cnIKKyAqICAgIDgtY2g6IGZyb250L2NsZmUvcmVhci9zaWRlfGZjCisgKi8KK3N0YXRpYyB2b2lkIHJlb3JkZXJfb3V0cHV0cyh1bnNpZ25lZCBpbnQgbnVtcywgaGRhX25pZF90ICpwaW5zKQoreworCWhkYV9uaWRfdCBuaWQ7CisKKwlzd2l0Y2ggKG51bXMpIHsKKwljYXNlIDM6CisJY2FzZSA0OgorCQluaWQgPSBwaW5zWzFdOworCQlwaW5zWzFdID0gcGluc1syXTsKKwkJcGluc1syXSA9IG5pZDsKKwkJYnJlYWs7CisJfQorfQorCiAvKgogICogUGFyc2UgYWxsIHBpbiB3aWRnZXRzIGFuZCBzdG9yZSB0aGUgdXNlZnVsIHBpbiBuaWRzIHRvIGNmZwogICoKQEAgLTQ2NjYsMTIgKzQ3NTEsMTMgQEAKICAqIFRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBwaW5zIGFyZSBhc3NpZ25lZCB0byBkaWdfaW5fcGluIGFuZCBkaWdfb3V0X3BpbiwKICAqIHJlc3BlY3RpdmVseS4KICAqLwotaW50IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcykKK2ludCBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZjZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKKwkJCSAgICAgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbmRfZmxhZ3MpCiB7CiAJaGRhX25pZF90IG5pZCwgZW5kX25pZDsKLQlzaG9ydCBzZXEsIGFzc29jX2xpbmVfb3V0LCBhc3NvY19zcGVha2VyOworCXNob3J0IHNlcSwgYXNzb2NfbGluZV9vdXQ7CiAJc2hvcnQgc2VxdWVuY2VzX2xpbmVfb3V0W0FSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKV07CiAJc2hvcnQgc2VxdWVuY2VzX3NwZWFrZXJbQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucyldOwogCXNob3J0IHNlcXVlbmNlc19ocFtBUlJBWV9TSVpFKGNmZy0+aHBfcGlucyldOwpAQCAtNDY4Miw4ICs0NzY4LDkgQEAKIAltZW1zZXQoc2VxdWVuY2VzX2xpbmVfb3V0LCAwLCBzaXplb2Yoc2VxdWVuY2VzX2xpbmVfb3V0KSk7CiAJbWVtc2V0KHNlcXVlbmNlc19zcGVha2VyLCAwLCBzaXplb2Yoc2VxdWVuY2VzX3NwZWFrZXIpKTsKIAltZW1zZXQoc2VxdWVuY2VzX2hwLCAwLCBzaXplb2Yoc2VxdWVuY2VzX2hwKSk7Ci0JYXNzb2NfbGluZV9vdXQgPSBhc3NvY19zcGVha2VyID0gMDsKKwlhc3NvY19saW5lX291dCA9IDA7CiAKKwljb2RlYy0+aWdub3JlX21pc2NfYml0ID0gdHJ1ZTsKIAllbmRfbmlkID0gY29kZWMtPnN0YXJ0X25pZCArIGNvZGVjLT5udW1fbm9kZXM7CiAJZm9yIChuaWQgPSBjb2RlYy0+c3RhcnRfbmlkOyBuaWQgPCBlbmRfbmlkOyBuaWQrKykgewogCQl1bnNpZ25lZCBpbnQgd2lkX2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CkBAIC00Njk5LDYgKzQ3ODYsOSBAQAogCQkJY29udGludWU7CiAKIAkJZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7CisJCWlmICghKGdldF9kZWZjZmdfbWlzYyhzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCkpICYKKwkJICAgICAgQUNfREVGQ0ZHX01JU0NfTk9fUFJFU0VOQ0UpKQorCQkJY29kZWMtPmlnbm9yZV9taXNjX2JpdCA9IGZhbHNlOwogCQljb25uID0gZ2V0X2RlZmNmZ19jb25uZWN0KGRlZl9jb25mKTsKIAkJaWYgKGNvbm4gPT0gQUNfSkFDS19QT1JUX05PTkUpCiAJCQljb250aW51ZTsKQEAgLTQ3MzQsMTYgKzQ4MjQsMTAgQEAKIAkJY2FzZSBBQ19KQUNLX1NQRUFLRVI6CiAJCQlzZXEgPSBnZXRfZGVmY2ZnX3NlcXVlbmNlKGRlZl9jb25mKTsKIAkJCWFzc29jID0gZ2V0X2RlZmNmZ19hc3NvY2lhdGlvbihkZWZfY29uZik7Ci0JCQlpZiAoIWFzc29jKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhc3NvY19zcGVha2VyKQotCQkJCWFzc29jX3NwZWFrZXIgPSBhc3NvYzsKLQkJCWVsc2UgaWYgKGFzc29jX3NwZWFrZXIgIT0gYXNzb2MpCi0JCQkJY29udGludWU7CiAJCQlpZiAoY2ZnLT5zcGVha2VyX291dHMgPj0gQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucykpCiAJCQkJY29udGludWU7CiAJCQljZmctPnNwZWFrZXJfcGluc1tjZmctPnNwZWFrZXJfb3V0c10gPSBuaWQ7Ci0JCQlzZXF1ZW5jZXNfc3BlYWtlcltjZmctPnNwZWFrZXJfb3V0c10gPSBzZXE7CisJCQlzZXF1ZW5jZXNfc3BlYWtlcltjZmctPnNwZWFrZXJfb3V0c10gPSAoYXNzb2MgPDwgNCkgfCBzZXE7CiAJCQljZmctPnNwZWFrZXJfb3V0cysrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNfSkFDS19IUF9PVVQ6CkBAIC00NzkyLDcgKzQ4NzYsOCBAQAogCSAqIElmIG5vIGxpbmUtb3V0IGlzIGRlZmluZWQgYnV0IG11bHRpcGxlIEhQcyBhcmUgZm91bmQsCiAJICogc29tZSBvZiB0aGVtIG1pZ2h0IGJlIHRoZSByZWFsIGxpbmUtb3V0cy4KIAkgKi8KLQlpZiAoIWNmZy0+bGluZV9vdXRzICYmIGNmZy0+aHBfb3V0cyA+IDEpIHsKKwlpZiAoIWNmZy0+bGluZV9vdXRzICYmIGNmZy0+aHBfb3V0cyA+IDEgJiYKKwkgICAgIShjb25kX2ZsYWdzICYgSERBX1BJTkNGR19OT19IUF9GSVhVUCkpIHsKIAkJaW50IGkgPSAwOwogCQl3aGlsZSAoaSA8IGNmZy0+aHBfb3V0cykgewogCQkJLyogVGhlIHJlYWwgSFBzIHNob3VsZCBoYXZlIHRoZSBzZXF1ZW5jZSAweDBmICovCkBAIC00ODI5LDcgKzQ5MTQsOCBAQAogCSAqIEZJWC1VUDogaWYgbm8gbGluZS1vdXRzIGFyZSBkZXRlY3RlZCwgdHJ5IHRvIHVzZSBzcGVha2VyIG9yIEhQIHBpbgogCSAqIGFzIGEgcHJpbWFyeSBvdXRwdXQKIAkgKi8KLQlpZiAoIWNmZy0+bGluZV9vdXRzKSB7CisJaWYgKCFjZmctPmxpbmVfb3V0cyAmJgorCSAgICAhKGNvbmRfZmxhZ3MgJiBIREFfUElOQ0ZHX05PX0xPX0ZJWFVQKSkgewogCQlpZiAoY2ZnLT5zcGVha2VyX291dHMpIHsKIAkJCWNmZy0+bGluZV9vdXRzID0gY2ZnLT5zcGVha2VyX291dHM7CiAJCQltZW1jcHkoY2ZnLT5saW5lX291dF9waW5zLCBjZmctPnNwZWFrZXJfcGlucywKQEAgLTQ4NDcsMjEgKzQ5MzMsOSBAQAogCQl9CiAJfQogCi0JLyogUmVvcmRlciB0aGUgc3Vycm91bmQgY2hhbm5lbHMKLQkgKiBBTFNBIHNlcXVlbmNlIGlzIGZyb250L3N1cnIvY2xmZS9zaWRlCi0JICogSERBIHNlcXVlbmNlIGlzOgotCSAqICAgIDQtY2g6IGZyb250L3N1cnIgID0+ICBPSyBhcyBpdCBpcwotCSAqICAgIDYtY2g6IGZyb250L2NsZmUvc3VycgotCSAqICAgIDgtY2g6IGZyb250L2NsZmUvcmVhci9zaWRlfGZjCi0JICovCi0Jc3dpdGNoIChjZmctPmxpbmVfb3V0cykgewotCWNhc2UgMzoKLQljYXNlIDQ6Ci0JCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1sxXTsKLQkJY2ZnLT5saW5lX291dF9waW5zWzFdID0gY2ZnLT5saW5lX291dF9waW5zWzJdOwotCQljZmctPmxpbmVfb3V0X3BpbnNbMl0gPSBuaWQ7Ci0JCWJyZWFrOwotCX0KKwlyZW9yZGVyX291dHB1dHMoY2ZnLT5saW5lX291dHMsIGNmZy0+bGluZV9vdXRfcGlucyk7CisJcmVvcmRlcl9vdXRwdXRzKGNmZy0+aHBfb3V0cywgY2ZnLT5ocF9waW5zKTsKKwlyZW9yZGVyX291dHB1dHMoY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zKTsKIAogCXNvcnRfYXV0b2NmZ19pbnB1dF9waW5zKGNmZyk7CiAKQEAgLTQ4OTksNyArNDk3Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcpOworRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKTsKIAogaW50IHNuZF9oZGFfZ2V0X2lucHV0X3Bpbl9hdHRyKHVuc2lnbmVkIGludCBkZWZfY29uZikKIHsKQEAgLTUxNTgsMzAgKzUyMzIsNiBAQAogRVhQT1JUX1NZTUJPTF9IREEoc25kX2FycmF5X2ZyZWUpOwogCiAvKioKLSAqIHNuZF9wcmludF9wY21fcmF0ZXMgLSBQcmludCB0aGUgc3VwcG9ydGVkIFBDTSByYXRlcyB0byB0aGUgc3RyaW5nIGJ1ZmZlcgotICogQHBjbTogUENNIGNhcHMgYml0cwotICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIgdG8gd3JpdGUKLSAqIEBidWZsZW46IHRoZSBtYXggYnVmZmVyIGxlbmd0aAotICoKLSAqIHVzZWQgYnkgaGRhX3Byb2MuYyBhbmQgaGRhX2VsZC5jCi0gKi8KLXZvaWQgc25kX3ByaW50X3BjbV9yYXRlcyhpbnQgcGNtLCBjaGFyICpidWYsIGludCBidWZsZW4pCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCByYXRlc1tdID0gewotCQk4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA4ODIwMCwKLQkJOTYwMDAsIDE3NjQwMCwgMTkyMDAwLCAzODQwMDAKLQl9OwotCWludCBpLCBqOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKTsgaSsrKQotCQlpZiAocGNtICYgKDEgPDwgaSkpCi0JCQlqICs9IHNucHJpbnRmKGJ1ZiArIGosIGJ1ZmxlbiAtIGosICAiICVkIiwgcmF0ZXNbaV0pOwotCi0JYnVmW2pdID0gJ1wwJzsgLyogbmVjZXNzYXJ5IHdoZW4gaiA9PSAwICovCi19Ci1FWFBPUlRfU1lNQk9MX0hEQShzbmRfcHJpbnRfcGNtX3JhdGVzKTsKLQotLyoqCiAgKiBzbmRfcHJpbnRfcGNtX2JpdHMgLSBQcmludCB0aGUgc3VwcG9ydGVkIFBDTSBmbXQgYml0cyB0byB0aGUgc3RyaW5nIGJ1ZmZlcgogICogQHBjbTogUENNIGNhcHMgYml0cwogICogQGJ1ZjogdGhlIHN0cmluZyBidWZmZXIgdG8gd3JpdGUKQEAgLTUyMjIsNiArNTI3Miw4IEBACiAJCXJldHVybiAiTWljIjsKIAljYXNlIFNORF9KQUNLX0xJTkVPVVQ6CiAJCXJldHVybiAiTGluZS1vdXQiOworCWNhc2UgU05EX0pBQ0tfTElORUlOOgorCQlyZXR1cm4gIkxpbmUtaW4iOwogCWNhc2UgU05EX0pBQ0tfSEVBRFNFVDoKIAkJcmV0dXJuICJIZWFkc2V0IjsKIAljYXNlIFNORF9KQUNLX1ZJREVPT1VUOgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKaW5kZXggNzU1ZjJiMC4uNTY0NDcxMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCkBAIC04NTQsNiArODU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbm9fc3RpY2t5X3N0cmVhbToxOyAvKiBubyBzdGlja3ktUENNIHN0cmVhbSBhc3NpZ25tZW50ICovCiAJdW5zaWduZWQgaW50IHBpbnNfc2h1dHVwOjE7CS8qIHBpbnMgYXJlIHNodXQgdXAgKi8KIAl1bnNpZ25lZCBpbnQgbm9fdHJpZ2dlcl9zZW5zZToxOyAvKiBkb24ndCB0cmlnZ2VyIGF0IHBpbi1zZW5zaW5nICovCisJdW5zaWduZWQgaW50IGlnbm9yZV9taXNjX2JpdDoxOyAvKiBpZ25vcmUgTUlTQ19OT19QUkVTRU5DRSBiaXQgKi8KICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJdW5zaWduZWQgaW50IHBvd2VyX29uIDoxOwkvKiBjdXJyZW50IChnbG9iYWwpIHBvd2VyLXN0YXRlICovCiAJdW5zaWduZWQgaW50IHBvd2VyX3RyYW5zaXRpb24gOjE7IC8qIHBvd2VyLXN0YXRlIGluIHRyYW5zaXRpb24gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2VsZC5jIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKaW5kZXggYzM0ZjczMC4uMWM4ZGRmNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZWxkLmMKQEAgLTMxOCw2ICszMTgsMTEgQEAKIAlpbnQgc2l6ZTsKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAKKwkvKgorCSAqIEVMRCBzaXplIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gY2FsbGVyIGZ1bmN0aW9uLiBJZiBubyBlcnJvcnMgYW5kCisJICogRUxEIGlzIHZhbGlkLCBhY3R1YWwgZWxkX3NpemUgaXMgYXNzaWduZWQgaW4gaGRtaV91cGRhdGVfZWxkKCkKKwkgKi8KKwogCWlmICghZWxkLT5lbGRfdmFsaWQpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC0zMjcsMTQgKzMzMiwxMyBAQAogCQlzbmRfcHJpbnRkKEtFUk5fSU5GTyAiSERNSTogRUxEIGJ1ZiBzaXplIGlzIDAsIGZvcmNlIDEyOFxuIik7CiAJCXNpemUgPSAxMjg7CiAJfQotCWlmIChzaXplIDwgRUxEX0ZJWEVEX0JZVEVTIHx8IHNpemUgPiBQQUdFX1NJWkUpIHsKKwlpZiAoc2l6ZSA8IEVMRF9GSVhFRF9CWVRFUyB8fCBzaXplID4gRUxEX01BWF9TSVpFKSB7CiAJCXNuZF9wcmludGQoS0VSTl9JTkZPICJIRE1JOiBpbnZhbGlkIEVMRCBidWYgc2l6ZSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiAtRVJBTkdFOwogCX0KIAotCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOworCS8qIHNldCBFTEQgYnVmZmVyICovCisJYnVmID0gZWxkLT5lbGRfYnVmZmVyOwogCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdmFsID0gaGRtaV9nZXRfZWxkX2RhdGEoY29kZWMsIG5pZCwgaSk7CkBAIC0zNTYsMTAgKzM2MCwzMSBAQAogCXJldCA9IGhkbWlfdXBkYXRlX2VsZChlbGQsIGJ1Ziwgc2l6ZSk7CiAKIGVycm9yOgotCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBTTkRSVl9QQ01fUkFURV8qIGFuZCBBQ19QQVJfUENNIHZhbHVlcyBkb24ndCBtYXRjaCwgcHJpbnQgY29ycmVjdCByYXRlcyB3aXRoCisgKiBoZG1pLXNwZWNpZmljIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIGhkbWlfcHJpbnRfcGNtX3JhdGVzKGludCBwY20sIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IGFsc2FfcmF0ZXNbXSA9IHsKKwkJNTUxMiwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsCisJCTk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwCisJfTsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgQVJSQVlfU0laRShhbHNhX3JhdGVzKTsgaSsrKQorCQlpZiAocGNtICYgKDEgPDwgaSkpCisJCQlqICs9IHNucHJpbnRmKGJ1ZiArIGosIGJ1ZmxlbiAtIGosICAiICVkIiwKKwkJCQlhbHNhX3JhdGVzW2ldKTsKKworCWJ1ZltqXSA9ICdcMCc7IC8qIG5lY2Vzc2FyeSB3aGVuIGogPT0gMCAqLworfQorCisjZGVmaW5lIFNORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkUJODAKKwogc3RhdGljIHZvaWQgaGRtaV9zaG93X3Nob3J0X2F1ZGlvX2Rlc2Moc3RydWN0IGNlYV9zYWQgKmEpCiB7CiAJY2hhciBidWZbU05EX1BSSU5UX1JBVEVTX0FEVklTRURfQlVGU0laRV07CkBAIC0zNjgsNyArMzkzLDcgQEAKIAlpZiAoIWEtPmZvcm1hdCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50X3BjbV9yYXRlcyhhLT5yYXRlcywgYnVmLCBzaXplb2YoYnVmKSk7CisJaGRtaV9wcmludF9wY21fcmF0ZXMoYS0+cmF0ZXMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJaWYgKGEtPmZvcm1hdCA9PSBBVURJT19DT0RJTkdfVFlQRV9MUENNKQogCQlzbmRfcHJpbnRfcGNtX2JpdHMoYS0+c2FtcGxlX2JpdHMsIGJ1ZjIgKyA4LCBzaXplb2YoYnVmMikgLSA4KTsKQEAgLTQyNyw3ICs0NTIsNyBAQAogCQkJaSwgYS0+Zm9ybWF0LCBjZWFfYXVkaW9fY29kaW5nX3R5cGVfbmFtZXNbYS0+Zm9ybWF0XSk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAic2FkJWRfY2hhbm5lbHNcdFx0JWRcbiIsIGksIGEtPmNoYW5uZWxzKTsKIAotCXNuZF9wcmludF9wY21fcmF0ZXMoYS0+cmF0ZXMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWhkbWlfcHJpbnRfcGNtX3JhdGVzKGEtPnJhdGVzLCBidWYsIHNpemVvZihidWYpKTsKIAlzbmRfaXByaW50ZihidWZmZXIsICJzYWQlZF9yYXRlc1x0XHRbMHgleF0lc1xuIiwgaSwgYS0+cmF0ZXMsIGJ1Zik7CiAKIAlpZiAoYS0+Zm9ybWF0ID09IEFVRElPX0NPRElOR19UWVBFX0xQQ00pIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwppbmRleCBhNjNjNTRkLi40MzFiZjg2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCmluZGV4IGJmM2NlZDUuLjZiMmVmYjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCkBAIC02NDMsMTQgKzY0NCwxNCBAQAogc3RhdGljIHZvaWQgcGFyc2VfY29kZWNfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCiAJCQkgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCiB7Ci0JdW5zaWduZWQgaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7CisJaW50IHZlbmRvcmlkLCBzdWJpZCwgY2FkZHI7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CiAKIAkqY29kZWNwID0gTlVMTDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVpICVpICVpIiwgJnZlbmRvcmlkLCAmc3ViaWQsICZjYWRkcikgPT0gMykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSB2ZW5kb3JpZCAmJgotCQkJICAgIGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQgJiYKKwkJCWlmICgodmVuZG9yaWQgPD0gMCB8fCBjb2RlYy0+dmVuZG9yX2lkID09IHZlbmRvcmlkKSAmJgorCQkJICAgIChzdWJpZCA8PSAwIHx8IGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQpICYmCiAJCQkgICAgY29kZWMtPmFkZHIgPT0gY2FkZHIpIHsKIAkJCQkqY29kZWNwID0gY29kZWM7CiAJCQkJYnJlYWs7CkBAIC03NTYsOCArNzU3LDYgQEAKIAl9CiAJaWYgKCFmdy0+c2l6ZSkKIAkJcmV0dXJuIDA7Ci0JaWYgKHNpemUgPCBmdy0+c2l6ZSkKLQkJc2l6ZSA9IGZ3LT5zaXplOwogCiAJZm9yIChsZW4gPSAwOyBsZW4gPCBmdy0+c2l6ZTsgbGVuKyspIHsKIAkJaWYgKCEqcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IDE5MTI4NGEuLjA5NjUwN2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMzQsNyArMzQsNiBAQAogICogCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00Niw2ICs0NSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpZmRlZiBDT05GSUdfWDg2CisvKiBmb3Igc25vb3AgY29udHJvbCAqLworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNlbmRpZgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0xMTYsNiArMTIxLDIyIEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmVfY29udHJvbGxlciwgIlJlc2V0IGNvbnRyb2xsZXIgaW4gcG93ZXIgc2F2ZSBtb2RlLiIpOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgYWxpZ25fYnVmZmVyX3NpemUgPSAxOworbW9kdWxlX3BhcmFtKGFsaWduX2J1ZmZlcl9zaXplLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWxpZ25fYnVmZmVyX3NpemUsCisJCSJGb3JjZSBidWZmZXIgYW5kIHBlcmlvZCBzaXplcyB0byBiZSBtdWx0aXBsZSBvZiAxMjggYnl0ZXMuIik7CisKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgYm9vbCBoZGFfc25vb3AgPSB0cnVlOworbW9kdWxlX3BhcmFtX25hbWVkKHNub29wLCBoZGFfc25vb3AsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzbm9vcCwgIkVuYWJsZS9kaXNhYmxlIHNub29waW5nIik7CisjZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJKGNoaXApLT5zbm9vcAorI2Vsc2UKKyNkZWZpbmUgaGRhX3Nub29wCQl0cnVlCisjZGVmaW5lIGF6eF9zbm9vcChjaGlwKQkJdHJ1ZQorI2VuZGlmCisKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7SW50ZWwsIElDSDZ9LCIKIAkJCSAie0ludGVsLCBJQ0g2TX0sIgpAQCAtMzYwLDcgKzM4MSw3IEBACiAJCQkJCSAqLwogCXVuc2lnbmVkIGNoYXIgc3RyZWFtX3RhZzsJLyogYXNzaWduZWQgc3RyZWFtICovCiAJdW5zaWduZWQgY2hhciBpbmRleDsJCS8qIHN0cmVhbSBpbmRleCAqLwotCWludCBkZXZpY2U7CQkJLyogbGFzdCBkZXZpY2UgbnVtYmVyIGFzc2lnbmVkIHRvICovCisJaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KIAogCXVuc2lnbmVkIGludCBvcGVuZWQgOjE7CiAJdW5zaWduZWQgaW50IHJ1bm5pbmcgOjE7CkBAIC0zNzEsNiArMzkyLDcgQEAKIAkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCiAJICovCiAJdW5zaWduZWQgaW50IGluc3VmZmljaWVudCA6MTsKKwl1bnNpZ25lZCBpbnQgd2NfbWFya2VkOjE7CiB9OwogCiAvKiBDT1JCL1JJUkIgKi8KQEAgLTQzOCw2ICs0NjAsNyBAQAogCXVuc2lnbmVkIGludCBtc2kgOjE7CiAJdW5zaWduZWQgaW50IGlycV9wZW5kaW5nX3dhcm5lZCA6MTsKIAl1bnNpZ25lZCBpbnQgcHJvYmluZyA6MTsgLyogY29kZWMgcHJvYmluZyBwaGFzZSAqLworCXVuc2lnbmVkIGludCBzbm9vcDoxOwogCiAJLyogZm9yIGRlYnVnZ2luZyAqLwogCXVuc2lnbmVkIGludCBsYXN0X2NtZFtBWlhfTUFYX0NPREVDU107CkBAIC00ODEsNiArNTA0LDcgQEAKICNkZWZpbmUgQVpYX0RDQVBTX05PXzY0QklUCSgxIDw8IDE4KQkvKiBObyA2NGJpdCBhZGRyZXNzICovCiAjZGVmaW5lIEFaWF9EQ0FQU19TWU5DX1dSSVRFCSgxIDw8IDE5KQkvKiBzeW5jIGVhY2ggY21kIHdyaXRlICovCiAjZGVmaW5lIEFaWF9EQ0FQU19PTERfU1NZTkMJKDEgPDwgMjApCS8qIE9sZCBTU1lOQyByZWcgZm9yIElDSCAqLworI2RlZmluZSBBWlhfRENBUFNfQlVGU0laRQkoMSA8PCAyMSkJLyogbm8gYnVmZmVyIHNpemUgYWxpZ25tZW50ICovCiAKIC8qIHF1aXJrcyBmb3IgQVRJIFNCIC8gQU1EIEh1ZHNvbiAqLwogI2RlZmluZSBBWlhfRENBUFNfUFJFU0VUX0FUSV9TQiBcCkBAIC01NDIsNiArNTY2LDQ1IEBACiAvKiBmb3IgcGNtIHN1cHBvcnQgKi8KICNkZWZpbmUgZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKSAoc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEpCiAKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgdm9pZCBfX21hcmtfcGFnZXNfd2Moc3RydWN0IGF6eCAqY2hpcCwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIGJvb2wgb24pCit7CisJaWYgKGF6eF9zbm9vcChjaGlwKSkKKwkJcmV0dXJuOworCWlmIChhZGRyICYmIHNpemUpIHsKKwkJaW50IHBhZ2VzID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCQlpZiAob24pCisJCQlzZXRfbWVtb3J5X3djKCh1bnNpZ25lZCBsb25nKWFkZHIsIHBhZ2VzKTsKKwkJZWxzZQorCQkJc2V0X21lbW9yeV93YigodW5zaWduZWQgbG9uZylhZGRyLCBwYWdlcyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19wYWdlc193YyhzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiwKKwkJCQkgYm9vbCBvbikKK3sKKwlfX21hcmtfcGFnZXNfd2MoY2hpcCwgYnVmLT5hcmVhLCBidWYtPmJ5dGVzLCBvbik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19ydW50aW1lX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsIGJvb2wgb24pCit7CisJaWYgKGF6eF9kZXYtPndjX21hcmtlZCAhPSBvbikgeworCQlfX21hcmtfcGFnZXNfd2MoY2hpcCwgcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9ieXRlcywgb24pOworCQlhenhfZGV2LT53Y19tYXJrZWQgPSBvbjsKKwl9Cit9CisjZWxzZQorLyogTk9QIGZvciBvdGhlciBhcmNocyAqLworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcGFnZXNfd2Moc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYsCisJCQkJIGJvb2wgb24pCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19ydW50aW1lX3djKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2LAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsIGJvb2wgb24pCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBhenhfYWNxdWlyZV9pcnEoc3RydWN0IGF6eCAqY2hpcCwgaW50IGRvX2Rpc2Nvbm5lY3QpOwogc3RhdGljIGludCBhenhfc2VuZF9jbWQoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IHZhbCk7CiAvKgpAQCAtNTYzLDYgKzYyNiw3IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgU0ZYICJjYW5ub3QgYWxsb2NhdGUgQ09SQi9SSVJCXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CisJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cmIsIHRydWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDc5LDcgKzExNDMsMTUgQEAKIAogc3RhdGljIHZvaWQgYXp4X2luaXRfcGNpKHN0cnVjdCBhenggKmNoaXApCiB7Ci0JdW5zaWduZWQgc2hvcnQgc25vb3A7CisJLyogZm9yY2UgdG8gbm9uLXNub29wIG1vZGUgZm9yIGEgbmV3IFZJQSBjb250cm9sbGVyIHdoZW4gQklPUyBpcyBzZXQgKi8KKwlpZiAoY2hpcC0+c25vb3AgJiYgY2hpcC0+ZHJpdmVyX3R5cGUgPT0gQVpYX0RSSVZFUl9WSUEpIHsKKwkJdTggc25vb3A7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBjaSwgMHg0MiwgJnNub29wKTsKKwkJaWYgKCEoc25vb3AgJiAweDgwKSAmJiBjaGlwLT5wY2ktPnJldmlzaW9uID09IDB4MzApIHsKKwkJCWNoaXAtPnNub29wID0gMDsKKwkJCXNuZF9wcmludGRkKFNGWCAiRm9yY2UgdG8gbm9uLXNub29wIG1vZGVcbiIpOworCQl9CisJfQogCiAJLyogQ2xlYXIgYml0cyAwLTIgb2YgUENJIHJlZ2lzdGVyIFRDU0VMIChhdCBvZmZzZXQgMHg0NCkKIAkgKiBUQ1NFTCA9PSBUcmFmZmljIENsYXNzIFNlbGVjdCBSZWdpc3Rlciwgd2hpY2ggc2V0cyBQQ0kgZXhwcmVzcyBRT1MKQEAgLTEwOTYsMTUgKzExNjgsMTUgQEAKIAkgKiB3ZSBuZWVkIHRvIGVuYWJsZSBzbm9vcC4KIAkgKi8KIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQVRJX1NOT09QKSB7Ci0JCXNuZF9wcmludGRkKFNGWCAiRW5hYmxpbmcgQVRJIHNub29wXG4iKTsKKwkJc25kX3ByaW50ZGQoU0ZYICJTZXR0aW5nIEFUSSBzbm9vcDogJWRcbiIsIGF6eF9zbm9vcChjaGlwKSk7CiAJCXVwZGF0ZV9wY2lfYnl0ZShjaGlwLT5wY2ksCi0JCQkJQVRJX1NCNDUwX0hEQVVESU9fTUlTQ19DTlRSMl9BRERSLCAKLQkJCQkweDA3LCBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1ApOworCQkJCUFUSV9TQjQ1MF9IREFVRElPX01JU0NfQ05UUjJfQUREUiwgMHgwNywKKwkJCQlhenhfc25vb3AoY2hpcCkgPyBBVElfU0I0NTBfSERBVURJT19FTkFCTEVfU05PT1AgOiAwKTsKIAl9CiAKIAkvKiBGb3IgTlZJRElBIEhEQSwgZW5hYmxlIHNub29wICovCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX05WSURJQV9TTk9PUCkgewotCQlzbmRfcHJpbnRkZChTRlggIkVuYWJsaW5nIE52aWRpYSBzbm9vcFxuIik7CisJCXNuZF9wcmludGRkKFNGWCAiU2V0dGluZyBOdmlkaWEgc25vb3A6ICVkXG4iLCBhenhfc25vb3AoY2hpcCkpOwogCQl1cGRhdGVfcGNpX2J5dGUoY2hpcC0+cGNpLAogCQkJCU5WSURJQV9IREFfVFJBTlNSRUdfQUREUiwKIAkJCQkweDBmLCBOVklESUFfSERBX0VOQUJMRV9DT0hCSVRTKTsKQEAgLTExMTgsMTYgKzExOTAsMjAgQEAKIAogCS8qIEVuYWJsZSBTQ0gvUENIIHNub29wIGlmIG5lZWRlZCAqLwogCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19TQ0hfU05PT1ApIHsKKwkJdW5zaWduZWQgc2hvcnQgc25vb3A7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgSU5URUxfU0NIX0hEQV9ERVZDLCAmc25vb3ApOwotCQlpZiAoc25vb3AgJiBJTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkgewotCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgSU5URUxfU0NIX0hEQV9ERVZDLAotCQkJCXNub29wICYgKH5JTlRFTF9TQ0hfSERBX0RFVkNfTk9TTk9PUCkpOworCQlpZiAoKCFhenhfc25vb3AoY2hpcCkgJiYgIShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKSkgfHwKKwkJICAgIChhenhfc25vb3AoY2hpcCkgJiYgKHNub29wICYgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1ApKSkgeworCQkJc25vb3AgJj0gfklOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QOworCQkJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCQkJc25vb3AgfD0gSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1A7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoY2hpcC0+cGNpLCBJTlRFTF9TQ0hfSERBX0RFVkMsIHNub29wKTsKIAkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwKIAkJCQlJTlRFTF9TQ0hfSERBX0RFVkMsICZzbm9vcCk7Ci0JCQlzbmRfcHJpbnRkZChTRlggIkhEQSBzbm9vcCBkaXNhYmxlZCwgZW5hYmxpbmcgLi4uICVzXG4iLAotCQkJCShzbm9vcCAmIElOVEVMX1NDSF9IREFfREVWQ19OT1NOT09QKQotCQkJCT8gIkZhaWxlZCIgOiAiT0siKTsKIAkJfQorCQlzbmRfcHJpbnRkZChTRlggIlNDSCBzbm9vcDogJXNcbiIsCisJCQkJKHNub29wICYgSU5URUxfU0NIX0hEQV9ERVZDX05PU05PT1ApCisJCQkJPyAiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKICAgICAgICAgfQogfQogCkBAIC0xMzM0LDEyICsxNDEwLDE2IEBACiAgKi8KIHN0YXRpYyBpbnQgYXp4X3NldHVwX2NvbnRyb2xsZXIoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYpCiB7CisJdW5zaWduZWQgaW50IHZhbDsKIAkvKiBtYWtlIHN1cmUgdGhlIHJ1biBiaXQgaXMgemVybyBmb3IgU0QgKi8KIAlhenhfc3RyZWFtX2NsZWFyKGNoaXAsIGF6eF9kZXYpOwogCS8qIHByb2dyYW0gdGhlIHN0cmVhbV90YWcgKi8KLQlhenhfc2Rfd3JpdGVsKGF6eF9kZXYsIFNEX0NUTCwKLQkJICAgICAgKGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpICYgflNEX0NUTF9TVFJFQU1fVEFHX01BU0spfAotCQkgICAgICAoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCkpOworCXZhbCA9IGF6eF9zZF9yZWFkbChhenhfZGV2LCBTRF9DVEwpOworCXZhbCA9ICh2YWwgJiB+U0RfQ1RMX1NUUkVBTV9UQUdfTUFTSykgfAorCQkoYXp4X2Rldi0+c3RyZWFtX3RhZyA8PCBTRF9DVExfU1RSRUFNX1RBR19TSElGVCk7CisJaWYgKCFhenhfc25vb3AoY2hpcCkpCisJCXZhbCB8PSBTRF9DVExfVFJBRkZJQ19QUklPOworCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ1RMLCB2YWwpOwogCiAJLyogcHJvZ3JhbSB0aGUgbGVuZ3RoIG9mIHNhbXBsZXMgaW4gY3ljbGljIGJ1ZmZlciAqLwogCWF6eF9zZF93cml0ZWwoYXp4X2RldiwgU0RfQ0JMLCBhenhfZGV2LT5idWZzaXplKTsKQEAgLTE1MzMsNiArMTYxMyw5IEBACiB7CiAJaW50IGRldiwgaSwgbnVtczsKIAlzdHJ1Y3QgYXp4X2RldiAqcmVzID0gTlVMTDsKKwkvKiBtYWtlIGEgbm9uLXplcm8gdW5pcXVlIGtleSBmb3IgdGhlIHN1YnN0cmVhbSAqLworCWludCBrZXkgPSAoc3Vic3RyZWFtLT5wY20tPmRldmljZSA8PCAxNikgfCAoc3Vic3RyZWFtLT5udW1iZXIgPDwgMikgfAorCQkoc3Vic3RyZWFtLT5zdHJlYW0gKyAxKTsKIAogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCWRldiA9IGNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldDsKQEAgLTE1NDQsMTIgKzE2MjcsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtczsgaSsrLCBkZXYrKykKIAkJaWYgKCFjaGlwLT5henhfZGV2W2Rldl0ub3BlbmVkKSB7CiAJCQlyZXMgPSAmY2hpcC0+YXp4X2RldltkZXZdOwotCQkJaWYgKHJlcy0+ZGV2aWNlID09IHN1YnN0cmVhbS0+cGNtLT5kZXZpY2UpCisJCQlpZiAocmVzLT5hc3NpZ25lZF9rZXkgPT0ga2V5KQogCQkJCWJyZWFrOwogCQl9CiAJaWYgKHJlcykgewogCQlyZXMtPm9wZW5lZCA9IDE7Ci0JCXJlcy0+ZGV2aWNlID0gc3Vic3RyZWFtLT5wY20tPmRldmljZTsKKwkJcmVzLT5hc3NpZ25lZF9rZXkgPSBrZXk7CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC0xNTk5LDYgKzE2ODIsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOworCWludCBidWZmX3N0ZXA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKIAlhenhfZGV2ID0gYXp4X2Fzc2lnbl9kZXZpY2UoY2hpcCwgc3Vic3RyZWFtKTsKQEAgLTE2MTMsMTAgKzE2OTcsMjUgQEAKIAlydW50aW1lLT5ody5yYXRlcyA9IGhpbmZvLT5yYXRlczsKIAlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHJ1bnRpbWUpOwogCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAoYWxpZ25fYnVmZmVyX3NpemUpCisJCS8qIGNvbnN0cmFpbiBidWZmZXIgc2l6ZXMgdG8gYmUgbXVsdGlwbGUgb2YgMTI4CisJCSAgIGJ5dGVzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IGluIHRlcm1zIG9mIG1lbW9yeQorCQkgICBhY2Nlc3MgYnV0IGlzbid0IHJlcXVpcmVkIGJ5IHRoZSBIREEgc3BlYyBhbmQKKwkJICAgcHJldmVudHMgdXNlcnMgZnJvbSBzcGVjaWZ5aW5nIGV4YWN0IHBlcmlvZC9idWZmZXIKKwkJICAgc2l6ZXMuIEZvciBleGFtcGxlIGZvciA0NC4xa0h6LCBhIHBlcmlvZCBzaXplIHNldAorCQkgICB0byAyMG1zIHdpbGwgYmUgcm91bmRlZCB0byAxOS41OW1zLiAqLworCQlidWZmX3N0ZXAgPSAxMjg7CisJZWxzZQorCQkvKiBEb24ndCBlbmZvcmNlIHN0ZXBzIG9uIGJ1ZmZlciBzaXplcywgc3RpbGwgbmVlZCB0bworCQkgICBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChIREEgc3BlYykuIFRlc3RlZCBvbiBJbnRlbAorCQkgICBIREEgY29udHJvbGxlcnMsIG1heSBub3Qgd29yayBvbiBhbGwgZGV2aWNlcyB3aGVyZQorCQkgICBvcHRpb24gbmVlZHMgdG8gYmUgZGlzYWJsZWQgKi8KKwkJYnVmZl9zdGVwID0gNDsKKwogCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCQkJICAgMTI4KTsKKwkJCQkgICBidWZmX3N0ZXApOwogCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCi0JCQkJICAgMTI4KTsKKwkJCQkgICBidWZmX3N0ZXApOwogCXNuZF9oZGFfcG93ZXJfdXAoYXBjbS0+Y29kZWMpOwogCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTE2NzEsMTkgKzE3NzAsMzAgQEAKIHN0YXRpYyBpbnQgYXp4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogeworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCWludCByZXQ7CiAKKwltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2RldiwgcnVudGltZSwgZmFsc2UpOwogCWF6eF9kZXYtPmJ1ZnNpemUgPSAwOwogCWF6eF9kZXYtPnBlcmlvZF9ieXRlcyA9IDA7CiAJYXp4X2Rldi0+Zm9ybWF0X3ZhbCA9IDA7Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwltYXJrX3J1bnRpbWVfd2MoY2hpcCwgYXp4X2RldiwgcnVudGltZSwgdHJ1ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhenhfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAogCS8qIHJlc2V0IEJETCBhZGRyZXNzICovCkBAIC0xNjk2LDYgKzE4MDYsNyBAQAogCiAJc25kX2hkYV9jb2RlY19jbGVhbnVwKGFwY20tPmNvZGVjLCBoaW5mbywgc3Vic3RyZWFtKTsKIAorCW1hcmtfcnVudGltZV93YyhjaGlwLCBhenhfZGV2LCBydW50aW1lLCBmYWxzZSk7CiAJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH0KIApAQCAtMjA1NSw2ICsyMTY2LDIwIEBACiAJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgaW50IGF6eF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlpZiAoIWF6eF9zbm9vcChjaGlwKSkKKwkJYXJlYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShhcmVhLT52bV9wYWdlX3Byb3QpOworCXJldHVybiBzbmRfcGNtX2xpYl9kZWZhdWx0X21tYXAoc3Vic3RyZWFtLCBhcmVhKTsKK30KKyNlbHNlCisjZGVmaW5lIGF6eF9wY21fbW1hcAlOVUxMCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKIAkub3BlbiA9IGF6eF9wY21fb3BlbiwKIAkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLApAQCAtMjA2NCw2ICsyMTg5LDcgQEAKIAkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKIAkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKIAkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKKwkubW1hcCA9IGF6eF9wY21fbW1hcCwKIAkucGFnZSA9IHNuZF9wY21fc2didWZfb3BzX3BhZ2UsCiB9OwogCkBAIC0yMzQ0LDEzICsyNDcwLDE5IEBACiAKIAlpZiAoY2hpcC0+YXp4X2RldikgewogCQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykKLQkJCWlmIChjaGlwLT5henhfZGV2W2ldLmJkbC5hcmVhKQorCQkJaWYgKGNoaXAtPmF6eF9kZXZbaV0uYmRsLmFyZWEpIHsKKwkJCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCwgZmFsc2UpOwogCQkJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YXp4X2RldltpXS5iZGwpOworCQkJfQogCX0KLQlpZiAoY2hpcC0+cmIuYXJlYSkKKwlpZiAoY2hpcC0+cmIuYXJlYSkgeworCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5yYiwgZmFsc2UpOwogCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJmNoaXAtPnJiKTsKLQlpZiAoY2hpcC0+cG9zYnVmLmFyZWEpCisJfQorCWlmIChjaGlwLT5wb3NidWYuYXJlYSkgeworCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5wb3NidWYsIGZhbHNlKTsKIAkJc25kX2RtYV9mcmVlX3BhZ2VzKCZjaGlwLT5wb3NidWYpOworCX0KIAlwY2lfcmVsZWFzZV9yZWdpb25zKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcC0+YXp4X2Rldik7CkBAIC0yNTQ2LDYgKzI2NzgsNyBAQAogCWNoZWNrX3Byb2JlX21hc2soY2hpcCwgZGV2KTsKIAogCWNoaXAtPnNpbmdsZV9jbWQgPSBzaW5nbGVfY21kOworCWNoaXAtPnNub29wID0gaGRhX3Nub29wOwogCiAJaWYgKGJkbF9wb3NfYWRqW2Rldl0gPCAwKSB7CiAJCXN3aXRjaCAoY2hpcC0+ZHJpdmVyX3R5cGUpIHsKQEAgLTI2MTgsNiArMjc1MSwxMCBAQAogCQlnY2FwICY9IH5JQ0g2X0dDQVBfNjRPSzsKIAl9CiAKKwkvKiBkaXNhYmxlIGJ1ZmZlciBzaXplIHJvdW5kaW5nIHRvIDEyOC1ieXRlIG11bHRpcGxlcyBpZiBzdXBwb3J0ZWQgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfQlVGU0laRSkKKwkJYWxpZ25fYnVmZmVyX3NpemUgPSAwOworCiAJLyogYWxsb3cgNjRiaXQgRE1BIGFkZHJlc3MgaWYgc3VwcG9ydGVkIGJ5IEgvVyAqLwogCWlmICgoZ2NhcCAmIElDSDZfR0NBUF82NE9LKSAmJiAhcGNpX3NldF9kbWFfbWFzayhwY2ksIERNQV9CSVRfTUFTSyg2NCkpKQogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfQklUX01BU0soNjQpKTsKQEAgLTI2NjksNiArMjgwNiw3IEBACiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAiY2Fubm90IGFsbG9jYXRlIEJETFxuIik7CiAJCQlnb3RvIGVycm91dDsKIAkJfQorCQltYXJrX3BhZ2VzX3djKGNoaXAsICZjaGlwLT5henhfZGV2W2ldLmJkbCwgdHJ1ZSk7CiAJfQogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwogCWVyciA9IHNuZF9kbWFfYWxsb2NfcGFnZXMoU05EUlZfRE1BX1RZUEVfREVWLApAQCAtMjY3OCw2ICsyODE2LDcgQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggImNhbm5vdCBhbGxvY2F0ZSBwb3NidWZcbiIpOwogCQlnb3RvIGVycm91dDsKIAl9CisJbWFya19wYWdlc193YyhjaGlwLCAmY2hpcC0+cG9zYnVmLCB0cnVlKTsKIAkvKiBhbGxvY2F0ZSBDT1JCL1JJUkIgKi8KIAllcnIgPSBhenhfYWxsb2NfY21kX2lvKGNoaXApOwogCWlmIChlcnIgPCAwKQpAQCAtMjgxOSwzNyArMjk1OCw0OSBAQAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGF6eF9pZHMpID0gewogCS8qIENQVCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWMyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRSB9LAogCS8qIFBCRyAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWQyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRX0sCiAJLyogUGFudGhlciBQb2ludCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4MWUyMCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19TQ0hfU05PT1AgfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB8CisJICBBWlhfRENBUFNfQlVGU0laRX0sCiAJLyogU0NIICovCiAJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHg4MTFiKSwKLQkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfU0NIIHwgQVpYX0RDQVBTX1NDSF9TTk9PUCB9LAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9TQ0ggfCBBWlhfRENBUFNfU0NIX1NOT09QIHwKKwkgIEFaWF9EQ0FQU19CVUZTSVpFfSwKIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2NjgpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g2ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDYgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI3ZDgpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g3ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDcgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2OWEpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBFU0IyICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIEVTQjIgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI4NGIpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g4ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDggKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI5M2UpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g5ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDkgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI5M2YpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0g5ICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDkgKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDNhM2UpLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIH0sICAvKiBJQ0gxMCAqLworCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIHwKKwkgIEFaWF9EQ0FQU19CVUZTSVpFIH0sICAvKiBJQ0gxMCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4M2E2ZSksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfSwgIC8qIElDSDEwICovCisJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0lDSCB8IEFaWF9EQ0FQU19PTERfU1NZTkMgfAorCSAgQVpYX0RDQVBTX0JVRlNJWkUgfSwgIC8qIElDSDEwICovCiAJLyogR2VuZXJpYyBJbnRlbCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lEKSwKIAkgIC5jbGFzcyA9IFBDSV9DTEFTU19NVUxUSU1FRElBX0hEX0FVRElPIDw8IDgsCiAJICAuY2xhc3NfbWFzayA9IDB4ZmZmZmZmLAotCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX0JVRlNJWkUgfSwKIAkvKiBBVEkgU0IgNDUwLzYwMC83MDAvODAwLzkwMCAqLwogCXsgUENJX0RFVklDRSgweDEwMDIsIDB4NDM3YiksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0FUSSB8IEFaWF9EQ0FQU19QUkVTRVRfQVRJX1NCIH0sCkBAIC0yOTEyLDEyICszMDYzLDEyIEBACiAJICAuY2xhc3MgPSBQQ0lfQ0xBU1NfTVVMVElNRURJQV9IRF9BVURJTyA8PCA4LAogCSAgLmNsYXNzX21hc2sgPSAweGZmZmZmZiwKIAkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfQ1RYIHwgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EIHwKLQkgIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSB9LAorCSAgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZIHwgQVpYX0RDQVBTX1BPU0ZJWF9MUElCIH0sCiAjZWxzZQogCS8qIHRoaXMgZW50cnkgc2VlbXMgc3RpbGwgdmFsaWQgLS0gaS5lLiB3aXRob3V0IGVtdTIwa3ggY2hpcCAqLwogCXsgUENJX0RFVklDRSgweDExMDIsIDB4MDAwOSksCiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX0NUWCB8IEFaWF9EQ0FQU19DVFhfV09SS0FST1VORCB8Ci0JICBBWlhfRENBUFNfUklSQl9QUkVfREVMQVkgfSwKKwkgIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSB8IEFaWF9EQ0FQU19QT1NGSVhfTFBJQiB9LAogI2VuZGlmCiAJLyogVm9ydGV4ODZNWCAqLwogCXsgUENJX0RFVklDRSgweDE3ZjMsIDB4MzAxMCksIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfR0VORVJJQyB9LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggMmU3YWMzMS4uNjU3OWUwZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0yNjcsMTEgKzI2NywxNCBAQAogZW51bSB7IEhEQV9GUk9OVCwgSERBX1JFQVIsIEhEQV9DTEZFLCBIREFfU0lERSB9OyAvKiBpbmRleCBmb3IgZGFjX25pZHggKi8KIGVudW0geyBIREFfRElHX05PTkUsIEhEQV9ESUdfRVhDTFVTSVZFLCBIREFfRElHX0FOQUxPR19EVVAgfTsgLyogZGlnX291dF91c2VkICovCiAKKyNkZWZpbmUgSERBX01BWF9PVVRTCTUKKwogc3RydWN0IGhkYV9tdWx0aV9vdXQgewogCWludCBudW1fZGFjczsJCS8qICMgb2YgREFDcywgbXVzdCBiZSBtb3JlIHRoYW4gMSAqLwogCWNvbnN0IGhkYV9uaWRfdCAqZGFjX25pZHM7CS8qIERBQyBsaXN0ICovCiAJaGRhX25pZF90IGhwX25pZDsJLyogb3B0aW9uYWwgREFDIGZvciBIUCwgMCB3aGVuIG5vdCBleGlzdHMgKi8KLQloZGFfbmlkX3QgZXh0cmFfb3V0X25pZFszXTsJLyogb3B0aW9uYWwgREFDcywgMCB3aGVuIG5vdCBleGlzdHMgKi8KKwloZGFfbmlkX3QgaHBfb3V0X25pZFtIREFfTUFYX09VVFNdOwkvKiBEQUNzIGZvciBtdWx0aXBsZSBIUHMgKi8KKwloZGFfbmlkX3QgZXh0cmFfb3V0X25pZFtIREFfTUFYX09VVFNdOwkvKiBvdGhlciAoZS5nLiBzcGVha2VyKSBEQUNzICovCiAJaGRhX25pZF90IGRpZ19vdXRfbmlkOwkvKiBkaWdpdGFsIG91dCBhdWRpbyB3aWRnZXQgKi8KIAljb25zdCBoZGFfbmlkX3QgKnNsYXZlX2RpZ19vdXRzOwogCWludCBtYXhfY2hhbm5lbHM7CS8qIGN1cnJlbnRseSBzdXBwb3J0ZWQgYW5hbG9nIGNoYW5uZWxzICovCkBAIC0zMzMsOSArMzM2LDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFfY29kZWNfcHJvY19uZXcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkUJODAKLXZvaWQgc25kX3ByaW50X3BjbV9yYXRlcyhpbnQgcGNtLCBjaGFyICpidWYsIGludCBidWZsZW4pOwotCiAjZGVmaW5lIFNORF9QUklOVF9CSVRTX0FEVklTRURfQlVGU0laRQkxNgogdm9pZCBzbmRfcHJpbnRfcGNtX2JpdHMoaW50IHBjbSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKIApAQCAtMzg1LDcgKzM4NSw3IEBACiAJQVVUT19QSU5fSFBfT1VUCiB9OwogCi0jZGVmaW5lIEFVVE9fQ0ZHX01BWF9PVVRTCTUKKyNkZWZpbmUgQVVUT19DRkdfTUFYX09VVFMJSERBX01BWF9PVVRTCiAjZGVmaW5lIEFVVE9fQ0ZHX01BWF9JTlMJOAogCiBzdHJ1Y3QgYXV0b19waW5fY2ZnX2l0ZW0gewpAQCAtNDQyLDEwICs0NDIsMjEgQEAKIAkoY2ZnICYgQUNfREVGQ0ZHX1NFUVVFTkNFKQogI2RlZmluZSBnZXRfZGVmY2ZnX2RldmljZShjZmcpIFwKIAkoKGNmZyAmIEFDX0RFRkNGR19ERVZJQ0UpID4+IEFDX0RFRkNGR19ERVZJQ0VfU0hJRlQpCisjZGVmaW5lIGdldF9kZWZjZmdfbWlzYyhjZmcpIFwKKwkoKGNmZyAmIEFDX0RFRkNGR19NSVNDKSA+PiBBQ19ERUZDRkdfTUlTQ19TSElGVCkKIAotaW50IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcyk7CisvKiBiaXQtZmxhZ3MgZm9yIHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoKSBiZWhhdmlvciAqLworI2RlZmluZSBIREFfUElOQ0ZHX05PX0hQX0ZJWFVQCSgxIDw8IDApIC8qIG5vIEhQLXNwbGl0ICovCisjZGVmaW5lIEhEQV9QSU5DRkdfTk9fTE9fRklYVVAJKDEgPDwgMSkgLyogZG9uJ3QgdGFrZSBvdGhlciBvdXRzIGFzIExPICovCisKK2ludCBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZjZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgICAgIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKKwkJCSAgICAgY29uc3QgaGRhX25pZF90ICppZ25vcmVfbmlkcywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvbmRfZmxhZ3MpOworCisvKiBvbGRlciBmdW5jdGlvbiAqLworI2RlZmluZSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCBjZmcsIGlnbm9yZSkgXAorCXNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZyhjb2RlYywgY2ZnLCBpZ25vcmUsIDApCiAKIC8qIGFtcCB2YWx1ZXMgKi8KICNkZWZpbmUgQU1QX0lOX01VVEUoaWR4KQkoMHg3MDgwIHwgKChpZHgpPDw4KSkKQEAgLTQ5MiwxMyArNTAzLDIyIEBACiBpbnQgc25kX2hkYV9vdmVycmlkZV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjYXBzKTsKIHUzMiBzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKK2ludCBzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNhcHMpOwogdTMyIHNuZF9oZGFfcGluX3NlbnNlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKIGludCBzbmRfaGRhX2phY2tfZGV0ZWN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKIAogc3RhdGljIGlubGluZSBib29sIGlzX2phY2tfZGV0ZWN0YWJsZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKLQlyZXR1cm4gKHNuZF9oZGFfcXVlcnlfcGluX2NhcHMoY29kZWMsIG5pZCkgJiBBQ19QSU5DQVBfUFJFU19ERVRFQ1QpICYmCi0JCShnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX1VOU09MX0NBUCk7CisJaWYgKCEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgbmlkKSAmIEFDX1BJTkNBUF9QUkVTX0RFVEVDVCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIWNvZGVjLT5pZ25vcmVfbWlzY19iaXQgJiYKKwkgICAgKGdldF9kZWZjZmdfbWlzYyhzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCkpICYKKwkgICAgIEFDX0RFRkNGR19NSVNDX05PX1BSRVNFTkNFKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfVU5TT0xfQ0FQKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOwogfQogCiAvKiBmbGFncyBmb3IgaGRhX25pZF9pdGVtICovCkBAIC01ODksNyArNjA5LDggQEAKICNkZWZpbmUgZ2V0X2FtcF9uaWRfKHB2KQkoKHB2KSAmIDB4ZmZmZikKICNkZWZpbmUgZ2V0X2FtcF9uaWQoa2MpCQlnZXRfYW1wX25pZF8oKGtjKS0+cHJpdmF0ZV92YWx1ZSkKICNkZWZpbmUgZ2V0X2FtcF9jaGFubmVscyhrYykJKCgoa2MpLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4MykKLSNkZWZpbmUgZ2V0X2FtcF9kaXJlY3Rpb24oa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAxOCkgJiAweDEpCisjZGVmaW5lIGdldF9hbXBfZGlyZWN0aW9uXyhwdikJKCgocHYpID4+IDE4KSAmIDB4MSkKKyNkZWZpbmUgZ2V0X2FtcF9kaXJlY3Rpb24oa2MpCWdldF9hbXBfZGlyZWN0aW9uXygoa2MpLT5wcml2YXRlX3ZhbHVlKQogI2RlZmluZSBnZXRfYW1wX2luZGV4KGtjKQkoKChrYyktPnByaXZhdGVfdmFsdWUgPj4gMTkpICYgMHhmKQogI2RlZmluZSBnZXRfYW1wX29mZnNldChrYykJKCgoa2MpLT5wcml2YXRlX3ZhbHVlID4+IDIzKSAmIDB4M2YpCiAjZGVmaW5lIGdldF9hbXBfbWluX211dGUoa2MpCSgoKGtjKS0+cHJpdmF0ZV92YWx1ZSA+PiAyOSkgJiAweDEpCkBAIC02MDcsNiArNjI4LDcgQEAKIH07CiAKICNkZWZpbmUgRUxEX0ZJWEVEX0JZVEVTCTIwCisjZGVmaW5lIEVMRF9NQVhfU0laRSAgICAyNTYKICNkZWZpbmUgRUxEX01BWF9NTkwJMTYKICNkZWZpbmUgRUxEX01BWF9TQUQJMTYKIApAQCAtNjMxLDYgKzY1Myw3IEBACiAJaW50CXNwa19hbGxvYzsKIAlpbnQJc2FkX2NvdW50OwogCXN0cnVjdCBjZWFfc2FkIHNhZFtFTERfTUFYX1NBRF07CisJY2hhciAgICBlbGRfYnVmZmVyW0VMRF9NQVhfU0laRV07CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnByb2NfZW50cnk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwppbmRleCAyYmU1N2IwLi4yYzk4MWI1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCkBAIC0xNTIsMTIgKzE1MiwxOCBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9wY21fcmF0ZXMoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgcGNtKQogewotCWNoYXIgYnVmW1NORF9QUklOVF9SQVRFU19BRFZJU0VEX0JVRlNJWkVdOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsKKwkJODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsCisJCTk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzg0MDAwCisJfTsKKwlpbnQgaTsKIAogCXBjbSAmPSBBQ19TVVBQQ01fUkFURVM7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICAgIHJhdGVzIFsweCV4XToiLCBwY20pOwotCXNuZF9wcmludF9wY21fcmF0ZXMocGNtLCBidWYsIHNpemVvZihidWYpKTsKLQlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuIiwgYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykKKwkJaWYgKHBjbSAmICgxIDw8IGkpKQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAgIiAlZCIsIHJhdGVzW2ldKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9wY21fYml0cyhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGludCBwY20pCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV90cmFjZS5oIGIvc291bmQvcGNpL2hkYS9oZGFfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg0ODcxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfdHJhY2UuaApAQCAtMCwwICsxLDExNyBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaGRhCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBoZGFfdHJhY2UKKworI2lmICFkZWZpbmVkKF9UUkFDRV9IREFfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0hEQV9ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBoZGFfYnVzOworc3RydWN0IGhkYV9jb2RlYzsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhoZGFfY21kLAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhjb2RlYywgdmFsKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgY2FyZCApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgYWRkciApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgdmFsICkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhcmQgPSAoY29kZWMpLT5idXMtPmNhcmQtPm51bWJlcjsKKwkJX19lbnRyeS0+YWRkciA9IChjb2RlYyktPmFkZHI7CisJCV9fZW50cnktPnZhbCA9ICh2YWwpOworCSksCisKKwlUUF9wcmludGsoIlslZDolZF0gdmFsPSV4IiwgX19lbnRyeS0+Y2FyZCwgX19lbnRyeS0+YWRkciwgX19lbnRyeS0+dmFsKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9jbWQsIGhkYV9zZW5kX2NtZCwKKwlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHZhbCksCisJVFBfQVJHUyhjb2RlYywgdmFsKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9jbWQsIGhkYV9nZXRfcmVzcG9uc2UsCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCB2YWwpLAorCVRQX0FSR1MoY29kZWMsIHZhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGhkYV9idXNfcmVzZXQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2J1cyAqYnVzKSwKKworCVRQX0FSR1MoYnVzKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwgY2FyZCApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYXJkID0gKGJ1cyktPmNhcmQtPm51bWJlcjsKKwkpLAorCisJVFBfcHJpbnRrKCJbJWRdIiwgX19lbnRyeS0+Y2FyZCkKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoaGRhX3Bvd2VyLAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpLAorCisJVFBfQVJHUyhjb2RlYyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGNhcmQgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGFkZHIgKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+Y2FyZCA9IChjb2RlYyktPmJ1cy0+Y2FyZC0+bnVtYmVyOworCQlfX2VudHJ5LT5hZGRyID0gKGNvZGVjKS0+YWRkcjsKKwkpLAorCisJVFBfcHJpbnRrKCJbJWQ6JWRdIiwgX19lbnRyeS0+Y2FyZCwgX19lbnRyeS0+YWRkcikKKyk7CisKK0RFRklORV9FVkVOVChoZGFfcG93ZXIsIGhkYV9wb3dlcl9kb3duLAorCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSwKKwlUUF9BUkdTKGNvZGVjKQorKTsKKworREVGSU5FX0VWRU5UKGhkYV9wb3dlciwgaGRhX3Bvd2VyX3VwLAorCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSwKKwlUUF9BUkdTKGNvZGVjKQorKTsKKworVFJBQ0VfRVZFTlQoaGRhX3Vuc29sX2V2ZW50LAorCisJVFBfUFJPVE8oc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCksCisKKwlUUF9BUkdTKGJ1cywgcmVzLCByZXNfZXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggdW5zaWduZWQgaW50LCBjYXJkICkKKwkJX19maWVsZCggdTMyLCByZXMgKQorCQlfX2ZpZWxkKCB1MzIsIHJlc19leCApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYXJkID0gKGJ1cyktPmNhcmQtPm51bWJlcjsKKwkJX19lbnRyeS0+cmVzID0gcmVzOworCQlfX2VudHJ5LT5yZXNfZXggPSByZXNfZXg7CisJKSwKKworCVRQX3ByaW50aygiWyVkXSByZXM9JXgsIHJlc19leD0leCIsIF9fZW50cnktPmNhcmQsCisJCSAgX19lbnRyeS0+cmVzLCBfX2VudHJ5LT5yZXNfZXgpCispOworCisjZW5kaWYgLyogX1RSQUNFX0hEQV9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKaW5kZXggODY0ODkxNy4uYmNiMzMxMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC00OCw2ICs0OSw4IEBACiAKIAljb25zdCBoZGFfbmlkX3QgKmFsdF9kYWNfbmlkOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqc3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2s7CisJaW50IGluZGVwZW5kZW50X2hwOworCWludCBudW1fYWN0aXZlX3N0cmVhbXM7CiAKIAkvKiBjYXB0dXJlICovCiAJdW5zaWduZWQgaW50IG51bV9hZGNfbmlkczsKQEAgLTMwMiw2ICszMDUsNzIgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9jdGwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBhY3RpdmUpCit7CisJc3RydWN0IHNuZF9rY29udHJvbCAqY3RsID0gc25kX2hkYV9maW5kX21peGVyX2N0bChjb2RlYywgbmFtZSk7CisJaWYgKGN0bCkgeworCQljdGwtPnZkWzBdLmFjY2VzcyAmPSB+U05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQljdGwtPnZkWzBdLmFjY2VzcyB8PSBhY3RpdmUgPyAwIDoKKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwkJY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKwkJY3RsLT52ZFswXS5hY2Nlc3MgfD0gYWN0aXZlID8KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSA6IDA7CisJCXNuZF9jdGxfbm90aWZ5KGNvZGVjLT5idXMtPmNhcmQsCisJCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywgJmN0bC0+aWQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3N0cmVhbV9hY3RpdmUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGJvb2wgYWN0aXZlKQoreworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmIChhY3RpdmUpCisJCXNwZWMtPm51bV9hY3RpdmVfc3RyZWFtcysrOworCWVsc2UKKwkJc3BlYy0+bnVtX2FjdGl2ZV9zdHJlYW1zLS07CisJYWN0aXZhdGVfY3RsKGNvZGVjLCAiSW5kZXBlbmRlbnQgSFAiLCBzcGVjLT5udW1fYWN0aXZlX3N0cmVhbXMgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg4X2luZGVwZW5kZW50X2hwX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRleHRzW10gPSB7ICJPRkYiLCAiT04iLCBOVUxMfTsKKwlpbnQgaW5kZXg7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaW5kZXggPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtOworCWlmIChpbmRleCA+PSAyKQorCQlpbmRleCA9IDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW2luZGV4XSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQxOTg4X2luZGVwZW5kZW50X2hwX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzcGVjLT5pbmRlcGVuZGVudF9ocDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJdW5zaWduZWQgaW50IHNlbGVjdCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaWYgKHNwZWMtPmluZGVwZW5kZW50X2hwICE9IHNlbGVjdCkgeworCQlzcGVjLT5pbmRlcGVuZGVudF9ocCA9IHNlbGVjdDsKKwkJaWYgKHNwZWMtPmluZGVwZW5kZW50X2hwKQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMDsKKwkJZWxzZQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gc3BlYy0+YWx0X2RhY19uaWRbMF07CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEFuYWxvZyBwbGF5YmFjayBjYWxsYmFja3MKICAqLwpAQCAtMzEwLDggKzM3OSwxNSBAQAogCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgYWQxOTh4X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCwgc3Vic3RyZWFtLAorCWludCBlcnI7CisJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIHRydWUpOworCWVyciA9IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN1YnN0cmVhbSwKIAkJCQkJICAgICBoaW5mbyk7CisJaWYgKGVyciA8IDApIHsKKwkJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIGZhbHNlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWQxOTh4X3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCkBAIC0zMzMsMTEgKzQwOSw0MSBAQAogCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAorc3RhdGljIGludCBhZDE5OHhfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzZXRfc3RyZWFtX2FjdGl2ZShjb2RlYywgZmFsc2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX29wZW4oc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhZDE5OHhfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWlmICghc3BlYy0+aW5kZXBlbmRlbnRfaHApCisJCXJldHVybiAtRUJVU1k7CisJc2V0X3N0cmVhbV9hY3RpdmUoY29kZWMsIHRydWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX2Nsb3NlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzZXRfc3RyZWFtX2FjdGl2ZShjb2RlYywgZmFsc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFkMTk4eF9wY21fYW5hbG9nX2FsdF9wbGF5YmFjayA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCi0JLyogTklEIGlzIHNldCBpbiBhZDE5OHhfYnVpbGRfcGNtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuICA9IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IGFkMTk4OF9hbHRfcGxheWJhY2tfcGNtX2Nsb3NlCisJfSwKIH07CiAKIC8qCkBAIC00MDIsNyArNTA4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFkMTk4eF9wY21fYW5hbG9nX3BsYXliYWNrID0gewpAQCAtNDEzLDcgKzUxOCw4IEBACiAJLm9wcyA9IHsKIAkJLm9wZW4gPSBhZDE5OHhfcGxheWJhY2tfcGNtX29wZW4sCiAJCS5wcmVwYXJlID0gYWQxOTh4X3BsYXliYWNrX3BjbV9wcmVwYXJlLAotCQkuY2xlYW51cCA9IGFkMTk4eF9wbGF5YmFja19wY21fY2xlYW51cAorCQkuY2xlYW51cCA9IGFkMTk4eF9wbGF5YmFja19wY21fY2xlYW51cCwKKwkJLmNsb3NlID0gYWQxOTh4X3BsYXliYWNrX3BjbV9jbG9zZQogCX0sCiB9OwogCkBAIC0yMDU4LDcgKzIxNjQsNiBAQAogZW51bSB7CiAJQUQxOTg4XzZTVEFDSywKIAlBRDE5ODhfNlNUQUNLX0RJRywKLQlBRDE5ODhfNlNUQUNLX0RJR19GUCwKIAlBRDE5ODhfM1NUQUNLLAogCUFEMTk4OF8zU1RBQ0tfRElHLAogCUFEMTk4OF9MQVBUT1AsCkBAIC0yMTY4LDYgKzIyNzMsMTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4X2hwX21peGVyc1tdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkluZGVwZW5kZW50IEhQIiwKKwkJLmluZm8gPSBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfaW5mbywKKwkJLmdldCA9IGFkMTk4OF9pbmRlcGVuZGVudF9ocF9nZXQsCisJCS5wdXQgPSBhZDE5ODhfaW5kZXBlbmRlbnRfaHBfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKwogLyogNi1zdGFjayBtb2RlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4XzZzdGFja19taXhlcnMxW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwNCwgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTIxODgsNiArMjMwNCw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWQxOTg4XzZzdGFja19taXhlcnMyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgyOSwgMiwgSERBX0lOUFVUKSwKIAlIREFfQklORF9NVVRFKCJTdXJyb3VuZCBQbGF5YmFjayBTd2l0Y2giLCAweDJhLCAyLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX01VVEVfTU9OTygiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MjcsIDEsIDIsIEhEQV9JTlBVVCksCkBAIC0yMjEwLDEzICsyMzI3LDYgQEAKIAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDNjLCAweDAsIEhEQV9PVVRQVVQpLAotCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTk4OF82c3RhY2tfZnBfbWl4ZXJzW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCi0KIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0yMjM4LDYgKzIzNDgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkMTk4OF8zc3RhY2tfbWl4ZXJzMltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MjksIDIsIEhEQV9JTlBVVCksCiAJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgyYywgMiwgSERBX0lOUFVUKSwKIAlIREFfQklORF9NVVRFX01PTk8oIkNlbnRlciBQbGF5YmFjayBTd2l0Y2giLCAweDI2LCAxLCAyLCBIREFfSU5QVVQpLApAQCAtMjI3Miw2ICsyMzgzLDcgQEAKIAogLyogbGFwdG9wIG1vZGUgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE5ODhfbGFwdG9wX21peGVyc1tdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDAzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgyOSwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX01VVEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxZSwgMiwgSERBX0lOUFVUKSwKQEAgLTI0NDYsNyArMjU1OCw3IEBACiAJezB4MDUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCS8qIFBvcnQtQSBmcm9udCBoZWFkcGhvbiBwYXRoICovCi0JezB4MzcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxfSwgLyogREFDMTowNGggKi8KKwl7MHgzNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LCAvKiBEQUMwOjAzaCAqLwogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKIAl7MHgxMSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LApAQCAtMjU5NCw3ICsyNzA2LDcgQEAKIAl7MHgwNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAogCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJLyogUG9ydC1BIGZyb250IGhlYWRwaG9uIHBhdGggKi8KLQl7MHgzNywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDF9LCAvKiBEQUMxOjA0aCAqLworCXsweDM3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIERBQzA6MDNoICovCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAogCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCkBAIC0yNjY5LDcgKzI3ODEsNyBAQAogCXsweDA1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKIAkvKiBQb3J0LUEgZnJvbnQgaGVhZHBob24gcGF0aCAqLwotCXsweDM3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMX0sIC8qIERBQzE6MDRoICovCisJezB4MzcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgLyogREFDMDowM2ggKi8KIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCiAJezB4MTEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKQEAgLTI3ODIsMTEgKzI4OTQsMTEgQEAKIHsKIAlzdGF0aWMgY29uc3QgaGRhX25pZF90IGlkeF90b19kYWNbOF0gPSB7CiAJCS8qIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICAgIEcgICAgIEggKi8KLQkJMHgwNCwgMHgwNiwgMHgwNSwgMHgwNCwgMHgwYSwgMHgwNiwgMHgwNSwgMHgwYQorCQkweDAzLCAweDA2LCAweDA1LCAweDA0LCAweDBhLCAweDA2LCAweDA1LCAweDBhCiAJfTsKIAlzdGF0aWMgY29uc3QgaGRhX25pZF90IGlkeF90b19kYWNfcmV2Mls4XSA9IHsKIAkJLyogQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRyAgICAgSCAqLwotCQkweDA0LCAweDA1LCAweDBhLCAweDA0LCAweDA2LCAweDA1LCAweDBhLCAweDA2CisJCTB4MDMsIDB4MDUsIDB4MGEsIDB4MDQsIDB4MDYsIDB4MDUsIDB4MGEsIDB4MDYKIAl9OwogCWlmIChpc19yZXYyKGNvZGVjKSkKIAkJcmV0dXJuIGlkeF90b19kYWNfcmV2MltpZHhdOwpAQCAtMzAyMyw4ICszMTM1LDggQEAKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGluX3R5cGUpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUpOwogCXN3aXRjaCAobmlkKSB7Ci0JY2FzZSAweDExOiAvKiBwb3J0LUEgLSBEQUMgMDQgKi8KLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgzNywgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEpOworCWNhc2UgMHgxMTogLyogcG9ydC1BIC0gREFDIDAzICovCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MzcsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwKTsKIAkJYnJlYWs7CiAJY2FzZSAweDE0OiAvKiBwb3J0LUIgLSBEQUMgMDYgKi8KIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgzMCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIpOwpAQCAtMzE1MCw3ICszMjYyLDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWQxOTg4X21vZGVsc1tBRDE5ODhfTU9ERUxfTEFTVF0gPSB7CiAJW0FEMTk4OF82U1RBQ0tdCQk9ICI2c3RhY2siLAogCVtBRDE5ODhfNlNUQUNLX0RJR10JPSAiNnN0YWNrLWRpZyIsCi0JW0FEMTk4OF82U1RBQ0tfRElHX0ZQXQk9ICI2c3RhY2stZGlnLWZwIiwKIAlbQUQxOTg4XzNTVEFDS10JCT0gIjNzdGFjayIsCiAJW0FEMTk4OF8zU1RBQ0tfRElHXQk9ICIzc3RhY2stZGlnIiwKIAlbQUQxOTg4X0xBUFRPUF0JCT0gImxhcHRvcCIsCkBAIC0zMjA4LDEwICszMzE5LDExIEBACiAJfQogCXNldF9iZWVwX2FtcChzcGVjLCAweDEwLCAwLCBIREFfT1VUUFVUKTsKIAorCWlmICghc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQorCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBhZDE5ODhfYWx0X2RhY19uaWRbMF07CiAJc3dpdGNoIChib2FyZF9jb25maWcpIHsKIAljYXNlIEFEMTk4OF82U1RBQ0s6CiAJY2FzZSBBRDE5ODhfNlNUQUNLX0RJRzoKLQljYXNlIEFEMTk4OF82U1RBQ0tfRElHX0ZQOgogCQlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSA4OwogCQlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDQ7CiAJCWlmIChpc19yZXYyKGNvZGVjKSkKQEAgLTMyMjcsMTkgKzMzMzksNyBAQAogCQlzcGVjLT5taXhlcnNbMV0gPSBhZDE5ODhfNnN0YWNrX21peGVyczI7CiAJCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMTsKIAkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGFkMTk4OF82c3RhY2tfaW5pdF92ZXJiczsKLQkJaWYgKGJvYXJkX2NvbmZpZyA9PSBBRDE5ODhfNlNUQUNLX0RJR19GUCkgewotCQkJc3BlYy0+bnVtX21peGVycysrOwotCQkJc3BlYy0+bWl4ZXJzWzJdID0gYWQxOTg4XzZzdGFja19mcF9taXhlcnM7Ci0JCQlzcGVjLT5udW1faW5pdF92ZXJicysrOwotCQkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGFkMTk4OF82c3RhY2tfZnBfaW5pdF92ZXJiczsKLQkJCXNwZWMtPnNsYXZlX3ZvbHMgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3ZvbHM7Ci0JCQlzcGVjLT5zbGF2ZV9zd3MgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3N3czsKLQkJCXNwZWMtPmFsdF9kYWNfbmlkID0gYWQxOTg4X2FsdF9kYWNfbmlkOwotCQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2sgPQotCQkJCSZhZDE5OHhfcGNtX2FuYWxvZ19hbHRfcGxheWJhY2s7Ci0JCX0KLQkJaWYgKChib2FyZF9jb25maWcgPT0gQUQxOTg4XzZTVEFDS19ESUcpIHx8Ci0JCQkoYm9hcmRfY29uZmlnID09IEFEMTk4OF82U1RBQ0tfRElHX0ZQKSkgeworCQlpZiAoYm9hcmRfY29uZmlnID09IEFEMTk4OF82U1RBQ0tfRElHKSB7CiAJCQlzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCA9IEFEMTk4OF9TUERJRl9PVVQ7CiAJCQlzcGVjLT5kaWdfaW5fbmlkID0gQUQxOTg4X1NQRElGX0lOOwogCQl9CkBAIC0zMjgyLDYgKzMzODIsMTUgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSkgeworCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IGFkMTk4OF9ocF9taXhlcnM7CisJCXNwZWMtPnNsYXZlX3ZvbHMgPSBhZDE5ODhfNnN0YWNrX2ZwX3NsYXZlX3ZvbHM7CisJCXNwZWMtPnNsYXZlX3N3cyA9IGFkMTk4OF82c3RhY2tfZnBfc2xhdmVfc3dzOworCQlzcGVjLT5hbHRfZGFjX25pZCA9IGFkMTk4OF9hbHRfZGFjX25pZDsKKwkJc3BlYy0+c3RyZWFtX2FuYWxvZ19hbHRfcGxheWJhY2sgPQorCQkJJmFkMTk4eF9wY21fYW5hbG9nX2FsdF9wbGF5YmFjazsKKwl9CisKIAlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFkMTk4OF9hZGNfbmlkcyk7CiAJc3BlYy0+YWRjX25pZHMgPSBhZDE5ODhfYWRjX25pZHM7CiAJc3BlYy0+Y2Fwc3JjX25pZHMgPSBhZDE5ODhfY2Fwc3JjX25pZHM7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYwppbmRleCA2YjQwNjg0Li45OTM3NTdiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwppbmRleCBkOWEyMjU0Li4zNWFiZTNjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwppbmRleCBjNDVmM2U2Li4yYTJkODY0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwppbmRleCBjZDJjZjVlLi5iNjc2N2I0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggNzY3NTJkOGUuLjBkZTIxMTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCkBAIC0xMzYsNiArMTM3LDggQEAKIAl1bnNpZ25lZCBpbnQgdGhpbmtwYWQ6MTsKIAl1bnNpZ25lZCBpbnQgaHBfbGFwdG9wOjE7CiAJdW5zaWduZWQgaW50IGFzdXM6MTsKKwl1bnNpZ25lZCBpbnQgcGluX2VhcGRfY3RybHM6MTsKKwl1bnNpZ25lZCBpbnQgc2luZ2xlX2FkY19hbXA6MTsKIAogCXVuc2lnbmVkIGludCBhZGNfc3dpdGNoaW5nOjE7CiAKQEAgLTE4NjcsMzkgKzE4NzAsNiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA1MV9sZW5vdm9feDIwMF9pbml0X3ZlcmJzW10gPSB7Ci0JLyogTGluZSBpbiwgTWljICovCi0JezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKLQl7MHgxNywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKLQl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKSB8IDB4MDN9LAotCXsweDE4LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCi0JezB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKLQkvKiBTUEsgICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBIUCwgQW1wICAqLwotCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUH0sCi0JezB4MTYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKLQkvKiBEb2NraW5nIEhQICovCi0JezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAotCS8qIERBQzEgKi8KLQl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCi0JezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDQ0fSwKLQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKSB8IDB4NDR9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIHwgMHg0NH0sCi0JLyogU1BESUYgcm91dGU6IFBDTSAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LCAvKiBuZWVkZWQgZm9yIFc1MDAgQWR2YW5jZWQgTWluaSBEb2NrIDI1MDQxMCAqLwotCXsweDFjLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwfSwKLQkvKiBFQVBEICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDJ9LCAvKiBkZWZhdWx0IG9uICovCi0JezB4MTYsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU58Q09ORVhBTlRfSFBfRVZFTlR9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfENPTkVYQU5UX0hQX0VWRU5UfSwKLQl7IH0gLyogZW5kICovCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIGN4dDUwNTFfZjcwMF9pbml0X3ZlcmJzW10gPSB7CiAJLyogTGluZSBpbiwgTWljICovCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDAzfSwKQEAgLTE5NjgsNyArMTkzOCw2IEBACiAJQ1hUNTA1MV9MQVBUT1AsCSAvKiBMYXB0b3BzIHcvIEVBUEQgc3VwcG9ydCAqLwogCUNYVDUwNTFfSFAsCS8qIG5vIGRvY2tpbmcgKi8KIAlDWFQ1MDUxX0hQX0RWNjczNiwJLyogSFAgd2l0aG91dCBtaWMgc3dpdGNoICovCi0JQ1hUNTA1MV9MRU5PVk9fWDIwMCwJLyogTGVub3ZvIFgyMDAgbGFwdG9wLCBhbHNvIHVzZWQgZm9yIEFkdmFuY2VkIE1pbmkgRG9jayAyNTA0MTAgKi8KIAlDWFQ1MDUxX0Y3MDAsICAgICAgIC8qIEhQIENvbXBhcSBQcmVzYXJpbyBGNzAwICovCiAJQ1hUNTA1MV9UT1NISUJBLAkvKiBUb3NoaWJhIE0zMDAgJiBjbyAqLwogCUNYVDUwNTFfSURFQVBBRCwJLyogTGVub3ZvIElkZWFQYWQgWTQzMCAqLwpAQCAtMTk4MCw3ICsxOTQ5LDYgQEAKIAlbQ1hUNTA1MV9MQVBUT1BdCT0gImxhcHRvcCIsCiAJW0NYVDUwNTFfSFBdCQk9ICJocCIsCiAJW0NYVDUwNTFfSFBfRFY2NzM2XQk9ICJocC1kdjY3MzYiLAotCVtDWFQ1MDUxX0xFTk9WT19YMjAwXQk9ICJsZW5vdm8teDIwMCIsCiAJW0NYVDUwNTFfRjcwMF0gICAgICAgICAgPSAiaHAtNzAwIiwKIAlbQ1hUNTA1MV9UT1NISUJBXQk9ICJ0b3NoaWJhIiwKIAlbQ1hUNTA1MV9JREVBUEFEXQk9ICJpZGVhcGFkIiwKQEAgLTE5OTUsNyArMTk2Myw2IEBACiAJU05EX1BDSV9RVUlSSygweDE0ZjEsIDB4MDEwMSwgIkNvbmV4YW50IFJlZmVyZW5jZSBib2FyZCIsCiAJCSAgICAgIENYVDUwNTFfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTRmMSwgMHg1MDUxLCAiSFAgU3BhcnRhbiAxLjEiLCBDWFQ1MDUxX0hQKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMGYyLCAiTGVub3ZvIFgyMDAiLCBDWFQ1MDUxX0xFTk9WT19YMjAwKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYTBkLCAiTGVub3ZvIElkZWFQYWQiLCBDWFQ1MDUxX0lERUFQQUQpLAogCXt9CiB9OwpAQCAtMjA1MywxMyArMjAyMCw2IEBACiAJCXNwZWMtPm1peGVyc1swXSA9IGN4dDUwNTFfaHBfZHY2NzM2X21peGVyczsKIAkJc3BlYy0+YXV0b19taWMgPSAwOwogCQlicmVhazsKLQljYXNlIENYVDUwNTFfTEVOT1ZPX1gyMDA6Ci0JCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBjeHQ1MDUxX2xlbm92b194MjAwX2luaXRfdmVyYnM7Ci0JCS8qIFRoaW5rcGFkIFgzMDEgZG9lcyBub3QgaGF2ZSBTL1BESUYgd2lyZWQgYW5kIG5vIGFiaWxpdHkKLQkJICAgdG8gdXNlIGEgZG9ja2luZyBzdGF0aW9uLiAqLwotCQlpZiAoY29kZWMtPnN1YnN5c3RlbV9pZCA9PSAweDE3YWEyMTFmKQotCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAwOwotCQlicmVhazsKIAljYXNlIENYVDUwNTFfRjcwMDoKIAkJc3BlYy0+aW5pdF92ZXJic1swXSA9IGN4dDUwNTFfZjcwMF9pbml0X3ZlcmJzOwogCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDUxX2Y3MDBfbWl4ZXJzOwpAQCAtMzEwMiw3ICszMDYyLDYgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTkzLCAiQXN1cyBVNTBGIiwgQ1hUNTA2Nl9BU1VTKSwKIAlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjFlLCAiVG9zaGliYSBTYXRlbGxpdGUgQzY1MEQiLCBDWFQ1MDY2X0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmNTAsICJUb3NoaWJhIFNhdGVsbGl0ZSBQNTAwLVBTUEdTQy0wMTgwMFQiLCBDWFQ1MDY2X09MUENfWE9fMV81KSwKLQlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZmUwLCAiVG9zaGliYSBTYXRlbGxpdGUgUHJvIFQxMzAtMTVGIiwgQ1hUNTA2Nl9PTFBDX1hPXzFfNSksCiAJU05EX1BDSV9RVUlSSygweDE0ZjEsIDB4MDEwMSwgIkNvbmV4YW50IFJlZmVyZW5jZSBib2FyZCIsCiAJCSAgICAgIENYVDUwNjZfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwODMzLCAiT0xQQyBYTy0xLjUiLCBDWFQ1MDY2X09MUENfWE9fMV81KSwKQEAgLTM0NzMsMTIgKzM0MzIsMTQgQEAKIHN0YXRpYyB2b2lkIGRvX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbnVtX3BpbnMsCiAJCQloZGFfbmlkX3QgKnBpbnMsIGJvb2wgb24pCiB7CisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BpbnM7IGkrKykKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcGluc1tpXSwgMCwKIAkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJCSAgICBvbiA/IFBJTl9PVVQgOiAwKTsKLQljeF9hdXRvX3R1cm5fZWFwZChjb2RlYywgbnVtX3BpbnMsIHBpbnMsIG9uKTsKKwlpZiAoc3BlYy0+cGluX2VhcGRfY3RybHMpCisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBudW1fcGlucywgcGlucywgb24pOwogfQogCiBzdGF0aWMgaW50IGRldGVjdF9qYWNrcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLCBoZGFfbmlkX3QgKnBpbnMpCkBAIC0zNTAzLDkgKzM0NjQsMTIgQEAKIAlpbnQgb24gPSAxOwogCiAJLyogdHVybiBvbiBIUCBFQVBEIHdoZW4gSFAgamFja3MgYXJlIHByZXNlbnQgKi8KLQlpZiAoc3BlYy0+YXV0b19tdXRlKQotCQlvbiA9IHNwZWMtPmhwX3ByZXNlbnQ7Ci0JY3hfYXV0b190dXJuX2VhcGQoY29kZWMsIGNmZy0+aHBfb3V0cywgY2ZnLT5ocF9waW5zLCBvbik7CisJaWYgKHNwZWMtPnBpbl9lYXBkX2N0cmxzKSB7CisJCWlmIChzcGVjLT5hdXRvX211dGUpCisJCQlvbiA9IHNwZWMtPmhwX3ByZXNlbnQ7CisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBjZmctPmhwX291dHMsIGNmZy0+aHBfcGlucywgb24pOworCX0KKwogCS8qIG11dGUgc3BlYWtlcnMgaW4gYXV0by1tb2RlIGlmIEhQIG9yIExPIGphY2tzIGFyZSBwbHVnZ2VkICovCiAJaWYgKHNwZWMtPmF1dG9fbXV0ZSkKIAkJb24gPSAhKHNwZWMtPmhwX3ByZXNlbnQgfHwKQEAgLTM5MzIsMjAgKzM4OTYsMTAgQEAKICNkZWZpbmUgY3hfYXV0b19wYXJzZV9iZWVwKGNvZGVjKQogI2VuZGlmCiAKLXN0YXRpYyBib29sIGZvdW5kX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGNvbnN0IGhkYV9uaWRfdCAqbGlzdCwgaW50IG51bXMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IG51bXM7IGkrKykKLQkJaWYgKGxpc3RbaV0gPT0gbmlkKQotCQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiBwYXJzZSBleHRyYS1FQVBEIHRoYXQgYXJlbid0IGFzc2lnbmVkIHRvIGFueSBwaW5zICovCisvKiBwYXJzZSBFQVBEcyAqLwogc3RhdGljIHZvaWQgY3hfYXV0b19wYXJzZV9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CiAJaGRhX25pZF90IG5pZCwgZW5kX25pZDsKIAogCWVuZF9uaWQgPSBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsKQEAgLTM5NTQsMTQgKzM5MDgsMTggQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIShzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKGNvZGVjLCBuaWQpICYgQUNfUElOQ0FQX0VBUEQpKQogCQkJY29udGludWU7Ci0JCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5saW5lX291dHMpIHx8Ci0JCSAgICBmb3VuZF9pbl9uaWRfbGlzdChuaWQsIGNmZy0+aHBfcGlucywgY2ZnLT5ocF9vdXRzKSB8fAotCQkgICAgZm91bmRfaW5fbmlkX2xpc3QobmlkLCBjZmctPnNwZWFrZXJfcGlucywgY2ZnLT5zcGVha2VyX291dHMpKQotCQkJY29udGludWU7CiAJCXNwZWMtPmVhcGRzW3NwZWMtPm51bV9lYXBkcysrXSA9IG5pZDsKIAkJaWYgKHNwZWMtPm51bV9lYXBkcyA+PSBBUlJBWV9TSVpFKHNwZWMtPmVhcGRzKSkKIAkJCWJyZWFrOwogCX0KKworCS8qIE5PVEU6IGJlbG93IGlzIGEgd2lsZCBndWVzczsgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gdHdvIEVBUERzLAorCSAqIGl0J3MgYSBuZXcgY2hpcCwgd2hlcmUgRUFQRHMgYXJlIHN1cHBvc2VkIHRvIGJlIGFzc29jaWF0ZWQgdG8KKwkgKiBwaW5zLCBhbmQgd2UgY2FuIGNvbnRyb2wgRUFQRCBwZXIgcGluLgorCSAqIE9UT0gsIGlmIG9ubHkgb25lIG9yIHR3byBFQVBEcyBhcmUgZm91bmQsIGl0J3MgYW4gb2xkIGNoaXAsCisJICogdGh1cyBpdCBtaWdodCBjb250cm9sIG92ZXIgYWxsIHBpbnMuCisJICovCisJc3BlYy0+cGluX2VhcGRfY3RybHMgPSBzcGVjLT5udW1fZWFwZHMgPiAyOwogfQogCiBzdGF0aWMgaW50IGN4X2F1dG9fcGFyc2VfYXV0b19jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC00MDY3LDggKzQwMjUsOSBAQAogCQl9CiAJfQogCWN4X2F1dG9fdXBkYXRlX3NwZWFrZXJzKGNvZGVjKTsKLQkvKiB0dXJuIG9uL29mZiBleHRyYSBFQVBEcywgdG9vICovCi0JY3hfYXV0b190dXJuX2VhcGQoY29kZWMsIHNwZWMtPm51bV9lYXBkcywgc3BlYy0+ZWFwZHMsIHRydWUpOworCS8qIHR1cm4gb24gYWxsIEVBUERzIGlmIG5vIGluZGl2aWR1YWwgRUFQRCBjb250cm9sIGlzIGF2YWlsYWJsZSAqLworCWlmICghc3BlYy0+cGluX2VhcGRfY3RybHMpCisJCWN4X2F1dG9fdHVybl9lYXBkKGNvZGVjLCBzcGVjLT5udW1fZWFwZHMsIHNwZWMtPmVhcGRzLCB0cnVlKTsKIH0KIAogc3RhdGljIHZvaWQgY3hfYXV0b19pbml0X2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNDI1NSw2ICs0MjE0LDggQEAKIAkJaW50IGlkeCA9IGdldF9pbnB1dF9jb25uZWN0aW9uKGNvZGVjLCBhZGNfbmlkLCBuaWQpOwogCQlpZiAoaWR4IDwgMCkKIAkJCWNvbnRpbnVlOworCQlpZiAoc3BlYy0+c2luZ2xlX2FkY19hbXApCisJCQlpZHggPSAwOwogCQlyZXR1cm4gY3hfYXV0b19hZGRfdm9sdW1lX2lkeChjb2RlYywgbGFiZWwsIHBmeCwKIAkJCQkJICAgICAgY2lkeCwgYWRjX25pZCwgSERBX0lOUFVULCBpZHgpOwogCX0KQEAgLTQyOTUsMTQgKzQyNTYsMjEgQEAKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CiAJY29uc3QgY2hhciAqcHJldl9sYWJlbDsKIAlpbnQgaW5wdXRfY29ubltIREFfTUFYX05VTV9JTlBVVFNdOwotCWludCBpLCBlcnIsIGNpZHg7CisJaW50IGksIGosIGVyciwgY2lkeDsKIAlpbnQgbXVsdGlfY29ubmVjdGlvbjsKIAorCWlmICghaW11eC0+bnVtX2l0ZW1zKQorCQlyZXR1cm4gMDsKKwogCW11bHRpX2Nvbm5lY3Rpb24gPSAwOwogCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewogCQljaWR4ID0gZ2V0X2lucHV0X2Nvbm5lY3Rpb24oY29kZWMsIHNwZWMtPmltdXhfaW5mb1tpXS5hZGMsCiAJCQkJCSAgICBzcGVjLT5pbXV4X2luZm9baV0ucGluKTsKLQkJaW5wdXRfY29ubltpXSA9IChzcGVjLT5pbXV4X2luZm9baV0uYWRjIDw8IDgpIHwgY2lkeDsKKwkJaWYgKGNpZHggPCAwKQorCQkJY29udGludWU7CisJCWlucHV0X2Nvbm5baV0gPSBzcGVjLT5pbXV4X2luZm9baV0uYWRjOworCQlpZiAoIXNwZWMtPnNpbmdsZV9hZGNfYW1wKQorCQkJaW5wdXRfY29ubltpXSB8PSBjaWR4IDw8IDg7CiAJCWlmIChpID4gMCAmJiBpbnB1dF9jb25uW2ldICE9IGlucHV0X2Nvbm5bMF0pCiAJCQltdWx0aV9jb25uZWN0aW9uID0gMTsKIAl9CkBAIC00MzMxLDYgKzQyOTksMTUgQEAKIAkJCWVyciA9IGN4X2F1dG9fYWRkX2NhcHR1cmVfdm9sdW1lKGNvZGVjLCBuaWQsCiAJCQkJCQkJICJDYXB0dXJlIiwgIiIsIGNpZHgpOwogCQl9IGVsc2UgeworCQkJYm9vbCBkdXBfZm91bmQgPSBmYWxzZTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlpZiAoaW5wdXRfY29ubltqXSA9PSBpbnB1dF9jb25uW2ldKSB7CisJCQkJCWR1cF9mb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChkdXBfZm91bmQpCisJCQkJY29udGludWU7CiAJCQllcnIgPSBjeF9hdXRvX2FkZF9jYXB0dXJlX3ZvbHVtZShjb2RlYywgbmlkLAogCQkJCQkJCSBsYWJlbCwgIiBDYXB0dXJlIiwgY2lkeCk7CiAJCX0KQEAgLTQzOTQsNiArNDM3MSw1MyBAQAogCS5yZWJvb3Rfbm90aWZ5ID0gc25kX2hkYV9zaHV0dXBfcGlucywKIH07CiAKKy8qCisgKiBwaW4gZml4LXVwCisgKi8KK3N0cnVjdCBjeHRfcGluY2ZnIHsKKwloZGFfbmlkX3QgbmlkOworCXUzMiB2YWw7Cit9OworCitzdGF0aWMgdm9pZCBhcHBseV9waW5jZmcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IHN0cnVjdCBjeHRfcGluY2ZnICpjZmcpCit7CisJZm9yICg7IGNmZy0+bmlkOyBjZmcrKykKKwkJc25kX2hkYV9jb2RlY19zZXRfcGluY2ZnKGNvZGVjLCBjZmctPm5pZCwgY2ZnLT52YWwpOworCit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X3Bpbl9maXh1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqcXVpcmssCisJCQkgICAgY29uc3Qgc3RydWN0IGN4dF9waW5jZmcgKip0YWJsZSkKK3sKKwlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNvZGVjLT5idXMtPnBjaSwgcXVpcmspOworCWlmIChxdWlyaykgeworCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogYXBwbHlpbmcgcGluY2ZnIGZvciAlc1xuIiwKKwkJCSAgICBxdWlyay0+bmFtZSk7CisJCWFwcGx5X3BpbmNmZyhjb2RlYywgdGFibGVbcXVpcmstPnZhbHVlXSk7CisJfQorfQorCitlbnVtIHsKKwlDWFRfUElOQ0ZHX0xFTk9WT19YMjAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeHRfcGluY2ZnIGN4dF9waW5jZmdfbGVub3ZvX3gyMDBbXSA9IHsKKwl7IDB4MTYsIDB4MDQyMTQwZmYgfSwgLyogSFAgKHNlcSMgb3ZlcnJpZGRlbikgKi8KKwl7IDB4MTcsIDB4MjFhMTEwMDAgfSwgLyogZG9jay1taWMgKi8KKwl7IDB4MTksIDB4MjEyMTEwM2YgfSwgLyogZG9jay1IUCAqLworCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4dF9waW5jZmcgKmN4dF9waW5jZmdfdGJsW10gPSB7CisJW0NYVF9QSU5DRkdfTEVOT1ZPX1gyMDBdID0gY3h0X3BpbmNmZ19sZW5vdm9feDIwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBjeHRfZml4dXBzW10gPSB7CisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIkxlbm92byBYMjAwIiwgQ1hUX1BJTkNGR19MRU5PVk9fWDIwMCksCisJe30KK307CisKIHN0YXRpYyBpbnQgcGF0Y2hfY29uZXhhbnRfYXV0byhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYzsKQEAgLTQ0MDcsNiArNDQzMSwxNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAljb2RlYy0+c3BlYyA9IHNwZWM7CiAJY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCA9IDE7CisKKwlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwljYXNlIDB4MTRmMTUwNDU6CisJCXNwZWMtPnNpbmdsZV9hZGNfYW1wID0gMTsKKwkJYnJlYWs7CisJfQorCisJYXBwbHlfcGluX2ZpeHVwKGNvZGVjLCBjeHRfZml4dXBzLCBjeHRfcGluY2ZnX3RibCk7CisKIAllcnIgPSBjeF9hdXRvX3NlYXJjaF9hZGNzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggMTljYjcyZC4uODFiN2I3OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMzI0LDYgKzMyNCw2NiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IGhkbWlfZWxkX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjOworCWludCBwaW5faWR4OworCisJc3BlYyA9IGNvZGVjLT5zcGVjOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKKworCXBpbl9pZHggPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1aW5mby0+Y291bnQgPSBzcGVjLT5waW5zW3Bpbl9pZHhdLnNpbmtfZWxkLmVsZF9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9lbGRfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWM7CisJaW50IHBpbl9pZHg7CisKKwlzcGVjID0gY29kZWMtPnNwZWM7CisJcGluX2lkeCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAorCQlzcGVjLT5waW5zW3Bpbl9pZHhdLnNpbmtfZWxkLmVsZF9idWZmZXIsIEVMRF9NQVhfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVsZF9ieXRlc19jdGwgPSB7CisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICJFTEQiLAorCS5pbmZvID0gaGRtaV9lbGRfY3RsX2luZm8sCisJLmdldCA9IGhkbWlfZWxkX2N0bF9nZXQsCit9OworCitzdGF0aWMgaW50IGhkbWlfY3JlYXRlX2VsZF9jdGwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwaW5faWR4LAorCQkJaW50IGRldmljZSkKK3sKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgZXJyOworCisJa2N0bCA9IHNuZF9jdGxfbmV3MSgmZWxkX2J5dGVzX2N0bCwgY29kZWMpOworCWlmICgha2N0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IHBpbl9pZHg7CisJa2N0bC0+aWQuZGV2aWNlID0gZGV2aWNlOworCisJZXJyID0gc25kX2hkYV9jdGxfYWRkKGNvZGVjLCBzcGVjLT5waW5zW3Bpbl9pZHhdLnBpbl9uaWQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBCRV9QQVJBTk9JRAogc3RhdGljIHZvaWQgaGRtaV9nZXRfZGlwX2luZGV4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluX25pZCwKIAkJCQlpbnQgKnBhY2tldF9pbmRleCwgaW50ICpieXRlX2luZGV4KQpAQCAtOTQ2LDcgKzEwMDYsNiBAQAogCXVuc2lnbmVkIGludCBjYXBzLCBjb25maWc7CiAJaW50IHBpbl9pZHg7CiAJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluOwotCXN0cnVjdCBoZG1pX2VsZCAqZWxkOwogCWludCBlcnI7CiAKIAljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBwaW5fbmlkLCBBQ19QQVJfUElOX0NBUCk7CkBAIC05NjMsMjMgKzEwMjIsMTUgQEAKIAogCXBpbl9pZHggPSBzcGVjLT5udW1fcGluczsKIAlwZXJfcGluID0gJnNwZWMtPnBpbnNbcGluX2lkeF07Ci0JZWxkID0gJnBlcl9waW4tPnNpbmtfZWxkOwogCiAJcGVyX3Bpbi0+cGluX25pZCA9IHBpbl9uaWQ7CiAKLQllcnIgPSBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBwaW5fbmlkLAotCQkJCSAgICAgU05EX0pBQ0tfVklERU9PVVQsIE5VTEwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCiAJZXJyID0gaGRtaV9yZWFkX3Bpbl9jb25uKGNvZGVjLCBwaW5faWR4KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMtPm51bV9waW5zKys7CiAKLQloZG1pX3ByZXNlbnRfc2Vuc2UoY29kZWMsIHBpbl9uaWQsIGVsZCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE2Miw2ICsxMjEzLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2VuZXJpY19oZG1pX2J1aWxkX2phY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwaW5faWR4KQoreworCWludCBlcnI7CisJY2hhciBoZG1pX3N0clszMl07CisJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9ICZzcGVjLT5waW5zW3Bpbl9pZHhdOworCWludCBwY21kZXYgPSBzcGVjLT5wY21fcmVjW3Bpbl9pZHhdLmRldmljZTsKKworCXNucHJpbnRmKGhkbWlfc3RyLCBzaXplb2YoaGRtaV9zdHIpLCAiSERNSS9EUCxwY209JWQiLCBwY21kZXYpOworCisJZXJyID0gc25kX2hkYV9pbnB1dF9qYWNrX2FkZChjb2RlYywgcGVyX3Bpbi0+cGluX25pZCwKKwkJCSAgICAgU05EX0pBQ0tfVklERU9PVVQsIHBjbWRldiA+IDAgPyBoZG1pX3N0ciA6IE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaGRtaV9wcmVzZW50X3NlbnNlKGNvZGVjLCBwZXJfcGluLT5waW5fbmlkLCAmcGVyX3Bpbi0+c2lua19lbGQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGdlbmVyaWNfaGRtaV9idWlsZF9jb250cm9scyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC0xMTcwLDEyICsxMjQwLDI1IEBACiAKIAlmb3IgKHBpbl9pZHggPSAwOyBwaW5faWR4IDwgc3BlYy0+bnVtX3BpbnM7IHBpbl9pZHgrKykgewogCQlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW4gPSAmc3BlYy0+cGluc1twaW5faWR4XTsKKworCQllcnIgPSBnZW5lcmljX2hkbWlfYnVpbGRfamFjayhjb2RlYywgcGluX2lkeCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwogCQllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywKIAkJCQkJCSAgICBwZXJfcGluLT5waW5fbmlkLAogCQkJCQkJICAgIHBlcl9waW4tPm11eF9uaWRzWzBdKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlzbmRfaGRhX3NwZGlmX2N0bHNfdW5hc3NpZ24oY29kZWMsIHBpbl9pZHgpOworCisJCS8qIGFkZCBjb250cm9sIGZvciBFTEQgQnl0ZXMgKi8KKwkJZXJyID0gaGRtaV9jcmVhdGVfZWxkX2N0bChjb2RlYywKKwkJCQkJcGluX2lkeCwKKwkJCQkJc3BlYy0+cGNtX3JlY1twaW5faWR4XS5kZXZpY2UpOworCisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE0OTEsNyArMTU3NCw3IEBACiAJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlpbnQgY2hzOwotCXVuc2lnbmVkIGludCBkYXRhRENDMSwgZGF0YURDQzIsIGNoYW5uZWxfaWQ7CisJdW5zaWduZWQgaW50IGRhdGFEQ0MyLCBjaGFubmVsX2lkOwogCWludCBpOwogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzdHJ1Y3QgaGRhX3NwZGlmX291dCAqc3BkaWYgPQpAQCAtMTUwMSw3ICsxNTg0LDYgQEAKIAogCWNocyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CiAKLQlkYXRhRENDMSA9IEFDX0RJRzFfRU5BQkxFIHwgQUNfRElHMV9DT1BZUklHSFQ7CiAJZGF0YURDQzIgPSAweDI7CiAKIAkvKiB0dXJuIG9mZiBTUERJRiBvbmNlOyBvdGhlcndpc2UgdGhlIElFQzk1OCBiaXRzIHdvbid0IGJlIHVwZGF0ZWQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggN2E3MzYyMS4uMzA4YmI1NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMTE2LDYgKzExNyw4IEBACiAJY29uc3QgaGRhX25pZF90ICpjYXBzcmNfbmlkczsKIAloZGFfbmlkX3QgZGlnX2luX25pZDsJCS8qIGRpZ2l0YWwtaW4gTklEOyBvcHRpb25hbCAqLwogCWhkYV9uaWRfdCBtaXhlcl9uaWQ7CQkvKiBhbmFsb2ctbWl4ZXIgTklEICovCisJREVDTEFSRV9CSVRNQVAodm9sX2N0bHMsIDB4MjAgPDwgMSk7CisJREVDTEFSRV9CSVRNQVAoc3dfY3RscywgMHgyMCA8PCAxKTsKIAogCS8qIGNhcHR1cmUgc2V0dXAgZm9yIGR5bmFtaWMgZHVhbC1hZGMgc3dpdGNoICovCiAJaGRhX25pZF90IGN1cl9hZGM7CkBAIC0xNTksMjMgKzE2MiwyNyBAQAogCXZvaWQgKCpwb3dlcl9ob29rKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAjZW5kaWYKIAl2b2lkICgqc2h1dHVwKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CisJdm9pZCAoKmF1dG9tdXRlX2hvb2spKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIAogCS8qIGZvciBwaW4gc2Vuc2luZyAqLwotCXVuc2lnbmVkIGludCBqYWNrX3ByZXNlbnQ6IDE7CisJdW5zaWduZWQgaW50IGhwX2phY2tfcHJlc2VudDoxOwogCXVuc2lnbmVkIGludCBsaW5lX2phY2tfcHJlc2VudDoxOwogCXVuc2lnbmVkIGludCBtYXN0ZXJfbXV0ZToxOwogCXVuc2lnbmVkIGludCBhdXRvX21pYzoxOwogCXVuc2lnbmVkIGludCBhdXRvX21pY192YWxpZF9pbXV4OjE7CS8qIHZhbGlkIGltdXggZm9yIGF1dG8tbWljICovCi0JdW5zaWduZWQgaW50IGF1dG9tdXRlOjE7CS8qIEhQIGF1dG9tdXRlIGVuYWJsZWQgKi8KLQl1bnNpZ25lZCBpbnQgZGV0ZWN0X2xpbmU6MTsJLyogTGluZS1vdXQgZGV0ZWN0aW9uIGVuYWJsZWQgKi8KLQl1bnNpZ25lZCBpbnQgYXV0b211dGVfbGluZXM6MTsJLyogYXV0b211dGUgbGluZS1vdXQgYXMgd2VsbDsgTk9QIHdoZW4gYXV0b211dGVfaHBfbG8gaXNuJ3Qgc2V0ICovCi0JdW5zaWduZWQgaW50IGF1dG9tdXRlX2hwX2xvOjE7CS8qIGJvdGggSFAgYW5kIExPIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkIGludCBhdXRvbXV0ZV9zcGVha2VyOjE7IC8qIGF1dG9tdXRlIHNwZWFrZXIgb3V0cHV0cyAqLworCXVuc2lnbmVkIGludCBhdXRvbXV0ZV9sbzoxOyAvKiBhdXRvbXV0ZSBMTyBvdXRwdXRzICovCisJdW5zaWduZWQgaW50IGRldGVjdF9ocDoxOwkvKiBIZWFkcGhvbmUgZGV0ZWN0aW9uIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQgZGV0ZWN0X2xvOjE7CS8qIExpbmUtb3V0IGRldGVjdGlvbiBlbmFibGVkICovCisJdW5zaWduZWQgaW50IGF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGU6MTsgLyogdGhlcmUgYXJlIHNwZWFrZXJzIGFuZCBlaXRoZXIgTE8gb3IgSFAgKi8KKwl1bnNpZ25lZCBpbnQgYXV0b211dGVfbG9fcG9zc2libGU6MTsJICAvKiB0aGVyZSBhcmUgbGluZSBvdXRzIGFuZCBIUCAqLwogCiAJLyogb3RoZXIgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgbm9fYW5hbG9nIDoxOyAvKiBkaWdpdGFsIEkvTyBvbmx5ICovCiAJdW5zaWduZWQgaW50IGR5bl9hZGNfc3dpdGNoOjE7IC8qIHN3aXRjaCBBRENzIChmb3IgQUxDMjc1KSAqLwogCXVuc2lnbmVkIGludCBzaW5nbGVfaW5wdXRfc3JjOjE7CiAJdW5zaWduZWQgaW50IHZvbF9pbl9jYXBzcmM6MTsgLyogdXNlIGNhcHNyYyB2b2x1bWUgKEFEQyBoYXMgbm8gdm9sKSAqLworCXVuc2lnbmVkIGludCBwYXJzZV9mbGFnczsgLyogcGFzc2VkIHRvIHNuZF9oZGFfcGFyc2VfcGluX2RlZmNmZygpICovCiAKIAkvKiBhdXRvLW11dGUgY29udHJvbCAqLwogCWludCBhdXRvbXV0ZV9tb2RlOwpAQCAtMTkzLDYgKzIwMCw3IEBACiAJLyogZm9yIFBMTCBmaXggKi8KIAloZGFfbmlkX3QgcGxsX25pZDsKIAl1bnNpZ25lZCBpbnQgcGxsX2NvZWZfaWR4LCBwbGxfY29lZl9iaXQ7CisJdW5zaWduZWQgaW50IGNvZWYwOwogCiAJLyogZml4LXVwIGxpc3QgKi8KIAlpbnQgZml4dXBfaWQ7CkBAIC0yMDIsNiArMjEwLDkgQEAKIAkvKiBtdWx0aS1pbyAqLwogCWludCBtdWx0aV9pb3M7CiAJc3RydWN0IGFsY19tdWx0aV9pbyBtdWx0aV9pb1s0XTsKKworCS8qIGJpbmQgdm9sdW1lcyAqLworCXN0cnVjdCBzbmRfYXJyYXkgYmluZF9jdGxzOwogfTsKIAogI2RlZmluZSBBTENfTU9ERUxfQVVUTwkJMAkvKiBjb21tb24gZm9yIGFsbCBjaGlwcyAqLwpAQCAtMjczLDcgKzI4NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJY29uc3Qgc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXg7CiAJdW5zaWduZWQgaW50IG11eF9pZHg7Ci0JaW50IGksIHR5cGU7CisJaW50IGksIHR5cGUsIG51bV9jb25uczsKIAloZGFfbmlkX3QgbmlkOwogCiAJbXV4X2lkeCA9IGFkY19pZHggPj0gc3BlYy0+bnVtX211eF9kZWZzID8gMCA6IGFkY19pZHg7CkBAIC0yOTYsMTYgKzMwNywxNyBAQAogCQlzcGVjLT5jYXBzcmNfbmlkc1thZGNfaWR4XSA6IHNwZWMtPmFkY19uaWRzW2FkY19pZHhdOwogCiAJLyogbm8gc2VsZWN0aW9uPyAqLwotCWlmIChzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIG5pZCwgTlVMTCkgPD0gMSkKKwludW1fY29ubnMgPSBzbmRfaGRhX2dldF9jb25uX2xpc3QoY29kZWMsIG5pZCwgTlVMTCk7CisJaWYgKG51bV9jb25ucyA8PSAxKQogCQlyZXR1cm4gMTsKIAogCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwogCWlmICh0eXBlID09IEFDX1dJRF9BVURfTUlYKSB7CiAJCS8qIE1hdHJpeC1taXhlciBzdHlsZSAoZS5nLiBBTEM4ODIpICovCi0JCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewotCQkJdW5zaWduZWQgaW50IHYgPSAoaSA9PSBpZHgpID8gMCA6IEhEQV9BTVBfTVVURTsKLQkJCXNuZF9oZGFfY29kZWNfYW1wX3N0ZXJlbyhjb2RlYywgbmlkLCBIREFfSU5QVVQsCi0JCQkJCQkgaW11eC0+aXRlbXNbaV0uaW5kZXgsCisJCWludCBhY3RpdmUgPSBpbXV4LT5pdGVtc1tpZHhdLmluZGV4OworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nvbm5zOyBpKyspIHsKKwkJCXVuc2lnbmVkIGludCB2ID0gKGkgPT0gYWN0aXZlKSA/IDAgOiBIREFfQU1QX01VVEU7CisJCQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIG5pZCwgSERBX0lOUFVULCBpLAogCQkJCQkJIEhEQV9BTVBfTVVURSwgdik7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTI1LDggKzUzNyw4IEBACiAJfQogfQogCi0vKiBUb2dnbGUgaW50ZXJuYWwgc3BlYWtlcnMgbXV0aW5nICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfc3BlYWtlcnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCisvKiBUb2dnbGUgb3V0cHV0cyBtdXRpbmcgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9vdXRwdXRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBvbjsKQEAgLTUzOCwxMCArNTUwLDEwIEBACiAJZG9fYXV0b211dGUoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5ocF9waW5zKSwKIAkJICAgIHNwZWMtPmF1dG9jZmcuaHBfcGlucywgc3BlYy0+bWFzdGVyX211dGUsIHRydWUpOwogCi0JaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwlpZiAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCiAJCW9uID0gMDsKIAllbHNlCi0JCW9uID0gc3BlYy0+amFja19wcmVzZW50IHwgc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQ7CisJCW9uID0gc3BlYy0+aHBfamFja19wcmVzZW50IHwgc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQ7CiAJb24gfD0gc3BlYy0+bWFzdGVyX211dGU7CiAJZG9fYXV0b211dGUoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMpLAogCQkgICAgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMsIG9uLCBmYWxzZSk7CkBAIC01NTEsMjYgKzU2MywzNSBAQAogCWlmIChzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbMF0gPT0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdIHx8CiAJICAgIHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1swXSA9PSBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSkKIAkJcmV0dXJuOwotCWlmICghc3BlYy0+YXV0b211dGUgfHwgKHNwZWMtPmF1dG9tdXRlX2hwX2xvICYmICFzcGVjLT5hdXRvbXV0ZV9saW5lcykpCisJaWYgKCFzcGVjLT5hdXRvbXV0ZV9sbykKIAkJb24gPSAwOwogCWVsc2UKLQkJb24gPSBzcGVjLT5qYWNrX3ByZXNlbnQ7CisJCW9uID0gc3BlYy0+aHBfamFja19wcmVzZW50OwogCW9uIHw9IHNwZWMtPm1hc3Rlcl9tdXRlOwogCWRvX2F1dG9tdXRlKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGlucyksCiAJCSAgICBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnMsIG9uLCBmYWxzZSk7CiB9CiAKK3N0YXRpYyB2b2lkIGNhbGxfdXBkYXRlX291dHB1dHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmF1dG9tdXRlX2hvb2spCisJCXNwZWMtPmF1dG9tdXRlX2hvb2soY29kZWMpOworCWVsc2UKKwkJdXBkYXRlX291dHB1dHMoY29kZWMpOworfQorCiAvKiBzdGFuZGFyZCBIUC1hdXRvbXV0ZSBoZWxwZXIgKi8KIHN0YXRpYyB2b2lkIGFsY19ocF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCXNwZWMtPmphY2tfcHJlc2VudCA9CisJc3BlYy0+aHBfamFja19wcmVzZW50ID0KIAkJZGV0ZWN0X2phY2tzKGNvZGVjLCBBUlJBWV9TSVpFKHNwZWMtPmF1dG9jZmcuaHBfcGlucyksCiAJCQkgICAgIHNwZWMtPmF1dG9jZmcuaHBfcGlucyk7Ci0JaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwlpZiAoIXNwZWMtPmRldGVjdF9ocCB8fCAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgJiYgIXNwZWMtPmF1dG9tdXRlX2xvKSkKIAkJcmV0dXJuOwotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiB9CiAKIC8qIHN0YW5kYXJkIGxpbmUtb3V0LWF1dG9tdXRlIGhlbHBlciAqLwpAQCAtNTg1LDkgKzYwNiw5IEBACiAJc3BlYy0+bGluZV9qYWNrX3ByZXNlbnQgPQogCQlkZXRlY3RfamFja3MoY29kZWMsIEFSUkFZX1NJWkUoc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zKSwKIAkJCSAgICAgc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zKTsKLQlpZiAoIXNwZWMtPmF1dG9tdXRlIHx8ICFzcGVjLT5kZXRlY3RfbGluZSkKKwlpZiAoIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgfHwgIXNwZWMtPmRldGVjdF9sbykKIAkJcmV0dXJuOwotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiB9CiAKICNkZWZpbmUgZ2V0X2Nvbm5lY3Rpb25faW5kZXgoY29kZWMsIG11eCwgbmlkKSBcCkBAIC03ODUsNyArODA2LDcgQEAKIAogCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwogCXVpbmZvLT5jb3VudCA9IDE7Ci0JaWYgKHNwZWMtPmF1dG9tdXRlX2hwX2xvKSB7CisJaWYgKHNwZWMtPmF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGUgJiYgc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUpIHsKIAkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwogCQl0ZXh0cyA9IHRleHRzMzsKIAl9IGVsc2UgewpAQCAtODA0LDEzICs4MjUsMTIgQEAKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWlmICghc3BlYy0+YXV0b211dGUpCi0JCXZhbCA9IDA7Ci0JZWxzZSBpZiAoIXNwZWMtPmF1dG9tdXRlX2hwX2xvIHx8ICFzcGVjLT5hdXRvbXV0ZV9saW5lcykKLQkJdmFsID0gMTsKLQllbHNlCi0JCXZhbCA9IDI7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisJaWYgKHNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCisJCXZhbCsrOworCWlmIChzcGVjLT5hdXRvbXV0ZV9sbykKKwkJdmFsKys7CisKIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdmFsOwogCXJldHVybiAwOwogfQpAQCAtODIzLDI5ICs4NDMsMzYgQEAKIAogCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkgewogCWNhc2UgMDoKLQkJaWYgKCFzcGVjLT5hdXRvbXV0ZSkKKwkJaWYgKCFzcGVjLT5hdXRvbXV0ZV9zcGVha2VyICYmICFzcGVjLT5hdXRvbXV0ZV9sbykKIAkJCXJldHVybiAwOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDA7CisJCXNwZWMtPmF1dG9tdXRlX3NwZWFrZXIgPSAwOworCQlzcGVjLT5hdXRvbXV0ZV9sbyA9IDA7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJaWYgKHNwZWMtPmF1dG9tdXRlICYmCi0JCSAgICAoIXNwZWMtPmF1dG9tdXRlX2hwX2xvIHx8ICFzcGVjLT5hdXRvbXV0ZV9saW5lcykpCi0JCQlyZXR1cm4gMDsKLQkJc3BlYy0+YXV0b211dGUgPSAxOwotCQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IDA7CisJCWlmIChzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlKSB7CisJCQlpZiAoIXNwZWMtPmF1dG9tdXRlX2xvICYmIHNwZWMtPmF1dG9tdXRlX3NwZWFrZXIpCisJCQkJcmV0dXJuIDA7CisJCQlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gMTsKKwkJCXNwZWMtPmF1dG9tdXRlX2xvID0gMDsKKwkJfSBlbHNlIGlmIChzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZSkgeworCQkJaWYgKHNwZWMtPmF1dG9tdXRlX2xvKQorCQkJCXJldHVybiAwOworCQkJc3BlYy0+YXV0b211dGVfbG8gPSAxOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCWlmICghc3BlYy0+YXV0b211dGVfaHBfbG8pCisJCWlmICghc3BlYy0+YXV0b211dGVfbG9fcG9zc2libGUgfHwgIXNwZWMtPmF1dG9tdXRlX3NwZWFrZXJfcG9zc2libGUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHNwZWMtPmF1dG9tdXRlICYmIHNwZWMtPmF1dG9tdXRlX2xpbmVzKQorCQlpZiAoc3BlYy0+YXV0b211dGVfc3BlYWtlciAmJiBzcGVjLT5hdXRvbXV0ZV9sbykKIAkJCXJldHVybiAwOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0JCXNwZWMtPmF1dG9tdXRlX2xpbmVzID0gMTsKKwkJc3BlYy0+YXV0b211dGVfc3BlYWtlciA9IDE7CisJCXNwZWMtPmF1dG9tdXRlX2xvID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXVwZGF0ZV9zcGVha2Vycyhjb2RlYyk7CisJY2FsbF91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTg4Miw3ICs5MDksNyBAQAogICogQ2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBIUC9saW5lLW91dCBhdXRvLW11dGU7CiAgKiBTZXQgdXAgYXBwcm9wcmlhdGVseSBpZiByZWFsbHkgc3VwcG9ydGVkCiAgKi8KLXN0YXRpYyB2b2lkIGFsY19pbml0X2F1dG9faHAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBhbGNfaW5pdF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKQEAgLTg5Nyw4ICs5MjQsNiBAQAogCQlwcmVzZW50Kys7CiAJaWYgKHByZXNlbnQgPCAyKSAvKiBuZWVkIHR3byBkaWZmZXJlbnQgb3V0cHV0IHR5cGVzICovCiAJCXJldHVybjsKLQlpZiAocHJlc2VudCA9PSAzKQotCQlzcGVjLT5hdXRvbXV0ZV9ocF9sbyA9IDE7IC8qIGJvdGggSFAgYW5kIExPIGF1dG9tdXRlICovCiAKIAlpZiAoIWNmZy0+c3BlYWtlcl9waW5zWzBdICYmCiAJICAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgewpAQCAtOTE0LDYgKzkzOSw4IEBACiAJCWNmZy0+aHBfb3V0cyA9IGNmZy0+bGluZV9vdXRzOwogCX0KIAorCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOworCiAJZm9yIChpID0gMDsgaSA8IGNmZy0+aHBfb3V0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBjZmctPmhwX3BpbnNbaV07CiAJCWlmICghaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBuaWQpKQpAQCAtOTIzLDI4ICs5NTAsMzIgQEAKIAkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAogCQkJCSAgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLAogCQkJCSAgQUNfVVNSU1BfRU4gfCBBTENfSFBfRVZFTlQpOwotCQlzcGVjLT5hdXRvbXV0ZSA9IDE7Ci0JCXNwZWMtPmF1dG9tdXRlX21vZGUgPSBBTENfQVVUT01VVEVfUElOOwotCX0KLQlpZiAoc3BlYy0+YXV0b211dGUgJiYgY2ZnLT5saW5lX291dF9waW5zWzBdICYmCi0JICAgIGNmZy0+c3BlYWtlcl9waW5zWzBdICYmCi0JICAgIGNmZy0+bGluZV9vdXRfcGluc1swXSAhPSBjZmctPmhwX3BpbnNbMF0gJiYKLQkgICAgY2ZnLT5saW5lX291dF9waW5zWzBdICE9IGNmZy0+c3BlYWtlcl9waW5zWzBdKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQkJaWYgKCFpc19qYWNrX2RldGVjdGFibGUoY29kZWMsIG5pZCkpCi0JCQkJY29udGludWU7Ci0JCQlzbmRfcHJpbnRkZCgicmVhbHRlazogRW5hYmxlIExpbmUtT3V0IGF1dG8tbXV0aW5nICIKLQkJCQkgICAgIm9uIE5JRCAweCV4XG4iLCBuaWQpOwotCQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCi0JCQkJCUFDX1VTUlNQX0VOIHwgQUxDX0ZST05UX0VWRU5UKTsKLQkJCXNwZWMtPmRldGVjdF9saW5lID0gMTsKLQkJfQotCQlzcGVjLT5hdXRvbXV0ZV9saW5lcyA9IHNwZWMtPmRldGVjdF9saW5lOworCQlzcGVjLT5kZXRlY3RfaHAgPSAxOwogCX0KIAotCWlmIChzcGVjLT5hdXRvbXV0ZSkgeworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fTElORV9PVVQgJiYgY2ZnLT5saW5lX291dHMpIHsKKwkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzKQorCQkJZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKKwkJCQloZGFfbmlkX3QgbmlkID0gY2ZnLT5saW5lX291dF9waW5zW2ldOworCQkJCWlmICghaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBuaWQpKQorCQkJCQljb250aW51ZTsKKwkJCQlzbmRfcHJpbnRkZCgicmVhbHRlazogRW5hYmxlIExpbmUtT3V0ICIKKwkJCQkJICAgICJhdXRvLW11dGluZyBvbiBOSUQgMHgleFxuIiwgbmlkKTsKKwkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCisJCQkJCQlBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsCisJCQkJCQlBQ19VU1JTUF9FTiB8IEFMQ19GUk9OVF9FVkVOVCk7CisJCQkJc3BlYy0+ZGV0ZWN0X2xvID0gMTsKKwkJfQorCQlzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZSA9IHNwZWMtPmRldGVjdF9ocDsKKwl9CisKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlID0gY2ZnLT5zcGVha2VyX291dHMgJiYKKwkJKHNwZWMtPmRldGVjdF9ocCB8fCBzcGVjLT5kZXRlY3RfbG8pOworCisJc3BlYy0+YXV0b211dGVfbG8gPSBzcGVjLT5hdXRvbXV0ZV9sb19wb3NzaWJsZTsKKwlzcGVjLT5hdXRvbXV0ZV9zcGVha2VyID0gc3BlYy0+YXV0b211dGVfc3BlYWtlcl9wb3NzaWJsZTsKKworCWlmIChzcGVjLT5hdXRvbXV0ZV9zcGVha2VyX3Bvc3NpYmxlIHx8IHNwZWMtPmF1dG9tdXRlX2xvX3Bvc3NpYmxlKSB7CiAJCS8qIGNyZWF0ZSBhIGNvbnRyb2wgZm9yIGF1dG9tdXRlIG1vZGUgKi8KIAkJYWxjX2FkZF9hdXRvbXV0ZV9tb2RlX2VudW0oY29kZWMpOwogCQlzcGVjLT51bnNvbF9ldmVudCA9IGFsY19za3VfdW5zb2xfZXZlbnQ7CkBAIC0xMTQ1LDcgKzExNzYsNyBAQAogLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0aWVzIG9mIGF1dG8tbXV0ZSBhbmQgYXV0by1taWMgc3dpdGNoZXMgKi8KIHN0YXRpYyB2b2lkIGFsY19hdXRvX2NoZWNrX3N3aXRjaGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCWFsY19pbml0X2F1dG9faHAoY29kZWMpOworCWFsY19pbml0X2F1dG9tdXRlKGNvZGVjKTsKIAlhbGNfaW5pdF9hdXRvX21pYyhjb2RlYyk7CiB9CiAKQEAgLTE1MjgsNiArMTU1OSwxNSBAQAogCQkJICAgIGNvZWZfdmFsKTsKIH0KIAorLyogYSBzcGVjaWFsIGJ5cGFzcyBmb3IgQ09FRiAwOyByZWFkIHRoZSBjYWNoZWQgdmFsdWUgYXQgdGhlIHNlY29uZCB0aW1lICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFsY19nZXRfY29lZjAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKCFzcGVjLT5jb2VmMCkKKwkJc3BlYy0+Y29lZjAgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCk7CisJcmV0dXJuIHNwZWMtPmNvZWYwOworfQorCiAvKgogICogRGlnaXRhbCBJL08gaGFuZGxpbmcKICAqLwpAQCAtMTU2NiwyNyArMTYwNiwyOSBAQAogc3RhdGljIHZvaWQgYWxjX2F1dG9fcGFyc2VfZGlnaXRhbChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIsIG51bXM7CiAJaGRhX25pZF90IGRpZ19uaWQ7CiAKIAkvKiBzdXBwb3J0IG11bHRpcGxlIFNQRElGczsgdGhlIHNlY29uZGFyeSBpcyBzZXQgdXAgYXMgYSBzbGF2ZSAqLworCW51bXMgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRzOyBpKyspIHsKIAkJaGRhX25pZF90IGNvbm5bNF07CiAJCWVyciA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLAogCQkJCQkgICAgICBzcGVjLT5hdXRvY2ZnLmRpZ19vdXRfcGluc1tpXSwKIAkJCQkJICAgICAgY29ubiwgQVJSQVlfU0laRShjb25uKSk7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoZXJyIDw9IDApCiAJCQljb250aW51ZTsKIAkJZGlnX25pZCA9IGNvbm5bMF07IC8qIGFzc3VtZSB0aGUgZmlyc3QgZWxlbWVudCBpcyBhdWRpby1vdXQgKi8KLQkJaWYgKCFpKSB7CisJCWlmICghbnVtcykgewogCQkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBkaWdfbmlkOwogCQkJc3BlYy0+ZGlnX291dF90eXBlID0gc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3R5cGVbMF07CiAJCX0gZWxzZSB7CiAJCQlzcGVjLT5tdWx0aW91dC5zbGF2ZV9kaWdfb3V0cyA9IHNwZWMtPnNsYXZlX2RpZ19vdXRzOwotCQkJaWYgKGkgPj0gQVJSQVlfU0laRShzcGVjLT5zbGF2ZV9kaWdfb3V0cykgLSAxKQorCQkJaWYgKG51bXMgPj0gQVJSQVlfU0laRShzcGVjLT5zbGF2ZV9kaWdfb3V0cykgLSAxKQogCQkJCWJyZWFrOwotCQkJc3BlYy0+c2xhdmVfZGlnX291dHNbaSAtIDFdID0gZGlnX25pZDsKKwkJCXNwZWMtPnNsYXZlX2RpZ19vdXRzW251bXMgLSAxXSA9IGRpZ19uaWQ7CiAJCX0KKwkJbnVtcysrOwogCX0KIAogCWlmIChzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pIHsKQEAgLTIyMzIsNiArMjI3NCw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOwogCWNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqcDsKKwlib29sIGhhdmVfbXVsdGlfYWRjczsKIAlpbnQgaTsKIAogCWNvZGVjLT5udW1fcGNtcyA9IDE7CkBAIC0yMzEwLDggKzIzNTMsMTEgQEAKIAkvKiBJZiB0aGUgdXNlIG9mIG1vcmUgdGhhbiBvbmUgQURDIGlzIHJlcXVlc3RlZCBmb3IgdGhlIGN1cnJlbnQKIAkgKiBtb2RlbCwgY29uZmlndXJlIGEgc2Vjb25kIGFuYWxvZyBjYXB0dXJlLW9ubHkgUENNLgogCSAqLworCWhhdmVfbXVsdGlfYWRjcyA9IChzcGVjLT5udW1fYWRjX25pZHMgPiAxKSAmJgorCQkhc3BlYy0+ZHluX2FkY19zd2l0Y2ggJiYgIXNwZWMtPmF1dG9fbWljICYmCisJCSghc3BlYy0+aW5wdXRfbXV4IHx8IHNwZWMtPmlucHV0X211eC0+bnVtX2l0ZW1zID4gMSk7CiAJLyogQWRkaXRpb25hbCBBbmFsYW9nIGNhcHR1cmUgZm9yIGluZGV4ICMyICovCi0JaWYgKHNwZWMtPmFsdF9kYWNfbmlkIHx8IHNwZWMtPm51bV9hZGNfbmlkcyA+IDEpIHsKKwlpZiAoc3BlYy0+YWx0X2RhY19uaWQgfHwgaGF2ZV9tdWx0aV9hZGNzKSB7CiAJCWNvZGVjLT5udW1fcGNtcyA9IDM7CiAJCWluZm8gPSBzcGVjLT5wY21fcmVjICsgMjsKIAkJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKQEAgLTIzMjcsNyArMjM3Myw3IEBACiAJCQkJYWxjX3BjbV9udWxsX3N0cmVhbTsKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSAwOwogCQl9Ci0JCWlmIChzcGVjLT5udW1fYWRjX25pZHMgPiAxKSB7CisJCWlmIChoYXZlX211bHRpX2FkY3MpIHsKIAkJCXAgPSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlOwogCQkJaWYgKCFwKQogCQkJCXAgPSAmYWxjX3BjbV9hbmFsb2dfYWx0X2NhcHR1cmU7CkBAIC0yMzY4LDYgKzI0MTQsMTggQEAKIAlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+a2N0bHMpOwogfQogCitzdGF0aWMgdm9pZCBhbGNfZnJlZV9iaW5kX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKHNwZWMtPmJpbmRfY3Rscy5saXN0KSB7CisJCXN0cnVjdCBoZGFfYmluZF9jdGxzICoqY3RsID0gc3BlYy0+YmluZF9jdGxzLmxpc3Q7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YmluZF9jdGxzLnVzZWQ7IGkrKykKKwkJCWtmcmVlKGN0bFtpXSk7CisJfQorCXNuZF9hcnJheV9mcmVlKCZzcGVjLT5iaW5kX2N0bHMpOworfQorCiBzdGF0aWMgdm9pZCBhbGNfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTIzNzgsNiArMjQzNiw3IEBACiAJYWxjX3NodXR1cChjb2RlYyk7CiAJc25kX2hkYV9pbnB1dF9qYWNrX2ZyZWUoY29kZWMpOwogCWFsY19mcmVlX2tjdGxzKGNvZGVjKTsKKwlhbGNfZnJlZV9iaW5kX2N0bHMoY29kZWMpOwogCWtmcmVlKHNwZWMpOwogCXNuZF9oZGFfZGV0YWNoX2JlZXBfZGV2aWNlKGNvZGVjKTsKIH0KQEAgLTI0NDEsNiArMjUwMCw0NyBAQAogfQogCiAvKgorICogUmVuYW1lIGNvZGVjcyBhcHByb3ByaWF0ZWx5IGZyb20gQ09FRiB2YWx1ZQorICovCitzdHJ1Y3QgYWxjX2NvZGVjX3JlbmFtZV90YWJsZSB7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBjb2VmX21hc2s7CisJdW5zaWduZWQgc2hvcnQgY29lZl9iaXRzOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGFsY19jb2RlY19yZW5hbWVfdGFibGUgcmVuYW1lX3RibFtdID0geworCXsgMHgxMGVjMDI2OSwgMHhmZmYwLCAweDMwMTAsICJBTEMyNzciIH0sCisJeyAweDEwZWMwMjY5LCAweGYwZjAsIDB4MjAxMCwgIkFMQzI1OSIgfSwKKwl7IDB4MTBlYzAyNjksIDB4ZjBmMCwgMHgzMDEwLCAiQUxDMjU4IiB9LAorCXsgMHgxMGVjMDI2OSwgMHgwMGYwLCAweDAwMTAsICJBTEMyNjlWQiIgfSwKKwl7IDB4MTBlYzAyNjksIDB4ZmZmZiwgMHhhMDIzLCAiQUxDMjU5IiB9LAorCXsgMHgxMGVjMDI2OSwgMHhmZmZmLCAweDYwMjMsICJBTEMyODFYIiB9LAorCXsgMHgxMGVjMDI2OSwgMHgwMGYwLCAweDAwMjAsICJBTEMyNjlWQyIgfSwKKwl7IDB4MTBlYzA4ODcsIDB4MDBmMCwgMHgwMDMwLCAiQUxDODg3LVZEIiB9LAorCXsgMHgxMGVjMDg4OCwgMHgwMGYwLCAweDAwMzAsICJBTEM4ODgtVkQiIH0sCisJeyAweDEwZWMwODg4LCAweGYwZjAsIDB4MzAyMCwgIkFMQzg4NiIgfSwKKwl7IDB4MTBlYzA4OTksIDB4MjAwMCwgMHgyMDAwLCAiQUxDODk5IiB9LAorCXsgMHgxMGVjMDg5MiwgMHhmZmZmLCAweDgwMjAsICJBTEM2NjEiIH0sCisJeyAweDEwZWMwODkyLCAweGZmZmYsIDB4ODAxMSwgIkFMQzY2MSIgfSwKKwl7IDB4MTBlYzA4OTIsIDB4ZmZmZiwgMHg0MDExLCAiQUxDNjU2IiB9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgaW50IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJY29uc3Qgc3RydWN0IGFsY19jb2RlY19yZW5hbWVfdGFibGUgKnA7CisKKwlmb3IgKHAgPSByZW5hbWVfdGJsOyBwLT52ZW5kb3JfaWQ7IHArKykgeworCQlpZiAocC0+dmVuZG9yX2lkICE9IGNvZGVjLT52ZW5kb3JfaWQpCisJCQljb250aW51ZTsKKwkJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIHAtPmNvZWZfbWFzaykgPT0gcC0+Y29lZl9iaXRzKQorCQkJcmV0dXJuIGFsY19jb2RlY19yZW5hbWUoY29kZWMsIHAtPm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIEF1dG9tYXRpYyBwYXJzZSBvZiBJL08gcGlucyBmcm9tIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24KICAqLwogCkBAIC0yNDQ4LDExICsyNTQ4LDE1IEBACiAJQUxDX0NUTF9XSURHRVRfVk9MLAogCUFMQ19DVExfV0lER0VUX01VVEUsCiAJQUxDX0NUTF9CSU5EX01VVEUsCisJQUxDX0NUTF9CSU5EX1ZPTCwKKwlBTENfQ1RMX0JJTkRfU1csCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsY19jb250cm9sX3RlbXBsYXRlc1tdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0NPREVDX01VVEUoTlVMTCwgMCwgMCwgMCksCiAJSERBX0JJTkRfTVVURShOVUxMLCAwLCAwLCAwKSwKKwlIREFfQklORF9WT0woTlVMTCwgMCksCisJSERBX0JJTkRfU1coTlVMTCwgMCksCiB9OwogCiAvKiBhZGQgZHluYW1pYyBjb250cm9scyAqLwpAQCAtMjQ5MywxMyArMjU5NywxNCBAQAogI2RlZmluZSBfX2FkZF9wYl9zd19jdHJsKHNwZWMsIHR5cGUsIHBmeCwgY2lkeCwgdmFsKQkJCVwKIAlhZGRfY29udHJvbF93aXRoX3BmeChzcGVjLCB0eXBlLCBwZngsICJQbGF5YmFjayIsICJTd2l0Y2giLCBjaWR4LCB2YWwpCiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2hhbm5lbF9uYW1lWzRdID0geworCSJGcm9udCIsICJTdXJyb3VuZCIsICJDTEZFIiwgIlNpZGUiCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqYWxjX2dldF9saW5lX291dF9wZngoc3RydWN0IGFsY19zcGVjICpzcGVjLCBpbnQgY2gsCiAJCQkJCWJvb2wgY2FuX2JlX21hc3RlciwgaW50ICppbmRleCkKIHsKIAlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNobmFtZVs0XSA9IHsKLQkJIkZyb250IiwgIlN1cnJvdW5kIiwgTlVMTCAvKkNMRkUqLywgIlNpZGUiCi0JfTsKIAogCSppbmRleCA9IDA7CiAJaWYgKGNmZy0+bGluZV9vdXRzID09IDEgJiYgIXNwZWMtPm11bHRpX2lvcyAmJgpAQCAtMjUyMiw3ICsyNjI3LDEwIEBACiAJCQlyZXR1cm4gIlBDTSI7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gY2huYW1lW2NoXTsKKwlpZiAoc25kX0JVR19PTihjaCA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfbmFtZSkpKQorCQlyZXR1cm4gIlBDTSI7CisKKwlyZXR1cm4gY2hhbm5lbF9uYW1lW2NoXTsKIH0KIAogLyogY3JlYXRlIGlucHV0IHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIHRoZSBnaXZlbiBwaW4gKi8KQEAgLTI1NTcsNyArMjY2NSw2IEBACiAJaGRhX25pZF90ICphZGNfbmlkcyA9IHNwZWMtPnByaXZhdGVfYWRjX25pZHM7CiAJaGRhX25pZF90ICpjYXBfbmlkcyA9IHNwZWMtPnByaXZhdGVfY2Fwc3JjX25pZHM7CiAJaW50IG1heF9udW1zID0gQVJSQVlfU0laRShzcGVjLT5wcml2YXRlX2FkY19uaWRzKTsKLQlib29sIGluZGVwX2NhcHNyYyA9IGZhbHNlOwogCWludCBpLCBudW1zID0gMDsKIAogCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7CkBAIC0yNTc5LDEzICsyNjg2LDExIEBACiAJCQkJYnJlYWs7CiAJCQlpZiAodHlwZSA9PSBBQ19XSURfQVVEX1NFTCkgewogCQkJCWNhcF9uaWRzW251bXNdID0gc3JjOwotCQkJCWluZGVwX2NhcHNyYyA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQluID0gc25kX2hkYV9nZXRfY29ubl9saXN0KGNvZGVjLCBzcmMsICZsaXN0KTsKIAkJCWlmIChuID4gMSkgewogCQkJCWNhcF9uaWRzW251bXNdID0gc3JjOwotCQkJCWluZGVwX2NhcHNyYyA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYgKG4gIT0gMSkKIAkJCQlicmVhazsKQEAgLTI3ODYsOCArMjg5MSw5IEBACiAJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzLAogCQkJCSAgICAgIHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoc3BlYy0+bXVsdGlvdXQuaHBfbmlkID09IG5pZCkKLQkJCWNvbnRpbnVlOworCQlpZiAoZm91bmRfaW5fbmlkX2xpc3QobmlkLCBzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkLAorCQkJCSAgICAgIEFSUkFZX1NJWkUoc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZCkpKQorCQkgICAgY29udGludWU7CiAJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWQsCiAJCQkJICAgICAgQVJSQVlfU0laRShzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkKSkpCiAJCSAgICBjb250aW51ZTsKQEAgLTI4MDQsNiArMjkxMCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9vdXRzLAorCQkJCSAgICBjb25zdCBoZGFfbmlkX3QgKnBpbnMsIGhkYV9uaWRfdCAqZGFjcykKK3sKKwlpbnQgaTsKKworCWlmIChudW1fb3V0cyAmJiAhZGFjc1swXSkgeworCQlkYWNzWzBdID0gYWxjX2F1dG9fbG9va19mb3JfZGFjKGNvZGVjLCBwaW5zWzBdKTsKKwkJaWYgKCFkYWNzWzBdKQorCQkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMTsgaSA8IG51bV9vdXRzOyBpKyspCisJCWRhY3NbaV0gPSBnZXRfZGFjX2lmX3NpbmdsZShjb2RlYywgcGluc1tpXSk7CisJZm9yIChpID0gMTsgaSA8IG51bV9vdXRzOyBpKyspIHsKKwkJaWYgKCFkYWNzW2ldKQorCQkJZGFjc1tpXSA9IGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgcGluc1tpXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfbXVsdGlfaW9zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCBsb2NhdGlvbik7CisKIC8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwogc3RhdGljIGludCBhbGNfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewpAQCAtMjgxNSw3ICsyOTQ0LDcgQEAKICBhZ2FpbjoKIAkvKiBzZXQgbnVtX2RhY3Mgb25jZSB0byBmdWxsIGZvciBhbGNfYXV0b19sb29rX2Zvcl9kYWMoKSAqLwogCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0Jc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMDsKKwlzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkWzBdID0gMDsKIAlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0gMDsKIAltZW1zZXQoc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcywgMCwgc2l6ZW9mKHNwZWMtPnByaXZhdGVfZGFjX25pZHMpKTsKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPnByaXZhdGVfZGFjX25pZHM7CkBAIC0yODI2LDcgKzI5NTUsNyBAQAogCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1tpXSA9CiAJCQkJZ2V0X2RhY19pZl9zaW5nbGUoY29kZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSk7CiAJCWlmIChjZmctPmhwX291dHMpCi0JCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPQorCQkJc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZFswXSA9CiAJCQkJZ2V0X2RhY19pZl9zaW5nbGUoY29kZWMsIGNmZy0+aHBfcGluc1swXSk7CiAJCWlmIChjZmctPnNwZWFrZXJfb3V0cykKIAkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPQpAQCAtMjg1OCwyNCArMjk4Nyw1OCBAQAogCQkJCXNpemVvZihoZGFfbmlkX3QpICogKGNmZy0+bGluZV9vdXRzIC0gaSAtIDEpKTsKIAl9CiAKLQlpZiAoY2ZnLT5ocF9vdXRzICYmICFzcGVjLT5tdWx0aW91dC5ocF9uaWQpCi0JCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9Ci0JCQlhbGNfYXV0b19sb29rX2Zvcl9kYWMoY29kZWMsIGNmZy0+aHBfcGluc1swXSk7Ci0JaWYgKGNmZy0+c3BlYWtlcl9vdXRzICYmICFzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdKQotCQlzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkWzBdID0KLQkJCWFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgY2ZnLT5zcGVha2VyX3BpbnNbMF0pOworCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxICYmIGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgeworCQkvKiB0cnkgdG8gZmlsbCBtdWx0aS1pbyBmaXJzdCAqLworCQl1bnNpZ25lZCBpbnQgbG9jYXRpb24sIGRlZmNmZzsKKwkJaW50IG51bV9waW5zOworCisJCWRlZmNmZyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgY2ZnLT5saW5lX291dF9waW5zWzBdKTsKKwkJbG9jYXRpb24gPSBnZXRfZGVmY2ZnX2xvY2F0aW9uKGRlZmNmZyk7CisKKwkJbnVtX3BpbnMgPSBhbGNfYXV0b19maWxsX211bHRpX2lvcyhjb2RlYywgbG9jYXRpb24pOworCQlpZiAobnVtX3BpbnMgPiAwKSB7CisJCQlzcGVjLT5tdWx0aV9pb3MgPSBudW1fcGluczsKKwkJCXNwZWMtPmV4dF9jaGFubmVsX2NvdW50ID0gMjsKKwkJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gbnVtX3BpbnMgKyAxOworCQl9CisJfQorCisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9IUF9PVVQpCisJCWFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhjb2RlYywgY2ZnLT5ocF9vdXRzLCBjZmctPmhwX3BpbnMsCisJCQkJIHNwZWMtPm11bHRpb3V0LmhwX291dF9uaWQpOworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCisJCWFsY19hdXRvX2ZpbGxfZXh0cmFfZGFjcyhjb2RlYywgY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zLAorCQkJCSBzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3RsX3Bvcyh1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwloZGFfbmlkX3QgbmlkID0gZ2V0X2FtcF9uaWRfKGRhdGEpOworCXVuc2lnbmVkIGludCBkaXIgPSBnZXRfYW1wX2RpcmVjdGlvbl8oZGF0YSk7CisJcmV0dXJuIChuaWQgPDwgMSkgfCBkaXI7Cit9CisKKyNkZWZpbmUgaXNfY3RsX3VzZWQoYml0cywgZGF0YSkgXAorCXRlc3RfYml0KGdldF9jdGxfcG9zKGRhdGEpLCBiaXRzKQorI2RlZmluZSBtYXJrX2N0bF91c2FnZShiaXRzLCBkYXRhKSBcCisJc2V0X2JpdChnZXRfY3RsX3BvcyhkYXRhKSwgYml0cykKKwogc3RhdGljIGludCBhbGNfYXV0b19hZGRfdm9sX2N0bChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCSAgICAgIGNvbnN0IGNoYXIgKnBmeCwgaW50IGNpZHgsCiAJCQkgICAgICBoZGFfbmlkX3QgbmlkLCB1bnNpZ25lZCBpbnQgY2hzKQogeworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXVuc2lnbmVkIGludCB2YWw7CiAJaWYgKCFuaWQpCiAJCXJldHVybiAwOworCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDAsIEhEQV9PVVRQVVQpOworCWlmIChpc19jdGxfdXNlZChzcGVjLT52b2xfY3RscywgdmFsKSAmJiBjaHMgIT0gMikgLyogZXhjbHVkZSBMRkUgKi8KKwkJcmV0dXJuIDA7CisJbWFya19jdGxfdXNhZ2Uoc3BlYy0+dm9sX2N0bHMsIHZhbCk7CiAJcmV0dXJuIF9fYWRkX3BiX3ZvbF9jdHJsKGNvZGVjLT5zcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIHBmeCwgY2lkeCwKLQkJCQkgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIGNocywgMCwgSERBX09VVFBVVCkpOworCQkJCSB2YWwpOwogfQogCiAjZGVmaW5lIGFsY19hdXRvX2FkZF9zdGVyZW9fdm9sKGNvZGVjLCBwZngsIGNpZHgsIG5pZCkJXApAQCAtMjg4OCw2ICszMDUxLDcgQEAKIAkJCSAgICAgY29uc3QgY2hhciAqcGZ4LCBpbnQgY2lkeCwKIAkJCSAgICAgaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKIHsKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgd2lkX3R5cGU7CiAJaW50IHR5cGU7CiAJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yOTA0LDYgKzMwNjgsOSBAQAogCQl0eXBlID0gQUxDX0NUTF9CSU5EX01VVEU7CiAJCXZhbCA9IEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCBjaHMsIDIsIEhEQV9JTlBVVCk7CiAJfQorCWlmIChpc19jdGxfdXNlZChzcGVjLT5zd19jdGxzLCB2YWwpICYmIGNocyAhPSAyKSAvKiBleGNsdWRlIExGRSAqLworCQlyZXR1cm4gMDsKKwltYXJrX2N0bF91c2FnZShzcGVjLT5zd19jdGxzLCB2YWwpOwogCXJldHVybiBfX2FkZF9wYl9zd19jdHJsKGNvZGVjLT5zcGVjLCB0eXBlLCBwZngsIGNpZHgsIHZhbCk7CiB9CiAKQEAgLTI5NjQsNyArMzEzMSw3IEBACiAJCXN3ID0gYWxjX2xvb2tfZm9yX291dF9tdXRlX25pZChjb2RlYywgcGluLCBkYWMpOwogCQl2b2wgPSBhbGNfbG9va19mb3Jfb3V0X3ZvbF9uaWQoY29kZWMsIHBpbiwgZGFjKTsKIAkJbmFtZSA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KHNwZWMsIGksIHRydWUsICZpbmRleCk7Ci0JCWlmICghbmFtZSkgeworCQlpZiAoIW5hbWUgfHwgIXN0cmNtcChuYW1lLCAiQ0xGRSIpKSB7CiAJCQkvKiBDZW50ZXIvTEZFICovCiAJCQllcnIgPSBhbGNfYXV0b19hZGRfdm9sX2N0bChjb2RlYywgIkNlbnRlciIsIDAsIHZvbCwgMSk7CiAJCQlpZiAoZXJyIDwgMCkKQEAgLTI5OTAsMjMgKzMxNTcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZvciBzcGVha2VyIGFuZCBIUCBvdXRwdXRzICovCiBzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4sCi0JCQkJCWhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCkKKwkJCQkgICAgIGhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCkKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAloZGFfbmlkX3Qgc3csIHZvbDsKIAlpbnQgZXJyOwogCi0JaWYgKCFwaW4pCi0JCXJldHVybiAwOwogCWlmICghZGFjKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CiAJCS8qIHRoZSBjb3JyZXNwb25kaW5nIERBQyBpcyBhbHJlYWR5IG9jY3VwaWVkICovCiAJCWlmICghKGdldF93Y2Fwcyhjb2RlYywgcGluKSAmIEFDX1dDQVBfT1VUX0FNUCkpCiAJCQlyZXR1cm4gMDsgLyogbm8gd2F5ICovCiAJCS8qIGNyZWF0ZSBhIHN3aXRjaCBvbmx5ICovCi0JCXJldHVybiBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBwZngsCi0JCQkJICAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJdmFsID0gSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpOworCQlpZiAoaXNfY3RsX3VzZWQoc3BlYy0+c3dfY3RscywgdmFsKSkKKwkJCXJldHVybiAwOyAvKiBhbHJlYWR5IGNyZWF0ZWQgKi8KKwkJbWFya19jdGxfdXNhZ2Uoc3BlYy0+c3dfY3RscywgdmFsKTsKKwkJcmV0dXJuIGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwgdmFsKTsKIAl9CiAKIAlzdyA9IGFsY19sb29rX2Zvcl9vdXRfbXV0ZV9uaWQoY29kZWMsIHBpbiwgZGFjKTsKQEAgLTMwMjAsMjAgKzMxODgsMTEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqbmV3X2JpbmRfY3RsKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgIHVuc2lnbmVkIGludCBudW1zLAorCQkJCQkgIHN0cnVjdCBoZGFfY3RsX29wcyAqb3BzKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfYmluZF9jdGxzICoqY3RscCwgKmN0bDsKKwlzbmRfYXJyYXlfaW5pdCgmc3BlYy0+YmluZF9jdGxzLCBzaXplb2YoY3RsKSwgOCk7CisJY3RscCA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPmJpbmRfY3Rscyk7CisJaWYgKCFjdGxwKQorCQlyZXR1cm4gTlVMTDsKKwljdGwgPSBremFsbG9jKHNpemVvZigqY3RsKSArIHNpemVvZihsb25nKSAqIChudW1zICsgMSksIEdGUF9LRVJORUwpOworCSpjdGxwID0gY3RsOworCWlmIChjdGwpCisJCWN0bC0+b3BzID0gb3BzOworCXJldHVybiBjdGw7Cit9CisKKy8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmb3Igc3BlYWtlciBhbmQgSFAgb3V0cHV0cyAqLworc3RhdGljIGludCBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9waW5zLAorCQkJCSAgICAgIGNvbnN0IGhkYV9uaWRfdCAqcGlucywKKwkJCQkgICAgICBjb25zdCBoZGFfbmlkX3QgKmRhY3MsCisJCQkJICAgICAgY29uc3QgY2hhciAqcGZ4KQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBoZGFfYmluZF9jdGxzICpjdGw7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgaSwgbiwgZXJyOworCisJaWYgKCFudW1fcGlucyB8fCAhcGluc1swXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobnVtX3BpbnMgPT0gMSkgeworCQloZGFfbmlkX3QgZGFjID0gKmRhY3M7CisJCWlmICghZGFjKQorCQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07CisJCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLCAqcGlucywgZGFjLCBwZngpOworCX0KKworCWlmIChkYWNzW251bV9waW5zIC0gMV0pIHsKKwkJLyogT0ssIHdlIGhhdmUgYSBtdWx0aS1vdXRwdXQgc3lzdGVtIHdpdGggaW5kaXZpZHVhbCB2b2x1bWVzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyAlcyIsCisJCQkJIHBmeCwgY2hhbm5lbF9uYW1lW2ldKTsKKwkJCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHBpbnNbaV0sIGRhY3NbaV0sCisJCQkJCQkJbmFtZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIExldCdzIGNyZWF0ZSBhIGJpbmQtY29udHJvbHMgKi8KKwljdGwgPSBuZXdfYmluZF9jdGwoY29kZWMsIG51bV9waW5zLCAmc25kX2hkYV9iaW5kX3N3KTsKKwlpZiAoIWN0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKKwkJaWYgKGdldF93Y2Fwcyhjb2RlYywgcGluc1tpXSkgJiBBQ19XQ0FQX09VVF9BTVApCisJCQljdGwtPnZhbHVlc1tuKytdID0KKwkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKHBpbnNbaV0sIDMsIDAsIEhEQV9PVVRQVVQpOworCX0KKwlpZiAobikgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOworCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfU1csIG5hbWUsIDAsIChsb25nKWN0bCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwljdGwgPSBuZXdfYmluZF9jdGwoY29kZWMsIG51bV9waW5zLCAmc25kX2hkYV9iaW5kX3ZvbCk7CisJaWYgKCFjdGwpCisJCXJldHVybiAtRU5PTUVNOworCW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCWhkYV9uaWRfdCB2b2w7CisJCWlmICghcGluc1tpXSB8fCAhZGFjc1tpXSkKKwkJCWNvbnRpbnVlOworCQl2b2wgPSBhbGNfbG9va19mb3Jfb3V0X3ZvbF9uaWQoY29kZWMsIHBpbnNbaV0sIGRhY3NbaV0pOworCQlpZiAodm9sKQorCQkJY3RsLT52YWx1ZXNbbisrXSA9CisJCQkJSERBX0NPTVBPU0VfQU1QX1ZBTCh2b2wsIDMsIDAsIEhEQV9PVVRQVVQpOworCX0KKwlpZiAobikgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfVk9MLCBuYW1lLCAwLCAobG9uZyljdGwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFsY19hdXRvX2NyZWF0ZV9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKLQkJCQkJIHNwZWMtPm11bHRpb3V0LmhwX25pZCwKLQkJCQkJICJIZWFkcGhvbmUiKTsKKwlyZXR1cm4gYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dHMoY29kZWMsIHNwZWMtPmF1dG9jZmcuaHBfb3V0cywKKwkJCQkJICBzcGVjLT5hdXRvY2ZnLmhwX3BpbnMsCisJCQkJCSAgc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZCwKKwkJCQkJICAiSGVhZHBob25lIik7CiB9CiAKIHN0YXRpYyBpbnQgYWxjX2F1dG9fY3JlYXRlX3NwZWFrZXJfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLCBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0sCi0JCQkJCSAiU3BlYWtlciIpOworCXJldHVybiBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0cyhjb2RlYywgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHMsCisJCQkJCSAgc3BlYy0+YXV0b2NmZy5zcGVha2VyX3BpbnMsCisJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZCwKKwkJCQkJICAiU3BlYWtlciIpOwogfQogCiBzdGF0aWMgdm9pZCBhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0zMDcxLDYgKzMzMzEsMTIgQEAKIAlpZiAobmlkKQogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJCQkJICAgIEFNUF9PVVRfWkVSTyk7CisKKwkvKiB1bm11dGUgREFDIGlmIGl0J3Mgbm90IGFzc2lnbmVkIHRvIGEgbWl4ZXIgKi8KKwluaWQgPSBhbGNfbG9va19mb3Jfb3V0X211dGVfbmlkKGNvZGVjLCBwaW4sIGRhYyk7CisJaWYgKG5pZCA9PSBtaXggJiYgbmlkX2hhc19tdXRlKGNvZGVjLCBkYWMsIEhEQV9PVVRQVVQpKQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBkYWMsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIEFNUF9PVVRfWkVSTyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsY19hdXRvX2luaXRfbXVsdGlfb3V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMzA5MCwyMCArMzM1NiwzNyBAQAogc3RhdGljIHZvaWQgYWxjX2F1dG9faW5pdF9leHRyYV9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IGk7CiAJaGRhX25pZF90IHBpbiwgZGFjOwogCi0JcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwotCWlmIChwaW4pIHsKLQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuaHBfbmlkOwotCQlpZiAoIWRhYykKLQkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmhwX291dHM7IGkrKykgeworCQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlID09IEFVVE9fUElOX0hQX09VVCkKKwkJCWJyZWFrOworCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbaV07CisJCWlmICghcGluKQorCQkJYnJlYWs7CisJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmhwX291dF9uaWRbaV07CisJCWlmICghZGFjKSB7CisJCQlpZiAoaSA+IDAgJiYgc3BlYy0+bXVsdGlvdXQuaHBfb3V0X25pZFswXSkKKwkJCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkWzBdOworCQkJZWxzZQorCQkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCQl9CiAJCWFsY19hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgcGluLCBQSU5fSFAsIGRhYyk7CiAJfQotCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwotCWlmIChwaW4pIHsKLQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXTsKLQkJaWYgKCFkYWMpCi0JCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5zcGVha2VyX291dHM7IGkrKykgeworCQlpZiAoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUKQorCQkJYnJlYWs7CisJCXBpbiA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zW2ldOworCQlpZiAoIXBpbikKKwkJCWJyZWFrOworCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5leHRyYV9vdXRfbmlkW2ldOworCQlpZiAoIWRhYykgeworCQkJaWYgKGkgPiAwICYmIHNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0pCisJCQkJZGFjID0gc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXTsKKwkJCWVsc2UKKwkJCQlkYWMgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwkJfQogCQlhbGNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX09VVCwgZGFjKTsKIAl9CiB9CkBAIC0zMTE2LDYgKzMzOTksNyBAQAogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWhkYV9uaWRfdCBwcmltZV9kYWMgPSBzcGVjLT5wcml2YXRlX2RhY19uaWRzWzBdOwogCWludCB0eXBlLCBpLCBudW1fcGlucyA9IDA7CiAKIAlmb3IgKHR5cGUgPSBBVVRPX1BJTl9MSU5FX0lOOyB0eXBlID49IEFVVE9fUElOX01JQzsgdHlwZS0tKSB7CkBAIC0zMTQzLDggKzM0MjcsMTMgQEAKIAkJfQogCX0KIAlzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA9IDE7Ci0JaWYgKG51bV9waW5zIDwgMikKKwlpZiAobnVtX3BpbnMgPCAyKSB7CisJCS8qIGNsZWFyIHVwIGFnYWluICovCisJCW1lbXNldChzcGVjLT5wcml2YXRlX2RhY19uaWRzLCAwLAorCQkgICAgICAgc2l6ZW9mKHNwZWMtPnByaXZhdGVfZGFjX25pZHMpKTsKKwkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkc1swXSA9IHByaW1lX2RhYzsKIAkJcmV0dXJuIDA7CisJfQogCXJldHVybiBudW1fcGluczsKIH0KIApAQCAtMzIzMCwzNiArMzUxOSwxMSBAQAogCS5wdXQgPSBhbGNfYXV0b19jaF9tb2RlX3B1dCwKIH07CiAKLXN0YXRpYyBpbnQgYWxjX2F1dG9fYWRkX211bHRpX2NoYW5uZWxfbW9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQkJICAgaW50ICgqZmlsbF9kYWMpKHN0cnVjdCBoZGFfY29kZWMgKikpCitzdGF0aWMgaW50IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7Ci0JdW5zaWduZWQgaW50IGxvY2F0aW9uLCBkZWZjZmc7Ci0JaW50IG51bV9waW5zOwogCi0JaWYgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCAmJiBjZmctPmhwX291dHMgPT0gMSkgewotCQkvKiB1c2UgSFAgYXMgcHJpbWFyeSBvdXQgKi8KLQkJY2ZnLT5zcGVha2VyX291dHMgPSBjZmctPmxpbmVfb3V0czsKLQkJbWVtY3B5KGNmZy0+c3BlYWtlcl9waW5zLCBjZmctPmxpbmVfb3V0X3BpbnMsCi0JCSAgICAgICBzaXplb2YoY2ZnLT5zcGVha2VyX3BpbnMpKTsKLQkJY2ZnLT5saW5lX291dHMgPSBjZmctPmhwX291dHM7Ci0JCW1lbWNweShjZmctPmxpbmVfb3V0X3BpbnMsIGNmZy0+aHBfcGlucywgc2l6ZW9mKGNmZy0+aHBfcGlucykpOwotCQljZmctPmhwX291dHMgPSAwOwotCQltZW1zZXQoY2ZnLT5ocF9waW5zLCAwLCBzaXplb2YoY2ZnLT5ocF9waW5zKSk7Ci0JCWNmZy0+bGluZV9vdXRfdHlwZSA9IEFVVE9fUElOX0hQX09VVDsKLQkJaWYgKGZpbGxfZGFjKQotCQkJZmlsbF9kYWMoY29kZWMpOwotCX0KLQlpZiAoY2ZnLT5saW5lX291dHMgIT0gMSB8fAotCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCi0JCXJldHVybiAwOwotCi0JZGVmY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbMF0pOwotCWxvY2F0aW9uID0gZ2V0X2RlZmNmZ19sb2NhdGlvbihkZWZjZmcpOwotCi0JbnVtX3BpbnMgPSBhbGNfYXV0b19maWxsX211bHRpX2lvcyhjb2RlYywgbG9jYXRpb24pOwotCWlmIChudW1fcGlucyA+IDApIHsKKwlpZiAoc3BlYy0+bXVsdGlfaW9zID4gMCkgewogCQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKIAogCQlrbmV3ID0gYWxjX2tjb250cm9sX25ldyhzcGVjKTsKQEAgLTMyNjksMTAgKzM1MzMsNiBAQAogCQlrbmV3LT5uYW1lID0ga3N0cmR1cCgiQ2hhbm5lbCBNb2RlIiwgR0ZQX0tFUk5FTCk7CiAJCWlmICgha25ldy0+bmFtZSkKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCXNwZWMtPm11bHRpX2lvcyA9IG51bV9waW5zOwotCQlzcGVjLT5leHRfY2hhbm5lbF9jb3VudCA9IDI7Ci0JCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gbnVtX3BpbnMgKyAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM1NTUsMjcgKzM4MTUsNDIgQEAKIAkJCQkgY29uc3QgaGRhX25pZF90ICpzc2lkX25pZHMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnID0gJnNwZWMtPmF1dG9jZmc7CiAJaW50IGVycjsKIAotCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAotCQkJCQkgICBpZ25vcmVfbmlkcyk7CisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmY2ZnKGNvZGVjLCBjZmcsIGlnbm9yZV9uaWRzLAorCQkJCSAgICAgICBzcGVjLT5wYXJzZV9mbGFncyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykgewotCQlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cyB8fCBzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW4pIHsKKwlpZiAoIWNmZy0+bGluZV9vdXRzKSB7CisJCWlmIChjZmctPmRpZ19vdXRzIHx8IGNmZy0+ZGlnX2luX3BpbikgewogCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gMjsKIAkJCXNwZWMtPm5vX2FuYWxvZyA9IDE7CiAJCQlnb3RvIGRpZ19vbmx5OwogCQl9CiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwogCX0KKworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQgJiYKKwkgICAgY2ZnLT5saW5lX291dHMgPD0gY2ZnLT5ocF9vdXRzKSB7CisJCS8qIHVzZSBIUCBhcyBwcmltYXJ5IG91dCAqLworCQljZmctPnNwZWFrZXJfb3V0cyA9IGNmZy0+bGluZV9vdXRzOworCQltZW1jcHkoY2ZnLT5zcGVha2VyX3BpbnMsIGNmZy0+bGluZV9vdXRfcGlucywKKwkJICAgICAgIHNpemVvZihjZmctPnNwZWFrZXJfcGlucykpOworCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+aHBfb3V0czsKKwkJbWVtY3B5KGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5ocF9waW5zLCBzaXplb2YoY2ZnLT5ocF9waW5zKSk7CisJCWNmZy0+aHBfb3V0cyA9IDA7CisJCW1lbXNldChjZmctPmhwX3BpbnMsIDAsIHNpemVvZihjZmctPmhwX3BpbnMpKTsKKwkJY2ZnLT5saW5lX291dF90eXBlID0gQVVUT19QSU5fSFBfT1VUOworCX0KKwogCWVyciA9IGFsY19hdXRvX2ZpbGxfZGFjX25pZHMoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMsIGFsY19hdXRvX2ZpbGxfZGFjX25pZHMpOworCWVyciA9IGFsY19hdXRvX2FkZF9tdWx0aV9jaGFubmVsX21vZGUoY29kZWMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgJnNwZWMtPmF1dG9jZmcpOworCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3Rscyhjb2RlYywgY2ZnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBhbGNfYXV0b19jcmVhdGVfaHBfb3V0KGNvZGVjKTsKQEAgLTM2NzgsMTAgKzM5NTMsOCBAQAogCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKIAkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCiAJCWVyciA9IGFsYzg4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKIAkJZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwpAQCAtMzcwNiwxMCArMzk3OSw4IEBACiAKIAlpZiAoIXNwZWMtPm5vX2FuYWxvZykgewogCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwYiwgMHgwNSwgSERBX0lOUFVUKTsKIAl9CiAKQEAgLTM3MjQsNiArMzk5NSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAKQEAgLTM4MDUsMTAgKzQwODAsOCBAQAogCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKIAkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCiAJCWVyciA9IGFsYzI2MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKIAkJZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwpAQCAtMzgzMywxMCArNDEwNiw4IEBACiAKIAlpZiAoIXNwZWMtPm5vX2FuYWxvZykgewogCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgMHgxKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogCQlzZXRfYmVlcF9hbXAoc3BlYywgMHgwNywgMHgwNSwgSERBX0lOUFVUKTsKIAl9CiAKQEAgLTM4NTQsNiArNDEyNSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAKQEAgLTM4ODAsNiArNDE1NSw3IEBACiAJUElORklYX0xFTk9WT19ZNTMwLAogCVBJTkZJWF9QQl9NNTIxMCwKIAlQSU5GSVhfQUNFUl9BU1BJUkVfNzczNiwKKwlQSU5GSVhfQVNVU19XOTBWLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjODgyX2ZpeHVwc1tdID0gewpAQCAtMzkxMSwxMCArNDE4NywxOCBAQAogCQkudHlwZSA9IEFMQ19GSVhVUF9TS1UsCiAJCS52LnNrdSA9IEFMQ19GSVhVUF9TS1VfSUdOT1JFLAogCX0sCisJW1BJTkZJWF9BU1VTX1c5MFZdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNiwgMHg5OTEzMDExMCB9LCAvKiBmaXggc2VxdWVuY2UgZm9yIENMRkUgKi8KKwkJCXsgfQorCQl9CisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM4ODJfZml4dXBfdGJsW10gPSB7CiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1NSwgIlBhY2thcmQtQmVsbCBNNTEyMCIsIFBJTkZJWF9QQl9NNTIxMCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3MywgIkFTVVMgVzkwViIsIFBJTkZJWF9BU1VTX1c5MFYpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNhMGQsICJMZW5vdm8gWTUzMCIsIFBJTkZJWF9MRU5PVk9fWTUzMCksCiAJU05EX1BDSV9RVUlSSygweDE0N2IsIDB4MTA3YSwgIkFiaXQgQVc5RC1NQVgiLCBQSU5GSVhfQUJJVF9BVzlEX01BWCksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDI5NiwgIkFjZXIgQXNwaXJlIDc3MzZ6IiwgUElORklYX0FDRVJfQVNQSVJFXzc3MzYpLApAQCAtMzk2MSw2ICs0MjQ1LDEwIEBACiAJCWJyZWFrOwogCX0KIAorCWVyciA9IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCiAJYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODgyX01PREVMX0xBU1QsCiAJCQkJCWFsYzg4Ml9tb2RlbHMsIGFsYzg4Ml9jZmdfdGJsKTsKIApAQCAtMzk4NCwxMCArNDI3Miw4IEBACiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KIAkJZXJyID0gYWxjODgyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwogCQllbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCkBAIC00MDEyLDEwICs0Mjk4LDggQEAKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNDAzNCw2ICs0MzE4LDEwIEBACiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIApAQCAtNDEzOCwxMCArNDQyNiw4IEBACiAJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewogCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KIAkJZXJyID0gYWxjMjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOwogI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwogCQllbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCkBAIC00MTY2LDEwICs0NDUyLDggQEAKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmIGhhc19jZGVmaW5lX2JlZXAoY29kZWMpKSB7CiAJCWVyciA9IHNuZF9oZGFfYXR0YWNoX2JlZXBfZGV2aWNlKGNvZGVjLCAweDEpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNDE4OSw2ICs0NDczLDEwIEBACiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC00MjM3LDE0ICs0NTI1LDkgQEAKIAogLyoKICAqLwotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotI2luY2x1ZGUgImFsYzI2OF9xdWlya3MuYyIKLSNlbmRpZgotCiBzdGF0aWMgaW50IHBhdGNoX2FsYzI2OChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWM7Ci0JaW50IGJvYXJkX2NvbmZpZzsKIAlpbnQgaSwgaGFzX2JlZXAsIGVycjsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwpAQCAtNDI1NSwzOCArNDUzOCwxMCBAQAogCiAJLyogQUxDMjY4IGhhcyBubyBhYS1sb29wYmFjayBtaXhlciAqLwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY4X01PREVMX0xBU1QsCi0JCQkJCWFsYzI2OF9tb2RlbHMsIGFsYzI2OF9jZmdfdGJsKTsKLQotCWlmIChib2FyZF9jb25maWcgPCAwKQotCQlib2FyZF9jb25maWcgPSBhbGNfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyhjb2RlYywKLQkJCUFMQzI2OF9NT0RFTF9MQVNULCBhbGMyNjhfbW9kZWxzLCBhbGMyNjhfc3NpZF9jZmdfdGJsKTsKLQotCWlmIChib2FyZF9jb25maWcgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwKLQkJICAgICAgIGNvZGVjLT5jaGlwX25hbWUpOwotCQlib2FyZF9jb25maWcgPSBBTENfTU9ERUxfQVVUTzsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGMyNjhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzI2OF8zU1Q7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzI2OF9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IGFsYzI2OF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CiAKIAloYXNfYmVlcCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgewpAQCAtNDI5OCwxMCArNDU1Myw4IEBACiAKIAlpZiAoaGFzX2JlZXApIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJaWYgKCFxdWVyeV9hbXBfY2Fwcyhjb2RlYywgMHgxZCwgSERBX0lOUFVUKSkKIAkJCS8qIG92ZXJyaWRlIHRoZSBhbXAgY2FwcyBmb3IgYmVlcCBnZW5lcmF0b3IgKi8KIAkJCXNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoY29kZWMsIDB4MWQsIEhEQV9JTlBVVCwKQEAgLTQzMjMsMTMgKzQ1NzYsMTYgQEAKIAlzcGVjLT52bWFzdGVyX25pZCA9IDB4MDI7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKQotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKKwlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKIAlzcGVjLT5zaHV0dXAgPSBhbGNfZWFwZF9zaHV0dXA7CiAKIAlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7CiAKIAlyZXR1cm4gMDsKKworIGVycm9yOgorCWFsY19mcmVlKGNvZGVjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtNDQyMyw5ICs0Njc5LDkgQEAKIAogc3RhdGljIHZvaWQgYWxjMjY5X3NodXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTcpCisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPT0gMHgwMTcpCiAJCWFsYzI2OV90b2dnbGVfcG93ZXJfb3V0cHV0KGNvZGVjLCAwKTsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7CiAJCW1zbGVlcCgxNTApOwogCX0KQEAgLTQ0MzQsMTkgKzQ2OTAsMTkgQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWxjMjY5X3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTgpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMCk7CiAJCW1zbGVlcCgxNTApOwogCX0KIAogCWNvZGVjLT5wYXRjaF9vcHMuaW5pdChjb2RlYyk7CiAKLQlpZiAoKGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAwKSAmIDB4MDBmZikgPT0gMHgwMTcpIHsKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxNykgewogCQlhbGMyNjlfdG9nZ2xlX3Bvd2VyX291dHB1dChjb2RlYywgMSk7CiAJCW1zbGVlcCgyMDApOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkKKwlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGZmKSA9PSAweDAxOCkKIAkJYWxjMjY5X3RvZ2dsZV9wb3dlcl9vdXRwdXQoY29kZWMsIDEpOwogCiAJc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wKGNvZGVjKTsKQEAgLTQ1MTUsNiArNDc3MSwzMCBAQAogCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHgwNywgY29lZiB8IDB4ODApOwogfQogCitzdGF0aWMgdm9pZCBhbGMyNjlfcXVhbnRhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVwZGF0ZV9vdXRwdXRzKGNvZGVjKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjAsIDAsCisJCQlBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDBjKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDY4MCk7CisKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDIwLCAwLAorCQkJQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwYyk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgyMCwgMCwKKwkJCUFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHg0ODApOworfQorCitzdGF0aWMgdm9pZCBhbGMyNjlfZml4dXBfcXVhbnRhX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaWYgKGFjdGlvbiAhPSBBTENfRklYVVBfQUNUX1BST0JFKQorCQlyZXR1cm47CisJc3BlYy0+YXV0b211dGVfaG9vayA9IGFsYzI2OV9xdWFudGFfYXV0b211dGU7Cit9CisKIGVudW0gewogCUFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8sCiAJQUxDMjc1X0ZJWFVQX1NPTllfVkFJT19HUElPMiwKQEAgLTQ1MjYsNiArNDgwNiwxMiBAQAogCUFMQzI3MV9GSVhVUF9ETUlDLAogCUFMQzI2OV9GSVhVUF9QQ01fNDRLLAogCUFMQzI2OV9GSVhVUF9TVEVSRU9fRE1JQywKKwlBTEMyNjlfRklYVVBfUVVBTlRBX01VVEUsCisJQUxDMjY5X0ZJWFVQX0xJRkVCT09LLAorCUFMQzI2OV9GSVhVUF9BTUlDLAorCUFMQzI2OV9GSVhVUF9ETUlDLAorCUFMQzI2OVZCX0ZJWFVQX0FNSUMsCisJQUxDMjY5VkJfRklYVVBfRE1JQywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTQ1OTIsNiArNDg3OCw2MCBAQAogCQkudHlwZSA9IEFMQ19GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gYWxjMjY5X2ZpeHVwX3N0ZXJlb19kbWljLAogCX0sCisJW0FMQzI2OV9GSVhVUF9RVUFOVEFfTVVURV0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGMyNjlfZml4dXBfcXVhbnRhX211dGUsCisJfSwKKwlbQUxDMjY5X0ZJWFVQX0xJRkVCT09LXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MWEsIDB4MjEwMTEwM2YgfSwgLyogZG9jayBsaW5lLW91dCAqLworCQkJeyAweDFiLCAweDIzYTExMDQwIH0sIC8qIGRvY2sgbWljLWluICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEMyNjlfRklYVVBfUVVBTlRBX01VVEUKKwl9LAorCVtBTEMyNjlfRklYVVBfQU1JQ10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgMHgxOCwgMHgwMWExOWMyMCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgxOSwgMHg5OWEzMDkyZiB9LCAvKiBpbnQtbWljICovCisJCQl7IH0KKwkJfSwKKwl9LAorCVtBTEMyNjlfRklYVVBfRE1JQ10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDEyLCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTUsIDB4MDEyMTQwMWYgfSwgLyogSFAgb3V0ICovCisJCQl7IDB4MTgsIDB4MDFhMTljMjAgfSwgLyogbWljICovCisJCQl7IH0KKwkJfSwKKwl9LAorCVtBTEMyNjlWQl9GSVhVUF9BTUlDXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5YzIwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCX0sCisJW0FMQzI2OV9GSVhVUF9ETUlDXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTIsIDB4OTlhMzA5MmYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxOCwgMHgwMWExOWMyMCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY5X2ZpeHVwX3RibFtdID0gewpAQCAtNDYwNywxMyArNDk0Nyw3MSBAQAogCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTA0ZCwgIlNvbnkgVkFJTyIsIEFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0NzAsICJEZWxsIE0xMDF6IiwgQUxDMjY5X0ZJWFVQX0RFTExfTTEwMVopLAogCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTAyNSwgIkFjZXIgQXNwaXJlIiwgQUxDMjcxX0ZJWFVQX0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE0NzUsICJMaWZlYm9vayIsIEFMQzI2OV9GSVhVUF9MSUZFQk9PSyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIlRoaW5rcGFkIFNMNDEwLzUxMCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiVGhpbmtwYWQgTDUxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWI4LCAiVGhpbmtwYWQgRWRnZSAxNCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWNhLCAiVGhpbmtwYWQgTDQxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWU5LCAiVGhpbmtwYWQgRWRnZSAxNSIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzYmY4LCAiUXVhbnRhIEZMMSIsIEFMQzI2OV9GSVhVUF9RVUFOVEFfTVVURSksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JmOCwgIkxlbm92byBJZGVhcGQiLCBBTEMyNjlfRklYVVBfUENNXzQ0SyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4OWU1NCwgIkxFTk9WTyBOQiIsIEFMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRCksCisKKyNpZiAxCisJLyogQmVsb3cgaXMgYSBxdWlyayB0YWJsZSB0YWtlbiBmcm9tIHRoZSBvbGQgY29kZS4KKwkgKiBCYXNpY2FsbHkgdGhlIGRldmljZSBzaG91bGQgd29yayBhcyBpcyB3aXRob3V0IHRoZSBmaXh1cCB0YWJsZS4KKwkgKiBJZiBCSU9TIGRvZXNuJ3QgZ2l2ZSBhIHByb3BlciBpbmZvLCBlbmFibGUgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBmaXh1cCBlbnRyeS4KKwkgKi8gCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODMzMCwgIkFTVVMgRWVlcGMgUDcwMyBQOTAwQSIsCisJCSAgICAgIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDEzLCAiQVNVUyBONjFEYSIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTEzLCAiQVNVUyBONjNKbiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTQzLCAiQVNVUyBCNTNmIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExMzMsICJBU1VTIFVKMjBmdCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTgzLCAiQVNVUyBLNzJEUiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWIzLCAiQVNVUyBLNTJEUiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWUzLCAiQVNVUyBVMzNKYyIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjczLCAiQVNVUyBVTDgwSnQiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTI4MywgIkFTVVMgVTUzSmMiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJiMywgIkFTVVMgTjgySlYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJkMywgIkFTVVMgTjYxSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNhMywgIkFTVVMgVUwzMFZ0IiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzNzMsICJBU1VTIEc3M0pYIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzODMsICJBU1VTIFVKMzBKYyIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2QzLCAiQVNVUyBONjFKQSIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNDEzLCAiQVNVUyBVTDUwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0NDMsICJBU1VTIFVMMzAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ1MywgIkFTVVMgTTYwSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ4MywgIkFTVVMgVUw4MCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGYzLCAiQVNVUyBGODNWZiIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNGUzLCAiQVNVUyBVTDIwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE1MTMsICJBU1VTIFVYMzAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTU5MywgIkFTVVMgTjUxVm4iLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVhMywgIkFTVVMgTjYwSnYiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTViMywgIkFTVVMgTjYwRHAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVjMywgIkFTVVMgTjcwRGUiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVlMywgIkFTVVMgRjgzVCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjQzLCAiQVNVUyBNNjBKIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2NTMsICJBU1VTIFU1MCIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNjkzLCAiQVNVUyBGNTBOIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE2YTMsICJBU1VTIEY1USIsIEFMQzI2OV9GSVhVUF9BTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNzIzLCAiQVNVUyBQODAiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTc0MywgIkFTVVMgVTgwIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NzMsICJBU1VTIFUyMEEiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg4MywgIkFTVVMgRjgxU2UiLCBBTEMyNjlfRklYVVBfQU1JQyksCisJU05EX1BDSV9RVUlSSygweDE1MmQsIDB4MTc3OCwgIlF1YW50YSBPTjEiLCBBTEMyNjlfRklYVVBfRE1JQyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2JlOSwgIlF1YW50YSBXaXN0cm9uIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X0ZJWFVQX0FNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWEsICJRdWFudGEgRUwzIiwgQUxDMjY5X0ZJWFVQX0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1OWIsICJRdWFudGEgSlIxIiwgQUxDMjY5X0ZJWFVQX0RNSUMpLAorI2VuZGlmCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX21vZGVsX2ZpeHVwIGFsYzI2OV9maXh1cF9tb2RlbHNbXSA9IHsKKwl7LmlkID0gQUxDMjY5X0ZJWFVQX0FNSUMsIC5uYW1lID0gImxhcHRvcC1hbWljIn0sCisJey5pZCA9IEFMQzI2OV9GSVhVUF9ETUlDLCAubmFtZSA9ICJsYXB0b3AtZG1pYyJ9LAogCXt9CiB9OwogCkBAIC00NjIyLDIzICs1MDIwLDIzIEBACiB7CiAJaW50IHZhbDsKIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA8IDB4MDE1KSB7CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPCAweDAxNSkgewogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4ZiwgMHg5NjBiKTsKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGUsIDB4ODgxNyk7CiAJfQogCi0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZmYpID09IDB4MDE2KSB7CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmIDB4MDBmZikgPT0gMHgwMTYpIHsKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweGYsIDB4OTYwYik7CiAJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHhlLCAweDg4MTQpOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxNykgeworCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZmYpID09IDB4MDE3KSB7CiAJCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDA0KTsKIAkJLyogUG93ZXIgdXAgb3V0cHV0IHBpbiAqLwogCQlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MDQsIHZhbCB8ICgxPDwxMSkpOwogCX0KIAotCWlmICgoYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApICYgMHgwMGZmKSA9PSAweDAxOCkgeworCWlmICgoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZmYpID09IDB4MDE4KSB7CiAJCXZhbCA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweGQpOwogCQlpZiAoKHZhbCAmIDB4MGMwMCkgPj4gMTAgIT0gMHgxKSB7CiAJCQkvKiBDYXBsZXNzIHJhbXAgdXAgY2xvY2sgY29udHJvbCAqLwpAQCAtNDY2MiwxNSArNTA2MCwxMCBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjMjY5X3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjMjY5KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnLCBjb2VmOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQpAQCAtNDY4Miw3MiArNTA3NSw0MSBAQAogCiAJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CiAKKwllcnIgPSBhbGNfY29kZWNfcmVuYW1lX2Zyb21fcHJlc2V0KGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwogCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNjkpIHsKIAkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZBOwotCQljb2VmID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApOwotCQlpZiAoKGNvZWYgJiAweDAwZjApID09IDB4MDAxMCkgeworCQlzd2l0Y2ggKGFsY19nZXRfY29lZjAoY29kZWMpICYgMHgwMGYwKSB7CisJCWNhc2UgMHgwMDEwOgogCQkJaWYgKGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwMjUgJiYKLQkJCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgewotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDIwMDApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjU5Iik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmMDAwKSA9PSAweDMwMDApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjU4Iik7Ci0JCQl9IGVsc2UgaWYgKChjb2VmICYgMHhmZmYwKSA9PSAweDMwMTApIHsKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjc3Iik7Ci0JCQl9IGVsc2UgewotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNjlWQiIpOwotCQkJfQorCQkJICAgIHNwZWMtPmNkZWZpbmUucGxhdGZvcm1fdHlwZSA9PSAxKQorCQkJCWVyciA9IGFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNzFYIik7CiAJCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjY5VkI7Ci0JCX0gZWxzZSBpZiAoKGNvZWYgJiAweDAwZjApID09IDB4MDAyMCkgewotCQkJaWYgKGNvZWYgPT0gMHhhMDIzKQotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyNTkiKTsKLQkJCWVsc2UgaWYgKGNvZWYgPT0gMHg2MDIzKQotCQkJCWFsY19jb2RlY19yZW5hbWUoY29kZWMsICJBTEMyODFYIik7Ci0JCQllbHNlIGlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCi0JCQkJIGNvZGVjLT5idXMtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDIxZjMpCi0JCQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzMyMDIiKTsKLQkJCWVsc2UKLQkJCQlhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMjY5VkMiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAyMDoKKwkJCWlmIChjb2RlYy0+YnVzLT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxN2FhICYmCisJCQkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjFmMykKKwkJCQllcnIgPSBhbGNfY29kZWNfcmVuYW1lKGNvZGVjLCAiQUxDMzIwMiIpOwogCQkJc3BlYy0+Y29kZWNfdmFyaWFudCA9IEFMQzI2OV9UWVBFX0FMQzI2OVZDOwotCQl9IGVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJYWxjX2ZpeF9wbGxfaW5pdChjb2RlYywgMHgyMCwgMHgwNCwgMTUpOworCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJYWxjMjY5X2ZpbGxfY29lZihjb2RlYyk7CiAJfQogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDMjY5X01PREVMX0xBU1QsCi0JCQkJCWFsYzI2OV9tb2RlbHMsIGFsYzI2OV9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgYWxjMjY5X2ZpeHVwX21vZGVscywKKwkJICAgICAgIGFsYzI2OV9maXh1cF90YmwsIGFsYzI2OV9maXh1cHMpOworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzI2OV9maXh1cF90YmwsIGFsYzI2OV9maXh1cHMpOwotCQlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJFX1BST0JFKTsKLQl9Ci0KLQlpZiAoYm9hcmRfY29uZmlnID09IEFMQ19NT0RFTF9BVVRPKSB7Ci0JCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLwotCQllcnIgPSBhbGMyNjlfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzI2OV9CQVNJQzsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjMjY5X3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjMjY5X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTQ3NjAsMTAgKzUxMjIsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCk7CiAJfQogCkBAIC00Nzc1LDggKzUxMzUsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCWNvZGVjLT5wYXRjaF9vcHMucmVzdW1lID0gYWxjMjY5X3Jlc3VtZTsKICNlbmRpZgotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOwogCXNwZWMtPnNodXR1cCA9IGFsYzI2OV9zaHV0dXA7CiAKIAlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7CkBAIC00Nzg4LDYgKzUxNDcsMTAgQEAKICNlbmRpZgogCiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTQ4MzUsMTQgKzUxOTgsOSBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjODYxX3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjODYxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnOwogCWludCBlcnI7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKQEAgLTQ4NTMsMzkgKzUyMTEsMTMgQEAKIAogCXNwZWMtPm1peGVyX25pZCA9IDB4MTU7CiAKLSAgICAgICAgYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxX01PREVMX0xBU1QsCi0JCQkJCWFsYzg2MV9tb2RlbHMsIGFsYzg2MV9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxX2ZpeHVwX3RibCwgYWxjODYxX2ZpeHVwcyk7CisJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CiAKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxX2ZpeHVwX3RibCwgYWxjODYxX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCi0JCWVyciA9IGFsYzg2MV9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0JCWVsc2UgaWYgKCFlcnIpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgotCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwotCQkgICBib2FyZF9jb25maWcgPSBBTEM4NjFfM1NUX0RJRzsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODYxX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjODYxX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTQ4OTgsMTAgKzUyMzAsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MjMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDIzLCAwLCBIREFfT1VUUFVUKTsKIAl9CiAKQEAgLTQ5MTAsMTggKzUyNDAsMTggQEAKIAlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKKwlzcGVjLT5pbml0X2hvb2sgPSBhbGNfYXV0b19pbml0X3N0ZDsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCi0JCXNwZWMtPnBvd2VyX2hvb2sgPSBhbGNfcG93ZXJfZWFwZDsKLSNlbmRpZgotCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCisJc3BlYy0+cG93ZXJfaG9vayA9IGFsY19wb3dlcl9lYXBkOwogCWlmICghc3BlYy0+bG9vcGJhY2suYW1wbGlzdCkKIAkJc3BlYy0+bG9vcGJhY2suYW1wbGlzdCA9IGFsYzg2MV9sb29wYmFja3M7CiAjZW5kaWYKIAogCXJldHVybiAwOworCisgZXJyb3I6CisJYWxjX2ZyZWUoY29kZWMpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC00OTQzLDI0ICs1MjczLDQxIEBACiB9CiAKIGVudW0gewotCUFMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xCisJQUxDNjYwVkRfRklYX0FTVVNfR1BJTzEsCisJQUxDODYxVkRfRklYX0RBTExBUywKIH07CiAKLS8qIHJlc2V0IEdQSU8xICovCisvKiBleGNsdWRlIFZSRUY4MCAqLworc3RhdGljIHZvaWQgYWxjODYxdmRfZml4dXBfZGFsbGFzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LCBpbnQgYWN0aW9uKQoreworCWlmIChhY3Rpb24gPT0gQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpIHsKKwkJc25kX2hkYV9vdmVycmlkZV9waW5fY2Fwcyhjb2RlYywgMHgxOCwgMHgwMDAwMTcxNCk7CisJCXNuZF9oZGFfb3ZlcnJpZGVfcGluX2NhcHMoY29kZWMsIDB4MTksIDB4MDAwMDE3MWMpOworCX0KK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjODYxdmRfZml4dXBzW10gPSB7CiAJW0FMQzY2MFZEX0ZJWF9BU1VTX0dQSU8xXSA9IHsKIAkJLnR5cGUgPSBBTENfRklYVVBfVkVSQlMsCiAJCS52LnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQkvKiByZXNldCBHUElPMSAqLwogCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sCiAJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAogCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMX0sCiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzg2MVZEX0ZJWF9EQUxMQVNdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9GVU5DLAorCQkudi5mdW5jID0gYWxjODYxdmRfZml4dXBfZGFsbGFzLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfZml4dXBfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBiZiwgIkhQIFRYMTAwMCIsIEFMQzg2MVZEX0ZJWF9EQUxMQVMpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzksICJBU1VTIEE3LUsiLCBBTEM2NjBWRF9GSVhfQVNVU19HUElPMSksCisJU05EX1BDSV9RVUlSSygweDExNzksIDB4ZmYzMSwgIlRvc2hpYmEgTDMwLTE0OSIsIEFMQzg2MVZEX0ZJWF9EQUxMQVMpLAogCXt9CiB9OwogCkBAIC00OTcyLDE0ICs1MzE5LDEwIEBACiAKIC8qCiAgKi8KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLSNpbmNsdWRlICJhbGM4NjF2ZF9xdWlya3MuYyIKLSNlbmRpZgotCiBzdGF0aWMgaW50IHBhdGNoX2FsYzg2MXZkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgZXJyLCBib2FyZF9jb25maWc7CisJaW50IGVycjsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmIChzcGVjID09IE5VTEwpCkBAIC00OTg5LDM5ICs1MzMyLDEzIEBACiAKIAlzcGVjLT5taXhlcl9uaWQgPSAweDBiOwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxVkRfTU9ERUxfTEFTVCwKLQkJCQkJYWxjODYxdmRfbW9kZWxzLCBhbGM4NjF2ZF9jZmdfdGJsKTsKKwlhbGNfcGlja19maXh1cChjb2RlYywgTlVMTCwgYWxjODYxdmRfZml4dXBfdGJsLCBhbGM4NjF2ZF9maXh1cHMpOworCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiAlczogQklPUyBhdXRvLXByb2JpbmcuXG4iLAotCQkgICAgICAgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWJvYXJkX2NvbmZpZyA9IEFMQ19NT0RFTF9BVVRPOwotCX0KLQotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIE5VTEwsIGFsYzg2MXZkX2ZpeHVwX3RibCwgYWxjODYxdmRfZml4dXBzKTsKLQkJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjODYxdmRfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotI2lmZGVmIENPTkZJR19TTkRfSERBX0VOQUJMRV9SRUFMVEVLX1FVSVJLUwotCQllbHNlIGlmICghZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKLQkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKLQkJCWJvYXJkX2NvbmZpZyA9IEFMQzg2MVZEXzNTVDsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykKLQkJc2V0dXBfcHJlc2V0KGNvZGVjLCAmYWxjODYxdmRfcHJlc2V0c1tib2FyZF9jb25maWddKTsKKwkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwllcnIgPSBhbGM4NjF2ZF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CiAKIAlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjYwKSB7CiAJCS8qIGFsd2F5cyB0dXJuIG9uIEVBUEQgKi8KQEAgLTUwMzksMTAgKzUzNTYsOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MjMpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJYWxjX2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwogCX0KIApAQCAtNTA1Miw4ICs1MzY3LDcgQEAKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwogCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CiAJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwogI2lmZGVmIENPTkZJR19TTkRfSERBX1BPV0VSX1NBVkUKIAlpZiAoIXNwZWMtPmxvb3BiYWNrLmFtcGxpc3QpCkBAIC01MDYxLDYgKzUzNzUsMTAgQEAKICNlbmRpZgogCiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTUxMTgsNiArNTQzNiwxNCBAQAogCUFMQzY2Ml9GSVhVUF9DWkNfUDEwVCwKIAlBTEM2NjJfRklYVVBfU0tVX0lHTk9SRSwKIAlBTEM2NjJfRklYVVBfSFBfUlA1ODAwLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUxLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUyLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREUzLAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU0LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU1LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU2LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU3LAorCUFMQzY2Ml9GSVhVUF9BU1VTX01PREU4LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgYWxjNjYyX2ZpeHVwc1tdID0gewpAQCAtNTE1OSwzNyArNTQ4NSwyMDQgQEAKIAkJLmNoYWluZWQgPSB0cnVlLAogCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQogCX0sCisJW0FMQzY2Ml9GSVhVUF9BU1VTX01PREUxXSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5YzIwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTJmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDAxZiB9LCAvKiBIUCBvdXQgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTJdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTgsIDB4MDFhMTk4MjAgfSwgLyogbWljICovCisJCQl7IDB4MTksIDB4OTlhMzA5MmYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDFiLCAweDAxMjE0MDFmIH0sIC8qIEhQIG91dCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFM10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxMTQyMCB9LCAvKiBIUDIgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTRdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTYsIDB4OTkxMzAxMTEgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgyMSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFNV0gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNSwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyAweDE2LCAweDk5MTMwMTExIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxOCwgMHgwMWExOTg0MCB9LCAvKiBtaWMgKi8KKwkJCXsgMHgxOSwgMHg5OWEzMDk0ZiB9LCAvKiBpbnQtbWljICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQorCX0sCisJW0FMQzY2Ml9GSVhVUF9BU1VTX01PREU2XSA9IHsKKwkJLnR5cGUgPSBBTENfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZ1tdKSB7CisJCQl7IDB4MTQsIDB4OTkxMzAxMTAgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE1LCAweDAxMjExNDIwIH0sIC8qIEhQMiAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDE5LCAweDk5YTMwOTRmIH0sIC8qIGludC1taWMgKi8KKwkJCXsgMHgxYiwgMHgwMTIxNDQxZiB9LCAvKiBIUCAqLworCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDNjYyX0ZJWFVQX1NLVV9JR05PUkUKKwl9LAorCVtBTEM2NjJfRklYVVBfQVNVU19NT0RFN10gPSB7CisJCS50eXBlID0gQUxDX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGFsY19waW5jZmdbXSkgeworCQkJeyAweDE0LCAweDk5MTMwMTEwIH0sIC8qIHNwZWFrZXIgKi8KKwkJCXsgMHgxNywgMHg5OTEzMDExMSB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTgsIDB4MDFhMTk4NDAgfSwgLyogbWljICovCisJCQl7IDB4MTksIDB4OTlhMzA5NGYgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDFiLCAweDAxMjE0MDIwIH0sIC8qIEhQICovCisJCQl7IDB4MjEsIDB4MDEyMTQwMWYgfSwgLyogSFAgKi8KKwkJCXsgfQorCQl9LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFCisJfSwKKwlbQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERThdID0geworCQkudHlwZSA9IEFMQ19GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnW10pIHsKKwkJCXsgMHgxNCwgMHg5OTEzMDExMCB9LCAvKiBzcGVha2VyICovCisJCQl7IDB4MTIsIDB4OTlhMzA5NzAgfSwgLyogaW50LW1pYyAqLworCQkJeyAweDE1LCAweDAxMjE0MDIwIH0sIC8qIEhQICovCisJCQl7IDB4MTcsIDB4OTkxMzAxMTEgfSwgLyogc3BlYWtlciAqLworCQkJeyAweDE4LCAweDAxYTE5ODQwIH0sIC8qIG1pYyAqLworCQkJeyAweDIxLCAweDAxMjE0MDFmIH0sIC8qIEhQICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEM2NjJfRklYVVBfU0tVX0lHTk9SRQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjNjYyX2ZpeHVwX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDE5LCAweDkwODcsICJFQ1MiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDMwOCwgIkFjZXIgQXNwaXJlIDg5NDJHIiwgQUxDNjYyX0ZJWFVQX0FTUElSRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDMxYywgIkdhdGV3YXkgTlY3OSIsIEFMQzY2Ml9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMzhiLCAiQWNlciBBc3BpcmUgODk0M0ciLCBBTEM2NjJfRklYVVBfQVNQSVJFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgxNjMyLCAiSFAgUlA1ODAwIiwgQUxDNjYyX0ZJWFVQX0hQX1JQNTgwMCksCisJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4MGNkNiwgIkZveGNvbm4iLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCiAJU05EX1BDSV9RVUlSSygweDE0NGQsIDB4YzA1MSwgIlNhbXN1bmcgUjcyMCIsIEFMQzY2Ml9GSVhVUF9JREVBUEFEKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzOGFmLCAiTGVub3ZvIElkZWFwYWQgWTU1MFAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4M2EwZCwgIkxlbm92byBJZGVhcGFkIFk1NTAiLCBBTEM2NjJfRklYVVBfSURFQVBBRCksCiAJU05EX1BDSV9RVUlSSygweDFiMzUsIDB4MjIwNiwgIkNaQyBQMTBUIiwgQUxDNjYyX0ZJWFVQX0NaQ19QMTBUKSwKKworI2lmIDAKKwkvKiBCZWxvdyBpcyBhIHF1aXJrIHRhYmxlIHRha2VuIGZyb20gdGhlIG9sZCBjb2RlLgorCSAqIEJhc2ljYWxseSB0aGUgZGV2aWNlIHNob3VsZCB3b3JrIGFzIGlzIHdpdGhvdXQgdGhlIGZpeHVwIHRhYmxlLgorCSAqIElmIEJJT1MgZG9lc24ndCBnaXZlIGEgcHJvcGVyIGluZm8sIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZworCSAqIGZpeHVwIGVudHJ5LgorCSAqLyAKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDAwLCAiQVNVUyBONTBWbSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMDkyLCAiQVNVUyBOQiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMTczLCAiQVNVUyBLNzNKbiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMWMzLCAiQVNVUyBNNzBWIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDExZjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyMDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMDMsICJBU1VTIEc2MEoiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzMywgIkFTVVMgRzYwSngiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMzOSwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTNlMywgIkFTVVMgTjcxSkEiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFNyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ2MywgIkFTVVMgTjcxIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE0ZDMsICJBU1VTIEc3MiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREU4KSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxNTYzLCAiQVNVUyBOOTAiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTVkMywgIkFTVVMgTjUwU0YgRjUwU0YiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZjMywgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTZmMywgIkFTVVMgSzQwQyBLNTBDIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3MzMsICJBU1VTIE44MURlIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3NjUsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3ODMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3OTMsICJBU1VTIEY1MEdYIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3YjMsICJBU1VTIEY3MFNMIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE3ZjMsICJBU1VTIFg1OExFIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4MzMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTYpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NDMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NTMsICJBU1VTIEY1MFoiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg2NCwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg3NiwgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5MywgIkFTVVMgTTUwVm0iLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTg5NCwgIkFTVVMgWDU1IiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YjMsICJBU1VTIE44MFZjIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4YzMsICJBU1VTIFZYNSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGQzLCAiQVNVUyBOODFUZSIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOGYzLCAiQVNVUyBONTA1VHAiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTkwMywgIkFTVVMgRjVHTCIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTEzLCAiQVNVUyBOQiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUyKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTMzLCAiQVNVUyBGODBRIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5NDMsICJBU1VTIFZ4M1YiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk1MywgIkFTVVMgTkIiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk2MywgIkFTVVMgWDcxQyIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUzKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOTgzLCAiQVNVUyBONTA1MUEiLCBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk5MywgIkFTVVMgTjIwIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5YjMsICJBU1VTIEY3WiIsIEFMQzY2Ml9GSVhVUF9BU1VTX01PREUxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxOWMzLCAiQVNVUyBGNVovRjZ4IiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ZTMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTEpLAorCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE5ZjMsICJBU1VTIE5CIiwgQUxDNjYyX0ZJWFVQX0FTVVNfTU9ERTQpLAorI2VuZGlmCiAJe30KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX21vZGVsX2ZpeHVwIGFsYzY2Ml9maXh1cF9tb2RlbHNbXSA9IHsKIAl7LmlkID0gQUxDMjcyX0ZJWFVQX01BUklPLCAubmFtZSA9ICJtYXJpbyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMSwgLm5hbWUgPSAiYXN1cy1tb2RlMSJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMiwgLm5hbWUgPSAiYXN1cy1tb2RlMiJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFMywgLm5hbWUgPSAiYXN1cy1tb2RlMyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNCwgLm5hbWUgPSAiYXN1cy1tb2RlNCJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNSwgLm5hbWUgPSAiYXN1cy1tb2RlNSJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNiwgLm5hbWUgPSAiYXN1cy1tb2RlNiJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFNywgLm5hbWUgPSAiYXN1cy1tb2RlNyJ9LAorCXsuaWQgPSBBTEM2NjJfRklYVVBfQVNVU19NT0RFOCwgLm5hbWUgPSAiYXN1cy1tb2RlOCJ9LAogCXt9CiB9OwogCiAKIC8qCiAgKi8KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLSNpbmNsdWRlICJhbGM2NjJfcXVpcmtzLmMiCi0jZW5kaWYKLQogc3RhdGljIGludCBwYXRjaF9hbGM2NjIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjOwotCWludCBlcnIsIGJvYXJkX2NvbmZpZzsKLQlpbnQgY29lZjsKKwlpbnQgZXJyID0gMDsKIAogCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOwogCWlmICghc3BlYykKQEAgLTUxOTksNTAgKzU2OTIsMzEgQEAKIAogCXNwZWMtPm1peGVyX25pZCA9IDB4MGI7CiAKKwkvKiBoYW5kbGUgbXVsdGlwbGUgSFBzIGFzIGlzICovCisJc3BlYy0+cGFyc2VfZmxhZ3MgPSBIREFfUElOQ0ZHX05PX0hQX0ZJWFVQOworCiAJYWxjX2F1dG9fcGFyc2VfY3VzdG9taXplX2RlZmluZShjb2RlYyk7CiAKIAlhbGNfZml4X3BsbF9pbml0KGNvZGVjLCAweDIwLCAweDA0LCAxNSk7CiAKLQljb2VmID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDApOwotCWlmIChjb2VmID09IDB4ODAyMCB8fCBjb2VmID09IDB4ODAxMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzY2MSIpOwotCWVsc2UgaWYgKGNvZWYgJiAoMSA8PCAxNCkgJiYKLQkJY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgotCQlzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MlgiKTsKLQllbHNlIGlmIChjb2VmID09IDB4NDAxMSkKLQkJYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzY1NiIpOworCWVyciA9IGFsY19jb2RlY19yZW5hbWVfZnJvbV9wcmVzZXQoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOwogCi0JYm9hcmRfY29uZmlnID0gYWxjX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDNjYyX01PREVMX0xBU1QsCi0JCQkJCWFsYzY2Ml9tb2RlbHMsIGFsYzY2Ml9jZmdfdGJsKTsKLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87CisJaWYgKChhbGNfZ2V0X2NvZWYwKGNvZGVjKSAmICgxIDw8IDE0KSkgJiYKKwkgICAgY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSAmJgorCSAgICBzcGVjLT5jZGVmaW5lLnBsYXRmb3JtX3R5cGUgPT0gMSkgeworCQlpZiAoYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgIkFMQzI3MlgiKSA8IDApCisJCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pIHsKLQkJYWxjX3BpY2tfZml4dXAoY29kZWMsIGFsYzY2Ml9maXh1cF9tb2RlbHMsCi0JCQkgICAgICAgYWxjNjYyX2ZpeHVwX3RibCwgYWxjNjYyX2ZpeHVwcyk7Ci0JCWFsY19hcHBseV9maXh1cChjb2RlYywgQUxDX0ZJWFVQX0FDVF9QUkVfUFJPQkUpOwotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJZWxzZSBpZiAoIWVycikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7Ci0JCQlib2FyZF9jb25maWcgPSBBTEM2NjJfM1NUXzJjaF9ESUc7Ci0JCX0KLSNlbmRpZgotCX0KLQotCWlmIChib2FyZF9jb25maWcgIT0gQUxDX01PREVMX0FVVE8pCi0JCXNldHVwX3ByZXNldChjb2RlYywgJmFsYzY2Ml9wcmVzZXRzW2JvYXJkX2NvbmZpZ10pOworCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBhbGM2NjJfZml4dXBfbW9kZWxzLAorCQkgICAgICAgYWxjNjYyX2ZpeHVwX3RibCwgYWxjNjYyX2ZpeHVwcyk7CisJYWxjX2FwcGx5X2ZpeHVwKGNvZGVjLCBBTENfRklYVVBfQUNUX1BSRV9QUk9CRSk7CisJLyogYXV0b21hdGljIHBhcnNlIGZyb20gdGhlIEJJT1MgY29uZmlnICovCisJZXJyID0gYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewogCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKQEAgLTUyNTUsMTAgKzU3MjksOCBAQAogCiAJaWYgKCFzcGVjLT5ub19hbmFsb2cgJiYgaGFzX2NkZWZpbmVfYmVlcChjb2RlYykpIHsKIAkJZXJyID0gc25kX2hkYV9hdHRhY2hfYmVlcF9kZXZpY2UoY29kZWMsIDB4MSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlhbGNfZnJlZShjb2RlYyk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKIAkJc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CiAJCWNhc2UgMHgxMGVjMDY2MjoKIAkJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA1LCBIREFfSU5QVVQpOwpAQCAtNTI3OCw4ICs1NzUwLDcgQEAKIAlhbGNfYXBwbHlfZml4dXAoY29kZWMsIEFMQ19GSVhVUF9BQ1RfUFJPQkUpOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7Ci0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykKLQkJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CisJc3BlYy0+aW5pdF9ob29rID0gYWxjX2F1dG9faW5pdF9zdGQ7CiAJc3BlYy0+c2h1dHVwID0gYWxjX2VhcGRfc2h1dHVwOwogCiAJYWxjX2luaXRfamFja3MoY29kZWMpOwpAQCAtNTI5MCwzMiArNTc2MSwxMCBAQAogI2VuZGlmCiAKIAlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBwYXRjaF9hbGM4ODgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDAwZjApPT0weDAwMzApewotCQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDg4NykKLQkJCWNvZGVjLT5jaGlwX25hbWUgPSBrc3RyZHVwKCJBTEM4ODctVkQiLCBHRlBfS0VSTkVMKTsKLQkJZWxzZQotCQkJY29kZWMtPmNoaXBfbmFtZSA9IGtzdHJkdXAoIkFMQzg4OC1WRCIsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNvZGVjLT5jaGlwX25hbWUpIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXJldHVybiBwYXRjaF9hbGM2NjIoY29kZWMpOwotCX0KLQlyZXR1cm4gcGF0Y2hfYWxjODgyKGNvZGVjKTsKLX0KLQotc3RhdGljIGludCBwYXRjaF9hbGM4OTkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKChhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMCkgJiAweDIwMDApICE9IDB4MjAwMCkgewotCQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJY29kZWMtPmNoaXBfbmFtZSA9IGtzdHJkdXAoIkFMQzg5OCIsIEdGUF9LRVJORUwpOwotCX0KLQlyZXR1cm4gcGF0Y2hfYWxjODgyKGNvZGVjKTsKKyBlcnJvcjoKKwlhbGNfZnJlZShjb2RlYyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTUzMjksMTQgKzU3NzgsOSBAQAogCiAvKgogICovCi0jaWZkZWYgQ09ORklHX1NORF9IREFfRU5BQkxFX1JFQUxURUtfUVVJUktTCi0jaW5jbHVkZSAiYWxjNjgwX3F1aXJrcy5jIgotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcGF0Y2hfYWxjNjgwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKLQlpbnQgYm9hcmRfY29uZmlnOwogCWludCBlcnI7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKQEAgLTUzNDcsNDMgKzU3OTEsMTEgQEAKIAogCS8qIEFMQzY4MCBoYXMgbm8gYWEtbG9vcGJhY2sgbWl4ZXIgKi8KIAotCWJvYXJkX2NvbmZpZyA9IGFsY19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY4MF9NT0RFTF9MQVNULAotCQkJCQlhbGM2ODBfbW9kZWxzLCBhbGM2ODBfY2ZnX3RibCk7Ci0KLQlpZiAoYm9hcmRfY29uZmlnIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsCi0JCSAgICAgICBjb2RlYy0+Y2hpcF9uYW1lKTsKLQkJYm9hcmRfY29uZmlnID0gQUxDX01PREVMX0FVVE87Ci0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyA9PSBBTENfTU9ERUxfQVVUTykgewotCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KLQkJZXJyID0gYWxjNjgwX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWFsY19mcmVlKGNvZGVjKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJZWxzZSBpZiAoIWVycikgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCi0JCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7Ci0JCQlib2FyZF9jb25maWcgPSBBTEM2ODBfQkFTRTsKLQkJfQotI2VuZGlmCi0JfQotCi0JaWYgKGJvYXJkX2NvbmZpZyAhPSBBTENfTU9ERUxfQVVUTykgewotCQlzZXR1cF9wcmVzZXQoY29kZWMsICZhbGM2ODBfcHJlc2V0c1tib2FyZF9jb25maWddKTsKLSNpZmRlZiBDT05GSUdfU05EX0hEQV9FTkFCTEVfUkVBTFRFS19RVUlSS1MKLQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0gJmFsYzY4MF9wY21fYW5hbG9nX2F1dG9fY2FwdHVyZTsKLSNlbmRpZgotCX0KLQotCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5hZGNfbmlkcykgewotCQlhbGNfYXV0b19maWxsX2FkY19jYXBzKGNvZGVjKTsKLQkJYWxjX3JlYnVpbGRfaW11eF9mb3JfYXV0b19taWMoY29kZWMpOwotCQlhbGNfcmVtb3ZlX2ludmFsaWRfYWRjX25pZHMoY29kZWMpOworCS8qIGF1dG9tYXRpYyBwYXJzZSBmcm9tIHRoZSBCSU9TIGNvbmZpZyAqLworCWVyciA9IGFsYzY4MF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJYWxjX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmICghc3BlYy0+bm9fYW5hbG9nICYmICFzcGVjLT5jYXBfbWl4ZXIpCkBAIC01MzkyLDggKzU4MDQsNyBAQAogCXNwZWMtPnZtYXN0ZXJfbmlkID0gMHgwMjsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSBhbGNfcGF0Y2hfb3BzOwotCWlmIChib2FyZF9jb25maWcgPT0gQUxDX01PREVMX0FVVE8pCi0JCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOworCXNwZWMtPmluaXRfaG9vayA9IGFsY19hdXRvX2luaXRfc3RkOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDIxLDYgKzU4MzIsOCBAQAogCSAgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwNjYyLCAucmV2ID0gMHgxMDAxMDEsIC5uYW1lID0gIkFMQzY2MiByZXYxIiwKIAkgIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAorCXsgLmlkID0gMHgxMGVjMDY2MiwgLnJldiA9IDB4MTAwMzAwLCAubmFtZSA9ICJBTEM2NjIgcmV2MyIsCisJICAucGF0Y2ggPSBwYXRjaF9hbGM2NjIgfSwKIAl7IC5pZCA9IDB4MTBlYzA2NjMsIC5uYW1lID0gIkFMQzY2MyIsIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAogCXsgLmlkID0gMHgxMGVjMDY2NSwgLm5hbWUgPSAiQUxDNjY1IiwgLnBhdGNoID0gcGF0Y2hfYWxjNjYyIH0sCiAJeyAuaWQgPSAweDEwZWMwNjcwLCAubmFtZSA9ICJBTEM2NzAiLCAucGF0Y2ggPSBwYXRjaF9hbGM2NjIgfSwKQEAgLTU0MzMsMTMgKzU4NDYsMTMgQEAKIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5yZXYgPSAweDEwMDEwMywgLm5hbWUgPSAiQUxDODg5QSIsCiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODUsIC5uYW1lID0gIkFMQzg4NSIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAotCXsgLmlkID0gMHgxMGVjMDg4NywgLm5hbWUgPSAiQUxDODg3IiwgLnBhdGNoID0gcGF0Y2hfYWxjODg4IH0sCisJeyAuaWQgPSAweDEwZWMwODg3LCAubmFtZSA9ICJBTEM4ODciLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODgsIC5yZXYgPSAweDEwMDEwMSwgLm5hbWUgPSAiQUxDMTIwMCIsCiAJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKLQl7IC5pZCA9IDB4MTBlYzA4ODgsIC5uYW1lID0gIkFMQzg4OCIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4OCB9LAorCXsgLmlkID0gMHgxMGVjMDg4OCwgLm5hbWUgPSAiQUxDODg4IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgyIH0sCiAJeyAuaWQgPSAweDEwZWMwODg5LCAubmFtZSA9ICJBTEM4ODkiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4OTIsIC5uYW1lID0gIkFMQzg5MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzY2MiB9LAotCXsgLmlkID0gMHgxMGVjMDg5OSwgLm5hbWUgPSAiQUxDODk5IiwgLnBhdGNoID0gcGF0Y2hfYWxjODk5IH0sCisJeyAuaWQgPSAweDEwZWMwODk5LCAubmFtZSA9ICJBTEM4OTgiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaTMwNTQuYwppbmRleCAyZjU1ZjMyLi42Njc5YTUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgogI2luY2x1ZGUgImhkYV9sb2NhbC5oIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDk4N2UzY2YuLmVkYzJiN2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgpAQCAtOTQsNiArOTUsNyBAQAogCVNUQUNfOTJIRDgzWFhYX1JFRiwKIAlTVEFDXzkySEQ4M1hYWF9QV1JfUkVGLAogCVNUQUNfREVMTF9TMTQsCisJU1RBQ19ERUxMX1ZPU1RST18zNTAwLAogCVNUQUNfOTJIRDgzWFhYX0hQLAogCVNUQUNfOTJIRDgzWFhYX0hQX2NOQjExX0lOVFFVQUQsCiAJU1RBQ19IUF9EVjdfNDAwMCwKQEAgLTE2NTgsNiArMTY2MCwxMiBAQAogCTB4NDBmMDAwZjAsIDB4NDBmMDAwZjAsCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRlbGxfdm9zdHJvXzM1MDBfcGluX2NvbmZpZ3NbMTBdID0geworCTB4MDJhMTEwMjAsIDB4MDIyMTEwMWYsIDB4NDAwMDAwZjAsIDB4OTAxNzAxMTAsCisJMHg0MDAwMDBmMSwgMHg0MDAwMDBmMiwgMHg0MDAwMDBmMywgMHg5MGE2MDE2MCwKKwkweDQwMDAwMGY0LCAweDQwMDAwMGY1LAorfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBocF9kdjdfNDAwMF9waW5fY29uZmlnc1sxMF0gPSB7CiAJMHgwM2ExMjA1MCwgMHgwMzIxMjAxZiwgMHg0MGYwMDBmMCwgMHg5MDE3MDExMCwKIAkweDQwZjAwMGYwLCAweDQwZjAwMGYwLCAweDkwMTcwMTEwLCAweGQ1YTMwMTQwLApAQCAtMTY3NCw2ICsxNjgyLDcgQEAKIAlbU1RBQ185MkhEODNYWFhfUkVGXSA9IHJlZjkyaGQ4M3h4eF9waW5fY29uZmlncywKIAlbU1RBQ185MkhEODNYWFhfUFdSX1JFRl0gPSByZWY5MmhkODN4eHhfcGluX2NvbmZpZ3MsCiAJW1NUQUNfREVMTF9TMTRdID0gZGVsbF9zMTRfcGluX2NvbmZpZ3MsCisJW1NUQUNfREVMTF9WT1NUUk9fMzUwMF0gPSBkZWxsX3Zvc3Ryb18zNTAwX3Bpbl9jb25maWdzLAogCVtTVEFDXzkySEQ4M1hYWF9IUF9jTkIxMV9JTlRRVUFEXSA9IGhwX2NOQjExX2ludHF1YWRfcGluX2NvbmZpZ3MsCiAJW1NUQUNfSFBfRFY3XzQwMDBdID0gaHBfZHY3XzQwMDBfcGluX2NvbmZpZ3MsCiB9OwpAQCAtMTY4Myw2ICsxNjkyLDcgQEAKIAlbU1RBQ185MkhEODNYWFhfUkVGXSA9ICJyZWYiLAogCVtTVEFDXzkySEQ4M1hYWF9QV1JfUkVGXSA9ICJtaWMtcmVmIiwKIAlbU1RBQ19ERUxMX1MxNF0gPSAiZGVsbC1zMTQiLAorCVtTVEFDX0RFTExfVk9TVFJPXzM1MDBdID0gImRlbGwtdm9zdHJvLTM1MDAiLAogCVtTVEFDXzkySEQ4M1hYWF9IUF0gPSAiaHAiLAogCVtTVEFDXzkySEQ4M1hYWF9IUF9jTkIxMV9JTlRRVUFEXSA9ICJocF9jTkIxMV9pbnRxdWFkIiwKIAlbU1RBQ19IUF9EVjdfNDAwMF0gPSAiaHAtZHY3LTQwMDAiLApAQCAtMTY5Niw2ICsxNzA2LDggQEAKIAkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfOTJIRDgzWFhYX1JFRiksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDJiYSwKIAkJICAgICAgInVua25vd24gRGVsbCIsIFNUQUNfREVMTF9TMTQpLAorCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDEwMjgsCisJCSAgICAgICJEZWxsIFZvc3RybyAzNTAwIiwgU1RBQ19ERUxMX1ZPU1RST18zNTAwKSwKIAlTTkRfUENJX1FVSVJLX01BU0soUENJX1ZFTkRPUl9JRF9IUCwgMHhmZjAwLCAweDM2MDAsCiAJCQkgICJIUCIsIFNUQUNfOTJIRDgzWFhYX0hQKSwKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSFAsIDB4MTY1NiwKQEAgLTI5NzIsOCArMjk4NCw5IEBACiBzdGF0aWMgaGRhX25pZF90IGdldF91bmFzc2lnbmVkX2RhYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwogCWludCBqLCBjb25uX2xlbjsKLQloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwloZGFfbmlkX3QgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXSwgZmFsbGJhY2tfZGFjOwogCXVuc2lnbmVkIGludCB3Y2Fwcywgd3R5cGU7CiAKIAljb25uX2xlbiA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGNvbm4sCkBAIC0zMDAxLDEwICszMDE0LDIxIEBACiAJCQlyZXR1cm4gY29ubltqXTsKIAkJfQogCX0KLQkvKiBpZiBhbGwgREFDcyBhcmUgYWxyZWFkeSBhc3NpZ25lZCwgY29ubmVjdCB0byB0aGUgcHJpbWFyeSBEQUMgKi8KKworCS8qIGlmIGFsbCBEQUNzIGFyZSBhbHJlYWR5IGFzc2lnbmVkLCBjb25uZWN0IHRvIHRoZSBwcmltYXJ5IERBQywKKwkgICB1bmxlc3Mgd2UncmUgYXNzaWduaW5nIGEgc2Vjb25kYXJ5IGhlYWRwaG9uZSAqLworCWZhbGxiYWNrX2RhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCWlmIChzcGVjLT5tdWx0aW91dC5ocF9uaWQpIHsKKwkJZm9yIChqID0gMDsgaiA8IGNmZy0+aHBfb3V0czsgaisrKQorCQkJaWYgKGNmZy0+aHBfcGluc1tqXSA9PSBuaWQpIHsKKwkJCQlmYWxsYmFja19kYWMgPSBzcGVjLT5tdWx0aW91dC5ocF9uaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCiAJaWYgKGNvbm5fbGVuID4gMSkgewogCQlmb3IgKGogPSAwOyBqIDwgY29ubl9sZW47IGorKykgewotCQkJaWYgKGNvbm5bal0gPT0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pIHsKKwkJCWlmIChjb25uW2pdID09IGZhbGxiYWNrX2RhYykgewogCQkJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIG5pZCwgMCwKIAkJCQkJCSAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIGopOwogCQkJCWJyZWFrOwpAQCAtMzc3OSw5ICszODAzLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGRpZ19vdXQsIGhkYV9uaWRfdCBkaWdfaW4pCitzdGF0aWMgaW50IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IGRpZ19vdXQgPSAwLCBkaWdfaW4gPSAwOwogCWludCBocF9zd2FwID0gMDsKIAlpbnQgaSwgZXJyOwogCkBAIC0zOTY0LDYgKzM5ODksMjIgQEAKIAlpZiAoc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID4gMikKIAkJc3BlYy0+c3Vycl9zd2l0Y2ggPSAxOwogCisJLyogZmluZCBkaWdpdGFsIG91dCBhbmQgaW4gY29udmVydGVycyAqLworCWZvciAoaSA9IGNvZGVjLT5zdGFydF9uaWQ7IGkgPCBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB3aWRfY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgaSk7CisJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkgeworCQkJc3dpdGNoIChnZXRfd2NhcHNfdHlwZSh3aWRfY2FwcykpIHsKKwkJCWNhc2UgQUNfV0lEX0FVRF9PVVQ6CisJCQkJaWYgKCFkaWdfb3V0KQorCQkJCQlkaWdfb3V0ID0gaTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfV0lEX0FVRF9JTjoKKwkJCQlpZiAoIWRpZ19pbikKKwkJCQkJZGlnX2luID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KIAlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0cykKIAkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBkaWdfb3V0OwogCWlmIChkaWdfaW4gJiYgc3BlYy0+YXV0b2NmZy5kaWdfaW5fcGluKQpAQCAtNDEzMCwyMiArNDE3MSwxNCBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0lOUFVUX0pBQ0sKIAlpbnQgZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7CiAJaW50IGNvbm5lY3Rpdml0eSA9IGdldF9kZWZjZmdfY29ubmVjdChkZWZfY29uZik7Ci0JY2hhciBuYW1lWzMyXTsKLQlpbnQgZXJyOwogCiAJaWYgKGNvbm5lY3Rpdml0eSAmJiBjb25uZWN0aXZpdHkgIT0gQUNfSkFDS19QT1JUX0ZJWEVEKQogCQlyZXR1cm4gMDsKIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIGF0ICVzICVzIEphY2siLAotCQlzbmRfaGRhX2dldF9qYWNrX3R5cGUoZGVmX2NvbmYpLAotCQlzbmRfaGRhX2dldF9qYWNrX2Nvbm5lY3Rpdml0eShkZWZfY29uZiksCi0JCXNuZF9oZGFfZ2V0X2phY2tfbG9jYXRpb24oZGVmX2NvbmYpKTsKLQotCWVyciA9IHNuZF9oZGFfaW5wdXRfamFja19hZGQoY29kZWMsIG5pZCwgdHlwZSwgbmFtZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0jZW5kaWYgLyogQ09ORklHX1NORF9IREFfSU5QVVRfSkFDSyAqLworCXJldHVybiBzbmRfaGRhX2lucHV0X2phY2tfYWRkKGNvZGVjLCBuaWQsIHR5cGUsIE5VTEwpOworI2Vsc2UKIAlyZXR1cm4gMDsKKyNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9JTlBVVF9KQUNLICovCiB9CiAKIHN0YXRpYyBpbnQgc3RhY19hZGRfZXZlbnQoc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQsCkBAIC01Mjc1LDcgKzUzMDgsNyBAQAogCXNwZWMtPmNhcHZvbHMgPSBzdGFjOTI1eF9jYXB2b2xzOwogCXNwZWMtPmNhcHN3cyA9IHN0YWM5MjV4X2NhcHN3czsKIAotCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDgsIDB4Nyk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTU0MTYsNyArNTQ0OSw3IEBACiAJc3BlYy0+bnVtX3B3cnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkNzN4eF9wd3Jfbmlkcyk7CiAJc3BlYy0+cHdyX25pZHMgPSBzdGFjOTJoZDczeHhfcHdyX25pZHM7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgyNSwgMHgyNyk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCiAJaWYgKCFlcnIpIHsKIAkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKQEAgLTU1ODUsOSArNTYxOCw3IEBACiBzdGF0aWMgaW50IHBhdGNoX3N0YWM5MmhkODN4eHgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWM7Ci0JaGRhX25pZF90IGNvbm5bU1RBQzkySEQ4M19EQUNfQ09VTlQgKyAxXTsKIAlpbnQgZXJyOwotCWludCBudW1fZGFjczsKIAogCXNwZWMgID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3BlYyA9PSBOVUxMKQpAQCAtNTYyNywyNiArNTY1OCw4IEBACiAJCXN0YWM5Mnh4X3NldF9jb25maWdfcmVncyhjb2RlYywKIAkJCQlzdGFjOTJoZDgzeHh4X2JyZF90Ymxbc3BlYy0+Ym9hcmRfY29uZmlnXSk7CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKLQljYXNlIDB4MTExZDc2ZDE6Ci0JY2FzZSAweDExMWQ3NmQ5OgotCWNhc2UgMHgxMTFkNzZkZjoKLQljYXNlIDB4MTExZDc2ZTU6Ci0JY2FzZSAweDExMWQ3NjY2OgotCWNhc2UgMHgxMTFkNzY2NzoKLQljYXNlIDB4MTExZDc2Njg6Ci0JY2FzZSAweDExMWQ3NjY5OgotCWNhc2UgMHgxMTFkNzZlMzoKLQljYXNlIDB4MTExZDc2MDQ6Ci0JY2FzZSAweDExMWQ3NmQ0OgotCWNhc2UgMHgxMTFkNzYwNToKLQljYXNlIDB4MTExZDc2ZDU6Ci0JY2FzZSAweDExMWQ3NmU3OgotCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IFNUQUNfOTJIRDgzWFhYX1BXUl9SRUYpCi0JCQlicmVhazsKKwlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnICE9IFNUQUNfOTJIRDgzWFhYX1BXUl9SRUYpCiAJCXNwZWMtPm51bV9wd3JzID0gMDsKLQkJYnJlYWs7Ci0JfQogCiAJY29kZWMtPnBhdGNoX29wcyA9IHN0YWM5Mnh4X3BhdGNoX29wczsKIApAQCAtNTY3Myw3ICs1Njg2LDcgQEAKIAl9CiAjZW5kaWYJCiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxZCwgMCk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTU2ODksMjIgKzU3MDIsNiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCS8qIGRvY2tpbmcgb3V0cHV0IHN1cHBvcnQgKi8KLQludW1fZGFjcyA9IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCAweEYsCi0JCQkJY29ubiwgU1RBQzkySEQ4M19EQUNfQ09VTlQgKyAxKSAtIDE7Ci0JLyogc2tpcCBub24tREFDIGNvbm5lY3Rpb25zICovCi0Jd2hpbGUgKG51bV9kYWNzID49IDAgJiYKLQkJCShnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIGNvbm5bbnVtX2RhY3NdKSkKLQkJCQkJIT0gQUNfV0lEX0FVRF9PVVQpKQotCQludW1fZGFjcy0tOwotCS8qIHNldCBwb3J0IEUgYW5kIEYgdG8gc2VsZWN0IHRoZSBsYXN0IERBQyAqLwotCWlmIChudW1fZGFjcyA+PSAwKSB7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4RSwgMCwKLQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBudW1fZGFjcyk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4RiwgMCwKLQkJCUFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBudW1fZGFjcyk7Ci0JfQotCiAJY29kZWMtPnByb2Nfd2lkZ2V0X2hvb2sgPSBzdGFjOTJoZF9wcm9jX2hvb2s7CiAKIAlyZXR1cm4gMDsKQEAgLTYwMTAsNyArNjAwNyw3IEBACiAKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkcyA9IHNwZWMtPmRhY19uaWRzOwogCi0JZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMsIDB4MjEsIDApOworCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKIAlpZiAoIWVycikgewogCQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiBObyBhdXRvLWNvbmZpZyBpcyAiCkBAIC02MTE5LDcgKzYxMTYsNyBAQAogCiAJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5kYWNfbmlkczsKIAkKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgwOCwgMHgwOSk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTYyNDQsNyArNjI0MSw3IEBACiAJc3BlYy0+YWxvb3BiYWNrX3NoaWZ0ID0gMDsKIAlzcGVjLT5lYXBkX3N3aXRjaCA9IDE7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxZSwgMHgyMCk7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmICghZXJyKSB7CiAJCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IE5vIGF1dG8tY29uZmlnIGlzICIKQEAgLTYzNjksNyArNjM2Niw3IEBACiAJCWJyZWFrOwogCX0KIAotCWVyciA9IHN0YWM5Mnh4X3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjLCAweDFmLCAweDIwKTsKKwllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYyk7CiAJaWYgKCFlcnIpIHsKIAkJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogTm8gYXV0by1jb25maWcgaXMgIgpAQCAtNjQ3NCw3ICs2NDcxLDcgQEAKIAlzcGVjLT5jYXB2b2xzID0gc3RhYzk4NzJfY2Fwdm9sczsKIAlzcGVjLT5jYXBzd3MgPSBzdGFjOTg3Ml9jYXBzd3M7CiAKLQllcnIgPSBzdGFjOTJ4eF9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgMHgxMCwgMHgxMik7CisJZXJyID0gc3RhYzkyeHhfcGFyc2VfYXV0b19jb25maWcoY29kZWMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXN0YWM5Mnh4X2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY1NzksNiArNjU3NiwxOCBAQAogCXsgLmlkID0gMHgxMTFkNzZlMywgLm5hbWUgPSAiOTJIRDk4QlhYIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyaGQ4M3h4eH0sCiAJeyAuaWQgPSAweDExMWQ3NmU1LCAubmFtZSA9ICI5MkhEOTlCWFgiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTJoZDgzeHh4fSwKIAl7IC5pZCA9IDB4MTExZDc2ZTcsIC5uYW1lID0gIjkySEQ5MEJYWCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlOCwgLm5hbWUgPSAiOTJIRDY2QjFYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlOSwgLm5hbWUgPSAiOTJIRDY2QjJYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYSwgLm5hbWUgPSAiOTJIRDY2QjNYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYiwgLm5hbWUgPSAiOTJIRDY2QzFYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlYywgLm5hbWUgPSAiOTJIRDY2QzJYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZCwgLm5hbWUgPSAiOTJIRDY2QzNYNSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZSwgLm5hbWUgPSAiOTJIRDY2QjFYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZlZiwgLm5hbWUgPSAiOTJIRDY2QjJYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMCwgLm5hbWUgPSAiOTJIRDY2QjNYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMSwgLm5hbWUgPSAiOTJIRDY2QzFYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMiwgLm5hbWUgPSAiOTJIRDY2QzJYMyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MmhkODN4eHh9LAorCXsgLmlkID0gMHgxMTFkNzZmMywgLm5hbWUgPSAiOTJIRDY2QzMvNjUiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTJoZDgzeHh4fSwKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCA0ZWJmYmQ4Li40MzFjMGQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCkBAIC0xNTA2LDM5ICsxNTA3LDQ5IEBACiAJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJc3RydWN0IGhkYV9wY20gKmluZm8gPSBzcGVjLT5wY21fcmVjOwogCi0JY29kZWMtPm51bV9wY21zID0gMTsKKwljb2RlYy0+bnVtX3BjbXMgPSAwOwogCWNvZGVjLT5wY21faW5mbyA9IGluZm87CiAKLQlzbnByaW50ZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2csIHNpemVvZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cpLAotCQkgIiVzIEFuYWxvZyIsIGNvZGVjLT5jaGlwX25hbWUpOwotCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2c7CisJaWYgKHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzIHx8IHNwZWMtPm51bV9hZGNfbmlkcykgeworCQlzbnByaW50ZihzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2csCisJCQkgc2l6ZW9mKHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyksCisJCQkgIiVzIEFuYWxvZyIsIGNvZGVjLT5jaGlwX25hbWUpOworCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOwogCi0JaWYgKCFzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrKQotCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0gJnZpYV9wY21fYW5hbG9nX3BsYXliYWNrOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9Ci0JCSpzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQotCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uY2hhbm5lbHNfbWF4ID0KLQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzOworCQlpZiAoc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpIHsKKwkJCWlmICghc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjaykKKwkJCQlzcGVjLT5zdHJlYW1fYW5hbG9nX3BsYXliYWNrID0KKwkJCQkJJnZpYV9wY21fYW5hbG9nX3BsYXliYWNrOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCQkqc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjazsKKwkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQorCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWxzX21heCA9CisJCQkJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzOworCQl9CiAKLQlpZiAoIXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSkgewotCQlpZiAoc3BlYy0+ZHluX2FkY19zd2l0Y2gpCi0JCQlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPQotCQkJCSZ2aWFfcGNtX2R5bl9hZGNfYW5hbG9nX2NhcHR1cmU7Ci0JCWVsc2UKLQkJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9ICZ2aWFfcGNtX2FuYWxvZ19jYXB0dXJlOwotCX0KLQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9Ci0JCSpzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmU7Ci0JaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjX25pZHNbMF07Ci0JaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCkKLQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcyA9Ci0JCQlzcGVjLT5udW1fYWRjX25pZHM7Ci0KLQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgeworCQlpZiAoIXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSkgeworCQkJaWYgKHNwZWMtPmR5bl9hZGNfc3dpdGNoKQorCQkJCXNwZWMtPnN0cmVhbV9hbmFsb2dfY2FwdHVyZSA9CisJCQkJCSZ2aWFfcGNtX2R5bl9hZGNfYW5hbG9nX2NhcHR1cmU7CisJCQllbHNlCisJCQkJc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlID0KKwkJCQkJJnZpYV9wY21fYW5hbG9nX2NhcHR1cmU7CisJCX0KKwkJaWYgKHNwZWMtPm51bV9hZGNfbmlkcykgeworCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJCSpzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmU7CisJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPQorCQkJCXNwZWMtPmFkY19uaWRzWzBdOworCQkJaWYgKCFzcGVjLT5keW5fYWRjX3N3aXRjaCkKKwkJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zID0KKwkJCQkJc3BlYy0+bnVtX2FkY19uaWRzOworCQl9CiAJCWNvZGVjLT5udW1fcGNtcysrOwogCQlpbmZvKys7CisJfQorCisJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkIHx8IHNwZWMtPmRpZ19pbl9uaWQpIHsKIAkJc25wcmludGYoc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCwKIAkJCSBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfZGlnaXRhbCksCiAJCQkgIiVzIERpZ2l0YWwiLCBjb2RlYy0+Y2hpcF9uYW1lKTsKQEAgLTE1NjIsMTcgKzE1NzMsMTkgQEAKIAkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9CiAJCQkJc3BlYy0+ZGlnX2luX25pZDsKIAkJfQorCQljb2RlYy0+bnVtX3BjbXMrKzsKKwkJaW5mbysrOwogCX0KIAogCWlmIChzcGVjLT5ocF9kYWNfbmlkKSB7Ci0JCWNvZGVjLT5udW1fcGNtcysrOwotCQlpbmZvKys7CiAJCXNucHJpbnRmKHNwZWMtPnN0cmVhbV9uYW1lX2hwLCBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfaHApLAogCQkJICIlcyBIUCIsIGNvZGVjLT5jaGlwX25hbWUpOwogCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfaHA7CiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IHZpYV9wY21faHBfcGxheWJhY2s7CiAJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPQogCQkJc3BlYy0+aHBfZGFjX25pZDsKKwkJY29kZWMtPm51bV9wY21zKys7CisJCWluZm8rKzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNjg4LDEzICszNzAxLDggQEAKIHN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTgxMihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaW11eF9pc19zbWl4ZXIgPQotCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxMywgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDB4MDApID09IDM7CiAJdW5zaWduZWQgaW50IHBhcm07CiAJdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0JLyogTVVYMTAgKDFlaCkgPSBzdGVyZW8gbWl4ZXIgKi8KLQlpbXV4X2lzX3NtaXhlciA9Ci0Jc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFlLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMHgwMCkgPT0gNTsKIAkvKiBpbnB1dHMgKi8KIAkvKiBQVyA1LzYvNyAoMjloLzJhaC8yYmgpICovCiAJcGFybSA9IEFDX1BXUlNUX0QzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvYWs0eHh4LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYwppbmRleCA5MGQ1NjBjLi4zOTgxODIzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9hazR4eHguYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlICJpY2UxNzEyLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKaW5kZXggMGNjYzBlYi4uNDQ0NDZmMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwpAQCAtNTQsNyArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTI3NDgsOCArMjc0OCw5IEBACiAJaWYgKCFjLT5ub19tcHU0MDEpIHsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfSUNFMTcxMiwKIAkJCUlDRVJFRyhpY2UsIE1QVTFfQ1RSTCksCi0JCQkoYy0+bXB1NDAxXzFfaW5mb19mbGFncyB8IE1QVTQwMV9JTkZPX0lOVEVHUkFURUQpLAotCQkJaWNlLT5pcnEsIDAsICZpY2UtPnJtaWRpWzBdKTsKKwkJCWMtPm1wdTQwMV8xX2luZm9fZmxhZ3MgfAorCQkJTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJLTEsICZpY2UtPnJtaWRpWzBdKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCQlyZXR1cm4gZXJyOwpAQCAtMjc2NCw4ICsyNzY1LDkgQEAKIAkJCS8qICAybmQgcG9ydCB1c2VkICAqLwogCQkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKIAkJCQlJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLAotCQkJCShjLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCksCi0JCQkJaWNlLT5pcnEsIDAsICZpY2UtPnJtaWRpWzFdKTsKKwkJCQljLT5tcHU0MDFfMl9pbmZvX2ZsYWdzIHwKKwkJCQlNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJLTEsICZpY2UtPnJtaWRpWzFdKTsKIAogCQkJaWYgKGVyciA8IDApIHsKIAkJCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IGMyYjdmOGIuLjQzNTNlNzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwLmMgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwppbmRleCA2YTViMzg3Li4xMTcxOGI0OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KQEAgLTQyLDYgKzQyLDEyIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCisjaWZkZWYgQ09ORklHX0tWTV9HVUVTVAorI2luY2x1ZGUgPGxpbnV4L2t2bV9wYXJhLmg+CisjZWxzZQorI2RlZmluZSBrdm1fcGFyYV9hdmFpbGFibGUoKSAoMCkKKyNlbmRpZgorCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCA4MjgwMUFBLDgyOTAxQUIsaTgxMCxpODIwLGk4MzAsaTg0MCxpODQ1LE1YNDQwOyBTaVMgNzAxMjsgQWxpIDU0NTUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc3LDYgKzgzLDcgQEAKIHN0YXRpYyBpbnQgYnVnZ3lfaXJxID0gLTE7IC8qIGF1dG8tY2hlY2sgKi8KIHN0YXRpYyBpbnQgeGJveDsKIHN0YXRpYyBpbnQgc3BkaWZfYWNsaW5rID0gLTE7CitzdGF0aWMgaW50IGluc2lkZV92bSA9IC0xOwogCiBtb2R1bGVfcGFyYW0oaW5kZXgsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgc291bmRjYXJkLiIpOwpAQCAtOTQsNiArMTAxLDggQEAKIE1PRFVMRV9QQVJNX0RFU0MoeGJveCwgIlNldCB0byAxIGZvciBYYm94LCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBBQyc5NyBjb2RlYyBkZXRlY3Rpb24uIik7CiBtb2R1bGVfcGFyYW0oc3BkaWZfYWNsaW5rLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9hY2xpbmssICJTL1BESUYgb3ZlciBBQy1saW5rLiIpOworbW9kdWxlX3BhcmFtKGluc2lkZV92bSwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluc2lkZV92bSwgIktWTS9QYXJhbGxlbHMgb3B0aW1pemF0aW9uLiIpOwogCiAvKiBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiBzdGF0aWMgaW50IGVuYWJsZTsKQEAgLTQwMCw2ICs0MDksNyBAQAogCXVuc2lnbmVkIGJ1Z2d5X2lycTogMTsJCS8qIHdvcmthcm91bmQgZm9yIGJ1Z2d5IG1vYm9zICovCiAJdW5zaWduZWQgeGJveDogMTsJCS8qIHdvcmthcm91bmQgZm9yIFhib3ggQUMnOTcgZGV0ZWN0aW9uICovCiAJdW5zaWduZWQgYnVnZ3lfc2VtYXBob3JlOiAxOwkvKiB3b3JrYXJvdW5kIGZvciBidWdneSBjb2RlYyBzZW1hcGhvcmUgKi8KKwl1bnNpZ25lZCBpbnNpZGVfdm06IDE7CQkvKiBlbmFibGUgVk0gb3B0aW1pemF0aW9uICovCiAKIAlpbnQgc3BkaWZfaWR4OwkvKiBTUERJRiBCQVIgaW5kZXg7ICpfU1BCQVIgb3IgLTEgaWYgdXNlIFBDTU9VVCAqLwogCXVuc2lnbmVkIGludCBzZG1fc2F2ZWQ7CS8qIFNETSByZWcgdmFsdWUgKi8KQEAgLTEwNjUsOCArMTA3NSwxOCBAQAogCQkJdWRlbGF5KDEwKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChjaXYgPT0gaWdldGJ5dGUoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgSUNIX1JFR19PRkZfQ0lWKSAmJgotCQkgICAgcHRyMSA9PSBpZ2V0d29yZChjaGlwLCBpY2hkZXYtPnJlZ19vZmZzZXQgKyBpY2hkZXYtPnJvZmZfcGljYikpCisJCWlmIChjaXYgIT0gaWdldGJ5dGUoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgSUNIX1JFR19PRkZfQ0lWKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElPIHJlYWQgb3BlcmF0aW9uIGlzIHZlcnkgZXhwZW5zaXZlIGluc2lkZSB2aXJ0dWFsIG1hY2hpbmUKKwkJICogYXMgaXQgaXMgZW11bGF0ZWQuIFRoZSBwcm9iYWJpbGl0eSB0aGF0IHN1YnNlcXVlbnQgUElDQiByZWFkCisJCSAqIHdpbGwgcmV0dXJuIGRpZmZlcmVudCByZXN1bHQgaXMgaGlnaCBlbm91Z2ggdG8gbG9vcCB0aWxsCisJCSAqIHRpbWVvdXQgaGVyZS4KKwkJICogU2FtZSBDSVYgaXMgc3RyaWN0IGVub3VnaCBjb25kaXRpb24gdG8gYmUgc3VyZSB0aGF0IFBJQ0IKKwkJICogaXMgdmFsaWQgaW5zaWRlIFZNIG9uIGVtdWxhdGVkIGNhcmQuICovCisJCWlmIChjaGlwLT5pbnNpZGVfdm0pCisJCQlicmVhazsKKwkJaWYgKHB0cjEgPT0gaWdldHdvcmQoY2hpcCwgaWNoZGV2LT5yZWdfb2Zmc2V0ICsgaWNoZGV2LT5yb2ZmX3BpY2IpKQogCQkJYnJlYWs7CiAJfSB3aGlsZSAodGltZW91dC0tKTsKIAlwdHIgPSBpY2hkZXYtPmxhc3RfcG9zOwpAQCAtMjkxNyw2ICsyOTM3LDQ1IEBACiAJSUNIX1BDUiwgSUNIX1NDUiwgSUNIX1NJU19UQ1IKIH07CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9pbnNpZGVfdm0oc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlpbnQgcmVzdWx0ICA9IGluc2lkZV92bTsKKwljaGFyICptc2cgICA9IE5VTEw7CisKKwkvKiBjaGVjayBtb2R1bGUgcGFyYW1ldGVyIGZpcnN0IChvdmVycmlkZSBkZXRlY3Rpb24pICovCisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCW1zZyA9IHJlc3VsdCA/ICJlbmFibGUgKGZvcmNlZCkgVk0iIDogImRpc2FibGUgKGZvcmNlZCkgVk0iOworCQlnb3RvIGZpbmk7CisJfQorCisJLyogZGV0ZWN0IEtWTSBhbmQgUGFyYWxsZWxzIHZpcnR1YWwgZW52aXJvbm1lbnRzICovCisJcmVzdWx0ID0ga3ZtX3BhcmFfYXZhaWxhYmxlKCk7CisjaWZkZWYgWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUgorCXJlc3VsdCA9IHJlc3VsdCB8fCBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfSFlQRVJWSVNPUik7CisjZW5kaWYKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBmaW5pOworCisJLyogY2hlY2sgZm9yIGtub3duIChlbXVsYXRlZCkgZGV2aWNlcyAqLworCWlmIChwY2ktPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxYWY0ICYmCisJICAgIHBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDExMDApIHsKKwkJLyogS1ZNIGVtdWxhdGVkIHNvdW5kLCBQQ0kgU1NJRDogMWFmNDoxMTAwICovCisJCW1zZyA9ICJlbmFibGUgS1ZNIjsKKwl9IGVsc2UgaWYgKHBjaS0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDFhYjgpIHsKKwkJLyogUGFyYWxsZWxzIFZNIGVtdWxhdGVkIHNvdW5kLCBQQ0kgU1NJRDogMWFiODp4eHh4ICovCisJCW1zZyA9ICJlbmFibGUgUGFyYWxsZWxzIFZNIjsKKwl9IGVsc2UgeworCQltc2cgPSAiZGlzYWJsZSAodW5rbm93biBvciBWVC1kKSBWTSI7CisJCXJlc3VsdCA9IDA7CisJfQorCitmaW5pOgorCWlmIChtc2cgIT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW50ZWw4eDA6ICVzIG9wdGltaXphdGlvblxuIiwgbXNnKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlbDh4MF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCQkgc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgZGV2aWNlX3R5cGUsCkBAIC0yOTg0LDYgKzMwNDMsOCBAQAogCWlmICh4Ym94KQogCQljaGlwLT54Ym94ID0gMTsKIAorCWNoaXAtPmluc2lkZV92bSA9IHNuZF9pbnRlbDh4MF9pbnNpZGVfdm0ocGNpKTsKKwogCWlmIChwY2ktPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCiAJICAgIHBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfNDQwTVgpCiAJCWNoaXAtPmZpeF9ub2NhY2hlID0gMTsgLyogZW5hYmxlIHdvcmthcm91bmQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCA3YzE2MTY0Li4wZjcwNDFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCmluZGV4IGZjMWQ1NzNjLi44NDE4NjRiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGEuYyBiL3NvdW5kL3BjaS9sb2xhL2xvbGEuYwppbmRleCAzZTkyZTViLi45MjQxNjhlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYS5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDAzNzgxMjYuLjg2M2M4YmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTI4MjAsOCArMjgyMCw4IEBACiAJLyogVE9ETyBlbmFibGUgTUlESSBJUlEgYW5kIEkvTyAqLwogCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKIAkJCQkgIGNoaXAtPmlvYmFzZSArIE1QVTQwMV9EQVRBX1BPUlQsCi0JCQkJICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCSAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpOworCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX0lSUV9IT09LLAorCQkJCSAgLTEsICZjaGlwLT5ybWlkaSk7CiAJaWYgKGVyciA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm8zOiBubyBNSURJIHN1cHBvcnQuXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggZGJlZTU5OS4uYTBiZDFkOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwppbmRleCBiZjI2OTZhLi5iZmJkYzkxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgIm1peGFydC5oIgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwppbmRleCA4M2VhN2E3Li5jNmM0NWQ5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYworKysgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMKaW5kZXggMjE4ZDk4NS4uNWYzYTEzZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW4uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKaW5kZXggZjUxNjRiMS4uNTIxZWFlNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCA4MjMxMWZjLi45MmUyZDY3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTY3OCwxNSArNjc5LDE1IEBACiAJCWdvdG8gZXJyX2NhcmQ7CiAKIAlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIChNSURJX09VVFBVVCB8IE1JRElfSU5QVVQpKSB7Ci0JCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzID0gTVBVNDAxX0lORk9fSU5URUdSQVRFRDsKKwkJdW5zaWduZWQgaW50IGluZm9fZmxhZ3MgPQorCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgfCBNUFU0MDFfSU5GT19JUlFfSE9PSzsKIAkJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiBNSURJX09VVFBVVCkKIAkJCWluZm9fZmxhZ3MgfD0gTVBVNDAxX0lORk9fT1VUUFVUOwogCQlpZiAoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIE1JRElfSU5QVVQpCiAJCQlpbmZvX2ZsYWdzIHw9IE1QVTQwMV9JTkZPX0lOUFVUOwogCQllcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19DTUlQQ0ksCiAJCQkJCSAgY2hpcC0+YWRkciArIE9YWUdFTl9NUFU0MDEsCi0JCQkJCSAgaW5mb19mbGFncywgMCwgMCwKLQkJCQkJICAmY2hpcC0+bWlkaSk7CisJCQkJCSAgaW5mb19mbGFncywgLTEsICZjaGlwLT5taWRpKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycl9jYXJkOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYyBiL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYwppbmRleCA3NzNkYjc5Li40MTQ5YTBjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi92aXJ0dW9zby5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCmluZGV4IDMyZDA5NmMuLjg0MzNhYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfcGNtMTc5eC5jCkBAIC0xMDc0LDYgKzEwNzQsNyBAQAogCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAogCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAogCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yIHwKKwkJCSBDQVBUVVJFXzFfRlJPTV9TUERJRiB8CiAJCQkgQUM5N19GTUlDX1NXSVRDSCwKIAkuZGFjX2NoYW5uZWxzX3BjbSA9IDIsCiAJLmRhY19jaGFubmVsc19taXhlciA9IDIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IDA0NjU3OGQuLjU2YTUyNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggMTdjYjEyMy4uZWMxNTg3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCBlMzRhZTE0Li5kY2JlZGQzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC05OCw2ICs5OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpAQCAtMjEwOSw3ICsyMTEwLDcgQEAKIAkJdmFsID0gbXB1X3BvcnRbZGV2XTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgUENJX0VYVF9NUFVfQmFzZSwgdmFsKTsKIAkJZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfUklQVElERSwKLQkJCQkJICB2YWwsIDAsIGNoaXAtPmlycSwgMCwKKwkJCQkJICB2YWwsIE1QVTQwMV9JTkZPX0lSUV9IT09LLCAtMSwKIAkJCQkJICAmY2hpcC0+cm1pZGkpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IDZiZTc3YTIuLjIxYmNiNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC03NCw3ICs3NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2LmMgYi9zb3VuZC9wY2kvcm1lOTYuYwppbmRleCA0MDllNWI4Li40NTg1Yzk3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTYuYworKysgYi9zb3VuZC9wY2kvcm1lOTYuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwppbmRleCAxYzZkMWUxLi5mMmEzNzU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTUxLDcgKzE1MSw3IEBACiAjZGVmaW5lIEhEU1BfUFJPR1JBTQkgICAgICAgIDB4MDIwCiAjZGVmaW5lIEhEU1BfQ09ORklHX01PREVfMAkweDA0MAogI2RlZmluZSBIRFNQX0NPTkZJR19NT0RFXzEJMHgwODAKLSNkZWZpbmUgSERTUF9WRVJTSU9OX0JJVAkweDEwMAorI2RlZmluZSBIRFNQX1ZFUlNJT05fQklUCSgweDEwMCB8IEhEU1BfU19MT0FEKQogI2RlZmluZSBIRFNQX0JJR0VORElBTl9NT0RFICAgICAweDIwMAogI2RlZmluZSBIRFNQX1JEX01VTFRJUExFICAgICAgICAweDQwMAogI2RlZmluZSBIRFNQXzk2NTJfRU5BQkxFX01JWEVSICAweDgwMApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggNDkzZTM5NC4uZTc2MGFkYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CkBAIC01MjAsMTYgKzUyMCw5IEBACiAjZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0JZVEVTIChIRFNQTV9NQVhfQ0hBTk5FTFMgKiBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUykKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCi0vKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KLSNkZWZpbmUgSERTUE1fTUFESV9BTkNJRU5UX1JFVgkyMDQKLSNkZWZpbmUgSERTUE1fTUFESV9PTERfUkVWCTIwNwotI2RlZmluZSBIRFNQTV9NQURJX1JFVgkJMjEwCiAjZGVmaW5lIEhEU1BNX1JBWURBVF9SRVYJMjExCiAjZGVmaW5lIEhEU1BNX0FJT19SRVYJCTIxMgogI2RlZmluZSBIRFNQTV9NQURJRkFDRV9SRVYJMjEzCi0jZGVmaW5lIEhEU1BNX0FFU19SRVYJCTI0MAotI2RlZmluZSBIRFNQTV9BRVMzMl9SRVYJCTIzNAotI2RlZmluZSBIRFNQTV9BRVMzMl9PTERfUkVWCTIzMwogCiAvKiBzcGVlZCBmYWN0b3IgbW9kZXMgKi8KICNkZWZpbmUgSERTUE1fU1BFRURfU0lOR0xFIDAKQEAgLTEyNDEsMTAgKzEyMzQsMzAgQEAKIAlyZXR1cm4gcmF0ZTsKIH0KIAorLyogcmV0dXJuIGxhdGVuY3kgaW4gc2FtcGxlcyBwZXIgcGVyaW9kICovCitzdGF0aWMgaW50IGhkc3BtX2dldF9sYXRlbmN5KHN0cnVjdCBoZHNwbSAqaGRzcG0pCit7CisJaW50IG47CisKKwluID0gaGRzcG1fZGVjb2RlX2xhdGVuY3koaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJLyogU3BlY2lhbCBjYXNlIGZvciBuZXcgUk1FIGNhcmRzIHdpdGggMzIgc2FtcGxlcyBwZXJpb2Qgc2l6ZS4KKwkgKiBUaGUgdGhyZWUgbGF0ZW5jeSBiaXRzIGluIHRoZSBjb250cm9sIHJlZ2lzdGVyCisJICogKEhEU1BfTGF0ZW5jeU1hc2spIGVuY29kZSBsYXRlbmN5IHZhbHVlcyBvZiA2NCBzYW1wbGVzIGFzCisJICogMCwgMTI4IHNhbXBsZXMgYXMgMSAuLi4gNDA5NiBzYW1wbGVzIGFzIDYuIEZvciBvbGQgY2FyZHMsIDcKKwkgKiBkZW5vdGVzIDgxOTIgc2FtcGxlcywgYnV0IG9uIG5ldyBjYXJkcyBsaWtlIFJheURBVCBvciBBSU8sCisJICogaXQgY29ycmVzcG9uZHMgdG8gMzIgc2FtcGxlcy4KKwkgKi8KKwlpZiAoKDcgPT0gbikgJiYgKFJheURBVCA9PSBoZHNwbS0+aW9fdHlwZSB8fCBBSU8gPT0gaGRzcG0tPmlvX3R5cGUpKQorCQluID0gLTE7CisKKwlyZXR1cm4gMSA8PCAobiArIDYpOworfQorCiAvKiBMYXRlbmN5IGZ1bmN0aW9uICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRzcG1fY29tcHV0ZV9wZXJpb2Rfc2l6ZShzdHJ1Y3QgaGRzcG0gKmhkc3BtKQogewotCWhkc3BtLT5wZXJpb2RfYnl0ZXMgPSAxIDw8ICgoaGRzcG1fZGVjb2RlX2xhdGVuY3koaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpICsgOCkpOworCWhkc3BtLT5wZXJpb2RfYnl0ZXMgPSA0ICogaGRzcG1fZ2V0X2xhdGVuY3koaGRzcG0pOwogfQogCiAKQEAgLTEzMDMsMTIgKzEzMTYsMjcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnMtPmxvY2spOwogCi0JZnJhbWVzID4+PSA3OwotCW4gPSAwOwotCXdoaWxlIChmcmFtZXMpIHsKLQkJbisrOwotCQlmcmFtZXMgPj49IDE7CisJaWYgKDMyID09IGZyYW1lcykgeworCQkvKiBTcGVjaWFsIGNhc2UgZm9yIG5ldyBSTUUgY2FyZHMgbGlrZSBSYXlEQVQvQUlPIHdoaWNoCisJCSAqIHN1cHBvcnQgcGVyaW9kIHNpemVzIG9mIDMyIHNhbXBsZXMuIFNpbmNlIGxhdGVuY3kgaXMKKwkJICogZW5jb2RlZCBpbiB0aGUgdGhyZWUgYml0cyBvZiBIRFNQX0xhdGVuY3lNYXNrLCB3ZSBjYW4gb25seQorCQkgKiBoYXZlIHZhbHVlcyBmcm9tIDAgLi4gNy4gV2hpbGUgMCBzdGlsbCBtZWFucyA2NCBzYW1wbGVzIGFuZAorCQkgKiA2IHJlcHJlc2VudHMgNDA5NiBzYW1wbGVzIG9uIGFsbCBjYXJkcywgNyByZXByZXNlbnRzIDgxOTIKKwkJICogb24gb2xkZXIgY2FyZHMgYW5kIDMyIHNhbXBsZXMgb24gbmV3IGNhcmRzLgorCQkgKgorCQkgKiBJbiBvdGhlciB3b3JkcywgcGVyaW9kIHNpemUgaW4gc2FtcGxlcyBpcyBjYWxjdWxhdGVkIGJ5CisJCSAqIDJeKG4rNikgd2l0aCBuIHJhbmdpbmcgZnJvbSAwIC4uIDcuCisJCSAqLworCQluID0gNzsKKwl9IGVsc2UgeworCQlmcmFtZXMgPj49IDc7CisJCW4gPSAwOworCQl3aGlsZSAoZnJhbWVzKSB7CisJCQluKys7CisJCQlmcmFtZXMgPj49IDE7CisJCX0KIAl9CisKIAlzLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQTV9MYXRlbmN5TWFzazsKIAlzLT5jb250cm9sX3JlZ2lzdGVyIHw9IGhkc3BtX2VuY29kZV9sYXRlbmN5KG4pOwogCkBAIC00ODAxLDggKzQ4MjksNyBAQAogCiAJc25kX2lwcmludGYoYnVmZmVyLCAiLS0tIFNldHRpbmdzIC0tLVxuIik7CiAKLQl4ID0gMSA8PCAoNiArIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYKLQkJCQkJCQlIRFNQTV9MYXRlbmN5TWFzaykpOworCXggPSBoZHNwbV9nZXRfbGF0ZW5jeShoZHNwbSk7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsCiAJCSJTaXplIChMYXRlbmN5KTogJWQgc2FtcGxlcyAoMiBwZXJpb2RzIG9mICVsdSBieXRlcylcbiIsCkBAIC00OTY1LDggKzQ5OTIsNyBAQAogCiAJc25kX2lwcmludGYoYnVmZmVyLCAiLS0tIFNldHRpbmdzIC0tLVxuIik7CiAKLQl4ID0gMSA8PCAoNiArIGhkc3BtX2RlY29kZV9sYXRlbmN5KGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYKLQkJCQlIRFNQTV9MYXRlbmN5TWFzaykpOworCXggPSBoZHNwbV9nZXRfbGF0ZW5jeShoZHNwbSk7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsCiAJCSAgICAiU2l6ZSAoTGF0ZW5jeSk6ICVkIHNhbXBsZXMgKDIgcGVyaW9kcyBvZiAlbHUgYnl0ZXMpXG4iLApAQCAtNTY3MiwxOSArNTY5OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemVzX29sZFtdID0gewotCTY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBlcmlvZF9zaXplc19uZXdbXSA9IHsKLQkzMiwgNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYKLX07Ci0KLS8qIFJheURBVCBhbmQgQUlPIGFsd2F5cyBoYXZlIGEgYnVmZmVyIG9mIDE2Mzg0IHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXNbXSA9IHsKLQkxNjM4NAotfTsKLQogc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9oZHNwbV9wbGF5YmFja19zdWJpbmZvID0gewogCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAogCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CkBAIC01NzAzLDggKzU3MTYsOCBAQAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQogCSAgICBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BNX01BWF9DSEFOTkVMUywKLQkucGVyaW9kX2J5dGVzX21pbiA9ICg2NCAqIDQpLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDQwOTYgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKKwkucGVyaW9kX2J5dGVzX21pbiA9ICgzMiAqIDQpLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDgxOTIgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKIAkucGVyaW9kc19taW4gPSAyLAogCS5wZXJpb2RzX21heCA9IDUxMiwKIAkuZmlmb19zaXplID0gMApAQCAtNTcyOCwzMSArNTc0MSwxMyBAQAogCS5jaGFubmVsc19tYXggPSBIRFNQTV9NQVhfQ0hBTk5FTFMsCiAJLmJ1ZmZlcl9ieXRlc19tYXggPQogCSAgICBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BNX01BWF9DSEFOTkVMUywKLQkucGVyaW9kX2J5dGVzX21pbiA9ICg2NCAqIDQpLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDQwOTYgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKKwkucGVyaW9kX2J5dGVzX21pbiA9ICgzMiAqIDQpLAorCS5wZXJpb2RfYnl0ZXNfbWF4ID0gKDgxOTIgKiA0KSAqIEhEU1BNX01BWF9DSEFOTkVMUywKIAkucGVyaW9kc19taW4gPSAyLAogCS5wZXJpb2RzX21heCA9IDUxMiwKIAkuZmlmb19zaXplID0gMAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfb2xkID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX3NpemVzX29sZCksCi0JLmxpc3QgPSBwZXJpb2Rfc2l6ZXNfb2xkLAotCS5tYXNrID0gMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfbmV3ID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocGVyaW9kX3NpemVzX25ldyksCi0JLmxpc3QgPSBwZXJpb2Rfc2l6ZXNfbmV3LAotCS5tYXNrID0gMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c19yYXlkYXRfaW9fYnVmZmVyID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXMpLAotCS5saXN0ID0gcmF5ZGF0X2Fpb19idWZmZXJfc2l6ZXMsCi0JLm1hc2sgPSAwCi19OwotCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9od19ydWxlX2luX2NoYW5uZWxzX3JhdGUoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCiB7CkBAIC01OTUzLDI2ICs1OTQ4LDI5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CiAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKIAogCXN3aXRjaCAoaGRzcG0tPmlvX3R5cGUpIHsKIAljYXNlIEFJTzoKIAljYXNlIFJheURBVDoKLQkJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1NJWkUsCi0JCQkJJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19uZXcpOwotCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKLQkJCQkmaHdfY29uc3RyYWludHNfcmF5ZGF0X2lvX2J1ZmZlcik7Ci0KKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKKwkJCQkJICAgICAzMiwgNDA5Nik7CisJCS8qIFJheURBVCAmIEFJTyBoYXZlIGEgZml4ZWQgYnVmZmVyIG9mIDE2Mzg0IHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKKwkJCQkJICAgICAxNjM4NCwgMTYzODQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCi0JCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSZod19jb25zdHJhaW50c19wZXJpb2Rfc2l6ZXNfb2xkKTsKKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKKwkJCQkJICAgICA2NCwgODE5Mik7CisJCWJyZWFrOwogCX0KIAogCWlmIChBRVMzMiA9PSBoZHNwbS0+aW9fdHlwZSkgeworCQlydW50aW1lLT5ody5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV9LTk9UOwogCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkmaGRzcG1faHdfY29uc3RyYWludHNfYWVzMzJfc2FtcGxlX3JhdGVzKTsKIAl9IGVsc2UgewpAQCAtNjAyNSwyNCArNjAyMywyOCBAQAogCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCiAJc25kX3BjbV9od19jb25zdHJhaW50X21zYml0cyhydW50aW1lLCAwLCAzMiwgMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSk7CisKIAlzd2l0Y2ggKGhkc3BtLT5pb190eXBlKSB7CiAJY2FzZSBBSU86CiAJY2FzZSBSYXlEQVQ6Ci0JICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSAgICAgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19uZXcpOwotCSAgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKLQkJCQkgICAgICZod19jb25zdHJhaW50c19yYXlkYXRfaW9fYnVmZmVyKTsKLQkgIGJyZWFrOworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAorCQkJCQkgICAgIDMyLCA0MDk2KTsKKwkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAorCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwKKwkJCQkJICAgICAxNjM4NCwgMTYzODQpOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JICBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCSAgICAgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9zaXplc19vbGQpOworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAorCQkJCQkgICAgIDY0LCA4MTkyKTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKEFFUzMyID09IGhkc3BtLT5pb190eXBlKSB7CisJCXJ1bnRpbWUtPmh3LnJhdGVzIHw9IFNORFJWX1BDTV9SQVRFX0tOT1Q7CiAJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCSZoZHNwbV9od19jb25zdHJhaW50c19hZXMzMl9zYW1wbGVfcmF0ZXMpOwogCX0gZWxzZSB7CkBAIC02MDg4LDcgKzYwOTAsNyBAQAogfQogCiBzdGF0aWMgaW50IHNuZF9oZHNwbV9od2RlcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgX191c2VyIGFyZykKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJc3RydWN0IGhkc3BtICpoZHNwbSA9IGh3LT5wcml2YXRlX2RhdGE7CkBAIC02MjEzLDExICs2MjE1LDEzIEBACiAJCWluZm8ubGluZV9vdXQgPSBoZHNwbV9saW5lX291dChoZHNwbSk7CiAJCWluZm8ucGFzc3RocnUgPSAwOwogCQlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlicmVhazsKIAogCWNhc2UgU05EUlZfSERTUE1fSU9DVExfR0VUX1NUQVRVUzoKKwkJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKKwogCQlzdGF0dXMuY2FyZF90eXBlID0gaGRzcG0tPmlvX3R5cGU7CiAKIAkJc3RhdHVzLmF1dG9zeW5jX3NvdXJjZSA9IGhkc3BtX2F1dG9zeW5jX3JlZihoZHNwbSk7CkBAIC02MjQyLDcgKzYyNDYsNyBAQAogCQkJc3RhdHVzLmNhcmRfc3BlY2lmaWMubWFkaS5tYWRpX2lucHV0ID0KIAkJCQkoc3RhdHVzcmVnaXN0ZXIgJiBIRFNQTV9BQl9pbnQpID8gMSA6IDA7CiAJCQlzdGF0dXMuY2FyZF9zcGVjaWZpYy5tYWRpLmNoYW5uZWxfZm9ybWF0ID0KLQkJCQkoc3RhdHVzcmVnaXN0ZXIgJiBIRFNQTV9UWF82NGNoKSA/IDEgOiAwOworCQkJCShzdGF0dXNyZWdpc3RlciAmIEhEU1BNX1JYXzY0Y2gpID8gMSA6IDA7CiAJCQkvKiBUT0RPOiBNYWMgZHJpdmVyIHNldHMgaXQgd2hlbiBmX3M+NDhrSHogKi8KIAkJCXN0YXR1cy5jYXJkX3NwZWNpZmljLm1hZGkuZnJhbWVfZm9ybWF0ID0gMDsKIApAQCAtNjI1MCwxMyArNjI1NCwxNSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfVkVSU0lPTjoKKwkJbWVtc2V0KCZoZHNwbV92ZXJzaW9uLCAwLCBzaXplb2YoaGRzcG1fdmVyc2lvbikpOworCiAJCWhkc3BtX3ZlcnNpb24uY2FyZF90eXBlID0gaGRzcG0tPmlvX3R5cGU7CiAJCXN0cm5jcHkoaGRzcG1fdmVyc2lvbi5jYXJkbmFtZSwgaGRzcG0tPmNhcmRfbmFtZSwKIAkJCQlzaXplb2YoaGRzcG1fdmVyc2lvbi5jYXJkbmFtZSkpOwpAQCAtNjI2NywxMyArNjI3MywxMyBAQAogCQlpZiAoaGRzcG0tPnRjbykKIAkJCWhkc3BtX3ZlcnNpb24uYWRkb25zIHw9IEhEU1BNX0FERE9OX1RDTzsKIAotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZoZHNwbV92ZXJzaW9uLAorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZoZHNwbV92ZXJzaW9uLAogCQkJCQlzaXplb2YoaGRzcG1fdmVyc2lvbikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9IRFNQTV9JT0NUTF9HRVRfTUlYRVI6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4ZXIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKG1peGVyKSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4ZXIsIGFyZ3AsIHNpemVvZihtaXhlcikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopbWl4ZXIubWl4ZXIsIGhkc3BtLT5taXhlciwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBoZHNwbV9taXhlcikpKQpAQCAtNjQ5MCwxMyArNjQ5Niw2IEBACiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkhEU1BNIik7CiAKIAlzd2l0Y2ggKGhkc3BtLT5maXJtd2FyZV9yZXYpIHsKLQljYXNlIEhEU1BNX01BRElfUkVWOgotCWNhc2UgSERTUE1fTUFESV9PTERfUkVWOgotCWNhc2UgSERTUE1fTUFESV9BTkNJRU5UX1JFVjoKLQkJaGRzcG0tPmlvX3R5cGUgPSBNQURJOwotCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBNQURJIjsKLQkJaGRzcG0tPm1pZGlQb3J0cyA9IDM7Ci0JCWJyZWFrOwogCWNhc2UgSERTUE1fUkFZREFUX1JFVjoKIAkJaGRzcG0tPmlvX3R5cGUgPSBSYXlEQVQ7CiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIFJheURBVCI7CkBAIC02NTEyLDE3ICs2NTExLDI1IEBACiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIE1BRElmYWNlIjsKIAkJaGRzcG0tPm1pZGlQb3J0cyA9IDE7CiAJCWJyZWFrOwotCWNhc2UgSERTUE1fQUVTX1JFVjoKLQljYXNlIEhEU1BNX0FFUzMyX1JFVjoKLQljYXNlIEhEU1BNX0FFUzMyX09MRF9SRVY6Ci0JCWhkc3BtLT5pb190eXBlID0gQUVTMzI7Ci0JCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIEFFUzMyIjsKLQkJaGRzcG0tPm1pZGlQb3J0cyA9IDI7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgIkhEU1BNOiB1bmtub3duIGZpcm13YXJlIHJldmlzaW9uICV4XG4iLAorCQlpZiAoKGhkc3BtLT5maXJtd2FyZV9yZXYgPT0gMHhmMCkgfHwKKwkJCSgoaGRzcG0tPmZpcm13YXJlX3JldiA+PSAweGU2KSAmJgorCQkJCQkoaGRzcG0tPmZpcm13YXJlX3JldiA8PSAweGVhKSkpIHsKKwkJCWhkc3BtLT5pb190eXBlID0gQUVTMzI7CisJCQloZHNwbS0+Y2FyZF9uYW1lID0gIlJNRSBBRVMzMiI7CisJCQloZHNwbS0+bWlkaVBvcnRzID0gMjsKKwkJfSBlbHNlIGlmICgoaGRzcG0tPmZpcm13YXJlX3JldiA9PSAweGQ1KSB8fAorCQkJKChoZHNwbS0+ZmlybXdhcmVfcmV2ID49IDB4YzgpICAmJgorCQkJCShoZHNwbS0+ZmlybXdhcmVfcmV2IDw9IDB4Y2YpKSkgeworCQkJaGRzcG0tPmlvX3R5cGUgPSBNQURJOworCQkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgTUFESSI7CisJCQloZHNwbS0+bWlkaVBvcnRzID0gMzsKKwkJfSBlbHNlIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQkiSERTUE06IHVua25vd24gZmlybXdhcmUgcmV2aXNpb24gJXhcbiIsCiAJCQkJaGRzcG0tPmZpcm13YXJlX3Jldik7Ci0JCXJldHVybiAtRU5PREVWOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KIAl9CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCmluZGV4IDFjN2JjMWUuLjczMmM1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBiY2Y2MTUyLi5hMzkxZTYyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC0xMjM0LDcgKzEyMzQsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc2lzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKKwlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNpc19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJS0JVSUxEX01PRE5BTUUsIHNpcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXM3MDE5OiB1bmFibGUgdG8gcmVnYWluIElSUSAlZFxuIiwgcGNpLT5pcnEpOwogCQlnb3RvIGVycm9yOwpAQCAtMTM0MCw3ICsxMzQwLDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyb3Jfb3V0X2NsZWFudXA7CiAKLQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNpc19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsCisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzaXNfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCUtCVUlMRF9NT0ROQU1FLCBzaXMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwgc2lzLT5pcnEpOwogCQlnb3RvIGVycm9yX291dF9jbGVhbnVwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3NvbmljdmliZXMuYyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKaW5kZXggMjU3MWE2Ny4uMzFiNmFkMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3NvbmljdmliZXMuYworKysgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtMTQ5Myw5ICsxNDkzLDEwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfU09OSUNWSUJFUywKLQkJCQkgICAgICAgc29uaWMtPm1pZGlfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkgICAgICAgc29uaWMtPmlycSwgMCwKLQkJCQkgICAgICAgJm1pZGlfdWFydCkpIDwgMCkgeworCQkJCSAgICAgICBzb25pYy0+bWlkaV9wb3J0LAorCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJICAgICAgIC0xLCAmbWlkaV91YXJ0KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCmluZGV4IGQ4YTEyOGYuLmRlYjA0YjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RyaWRlbnQuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0xNDgsOCArMTQ4LDkgQEAKIAlpZiAodHJpZGVudC0+ZGV2aWNlICE9IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCAmJgogCSAgICAoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfVFJJRDREV0FWRSwKIAkJCQkgICAgICAgdHJpZGVudC0+bWlkaV9wb3J0LAotCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCSAgICAgICB0cmlkZW50LT5pcnEsIDAsICZ0cmlkZW50LT5ybWlkaSkpIDwgMCkgeworCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSVJRX0hPT0ssCisJCQkJICAgICAgIC0xLCAmdHJpZGVudC0+cm1pZGkpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDViZDU3YTcuLjYxZDNjMGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBmMDNmZDYyLi5hZTk4ZDU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTUzLDcgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xMTc1LDYgKzExNzUsNyBAQAogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaW50IGVycjsKIAlzdHJ1Y3QgdmlhX3JhdGVfbG9jayAqcmF0ZXA7CisJYm9vbCB1c2Vfc3JjID0gZmFsc2U7CiAKIAlydW50aW1lLT5odyA9IHNuZF92aWE4Mnh4X2h3OwogCQpAQCAtMTE5Niw2ICsxMTk3LDcgQEAKIAkJCQkgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDApOwogCQlydW50aW1lLT5ody5yYXRlX21pbiA9IDgwMDA7CiAJCXJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gNDgwMDA7CisJCXVzZV9zcmMgPSB0cnVlOwogCX0gZWxzZSBpZiAoISByYXRlcC0+cmF0ZSkgewogCQlpbnQgaWR4ID0gdmlhZGV2LT5kaXJlY3Rpb24gPyBBQzk3X1JBVEVTX0FEQyA6IEFDOTdfUkFURVNfRlJPTlRfREFDOwogCQlydW50aW1lLT5ody5yYXRlcyA9IGNoaXAtPmFjOTctPnJhdGVzW2lkeF07CkBAIC0xMjEyLDYgKzEyMTQsMTIgQEAKIAlpZiAoKGVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKHVzZV9zcmMpIHsKKwkJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gdmlhZGV2OwogCXZpYWRldi0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCkBAIC0yMDY4LDggKzIwNzYsOSBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wY2ksIFZJQV9QTlBfQ09OVFJPTCwgbGVnYWN5X2NmZyk7CiAJaWYgKGNoaXAtPm1wdV9yZXMpIHsKIAkJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX1ZJQTY4NkEsCi0JCQkJCW1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAotCQkJCQljaGlwLT5pcnEsIDAsICZjaGlwLT5ybWlkaSkgPCAwKSB7CisJCQkJCW1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVEIHwKKwkJCQkJTVBVNDAxX0lORk9fSVJRX0hPT0ssIC0xLAorCQkJCQkmY2hpcC0+cm1pZGkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidW5hYmxlIHRvIGluaXRpYWxpemUgTVBVLTQwMSIKIAkJCSAgICAgICAiIGF0IDB4JWx4LCBza2lwcGluZ1xuIiwgbXB1X3BvcnQpOwogCQkJbGVnYWN5ICY9IH5WSUFfRlVOQ19FTkFCTEVfTUlESTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCmluZGV4IGEzODZkZDkuLjgwYTljMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwppbmRleCA1MzQyZDVlLi42NzY1ODIyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdngyMjIvdngyMjIuYworKysgYi9zb3VuZC9wY2kvdngyMjIvdngyMjIuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwppbmRleCA1MTFkNTc2Li5lOTdkZGNhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3ltZnBjaS5oPgogI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgpAQCAtMzA1LDggKzMwNSw5IEBACiAJaWYgKGNoaXAtPm1wdV9yZXMpIHsKIAkJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19ZTUZQQ0ksCiAJCQkJCSAgICAgICBtcHVfcG9ydFtkZXZdLAotCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKLQkJCQkJICAgICAgIHBjaS0+aXJxLCAwLCAmY2hpcC0+cmF3bWlkaSkpIDwgMCkgeworCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8CisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JUlFfSE9PSywKKwkJCQkJICAgICAgIC0xLCAmY2hpcC0+cmF3bWlkaSkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieW1mcGNpOiBjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLCBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgUENJUl9EU1hHX0xFR0FDWSwgbGVnYWN5X2N0cmwpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IGYzMjYwZTYuLjAzZWU0ZTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODk3LDYgKzg5OCwxOCBAQAogCXN0cnVjdCBzbmRfeW1mcGNpICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF95bWZwY2lfcGNtICp5cGNtOworCWludCBlcnI7CisKKwlydW50aW1lLT5odyA9IHNuZF95bWZwY2lfcGxheWJhY2s7CisJLyogRklYTUU/IFRydWUgdmFsdWUgaXMgMjU2LzQ4ID0gNS4zMzMzMyBtcyAqLworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FLAorCQkJCQkgICA1MzM0LCBVSU5UX01BWCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJeXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCp5cGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHlwY20gPT0gTlVMTCkKQEAgLTkwNCwxMSArOTE3LDggQEAKIAl5cGNtLT5jaGlwID0gY2hpcDsKIAl5cGNtLT50eXBlID0gUExBWUJBQ0tfVk9JQ0U7CiAJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCXJ1bnRpbWUtPmh3ID0gc25kX3ltZnBjaV9wbGF5YmFjazsKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOwogCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOwotCS8qIEZJWE1FPyBUcnVlIHZhbHVlIGlzIDI1Ni80OCA9IDUuMzMzMzMgbXMgKi8KLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRSwgNTMzMywgVUlOVF9NQVgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDEzLDYgKzEwMjMsMTggQEAKIAlzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfeW1mcGNpX3BjbSAqeXBjbTsKKwlpbnQgZXJyOworCisJcnVudGltZS0+aHcgPSBzbmRfeW1mcGNpX2NhcHR1cmU7CisJLyogRklYTUU/IFRydWUgdmFsdWUgaXMgMjU2LzQ4ID0gNS4zMzMzMyBtcyAqLworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FLAorCQkJCQkgICA1MzM0LCBVSU5UX01BWCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX3BjbV9od19ydWxlX25vcmVzYW1wbGUocnVudGltZSwgNDgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJeXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCp5cGNtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHlwY20gPT0gTlVMTCkKQEAgLTEwMjIsOSArMTA0NCw2IEBACiAJeXBjbS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwkKIAl5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID0gY2FwdHVyZV9iYW5rX251bWJlcjsKIAljaGlwLT5jYXB0dXJlX3N1YnN0cmVhbVtjYXB0dXJlX2JhbmtfbnVtYmVyXSA9IHN1YnN0cmVhbTsKLQlydW50aW1lLT5odyA9IHNuZF95bWZwY2lfY2FwdHVyZTsKLQkvKiBGSVhNRT8gVHJ1ZSB2YWx1ZSBpcyAyNTYvNDggPSA1LjMzMzMzIG1zICovCi0Jc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsIDUzMzMsIFVJTlRfTUFYKTsKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB5cGNtOwogCXJ1bnRpbWUtPnByaXZhdGVfZnJlZSA9IHNuZF95bWZwY2lfcGNtX2ZyZWVfc3Vic3RyZWFtOwogCXNuZF95bWZwY2lfaHdfc3RhcnQoY2hpcCk7CkBAIC0xNjE1LDcgKzE2MzQsNyBAQAogWU1GUENJX0RPVUJMRSgiQURDIENhcHR1cmUgVm9sdW1lIiwgMCwgWURTWEdSX1BSSUFEQ0xPT1BWT0wpLAogWU1GUENJX0RPVUJMRSgiQURDIFBsYXliYWNrIFZvbHVtZSIsIDEsIFlEU1hHUl9TRUNBRENPVVRWT0wpLAogWU1GUENJX0RPVUJMRSgiQURDIENhcHR1cmUgVm9sdW1lIiwgMSwgWURTWEdSX1NFQ0FEQ0xPT1BWT0wpLAotWU1GUENJX0RPVUJMRSgiRk0gTGVnYWN5IFZvbHVtZSIsIDAsIFlEU1hHUl9MRUdBQ1lPVVRWT0wpLAorWU1GUENJX0RPVUJMRSgiRk0gTGVnYWN5IFBsYXliYWNrIFZvbHVtZSIsIDAsIFlEU1hHUl9MRUdBQ1lPVVRWT0wpLAogWU1GUENJX0RPVUJMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkFDOTcgIiwgUExBWUJBQ0ssVk9MVU1FKSwgMCwgWURTWEdSX1pWT1VUVk9MKSwKIFlNRlBDSV9ET1VCTEUoU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBDQVBUVVJFLFZPTFVNRSksIDAsIFlEU1hHUl9aVkxPT1BWT0wpLAogWU1GUENJX0RPVUJMRShTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkFDOTcgIixQTEFZQkFDSyxWT0xVTUUpLCAxLCBZRFNYR1JfU1BESUZPVVRWT0wpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKaW5kZXggNjY0ODhhNy4uNmFmNDFkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYworKysgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSAicGRhdWRpb2NmLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDMxNzc3ZDEuLjllMzYxYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAidnhwb2NrZXQuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9rZXl3ZXN0LmMgYi9zb3VuZC9wcGMva2V5d2VzdC5jCmluZGV4IDhmMDY0YzcuLjQwODBiZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9rZXl3ZXN0LmMKKysrIGIvc291bmQvcHBjL2tleXdlc3QuYwpAQCAtODIsNyArODIsNiBAQAogCiBzdGF0aWMgaW50IGtleXdlc3RfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJaWYgKCEga2V5d2VzdF9jdHgpCiAJCXJldHVybiAwOwogCWlmIChjbGllbnQgPT0ga2V5d2VzdF9jdHgtPmNsaWVudCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggYTJiNjliOC4uNjU2NDU2OSAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3Bvd2VybWFjLmMKKysrIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgInBtYWMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IGJjODIzYTUuLjFhYTUyZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODQ1LDcgKzg0Niw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEodGhlX2NhcmQuaXJxX25vLCBzbmRfcHMzX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlyZXQgPSByZXF1ZXN0X2lycSh0aGVfY2FyZC5pcnFfbm8sIHNuZF9wczNfaW50ZXJydXB0LCAwLAogCQkJICBTTkRfUFMzX0RSSVZFUl9OQU1FLCAmdGhlX2NhcmQpOwogCWlmIChyZXQpIHsKIAkJcHJfaW5mbygiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKQEAgLTg3NSw3ICs4NzYsNyBAQAogCQkoMHgwZlVMIDw8IDEyKSB8CiAJCShQUzNfQVVESU9fSU9JRCk7CiAKLQlyZXQgPSBsdjFfZ3B1X2F0dHJpYnV0ZSgweDEwMCwgMHgwMDcsIHZhbCwgMCwgMCk7CisJcmV0ID0gbHYxX2dwdV9hdHRyaWJ1dGUoMHgxMDAsIDB4MDA3LCB2YWwpOwogCWlmIChyZXQpCiAJCXByX2luZm8oIiVzOiBncHVfYXR0cmlidXRlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCQlyZXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc2gvYWljYS5jIGIvc291bmQvc2gvYWljYS5jCmluZGV4IDk0YzZlYTcuLjExMjBjYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NoL2FpY2EuYworKysgYi9zb3VuZC9zaC9haWNhLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jIGIvc291bmQvc2gvc2hfZGFjX2F1ZGlvLmMKaW5kZXggNjhlMGRlZS4uNTZiY2I0NmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jCisrKyBiL3NvdW5kL3NoL3NoX2RhY19hdWRpby5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKaW5kZXggODIyNGRiNS4uMTM4MWRiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL0tjb25maWcKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTcsNiArNyw4IEBACiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgQUM5N19CVVMgaWYgU05EX1NPQ19BQzk3X0JVUwogCXNlbGVjdCBTTkRfSkFDSyBpZiBJTlBVVD15IHx8IElOUFVUPVNORAorCXNlbGVjdCBSRUdNQVBfSTJDIGlmIEkyQworCXNlbGVjdCBSRUdNQVBfU1BJIGlmIFNQSV9NQVNURVIKIAktLS1oZWxwLS0tCiAKIAkgIElmIHlvdSB3YW50IEFTb0Mgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZQpAQCAtNTEsNiArNTMsNyBAQAogc291cmNlICJzb3VuZC9zb2Mvb21hcC9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL21pZC14ODYvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL214cy9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvcHhhL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zYW1zdW5nL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zNjAwMC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IDRmOTEzODcuLjllYThhYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKSAgICs9IGlteC8KIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBqejQ3NDAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbWlkLXg4Ni8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBteHMvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbnVjOTAwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG9tYXAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0ga2lya3dvb2QvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvcGxheXBhcV93bTg1MTAuYyBiL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCmluZGV4IDFhYWMyZjQuLjczYWU5OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jCkBAIC0zMzgsNyArMzM4LDYgQEAKIAkvKiBhbHdheXMgY29ubmVjdGVkIHBpbnMgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50IE1pYyIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAogCkBAIC0zODMsMTQgKzM4MiwxNyBAQAogCV9nY2xrMCA9IGNsa19nZXQoTlVMTCwgImdjbGswIik7CiAJaWYgKElTX0VSUihfZ2NsazApKSB7CiAJCV9nY2xrMCA9IE5VTEw7CisJCXJldCA9IFBUUl9FUlIoX2djbGswKTsKIAkJZ290byBlcnJfZ2NsazA7CiAJfQogCV9wbGwwID0gY2xrX2dldChOVUxMLCAicGxsMCIpOwogCWlmIChJU19FUlIoX3BsbDApKSB7CiAJCV9wbGwwID0gTlVMTDsKKwkJcmV0ID0gUFRSX0VSUihfcGxsMCk7CiAJCWdvdG8gZXJyX3BsbDA7CiAJfQotCWlmIChjbGtfc2V0X3BhcmVudChfZ2NsazAsIF9wbGwwKSkgeworCXJldCA9IGNsa19zZXRfcGFyZW50KF9nY2xrMCwgX3BsbDApOworCWlmIChyZXQpIHsKIAkJcHJfd2FybmluZygic25kLXNvYy1wbGF5cGFxOiAiCiAJCQkgICAiRmFpbGVkIHRvIHNldCBQTEwwIGFzIHBhcmVudCBmb3IgREFDIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfc2V0X2NsazsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jIGIvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKaW5kZXggYmFkM2FhMS4uMDM3N2M1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKKysrIGIvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMKQEAgLTE3Myw4ICsxNzMsNiBAQAogCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL3NuZC1zb2MtYWZlYjkyNjAuYyBiL3NvdW5kL3NvYy9hdG1lbC9zbmQtc29jLWFmZWI5MjYwLmMKaW5kZXggNWU0ZDQ5OS4uZDQyN2U5MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL3NuZC1zb2MtYWZlYjkyNjAuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvc25kLXNvYy1hZmViOTI2MC5jCkBAIC0xMTcsOCArMTE3LDYgQEAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvS2NvbmZpZyBiL3NvdW5kL3NvYy9hdTF4L0tjb25maWcKaW5kZXggNGI2NzE0MC4uZTkwOGE4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvYXUxeC9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIyMKIGNvbmZpZyBTTkRfU09DX0FVMVhQU0MKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciBBdTEyMDAvQXUxMjUwL0F1MTU1MCIKLQlkZXBlbmRzIG9uIFNPQ19BVTEyMDAgfHwgU09DX0FVMTU1MAorCWRlcGVuZHMgb24gTUlQU19BTENIRU1ZCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUHJvZ3JhbW1hYmxlIFNlcmlhbAogCSAgQ29udHJvbGxlcnMgaW4gQUM5NyBhbmQgSTJTIG1vZGUsIGFuZCB0aGUgRGVzY3JpcHRvci1CYXNlZCBETUEKQEAgLTE4LDEwICsxOCwzOCBAQAogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCiAKKyMjCisjIyBBdTEwMDAvMTUwMC8xMTAwIERNQSArIEFDOTdDL0kyU0MKKyMjCitjb25maWcgU05EX1NPQ19BVTFYQVVESU8KKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciBBdTEwMDAvQXUxNTAwL0F1MTEwMCIKKwlkZXBlbmRzIG9uIE1JUFNfQUxDSEVNWQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgc2V0IGZvciB0aGUgQUM5NyB1bml0IGFuZCB0aGUKKwkgIG9sZCBETUEgY29udHJvbGxlciBhcyBmb3VuZCBvbiB0aGUgQXUxMDAwL0F1MTUwMC9BdTExMDAgY2hpcHMuCisKK2NvbmZpZyBTTkRfU09DX0FVMVhBQzk3QworCXRyaXN0YXRlCisJc2VsZWN0IEFDOTdfQlVTCisJc2VsZWN0IFNORF9BQzk3X0NPREVDCisJc2VsZWN0IFNORF9TT0NfQUM5N19CVVMKKworY29uZmlnIFNORF9TT0NfQVUxWEkyU0MKKwl0cmlzdGF0ZQorCiAKICMjCiAjIyBCb2FyZHMKICMjCitjb25maWcgU05EX1NPQ19EQjEwMDAKKwl0cmlzdGF0ZSAiREIxMDAwIEF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTkRfU09DX0FVMVhBVURJTworCXNlbGVjdCBTTkRfU09DX0FVMVhBQzk3QworCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIEFDOTcgYXVkaW8gb24gdGhlIGVhcmx5IERCMXgwMCBzZXJpZXMKKwkgIG9mIGJvYXJkcyAoREIxMDAwL0RCMTUwMC9EQjExMDApLgorCiBjb25maWcgU05EX1NPQ19EQjEyMDAKIAl0cmlzdGF0ZSAiREIxMjAwIEFDOTcrSTJTIGF1ZGlvIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTkRfU09DX0FVMVhQU0MKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L01ha2VmaWxlIGIvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKaW5kZXggMTY4NzMwNy4uOTIwNzEwNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2F1MXgvTWFrZWZpbGUKQEAgLTMsMTEgKzMsMjEgQEAKIHNuZC1zb2MtYXUxeHBzYy1pMnMtb2JqcyA6PSBwc2MtaTJzLm8KIHNuZC1zb2MtYXUxeHBzYy1hYzk3LW9ianMgOj0gcHNjLWFjOTcubwogCisjIEF1MTAwMC8xNTAwLzExMDAgQXVkaW8gdW5pdHMKK3NuZC1zb2MtYXUxeC1kbWEtb2JqcyA6PSBkbWEubworc25kLXNvYy1hdTF4LWFjOTdjLW9ianMgOj0gYWM5N2Mubworc25kLXNvYy1hdTF4LWkyc2Mtb2JqcyA6PSBpMnNjLm8KKwogb2JqLSQoQ09ORklHX1NORF9TT0NfQVUxWFBTQykgKz0gc25kLXNvYy1hdTF4cHNjLWRiZG1hLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FVMVhQU0NfSTJTKSArPSBzbmQtc29jLWF1MXhwc2MtaTJzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FVMVhQU0NfQUM5NykgKz0gc25kLXNvYy1hdTF4cHNjLWFjOTcubworb2JqLSQoQ09ORklHX1NORF9TT0NfQVUxWEFVRElPKSArPSBzbmQtc29jLWF1MXgtZG1hLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FVMVhBQzk3QykgKz0gc25kLXNvYy1hdTF4LWFjOTdjLm8KK29iai0kKENPTkZJR19TTkRfU09DX0FVMVhJMlNDKSArPSBzbmQtc29jLWF1MXgtaTJzYy5vCiAKICMgQm9hcmRzCitzbmQtc29jLWRiMTAwMC1vYmpzIDo9IGRiMTAwMC5vCiBzbmQtc29jLWRiMTIwMC1vYmpzIDo9IGRiMTIwMC5vCiAKK29iai0kKENPTkZJR19TTkRfU09DX0RCMTAwMCkgKz0gc25kLXNvYy1kYjEwMDAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfREIxMjAwKSArPSBzbmQtc29jLWRiMTIwMC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9hYzk3Yy5jIGIvc291bmQvc29jL2F1MXgvYWM5N2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZiZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvYWM5N2MuYwpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqIEF1MTAwMC9BdTE1MDAvQXUxMTAwIEFDOTdDIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBU29DCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogYmFzZWQgb24gdGhlIG9sZCBBTFNBIGRyaXZlciBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqCQkJQ2hhcmxlcyBFaWRzbmVzcyA8Y2hhcmxlc0Bjb29wZXItc3RyZWV0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisjaW5jbHVkZSAicHNjLmgiCisKKy8qIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgQUM5N19DT05GSUcJMHgwMAorI2RlZmluZSBBQzk3X1NUQVRVUwkweDA0CisjZGVmaW5lIEFDOTdfREFUQQkweDA4CisjZGVmaW5lIEFDOTdfQ01EUkVTUAkweDBjCisjZGVmaW5lIEFDOTdfRU5BQkxFCTB4MTAKKworI2RlZmluZSBDRkdfUkMoeCkJKCgoeCkgJiAweDNmZikgPDwgMTMpCS8qIHZhbGlkIHJ4IHNsb3RzIG1hc2sgKi8KKyNkZWZpbmUgQ0ZHX1hTKHgpCSgoKHgpICYgMHgzZmYpIDw8IDMpCS8qIHZhbGlkIHR4IHNsb3RzIG1hc2sgKi8KKyNkZWZpbmUgQ0ZHX1NHCQkoMSA8PCAyKQkvKiBzeW5jIGdhdGUgKi8KKyNkZWZpbmUgQ0ZHX1NOCQkoMSA8PCAxKQkvKiBzeW5jIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ0ZHX1JTCQkoMSA8PCAwKQkvKiBhY3JzdCMgY29udHJvbCAqLworI2RlZmluZSBTVEFUX1hVCQkoMSA8PCAxMSkJLyogdHggdW5kZXJmbG93ICovCisjZGVmaW5lIFNUQVRfWE8JCSgxIDw8IDEwKQkvKiB0eCBvdmVyZmxvdyAqLworI2RlZmluZSBTVEFUX1JVCQkoMSA8PCA5KQkvKiByeCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgU1RBVF9STwkJKDEgPDwgOCkJLyogcnggb3ZlcmZsb3cgKi8KKyNkZWZpbmUgU1RBVF9SRAkJKDEgPDwgNykJLyogY29kZWMgcmVhZHkgKi8KKyNkZWZpbmUgU1RBVF9DUAkJKDEgPDwgNikJLyogY29tbWFuZCBwZW5kaW5nICovCisjZGVmaW5lIFNUQVRfVEUJCSgxIDw8IDQpCS8qIHR4IGZpZm8gZW1wdHkgKi8KKyNkZWZpbmUgU1RBVF9URgkJKDEgPDwgMykJLyogdHggZmlmbyBmdWxsICovCisjZGVmaW5lIFNUQVRfUkUJCSgxIDw8IDEpCS8qIHJ4IGZpZm8gZW1wdHkgKi8KKyNkZWZpbmUgU1RBVF9SRgkJKDEgPDwgMCkJLyogcnggZmlmbyBmdWxsICovCisjZGVmaW5lIENNRF9TRVRfREFUQSh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIENNRF9HRVRfREFUQSh4KQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBDTURfUkVBRAkoMSA8PCA3KQorI2RlZmluZSBDTURfV1JJVEUJKDAgPDwgNykKKyNkZWZpbmUgQ01EX0lEWCh4KQkoKHgpICYgMHg3ZikKKyNkZWZpbmUgRU5fRAkJKDEgPDwgMSkJLyogRElTYWJsZSBiaXQgKi8KKyNkZWZpbmUgRU5fQ0UJCSgxIDw8IDApCS8qIGNsb2NrIGVuYWJsZSBiaXQgKi8KKworLyogaG93IG9mdGVuIHRvIHJldHJ5IGZhaWxlZCBjb2RlYyByZWdpc3RlciByZWFkcy93cml0ZXMgKi8KKyNkZWZpbmUgQUM5N19SV19SRVRSSUVTCTUKKworI2RlZmluZSBBQzk3X1JBVEVTCVwKKwlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTCisKKyNkZWZpbmUgQUM5N19GTVRTCVwKKwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSkKKworLyogaW5zdGFuY2UgZGF0YS4gVGhlcmUgY2FuIGJlIG9ubHkgb25lLCBNYWNMZW9kISEhISwgZm9ydHVuYXRlbHkgdGhlcmUgSVMgb25seQorICogb25jZSBBQzk3QyBvbiBlYXJseSBBbGNoZW15IGNoaXBzLiBUaGUgbmV3ZXIgb25lcyBhcmVuJ3Qgc28gbHVja3kuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICphYzk3Y193b3JrZGF0YTsKKyNkZWZpbmUgYWM5N190b19jdHgoeCkJCWFjOTdjX3dvcmtkYXRhCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBSRChzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0eC0+bW1pbyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUihzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlfX3Jhd193cml0ZWwodiwgY3R4LT5tbWlvICsgcmVnKTsKKwl3bWIoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGF1MXhhYzk3Y19hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IHIpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gYWM5N190b19jdHgoYWM5Nyk7CisJdW5zaWduZWQgaW50IHRtbywgcmV0cnk7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJZGF0YSA9IH4wOworCXJldHJ5ID0gQUM5N19SV19SRVRSSUVTOworCWRvIHsKKwkJbXV0ZXhfbG9jaygmY3R4LT5sb2NrKTsKKworCQl0bW8gPSA1OworCQl3aGlsZSAoKFJEKGN0eCwgQUM5N19TVEFUVVMpICYgU1RBVF9DUCkgJiYgdG1vLS0pCisJCQl1ZGVsYXkoMjEpOwkvKiB3YWl0IGFuIGFjOTcgZnJhbWUgdGltZSAqLworCQlpZiAoIXRtbykgeworCQkJcHJfZGVidWcoImFjOTdyZCB0aW1lb3V0ICMxXG4iKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCVdSKGN0eCwgQUM5N19DTURSRVNQLCBDTURfSURYKHIpIHwgQ01EX1JFQUQpOworCisJCS8qIHN0dXBpZCBlcnJhdGE6IGRhdGEgaXMgb25seSB2YWxpZCBmb3IgMjF1cywgc28KKwkJICogcG9sbCwgRm9ycmVzdCwgcG9sbC4uLgorCQkgKi8KKwkJdG1vID0gMHgxMDAwMDsKKwkJd2hpbGUgKChSRChjdHgsIEFDOTdfU1RBVFVTKSAmIFNUQVRfQ1ApICYmIHRtby0tKQorCQkJYXNtIHZvbGF0aWxlICgibm9wIik7CisJCWRhdGEgPSBSRChjdHgsIEFDOTdfQ01EUkVTUCk7CisKKwkJaWYgKCF0bW8pCisJCQlwcl9kZWJ1ZygiYWM5N3JkIHRpbWVvdXQgIzJcbiIpOworCituZXh0OgorCQltdXRleF91bmxvY2soJmN0eC0+bG9jayk7CisJfSB3aGlsZSAoLS1yZXRyeSAmJiAhdG1vKTsKKworCXByX2RlYnVnKCJBQzk3UkQgJTA0eCAlMDRseCAlZFxuIiwgciwgZGF0YSwgcmV0cnkpOworCisJcmV0dXJuIHJldHJ5ID8gZGF0YSAmIDB4ZmZmZiA6IDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgYXUxeGFjOTdjX2FjOTdfd3JpdGUoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByLAorCQkJCSB1bnNpZ25lZCBzaG9ydCB2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGFjOTdfdG9fY3R4KGFjOTcpOworCXVuc2lnbmVkIGludCB0bW8sIHJldHJ5OworCisJcmV0cnkgPSBBQzk3X1JXX1JFVFJJRVM7CisJZG8geworCQltdXRleF9sb2NrKCZjdHgtPmxvY2spOworCisJCWZvciAodG1vID0gNTsgKFJEKGN0eCwgQUM5N19TVEFUVVMpICYgU1RBVF9DUCkgJiYgdG1vOyB0bW8tLSkKKwkJCXVkZWxheSgyMSk7CisJCWlmICghdG1vKSB7CisJCQlwcl9kZWJ1ZygiYWM5N3dyIHRpbWVvdXQgIzFcbiIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJV1IoY3R4LCBBQzk3X0NNRFJFU1AsIENNRF9XUklURSB8IENNRF9JRFgocikgfCBDTURfU0VUX0RBVEEodikpOworCisJCWZvciAodG1vID0gMTA7IChSRChjdHgsIEFDOTdfU1RBVFVTKSAmIFNUQVRfQ1ApICYmIHRtbzsgdG1vLS0pCisJCQl1ZGVsYXkoMjEpOworCQlpZiAoIXRtbykKKwkJCXByX2RlYnVnKCJhYzk3d3IgdGltZW91dCAjMlxuIik7CituZXh0OgorCQltdXRleF91bmxvY2soJmN0eC0+bG9jayk7CisJfSB3aGlsZSAoLS1yZXRyeSAmJiAhdG1vKTsKKworCXByX2RlYnVnKCJBQzk3V1IgJTA0eCAlMDR4ICVkXG4iLCByLCB2LCByZXRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIGF1MXhhYzk3Y19hYzk3X3dhcm1fcmVzZXQoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGFjOTdfdG9fY3R4KGFjOTcpOworCisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcgfCBDRkdfU0cgfCBDRkdfU04pOworCW1zbGVlcCgyMCk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcgfCBDRkdfU0cpOworCVdSKGN0eCwgQUM5N19DT05GSUcsIGN0eC0+Y2ZnKTsKK30KKworc3RhdGljIHZvaWQgYXUxeGFjOTdjX2FjOTdfY29sZF9yZXNldChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gYWM5N190b19jdHgoYWM5Nyk7CisJaW50IGk7CisKKwlXUihjdHgsIEFDOTdfQ09ORklHLCBjdHgtPmNmZyB8IENGR19SUyk7CisJbXNsZWVwKDUwMCk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcpOworCisJLyogd2FpdCBmb3IgY29kZWMgcmVhZHkgKi8KKwlpID0gNTA7CisJd2hpbGUgKCgoUkQoY3R4LCBBQzk3X1NUQVRVUykgJiBTVEFUX1JEKSA9PSAwKSAmJiAtLWkpCisJCW1zbGVlcCgyMCk7CisJaWYgKCFpKQorCQlwcmludGsoS0VSTl9FUlIgImFjOTdjOiBjb2RlYyBub3QgcmVhZHkgYWZ0ZXIgY29sZCByZXNldFxuIik7Cit9CisKKy8qIEFDOTcgY29udHJvbGxlciBvcGVyYXRpb25zICovCitzdHJ1Y3Qgc25kX2FjOTdfYnVzX29wcyBzb2NfYWM5N19vcHMgPSB7CisJLnJlYWQJCT0gYXUxeGFjOTdjX2FjOTdfcmVhZCwKKwkud3JpdGUJCT0gYXUxeGFjOTdjX2FjOTdfd3JpdGUsCisJLnJlc2V0CQk9IGF1MXhhYzk3Y19hYzk3X2NvbGRfcmVzZXQsCisJLndhcm1fcmVzZXQJPSBhdTF4YWM5N2NfYWM5N193YXJtX3Jlc2V0LAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19hYzk3X29wcyk7CS8qIGdsb2JhbHMgYmUgZ29uZSEgKi8KKworc3RhdGljIGludCBhbGNoZW15X2FjOTdjX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmY3R4LT5kbWFpZHNbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhbGNoZW15X2FjOTdjX29wcyA9IHsKKwkuc3RhcnR1cAkJPSBhbGNoZW15X2FjOTdjX3N0YXJ0dXAsCit9OworCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJcmV0dXJuIGFjOTdjX3dvcmtkYXRhID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGF1MXhhYzk3Y19kYWlfZHJpdmVyID0geworCS5uYW1lCQkJPSAiYWxjaGVteS1hYzk3YyIsCisJLmFjOTdfY29udHJvbAkJPSAxLAorCS5wcm9iZQkJCT0gYXUxeGFjOTdjX2RhaV9wcm9iZSwKKwkucGxheWJhY2sgPSB7CisJCS5yYXRlcwkJPSBBQzk3X1JBVEVTLAorCQkuZm9ybWF0cwk9IEFDOTdfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5yYXRlcwkJPSBBQzk3X1JBVEVTLAorCQkuZm9ybWF0cwk9IEFDOTdfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLm9wcwkJCT0gJmFsY2hlbXlfYWM5N2Nfb3BzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXUxeGFjOTdjX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZjdHgtPmxvY2spOworCisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQwOworCX0KKworCXJldCA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpLAorCQkJCXBkZXYtPm5hbWUpKQorCQlnb3RvIG91dDA7CisKKwljdHgtPm1taW8gPSBpb3JlbWFwX25vY2FjaGUoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CisJaWYgKCFjdHgtPm1taW8pCisJCWdvdG8gb3V0MTsKKworCWRtYXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFkbWFyZXMpCisJCWdvdG8gb3V0MjsKKwljdHgtPmRtYWlkc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGRtYXJlcy0+c3RhcnQ7CisKKwlkbWFyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDEpOworCWlmICghZG1hcmVzKQorCQlnb3RvIG91dDI7CisJY3R4LT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKKwkvKiBzd2l0Y2ggaXQgb24gKi8KKwlXUihjdHgsIEFDOTdfRU5BQkxFLCBFTl9EIHwgRU5fQ0UpOworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0NFKTsKKworCWN0eC0+Y2ZnID0gQ0ZHX1JDKDMpIHwgQ0ZHX1hTKDMpOworCVdSKGN0eCwgQUM5N19DT05GSUcsIGN0eC0+Y2ZnKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2LCAmYXUxeGFjOTdjX2RhaV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0MjsKKworCWFjOTdjX3dvcmtkYXRhID0gY3R4OworCXJldHVybiAwOworCitvdXQyOgorCWlvdW5tYXAoY3R4LT5tbWlvKTsKK291dDE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworb3V0MDoKKwlrZnJlZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF1MXhhYzk3Y19kcnZyZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKKworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0QpOwkvKiBjbG9jayBvZmYsIGRpc2FibGUgKi8KKworCWlvdW5tYXAoY3R4LT5tbWlvKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCWtmcmVlKGN0eCk7CisKKwlhYzk3Y193b3JrZGF0YSA9IE5VTEw7CS8qIE1ERVYgKi8KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kcnZzdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCVdSKGN0eCwgQUM5N19FTkFCTEUsIEVOX0QpOwkvKiBjbG9jayBvZmYsIGRpc2FibGUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhhYzk3Y19kcnZyZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJV1IoY3R4LCBBQzk3X0VOQUJMRSwgRU5fRCB8IEVOX0NFKTsKKwlXUihjdHgsIEFDOTdfRU5BQkxFLCBFTl9DRSk7CisJV1IoY3R4LCBBQzk3X0NPTkZJRywgY3R4LT5jZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhdTF4cHNjYWM5N19wbW9wcyA9IHsKKwkuc3VzcGVuZAk9IGF1MXhhYzk3Y19kcnZzdXNwZW5kLAorCS5yZXN1bWUJCT0gYXUxeGFjOTdjX2RydnJlc3VtZSwKK307CisKKyNkZWZpbmUgQVUxWFBTQ0FDOTdfUE1PUFMgKCZhdTF4cHNjYWM5N19wbW9wcykKKworI2Vsc2UKKworI2RlZmluZSBBVTFYUFNDQUM5N19QTU9QUyBOVUxMCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4YWM5N2NfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImFsY2hlbXktYWM5N2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQVUxWFBTQ0FDOTdfUE1PUFMsCisJfSwKKwkucHJvYmUJCT0gYXUxeGFjOTdjX2RydnByb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXUxeGFjOTdjX2RydnJlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdTF4YWM5N2NfbG9hZCh2b2lkKQoreworCWFjOTdjX3dvcmtkYXRhID0gTlVMTDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTF4YWM5N2NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXhhYzk3Y191bmxvYWQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxeGFjOTdjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1MXhhYzk3Y19sb2FkKTsKK21vZHVsZV9leGl0KGF1MXhhYzk3Y191bmxvYWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MTAwMC8xNTAwLzExMDAgQUM5N0MgQVNvQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvZGIxMDAwLmMgYi9zb3VuZC9zb2MvYXUxeC9kYjEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc0NzdhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvZGIxMDAwLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIERCMTAwMC9EQjE1MDAvREIxMTAwIEFTb0MgYXVkaW8gZmFicmljIHN1cHBvcnQgY29kZS4KKyAqCisgKiAoYykgMjAxMSBNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0Bnb29nbGVtYWlsLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9iY3NyLmg+CisKKyNpbmNsdWRlICJwc2MuaCIKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRiMTAwMF9hYzk3X2RhaSA9IHsKKwkubmFtZQkJPSAiQUM5NyIsCisJLnN0cmVhbV9uYW1lCT0gIkFDOTcgSGlGaSIsCisJLmNvZGVjX2RhaV9uYW1lCT0gImFjOTctaGlmaSIsCisJLmNwdV9kYWlfbmFtZQk9ICJhbGNoZW15LWFjOTdjIiwKKwkucGxhdGZvcm1fbmFtZQk9ICJhbGNoZW15LXBjbS1kbWEuMCIsCisJLmNvZGVjX25hbWUJPSAiYWM5Ny1jb2RlYyIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBkYjEwMDBfYWM5NyA9IHsKKwkubmFtZQkJPSAiREIxMDAwX0FDOTciLAorCS5kYWlfbGluawk9ICZkYjEwMDBfYWM5N19kYWksCisJLm51bV9saW5rcwk9IDEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYjEwMDBfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmRiMTAwMF9hYzk3OworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGIxMDAwX2F1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGIxMDAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYjEwMDAtYXVkaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnNuZF9zb2NfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IGRiMTAwMF9hdWRpb19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRiMTAwMF9hdWRpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGIxMDAwX2F1ZGlvX2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYjEwMDBfYXVkaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRiMTAwMF9hdWRpb191bmxvYWQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGIxMDAwX2F1ZGlvX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRiMTAwMF9hdWRpb19sb2FkKTsKK21vZHVsZV9leGl0KGRiMTAwMF9hdWRpb191bmxvYWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRCMTAwMC9EQjE1MDAvREIxMTAwIEFTb0MgYXVkaW8iKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvZGIxMjAwLmMgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwppbmRleCAxZDNlMjU4Li4yODkzMTJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYworKysgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBEQjEyMDAgQVNvQyBhdWRpbyBmYWJyaWMgc3VwcG9ydCBjb2RlLgogICoKLSAqIChjKSAyMDA4LTkgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ21haWwuY29tPgorICogKGMpIDIwMDgtMjAxMSBNYW51ZWwgTGF1c3MgPG1hbnVlbC5sYXVzc0Bnb29nbGVtYWlsLmNvbT4KICAqCiAgKi8KIApAQCAtMjEsNiArMjEsMTcgQEAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzMxLmgiCiAjaW5jbHVkZSAicHNjLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGRiMTIwMF9waWRzW10gPSB7CisJeworCQkubmFtZQkJPSAiZGIxMjAwLWFjOTciLAorCQkuZHJpdmVyX2RhdGEJPSAwLAorCX0sIHsKKwkJLm5hbWUJCT0gImRiMTIwMC1pMnMiLAorCQkuZHJpdmVyX2RhdGEJPSAxLAorCX0sCisJe30sCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEFDOTcgUEFSVCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRiMTIwMF9hYzk3X2RhaSA9IHsKQEAgLTg5LDM2ICsxMDAsNDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDT01NT04gUEFSVCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRiMTIwMF9hc29jX2RldjsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkICpkYjEyMDBfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworCSZkYjEyMDBfYWM5N19tYWNoaW5lLAorCSZkYjEyMDBfaTJzX21hY2hpbmUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYjEyMDBfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7CisKKwljYXJkID0gZGIxMjAwX2NhcmRzW3BpZC0+ZHJpdmVyX2RhdGFdOworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGIxMjAwX2F1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGIxMjAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJkYjEyMDAtYWM5NyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmc25kX3NvY19wbV9vcHMsCisJfSwKKwkuaWRfdGFibGUJPSBkYjEyMDBfcGlkcywKKwkucHJvYmUJCT0gZGIxMjAwX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGIxMjAwX2F1ZGlvX3JlbW92ZSksCit9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkYjEyMDBfYXVkaW9fbG9hZCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSAtRU5PTUVNOwotCWRiMTIwMF9hc29jX2RldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgMSk7IC8qIFBTQzEgKi8KLQlpZiAoIWRiMTIwMF9hc29jX2RldikKLQkJZ290byBvdXQ7Ci0KLQkvKiBEQjEyMDAgYm9hcmQgc2V0dXAgc2V0IFBTQzFNVVggdG8gcHJlZmVycmVkIGF1ZGlvIGRldmljZSAqLwotCWlmIChiY3NyX3JlYWQoQkNTUl9SRVNFVFMpICYgQkNTUl9SRVNFVFNfUFNDMU1VWCkKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGIxMjAwX2Fzb2NfZGV2LCAmZGIxMjAwX2kyc19tYWNoaW5lKTsKLQllbHNlCi0JCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRiMTIwMF9hc29jX2RldiwgJmRiMTIwMF9hYzk3X21hY2hpbmUpOwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChkYjEyMDBfYXNvY19kZXYpOwotCi0JaWYgKHJldCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGRiMTIwMF9hc29jX2Rldik7Ci0JCWRiMTIwMF9hc29jX2RldiA9IE5VTEw7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGIxMjAwX2F1ZGlvX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkYjEyMDBfYXVkaW9fdW5sb2FkKHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGIxMjAwX2Fzb2NfZGV2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGIxMjAwX2F1ZGlvX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGRiMTIwMF9hdWRpb19sb2FkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKaW5kZXggMjBiYjUzYS4uZDdkMDRlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKKysrIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJYXUxeF9wY21fZGJkbWFfZnJlZShwY2QpOwogCi0JaWYgKHN0eXBlID09IFBDTV9SWCkKKwlpZiAoc3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQogCQlwY2QtPmRkbWFfY2hhbiA9IGF1MXh4eF9kYmRtYV9jaGFuX2FsbG9jKHBjZC0+ZGRtYV9pZCwKIAkJCQkJRFNDUl9DTUQwX0FMV0FZUywKIAkJCQkJYXUxeF9wY21fZG1hcnhfY2IsICh2b2lkICopcGNkKTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzcy0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RtYWRhdGEgKnBjZCA9CiAJCQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlyZXR1cm4gJnBjZFtTVUJTVFJFQU1fVFlQRShzcyldOworCXJldHVybiAmcGNkW3NzLT5zdHJlYW1dOwogfQogCiBzdGF0aWMgaW50IGF1MXhwc2NfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXN0eXBlID0gU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKTsKKwlzdHlwZSA9IHN1YnN0cmVhbS0+c3RyZWFtOwogCXBjZCA9IHRvX2RtYWRhdGEoc3Vic3RyZWFtKTsKIAogCURCRygicnVudGltZS0+ZG1hX2FyZWEgPSAweCUwOGx4IGRtYV9hZGRyX3QgPSAweCUwOGx4IGRtYV9zaXplID0gJWQgIgpAQCAtMjU1LDcgKzI1NSw3IEBACiAKIAlhdTF4eHhfZGJkbWFfcmVzZXQocGNkLT5kZG1hX2NoYW4pOwogCi0JaWYgKFNVQlNUUkVBTV9UWVBFKHN1YnN0cmVhbSkgPT0gUENNX1JYKSB7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewogCQlhdTF4X3BjbV9xdWV1ZV9yeChwY2QpOwogCQlhdTF4X3BjbV9xdWV1ZV9yeChwY2QpOwogCX0gZWxzZSB7CkBAIC0yOTMsNiArMjkzLDE2IEBACiAKIHN0YXRpYyBpbnQgYXUxeHBzY19wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kbWFkYXRhICpwY2QgPSB0b19kbWFkYXRhKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBzdHlwZSA9IHN1YnN0cmVhbS0+c3RyZWFtLCAqZG1haWRzOworCisJZG1haWRzID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwgc3Vic3RyZWFtKTsKKwlpZiAoIWRtYWlkcykKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIHdob2EsIGhhcyBvcmRlcmluZyBjaGFuZ2VkPyAqLworCisJcGNkLT5kZG1hX2lkID0gZG1haWRzW3N0eXBlXTsKKwogCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmYXUxeHBzY19wY21faGFyZHdhcmUpOwogCXJldHVybiAwOwogfQpAQCAtMzQwLDM2ICszNTAsMTggQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF1MXhwc2NfcGNtX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZG1hZGF0YSAqZG1hZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IHJldDsKIAogCWRtYWRhdGEgPSBremFsbG9jKDIgKiBzaXplb2Yoc3RydWN0IGF1MXhwc2NfYXVkaW9fZG1hZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZG1hZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKLQlpZiAoIXIpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXQxOwotCX0KLQlkbWFkYXRhW1BDTV9UWF0uZGRtYV9pZCA9IHItPnN0YXJ0OwotCi0JLyogUlggRE1BICovCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKCFyKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0JZG1hZGF0YVtQQ01fUlhdLmRkbWFfaWQgPSByLT5zdGFydDsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRtYWRhdGEpOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmYXUxeHBzY19zb2NfcGxhdGZvcm0pOwotCWlmICghcmV0KQotCQlyZXR1cm4gcmV0OworCWlmIChyZXQpCisJCWtmcmVlKGRtYWRhdGEpOwogCi1vdXQxOgotCWtmcmVlKGRtYWRhdGEpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQwNSw1NyArMzk3LDYgQEAKIG1vZHVsZV9pbml0KGF1MXhwc2NfYXVkaW9fZGJkbWFfbG9hZCk7CiBtb2R1bGVfZXhpdChhdTF4cHNjX2F1ZGlvX2RiZG1hX3VubG9hZCk7CiAKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXUxeHBzY19wY21fYWRkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMsICpyOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkOwotCWludCBpZFsyXTsKLQlpbnQgcmV0OwotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7Ci0JaWYgKCFyKQotCQlyZXR1cm4gTlVMTDsKLQlpZFswXSA9IHItPnN0YXJ0OwotCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKCFyKQotCQlyZXR1cm4gTlVMTDsKLQlpZFsxXSA9IHItPnN0YXJ0OwotCi0JcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIsIEdGUF9LRVJORUwpOwotCWlmICghcmVzKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlc1swXS5zdGFydCA9IHJlc1swXS5lbmQgPSBpZFswXTsKLQlyZXNbMV0uc3RhcnQgPSByZXNbMV0uZW5kID0gaWRbMV07Ci0JcmVzWzBdLmZsYWdzID0gcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9ETUE7Ci0KLQlwZCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiYXUxeHBzYy1wY20iLCBwZGV2LT5pZCk7Ci0JaWYgKCFwZCkKLQkJZ290byBvdXQ7Ci0KLQlwZC0+cmVzb3VyY2UgPSByZXM7Ci0JcGQtPm51bV9yZXNvdXJjZXMgPSAyOwotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZCk7Ci0JaWYgKCFyZXQpCi0JCXJldHVybiBwZDsKLQotCXBsYXRmb3JtX2RldmljZV9wdXQocGQpOwotb3V0OgotCWtmcmVlKHJlcyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhdTF4cHNjX3BjbV9hZGQpOwotCi12b2lkIGF1MXhwc2NfcGNtX2Rlc3Ryb3koc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1hcGQpCi17Ci0JaWYgKGRtYXBkKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkbWFwZCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhdTF4cHNjX3BjbV9kZXN0cm95KTsKLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEyeDAvQXUxNTUwIFBTQyBBdWRpbyBETUEgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2RtYS5jIGIvc291bmQvc29jL2F1MXgvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3ZjcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9hdTF4L2RtYS5jCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogQXUxMDAwL0F1MTUwMC9BdTExMDAgQXVkaW8gRE1BIHN1cHBvcnQuCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogY29waWVkIGFsbW9zdCB2ZXJiYXRpbSBmcm9tIHRoZSBvbGQgQUxTQSBkcml2ZXIsIHdyaXR0ZW4gYnkKKyAqCQkJQ2hhcmxlcyBFaWRzbmVzcyA8Y2hhcmxlc0Bjb29wZXItc3RyZWV0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmg+CisKKyNpbmNsdWRlICJwc2MuaCIKKworI2RlZmluZSBBTENIRU1ZX1BDTV9GTVRTCQkJCQlcCisJKFNORFJWX1BDTV9GTVRCSVRfUzggICAgIHwgU05EUlZfUENNX0ZNVEJJVF9VOCB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9CRSB8CVwKKwkgU05EUlZfUENNX0ZNVEJJVF9VMzJfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UzMl9CRSB8CVwKKwkgMCkKKworc3RydWN0IHBjbV9wZXJpb2QgeworCXUzMiBzdGFydDsKKwl1MzIgcmVsYXRpdmVfZW5kOwkvKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIgKi8KKwlzdHJ1Y3QgcGNtX3BlcmlvZCAqbmV4dDsKK307CisKK3N0cnVjdCBhdWRpb19zdHJlYW0geworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCWludCBkbWE7CisJc3RydWN0IHBjbV9wZXJpb2QgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemU7CisJdW5zaWduZWQgaW50IHBlcmlvZHM7Cit9OworCitzdHJ1Y3QgYWxjaGVteV9wY21fY3R4IHsKKwlzdHJ1Y3QgYXVkaW9fc3RyZWFtIHN0cmVhbVsyXTsJLyogcGxheWJhY2sgJiBjYXB0dXJlICovCit9OworCitzdGF0aWMgdm9pZCBhdTEwMDBfcmVsZWFzZV9kbWFfbGluayhzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCit7CisJc3RydWN0IHBjbV9wZXJpb2QgKnBvaW50ZXI7CisJc3RydWN0IHBjbV9wZXJpb2QgKnBvaW50ZXJfbmV4dDsKKworCXN0cmVhbS0+cGVyaW9kX3NpemUgPSAwOworCXN0cmVhbS0+cGVyaW9kcyA9IDA7CisJcG9pbnRlciA9IHN0cmVhbS0+YnVmZmVyOworCWlmICghcG9pbnRlcikKKwkJcmV0dXJuOworCWRvIHsKKwkJcG9pbnRlcl9uZXh0ID0gcG9pbnRlci0+bmV4dDsKKwkJa2ZyZWUocG9pbnRlcik7CisJCXBvaW50ZXIgPSBwb2ludGVyX25leHQ7CisJfSB3aGlsZSAocG9pbnRlciAhPSBzdHJlYW0tPmJ1ZmZlcik7CisJc3RyZWFtLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9zZXR1cF9kbWFfbGluayhzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0sCisJCQkJIHVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCisJCQkJIHVuc2lnbmVkIGludCBwZXJpb2RzKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gc3RyZWFtLT5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgcGNtX3BlcmlvZCAqcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKwlpbnQgaTsKKworCWRtYV9zdGFydCA9IHZpcnRfdG9fcGh5cyhydW50aW1lLT5kbWFfYXJlYSk7CisKKwlpZiAoc3RyZWFtLT5wZXJpb2Rfc2l6ZSA9PSBwZXJpb2RfYnl0ZXMgJiYKKwkgICAgc3RyZWFtLT5wZXJpb2RzID09IHBlcmlvZHMpCisJCXJldHVybiAwOyAvKiBub3QgY2hhbmdlZCAqLworCisJYXUxMDAwX3JlbGVhc2VfZG1hX2xpbmsoc3RyZWFtKTsKKworCXN0cmVhbS0+cGVyaW9kX3NpemUgPSBwZXJpb2RfYnl0ZXM7CisJc3RyZWFtLT5wZXJpb2RzID0gcGVyaW9kczsKKworCXN0cmVhbS0+YnVmZmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjbV9wZXJpb2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbS0+YnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwb2ludGVyID0gc3RyZWFtLT5idWZmZXI7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgeworCQlwb2ludGVyLT5zdGFydCA9ICh1MzIpKGRtYV9zdGFydCArIChpICogcGVyaW9kX2J5dGVzKSk7CisJCXBvaW50ZXItPnJlbGF0aXZlX2VuZCA9ICh1MzIpICgoKGkrMSkgKiBwZXJpb2RfYnl0ZXMpIC0gMHgxKTsKKwkJaWYgKGkgPCBwZXJpb2RzIC0gMSkgeworCQkJcG9pbnRlci0+bmV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY21fcGVyaW9kKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFwb2ludGVyLT5uZXh0KSB7CisJCQkJYXUxMDAwX3JlbGVhc2VfZG1hX2xpbmsoc3RyZWFtKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXBvaW50ZXIgPSBwb2ludGVyLT5uZXh0OworCQl9CisJfQorCXBvaW50ZXItPm5leHQgPSBzdHJlYW0tPmJ1ZmZlcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXUxMDAwX2RtYV9zdG9wKHN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSkKK3sKKwlpZiAoc3RyZWFtLT5idWZmZXIpCisJCWRpc2FibGVfZG1hKHN0cmVhbS0+ZG1hKTsKK30KKworc3RhdGljIHZvaWQgYXUxMDAwX2RtYV9zdGFydChzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0pCit7CisJaWYgKCFzdHJlYW0tPmJ1ZmZlcikKKwkJcmV0dXJuOworCisJaW5pdF9kbWEoc3RyZWFtLT5kbWEpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoc3RyZWFtLT5kbWEpID09IDApIHsKKwkJY2xlYXJfZG1hX2RvbmUwKHN0cmVhbS0+ZG1hKTsKKwkJc2V0X2RtYV9hZGRyMChzdHJlYW0tPmRtYSwgc3RyZWFtLT5idWZmZXItPnN0YXJ0KTsKKwkJc2V0X2RtYV9jb3VudDAoc3RyZWFtLT5kbWEsIHN0cmVhbS0+cGVyaW9kX3NpemUgPj4gMSk7CisJCXNldF9kbWFfYWRkcjEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5uZXh0LT5zdGFydCk7CisJCXNldF9kbWFfY291bnQxKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCX0gZWxzZSB7CisJCWNsZWFyX2RtYV9kb25lMShzdHJlYW0tPmRtYSk7CisJCXNldF9kbWFfYWRkcjEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5zdGFydCk7CisJCXNldF9kbWFfY291bnQxKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCQlzZXRfZG1hX2FkZHIwKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPmJ1ZmZlci0+bmV4dC0+c3RhcnQpOworCQlzZXRfZG1hX2NvdW50MChzdHJlYW0tPmRtYSwgc3RyZWFtLT5wZXJpb2Rfc2l6ZSA+PiAxKTsKKwl9CisJZW5hYmxlX2RtYV9idWZmZXJzKHN0cmVhbS0+ZG1hKTsKKwlzdGFydF9kbWEoc3RyZWFtLT5kbWEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXUxMDAwX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSA9IChzdHJ1Y3QgYXVkaW9fc3RyZWFtICopcHRyOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gc3RyZWFtLT5zdWJzdHJlYW07CisKKwlzd2l0Y2ggKGdldF9kbWFfYnVmZmVyX2RvbmUoc3RyZWFtLT5kbWEpKSB7CisJY2FzZSBETUFfRDA6CisJCXN0cmVhbS0+YnVmZmVyID0gc3RyZWFtLT5idWZmZXItPm5leHQ7CisJCWNsZWFyX2RtYV9kb25lMChzdHJlYW0tPmRtYSk7CisJCXNldF9kbWFfYWRkcjAoc3RyZWFtLT5kbWEsIHN0cmVhbS0+YnVmZmVyLT5uZXh0LT5zdGFydCk7CisJCXNldF9kbWFfY291bnQwKHN0cmVhbS0+ZG1hLCBzdHJlYW0tPnBlcmlvZF9zaXplID4+IDEpOworCQllbmFibGVfZG1hX2J1ZmZlcjAoc3RyZWFtLT5kbWEpOworCQlicmVhazsKKwljYXNlIERNQV9EMToKKwkJc3RyZWFtLT5idWZmZXIgPSBzdHJlYW0tPmJ1ZmZlci0+bmV4dDsKKwkJY2xlYXJfZG1hX2RvbmUxKHN0cmVhbS0+ZG1hKTsKKwkJc2V0X2RtYV9hZGRyMShzdHJlYW0tPmRtYSwgc3RyZWFtLT5idWZmZXItPm5leHQtPnN0YXJ0KTsKKwkJc2V0X2RtYV9jb3VudDEoc3RyZWFtLT5kbWEsIHN0cmVhbS0+cGVyaW9kX3NpemUgPj4gMSk7CisJCWVuYWJsZV9kbWFfYnVmZmVyMShzdHJlYW0tPmRtYSk7CisJCWJyZWFrOworCWNhc2UgKERNQV9EMCB8IERNQV9EMSk6CisJCXByX2RlYnVnKCJETUEgJWQgbWlzc2VkIGludGVycnVwdC5cbiIsIHN0cmVhbS0+ZG1hKTsKKwkJYXUxMDAwX2RtYV9zdG9wKHN0cmVhbSk7CisJCWF1MTAwMF9kbWFfc3RhcnQoc3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSAofkRNQV9EMCAmIH5ETUFfRDEpOgorCQlwcl9kZWJ1ZygiRE1BICVkIGVtcHR5IGlycS5cbiIsIHN0cmVhbS0+ZG1hKTsKKwl9CisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGFsY2hlbXlfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkgID0gU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJICAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fQkFUQ0gsCisJLmZvcm1hdHMJICA9IEFMQ0hFTVlfUENNX0ZNVFMsCisJLnJhdGVzCQkgID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJLnJhdGVfbWluCSAgPSBTTkRSVl9QQ01fUkFURV84MDAwLAorCS5yYXRlX21heAkgID0gU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCS5jaGFubmVsc19taW4JICA9IDIsCisJLmNoYW5uZWxzX21heAkgID0gMiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IDEwMjQsCisJLnBlcmlvZF9ieXRlc19tYXggPSAxNiAqIDEwMjQgLSAxLAorCS5wZXJpb2RzX21pbgkgID0gNCwKKwkucGVyaW9kc19tYXgJICA9IDI1NSwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDEyOCAqIDEwMjQsCisJLmZpZm9fc2l6ZQkgID0gMTYsCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhbGNoZW15X3BjbV9jdHggKnNzX3RvX2N0eChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzcy0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpb19zdHJlYW0gKnNzX3RvX2FzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IGFsY2hlbXlfcGNtX2N0eCAqY3R4ID0gc3NfdG9fY3R4KHNzKTsKKwlyZXR1cm4gJihjdHgtPnN0cmVhbVtzcy0+c3RyZWFtXSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY21fY3R4ICpjdHggPSBzc190b19jdHgoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaW50ICpkbWFpZHMsIHMgPSBzdWJzdHJlYW0tPnN0cmVhbTsKKwljaGFyICpuYW1lOworCisJZG1haWRzID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwgc3Vic3RyZWFtKTsKKwlpZiAoIWRtYWlkcykKKwkJcmV0dXJuIC1FTk9ERVY7CS8qIHdob2EsIGhhcyBvcmRlcmluZyBjaGFuZ2VkPyAqLworCisJLyogRE1BIHNldHVwICovCisJbmFtZSA9IChzID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8gImF1ZGlvLXR4IiA6ICJhdWRpby1yeCI7CisJY3R4LT5zdHJlYW1bc10uZG1hID0gcmVxdWVzdF9hdTEwMDBfZG1hKGRtYWlkc1tzXSwgbmFtZSwKKwkJCQkJYXUxMDAwX2RtYV9pbnRlcnJ1cHQsIDAsCisJCQkJCSZjdHgtPnN0cmVhbVtzXSk7CisJc2V0X2RtYV9tb2RlKGN0eC0+c3RyZWFtW3NdLmRtYSwKKwkJICAgICBnZXRfZG1hX21vZGUoY3R4LT5zdHJlYW1bc10uZG1hKSAmIH5ETUFfTkMpOworCisJY3R4LT5zdHJlYW1bc10uc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWN0eC0+c3RyZWFtW3NdLmJ1ZmZlciA9IE5VTEw7CisJc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZhbGNoZW15X3BjbV9oYXJkd2FyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYWxjaGVteV9wY21fY3R4ICpjdHggPSBzc190b19jdHgoc3Vic3RyZWFtKTsKKwlpbnQgc3R5cGUgPSBzdWJzdHJlYW0tPnN0cmVhbTsKKworCWN0eC0+c3RyZWFtW3N0eXBlXS5zdWJzdHJlYW0gPSBOVUxMOworCWZyZWVfYXUxMDAwX2RtYShjdHgtPnN0cmVhbVtzdHlwZV0uZG1hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsY2hlbXlfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJc3RydWN0IGF1ZGlvX3N0cmVhbSAqc3RyZWFtID0gc3NfdG9fYXMoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkgICAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhdTEwMDBfc2V0dXBfZG1hX2xpbmsoc3RyZWFtLAorCQkJCSAgICBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcyksCisJCQkJICAgIHBhcmFtc19wZXJpb2RzKGh3X3BhcmFtcykpOworCWlmIChlcnIpCisJCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWxjaGVteV9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXVkaW9fc3RyZWFtICpzdHJlYW0gPSBzc190b19hcyhzdWJzdHJlYW0pOworCWF1MTAwMF9yZWxlYXNlX2RtYV9saW5rKHN0cmVhbSk7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBhdWRpb19zdHJlYW0gKnN0cmVhbSA9IHNzX3RvX2FzKHN1YnN0cmVhbSk7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWF1MTAwMF9kbWFfc3RhcnQoc3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlhdTEwMDBfZG1hX3N0b3Aoc3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBhbGNoZW15X3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCit7CisJc3RydWN0IGF1ZGlvX3N0cmVhbSAqc3RyZWFtID0gc3NfdG9fYXMoc3MpOworCWxvbmcgbG9jYXRpb247CisKKwlsb2NhdGlvbiA9IGdldF9kbWFfcmVzaWR1ZShzdHJlYW0tPmRtYSk7CisJbG9jYXRpb24gPSBzdHJlYW0tPmJ1ZmZlci0+cmVsYXRpdmVfZW5kIC0gbG9jYXRpb247CisJaWYgKGxvY2F0aW9uID09IC0xKQorCQlsb2NhdGlvbiA9IDA7CisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzcy0+cnVudGltZSwgbG9jYXRpb24pOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGFsY2hlbXlfcGNtX29wcyA9IHsKKwkub3BlbgkJCT0gYWxjaGVteV9wY21fb3BlbiwKKwkuY2xvc2UJCQk9IGFsY2hlbXlfcGNtX2Nsb3NlLAorCS5pb2N0bAkJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwkgICAgICAgID0gYWxjaGVteV9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCSAgICAgICAgPSBhbGNoZW15X3BjbV9od19mcmVlLAorCS50cmlnZ2VyCQk9IGFsY2hlbXlfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJCT0gYWxjaGVteV9wY21fcG9pbnRlciwKK307CisKK3N0YXRpYyB2b2lkIGFsY2hlbXlfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKworc3RhdGljIGludCBhbGNoZW15X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CisKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfQ09OVElOVU9VUywKKwkJc25kX2RtYV9jb250aW51b3VzX2RhdGEoR0ZQX0tFUk5FTCksIDY1NTM2LCAoNDA5NiAqIDEwMjQpIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGFsY2hlbXlfcGNtX3NvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZhbGNoZW15X3BjbV9vcHMsCisJLnBjbV9uZXcJPSBhbGNoZW15X3BjbV9uZXcsCisJLnBjbV9mcmVlCT0gYWxjaGVteV9wY21fZnJlZV9kbWFfYnVmZmVycywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFsY2hlbXlfcGNtX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFsY2hlbXlfcGNtX2N0eCAqY3R4OworCWludCByZXQ7CisKKwljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJmFsY2hlbXlfcGNtX3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCkKKwkJa2ZyZWUoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFsY2hlbXlfcGNtX2RydnJlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbGNoZW15X3BjbV9jdHggKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworCWtmcmVlKGN0eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWxjaGVteV9wY21kbWFfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImFsY2hlbXktcGNtLWRtYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFsY2hlbXlfcGNtX2RydnByb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWxjaGVteV9wY21fZHJ2cmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsY2hlbXlfcGNtZG1hX2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbGNoZW15X3BjbWRtYV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxjaGVteV9wY21kbWFfdW5sb2FkKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFsY2hlbXlfcGNtZG1hX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsY2hlbXlfcGNtZG1hX2xvYWQpOworbW9kdWxlX2V4aXQoYWxjaGVteV9wY21kbWFfdW5sb2FkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAvQXUxNTAwL0F1MTEwMCBBdWRpbyBETUEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYW51ZWwgTGF1c3MiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2kyc2MuYyBiL3NvdW5kL3NvYy9hdTF4L2kyc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNmNDhmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2F1MXgvaTJzYy5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQXUxMDAwL0F1MTUwMC9BdTExMDAgSTJTIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBBU29DCisgKgorICogKGMpIDIwMTEgTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTm90ZTogY2xvY2sgc3VwcGxpZWQgdG8gdGhlIEkyUyBjb250cm9sbGVyIG11c3QgYmUgMjU2eCBzYW1wbGVyYXRlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworI2luY2x1ZGUgInBzYy5oIgorCisjZGVmaW5lIEkyU19SWFRYCTB4MDAKKyNkZWZpbmUgSTJTX0NGRwkJMHgwNAorI2RlZmluZSBJMlNfRU5BQkxFCTB4MDgKKworI2RlZmluZSBDRkdfWFUJCSgxIDw8IDI1KQkvKiB0eCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgQ0ZHX1hPCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ0ZHX1JVCQkoMSA8PCAyMykKKyNkZWZpbmUgQ0ZHX1JPCQkoMSA8PCAyMikKKyNkZWZpbmUgQ0ZHX1RSCQkoMSA8PCAyMSkKKyNkZWZpbmUgQ0ZHX1RFCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ0ZHX1RGCQkoMSA8PCAxOSkKKyNkZWZpbmUgQ0ZHX1JSCQkoMSA8PCAxOCkKKyNkZWZpbmUgQ0ZHX1JGCQkoMSA8PCAxNykKKyNkZWZpbmUgQ0ZHX0lDSwkJKDEgPDwgMTIpCS8qIGNsb2NrIGludmVydCAqLworI2RlZmluZSBDRkdfUEQJCSgxIDw8IDExKQkvKiBzZXQgdG8gbWFrZSBJMlNESU8gSU5QVVQgKi8KKyNkZWZpbmUgQ0ZHX0xCCQkoMSA8PCAxMCkJLyogbG9vcGJhY2sgKi8KKyNkZWZpbmUgQ0ZHX0lDCQkoMSA8PCA5KQkvKiB3b3JkIHNlbGVjdCBpbnZlcnQgKi8KKyNkZWZpbmUgQ0ZHX0ZNX0kyUwkoMCA8PCA3KQkvKiBJMlMgZm9ybWF0ICovCisjZGVmaW5lIENGR19GTV9MSgkoMSA8PCA3KQkvKiBsZWZ0LWp1c3RpZmllZCAqLworI2RlZmluZSBDRkdfRk1fUkoJKDIgPDwgNykJLyogcmlnaHQtanVzdGlmaWVkICovCisjZGVmaW5lIENGR19GTV9NQVNLCSgzIDw8IDcpCisjZGVmaW5lIENGR19UTgkJKDEgPDwgNikJLyogdHggZmlmbyBlbiAqLworI2RlZmluZSBDRkdfUk4JCSgxIDw8IDUpCS8qIHJ4IGZpZm8gZW4gKi8KKyNkZWZpbmUgQ0ZHX1NaXzgJKDB4MDgpCisjZGVmaW5lIENGR19TWl8xNgkoMHgxMCkKKyNkZWZpbmUgQ0ZHX1NaXzE4CSgweDEyKQorI2RlZmluZSBDRkdfU1pfMjAJKDB4MTQpCisjZGVmaW5lIENGR19TWl8yNAkoMHgxOCkKKyNkZWZpbmUgQ0ZHX1NaX01BU0sJKDB4MWYpCisjZGVmaW5lIEVOX0QJCSgxIDw8IDEpCS8qIERJU2FibGUgKi8KKyNkZWZpbmUgRU5fQ0UJCSgxIDw8IDApCS8qIGNsb2NrIGVuYWJsZSAqLworCisvKiBvbmx5IGxpbWl0ZWQgYnkgY2xvY2sgZ2VuZXJhdG9yIGFuZCBib2FyZCBkZXNpZ24gKi8KKyNkZWZpbmUgQVUxWEkyU0NfUkFURVMgXAorCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMKKworI2RlZmluZSBBVTFYSTJTQ19GTVRTIFwKKwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTggfAkJXAorCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1MxOF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1UxOF8zTEUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9TMThfM0JFIHwgU05EUlZfUENNX0ZNVEJJVF9VMThfM0JFIHwJXAorCVNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFNORFJWX1BDTV9GTVRCSVRfVTIwXzNMRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1MyMF8zQkUgfCBTTkRSVl9QQ01fRk1UQklUX1UyMF8zQkUgfAlcCisJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSB8CVwKKwlTTkRSVl9QQ01fRk1UQklUX1UyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfVTI0X0JFIHwJXAorCTApCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBSRChzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0eC0+bW1pbyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBXUihzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHgsIGludCByZWcsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlfX3Jhd193cml0ZWwodiwgY3R4LT5tbWlvICsgcmVnKTsKKwl3bWIoKTsKK30KKworc3RhdGljIGludCBhdTF4aTJzX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCXVuc2lnbmVkIGxvbmcgYzsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVJTlZBTDsKKwljID0gY3R4LT5jZmc7CisKKwljICY9IH5DRkdfRk1fTUFTSzsKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWMgfD0gQ0ZHX0ZNX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9NU0I6CisJCWMgfD0gQ0ZHX0ZNX1JKOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xTQjoKKwkJYyB8PSBDRkdfRk1fTEo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCWMgJj0gfihDRkdfSUMgfCBDRkdfSUNLKTsJCS8qIElCLUlGICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWMgfD0gQ0ZHX0lDIHwgQ0ZHX0lDSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJYyB8PSBDRkdfSUM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWMgfD0gQ0ZHX0lDSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQorCisJLyogSTJTIGNvbnRyb2xsZXIgb25seSBzdXBwb3J0cyBtYXN0ZXIgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgkvKiBDT0RFQyBzbGF2ZSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAwOworCWN0eC0+Y2ZnID0gYzsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIGludCBjbWQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHN0eXBlID0gU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJLyogcG93ZXIgdXAgKi8KKwkJV1IoY3R4LCBJMlNfRU5BQkxFLCBFTl9EIHwgRU5fQ0UpOworCQlXUihjdHgsIEkyU19FTkFCTEUsIEVOX0NFKTsKKwkJY3R4LT5jZmcgfD0gKHN0eXBlID09IFBDTV9UWCkgPyBDRkdfVE4gOiBDRkdfUk47CisJCVdSKGN0eCwgSTJTX0NGRywgY3R4LT5jZmcpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQljdHgtPmNmZyAmPSB+KChzdHlwZSA9PSBQQ01fVFgpID8gQ0ZHX1ROIDogQ0ZHX1JOKTsKKwkJV1IoY3R4LCBJMlNfQ0ZHLCBjdHgtPmNmZyk7CisJCVdSKGN0eCwgSTJTX0VOQUJMRSwgRU5fRCk7CQkvKiBwb3dlciBvZmYgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1zYml0c190b19yZWcoaW50IG1zYml0cykKK3sKKwlzd2l0Y2ggKG1zYml0cykgeworCWNhc2UgODoKKwkJcmV0dXJuIENGR19TWl84OworCWNhc2UgMTY6CisJCXJldHVybiBDRkdfU1pfMTY7CisJY2FzZSAxODoKKwkJcmV0dXJuIENGR19TWl8xODsKKwljYXNlIDIwOgorCQlyZXR1cm4gQ0ZHX1NaXzIwOworCWNhc2UgMjQ6CisJCXJldHVybiBDRkdfU1pfMjQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqY3R4ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2ID0gbXNiaXRzX3RvX3JlZyhwYXJhbXMtPm1zYml0cyk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0eC0+Y2ZnICY9IH5DRkdfU1pfTUFTSzsKKwljdHgtPmNmZyB8PSB2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MXhpMnNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmY3R4LT5kbWFpZHNbMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhdTF4aTJzX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAJPSBhdTF4aTJzX3N0YXJ0dXAsCisJLnRyaWdnZXIJPSBhdTF4aTJzX3RyaWdnZXIsCisJLmh3X3BhcmFtcwk9IGF1MXhpMnNfaHdfcGFyYW1zLAorCS5zZXRfZm10CT0gYXUxeGkyc19zZXRfZm10LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYXUxeGkyc19kYWlfZHJpdmVyID0geworCS5zeW1tZXRyaWNfcmF0ZXMJPSAxLAorCS5wbGF5YmFjayA9IHsKKwkJLnJhdGVzCQk9IEFVMVhJMlNDX1JBVEVTLAorCQkuZm9ybWF0cwk9IEFVMVhJMlNDX0ZNVFMsCisJCS5jaGFubmVsc19taW4JPSAyLAorCQkuY2hhbm5lbHNfbWF4CT0gMiwKKwl9LAorCS5jYXB0dXJlID0geworCQkucmF0ZXMJCT0gQVUxWEkyU0NfUkFURVMsCisJCS5mb3JtYXRzCT0gQVUxWEkyU0NfRk1UUywKKwkJLmNoYW5uZWxzX21pbgk9IDIsCisJCS5jaGFubmVsc19tYXgJPSAyLAorCX0sCisJLm9wcyA9ICZhdTF4aTJzX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4aTJzX2RydnByb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFpb3JlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDA7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcyksCisJCQkJcGRldi0+bmFtZSkpCisJCWdvdG8gb3V0MDsKKworCWN0eC0+bW1pbyA9IGlvcmVtYXBfbm9jYWNoZShpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpKTsKKwlpZiAoIWN0eC0+bW1pbykKKwkJZ290byBvdXQxOworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCWN0eC0+ZG1haWRzW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gZG1hcmVzLT5zdGFydDsKKworCWRtYXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7CisJaWYgKCFkbWFyZXMpCisJCWdvdG8gb3V0MjsKKwljdHgtPmRtYWlkc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gZG1hcmVzLT5zdGFydDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2LCAmYXUxeGkyc19kYWlfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDI7CisKKwlyZXR1cm4gMDsKKworb3V0MjoKKwlpb3VubWFwKGN0eC0+bW1pbyk7CitvdXQxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihpb3Jlcy0+c3RhcnQsIHJlc291cmNlX3NpemUoaW9yZXMpKTsKK291dDA6CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdTF4aTJzX2RydnJlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworCisJV1IoY3R4LCBJMlNfRU5BQkxFLCBFTl9EKTsJLyogY2xvY2sgb2ZmLCBkaXNhYmxlICovCisKKwlpb3VubWFwKGN0eC0+bW1pbyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlrZnJlZShjdHgpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYXUxeGkyc19kcnZzdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCVdSKGN0eCwgSTJTX0VOQUJMRSwgRU5fRCk7CS8qIGNsb2NrIG9mZiwgZGlzYWJsZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxeGkyc19kcnZyZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYXUxeGkyc2NfcG1vcHMgPSB7CisJLnN1c3BlbmQJPSBhdTF4aTJzX2RydnN1c3BlbmQsCisJLnJlc3VtZQkJPSBhdTF4aTJzX2RydnJlc3VtZSwKK307CisKKyNkZWZpbmUgQVUxWEkyU0NfUE1PUFMgKCZhdTF4aTJzY19wbW9wcykKKworI2Vsc2UKKworI2RlZmluZSBBVTFYSTJTQ19QTU9QUyBOVUxMCisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4aTJzX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJhbGNoZW15LWkyc2MiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gQVUxWEkyU0NfUE1PUFMsCisJfSwKKwkucHJvYmUJCT0gYXUxeGkyc19kcnZwcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF1MXhpMnNfZHJ2cmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1MXhpMnNfbG9hZCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF1MXhpMnNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MXhpMnNfdW5sb2FkKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MXhpMnNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXUxeGkyc19sb2FkKTsKK21vZHVsZV9leGl0KGF1MXhpMnNfdW5sb2FkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAvMTUwMC8xMTAwIEkyUyBBU29DIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFudWVsIExhdXNzIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9wc2MtYWM5Ny5jIGIvc291bmQvc29jL2F1MXgvcHNjLWFjOTcuYwppbmRleCBkMGRiNjZmLi4wYzZhY2Q1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9wc2MtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9hdTF4L3BzYy1hYzk3LmMKQEAgLTQxLDE0ICs0MSwxNCBAQAogCShTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNCRSkKIAogI2RlZmluZSBBQzk3UENSX1NUQVJUKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVFMgOiBQU0NfQUM5N1BDUl9SUykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVFMgOiBQU0NfQUM5N1BDUl9SUykKICNkZWZpbmUgQUM5N1BDUl9TVE9QKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVFAgOiBQU0NfQUM5N1BDUl9SUCkKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVFAgOiBQU0NfQUM5N1BDUl9SUCkKICNkZWZpbmUgQUM5N1BDUl9DTFJGSUZPKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdQQ1JfVEMgOiBQU0NfQUM5N1BDUl9SQykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0FDOTdQQ1JfVEMgOiBQU0NfQUM5N1BDUl9SQykKIAogI2RlZmluZSBBQzk3U1RBVF9CVVNZKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0FDOTdTVEFUX1RCIDogUFNDX0FDOTdTVEFUX1JCKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfQUM5N1NUQVRfVEIgOiBQU0NfQUM5N1NUQVRfUkIpCiAKIC8qIGluc3RhbmNlIGRhdGEuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSwgTWFjTGVvZCEhISEgKi8KIHN0YXRpYyBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICphdTF4cHNjX2FjOTdfd29ya2RhdGE7CkBAIC0yMTUsNyArMjE1LDcgQEAKIHsKIAlzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhICpwc2NkYXRhID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAl1bnNpZ25lZCBsb25nIHIsIHJvLCBzdGF0OwotCWludCBjaGFucywgdCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCBjaGFucywgdCwgc3R5cGUgPSBzdWJzdHJlYW0tPnN0cmVhbTsKIAogCWNoYW5zID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQlyIHw9IFBTQ19BQzk3Q0ZHX1NFVF9MRU4ocGFyYW1zLT5tc2JpdHMpOwogCiAJCS8qIGNoYW5uZWxzOiBlbmFibGUgc2xvdHMgZm9yIGZyb250IEwvUiBjaGFubmVsICovCi0JCWlmIChzdHlwZSA9PSBQQ01fVFgpIHsKKwkJaWYgKHN0eXBlID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJCXIgJj0gflBTQ19BQzk3Q0ZHX1RYU0xPVF9NQVNLOwogCQkJciB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDMpOwogCQkJciB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDQpOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCQkJaW50IGNtZCwgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCByZXQsIHN0eXBlID0gc3Vic3RyZWFtLT5zdHJlYW07CiAKIAlyZXQgPSAwOwogCkBAIC0zMjQsMTIgKzMyNCwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYXUxeHBzY19hYzk3X3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCAmcHNjZGF0YS0+ZG1haWRzWzBdKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdTF4cHNjX2FjOTdfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJcmV0dXJuIGF1MXhwc2NfYWM5N193b3JrZGF0YSA/IDAgOiAtRU5PREVWOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhdTF4cHNjX2FjOTdfZGFpX29wcyA9IHsKKwkuc3RhcnR1cAk9IGF1MXhwc2NfYWM5N19zdGFydHVwLAogCS50cmlnZ2VyCT0gYXUxeHBzY19hYzk3X3RyaWdnZXIsCiAJLmh3X3BhcmFtcwk9IGF1MXhwc2NfYWM5N19od19wYXJhbXMsCiB9OwpAQCAtMzU1LDcgKzM2NCw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4cHNjX2FjOTdfZHJ2cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOwogCXVuc2lnbmVkIGxvbmcgc2VsOwogCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKndkOwogCkBAIC0zNjUsMjAgKzM3NCwzMSBAQAogCiAJbXV0ZXhfaW5pdCgmd2QtPmxvY2spOwogCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKSB7CisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQwOwogCX0KIAogCXJldCA9IC1FQlVTWTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkKIAkJZ290byBvdXQwOwogCi0Jd2QtPm1taW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwl3ZC0+bW1pbyA9IGlvcmVtYXAoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiAJaWYgKCF3ZC0+bW1pbykKIAkJZ290byBvdXQxOwogCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBkbWFyZXMtPnN0YXJ0OworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKIAkvKiBjb25maWd1cmF0aW9uOiBtYXggZG1hIHRyaWdnZXIgdGhyZXNob2xkLCBlbmFibGUgYWM5NyAqLwogCXdkLT5jZmcgPSBQU0NfQUM5N0NGR19SVF9GSUZPOCB8IFBTQ19BQzk3Q0ZHX1RUX0ZJRk84IHwKIAkJICBQU0NfQUM5N0NGR19ERV9FTkFCTEU7CkBAIC00MDEsMTcgKzQyMSwxNSBAQAogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJndkLT5kYWlfZHJ2KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDE7CisJCWdvdG8gb3V0MjsKIAotCXdkLT5kbWFwZCA9IGF1MXhwc2NfcGNtX2FkZChwZGV2KTsKLQlpZiAod2QtPmRtYXBkKSB7Ci0JCWF1MXhwc2NfYWM5N193b3JrZGF0YSA9IHdkOwotCQlyZXR1cm4gMDsKLQl9CisJYXUxeHBzY19hYzk3X3dvcmtkYXRhID0gd2Q7CisJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworb3V0MjoKKwlpb3VubWFwKHdkLT5tbWlvKTsKIG91dDE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiBvdXQwOgogCWtmcmVlKHdkKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDIyLDkgKzQ0MCw2IEBACiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JaWYgKHdkLT5kbWFwZCkKLQkJYXUxeHBzY19wY21fZGVzdHJveSh3ZC0+ZG1hcGQpOwotCiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAogCS8qIGRpc2FibGUgUFNDIGNvbXBsZXRlbHkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L3BzYy1pMnMuYyBiL3NvdW5kL3NvYy9hdTF4L3BzYy1pMnMuYwppbmRleCBmY2EwOTEyLi5lMDNjNWNlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9wc2MtaTJzLmMKKysrIGIvc291bmQvc29jL2F1MXgvcHNjLWkycy5jCkBAIC00MiwxMyArNDIsMTMgQEAKIAkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKIAogI2RlZmluZSBJMlNTVEFUX0JVU1koc3R5cGUpCVwKLQkoKHN0eXBlKSA9PSBQQ01fVFggPyBQU0NfSTJTU1RBVF9UQiA6IFBTQ19JMlNTVEFUX1JCKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfSTJTU1RBVF9UQiA6IFBTQ19JMlNTVEFUX1JCKQogI2RlZmluZSBJMlNQQ1JfU1RBUlQoc3R5cGUpCVwKLQkoKHN0eXBlKSA9PSBQQ01fVFggPyBQU0NfSTJTUENSX1RTIDogUFNDX0kyU1BDUl9SUykKKwkoKHN0eXBlKSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8gUFNDX0kyU1BDUl9UUyA6IFBTQ19JMlNQQ1JfUlMpCiAjZGVmaW5lIEkyU1BDUl9TVE9QKHN0eXBlKQlcCi0JKChzdHlwZSkgPT0gUENNX1RYID8gUFNDX0kyU1BDUl9UUCA6IFBTQ19JMlNQQ1JfUlApCisJKChzdHlwZSkgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IFBTQ19JMlNQQ1JfVFAgOiBQU0NfSTJTUENSX1JQKQogI2RlZmluZSBJMlNQQ1JfQ0xSRklGTyhzdHlwZSkJXAotCSgoc3R5cGUpID09IFBDTV9UWCA/IFBTQ19JMlNQQ1JfVEMgOiBQU0NfSTJTUENSX1JDKQorCSgoc3R5cGUpID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyBQU0NfSTJTUENSX1RDIDogUFNDX0kyU1BDUl9SQykKIAogCiBzdGF0aWMgaW50IGF1MXhwc2NfaTJzX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpLApAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqcHNjZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3R5cGUgPSBTVUJTVFJFQU1fVFlQRShzdWJzdHJlYW0pOworCWludCByZXQsIHN0eXBlID0gc3Vic3RyZWFtLT5zdHJlYW07CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CkBAIC0yNTcsNyArMjU3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBhdTF4cHNjX2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBhdTF4cHNjX2F1ZGlvX2RhdGEgKnBzY2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwgJnBzY2RhdGEtPmRtYWlkc1swXSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGF1MXhwc2NfaTJzX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAJPSBhdTF4cHNjX2kyc19zdGFydHVwLAogCS50cmlnZ2VyCT0gYXUxeHBzY19pMnNfdHJpZ2dlciwKIAkuaHdfcGFyYW1zCT0gYXUxeHBzY19pMnNfaHdfcGFyYW1zLAogCS5zZXRfZm10CT0gYXUxeHBzY19pMnNfc2V0X2ZtdCwKQEAgLTI4MSw3ICsyOTAsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4cHNjX2kyc19kcnZwcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvcmVzLCAqZG1hcmVzOwogCXVuc2lnbmVkIGxvbmcgc2VsOwogCWludCByZXQ7CiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2Q7CkBAIC0yOTAsMjAgKzI5OSwzMSBAQAogCWlmICghd2QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKSB7CisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQwOwogCX0KIAogCXJldCA9IC1FQlVTWTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSwKKwkJCQlwZGV2LT5uYW1lKSkKIAkJZ290byBvdXQwOwogCi0Jd2QtPm1taW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwl3ZC0+bW1pbyA9IGlvcmVtYXAoaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiAJaWYgKCF3ZC0+bW1pbykKIAkJZ290byBvdXQxOwogCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPSBkbWFyZXMtPnN0YXJ0OworCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIWRtYXJlcykKKwkJZ290byBvdXQyOworCXdkLT5kbWFpZHNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGRtYXJlcy0+c3RhcnQ7CisKIAkvKiBwcmVzZXJ2ZSBQU0MgY2xvY2sgc291cmNlIHNldCB1cCBieSBwbGF0Zm9ybSAoZGV2LnBsYXRmb3JtX2RhdGEKIAkgKiBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IHNvYyBsYXllcikKIAkgKi8KQEAgLTMzMCwxNyArMzUwLDEzIEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2QpOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJndkLT5kYWlfZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDE7Ci0KLQkvKiBmaW5hbGx5IGFkZCB0aGUgRE1BIGRldmljZSBmb3IgdGhpcyBQU0MgKi8KLQl3ZC0+ZG1hcGQgPSBhdTF4cHNjX3BjbV9hZGQocGRldik7Ci0JaWYgKHdkLT5kbWFwZCkKKwlpZiAoIXJldCkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworb3V0MjoKKwlpb3VubWFwKHdkLT5tbWlvKTsKIG91dDE6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9yZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKGlvcmVzKSk7CiBvdXQwOgogCWtmcmVlKHdkKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzUxLDkgKzM2Nyw2IEBACiAJc3RydWN0IGF1MXhwc2NfYXVkaW9fZGF0YSAqd2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCi0JaWYgKHdkLT5kbWFwZCkKLQkJYXUxeHBzY19wY21fZGVzdHJveSh3ZC0+ZG1hcGQpOwotCiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAogCWF1X3dyaXRlbCgwLCBJMlNfQ0ZHKHdkKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9wc2MuaCBiL3NvdW5kL3NvYy9hdTF4L3BzYy5oCmluZGV4IGIzMGVhZGQuLmIxNmIyZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdTF4L3BzYy5oCisrKyBiL3NvdW5kL3NvYy9hdTF4L3BzYy5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIEF1MTJ4MC9BdTE1NTAgUFNDIEFMU0EgQVNvQyBhdWRpbyBzdXBwb3J0LgorICogQWxjaGVteSBBTFNBIEFTb0MgYXVkaW8gc3VwcG9ydC4KICAqCi0gKiAoYykgMjAwNy0yMDA4IE1TQyBWZXJ0cmllYnNnZXMubS5iLkguLAorICogKGMpIDIwMDctMjAxMSBNU0MgVmVydHJpZWJzZ2VzLm0uYi5ILiwKICAqCU1hbnVlbCBMYXVzcyA8bWFudWVsLmxhdXNzQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTMsMTAgKzEzLDYgQEAKICNpZm5kZWYgX0FVMVhfUENNX0gKICNkZWZpbmUgX0FVMVhfUENNX0gKIAotLyogREJETUEgaGVscGVycyAqLwotZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF1MXhwc2NfcGNtX2FkZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLWV4dGVybiB2b2lkIGF1MXhwc2NfcGNtX2Rlc3Ryb3koc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1hcGQpOwotCiBzdHJ1Y3QgYXUxeHBzY19hdWRpb19kYXRhIHsKIAl2b2lkIF9faW9tZW0gKm1taW87CiAKQEAgLTI3LDE1ICsyMyw5IEBACiAKIAl1bnNpZ25lZCBsb25nIHBtWzJdOwogCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRtYXBkOworCWludCBkbWFpZHNbMl07CiB9OwogCi0jZGVmaW5lIFBDTV9UWAkwCi0jZGVmaW5lIFBDTV9SWAkxCi0KLSNkZWZpbmUgU1VCU1RSRUFNX1RZUEUoc3Vic3RyZWFtKSBcCi0JKChzdWJzdHJlYW0pLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IFBDTV9UWCA6IFBDTV9SWCkKLQogLyogZWFzeSBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIFBTQ19DVFJMKHgpCSgodW5zaWduZWQgbG9uZykoKHgpLT5tbWlvKSArIFBTQ19DVFJMX09GRlNFVCkKICNkZWZpbmUgUFNDX1NFTCh4KQkoKHVuc2lnbmVkIGxvbmcpKCh4KS0+bW1pbykgKyBQU0NfU0VMX09GRlNFVCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9LY29uZmlnIGIvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKaW5kZXggZmU5ZDU0OC4uOWY2YmM1NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKKysrIGIvc291bmQvc29jL2JsYWNrZmluL0tjb25maWcKQEAgLTI3LDYgKzI3LDE5IEBACiAJICBib2FyZCBjb25uZWN0ZWQgdG8gb25lIG9mIHRoZSBCbGFja2ZpbiBldmFsdWF0aW9uIGJvYXJkcyBsaWtlIHRoZQogCSAgQkY1WFgtU1RBTVAgb3IgQkY1WFgtRVpLSVQuCiAKK2NvbmZpZyBTTkRfU09DX0JGSU5fRVZBTF9BREFVMTM3MworCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgRVZBTC1BREFVMTM3MyBib2FyZCBvbiBCbGFja2ZpbiBldmFsIGJvYXJkcyIKKwlkZXBlbmRzIG9uIFNORF9CRjVYWF9JMlMgJiYgSTJDCisJc2VsZWN0IFNORF9CRjVYWF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfQURBVTEzNzMKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzIEVWQUwtQURBVTEzNzMKKwkgIGJvYXJkIGNvbm5lY3RlZCB0byBvbmUgb2YgdGhlIEJsYWNrZmluIGV2YWx1YXRpb24gYm9hcmRzIGxpa2UgdGhlCisJICBCRjVYWC1TVEFNUCBvciBCRjVYWC1FWktJVC4KKworCSAgTm90ZTogVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGF0IGZpcnN0IEFEQVUxMzczIERBSSBpcyBjb25uZWN0ZWQgdG8gdGhlCisJICBmaXJzdCBTUE9SVCBwb3J0IG9uIHRoZSBCRjVYWCBib2FyZC4KKwogY29uZmlnIFNORF9TT0NfQkZJTl9FVkFMX0FEQVY4MFgKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdGhlIEVWQUwtQURBVjgwWCBib2FyZHMgb24gQmxhY2tmaW4gZXZhbCBib2FyZHMiCiAJZGVwZW5kcyBvbiBTTkRfQkY1WFhfSTJTICYmIChTUElfTUFTVEVSIHx8IEkyQykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZSBiL3NvdW5kL3NvYy9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA2MDE4YmY1Li4xYmY4NmNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2JsYWNrZmluL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBzbmQtc3NtMjYwMi1vYmpzIDo9IGJmNXh4LXNzbTI2MDIubwogc25kLWFkNzMzMTEtb2JqcyA6PSBiZjV4eC1hZDczMzExLm8KIHNuZC1hZDE5M3gtb2JqcyA6PSBiZjV4eC1hZDE5M3gubworc25kLXNvYy1iZmluLWV2YWwtYWRhdTEzNzMtb2JqcyA6PSBiZmluLWV2YWwtYWRhdTEzNzMubwogc25kLXNvYy1iZmluLWV2YWwtYWRhdTE3MDEtb2JqcyA6PSBiZmluLWV2YWwtYWRhdTE3MDEubwogc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC1vYmpzIDo9IGJmaW4tZXZhbC1hZGF2ODB4Lm8KIApAQCAtMjksNSArMzAsNiBAQAogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfU1NNMjYwMikgKz0gc25kLXNzbTI2MDIubwogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSkgKz0gc25kLWFkNzMzMTEubwogb2JqLSQoQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTNYKSArPSBzbmQtYWQxOTN4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0JGSU5fRVZBTF9BREFVMTM3MykgKz0gc25kLXNvYy1iZmluLWV2YWwtYWRhdTEzNzMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQkZJTl9FVkFMX0FEQVUxNzAxKSArPSBzbmQtc29jLWJmaW4tZXZhbC1hZGF1MTcwMS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19CRklOX0VWQUxfQURBVjgwWCkgKz0gc25kLXNvYy1iZmluLWV2YWwtYWRhdjgweC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWM5Ny1wY20uYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCmluZGV4IDllNTlmNjguLjU2ODE1YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hYzk3LXBjbS5jCkBAIC00MTgsNyArNDE4LDcgQEAKIAogc3RhdGljIHU2NCBiZjV4eF9wY21fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLWludCBiZjV4eF9wY21fYWM5N19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX2FjOTdfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtaTJzLXBjbS5jCmluZGV4IDYxZGRmOTQuLjc1NjVlMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1pMnMtcGNtLmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWkycy1wY20uYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAKIHN0YXRpYyB1NjQgYmY1eHhfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1pbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgYmY1eHhfcGNtX2kyc19uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXNwb3J0LmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYwppbmRleCBhMmQ0MDM0Li4yZmQ5ZjJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3BvcnQuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF1MTM3My5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF1MTM3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjJhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmZpbi1ldmFsLWFkYXUxMzczLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBNYWNoaW5lIGRyaXZlciBmb3IgRVZBTC1BREFVMTM3MyBvbiBBbmFsb2cgRGV2aWNlcyBiZmluCisgKiBldmFsdWF0aW9uIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy9hZGF1MTM3My5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYmZpbl9ldmFsX2FkYXUxMzczX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluMyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEluNCIsIE5VTEwpLAorCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgT3V0MSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIE91dDIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTElORSgiU3RlcmVvIE91dCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0hQKCJFYXJwaWVjZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3JvdXRlc1tdID0geworCXsgIkFJTjFMIiwgTlVMTCwgIkxpbmUgSW4xIiB9LAorCXsgIkFJTjFSIiwgTlVMTCwgIkxpbmUgSW4xIiB9LAorCXsgIkFJTjJMIiwgTlVMTCwgIkxpbmUgSW4yIiB9LAorCXsgIkFJTjJSIiwgTlVMTCwgIkxpbmUgSW4yIiB9LAorCXsgIkFJTjNMIiwgTlVMTCwgIkxpbmUgSW4zIiB9LAorCXsgIkFJTjNSIiwgTlVMTCwgIkxpbmUgSW4zIiB9LAorCXsgIkFJTjRMIiwgTlVMTCwgIkxpbmUgSW40IiB9LAorCXsgIkFJTjRSIiwgTlVMTCwgIkxpbmUgSW40IiB9LAorCisJLyogTUlDQklBUyBjYW4gYmUgY29ubmVjdGVkIHZpYSBhIGp1bXBlciB0byB0aGUgbGluZS1pbiBqYWNrLCBzaW5jZSB3CisJICAgZG9uJ3Qga25vdyB3aGljaCBvbmUgaXMgZ29pbmcgdG8gYmUgdXNlZCwganVzdCBwb3dlciBib3RoLiAqLworCXsgIkxpbmUgSW4xIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4yIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4zIiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW40IiwgTlVMTCwgIk1JQ0JJQVMxIiB9LAorCXsgIkxpbmUgSW4xIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW4yIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW4zIiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCXsgIkxpbmUgSW40IiwgTlVMTCwgIk1JQ0JJQVMyIiB9LAorCisJeyAiTGluZSBPdXQxIiwgTlVMTCwgIkxPVVQxTCIgfSwKKwl7ICJMaW5lIE91dDEiLCBOVUxMLCAiTE9VVDFSIiB9LAorCXsgIkxpbmUgT3V0MiIsIE5VTEwsICJMT1VUMkwiIH0sCisJeyAiTGluZSBPdXQyIiwgTlVMTCwgIkxPVVQyUiIgfSwKKwl7ICJIZWFkcGhvbmUiLCBOVUxMLCAiSFBMIiB9LAorCXsgIkhlYWRwaG9uZSIsIE5VTEwsICJIUFIiIH0sCisJeyAiRWFycGllY2UiLCBOVUxMLCAiRVAiIH0sCisJeyAiU3BlYWtlciIsIE5VTEwsICJTUEtMIiB9LAorCXsgIlN0ZXJlbyBPdXQiLCBOVUxMLCAiU1BLUiIgfSwKK307CisKK3N0YXRpYyBpbnQgYmZpbl9ldmFsX2FkYXUxMzczX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKwlpbnQgcGxsX3JhdGU7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8CisJCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgNDgwMDA6CisJY2FzZSA4MDAwOgorCWNhc2UgMTIwMDA6CisJY2FzZSAxNjAwMDoKKwljYXNlIDI0MDAwOgorCWNhc2UgMzIwMDA6CisJCXBsbF9yYXRlID0gNDgwMDAgKiAxMDI0OworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNzM1MDoKKwljYXNlIDExMDI1OgorCWNhc2UgMTQ3MDA6CisJY2FzZSAyMjA1MDoKKwljYXNlIDI5NDAwOgorCQlwbGxfcmF0ZSA9IDQ0MTAwICogMTAyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIEFEQVUxMzczX1BMTDEsCisJCQlBREFVMTM3M19QTExfU1JDX01DTEsxLCAxMjI4ODAwMCwgcGxsX3JhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgQURBVTEzNzNfQ0xLX1NSQ19QTEwxLCBwbGxfcmF0ZSwKKwkJCVNORF9TT0NfQ0xPQ0tfSU4pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiZmluX2V2YWxfYWRhdTEzNzNfY29kZWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJdW5zaWduZWQgaW50IHBsbF9yYXRlID0gNDgwMDAgKiAxMDI0OworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgQURBVTEzNzNfUExMMSwKKwkJCUFEQVUxMzczX1BMTF9TUkNfTUNMSzEsIDEyMjg4MDAwLCBwbGxfcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBBREFVMTM3M19DTEtfU1JDX1BMTDEsIHBsbF9yYXRlLAorCQkJU05EX1NPQ19DTE9DS19JTik7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBiZmluX2V2YWxfYWRhdTEzNzNfb3BzID0geworCS5od19wYXJhbXMgPSBiZmluX2V2YWxfYWRhdTEzNzNfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJmaW5fZXZhbF9hZGF1MTM3M19kYWkgPSB7CisJLm5hbWUgPSAiYWRhdTEzNzMiLAorCS5zdHJlYW1fbmFtZSA9ICJhZGF1MTM3MyIsCisJLmNwdV9kYWlfbmFtZSA9ICJiZmluLWkycy4wIiwKKwkuY29kZWNfZGFpX25hbWUgPSAiYWRhdTEzNzMtYWlmMSIsCisJLnBsYXRmb3JtX25hbWUgPSAiYmZpbi1pMnMtcGNtLWF1ZGlvIiwKKwkuY29kZWNfbmFtZSA9ICJhZGF1MTM3My4wLTAwMWEiLAorCS5vcHMgPSAmYmZpbl9ldmFsX2FkYXUxMzczX29wcywKKwkuaW5pdCA9IGJmaW5fZXZhbF9hZGF1MTM3M19jb2RlY19pbml0LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYmZpbl9ldmFsX2FkYXUxMzczID0geworCS5uYW1lID0gImJmaW4tZXZhbC1hZGF1MTM3MyIsCisJLmRhaV9saW5rID0gJmJmaW5fZXZhbF9hZGF1MTM3M19kYWksCisJLm51bV9saW5rcyA9IDEsCisKKwkuZGFwbV93aWRnZXRzCQk9IGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGJmaW5fZXZhbF9hZGF1MTM3M19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwkJPSBiZmluX2V2YWxfYWRhdTEzNzNfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYmZpbl9ldmFsX2FkYXUxMzczX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBpbnQgYmZpbl9ldmFsX2FkYXUxMzczX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZiZmluX2V2YWxfYWRhdTEzNzM7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmYmZpbl9ldmFsX2FkYXUxMzczKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYmZpbl9ldmFsX2FkYXUxMzczX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fZXZhbF9hZGF1MTM3M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmZpbi1ldmFsLWFkYXUxMzczIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwl9LAorCS5wcm9iZSA9IGJmaW5fZXZhbF9hZGF1MTM3M19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYmZpbl9ldmFsX2FkYXUxMzczX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2V2YWxfYWRhdTEzNzNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJmaW5fZXZhbF9hZGF1MTM3M19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYmZpbl9ldmFsX2FkYXUxMzczX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9ldmFsX2FkYXUxMzczX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmZpbl9ldmFsX2FkYXUxMzczX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChiZmluX2V2YWxfYWRhdTEzNzNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBiZmluIGFkYXUxMzczIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZmluLWV2YWwtYWRhdTEzNzMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZmluLWV2YWwtYWRhdjgweC5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKaW5kZXggOGQwMTRkMC4uODk3Y2ZhNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmaW4tZXZhbC1hZGF2ODB4LmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMgYi9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKaW5kZXggMTkyNDE1Ny4uNWNhMTIyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC84OHBtODYweC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC03NzIsMTEgKzc3MywxMiBAQAogCiAKIAlTTkRfU09DX0RBUE1fQUlGX0lOKCJJMlMgRElOIiwgIkkyUyBQbGF5YmFjayIsIDAsCi0JCQkgICAgUE04NjBYX0RBQ19FTl8yLCAwLCAwKSwKKwkJCSAgICBTTkRfU09DX05PUE0sIDAsIDApLAogCVNORF9TT0NfREFQTV9BSUZfSU4oIkkyUyBESU4xIiwgIkkyUyBQbGF5YmFjayIsIDAsCi0JCQkgICAgUE04NjBYX0RBQ19FTl8yLCAwLCAwKSwKKwkJCSAgICBTTkRfU09DX05PUE0sIDAsIDApLAogCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJMlMgRE9VVCIsICJJMlMgQ2FwdHVyZSIsIDAsCiAJCQkgICAgIFBNODYwWF9JMlNfSUZBQ0VfMywgNSwgMSksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIENMSyIsIFBNODYwWF9EQUNfRU5fMiwgMCwgMCwgTlVMTCwgMCksCiAJU05EX1NPQ19EQVBNX01VWCgiSTJTIE1pYyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpMnNfbWljX211eCksCiAJU05EX1NPQ19EQVBNX01VWCgiQURDIExlZnQgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWRjbF9tdXgpLAogCVNORF9TT0NfREFQTV9NVVgoIkFEQyBSaWdodCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhZGNyX211eCksCkBAIC04NjgsNiArODcwLDExIEBACiAJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IEFEQyBNT0QifSwKIAl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBBREMgTU9EIn0sCiAKKwkvKiBJMlMgQ2xvY2sgKi8KKwl7IkkyUyBESU4iLCBOVUxMLCAiSTJTIENMSyJ9LAorCXsiSTJTIERJTjEiLCBOVUxMLCAiSTJTIENMSyJ9LAorCXsiSTJTIERPVVQiLCBOVUxMLCAiSTJTIENMSyJ9LAorCiAJLyogUENNL0FJRjEgSW5wdXRzICovCiAJeyJQQ00gU0RPIiwgTlVMTCwgIkFEQyBMZWZ0IE11eCJ9LAogCXsiUENNIFNETyIsIE5VTEwsICJBRENSIEVDIE11eCJ9LApAQCAtMTE3Myw2ICsxMTgwLDkgQEAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgQXVkaW8gUExMICYgQXVkaW8gc2VjdGlvbiAqLworCQkJZGF0YSA9IEFVRElPX1BMTCB8IEFVRElPX1NFQ1RJT05fT047CisJCQlwbTg2MHhfcmVnX3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIFJFR19NSVNDMiwgZGF0YSk7CisJCQl1ZGVsYXkoMzAwKTsKIAkJCWRhdGEgPSBBVURJT19QTEwgfCBBVURJT19TRUNUSU9OX1JFU0VUCiAJCQkJfCBBVURJT19TRUNUSU9OX09OOwogCQkJcG04NjB4X3JlZ193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBSRUdfTUlTQzIsIGRhdGEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IDY2NWQ5MjQuLjQ1ODQ1MTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTE3LDYgKzE3LDcgQEAKIAlzZWxlY3QgU05EX1NPQ19BRDE5M1ggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX0FEMTk4MCBpZiBTTkRfU09DX0FDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUQ3MzMxMQorCXNlbGVjdCBTTkRfU09DX0FEQVUxMzczIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FEQVY4MFgKIAlzZWxlY3QgU05EX1NPQ19BRFMxMTdYCiAJc2VsZWN0IFNORF9TT0NfQUs0MTA0IGlmIFNQSV9NQVNURVIKQEAgLTM5LDYgKzQwLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODUwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX01BWDk4NzcgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUENNMzAwOAorCXNlbGVjdCBTTkRfU09DX1JUNTYzMSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TR1RMNTAwMCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19TTjk1MDMxIGlmIElOVEVMX1NDVV9JUEMKIAlzZWxlY3QgU05EX1NPQ19TUERJRgpAQCAtNDcsNyArNDksNyBAQAogCXNlbGVjdCBTTkRfU09DX1NUQUM5NzY2IGlmIFNORF9TT0NfQUM5N19CVVMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyMyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMyNiBpZiBTUElfTUFTVEVSCi0Jc2VsZWN0IFNORF9TT0NfVFZMMzIwQUlDMzJYNCBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzMlg0IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzNYIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RQQTYxMzBBMiBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBEQUMzMyBpZiBJMkMKQEAgLTU4LDYgKzYwLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19XTDEyNzMgaWYgTUZEX1dMMTI3M19DT1JFCiAJc2VsZWN0IFNORF9TT0NfV00xMjUwX0VWMSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTIwMDAgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfV001MTAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODM1MCBpZiBNRkRfV004MzUwCiAJc2VsZWN0IFNORF9TT0NfV004NDAwIGlmIE1GRF9XTTg0MDAKIAlzZWxlY3QgU05EX1NPQ19XTTg1MTAgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQpAQCAtMTM5LDYgKzE0Miw5IEBACiAJc2VsZWN0IFNJR01BCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQURBVTEzNzMKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19BREFWODBYCiAJdHJpc3RhdGUKIApAQCAtMjE0LDYgKzIyMCw5IEBACiBjb25maWcgU05EX1NPQ19QQ00zMDA4CiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUlQ1NjMxCisJdHJpc3RhdGUKKwogI0ZyZWVzY2FsZSBzZ3RsNTAwMCBjb2RlYwogY29uZmlnIFNORF9TT0NfU0dUTDUwMDAKIAl0cmlzdGF0ZQpAQCAtMjQwLDcgKzI0OSw3IEBACiAJdHJpc3RhdGUgIlRJIFRMVjMyMEFJQzI2IENvZGVjIHN1cHBvcnQiIGlmIFNORF9TT0NfT0ZfU0lNUExFCiAJZGVwZW5kcyBvbiBTUEkKIAotY29uZmlnIFNORF9TT0NfVFZMMzIwQUlDMzJYNAorY29uZmlnIFNORF9TT0NfVExWMzIwQUlDMzJYNAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1RMVjMyMEFJQzNYCkBAIC0yNjksNiArMjc4LDkgQEAKIGNvbmZpZyBTTkRfU09DX1dNMTI1MF9FVjEKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19XTTUxMDAKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19XTTgzNTAKIAl0cmlzdGF0ZQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQppbmRleCA1MTE5YTdlLi5hMmM3ODQyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKQEAgLTUsNiArNSw3IEBACiBzbmQtc29jLWFkMTk4MC1vYmpzIDo9IGFkMTk4MC5vCiBzbmQtc29jLWFkNzMzMTEtb2JqcyA6PSBhZDczMzExLm8KIHNuZC1zb2MtYWRhdTE3MDEtb2JqcyA6PSBhZGF1MTcwMS5vCitzbmQtc29jLWFkYXUxMzczLW9ianMgOj0gYWRhdTEzNzMubwogc25kLXNvYy1hZGF2ODB4LW9ianMgOj0gYWRhdjgweC5vCiBzbmQtc29jLWFkczExN3gtb2JqcyA6PSBhZHMxMTd4Lm8KIHNuZC1zb2MtYWs0MTA0LW9ianMgOj0gYWs0MTA0Lm8KQEAgLTI1LDYgKzI2LDcgQEAKIHNuZC1zb2MtbWF4OTgwOTUtb2JqcyA6PSBtYXg5ODA5NS5vCiBzbmQtc29jLW1heDk4NTAtb2JqcyA6PSBtYXg5ODUwLm8KIHNuZC1zb2MtcGNtMzAwOC1vYmpzIDo9IHBjbTMwMDgubworc25kLXNvYy1ydDU2MzEtb2JqcyA6PSBydDU2MzEubwogc25kLXNvYy1zZ3RsNTAwMC1vYmpzIDo9IHNndGw1MDAwLm8KIHNuZC1zb2MtYWxjNTYyMy1vYmpzIDo9IGFsYzU2MjMubwogc25kLXNvYy1zbjk1MDMxLW9ianMgOj0gc245NTAzMS5vCkBAIC00Myw2ICs0NSw3IEBACiBzbmQtc29jLXVkYTEzODAtb2JqcyA6PSB1ZGExMzgwLm8KIHNuZC1zb2Mtd2wxMjczLW9ianMgOj0gd2wxMjczLm8KIHNuZC1zb2Mtd20xMjUwLWV2MS1vYmpzIDo9IHdtMTI1MC1ldjEubworc25kLXNvYy13bTUxMDAtb2JqcyA6PSB3bTUxMDAubyB3bTUxMDAtdGFibGVzLm8KIHNuZC1zb2Mtd204MzUwLW9ianMgOj0gd204MzUwLm8KIHNuZC1zb2Mtd204NDAwLW9ianMgOj0gd204NDAwLm8KIHNuZC1zb2Mtd204NTEwLW9ianMgOj0gd204NTEwLm8KQEAgLTEwMCw2ICsxMDMsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfQUQxOTNYKQkrPSBzbmQtc29jLWFkMTkzeC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRDE5ODApCSs9IHNuZC1zb2MtYWQxOTgwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0FENzMzMTEpICs9IHNuZC1zb2MtYWQ3MzMxMS5vCitvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTM3MykJKz0gc25kLXNvYy1hZGF1MTM3My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BREFVMTcwMSkgICs9IHNuZC1zb2MtYWRhdTE3MDEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQURBVjgwWCkgICs9IHNuZC1zb2MtYWRhdjgweC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19BRFMxMTdYKQkrPSBzbmQtc29jLWFkczExN3gubwpAQCAtMTIzLDYgKzEyNyw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODA5NSkJKz0gc25kLXNvYy1tYXg5ODA5NS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODUwKQkrPSBzbmQtc29jLW1heDk4NTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUENNMzAwOCkJKz0gc25kLXNvYy1wY20zMDA4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1JUNTYzMSkJKz0gc25kLXNvYy1ydDU2MzEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU0dUTDUwMDApICArPSBzbmQtc29jLXNndGw1MDAwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NOOTUwMzEpCSs9c25kLXNvYy1zbjk1MDMxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1NQRElGKQkrPSBzbmQtc29jLXNwZGlmLm8KQEAgLTEzMiw3ICsxMzcsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjMpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMjYpCSs9IHNuZC1zb2MtdGx2MzIwYWljMjYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1gpCSs9IHNuZC1zb2MtdGx2MzIwYWljM3gubwotb2JqLSQoQ09ORklHX1NORF9TT0NfVFZMMzIwQUlDMzJYNCkgICAgICs9IHNuZC1zb2MtdGx2MzIwYWljMzJ4NC5vCitvYmotJChDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMlg0KSAgICAgKz0gc25kLXNvYy10bHYzMjBhaWMzMng0Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RMVjMyMERBQzMzKQkrPSBzbmQtc29jLXRsdjMyMGRhYzMzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDQwMzApCSs9IHNuZC1zb2MtdHdsNDAzMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19UV0w2MDQwKQkrPSBzbmQtc29jLXR3bDYwNDAubwpAQCAtMTQwLDYgKzE0NSw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19VREExMzgwKQkrPSBzbmQtc29jLXVkYTEzODAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV0wxMjczKQkrPSBzbmQtc29jLXdsMTI3My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTEyNTBfRVYxKSArPSBzbmQtc29jLXdtMTI1MC1ldjEubworb2JqLSQoQ09ORklHX1NORF9TT0NfV001MTAwKQkrPSBzbmQtc29jLXdtNTEwMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTgzNTApCSs9IHNuZC1zb2Mtd204MzUwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODQwMCkJKz0gc25kLXNvYy13bTg0MDAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NTEwKQkrPSBzbmQtc29jLXdtODUxMC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCmluZGV4IDNjMDg3OTMuLmU3MTUxODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwppbmRleCBlZWRiNmY1Li4xMjA2MDIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWQxOTN4X3ByaXYgewotCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlpbnQgc3lzY2xrOwogfTsKIApAQCAtMTAzLDEyICsxMDMsMTQgQEAKIHN0YXRpYyBpbnQgYWQxOTN4X211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0JaW50IHJlZzsKIAotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUQxOTNYX0RBQ19DVFJMMik7Ci0JcmVnID0gKG11dGUgPiAwKSA/IHJlZyB8IEFEMTkzWF9EQUNfTUFTVEVSX01VVEUgOiByZWcgJgotCQkofkFEMTkzWF9EQUNfTUFTVEVSX01VVEUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsIHJlZyk7CisJaWYgKG11dGUpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsCisJCQkJICAgIEFEMTkzWF9EQUNfTUFTVEVSX01VVEUsCisJCQkJICAgIEFEMTkzWF9EQUNfTUFTVEVSX01VVEUpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUQxOTNYX0RBQ19DVFJMMiwKKwkJCQkgICAgQUQxOTNYX0RBQ19NQVNURVJfTVVURSwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2Miw3ICsyNjQsNyBAQAogCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0JaW50IHdvcmRfbGVuID0gMCwgcmVnID0gMCwgbWFzdGVyX3JhdGUgPSAwOworCWludCB3b3JkX2xlbiA9IDAsIG1hc3Rlcl9yYXRlID0gMDsKIAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwpAQCAtMjk3LDE4ICsyOTksMTUgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCk7Ci0JcmVnID0gKHJlZyAmIEFEMTkzWF9QTExfSU5QVVRfTUFTSykgfCBtYXN0ZXJfcmF0ZTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCwgcmVnKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE5M1hfUExMX0NMS19DVFJMMCwKKwkJCSAgICBBRDE5M1hfUExMX0lOUFVUX01BU0ssIG1hc3Rlcl9yYXRlKTsKIAotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUQxOTNYX0RBQ19DVFJMMik7Ci0JcmVnID0gKHJlZyAmICh+QUQxOTNYX0RBQ19XT1JEX0xFTl9NQVNLKSkKLQkJfCAod29yZF9sZW4gPDwgQUQxOTNYX0RBQ19XT1JEX0xFTl9TSEZUKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBRDE5M1hfREFDX0NUUkwyLCByZWcpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEMTkzWF9EQUNfQ1RSTDIsCisJCQkgICAgQUQxOTNYX0RBQ19XT1JEX0xFTl9NQVNLLAorCQkJICAgIHdvcmRfbGVuIDw8IEFEMTkzWF9EQUNfV09SRF9MRU5fU0hGVCk7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFEMTkzWF9BRENfQ1RSTDEpOwotCXJlZyA9IChyZWcgJiAofkFEMTkzWF9BRENfV09SRF9MRU5fTUFTSykpIHwgd29yZF9sZW47Ci0Jc25kX3NvY193cml0ZShjb2RlYywgQUQxOTNYX0FEQ19DVFJMMSwgcmVnKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBRDE5M1hfQURDX0NUUkwxLAorCQkJICAgIEFEMTkzWF9BRENfV09SRF9MRU5fTUFTSywgd29yZF9sZW4pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDksMTAgKzM0OCw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQlpZiAoYWQxOTN4LT5jb250cm9sX3R5cGUgPT0gU05EX1NPQ19JMkMpCi0JCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBhZDE5M3gtPmNvbnRyb2xfdHlwZSk7Ci0JZWxzZQotCQlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDgsIGFkMTkzeC0+Y29udHJvbF90eXBlKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gYWQxOTN4LT5yZWdtYXA7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDAsIDAsIFNORF9TT0NfUkVHTUFQKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0zODgsNiArMzg1LDE0IEBACiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9zcGlfcmVnbWFwX2NvbmZpZyA9IHsKKwkudmFsX2JpdHMgPSA4LAorCS5yZWdfYml0cyA9IDE2LAorCS5yZWFkX2ZsYWdfbWFzayA9IDB4MDksCisJLndyaXRlX2ZsYWdfbWFzayA9IDB4MDgsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE5M3hfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3g7CkBAIC0zOTcsMjAgKzQwMiwzNiBAQAogCWlmIChhZDE5M3ggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlhZDE5M3gtPnJlZ21hcCA9IHJlZ21hcF9pbml0X3NwaShzcGksICZhZDE5M3hfc3BpX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoYWQxOTN4LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoYWQxOTN4LT5yZWdtYXApOworCQlnb3RvIGVycl9mcmVlOworCX0KKwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGFkMTkzeCk7Ci0JYWQxOTN4LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWQxOTN4LCAmYWQxOTN4X2RhaSwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWtmcmVlKGFkMTkzeCk7CisJCWdvdG8gZXJyX3JlZ21hcF9leGl0OworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdtYXBfZXhpdDoKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CitlcnJfZnJlZToKKwlrZnJlZShhZDE5M3gpOworCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgYWQxOTN4X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKKwlzdHJ1Y3QgYWQxOTN4X3ByaXYgKmFkMTkzeCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZzcGktPmRldik7Ci0Ja2ZyZWUoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCXJlZ21hcF9leGl0KGFkMTkzeC0+cmVnbWFwKTsKKwlrZnJlZShhZDE5M3gpOwogCXJldHVybiAwOwogfQogCkBAIC00MjUsNiArNDQ2LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9pMmNfcmVnbWFwX2NvbmZpZyA9IHsKKwkudmFsX2JpdHMgPSA4LAorCS5yZWdfYml0cyA9IDgsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQxOTN4X2lkW10gPSB7CiAJeyAiYWQxOTM2IiwgMCB9LAogCXsgImFkMTkzNyIsIDAgfSwKQEAgLTQ0MiwyMCArNDY5LDM1IEBACiAJaWYgKGFkMTkzeCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWFkMTkzeC0+cmVnbWFwID0gcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmFkMTkzeF9pMmNfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihhZDE5M3gtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihhZDE5M3gtPnJlZ21hcCk7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWQxOTN4KTsKLQlhZDE5M3gtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LAogCQkJJnNvY19jb2RlY19kZXZfYWQxOTN4LCAmYWQxOTN4X2RhaSwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWtmcmVlKGFkMTkzeCk7CisJCWdvdG8gZXJyX3JlZ21hcF9leGl0OworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdtYXBfZXhpdDoKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CitlcnJfZnJlZToKKwlrZnJlZShhZDE5M3gpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFkMTkzeF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGFkMTkzeF9wcml2ICphZDE5M3ggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZWdtYXBfZXhpdChhZDE5M3gtPnJlZ21hcCk7CisJa2ZyZWUoYWQxOTN4KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmgKaW5kZXggY2NjYzJlOC4uMTUwN2VhYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5oCkBAIC05LDIwICs5LDIwIEBACiAjaWZuZGVmIF9fQUQxOTNYX0hfXwogI2RlZmluZSBfX0FEMTkzWF9IX18KIAotI2RlZmluZSBBRDE5M1hfUExMX0NMS19DVFJMMCAgICAweDgwMAorI2RlZmluZSBBRDE5M1hfUExMX0NMS19DVFJMMCAgICAweDAwCiAjZGVmaW5lIEFEMTkzWF9QTExfUE9XRVJET1dOICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFEMTkzWF9QTExfSU5QVVRfTUFTSyAgICh+MHg2KQorI2RlZmluZSBBRDE5M1hfUExMX0lOUFVUX01BU0sgICAweDYKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF8yNTYgICAgKDAgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF8zODQgICAgKDEgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF81MTIgICAgKDIgPDwgMSkKICNkZWZpbmUgQUQxOTNYX1BMTF9JTlBVVF83NjggICAgKDMgPDwgMSkKLSNkZWZpbmUgQUQxOTNYX1BMTF9DTEtfQ1RSTDEgICAgMHg4MDEKLSNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMCAgICAgICAgMHg4MDIKKyNkZWZpbmUgQUQxOTNYX1BMTF9DTEtfQ1RSTDEgICAgMHgwMQorI2RlZmluZSBBRDE5M1hfREFDX0NUUkwwICAgICAgICAweDAyCiAjZGVmaW5lIEFEMTkzWF9EQUNfUE9XRVJET1dOICAgICAgICAgICAweDAxCiAjZGVmaW5lIEFEMTkzWF9EQUNfU0VSRk1UX01BU0sJCTB4QzAKICNkZWZpbmUgQUQxOTNYX0RBQ19TRVJGTVRfU1RFUkVPCSgwIDw8IDYpCiAjZGVmaW5lIEFEMTkzWF9EQUNfU0VSRk1UX1RETQkJKDEgPDwgNikKLSNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMSAgICAgICAgMHg4MDMKKyNkZWZpbmUgQUQxOTNYX0RBQ19DVFJMMSAgICAgICAgMHgwMwogI2RlZmluZSBBRDE5M1hfREFDXzJfQ0hBTk5FTFMgICAwCiAjZGVmaW5lIEFEMTkzWF9EQUNfNF9DSEFOTkVMUyAgIDEKICNkZWZpbmUgQUQxOTNYX0RBQ184X0NIQU5ORUxTICAgMgpAQCAtMzMsMTEgKzMzLDExIEBACiAjZGVmaW5lIEFEMTkzWF9EQUNfQkNMS19NQVNURVIgICgxIDw8IDUpCiAjZGVmaW5lIEFEMTkzWF9EQUNfTEVGVF9ISUdIICAgICgxIDw8IDMpCiAjZGVmaW5lIEFEMTkzWF9EQUNfQkNMS19JTlYgICAgICgxIDw8IDcpCi0jZGVmaW5lIEFEMTkzWF9EQUNfQ1RSTDIgICAgICAgIDB4ODA0CisjZGVmaW5lIEFEMTkzWF9EQUNfQ1RSTDIgICAgICAgIDB4MDQKICNkZWZpbmUgQUQxOTNYX0RBQ19XT1JEX0xFTl9TSEZUICAgICAgICAzCiAjZGVmaW5lIEFEMTkzWF9EQUNfV09SRF9MRU5fTUFTSyAgICAgICAgMHgxOAogI2RlZmluZSBBRDE5M1hfREFDX01BU1RFUl9NVVRFICAxCi0jZGVmaW5lIEFEMTkzWF9EQUNfQ0hOTF9NVVRFICAgIDB4ODA1CisjZGVmaW5lIEFEMTkzWF9EQUNfQ0hOTF9NVVRFICAgIDB4MDUKICNkZWZpbmUgQUQxOTNYX0RBQ0wxX01VVEUgICAgICAgMAogI2RlZmluZSBBRDE5M1hfREFDUjFfTVVURSAgICAgICAxCiAjZGVmaW5lIEFEMTkzWF9EQUNMMl9NVVRFICAgICAgIDIKQEAgLTQ2LDI4ICs0NiwyOCBAQAogI2RlZmluZSBBRDE5M1hfREFDUjNfTVVURSAgICAgICA1CiAjZGVmaW5lIEFEMTkzWF9EQUNMNF9NVVRFICAgICAgIDYKICNkZWZpbmUgQUQxOTNYX0RBQ1I0X01VVEUgICAgICAgNwotI2RlZmluZSBBRDE5M1hfREFDX0wxX1ZPTCAgICAgICAweDgwNgotI2RlZmluZSBBRDE5M1hfREFDX1IxX1ZPTCAgICAgICAweDgwNwotI2RlZmluZSBBRDE5M1hfREFDX0wyX1ZPTCAgICAgICAweDgwOAotI2RlZmluZSBBRDE5M1hfREFDX1IyX1ZPTCAgICAgICAweDgwOQotI2RlZmluZSBBRDE5M1hfREFDX0wzX1ZPTCAgICAgICAweDgwYQotI2RlZmluZSBBRDE5M1hfREFDX1IzX1ZPTCAgICAgICAweDgwYgotI2RlZmluZSBBRDE5M1hfREFDX0w0X1ZPTCAgICAgICAweDgwYwotI2RlZmluZSBBRDE5M1hfREFDX1I0X1ZPTCAgICAgICAweDgwZAotI2RlZmluZSBBRDE5M1hfQURDX0NUUkwwICAgICAgICAweDgwZQorI2RlZmluZSBBRDE5M1hfREFDX0wxX1ZPTCAgICAgICAweDA2CisjZGVmaW5lIEFEMTkzWF9EQUNfUjFfVk9MICAgICAgIDB4MDcKKyNkZWZpbmUgQUQxOTNYX0RBQ19MMl9WT0wgICAgICAgMHgwOAorI2RlZmluZSBBRDE5M1hfREFDX1IyX1ZPTCAgICAgICAweDA5CisjZGVmaW5lIEFEMTkzWF9EQUNfTDNfVk9MICAgICAgIDB4MGEKKyNkZWZpbmUgQUQxOTNYX0RBQ19SM19WT0wgICAgICAgMHgwYgorI2RlZmluZSBBRDE5M1hfREFDX0w0X1ZPTCAgICAgICAweDBjCisjZGVmaW5lIEFEMTkzWF9EQUNfUjRfVk9MICAgICAgIDB4MGQKKyNkZWZpbmUgQUQxOTNYX0FEQ19DVFJMMCAgICAgICAgMHgwZQogI2RlZmluZSBBRDE5M1hfQURDX1BPV0VSRE9XTiAgICAgICAgICAgMHgwMQogI2RlZmluZSBBRDE5M1hfQURDX0hJR0hQQVNTX0ZJTFRFUgkxCiAjZGVmaW5lIEFEMTkzWF9BRENMMV9NVVRFIAkJMgogI2RlZmluZSBBRDE5M1hfQURDUjFfTVVURSAJCTMKICNkZWZpbmUgQUQxOTNYX0FEQ0wyX01VVEUgCQk0CiAjZGVmaW5lIEFEMTkzWF9BRENSMl9NVVRFIAkJNQotI2RlZmluZSBBRDE5M1hfQURDX0NUUkwxICAgICAgICAweDgwZgorI2RlZmluZSBBRDE5M1hfQURDX0NUUkwxICAgICAgICAweDBmCiAjZGVmaW5lIEFEMTkzWF9BRENfU0VSRk1UX01BU0sJCTB4NjAKICNkZWZpbmUgQUQxOTNYX0FEQ19TRVJGTVRfU1RFUkVPCSgwIDw8IDUpCiAjZGVmaW5lIEFEMTkzWF9BRENfU0VSRk1UX1RETQkJKDEgPDwgNSkKICNkZWZpbmUgQUQxOTNYX0FEQ19TRVJGTVRfQVVYCQkoMiA8PCA1KQogI2RlZmluZSBBRDE5M1hfQURDX1dPUkRfTEVOX01BU0sJMHgzCi0jZGVmaW5lIEFEMTkzWF9BRENfQ1RSTDIgICAgICAgIDB4ODEwCisjZGVmaW5lIEFEMTkzWF9BRENfQ1RSTDIgICAgICAgIDB4MTAKICNkZWZpbmUgQUQxOTNYX0FEQ18yX0NIQU5ORUxTICAgMAogI2RlZmluZSBBRDE5M1hfQURDXzRfQ0hBTk5FTFMgICAxCiAjZGVmaW5lIEFEMTkzWF9BRENfOF9DSEFOTkVMUyAgIDIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCmluZGV4IDkyM2IzNjQuLmUzOTMxY2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYwpAQCAtMTQ4LDcgKzE0OCw2IEBACiAJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAogCQkuZm9ybWF0cyA9IFNORF9TT0NfU1REX0FDOTdfRk1UUywgfSwKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChhZDE5ODBfZGFpKTsKIAogc3RhdGljIGludCBhZDE5ODBfcmVzZXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdHJ5X3dhcm0pCiB7CkBAIC0yMDAsMTggKzE5OSwyMiBAQAogCX0KIAogCS8qIFJlYWQgb3V0IHZlbmRvciBJRCB0byBtYWtlIHN1cmUgaXQgaXMgYWQxOTgwICovCi0JaWYgKGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSAhPSAweDQxNDQpCisJaWYgKGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQxKSAhPSAweDQxNDQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byByZXNldF9lcnI7CisJfQogCiAJdmVuZG9yX2lkMiA9IGFjOTdfcmVhZChjb2RlYywgQUM5N19WRU5ET1JfSUQyKTsKIAogCWlmICh2ZW5kb3JfaWQyICE9IDB4NTM3MCkgewotCQlpZiAodmVuZG9yX2lkMiAhPSAweDUzNzQpCisJCWlmICh2ZW5kb3JfaWQyICE9IDB4NTM3NCkgeworCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWdvdG8gcmVzZXRfZXJyOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE5ODA6ICIKIAkJCQkiRm91bmQgQUQxOTgxIC0gb25seSAyLzIgSU4vT1VUIENoYW5uZWxzICIKIAkJCQkic3VwcG9ydGVkXG4iKTsKKwkJfQogCX0KIAogCS8qIHVubXV0ZSBjYXB0dXJlcyBhbmQgcGxheWJhY2tzIHZvbHVtZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2Y4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKQEAgLTAsMCArMSwxNDE0IEBACisvKgorICogQW5hbG9nIERldmljZXMgQURBVTEzNzMgQXVkaW8gQ29kZWMgZHJpdmUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBBdXRob3I6IExhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2NkLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2FkYXUxMzczLmg+CisKKyNpbmNsdWRlICJhZGF1MTM3My5oIgorCitzdHJ1Y3QgYWRhdTEzNzNfZGFpIHsKKwl1bnNpZ25lZCBpbnQgY2xrX3NyYzsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworCWJvb2wgZW5hYmxlX3NyYzsKKwlib29sIG1hc3RlcjsKK307CisKK3N0cnVjdCBhZGF1MTM3MyB7CisJc3RydWN0IGFkYXUxMzczX2RhaSBkYWlzWzNdOworfTsKKworI2RlZmluZSBBREFVMTM3M19JTlBVVF9NT0RFCTB4MDAKKyNkZWZpbmUgQURBVTEzNzNfQUlOTF9DVFJMKHgpCSgweDAxICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfQUlOUl9DVFJMKHgpCSgweDAyICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfTExJTkVfT1VUKHgpCSgweDkgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19STElORV9PVVQoeCkJKDB4YSArICh4KSAqIDIpCisjZGVmaW5lIEFEQVUxMzczX0xTUEtfT1VUCTB4MGQKKyNkZWZpbmUgQURBVTEzNzNfUlNQS19PVVQJMHgwZQorI2RlZmluZSBBREFVMTM3M19MSFBfT1VUCTB4MGYKKyNkZWZpbmUgQURBVTEzNzNfUkhQX09VVAkweDEwCisjZGVmaW5lIEFEQVUxMzczX0FEQ19HQUlOCTB4MTEKKyNkZWZpbmUgQURBVTEzNzNfTEFEQ19NSVhFUgkweDEyCisjZGVmaW5lIEFEQVUxMzczX1JBRENfTUlYRVIJMHgxMworI2RlZmluZSBBREFVMTM3M19MTElORTFfTUlYCTB4MTQKKyNkZWZpbmUgQURBVTEzNzNfUkxJTkUxX01JWAkweDE1CisjZGVmaW5lIEFEQVUxMzczX0xMSU5FMl9NSVgJMHgxNgorI2RlZmluZSBBREFVMTM3M19STElORTJfTUlYCTB4MTcKKyNkZWZpbmUgQURBVTEzNzNfTFNQS19NSVgJMHgxOAorI2RlZmluZSBBREFVMTM3M19SU1BLX01JWAkweDE5CisjZGVmaW5lIEFEQVUxMzczX0xIUF9NSVgJMHgxYQorI2RlZmluZSBBREFVMTM3M19SSFBfTUlYCTB4MWIKKyNkZWZpbmUgQURBVTEzNzNfRVBfTUlYCQkweDFjCisjZGVmaW5lIEFEQVUxMzczX0hQX0NUUkwJMHgxZAorI2RlZmluZSBBREFVMTM3M19IUF9DVFJMMgkweDFlCisjZGVmaW5lIEFEQVUxMzczX0xTX0NUUkwJMHgxZgorI2RlZmluZSBBREFVMTM3M19FUF9DVFJMCTB4MjEKKyNkZWZpbmUgQURBVTEzNzNfTUlDQklBU19DVFJMMQkweDIyCisjZGVmaW5lIEFEQVUxMzczX01JQ0JJQVNfQ1RSTDIJMHgyMworI2RlZmluZSBBREFVMTM3M19PVVRQVVRfQ1RSTAkweDI0CisjZGVmaW5lIEFEQVUxMzczX1BXRE5fQ1RSTDEJMHgyNQorI2RlZmluZSBBREFVMTM3M19QV0ROX0NUUkwyCTB4MjYKKyNkZWZpbmUgQURBVTEzNzNfUFdETl9DVFJMMwkweDI3CisjZGVmaW5lIEFEQVUxMzczX0RQTExfQ1RSTCh4KQkoMHgyOCArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMSh4KQkoMHgyOSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMih4KQkoMHgyYSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMMyh4KQkoMHgyYiArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNCh4KQkoMHgyYyArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNSh4KQkoMHgyZCArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNih4KQkoMHgyZSArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNyh4KQkoMHgyZiArICh4KSAqIDcpCisjZGVmaW5lIEFEQVUxMzczX0hFQURERUNUCTB4MzYKKyNkZWZpbmUgQURBVTEzNzNfQURDX0RBQ19TVEFUVVMJMHgzNworI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTAkweDNjCisjZGVmaW5lIEFEQVUxMzczX0RBSSh4KQkJKDB4NDQgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0NMS19TUkNfRElWKHgpCSgweDQwICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVih4KQkoMHg0NyArICh4KSkKKyNkZWZpbmUgQURBVTEzNzNfU1JDX1JBVElPQSh4KQkoMHg0YSArICh4KSAqIDIpCisjZGVmaW5lIEFEQVUxMzczX1NSQ19SQVRJT0IoeCkJKDB4NGIgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19ERUVNUF9DVFJMCTB4NTAKKyNkZWZpbmUgQURBVTEzNzNfU1JDX0RBSV9DVFJMKHgpICgweDUxICsgKHgpKQorI2RlZmluZSBBREFVMTM3M19ESU5fTUlYX0NUUkwoeCkgKDB4NTYgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0RPVVRfTUlYX0NUUkwoeCkgKDB4NWIgKyAoeCkpCisjZGVmaW5lIEFEQVUxMzczX0RBSV9QQkxfVk9MKHgpCSgweDYyICsgKHgpICogMikKKyNkZWZpbmUgQURBVTEzNzNfREFJX1BCUl9WT0woeCkJKDB4NjMgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUlfUkVDTF9WT0woeCkgKDB4NjggKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUlfUkVDUl9WT0woeCkgKDB4NjkgKyAoeCkgKiAyKQorI2RlZmluZSBBREFVMTM3M19EQUMxX1BCTF9WT0wJMHg2ZQorI2RlZmluZSBBREFVMTM3M19EQUMxX1BCUl9WT0wJMHg2ZgorI2RlZmluZSBBREFVMTM3M19EQUMyX1BCTF9WT0wJMHg3MAorI2RlZmluZSBBREFVMTM3M19EQUMyX1BCUl9WT0wJMHg3MQorI2RlZmluZSBBREFVMTM3M19BRENfUkVDTF9WT0wJMHg3MgorI2RlZmluZSBBREFVMTM3M19BRENfUkVDUl9WT0wJMHg3MworI2RlZmluZSBBREFVMTM3M19ETUlDX1JFQ0xfVk9MCTB4NzQKKyNkZWZpbmUgQURBVTEzNzNfRE1JQ19SRUNSX1ZPTAkweDc1CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMQkweDc2CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMgkweDc3CisjZGVmaW5lIEFEQVUxMzczX1ZPTF9HQUlOMwkweDc4CisjZGVmaW5lIEFEQVUxMzczX0hQRl9DVFJMCTB4N2QKKyNkZWZpbmUgQURBVTEzNzNfQkFTUzEJCTB4N2UKKyNkZWZpbmUgQURBVTEzNzNfQkFTUzIJCTB4N2YKKyNkZWZpbmUgQURBVTEzNzNfRFJDKHgpCQkoMHg4MCArICh4KSAqIDB4MTApCisjZGVmaW5lIEFEQVUxMzczXzNEX0NUUkwxCTB4YzAKKyNkZWZpbmUgQURBVTEzNzNfM0RfQ1RSTDIJMHhjMQorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDEJMHhkYworI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDIJMHhkZAorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDMJMHhkZQorI2RlZmluZSBBREFVMTM3M19GRFNQX1NFTDQJMHhkZgorI2RlZmluZSBBREFVMTM3M19ESUdNSUNDVFJMCTB4ZTIKKyNkZWZpbmUgQURBVTEzNzNfRElHRU4JCTB4ZWIKKyNkZWZpbmUgQURBVTEzNzNfU09GVF9SRVNFVAkweGZmCisKKworI2RlZmluZSBBREFVMTM3M19QTExfQ1RSTDZfRFBMTF9CWVBBU1MJQklUKDEpCisjZGVmaW5lIEFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU4JQklUKDApCisKKyNkZWZpbmUgQURBVTEzNzNfREFJX0lOVkVSVF9CQ0xLCUJJVCg3KQorI2RlZmluZSBBREFVMTM3M19EQUlfTUFTVEVSCQlCSVQoNikKKyNkZWZpbmUgQURBVTEzNzNfREFJX0lOVkVSVF9MUkNMSwlCSVQoNCkKKyNkZWZpbmUgQURBVTEzNzNfREFJX1dMRU5fMTYJCTB4MAorI2RlZmluZSBBREFVMTM3M19EQUlfV0xFTl8yMAkJMHg0CisjZGVmaW5lIEFEQVUxMzczX0RBSV9XTEVOXzI0CQkweDgKKyNkZWZpbmUgQURBVTEzNzNfREFJX1dMRU5fMzIJCTB4YworI2RlZmluZSBBREFVMTM3M19EQUlfV0xFTl9NQVNLCQkweGMKKyNkZWZpbmUgQURBVTEzNzNfREFJX0ZPUk1BVF9SSUdIVF9KCTB4MAorI2RlZmluZSBBREFVMTM3M19EQUlfRk9STUFUX0xFRlRfSgkweDEKKyNkZWZpbmUgQURBVTEzNzNfREFJX0ZPUk1BVF9JMlMJCTB4MgorI2RlZmluZSBBREFVMTM3M19EQUlfRk9STUFUX0RTUAkJMHgzCisKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UJCUJJVCg1KQorI2RlZmluZSBBREFVMTM3M19CQ0xLRElWXzMyCQkweDAzCisjZGVmaW5lIEFEQVUxMzczX0JDTEtESVZfNjQJCTB4MDIKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl8xMjgJCTB4MDEKKyNkZWZpbmUgQURBVTEzNzNfQkNMS0RJVl8yNTYJCTB4MDAKKworI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTF9QRUFLX0RFVEVDVAlCSVQoMCkKKyNkZWZpbmUgQURBVTEzNzNfQURDX0NUUkxfUkVTRVQJCUJJVCgxKQorI2RlZmluZSBBREFVMTM3M19BRENfQ1RSTF9SRVNFVF9GT1JDRQlCSVQoMikKKworI2RlZmluZSBBREFVMTM3M19PVVRQVVRfQ1RSTF9MRElGRglCSVQoMykKKyNkZWZpbmUgQURBVTEzNzNfT1VUUFVUX0NUUkxfTE5GQkVOCUJJVCgyKQorCisjZGVmaW5lIEFEQVUxMzczX1BXRE5fQ1RSTDNfUFdSX0VOIEJJVCgwKQorCisjZGVmaW5lIEFEQVUxMzczX0VQX0NUUkxfTUlDQklBUzFfT0ZGU0VUIDQKKyNkZWZpbmUgQURBVTEzNzNfRVBfQ1RSTF9NSUNCSUFTMl9PRkZTRVQgMgorCitzdGF0aWMgY29uc3QgdWludDhfdCBhZGF1MTM3M19kZWZhdWx0X3JlZ3NbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAvKiAweDMwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDBhLCAweDBhLCAweDAwLCAvKiAweDQwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweDgwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweDkwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDc4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAvKiAweGEwICovCisJMHgwMCwgMHhjMCwgMHg4OCwgMHg3YSwgMHhkZiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAvKiAweGIwICovCisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAvKiAweGUwICovCisJMHgwMCwgMHgxZiwgMHgwZiwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfb3V0X3RsdltdID0geworCVRMVl9EQl9SQU5HRV9IRUFEKDQpLAorCTAsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKC03OTAwLCA0MDAsIDEpLAorCTgsIDE1LCBUTFZfREJfU0NBTEVfSVRFTSgtNDcwMCwgMzAwLCAwKSwKKwkxNiwgMjMsIFRMVl9EQl9TQ0FMRV9JVEVNKC0yMzAwLCAyMDAsIDApLAorCTI0LCAzMSwgVExWX0RCX1NDQUxFX0lURU0oLTcwMCwgMTAwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9NSU5NQVgoYWRhdTEzNzNfZGlnaXRhbF90bHYsIC05NTYzLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19pbl9wZ2FfdGx2LCAtMTMwMCwgMTAwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19lcF90bHYsIC02MDAsIDYwMCwgMSk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGF1MTM3M19pbnB1dF9ib29zdF90bHYsIDAsIDIwMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkYXUxMzczX2dhaW5fYm9vc3RfdGx2LCAwLCA2MDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkYXUxMzczX3NwZWFrZXJfYm9vc3RfdGx2LCAxMjAwLCA2MDAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfZmRzcF9zZWxfdGV4dFtdID0geworCSJOb25lIiwKKwkiQ2hhbm5lbCAxIiwKKwkiQ2hhbm5lbCAyIiwKKwkiQ2hhbm5lbCAzIiwKKwkiQ2hhbm5lbCA0IiwKKwkiQ2hhbm5lbCA1IiwKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSwKKwlBREFVMTM3M19GRFNQX1NFTDEsIDQsIGFkYXUxMzczX2Zkc3Bfc2VsX3RleHQpOworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtLAorCUFEQVUxMzczX0ZEU1BfU0VMMSwgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0sCisJQURBVTEzNzNfRkRTUF9TRUwyLCAwLCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtLAorCUFEQVUxMzczX0ZEU1BfU0VMMywgMCwgYWRhdTEzNzNfZmRzcF9zZWxfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfYmFzc19jaGFubmVsX2VudW0sCisJQURBVTEzNzNfRkRTUF9TRUw0LCA0LCBhZGF1MTM3M19mZHNwX3NlbF90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkYXUxMzczX2hwZl9jdXRvZmZfdGV4dFtdID0geworCSIzLjdIeiIsICI1MEh6IiwgIjEwMEh6IiwgIjE1MEh6IiwgIjIwMEh6IiwgIjI1MEh6IiwgIjMwMEh6IiwgIjM1MEh6IiwKKwkiNDAwSHoiLCAiNDUwSHoiLCAiNTAwSHoiLCAiNTUwSHoiLCAiNjAwSHoiLCAiNjUwSHoiLCAiNzAwSHoiLCAiNzUwSHoiLAorCSI4MDBIeiIsCit9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfaHBmX2N1dG9mZl9lbnVtLAorCUFEQVUxMzczX0hQRl9DVFJMLCAzLCBhZGF1MTM3M19ocGZfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfYmFzc19scGZfY3V0b2ZmX3RleHRbXSA9IHsKKwkiODAxSHoiLCAiMTAwMUh6IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfdGV4dFtdID0geworCSIwLjEyNSIsICIwLjI1MCIsICIwLjM3MCIsICIwLjUwMCIsICIwLjYyNSIsICIwLjc1MCIsICIwLjg3NSIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkYXUxMzczX2Jhc3NfY2xpcF9sZXZlbF92YWx1ZXNbXSA9IHsKKwkxLCAyLCAzLCA0LCA1LCA2LCA3LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFkYXUxMzczX2Jhc3NfaHBmX2N1dG9mZl90ZXh0W10gPSB7CisJIjE1OEh6IiwgIjIzMkh6IiwgIjM0N0h6IiwgIjUyMEh6IiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYWRhdTEzNzNfYmFzc190bHZbXSA9IHsKKwlUTFZfREJfUkFOR0VfSEVBRCg0KSwKKwkwLCAyLCBUTFZfREJfU0NBTEVfSVRFTSgtNjAwLCA2MDAsIDEpLAorCTMsIDQsIFRMVl9EQl9TQ0FMRV9JVEVNKDk1MCwgMjUwLCAwKSwKKwk1LCA3LCBUTFZfREJfU0NBTEVfSVRFTSgxNDAwLCAxNTAsIDApLAorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtLAorCUFEQVUxMzczX0JBU1MxLCA1LCBhZGF1MTM3M19iYXNzX2xwZl9jdXRvZmZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBTT0NfVkFMVUVfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSwKKwlBREFVMTM3M19CQVNTMSwgMiwgNywgYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3RleHQsCisJYWRhdTEzNzNfYmFzc19jbGlwX2xldmVsX3ZhbHVlcyk7CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSwKKwlBREFVMTM3M19CQVNTMSwgMCwgYWRhdTEzNzNfYmFzc19ocGZfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfM2RfbGV2ZWxfdGV4dFtdID0geworCSIwJSIsICI2LjY3JSIsICIxMy4zMyUiLCAiMjAlIiwgIjI2LjY3JSIsICIzMy4zMyUiLAorCSI0MCUiLCAiNDYuNjclIiwgIjUzLjMzJSIsICI2MCUiLCAiNjYuNjclIiwgIjczLjMzJSIsCisJIjgwJSIsICI4Ni42NyIsICI5OS4zMyUiLCAiMTAwJSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M18zZF9jdXRvZmZfdGV4dFtdID0geworCSJObyAzRCIsICIwLjAzMTI1IGZzIiwgIjAuMDQ1ODMgZnMiLCAiMC4wNzUgZnMiLCAiMC4xMTQ1OCBmcyIsCisJIjAuMTY4NzUgZnMiLCAiMC4yNzA4MyBmcyIKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9sZXZlbF9lbnVtLAorCUFEQVUxMzczXzNEX0NUUkwxLCA0LCBhZGF1MTM3M18zZF9sZXZlbF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M18zZF9jdXRvZmZfZW51bSwKKwlBREFVMTM3M18zRF9DVFJMMSwgMCwgYWRhdTEzNzNfM2RfY3V0b2ZmX3RleHQpOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkYXUxMzczXzNkX3RsdltdID0geworCVRMVl9EQl9SQU5HRV9IRUFEKDIpLAorCTAsIDAsIFRMVl9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAorCTEsIDcsIFRMVl9EQl9MSU5FQVJfSVRFTSgtMTgwMCwgLTEyMCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYWRhdTEzNzNfbHJfbXV4X3RleHRbXSA9IHsKKwkiTXV0ZSIsCisJIlJpZ2h0IENoYW5uZWwgKEwrUikiLAorCSJMZWZ0IENoYW5uZWwgKEwrUikiLAorCSJTdGVyZW8iLAorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGFkYXUxMzczX2xpbmVvdXQxX2xyX211eF9lbnVtLAorCUFEQVUxMzczX09VVFBVVF9DVFJMLCA0LCBhZGF1MTM3M19scl9tdXhfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0sCisJQURBVTEzNzNfT1VUUFVUX0NUUkwsIDYsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChhZGF1MTM3M19zcGVha2VyX2xyX211eF9lbnVtLAorCUFEQVUxMzczX0xTX0NUUkwsIDQsIGFkYXUxMzczX2xyX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9SX1RMVigiQUlGMSBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgwKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDApLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMiBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgxKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDEpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMyBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9SRUNMX1ZPTCgyKSwKKwkJQURBVTEzNzNfREFJX1JFQ1JfVk9MKDIpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJBREMgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfUkVDTF9WT0wsCisJCUFEQVUxMzczX0FEQ19SRUNSX1ZPTCwgMCwgMHhmZiwgMSwgYWRhdTEzNzNfZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRNSUMgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19ETUlDX1JFQ0xfVk9MLAorCQlBREFVMTM3M19ETUlDX1JFQ1JfVk9MLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJBSUYxIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0RBSV9QQkxfVk9MKDApLAorCQlBREFVMTM3M19EQUlfUEJSX1ZPTCgwKSwgMCwgMHhmZiwgMSwgYWRhdTEzNzNfZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkFJRjIgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfREFJX1BCTF9WT0woMSksCisJCUFEQVUxMzczX0RBSV9QQlJfVk9MKDEpLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMyBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19EQUlfUEJMX1ZPTCgyKSwKKwkJQURBVTEzNzNfREFJX1BCUl9WT0woMiksIDAsIDB4ZmYsIDEsIGFkYXUxMzczX2RpZ2l0YWxfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzEgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfREFDMV9QQkxfVk9MLAorCQlBREFVMTM3M19EQUMxX1BCUl9WT0wsIDAsIDB4ZmYsIDEsIGFkYXUxMzczX2RpZ2l0YWxfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMyIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0RBQzJfUEJMX1ZPTCwKKwkJQURBVTEzNzNfREFDMl9QQlJfVk9MLCAwLCAweGZmLCAxLCBhZGF1MTM3M19kaWdpdGFsX3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJMaW5lb3V0MSBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MTElORV9PVVQoMCksCisJCUFEQVUxMzczX1JMSU5FX09VVCgwKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfb3V0X3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MU1BLX09VVCwKKwkJQURBVTEzNzNfUlNQS19PVVQsIDAsIDB4MWYsIDAsIGFkYXUxMzczX291dF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19MSFBfT1VULAorCQlBREFVMTM3M19SSFBfT1VULCAwLCAweDFmLCAwLCBhZGF1MTM3M19vdXRfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIklucHV0IDEgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BSU5MX0NUUkwoMCksCisJCUFEQVUxMzczX0FJTlJfQ1RSTCgwKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfaW5fcGdhX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiSW5wdXQgMiBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0FJTkxfQ1RSTCgxKSwKKwkJQURBVTEzNzNfQUlOUl9DVFJMKDEpLCAwLCAweDFmLCAwLCBhZGF1MTM3M19pbl9wZ2FfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJJbnB1dCAzIENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfQUlOTF9DVFJMKDIpLAorCQlBREFVMTM3M19BSU5SX0NUUkwoMiksIDAsIDB4MWYsIDAsIGFkYXUxMzczX2luX3BnYV90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIklucHV0IDQgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BSU5MX0NUUkwoMyksCisJCUFEQVUxMzczX0FJTlJfQ1RSTCgzKSwgMCwgMHgxZiwgMCwgYWRhdTEzNzNfaW5fcGdhX3RsdiksCisKKwlTT0NfU0lOR0xFX1RMVigiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwgQURBVTEzNzNfRVBfQ1RSTCwgMCwgMywgMCwKKwkJYWRhdTEzNzNfZXBfdGx2KSwKKworCVNPQ19ET1VCTEVfVExWKCJBSUYzIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgNCwgNSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgMiwgMywKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYxIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMSwgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJBSUYzIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfVk9MX0dBSU4yLCA0LCA1LAorCQkxLCAwLCBhZGF1MTM3M19nYWluX2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkFJRjIgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19WT0xfR0FJTjIsIDIsIDMsCisJCTEsIDAsIGFkYXUxMzczX2dhaW5fYm9vc3RfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiQUlGMSBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMiwgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJETUlDIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfVk9MX0dBSU4zLCA2LCA3LAorCQkxLCAwLCBhZGF1MTM3M19nYWluX2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkFEQyBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgNCwgNSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJEQUMyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgMiwgMywKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJEQUMxIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX1ZPTF9HQUlOMywgMCwgMSwKKwkJMSwgMCwgYWRhdTEzNzNfZ2Fpbl9ib29zdF90bHYpLAorCisJU09DX0RPVUJMRV9UTFYoIklucHV0IDEgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfR0FJTiwgMCwgNCwKKwkJMSwgMCwgYWRhdTEzNzNfaW5wdXRfYm9vc3RfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiSW5wdXQgMiBCb29zdCBDYXB0dXJlIFZvbHVtZSIsIEFEQVUxMzczX0FEQ19HQUlOLCAxLCA1LAorCQkxLCAwLCBhZGF1MTM3M19pbnB1dF9ib29zdF90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJJbnB1dCAzIEJvb3N0IENhcHR1cmUgVm9sdW1lIiwgQURBVTEzNzNfQURDX0dBSU4sIDIsIDYsCisJCTEsIDAsIGFkYXUxMzczX2lucHV0X2Jvb3N0X3RsdiksCisJU09DX0RPVUJMRV9UTFYoIklucHV0IDQgQm9vc3QgQ2FwdHVyZSBWb2x1bWUiLCBBREFVMTM3M19BRENfR0FJTiwgMywgNywKKwkJMSwgMCwgYWRhdTEzNzNfaW5wdXRfYm9vc3RfdGx2KSwKKworCVNPQ19ET1VCTEVfVExWKCJTcGVha2VyIEJvb3N0IFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0xTX0NUUkwsIDIsIDMsCisJCTEsIDAsIGFkYXUxMzczX3NwZWFrZXJfYm9vc3RfdGx2KSwKKworCVNPQ19FTlVNKCJMaW5lb3V0MSBMUiBNdXgiLCBhZGF1MTM3M19saW5lb3V0MV9scl9tdXhfZW51bSksCisJU09DX0VOVU0oIlNwZWFrZXIgTFIgTXV4IiwgYWRhdTEzNzNfc3BlYWtlcl9scl9tdXhfZW51bSksCisKKwlTT0NfRU5VTSgiSFBGIEN1dG9mZiIsIGFkYXUxMzczX2hwZl9jdXRvZmZfZW51bSksCisJU09DX0RPVUJMRSgiSFBGIFN3aXRjaCIsIEFEQVUxMzczX0hQRl9DVFJMLCAxLCAwLCAxLCAwKSwKKwlTT0NfRU5VTSgiSFBGIENoYW5uZWwiLCBhZGF1MTM3M19ocGZfY2hhbm5lbF9lbnVtKSwKKworCVNPQ19FTlVNKCJCYXNzIEhQRiBDdXRvZmYiLCBhZGF1MTM3M19iYXNzX2hwZl9jdXRvZmZfZW51bSksCisJU09DX1ZBTFVFX0VOVU0oIkJhc3MgQ2xpcCBMZXZlbCBUaHJlc2hvbGQiLAorCSAgICBhZGF1MTM3M19iYXNzX2NsaXBfbGV2ZWxfZW51bSksCisJU09DX0VOVU0oIkJhc3MgTFBGIEN1dG9mZiIsIGFkYXUxMzczX2Jhc3NfbHBmX2N1dG9mZl9lbnVtKSwKKwlTT0NfRE9VQkxFKCJCYXNzIFBsYXliYWNrIFN3aXRjaCIsIEFEQVUxMzczX0JBU1MyLCAwLCAxLCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiQmFzcyBQbGF5YmFjayBWb2x1bWUiLCBBREFVMTM3M19CQVNTMiwgMiwgNywgMCwKKwkgICAgYWRhdTEzNzNfYmFzc190bHYpLAorCVNPQ19FTlVNKCJCYXNzIENoYW5uZWwiLCBhZGF1MTM3M19iYXNzX2NoYW5uZWxfZW51bSksCisKKwlTT0NfRU5VTSgiM0QgRnJlcSIsIGFkYXUxMzczXzNkX2N1dG9mZl9lbnVtKSwKKwlTT0NfRU5VTSgiM0QgTGV2ZWwiLCBhZGF1MTM3M18zZF9sZXZlbF9lbnVtKSwKKwlTT0NfU0lOR0xFKCIzRCBQbGF5YmFjayBTd2l0Y2giLCBBREFVMTM3M18zRF9DVFJMMiwgMCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIjNEIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczXzNEX0NUUkwyLCAyLCA3LCAwLAorCQlhZGF1MTM3M18zZF90bHYpLAorCVNPQ19FTlVNKCIzRCBDaGFubmVsIiwgYWRhdTEzNzNfYmFzc19jaGFubmVsX2VudW0pLAorCisJU09DX1NJTkdMRSgiWmVybyBDcm9zcyBTd2l0Y2giLCBBREFVMTM3M19QV0ROX0NUUkwzLCA3LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGF1MTM3M19saW5lb3V0Ml9jb250cm9sc1tdID0geworCVNPQ19ET1VCTEVfUl9UTFYoIkxpbmVvdXQyIFBsYXliYWNrIFZvbHVtZSIsIEFEQVUxMzczX0xMSU5FX09VVCgxKSwKKwkJQURBVTEzNzNfUkxJTkVfT1VUKDEpLCAwLCAweDFmLCAwLCBhZGF1MTM3M19vdXRfdGx2KSwKKwlTT0NfRU5VTSgiTGluZW91dDIgTFIgTXV4IiwgYWRhdTEzNzNfbGluZW91dDJfbHJfbXV4X2VudW0pLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX2RyY19jb250cm9sc1tdID0geworCVNPQ19FTlVNKCJEUkMxIENoYW5uZWwiLCBhZGF1MTM3M19kcmMxX2NoYW5uZWxfZW51bSksCisJU09DX0VOVU0oIkRSQzIgQ2hhbm5lbCIsIGFkYXUxMzczX2RyYzJfY2hhbm5lbF9lbnVtKSwKKwlTT0NfRU5VTSgiRFJDMyBDaGFubmVsIiwgYWRhdTEzNzNfZHJjM19jaGFubmVsX2VudW0pLAorfTsKKworc3RhdGljIGludCBhZGF1MTM3M19wbGxfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgcGxsX2lkID0gdy0+bmFtZVszXSAtICcxJzsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpCisJCXZhbCA9IEFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU47CisJZWxzZQorCQl2YWwgPSAwOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfUExMX0NUUkw2KHBsbF9pZCksCisJCUFEQVUxMzczX1BMTF9DVFJMNl9QTExfRU4sIHZhbCk7CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJbWRlbGF5KDUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGF1MTM3M19kZWNpbWF0b3JfdGV4dFtdID0geworCSJBREMiLAorCSJETUlDMSIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkYXUxMzczX2RlY2ltYXRvcl9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRhdTEzNzNfZGVjaW1hdG9yX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfZGVjaW1hdG9yX211eCA9CisJU09DX0RBUE1fRU5VTV9WSVJUKCJEZWNpbWF0b3IgTXV4IiwgYWRhdTEzNzNfZGVjaW1hdG9yX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfbGVmdF9hZGNfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQzEgU3dpdGNoIiwgQURBVTEzNzNfTEFEQ19NSVhFUiwgNCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCA0IFN3aXRjaCIsIEFEQVUxMzczX0xBRENfTUlYRVIsIDMsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMyBTd2l0Y2giLCBBREFVMTM3M19MQURDX01JWEVSLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgU3dpdGNoIiwgQURBVTEzNzNfTEFEQ19NSVhFUiwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAxIFN3aXRjaCIsIEFEQVUxMzczX0xBRENfTUlYRVIsIDAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkYXUxMzczX3JpZ2h0X2FkY19taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDMSBTd2l0Y2giLCBBREFVMTM3M19SQURDX01JWEVSLCA0LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDQgU3dpdGNoIiwgQURBVTEzNzNfUkFEQ19NSVhFUiwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIFN3aXRjaCIsIEFEQVUxMzczX1JBRENfTUlYRVIsIDIsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMiBTd2l0Y2giLCBBREFVMTM3M19SQURDX01JWEVSLCAxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDEgU3dpdGNoIiwgQURBVTEzNzNfUkFEQ19NSVhFUiwgMCwgMSwgMCksCit9OworCisjZGVmaW5lIERFQ0xBUkVfQURBVTEzNzNfT1VUUFVUX01JWEVSX0NUUkxTKF9uYW1lLCBfcmVnKSBcCitjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBfbmFtZVtdID0geyBcCisJU09DX0RBUE1fU0lOR0xFKCJMZWZ0IERBQzIgU3dpdGNoIiwgX3JlZywgNywgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IERBQzIgU3dpdGNoIiwgX3JlZywgNiwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkxlZnQgREFDMSBTd2l0Y2giLCBfcmVnLCA1LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiUmlnaHQgREFDMSBTd2l0Y2giLCBfcmVnLCA0LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgX3JlZywgMywgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAyIEJ5cGFzcyBTd2l0Y2giLCBfcmVnLCAxLCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgX3JlZywgMCwgMSwgMCksIFwKK30KKworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2xlZnRfbGluZTFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfTExJTkUxX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfcmlnaHRfbGluZTFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfUkxJTkUxX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfbGVmdF9saW5lMl9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19MTElORTJfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19yaWdodF9saW5lMl9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19STElORTJfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19sZWZ0X3Nwa19taXhlcl9jb250cm9scywKKwlBREFVMTM3M19MU1BLX01JWCk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19PVVRQVVRfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfcmlnaHRfc3BrX21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX1JTUEtfTUlYKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX09VVFBVVF9NSVhFUl9DVFJMUyhhZGF1MTM3M19lcF9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19FUF9NSVgpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfbGVmdF9ocF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGVmdCBEQUMxIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTGVmdCBEQUMyIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfTEhQX01JWCwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCBBREFVMTM3M19MSFBfTUlYLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsIEFEQVUxMzczX0xIUF9NSVgsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfTEhQX01JWCwgMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRhdTEzNzNfcmlnaHRfaHBfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IERBQzEgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJSaWdodCBEQUMyIFN3aXRjaCIsIEFEQVUxMzczX1JIUF9NSVgsIDQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCBBREFVMTM3M19SSFBfTUlYLCAyLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsIEFEQVUxMzczX1JIUF9NSVgsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgQURBVTEzNzNfUkhQX01JWCwgMCwgMSwgMCksCit9OworCisjZGVmaW5lIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoX25hbWUsIF9yZWcpIFwKK2NvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IF9uYW1lW10gPSB7IFwKKwlTT0NfREFQTV9TSU5HTEUoIkRNSUMyIFN3YXBwZWQgU3dpdGNoIiwgX3JlZywgNiwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRNSUMyIFN3aXRjaCIsIF9yZWcsIDUsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBREMvRE1JQzEgU3dhcHBlZCBTd2l0Y2giLCBfcmVnLCA0LCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiQURDL0RNSUMxIFN3aXRjaCIsIF9yZWcsIDMsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYyIFN3aXRjaCIsIF9yZWcsIDEsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJBSUYxIFN3aXRjaCIsIF9yZWcsIDAsIDEsIDApLCBcCit9CisKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX0RTUF9DSEFOTkVMX01JWEVSX0NUUkxTKGFkYXUxMzczX2RzcF9jaGFubmVsMV9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19ESU5fTUlYX0NUUkwoMCkpOworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfZHNwX2NoYW5uZWwyX21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX0RJTl9NSVhfQ1RSTCgxKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfQ0hBTk5FTF9NSVhFUl9DVFJMUyhhZGF1MTM3M19kc3BfY2hhbm5lbDNfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRElOX01JWF9DVFJMKDIpKTsKK3N0YXRpYyBERUNMQVJFX0FEQVUxMzczX0RTUF9DSEFOTkVMX01JWEVSX0NUUkxTKGFkYXUxMzczX2RzcF9jaGFubmVsNF9taXhlcl9jb250cm9scywKKwlBREFVMTM3M19ESU5fTUlYX0NUUkwoMykpOworc3RhdGljIERFQ0xBUkVfQURBVTEzNzNfRFNQX0NIQU5ORUxfTUlYRVJfQ1RSTFMoYWRhdTEzNzNfZHNwX2NoYW5uZWw1X21peGVyX2NvbnRyb2xzLAorCUFEQVUxMzczX0RJTl9NSVhfQ1RSTCg0KSk7CisKKyNkZWZpbmUgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKF9uYW1lLCBfcmVnKSBcCitjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBfbmFtZVtdID0geyBcCisJU09DX0RBUE1fU0lOR0xFKCJEU1AgQ2hhbm5lbDUgU3dpdGNoIiwgX3JlZywgNCwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRTUCBDaGFubmVsNCBTd2l0Y2giLCBfcmVnLCAzLCAxLCAwKSwgXAorCVNPQ19EQVBNX1NJTkdMRSgiRFNQIENoYW5uZWwzIFN3aXRjaCIsIF9yZWcsIDIsIDEsIDApLCBcCisJU09DX0RBUE1fU0lOR0xFKCJEU1AgQ2hhbm5lbDIgU3dpdGNoIiwgX3JlZywgMSwgMSwgMCksIFwKKwlTT0NfREFQTV9TSU5HTEUoIkRTUCBDaGFubmVsMSBTd2l0Y2giLCBfcmVnLCAwLCAxLCAwKSwgXAorfQorCitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgwKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjJfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgxKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2FpZjNfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgyKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2RhYzFfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCgzKSk7CitzdGF0aWMgREVDTEFSRV9BREFVMTM3M19EU1BfT1VUUFVUX01JWEVSX0NUUkxTKGFkYXUxMzczX2RhYzJfbWl4ZXJfY29udHJvbHMsCisJQURBVTEzNzNfRE9VVF9NSVhfQ1RSTCg0KSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhZGF1MTM3M19kYXBtX3dpZGdldHNbXSA9IHsKKwkvKiBEYXRhc2hlZXQgY2xhaW1zIExlZnQgQURDIGlzIGJpdCA2IGFuZCBSaWdodCBBREMgaXMgYml0IDcsIGJ1dCB0aGF0CisJICogZG9lc24ndCBzZWVtIHRvIGJlIHRoZSBjYXNlLiAqLworCVNORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMSwgNywgMCksCisJU05EX1NPQ19EQVBNX0FEQygiUmlnaHQgQURDIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMSwgNiwgMCksCisKKwlTTkRfU09DX0RBUE1fQURDKCJETUlDMSIsIE5VTEwsIEFEQVUxMzczX0RJR01JQ0NUUkwsIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkRNSUMyIiwgTlVMTCwgQURBVTEzNzNfRElHTUlDQ1RSTCwgMiwgMCksCisKKwlTTkRfU09DX0RBUE1fVklSVF9NVVgoIkRlY2ltYXRvciBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZhZGF1MTM3M19kZWNpbWF0b3JfbXV4KSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMyIiwgQURBVTEzNzNfUFdETl9DVFJMMSwgNSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzEiLCBBREFVMTM3M19QV0ROX0NUUkwxLCA0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9QR0EoIklONFBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDMsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOM1BHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDIsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOMlBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOMVBHQSIsIEFEQVUxMzczX1BXRE5fQ1RSTDEsIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMyIiwgTlVMTCwgQURBVTEzNzNfUFdETl9DVFJMMiwgNywgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDMiIsIE5VTEwsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDYsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDMSIsIE5VTEwsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDUsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIlJpZ2h0IERBQzEiLCBOVUxMLCBBREFVMTM3M19QV0ROX0NUUkwyLCA0LCAwKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiTGVmdCBBREMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFkYXUxMzczX2xlZnRfYWRjX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIlJpZ2h0IEFEQyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfYWRjX21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiTGVmdCBMaW5lb3V0MiBNaXhlciIsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDMsIDAsCisJCWFkYXUxMzczX2xlZnRfbGluZTJfbWl4ZXJfY29udHJvbHMpLAorCVNPQ19NSVhFUl9BUlJBWSgiUmlnaHQgTGluZW91dDIgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwyLCAyLCAwLAorCQlhZGF1MTM3M19yaWdodF9saW5lMl9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJMZWZ0IExpbmVvdXQxIE1peGVyIiwgQURBVTEzNzNfUFdETl9DVFJMMiwgMSwgMCwKKwkJYWRhdTEzNzNfbGVmdF9saW5lMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJSaWdodCBMaW5lb3V0MSBNaXhlciIsIEFEQVUxMzczX1BXRE5fQ1RSTDIsIDAsIDAsCisJCWFkYXUxMzczX3JpZ2h0X2xpbmUxX21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiRWFycGllY2UgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwzLCA0LCAwLAorCQlhZGF1MTM3M19lcF9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJMZWZ0IFNwZWFrZXIgTWl4ZXIiLCBBREFVMTM3M19QV0ROX0NUUkwzLCAzLCAwLAorCQlhZGF1MTM3M19sZWZ0X3Nwa19taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJSaWdodCBTcGVha2VyIE1peGVyIiwgQURBVTEzNzNfUFdETl9DVFJMMywgMiwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfc3BrX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkxlZnQgSGVhZHBob25lIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19sZWZ0X2hwX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfcmlnaHRfaHBfbWl4ZXJfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkhlYWRwaG9uZSBFbmFibGUiLCBBREFVMTM3M19QV0ROX0NUUkwzLCAxLCAwLAorCQlOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjEgQ0xLIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDApLCAwLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYyIENMSyIsIEFEQVUxMzczX1NSQ19EQUlfQ1RSTCgxKSwgMCwgMCwKKwkgICAgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQUlGMyBDTEsiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMiksIDAsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjEgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDApLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYxIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMCksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjIgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDEpLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYyIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMSksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjMgSU4gU1JDIiwgQURBVTEzNzNfU1JDX0RBSV9DVFJMKDIpLCAyLCAwLAorCSAgICBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYzIE9VVCBTUkMiLCBBREFVMTM3M19TUkNfREFJX0NUUkwoMiksIDEsIDAsCisJICAgIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMSBJTiIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMSBPVVQiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYyIElOIiwgIkFJRjIgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyIE9VVCIsICJBSUYyIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjMgSU4iLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjMgT1VUIiwgIkFJRjMgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwxX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwyX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsMyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWwzX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsNCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWw0X21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkRTUCBDaGFubmVsNSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZHNwX2NoYW5uZWw1X21peGVyX2NvbnRyb2xzKSwKKworCVNPQ19NSVhFUl9BUlJBWSgiQUlGMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfYWlmMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJBSUYyIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19haWYyX21peGVyX2NvbnRyb2xzKSwKKwlTT0NfTUlYRVJfQVJSQVkoIkFJRjMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFkYXUxMzczX2FpZjNfbWl4ZXJfY29udHJvbHMpLAorCVNPQ19NSVhFUl9BUlJBWSgiREFDMSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWRhdTEzNzNfZGFjMV9taXhlcl9jb250cm9scyksCisJU09DX01JWEVSX0FSUkFZKCJEQUMyIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhZGF1MTM3M19kYWMyX21peGVyX2NvbnRyb2xzKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRTUCIsIEFEQVUxMzczX0RJR0VOLCA0LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSZWNvcmRpbmcgRW5naW5lIEIiLCBBREFVMTM3M19ESUdFTiwgMywgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUmVjb3JkaW5nIEVuZ2luZSBBIiwgQURBVTEzNzNfRElHRU4sIDIsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXliYWNrIEVuZ2luZSBCIiwgQURBVTEzNzNfRElHRU4sIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXliYWNrIEVuZ2luZSBBIiwgQURBVTEzNzNfRElHRU4sIDAsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYWRhdTEzNzNfcGxsX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYWRhdTEzNzNfcGxsX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1lTQ0xLMSIsIEFEQVUxMzczX0NMS19TUkNfRElWKDApLCA3LCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTWVNDTEsyIiwgQURBVTEzNzNfQ0xLX1NSQ19ESVYoMSksIDcsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMVIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjJMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yUiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOM0wiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjNSIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU40TCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlONFIiKSwKKworCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQzFEQVQiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMyREFUIiksCisKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMUwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMVIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMkwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMlIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUFIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkVQIiksCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX2NoZWNrX2FpZl9jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb3VyY2UtPmNvZGVjOworCXN0cnVjdCBhZGF1MTM3MyAqYWRhdTEzNzMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgZGFpOworCWNvbnN0IGNoYXIgKmNsazsKKworCWRhaSA9IHNpbmstPm5hbWVbM10gLSAnMSc7CisKKwlpZiAoIWFkYXUxMzczLT5kYWlzW2RhaV0ubWFzdGVyKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGF1MTM3My0+ZGFpc1tkYWldLmNsa19zcmMgPT0gQURBVTEzNzNfQ0xLX1NSQ19QTEwxKQorCQljbGsgPSAiU1lTQ0xLMSI7CisJZWxzZQorCQljbGsgPSAiU1lTQ0xLMiI7CisKKwlyZXR1cm4gc3RyY21wKHNvdXJjZS0+bmFtZSwgY2xrKSA9PSAwOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX2NoZWNrX3NyYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvdXJjZS0+Y29kZWM7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBkYWk7CisKKwlkYWkgPSBzaW5rLT5uYW1lWzNdIC0gJzEnOworCisJcmV0dXJuIGFkYXUxMzczLT5kYWlzW2RhaV0uZW5hYmxlX3NyYzsKK30KKworI2RlZmluZSBEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoX3NpbmspIFwKKwl7IF9zaW5rLCAiRE1JQzIgU3dhcHBlZCBTd2l0Y2giLCAiRE1JQzIiIH0sIFwKKwl7IF9zaW5rLCAiRE1JQzIgU3dpdGNoIiwgIkRNSUMyIiB9LCBcCisJeyBfc2luaywgIkFEQy9ETUlDMSBTd2FwcGVkIFN3aXRjaCIsICJEZWNpbWF0b3IgTXV4IiB9LCBcCisJeyBfc2luaywgIkFEQy9ETUlDMSBTd2l0Y2giLCAiRGVjaW1hdG9yIE11eCIgfSwgXAorCXsgX3NpbmssICJBSUYxIFN3aXRjaCIsICJBSUYxIElOIiB9LCBcCisJeyBfc2luaywgIkFJRjIgU3dpdGNoIiwgIkFJRjIgSU4iIH0sIFwKKwl7IF9zaW5rLCAiQUlGMyBTd2l0Y2giLCAiQUlGMyBJTiIgfQorCisjZGVmaW5lIERTUF9PVVRQVVRfTUlYRVJfUk9VVEVTKF9zaW5rKSBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMSBTd2l0Y2giLCAiRFNQIENoYW5uZWwxIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMiBTd2l0Y2giLCAiRFNQIENoYW5uZWwyIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsMyBTd2l0Y2giLCAiRFNQIENoYW5uZWwzIE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsNCBTd2l0Y2giLCAiRFNQIENoYW5uZWw0IE1peGVyIiB9LCBcCisJeyBfc2luaywgIkRTUCBDaGFubmVsNSBTd2l0Y2giLCAiRFNQIENoYW5uZWw1IE1peGVyIiB9CisKKyNkZWZpbmUgTEVGVF9PVVRQVVRfTUlYRVJfUk9VVEVTKF9zaW5rKSBcCisJeyBfc2luaywgIlJpZ2h0IERBQzIgU3dpdGNoIiwgIlJpZ2h0IERBQzIiIH0sIFwKKwl7IF9zaW5rLCAiTGVmdCBEQUMyIFN3aXRjaCIsICJMZWZ0IERBQzIiIH0sIFwKKwl7IF9zaW5rLCAiUmlnaHQgREFDMSBTd2l0Y2giLCAiUmlnaHQgREFDMSIgfSwgXAorCXsgX3NpbmssICJMZWZ0IERBQzEgU3dpdGNoIiwgIkxlZnQgREFDMSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCAxIEJ5cGFzcyBTd2l0Y2giLCAiSU4xUEdBIiB9LCBcCisJeyBfc2luaywgIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsICJJTjJQR0EiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgMyBCeXBhc3MgU3dpdGNoIiwgIklOM1BHQSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCA0IEJ5cGFzcyBTd2l0Y2giLCAiSU40UEdBIiB9CisKKyNkZWZpbmUgUklHSFRfT1VUUFVUX01JWEVSX1JPVVRFUyhfc2luaykgXAorCXsgX3NpbmssICJSaWdodCBEQUMyIFN3aXRjaCIsICJSaWdodCBEQUMyIiB9LCBcCisJeyBfc2luaywgIkxlZnQgREFDMiBTd2l0Y2giLCAiTGVmdCBEQUMyIiB9LCBcCisJeyBfc2luaywgIlJpZ2h0IERBQzEgU3dpdGNoIiwgIlJpZ2h0IERBQzEiIH0sIFwKKwl7IF9zaW5rLCAiTGVmdCBEQUMxIFN3aXRjaCIsICJMZWZ0IERBQzEiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgMSBCeXBhc3MgU3dpdGNoIiwgIklOMVBHQSIgfSwgXAorCXsgX3NpbmssICJJbnB1dCAyIEJ5cGFzcyBTd2l0Y2giLCAiSU4yUEdBIiB9LCBcCisJeyBfc2luaywgIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsICJJTjNQR0EiIH0sIFwKKwl7IF9zaW5rLCAiSW5wdXQgNCBCeXBhc3MgU3dpdGNoIiwgIklONFBHQSIgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhZGF1MTM3M19kYXBtX3JvdXRlc1tdID0geworCXsgIkxlZnQgQURDIE1peGVyIiwgIkRBQzEgU3dpdGNoIiwgIkxlZnQgREFDMSIgfSwKKwl7ICJMZWZ0IEFEQyBNaXhlciIsICJJbnB1dCAxIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiTGVmdCBBREMgTWl4ZXIiLCAiSW5wdXQgMiBTd2l0Y2giLCAiSU4yUEdBIiB9LAorCXsgIkxlZnQgQURDIE1peGVyIiwgIklucHV0IDMgU3dpdGNoIiwgIklOM1BHQSIgfSwKKwl7ICJMZWZ0IEFEQyBNaXhlciIsICJJbnB1dCA0IFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiREFDMSBTd2l0Y2giLCAiUmlnaHQgREFDMSIgfSwKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiSW5wdXQgMSBTd2l0Y2giLCAiSU4xUEdBIiB9LAorCXsgIlJpZ2h0IEFEQyBNaXhlciIsICJJbnB1dCAyIFN3aXRjaCIsICJJTjJQR0EiIH0sCisJeyAiUmlnaHQgQURDIE1peGVyIiwgIklucHV0IDMgU3dpdGNoIiwgIklOM1BHQSIgfSwKKwl7ICJSaWdodCBBREMgTWl4ZXIiLCAiSW5wdXQgNCBTd2l0Y2giLCAiSU40UEdBIiB9LAorCisJeyAiTGVmdCBBREMiLCBOVUxMLCAiTGVmdCBBREMgTWl4ZXIiIH0sCisJeyAiUmlnaHQgQURDIiwgTlVMTCwgIlJpZ2h0IEFEQyBNaXhlciIgfSwKKworCXsgIkRlY2ltYXRvciBNdXgiLCAiQURDIiwgIkxlZnQgQURDIiB9LAorCXsgIkRlY2ltYXRvciBNdXgiLCAiQURDIiwgIlJpZ2h0IEFEQyIgfSwKKwl7ICJEZWNpbWF0b3IgTXV4IiwgIkRNSUMxIiwgIkRNSUMxIiB9LAorCisJRFNQX0NIQU5ORUxfTUlYRVJfUk9VVEVTKCJEU1AgQ2hhbm5lbDEgTWl4ZXIiKSwKKwlEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoIkRTUCBDaGFubmVsMiBNaXhlciIpLAorCURTUF9DSEFOTkVMX01JWEVSX1JPVVRFUygiRFNQIENoYW5uZWwzIE1peGVyIiksCisJRFNQX0NIQU5ORUxfTUlYRVJfUk9VVEVTKCJEU1AgQ2hhbm5lbDQgTWl4ZXIiKSwKKwlEU1BfQ0hBTk5FTF9NSVhFUl9ST1VURVMoIkRTUCBDaGFubmVsNSBNaXhlciIpLAorCisJRFNQX09VVFBVVF9NSVhFUl9ST1VURVMoIkFJRjEgTWl4ZXIiKSwKKwlEU1BfT1VUUFVUX01JWEVSX1JPVVRFUygiQUlGMiBNaXhlciIpLAorCURTUF9PVVRQVVRfTUlYRVJfUk9VVEVTKCJBSUYzIE1peGVyIiksCisJRFNQX09VVFBVVF9NSVhFUl9ST1VURVMoIkRBQzEgTWl4ZXIiKSwKKwlEU1BfT1VUUFVUX01JWEVSX1JPVVRFUygiREFDMiBNaXhlciIpLAorCisJeyAiQUlGMSBPVVQiLCBOVUxMLCAiQUlGMSBNaXhlciIgfSwKKwl7ICJBSUYyIE9VVCIsIE5VTEwsICJBSUYyIE1peGVyIiB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgTWl4ZXIiIH0sCisJeyAiTGVmdCBEQUMxIiwgTlVMTCwgIkRBQzEgTWl4ZXIiIH0sCisJeyAiUmlnaHQgREFDMSIsIE5VTEwsICJEQUMxIE1peGVyIiB9LAorCXsgIkxlZnQgREFDMiIsIE5VTEwsICJEQUMyIE1peGVyIiB9LAorCXsgIlJpZ2h0IERBQzIiLCBOVUxMLCAiREFDMiBNaXhlciIgfSwKKworCUxFRlRfT1VUUFVUX01JWEVSX1JPVVRFUygiTGVmdCBMaW5lb3V0MSBNaXhlciIpLAorCVJJR0hUX09VVFBVVF9NSVhFUl9ST1VURVMoIlJpZ2h0IExpbmVvdXQxIE1peGVyIiksCisJTEVGVF9PVVRQVVRfTUlYRVJfUk9VVEVTKCJMZWZ0IExpbmVvdXQyIE1peGVyIiksCisJUklHSFRfT1VUUFVUX01JWEVSX1JPVVRFUygiUmlnaHQgTGluZW91dDIgTWl4ZXIiKSwKKwlMRUZUX09VVFBVVF9NSVhFUl9ST1VURVMoIkxlZnQgU3BlYWtlciBNaXhlciIpLAorCVJJR0hUX09VVFBVVF9NSVhFUl9ST1VURVMoIlJpZ2h0IFNwZWFrZXIgTWl4ZXIiKSwKKworCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIkxlZnQgREFDMiBTd2l0Y2giLCAiTGVmdCBEQUMyIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIkxlZnQgREFDMSBTd2l0Y2giLCAiTGVmdCBEQUMxIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiTGVmdCBIZWFkcGhvbmUgTWl4ZXIiLCAiSW5wdXQgMiBCeXBhc3MgU3dpdGNoIiwgIklOMlBHQSIgfSwKKwl7ICJMZWZ0IEhlYWRwaG9uZSBNaXhlciIsICJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCAiSU4zUEdBIiB9LAorCXsgIkxlZnQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIlJpZ2h0IERBQzIgU3dpdGNoIiwgIlJpZ2h0IERBQzIiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIlJpZ2h0IERBQzEgU3dpdGNoIiwgIlJpZ2h0IERBQzEiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDIgQnlwYXNzIFN3aXRjaCIsICJJTjJQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDMgQnlwYXNzIFN3aXRjaCIsICJJTjNQR0EiIH0sCisJeyAiUmlnaHQgSGVhZHBob25lIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJMZWZ0IEhlYWRwaG9uZSBNaXhlciIsIE5VTEwsICJIZWFkcGhvbmUgRW5hYmxlIiB9LAorCXsgIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIsIE5VTEwsICJIZWFkcGhvbmUgRW5hYmxlIiB9LAorCisJeyAiRWFycGllY2UgTWl4ZXIiLCAiUmlnaHQgREFDMiBTd2l0Y2giLCAiUmlnaHQgREFDMiIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJMZWZ0IERBQzIgU3dpdGNoIiwgIkxlZnQgREFDMiIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJSaWdodCBEQUMxIFN3aXRjaCIsICJSaWdodCBEQUMxIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIkxlZnQgREFDMSBTd2l0Y2giLCAiTGVmdCBEQUMxIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIklucHV0IDEgQnlwYXNzIFN3aXRjaCIsICJJTjFQR0EiIH0sCisJeyAiRWFycGllY2UgTWl4ZXIiLCAiSW5wdXQgMiBCeXBhc3MgU3dpdGNoIiwgIklOMlBHQSIgfSwKKwl7ICJFYXJwaWVjZSBNaXhlciIsICJJbnB1dCAzIEJ5cGFzcyBTd2l0Y2giLCAiSU4zUEdBIiB9LAorCXsgIkVhcnBpZWNlIE1peGVyIiwgIklucHV0IDQgQnlwYXNzIFN3aXRjaCIsICJJTjRQR0EiIH0sCisKKwl7ICJMT1VUMUwiLCBOVUxMLCAiTGVmdCBMaW5lb3V0MSBNaXhlciIgfSwKKwl7ICJMT1VUMVIiLCBOVUxMLCAiUmlnaHQgTGluZW91dDEgTWl4ZXIiIH0sCisJeyAiTE9VVDJMIiwgTlVMTCwgIkxlZnQgTGluZW91dDIgTWl4ZXIiIH0sCisJeyAiTE9VVDJSIiwgTlVMTCwgIlJpZ2h0IExpbmVvdXQyIE1peGVyIiB9LAorCXsgIlNQS0wiLCBOVUxMLCAiTGVmdCBTcGVha2VyIE1peGVyIiB9LAorCXsgIlNQS1IiLCBOVUxMLCAiUmlnaHQgU3BlYWtlciBNaXhlciIgfSwKKwl7ICJIUEwiLCBOVUxMLCAiTGVmdCBIZWFkcGhvbmUgTWl4ZXIiIH0sCisJeyAiSFBSIiwgTlVMTCwgIlJpZ2h0IEhlYWRwaG9uZSBNaXhlciIgfSwKKwl7ICJFUCIsIE5VTEwsICJFYXJwaWVjZSBNaXhlciIgfSwKKworCXsgIklOMVBHQSIsIE5VTEwsICJBSU4xTCIgfSwKKwl7ICJJTjJQR0EiLCBOVUxMLCAiQUlOMkwiIH0sCisJeyAiSU4zUEdBIiwgTlVMTCwgIkFJTjNMIiB9LAorCXsgIklONFBHQSIsIE5VTEwsICJBSU40TCIgfSwKKwl7ICJJTjFQR0EiLCBOVUxMLCAiQUlOMVIiIH0sCisJeyAiSU4yUEdBIiwgTlVMTCwgIkFJTjJSIiB9LAorCXsgIklOM1BHQSIsIE5VTEwsICJBSU4zUiIgfSwKKwl7ICJJTjRQR0EiLCBOVUxMLCAiQUlONFIiIH0sCisKKwl7ICJTWVNDTEsxIiwgTlVMTCwgIlBMTDEiIH0sCisJeyAiU1lTQ0xLMiIsIE5VTEwsICJQTEwyIiB9LAorCisJeyAiTGVmdCBEQUMxIiwgTlVMTCwgIlNZU0NMSzEiIH0sCisJeyAiUmlnaHQgREFDMSIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIkxlZnQgREFDMiIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIlJpZ2h0IERBQzIiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJMZWZ0IEFEQyIsIE5VTEwsICJTWVNDTEsxIiB9LAorCXsgIlJpZ2h0IEFEQyIsIE5VTEwsICJTWVNDTEsxIiB9LAorCisJeyAiRFNQIiwgTlVMTCwgIlNZU0NMSzEiIH0sCisKKwl7ICJBSUYxIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJBSUYyIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJBSUYzIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMxIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMyIE1peGVyIiwgTlVMTCwgIkRTUCIgfSwKKwl7ICJEQUMxIE1peGVyIiwgTlVMTCwgIlBsYXliYWNrIEVuZ2luZSBBIiB9LAorCXsgIkRBQzIgTWl4ZXIiLCBOVUxMLCAiUGxheWJhY2sgRW5naW5lIEIiIH0sCisJeyAiTGVmdCBBREMgTWl4ZXIiLCBOVUxMLCAiUmVjb3JkaW5nIEVuZ2luZSBBIiB9LAorCXsgIlJpZ2h0IEFEQyBNaXhlciIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEEiIH0sCisKKwl7ICJBSUYxIENMSyIsIE5VTEwsICJTWVNDTEsxIiwgYWRhdTEzNzNfY2hlY2tfYWlmX2NsayB9LAorCXsgIkFJRjIgQ0xLIiwgTlVMTCwgIlNZU0NMSzEiLCBhZGF1MTM3M19jaGVja19haWZfY2xrIH0sCisJeyAiQUlGMyBDTEsiLCBOVUxMLCAiU1lTQ0xLMSIsIGFkYXUxMzczX2NoZWNrX2FpZl9jbGsgfSwKKwl7ICJBSUYxIENMSyIsIE5VTEwsICJTWVNDTEsyIiwgYWRhdTEzNzNfY2hlY2tfYWlmX2NsayB9LAorCXsgIkFJRjIgQ0xLIiwgTlVMTCwgIlNZU0NMSzIiLCBhZGF1MTM3M19jaGVja19haWZfY2xrIH0sCisJeyAiQUlGMyBDTEsiLCBOVUxMLCAiU1lTQ0xLMiIsIGFkYXUxMzczX2NoZWNrX2FpZl9jbGsgfSwKKworCXsgIkFJRjEgSU4iLCBOVUxMLCAiQUlGMSBDTEsiIH0sCisJeyAiQUlGMSBPVVQiLCBOVUxMLCAiQUlGMSBDTEsiIH0sCisJeyAiQUlGMiBJTiIsIE5VTEwsICJBSUYyIENMSyIgfSwKKwl7ICJBSUYyIE9VVCIsIE5VTEwsICJBSUYyIENMSyIgfSwKKwl7ICJBSUYzIElOIiwgTlVMTCwgIkFJRjMgQ0xLIiB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgQ0xLIiB9LAorCXsgIkFJRjEgSU4iLCBOVUxMLCAiQUlGMSBJTiBTUkMiLCBhZGF1MTM3M19jaGVja19zcmMgfSwKKwl7ICJBSUYxIE9VVCIsIE5VTEwsICJBSUYxIE9VVCBTUkMiLCBhZGF1MTM3M19jaGVja19zcmMgfSwKKwl7ICJBSUYyIElOIiwgTlVMTCwgIkFJRjIgSU4gU1JDIiwgYWRhdTEzNzNfY2hlY2tfc3JjIH0sCisJeyAiQUlGMiBPVVQiLCBOVUxMLCAiQUlGMiBPVVQgU1JDIiwgYWRhdTEzNzNfY2hlY2tfc3JjIH0sCisJeyAiQUlGMyBJTiIsIE5VTEwsICJBSUYzIElOIFNSQyIsIGFkYXUxMzczX2NoZWNrX3NyYyB9LAorCXsgIkFJRjMgT1VUIiwgTlVMTCwgIkFJRjMgT1VUIFNSQyIsIGFkYXUxMzczX2NoZWNrX3NyYyB9LAorCisJeyAiRE1JQzEiLCBOVUxMLCAiRE1JQzFEQVQiIH0sCisJeyAiRE1JQzEiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJETUlDMSIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEEiIH0sCisJeyAiRE1JQzIiLCBOVUxMLCAiRE1JQzJEQVQiIH0sCisJeyAiRE1JQzIiLCBOVUxMLCAiU1lTQ0xLMSIgfSwKKwl7ICJETUlDMiIsIE5VTEwsICJSZWNvcmRpbmcgRW5naW5lIEIiIH0sCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgYWRhdTEzNzMgKmFkYXUxMzczID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGFkYXUxMzczX2RhaSAqYWRhdTEzNzNfZGFpID0gJmFkYXUxMzczLT5kYWlzW2RhaS0+aWRdOworCXVuc2lnbmVkIGludCBkaXY7CisJdW5zaWduZWQgaW50IGZyZXE7CisJdW5zaWduZWQgaW50IGN0cmw7CisKKwlmcmVxID0gYWRhdTEzNzNfZGFpLT5zeXNjbGs7CisKKwlpZiAoZnJlcSAlIHBhcmFtc19yYXRlKHBhcmFtcykgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZyZXEgLyBwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSAxMDI0OiAvKiBzeXNjbGsgLyAyNTYgKi8KKwkJZGl2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxNTM2OiAvKiAyLzMgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDE7CisJCWJyZWFrOworCWNhc2UgMjA0ODogLyogMS8yIHN5c2NsayAvIDI1NiAqLworCQlkaXYgPSAyOworCQlicmVhazsKKwljYXNlIDMwNzI6IC8qIDEvMyBzeXNjbGsgLyAyNTYgKi8KKwkJZGl2ID0gMzsKKwkJYnJlYWs7CisJY2FzZSA0MDk2OiAvKiAxLzQgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDQ7CisJCWJyZWFrOworCWNhc2UgNjE0NDogLyogMS82IHN5c2NsayAvIDI1NiAqLworCQlkaXYgPSA1OworCQlicmVhazsKKwljYXNlIDU2MzI6IC8qIDIvMTEgc3lzY2xrIC8gMjU2ICovCisJCWRpdiA9IDY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXUxMzczX2RhaS0+ZW5hYmxlX3NyYyA9IChkaXYgIT0gMCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBREFVMTM3M19CQ0xLRElWKGRhaS0+aWQpLAorCQl+QURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UsIChkaXYgPDwgMikgfCBBREFVMTM3M19CQ0xLRElWXzY0KTsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJY3RybCA9IEFEQVUxMzczX0RBSV9XTEVOXzE2OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJY3RybCA9IEFEQVUxMzczX0RBSV9XTEVOXzIwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQljdHJsID0gQURBVTEzNzNfREFJX1dMRU5fMjQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWN0cmwgPSBBREFVMTM3M19EQUlfV0xFTl8zMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX0RBSShkYWktPmlkKSwKKwkJCUFEQVUxMzczX0RBSV9XTEVOX01BU0ssIGN0cmwpOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBhZGF1MTM3M19kYWkgKmFkYXUxMzczX2RhaSA9ICZhZGF1MTM3My0+ZGFpc1tkYWktPmlkXTsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwgPSBBREFVMTM3M19EQUlfTUFTVEVSOworCQlhZGF1MTM3M19kYWktPm1hc3RlciA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJY3RybCA9IDA7CisJCWFkYXUxMzczX2RhaS0+bWFzdGVyID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfRk9STUFUX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWN0cmwgfD0gQURBVTEzNzNfREFJX0ZPUk1BVF9MRUZUX0o7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfRk9STUFUX1JJR0hUX0o7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWN0cmwgfD0gQURBVTEzNzNfREFJX0ZPUk1BVF9EU1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQljdHJsIHw9IEFEQVUxMzczX0RBSV9JTlZFUlRfQkNMSzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJY3RybCB8PSBBREFVMTM3M19EQUlfSU5WRVJUX0xSQ0xLOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQljdHJsIHw9IEFEQVUxMzczX0RBSV9JTlZFUlRfTFJDTEsgfCBBREFVMTM3M19EQUlfSU5WRVJUX0JDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX0RBSShkYWktPmlkKSwKKwkJfkFEQVUxMzczX0RBSV9XTEVOX01BU0ssIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IGFkYXUxMzczICphZGF1MTM3MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7CisJc3RydWN0IGFkYXUxMzczX2RhaSAqYWRhdTEzNzNfZGFpID0gJmFkYXUxMzczLT5kYWlzW2RhaS0+aWRdOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIEFEQVUxMzczX0NMS19TUkNfUExMMToKKwljYXNlIEFEQVUxMzczX0NMS19TUkNfUExMMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWRhdTEzNzNfZGFpLT5zeXNjbGsgPSBmcmVxOworCWFkYXUxMzczX2RhaS0+Y2xrX3NyYyA9IGNsa19pZDsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywgQURBVTEzNzNfQkNMS0RJVihkYWktPmlkKSwKKwkJQURBVTEzNzNfQkNMS0RJVl9TT1VSQ0UsIGNsa19pZCA8PCA1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhZGF1MTM3M19kYWlfb3BzID0geworCS5od19wYXJhbXMJPSBhZGF1MTM3M19od19wYXJhbXMsCisJLnNldF9zeXNjbGsJPSBhZGF1MTM3M19zZXRfZGFpX3N5c2NsaywKKwkuc2V0X2ZtdAk9IGFkYXUxMzczX3NldF9kYWlfZm10LAorfTsKKworI2RlZmluZSBBREFVMTM3M19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZGF1MTM3M19kYWlfZHJpdmVyW10gPSB7CisJeworCQkuaWQgPSAwLAorCQkubmFtZSA9ICJhZGF1MTM3My1haWYxIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IEFEQVUxMzczX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gQURBVTEzNzNfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZhZGF1MTM3M19kYWlfb3BzLAorCQkuc3ltbWV0cmljX3JhdGVzID0gMSwKKwl9LAorCXsKKwkJLmlkID0gMSwKKwkJLm5hbWUgPSAiYWRhdTEzNzMtYWlmMiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBBREFVMTM3M19GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IEFEQVUxMzczX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmYWRhdTEzNzNfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfSwKKwl7CisJCS5pZCA9IDIsCisJCS5uYW1lID0gImFkYXUxMzczLWFpZjMiLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gQURBVTEzNzNfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBBREFVMTM3M19GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFkYXUxMzczX2RhaV9vcHMsCisJCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAorCX0sCit9OworCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9wbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcGxsX2lkLAorCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJdW5zaWduZWQgaW50IGRwbGxfZGl2ID0gMDsKKwl1bnNpZ25lZCBpbnQgeCwgciwgbiwgbSwgaSwgaiwgbW9kZTsKKworCXN3aXRjaCAocGxsX2lkKSB7CisJY2FzZSBBREFVMTM3M19QTEwxOgorCWNhc2UgQURBVTEzNzNfUExMMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfQkNMSzE6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0JDTEsyOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19CQ0xLMzoKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfTFJDTEsxOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19MUkNMSzI6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0xSQ0xLMzoKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfTUNMSzE6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX01DTEsyOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19HUElPMToKKwljYXNlIEFEQVUxMzczX1BMTF9TUkNfR1BJTzI6CisJY2FzZSBBREFVMTM3M19QTExfU1JDX0dQSU8zOgorCWNhc2UgQURBVTEzNzNfUExMX1NSQ19HUElPNDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZyZXFfaW4gPCA3ODEzIHx8IGZyZXFfaW4gPiAyNzAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnJlcV9vdXQgPCA0NTE1ODAwMCB8fCBmcmVxX291dCA+IDQ5MTUyMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFQTEwgaW5wdXQgbmVlZHMgdG8gYmUgPj0gOE1oeiwgc28gaW4gY2FzZSBmcmVxX2luIGlzIGxlc3Mgd2UgdXNlIHRoZQorCSAqIERQTEwgdG8gZ2V0IGl0IHRoZXJlLiBEUExMX291dCA9IChEUExMX2luIC8gZGl2KSAqIDEwMjQgKi8KKwl3aGlsZSAoZnJlcV9pbiA8IDgwMDAwMDApIHsKKwkJZnJlcV9pbiAqPSAyOworCQlkcGxsX2RpdisrOworCX0KKworCWlmIChmcmVxX291dCAlIGZyZXFfaW4gIT0gMCkgeworCQkvKiBmb3V0ID0gZmluICogKHIgKyAobi9tKSkgLyB4ICovCisJCXggPSBESVZfUk9VTkRfVVAoZnJlcV9pbiwgMTM1MDAwMDApOworCQlmcmVxX2luIC89IHg7CisJCXIgPSBmcmVxX291dCAvIGZyZXFfaW47CisJCWkgPSBmcmVxX291dCAlIGZyZXFfaW47CisJCWogPSBnY2QoaSwgZnJlcV9pbik7CisJCW4gPSBpIC8gajsKKwkJbSA9IGZyZXFfaW4gLyBqOworCQl4LS07CisJCW1vZGUgPSAxOworCX0gZWxzZSB7CisJCS8qIGZvdXQgPSBmaW4gLyByICovCisJCXIgPSBmcmVxX291dCAvIGZyZXFfaW47CisJCW4gPSAwOworCQltID0gMDsKKwkJeCA9IDA7CisJCW1vZGUgPSAwOworCX0KKworCWlmIChyIDwgMiB8fCByID4gOCB8fCB4ID4gMyB8fCBtID4gMHhmZmZmIHx8IG4gPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRwbGxfZGl2KSB7CisJCWRwbGxfZGl2ID0gMTEgLSBkcGxsX2RpdjsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfUExMX0NUUkw2KHBsbF9pZCksCisJCQlBREFVMTM3M19QTExfQ1RSTDZfRFBMTF9CWVBBU1MsIDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMNihwbGxfaWQpLAorCQkJQURBVTEzNzNfUExMX0NUUkw2X0RQTExfQllQQVNTLAorCQkJQURBVTEzNzNfUExMX0NUUkw2X0RQTExfQllQQVNTKTsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19EUExMX0NUUkwocGxsX2lkKSwKKwkJKHNvdXJjZSA8PCA0KSB8IGRwbGxfZGl2KTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19QTExfQ1RSTDEocGxsX2lkKSwgKG0gPj4gOCkgJiAweGZmKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19QTExfQ1RSTDIocGxsX2lkKSwgbSAmIDB4ZmYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMMyhwbGxfaWQpLCAobiA+PiA4KSAmIDB4ZmYpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX1BMTF9DVFJMNChwbGxfaWQpLCBuICYgMHhmZik7CisJc25kX3NvY193cml0ZShjb2RlYywgQURBVTEzNzNfUExMX0NUUkw1KHBsbF9pZCksCisJCShyIDw8IDMpIHwgKHggPDwgMSkgfCBtb2RlKTsKKworCS8qIFNldCBzeXNjbGsgdG8gcGxsX3JhdGUgLyA0ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQURBVTEzNzNfQ0xLX1NSQ19ESVYocGxsX2lkKSwgMHgzZiwgMHgwOSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRhdTEzNzNfbG9hZF9kcmNfc2V0dGluZ3Moc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCBuciwgdWludDhfdCAqZHJjKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFEQVUxMzczX0RSQ19TSVpFOyArK2kpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX0RSQyhucikgKyBpLCBkcmNbaV0pOworfQorCitzdGF0aWMgYm9vbCBhZGF1MTM3M192YWxpZF9taWNiaWFzKGVudW0gYWRhdTEzNzNfbWljYmlhc192b2x0YWdlIG1pY2JpYXMpCit7CisJc3dpdGNoIChtaWNiaWFzKSB7CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfOVY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfMlY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzJfNlY6CisJY2FzZSBBREFVMTM3M19NSUNCSUFTXzFfOFY6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhZGF1MTM3M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNvZGVjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJYm9vbCBsaW5lb3V0X2RpZmZlcmVudGlhbCA9IGZhbHNlOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBTTkRfU09DX0kyQyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlpZiAocGRhdGEpIHsKKwkJaWYgKHBkYXRhLT5udW1fZHJjID4gQVJSQVlfU0laRShwZGF0YS0+ZHJjX3NldHRpbmcpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFhZGF1MTM3M192YWxpZF9taWNiaWFzKHBkYXRhLT5taWNiaWFzMSkgfHwKKwkJCSFhZGF1MTM3M192YWxpZF9taWNiaWFzKHBkYXRhLT5taWNiaWFzMikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9kcmM7ICsraSkgeworCQkJYWRhdTEzNzNfbG9hZF9kcmNfc2V0dGluZ3MoY29kZWMsIGksCisJCQkJcGRhdGEtPmRyY19zZXR0aW5nW2ldKTsKKwkJfQorCisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhZGF1MTM3M19kcmNfY29udHJvbHMsCisJCQlwZGF0YS0+bnVtX2RyYyk7CisKKwkJdmFsID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJaWYgKHBkYXRhLT5pbnB1dF9kaWZmZXJlbnRpYWxbaV0pCisJCQkJdmFsIHw9IEJJVChpKTsKKwkJfQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19JTlBVVF9NT0RFLCB2YWwpOworCisJCXZhbCA9IDA7CisJCWlmIChwZGF0YS0+bGluZW91dF9kaWZmZXJlbnRpYWwpCisJCQl2YWwgfD0gQURBVTEzNzNfT1VUUFVUX0NUUkxfTERJRkY7CisJCWlmIChwZGF0YS0+bGluZW91dF9ncm91bmRfc2Vuc2UpCisJCQl2YWwgfD0gQURBVTEzNzNfT1VUUFVUX0NUUkxfTE5GQkVOOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19PVVRQVVRfQ1RSTCwgdmFsKTsKKworCQlsaW5lb3V0X2RpZmZlcmVudGlhbCA9IHBkYXRhLT5saW5lb3V0X2RpZmZlcmVudGlhbDsKKworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBREFVMTM3M19FUF9DVFJMLAorCQkJKHBkYXRhLT5taWNiaWFzMSA8PCBBREFVMTM3M19FUF9DVFJMX01JQ0JJQVMxX09GRlNFVCkgfAorCQkJKHBkYXRhLT5taWNiaWFzMiA8PCBBREFVMTM3M19FUF9DVFJMX01JQ0JJQVMyX09GRlNFVCkpOworCX0KKworCWlmICghbGluZW91dF9kaWZmZXJlbnRpYWwpIHsKKwkJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFkYXUxMzczX2xpbmVvdXQyX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhZGF1MTM3M19saW5lb3V0Ml9jb250cm9scykpOworCX0KKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFEQVUxMzczX0FEQ19DVFJMLAorCSAgICBBREFVMTM3M19BRENfQ1RSTF9SRVNFVF9GT1JDRSB8IEFEQVUxMzczX0FEQ19DVFJMX1BFQUtfREVURUNUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BXRE5fQ1RSTDMsCisJCQlBREFVMTM3M19QV0ROX0NUUkwzX1BXUl9FTiwgQURBVTEzNzNfUFdETl9DVFJMM19QV1JfRU4pOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFEQVUxMzczX1BXRE5fQ1RSTDMsCisJCQlBREFVMTM3M19QV0ROX0NUUkwzX1BXUl9FTiwgMCk7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlhZGF1MTM3M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRhdTEzNzNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworfQorCitzdGF0aWMgaW50IGFkYXUxMzczX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWRhdTEzNzNfY29kZWNfZHJpdmVyID0geworCS5wcm9iZSA9CWFkYXUxMzczX3Byb2JlLAorCS5yZW1vdmUgPQlhZGF1MTM3M19yZW1vdmUsCisJLnN1c3BlbmQgPQlhZGF1MTM3M19zdXNwZW5kLAorCS5yZXN1bWUgPQlhZGF1MTM3M19yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gYWRhdTEzNzNfc2V0X2JpYXNfbGV2ZWwsCisJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRShhZGF1MTM3M19kZWZhdWx0X3JlZ3MpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IGFkYXUxMzczX2RlZmF1bHRfcmVncywKKwkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1aW50OF90KSwKKworCS5zZXRfcGxsID0gYWRhdTEzNzNfc2V0X3BsbCwKKworCS5jb250cm9scyA9IGFkYXUxMzczX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gYWRhdTEzNzNfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGFkYXUxMzczX2RhcG1fcm91dGVzLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkYXUxMzczX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWRhdTEzNzMgKmFkYXUxMzczOworCWludCByZXQ7CisKKwlhZGF1MTM3MyA9IGt6YWxsb2Moc2l6ZW9mKCphZGF1MTM3MyksIEdGUF9LRVJORUwpOworCWlmICghYWRhdTEzNzMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgYWRhdTEzNzMpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsICZhZGF1MTM3M19jb2RlY19kcml2ZXIsCisJCQlhZGF1MTM3M19kYWlfZHJpdmVyLCBBUlJBWV9TSVpFKGFkYXUxMzczX2RhaV9kcml2ZXIpKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUoYWRhdTEzNzMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWRhdTEzNzNfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGRldl9nZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkYXUxMzczX2kyY19pZFtdID0geworCXsgImFkYXUxMzczIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZGF1MTM3M19pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRhdTEzNzNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGF1MTM3MyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRhdTEzNzNfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGF1MTM3M19pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZGF1MTM3M19pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZGF1MTM3M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZGF1MTM3M19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkYXUxMzczX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWRhdTEzNzNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZGF1MTM3M19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkYXUxMzczX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgQURBVTEzNzMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFiNTUzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX19BREFVMTM3M19IX18KKyNkZWZpbmUgX19BREFVMTM3M19IX18KKworZW51bSBhZGF1MTM3M19wbGxfc3JjIHsKKwlBREFVMTM3M19QTExfU1JDX01DTEsxID0gMCwKKwlBREFVMTM3M19QTExfU1JDX0JDTEsxID0gMSwKKwlBREFVMTM3M19QTExfU1JDX0JDTEsyID0gMiwKKwlBREFVMTM3M19QTExfU1JDX0JDTEszID0gMywKKwlBREFVMTM3M19QTExfU1JDX0xSQ0xLMSA9IDQsCisJQURBVTEzNzNfUExMX1NSQ19MUkNMSzIgPSA1LAorCUFEQVUxMzczX1BMTF9TUkNfTFJDTEszID0gNiwKKwlBREFVMTM3M19QTExfU1JDX0dQSU8xID0gNywKKwlBREFVMTM3M19QTExfU1JDX0dQSU8yID0gOCwKKwlBREFVMTM3M19QTExfU1JDX0dQSU8zID0gOSwKKwlBREFVMTM3M19QTExfU1JDX0dQSU80ID0gMTAsCisJQURBVTEzNzNfUExMX1NSQ19NQ0xLMiA9IDExLAorfTsKKworZW51bSBhZGF1MTM3M19wbGwgeworCUFEQVUxMzczX1BMTDEgPSAwLAorCUFEQVUxMzczX1BMTDIgPSAxLAorfTsKKworZW51bSBhZGF1MTM3M19jbGtfc3JjIHsKKwlBREFVMTM3M19DTEtfU1JDX1BMTDEgPSAwLAorCUFEQVUxMzczX0NMS19TUkNfUExMMiA9IDEsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYwppbmRleCAyNzU4ZDVmLi44YjdlMWM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCkBAIC00MDEsNyArNDAxLDcgQEAKIH0KIAogc3RhdGljIGludCBhZGF1MTcwMV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKLQl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKKwlpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC00NTgsNiArNDU4LDcgQEAKIAlpbnQgcmV0OwogCiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CiAKIAlyZXQgPSBhZGF1MTcwMV9sb2FkX2Zpcm13YXJlKGNvZGVjKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCAzMDBjMDRiLi5mOWYwODk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtNTIzLDcgKzUyMyw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRhdjgweF9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCisJCQkgICAgICBpbnQgY2xrX2lkLCBpbnQgc291cmNlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwppbmRleCA4NDAyODU0Li45MDgyZTBmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5oIGIvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTAyODYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogYWRzMTE3eC5oICAtLSAgRHJpdmVyIGZvciBhZHMxMTc0LzggQURDIGNoaXBzCi0gKgotICogQ29weXJpZ2h0IDIwMDkgU2hvdFNwb3R0ZXIgSW5jLgotICogQXV0aG9yOiBHcmFlbWUgR3JlZ29yeSA8Z2dAc2xpbWxvZ2ljLmNvLnVrPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi1leHRlcm4gc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhZHMxMTd4X2RhaTsKLWV4dGVybiBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZHMxMTd4OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggY2JmMGI2ZC4uZDNiMjlkYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkucHJvYmUgPQlhazQxMDRfcHJvYmUsCiAJLnJlbW92ZSA9CWFrNDEwNF9yZW1vdmUsCiAJLnJlZ19jYWNoZV9zaXplID0gQUs0MTA0X05VTV9SRUdTLAotCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTgpLAogfTsKIAogc3RhdGljIGludCBhazQxMDRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwppbmRleCBlMWEyMTRlLi45NWQ3ODJkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKQEAgLTM0LDc0ICszNCwxNiBAQAogc3RydWN0IGFrNDUzNV9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qCiAgKiBhazQ1MzUgcmVnaXN0ZXIgY2FjaGUKICAqLwotc3RhdGljIGNvbnN0IHUxNiBhazQ1MzVfcmVnW0FLNDUzNV9DQUNIRVJFR05VTV0gPSB7Ci0gICAgMHgwMDAwLCAweDAwODAsIDB4MDAwMCwgMHgwMDAzLAotICAgIDB4MDAwMiwgMHgwMDAwLCAweDAwMTEsIDB4MDAwMSwKLSAgICAweDAwMDAsIDB4MDA0MCwgMHgwMDM2LCAweDAwMTAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDA1NywgMHgwMDAwLAotfTsKLQotLyoKLSAqIHJlYWQgYWs0NTM1IHJlZ2lzdGVyIGNhY2hlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JdW5zaWduZWQgaW50IHJlZykKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFLNDUzNV9DQUNIRVJFR05VTSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBjYWNoZVtyZWddOwotfQotCi0vKgotICogd3JpdGUgYWs0NTM1IHJlZ2lzdGVyIGNhY2hlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhazQ1MzVfd3JpdGVfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQl1MTYgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaWYgKHJlZyA+PSBBSzQ1MzVfQ0FDSEVSRUdOVU0pCi0JCXJldHVybjsKLQljYWNoZVtyZWddID0gdmFsdWU7Ci19Ci0KLS8qCi0gKiB3cml0ZSB0byB0aGUgQUs0NTM1IHJlZ2lzdGVyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgYWs0NTM1X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQl1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggZGF0YVsyXTsKLQotCS8qIGRhdGEgaXMKLQkgKiAgIEQxNS4uRDggQUs0NTM1IHJlZ2lzdGVyIG9mZnNldAotCSAqICAgRDcuLi5EMCByZWdpc3RlciBkYXRhCi0JICovCi0JZGF0YVswXSA9IHJlZyAmIDB4ZmY7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKLQotCWFrNDUzNV93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOwotCWlmIChjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikgPT0gMikKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGludCBhazQ1MzVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaW50IGksIHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFLNDUzNV9DQUNIRVJFR05VTTsgaSsrKQotCQlyIHw9IGFrNDUzNV93cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOwotCi0JcmV0dXJuIHI7CitzdGF0aWMgY29uc3QgdTggYWs0NTM1X3JlZ1tBSzQ1MzVfQ0FDSEVSRUdOVU1dID0geworCTB4MDAsIDB4ODAsIDB4MDAsIDB4MDMsCisJMHgwMiwgMHgwMCwgMHgxMSwgMHgwMSwKKwkweDAwLCAweDQwLCAweDM2LCAweDEwLAorCTB4MDAsIDB4MDAsIDB4NTcsIDB4MDAsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWs0NTM1X21vbm9fZ2FpbltdID0geyIrNmRCIiwgIi0xN2RCIn07CkBAIC0zMDQsNyArMjQ2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3QgYWs0NTM1X3ByaXYgKmFrNDUzNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXU4IG1vZGUyID0gYWs0NTM1X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBBSzQ1MzVfTU9ERTIpICYgfigweDMgPDwgNSk7CisJdTggbW9kZTIgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFLNDUzNV9NT0RFMikgJiB+KDB4MyA8PCA1KTsKIAlpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyksIGZzID0gMjU2OwogCiAJaWYgKHJhdGUpCkBAIC0zMjMsNyArMjY1LDcgQEAKIAl9CiAKIAkvKiBzZXQgcmF0ZSAqLwotCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X01PREUyLCBtb2RlMik7CisJc25kX3NvY193cml0ZShjb2RlYywgQUs0NTM1X01PREUyLCBtb2RlMik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0OCw0NCArMjkwLDM3IEBACiAJLyogdXNlIDMyIGZzIGZvciBCQ0xLIHRvIHNhdmUgcG93ZXIgKi8KIAltb2RlMSB8PSAweDQ7CiAKLQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9NT0RFMSwgbW9kZTEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDUzNV9NT0RFMSwgbW9kZTEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFrNDUzNV9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCXUxNiBtdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7CisJdTE2IG11dGVfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSzQ1MzVfREFDKTsKIAlpZiAoIW11dGUpCi0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgJiB+MHgyMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDUzNV9EQUMsIG11dGVfcmVnICYgfjB4MjApOwogCWVsc2UKLQkJYWs0NTM1X3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFrNDUzNV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCiB7Ci0JdTE2IGksIG11dGVfcmVnOwotCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCQltdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgJiB+MHgyMCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFLNDUzNV9EQUMsIDB4MjAsIDApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQltdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQyk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcgfCAweDIwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NTM1X0RBQywgMHgyMCwgMHgyMCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWkgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUoY29kZWMsIEFLNDUzNV9QTTEpOwotCQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9QTTEsIGkgfCAweDgwKTsKLQkJaSA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X1BNMik7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X1BNMiwgaSAmICh+MHg4MCkpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ1MzVfUE0xLCAweDgwLCAweDgwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NTM1X1BNMiwgMHg4MCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJaSA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X1BNMSk7Ci0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X1BNMSwgaSAmICh+MHg4MCkpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ1MzVfUE0xLCAweDgwLCAwKTsKIAkJYnJlYWs7CiAJfQogCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKQEAgLTQyOCw3ICszNjMsNyBAQAogCiBzdGF0aWMgaW50IGFrNDUzNV9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWFrNDUzNV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOwogCWFrNDUzNV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwogfQpAQCAtNDM2LDExICszNzEsMTUgQEAKIHN0YXRpYyBpbnQgYWs0NTM1X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWs0NTM1X3ByaXYgKmFrNDUzNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBSzQ1MzUgQXVkaW8gQ29kZWMgJXMiLCBBSzQ1MzVfVkVSU0lPTik7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWs0NTM1LT5jb250cm9sX2RhdGE7Ci0KKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgYWs0NTM1LT5jb250cm9sX3R5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJYWs0NTM1X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTQ2MSw4ICs0MDAsNiBAQAogCS5yZW1vdmUgPQlhazQ1MzVfcmVtb3ZlLAogCS5zdXNwZW5kID0JYWs0NTM1X3N1c3BlbmQsCiAJLnJlc3VtZSA9CWFrNDUzNV9yZXN1bWUsCi0JLnJlYWQgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUsCi0JLndyaXRlID0gYWs0NTM1X3dyaXRlLAogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDUzNV9zZXRfYmlhc19sZXZlbCwKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKGFrNDUzNV9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKQEAgLTQ4NSw3ICs0MjIsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFrNDUzNSk7Ci0JYWs0NTM1LT5jb250cm9sX2RhdGEgPSBpMmM7CiAJYWs0NTM1LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKaW5kZXggN2E2NGU1OC4uNzc4Mzg1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCkBAIC0zMSw3ICszMSw2IEBACiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IGFrNDY0MV9wcml2IHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAlpbnQgZGVlbXBoOwogCWludCBwbGF5YmFja19mczsKQEAgLTIyNiw3ICsyMjUsNyBAQAogCVNORF9TT0NfREFQTV9QR0EoIk1vbm8gT3V0IDIiLCBBSzQ2NDFfUE0yLCAzLCAwLCBOVUxMLCAwKSwKIAogCVNORF9TT0NfREFQTV9BREMoIlZvaWNlIEFEQyIsICJWb2ljZSBDYXB0dXJlIiwgQUs0NjQxX0JUSUYsIDAsIDApLAotCVNORF9TT0NfREFQTV9BREMoIlZvaWNlIERBQyIsICJWb2ljZSBQbGF5YmFjayIsIEFLNDY0MV9CVElGLCAxLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJWb2ljZSBEQUMiLCAiVm9pY2UgUGxheWJhY2siLCBBSzQ2NDFfQlRJRiwgMSwgMCksCiAKIAlTTkRfU09DX0RBUE1fTUlDQklBUygiTWljIEludCBCaWFzIiwgQUs0NjQxX01JQywgMywgMCksCiAJU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1pYyBFeHQgQmlhcyIsIEFLNDY0MV9NSUMsIDQsIDApLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggNjVmNDYwNC4uMTJjMWJkZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KQEAgLTE1Niw4MSArMTU3LDIyIEBACiBzdHJ1Y3QgYWs0NjQyX3ByaXYgewogCXVuc2lnbmVkIGludCBzeXNjbGs7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogfTsKIAogLyoKICAqIGFrNDY0MiByZWdpc3RlciBjYWNoZQogICovCi1zdGF0aWMgY29uc3QgdTE2IGFrNDY0Ml9yZWdbQUs0NjQyX0NBQ0hFUkVHTlVNXSA9IHsKLQkweDAwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDAsCi0JMHgwMDAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDBlMSwgMHgwMGUxLCAweDAwMTgsIDB4MDAwMCwKLQkweDAwZTEsIDB4MDAxOCwgMHgwMDExLCAweDAwMDgsCi0JMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0JMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkweDAwMDAsCi19OwotCi0vKgotICogcmVhZCBhazQ2NDIgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYWs0NjQyX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQl1bnNpZ25lZCBpbnQgcmVnKQotewotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCWlmIChyZWcgPj0gQUs0NjQyX0NBQ0hFUkVHTlVNKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIGNhY2hlW3JlZ107Ci19Ci0KLS8qCi0gKiB3cml0ZSBhazQ2NDIgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGFrNDY0Ml93cml0ZV9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCXUxNiByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFLNDY0Ml9DQUNIRVJFR05VTSkKLQkJcmV0dXJuOwotCi0JY2FjaGVbcmVnXSA9IHZhbHVlOwotfQotCi0vKgotICogd3JpdGUgdG8gdGhlIEFLNDY0MiByZWdpc3RlciBzcGFjZQotICovCi1zdGF0aWMgaW50IGFrNDY0Ml93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JdW5zaWduZWQgaW50IHZhbHVlKQotewotCXU4IGRhdGFbMl07Ci0KLQkvKiBkYXRhIGlzCi0JICogICBEMTUuLkQ4IEFLNDY0MiByZWdpc3RlciBvZmZzZXQKLQkgKiAgIEQ3Li4uRDAgcmVnaXN0ZXIgZGF0YQotCSAqLwotCWRhdGFbMF0gPSByZWcgJiAweGZmOwotCWRhdGFbMV0gPSB2YWx1ZSAmIDB4ZmY7Ci0KLQlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpIHsKLQkJYWs0NjQyX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGludCBhazQ2NDJfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JaW50IGksIHIgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFLNDY0Ml9DQUNIRVJFR05VTTsgaSsrKQotCQlyIHw9IGFrNDY0Ml93cml0ZShjb2RlYywgaSwgY2FjaGVbaV0pOwotCi0JcmV0dXJuIHI7CitzdGF0aWMgY29uc3QgdTggYWs0NjQyX3JlZ1tBSzQ2NDJfQ0FDSEVSRUdOVU1dID0geworCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweGUxLCAweGUxLCAweDE4LCAweDAwLAorCTB4ZTEsIDB4MTgsIDB4MTEsIDB4MDgsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsCiB9OwogCiBzdGF0aWMgaW50IGFrNDY0Ml9kYWlfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTI1Miw4ICsxOTQsOCBAQAogCQkgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTURfQ1RMNCwgREFDSCwgREFDSCk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1EX0NUTDMsIEJTVDEsIEJTVDEpOwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIExfSVZDLCAweDkxKTsgLyogdm9sdW1lICovCi0JCWFrNDY0Ml93cml0ZShjb2RlYywgUl9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgTF9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgUl9JVkMsIDB4OTEpOyAvKiB2b2x1bWUgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDEsIFBNVkNNIHwgUE1NSU4gfCBQTURBQywKIAkJCQkJCSAgICAgUE1WQ00gfCBQTU1JTiB8IFBNREFDKTsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDIsIFBNSFBfTUFTSywJUE1IUCk7CkBAIC0yNzIsOSArMjE0LDkgQEAKIAkJICogVGhpcyBvcGVyYXRpb24gY2FtZSBmcm9tIGV4YW1wbGUgY29kZSBvZgogCQkgKiAiQVNBSEkgS0FTRUkgQUs0NjQyIiAoamFwYW5lc2UpIG1hbnVhbCBwOTQuCiAJCSAqLwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIFNHX1NMMSwgUE1NUCB8IE1HQUlOMCk7Ci0JCWFrNDY0Ml93cml0ZShjb2RlYywgVElNRVIsIFpUTSgweDMpIHwgV1RNKDB4MykpOwotCQlhazQ2NDJfd3JpdGUoY29kZWMsIEFMQ19DVEwxLCBBTEMgfCBMTVRIMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNHX1NMMSwgUE1NUCB8IE1HQUlOMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRJTUVSLCBaVE0oMHgzKSB8IFdUTSgweDMpKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDX0NUTDEsIEFMQyB8IExNVEgwKTsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUFdfTUdNVDEsIFBNVkNNIHwgUE1BREwsCiAJCQkJCQkgICAgIFBNVkNNIHwgUE1BREwpOwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBQV19NR01UMywgUE1BRFIsIFBNQURSKTsKQEAgLTQ2Miw3ICs0MDQsNyBAQAogCiBzdGF0aWMgaW50IGFrNDY0Ml9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWFrNDY0Ml9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC00NzAsMTEgKzQxMiwxNSBAQAogc3RhdGljIGludCBhazQ2NDJfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhazQ2NDJfcHJpdiAqYWs0NjQyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKIAogCWRldl9pbmZvKGNvZGVjLT5kZXYsICJBSzQ2NDIgQXVkaW8gQ29kZWMgJXMiLCBBSzQ2NDJfVkVSU0lPTik7CiAKLQljb2RlYy0+aHdfd3JpdGUJCT0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCWNvZGVjLT5jb250cm9sX2RhdGEJPSBhazQ2NDItPmNvbnRyb2xfZGF0YTsKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgYWs0NjQyLT5jb250cm9sX3R5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYWs0NjQyX3NuZF9jb250cm9scywKIAkJCSAgICAgQVJSQVlfU0laRShhazQ2NDJfc25kX2NvbnRyb2xzKSk7CkBAIC00ODUsOCArNDMxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hazQ2NDIgPSB7CiAJLnByb2JlCQkJPSBhazQ2NDJfcHJvYmUsCiAJLnJlc3VtZQkJCT0gYWs0NjQyX3Jlc3VtZSwKLQkucmVhZAkJCT0gYWs0NjQyX3JlYWRfcmVnX2NhY2hlLAotCS53cml0ZQkJCT0gYWs0NjQyX3dyaXRlLAogCS5yZWdfY2FjaGVfc2l6ZQkJPSBBUlJBWV9TSVpFKGFrNDY0Ml9yZWcpLAogCS5yZWdfd29yZF9zaXplCQk9IHNpemVvZih1OCksCiAJLnJlZ19jYWNoZV9kZWZhdWx0CT0gYWs0NjQyX3JlZywKQEAgLTUwNCw3ICs0NDgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFrNDY0Mik7Ci0JYWs0NjQyLT5jb250cm9sX2RhdGEgPSBpMmM7CiAJYWs0NjQyLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IDg4YjI5ZjguLmRlOWZmNjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtMjYsNyArMjYsNiBAQAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWs0NjcxX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qIGFrNDY3MSByZWdpc3RlciBjYWNoZSAmIGRlZmF1bHQgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KQEAgLTE2OSwxOCArMTY4LDE1IEBACiAJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7Ci0JdTggcmVnOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCk7Ci0JCXJlZyB8PSBBSzQ2NzFfTVVURU47Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCwgcmVnKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5ULAorCQkJCSAgICBBSzQ2NzFfTVVURU4sIEFLNDY3MV9NVVRFTik7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5UKTsKLQkJcmVnICY9IH5BSzQ2NzFfTVVURU47Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9MT1VUMl9QT1dFUl9NQU5BR0VSTUVOVCwgcmVnKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUs0NjcxX0xPVVQyX1BPV0VSX01BTkFHRVJNRU5ULAorCQkJCSAgICBBSzQ2NzFfTVVURU4sIDApOwogCQlicmVhazsKIAl9CiAKQEAgLTU3NiwxNSArNTcyLDEyIEBACiBzdGF0aWMgaW50IGFrNDY3MV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXU4IHJlZzsKLQogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVCwKLQkJCQlyZWcgfCBBSzQ2NzFfUE1WQ00pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSzQ2NzFfQURfREFfUE9XRVJfTUFOQUdFTUVOVCwKKwkJCQkgICAgQUs0NjcxX1BNVkNNLCBBSzQ2NzFfUE1WQ00pOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFLNDY3MV9BRF9EQV9QT1dFUl9NQU5BR0VNRU5ULCAweDAwKTsKQEAgLTYyOSw4ICs2MjIsNiBAQAogCXN0cnVjdCBhazQ2NzFfcHJpdiAqYWs0NjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKLQogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCA4LCBhazQ2NzEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtNjc1LDcgKzY2Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWs0NjcxKTsKLQlhazQ2NzEtPmNvbnRyb2xfZGF0YSA9IGNsaWVudDsKIAlhazQ2NzEtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCmluZGV4IGVlY2ZmYjUuLjk4NGIxNGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCkBAIC00MCw4ICs0MCw2IEBACiAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KIHN0cnVjdCBhbGM1NjIzX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJdTggaWQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAl1MTYgcmVnX2NhY2hlW0FMQzU2MjNfVkVORE9SX0lEMisyXTsKQEAgLTU1LDggKzUzLDEwIEBACiAJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAKIAkvKiBub3QgcmVhbGx5IGVmZmljaWVudCAuLi4gKi8KKwljb2RlYy0+Y2FjaGVfYnlwYXNzID0gMTsKIAlmb3IgKGkgPSAwIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQotCQljYWNoZVtpXSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCBpKTsKKwkJY2FjaGVbaV0gPSBzbmRfc29jX3JlYWQoY29kZWMsIGkpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTEwNTAsOSArMTA1MCw3IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYWxjNTYyMyk7Ci0JYWxjNTYyMy0+Y29udHJvbF9kYXRhID0gY2xpZW50OwogCWFsYzU2MjMtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwotCW11dGV4X2luaXQoJmFsYzU2MjMtPm11dGV4KTsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldiwKIAkJJnNvY19jb2RlY19kZXZpY2VfYWxjNTYyMywgJmFsYzU2MjNfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDZjYzg2NzguLmYxZjIzN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtMTI4LDcgKzEyOCw2IEBACiAvKiBQcml2YXRlIGRhdGEgZm9yIHRoZSBDUzQyNzAgKi8KIHN0cnVjdCBjczQyNzBfcHJpdmF0ZSB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCXVuc2lnbmVkIGludCBtY2xrOyAvKiBJbnB1dCBmcmVxdWVuY3kgb2YgdGhlIE1DTEsgcGluICovCiAJdW5zaWduZWQgaW50IG1vZGU7IC8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJdW5zaWduZWQgaW50IHNsYXZlX21vZGU7CkBAIC0yNjIsNyArMjYxLDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldCA9IDA7CiAKIAkvKiBzZXQgREFJIGZvcm1hdCAqLwogCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKQEAgLTI3Miw3ICsyNzAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJpbnZhbGlkIGRhaSBmb3JtYXRcbiIpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwpAQCAtMjg1LDEwICsyODMsMTEgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogYWxsIG90aGVyIG1vZGVzIGFyZSB1bnN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKi8KLQkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBtYXN0ZXIvc2xhdmUgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNDkwLDggKzQ4OSw2IEBACiAJc3RydWN0IGNzNDI3MF9wcml2YXRlICpjczQyNzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgaSwgcmV0OwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNzNDI3MC0+Y29udHJvbF9kYXRhOwotCiAJLyogVGVsbCBBU29DIHdoYXQga2luZCBvZiBJL08gdG8gdXNlIHRvIHJlYWQgdGhlIHJlZ2lzdGVycy4gIEFTb0Mgd2lsbAogCSAqIHRoZW4gZG8gdGhlIEkyQyB0cmFuc2FjdGlvbnMgaXRzZWxmLgogCSAqLwpAQCAtNjA0LDcgKzYwMSw3IEBACiBzdGF0aWMgaW50IGNzNDI3MF9zb2NfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0MjcwX3ByaXZhdGUgKmNzNDI3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CiAJaW50IHJlZzsKIAogCXJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGNzNDI3MC0+c3VwcGxpZXMpLApAQCAtNjkwLDcgKzY4Nyw2IEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyY19jbGllbnQsIGNzNDI3MCk7Ci0JY3M0MjcwLT5jb250cm9sX2RhdGEgPSBpMmNfY2xpZW50OwogCWNzNDI3MC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmNfY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYwppbmRleCAwODNhYWI5Li4yM2QxYmQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKQEAgLTE1Niw3ICsxNTYsNiBAQAogc3RydWN0IGNzNDI3MV9wcml2YXRlIHsKIAkvKiBTTkRfU09DX0kyQyBvciBTTkRfU09DX1NQSSAqLwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUJYnVzX3R5cGU7Ci0Jdm9pZAkJCQkqY29udHJvbF9kYXRhOwogCXVuc2lnbmVkIGludAkJCW1jbGs7CiAJYm9vbAkJCQltYXN0ZXI7CiAJYm9vbAkJCQlkZWVtcGg7CkBAIC00NjYsOCArNDY1LDYgQEAKIAlpbnQgcmV0OwogCWludCBncGlvX25yZXNldCA9IC1FSU5WQUw7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0MjcxLT5jb250cm9sX2RhdGE7Ci0KIAlpZiAoY3M0MjcxcGxhdCAmJiBncGlvX2lzX3ZhbGlkKGNzNDI3MXBsYXQtPmdwaW9fbnJlc2V0KSkKIAkJZ3Bpb19ucmVzZXQgPSBjczQyNzFwbGF0LT5ncGlvX25yZXNldDsKIApAQCAtNTU1LDcgKzU1Miw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgY3M0MjcxKTsKLQljczQyNzEtPmNvbnRyb2xfZGF0YSA9IHNwaTsKIAljczQyNzEtPmJ1c190eXBlID0gU05EX1NPQ19TUEk7CiAKIAlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYsICZzb2NfY29kZWNfZGV2X2NzNDI3MSwKQEAgLTU5NSw3ICs1OTEsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNzNDI3MSk7Ci0JY3M0MjcxLT5jb250cm9sX2RhdGEgPSBjbGllbnQ7CiAJY3M0MjcxLT5idXNfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LCAmc29jX2NvZGVjX2Rldl9jczQyNzEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCmluZGV4IDhmYjcwNzAuLjhjM2M4MjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCkBAIC00Miw3ICs0Miw2IEBACiAKIHN0cnVjdCBjczQybDUxX3ByaXZhdGUgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAl1bnNpZ25lZCBpbnQgbWNsazsKIAl1bnNpZ25lZCBpbnQgYXVkaW9fbW9kZTsJLyogVGhlIG1vZGUgKEkyUyBvciBsZWZ0LWp1c3RpZmllZCkgKi8KIAllbnVtIG1hc3Rlcl9zbGF2ZV9tb2RlIGZ1bmM7CkBAIC01Nyw3ICs1Niw3IEBACiBzdGF0aWMgaW50IGNzNDJsNTFfZmlsbF9jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZSArIDE7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzMzIgbGVuZ3RoOwogCiAJbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKQEAgLTI4OSw3ICsyODgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CiAJc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChmb3JtYXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgpAQCAtMjk5LDcgKzI5Nyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWMtPmRldiwgImludmFsaWQgREFJIGZvcm1hdFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN3aXRjaCAoZm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKQEAgLTMxMCwxMSArMzA4LDExIEBACiAJCWNzNDJsNTEtPmZ1bmMgPSBNT0RFX1NMQVZFX0FVVE87CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIG1hc3Rlci9zbGF2ZSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGNzNDJsNTFfcmF0aW9zIHsKQEAgLTUyMCw4ICs1MTgsNiBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0LCByZWc7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0Mmw1MS0+Y29udHJvbF9kYXRhOwotCiAJcmV0ID0gY3M0Mmw1MV9maWxsX2NhY2hlKGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gZmlsbCByZWdpc3RlciBjYWNoZVxuIik7CkBAIC01OTMsNyArNTg5LDYgQEAKIAl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgY3M0Mmw1MSk7Ci0JY3M0Mmw1MS0+Y29udHJvbF9kYXRhID0gaTJjX2NsaWVudDsKIAljczQybDUxLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmNfY2xpZW50LT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCmluZGV4IGQ2OGVhNTMuLmJjNzA2N2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKaW5kZXggOTJmZDlkNy4uYjU0NWI3ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTI2LDIzICsyNyw0MSBAQAogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAvKiBEQTcyMTAgcmVnaXN0ZXIgc3BhY2UgKi8KKyNkZWZpbmUgREE3MjEwX0NPTlRST0wJCQkweDAxCiAjZGVmaW5lIERBNzIxMF9TVEFUVVMJCQkweDAyCiAjZGVmaW5lIERBNzIxMF9TVEFSVFVQMQkJCTB4MDMKKyNkZWZpbmUgREE3MjEwX1NUQVJUVVAyCQkJMHgwNAorI2RlZmluZSBEQTcyMTBfU1RBUlRVUDMJCQkweDA1CiAjZGVmaW5lIERBNzIxMF9NSUNfTAkJCTB4MDcKICNkZWZpbmUgREE3MjEwX01JQ19SCQkJMHgwOAorI2RlZmluZSBEQTcyMTBfQVVYMV9MCQkJMHgwOQorI2RlZmluZSBEQTcyMTBfQVVYMV9SCQkJMHgwQQorI2RlZmluZSBEQTcyMTBfQVVYMgkJCTB4MEIKKyNkZWZpbmUgREE3MjEwX0lOX0dBSU4JCQkweDBDCiAjZGVmaW5lIERBNzIxMF9JTk1JWF9MCQkJMHgwRAogI2RlZmluZSBEQTcyMTBfSU5NSVhfUgkJCTB4MEUKICNkZWZpbmUgREE3MjEwX0FEQ19IUEYJCQkweDBGCiAjZGVmaW5lIERBNzIxMF9BREMJCQkweDEwCisjZGVmaW5lIERBNzIxMF9BRENfRVExXzIJCTBYMTEKKyNkZWZpbmUgREE3MjEwX0FEQ19FUTNfNAkJMHgxMgorI2RlZmluZSBEQTcyMTBfQURDX0VRNQkJCTB4MTMKICNkZWZpbmUgREE3MjEwX0RBQ19IUEYJCQkweDE0CiAjZGVmaW5lIERBNzIxMF9EQUNfTAkJCTB4MTUKICNkZWZpbmUgREE3MjEwX0RBQ19SCQkJMHgxNgogI2RlZmluZSBEQTcyMTBfREFDX1NFTAkJCTB4MTcKKyNkZWZpbmUgREE3MjEwX1NPRlRNVVRFCQkJMHgxOAorI2RlZmluZSBEQTcyMTBfREFDX0VRMV8yCQkweDE5CisjZGVmaW5lIERBNzIxMF9EQUNfRVEzXzQJCTB4MUEKKyNkZWZpbmUgREE3MjEwX0RBQ19FUTUJCQkweDFCCiAjZGVmaW5lIERBNzIxMF9PVVRNSVhfTAkJCTB4MUMKICNkZWZpbmUgREE3MjEwX09VVE1JWF9SCQkJMHgxRAorI2RlZmluZSBEQTcyMTBfT1VUMV9MCQkJMHgxRQorI2RlZmluZSBEQTcyMTBfT1VUMV9SCQkJMHgxRgorI2RlZmluZSBEQTcyMTBfT1VUMgkJCTB4MjAKICNkZWZpbmUgREE3MjEwX0hQX0xfVk9MCQkJMHgyMQogI2RlZmluZSBEQTcyMTBfSFBfUl9WT0wJCQkweDIyCiAjZGVmaW5lIERBNzIxMF9IUF9DRkcJCQkweDIzCisjZGVmaW5lIERBNzIxMF9aRVJPX0NST1NTCQkweDI0CiAjZGVmaW5lIERBNzIxMF9EQUlfU1JDX1NFTAkJMHgyNQogI2RlZmluZSBEQTcyMTBfREFJX0NGRzEJCQkweDI2CiAjZGVmaW5lIERBNzIxMF9EQUlfQ0ZHMwkJCTB4MjgKQEAgLTUwLDYgKzY5LDEyIEBACiAjZGVmaW5lIERBNzIxMF9QTExfRElWMgkJCTB4MkEKICNkZWZpbmUgREE3MjEwX1BMTF9ESVYzCQkJMHgyQgogI2RlZmluZSBEQTcyMTBfUExMCQkJMHgyQworI2RlZmluZSBEQTcyMTBfQUxDX01BWAkJCTB4ODMKKyNkZWZpbmUgREE3MjEwX0FMQ19NSU4JCQkweDg0CisjZGVmaW5lIERBNzIxMF9BTENfTk9JUwkJCTB4ODUKKyNkZWZpbmUgREE3MjEwX0FMQ19BVFQJCQkweDg2CisjZGVmaW5lIERBNzIxMF9BTENfUkVMCQkJMHg4NworI2RlZmluZSBEQTcyMTBfQUxDX0RFTAkJCTB4ODgKICNkZWZpbmUgREE3MjEwX0FfSElEX1VOTE9DSwkJMHg4QQogI2RlZmluZSBEQTcyMTBfQV9URVNUX1VOTE9DSwkJMHg4QgogI2RlZmluZSBEQTcyMTBfQV9QTEwxCQkJMHg5MApAQCAtNzIsNiArOTcsNyBAQAogI2RlZmluZSBEQTcyMTBfSU5fUl9FTgkJCSgxIDw8IDcpCiAKIC8qIEFEQyBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9BRENfQUxDX0VOCQkoMSA8PCAwKQogI2RlZmluZSBEQTcyMTBfQURDX0xfRU4JCQkoMSA8PCAzKQogI2RlZmluZSBEQTcyMTBfQURDX1JfRU4JCQkoMSA8PCA3KQogCkBAIC0xMDUsMTIgKzEzMSwxNyBAQAogCiAvKiBEQUlfQ0ZHMSBiaXQgZmllbGRzICovCiAjZGVmaW5lIERBNzIxMF9EQUlfV09SRF9TMTZfTEUJCSgwIDw8IDApCisjZGVmaW5lIERBNzIxMF9EQUlfV09SRF9TMjBfM0xFCQkoMSA8PCAwKQogI2RlZmluZSBEQTcyMTBfREFJX1dPUkRfUzI0X0xFCQkoMiA8PCAwKQorI2RlZmluZSBEQTcyMTBfREFJX1dPUkRfUzMyX0xFCQkoMyA8PCAwKQogI2RlZmluZSBEQTcyMTBfREFJX0ZMRU5fNjRCSVQJCSgxIDw8IDIpCisjZGVmaW5lIERBNzIxMF9EQUlfTU9ERV9TTEFWRQkJKDAgPDwgNykKICNkZWZpbmUgREE3MjEwX0RBSV9NT0RFX01BU1RFUgkJKDEgPDwgNykKIAogLyogREFJX0NGRzMgYml0IGZpZWxkcyAqLwogI2RlZmluZSBEQTcyMTBfREFJX0ZPUk1BVF9JMlNNT0RFCSgwIDw8IDApCisjZGVmaW5lIERBNzIxMF9EQUlfRk9STUFUX0xFRlRfSgkoMSA8PCAwKQorI2RlZmluZSBEQTcyMTBfREFJX0ZPUk1BVF9SSUdIVF9KCSgyIDw8IDApCiAjZGVmaW5lIERBNzIxMF9EQUlfT0UJCQkoMSA8PCAzKQogI2RlZmluZSBEQTcyMTBfREFJX0VOCQkJKDEgPDwgNykKIApAQCAtMTMzLDYgKzE2NCw0MyBAQAogI2RlZmluZSBEQTcyMTBfUExMX0ZTXzk2MDAwCQkoMHhGIDw8IDApCiAjZGVmaW5lIERBNzIxMF9QTExfRU4JCQkoMHgxIDw8IDcpCiAKKy8qIFNPRlRNVVRFIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX1JBTVBfRU4JCQkoMSA8PCA2KQorCisvKiBDT05UUk9MIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX05PSVNFX1NVUF9FTgkJKDEgPDwgMykKKworLyogSU5fR0FJTiBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9JTlBHQV9MX1ZPTAkJKDB4MEYgPDwgMCkKKyNkZWZpbmUgREE3MjEwX0lOUEdBX1JfVk9MCQkoMHhGMCA8PCAwKQorCisvKiBaRVJPX0NST1NTIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREE3MjEwX0FVWDFfTF9aQwkJKDEgPDwgMCkKKyNkZWZpbmUgREE3MjEwX0FVWDFfUl9aQwkJKDEgPDwgMSkKKyNkZWZpbmUgREE3MjEwX0hQX0xfWkMJCQkoMSA8PCA2KQorI2RlZmluZSBEQTcyMTBfSFBfUl9aQwkJCSgxIDw8IDcpCisKKy8qIEFVWDFfTCBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9BVVgxX0xfVk9MCQkoMHgzRiA8PCAwKQorCisvKiBBVVgxX1IgYml0IGZpZWxkcyAqLworI2RlZmluZSBEQTcyMTBfQVVYMV9SX1ZPTAkJKDB4M0YgPDwgMCkKKworLyogTWluaW11bSBJTlBHQSBhbmQgQVVYMSB2b2x1bWUgdG8gZW5hYmxlIG5vaXNlIHN1cHByZXNzaW9uICovCisjZGVmaW5lIERBNzIxMF9JTlBHQV9NSU5fVk9MX05TCQkweDBBICAvKiAxMC41ZEIgKi8KKyNkZWZpbmUgREE3MjEwX0FVWDFfTUlOX1ZPTF9OUwkJMHgzNSAgLyogNmRCICovCisKKy8qIE9VVDFfTCBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9PVVQxX0xfRU4JCSgxIDw8IDcpCisKKy8qIE9VVDFfUiBiaXQgZmllbGRzICovCisjZGVmaW5lIERBNzIxMF9PVVQxX1JfRU4JCSgxIDw8IDcpCisKKy8qIE9VVDIgYml0IGZpZWxkcyAqLworI2RlZmluZSBEQTcyMTBfT1VUMl9PVVRNSVhfUgkJKDEgPDwgNSkKKyNkZWZpbmUgREE3MjEwX09VVDJfT1VUTUlYX0wJCSgxIDw8IDYpCisjZGVmaW5lIERBNzIxMF9PVVQyX0VOCQkJKDEgPDwgNykKKwogI2RlZmluZSBEQTcyMTBfVkVSU0lPTiAiMC4wLjEiCiAKIC8qCkBAIC0xNDQsMjQgKzIxMiwzNTEgQEAKICAqIG11dGUJCTogMHgxMAogICogcmVzZXJ2ZWQJOiAweDAwIC0gMHgwRgogICoKLSAqICoqIEZJWE1FICoqCi0gKgogICogUmVzZXJ2ZWQgYXJlYSBhcmUgY29uc2lkZXJlZCBhcyAibXV0ZSIuCi0gKiAtPiBtaW4gPSAtNzkuNSBkQgogICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHBfb3V0X3RsdiwgLTc5NTAsIDE1MCwgMSk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhwX291dF90bHZbXSA9IHsKKwlUTFZfREJfUkFOR0VfSEVBRCgyKSwKKwkweDAsIDB4MTAsIFRMVl9EQl9TQ0FMRV9JVEVNKFRMVl9EQl9HQUlOX01VVEUsIDAsIDEpLAorCS8qIC01NCBkQiB0byArMTUgZEIgKi8KKwkweDExLCAweDNmLCBUTFZfREJfU0NBTEVfSVRFTSgtNTQwMCwgMTUwLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGluZW91dF92b2xfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoMiksCisJMHgwLCAweDEwLCBUTFZfREJfU0NBTEVfSVRFTShUTFZfREJfR0FJTl9NVVRFLCAwLCAxKSwKKwkvKiAtNTRkQiB0byAxNWRCICovCisJMHgxMSwgMHgzZiwgVExWX0RCX1NDQUxFX0lURU0oLTU0MDAsIDE1MCwgMCkKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbW9ub192b2xfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoMiksCisJMHgwLCAweDIsIFRMVl9EQl9TQ0FMRV9JVEVNKC0xODAwLCAwLCAxKSwKKwkvKiAtMThkQiB0byA2ZEIgKi8KKwkweDMsIDB4NywgVExWX0RCX1NDQUxFX0lURU0oLTE4MDAsIDYwMCwgMCkKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV9nYWluX3RsdiwgLTEwNTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX2VxX21hc3Rlcl9nYWluX3RsdiwgLTE4MDAsIDYwMCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGFjX2dhaW5fdGx2LCAtNzcyNSwgNzUsIDApOworCisvKiBBREMgYW5kIERBQyBoaWdoIHBhc3MgZmlsdGVyIGYwIHZhbHVlICovCitzdGF0aWMgY29uc3QgY2hhciBjb25zdCAqZGE3MjEwX2hwZl9jdXRvZmZfdHh0W10gPSB7CisJIkZzLzgxOTIqcGkiLCAiRnMvNDA5NipwaSIsICJGcy8yMDQ4KnBpIiwgIkZzLzEwMjQqcGkiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9kYWNfaHBmX2N1dG9mZiA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9EQUNfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9BRENfSFBGLCAwLCA0LCBkYTcyMTBfaHBmX2N1dG9mZl90eHQpOworCisvKiBBREMgYW5kIERBQyB2b2ljZSAoOGtIeikgaGlnaCBwYXNzIGN1dG9mZiB2YWx1ZSAqLworc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKmRhNzIxMF92Zl9jdXRvZmZfdHh0W10gPSB7CisJIjIuNUh6IiwgIjI1SHoiLCAiNTBIeiIsICIxMDBIeiIsICIxNTBIeiIsICIyMDBIeiIsICIzMDBIeiIsICI0MDBIeiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGE3MjEwX2RhY192Zl9jdXRvZmYgPQorCVNPQ19FTlVNX1NJTkdMRShEQTcyMTBfREFDX0hQRiwgNCwgOCwgZGE3MjEwX3ZmX2N1dG9mZl90eHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9hZGNfdmZfY3V0b2ZmID0KKwlTT0NfRU5VTV9TSU5HTEUoREE3MjEwX0FEQ19IUEYsIDQsIDgsIGRhNzIxMF92Zl9jdXRvZmZfdHh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRhNzIxMF9ocF9tb2RlX3R4dFtdID0geworCSJDbGFzcyBIIiwgIkNsYXNzIEciCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhNzIxMF9ocF9tb2RlX3NlbCA9CisJU09DX0VOVU1fU0lOR0xFKERBNzIxMF9IUF9DRkcsIDAsIDIsIGRhNzIxMF9ocF9tb2RlX3R4dCk7CisKKy8qIEFMQyBjYW4gYmUgZW5hYmxlZCBvbmx5IGlmIG5vaXNlIHN1cHByZXNzaW9uIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW50IGRhNzIxMF9wdXRfYWxjX3N3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJLyogQ2hlY2sgaWYgbm9pc2Ugc3VwcHJlc3Npb24gaXMgZW5hYmxlZCAqLworCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQ09OVFJPTCkgJiBEQTcyMTBfTk9JU0VfU1VQX0VOKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkJIkRpc2FibGUgbm9pc2Ugc3VwcHJlc3Npb24gdG8gZW5hYmxlIEFMQ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkvKiBJZiBhbGwgY29uZGl0aW9ucyBhcmUgbWV0IG9yIHdlIGFyZSBhY3R1YWxseSBkaXNhYmxpbmcgQUxDICovCisJcmV0dXJuIHNuZF9zb2NfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7Cit9CisKKy8qIE5vaXNlIHN1cHByZXNzaW9uIGNhbiBiZSBlbmFibGVkIG9ubHkgaWYgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldAorICogIEFMQyBkaXNhYmxlZAorICogIFpDIGVuYWJsZWQgZm9yIEhQIGFuZCBBVVgxIFBHQQorICogIElOUEdBX0xfVk9MIGFuZCBJTlBHQV9SX1ZPTCA+PSAxMC41IGRCCisgKiAgQVVYMV9MX1ZPTCBhbmQgQVVYMV9SX1ZPTCA+PSA2IGRCCisgKi8KK3N0YXRpYyBpbnQgZGE3MjEwX3B1dF9ub2lzZV9zdXBfc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IHZhbDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgeworCQkvKiBDaGVjayBpZiBBTEMgaXMgZW5hYmxlZCAqLworCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQURDKSAmIERBNzIxMF9BRENfQUxDX0VOKQorCQkJZ290byBlcnI7CisKKwkJLyogQ2hlY2sgWkMgZm9yIEhQIGFuZCBBVVgxIFBHQSAqLworCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX1pFUk9fQ1JPU1MpICYKKwkJCShEQTcyMTBfQVVYMV9MX1pDIHwgREE3MjEwX0FVWDFfUl9aQyB8IERBNzIxMF9IUF9MX1pDIHwKKwkJCURBNzIxMF9IUF9SX1pDKSkgIT0gKERBNzIxMF9BVVgxX0xfWkMgfAorCQkJREE3MjEwX0FVWDFfUl9aQyB8IERBNzIxMF9IUF9MX1pDIHwgREE3MjEwX0hQX1JfWkMpKQorCQkJZ290byBlcnI7CisKKwkJLyogQ2hlY2sgSU5QR0FfTF9WT0wgYW5kIElOUEdBX1JfVk9MICovCisJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX0lOX0dBSU4pOworCQlpZiAoKCh2YWwgJiBEQTcyMTBfSU5QR0FfTF9WT0wpIDwgREE3MjEwX0lOUEdBX01JTl9WT0xfTlMpIHx8CisJCQkoKCh2YWwgJiBEQTcyMTBfSU5QR0FfUl9WT0wpID4+IDQpIDwKKwkJCURBNzIxMF9JTlBHQV9NSU5fVk9MX05TKSkKKwkJCWdvdG8gZXJyOworCisJCS8qIENoZWNrIEFVWDFfTF9WT0wgYW5kIEFVWDFfUl9WT0wgKi8KKwkJaWYgKCgoc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfQVVYMV9MKSAmIERBNzIxMF9BVVgxX0xfVk9MKSA8CisJCSAgICBEQTcyMTBfQVVYMV9NSU5fVk9MX05TKSB8fAorCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9BVVgxX1IpICYgREE3MjEwX0FVWDFfUl9WT0wpIDwKKwkJICAgIERBNzIxMF9BVVgxX01JTl9WT0xfTlMpKQorCQkJZ290byBlcnI7CisJfQorCS8qIElmIGFsbCBjb25kaXRpb25zIGFyZSBtZXQgb3Igd2UgYXJlIGFjdHVhbGx5IGRpc2FibGluZyBOb2lzZSBzdXAgKi8KKwlyZXR1cm4gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKKworZXJyOgorCXJldHVybiAtRUlOVkFMOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEwX3NuZF9jb250cm9sc1tdID0gewogCiAJU09DX0RPVUJMRV9SX1RMVigiSGVhZFBob25lIFBsYXliYWNrIFZvbHVtZSIsCiAJCQkgREE3MjEwX0hQX0xfVk9MLCBEQTcyMTBfSFBfUl9WT0wsCiAJCQkgMCwgMHgzRiwgMCwgaHBfb3V0X3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLAorCQkJIERBNzIxMF9EQUNfTCwgREE3MjEwX0RBQ19SLAorCQkJIDAsIDB4NzcsIDEsIGRhY19nYWluX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiTGluZW91dCBQbGF5YmFjayBWb2x1bWUiLAorCQkJIERBNzIxMF9PVVQxX0wsIERBNzIxMF9PVVQxX1IsCisJCQkgMCwgMHgzZiwgMCwgbGluZW91dF92b2xfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCBEQTcyMTBfT1VUMiwgMCwgMHg3LCAwLAorCQkgICAgICAgbW9ub192b2xfdGx2KSwKKworCS8qIERBQyBFcXVhbGl6ZXIgIGNvbnRyb2xzICovCisJU09DX1NJTkdMRSgiREFDIEVRIFN3aXRjaCIsIERBNzIxMF9EQUNfRVE1LCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiREFDIEVRMSBWb2x1bWUiLCBEQTcyMTBfREFDX0VRMV8yLCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkRBQyBFUTIgVm9sdW1lIiwgREE3MjEwX0RBQ19FUTFfMiwgNCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJEQUMgRVEzIFZvbHVtZSIsIERBNzIxMF9EQUNfRVEzXzQsIDAsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiREFDIEVRNCBWb2x1bWUiLCBEQTcyMTBfREFDX0VRM180LCA0LCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkRBQyBFUTUgVm9sdW1lIiwgREE3MjEwX0RBQ19FUTUsIDAsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKworCS8qIEFEQyBFcXVhbGl6ZXIgIGNvbnRyb2xzICovCisJU09DX1NJTkdMRSgiQURDIEVRIFN3aXRjaCIsIERBNzIxMF9BRENfRVE1LCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiQURDIEVRIE1hc3RlciBWb2x1bWUiLCBEQTcyMTBfQURDX0VRNSwgNCwgMHgzLAorCQkgICAgICAgMSwgYWRjX2VxX21hc3Rlcl9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkFEQyBFUTEgVm9sdW1lIiwgREE3MjEwX0FEQ19FUTFfMiwgMCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJBREMgRVEyIFZvbHVtZSIsIERBNzIxMF9BRENfRVExXzIsIDQsIDB4ZiwgMSwKKwkJICAgICAgIGVxX2dhaW5fdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiQURDIEVRMyBWb2x1bWUiLCBEQTcyMTBfQURDX0VRM180LCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkFEQyBFUTQgVm9sdW1lIiwgREE3MjEwX0FEQ19FUTNfNCwgNCwgMHhmLCAxLAorCQkgICAgICAgZXFfZ2Fpbl90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJBREMgRVE1IFZvbHVtZSIsIERBNzIxMF9BRENfRVE1LCAwLCAweGYsIDEsCisJCSAgICAgICBlcV9nYWluX3RsdiksCisKKwlTT0NfU0lOR0xFKCJEQUMgSFBGIFN3aXRjaCIsIERBNzIxMF9EQUNfSFBGLCAzLCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIEhQRiBDdXRvZmYiLCBkYTcyMTBfZGFjX2hwZl9jdXRvZmYpLAorCVNPQ19TSU5HTEUoIkRBQyBWb2ljZSBNb2RlIFN3aXRjaCIsIERBNzIxMF9EQUNfSFBGLCA3LCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDIFZvaWNlIEN1dG9mZiIsIGRhNzIxMF9kYWNfdmZfY3V0b2ZmKSwKKworCVNPQ19TSU5HTEUoIkFEQyBIUEYgU3dpdGNoIiwgREE3MjEwX0FEQ19IUEYsIDMsIDEsIDApLAorCVNPQ19FTlVNKCJBREMgSFBGIEN1dG9mZiIsIGRhNzIxMF9hZGNfaHBmX2N1dG9mZiksCisJU09DX1NJTkdMRSgiQURDIFZvaWNlIE1vZGUgU3dpdGNoIiwgREE3MjEwX0FEQ19IUEYsIDcsIDEsIDApLAorCVNPQ19FTlVNKCJBREMgVm9pY2UgQ3V0b2ZmIiwgZGE3MjEwX2FkY192Zl9jdXRvZmYpLAorCisJLyogTXV0ZSBjb250cm9scyAqLworCVNPQ19ET1VCTEVfUigiTWljIENhcHR1cmUgU3dpdGNoIiwgREE3MjEwX01JQ19MLCBEQTcyMTBfTUlDX1IsIDMsIDEsIDApLAorCVNPQ19TSU5HTEUoIkF1eDIgQ2FwdHVyZSBTd2l0Y2giLCBEQTcyMTBfQVVYMiwgMiwgMSwgMCksCisJU09DX0RPVUJMRSgiQURDIENhcHR1cmUgU3dpdGNoIiwgREE3MjEwX0FEQywgMiwgNiwgMSwgMCksCisJU09DX1NJTkdMRSgiRGlnaXRhbCBTb2Z0IE11dGUgU3dpdGNoIiwgREE3MjEwX1NPRlRNVVRFLCA3LCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJEaWdpdGFsIFNvZnQgTXV0ZSBSYXRlIiwgREE3MjEwX1NPRlRNVVRFLCAwLCAweDcsIDApLAorCisJLyogWmVybyBjcm9zcyBjb250cm9scyAqLworCVNPQ19ET1VCTEUoIkF1eDEgWkMgU3dpdGNoIiwgREE3MjEwX1pFUk9fQ1JPU1MsIDAsIDEsIDEsIDApLAorCVNPQ19ET1VCTEUoIkluIFBHQSBaQyBTd2l0Y2giLCBEQTcyMTBfWkVST19DUk9TUywgMiwgMywgMSwgMCksCisJU09DX0RPVUJMRSgiTGluZW91dCBaQyBTd2l0Y2giLCBEQTcyMTBfWkVST19DUk9TUywgNCwgNSwgMSwgMCksCisJU09DX0RPVUJMRSgiSGVhZHBob25lIFpDIFN3aXRjaCIsIERBNzIxMF9aRVJPX0NST1NTLCA2LCA3LCAxLCAwKSwKKworCVNPQ19FTlVNKCJIZWFkcGhvbmUgQ2xhc3MiLCBkYTcyMTBfaHBfbW9kZV9zZWwpLAorCisJLyogQUxDIGNvbnRyb2xzICovCisJU09DX1NJTkdMRV9FWFQoIkFMQyBFbmFibGUgU3dpdGNoIiwgREE3MjEwX0FEQywgMCwgMSwgMCwKKwkJICAgICAgIHNuZF9zb2NfZ2V0X3ZvbHN3LCBkYTcyMTBfcHV0X2FsY19zdyksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTWF4IFZvbHVtZSIsIERBNzIxMF9BTENfTUFYLCAwLCAweDNGLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBNaW4gVm9sdW1lIiwgREE3MjEwX0FMQ19NSU4sIDAsIDB4M0YsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE5vaXNlIFZvbHVtZSIsIERBNzIxMF9BTENfTk9JUywgMCwgMHgzRiwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgQXR0YWNrIFJhdGUiLCBEQTcyMTBfQUxDX0FUVCwgMCwgMHhGRiwgMCksCisJU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgUmVsZWFzZSBSYXRlIiwgREE3MjEwX0FMQ19SRUwsIDAsIDB4RkYsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIFJlbGVhc2UgRGVsYXkiLCBEQTcyMTBfQUxDX0RFTCwgMCwgMHhGRiwgMCksCisKKwlTT0NfU0lOR0xFX0VYVCgiTm9pc2UgU3VwcHJlc3Npb24gRW5hYmxlIFN3aXRjaCIsIERBNzIxMF9DT05UUk9MLCAzLCAxLAorCQkgICAgICAgMCwgc25kX3NvY19nZXRfdm9sc3csIGRhNzIxMF9wdXRfbm9pc2Vfc3VwX3N3KSwKK307CisKKy8qCisgKiBEQVBNIENvbnRyb2xzCisgKgorICogQ3VycmVudCBEQVBNIGltcGxlbWVudGF0aW9uIGNvdmVycyBhbG1vc3QgYWxsIGNvZGVjIGNvbXBvbmVudHMgZS5nLiBJT3MsCisgKiBtaXhlcnMsIFBHQXMsQURDIGFuZCBEQUMuCisgKi8KKy8qIEluIE1peGVyIExlZnQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYTcyMTBfZGFwbV9pbm1peGxfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9MLCAwLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBSaWdodCBTd2l0Y2giLCBEQTcyMTBfSU5NSVhfTCwgMSwgMSwgMCksCit9OworCisvKiBJbiBNaXhlciBSaWdodCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX2lubWl4cl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTWljIFJpZ2h0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9SLCAwLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBMZWZ0IFN3aXRjaCIsIERBNzIxMF9JTk1JWF9SLCAxLCAxLCAwKSwKK307CisKKy8qIE91dCBNaXhlciBMZWZ0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGE3MjEwX2RhcG1fb3V0bWl4bF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIExlZnQgU3dpdGNoIiwgREE3MjEwX09VVE1JWF9MLCA0LCAxLCAwKSwKK307CisKKy8qIE91dCBNaXhlciBSaWdodCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX291dG1peHJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSaWdodCBTd2l0Y2giLCBEQTcyMTBfT1VUTUlYX1IsIDQsIDEsIDApLAorfTsKKworLyogTW9ubyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhNzIxMF9kYXBtX21vbm9taXhfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk91dG1peCBSaWdodCBTd2l0Y2giLCBEQTcyMTBfT1VUMiwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJPdXRtaXggTGVmdCBTd2l0Y2giLCBEQTcyMTBfT1VUMiwgNiwgMSwgMCksCit9OworCisvKiBEQVBNIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBkYTcyMTBfZGFwbV93aWRnZXRzW10gPSB7CisJLyogSW5wdXQgU2lkZSAqLworCS8qIElucHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNSIiksCisKKwkvKiBJbnB1dCBQR0FzICovCisJU05EX1NPQ19EQVBNX1BHQSgiTWljIExlZnQiLCBEQTcyMTBfU1RBUlRVUDMsIDAsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1pYyBSaWdodCIsIERBNzIxMF9TVEFSVFVQMywgMSwgMSwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJJTlBHQSBMZWZ0IiwgREE3MjEwX0lOTUlYX0wsIDcsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklOUEdBIFJpZ2h0IiwgREE3MjEwX0lOTUlYX1IsIDcsIDAsIE5VTEwsIDApLAorCisJLyogSW5wdXQgTWl4ZXJzICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbiBNaXhlciBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1faW5taXhsX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKGRhNzIxMF9kYXBtX2lubWl4bF9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbiBNaXhlciBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmRhNzIxMF9kYXBtX2lubWl4cl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9pbm1peHJfY29udHJvbHMpKSwKKworCS8qIEFEQ3MgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJBREMgTGVmdCIsICJDYXB0dXJlIiwgREE3MjEwX1NUQVJUVVAzLCA1LCAxKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMgUmlnaHQiLCAiQ2FwdHVyZSIsIERBNzIxMF9TVEFSVFVQMywgNiwgMSksCisKKwkvKiBPdXRwdXQgU2lkZSAqLworCS8qIERBQ3MgKi8KKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgTGVmdCIsICJQbGF5YmFjayIsIERBNzIxMF9TVEFSVFVQMiwgNSwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDIFJpZ2h0IiwgIlBsYXliYWNrIiwgREE3MjEwX1NUQVJUVVAyLCA2LCAxKSwKKworCS8qIE91dHB1dCBNaXhlcnMgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dCBNaXhlciBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1fb3V0bWl4bF9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9vdXRtaXhsX2NvbnRyb2xzKSksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dCBNaXhlciBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJmRhNzIxMF9kYXBtX291dG1peHJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUoZGE3MjEwX2RhcG1fb3V0bWl4cl9jb250cm9scykpLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJNb25vIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGE3MjEwX2RhcG1fbW9ub21peF9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShkYTcyMTBfZGFwbV9tb25vbWl4X2NvbnRyb2xzKSksCisKKwkvKiBPdXRwdXQgUEdBcyAqLworCVNORF9TT0NfREFQTV9QR0EoIk9VVFBHQSBMZWZ0IEVuYWJsZSIsIERBNzIxMF9PVVRNSVhfTCwgNywgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiT1VUUEdBIFJpZ2h0IEVuYWJsZSIsIERBNzIxMF9PVVRNSVhfUiwgNywgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fUEdBKCJPdXQxIExlZnQiLCBEQTcyMTBfU1RBUlRVUDIsIDAsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk91dDEgUmlnaHQiLCBEQTcyMTBfU1RBUlRVUDIsIDEsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk91dDIgTW9ubyIsIERBNzIxMF9TVEFSVFVQMiwgMiwgMSwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSGVhZHBob25lIExlZnQiLCBEQTcyMTBfU1RBUlRVUDIsIDMsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkhlYWRwaG9uZSBSaWdodCIsIERBNzIxMF9TVEFSVFVQMiwgNCwgMSwgTlVMTCwgMCksCisKKwkvKiBPdXRwdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVQxTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIk9VVDFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUMiIpLAorfTsKKworLyogREFQTSBhdWRpbyByb3V0ZSBkZWZpbml0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBkYTcyMTBfYXVkaW9fbWFwW10gPSB7CisJLyogRGVzdCAgICAgICBDb25uZWN0aW5nIFdpZGdldCAgICBzb3VyY2UgKi8KKwkvKiBJbnB1dCBwYXRoICovCisJeyJNaWMgTGVmdCIsIE5VTEwsICJNSUNMIn0sCisJeyJNaWMgUmlnaHQiLCBOVUxMLCAiTUlDUiJ9LAorCisJeyJJbiBNaXhlciBMZWZ0IiwgIk1pYyBMZWZ0IFN3aXRjaCIsICJNaWMgTGVmdCJ9LAorCXsiSW4gTWl4ZXIgTGVmdCIsICJNaWMgUmlnaHQgU3dpdGNoIiwgIk1pYyBSaWdodCJ9LAorCisJeyJJbiBNaXhlciBSaWdodCIsICJNaWMgUmlnaHQgU3dpdGNoIiwgIk1pYyBSaWdodCJ9LAorCXsiSW4gTWl4ZXIgUmlnaHQiLCAiTWljIExlZnQgU3dpdGNoIiwgIk1pYyBMZWZ0In0sCisKKwl7IklOUEdBIExlZnQiLCBOVUxMLCAiSW4gTWl4ZXIgTGVmdCJ9LAorCXsiQURDIExlZnQiLCBOVUxMLCAiSU5QR0EgTGVmdCJ9LAorCisJeyJJTlBHQSBSaWdodCIsIE5VTEwsICJJbiBNaXhlciBSaWdodCJ9LAorCXsiQURDIFJpZ2h0IiwgTlVMTCwgIklOUEdBIFJpZ2h0In0sCisKKwkvKiBPdXRwdXQgcGF0aCAqLworCXsiT3V0IE1peGVyIExlZnQiLCAiREFDIExlZnQgU3dpdGNoIiwgIkRBQyBMZWZ0In0sCisJeyJPdXQgTWl4ZXIgUmlnaHQiLCAiREFDIFJpZ2h0IFN3aXRjaCIsICJEQUMgUmlnaHQifSwKKworCXsiTW9ubyBNaXhlciIsICJPdXRtaXggUmlnaHQgU3dpdGNoIiwgIk91dCBNaXhlciBSaWdodCJ9LAorCXsiTW9ubyBNaXhlciIsICJPdXRtaXggTGVmdCBTd2l0Y2giLCAiT3V0IE1peGVyIExlZnQifSwKKworCXsiT1VUUEdBIExlZnQgRW5hYmxlIiwgTlVMTCwgIk91dCBNaXhlciBMZWZ0In0sCisJeyJPVVRQR0EgUmlnaHQgRW5hYmxlIiwgTlVMTCwgIk91dCBNaXhlciBSaWdodCJ9LAorCisJeyJPdXQxIExlZnQiLCBOVUxMLCAiT1VUUEdBIExlZnQgRW5hYmxlIn0sCisJeyJPVVQxTCIsIE5VTEwsICJPdXQxIExlZnQifSwKKworCXsiT3V0MSBSaWdodCIsIE5VTEwsICJPVVRQR0EgUmlnaHQgRW5hYmxlIn0sCisJeyJPVVQxUiIsIE5VTEwsICJPdXQxIFJpZ2h0In0sCisKKwl7IkhlYWRwaG9uZSBMZWZ0IiwgTlVMTCwgIk9VVFBHQSBMZWZ0IEVuYWJsZSJ9LAorCXsiSFBMIiwgTlVMTCwgIkhlYWRwaG9uZSBMZWZ0In0sCisKKwl7IkhlYWRwaG9uZSBSaWdodCIsIE5VTEwsICJPVVRQR0EgUmlnaHQgRW5hYmxlIn0sCisJeyJIUFIiLCBOVUxMLCAiSGVhZHBob25lIFJpZ2h0In0sCisKKwl7Ik91dDIgTW9ubyIsIE5VTEwsICJNb25vIE1peGVyIn0sCisJeyJPVVQyIiwgTlVMTCwgIk91dDIgTW9ubyJ9LAogfTsKIAogLyogQ29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZGE3MjEwX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIC8qCkBAIC0xODgsNzIgKzU4MywxNSBAQAogCTB4MDAsCQkJCQkJLyogUjg4ICAgICAgICovCiB9OwogCi0vKgotICogUmVhZCBkYTcyMTAgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1MzIgZGE3MjEwX3JlYWRfcmVnX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZykKK3N0YXRpYyBpbnQgZGE3MjEwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCUJVR19PTihyZWcgPj0gQVJSQVlfU0laRShkYTcyMTBfcmVnKSk7Ci0JcmV0dXJuIGNhY2hlW3JlZ107Ci19Ci0KLS8qCi0gKiBXcml0ZSB0byB0aGUgZGE3MjEwIHJlZ2lzdGVyIHNwYWNlCi0gKi8KLXN0YXRpYyBpbnQgZGE3MjEwX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZywgdTMyIHZhbHVlKQotewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0JdTggZGF0YVsyXTsKLQotCUJVR19PTihjb2RlYy0+ZHJpdmVyLT52b2xhdGlsZV9yZWdpc3Rlcik7Ci0KLQlkYXRhWzBdID0gcmVnICYgMHhmZjsKLQlkYXRhWzFdID0gdmFsdWUgJiAweGZmOwotCi0JaWYgKHJlZyA+PSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoMiAhPSBjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikpCi0JCXJldHVybiAtRUlPOwotCi0JY2FjaGVbcmVnXSA9IHZhbHVlOwotCXJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBmcm9tIHRoZSBkYTcyMTAgcmVnaXN0ZXIgc3BhY2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGRhNzIxMF9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdTMyIHJlZykKLXsKLQlpZiAoREE3MjEwX1NUQVRVUyA9PSByZWcpCi0JCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnKTsKLQotCXJldHVybiBkYTcyMTBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZGE3MjEwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCBpc19wbGF5ID0gc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCi0JaWYgKGlzX3BsYXkpIHsKLQkJLyogRW5hYmxlIE91dCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTBfT1VUTUlYX0wsIDB4MUYsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTBfT1VUTUlYX1IsIDB4MUYsIDB4MTApOwotCi0JfSBlbHNlIHsKLQkJLyogVm9sdW1lIDcgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX01JQ19MLCAweDcsIDB4Nyk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9NSUNfUiwgMHg3LCAweDcpOwotCi0JCS8qIEVuYWJsZSBNaWMgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX0lOTUlYX0wsIDB4MUYsIDB4MSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9JTk1JWF9SLCAweDFGLCAweDEpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBEQTcyMTBfU1RBVFVTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTI2Niw5MyArNjA0LDc1IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJdTMyIGRhaV9jZmcxOwotCXUzMiBocGZfcmVnLCBocGZfbWFzaywgaHBmX3ZhbHVlOwogCXUzMiBmcywgYnlwYXNzOwogCiAJLyogc2V0IERBSSBzb3VyY2UgdG8gTGVmdCBhbmQgUmlnaHQgQURDICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX1NSQ19TRUwsCisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0RBSV9TUkNfU0VMLAogCQkgICAgIERBNzIxMF9EQUlfT1VUX1JfU1JDIHwgREE3MjEwX0RBSV9PVVRfTF9TUkMpOwogCiAJLyogRW5hYmxlIERBSSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX0RBSV9DRkczLCBEQTcyMTBfREFJX09FIHwgREE3MjEwX0RBSV9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0RBSV9DRkczLCBEQTcyMTBfREFJX09FIHwgREE3MjEwX0RBSV9FTik7CiAKLQlkYWlfY2ZnMSA9IDB4RkMgJiBkYTcyMTBfcmVhZChjb2RlYywgREE3MjEwX0RBSV9DRkcxKTsKKwlkYWlfY2ZnMSA9IDB4RkMgJiBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSk7CiAKIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CiAJCWRhaV9jZmcxIHw9IERBNzIxMF9EQUlfV09SRF9TMTZfTEU7CiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQlkYWlfY2ZnMSB8PSBEQTcyMTBfREFJX1dPUkRfUzIwXzNMRTsKKwkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKIAkJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9XT1JEX1MyNF9MRTsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9XT1JEX1MzMl9MRTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEsIGRhaV9jZmcxKTsKLQotCWhwZl9yZWcgPSAoU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA9PSBzdWJzdHJlYW0tPnN0cmVhbSkgPwotCQlEQTcyMTBfREFDX0hQRiA6IERBNzIxMF9BRENfSFBGOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSwgZGFpX2NmZzEpOwogCiAJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CiAJY2FzZSA4MDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzgwMDA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0YwX01BU0sJfCBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IERBNzIxMF9WT0lDRV9GMF8yNQl8IERBNzIxMF9WT0lDRV9FTjsKIAkJYnlwYXNzCQk9IERBNzIxMF9QTExfQllQOwogCQlicmVhazsKIAljYXNlIDExMDI1OgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzExMDI1OwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9GMF9NQVNLCXwgREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSBEQTcyMTBfVk9JQ0VfRjBfMjUJfCBEQTcyMTBfVk9JQ0VfRU47CiAJCWJ5cGFzcwkJPSAwOwogCQlicmVhazsKIAljYXNlIDEyMDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzEyMDAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9GMF9NQVNLCXwgREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSBEQTcyMTBfVk9JQ0VfRjBfMjUJfCBEQTcyMTBfVk9JQ0VfRU47CiAJCWJ5cGFzcwkJPSBEQTcyMTBfUExMX0JZUDsKIAkJYnJlYWs7CiAJY2FzZSAxNjAwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU18xNjAwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRjBfTUFTSwl8IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gREE3MjEwX1ZPSUNFX0YwXzI1CXwgREE3MjEwX1ZPSUNFX0VOOwogCQlieXBhc3MJCT0gREE3MjEwX1BMTF9CWVA7CiAJCWJyZWFrOwogCWNhc2UgMjIwNTA6CiAJCWZzCQk9IERBNzIxMF9QTExfRlNfMjIwNTA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSAwOwogCQlieXBhc3MJCT0gMDsKIAkJYnJlYWs7CiAJY2FzZSAzMjAwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU18zMjAwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IDA7CiAJCWJ5cGFzcwkJPSBEQTcyMTBfUExMX0JZUDsKIAkJYnJlYWs7CiAJY2FzZSA0NDEwMDoKIAkJZnMJCT0gREE3MjEwX1BMTF9GU180NDEwMDsKLQkJaHBmX21hc2sJPSBEQTcyMTBfVk9JQ0VfRU47Ci0JCWhwZl92YWx1ZQk9IDA7CiAJCWJ5cGFzcwkJPSAwOwogCQlicmVhazsKIAljYXNlIDQ4MDAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzQ4MDAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gMDsKIAkJYnlwYXNzCQk9IERBNzIxMF9QTExfQllQOwogCQlicmVhazsKIAljYXNlIDg4MjAwOgogCQlmcwkJPSBEQTcyMTBfUExMX0ZTXzg4MjAwOwotCQlocGZfbWFzawk9IERBNzIxMF9WT0lDRV9FTjsKLQkJaHBmX3ZhbHVlCT0gMDsKIAkJYnlwYXNzCQk9IDA7CiAJCWJyZWFrOwogCWNhc2UgOTYwMDA6CiAJCWZzCQk9IERBNzIxMF9QTExfRlNfOTYwMDA7Ci0JCWhwZl9tYXNrCT0gREE3MjEwX1ZPSUNFX0VOOwotCQlocGZfdmFsdWUJPSAwOwogCQlieXBhc3MJCT0gREE3MjEwX1BMTF9CWVA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0zNjIsNyArNjgyLDYgQEAKIAkvKiBEaXNhYmxlIGFjdGl2ZSBtb2RlICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX1NUQVJUVVAxLCBEQTcyMTBfU0NfTVNUX0VOLCAwKTsKIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwZl9yZWcsIGhwZl9tYXNrLCBocGZfdmFsdWUpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfTUFTSywgZnMpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxMF9QTExfRElWMywgREE3MjEwX1BMTF9CWVAsIGJ5cGFzcyk7CiAKQEAgLTM4MiwxMyArNzAxLDE2IEBACiAJdTMyIGRhaV9jZmcxOwogCXUzMiBkYWlfY2ZnMzsKIAotCWRhaV9jZmcxID0gMHg3ZiAmIGRhNzIxMF9yZWFkKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEpOwotCWRhaV9jZmczID0gMHhmYyAmIGRhNzIxMF9yZWFkKGNvZGVjLCBEQTcyMTBfREFJX0NGRzMpOworCWRhaV9jZmcxID0gMHg3ZiAmIHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEwX0RBSV9DRkcxKTsKKwlkYWlfY2ZnMyA9IDB4ZmMgJiBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMyk7CiAKIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCQlkYWlfY2ZnMSB8PSBEQTcyMTBfREFJX01PREVfTUFTVEVSOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWRhaV9jZmcxIHw9IERBNzIxMF9EQUlfTU9ERV9TTEFWRTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDAxLDYgKzcyMywxMiBAQAogCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgogCQlkYWlfY2ZnMyB8PSBEQTcyMTBfREFJX0ZPUk1BVF9JMlNNT0RFOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJZGFpX2NmZzMgfD0gREE3MjEwX0RBSV9GT1JNQVRfTEVGVF9KOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWRhaV9jZmczIHw9IERBNzIxMF9EQUlfRk9STUFUX1JJR0hUX0o7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQxMSwxOSArNzM5LDMyIEBACiAJICovCiAJZGFpX2NmZzEgfD0gREE3MjEwX0RBSV9GTEVOXzY0QklUOwogCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFJX0NGRzEsIGRhaV9jZmcxKTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMywgZGFpX2NmZzMpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMSwgZGFpX2NmZzEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUlfQ0ZHMywgZGFpX2NmZzMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgREE3MjEwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCitzdGF0aWMgaW50IGRhNzIxMF9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXU4IG11dGVfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTBfREFDX0hQRikgJiAweEZCOworCisJaWYgKG11dGUpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9EQUNfSFBGLCBtdXRlX3JlZyB8IDB4NCk7CisJZWxzZQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX0hQRiwgbXV0ZV9yZWcpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIERBNzIxMF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKIAogLyogREFJIG9wZXJhdGlvbnMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGRhNzIxMF9kYWlfb3BzID0gewotCS5zdGFydHVwCT0gZGE3MjEwX3N0YXJ0dXAsCiAJLmh3X3BhcmFtcwk9IGRhNzIxMF9od19wYXJhbXMsCiAJLnNldF9mbXQJPSBkYTcyMTBfc2V0X2RhaV9mbXQsCisJLmRpZ2l0YWxfbXV0ZQk9IGRhNzIxMF9tdXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGE3MjEwX2RhaSA9IHsKQEAgLTQ1MSwxMSArNzkyLDE1IEBACiBzdGF0aWMgaW50IGRhNzIxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGRhNzIxMF9wcml2ICpkYTcyMTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCi0JY29kZWMtPmNvbnRyb2xfZGF0YQk9IGRhNzIxMC0+Y29udHJvbF9kYXRhOwotCWNvZGVjLT5od193cml0ZQkJPSAoaHdfd3JpdGVfdClpMmNfbWFzdGVyX3NlbmQ7CisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGRhNzIxMC0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogRklYTUUKIAkgKgpAQCAtNDcyLDggKzgxNyw4IEBACiAJLyoKIAkgKiBtYWtlIHN1cmUgdGhhdCBEQTcyMTAgdXNlIGJ5cGFzcyBtb2RlIGJlZm9yZSBzdGFydCB1cAogCSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1NUQVJUVVAxLCAwKTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfU1RBUlRVUDEsIDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywKIAkJICAgICBEQTcyMTBfTUNMS19SQU5HRV8xMF8yMF9NSFogfCBEQTcyMTBfUExMX0JZUCk7CiAKIAkvKgpAQCAtNDgxLDM2ICs4MjYsNzAgQEAKIAkgKi8KIAogCS8qIEVuYWJsZSBMZWZ0ICYgUmlnaHQgTUlDIFBHQSBhbmQgTWljIEJpYXMgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfTCwgREE3MjEwX01JQ19MX0VOIHwgREE3MjEwX01JQ0JJQVNfRU4pOwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX01JQ19SLCBEQTcyMTBfTUlDX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfTCwgREE3MjEwX01JQ19MX0VOIHwgREE3MjEwX01JQ0JJQVNfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9NSUNfUiwgREE3MjEwX01JQ19SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBpbnB1dCBQR0EgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9JTk1JWF9MLCBEQTcyMTBfSU5fTF9FTik7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfSU5NSVhfUiwgREE3MjEwX0lOX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9JTk1JWF9MLCBEQTcyMTBfSU5fTF9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0lOTUlYX1IsIERBNzIxMF9JTl9SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBBREMgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9BREMsIERBNzIxMF9BRENfTF9FTiB8IERBNzIxMF9BRENfUl9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0FEQywgREE3MjEwX0FEQ19MX0VOIHwgREE3MjEwX0FEQ19SX0VOKTsKIAogCS8qCiAJICogREFDIHNldHRpbmdzCiAJICovCiAKIAkvKiBFbmFibGUgTGVmdCBhbmQgUmlnaHQgREFDICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX1NFTCwKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfREFDX1NFTCwKIAkJICAgICBEQTcyMTBfREFDX0xfU1JDX0RBSV9MIHwgREE3MjEwX0RBQ19MX0VOIHwKIAkJICAgICBEQTcyMTBfREFDX1JfU1JDX0RBSV9SIHwgREE3MjEwX0RBQ19SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBvdXQgUEdBICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfT1VUTUlYX0wsIERBNzIxMF9PVVRfTF9FTik7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfT1VUTUlYX1IsIERBNzIxMF9PVVRfUl9FTik7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX09VVE1JWF9MLCBEQTcyMTBfT1VUX0xfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVRNSVhfUiwgREE3MjEwX09VVF9SX0VOKTsKIAogCS8qIEVuYWJsZSBMZWZ0IGFuZCBSaWdodCBIZWFkUGhvbmUgUEdBICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfSFBfQ0ZHLAorCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9IUF9DRkcsCiAJCSAgICAgREE3MjEwX0hQXzJDQVBfTU9ERSB8IERBNzIxMF9IUF9TRU5TRV9FTiB8CiAJCSAgICAgREE3MjEwX0hQX0xfRU4gfCBEQTcyMTBfSFBfTU9ERSB8IERBNzIxMF9IUF9SX0VOKTsKIAorCS8qIEVuYWJsZSByYW1wIG1vZGUgZm9yIERBQyBnYWluIHVwZGF0ZSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9TT0ZUTVVURSwgREE3MjEwX1JBTVBfRU4pOworCisJLyoKKwkgKiBGb3IgREE3MjEwIGNvZGVjLCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gZW5hYmxlL2Rpc2FibGUgYW5hbG9nIElPcworCSAqIGFuZCBBREMvREFDLAorCSAqICgxKSBVc2luZyAiRW5hYmxlIEJpdCIgb2YgcmVnaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSU8KKwkgKiAob3IgQURDL0RBQykKKwkgKgllLmcuIE1pYyBMZWZ0IGNhbiBiZSBlbmFibGVkIHVzaW5nIGJpdCA3IG9mIE1JQ19MKDB4NykgcmVnCisJICoKKwkgKiAoMikgVXNpbmcgIlN0YW5kYnkgQml0IiBvZiBTVEFSVFVQMiBvciBTVEFSVFVQMyByZWdpc3RlcgorCSAqCWUuZy4gTWljIGxlZnQgY2FuIGJlIHB1dCB0byBTVEFOREJZIHVzaW5nIGJpdCAwIG9mIFNUQVJUVVAzKDB4NSkKKwkgKgorCSAqIE91dCBvZiB0aGVzZSB0d28gbWV0aG9kcywgdGhlIG9uZSB1c2luZyBTVEFOREJZIGJpdHMgaXMgcHJlZmVycmVkCisJICogd2F5IHRvIGVuYWJsZS9kaXNhYmxlIGluZGl2aWR1YWwgYmxvY2tzLiBUaGlzIGlzIGJlY2F1c2UgU1RBTkRCWQorCSAqIHJlZ2lzdGVycyBhcmUgcGFydCBvZiBzeXN0ZW0gY29udHJvbGxlciB3aGljaCBhbGxvd3Mgc3lzdGVtIHBvd2VyCisJICogdXAvZG93biBpbiBhIGNvbnRyb2xsZWQsIHBvcC1mcmVlIG1hbm5lci4gQWxzbywgYXMgcGVyIGFwcGxpY2F0aW9uCisJICogbm90ZSBvZiBEQTcyMTAsIFNUQU5EQlkgcmVnaXN0ZXIgYml0cyBhcmUgb25seSBlZmZlY3RpdmUgaWYgYQorCSAqIHBhcnRpY3VsYXIgSU8gKG9yIEFEQy9EQUMpIGlzIGFscmVhZHkgZW5hYmxlZCB1c2luZyBlbmFibGUvZGlzYWJsZQorCSAqIHJlZ2lzdGVyIGJpdHMuIEtlZXBpbmcgdGhlc2UgdGhpbmdzIGluIG1pbmQsIGN1cnJlbnQgREFQTQorCSAqIGltcGxlbWVudGF0aW9uIG1hbmlwdWxhdGVzIG9ubHkgU1RBTkRCWSBiaXRzLgorCSAqCisJICogT3ZlcmFsbCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgb3V0bGluZWQgYXMgYmVsb3csCisJICoKKwkgKiAtICJFbmFibGUgYml0IiBvZiBhbiBJTyBvciBBREMvREFDIGlzIHVzZWQgdG8gZW5hYmxlIGl0IGluIHByb2JlKCkKKwkgKiAtICJTVEFOREJZIGJpdCIgaXMgY29udHJvbGxlZCBieSBEQVBNCisJICovCisKKwkvKiBFbmFibGUgTGluZSBvdXQgYW1wbGlmaWVycyAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQxX0wsIERBNzIxMF9PVVQxX0xfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQxX1IsIERBNzIxMF9PVVQxX1JfRU4pOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9PVVQyLCBEQTcyMTBfT1VUMl9FTiB8CisJCSAgICAgREE3MjEwX09VVDJfT1VUTUlYX0wgfCBEQTcyMTBfT1VUMl9PVVRNSVhfUik7CisKIAkvKiBEaWFibGUgUExMIGFuZCBieXBhc3MgaXQgKi8KLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfNDgwMDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTEwsIERBNzIxMF9QTExfRlNfNDgwMDApOwogCiAJLyoKIAkgKiBJZiA0OGtIeiBzb3VuZCBjYW1lLCBpdCB1c2UgYnlwYXNzIG1vZGUsCkBAIC01MjEsMjUgKzkwMCwyMiBAQAogCSAqIERBNzIxMF9QTExfRElWMyA6OiBEQTcyMTBfUExMX0JZUCBiaXQuCiAJICogICBzZWUgZGE3MjEwX2h3X3BhcmFtcwogCSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYxLCAweEU1KTsgLyogTUNMSyA9IDEyLjI4OE1IeiAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYyLCAweDk5KTsKLQlkYTcyMTBfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMywgMHgwQSB8CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYxLCAweEU1KTsgLyogTUNMSyA9IDEyLjI4OE1IeiAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9QTExfRElWMiwgMHg5OSk7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX1BMTF9ESVYzLCAweDBBIHwKIAkJICAgICBEQTcyMTBfTUNMS19SQU5HRV8xMF8yMF9NSFogfCBEQTcyMTBfUExMX0JZUCk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEwX1BMTCwgREE3MjEwX1BMTF9FTiwgREE3MjEwX1BMTF9FTik7CiAKIAkvKiBBcyBzdWdnZXN0ZWQgYnkgRGlhbG9nICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDhCKTsgLyogdW5sb2NrICovCi0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9URVNUX1VOTE9DSywJMHhCNCk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9QTEwxLAkJMHgwMSk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9DUF9NT0RFLAkJMHg3Qyk7Ci0JZGE3MjEwX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDAwKTsgLyogcmUtbG9jayAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX0FfVEVTVF9VTkxPQ0ssCTB4MDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX0hJRF9VTkxPQ0ssCTB4OEIpOyAvKiB1bmxvY2sgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9URVNUX1VOTE9DSywJMHhCNCk7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEwX0FfUExMMSwJCTB4MDEpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX0NQX01PREUsCQkweDdDKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfQV9ISURfVU5MT0NLLAkweDAwKTsgLyogcmUtbG9jayAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxMF9BX1RFU1RfVU5MT0NLLAkweDAwKTsKIAogCS8qIEFjdGl2YXRlIGFsbCBlbmFibGVkIHN1YnN5c3RlbSAqLwotCWRhNzIxMF93cml0ZShjb2RlYywgREE3MjEwX1NUQVJUVVAxLCBEQTcyMTBfU0NfTVNUX0VOKTsKLQotCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBkYTcyMTBfc25kX2NvbnRyb2xzLAotCQkJICAgICBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTBfU1RBUlRVUDEsIERBNzIxMF9TQ19NU1RfRU4pOwogCiAJZGV2X2luZm8oY29kZWMtPmRldiwgIkRBNzIxMCBBdWRpbyBDb2RlYyAlc1xuIiwgREE3MjEwX1ZFUlNJT04pOwogCkBAIC01NDgsMTEgKzkyNCwxOCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfZGE3MjEwID0gewogCS5wcm9iZQkJCT0gZGE3MjEwX3Byb2JlLAotCS5yZWFkCQkJPSBkYTcyMTBfcmVhZCwKLQkud3JpdGUJCQk9IGRhNzIxMF93cml0ZSwKIAkucmVnX2NhY2hlX3NpemUJCT0gQVJSQVlfU0laRShkYTcyMTBfcmVnKSwKIAkucmVnX3dvcmRfc2l6ZQkJPSBzaXplb2YodTgpLAogCS5yZWdfY2FjaGVfZGVmYXVsdAk9IGRhNzIxMF9yZWcsCisJLnZvbGF0aWxlX3JlZ2lzdGVyCT0gZGE3MjEwX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCisJLmNvbnRyb2xzCQk9IGRhNzIxMF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpLAorCisJLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJCT0gZGE3MjEwX2F1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTBfYXVkaW9fbWFwKSwKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCkBAIC01NjcsNyArOTUwLDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBkYTcyMTApOwotCWRhNzIxMC0+Y29udHJvbF9kYXRhID0gaTJjOwogCWRhNzIxMC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCmluZGV4IGY5YTg3NzMuLjZmYWU3NjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00ODU3LmMKaW5kZXggMmMyYTY4MS4uYzM4N2RhZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sbTQ4NTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDg1Ny5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKiBBdXRob3I6IEdyYWVtZSBHcmVnb3J5Ci0gKiAgICAgICAgIGdyYWVtZS5ncmVnb3J5QHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogICAgICAgICBncmFlbWUuZ3JlZ29yeUB3b2xmc29ubWljcm8uY29tCiAgKiBDb3B5cmlnaHQgMjAxMSBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKaW5kZXggYWM2NWEyZC4uZWJiZjYzYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwpAQCAtNDAsNyArNDAsNiBAQAogCiBzdHJ1Y3QgbWF4OTgwODhfcHJpdiB7CiAgICAgICAgZW51bSBtYXg5ODA4OF90eXBlIGRldnR5cGU7Ci0gICAgICAgdm9pZCAqY29udHJvbF9kYXRhOwogICAgICAgIHN0cnVjdCBtYXg5ODA4OF9wZGF0YSAqcGRhdGE7CiAgICAgICAgdW5zaWduZWQgaW50IHN5c2NsazsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgZGFpWzJdOwpAQCAtMTY5NywxMyArMTY5NiwxOSBAQAogfQogfTsKIAotc3RhdGljIGludCBtYXg5ODA4OF9nZXRfY2hhbm5lbChjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGNvbnN0IGNoYXIgKmVxX21vZGVfbmFtZVtdID0geyJFUTEgTW9kZSIsICJFUTIgTW9kZSJ9OworCitzdGF0aWMgaW50IG1heDk4MDg4X2dldF9jaGFubmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICAgICBpZiAoc3RyY21wKG5hbWUsICJFUTEgTW9kZSIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICBpZiAoc3RyY21wKG5hbWUsICJFUTIgTW9kZSIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVxX21vZGVfbmFtZSk7IGkrKykKKwkJaWYgKHN0cmNtcChuYW1lLCBlcV9tb2RlX25hbWVbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJCYWQgRVEgY2hhbm5lbCBuYW1lICclcydcbiIsIG5hbWUpOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgdm9pZCBtYXg5ODA4OF9zZXR1cF9lcTEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMTgwNywxMCArMTgxMiwxMyBAQAogICAgICAgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfcHJpdiAqbWF4OTgwODggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfcGRhdGEgKnBkYXRhID0gbWF4OTgwODgtPnBkYXRhOwotICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgKmNkYXRhOwogICAgICAgIGludCBzZWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAorICAgICAgIGlmIChjaGFubmVsIDwgMCkKKwkgICAgICAgcmV0dXJuIGNoYW5uZWw7CisKICAgICAgICBjZGF0YSA9ICZtYXg5ODA4OC0+ZGFpW2NoYW5uZWxdOwogCiAgICAgICAgaWYgKHNlbCA+PSBwZGF0YS0+ZXFfY2ZnY250KQpAQCAtMTgzNSw5ICsxODQzLDEyIEBACiB7CiAgICAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogICAgICAgIHN0cnVjdCBtYXg5ODA4OF9wcml2ICptYXg5ODA4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworICAgICAgIGludCBjaGFubmVsID0gbWF4OTgwODhfZ2V0X2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKICAgICAgICBzdHJ1Y3QgbWF4OTgwODhfY2RhdGEgKmNkYXRhOwogCisgICAgICAgaWYgKGNoYW5uZWwgPCAwKQorCSAgICAgICByZXR1cm4gY2hhbm5lbDsKKwogICAgICAgIGNkYXRhID0gJm1heDk4MDg4LT5kYWlbY2hhbm5lbF07CiAgICAgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGNkYXRhLT5lcV9zZWw7CiAgICAgICAgcmV0dXJuIDA7CkBAIC0xODUyLDE3ICsxODYzLDE3IEBACiAgICAgICAgaW50IGksIGo7CiAgICAgICAgY29uc3QgY2hhciAqKnQ7CiAgICAgICAgaW50IHJldDsKLQogICAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7Ci0gICAgICAgICAgICAgICBTT0NfRU5VTV9FWFQoIkVRMSBNb2RlIiwKKyAgICAgICAgICAgICAgIFNPQ19FTlVNX0VYVCgoY2hhciAqKWVxX21vZGVfbmFtZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODgtPmVxX2VudW0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDk4MDg4X2dldF9lcV9lbnVtLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9wdXRfZXFfZW51bSksCi0gICAgICAgICAgICAgICBTT0NfRU5VTV9FWFQoIkVRMiBNb2RlIiwKKyAgICAgICAgICAgICAgIFNPQ19FTlVNX0VYVCgoY2hhciAqKWVxX21vZGVfbmFtZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODgtPmVxX2VudW0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDk4MDg4X2dldF9lcV9lbnVtLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg5ODA4OF9wdXRfZXFfZW51bSksCiAgICAgICAgfTsKKyAgICAgICBCVUlMRF9CVUdfT04oQVJSQVlfU0laRShjb250cm9scykgIT0gQVJSQVlfU0laRShlcV9tb2RlX25hbWUpKTsKIAogICAgICAgIGNmZyA9IHBkYXRhLT5lcV9jZmc7CiAgICAgICAgY2ZnY250ID0gcGRhdGEtPmVxX2NmZ2NudDsKQEAgLTIwNjYsNyArMjA3Nyw2IEBACiAgICAgICAgbWF4OTgwODgtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKICAgICAgICBpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBtYXg5ODA4OCk7Ci0gICAgICAgbWF4OTgwODgtPmNvbnRyb2xfZGF0YSA9IGkyYzsKICAgICAgICBtYXg5ODA4OC0+cGRhdGEgPSBpMmMtPmRldi5wbGF0Zm9ybV9kYXRhOwogCiAgICAgICAgcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKaW5kZXggNjY4NDM0ZC4uMjZkN2IwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYwpAQCAtNDAsNyArNDAsNiBAQAogCiBzdHJ1Y3QgbWF4OTgwOTVfcHJpdiB7CiAJZW51bSBtYXg5ODA5NV90eXBlIGRldnR5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCXN0cnVjdCBtYXg5ODA5NV9wZGF0YSAqcGRhdGE7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAlzdHJ1Y3QgbWF4OTgwOTVfY2RhdGEgZGFpWzNdOwpAQCAtNjE4LDE0ICs2MTcsMTMgQEAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JdTggZGF0YVsyXTsKKwlpbnQgcmV0OwogCi0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gdmFsdWU7Ci0JaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKSA9PSAyKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlPOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAwOworCisJcmV0dXJuIHJldCA/IC1FSU8gOiAwOwogfQogCiAvKgpAQCAtMTk5MiwxMiArMTk5MCwxOSBAQAogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gYWRkIEVRIGNvbnRyb2w6ICVkXG4iLCByZXQpOwogfQogCi1zdGF0aWMgaW50IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgY29uc3QgY2hhciAqYnFfbW9kZV9uYW1lW10gPSB7IkJpcXVhZDEgTW9kZSIsICJCaXF1YWQyIE1vZGUifTsKKworc3RhdGljIGludCBtYXg5ODA5NV9nZXRfYnFfY2hhbm5lbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpZiAoc3RyY21wKG5hbWUsICJCaXF1YWQxIE1vZGUiKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyY21wKG5hbWUsICJCaXF1YWQyIE1vZGUiKSA9PSAwKQotCQlyZXR1cm4gMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJxX21vZGVfbmFtZSk7IGkrKykKKwkJaWYgKHN0cmNtcChuYW1lLCBicV9tb2RlX25hbWVbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJCYWQgYmlxdWFkIGNoYW5uZWwgbmFtZSAnJXMnXG4iLCBuYW1lKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtMjAwNywxNCArMjAxMiwxNSBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcHJpdiAqbWF4OTgwOTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcGRhdGEgKnBkYXRhID0gbWF4OTgwOTUtPnBkYXRhOwotCWludCBjaGFubmVsID0gbWF4OTgwOTVfZ2V0X2JxX2NoYW5uZWwoa2NvbnRyb2wtPmlkLm5hbWUpOworCWludCBjaGFubmVsID0gbWF4OTgwOTVfZ2V0X2JxX2NoYW5uZWwoY29kZWMsIGtjb250cm9sLT5pZC5uYW1lKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfY2RhdGEgKmNkYXRhOwogCWludCBzZWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlzdHJ1Y3QgbWF4OTgwOTVfYmlxdWFkX2NmZyAqY29lZl9zZXQ7CiAJaW50IGZzLCBiZXN0LCBiZXN0X3ZhbCwgaTsKIAlpbnQgcmVnbWFzaywgcmVnc2F2ZTsKIAotCUJVR19PTihjaGFubmVsID4gMSk7CisJaWYgKGNoYW5uZWwgPCAwKQorCQlyZXR1cm4gY2hhbm5lbDsKIAogCWlmICghcGRhdGEgfHwgIW1heDk4MDk1LT5icV90ZXh0Y250KQogCQlyZXR1cm4gMDsKQEAgLTIwNjYsOSArMjA3MiwxMiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlzdHJ1Y3QgbWF4OTgwOTVfcHJpdiAqbWF4OTgwOTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgY2hhbm5lbCA9IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGtjb250cm9sLT5pZC5uYW1lKTsKKwlpbnQgY2hhbm5lbCA9IG1heDk4MDk1X2dldF9icV9jaGFubmVsKGNvZGVjLCBrY29udHJvbC0+aWQubmFtZSk7CiAJc3RydWN0IG1heDk4MDk1X2NkYXRhICpjZGF0YTsKIAorCWlmIChjaGFubmVsIDwgMCkKKwkJcmV0dXJuIGNoYW5uZWw7CisKIAljZGF0YSA9ICZtYXg5ODA5NS0+ZGFpW2NoYW5uZWxdOwogCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBjZGF0YS0+YnFfc2VsOwogCkBAIC0yMDg2LDE1ICsyMDk1LDE2IEBACiAJaW50IHJldDsKIAogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7Ci0JCVNPQ19FTlVNX0VYVCgiQmlxdWFkMSBNb2RlIiwKKwkJU09DX0VOVU1fRVhUKChjaGFyICopYnFfbW9kZV9uYW1lWzBdLAogCQkJbWF4OTgwOTUtPmJxX2VudW0sCiAJCQltYXg5ODA5NV9nZXRfYnFfZW51bSwKIAkJCW1heDk4MDk1X3B1dF9icV9lbnVtKSwKLQkJU09DX0VOVU1fRVhUKCJCaXF1YWQyIE1vZGUiLAorCQlTT0NfRU5VTV9FWFQoKGNoYXIgKilicV9tb2RlX25hbWVbMV0sCiAJCQltYXg5ODA5NS0+YnFfZW51bSwKIAkJCW1heDk4MDk1X2dldF9icV9lbnVtLAogCQkJbWF4OTgwOTVfcHV0X2JxX2VudW0pLAogCX07CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoY29udHJvbHMpICE9IEFSUkFZX1NJWkUoYnFfbW9kZV9uYW1lKSk7CiAKIAljZmcgPSBwZGF0YS0+YnFfY2ZnOwogCWNmZ2NudCA9IHBkYXRhLT5icV9jZmdjbnQ7CkBAIC0yMzM3LDcgKzIzNDcsNiBAQAogCiAJbWF4OTgwOTUtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgbWF4OTgwOTUpOwotCW1heDk4MDk1LT5jb250cm9sX2RhdGEgPSBpMmM7CiAJbWF4OTgwOTUtPnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9tYXg5ODA5NSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKaW5kZXggYmQ4ZjI2ZS4uZjczMTY1MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2EwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMCwwICsxLDE3NzMgQEAKKy8qCisgKiBydDU2MzEuYyAgLS0gIFJUNTYzMSBBTFNBIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBSZWFsdGVrIE1pY3JvZWxlY3Ryb25pY3MKKyAqCisgKiBBdXRob3I6IGZsb3ZlIDxmbG92ZUByZWFsdGVrLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBXTTg3NTMuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAicnQ1NjMxLmgiCisKK3N0cnVjdCBydDU2MzFfcHJpdiB7CisJaW50IGNvZGVjX3ZlcnNpb247CisJaW50IG1hc3RlcjsKKwlpbnQgc3lzY2xrOworCWludCByeF9yYXRlOworCWludCBiY2xrX3JhdGU7CisJaW50IGRtaWNfdXNlZF9mbGFnOworfTsKKworc3RhdGljIGNvbnN0IHUxNiBydDU2MzFfcmVnW1JUNTYzMV9WRU5ET1JfSUQyICsgMV0gPSB7CisJW1JUNTYzMV9TUEtfT1VUX1ZPTF0gPSAweDg4ODgsCisJW1JUNTYzMV9IUF9PVVRfVk9MXSA9IDB4ODA4MCwKKwlbUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0xdID0gMHhhMDgwLAorCVtSVDU2MzFfQVVYX0lOX1ZPTF0gPSAweDA4MDgsCisJW1JUNTYzMV9BRENfUkVDX01JWEVSXSA9IDB4ZjBmMCwKKwlbUlQ1NjMxX1ZEQUNfRElHX1ZPTF0gPSAweDAwMTAsCisJW1JUNTYzMV9PVVRNSVhFUl9MX0NUUkxdID0gMHhmZmMwLAorCVtSVDU2MzFfT1VUTUlYRVJfUl9DVFJMXSA9IDB4ZmZjMCwKKwlbUlQ1NjMxX0FYTzFNSVhFUl9DVFJMXSA9IDB4ODhjMCwKKwlbUlQ1NjMxX0FYTzJNSVhFUl9DVFJMXSA9IDB4ODhjMCwKKwlbUlQ1NjMxX0RJR19NSUNfQ1RSTF0gPSAweDMwMDAsCisJW1JUNTYzMV9NT05PX0lOUFVUX1ZPTF0gPSAweDg4MDgsCisJW1JUNTYzMV9TUEtfTUlYRVJfQ1RSTF0gPSAweGY4ZjgsCisJW1JUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTF0gPSAweGZjMDAsCisJW1JUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTF0gPSAweDQ0NDAsCisJW1JUNTYzMV9TRFBfQ1RSTF0gPSAweDgwMDAsCisJW1JUNTYzMV9NT05PX1NEUF9DVFJMXSA9IDB4ODAwMCwKKwlbUlQ1NjMxX1NURVJFT19BRF9EQV9DTEtfQ1RSTF0gPSAweDIwMTAsCisJW1JUNTYzMV9HRU5fUFVSX0NUUkxfUkVHXSA9IDB4MGUwMCwKKwlbUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yXSA9IDB4MDcxYSwKKwlbUlQ1NjMxX01JU0NfQ1RSTF0gPSAweDIwNDAsCisJW1JUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yXSA9IDB4ODAwMCwKKwlbUlQ1NjMxX1NPRlRfVk9MX0NUUkxdID0gMHgwN2UwLAorCVtSVDU2MzFfQUxDX0NUUkxfMV0gPSAweDAyMDYsCisJW1JUNTYzMV9BTENfQ1RSTF8zXSA9IDB4MjAwMCwKKwlbUlQ1NjMxX1BTRVVET19TUEFUTF9DVFJMXSA9IDB4MDU1MywKK307CisKKy8qKgorICogcnQ1NjMxX3dyaXRlX2luZGV4IC0gd3JpdGUgaW5kZXggcmVnaXN0ZXIgb2YgMm5kIGxheWVyCisgKi8KK3N0YXRpYyB2b2lkIHJ0NTYzMV93cml0ZV9pbmRleChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5ERVhfQURELCByZWcpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTkRFWF9EQVRBLCB2YWx1ZSk7Cit9CisKKy8qKgorICogcnQ1NjMxX3JlYWRfaW5kZXggLSByZWFkIGluZGV4IHJlZ2lzdGVyIG9mIDJuZCBsYXllcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0NTYzMV9yZWFkX2luZGV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTkRFWF9BREQsIHJlZyk7CisJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9JTkRFWF9EQVRBKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBydDU2MzFfcmVzZXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUkVTRVQsIDApOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTYzMV9SRVNFVDoKKwljYXNlIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMjoKKwljYXNlIFJUNTYzMV9JTkRFWF9BREQ6CisJY2FzZSBSVDU2MzFfSU5ERVhfREFUQToKKwljYXNlIFJUNTYzMV9FUV9DVFJMOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjMxX1JFU0VUOgorCWNhc2UgUlQ1NjMxX1NQS19PVVRfVk9MOgorCWNhc2UgUlQ1NjMxX0hQX09VVF9WT0w6CisJY2FzZSBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTDoKKwljYXNlIFJUNTYzMV9BVVhfSU5fVk9MOgorCWNhc2UgUlQ1NjMxX1NURVJFT19EQUNfVk9MXzE6CisJY2FzZSBSVDU2MzFfTUlDX0NUUkxfMToKKwljYXNlIFJUNTYzMV9TVEVSRU9fREFDX1ZPTF8yOgorCWNhc2UgUlQ1NjMxX0FEQ19DVFJMXzE6CisJY2FzZSBSVDU2MzFfQURDX1JFQ19NSVhFUjoKKwljYXNlIFJUNTYzMV9BRENfQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX1ZEQUNfRElHX1ZPTDoKKwljYXNlIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkw6CisJY2FzZSBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMOgorCWNhc2UgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX0FYTzJNSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX01JQ19DVFJMXzI6CisJY2FzZSBSVDU2MzFfRElHX01JQ19DVFJMOgorCWNhc2UgUlQ1NjMxX01PTk9fSU5QVVRfVk9MOgorCWNhc2UgUlQ1NjMxX1NQS19NSVhFUl9DVFJMOgorCWNhc2UgUlQ1NjMxX1NQS19NT05PX09VVF9DVFJMOgorCWNhc2UgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMOgorCWNhc2UgUlQ1NjMxX1NEUF9DVFJMOgorCWNhc2UgUlQ1NjMxX01PTk9fU0RQX0NUUkw6CisJY2FzZSBSVDU2MzFfU1RFUkVPX0FEX0RBX0NMS19DVFJMOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQxOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQyOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQzOgorCWNhc2UgUlQ1NjMxX1BXUl9NQU5BR19BREQ0OgorCWNhc2UgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUc6CisJY2FzZSBSVDU2MzFfR0xPQkFMX0NMS19DVFJMOgorCWNhc2UgUlQ1NjMxX1BMTF9DVFJMOgorCWNhc2UgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8xOgorCWNhc2UgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX0dQSU9fQ1RSTDoKKwljYXNlIFJUNTYzMV9NSVNDX0NUUkw6CisJY2FzZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMToKKwljYXNlIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yOgorCWNhc2UgUlQ1NjMxX0pBQ0tfREVUX0NUUkw6CisJY2FzZSBSVDU2MzFfU09GVF9WT0xfQ1RSTDoKKwljYXNlIFJUNTYzMV9BTENfQ1RSTF8xOgorCWNhc2UgUlQ1NjMxX0FMQ19DVFJMXzI6CisJY2FzZSBSVDU2MzFfQUxDX0NUUkxfMzoKKwljYXNlIFJUNTYzMV9QU0VVRE9fU1BBVExfQ1RSTDoKKwljYXNlIFJUNTYzMV9JTkRFWF9BREQ6CisJY2FzZSBSVDU2MzFfSU5ERVhfREFUQToKKwljYXNlIFJUNTYzMV9FUV9DVFJMOgorCWNhc2UgUlQ1NjMxX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTYzMV9WRU5ET1JfSUQxOgorCWNhc2UgUlQ1NjMxX1ZFTkRPUl9JRDI6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF92b2xfdGx2LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYWNfdm9sX3RsdiwgLTk1NjI1LCAzNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX3ZvbF90bHYsIC0zNDUwLCAxNTAsIDApOworLyogezAsICsyMCwgKzI0LCArMzAsICszNSwgKzQwLCArNDQsICs1MCwgKzUyfWRCICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1pY19ic3RfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoNiksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgMCwgMCksCisJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMjQwMCwgMCwgMCksCisJMywgNSwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgNTAwLCAwKSwKKwk2LCA2LCBUTFZfREJfU0NBTEVfSVRFTSg0NDAwLCAwLCAwKSwKKwk3LCA3LCBUTFZfREJfU0NBTEVfSVRFTSg1MDAwLCAwLCAwKSwKKwk4LCA4LCBUTFZfREJfU0NBTEVfSVRFTSg1MjAwLCAwLCAwKSwKK307CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2RtaWNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcnQ1NjMxLT5kbWljX3VzZWRfZmxhZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9kbWljX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlydDU2MzEtPmRtaWNfdXNlZF9mbGFnID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKKy8qIE1JQyBJbnB1dCBUeXBlICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2lucHV0X21vZGVbXSA9IHsKKwkiU2luZ2xlIGVuZGVkIiwgIkRpZmZlcmVudGlhbCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX21pYzFfbW9kZV9lbnVtLCBSVDU2MzFfTUlDX0NUUkxfMSwKKwlSVDU2MzFfTUlDMV9ESUZGX0lOUFVUX1NISUZULCBydDU2MzFfaW5wdXRfbW9kZSk7CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfbWljMl9tb2RlX2VudW0sIFJUNTYzMV9NSUNfQ1RSTF8xLAorCVJUNTYzMV9NSUMyX0RJRkZfSU5QVVRfU0hJRlQsIHJ0NTYzMV9pbnB1dF9tb2RlKTsKKworLyogTU9OTyBJbnB1dCBUeXBlICovCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX21vbm9pbl9tb2RlX2VudW0sIFJUNTYzMV9NT05PX0lOUFVUX1ZPTCwKKwlSVDU2MzFfTU9OT19ESUZGX0lOUFVUX1NISUZULCBydDU2MzFfaW5wdXRfbW9kZSk7CisKKy8qIFNQSyBSYXRpbyBHYWluIENvbnRyb2wgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfc3BrX3JhdGlvW10gPSB7IjEuMDB4IiwgIjEuMDl4IiwgIjEuMjd4IiwgIjEuNDR4IiwKKwkJCSIxLjU2eCIsICIxLjY4eCIsICIxLjk5eCIsICIyLjM0eCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX3Nwa19yYXRpb19lbnVtLCBSVDU2MzFfR0VOX1BVUl9DVFJMX1JFRywKKwlSVDU2MzFfU1BLX0FNUF9SQVRJT19DVFJMX1NISUZULCBydDU2MzFfc3BrX3JhdGlvKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zbmRfY29udHJvbHNbXSA9IHsKKwkvKiBNSUMgKi8KKwlTT0NfRU5VTSgiTUlDMSBNb2RlIENvbnRyb2wiLCAgcnQ1NjMxX21pYzFfbW9kZV9lbnVtKSwKKwlTT0NfU0lOR0xFX1RMVigiTUlDMSBCb29zdCIsIFJUNTYzMV9NSUNfQ1RSTF8yLAorCQlSVDU2MzFfTUlDMV9CT09TVF9TSElGVCwgOCwgMCwgbWljX2JzdF90bHYpLAorCVNPQ19FTlVNKCJNSUMyIE1vZGUgQ29udHJvbCIsIHJ0NTYzMV9taWMyX21vZGVfZW51bSksCisJU09DX1NJTkdMRV9UTFYoIk1JQzIgQm9vc3QiLCBSVDU2MzFfTUlDX0NUUkxfMiwKKwkJUlQ1NjMxX01JQzJfQk9PU1RfU0hJRlQsIDgsIDAsIG1pY19ic3RfdGx2KSwKKwkvKiBNT05PIElOICovCisJU09DX0VOVU0oIk1PTk9JTiBNb2RlIENvbnRyb2wiLCBydDU2MzFfbW9ub2luX21vZGVfZW51bSksCisJU09DX0RPVUJMRV9UTFYoIk1PTk9JTl9SWCBDYXB0dXJlIFZvbHVtZSIsIFJUNTYzMV9NT05PX0lOUFVUX1ZPTCwKKwkJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQkJUlQ1NjMxX1ZPTF9NQVNLLCAxLCBpbl92b2xfdGx2KSwKKwkvKiBBWEkgKi8KKwlTT0NfRE9VQkxFX1RMVigiQVhJIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjMxX0FVWF9JTl9WT0wsCisJCQlSVDU2MzFfTF9WT0xfU0hJRlQsIFJUNTYzMV9SX1ZPTF9TSElGVCwKKwkJCVJUNTYzMV9WT0xfTUFTSywgMSwgaW5fdm9sX3RsdiksCisJLyogREFDICovCisJU09DX0RPVUJMRV9UTFYoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMiwKKwkJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQkJUlQ1NjMxX0RBQ19WT0xfTUFTSywgMSwgZGFjX3ZvbF90bHYpLAorCVNPQ19ET1VCTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMSwKKwkJCVJUNTYzMV9MX01VVEVfU0hJRlQsIFJUNTYzMV9SX01VVEVfU0hJRlQsIDEsIDEpLAorCS8qIEFYTyAqLworCVNPQ19TSU5HTEUoIkFYTzEgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0wsCisJCQkJUlQ1NjMxX0xfTVVURV9TSElGVCwgMSwgMSksCisJU09DX1NJTkdMRSgiQVhPMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCQlSVDU2MzFfUl9WT0xfU0hJRlQsIDEsIDEpLAorCS8qIE9VVFZPTCAqLworCVNPQ19ET1VCTEUoIk9VVFZPTCBDaGFubmVsIFN3aXRjaCIsIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwkJUlQ1NjMxX0xfRU5fU0hJRlQsIFJUNTYzMV9SX0VOX1NISUZULCAxLCAwKSwKKworCS8qIFNQSyAqLworCVNPQ19ET1VCTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX1NQS19PVVRfVk9MLAorCQlSVDU2MzFfTF9NVVRFX1NISUZULCBSVDU2MzFfUl9NVVRFX1NISUZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBSVDU2MzFfU1BLX09VVF9WT0wsCisJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULCAzOSwgMSwgb3V0X3ZvbF90bHYpLAorCS8qIE1PTk8gT1VUICovCisJU09DX1NJTkdMRSgiTU9OTyBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwkJCQlSVDU2MzFfTVVURV9NT05PX1NISUZULCAxLCAxKSwKKwkvKiBIUCAqLworCVNPQ19ET1VCTEUoIkhQIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQlSVDU2MzFfTF9NVVRFX1NISUZULCBSVDU2MzFfUl9NVVRFX1NISUZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiSFAgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjMxX0hQX09VVF9WT0wsCisJCVJUNTYzMV9MX1ZPTF9TSElGVCwgUlQ1NjMxX1JfVk9MX1NISUZULAorCQlSVDU2MzFfVk9MX01BU0ssIDEsIG91dF92b2xfdGx2KSwKKwkvKiBETUlDICovCisJU09DX1NJTkdMRV9FWFQoIkRNSUMgU3dpdGNoIiwgMCwgMCwgMSwgMCwKKwkJcnQ1NjMxX2RtaWNfZ2V0LCBydDU2MzFfZG1pY19wdXQpLAorCVNPQ19ET1VCTEUoIkRNSUMgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfRElHX01JQ19DVFJMLAorCQlSVDU2MzFfRE1JQ19MX0NIX01VVEVfU0hJRlQsCisJCVJUNTYzMV9ETUlDX1JfQ0hfTVVURV9TSElGVCwgMSwgMSksCisKKwkvKiBTUEsgUmF0aW8gR2FpbiBDb250cm9sICovCisJU09DX0VOVU0oIlNQSyBSYXRpbyBDb250cm9sIiwgcnQ1NjMxX3Nwa19yYXRpb19lbnVtKSwKK307CisKK3N0YXRpYyBpbnQgY2hlY2tfc3lzY2xrMV9zb3VyY2Uoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9HTE9CQUxfQ0xLX0NUUkwpOworCXJldHVybiByZWcgJiBSVDU2MzFfU1lTQ0xLX1NPVVJfU0VMX1BMTDsKK30KKworc3RhdGljIGludCBjaGVja19kbWljX3VzZWQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoc291cmNlLT5jb2RlYyk7CisJcmV0dXJuIHJ0NTYzMS0+ZG1pY191c2VkX2ZsYWc7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGFjbF90b19vdXRtaXhsKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHNuZF9zb2NfcmVhZChzb3VyY2UtPmNvZGVjLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9EQUNfTF9UT19PVVRNSVhFUl9MKTsKK30KKworc3RhdGljIGludCBjaGVja19kYWNyX3RvX291dG1peHIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwpOworCXJldHVybiAhKHJlZyAmIFJUNTYzMV9NX0RBQ19SX1RPX09VVE1JWEVSX1IpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2RhY2xfdG9fc3BrbWl4bChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoc291cmNlLT5jb2RlYywgUlQ1NjMxX1NQS19NSVhFUl9DVFJMKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9EQUNfTF9UT19TUEtNSVhFUl9MKTsKK30KKworc3RhdGljIGludCBjaGVja19kYWNyX3RvX3Nwa21peHIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCk7CisJcmV0dXJuICEocmVnICYgUlQ1NjMxX01fREFDX1JfVE9fU1BLTUlYRVJfUik7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYWRjbF9zZWxlY3Qoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnID0gc25kX3NvY19yZWFkKHNvdXJjZS0+Y29kZWMsIFJUNTYzMV9BRENfUkVDX01JWEVSKTsKKwlyZXR1cm4gIShyZWcgJiBSVDU2MzFfTV9NSUMxX1RPX1JFQ01JWEVSX0wpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkY3Jfc2VsZWN0KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IHNuZF9zb2NfcmVhZChzb3VyY2UtPmNvZGVjLCBSVDU2MzFfQURDX1JFQ19NSVhFUik7CisJcmV0dXJuICEocmVnICYgUlQ1NjMxX01fTUlDMl9UT19SRUNNSVhFUl9SKTsKK30KKworLyoqCisgKiBvbmViaXRfZGVwb3BfcG93ZXJfc3RhZ2UgLSBhdXRvIGRlcG9wIGluIHBvd2VyIHN0YWdlLgorICogQGVuYWJsZTogcG93ZXIgb24vb2ZmCisgKgorICogV2hlbiBwb3dlciBvbi9vZmYgaGVhZHBob25lLCB0aGUgZGVwb3Agc2VxdWVuY2UgaXMgZG9uZSBieSBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQgb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZW5hYmxlIG9uZS1iaXQgZGVwb3AgZnVuY3Rpb24gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgMCk7CisKKwkvKiBrZWVwIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzb2Z0X3ZvbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMLCAwKTsKKwlocF96YyA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjICYgMHhmN2ZmKTsKKwlpZiAoZW5hYmxlKSB7CisJCS8qIGNvbmZpZyBvbmUtYml0IGRlcG9wIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9URVNUX01PREVfQ1RSTCwgMHg4NGMwKTsKKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfU1BLX0lOVExfQ1RSTCwgMHgzMDlmKTsKKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfQ1BfSU5UTF9SRUcyLCAweDY1MzApOworCQkvKiBwb3dlciBvbiBjYXBsZXNzIGJsb2NrICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yLAorCQkJCVJUNTYzMV9FTl9DQVBfRlJFRV9ERVBPUCk7CisJfSBlbHNlIHsKKwkJLyogcG93ZXIgb2ZmIGNhcGxlc3MgYmxvY2sgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzIsIDApOworCQltc2xlZXAoMTAwKTsKKwl9CisKKwkvKiByZWNvdmVyIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCwgc29mdF92b2wpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwgaHBfemMpOworfQorCisvKioKKyAqIG9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlIC0gYXV0byBkZXBvcCBpbiBtdXRlIHN0YWdlLgorICogQGVuYWJsZTogbXV0ZS91bm11dGUKKyAqCisgKiBXaGVuIG11dGUvdW5tdXRlIGhlYWRwaG9uZSwgdGhlIGRlcG9wIHNlcXVlbmNlIGlzIGRvbmUgYnkgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIG9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZW5hYmxlIG9uZS1iaXQgZGVwb3AgZnVuY3Rpb24gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgMCk7CisKKwkvKiBrZWVwIHNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzaW5nIHNldHRpbmcgKi8KKwlzb2Z0X3ZvbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMLCAwKTsKKwlocF96YyA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjICYgMHhmN2ZmKTsKKwlpZiAoZW5hYmxlKSB7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJLyogY29uZmlnIG9uZS1iaXQgZGVwb3AgcGFyYW1ldGVyICovCisJCXJ0NTYzMV93cml0ZV9pbmRleChjb2RlYywgUlQ1NjMxX1NQS19JTlRMX0NUUkwsIDB4MzA3Zik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFLCAwKTsKKwkJbXNsZWVwKDMwMCk7CisJfSBlbHNlIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0hQX09VVF9WT0wsCisJCQlSVDU2MzFfTF9NVVRFIHwgUlQ1NjMxX1JfTVVURSwKKwkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFKTsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworLyoqCisgKiBvbmViaXRfZGVwb3BfcG93ZXJfc3RhZ2UgLSBzdGVwIGJ5IHN0ZXAgZGVwb3Agc2VxdWVuY2UgaW4gcG93ZXIgc3RhZ2UuCisgKiBAZW5hYmxlOiBwb3dlciBvbi9vZmYKKyAqCisgKiBXaGVuIHBvd2VyIG9uL29mZiBoZWFkcGhvbmUsIHRoZSBkZXBvcCBzZXF1ZW5jZSBpcyBkb25lIGluIHN0ZXAgYnkgc3RlcC4KKyAqLworc3RhdGljIHZvaWQgZGVwb3Bfc2VxX3Bvd2VyX3N0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgc29mdF92b2wsIGhwX3pjOworCisJLyogZGVwb3AgY29udHJvbCBieSByZWdpc3RlciAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8yLAorCQlSVDU2MzFfRU5fT05FX0JJVF9ERVBPUCwgUlQ1NjMxX0VOX09ORV9CSVRfREVQT1ApOworCisJLyoga2VlcCBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc29mdF92b2wgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9TT0ZUX1ZPTF9DVFJMKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCwgMCk7CisJaHBfemMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMik7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLCBocF96YyAmIDB4ZjdmZik7CisJaWYgKGVuYWJsZSkgeworCQkvKiBjb25maWcgZGVwb3Agc2VxdWVuY2UgcGFyYW1ldGVyICovCisJCXJ0NTYzMV93cml0ZV9pbmRleChjb2RlYywgUlQ1NjMxX1NQS19JTlRMX0NUUkwsIDB4MzAzZSk7CisKKwkJLyogcG93ZXIgb24gaGVhZHBob25lIGFuZCBjaGFyZ2UgcHVtcCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX0NIQVJHRV9QVU1QIHwgUlQ1NjMxX1BXUl9IUF9MX0FNUCB8CisJCQlSVDU2MzFfUFdSX0hQX1JfQU1QLAorCQkJUlQ1NjMxX1BXUl9DSEFSR0VfUFVNUCB8IFJUNTYzMV9QV1JfSFBfTF9BTVAgfAorCQkJUlQ1NjMxX1BXUl9IUF9SX0FNUCk7CisKKwkJLyogcG93ZXIgb24gc29mdCBnZW5lcmF0b3IgYW5kIGRlcG9wIG1vZGUyICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8xLAorCQkJUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTiB8IFJUNTYzMV9FTl9ERVBPUDJfRk9SX0hQKTsKKwkJbXNsZWVwKDEwMCk7CisKKwkJLyogc3RvcCBkZXBvcCBtb2RlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCVJUNTYzMV9QV1JfSFBfREVQT1BfRElTLCBSVDU2MzFfUFdSX0hQX0RFUE9QX0RJUyk7CisJfSBlbHNlIHsKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9TUEtfSU5UTF9DVFJMLCAweDMwM0YpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fTVVURV9VTk1VVEVfREVQT1AgfAorCQkJUlQ1NjMxX1BEX0hQQU1QX0xfU1RfVVAgfCBSVDU2MzFfUERfSFBBTVBfUl9TVF9VUCk7CisJCW1zbGVlcCg3NSk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9ERVBPUF9GVU5fQ1RSTF8xLAorCQkJUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTiB8IFJUNTYzMV9QRF9IUEFNUF9MX1NUX1VQIHwKKwkJCVJUNTYzMV9QRF9IUEFNUF9SX1NUX1VQKTsKKworCQkvKiBzdGFydCBkZXBvcCBtb2RlICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCQlSVDU2MzFfUFdSX0hQX0RFUE9QX0RJUywgMCk7CisKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fREVQT1AyX0ZPUl9IUCB8CisJCQlSVDU2MzFfUERfSFBBTVBfTF9TVF9VUCB8IFJUNTYzMV9QRF9IUEFNUF9SX1NUX1VQKTsKKwkJbXNsZWVwKDgwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzEsCisJCQlSVDU2MzFfUE9XX09OX1NPRlRfR0VOKTsKKworCQkvKiBwb3dlciBkb3duIGhlYWRwaG9uZSBhbmQgY2hhcmdlIHB1bXAgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJUlQ1NjMxX1BXUl9DSEFSR0VfUFVNUCB8IFJUNTYzMV9QV1JfSFBfTF9BTVAgfAorCQkJUlQ1NjMxX1BXUl9IUF9SX0FNUCwgMCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworLyoqCisgKiBkZXBvcF9zZXFfbXV0ZV9zdGFnZSAtIHN0ZXAgYnkgc3RlcCBkZXBvcCBzZXF1ZW5jZSBpbiBtdXRlIHN0YWdlLgorICogQGVuYWJsZTogbXV0ZS91bm11dGUKKyAqCisgKiBXaGVuIG11dGUvdW5tdXRlIGhlYWRwaG9uZSwgdGhlIGRlcG9wIHNlcXVlbmNlIGlzIGRvbmUgaW4gc3RlcCBieSBzdGVwLgorICovCitzdGF0aWMgdm9pZCBkZXBvcF9zZXFfbXV0ZV9zdGFnZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHNvZnRfdm9sLCBocF96YzsKKworCS8qIGRlcG9wIGNvbnRyb2wgYnkgcmVnaXN0ZXIgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMiwKKwkJUlQ1NjMxX0VOX09ORV9CSVRfREVQT1AsIFJUNTYzMV9FTl9PTkVfQklUX0RFUE9QKTsKKworCS8qIGtlZXAgc29mdCB2b2x1bWUgYW5kIHplcm8gY3Jvc3Npbmcgc2V0dGluZyAqLworCXNvZnRfdm9sID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2MzFfU09GVF9WT0xfQ1RSTCk7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIDApOworCWhwX3pjID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwgaHBfemMgJiAweGY3ZmYpOworCWlmIChlbmFibGUpIHsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMCkpOworCisJCS8qIGNvbmZpZyBkZXBvcCBzZXF1ZW5jZSBwYXJhbWV0ZXIgKi8KKwkJcnQ1NjMxX3dyaXRlX2luZGV4KGNvZGVjLCBSVDU2MzFfU1BLX0lOVExfQ1RSTCwgMHgzMDJmKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0RFUE9QX0ZVTl9DVFJMXzEsCisJCQlSVDU2MzFfUE9XX09OX1NPRlRfR0VOIHwgUlQ1NjMxX0VOX01VVEVfVU5NVVRFX0RFUE9QIHwKKwkJCVJUNTYzMV9FTl9IUF9SX01fVU5fTVVURV9ERVBPUCB8CisJCQlSVDU2MzFfRU5fSFBfTF9NX1VOX01VVEVfREVQT1ApOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9IUF9PVVRfVk9MLAorCQkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFLCAwKTsKKwkJbXNsZWVwKDE2MCk7CisJfSBlbHNlIHsKKwkJLyogY29uZmlnIGRlcG9wIHNlcXVlbmNlIHBhcmFtZXRlciAqLworCQlydDU2MzFfd3JpdGVfaW5kZXgoY29kZWMsIFJUNTYzMV9TUEtfSU5UTF9DVFJMLCAweDMwMmYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMSwKKwkJCVJUNTYzMV9QT1dfT05fU09GVF9HRU4gfCBSVDU2MzFfRU5fTVVURV9VTk1VVEVfREVQT1AgfAorCQkJUlQ1NjMxX0VOX0hQX1JfTV9VTl9NVVRFX0RFUE9QIHwKKwkJCVJUNTYzMV9FTl9IUF9MX01fVU5fTVVURV9ERVBPUCk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0hQX09VVF9WT0wsCisJCQlSVDU2MzFfTF9NVVRFIHwgUlQ1NjMxX1JfTVVURSwKKwkJCVJUNTYzMV9MX01VVEUgfCBSVDU2MzFfUl9NVVRFKTsKKwkJbXNsZWVwKDE1MCk7CisJfQorCisJLyogcmVjb3ZlciBzb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zc2luZyBzZXR0aW5nICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1NPRlRfVk9MX0NUUkwsIHNvZnRfdm9sKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsIGhwX3pjKTsKK30KKworc3RhdGljIGludCBocF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJaWYgKHJ0NTYzMS0+Y29kZWNfdmVyc2lvbikgeworCQkJb25lYml0X2RlcG9wX211dGVfc3RhZ2UoY29kZWMsIDApOworCQkJb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKGNvZGVjLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWRlcG9wX3NlcV9tdXRlX3N0YWdlKGNvZGVjLCAwKTsKKwkJCWRlcG9wX3NlcV9wb3dlcl9zdGFnZShjb2RlYywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKHJ0NTYzMS0+Y29kZWNfdmVyc2lvbikgeworCQkJb25lYml0X2RlcG9wX3Bvd2VyX3N0YWdlKGNvZGVjLCAxKTsKKwkJCW9uZWJpdF9kZXBvcF9tdXRlX3N0YWdlKGNvZGVjLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWRlcG9wX3NlcV9wb3dlcl9zdGFnZShjb2RlYywgMSk7CisJCQlkZXBvcF9zZXFfbXV0ZV9zdGFnZShjb2RlYywgMSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZG1pY19wYXJhbXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChydDU2MzEtPnJ4X3JhdGUpIHsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19DTEtfQ1RSTF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMzJGUyk7CisJCWJyZWFrOworCisJY2FzZSAzMjAwMDoKKwljYXNlIDIyMDUwOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfRElHX01JQ19DVFJMLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfTUFTSywKKwkJCVJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzY0RlMpOworCQlicmVhazsKKworCWNhc2UgMTYwMDA6CisJY2FzZSAxMTAyNToKKwljYXNlIDgwMDA6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19DTEtfQ1RSTF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMTI4RlMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3JlY21peGxfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWEwgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX09VVE1JWExfUkVDTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NSUMxX1JFQ01JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSUxWT0wgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX0FYSUxfUkVDTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NT05PX0lOX1JFQ01JWExfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfcmVjbWl4cl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NT05PX0lOX1JFQ01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSVJWT0wgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX0FYSVJfUkVDTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMl9CU1QyIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjMxX0FEQ19SRUNfTUlYRVIsCisJCQlSVDU2MzFfTV9NSUMyX1JFQ01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWFIgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2MzFfQURDX1JFQ19NSVhFUiwKKwkJCVJUNTYzMV9NX09VVE1JWFJfUkVDTUlYUl9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGttaXhsX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX1JFQ01JWExfU1BLTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9QIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX01JQzFQX1NQS01JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX1NQS19NSVhFUl9DVFJMLAorCQkJUlQ1NjMxX01fREFDTF9TUEtNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX09VVE1JWExfU1BLTUlYTF9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGttaXhyX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX09VVE1JWFJfU1BLTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01JWEVSX0NUUkwsCisJCQlSVDU2MzFfTV9EQUNSX1NQS01JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfUCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01JWEVSX0NUUkwsCisJCQlSVDU2MzFfTV9NSUMyUF9TUEtNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTCwKKwkJCVJUNTYzMV9NX1JFQ01JWFJfU1BLTUlYUl9CSVQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXRtaXhsX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYTF9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYUl9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9MX0NUUkwsCisJCQkJUlQ1NjMxX01fREFDTF9PVVRNSVhMX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJNSUMxX0JTVDEgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMxX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMLAorCQkJCVJUNTYzMV9NX01JQzJfT1VUTUlYTF9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYUCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfTF9DVFJMLAorCQkJCVJUNTYzMV9NX01PTk9fSU5QX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSUxWT0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9BWElMX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFYSVJWT0wgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9BWElSX09VVE1JWExfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlZEQUMgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTCwKKwkJCQlSVDU2MzFfTV9WREFDX09VVE1JWExfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfb3V0bWl4cl9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiVkRBQyBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX1ZEQUNfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQVhJUlZPTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX0FYSVJfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQVhJTFZPTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX0FYSUxfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTU9OT0lOX1JYTiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX01PTk9fSU5OX09VVE1JWFJfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfT1VUTUlYRVJfUl9DVFJMLAorCQkJCVJUNTYzMV9NX01JQzJfT1VUTUlYUl9CSVQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMV9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fREFDUl9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYUl9PVVRNSVhSX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9PVVRNSVhFUl9SX0NUUkwsCisJCQkJUlQ1NjMxX01fUkVDTUlYTF9PVVRNSVhSX0JJVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX0FYTzFNSVhfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfQVhPMU1JWEVSX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMV9BWE8xTUlYX0JJVCAsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiTUlDMl9CU1QyIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8xTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMyX0FYTzFNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVFZPTEwgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMLAorCQkJCVJUNTYzMV9NX09VVE1JWExfQVhPMU1JWF9CSVQgLCAxICwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8xTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRNSVhSX0FYTzFNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfQVhPMk1JWF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8yTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9NSUMxX0FYTzJNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfQVhPMk1JWEVSX0NUUkwsCisJCQkJUlQ1NjMxX01fTUlDMl9BWE8yTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xMIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9BWE8yTUlYRVJfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRNSVhMX0FYTzJNSVhfQklULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVFZPTFIgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjMxX0FYTzJNSVhFUl9DVFJMLAorCQkJCVJUNTYzMV9NX09VVE1JWFJfQVhPMk1JWF9CSVQsIDEgLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3BvbG1peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fU1BLVk9MTF9TUE9MTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJTUEtWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9TUEtWT0xSX1NQT0xNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3Bvcm1peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fU1BLVk9MTF9TUE9STUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJTUEtWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9TUEtWT0xSX1NQT1JNSVhfQklULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfbW9ub21peF9taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiT1VUVk9MTCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2MzFfU1BLX01PTk9fT1VUX0NUUkwsCisJCQkJUlQ1NjMxX01fT1VUVk9MTF9NT05PTUlYX0JJVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsIFJUNTYzMV9TUEtfTU9OT19PVVRfQ1RSTCwKKwkJCQlSVDU2MzFfTV9PVVRWT0xSX01PTk9NSVhfQklULCAxLCAxKSwKK307CisKKy8qIExlZnQgU1BLIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xsX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWEwifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcGt2b2xsX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwlSVDU2MzFfTF9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbGxfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGt2b2xsX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJMZWZ0IFNQS1ZPTCBTUkMiLCBydDU2MzFfc3Brdm9sbF9lbnVtKTsKKworLyogTGVmdCBIUCBWb2x1bWUgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfaHB2b2xsX3NlbFtdID0geyJWbWlkIiwgIk9VVE1JWEwifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9ocHZvbGxfZW51bSwgUlQ1NjMxX0hQX09VVF9WT0wsCisJUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9ocHZvbGxfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocHZvbGxfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIkxlZnQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9sbF9lbnVtKTsKKworLyogTGVmdCBPdXQgVm9sdW1lIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX291dHZvbGxfc2VsW10gPSB7IlZtaWQiLCAiT1VUTUlYTCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX291dHZvbGxfZW51bSwgUlQ1NjMxX01PTk9fQVhPXzFfMl9WT0wsCisJUlQ1NjMxX0xfRU5fU0hJRlQsIHJ0NTYzMV9vdXR2b2xsX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfb3V0dm9sbF9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBPVVRWT0wgU1JDIiwgcnQ1NjMxX291dHZvbGxfZW51bSk7CisKKy8qIFJpZ2h0IE91dCBWb2x1bWUgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfb3V0dm9scl9zZWxbXSA9IHsiVm1pZCIsICJPVVRNSVhSIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfb3V0dm9scl9lbnVtLCBSVDU2MzFfTU9OT19BWE9fMV8yX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX291dHZvbHJfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9vdXR2b2xyX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBPVVRWT0wgU1JDIiwgcnQ1NjMxX291dHZvbHJfZW51bSk7CisKKy8qIFJpZ2h0IEhQIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9ocHZvbHJfc2VsW10gPSB7IlZtaWQiLCAiT1VUTUlYUiJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX2hwdm9scl9lbnVtLCBSVDU2MzFfSFBfT1VUX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX2hwdm9scl9zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX2hwdm9scl9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiUmlnaHQgSFBWT0wgU1JDIiwgcnQ1NjMxX2hwdm9scl9lbnVtKTsKKworLyogUmlnaHQgU1BLIFZvbHVtZSBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9zcGt2b2xyX3NlbFtdID0geyJWbWlkIiwgIlNQS01JWFIifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcGt2b2xyX2VudW0sIFJUNTYzMV9TUEtfT1VUX1ZPTCwKKwlSVDU2MzFfUl9FTl9TSElGVCwgcnQ1NjMxX3Nwa3ZvbHJfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9zcGt2b2xyX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBTUEtWT0wgU1JDIiwgcnQ1NjMxX3Nwa3ZvbHJfZW51bSk7CisKKy8qIFNQTyBMZWZ0IENoYW5uZWwgSW5wdXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpydDU2MzFfc3BvbF9zcmNfc2VsW10gPSB7CisJIlNQT0xNSVgiLCAiTU9OT0lOX1JYIiwgIlZEQUMiLCAiREFDTCJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX3Nwb2xfc3JjX2VudW0sIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTCwKKwlSVDU2MzFfU1BLX0xfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX3Nwb2xfc3JjX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfc3BvbF9tdXhfY29udHJvbCA9CisJU09DX0RBUE1fRU5VTSgiU1BPTCBTUkMiLCBydDU2MzFfc3BvbF9zcmNfZW51bSk7CisKKy8qIFNQTyBSaWdodCBDaGFubmVsIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX3Nwb3Jfc3JjX3NlbFtdID0geworCSJTUE9STUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIiwgIkRBQ1IifTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKAorCXJ0NTYzMV9zcG9yX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJUlQ1NjMxX1NQS19SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9zcG9yX3NyY19zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX3Nwb3JfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIlNQT1IgU1JDIiwgcnQ1NjMxX3Nwb3Jfc3JjX2VudW0pOworCisvKiBNT05PIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX21vbm9fc3JjX3NlbFtdID0geyJNT05PTUlYIiwgIk1PTk9JTl9SWCIsICJWREFDIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfbW9ub19zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAorCVJUNTYzMV9NT05PX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9tb25vX3NyY19zZWwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjMxX21vbm9fbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIk1PTk8gU1JDIiwgcnQ1NjMxX21vbm9fc3JjX2VudW0pOworCisvKiBMZWZ0IEhQTyBJbnB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKnJ0NTYzMV9ocGxfc3JjX3NlbFtdID0geyJMZWZ0IEhQVk9MIiwgIkxlZnQgREFDIn07CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTCgKKwlydDU2MzFfaHBsX3NyY19lbnVtLCBSVDU2MzFfU1BLX01PTk9fSFBfT1VUX0NUUkwsCisJUlQ1NjMxX0hQX0xfTVVYX1NFTF9TSElGVCwgcnQ1NjMxX2hwbF9zcmNfc2VsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYzMV9ocGxfbXV4X2NvbnRyb2wgPQorCVNPQ19EQVBNX0VOVU0oIkhQTCBTUkMiLCBydDU2MzFfaHBsX3NyY19lbnVtKTsKKworLyogUmlnaHQgSFBPIElucHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqcnQ1NjMxX2hwcl9zcmNfc2VsW10gPSB7IlJpZ2h0IEhQVk9MIiwgIlJpZ2h0IERBQyJ9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woCisJcnQ1NjMxX2hwcl9zcmNfZW51bSwgUlQ1NjMxX1NQS19NT05PX0hQX09VVF9DVFJMLAorCVJUNTYzMV9IUF9SX01VWF9TRUxfU0hJRlQsIHJ0NTYzMV9ocHJfc3JjX3NlbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MzFfaHByX211eF9jb250cm9sID0KKwlTT0NfREFQTV9FTlVNKCJIUFIgU1JDIiwgcnQ1NjMxX2hwcl9zcmNfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2MzFfZGFwbV93aWRnZXRzW10gPSB7CisJLyogVm1pZCAqLworCVNORF9TT0NfREFQTV9WTUlEKCJWbWlkIiksCisJLyogUExMMSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlBMTDEiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX1BMTDFfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIElucHV0IFNpZGUgKi8KKwkvKiBJbnB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVhJTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVhJUiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTU9OT0lOX1JYTiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTU9OT0lOX1JYUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQyIpLAorCisJLyogTUlDQklBUyAqLworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUMgQmlhczEiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTF9CSVQsIDApLAorCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUMgQmlhczIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTF9CSVQsIDApLAorCisJLyogQm9vc3QgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJNSUMxIEJvb3N0IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9NSUMxX0JPT1RfR0FJTl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1JQzIgQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQzJfQk9PVF9HQUlOX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTU9OT0lOX1JYUCBCb29zdCIsIFJUNTYzMV9QV1JfTUFOQUdfQURENCwKKwkJCVJUNTYzMV9QV1JfTU9OT19JTl9QX1ZPTF9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIk1PTk9JTl9SWE4gQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX01PTk9fSU5fTl9WT0xfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJBWElMIEJvb3N0IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9BWElMX0lOX1ZPTF9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkFYSVIgQm9vc3QiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX0FYSVJfSU5fVk9MX0JJVCwgMCwgTlVMTCwgMCksCisKKwkvKiBNT05PIEluICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJNT05PX0lOIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIFJFQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYTCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwKKwkJUlQ1NjMxX1BXUl9SRUNNSVhFUl9MX0JJVCwgMCwKKwkJJnJ0NTYzMV9yZWNtaXhsX21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKHJ0NTYzMV9yZWNtaXhsX21peGVyX2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVhSIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQlSVDU2MzFfUFdSX1JFQ01JWEVSX1JfQklULCAwLAorCQkmcnQ1NjMxX3JlY21peHJfbWl4ZXJfY29udHJvbHNbMF0sCisJCUFSUkFZX1NJWkUocnQ1NjMxX3JlY21peHJfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBCZWNhdXNlIG9mIHJlY29yZCBkdXBsaWNhdGlvbiBmb3IgTC9SIGNoYW5uZWwsCisJICogTC9SIEFEQ3MgbmVlZCBwb3dlciB1cCBhdCB0aGUgc2FtZSB0aW1lICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJBREMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogRE1JQyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRNSUMgU3VwcGx5IiwgUlQ1NjMxX0RJR19NSUNfQ1RSTCwKKwkJUlQ1NjMxX0RNSUNfRU5BX1NISUZULCAwLAorCQlzZXRfZG1pY19wYXJhbXMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKKwkvKiBBREMgRGF0YSBTcm91Y2UgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMZWZ0IEFEQyBTZWxlY3QiLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsCisJCQlSVDU2MzFfQURDX0RBVEFfU0VMX01JQzFfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJpZ2h0IEFEQyBTZWxlY3QiLCBSVDU2MzFfSU5UX1NUX0lSUV9DVFJMXzIsCisJCQlSVDU2MzFfQURDX0RBVEFfU0VMX01JQzJfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDcyAqLworCVNORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgIkhJRkkgQ2FwdHVyZSIsCisJCVJUNTYzMV9QV1JfTUFOQUdfQUREMSwgUlQ1NjMxX1BXUl9BRENfTF9DTEtfQklULCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiSElGSSBDYXB0dXJlIiwKKwkJUlQ1NjMxX1BXUl9NQU5BR19BREQxLCBSVDU2MzFfUFdSX0FEQ19SX0NMS19CSVQsIDApLAorCisJLyogREFDIGFuZCBBREMgc3VwcGx5IHBvd2VyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQxLAorCQkJUlQ1NjMxX1BXUl9NQUlOX0kyU19CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkRBQyBSRUYiLCBSVDU2MzFfUFdSX01BTkFHX0FERDEsCisJCQlSVDU2MzFfUFdSX0RBQ19SRUZfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIE91dHB1dCBTaWRlICovCisJLyogREFDcyAqLworCVNORF9TT0NfREFQTV9EQUMoIkxlZnQgREFDIiwgIkhJRkkgUGxheWJhY2siLAorCQlSVDU2MzFfUFdSX01BTkFHX0FERDEsIFJUNTYzMV9QV1JfREFDX0xfQ0xLX0JJVCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiUmlnaHQgREFDIiwgIkhJRkkgUGxheWJhY2siLAorCQlSVDU2MzFfUFdSX01BTkFHX0FERDEsIFJUNTYzMV9QV1JfREFDX1JfQ0xLX0JJVCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiVm9pY2UgREFDIiwgIlZvaWNlIERBQyBNb25vIFBsYXliYWNrIiwKKwkJCQlTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlZvaWNlIERBQyBCb29zdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJLyogREFDIHN1cHBseSBwb3dlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxlZnQgREFDIFRvIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQxLAorCQkJUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJpZ2h0IERBQyBUbyBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMSwKKwkJCVJUNTYzMV9QV1JfREFDX1JfVE9fTUlYRVJfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIExlZnQgU1BLIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUEtNSVhMIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9TUEtNSVhFUl9MX0JJVCwgMCwKKwkJCSZydDU2MzFfc3BrbWl4bF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX3Nwa21peGxfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBMZWZ0IE91dCBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT1VUTUlYTCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwKKwkJCVJUNTYzMV9QV1JfT1VUTUlYRVJfTF9CSVQsIDAsCisJCQkmcnQ1NjMxX291dG1peGxfbWl4ZXJfY29udHJvbHNbMF0sCisJCQlBUlJBWV9TSVpFKHJ0NTYzMV9vdXRtaXhsX21peGVyX2NvbnRyb2xzKSksCisJLyogUmlnaHQgT3V0IE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJPVVRNSVhSIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQyLAorCQkJUlQ1NjMxX1BXUl9PVVRNSVhFUl9SX0JJVCwgMCwKKwkJCSZydDU2MzFfb3V0bWl4cl9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX291dG1peHJfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBSaWdodCBTUEsgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNQS01JWFIgTWl4ZXIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX1NQS01JWEVSX1JfQklULCAwLAorCQkJJnJ0NTYzMV9zcGttaXhyX21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfc3BrbWl4cl9taXhlcl9jb250cm9scykpLAorCisJLyogVm9sdW1lIE11eCAqLworCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgU1BLVk9MIE11eCIsIFJUNTYzMV9QV1JfTUFOQUdfQURENCwKKwkJCVJUNTYzMV9QV1JfU1BLX0xfVk9MX0JJVCwgMCwKKwkJCSZydDU2MzFfc3Brdm9sbF9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBIUFZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX0hQX0xfT1VUX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX2hwdm9sbF9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiTGVmdCBPVVRWT0wgTXV4IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9MT1VUX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX291dHZvbGxfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IE9VVFZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX1JPVVRfVk9MX0JJVCwgMCwKKwkJCSZydDU2MzFfb3V0dm9scl9tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgSFBWT0wgTXV4IiwgUlQ1NjMxX1BXUl9NQU5BR19BREQ0LAorCQkJUlQ1NjMxX1BXUl9IUF9SX09VVF9WT0xfQklULCAwLAorCQkJJnJ0NTYzMV9ocHZvbHJfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IFNQS1ZPTCBNdXgiLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsCisJCQlSVDU2MzFfUFdSX1NQS19SX1ZPTF9CSVQsIDAsCisJCQkmcnQ1NjMxX3Nwa3ZvbHJfbXV4X2NvbnRyb2wpLAorCisJLyogREFDIFRvIEhQICovCisJU05EX1NPQ19EQVBNX1BHQV9TKCJMZWZ0IERBQ19IUCIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQV9TKCJSaWdodCBEQUNfSFAiLCAwLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogSFAgRGVwb3AgKi8KKwlTTkRfU09DX0RBUE1fUEdBX1MoIkhQIERlcG9wIiwgMSwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlocF9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJLyogQVhPMSBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiQVhPMU1JWCBNaXhlciIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMywKKwkJCVJUNTYzMV9QV1JfQVhPMU1JWEVSX0JJVCwgMCwKKwkJCSZydDU2MzFfQVhPMU1JWF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX0FYTzFNSVhfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBTUE9MIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUE9MTUlYIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9zcG9sbWl4X21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfc3BvbG1peF9taXhlcl9jb250cm9scykpLAorCS8qIE1PTk8gTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1PTk9NSVggTWl4ZXIiLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX01PTk9NSVhFUl9CSVQsIDAsCisJCQkmcnQ1NjMxX21vbm9taXhfbWl4ZXJfY29udHJvbHNbMF0sCisJCQlBUlJBWV9TSVpFKHJ0NTYzMV9tb25vbWl4X21peGVyX2NvbnRyb2xzKSksCisJLyogU1BPUiBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1BPUk1JWCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfc3Bvcm1peF9taXhlcl9jb250cm9sc1swXSwKKwkJCUFSUkFZX1NJWkUocnQ1NjMxX3Nwb3JtaXhfbWl4ZXJfY29udHJvbHMpKSwKKwkvKiBBWE8yIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJBWE8yTUlYIE1peGVyIiwgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJUlQ1NjMxX1BXUl9BWE8yTUlYRVJfQklULCAwLAorCQkJJnJ0NTYzMV9BWE8yTUlYX21peGVyX2NvbnRyb2xzWzBdLAorCQkJQVJSQVlfU0laRShydDU2MzFfQVhPMk1JWF9taXhlcl9jb250cm9scykpLAorCisJLyogTXV4ICovCisJU05EX1NPQ19EQVBNX01VWCgiU1BPTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcnQ1NjMxX3Nwb2xfbXV4X2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlNQT1IgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9zcG9yX211eF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJNT05PIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfbW9ub19tdXhfY29udHJvbCksCisJU05EX1NPQ19EQVBNX01VWCgiSFBMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2MzFfaHBsX211eF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJIUFIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJnJ0NTYzMV9ocHJfbXV4X2NvbnRyb2wpLAorCisJLyogQU1QIHN1cHBseSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1PTk8gRGVwb3AiLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQlSVDU2MzFfUFdSX01PTk9fREVQT1BfRElTX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQ2xhc3MgRCIsIFJUNTYzMV9QV1JfTUFOQUdfQUREMSwKKwkJCVJUNTYzMV9QV1JfQ0xBU1NfRF9CSVQsIDAsIE5VTEwsIDApLAorCisJLyogT3V0cHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQVVYTzEiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJBVVhPMiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQT0wiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUE9SIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT1IiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNT05PIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2MzFfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7Ik1JQzEgQm9vc3QiLCBOVUxMLCAiTUlDMSJ9LAorCXsiTUlDMiBCb29zdCIsIE5VTEwsICJNSUMyIn0sCisJeyJNT05PSU5fUlhQIEJvb3N0IiwgTlVMTCwgIk1PTk9JTl9SWFAifSwKKwl7Ik1PTk9JTl9SWE4gQm9vc3QiLCBOVUxMLCAiTU9OT0lOX1JYTiJ9LAorCXsiQVhJTCBCb29zdCIsIE5VTEwsICJBWElMIn0sCisJeyJBWElSIEJvb3N0IiwgTlVMTCwgIkFYSVIifSwKKworCXsiTU9OT19JTiIsIE5VTEwsICJNT05PSU5fUlhQIEJvb3N0In0sCisJeyJNT05PX0lOIiwgTlVMTCwgIk1PTk9JTl9SWE4gQm9vc3QifSwKKworCXsiUkVDTUlYTCBNaXhlciIsICJPVVRNSVhMIENhcHR1cmUgU3dpdGNoIiwgIk9VVE1JWEwgTWl4ZXIifSwKKwl7IlJFQ01JWEwgTWl4ZXIiLCAiTUlDMV9CU1QxIENhcHR1cmUgU3dpdGNoIiwgIk1JQzEgQm9vc3QifSwKKwl7IlJFQ01JWEwgTWl4ZXIiLCAiQVhJTFZPTCBDYXB0dXJlIFN3aXRjaCIsICJBWElMIEJvb3N0In0sCisJeyJSRUNNSVhMIE1peGVyIiwgIk1PTk9JTl9SWCBDYXB0dXJlIFN3aXRjaCIsICJNT05PX0lOIn0sCisKKwl7IlJFQ01JWFIgTWl4ZXIiLCAiT1VUTUlYUiBDYXB0dXJlIFN3aXRjaCIsICJPVVRNSVhSIE1peGVyIn0sCisJeyJSRUNNSVhSIE1peGVyIiwgIk1JQzJfQlNUMiBDYXB0dXJlIFN3aXRjaCIsICJNSUMyIEJvb3N0In0sCisJeyJSRUNNSVhSIE1peGVyIiwgIkFYSVJWT0wgQ2FwdHVyZSBTd2l0Y2giLCAiQVhJUiBCb29zdCJ9LAorCXsiUkVDTUlYUiBNaXhlciIsICJNT05PSU5fUlggQ2FwdHVyZSBTd2l0Y2giLCAiTU9OT19JTiJ9LAorCisJeyJBREMgTWl4ZXIiLCBOVUxMLCAiUkVDTUlYTCBNaXhlciJ9LAorCXsiQURDIE1peGVyIiwgTlVMTCwgIlJFQ01JWFIgTWl4ZXIifSwKKworCXsiTGVmdCBBREMiLCBOVUxMLCAiQURDIE1peGVyIn0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJMZWZ0IEFEQyBTZWxlY3QiLCBjaGVja19hZGNsX3NlbGVjdH0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJQTEwxIiwgY2hlY2tfc3lzY2xrMV9zb3VyY2V9LAorCXsiTGVmdCBBREMiLCBOVUxMLCAiSTJTIn0sCisJeyJMZWZ0IEFEQyIsIE5VTEwsICJEQUMgUkVGIn0sCisKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJBREMgTWl4ZXIifSwKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJSaWdodCBBREMgU2VsZWN0IiwgY2hlY2tfYWRjcl9zZWxlY3R9LAorCXsiUmlnaHQgQURDIiwgTlVMTCwgIlBMTDEiLCBjaGVja19zeXNjbGsxX3NvdXJjZX0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiSTJTIn0sCisJeyJSaWdodCBBREMiLCBOVUxMLCAiREFDIFJFRiJ9LAorCisJeyJETUlDIiwgTlVMTCwgIkRNSUMgU3VwcGx5IiwgY2hlY2tfZG1pY191c2VkfSwKKwl7IkxlZnQgQURDIiwgTlVMTCwgIkRNSUMifSwKKwl7IlJpZ2h0IEFEQyIsIE5VTEwsICJETUlDIn0sCisKKwl7IkxlZnQgREFDIiwgTlVMTCwgIlBMTDEiLCBjaGVja19zeXNjbGsxX3NvdXJjZX0sCisJeyJMZWZ0IERBQyIsIE5VTEwsICJJMlMifSwKKwl7IkxlZnQgREFDIiwgTlVMTCwgIkRBQyBSRUYifSwKKwl7IlJpZ2h0IERBQyIsIE5VTEwsICJQTEwxIiwgY2hlY2tfc3lzY2xrMV9zb3VyY2V9LAorCXsiUmlnaHQgREFDIiwgTlVMTCwgIkkyUyJ9LAorCXsiUmlnaHQgREFDIiwgTlVMTCwgIkRBQyBSRUYifSwKKworCXsiVm9pY2UgREFDIEJvb3N0IiwgTlVMTCwgIlZvaWNlIERBQyJ9LAorCisJeyJTUEtNSVhMIE1peGVyIiwgTlVMTCwgIkxlZnQgREFDIFRvIE1peGVyIiwgY2hlY2tfZGFjbF90b19zcGttaXhsfSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiUkVDTUlYTCBQbGF5YmFjayBTd2l0Y2giLCAiUkVDTUlYTCBNaXhlciJ9LAorCXsiU1BLTUlYTCBNaXhlciIsICJNSUMxX1AgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzEifSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiREFDTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBEQUMifSwKKwl7IlNQS01JWEwgTWl4ZXIiLCAiT1VUTUlYTCBQbGF5YmFjayBTd2l0Y2giLCAiT1VUTUlYTCBNaXhlciJ9LAorCisJeyJTUEtNSVhSIE1peGVyIiwgTlVMTCwgIlJpZ2h0IERBQyBUbyBNaXhlciIsIGNoZWNrX2RhY3JfdG9fc3BrbWl4cn0sCisJeyJTUEtNSVhSIE1peGVyIiwgIk9VVE1JWFIgUGxheWJhY2sgU3dpdGNoIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlNQS01JWFIgTWl4ZXIiLCAiREFDUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJTUEtNSVhSIE1peGVyIiwgIk1JQzJfUCBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMiJ9LAorCXsiU1BLTUlYUiBNaXhlciIsICJSRUNNSVhSIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhSIE1peGVyIn0sCisKKwl7Ik9VVE1JWEwgTWl4ZXIiLCBOVUxMLCAiTGVmdCBEQUMgVG8gTWl4ZXIiLCBjaGVja19kYWNsX3RvX291dG1peGx9LAorCXsiT1VUTUlYTCBNaXhlciIsICJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhMIE1peGVyIn0sCisJeyJPVVRNSVhMIE1peGVyIiwgIlJFQ01JWFIgUGxheWJhY2sgU3dpdGNoIiwgIlJFQ01JWFIgTWl4ZXIifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiREFDTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBEQUMifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiTUlDMV9CU1QxIFBsYXliYWNrIFN3aXRjaCIsICJNSUMxIEJvb3N0In0sCisJeyJPVVRNSVhMIE1peGVyIiwgIk1JQzJfQlNUMiBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMiBCb29zdCJ9LAorCXsiT1VUTUlYTCBNaXhlciIsICJNT05PSU5fUlhQIFBsYXliYWNrIFN3aXRjaCIsICJNT05PSU5fUlhQIEJvb3N0In0sCisJeyJPVVRNSVhMIE1peGVyIiwgIkFYSUxWT0wgUGxheWJhY2sgU3dpdGNoIiwgIkFYSUwgQm9vc3QifSwKKwl7Ik9VVE1JWEwgTWl4ZXIiLCAiQVhJUlZPTCBQbGF5YmFjayBTd2l0Y2giLCAiQVhJUiBCb29zdCJ9LAorCXsiT1VUTUlYTCBNaXhlciIsICJWREFDIFBsYXliYWNrIFN3aXRjaCIsICJWb2ljZSBEQUMgQm9vc3QifSwKKworCXsiT1VUTUlYUiBNaXhlciIsIE5VTEwsICJSaWdodCBEQUMgVG8gTWl4ZXIiLCBjaGVja19kYWNyX3RvX291dG1peHJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJSRUNNSVhMIFBsYXliYWNrIFN3aXRjaCIsICJSRUNNSVhMIE1peGVyIn0sCisJeyJPVVRNSVhSIE1peGVyIiwgIlJFQ01JWFIgUGxheWJhY2sgU3dpdGNoIiwgIlJFQ01JWFIgTWl4ZXIifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiREFDUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJPVVRNSVhSIE1peGVyIiwgIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMSBCb29zdCJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJNSUMyX0JTVDIgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzIgQm9vc3QifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiTU9OT0lOX1JYTiBQbGF5YmFjayBTd2l0Y2giLCAiTU9OT0lOX1JYTiBCb29zdCJ9LAorCXsiT1VUTUlYUiBNaXhlciIsICJBWElMVk9MIFBsYXliYWNrIFN3aXRjaCIsICJBWElMIEJvb3N0In0sCisJeyJPVVRNSVhSIE1peGVyIiwgIkFYSVJWT0wgUGxheWJhY2sgU3dpdGNoIiwgIkFYSVIgQm9vc3QifSwKKwl7Ik9VVE1JWFIgTWl4ZXIiLCAiVkRBQyBQbGF5YmFjayBTd2l0Y2giLCAiVm9pY2UgREFDIEJvb3N0In0sCisKKwl7IkxlZnQgU1BLVk9MIE11eCIsICAiU1BLTUlYTCIsICJTUEtNSVhMIE1peGVyIn0sCisJeyJMZWZ0IFNQS1ZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiTGVmdCBIUFZPTCBNdXgiLCAgIk9VVE1JWEwiLCAiT1VUTUlYTCBNaXhlciJ9LAorCXsiTGVmdCBIUFZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiTGVmdCBPVVRWT0wgTXV4IiwgICJPVVRNSVhMIiwgIk9VVE1JWEwgTWl4ZXIifSwKKwl7IkxlZnQgT1VUVk9MIE11eCIsICAiVm1pZCIsICJWbWlkIn0sCisJeyJSaWdodCBPVVRWT0wgTXV4IiwgICJPVVRNSVhSIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IE9VVFZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCXsiUmlnaHQgSFBWT0wgTXV4IiwgICJPVVRNSVhSIiwgIk9VVE1JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IEhQVk9MIE11eCIsICAiVm1pZCIsICJWbWlkIn0sCisJeyJSaWdodCBTUEtWT0wgTXV4IiwgICJTUEtNSVhSIiwgIlNQS01JWFIgTWl4ZXIifSwKKwl7IlJpZ2h0IFNQS1ZPTCBNdXgiLCAgIlZtaWQiLCAiVm1pZCJ9LAorCisJeyJBWE8xTUlYIE1peGVyIiwgIk1JQzFfQlNUMSBQbGF5YmFjayBTd2l0Y2giLCAiTUlDMSBCb29zdCJ9LAorCXsiQVhPMU1JWCBNaXhlciIsICJPVVRWT0xMIFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IE9VVFZPTCBNdXgifSwKKwl7IkFYTzFNSVggTWl4ZXIiLCAiT1VUVk9MUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgT1VUVk9MIE11eCJ9LAorCXsiQVhPMU1JWCBNaXhlciIsICJNSUMyX0JTVDIgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzIgQm9vc3QifSwKKworCXsiQVhPMk1JWCBNaXhlciIsICJNSUMxX0JTVDEgUGxheWJhY2sgU3dpdGNoIiwgIk1JQzEgQm9vc3QifSwKKwl7IkFYTzJNSVggTWl4ZXIiLCAiT1VUVk9MTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBPVVRWT0wgTXV4In0sCisJeyJBWE8yTUlYIE1peGVyIiwgIk9VVFZPTFIgUGxheWJhY2sgU3dpdGNoIiwgIlJpZ2h0IE9VVFZPTCBNdXgifSwKKwl7IkFYTzJNSVggTWl4ZXIiLCAiTUlDMl9CU1QyIFBsYXliYWNrIFN3aXRjaCIsICJNSUMyIEJvb3N0In0sCisKKwl7IlNQT0xNSVggTWl4ZXIiLCAiU1BLVk9MTCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBTUEtWT0wgTXV4In0sCisJeyJTUE9MTUlYIE1peGVyIiwgIlNQS1ZPTFIgUGxheWJhY2sgU3dpdGNoIiwgIlJpZ2h0IFNQS1ZPTCBNdXgifSwKKworCXsiU1BPUk1JWCBNaXhlciIsICJTUEtWT0xMIFBsYXliYWNrIFN3aXRjaCIsICJMZWZ0IFNQS1ZPTCBNdXgifSwKKwl7IlNQT1JNSVggTWl4ZXIiLCAiU1BLVk9MUiBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgU1BLVk9MIE11eCJ9LAorCisJeyJNT05PTUlYIE1peGVyIiwgIk9VVFZPTEwgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgT1VUVk9MIE11eCJ9LAorCXsiTU9OT01JWCBNaXhlciIsICJPVVRWT0xSIFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBPVVRWT0wgTXV4In0sCisKKwl7IlNQT0wgTXV4IiwgIlNQT0xNSVgiLCAiU1BPTE1JWCBNaXhlciJ9LAorCXsiU1BPTCBNdXgiLCAiTU9OT0lOX1JYIiwgIk1PTk9fSU4ifSwKKwl7IlNQT0wgTXV4IiwgIlZEQUMiLCAiVm9pY2UgREFDIEJvb3N0In0sCisJeyJTUE9MIE11eCIsICJEQUNMIiwgIkxlZnQgREFDIn0sCisKKwl7IlNQT1IgTXV4IiwgIlNQT1JNSVgiLCAiU1BPUk1JWCBNaXhlciJ9LAorCXsiU1BPUiBNdXgiLCAiTU9OT0lOX1JYIiwgIk1PTk9fSU4ifSwKKwl7IlNQT1IgTXV4IiwgIlZEQUMiLCAiVm9pY2UgREFDIEJvb3N0In0sCisJeyJTUE9SIE11eCIsICJEQUNSIiwgIlJpZ2h0IERBQyJ9LAorCisJeyJNT05PIE11eCIsICJNT05PTUlYIiwgIk1PTk9NSVggTWl4ZXIifSwKKwl7Ik1PTk8gTXV4IiwgIk1PTk9JTl9SWCIsICJNT05PX0lOIn0sCisJeyJNT05PIE11eCIsICJWREFDIiwgIlZvaWNlIERBQyBCb29zdCJ9LAorCisJeyJSaWdodCBEQUNfSFAiLCBOVUxMLCAiUmlnaHQgREFDIn0sCisJeyJMZWZ0IERBQ19IUCIsIE5VTEwsICJMZWZ0IERBQyJ9LAorCisJeyJIUEwgTXV4IiwgIkxlZnQgSFBWT0wiLCAiTGVmdCBIUFZPTCBNdXgifSwKKwl7IkhQTCBNdXgiLCAiTGVmdCBEQUMiLCAiTGVmdCBEQUNfSFAifSwKKwl7IkhQUiBNdXgiLCAiUmlnaHQgSFBWT0wiLCAiUmlnaHQgSFBWT0wgTXV4In0sCisJeyJIUFIgTXV4IiwgIlJpZ2h0IERBQyIsICJSaWdodCBEQUNfSFAifSwKKworCXsiSFAgRGVwb3AiLCBOVUxMLCAiSFBMIE11eCJ9LAorCXsiSFAgRGVwb3AiLCBOVUxMLCAiSFBSIE11eCJ9LAorCisJeyJBVVhPMSIsIE5VTEwsICJBWE8xTUlYIE1peGVyIn0sCisJeyJBVVhPMiIsIE5VTEwsICJBWE8yTUlYIE1peGVyIn0sCisKKwl7IlNQT0wiLCBOVUxMLCAiQ2xhc3MgRCJ9LAorCXsiU1BPTCIsIE5VTEwsICJTUE9MIE11eCJ9LAorCXsiU1BPUiIsIE5VTEwsICJDbGFzcyBEIn0sCisJeyJTUE9SIiwgTlVMTCwgIlNQT1IgTXV4In0sCisKKwl7IkhQT0wiLCBOVUxMLCAiSFAgRGVwb3AifSwKKwl7IkhQT1IiLCBOVUxMLCAiSFAgRGVwb3AifSwKKworCXsiTU9OTyIsIE5VTEwsICJNT05PIERlcG9wIn0sCisJeyJNT05PIiwgTlVMTCwgIk1PTk8gTXV4In0sCit9OworCitzdHJ1Y3QgY29lZmZfY2xrX2RpdiB7CisJdTMyIG1jbGs7CisJdTMyIGJjbGs7CisJdTMyIHJhdGU7CisJdTE2IHJlZ192YWw7Cit9OworCisvKiBQTEwgZGl2aXNvcnMgKi8KK3N0cnVjdCBwbGxfZGl2IHsKKwl1MzIgcGxsX2luOworCXUzMiBwbGxfb3V0OworCXUxNiByZWdfdmFsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGxfZGl2IGNvZGVjX21hc3Rlcl9wbGxfZGl2W10gPSB7CisJezIwNDgwMDAsICA4MTkyMDAwLCAgMHgwZWEwfSwKKwl7MzY4NjQwMCwgIDgxOTIwMDAsICAweDRlMjd9LAorCXsxMjAwMDAwMCwgIDgxOTIwMDAsICAweDQ1NmJ9LAorCXsxMzAwMDAwMCwgIDgxOTIwMDAsICAweDQ5NWZ9LAorCXsxMzEwMDAwMCwgIDgxOTIwMDAsICAweDAzMjB9LAorCXsyMDQ4MDAwLCAgMTEyODk2MDAsICAweGY2Mzd9LAorCXszNjg2NDAwLCAgMTEyODk2MDAsICAweDJmMjJ9LAorCXsxMjAwMDAwMCwgIDExMjg5NjAwLCAgMHgzZTJmfSwKKwl7MTMwMDAwMDAsICAxMTI4OTYwMCwgIDB4NGQ1Yn0sCisJezEzMTAwMDAwLCAgMTEyODk2MDAsICAweDM2M2J9LAorCXsyMDQ4MDAwLCAgMTYzODQwMDAsICAweDFlYTB9LAorCXszNjg2NDAwLCAgMTYzODQwMDAsICAweDllMjd9LAorCXsxMjAwMDAwMCwgIDE2Mzg0MDAwLCAgMHg0NTJifSwKKwl7MTMwMDAwMDAsICAxNjM4NDAwMCwgIDB4NTQyZn0sCisJezEzMTAwMDAwLCAgMTYzODQwMDAsICAweDAzYTB9LAorCXsyMDQ4MDAwLCAgMTY5MzQ0MDAsICAweGU2MjV9LAorCXszNjg2NDAwLCAgMTY5MzQ0MDAsICAweDkxMjZ9LAorCXsxMjAwMDAwMCwgIDE2OTM0NDAwLCAgMHg0ZDJjfSwKKwl7MTMwMDAwMDAsICAxNjkzNDQwMCwgIDB4NzQyZn0sCisJezEzMTAwMDAwLCAgMTY5MzQ0MDAsICAweDNjMjd9LAorCXsyMDQ4MDAwLCAgMjI1NzkyMDAsICAweDJhYTB9LAorCXszNjg2NDAwLCAgMjI1NzkyMDAsICAweDJmMjB9LAorCXsxMjAwMDAwMCwgIDIyNTc5MjAwLCAgMHg3ZTJmfSwKKwl7MTMwMDAwMDAsICAyMjU3OTIwMCwgIDB4NzQyZn0sCisJezEzMTAwMDAwLCAgMjI1NzkyMDAsICAweDNjMjd9LAorCXsyMDQ4MDAwLCAgMjQ1NzYwMDAsICAweDJlYTB9LAorCXszNjg2NDAwLCAgMjQ1NzYwMDAsICAweGVlMjd9LAorCXsxMjAwMDAwMCwgIDI0NTc2MDAwLCAgMHgyOTE1fSwKKwl7MTMwMDAwMDAsICAyNDU3NjAwMCwgIDB4NzcyZX0sCisJezEzMTAwMDAwLCAgMjQ1NzYwMDAsICAweDBkMjB9LAorCXsyNjAwMDAwMCwgIDI0NTc2MDAwLCAgMHgyMDI3fSwKKwl7MjYwMDAwMDAsICAyMjU3OTIwMCwgIDB4MzkyZn0sCisJezI0NTc2MDAwLCAgMjI1NzkyMDAsICAweDA5MjF9LAorCXsyNDU3NjAwMCwgIDI0NTc2MDAwLCAgMHgwMmEwfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxsX2RpdiBjb2RlY19zbGF2ZV9wbGxfZGl2W10gPSB7CisJezI1NjAwMCwgIDIwNDgwMDAsICAweDQ2ZjB9LAorCXsyNTYwMDAsICA0MDk2MDAwLCAgMHgzZWEwfSwKKwl7MzUyODAwLCAgNTY0NDgwMCwgIDB4M2VhMH0sCisJezUxMjAwMCwgIDgxOTIwMDAsICAweDNlYTB9LAorCXsxMDI0MDAwLCAgODE5MjAwMCwgIDB4NDZmMH0sCisJezcwNTYwMCwgIDExMjg5NjAwLCAgMHgzZWEwfSwKKwl7MTAyNDAwMCwgIDE2Mzg0MDAwLCAgMHgzZWEwfSwKKwl7MTQxMTIwMCwgIDIyNTc5MjAwLCAgMHgzZWEwfSwKKwl7MTUzNjAwMCwgIDI0NTc2MDAwLCAgMHgzZWEwfSwKKwl7MjA0ODAwMCwgIDE2Mzg0MDAwLCAgMHgxZWEwfSwKKwl7MjgyMjQwMCwgIDIyNTc5MjAwLCAgMHgxZWEwfSwKKwl7MjgyMjQwMCwgIDQ1MTU4NDAwLCAgMHg1ZWMwfSwKKwl7NTY0NDgwMCwgIDQ1MTU4NDAwLCAgMHg0NmYwfSwKKwl7MzA3MjAwMCwgIDI0NTc2MDAwLCAgMHgxZWEwfSwKKwl7MzA3MjAwMCwgIDQ5MTUyMDAwLCAgMHg1ZWMwfSwKKwl7NjE0NDAwMCwgIDQ5MTUyMDAwLCAgMHg0NmYwfSwKKwl7NzA1NjAwLCAgMTEyODk2MDAsICAweDNlYTB9LAorCXs3MDU2MDAsICA4NDY3MjAwLCAgMHgzYWIwfSwKKwl7MjQ1NzYwMDAsICAyNDU3NjAwMCwgIDB4MDJhMH0sCisJezE0MTEyMDAsICAxMTI4OTYwMCwgIDB4MTY5MH0sCisJezI4MjI0MDAsICAxMTI4OTYwMCwgIDB4MGE5MH0sCisJezE1MzYwMDAsICAxMjI4ODAwMCwgIDB4MTY5MH0sCisJezMwNzIwMDAsICAxMjI4ODAwMCwgIDB4MGE5MH0sCit9OworCitzdGF0aWMgc3RydWN0IGNvZWZmX2Nsa19kaXYgY29lZmZfZGl2W10gPSB7CisJLyogc3lzY2xrIGlzIDI1NmZzICovCisJezIwNDgwMDAsICA4MDAwICogMzIsICA4MDAwLCAweDEwMDB9LAorCXsyMDQ4MDAwLCAgODAwMCAqIDY0LCAgODAwMCwgMHgwMDAwfSwKKwl7MjgyMjQwMCwgIDExMDI1ICogMzIsICAxMTAyNSwgIDB4MTAwMH0sCisJezI4MjI0MDAsICAxMTAyNSAqIDY0LCAgMTEwMjUsICAweDAwMDB9LAorCXs0MDk2MDAwLCAgMTYwMDAgKiAzMiwgIDE2MDAwLCAgMHgxMDAwfSwKKwl7NDA5NjAwMCwgIDE2MDAwICogNjQsICAxNjAwMCwgIDB4MDAwMH0sCisJezU2NDQ4MDAsICAyMjA1MCAqIDMyLCAgMjIwNTAsICAweDEwMDB9LAorCXs1NjQ0ODAwLCAgMjIwNTAgKiA2NCwgIDIyMDUwLCAgMHgwMDAwfSwKKwl7ODE5MjAwMCwgIDMyMDAwICogMzIsICAzMjAwMCwgIDB4MTAwMH0sCisJezgxOTIwMDAsICAzMjAwMCAqIDY0LCAgMzIwMDAsICAweDAwMDB9LAorCXsxMTI4OTYwMCwgIDQ0MTAwICogMzIsICA0NDEwMCwgIDB4MTAwMH0sCisJezExMjg5NjAwLCAgNDQxMDAgKiA2NCwgIDQ0MTAwLCAgMHgwMDAwfSwKKwl7MTIyODgwMDAsICA0ODAwMCAqIDMyLCAgNDgwMDAsICAweDEwMDB9LAorCXsxMjI4ODAwMCwgIDQ4MDAwICogNjQsICA0ODAwMCwgIDB4MDAwMH0sCisJezIyNTc5MjAwLCAgODgyMDAgKiAzMiwgIDg4MjAwLCAgMHgxMDAwfSwKKwl7MjI1NzkyMDAsICA4ODIwMCAqIDY0LCAgODgyMDAsICAweDAwMDB9LAorCXsyNDU3NjAwMCwgIDk2MDAwICogMzIsICA5NjAwMCwgIDB4MTAwMH0sCisJezI0NTc2MDAwLCAgOTYwMDAgKiA2NCwgIDk2MDAwLCAgMHgwMDAwfSwKKwkvKiBzeXNjbGsgaXMgNTEyZnMgKi8KKwl7NDA5NjAwMCwgIDgwMDAgKiAzMiwgIDgwMDAsIDB4MzAwMH0sCisJezQwOTYwMDAsICA4MDAwICogNjQsICA4MDAwLCAweDIwMDB9LAorCXs1NjQ0ODAwLCAgMTEwMjUgKiAzMiwgIDExMDI1LCAweDMwMDB9LAorCXs1NjQ0ODAwLCAgMTEwMjUgKiA2NCwgIDExMDI1LCAweDIwMDB9LAorCXs4MTkyMDAwLCAgMTYwMDAgKiAzMiwgIDE2MDAwLCAweDMwMDB9LAorCXs4MTkyMDAwLCAgMTYwMDAgKiA2NCwgIDE2MDAwLCAweDIwMDB9LAorCXsxMTI4OTYwMCwgIDIyMDUwICogMzIsICAyMjA1MCwgMHgzMDAwfSwKKwl7MTEyODk2MDAsICAyMjA1MCAqIDY0LCAgMjIwNTAsIDB4MjAwMH0sCisJezE2Mzg0MDAwLCAgMzIwMDAgKiAzMiwgIDMyMDAwLCAweDMwMDB9LAorCXsxNjM4NDAwMCwgIDMyMDAwICogNjQsICAzMjAwMCwgMHgyMDAwfSwKKwl7MjI1NzkyMDAsICA0NDEwMCAqIDMyLCAgNDQxMDAsIDB4MzAwMH0sCisJezIyNTc5MjAwLCAgNDQxMDAgKiA2NCwgIDQ0MTAwLCAweDIwMDB9LAorCXsyNDU3NjAwMCwgIDQ4MDAwICogMzIsICA0ODAwMCwgMHgzMDAwfSwKKwl7MjQ1NzYwMDAsICA0ODAwMCAqIDY0LCAgNDgwMDAsIDB4MjAwMH0sCisJezQ1MTU4NDAwLCAgODgyMDAgKiAzMiwgIDg4MjAwLCAweDMwMDB9LAorCXs0NTE1ODQwMCwgIDg4MjAwICogNjQsICA4ODIwMCwgMHgyMDAwfSwKKwl7NDkxNTIwMDAsICA5NjAwMCAqIDMyLCAgOTYwMDAsIDB4MzAwMH0sCisJezQ5MTUyMDAwLCAgOTYwMDAgKiA2NCwgIDk2MDAwLCAweDIwMDB9LAorCS8qIHN5c2NsayBpcyAyNC41NzZNaHogb3IgMjIuNTc5Mk1oeiAqLworCXsyNDU3NjAwMCwgIDgwMDAgKiAzMiwgIDgwMDAsICAweDcwODB9LAorCXsyNDU3NjAwMCwgIDgwMDAgKiA2NCwgIDgwMDAsICAweDYwODB9LAorCXsyNDU3NjAwMCwgIDE2MDAwICogMzIsICAxNjAwMCwgIDB4NTA4MH0sCisJezI0NTc2MDAwLCAgMTYwMDAgKiA2NCwgIDE2MDAwLCAgMHg0MDgwfSwKKwl7MjQ1NzYwMDAsICAyNDAwMCAqIDMyLCAgMjQwMDAsICAweDUwMDB9LAorCXsyNDU3NjAwMCwgIDI0MDAwICogNjQsICAyNDAwMCwgIDB4NDAwMH0sCisJezI0NTc2MDAwLCAgMzIwMDAgKiAzMiwgIDMyMDAwLCAgMHgzMDgwfSwKKwl7MjQ1NzYwMDAsICAzMjAwMCAqIDY0LCAgMzIwMDAsICAweDIwODB9LAorCXsyMjU3OTIwMCwgIDExMDI1ICogMzIsICAxMTAyNSwgIDB4NzAwMH0sCisJezIyNTc5MjAwLCAgMTEwMjUgKiA2NCwgIDExMDI1LCAgMHg2MDAwfSwKKwl7MjI1NzkyMDAsICAyMjA1MCAqIDMyLCAgMjIwNTAsICAweDUwMDB9LAorCXsyMjU3OTIwMCwgIDIyMDUwICogNjQsICAyMjA1MCwgIDB4NDAwMH0sCit9OworCitzdGF0aWMgaW50IGdldF9jb2VmZihpbnQgbWNsaywgaW50IHJhdGUsIGludCB0aW1lc29mYmNsaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLm1jbGsgPT0gbWNsayAmJiBjb2VmZl9kaXZbaV0ucmF0ZSA9PSByYXRlICYmCisJCQkoY29lZmZfZGl2W2ldLmJjbGsgLyBjb2VmZl9kaXZbaV0ucmF0ZSkgPT0gdGltZXNvZmJjbGspCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2hpZmlfcGNtX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBydDU2MzFfcHJpdiAqcnQ1NjMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHRpbWVzb2ZiY2xrID0gMzIsIGNvZWZmOworCXVuc2lnbmVkIGludCBpZmFjZSA9IDA7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJlbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcnQ1NjMxLT5iY2xrX3JhdGUgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJaWYgKHJ0NTYzMS0+YmNsa19yYXRlIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsIHRvIGdldCBCQ0xLIHJhdGVcbiIpOworCQlyZXR1cm4gcnQ1NjMxLT5iY2xrX3JhdGU7CisJfQorCXJ0NTYzMS0+cnhfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKKwlpZiAocnQ1NjMxLT5tYXN0ZXIpCisJCWNvZWZmID0gZ2V0X2NvZWZmKHJ0NTYzMS0+c3lzY2xrLCBydDU2MzEtPnJ4X3JhdGUsCisJCQlydDU2MzEtPmJjbGtfcmF0ZSAvIHJ0NTYzMS0+cnhfcmF0ZSk7CisJZWxzZQorCQljb2VmZiA9IGdldF9jb2VmZihydDU2MzEtPnN5c2NsaywgcnQ1NjMxLT5yeF9yYXRlLAorCQkJCQl0aW1lc29mYmNsayk7CisJaWYgKGNvZWZmIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsIHRvIGdldCBjb2VmZlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RMXzIwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19ETF8yNDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1M4OgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19ETF84OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfU0RQX0NUUkwsCisJCVJUNTYzMV9TRFBfSTJTX0RMX01BU0ssIGlmYWNlKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU1RFUkVPX0FEX0RBX0NMS19DVFJMLAorCQkJCQljb2VmZl9kaXZbY29lZmZdLnJlZ192YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX2hpZmlfY29kZWNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCQkJCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgaWZhY2UgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCXJ0NTYzMS0+bWFzdGVyID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX01PREVfU0VMX1NMQVZFOworCQlydDU2MzEtPm1hc3RlciA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RGX0xFRlQ7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCWlmYWNlIHw9IFJUNTYzMV9TRFBfSTJTX0RGX1BDTV9BOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlpZmFjZSAgfD0gUlQ1NjMxX1NEUF9JMlNfREZfUENNX0I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlpZmFjZSB8PSBSVDU2MzFfU0RQX0kyU19CQ0xLX1BPTF9DVFJMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfU0RQX0NUUkwsIGlmYWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9oaWZpX2NvZGVjX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgImVudGVyICVzLCBzeWNsaz0lZFxuIiwgX19mdW5jX18sIGZyZXEpOworCisJaWYgKChmcmVxID49ICgyNTYgKiA4MDAwKSkgJiYgKGZyZXEgPD0gKDUxMiAqIDk2MDAwKSkpIHsKKwkJcnQ1NjMxLT5zeXNjbGsgPSBmcmVxOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBydDU2MzFfY29kZWNfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBwbGxfaWQsCisJCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjMxX3ByaXYgKnJ0NTYzMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBpLCByZXQgPSAtRUlOVkFMOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUExMIGRpc2FibGVkXG4iKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfR0xPQkFMX0NMS19DVFJMLAorCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9NQVNLLAorCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9NQ0xLKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocnQ1NjMxLT5tYXN0ZXIpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29kZWNfbWFzdGVyX3BsbF9kaXYpOyBpKyspCisJCQlpZiAoZnJlcV9pbiA9PSBjb2RlY19tYXN0ZXJfcGxsX2RpdltpXS5wbGxfaW4gJiYKKwkJCWZyZXFfb3V0ID09IGNvZGVjX21hc3Rlcl9wbGxfZGl2W2ldLnBsbF9vdXQpIHsKKwkJCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJCQkiY2hhbmdlIFBMTCBpbiBtYXN0ZXIgbW9kZVxuIik7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1BMTF9DVFJMLAorCQkJCQljb2RlY19tYXN0ZXJfcGxsX2RpdltpXS5yZWdfdmFsKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgKKwkJCQkJbXNlY3NfdG9famlmZmllcygyMCkpOworCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCVJUNTYzMV9HTE9CQUxfQ0xLX0NUUkwsCisJCQkJCVJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUFTSyB8CisJCQkJCVJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUFTSywKKwkJCQkJUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9QTEwgfAorCQkJCQlSVDU2MzFfUExMQ0xLX1NPVVJfU0VMX01DTEspOworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29kZWNfc2xhdmVfcGxsX2Rpdik7IGkrKykKKwkJCWlmIChmcmVxX2luID09IGNvZGVjX3NsYXZlX3BsbF9kaXZbaV0ucGxsX2luICYmCisJCQlmcmVxX291dCA9PSBjb2RlY19zbGF2ZV9wbGxfZGl2W2ldLnBsbF9vdXQpIHsKKwkJCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAorCQkJCQkiY2hhbmdlIFBMTCBpbiBzbGF2ZSBtb2RlXG4iKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUExMX0NUUkwsCisJCQkJCWNvZGVjX3NsYXZlX3BsbF9kaXZbaV0ucmVnX3ZhbCk7CisJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApKTsKKwkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAorCQkJCQlSVDU2MzFfR0xPQkFMX0NMS19DVFJMLAorCQkJCQlSVDU2MzFfU1lTQ0xLX1NPVVJfU0VMX01BU0sgfAorCQkJCQlSVDU2MzFfUExMQ0xLX1NPVVJfU0VMX01BU0ssCisJCQkJCVJUNTYzMV9TWVNDTEtfU09VUl9TRUxfUExMIHwKKwkJCQkJUlQ1NjMxX1BMTENMS19TT1VSX1NFTF9CQ0xLKTsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDIsCisJCQlSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTCB8IFJUNTYzMV9QV1JfTUlDQklBUzJfVk9MLAorCQkJUlQ1NjMxX1BXUl9NSUNCSUFTMV9WT0wgfCBSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLAorCQkJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTLAorCQkJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTKTsKKwkJCW1zbGVlcCg4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCQkJUlQ1NjMxX1BXUl9GQVNUX1ZSRUZfQ1RSTCwKKwkJCQlSVDU2MzFfUFdSX0ZBU1RfVlJFRl9DVFJMKTsKKwkJCWNvZGVjLT5jYWNoZV9vbmx5ID0gZmFsc2U7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDEsIDB4MDAwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTYzMV9QV1JfTUFOQUdfQUREMiwgMHgwMDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX1BXUl9NQU5BR19BREQzLCAweDAwMDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDQsIDB4MDAwMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTYzMV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZhbCA9IHJ0NTYzMV9yZWFkX2luZGV4KGNvZGVjLCBSVDU2MzFfQUREQV9NSVhFUl9JTlRMX1JFRzMpOworCWlmICh2YWwgJiAweDAwMDIpCisJCXJ0NTYzMS0+Y29kZWNfdmVyc2lvbiA9IDE7CisJZWxzZQorCQlydDU2MzEtPmNvZGVjX3ZlcnNpb24gPSAwOworCisJcnQ1NjMxX3Jlc2V0KGNvZGVjKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCVJUNTYzMV9QV1JfVlJFRiB8IFJUNTYzMV9QV1JfTUFJTl9CSUFTLAorCQlSVDU2MzFfUFdSX1ZSRUYgfCBSVDU2MzFfUFdSX01BSU5fQklBUyk7CisJbXNsZWVwKDgwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfUFdSX01BTkFHX0FERDMsCisJCVJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkwsIFJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkwpOworCS8qIGVuYWJsZSBIUCB6ZXJvIGNyb3NzICovCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLCAweDBmMTgpOworCS8qIHBvd2VyIG9mZiBDbGFzc0QgYXV0byBSZWNvdmVyeSAqLworCWlmIChydDU2MzEtPmNvZGVjX3ZlcnNpb24pCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMiwKKwkJCQkJMHgyMDAwLCAweDIwMDApOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8yLAorCQkJCQkweDIwMDAsIDApOworCS8qIERNSUMgKi8KKwlpZiAocnQ1NjMxLT5kbWljX3VzZWRfZmxhZykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2MzFfR1BJT19DVFJMLAorCQkJUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfTUFTSyB8CisJCQlSVDU2MzFfR1BJT19ETUlDX0ZVTl9TRUxfTUFTSywKKwkJCVJUNTYzMV9HUElPX1BJTl9GVU5fU0VMX0dQSU9fRElNQyB8CisJCQlSVDU2MzFfR1BJT19ETUlDX0ZVTl9TRUxfRElNQyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTYzMV9ESUdfTUlDX0NUUkwsCisJCQlSVDU2MzFfRE1JQ19MX0NIX0xBVENIX01BU0sgfAorCQkJUlQ1NjMxX0RNSUNfUl9DSF9MQVRDSF9NQVNLLAorCQkJUlQ1NjMxX0RNSUNfTF9DSF9MQVRDSF9GQUxMSU5HIHwKKwkJCVJUNTYzMV9ETUlDX1JfQ0hfTEFUQ0hfUklTSU5HKTsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2MzFfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlydDU2MzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0NTYzMV9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJ0NTYzMV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjMxX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcnQ1NjMxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBydDU2MzFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHJ0NTYzMV9yZXN1bWUgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCisjZGVmaW5lIFJUNTYzMV9GT1JNQVQJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCisJCQlTTkRSVl9QQ01fRk1UQklUX1M4KQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2MzFfb3BzID0geworCS5od19wYXJhbXMgPSBydDU2MzFfaGlmaV9wY21fcGFyYW1zLAorCS5zZXRfZm10ID0gcnQ1NjMxX2hpZmlfY29kZWNfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsgPSBydDU2MzFfaGlmaV9jb2RlY19zZXRfZGFpX3N5c2NsaywKKwkuc2V0X3BsbCA9IHJ0NTYzMV9jb2RlY19zZXRfZGFpX3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTYzMV9kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0NTYzMS1oaWZpIiwKKwkJLmlkID0gMSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhJRkkgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTYzMV9TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTYzMV9GT1JNQVQsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhJRkkgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjMxX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjMxX0ZPUk1BVCwKKwkJfSwKKwkJLm9wcyA9ICZydDU2MzFfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcnQ1NjMxID0geworCS5wcm9iZSA9IHJ0NTYzMV9wcm9iZSwKKwkucmVtb3ZlID0gcnQ1NjMxX3JlbW92ZSwKKwkuc3VzcGVuZCA9IHJ0NTYzMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBydDU2MzFfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTYzMV9zZXRfYmlhc19sZXZlbCwKKwkucmVnX2NhY2hlX3NpemUgPSBSVDU2MzFfVkVORE9SX0lEMiArIDEsCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTE2KSwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSBydDU2MzFfcmVnLAorCS52b2xhdGlsZV9yZWdpc3RlciA9IHJ0NTYzMV92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnaXN0ZXIgPSBydDU2MzFfcmVhZGFibGVfcmVnaXN0ZXIsCisJLnJlZ19jYWNoZV9zdGVwID0gMSwKKwkuY29udHJvbHMgPSBydDU2MzFfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTYzMV9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBydDU2MzFfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2MzFfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBydDU2MzFfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fcm91dGVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2MzFfaTJjX2lkW10gPSB7CisJeyAicnQ1NjMxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2MzFfaTJjX2lkKTsKKworc3RhdGljIGludCBydDU2MzFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJ0NTYzMV9wcml2ICpydDU2MzE7CisJaW50IHJldDsKKworCXJ0NTYzMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydDU2MzFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHJ0NTYzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDU2MzEpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZGV2X3J0NTYzMSwKKwkJCXJ0NTYzMV9kYWksIEFSUkFZX1NJWkUocnQ1NjMxX2RhaSkpOworCWlmIChyZXQgPCAwKQorCQlrZnJlZShydDU2MzEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgcnQ1NjMxX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydDU2MzFfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydDU2MzEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHJ0NTYzMV9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AocnQ1NjMxX2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IHJ0NTYzMV9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydDU2MzFfbW9kaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcnQ1NjMxX2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQocnQ1NjMxX21vZGluaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnQ1NjMxX21vZGV4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcnQ1NjMxX2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocnQ1NjMxX21vZGV4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgUlQ1NjMxIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiZmxvdmUgPGZsb3ZlQHJlYWx0ZWsuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0MDE1OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmgKQEAgLTAsMCArMSw3MDEgQEAKKyNpZm5kZWYgX19SVENPREVDNTYzMV9IX18KKyNkZWZpbmUgX19SVENPREVDNTYzMV9IX18KKworCisjZGVmaW5lIFJUNTYzMV9SRVNFVAkJCQkweDAwCisjZGVmaW5lIFJUNTYzMV9TUEtfT1VUX1ZPTAkJCTB4MDIKKyNkZWZpbmUgUlQ1NjMxX0hQX09VVF9WT0wJCQkweDA0CisjZGVmaW5lIFJUNTYzMV9NT05PX0FYT18xXzJfVk9MCQkweDA2CisjZGVmaW5lIFJUNTYzMV9BVVhfSU5fVk9MCQkJMHgwQQorI2RlZmluZSBSVDU2MzFfU1RFUkVPX0RBQ19WT0xfMQkJMHgwQworI2RlZmluZSBSVDU2MzFfTUlDX0NUUkxfMQkJCTB4MEUKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19EQUNfVk9MXzIJCTB4MTAKKyNkZWZpbmUgUlQ1NjMxX0FEQ19DVFJMXzEJCQkweDEyCisjZGVmaW5lIFJUNTYzMV9BRENfUkVDX01JWEVSCQkJMHgxNAorI2RlZmluZSBSVDU2MzFfQURDX0NUUkxfMgkJCTB4MTYKKyNkZWZpbmUgUlQ1NjMxX1ZEQUNfRElHX1ZPTAkJCTB4MTgKKyNkZWZpbmUgUlQ1NjMxX09VVE1JWEVSX0xfQ1RSTAkJCTB4MUEKKyNkZWZpbmUgUlQ1NjMxX09VVE1JWEVSX1JfQ1RSTAkJCTB4MUMKKyNkZWZpbmUgUlQ1NjMxX0FYTzFNSVhFUl9DVFJMCQkJMHgxRQorI2RlZmluZSBSVDU2MzFfQVhPMk1JWEVSX0NUUkwJCQkweDIwCisjZGVmaW5lIFJUNTYzMV9NSUNfQ1RSTF8yCQkJMHgyMgorI2RlZmluZSBSVDU2MzFfRElHX01JQ19DVFJMCQkJMHgyNAorI2RlZmluZSBSVDU2MzFfTU9OT19JTlBVVF9WT0wJCQkweDI2CisjZGVmaW5lIFJUNTYzMV9TUEtfTUlYRVJfQ1RSTAkJCTB4MjgKKyNkZWZpbmUgUlQ1NjMxX1NQS19NT05PX09VVF9DVFJMCQkweDJBCisjZGVmaW5lIFJUNTYzMV9TUEtfTU9OT19IUF9PVVRfQ1RSTAkJMHgyQworI2RlZmluZSBSVDU2MzFfU0RQX0NUUkwJCQkJMHgzNAorI2RlZmluZSBSVDU2MzFfTU9OT19TRFBfQ1RSTAkJCTB4MzYKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19BRF9EQV9DTEtfQ1RSTAkJMHgzOAorI2RlZmluZSBSVDU2MzFfUFdSX01BTkFHX0FERDEJCTB4M0EKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQU5BR19BREQyCQkweDNCCisjZGVmaW5lIFJUNTYzMV9QV1JfTUFOQUdfQUREMwkJMHgzQworI2RlZmluZSBSVDU2MzFfUFdSX01BTkFHX0FERDQJCTB4M0UKKyNkZWZpbmUgUlQ1NjMxX0dFTl9QVVJfQ1RSTF9SRUcJCTB4NDAKKyNkZWZpbmUgUlQ1NjMxX0dMT0JBTF9DTEtfQ1RSTAkJCTB4NDIKKyNkZWZpbmUgUlQ1NjMxX1BMTF9DVFJMCQkJCTB4NDQKKyNkZWZpbmUgUlQ1NjMxX0lOVF9TVF9JUlFfQ1RSTF8xCQkweDQ4CisjZGVmaW5lIFJUNTYzMV9JTlRfU1RfSVJRX0NUUkxfMgkJMHg0QQorI2RlZmluZSBSVDU2MzFfR1BJT19DVFJMCQkJMHg0QworI2RlZmluZSBSVDU2MzFfTUlTQ19DVFJMCQkJMHg1MgorI2RlZmluZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMQkJMHg1NAorI2RlZmluZSBSVDU2MzFfREVQT1BfRlVOX0NUUkxfMgkJMHg1NgorI2RlZmluZSBSVDU2MzFfSkFDS19ERVRfQ1RSTAkJCTB4NUEKKyNkZWZpbmUgUlQ1NjMxX1NPRlRfVk9MX0NUUkwJCQkweDVDCisjZGVmaW5lIFJUNTYzMV9BTENfQ1RSTF8xCQkJMHg2NAorI2RlZmluZSBSVDU2MzFfQUxDX0NUUkxfMgkJCTB4NjUKKyNkZWZpbmUgUlQ1NjMxX0FMQ19DVFJMXzMJCQkweDY2CisjZGVmaW5lIFJUNTYzMV9QU0VVRE9fU1BBVExfQ1RSTAkJMHg2OAorI2RlZmluZSBSVDU2MzFfSU5ERVhfQURECQkJMHg2QQorI2RlZmluZSBSVDU2MzFfSU5ERVhfREFUQQkJCTB4NkMKKyNkZWZpbmUgUlQ1NjMxX0VRX0NUUkwJCQkJMHg2RQorI2RlZmluZSBSVDU2MzFfVkVORE9SX0lECQkJMHg3QQorI2RlZmluZSBSVDU2MzFfVkVORE9SX0lEMQkJCTB4N0MKKyNkZWZpbmUgUlQ1NjMxX1ZFTkRPUl9JRDIJCQkweDdFCisKKy8qIEluZGV4IG9mIENvZGVjIFByaXZhdGUgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2MzFfRVFfQldfTE9QCQkJMHgwMAorI2RlZmluZSBSVDU2MzFfRVFfR0FJTl9MT1AJCQkweDAxCisjZGVmaW5lIFJUNTYzMV9FUV9GQ19CUDEJCQkweDAyCisjZGVmaW5lIFJUNTYzMV9FUV9CV19CUDEJCQkweDAzCisjZGVmaW5lIFJUNTYzMV9FUV9HQUlOX0JQMQkJCTB4MDQKKyNkZWZpbmUgUlQ1NjMxX0VRX0ZDX0JQMgkJCTB4MDUKKyNkZWZpbmUgUlQ1NjMxX0VRX0JXX0JQMgkJCTB4MDYKKyNkZWZpbmUgUlQ1NjMxX0VRX0dBSU5fQlAyCQkJMHgwNworI2RlZmluZSBSVDU2MzFfRVFfRkNfQlAzCQkJMHgwOAorI2RlZmluZSBSVDU2MzFfRVFfQldfQlAzCQkJMHgwOQorI2RlZmluZSBSVDU2MzFfRVFfR0FJTl9CUDMJCQkweDBhCisjZGVmaW5lIFJUNTYzMV9FUV9CV19ISVAJCQkweDBiCisjZGVmaW5lIFJUNTYzMV9FUV9HQUlOX0hJUAkJCTB4MGMKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9BMQkJCTB4MGQKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9BMgkJCTB4MGUKKyNkZWZpbmUgUlQ1NjMxX0VRX0hQRl9HQUlOCQkJMHgwZgorI2RlZmluZSBSVDU2MzFfRVFfUFJFX1ZPTF9DVFJMCQkJMHgxMQorI2RlZmluZSBSVDU2MzFfRVFfUE9TVF9WT0xfQ1RSTAkJMHgxMgorI2RlZmluZSBSVDU2MzFfVEVTVF9NT0RFX0NUUkwJCQkweDM5CisjZGVmaW5lIFJUNTYzMV9DUF9JTlRMX1JFRzIJCQkweDQ1CisjZGVmaW5lIFJUNTYzMV9BRERBX01JWEVSX0lOVExfUkVHMwkJMHg1MgorI2RlZmluZSBSVDU2MzFfU1BLX0lOVExfQ1RSTAkJCTB4NTYKKworCisvKiBnbG9iYWwgZGVmaW5pdGlvbiAqLworI2RlZmluZSBSVDU2MzFfTF9NVVRFCQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTF9NVVRFX1NISUZUCQkJCTE1CisjZGVmaW5lIFJUNTYzMV9MX0VOCQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTF9FTl9TSElGVAkJCQkxNAorI2RlZmluZSBSVDU2MzFfUl9NVVRFCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9SX01VVEVfU0hJRlQJCQkJNworI2RlZmluZSBSVDU2MzFfUl9FTgkJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfUl9FTl9TSElGVAkJCQk2CisjZGVmaW5lIFJUNTYzMV9WT0xfTUFTSwkJCQkweDFmCisjZGVmaW5lIFJUNTYzMV9MX1ZPTF9TSElGVAkJCQk4CisjZGVmaW5lIFJUNTYzMV9SX1ZPTF9TSElGVAkJCQkwCisKKy8qIFNwZWFrZXIgT3V0cHV0IENvbnRyb2woMHgwMikgKi8KKyNkZWZpbmUgUlQ1NjMxX1NQS19MX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TUEtfTF9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfVk9MX1NFTF9TUEtNSVhfTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9WT0xfU0VMX1NQS01JWF9SCQkJKDB4MSA8PCA2KQorCisvKiBIZWFkcGhvbmUgT3V0cHV0IENvbnRyb2woMHgwNCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9WTUlECQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfVk9MX1NFTF9PVVRNSVhfTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9IUF9SX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfVk9MX1NFTF9WTUlECQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2MzFfSFBfUl9WT0xfU0VMX09VVE1JWF9SCQkJKDB4MSA8PCA2KQorCisvKiBPdXRwdXQgQ29udHJvbCBmb3IgQVVYT1VUL01PTk8oMHgwNikgKi8KKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8xX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BVVhPVVRfMV9WT0xfU0VMX1ZNSUQJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQVVYT1VUXzFfVk9MX1NFTF9PVVRNSVhfTAkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX01VVEVfTU9OTwkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2MzFfTVVURV9NT05PX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfVk1JRAkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FVWE9VVF8yX1ZPTF9TRUxfT1VUTUlYX1IJCSgweDEgPDwgNikKKworLyogTWljcm9waG9uZSBJbnB1dCBDb250cm9sIDEoMHgwRSkgKi8KKyNkZWZpbmUgUlQ1NjMxX01JQzFfRElGRl9JTlBVVF9DVFJMCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX01JQzFfRElGRl9JTlBVVF9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9NSUMyX0RJRkZfSU5QVVRfQ1RSTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01JQzJfRElGRl9JTlBVVF9TSElGVAkJCTcKKworLyogU3RlcmVvIERBQyBEaWdpdGFsIFZvbHVtZTIoMHgxMCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0RBQ19WT0xfTUFTSwkJCQkweGZmCisKKy8qIEFEQyBSZWNvcmRpbmcgTWl4ZXIgQ29udHJvbCgweDE0KSAqLworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX1JFQ01JWEVSX0wJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfUkVDTUlYTF9CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX1JFQ01JWEVSX0wJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX1JFQ01JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19SRUNNSVhFUl9MCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9SRUNNSVhMX0JJVAkJCTEzCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fVE9fUkVDTUlYRVJfTAkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjMxX01fTU9OT19JTl9SRUNNSVhMX0JJVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX1JfVE9fUkVDTUlYRVJfUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhSX1JFQ01JWFJfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9NSUMyX1RPX1JFQ01JWEVSX1IJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NX01JQzJfUkVDTUlYUl9CSVQJCQk2CisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfVE9fUkVDTUlYRVJfUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX01fQVhJUl9SRUNNSVhSX0JJVAkJCTUKKyNkZWZpbmUgUlQ1NjMxX01fTU9OT19JTl9UT19SRUNNSVhFUl9SCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fUkVDTUlYUl9CSVQJCQk0CisKKy8qIExlZnQgT3V0cHV0IE1peGVyIENvbnRyb2woMHgxQSkgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX09VVE1JWExfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfUl9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX09VVE1JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX0xfVE9fT1VUTUlYRVJfTAkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ0xfT1VUTUlYTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX09VVE1JWEVSX0wJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX09VVE1JWExfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9UT19PVVRNSVhFUl9MCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9PVVRNSVhMX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fUF9UT19PVVRNSVhFUl9MCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9NT05PX0lOUF9PVVRNSVhMX0JJVAkJMTAKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19PVVRNSVhFUl9MCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfTV9BWElMX09VVE1JWExfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfTV9BWElSX1RPX09VVE1JWEVSX0wJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfT1VUTUlYTF9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9NX1ZEQUNfVE9fT1VUTUlYRVJfTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01fVkRBQ19PVVRNSVhMX0JJVAkJCTcKKworLyogUmlnaHQgT3V0cHV0IE1peGVyIENvbnRyb2woMHgxQykgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX09VVE1JWFJfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfUl9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX09VVE1JWFJfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX1JfVE9fT1VUTUlYRVJfUgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ1JfT1VUTUlYUl9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX09VVE1JWEVSX1IJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9NSUMxX09VVE1JWFJfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9UT19PVVRNSVhFUl9SCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9PVVRNSVhSX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX01PTk9fSU5fTl9UT19PVVRNSVhFUl9SCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9NT05PX0lOTl9PVVRNSVhSX0JJVAkJMTAKKyNkZWZpbmUgUlQ1NjMxX01fQVhJTF9UT19PVVRNSVhFUl9SCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfTV9BWElMX09VVE1JWFJfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfTV9BWElSX1RPX09VVE1JWEVSX1IJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NX0FYSVJfT1VUTUlYUl9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9NX1ZEQUNfVE9fT1VUTUlYRVJfUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX01fVkRBQ19PVVRNSVhSX0JJVAkJCTcKKworLyogTG91dCBNaXhlciBDb250cm9sKDB4MUUpICovCisjZGVmaW5lIFJUNTYzMV9NX01JQzFfVE9fQVhPMU1JWEVSCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMV9BWE8xTUlYX0JJVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9NX01JQzJfVE9fQVhPMU1JWEVSCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMl9BWE8xTUlYX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX0xfVE9fQVhPMU1JWEVSCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfQVhPMU1JWF9CSVQJCQk3CisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWEVSX1JfVE9fQVhPMU1JWEVSCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWFJfQVhPMU1JWF9CSVQJCQk2CisKKy8qIFJvdXQgTWl4ZXIgQ29udHJvbCgweDIwKSAqLworI2RlZmluZSBSVDU2MzFfTV9NSUMxX1RPX0FYTzJNSVhFUgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9NX01JQzFfQVhPMk1JWF9CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfTV9NSUMyX1RPX0FYTzJNSVhFUgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9NX01JQzJfQVhPMk1JWF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX0FYTzJNSVhFUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhMX0FYTzJNSVhfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9SX1RPX0FYTzJNSVhFUgkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhSX0FYTzJNSVhfQklUCQkJNgorCisvKiBNaWNwaG9uZSBJbnB1dCBDb250cm9sIDIoMHgyMikgKi8KKyNkZWZpbmUgUlQ1NjMxX01JQ19CSUFTXzkwX1BSRUNORVRfQVZERCAxCisjZGVmaW5lIFJUNTYzMV9NSUNfQklBU183NV9QUkVDTkVUX0FWREQgMgorCisjZGVmaW5lIFJUNTYzMV9NSUMxX0JPT1NUX0NUUkxfTUFTSwkJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9NSUMxX0JPT1NUX0NUUkxfQllQQVNTCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzIwREIJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzI0REIJCQkoMHgyIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzMwREIJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzM1REIJCQkoMHg0IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzQwREIJCQkoMHg1IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzM0REIJCQkoMHg2IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzUwREIJCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9DVFJMXzUyREIJCQkoMHg4IDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTUlDMV9CT09TVF9TSElGVAkJCTEyCisKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF9NQVNLCQkJKDB4ZiA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMX0JZUEFTUwkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzIwREIJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfMjREQgkJCSgweDIgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF8zMERCCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzM1REIJCQkoMHg0IDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfNDBEQgkJCSgweDUgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfQ1RSTF8zNERCCQkJKDB4NiA8PCA4KQorI2RlZmluZSBSVDU2MzFfTUlDMl9CT09TVF9DVFJMXzUwREIJCQkoMHg3IDw8IDgpCisjZGVmaW5lIFJUNTYzMV9NSUMyX0JPT1NUX0NUUkxfNTJEQgkJCSgweDggPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX01JQzJfQk9PU1RfU0hJRlQJCQk4CisKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMxX1ZPTFRfQ1RSTF9NQVNLCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMV9WT0xUX0NUUkxfOTBQCQkJKDB4MCA8PCA3KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfVk9MVF9DVFJMXzc1UAkJCSgweDEgPDwgNykKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU19DX0RFVF9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU19DX0RFVF9ESVMJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMV9TX0NfREVUX0VOQQkJCSgweDEgPDwgNikKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfTUFTSwkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfNjAwVUEJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzFfU0hPUlRfQ1VSUl9ERVRfMTUwMFVBCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMxX1NIT1JUX0NVUlJfREVUXzIwMDBVQQkoMHgyIDw8IDQpCisKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1ZPTFRfQ1RSTF9NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9WT0xUX0NUUkxfOTBQCQkJKDB4MCA8PCAzKQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfVk9MVF9DVFJMXzc1UAkJCSgweDEgPDwgMykKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU19DX0RFVF9NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU19DX0RFVF9ESVMJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9TX0NfREVUX0VOQQkJCSgweDEgPDwgMikKKworI2RlZmluZSBSVDU2MzFfTUlDQklBUzJfU0hPUlRfQ1VSUl9ERVRfTUFTSwkJKDB4MykKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1NIT1JUX0NVUlJfREVUXzYwMFVBCSgweDApCisjZGVmaW5lIFJUNTYzMV9NSUNCSUFTMl9TSE9SVF9DVVJSX0RFVF8xNTAwVUEJKDB4MSkKKyNkZWZpbmUgUlQ1NjMxX01JQ0JJQVMyX1NIT1JUX0NVUlJfREVUXzIwMDBVQQkoMHgyKQorCisKKy8qIERpZ2l0YWwgTWljcm9waG9uZSBDb250cm9sKDB4MjQpICovCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQV9NQVNLCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQV9TSElGVAkJCQkxNQorLyogRE1JQ19FTkE6IERNSUMgdG8gQURDIERpZ2l0YWwgZmlsdGVyICovCisjZGVmaW5lIFJUNTYzMV9ETUlDX0VOQQkJCQkoMHgxIDw8IDE1KQorLyogRE1JQ19ESVM6IEFEQyBtaXhlciB0byBBREMgRGlnaXRhbCBmaWx0ZXIgKi8KKyNkZWZpbmUgUlQ1NjMxX0RNSUNfRElTCQkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfRE1JQ19MX0NIX01VVEUJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfTF9DSF9NVVRFX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfUl9DSF9NVVRFCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9ETUlDX1JfQ0hfTVVURV9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9ETUlDX0xfQ0hfTEFUQ0hfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfTF9DSF9MQVRDSF9SSVNJTkcJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0xfQ0hfTEFUQ0hfRkFMTElORwkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2MzFfRE1JQ19SX0NIX0xBVENIX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9ETUlDX1JfQ0hfTEFUQ0hfUklTSU5HCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfRE1JQ19SX0NIX0xBVENIX0ZBTExJTkcJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0RNSUNfQ0xLX0NUUkxfVE9fMTI4RlMJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzY0RlMJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9ETUlDX0NMS19DVFJMX1RPXzMyRlMJCQkoMHgyIDw8IDQpCisKKy8qIE1pY3JvcGhvbmUgSW5wdXQgVm9sdW1lKDB4MjYpICovCisjZGVmaW5lIFJUNTYzMV9NT05PX0RJRkZfSU5QVVRfU0hJRlQJCQkxNQorCisvKiBTcGVha2VyIE1peGVyIENvbnRyb2woMHgyOCkgKi8KKyNkZWZpbmUgUlQ1NjMxX01fUkVDTUlYRVJfTF9UT19TUEtNSVhFUl9MCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhMX1NQS01JWExfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fTUlDMV9QX1RPX1NQS01JWEVSX0wJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9NX01JQzFQX1NQS01JWExfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX01fREFDX0xfVE9fU1BLTUlYRVJfTAkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX0RBQ0xfU1BLTUlYTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9PVVRNSVhFUl9MX1RPX1NQS01JWEVSX0wJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWExfU1BLTUlYTF9CSVQJCQkxMgorCisjZGVmaW5lIFJUNTYzMV9NX1JFQ01JWEVSX1JfVE9fU1BLTUlYRVJfUgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfTV9SRUNNSVhSX1NQS01JWFJfQklUCQkJNworI2RlZmluZSBSVDU2MzFfTV9NSUMyX1BfVE9fU1BLTUlYRVJfUgkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfTV9NSUMyUF9TUEtNSVhSX0JJVAkJCTYKKyNkZWZpbmUgUlQ1NjMxX01fREFDX1JfVE9fU1BLTUlYRVJfUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX01fREFDUl9TUEtNSVhSX0JJVAkJCTUKKyNkZWZpbmUgUlQ1NjMxX01fT1VUTUlYRVJfUl9UT19TUEtNSVhFUl9SCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9NX09VVE1JWFJfU1BLTUlYUl9CSVQJCQk0CisKKy8qIFNwZWFrZXIvTW9ubyBPdXRwdXQgQ29udHJvbCgweDJBKSAqLworI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xfTF9UT19TUE9MX01JWEVSCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xMX1NQT0xNSVhfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX01fU1BLVk9MX1JfVE9fU1BPTF9NSVhFUgkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX01fU1BLVk9MUl9TUE9MTUlYX0JJVAkJCTE0CisjZGVmaW5lIFJUNTYzMV9NX1NQS1ZPTF9MX1RPX1NQT1JfTUlYRVIJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9NX1NQS1ZPTExfU1BPUk1JWF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xfUl9UT19TUE9SX01JWEVSCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfTV9TUEtWT0xSX1NQT1JNSVhfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX01fT1VUVk9MX0xfVE9fTU9OT01JWEVSCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfTV9PVVRWT0xMX01PTk9NSVhfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjMxX01fT1VUVk9MX1JfVE9fTU9OT01JWEVSCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfTV9PVVRWT0xSX01PTk9NSVhfQklUCQkJMTAKKworLyogU3BlYWtlci9Nb25vL0hQIE91dHB1dCBDb250cm9sKDB4MkMpICovCisjZGVmaW5lIFJUNTYzMV9TUEtfTF9NVVhfU0VMX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9TUEtNSVhFUl9MCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9NT05PX0lOCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX1NQS19MX01VWF9TRUxfREFDX0wJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfU1BLX0xfTVVYX1NFTF9TSElGVAkJCTE0CisKKyNkZWZpbmUgUlQ1NjMxX1NQS19SX01VWF9TRUxfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX1NQS01JWEVSX1IJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX01PTk9fSU4JCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU1BLX1JfTVVYX1NFTF9EQUNfUgkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TUEtfUl9NVVhfU0VMX1NISUZUCQkJMTAKKworI2RlZmluZSBSVDU2MzFfTU9OT19NVVhfU0VMX01BU0sJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NT05PX01VWF9TRUxfTU9OT01JWEVSCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9NT05PX01VWF9TRUxfTU9OT19JTgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX01PTk9fTVVYX1NFTF9TSElGVAkJCTYKKworI2RlZmluZSBSVDU2MzFfSFBfTF9NVVhfU0VMX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9IUF9MX01VWF9TRUxfSFBWT0xfTAkJCSgweDAgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfTVVYX1NFTF9EQUNfTAkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0hQX0xfTVVYX1NFTF9TSElGVAkJCTMKKworI2RlZmluZSBSVDU2MzFfSFBfUl9NVVhfU0VMX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9IUF9SX01VWF9TRUxfSFBWT0xfUgkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfTVVYX1NFTF9EQUNfUgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0hQX1JfTVVYX1NFTF9TSElGVAkJCTIKKworLyogU3RlcmVvIEkyUyBTZXJpYWwgRGF0YSBQb3J0IENvbnRyb2woMHgzNCkgKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9NT0RFX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX1NEUF9NT0RFX1NFTF9NQVNURVIJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfU0RQX01PREVfU0VMX1NMQVZFCQkJKDB4MSA8PCAxNSkKKworI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX01BU0sJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX09GRgkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9TRFBfQURDX0NQU19TRUxfVV9MQVcJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfU0RQX0FEQ19DUFNfU0VMX0FfTEFXCQkJKDB4MiA8PCAxMCkKKworI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9TRFBfREFDX0NQU19TRUxfT0ZGCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX1VfTEFXCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19DUFNfU0VMX0FfTEFXCQkJKDB4MiA8PCA4KQorLyogMDpOb3JtYWwgMTpJbnZlcnQgKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfQkNMS19QT0xfQ1RSTAkJCSgweDEgPDwgNykKKy8qIDA6Tm9ybWFsIDE6SW52ZXJ0ICovCisjZGVmaW5lIFJUNTYzMV9TRFBfREFDX1JfSU5WCQkJCSgweDEgPDwgNikKKy8qIDA6QURDIGRhdGEgYXBwZWFyIGF0IGxlZnQgcGhhc2Ugb2YgTFJDSworICogMTpBREMgZGF0YSBhcHBlYXIgYXQgcmlnaHQgcGhhc2Ugb2YgTFJDSworICovCisjZGVmaW5lIFJUNTYzMV9TRFBfQURDX0RBVEFfTF9SX1NXQVAJCQkoMHgxIDw8IDUpCisvKiAwOkRBQyBkYXRhIGFwcGVhciBhdCBsZWZ0IHBoYXNlIG9mIExSQ0sKKyAqIDE6REFDIGRhdGEgYXBwZWFyIGF0IHJpZ2h0IHBoYXNlIG9mIExSQ0sKKyAqLworI2RlZmluZSBSVDU2MzFfU0RQX0RBQ19EQVRBX0xfUl9TV0FQCQkJKDB4MSA8PCA0KQorCisvKiBEYXRhIExlbmd0aCBTbGVjdGlvbiAqLworI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ETF9NQVNLCQkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfRExfMTYJCQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ETF8yMAkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9TRFBfSTJTX0RMXzI0CQkJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfRExfOAkJCQkoMHgzIDw8IDIpCisKKy8qIFBDTSBEYXRhIEZvcm1hdCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfREZfTUFTSwkJCQkoMHgzKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ERl9JMlMJCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjMxX1NEUF9JMlNfREZfTEVGVAkJCQkoMHgxKQorI2RlZmluZSBSVDU2MzFfU0RQX0kyU19ERl9QQ01fQQkJCSgweDIpCisjZGVmaW5lIFJUNTYzMV9TRFBfSTJTX0RGX1BDTV9CCQkJKDB4MykKKworLyogU3RlcmVvIEFEL0RBIENsb2NrIENvbnRyb2woMHgzOGgpICovCisjZGVmaW5lIFJUNTYzMV9JMlNfUFJFX0RJVl9NQVNLCQkJKDB4NyA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzEJCQkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzIJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzQJCQkJKDB4MiA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzgJCQkJKDB4MyA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX0kyU19QUkVfRElWXzE2CQkJCSgweDQgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9JMlNfUFJFX0RJVl8zMgkJCQkoMHg1IDw8IDEzKQorLyogQ0xPQ0sgUkVMQVRJVkUgT0YgQkNMSyBBTkQgTENSSyAqLworI2RlZmluZSBSVDU2MzFfSTJTX0xSQ0tfU0VMX05fQkNMS19NQVNLCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfSTJTX0xSQ0tfU0VMXzY0X0JDTEsJCQkoMHgwIDw8IDEyKSAvKiA2NEZTICovCisjZGVmaW5lIFJUNTYzMV9JMlNfTFJDS19TRUxfMzJfQkNMSwkJCSgweDEgPDwgMTIpIC8qIDMyRlMgKi8KKworI2RlZmluZSBSVDU2MzFfREFDX09TUl9TRUxfTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9EQUNfT1NSX1NFTF8xMjhGUwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9EQUNfT1NSX1NFTF82NEZTCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX0RBQ19PU1JfU0VMXzMyRlMJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfREFDX09TUl9TRUxfMTZGUwkJCSgweDMgPDwgMTApCisKKyNkZWZpbmUgUlQ1NjMxX0FEQ19PU1JfU0VMX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BRENfT1NSX1NFTF8xMjhGUwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19PU1JfU0VMXzY0RlMJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BRENfT1NSX1NFTF8zMkZTCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2MzFfQURDX09TUl9TRUxfMTZGUwkJCSgweDMgPDwgOCkKKworI2RlZmluZSBSVDU2MzFfQUREQV9GSUxURVJfQ0xLX1NFTF8yNTZGUwkJKDAgPDwgNykgLyogMjU2RlMgKi8KKyNkZWZpbmUgUlQ1NjMxX0FEREFfRklMVEVSX0NMS19TRUxfMzg0RlMJCSgxIDw8IDcpIC8qIDM4NEZTICovCisKKy8qIFBvd2VyIG1hbmFnbWVudCBhZGRpdGlvbiAxICgweDNBKSAqLworI2RlZmluZSBSVDU2MzFfUFdSX01BSU5fSTJTX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0kyU19CSVQJCQkxNQorI2RlZmluZSBSVDU2MzFfUFdSX0NMQVNTX0QJCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9DTEFTU19EX0JJVAkJCTEyCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX0xfQ0xLCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX0xfQ0xLX0JJVAkJCTExCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX1JfQ0xLCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9QV1JfQURDX1JfQ0xLX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfREFDX0xfQ0xLCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9DTEtfQklUCQkJOQorI2RlZmluZSBSVDU2MzFfUFdSX0RBQ19SX0NMSwkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9QV1JfREFDX1JfQ0xLX0JJVAkJCTgKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUkVGCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUkVGX0JJVAkJCTcKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfTF9UT19NSVhFUl9CSVQJCTYKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUl9UT19NSVhFUgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9EQUNfUl9UT19NSVhFUl9CSVQJCTUKKworLyogUG93ZXIgbWFuYWdtZW50IGFkZGl0aW9uIDIgKDB4M0IpICovCisjZGVmaW5lIFJUNTYzMV9QV1JfT1VUTUlYRVJfTAkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfUFdSX09VVE1JWEVSX0xfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX1BXUl9PVVRNSVhFUl9SCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfT1VUTUlYRVJfUl9CSVQJCQkxNAorI2RlZmluZSBSVDU2MzFfUFdSX1NQS01JWEVSX0wJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9TUEtNSVhFUl9MX0JJVAkJCTEzCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLTUlYRVJfUgkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2MzFfUFdSX1NQS01JWEVSX1JfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX1BXUl9SRUNNSVhFUl9MCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTYzMV9QV1JfUkVDTUlYRVJfTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfUFdSX1JFQ01JWEVSX1IJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9SRUNNSVhFUl9SX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMV9CT09UX0dBSU4JCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMV9CT09UX0dBSU5fQklUCQk1CisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMl9CT09UX0dBSU4JCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDMl9CT09UX0dBSU5fQklUCQk0CisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDQklBUzFfVk9MCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2MzFfUFdSX01JQ0JJQVMxX1ZPTF9CSVQJCQkzCisjZGVmaW5lIFJUNTYzMV9QV1JfTUlDQklBUzJfVk9MCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2MzFfUFdSX01JQ0JJQVMyX1ZPTF9CSVQJCQkyCisjZGVmaW5lIFJUNTYzMV9QV1JfUExMMQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTYzMV9QV1JfUExMMV9CSVQJCQkJMQorI2RlZmluZSBSVDU2MzFfUFdSX1BMTDIJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBSVDU2MzFfUFdSX1BMTDJfQklUCQkJCTAKKworLyogUG93ZXIgbWFuYWdtZW50IGFkZGl0aW9uIDMoMHgzQykgKi8KKyNkZWZpbmUgUlQ1NjMxX1BXUl9WUkVGCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9QV1JfVlJFRl9CSVQJCQkJMTUKKyNkZWZpbmUgUlQ1NjMxX1BXUl9GQVNUX1ZSRUZfQ1RSTAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfRkFTVF9WUkVGX0NUUkxfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0JJQVMJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NQUlOX0JJQVNfQklUCQkJMTMKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8xTUlYRVIJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8xTUlYRVJfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8yTUlYRVIJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWE8yTUlYRVJfQklUCQkJMTAKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PTUlYRVIJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfUFdSX01PTk9NSVhFUl9CSVQJCQk5CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19ERVBPUF9ESVMJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19ERVBPUF9ESVNfQklUCQk4CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19BTVBfRU4JCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19BTVBfRU5fQklUCQkJNworI2RlZmluZSBSVDU2MzFfUFdSX0NIQVJHRV9QVU1QCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2MzFfUFdSX0NIQVJHRV9QVU1QX0JJVAkJCTQKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9MX0FNUAkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfTF9BTVBfQklUCQkJMworI2RlZmluZSBSVDU2MzFfUFdSX0hQX1JfQU1QCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9SX0FNUF9CSVQJCQkyCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfREVQT1BfRElTCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX0RFUE9QX0RJU19CSVQJCQkxCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfQU1QX0RSSVZJTkcJCQkoMHgxIDw8IDApCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfQU1QX0RSSVZJTkdfQklUCQkwCisKKy8qIFBvd2VyIG1hbmFnbWVudCBhZGRpdGlvbiA0KDB4M0UpICovCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX0xfVk9MCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX0xfVk9MX0JJVAkJCTE1CisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX1JfVk9MCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9QV1JfU1BLX1JfVk9MX0JJVAkJCTE0CisjZGVmaW5lIFJUNTYzMV9QV1JfTE9VVF9WT0wJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9MT1VUX1ZPTF9CSVQJCQkxMworI2RlZmluZSBSVDU2MzFfUFdSX1JPVVRfVk9MCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QV1JfUk9VVF9WT0xfQklUCQkJMTIKKyNkZWZpbmUgUlQ1NjMxX1BXUl9IUF9MX09VVF9WT0wJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX0xfT1VUX1ZPTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2MzFfUFdSX0hQX1JfT1VUX1ZPTAkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTYzMV9QV1JfSFBfUl9PVVRfVk9MX0JJVAkJCTEwCisjZGVmaW5lIFJUNTYzMV9QV1JfQVhJTF9JTl9WT0wJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfUFdSX0FYSUxfSU5fVk9MX0JJVAkJCTkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWElSX0lOX1ZPTAkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX1BXUl9BWElSX0lOX1ZPTF9CSVQJCQk4CisjZGVmaW5lIFJUNTYzMV9QV1JfTU9OT19JTl9QX1ZPTAkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PX0lOX1BfVk9MX0JJVAkJCTcKKyNkZWZpbmUgUlQ1NjMxX1BXUl9NT05PX0lOX05fVk9MCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2MzFfUFdSX01PTk9fSU5fTl9WT0xfQklUCQkJNgorCisvKiBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlcigweDQwKSAqLworI2RlZmluZSBSVDU2MzFfU1BLX0FNUF9BVVRPX1JBVElPX0VOCQkJKDB4MSA8PCAxNSkKKworI2RlZmluZSBSVDU2MzFfU1BLX0FNUF9SQVRJT19DVFJMX01BU0sJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMl8zNAkJKDB4MCA8PCAxMikgLyogNy40MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV85OQkJKDB4MSA8PCAxMikgLyogNS45OURCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV82OAkJKDB4MiA8PCAxMikgLyogNC41MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV81NgkJKDB4MyA8PCAxMikgLyogMy44NkRCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV80NAkJKDB4NCA8PCAxMikgLyogMy4xNkRCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8yNwkJKDB4NSA8PCAxMikgLyogMi4xMERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8wOQkJKDB4NiA8PCAxMikgLyogMC44MERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfMV8wMAkJKDB4NyA8PCAxMikgLyogMC4wMERCICovCisjZGVmaW5lIFJUNTYzMV9TUEtfQU1QX1JBVElPX0NUUkxfU0hJRlQJCTEyCisKKyNkZWZpbmUgUlQ1NjMxX1NURVJFT19EQUNfSElfUEFTU19GSUxUX0VOCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfU1RFUkVPX0FEQ19ISV9QQVNTX0ZJTFRfRU4JCSgweDEgPDwgMTApCisvKiBTZWxlY3QgQURDIFdpbmQgRmlsdGVyIENsb2NrIHR5cGUgKi8KKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0ZJTFRfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0ZJTFRfOF8xNl8zMksJCQkoMHgwIDw8IDQpIC8qOC8xNi8zMmsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF8xMV8yMl80NEsJCSgweDEgPDwgNCkgLyoxMS8yMi80NGsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF8xMl8yNF80OEsJCSgweDIgPDwgNCkgLyoxMi8yNC80OGsqLworI2RlZmluZSBSVDU2MzFfQURDX1dJTkRfRklMVF9FTgkJCSgweDEgPDwgMykKKy8qIFNlbGVjdEFEQyBXaW5kIEZpbHRlciBDb3JuZXIgRnJlcXVlbmN5ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV9NQVNLCSgweDcgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FEQ19XSU5EX0NOUl9GUkVRXzgyXzExM18xMjIJKDB4MCA8PCAwKSAvKiA4Mi8xMTMvMTIyIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xMDJfMTQxXzE1MyAoMHgxIDw8IDApIC8qIDEwMi8xNDEvMTUzIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xMzFfMTgwXzE1NiAoMHgyIDw8IDApIC8qIDEzMS8xODAvMTU2IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8xNjNfMjI1XzI0NSAoMHgzIDw8IDApIC8qIDE2My8yMjUvMjQ1IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8yMDRfMjgxXzMwNiAoMHg0IDw8IDApIC8qIDIwNC8yODEvMzA2IEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8yNjFfMzYwXzM5MiAoMHg1IDw8IDApIC8qIDI2MS8zNjAvMzkyIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV8zMjdfNDUwXzQ5MCAoMHg2IDw8IDApIC8qIDMyNy80NTAvNDkwIEh6ICovCisjZGVmaW5lIFJUNTYzMV9BRENfV0lORF9DTlJfRlJFUV80MDhfNTYzXzYxMiAoMHg3IDw8IDApIC8qIDQwOC81NjMvNjEyIEh6ICovCisKKy8qIEdsb2JhbCBDbG9jayBDb250cm9sIFJlZ2lzdGVyKDB4NDIpICovCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfTUNMSwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9TWVNDTEtfU09VUl9TRUxfUExMCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX1NZU0NMS19TT1VSX1NFTF9QTExfVENLCQkoMHgyIDw8IDE0KQorCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUFTSwkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfTUNMSwkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfQkNMSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfU09VUl9TRUxfVkJDTEsJCQkoMHgyIDw8IDEyKQorCisjZGVmaW5lIFJUNTYzMV9QTExDTEtfUFJFX0RJVjEJCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjMxX1BMTENMS19QUkVfRElWMgkJCQkoMHgxIDw8IDExKQorCisvKiBQTEwgQ29udHJvbCgweDQ0KSAqLworI2RlZmluZSBSVDU2MzFfUExMX0NUUkxfTV9WQUwobSkJCQkoKG0pJjB4ZikKKyNkZWZpbmUgUlQ1NjMxX1BMTF9DVFJMX0tfVkFMKGspCQkJKCgoaykmMHg3KSA8PCA0KQorI2RlZmluZSBSVDU2MzFfUExMX0NUUkxfTl9WQUwobikJCQkoKChuKSYweGZmKSA8PCA4KQorCisvKiBJbnRlcm5hbCBTdGF0dXMgYW5kIElSUSBDb250cm9sMigweDRBKSAqLworI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX0Rpc2FibGUJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01JQzEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX01JQzFfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTYzMV9BRENfREFUQV9TRUxfTUlDMgkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BRENfREFUQV9TRUxfTUlDMl9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjMxX0FEQ19EQVRBX1NFTF9TVE8JCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQURDX0RBVEFfU0VMX1NISUZUCQkJMTQKKworLyogR1BJTyBQaW4gQ29uZmlndXJhdGlvbigweDRDKSAqLworI2RlZmluZSBSVDU2MzFfR1BJT19QSU5fRlVOX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfSVJRCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX0ZVTl9TRUxfR1BJT19ESU1DCQkoMHgwIDw8IDE1KQorCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9NQVNLCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9ESU1DCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9HUElPX0RNSUNfRlVOX1NFTF9HUElPCQkJKDB4MCA8PCAzKQorCisjZGVmaW5lIFJUNTYzMV9HUElPX1BJTl9DT05fTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX1NFVF9JTlBVVAkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0dQSU9fUElOX1NFVF9PVVRQVVQJCQkoMHgxIDw8IDIpCisKKy8qIERlLVBPUCBmdW5jdGlvbiBDb250cm9sIDEoMHg1NCkgKi8KKyNkZWZpbmUgUlQ1NjMxX1BPV19PTl9TT0ZUX0dFTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9FTl9NVVRFX1VOTVVURV9ERVBPUAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9FTl9ERVBPUDJfRk9SX0hQCQkJKDB4MSA8PCA3KQorLyogUG93ZXIgRG93biBIUEFNUF9MIFN0YXJ0cyBVcCBTaWduYWwgKi8KKyNkZWZpbmUgUlQ1NjMxX1BEX0hQQU1QX0xfU1RfVVAJCQkoMHgxIDw8IDUpCisvKiBQb3dlciBEb3duIEhQQU1QX1IgU3RhcnRzIFVwIFNpZ25hbCAqLworI2RlZmluZSBSVDU2MzFfUERfSFBBTVBfUl9TVF9VUAkJCSgweDEgPDwgNCkKKy8qIEVuYWJsZSBsZWZ0IEhQIG11dGUvdW5tdXRlIGRlcG9wICovCisjZGVmaW5lIFJUNTYzMV9FTl9IUF9MX01fVU5fTVVURV9ERVBPUAkJKDB4MSA8PCAxKQorLyogRW5hYmxlIHJpZ2h0IEhQIG11dGUvdW5tdXRlIGRlcG9wICovCisjZGVmaW5lIFJUNTYzMV9FTl9IUF9SX01fVU5fTVVURV9ERVBPUAkJKDB4MSA8PCAwKQorCisvKiBEZS1QT1AgRm5jdGlvbiBDb250cm9sKDB4NTYpICovCisjZGVmaW5lIFJUNTYzMV9FTl9PTkVfQklUX0RFUE9QCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0VOX0NBUF9GUkVFX0RFUE9QCQkJKDB4MSA8PCAxNCkKKworLyogSmFjayBEZXRlY3QgQ29udHJvbCBSZWdpc3RlcigweDVBKSAqLworI2RlZmluZSBSVDU2MzFfSkRfVVNFX01BU0sJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9KRDIJCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9KRDEJCQkJKDB4MiA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX1VTRV9HUElPCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9KRF9PRkYJCQkJCSgweDAgPDwgMTQpCisvKiBKRCB0cmlnZ2VyIGVuYWJsZSBmb3IgSFAgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX0hQX0VOCQkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2MzFfSkRfSFBfVFJJX01BU0sJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjMxX0pEX0hQX1RSSV9ISQkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2MzFfSkRfSFBfVFJJX0xPCQkJCSgweDEgPDwgMTApCisvKiBKRCB0cmlnZ2VyIGVuYWJsZSBmb3Igc3BlYWtlciBMUC9MTiAqLworI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfRU4JCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfVFJJX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfTF9UUklfSEkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2MzFfSkRfU1BLX0xfVFJJX0xPCQkJCSgweDAgPDwgOCkKKy8qIEpEIHRyaWdnZXIgZW5hYmxlIGZvciBzcGVha2VyIFJQL1JOICovCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9FTgkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9UUklfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0pEX1NQS19SX1RSSV9ISQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9KRF9TUEtfUl9UUklfTE8JCQkJKDB4MCA8PCA2KQorLyogSkQgdHJpZ2dlciBlbmFibGUgZm9yIG1vbm9vdXQgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fRU4JCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2MzFfSkRfTU9OT19UUklfTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fVFJJX0hJCQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjMxX0pEX01PTk9fVFJJX0xPCQkJCSgweDAgPDwgNCkKKy8qIEpEIHRyaWdnZXIgZW5hYmxlIGZvciBMb3V0ICovCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9FTgkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9NQVNLCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8xX1RSSV9ISQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9KRF9BVVhfMV9UUklfTE8JCQkJKDB4MCA8PCAyKQorLyogSkQgdHJpZ2dlciBlbmFibGUgZm9yIFJvdXQgKi8KKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX0VOCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX01BU0sJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBSVDU2MzFfSkRfQVVYXzJfVFJJX0hJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0pEX0FVWF8yX1RSSV9MTwkJCQkoMHgwIDw8IDApCisKKy8qIEFMQyBDT05UUk9MIDEoMHg2NCkgKi8KKyNkZWZpbmUgUlQ1NjMxX0FMQ19BVFRBQ0tfUkFURV9NQVNLCQkJKDB4MUYgPDwgOCkKKyNkZWZpbmUgUlQ1NjMxX0FMQ19SRUNPVkVSWV9SQVRFX01BU0sJCSgweDFGIDw8IDApCisKKy8qIEFMQyBDT05UUk9MIDIoMHg2NSkgKi8KKy8qIHNlbGVjdCBDb21wZW5zYXRpb24gZ2FpbiBmb3IgTm9pc2UgZ2F0ZSBmdW5jdGlvbiAqLworI2RlZmluZSBSVDU2MzFfQUxDX0NPTV9OT0lTRV9HQVRFX01BU0sJCSgweEYgPDwgMCkKKworLyogQUxDIENPTlRST0wgMygweDY2KSAqLworI2RlZmluZSBSVDU2MzFfQUxDX0ZVTl9NQVNLCQkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BTENfRlVOX0RJUwkJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfQUxDX0VOQV9EQUNfUEFUSAkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTYzMV9BTENfRU5BX0FEQ19QQVRICQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjMxX0FMQ19QQVJBX1VQREFURQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9BTENfTElNSVRfTEVWRUxfTUFTSwkJCSgweDFGIDw8IDgpCisjZGVmaW5lIFJUNTYzMV9BTENfTk9JU0VfR0FURV9GVU5fTUFTSwkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2MzFfQUxDX05PSVNFX0dBVEVfRlVOX0RJUwkJCSgweDAgPDwgNykKKyNkZWZpbmUgUlQ1NjMxX0FMQ19OT0lTRV9HQVRFX0ZVTl9FTkEJCSgweDEgPDwgNykKKy8qIEFMQyBub2lzZSBnYXRlIGhvbGQgZGF0YSBmdW5jdGlvbiAqLworI2RlZmluZSBSVDU2MzFfQUxDX05PSVNFX0dBVEVfSF9EX01BU0sJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjMxX0FMQ19OT0lTRV9HQVRFX0hfRF9ESVMJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTYzMV9BTENfTk9JU0VfR0FURV9IX0RfRU5BCQkoMHgxIDw8IDYpCisKKy8qIFBzZWR1ZW8gU3RlcmVvICYgU3BhdGlhbCBFZmZlY3QgQmxvY2sgQ29udHJvbCgweDY4KSAqLworI2RlZmluZSBSVDU2MzFfU1BBVElBTF9DVFJMX0VOCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9BTExfUEFTU19GSUxURVJfRU4JCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2MzFfUFNFVURPX1NURVJFT19FTgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTYzMV9TVEVSRU9fRVhQRU5TSU9OX0VOCQkJKDB4MSA8PCAxMikKKy8qIDNEIGdhaW4gcGFyYW1ldGVyICovCisjZGVmaW5lIFJUNTYzMV9HQUlOXzNEX1BBUkFfTUFTSwkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2MzFfR0FJTl8zRF9QQVJBXzFfMDAJCSgweDAgPDwgNikgLyogM0QgZ2FpbiAxLjAgKi8KKyNkZWZpbmUgUlQ1NjMxX0dBSU5fM0RfUEFSQV8xXzUwCQkoMHgxIDw8IDYpIC8qIDNEIGdhaW4gMS41ICovCisjZGVmaW5lIFJUNTYzMV9HQUlOXzNEX1BBUkFfMl8wMAkJKDB4MiA8PCA2KSAvKiAzRCBnYWluIDIuMCAqLworLyogM0QgcmF0aW8gcGFyYW1ldGVyICovCisjZGVmaW5lIFJUNTYzMV9SQVRJT18zRF9NQVNLCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2MzFfUkFUSU9fM0RfMF8wCQkJKDB4MCA8PCA0KSAvKiAzRCByYXRpbyAwLjAgKi8KKyNkZWZpbmUgUlQ1NjMxX1JBVElPXzNEXzBfNjYJCQkoMHgxIDw8IDQpIC8qIDNEIHJhdGlvIDAuNjYgKi8KKyNkZWZpbmUgUlQ1NjMxX1JBVElPXzNEXzFfMAkJCSgweDIgPDwgNCkgLyogM0QgcmF0aW8gMS4wICovCisvKiBzZWxlY3Qgc2FtcGxlcmF0ZSBmb3IgYWxsIHBhc3MgZmlsdGVyICovCisjZGVmaW5lIFJUNTYzMV9BUEZfRlVOX1NMRV9NQVNLCQkJKDB4MyA8PCAwKQorI2RlZmluZSBSVDU2MzFfQVBGX0ZVTl9TRUxfNDhLCQkJCSgweDMgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FQRl9GVU5fU0VMXzQ0XzFLCQkJKDB4MiA8PCAwKQorI2RlZmluZSBSVDU2MzFfQVBGX0ZVTl9TRUxfMzJLCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgUlQ1NjMxX0FQRl9GVU5fRElTCQkJCSgweDAgPDwgMCkKKworLyogRVEgQ09OVFJPTCAxKDB4NkUpICovCisjZGVmaW5lIFJUNTYzMV9IV19FUV9QQVRIX1NFTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjMxX0hXX0VRX1BBVEhfU0VMX0RBQwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTYzMV9IV19FUV9QQVRIX1NFTF9BREMJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2MzFfSFdfRVFfVVBEQVRFX0NUUkwJCQkoMHgxIDw8IDE0KQorCisjZGVmaW5lIFJUNTYzMV9FTl9IV19FUV9IUEYyCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjMxX0VOX0hXX0VRX0hQRjEJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2MzFfRU5fSFdfRVFfQlAzCQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjMxX0VOX0hXX0VRX0JQMgkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTYzMV9FTl9IV19FUV9CUDEJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2MzFfRU5fSFdfRVFfTFBGCQkJCSgweDEgPDwgMCkKKworCisjZW5kaWYgLyogX19SVENPREVDNTYzMV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCA3ZTQwNjZlLi5kMTU2OTVkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMTMwLDE2ICsxMzEsMTMgQEAKIAljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKIAkJLyogY2hhbmdlIG1pYyBiaWFzIHJlc2lzdG9yIHRvIDRLb2htICovCiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMody0+Y29kZWMsIFNHVEw1MDAwX0NISVBfTUlDX0NUUkwsCi0JCQkJU0dUTDUwMDBfQklBU19SXzRrLCBTR1RMNTAwMF9CSUFTX1JfNGspOworCQkJCVNHVEw1MDAwX0JJQVNfUl9NQVNLLAorCQkJCVNHVEw1MDAwX0JJQVNfUl80ayA8PCBTR1RMNTAwMF9CSUFTX1JfU0hJRlQpOwogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCS8qCi0JCSAqIFNHVEw1MDAwX0JJQVNfUl84ayBhcyBtYXNrIHRvIGNsZWFuIHRoZSB0d28gYml0cwotCQkgKiBvZiBtaWMgYmlhcyBhbmQgb3V0cHV0IGltcGVkYW5jZQotCQkgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyh3LT5jb2RlYywgU0dUTDUwMDBfQ0hJUF9NSUNfQ1RSTCwKLQkJCQlTR1RMNTAwMF9CSUFTX1JfOGssIDApOworCQkJCVNHVEw1MDAwX0JJQVNfUl9NQVNLLCAwKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNzI1LDcgKzcyMyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfSTJTX0NUUkwsIGkyc19jdGwsIGkyc19jdGwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfSTJTX0NUUkwsCisJCQkgICAgU0dUTDUwMDBfSTJTX0RMRU5fTUFTSyB8IFNHVEw1MDAwX0kyU19TQ0xLRlJFUV9NQVNLLAorCQkJICAgIGkyc19jdGwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NTYsNyArNzU2LDcgQEAKIAogCS8qIHNldCB2b2x0YWdlIHRvIHJlZ2lzdGVyICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9MSU5SRUdfQ1RSTCwKLQkJCQkoMHgxIDw8IDQpIC0gMSwgcmVnKTsKKwkJCQlTR1RMNTAwMF9MSU5SRUdfVkRERF9NQVNLLCByZWcpOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9BTkFfUE9XRVIsCiAJCQkJU0dUTDUwMDBfTElORVJFR19EX1BPV0VSVVAsCkBAIC03ODIsNyArNzgyLDcgQEAKIAogCS8qIGNsZWFyIHZvbHRhZ2UgaW5mbyAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElOUkVHX0NUUkwsCi0JCQkJKDB4MSA8PCA0KSAtIDEsIDApOworCQkJCVNHVEw1MDAwX0xJTlJFR19WREREX01BU0ssIDApOwogCiAJbGRvLT5lbmFibGVkID0gMDsKIApAQCAtODA4LDYgKzgwOCw3IEBACiAJCQkJaW50IHZvbHRhZ2UpCiB7CiAJc3RydWN0IGxkb19yZWd1bGF0b3IgKmxkbzsKKwlzdHJ1Y3Qgc2d0bDUwMDBfcHJpdiAqc2d0bDUwMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCWxkbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsZG9fcmVndWxhdG9yKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTg0Miw2ICs4NDMsNyBAQAogCiAJCXJldHVybiByZXQ7CiAJfQorCXNndGw1MDAwLT5sZG8gPSBsZG87CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTUsNyArMTExNyw3IEBACiAKIAkvKiBzZXQgdm9sdGFnZSB0byByZWdpc3RlciAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElOUkVHX0NUUkwsCi0JCQkJKDB4MSA8PCA0KSAtIDEsIDB4OCk7CisJCQkJU0dUTDUwMDBfTElOUkVHX1ZERERfTUFTSywgMHg4KTsKIAogCS8qCiAJICogaWYgdmRkZCBsaW5lYXIgcmVnIGhhcyBiZWVuIGVuYWJsZWQsCkBAIC0xMTQ2LDggKzExNDgsNyBAQAogCQl2YWcgPSAodmFnIC0gU0dUTDUwMDBfQU5BX0dORF9CQVNFKSAvIFNHVEw1MDAwX0FOQV9HTkRfU1RQOwogCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9SRUZfQ1RSTCwKLQkJCXZhZyA8PCBTR1RMNTAwMF9BTkFfR05EX1NISUZULAotCQkJdmFnIDw8IFNHVEw1MDAwX0FOQV9HTkRfU0hJRlQpOworCQkJU0dUTDUwMDBfQU5BX0dORF9NQVNLLCB2YWcgPDwgU0dUTDUwMDBfQU5BX0dORF9TSElGVCk7CiAKIAkvKiBzZXQgbGluZSBvdXQgVkFHIHRvIHZkZGlvIC8gMiwgaW4gcmFuZ2UgKDAuOHYsIDEuNjc1dikgKi8KIAl2YWcgPSB2ZGRpbyAvIDI7CkBAIC0xMTYxLDkgKzExNjIsOCBAQAogCQkgICAgU0dUTDUwMDBfTElORV9PVVRfR05EX1NUUDsKIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHVEw1MDAwX0NISVBfTElORV9PVVRfQ1RSTCwKLQkJCXZhZyA8PCBTR1RMNTAwMF9MSU5FX09VVF9HTkRfU0hJRlQgfAotCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF8zNjB1IDw8Ci0JCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF9TSElGVCwKKwkJCVNHVEw1MDAwX0xJTkVfT1VUX0NVUlJFTlRfTUFTSyB8CisJCQlTR1RMNTAwMF9MSU5FX09VVF9HTkRfTUFTSywKIAkJCXZhZyA8PCBTR1RMNTAwMF9MSU5FX09VVF9HTkRfU0hJRlQgfAogCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF8zNjB1IDw8CiAJCQkJU0dUTDUwMDBfTElORV9PVVRfQ1VSUkVOVF9TSElGVCk7CkBAIC0xNDM2LDEwICsxNDM2LDE3IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzZ3RsNTAwMF9pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNndGw1MDAwX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLHNndGw1MDAwIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZ3RsNTAwMF9kdF9pZHMpOworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2d0bDUwMDBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJzZ3RsNTAwMCIsCiAJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBzZ3RsNTAwMF9kdF9pZHMsCiAJCSAgIH0sCiAJLnByb2JlID0gc2d0bDUwMDBfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZ3RsNTAwMF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuaAppbmRleCBlZWMzYWIzLi44YTlmNDM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5oCkBAIC0yODAsNyArMjgwLDcgQEAKIC8qCiAgKiBTR1RMNTAwMF9DSElQX01JQ19DVFJMCiAgKi8KLSNkZWZpbmUgU0dUTDUwMDBfQklBU19SX01BU0sJCQkweDAyMDAKKyNkZWZpbmUgU0dUTDUwMDBfQklBU19SX01BU0sJCQkweDAzMDAKICNkZWZpbmUgU0dUTDUwMDBfQklBU19SX1NISUZUCQkJOAogI2RlZmluZSBTR1RMNTAwMF9CSUFTX1JfV0lEVEgJCQkyCiAjZGVmaW5lIFNHVEw1MDAwX0JJQVNfUl9vZmYJCQkweDAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKaW5kZXggODRmZmRlYi4uODg3ZDYxOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC03OSw3ICs4MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZmluZF9mcmVlX2NoYW5uZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKnNuOTUwMzFfY29kZWMpCiB7Ci0JaW50IHJldCA9IDAsIGksIHZhbHVlOworCWludCBpLCB2YWx1ZTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgQURDIGlzIGVuYWJsZWQgKi8KIAl2YWx1ZSA9IHNuZF9zb2NfcmVhZChzbjk1MDMxX2NvZGVjLCBTTjk1MDMxX0FEQzFDTlRMMSk7CkBAIC05MSwxMiArOTIsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwJU045NTAzMV9BRENfQ0hBTkxTX01BWDsgaSsrKSB7CiAJCXZhbHVlID0gc25kX3NvY19yZWFkKHNuOTUwMzFfY29kZWMsCiAJCQkJU045NTAzMV9BRENfQ0hOTF9TVEFSVF9BRERSICsgaSk7Ci0JCWlmICh2YWx1ZSAmIFNOOTUwMzFfU1RPUEJJVF9NQVNLKSB7Ci0JCQlyZXQgPSBpOworCQlpZiAodmFsdWUgJiBTTjk1MDMxX1NUT1BCSVRfTUFTSykKIAkJCWJyZWFrOwotCQl9CiAJfQotCXJldHVybiAocmV0ID4gU045NTAzMV9BRENfTE9PUF9NQVgpID8gKC1FSU5WQUwpIDogcmV0OworCXJldHVybiAoaSA9PSBTTjk1MDMxX0FEQ19DSEFOTFNfTUFYKSA/ICgtRUlOVkFMKSA6IGk7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIEFEQyBmb3IgcmVhZGluZyBtaWNiaWFzIHZhbHVlcy4gQ2FuIHNsZWVwLiAqLwpAQCAtMTA0LDcgKzEwMyw3IEBACiB7CiAJaW50IGJhc2VfYWRkciwgY2hubF9hZGRyOwogCWludCB2YWx1ZTsKLQlzdGF0aWMgaW50IGNoYW5uZWxfaW5kZXg7CisJaW50IGNoYW5uZWxfaW5kZXg7CiAKIAkvKiBJbmRleCBvZiB0aGUgZmlyc3QgY2hhbm5lbCBpbiB3aGljaCB0aGUgc3RvcCBiaXQgaXMgc2V0ICovCiAJY2hhbm5lbF9pbmRleCA9IGZpbmRfZnJlZV9jaGFubmVsKHNuOTUwMzFfY29kZWMpOwpAQCAtMTYzLDcgKzE2Miw2IEBACiAJcHJfZGVidWcoIm1pYyBiaWFzID0gJWRtVlxuIiwgbWljX2JpYXMpOwogCXJldHVybiBtaWNfYmlhczsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuOTUwMzFfZ2V0X21pY19iaWFzKTsKIC8qZW5kIC0gYWRjIGhlbHBlciBmdW5jdGlvbnMgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc245NTAzMV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKQEAgLTY2MCw3ICs2NTgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc245NTAzMV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBzbjk1MDMxX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKIAl1bnNpZ25lZCBpbnQgZm9ybWF0LCByYXRlOwpAQCAtNzE4LDcgKzcxNiw3IEBACiAJLmh3X3BhcmFtcwk9IHNuOTUwMzFfcGNtX2h3X3BhcmFtcywKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc245NTAzMV9kYWlzW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzbjk1MDMxX2RhaXNbXSA9IHsKIHsKIAkubmFtZSA9ICJTTjk1MDMxIEhlYWRzZXQiLAogCS5wbGF5YmFjayA9IHsKQEAgLTgyOSw3ICs4MjcsNiBAQAogewogCXByX2RlYnVnKCJjb2RlY19wcm9iZSBjYWxsZWRcbiIpOwogCi0JY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAKIAkvKiBQQ00gaW50ZXJmYWNlIGNvbmZpZwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwppbmRleCA5ODAxY2Q3Li4zY2IzMjcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYwpAQCAtNTksNiArNTksNyBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2xhdmVfc3Vic3RyZWFtOwogCiAJZW51bSBzc20yNjAyX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2xrX291dF9wd3I7CiB9OwogCiAvKgpAQCAtMjk0LDcgKzI5NSw2IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNzbTI2MDJfcHJpdiAqc3NtMjYwMiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKm1hc3Rlcl9ydW50aW1lOwogCiAJLyogVGhlIERBSSBoYXMgc2hhcmVkIGNsb2NrcyBzbyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBwbGF5YmFjayBvcgpAQCAtMzAzLDcgKzMwMyw3IEBACiAJICovCiAJaWYgKHNzbTI2MDItPm1hc3Rlcl9zdWJzdHJlYW0pIHsKIAkJbWFzdGVyX3J1bnRpbWUgPSBzc20yNjAyLT5tYXN0ZXJfc3Vic3RyZWFtLT5ydW50aW1lOwotCQlkZXZfZGJnKCZpMmMtPmRldiwgIkNvbnN0cmFpbmluZyB0byAlZCBiaXRzIGF0ICVkSHpcbiIsCisJCWRldl9kYmcoY29kZWMtPmRldiwgIkNvbnN0cmFpbmluZyB0byAlZCBiaXRzIGF0ICVkSHpcbiIsCiAJCQltYXN0ZXJfcnVudGltZS0+c2FtcGxlX2JpdHMsCiAJCQltYXN0ZXJfcnVudGltZS0+cmF0ZSk7CiAKQEAgLTM0MywxMiArMzQzLDE0IEBACiBzdGF0aWMgaW50IHNzbTI2MDJfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQl1MTYgbXV0ZV9yZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfQVBESUdJKSAmIH5BUERJR0lfRU5BQkxFX0RBQ19NVVRFOworCiAJaWYgKG11dGUpCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBESUdJLAotCQkJCW11dGVfcmVnIHwgQVBESUdJX0VOQUJMRV9EQUNfTVVURSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfQVBESUdJLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFKTsKIAllbHNlCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFNTTTI2MDJfQVBESUdJLCBtdXRlX3JlZyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfQVBESUdJLAorCQkJCSAgICBBUERJR0lfRU5BQkxFX0RBQ19NVVRFLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU3LDE2ICszNTksNDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzd2l0Y2ggKGZyZXEpIHsKLQljYXNlIDExMjg5NjAwOgotCWNhc2UgMTIwMDAwMDA6Ci0JY2FzZSAxMjI4ODAwMDoKLQljYXNlIDE2OTM0NDAwOgotCWNhc2UgMTg0MzIwMDA6Ci0JCXNzbTI2MDItPnN5c2NsayA9IGZyZXE7Ci0JCXJldHVybiAwOworCisJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKSB7CisJCWlmIChjbGtfaWQgIT0gU1NNMjYwMl9TWVNDTEspCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKGZyZXEpIHsKKwkJY2FzZSAxMTI4OTYwMDoKKwkJY2FzZSAxMjAwMDAwMDoKKwkJY2FzZSAxMjI4ODAwMDoKKwkJY2FzZSAxNjkzNDQwMDoKKwkJY2FzZSAxODQzMjAwMDoKKwkJCXNzbTI2MDItPnN5c2NsayA9IGZyZXE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisKKwkJc3dpdGNoIChjbGtfaWQpIHsKKwkJY2FzZSBTU00yNjAyX0NMS19DTEtPVVQ6CisJCQltYXNrID0gUFdSX0NMS19PVVRfUEROOworCQkJYnJlYWs7CisJCWNhc2UgU1NNMjYwMl9DTEtfWFRPOgorCQkJbWFzayA9IFBXUl9PU0NfUEROOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChmcmVxID09IDApCisJCQlzc20yNjAyLT5jbGtfb3V0X3B3ciB8PSBtYXNrOworCQllbHNlCisJCQlzc20yNjAyLT5jbGtfb3V0X3B3ciAmPSB+bWFzazsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTU00yNjAyX1BXUiwKKwkJCVBXUl9DTEtfT1VUX1BETiB8IFBXUl9PU0NfUEROLCBzc20yNjAyLT5jbGtfb3V0X3B3cik7CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3NtMjYwMl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKQEAgLTQzMSwyMyArNDYzLDI3IEBACiBzdGF0aWMgaW50IHNzbTI2MDJfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKLQl1MTYgcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1BXUik7Ci0JcmVnICY9IH4oUFdSX1BPV0VSX09GRiB8IFBXUl9PU0NfUEROKTsKKwlzdHJ1Y3Qgc3NtMjYwMl9wcml2ICpzc20yNjAyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JCS8qIHZyZWYvbWlkLCBvc2Mgb24sIGRhYyB1bm11dGUgKi8KLQkJc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9QV1IsIHJlZyk7CisJCS8qIHZyZWYvbWlkIG9uLCBvc2MgYW5kIGNsa291dCBvbiBpZiBlbmFibGVkICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUFdSLAorCQkJUFdSX1BPV0VSX09GRiB8IFBXUl9DTEtfT1VUX1BETiB8IFBXUl9PU0NfUEROLAorCQkJc3NtMjYwMi0+Y2xrX291dF9wd3IpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQkvKiBldmVyeXRoaW5nIG9mZiBleGNlcHQgdnJlZi92bWlkLCAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX1BXUiwgcmVnIHwgUFdSX0NMS19PVVRfUEROKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1NNMjYwMl9QV1IsCisJCQlQV1JfUE9XRVJfT0ZGIHwgUFdSX0NMS19PVVRfUEROIHwgUFdSX09TQ19QRE4sCisJCQlQV1JfQ0xLX09VVF9QRE4gfCBQV1JfT1NDX1BETik7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX1BXUiwgMHhmZmZmKTsKKwkJLyogZXZlcnl0aGluZyBvZmYgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU1NNMjYwMl9QV1IsCisJCQlQV1JfUE9XRVJfT0ZGLCBQV1JfUE9XRVJfT0ZGKTsKIAkJYnJlYWs7CiAKIAl9CkBAIC01MDYsMTIgKzU0MiwxMiBAQAogc3RhdGljIGludCBzc20yNjAyX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IHJldCwgcmVnOworCWludCByZXQ7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfTE9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX0xPVVQxViwgcmVnIHwgTE9VVDFWX0xSSFBfQk9USCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9ST1VUMVYsIHJlZyB8IFJPVVQxVl9STEhQX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfTE9VVDFWLAorCQkJICAgIExPVVQxVl9MUkhQX0JPVEgsIExPVVQxVl9MUkhQX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUk9VVDFWLAorCQkJICAgIFJPVVQxVl9STEhQX0JPVEgsIFJPVVQxVl9STEhQX0JPVEgpOwogCiAJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHNzbTI2MDJfc25kX2NvbnRyb2xzLAogCQkJQVJSQVlfU0laRShzc20yNjAyX3NuZF9jb250cm9scykpOwpAQCAtNTQ0LDcgKzU4MCw3IEBACiBzdGF0aWMgaW50IHNzbTI2MHhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBzc20yNjAyX3ByaXYgKnNzbTI2MDIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0LCByZWc7CisJaW50IHJldDsKIAogCXByX2luZm8oInNzbTI2MDIgQXVkaW8gQ29kZWMgJXMiLCBTU00yNjAyX1ZFUlNJT04pOwogCkBAIC01NjEsMTAgKzU5NywxMCBAQAogCX0KIAogCS8qIHNldCB0aGUgdXBkYXRlIGJpdHMgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFNTTTI2MDJfTElOVk9MKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBTU00yNjAyX0xJTlZPTCwgcmVnIHwgTElOVk9MX0xSSU5fQk9USCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBTU00yNjAyX1JJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9SSU5WT0wsIHJlZyB8IFJJTlZPTF9STElOX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfTElOVk9MLAorCQkJICAgIExJTlZPTF9MUklOX0JPVEgsIExJTlZPTF9MUklOX0JPVEgpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNTTTI2MDJfUklOVk9MLAorCQkJICAgIFJJTlZPTF9STElOX0JPVEgsIFJJTlZPTF9STElOX0JPVEgpOwogCS8qc2VsZWN0IExpbmUgaW4gYXMgZGVmYXVsdCBpbnB1dCovCiAJc25kX3NvY193cml0ZShjb2RlYywgU1NNMjYwMl9BUEFOQSwgQVBBTkFfU0VMRUNUX0RBQyB8CiAJCQlBUEFOQV9FTkFCTEVfTUlDX0JPT1NUKTsKQEAgLTU3OCw3ICs2MTQsMTIgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3NtMjYwMl9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIHJlbW92ZSBldmVyeXRoaW5nIGhlcmUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5oIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKaW5kZXggYjk4YzY5MS4uZmJkMDdkNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmgKQEAgLTExNiw2ICsxMTYsMTAgQEAKIAogI2RlZmluZSBTU00yNjAyX0NBQ0hFUkVHTlVNIAkxMAogCi0jZGVmaW5lIFNTTTI2MDJfU1lTQ0xLCTAKK2VudW0gc3NtMjYwMl9jbGsgeworCVNTTTI2MDJfU1lTQ0xLLAorCVNTTTI2MDJfQ0xLX0NMS09VVCwKKwlTU00yNjAyX0NMS19YVE8KK307CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggZmJkN2ViOS4uYmI4MjQwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC01MjQsMTMgKzUyNCwxNyBAQAogCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCXByX2RlYnVnKCJyYXRlOiAldVxuIiwgcmF0ZSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZXJwb2xhdGlvbl9yYXRpb3MpOyBpKyspCi0JCWlmIChpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5mcyA9PSByYXRlKQorCQlpZiAoaW50ZXJwb2xhdGlvbl9yYXRpb3NbaV0uZnMgPT0gcmF0ZSkgewogCQkJaXIgPSBpbnRlcnBvbGF0aW9uX3JhdGlvc1tpXS5pcjsKKwkJCWJyZWFrOworCQl9CiAJaWYgKGlyIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZm9yIChpID0gMDsgbWNsa19yYXRpb3NbaXJdW2ldLnJhdGlvOyBpKyspCi0JCWlmIChtY2xrX3JhdGlvc1tpcl1baV0ucmF0aW8gKiByYXRlID09IHN0YTMyeC0+bWNsaykKKwkJaWYgKG1jbGtfcmF0aW9zW2lyXVtpXS5yYXRpbyAqIHJhdGUgPT0gc3RhMzJ4LT5tY2xrKSB7CiAJCQltY3MgPSBtY2xrX3JhdGlvc1tpcl1baV0ubWNzOworCQkJYnJlYWs7CisJCX0KIAlpZiAobWNzIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTc1MiwyNSArNzU2LDE5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogcmVhZCByZWcgcmVzZXQgdmFsdWVzIGludG8gY2FjaGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgU1RBMzJYX1JFR0lTVEVSX0NPVU5UOyBpKyspCi0JCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIGksIHN0YTMyeF9yZWdzW2ldKTsKLQotCS8qIHByZXNlcnZlIHJlc2V0IHZhbHVlcyBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzICovCi0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0NPTkZDLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQ09ORkMpKTsKLQlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkUsCi0JCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9DT05GRSkpOwotCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GRiwKLQkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0NPTkZGKSk7Ci0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX01NVVRFLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfTU1VVEUpKTsKLQlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQVVUTzEsCi0JCQkgICAgY29kZWMtPmh3X3JlYWQoY29kZWMsIFNUQTMyWF9BVVRPMSkpOwotCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9BVVRPMywKLQkJCSAgICBjb2RlYy0+aHdfcmVhZChjb2RlYywgU1RBMzJYX0FVVE8zKSk7Ci0Jc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0MzQ0ZHLAotCQkJICAgIGNvZGVjLT5od19yZWFkKGNvZGVjLCBTVEEzMlhfQzNDRkcpKTsKKwkvKiBDaGlwIGRvY3VtZW50YXRpb24gZXhwbGljaXRseSByZXF1aXJlcyB0aGF0IHRoZSByZXNldCB2YWx1ZXMKKwkgKiBvZiByZXNlcnZlZCByZWdpc3RlciBiaXRzIGFyZSBsZWZ0IHVudG91Y2hlZC4KKwkgKiBXcml0ZSB0aGUgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSB0byBjYWNoZSBmb3IgcmVzZXJ2ZWQgcmVnaXN0ZXJzLAorCSAqIHNvIHRoZSB3cml0ZSB0byB0aGUgdGhlc2UgcmVnaXN0ZXJzIGFyZSBzdXBwcmVzc2VkIGJ5IHRoZSBjYWNoZQorCSAqIHJlc3RvcmUgY29kZSB3aGVuIGl0IHNraXBzIHdyaXRlcyBvZiBkZWZhdWx0IHJlZ2lzdGVycy4KKwkgKi8KKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQ09ORkMsIDB4YzIpOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9DT05GRSwgMHhjMik7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0NPTkZGLCAweDVjKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfTU1VVEUsIDB4MTApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIFNUQTMyWF9BVVRPMSwgMHg2MCk7CisJc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgU1RBMzJYX0FVVE8zLCAweDAwKTsKKwlzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCBTVEEzMlhfQzNDRkcsIDB4NDApOwogCiAJLyogRklYTUUgZW5hYmxlIHRoZXJtYWwgd2FybmluZyBhZGp1c3RtZW50IGFuZCByZWNvdmVyeSAgKi8KIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTVEEzMlhfQ09ORkEsCkBAIC04MDgsNiArODA2LDcgQEAKIHsKIAlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCisJc3RhMzJ4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksIHN0YTMyeC0+c3VwcGxpZXMpOwogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShzdGEzMngtPnN1cHBsaWVzKSwgc3RhMzJ4LT5zdXBwbGllcyk7CiAKQEAgLTgzMiw2ICs4MzEsNyBAQAogCS5yZXN1bWUgPQkJc3RhMzJ4X3Jlc3VtZSwKIAkucmVnX2NhY2hlX3NpemUgPQlTVEEzMlhfUkVHSVNURVJfQ09VTlQsCiAJLnJlZ193b3JkX3NpemUgPQlzaXplb2YodTgpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9CXN0YTMyeF9yZWdzLAogCS52b2xhdGlsZV9yZWdpc3RlciA9CXN0YTMyeF9yZWdfaXNfdm9sYXRpbGUsCiAJLnNldF9iaWFzX2xldmVsID0Jc3RhMzJ4X3NldF9iaWFzX2xldmVsLAogCS5jb250cm9scyA9CQlzdGEzMnhfc25kX2NvbnRyb2xzLApAQCAtODY3LDE4ICs4NjcsOCBAQAogc3RhdGljIF9fZGV2ZXhpdCBpbnQgc3RhMzJ4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3Qgc3RhMzJ4X3ByaXYgKnN0YTMyeCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHN0YTMyeC0+Y29kZWM7CiAKLQlpZiAoY29kZWMpCi0JCXN0YTMyeF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7Ci0KLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUoc3RhMzJ4LT5zdXBwbGllcyksIHN0YTMyeC0+c3VwcGxpZXMpOwotCi0JaWYgKGNvZGVjKSB7Ci0JCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOwotCQlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCBOVUxMKTsKLQl9Ci0KKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKIAlrZnJlZShzdGEzMngpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IDMzYmI1MmYuLjMzNmRlOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTQ3LDYzICs0Nyw2IEBACiAJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAkvKiAxMiAqLwogfTsKIAotLyoKLSAqIHJlYWQgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMKLQkJCQkJCSAgICAgICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBjYWNoZVtyZWddOwotfQotCi0vKgotICogd3JpdGUgdGx2MzIwYWljMjMgcmVnaXN0ZXIgY2FjaGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgICB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpZiAocmVnID49IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfcmVnKSkKLQkJcmV0dXJuOwotCWNhY2hlW3JlZ10gPSB2YWx1ZTsKLX0KLQotLyoKLSAqIHdyaXRlIHRvIHRoZSB0bHYzMjBhaWMyMyByZWdpc3RlciBzcGFjZQotICovCi1zdGF0aWMgaW50IHRsdjMyMGFpYzIzX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCi0JdTggZGF0YVsyXTsKLQotCS8qIFRMVjMyMEFJQzIzIGhhcyA3IGJpdCBhZGRyZXNzIGFuZCA5IGJpdHMgb2YgZGF0YQotCSAqIHNvIHdlIG5lZWQgdG8gc3dpdGNoIG9uZSBkYXRhIGJpdCBpbnRvIHJlZyBhbmQgcmVzdAotCSAqIG9mIGRhdGEgaW50byB2YWwKLQkgKi8KLQotCWlmIChyZWcgPiA5ICYmIHJlZyAhPSAxNSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBJbnZhbGlkIHJlZ2lzdGVyIFIldVxuIiwgX19mdW5jX18sIHJlZyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlkYXRhWzBdID0gKHJlZyA8PCAxKSB8ICh2YWx1ZSA+PiA4ICYgMHgwMSk7Ci0JZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKLQotCXRsdjMyMGFpYzIzX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgcmVnLCB2YWx1ZSk7Ci0KLQlpZiAoY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpID09IDIpCi0JCXJldHVybiAwOwotCi0JcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgd3JpdGUgJTAzeCB0byByZWdpc3RlciBSJXVcbiIsIF9fZnVuY19fLAotCSAgICAgICB2YWx1ZSwgcmVnKTsKLQotCXJldHVybiAtRUlPOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqcmVjX3NyY190ZXh0W10gPSB7ICJMaW5lIiwgIk1pYyIgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpkZWVtcGhfdGV4dFtdID0geyJOb25lIiwgIjMyS2h6IiwgIjQ0LjFLaHoiLCAiNDhLaHoifTsKIApAQCAtMTM5LDggKzgyLDggQEAKIAkqLwogCXZhbCA9ICh2YWwgPj0gNCkgPyA0ICA6ICgzIC0gdmFsKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHKSAmICh+MHgxQzApOwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHLCByZWcgfCAodmFsIDw8IDYpKTsKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFRMVjMyMEFJQzIzX0FOTEcpICYgKH4weDFDMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRywgcmVnIHwgKHZhbCA8PCA2KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MSw3ICs5NCw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXUxNiB2YWw7CiAKLQl2YWwgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRykgJiAoMHgxQzApOworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfQU5MRykgJiAoMHgxQzApOwogCXZhbCA9IHZhbCA+PiA2OwogCXZhbCA9ICh2YWwgPj0gNCkgPyA0ICA6ICgzIC0gIHZhbCk7CiAJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7CkBAIC0xNTksMTUgKzEwMiw2IEBACiAKIH0KIAotI2RlZmluZSBTT0NfVExWMzIwQUlDMjNfU0lOR0xFX1RMVih4bmFtZSwgcmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQsIHRsdl9hcnJheSkgXAotewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKLQkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIC5nZXQgPSBzbmRfc29jX3RsdjMyMGFpYzIzX2dldF92b2xzdyxcCi0JLnB1dCA9IHNuZF9zb2NfdGx2MzIwYWljMjNfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBUTFYzMjBBSUMyM19MQ0hOVk9MLAogCQkJIFRMVjMyMEFJQzIzX1JDSE5WT0wsIDAsIDEyNywgMCwgb3V0X2dhaW5fdGx2KSwKQEAgLTE3OCw4ICsxMTIsOSBAQAogCQkJIFRMVjMyMEFJQzIzX1JJTlZPTCwgMCwgMzEsIDAsIGlucHV0X2dhaW5fdGx2KSwKIAlTT0NfU0lOR0xFKCJNaWMgSW5wdXQgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgMSwgMSwgMSksCiAJU09DX1NJTkdMRSgiTWljIEJvb3N0ZXIgU3dpdGNoIiwgVExWMzIwQUlDMjNfQU5MRywgMCwgMSwgMCksCi0JU09DX1RMVjMyMEFJQzIzX1NJTkdMRV9UTFYoIlNpZGV0b25lIFZvbHVtZSIsIFRMVjMyMEFJQzIzX0FOTEcsCi0JCQkJICA2LCA0LCAwLCBzaWRldG9uZV92b2xfdGx2KSwKKwlTT0NfU0lOR0xFX0VYVF9UTFYoIlNpZGV0b25lIFZvbHVtZSIsIFRMVjMyMEFJQzIzX0FOTEcsIDYsIDQsIDAsCisJCQkgICBzbmRfc29jX3RsdjMyMGFpYzIzX2dldF92b2xzdywKKwkJCSAgIHNuZF9zb2NfdGx2MzIwYWljMjNfcHV0X3ZvbHN3LCBzaWRldG9uZV92b2xfdGx2KSwKIAlTT0NfRU5VTSgiUGxheWJhY2sgRGUtZW1waGFzaXMiLCB0bHYzMjBhaWMyM19kZWVtcGgpLAogfTsKIApAQCAtMjQwLDcgKzE3NSw2IEBACiAvKiBBSUMyMyBkcml2ZXIgZGF0YSAqLwogc3RydWN0IGFpYzIzIHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50IG1jbGs7CiAJaW50IHJlcXVlc3RlZF9hZGM7CiAJaW50IHJlcXVlc3RlZF9kYWM7CkBAIC0zNTIsNyArMjg2LDcgQEAKIHN0YXRpYyB2b2lkIGdldF9jdXJyZW50X3NhbXBsZV9yYXRlcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBtY2xrLAogCQl1MzIgKnNhbXBsZV9yYXRlX2FkYywgdTMyICpzYW1wbGVfcmF0ZV9kYWMpCiB7Ci0JaW50IHNyYyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19TUkFURSk7CisJaW50IHNyYyA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfU1JBVEUpOwogCWludCBzciA9IChzcmMgPj4gMikgJiAweDBmOwogCWludCB2YWwgPSAobWNsayAvIGJvc3JfdXNiX2Rpdmlzb3JfdGFibGVbc3JjICYgM10pOwogCWludCBhZGMgPSAodmFsICogc3JfYWRjX211bHRfdGFibGVbc3JdKSAvIFNSX01VTFQ7CkBAIC0zNzYsNyArMzEwLDcgQEAKIAkJCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGVfYWRjLCBzYW1wbGVfcmF0ZV9kYWMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1NSQVRFLCBkYXRhKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19TUkFURSwgZGF0YSk7CiAjaWZkZWYgREVCVUcKIAl7CiAJCXUzMiBhZGMsIGRhYzsKQEAgLTQxNSw5ICszNDksOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWZhY2VfcmVnID0KLQkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsCi0JCQkJICAgICAgIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmIH4oMHgwMyA8PCAyKTsKKwlpZmFjZV9yZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmIH4oMHgwMyA8PCAyKTsKKwogCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKIAkJYnJlYWs7CkBAIC00MzEsNyArMzY0LDcgQEAKIAkJaWZhY2VfcmVnIHw9ICgweDAzIDw8IDIpOwogCQlicmVhazsKIAl9Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1ULCBpZmFjZV9yZWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NDMsNyArMzc2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCiAJLyogc2V0IGFjdGl2ZSAqLwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MDAwMSk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQUNUSVZFLCAweDAwMDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTgsNyArMzkxLDcgQEAKIAkvKiBkZWFjdGl2YXRlICovCiAJaWYgKCFjb2RlYy0+YWN0aXZlKSB7CiAJCXVkZWxheSg1MCk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgwKTsKIAl9CiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCWFpYzIzLT5yZXF1ZXN0ZWRfZGFjID0gMDsKQEAgLTQ3MSwxNCArNDA0LDE0IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAl1MTYgcmVnOwogCi0JcmVnID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QpOworCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgVExWMzIwQUlDMjNfRElHVCk7CiAJaWYgKG11dGUpCiAJCXJlZyB8PSBUTFYzMjBBSUMyM19EQUNNX01VVEU7CiAKIAllbHNlCiAJCXJlZyAmPSB+VExWMzIwQUlDMjNfREFDTV9NVVRFOwogCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QsIHJlZyk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfRElHVCwgcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDg5LDggKzQyMiw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKIAl1MTYgaWZhY2VfcmVnOwogCi0JaWZhY2VfcmVnID0KLQkgICAgdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1RfRk1UKSAmICh+MHgwMyk7CisJaWZhY2VfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCkgJiAofjB4MDMpOwogCiAJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KIAlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CkBAIC00OTgsNiArNDMwLDcgQEAKIAkJaWZhY2VfcmVnIHw9IFRMVjMyMEFJQzIzX01TX01BU1RFUjsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlpZmFjZV9yZWcgJj0gflRMVjMyMEFJQzIzX01TX01BU1RFUjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MjQsNyArNDU3LDcgQEAKIAogCX0KIAotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCwgaWZhY2VfcmVnKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdUX0ZNVCwgaWZhY2VfcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTQwLDI2ICs0NzMsMjYgQEAKIHN0YXRpYyBpbnQgdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXUxNiByZWcgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfUFdSKSAmIDB4ZmY3ZjsKKwl1MTYgcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IpICYgMHhmZjdmOwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCQkvKiB2cmVmL21pZCwgb3NjIG9uLCBkYWMgdW5tdXRlICovCiAJCXJlZyAmPSB+KFRMVjMyMEFJQzIzX0RFVklDRV9QV1JfT0ZGIHwgVExWMzIwQUlDMjNfT1NDX09GRiB8IFwKIAkJCVRMVjMyMEFJQzIzX0RBQ19PRkYpOwotCQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUFdSLCByZWcpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCi0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIHJlZyB8IFwKLQkJCVRMVjMyMEFJQzIzX0NMS19PRkYpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsCisJCQkgICAgICByZWcgfCBUTFYzMjBBSUMyM19DTEtfT0ZGKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQkvKiBldmVyeXRoaW5nIG9mZiwgZGFjIG11dGUsIGluYWN0aXZlICovCi0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MCk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19QV1IsIDB4ZmZmZik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUFdSLCAweGZmZmYpOwogCQlicmVhazsKIAl9CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwpAQCAtNjA2LDEzICs1MzksNyBAQAogCiBzdGF0aWMgaW50IHRsdjMyMGFpYzIzX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JdTE2IHJlZzsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChyZWcgPSAwOyByZWcgPD0gVExWMzIwQUlDMjNfQUNUSVZFOyByZWcrKykgewotCQl1MTYgdmFsID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIHJlZyk7Ci0JCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7Ci0JfQorCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CiAJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCXJldHVybiAwOwpAQCAtNjIxLDQ2ICs1NDgsNTIgQEAKIHN0YXRpYyBpbnQgdGx2MzIwYWljMjNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhaWMyMyAqYWljMjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmVnOworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBSUMyMyBBdWRpbyBDb2RlYyAlc1xuIiwgQUlDMjNfVkVSU0lPTik7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFpYzIzLT5jb250cm9sX2RhdGE7Ci0JY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotCWNvZGVjLT5od19yZWFkID0gTlVMTDsKKworCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBhaWMyMy0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogUmVzZXQgY29kZWMgKi8KLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfUkVTRVQsIDApOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1JFU0VULCAwKTsKKworCS8qIFdyaXRlIHRoZSByZWdpc3RlciBkZWZhdWx0IHZhbHVlIHRvIGNhY2hlIGZvciByZXNlcnZlZCByZWdpc3RlcnMsCisJICogc28gdGhlIHdyaXRlIHRvIHRoZSB0aGVzZSByZWdpc3RlcnMgYXJlIHN1cHByZXNzZWQgYnkgdGhlIGNhY2hlCisJICogcmVzdG9yZSBjb2RlIHdoZW4gaXQgc2tpcHMgd3JpdGVzIG9mIGRlZmF1bHQgcmVnaXN0ZXJzLgorCSAqLworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEEsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEIsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEMsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEQsIDApOworCXNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIDB4MEUsIDApOwogCiAJLyogcG93ZXIgb24gZGV2aWNlICovCiAJdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19ESUdULCBUTFYzMjBBSUMyM19ERUVNUF80NEspOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0RJR1QsIFRMVjMyMEFJQzIzX0RFRU1QXzQ0Syk7CiAKIAkvKiBVbm11dGUgaW5wdXQgKi8KLQlyZWcgPSB0bHYzMjBhaWMyM19yZWFkX3JlZ19jYWNoZShjb2RlYywgVExWMzIwQUlDMjNfTElOVk9MKTsKLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfTElOVk9MLAotCQkJICAocmVnICYgKH5UTFYzMjBBSUMyM19MSU1fTVVURUQpKSB8Ci0JCQkgIChUTFYzMjBBSUMyM19MUlNfRU5BQkxFRCkpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRMVjMyMEFJQzIzX0xJTlZPTCwKKwkJCSAgICBUTFYzMjBBSUMyM19MSU1fTVVURUQsIFRMVjMyMEFJQzIzX0xSU19FTkFCTEVEKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wpOwotCXRsdjMyMGFpYzIzX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SSU5WT0wsCi0JCQkgIChyZWcgJiAoflRMVjMyMEFJQzIzX0xJTV9NVVRFRCkpIHwKLQkJCSAgVExWMzIwQUlDMjNfTFJTX0VOQUJMRUQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFRMVjMyMEFJQzIzX1JJTlZPTCwKKwkJCSAgICBUTFYzMjBBSUMyM19MSU1fTVVURUQsIFRMVjMyMEFJQzIzX0xSU19FTkFCTEVEKTsKIAotCXJlZyA9IHRsdjMyMGFpYzIzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUTFYzMjBBSUMyM19BTkxHKTsKLQl0bHYzMjBhaWMyM193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfQU5MRywKLQkJCSAocmVnKSAmICh+VExWMzIwQUlDMjNfQllQQVNTX09OKSAmCi0JCQkgKH5UTFYzMjBBSUMyM19NSUNNX01VVEVEKSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgVExWMzIwQUlDMjNfQU5MRywKKwkJCSAgICBUTFYzMjBBSUMyM19CWVBBU1NfT04gfCBUTFYzMjBBSUMyM19NSUNNX01VVEVELAorCQkJICAgIDApOwogCiAJLyogRGVmYXVsdCBvdXRwdXQgdm9sdW1lICovCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0xDSE5WT0wsCi0JCQkgIFRMVjMyMEFJQzIzX0RFRkFVTFRfT1VUX1ZPTCAmCi0JCQkgIFRMVjMyMEFJQzIzX09VVF9WT0xfTUFTSyk7Ci0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1JDSE5WT0wsCi0JCQkgIFRMVjMyMEFJQzIzX0RFRkFVTFRfT1VUX1ZPTCAmCi0JCQkgIFRMVjMyMEFJQzIzX09VVF9WT0xfTUFTSyk7CisJc25kX3NvY193cml0ZShjb2RlYywgVExWMzIwQUlDMjNfTENITlZPTCwKKwkJICAgICAgVExWMzIwQUlDMjNfREVGQVVMVF9PVVRfVk9MICYgVExWMzIwQUlDMjNfT1VUX1ZPTF9NQVNLKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19SQ0hOVk9MLAorCQkgICAgICBUTFYzMjBBSUMyM19ERUZBVUxUX09VVF9WT0wgJiBUTFYzMjBBSUMyM19PVVRfVk9MX01BU0spOwogCi0JdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX0FDVElWRSwgMHgxKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBUTFYzMjBBSUMyM19BQ1RJVkUsIDB4MSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzLAogCQkJCUFSUkFZX1NJWkUodGx2MzIwYWljMjNfc25kX2NvbnRyb2xzKSk7CkBAIC02ODIsOCArNjE1LDYgQEAKIAkucmVtb3ZlID0gdGx2MzIwYWljMjNfcmVtb3ZlLAogCS5zdXNwZW5kID0gdGx2MzIwYWljMjNfc3VzcGVuZCwKIAkucmVzdW1lID0gdGx2MzIwYWljMjNfcmVzdW1lLAotCS5yZWFkID0gdGx2MzIwYWljMjNfcmVhZF9yZWdfY2FjaGUsCi0JLndyaXRlID0gdGx2MzIwYWljMjNfd3JpdGUsCiAJLnNldF9iaWFzX2xldmVsID0gdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwsCiAJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKQEAgLTcxMCw3ICs2NDEsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGFpYzIzKTsKLQlhaWMyMy0+Y29udHJvbF9kYXRhID0gaTJjOwogCWFpYzIzLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKaW5kZXggZTkzYjlkMS4uYjIxYzYxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKQEAgLTUyOCw0MCArNTI4LDMzIEBACiAJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKIAlzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTggdmFsdWU7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046CiAJCWlmIChhaWMzMng0LT5tYXN0ZXIpIHsKIAkJCS8qIFN3aXRjaCBvbiBQTEwgKi8KLQkJCXZhbHVlID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSUMzMlg0X1BMTFBSKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfUExMUFIsCi0JCQkJICAgICAgKHZhbHVlIHwgQUlDMzJYNF9QTExFTikpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9QTExQUiwKKwkJCQkJICAgIEFJQzMyWDRfUExMRU4sIEFJQzMyWDRfUExMRU4pOwogCiAJCQkvKiBTd2l0Y2ggb24gTkRBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfTkRBQ0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTkRBQywKKwkJCQkJICAgIEFJQzMyWDRfTkRBQ0VOLCBBSUMzMlg0X05EQUNFTik7CiAKIAkJCS8qIFN3aXRjaCBvbiBNREFDIERpdmlkZXIgKi8KLQkJCXZhbHVlID0gc25kX3NvY19yZWFkKGNvZGVjLCBBSUMzMlg0X01EQUMpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9NREFDLAotCQkJCSAgICAgIHZhbHVlIHwgQUlDMzJYNF9NREFDRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9NREFDLAorCQkJCQkgICAgQUlDMzJYNF9NREFDRU4sIEFJQzMyWDRfTURBQ0VOKTsKIAogCQkJLyogU3dpdGNoIG9uIE5BREMgRGl2aWRlciAqLwotCQkJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFJQzMyWDRfTkFEQyk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X05BREMsCi0JCQkJICAgICAgdmFsdWUgfCBBSUMzMlg0X01EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05BREMsCisJCQkJCSAgICBBSUMzMlg0X05BRENFTiwgQUlDMzJYNF9OQURDRU4pOwogCiAJCQkvKiBTd2l0Y2ggb24gTUFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTUFEQywKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfTURBQ0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfTUFEQywKKwkJCQkJICAgIEFJQzMyWDRfTUFEQ0VOLCBBSUMzMlg0X01BRENFTik7CiAKIAkJCS8qIFN3aXRjaCBvbiBCQ0xLX04gRGl2aWRlciAqLwotCQkJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFJQzMyWDRfQkNMS04pOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9CQ0xLTiwKLQkJCQkgICAgICB2YWx1ZSB8IEFJQzMyWDRfQkNMS0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFJQzMyWDRfQkNMS04sCisJCQkJCSAgICBBSUMzMlg0X0JDTEtFTiwgQUlDMzJYNF9CQ0xLRU4pOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CkBAIC01NjksMzQgKzU2MiwyOCBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChhaWMzMng0LT5tYXN0ZXIpIHsKIAkJCS8qIFN3aXRjaCBvZmYgUExMICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9QTExQUik7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBSUMzMlg0X1BMTFBSLAotCQkJCSAgICAgICh2YWx1ZSAmIH5BSUMzMlg0X1BMTEVOKSk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X1BMTFBSLAorCQkJCQkgICAgQUlDMzJYNF9QTExFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTkRBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkRBQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X05EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05EQUMsCisJCQkJCSAgICBBSUMzMlg0X05EQUNFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTURBQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NREFDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTURBQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X01EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01EQUMsCisJCQkJCSAgICBBSUMzMlg0X01EQUNFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTkFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9OQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTkFEQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X05EQUNFTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X05BREMsCisJCQkJCSAgICBBSUMzMlg0X05BRENFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgTUFEQyBEaXZpZGVyICovCi0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9NQURDKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTUFEQywKLQkJCQkgICAgICB2YWx1ZSAmIH5BSUMzMlg0X01EQUNFTik7Ci0JCQl2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDMzJYNF9CQ0xLTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBSUMzMlg0X01BREMsCisJCQkJCSAgICBBSUMzMlg0X01BRENFTiwgMCk7CiAKIAkJCS8qIFN3aXRjaCBvZmYgQkNMS19OIERpdmlkZXIgKi8KLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfQkNMS04sCi0JCQkJICAgICAgdmFsdWUgJiB+QUlDMzJYNF9CQ0xLRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUlDMzJYNF9CQ0xLTiwKKwkJCQkJICAgIEFJQzMyWDRfQkNMS0VOLCAwKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CkBAIC02ODUsMTAgKzY3MiwxMCBAQAogCX0KIAogCS8qIE1pYyBQR0Egcm91dGluZyAqLwotCWlmIChhaWMzMng0LT5taWNwZ2Ffcm91dGluZyB8IEFJQzMyWDRfTUlDUEdBX1JPVVRFX0xNSUNfSU4yUl8xMEspIHsKKwlpZiAoYWljMzJ4NC0+bWljcGdhX3JvdXRpbmcgJiBBSUMzMlg0X01JQ1BHQV9ST1VURV9MTUlDX0lOMlJfMTBLKSB7CiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFJQzMyWDRfTE1JQ1BHQU5JTiwgQUlDMzJYNF9MTUlDUEdBTklOX0lOMlJfMTBLKTsKIAl9Ci0JaWYgKGFpYzMyeDQtPm1pY3BnYV9yb3V0aW5nIHwgQUlDMzJYNF9NSUNQR0FfUk9VVEVfUk1JQ19JTjFMXzEwSykgeworCWlmIChhaWMzMng0LT5taWNwZ2Ffcm91dGluZyAmIEFJQzMyWDRfTUlDUEdBX1JPVVRFX1JNSUNfSU4xTF8xMEspIHsKIAkJc25kX3NvY193cml0ZShjb2RlYywgQUlDMzJYNF9STUlDUEdBTklOLCBBSUMzMlg0X1JNSUNQR0FOSU5fSU4xTF8xMEspOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDA5NjNjNGMuLjg3ZDVlZjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlzdHJ1Y3QgYWljM3hfZGlzYWJsZV9uYiBkaXNhYmxlX25iW0FJQzNYX05VTV9TVVBQTElFU107CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJc3RydWN0IGFpYzN4X3NldHVwX2RhdGEgKnNldHVwOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQgbWFzdGVyOwpAQCAtMTM4LDcgKzEzNywxMCBAQAogCWlmIChyZWcgPj0gQUlDM1hfQ0FDSEVSRUdOVU0pCiAJCXJldHVybiAtMTsKIAotCSp2YWx1ZSA9IGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCSp2YWx1ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKTsKKwljb2RlYy0+Y2FjaGVfYnlwYXNzID0gMDsKKwogCWNhY2hlW3JlZ10gPSAqdmFsdWU7CiAKIAlyZXR1cm4gMDsKQEAgLTE5OCw2ICsyMDAsMTAgQEAKIAkJCWVsc2UKIAkJCQkvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlIHBvd2VyZWQgZG93biAqLwogCQkJCXBhdGgtPmNvbm5lY3QgPSBpbnZlcnQgPyAxIDogMDsKKworCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNvdXJjZSwgInRsdjMyMGFpYzN4IHNvdXJjZSIpOworCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNpbmssICJ0bHYzMjBhaWMzeCBzaW5rIik7CisKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEwMTcsNiArMTAyMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKIAkJYWljM3gtPm1hc3RlciA9IDA7CisJCWlmYWNlX2FyZWcgJj0gfihCSVRfQ0xLX01BU1RFUiB8IFdPUkRfQ0xLX01BU1RFUik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTM4Myw3ICsxMzkwLDYgQEAKIAlpbnQgcmV0LCBpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFpYzN4LT5saXN0KTsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gYWljM3gtPmNvbnRyb2xfZGF0YTsKIAlhaWMzeC0+Y29kZWMgPSBjb2RlYzsKIAljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKIApAQCAtMTQ5NSw5ICsxNTAxLDkgQEAKICAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWljM3hfaTJjX2lkW10gPSB7Ci0JW0FJQzNYX01PREVMXzNYXSA9IHsgInRsdjMyMGFpYzN4IiwgMCB9LAotCVtBSUMzWF9NT0RFTF8zM10gPSB7ICJ0bHYzMjBhaWMzMyIsIDAgfSwKLQlbQUlDM1hfTU9ERUxfMzAwN10gPSB7ICJ0bHYzMjBhaWMzMDA3IiwgMCB9LAorCXsgInRsdjMyMGFpYzN4IiwgQUlDM1hfTU9ERUxfM1ggfSwKKwl7ICJ0bHYzMjBhaWMzMyIsIEFJQzNYX01PREVMXzMzIH0sCisJeyAidGx2MzIwYWljMzAwNyIsIEFJQzNYX01PREVMXzMwMDcgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljM3hfaTJjX2lkKTsKQEAgLTE1MTIsNyArMTUxOCw2IEBACiAJc3RydWN0IGFpYzN4X3BkYXRhICpwZGF0YSA9IGkyYy0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFpYzN4X3ByaXYgKmFpYzN4OwogCWludCByZXQ7Ci0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKnRibDsKIAogCWFpYzN4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFpYzN4X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYWljM3ggPT0gTlVMTCkgewpAQCAtMTUyMCw3ICsxNTI1LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JYWljM3gtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAlhaWMzeC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBhaWMzeCk7CkBAIC0xNTMxLDExICsxNTM1LDcgQEAKIAkJYWljM3gtPmdwaW9fcmVzZXQgPSAtMTsKIAl9CiAKLQlmb3IgKHRibCA9IGFpYzN4X2kyY19pZDsgdGJsLT5uYW1lWzBdOyB0YmwrKykgewotCQlpZiAoIXN0cmNtcCh0YmwtPm5hbWUsIGlkLT5uYW1lKSkKLQkJCWJyZWFrOwotCX0KLQlhaWMzeC0+bW9kZWwgPSB0YmwgLSBhaWMzeF9pMmNfaWQ7CisJYWljM3gtPm1vZGVsID0gaWQtPmRyaXZlcl9kYXRhOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl9haWMzeCwgJmFpYzN4X2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggZmFhNWU5Zi4uZGM4YTJiMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtNTUsMTMgKzU1LDEzIEBACiAjZGVmaW5lIEJVUlNUX0JBU0VGUkVRX0haCTQ5MTUyMDAwCiAKICNkZWZpbmUgU0FNUExFU19UT19VUyhyYXRlLCBzYW1wbGVzKSBcCi0JKDEwMDAwMDAwMDAgLyAoKHJhdGUgKiAxMDAwKSAvIHNhbXBsZXMpKQorCSgxMDAwMDAwMDAwIC8gKCgocmF0ZSkgKiAxMDAwKSAvIChzYW1wbGVzKSkpCiAKICNkZWZpbmUgVVNfVE9fU0FNUExFUyhyYXRlLCB1cykgXAotCShyYXRlIC8gKDEwMDAwMDAgLyAodXMgPCAxMDAwMDAwID8gdXMgOiAxMDAwMDAwKSkpCisJKChyYXRlKSAvICgxMDAwMDAwIC8gKCh1cykgPCAxMDAwMDAwID8gKHVzKSA6IDEwMDAwMDApKSkKIAogI2RlZmluZSBVVEhSX0ZST01fUEVSSU9EX1NJWkUoc2FtcGxlcywgcGxheXJhdGUsIGJ1cnN0cmF0ZSkgXAotCSgoc2FtcGxlcyAqIDUwMDApIC8gKChidXJzdHJhdGUgKiA1MDAwKSAvIChidXJzdHJhdGUgLSBwbGF5cmF0ZSkpKQorCSgoKHNhbXBsZXMpKjUwMDApIC8gKCgoYnVyc3RyYXRlKSo1MDAwKSAvICgoYnVyc3RyYXRlKSAtIChwbGF5cmF0ZSkpKSkKIAogc3RhdGljIHZvaWQgZGFjMzNfY2FsY3VsYXRlX3RpbWVzKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIHN0YXRpYyBpbnQgZGFjMzNfcHJlcGFyZV9jaGlwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKQEAgLTYyNywxOCArNjI3LDYgQEAKIAl7IlJJR0hUX0xPIiwgTlVMTCwgIkNvZGVjIFBvd2VyIn0sCiB9OwogCi1zdGF0aWMgaW50IGRhYzMzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhYzMzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFjMzNfZGFwbV93aWRnZXRzKSk7Ci0JLyogc2V0IHVwIGF1ZGlvIHBhdGggaW50ZXJjb25uZWN0cyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGRhYzMzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTE0MzEsNyArMTQxOSw3IEBACiAJLyogQ2hlY2sgaWYgdGhlIElSUSBudW1iZXIgaXMgdmFsaWQgYW5kIHJlcXVlc3QgaXQgKi8KIAlpZiAoZGFjMzMtPmlycSA+PSAwKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGRhYzMzLT5pcnEsIGRhYzMzX2ludGVycnVwdF9oYW5kbGVyLAotCQkJCSAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfRElTQUJMRUQsCisJCQkJICBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSAgY29kZWMtPm5hbWUsIGNvZGVjKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgIkNvdWxkIG5vdCByZXF1ZXN0IElSUSVkICglZClcbiIsCkBAIC0xNDUxLDE1ICsxNDM5LDExIEBACiAJCX0KIAl9CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfc25kX2NvbnRyb2xzLAotCQkJICAgICBBUlJBWV9TSVpFKGRhYzMzX3NuZF9jb250cm9scykpOwogCS8qIE9ubHkgYWRkIHRoZSBGSUZPIGNvbnRyb2xzLCBpZiB3ZSBoYXZlIHZhbGlkIElSUSBudW1iZXIgKi8KIAlpZiAoZGFjMzMtPmlycSA+PSAwKQogCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfbW9kZV9zbmRfY29udHJvbHMsCiAJCQkJICAgICBBUlJBWV9TSVpFKGRhYzMzX21vZGVfc25kX2NvbnRyb2xzKSk7CiAKLQlkYWMzM19hZGRfd2lkZ2V0cyhjb2RlYyk7Ci0KIGVycl9wb3dlcjoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUwMiw2ICsxNDg2LDEzIEBACiAJLnJlbW92ZSA9IGRhYzMzX3NvY19yZW1vdmUsCiAJLnN1c3BlbmQgPSBkYWMzM19zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0gZGFjMzNfc29jX3Jlc3VtZSwKKworCS5jb250cm9scyA9IGRhYzMzX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShkYWMzM19zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBkYWMzM19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGRhYzMzX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiAjZGVmaW5lIERBQzMzX1JBVEVTCShTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCmluZGV4IDIzOWUwYzQuLjdlZWNhNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYwpAQCAtMzMsNiArMzMsMTEgQEAKIAogI2luY2x1ZGUgInRwYTYxMzBhMi5oIgogCitlbnVtIHRwYV9tb2RlbCB7CisJVFBBNjEzMEEyLAorCVRQQTYxNDBBMiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqdHBhNjEzMGEyX2NsaWVudDsKIAogLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBzYXZlIHRoZSBjb250ZXh0ICovCkBAIC0zODMsNyArMzg4LDcgQEAKIAogCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlkYXRhLT5wb3dlcl9ncGlvID0gcGRhdGEtPnBvd2VyX2dwaW87Ci0JZGF0YS0+aWQgPSBwZGF0YS0+aWQ7CisJZGF0YS0+aWQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKIAltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CiAKQEAgLTQwNSw3ICs0MTAsNyBAQAogCXN3aXRjaCAoZGF0YS0+aWQpIHsKIAlkZWZhdWx0OgogCQlkZXZfd2FybihkZXYsICJVbmtub3duIFRQQSBtb2RlbCAoJWQpLiBBc3N1bWluZyA2MTMwQTJcbiIsCi0JCQkgcGRhdGEtPmlkKTsKKwkJCSBkYXRhLT5pZCk7CiAJY2FzZSBUUEE2MTMwQTI6CiAJCXJlZ3VsYXRvciA9ICJWZGQiOwogCQlicmVhazsKQEAgLTQ0Niw3ICs0NTEsNiBAQAogCQlncGlvX2ZyZWUoZGF0YS0+cG93ZXJfZ3Bpbyk7CiBlcnJfZ3BpbzoKIAlrZnJlZShkYXRhKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEodHBhNjEzMGEyX2NsaWVudCwgTlVMTCk7CiAJdHBhNjEzMGEyX2NsaWVudCA9IE5VTEw7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDcwLDcgKzQ3NCw4IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0cGE2MTMwYTJfaWRbXSA9IHsKLQl7ICJ0cGE2MTMwYTIiLCAwIH0sCisJeyAidHBhNjEzMGEyIiwgVFBBNjEzMEEyIH0sCisJeyAidHBhNjE0MGEyIiwgVFBBNjE0MEEyIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRwYTYxMzBhMl9pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCmluZGV4IDcxNjc0YmUuLmY3OTgyNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCkBAIC04NjMsMzQgKzg2Myw2IEBACiAgKiBJbnZlcnRpbmcgbm90IGdvaW5nIHRvIGhlbHAgd2l0aCB0aGVzZS4KICAqIEN1c3RvbSB2b2xzdyBhbmQgdm9sc3dfMnIgZ2V0L3B1dCBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZXNlIGdhaW4gYml0cy4KICAqLwotI2RlZmluZSBTT0NfRE9VQkxFX1RMVl9UV0w0MDMwKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCxcCi0JCQkgICAgICAgeGludmVydCwgdGx2X2FycmF5KSBcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfFwKLQkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKLQkuZ2V0ID0gc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwgXAotCS5wdXQgPSBzbmRfc29jX3B1dF92b2xzd190d2w0MDMwLCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9IH0KLSNkZWZpbmUgU09DX0RPVUJMRV9SX1RMVl9UV0w0MDMwKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsXAotCQkJCSB4aW52ZXJ0LCB0bHZfYXJyYXkpIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAotCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSBzbmRfc29jX2dldF92b2xzd19yMl90d2w0MDMwLFwKLQkucHV0ID0gc25kX3NvY19wdXRfdm9sc3dfcjJfdHdsNDAzMCwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpIFwKLQkJey5yZWcgPSByZWdfbGVmdCwgLnJyZWcgPSByZWdfcmlnaHQsIC5zaGlmdCA9IHhzaGlmdCwgXAotCQkgLnJzaGlmdCA9IHhzaGlmdCwgLm1heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0jZGVmaW5lIFNPQ19TSU5HTEVfVExWX1RXTDQwMzAoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCwgdGx2X2FycmF5KSBcCi0JU09DX0RPVUJMRV9UTFZfVFdMNDAzMCh4bmFtZSwgeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXgsIFwKLQkJCSAgICAgICB4aW52ZXJ0LCB0bHZfYXJyYXkpCi0KIHN0YXRpYyBpbnQgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKQEAgLTExOTcsMTkgKzExNjksMjMgQEAKIAkJVFdMNDAzMF9SRUdfVkRMX0FQR0FfQ1RMLCAxLCAxLCAwKSwKIAogCS8qIFNlcGFyYXRlIG91dHB1dCBnYWluIGNvbnRyb2xzICovCi0JU09DX0RPVUJMRV9SX1RMVl9UV0w0MDMwKCJQcmVEcml2IFBsYXliYWNrIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIlByZURyaXYgUGxheWJhY2sgVm9sdW1lIiwKIAkJVFdMNDAzMF9SRUdfUFJFRExfQ1RMLCBUV0w0MDMwX1JFR19QUkVEUl9DVEwsCi0JCTQsIDMsIDAsIG91dHB1dF90dmwpLAorCQk0LCAzLCAwLCBzbmRfc29jX2dldF92b2xzd19yMl90d2w0MDMwLAorCQlzbmRfc29jX3B1dF92b2xzd19yMl90d2w0MDMwLCBvdXRwdXRfdHZsKSwKIAotCVNPQ19ET1VCTEVfVExWX1RXTDQwMzAoIkhlYWRzZXQgUGxheWJhY2sgVm9sdW1lIiwKLQkJVFdMNDAzMF9SRUdfSFNfR0FJTl9TRVQsIDAsIDIsIDMsIDAsIG91dHB1dF90dmwpLAorCVNPQ19ET1VCTEVfRVhUX1RMVigiSGVhZHNldCBQbGF5YmFjayBWb2x1bWUiLAorCQlUV0w0MDMwX1JFR19IU19HQUlOX1NFVCwgMCwgMiwgMywgMCwgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwKKwkJc25kX3NvY19wdXRfdm9sc3dfdHdsNDAzMCwgb3V0cHV0X3R2bCksCiAKLQlTT0NfRE9VQkxFX1JfVExWX1RXTDQwMzAoIkNhcmtpdCBQbGF5YmFjayBWb2x1bWUiLAorCVNPQ19ET1VCTEVfUl9FWFRfVExWKCJDYXJraXQgUGxheWJhY2sgVm9sdW1lIiwKIAkJVFdMNDAzMF9SRUdfUFJFQ0tMX0NUTCwgVFdMNDAzMF9SRUdfUFJFQ0tSX0NUTCwKLQkJNCwgMywgMCwgb3V0cHV0X3R2bCksCisJCTQsIDMsIDAsIHNuZF9zb2NfZ2V0X3ZvbHN3X3IyX3R3bDQwMzAsCisJCXNuZF9zb2NfcHV0X3ZvbHN3X3IyX3R3bDQwMzAsIG91dHB1dF90dmwpLAogCi0JU09DX1NJTkdMRV9UTFZfVFdMNDAzMCgiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwKLQkJVFdMNDAzMF9SRUdfRUFSX0NUTCwgNCwgMywgMCwgb3V0cHV0X2Vhcl90dmwpLAorCVNPQ19TSU5HTEVfRVhUX1RMVigiRWFycGllY2UgUGxheWJhY2sgVm9sdW1lIiwKKwkJVFdMNDAzMF9SRUdfRUFSX0NUTCwgNCwgMywgMCwgc25kX3NvY19nZXRfdm9sc3dfdHdsNDAzMCwKKwkJc25kX3NvY19wdXRfdm9sc3dfdHdsNDAzMCwgb3V0cHV0X2Vhcl90dmwpLAogCiAJLyogQ29tbW9uIGNhcHR1cmUgZ2FpbiBjb250cm9scyAqLwogCVNPQ19ET1VCTEVfUl9UTFYoIlRYMSBEaWdpdGFsIENhcHR1cmUgVm9sdW1lIiwKQEAgLTE2MzMsMTcgKzE2MDksNiBAQAogCiB9OwogCi1zdGF0aWMgaW50IHR3bDQwMzBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdHdsNDAzMF9kYXBtX3dpZGdldHMsCi0JCQkJIEFSUkFZX1NJWkUodHdsNDAzMF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHdsNDAzMF9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTIyNjUsOSArMjIzMCw2IEBACiAKIAl0d2w0MDMwX2luaXRfY2hpcChjb2RlYyk7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHdsNDAzMF9zbmRfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0d2w0MDMwX3NuZF9jb250cm9scykpOwotCXR3bDQwMzBfYWRkX3dpZGdldHMoY29kZWMpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjkzLDYgKzIyNTUsMTMgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBzaXplb2YodHdsNDAzMF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB0d2w0MDMwX3JlZywKKworCS5jb250cm9scyA9IHR3bDQwMzBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdHdsNDAzMF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0d2w0MDMwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCmluZGV4IDQ0MzAzMmIuLjczZTExZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jCkBAIC01Nyw2ICs1NywxMyBAQAogI2RlZmluZSBUV0w2MDQwX0hGX1ZPTF9NQVNLCTB4MUYKICNkZWZpbmUgVFdMNjA0MF9IRl9WT0xfU0hJRlQJMAogCisvKiBTaGFkb3cgcmVnaXN0ZXIgdXNlZCBieSB0aGUgZHJpdmVyICovCisjZGVmaW5lIFRXTDYwNDBfUkVHX1NXX1NIQURPVwkweDJGCisjZGVmaW5lIFRXTDYwNDBfQ0FDSEVSRUdOVU0JKFRXTDYwNDBfUkVHX1NXX1NIQURPVyArIDEpCisKKy8qIFRXTDYwNDBfUkVHX1NXX1NIQURPVyAoMHgyRikgZmllbGRzICovCisjZGVmaW5lIFRXTDYwNDBfRUFSX1BBVEhfRU5BQkxFCTB4MDEKKwogc3RydWN0IHR3bDYwNDBfb3V0cHV0IHsKIAl1MTYgYWN0aXZlOwogCXUxNiBsZWZ0X3ZvbDsKQEAgLTY1LDEyICs3MiwxMyBAQAogCXUxNiByaWdodF9zdGVwOwogCXVuc2lnbmVkIGludCBzdGVwX2RlbGF5OwogCXUxNiByYW1wOwotCXUxNiBtdXRlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiByYW1wX2RvbmU7CiB9OwogCiBzdHJ1Y3QgdHdsNjA0MF9qYWNrX2RhdGEgewogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCWludCByZXBvcnQ7CiB9OwogCkBAIC03OSw3ICs4Nyw2IEBACiAJaW50IHBsdWdfaXJxOwogCWludCBjb2RlY19wb3dlcmVkOwogCWludCBwbGw7Ci0JaW50IG5vbl9scDsKIAlpbnQgcGxsX3Bvd2VyX21vZGU7CiAJaW50IGhzX3Bvd2VyX21vZGU7CiAJaW50IGhzX3Bvd2VyX21vZGVfbG9ja2VkOwpAQCAtOTIsMTA0ICs5OSw2OCBAQAogCXN0cnVjdCB0d2w2MDQwX2phY2tfZGF0YSBoc19qYWNrOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgaGVhZHNldDsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgaGFuZHNmcmVlOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpoZl93b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmhzX3dvcmtxdWV1ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGhzX2RlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGhmX2RlbGF5ZWRfd29yazsKIH07CiAKIC8qCiAgKiB0d2w2MDQwIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncwogICovCiBzdGF0aWMgY29uc3QgdTggdHdsNjA0MF9yZWdbVFdMNjA0MF9DQUNIRVJFR05VTV0gPSB7Ci0JMHgwMCwgLyogbm90IHVzZWQJCTB4MDAJKi8KLQkweDRCLCAvKiBUV0w2MDQwX0FTSUNJRCAocm8pCTB4MDEJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0FTSUNSRVYgKHJvKQkweDAyCSovCi0JMHgwMCwgLyogVFdMNjA0MF9JTlRJRAkJMHgwMwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSU5UTVIJCTB4MDQJKi8KLQkweDAwLCAvKiBUV0w2MDQwX05DUENUUkwJMHgwNQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfTERPQ1RMCQkweDA2CSovCi0JMHg2MCwgLyogVFdMNjA0MF9IUFBMTENUTAkweDA3CSovCi0JMHgwMCwgLyogVFdMNjA0MF9MUFBMTENUTAkweDA4CSovCi0JMHg0QSwgLyogVFdMNjA0MF9MUFBMTERJVgkweDA5CSovCi0JMHgwMCwgLyogVFdMNjA0MF9BTUlDQkNUTAkweDBBCSovCi0JMHgwMCwgLyogVFdMNjA0MF9ETUlDQkNUTAkweDBCCSovCi0JMHgxOCwgLyogVFdMNjA0MF9NSUNMQ1RMCTB4MEMJLSBObyBpbnB1dCBzZWxlY3RlZCBvbiBMZWZ0IE1pYyAqLwotCTB4MTgsIC8qIFRXTDYwNDBfTUlDUkNUTAkweDBECS0gTm8gaW5wdXQgc2VsZWN0ZWQgb24gUmlnaHQgTWljICovCi0JMHgwMCwgLyogVFdMNjA0MF9NSUNHQUlOCTB4MEUJKi8KLQkweDFCLCAvKiBUV0w2MDQwX0xJTkVHQUlOCTB4MEYJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hTTENUTAkJMHgxMAkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSFNSQ1RMCQkweDExCSovCi0JMHgwMCwgLyogVFdMNjA0MF9IU0dBSU4JCTB4MTIJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0VBUkNUTAkJMHgxMwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZMQ1RMCQkweDE0CSovCi0JMHgwMCwgLyogVFdMNjA0MF9IRkxHQUlOCTB4MTUJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hGUkNUTAkJMHgxNgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZSR0FJTgkweDE3CSovCi0JMHgwMCwgLyogVFdMNjA0MF9WSUJDVExMCTB4MTgJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1ZJQkRBVEwJMHgxOQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfVklCQ1RMUgkweDFBCSovCi0JMHgwMCwgLyogVFdMNjA0MF9WSUJEQVRSCTB4MUIJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hLQ1RMMQkJMHgxQwkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEtDVEwyCQkweDFECSovCi0JMHgwMCwgLyogVFdMNjA0MF9HUE9DVEwJCTB4MUUJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0FMQgkJMHgxRgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfRExCCQkweDIwCSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjEJKi8KLQkweDAwLCAvKiBub3QgdXNlZAkJMHgyMgkqLwotCTB4MDAsIC8qIG5vdCB1c2VkCQkweDIzCSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjQJKi8KLQkweDAwLCAvKiBub3QgdXNlZAkJMHgyNQkqLwotCTB4MDAsIC8qIG5vdCB1c2VkCQkweDI2CSovCi0JMHgwMCwgLyogbm90IHVzZWQJCTB4MjcJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1RSSU0xCQkweDI4CSovCi0JMHgwMCwgLyogVFdMNjA0MF9UUklNMgkJMHgyOQkqLwotCTB4MDAsIC8qIFRXTDYwNDBfVFJJTTMJCTB4MkEJKi8KLQkweDAwLCAvKiBUV0w2MDQwX0hTT1RSSU0JMHgyQgkqLwotCTB4MDAsIC8qIFRXTDYwNDBfSEZPVFJJTQkweDJDCSovCi0JMHgwOSwgLyogVFdMNjA0MF9BQ0NDVEwJCTB4MkQJKi8KLQkweDAwLCAvKiBUV0w2MDQwX1NUQVRVUyAocm8pCTB4MkUJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDAwCSovCisJMHg0QiwgLyogUkVHX0FTSUNJRAkweDAxIChybykgKi8KKwkweDAwLCAvKiBSRUdfQVNJQ1JFVgkweDAyIChybykgKi8KKwkweDAwLCAvKiBSRUdfSU5USUQJMHgwMwkqLworCTB4MDAsIC8qIFJFR19JTlRNUgkweDA0CSovCisJMHgwMCwgLyogUkVHX05DUENUUkwJMHgwNQkqLworCTB4MDAsIC8qIFJFR19MRE9DVEwJMHgwNgkqLworCTB4NjAsIC8qIFJFR19IUFBMTENUTAkweDA3CSovCisJMHgwMCwgLyogUkVHX0xQUExMQ1RMCTB4MDgJKi8KKwkweDRBLCAvKiBSRUdfTFBQTExESVYJMHgwOQkqLworCTB4MDAsIC8qIFJFR19BTUlDQkNUTAkweDBBCSovCisJMHgwMCwgLyogUkVHX0RNSUNCQ1RMCTB4MEIJKi8KKwkweDAwLCAvKiBSRUdfTUlDTENUTAkweDBDCSovCisJMHgwMCwgLyogUkVHX01JQ1JDVEwJMHgwRAkqLworCTB4MDAsIC8qIFJFR19NSUNHQUlOCTB4MEUJKi8KKwkweDFCLCAvKiBSRUdfTElORUdBSU4JMHgwRgkqLworCTB4MDAsIC8qIFJFR19IU0xDVEwJMHgxMAkqLworCTB4MDAsIC8qIFJFR19IU1JDVEwJMHgxMQkqLworCTB4MDAsIC8qIFJFR19IU0dBSU4JMHgxMgkqLworCTB4MDAsIC8qIFJFR19FQVJDVEwJMHgxMwkqLworCTB4MDAsIC8qIFJFR19IRkxDVEwJMHgxNAkqLworCTB4MDAsIC8qIFJFR19IRkxHQUlOCTB4MTUJKi8KKwkweDAwLCAvKiBSRUdfSEZSQ1RMCTB4MTYJKi8KKwkweDAwLCAvKiBSRUdfSEZSR0FJTgkweDE3CSovCisJMHgwMCwgLyogUkVHX1ZJQkNUTEwJMHgxOAkqLworCTB4MDAsIC8qIFJFR19WSUJEQVRMCTB4MTkJKi8KKwkweDAwLCAvKiBSRUdfVklCQ1RMUgkweDFBCSovCisJMHgwMCwgLyogUkVHX1ZJQkRBVFIJMHgxQgkqLworCTB4MDAsIC8qIFJFR19IS0NUTDEJMHgxQwkqLworCTB4MDAsIC8qIFJFR19IS0NUTDIJMHgxRAkqLworCTB4MDAsIC8qIFJFR19HUE9DVEwJMHgxRQkqLworCTB4MDAsIC8qIFJFR19BTEIJMHgxRgkqLworCTB4MDAsIC8qIFJFR19ETEIJMHgyMAkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjEJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDIyCSovCisJMHgwMCwgLyogbm90IHVzZWQJMHgyMwkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjQJKi8KKwkweDAwLCAvKiBub3QgdXNlZAkweDI1CSovCisJMHgwMCwgLyogbm90IHVzZWQJMHgyNgkqLworCTB4MDAsIC8qIG5vdCB1c2VkCTB4MjcJKi8KKwkweDAwLCAvKiBSRUdfVFJJTTEJMHgyOAkqLworCTB4MDAsIC8qIFJFR19UUklNMgkweDI5CSovCisJMHgwMCwgLyogUkVHX1RSSU0zCTB4MkEJKi8KKwkweDAwLCAvKiBSRUdfSFNPVFJJTQkweDJCCSovCisJMHgwMCwgLyogUkVHX0hGT1RSSU0JMHgyQwkqLworCTB4MDksIC8qIFJFR19BQ0NDVEwJMHgyRAkqLworCTB4MDAsIC8qIFJFR19TVEFUVVMJMHgyRSAocm8pICovCisKKwkweDAwLCAvKiBSRUdfU1dfU0hBRE9XCTB4MkYgLSBTaGFkb3csIG5vbiBIVyByZWdpc3RlciAqLwogfTsKIAotLyoKLSAqIHR3bDYwNDAgdmlvL2duZCByZWdpc3RlcnM6Ci0gKiByZWdpc3RlcnMgdW5kZXIgdmlvL2duZCBzdXBwbHkgY2FuIGJlIGFjY2Vzc2VkCi0gKiBiZWZvcmUgdGhlIHBvd2VyLXVwIHNlcXVlbmNlLCBhZnRlciBOUkVTUFdST04gZ29lcyBoaWdoCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgdHdsNjA0MF92aW9fcmVnW1RXTDYwNDBfVklPUkVHTlVNXSA9IHsKLQlUV0w2MDQwX1JFR19BU0lDSUQsCi0JVFdMNjA0MF9SRUdfQVNJQ1JFViwKLQlUV0w2MDQwX1JFR19JTlRJRCwKLQlUV0w2MDQwX1JFR19JTlRNUiwKLQlUV0w2MDQwX1JFR19OQ1BDVEwsCi0JVFdMNjA0MF9SRUdfTERPQ1RMLAotCVRXTDYwNDBfUkVHX0FNSUNCQ1RMLAotCVRXTDYwNDBfUkVHX0RNSUNCQ1RMLAotCVRXTDYwNDBfUkVHX0hLQ1RMMSwKLQlUV0w2MDQwX1JFR19IS0NUTDIsCi0JVFdMNjA0MF9SRUdfR1BPQ1RMLAotCVRXTDYwNDBfUkVHX1RSSU0xLAotCVRXTDYwNDBfUkVHX1RSSU0yLAotCVRXTDYwNDBfUkVHX1RSSU0zLAotCVRXTDYwNDBfUkVHX0hTT1RSSU0sCi0JVFdMNjA0MF9SRUdfSEZPVFJJTSwKLQlUV0w2MDQwX1JFR19BQ0NDVEwsCi0JVFdMNjA0MF9SRUdfU1RBVFVTLAotfTsKLQotLyoKLSAqIHR3bDYwNDAgdmRkL3ZzcyByZWdpc3RlcnM6Ci0gKiByZWdpc3RlcnMgdW5kZXIgdmRkL3ZzcyBzdXBwbGllcyBjYW4gb25seSBiZSBhY2Nlc3NlZAotICogYWZ0ZXIgdGhlIHBvd2VyLXVwIHNlcXVlbmNlCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgdHdsNjA0MF92ZGRfcmVnW1RXTDYwNDBfVkREUkVHTlVNXSA9IHsKLQlUV0w2MDQwX1JFR19IUFBMTENUTCwKLQlUV0w2MDQwX1JFR19MUFBMTENUTCwKLQlUV0w2MDQwX1JFR19MUFBMTERJViwKKy8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRvIGJlIHJlc3RvcmVkIGFmdGVyIHBvd2VyIHVwICovCitzdGF0aWMgY29uc3QgaW50IHR3bDYwNDBfcmVzdG9yZV9saXN0W10gPSB7CiAJVFdMNjA0MF9SRUdfTUlDTENUTCwKIAlUV0w2MDQwX1JFR19NSUNSQ1RMLAogCVRXTDYwNDBfUkVHX01JQ0dBSU4sCkBAIC0yMDIsMTIgKzE3Myw2IEBACiAJVFdMNjA0MF9SRUdfSEZMR0FJTiwKIAlUV0w2MDQwX1JFR19IRlJDVEwsCiAJVFdMNjA0MF9SRUdfSEZSR0FJTiwKLQlUV0w2MDQwX1JFR19WSUJDVExMLAotCVRXTDYwNDBfUkVHX1ZJQkRBVEwsCi0JVFdMNjA0MF9SRUdfVklCQ1RMUiwKLQlUV0w2MDQwX1JFR19WSUJEQVRSLAotCVRXTDYwNDBfUkVHX0FMQiwKLQlUV0w2MDQwX1JFR19ETEIsCiB9OwogCiAvKiBzZXQgb2YgcmF0ZXMgZm9yIGVhY2ggcGxsOiBsb3ctcG93ZXIgYW5kIGhpZ2gtcGVyZm9ybWFuY2UgKi8KQEAgLTI3NSw4ICsyNDAsMTIgQEAKIAlpZiAocmVnID49IFRXTDYwNDBfQ0FDSEVSRUdOVU0pCiAJCXJldHVybiAtRUlPOwogCi0JdmFsdWUgPSB0d2w2MDQwX3JlZ19yZWFkKHR3bDYwNDAsIHJlZyk7Ci0JdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOworCWlmIChsaWtlbHkocmVnIDwgVFdMNjA0MF9SRUdfU1dfU0hBRE9XKSkgeworCQl2YWx1ZSA9IHR3bDYwNDBfcmVnX3JlYWQodHdsNjA0MCwgcmVnKTsKKwkJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIHJlZywgdmFsdWUpOworCX0gZWxzZSB7CisJCXZhbHVlID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgcmVnKTsKKwl9CiAKIAlyZXR1cm4gdmFsdWU7CiB9CkBAIC0yOTMsNTkgKzI2Miw1MSBAQAogCQlyZXR1cm4gLUVJTzsKIAogCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKLQlyZXR1cm4gdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgcmVnLCB2YWx1ZSk7CisJaWYgKGxpa2VseShyZWcgPCBUV0w2MDQwX1JFR19TV19TSEFET1cpKQorCQlyZXR1cm4gdHdsNjA0MF9yZWdfd3JpdGUodHdsNjA0MCwgcmVnLCB2YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdHdsNjA0MF9pbml0X3Zpb19yZWdzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIHR3bDYwNDBfaW5pdF9jaGlwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgdHdsNjA0MCAqdHdsNjA0MCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CisJdTggdmFsOworCisJLyogVXBkYXRlIHJlZ19jYWNoZTogQVNJQ1JFViwgYW5kIFRSSU0gdmFsdWVzICovCisJdmFsID0gdHdsNjA0MF9nZXRfcmV2aWQodHdsNjA0MCk7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0FTSUNSRVYsIHZhbCk7CisKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19UUklNMSk7CisJdHdsNjA0MF9yZWFkX3JlZ192b2xhdGlsZShjb2RlYywgVFdMNjA0MF9SRUdfVFJJTTIpOworCXR3bDYwNDBfcmVhZF9yZWdfdm9sYXRpbGUoY29kZWMsIFRXTDYwNDBfUkVHX1RSSU0zKTsKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19IU09UUklNKTsKKwl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19IRk9UUklNKTsKKworCS8qIENoYW5nZSBjaGlwIGRlZmF1bHRzICovCisJLyogTm8gaW1wdXQgc2VsZWN0ZWQgZm9yIG1pY3JvcGhvbmUgYW1wbGlmaWVycyAqLworCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19NSUNMQ1RMLCAweDE4KTsKKwl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfTUlDUkNUTCwgMHgxOCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbG93ZXIgdGhlIGRlZmF1bHQgZ2FpbiB2YWx1ZXMsIHNvIHRoZSByYW1wIGNvZGUKKwkgKiBjYW4gd29yayBjb3JyZWN0bHkgZm9yIHRoZSBmaXJzdCBwbGF5YmFjay4KKwkgKiBUaGlzIHJlZHVjZXMgdGhlIHBvcCBub2lzZSBoZWFyZCBhdCB0aGUgZmlyc3QgcGxheWJhY2suCisJICovCisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTR0FJTiwgMHhmZik7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0VBUkNUTCwgMHgxZSk7CisJdHdsNjA0MF93cml0ZV9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGTEdBSU4sIDB4MWQpOworCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19IRlJHQUlOLCAweDFkKTsKKwl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfTElORUdBSU4sIDApOworfQorCitzdGF0aWMgdm9pZCB0d2w2MDQwX3Jlc3RvcmVfcmVncyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmVnLCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRXTDYwNDBfVklPUkVHTlVNOyBpKyspIHsKLQkJcmVnID0gdHdsNjA0MF92aW9fcmVnW2ldOwotCQkvKgotCQkgKiBza2lwIHJlYWQtb25seSByZWdpc3RlcnMgKEFTSUNJRCwgQVNJQ1JFViwgU1RBVFVTKQotCQkgKiBhbmQgcmVnaXN0ZXJzIHNoYXJlZCBhbW9uZyBNRkQgY2hpbGRyZW4KLQkJICovCi0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgVFdMNjA0MF9SRUdfQVNJQ0lEOgotCQljYXNlIFRXTDYwNDBfUkVHX0FTSUNSRVY6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfSU5USUQ6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfSU5UTVI6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfTkNQQ1RMOgotCQljYXNlIFRXTDYwNDBfUkVHX0xET0NUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19HUE9DVEw6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfQUNDQ1RMOgotCQljYXNlIFRXTDYwNDBfUkVHX1NUQVRVUzoKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJdHdsNjA0MF93cml0ZShjb2RlYywgcmVnLCBjYWNoZVtyZWddKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHR3bDYwNDBfaW5pdF92ZGRfcmVncyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpbnQgcmVnLCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRXTDYwNDBfVkREUkVHTlVNOyBpKyspIHsKLQkJcmVnID0gdHdsNjA0MF92ZGRfcmVnW2ldOwotCQkvKiBza2lwIHZpYnJhIGFuZCBQTEwgcmVnaXN0ZXJzICovCi0JCXN3aXRjaCAocmVnKSB7Ci0JCWNhc2UgVFdMNjA0MF9SRUdfVklCQ1RMTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19WSUJEQVRMOgotCQljYXNlIFRXTDYwNDBfUkVHX1ZJQkNUTFI6Ci0JCWNhc2UgVFdMNjA0MF9SRUdfVklCREFUUjoKLQkJY2FzZSBUV0w2MDQwX1JFR19IUFBMTENUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19MUFBMTENUTDoKLQkJY2FzZSBUV0w2MDQwX1JFR19MUFBMTERJVjoKLQkJCWNvbnRpbnVlOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR3bDYwNDBfcmVzdG9yZV9saXN0KTsgaSsrKSB7CisJCXJlZyA9IHR3bDYwNDBfcmVzdG9yZV9saXN0W2ldOwogCQl0d2w2MDQwX3dyaXRlKGNvZGVjLCByZWcsIGNhY2hlW3JlZ10pOwogCX0KIH0KQEAgLTUyNCwxOCArNDg1LDE3IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX3BnYV9oc193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhzX2RlbGF5ZWRfd29yay53b3JrKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhlYWRzZXQud29yay53b3JrKTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBwcml2LT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKmhlYWRzZXQgPSAmcHJpdi0+aGVhZHNldDsKLQl1bnNpZ25lZCBpbnQgZGVsYXkgPSBoZWFkc2V0LT5zdGVwX2RlbGF5OwogCWludCBpLCBoZWFkc2V0X2NvbXBsZXRlOwogCiAJLyogZG8gd2UgbmVlZCB0byByYW1wIGF0IGFsbCA/ICovCiAJaWYgKGhlYWRzZXQtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX05PTkUpCiAJCXJldHVybjsKIAotCS8qIEhTIFBHQSB2b2x1bWVzIGhhdmUgNCBiaXRzIG9mIHJlc29sdXRpb24gdG8gcmFtcCAqLwotCWZvciAoaSA9IDA7IGkgPD0gMTY7IGkrKykgeworCS8qIEhTIFBHQSBnYWluIHJhbmdlOiAweDAgLSAweGYgKDAgLSAxNSkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQloZWFkc2V0X2NvbXBsZXRlID0gdHdsNjA0MF9oc19yYW1wX3N0ZXAoY29kZWMsCiAJCQkJCQloZWFkc2V0LT5sZWZ0X3N0ZXAsCiAJCQkJCQloZWFkc2V0LT5yaWdodF9zdGVwKTsKQEAgLTU0NCwxNSArNTA0LDggQEAKIAkJaWYgKGhlYWRzZXRfY29tcGxldGUpCiAJCQlicmVhazsKIAotCQkvKgotCQkgKiBUT0RPOiB0dW5lOiBkZWxheSBpcyBsb25nZXIgb3ZlciAwZEIKLQkJICogYXMgaW5jcmVhc2VzIGFyZSBsYXJnZXIuCi0JCSAqLwotCQlpZiAoaSA+PSA4KQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkgKwotCQkJCQkJCShkZWxheSA+PiAxKSkpOwotCQllbHNlCi0JCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoCisJCQkJbXNlY3NfdG9famlmZmllcyhoZWFkc2V0LT5zdGVwX2RlbGF5KSk7CiAJfQogCiAJaWYgKGhlYWRzZXQtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX0RPV04pIHsKQEAgLTU2NywxOCArNTIwLDE4IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX3BnYV9oZl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhmX2RlbGF5ZWRfd29yay53b3JrKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0d2w2MDQwX2RhdGEsIGhhbmRzZnJlZS53b3JrLndvcmspOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOwogCXN0cnVjdCB0d2w2MDQwX291dHB1dCAqaGFuZHNmcmVlID0gJnByaXYtPmhhbmRzZnJlZTsKLQl1bnNpZ25lZCBpbnQgZGVsYXkgPSBoYW5kc2ZyZWUtPnN0ZXBfZGVsYXk7CiAJaW50IGksIGhhbmRzZnJlZV9jb21wbGV0ZTsKIAogCS8qIGRvIHdlIG5lZWQgdG8gcmFtcCBhdCBhbGwgPyAqLwogCWlmIChoYW5kc2ZyZWUtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX05PTkUpCiAJCXJldHVybjsKIAotCS8qIEhGIFBHQSB2b2x1bWVzIGhhdmUgNSBiaXRzIG9mIHJlc29sdXRpb24gdG8gcmFtcCAqLwotCWZvciAoaSA9IDA7IGkgPD0gMzI7IGkrKykgeworCS8qCisJICogSEYgUEdBIGdhaW4gcmFuZ2U6IDB4MDAgLSAweDFkICgwIC0gMjkpICovCisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKIAkJaGFuZHNmcmVlX2NvbXBsZXRlID0gdHdsNjA0MF9oZl9yYW1wX3N0ZXAoY29kZWMsCiAJCQkJCQloYW5kc2ZyZWUtPmxlZnRfc3RlcCwKIAkJCQkJCWhhbmRzZnJlZS0+cmlnaHRfc3RlcCk7CkBAIC01ODcsMTUgKzU0MCw4IEBACiAJCWlmIChoYW5kc2ZyZWVfY29tcGxldGUpCiAJCQlicmVhazsKIAotCQkvKgotCQkgKiBUT0RPOiB0dW5lOiBkZWxheSBpcyBsb25nZXIgb3ZlciAwZEIKLQkJICogYXMgaW5jcmVhc2VzIGFyZSBsYXJnZXIuCi0JCSAqLwotCQlpZiAoaSA+PSAxNikKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKGRlbGF5ICsKLQkJCQkJCSAgICAgICAoZGVsYXkgPj4gMSkpKTsKLQkJZWxzZQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoaGFuZHNmcmVlLT5zdGVwX2RlbGF5KSk7CiAJfQogCiAKQEAgLTYwNywzNiArNTUzLDQwIEBACiAJaGFuZHNmcmVlLT5yYW1wID0gVFdMNjA0MF9SQU1QX05PTkU7CiB9CiAKLXN0YXRpYyBpbnQgcGdhX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIGludCBvdXRfZHJ2X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpvdXQ7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yazsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcXVldWU7CiAKIAlzd2l0Y2ggKHctPnNoaWZ0KSB7Ci0JY2FzZSAyOgotCWNhc2UgMzoKKwljYXNlIDI6IC8qIEhlYWRzZXQgb3V0cHV0IGRyaXZlciAqLwogCQlvdXQgPSAmcHJpdi0+aGVhZHNldDsKLQkJd29yayA9ICZwcml2LT5oc19kZWxheWVkX3dvcms7Ci0JCXF1ZXVlID0gcHJpdi0+aHNfd29ya3F1ZXVlOworCQl3b3JrID0gJm91dC0+d29yazsKKwkJLyoKKwkJICogTWFrZSBzdXJlLCB0aGF0IHdlIGRvIG5vdCBtZXNzIHVwIHZhcmlhYmxlcyBmb3IgYWxyZWFkeQorCQkgKiBleGVjdXRpbmcgd29yay4KKwkJICovCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKKwogCQlvdXQtPmxlZnRfc3RlcCA9IHByaXYtPmhzX2xlZnRfc3RlcDsKIAkJb3V0LT5yaWdodF9zdGVwID0gcHJpdi0+aHNfcmlnaHRfc3RlcDsKIAkJb3V0LT5zdGVwX2RlbGF5ID0gNTsJLyogNSBtcyBiZXR3ZWVuIHZvbHVtZSByYW1wIHN0ZXBzICovCiAJCWJyZWFrOwotCWNhc2UgNDoKKwljYXNlIDQ6IC8qIEhhbmRzZnJlZSBvdXRwdXQgZHJpdmVyICovCiAJCW91dCA9ICZwcml2LT5oYW5kc2ZyZWU7Ci0JCXdvcmsgPSAmcHJpdi0+aGZfZGVsYXllZF93b3JrOwotCQlxdWV1ZSA9IHByaXYtPmhmX3dvcmtxdWV1ZTsKKwkJd29yayA9ICZvdXQtPndvcms7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSwgdGhhdCB3ZSBkbyBub3QgbWVzcyB1cCB2YXJpYWJsZXMgZm9yIGFscmVhZHkKKwkJICogZXhlY3V0aW5nIHdvcmsuCisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod29yayk7CisKIAkJb3V0LT5sZWZ0X3N0ZXAgPSBwcml2LT5oZl9sZWZ0X3N0ZXA7CiAJCW91dC0+cmlnaHRfc3RlcCA9IHByaXYtPmhmX3JpZ2h0X3N0ZXA7CiAJCW91dC0+c3RlcF9kZWxheSA9IDU7CS8qIDUgbXMgYmV0d2VlbiB2b2x1bWUgcmFtcCBzdGVwcyAqLwotCQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKLQkJCXByaXYtPm5vbl9scCsrOwotCQllbHNlCi0JCQlwcml2LT5ub25fbHAtLTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwpAQCAtNjQ4LDMxICs1OTgsMjUgQEAKIAkJCWJyZWFrOwogCiAJCS8qIGRvbid0IHVzZSB2b2x1bWUgcmFtcCBmb3IgcG93ZXItdXAgKi8KKwkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX1VQOwogCQlvdXQtPmxlZnRfc3RlcCA9IG91dC0+bGVmdF92b2w7CiAJCW91dC0+cmlnaHRfc3RlcCA9IG91dC0+cmlnaHRfdm9sOwogCi0JCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcod29yaykpIHsKLQkJCW91dC0+cmFtcCA9IFRXTDYwNDBfUkFNUF9VUDsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhxdWV1ZSwgd29yaywKLQkJCQkJbXNlY3NfdG9famlmZmllcygxKSk7Ci0JCX0KKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgd29yaywgbXNlY3NfdG9famlmZmllcygxKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKIAkJaWYgKCFvdXQtPmFjdGl2ZSkKIAkJCWJyZWFrOwogCi0JCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcod29yaykpIHsKLQkJCS8qIHVzZSB2b2x1bWUgcmFtcCBmb3IgcG93ZXItZG93biAqLwotCQkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX0RPV047Ci0JCQlJTklUX0NPTVBMRVRJT04ob3V0LT5yYW1wX2RvbmUpOworCQkvKiB1c2Ugdm9sdW1lIHJhbXAgZm9yIHBvd2VyLWRvd24gKi8KKwkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX0RPV047CisJCUlOSVRfQ09NUExFVElPTihvdXQtPnJhbXBfZG9uZSk7CiAKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhxdWV1ZSwgd29yaywKLQkJCQkJbXNlY3NfdG9famlmZmllcygxKSk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsIHdvcmssIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCi0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm91dC0+cmFtcF9kb25lLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKTsKLQkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm91dC0+cmFtcF9kb25lLAorCQkJCQkgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjgzLDcgKzYyNyw3IEBACiBzdGF0aWMgaW50IGhlYWRzZXRfcG93ZXJfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBoaWdoX3BlcmYpCiB7CiAJaW50IGhzbGN0bCwgaHNyY3RsOwotCWludCBtYXNrID0gVFdMNjA0MF9IU0RSVk1PREVMIHwgVFdMNjA0MF9IU0RBQ01PREVMOworCWludCBtYXNrID0gVFdMNjA0MF9IU0RSVk1PREUgfCBUV0w2MDQwX0hTREFDTU9ERTsKIAogCWhzbGN0bCA9IHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCk7CiAJaHNyY3RsID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSFNSQ1RMKTsKQEAgLTcwNSwxMSArNjQ5LDMxIEBACiBzdGF0aWMgaW50IHR3bDYwNDBfaHNfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAogCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwl1OCBoc2xjdGwsIGhzcmN0bDsKKworCS8qCisJICogV29ya2Fyb3VuZCBmb3IgSGVhZHNldCBEQyBvZmZzZXQgY2F1c2VkIHBvcCBub2lzZToKKwkgKiBCb3RoIEhTIERBQyBuZWVkIHRvIGJlIHR1cm5lZCBvbiAoYmVmb3JlIHRoZSBIUyBkcml2ZXIpIGFuZCBvZmYgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLgorCSAqLworCWhzbGN0bCA9IHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCk7CisJaHNyY3RsID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSFNSQ1RMKTsKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgeworCQloc2xjdGwgfD0gVFdMNjA0MF9IU0RBQ0VOQTsKKwkJaHNyY3RsIHw9IFRXTDYwNDBfSFNEQUNFTkE7CisJfSBlbHNlIHsKKwkJaHNsY3RsICY9IH5UV0w2MDQwX0hTREFDRU5BOworCQloc3JjdGwgJj0gflRXTDYwNDBfSFNEQUNFTkE7CisJfQorCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTTENUTCwgaHNsY3RsKTsKKwl0d2w2MDQwX3dyaXRlKGNvZGVjLCBUV0w2MDQwX1JFR19IU1JDVEwsIGhzcmN0bCk7CisKIAltc2xlZXAoMSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIGludCB0d2w2MDQwX2VwX2Rydl9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CkBAIC03MTcsMTggKzY4MSwxMiBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJcHJpdi0+bm9uX2xwKys7Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJFYXJwaG9uZSBEcml2ZXIiKSkgewotCQkJLyogRWFycGhvbmUgZG9lc24ndCBzdXBwb3J0IGxvdyBwb3dlciBtb2RlICovCi0JCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDE7Ci0JCQlyZXQgPSBoZWFkc2V0X3Bvd2VyX21vZGUoY29kZWMsIDEpOwotCQl9CisJCS8qIEVhcnBob25lIGRvZXNuJ3Qgc3VwcG9ydCBsb3cgcG93ZXIgbW9kZSAqLworCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDE7CisJCXJldCA9IGhlYWRzZXRfcG93ZXJfbW9kZShjb2RlYywgMSk7CiAJfSBlbHNlIHsKLQkJcHJpdi0+bm9uX2xwLS07Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJFYXJwaG9uZSBEcml2ZXIiKSkgewotCQkJcHJpdi0+aHNfcG93ZXJfbW9kZV9sb2NrZWQgPSAwOwotCQkJcmV0ID0gaGVhZHNldF9wb3dlcl9tb2RlKGNvZGVjLCBwcml2LT5oc19wb3dlcl9tb2RlKTsKLQkJfQorCQlwcml2LT5oc19wb3dlcl9tb2RlX2xvY2tlZCA9IDA7CisJCXJldCA9IGhlYWRzZXRfcG93ZXJfbW9kZShjb2RlYywgcHJpdi0+aHNfcG93ZXJfbW9kZSk7CiAJfQogCiAJbXNsZWVwKDEpOwpAQCAtNzcwLDcgKzcyOCw3IEBACiBzdGF0aWMgdm9pZCB0d2w2MDQwX2FjY2Vzc29yeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCXN0cnVjdCB0d2w2MDQwX2RhdGEsIGRlbGF5ZWRfd29yay53b3JrKTsKKwkJCQkJc3RydWN0IHR3bDYwNDBfZGF0YSwgaHNfamFjay53b3JrLndvcmspOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHByaXYtPmNvZGVjOwogCXN0cnVjdCB0d2w2MDQwX2phY2tfZGF0YSAqaHNfamFjayA9ICZwcml2LT5oc19qYWNrOwogCkBAIC03ODEsMTUgKzczOSwxMCBAQAogc3RhdGljIGlycXJldHVybl90IHR3bDYwNDBfYXVkaW9faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7Ci0Jc3RydWN0IHR3bDYwNDAgKnR3bDYwNDAgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCXN0cnVjdCB0d2w2MDQwX2RhdGEgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1OCBpbnRpZDsKIAotCWludGlkID0gdHdsNjA0MF9yZWdfcmVhZCh0d2w2MDQwLCBUV0w2MDQwX1JFR19JTlRJRCk7Ci0KLQlpZiAoKGludGlkICYgVFdMNjA0MF9QTFVHSU5UKSB8fCAoaW50aWQgJiBUV0w2MDQwX1VOUExVR0lOVCkpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5kZWxheWVkX3dvcmssCi0JCQkJCQkJbXNlY3NfdG9famlmZmllcygyMDApKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+aHNfamFjay53b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcygyMDApKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTgwMywyNSArNzU2LDI3IEBACiAJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgcmV0OwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOwogCiAJLyogRm9yIEhTIGFuZCBIRiB3ZSBzaGFkb3cgdGhlIHZhbHVlcyBhbmQgb25seSBhY3R1YWxseSB3cml0ZQogCSAqIHRoZW0gb3V0IHdoZW4gYWN0aXZlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgYW1wbGlmaWVyIGNvbWVzIG9uCiAJICogYXMgcXVpZXRseSBhcyBwb3NzaWJsZS4gKi8KLQlzd2l0Y2ggKHJlZykgeworCXN3aXRjaCAobWMtPnJlZykgewogCWNhc2UgVFdMNjA0MF9SRUdfSFNHQUlOOgogCQlvdXQgPSAmdHdsNjA0MF9wcml2LT5oZWFkc2V0OwogCQlicmVhazsKLQlkZWZhdWx0OgorCWNhc2UgVFdMNjA0MF9SRUdfSEZMR0FJTjoKKwkJb3V0ID0gJnR3bDYwNDBfcHJpdi0+aGFuZHNmcmVlOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6IFVuZXhwZWN0ZWQgcmVnaXN0ZXI6IDB4JTAyeFxuIiwKKwkJCQkJX19mdW5jX18sIG1jLT5yZWcpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAob3V0KSB7Ci0JCW91dC0+bGVmdF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJb3V0LT5yaWdodF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQkJaWYgKCFvdXQtPmFjdGl2ZSkKLQkJCXJldHVybiAxOwotCX0KKwlvdXQtPmxlZnRfdm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJb3V0LT5yaWdodF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwlpZiAoIW91dC0+YWN0aXZlKQorCQlyZXR1cm4gMTsKIAogCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7CiAJaWYgKHJldCA8IDApCkBAIC04MzgsMTEyICs3OTMsNDIgQEAKIAlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9ICZ0d2w2MDQwX3ByaXYtPmhlYWRzZXQ7CiAJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKIAotCXN3aXRjaCAocmVnKSB7CisJc3dpdGNoIChtYy0+cmVnKSB7CiAJY2FzZSBUV0w2MDQwX1JFR19IU0dBSU46CiAJCW91dCA9ICZ0d2w2MDQwX3ByaXYtPmhlYWRzZXQ7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gb3V0LT5sZWZ0X3ZvbDsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBvdXQtPnJpZ2h0X3ZvbDsKLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgogCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKLX0KLQotc3RhdGljIGludCB0d2w2MDQwX3B1dF92b2xzd18ycl92dShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9IE5VTEw7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOwotCi0JLyogRm9yIEhTIGFuZCBIRiB3ZSBzaGFkb3cgdGhlIHZhbHVlcyBhbmQgb25seSBhY3R1YWxseSB3cml0ZQotCSAqIHRoZW0gb3V0IHdoZW4gYWN0aXZlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgYW1wbGlmaWVyIGNvbWVzIG9uCi0JICogYXMgcXVpZXRseSBhcyBwb3NzaWJsZS4gKi8KLQlzd2l0Y2ggKHJlZykgewogCWNhc2UgVFdMNjA0MF9SRUdfSEZMR0FJTjoKLQljYXNlIFRXTDYwNDBfUkVHX0hGUkdBSU46CiAJCW91dCA9ICZ0d2w2MDQwX3ByaXYtPmhhbmRzZnJlZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCWRldl93YXJuKGNvZGVjLT5kZXYsICIlczogVW5leHBlY3RlZCByZWdpc3RlcjogMHglMDJ4XG4iLAorCQkJCQlfX2Z1bmNfXywgbWMtPnJlZyk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChvdXQpIHsKLQkJb3V0LT5sZWZ0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQlvdXQtPnJpZ2h0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCQlpZiAoIW91dC0+YWN0aXZlKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAxOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gb3V0LT5sZWZ0X3ZvbDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IG91dC0+cmlnaHRfdm9sOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR3bDYwNDBfZ2V0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCB0d2w2MDQwX3NvY19kYXBtX3B1dF92aWJyYV9lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9ICZ0d2w2MDQwX3ByaXYtPmhhbmRzZnJlZTsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3aWRnZXQtPmNvZGVjOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCi0JLyogSWYgdGhlc2UgYXJlIGNhY2hlZCByZWdpc3RlcnMgdXNlIHRoZSBjYWNoZSAqLwotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBUV0w2MDQwX1JFR19IRkxHQUlOOgotCWNhc2UgVFdMNjA0MF9SRUdfSEZSR0FJTjoKLQkJb3V0ID0gJnR3bDYwNDBfcHJpdi0+aGFuZHNmcmVlOwotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG91dC0+bGVmdF92b2w7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gb3V0LT5yaWdodF92b2w7Ci0JCXJldHVybiAwOworCS8qIERvIG5vdCBhbGxvdyBjaGFuZ2VzIHdoaWxlIElucHV0L0ZGIGVmZWN0IGlzIHJ1bm5pbmcgKi8KKwl2YWwgPSB0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBlLT5yZWcpOworCWlmICh2YWwgJiBUV0w2MDQwX1ZJQkVOQSAmJiAhKHZhbCAmIFRXTDYwNDBfVklCU0VMKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBzbmRfc29jX2dldF92b2xzd18ycihrY29udHJvbCwgdWNvbnRyb2wpOworCXJldHVybiBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKGtjb250cm9sLCB1Y29udHJvbCk7CiB9CiAKLS8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLwotI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfVExWKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCxcCi0JCQkJCQkJeGludmVydCwgdGx2X2FycmF5KVwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAotCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHR3bDYwNDBfZ2V0X3ZvbHN3LCBcCi0JLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCi0JCSAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0KLS8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLwotI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfUl9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCxcCi0JCQkJeGludmVydCwgdGx2X2FycmF5KVwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8IFwKLQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFwKLQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSB0d2w2MDQwX2dldF92b2xzd18yciwgLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3XzJyX3Z1LCBcCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAotCQl7LnJlZyA9IHJlZ19sZWZ0LCAucnJlZyA9IHJlZ19yaWdodCwgLnNoaWZ0ID0geHNoaWZ0LCBcCi0JCSAucnNoaWZ0ID0geHNoaWZ0LCAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9LCB9Ci0KIC8qCiAgKiBNSUNBVFQgdm9sdW1lIGNvbnRyb2w6CiAgKiBmcm9tIC02IHRvIDAgZEIgaW4gNiBkQiBzdGVwcwpAQCAtMTAxNSw2ICs5MDAsMTkgQEAKIAkJCXR3bDYwNDBfaGZfdGV4dHMpLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKnR3bDYwNDBfdmlicmFwYXRoX3RleHRzW10gPSB7CisJIklucHV0IEZGIiwgIkF1ZGlvIFBETSIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNjA0MF92aWJyYV9lbnVtW10gPSB7CisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX1ZJQkNUTEwsIDEsCisJCQlBUlJBWV9TSVpFKHR3bDYwNDBfdmlicmFwYXRoX3RleHRzKSwKKwkJCXR3bDYwNDBfdmlicmFwYXRoX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfVklCQ1RMUiwgMSwKKwkJCUFSUkFZX1NJWkUodHdsNjA0MF92aWJyYXBhdGhfdGV4dHMpLAorCQkJdHdsNjA0MF92aWJyYXBhdGhfdGV4dHMpLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFtaWNsX2NvbnRyb2wgPQogCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNjA0MF9lbnVtWzBdKTsKIApAQCAtMTAzNSw4ICs5MzMsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZnJfbXV4X2NvbnRyb2xzID0KIAlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDYwNDBfaGZfZW51bVsxXSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRXTDYwNDBfUkVHX0VBUkNUTCwgMCwgMSwgMCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXBfcGF0aF9lbmFibGVfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19TV19TSEFET1csIDAsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXV4bF9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19IRkxDVEwsIDYsIDEsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXV4cl9zd2l0Y2hfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19IRlJDVEwsIDYsIDEsIDApOworCisvKiBWaWJyYSBwbGF5YmFjayBzd2l0Y2hlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZpYnJhbF9tdXhfY29udHJvbHMgPQorCVNPQ19EQVBNX0VOVU1fRVhUKCJSb3V0ZSIsIHR3bDYwNDBfdmlicmFfZW51bVswXSwKKwkJc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwKKwkJdHdsNjA0MF9zb2NfZGFwbV9wdXRfdmlicmFfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2aWJyYXJfbXV4X2NvbnRyb2xzID0KKwlTT0NfREFQTV9FTlVNX0VYVCgiUm91dGUiLCB0d2w2MDQwX3ZpYnJhX2VudW1bMV0sCisJCXNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCisJCXR3bDYwNDBfc29jX2RhcG1fcHV0X3ZpYnJhX2VudW0pOwogCiAvKiBIZWFkc2V0IHBvd2VyIG1vZGUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w2MDQwX3Bvd2VyX21vZGVfdGV4dHNbXSA9IHsKQEAgLTExMDUsNiArMTAyMCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHdsNjA0MF9nZXRfY2xrX2lkKTsKIAoraW50IHR3bDYwNDBfZ2V0X3RyaW1fdmFsdWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBlbnVtIHR3bDYwNDBfdHJpbSB0cmltKQoreworCWlmICh1bmxpa2VseSh0cmltID49IFRXTDYwNDBfVFJJTV9JTlZBTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX1RSSU0xICsgdHJpbSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0d2w2MDQwX2dldF90cmltX3ZhbHVlKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDYwNDBfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogQ2FwdHVyZSBnYWlucyAqLwogCVNPQ19ET1VCTEVfVExWKCJDYXB0dXJlIFByZWFtcGxpZmllciBWb2x1bWUiLApAQCAtMTExNywxMCArMTA0MSwxMiBAQAogCQlUV0w2MDQwX1JFR19MSU5FR0FJTiwgMCwgMywgNywgMCwgYWZtX2FtcF90bHYpLAogCiAJLyogUGxheWJhY2sgZ2FpbnMgKi8KLQlTT0NfVFdMNjA0MF9ET1VCTEVfVExWKCJIZWFkc2V0IFBsYXliYWNrIFZvbHVtZSIsCi0JCVRXTDYwNDBfUkVHX0hTR0FJTiwgMCwgNCwgMHhGLCAxLCBoc190bHYpLAotCVNPQ19UV0w2MDQwX0RPVUJMRV9SX1RMVigiSGFuZHNmcmVlIFBsYXliYWNrIFZvbHVtZSIsCi0JCVRXTDYwNDBfUkVHX0hGTEdBSU4sIFRXTDYwNDBfUkVHX0hGUkdBSU4sIDAsIDB4MUQsIDEsIGhmX3RsdiksCisJU09DX0RPVUJMRV9FWFRfVExWKCJIZWFkc2V0IFBsYXliYWNrIFZvbHVtZSIsCisJCVRXTDYwNDBfUkVHX0hTR0FJTiwgMCwgNCwgMHhGLCAxLCB0d2w2MDQwX2dldF92b2xzdywKKwkJdHdsNjA0MF9wdXRfdm9sc3csIGhzX3RsdiksCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkhhbmRzZnJlZSBQbGF5YmFjayBWb2x1bWUiLAorCQlUV0w2MDQwX1JFR19IRkxHQUlOLCBUV0w2MDQwX1JFR19IRlJHQUlOLCAwLCAweDFELCAxLAorCQl0d2w2MDQwX2dldF92b2xzdywgdHdsNjA0MF9wdXRfdm9sc3csIGhmX3RsdiksCiAJU09DX1NJTkdMRV9UTFYoIkVhcnBob25lIFBsYXliYWNrIFZvbHVtZSIsCiAJCVRXTDYwNDBfUkVHX0VBUkNUTCwgMSwgMHhGLCAxLCBlcF90bHYpLAogCkBAIC0xMTQ2LDYgKzEwNzIsMTAgQEAKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJIRkwiKSwKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJIRlIiKSwKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJFUCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkFVWEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJBVVhSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVklCUkFMIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVklCUkFSIiksCiAKIAkvKiBBbmFsb2cgaW5wdXQgbXV4ZXMgZm9yIHRoZSBjYXB0dXJlIGFtcGxpZmllcnMgKi8KIAlTTkRfU09DX0RBUE1fTVVYKCJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwKQEAgLTExODIsNTkgKzExMTIsNzYgQEAKIAkJCVRXTDYwNDBfUkVHX0RNSUNCQ1RMLCA0LCAwKSwKIAogCS8qIERBQ3MgKi8KLQlTTkRfU09DX0RBUE1fREFDX0UoIkhTREFDIExlZnQiLCAiSGVhZHNldCBQbGF5YmFjayIsCi0JCQlUV0w2MDQwX1JFR19IU0xDVEwsIDAsIDAsCi0JCQl0d2w2MDQwX2hzX2RhY19ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJIU0RBQyBSaWdodCIsICJIZWFkc2V0IFBsYXliYWNrIiwKLQkJCVRXTDYwNDBfUkVHX0hTUkNUTCwgMCwgMCwKLQkJCXR3bDYwNDBfaHNfZGFjX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIkhGREFDIExlZnQiLCAiSGFuZHNmcmVlIFBsYXliYWNrIiwKLQkJCVRXTDYwNDBfUkVHX0hGTENUTCwgMCwgMCwKLQkJCXR3bDYwNDBfcG93ZXJfbW9kZV9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJIRkRBQyBSaWdodCIsICJIYW5kc2ZyZWUgUGxheWJhY2siLAotCQkJVFdMNjA0MF9SRUdfSEZSQ1RMLCAwLCAwLAotCQkJdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fREFDKCJIU0RBQyBMZWZ0IiwgIkhlYWRzZXQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhTREFDIFJpZ2h0IiwgIkhlYWRzZXQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhGREFDIExlZnQiLCAiSGFuZHNmcmVlIFBsYXliYWNrIiwKKwkJCSBUV0w2MDQwX1JFR19IRkxDVEwsIDAsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkhGREFDIFJpZ2h0IiwgIkhhbmRzZnJlZSBQbGF5YmFjayIsCisJCQkgVFdMNjA0MF9SRUdfSEZSQ1RMLCAwLCAwKSwKKwkvKiBWaXJ0dWFsIERBQyBmb3IgdmlicmEgcGF0aCAoREw0IGNoYW5uZWwpICovCisJU05EX1NPQ19EQVBNX0RBQygiVklCUkEgREFDIiwgIlZpYnJhIFBsYXliYWNrIiwKKwkJCVNORF9TT0NfTk9QTSwgMCwgMCksCiAKLQlTTkRfU09DX0RBUE1fTVVYKCJIRiBMZWZ0IFBsYXliYWNrIiwKKwlTTkRfU09DX0RBUE1fTVVYKCJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoZmxfbXV4X2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJIRiBSaWdodCBQbGF5YmFjayIsCisJU05EX1NPQ19EQVBNX01VWCgiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwKIAkJCVNORF9TT0NfTk9QTSwgMCwgMCwgJmhmcl9tdXhfY29udHJvbHMpLAogCS8qIEFuYWxvZyBwbGF5YmFjayBNdXhlcyAqLwotCVNORF9TT0NfREFQTV9NVVgoIkhTIExlZnQgUGxheWJhY2siLAorCVNORF9TT0NfREFQTV9NVVgoIkhlYWRzZXQgTGVmdCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc2xfbXV4X2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJIUyBSaWdodCBQbGF5YmFjayIsCisJU05EX1NPQ19EQVBNX01VWCgiSGVhZHNldCBSaWdodCBQbGF5YmFjayIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc3JfbXV4X2NvbnRyb2xzKSwKIAorCVNORF9TT0NfREFQTV9NVVgoIlZpYnJhIExlZnQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmdmlicmFsX211eF9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiVmlicmEgUmlnaHQgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmdmlicmFyX211eF9jb250cm9scyksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJFYXJwaG9uZSBQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZlcF9wYXRoX2VuYWJsZV9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJBVVhMIFBsYXliYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJJmF1eGxfc3dpdGNoX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkFVWFIgUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmYXV4cl9zd2l0Y2hfY29udHJvbCksCisKIAkvKiBBbmFsb2cgcGxheWJhY2sgZHJpdmVycyAqLwotCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhhbmRzZnJlZSBMZWZ0IERyaXZlciIsCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSEYgTGVmdCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSEZMQ1RMLCA0LCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIRiBSaWdodCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSEZSQ1RMLCA0LCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIZWFkc2V0IExlZnQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIUyBMZWZ0IERyaXZlciIsCiAJCQlUV0w2MDQwX1JFR19IU0xDVEwsIDIsIDAsIE5VTEwsIDAsCi0JCQlwZ2FfZXZlbnQsCisJCQlvdXRfZHJ2X2V2ZW50LAogCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJIUyBSaWdodCBEcml2ZXIiLAogCQkJVFdMNjA0MF9SRUdfSFNSQ1RMLCAyLCAwLCBOVUxMLCAwLAotCQkJcGdhX2V2ZW50LAorCQkJb3V0X2Rydl9ldmVudCwKIAkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIX0UoIkVhcnBob25lIERyaXZlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDAsICZlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzLAotCQkJdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fT1VUX0RSVl9FKCJFYXJwaG9uZSBEcml2ZXIiLAorCQkJVFdMNjA0MF9SRUdfRUFSQ1RMLCAwLCAwLCBOVUxMLCAwLAorCQkJdHdsNjA0MF9lcF9kcnZfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlYoIlZpYnJhIExlZnQgRHJpdmVyIiwKKwkJCVRXTDYwNDBfUkVHX1ZJQkNUTEwsIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9PVVRfRFJWKCJWaWJyYSBSaWdodCBEcml2ZXIiLAorCQkJVFdMNjA0MF9SRUdfVklCQ1RMUiwgMCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJWaWJyYSBMZWZ0IENvbnRyb2wiLCBUV0w2MDQwX1JFR19WSUJDVExMLCAyLCAwLAorCQkJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlZpYnJhIFJpZ2h0IENvbnRyb2wiLCBUV0w2MDQwX1JFR19WSUJDVExSLCAyLCAwLAorCQkJICAgIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFlfUygiSFNEQUMgUG93ZXIiLCAxLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICAgICB0d2w2MDQwX2hzX2RhY19ldmVudCwKKwkJCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiAKIAkvKiBBbmFsb2cgcGxheWJhY2sgUEdBcyAqLwotCVNORF9TT0NfREFQTV9QR0EoIkhGREFDIExlZnQgUEdBIiwKKwlTTkRfU09DX0RBUE1fUEdBKCJIRiBMZWZ0IFBHQSIsCiAJCQlUV0w2MDQwX1JFR19IRkxDVEwsIDEsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9QR0EoIkhGREFDIFJpZ2h0IFBHQSIsCisJU05EX1NPQ19EQVBNX1BHQSgiSEYgUmlnaHQgUEdBIiwKIAkJCVRXTDYwNDBfUkVHX0hGUkNUTCwgMSwgMCwgTlVMTCwgMCksCiAKIH07CkBAIC0xMjU2LDUzICsxMjAzLDYzIEBACiAJeyJBREMgUmlnaHQiLCBOVUxMLCAiTWljQW1wUiJ9LAogCiAJLyogQUZNIHBhdGggKi8KLQl7IkFGTUFtcEwiLCAiTlVMTCIsICJBRk1MIn0sCi0JeyJBRk1BbXBSIiwgIk5VTEwiLCAiQUZNUiJ9LAorCXsiQUZNQW1wTCIsIE5VTEwsICJBRk1MIn0sCisJeyJBRk1BbXBSIiwgTlVMTCwgIkFGTVIifSwKIAotCXsiSFMgTGVmdCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgTGVmdCJ9LAotCXsiSFMgTGVmdCBQbGF5YmFjayIsICJMaW5lLUluIGFtcCIsICJBRk1BbXBMIn0sCisJeyJIU0RBQyBMZWZ0IiwgTlVMTCwgIkhTREFDIFBvd2VyIn0sCisJeyJIU0RBQyBSaWdodCIsIE5VTEwsICJIU0RBQyBQb3dlciJ9LAogCi0JeyJIUyBSaWdodCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgUmlnaHQifSwKLQl7IkhTIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKKwl7IkhlYWRzZXQgTGVmdCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgTGVmdCJ9LAorCXsiSGVhZHNldCBMZWZ0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcEwifSwKIAotCXsiSGVhZHNldCBMZWZ0IERyaXZlciIsICJOVUxMIiwgIkhTIExlZnQgUGxheWJhY2sifSwKLQl7IkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwgIk5VTEwiLCAiSFMgUmlnaHQgUGxheWJhY2sifSwKKwl7IkhlYWRzZXQgUmlnaHQgUGxheWJhY2siLCAiSFMgREFDIiwgIkhTREFDIFJpZ2h0In0sCisJeyJIZWFkc2V0IFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKIAotCXsiSFNPTCIsIE5VTEwsICJIZWFkc2V0IExlZnQgRHJpdmVyIn0sCi0JeyJIU09SIiwgTlVMTCwgIkhlYWRzZXQgUmlnaHQgRHJpdmVyIn0sCisJeyJIUyBMZWZ0IERyaXZlciIsIE5VTEwsICJIZWFkc2V0IExlZnQgUGxheWJhY2sifSwKKwl7IkhTIFJpZ2h0IERyaXZlciIsIE5VTEwsICJIZWFkc2V0IFJpZ2h0IFBsYXliYWNrIn0sCisKKwl7IkhTT0wiLCBOVUxMLCAiSFMgTGVmdCBEcml2ZXIifSwKKwl7IkhTT1IiLCBOVUxMLCAiSFMgUmlnaHQgRHJpdmVyIn0sCiAKIAkvKiBFYXJwaG9uZSBwbGF5YmFjayBwYXRoICovCi0JeyJFYXJwaG9uZSBEcml2ZXIiLCAiU3dpdGNoIiwgIkhTREFDIExlZnQifSwKKwl7IkVhcnBob25lIFBsYXliYWNrIiwgIlN3aXRjaCIsICJIU0RBQyBMZWZ0In0sCisJeyJFYXJwaG9uZSBEcml2ZXIiLCBOVUxMLCAiRWFycGhvbmUgUGxheWJhY2sifSwKIAl7IkVQIiwgTlVMTCwgIkVhcnBob25lIERyaXZlciJ9LAogCi0JeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBMZWZ0In0sCi0JeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcEwifSwKKwl7IkhhbmRzZnJlZSBMZWZ0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBMZWZ0In0sCisJeyJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayIsICJMaW5lLUluIGFtcCIsICJBRk1BbXBMIn0sCiAKLQl7IkhGIFJpZ2h0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBSaWdodCJ9LAotCXsiSEYgUmlnaHQgUGxheWJhY2siLCAiTGluZS1JbiBhbXAiLCAiQUZNQW1wUiJ9LAorCXsiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBSaWdodCJ9LAorCXsiSGFuZHNmcmVlIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKIAotCXsiSEZEQUMgTGVmdCBQR0EiLCBOVUxMLCAiSEYgTGVmdCBQbGF5YmFjayJ9LAotCXsiSEZEQUMgUmlnaHQgUEdBIiwgTlVMTCwgIkhGIFJpZ2h0IFBsYXliYWNrIn0sCisJeyJIRiBMZWZ0IFBHQSIsIE5VTEwsICJIYW5kc2ZyZWUgTGVmdCBQbGF5YmFjayJ9LAorCXsiSEYgUmlnaHQgUEdBIiwgTlVMTCwgIkhhbmRzZnJlZSBSaWdodCBQbGF5YmFjayJ9LAogCi0JeyJIYW5kc2ZyZWUgTGVmdCBEcml2ZXIiLCAiU3dpdGNoIiwgIkhGREFDIExlZnQgUEdBIn0sCi0JeyJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIiwgIlN3aXRjaCIsICJIRkRBQyBSaWdodCBQR0EifSwKKwl7IkhGIExlZnQgRHJpdmVyIiwgTlVMTCwgIkhGIExlZnQgUEdBIn0sCisJeyJIRiBSaWdodCBEcml2ZXIiLCBOVUxMLCAiSEYgUmlnaHQgUEdBIn0sCiAKLQl7IkhGTCIsIE5VTEwsICJIYW5kc2ZyZWUgTGVmdCBEcml2ZXIifSwKLQl7IkhGUiIsIE5VTEwsICJIYW5kc2ZyZWUgUmlnaHQgRHJpdmVyIn0sCisJeyJIRkwiLCBOVUxMLCAiSEYgTGVmdCBEcml2ZXIifSwKKwl7IkhGUiIsIE5VTEwsICJIRiBSaWdodCBEcml2ZXIifSwKKworCXsiQVVYTCBQbGF5YmFjayIsICJTd2l0Y2giLCAiSEYgTGVmdCBQR0EifSwKKwl7IkFVWFIgUGxheWJhY2siLCAiU3dpdGNoIiwgIkhGIFJpZ2h0IFBHQSJ9LAorCisJeyJBVVhMIiwgTlVMTCwgIkFVWEwgUGxheWJhY2sifSwKKwl7IkFVWFIiLCBOVUxMLCAiQVVYUiBQbGF5YmFjayJ9LAorCisJLyogVmlicmF0b3IgcGF0aHMgKi8KKwl7IlZpYnJhIExlZnQgUGxheWJhY2siLCAiQXVkaW8gUERNIiwgIlZJQlJBIERBQyJ9LAorCXsiVmlicmEgUmlnaHQgUGxheWJhY2siLCAiQXVkaW8gUERNIiwgIlZJQlJBIERBQyJ9LAorCisJeyJWaWJyYSBMZWZ0IERyaXZlciIsIE5VTEwsICJWaWJyYSBMZWZ0IFBsYXliYWNrIn0sCisJeyJWaWJyYSBSaWdodCBEcml2ZXIiLCBOVUxMLCAiVmlicmEgUmlnaHQgUGxheWJhY2sifSwKKwl7IlZpYnJhIExlZnQgRHJpdmVyIiwgTlVMTCwgIlZpYnJhIExlZnQgQ29udHJvbCJ9LAorCXsiVmlicmEgUmlnaHQgRHJpdmVyIiwgTlVMTCwgIlZpYnJhIFJpZ2h0IENvbnRyb2wifSwKKworCXsiVklCUkFMIiwgTlVMTCwgIlZpYnJhIExlZnQgRHJpdmVyIn0sCisJeyJWSUJSQVIiLCBOVUxMLCAiVmlicmEgUmlnaHQgRHJpdmVyIn0sCiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdHdsNjA0MF9kYXBtX3dpZGdldHMsCi0JCQkJIEFSUkFZX1NJWkUodHdsNjA0MF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwotCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHR3bDYwNDBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewpAQCAtMTMyNSw4ICsxMjgyLDcgQEAKIAogCQlwcml2LT5jb2RlY19wb3dlcmVkID0gMTsKIAotCQkvKiBpbml0aWFsaXplIHZkZC92c3MgcmVnaXN0ZXJzIHdpdGggcmVnX2NhY2hlICovCi0JCXR3bDYwNDBfaW5pdF92ZGRfcmVncyhjb2RlYyk7CisJCXR3bDYwNDBfcmVzdG9yZV9yZWdzKGNvZGVjKTsKIAogCQkvKiBTZXQgZXh0ZXJuYWwgYm9vc3QgR1BPICovCiAJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0dQT0NUTCwgMHgwMik7CkBAIC0xMzgwLDEzICsxMzM2LDYgQEAKIAkJCQlyYXRlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCS8qIENhcHR1cmUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIDE3LjY0TUh6IHN5c2NsayAqLwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJImNhcHR1cmUgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGF0ICVkSHpcbiIsCi0JCQkJcmF0ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlwcml2LT5zeXNjbGsgPSAxNzY0MDAwMDsKIAkJYnJlYWs7CiAJY2FzZSA4MDAwOgpAQCAtMTQxOSwxMyArMTM2OCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICgocHJpdi0+c3lzY2xrID09IDE3NjQwMDAwKSAmJiBwcml2LT5ub25fbHApIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkic29tZSBlbmFibGVkIHBhdGhzIGFyZW4ndCBzdXBwb3J0ZWQgYXQgJWRIelxuIiwKLQkJCQlwcml2LT5zeXNjbGspOwotCQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KIAlyZXQgPSB0d2w2MDQwX3NldF9wbGwodHdsNjA0MCwgcHJpdi0+cGxsLCBwcml2LT5jbGtfaW4sIHByaXYtPnN5c2Nsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4gbm90IHNldCBQTEwgKCVkKVxuIiwgcmV0KTsKQEAgLTE0NjQsMTEgKzE0MDYsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdHdsNjA0MF9kYWlbXSA9IHsKIHsKLQkubmFtZSA9ICJ0d2w2MDQwLWhpZmkiLAorCS5uYW1lID0gInR3bDYwNDAtbGVnYWN5IiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCiAJCS5jaGFubmVsc19taW4gPSAxLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDUsCiAJCS5yYXRlcyA9IFRXTDYwNDBfUkFURVMsCiAJCS5mb3JtYXRzID0gVFdMNjA0MF9GT1JNQVRTLAogCX0sCkBAIC0xNTE4LDggKzE0NjAsOCBAQAogCS5uYW1lID0gInR3bDYwNDAtdmliIiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJWaWJyYSBQbGF5YmFjayIsCi0JCS5jaGFubmVsc19taW4gPSAyLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAxLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAogCQkuZm9ybWF0cyA9IFRXTDYwNDBfRk9STUFUUywKIAl9LApAQCAtMTU2Miw2ICsxNTA0LDcgQEAKIAogCXByaXYtPmNvZGVjID0gY29kZWM7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOworCWNvZGVjLT5pZ25vcmVfcG1kb3duX3RpbWUgPSAxOwogCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5oc19sZWZ0X3N0ZXAgJiYgcGRhdGEtPmhzX3JpZ2h0X3N0ZXApIHsKIAkJcHJpdi0+aHNfbGVmdF9zdGVwID0gcGRhdGEtPmhzX2xlZnRfc3RlcDsKQEAgLTE1ODYsMzMgKzE1MjksMjEgQEAKIAkJZ290byB3b3JrX2VycjsKIAl9CiAKLQlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1jb2RlYyIpOworCXByaXYtPndvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgidHdsNjA0MC1jb2RlYyIsIDAsIDApOwogCWlmICghcHJpdi0+d29ya3F1ZXVlKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gd29ya19lcnI7CiAJfQogCi0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmRlbGF5ZWRfd29yaywgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhzX2phY2sud29yaywgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhlYWRzZXQud29yaywgdHdsNjA0MF9wZ2FfaHNfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhhbmRzZnJlZS53b3JrLCB0d2w2MDQwX3BnYV9oZl93b3JrKTsKIAogCW11dGV4X2luaXQoJnByaXYtPm11dGV4KTsKIAogCWluaXRfY29tcGxldGlvbigmcHJpdi0+aGVhZHNldC5yYW1wX2RvbmUpOwogCWluaXRfY29tcGxldGlvbigmcHJpdi0+aGFuZHNmcmVlLnJhbXBfZG9uZSk7CiAKLQlwcml2LT5oZl93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1oZiIpOwotCWlmIChwcml2LT5oZl93b3JrcXVldWUgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGhmd3FfZXJyOwotCX0KLQlwcml2LT5oc193b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidHdsNjA0MC1ocyIpOwotCWlmIChwcml2LT5oc193b3JrcXVldWUgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGhzd3FfZXJyOwotCX0KLQotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5oc19kZWxheWVkX3dvcmssIHR3bDYwNDBfcGdhX2hzX3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5oZl9kZWxheWVkX3dvcmssIHR3bDYwNDBfcGdhX2hmX3dvcmspOwotCiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocHJpdi0+cGx1Z19pcnEsIE5VTEwsIHR3bDYwNDBfYXVkaW9faGFuZGxlciwKIAkJCQkgICAwLCAidHdsNjA0MF9pcnFfcGx1ZyIsIGNvZGVjKTsKIAlpZiAocmV0KSB7CkBAIC0xNjIwLDI3ICsxNTUxLDE2IEBACiAJCWdvdG8gcGx1Z2lycV9lcnI7CiAJfQogCi0JLyogaW5pdCB2aW8gcmVnaXN0ZXJzICovCi0JdHdsNjA0MF9pbml0X3Zpb19yZWdzKGNvZGVjKTsKKwl0d2w2MDQwX2luaXRfY2hpcChjb2RlYyk7CiAKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlyZXQgPSB0d2w2MDQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0JaWYgKHJldCkKLQkJZ290byBiaWFzX2VycjsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHdsNjA0MF9zbmRfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0d2w2MDQwX3NuZF9jb250cm9scykpOwotCXR3bDYwNDBfYWRkX3dpZGdldHMoY29kZWMpOwotCi0JcmV0dXJuIDA7Ci0KLWJpYXNfZXJyOgorCS8qIEVycm9yIHBhdGggKi8KIAlmcmVlX2lycShwcml2LT5wbHVnX2lycSwgY29kZWMpOwogcGx1Z2lycV9lcnI6Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+aHNfd29ya3F1ZXVlKTsKLWhzd3FfZXJyOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhmX3dvcmtxdWV1ZSk7Ci1oZndxX2VycjoKIAlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwogd29ya19lcnI6CiAJa2ZyZWUocHJpdik7CkBAIC0xNjU0LDggKzE1NzQsNiBAQAogCXR3bDYwNDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOwogCWZyZWVfaXJxKHByaXYtPnBsdWdfaXJxLCBjb2RlYyk7CiAJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5oZl93b3JrcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhzX3dvcmtxdWV1ZSk7CiAJa2ZyZWUocHJpdik7CiAKIAlyZXR1cm4gMDsKQEAgLTE2NzIsNiArMTU5MCwxMyBAQAogCS5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUodHdsNjA0MF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB0d2w2MDQwX3JlZywKKworCS5jb250cm9scyA9IHR3bDYwNDBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gdHdsNjA0MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0d2w2MDQwX2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCmluZGV4IGQ4ZGU2NzguLmE4MzI3N2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oCkBAIC0yMiw4ICsyMiwyMSBAQAogI2lmbmRlZiBfX1RXTDYwNDBfSF9fCiAjZGVmaW5lIF9fVFdMNjA0MF9IX18KIAorZW51bSB0d2w2MDQwX3RyaW0geworCVRXTDYwNDBfVFJJTV9UUklNMSA9IDAsCisJVFdMNjA0MF9UUklNX1RSSU0yLAorCVRXTDYwNDBfVFJJTV9UUklNMywKKwlUV0w2MDQwX1RSSU1fSFNPVFJJTSwKKwlUV0w2MDQwX1RSSU1fSEZPVFJJTSwKKwlUV0w2MDQwX1RSSU1fSU5WQUwsCit9OworCisjZGVmaW5lIFRXTDYwNDBfSFNGX1RSSU1fTEVGVCh4KQkoeCAmIDB4MGYpCisjZGVmaW5lIFRXTDYwNDBfSFNGX1RSSU1fUklHSFQoeCkJKCh4ID4+IDQpICYgMHgwZikKKwogdm9pZCB0d2w2MDQwX2hzX2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCSAgICBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgcmVwb3J0KTsKIGludCB0d2w2MDQwX2dldF9jbGtfaWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2ludCB0d2w2MDQwX2dldF90cmltX3ZhbHVlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgZW51bSB0d2w2MDQwX3RyaW0gdHJpbSk7CiAKICNlbmRpZiAvKiBFbmQgb2YgX19UV0w2MDQwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKaW5kZXggNTgzNjIwMS4uYTg1NDk4OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvd2wxMjczLWNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtNDYyLDcgKzQ2Myw2IEBACiAJd2wxMjczLT5jb3JlID0gKmNvcmU7CiAKIAlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCB3bDEyNzMpOwotCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CiAKIAlyID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdsMTI3M19jb250cm9scywKIAkJCQkgQVJSQVlfU0laRSh3bDEyNzNfY29udHJvbHMpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKaW5kZXggYmNjMjA4OS4uY2QwZWMwZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKQEAgLTEyLDEwICsxMiw1OSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3dtMTI1MC1ldjEuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKndtMTI1MF9ncGlvX25hbWVzW1dNMTI1MF9FVjFfTlVNX0dQSU9TXSA9IHsKKwkiV00xMjUwIENMS19FTkEiLAorCSJXTTEyNTAgQ0xLX1NFTDAiLAorCSJXTTEyNTAgQ0xLX1NFTDEiLAorCSJXTTEyNTAgT1NSIiwKKwkiV00xMjUwIE1BU1RFUiIsCit9OworCitzdHJ1Y3Qgd20xMjUwX3ByaXYgeworCXN0cnVjdCBncGlvIGdwaW9zW1dNMTI1MF9FVjFfTlVNX0dQSU9TXTsKK307CisKK3N0YXRpYyBpbnQgd20xMjUwX2V2MV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgd20xMjUwX3ByaXYgKndtMTI1MCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKKwlpbnQgZW5hOworCisJaWYgKHdtMTI1MCkKKwkJZW5hID0gd20xMjUwLT5ncGlvc1tXTTEyNTBfRVYxX0dQSU9fQ0xLX0VOQV0uZ3BpbzsKKwllbHNlCisJCWVuYSA9IC0xOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGVuYSA+PSAwKQorCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZW5hLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCWlmIChlbmEgPj0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGVuYSwgMCk7CisJCWJyZWFrOworCX0KKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiAwOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd20xMjUwX2V2MV9kYXBtX3dpZGdldHNbXSA9IHsKIFNORF9TT0NfREFQTV9BREMoIkFEQyIsICJ3bTEyNTAtZXYxIENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLApAQCAtNTMsMTggKzEwMiwxMDMgQEAKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3dpZGdldHMpLAogCS5kYXBtX3JvdXRlcyA9IHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMsCiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3JvdXRlcyksCisKKwkuc2V0X2JpYXNfbGV2ZWwgPSB3bTEyNTBfZXYxX3NldF9iaWFzX2xldmVsLAorCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHdtMTI1MF9ldjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTEyNTBfZXYxX3BkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCiB7Ci0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxLAotCQkJCSAgICAgICZ3bTEyNTBfZXYxX2RhaSwgMSk7CisJc3RydWN0IHdtMTI1MF9ldjFfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOworCXN0cnVjdCB3bTEyNTBfcHJpdiAqd20xMjUwOworCWludCBpLCByZXQ7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gMDsKKworCXdtMTI1MCA9IGt6YWxsb2Moc2l6ZW9mKCp3bTEyNTApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdtMTI1MCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBwcml2YXRlIGRhdGFcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKTsgaSsrKSB7CisJCXdtMTI1MC0+Z3Bpb3NbaV0uZ3BpbyA9IHBkYXRhLT5ncGlvc1tpXTsKKwkJd20xMjUwLT5ncGlvc1tpXS5sYWJlbCA9IHdtMTI1MF9ncGlvX25hbWVzW2ldOworCQl3bTEyNTAtPmdwaW9zW2ldLmZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfTE9XOworCX0KKwl3bTEyNTAtPmdwaW9zW1dNMTI1MF9FVjFfR1BJT19DTEtfU0VMMF0uZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9ISUdIOworCXdtMTI1MC0+Z3Bpb3NbV00xMjUwX0VWMV9HUElPX0NMS19TRUwxXS5mbGFncyA9IEdQSU9GX09VVF9JTklUX0hJR0g7CisKKwlyZXQgPSBncGlvX3JlcXVlc3RfYXJyYXkod20xMjUwLT5ncGlvcywgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKSk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGdldCBHUElPczogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmaTJjLT5kZXYsIHdtMTI1MCk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfYWxsb2M6CisJa2ZyZWUod20xMjUwKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3bTEyNTBfZXYxX2ZyZWUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzdHJ1Y3Qgd20xMjUwX3ByaXYgKndtMTI1MCA9IGRldl9nZXRfZHJ2ZGF0YSgmaTJjLT5kZXYpOworCisJaWYgKHdtMTI1MCkgeworCQlncGlvX2ZyZWVfYXJyYXkod20xMjUwLT5ncGlvcywgQVJSQVlfU0laRSh3bTEyNTAtPmdwaW9zKSk7CisJCWtmcmVlKHdtMTI1MCk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTEyNTBfZXYxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK3sKKwlpbnQgaWQsIGJvYXJkLCByZXYsIHJldDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmaTJjLT5kZXYsIE5VTEwpOworCisJYm9hcmQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoaTJjLCAwKTsKKwlpZiAoYm9hcmQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSUQ6ICVkXG4iLCBib2FyZCk7CisJCXJldHVybiBib2FyZDsKKwl9CisKKwlpZCA9IChib2FyZCAmIDB4ZmUpID4+IDI7CisJcmV2ID0gYm9hcmQgJiAweDM7CisKKwlpZiAoaWQgIT0gMSkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIlVua25vd24gYm9hcmQgSUQgJWRcbiIsIGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2X2luZm8oJmkyYy0+ZGV2LCAicmV2aXNpb24gJWRcbiIsIHJldiArIDEpOworCisJcmV0ID0gd20xMjUwX2V2MV9wZGF0YShpMmMpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxLAorCQkJCSAgICAgJndtMTI1MF9ldjFfZGFpLCAxKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ09ERUM6ICVkXG4iLCByZXQpOworCQl3bTEyNTBfZXYxX2ZyZWUoaTJjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgd20xMjUwX2V2MV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKIHsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKwl3bTEyNTBfZXYxX2ZyZWUoaTJjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAtdGFibGVzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC10YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWNlODFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAtdGFibGVzLmMKQEAgLTAsMCArMSwxNTMxIEBACisvKgorICogd201MTAwLXRhYmxlcy5jICAtLSAgV001MTAwIEFMU0EgU29DIEF1ZGlvIGRyaXZlciBkYXRhCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIndtNTEwMC5oIgorCitpbnQgd201MTAwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV001MTAwX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV001MTAwX0RFVklDRV9SRVZJU0lPTjoKKwljYXNlIFdNNTEwMF9GWF9DVFJMOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzM6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzE6CisJY2FzZSBXTTUxMDBfT1VUUFVUX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOUFVUX0VOQUJMRVNfU1RBVFVTOgorCWNhc2UgV001MTAwX01JQ19ERVRFQ1RfMzoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgd201MTAwX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV001MTAwX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV001MTAwX0RFVklDRV9SRVZJU0lPTjoKKwljYXNlIFdNNTEwMF9DVFJMX0lGXzE6CisJY2FzZSBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMToKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMToKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMjoKKwljYXNlIFdNNTEwMF9QV01fRFJJVkVfMzoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR18xOgorCWNhc2UgV001MTAwX0NMT0NLSU5HXzM6CisJY2FzZSBXTTUxMDBfQ0xPQ0tJTkdfNDoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR181OgorCWNhc2UgV001MTAwX0NMT0NLSU5HXzY6CisJY2FzZSBXTTUxMDBfQ0xPQ0tJTkdfNzoKKwljYXNlIFdNNTEwMF9DTE9DS0lOR184OgorCWNhc2UgV001MTAwX0FTUkNfRU5BQkxFOgorCWNhc2UgV001MTAwX0FTUkNfU1RBVFVTOgorCWNhc2UgV001MTAwX0FTUkNfUkFURTE6CisJY2FzZSBXTTUxMDBfSVNSQ18xX0NUUkxfMToKKwljYXNlIFdNNTEwMF9JU1JDXzFfQ1RSTF8yOgorCWNhc2UgV001MTAwX0lTUkNfMl9DVFJMMToKKwljYXNlIFdNNTEwMF9JU1JDXzJfQ1RSTF8yOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8xOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8yOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF8zOgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF81OgorCWNhc2UgV001MTAwX0ZMTDFfQ09OVFJPTF82OgorCWNhc2UgV001MTAwX0ZMTDFfRUZTXzE6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzE6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzI6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzM6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzU6CisJY2FzZSBXTTUxMDBfRkxMMl9DT05UUk9MXzY6CisJY2FzZSBXTTUxMDBfRkxMMl9FRlNfMToKKwljYXNlIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMToKKwljYXNlIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMjoKKwljYXNlIFdNNTEwMF9IUF9DSEFSR0VfUFVNUF8xOgorCWNhc2UgV001MTAwX0xETzFfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9NSUNfQklBU19DVFJMXzE6CisJY2FzZSBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8yOgorCWNhc2UgV001MTAwX01JQ19CSUFTX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9BQ0NFU1NPUllfREVURUNUX01PREVfMToKKwljYXNlIFdNNTEwMF9IRUFEUEhPTkVfREVURUNUXzE6CisJY2FzZSBXTTUxMDBfSEVBRFBIT05FX0RFVEVDVF8yOgorCWNhc2UgV001MTAwX01JQ19ERVRFQ1RfMToKKwljYXNlIFdNNTEwMF9NSUNfREVURUNUXzI6CisJY2FzZSBXTTUxMDBfTUlDX0RFVEVDVF8zOgorCWNhc2UgV001MTAwX0lOUFVUX0VOQUJMRVM6CisJY2FzZSBXTTUxMDBfSU5QVVRfRU5BQkxFU19TVEFUVVM6CisJY2FzZSBXTTUxMDBfSU4xTF9DT05UUk9MOgorCWNhc2UgV001MTAwX0lOMVJfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JTjJMX0NPTlRST0w6CisJY2FzZSBXTTUxMDBfSU4yUl9DT05UUk9MOgorCWNhc2UgV001MTAwX0lOM0xfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JTjNSX0NPTlRST0w6CisJY2FzZSBXTTUxMDBfSU40TF9DT05UUk9MOgorCWNhc2UgV001MTAwX0lONFJfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9SWEFOQ19TUkM6CisJY2FzZSBXTTUxMDBfSU5QVVRfVk9MVU1FX1JBTVA6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xUjoKKwljYXNlIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMkw6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJSOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zTDoKKwljYXNlIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM1I6CisJY2FzZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMOgorCWNhc2UgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80UjoKKwljYXNlIFdNNTEwMF9PVVRQVVRfRU5BQkxFU18yOgorCWNhc2UgV001MTAwX09VVFBVVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfQ0hBTk5FTF9FTkFCTEVTXzE6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV8xTDoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzFSOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMUw6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8xUjoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzJMOgorCWNhc2UgV001MTAwX09VVF9WT0xVTUVfMlI6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8yTDoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzJSOgorCWNhc2UgV001MTAwX09VVF9WT0xVTUVfM0w6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV8zUjoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzNMOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfM1I6CisJY2FzZSBXTTUxMDBfT1VUX1ZPTFVNRV80TDoKKwljYXNlIFdNNTEwMF9PVVRfVk9MVU1FXzRSOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNUw6CisJY2FzZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF81UjoKKwljYXNlIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzZMOgorCWNhc2UgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNlI6CisJY2FzZSBXTTUxMDBfREFDX0FFQ19DT05UUk9MXzE6CisJY2FzZSBXTTUxMDBfT1VUUFVUX1ZPTFVNRV9SQU1QOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xTDoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMVI6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJMOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yUjoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0w6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNSOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80TDoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNFI6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVMOgorCWNhc2UgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81UjoKKwljYXNlIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkw6CisJY2FzZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzZSOgorCWNhc2UgV001MTAwX1BETV9TUEsxX0NUUkxfMToKKwljYXNlIFdNNTEwMF9QRE1fU1BLMV9DVFJMXzI6CisJY2FzZSBXTTUxMDBfUERNX1NQSzJfQ1RSTF8xOgorCWNhc2UgV001MTAwX1BETV9TUEsyX0NUUkxfMjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV81OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV84OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xMjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzEzOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xNToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE2OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMTc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjA6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yMToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzIyOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjM6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yNDoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8xXzI1OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzFfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMV8yNzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl81OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl84OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8yXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzJfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfMl8yNzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18yOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMzoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzQ6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM181OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfNjoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzc6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM184OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfOToKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzEwOgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMTE6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18xODoKKwljYXNlIFdNNTEwMF9BVURJT19JRl8zXzE5OgorCWNhc2UgV001MTAwX0FVRElPX0lGXzNfMjY6CisJY2FzZSBXTTUxMDBfQVVESU9fSUZfM18yNzoKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9QV00xTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX1BXTTJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX1BXTTJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9QV00yTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDJSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDVSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVExTUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVExTUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMU1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF8xX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzJfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF8zX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzRfU09VUkNFOgorCWNhc2UgV001MTAwX0VRMk1JWF9JTlBVVF80X1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRM01JWF9JTlBVVF8yX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzNfU09VUkNFOgorCWNhc2UgV001MTAwX0VRM01JWF9JTlBVVF8zX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTNNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzRfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzJfU09VUkNFOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF8yX1ZPTFVNRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzNfVk9MVU1FOgorCWNhc2UgV001MTAwX0VRNE1JWF9JTlBVVF80X1NPVVJDRToKKwljYXNlIFdNNTEwMF9FUTRNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMUFVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQMkFVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMl9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMl9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9WT0xVTUU6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDVNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfRFNQM0FVWDZNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQVNSQzFMTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0FTUkMxUk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9BU1JDMkxNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfQVNSQzJSTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxREVDMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMURFQzJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzFERUMzTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxREVDNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMUlOVDFNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzFJTlQyTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMxSU5UM01JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMUlOVDRNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJERUMxTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMyREVDMk1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMkRFQzNNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJERUM0TUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMySU5UMU1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9JU1JDMklOVDJNSVhfSU5QVVRfMV9TT1VSQ0U6CisJY2FzZSBXTTUxMDBfSVNSQzJJTlQzTUlYX0lOUFVUXzFfU09VUkNFOgorCWNhc2UgV001MTAwX0lTUkMySU5UNE1JWF9JTlBVVF8xX1NPVVJDRToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMjoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNDoKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNToKKwljYXNlIFdNNTEwMF9HUElPX0NUUkxfNjoKKwljYXNlIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzE6CisJY2FzZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF8yOgorCWNhc2UgV001MTAwX01JU0NfUEFEX0NUUkxfMzoKKwljYXNlIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzQ6CisJY2FzZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF81OgorCWNhc2UgV001MTAwX01JU0NfR1BJT18xOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMToKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzI6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18yOgorCWNhc2UgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzM6CisJY2FzZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNDoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzRfTUFTSzoKKwljYXNlIFdNNTEwMF9JTlRFUlJVUFRfQ09OVFJPTDoKKwljYXNlIFdNNTEwMF9JUlFfREVCT1VOQ0VfMToKKwljYXNlIFdNNTEwMF9JUlFfREVCT1VOQ0VfMjoKKwljYXNlIFdNNTEwMF9GWF9DVFJMOgorCWNhc2UgV001MTAwX0VRMV8xOgorCWNhc2UgV001MTAwX0VRMV8yOgorCWNhc2UgV001MTAwX0VRMV8zOgorCWNhc2UgV001MTAwX0VRMV80OgorCWNhc2UgV001MTAwX0VRMV81OgorCWNhc2UgV001MTAwX0VRMV82OgorCWNhc2UgV001MTAwX0VRMV83OgorCWNhc2UgV001MTAwX0VRMV84OgorCWNhc2UgV001MTAwX0VRMV85OgorCWNhc2UgV001MTAwX0VRMV8xMDoKKwljYXNlIFdNNTEwMF9FUTFfMTE6CisJY2FzZSBXTTUxMDBfRVExXzEyOgorCWNhc2UgV001MTAwX0VRMV8xMzoKKwljYXNlIFdNNTEwMF9FUTFfMTQ6CisJY2FzZSBXTTUxMDBfRVExXzE1OgorCWNhc2UgV001MTAwX0VRMV8xNjoKKwljYXNlIFdNNTEwMF9FUTFfMTc6CisJY2FzZSBXTTUxMDBfRVExXzE4OgorCWNhc2UgV001MTAwX0VRMV8xOToKKwljYXNlIFdNNTEwMF9FUTFfMjA6CisJY2FzZSBXTTUxMDBfRVEyXzE6CisJY2FzZSBXTTUxMDBfRVEyXzI6CisJY2FzZSBXTTUxMDBfRVEyXzM6CisJY2FzZSBXTTUxMDBfRVEyXzQ6CisJY2FzZSBXTTUxMDBfRVEyXzU6CisJY2FzZSBXTTUxMDBfRVEyXzY6CisJY2FzZSBXTTUxMDBfRVEyXzc6CisJY2FzZSBXTTUxMDBfRVEyXzg6CisJY2FzZSBXTTUxMDBfRVEyXzk6CisJY2FzZSBXTTUxMDBfRVEyXzEwOgorCWNhc2UgV001MTAwX0VRMl8xMToKKwljYXNlIFdNNTEwMF9FUTJfMTI6CisJY2FzZSBXTTUxMDBfRVEyXzEzOgorCWNhc2UgV001MTAwX0VRMl8xNDoKKwljYXNlIFdNNTEwMF9FUTJfMTU6CisJY2FzZSBXTTUxMDBfRVEyXzE2OgorCWNhc2UgV001MTAwX0VRMl8xNzoKKwljYXNlIFdNNTEwMF9FUTJfMTg6CisJY2FzZSBXTTUxMDBfRVEyXzE5OgorCWNhc2UgV001MTAwX0VRMl8yMDoKKwljYXNlIFdNNTEwMF9FUTNfMToKKwljYXNlIFdNNTEwMF9FUTNfMjoKKwljYXNlIFdNNTEwMF9FUTNfMzoKKwljYXNlIFdNNTEwMF9FUTNfNDoKKwljYXNlIFdNNTEwMF9FUTNfNToKKwljYXNlIFdNNTEwMF9FUTNfNjoKKwljYXNlIFdNNTEwMF9FUTNfNzoKKwljYXNlIFdNNTEwMF9FUTNfODoKKwljYXNlIFdNNTEwMF9FUTNfOToKKwljYXNlIFdNNTEwMF9FUTNfMTA6CisJY2FzZSBXTTUxMDBfRVEzXzExOgorCWNhc2UgV001MTAwX0VRM18xMjoKKwljYXNlIFdNNTEwMF9FUTNfMTM6CisJY2FzZSBXTTUxMDBfRVEzXzE0OgorCWNhc2UgV001MTAwX0VRM18xNToKKwljYXNlIFdNNTEwMF9FUTNfMTY6CisJY2FzZSBXTTUxMDBfRVEzXzE3OgorCWNhc2UgV001MTAwX0VRM18xODoKKwljYXNlIFdNNTEwMF9FUTNfMTk6CisJY2FzZSBXTTUxMDBfRVEzXzIwOgorCWNhc2UgV001MTAwX0VRNF8xOgorCWNhc2UgV001MTAwX0VRNF8yOgorCWNhc2UgV001MTAwX0VRNF8zOgorCWNhc2UgV001MTAwX0VRNF80OgorCWNhc2UgV001MTAwX0VRNF81OgorCWNhc2UgV001MTAwX0VRNF82OgorCWNhc2UgV001MTAwX0VRNF83OgorCWNhc2UgV001MTAwX0VRNF84OgorCWNhc2UgV001MTAwX0VRNF85OgorCWNhc2UgV001MTAwX0VRNF8xMDoKKwljYXNlIFdNNTEwMF9FUTRfMTE6CisJY2FzZSBXTTUxMDBfRVE0XzEyOgorCWNhc2UgV001MTAwX0VRNF8xMzoKKwljYXNlIFdNNTEwMF9FUTRfMTQ6CisJY2FzZSBXTTUxMDBfRVE0XzE1OgorCWNhc2UgV001MTAwX0VRNF8xNjoKKwljYXNlIFdNNTEwMF9FUTRfMTc6CisJY2FzZSBXTTUxMDBfRVE0XzE4OgorCWNhc2UgV001MTAwX0VRNF8xOToKKwljYXNlIFdNNTEwMF9FUTRfMjA6CisJY2FzZSBXTTUxMDBfRFJDMV9DVFJMMToKKwljYXNlIFdNNTEwMF9EUkMxX0NUUkwyOgorCWNhc2UgV001MTAwX0RSQzFfQ1RSTDM6CisJY2FzZSBXTTUxMDBfRFJDMV9DVFJMNDoKKwljYXNlIFdNNTEwMF9EUkMxX0NUUkw1OgorCWNhc2UgV001MTAwX0hQTFBGMV8xOgorCWNhc2UgV001MTAwX0hQTFBGMV8yOgorCWNhc2UgV001MTAwX0hQTFBGMl8xOgorCWNhc2UgV001MTAwX0hQTFBGMl8yOgorCWNhc2UgV001MTAwX0hQTFBGM18xOgorCWNhc2UgV001MTAwX0hQTFBGM18yOgorCWNhc2UgV001MTAwX0hQTFBGNF8xOgorCWNhc2UgV001MTAwX0hQTFBGNF8yOgorCWNhc2UgV001MTAwX0RTUDFfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQMV9ETV8yOgorCWNhc2UgV001MTAwX0RTUDFfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AxX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xOgorCWNhc2UgV001MTAwX0RTUDFfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV80OgorCWNhc2UgV001MTAwX0RTUDFfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDFfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AxX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQMV9QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDFfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8xOgorCWNhc2UgV001MTAwX0RTUDFfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDFfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AxX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQMV9aTV8yMDQ3OgorCWNhc2UgV001MTAwX0RTUDJfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQMl9ETV8yOgorCWNhc2UgV001MTAwX0RTUDJfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AyX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xOgorCWNhc2UgV001MTAwX0RTUDJfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV80OgorCWNhc2UgV001MTAwX0RTUDJfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDJfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AyX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQMl9QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDJfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8xOgorCWNhc2UgV001MTAwX0RTUDJfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDJfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AyX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQMl9aTV8yMDQ3OgorCWNhc2UgV001MTAwX0RTUDNfRE1fMDoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzE6CisJY2FzZSBXTTUxMDBfRFNQM19ETV8yOgorCWNhc2UgV001MTAwX0RTUDNfRE1fMzoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUwODoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUwOToKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUxMDoKKwljYXNlIFdNNTEwMF9EU1AzX0RNXzUxMToKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzA6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xOgorCWNhc2UgV001MTAwX0RTUDNfUE1fMjoKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzM6CisJY2FzZSBXTTUxMDBfRFNQM19QTV80OgorCWNhc2UgV001MTAwX0RTUDNfUE1fNToKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzE1MzA6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xNTMxOgorCWNhc2UgV001MTAwX0RTUDNfUE1fMTUzMjoKKwljYXNlIFdNNTEwMF9EU1AzX1BNXzE1MzM6CisJY2FzZSBXTTUxMDBfRFNQM19QTV8xNTM0OgorCWNhc2UgV001MTAwX0RTUDNfUE1fMTUzNToKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzA6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8xOgorCWNhc2UgV001MTAwX0RTUDNfWk1fMjoKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzM6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8yMDQ0OgorCWNhc2UgV001MTAwX0RTUDNfWk1fMjA0NToKKwljYXNlIFdNNTEwMF9EU1AzX1pNXzIwNDY6CisJY2FzZSBXTTUxMDBfRFNQM19aTV8yMDQ3OgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3UxNiB3bTUxMDBfcmVnX2RlZmF1bHRzW1dNNTEwMF9NQVhfUkVHSVNURVIgKyAxXSA9IHsKKwlbMHgwMDAwXSA9IDB4MDAwMCwgICAgIC8qIFIwICAgICAtIHNvZnR3YXJlIHJlc2V0ICovCisJWzB4MDAwMV0gPSAweDAwMDAsICAgICAvKiBSMSAgICAgLSBEZXZpY2UgUmV2aXNpb24gKi8KKwlbMHgwMDEwXSA9IDB4MDgwMSwgICAgIC8qIFIxNiAgICAtIEN0cmwgSUYgMSAqLworCVsweDAwMjBdID0gMHgwMDAwLCAgICAgLyogUjMyICAgIC0gVG9uZSBHZW5lcmF0b3IgMSAqLworCVsweDAwMzBdID0gMHgwMDAwLCAgICAgLyogUjQ4ICAgIC0gUFdNIERyaXZlIDEgKi8KKwlbMHgwMDMxXSA9IDB4MDEwMCwgICAgIC8qIFI0OSAgICAtIFBXTSBEcml2ZSAyICovCisJWzB4MDAzMl0gPSAweDAxMDAsICAgICAvKiBSNTAgICAgLSBQV00gRHJpdmUgMyAqLworCVsweDAxMDBdID0gMHgwMDAyLCAgICAgLyogUjI1NiAgIC0gQ2xvY2tpbmcgMSAqLworCVsweDAxMDFdID0gMHgwMDAwLCAgICAgLyogUjI1NyAgIC0gQ2xvY2tpbmcgMyAqLworCVsweDAxMDJdID0gMHgwMDExLCAgICAgLyogUjI1OCAgIC0gQ2xvY2tpbmcgNCAqLworCVsweDAxMDNdID0gMHgwMDExLCAgICAgLyogUjI1OSAgIC0gQ2xvY2tpbmcgNSAqLworCVsweDAxMDRdID0gMHgwMDExLCAgICAgLyogUjI2MCAgIC0gQ2xvY2tpbmcgNiAqLworCVsweDAxMDddID0gMHgwMDAwLCAgICAgLyogUjI2MyAgIC0gQ2xvY2tpbmcgNyAqLworCVsweDAxMDhdID0gMHgwMDAwLCAgICAgLyogUjI2NCAgIC0gQ2xvY2tpbmcgOCAqLworCVsweDAxMjBdID0gMHgwMDAwLCAgICAgLyogUjI4OCAgIC0gQVNSQ19FTkFCTEUgKi8KKwlbMHgwMTIxXSA9IDB4MDAwMCwgICAgIC8qIFIyODkgICAtIEFTUkNfU1RBVFVTICovCisJWzB4MDEyMl0gPSAweDAwMDAsICAgICAvKiBSMjkwICAgLSBBU1JDX1JBVEUxICovCisJWzB4MDE0MV0gPSAweDgwMDAsICAgICAvKiBSMzIxICAgLSBJU1JDIDEgQ1RSTCAxICovCisJWzB4MDE0Ml0gPSAweDAwMDAsICAgICAvKiBSMzIyICAgLSBJU1JDIDEgQ1RSTCAyICovCisJWzB4MDE0M10gPSAweDgwMDAsICAgICAvKiBSMzIzICAgLSBJU1JDIDIgQ1RSTDEgKi8KKwlbMHgwMTQ0XSA9IDB4MDAwMCwgICAgIC8qIFIzMjQgICAtIElTUkMgMiBDVFJMIDIgKi8KKwlbMHgwMTgyXSA9IDB4MDAwMCwgICAgIC8qIFIzODYgICAtIEZMTDEgQ29udHJvbCAxICovCisJWzB4MDE4M10gPSAweDAwMDAsICAgICAvKiBSMzg3ICAgLSBGTEwxIENvbnRyb2wgMiAqLworCVsweDAxODRdID0gMHgwMDAwLCAgICAgLyogUjM4OCAgIC0gRkxMMSBDb250cm9sIDMgKi8KKwlbMHgwMTg2XSA9IDB4MDE3NywgICAgIC8qIFIzOTAgICAtIEZMTDEgQ29udHJvbCA1ICovCisJWzB4MDE4N10gPSAweDAwMDEsICAgICAvKiBSMzkxICAgLSBGTEwxIENvbnRyb2wgNiAqLworCVsweDAxODhdID0gMHgwMDAwLCAgICAgLyogUjM5MiAgIC0gRkxMMSBFRlMgMSAqLworCVsweDAxQTJdID0gMHgwMDAwLCAgICAgLyogUjQxOCAgIC0gRkxMMiBDb250cm9sIDEgKi8KKwlbMHgwMUEzXSA9IDB4MDAwMCwgICAgIC8qIFI0MTkgICAtIEZMTDIgQ29udHJvbCAyICovCisJWzB4MDFBNF0gPSAweDAwMDAsICAgICAvKiBSNDIwICAgLSBGTEwyIENvbnRyb2wgMyAqLworCVsweDAxQTZdID0gMHgwMTc3LCAgICAgLyogUjQyMiAgIC0gRkxMMiBDb250cm9sIDUgKi8KKwlbMHgwMUE3XSA9IDB4MDAwMSwgICAgIC8qIFI0MjMgICAtIEZMTDIgQ29udHJvbCA2ICovCisJWzB4MDFBOF0gPSAweDAwMDAsICAgICAvKiBSNDI0ICAgLSBGTEwyIEVGUyAxICovCisJWzB4MDIwMF0gPSAweDAwMjAsICAgICAvKiBSNTEyICAgLSBNaWMgQ2hhcmdlIFB1bXAgMSAqLworCVsweDAyMDFdID0gMHhCMDg0LCAgICAgLyogUjUxMyAgIC0gTWljIENoYXJnZSBQdW1wIDIgKi8KKwlbMHgwMjAyXSA9IDB4QkJERSwgICAgIC8qIFI1MTQgICAtIEhQIENoYXJnZSBQdW1wIDEgKi8KKwlbMHgwMjExXSA9IDB4MjBENCwgICAgIC8qIFI1MjkgICAtIExETzEgQ29udHJvbCAqLworCVsweDAyMTVdID0gMHgwMDYyLCAgICAgLyogUjUzMyAgIC0gTWljIEJpYXMgQ3RybCAxICovCisJWzB4MDIxNl0gPSAweDAwNjIsICAgICAvKiBSNTM0ICAgLSBNaWMgQmlhcyBDdHJsIDIgKi8KKwlbMHgwMjE3XSA9IDB4MDA2MiwgICAgIC8qIFI1MzUgICAtIE1pYyBCaWFzIEN0cmwgMyAqLworCVsweDAyODBdID0gMHgwMDA0LCAgICAgLyogUjY0MCAgIC0gQWNjZXNzb3J5IERldGVjdCBNb2RlIDEgKi8KKwlbMHgwMjg4XSA9IDB4MDAyMCwgICAgIC8qIFI2NDggICAtIEhlYWRwaG9uZSBEZXRlY3QgMSAqLworCVsweDAyODldID0gMHgwMDAwLCAgICAgLyogUjY0OSAgIC0gSGVhZHBob25lIERldGVjdCAyICovCisJWzB4MDI5MF0gPSAweDExMDAsICAgICAvKiBSNjU2ICAgLSBNaWMgRGV0ZWN0IDEgKi8KKwlbMHgwMjkxXSA9IDB4MDA5RiwgICAgIC8qIFI2NTcgICAtIE1pYyBEZXRlY3QgMiAqLworCVsweDAyOTJdID0gMHgwMDAwLCAgICAgLyogUjY1OCAgIC0gTWljIERldGVjdCAzICovCisJWzB4MDMwMV0gPSAweDAwMDAsICAgICAvKiBSNzY5ICAgLSBJbnB1dCBFbmFibGVzICovCisJWzB4MDMwMl0gPSAweDAwMDAsICAgICAvKiBSNzcwICAgLSBJbnB1dCBFbmFibGVzIFN0YXR1cyAqLworCVsweDAzMTBdID0gMHgyMjgwLCAgICAgLyogUjc4NCAgIC0gU3RhdHVzICovCisJWzB4MDMxMV0gPSAweDAwODAsICAgICAvKiBSNzg1ICAgLSBJTjFSIENvbnRyb2wgKi8KKwlbMHgwMzEyXSA9IDB4MjI4MCwgICAgIC8qIFI3ODYgICAtIElOMkwgQ29udHJvbCAqLworCVsweDAzMTNdID0gMHgwMDgwLCAgICAgLyogUjc4NyAgIC0gSU4yUiBDb250cm9sICovCisJWzB4MDMxNF0gPSAweDIyODAsICAgICAvKiBSNzg4ICAgLSBJTjNMIENvbnRyb2wgKi8KKwlbMHgwMzE1XSA9IDB4MDA4MCwgICAgIC8qIFI3ODkgICAtIElOM1IgQ29udHJvbCAqLworCVsweDAzMTZdID0gMHgyMjgwLCAgICAgLyogUjc5MCAgIC0gSU40TCBDb250cm9sICovCisJWzB4MDMxN10gPSAweDAwODAsICAgICAvKiBSNzkxICAgLSBJTjRSIENvbnRyb2wgKi8KKwlbMHgwMzE4XSA9IDB4MDAwMCwgICAgIC8qIFI3OTIgICAtIFJYQU5DX1NSQyAqLworCVsweDAzMTldID0gMHgwMDIyLCAgICAgLyogUjc5MyAgIC0gSW5wdXQgVm9sdW1lIFJhbXAgKi8KKwlbMHgwMzIwXSA9IDB4MDE4MCwgICAgIC8qIFI4MDAgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSAxTCAqLworCVsweDAzMjFdID0gMHgwMTgwLCAgICAgLyogUjgwMSAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDFSICovCisJWzB4MDMyMl0gPSAweDAxODAsICAgICAvKiBSODAyICAgLSBBREMgRGlnaXRhbCBWb2x1bWUgMkwgKi8KKwlbMHgwMzIzXSA9IDB4MDE4MCwgICAgIC8qIFI4MDMgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSAyUiAqLworCVsweDAzMjRdID0gMHgwMTgwLCAgICAgLyogUjgwNCAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDNMICovCisJWzB4MDMyNV0gPSAweDAxODAsICAgICAvKiBSODA1ICAgLSBBREMgRGlnaXRhbCBWb2x1bWUgM1IgKi8KKwlbMHgwMzI2XSA9IDB4MDE4MCwgICAgIC8qIFI4MDYgICAtIEFEQyBEaWdpdGFsIFZvbHVtZSA0TCAqLworCVsweDAzMjddID0gMHgwMTgwLCAgICAgLyogUjgwNyAgIC0gQURDIERpZ2l0YWwgVm9sdW1lIDRSICovCisJWzB4MDQwMV0gPSAweDAwMDAsICAgICAvKiBSMTAyNSAgLSBPdXRwdXQgRW5hYmxlcyAyICovCisJWzB4MDQwMl0gPSAweDAwMDAsICAgICAvKiBSMTAyNiAgLSBPdXRwdXQgU3RhdHVzIDEgKi8KKwlbMHgwNDAzXSA9IDB4MDAwMCwgICAgIC8qIFIxMDI3ICAtIE91dHB1dCBTdGF0dXMgMiAqLworCVsweDA0MDhdID0gMHgwMDAwLCAgICAgLyogUjEwMzIgIC0gQ2hhbm5lbCBFbmFibGVzIDEgKi8KKwlbMHgwNDEwXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQwICAtIE91dCBWb2x1bWUgMUwgKi8KKwlbMHgwNDExXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQxICAtIE91dCBWb2x1bWUgMVIgKi8KKwlbMHgwNDEyXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQyICAtIERBQyBWb2x1bWUgTGltaXQgMUwgKi8KKwlbMHgwNDEzXSA9IDB4MDA4MCwgICAgIC8qIFIxMDQzICAtIERBQyBWb2x1bWUgTGltaXQgMVIgKi8KKwlbMHgwNDE0XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ0ICAtIE91dCBWb2x1bWUgMkwgKi8KKwlbMHgwNDE1XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ1ICAtIE91dCBWb2x1bWUgMlIgKi8KKwlbMHgwNDE2XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ2ICAtIERBQyBWb2x1bWUgTGltaXQgMkwgKi8KKwlbMHgwNDE3XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ3ICAtIERBQyBWb2x1bWUgTGltaXQgMlIgKi8KKwlbMHgwNDE4XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ4ICAtIE91dCBWb2x1bWUgM0wgKi8KKwlbMHgwNDE5XSA9IDB4MDA4MCwgICAgIC8qIFIxMDQ5ICAtIE91dCBWb2x1bWUgM1IgKi8KKwlbMHgwNDFBXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUwICAtIERBQyBWb2x1bWUgTGltaXQgM0wgKi8KKwlbMHgwNDFCXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUxICAtIERBQyBWb2x1bWUgTGltaXQgM1IgKi8KKwlbMHgwNDFDXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUyICAtIE91dCBWb2x1bWUgNEwgKi8KKwlbMHgwNDFEXSA9IDB4MDA4MCwgICAgIC8qIFIxMDUzICAtIE91dCBWb2x1bWUgNFIgKi8KKwlbMHgwNDFFXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU0ICAtIERBQyBWb2x1bWUgTGltaXQgNUwgKi8KKwlbMHgwNDFGXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU1ICAtIERBQyBWb2x1bWUgTGltaXQgNVIgKi8KKwlbMHgwNDIwXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU2ICAtIERBQyBWb2x1bWUgTGltaXQgNkwgKi8KKwlbMHgwNDIxXSA9IDB4MDA4MCwgICAgIC8qIFIxMDU3ICAtIERBQyBWb2x1bWUgTGltaXQgNlIgKi8KKwlbMHgwNDQwXSA9IDB4MDAwMCwgICAgIC8qIFIxMDg4ICAtIERBQyBBRUMgQ29udHJvbCAxICovCisJWzB4MDQ0MV0gPSAweDAwMjIsICAgICAvKiBSMTA4OSAgLSBPdXRwdXQgVm9sdW1lIFJhbXAgKi8KKwlbMHgwNDgwXSA9IDB4MDE4MCwgICAgIC8qIFIxMTUyICAtIERBQyBEaWdpdGFsIFZvbHVtZSAxTCAqLworCVsweDA0ODFdID0gMHgwMTgwLCAgICAgLyogUjExNTMgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDFSICovCisJWzB4MDQ4Ml0gPSAweDAxODAsICAgICAvKiBSMTE1NCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMkwgKi8KKwlbMHgwNDgzXSA9IDB4MDE4MCwgICAgIC8qIFIxMTU1ICAtIERBQyBEaWdpdGFsIFZvbHVtZSAyUiAqLworCVsweDA0ODRdID0gMHgwMTgwLCAgICAgLyogUjExNTYgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDNMICovCisJWzB4MDQ4NV0gPSAweDAxODAsICAgICAvKiBSMTE1NyAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgM1IgKi8KKwlbMHgwNDg2XSA9IDB4MDE4MCwgICAgIC8qIFIxMTU4ICAtIERBQyBEaWdpdGFsIFZvbHVtZSA0TCAqLworCVsweDA0ODddID0gMHgwMTgwLCAgICAgLyogUjExNTkgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDRSICovCisJWzB4MDQ4OF0gPSAweDAxODAsICAgICAvKiBSMTE2MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNUwgKi8KKwlbMHgwNDg5XSA9IDB4MDE4MCwgICAgIC8qIFIxMTYxICAtIERBQyBEaWdpdGFsIFZvbHVtZSA1UiAqLworCVsweDA0OEFdID0gMHgwMTgwLCAgICAgLyogUjExNjIgIC0gREFDIERpZ2l0YWwgVm9sdW1lIDZMICovCisJWzB4MDQ4Ql0gPSAweDAxODAsICAgICAvKiBSMTE2MyAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNlIgKi8KKwlbMHgwNEMwXSA9IDB4MDA2OSwgICAgIC8qIFIxMjE2ICAtIFBETSBTUEsxIENUUkwgMSAqLworCVsweDA0QzFdID0gMHgwMDAwLCAgICAgLyogUjEyMTcgIC0gUERNIFNQSzEgQ1RSTCAyICovCisJWzB4MDRDMl0gPSAweDAwNjksICAgICAvKiBSMTIxOCAgLSBQRE0gU1BLMiBDVFJMIDEgKi8KKwlbMHgwNEMzXSA9IDB4MDAwMCwgICAgIC8qIFIxMjE5ICAtIFBETSBTUEsyIENUUkwgMiAqLworCVsweDA1MDBdID0gMHgwMDBDLCAgICAgLyogUjEyODAgIC0gQXVkaW8gSUYgMV8xICovCisJWzB4MDUwMV0gPSAweDAwMDgsICAgICAvKiBSMTI4MSAgLSBBdWRpbyBJRiAxXzIgKi8KKwlbMHgwNTAyXSA9IDB4MDAwMCwgICAgIC8qIFIxMjgyICAtIEF1ZGlvIElGIDFfMyAqLworCVsweDA1MDNdID0gMHgwMDAwLCAgICAgLyogUjEyODMgIC0gQXVkaW8gSUYgMV80ICovCisJWzB4MDUwNF0gPSAweDAwMDAsICAgICAvKiBSMTI4NCAgLSBBdWRpbyBJRiAxXzUgKi8KKwlbMHgwNTA1XSA9IDB4MDMwMCwgICAgIC8qIFIxMjg1ICAtIEF1ZGlvIElGIDFfNiAqLworCVsweDA1MDZdID0gMHgwMzAwLCAgICAgLyogUjEyODYgIC0gQXVkaW8gSUYgMV83ICovCisJWzB4MDUwN10gPSAweDE4MjAsICAgICAvKiBSMTI4NyAgLSBBdWRpbyBJRiAxXzggKi8KKwlbMHgwNTA4XSA9IDB4MTgyMCwgICAgIC8qIFIxMjg4ICAtIEF1ZGlvIElGIDFfOSAqLworCVsweDA1MDldID0gMHgwMDAwLCAgICAgLyogUjEyODkgIC0gQXVkaW8gSUYgMV8xMCAqLworCVsweDA1MEFdID0gMHgwMDAxLCAgICAgLyogUjEyOTAgIC0gQXVkaW8gSUYgMV8xMSAqLworCVsweDA1MEJdID0gMHgwMDAyLCAgICAgLyogUjEyOTEgIC0gQXVkaW8gSUYgMV8xMiAqLworCVsweDA1MENdID0gMHgwMDAzLCAgICAgLyogUjEyOTIgIC0gQXVkaW8gSUYgMV8xMyAqLworCVsweDA1MERdID0gMHgwMDA0LCAgICAgLyogUjEyOTMgIC0gQXVkaW8gSUYgMV8xNCAqLworCVsweDA1MEVdID0gMHgwMDA1LCAgICAgLyogUjEyOTQgIC0gQXVkaW8gSUYgMV8xNSAqLworCVsweDA1MEZdID0gMHgwMDA2LCAgICAgLyogUjEyOTUgIC0gQXVkaW8gSUYgMV8xNiAqLworCVsweDA1MTBdID0gMHgwMDA3LCAgICAgLyogUjEyOTYgIC0gQXVkaW8gSUYgMV8xNyAqLworCVsweDA1MTFdID0gMHgwMDAwLCAgICAgLyogUjEyOTcgIC0gQXVkaW8gSUYgMV8xOCAqLworCVsweDA1MTJdID0gMHgwMDAxLCAgICAgLyogUjEyOTggIC0gQXVkaW8gSUYgMV8xOSAqLworCVsweDA1MTNdID0gMHgwMDAyLCAgICAgLyogUjEyOTkgIC0gQXVkaW8gSUYgMV8yMCAqLworCVsweDA1MTRdID0gMHgwMDAzLCAgICAgLyogUjEzMDAgIC0gQXVkaW8gSUYgMV8yMSAqLworCVsweDA1MTVdID0gMHgwMDA0LCAgICAgLyogUjEzMDEgIC0gQXVkaW8gSUYgMV8yMiAqLworCVsweDA1MTZdID0gMHgwMDA1LCAgICAgLyogUjEzMDIgIC0gQXVkaW8gSUYgMV8yMyAqLworCVsweDA1MTddID0gMHgwMDA2LCAgICAgLyogUjEzMDMgIC0gQXVkaW8gSUYgMV8yNCAqLworCVsweDA1MThdID0gMHgwMDA3LCAgICAgLyogUjEzMDQgIC0gQXVkaW8gSUYgMV8yNSAqLworCVsweDA1MTldID0gMHgwMDAwLCAgICAgLyogUjEzMDUgIC0gQXVkaW8gSUYgMV8yNiAqLworCVsweDA1MUFdID0gMHgwMDAwLCAgICAgLyogUjEzMDYgIC0gQXVkaW8gSUYgMV8yNyAqLworCVsweDA1NDBdID0gMHgwMDBDLCAgICAgLyogUjEzNDQgIC0gQXVkaW8gSUYgMl8xICovCisJWzB4MDU0MV0gPSAweDAwMDgsICAgICAvKiBSMTM0NSAgLSBBdWRpbyBJRiAyXzIgKi8KKwlbMHgwNTQyXSA9IDB4MDAwMCwgICAgIC8qIFIxMzQ2ICAtIEF1ZGlvIElGIDJfMyAqLworCVsweDA1NDNdID0gMHgwMDAwLCAgICAgLyogUjEzNDcgIC0gQXVkaW8gSUYgMl80ICovCisJWzB4MDU0NF0gPSAweDAwMDAsICAgICAvKiBSMTM0OCAgLSBBdWRpbyBJRiAyXzUgKi8KKwlbMHgwNTQ1XSA9IDB4MDMwMCwgICAgIC8qIFIxMzQ5ICAtIEF1ZGlvIElGIDJfNiAqLworCVsweDA1NDZdID0gMHgwMzAwLCAgICAgLyogUjEzNTAgIC0gQXVkaW8gSUYgMl83ICovCisJWzB4MDU0N10gPSAweDE4MjAsICAgICAvKiBSMTM1MSAgLSBBdWRpbyBJRiAyXzggKi8KKwlbMHgwNTQ4XSA9IDB4MTgyMCwgICAgIC8qIFIxMzUyICAtIEF1ZGlvIElGIDJfOSAqLworCVsweDA1NDldID0gMHgwMDAwLCAgICAgLyogUjEzNTMgIC0gQXVkaW8gSUYgMl8xMCAqLworCVsweDA1NEFdID0gMHgwMDAxLCAgICAgLyogUjEzNTQgIC0gQXVkaW8gSUYgMl8xMSAqLworCVsweDA1NTFdID0gMHgwMDAwLCAgICAgLyogUjEzNjEgIC0gQXVkaW8gSUYgMl8xOCAqLworCVsweDA1NTJdID0gMHgwMDAxLCAgICAgLyogUjEzNjIgIC0gQXVkaW8gSUYgMl8xOSAqLworCVsweDA1NTldID0gMHgwMDAwLCAgICAgLyogUjEzNjkgIC0gQXVkaW8gSUYgMl8yNiAqLworCVsweDA1NUFdID0gMHgwMDAwLCAgICAgLyogUjEzNzAgIC0gQXVkaW8gSUYgMl8yNyAqLworCVsweDA1ODBdID0gMHgwMDBDLCAgICAgLyogUjE0MDggIC0gQXVkaW8gSUYgM18xICovCisJWzB4MDU4MV0gPSAweDAwMDgsICAgICAvKiBSMTQwOSAgLSBBdWRpbyBJRiAzXzIgKi8KKwlbMHgwNTgyXSA9IDB4MDAwMCwgICAgIC8qIFIxNDEwICAtIEF1ZGlvIElGIDNfMyAqLworCVsweDA1ODNdID0gMHgwMDAwLCAgICAgLyogUjE0MTEgIC0gQXVkaW8gSUYgM180ICovCisJWzB4MDU4NF0gPSAweDAwMDAsICAgICAvKiBSMTQxMiAgLSBBdWRpbyBJRiAzXzUgKi8KKwlbMHgwNTg1XSA9IDB4MDMwMCwgICAgIC8qIFIxNDEzICAtIEF1ZGlvIElGIDNfNiAqLworCVsweDA1ODZdID0gMHgwMzAwLCAgICAgLyogUjE0MTQgIC0gQXVkaW8gSUYgM183ICovCisJWzB4MDU4N10gPSAweDE4MjAsICAgICAvKiBSMTQxNSAgLSBBdWRpbyBJRiAzXzggKi8KKwlbMHgwNTg4XSA9IDB4MTgyMCwgICAgIC8qIFIxNDE2ICAtIEF1ZGlvIElGIDNfOSAqLworCVsweDA1ODldID0gMHgwMDAwLCAgICAgLyogUjE0MTcgIC0gQXVkaW8gSUYgM18xMCAqLworCVsweDA1OEFdID0gMHgwMDAxLCAgICAgLyogUjE0MTggIC0gQXVkaW8gSUYgM18xMSAqLworCVsweDA1OTFdID0gMHgwMDAwLCAgICAgLyogUjE0MjUgIC0gQXVkaW8gSUYgM18xOCAqLworCVsweDA1OTJdID0gMHgwMDAxLCAgICAgLyogUjE0MjYgIC0gQXVkaW8gSUYgM18xOSAqLworCVsweDA1OTldID0gMHgwMDAwLCAgICAgLyogUjE0MzMgIC0gQXVkaW8gSUYgM18yNiAqLworCVsweDA1OUFdID0gMHgwMDAwLCAgICAgLyogUjE0MzQgIC0gQXVkaW8gSUYgM18yNyAqLworCVsweDA2NDBdID0gMHgwMDAwLCAgICAgLyogUjE2MDAgIC0gUFdNMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2NDFdID0gMHgwMDgwLCAgICAgLyogUjE2MDEgIC0gUFdNMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2NDJdID0gMHgwMDAwLCAgICAgLyogUjE2MDIgIC0gUFdNMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2NDNdID0gMHgwMDgwLCAgICAgLyogUjE2MDMgIC0gUFdNMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2NDRdID0gMHgwMDAwLCAgICAgLyogUjE2MDQgIC0gUFdNMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2NDVdID0gMHgwMDgwLCAgICAgLyogUjE2MDUgIC0gUFdNMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2NDZdID0gMHgwMDAwLCAgICAgLyogUjE2MDYgIC0gUFdNMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2NDddID0gMHgwMDgwLCAgICAgLyogUjE2MDcgIC0gUFdNMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2NDhdID0gMHgwMDAwLCAgICAgLyogUjE2MDggIC0gUFdNMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2NDldID0gMHgwMDgwLCAgICAgLyogUjE2MDkgIC0gUFdNMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2NEFdID0gMHgwMDAwLCAgICAgLyogUjE2MTAgIC0gUFdNMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2NEJdID0gMHgwMDgwLCAgICAgLyogUjE2MTEgIC0gUFdNMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2NENdID0gMHgwMDAwLCAgICAgLyogUjE2MTIgIC0gUFdNMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2NERdID0gMHgwMDgwLCAgICAgLyogUjE2MTMgIC0gUFdNMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2NEVdID0gMHgwMDAwLCAgICAgLyogUjE2MTQgIC0gUFdNMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2NEZdID0gMHgwMDgwLCAgICAgLyogUjE2MTUgIC0gUFdNMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2ODBdID0gMHgwMDAwLCAgICAgLyogUjE2NjQgIC0gT1VUMUxNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNjgxXSA9IDB4MDA4MCwgICAgIC8qIFIxNjY1ICAtIE9VVDFMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDY4Ml0gPSAweDAwMDAsICAgICAvKiBSMTY2NiAgLSBPVVQxTE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2ODNdID0gMHgwMDgwLCAgICAgLyogUjE2NjcgIC0gT1VUMUxNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNjg0XSA9IDB4MDAwMCwgICAgIC8qIFIxNjY4ICAtIE9VVDFMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDY4NV0gPSAweDAwODAsICAgICAvKiBSMTY2OSAgLSBPVVQxTE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2ODZdID0gMHgwMDAwLCAgICAgLyogUjE2NzAgIC0gT1VUMUxNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNjg3XSA9IDB4MDA4MCwgICAgIC8qIFIxNjcxICAtIE9VVDFMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDY4OF0gPSAweDAwMDAsICAgICAvKiBSMTY3MiAgLSBPVVQxUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2ODldID0gMHgwMDgwLCAgICAgLyogUjE2NzMgIC0gT1VUMVJNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNjhBXSA9IDB4MDAwMCwgICAgIC8qIFIxNjc0ICAtIE9VVDFSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDY4Ql0gPSAweDAwODAsICAgICAvKiBSMTY3NSAgLSBPVVQxUk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2OENdID0gMHgwMDAwLCAgICAgLyogUjE2NzYgIC0gT1VUMVJNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNjhEXSA9IDB4MDA4MCwgICAgIC8qIFIxNjc3ICAtIE9VVDFSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDY4RV0gPSAweDAwMDAsICAgICAvKiBSMTY3OCAgLSBPVVQxUk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2OEZdID0gMHgwMDgwLCAgICAgLyogUjE2NzkgIC0gT1VUMVJNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNjkwXSA9IDB4MDAwMCwgICAgIC8qIFIxNjgwICAtIE9VVDJMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDY5MV0gPSAweDAwODAsICAgICAvKiBSMTY4MSAgLSBPVVQyTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2OTJdID0gMHgwMDAwLCAgICAgLyogUjE2ODIgIC0gT1VUMkxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNjkzXSA9IDB4MDA4MCwgICAgIC8qIFIxNjgzICAtIE9VVDJMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDY5NF0gPSAweDAwMDAsICAgICAvKiBSMTY4NCAgLSBPVVQyTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2OTVdID0gMHgwMDgwLCAgICAgLyogUjE2ODUgIC0gT1VUMkxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNjk2XSA9IDB4MDAwMCwgICAgIC8qIFIxNjg2ICAtIE9VVDJMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDY5N10gPSAweDAwODAsICAgICAvKiBSMTY4NyAgLSBPVVQyTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2OThdID0gMHgwMDAwLCAgICAgLyogUjE2ODggIC0gT1VUMlJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNjk5XSA9IDB4MDA4MCwgICAgIC8qIFIxNjg5ICAtIE9VVDJSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDY5QV0gPSAweDAwMDAsICAgICAvKiBSMTY5MCAgLSBPVVQyUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2OUJdID0gMHgwMDgwLCAgICAgLyogUjE2OTEgIC0gT1VUMlJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNjlDXSA9IDB4MDAwMCwgICAgIC8qIFIxNjkyICAtIE9VVDJSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDY5RF0gPSAweDAwODAsICAgICAvKiBSMTY5MyAgLSBPVVQyUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2OUVdID0gMHgwMDAwLCAgICAgLyogUjE2OTQgIC0gT1VUMlJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNjlGXSA9IDB4MDA4MCwgICAgIC8qIFIxNjk1ICAtIE9VVDJSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZBMF0gPSAweDAwMDAsICAgICAvKiBSMTY5NiAgLSBPVVQzTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2QTFdID0gMHgwMDgwLCAgICAgLyogUjE2OTcgIC0gT1VUM0xNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkEyXSA9IDB4MDAwMCwgICAgIC8qIFIxNjk4ICAtIE9VVDNMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZBM10gPSAweDAwODAsICAgICAvKiBSMTY5OSAgLSBPVVQzTE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2QTRdID0gMHgwMDAwLCAgICAgLyogUjE3MDAgIC0gT1VUM0xNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkE1XSA9IDB4MDA4MCwgICAgIC8qIFIxNzAxICAtIE9VVDNMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZBNl0gPSAweDAwMDAsICAgICAvKiBSMTcwMiAgLSBPVVQzTE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2QTddID0gMHgwMDgwLCAgICAgLyogUjE3MDMgIC0gT1VUM0xNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkE4XSA9IDB4MDAwMCwgICAgIC8qIFIxNzA0ICAtIE9VVDNSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZBOV0gPSAweDAwODAsICAgICAvKiBSMTcwNSAgLSBPVVQzUk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2QUFdID0gMHgwMDAwLCAgICAgLyogUjE3MDYgIC0gT1VUM1JNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkFCXSA9IDB4MDA4MCwgICAgIC8qIFIxNzA3ICAtIE9VVDNSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZBQ10gPSAweDAwMDAsICAgICAvKiBSMTcwOCAgLSBPVVQzUk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2QURdID0gMHgwMDgwLCAgICAgLyogUjE3MDkgIC0gT1VUM1JNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkFFXSA9IDB4MDAwMCwgICAgIC8qIFIxNzEwICAtIE9VVDNSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZBRl0gPSAweDAwODAsICAgICAvKiBSMTcxMSAgLSBPVVQzUk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2QjBdID0gMHgwMDAwLCAgICAgLyogUjE3MTIgIC0gT1VUNExNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNkIxXSA9IDB4MDA4MCwgICAgIC8qIFIxNzEzICAtIE9VVDRMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDZCMl0gPSAweDAwMDAsICAgICAvKiBSMTcxNCAgLSBPVVQ0TE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2QjNdID0gMHgwMDgwLCAgICAgLyogUjE3MTUgIC0gT1VUNExNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNkI0XSA9IDB4MDAwMCwgICAgIC8qIFIxNzE2ICAtIE9VVDRMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDZCNV0gPSAweDAwODAsICAgICAvKiBSMTcxNyAgLSBPVVQ0TE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2QjZdID0gMHgwMDAwLCAgICAgLyogUjE3MTggIC0gT1VUNExNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNkI3XSA9IDB4MDA4MCwgICAgIC8qIFIxNzE5ICAtIE9VVDRMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZCOF0gPSAweDAwMDAsICAgICAvKiBSMTcyMCAgLSBPVVQ0Uk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2QjldID0gMHgwMDgwLCAgICAgLyogUjE3MjEgIC0gT1VUNFJNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkJBXSA9IDB4MDAwMCwgICAgIC8qIFIxNzIyICAtIE9VVDRSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZCQl0gPSAweDAwODAsICAgICAvKiBSMTcyMyAgLSBPVVQ0Uk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2QkNdID0gMHgwMDAwLCAgICAgLyogUjE3MjQgIC0gT1VUNFJNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkJEXSA9IDB4MDA4MCwgICAgIC8qIFIxNzI1ICAtIE9VVDRSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZCRV0gPSAweDAwMDAsICAgICAvKiBSMTcyNiAgLSBPVVQ0Uk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2QkZdID0gMHgwMDgwLCAgICAgLyogUjE3MjcgIC0gT1VUNFJNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkMwXSA9IDB4MDAwMCwgICAgIC8qIFIxNzI4ICAtIE9VVDVMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZDMV0gPSAweDAwODAsICAgICAvKiBSMTcyOSAgLSBPVVQ1TE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2QzJdID0gMHgwMDAwLCAgICAgLyogUjE3MzAgIC0gT1VUNUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkMzXSA9IDB4MDA4MCwgICAgIC8qIFIxNzMxICAtIE9VVDVMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZDNF0gPSAweDAwMDAsICAgICAvKiBSMTczMiAgLSBPVVQ1TE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2QzVdID0gMHgwMDgwLCAgICAgLyogUjE3MzMgIC0gT1VUNUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkM2XSA9IDB4MDAwMCwgICAgIC8qIFIxNzM0ICAtIE9VVDVMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZDN10gPSAweDAwODAsICAgICAvKiBSMTczNSAgLSBPVVQ1TE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA2QzhdID0gMHgwMDAwLCAgICAgLyogUjE3MzYgIC0gT1VUNVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwNkM5XSA9IDB4MDA4MCwgICAgIC8qIFIxNzM3ICAtIE9VVDVSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDZDQV0gPSAweDAwMDAsICAgICAvKiBSMTczOCAgLSBPVVQ1Uk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA2Q0JdID0gMHgwMDgwLCAgICAgLyogUjE3MzkgIC0gT1VUNVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwNkNDXSA9IDB4MDAwMCwgICAgIC8qIFIxNzQwICAtIE9VVDVSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDZDRF0gPSAweDAwODAsICAgICAvKiBSMTc0MSAgLSBPVVQ1Uk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA2Q0VdID0gMHgwMDAwLCAgICAgLyogUjE3NDIgIC0gT1VUNVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwNkNGXSA9IDB4MDA4MCwgICAgIC8qIFIxNzQzICAtIE9VVDVSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDZEMF0gPSAweDAwMDAsICAgICAvKiBSMTc0NCAgLSBPVVQ2TE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA2RDFdID0gMHgwMDgwLCAgICAgLyogUjE3NDUgIC0gT1VUNkxNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwNkQyXSA9IDB4MDAwMCwgICAgIC8qIFIxNzQ2ICAtIE9VVDZMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDZEM10gPSAweDAwODAsICAgICAvKiBSMTc0NyAgLSBPVVQ2TE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA2RDRdID0gMHgwMDAwLCAgICAgLyogUjE3NDggIC0gT1VUNkxNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwNkQ1XSA9IDB4MDA4MCwgICAgIC8qIFIxNzQ5ICAtIE9VVDZMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDZENl0gPSAweDAwMDAsICAgICAvKiBSMTc1MCAgLSBPVVQ2TE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA2RDddID0gMHgwMDgwLCAgICAgLyogUjE3NTEgIC0gT1VUNkxNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwNkQ4XSA9IDB4MDAwMCwgICAgIC8qIFIxNzUyICAtIE9VVDZSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDZEOV0gPSAweDAwODAsICAgICAvKiBSMTc1MyAgLSBPVVQ2Uk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA2REFdID0gMHgwMDAwLCAgICAgLyogUjE3NTQgIC0gT1VUNlJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwNkRCXSA9IDB4MDA4MCwgICAgIC8qIFIxNzU1ICAtIE9VVDZSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDZEQ10gPSAweDAwMDAsICAgICAvKiBSMTc1NiAgLSBPVVQ2Uk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA2RERdID0gMHgwMDgwLCAgICAgLyogUjE3NTcgIC0gT1VUNlJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwNkRFXSA9IDB4MDAwMCwgICAgIC8qIFIxNzU4ICAtIE9VVDZSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDZERl0gPSAweDAwODAsICAgICAvKiBSMTc1OSAgLSBPVVQ2Uk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MDBdID0gMHgwMDAwLCAgICAgLyogUjE3OTIgIC0gQUlGMVRYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MDFdID0gMHgwMDgwLCAgICAgLyogUjE3OTMgIC0gQUlGMVRYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MDJdID0gMHgwMDAwLCAgICAgLyogUjE3OTQgIC0gQUlGMVRYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MDNdID0gMHgwMDgwLCAgICAgLyogUjE3OTUgIC0gQUlGMVRYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MDRdID0gMHgwMDAwLCAgICAgLyogUjE3OTYgIC0gQUlGMVRYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MDVdID0gMHgwMDgwLCAgICAgLyogUjE3OTcgIC0gQUlGMVRYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MDZdID0gMHgwMDAwLCAgICAgLyogUjE3OTggIC0gQUlGMVRYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MDddID0gMHgwMDgwLCAgICAgLyogUjE3OTkgIC0gQUlGMVRYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MDhdID0gMHgwMDAwLCAgICAgLyogUjE4MDAgIC0gQUlGMVRYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MDldID0gMHgwMDgwLCAgICAgLyogUjE4MDEgIC0gQUlGMVRYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MEFdID0gMHgwMDAwLCAgICAgLyogUjE4MDIgIC0gQUlGMVRYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MEJdID0gMHgwMDgwLCAgICAgLyogUjE4MDMgIC0gQUlGMVRYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MENdID0gMHgwMDAwLCAgICAgLyogUjE4MDQgIC0gQUlGMVRYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MERdID0gMHgwMDgwLCAgICAgLyogUjE4MDUgIC0gQUlGMVRYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MEVdID0gMHgwMDAwLCAgICAgLyogUjE4MDYgIC0gQUlGMVRYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MEZdID0gMHgwMDgwLCAgICAgLyogUjE4MDcgIC0gQUlGMVRYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MTBdID0gMHgwMDAwLCAgICAgLyogUjE4MDggIC0gQUlGMVRYM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MTFdID0gMHgwMDgwLCAgICAgLyogUjE4MDkgIC0gQUlGMVRYM01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MTJdID0gMHgwMDAwLCAgICAgLyogUjE4MTAgIC0gQUlGMVRYM01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MTNdID0gMHgwMDgwLCAgICAgLyogUjE4MTEgIC0gQUlGMVRYM01JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MTRdID0gMHgwMDAwLCAgICAgLyogUjE4MTIgIC0gQUlGMVRYM01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MTVdID0gMHgwMDgwLCAgICAgLyogUjE4MTMgIC0gQUlGMVRYM01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MTZdID0gMHgwMDAwLCAgICAgLyogUjE4MTQgIC0gQUlGMVRYM01JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MTddID0gMHgwMDgwLCAgICAgLyogUjE4MTUgIC0gQUlGMVRYM01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MThdID0gMHgwMDAwLCAgICAgLyogUjE4MTYgIC0gQUlGMVRYNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MTldID0gMHgwMDgwLCAgICAgLyogUjE4MTcgIC0gQUlGMVRYNE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MUFdID0gMHgwMDAwLCAgICAgLyogUjE4MTggIC0gQUlGMVRYNE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MUJdID0gMHgwMDgwLCAgICAgLyogUjE4MTkgIC0gQUlGMVRYNE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MUNdID0gMHgwMDAwLCAgICAgLyogUjE4MjAgIC0gQUlGMVRYNE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MURdID0gMHgwMDgwLCAgICAgLyogUjE4MjEgIC0gQUlGMVRYNE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MUVdID0gMHgwMDAwLCAgICAgLyogUjE4MjIgIC0gQUlGMVRYNE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MUZdID0gMHgwMDgwLCAgICAgLyogUjE4MjMgIC0gQUlGMVRYNE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MjBdID0gMHgwMDAwLCAgICAgLyogUjE4MjQgIC0gQUlGMVRYNU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MjFdID0gMHgwMDgwLCAgICAgLyogUjE4MjUgIC0gQUlGMVRYNU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MjJdID0gMHgwMDAwLCAgICAgLyogUjE4MjYgIC0gQUlGMVRYNU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MjNdID0gMHgwMDgwLCAgICAgLyogUjE4MjcgIC0gQUlGMVRYNU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MjRdID0gMHgwMDAwLCAgICAgLyogUjE4MjggIC0gQUlGMVRYNU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MjVdID0gMHgwMDgwLCAgICAgLyogUjE4MjkgIC0gQUlGMVRYNU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MjZdID0gMHgwMDAwLCAgICAgLyogUjE4MzAgIC0gQUlGMVRYNU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MjddID0gMHgwMDgwLCAgICAgLyogUjE4MzEgIC0gQUlGMVRYNU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MjhdID0gMHgwMDAwLCAgICAgLyogUjE4MzIgIC0gQUlGMVRYNk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MjldID0gMHgwMDgwLCAgICAgLyogUjE4MzMgIC0gQUlGMVRYNk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MkFdID0gMHgwMDAwLCAgICAgLyogUjE4MzQgIC0gQUlGMVRYNk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MkJdID0gMHgwMDgwLCAgICAgLyogUjE4MzUgIC0gQUlGMVRYNk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MkNdID0gMHgwMDAwLCAgICAgLyogUjE4MzYgIC0gQUlGMVRYNk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MkRdID0gMHgwMDgwLCAgICAgLyogUjE4MzcgIC0gQUlGMVRYNk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MkVdID0gMHgwMDAwLCAgICAgLyogUjE4MzggIC0gQUlGMVRYNk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MkZdID0gMHgwMDgwLCAgICAgLyogUjE4MzkgIC0gQUlGMVRYNk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MzBdID0gMHgwMDAwLCAgICAgLyogUjE4NDAgIC0gQUlGMVRYN01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MzFdID0gMHgwMDgwLCAgICAgLyogUjE4NDEgIC0gQUlGMVRYN01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3MzJdID0gMHgwMDAwLCAgICAgLyogUjE4NDIgIC0gQUlGMVRYN01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3MzNdID0gMHgwMDgwLCAgICAgLyogUjE4NDMgIC0gQUlGMVRYN01JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3MzRdID0gMHgwMDAwLCAgICAgLyogUjE4NDQgIC0gQUlGMVRYN01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3MzVdID0gMHgwMDgwLCAgICAgLyogUjE4NDUgIC0gQUlGMVRYN01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3MzZdID0gMHgwMDAwLCAgICAgLyogUjE4NDYgIC0gQUlGMVRYN01JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3MzddID0gMHgwMDgwLCAgICAgLyogUjE4NDcgIC0gQUlGMVRYN01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3MzhdID0gMHgwMDAwLCAgICAgLyogUjE4NDggIC0gQUlGMVRYOE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3MzldID0gMHgwMDgwLCAgICAgLyogUjE4NDkgIC0gQUlGMVRYOE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3M0FdID0gMHgwMDAwLCAgICAgLyogUjE4NTAgIC0gQUlGMVRYOE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3M0JdID0gMHgwMDgwLCAgICAgLyogUjE4NTEgIC0gQUlGMVRYOE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3M0NdID0gMHgwMDAwLCAgICAgLyogUjE4NTIgIC0gQUlGMVRYOE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3M0RdID0gMHgwMDgwLCAgICAgLyogUjE4NTMgIC0gQUlGMVRYOE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3M0VdID0gMHgwMDAwLCAgICAgLyogUjE4NTQgIC0gQUlGMVRYOE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3M0ZdID0gMHgwMDgwLCAgICAgLyogUjE4NTUgIC0gQUlGMVRYOE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3NDBdID0gMHgwMDAwLCAgICAgLyogUjE4NTYgIC0gQUlGMlRYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3NDFdID0gMHgwMDgwLCAgICAgLyogUjE4NTcgIC0gQUlGMlRYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3NDJdID0gMHgwMDAwLCAgICAgLyogUjE4NTggIC0gQUlGMlRYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3NDNdID0gMHgwMDgwLCAgICAgLyogUjE4NTkgIC0gQUlGMlRYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3NDRdID0gMHgwMDAwLCAgICAgLyogUjE4NjAgIC0gQUlGMlRYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3NDVdID0gMHgwMDgwLCAgICAgLyogUjE4NjEgIC0gQUlGMlRYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3NDZdID0gMHgwMDAwLCAgICAgLyogUjE4NjIgIC0gQUlGMlRYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3NDddID0gMHgwMDgwLCAgICAgLyogUjE4NjMgIC0gQUlGMlRYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3NDhdID0gMHgwMDAwLCAgICAgLyogUjE4NjQgIC0gQUlGMlRYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3NDldID0gMHgwMDgwLCAgICAgLyogUjE4NjUgIC0gQUlGMlRYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3NEFdID0gMHgwMDAwLCAgICAgLyogUjE4NjYgIC0gQUlGMlRYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3NEJdID0gMHgwMDgwLCAgICAgLyogUjE4NjcgIC0gQUlGMlRYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3NENdID0gMHgwMDAwLCAgICAgLyogUjE4NjggIC0gQUlGMlRYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3NERdID0gMHgwMDgwLCAgICAgLyogUjE4NjkgIC0gQUlGMlRYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3NEVdID0gMHgwMDAwLCAgICAgLyogUjE4NzAgIC0gQUlGMlRYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3NEZdID0gMHgwMDgwLCAgICAgLyogUjE4NzEgIC0gQUlGMlRYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3ODBdID0gMHgwMDAwLCAgICAgLyogUjE5MjAgIC0gQUlGM1RYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3ODFdID0gMHgwMDgwLCAgICAgLyogUjE5MjEgIC0gQUlGM1RYMU1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3ODJdID0gMHgwMDAwLCAgICAgLyogUjE5MjIgIC0gQUlGM1RYMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3ODNdID0gMHgwMDgwLCAgICAgLyogUjE5MjMgIC0gQUlGM1RYMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3ODRdID0gMHgwMDAwLCAgICAgLyogUjE5MjQgIC0gQUlGM1RYMU1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3ODVdID0gMHgwMDgwLCAgICAgLyogUjE5MjUgIC0gQUlGM1RYMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3ODZdID0gMHgwMDAwLCAgICAgLyogUjE5MjYgIC0gQUlGM1RYMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3ODddID0gMHgwMDgwLCAgICAgLyogUjE5MjcgIC0gQUlGM1RYMU1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA3ODhdID0gMHgwMDAwLCAgICAgLyogUjE5MjggIC0gQUlGM1RYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA3ODldID0gMHgwMDgwLCAgICAgLyogUjE5MjkgIC0gQUlGM1RYMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA3OEFdID0gMHgwMDAwLCAgICAgLyogUjE5MzAgIC0gQUlGM1RYMk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA3OEJdID0gMHgwMDgwLCAgICAgLyogUjE5MzEgIC0gQUlGM1RYMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA3OENdID0gMHgwMDAwLCAgICAgLyogUjE5MzIgIC0gQUlGM1RYMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA3OERdID0gMHgwMDgwLCAgICAgLyogUjE5MzMgIC0gQUlGM1RYMk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA3OEVdID0gMHgwMDAwLCAgICAgLyogUjE5MzQgIC0gQUlGM1RYMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA3OEZdID0gMHgwMDgwLCAgICAgLyogUjE5MzUgIC0gQUlGM1RYMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4ODBdID0gMHgwMDAwLCAgICAgLyogUjIxNzYgIC0gRVExTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDg4MV0gPSAweDAwODAsICAgICAvKiBSMjE3NyAgLSBFUTFNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwODgyXSA9IDB4MDAwMCwgICAgIC8qIFIyMTc4ICAtIEVRMU1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4ODNdID0gMHgwMDgwLCAgICAgLyogUjIxNzkgIC0gRVExTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDg4NF0gPSAweDAwMDAsICAgICAvKiBSMjE4MCAgLSBFUTFNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwODg1XSA9IDB4MDA4MCwgICAgIC8qIFIyMTgxICAtIEVRMU1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4ODZdID0gMHgwMDAwLCAgICAgLyogUjIxODIgIC0gRVExTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDg4N10gPSAweDAwODAsICAgICAvKiBSMjE4MyAgLSBFUTFNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwODg4XSA9IDB4MDAwMCwgICAgIC8qIFIyMTg0ICAtIEVRMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA4ODldID0gMHgwMDgwLCAgICAgLyogUjIxODUgIC0gRVEyTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDg4QV0gPSAweDAwMDAsICAgICAvKiBSMjE4NiAgLSBFUTJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwODhCXSA9IDB4MDA4MCwgICAgIC8qIFIyMTg3ICAtIEVRMk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA4OENdID0gMHgwMDAwLCAgICAgLyogUjIxODggIC0gRVEyTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDg4RF0gPSAweDAwODAsICAgICAvKiBSMjE4OSAgLSBFUTJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwODhFXSA9IDB4MDAwMCwgICAgIC8qIFIyMTkwICAtIEVRMk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA4OEZdID0gMHgwMDgwLCAgICAgLyogUjIxOTEgIC0gRVEyTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDg5MF0gPSAweDAwMDAsICAgICAvKiBSMjE5MiAgLSBFUTNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwODkxXSA9IDB4MDA4MCwgICAgIC8qIFIyMTkzICAtIEVRM01JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA4OTJdID0gMHgwMDAwLCAgICAgLyogUjIxOTQgIC0gRVEzTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDg5M10gPSAweDAwODAsICAgICAvKiBSMjE5NSAgLSBFUTNNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwODk0XSA9IDB4MDAwMCwgICAgIC8qIFIyMTk2ICAtIEVRM01JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA4OTVdID0gMHgwMDgwLCAgICAgLyogUjIxOTcgIC0gRVEzTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDg5Nl0gPSAweDAwMDAsICAgICAvKiBSMjE5OCAgLSBFUTNNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwODk3XSA9IDB4MDA4MCwgICAgIC8qIFIyMTk5ICAtIEVRM01JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4OThdID0gMHgwMDAwLCAgICAgLyogUjIyMDAgIC0gRVE0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDg5OV0gPSAweDAwODAsICAgICAvKiBSMjIwMSAgLSBFUTRNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwODlBXSA9IDB4MDAwMCwgICAgIC8qIFIyMjAyICAtIEVRNE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4OUJdID0gMHgwMDgwLCAgICAgLyogUjIyMDMgIC0gRVE0TUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDg5Q10gPSAweDAwMDAsICAgICAvKiBSMjIwNCAgLSBFUTRNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwODlEXSA9IDB4MDA4MCwgICAgIC8qIFIyMjA1ICAtIEVRNE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4OUVdID0gMHgwMDAwLCAgICAgLyogUjIyMDYgIC0gRVE0TUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDg5Rl0gPSAweDAwODAsICAgICAvKiBSMjIwNyAgLSBFUTRNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOEMwXSA9IDB4MDAwMCwgICAgIC8qIFIyMjQwICAtIERSQzFMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDhDMV0gPSAweDAwODAsICAgICAvKiBSMjI0MSAgLSBEUkMxTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA4QzJdID0gMHgwMDAwLCAgICAgLyogUjIyNDIgIC0gRFJDMUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOEMzXSA9IDB4MDA4MCwgICAgIC8qIFIyMjQzICAtIERSQzFMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDhDNF0gPSAweDAwMDAsICAgICAvKiBSMjI0NCAgLSBEUkMxTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA4QzVdID0gMHgwMDgwLCAgICAgLyogUjIyNDUgIC0gRFJDMUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOEM2XSA9IDB4MDAwMCwgICAgIC8qIFIyMjQ2ICAtIERSQzFMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDhDN10gPSAweDAwODAsICAgICAvKiBSMjI0NyAgLSBEUkMxTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA4QzhdID0gMHgwMDAwLCAgICAgLyogUjIyNDggIC0gRFJDMVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOEM5XSA9IDB4MDA4MCwgICAgIC8qIFIyMjQ5ICAtIERSQzFSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDhDQV0gPSAweDAwMDAsICAgICAvKiBSMjI1MCAgLSBEUkMxUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA4Q0JdID0gMHgwMDgwLCAgICAgLyogUjIyNTEgIC0gRFJDMVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOENDXSA9IDB4MDAwMCwgICAgIC8qIFIyMjUyICAtIERSQzFSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDhDRF0gPSAweDAwODAsICAgICAvKiBSMjI1MyAgLSBEUkMxUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA4Q0VdID0gMHgwMDAwLCAgICAgLyogUjIyNTQgIC0gRFJDMVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOENGXSA9IDB4MDA4MCwgICAgIC8qIFIyMjU1ICAtIERSQzFSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDkwMF0gPSAweDAwMDAsICAgICAvKiBSMjMwNCAgLSBIUExQMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5MDFdID0gMHgwMDgwLCAgICAgLyogUjIzMDUgIC0gSFBMUDFNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTAyXSA9IDB4MDAwMCwgICAgIC8qIFIyMzA2ICAtIEhQTFAxTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDkwM10gPSAweDAwODAsICAgICAvKiBSMjMwNyAgLSBIUExQMU1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5MDRdID0gMHgwMDAwLCAgICAgLyogUjIzMDggIC0gSFBMUDFNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTA1XSA9IDB4MDA4MCwgICAgIC8qIFIyMzA5ICAtIEhQTFAxTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDkwNl0gPSAweDAwMDAsICAgICAvKiBSMjMxMCAgLSBIUExQMU1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5MDddID0gMHgwMDgwLCAgICAgLyogUjIzMTEgIC0gSFBMUDFNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTA4XSA9IDB4MDAwMCwgICAgIC8qIFIyMzEyICAtIEhQTFAyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDkwOV0gPSAweDAwODAsICAgICAvKiBSMjMxMyAgLSBIUExQMk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5MEFdID0gMHgwMDAwLCAgICAgLyogUjIzMTQgIC0gSFBMUDJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOTBCXSA9IDB4MDA4MCwgICAgIC8qIFIyMzE1ICAtIEhQTFAyTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDkwQ10gPSAweDAwMDAsICAgICAvKiBSMjMxNiAgLSBIUExQMk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5MERdID0gMHgwMDgwLCAgICAgLyogUjIzMTcgIC0gSFBMUDJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOTBFXSA9IDB4MDAwMCwgICAgIC8qIFIyMzE4ICAtIEhQTFAyTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDkwRl0gPSAweDAwODAsICAgICAvKiBSMjMxOSAgLSBIUExQMk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5MTBdID0gMHgwMDAwLCAgICAgLyogUjIzMjAgIC0gSFBMUDNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTExXSA9IDB4MDA4MCwgICAgIC8qIFIyMzIxICAtIEhQTFAzTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDkxMl0gPSAweDAwMDAsICAgICAvKiBSMjMyMiAgLSBIUExQM01JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5MTNdID0gMHgwMDgwLCAgICAgLyogUjIzMjMgIC0gSFBMUDNNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOTE0XSA9IDB4MDAwMCwgICAgIC8qIFIyMzI0ICAtIEhQTFAzTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDkxNV0gPSAweDAwODAsICAgICAvKiBSMjMyNSAgLSBIUExQM01JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5MTZdID0gMHgwMDAwLCAgICAgLyogUjIzMjYgIC0gSFBMUDNNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOTE3XSA9IDB4MDA4MCwgICAgIC8qIFIyMzI3ICAtIEhQTFAzTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDkxOF0gPSAweDAwMDAsICAgICAvKiBSMjMyOCAgLSBIUExQNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5MTldID0gMHgwMDgwLCAgICAgLyogUjIzMjkgIC0gSFBMUDRNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTFBXSA9IDB4MDAwMCwgICAgIC8qIFIyMzMwICAtIEhQTFA0TUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDkxQl0gPSAweDAwODAsICAgICAvKiBSMjMzMSAgLSBIUExQNE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5MUNdID0gMHgwMDAwLCAgICAgLyogUjIzMzIgIC0gSFBMUDRNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTFEXSA9IDB4MDA4MCwgICAgIC8qIFIyMzMzICAtIEhQTFA0TUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDkxRV0gPSAweDAwMDAsICAgICAvKiBSMjMzNCAgLSBIUExQNE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5MUZdID0gMHgwMDgwLCAgICAgLyogUjIzMzUgIC0gSFBMUDRNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTQwXSA9IDB4MDAwMCwgICAgIC8qIFIyMzY4ICAtIERTUDFMTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk0MV0gPSAweDAwODAsICAgICAvKiBSMjM2OSAgLSBEU1AxTE1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5NDJdID0gMHgwMDAwLCAgICAgLyogUjIzNzAgIC0gRFNQMUxNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOTQzXSA9IDB4MDA4MCwgICAgIC8qIFIyMzcxICAtIERTUDFMTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDk0NF0gPSAweDAwMDAsICAgICAvKiBSMjM3MiAgLSBEU1AxTE1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5NDVdID0gMHgwMDgwLCAgICAgLyogUjIzNzMgIC0gRFNQMUxNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOTQ2XSA9IDB4MDAwMCwgICAgIC8qIFIyMzc0ICAtIERTUDFMTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDk0N10gPSAweDAwODAsICAgICAvKiBSMjM3NSAgLSBEU1AxTE1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5NDhdID0gMHgwMDAwLCAgICAgLyogUjIzNzYgIC0gRFNQMVJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTQ5XSA9IDB4MDA4MCwgICAgIC8qIFIyMzc3ICAtIERTUDFSTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDk0QV0gPSAweDAwMDAsICAgICAvKiBSMjM3OCAgLSBEU1AxUk1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5NEJdID0gMHgwMDgwLCAgICAgLyogUjIzNzkgIC0gRFNQMVJNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOTRDXSA9IDB4MDAwMCwgICAgIC8qIFIyMzgwICAtIERTUDFSTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDk0RF0gPSAweDAwODAsICAgICAvKiBSMjM4MSAgLSBEU1AxUk1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5NEVdID0gMHgwMDAwLCAgICAgLyogUjIzODIgIC0gRFNQMVJNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOTRGXSA9IDB4MDA4MCwgICAgIC8qIFIyMzgzICAtIERTUDFSTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDk1MF0gPSAweDAwMDAsICAgICAvKiBSMjM4NCAgLSBEU1AxQVVYMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5NThdID0gMHgwMDAwLCAgICAgLyogUjIzOTIgIC0gRFNQMUFVWDJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTYwXSA9IDB4MDAwMCwgICAgIC8qIFIyNDAwICAtIERTUDFBVVgzTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk2OF0gPSAweDAwMDAsICAgICAvKiBSMjQwOCAgLSBEU1AxQVVYNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5NzBdID0gMHgwMDAwLCAgICAgLyogUjI0MTYgIC0gRFNQMUFVWDVNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTc4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDI0ICAtIERTUDFBVVg2TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk4MF0gPSAweDAwMDAsICAgICAvKiBSMjQzMiAgLSBEU1AyTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5ODFdID0gMHgwMDgwLCAgICAgLyogUjI0MzMgIC0gRFNQMkxNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOTgyXSA9IDB4MDAwMCwgICAgIC8qIFIyNDM0ICAtIERTUDJMTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDk4M10gPSAweDAwODAsICAgICAvKiBSMjQzNSAgLSBEU1AyTE1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5ODRdID0gMHgwMDAwLCAgICAgLyogUjI0MzYgIC0gRFNQMkxNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOTg1XSA9IDB4MDA4MCwgICAgIC8qIFIyNDM3ICAtIERTUDJMTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDk4Nl0gPSAweDAwMDAsICAgICAvKiBSMjQzOCAgLSBEU1AyTE1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5ODddID0gMHgwMDgwLCAgICAgLyogUjI0MzkgIC0gRFNQMkxNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOTg4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDQwICAtIERTUDJSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDk4OV0gPSAweDAwODAsICAgICAvKiBSMjQ0MSAgLSBEU1AyUk1JWCBJbnB1dCAxIFZvbHVtZSAqLworCVsweDA5OEFdID0gMHgwMDAwLCAgICAgLyogUjI0NDIgIC0gRFNQMlJNSVggSW5wdXQgMiBTb3VyY2UgKi8KKwlbMHgwOThCXSA9IDB4MDA4MCwgICAgIC8qIFIyNDQzICAtIERTUDJSTUlYIElucHV0IDIgVm9sdW1lICovCisJWzB4MDk4Q10gPSAweDAwMDAsICAgICAvKiBSMjQ0NCAgLSBEU1AyUk1JWCBJbnB1dCAzIFNvdXJjZSAqLworCVsweDA5OERdID0gMHgwMDgwLCAgICAgLyogUjI0NDUgIC0gRFNQMlJNSVggSW5wdXQgMyBWb2x1bWUgKi8KKwlbMHgwOThFXSA9IDB4MDAwMCwgICAgIC8qIFIyNDQ2ICAtIERTUDJSTUlYIElucHV0IDQgU291cmNlICovCisJWzB4MDk4Rl0gPSAweDAwODAsICAgICAvKiBSMjQ0NyAgLSBEU1AyUk1JWCBJbnB1dCA0IFZvbHVtZSAqLworCVsweDA5OTBdID0gMHgwMDAwLCAgICAgLyogUjI0NDggIC0gRFNQMkFVWDFNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOTk4XSA9IDB4MDAwMCwgICAgIC8qIFIyNDU2ICAtIERTUDJBVVgyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlBMF0gPSAweDAwMDAsICAgICAvKiBSMjQ2NCAgLSBEU1AyQVVYM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QThdID0gMHgwMDAwLCAgICAgLyogUjI0NzIgIC0gRFNQMkFVWDRNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUIwXSA9IDB4MDAwMCwgICAgIC8qIFIyNDgwICAtIERTUDJBVVg1TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlCOF0gPSAweDAwMDAsICAgICAvKiBSMjQ4OCAgLSBEU1AyQVVYNk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QzBdID0gMHgwMDAwLCAgICAgLyogUjI0OTYgIC0gRFNQM0xNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUMxXSA9IDB4MDA4MCwgICAgIC8qIFIyNDk3ICAtIERTUDNMTUlYIElucHV0IDEgVm9sdW1lICovCisJWzB4MDlDMl0gPSAweDAwMDAsICAgICAvKiBSMjQ5OCAgLSBEU1AzTE1JWCBJbnB1dCAyIFNvdXJjZSAqLworCVsweDA5QzNdID0gMHgwMDgwLCAgICAgLyogUjI0OTkgIC0gRFNQM0xNSVggSW5wdXQgMiBWb2x1bWUgKi8KKwlbMHgwOUM0XSA9IDB4MDAwMCwgICAgIC8qIFIyNTAwICAtIERTUDNMTUlYIElucHV0IDMgU291cmNlICovCisJWzB4MDlDNV0gPSAweDAwODAsICAgICAvKiBSMjUwMSAgLSBEU1AzTE1JWCBJbnB1dCAzIFZvbHVtZSAqLworCVsweDA5QzZdID0gMHgwMDAwLCAgICAgLyogUjI1MDIgIC0gRFNQM0xNSVggSW5wdXQgNCBTb3VyY2UgKi8KKwlbMHgwOUM3XSA9IDB4MDA4MCwgICAgIC8qIFIyNTAzICAtIERTUDNMTUlYIElucHV0IDQgVm9sdW1lICovCisJWzB4MDlDOF0gPSAweDAwMDAsICAgICAvKiBSMjUwNCAgLSBEU1AzUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5QzldID0gMHgwMDgwLCAgICAgLyogUjI1MDUgIC0gRFNQM1JNSVggSW5wdXQgMSBWb2x1bWUgKi8KKwlbMHgwOUNBXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA2ICAtIERTUDNSTUlYIElucHV0IDIgU291cmNlICovCisJWzB4MDlDQl0gPSAweDAwODAsICAgICAvKiBSMjUwNyAgLSBEU1AzUk1JWCBJbnB1dCAyIFZvbHVtZSAqLworCVsweDA5Q0NdID0gMHgwMDAwLCAgICAgLyogUjI1MDggIC0gRFNQM1JNSVggSW5wdXQgMyBTb3VyY2UgKi8KKwlbMHgwOUNEXSA9IDB4MDA4MCwgICAgIC8qIFIyNTA5ICAtIERTUDNSTUlYIElucHV0IDMgVm9sdW1lICovCisJWzB4MDlDRV0gPSAweDAwMDAsICAgICAvKiBSMjUxMCAgLSBEU1AzUk1JWCBJbnB1dCA0IFNvdXJjZSAqLworCVsweDA5Q0ZdID0gMHgwMDgwLCAgICAgLyogUjI1MTEgIC0gRFNQM1JNSVggSW5wdXQgNCBWb2x1bWUgKi8KKwlbMHgwOUQwXSA9IDB4MDAwMCwgICAgIC8qIFIyNTEyICAtIERTUDNBVVgxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlEOF0gPSAweDAwMDAsICAgICAvKiBSMjUyMCAgLSBEU1AzQVVYMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5RTBdID0gMHgwMDAwLCAgICAgLyogUjI1MjggIC0gRFNQM0FVWDNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwOUU4XSA9IDB4MDAwMCwgICAgIC8qIFIyNTM2ICAtIERTUDNBVVg0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MDlGMF0gPSAweDAwMDAsICAgICAvKiBSMjU0NCAgLSBEU1AzQVVYNU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDA5RjhdID0gMHgwMDAwLCAgICAgLyogUjI1NTIgIC0gRFNQM0FVWDZNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQTgwXSA9IDB4MDAwMCwgICAgIC8qIFIyNjg4ICAtIEFTUkMxTE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBBODhdID0gMHgwMDAwLCAgICAgLyogUjI2OTYgIC0gQVNSQzFSTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEE5MF0gPSAweDAwMDAsICAgICAvKiBSMjcwNCAgLSBBU1JDMkxNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQTk4XSA9IDB4MDAwMCwgICAgIC8qIFIyNzEyICAtIEFTUkMyUk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMDBdID0gMHgwMDAwLCAgICAgLyogUjI4MTYgIC0gSVNSQzFERUMxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIwOF0gPSAweDAwMDAsICAgICAvKiBSMjgyNCAgLSBJU1JDMURFQzJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjEwXSA9IDB4MDAwMCwgICAgIC8qIFIyODMyICAtIElTUkMxREVDM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMThdID0gMHgwMDAwLCAgICAgLyogUjI4NDAgIC0gSVNSQzFERUM0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIyMF0gPSAweDAwMDAsICAgICAvKiBSMjg0OCAgLSBJU1JDMUlOVDFNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjI4XSA9IDB4MDAwMCwgICAgIC8qIFIyODU2ICAtIElTUkMxSU5UMk1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCMzBdID0gMHgwMDAwLCAgICAgLyogUjI4NjQgIC0gSVNSQzFJTlQzTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEIzOF0gPSAweDAwMDAsICAgICAvKiBSMjg3MiAgLSBJU1JDMUlOVDRNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjQwXSA9IDB4MDAwMCwgICAgIC8qIFIyODgwICAtIElTUkMyREVDMU1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNDhdID0gMHgwMDAwLCAgICAgLyogUjI4ODggIC0gSVNSQzJERUMyTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEI1MF0gPSAweDAwMDAsICAgICAvKiBSMjg5NiAgLSBJU1JDMkRFQzNNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjU4XSA9IDB4MDAwMCwgICAgIC8qIFIyOTA0ICAtIElTUkMyREVDNE1JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNjBdID0gMHgwMDAwLCAgICAgLyogUjI5MTIgIC0gSVNSQzJJTlQxTUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEI2OF0gPSAweDAwMDAsICAgICAvKiBSMjkyMCAgLSBJU1JDMklOVDJNSVggSW5wdXQgMSBTb3VyY2UgKi8KKwlbMHgwQjcwXSA9IDB4MDAwMCwgICAgIC8qIFIyOTI4ICAtIElTUkMySU5UM01JWCBJbnB1dCAxIFNvdXJjZSAqLworCVsweDBCNzhdID0gMHgwMDAwLCAgICAgLyogUjI5MzYgIC0gSVNSQzJJTlQ0TUlYIElucHV0IDEgU291cmNlICovCisJWzB4MEMwMF0gPSAweEEwMDEsICAgICAvKiBSMzA3MiAgLSBHUElPIENUUkwgMSAqLworCVsweDBDMDFdID0gMHhBMDAxLCAgICAgLyogUjMwNzMgIC0gR1BJTyBDVFJMIDIgKi8KKwlbMHgwQzAyXSA9IDB4QTAwMSwgICAgIC8qIFIzMDc0ICAtIEdQSU8gQ1RSTCAzICovCisJWzB4MEMwM10gPSAweEEwMDEsICAgICAvKiBSMzA3NSAgLSBHUElPIENUUkwgNCAqLworCVsweDBDMDRdID0gMHhBMDAxLCAgICAgLyogUjMwNzYgIC0gR1BJTyBDVFJMIDUgKi8KKwlbMHgwQzA1XSA9IDB4QTAwMSwgICAgIC8qIFIzMDc3ICAtIEdQSU8gQ1RSTCA2ICovCisJWzB4MEMyM10gPSAweDQwMDMsICAgICAvKiBSMzEwNyAgLSBNaXNjIFBhZCBDdHJsIDEgKi8KKwlbMHgwQzI0XSA9IDB4MDAwMCwgICAgIC8qIFIzMTA4ICAtIE1pc2MgUGFkIEN0cmwgMiAqLworCVsweDBDMjVdID0gMHgwMDAwLCAgICAgLyogUjMxMDkgIC0gTWlzYyBQYWQgQ3RybCAzICovCisJWzB4MEMyNl0gPSAweDAwMDAsICAgICAvKiBSMzExMCAgLSBNaXNjIFBhZCBDdHJsIDQgKi8KKwlbMHgwQzI3XSA9IDB4MDAwMCwgICAgIC8qIFIzMTExICAtIE1pc2MgUGFkIEN0cmwgNSAqLworCVsweDBDMjhdID0gMHgwMDAwLCAgICAgLyogUjMxMTIgIC0gTWlzYyBHUElPIDEgKi8KKwlbMHgwRDAwXSA9IDB4MDAwMCwgICAgIC8qIFIzMzI4ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCVsweDBEMDFdID0gMHgwMDAwLCAgICAgLyogUjMzMjkgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJWzB4MEQwMl0gPSAweDAwMDAsICAgICAvKiBSMzMzMCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDMgKi8KKwlbMHgwRDAzXSA9IDB4MDAwMCwgICAgIC8qIFIzMzMxICAtIEludGVycnVwdCBTdGF0dXMgNCAqLworCVsweDBEMDRdID0gMHgwMDAwLCAgICAgLyogUjMzMzIgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgMiAqLworCVsweDBEMDVdID0gMHgwMDAwLCAgICAgLyogUjMzMzMgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgMyAqLworCVsweDBEMDZdID0gMHgwMDAwLCAgICAgLyogUjMzMzQgIC0gSW50ZXJydXB0IFJhdyBTdGF0dXMgNCAqLworCVsweDBEMDddID0gMHhGRkZGLCAgICAgLyogUjMzMzUgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwlbMHgwRDA4XSA9IDB4RkZGRiwgICAgIC8qIFIzMzM2ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJWzB4MEQwOV0gPSAweEZGRkYsICAgICAvKiBSMzMzNyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDMgTWFzayAqLworCVsweDBEMEFdID0gMHhGRkZGLCAgICAgLyogUjMzMzggIC0gSW50ZXJydXB0IFN0YXR1cyA0IE1hc2sgKi8KKwlbMHgwRDFGXSA9IDB4MDAwMCwgICAgIC8qIFIzMzU5ICAtIEludGVycnVwdCBDb250cm9sICovCisJWzB4MEQyMF0gPSAweEZGRkYsICAgICAvKiBSMzM2MCAgLSBJUlEgRGVib3VuY2UgMSAqLworCVsweDBEMjFdID0gMHhGRkZGLCAgICAgLyogUjMzNjEgIC0gSVJRIERlYm91bmNlIDIgKi8KKwlbMHgwRTAwXSA9IDB4MDAwMCwgICAgIC8qIFIzNTg0ICAtIEZYX0N0cmwgKi8KKwlbMHgwRTEwXSA9IDB4NjMxOCwgICAgIC8qIFIzNjAwICAtIEVRMV8xICovCisJWzB4MEUxMV0gPSAweDYzMDAsICAgICAvKiBSMzYwMSAgLSBFUTFfMiAqLworCVsweDBFMTJdID0gMHgwRkM4LCAgICAgLyogUjM2MDIgIC0gRVExXzMgKi8KKwlbMHgwRTEzXSA9IDB4MDNGRSwgICAgIC8qIFIzNjAzICAtIEVRMV80ICovCisJWzB4MEUxNF0gPSAweDAwRTAsICAgICAvKiBSMzYwNCAgLSBFUTFfNSAqLworCVsweDBFMTVdID0gMHgxRUM0LCAgICAgLyogUjM2MDUgIC0gRVExXzYgKi8KKwlbMHgwRTE2XSA9IDB4RjEzNiwgICAgIC8qIFIzNjA2ICAtIEVRMV83ICovCisJWzB4MEUxN10gPSAweDA0MDksICAgICAvKiBSMzYwNyAgLSBFUTFfOCAqLworCVsweDBFMThdID0gMHgwNENDLCAgICAgLyogUjM2MDggIC0gRVExXzkgKi8KKwlbMHgwRTE5XSA9IDB4MUM5QiwgICAgIC8qIFIzNjA5ICAtIEVRMV8xMCAqLworCVsweDBFMUFdID0gMHhGMzM3LCAgICAgLyogUjM2MTAgIC0gRVExXzExICovCisJWzB4MEUxQl0gPSAweDA0MEIsICAgICAvKiBSMzYxMSAgLSBFUTFfMTIgKi8KKwlbMHgwRTFDXSA9IDB4MENCQiwgICAgIC8qIFIzNjEyICAtIEVRMV8xMyAqLworCVsweDBFMURdID0gMHgxNkY4LCAgICAgLyogUjM2MTMgIC0gRVExXzE0ICovCisJWzB4MEUxRV0gPSAweEY3RDksICAgICAvKiBSMzYxNCAgLSBFUTFfMTUgKi8KKwlbMHgwRTFGXSA9IDB4MDQwQSwgICAgIC8qIFIzNjE1ICAtIEVRMV8xNiAqLworCVsweDBFMjBdID0gMHgxRjE0LCAgICAgLyogUjM2MTYgIC0gRVExXzE3ICovCisJWzB4MEUyMV0gPSAweDA1OEMsICAgICAvKiBSMzYxNyAgLSBFUTFfMTggKi8KKwlbMHgwRTIyXSA9IDB4MDU2MywgICAgIC8qIFIzNjE4ICAtIEVRMV8xOSAqLworCVsweDBFMjNdID0gMHg0MDAwLCAgICAgLyogUjM2MTkgIC0gRVExXzIwICovCisJWzB4MEUyNl0gPSAweDYzMTgsICAgICAvKiBSMzYyMiAgLSBFUTJfMSAqLworCVsweDBFMjddID0gMHg2MzAwLCAgICAgLyogUjM2MjMgIC0gRVEyXzIgKi8KKwlbMHgwRTI4XSA9IDB4MEZDOCwgICAgIC8qIFIzNjI0ICAtIEVRMl8zICovCisJWzB4MEUyOV0gPSAweDAzRkUsICAgICAvKiBSMzYyNSAgLSBFUTJfNCAqLworCVsweDBFMkFdID0gMHgwMEUwLCAgICAgLyogUjM2MjYgIC0gRVEyXzUgKi8KKwlbMHgwRTJCXSA9IDB4MUVDNCwgICAgIC8qIFIzNjI3ICAtIEVRMl82ICovCisJWzB4MEUyQ10gPSAweEYxMzYsICAgICAvKiBSMzYyOCAgLSBFUTJfNyAqLworCVsweDBFMkRdID0gMHgwNDA5LCAgICAgLyogUjM2MjkgIC0gRVEyXzggKi8KKwlbMHgwRTJFXSA9IDB4MDRDQywgICAgIC8qIFIzNjMwICAtIEVRMl85ICovCisJWzB4MEUyRl0gPSAweDFDOUIsICAgICAvKiBSMzYzMSAgLSBFUTJfMTAgKi8KKwlbMHgwRTMwXSA9IDB4RjMzNywgICAgIC8qIFIzNjMyICAtIEVRMl8xMSAqLworCVsweDBFMzFdID0gMHgwNDBCLCAgICAgLyogUjM2MzMgIC0gRVEyXzEyICovCisJWzB4MEUzMl0gPSAweDBDQkIsICAgICAvKiBSMzYzNCAgLSBFUTJfMTMgKi8KKwlbMHgwRTMzXSA9IDB4MTZGOCwgICAgIC8qIFIzNjM1ICAtIEVRMl8xNCAqLworCVsweDBFMzRdID0gMHhGN0Q5LCAgICAgLyogUjM2MzYgIC0gRVEyXzE1ICovCisJWzB4MEUzNV0gPSAweDA0MEEsICAgICAvKiBSMzYzNyAgLSBFUTJfMTYgKi8KKwlbMHgwRTM2XSA9IDB4MUYxNCwgICAgIC8qIFIzNjM4ICAtIEVRMl8xNyAqLworCVsweDBFMzddID0gMHgwNThDLCAgICAgLyogUjM2MzkgIC0gRVEyXzE4ICovCisJWzB4MEUzOF0gPSAweDA1NjMsICAgICAvKiBSMzY0MCAgLSBFUTJfMTkgKi8KKwlbMHgwRTM5XSA9IDB4NDAwMCwgICAgIC8qIFIzNjQxICAtIEVRMl8yMCAqLworCVsweDBFM0NdID0gMHg2MzE4LCAgICAgLyogUjM2NDQgIC0gRVEzXzEgKi8KKwlbMHgwRTNEXSA9IDB4NjMwMCwgICAgIC8qIFIzNjQ1ICAtIEVRM18yICovCisJWzB4MEUzRV0gPSAweDBGQzgsICAgICAvKiBSMzY0NiAgLSBFUTNfMyAqLworCVsweDBFM0ZdID0gMHgwM0ZFLCAgICAgLyogUjM2NDcgIC0gRVEzXzQgKi8KKwlbMHgwRTQwXSA9IDB4MDBFMCwgICAgIC8qIFIzNjQ4ICAtIEVRM181ICovCisJWzB4MEU0MV0gPSAweDFFQzQsICAgICAvKiBSMzY0OSAgLSBFUTNfNiAqLworCVsweDBFNDJdID0gMHhGMTM2LCAgICAgLyogUjM2NTAgIC0gRVEzXzcgKi8KKwlbMHgwRTQzXSA9IDB4MDQwOSwgICAgIC8qIFIzNjUxICAtIEVRM184ICovCisJWzB4MEU0NF0gPSAweDA0Q0MsICAgICAvKiBSMzY1MiAgLSBFUTNfOSAqLworCVsweDBFNDVdID0gMHgxQzlCLCAgICAgLyogUjM2NTMgIC0gRVEzXzEwICovCisJWzB4MEU0Nl0gPSAweEYzMzcsICAgICAvKiBSMzY1NCAgLSBFUTNfMTEgKi8KKwlbMHgwRTQ3XSA9IDB4MDQwQiwgICAgIC8qIFIzNjU1ICAtIEVRM18xMiAqLworCVsweDBFNDhdID0gMHgwQ0JCLCAgICAgLyogUjM2NTYgIC0gRVEzXzEzICovCisJWzB4MEU0OV0gPSAweDE2RjgsICAgICAvKiBSMzY1NyAgLSBFUTNfMTQgKi8KKwlbMHgwRTRBXSA9IDB4RjdEOSwgICAgIC8qIFIzNjU4ICAtIEVRM18xNSAqLworCVsweDBFNEJdID0gMHgwNDBBLCAgICAgLyogUjM2NTkgIC0gRVEzXzE2ICovCisJWzB4MEU0Q10gPSAweDFGMTQsICAgICAvKiBSMzY2MCAgLSBFUTNfMTcgKi8KKwlbMHgwRTREXSA9IDB4MDU4QywgICAgIC8qIFIzNjYxICAtIEVRM18xOCAqLworCVsweDBFNEVdID0gMHgwNTYzLCAgICAgLyogUjM2NjIgIC0gRVEzXzE5ICovCisJWzB4MEU0Rl0gPSAweDQwMDAsICAgICAvKiBSMzY2MyAgLSBFUTNfMjAgKi8KKwlbMHgwRTUyXSA9IDB4NjMxOCwgICAgIC8qIFIzNjY2ICAtIEVRNF8xICovCisJWzB4MEU1M10gPSAweDYzMDAsICAgICAvKiBSMzY2NyAgLSBFUTRfMiAqLworCVsweDBFNTRdID0gMHgwRkM4LCAgICAgLyogUjM2NjggIC0gRVE0XzMgKi8KKwlbMHgwRTU1XSA9IDB4MDNGRSwgICAgIC8qIFIzNjY5ICAtIEVRNF80ICovCisJWzB4MEU1Nl0gPSAweDAwRTAsICAgICAvKiBSMzY3MCAgLSBFUTRfNSAqLworCVsweDBFNTddID0gMHgxRUM0LCAgICAgLyogUjM2NzEgIC0gRVE0XzYgKi8KKwlbMHgwRTU4XSA9IDB4RjEzNiwgICAgIC8qIFIzNjcyICAtIEVRNF83ICovCisJWzB4MEU1OV0gPSAweDA0MDksICAgICAvKiBSMzY3MyAgLSBFUTRfOCAqLworCVsweDBFNUFdID0gMHgwNENDLCAgICAgLyogUjM2NzQgIC0gRVE0XzkgKi8KKwlbMHgwRTVCXSA9IDB4MUM5QiwgICAgIC8qIFIzNjc1ICAtIEVRNF8xMCAqLworCVsweDBFNUNdID0gMHhGMzM3LCAgICAgLyogUjM2NzYgIC0gRVE0XzExICovCisJWzB4MEU1RF0gPSAweDA0MEIsICAgICAvKiBSMzY3NyAgLSBFUTRfMTIgKi8KKwlbMHgwRTVFXSA9IDB4MENCQiwgICAgIC8qIFIzNjc4ICAtIEVRNF8xMyAqLworCVsweDBFNUZdID0gMHgxNkY4LCAgICAgLyogUjM2NzkgIC0gRVE0XzE0ICovCisJWzB4MEU2MF0gPSAweEY3RDksICAgICAvKiBSMzY4MCAgLSBFUTRfMTUgKi8KKwlbMHgwRTYxXSA9IDB4MDQwQSwgICAgIC8qIFIzNjgxICAtIEVRNF8xNiAqLworCVsweDBFNjJdID0gMHgxRjE0LCAgICAgLyogUjM2ODIgIC0gRVE0XzE3ICovCisJWzB4MEU2M10gPSAweDA1OEMsICAgICAvKiBSMzY4MyAgLSBFUTRfMTggKi8KKwlbMHgwRTY0XSA9IDB4MDU2MywgICAgIC8qIFIzNjg0ICAtIEVRNF8xOSAqLworCVsweDBFNjVdID0gMHg0MDAwLCAgICAgLyogUjM2ODUgIC0gRVE0XzIwICovCisJWzB4MEU4MF0gPSAweDAwMTgsICAgICAvKiBSMzcxMiAgLSBEUkMxIGN0cmwxICovCisJWzB4MEU4MV0gPSAweDA5MzMsICAgICAvKiBSMzcxMyAgLSBEUkMxIGN0cmwyICovCisJWzB4MEU4Ml0gPSAweDAwMTgsICAgICAvKiBSMzcxNCAgLSBEUkMxIGN0cmwzICovCisJWzB4MEU4M10gPSAweDAwMDAsICAgICAvKiBSMzcxNSAgLSBEUkMxIGN0cmw0ICovCisJWzB4MEU4NF0gPSAweDAwMDAsICAgICAvKiBSMzcxNiAgLSBEUkMxIGN0cmw1ICovCisJWzB4MEVDMF0gPSAweDAwMDAsICAgICAvKiBSMzc3NiAgLSBIUExQRjFfMSAqLworCVsweDBFQzFdID0gMHgwMDAwLCAgICAgLyogUjM3NzcgIC0gSFBMUEYxXzIgKi8KKwlbMHgwRUM0XSA9IDB4MDAwMCwgICAgIC8qIFIzNzgwICAtIEhQTFBGMl8xICovCisJWzB4MEVDNV0gPSAweDAwMDAsICAgICAvKiBSMzc4MSAgLSBIUExQRjJfMiAqLworCVsweDBFQzhdID0gMHgwMDAwLCAgICAgLyogUjM3ODQgIC0gSFBMUEYzXzEgKi8KKwlbMHgwRUM5XSA9IDB4MDAwMCwgICAgIC8qIFIzNzg1ICAtIEhQTFBGM18yICovCisJWzB4MEVDQ10gPSAweDAwMDAsICAgICAvKiBSMzc4OCAgLSBIUExQRjRfMSAqLworCVsweDBFQ0RdID0gMHgwMDAwLCAgICAgLyogUjM3ODkgIC0gSFBMUEY0XzIgKi8KKwlbMHg0MDAwXSA9IDB4MDAwMCwgICAgIC8qIFIxNjM4NCAtIERTUDEgRE0gMCAqLworCVsweDQwMDFdID0gMHgwMDAwLCAgICAgLyogUjE2Mzg1IC0gRFNQMSBETSAxICovCisJWzB4NDAwMl0gPSAweDAwMDAsICAgICAvKiBSMTYzODYgLSBEU1AxIERNIDIgKi8KKwlbMHg0MDAzXSA9IDB4MDAwMCwgICAgIC8qIFIxNjM4NyAtIERTUDEgRE0gMyAqLworCVsweDQxRkNdID0gMHgwMDAwLCAgICAgLyogUjE2ODkyIC0gRFNQMSBETSA1MDggKi8KKwlbMHg0MUZEXSA9IDB4MDAwMCwgICAgIC8qIFIxNjg5MyAtIERTUDEgRE0gNTA5ICovCisJWzB4NDFGRV0gPSAweDAwMDAsICAgICAvKiBSMTY4OTQgLSBEU1AxIERNIDUxMCAqLworCVsweDQxRkZdID0gMHgwMDAwLCAgICAgLyogUjE2ODk1IC0gRFNQMSBETSA1MTEgKi8KKwlbMHg0ODAwXSA9IDB4MDAwMCwgICAgIC8qIFIxODQzMiAtIERTUDEgUE0gMCAqLworCVsweDQ4MDFdID0gMHgwMDAwLCAgICAgLyogUjE4NDMzIC0gRFNQMSBQTSAxICovCisJWzB4NDgwMl0gPSAweDAwMDAsICAgICAvKiBSMTg0MzQgLSBEU1AxIFBNIDIgKi8KKwlbMHg0ODAzXSA9IDB4MDAwMCwgICAgIC8qIFIxODQzNSAtIERTUDEgUE0gMyAqLworCVsweDQ4MDRdID0gMHgwMDAwLCAgICAgLyogUjE4NDM2IC0gRFNQMSBQTSA0ICovCisJWzB4NDgwNV0gPSAweDAwMDAsICAgICAvKiBSMTg0MzcgLSBEU1AxIFBNIDUgKi8KKwlbMHg0REZBXSA9IDB4MDAwMCwgICAgIC8qIFIxOTk2MiAtIERTUDEgUE0gMTUzMCAqLworCVsweDRERkJdID0gMHgwMDAwLCAgICAgLyogUjE5OTYzIC0gRFNQMSBQTSAxNTMxICovCisJWzB4NERGQ10gPSAweDAwMDAsICAgICAvKiBSMTk5NjQgLSBEU1AxIFBNIDE1MzIgKi8KKwlbMHg0REZEXSA9IDB4MDAwMCwgICAgIC8qIFIxOTk2NSAtIERTUDEgUE0gMTUzMyAqLworCVsweDRERkVdID0gMHgwMDAwLCAgICAgLyogUjE5OTY2IC0gRFNQMSBQTSAxNTM0ICovCisJWzB4NERGRl0gPSAweDAwMDAsICAgICAvKiBSMTk5NjcgLSBEU1AxIFBNIDE1MzUgKi8KKwlbMHg1MDAwXSA9IDB4MDAwMCwgICAgIC8qIFIyMDQ4MCAtIERTUDEgWk0gMCAqLworCVsweDUwMDFdID0gMHgwMDAwLCAgICAgLyogUjIwNDgxIC0gRFNQMSBaTSAxICovCisJWzB4NTAwMl0gPSAweDAwMDAsICAgICAvKiBSMjA0ODIgLSBEU1AxIFpNIDIgKi8KKwlbMHg1MDAzXSA9IDB4MDAwMCwgICAgIC8qIFIyMDQ4MyAtIERTUDEgWk0gMyAqLworCVsweDU3RkNdID0gMHgwMDAwLCAgICAgLyogUjIyNTI0IC0gRFNQMSBaTSAyMDQ0ICovCisJWzB4NTdGRF0gPSAweDAwMDAsICAgICAvKiBSMjI1MjUgLSBEU1AxIFpNIDIwNDUgKi8KKwlbMHg1N0ZFXSA9IDB4MDAwMCwgICAgIC8qIFIyMjUyNiAtIERTUDEgWk0gMjA0NiAqLworCVsweDU3RkZdID0gMHgwMDAwLCAgICAgLyogUjIyNTI3IC0gRFNQMSBaTSAyMDQ3ICovCisJWzB4NjAwMF0gPSAweDAwMDAsICAgICAvKiBSMjQ1NzYgLSBEU1AyIERNIDAgKi8KKwlbMHg2MDAxXSA9IDB4MDAwMCwgICAgIC8qIFIyNDU3NyAtIERTUDIgRE0gMSAqLworCVsweDYwMDJdID0gMHgwMDAwLCAgICAgLyogUjI0NTc4IC0gRFNQMiBETSAyICovCisJWzB4NjAwM10gPSAweDAwMDAsICAgICAvKiBSMjQ1NzkgLSBEU1AyIERNIDMgKi8KKwlbMHg2MUZDXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA4NCAtIERTUDIgRE0gNTA4ICovCisJWzB4NjFGRF0gPSAweDAwMDAsICAgICAvKiBSMjUwODUgLSBEU1AyIERNIDUwOSAqLworCVsweDYxRkVdID0gMHgwMDAwLCAgICAgLyogUjI1MDg2IC0gRFNQMiBETSA1MTAgKi8KKwlbMHg2MUZGXSA9IDB4MDAwMCwgICAgIC8qIFIyNTA4NyAtIERTUDIgRE0gNTExICovCisJWzB4NjgwMF0gPSAweDAwMDAsICAgICAvKiBSMjY2MjQgLSBEU1AyIFBNIDAgKi8KKwlbMHg2ODAxXSA9IDB4MDAwMCwgICAgIC8qIFIyNjYyNSAtIERTUDIgUE0gMSAqLworCVsweDY4MDJdID0gMHgwMDAwLCAgICAgLyogUjI2NjI2IC0gRFNQMiBQTSAyICovCisJWzB4NjgwM10gPSAweDAwMDAsICAgICAvKiBSMjY2MjcgLSBEU1AyIFBNIDMgKi8KKwlbMHg2ODA0XSA9IDB4MDAwMCwgICAgIC8qIFIyNjYyOCAtIERTUDIgUE0gNCAqLworCVsweDY4MDVdID0gMHgwMDAwLCAgICAgLyogUjI2NjI5IC0gRFNQMiBQTSA1ICovCisJWzB4NkRGQV0gPSAweDAwMDAsICAgICAvKiBSMjgxNTQgLSBEU1AyIFBNIDE1MzAgKi8KKwlbMHg2REZCXSA9IDB4MDAwMCwgICAgIC8qIFIyODE1NSAtIERTUDIgUE0gMTUzMSAqLworCVsweDZERkNdID0gMHgwMDAwLCAgICAgLyogUjI4MTU2IC0gRFNQMiBQTSAxNTMyICovCisJWzB4NkRGRF0gPSAweDAwMDAsICAgICAvKiBSMjgxNTcgLSBEU1AyIFBNIDE1MzMgKi8KKwlbMHg2REZFXSA9IDB4MDAwMCwgICAgIC8qIFIyODE1OCAtIERTUDIgUE0gMTUzNCAqLworCVsweDZERkZdID0gMHgwMDAwLCAgICAgLyogUjI4MTU5IC0gRFNQMiBQTSAxNTM1ICovCisJWzB4NzAwMF0gPSAweDAwMDAsICAgICAvKiBSMjg2NzIgLSBEU1AyIFpNIDAgKi8KKwlbMHg3MDAxXSA9IDB4MDAwMCwgICAgIC8qIFIyODY3MyAtIERTUDIgWk0gMSAqLworCVsweDcwMDJdID0gMHgwMDAwLCAgICAgLyogUjI4Njc0IC0gRFNQMiBaTSAyICovCisJWzB4NzAwM10gPSAweDAwMDAsICAgICAvKiBSMjg2NzUgLSBEU1AyIFpNIDMgKi8KKwlbMHg3N0ZDXSA9IDB4MDAwMCwgICAgIC8qIFIzMDcxNiAtIERTUDIgWk0gMjA0NCAqLworCVsweDc3RkRdID0gMHgwMDAwLCAgICAgLyogUjMwNzE3IC0gRFNQMiBaTSAyMDQ1ICovCisJWzB4NzdGRV0gPSAweDAwMDAsICAgICAvKiBSMzA3MTggLSBEU1AyIFpNIDIwNDYgKi8KKwlbMHg3N0ZGXSA9IDB4MDAwMCwgICAgIC8qIFIzMDcxOSAtIERTUDIgWk0gMjA0NyAqLworCVsweDgwMDBdID0gMHgwMDAwLCAgICAgLyogUjMyNzY4IC0gRFNQMyBETSAwICovCisJWzB4ODAwMV0gPSAweDAwMDAsICAgICAvKiBSMzI3NjkgLSBEU1AzIERNIDEgKi8KKwlbMHg4MDAyXSA9IDB4MDAwMCwgICAgIC8qIFIzMjc3MCAtIERTUDMgRE0gMiAqLworCVsweDgwMDNdID0gMHgwMDAwLCAgICAgLyogUjMyNzcxIC0gRFNQMyBETSAzICovCisJWzB4ODFGQ10gPSAweDAwMDAsICAgICAvKiBSMzMyNzYgLSBEU1AzIERNIDUwOCAqLworCVsweDgxRkRdID0gMHgwMDAwLCAgICAgLyogUjMzMjc3IC0gRFNQMyBETSA1MDkgKi8KKwlbMHg4MUZFXSA9IDB4MDAwMCwgICAgIC8qIFIzMzI3OCAtIERTUDMgRE0gNTEwICovCisJWzB4ODFGRl0gPSAweDAwMDAsICAgICAvKiBSMzMyNzkgLSBEU1AzIERNIDUxMSAqLworCVsweDg4MDBdID0gMHgwMDAwLCAgICAgLyogUjM0ODE2IC0gRFNQMyBQTSAwICovCisJWzB4ODgwMV0gPSAweDAwMDAsICAgICAvKiBSMzQ4MTcgLSBEU1AzIFBNIDEgKi8KKwlbMHg4ODAyXSA9IDB4MDAwMCwgICAgIC8qIFIzNDgxOCAtIERTUDMgUE0gMiAqLworCVsweDg4MDNdID0gMHgwMDAwLCAgICAgLyogUjM0ODE5IC0gRFNQMyBQTSAzICovCisJWzB4ODgwNF0gPSAweDAwMDAsICAgICAvKiBSMzQ4MjAgLSBEU1AzIFBNIDQgKi8KKwlbMHg4ODA1XSA9IDB4MDAwMCwgICAgIC8qIFIzNDgyMSAtIERTUDMgUE0gNSAqLworCVsweDhERkFdID0gMHgwMDAwLCAgICAgLyogUjM2MzQ2IC0gRFNQMyBQTSAxNTMwICovCisJWzB4OERGQl0gPSAweDAwMDAsICAgICAvKiBSMzYzNDcgLSBEU1AzIFBNIDE1MzEgKi8KKwlbMHg4REZDXSA9IDB4MDAwMCwgICAgIC8qIFIzNjM0OCAtIERTUDMgUE0gMTUzMiAqLworCVsweDhERkRdID0gMHgwMDAwLCAgICAgLyogUjM2MzQ5IC0gRFNQMyBQTSAxNTMzICovCisJWzB4OERGRV0gPSAweDAwMDAsICAgICAvKiBSMzYzNTAgLSBEU1AzIFBNIDE1MzQgKi8KKwlbMHg4REZGXSA9IDB4MDAwMCwgICAgIC8qIFIzNjM1MSAtIERTUDMgUE0gMTUzNSAqLworCVsweDkwMDBdID0gMHgwMDAwLCAgICAgLyogUjM2ODY0IC0gRFNQMyBaTSAwICovCisJWzB4OTAwMV0gPSAweDAwMDAsICAgICAvKiBSMzY4NjUgLSBEU1AzIFpNIDEgKi8KKwlbMHg5MDAyXSA9IDB4MDAwMCwgICAgIC8qIFIzNjg2NiAtIERTUDMgWk0gMiAqLworCVsweDkwMDNdID0gMHgwMDAwLCAgICAgLyogUjM2ODY3IC0gRFNQMyBaTSAzICovCisJWzB4OTdGQ10gPSAweDAwMDAsICAgICAvKiBSMzg5MDggLSBEU1AzIFpNIDIwNDQgKi8KKwlbMHg5N0ZEXSA9IDB4MDAwMCwgICAgIC8qIFIzODkwOSAtIERTUDMgWk0gMjA0NSAqLworCVsweDk3RkVdID0gMHgwMDAwLCAgICAgLyogUjM4OTEwIC0gRFNQMyBaTSAyMDQ2ICovCisJWzB4OTdGRl0gPSAweDAwMDAgICAgICAvKiBSMzg5MTEgLSBEU1AzIFpNIDIwNDcgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ5MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpAQCAtMCwwICsxLDI4MTMgQEAKKy8qCisgKiB3bTUxMDAuYyAgLS0gIFdNNTEwMCBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ2NkLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvd201MTAwLmg+CisKKyNpbmNsdWRlICJ3bTUxMDAuaCIKKworI2RlZmluZSBXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVMgMgorc3RhdGljIGNvbnN0IGNoYXIgKndtNTEwMF9jb3JlX3N1cHBseV9uYW1lc1tXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVNdID0geworCSJEQlZERDEiLAorCSJMRE9WREQiLCAvKiBJZiBEQ1ZERCBpcyBzdXBwbGllZCBleHRlcm5hbGx5IHNwZWNpZnkgYXMgTERPVkREICovCit9OworCisjZGVmaW5lIFdNNTEwMF9BSUZTICAgICAzCisjZGVmaW5lIFdNNTEwMF9TWU5DX1NSUyAzCisKK3N0cnVjdCB3bTUxMDBfZmxsIHsKKwlpbnQgZnJlZjsKKwlpbnQgZm91dDsKKwlpbnQgc3JjOworCXN0cnVjdCBjb21wbGV0aW9uIGxvY2s7Cit9OworCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTUxMDBfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgY29yZV9zdXBwbGllc1tXTTUxMDBfTlVNX0NPUkVfU1VQUExJRVNdOworCXN0cnVjdCByZWd1bGF0b3IgKmNwdmRkOworCXN0cnVjdCByZWd1bGF0b3IgKmRidmRkMjsKKwlzdHJ1Y3QgcmVndWxhdG9yICpkYnZkZDM7CisKKwlpbnQgcmV2OworCisJaW50IHN5c2NsazsKKwlpbnQgYXN5bmNjbGs7CisKKwlib29sIGFpZl9hc3luY1tXTTUxMDBfQUlGU107CisJYm9vbCBhaWZfc3ltbWV0cmljW1dNNTEwMF9BSUZTXTsKKwlpbnQgc3JfcmVmW1dNNTEwMF9TWU5DX1NSU107CisKKwlib29sIG91dF9lbmFbMl07CisKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrOworCWJvb2wgamFja19kZXRlY3Rpbmc7CisJYm9vbCBqYWNrX21pYzsKKwlpbnQgamFja19tb2RlOworCisJc3RydWN0IHdtNTEwMF9mbGwgZmxsWzJdOworCisJc3RydWN0IHdtNTEwMF9wZGF0YSBwZGF0YTsKKworI2lmZGVmIENPTkZJR19HUElPTElCCisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgd201MTAwX3NyX2NvZGVbXSA9IHsKKwkwLAorCTEyMDAwLAorCTI0MDAwLAorCTQ4MDAwLAorCTk2MDAwLAorCTE5MjAwMCwKKwkzODQwMDAsCisJNzY4MDAwLAorCTAsCisJMTEwMjUsCisJMjIwNTAsCisJNDQxMDAsCisJODgyMDAsCisJMTc2NDAwLAorCTM1MjgwMCwKKwk3MDU2MDAsCisJNDAwMCwKKwk4MDAwLAorCTE2MDAwLAorCTMyMDAwLAorCTY0MDAwLAorCTEyODAwMCwKKwkyNTYwMDAsCisJNTEyMDAwLAorfTsKKworc3RhdGljIGludCB3bTUxMDBfc3JfcmVnc1tXTTUxMDBfU1lOQ19TUlNdID0geworCVdNNTEwMF9DTE9DS0lOR180LAorCVdNNTEwMF9DTE9DS0lOR181LAorCVdNNTEwMF9DTE9DS0lOR182LAorfTsKKworc3RhdGljIGludCB3bTUxMDBfYWxsb2Nfc3Ioc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBzcl9jb2RlLCBzcl9mcmVlLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpOyBpKyspCisJCWlmICh3bTUxMDBfc3JfY29kZVtpXSA9PSByYXRlKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gQVJSQVlfU0laRSh3bTUxMDBfc3JfY29kZSkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGU6ICVkSHpcbiIsIHJhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3JfY29kZSA9IGk7CisKKwlpZiAoKHdtNTEwMC0+c3lzY2xrICUgcmF0ZSkgPT0gMCkgeworCQkvKiBJcyB0aGlzIHJhdGUgYWxyZWFkeSBpbiB1c2U/ICovCisJCXNyX2ZyZWUgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpOyBpKyspIHsKKwkJCWlmICghd201MTAwLT5zcl9yZWZbaV0gJiYgc3JfZnJlZSA9PSAtMSkgeworCQkJCXNyX2ZyZWUgPSBpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHdtNTEwMF9zcl9yZWdzW2ldKSAmCisJCQkgICAgIFdNNTEwMF9TQU1QTEVfUkFURV8xX01BU0spID09IHNyX2NvZGUpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpKSB7CisJCQl3bTUxMDAtPnNyX3JlZltpXSsrOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU1IgJWRIeiwgc2xvdCAlZCwgcmVmICVkXG4iLAorCQkJCXJhdGUsIGksIHdtNTEwMC0+c3JfcmVmW2ldKTsKKwkJCXJldHVybiBpOworCQl9CisKKwkJaWYgKHNyX2ZyZWUgPT0gLTEpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkFsbCBTUiBzbG90cyBhbHJlYWR5IGluIHVzZVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQWxsb2NhdGluZyBTUiBzbG90ICVkIGZvciAlZEh6XG4iLAorCQkJc3JfZnJlZSwgcmF0ZSk7CisJCXdtNTEwMC0+c3JfcmVmW3NyX2ZyZWVdKys7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHdtNTEwMF9zcl9yZWdzW3NyX2ZyZWVdLAorCQkJCSAgICBXTTUxMDBfU0FNUExFX1JBVEVfMV9NQVNLLAorCQkJCSAgICBzcl9jb2RlKTsKKworCQlyZXR1cm4gc3JfZnJlZTsKKworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSJTUiAlZEh6IGluY29tcGF0aWJsZSB3aXRoICVkSHogU1lTQ0xLIGFuZCAlZEh6IEFTWU5DQ0xLXG4iLAorCQkJcmF0ZSwgd201MTAwLT5zeXNjbGssIHdtNTEwMC0+YXN5bmNjbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdtNTEwMF9mcmVlX3NyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHJhdGUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaSwgc3JfY29kZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9zcl9jb2RlKTsgaSsrKQorCQlpZiAod201MTAwX3NyX2NvZGVbaV0gPT0gcmF0ZSkKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlOiAlZEh6XG4iLCByYXRlKTsKKwkJcmV0dXJuOworCX0KKwlzcl9jb2RlID0gd201MTAwX3NyX2NvZGVbaV07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfc3JfcmVncyk7IGkrKykgeworCQlpZiAoIXdtNTEwMC0+c3JfcmVmW2ldKQorCQkJY29udGludWU7CisKKwkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHdtNTEwMF9zcl9yZWdzW2ldKSAmCisJCSAgICAgV001MTAwX1NBTVBMRV9SQVRFXzFfTUFTSykgPT0gc3JfY29kZSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IEFSUkFZX1NJWkUod201MTAwX3NyX3JlZ3MpKSB7CisJCXdtNTEwMC0+c3JfcmVmW2ldLS07CisJCWRldl9kYmcoY29kZWMtPmRldiwgIkRlcmVmZXJlbmNlIFNSICVkSHosIGNvdW50IG5vdyAlZFxuIiwKKwkJCXJhdGUsIHdtNTEwMC0+c3JfcmVmW2ldKTsKKwl9IGVsc2UgeworCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiRnJlZWluZyB1bnJlZmVyZW5jZWQgc2FtcGxlIHJhdGUgJWRIelxuIiwKKwkJCSByYXRlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHdtNTEwMC0+cGRhdGEucmVzZXQpIHsKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5yZXNldCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtNTEwMC0+cGRhdGEucmVzZXQsIDEpOworCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTUxMDBfU09GVFdBUkVfUkVTRVQsIDApOworCX0KK30KKworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX3RsdiwgLTYzMDAsIDEwMCwgMCk7CitzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtaXhlcl90bHYsIC0zMjAwLCAxMDAsIDApOworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF90bHYsIC02NDAwLCAxMDAsIDApOworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtNjQwMCwgNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqd201MTAwX21peGVyX3RleHRzW10gPSB7CisJIk5vbmUiLAorCSJUb25lIEdlbmVyYXRvciAxIiwKKwkiVG9uZSBHZW5lcmF0b3IgMiIsCisJIkFFQyBsb29wYmFjayIsCisJIklOMUwiLAorCSJJTjFSIiwKKwkiSU4yTCIsCisJIklOMlIiLAorCSJJTjNMIiwKKwkiSU4zUiIsCisJIklONEwiLAorCSJJTjRSIiwKKwkiQUlGMVJYMSIsCisJIkFJRjFSWDIiLAorCSJBSUYxUlgzIiwKKwkiQUlGMVJYNCIsCisJIkFJRjFSWDUiLAorCSJBSUYxUlg2IiwKKwkiQUlGMVJYNyIsCisJIkFJRjFSWDgiLAorCSJBSUYyUlgxIiwKKwkiQUlGMlJYMiIsCisJIkFJRjNSWDEiLAorCSJBSUYzUlgyIiwKKwkiRVExIiwKKwkiRVEyIiwKKwkiRVEzIiwKKwkiRVE0IiwKKwkiRFJDMUwiLAorCSJEUkMxUiIsCisJIkxIUEYxIiwKKwkiTEhQRjIiLAorCSJMSFBGMyIsCisJIkxIUEY0IiwKKwkiRFNQMS4xIiwKKwkiRFNQMS4yIiwKKwkiRFNQMS4zIiwKKwkiRFNQMS40IiwKKwkiRFNQMS41IiwKKwkiRFNQMS42IiwKKwkiRFNQMi4xIiwKKwkiRFNQMi4yIiwKKwkiRFNQMi4zIiwKKwkiRFNQMi40IiwKKwkiRFNQMi41IiwKKwkiRFNQMi42IiwKKwkiRFNQMy4xIiwKKwkiRFNQMy4yIiwKKwkiRFNQMy4zIiwKKwkiRFNQMy40IiwKKwkiRFNQMy41IiwKKwkiRFNQMy42IiwKKwkiQVNSQzFMIiwKKwkiQVNSQzFSIiwKKwkiQVNSQzJMIiwKKwkiQVNSQzJSIiwKKwkiSVNSQzFJTlQxIiwKKwkiSVNSQzFJTlQyIiwKKwkiSVNSQzFJTlQzIiwKKwkiSVNSQzFJTlQ0IiwKKwkiSVNSQzJJTlQxIiwKKwkiSVNSQzJJTlQyIiwKKwkiSVNSQzJJTlQzIiwKKwkiSVNSQzJJTlQ0IiwKKwkiSVNSQzFERUMxIiwKKwkiSVNSQzFERUMyIiwKKwkiSVNSQzFERUMzIiwKKwkiSVNSQzFERUM0IiwKKwkiSVNSQzJERUMxIiwKKwkiSVNSQzJERUMyIiwKKwkiSVNSQzJERUMzIiwKKwkiSVNSQzJERUM0IiwKK307CisKK3N0YXRpYyBpbnQgd201MTAwX21peGVyX3ZhbHVlc1tdID0geworCTB4MDAsCisJMHgwNCwgICAvKiBUb25lICovCisJMHgwNSwKKwkweDA4LCAgIC8qIEFFQyAqLworCTB4MTAsICAgLyogSW5wdXQgKi8KKwkweDExLAorCTB4MTIsCisJMHgxMywKKwkweDE0LAorCTB4MTUsCisJMHgxNiwKKwkweDE3LAorCTB4MjAsICAgLyogQUlGICovCisJMHgyMSwKKwkweDIyLAorCTB4MjMsCisJMHgyNCwKKwkweDI1LAorCTB4MjYsCisJMHgyNywKKwkweDI4LAorCTB4MjksCisJMHgzMCwgICAvKiBBSUYzIC0gY2hlY2sgKi8KKwkweDMxLAorCTB4NTAsICAgLyogRVEgKi8KKwkweDUxLAorCTB4NTIsCisJMHg1MywKKwkweDU0LAorCTB4NTgsICAgLyogRFJDICovCisJMHg1OSwKKwkweDYwLCAgIC8qIExIUEYxICovCisJMHg2MSwgICAvKiBMSFBGMiAqLworCTB4NjIsICAgLyogTEhQRjMgKi8KKwkweDYzLCAgIC8qIExIUEY0ICovCisJMHg2OCwgICAvKiBEU1AxICovCisJMHg2OSwKKwkweDZhLAorCTB4NmIsCisJMHg2YywKKwkweDZkLAorCTB4NzAsICAgLyogRFNQMiAqLworCTB4NzEsCisJMHg3MiwKKwkweDczLAorCTB4NzQsCisJMHg3NSwKKwkweDc4LCAgIC8qIERTUDMgKi8KKwkweDc5LAorCTB4N2EsCisJMHg3YiwKKwkweDdjLAorCTB4N2QsCisJMHg5MCwgICAvKiBBU1JDMSAqLworCTB4OTEsCisJMHg5MiwgICAvKiBBU1JDMiAqLworCTB4OTMsCisJMHhhMCwgICAvKiBJU1JDMURFQzEgKi8KKwkweGExLAorCTB4YTIsCisJMHhhMywKKwkweGE0LCAgIC8qIElTUkMxSU5UMSAqLworCTB4YTUsCisJMHhhNiwKKwkweGE3LAorCTB4YTgsICAgLyogSVNSQzJERUMxICovCisJMHhhOSwKKwkweGFhLAorCTB4YWIsCisJMHhhYywgICAvKiBJU1JDMklOVDEgKi8KKwkweGFkLAorCTB4YWUsCisJMHhhZiwKK307CisKKyNkZWZpbmUgV001MTAwX01JWEVSX0NPTlRST0xTKG5hbWUsIGJhc2UpIFwKKwlTT0NfU0lOR0xFX1RMVihuYW1lICIgSW5wdXQgMSBWb2x1bWUiLCBiYXNlICsgMSAsIFwKKwkJICAgICAgIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQsIDgwLCAwLCBtaXhlcl90bHYpLCBcCisJU09DX1NJTkdMRV9UTFYobmFtZSAiIElucHV0IDIgVm9sdW1lIiwgYmFzZSArIDMgLCBcCisJCSAgICAgICBXTTUxMDBfTUlYRVJfVk9MX1NISUZULCA4MCwgMCwgbWl4ZXJfdGx2KSwgXAorCVNPQ19TSU5HTEVfVExWKG5hbWUgIiBJbnB1dCAzIFZvbHVtZSIsIGJhc2UgKyA1ICwgXAorCQkgICAgICAgV001MTAwX01JWEVSX1ZPTF9TSElGVCwgODAsIDAsIG1peGVyX3RsdiksIFwKKwlTT0NfU0lOR0xFX1RMVihuYW1lICIgSW5wdXQgNCBWb2x1bWUiLCBiYXNlICsgNyAsIFwKKwkJICAgICAgIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQsIDgwLCAwLCBtaXhlcl90bHYpCisKKyNkZWZpbmUgV001MTAwX01VWF9FTlVNX0RFQ0wobmFtZSwgcmVnKSBcCisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFX0RFQ0wobmFtZSwgcmVnLCAwLCAweGZmLCAJCQlcCisJCQkJICAgd201MTAwX21peGVyX3RleHRzLCB3bTUxMDBfbWl4ZXJfdmFsdWVzKQorCisjZGVmaW5lIFdNNTEwMF9NVVhfQ1RMX0RFQ0wobmFtZSkgXAorCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hbWUjI19tdXggPQlcCisJCVNPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgbmFtZSMjX2VudW0pCisKKyNkZWZpbmUgV001MTAwX01JWEVSX0VOVU1TKG5hbWUsIGJhc2VfcmVnKSBcCisJc3RhdGljIFdNNTEwMF9NVVhfRU5VTV9ERUNMKG5hbWUjI19pbjFfZW51bSwgYmFzZV9yZWcpOwkgICAgIFwKKwlzdGF0aWMgV001MTAwX01VWF9FTlVNX0RFQ0wobmFtZSMjX2luMl9lbnVtLCBiYXNlX3JlZyArIDIpOyAgXAorCXN0YXRpYyBXTTUxMDBfTVVYX0VOVU1fREVDTChuYW1lIyNfaW4zX2VudW0sIGJhc2VfcmVnICsgNCk7ICBcCisJc3RhdGljIFdNNTEwMF9NVVhfRU5VTV9ERUNMKG5hbWUjI19pbjRfZW51bSwgYmFzZV9yZWcgKyA2KTsgIFwKKwlzdGF0aWMgV001MTAwX01VWF9DVExfREVDTChuYW1lIyNfaW4xKTsgXAorCXN0YXRpYyBXTTUxMDBfTVVYX0NUTF9ERUNMKG5hbWUjI19pbjIpOyBcCisJc3RhdGljIFdNNTEwMF9NVVhfQ1RMX0RFQ0wobmFtZSMjX2luMyk7IFwKKwlzdGF0aWMgV001MTAwX01VWF9DVExfREVDTChuYW1lIyNfaW40KSAKKworV001MTAwX01JWEVSX0VOVU1TKEhQT1VUMUwsIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoSFBPVVQxUiwgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhIUE9VVDJMLCBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEhQT1VUMlIsIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoSFBPVVQzTCwgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhIUE9VVDNSLCBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoU1BLT1VUTCwgV001MTAwX09VVDRMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhTUEtPVVRSLCBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDFMLCBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDFSLCBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDJMLCBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFNQS0RBVDJSLCBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoUFdNMSwgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKFBXTTIsIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDEsIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFgyLCBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMVRYMywgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDQsIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFg1LCBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMVRYNiwgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjFUWDcsIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYxVFg4LCBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8xX1NPVVJDRSk7CisKK1dNNTEwMF9NSVhFUl9FTlVNUyhBSUYyVFgxLCBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGMlRYMiwgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0UpOworCitXTTUxMDBfTUlYRVJfRU5VTVMoQUlGM1RYMSwgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEFJRjNUWDIsIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKEVRMSwgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRSk7CitXTTUxMDBfTUlYRVJfRU5VTVMoRVEyLCBXTTUxMDBfRVEyTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhFUTMsIFdNNTEwMF9FUTNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKEVRNCwgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSk7CisKK1dNNTEwMF9NSVhFUl9FTlVNUyhEUkMxTCwgV001MTAwX0RSQzFMTUlYX0lOUFVUXzFfU09VUkNFKTsKK1dNNTEwMF9NSVhFUl9FTlVNUyhEUkMxUiwgV001MTAwX0RSQzFSTUlYX0lOUFVUXzFfU09VUkNFKTsKKworV001MTAwX01JWEVSX0VOVU1TKExIUEYxLCBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEYyLCBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEYzLCBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0UpOworV001MTAwX01JWEVSX0VOVU1TKExIUEY0LCBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0UpOworCisjZGVmaW5lIFdNNTEwMF9NVVgobmFtZSwgY3RybCkgXAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgobmFtZSwgU05EX1NPQ19OT1BNLCAwLCAwLCBjdHJsKQorCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9XSURHRVRTKG5hbWUsIG5hbWVfc3RyKQlcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDEiLCAmbmFtZSMjX2luMV9tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDIiLCAmbmFtZSMjX2luMl9tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDMiLCAmbmFtZSMjX2luM19tdXgpLCBcCisJV001MTAwX01VWChuYW1lX3N0ciAiIElucHV0IDQiLCAmbmFtZSMjX2luNF9tdXgpLCBcCisJU05EX1NPQ19EQVBNX01JWEVSKG5hbWVfc3RyICIgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApCisKKyNkZWZpbmUgV001MTAwX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lKQlcCisJeyBuYW1lLCAiVG9uZSBHZW5lcmF0b3IgMSIsICJUb25lIEdlbmVyYXRvciAxIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIlRvbmUgR2VuZXJhdG9yIDIiLCAiVG9uZSBHZW5lcmF0b3IgMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjFMIiwgIklOMUwgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklOMVIiLCAiSU4xUiBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiSU4yTCIsICJJTjJMIFBHQSIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjJSIiwgIklOMlIgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklOM0wiLCAiSU4zTCBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiSU4zUiIsICJJTjNSIFBHQSIgfSwgXAorICAgICAgICB7IG5hbWUsICJJTjRMIiwgIklONEwgUEdBIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIklONFIiLCAiSU40UiBQR0EiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYMSIsICJBSUYxUlgxIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDIiLCAiQUlGMVJYMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYxUlgzIiwgIkFJRjFSWDMiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYNCIsICJBSUYxUlg0IiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDUiLCAiQUlGMVJYNSIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYxUlg2IiwgIkFJRjFSWDYiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMVJYNyIsICJBSUYxUlg3IiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjFSWDgiLCAiQUlGMVJYOCIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYyUlgxIiwgIkFJRjJSWDEiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiQUlGMlJYMiIsICJBSUYyUlgyIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkFJRjNSWDEiLCAiQUlGM1JYMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJBSUYzUlgyIiwgIkFJRjNSWDIiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiRVExIiwgIkVRMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJFUTIiLCAiRVEyIiB9LCBcCisgICAgICAgIHsgbmFtZSwgIkVRMyIsICJFUTMiIH0sIFwKKyAgICAgICAgeyBuYW1lLCAiRVE0IiwgIkVRNCIgfSwgXAorICAgICAgICB7IG5hbWUsICJEUkMxTCIsICJEUkMxTCIgfSwgXAorICAgICAgICB7IG5hbWUsICJEUkMxUiIsICJEUkMxUiIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMSIsICJMSFBGMSIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMiIsICJMSFBGMiIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGMyIsICJMSFBGMyIgfSwgXAorICAgICAgICB7IG5hbWUsICJMSFBGNCIsICJMSFBGNCIgfQorCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9ST1VURVMod2lkZ2V0LCBuYW1lKSBcCisJeyB3aWRnZXQsIE5VTEwsIG5hbWUgIiBNaXhlciIgfSwgICAgICAgICBcCisJeyBuYW1lICIgTWl4ZXIiLCBOVUxMLCBuYW1lICIgSW5wdXQgMSIgfSwgXAorCXsgbmFtZSAiIE1peGVyIiwgTlVMTCwgbmFtZSAiIElucHV0IDIiIH0sIFwKKwl7IG5hbWUgIiBNaXhlciIsIE5VTEwsIG5hbWUgIiBJbnB1dCAzIiB9LCBcCisJeyBuYW1lICIgTWl4ZXIiLCBOVUxMLCBuYW1lICIgSW5wdXQgNCIgfSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDEiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDIiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDMiKSwgXAorCVdNNTEwMF9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIElucHV0IDQiKQorCitzdGF0aWMgY29uc3QgY2hhciAqd201MTAwX2xocGZfbW9kZV90ZXh0W10gPSB7CisJIkxvdy1wYXNzIiwgIkhpZ2gtcGFzcyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGYxX21vZGUgPQorCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEYxXzEsIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZULCAyLAorCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTUxMDBfbGhwZjJfbW9kZSA9CisJU09DX0VOVU1fU0lOR0xFKFdNNTEwMF9IUExQRjJfMSwgV001MTAwX0xIUEYyX01PREVfU0hJRlQsIDIsCisJCQl3bTUxMDBfbGhwZl9tb2RlX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtNTEwMF9saHBmM19tb2RlID0KKwlTT0NfRU5VTV9TSU5HTEUoV001MTAwX0hQTFBGM18xLCBXTTUxMDBfTEhQRjNfTU9ERV9TSElGVCwgMiwKKwkJCXdtNTEwMF9saHBmX21vZGVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd201MTAwX2xocGY0X21vZGUgPQorCVNPQ19FTlVNX1NJTkdMRShXTTUxMDBfSFBMUEY0XzEsIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZULCAyLAorCQkJd201MTAwX2xocGZfbW9kZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtNTEwMF9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEUoIklOMSBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9JTjFMX0NPTlRST0wsCisJICAgV001MTAwX0lOMV9PU1JfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiSU4yIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX0lOMkxfQ09OVFJPTCwKKwkgICBXTTUxMDBfSU4yX09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJJTjMgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfSU4zTF9DT05UUk9MLAorCSAgIFdNNTEwMF9JTjNfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIklONCBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9JTjRMX0NPTlRST0wsCisJICAgV001MTAwX0lONF9PU1JfU0hJRlQsIDEsIDApLAorCisvKiBPbmx5IGFwcGxpY2FibGUgZm9yIGFuYWxvZ3VlIGlucHV0cyAqLworU09DX0RPVUJMRV9SX1RMVigiSU4xIFZvbHVtZSIsIFdNNTEwMF9JTjFMX0NPTlRST0wsIFdNNTEwMF9JTjFSX0NPTlRST0wsCisJCSBXTTUxMDBfSU4xTF9QR0FfVk9MX1NISUZULCA5NCwgMCwgaW5fdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIklOMiBWb2x1bWUiLCBXTTUxMDBfSU4yTF9DT05UUk9MLCBXTTUxMDBfSU4yUl9DT05UUk9MLAorCQkgV001MTAwX0lOMkxfUEdBX1ZPTF9TSElGVCwgOTQsIDAsIGluX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJJTjMgVm9sdW1lIiwgV001MTAwX0lOM0xfQ09OVFJPTCwgV001MTAwX0lOM1JfQ09OVFJPTCwKKwkJIFdNNTEwMF9JTjNMX1BHQV9WT0xfU0hJRlQsIDk0LCAwLCBpbl90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU40IFZvbHVtZSIsIFdNNTEwMF9JTjRMX0NPTlRST0wsIFdNNTEwMF9JTjRSX0NPTlRST0wsCisJCSBXTTUxMDBfSU40TF9QR0FfVk9MX1NISUZULCA5NCwgMCwgaW5fdGx2KSwKKworU09DX0RPVUJMRV9SX1RMVigiSU4xIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIsIFdNNTEwMF9JTjFMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU4yIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMlIsIFdNNTEwMF9JTjJMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU4zIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zTCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM1IsIFdNNTEwMF9JTjNMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSU40IERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80TCwKKwkJIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIsIFdNNTEwMF9JTjRMX1ZPTF9TSElGVCwgMTkxLAorCQkgMCwgZGlnaXRhbF90bHYpLAorCitTT0NfRE9VQkxFX1IoIklOMSBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX0lOMUxfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklOMiBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yUiwgV001MTAwX0lOMkxfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklOMyBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzNMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zUiwgV001MTAwX0lOM0xfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFX1IoIklONCBTd2l0Y2giLCBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMLAorCSAgICAgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX0lONExfTVVURV9TSElGVCwgMSwgMSksCisKK1NPQ19TSU5HTEUoIkhQT1VUMSBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9PVVRfVk9MVU1FXzFMLAorCSAgIFdNNTEwMF9PVVQxX09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJIUE9VVDIgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfT1VUX1ZPTFVNRV8yTCwKKwkgICBXTTUxMDBfT1VUMl9PU1JfU0hJRlQsIDEsIDApLAorU09DX1NJTkdMRSgiSFBPVVQzIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX09VVF9WT0xVTUVfM0wsCisJICAgV001MTAwX09VVDNfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIlNQS09VVCBIaWdoIFBlcmZvcm1hbmNlIFN3aXRjaCIsIFdNNTEwMF9PVVRfVk9MVU1FXzRMLAorCSAgIFdNNTEwMF9PVVQ0X09TUl9TSElGVCwgMSwgMCksCitTT0NfU0lOR0xFKCJTUEtEQVQxIEhpZ2ggUGVyZm9ybWFuY2UgU3dpdGNoIiwgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNUwsCisJICAgV001MTAwX09VVDVfT1NSX1NISUZULCAxLCAwKSwKK1NPQ19TSU5HTEUoIlNQS0RBVDIgSGlnaCBQZXJmb3JtYW5jZSBTd2l0Y2giLCBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF82TCwKKwkgICBXTTUxMDBfT1VUNl9PU1JfU0hJRlQsIDEsIDApLAorCitTT0NfRE9VQkxFX1JfVExWKCJIUE9VVDEgRGlnaXRhbCBWb2x1bWUiLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCQkgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX09VVDFMX1ZPTF9TSElGVCwgMTU5LCAwLAorCQkgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSFBPVVQyIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwkJIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMlIsIFdNNTEwMF9PVVQyTF9WT0xfU0hJRlQsIDE1OSwgMCwKKwkJIGRpZ2l0YWxfdGx2KSwKK1NPQ19ET1VCTEVfUl9UTFYoIkhQT1VUMyBEaWdpdGFsIFZvbHVtZSIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0wsCisJCSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNSLCBXTTUxMDBfT1VUM0xfVk9MX1NISUZULCAxNTksIDAsCisJCSBkaWdpdGFsX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJTUEtPVVQgRGlnaXRhbCBWb2x1bWUiLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCQkgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX09VVDRMX1ZPTF9TSElGVCwgMTU5LCAwLAorCQkgZGlnaXRhbF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiU1BLREFUMSBEaWdpdGFsIFZvbHVtZSIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNUwsCisJCSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSLCBXTTUxMDBfT1VUNUxfVk9MX1NISUZULCAxNTksIDAsCisJCSBkaWdpdGFsX3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJTUEtEQVQyIERpZ2l0YWwgVm9sdW1lIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82TCwKKwkJIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNlIsIFdNNTEwMF9PVVQ2TF9WT0xfU0hJRlQsIDE1OSwgMCwKKwkJIGRpZ2l0YWxfdGx2KSwKKworU09DX0RPVUJMRV9SKCJIUE9VVDEgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiwgV001MTAwX09VVDFMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJIUE9VVDIgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yUiwgV001MTAwX09VVDJMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJIUE9VVDMgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzNMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zUiwgV001MTAwX09VVDNMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJTUEtPVVQgRGlnaXRhbCBTd2l0Y2giLCBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCSAgICAgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiwgV001MTAwX09VVDRMX01VVEVfU0hJRlQsIDEsIDEpLAorU09DX0RPVUJMRV9SKCJTUEtEQVQxIERpZ2l0YWwgU3dpdGNoIiwgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81TCwKKwkgICAgIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNVIsIFdNNTEwMF9PVVQ1TF9NVVRFX1NISUZULCAxLCAxKSwKK1NPQ19ET1VCTEVfUigiU1BLREFUMiBEaWdpdGFsIFN3aXRjaCIsIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkwsCisJICAgICBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzZSLCBXTTUxMDBfT1VUNkxfTVVURV9TSElGVCwgMSwgMSksCisKKy8qIEZJWE1FOiBPbmx5IHZhbGlkIGZyb20gLTEyZEIgdG8gMGRCICg1Mi02NCkgKi8KK1NPQ19ET1VCTEVfUl9UTFYoIkhQT1VUMSBWb2x1bWUiLCBXTTUxMDBfT1VUX1ZPTFVNRV8xTCwgV001MTAwX09VVF9WT0xVTUVfMVIsCisJCSBXTTUxMDBfT1VUMUxfUEdBX1ZPTF9TSElGVCwgNjQsIDAsIG91dF90bHYpLAorU09DX0RPVUJMRV9SX1RMVigiSFBPVVQyIFZvbHVtZSIsIFdNNTEwMF9PVVRfVk9MVU1FXzJMLCBXTTUxMDBfT1VUX1ZPTFVNRV8yUiwKKwkJIFdNNTEwMF9PVVQyTF9QR0FfVk9MX1NISUZULCA2NCwgMCwgb3V0X3RsdiksCitTT0NfRE9VQkxFX1JfVExWKCJIUE9VVDMgVm9sdW1lIiwgV001MTAwX09VVF9WT0xVTUVfM0wsIFdNNTEwMF9PVVRfVk9MVU1FXzNSLAorCQkgV001MTAwX09VVDJMX1BHQV9WT0xfU0hJRlQsIDY0LCAwLCBvdXRfdGx2KSwKKworU09DX0RPVUJMRSgiU1BLREFUMSBTd2l0Y2giLCBXTTUxMDBfUERNX1NQSzFfQ1RSTF8xLCBXTTUxMDBfU1BLMUxfTVVURV9TSElGVCwKKwkgICBXTTUxMDBfU1BLMVJfTVVURV9TSElGVCwgMSwgMSksCitTT0NfRE9VQkxFKCJTUEtEQVQyIFN3aXRjaCIsIFdNNTEwMF9QRE1fU1BLMl9DVFJMXzEsIFdNNTEwMF9TUEsyTF9NVVRFX1NISUZULAorCSAgIFdNNTEwMF9TUEsyUl9NVVRFX1NISUZULCAxLCAxKSwKKworU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDEgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IxX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDIgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IyX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDMgVm9sdW1lIiwgV001MTAwX0VRMV8xLCBXTTUxMDBfRVExX0IzX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDQgVm9sdW1lIiwgV001MTAwX0VRMV8yLCBXTTUxMDBfRVExX0I0X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRMSBCYW5kIDUgVm9sdW1lIiwgV001MTAwX0VRMV8yLCBXTTUxMDBfRVExX0I1X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMSBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjFfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMiBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjJfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgMyBWb2x1bWUiLCBXTTUxMDBfRVEyXzEsIFdNNTEwMF9FUTJfQjNfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgNCBWb2x1bWUiLCBXTTUxMDBfRVEyXzIsIFdNNTEwMF9FUTJfQjRfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRVEyIEJhbmQgNSBWb2x1bWUiLCBXTTUxMDBfRVEyXzIsIFdNNTEwMF9FUTJfQjVfR0FJTl9TSElGVCwKKwkgICAgICAgMjQsIDAsIGVxX3RsdiksCisKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAxIFZvbHVtZSIsIFdNNTEwMF9FUTFfMSwgV001MTAwX0VRM19CMV9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAyIFZvbHVtZSIsIFdNNTEwMF9FUTNfMSwgV001MTAwX0VRM19CMl9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCAzIFZvbHVtZSIsIFdNNTEwMF9FUTNfMSwgV001MTAwX0VRM19CM19HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCA0IFZvbHVtZSIsIFdNNTEwMF9FUTNfMiwgV001MTAwX0VRM19CNF9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJFUTMgQmFuZCA1IFZvbHVtZSIsIFdNNTEwMF9FUTNfMiwgV001MTAwX0VRM19CNV9HQUlOX1NISUZULAorCSAgICAgICAyNCwgMCwgZXFfdGx2KSwKKworU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDEgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IxX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDIgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IyX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDMgVm9sdW1lIiwgV001MTAwX0VRNF8xLCBXTTUxMDBfRVE0X0IzX0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDQgVm9sdW1lIiwgV001MTAwX0VRNF8yLCBXTTUxMDBfRVE0X0I0X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorU09DX1NJTkdMRV9UTFYoIkVRNCBCYW5kIDUgVm9sdW1lIiwgV001MTAwX0VRNF8yLCBXTTUxMDBfRVE0X0I1X0dBSU5fU0hJRlQsCisJICAgICAgIDI0LCAwLCBlcV90bHYpLAorCitTT0NfRU5VTSgiTEhQRjEgTW9kZSIsIHdtNTEwMF9saHBmMV9tb2RlKSwKK1NPQ19FTlVNKCJMSFBGMiBNb2RlIiwgd201MTAwX2xocGYyX21vZGUpLAorU09DX0VOVU0oIkxIUEYzIE1vZGUiLCB3bTUxMDBfbGhwZjNfbW9kZSksCitTT0NfRU5VTSgiTEhQRjQgTW9kZSIsIHdtNTEwMF9saHBmNF9tb2RlKSwKKworV001MTAwX01JWEVSX0NPTlRST0xTKCJIUE9VVDFMIiwgV001MTAwX09VVDFMTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiSFBPVVQxUiIsIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkhQT1VUMkwiLCBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJIUE9VVDJSIiwgV001MTAwX09VVDJSTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiSFBPVVQzTCIsIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkhQT1VUM1IiLCBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlNQS09VVEwiLCBXTTUxMDBfT1VUNExNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJTUEtPVVRSIiwgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiU1BLREFUMUwiLCBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJTUEtEQVQxUiIsIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlNQS0RBVDJMIiwgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiU1BLREFUMlIiLCBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlBXTTEiLCBXTTUxMDBfUFdNMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIlBXTTIiLCBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMSIsIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMiIsIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYMyIsIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNCIsIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNSIsIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNiIsIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYNyIsIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiQUlGMVRYOCIsIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfU09VUkNFKSwKKworV001MTAwX01JWEVSX0NPTlRST0xTKCJBSUYyVFgxIiwgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJBSUYyVFgyIiwgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkFJRjNUWDEiLCBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkFJRjNUWDIiLCBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRVExIiwgV001MTAwX0VRMU1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkVRMiIsIFdNNTEwMF9FUTJNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJFUTMiLCBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRVE0IiwgV001MTAwX0VRNE1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiRFJDMUwiLCBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJEUkMxUiIsIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8xX1NPVVJDRSksCisKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiTEhQRjEiLCBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9TT1VSQ0UpLAorV001MTAwX01JWEVSX0NPTlRST0xTKCJMSFBGMiIsIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8xX1NPVVJDRSksCitXTTUxMDBfTUlYRVJfQ09OVFJPTFMoIkxIUEYzIiwgV001MTAwX0hQTFAzTUlYX0lOUFVUXzFfU09VUkNFKSwKK1dNNTEwMF9NSVhFUl9DT05UUk9MUygiTEhQRjQiLCBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9TT1VSQ0UpLAorfTsKKworc3RhdGljIHZvaWQgd201MTAwX3NlcV9ub3RpZmllcihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJZW51bSBzbmRfc29jX2RhcG1fdHlwZSBldmVudCwgaW50IHN1YnNlcSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb250YWluZXJfb2YoZGFwbSwKKwkJCQkJCSAgIHN0cnVjdCBzbmRfc29jX2NvZGVjLCBkYXBtKTsKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUxNiB2YWwsIGV4cGVjdCwgaTsKKworCS8qIFdhaXQgZm9yIHRoZSBvdXRwdXRzIHRvIGZsYWcgdGhlbXNlbHZlcyBhcyBlbmFibGVkICovCisJaWYgKHdtNTEwMC0+b3V0X2VuYVswXSkgeworCQlleHBlY3QgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9DSEFOTkVMX0VOQUJMRVNfMSk7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX1NUQVRVU18xKTsKKwkJCWlmICh2YWwgPT0gZXhwZWN0KSB7CisJCQkJd201MTAwLT5vdXRfZW5hWzBdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gMjAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIE9VVFBVVDEgJXhcbiIsCisJCQkJZXhwZWN0KTsKKwkJfQorCX0KKworCWlmICh3bTUxMDAtPm91dF9lbmFbMV0pIHsKKwkJZXhwZWN0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMik7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfT1VUUFVUX1NUQVRVU18yKTsKKwkJCWlmICh2YWwgPT0gZXhwZWN0KSB7CisJCQkJd201MTAwLT5vdXRfZW5hWzFdID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gMjAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIE9VVFBVVDIgJXhcbiIsCisJCQkJZXhwZWN0KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB3bTUxMDBfb3V0X2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEody0+Y29kZWMpOworCisJc3dpdGNoICh3LT5yZWcpIHsKKwljYXNlIFdNNTEwMF9DSEFOTkVMX0VOQUJMRVNfMToKKwkJd201MTAwLT5vdXRfZW5hWzBdID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMjoKKwkJd201MTAwLT5vdXRfZW5hWzBdID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX2NwX2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUod201MTAwLT5jcHZkZCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBDUFZERDogJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHJldDsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZV9kZWZlcnJlZCh3bTUxMDAtPmNwdmRkLCAyMCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgQ1BWREQ6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiByZXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHdtNTEwMF9kYnZkZF9ldihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJY2FzZSAyOgorCQlyZWd1bGF0b3IgPSB3bTUxMDAtPmRidmRkMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWd1bGF0b3IgPSB3bTUxMDAtPmRidmRkMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJlZ3VsYXRvcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBEQlZERCVkOiAlZFxuIiwKKwkJCQl3LT5zaGlmdCwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHJldDsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3IpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgREJWREQlZDogJWRcbiIsCisJCQkJdy0+c2hpZnQsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiByZXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbG9nX3N0YXR1czMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdmFsKQoreworCWlmICh2YWwgJiBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fRUlOVCkKKwkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgc2h1dGRvd24gd2FybmluZ1xuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9TUEtfU0hVVERPV05fRUlOVCkKKwkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgc2h1dGRvd25cbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQ0xLR0VOX0VSUl9FSU5UKQorCQlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiU1lTQ0xLIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlQpCisJCWRldl9jcml0KGNvZGVjLT5kZXYsICJBU1lOQ0NMSyB1bmRlcmNsb2NrZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbG9nX3N0YXR1czQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdmFsKQoreworCWlmICh2YWwgJiBXTTUxMDBfQUlGM19FUlJfRUlOVCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQUlGMyBjb25maWd1cmF0aW9uIGVycm9yXG4iKTsKKwlpZiAodmFsICYgV001MTAwX0FJRjJfRVJSX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkFJRjIgY29uZmlndXJhdGlvbiBlcnJvclxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYxX0VSUl9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYxIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQ1RSTElGX0VSUl9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDb250cm9sIGludGVyZmFjZSBlcnJvclxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9JU1JDMl9VTkRFUkNMT0NLRURfRUlOVCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSVNSQzIgdW5kZXJjbG9ja2VkXG4iKTsKKwlpZiAodmFsICYgV001MTAwX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJU1JDMSB1bmRlcmNsb2NrZWRcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZYIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYzIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYyIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBSUYxIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBU1JDIHVuZGVyY2xvY2tlZFxuIik7CisJaWYgKHZhbCAmIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlQpCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBQyB1bmRlcmNsb2NrZWRcbiIpOworCWlmICh2YWwgJiBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJBREMgdW5kZXJjbG9ja2VkXG4iKTsKKwlpZiAodmFsICYgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJNaXhlciB1bmRlcmNsb2NrZWRcbiIpOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9wb3N0X2V2KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18zKTsKKwlyZXQgJj0gV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUUyB8CisJCVdNNTEwMF9TUEtfU0hVVERPV05fU1RTIHwgV001MTAwX0NMS0dFTl9FUlJfU1RTIHwKKwkJV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTOworCXdtNTEwMF9sb2dfc3RhdHVzMyhjb2RlYywgcmV0KTsKKworCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzQpOworCXdtNTEwMF9sb2dfc3RhdHVzNChjb2RlYywgcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd201MTAwX2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX1NVUFBMWSgiU1lTQ0xLIiwgV001MTAwX0NMT0NLSU5HXzMsIFdNNTEwMF9TWVNDTEtfRU5BX1NISUZULCAwLAorCQkgICAgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJBU1lOQ0NMSyIsIFdNNTEwMF9DTE9DS0lOR182LCBXTTUxMDBfQVNZTkNfQ0xLX0VOQV9TSElGVCwKKwkJICAgIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDEiLCBXTTUxMDBfSFBfQ0hBUkdFX1BVTVBfMSwgV001MTAwX0NQMV9FTkFfU0hJRlQsIDAsCisJCSAgICB3bTUxMDBfY3BfZXYsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDIiLCBXTTUxMDBfTUlDX0NIQVJHRV9QVU1QXzEsIFdNNTEwMF9DUDJfRU5BX1NISUZULCAwLAorCQkgICAgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJDUDIgQWN0aXZlIiwgV001MTAwX01JQ19DSEFSR0VfUFVNUF8xLAorCQkgICAgV001MTAwX0NQMl9CWVBBU1NfU0hJRlQsIDEsIHdtNTEwMF9jcF9ldiwKKwkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK1NORF9TT0NfREFQTV9TVVBQTFkoIkRCVkREMiIsIFNORF9TT0NfTk9QTSwgMiwgMCwgd201MTAwX2RidmRkX2V2LAorCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiREJWREQzIiwgU05EX1NPQ19OT1BNLCAzLCAwLCB3bTUxMDBfZGJ2ZGRfZXYsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKK1NORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMxIiwgV001MTAwX01JQ19CSUFTX0NUUkxfMSwgV001MTAwX01JQ0IxX0VOQV9TSElGVCwKKwkJICAgIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzIiLCBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8yLCBXTTUxMDBfTUlDQjJfRU5BX1NISUZULAorCQkgICAgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTMyIsIFdNNTEwMF9NSUNfQklBU19DVFJMXzMsIFdNNTEwMF9NSUNCM19FTkFfU0hJRlQsCisJCSAgICAwLCBOVUxMLCAwKSwKKworU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFMIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklOMVIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4yTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJSIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklOM0wiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiSU4zUiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJJTjRMIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIklONFIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiVE9ORSIpLAorCitTTkRfU09DX0RBUE1fUEdBX0UoIklOMUwgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjFMX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU4xUiBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lOMVJfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorU05EX1NPQ19EQVBNX1BHQV9FKCJJTjJMIFBHQSIsIFdNNTEwMF9JTlBVVF9FTkFCTEVTLCBXTTUxMDBfSU4yTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIklOMlIgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjJSX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU4zTCBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lOM0xfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorU05EX1NPQ19EQVBNX1BHQV9FKCJJTjNSIFBHQSIsIFdNNTEwMF9JTlBVVF9FTkFCTEVTLCBXTTUxMDBfSU4zUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIklONEwgUEdBIiwgV001MTAwX0lOUFVUX0VOQUJMRVMsIFdNNTEwMF9JTjRMX0VOQV9TSElGVCwgMCwKKwkJICAgTlVMTCwgMCwgd201MTAwX291dF9ldiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKK1NORF9TT0NfREFQTV9QR0FfRSgiSU40UiBQR0EiLCBXTTUxMDBfSU5QVVRfRU5BQkxFUywgV001MTAwX0lONFJfRU5BX1NISUZULCAwLAorCQkgICBOVUxMLCAwLCB3bTUxMDBfb3V0X2V2LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCitTTkRfU09DX0RBUE1fUEdBKCJUb25lIEdlbmVyYXRvciAxIiwgV001MTAwX1RPTkVfR0VORVJBVE9SXzEsCisJCSBXTTUxMDBfVE9ORTFfRU5BX1NISUZULCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlRvbmUgR2VuZXJhdG9yIDIiLCBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMSwKKwkJIFdNNTEwMF9UT05FMl9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgxIiwgIkFJRjEgUGxheWJhY2siLCAwLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgxX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgyIiwgIkFJRjEgUGxheWJhY2siLCAxLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgyX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgzIiwgIkFJRjEgUGxheWJhY2siLCAyLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlgzX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg0IiwgIkFJRjEgUGxheWJhY2siLCAzLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg0X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg1IiwgIkFJRjEgUGxheWJhY2siLCA0LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg1X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg2IiwgIkFJRjEgUGxheWJhY2siLCA1LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg2X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg3IiwgIkFJRjEgUGxheWJhY2siLCA2LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg3X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg4IiwgIkFJRjEgUGxheWJhY2siLCA3LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjcsIFdNNTEwMF9BSUYxUlg4X0VOQV9TSElGVCwgMCksCisKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDEiLCAiQUlGMiBQbGF5YmFjayIsIDAsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNywgV001MTAwX0FJRjJSWDFfRU5BX1NISUZULCAwKSwKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDIiLCAiQUlGMiBQbGF5YmFjayIsIDEsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNywgV001MTAwX0FJRjJSWDJfRU5BX1NISUZULCAwKSwKKworU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM1JYMSIsICJBSUYzIFBsYXliYWNrIiwgMCwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI3LCBXTTUxMDBfQUlGM1JYMV9FTkFfU0hJRlQsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM1JYMiIsICJBSUYzIFBsYXliYWNrIiwgMSwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI3LCBXTTUxMDBfQUlGM1JYMl9FTkFfU0hJRlQsIDApLAorCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMSIsICJBSUYxIENhcHR1cmUiLCAwLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgxX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMiIsICJBSUYxIENhcHR1cmUiLCAxLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgyX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYMyIsICJBSUYxIENhcHR1cmUiLCAyLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFgzX0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNCIsICJBSUYxIENhcHR1cmUiLCAzLAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg0X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNSIsICJBSUYxIENhcHR1cmUiLCA0LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg1X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNiIsICJBSUYxIENhcHR1cmUiLCA1LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg2X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYNyIsICJBSUYxIENhcHR1cmUiLCA2LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg3X0VOQV9TSElGVCwgMCksCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMVRYOCIsICJBSUYxIENhcHR1cmUiLCA3LAorCQkgICAgV001MTAwX0FVRElPX0lGXzFfMjYsIFdNNTEwMF9BSUYxVFg4X0VOQV9TSElGVCwgMCksCisKK1NORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyVFgxIiwgIkFJRjIgQ2FwdHVyZSIsIDAsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNiwgV001MTAwX0FJRjJUWDFfRU5BX1NISUZULCAwKSwKK1NORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYyVFgyIiwgIkFJRjIgQ2FwdHVyZSIsIDEsCisJCSAgICBXTTUxMDBfQVVESU9fSUZfMl8yNiwgV001MTAwX0FJRjJUWDJfRU5BX1NISUZULCAwKSwKKworU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNUWDEiLCAiQUlGMyBDYXB0dXJlIiwgMCwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI2LCBXTTUxMDBfQUlGM1RYMV9FTkFfU0hJRlQsIDApLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNUWDIiLCAiQUlGMyBDYXB0dXJlIiwgMSwKKwkJICAgIFdNNTEwMF9BVURJT19JRl8zXzI2LCBXTTUxMDBfQUlGM1RYMl9FTkFfU0hJRlQsIDApLAorCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDZMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ2TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDZSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ2Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDVMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ1TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDVSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ1Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRMIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ0TF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRSIiwgV001MTAwX09VVFBVVF9FTkFCTEVTXzIsIFdNNTEwMF9PVVQ0Ul9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDNMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAzTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDNSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAzUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDJMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAyTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDJSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAyUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDFMIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAxTF9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDFSIiwgV001MTAwX0NIQU5ORUxfRU5BQkxFU18xLCBXTTUxMDBfSFAxUl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIlBXTTEgRHJpdmVyIiwgV001MTAwX1BXTV9EUklWRV8xLCBXTTUxMDBfUFdNMV9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCitTTkRfU09DX0RBUE1fUEdBX0UoIlBXTTIgRHJpdmVyIiwgV001MTAwX1BXTV9EUklWRV8xLCBXTTUxMDBfUFdNMl9FTkFfU0hJRlQsIDAsCisJCSAgIE5VTEwsIDAsIHdtNTEwMF9vdXRfZXYsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKK1NORF9TT0NfREFQTV9QR0EoIkVRMSIsIFdNNTEwMF9FUTFfMSwgV001MTAwX0VRMV9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiRVEyIiwgV001MTAwX0VRMl8xLCBXTTUxMDBfRVEyX0VOQV9TSElGVCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJFUTMiLCBXTTUxMDBfRVEzXzEsIFdNNTEwMF9FUTNfRU5BX1NISUZULCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkVRNCIsIFdNNTEwMF9FUTRfMSwgV001MTAwX0VRNF9FTkFfU0hJRlQsIDAsIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fUEdBKCJEUkMxTCIsIFdNNTEwMF9EUkMxX0NUUkwxLCBXTTUxMDBfRFJDTF9FTkFfU0hJRlQsIDAsCisJCSBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkRSQzFSIiwgV001MTAwX0RSQzFfQ1RSTDEsIFdNNTEwMF9EUkNSX0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorCitTTkRfU09DX0RBUE1fUEdBKCJMSFBGMSIsIFdNNTEwMF9IUExQRjFfMSwgV001MTAwX0xIUEYxX0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTEhQRjIiLCBXTTUxMDBfSFBMUEYyXzEsIFdNNTEwMF9MSFBGMl9FTkFfU0hJRlQsIDAsCisJCSBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkxIUEYzIiwgV001MTAwX0hQTFBGM18xLCBXTTUxMDBfTEhQRjNfRU5BX1NISUZULCAwLAorCQkgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMSFBGNCIsIFdNNTEwMF9IUExQRjRfMSwgV001MTAwX0xIUEY0X0VOQV9TSElGVCwgMCwKKwkJIE5VTEwsIDApLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhFUTEsICJFUTEiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEVRMiwgIkVRMiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoRVEzLCAiRVEzIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhFUTQsICJFUTQiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoRFJDMUwsICJEUkMxTCIpLAorV001MTAwX01JWEVSX1dJREdFVFMoRFJDMVIsICJEUkMxUiIpLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMSwgIkxIUEYxIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMiwgIkxIUEYyIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGMywgIkxIUEYzIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhMSFBGNCwgIkxIUEY0IiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDEsICJBSUYxVFgxIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFgyLCAiQUlGMVRYMiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMVRYMywgIkFJRjFUWDMiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDQsICJBSUYxVFg0IiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFg1LCAiQUlGMVRYNSIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMVRYNiwgIkFJRjFUWDYiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjFUWDcsICJBSUYxVFg3IiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYxVFg4LCAiQUlGMVRYOCIpLAorCitXTTUxMDBfTUlYRVJfV0lER0VUUyhBSUYyVFgxLCAiQUlGMlRYMSIpLAorV001MTAwX01JWEVSX1dJREdFVFMoQUlGMlRYMiwgIkFJRjJUWDIiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoQUlGM1RYMSwgIkFJRjNUWDEiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEFJRjNUWDIsICJBSUYzVFgyIiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEhQT1VUMUwsICJIUE9VVDFMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhIUE9VVDFSLCAiSFBPVVQxUiIpLAorV001MTAwX01JWEVSX1dJREdFVFMoSFBPVVQyTCwgIkhQT1VUMkwiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKEhQT1VUMlIsICJIUE9VVDJSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhIUE9VVDNMLCAiSFBPVVQzTCIpLAorV001MTAwX01JWEVSX1dJREdFVFMoSFBPVVQzUiwgIkhQT1VUM1IiKSwKKworV001MTAwX01JWEVSX1dJREdFVFMoU1BLT1VUTCwgIlNQS09VVEwiKSwKK1dNNTEwMF9NSVhFUl9XSURHRVRTKFNQS09VVFIsICJTUEtPVVRSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQxTCwgIlNQS0RBVDFMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQxUiwgIlNQS0RBVDFSIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQyTCwgIlNQS0RBVDJMIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhTUEtEQVQyUiwgIlNQS0RBVDJSIiksCisKK1dNNTEwMF9NSVhFUl9XSURHRVRTKFBXTTEsICJQV00xIiksCitXTTUxMDBfTUlYRVJfV0lER0VUUyhQV00yLCAiUFdNMiIpLAorCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDFMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDFSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDJMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDJSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDNMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9VVDNSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVRMIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVRSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtEQVQxIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtEQVQyIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJQV00xIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJQV00yIiksCit9OworCisvKiBXZSByZWdpc3RlciBhIF9QT1NUIGV2ZW50IGlmIHdlIGRvbid0IGhhdmUgSVJRIHN1cHBvcnQgc28gd2UgY2FuCisgKiBsb29rIGF0IHRoZSBlcnJvciBzdGF0dXMgZnJvbSB0aGUgQ09ERUMgLSBpZiB3ZSd2ZSBnb3QgdGhlIElSUQorICogaG9va2VkIHVwIHRoZW4gd2Ugd2lsbCBnZXQgcHJvbXB0ZWQgdG8gbG9vayBieSBhbiBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTUxMDBfZGFwbV93aWRnZXRzX25vaXJxW10gPSB7CitTTkRfU09DX0RBUE1fUE9TVCgiUG9zdCIsIHdtNTEwMF9wb3N0X2V2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtNTEwMF9kYXBtX3JvdXRlc1tdID0geworCXsgIklOMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOM0wiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklOM1IiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklONEwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIklONFIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiT1VUMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDNMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQzUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUNEwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDRSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQ1TCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiT1VUNVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIk9VVDZMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJPVVQ2UiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBSUYxUlgxIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlgyIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlgzIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg0IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg1IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg2IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg3IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxUlg4IiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFJRjJSWDEiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJSWDEiLCBOVUxMLCAiREJWREQyIiB9LAorCXsgIkFJRjJSWDIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJSWDIiLCBOVUxMLCAiREJWREQyIiB9LAorCisJeyAiQUlGM1JYMSIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1JYMSIsIE5VTEwsICJEQlZERDMiIH0sCisJeyAiQUlGM1JYMiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1JYMiIsIE5VTEwsICJEQlZERDMiIH0sCisKKwl7ICJBSUYxVFgxIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFgyIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFgzIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg0IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg1IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg2IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg3IiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBSUYxVFg4IiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFJRjJUWDEiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJUWDEiLCBOVUxMLCAiREJWREQyIiB9LAorCXsgIkFJRjJUWDIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFJRjJUWDIiLCBOVUxMLCAiREJWREQyIiB9LAorCisJeyAiQUlGM1RYMSIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1RYMSIsIE5VTEwsICJEQlZERDMiIH0sCisJeyAiQUlGM1RYMiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQUlGM1RYMiIsIE5VTEwsICJEQlZERDMiIH0sCisKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJDUDIiIH0sCisJeyAiTUlDQklBUzIiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIk1JQ0JJQVMzIiwgTlVMTCwgIkNQMiIgfSwKKworCXsgIklOMUwgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjFSIFBHQSIsIE5VTEwsICJDUDIiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIklOMlIgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjNMIFBHQSIsIE5VTEwsICJDUDIiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiQ1AyIiB9LAorCXsgIklONEwgUEdBIiwgTlVMTCwgIkNQMiIgfSwKKwl7ICJJTjRSIFBHQSIsIE5VTEwsICJDUDIiIH0sCisKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiQ1AyIEFjdGl2ZSIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklOM0wgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiQ1AyIEFjdGl2ZSIgfSwKKwl7ICJJTjRMIFBHQSIsIE5VTEwsICJDUDIgQWN0aXZlIiB9LAorCXsgIklONFIgUEdBIiwgTlVMTCwgIkNQMiBBY3RpdmUiIH0sCisKKwl7ICJPVVQxTCIsIE5VTEwsICJDUDEiIH0sCisJeyAiT1VUMVIiLCBOVUxMLCAiQ1AxIiB9LAorCXsgIk9VVDJMIiwgTlVMTCwgIkNQMSIgfSwKKwl7ICJPVVQyUiIsIE5VTEwsICJDUDEiIH0sCisJeyAiT1VUM0wiLCBOVUxMLCAiQ1AxIiB9LAorCXsgIk9VVDNSIiwgTlVMTCwgIkNQMSIgfSwKKworCXsgIlRvbmUgR2VuZXJhdG9yIDEiLCBOVUxMLCAiVE9ORSIgfSwKKwl7ICJUb25lIEdlbmVyYXRvciAyIiwgTlVMTCwgIlRPTkUiIH0sCisKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIklOMVIiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiSU4yTCIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJJTjJSIiB9LAorCXsgIklOM0wgUEdBIiwgTlVMTCwgIklOM0wiIH0sCisJeyAiSU4zUiBQR0EiLCBOVUxMLCAiSU4zUiIgfSwKKwl7ICJJTjRMIFBHQSIsIE5VTEwsICJJTjRMIiB9LAorCXsgIklONFIgUEdBIiwgTlVMTCwgIklONFIiIH0sCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQxTCIsICJIUE9VVDFMIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUMVIiLCAiSFBPVVQxUiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDJMIiwgIkhQT1VUMkwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQyUiIsICJIUE9VVDJSIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUM0wiLCAiSFBPVVQzTCIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDNSIiwgIkhQT1VUM1IiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDRMIiwgIlNQS09VVEwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQ0UiIsICJTUEtPVVRSIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUNUwiLCAiU1BLREFUMUwiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJPVVQ1UiIsICJTUEtEQVQxUiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIk9VVDZMIiwgIlNQS0RBVDJMIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiT1VUNlIiLCAiU1BLREFUMlIiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIlBXTTEgRHJpdmVyIiwgIlBXTTEiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJQV00yIERyaXZlciIsICJQV00yIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgxIiwgIkFJRjFUWDEiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgyIiwgIkFJRjFUWDIiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFgzIiwgIkFJRjFUWDMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg0IiwgIkFJRjFUWDQiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg1IiwgIkFJRjFUWDUiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg2IiwgIkFJRjFUWDYiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg3IiwgIkFJRjFUWDciKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJBSUYxVFg4IiwgIkFJRjFUWDgiKSwKKworCVdNNTEwMF9NSVhFUl9ST1VURVMoIkFJRjJUWDEiLCAiQUlGMlRYMSIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkFJRjJUWDIiLCAiQUlGMlRYMiIpLAorCisJV001MTAwX01JWEVSX1JPVVRFUygiQUlGM1RYMSIsICJBSUYzVFgxIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiQUlGM1RYMiIsICJBSUYzVFgyIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJFUTEiLCAiRVExIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiRVEyIiwgIkVRMiIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkVRMyIsICJFUTMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJFUTQiLCAiRVE0IiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJEUkMxTCIsICJEUkMxTCIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkRSQzFSIiwgIkRSQzFSIiksCisKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJMSFBGMSIsICJMSFBGMSIpLAorCVdNNTEwMF9NSVhFUl9ST1VURVMoIkxIUEYyIiwgIkxIUEYyIiksCisJV001MTAwX01JWEVSX1JPVVRFUygiTEhQRjMiLCAiTEhQRjMiKSwKKwlXTTUxMDBfTUlYRVJfUk9VVEVTKCJMSFBGNCIsICJMSFBGNCIpLAorCisJeyAiSFBPVVQxTCIsIE5VTEwsICJPVVQxTCIgfSwKKwl7ICJIUE9VVDFSIiwgTlVMTCwgIk9VVDFSIiB9LAorCXsgIkhQT1VUMkwiLCBOVUxMLCAiT1VUMkwiIH0sCisJeyAiSFBPVVQyUiIsIE5VTEwsICJPVVQyUiIgfSwKKwl7ICJIUE9VVDNMIiwgTlVMTCwgIk9VVDNMIiB9LAorCXsgIkhQT1VUM1IiLCBOVUxMLCAiT1VUM1IiIH0sCisJeyAiU1BLT1VUTCIsIE5VTEwsICJPVVQ0TCIgfSwKKwl7ICJTUEtPVVRSIiwgTlVMTCwgIk9VVDRSIiB9LAorCXsgIlNQS0RBVDEiLCBOVUxMLCAiT1VUNUwiIH0sCisJeyAiU1BLREFUMSIsIE5VTEwsICJPVVQ1UiIgfSwKKwl7ICJTUEtEQVQyIiwgTlVMTCwgIk9VVDZMIiB9LAorCXsgIlNQS0RBVDIiLCBOVUxMLCAiT1VUNlIiIH0sCisJeyAiUFdNMSIsIE5VTEwsICJQV00xIERyaXZlciIgfSwKKwl7ICJQV00yIiwgTlVMTCwgIlBXTTIgRHJpdmVyIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IHJlZzsKKwlpbnQgdmFsOworfSB3bTUxMDBfcmV2YV9wYXRjaGVzW10gPSB7CisJeyBXTTUxMDBfQVVESU9fSUZfMV8xMCwgMCB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTEsIDEgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzEyLCAyIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8xMywgMyB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTQsIDQgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzE1LCA1IH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8xNiwgNiB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMTcsIDcgfSwKKworCXsgV001MTAwX0FVRElPX0lGXzFfMTgsIDAgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzE5LCAxIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8yMCwgMiB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMjEsIDMgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzIyLCA0IH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMV8yMywgNSB9LAorCXsgV001MTAwX0FVRElPX0lGXzFfMjQsIDYgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8xXzI1LCA3IH0sCisKKwl7IFdNNTEwMF9BVURJT19JRl8yXzEwLCAwIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfMl8xMSwgMSB9LAorCisJeyBXTTUxMDBfQVVESU9fSUZfMl8xOCwgMCB9LAorCXsgV001MTAwX0FVRElPX0lGXzJfMTksIDEgfSwKKworCXsgV001MTAwX0FVRElPX0lGXzNfMTAsIDAgfSwKKwl7IFdNNTEwMF9BVURJT19JRl8zXzExLCAxIH0sCisKKwl7IFdNNTEwMF9BVURJT19JRl8zXzE4LCAwIH0sCisJeyBXTTUxMDBfQVVESU9fSUZfM18xOSwgMSB9LAorfTsKKworc3RhdGljIGludCB3bTUxMDBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQsIGk7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKSB7CisJCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLAorCQkJCQkJCTEpOworCQkJCW1zbGVlcCgyKTsKKwkJCX0KKworCQkJY29kZWMtPmNhY2hlX29ubHkgPSBmYWxzZTsKKworCQkJc3dpdGNoICh3bTUxMDAtPnJldikgeworCQkJY2FzZSAwOgorCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTEsIDB4Myk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDMsIDB4Yyk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDYsIDApOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MjA3LCAweGYwKTsKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDIwOCwgMHgzYyk7CisJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgyMDksIDApOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MjExLCAweDIwZDgpOworCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTEsIDApOworCisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9yZXZhX3BhdGNoZXMpOworCQkJCSAgICAgaSsrKQorCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQkJICAgICAgd201MTAwX3JldmFfcGF0Y2hlc1tpXS5yZWcsCisJCQkJCQkgICAgICB3bTUxMDBfcmV2YV9wYXRjaGVzW2ldLnZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKQorCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLCAwKTsKKwkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkJICAgICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTUxMDBfZGFpX3RvX2Jhc2Uoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzFfMSAtIDE7CisJY2FzZSAxOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzJfMSAtIDE7CisJY2FzZSAyOgorCQlyZXR1cm4gV001MTAwX0FVRElPX0lGXzNfMSAtIDE7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB3bTUxMDBfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCWludCBscmNsaywgYmNsaywgbWFzaywgYmFzZTsKKworCWJhc2UgPSB3bTUxMDBfZGFpX3RvX2Jhc2UoZGFpKTsKKwlpZiAoYmFzZSA8IDApCisJCXJldHVybiBiYXNlOworCisJbHJjbGsgPSAwOworCWJjbGsgPSAwOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCW1hc2sgPSAwOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQltYXNrID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCW1hc2sgPSAyOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJbWFzayA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIERBSSBmb3JtYXQgJWRcbiIsCisJCQlmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJbHJjbGsgfD0gV001MTAwX0FJRjFUWF9MUkNMS19NU1RSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJCWJjbGsgfD0gV001MTAwX0FJRjFfQkNMS19NU1RSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWxyY2xrIHw9IFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUjsKKwkJYmNsayB8PSBXTTUxMDBfQUlGMV9CQ0xLX01TVFI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIG1hc3RlciBtb2RlICVkXG4iLAorCQkJZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJYmNsayB8PSBXTTUxMDBfQUlGMV9CQ0xLX0lOVjsKKwkJbHJjbGsgfD0gV001MTAwX0FJRjFUWF9MUkNMS19JTlY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWJjbGsgfD0gV001MTAwX0FJRjFfQkNMS19JTlY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWxyY2xrIHw9IFdNNTEwMF9BSUYxVFhfTFJDTEtfSU5WOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0FJRjFfQkNMS19NU1RSIHwKKwkJCSAgICBXTTUxMDBfQUlGMV9CQ0xLX0lOViwgYmNsayk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDIsIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUiB8CisJCQkgICAgV001MTAwX0FJRjFUWF9MUkNMS19JTlYsIGxyY2xrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMywgV001MTAwX0FJRjFUWF9MUkNMS19NU1RSIHwKKwkJCSAgICBXTTUxMDBfQUlGMVRYX0xSQ0xLX0lOViwgbHJjbGspOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA1LCBXTTUxMDBfQUlGMV9GTVRfTUFTSywgbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBXTTUxMDBfTlVNX0JDTEtfUkFURVMgMTkKKworc3RhdGljIGludCB3bTUxMDBfYmNsa19yYXRlc19kYXRbV001MTAwX05VTV9CQ0xLX1JBVEVTXSA9IHsKKwkzMjAwMCwKKwk0ODAwMCwKKwk2NDAwMCwKKwk5NjAwMCwKKwkxMjgwMDAsCisJMTkyMDAwLAorCTI1NjAwMCwKKwkzODQwMDAsCisJNTEyMDAwLAorCTc2ODAwMCwKKwkxMDI0MDAwLAorCTE1MzYwMDAsCisJMjA0ODAwMCwKKwkzMDcyMDAwLAorCTQwOTYwMDAsCisJNjE0NDAwMCwKKwk4MTkyMDAwLAorCTEyMjg4MDAwLAorCTI0NTc2MDAwLAorfTsKKworc3RhdGljIGludCB3bTUxMDBfYmNsa19yYXRlc19jZFtXTTUxMDBfTlVNX0JDTEtfUkFURVNdID0geworCTI5NDAwLAorCTQ0MTAwLAorCTU4ODAwLAorCTg4MjAwLAorCTExNzYwMCwKKwkxNzY0MDAsCisJMjM1MjAwLAorCTM1MjgwMCwKKwk0NzA0MDAsCisJNzA1NjAwLAorCTk0MDgwMCwKKwkxNDExMjAwLAorCTE4ODE2MDAsCisJMjg4MjQwMCwKKwkzNzYzMjAwLAorCTU2NDQ4MDAsCisJNzUyNjQwMCwKKwkxMTI4OTYwMCwKKwkyMjU3OTYwMCwKK307CisKK3N0YXRpYyBpbnQgd201MTAwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJYm9vbCBhc3luYyA9IHdtNTEwMC0+YWlmX2FzeW5jW2RhaS0+aWRdOworCWludCBpLCBiYXNlLCBiY2xrLCBhaWZfcmF0ZSwgbHJjbGssIHdsLCBmbCwgc3I7CisJaW50ICpiY2xrX3JhdGVzOworCisJYmFzZSA9IHdtNTEwMF9kYWlfdG9fYmFzZShkYWkpOworCWlmIChiYXNlIDwgMCkKKwkJcmV0dXJuIGJhc2U7CisKKwkvKiBEYXRhIHNpemVzIGlmIG5vdCB1c2luZyBURE0gKi8KKwl3bCA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJaWYgKHdsIDwgMCkKKwkJcmV0dXJuIHdsOworCWZsID0gc25kX3NvY19wYXJhbXNfdG9fZnJhbWVfc2l6ZShwYXJhbXMpOworCWlmIChmbCA8IDApCisJCXJldHVybiBmbDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIldvcmQgbGVuZ3RoICVkIGJpdHMsIGZyYW1lIGxlbmd0aCAlZCBiaXRzXG4iLAorCQl3bCwgZmwpOworCisJLyogVGFyZ2V0IEJDTEsgcmF0ZSAqLworCWJjbGsgPSBzbmRfc29jX3BhcmFtc190b19iY2xrKHBhcmFtcyk7CisJaWYgKGJjbGsgPCAwKQorCQlyZXR1cm4gYmNsazsKKworCS8qIFJvb3QgZm9yIEJDTEsgZGVwZW5kcyBvbiBTWVMvQVNZTkNDTEsgKi8KKwlpZiAoIWFzeW5jKSB7CisJCWFpZl9yYXRlID0gd201MTAwLT5zeXNjbGs7CisJCXNyID0gd201MTAwX2FsbG9jX3NyKGNvZGVjLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJaWYgKHNyIDwgMCkKKwkJCXJldHVybiBzcjsKKwl9IGVsc2UgeworCQkvKiBJZiB3ZSdyZSBpbiBBU1lOQ0NMSyBzZXQgdGhlIEFTWU5DIHNhbXBsZSByYXRlICovCisJCWFpZl9yYXRlID0gd201MTAwLT5hc3luY2NsazsKKwkJc3IgPSAzOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMF9zcl9jb2RlKTsgaSsrKQorCQkJaWYgKHBhcmFtc19yYXRlKHBhcmFtcykgPT0gd201MTAwX3NyX2NvZGVbaV0pCisJCQkJYnJlYWs7CisJCWlmIChpID09IEFSUkFZX1NJWkUod201MTAwX3NyX2NvZGUpKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHJhdGUgJWRIem4iLAorCQkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBUT0RPOiBXZSBzaG91bGQgcmVhbGx5IGNoZWNrIGZvciBzeW1tZXRyeSAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfQ0xPQ0tJTkdfOCwKKwkJCQkgICAgV001MTAwX0FTWU5DX1NBTVBMRV9SQVRFX01BU0ssIGkpOworCX0KKworCWlmICghYWlmX3JhdGUpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgaGFzIG5vIHJhdGUgc2V0XG4iLAorCQkJYXN5bmMgPyAiQVNZTkNDTEsiIDogIlNZU0NMSyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJUYXJnZXQgQkNMSyBpcyAlZEh6LCB1c2luZyAlZEh6ICVzXG4iLAorCQliY2xrLCBhaWZfcmF0ZSwgYXN5bmMgPyAiQVNZTkNDTEsiIDogIlNZU0NMSyIpOworCisJaWYgKGFpZl9yYXRlICUgNDAwMCkKKwkJYmNsa19yYXRlcyA9IHdtNTEwMF9iY2xrX3JhdGVzX2NkOworCWVsc2UKKwkJYmNsa19yYXRlcyA9IHdtNTEwMF9iY2xrX3JhdGVzX2RhdDsKKworCWZvciAoaSA9IDA7IGkgPCBXTTUxMDBfTlVNX0JDTEtfUkFURVM7IGkrKykKKwkJaWYgKGJjbGtfcmF0ZXNbaV0gPj0gYmNsayAmJiAoYmNsa19yYXRlc1tpXSAlIGJjbGsgPT0gMCkpCisJCQlicmVhazsKKwlpZiAoaSA9PSBXTTUxMDBfTlVNX0JDTEtfUkFURVMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIk5vIHZhbGlkIEJDTEsgZm9yICVkSHogZm91bmQgZnJvbSAlZEh6ICVzXG4iLAorCQkJYmNsaywgYWlmX3JhdGUsIGFzeW5jID8gIkFTWU5DQ0xLIiA6ICJTWVNDTEsiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmNsayA9IGk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU2V0dGluZyAlZEh6IEJDTEtcbiIsIGJjbGtfcmF0ZXNbYmNsa10pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAxLCBXTTUxMDBfQUlGMV9CQ0xLX0ZSRVFfTUFTSywgYmNsayk7CisKKwlscmNsayA9IGJjbGtfcmF0ZXNbYmNsa10gLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWRldl9kYmcoY29kZWMtPmRldiwgIlNldHRpbmcgJWRIeiBMUkNMS1xuIiwgYmNsa19yYXRlc1tiY2xrXSAvIGxyY2xrKTsKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyB8fAorCSAgICB3bTUxMDAtPmFpZl9zeW1tZXRyaWNbZGFpLT5pZF0pCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA3LAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX0JDUEZfTUFTSywgbHJjbGspOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDYsCisJCQkJICAgIFdNNTEwMF9BSUYxVFhfQkNQRl9NQVNLLCBscmNsayk7CisKKwlpID0gKHdsIDw8IFdNNTEwMF9BSUYxVFhfV0xfU0hJRlQpIHwgZmw7CisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA5LAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX1dMX01BU0sgfAorCQkJCSAgICBXTTUxMDBfQUlGMVJYX1NMT1RfTEVOX01BU0ssIGkpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDgsCisJCQkJICAgIFdNNTEwMF9BSUYxVFhfV0xfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9BSUYxVFhfU0xPVF9MRU5fTUFTSywgaSk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgNCwgV001MTAwX0FJRjFfUkFURV9NQVNLLCBzcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgd201MTAwX2RhaV9vcHMgPSB7CisJLnNldF9mbXQgPSB3bTUxMDBfc2V0X2ZtdCwKKwkuaHdfcGFyYW1zID0gd201MTAwX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgd201MTAwX3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgY2xrX2lkLAorCQkJICAgICBpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCAqcmF0ZV9zdG9yZTsKKwlpbnQgZnZhbCwgYXVkaW9fcmF0ZSwgcmV0LCByZWc7CisKKwlzd2l0Y2ggKGNsa19pZCkgeworCWNhc2UgV001MTAwX0NMS19TWVNDTEs6CisJCXJlZyA9IFdNNTEwMF9DTE9DS0lOR18zOworCQlyYXRlX3N0b3JlID0gJndtNTEwMC0+c3lzY2xrOworCQlicmVhazsKKwljYXNlIFdNNTEwMF9DTEtfQVNZTkNDTEs6CisJCXJlZyA9IFdNNTEwMF9DTE9DS0lOR183OworCQlyYXRlX3N0b3JlID0gJndtNTEwMC0+YXN5bmNjbGs7CisJCWJyZWFrOworCWNhc2UgV001MTAwX0NMS18zMktIWjoKKwkJLyogVGhlIDMya0h6IGNsb2NrIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXJzICovCisJCXN3aXRjaCAoc291cmNlKSB7CisJCWNhc2UgV001MTAwX0NMS1NSQ19NQ0xLMToKKwkJY2FzZSBXTTUxMDBfQ0xLU1JDX01DTEsyOgorCQljYXNlIFdNNTEwMF9DTEtTUkNfU1lTQ0xLOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0NMT0NLSU5HXzEsCisJCQkJCSAgICBXTTUxMDBfQ0xLXzMyS19TUkNfTUFTSywKKwkJCQkJICAgIHNvdXJjZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBXTTUxMDBfQ0xLX0FJRjE6CisJY2FzZSBXTTUxMDBfQ0xLX0FJRjI6CisJY2FzZSBXTTUxMDBfQ0xLX0FJRjM6CisJCS8qIE5vdCByZWFsIGNsb2NrcywgcmVjb3JkIHdoaWNoIGNsb2NrIGRvbWFpbiB0aGV5J3JlIGluICovCisJCXN3aXRjaCAoc291cmNlKSB7CisJCWNhc2UgV001MTAwX0NMS1NSQ19TWVNDTEs6CisJCQl3bTUxMDAtPmFpZl9hc3luY1tjbGtfaWQgLSAxXSA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgV001MTAwX0NMS1NSQ19BU1lOQ0NMSzoKKwkJCXdtNTEwMC0+YWlmX2FzeW5jW2Nsa19pZCAtIDFdID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBzb3VyY2UgJWRcbiIsIHNvdXJjZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQkKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdNNTEwMF9DTEtfT1BDTEs6CisJCXN3aXRjaCAoZnJlcSkgeworCQljYXNlIDU2NDQ4MDA6CisJCWNhc2UgNjE0NDAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAxMTI4OTYwMDoKKwkJY2FzZSAxMjI4ODAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJY2FzZSAyMjU3OTIwMDoKKwkJY2FzZSAyNDU3NjAwMDoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0dQSU9fMSwKKwkJCQkJICAgIFdNNTEwMF9PUENMS19TRUxfTUFTSywgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIE9QQ0xLICVkSHpcbiIsCisJCQkJZnJlcSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gY2xvY2sgJWRcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBXTTUxMDBfQ0xLU1JDX1NZU0NMSzoKKwljYXNlIFdNNTEwMF9DTEtTUkNfQVNZTkNDTEs6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDU2NDQ4MDA6CisJY2FzZSA2MTQ0MDAwOgorCQlmdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxMTI4OTYwMDoKKwljYXNlIDEyMjg4MDAwOgorCQlmdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSAyMjU3OTIwMDoKKwljYXNlIDI0NTc2MDAwOgorCQlmdmFsID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBjbG9jayByYXRlOiAlZFxuIiwgZnJlcSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZnJlcSkgeworCWNhc2UgNTY0NDgwMDoKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMjI1NzkyMDA6CisJCWF1ZGlvX3JhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CisKKwljYXNlIDYxNDQwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDI0NTc2MDAwOgorCQlhdWRpb19yYXRlID0gNDgwMDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWF1ZGlvX3JhdGUgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiBUT0RPOiBDaGVjayBpZiBNQ0xLcyBhcmUgaW4gdXNlIGFuZCBlbmFibGUvZGlzYWJsZSBwdWxscyB0bworCSAqIG1hdGNoLgorCSAqLworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBXTTUxMDBfU1lTQ0xLX0ZSRVFfTUFTSyB8CisJCQkgICAgV001MTAwX1NZU0NMS19TUkNfTUFTSywKKwkJCSAgICBmdmFsIDw8IFdNNTEwMF9TWVNDTEtfRlJFUV9TSElGVCB8IHNvdXJjZSk7CisKKwkvKiBJZiB0aGlzIGlzIFNZU0NMSyB0aGVuIGNvbmZpZ3VyZSB0aGUgY2xvY2sgcmF0ZSBmb3IgdGhlCisJICogaW50ZXJuYWwgYXVkaW8gZnVuY3Rpb25zIHRvIHRoZSBuYXR1cmFsIHNhbXBsZSByYXRlIGZvcgorCSAqIHRoaXMgY2xvY2sgcmF0ZS4KKwkgKi8KKwlpZiAoY2xrX2lkID09IFdNNTEwMF9DTEtfU1lTQ0xLKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlNldHRpbmcgcHJpbWFyeSBhdWRpbyByYXRlIHRvICVkSHoiLAorCQkJYXVkaW9fcmF0ZSk7CisJCWlmICgwICYmICpyYXRlX3N0b3JlKQorCQkJd201MTAwX2ZyZWVfc3IoY29kZWMsIGF1ZGlvX3JhdGUpOworCQlyZXQgPSB3bTUxMDBfYWxsb2Nfc3IoY29kZWMsIGF1ZGlvX3JhdGUpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiUHJpbWFyeSBhdWRpbyBzbG90IGlzICVkXG4iLAorCQkJCSByZXQpOworCX0KKworCSpyYXRlX3N0b3JlID0gZnJlcTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgX2ZsbF9kaXYgeworCXUxNiBmbGxfZnJhdGlvOworCXUxNiBmbGxfb3V0ZGl2OworCXUxNiBmbGxfcmVmY2xrX2RpdjsKKwl1MTYgbjsKKwl1MTYgdGhldGE7CisJdTE2IGxhbWJkYTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtaW47CisJdW5zaWduZWQgaW50IG1heDsKKwl1MTYgZmxsX2ZyYXRpbzsKKwlpbnQgcmF0aW87Cit9IGZsbF9mcmF0aW9zW10gPSB7CisJeyAgICAgICAwLCAgICA2NDAwMCwgNCwgMTYgfSwKKwl7ICAgNjQwMDAsICAgMTI4MDAwLCAzLCAgOCB9LAorCXsgIDEyODAwMCwgICAyNTYwMDAsIDIsICA0IH0sCisJeyAgMjU2MDAwLCAgMTAwMDAwMCwgMSwgIDIgfSwKKwl7IDEwMDAwMDAsIDEzNTAwMDAwLCAwLCAgMSB9LAorfTsKKworc3RhdGljIGludCBmbGxfZmFjdG9ycyhzdHJ1Y3QgX2ZsbF9kaXYgKmZsbF9kaXYsIHVuc2lnbmVkIGludCBGcmVmLAorCQkgICAgICAgdW5zaWduZWQgaW50IEZvdXQpCit7CisJdW5zaWduZWQgaW50IHRhcmdldDsKKwl1bnNpZ25lZCBpbnQgZGl2OworCXVuc2lnbmVkIGludCBmcmF0aW8sIGdjZF9mbGw7CisJaW50IGk7CisKKwkvKiBGcmVmIG11c3QgYmUgPD0xMy41TUh6ICovCisJZGl2ID0gMTsKKwlmbGxfZGl2LT5mbGxfcmVmY2xrX2RpdiA9IDA7CisJd2hpbGUgKChGcmVmIC8gZGl2KSA+IDEzNTAwMDAwKSB7CisJCWRpdiAqPSAyOworCQlmbGxfZGl2LT5mbGxfcmVmY2xrX2RpdisrOworCisJCWlmIChkaXYgPiA4KSB7CisJCQlwcl9lcnIoIkNhbid0IHNjYWxlICVkTUh6IGlucHV0IGRvd24gdG8gPD0xMy41TUh6XG4iLAorCQkJICAgICAgIEZyZWYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiRkxMIEZyZWY9JXUgRm91dD0ldVxuIiwgRnJlZiwgRm91dCk7CisKKwkvKiBBcHBseSB0aGUgZGl2aXNpb24gZm9yIG91ciByZW1haW5pbmcgY2FsY3VsYXRpb25zICovCisJRnJlZiAvPSBkaXY7CisKKwkvKiBGdmNvIHNob3VsZCBiZSA5MC0xMDBNSHo7IGRvbid0IGNoZWNrIHRoZSB1cHBlciBib3VuZCAqLworCWRpdiA9IDI7CisJd2hpbGUgKEZvdXQgKiBkaXYgPCA5MDAwMDAwMCkgeworCQlkaXYrKzsKKwkJaWYgKGRpdiA+IDY0KSB7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBmaW5kIEZMTF9PVVRESVYgZm9yIEZvdXQ9JXVIelxuIiwKKwkJCSAgICAgICBGb3V0KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXRhcmdldCA9IEZvdXQgKiBkaXY7CisJZmxsX2Rpdi0+ZmxsX291dGRpdiA9IGRpdiAtIDE7CisKKwlwcl9kZWJ1ZygiRkxMIEZ2Y289JWRIelxuIiwgdGFyZ2V0KTsKKworCS8qIEZpbmQgYW4gYXBwcm9wcmFpdGUgRkxMX0ZSQVRJTyBhbmQgZmFjdG9yIGl0IG91dCBvZiB0aGUgdGFyZ2V0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmxsX2ZyYXRpb3MpOyBpKyspIHsKKwkJaWYgKGZsbF9mcmF0aW9zW2ldLm1pbiA8PSBGcmVmICYmIEZyZWYgPD0gZmxsX2ZyYXRpb3NbaV0ubWF4KSB7CisJCQlmbGxfZGl2LT5mbGxfZnJhdGlvID0gZmxsX2ZyYXRpb3NbaV0uZmxsX2ZyYXRpbzsKKwkJCWZyYXRpbyA9IGZsbF9mcmF0aW9zW2ldLnJhdGlvOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShmbGxfZnJhdGlvcykpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZmluZCBGTExfRlJBVElPIGZvciBGcmVmPSV1SHpcbiIsIEZyZWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmbGxfZGl2LT5uID0gdGFyZ2V0IC8gKGZyYXRpbyAqIEZyZWYpOworCisJaWYgKHRhcmdldCAlIEZyZWYgPT0gMCkgeworCQlmbGxfZGl2LT50aGV0YSA9IDA7CisJCWZsbF9kaXYtPmxhbWJkYSA9IDA7CisJfSBlbHNlIHsKKwkJZ2NkX2ZsbCA9IGdjZCh0YXJnZXQsIGZyYXRpbyAqIEZyZWYpOworCisJCWZsbF9kaXYtPnRoZXRhID0gKHRhcmdldCAtIChmbGxfZGl2LT5uICogZnJhdGlvICogRnJlZikpCisJCQkvIGdjZF9mbGw7CisJCWZsbF9kaXYtPmxhbWJkYSA9IChmcmF0aW8gKiBGcmVmKSAvIGdjZF9mbGw7CisJfQorCisJcHJfZGVidWcoIkZMTCBOPSV4IFRIRVRBPSV4IExBTUJEQT0leFxuIiwKKwkJIGZsbF9kaXYtPm4sIGZsbF9kaXYtPnRoZXRhLCBmbGxfZGl2LT5sYW1iZGEpOworCXByX2RlYnVnKCJGTExfRlJBVElPPSV4KCVkKSBGTExfT1VURElWPSV4IEZMTF9SRUZDTEtfRElWPSV4XG4iLAorCQkgZmxsX2Rpdi0+ZmxsX2ZyYXRpbywgZnJhdGlvLCBmbGxfZGl2LT5mbGxfb3V0ZGl2LAorCQkgZmxsX2Rpdi0+ZmxsX3JlZmNsa19kaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3NldF9mbGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZmxsX2lkLCBpbnQgc291cmNlLAorCQkJICB1bnNpZ25lZCBpbnQgRnJlZiwgdW5zaWduZWQgaW50IEZvdXQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgX2ZsbF9kaXYgZmFjdG9yczsKKwlzdHJ1Y3Qgd201MTAwX2ZsbCAqZmxsOworCWludCByZXQsIGJhc2UsIGxvY2ssIGksIHRpbWVvdXQ7CisKKwlzd2l0Y2ggKGZsbF9pZCkgeworCWNhc2UgV001MTAwX0ZMTDE6CisJCWZsbCA9ICZ3bTUxMDAtPmZsbFswXTsKKwkJYmFzZSA9IFdNNTEwMF9GTEwxX0NPTlRST0xfMSAtIDE7CisJCWxvY2sgPSBXTTUxMDBfRkxMMV9MT0NLX1NUUzsKKwkJYnJlYWs7CisJY2FzZSBXTTUxMDBfRkxMMjoKKwkJZmxsID0gJndtNTEwMC0+ZmxsWzFdOworCQliYXNlID0gV001MTAwX0ZMTDJfQ09OVFJPTF8yIC0gMTsKKwkJbG9jayA9IFdNNTEwMF9GTEwyX0xPQ0tfU1RTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEZMTCAlZFxuIixmbGxfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIUZvdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMJWQgZGlzYWJsZWQiLCBmbGxfaWQpOworCQlmbGwtPmZvdXQgPSAwOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0ZMTDFfRU5BLCAwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIFdNNTEwMF9GTExfU1JDX01DTEsxOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfTUNMSzI6CisJY2FzZSBXTTUxMDBfRkxMX1NSQ19GTEwxOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfRkxMMjoKKwljYXNlIFdNNTEwMF9GTExfU1JDX0FJRjFCQ0xLOgorCWNhc2UgV001MTAwX0ZMTF9TUkNfQUlGMkJDTEs6CisJY2FzZSBXTTUxMDBfRkxMX1NSQ19BSUYzQkNMSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBGTEwgc291cmNlICVkXG4iLCBzb3VyY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBmbGxfZmFjdG9ycygmZmFjdG9ycywgRnJlZiwgRm91dCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSBGTEwgd2hpbGUgd2UgcmVjb25maWd1cmUgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiYXNlICsgMSwgV001MTAwX0ZMTDFfRU5BLCAwKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAyLAorCQkJICAgIFdNNTEwMF9GTEwxX09VVERJVl9NQVNLIHwgV001MTAwX0ZMTDFfRlJBVElPX01BU0ssCisJCQkgICAgKGZhY3RvcnMuZmxsX291dGRpdiA8PCBXTTUxMDBfRkxMMV9PVVRESVZfU0hJRlQpIHwKKwkJCSAgICBmYWN0b3JzLmZsbF9mcmF0aW8pOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyAzLCBXTTUxMDBfRkxMMV9USEVUQV9NQVNLLAorCQkJICAgIGZhY3RvcnMudGhldGEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA1LCBXTTUxMDBfRkxMMV9OX01BU0ssIGZhY3RvcnMubik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDYsCisJCQkgICAgV001MTAwX0ZMTDFfUkVGQ0xLX0RJVl9NQVNLIHwKKwkJCSAgICBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX01BU0ssCisJCQkgICAgKGZhY3RvcnMuZmxsX3JlZmNsa19kaXYKKwkJCSAgICAgPDwgV001MTAwX0ZMTDFfUkVGQ0xLX0RJVl9TSElGVCkgfCBzb3VyY2UpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJhc2UgKyA3LCBXTTUxMDBfRkxMMV9MQU1CREFfTUFTSywKKwkJCSAgICBmYWN0b3JzLmxhbWJkYSk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBjb21wbGV0aW9ucyAqLworCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZmbGwtPmxvY2spOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYmFzZSArIDEsIFdNNTEwMF9GTEwxX0VOQSwgV001MTAwX0ZMTDFfRU5BKTsKKworCWlmIChpMmMtPmlycSkKKwkJdGltZW91dCA9IDI7CisJZWxzZQorCQl0aW1lb3V0ID0gNTA7CisKKwkvKiBQb2xsIGZvciB0aGUgbG9jazsgd2lsbCB1c2UgaW50ZXJydXB0IHdoZW4gd2UgY2FuIHRlc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCWlmIChpMmMtPmlycSkgeworCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmbGwtPmxvY2ssCisJCQkJCQkJICBtc2Vjc190b19qaWZmaWVzKDI1KSk7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCisJCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywKKwkJCQkgICBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfMyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIkZhaWxlZCB0byByZWFkIEZMTCBzdGF0dXM6ICVkXG4iLAorCQkJCXJldCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmV0ICYgbG9jaykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZMTCVkIGxvY2sgdGltZWQgb3V0XG4iLCBmbGxfaWQpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlmbGwtPnNyYyA9IHNvdXJjZTsKKwlmbGwtPmZyZWYgPSBGcmVmOworCWZsbC0+Zm91dCA9IEZvdXQ7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwlZCBydW5uaW5nICVkSHotPiVkSHpcbiIsIGZsbF9pZCwKKwkJRnJlZiwgRm91dCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWN0dWFsbHkgZ28gbXVjaCBoaWdoZXIgKi8KKyNkZWZpbmUgV001MTAwX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisKKyNkZWZpbmUgV001MTAwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCisJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTUxMDBfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTUxMDAtYWlmMSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBXTTUxMDBfUkFURVMsCisJCQkuZm9ybWF0cyA9IFdNNTEwMF9GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCSAuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKKwkJCSAuY2hhbm5lbHNfbWluID0gMiwKKwkJCSAuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCSAucmF0ZXMgPSBXTTUxMDBfUkFURVMsCisJCQkgLmZvcm1hdHMgPSBXTTUxMDBfRk9STUFUUywKKwkJIH0sCisJCS5vcHMgPSAmd201MTAwX2RhaV9vcHMsCisJfSwKKwl7CisJCS5uYW1lID0gIndtNTEwMC1haWYyIiwKKwkJLmlkID0gMSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFdNNTEwMF9SQVRFUywKKwkJCS5mb3JtYXRzID0gV001MTAwX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJIC5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAorCQkJIC5jaGFubmVsc19taW4gPSAyLAorCQkJIC5jaGFubmVsc19tYXggPSAyLAorCQkJIC5yYXRlcyA9IFdNNTEwMF9SQVRFUywKKwkJCSAuZm9ybWF0cyA9IFdNNTEwMF9GT1JNQVRTLAorCQkgfSwKKwkJLm9wcyA9ICZ3bTUxMDBfZGFpX29wcywKKwl9LAorCXsKKwkJLm5hbWUgPSAid201MTAwLWFpZjMiLAorCQkuaWQgPSAyLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gV001MTAwX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBXTTUxMDBfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkgLnN0cmVhbV9uYW1lID0gIkFJRjMgQ2FwdHVyZSIsCisJCQkgLmNoYW5uZWxzX21pbiA9IDIsCisJCQkgLmNoYW5uZWxzX21heCA9IDIsCisJCQkgLnJhdGVzID0gV001MTAwX1JBVEVTLAorCQkJIC5mb3JtYXRzID0gV001MTAwX0ZPUk1BVFMsCisJCSB9LAorCQkub3BzID0gJndtNTEwMF9kYWlfb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IHdtNTEwMF9kaWdfdnVbXSA9IHsKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzFMLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIsCisJV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJSLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM0wsCisJV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8zUiwKKwlXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzRMLAorCVdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIsCisKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMVIsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8yTCwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJSLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM0wsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zUiwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNFIsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV81TCwKKwlXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSLAorCVdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNkwsCisJV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82UiwKK307CisKK3N0YXRpYyB2b2lkIHdtNTEwMF9zZXRfZGV0ZWN0X21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgdGhlX21vZGUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgd201MTAwX2phY2tfbW9kZSAqbW9kZSA9ICZ3bTUxMDAtPnBkYXRhLmphY2tfbW9kZXNbdGhlX21vZGVdOworCisJQlVHX09OKHRoZV9tb2RlID49IEFSUkFZX1NJWkUod201MTAwLT5wZGF0YS5qYWNrX21vZGVzKSk7CisKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLmhwX3BvbCwgbW9kZS0+aHBfcG9sKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEsCisJCQkgICAgV001MTAwX0FDQ0RFVF9CSUFTX1NSQ19NQVNLIHwKKwkJCSAgICBXTTUxMDBfQUNDREVUX1NSQywKKwkJCSAgICAobW9kZS0+YmlhcyA8PCBXTTUxMDBfQUNDREVUX0JJQVNfU1JDX1NISUZUKSB8CisJCQkgICAgbW9kZS0+bWljZF9zcmMgPDwgV001MTAwX0FDQ0RFVF9TUkNfU0hJRlQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSVNDX0NPTlRST0wsCisJCQkgICAgV001MTAwX0hQQ09NX1NSQywKKwkJCSAgICBtb2RlLT5taWNkX3NyYyA8PCBXTTUxMDBfSFBDT01fU1JDX1NISUZUKTsKKworCXdtNTEwMC0+amFja19tb2RlID0gdGhlX21vZGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJTZXQgbWljcm9waG9uZSBwb2xhcml0eSB0byAlZFxuIiwKKwkJd201MTAwLT5qYWNrX21vZGUpOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfbWljZF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbDsKKworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX01JQ19ERVRFQ1RfMyk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGV2ZW50OiAleFxuIiwgdmFsKTsKKworCWlmICghKHZhbCAmIFdNNTEwMF9BQ0NERVRfVkFMSUQpKSB7CisJCWRldl93YXJuKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGRldGVjdGlvbiBzdGF0ZSBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vIGFjY2Vzc29yeSwgcmVzZXQgZXZlcnl0aGluZyBhbmQgcmVwb3J0IHJlbW92YWwgKi8KKwlpZiAoISh2YWwgJiBXTTUxMDBfQUNDREVUX1NUUykpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSmFjayByZW1vdmFsIGRldGVjdGVkXG4iKTsKKwkJd201MTAwLT5qYWNrX21pYyA9IGZhbHNlOworCQl3bTUxMDAtPmphY2tfZGV0ZWN0aW5nID0gdHJ1ZTsKKwkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIDAsCisJCQkJICAgIFNORF9KQUNLX0xJTkVPVVQgfCBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCQkgICAgU05EX0pBQ0tfQlROXzApOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLLAorCQkJCSAgICBXTTUxMDBfQUNDREVUX1JBVEVfTUFTSyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB0aGUgbWVhc3VyZW1lbnQgaXMgdmVyeSBoaWdoIHdlJ3ZlIGdvdCBhIG1pY3JvcGhvbmUsCisJICogZWl0aGVyIHdlIGp1c3QgZGV0ZWN0ZWQgb25lIG9yIGlmIHdlIGFscmVhZHkgcmVwb3J0ZWQgdGhlbgorCSAqIHdlJ3ZlIGdvdCBhIGJ1dHRvbiByZWxlYXNlIGV2ZW50LgorCSAqLworCWlmICh2YWwgJiAweDQwMCkgeworCQlpZiAod201MTAwLT5qYWNrX2RldGVjdGluZykgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljcm9waG9uZSBkZXRlY3RlZFxuIik7CisJCQl3bTUxMDAtPmphY2tfbWljID0gdHJ1ZTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod201MTAwLT5qYWNrLAorCQkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCwKKwkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCk7CisKKwkJCS8qIEluY3JlYXNlIHBvbGwgcmF0ZSB0byBnaXZlIGJldHRlciByZXNwb25zaXZlbmVzcworCQkJICogZm9yIGJ1dHRvbnMgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJCSAgICBXTTUxMDBfQUNDREVUX1JBVEVfTUFTSywKKwkJCQkJICAgIDUgPDwgV001MTAwX0FDQ0RFVF9SQVRFX1NISUZUKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pYyBidXR0b24gdXBcbiIpOworCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIDAsIFNORF9KQUNLX0JUTl8wKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBkZXRlY3RlZCBhIGxvd2VyIGltcGVkZW5jZSBkdXJpbmcgaW5pdGlhbCBzdGFydHVwCisJICogdGhlbiB3ZSBwcm9iYWJseSBoYXZlIHRoZSB3cm9uZyBwb2xhcml0eSwgZmxpcCBpdC4gIERvbid0CisJICogZG8gdGhpcyBmb3IgdGhlIGxvd2VzdCBpbXBlZGVuY2VzIHRvIHNwZWVkIHVwIGRldGVjdGlvbiBvZgorCSAqIHBsYWluIGhlYWRwaG9uZXMuCisJICovCisJaWYgKHdtNTEwMC0+amFja19kZXRlY3RpbmcgJiYgKHZhbCAmIDB4M2Y4KSkgeworCQl3bTUxMDBfc2V0X2RldGVjdF9tb2RlKGNvZGVjLCAhd201MTAwLT5qYWNrX21vZGUpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBEb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJ1dHRvbnMsIGp1c3QgcmVwb3J0IGFueSBsb3cKKwkgKiBpbXBlZGVuY2UgYXMgQlROXzAuCisJICovCisJaWYgKHZhbCAmIDB4M2ZjKSB7CisJCWlmICh3bTUxMDAtPmphY2tfbWljKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgYnV0dG9uIGRldGVjdGVkXG4iKTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod201MTAwLT5qYWNrLCBTTkRfSkFDS19CVE5fMCwKKwkJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwkJfSBlbHNlIGlmICh3bTUxMDAtPmphY2tfZGV0ZWN0aW5nKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJIZWFkcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTUxMDAtPmphY2ssIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSk7CisKKwkJCS8qIEluY3JlYXNlIHRoZSBkZXRlY3Rpb24gcmF0ZSBhIGJpdCBmb3IKKwkJCSAqIHJlc3BvbnNpdmVuZXNzLgorCQkJICovCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfTUlDX0RFVEVDVF8xLAorCQkJCQkgICAgV001MTAwX0FDQ0RFVF9SQVRFX01BU0ssCisJCQkJCSAgICA3IDw8IFdNNTEwMF9BQ0NERVRfUkFURV9TSElGVCk7CisJCX0KKwl9Cit9CisKK2ludCB3bTUxMDBfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGphY2spIHsKKwkJd201MTAwLT5qYWNrID0gamFjazsKKwkJd201MTAwLT5qYWNrX2RldGVjdGluZyA9IHRydWU7CisKKwkJd201MTAwX3NldF9kZXRlY3RfbW9kZShjb2RlYywgMCk7CisKKwkJLyogU2xvd2VzdCBkZXRlY3Rpb24gcmF0ZSwgZ2l2ZXMgZGVib3VuY2UgZm9yIGluaXRpYWwKKwkJICogZGV0ZWN0aW9uICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfQklBU19TVEFSVFRJTUVfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLLAorCQkJCSAgICAoNyA8PCBXTTUxMDBfQUNDREVUX0JJQVNfU1RBUlRUSU1FX1NISUZUKSB8CisJCQkJICAgIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLKTsKKworCQkvKiBXZSBuZWVkIHRoZSBjaGFyZ2UgcHVtcCB0byBwb3dlciBNSUNCSUFTICovCisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkNQMiIpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJTWVNDTEsiKTsKKwkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKworCQkvKiBXZSBzdGFydCBvZmYganVzdCBlbmFibGluZyBtaWNyb3Bob25lIGRldGVjdGlvbiAtIGV2ZW4gYQorCQkgKiBwbGFpbiBoZWFkcGhvbmUgd2lsbCB0cmlnZ2VyIGRldGVjdGlvbi4KKwkJICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNNTEwMF9BQ0NERVRfRU5BLCBXTTUxMDBfQUNDREVUX0VOQSk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfM19NQVNLLAorCQkJCSAgICBXTTUxMDBfSU1fQUNDREVUX0VJTlQsIDApOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSywKKwkJCQkgICAgV001MTAwX0lNX0hQREVUX0VJTlQgfAorCQkJCSAgICBXTTUxMDBfSU1fQUNDREVUX0VJTlQsCisJCQkJICAgIFdNNTEwMF9JTV9IUERFVF9FSU5UIHwKKwkJCQkgICAgV001MTAwX0lNX0FDQ0RFVF9FSU5UKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX01JQ19ERVRFQ1RfMSwKKwkJCQkgICAgV001MTAwX0FDQ0RFVF9FTkEsIDApOworCQl3bTUxMDAtPmphY2sgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd201MTAwX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpcnFyZXR1cm5fdCBzdGF0dXMgPSBJUlFfTk9ORTsKKwlpbnQgaXJxX3ZhbDsKKworCWlycV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzMpOworCWlmIChpcnFfdmFsIDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBJUlEgc3RhdHVzIDM6ICVkXG4iLAorCQkJaXJxX3ZhbCk7CisJCWlycV92YWwgPSAwOworCX0KKwlpcnFfdmFsICY9IH5zbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzNfTUFTSyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zLCBpcnFfdmFsKTsKKworCWlmIChpcnFfdmFsKQorCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKworCXdtNTEwMF9sb2dfc3RhdHVzMyhjb2RlYywgaXJxX3ZhbCk7CisKKwlpZiAoaXJxX3ZhbCAmIFdNNTEwMF9GTEwxX0xPQ0tfRUlOVCkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJGTEwxIGxvY2tlZFxuIik7CisJCWNvbXBsZXRlKCZ3bTUxMDAtPmZsbFswXS5sb2NrKTsKKwl9CisJaWYgKGlycV92YWwgJiBXTTUxMDBfRkxMMl9MT0NLX0VJTlQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMMiBsb2NrZWRcbiIpOworCQljb21wbGV0ZSgmd201MTAwLT5mbGxbMV0ubG9jayk7CisJfQorCisJaWYgKGlycV92YWwgJiBXTTUxMDBfQUNDREVUX0VJTlQpCisJCXdtNTEwMF9taWNkX2lycShjb2RlYyk7CisKKwlpcnFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180KTsKKwlpZiAoaXJxX3ZhbCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSVJRIHN0YXR1cyA0OiAlZFxuIiwKKwkJCWlycV92YWwpOworCQlpcnFfdmFsID0gMDsKKwl9CisJaXJxX3ZhbCAmPSB+c25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180X01BU0spOworCisJaWYgKGlycV92YWwpCisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCisJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNCwgaXJxX3ZhbCk7CisKKwl3bTUxMDBfbG9nX3N0YXR1czQoY29kZWMsIGlycV92YWwpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlycXJldHVybl90IHdtNTEwMF9lZGdlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCWlycXJldHVybl90IHZhbDsKKworCWRvIHsKKwkJdmFsID0gd201MTAwX2lycShpcnEsIGRhdGEpOworCQlpZiAodmFsICE9IElSUV9OT05FKQorCQkJcmV0ID0gdmFsOworCX0gd2hpbGUgKHZhbCAhPSBJUlFfTk9ORSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHdtNTEwMF9wcml2ICpncGlvX3RvX3dtNTEwMChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCXJldHVybiBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHdtNTEwMF9wcml2LCBncGlvX2NoaXApOworfQorCitzdGF0aWMgdm9pZCB3bTUxMDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV001MTAwX0dQSU9fQ1RSTF8xICsgb2Zmc2V0LAorCQkJICAgIFdNNTEwMF9HUDFfTFZMLCAhIXZhbHVlIDw8IFdNNTEwMF9HUDFfTFZMX1NISUZUKTsKK30KKworc3RhdGljIGludCB3bTUxMDBfZ3Bpb19kaXJlY3Rpb25fb3V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMCA9IGdwaW9fdG9fd201MTAwKGNoaXApOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdtNTEwMC0+Y29kZWM7CisJaW50IHZhbCwgcmV0OworCisJdmFsID0gKDEgPDwgV001MTAwX0dQMV9GTl9TSElGVCkgfCAoISF2YWx1ZSA8PCBXTTUxMDBfR1AxX0xWTF9TSElGVCk7CisKKwlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfR1BJT19DVFJMXzEgKyBvZmZzZXQsCisJCQkJICBXTTUxMDBfR1AxX0ZOX01BU0sgfCBXTTUxMDBfR1AxX0RJUiB8CisJCQkJICBXTTUxMDBfR1AxX0xWTCwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNNTEwMF9HUElPX0NUUkxfMSArIG9mZnNldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHJldCAmIFdNNTEwMF9HUDFfTFZMKSAhPSAwOworfQorCitzdGF0aWMgaW50IHdtNTEwMF9ncGlvX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBncGlvX3RvX3dtNTEwMChjaGlwKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTUxMDAtPmNvZGVjOworCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNNTEwMF9HUElPX0NUUkxfMSArIG9mZnNldCwKKwkJCQkgICBXTTUxMDBfR1AxX0ZOX01BU0sgfCBXTTUxMDBfR1AxX0RJUiwKKwkJCQkgICAoMSA8PCBXTTUxMDBfR1AxX0ZOX1NISUZUKSB8CisJCQkJICAgKDEgPDwgV001MTAwX0dQMV9ESVJfU0hJRlQpKTsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd201MTAwX3RlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAid201MTAwIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gd201MTAwX2dwaW9fZGlyZWN0aW9uX291dCwKKwkuc2V0CQkJPSB3bTUxMDBfZ3Bpb19zZXQsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHdtNTEwMF9ncGlvX2RpcmVjdGlvbl9pbiwKKwkuZ2V0CQkJPSB3bTUxMDBfZ3Bpb19nZXQsCisJLmNhbl9zbGVlcAkJPSAxLAorfTsKKworc3RhdGljIHZvaWQgd201MTAwX2luaXRfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJd201MTAwLT5ncGlvX2NoaXAgPSB3bTUxMDBfdGVtcGxhdGVfY2hpcDsKKwl3bTUxMDAtPmdwaW9fY2hpcC5uZ3BpbyA9IDY7CisJd201MTAwLT5ncGlvX2NoaXAuZGV2ID0gY29kZWMtPmRldjsKKworCWlmICh3bTUxMDAtPnBkYXRhLmdwaW9fYmFzZSkKKwkJd201MTAwLT5ncGlvX2NoaXAuYmFzZSA9IHdtNTEwMC0+cGRhdGEuZ3Bpb19iYXNlOworCWVsc2UKKwkJd201MTAwLT5ncGlvX2NoaXAuYmFzZSA9IC0xOworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ3bTUxMDAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gYWRkIEdQSU9zOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgd201MTAwX2ZyZWVfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ3bTUxMDAtPmdwaW9fY2hpcCk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVtb3ZlIEdQSU9zOiAlZFxuIiwgcmV0KTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB3bTUxMDBfaW5pdF9ncGlvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKK30KKworc3RhdGljIHZvaWQgd201MTAwX2ZyZWVfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB3bTUxMDBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGNvZGVjLT5kZXYpOworCXN0cnVjdCB3bTUxMDBfcHJpdiAqd201MTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCwgaSwgaXJxX2ZsYWdzOworCisJd201MTAwLT5jb2RlYyA9IGNvZGVjOworCisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19JMkMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwLT5jb3JlX3N1cHBsaWVzKTsgaSsrKQorCQl3bTUxMDAtPmNvcmVfc3VwcGxpZXNbaV0uc3VwcGx5ID0gd201MTAwX2NvcmVfc3VwcGx5X25hbWVzW2ldOworCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZpMmMtPmRldiwgQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJCSB3bTUxMDAtPmNvcmVfc3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBjb3JlIHN1cHBsaWVzOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJd201MTAwLT5jcHZkZCA9IHJlZ3VsYXRvcl9nZXQoJmkyYy0+ZGV2LCAiQ1BWREQiKTsKKwlpZiAoSVNfRVJSKHdtNTEwMC0+Y3B2ZGQpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5jcHZkZCk7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGdldCBDUFZERDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2NvcmU7CisJfQorCisJd201MTAwLT5kYnZkZDIgPSByZWd1bGF0b3JfZ2V0KCZpMmMtPmRldiwgIkRCVkREMiIpOworCWlmIChJU19FUlIod201MTAwLT5kYnZkZDIpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5kYnZkZDIpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBnZXQgREJWREQyOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY3B2ZGQ7CisJfQorCisJd201MTAwLT5kYnZkZDMgPSByZWd1bGF0b3JfZ2V0KCZpMmMtPmRldiwgIkRCVkREMyIpOworCWlmIChJU19FUlIod201MTAwLT5kYnZkZDMpKSB7CisJCXJldCA9IFBUUl9FUlIod201MTAwLT5kYnZkZDMpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBnZXQgREJWREQyOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZGJ2ZGQyOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgY29yZSBzdXBwbGllczogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9kYnZkZDM7CisJfQorCisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkgeworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHdtNTEwMC0+cGRhdGEubGRvX2VuYSwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIldNNTEwMCBMRE9FTkEiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgTERPRU5BICVkOiAlZFxuIiwKKwkJCQl3bTUxMDAtPnBkYXRhLmxkb19lbmEsIHJldCk7CisJCQlnb3RvIGVycl9lbmFibGU7CisJCX0KKwkJbXNsZWVwKDIpOworCX0KKworCWlmICh3bTUxMDAtPnBkYXRhLnJlc2V0KSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUod201MTAwLT5wZGF0YS5yZXNldCwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIldNNTEwMCAvUkVTRVQiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgL1JFU0VUICVkOiAlZFxuIiwKKwkJCQl3bTUxMDAtPnBkYXRhLnJlc2V0LCByZXQpOworCQkJZ290byBlcnJfbGRvOworCQl9CisJfQorCisJcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTUxMDBfU09GVFdBUkVfUkVTRVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIElEIHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCXN3aXRjaCAocmV0KSB7CisJY2FzZSAweDg5OTc6CisJY2FzZSAweDUxMDA6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRGV2aWNlIGlzIG5vdCBhIFdNNTEwMCwgSUQgaXMgJXhcbiIsIHJldCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3Jlc2V0OworCX0KKworCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV001MTAwX0RFVklDRV9SRVZJU0lPTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgcmV2aXNpb24gcmVnaXN0ZXJcbiIpOworCQlnb3RvIGVycl9yZXNldDsKKwl9CisJd201MTAwLT5yZXYgPSByZXQgJiBXTTUxMDBfREVWSUNFX1JFVklTSU9OX01BU0s7CisKKwlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAicmV2aXNpb24gJWNcbiIsIHdtNTEwMC0+cmV2ICsgJ0EnKTsKKworCXJldCA9IHdtNTEwMF9yZXNldChjb2RlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJY29kZWMtPmNhY2hlX29ubHkgPSB0cnVlOworCisJd201MTAwX2luaXRfZ3Bpbyhjb2RlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDBfZGlnX3Z1KTsgaSsrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3bTUxMDBfZGlnX3Z1W2ldLCBXTTUxMDBfT1VUX1ZVLAorCQkJCSAgICBXTTUxMDBfT1VUX1ZVKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMC0+cGRhdGEuaW5fbW9kZSk7IGkrKykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTUxMDBfSU4xTF9DT05UUk9MLAorCQkJCSAgICBXTTUxMDBfSU4xX01PREVfTUFTSyB8CisJCQkJICAgIFdNNTEwMF9JTjFfRE1JQ19TVVBfTUFTSywKKwkJCQkgICAgKHdtNTEwMC0+cGRhdGEuaW5fbW9kZVtpXSA8PAorCQkJCSAgICAgV001MTAwX0lOMV9NT0RFX1NISUZUKSB8CisJCQkJICAgICh3bTUxMDAtPnBkYXRhLmRtaWNfc3VwW2ldIDw8CisJCQkJICAgICBXTTUxMDBfSU4xX0RNSUNfU1VQX1NISUZUKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod201MTAwLT5wZGF0YS5ncGlvX2RlZmF1bHRzKTsgaSsrKSB7CisJCWlmICghd201MTAwLT5wZGF0YS5ncGlvX2RlZmF1bHRzW2ldKQorCQkJY29udGludWU7CisKKwkJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0dQSU9fQ1RSTF8xICsgaSwKKwkJCSAgICAgIHdtNTEwMC0+cGRhdGEuZ3Bpb19kZWZhdWx0c1tpXSk7CisJfQorCisJLyogRG9uJ3QgZGVib3VuY2UgaW50ZXJydXB0cyB0byBzdXBwb3J0IHVzZSBvZiBTWVNDTEsgb25seSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNNTEwMF9JUlFfREVCT1VOQ0VfMSwgMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV001MTAwX0lSUV9ERUJPVU5DRV8yLCAwKTsKKworCS8qIFRPRE86IGNoZWNrIGlmIHdlJ3JlIHN5bW1ldHJpYyAqLworCisJaWYgKGkyYy0+aXJxKSB7CisJCWlmICh3bTUxMDAtPnBkYXRhLmlycV9mbGFncykKKwkJCWlycV9mbGFncyA9IHdtNTEwMC0+cGRhdGEuaXJxX2ZsYWdzOworCQllbHNlCisJCQlpcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfTE9XOworCisJCWlycV9mbGFncyB8PSBJUlFGX09ORVNIT1Q7CisKKwkJaWYgKGlycV9mbGFncyAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKQorCQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaTJjLT5pcnEsIE5VTEwsCisJCQkJCQkgICB3bTUxMDBfZWRnZV9pcnEsCisJCQkJCQkgICBpcnFfZmxhZ3MsICJ3bTUxMDAiLCBjb2RlYyk7CisJCWVsc2UKKwkJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGkyYy0+aXJxLCBOVUxMLCB3bTUxMDBfaXJxLAorCQkJCQkJICAgaXJxX2ZsYWdzLCAid201MTAwIiwgY29kZWMpOworCisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwKKwkJCQlpMmMtPmlycSwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdHMgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCisJCQkJCSAgICBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zX01BU0ssCisJCQkJCSAgICBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fQVNSQzFfTE9DS19FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9JTV9GTEwyX0xPQ0tfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0NMS0dFTl9FUlJfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfQ0xLR0VOX0VSUl9BU1lOQ19FSU5ULCAwKTsKKworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJICAgIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzRfTUFTSywKKwkJCQkJICAgIFdNNTEwMF9BSUYzX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9BSUYyX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9BSUYxX0VSUl9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9JU1JDMV9VTkRFUkNMT0NLRURfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgfAorCQkJCQkgICAgV001MTAwX0RBQ19VTkRFUkNMT0NLRURfRUlOVCB8CisJCQkJCSAgICBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UIHwKKwkJCQkJICAgIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVCwgMCk7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKCZjb2RlYy0+ZGFwbSwKKwkJCQkJICB3bTUxMDBfZGFwbV93aWRnZXRzX25vaXJxLAorCQkJCQkgIEFSUkFZX1NJWkUod201MTAwX2RhcG1fd2lkZ2V0c19ub2lycSkpOworCX0KKworCWlmICh3bTUxMDAtPnBkYXRhLmhwX3BvbCkgeworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHdtNTEwMC0+cGRhdGEuaHBfcG9sLAorCQkJCSAgICAgICBHUElPRl9PVVRfSU5JVF9ISUdILCAiV001MTAwIEhQX1BPTCIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBIUF9QT0wgJWQ6ICVkXG4iLAorCQkJCXdtNTEwMC0+cGRhdGEuaHBfcG9sLCByZXQpOworCQkJZ290byBlcnJfZ3BpbzsKKwkJfQorCX0KKworCS8qIFdlJ2xsIGdldCB3b2tlbiB1cCBhZ2FpbiB3aGVuIHRoZSBzeXN0ZW0gaGFzIHNvbWV0aGluZyB1c2VmdWwKKwkgKiBmb3IgdXMgdG8gZG8uCisJICovCisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkKKwkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAod201MTAwLT5wZGF0YS5sZG9fZW5hLCAwKTsKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod201MTAwLT5jb3JlX3N1cHBsaWVzKSwKKwkJCSAgICAgICB3bTUxMDAtPmNvcmVfc3VwcGxpZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9ncGlvOgorCWlmIChpMmMtPmlycSkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIGNvZGVjKTsKKwl3bTUxMDBfZnJlZV9ncGlvKGNvZGVjKTsKK2Vycl9yZXNldDoKKwlpZiAod201MTAwLT5wZGF0YS5yZXNldCkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLnJlc2V0LCAxKTsKKwkJZ3Bpb19mcmVlKHdtNTEwMC0+cGRhdGEucmVzZXQpOworCX0KK2Vycl9sZG86CisJaWYgKHdtNTEwMC0+cGRhdGEubGRvX2VuYSkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLmxkb19lbmEsIDApOworCQlncGlvX2ZyZWUod201MTAwLT5wZGF0YS5sZG9fZW5hKTsKKwl9CitlcnJfZW5hYmxlOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJICAgICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CitlcnJfZGJ2ZGQzOgorCXJlZ3VsYXRvcl9wdXQod201MTAwLT5kYnZkZDMpOworZXJyX2RidmRkMjoKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQyKTsKK2Vycl9jcHZkZDoKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+Y3B2ZGQpOworZXJyX2NvcmU6CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtNTEwMC0+Y29yZV9zdXBwbGllcyksCisJCQkgICAgd201MTAwLT5jb3JlX3N1cHBsaWVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd201MTAwX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtNTEwMF9wcml2ICp3bTUxMDAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKKworCXdtNTEwMF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJaWYgKHdtNTEwMC0+cGRhdGEuaHBfcG9sKSB7CisJCWdwaW9fZnJlZSh3bTUxMDAtPnBkYXRhLmhwX3BvbCk7CisJfQorCWlmIChpMmMtPmlycSkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIGNvZGVjKTsKKwl3bTUxMDBfZnJlZV9ncGlvKGNvZGVjKTsKKwlpZiAod201MTAwLT5wZGF0YS5yZXNldCkgeworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCh3bTUxMDAtPnBkYXRhLnJlc2V0LCAxKTsKKwkJZ3Bpb19mcmVlKHdtNTEwMC0+cGRhdGEucmVzZXQpOworCX0KKwlpZiAod201MTAwLT5wZGF0YS5sZG9fZW5hKSB7CisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtNTEwMC0+cGRhdGEubGRvX2VuYSwgMCk7CisJCWdwaW9fZnJlZSh3bTUxMDAtPnBkYXRhLmxkb19lbmEpOworCX0KKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQzKTsKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+ZGJ2ZGQyKTsKKwlyZWd1bGF0b3JfcHV0KHdtNTEwMC0+Y3B2ZGQpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTUxMDAtPmNvcmVfc3VwcGxpZXMpLAorCQkJICAgIHdtNTEwMC0+Y29yZV9zdXBwbGllcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDAgPSB7CisJLnByb2JlID0Jd201MTAwX3Byb2JlLAorCS5yZW1vdmUgPQl3bTUxMDBfcmVtb3ZlLAorCisJLnNldF9zeXNjbGsgPSB3bTUxMDBfc2V0X3N5c2NsaywKKwkuc2V0X3BsbCA9IHdtNTEwMF9zZXRfZmxsLAorCS5zZXRfYmlhc19sZXZlbCA9IHdtNTEwMF9zZXRfYmlhc19sZXZlbCwKKwkuaWRsZV9iaWFzX29mZiA9IDEsCisKKwkuc2VxX25vdGlmaWVyID0gd201MTAwX3NlcV9ub3RpZmllciwKKwkuY29udHJvbHMgPSB3bTUxMDBfc25kX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtNTEwMF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSB3bTUxMDBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSB3bTUxMDBfZGFwbV9yb3V0ZXMsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fcm91dGVzKSwKKworCS5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUod201MTAwX3JlZ19kZWZhdWx0cyksCisJLnJlZ193b3JkX3NpemUgPSBzaXplb2YodTE2KSwKKwkuY29tcHJlc3NfdHlwZSA9IFNORF9TT0NfUkJUUkVFX0NPTVBSRVNTSU9OLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtNTEwMF9yZWdfZGVmYXVsdHMsCisKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTUxMDBfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZ2lzdGVyID0gd201MTAwX3JlYWRhYmxlX3JlZ2lzdGVyLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgd201MTAwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd201MTAwX3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KTsKKwlzdHJ1Y3Qgd201MTAwX3ByaXYgKndtNTEwMDsKKwlpbnQgcmV0LCBpOworCisJd201MTAwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtNTEwMF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdtNTEwMCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtNTEwMC0+ZmxsKTsgaSsrKQorCQlpbml0X2NvbXBsZXRpb24oJndtNTEwMC0+ZmxsW2ldLmxvY2spOworCisJaWYgKHBkYXRhKQorCQl3bTUxMDAtPnBkYXRhID0gKnBkYXRhOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd201MTAwKTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd201MTAwLCB3bTUxMDBfZGFpLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTUxMDBfZGFpKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgV001MTAwOiAlZFxuIiwgcmV0KTsKKwkJa2ZyZWUod201MTAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZleGl0IGludCB3bTUxMDBfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtNTEwMF9pMmNfaWRbXSA9IHsKKwl7ICJ3bTUxMDAiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtNTEwMF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd201MTAwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid201MTAwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSAgICB3bTUxMDBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtNTEwMF9pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSB3bTUxMDBfaTJjX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd201MTAwX21vZGluaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJndtNTEwMF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdtNTEwMF9tb2Rpbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtNTEwMF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJndtNTEwMF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtNTEwMF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNNTEwMCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwNzU5NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmgKQEAgLTAsMCArMSw1MTU1IEBACisvKgorICogd201MTAwLmggIC0tICBXTTUxMDAgQUxTQSBTb0MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBXTTUxMDBfQVNPQ19ICisjZGVmaW5lIFdNNTEwMF9BU09DX0gKKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorCitpbnQgd201MTAwX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spOworCisjZGVmaW5lIFdNNTEwMF9DTEtfQUlGMSAgICAgMQorI2RlZmluZSBXTTUxMDBfQ0xLX0FJRjIgICAgIDIKKyNkZWZpbmUgV001MTAwX0NMS19BSUYzICAgICAzCisjZGVmaW5lIFdNNTEwMF9DTEtfU1lTQ0xLICAgNAorI2RlZmluZSBXTTUxMDBfQ0xLX0FTWU5DQ0xLIDUKKyNkZWZpbmUgV001MTAwX0NMS18zMktIWiAgICA2CisjZGVmaW5lIFdNNTEwMF9DTEtfT1BDTEsgICAgNworCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfTUNMSzEgICAgMAorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX01DTEsyICAgIDEKKyNkZWZpbmUgV001MTAwX0NMS1NSQ19TWVNDTEsgICAyCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfRkxMMSAgICAgNAorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX0ZMTDIgICAgIDUKKyNkZWZpbmUgV001MTAwX0NMS1NSQ19BSUYxQkNMSyA4CisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfQUlGMkJDTEsgOQorI2RlZmluZSBXTTUxMDBfQ0xLU1JDX0FJRjNCQ0xLIDEwCisjZGVmaW5lIFdNNTEwMF9DTEtTUkNfQVNZTkNDTEsgMHgxMDAKKworI2RlZmluZSBXTTUxMDBfRkxMMSAxCisjZGVmaW5lIFdNNTEwMF9GTEwyIDIKKworI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19NQ0xLMSAgICAweDAKKyNkZWZpbmUgV001MTAwX0ZMTF9TUkNfTUNMSzIgICAgMHgxCisjZGVmaW5lIFdNNTEwMF9GTExfU1JDX0ZMTDEgICAgIDB4NAorI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19GTEwyICAgICAweDUKKyNkZWZpbmUgV001MTAwX0ZMTF9TUkNfQUlGMUJDTEsgMHg4CisjZGVmaW5lIFdNNTEwMF9GTExfU1JDX0FJRjJCQ0xLIDB4OQorI2RlZmluZSBXTTUxMDBfRkxMX1NSQ19BSUYzQkNMSyAweGEKKworLyoKKyAqIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBXTTUxMDBfU09GVFdBUkVfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBXTTUxMDBfQ1RSTF9JRl8xICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTUxMDBfVE9ORV9HRU5FUkFUT1JfMSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzEgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzIgICAgICAgICAgICAgICAgICAgICAgMHgzMQorI2RlZmluZSBXTTUxMDBfUFdNX0RSSVZFXzMgICAgICAgICAgICAgICAgICAgICAgMHgzMgorI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfMSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgV001MTAwX0NMT0NLSU5HXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxCisjZGVmaW5lIFdNNTEwMF9DTE9DS0lOR180ICAgICAgICAgICAgICAgICAgICAgICAweDEwMgorI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfNSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDMKKyNkZWZpbmUgV001MTAwX0NMT0NLSU5HXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MTA0CisjZGVmaW5lIFdNNTEwMF9DTE9DS0lOR183ICAgICAgICAgICAgICAgICAgICAgICAweDEwNworI2RlZmluZSBXTTUxMDBfQ0xPQ0tJTkdfOCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDgKKyNkZWZpbmUgV001MTAwX0FTUkNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MTIwCisjZGVmaW5lIFdNNTEwMF9BU1JDX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDEyMQorI2RlZmluZSBXTTUxMDBfQVNSQ19SQVRFMSAgICAgICAgICAgICAgICAgICAgICAgMHgxMjIKKyNkZWZpbmUgV001MTAwX0lTUkNfMV9DVFJMXzEgICAgICAgICAgICAgICAgICAgIDB4MTQxCisjZGVmaW5lIFdNNTEwMF9JU1JDXzFfQ1RSTF8yICAgICAgICAgICAgICAgICAgICAweDE0MgorI2RlZmluZSBXTTUxMDBfSVNSQ18yX0NUUkwxICAgICAgICAgICAgICAgICAgICAgMHgxNDMKKyNkZWZpbmUgV001MTAwX0lTUkNfMl9DVFJMXzIgICAgICAgICAgICAgICAgICAgIDB4MTQ0CisjZGVmaW5lIFdNNTEwMF9GTEwxX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDE4MgorI2RlZmluZSBXTTUxMDBfRkxMMV9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHgxODMKKyNkZWZpbmUgV001MTAwX0ZMTDFfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgIDB4MTg0CisjZGVmaW5lIFdNNTEwMF9GTEwxX0NPTlRST0xfNSAgICAgICAgICAgICAgICAgICAweDE4NgorI2RlZmluZSBXTTUxMDBfRkxMMV9DT05UUk9MXzYgICAgICAgICAgICAgICAgICAgMHgxODcKKyNkZWZpbmUgV001MTAwX0ZMTDFfRUZTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MTg4CisjZGVmaW5lIFdNNTEwMF9GTEwyX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDFBMgorI2RlZmluZSBXTTUxMDBfRkxMMl9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHgxQTMKKyNkZWZpbmUgV001MTAwX0ZMTDJfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgIDB4MUE0CisjZGVmaW5lIFdNNTEwMF9GTEwyX0NPTlRST0xfNSAgICAgICAgICAgICAgICAgICAweDFBNgorI2RlZmluZSBXTTUxMDBfRkxMMl9DT05UUk9MXzYgICAgICAgICAgICAgICAgICAgMHgxQTcKKyNkZWZpbmUgV001MTAwX0ZMTDJfRUZTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MUE4CisjZGVmaW5lIFdNNTEwMF9NSUNfQ0hBUkdFX1BVTVBfMSAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBXTTUxMDBfTUlDX0NIQVJHRV9QVU1QXzIgICAgICAgICAgICAgICAgMHgyMDEKKyNkZWZpbmUgV001MTAwX0hQX0NIQVJHRV9QVU1QXzEgICAgICAgICAgICAgICAgIDB4MjAyCisjZGVmaW5lIFdNNTEwMF9MRE8xX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDIxMQorI2RlZmluZSBXTTUxMDBfTUlDX0JJQVNfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHgyMTUKKyNkZWZpbmUgV001MTAwX01JQ19CSUFTX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4MjE2CisjZGVmaW5lIFdNNTEwMF9NSUNfQklBU19DVFJMXzMgICAgICAgICAgICAgICAgICAweDIxNworI2RlZmluZSBXTTUxMDBfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEgICAgICAgICAgMHgyODAKKyNkZWZpbmUgV001MTAwX0hFQURQSE9ORV9ERVRFQ1RfMSAgICAgICAgICAgICAgIDB4Mjg4CisjZGVmaW5lIFdNNTEwMF9IRUFEUEhPTkVfREVURUNUXzIgICAgICAgICAgICAgICAweDI4OQorI2RlZmluZSBXTTUxMDBfTUlDX0RFVEVDVF8xICAgICAgICAgICAgICAgICAgICAgMHgyOTAKKyNkZWZpbmUgV001MTAwX01JQ19ERVRFQ1RfMiAgICAgICAgICAgICAgICAgICAgIDB4MjkxCisjZGVmaW5lIFdNNTEwMF9NSUNfREVURUNUXzMgICAgICAgICAgICAgICAgICAgICAweDI5MgorI2RlZmluZSBXTTUxMDBfTUlTQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgyQkIKKyNkZWZpbmUgV001MTAwX0lOUFVUX0VOQUJMRVMgICAgICAgICAgICAgICAgICAgIDB4MzAxCisjZGVmaW5lIFdNNTEwMF9JTlBVVF9FTkFCTEVTX1NUQVRVUyAgICAgICAgICAgICAweDMwMgorI2RlZmluZSBXTTUxMDBfSU4xTF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTAKKyNkZWZpbmUgV001MTAwX0lOMVJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzExCisjZGVmaW5lIFdNNTEwMF9JTjJMX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDMxMgorI2RlZmluZSBXTTUxMDBfSU4yUl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTMKKyNkZWZpbmUgV001MTAwX0lOM0xfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzE0CisjZGVmaW5lIFdNNTEwMF9JTjNSX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDMxNQorI2RlZmluZSBXTTUxMDBfSU40TF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgzMTYKKyNkZWZpbmUgV001MTAwX0lONFJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MzE3CisjZGVmaW5lIFdNNTEwMF9SWEFOQ19TUkMgICAgICAgICAgICAgICAgICAgICAgICAweDMxOAorI2RlZmluZSBXTTUxMDBfSU5QVVRfVk9MVU1FX1JBTVAgICAgICAgICAgICAgICAgMHgzMTkKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8xTCAgICAgICAgICAgIDB4MzIwCisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfMVIgICAgICAgICAgICAweDMyMQorI2RlZmluZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzJMICAgICAgICAgICAgMHgzMjIKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV8yUiAgICAgICAgICAgIDB4MzIzCisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfM0wgICAgICAgICAgICAweDMyNAorI2RlZmluZSBXTTUxMDBfQURDX0RJR0lUQUxfVk9MVU1FXzNSICAgICAgICAgICAgMHgzMjUKKyNkZWZpbmUgV001MTAwX0FEQ19ESUdJVEFMX1ZPTFVNRV80TCAgICAgICAgICAgIDB4MzI2CisjZGVmaW5lIFdNNTEwMF9BRENfRElHSVRBTF9WT0xVTUVfNFIgICAgICAgICAgICAweDMyNworI2RlZmluZSBXTTUxMDBfT1VUUFVUX0VOQUJMRVNfMiAgICAgICAgICAgICAgICAgMHg0MDEKKyNkZWZpbmUgV001MTAwX09VVFBVVF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgIDB4NDAyCisjZGVmaW5lIFdNNTEwMF9PVVRQVVRfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAweDQwMworI2RlZmluZSBXTTUxMDBfQ0hBTk5FTF9FTkFCTEVTXzEgICAgICAgICAgICAgICAgMHg0MDgKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfMUwgICAgICAgICAgICAgICAgICAgIDB4NDEwCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzFSICAgICAgICAgICAgICAgICAgICAweDQxMQorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8xTCAgICAgICAgICAgICAgMHg0MTIKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMVIgICAgICAgICAgICAgIDB4NDEzCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzJMICAgICAgICAgICAgICAgICAgICAweDQxNAorI2RlZmluZSBXTTUxMDBfT1VUX1ZPTFVNRV8yUiAgICAgICAgICAgICAgICAgICAgMHg0MTUKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfMkwgICAgICAgICAgICAgIDB4NDE2CisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzJSICAgICAgICAgICAgICAweDQxNworI2RlZmluZSBXTTUxMDBfT1VUX1ZPTFVNRV8zTCAgICAgICAgICAgICAgICAgICAgMHg0MTgKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfM1IgICAgICAgICAgICAgICAgICAgIDB4NDE5CisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzNMICAgICAgICAgICAgICAweDQxQQorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF8zUiAgICAgICAgICAgICAgMHg0MUIKKyNkZWZpbmUgV001MTAwX09VVF9WT0xVTUVfNEwgICAgICAgICAgICAgICAgICAgIDB4NDFDCisjZGVmaW5lIFdNNTEwMF9PVVRfVk9MVU1FXzRSICAgICAgICAgICAgICAgICAgICAweDQxRAorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF81TCAgICAgICAgICAgICAgMHg0MUUKKyNkZWZpbmUgV001MTAwX0RBQ19WT0xVTUVfTElNSVRfNVIgICAgICAgICAgICAgIDB4NDFGCisjZGVmaW5lIFdNNTEwMF9EQUNfVk9MVU1FX0xJTUlUXzZMICAgICAgICAgICAgICAweDQyMAorI2RlZmluZSBXTTUxMDBfREFDX1ZPTFVNRV9MSU1JVF82UiAgICAgICAgICAgICAgMHg0MjEKKyNkZWZpbmUgV001MTAwX0RBQ19BRUNfQ09OVFJPTF8xICAgICAgICAgICAgICAgIDB4NDQwCisjZGVmaW5lIFdNNTEwMF9PVVRQVVRfVk9MVU1FX1JBTVAgICAgICAgICAgICAgICAweDQ0MQorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzFMICAgICAgICAgICAgMHg0ODAKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8xUiAgICAgICAgICAgIDB4NDgxCisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfMkwgICAgICAgICAgICAweDQ4MgorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzJSICAgICAgICAgICAgMHg0ODMKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV8zTCAgICAgICAgICAgIDB4NDg0CisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfM1IgICAgICAgICAgICAweDQ4NQorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzRMICAgICAgICAgICAgMHg0ODYKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV80UiAgICAgICAgICAgIDB4NDg3CisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNUwgICAgICAgICAgICAweDQ4OAorI2RlZmluZSBXTTUxMDBfREFDX0RJR0lUQUxfVk9MVU1FXzVSICAgICAgICAgICAgMHg0ODkKKyNkZWZpbmUgV001MTAwX0RBQ19ESUdJVEFMX1ZPTFVNRV82TCAgICAgICAgICAgIDB4NDhBCisjZGVmaW5lIFdNNTEwMF9EQUNfRElHSVRBTF9WT0xVTUVfNlIgICAgICAgICAgICAweDQ4QgorI2RlZmluZSBXTTUxMDBfUERNX1NQSzFfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHg0QzAKKyNkZWZpbmUgV001MTAwX1BETV9TUEsxX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4NEMxCisjZGVmaW5lIFdNNTEwMF9QRE1fU1BLMl9DVFJMXzEgICAgICAgICAgICAgICAgICAweDRDMgorI2RlZmluZSBXTTUxMDBfUERNX1NQSzJfQ1RSTF8yICAgICAgICAgICAgICAgICAgMHg0QzMKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMSAgICAgICAgICAgICAgICAgICAgIDB4NTAwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIgICAgICAgICAgICAgICAgICAgICAweDUwMQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8zICAgICAgICAgICAgICAgICAgICAgMHg1MDIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfNCAgICAgICAgICAgICAgICAgICAgIDB4NTAzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzUgICAgICAgICAgICAgICAgICAgICAweDUwNAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV82ICAgICAgICAgICAgICAgICAgICAgMHg1MDUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfNyAgICAgICAgICAgICAgICAgICAgIDB4NTA2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzggICAgICAgICAgICAgICAgICAgICAweDUwNworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV85ICAgICAgICAgICAgICAgICAgICAgMHg1MDgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTAgICAgICAgICAgICAgICAgICAgIDB4NTA5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzExICAgICAgICAgICAgICAgICAgICAweDUwQQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xMiAgICAgICAgICAgICAgICAgICAgMHg1MEIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTMgICAgICAgICAgICAgICAgICAgIDB4NTBDCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzE0ICAgICAgICAgICAgICAgICAgICAweDUwRAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xNSAgICAgICAgICAgICAgICAgICAgMHg1MEUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTYgICAgICAgICAgICAgICAgICAgIDB4NTBGCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzE3ICAgICAgICAgICAgICAgICAgICAweDUxMAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8xOCAgICAgICAgICAgICAgICAgICAgMHg1MTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMTkgICAgICAgICAgICAgICAgICAgIDB4NTEyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIwICAgICAgICAgICAgICAgICAgICAweDUxMworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yMSAgICAgICAgICAgICAgICAgICAgMHg1MTQKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMjIgICAgICAgICAgICAgICAgICAgIDB4NTE1CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzIzICAgICAgICAgICAgICAgICAgICAweDUxNgorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yNCAgICAgICAgICAgICAgICAgICAgMHg1MTcKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzFfMjUgICAgICAgICAgICAgICAgICAgIDB4NTE4CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8xXzI2ICAgICAgICAgICAgICAgICAgICAweDUxOQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMV8yNyAgICAgICAgICAgICAgICAgICAgMHg1MUEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMSAgICAgICAgICAgICAgICAgICAgIDB4NTQwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzIgICAgICAgICAgICAgICAgICAgICAweDU0MQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8zICAgICAgICAgICAgICAgICAgICAgMHg1NDIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfNCAgICAgICAgICAgICAgICAgICAgIDB4NTQzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzUgICAgICAgICAgICAgICAgICAgICAweDU0NAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl82ICAgICAgICAgICAgICAgICAgICAgMHg1NDUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfNyAgICAgICAgICAgICAgICAgICAgIDB4NTQ2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzggICAgICAgICAgICAgICAgICAgICAweDU0NworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl85ICAgICAgICAgICAgICAgICAgICAgMHg1NDgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMTAgICAgICAgICAgICAgICAgICAgIDB4NTQ5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzExICAgICAgICAgICAgICAgICAgICAweDU0QQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8xOCAgICAgICAgICAgICAgICAgICAgMHg1NTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzJfMTkgICAgICAgICAgICAgICAgICAgIDB4NTUyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8yXzI2ICAgICAgICAgICAgICAgICAgICAweDU1OQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfMl8yNyAgICAgICAgICAgICAgICAgICAgMHg1NUEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMSAgICAgICAgICAgICAgICAgICAgIDB4NTgwCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzIgICAgICAgICAgICAgICAgICAgICAweDU4MQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18zICAgICAgICAgICAgICAgICAgICAgMHg1ODIKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfNCAgICAgICAgICAgICAgICAgICAgIDB4NTgzCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzUgICAgICAgICAgICAgICAgICAgICAweDU4NAorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM182ICAgICAgICAgICAgICAgICAgICAgMHg1ODUKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfNyAgICAgICAgICAgICAgICAgICAgIDB4NTg2CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzggICAgICAgICAgICAgICAgICAgICAweDU4NworI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM185ICAgICAgICAgICAgICAgICAgICAgMHg1ODgKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMTAgICAgICAgICAgICAgICAgICAgIDB4NTg5CisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzExICAgICAgICAgICAgICAgICAgICAweDU4QQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18xOCAgICAgICAgICAgICAgICAgICAgMHg1OTEKKyNkZWZpbmUgV001MTAwX0FVRElPX0lGXzNfMTkgICAgICAgICAgICAgICAgICAgIDB4NTkyCisjZGVmaW5lIFdNNTEwMF9BVURJT19JRl8zXzI2ICAgICAgICAgICAgICAgICAgICAweDU5OQorI2RlZmluZSBXTTUxMDBfQVVESU9fSUZfM18yNyAgICAgICAgICAgICAgICAgICAgMHg1OUEKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgIDB4NjQwCisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAweDY0MQorI2RlZmluZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgMHg2NDIKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgIDB4NjQzCisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAweDY0NAorI2RlZmluZSBXTTUxMDBfUFdNMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgMHg2NDUKKyNkZWZpbmUgV001MTAwX1BXTTFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgIDB4NjQ2CisjZGVmaW5lIFdNNTEwMF9QV00xTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAweDY0NworI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAgMHg2NDgKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgIDB4NjQ5CisjZGVmaW5lIFdNNTEwMF9QV00yTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgICAweDY0QQorI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAgMHg2NEIKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgIDB4NjRDCisjZGVmaW5lIFdNNTEwMF9QV00yTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgICAweDY0RAorI2RlZmluZSBXTTUxMDBfUFdNMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAgMHg2NEUKKyNkZWZpbmUgV001MTAwX1BXTTJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgIDB4NjRGCisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDY4MAorI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2ODEKKyNkZWZpbmUgV001MTAwX09VVDFMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NjgyCisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDY4MworI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2ODQKKyNkZWZpbmUgV001MTAwX09VVDFMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4Njg1CisjZGVmaW5lIFdNNTEwMF9PVVQxTE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDY4NgorI2RlZmluZSBXTTUxMDBfT1VUMUxNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2ODcKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4Njg4CisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDY4OQorI2RlZmluZSBXTTUxMDBfT1VUMVJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2OEEKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NjhCCisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDY4QworI2RlZmluZSBXTTUxMDBfT1VUMVJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2OEQKKyNkZWZpbmUgV001MTAwX09VVDFSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NjhFCisjZGVmaW5lIFdNNTEwMF9PVVQxUk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDY4RgorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2OTAKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NjkxCisjZGVmaW5lIFdNNTEwMF9PVVQyTE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDY5MgorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2OTMKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4Njk0CisjZGVmaW5lIFdNNTEwMF9PVVQyTE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDY5NQorI2RlZmluZSBXTTUxMDBfT1VUMkxNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2OTYKKyNkZWZpbmUgV001MTAwX09VVDJMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4Njk3CisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDY5OAorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2OTkKKyNkZWZpbmUgV001MTAwX09VVDJSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NjlBCisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDY5QgorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2OUMKKyNkZWZpbmUgV001MTAwX09VVDJSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NjlECisjZGVmaW5lIFdNNTEwMF9PVVQyUk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDY5RQorI2RlZmluZSBXTTUxMDBfT1VUMlJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2OUYKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkEwCisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZBMQorI2RlZmluZSBXTTUxMDBfT1VUM0xNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2QTIKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkEzCisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZBNAorI2RlZmluZSBXTTUxMDBfT1VUM0xNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2QTUKKyNkZWZpbmUgV001MTAwX09VVDNMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkE2CisjZGVmaW5lIFdNNTEwMF9PVVQzTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZBNworI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2QTgKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkE5CisjZGVmaW5lIFdNNTEwMF9PVVQzUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZBQQorI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2QUIKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkFDCisjZGVmaW5lIFdNNTEwMF9PVVQzUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZBRAorI2RlZmluZSBXTTUxMDBfT1VUM1JNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2QUUKKyNkZWZpbmUgV001MTAwX09VVDNSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkFGCisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDZCMAorI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2QjEKKyNkZWZpbmUgV001MTAwX09VVDRMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NkIyCisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDZCMworI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2QjQKKyNkZWZpbmUgV001MTAwX09VVDRMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NkI1CisjZGVmaW5lIFdNNTEwMF9PVVQ0TE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDZCNgorI2RlZmluZSBXTTUxMDBfT1VUNExNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2QjcKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkI4CisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZCOQorI2RlZmluZSBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2QkEKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkJCCisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZCQworI2RlZmluZSBXTTUxMDBfT1VUNFJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2QkQKKyNkZWZpbmUgV001MTAwX09VVDRSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkJFCisjZGVmaW5lIFdNNTEwMF9PVVQ0Uk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZCRgorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2QzAKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkMxCisjZGVmaW5lIFdNNTEwMF9PVVQ1TE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZDMgorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2QzMKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkM0CisjZGVmaW5lIFdNNTEwMF9PVVQ1TE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZDNQorI2RlZmluZSBXTTUxMDBfT1VUNUxNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2QzYKKyNkZWZpbmUgV001MTAwX09VVDVMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkM3CisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDZDOAorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg2QzkKKyNkZWZpbmUgV001MTAwX09VVDVSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4NkNBCisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDZDQgorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg2Q0MKKyNkZWZpbmUgV001MTAwX09VVDVSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4NkNECisjZGVmaW5lIFdNNTEwMF9PVVQ1Uk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDZDRQorI2RlZmluZSBXTTUxMDBfT1VUNVJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg2Q0YKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4NkQwCisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDZEMQorI2RlZmluZSBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg2RDIKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4NkQzCisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDZENAorI2RlZmluZSBXTTUxMDBfT1VUNkxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg2RDUKKyNkZWZpbmUgV001MTAwX09VVDZMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4NkQ2CisjZGVmaW5lIFdNNTEwMF9PVVQ2TE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDZENworI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg2RDgKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4NkQ5CisjZGVmaW5lIFdNNTEwMF9PVVQ2Uk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDZEQQorI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg2REIKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4NkRDCisjZGVmaW5lIFdNNTEwMF9PVVQ2Uk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDZERAorI2RlZmluZSBXTTUxMDBfT1VUNlJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg2REUKKyNkZWZpbmUgV001MTAwX09VVDZSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4NkRGCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDcwMAorI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MDEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzAyCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDcwMworI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MDQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDFNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzA1CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDcwNgorI2RlZmluZSBXTTUxMDBfQUlGMVRYMU1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MDcKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzA4CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDcwOQorI2RlZmluZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3MEEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzBCCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDcwQworI2RlZmluZSBXTTUxMDBfQUlGMVRYMk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3MEQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzBFCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDcwRgorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3MTAKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzExCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDcxMgorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3MTMKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzE0CisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDcxNQorI2RlZmluZSBXTTUxMDBfQUlGMVRYM01JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3MTYKKyNkZWZpbmUgV001MTAwX0FJRjFUWDNNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzE3CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDcxOAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MTkKKyNkZWZpbmUgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzFBCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDcxQgorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MUMKKyNkZWZpbmUgV001MTAwX0FJRjFUWDRNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzFECisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0TUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDcxRQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MUYKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzIwCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDcyMQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3MjIKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzIzCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDcyNAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3MjUKKyNkZWZpbmUgV001MTAwX0FJRjFUWDVNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzI2CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDcyNworI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3MjgKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzI5CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDcyQQorI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3MkIKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzJDCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2TUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDcyRAorI2RlZmluZSBXTTUxMDBfQUlGMVRYNk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3MkUKKyNkZWZpbmUgV001MTAwX0FJRjFUWDZNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzJGCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDczMAorI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3MzEKKyNkZWZpbmUgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzMyCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDczMworI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3MzQKKyNkZWZpbmUgV001MTAwX0FJRjFUWDdNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzM1CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3TUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDczNgorI2RlZmluZSBXTTUxMDBfQUlGMVRYN01JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3MzcKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzM4CisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDczOQorI2RlZmluZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3M0EKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzNCCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDczQworI2RlZmluZSBXTTUxMDBfQUlGMVRYOE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3M0QKKyNkZWZpbmUgV001MTAwX0FJRjFUWDhNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4NzNFCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDczRgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3NDAKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4NzQxCisjZGVmaW5lIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDc0MgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3NDMKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzQ0CisjZGVmaW5lIFdNNTEwMF9BSUYyVFgxTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDc0NQorI2RlZmluZSBXTTUxMDBfQUlGMlRYMU1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3NDYKKyNkZWZpbmUgV001MTAwX0FJRjJUWDFNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzQ3CisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAweDc0OAorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgMHg3NDkKKyNkZWZpbmUgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgIDB4NzRBCisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAweDc0QgorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgMHg3NEMKKyNkZWZpbmUgV001MTAwX0FJRjJUWDJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgIDB4NzRECisjZGVmaW5lIFdNNTEwMF9BSUYyVFgyTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAweDc0RQorI2RlZmluZSBXTTUxMDBfQUlGMlRYMk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgMHg3NEYKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgIDB4NzgwCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAweDc4MQorI2RlZmluZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgMHg3ODIKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgIDB4NzgzCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAweDc4NAorI2RlZmluZSBXTTUxMDBfQUlGM1RYMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgMHg3ODUKKyNkZWZpbmUgV001MTAwX0FJRjNUWDFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgIDB4Nzg2CisjZGVmaW5lIFdNNTEwMF9BSUYzVFgxTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAweDc4NworI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgMHg3ODgKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4Nzg5CisjZGVmaW5lIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAweDc4QQorI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgMHg3OEIKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgIDB4NzhDCisjZGVmaW5lIFdNNTEwMF9BSUYzVFgyTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAweDc4RAorI2RlZmluZSBXTTUxMDBfQUlGM1RYMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgMHg3OEUKKyNkZWZpbmUgV001MTAwX0FJRjNUWDJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgIDB4NzhGCisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgICAweDg4MAorI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAgMHg4ODEKKyNkZWZpbmUgV001MTAwX0VRMU1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgIDB4ODgyCisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgICAweDg4MworI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAgMHg4ODQKKyNkZWZpbmUgV001MTAwX0VRMU1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgIDB4ODg1CisjZGVmaW5lIFdNNTEwMF9FUTFNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgICAweDg4NgorI2RlZmluZSBXTTUxMDBfRVExTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAgMHg4ODcKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAgIDB4ODg4CisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgICAweDg4OQorI2RlZmluZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgICAgMHg4OEEKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAgIDB4ODhCCisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgICAweDg4QworI2RlZmluZSBXTTUxMDBfRVEyTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgICAgMHg4OEQKKyNkZWZpbmUgV001MTAwX0VRMk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAgIDB4ODhFCisjZGVmaW5lIFdNNTEwMF9FUTJNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgICAweDg4RgorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgICAgMHg4OTAKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAgIDB4ODkxCisjZGVmaW5lIFdNNTEwMF9FUTNNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgICAweDg5MgorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgICAgMHg4OTMKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAgIDB4ODk0CisjZGVmaW5lIFdNNTEwMF9FUTNNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgICAweDg5NQorI2RlZmluZSBXTTUxMDBfRVEzTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgICAgMHg4OTYKKyNkZWZpbmUgV001MTAwX0VRM01JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAgIDB4ODk3CisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgICAweDg5OAorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgICAgMHg4OTkKKyNkZWZpbmUgV001MTAwX0VRNE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAgIDB4ODlBCisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgICAweDg5QgorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgICAgMHg4OUMKKyNkZWZpbmUgV001MTAwX0VRNE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAgIDB4ODlECisjZGVmaW5lIFdNNTEwMF9FUTRNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgICAweDg5RQorI2RlZmluZSBXTTUxMDBfRVE0TUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgICAgMHg4OUYKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OEMwCisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDhDMQorI2RlZmluZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg4QzIKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OEMzCisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDhDNAorI2RlZmluZSBXTTUxMDBfRFJDMUxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg4QzUKKyNkZWZpbmUgV001MTAwX0RSQzFMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OEM2CisjZGVmaW5lIFdNNTEwMF9EUkMxTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDhDNworI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg4QzgKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OEM5CisjZGVmaW5lIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDhDQQorI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg4Q0IKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OENDCisjZGVmaW5lIFdNNTEwMF9EUkMxUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDhDRAorI2RlZmluZSBXTTUxMDBfRFJDMVJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg4Q0UKKyNkZWZpbmUgV001MTAwX0RSQzFSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OENGCisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDkwMAorI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5MDEKKyNkZWZpbmUgV001MTAwX0hQTFAxTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTAyCisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDkwMworI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5MDQKKyNkZWZpbmUgV001MTAwX0hQTFAxTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTA1CisjZGVmaW5lIFdNNTEwMF9IUExQMU1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDkwNgorI2RlZmluZSBXTTUxMDBfSFBMUDFNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5MDcKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTA4CisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDkwOQorI2RlZmluZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5MEEKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OTBCCisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDkwQworI2RlZmluZSBXTTUxMDBfSFBMUDJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5MEQKKyNkZWZpbmUgV001MTAwX0hQTFAyTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OTBFCisjZGVmaW5lIFdNNTEwMF9IUExQMk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDkwRgorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5MTAKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OTExCisjZGVmaW5lIFdNNTEwMF9IUExQM01JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDkxMgorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5MTMKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OTE0CisjZGVmaW5lIFdNNTEwMF9IUExQM01JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDkxNQorI2RlZmluZSBXTTUxMDBfSFBMUDNNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5MTYKKyNkZWZpbmUgV001MTAwX0hQTFAzTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OTE3CisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDkxOAorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5MTkKKyNkZWZpbmUgV001MTAwX0hQTFA0TUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTFBCisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDkxQgorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5MUMKKyNkZWZpbmUgV001MTAwX0hQTFA0TUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTFECisjZGVmaW5lIFdNNTEwMF9IUExQNE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDkxRQorI2RlZmluZSBXTTUxMDBfSFBMUDRNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5MUYKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTQwCisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDk0MQorI2RlZmluZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5NDIKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OTQzCisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDk0NAorI2RlZmluZSBXTTUxMDBfRFNQMUxNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5NDUKKyNkZWZpbmUgV001MTAwX0RTUDFMTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OTQ2CisjZGVmaW5lIFdNNTEwMF9EU1AxTE1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDk0NworI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5NDgKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OTQ5CisjZGVmaW5lIFdNNTEwMF9EU1AxUk1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDk0QQorI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5NEIKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OTRDCisjZGVmaW5lIFdNNTEwMF9EU1AxUk1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDk0RAorI2RlZmluZSBXTTUxMDBfRFNQMVJNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5NEUKKyNkZWZpbmUgV001MTAwX0RTUDFSTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OTRGCisjZGVmaW5lIFdNNTEwMF9EU1AxQVVYMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDk1MAorI2RlZmluZSBXTTUxMDBfRFNQMUFVWDJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5NTgKKyNkZWZpbmUgV001MTAwX0RTUDFBVVgzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTYwCisjZGVmaW5lIFdNNTEwMF9EU1AxQVVYNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDk2OAorI2RlZmluZSBXTTUxMDBfRFNQMUFVWDVNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5NzAKKyNkZWZpbmUgV001MTAwX0RTUDFBVVg2TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTc4CisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDk4MAorI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5ODEKKyNkZWZpbmUgV001MTAwX0RTUDJMTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OTgyCisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDk4MworI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5ODQKKyNkZWZpbmUgV001MTAwX0RTUDJMTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OTg1CisjZGVmaW5lIFdNNTEwMF9EU1AyTE1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDk4NgorI2RlZmluZSBXTTUxMDBfRFNQMkxNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5ODcKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgIDB4OTg4CisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF8xX1ZPTFVNRSAgICAgICAgICAweDk4OQorI2RlZmluZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfMl9TT1VSQ0UgICAgICAgICAgMHg5OEEKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzJfVk9MVU1FICAgICAgICAgIDB4OThCCisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF8zX1NPVVJDRSAgICAgICAgICAweDk4QworI2RlZmluZSBXTTUxMDBfRFNQMlJNSVhfSU5QVVRfM19WT0xVTUUgICAgICAgICAgMHg5OEQKKyNkZWZpbmUgV001MTAwX0RTUDJSTUlYX0lOUFVUXzRfU09VUkNFICAgICAgICAgIDB4OThFCisjZGVmaW5lIFdNNTEwMF9EU1AyUk1JWF9JTlBVVF80X1ZPTFVNRSAgICAgICAgICAweDk4RgorI2RlZmluZSBXTTUxMDBfRFNQMkFVWDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5OTAKKyNkZWZpbmUgV001MTAwX0RTUDJBVVgyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OTk4CisjZGVmaW5lIFdNNTEwMF9EU1AyQVVYM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlBMAorI2RlZmluZSBXTTUxMDBfRFNQMkFVWDRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5QTgKKyNkZWZpbmUgV001MTAwX0RTUDJBVVg1TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUIwCisjZGVmaW5lIFdNNTEwMF9EU1AyQVVYNk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlCOAorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAgMHg5QzAKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzFfVk9MVU1FICAgICAgICAgIDB4OUMxCisjZGVmaW5lIFdNNTEwMF9EU1AzTE1JWF9JTlBVVF8yX1NPVVJDRSAgICAgICAgICAweDlDMgorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfMl9WT0xVTUUgICAgICAgICAgMHg5QzMKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzNfU09VUkNFICAgICAgICAgIDB4OUM0CisjZGVmaW5lIFdNNTEwMF9EU1AzTE1JWF9JTlBVVF8zX1ZPTFVNRSAgICAgICAgICAweDlDNQorI2RlZmluZSBXTTUxMDBfRFNQM0xNSVhfSU5QVVRfNF9TT1VSQ0UgICAgICAgICAgMHg5QzYKKyNkZWZpbmUgV001MTAwX0RTUDNMTUlYX0lOUFVUXzRfVk9MVU1FICAgICAgICAgIDB4OUM3CisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgICAweDlDOAorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfMV9WT0xVTUUgICAgICAgICAgMHg5QzkKKyNkZWZpbmUgV001MTAwX0RTUDNSTUlYX0lOUFVUXzJfU09VUkNFICAgICAgICAgIDB4OUNBCisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF8yX1ZPTFVNRSAgICAgICAgICAweDlDQgorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfM19TT1VSQ0UgICAgICAgICAgMHg5Q0MKKyNkZWZpbmUgV001MTAwX0RTUDNSTUlYX0lOUFVUXzNfVk9MVU1FICAgICAgICAgIDB4OUNECisjZGVmaW5lIFdNNTEwMF9EU1AzUk1JWF9JTlBVVF80X1NPVVJDRSAgICAgICAgICAweDlDRQorI2RlZmluZSBXTTUxMDBfRFNQM1JNSVhfSU5QVVRfNF9WT0xVTUUgICAgICAgICAgMHg5Q0YKKyNkZWZpbmUgV001MTAwX0RTUDNBVVgxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUQwCisjZGVmaW5lIFdNNTEwMF9EU1AzQVVYMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlEOAorI2RlZmluZSBXTTUxMDBfRFNQM0FVWDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5RTAKKyNkZWZpbmUgV001MTAwX0RTUDNBVVg0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgIDB4OUU4CisjZGVmaW5lIFdNNTEwMF9EU1AzQVVYNU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAweDlGMAorI2RlZmluZSBXTTUxMDBfRFNQM0FVWDZNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgMHg5RjgKKyNkZWZpbmUgV001MTAwX0FTUkMxTE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgIDB4QTgwCisjZGVmaW5lIFdNNTEwMF9BU1JDMVJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAgICAweEE4OAorI2RlZmluZSBXTTUxMDBfQVNSQzJMTUlYX0lOUFVUXzFfU09VUkNFICAgICAgICAgMHhBOTAKKyNkZWZpbmUgV001MTAwX0FTUkMyUk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgICAgIDB4QTk4CisjZGVmaW5lIFdNNTEwMF9JU1JDMURFQzFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIwMAorI2RlZmluZSBXTTUxMDBfSVNSQzFERUMyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMDgKKyNkZWZpbmUgV001MTAwX0lTUkMxREVDM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjEwCisjZGVmaW5lIFdNNTEwMF9JU1JDMURFQzRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIxOAorI2RlZmluZSBXTTUxMDBfSVNSQzFJTlQxTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMjAKKyNkZWZpbmUgV001MTAwX0lTUkMxSU5UMk1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjI4CisjZGVmaW5lIFdNNTEwMF9JU1JDMUlOVDNNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEIzMAorI2RlZmluZSBXTTUxMDBfSVNSQzFJTlQ0TUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCMzgKKyNkZWZpbmUgV001MTAwX0lTUkMyREVDMU1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjQwCisjZGVmaW5lIFdNNTEwMF9JU1JDMkRFQzJNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI0OAorI2RlZmluZSBXTTUxMDBfSVNSQzJERUMzTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCNTAKKyNkZWZpbmUgV001MTAwX0lTUkMyREVDNE1JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjU4CisjZGVmaW5lIFdNNTEwMF9JU1JDMklOVDFNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI2MAorI2RlZmluZSBXTTUxMDBfSVNSQzJJTlQyTUlYX0lOUFVUXzFfU09VUkNFICAgICAgMHhCNjgKKyNkZWZpbmUgV001MTAwX0lTUkMySU5UM01JWF9JTlBVVF8xX1NPVVJDRSAgICAgIDB4QjcwCisjZGVmaW5lIFdNNTEwMF9JU1JDMklOVDRNSVhfSU5QVVRfMV9TT1VSQ0UgICAgICAweEI3OAorI2RlZmluZSBXTTUxMDBfR1BJT19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgMHhDMDAKKyNkZWZpbmUgV001MTAwX0dQSU9fQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgIDB4QzAxCisjZGVmaW5lIFdNNTEwMF9HUElPX0NUUkxfMyAgICAgICAgICAgICAgICAgICAgICAweEMwMgorI2RlZmluZSBXTTUxMDBfR1BJT19DVFJMXzQgICAgICAgICAgICAgICAgICAgICAgMHhDMDMKKyNkZWZpbmUgV001MTAwX0dQSU9fQ1RSTF81ICAgICAgICAgICAgICAgICAgICAgIDB4QzA0CisjZGVmaW5lIFdNNTEwMF9HUElPX0NUUkxfNiAgICAgICAgICAgICAgICAgICAgICAweEMwNQorI2RlZmluZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF8xICAgICAgICAgICAgICAgICAgMHhDMjMKKyNkZWZpbmUgV001MTAwX01JU0NfUEFEX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4QzI0CisjZGVmaW5lIFdNNTEwMF9NSVNDX1BBRF9DVFJMXzMgICAgICAgICAgICAgICAgICAweEMyNQorI2RlZmluZSBXTTUxMDBfTUlTQ19QQURfQ1RSTF80ICAgICAgICAgICAgICAgICAgMHhDMjYKKyNkZWZpbmUgV001MTAwX01JU0NfUEFEX0NUUkxfNSAgICAgICAgICAgICAgICAgIDB4QzI3CisjZGVmaW5lIFdNNTEwMF9NSVNDX0dQSU9fMSAgICAgICAgICAgICAgICAgICAgICAweEMyOAorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18xICAgICAgICAgICAgICAgMHhEMDAKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMiAgICAgICAgICAgICAgIDB4RDAxCisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzMgICAgICAgICAgICAgICAweEQwMgorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU180ICAgICAgICAgICAgICAgMHhEMDMKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9SQVdfU1RBVFVTXzIgICAgICAgICAgIDB4RDA0CisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfUkFXX1NUQVRVU18zICAgICAgICAgICAweEQwNQorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1JBV19TVEFUVVNfNCAgICAgICAgICAgMHhEMDYKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLICAgICAgICAgIDB4RDA3CisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSyAgICAgICAgICAweEQwOAorI2RlZmluZSBXTTUxMDBfSU5URVJSVVBUX1NUQVRVU18zX01BU0sgICAgICAgICAgMHhEMDkKKyNkZWZpbmUgV001MTAwX0lOVEVSUlVQVF9TVEFUVVNfNF9NQVNLICAgICAgICAgIDB4RDBBCisjZGVmaW5lIFdNNTEwMF9JTlRFUlJVUFRfQ09OVFJPTCAgICAgICAgICAgICAgICAweEQxRgorI2RlZmluZSBXTTUxMDBfSVJRX0RFQk9VTkNFXzEgICAgICAgICAgICAgICAgICAgMHhEMjAKKyNkZWZpbmUgV001MTAwX0lSUV9ERUJPVU5DRV8yICAgICAgICAgICAgICAgICAgIDB4RDIxCisjZGVmaW5lIFdNNTEwMF9GWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweEUwMAorI2RlZmluZSBXTTUxMDBfRVExXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTAKKyNkZWZpbmUgV001MTAwX0VRMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTExCisjZGVmaW5lIFdNNTEwMF9FUTFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxMgorI2RlZmluZSBXTTUxMDBfRVExXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTMKKyNkZWZpbmUgV001MTAwX0VRMV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTE0CisjZGVmaW5lIFdNNTEwMF9FUTFfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxNQorI2RlZmluZSBXTTUxMDBfRVExXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTYKKyNkZWZpbmUgV001MTAwX0VRMV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTE3CisjZGVmaW5lIFdNNTEwMF9FUTFfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxOAorI2RlZmluZSBXTTUxMDBfRVExXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMTkKKyNkZWZpbmUgV001MTAwX0VRMV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTFBCisjZGVmaW5lIFdNNTEwMF9FUTFfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxQgorI2RlZmluZSBXTTUxMDBfRVExXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMUMKKyNkZWZpbmUgV001MTAwX0VRMV8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTFECisjZGVmaW5lIFdNNTEwMF9FUTFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUxRQorI2RlZmluZSBXTTUxMDBfRVExXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMUYKKyNkZWZpbmUgV001MTAwX0VRMV8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIwCisjZGVmaW5lIFdNNTEwMF9FUTFfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyMQorI2RlZmluZSBXTTUxMDBfRVExXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMjIKKyNkZWZpbmUgV001MTAwX0VRMV8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIzCisjZGVmaW5lIFdNNTEwMF9FUTJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyNgorI2RlZmluZSBXTTUxMDBfRVEyXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMjcKKyNkZWZpbmUgV001MTAwX0VRMl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTI4CisjZGVmaW5lIFdNNTEwMF9FUTJfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyOQorI2RlZmluZSBXTTUxMDBfRVEyXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMkEKKyNkZWZpbmUgV001MTAwX0VRMl82ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTJCCisjZGVmaW5lIFdNNTEwMF9FUTJfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyQworI2RlZmluZSBXTTUxMDBfRVEyXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMkQKKyNkZWZpbmUgV001MTAwX0VRMl85ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTJFCisjZGVmaW5lIFdNNTEwMF9FUTJfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyRgorI2RlZmluZSBXTTUxMDBfRVEyXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzAKKyNkZWZpbmUgV001MTAwX0VRMl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTMxCisjZGVmaW5lIFdNNTEwMF9FUTJfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzMgorI2RlZmluZSBXTTUxMDBfRVEyXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzMKKyNkZWZpbmUgV001MTAwX0VRMl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTM0CisjZGVmaW5lIFdNNTEwMF9FUTJfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzNQorI2RlZmluZSBXTTUxMDBfRVEyXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzYKKyNkZWZpbmUgV001MTAwX0VRMl8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTM3CisjZGVmaW5lIFdNNTEwMF9FUTJfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzOAorI2RlZmluZSBXTTUxMDBfRVEyXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMzkKKyNkZWZpbmUgV001MTAwX0VRM18xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTNDCisjZGVmaW5lIFdNNTEwMF9FUTNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUzRAorI2RlZmluZSBXTTUxMDBfRVEzXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFM0UKKyNkZWZpbmUgV001MTAwX0VRM180ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTNGCisjZGVmaW5lIFdNNTEwMF9FUTNfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0MAorI2RlZmluZSBXTTUxMDBfRVEzXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDEKKyNkZWZpbmUgV001MTAwX0VRM183ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQyCisjZGVmaW5lIFdNNTEwMF9FUTNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0MworI2RlZmluZSBXTTUxMDBfRVEzXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDQKKyNkZWZpbmUgV001MTAwX0VRM18xMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQ1CisjZGVmaW5lIFdNNTEwMF9FUTNfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0NgorI2RlZmluZSBXTTUxMDBfRVEzXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNDcKKyNkZWZpbmUgV001MTAwX0VRM18xMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTQ4CisjZGVmaW5lIFdNNTEwMF9FUTNfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0OQorI2RlZmluZSBXTTUxMDBfRVEzXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNEEKKyNkZWZpbmUgV001MTAwX0VRM18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTRCCisjZGVmaW5lIFdNNTEwMF9FUTNfMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0QworI2RlZmluZSBXTTUxMDBfRVEzXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNEQKKyNkZWZpbmUgV001MTAwX0VRM18xOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTRFCisjZGVmaW5lIFdNNTEwMF9FUTNfMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU0RgorI2RlZmluZSBXTTUxMDBfRVE0XzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTIKKyNkZWZpbmUgV001MTAwX0VRNF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTUzCisjZGVmaW5lIFdNNTEwMF9FUTRfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1NAorI2RlZmluZSBXTTUxMDBfRVE0XzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTUKKyNkZWZpbmUgV001MTAwX0VRNF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTU2CisjZGVmaW5lIFdNNTEwMF9FUTRfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1NworI2RlZmluZSBXTTUxMDBfRVE0XzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNTgKKyNkZWZpbmUgV001MTAwX0VRNF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTU5CisjZGVmaW5lIFdNNTEwMF9FUTRfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1QQorI2RlZmluZSBXTTUxMDBfRVE0XzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNUIKKyNkZWZpbmUgV001MTAwX0VRNF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTVDCisjZGVmaW5lIFdNNTEwMF9FUTRfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU1RAorI2RlZmluZSBXTTUxMDBfRVE0XzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNUUKKyNkZWZpbmUgV001MTAwX0VRNF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTVGCisjZGVmaW5lIFdNNTEwMF9FUTRfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU2MAorI2RlZmluZSBXTTUxMDBfRVE0XzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNjEKKyNkZWZpbmUgV001MTAwX0VRNF8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTYyCisjZGVmaW5lIFdNNTEwMF9FUTRfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweEU2MworI2RlZmluZSBXTTUxMDBfRVE0XzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNjQKKyNkZWZpbmUgV001MTAwX0VRNF8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTY1CisjZGVmaW5lIFdNNTEwMF9EUkMxX0NUUkwxICAgICAgICAgICAgICAgICAgICAgICAweEU4MAorI2RlZmluZSBXTTUxMDBfRFJDMV9DVFJMMiAgICAgICAgICAgICAgICAgICAgICAgMHhFODEKKyNkZWZpbmUgV001MTAwX0RSQzFfQ1RSTDMgICAgICAgICAgICAgICAgICAgICAgIDB4RTgyCisjZGVmaW5lIFdNNTEwMF9EUkMxX0NUUkw0ICAgICAgICAgICAgICAgICAgICAgICAweEU4MworI2RlZmluZSBXTTUxMDBfRFJDMV9DVFJMNSAgICAgICAgICAgICAgICAgICAgICAgMHhFODQKKyNkZWZpbmUgV001MTAwX0hQTFBGMV8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUMwCisjZGVmaW5lIFdNNTEwMF9IUExQRjFfMiAgICAgICAgICAgICAgICAgICAgICAgICAweEVDMQorI2RlZmluZSBXTTUxMDBfSFBMUEYyXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHhFQzQKKyNkZWZpbmUgV001MTAwX0hQTFBGMl8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUM1CisjZGVmaW5lIFdNNTEwMF9IUExQRjNfMSAgICAgICAgICAgICAgICAgICAgICAgICAweEVDOAorI2RlZmluZSBXTTUxMDBfSFBMUEYzXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHhFQzkKKyNkZWZpbmUgV001MTAwX0hQTFBGNF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4RUNDCisjZGVmaW5lIFdNNTEwMF9IUExQRjRfMiAgICAgICAgICAgICAgICAgICAgICAgICAweEVDRAorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzUwOCAgICAgICAgICAgICAgICAgICAgICAweDQxRkMKKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fNTA5ICAgICAgICAgICAgICAgICAgICAgIDB4NDFGRAorI2RlZmluZSBXTTUxMDBfRFNQMV9ETV81MTAgICAgICAgICAgICAgICAgICAgICAgMHg0MUZFCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzUxMSAgICAgICAgICAgICAgICAgICAgICAweDQxRkYKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMAorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAxCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDIKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV80ICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODA0CisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDUKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMTUzMCAgICAgICAgICAgICAgICAgICAgIDB4NERGQQorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xNTMxICAgICAgICAgICAgICAgICAgICAgMHg0REZCCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzE1MzIgICAgICAgICAgICAgICAgICAgICAweDRERkMKKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMTUzMyAgICAgICAgICAgICAgICAgICAgIDB4NERGRAorI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xNTM0ICAgICAgICAgICAgICAgICAgICAgMHg0REZFCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzE1MzUgICAgICAgICAgICAgICAgICAgICAweDRERkYKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMAorI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAxCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDIKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8yMDQ0ICAgICAgICAgICAgICAgICAgICAgMHg1N0ZDCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzIwNDUgICAgICAgICAgICAgICAgICAgICAweDU3RkQKKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMjA0NiAgICAgICAgICAgICAgICAgICAgIDB4NTdGRQorI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgMHg1N0ZGCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMQorI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAyCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDMKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fNTA4ICAgICAgICAgICAgICAgICAgICAgIDB4NjFGQworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV81MDkgICAgICAgICAgICAgICAgICAgICAgMHg2MUZECisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzUxMCAgICAgICAgICAgICAgICAgICAgICAweDYxRkUKKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fNTExICAgICAgICAgICAgICAgICAgICAgIDB4NjFGRgorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODAwCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDY4MDEKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgwMgorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODAzCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzQgICAgICAgICAgICAgICAgICAgICAgICAweDY4MDQKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fNSAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgwNQorI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xNTMwICAgICAgICAgICAgICAgICAgICAgMHg2REZBCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzE1MzEgICAgICAgICAgICAgICAgICAgICAweDZERkIKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMTUzMiAgICAgICAgICAgICAgICAgICAgIDB4NkRGQworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xNTMzICAgICAgICAgICAgICAgICAgICAgMHg2REZECisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzE1MzQgICAgICAgICAgICAgICAgICAgICAweDZERkUKKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMTUzNSAgICAgICAgICAgICAgICAgICAgIDB4NkRGRgorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEgICAgICAgICAgICAgICAgICAgICAgICAweDcwMDEKKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAwMgorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAzCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzIwNDQgICAgICAgICAgICAgICAgICAgICAweDc3RkMKKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMjA0NSAgICAgICAgICAgICAgICAgICAgIDB4NzdGRAorI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8yMDQ2ICAgICAgICAgICAgICAgICAgICAgMHg3N0ZFCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzIwNDcgICAgICAgICAgICAgICAgICAgICAweDc3RkYKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBXTTUxMDBfRFNQM19ETV8xICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzIgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBXTTUxMDBfRFNQM19ETV81MDggICAgICAgICAgICAgICAgICAgICAgMHg4MUZDCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzUwOSAgICAgICAgICAgICAgICAgICAgICAweDgxRkQKKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fNTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODFGRQorI2RlZmluZSBXTTUxMDBfRFNQM19ETV81MTEgICAgICAgICAgICAgICAgICAgICAgMHg4MUZGCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODAyCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDg4MDMKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fNCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgwNAorI2RlZmluZSBXTTUxMDBfRFNQM19QTV81ICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODA1CisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzE1MzAgICAgICAgICAgICAgICAgICAgICAweDhERkEKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMTUzMSAgICAgICAgICAgICAgICAgICAgIDB4OERGQgorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xNTMyICAgICAgICAgICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzE1MzMgICAgICAgICAgICAgICAgICAgICAweDhERkQKKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMTUzNCAgICAgICAgICAgICAgICAgICAgIDB4OERGRQorI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xNTM1ICAgICAgICAgICAgICAgICAgICAgMHg4REZGCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzAgICAgICAgICAgICAgICAgICAgICAgICAweDkwMDAKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMSAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAwMQorI2RlZmluZSBXTTUxMDBfRFNQM19aTV8yICAgICAgICAgICAgICAgICAgICAgICAgMHg5MDAyCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzMgICAgICAgICAgICAgICAgICAgICAgICAweDkwMDMKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMjA0NCAgICAgICAgICAgICAgICAgICAgIDB4OTdGQworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8yMDQ1ICAgICAgICAgICAgICAgICAgICAgMHg5N0ZECisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzIwNDYgICAgICAgICAgICAgICAgICAgICAweDk3RkUKKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMjA0NyAgICAgICAgICAgICAgICAgICAgIDB4OTdGRgorCisjZGVmaW5lIFdNNTEwMF9SRUdJU1RFUl9DT1VOVCAgICAgICAgICAgICAgICAgICAxNDM1CisjZGVmaW5lIFdNNTEwMF9NQVhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweDk3RkYKKworLyoKKyAqIEZpZWxkIERlZmluaXRpb25zLgorICovCisKKy8qCisgKiBSMCAoMHgwMCkgLSBzb2Z0d2FyZSByZXNldAorICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9NQVNLICAgICAgICAgICAgICAweEZGRkYgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9TV19SU1RfREVWX0lEMV9XSURUSCAgICAgICAgICAgICAgICAgMTYgIC8qIFNXX1JTVF9ERVZfSUQxIC0gWzE1OjBdICovCisKKy8qCisgKiBSMSAoMHgwMSkgLSBEZXZpY2UgUmV2aXNpb24KKyAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX01BU0sgICAgICAgICAgICAgMHgwMDBGICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfREVWSUNFX1JFVklTSU9OX1dJRFRIICAgICAgICAgICAgICAgICA0ICAvKiBERVZJQ0VfUkVWSVNJT04gLSBbMzowXSAqLworCisvKgorICogUjE2ICgweDEwKSAtIEN0cmwgSUYgMQorICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNNTEwMF9BVVRPX0lOQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVVE9fSU5DICovCisKKy8qCisgKiBSMzIgKDB4MjApIC0gVG9uZSBHZW5lcmF0b3IgMQorICovCisjZGVmaW5lIFdNNTEwMF9UT05FX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDMwMDAgIC8qIFRPTkVfUkFURSAtIFsxMzoxMl0gKi8KKyNkZWZpbmUgV001MTAwX1RPTkVfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogVE9ORV9SQVRFIC0gWzEzOjEyXSAqLworI2RlZmluZSBXTTUxMDBfVE9ORV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBUT05FX1JBVEUgLSBbMTM6MTJdICovCisjZGVmaW5lIFdNNTEwMF9UT05FX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIFRPTkVfT0ZGU0VUIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX1RPTkVfT0ZGU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogVE9ORV9PRkZTRVQgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfVE9ORV9PRkZTRVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBUT05FX09GRlNFVCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9UT05FMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFRPTkUyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBUT05FMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX1RPTkUyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogVE9ORTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9UT05FMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFRPTkUyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBUT05FMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX1RPTkUxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogVE9ORTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9UT05FMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFRPTkUxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfVE9ORTFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBUT05FMV9FTkEgKi8KKworLyoKKyAqIFI0OCAoMHgzMCkgLSBQV00gRHJpdmUgMQorICovCisjZGVmaW5lIFdNNTEwMF9QV01fUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweDMwMDAgIC8qIFBXTV9SQVRFIC0gWzEzOjEyXSAqLworI2RlZmluZSBXTTUxMDBfUFdNX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBQV01fUkFURSAtIFsxMzoxMl0gKi8KKyNkZWZpbmUgV001MTAwX1BXTV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUFdNX1JBVEUgLSBbMTM6MTJdICovCisjZGVmaW5lIFdNNTEwMF9QV01fQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgICAweDAzMDAgIC8qIFBXTV9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX1BXTV9DTEtfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogUFdNX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfUFdNX0NMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBQV01fQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX09WRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00xX09WRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTFfT1ZEICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBXTTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBXTTFfRU5BICovCisKKy8qCisgKiBSNDkgKDB4MzEpIC0gUFdNIERyaXZlIDIKKyAqLworI2RlZmluZSBXTTUxMDBfUFdNMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwM0ZGICAvKiBQV00xX0xWTCAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9QV00xX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFBXTTFfTFZMIC0gWzk6MF0gKi8KKyNkZWZpbmUgV001MTAwX1BXTTFfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogUFdNMV9MVkwgLSBbOTowXSAqLworCisvKgorICogUjUwICgweDMyKSAtIFBXTSBEcml2ZSAzCisgKi8KKyNkZWZpbmUgV001MTAwX1BXTTJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDNGRiAgLyogUFdNMl9MVkwgLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfUFdNMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBQV00yX0xWTCAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9QV00yX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIFBXTTJfTFZMIC0gWzk6MF0gKi8KKworLyoKKyAqIFIyNTYgKDB4MTAwKSAtIENsb2NraW5nIDEKKyAqLworI2RlZmluZSBXTTUxMDBfQ0xLXzMyS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBDTEtfMzJLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9DTEtfMzJLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENMS18zMktfU1JDIC0gWzM6MF0gKi8KKyNkZWZpbmUgV001MTAwX0NMS18zMktfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNCAgLyogQ0xLXzMyS19TUkMgLSBbMzowXSAqLworCisvKgorICogUjI1NyAoMHgxMDEpIC0gQ2xvY2tpbmcgMworICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9NQVNLICAgICAgICAgICAgICAgICAweDA3MDAgIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRlJFUV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIFNZU0NMS19GUkVRIC0gWzEwOjhdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX1NZU0NMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogU1lTQ0xLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfU1lTQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBTWVNDTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNZU0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX1NZU0NMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogU1lTQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9TWVNDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNZU0NMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfU1lTQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBTWVNDTEtfU1JDIC0gWzM6MF0gKi8KKworLyoKKyAqIFIyNTggKDB4MTAyKSAtIENsb2NraW5nIDQKKyAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfMV9NQVNLICAgICAgICAgICAgICAgMHgwMDFGICAvKiBTQU1QTEVfUkFURV8xIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogU0FNUExFX1JBVEVfMSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDUgIC8qIFNBTVBMRV9SQVRFXzEgLSBbNDowXSAqLworCisvKgorICogUjI1OSAoMHgxMDMpIC0gQ2xvY2tpbmcgNQorICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8yX01BU0sgICAgICAgICAgICAgICAweDAwMUYgIC8qIFNBTVBMRV9SQVRFXzIgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBTQU1QTEVfUkFURV8yIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzJfV0lEVEggICAgICAgICAgICAgICAgICAgNSAgLyogU0FNUExFX1JBVEVfMiAtIFs0OjBdICovCisKKy8qCisgKiBSMjYwICgweDEwNCkgLSBDbG9ja2luZyA2CisgKi8KKyNkZWZpbmUgV001MTAwX1NBTVBMRV9SQVRFXzNfTUFTSyAgICAgICAgICAgICAgIDB4MDAxRiAgLyogU0FNUExFX1JBVEVfMyAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9TQU1QTEVfUkFURV8zX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIFNBTVBMRV9SQVRFXzMgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfU0FNUExFX1JBVEVfM19XSURUSCAgICAgICAgICAgICAgICAgICA1ICAvKiBTQU1QTEVfUkFURV8zIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyNjMgKDB4MTA3KSAtIENsb2NraW5nIDcKKyAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfTUFTSyAgICAgICAgICAgICAgMHgwNzAwICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICAzICAvKiBBU1lOQ19DTEtfRlJFUSAtIFsxMDo4XSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBU1lOQ19DTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19DTEtfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFTWU5DX0NMS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX0NMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogQVNZTkNfQ0xLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBU1lOQ19DTEtfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAweDAwMEYgIC8qIEFTWU5DX0NMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBBU1lOQ19DTEtfU1JDIC0gWzM6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX0NMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgNCAgLyogQVNZTkNfQ0xLX1NSQyAtIFszOjBdICovCisKKy8qCisgKiBSMjY0ICgweDEwOCkgLSBDbG9ja2luZyA4CisgKi8KKyNkZWZpbmUgV001MTAwX0FTWU5DX1NBTVBMRV9SQVRFX01BU0sgICAgICAgICAgIDB4MDAxRiAgLyogQVNZTkNfU0FNUExFX1JBVEUgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQVNZTkNfU0FNUExFX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBU1lOQ19TQU1QTEVfUkFURSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BU1lOQ19TQU1QTEVfUkFURV9XSURUSCAgICAgICAgICAgICAgIDUgIC8qIEFTWU5DX1NBTVBMRV9SQVRFIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIyODggKDB4MTIwKSAtIEFTUkNfRU5BQkxFCisgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyTF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQVNSQzJMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMkxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFTUkMyTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQVNSQzJMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMlJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFTUkMyUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQVNSQzJSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFTUkMxTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQVNSQzFMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFTUkMxTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxUl9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQVNSQzFSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFTUkMxUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQVNSQzFSX0VOQSAqLworCisvKgorICogUjI4OSAoMHgxMjEpIC0gQVNSQ19TVEFUVVMKKyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAzICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAyICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDAyICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBU1JDMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMVJfRU5BX1NUUyAqLworCisvKgorICogUjI5MCAoMHgxMjIpIC0gQVNSQ19SQVRFMQorICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1JBVEUxX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDYgIC8qIEFTUkNfUkFURTEgLSBbMjoxXSAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19SQVRFMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBU1JDX1JBVEUxIC0gWzI6MV0gKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfUkFURTFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMiAgLyogQVNSQ19SQVRFMSAtIFsyOjFdICovCisKKy8qCisgKiBSMzIxICgweDE0MSkgLSBJU1JDIDEgQ1RSTCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0RGU19FTkEgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSVNSQzFfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfREZTX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJU1JDMV9ERlNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERlNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMxX0RGU19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0RGU19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogSVNSQzFfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgMHgwMzAwICAvKiBJU1JDMV9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX0NMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgOCAgLyogSVNSQzFfQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9DTEtfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIElTUkMxX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfRlNMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMV9GU0wgLSBbMTowXSAqLworCisvKgorICogUjMyMiAoMHgxNDIpIC0gSVNSQyAxIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQSAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9NQVNLICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTUgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQSAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9NQVNLICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTQgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9NQVNLICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQSAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9JTlQ0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQSAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQSAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQSAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDcgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUMzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9NQVNLICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDYgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9ERUM0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9OT1RDSF9FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElTUkMxX05PVENIX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfTk9UQ0hfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBJU1JDMV9OT1RDSF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX05PVENIX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogSVNSQzFfTk9UQ0hfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9OT1RDSF9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElTUkMxX05PVENIX0VOQSAqLworCisvKgorICogUjMyMyAoMHgxNDMpIC0gSVNSQyAyIENUUkwxCisgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0RGU19FTkEgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSVNSQzJfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfREZTX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJU1JDMl9ERlNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERlNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMyX0RGU19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0RGU19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogSVNSQzJfREZTX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfQ0xLX1NFTF9NQVNLICAgICAgICAgICAgICAgMHgwMzAwICAvKiBJU1JDMl9DTEtfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX0NMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgOCAgLyogSVNSQzJfQ0xLX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9DTEtfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIElTUkMyX0NMS19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDBDICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0ggLSBbMzoyXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfRlNMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJU1JDMl9GU0wgLSBbMTowXSAqLworCisvKgorICogUjMyNCAoMHgxNDQpIC0gSVNSQyAyIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQSAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9NQVNLICAgICAgICAgICAgICAweDgwMDAgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTUgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQSAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9NQVNLICAgICAgICAgICAgICAweDQwMDAgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTQgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9NQVNLICAgICAgICAgICAgICAweDIwMDAgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTMgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQSAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9JTlQ0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0lOVDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQSAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9NQVNLICAgICAgICAgICAgICAweDAyMDAgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDkgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQSAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9NQVNLICAgICAgICAgICAgICAweDAxMDAgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDggIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQSAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwODAgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDcgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUMzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQSAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9NQVNLICAgICAgICAgICAgICAweDAwNDAgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDYgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9ERUM0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX0RFQzRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9OT1RDSF9FTkEgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElTUkMyX05PVENIX0VOQSAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfTk9UQ0hfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBJU1JDMl9OT1RDSF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX05PVENIX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogSVNSQzJfTk9UQ0hfRU5BICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9OT1RDSF9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIElTUkMyX05PVENIX0VOQSAqLworCisvKgorICogUjM4NiAoMHgxODIpIC0gRkxMMSBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTEwxX0VOQSAqLworCisvKgorICogUjM4NyAoMHgxODMpIC0gRkxMMSBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9PVVRESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICA2ICAvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBGTEwxX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0ZSQVRJT19TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9GUkFUSU8gLSBbMjowXSAqLworCisvKgorICogUjM4OCAoMHgxODQpIC0gRkxMMSBDb250cm9sIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9USEVUQV9NQVNLICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBGTEwxX1RIRVRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX1RIRVRBX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfVEhFVEEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfVEhFVEFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMMV9USEVUQSAtIFsxNTowXSAqLworCisvKgorICogUjM5MCAoMHgxODYpIC0gRkxMMSBDb250cm9sIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwM0ZGICAvKiBGTEwxX04gLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX04gLSBbOTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBGTEwxX04gLSBbOTowXSAqLworCisvKgorICogUjM5MSAoMHgxODcpIC0gRkxMMSBDb250cm9sIDYKKyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX01BU0sgICAgICAgICAgICAgMHgwMEMwICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICA2ICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBGTEwxX1JFRkNMS19ESVYgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDBGICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9SRUZDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICA0ICAvKiBGTEwxX1JFRkNMS19TUkMgLSBbMzowXSAqLworCisvKgorICogUjM5MiAoMHgxODgpIC0gRkxMMSBFRlMgMQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xBTUJEQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEZMTDFfTEFNQkRBIC0gWzE1OjBdICovCisKKy8qCisgKiBSNDE4ICgweDFBMikgLSBGTEwyIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDJfRU5BICovCisKKy8qCisgKiBSNDE5ICgweDFBMykgLSBGTEwyIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEZMTDJfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9GUkFUSU8gLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9GUkFUSU9fV0lEVEggICAgICAgICAgICAgICAgICAgICAzICAvKiBGTEwyX0ZSQVRJTyAtIFsyOjBdICovCisKKy8qCisgKiBSNDIwICgweDFBNCkgLSBGTEwyIENvbnRyb2wgMworICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1RIRVRBX01BU0sgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEZMTDJfVEhFVEEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfVEhFVEFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9USEVUQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9USEVUQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBGTEwyX1RIRVRBIC0gWzE1OjBdICovCisKKy8qCisgKiBSNDIyICgweDFBNikgLSBGTEwyIENvbnRyb2wgNQorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAzRkYgIC8qIEZMTDJfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfTiAtIFs5OjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEZMTDJfTiAtIFs5OjBdICovCisKKy8qCisgKiBSNDIzICgweDFBNykgLSBGTEwyIENvbnRyb2wgNgorICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfTUFTSyAgICAgICAgICAgICAweDAwQzAgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfU0hJRlQgICAgICAgICAgICAgICAgIDYgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEZMTDJfUkVGQ0xLX0RJViAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfTUFTSyAgICAgICAgICAgICAweDAwMEYgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX1JFRkNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgIDQgIC8qIEZMTDJfUkVGQ0xLX1NSQyAtIFszOjBdICovCisKKy8qCisgKiBSNDI0ICgweDFBOCkgLSBGTEwyIEVGUyAxCisgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTEFNQkRBX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMMl9MQU1CREEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFI1MTIgKDB4MjAwKSAtIE1pYyBDaGFyZ2UgUHVtcCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQ1AyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0JZUEFTU19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBDUDJfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9DUDJfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIENQMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9CWVBBU1NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1AyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDUDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9DUDJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIENQMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0NQMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQ1AyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQ1AyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDUDJfRU5BICovCisKKy8qCisgKiBSNTEzICgweDIwMSkgLSBNaWMgQ2hhcmdlIFB1bXAgMgorICovCisjZGVmaW5lIFdNNTEwMF9MRE8yX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIExETzJfVlNFTCAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0xETzJfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogTERPMl9WU0VMIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfTERPMl9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBMRE8yX1ZTRUwgLSBbMTU6MTFdICovCisKKy8qCisgKiBSNTE0ICgweDIwMikgLSBIUCBDaGFyZ2UgUHVtcCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0NQMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ1AxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQ1AxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDUDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9DUDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENQMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0NQMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ1AxX0VOQSAqLworCisvKgorICogUjUyOSAoMHgyMTEpIC0gTERPMSBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX0xETzFfQllQQVNTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMV9CWVBBU1MgKi8KKworLyoKKyAqIFI1MzMgKDB4MjE1KSAtIE1pYyBCaWFzIEN0cmwgMQorICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9ESVNDSF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjFfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBNSUNCMV9SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxQyAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTUlDQjFfTFZMIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDQjFfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9CWVBBU1NfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0IxX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfQllQQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMV9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0JZUEFTU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjFfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjFfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNCMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IxX0VOQSAqLworCisvKgorICogUjUzNCAoMHgyMTYpIC0gTWljIEJpYXMgQ3RybCAyCisgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX1NISUZUICAgICAgICAgICAgICAgICAgICAgNiAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX1JBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCMl9SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIE1JQ0IyX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBNSUNCMl9MVkwgLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfQllQQVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNCMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0JZUEFTU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDQjJfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9CWVBBU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IyX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfQllQQVNTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCMl9CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0IyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSUNCMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjJfRU5BICovCisKKy8qCisgKiBSNTM1ICgweDIxNykgLSBNaWMgQmlhcyBDdHJsIDMKKyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0ggICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfU0hJRlQgICAgICAgICAgICAgICAgICAgICA2ICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19ESVNDSCAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfUkFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBNSUNCM19SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19SQVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE1JQ0IzX1JBVEUgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNSAgLyogTUlDQjNfUkFURSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19SQVRFICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMUMgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1JQ0IzX0xWTCAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19CWVBBU1MgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0IzX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfQllQQVNTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNSUNCM19CWVBBU1MgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX0JZUEFTU19TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDQjNfQllQQVNTICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19CWVBBU1NfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0IzX0JZUEFTUyAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNSUNCM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX01JQ0IzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDQjNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9NSUNCM19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0IzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTUlDQjNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNCM19FTkEgKi8KKworLyoKKyAqIFI2NDAgKDB4MjgwKSAtIEFjY2Vzc29yeSBEZXRlY3QgTW9kZSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9CSUFTX1NSQ19NQVNLICAgICAgICAgICAgIDB4QzAwMCAgLyogQUNDREVUX0JJQVNfU1JDIC0gWzE1OjE0XSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0JJQVNfU1JDX1NISUZUICAgICAgICAgICAgICAgIDE0ICAvKiBBQ0NERVRfQklBU19TUkMgLSBbMTU6MTRdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfQklBU19TUkNfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEFDQ0RFVF9CSUFTX1NSQyAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TUkMgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUNDREVUX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBBQ0NERVRfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFDQ0RFVF9TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX01PREVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBBQ0NERVRfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFDQ0RFVF9NT0RFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUNDREVUX01PREUgLSBbMTowXSAqLworCisvKgorICogUjY0OCAoMHgyODgpIC0gSGVhZHBob25lIERldGVjdCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0hQX0hPTERUSU1FX01BU0sgICAgICAgICAgICAgICAgIDB4MDBFMCAgLyogSFBfSE9MRFRJTUUgLSBbNzo1XSAqLworI2RlZmluZSBXTTUxMDBfSFBfSE9MRFRJTUVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBIUF9IT0xEVElNRSAtIFs3OjVdICovCisjZGVmaW5lIFdNNTEwMF9IUF9IT0xEVElNRV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQX0hPTERUSU1FIC0gWzc6NV0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0NMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAxOCAgLyogSFBfQ0xLX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNNTEwMF9IUF9DTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQX0NMS19ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTUxMDBfSFBfQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBIUF9DTEtfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV001MTAwX0hQX1NURVBfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSFBfU1RFUF9TSVpFICovCisjZGVmaW5lIFdNNTEwMF9IUF9TVEVQX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQX1NURVBfU0laRSAqLworI2RlZmluZSBXTTUxMDBfSFBfU1RFUF9TSVpFX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBIUF9TVEVQX1NJWkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX1NURVBfU0laRV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBfU1RFUF9TSVpFICovCisjZGVmaW5lIFdNNTEwMF9IUF9QT0xMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQX1BPTEwgKi8KKyNkZWZpbmUgV001MTAwX0hQX1BPTExfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSFBfUE9MTCAqLworI2RlZmluZSBXTTUxMDBfSFBfUE9MTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBIUF9QT0xMICovCisjZGVmaW5lIFdNNTEwMF9IUF9QT0xMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQX1BPTEwgKi8KKworLyoKKyAqIFI2NDkgKDB4Mjg5KSAtIEhlYWRwaG9uZSBEZXRlY3QgMgorICovCisjZGVmaW5lIFdNNTEwMF9IUF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEhQX0RPTkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX0RPTkVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSFBfRE9ORSAqLworI2RlZmluZSBXTTUxMDBfSFBfRE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBIUF9ET05FICovCisjZGVmaW5lIFdNNTEwMF9IUF9ET05FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQX0RPTkUgKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RiAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV001MTAwX0hQX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSFBfTFZMIC0gWzY6MF0gKi8KKworLyoKKyAqIFI2NTYgKDB4MjkwKSAtIE1pYyBEZXRlY3QgMQorICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfQklBU19TVEFSVFRJTUVfTUFTSyAgICAgICAweEYwMDAgIC8qIEFDQ0RFVF9CSUFTX1NUQVJUVElNRSAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9CSUFTX1NUQVJUVElNRV9TSElGVCAgICAgICAgICAxMiAgLyogQUNDREVUX0JJQVNfU1RBUlRUSU1FIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0JJQVNfU1RBUlRUSU1FX1dJRFRIICAgICAgICAgICA0ICAvKiBBQ0NERVRfQklBU19TVEFSVFRJTUUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9NQVNLICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFDQ0RFVF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfREJUSU1FICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFDQ0RFVF9EQlRJTUUgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9EQlRJTUVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUNDREVUX0RCVElNRSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0RCVElNRV9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfREJUSU1FICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfREJUSU1FX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFDQ0RFVF9EQlRJTUUgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUNDREVUX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBQ0NERVRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFDQ0RFVF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX0VOQSAqLworCisvKgorICogUjY1NyAoMHgyOTEpIC0gTWljIERldGVjdCAyCisgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9MVkxfU0VMX01BU0sgICAgICAgICAgICAgIDB4MDBGRiAgLyogQUNDREVUX0xWTF9TRUwgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0xWTF9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBQ0NERVRfTFZMX1NFTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTFZMX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIEFDQ0RFVF9MVkxfU0VMIC0gWzc6MF0gKi8KKworLyoKKyAqIFI2NTggKDB4MjkyKSAtIE1pYyBEZXRlY3QgMworICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfTFZMX01BU0sgICAgICAgICAgICAgICAgICAweDA3RkMgIC8qIEFDQ0RFVF9MVkwgLSBbMTA6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUNDREVUX0xWTCAtIFsxMDoyXSAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBBQ0NERVRfTFZMIC0gWzEwOjJdICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfVkFMSUQgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFDQ0RFVF9WQUxJRCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1ZBTElEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBQ0NERVRfVkFMSUQgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9WQUxJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUNDREVUX1ZBTElEICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfVkFMSURfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFDQ0RFVF9WQUxJRCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBQ0NERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BQ0NERVRfU1RTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFDQ0RFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FDQ0RFVF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUNDREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfU1RTICovCisKKy8qCisgKiBSNjk5ICgweDJCQikgLSBNaXNjIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSFBDT01fU1JDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwICAvKiBIUENPTV9TUkMgKi8KKyNkZWZpbmUgV001MTAwX0hQQ09NX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSFBDT01fU1JDICovCisKKy8qCisgKiBSNzY5ICgweDMwMSkgLSBJbnB1dCBFbmFibGVzCisgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xUl9FTkEgKi8KKworLyoKKyAqIFI3NzAgKDB4MzAyKSAtIElucHV0IEVuYWJsZXMgU3RhdHVzCisgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogSU40TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwODAgIC8qIElONExfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU40TF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjRMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lONExfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIElONFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBJTjRSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgNiAgLyogSU40Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElONFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBJTjNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogSU4zTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDUgIC8qIElOM0xfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogSU4zUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElOM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA0ICAvKiBJTjNSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElOMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTjJMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogSU4yTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTjJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogSU4yUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDIgIC8qIElOMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogSU4xTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElOMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElOMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTjFSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4xUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMVJfRU5BX1NUUyAqLworCisvKgorICogUjc4NCAoMHgzMTApIC0gSU4xTCBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4QzAwMCAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU5fUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMV9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU4xX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4xX09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjFfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIElOMV9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMV9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4xX0RNSUNfU1VQX01BU0sgICAgICAgICAgICAgICAgMHgxODAwICAvKiBJTjFfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjFfRE1JQ19TVVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIElOMV9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMV9ETUlDX1NVUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4xX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNjAwICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjFfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjFMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc4NSAoMHgzMTEpIC0gSU4xUiBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU4xUl9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3ODYgKDB4MzEyKSAtIElOMkwgQ29udHJvbAorICovCisjZGVmaW5lIFdNNTEwMF9JTjJfT1NSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElOMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMl9PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU4yX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4yX09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBJTjJfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjJfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOMl9ETUlDX1NVUF9NQVNLICAgICAgICAgICAgICAgIDB4MTgwMCAgLyogSU4yX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4yX0RNSUNfU1VQX1NISUZUICAgICAgICAgICAgICAgICAgIDExICAvKiBJTjJfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJfRE1JQ19TVVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDIgIC8qIElOMl9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDYwMCAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogSU4yX01PREUgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU4yTF9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3ODcgKDB4MzEzKSAtIElOMlIgQ29udHJvbAorICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIElOMlJfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSNzg4ICgweDMxNCkgLSBJTjNMIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU4zX09TUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjNfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjNfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIElOM19PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lOM19PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogSU4zX09TUiAqLworI2RlZmluZSBXTTUxMDBfSU4zX09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjNfRE1JQ19TVVBfTUFTSyAgICAgICAgICAgICAgICAweDE4MDAgIC8qIElOM19ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lOM19ETUlDX1NVUF9TSElGVCAgICAgICAgICAgICAgICAgICAxMSAgLyogSU4zX0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU4zX0RNSUNfU1VQX1dJRFRIICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjNfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAweDA2MDAgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIElOM19NT0RFIC0gWzEwOjldICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIElOM0xfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSNzg5ICgweDMxNSkgLSBJTjNSIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjNSX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc5MCAoMHgzMTYpIC0gSU40TCBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lONF9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSU40X09TUiAqLworI2RlZmluZSBXTTUxMDBfSU40X09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTjRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9JTjRfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIElONF9PU1IgKi8KKyNkZWZpbmUgV001MTAwX0lONF9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40X09TUiAqLworI2RlZmluZSBXTTUxMDBfSU40X0RNSUNfU1VQX01BU0sgICAgICAgICAgICAgICAgMHgxODAwICAvKiBJTjRfRE1JQ19TVVAgLSBbMTI6MTFdICovCisjZGVmaW5lIFdNNTEwMF9JTjRfRE1JQ19TVVBfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIElONF9ETUlDX1NVUCAtIFsxMjoxMV0gKi8KKyNkZWZpbmUgV001MTAwX0lONF9ETUlDX1NVUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMiAgLyogSU40X0RNSUNfU1VQIC0gWzEyOjExXSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNjAwICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40X01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBJTjRfTU9ERSAtIFsxMDo5XSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZFICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICA3ICAvKiBJTjRMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjc5MSAoMHgzMTcpIC0gSU40UiBDb250cm9sCisgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRSAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgNyAgLyogSU40Ul9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFI3OTIgKDB4MzE4KSAtIFJYQU5DX1NSQworICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfTUFTSyAgICAgICAgICAgICAgICAweDAwMDcgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9JTl9SWEFOQ19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgIDMgIC8qIElOX1JYQU5DX1NFTCAtIFsyOjBdICovCisKKy8qCisgKiBSNzkzICgweDMxOSkgLSBJbnB1dCBWb2x1bWUgUmFtcAorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WRF9SQU1QX01BU0sgICAgICAgICAgICAgICAgICAweDAwNzAgIC8qIElOX1ZEX1JBTVAgLSBbNjo0XSAqLworI2RlZmluZSBXTTUxMDBfSU5fVkRfUkFNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBJTl9WRF9SQU1QIC0gWzY6NF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZEX1JBTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU5fVkRfUkFNUCAtIFs2OjRdICovCisjZGVmaW5lIFdNNTEwMF9JTl9WSV9SQU1QX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIElOX1ZJX1JBTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfSU5fVklfUkFNUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTl9WSV9SQU1QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZJX1JBTVBfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogSU5fVklfUkFNUCAtIFsyOjBdICovCisKKy8qCisgKiBSODAwICgweDMyMCkgLSBBREMgRGlnaXRhbCBWb2x1bWUgMUwKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4xTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMUxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU4xTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4xTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjFMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjFMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDEgKDB4MzIxKSAtIEFEQyBEaWdpdGFsIFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4xUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4xUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjFSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOMVJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMVJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4xUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjgwMiAoMHgzMjIpIC0gQURDIERpZ2l0YWwgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4yTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4yTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIElOMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOMkxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4yTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4yTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjJMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSODAzICgweDMyMykgLSBBREMgRGlnaXRhbCBWb2x1bWUgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4yUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOMlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU4yUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4yUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjJSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjJSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElOMlJfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDQgKDB4MzI0KSAtIEFEQyBEaWdpdGFsIFZvbHVtZSAzTAorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjNMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4zTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjNMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElOM0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOM0xfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU4zTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjgwNSAoMHgzMjUpIC0gQURDIERpZ2l0YWwgVm9sdW1lIDNSCisgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU5fVlUgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfTVVURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU4zUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElOM1JfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSU4zUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjNSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIElOM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lOM1JfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogSU4zUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU4zUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBJTjNSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSODA2ICgweDMyNikgLSBBREMgRGlnaXRhbCBWb2x1bWUgNEwKKyAqLworI2RlZmluZSBXTTUxMDBfSU5fVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU5fVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTl9WVSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONExfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU40TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElONExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTjRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONExfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogSU40TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfSU40TF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBJTjRMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjRMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIElONExfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4MDcgKDB4MzI3KSAtIEFEQyBEaWdpdGFsIFZvbHVtZSA0UgorICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElOX1ZVICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX01VVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIElONFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBJTjRSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX0lONFJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU40Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElONFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfSU40Ul9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBJTjRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9JTjRSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElONFJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0lONFJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogSU40Ul9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwMjUgKDB4NDAxKSAtIE91dHB1dCBFbmFibGVzIDIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogT1VUNlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIE9VVDZSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBPVVQ2Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVDVMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVQ1TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUNUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogT1VUNExfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIE9VVDRMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQ0TF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNExfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE9VVDRSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBPVVQ0Ul9FTkEgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogT1VUNFJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRSX0VOQSAqLworCisvKgorICogUjEwMjYgKDB4NDAyKSAtIE91dHB1dCBTdGF0dXMgMQorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIE9VVDNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAyMCAgLyogT1VUM0xfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA1ICAvKiBPVVQzTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDNMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogT1VUM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMDEwICAvKiBPVVQzUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDQgIC8qIE9VVDNSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM1JfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBPVVQyTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDggIC8qIE9VVDJMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMyAgLyogT1VUMkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQyTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIE9VVDJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNCAgLyogT1VUMlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAyICAvKiBPVVQyUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogT1VUMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMDAyICAvKiBPVVQxTF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBPVVQxUl9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDEgIC8qIE9VVDFSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxUl9FTkFfU1RTICovCisKKy8qCisgKiBSMTAyNyAoMHg0MDMpIC0gT3V0cHV0IFN0YXR1cyAyCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNkxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBPVVQ2Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDA0MDAgIC8qIE9VVDZSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAxMCAgLyogT1VUNlJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVDVMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUNUxfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVQ1TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfRU5BX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9FTkFfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNVJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBPVVQ0TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9FTkFfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIE9VVDRMX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogT1VUNExfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfRU5BX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0TF9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfU1RTICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIE9VVDRSX0VOQV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogT1VUNFJfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfRU5BX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBPVVQ0Ul9FTkFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9FTkFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRSX0VOQV9TVFMgKi8KKworLyoKKyAqIFIxMDMyICgweDQwOCkgLSBDaGFubmVsIEVuYWJsZXMgMQorICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQM0xfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDNSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQM1JfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMkxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDJSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMlJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMUxfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEhQMVJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9IUDFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQMVJfRU5BICovCisKKy8qCisgKiBSMTA0MCAoMHg0MTApIC0gT3V0IFZvbHVtZSAxTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgICAweEMwMDAgIC8qIE9VVF9SQVRFIC0gWzE1OjE0XSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBPVVRfUkFURSAtIFsxNToxNF0gKi8KKyNkZWZpbmUgV001MTAwX09VVF9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogT1VUX1JBVEUgLSBbMTU6MTRdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIE9VVDFfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMV9NT05PX01BU0sgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBPVVQxX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDFfTU9OT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMiAgLyogT1VUMV9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQxX01PTk9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQxTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDFMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUMUxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAweDAwRkUgIC8qIE9VVDFMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNyAgLyogT1VUMUxfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMTA0MSAoMHg0MTEpIC0gT3V0IFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDFSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMVJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQxUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRSAgLyogT1VUMVJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDFSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQxUl9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFIxMDQyICgweDQxMikgLSBEQUMgVm9sdW1lIExpbWl0IDFMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMUxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxTF9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDQzICgweDQxMykgLSBEQUMgVm9sdW1lIExpbWl0IDFSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMVJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxUl9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDQ0ICgweDQxNCkgLSBPdXQgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDJfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogT1VUMl9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQyX01PTk9fTUFTSyAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIE9VVDJfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUMl9NT05PX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBPVVQyX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDJfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMl9NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDJMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQyTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1BHQV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRSAgLyogT1VUMkxfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9QR0FfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfUEdBX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA3ICAvKiBPVVQyTF9QR0FfVk9MIC0gWzc6MV0gKi8KKworLyoKKyAqIFIxMDQ1ICgweDQxNSkgLSBPdXQgVm9sdW1lIDJSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUMlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQyUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDJSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZFICAvKiBPVVQyUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDJSX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjEwNDYgKDB4NDE2KSAtIERBQyBWb2x1bWUgTGltaXQgMkwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyTF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMkxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJMX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNDcgKDB4NDE3KSAtIERBQyBWb2x1bWUgTGltaXQgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyUl9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMlJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJSX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNDggKDB4NDE4KSAtIE91dCBWb2x1bWUgM0wKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzX09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUM19NT05PICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBPVVQzX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDNfTU9OT19NQVNLICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogT1VUM19NT05PICovCisjZGVmaW5lIFdNNTEwMF9PVVQzX01PTk9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTIgIC8qIE9VVDNfTU9OTyAqLworI2RlZmluZSBXTTUxMDBfT1VUM19NT05PX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzX01PTk8gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUM0xfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzTF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDNMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0xfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfUEdBX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZFICAvKiBPVVQzTF9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX1BHQV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUM0xfUEdBX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9QR0FfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDcgIC8qIE9VVDNMX1BHQV9WT0wgLSBbNzoxXSAqLworCisvKgorICogUjEwNDkgKDB4NDE5KSAtIE91dCBWb2x1bWUgM1IKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQzUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDNSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUM1JfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzUl9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9QR0FfVk9MX01BU0sgICAgICAgICAgICAgICAweDAwRkUgIC8qIE9VVDNSX1BHQV9WT0wgLSBbNzoxXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfUEdBX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzUl9QR0FfVk9MIC0gWzc6MV0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1BHQV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNyAgLyogT1VUM1JfUEdBX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMTA1MCAoMHg0MUEpIC0gREFDIFZvbHVtZSBMaW1pdCAzTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQzTF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM0xfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1MSAoMHg0MUIpIC0gREFDIFZvbHVtZSBMaW1pdCAzUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQzUl9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM1JfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1MiAoMHg0MUMpIC0gT3V0IFZvbHVtZSA0TAorICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0X09TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRfT1NSICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDRMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNExfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQ0TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDRMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNExfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDRMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ0TF9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDUzICgweDQxRCkgLSBPdXQgVm9sdW1lIDRSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNFJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ0Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDRSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNFJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ0Ul9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNFJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRSX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNTQgKDB4NDFFKSAtIERBQyBWb2x1bWUgTGltaXQgNUwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNV9PU1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1X09TUiAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ1TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDVMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUNUxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ1TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDVMX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ1TF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNUxfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA1NSAoMHg0MUYpIC0gREFDIFZvbHVtZSBMaW1pdCA1UgorICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9BTkNfU1JDICAgICAgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDVSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX0FOQ19TUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNVJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfQU5DX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgIDExICAvKiBPVVQ1Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9BTkNfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX1ZPTF9MSU1fTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNVJfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9WT0xfTElNX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDVSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX0xJTV9XSURUSCAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1Ul9WT0xfTElNIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDU2ICgweDQyMCkgLSBEQUMgVm9sdW1lIExpbWl0IDZMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZfT1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNl9PU1IgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0FOQ19TUkMgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogT1VUNkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfQU5DX1NSQ19NQVNLICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2TF9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9BTkNfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgMTEgIC8qIE9VVDZMX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX0FOQ19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNkxfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfVk9MX0xJTV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ2TF9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX1ZPTF9MSU1fU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNkxfVk9MX0xJTSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfTElNX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDZMX1ZPTF9MSU0gLSBbNzowXSAqLworCisvKgorICogUjEwNTcgKDB4NDIxKSAtIERBQyBWb2x1bWUgTGltaXQgNlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfQU5DX1NSQyAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBPVVQ2Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9BTkNfU1JDX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIE9VVDZSX0FOQ19TUkMgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX0FOQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogT1VUNlJfQU5DX1NSQyAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfQU5DX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2Ul9BTkNfU1JDICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9WT0xfTElNX01BU0sgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDZSX1ZPTF9MSU0gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfVk9MX0xJTV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ2Ul9WT0xfTElNIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9MSU1fV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNlJfVk9MX0xJTSAtIFs3OjBdICovCisKKy8qCisgKiBSMTA4OCAoMHg0NDApIC0gREFDIEFFQyBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX1NSQ19NQVNLICAgICAgICAgICAgMHgwMDNDICAvKiBBRUNfTE9PUEJBQ0tfU1JDIC0gWzU6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0FFQ19MT09QQkFDS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUVDX0xPT1BCQUNLX1NSQyAtIFs1OjJdICovCisjZGVmaW5lIFdNNTEwMF9BRUNfTE9PUEJBQ0tfU1JDX1dJRFRIICAgICAgICAgICAgICAgIDQgIC8qIEFFQ19MT09QQkFDS19TUkMgLSBbNToyXSAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0VOQV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBRUNfRU5BX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX0VOQSAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRUNfTE9PUEJBQ0tfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BRUNfTE9PUEJBQ0tfRU5BX01BU0sgICAgICAgICAgICAweDAwMDEgIC8qIEFFQ19MT09QQkFDS19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FFQ19MT09QQkFDS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogQUVDX0xPT1BCQUNLX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUVDX0xPT1BCQUNLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBRUNfTE9PUEJBQ0tfRU5BICovCisKKy8qCisgKiBSMTA4OSAoMHg0NDEpIC0gT3V0cHV0IFZvbHVtZSBSYW1wCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WRF9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogT1VUX1ZEX1JBTVAgLSBbNjo0XSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZEX1JBTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0ICAvKiBPVVRfVkRfUkFNUCAtIFs2OjRdICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVkRfUkFNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVF9WRF9SQU1QIC0gWzY6NF0gKi8KKyNkZWZpbmUgV001MTAwX09VVF9WSV9SQU1QX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogT1VUX1ZJX1JBTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZJX1JBTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVRfVklfUkFNUCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVklfUkFNUF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE9VVF9WSV9SQU1QIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxMTUyICgweDQ4MCkgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMUwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxTF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMUxfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQxTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTMgKDB4NDgxKSAtIERBQyBEaWdpdGFsIFZvbHVtZSAxUgorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDFSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMVJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQxUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDFSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE1NCAoMHg0ODIpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDJMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMkxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQyTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDJMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUMkxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTU1ICgweDQ4MykgLSBEQUMgRGlnaXRhbCBWb2x1bWUgMlIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQyUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQyUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDJSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUMlJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQyUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTYgKDB4NDg0KSAtIERBQyBEaWdpdGFsIFZvbHVtZSAzTAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQzTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDNMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM0xfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUM0xfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQzTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQzTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDNMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE1NyAoMHg0ODUpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDNSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUM1JfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUM1JfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQzUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQzUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDNSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDNSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUM1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTU4ICgweDQ4NikgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNEwKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ0TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0TF9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNExfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNExfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ0TF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNTkgKDB4NDg3KSAtIERBQyBEaWdpdGFsIFZvbHVtZSA0UgorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ0Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDRSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDRSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNFJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNFJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ0Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ0Ul9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDRSX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE2MCAoMHg0ODgpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDVMCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDVMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNUxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1TF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDVMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDVMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMTYxICgweDQ4OSkgLSBEQUMgRGlnaXRhbCBWb2x1bWUgNVIKKyAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ1Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ1Ul9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDVSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDVSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUNVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfT1VUNVJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ1Ul9WT0wgLSBbNzowXSAqLworCisvKgorICogUjExNjIgKDB4NDhBKSAtIERBQyBEaWdpdGFsIFZvbHVtZSA2TAorICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBPVVQ2TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDZMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBPVVQ2TF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2TF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDggIC8qIE9VVDZMX1ZPTCAtIFs3OjBdICovCisKKy8qCisgKiBSMTE2MyAoMHg0OEIpIC0gREFDIERpZ2l0YWwgVm9sdW1lIDZSCisgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVRfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIE9VVF9WVSAqLworI2RlZmluZSBXTTUxMDBfT1VUX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBPVVRfVlUgKi8KKyNkZWZpbmUgV001MTAwX09VVF9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogT1VUX1ZVICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIE9VVDZSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogT1VUNlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfT1VUNlJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBPVVQ2Ul9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9PVVQ2Ul9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE9VVDZSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX09VVDZSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogT1VUNlJfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjE2ICgweDRDMCkgLSBQRE0gU1BLMSBDVFJMIDEKKyAqLworI2RlZmluZSBXTTUxMDBfU1BLMVJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFNQSzFSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMyAgLyogU1BLMVJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMVJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFNQSzFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFMX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogU1BLMUxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMUxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBTUEsxTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsxTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQSzFMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9FTkRJQU4gICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLMV9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMV9NVVRFX0VORElBTl9NQVNLICAgICAgICAgICAgMHgwMTAwICAvKiBTUEsxX01VVEVfRU5ESUFOICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX01VVEVfRU5ESUFOX1NISUZUICAgICAgICAgICAgICAgIDggIC8qIFNQSzFfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9FTkRJQU5fV0lEVEggICAgICAgICAgICAgICAgMSAgLyogU1BLMV9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMV9NVVRFX1NFUTFfTUFTSyAgICAgICAgICAgICAgMHgwMEZGICAvKiBTUEsxX01VVEVfU0VRMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX01VVEVfU0VRMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIFNQSzFfTVVURV9TRVExIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX1NQSzFfTVVURV9TRVExX1dJRFRIICAgICAgICAgICAgICAgICAgOCAgLyogU1BLMV9NVVRFX1NFUTEgLSBbNzowXSAqLworCisvKgorICogUjEyMTcgKDB4NEMxKSAtIFBETSBTUEsxIENUUkwgMgorICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFNQSzFfRk1UICovCisjZGVmaW5lIFdNNTEwMF9TUEsxX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNQSzFfRk1UICovCisKKy8qCisgKiBSMTIxOCAoMHg0QzIpIC0gUERNIFNQSzIgQ1RSTCAxCisgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogU1BLMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMlJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBTUEsyUl9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIFNQSzJSX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogU1BLMlJfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMkxfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFNQSzJMX01VVEUgKi8KKyNkZWZpbmUgV001MTAwX1NQSzJMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxMiAgLyogU1BLMkxfTVVURSAqLworI2RlZmluZSBXTTUxMDBfU1BLMkxfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfRU5ESUFOICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNQSzJfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzJfTVVURV9FTkRJQU5fTUFTSyAgICAgICAgICAgIDB4MDEwMCAgLyogU1BLMl9NVVRFX0VORElBTiAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9NVVRFX0VORElBTl9TSElGVCAgICAgICAgICAgICAgICA4ICAvKiBTUEsyX01VVEVfRU5ESUFOICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfRU5ESUFOX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIFNQSzJfTVVURV9FTkRJQU4gKi8KKyNkZWZpbmUgV001MTAwX1NQSzJfTVVURV9TRVExX01BU0sgICAgICAgICAgICAgIDB4MDBGRiAgLyogU1BLMl9NVVRFX1NFUTEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9NVVRFX1NFUTFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBTUEsyX01VVEVfU0VRMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9TUEsyX01VVEVfU0VRMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIFNQSzJfTVVURV9TRVExIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjE5ICgweDRDMykgLSBQRE0gU1BLMiBDVFJMIDIKKyAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBTUEsyX0ZNVCAqLworI2RlZmluZSBXTTUxMDBfU1BLMl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTUEsyX0ZNVCAqLworCisvKgorICogUjEyODAgKDB4NTAwKSAtIEF1ZGlvIElGIDFfMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfSU5WICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19JTlZfTUFTSyAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGMV9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICA3ICAvKiBBSUYxX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkMgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYxX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMV9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFIgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0JDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9CQ0xLX0ZSRVFfTUFTSyAgICAgICAgICAgICAgMHgwMDFGICAvKiBBSUYxX0JDTEtfRlJFUSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0JDTEtfRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfQkNMS19GUkVRX1dJRFRIICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMV9CQ0xLX0ZSRVEgLSBbNDowXSAqLworCisvKgorICogUjEyODEgKDB4NTAxKSAtIEF1ZGlvIElGIDFfMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSSAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfREFUX1RSSV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9EQVRfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfU1JDICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19TUkNfTUFTSyAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMVRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAzICAvKiBBSUYxVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19JTlYgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMVRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMVRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0ZSQyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfRlJDX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9MUkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogQUlGMVRYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX0xSQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYxVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUiAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9NQVNLICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfTFJDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWF9MUkNMS19NU1RSICovCisKKy8qCisgKiBSMTI4MiAoMHg1MDIpIC0gQXVkaW8gSUYgMV8zCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19JTlYgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMVJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0ZSQyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfRlJDX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9MUkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX0xSQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUiAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9NQVNLICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfTFJDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWF9MUkNMS19NU1RSICovCisKKy8qCisgKiBSMTI4MyAoMHg1MDMpIC0gQXVkaW8gSUYgMV80CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVFJJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMV9SQVRFIC0gWzE6MF0gKi8KKworLyoKKyAqIFIxMjg0ICgweDUwNCkgLSBBdWRpbyBJRiAxXzUKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBBSUYxX0ZNVCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFfRk1UIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRk1UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMV9GTVQgLSBbMjowXSAqLworCisvKgorICogUjEyODUgKDB4NTA1KSAtIEF1ZGlvIElGIDFfNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfQkNQRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRjFUWF9CQ1BGIC0gWzEyOjBdICovCisKKy8qCisgKiBSMTI4NiAoMHg1MDYpIC0gQXVkaW8gSUYgMV83CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX01BU0sgICAgICAgICAgICAgICAgIDB4MUZGRiAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9CQ1BGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGMVJYX0JDUEYgLSBbMTI6MF0gKi8KKworLyoKKyAqIFIxMjg3ICgweDUwNykgLSBBdWRpbyBJRiAxXzgKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1dMX01BU0sgICAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBBSUYxVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFUWF9XTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQUlGMVRYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFhfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVRYX1NMT1RfTEVOX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBBSUYxVFhfU0xPVF9MRU4gLSBbNzowXSAqLworCisvKgorICogUjEyODggKDB4NTA4KSAtIEF1ZGlvIElGIDFfOQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEFJRjFSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBSUYxUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWF9XTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMVJYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fTUFTSyAgICAgICAgICAgICAweDAwRkYgIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhfU0xPVF9MRU5fV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIEFJRjFSWF9TTE9UX0xFTiAtIFs3OjBdICovCisKKy8qCisgKiBSMTI4OSAoMHg1MDkpIC0gQXVkaW8gSUYgMV8xMAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDFfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MCAoMHg1MEEpIC0gQXVkaW8gSUYgMV8xMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDJfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MSAoMHg1MEIpIC0gQXVkaW8gSUYgMV8xMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDNfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MiAoMHg1MEMpIC0gQXVkaW8gSUYgMV8xMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDRfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5MyAoMHg1MEQpIC0gQXVkaW8gSUYgMV8xNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDVfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NCAoMHg1MEUpIC0gQXVkaW8gSUYgMV8xNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDZfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NSAoMHg1MEYpIC0gQXVkaW8gSUYgMV8xNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDdfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NiAoMHg1MTApIC0gQXVkaW8gSUYgMV8xNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDhfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5NyAoMHg1MTEpIC0gQXVkaW8gSUYgMV8xOAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDFfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5OCAoMHg1MTIpIC0gQXVkaW8gSUYgMV8xOQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDJfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTI5OSAoMHg1MTMpIC0gQXVkaW8gSUYgMV8yMAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDNfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMCAoMHg1MTQpIC0gQXVkaW8gSUYgMV8yMQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDRfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMSAoMHg1MTUpIC0gQXVkaW8gSUYgMV8yMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDVfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMiAoMHg1MTYpIC0gQXVkaW8gSUYgMV8yMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDZfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwMyAoMHg1MTcpIC0gQXVkaW8gSUYgMV8yNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDdfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwNCAoMHg1MTgpIC0gQXVkaW8gSUYgMV8yNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfTUFTSyAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDhfU0xPVCAtIFs1OjBdICovCisKKy8qCisgKiBSMTMwNSAoMHg1MTkpIC0gQXVkaW8gSUYgMV8yNgorICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg4X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg3X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg2X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg1X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFg0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFUWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxVFgxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFUWDFfRU5BICovCisKKy8qCisgKiBSMTMwNiAoMHg1MUEpIC0gQXVkaW8gSUYgMV8yNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg4X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDhfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg3X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg2X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDZfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg1X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDVfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlg0X0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjFSWDFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlgxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWDFfRU5BICovCisKKy8qCisgKiBSMTM0NCAoMHg1NDApIC0gQXVkaW8gSUYgMl8xCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQUlGMl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0lOVl9NQVNLICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYyX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgIDcgIC8qIEFJRjJfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSQyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfRlJDX01BU0sgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjJfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMl9CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUiAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfTVNUUl9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJfQkNMS19NU1RSICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0JDTEtfRlJFUV9NQVNLICAgICAgICAgICAgICAweDAwMUYgIC8qIEFJRjJfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfQkNMS19GUkVRX1NISUZUICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMl9CQ0xLX0ZSRVEgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9CQ0xLX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICA1ICAvKiBBSUYyX0JDTEtfRlJFUSAtIFs0OjBdICovCisKKy8qCisgKiBSMTM0NSAoMHg1NDEpIC0gQXVkaW8gSUYgMl8yCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9EQVRfVFJJX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0RBVF9UUkkgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19TUkMgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMlRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX1NSQ19NQVNLICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYyVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgIDMgIC8qIEFJRjJUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYyVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjJUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUlGMlRYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYyVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfRlJDICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19GUkNfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX0xSQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAxICAvKiBBSUYyVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfTFJDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX01BU0sgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9MUkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYX0xSQ0xLX01TVFIgKi8KKworLyoKKyAqIFIxMzQ2ICgweDU0MikgLSBBdWRpbyBJRiAyXzMKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYyUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjJSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogQUlGMlJYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfRlJDICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19GUkNfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0xSQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfTFJDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX01BU0sgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9MUkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYX0xSQ0xLX01TVFIgKi8KKworLyoKKyAqIFIxMzQ3ICgweDU0MykgLSBBdWRpbyBJRiAyXzQKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUkkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9UUklfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUYyX1JBVEUgLSBbMTowXSAqLworCisvKgorICogUjEzNDggKDB4NTQ0KSAtIEF1ZGlvIElGIDJfNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEFJRjJfRk1UIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRk1UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMl9GTVQgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBBSUYyX0ZNVCAtIFsyOjBdICovCisKKy8qCisgKiBSMTM0OSAoMHg1NDUpIC0gQXVkaW8gSUYgMl82CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX01BU0sgICAgICAgICAgICAgICAgIDB4MUZGRiAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9CQ1BGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxMyAgLyogQUlGMlRYX0JDUEYgLSBbMTI6MF0gKi8KKworLyoKKyAqIFIxMzUwICgweDU0NikgLSBBdWRpbyBJRiAyXzcKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfTUFTSyAgICAgICAgICAgICAgICAgMHgxRkZGICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX0JDUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYyUlhfQkNQRiAtIFsxMjowXSAqLworCisvKgorICogUjEzNTEgKDB4NTQ3KSAtIEF1ZGlvIElGIDJfOAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEFJRjJUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlRYX1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBBSUYyVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWF9XTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fTUFTSyAgICAgICAgICAgICAweDAwRkYgIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyVFhfU0xPVF9MRU5fV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIEFJRjJUWF9TTE9UX0xFTiAtIFs3OjBdICovCisKKy8qCisgKiBSMTM1MiAoMHg1NDgpIC0gQXVkaW8gSUYgMl85CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9XTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4M0YwMCAgLyogQUlGMlJYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJRjJSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYyUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWF9TTE9UX0xFTl9XSURUSCAgICAgICAgICAgICAgICAgOCAgLyogQUlGMlJYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMzUzICgweDU0OSkgLSBBdWRpbyBJRiAyXzEwCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYMV9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzU0ICgweDU0QSkgLSBBdWRpbyBJRiAyXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlRYMl9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzYxICgweDU1MSkgLSBBdWRpbyBJRiAyXzE4CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlJYMV9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzYyICgweDU1MikgLSBBdWRpbyBJRiAyXzE5CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAzRiAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgNiAgLyogQUlGMlJYMl9TTE9UIC0gWzU6MF0gKi8KKworLyoKKyAqIFIxMzY5ICgweDU1OSkgLSBBdWRpbyBJRiAyXzI2CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlRYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJUWDFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlRYMV9FTkEgKi8KKworLyoKKyAqIFIxMzcwICgweDU1QSkgLSBBdWRpbyBJRiAyXzI3CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWDFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYMV9FTkEgKi8KKworLyoKKyAqIFIxNDA4ICgweDU4MCkgLSBBdWRpbyBJRiAzXzEKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYzX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAweDAwODAgIC8qIEFJRjNfQkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgNyAgLyogQUlGM19CQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzX0JDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJDICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19GUkNfTUFTSyAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGM19CQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzX0JDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfQkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19NU1RSX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM19CQ0xLX01TVFIgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfQkNMS19GUkVRX01BU0sgICAgICAgICAgICAgIDB4MDAxRiAgLyogQUlGM19CQ0xLX0ZSRVEgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM19CQ0xLX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzX0JDTEtfRlJFUSAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0JDTEtfRlJFUV9XSURUSCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjNfQkNMS19GUkVRIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNDA5ICgweDU4MSkgLSBBdWRpbyBJRiAzXzIKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUkkgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0RBVF9UUklfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfREFUX1RSSSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX1NSQyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYzVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfU1JDX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNUWF9MUkNMS19TUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogQUlGM1RYX0xSQ0xLX1NSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfTFJDTEtfU1JDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGM1RYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBBSUYzVFhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNUWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19GUkMgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGM1RYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfTFJDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNUWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9MUkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGM1RYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFIgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfTUFTSyAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0xSQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAxICAvKiBBSUYzVFhfTFJDTEtfTVNUUiAqLworCisvKgorICogUjE0MTAgKDB4NTgyKSAtIEF1ZGlvIElGIDNfMworICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGM1JYX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBBSUYzUlhfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWF9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19GUkMgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGM1JYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlhfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfTFJDTEtfRlJDX1NISUZUICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWF9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9MUkNMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogQUlGM1JYX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFIgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfTUFTSyAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfU0hJRlQgICAgICAgICAgICAgICAwICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX0xSQ0xLX01TVFJfV0lEVEggICAgICAgICAgICAgICAxICAvKiBBSUYzUlhfTFJDTEtfTVNUUiAqLworCisvKgorICogUjE0MTEgKDB4NTgzKSAtIEF1ZGlvIElGIDNfNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1RSSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNfUkFURSAtIFsxOjBdICovCisKKy8qCisgKiBSMTQxMiAoMHg1ODQpIC0gQXVkaW8gSUYgM181CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogQUlGM19GTVQgLSBbMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM19GTVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzX0ZNVCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjNfRk1UIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxNDEzICgweDU4NSkgLSBBdWRpbyBJRiAzXzYKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfTUFTSyAgICAgICAgICAgICAgICAgMHgxRkZGICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX0JDUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzVFhfQkNQRiAtIFsxMjowXSAqLworCisvKgorICogUjE0MTQgKDB4NTg2KSAtIEF1ZGlvIElGIDNfNworICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfQkNQRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEFJRjNSWF9CQ1BGIC0gWzEyOjBdICovCisKKy8qCisgKiBSMTQxNSAoMHg1ODcpIC0gQXVkaW8gSUYgM184CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9XTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4M0YwMCAgLyogQUlGM1RYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzVFhfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEFJRjNUWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNUWF9TTE9UX0xFTl9XSURUSCAgICAgICAgICAgICAgICAgOCAgLyogQUlGM1RYX1NMT1RfTEVOIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxNDE2ICgweDU4OCkgLSBBdWRpbyBJRiAzXzkKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1dMX01BU0sgICAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBBSUYzUlhfV0wgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWF9XTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogQUlGM1JYX1dMIC0gWzEzOjhdICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEFJRjNSWF9XTCAtIFsxMzo4XSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYX1NMT1RfTEVOX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBBSUYzUlhfU0xPVF9MRU4gLSBbNzowXSAqLworCisvKgorICogUjE0MTcgKDB4NTg5KSAtIEF1ZGlvIElGIDNfMTAKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFgxX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MTggKDB4NThBKSAtIEF1ZGlvIElGIDNfMTEKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzVFgyX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MjUgKDB4NTkxKSAtIEF1ZGlvIElGIDNfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzUlgxX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MjYgKDB4NTkyKSAtIEF1ZGlvIElGIDNfMTkKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX01BU0sgICAgICAgICAgICAgICAgMHgwMDNGICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICA2ICAvKiBBSUYzUlgyX1NMT1QgLSBbNTowXSAqLworCisvKgorICogUjE0MzMgKDB4NTk5KSAtIEF1ZGlvIElGIDNfMjYKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzVFgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1RYMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzVFgxX0VOQSAqLworCisvKgorICogUjE0MzQgKDB4NTlBKSAtIEF1ZGlvIElGIDNfMjcKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzUlgxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlgxX0VOQSAqLworCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfTUFTSyAgICAgICAgICAgICAgICAweDAwRkUgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDcgIC8qIE1JWEVSX1ZPTCAtIFs3OjFdICovCisKKy8qCisgKiBSMzA3MiAoMHhDMDApIC0gR1BJTyBDVFJMIDEKKyAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDFfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AxX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AxX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AxX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQMV9QRCAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AxX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDFfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDFfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQMV9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDFfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQMV9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AxX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDFfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQMV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDFfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AxX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDFfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AxX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDFfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AxX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AxX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQMV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQMV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDFfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQMV9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3MyAoMHhDMDEpIC0gR1BJTyBDVFJMIDIKKyAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQMl9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AyX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQMl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AyX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AyX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQMl9QRCAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AyX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDJfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDJfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQMl9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDJfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQMl9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AyX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AyX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDJfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQMl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDJfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AyX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDJfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQMl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1AyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQMl9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AyX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQMl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQMl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDJfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQMl9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NCAoMHhDMDIpIC0gR1BJTyBDVFJMIDMKKyAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDNfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQM19ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQM19ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1AzX0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQM19QVSAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1AzX1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19QVSAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1AzX1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQM19QRCAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1AzX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDNfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDNfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQM19QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQM19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDNfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQM19PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQM19PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1AzX09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1AzX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDNfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQM19EQiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDNfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQM19EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1AzX0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDNfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQM19EQiAqLworI2RlZmluZSBXTTUxMDBfR1AzX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDNfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQM19MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQM19MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1AzX0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1AzX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQM19GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQM19GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDNfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQM19GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NSAoMHhDMDMpIC0gR1BJTyBDVFJMIDQKKyAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDRfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A0X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A0X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A0X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNF9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A0X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDRfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDRfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNF9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDRfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNF9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A0X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDRfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNF9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDRfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A0X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDRfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNF9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A0X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDRfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A0X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A0X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNF9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNF9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDRfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNF9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NiAoMHhDMDQpIC0gR1BJTyBDVFJMIDUKKyAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNV9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A1X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A1X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A1X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNV9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A1X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDVfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDVfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNV9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDVfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNV9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A1X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A1X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDVfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDVfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A1X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDVfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNV9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A1X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDVfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNV9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A1X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A1X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNV9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDVfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNV9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzA3NyAoMHhDMDUpIC0gR1BJTyBDVFJMIDYKKyAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUDZfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQNl9ESVIgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogR1A2X0RJUiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfRElSICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQNl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1A2X1BVICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNl9QVSAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1A2X1BEICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQNl9QRCAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1A2X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUDZfUE9MICovCisjZGVmaW5lIFdNNTEwMF9HUDZfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEdQNl9QT0wgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A2X1BPTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUDZfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDZfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEdQNl9PUF9DRkcgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1A2X09QX0NGRyAqLworI2RlZmluZSBXTTUxMDBfR1A2X09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfT1BfQ0ZHICovCisjZGVmaW5lIFdNNTEwMF9HUDZfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQNl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUDZfREIgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1A2X0RCICovCisjZGVmaW5lIFdNNTEwMF9HUDZfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQNl9EQiAqLworI2RlZmluZSBXTTUxMDBfR1A2X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBHUDZfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDZfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIEdQNl9MVkwgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogR1A2X0xWTCAqLworI2RlZmluZSBXTTUxMDBfR1A2X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUDZfTFZMICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwM0YgIC8qIEdQNl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQNl9GTiAtIFs1OjBdICovCisjZGVmaW5lIFdNNTEwMF9HUDZfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEdQNl9GTiAtIFs1OjBdICovCisKKy8qCisgKiBSMzEwNyAoMHhDMjMpIC0gTWlzYyBQYWQgQ3RybCAxCisgKi8KKyNkZWZpbmUgV001MTAwX0xETzFFTkFfUEQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogTERPMUVOQV9QRCAqLworI2RlZmluZSBXTTUxMDBfTERPMUVOQV9QRF9NQVNLICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBMRE8xRU5BX1BEICovCisjZGVmaW5lIFdNNTEwMF9MRE8xRU5BX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIExETzFFTkFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0xETzFFTkFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTERPMUVOQV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzJfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUEQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEyICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfTUNMSzFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfUkVTRVRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSRVNFVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUREUl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRERSX1BEICovCisjZGVmaW5lIFdNNTEwMF9BRERSX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFERFJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FERFJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQUREUl9QRCAqLworI2RlZmluZSBXTTUxMDBfQUREUl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRERSX1BEICovCisKKy8qCisgKiBSMzEwOCAoMHhDMjQpIC0gTWlzYyBQYWQgQ3RybCAyCisgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQ0X1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQzX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV001MTAwX0RNSUNEQVQxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRE1JQ0RBVDFfUEQgKi8KKworLyoKKyAqIFIzMTA5ICgweEMyNSkgLSBNaXNjIFBhZCBDdHJsIDMKKyAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFUgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfTUFTSyAgICAgICAgICAgICAgMHgwMDIwICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfU0hJRlQgICAgICAgICAgICAgICAgICA1ICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUFVfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhMUkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUEQgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfTUFTSyAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfU0hJRlQgICAgICAgICAgICAgICAgICA0ICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYTFJDTEtfUERfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhMUkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFUgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxQkNMS19QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUEQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMUJDTEtfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxQkNMS19QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BVICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYxUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QVV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMVJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhEQVRfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjFSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGMVJYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYxUlhEQVRfUERfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjFSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMVJYREFUX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYxUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFSWERBVF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMVJYREFUX1BEICovCisKKy8qCisgKiBSMzExMCAoMHhDMjYpIC0gTWlzYyBQYWQgQ3RybCA0CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX01BU0sgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX1NISUZUICAgICAgICAgICAgICAgICAgNSAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYTFJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX01BU0sgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX1NISUZUICAgICAgICAgICAgICAgICAgNCAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWExSQ0xLX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYTFJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgMyAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMkJDTEtfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJCQ0xLX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMkJDTEtfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QVSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQUlGMlJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUFVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjJSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYREFUX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYyUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMlJYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUEQgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjJSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGMlJYREFUX1BEX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYyUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJSWERBVF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogQUlGMlJYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYyUlhEQVRfUERfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJSWERBVF9QRCAqLworCisvKgorICogUjMxMTEgKDB4QzI3KSAtIE1pc2MgUGFkIEN0cmwgNQorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVSAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9NQVNLICAgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9TSElGVCAgICAgICAgICAgICAgICAgIDUgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QVV9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWExSQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRCAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9NQVNLICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9TSElGVCAgICAgICAgICAgICAgICAgIDQgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhMUkNMS19QRF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWExSQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVSAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNCQ0xLX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzQkNMS19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNCQ0xLX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUFUgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjNSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BVX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzUlhEQVRfUFUgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWERBVF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM1JYREFUX1BVICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNSWERBVF9QVSAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BEICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzUlhEQVRfUEQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNSWERBVF9QRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGM1JYREFUX1BEICovCisjZGVmaW5lIFdNNTEwMF9BSUYzUlhEQVRfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFJRjNSWERBVF9QRCAqLworI2RlZmluZSBXTTUxMDBfQUlGM1JYREFUX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYzUlhEQVRfUEQgKi8KKworLyoKKyAqIFIzMTEyICgweEMyOCkgLSBNaXNjIEdQSU8gMQorICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9PUENMS19TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE9QQ0xLX1NFTCAtIFsxOjBdICovCisKKy8qCisgKiBSMzMyOCAoMHhEMDApIC0gSW50ZXJydXB0IFN0YXR1cyAxCisgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQM19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0dQMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1AxX0VJTlQgKi8KKworLyoKKyAqIFIzMzI5ICgweEQwMSkgLSBJbnRlcnJ1cHQgU3RhdHVzIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNl9FSU5UX01BU0sgICAgICAgICAgICAgICAweDAwMjAgIC8qIERTUF9JUlE2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgNSAgLyogRFNQX0lSUTZfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE1X0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRFNQX0lSUTVfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBEU1BfSVJRNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEU1BfSVJRNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDMgIC8qIERTUF9JUlE0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBEU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRM19FSU5UX01BU0sgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTUF9JUlEzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMiAgLyogRFNQX0lSUTNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9FSU5UICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEyX0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRFNQX0lSUTJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRFNQX0lSUTFfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1BfSVJRMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUF9JUlExX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTFfRUlOVCAqLworCisvKgorICogUjMzMzAgKDB4RDAyKSAtIEludGVycnVwdCBTdGF0dXMgMworICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9FSU5UICAgICAgICAgICAweDgwMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX0VJTlRfTUFTSyAgICAgIDB4ODAwMCAgLyogU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fRUlOVF9TSElGVCAgICAgICAgIDE1ICAvKiBTUEtfU0hVVERPV05fV0FSTl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9FSU5UX1dJRFRIICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX01BU0sgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX1NISUZUICAgICAgICAgICAgICAxNCAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogU1BLX1NIVVRET1dOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX0VJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSFBERVRfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBIUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9IUERFVF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEhQREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEyICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUNDREVUX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBBQ0NERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfRUlOVCAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9FSU5UX01BU0sgICAgICAgICAgICAweDAyMDAgIC8qIERSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMl9MT0NLX0VJTlQgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEFTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMyX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMl9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkMxX0xPQ0tfRUlOVF9NQVNLICAgICAgICAgICAgIDB4MDA4MCAgLyogQVNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDMV9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDcgIC8qIEFTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwOCAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMiAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfRUlOVCAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDIgIC8qIENMS0dFTl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ0xLR0VOX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAxICAvKiBDTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlQgICAgICAgICAgICAweDAwMDEgIC8qIENMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ0xLR0VOX0VSUl9BU1lOQ19FSU5UX01BU0sgICAgICAgMHgwMDAxICAvKiBDTEtHRU5fRVJSX0FTWU5DX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfRUlOVF9TSElGVCAgICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DTEtHRU5fRVJSX0FTWU5DX0VJTlRfV0lEVEggICAgICAgICAgIDEgIC8qIENMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworCisvKgorICogUjMzMzEgKDB4RDAzKSAtIEludGVycnVwdCBTdGF0dXMgNAorICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9FSU5UICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX0VJTlRfTUFTSyAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGM19FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX0VJTlQgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9FUlJfRUlOVF9NQVNLICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUYyX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgMTIgIC8qIEFJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgMSAgLyogQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAgICAweDA4MDAgIC8qIEFJRjFfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAxMSAgLyogQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlQgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIENUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQ1RSTElGX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAgMHgwNDAwICAvKiBDVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxMCAgLyogQ1RSTElGX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9DVFJMSUZfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIENUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICA5ICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAxICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICA4ICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAxICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgICAgMHgwMDgwICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgICAgMHgwMDgwICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgICA3ICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgICAxICAvKiBGWF9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgICAgMHgwMDQwICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAweDAwNDAgIC8qIEFJRjNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgNiAgLyogQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgICAxICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAgIDB4MDAyMCAgLyogQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICAgICA1ICAvKiBBSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgIDEgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgIDB4MDAxMCAgLyogQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgICAgMHgwMDEwICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgIDQgIC8qIEFJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgMSAgLyogQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgICAgMHgwMDA4ICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAweDAwMDggIC8qIEFTUkNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgMyAgLyogQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgICAxICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfREFDX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgICAgMHgwMDA0ICAvKiBEQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0RBQ19VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICAgICAgMiAgLyogREFDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgICAgIDEgIC8qIERBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgICAgMHgwMDAyICAvKiBBRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0FEQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgICAgIDB4MDAwMiAgLyogQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfQURDX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgICAxICAvKiBBRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgMCAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKworLyoKKyAqIFIzMzMyICgweEQwNCkgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyAyCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogRFNQX0lSUTZfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNl9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERTUF9JUlE2X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTZfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICA1ICAvKiBEU1BfSVJRNl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE2X1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTZfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERTUF9JUlE1X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTVfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEU1BfSVJRNV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE1X1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgNCAgLyogRFNQX0lSUTVfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNV9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlE1X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEU1BfSVJRNF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlE0X1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNQX0lSUTRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRNF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDMgIC8qIERTUF9JUlE0X1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTRfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRNF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRFNQX0lSUTNfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRM19TVFNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTUF9JUlEzX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTNfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAyICAvKiBEU1BfSVJRM19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEzX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTNfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9TVFMgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERTUF9JUlEyX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTJfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEU1BfSVJRMl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlEyX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQX0lSUTJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUF9JUlEyX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1BfSVJRMV9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RTUF9JUlExX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRFNQX0lSUTFfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EU1BfSVJRMV9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUF9JUlExX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFNQX0lSUTFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1BfSVJRMV9TVFMgKi8KKworLyoKKyAqIFIzMzMzICgweEQwNSkgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyAzCisgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUUyAgICAgICAgICAgIDB4ODAwMCAgLyogU1BLX1NIVVRET1dOX1dBUk5fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9TVFNfTUFTSyAgICAgICAweDgwMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX1NUUyAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1dBUk5fU1RTX1NISUZUICAgICAgICAgIDE1ICAvKiBTUEtfU0hVVERPV05fV0FSTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9XQVJOX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogU1BLX1NIVVRET1dOX1dBUk5fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fU1RTICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIFNQS19TSFVURE9XTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9TVFNfTUFTSyAgICAgICAgICAgIDB4NDAwMCAgLyogU1BLX1NIVVRET1dOX1NUUyAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX1NUU19TSElGVCAgICAgICAgICAgICAgIDE0ICAvKiBTUEtfU0hVVERPV05fU1RTICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fU1RTX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX1NUUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogSFBERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9IUERFVF9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEhQREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSFBERVRfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBIUERFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0hQREVUX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSFBERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lEX0RFVF9TVFMgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIERSQ19TSURfREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJRF9ERVRfU1RTX01BU0sgICAgICAgICAgICAgMHgwMjAwICAvKiBEUkNfU0lEX0RFVF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSURfREVUX1NUU19TSElGVCAgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJRF9ERVRfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lEX0RFVF9TVFNfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIERSQ19TSURfREVUX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMTAwICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICA4ICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzJfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgMHgwMDgwICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICA3ICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQzFfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBGTEwyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDggIC8qIEZMTDJfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBGTEwyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTDFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAyICAvKiBGTEwxX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTDFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTICAgICAgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX01BU0sgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX1NISUZUICAgICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfU1RTX1dJRFRIICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19TVFMgKi8KKworLyoKKyAqIFIzMzM0ICgweEQwNikgLSBJbnRlcnJ1cHQgUmF3IFN0YXR1cyA0CisgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX1NUUyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQUlGM19FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX0VSUl9TVFNfTUFTSyAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEFJRjNfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDEzICAvKiBBSUYzX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfRVJSX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogQUlGM19FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9TVFMgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIEFJRjJfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBBSUYyX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfRVJSX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAxMiAgLyogQUlGMl9FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX0VSUl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfU1RTICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBBSUYxX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfRVJSX1NUU19NQVNLICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogQUlGMV9FUlJfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX0VSUl9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEgIC8qIEFJRjFfRVJSX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBBSUYxX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX01BU0sgICAgICAgICAgICAgIDB4MDQwMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX1NISUZUICAgICAgICAgICAgICAgICAxMCAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0NUUkxJRl9FUlJfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgMSAgLyogQ1RSTElGX0VSUl9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9TVFMgICAgICAgICAgIDB4MDIwMCAgLyogSVNSQzJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzJfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgMHgwMjAwICAvKiBJU1JDMl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMl9VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgIDkgIC8qIElTUkMyX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMyX1VOREVSQ0xPQ0tFRF9TVFNfV0lEVEggICAgICAgICAgMSAgLyogSVNSQzJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgMHgwMTAwICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9JU1JDMV9VTkRFUkNMT0NLRURfU1RTX01BU0sgICAgICAweDAxMDAgIC8qIElTUkMxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0lTUkMxX1VOREVSQ0xPQ0tFRF9TVFNfU0hJRlQgICAgICAgICAgOCAgLyogSVNSQzFfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfSVNSQzFfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAxICAvKiBJU1JDMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GWF9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAgICAweDAwODAgIC8qIEZYX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0ZYX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAgIDB4MDA4MCAgLyogRlhfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfRlhfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgICA3ICAvKiBGWF9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9GWF9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgICAgIDEgIC8qIEZYX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgIDB4MDA0MCAgLyogQUlGM19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYzX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAweDAwNDAgIC8qIEFJRjNfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGM19VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgICA2ICAvKiBBSUYzX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogQUlGM19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9TVFMgICAgICAgICAgICAweDAwMjAgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMl9VTkRFUkNMT0NLRURfU1RTX01BU0sgICAgICAgMHgwMDIwICAvKiBBSUYyX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjJfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgNSAgLyogQUlGMl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYyX1VOREVSQ0xPQ0tFRF9TVFNfV0lEVEggICAgICAgICAgIDEgIC8qIEFJRjJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FJRjFfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgIDB4MDAxMCAgLyogQUlGMV9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BSUYxX1VOREVSQ0xPQ0tFRF9TVFNfU0hJRlQgICAgICAgICAgIDQgIC8qIEFJRjFfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQUlGMV9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgICAxICAvKiBBSUYxX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgIDB4MDAwOCAgLyogQVNSQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BU1JDX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgICAweDAwMDggIC8qIEFTUkNfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfQVNSQ19VTkRFUkNMT0NLRURfU1RTX1NISUZUICAgICAgICAgICAzICAvKiBBU1JDX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX0FTUkNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgMSAgLyogQVNSQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgICAweDAwMDQgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgIDIgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9EQUNfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgIDEgIC8qIERBQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUUyAgICAgICAgICAgICAweDAwMDIgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19NQVNLICAgICAgICAweDAwMDIgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9BRENfVU5ERVJDTE9DS0VEX1NUU19XSURUSCAgICAgICAgICAgIDEgIC8qIEFEQ19VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfU1RTICAgICAgICAgICAweDAwMDEgIC8qIE1JWEVSX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKyNkZWZpbmUgV001MTAwX01JWEVSX1VOREVSQ0xPQ0tFRF9TVFNfTUFTSyAgICAgIDB4MDAwMSAgLyogTUlYRVJfVU5ERVJDTE9DS0VEX1NUUyAqLworI2RlZmluZSBXTTUxMDBfTUlYRVJfVU5ERVJDTE9DS0VEX1NUU19TSElGVCAgICAgICAgICAwICAvKiBNSVhFUl9VTkRFUkNMT0NLRURfU1RTICovCisjZGVmaW5lIFdNNTEwMF9NSVhFUl9VTkRFUkNMT0NLRURfU1RTX1dJRFRIICAgICAgICAgIDEgIC8qIE1JWEVSX1VOREVSQ0xPQ0tFRF9TVFMgKi8KKworLyoKKyAqIFIzMzM1ICgweEQwNykgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzaworICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDVfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDggIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9HUDFfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0dQMV9FSU5UICovCisKKy8qCisgKiBSMzMzNiAoMHhEMDgpIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTZfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBJTV9EU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNl9FSU5UX01BU0sgICAgICAgICAgICAweDAwMjAgIC8qIElNX0RTUF9JUlE2X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE2X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgNSAgLyogSU1fRFNQX0lSUTZfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTZfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRNl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNV9FSU5UICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIElNX0RTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE1X0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDAxMCAgLyogSU1fRFNQX0lSUTVfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICA0ICAvKiBJTV9EU1BfSVJRNV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0RTUF9JUlE1X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE0X0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogSU1fRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTRfRUlOVF9NQVNLICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9EU1BfSVJRNF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgIDMgIC8qIElNX0RTUF9JUlE0X0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlE0X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fRFNQX0lSUTRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTNfRUlOVCAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9EU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRM19FSU5UX01BU0sgICAgICAgICAgICAweDAwMDQgIC8qIElNX0RTUF9JUlEzX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlEzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgMiAgLyogSU1fRFNQX0lSUTNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTNfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRM19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMl9FSU5UICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIElNX0RTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlEyX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDAwMiAgLyogSU1fRFNQX0lSUTJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTJfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAxICAvKiBJTV9EU1BfSVJRMl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0RTUF9JUlEyX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlExX0VJTlQgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU1fRFNQX0lSUTFfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFNQX0lSUTFfRUlOVF9NQVNLICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9EU1BfSVJRMV9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EU1BfSVJRMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgIDAgIC8qIElNX0RTUF9JUlExX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RTUF9JUlExX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fRFNQX0lSUTFfRUlOVCAqLworCisvKgorICogUjMzMzcgKDB4RDA5KSAtIEludGVycnVwdCBTdGF0dXMgMyBNYXNrCisgKi8KKyNkZWZpbmUgV001MTAwX0lNX1NQS19TSFVURE9XTl9XQVJOX0VJTlQgICAgICAgIDB4ODAwMCAgLyogSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVF9NQVNLICAgMHg4MDAwICAvKiBJTV9TUEtfU0hVVERPV05fV0FSTl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9TUEtfU0hVVERPV05fV0FSTl9FSU5UX1NISUZUICAgICAgMTUgIC8qIElNX1NQS19TSFVURE9XTl9XQVJOX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX1NQS19TSFVURE9XTl9XQVJOX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fU1BLX1NIVVRET1dOX1dBUk5fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlQgICAgICAgICAgICAgMHg0MDAwICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfTUFTSyAgICAgICAgMHg0MDAwICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfU0hJRlQgICAgICAgICAgIDE0ICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fU1BLX1NIVVRET1dOX0VJTlRfV0lEVEggICAgICAgICAgICAxICAvKiBJTV9TUEtfU0hVVERPV05fRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fSFBERVRfRUlOVCAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9IUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9IUERFVF9FSU5UX01BU0sgICAgICAgICAgICAgICAweDIwMDAgIC8qIElNX0hQREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0hQREVUX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAxMyAgLyogSU1fSFBERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fSFBERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9IUERFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVCAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9NQVNLICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMTIgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BQ0NERVRfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgIDEgIC8qIElNX0FDQ0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EUkNfU0lHX0RFVF9FSU5UICAgICAgICAgICAgICAweDAyMDAgIC8qIElNX0RSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RSQ19TSUdfREVUX0VJTlRfTUFTSyAgICAgICAgIDB4MDIwMCAgLyogSU1fRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRFJDX1NJR19ERVRfRUlOVF9TSElGVCAgICAgICAgICAgICA5ICAvKiBJTV9EUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EUkNfU0lHX0RFVF9FSU5UX1dJRFRIICAgICAgICAgICAgIDEgIC8qIElNX0RSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVCAgICAgICAgICAgICAgIDB4MDEwMCAgLyogSU1fQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAweDAxMDAgIC8qIElNX0FTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQzJfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICA4ICAvKiBJTV9BU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMyX0xPQ0tfRUlOVF9XSURUSCAgICAgICAgICAgICAgMSAgLyogSU1fQVNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAweDAwODAgIC8qIElNX0FTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQzFfTE9DS19FSU5UX01BU0sgICAgICAgICAgMHgwMDgwICAvKiBJTV9BU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkMxX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgNyAgLyogSU1fQVNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgIDEgIC8qIElNX0FTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgMHgwMDA4ICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAzICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMl9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxICAvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgMHgwMDA0ICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAyICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fRkxMMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxICAvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9FSU5UICAgICAgICAgICAgICAgMHgwMDAyICAvKiBJTV9DTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfRUlOVF9NQVNLICAgICAgICAgIDB4MDAwMiAgLyogSU1fQ0xLR0VOX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DTEtHRU5fRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgIDEgIC8qIElNX0NMS0dFTl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DTEtHRU5fRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVCAgICAgICAgIDB4MDAwMSAgLyogSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DTEtHRU5fRVJSX0FTWU5DX0VJTlRfTUFTSyAgICAweDAwMDEgIC8qIElNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UX1NISUZUICAgICAgICAwICAvKiBJTV9DTEtHRU5fRVJSX0FTWU5DX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NMS0dFTl9FUlJfQVNZTkNfRUlOVF9XSURUSCAgICAgICAgMSAgLyogSU1fQ0xLR0VOX0VSUl9BU1lOQ19FSU5UICovCisKKy8qCisgKiBSMzMzOCAoMHhEMEEpIC0gSW50ZXJydXB0IFN0YXR1cyA0IE1hc2sKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19FUlJfRUlOVCAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBJTV9BSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYzX0VSUl9FSU5UX01BU0sgICAgICAgICAgICAweDIwMDAgIC8qIElNX0FJRjNfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAxMyAgLyogSU1fQUlGM19FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBJTV9BSUYzX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX0VSUl9FSU5UICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIElNX0FJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjJfRVJSX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MTAwMCAgLyogSU1fQUlGMl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9FUlJfRUlOVF9TSElGVCAgICAgICAgICAgICAgIDEyICAvKiBJTV9BSUYyX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIElNX0FJRjJfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfRVJSX0VJTlQgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogSU1fQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMV9FUlJfRUlOVF9NQVNLICAgICAgICAgICAgMHgwODAwICAvKiBJTV9BSUYxX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgMTEgIC8qIElNX0FJRjFfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgMSAgLyogSU1fQUlGMV9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ1RSTElGX0VSUl9FSU5UICAgICAgICAgICAgICAgMHgwNDAwICAvKiBJTV9DVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0NUUkxJRl9FUlJfRUlOVF9NQVNLICAgICAgICAgIDB4MDQwMCAgLyogSU1fQ1RSTElGX0VSUl9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9DVFJMSUZfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgMTAgIC8qIElNX0NUUkxJRl9FUlJfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQ1RSTElGX0VSUl9FSU5UX1dJRFRIICAgICAgICAgICAgICAxICAvKiBJTV9DVFJMSUZfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgIDB4MDIwMCAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgIDB4MDIwMCAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgOSAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMyX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgMSAgLyogSU1fSVNSQzJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgIDB4MDEwMCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgIDB4MDEwMCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgOCAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lTUkMxX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgMSAgLyogSU1fSVNSQzFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgIDB4MDA4MCAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAgIDB4MDA4MCAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAgNyAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0ZYX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAgMSAgLyogSU1fRlhfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgIDB4MDA0MCAgLyogSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgMHgwMDQwICAvKiBJTV9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYzX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgIDYgIC8qIElNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fQUlGM19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgMHgwMDIwICAvKiBJTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UX01BU0sgICAweDAwMjAgIC8qIElNX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjJfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgNSAgLyogSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMl9VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAxICAvKiBJTV9BSUYyX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAweDAwMTAgIC8qIElNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgIDB4MDAxMCAgLyogSU1fQUlGMV9VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQUlGMV9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgICA0ICAvKiBJTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BSUYxX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgIDEgIC8qIElNX0FJRjFfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgICAgICAgIDB4MDAwOCAgLyogSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgMHgwMDA4ICAvKiBJTV9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BU1JDX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgIDMgIC8qIElNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FTUkNfVU5ERVJDTE9DS0VEX0VJTlRfV0lEVEggICAgICAgMSAgLyogSU1fQVNSQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UICAgICAgICAgMHgwMDA0ICAvKiBJTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0RBQ19VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAgIDB4MDAwNCAgLyogSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlRfU0hJRlQgICAgICAgIDIgIC8qIElNX0RBQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fREFDX1VOREVSQ0xPQ0tFRF9FSU5UX1dJRFRIICAgICAgICAxICAvKiBJTV9EQUNfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FEQ19VTkRFUkNMT0NLRURfRUlOVCAgICAgICAgIDB4MDAwMiAgLyogSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9BRENfVU5ERVJDTE9DS0VEX0VJTlRfTUFTSyAgICAweDAwMDIgIC8qIElNX0FEQ19VTkRFUkNMT0NLRURfRUlOVCAqLworI2RlZmluZSBXTTUxMDBfSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UX1NISUZUICAgICAgICAxICAvKiBJTV9BRENfVU5ERVJDTE9DS0VEX0VJTlQgKi8KKyNkZWZpbmUgV001MTAwX0lNX0FEQ19VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgICAgMSAgLyogSU1fQURDX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVCAgICAgICAweDAwMDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9NQVNLICAweDAwMDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9TSElGVCAgICAgIDAgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisjZGVmaW5lIFdNNTEwMF9JTV9NSVhFUl9VTkRFUkNMT0NLRURfRUlOVF9XSURUSCAgICAgIDEgIC8qIElNX01JWEVSX1VOREVSQ0xPQ0tFRF9FSU5UICovCisKKy8qCisgKiBSMzM1OSAoMHhEMUYpIC0gSW50ZXJydXB0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTUxMDBfSU1fSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBJTV9JUlEgKi8KKyNkZWZpbmUgV001MTAwX0lNX0lSUV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogSU1fSVJRICovCisjZGVmaW5lIFdNNTEwMF9JTV9JUlFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIElNX0lSUSAqLworI2RlZmluZSBXTTUxMDBfSU1fSVJRX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBJTV9JUlEgKi8KKworLyoKKyAqIFIzMzYwICgweEQyMCkgLSBJUlEgRGVib3VuY2UgMQorICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQiAgICAgICAgICAgICAweDAyMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9NQVNLICAgICAgICAweDAyMDAgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9TSElGVCAgICAgICAgICAgIDkgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fV0FSTl9EQl9XSURUSCAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9XQVJOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fREIgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFNQS19TSFVURE9XTl9EQiAqLworI2RlZmluZSBXTTUxMDBfU1BLX1NIVVRET1dOX0RCX01BU0sgICAgICAgICAgICAgMHgwMTAwICAvKiBTUEtfU0hVVERPV05fREIgKi8KKyNkZWZpbmUgV001MTAwX1NQS19TSFVURE9XTl9EQl9TSElGVCAgICAgICAgICAgICAgICAgOCAgLyogU1BLX1NIVVRET1dOX0RCICovCisjZGVmaW5lIFdNNTEwMF9TUEtfU0hVVERPV05fREJfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIFNQS19TSFVURE9XTl9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX0lSUV9EQiAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBGTEwxX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwxX0xPQ0tfSVJRX0RCX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIEZMTDFfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDFfTE9DS19JUlFfREJfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogRkxMMV9MT0NLX0lSUV9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMV9MT0NLX0lSUV9EQl9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBGTEwxX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfSVJRX0RCICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTDJfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0ZMTDJfTE9DS19JUlFfREJfTUFTSyAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMMl9MT0NLX0lSUV9EQiAqLworI2RlZmluZSBXTTUxMDBfRkxMMl9MT0NLX0lSUV9EQl9TSElGVCAgICAgICAgICAgICAgICAyICAvKiBGTEwyX0xPQ0tfSVJRX0RCICovCisjZGVmaW5lIFdNNTEwMF9GTEwyX0xPQ0tfSVJRX0RCX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEZMTDJfTE9DS19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX01BU0sgICAgICAgICAgIDB4MDAwMiAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX1NISUZUICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfSVJRX0RCX1dJRFRIICAgICAgICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCICAgICAgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX01BU0sgICAgIDB4MDAwMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX1NISUZUICAgICAgICAgMCAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKyNkZWZpbmUgV001MTAwX0NMS0dFTl9FUlJfQVNZTkNfSVJRX0RCX1dJRFRIICAgICAgICAgMSAgLyogQ0xLR0VOX0VSUl9BU1lOQ19JUlFfREIgKi8KKworLyoKKyAqIFIzMzYxICgweEQyMSkgLSBJUlEgRGVib3VuY2UgMgorICovCisjZGVmaW5lIFdNNTEwMF9BSUZfRVJSX0RCICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRl9FUlJfREIgKi8KKyNkZWZpbmUgV001MTAwX0FJRl9FUlJfREJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGX0VSUl9EQiAqLworI2RlZmluZSBXTTUxMDBfQUlGX0VSUl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBBSUZfRVJSX0RCICovCisjZGVmaW5lIFdNNTEwMF9BSUZfRVJSX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRl9FUlJfREIgKi8KKworLyoKKyAqIFIzNTg0ICgweEUwMCkgLSBGWF9DdHJsCisgKi8KKyNkZWZpbmUgV001MTAwX0ZYX1NUU19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMCAgLyogRlhfU1RTIC0gWzE1OjZdICovCisjZGVmaW5lIFdNNTEwMF9GWF9TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEZYX1NUUyAtIFsxNTo2XSAqLworI2RlZmluZSBXTTUxMDBfRlhfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBGWF9TVFMgLSBbMTU6Nl0gKi8KKyNkZWZpbmUgV001MTAwX0ZYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogRlhfUkFURSAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9GWF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZYX1JBVEUgLSBbMTowXSAqLworI2RlZmluZSBXTTUxMDBfRlhfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBGWF9SQVRFIC0gWzE6MF0gKi8KKworLyoKKyAqIFIzNjAwICgweEUxMCkgLSBFUTFfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMV9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTFfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVExX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRMV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVExX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTFfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVExX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVExX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRMV9FTkEgKi8KKworLyoKKyAqIFIzNjAxICgweEUxMSkgLSBFUTFfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMV9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTFfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVExX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMV9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzYwMiAoMHhFMTIpIC0gRVExXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MDMgKDB4RTEzKSAtIEVRMV80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjA0ICgweEUxNCkgLSBFUTFfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYwNSAoMHhFMTUpIC0gRVExXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MDYgKDB4RTE2KSAtIEVRMV83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjA3ICgweEUxNykgLSBFUTFfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYwOCAoMHhFMTgpIC0gRVExXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2MDkgKDB4RTE5KSAtIEVRMV8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxMCAoMHhFMUEpIC0gRVExXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjExICgweEUxQikgLSBFUTFfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2MTIgKDB4RTFDKSAtIEVRMV8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxMyAoMHhFMUQpIC0gRVExXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVExX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjE0ICgweEUxRSkgLSBFUTFfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2MTUgKDB4RTFGKSAtIEVRMV8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxNiAoMHhFMjApIC0gRVExXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjE3ICgweEUyMSkgLSBFUTFfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MTggKDB4RTIyKSAtIEVRMV8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMV9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYxOSAoMHhFMjMpIC0gRVExXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMV9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVExX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTFfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMV9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVExX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTFfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjIyICgweEUyNikgLSBFUTJfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMl9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTJfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEyX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMl9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRMl9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVEyX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTJfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVEyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRMl9FTkEgKi8KKworLyoKKyAqIFIzNjIzICgweEUyNykgLSBFUTJfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRMl9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTJfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEyX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRMl9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzYyNCAoMHhFMjgpIC0gRVEyXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MjUgKDB4RTI5KSAtIEVRMl80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjI2ICgweEUyQSkgLSBFUTJfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYyNyAoMHhFMkIpIC0gRVEyXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2MjggKDB4RTJDKSAtIEVRMl83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjI5ICgweEUyRCkgLSBFUTJfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzMCAoMHhFMkUpIC0gRVEyXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2MzEgKDB4RTJGKSAtIEVRMl8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzMiAoMHhFMzApIC0gRVEyXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjMzICgweEUzMSkgLSBFUTJfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQgKDB4RTMyKSAtIEVRMl8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNSAoMHhFMzMpIC0gRVEyXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEyX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjM2ICgweEUzNCkgLSBFUTJfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2MzcgKDB4RTM1KSAtIEVRMl8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzOCAoMHhFMzYpIC0gRVEyXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjM5ICgweEUzNykgLSBFUTJfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NDAgKDB4RTM4KSAtIEVRMl8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRMl9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY0MSAoMHhFMzkpIC0gRVEyXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRMl9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEyX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTJfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRMl9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEyX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTJfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjQ0ICgweEUzQykgLSBFUTNfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRM19CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTNfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEzX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRM19CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRM19CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVEzX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTNfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVEzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTNfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRM19FTkEgKi8KKworLyoKKyAqIFIzNjQ1ICgweEUzRCkgLSBFUTNfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRM19CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTNfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVEzX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRM19CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzY0NiAoMHhFM0UpIC0gRVEzXzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NDcgKDB4RTNGKSAtIEVRM180CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjQ4ICgweEU0MCkgLSBFUTNfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY0OSAoMHhFNDEpIC0gRVEzXzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NTAgKDB4RTQyKSAtIEVRM183CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjUxICgweEU0MykgLSBFUTNfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1MiAoMHhFNDQpIC0gRVEzXzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2NTMgKDB4RTQ1KSAtIEVRM18xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1NCAoMHhFNDYpIC0gRVEzXzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjU1ICgweEU0NykgLSBFUTNfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2NTYgKDB4RTQ4KSAtIEVRM18xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY1NyAoMHhFNDkpIC0gRVEzXzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVEzX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjU4ICgweEU0QSkgLSBFUTNfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2NTkgKDB4RTRCKSAtIEVRM18xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY2MCAoMHhFNEMpIC0gRVEzXzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjYxICgweEU0RCkgLSBFUTNfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NjIgKDB4RTRFKSAtIEVRM18xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRM19CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY2MyAoMHhFNEYpIC0gRVEzXzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRM19CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVEzX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTNfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRM19CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVEzX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTNfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjY2ICgweEU1MikgLSBFUTRfMQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjFfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRNF9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTRfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE0X0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRNF9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDAwM0UgIC8qIEVRNF9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRVE0X0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICA1ICAvKiBFUTRfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEVRNF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRVE0X0VOQSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9FUTRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEVRNF9FTkEgKi8KKworLyoKKyAqIFIzNjY3ICgweEU1MykgLSBFUTRfMgorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweEY4MDAgIC8qIEVRNF9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgIDExICAvKiBFUTRfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRVE0X0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAweDA3QzAgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEVRNF9CNV9HQUlOIC0gWzEwOjZdICovCisKKy8qCisgKiBSMzY2OCAoMHhFNTQpIC0gRVE0XzMKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NjkgKDB4RTU1KSAtIEVRNF80CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjcwICgweEU1NikgLSBFUTRfNQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjFfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IxX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMV9QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3MSAoMHhFNTcpIC0gRVE0XzYKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2NzIgKDB4RTU4KSAtIEVRNF83CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjczICgweEU1OSkgLSBFUTRfOAorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3NCAoMHhFNUEpIC0gRVE0XzkKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IyX1BHX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CMl9QRyAtIFsxNTowXSAqLworCisvKgorICogUjM2NzUgKDB4RTVCKSAtIEVRNF8xMAorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3NiAoMHhFNUMpIC0gRVE0XzExCisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19CX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IzX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjc3ICgweEU1RCkgLSBFUTRfMTIKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX0NfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjNfQyAtIFsxNTowXSAqLworCisvKgorICogUjM2NzggKDB4RTVFKSAtIEVRNF8xMworICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjNfUEdfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0IzX1BHX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CM19QR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY3OSAoMHhFNUYpIC0gRVE0XzE0CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRVE0X0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjgwICgweEU2MCkgLSBFUTRfMTUKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X0JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjM2ODEgKDB4RTYxKSAtIEVRNF8xNgorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4MiAoMHhFNjIpIC0gRVE0XzE3CisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNF9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I0X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNjgzICgweEU2MykgLSBFUTRfMTgKKyAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X0FfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjM2ODQgKDB4RTY0KSAtIEVRNF8xOQorICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEVRNF9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4NSAoMHhFNjUpIC0gRVE0XzIwCisgKi8KKyNkZWZpbmUgV001MTAwX0VRNF9CNV9QR19NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRVE0X0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9FUTRfQjVfUEdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEVRNF9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRVE0X0I1X1BHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBFUTRfQjVfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNzEyICgweEU4MCkgLSBEUkMxIGN0cmwxCisgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1JNU19NQVNLICAgICAgICAgICAgIDB4RjgwMCAgLyogRFJDX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfUk1TX1NISUZUICAgICAgICAgICAgICAgIDExICAvKiBEUkNfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9STVNfV0lEVEggICAgICAgICAgICAgICAgIDUgIC8qIERSQ19TSUdfREVUX1JNUyAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX01BU0sgICAgICAgICAgICAgIDB4MDYwMCAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX1NISUZUICAgICAgICAgICAgICAgICAgOSAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX1BLX1dJRFRIICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogRFJDX05HX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBEUkNfTkdfRU5BICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTkdfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIERSQ19OR19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFJDX05HX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfTU9ERSAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBEUkNfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9NT0RFX01BU0sgICAgICAgICAgICAweDAwODAgIC8qIERSQ19TSUdfREVUX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19TSUdfREVUX01PREVfU0hJRlQgICAgICAgICAgICAgICAgNyAgLyogRFJDX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1NJR19ERVRfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBEUkNfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVCAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9NQVNLICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfU0lHX0RFVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERSQ19TSUdfREVUICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRTJfT1BfRU5BICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIERSQ19LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19LTkVFMl9PUF9FTkFfTUFTSyAgICAgICAgICAgIDB4MDAyMCAgLyogRFJDX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX0VOQV9TSElGVCAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfT1BfRU5BICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRTJfT1BfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIERSQ19LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogRFJDX1FSICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERSQ19RUiAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBEUkNfUVIgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFJDX1FSICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQU5USUNMSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERSQ19BTlRJQ0xJUCAqLworI2RlZmluZSBXTTUxMDBfRFJDX0FOVElDTElQX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBEUkNfQU5USUNMSVAgKi8KKyNkZWZpbmUgV001MTAwX0RSQ19BTlRJQ0xJUF9TSElGVCAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0FOVElDTElQICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQU5USUNMSVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIERSQ19BTlRJQ0xJUCAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNMX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEUkNSX0VOQSAqLworI2RlZmluZSBXTTUxMDBfRFJDUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEUkNSX0VOQSAqLworCisvKgorICogUjM3MTMgKDB4RTgxKSAtIERSQzEgY3RybDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0FUS19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxRTAwICAvKiBEUkNfQVRLIC0gWzEyOjldICovCisjZGVmaW5lIFdNNTEwMF9EUkNfQVRLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIERSQ19BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19BVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogRFJDX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0RDWV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMUUwICAvKiBEUkNfRENZIC0gWzg6NV0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRFJDX0RDWSAtIFs4OjVdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfRENZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERSQ19EQ1kgLSBbODo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFDICAvKiBEUkNfTUlOR0FJTiAtIFs0OjJdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTUlOR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX01BWEdBSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBEUkNfTUFYR0FJTiAtIFsxOjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTUFYR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19NQVhHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRFJDX01BWEdBSU4gLSBbMTowXSAqLworCisvKgorICogUjM3MTQgKDB4RTgyKSAtIERSQzEgY3RybDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAgMHhGMDAwICAvKiBEUkNfTkdfTUlOR0FJTiAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19OR19NSU5HQUlOX1NISUZUICAgICAgICAgICAgICAgICAxMiAgLyogRFJDX05HX01JTkdBSU4gLSBbMTU6MTJdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTkdfTUlOR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgIDQgIC8qIERSQ19OR19NSU5HQUlOIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9NQVNLICAgICAgICAgICAgICAgICAgMHgwQzAwICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX05HX0VYUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEUkNfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX1RIUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMzAwICAvKiBEUkNfUVJfVEhSIC0gWzk6OF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9USFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFJDX1FSX1RIUiAtIFs5OjhdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfVEhSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19RUl9USFIgLSBbOTo4XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX1FSX0RDWV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEMwICAvKiBEUkNfUVJfRENZIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19RUl9EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNiAgLyogRFJDX1FSX0RDWSAtIFs3OjZdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfUVJfRENZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIERSQ19RUl9EQ1kgLSBbNzo2XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0hJX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBEUkNfSElfQ09NUCAtIFs1OjNdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfSElfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIERSQ19ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19ISV9DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0xPX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBEUkNfTE9fQ09NUCAtIFsyOjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfTE9fQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19MT19DT01QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19MT19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogRFJDX0xPX0NPTVAgLSBbMjowXSAqLworCisvKgorICogUjM3MTUgKDB4RTgzKSAtIERSQzEgY3RybDQKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0UwICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfSVBfV0lEVEggICAgICAgICAgICAgICAgICAgICA2ICAvKiBEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUVfT1BfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBEUkNfS05FRV9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNNTEwMF9EUkNfS05FRV9PUF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERSQ19LTkVFX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RSQ19LTkVFX09QX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNSAgLyogRFJDX0tORUVfT1AgLSBbNDowXSAqLworCisvKgorICogUjM3MTYgKDB4RTg0KSAtIERSQzEgY3RybDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX01BU0sgICAgICAgICAgICAgICAgMHgwM0UwICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX1NISUZUICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX0lQX1dJRFRIICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX01BU0sgICAgICAgICAgICAgICAgMHgwMDFGICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX1NISUZUICAgICAgICAgICAgICAgICAgICAwICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTUxMDBfRFJDX0tORUUyX09QX1dJRFRIICAgICAgICAgICAgICAgICAgICA1ICAvKiBEUkNfS05FRTJfT1AgLSBbNDowXSAqLworCisvKgorICogUjM3NzYgKDB4RUMwKSAtIEhQTFBGMV8xCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjFfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGMV9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYxX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjFfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGMV9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYxX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjFfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEYxX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGMV9FTkEgKi8KKworLyoKKyAqIFIzNzc3ICgweEVDMSkgLSBIUExQRjFfMgorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMV9DT0VGRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIExIUEYxX0NPRUZGIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzc4MCAoMHhFQzQpIC0gSFBMUEYyXzEKKyAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGMl9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExIUEYyX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjJfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGMl9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExIUEYyX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGMl9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEhQRjJfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYyX0VOQSAqLworCisvKgorICogUjM3ODEgKDB4RUM1KSAtIEhQTFBGMl8yCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0xIUEYyX0NPRUZGX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogTEhQRjJfQ09FRkYgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzNzg0ICgweEVDOCkgLSBIUExQRjNfMQorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIExIUEYzX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX01PREVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjNfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGM19NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEYzX01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjNfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGM19FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIExIUEYzX0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSFBGM19FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEYzX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjNfRU5BICovCisKKy8qCisgKiBSMzc4NSAoMHhFQzkpIC0gSFBMUEYzXzIKKyAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjNfQ09FRkZfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBMSFBGM19DT0VGRiAtIFsxNTowXSAqLworCisvKgorICogUjM3ODggKDB4RUNDKSAtIEhQTFBGNF8xCisgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTEhQRjRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBMSFBGNF9NT0RFICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExIUEY0X01PREUgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogTEhQRjRfTU9ERSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBMSFBGNF9FTkEgKi8KKyNkZWZpbmUgV001MTAwX0xIUEY0X0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTEhQRjRfRU5BICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEY0X0VOQSAqLworI2RlZmluZSBXTTUxMDBfTEhQRjRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMSFBGNF9FTkEgKi8KKworLyoKKyAqIFIzNzg5ICgweEVDRCkgLSBIUExQRjRfMgorICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9MSFBGNF9DT0VGRl9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIExIUEY0X0NPRUZGIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTYzODQgKDB4NDAwMCkgLSBEU1AxIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDFfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjE2Mzg1ICgweDQwMDEpIC0gRFNQMSBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMV9ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNjM4NiAoMHg0MDAyKSAtIERTUDEgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMTYzODcgKDB4NDAwMykgLSBEU1AxIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjE2ODkyICgweDQxRkMpIC0gRFNQMSBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjE2ODkzICgweDQxRkQpIC0gRFNQMSBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjE2ODk0ICgweDQxRkUpIC0gRFNQMSBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjE2ODk1ICgweDQxRkYpIC0gRFNQMSBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjE4NDMyICgweDQ4MDApIC0gRFNQMSBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxODQzMyAoMHg0ODAxKSAtIERTUDEgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTg0MzQgKDB4NDgwMikgLSBEU1AxIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMV9QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjE4NDM1ICgweDQ4MDMpIC0gRFNQMSBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMV9QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxODQzNiAoMHg0ODA0KSAtIERTUDEgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMV9QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTg0MzcgKDB4NDgwNSkgLSBEU1AxIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjE5OTYyICgweDRERkEpIC0gRFNQMSBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxOTk2MyAoMHg0REZCKSAtIERTUDEgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTk5NjQgKDB4NERGQykgLSBEU1AxIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjE5OTY1ICgweDRERkQpIC0gRFNQMSBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxOTk2NiAoMHg0REZFKSAtIERTUDEgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTk5NjcgKDB4NERGRikgLSBEU1AxIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjIwNDgwICgweDUwMDApIC0gRFNQMSBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyMDQ4MSAoMHg1MDAxKSAtIERTUDEgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjA0ODIgKDB4NTAwMikgLSBEU1AxIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AxX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjIwNDgzICgweDUwMDMpIC0gRFNQMSBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMV9aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AxX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIyMjUyNCAoMHg1N0ZDKSAtIERTUDEgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMjI1MjUgKDB4NTdGRCkgLSBEU1AxIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AxX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMV9aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjIyNTI2ICgweDU3RkUpIC0gRFNQMSBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDFfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMV9aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMV9aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AxX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDFfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyMjUyNyAoMHg1N0ZGKSAtIERTUDEgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AxX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDFfWk1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjQ1NzYgKDB4NjAwMCkgLSBEU1AyIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDJfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjI0NTc3ICgweDYwMDEpIC0gRFNQMiBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMl9ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIyNDU3OCAoMHg2MDAyKSAtIERTUDIgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMjQ1NzkgKDB4NjAwMykgLSBEU1AyIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjI1MDg0ICgweDYxRkMpIC0gRFNQMiBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjI1MDg1ICgweDYxRkQpIC0gRFNQMiBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjI1MDg2ICgweDYxRkUpIC0gRFNQMiBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjI1MDg3ICgweDYxRkYpIC0gRFNQMiBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjI2NjI0ICgweDY4MDApIC0gRFNQMiBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNjYyNSAoMHg2ODAxKSAtIERTUDIgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjY2MjYgKDB4NjgwMikgLSBEU1AyIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMl9QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjI2NjI3ICgweDY4MDMpIC0gRFNQMiBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNjYyOCAoMHg2ODA0KSAtIERTUDIgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMl9QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjY2MjkgKDB4NjgwNSkgLSBEU1AyIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjI4MTU0ICgweDZERkEpIC0gRFNQMiBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODE1NSAoMHg2REZCKSAtIERTUDIgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjgxNTYgKDB4NkRGQykgLSBEU1AyIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjI4MTU3ICgweDZERkQpIC0gRFNQMiBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODE1OCAoMHg2REZFKSAtIERTUDIgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjgxNTkgKDB4NkRGRikgLSBEU1AyIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjI4NjcyICgweDcwMDApIC0gRFNQMiBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyODY3MyAoMHg3MDAxKSAtIERTUDIgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjg2NzQgKDB4NzAwMikgLSBEU1AyIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AyX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjI4Njc1ICgweDcwMDMpIC0gRFNQMiBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMl9aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AyX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzMDcxNiAoMHg3N0ZDKSAtIERTUDIgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMzA3MTcgKDB4NzdGRCkgLSBEU1AyIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AyX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjMwNzE4ICgweDc3RkUpIC0gRFNQMiBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDJfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQMl9aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzMDcxOSAoMHg3N0ZGKSAtIERTUDIgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AyX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfWk1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzI3NjggKDB4ODAwMCkgLSBEU1AzIERNIDAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9TVEFSVF8xX01BU0sgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNX1NUQVJUIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19ETV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX1NUQVJUXzFfV0lEVEggICAgICAgICAgICAgICAgIDggIC8qIERTUDNfRE1fU1RBUlQgLSBbNzowXSAqLworCisvKgorICogUjMyNzY5ICgweDgwMDEpIC0gRFNQMyBETSAxCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fU1RBUlRfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQM19ETV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9TVEFSVF9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX1NUQVJUX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfRE1fU1RBUlQgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzMjc3MCAoMHg4MDAyKSAtIERTUDMgRE0gMgorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfMV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfRE1fMSAtIFs3OjBdICovCisKKy8qCisgKiBSMzI3NzEgKDB4ODAwMykgLSBEU1AzIERNIDMKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19ETV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfRE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjMzMjc2ICgweDgxRkMpIC0gRFNQMyBETSA1MDgKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNXzI1NCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNXzI1NF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fMjU0IC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fMjU0XzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19ETV8yNTQgLSBbNzowXSAqLworCisvKgorICogUjMzMjc3ICgweDgxRkQpIC0gRFNQMyBETSA1MDkKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV8yNTRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX0RNXzI1NCAtIFsxNTowXSAqLworCisvKgorICogUjMzMjc4ICgweDgxRkUpIC0gRFNQMyBETSA1MTAKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfMV9NQVNLICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX0RNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX0RNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfRE1fRU5EIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfRE1fRU5EXzFfV0lEVEggICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19ETV9FTkQgLSBbNzowXSAqLworCisvKgorICogUjMzMjc5ICgweDgxRkYpIC0gRFNQMyBETSA1MTEKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19ETV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX0RNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjM0ODE2ICgweDg4MDApIC0gRFNQMyBQTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfMl9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUXzJfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF8yX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1BNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNDgxNyAoMHg4ODAxKSAtIERTUDMgUE0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUXzFfTUFTSyAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfMV9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzQ4MTggKDB4ODgwMikgLSBEU1AzIFBNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9TVEFSVF9NQVNLICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNX1NUQVJUIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fU1RBUlRfV0lEVEggICAgICAgICAgICAgICAgICAxNiAgLyogRFNQM19QTV9TVEFSVCAtIFsxNTowXSAqLworCisvKgorICogUjM0ODE5ICgweDg4MDMpIC0gRFNQMyBQTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX01BU0sgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8yX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOCAgLyogRFNQM19QTV8xIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNDgyMCAoMHg4ODA0KSAtIERTUDMgUE0gNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzFfMV9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAxNiAgLyogRFNQM19QTV8xIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzQ4MjEgKDB4ODgwNSkgLSBEU1AzIFBNIDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV8xX01BU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNXzEgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19QTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fMSAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQ2ICgweDhERkEpIC0gRFNQMyBQTSAxNTMwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fNTEwXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV81MTAgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzUxMCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfUE1fNTEwIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjM0NyAoMHg4REZCKSAtIERTUDMgUE0gMTUzMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNXzUxMF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fNTEwIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNDggKDB4OERGQykgLSBEU1AzIFBNIDE1MzIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV81MTBfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNXzUxMCAtIFsxNTowXSAqLworCisvKgorICogUjM2MzQ5ICgweDhERkQpIC0gRFNQMyBQTSAxNTMzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfUE1fRU5EXzJfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19QTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfMl9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8yX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfUE1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjM1MCAoMHg4REZFKSAtIERTUDMgUE0gMTUzNAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1BNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfUE1fRU5EIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzYzNTEgKDB4OERGRikgLSBEU1AzIFBNIDE1MzUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19QTV9FTkRfV0lEVEggICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1BNX0VORCAtIFsxNTowXSAqLworCisvKgorICogUjM2ODY0ICgweDkwMDApIC0gRFNQMyBaTSAwCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fU1RBUlRfMV9NQVNLICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19aTV9TVEFSVCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX1NUQVJUXzFfU0hJRlQgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fU1RBUlQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9TVEFSVF8xX1dJRFRIICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1pNX1NUQVJUIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzNjg2NSAoMHg5MDAxKSAtIERTUDMgWk0gMQorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX1NUQVJUX01BU0sgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfWk1fU1RBUlQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fU1RBUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19aTV9TVEFSVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1pNX1NUQVJUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMzY4NjYgKDB4OTAwMikgLSBEU1AzIFpNIDIKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xXzFfV0lEVEggICAgICAgICAgICAgICAgICAgICA4ICAvKiBEU1AzX1pNXzEgLSBbNzowXSAqLworCisvKgorICogUjM2ODY3ICgweDkwMDMpIC0gRFNQMyBaTSAzCisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQM19aTV8xIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fMSAtIFsxNTowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBEU1AzX1pNXzEgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIzODkwOCAoMHg5N0ZDKSAtIERTUDMgWk0gMjA0NAorICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9NQVNLICAgICAgICAgICAgICAweDAwRkYgIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfMV9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfWk1fMTAyMiAtIFs3OjBdICovCisKKy8qCisgKiBSMzg5MDkgKDB4OTdGRCkgLSBEU1AzIFpNIDIwNDUKKyAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV8xMDIyX01BU0sgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBEU1AzX1pNXzEwMjIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fMTAyMl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogRFNQM19aTV8xMDIyIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNXzEwMjJfV0lEVEggICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfWk1fMTAyMiAtIFsxNTowXSAqLworCisvKgorICogUjM4OTEwICgweDk3RkUpIC0gRFNQMyBaTSAyMDQ2CisgKi8KKyNkZWZpbmUgV001MTAwX0RTUDNfWk1fRU5EXzFfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQM19aTV9FTkQgLSBbNzowXSAqLworI2RlZmluZSBXTTUxMDBfRFNQM19aTV9FTkRfMV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AzX1pNX0VORCAtIFs3OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF8xX1dJRFRIICAgICAgICAgICAgICAgICAgIDggIC8qIERTUDNfWk1fRU5EIC0gWzc6MF0gKi8KKworLyoKKyAqIFIzODkxMSAoMHg5N0ZGKSAtIERTUDMgWk0gMjA0NworICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisjZGVmaW5lIFdNNTEwMF9EU1AzX1pNX0VORF9XSURUSCAgICAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDNfWk1fRU5EIC0gWzE1OjBdICovCisKK2ludCB3bTUxMDBfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKTsKK2ludCB3bTUxMDBfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKTsKKworZXh0ZXJuIHUxNiB3bTUxMDBfcmVnX2RlZmF1bHRzW1dNNTEwMF9NQVhfUkVHSVNURVIgKyAxXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwppbmRleCA2ZDZkYzllLi4zNWYzYWQ4MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJCXJldHVybiAxOwogCX0KIAotCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7CisJcmV0ID0gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzkyLDIzICszOTIsOSBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlyZXR1cm4gc25kX3NvY19nZXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIH0KIAotLyogZG91YmxlIGNvbnRyb2wgd2l0aCB2b2x1bWUgdXBkYXRlICovCi0jZGVmaW5lIFNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKHhuYW1lLCByZWdfbGVmdCwgcmVnX3JpZ2h0LCB4c2hpZnQsIHhtYXgsIFwKLQkJCQl4aW52ZXJ0LCB0bHZfYXJyYXkpIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfCBcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfCBcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwgXAotCS50bHYucCA9ICh0bHZfYXJyYXkpLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsIFwKLQkuZ2V0ID0gd204MzUwX2dldF92b2xzd18yciwgLnB1dCA9IHdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJIC5yc2hpZnQgPSB4c2hpZnQsIC5tYXggPSB4bWF4LCAuaW52ZXJ0ID0geGludmVydH0sIH0KLQogc3RhdGljIGNvbnN0IGNoYXIgKndtODM1MF9kZWVtcFtdID0geyAiTm9uZSIsICIzMmtIeiIsICI0NC4xa0h6IiwgIjQ4a0h6IiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKndtODM1MF9wb2xbXSA9IHsgIk5vcm1hbCIsICJJbnYgUiIsICJJbnYgTCIsICJJbnYgTCAmIFIiIH07CiBzdGF0aWMgY29uc3QgY2hhciAqd204MzUwX2RhY211dGVtW10gPSB7ICJOb3JtYWwiLCAiU29mdCIgfTsKQEAgLTQ0MywyNiArNDI5LDI5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204MzUwX3NuZF9jb250cm9sc1tdID0gewogCVNPQ19FTlVNKCJQbGF5YmFjayBEZWVtcGhhc2lzIiwgd204MzUwX2VudW1bMF0pLAogCVNPQ19FTlVNKCJQbGF5YmFjayBEQUMgSW52ZXJzaW9uIiwgd204MzUwX2VudW1bMV0pLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJQbGF5YmFjayBQQ00gVm9sdW1lIiwKKwlTT0NfRE9VQkxFX1JfRVhUX1RMVigiUGxheWJhY2sgUENNIFZvbHVtZSIsCiAJCQkJV004MzUwX0RBQ19ESUdJVEFMX1ZPTFVNRV9MLAogCQkJCVdNODM1MF9EQUNfRElHSVRBTF9WT0xVTUVfUiwKLQkJCQkwLCAyNTUsIDAsIGRhY19wY21fdGx2KSwKKwkJCQkwLCAyNTUsIDAsIHdtODM1MF9nZXRfdm9sc3dfMnIsCisJCQkJd204MzUwX3B1dF92b2xzd18ycl92dSwgZGFjX3BjbV90bHYpLAogCVNPQ19FTlVNKCJQbGF5YmFjayBQQ00gTXV0ZSBGdW5jdGlvbiIsIHdtODM1MF9lbnVtWzJdKSwKIAlTT0NfRU5VTSgiUGxheWJhY2sgUENNIE11dGUgU3BlZWQiLCB3bTgzNTBfZW51bVszXSksCiAJU09DX0VOVU0oIkNhcHR1cmUgUENNIEZpbHRlciIsIHdtODM1MF9lbnVtWzRdKSwKIAlTT0NfRU5VTSgiQ2FwdHVyZSBQQ00gSFAgRmlsdGVyIiwgd204MzUwX2VudW1bNV0pLAogCVNPQ19FTlVNKCJDYXB0dXJlIEFEQyBJbnZlcnNpb24iLCB3bTgzNTBfZW51bVs2XSksCi0JU09DX1dNODM1MF9ET1VCTEVfUl9UTFYoIkNhcHR1cmUgUENNIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkNhcHR1cmUgUENNIFZvbHVtZSIsCiAJCQkJV004MzUwX0FEQ19ESUdJVEFMX1ZPTFVNRV9MLAogCQkJCVdNODM1MF9BRENfRElHSVRBTF9WT0xVTUVfUiwKLQkJCQkwLCAyNTUsIDAsIGFkY19wY21fdGx2KSwKKwkJCQkwLCAyNTUsIDAsIHdtODM1MF9nZXRfdm9sc3dfMnIsCisJCQkJd204MzUwX3B1dF92b2xzd18ycl92dSwgYWRjX3BjbV90bHYpLAogCVNPQ19ET1VCTEVfVExWKCJDYXB0dXJlIFNpZGV0b25lIFZvbHVtZSIsCiAJCSAgICAgICBXTTgzNTBfQURDX0RJVklERVIsCiAJCSAgICAgICA4LCA0LCAxNSwgMSwgY2FwdHVyZV9zZF90bHYpLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJDYXB0dXJlIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIkNhcHR1cmUgVm9sdW1lIiwKIAkJCQlXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUsCiAJCQkJV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwKLQkJCQkyLCA2MywgMCwgcHJlX2FtcF90bHYpLAorCQkJCTIsIDYzLCAwLCB3bTgzNTBfZ2V0X3ZvbHN3XzJyLAorCQkJCXdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIHByZV9hbXBfdGx2KSwKIAlTT0NfRE9VQkxFX1IoIkNhcHR1cmUgWkMgU3dpdGNoIiwKIAkJICAgICBXTTgzNTBfTEVGVF9JTlBVVF9WT0xVTUUsCiAJCSAgICAgV004MzUwX1JJR0hUX0lOUFVUX1ZPTFVNRSwgMTMsIDEsIDApLApAQCAtNDkwLDE3ICs0NzksMTkgQEAKIAlTT0NfU0lOR0xFX1RMVigiT3V0NCBDYXB0dXJlIFZvbHVtZSIsCiAJCSAgICAgICBXTTgzNTBfSU5QVVRfTUlYRVJfVk9MVU1FLAogCQkgICAgICAgMSwgNywgMCwgb3V0X21peF90bHYpLAotCVNPQ19XTTgzNTBfRE9VQkxFX1JfVExWKCJPdXQxIFBsYXliYWNrIFZvbHVtZSIsCisJU09DX0RPVUJMRV9SX0VYVF9UTFYoIk91dDEgUGxheWJhY2sgVm9sdW1lIiwKIAkJCQlXTTgzNTBfTE9VVDFfVk9MVU1FLAogCQkJCVdNODM1MF9ST1VUMV9WT0xVTUUsCi0JCQkJMiwgNjMsIDAsIG91dF9wZ2FfdGx2KSwKKwkJCQkyLCA2MywgMCwgd204MzUwX2dldF92b2xzd18yciwKKwkJCQl3bTgzNTBfcHV0X3ZvbHN3XzJyX3Z1LCBvdXRfcGdhX3RsdiksCiAJU09DX0RPVUJMRV9SKCJPdXQxIFBsYXliYWNrIFpDIFN3aXRjaCIsCiAJCSAgICAgV004MzUwX0xPVVQxX1ZPTFVNRSwKIAkJICAgICBXTTgzNTBfUk9VVDFfVk9MVU1FLCAxMywgMSwgMCksCi0JU09DX1dNODM1MF9ET1VCTEVfUl9UTFYoIk91dDIgUGxheWJhY2sgVm9sdW1lIiwKKwlTT0NfRE9VQkxFX1JfRVhUX1RMVigiT3V0MiBQbGF5YmFjayBWb2x1bWUiLAogCQkJCVdNODM1MF9MT1VUMl9WT0xVTUUsCiAJCQkJV004MzUwX1JPVVQyX1ZPTFVNRSwKLQkJCQkyLCA2MywgMCwgb3V0X3BnYV90bHYpLAorCQkJCTIsIDYzLCAwLCB3bTgzNTBfZ2V0X3ZvbHN3XzJyLAorCQkJCXdtODM1MF9wdXRfdm9sc3dfMnJfdnUsIG91dF9wZ2FfdGx2KSwKIAlTT0NfRE9VQkxFX1IoIk91dDIgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004MzUwX0xPVVQyX1ZPTFVNRSwKIAkJICAgICBXTTgzNTBfUk9VVDJfVk9MVU1FLCAxMywgMSwgMCksCiAJU09DX1NJTkdMRSgiT3V0MiBSaWdodCBJbnZlcnQgU3dpdGNoIiwgV004MzUwX1JPVVQyX1ZPTFVNRSwgMTAsIDEsIDApLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKaW5kZXggZmJlZTU1NmMuLmRjMTNiZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJCSgxIDw8IFdNODQwMF9BSU5STVVYX1BXUikpKSB7CiAJCXJlZyB8PSBXTTg0MDBfQUlOUl9FTkE7CiAJfSBlbHNlIHsKLQkJcmVnICY9IH5XTTg0MDBfQUlOTF9FTkE7CisJCXJlZyAmPSB+V004NDAwX0FJTlJfRU5BOwogCX0KIAl3bTg0MDBfd3JpdGUody0+Y29kZWMsIFdNODQwMF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCmluZGV4IGRiMGRjZWQuLjA3YzljYzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTQ3OSw2ICs0ODAsOCBAQAogCQlwb3dlcjEgfD0gV004NTEwX1BPV0VSMV9CSUFTRU4gfCBXTTg1MTBfUE9XRVIxX0JVRklPRU47CiAKIAkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKKwogCQkJLyogSW5pdGlhbCBjYXAgY2hhcmdlIGF0IFZNSUQgNWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODUxMF9QT1dFUjEsIHBvd2VyMSB8IDB4Myk7CiAJCQltZGVsYXkoMTAwKTsKQEAgLTU0MCwxOCArNTQzLDcgQEAKIAogc3RhdGljIGludCB3bTg1MTBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaTsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg1MTBfcmVnKTsgaSsrKSB7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9CiAJd204NTEwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk4LDYgKzU5MCwxMSBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9d204NTEwX3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODUxMF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODUxMCIgfSwKKwl7IH0sCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODUxMF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTYyOCw2ICs2MjUsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIndtODUxMCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MTBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NTEwX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODUxMF9zcGlfcmVtb3ZlKSwKQEAgLTY3MSw2ICs2NjksNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODUxMC1jb2RlYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MTBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg1MTBfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODUxMF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCmluZGV4IDRmZDRkOGQuLmRiN2E2ODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtODQsNyArODUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg1MjNfemNfY291bnQgPQogCVNPQ19FTlVNX1NJTkdMRShXTTg1MjNfWkVST19ERVRFQ1QsIDAsIDIsIHdtODUyM196ZF9jb3VudF90ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODUyM19zbmRfY29udHJvbHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1MjNfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIFdNODUyM19EQUNfR0FJTkwsIFdNODUyM19EQUNfR0FJTlIsCiAJCSAwLCA0NDgsIDAsIGRhY190bHYpLAogU09DX1NJTkdMRSgiWkMgU3dpdGNoIiwgV004NTIzX0RBQ19DVFJMMywgNCwgMSwgMCksCkBAIC0xMDEsMjIgKzEwMiwxMSBAQAogU05EX1NPQ19EQVBNX09VVFBVVCgiTElORVZPVVRSIiksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd204NTIzX2RhcG1fcm91dGVzW10gPSB7CiAJeyAiTElORVZPVVRMIiwgTlVMTCwgIkRBQyIgfSwKIAl7ICJMSU5FVk9VVFIiLCBOVUxMLCAiREFDIiB9LAogfTsKIAotc3RhdGljIGludCB3bTg1MjNfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NTIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUod204NTIzX2RhcG1fd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCB7CiAJaW50IHZhbHVlOwogCWludCByYXRpbzsKQEAgLTQxNiw3ICs0MDYsNiBAQAogCXN0cnVjdCB3bTg1MjNfcHJpdiAqd204NTIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCwgaTsKIAotCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KWkyY19tYXN0ZXJfc2VuZDsKIAl3bTg1MjMtPnJhdGVfY29uc3RyYWludC5saXN0ID0gJndtODUyMy0+cmF0ZV9jb25zdHJhaW50X2xpc3RbMF07CiAJd204NTIzLT5yYXRlX2NvbnN0cmFpbnQuY291bnQgPQogCQlBUlJBWV9TSVpFKHdtODUyMy0+cmF0ZV9jb25zdHJhaW50X2xpc3QpOwpAQCAtNDc5LDEwICs0NjgsNiBAQAogCS8qIEJpYXMgbGV2ZWwgY29uZmlndXJhdGlvbiB3aWxsIGhhdmUgZG9uZSBhbiBleHRyYSBlbmFibGUgKi8KIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204NTIzLT5zdXBwbGllcyksIHdtODUyMy0+c3VwcGxpZXMpOwogCi0Jc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODUyM19zbmRfY29udHJvbHMsCi0JCQkgICAgIEFSUkFZX1NJWkUod204NTIzX3NuZF9jb250cm9scykpOwotCXdtODUyM19hZGRfd2lkZ2V0cyhjb2RlYyk7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX2VuYWJsZToKQEAgLTUxMiw2ICs0OTcsMTggQEAKIAkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODUyM19yZWcsCiAJLnZvbGF0aWxlX3JlZ2lzdGVyID0gd204NTIzX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCisJLmNvbnRyb2xzID0gd204NTIzX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODUyM19jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHdtODUyM19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHdtODUyM19kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV9yb3V0ZXMpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NTIzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204NTIzIiB9LAorCXsgfSwKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCkBAIC01NTEsOCArNTQ4LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODUyM19pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODUyMy1jb2RlYyIsCisJCS5uYW1lID0gIndtODUyMyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg1MjNfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg1MjNfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODUyM19pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCmluZGV4IDRiYmMwYTcuLjgyMTJiM2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KQEAgLTIxMiw3ICsyMTMsNyBAQAogCXJlZ19jYWNoZVtyZWddID0gMDsKIAlyZWdfY2FjaGVbcmVnMl0gPSAwOwogCi0JcmV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlyZXQgPSBzbmRfc29jX3B1dF92b2xzdyhrY29udHJvbCwgdWNvbnRyb2wpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMjMsMzEgKzIyNCwxOSBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFNPQ19XTTg1ODBfT1VUX0RPVUJMRV9SX1RMVih4bmFtZSwgcmVnX2xlZnQsIHJlZ19yaWdodCwgeHNoaWZ0LCB4bWF4LCBcCi0JCQkJICAgIHhpbnZlcnQsIHRsdl9hcnJheSkJCQlcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHxcCi0JCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsICBcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAotCS5nZXQgPSBzbmRfc29jX2dldF92b2xzd18yciwgLnB1dCA9IHdtODU4MF9vdXRfdnUsIFwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSBcCi0JCXsucmVnID0gcmVnX2xlZnQsIC5ycmVnID0gcmVnX3JpZ2h0LCAuc2hpZnQgPSB4c2hpZnQsIFwKLQkJLm1heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg1ODBfc25kX2NvbnRyb2xzW10gPSB7Ci1TT0NfV004NTgwX09VVF9ET1VCTEVfUl9UTFYoIkRBQzEgUGxheWJhY2sgVm9sdW1lIiwKLQkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMSwKLQkJCSAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMSwKLQkJCSAgICAwLCAweGZmLCAwLCBkYWNfdGx2KSwKLVNPQ19XTTg1ODBfT1VUX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLAotCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ0wyLAotCQkJICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ1IyLAotCQkJICAgIDAsIDB4ZmYsIDAsIGRhY190bHYpLAotU09DX1dNODU4MF9PVVRfRE9VQkxFX1JfVExWKCJEQUMzIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDTDMsCi0JCQkgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDUjMsCi0JCQkgICAgMCwgMHhmZiwgMCwgZGFjX3RsdiksCitTT0NfRE9VQkxFX1JfRVhUX1RMVigiREFDMSBQbGF5YmFjayBWb2x1bWUiLAorCQkgICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ0wxLAorCQkgICAgIFdNODU4MF9ESUdJVEFMX0FUVEVOVUFUSU9OX0RBQ1IxLAorCQkgICAgIDAsIDB4ZmYsIDAsIHNuZF9zb2NfZ2V0X3ZvbHN3LCB3bTg1ODBfb3V0X3Z1LCBkYWNfdGx2KSwKK1NPQ19ET1VCTEVfUl9FWFRfVExWKCJEQUMyIFBsYXliYWNrIFZvbHVtZSIsCisJCSAgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDTDIsCisJCSAgICAgV004NTgwX0RJR0lUQUxfQVRURU5VQVRJT05fREFDUjIsCisJCSAgICAgMCwgMHhmZiwgMCwgc25kX3NvY19nZXRfdm9sc3csIHdtODU4MF9vdXRfdnUsIGRhY190bHYpLAorU09DX0RPVUJMRV9SX0VYVF9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwKKwkJICAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNMMywKKwkJICAgICBXTTg1ODBfRElHSVRBTF9BVFRFTlVBVElPTl9EQUNSMywKKwkJICAgICAwLCAweGZmLCAwLCBzbmRfc29jX2dldF92b2xzdywgd204NTgwX291dF92dSwgZGFjX3RsdiksCiAKIFNPQ19TSU5HTEUoIkRBQzEgRGVlbXBoYXNpcyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0wzLCAwLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRBQzIgRGVlbXBoYXNpcyBTd2l0Y2giLCBXTTg1ODBfREFDX0NPTlRST0wzLCAxLCAxLCAwKSwKQEAgLTQ0MSw4ICs0MzAsNyBAQAogCS8qIEFsd2F5cyBkaXNhYmxlIHRoZSBQTEwgLSBpdCBpcyBub3Qgc2FmZSB0byBsZWF2ZSBpdCBydW5uaW5nCiAJICogd2hpbGUgcmVwcm9ncmFtbWluZyBpdC4KIAkgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODU4MF9QV1JETjIsIHJlZyB8IHB3cl9tYXNrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg1ODBfUFdSRE4yLCBwd3JfbWFzaywgcHdyX21hc2spOwogCiAJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkKIAkJcmV0dXJuIDA7CkBAIC00NjAsOCArNDQ4LDcgQEAKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfUExMQTQgKyBvZmZzZXQsIHJlZyk7CiAKIAkvKiBBbGwgZG9uZSwgdHVybiBpdCBvbiAqLwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NTgwX1BXUkROMik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NTgwX1BXUkROMiwgcmVnICYgfnB3cl9tYXNrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg1ODBfUFdSRE4yLCBwd3JfbWFzaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc1OSw3ICs3NDYsNiBAQAogc3RhdGljIGludCB3bTg1ODBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewotCXUxNiByZWc7CiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CkBAIC03NjgsMjAgKzc1NCwxOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIFBvd2VyIHVwIGFuZCBnZXQgaW5kaXZpZHVhbCBjb250cm9sIG9mIHRoZSBEQUNzICovCi0JCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODU4MF9QV1JETjEpOwotCQkJcmVnICY9IH4oV004NTgwX1BXUkROMV9QV0ROIHwgV004NTgwX1BXUkROMV9BTExEQUNQRCk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfUFdSRE4xLCByZWcpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX1BXUkROMSwKKwkJCQkJICAgIFdNODU4MF9QV1JETjFfUFdETiB8CisJCQkJCSAgICBXTTg1ODBfUFdSRE4xX0FMTERBQ1BELCAwKTsKIAogCQkJLyogTWFrZSBWTUlEIGhpZ2ggaW1wZWRhbmNlICovCi0JCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsICBXTTg1ODBfQURDX0NPTlRST0wxKTsKLQkJCXJlZyAmPSB+MHgxMDA7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfQURDX0NPTlRST0wxLCByZWcpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX0FEQ19DT05UUk9MMSwKKwkJCQkJICAgIDB4MTAwLCAwKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg1ODBfUFdSRE4xKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004NTgwX1BXUkROMSwgcmVnIHwgV004NTgwX1BXUkROMV9QV0ROKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NTgwX1BXUkROMSwKKwkJCQkgICAgV004NTgwX1BXUkROMV9QV0ROLCBXTTg1ODBfUFdSRE4xX1BXRE4pOwogCQlicmVhazsKIAl9CiAJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwpAQCAtOTA3LDYgKzg5MiwxMSBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODU4MF9yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg1ODBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg1ODAiIH0sCisJeyB9LAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIHN0YXRpYyBpbnQgd204NTgwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKQEAgLTk0Myw4ICs5MzMsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NTgwX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NTgwLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NTgwIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODU4MF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODU4MF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgd204NTgwX2kyY19yZW1vdmUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwppbmRleCBhNTM3ZTRhLi4wNzZiZGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzCiAgKgotICogQXV0aG9yOiBNaWtlIEFydGh1ciA8bGludXhAd29sZnNvbm1pY3JvLmNvbT4KKyAqIEF1dGhvcjogTWlrZSBBcnRodXIgPE1pa2UuQXJ0aHVyQHdvbGZzb25taWNyby5jb20+CiAgKgogICogQmFzZWQgb24gd204NzMxLmMgYnkgUmljaGFyZCBQdXJkaWUKICAqCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMTUwLDcgKzE1MSw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3Qgd204NzExX3ByaXYgKndtODcxMSA9ICBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgaWZhY2UgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9JRkFDRSkgJiAweGZmZmM7CisJdTE2IGlmYWNlID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3MTFfSUZBQ0UpICYgMHhmZmYzOwogCWludCBpID0gZ2V0X2NvZWZmKHdtODcxMS0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKIAl1MTYgc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKIAkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKQEAgLTIzMSw3ICsyMzIsNyBAQAogCQl1bnNpZ25lZCBpbnQgZm10KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0JdTE2IGlmYWNlID0gMDsKKwl1MTYgaWZhY2UgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9JRkFDRSkgJiAweDAwMGM7CiAKIAkvKiBzZXQgbWFzdGVyL3NsYXZlIGF1ZGlvIGludGVyZmFjZSAqLwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKQEAgLTI4Niw3ICsyODcsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgd204NzExX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKQEAgLTI5OSw2ICsyOTksOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODcxMV9QV1IsIHJlZyB8IDB4MDA0MCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKQEAgLTM0NSwyNSArMzQ4LDE0IEBACiAKIHN0YXRpYyBpbnQgd204NzExX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzExX3JlZyk7IGkrKykgewotCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKLQkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOwotCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7Ci0JfQogCXdtODcxMV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd204NzExX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204NzExX3ByaXYgKndtODcxMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQsIHJlZzsKKwlpbnQgcmV0OwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODcxMS0+YnVzX3R5cGUpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zODAsMTAgKzM3Miw4IEBACiAJd204NzExX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAkvKiBMYXRjaCB0aGUgdXBkYXRlIGJpdHMgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODcxMV9MT1VUMVYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODcxMV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3MTFfUk9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MTFfUk9VVDFWLCByZWcgfCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODcxMV9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MTFfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204NzExX3NuZF9jb250cm9scywKIAkJCSAgICAgQVJSQVlfU0laRSh3bTg3MTFfc25kX2NvbnRyb2xzKSk7CkBAIC00MTQsNiArNDA0LDEyIEBACiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzExX2ludGVyY29uKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODcxMV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODcxMSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzExX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3MTFfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CkBAIC00NDMsOCArNDM5LDkgQEAKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODcxMV9zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gIndtODcxMS1jb2RlYyIsCisJCS5uYW1lCT0gIndtODcxMSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3MTFfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzExX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODcxMV9zcGlfcmVtb3ZlKSwKQEAgLTQ4Nyw4ICs0ODQsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzExX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NzExLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NzExIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODcxMV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODcxMV9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgX19kZXZleGl0X3Aod204NzExX2kyY19yZW1vdmUpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggODZkNDcxOC4uMDRiMDI3ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMjY5LDYgKzI3MCwxMiBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODcyOF9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3Mjhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3MjgiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODcyOF9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204NzI4X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtMjk4LDggKzMwNSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3Mjhfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJ3bTg3MjgtY29kZWMiLAorCQkubmFtZQk9ICJ3bTg3MjgiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzI4X29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODcyOF9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3Mjhfc3BpX3JlbW92ZSksCkBAIC0zNDIsOCArMzUwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODcyOF9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODcyOC1jb2RlYyIsCisJCS5uYW1lID0gIndtODcyOCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mjhfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3MjhfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODcyOF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IDc2YjQzNjEuLjdlNWVjMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtNDI2LDkgKzQyNyw3IEBACiAJCQkJIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewogCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGksIHJldDsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWludCByZXQ7CiAJdTE2IHJlZzsKIAogCXN3aXRjaCAobGV2ZWwpIHsKQEAgLTQ0MywxNiArNDQyLDcgQEAKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlyZXR1cm4gcmV0OwogCi0JCQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzMxX3JlZyk7IGkrKykgewotCQkJCWlmIChjYWNoZVtpXSA9PSB3bTg3MzFfcmVnW2ldKQotCQkJCQljb250aW51ZTsKLQotCQkJCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkKLQkJCQkJCSAgICAgICYgMHgwMDAxKTsKLQkJCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCQkJfQorCQkJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKIAkJfQogCiAJCS8qIENsZWFyIFBXUk9GRiwgZ2F0ZSBDTEtPVVQsIGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLwpAQCAtNjA3LDYgKzU5NywxMyBAQAogCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODczMV9pbnRlcmNvbiksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3MzFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3MzEiLCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzMxX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3MzFfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CkBAIC02MzgsNiArNjM1LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJ3bTg3MzEiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzMxX29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODczMV9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3MzFfc3BpX3JlbW92ZSksCkBAIC02ODIsNiArNjgwLDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJ3bTg3MzEiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzMxX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzMxX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3MzFfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwppbmRleCAzMGM2N2QwLi5mNmFlZjU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC02MzQsNiArNjM1LDEzIEBACiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzM3X3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODczN19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODczNyIsIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3Mzdfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogc3RhdGljIF9fZGV2aW5pdCBpbnQgd204NzM3X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKQEAgLTY3Myw2ICs2ODEsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODczNyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mzdfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3MzdfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODczN19pMmNfcmVtb3ZlKSwKQEAgLTcxMSw2ICs3MjAsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIndtODczNyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3Mzdfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzM3X3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODczN19zcGlfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCmluZGV4IDI1YWY5MDEuLjU3YWQyMmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwpAQCAtMTcsOSArMTcsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMzM3LDEwICszMzksMTAgQEAKIAkJaWZhY2UgfD0gMHgwMDA0OwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgotCQlpZmFjZSB8PSAweDAwMDM7CisJCWlmYWNlIHw9IDB4MDAwQzsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKLQkJaWZhY2UgfD0gMHgwMDEzOworCQlpZmFjZSB8PSAweDAwMUM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDAyLDE1ICs0MDQsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB3bTg3NDFfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQlpbnQgaTsKLQotCS8qIFJFU1RPUkUgUkVHIENhY2hlICovCi0JZm9yIChpID0gMDsgaSA8IFdNODc0MV9SRUdJU1RFUl9DT1VOVDsgaSsrKSB7Ci0JCWlmIChjYWNoZVtpXSA9PSB3bTg3NDFfcmVnX2RlZmF1bHRzW2ldIHx8IFdNODc0MV9SRVNFVCA9PSBpKQotCQkJY29udGludWU7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGksIGNhY2hlW2ldKTsKLQl9CisJc25kX3NvY19jYWNoZV9zeW5jKGNvZGVjKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC00MjIsMTcgKzQxNiwzNSBAQAogewogCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKTsgaSsrKQorCQl3bTg3NDEtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODc0MV9zdXBwbHlfbmFtZXNbaV07CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoY29kZWMtPmRldiwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKKwkJCQkgd204NzQxLT5zdXBwbGllcyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksCisJCQkJICAgIHdtODc0MS0+c3VwcGxpZXMpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZ2V0OworCX0KIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg3NDEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZW5hYmxlOwogCX0KIAogCXJldCA9IHdtODc0MV9yZXNldChjb2RlYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0XG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZW5hYmxlOwogCX0KIAogCS8qIENoYW5nZSBzb21lIGRlZmF1bHQgc2V0dGluZ3MgLSBsYXRjaCBWVSAqLwpAQCAtNDQyLDcgKzQ1NCw3IEBACiAJCQkgICAgV004NzQxX1VQREFURUxNLCBXTTg3NDFfVVBEQVRFTE0pOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc0MV9EQUNSTFNCX0FUVEVOVUFUSU9OLAogCQkJICAgIFdNODc0MV9VUERBVEVSTCwgV004NzQxX1VQREFURVJMKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NDFfREFDUkxTQl9BVFRFTlVBVElPTiwKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NDFfREFDUk1TQl9BVFRFTlVBVElPTiwKIAkJCSAgICBXTTg3NDFfVVBEQVRFUk0sIFdNODc0MV9VUERBVEVSTSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204NzQxX3NuZF9jb250cm9scywKQEAgLTQ1MSw1OCArNDYzLDYxIEBACiAKIAlkZXZfZGJnKGNvZGVjLT5kZXYsICJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvblxuIik7CiAJcmV0dXJuIHJldDsKKworZXJyX2VuYWJsZToKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOworZXJyX2dldDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NzQxX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODc0MV9wcml2ICp3bTg3NDEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwgd204NzQxLT5zdXBwbGllcyk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODc0MS0+c3VwcGxpZXMpLCB3bTg3NDEtPnN1cHBsaWVzKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzQxID0gewogCS5wcm9iZSA9CXdtODc0MV9wcm9iZSwKKwkucmVtb3ZlID0Jd204NzQxX3JlbW92ZSwKIAkucmVzdW1lID0Jd204NzQxX3Jlc3VtZSwKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODc0MV9yZWdfZGVmYXVsdHMpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzQxX3JlZ19kZWZhdWx0cywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc0MV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODc0MSIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204NzQxX29mX21hdGNoKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKIHN0YXRpYyBpbnQgd204NzQxX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgd204NzQxX3ByaXYgKndtODc0MTsKLQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAl3bTg3NDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzQxX3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAod204NzQxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyk7IGkrKykKLQkJd204NzQxLT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg3NDFfc3VwcGx5X25hbWVzW2ldOwotCi0JcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KCZpMmMtPmRldiwgQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKLQkJCQkgd204NzQxLT5zdXBwbGllcyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg3NDEtPnN1cHBsaWVzKSwKLQkJCQkgICAgd204NzQxLT5zdXBwbGllcyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2dldDsKLQl9Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg3NDEpOwogCXdtODc0MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CiAKLQlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCi0JCQkmc29jX2NvZGVjX2Rldl93bTg3NDEsICZ3bTg3NDFfZGFpLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZW5hYmxlOworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204NzQxLCAmd204NzQxX2RhaSwgMSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKwogCXJldHVybiByZXQ7CiAKLWVycl9lbmFibGU6Ci0JcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODc0MS0+c3VwcGxpZXMpLCB3bTg3NDEtPnN1cHBsaWVzKTsKLQotZXJyX2dldDoKLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOwogZXJyOgogCWtmcmVlKHdtODc0MSk7CiAJcmV0dXJuIHJldDsKQEAgLTUxMCwxMCArNTI1LDcgQEAKIAogc3RhdGljIGludCB3bTg3NDFfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKLQlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzQxLT5zdXBwbGllcyksIHdtODc0MS0+c3VwcGxpZXMpOwogCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUyNiw4ICs1MzgsOSBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzQxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204NzQxLWNvZGVjIiwKKwkJLm5hbWUgPSAid204NzQxIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODc0MV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9ICAgIHdtODc0MV9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9ICAgd204NzQxX2kyY19yZW1vdmUsCkBAIC01MzUsNiArNTQ4LDQ0IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorc3RhdGljIGludCBfX2RldmluaXQgd204NzQxX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB3bTg3NDFfcHJpdiAqd204NzQxOworCWludCByZXQ7CisKKwl3bTg3NDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzQxX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NzQxID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204NzQxLT5jb250cm9sX3R5cGUgPSBTTkRfU09DX1NQSTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCB3bTg3NDEpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYsCisJCQkmc29jX2NvZGVjX2Rldl93bTg3NDEsICZ3bTg3NDFfZGFpLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUod204NzQxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bTg3NDFfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmc3BpLT5kZXYpOworCWtmcmVlKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODc0MV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIndtODc0MSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NDFfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJCT0gd204NzQxX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODc0MV9zcGlfcmVtb3ZlKSwKK307CisjZW5kaWYgLyogQ09ORklHX1NQSV9NQVNURVIgKi8KKwogc3RhdGljIGludCBfX2luaXQgd204NzQxX21vZGluaXQodm9pZCkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTU0NCw2ICs1OTUsMTMgQEAKIAlpZiAocmV0ICE9IDApCiAJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODc0MSBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd204NzQxX3NwaV9kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciB3bTg3NDEgU1BJIGRyaXZlcjogJWRcbiIsCisJCSAgICAgICByZXQpOworCX0KKyNlbmRpZgogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1MSw2ICs2MDksOSBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgd204NzQxX2V4aXQodm9pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204NzQxX3NwaV9kcml2ZXIpOworI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQogCWkyY19kZWxfZHJpdmVyKCZ3bTg3NDFfaTJjX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCmluZGV4IGQwMDAzY2MuLmNhNzVhODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYxNSw2ICs2MTYsOCBAQAogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBTZXQgVk1JRCB0byA1ayAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1BXUjEsIHB3cl9yZWcgfCAweDAxYzEpOwogCkBAIC02NzIsMjggKzY3NSwxNCBAQAogCiBzdGF0aWMgaW50IHdtODc1MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc1MF9yZWcpOyBpKyspIHsKLQkJaWYgKGkgPT0gV004NzUwX1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg3NTBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODc1MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODc1MF9wcml2ICp3bTg3NTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmVnLCByZXQ7CisJaW50IHJldDsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg3NTAtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTcxMSwyMiArNzAwLDE0IEBACiAJd204NzUwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfTERBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX0xEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfUkRBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1JEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfTE9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTBfTE9VVDFWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NzUwX1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1MF9MT1VUMlYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9MT1VUMlYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg3NTBfUk9VVDJWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTBfUk9VVDJWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NzUwX0xJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004NzUwX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1MF9SSU5WT0wpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX0xEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfUkRBQywgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc1MF9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX0xPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc1MF9ST1VUMlYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTBfTElOVk9MLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzUwX1JJTlZPTCwgMHgwMTAwLCAweDAxMDApOwogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODc1MF9zbmRfY29udHJvbHMsCiAJCQkJQVJSQVlfU0laRSh3bTg3NTBfc25kX2NvbnRyb2xzKSk7CkBAIC03NTEsNiArNzMyLDEzIEBACiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NzUwX3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc1MF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODc1MCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204OTg3IiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3NTBfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODc1MF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTc4Nyw4ICs3NzUsOSBAQAogCiBzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd204NzUwX3NwaV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAid204NzUwLWNvZGVjIiwKKwkJLm5hbWUJPSAid204NzUwIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODc1MF9vZl9tYXRjaCwKIAl9LAogCS5pZF90YWJsZQk9IHdtODc1MF9zcGlfaWRzLAogCS5wcm9iZQkJPSB3bTg3NTBfc3BpX3Byb2JlLApAQCAtODMzLDggKzgyMiw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTBfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3bTg3NTAtY29kZWMiLAorCQkubmFtZSA9ICJ3bTg3NTAiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzUwX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzUwX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3NTBfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwppbmRleCBhYTA5MWEwLi5hOTUwNDcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE0OTAsNiArMTQ5MSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc1M19yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NTNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3NTMiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODc1M19vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204NzUzX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtMTUxOSw4ICsxNTI2LDkgQEAKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODc1M19zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gIndtODc1My1jb2RlYyIsCisJCS5uYW1lCT0gIndtODc1MyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NTNfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gd204NzUzX3NwaV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdtODc1M19zcGlfcmVtb3ZlKSwKQEAgLTE1NjMsOCArMTU3MSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg3NTNfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3bTg3NTMtY29kZWMiLAorCQkubmFtZSA9ICJ3bTg3NTMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204NzUzX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gICAgd204NzUzX2kyY19wcm9iZSwKIAkucmVtb3ZlID0gICBfX2RldmV4aXRfcCh3bTg3NTNfaTJjX3JlbW92ZSksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwppbmRleCAxOWI5MmJhLi5hYTA1ZTY1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtNjg0LDYgKzY4NSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc3MF9yZWdfZGVmcwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzcwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204NzcwIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg3NzBfb2ZfbWF0Y2gpOworCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKIHN0YXRpYyBpbnQgX19kZXZpbml0IHdtODc3MF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKQEAgLTcxNSw2ICs3MjIsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODc3MCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NzBfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSB3bTg3NzBfc3BpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh3bTg3NzBfc3BpX3JlbW92ZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCmluZGV4IDhlNzk1M2IuLmJmZGM1MjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjE1LDggKzIxNiw2IEBACiAJaW50IHJhdGlvX3NoaWZ0LCBtYXN0ZXI7CiAJaW50IGk7CiAKLQlpZmFjZSA9IDA7Ci0KIAlzd2l0Y2ggKGRhaS0+ZHJpdmVyLT5pZCkgewogCWNhc2UgV004Nzc2X0RBSV9EQUM6CiAJCWlmYWNlX3JlZyA9IFdNODc3Nl9EQUNJRkNUUkw7CkBAIC0yMzIsMjAgKzIzMSwyMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQogCS8qIFNldCB3b3JkIGxlbmd0aCAqLwotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwlzd2l0Y2ggKHNuZF9wY21fZm9ybWF0X3dpZHRoKHBhcmFtc19mb3JtYXQocGFyYW1zKSkpIHsKKwljYXNlIDE2OgorCQlpZmFjZSA9IDA7CisJY2FzZSAyMDoKKwkJaWZhY2UgPSAweDEwOwogCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKLQkJaWZhY2UgfD0gMHgxMDsKKwljYXNlIDI0OgorCQlpZmFjZSA9IDB4MjA7CiAJCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWlmYWNlIHw9IDB4MjA7CisJY2FzZSAzMjoKKwkJaWZhY2UgPSAweDMwOwogCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQlpZmFjZSB8PSAweDMwOwotCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBzYW1wbGUgc2l6ZTogJWlcbiIsCisJCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogT25seSBuZWVkIHRvIHNldCBNQ0xLL0xSQ0xLIHJhdGlvIGlmIHdlJ3JlIG1hc3RlciAqLwpAQCAtMzA2LDYgKzMwOCw4IEBACiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisKIAkJCS8qIERpc2FibGUgdGhlIGdsb2JhbCBwb3dlcmRvd247IERBUE0gZG9lcyB0aGUgcmVzdCAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004Nzc2X1BXUkRPV04sIDEsIDApOwogCQl9CkBAIC0zMjAsMTEgKzMyNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgV004Nzc2X1JBVEVTIChTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHxcCi0JCSAgICAgIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKLQkJICAgICAgU05EUlZfUENNX1JBVEVfOTYwMDApCi0KLQogI2RlZmluZSBXTTg3NzZfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfFwKIAkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCiAKQEAgLTM0OSw3ICszNDgsOSBAQAogCQkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJCS5jaGFubmVsc19taW4gPSAyLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBXTTg3NzZfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCQkJLnJhdGVfbWluID0gMzIwMDAsCisJCQkucmF0ZV9tYXggPSAxOTIwMDAsCiAJCQkuZm9ybWF0cyA9IFdNODc3Nl9GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJndtODc3Nl9kYWNfb3BzLApAQCAtMzYxLDcgKzM2Miw5IEBACiAJCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCiAJCQkuY2hhbm5lbHNfbWluID0gMiwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gV004Nzc2X1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkJCS5yYXRlX21pbiA9IDMyMDAwLAorCQkJLnJhdGVfbWF4ID0gOTYwMDAsCiAJCQkuZm9ybWF0cyA9IFdNODc3Nl9GT1JNQVRTLAogCQl9LAogCQkub3BzID0gJndtODc3Nl9hZGNfb3BzLApAQCAtMzc4LDIxICszODEsNyBAQAogCiBzdGF0aWMgaW50IHdtODc3Nl9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODc3Nl9yZWcpOyBpKyspIHsKLQkJaWYgKGNhY2hlW2ldID09IHdtODc3Nl9yZWdbaV0pCi0JCQljb250aW51ZTsKLQkJZGF0YVswXSA9IChpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KLQogCXdtODc3Nl9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwotCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtNDUyLDYgKzQ0MSwxMiBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc3Nl9yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NzZfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg3NzYiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODc3Nl9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204Nzc2X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtNDgxLDggKzQ3Niw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3NzZfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZQk9ICJ3bTg3NzYtY29kZWMiLAorCQkubmFtZQk9ICJ3bTg3NzYiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gd204Nzc2X29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHdtODc3Nl9zcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTg3NzZfc3BpX3JlbW92ZSksCkBAIC01MjUsOCArNTIxLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODc3Nl9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndtODc3Ni1jb2RlYyIsCisJCS5uYW1lID0gIndtODc3NiIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg3NzZfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSAgICB3bTg3NzZfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODc3Nl9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jCmluZGV4IGEyYTA5ZjguLmYyY2VkNzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYwpAQCAtNjAsNyArNjAsNyBAQAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZSA9IHdtODc4Ml9wcm9iZSwKLQkucmVtb3ZlID0gd204NzgyX3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aod204NzgyX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB3bTg3ODJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggOWE1ZTY3Yy4uOWVlMDcyYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC03MTcsNiArNzE4LDEyIEBACiAJLnZvbGF0aWxlX3JlZ2lzdGVyID0gd204ODA0X3ZvbGF0aWxlCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg4MDRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTg4MDQiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdtODgwNF9vZl9tYXRjaCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQogc3RhdGljIGludCBfX2RldmluaXQgd204ODA0X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewpAQCAtNzQ4LDYgKzc1NSw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid204ODA0IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODgwNF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IHdtODgwNF9zcGlfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODgwNF9zcGlfcmVtb3ZlKQpAQCAtNzkyLDYgKzgwMCw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid204ODA0IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdtODgwNF9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IHdtODgwNF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODgwNF9pMmNfcmVtb3ZlKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDA4MjA0MGUuLjNkMGRjMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwpAQCAtMTEwLDggKzExMCw4IEBACiAKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfQkNMS19ESVIgICAweDEKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMgICAweDEwMAotI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMV9CQ0xLX01BU0sgICh+MHgwMWUpCi0jZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0sgKH4weDcwMDApCisjZGVmaW5lIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSyAgMHgwMWUKKyNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzFfT1BDTEtfTUFTSyAweDcwMDAKIAogI2RlZmluZSBXTTg5MDBfUkVHX0NMT0NLSU5HMl9BRENfQ0xLRElWIDB4ZTAKICNkZWZpbmUgV004OTAwX1JFR19DTE9DS0lORzJfREFDX0NMS0RJViAweDFjCkBAIC0xMzUsNyArMTM1LDcgQEAKICNkZWZpbmUgV004OTAwX1JFR19IUENUTDFfSFBfU0hPUlQgICAgICAgMHgwOAogI2RlZmluZSBXTTg5MDBfUkVHX0hQQ1RMMV9IUF9TSE9SVDIgICAgICAweDA0CiAKLSNkZWZpbmUgV004OTAwX0xSQ19NQVNLIDB4ZmMwMAorI2RlZmluZSBXTTg5MDBfTFJDX01BU0sgMHgwM2ZmCiAKIHN0cnVjdCB3bTg5MDBfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CkBAIC03NDIsMjYgKzc0MiwyMCBAQAogewogCXN0cnVjdCB3bTg5MDBfcHJpdiAqd204OTAwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IF9mbGxfZGl2IGZsbF9kaXY7Ci0JdW5zaWduZWQgaW50IHJlZzsKIAogCWlmICh3bTg5MDAtPmZsbF9pbiA9PSBmcmVxX2luICYmIHdtODkwMC0+ZmxsX291dCA9PSBmcmVxX291dCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBUaGUgZGlnaXRhbCBzaWRlIHNob3VsZCBiZSBkaXNhYmxlZCBkdXJpbmcgYW55IGNoYW5nZS4gKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUE9XRVIxKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKLQkJICAgICByZWcgJiAofldNODkwMF9SRUdfUE9XRVIxX0ZMTF9FTkEpKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSwKKwkJCSAgICBXTTg5MDBfUkVHX1BPV0VSMV9GTExfRU5BLCAwKTsKIAogCS8qIERpc2FibGUgdGhlIEZMTD8gKi8KIAlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KSB7Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgcmVnICYgKH5XTTg5MDBfUkVHX0NMT0NLSU5HMV9NQ0xLX1NSQykpOwotCi0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19GTExDVEwxKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19GTExDVEwxLAotCQkJICAgICByZWcgJiAofldNODkwMF9SRUdfRkxMQ1RMMV9PU0NfRU5BKSk7Ci0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX01DTEtfU1JDLCAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19GTExDVEwxLAorCQkJCSAgICBXTTg5MDBfUkVHX0ZMTENUTDFfT1NDX0VOQSwgMCk7CiAJCXdtODkwMC0+ZmxsX2luID0gZnJlcV9pbjsKIAkJd204OTAwLT5mbGxfb3V0ID0gZnJlcV9vdXQ7CiAKQEAgLTc5NiwxNSArNzkwLDE0IEBACiAJZWxzZQogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0ZMTENUTDYsIDApOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1BPV0VSMSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCi0JCSAgICAgcmVnIHwgV004OTAwX1JFR19QT1dFUjFfRkxMX0VOQSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCisJCQkgICAgV004OTAwX1JFR19QT1dFUjFfRkxMX0VOQSwKKwkJCSAgICBXTTg5MDBfUkVHX1BPV0VSMV9GTExfRU5BKTsKIAogcmVlbmFibGU6Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCi0JCSAgICAgcmVnIHwgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMpOwotCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMsCisJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfTUNMS19TUkMpOwogCXJldHVybiAwOwogfQogCkBAIC04MTgsNDMgKzgxMSwzNSBAQAogCQkJCSBpbnQgZGl2X2lkLCBpbnQgZGl2KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0JdW5zaWduZWQgaW50IHJlZzsKIAogCXN3aXRjaCAoZGl2X2lkKSB7CiAJY2FzZSBXTTg5MDBfQkNMS19ESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX0JDTEtfTUFTSykpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKKwkJCQkgICAgV004OTAwX1JFR19DTE9DS0lORzFfQkNMS19NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODkwMF9PUENMS19ESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMSwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0spKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzEsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcxX09QQ0xLX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0RBQ19MUkNMSzoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPNCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU80LAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX0xSQ19NQVNLKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQVVESU80LAorCQkJCSAgICBXTTg5MDBfTFJDX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0FEQ19MUkNMSzoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FVRElPMyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQVVESU8zLAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX0xSQ19NQVNLKSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQVVESU8zLAorCQkJCSAgICBXTTg5MDBfTFJDX01BU0ssIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0RBQ19DTEtESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0RBQ19DTEtESVYpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0RBQ19DTEtESVYsIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0FEQ19DTEtESVY6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0NMT0NLSU5HMiwKLQkJCSAgICAgZGl2IHwgKHJlZyAmIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0FEQ19DTEtESVYpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19DTE9DS0lORzIsCisJCQkJICAgIFdNODkwMF9SRUdfQ0xPQ0tJTkcyX0FEQ19DTEtESVYsIGRpdik7CiAJCWJyZWFrOwogCWNhc2UgV004OTAwX0xSQ0xLX01PREU6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19EQUNDVFJMKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19EQUNDVFJMLAotCQkJICAgICBkaXYgfCAocmVnICYgV004OTAwX1JFR19EQUNDVFJMX0FJRl9MUkNMS1JBVEUpKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19EQUNDVFJMLAorCQkJCSAgICBXTTg5MDBfUkVHX0RBQ0NUUkxfQUlGX0xSQ0xLUkFURSwgZGl2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDM3LDEyICsxMDIyLDEyIEBACiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgogCQkvKiBFbmFibGUgdGhlcm1hbCBzaHV0ZG93biAqLwotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfR1BJTyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfR1BJTywKLQkJCSAgICAgcmVnIHwgV004OTAwX1JFR19HUElPX1RFTVBfRU5BKTsKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0FERENUTCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfQUREQ1RMLAotCQkJICAgICByZWcgfCBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NEKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19HUElPLAorCQkJCSAgICBXTTg5MDBfUkVHX0dQSU9fVEVNUF9FTkEsCisJCQkJICAgIFdNODkwMF9SRUdfR1BJT19URU1QX0VOQSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfQUREQ1RMLAorCQkJCSAgICBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NELAorCQkJCSAgICBXTTg5MDBfUkVHX0FERENUTF9URU1QX1NEKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgpAQCAtMTIwNSwyNiArMTE5MCwxNiBAQAogCXdtODkwMF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCiAJLyogTGF0Y2ggdGhlIHZvbHVtZSB1cGRhdGUgYml0cyAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTElOVk9MLAotCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfTElOVk9MKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCkgfCAweDEwMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19MT1VUMUNUTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX0xPVVQxQ1RMKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQxQ1RMLAotCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwMF9SRUdfUk9VVDFDVEwpIHwgMHgxMDApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfTE9VVDJDVEwsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MT1VUMkNUTCkgfCAweDEwMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19ST1VUMkNUTCwKLQkJICAgICAgc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQyQ1RMKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xEQUNfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MREFDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JEQUNfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19SREFDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX0xBRENfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19MQURDX0RWKSB8IDB4MTAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDBfUkVHX1JBRENfRFYsCi0JCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTAwX1JFR19SQURDX0RWKSB8IDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0xJTlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JJTlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX0xPVVQxQ1RMLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfUk9VVDFDVEwsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19MT1VUMkNUTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JPVVQyQ1RMLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfTERBQ19EViwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDBfUkVHX1JEQUNfRFYsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTAwX1JFR19MQURDX0RWLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODkwMF9SRUdfUkFEQ19EViwgMHgxMDAsIDB4MTAwKTsKIAogCS8qIFNldCB0aGUgREFDIGFuZCBtaXhlciBvdXRwdXQgYmlhcyAqLwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODkwMF9SRUdfT1VUQklBU0NUTCwgMHg4MSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCBiMDg1NTc1Li4yODVlZjg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTUwLDcgKzUwLDYgQEAKIHN0cnVjdCB3bTg5MDRfcHJpdiB7CiAKIAllbnVtIHdtODkwNF90eXBlIGRldnR5cGU7Ci0Jdm9pZCAqY29udHJvbF9kYXRhOwogCiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004OTA0X05VTV9TVVBQTElFU107CiAKQEAgLTg2OCw3ICs4NjcsNyBAQAogU09DX0RPVUJMRV9SKCJDYXB0dXJlIFZvbHVtZSIsIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzAsCiAJICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgMCwgMzEsIDApLAogU09DX0RPVUJMRV9SKCJDYXB0dXJlIFN3aXRjaCIsIFdNODkwNF9BTkFMT0dVRV9MRUZUX0lOUFVUXzAsCi0JICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgNywgMSwgMCksCisJICAgICBXTTg5MDRfQU5BTE9HVUVfUklHSFRfSU5QVVRfMCwgNywgMSwgMSksCiAKIFNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgV004OTA0X0FEQ19ESUdJVEFMXzAsIDQsIDEsIDApLAogU09DX0VOVU0oIkhpZ2ggUGFzcyBGaWx0ZXIgTW9kZSIsIGhwZl9tb2RlKSwKQEAgLTI1NDAsNyArMjUzOSw2IEBACiAKIAl3bTg5MDQtPmRldnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204OTA0KTsKLQl3bTg5MDQtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAl3bTg5MDQtPnBkYXRhID0gaTJjLT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKaW5kZXggMDU2ZGFhMC4uZGU5ZWM5YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCkBAIC00Myw5ICs0MywxOSBAQAogc3RydWN0IHdtODk0MF9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKK3N0YXRpYyBpbnQgd204OTQwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTQwX1NPRlRSRVNFVDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCiBzdGF0aWMgdTE2IHdtODk0MF9yZWdfZGVmYXVsdHNbXSA9IHsKIAkweDg5NDAsIC8qIFNvZnQgUmVzZXQgKi8KIAkweDAwMDAsIC8qIFBvd2VyIDEgKi8KQEAgLTQ2MCw2ICs0NzAsMTQgQEAKIAkJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTQwX1BPV0VSMSwgcHdyX3JlZyB8IDB4MSk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJldCA9IHNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzeW5jIGNhY2hlOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisKIAkJLyogZW5zdXJlIGJ1ZmlvZW4gYW5kIGJpYXNlbiAqLwogCQlwd3JfcmVnIHw9ICgxIDw8IDIpIHwgKDEgPDwgMyk7CiAJCS8qIHNldCB2bWlkIHRvIDMwMGsgZm9yIHN0YW5kYnkgKi8KQEAgLTQ3MCw2ICs0ODgsOCBAQAogCQlicmVhazsKIAl9CiAKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDEsNyArNjIxLDcgQEAKIAogCXN3aXRjaCAoZGl2X2lkKSB7CiAJY2FzZSBXTTg5NDBfQkNMS0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NDBfQ0xPQ0spICYgMHhGRkVGMzsKKwkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NDBfQ0xPQ0spICYgMHhGRkUzOwogCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NDBfQ0xPQ0ssIHJlZyB8IChkaXYgPDwgMikpOwogCQlicmVhazsKIAljYXNlIFdNODk0MF9NQ0xLRElWOgpAQCAtNjYwLDMwICs2ODAsOCBAQAogCiBzdGF0aWMgaW50IHdtODk0MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCWludCByZXQ7Ci0JdTggZGF0YVszXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlCi0JICogQ291bGQgdXNlIGF1dG8gaW5jcmVtZW50ZWQgd3JpdGVzIHRvIHNwZWVkIHRoaXMgdXAKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5NDBfcmVnX2RlZmF1bHRzKTsgaSsrKSB7Ci0JCWRhdGFbMF0gPSBpOwotCQlkYXRhWzFdID0gKGNhY2hlW2ldICYgMHhGRjAwKSA+PiA4OwotCQlkYXRhWzJdID0gY2FjaGVbaV0gJiAweDAwRkY7Ci0JCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yX3JldDsKLQkJZWxzZSBpZiAocmV0ICE9IDMpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVycm9yX3JldDsKLQkJfQotCX0KLQlyZXQgPSB3bTg5NDBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7CisJd204OTQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd204OTQwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTY5Myw3ICs2OTEsNiBAQAogCWludCByZXQ7CiAJdTE2IHJlZzsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTg5NDAtPmNvbnRyb2xfZGF0YTsKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIHdtODk0MC0+Y29udHJvbF90eXBlKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CkBAIC03NDQsNiArNzQxLDcgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODk0MF9yZWdfZGVmYXVsdHMpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204OTQwX3JlZ19kZWZhdWx0cywKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTg5NDBfdm9sYXRpbGVfcmVnaXN0ZXIsCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpAQCAtNzU4LDcgKzc1Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204OTQwKTsKLQl3bTg5NDAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKIAl3bTg5NDAtPmNvbnRyb2xfdHlwZSA9IFNORF9TT0NfSTJDOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwppbmRleCA0MzkzMzk0Li4yZGYyNTNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKQEAgLTcyLDcgKzcyLDYgQEAKIAogc3RydWN0IHdtODk2MF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50ICgqc2V0X2JpYXNfbGV2ZWwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCiAJCQkgICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCk7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmxvdXQxOwpAQCAtNTc1LDYgKzU3NCw4IEBACiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBFbmFibGUgYW50aS1wb3AgZmVhdHVyZXMgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2MF9BUE9QMSwKIAkJCQkgICAgICBXTTg5NjBfUE9CQ1RSTCB8IFdNODk2MF9TT0ZUX1NUIHwKQEAgLTY3Nyw2ICs2NzgsOSBAQAogCQkJCQkgICAgV004OTYwX1ZSRUYgfCBXTTg5NjBfVk1JRF9NQVNLLCAwKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CkBAIC05MDIsMTYgKzkwNiw2IEBACiBzdGF0aWMgaW50IHdtODk2MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5NjBfcHJpdiAqd204OTYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTYwX3JlZyk7IGkrKykgewotCQlkYXRhWzBdID0gKGkgPDwgMSkgfCAoKGNhY2hlW2ldID4+IDgpICYgMHgwMDAxKTsKLQkJZGF0YVsxXSA9IGNhY2hlW2ldICYgMHgwMGZmOwotCQljb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMik7Ci0JfQogCiAJd204OTYwLT5zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwpAQCAtOTI1LDcgKzkxOSw2IEBACiAJdTE2IHJlZzsKIAogCXdtODk2MC0+c2V0X2JpYXNfbGV2ZWwgPSB3bTg5NjBfc2V0X2JpYXNfbGV2ZWxfb3V0MzsKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd204OTYwLT5jb250cm9sX2RhdGE7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl93YXJuKGNvZGVjLT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKQEAgLTEwMTUsNyArMTAwOCw2IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5NjApOwogCXdtODk2MC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7Ci0Jd204OTYwLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKIAkJCSZzb2NfY29kZWNfZGV2X3dtODk2MCwgJndtODk2MF9kYWksIDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKaW5kZXggY2RlZTgxMC4uOTU2OGM4YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCkBAIC05NzQsNyArOTc0LDkgQEAKIAl9CiAKIAkvKiBUaGlzIGlzbid0IHZvbGF0aWxlIC0gcmVhZGJhY2sgZG9lc24ndCBjb3JyZXNwb25kIHRvIHdyaXRlICovCi0JcmVnID0gY29kZWMtPmh3X3JlYWQoY29kZWMsIFdNODk2MV9SSUdIVF9JTlBVVF9WT0xVTUUpOworCWNvZGVjLT5jYWNoZV9ieXBhc3MgPSAxOworCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYxX1JJR0hUX0lOUFVUX1ZPTFVNRSk7CisJY29kZWMtPmNhY2hlX2J5cGFzcyA9IDA7CiAJZGV2X2luZm8oY29kZWMtPmRldiwgIldNODk2MSBmYW1pbHkgJWQgcmV2aXNpb24gJWNcbiIsCiAJCSAocmVnICYgV004OTYxX0RFVklDRV9JRF9NQVNLKSA+PiBXTTg5NjFfREVWSUNFX0lEX1NISUZULAogCQkgKChyZWcgJiBXTTg5NjFfQ0hJUF9SRVZfTUFTSykgPj4gV004OTYxX0NISVBfUkVWX1NISUZUKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKaW5kZXggZDJjMzE1Zi4uOTFkM2M2ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCkBAIC02Myw2ICs2Myw4IEBACiAJaW50IGZsbF9mcmVmOwogCWludCBmbGxfZm91dDsKIAorCXUxNiBkc3AyX2VuYTsKKwogCXN0cnVjdCBkZWxheWVkX3dvcmsgbWljX3dvcms7CiAJc3RydWN0IHNuZF9zb2NfamFjayAqamFjazsKIApAQCAtODM3LDcgKzgzOSw3IEBACiAJWzQwXSA9IHsgMHgwMEZGLCAweDAxRkYsIDB4MDAwMCB9LCAvKiBSNDAgICAgLSBTUEtPVVRMIHZvbHVtZSAqLwogCVs0MV0gPSB7IDB4MDBGRiwgMHgwMUZGLCAweDAwMDAgfSwgLyogUjQxICAgIC0gU1BLT1VUUiB2b2x1bWUgKi8KIAotCVs0N10gPSB7IDB4MDAwRiwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjQ3ICAgIC0gVGhlcm1hbCBTaHV0ZG93biBTdGF0dXMgKi8KKwlbNDddID0geyAweDAwMEYsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFI0NyAgICAtIFRoZXJtYWwgU2h1dGRvd24gU3RhdHVzICovCiAJWzQ4XSA9IHsgMHg3RUM3LCAweDdFMDcsIDB4RkZGRiB9LCAvKiBSNDggICAgLSBBZGRpdGlvbmFsIENvbnRyb2wgKDQpICovCiAJWzQ5XSA9IHsgMHgwMEQzLCAweDAwRDcsIDB4RkZGRiB9LCAvKiBSNDkgICAgLSBDbGFzcyBEIENvbnRyb2wgMSAqLwogCVs1MV0gPSB7IDB4MDA0NywgMHgwMDQ3LCAweDAwMDAgfSwgLyogUjUxICAgIC0gQ2xhc3MgRCBDb250cm9sIDIgKi8KQEAgLTk2NSw3ICs5NjcsNyBAQAogCVs1ODRdID0geyAweDAwMkQsIDB4MDAyRCwgMHgwMDAwIH0sIC8qIFI1ODQgICAtIElSUSBEZWJvdW5jZSAqLwogCVs1ODZdID0geyAweEMwMDAsIDB4QzAwMCwgMHgwMDAwIH0sIC8qIFI1ODYgICAtICBNSUNJTlQgU291cmNlIFBvbCAqLwogCVs3NjhdID0geyAweDAwMDEsIDB4MDAwMSwgMHgwMDAwIH0sIC8qIFI3NjggICAtIERTUDIgUG93ZXIgTWFuYWdlbWVudCAqLwotCVsxMDM3XSA9IHsgMHgwMDAwLCAweDAwM0YsIDB4MDAwMCB9LCAvKiBSMTAzNyAgLSBEU1AyX0V4ZWNDb250cm9sICovCisJWzEwMzddID0geyAweDAwMDAsIDB4MDAzRiwgMHhGRkZGIH0sIC8qIFIxMDM3ICAtIERTUDJfRXhlY0NvbnRyb2wgKi8KIAlbNDA5Nl0gPSB7IDB4M0ZGRiwgMHgzRkZGLCAweDAwMDAgfSwgLyogUjQwOTYgIC0gV3JpdGUgU2VxdWVuY2VyIDAgKi8KIAlbNDA5N10gPSB7IDB4MDBGRiwgMHgwMEZGLCAweDAwMDAgfSwgLyogUjQwOTcgIC0gV3JpdGUgU2VxdWVuY2VyIDEgKi8KIAlbNDA5OF0gPSB7IDB4MDcwRiwgMHgwNzBGLCAweDAwMDAgfSwgLyogUjQwOTggIC0gV3JpdGUgU2VxdWVuY2VyIDIgKi8KQEAgLTE5NTksNyArMTk2MSwxMyBAQAogCiBzdGF0aWMgaW50IHdtODk2Ml9yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TT0ZUV0FSRV9SRVNFVCwgMHg2MjQzKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1NPRlRXQVJFX1JFU0VULCAweDYyNDMpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfUExMX1NPRlRXQVJFX1JFU0VULCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGlucGdhX3RsdiwgLTIzMjUsIDc1LCAwKTsKQEAgLTE5ODYsNiArMTk5NCwxMjIgQEAKIH07CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKIAorc3RhdGljIGludCB3bTg5NjJfZHNwMl93cml0ZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX3NldF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1MTYgdmFsKQoreworCXUxNiBhZGNsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjJfTEVGVF9BRENfVk9MVU1FKTsKKwl1MTYgYWRjciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUpOworCXUxNiBkYWMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSk7CisKKwkvKiBNdXRlIHRoZSBBRENzIGFuZCBEQUNzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0xFRlRfQURDX1ZPTFVNRSwgMCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUsIFdNODk2Ml9BRENfVlUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSwKKwkJCSAgICBXTTg5NjJfREFDX01VVEUsIFdNODk2Ml9EQUNfTVVURSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU09VTkRTVEFHRV9FTkFCTEVTXzAsIHZhbCk7CisKKwkvKiBSZXN0b3JlIHRoZSBBRENzIGFuZCBEQUNzICovCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0xFRlRfQURDX1ZPTFVNRSwgYWRjbCk7CisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX1JJR0hUX0FEQ19WT0xVTUUsIGFkY3IpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMSwKKwkJCSAgICBXTTg5NjJfREFDX01VVEUsIGRhYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NjJfZHNwMl9zdGFydChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk2Ml9wcml2ICp3bTg5NjIgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk2Ml9kc3AyX3dyaXRlX2NvbmZpZyhjb2RlYyk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfRFNQMl9FWEVDQ09OVFJPTCwgV004OTYyX0RTUDJfUlVOUik7CisKKwl3bTg5NjJfZHNwMl9zZXRfZW5hYmxlKGNvZGVjLCB3bTg5NjItPmRzcDJfZW5hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX3N0b3Aoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXdtODk2Ml9kc3AyX3NldF9lbmFibGUoY29kZWMsIDApOworCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0RTUDJfRVhFQ0NPTlRST0wsIFdNODk2Ml9EU1AyX1NUT1ApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004OTYyX0RTUDJfRU5BQkxFKHhuYW1lLCB4c2hpZnQpIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKwkuaW5mbyA9IHdtODk2Ml9kc3AyX2VuYV9pbmZvLCBcCisJLmdldCA9IHdtODk2Ml9kc3AyX2VuYV9nZXQsIC5wdXQgPSB3bTg5NjJfZHNwMl9lbmFfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSB4c2hpZnQgfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEhKHdtODk2Mi0+ZHNwMl9lbmEgJiAxIDw8IHNoaWZ0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk2Ml9kc3AyX2VuYV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHNoaWZ0ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IG9sZCA9IHdtODk2Mi0+ZHNwMl9lbmE7CisJaW50IHJldCA9IDA7CisJaW50IGRzcDJfcnVubmluZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0RTUDJfUE9XRVJfTUFOQUdFTUVOVCkgJgorCQlXTTg5NjJfRFNQMl9FTkE7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQorCQl3bTg5NjItPmRzcDJfZW5hIHw9IDEgPDwgc2hpZnQ7CisJZWxzZQorCQl3bTg5NjItPmRzcDJfZW5hICY9IH4oMSA8PCBzaGlmdCk7CisKKwlpZiAod204OTYyLT5kc3AyX2VuYSA9PSBvbGQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMTsKKworCWlmIChkc3AyX3J1bm5pbmcpIHsKKwkJaWYgKHdtODk2Mi0+ZHNwMl9lbmEpCisJCQl3bTg5NjJfZHNwMl9zZXRfZW5hYmxlKGNvZGVjLCB3bTg5NjItPmRzcDJfZW5hKTsKKwkJZWxzZQorCQkJd204OTYyX2RzcDJfc3RvcChjb2RlYyk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKwogLyogVGhlIFZVIGJpdHMgZm9yIHRoZSBoZWFkcGhvbmVzIGFyZSBpbiBhIGRpZmZlcmVudCByZWdpc3RlciB0byB0aGUgbXV0ZQogICogYml0cyBhbmQgb25seSB0YWtlIGVmZmVjdCBvbiB0aGUgUEdBIGlmIGl0IGlzIGFjdHVhbGx5IHBvd2VyZWQuCiAgKi8KQEAgLTIwMjEsNyArMjE0NSw2IEBACiAJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXUxNiAqcmVnX2NhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmV0OwogCiAJLyogQXBwbHkgdGhlIHVwZGF0ZSAoaWYgYW55KSAqLwpAQCAtMjAzMCwxNiArMjE1MywxOSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIElmIHRoZSBsZWZ0IFBHQSBpcyBlbmFibGVkIGhpdCB0aGF0IFZVIGJpdC4uLiAqLwotCWlmIChyZWdfY2FjaGVbV004OTYyX1BXUl9NR01UXzJdICYgV004OTYyX1NQS09VVExfUEdBX0VOQSkKLQkJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TUEtPVVRMX1ZPTFVNRSwKLQkJCQkgICAgIHJlZ19jYWNoZVtXTTg5NjJfU1BLT1VUTF9WT0xVTUVdKTsKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9QV1JfTUdNVF8yKTsKKwlpZiAocmV0ICYgV004OTYyX1NQS09VVExfUEdBX0VOQSkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU1BLT1VUTF9WT0xVTUUsCisJCQkgICAgICBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk2Ml9TUEtPVVRMX1ZPTFVNRSkpOworCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiAuLi5vdGhlcndpc2UgdGhlIHJpZ2h0LiAgVGhlIFZVIGlzIHN0ZXJlby4gKi8KLQlpZiAocmVnX2NhY2hlW1dNODk2Ml9QV1JfTUdNVF8yXSAmIFdNODk2Ml9TUEtPVVRSX1BHQV9FTkEpCi0JCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NjJfU1BLT1VUUl9WT0xVTUUsCi0JCQkJICAgICByZWdfY2FjaGVbV004OTYyX1NQS09VVFJfVk9MVU1FXSk7CisJaWYgKHJldCAmIFdNODk2Ml9TUEtPVVRSX1BHQV9FTkEpCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TUEtPVVRSX1ZPTFVNRSwKKwkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1NQS09VVFJfVk9MVU1FKSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmNhcF9ocGZfbW9kZV90ZXh0W10gPSB7CkBAIC0yMDQ5LDYgKzIxNzUsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2FwX2hwZl9tb2RlID0KIAlTT0NfRU5VTV9TSU5HTEUoV004OTYyX0FEQ19EQUNfQ09OVFJPTF8yLCAxMCwgMiwgY2FwX2hwZl9tb2RlX3RleHQpOwogCisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbGhwZl9tb2RlX3RleHRbXSA9IHsKKwkiTFBGIiwgIkhQRiIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2FwX2xocGZfbW9kZSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk2Ml9MSFBGMSwgMSwgMiwgY2FwX2xocGZfbW9kZV90ZXh0KTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk2Ml9zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEUoIklucHV0IE1peGVyIFN3aXRjaCIsIFdNODk2Ml9JTlBVVF9NSVhFUl9DT05UUk9MXzEsIDMsIDIsIDEsIDEpLAogCkBAIC0yMDc3LDYgKzIyMTEsOCBAQAogU09DX1NJTkdMRSgiQ2FwdHVyZSBIUEYgU3dpdGNoIiwgV004OTYyX0FEQ19EQUNfQ09OVFJPTF8xLCAwLCAxLCAxKSwKIFNPQ19FTlVNKCJDYXB0dXJlIEhQRiBNb2RlIiwgY2FwX2hwZl9tb2RlKSwKIFNPQ19TSU5HTEUoIkNhcHR1cmUgSFBGIEN1dG9mZiIsIFdNODk2Ml9BRENfREFDX0NPTlRST0xfMiwgNywgNywgMCksCitTT0NfU0lOR0xFKCJDYXB0dXJlIExIUEYgU3dpdGNoIiwgV004OTYyX0xIUEYxLCAwLCAxLCAwKSwKK1NPQ19FTlVNKCJDYXB0dXJlIExIUEYgTW9kZSIsIGNhcF9saHBmX21vZGUpLAogCiBTT0NfRE9VQkxFX1JfVExWKCJTaWRldG9uZSBWb2x1bWUiLCBXTTg5NjJfREFDX0RTUF9NSVhJTkdfMSwKIAkJIFdNODk2Ml9EQUNfRFNQX01JWElOR18yLCA0LCAxMiwgMCwgc3RfdGx2KSwKQEAgLTIxMzQsNiArMjI3MCwxMSBAQAogCQkgV004OTYyX0VRTF9CNF9HQUlOX1NISUZULCAzMSwgMCwgZXFfdGx2KSwKIFNPQ19ET1VCTEVfUl9UTFYoIkVRNSBWb2x1bWUiLCBXTTg5NjJfRVEzLCBXTTg5NjJfRVEyMywKIAkJIFdNODk2Ml9FUUxfQjVfR0FJTl9TSElGVCwgMzEsIDAsIGVxX3RsdiksCisKK1dNODk2Ml9EU1AyX0VOQUJMRSgiVlNTIFN3aXRjaCIsIFdNODk2Ml9WU1NfRU5BX1NISUZUKSwKK1dNODk2Ml9EU1AyX0VOQUJMRSgiSFBGMSBTd2l0Y2giLCBXTTg5NjJfSFBGMV9FTkFfU0hJRlQpLAorV004OTYyX0RTUDJfRU5BQkxFKCJIUEYyIFN3aXRjaCIsIFdNODk2Ml9IUEYyX0VOQV9TSElGVCksCitXTTg5NjJfRFNQMl9FTkFCTEUoIkhEIEJhc3MgU3dpdGNoIiwgV004OTYyX0hEQkFTU19FTkFfU0hJRlQpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk2Ml9zcGtfbW9ub19jb250cm9sc1tdID0gewpAQCAtMjIyNSwxNSArMjM2NiwxNCBAQAogCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NjJfRkxMX0NPTlRST0xfMSwKIAkJCQkJICAgIFdNODk2Ml9GTExfRU5BLCBXTTg5NjJfRkxMX0VOQSk7Ci0JCQlpZiAod204OTYyLT5pcnEpIHsKLQkJCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKLQkJCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3bTg5NjItPmZsbF9sb2NrLAotCQkJCQkJCQkgICAgICB0aW1lb3V0KTsKIAotCQkJCWlmICh0aW1lb3V0ID09IDApCi0JCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJCSJUaW1lZCBvdXQgc3RhcnRpbmcgRkxMXG4iKTsKLQkJCX0KKwkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDUpOworCQkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTYyLT5mbGxfbG9jaywKKwkJCQkJCQkgICAgICB0aW1lb3V0KTsKKworCQkJaWYgKHdtODk2Mi0+aXJxICYmIHRpbWVvdXQgPT0gMCkKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJUaW1lZCBvdXQgc3RhcnRpbmcgRkxMXG4iKTsKIAkJfQogCQlicmVhazsKIApAQCAtMjM2NSw3ICsyNTA1LDYgQEAKIAkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOwotCXUxNiAqcmVnX2NhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKIAlpbnQgcmVnOwogCiAJc3dpdGNoICh3LT5zaGlmdCkgewpAQCAtMjM4OCwxMyArMjUyNywzOCBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgcmVnLCByZWdfY2FjaGVbcmVnXSk7CisJCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsIHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSk7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIAorc3RhdGljIGludCBkc3AyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmICh3bTg5NjItPmRzcDJfZW5hKQorCQkJd204OTYyX2RzcDJfc3RhcnQoY29kZWMpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICh3bTg5NjItPmRzcDJfZW5hKQorCQkJd204OTYyX2RzcDJfc3RvcChjb2RlYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqc3RfdGV4dFtdID0geyAiTm9uZSIsICJSaWdodCIsICJMZWZ0IiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHN0cl9lbnVtID0KQEAgLTI1MDksNyArMjY3Myw3IEBACiBTTkRfU09DX0RBUE1fSU5QVVQoIkJlZXAiKSwKIFNORF9TT0NfREFQTV9JTlBVVCgiRE1JQ0RBVCIpLAogCi1TTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUyIsIFdNODk2Ml9QV1JfTUdNVF8xLCAxLCAwKSwKK1NORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMiLCBXTTg5NjJfUFdSX01HTVRfMSwgMSwgMCwgTlVMTCwgMCksCiAKIFNORF9TT0NfREFQTV9TVVBQTFkoIkNsYXNzIEciLCBXTTg5NjJfQ0hBUkdFX1BVTVBfQiwgMCwgMSwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJTWVNDTEsiLCBXTTg5NjJfQ0xPQ0tJTkcyLCA1LCAwLCBzeXNjbGtfZXZlbnQsCkBAIC0yNTE3LDYgKzI2ODEsOSBAQAogU05EX1NPQ19EQVBNX1NVUFBMWSgiQ2hhcmdlIFB1bXAiLCBXTTg5NjJfQ0hBUkdFX1BVTVBfMSwgMCwgMCwgY3BfZXZlbnQsCiAJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAogU05EX1NPQ19EQVBNX1NVUFBMWSgiVE9DTEsiLCBXTTg5NjJfQURESVRJT05BTF9DT05UUk9MXzEsIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJEU1AyIiwgMSwgV004OTYyX0RTUDJfUE9XRVJfTUFOQUdFTUVOVCwKKwkJICAgICAgV004OTYyX0RTUDJfRU5BX1NISUZULCAwLCBkc3AyX2V2ZW50LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCiAKIFNORF9TT0NfREFQTV9NSVhFUigiSU5QR0FMIiwgV004OTYyX0xFRlRfSU5QVVRfUEdBX0NPTlRST0wsIDQsIDAsCiAJCSAgIGlucGdhbCwgQVJSQVlfU0laRShpbnBnYWwpKSwKQEAgLTI1MjcsNyArMjY5NCw3IEBACiBTTkRfU09DX0RBUE1fTUlYRVIoIk1JWElOUiIsIFdNODk2Ml9QV1JfTUdNVF8xLCA0LCAwLAogCQkgICBtaXhpbnIsIEFSUkFZX1NJWkUobWl4aW5yKSksCiAKLVNORF9TT0NfREFQTV9BSUZfSU4oIkRNSUMiLCBOVUxMLCAwLCBXTTg5NjJfUFdSX01HTVRfMSwgMTAsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTigiRE1JQ19FTkEiLCBOVUxMLCAwLCBXTTg5NjJfUFdSX01HTVRfMSwgMTAsIDApLAogCiBTTkRfU09DX0RBUE1fQURDKCJBRENMIiwgIkNhcHR1cmUiLCBXTTg5NjJfUFdSX01HTVRfMSwgMywgMCksCiBTTkRfU09DX0RBUE1fQURDKCJBRENSIiwgIkNhcHR1cmUiLCBXTTg5NjJfUFdSX01HTVRfMSwgMiwgMCksCkBAIC0yNjA2LDE3ICsyNzczLDE5IEBACiAKIAl7ICJNSUNCSUFTIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAotCXsgIkRNSUMiLCBOVUxMLCAiRE1JQ0RBVCIgfSwKKwl7ICJETUlDX0VOQSIsIE5VTEwsICJETUlDREFUIiB9LAogCiAJeyAiQURDTCIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiQURDTCIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJBRENMIiwgTlVMTCwgIk1JWElOTCIgfSwKLQl7ICJBRENMIiwgTlVMTCwgIkRNSUMiIH0sCisJeyAiQURDTCIsIE5VTEwsICJETUlDX0VOQSIgfSwKKwl7ICJBRENMIiwgTlVMTCwgIkRTUDIiIH0sCiAKIAl7ICJBRENSIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIlRPQ0xLIiB9LAogCXsgIkFEQ1IiLCBOVUxMLCAiTUlYSU5SIiB9LAotCXsgIkFEQ1IiLCBOVUxMLCAiRE1JQyIgfSwKKwl7ICJBRENSIiwgTlVMTCwgIkRNSUNfRU5BIiB9LAorCXsgIkFEQ1IiLCBOVUxMLCAiRFNQMiIgfSwKIAogCXsgIlNUTCIsICJMZWZ0IiwgIkFEQ0wiIH0sCiAJeyAiU1RMIiwgIlJpZ2h0IiwgIkFEQ1IiIH0sCkBAIC0yNjI4LDExICsyNzk3LDEzIEBACiAJeyAiREFDTCIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJEQUNMIiwgTlVMTCwgIkJlZXAiIH0sCiAJeyAiREFDTCIsIE5VTEwsICJTVEwiIH0sCisJeyAiREFDTCIsIE5VTEwsICJEU1AyIiB9LAogCiAJeyAiREFDUiIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiREFDUiIsIE5VTEwsICJUT0NMSyIgfSwKIAl7ICJEQUNSIiwgTlVMTCwgIkJlZXAiIH0sCiAJeyAiREFDUiIsIE5VTEwsICJTVFIiIH0sCisJeyAiREFDUiIsIE5VTEwsICJEU1AyIiB9LAogCiAJeyAiSFBNSVhMIiwgIklONEwgU3dpdGNoIiwgIklONEwiIH0sCiAJeyAiSFBNSVhMIiwgIklONFIgU3dpdGNoIiwgIklONFIiIH0sCkBAIC0zMDU4LDkgKzMyMjksOSBAQAogCWludCBhaWYwID0gMDsKIAogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKLQljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgotCQlhaWYwIHw9IFdNODk2Ml9MUkNMS19JTlY7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJYWlmMCB8PSBXTTg5NjJfTFJDTEtfSU5WIHwgMzsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgogCQlhaWYwIHw9IDM7CiAKIAkJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewpAQCAtMzQwMywxMiArMzU3NCwxNiBAQAogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IG1hc2s7CiAJaW50IGFjdGl2ZTsKKwlpbnQgcmVnOwogCiAJbWFzayA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLKTsKIAogCWFjdGl2ZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMik7CiAJYWN0aXZlICY9IH5tYXNrOwogCisJaWYgKCFhY3RpdmUpCisJCXJldHVybiBJUlFfTk9ORTsKKwogCS8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzICovCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTYyX0lOVEVSUlVQVF9TVEFUVVNfMiwgYWN0aXZlKTsKIApAQCAtMzQyMCw5ICszNTk1LDIxIEBACiAJaWYgKGFjdGl2ZSAmIFdNODk2Ml9GSUZPU19FUlJfRUlOVCkKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRklGTyBlcnJvclxuIik7CiAKLQlpZiAoYWN0aXZlICYgV004OTYyX1RFTVBfU0hVVF9FSU5UKQorCWlmIChhY3RpdmUgJiBXTTg5NjJfVEVNUF9TSFVUX0VJTlQpIHsKIAkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlRoZXJtYWwgc2h1dGRvd25cbiIpOwogCisJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYyX1RIRVJNQUxfU0hVVERPV05fU1RBVFVTKTsKKworCQlpZiAocmVnICYgV004OTYyX1RFTVBfRVJSX0hQKQorCQkJZGV2X2NyaXQoY29kZWMtPmRldiwgIkhlYWRwaG9uZSB0aGVybWFsIGVycm9yXG4iKTsKKwkJaWYgKHJlZyAmIFdNODk2Ml9URU1QX1dBUk5fSFApCisJCQlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiSGVhZHBob25lIHRoZXJtYWwgd2FybmluZ1xuIik7CisJCWlmIChyZWcgJiBXTTg5NjJfVEVNUF9FUlJfU1BLKQorCQkJZGV2X2NyaXQoY29kZWMtPmRldiwgIlNwZWFrZXIgdGhlcm1hbCBlcnJvclxuIik7CisJCWlmIChyZWcgJiBXTTg5NjJfVEVNUF9XQVJOX1NQSykKKwkJCWRldl9jcml0KGNvZGVjLT5kZXYsICJTcGVha2VyIHRoZXJtYWwgd2FybmluZ1xuIik7CisJfQorCiAJaWYgKGFjdGl2ZSAmIChXTTg5NjJfTUlDU0NEX0VJTlQgfCBXTTg5NjJfTUlDRF9FSU5UKSkgewogCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGV2ZW50IGRldGVjdGVkXG4iKTsKIApAQCAtMzg0Nyw2ICs0MDM0LDExIEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX0NMT0NLSU5HMiwKIAkJCSAgICBXTTg5NjJfQ0xLUkVHX09WRCwgV004OTYyX0NMS1JFR19PVkQpOwogCisJLyogRW5zdXJlIHRoYXQgdGhlIG9zY2lsbGF0b3IgYW5kIFBMTHMgYXJlIGRpc2FibGVkICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTYyX1BMTDIsCisJCQkgICAgV004OTYyX09TQ19FTkEgfCBXTTg5NjJfUExMMl9FTkEgfCBXTTg5NjJfUExMM19FTkEsCisJCQkgICAgMCk7CisKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTYyLT5zdXBwbGllcyksIHdtODk2Mi0+c3VwcGxpZXMpOwogCiAJaWYgKHBkYXRhKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwppbmRleCA1NzJiYjgwLi5iNDQ0YjI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKQEAgLTU0Niw2ICs1NDYsOSBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDE0MCk7CiAJCWJyZWFrOwpAQCAtNjA1LDIwICs2MDgsOCBAQAogCiBzdGF0aWMgaW50IHdtODk3MV9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTE2IHJlZzsKIAotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTcxX3JlZyk7IGkrKykgewotCQlpZiAoaSArIDEgPT0gV004OTcxX1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg5NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIGNoYXJnZSB3bTg5NzEgY2FwcyAqLwpAQCAtNjYwLDI1ICs2NTEsMTQgQEAKIAkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfTERBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX0xEQUMsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUkRBQyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1JEQUMsIHJlZyB8IDB4MDEwMCk7Ci0KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk3MV9MT1VUMVYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9MT1VUMVYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUk9VVDFWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUk9VVDFWLCByZWcgfCAweDAxMDApOwotCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfTE9VVDJWKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfTE9VVDJWLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTcxX1JPVVQyVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1JPVVQyViwgcmVnIHwgMHgwMTAwKTsKLQotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTcxX0xJTlZPTCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX0xJTlZPTCwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk3MV9SSU5WT0wpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9SSU5WT0wsIHJlZyB8IDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX0xEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfUkRBQywgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk3MV9MT1VUMVYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX0xPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk3MV9ST1VUMlYsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfTElOVk9MLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX1JJTlZPTCwgMHgwMTAwLCAweDAxMDApOwogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk3MV9zbmRfY29udHJvbHMsCiAJCQkJQVJSQVlfU0laRSh3bTg5NzFfc25kX2NvbnRyb2xzKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwppbmRleCBjYTY0NmE4Li45MzUyZjFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAwOSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgogICoKLSAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8bGludXhAd29sZnNvbm1pY3JvLmNvbT4KKyAqIEF1dGhvcjogTGlhbSBHaXJkd29vZCA8TGlhbS5HaXJkd29vZEB3b2xmc29ubWljcm8uY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNTMwLDYgKzUzMCw4IEBACiAJCXBvd2VyMSB8PSBXTTg5NzRfUE9XRVIxX0JJQVNFTiB8IFdNODk3NF9QT1dFUjFfQlVGSU9FTjsKIAogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBJbml0aWFsIGNhcCBjaGFyZ2UgYXQgVk1JRCA1ayAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTc0X1BPV0VSMSwgcG93ZXIxIHwgMHgzKTsKIAkJCW1kZWxheSgxMDApOwpAQCAtNTg5LDE4ICs1OTEsNyBAQAogCiBzdGF0aWMgaW50IHdtODk3NF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCXU4IGRhdGFbMl07Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7Ci0KLQkvKiBTeW5jIHJlZ19jYWNoZSB3aXRoIHRoZSBoYXJkd2FyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk3NF9yZWcpOyBpKyspIHsKLQkJZGF0YVswXSA9IChpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KIAl3bTg5NzRfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwppbmRleCA4NWUzZTYzLi40MWNhNGQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKQEAgLTUyLDcgKzUyLDYgQEAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHdtODk3OF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJdW5zaWduZWQgaW50IGZfcGxsb3V0OwogCXVuc2lnbmVkIGludCBmX21jbGs7CiAJdW5zaWduZWQgaW50IGZfMjU2ZnM7CkBAIC05NTUsNyArOTU0LDYgQEAKIAkgKiBkZWZhdWx0IGhhcmR3YXJlIHNldHRpbmcKIAkgKi8KIAl3bTg5NzgtPnN5c2NsayA9IFdNODk3OF9QTEw7Ci0JY29kZWMtPmNvbnRyb2xfZGF0YSA9IHdtODk3OC0+Y29udHJvbF9kYXRhOwogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCBTTkRfU09DX0kyQyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtMTAxNiw3ICsxMDE0LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5NzgpOwotCXdtODk3OC0+Y29udHJvbF9kYXRhID0gaTJjOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCiAJCQkmc29jX2NvZGVjX2Rldl93bTg5NzgsICZ3bTg5NzhfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCmluZGV4IDE3ZjA0ZWMuLjkzZWUyODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODNfU09GVFdBUkVfUkVTRVQsIDB4ODk4Myk7CisJcmV0ID0gc25kX3NvY193cml0ZShjb2RlYywgV004OTgzX1NPRlRXQVJFX1JFU0VULCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKaW5kZXggZDcxNzBmMS4uMmU5ZWJhNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC01NSw3ICs1NSw2IEBACiAJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiB9OwogCi0KICNkZWZpbmUgd204OTg4X3Jlc2V0KGMpCXNuZF9zb2Nfd3JpdGUoYywgV004OTg4X1JFU0VULCAwKQogCiAvKgpAQCAtNjc2LDYgKzY3NSw4IEBACiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCiAJCQkvKiBWUkVGLCBWTUlEPTJ4NWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9QV1IxLCBwd3JfcmVnIHwgMHgxYzEpOwogCkBAIC03MzYsMjEgKzczNyw3IEBACiAKIHN0YXRpYyBpbnQgd204OTg4X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JaW50IGk7Ci0JdTggZGF0YVsyXTsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCS8qIFN5bmMgcmVnX2NhY2hlIHdpdGggdGhlIGhhcmR3YXJlICovCi0JZm9yIChpID0gMDsgaSA8IFdNODk4OF9OVU1fUkVHOyBpKyspIHsKLQkJaWYgKGkgPT0gV004OTg4X1JFU0VUKQotCQkJY29udGludWU7Ci0JCWRhdGFbMF0gPSAoaSA8PCAxKSB8ICgoY2FjaGVbaV0gPj4gOCkgJiAweDAwMDEpOwotCQlkYXRhWzFdID0gY2FjaGVbaV0gJiAweDAwZmY7Ci0JCWNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKLQl9Ci0KIAl3bTg5ODhfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03NTksNyArNzQ2LDYgQEAKIAlzdHJ1Y3Qgd204OTg4X3ByaXYgKndtODk4OCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0ID0gMDsKLQl1MTYgcmVnOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODk4OC0+Y29udHJvbF90eXBlKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzc0LDE2ICs3NjAsMTEgQEAKIAl9CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICh3ZSBhbHdheXMgdXBkYXRlIGxlZnQgdGhlbiByaWdodCkgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk4OF9SQURDKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODhfUkFEQywgcmVnIHwgMHgxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTg4X1JEQUMpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9SREFDLCByZWcgfCAweDAxMDApOwotCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTg4X1JPVVQxVik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV004OTg4X1JPVVQxViwgcmVnIHwgMHgwMTAwKTsKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk4OF9ST1VUMlYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9ST1VUMlYsIHJlZyB8IDB4MDEwMCk7Ci0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5ODhfUklOVk9MKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODhfUklOVk9MLCByZWcgfCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4OF9SQURDLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTg4X1JEQUMsIDB4MDEwMCwgMHgwMTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5ODhfUk9VVDFWLCAweDAxMDAsIDB4MDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTg4X1JPVVQyViwgMHgwMTAwLCAweDAxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk4OF9SSU5WT0wsIDB4MDEwMCwgMHgwMTAwKTsKIAogCXdtODk4OF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwppbmRleCAxMDBhZWVlLi5kMjlhOTYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKQEAgLTM2LDEwICszNiwxNyBAQAogCXVuc2lnbmVkIGludCBwY21jbGs7CiB9OwogCi0vKgotICogd204OTkwIHJlZ2lzdGVyIGNhY2hlLiAgTm90ZSB0aGF0IHJlZ2lzdGVyIDAgaXMgbm90IGluY2x1ZGVkIGluIHRoZQotICogY2FjaGUuCi0gKi8KK3N0YXRpYyBpbnQgd204OTkwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTkwX1JFU0VUOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCB1MTYgd204OTkwX3JlZ1tdID0gewogCTB4ODk5MCwgICAgIC8qIFIwICAtIFJlc2V0ICovCiAJMHgwMDAwLCAgICAgLyogUjEgIC0gUG93ZXIgTWFuYWdlbWVudCAoMSkgKi8KQEAgLTM5NCw3ICs0MDEsNyBAQAogCQkoMSA8PCBXTTg5OTBfQUlOUk1VWF9QV1JfQklUKSkpIHsKIAkJcmVnIHw9IFdNODk5MF9BSU5SX0VOQTsKIAl9IGVsc2UgewotCQlyZWcgJj0gfldNODk5MF9BSU5MX0VOQTsKKwkJcmVnICY9IH5XTTg5OTBfQUlOUl9FTkE7CiAJfQogCXNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CiAKQEAgLTk3NCw3ICs5ODEsNiBAQAogc3RhdGljIGludCB3bTg5OTBfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBwbGxfaWQsCiAJCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCiB7Ci0JdTE2IHJlZzsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwogCXN0cnVjdCBfcGxsX2RpdiBwbGxfZGl2OwogCkBAIC05ODIsMTMgKzk4OCwxMiBAQAogCQlwbGxfZmFjdG9ycygmcGxsX2RpdiwgZnJlcV9vdXQgKiA0LCBmcmVxX2luKTsKIAogCQkvKiBUdXJuIG9uIFBMTCAqLwotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIpOwotCQlyZWcgfD0gV004OTkwX1BMTF9FTkE7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsIHJlZyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkJICAgIFdNODk5MF9QTExfRU5BLCBXTTg5OTBfUExMX0VOQSk7CiAKIAkJLyogc3lzY2xrIGNvbWVzIGZyb20gUExMICovCi0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkwX0NMT0NLSU5HXzIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwgcmVnIHwgV004OTkwX1NZU0NMS19TUkMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwKKwkJCQkgICAgV004OTkwX1NZU0NMS19TUkMsIFdNODk5MF9TWVNDTEtfU1JDKTsKIAogCQkvKiBzZXQgdXAgTiAsIGZyYWN0aW9uYWwgbW9kZSBhbmQgcHJlLWRpdmlzb3IgaWYgbmVjZXNzYXJ5ICovCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QTEwxLCBwbGxfZGl2Lm4gfCBXTTg5OTBfU0RNIHwKQEAgLTk5NiwxMCArMTAwMSw5IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QTEwyLCAodTgpKHBsbF9kaXYuaz4+OCkpOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUExMMywgKHU4KShwbGxfZGl2LmsgJiAweEZGKSk7CiAJfSBlbHNlIHsKLQkJLyogVHVybiBvbiBQTEwgKi8KLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQkJcmVnICY9IH5XTTg5OTBfUExMX0VOQTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX1BPV0VSX01BTkFHRU1FTlRfMiwgcmVnKTsKKwkJLyogVHVybiBvZmYgUExMICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzIsCisJCQkJICAgIFdNODk5MF9QTExfRU5BLCAwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDc3LDI4ICsxMDgxLDIzIEBACiAJCWludCBkaXZfaWQsIGludCBkaXYpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKLQl1MTYgcmVnOwogCiAJc3dpdGNoIChkaXZfaWQpIHsKIAljYXNlIFdNODk5MF9NQ0xLX0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMikgJgotCQkJfldNODk5MF9NQ0xLX0RJVl9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMiwgcmVnIHwgZGl2KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsCisJCQkJICAgIFdNODk5MF9NQ0xLX0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9EQUNDTEtfRElWOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yKSAmCi0JCQl+V004OTkwX0RBQ19DTEtESVZfTUFTSzsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsIHJlZyB8IGRpdik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yLAorCQkJCSAgICBXTTg5OTBfREFDX0NMS0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9BRENDTEtfRElWOgotCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yKSAmCi0JCQl+V004OTkwX0FEQ19DTEtESVZfTUFTSzsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0NMT0NLSU5HXzIsIHJlZyB8IGRpdik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9DTE9DS0lOR18yLAorCQkJCSAgICBXTTg5OTBfQURDX0NMS0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAljYXNlIFdNODk5MF9CQ0xLX0RJVjoKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMSkgJgotCQkJfldNODk5MF9CQ0xLX0RJVl9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfQ0xPQ0tJTkdfMSwgcmVnIHwgZGl2KTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0NMT0NLSU5HXzEsCisJCQkJICAgIFdNODk5MF9CQ0xLX0RJVl9NQVNLLCBkaXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNTYsNyArMTE1NSw3IEBACiBzdGF0aWMgaW50IHdtODk5MF9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCiB7Ci0JdTE2IHZhbDsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgpAQCAtMTE2NCwxMyArMTE2MywxOCBAQAogCiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJLyogVk1JRD0yKjUwayAqLwotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEpICYKLQkJCX5XTTg5OTBfVk1JRF9NT0RFX01BU0s7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsIHZhbCB8IDB4Mik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJICAgIFdNODk5MF9WTUlEX01PREVfTUFTSywgMHgyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZXQgPSBzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc3luYyBjYWNoZTogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwogCQkJLyogRW5hYmxlIGFsbCBvdXRwdXQgZGlzY2hhcmdlIGJpdHMgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9BTlRJUE9QMSwgV004OTkwX0RJU19MTElORSB8CiAJCQkJV004OTkwX0RJU19STElORSB8IFdNODk5MF9ESVNfT1VUMyB8CkBAIC0xMjI1LDkgKzEyMjksOCBAQAogCQl9CiAKIAkJLyogVk1JRD0yKjI1MGsgKi8KLQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xKSAmCi0JCQl+V004OTkwX1ZNSURfTU9ERV9NQVNLOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xLCB2YWwgfCAweDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTBfVk1JRF9NT0RFX01BU0ssIDB4NCk7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgpAQCAtMTI0MSw4ICsxMjQ0LDggQEAKIAkJCVdNODk5MF9CVUZJT0VOKTsKIAogCQkvKiBtdXRlIERBQyAqLwotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MF9EQUNfQ1RSTCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9EQUNfQ1RSTCwgdmFsIHwgV004OTkwX0RBQ19NVVRFKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0RBQ19DVFJMLAorCQkJCSAgICBXTTg5OTBfREFDX01VVEUsIFdNODk5MF9EQUNfTVVURSk7CiAKIAkJLyogRW5hYmxlIGFueSBkaXNhYmxlZCBvdXRwdXRzICovCiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9QT1dFUl9NQU5BR0VNRU5UXzEsIDB4MWYwMyk7CkBAIC0xMzE5LDE5ICsxMzIyLDYgQEAKIAogc3RhdGljIGludCB3bTg5OTBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaTsKLQl1OCBkYXRhWzJdOwotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTBfcmVnKTsgaSsrKSB7Ci0JCWlmIChpICsgMSA9PSBXTTg5OTBfUkVTRVQpCi0JCQljb250aW51ZTsKLQkJZGF0YVswXSA9ICgoaSArIDEpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7Ci0JCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKLQkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwotCX0KLQogCXdtODk5MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCXJldHVybiAwOwogfQpAQCAtMTM0Myw3ICsxMzMzLDYgQEAKIHN0YXRpYyBpbnQgd204OTkwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlpbnQgcmV0OwotCXUxNiByZWc7CiAKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTM1NiwxNSArMTM0NSwxNCBAQAogCS8qIGNoYXJnZSBvdXRwdXQgY2FwcyAqLwogCXdtODk5MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfQVVESU9fSU5URVJGQUNFXzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MF9BVURJT19JTlRFUkZBQ0VfNCwgcmVnIHwgV004OTkwX0FMUkNHUElPMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkwX0FVRElPX0lOVEVSRkFDRV80LAorCQkJICAgIFdNODk5MF9BTFJDR1BJTzEsIFdNODk5MF9BTFJDR1BJTzEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfR1BJTzFfR1BJTzIpICYKLQkJfldNODk5MF9HUElPMV9TRUxfTUFTSzsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfR1BJTzFfR1BJTzIsIHJlZyB8IDEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5MF9HUElPMV9HUElPMiwKKwkJCSAgICBXTTg5OTBfR1BJTzFfU0VMX01BU0ssIDEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yLCByZWcgfCBXTTg5OTBfT1BDTEtfRU5BKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTBfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgIFdNODk5MF9PUENMS19FTkEsIFdNODk5MF9PUENMS19FTkEpOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0xFRlRfT1VUUFVUX1ZPTFVNRSwgMHg1MCB8ICgxPDw4KSk7CiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX1JJR0hUX09VVFBVVF9WT0xVTUUsIDB4NTAgfCAoMTw8OCkpOwpAQCAtMTM5Miw2ICsxMzgwLDcgQEAKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODk5MF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204OTkwX3JlZywKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTg5OTBfdm9sYXRpbGVfcmVnaXN0ZXIsCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKaW5kZXggNmFmMjNkMC4uYzlhYjNiYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA3LTIwMTAgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqIEF1dGhvcjogR3JhZW1lIEdyZWdvcnkKLSAqICAgICAgICAgbGludXhAd29sZnNvbm1pY3JvLmNvbQorICogICAgICAgICBHcmFlbWUuR3JlZ29yeUB3b2xmc29ubWljcm8uY29tCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMzkzLDcgKzM5Myw3IEBACiAJCQkgKDEgPDwgV004OTkxX0FJTlJNVVhfUFdSX0JJVCkpKQogCQlyZWcgfD0gV004OTkxX0FJTlJfRU5BOwogCWVsc2UKLQkJcmVnICY9IH5XTTg5OTFfQUlOTF9FTkE7CisJCXJlZyAmPSB+V004OTkxX0FJTlJfRU5BOwogCiAJc25kX3NvY193cml0ZSh3LT5jb2RlYywgV004OTkxX1BPV0VSX01BTkFHRU1FTlRfMiwgcmVnKTsKIAlyZXR1cm4gMDsKQEAgLTEyNjQsNyArMTI2NCw2IEBACiB7CiAJc3RydWN0IHdtODk5MV9wcml2ICp3bTg5OTE7CiAJaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgcmVnOwogCiAJd204OTkxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTEyODIsMTkgKzEyODEsMTggQEAKIAogCXdtODk5MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfQVVESU9fSU5URVJGQUNFXzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9BVURJT19JTlRFUkZBQ0VfNCwgcmVnIHwgV004OTkxX0FMUkNHUElPMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkxX0FVRElPX0lOVEVSRkFDRV80LAorCQkJICAgIFdNODk5MV9BTFJDR1BJTzEsIFdNODk5MV9BTFJDR1BJTzEpOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfR1BJTzFfR1BJTzIpICYKLQkgICAgICB+V004OTkxX0dQSU8xX1NFTF9NQVNLOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9HUElPMV9HUElPMiwgcmVnIHwgMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkxX0dQSU8xX0dQSU8yLAorCQkJICAgIFdNODk5MV9HUElPMV9TRUxfTUFTSywgMSk7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5MV9QT1dFUl9NQU5BR0VNRU5UXzEpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5MV9QT1dFUl9NQU5BR0VNRU5UXzEsIHJlZyB8IFdNODk5MV9WUkVGX0VOQXwKLQkJICAgICAgV004OTkxX1ZNSURfTU9ERV9NQVNLKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJICAgIFdNODk5MV9WUkVGX0VOQSB8IFdNODk5MV9WTUlEX01PREVfTUFTSywKKwkJCSAgICBXTTg5OTFfVlJFRl9FTkEgfCBXTTg5OTFfVk1JRF9NT0RFX01BU0spOwogCi0JcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yLCByZWcgfCBXTTg5OTFfT1BDTEtfRU5BKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTFfUE9XRVJfTUFOQUdFTUVOVF8yLAorCQkJICAgIFdNODk5MV9PUENMS19FTkEsIFdNODk5MV9PUENMS19FTkEpOwogCiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTkxX0RBQ19DVFJMLCAwKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTFfTEVGVF9PVVRQVVRfVk9MVU1FLCAweDUwIHwgKDE8PDgpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCmluZGV4IDZlODViODguLmVlYzhlMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwpAQCAtODQ3LDYgKzg0Nyw3IEBACiAJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJUT0NMSyIsIFdNODk5M19DTE9DS0lOR18xLCAxNCwgMCwgTlVMTCwgMCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJDTEtfRFNQIiwgV004OTkzX0NMT0NLSU5HXzMsIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiVk1JRCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCiAKIFNORF9TT0NfREFQTV9BREMoIkFEQ0wiLCBOVUxMLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCAxLCAwKSwKIFNORF9TT0NfREFQTV9BREMoIkFEQ1IiLCBOVUxMLCBXTTg5OTNfUE9XRVJfTUFOQUdFTUVOVF8yLCAwLCAwKSwKQEAgLTg4MCw2ICs4ODEsOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcm91dGVzW10gPSB7CisJeyAiTUlDQklBUzEiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJWTUlEIiB9LAorCiAJeyAiQURDTCIsIE5VTEwsICJDTEtfU1lTIiB9LAogCXsgIkFEQ0wiLCBOVUxMLCAiQ0xLX0RTUCIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIkNMS19TWVMiIH0sCkBAIC0xNDMzLDcgKzE0MzcsOCBAQAogCWludCByZXQsIGksIHZhbDsKIAogCXdtODk5My0+aHVic19kYXRhLmhwX3N0YXJ0dXBfbW9kZSA9IDE7Ci0Jd204OTkzLT5odWJzX2RhdGEuZGNzX2NvZGVzID0gLTI7CisJd204OTkzLT5odWJzX2RhdGEuZGNzX2NvZGVzX2wgPSAtMjsKKwl3bTg5OTMtPmh1YnNfZGF0YS5kY3NfY29kZXNfciA9IC0yOwogCXdtODk5My0+aHVic19kYXRhLnNlcmllc19zdGFydHVwID0gMTsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA4LCAxNiwgU05EX1NPQ19JMkMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQtdGFibGVzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYwppbmRleCBhODdhZGJkLi5kZjVhOGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC10YWJsZXMuYwpAQCAtMTA3Myw4ICsxMDczLDggQEAKIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY5ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MyAqLworCXsgMHgwMDZGLCAweDAwNkYgfSwgLyogUjEwNzIgIC0gQUlGMSBEQUMxIE5vaXNlIEdhdGUgKi8KKwl7IDB4MDA2RiwgMHgwMDZGIH0sIC8qIFIxMDczICAtIEFJRjEgREFDMiBOb2lzZSBHYXRlICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3NCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc2ICovCkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI2ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjggKi8KKwl7IDB4MDA2RiwgMHgwMDZGIH0sIC8qIFIxMzI4ICAtIEFJRjIgREFDIE5vaXNlIEdhdGUgKi8KIAl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI5ICovCiAJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzMCAqLwogCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzEgKi8KQEAgLTE2MzUsOCArMTYzNSw4IEBACiAJMHgwMDAwLCAgICAgLyogUjU4ICAgIC0gTUlDQklBUyAqLwogCTB4MDAwRCwgICAgIC8qIFI1OSAgICAtIExETyAxICovCiAJMHgwMDAzLCAgICAgLyogUjYwICAgIC0gTERPIDIgKi8KLQkweDAwMDAsICAgICAvKiBSNjEgKi8KLQkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMzksICAgICAvKiBSNjEgICAgLSBNSUNCSUFTMSAqLworCTB4MDAzOSwgICAgIC8qIFI2MiAgICAtIE1JQ0JJQVMyICovCiAJMHgwMDAwLCAgICAgLyogUjYzICovCiAJMHgwMDAwLCAgICAgLyogUjY0ICovCiAJMHgwMDAwLCAgICAgLyogUjY1ICovCkBAIC0yNjQ2LDggKzI2NDYsOCBAQAogCTB4MDAwMCwgICAgIC8qIFIxMDY5ICovCiAJMHgwMDAwLCAgICAgLyogUjEwNzAgKi8KIAkweDAwMDAsICAgICAvKiBSMTA3MSAqLwotCTB4MDAwMCwgICAgIC8qIFIxMDcyICovCi0JMHgwMDAwLCAgICAgLyogUjEwNzMgKi8KKwkweDAwNjgsICAgICAvKiBSMTA3MiAgLSBBSUYxIERBQzEgTm9pc2UgR2F0ZSAqLworCTB4MDA2OCwgICAgIC8qIFIxMDczICAtIEFJRjEgREFDMiBOb2lzZSBHYXRlICovCiAJMHgwMDAwLCAgICAgLyogUjEwNzQgKi8KIAkweDAwMDAsICAgICAvKiBSMTA3NSAqLwogCTB4MDAwMCwgICAgIC8qIFIxMDc2ICovCkBAIC0yOTAyLDcgKzI5MDIsNyBAQAogCTB4MDAwMCwgICAgIC8qIFIxMzI1ICovCiAJMHgwMDAwLCAgICAgLyogUjEzMjYgKi8KIAkweDAwMDAsICAgICAvKiBSMTMyNyAqLwotCTB4MDAwMCwgICAgIC8qIFIxMzI4ICovCisJMHgwMDY4LCAgICAgLyogUjEzMjggIC0gQUlGMiBEQUMgTm9pc2UgR2F0ZSAqLwogCTB4MDAwMCwgICAgIC8qIFIxMzI5ICovCiAJMHgwMDAwLCAgICAgLyogUjEzMzAgKi8KIAkweDAwMDAsICAgICAvKiBSMTMzMSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKaW5kZXggYjM5M2Y5Zi4uOWM5ODJlNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC01Niw3ICs1Niw3IEBACiBzdGF0aWMgaW50IHdtODk5NF9yZWFkYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gd204OTk0LT5jb250cm9sX2RhdGE7CisJc3RydWN0IHdtODk5NCAqY29udHJvbCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CiAKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgV004OTk0X0dQSU9fMToKQEAgLTEwNyw2ICsxMDcsNyBAQAogCWNhc2UgV004OTk0X0xET18yOgogCWNhc2UgV004OTU4X0RTUDJfRVhFQ0NPTlRST0w6CiAJY2FzZSBXTTg5NThfTUlDX0RFVEVDVF8zOgorCWNhc2UgV004OTk0X0RDX1NFUlZPXzRFOgogCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKQEAgLTIwNyw3ICsyMDgsNyBAQAogc3RhdGljIGludCBjb25maWd1cmVfY2xvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IG9sZCwgbmV3OworCWludCBjaGFuZ2UsIG5ldzsKIAogCS8qIEJyaW5nIHVwIHRoZSBBSUYgY2xvY2tzIGZpcnN0ICovCiAJY29uZmlndXJlX2FpZl9jbG9jayhjb2RlYywgMCk7CkBAIC0yMjgsMTQgKzIyOSwxMSBAQAogCWVsc2UKIAkJbmV3ID0gMDsKIAotCW9sZCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk0X0NMT0NLSU5HXzEpICYgV004OTk0X1NZU0NMS19TUkM7Ci0KLQkvKiBJZiB0aGVyZSdzIG5vIGNoYW5nZSB0aGVuIHdlJ3JlIGRvbmUuICovCi0JaWYgKG9sZCA9PSBuZXcpCisJY2hhbmdlID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0NMT0NLSU5HXzEsCisJCQkJICAgICBXTTg5OTRfU1lTQ0xLX1NSQywgbmV3KTsKKwlpZiAoIWNoYW5nZSkKIAkJcmV0dXJuIDA7CiAKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQ0xPQ0tJTkdfMSwgV004OTk0X1NZU0NMS19TUkMsIG5ldyk7Ci0KIAlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOwogCiAJcmV0dXJuIDA7CkBAIC0yODEsNiArMjc5LDggQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzdF90bHYsIC0zNjAwLCAzMDAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHdtODk5NF8zZF90bHYsIC0xNjAwLCAxODMsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGVxX3RsdiwgLTEyMDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobmdfdGx2LCAtMTAyMDAsIDYwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWl4aW5fYm9vc3RfdGx2LCAwLCA5MDAsIDApOwogCiAjZGVmaW5lIFdNODk5NF9EUkNfU1dJVENIKHhuYW1lLCByZWcsIHNoaWZ0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC02NjAsOCArNjYwLDUyIEBACiAJICAgICAgIGVxX3RsdiksCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqd204OTU4X25nX3RleHRbXSA9IHsKKwkiMzBtcyIsICIxMjVtcyIsICIyNTBtcyIsICI1MDBtcyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYxZGFjMV9uZ19ob2xkID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTU4X0FJRjFfREFDMV9OT0lTRV9HQVRFLAorCQkJV004OTU4X0FJRjFEQUMxX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYxZGFjMl9uZ19ob2xkID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFLAorCQkJV004OTU4X0FJRjFEQUMyX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYyZGFjX25nX2hvbGQgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5NThfQUlGMl9EQUNfTk9JU0VfR0FURSwKKwkJCVdNODk1OF9BSUYyREFDX05HX1RIUl9TSElGVCwgNCwgd204OTU4X25nX3RleHQpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTU4X3NuZF9jb250cm9sc1tdID0gewogU09DX1NJTkdMRV9UTFYoIkFJRjMgQm9vc3QgVm9sdW1lIiwgV004OTU4X0FJRjNfQ09OVFJPTF8yLCAxMCwgMywgMCwgYWlmX3RsdiksCisKK1NPQ19TSU5HTEUoIkFJRjFEQUMxIE5vaXNlIEdhdGUgU3dpdGNoIiwgV004OTU4X0FJRjFfREFDMV9OT0lTRV9HQVRFLAorCSAgIFdNODk1OF9BSUYxREFDMV9OR19FTkFfU0hJRlQsIDEsIDApLAorU09DX0VOVU0oIkFJRjFEQUMxIE5vaXNlIEdhdGUgSG9sZCBUaW1lIiwgd204OTU4X2FpZjFkYWMxX25nX2hvbGQpLAorU09DX1NJTkdMRV9UTFYoIkFJRjFEQUMxIE5vaXNlIEdhdGUgVGhyZXNob2xkIFZvbHVtZSIsCisJICAgICAgIFdNODk1OF9BSUYxX0RBQzFfTk9JU0VfR0FURSwgV004OTU4X0FJRjFEQUMxX05HX1RIUl9TSElGVCwKKwkgICAgICAgNywgMSwgbmdfdGx2KSwKKworU09DX1NJTkdMRSgiQUlGMURBQzIgTm9pc2UgR2F0ZSBTd2l0Y2giLCBXTTg5NThfQUlGMV9EQUMyX05PSVNFX0dBVEUsCisJICAgV004OTU4X0FJRjFEQUMyX05HX0VOQV9TSElGVCwgMSwgMCksCitTT0NfRU5VTSgiQUlGMURBQzIgTm9pc2UgR2F0ZSBIb2xkIFRpbWUiLCB3bTg5NThfYWlmMWRhYzJfbmdfaG9sZCksCitTT0NfU0lOR0xFX1RMVigiQUlGMURBQzIgTm9pc2UgR2F0ZSBUaHJlc2hvbGQgVm9sdW1lIiwKKwkgICAgICAgV004OTU4X0FJRjFfREFDMl9OT0lTRV9HQVRFLCBXTTg5NThfQUlGMURBQzJfTkdfVEhSX1NISUZULAorCSAgICAgICA3LCAxLCBuZ190bHYpLAorCitTT0NfU0lOR0xFKCJBSUYyREFDIE5vaXNlIEdhdGUgU3dpdGNoIiwgV004OTU4X0FJRjJfREFDX05PSVNFX0dBVEUsCisJICAgV004OTU4X0FJRjJEQUNfTkdfRU5BX1NISUZULCAxLCAwKSwKK1NPQ19FTlVNKCJBSUYyREFDIE5vaXNlIEdhdGUgSG9sZCBUaW1lIiwgd204OTU4X2FpZjJkYWNfbmdfaG9sZCksCitTT0NfU0lOR0xFX1RMVigiQUlGMkRBQyBOb2lzZSBHYXRlIFRocmVzaG9sZCBWb2x1bWUiLAorCSAgICAgICBXTTg5NThfQUlGMl9EQUNfTk9JU0VfR0FURSwgV004OTU4X0FJRjJEQUNfTkdfVEhSX1NISUZULAorCSAgICAgICA3LCAxLCBuZ190bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtMTgxMV9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEVfVExWKCJNSVhJTkwgSU4xTFAgQm9vc3QgVm9sdW1lIiwgV004OTk0X0lOUFVUX01JWEVSXzEsIDcsIDEsIDAsCisJICAgICAgIG1peGluX2Jvb3N0X3RsdiksCitTT0NfU0lOR0xFX1RMVigiTUlYSU5MIElOMVJQIEJvb3N0IFZvbHVtZSIsIFdNODk5NF9JTlBVVF9NSVhFUl8xLCA4LCAxLCAwLAorCSAgICAgICBtaXhpbl9ib29zdF90bHYpLAogfTsKIAogc3RhdGljIGludCBjbGtfc3lzX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LApAQCAtNjgxLDYgKzcyNSw5NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB2bWlkX3JlZmVyZW5jZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk5NC0+dm1pZF9yZWZjb3VudCsrOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUmVmZXJlbmNpbmcgVk1JRCwgcmVmY291bnQgaXMgbm93ICVkXG4iLAorCQl3bTg5OTQtPnZtaWRfcmVmY291bnQpOworCisJaWYgKHdtODk5NC0+dm1pZF9yZWZjb3VudCA9PSAxKSB7CisJCS8qIFN0YXJ0dXAgYmlhcywgVk1JRCByYW1wICYgYnVmZmVyICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCisJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKKwkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKKwkJCQkgICAgKDB4MTEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOworCisJCS8qIE1haW4gYmlhcyBlbmFibGUsIFZNSUQ9Mng0MGsgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssCisJCQkJICAgIFdNODk5NF9CSUFTX0VOQSB8IDB4Mik7CisKKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZtaWRfZGVyZWZlcmVuY2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl3bTg5OTQtPnZtaWRfcmVmY291bnQtLTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIkRlcmVmZXJlbmNpbmcgVk1JRCwgcmVmY291bnQgaXMgbm93ICVkXG4iLAorCQl3bTg5OTQtPnZtaWRfcmVmY291bnQpOworCisJaWYgKHdtODk5NC0+dm1pZF9yZWZjb3VudCA9PSAwKSB7CisJCS8qIFN3aXRjaCBvdmVyIHRvIHN0YXJ0dXAgYmlhc2VzICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCisJCQkJICAgIFdNODk5NF9CSUFTX1NSQyB8CisJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKKwkJCQkgICAgV004OTk0X0JJQVNfU1JDIHwKKwkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKKwkJCQkgICAgKDEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOworCisJCS8qIERpc2FibGUgbWFpbiBiaWFzZXMgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKKwkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDApOworCisJCS8qIERpc2NoYXJnZSBsaW5lICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzEsCisJCQkJICAgIFdNODk5NF9MSU5FT1VUMV9ESVNDSCB8CisJCQkJICAgIFdNODk5NF9MSU5FT1VUMl9ESVNDSCwKKwkJCQkgICAgV004OTk0X0xJTkVPVVQxX0RJU0NIIHwKKwkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKKworCQltc2xlZXAoNSk7CisKKwkJLyogU3dpdGNoIG9mZiBzdGFydHVwIGJpYXNlcyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQU5USVBPUF8yLAorCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAorCQkJCSAgICBXTTg5OTRfU1RBUlRVUF9CSUFTX0VOQSB8CisJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAorCQkJCSAgICBXTTg5OTRfVk1JRF9SQU1QX01BU0ssIDApOworCX0KK30KKworc3RhdGljIGludCB2bWlkX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXZtaWRfcmVmZXJlbmNlKGNvZGVjKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJdm1pZF9kZXJlZmVyZW5jZShjb2RlYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCB3bTg5OTRfdXBkYXRlX2NsYXNzX3coc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CkBAIC0xMjA4LDYgKzEzNDMsOCBAQAogCiBTTkRfU09DX0RBUE1fU1VQUExZX1MoIk1JQ0JJQVMgU3VwcGx5IiwgMSwgU05EX1NPQ19OT1BNLCAwLCAwLCBtaWNiaWFzX2V2LAogCQkgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSksCitTTkRfU09DX0RBUE1fU1VQUExZKCJWTUlEIiwgU05EX1NPQ19OT1BNLCAwLCAwLCB2bWlkX2V2ZW50LAorCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCiBTTkRfU09DX0RBUE1fU1VQUExZKCJDTEtfU1lTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBjbGtfc3lzX2V2ZW50LAogCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLApAQCAtMTI4Miw3ICsxNDE5LDcgQEAKIFNORF9TT0NfREFQTV9NVVgoIkFJRjJBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWlmMmFkY19tdXgpLAogCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYzREFDREFUIiwgIkFJRjMgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM0FEQ0RBVCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjNBRENEQVQiLCAiQUlGMyBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKIAogU05EX1NPQ19EQVBNX1NVUFBMWSgiVE9DTEsiLCBXTTg5OTRfQ0xPQ0tJTkdfMSwgNCwgMCwgTlVMTCwgMCksCiAKQEAgLTE1MjUsNiArMTY2Miw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5OTRfaW50ZXJjb25bXSA9IHsKIAl7ICJBSUYyREFDTCIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKIAl7ICJBSUYyREFDUiIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJWTUlEIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIlZNSUQiIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5NThfaW50ZXJjb25bXSA9IHsKQEAgLTE2MjksMTAgKzE3NjgsMTIgQEAKIAkJCSAgdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCWludCByZWdfb2Zmc2V0LCByZXQ7CiAJc3RydWN0IGZsbF9kaXYgZmxsOwogCXUxNiByZWcsIGFpZjEsIGFpZjI7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWJvb2wgd2FzX2VuYWJsZWQ7CiAKIAlhaWYxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTRfQUlGMV9DTE9DS0lOR18xKQogCQkmIFdNODk5NF9BSUYxQ0xLX0VOQTsKQEAgLTE2NTMsNiArMTc5NCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk0X0ZMTDFfQ09OVFJPTF8xICsgcmVnX29mZnNldCk7CisJd2FzX2VuYWJsZWQgPSByZWcgJiBXTTg5OTRfRkxMMV9FTkE7CisKIAlzd2l0Y2ggKHNyYykgewogCWNhc2UgMDoKIAkJLyogQWxsb3cgbm8gc291cmNlIHNwZWNpZmljYXRpb24gd2hlbiBzdG9wcGluZyAqLwpAQCAtMTcxOSw2ICsxODYzLDIxIEBACiAKIAkvKiBFbmFibGUgKHdpdGggZnJhY3Rpb25hbCBtb2RlIGlmIHJlcXVpcmVkKSAqLwogCWlmIChmcmVxX291dCkgeworCQkvKiBFbmFibGUgVk1JRCBpZiB3ZSBuZWVkIGl0ICovCisJCWlmICghd2FzX2VuYWJsZWQpIHsKKwkJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQkJY2FzZSBXTTg5OTQ6CisJCQkJdm1pZF9yZWZlcmVuY2UoY29kZWMpOworCQkJCWJyZWFrOworCQkJY2FzZSBXTTg5NTg6CisJCQkJaWYgKHdtODk5NC0+cmV2aXNpb24gPCAxKQorCQkJCQl2bWlkX3JlZmVyZW5jZShjb2RlYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisKIAkJaWYgKGZsbC5rKQogCQkJcmVnID0gV004OTk0X0ZMTDFfRU5BIHwgV004OTk0X0ZMTDFfRlJBQzsKIAkJZWxzZQpAQCAtMTczNiw2ICsxODk1LDIwIEBACiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoNSk7CiAJCX0KKwl9IGVsc2UgeworCQlpZiAod2FzX2VuYWJsZWQpIHsKKwkJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQkJY2FzZSBXTTg5OTQ6CisJCQkJdm1pZF9kZXJlZmVyZW5jZShjb2RlYyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdNODk1ODoKKwkJCQlpZiAod204OTk0LT5yZXZpc2lvbiA8IDEpCisJCQkJCXZtaWRfZGVyZWZlcmVuY2UoY29kZWMpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KIAogCXdtODk5NC0+ZmxsW2lkXS5pbiA9IGZyZXFfaW47CkBAIC0xODUyLDkgKzIwMjUsNiBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6Ci0JCS8qIFZNSUQ9Mng0MGsgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfMSwKLQkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDB4Mik7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKQEAgLTE4ODgsNiArMjA1OCwxNSBAQAogCQkJCQkJCSAgICBXTTg5NThfQ1BfRElTQ0gpOwogCQkJCX0KIAkJCQlicmVhazsKKworCQkJY2FzZSBXTTE4MTE6CisJCQkJaWYgKHdtODk5NC0+cmV2aXNpb24gPCAyKSB7CisJCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTAyLCAweDMpOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDVkLCAweDdlKTsKKwkJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHg1ZSwgMHgwKTsKKwkJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHgxMDIsIDB4MCk7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBEaXNjaGFyZ2UgTElORU9VVDEgJiAyICovCkBAIC0xODk2LDY1ICsyMDc1LDEzIEBACiAJCQkJCSAgICBXTTg5OTRfTElORU9VVDJfRElTQ0gsCiAJCQkJCSAgICBXTTg5OTRfTElORU9VVDFfRElTQ0ggfAogCQkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKLQotCQkJLyogU3RhcnR1cCBiaWFzLCBWTUlEIHJhbXAgJiBidWZmZXIgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCi0JCQkJCSAgICBXTTg5OTRfU1RBUlRVUF9CSUFTX0VOQSB8Ci0JCQkJCSAgICBXTTg5OTRfVk1JRF9CVUZfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX1JBTVBfTUFTSywKLQkJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAotCQkJCQkgICAgKDB4MTEgPDwgV004OTk0X1ZNSURfUkFNUF9TSElGVCkpOwotCi0JCQkvKiBNYWluIGJpYXMgZW5hYmxlLCBWTUlEPTJ4NDBrICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF8xLAotCQkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX1NFTF9NQVNLLAotCQkJCQkgICAgV004OTk0X0JJQVNfRU5BIHwgMHgyKTsKLQotCQkJbXNsZWVwKDIwKTsKIAkJfQogCi0JCS8qIFZNSUQ9Mng1MDBrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJICAgIFdNODk5NF9WTUlEX1NFTF9NQVNLLCAweDQpOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewotCQkJLyogU3dpdGNoIG92ZXIgdG8gc3RhcnR1cCBiaWFzZXMgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9BTlRJUE9QXzIsCi0JCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAotCQkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8Ci0JCQkJCSAgICBXTTg5OTRfVk1JRF9SQU1QX01BU0ssCi0JCQkJCSAgICBXTTg5OTRfQklBU19TUkMgfAotCQkJCQkgICAgV004OTk0X1NUQVJUVVBfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfQlVGX0VOQSB8Ci0JCQkJCSAgICAoMSA8PCBXTTg5OTRfVk1JRF9SQU1QX1NISUZUKSk7Ci0KLQkJCS8qIERpc2FibGUgbWFpbiBiaWFzZXMgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJCSAgICBXTTg5OTRfQklBU19FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfU0VMX01BU0ssIDApOwotCi0JCQkvKiBEaXNjaGFyZ2UgbGluZSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0FOVElQT1BfMSwKLQkJCQkJICAgIFdNODk5NF9MSU5FT1VUMV9ESVNDSCB8Ci0JCQkJCSAgICBXTTg5OTRfTElORU9VVDJfRElTQ0gsCi0JCQkJCSAgICBXTTg5OTRfTElORU9VVDFfRElTQ0ggfAotCQkJCQkgICAgV004OTk0X0xJTkVPVVQyX0RJU0NIKTsKLQotCQkJbXNsZWVwKDUpOwotCi0JCQkvKiBTd2l0Y2ggb2ZmIHN0YXJ0dXAgYmlhc2VzICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQU5USVBPUF8yLAotCQkJCQkgICAgV004OTk0X0JJQVNfU1JDIHwKLQkJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKLQkJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAotCQkJCQkgICAgV004OTk0X1ZNSURfUkFNUF9NQVNLLCAwKTsKLQogCQkJd204OTk0LT5jdXJfZncgPSBOVUxMOwogCiAJCQlwbV9ydW50aW1lX3B1dChjb2RlYy0+ZGV2KTsKQEAgLTIwNTUsMTAgKzIxODIsMTggQEAKIAogCS8qIFRoZSBBSUYyIGZvcm1hdCBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIG1pcnJvcmVkIHRvIEFJRjMKIAkgKiBvbiBXTTg5NTggaWYgaXQncyBpbiB1c2Ugc28ganVzdCBkbyBpdCBhbGwgdGhlIHRpbWUuICovCi0JaWYgKGNvbnRyb2wtPnR5cGUgPT0gV004OTU4ICYmIGRhaS0+aWQgPT0gMikKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X0FJRjNfQ09OVFJPTF8xLAotCQkJCSAgICBXTTg5OTRfQUlGMV9MUkNMS19JTlYgfAotCQkJCSAgICBXTTg5NThfQUlGM19GTVRfTUFTSywgYWlmMSk7CisJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJY2FzZSBXTTE4MTE6CisJY2FzZSBXTTg5NTg6CisJCWlmIChkYWktPmlkID09IDIpCisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfQUlGM19DT05UUk9MXzEsCisJCQkJCSAgICBXTTg5OTRfQUlGMV9MUkNMS19JTlYgfAorCQkJCQkgICAgV004OTU4X0FJRjNfRk1UX01BU0ssIGFpZjEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFpZjFfcmVnLAogCQkJICAgIFdNODk5NF9BSUYxX0JDTEtfSU5WIHwgV004OTk0X0FJRjFfTFJDTEtfSU5WIHwKQEAgLTIxMDAsNyArMjIzNSw2IEBACiAJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCBhaWYxX3JlZzsKIAlpbnQgYWlmMl9yZWc7CkBAIC0yMTQzLDE0ICsyMjc3LDYgQEAKIAkJCWRldl9kYmcoY29kZWMtPmRldiwgIkFJRjIgdXNpbmcgc3BsaXQgTFJDTEtcbiIpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJc3dpdGNoIChjb250cm9sLT50eXBlKSB7Ci0JCWNhc2UgV004OTU4OgotCQkJYWlmMV9yZWcgPSBXTTg5NThfQUlGM19DT05UUk9MXzE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAwOwotCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjI3MSw2ICsyMzk3LDcgQEAKIAlzd2l0Y2ggKGRhaS0+aWQpIHsKIAljYXNlIDM6CiAJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQljYXNlIFdNMTgxMToKIAkJY2FzZSBXTTg5NTg6CiAJCQlhaWYxX3JlZyA9IFdNODk1OF9BSUYzX0NPTlRST0xfMTsKIAkJCWJyZWFrOwpAQCAtMjMxMSw3ICsyNDM4LDcgQEAKIAkJcmF0ZV9yZWcgPSBXTTg5OTRfQUlGMV9SQVRFOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCXJhdGVfcmVnID0gV004OTk0X0FJRjFfUkFURTsKKwkJcmF0ZV9yZWcgPSBXTTg5OTRfQUlGMl9SQVRFOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTIzODQsNiArMjUxMSwyMSBAQAogCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIG1hc2ssIHZhbCk7CiB9CiAKK3N0YXRpYyBpbnQgd204OTk0X2FpZjJfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKworCS8qIERpc2FibGUgdGhlIHB1bGxzIG9uIHRoZSBBSUYgaWYgd2UncmUgdXNpbmcgaXQgdG8gc2F2ZSBwb3dlci4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT18zLAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT180LAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfR1BJT181LAorCQkJICAgIFdNODk5NF9HUE5fUFUgfCBXTTg5OTRfR1BOX1BELCAwKTsKKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFdNODk5NF9SQVRFUyBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCiAKICNkZWZpbmUgV004OTk0X0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHxcCkBAIC0yNDUxLDYgKzI1OTMsNyBAQAogCQkJLnJhdGVzID0gV004OTk0X1JBVEVTLAogCQkJLmZvcm1hdHMgPSBXTTg5OTRfRk9STUFUUywKIAkJfSwKKwkJLnByb2JlID0gd204OTk0X2FpZjJfcHJvYmUsCiAJCS5vcHMgPSAmd204OTk0X2FpZjJfZGFpX29wcywKIAl9LAogCXsKQEAgLTI0ODUsNiArMjYyOCw3IEBACiAJY2FzZSBXTTg5OTQ6CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NF9NSUNCSUFTLCBXTTg5OTRfTUlDRF9FTkEsIDApOwogCQlicmVhazsKKwljYXNlIFdNMTgxMToKIAljYXNlIFdNODk1ODoKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X01JQ19ERVRFQ1RfMSwKIAkJCQkgICAgV004OTU4X01JQ0RfRU5BLCAwKTsKQEAgLTI1NTMsNiArMjY5Nyw3IEBACiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfTUlDQklBUywKIAkJCQkJICAgIFdNODk5NF9NSUNEX0VOQSwgV004OTk0X01JQ0RfRU5BKTsKIAkJYnJlYWs7CisJY2FzZSBXTTE4MTE6CiAJY2FzZSBXTTg5NTg6CiAJCWlmICh3bTg5OTQtPmphY2tfY2IpCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfTUlDX0RFVEVDVF8xLApAQCAtMjg1MSw4ICsyOTk2LDEzIEBACiAJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAotCWlmIChjb250cm9sLT50eXBlICE9IFdNODk1OCkKKwlzd2l0Y2ggKGNvbnRyb2wtPnR5cGUpIHsKKwljYXNlIFdNMTgxMToKKwljYXNlIFdNODk1ODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJaWYgKGphY2spIHsKIAkJaWYgKCFjYikgewpAQCAtMjg4MCwxOSArMzAzMCwzNCBAQAogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTg5OTQtPmNvZGVjOwotCWludCByZWc7CisJaW50IHJlZywgY291bnQ7CiAKLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk1OF9NSUNfREVURUNUXzMpOwotCWlmIChyZWcgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIG1pYyBkZXRlY3Qgc3RhdHVzOiAlZFxuIiwKLQkJCXJlZyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9CisJLyogV2UgbWF5IG9jY2FzaW9uYWxseSByZWFkIGEgZGV0ZWN0aW9uIHdpdGhvdXQgYW4gaW1wZWRlbmNlCisJICogcmFuZ2UgYmVpbmcgcHJvdmlkZWQgLSBpZiB0aGF0IGhhcHBlbnMgbG9vcCBhZ2Fpbi4KKwkgKi8KKwljb3VudCA9IDEwOworCWRvIHsKKwkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NThfTUlDX0RFVEVDVF8zKTsKKwkJaWYgKHJlZyA8IDApIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgbWljIGRldGVjdCBzdGF0dXM6ICVkXG4iLAorCQkJCXJlZyk7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KIAotCWlmICghKHJlZyAmIFdNODk1OF9NSUNEX1ZBTElEKSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgZGV0ZWN0IGRhdGEgbm90IHZhbGlkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQorCQlpZiAoIShyZWcgJiBXTTg5NThfTUlDRF9WQUxJRCkpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pYyBkZXRlY3QgZGF0YSBub3QgdmFsaWRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIShyZWcgJiBXTTg5NThfTUlDRF9TVFMpIHx8IChyZWcgJiBXTTg5NThfTUlDRF9MVkxfTUFTSykpCisJCQlicmVhazsKKworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAoY291bnQtLSk7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJZGV2X3dhcm4oY29kZWMtPmRldiwgIk5vIGltcGVkZW5jZSByYW5nZSByZXBvcnRlZCBmb3IgamFja1xuIik7CiAKICNpZm5kZWYgQ09ORklHX1NORF9TT0NfV004OTk0X01PRFVMRQogCXRyYWNlX3NuZF9zb2NfamFja19pcnEoZGV2X25hbWUoY29kZWMtPmRldikpOwpAQCAtMjkxNiw2ICszMDgxLDI0IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204OTk0X3RlbXBfd2FybihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaGVybWFsIHdhcm5pbmdcbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204OTk0X3RlbXBfc2h1dChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhdGE7CisKKwlkZXZfY3JpdChjb2RlYy0+ZGV2LCAiVGhlcm1hbCBzaHV0ZG93blxuIik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIHN0YXRpYyBpbnQgd204OTk0X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTk0ICpjb250cm9sOwpAQCAtMjk3MiwxMyArMzE1NSwxNCBAQAogCQlzd2l0Y2ggKHdtODk5NC0+cmV2aXNpb24pIHsKIAkJY2FzZSAyOgogCQljYXNlIDM6Ci0JCQl3bTg5OTQtPmh1YnMuZGNzX2NvZGVzID0gLTU7CisJCQl3bTg5OTQtPmh1YnMuZGNzX2NvZGVzX2wgPSAtNTsKKwkJCXdtODk5NC0+aHVicy5kY3NfY29kZXNfciA9IC01OwogCQkJd204OTk0LT5odWJzLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CiAJCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOwogCQkJd204OTk0LT5odWJzLnNlcmllc19zdGFydHVwID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMTsKKwkJCXdtODk5NC0+aHVicy5kY3NfcmVhZGJhY2tfbW9kZSA9IDI7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTI5ODcsMTIgKzMxNzEsMzQgQEAKIAkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMTsKIAkJYnJlYWs7CiAKKwljYXNlIFdNMTgxMToKKwkJd204OTk0LT5odWJzLmRjc19yZWFkYmFja19tb2RlID0gMjsKKwkJd204OTk0LT5odWJzLm5vX3Nlcmllc191cGRhdGUgPSAxOworCisJCXN3aXRjaCAod204OTk0LT5yZXZpc2lvbikgeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJCXdtODk5NC0+aHVicy5kY3NfY29kZXNfbCA9IC05OworCQkJd204OTk0LT5odWJzLmRjc19jb2Rlc19yID0gLTU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0FOQUxPR1VFX0hQXzEsCisJCQkJICAgIFdNMTgxMV9IUE9VVDFfQVRUTiwgV00xODExX0hQT1VUMV9BVFROKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAl3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9GSUZPU19FUlIsCiAJCQkgICB3bTg5OTRfZmlmb19lcnJvciwgIkZJRk8gZXJyb3IiLCBjb2RlYyk7CisJd204OTk0X3JlcXVlc3RfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9XQVJOLAorCQkJICAgd204OTk0X3RlbXBfd2FybiwgIlRoZXJtYWwgd2FybmluZyIsIGNvZGVjKTsKKwl3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9URU1QX1NIVVQsCisJCQkgICB3bTg5OTRfdGVtcF9zaHV0LCAiVGhlcm1hbCBzaHV0ZG93biIsIGNvZGVjKTsKIAogCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0RDU19ET05FLAogCQkJCSB3bV9odWJzX2Rjc19kb25lLCAiREMgc2Vydm8gZG9uZSIsCkBAIC0zMDQzLDYgKzMyNDksNyBAQAogCQlicmVhazsKIAogCWNhc2UgV004OTU4OgorCWNhc2UgV00xODExOgogCQlpZiAod204OTk0LT5taWNkZXRfaXJxKSB7CiAJCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bTg5OTQtPm1pY2RldF9pcnEsIE5VTEwsCiAJCQkJCQkgICB3bTg5NThfbWljX2lycSwKQEAgLTMyMDUsNiArMzQxMiwxOSBAQAogCQkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9kYWNfd2lkZ2V0cykpOwogCQl9CiAJCWJyZWFrOworCisJY2FzZSBXTTE4MTE6CisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NThfc25kX2NvbnRyb2xzLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTg5NThfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTU4X2RhcG1fd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk1OF9kYXBtX3dpZGdldHMpKTsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5OTRfbGF0ZWNsa193aWRnZXRzLAorCQkJCQkgIEFSUkFZX1NJWkUod204OTk0X2xhdGVjbGtfd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk5NF9hZGNfd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9hZGNfd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk5NF9kYWNfd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9kYWNfd2lkZ2V0cykpOworCQlicmVhazsKIAl9CiAJCQogCkBAIC0zMjQxLDYgKzM0NjEsMTIgQEAKIAogCQl3bTg5NThfZHNwMl9pbml0KGNvZGVjKTsKIAkJYnJlYWs7CisJY2FzZSBXTTE4MTE6CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk5NF9sYXRlY2xrX2ludGVyY29uLAorCQkJCQlBUlJBWV9TSVpFKHdtODk5NF9sYXRlY2xrX2ludGVyY29uKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk1OF9pbnRlcmNvbiwKKwkJCQkJQVJSQVlfU0laRSh3bTg5NThfaW50ZXJjb24pKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMjU3LDYgKzM0ODMsOCBAQAogCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0RDU19ET05FLAogCQkJJndtODk5NC0+aHVicyk7CiAJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfRklGT1NfRVJSLCBjb2RlYyk7CisJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9TSFVULCBjb2RlYyk7CisJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfVEVNUF9XQVJOLCBjb2RlYyk7CiBlcnI6CiAJa2ZyZWUod204OTk0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMzI3OSw2ICszNTA3LDggQEAKIAl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9EQ1NfRE9ORSwKIAkJCSZ3bTg5OTQtPmh1YnMpOwogCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX0ZJRk9TX0VSUiwgY29kZWMpOworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX1RFTVBfU0hVVCwgY29kZWMpOworCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX1RFTVBfV0FSTiwgY29kZWMpOwogCiAJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CiAJY2FzZSBXTTg5OTQ6CkBAIC0zMjkyLDYgKzM1MjIsNyBAQAogCQkJCXdtODk5NCk7CiAJCWJyZWFrOwogCisJY2FzZSBXTTE4MTE6CiAJY2FzZSBXTTg5NTg6CiAJCWlmICh3bTg5OTQtPm1pY2RldF9pcnEpCiAJCQlmcmVlX2lycSh3bTg5OTQtPm1pY2RldF9pcnEsIHdtODk5NCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuaAppbmRleCAxYWIyMjY2Li5mNGYxMzU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmgKQEAgLTgzLDYgKzgzLDggQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBmbGxfbG9ja2VkWzJdOwogCWJvb2wgZmxsX2xvY2tlZF9pcnE7CiAKKwlpbnQgdm1pZF9yZWZjb3VudDsKKwogCWludCBkYWNfcmF0ZXNbMl07CiAJaW50IGxyY2xrX3NoYXJlZFsyXTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMKaW5kZXggNWFkODczZi4uNzhlZWIyMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC00ODUsNyArNDg1LDcgQEAKIHN0YXRpYyBpbnQgY29uZmlndXJlX2Nsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKLQlpbnQgb2xkLCBuZXc7CisJaW50IGNoYW5nZSwgbmV3OwogCiAJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKQEAgLTUwOSwxNSArNTA5LDExIEBACiAJZWxzZQogCQluZXcgPSAwOwogCi0Jb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSkgJiBXTTg5OTVfU1lTQ0xLX1NSQzsKLQotCS8qIElmIHRoZXJlJ3Mgbm8gY2hhbmdlIHRoZW4gd2UncmUgZG9uZS4gKi8KLQlpZiAob2xkID09IG5ldykKKwljaGFuZ2UgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSwKKwkJCQkgICAgIFdNODk5NV9TWVNDTEtfU1JDX01BU0ssIG5ldyk7CisJaWYgKCFjaGFuZ2UpCiAJCXJldHVybiAwOwogCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0NMT0NLSU5HXzEsCi0JCQkgICAgV004OTk1X1NZU0NMS19TUkNfTUFTSywgbmV3KTsKLQogCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1NzMsMTEgKzE1NjksMTYgQEAKIHN0YXRpYyBpbnQgd204OTk1X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk5NV9wcml2ICp3bTg5OTU7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgaTsKIAotCWkyYyA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKIAl3bTg5OTUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl3bTg5OTVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyk7ICsraSkKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIod204OTk1LT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJICAgICAgJndtODk5NS0+ZGlzYWJsZV9uYltpXSk7CisKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204OTk1LT5zdXBwbGllcyksIHdtODk5NS0+c3VwcGxpZXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQyLDYgKzE2NDMsNyBAQAogCiAJaWYgKHJldCAhPSAweDg5OTUpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBkZXZpY2UgSUQ6ICUjeFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfcmVnX2VuYWJsZTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCmluZGV4IDBjZGI5ZDEuLjY0NWM5ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwpAQCAtNDEsMTIgKzQxLDExIEBACiAjZGVmaW5lIEhQT1VUMkwgNAogI2RlZmluZSBIUE9VVDJSIDgKIAotI2RlZmluZSBXTTg5OTZfTlVNX1NVUFBMSUVTIDQKKyNkZWZpbmUgV004OTk2X05VTV9TVVBQTElFUyAzCiBzdGF0aWMgY29uc3QgY2hhciAqd204OTk2X3N1cHBseV9uYW1lc1tXTTg5OTZfTlVNX1NVUFBMSUVTXSA9IHsKIAkiREJWREQiLAogCSJBVkREMSIsCiAJIkFWREQyIiwKLQkiQ1BWREQiLAogfTsKIAogc3RydWN0IHdtODk5Nl9wcml2IHsKQEAgLTcxLDYgKzcwLDggQEAKIAogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1dNODk5Nl9OVU1fU1VQUExJRVNdOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBkaXNhYmxlX25iW1dNODk5Nl9OVU1fU1VQUExJRVNdOworCXN0cnVjdCByZWd1bGF0b3IgKmNwdmRkOworCWludCBiZ19lbmE7CiAKIAlzdHJ1Y3Qgd204OTk2X3BkYXRhIHBkYXRhOwogCkBAIC0xMTIsNyArMTEzLDYgQEAKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMCkKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMSkKIFdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMikKLVdNODk5Nl9SRUdVTEFUT1JfRVZFTlQoMykKIAogc3RhdGljIGNvbnN0IHUxNiB3bTg5OTZfcmVnW1dNODk5Nl9NQVhfUkVHSVNURVJdID0gewogCVtXTTg5OTZfU09GVFdBUkVfUkVTRVRdID0gMHg4OTk2LApAQCAtNDE0LDYgKzQxNCw3IEBACiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X3RsdiwgLTkwMCwgNzUsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHNwa190bHYsIC05MDAsIDE1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRSh0aHJlZWRzdGVyZW9fdGx2LCAtMTYwMCwgMTgzLCAxKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNpZGV0b25lX2hwZl90ZXh0W10gPSB7CiAJIjIuOWtIeiIsICIxLjVrSHoiLCAiNzM1SHoiLCAiNDAzSHoiLCAiMTk2SHoiLCAiOThIeiIsICI0OUh6IgpAQCAtNjA4LDYgKzYwOSwxNCBAQAogU09DX1NJTkdMRSgiREFDIFNvZnQgTXV0ZSBTd2l0Y2giLCBXTTg5OTZfREFDX1NPRlRNVVRFLCAxLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRBQyBTbG93IFNvZnQgTXV0ZSBTd2l0Y2giLCBXTTg5OTZfREFDX1NPRlRNVVRFLCAwLCAxLCAwKSwKIAorU09DX1NJTkdMRSgiRFNQMSAzRCBTdGVyZW8gU3dpdGNoIiwgV004OTk2X0RTUDFfUlhfRklMVEVSU18yLCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRTUDIgM0QgU3RlcmVvIFN3aXRjaCIsIFdNODk5Nl9EU1AyX1JYX0ZJTFRFUlNfMiwgOCwgMSwgMCksCisKK1NPQ19TSU5HTEVfVExWKCJEU1AxIDNEIFN0ZXJlbyBWb2x1bWUiLCBXTTg5OTZfRFNQMV9SWF9GSUxURVJTXzIsIDEwLCAxNSwKKwkJMCwgdGhyZWVkc3RlcmVvX3RsdiksCitTT0NfU0lOR0xFX1RMVigiRFNQMiAzRCBTdGVyZW8gVm9sdW1lIiwgV004OTk2X0RTUDJfUlhfRklMVEVSU18yLCAxMCwgMTUsCisJCTAsIHRocmVlZHN0ZXJlb190bHYpLAorCiBTT0NfRE9VQkxFX1RMVigiRGlnaXRhbCBPdXRwdXQgMSBWb2x1bWUiLCBXTTg5OTZfREFDMV9IUE9VVDFfVk9MVU1FLCAwLCA0LAogCSAgICAgICA4LCAwLCBvdXRfZGlnaXRhbF90bHYpLAogU09DX0RPVUJMRV9UTFYoIkRpZ2l0YWwgT3V0cHV0IDIgVm9sdW1lIiwgV004OTk2X0RBQzJfSFBPVVQyX1ZPTFVNRSwgMCwgNCwKQEAgLTYzMiw2ICs2NDEsMTQgQEAKIAogU09DX1NJTkdMRSgiRFNQMSBFUSBTd2l0Y2giLCBXTTg5OTZfRFNQMV9SWF9FUV9HQUlOU18xLCAwLCAxLCAwKSwKIFNPQ19TSU5HTEUoIkRTUDIgRVEgU3dpdGNoIiwgV004OTk2X0RTUDJfUlhfRVFfR0FJTlNfMSwgMCwgMSwgMCksCisKK1NPQ19TSU5HTEUoIkRTUDEgRFJDIFRYTCBTd2l0Y2giLCBXTTg5OTZfRFNQMV9EUkNfMSwgMCwgMSwgMCksCitTT0NfU0lOR0xFKCJEU1AxIERSQyBUWFIgU3dpdGNoIiwgV004OTk2X0RTUDFfRFJDXzEsIDEsIDEsIDApLAorU09DX1NJTkdMRSgiRFNQMSBEUkMgUlggU3dpdGNoIiwgV004OTk2X0RTUDFfRFJDXzEsIDIsIDEsIDApLAorCitTT0NfU0lOR0xFKCJEU1AyIERSQyBUWEwgU3dpdGNoIiwgV004OTk2X0RTUDJfRFJDXzEsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiRFNQMiBEUkMgVFhSIFN3aXRjaCIsIFdNODk5Nl9EU1AyX0RSQ18xLCAxLCAxLCAwKSwKK1NPQ19TSU5HTEUoIkRTUDIgRFJDIFJYIFN3aXRjaCIsIFdNODk5Nl9EU1AyX0RSQ18xLCAyLCAxLCAwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTZfZXFfY29udHJvbHNbXSA9IHsKQEAgLTY1OCwxOSArNjc1LDc1IEBACiAJICAgICAgIGVxX3RsdiksCiB9OwogCi1zdGF0aWMgaW50IGNwX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIHZvaWQgd204OTk2X2JnX2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODk5Ni0+YmdfZW5hKys7CisJaWYgKHdtODk5Ni0+YmdfZW5hID09IDEpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSwKKwkJCQkgICAgV004OTk2X0JHX0VOQSwgV004OTk2X0JHX0VOQSk7CisJCW1zbGVlcCgyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdtODk5Nl9iZ19kaXNhYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJd204OTk2LT5iZ19lbmEtLTsKKwlpZiAoIXdtODk5Ni0+YmdfZW5hKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTZfQkdfRU5BLCAwKTsKK30KKworc3RhdGljIGludCBiZ19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJaW50IHJldCA9IDA7CisKIAlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCW1zbGVlcCg1KTsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQl3bTg5OTZfYmdfZW5hYmxlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXdtODk5Nl9iZ19kaXNhYmxlKGNvZGVjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3BfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCXN0cnVjdCB3bTg5OTZfcHJpdiAqd204OTk2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZSh3bTg5OTYtPmNwdmRkKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBDUFZERDogJWRcbiIsCisJCQkJcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCW1zbGVlcCg1KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJlZ3VsYXRvcl9kaXNhYmxlX2RlZmVycmVkKHdtODk5Ni0+Y3B2ZGQsIDIwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBybXZfc2hvcnRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCkBAIC02OTgsNyArNzcxLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBpLCByZXQ7CisJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAyMDA7CiAKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTZfRENfU0VSVk9fMiwgbWFzayk7CkBAIC03MTMsMTUgKzc4NiwxMiBAQAogCiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoMSk7Ci0JCQlpZiAoLS1pKSB7Ci0JCQkJdGltZW91dCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQl0aW1lb3V0LS07CiAJCX0KIAogCQlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9EQ19TRVJWT18yKTsKIAkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiREMgc2Vydm8gc3RhdGU6ICV4XG4iLCByZXQpOwotCX0gd2hpbGUgKHJldCAmIG1hc2spOworCX0gd2hpbGUgKHRpbWVvdXQgJiYgcmV0ICYgbWFzayk7CiAKIAlpZiAodGltZW91dCA9PSAwKQogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQyBzZXJ2byB0aW1lZCBvdXQgZm9yICV4XG4iLCBtYXNrKTsKQEAgLTk3OSw5ICsxMDQ5LDEyIEBACiBTTkRfU09DX0RBUE1fU1VQUExZX1MoIlNZU0RTUENMSyIsIDIsIFdNODk5Nl9DTE9DS0lOR18xLCAxLCAwLCBOVUxMLCAwKSwKIFNORF9TT0NfREFQTV9TVVBQTFlfUygiQUlGQ0xLIiwgMiwgV004OTk2X0NMT0NLSU5HXzEsIDIsIDAsIE5VTEwsIDApLAogU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJDaGFyZ2UgUHVtcCIsIDIsIFdNODk5Nl9DSEFSR0VfUFVNUF8xLCAxNSwgMCwgY3BfZXZlbnQsCi0JCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KKwkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiQmFuZGdhcCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgYmdfZXZlbnQsCisJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiBTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8yIiwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMiwgMSwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCMSBBdWRpbyIsIFdNODk5Nl9NSUNCSUFTXzEsIDQsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQjIgQXVkaW8iLCBXTTg5OTZfTUlDQklBU18yLCA0LCAxLCBOVUxMLCAwKSwKIFNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCMiIsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzEsIDksIDApLAogU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1JQ0IxIiwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSwgOCwgMCksCiAKQEAgLTEwMzUsMTQgKzExMDgsMTQgQEAKIFNORF9TT0NfREFQTV9EQUMoIkRBQzFMIiwgTlVMTCwgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfNSwgMSwgMCksCiBTTkRfU09DX0RBUE1fREFDKCJEQUMxUiIsIE5VTEwsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzUsIDAsIDApLAogCi1TTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYyUlgxIiwgIkFJRjIgUGxheWJhY2siLCAxLAorU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlJYMSIsICJBSUYyIFBsYXliYWNrIiwgMCwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzQsIDksIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlJYMCIsICJBSUYyIFBsYXliYWNrIiwgMiwKK1NORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJSWDAiLCAiQUlGMiBQbGF5YmFjayIsIDEsCiAJCSAgICBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF80LCA4LCAwKSwKIAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlRYMSIsICJBSUYyIENhcHR1cmUiLCAxLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjJUWDEiLCAiQUlGMiBDYXB0dXJlIiwgMCwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzYsIDksIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMlRYMCIsICJBSUYyIENhcHR1cmUiLCAyLAorU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjJUWDAiLCAiQUlGMiBDYXB0dXJlIiwgMSwKIAkJICAgIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzYsIDgsIDApLAogCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlg1IiwgIkFJRjEgUGxheWJhY2siLCA1LApAQCAtMTEzNywxNyArMTIxMCwyMyBAQAogCXsgIkNoYXJnZSBQdW1wIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIk1JQ0IxIiwgTlVMTCwgIkxETzIiIH0sCisJeyAiTUlDQjEiLCBOVUxMLCAiTUlDQjEgQXVkaW8iIH0sCisJeyAiTUlDQjEiLCBOVUxMLCAiQmFuZGdhcCIgfSwKIAl7ICJNSUNCMiIsIE5VTEwsICJMRE8yIiB9LAorCXsgIk1JQ0IyIiwgTlVMTCwgIk1JQ0IyIEF1ZGlvIiB9LAorCXsgIk1JQ0IyIiwgTlVMTCwgIkJhbmRnYXAiIH0sCiAKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjJMTiIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjJMUCIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMTiIgfSwKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMUCIgfSwKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4yUk4iIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4yUlAiIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUk4iIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUlAiIH0sCisJeyAiSU4xUiBQR0EiLCBOVUxMLCAiQmFuZGdhcCIgfSwKIAogCXsgIkFEQ0wiLCBOVUxMLCAiSU4xTCBQR0EiIH0sCiAKQEAgLTEyODEsNiArMTM2MCw3IEBACiAJeyAiREFDMlIiLCBOVUxMLCAiREFDMlIgTWl4ZXIiIH0sCiAKIAl7ICJIUE9VVDJMIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDJMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMkwgUEdBIiwgTlVMTCwgIkRBQzJMIiB9LAogCXsgIkhQT1VUMkxfRExZIiwgTlVMTCwgIkhQT1VUMkwgUEdBIiB9LAogCXsgIkhQT1VUMkxfRENTIiwgTlVMTCwgIkhQT1VUMkxfRExZIiB9LApAQCAtMTI4OCw2ICsxMzY4LDcgQEAKIAl7ICJIUE9VVDJMX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDJMX09VVFAiIH0sCiAKIAl7ICJIUE9VVDJSIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDJSIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMlIgUEdBIiwgTlVMTCwgIkRBQzJSIiB9LAogCXsgIkhQT1VUMlJfRExZIiwgTlVMTCwgIkhQT1VUMlIgUEdBIiB9LAogCXsgIkhQT1VUMlJfRENTIiwgTlVMTCwgIkhQT1VUMlJfRExZIiB9LApAQCAtMTI5NSw2ICsxMzc2LDcgQEAKIAl7ICJIUE9VVDJSX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDJSX09VVFAiIH0sCiAKIAl7ICJIUE9VVDFMIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDFMIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMUwgUEdBIiwgTlVMTCwgIkRBQzFMIiB9LAogCXsgIkhQT1VUMUxfRExZIiwgTlVMTCwgIkhQT1VUMUwgUEdBIiB9LAogCXsgIkhQT1VUMUxfRENTIiwgTlVMTCwgIkhQT1VUMUxfRExZIiB9LApAQCAtMTMwMiw2ICsxMzg0LDcgQEAKIAl7ICJIUE9VVDFMX1JNVl9TSE9SVCIsIE5VTEwsICJIUE9VVDFMX09VVFAiIH0sCiAKIAl7ICJIUE9VVDFSIFBHQSIsIE5VTEwsICJDaGFyZ2UgUHVtcCIgfSwKKwl7ICJIUE9VVDFSIFBHQSIsIE5VTEwsICJCYW5kZ2FwIiB9LAogCXsgIkhQT1VUMVIgUEdBIiwgTlVMTCwgIkRBQzFSIiB9LAogCXsgIkhQT1VUMVJfRExZIiwgTlVMTCwgIkhQT1VUMVIgUEdBIiB9LAogCXsgIkhQT1VUMVJfRENTIiwgTlVMTCwgIkhQT1VUMVJfRExZIiB9LApAQCAtMTYyMCwxNCArMTcwMyw3IEBACiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JCWJyZWFrOwotCiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKLQkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9QT1dFUl9NQU5BR0VNRU5UXzEsCi0JCQkJCSAgICBXTTg5OTZfQkdfRU5BLCBXTTg5OTZfQkdfRU5BKTsKLQkJCW1zbGVlcCgyKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CkBAIC0xNjUwLDkgKzE3MjYsNiBAQAogCQkJY29kZWMtPmNhY2hlX29ubHkgPSBmYWxzZTsKIAkJCXNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CiAJCX0KLQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfUE9XRVJfTUFOQUdFTUVOVF8xLAotCQkJCSAgICBXTTg5OTZfQkdfRU5BLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CkBAIC0xODQ3LDcgKzE5MjAsNyBAQAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGxyY2xrX3JlZywgV004OTk2X0FJRjFSWF9SQVRFX01BU0ssCiAJCQkgICAgbHJjbGspOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9BSUZfQ0xPQ0tJTkdfMiwKLQkJCSAgICBXTTg5OTZfRFNQMV9ESVZfU0hJRlQgPDwgZHNwX3NoaWZ0LCBkc3ApOworCQkJICAgIFdNODk5Nl9EU1AxX0RJVl9NQVNLIDw8IGRzcF9zaGlmdCwgZHNwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA0MSw3ICsyMTE0LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlzdHJ1Y3QgX2ZsbF9kaXYgZmxsX2RpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldCwgcmVnOworCWludCByZXQsIHJlZywgcmV0cnk7CiAKIAkvKiBBbnkgY2hhbmdlPyAqLwogCWlmIChzb3VyY2UgPT0gd204OTk2LT5mbGxfc3JjICYmIEZyZWYgPT0gd204OTk2LT5mbGxfZnJlZiAmJgpAQCAtMjA1Nyw2ICsyMTMwLDggQEAKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0ZMTF9DT05UUk9MXzEsCiAJCQkJICAgIFdNODk5Nl9GTExfRU5BLCAwKTsKIAorCQl3bTg5OTZfYmdfZGlzYWJsZShjb2RlYyk7CisKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTExLDYgKzIxODYsMTEgQEAKIAogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5Nl9GTExfRUZTXzEsIGZsbF9kaXYubGFtYmRhKTsKIAorCS8qIEVuYWJsZSB0aGUgYmFuZGdhcCBpZiBpdCdzIG5vdCBhbHJlYWR5IGVuYWJsZWQgKi8KKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9GTExfQ09OVFJPTF8xKTsKKwlpZiAoIShyZXQgJiBXTTg5OTZfRkxMX0VOQSkpCisJCXdtODk5Nl9iZ19lbmFibGUoY29kZWMpOworCiAJLyogQ2xlYXIgYW55IHBlbmRpbmcgY29tcGxldGlvbnMgKGVnLCBmcm9tIGZhaWxlZCBzdGFydHVwcykgKi8KIAl0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmd204OTk2LT5mbGxfbG9jayk7CiAKQEAgLTIxMjgsMTcgKzIyMDgsMjkgQEAKIAllbHNlCiAJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDIpOwogCi0JLyogQWxsb3cgc3Vic3RhbnRpYWxseSBsb25nZXIgaWYgd2UndmUgYWN0dWFsbHkgZ290IHRoZSBJUlEgKi8KKwkvKiBBbGxvdyBzdWJzdGFudGlhbGx5IGxvbmdlciBpZiB3ZSd2ZSBhY3R1YWxseSBnb3QgdGhlIElSUSwgcG9sbAorCSAqIGF0IGEgc2xpZ2h0bHkgaGlnaGVyIHJhdGUgaWYgd2UgZG9uJ3QuCisJICovCiAJaWYgKGkyYy0+aXJxKQotCQl0aW1lb3V0ICo9IDEwMDA7CisJCXRpbWVvdXQgKj0gMTA7CisJZWxzZQorCQl0aW1lb3V0IC89IDI7CiAKLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk5Ni0+ZmxsX2xvY2ssIHRpbWVvdXQpOworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDEwOyByZXRyeSsrKSB7CisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTk2LT5mbGxfbG9jaywKKwkJCQkJCSAgdGltZW91dCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJV0FSTl9PTighaTJjLT5pcnEpOworCQkJYnJlYWs7CisJCX0KIAotCWlmIChyZXQgPT0gMCAmJiBpMmMtPmlycSkgeworCQlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9JTlRFUlJVUFRfUkFXX1NUQVRVU18yKTsKKwkJaWYgKHJldCAmIFdNODk5Nl9GTExfTE9DS19TVFMpCisJCQlicmVhazsKKwl9CisJaWYgKHJldHJ5ID09IDEwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBGTExcbiIpOwogCQlyZXQgPSAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJldCA9IDA7CiAJfQogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMIGNvbmZpZ3VyZWQgZm9yICVkSHotPiVkSHpcbiIsIEZyZWYsIEZvdXQpOwpAQCAtMjI5NywxMiArMjM4OSw5NCBAQAogCiAJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHdlJ3JlIG9mZiAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSywKLQkJCSAgICBXTTg5OTZfSU1fTUlDRF9FSU5ULCAwKTsKKwkJCSAgICBXTTg5OTZfSU1fTUlDRF9FSU5UIHwgV004OTk2X0hQX0RPTkVfRUlOVCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODk5Nl9kZXRlY3QpOwogCitzdGF0aWMgdm9pZCB3bTg5OTZfaHBkZXRfaXJxKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk2X3ByaXYgKndtODk5NiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwsIHJlZywgcmVwb3J0OworCisJLyogQXNzdW1lIGhlYWRwaG9uZSBpbiBlcnJvciBjb25kaXRpb25zOyB3ZSBuZWVkIHRvIHJlcG9ydAorCSAqIHNvbWV0aGluZyBvciB3ZSBzdGFsbCBvdXIgc3RhdGUgbWFjaGluZS4KKwkgKi8KKwlyZXBvcnQgPSBTTkRfSkFDS19IRUFEUEhPTkU7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5Nl9IRUFEUEhPTkVfREVURUNUXzIpOworCWlmIChyZWcgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIEhQREVUIHN0YXR1c1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghKHJlZyAmIFdNODk5Nl9IUF9ET05FKSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJHb3QgSFBERVQgSVJRIGJ1dCBIUERFVCBpcyBidXN5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdmFsID0gcmVnICYgV004OTk2X0hQX0xWTF9NQVNLOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSFBERVQgbWVhc3VyZWQgJWQgb2htc1xuIiwgdmFsKTsKKworCS8qIElmIHdlJ3ZlIGdvdCBoaWdoIGVub3VnaCBpbXBlZGVuY2UgdGhlbiByZXBvcnQgYXMgbGluZSwKKwkgKiBvdGhlcndpc2UgYXNzdW1lIGhlYWRwaG9uZS4KKwkgKi8KKwlpZiAodmFsID49IDEyNikKKwkJcmVwb3J0ID0gU05EX0pBQ0tfTElORU9VVDsKKwllbHNlCisJCXJlcG9ydCA9IFNORF9KQUNLX0hFQURQSE9ORTsKKworb3V0OgorCWlmICh3bTg5OTYtPmphY2tfbWljKQorCQlyZXBvcnQgfD0gU05EX0pBQ0tfTUlDUk9QSE9ORTsKKworCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCByZXBvcnQsCisJCQkgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQpOworCisJd204OTk2LT5kZXRlY3RpbmcgPSBmYWxzZTsKKworCS8qIElmIHRoZSBvdXRwdXQgaXNuJ3QgcnVubmluZyByZS1jbGFtcCBpdCAqLworCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk2X1BPV0VSX01BTkFHRU1FTlRfMSkgJgorCSAgICAgIChXTTg5OTZfSFBPVVQxTF9FTkEgfCBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQpKSkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FOQUxPR1VFX0hQXzEsCisJCQkJICAgIFdNODk5Nl9IUE9VVDFMX1JNVl9TSE9SVCB8CisJCQkJICAgIFdNODk5Nl9IUE9VVDFSX1JNVl9TSE9SVCwgMCk7CisKKwkvKiBHbyBiYWNrIHRvIGxvb2tpbmcgYXQgdGhlIG1pY3JvcGhvbmUgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfQUNDRVNTT1JZX0RFVEVDVF9NT0RFXzEsCisJCQkgICAgV004OTk2X0pEX01PREVfTUFTSywgMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwgV004OTk2X01JQ0RfRU5BLAorCQkJICAgIFdNODk5Nl9NSUNEX0VOQSk7CisKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiQmFuZGdhcCIpOworCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODk5Nl9ocGRldF9zdGFydChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJLyogVW5jbGFtcCB0aGUgb3V0cHV0LCB3ZSBjYW4ndCBtZWFzdXJlIHdoaWxlIHdlJ3JlIHNob3J0aW5nIGl0ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FOQUxPR1VFX0hQXzEsCisJCQkgICAgV004OTk2X0hQT1VUMUxfUk1WX1NIT1JUIHwKKwkJCSAgICBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQsCisJCQkgICAgV004OTk2X0hQT1VUMUxfUk1WX1NIT1JUIHwKKwkJCSAgICBXTTg5OTZfSFBPVVQxUl9STVZfU0hPUlQpOworCisJLyogV2UgbmVlZCBiYW5kZ2FwIGZvciBIUERFVCAqLworCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkJhbmRnYXAiKTsKKwlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJLyogR28gaW50byBoZWFkcGhvbmUgZGV0ZWN0IGxlZnQgbW9kZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9NSUNfREVURUNUXzEsIFdNODk5Nl9NSUNEX0VOQSwgMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0FDQ0VTU09SWV9ERVRFQ1RfTU9ERV8xLAorCQkJICAgIFdNODk5Nl9KRF9NT0RFX01BU0ssIDEpOworCisJLyogVHJpZ2dlciBhIG1lYXN1cmVtZW50ICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X0hFQURQSE9ORV9ERVRFQ1RfMSwKKwkJCSAgICBXTTg5OTZfSFBfUE9MTCwgV004OTk2X0hQX1BPTEwpOworfQorCiBzdGF0aWMgdm9pZCB3bTg5OTZfbWljZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk5Nl9wcml2ICp3bTg5OTYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKQEAgLTIzMjMsMjggKzI0OTcsMzYgQEAKIAkJd204OTk2LT5qYWNrX21pYyA9IGZhbHNlOwogCQl3bTg5OTYtPmRldGVjdGluZyA9IHRydWU7CiAJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCAwLAotCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzApOworCQkJCSAgICBTTkRfSkFDS19MSU5FT1VUIHwgU05EX0pBQ0tfSEVBRFNFVCB8CisJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfTUlDX0RFVEVDVF8xLAogCQkJCSAgICBXTTg5OTZfTUlDRF9SQVRFX01BU0ssCiAJCQkJICAgIFdNODk5Nl9NSUNEX1JBVEVfTUFTSyk7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBJZiB0aGUgbWVhc3VyZW1lbnQgaXMgdmVyeSBoaWdoIHdlJ3ZlIGdvdCBhIG1pY3JvcGhvbmUgYnV0Ci0JICogZG8gYSBsaXR0bGUgZGVib3VuY2UgdG8gYWNjb3VudCBmb3IgbWVjaGFuaWNhbCBpc3N1ZXMuCisJLyogSWYgdGhlIG1lYXN1cmVtZW50IGlzIHZlcnkgaGlnaCB3ZSd2ZSBnb3QgYSBtaWNyb3Bob25lLAorCSAqIGVpdGhlciB3ZSBqdXN0IGRldGVjdGVkIG9uZSBvciBpZiB3ZSBhbHJlYWR5IHJlcG9ydGVkIHRoZW4KKwkgKiB3ZSd2ZSBnb3QgYSBidXR0b24gcmVsZWFzZSBldmVudC4KIAkgKi8KIAlpZiAodmFsICYgMHg0MDApIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljcm9waG9uZSBkZXRlY3RlZFxuIik7Ci0JCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCBTTkRfSkFDS19IRUFEU0VULAotCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzApOwotCQl3bTg5OTYtPmphY2tfbWljID0gdHJ1ZTsKLQkJd204OTk2LT5kZXRlY3RpbmcgPSBmYWxzZTsKKwkJaWYgKHdtODk5Ni0+ZGV0ZWN0aW5nKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWNyb3Bob25lIGRldGVjdGVkXG4iKTsKKwkJCXdtODk5Ni0+amFja19taWMgPSB0cnVlOworCQkJd204OTk2X2hwZGV0X3N0YXJ0KGNvZGVjKTsKIAotCQkvKiBJbmNyZWFzZSBwb2xsIHJhdGUgdG8gZ2l2ZSBiZXR0ZXIgcmVzcG9uc2l2ZW5lc3MKLQkJICogZm9yIGJ1dHRvbnMgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwKLQkJCQkgICAgV004OTk2X01JQ0RfUkFURV9NQVNLLAotCQkJCSAgICA1IDw8IFdNODk5Nl9NSUNEX1JBVEVfU0hJRlQpOworCQkJLyogSW5jcmVhc2UgcG9sbCByYXRlIHRvIGdpdmUgYmV0dGVyIHJlc3BvbnNpdmVuZXNzCisJCQkgKiBmb3IgYnV0dG9ucyAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk2X01JQ19ERVRFQ1RfMSwKKwkJCQkJICAgIFdNODk5Nl9NSUNEX1JBVEVfTUFTSywKKwkJCQkJICAgIDUgPDwgV004OTk2X01JQ0RfUkFURV9TSElGVCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNaWMgYnV0dG9uIHVwXG4iKTsKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCAwLCBTTkRfSkFDS19CVE5fMCk7CisJCX0KKworCQlyZXR1cm47CiAJfQogCiAJLyogSWYgd2UgZGV0ZWN0ZWQgYSBsb3dlciBpbXBlZGVuY2UgZHVyaW5nIGluaXRpYWwgc3RhcnR1cApAQCAtMjM3NiwxNSArMjU1OCwxMSBAQAogCWlmICh2YWwgJiAweDNmYykgewogCQlpZiAod204OTk2LT5qYWNrX21pYykgewogCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljIGJ1dHRvbiBkZXRlY3RlZFxuIik7Ci0JCQlzbmRfc29jX2phY2tfcmVwb3J0KHdtODk5Ni0+amFjaywKLQkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCwKLQkJCQkJICAgIFNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19CVE5fMCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJIZWFkcGhvbmUgZGV0ZWN0ZWRcbiIpOwotCQkJc25kX3NvY19qYWNrX3JlcG9ydCh3bTg5OTYtPmphY2ssCi0JCQkJCSAgICBTTkRfSkFDS19IRUFEUEhPTkUsCi0JCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCXNuZF9zb2NfamFja19yZXBvcnQod204OTk2LT5qYWNrLCBTTkRfSkFDS19CVE5fMCwKIAkJCQkJICAgIFNORF9KQUNLX0JUTl8wKTsKKwkJfSBlbHNlIGlmICh3bTg5OTYtPmRldGVjdGluZykgeworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSGVhZHBob25lIGRldGVjdGVkXG4iKTsKKwkJCXdtODk5Nl9ocGRldF9zdGFydChjb2RlYyk7CiAKIAkJCS8qIEluY3JlYXNlIHRoZSBkZXRlY3Rpb24gcmF0ZSBhIGJpdCBmb3IKIAkJCSAqIHJlc3BvbnNpdmVuZXNzLgpAQCAtMjM5Miw4ICsyNTcwLDYgQEAKIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5Nl9NSUNfREVURUNUXzEsCiAJCQkJCSAgICBXTTg5OTZfTUlDRF9SQVRFX01BU0ssCiAJCQkJCSAgICA3IDw8IFdNODk5Nl9NSUNEX1JBVEVfU0hJRlQpOwotCi0JCQl3bTg5OTYtPmRldGVjdGluZyA9IGZhbHNlOwogCQl9CiAJfQogfQpAQCAtMjQxMiw2ICsyNTg4LDkgQEAKIAl9CiAJaXJxX3ZhbCAmPSB+c25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTZfSU5URVJSVVBUX1NUQVRVU18yX01BU0spOwogCisJaWYgKCFpcnFfdmFsKQorCQlyZXR1cm4gSVJRX05PTkU7CisKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTZfSU5URVJSVVBUX1NUQVRVU18yLCBpcnFfdmFsKTsKIAogCWlmIChpcnFfdmFsICYgKFdNODk5Nl9EQ1NfRE9ORV8wMV9FSU5UIHwgV004OTk2X0RDU19ET05FXzIzX0VJTlQpKSB7CkBAIC0yNDMwLDEwICsyNjA5LDEwIEBACiAJaWYgKGlycV92YWwgJiBXTTg5OTZfTUlDRF9FSU5UKQogCQl3bTg5OTZfbWljZChjb2RlYyk7CiAKLQlpZiAoaXJxX3ZhbCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIElSUV9OT05FOworCWlmIChpcnFfdmFsICYgV004OTk2X0hQX0RPTkVfRUlOVCkKKwkJd204OTk2X2hwZGV0X2lycShjb2RlYyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB3bTg5OTZfZWRnZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTI1MjcsNyArMjcwNiw2IEBACiAJaW5pdF9jb21wbGV0aW9uKCZ3bTg5OTYtPmZsbF9sb2NrKTsKIAogCWRhcG0tPmlkbGVfYmlhc19vZmYgPSB0cnVlOwotCWRhcG0tPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19JMkMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMjU0OCw3ICsyNzI2LDEzIEBACiAJd204OTk2LT5kaXNhYmxlX25iWzBdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzA7CiAJd204OTk2LT5kaXNhYmxlX25iWzFdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzE7CiAJd204OTk2LT5kaXNhYmxlX25iWzJdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzI7Ci0Jd204OTk2LT5kaXNhYmxlX25iWzNdLm5vdGlmaWVyX2NhbGwgPSB3bTg5OTZfcmVndWxhdG9yX2V2ZW50XzM7CisKKwl3bTg5OTYtPmNwdmRkID0gcmVndWxhdG9yX2dldCgmaTJjLT5kZXYsICJDUFZERCIpOworCWlmIChJU19FUlIod204OTk2LT5jcHZkZCkpIHsKKwkJcmV0ID0gUFRSX0VSUih3bTg5OTYtPmNwdmRkKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gZ2V0IENQVkREOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZ2V0OworCX0KIAogCS8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBtb3ZlZCBpbnRvIHRoZSByZWd1bGF0b3IgY29yZSAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpOyBpKyspIHsKQEAgLTI1NjUsNyArMjc0OSw3IEBACiAJCQkJICAgIHdtODk5Ni0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfZ2V0OworCQlnb3RvIGVycl9jcHZkZDsKIAl9CiAKIAlpZiAod204OTk2LT5wZGF0YS5sZG9fZW5hID49IDApIHsKQEAgLTI4MDgsNiArMjk5Miw4IEBACiAJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHdtODk5Ni0+cGRhdGEubGRvX2VuYSwgMCk7CiAKIAlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk2LT5zdXBwbGllcyksIHdtODk5Ni0+c3VwcGxpZXMpOworZXJyX2NwdmRkOgorCXJlZ3VsYXRvcl9wdXQod204OTk2LT5jcHZkZCk7CiBlcnJfZ2V0OgogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTg5OTYtPnN1cHBsaWVzKSwgd204OTk2LT5zdXBwbGllcyk7CiBlcnI6CkBAIC0yODMxLDYgKzMwMTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpOyBpKyspCiAJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyX25vdGlmaWVyKHdtODk5Ni0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCiAJCQkJCSAgICAgICZ3bTg5OTYtPmRpc2FibGVfbmJbaV0pOworCXJlZ3VsYXRvcl9wdXQod204OTk2LT5jcHZkZCk7CiAJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODk5Ni0+c3VwcGxpZXMpLCB3bTg5OTYtPnN1cHBsaWVzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggYTQ2OTEzMi4uM2NkMzVhMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0xNTcsNyArMTU3LDYgQEAKIAogc3RydWN0IHdtOTA4MV9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl2b2lkICpjb250cm9sX2RhdGE7CiAJaW50IHN5c2Nsa19zb3VyY2U7CiAJaW50IG1jbGtfcmF0ZTsKIAlpbnQgc3lzY2xrX3JhdGU7CkBAIC0xNzQsNiArMTczLDcgQEAKIHsKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgV005MDgxX1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV005MDgxX0lOVEVSUlVQVF9TVEFUVVM6CiAJCXJldHVybiAxOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtODIwLDcgKzgyMCw3IEBACiAJCS8qIFZNSUQgMioyNDBrICovCiAJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV005MDgxX0JJQVNfQ09OVFJPTF8xKTsKIAkJcmVnICY9IH5XTTkwODFfVk1JRF9TRUxfTUFTSzsKLQkJcmVnIHw9IDB4NDA7CisJCXJlZyB8PSAweDA0OwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTkwODFfVk1JRF9DT05UUk9MLCByZWcpOwogCiAJCS8qIFN0YW5kYnkgYmlhcyBjdXJyZW50IG9uICovCkBAIC0xMTIwLDggKzExMjAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtOTA4MV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgICAgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCitzdGF0aWMgaW50IHdtOTA4MV9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJc3RydWN0IHdtOTA4MV9wcml2ICp3bTkwODEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIApAQCAtMTIxMyw3ICsxMjEzLDYgQEAKIAlpbnQgcmV0OwogCXUxNiByZWc7CiAKLQljb2RlYy0+Y29udHJvbF9kYXRhID0gd205MDgxLT5jb250cm9sX2RhdGE7CiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDE2LCB3bTkwODEtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgY2FjaGUgSS9POiAlZFxuIiwgcmV0KTsKQEAgLTEyNTAsOCArMTI0OSw2IEBACiAJc25kX3NvY193cml0ZShjb2RlYywgV005MDgxX0FOQUxPR1VFX1NQRUFLRVJfUEdBLAogCQkgICAgIHJlZyB8IFdNOTA4MV9TUEtQR0FaQyk7CiAKLQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd205MDgxX3NuZF9jb250cm9scywKLQkJCSAgICAgQVJSQVlfU0laRSh3bTkwODFfc25kX2NvbnRyb2xzKSk7CiAJaWYgKCF3bTkwODEtPnBkYXRhLm51bV9yZXR1bmVfY29uZmlncykgewogCQlkZXZfZGJnKGNvZGVjLT5kZXYsCiAJCQkiTm8gUmVUdW5lIE1vYmlsZSBkYXRhLCB1c2luZyBub3JtYWwgRVFcbiIpOwpAQCAtMTMxMSw2ICsxMzA4LDggQEAKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTkwODFfcmVnX2RlZmF1bHRzLAogCS52b2xhdGlsZV9yZWdpc3RlciA9IHdtOTA4MV92b2xhdGlsZV9yZWdpc3RlciwKIAorCS5jb250cm9scyAgICAgICAgID0gd205MDgxX3NuZF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzICAgICA9IEFSUkFZX1NJWkUod205MDgxX3NuZF9jb250cm9scyksCiAJLmRhcG1fd2lkZ2V0cwkgID0gd205MDgxX2RhcG1fd2lkZ2V0cywKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205MDgxX2RhcG1fd2lkZ2V0cyksCiAJLmRhcG1fcm91dGVzICAgICA9IHdtOTA4MV9hdWRpb19wYXRocywKQEAgLTEzMzAsNyArMTMyOSw2IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTkwODEpOwogCXdtOTA4MS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7Ci0Jd205MDgxLT5jb250cm9sX2RhdGEgPSBpMmM7CiAKIAlpZiAoZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpKQogCQltZW1jcHkoJndtOTA4MS0+cGRhdGEsIGRldl9nZXRfcGxhdGRhdGEoJmkyYy0+ZGV2KSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCmluZGV4IDRkZTEyMjAuLjJiNTI1MmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYwpAQCAtMTM5LDkgKzEzOSw3IEBACiAKIC8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gc2F2ZSB0aGUgY29udGV4dCAqLwogc3RydWN0IHdtOTA5MF9wcml2IHsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IHdtOTA5MF9wbGF0Zm9ybV9kYXRhIHBkYXRhOwotCXZvaWQgKmNvbnRyb2xfZGF0YTsKIH07CiAKIHN0YXRpYyBpbnQgd205MDkwX3ZvbGF0aWxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKQEAgLTU1MCwxMCArNTQ4LDggQEAKIAogc3RhdGljIGludCB3bTkwOTBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCB3bTkwOTBfcHJpdiAqd205MDkwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWNvZGVjLT5jb250cm9sX2RhdGEgPSB3bTkwOTAtPmNvbnRyb2xfZGF0YTsKIAlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIFNORF9TT0NfSTJDKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOwpAQCAtNjYyLDggKzY1OCw2IEBACiAJCSAgICAgICBzaXplb2Yod205MDkwLT5wZGF0YSkpOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd205MDkwKTsKLQl3bTkwOTAtPmNvbnRyb2xfZGF0YSA9IGkyYzsKLQltdXRleF9pbml0KCZ3bTkwOTAtPm11dGV4KTsKIAogCXJldCA9ICBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKIAkJCSZzb2NfY29kZWNfZGV2X3dtOTA5MCwgIE5VTEwsIDApOwpAQCAtNjg0LDYgKzY3OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTkwOTBfaWRbXSA9IHsKIAl7ICJ3bTkwOTAiLCAwIH0sCisJeyAid205MDkzIiwgMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB3bTkwOTBfaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYwppbmRleCBlNzYzYzU0Li44NGYzM2Q0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgpAQCAtMTE2LDE0ICsxMTcsMjMgQEAKIHsKIAlzdHJ1Y3Qgd21faHVic19kYXRhICpodWJzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJczggb2Zmc2V0OwotCXUxNiByZWcsIHJlZ19sLCByZWdfciwgZGNzX2NmZzsKKwl1MTYgcmVnLCByZWdfbCwgcmVnX3IsIGRjc19jZmcsIGRjc19yZWc7CisKKwlzd2l0Y2ggKGh1YnMtPmRjc19yZWFkYmFja19tb2RlKSB7CisJY2FzZSAyOgorCQlkY3NfcmVnID0gV004OTk0X0RDX1NFUlZPXzRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkY3NfcmVnID0gV004OTkzX0RDX1NFUlZPXzM7CisJCWJyZWFrOworCX0KIAogCS8qIElmIHdlJ3JlIHVzaW5nIGEgZGlnaXRhbCBvbmx5IHBhdGggYW5kIGhhdmUgYSBwcmV2aW91c2x5CiAJICogY2FsbGlicmF0ZWQgREMgc2Vydm8gb2Zmc2V0IHN0b3JlZCB0aGVuIHVzZSB0aGF0LiAqLwogCWlmIChodWJzLT5jbGFzc193ICYmIGh1YnMtPmNsYXNzX3dfZGNzKSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIlVzaW5nIGNhY2hlZCBEQyBzZXJ2byBvZmZzZXQgJXhcbiIsCiAJCQlodWJzLT5jbGFzc193X2Rjcyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5M19EQ19TRVJWT18zLCBodWJzLT5jbGFzc193X2Rjcyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGRjc19yZWcsIGh1YnMtPmNsYXNzX3dfZGNzKTsKIAkJd2FpdF9mb3JfZGNfc2Vydm8oY29kZWMsCiAJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzAgfAogCQkJCSAgV004OTkzX0RDU19UUklHX0RBQ19XUl8xKTsKQEAgLTE1NCw4ICsxNjQsOSBAQAogCQlyZWdfciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPX1JFQURCQUNLXzIpCiAJCQkmIFdNODk5M19EQ1NfSU5URUdfQ0hBTl8xX01BU0s7CiAJCWJyZWFrOworCWNhc2UgMjoKIAljYXNlIDE6Ci0JCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPXzMpOworCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIGRjc19yZWcpOwogCQlyZWdfciA9IChyZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9NQVNLKQogCQkJPj4gV004OTkzX0RDU19EQUNfV1JfVkFMXzFfU0hJRlQ7CiAJCXJlZ19sID0gcmVnICYgV004OTkzX0RDU19EQUNfV1JfVkFMXzBfTUFTSzsKQEAgLTE2OCwyNCArMTc5LDI1IEBACiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRENTIGlucHV0OiAleCAleFxuIiwgcmVnX2wsIHJlZ19yKTsKIAogCS8qIEFwcGx5IGNvcnJlY3Rpb24gdG8gREMgc2Vydm8gcmVzdWx0ICovCi0JaWYgKGh1YnMtPmRjc19jb2RlcykgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJBcHBseWluZyAlZCBjb2RlIERDIHNlcnZvIGNvcnJlY3Rpb25cbiIsCi0JCQlodWJzLT5kY3NfY29kZXMpOworCWlmIChodWJzLT5kY3NfY29kZXNfbCB8fCBodWJzLT5kY3NfY29kZXNfcikgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsCisJCQkiQXBwbHlpbmcgJWQvJWQgY29kZSBEQyBzZXJ2byBjb3JyZWN0aW9uXG4iLAorCQkJaHVicy0+ZGNzX2NvZGVzX2wsIGh1YnMtPmRjc19jb2Rlc19yKTsKIAogCQkvKiBIUE9VVDFSICovCiAJCW9mZnNldCA9IHJlZ19yOwotCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzOworCQlvZmZzZXQgKz0gaHVicy0+ZGNzX2NvZGVzX3I7CiAJCWRjc19jZmcgPSAodTgpb2Zmc2V0IDw8IFdNODk5M19EQ1NfREFDX1dSX1ZBTF8xX1NISUZUOwogCiAJCS8qIEhQT1VUMUwgKi8KIAkJb2Zmc2V0ID0gcmVnX2w7Ci0JCW9mZnNldCArPSBodWJzLT5kY3NfY29kZXM7CisJCW9mZnNldCArPSBodWJzLT5kY3NfY29kZXNfbDsKIAkJZGNzX2NmZyB8PSAodTgpb2Zmc2V0OwogCiAJCWRldl9kYmcoY29kZWMtPmRldiwgIkRDUyByZXN1bHQ6ICV4XG4iLCBkY3NfY2ZnKTsKIAogCQkvKiBEbyBpdCAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMywgZGNzX2NmZyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGRjc19yZWcsIGRjc19jZmcpOwogCQl3YWl0X2Zvcl9kY19zZXJ2byhjb2RlYywKIAkJCQkgIFdNODk5M19EQ1NfVFJJR19EQUNfV1JfMCB8CiAJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzEpOwpAQCAtMjEwLDE0ICsyMjIsMTQgQEAKIAlzdHJ1Y3Qgd21faHVic19kYXRhICpodWJzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7CisJcmV0ID0gc25kX3NvY19wdXRfdm9sc3coa2NvbnRyb2wsIHVjb250cm9sKTsKIAogCS8qIFVwZGF0aW5nIHRoZSBhbmFsb2d1ZSBnYWlucyBpbnZhbGlkYXRlcyB0aGUgREMgc2Vydm8gY2FjaGUgKi8KIAlodWJzLT5jbGFzc193X2RjcyA9IDA7CiAKIAkvKiBJZiB3ZSdyZSBhcHBseWluZyBhbiBvZmZzZXQgY29ycmVjdGlvbiB0aGVuIHVwZGF0aW5nIHRoZQogCSAqIGNhbGxpYnJhdGlvbiB3b3VsZCBiZSBsaWtlbHkgdG8gaW50cm9kdWNlIGZ1cnRoZXIgb2Zmc2V0cy4gKi8KLQlpZiAoaHVicy0+ZGNzX2NvZGVzIHx8IGh1YnMtPm5vX3Nlcmllc191cGRhdGUpCisJaWYgKGh1YnMtPmRjc19jb2Rlc19sIHx8IGh1YnMtPmRjc19jb2Rlc19yIHx8IGh1YnMtPm5vX3Nlcmllc191cGRhdGUpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBPbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB0aGUgb3V0cHV0cyBhcmUgYWN0aXZlICovCkBAIC0zNTAsMTkgKzM2MiwxMSBAQAogU09DX0VOVU0oIlNwZWFrZXIgUmVmZXJlbmNlIiwgc3BlYWtlcl9yZWYpLAogU09DX0VOVU0oIlNwZWFrZXIgTW9kZSIsIHNwZWFrZXJfbW9kZSksCiAKLXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAiSGVhZHBob25lIFZvbHVtZSIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8Ci0JCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS50bHYucCA9IG91dHBnYV90bHYsCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3dfMnIsCi0JLmdldCA9IHNuZF9zb2NfZ2V0X3ZvbHN3XzJyLCAucHV0ID0gd204OTkzX3B1dF9kY19zZXJ2bywKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKSB7Ci0JCS5yZWcgPSBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLAotCQkucnJlZyA9IFdNODk5M19SSUdIVF9PVVRQVVRfVk9MVU1FLAotCQkuc2hpZnQgPSAwLCAubWF4ID0gNjMKLQl9LAotfSwKK1NPQ19ET1VCTEVfUl9FWFRfVExWKCJIZWFkcGhvbmUgVm9sdW1lIiwKKwkJICAgICBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLCBXTTg5OTNfUklHSFRfT1VUUFVUX1ZPTFVNRSwKKwkJICAgICAwLCA2MywgMCwgc25kX3NvY19nZXRfdm9sc3csIHdtODk5M19wdXRfZGNfc2Vydm8sCisJCSAgICAgb3V0cGdhX3RsdiksCisKIFNPQ19ET1VCTEVfUigiSGVhZHBob25lIFN3aXRjaCIsIFdNODk5M19MRUZUX09VVFBVVF9WT0xVTUUsCiAJICAgICBXTTg5OTNfUklHSFRfT1VUUFVUX1ZPTFVNRSwgNiwgMSwgMCksCiBTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBaQyBTd2l0Y2giLCBXTTg5OTNfTEVGVF9PVVRQVVRfVk9MVU1FLApAQCAtNjk5LDYgKzcwMywxMSBAQAogCXsgIklOMUwgUEdBIiwgIklOMUxQIFN3aXRjaCIsICJJTjFMUCIgfSwKIAl7ICJJTjFMIFBHQSIsICJJTjFMTiBTd2l0Y2giLCAiSU4xTE4iIH0sCiAKKwl7ICJJTjFMIFBHQSIsIE5VTEwsICJWTUlEIiB9LAorCXsgIklOMVIgUEdBIiwgTlVMTCwgIlZNSUQiIH0sCisJeyAiSU4yTCBQR0EiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJJTjJSIFBHQSIsIE5VTEwsICJWTUlEIiB9LAorCiAJeyAiSU4xUiBQR0EiLCAiSU4xUlAgU3dpdGNoIiwgIklOMVJQIiB9LAogCXsgIklOMVIgUEdBIiwgIklOMVJOIFN3aXRjaCIsICJJTjFSTiIgfSwKIApAQCAtNzE2LDEyICs3MjUsMTQgQEAKIAl7ICJNSVhJTkwiLCBOVUxMLCAiRGlyZWN0IFZvaWNlIiB9LAogCXsgIk1JWElOTCIsIE5VTEwsICJJTjFMUCIgfSwKIAl7ICJNSVhJTkwiLCBOVUxMLCAiTGVmdCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTUlYSU5MIiwgTlVMTCwgIlZNSUQiIH0sCiAKIAl7ICJNSVhJTlIiLCAiSU4xUiBTd2l0Y2giLCAiSU4xUiBQR0EiIH0sCiAJeyAiTUlYSU5SIiwgIklOMlIgU3dpdGNoIiwgIklOMlIgUEdBIiB9LAogCXsgIk1JWElOUiIsIE5VTEwsICJEaXJlY3QgVm9pY2UiIH0sCiAJeyAiTUlYSU5SIiwgTlVMTCwgIklOMVJQIiB9LAogCXsgIk1JWElOUiIsIE5VTEwsICJSaWdodCBPdXRwdXQgTWl4ZXIiIH0sCisJeyAiTUlYSU5SIiwgTlVMTCwgIlZNSUQiIH0sCiAKIAl7ICJBRENMIiwgTlVMTCwgIk1JWElOTCIgfSwKIAl7ICJBRENSIiwgTlVMTCwgIk1JWElOUiIgfSwKQEAgLTc1Miw2ICs3NjMsNyBAQAogCXsgIkVhcnBpZWNlIE1peGVyIiwgIkxlZnQgT3V0cHV0IFN3aXRjaCIsICJMZWZ0IE91dHB1dCBQR0EiIH0sCiAJeyAiRWFycGllY2UgTWl4ZXIiLCAiUmlnaHQgT3V0cHV0IFN3aXRjaCIsICJSaWdodCBPdXRwdXQgUEdBIiB9LAogCisJeyAiRWFycGllY2UgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCiAJeyAiRWFycGllY2UgRHJpdmVyIiwgTlVMTCwgIkVhcnBpZWNlIE1peGVyIiB9LAogCXsgIkhQT1VUMk4iLCBOVUxMLCAiRWFycGllY2UgRHJpdmVyIiB9LAogCXsgIkhQT1VUMlAiLCBOVUxMLCAiRWFycGllY2UgRHJpdmVyIiB9LApAQCAtNzc0LDkgKzc4NiwxMSBAQAogCXsgIlNQS1IgQm9vc3QiLCAiU1BLUiBTd2l0Y2giLCAiU1BLUiIgfSwKIAl7ICJTUEtSIEJvb3N0IiwgIlNQS0wgU3dpdGNoIiwgIlNQS0wiIH0sCiAKKwl7ICJTUEtMIERyaXZlciIsIE5VTEwsICJWTUlEIiB9LAogCXsgIlNQS0wgRHJpdmVyIiwgTlVMTCwgIlNQS0wgQm9vc3QiIH0sCiAJeyAiU1BLTCBEcml2ZXIiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKIAorCXsgIlNQS1IgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCiAJeyAiU1BLUiBEcml2ZXIiLCBOVUxMLCAiU1BLUiBCb29zdCIgfSwKIAl7ICJTUEtSIERyaXZlciIsIE5VTEwsICJDTEtfU1lTIiB9LAogCkBAIC03OTAsMTIgKzgwNCwxOCBAQAogCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJMZWZ0IEhlYWRwaG9uZSBNdXgiIH0sCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJSaWdodCBIZWFkcGhvbmUgTXV4IiB9LAorCXsgIkhlYWRwaG9uZSBQR0EiLCBOVUxMLCAiVk1JRCIgfSwKIAl7ICJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkNMS19TWVMiIH0sCiAJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJIZWFkcGhvbmUgU3VwcGx5IiB9LAogCiAJeyAiSFBPVVQxTCIsIE5VTEwsICJIZWFkcGhvbmUgUEdBIiB9LAogCXsgIkhQT1VUMVIiLCBOVUxMLCAiSGVhZHBob25lIFBHQSIgfSwKIAorCXsgIkxJTkVPVVQxTiBEcml2ZXIiLCBOVUxMLCAiVk1JRCIgfSwKKwl7ICJMSU5FT1VUMVAgRHJpdmVyIiwgTlVMTCwgIlZNSUQiIH0sCisJeyAiTElORU9VVDJOIERyaXZlciIsIE5VTEwsICJWTUlEIiB9LAorCXsgIkxJTkVPVVQyUCBEcml2ZXIiLCBOVUxMLCAiVk1JRCIgfSwKKwogCXsgIkxJTkVPVVQxTiIsIE5VTEwsICJMSU5FT1VUMU4gRHJpdmVyIiB9LAogCXsgIkxJTkVPVVQxUCIsIE5VTEwsICJMSU5FT1VUMVAgRHJpdmVyIiB9LAogCXsgIkxJTkVPVVQyTiIsIE5VTEwsICJMSU5FT1VUMk4gRHJpdmVyIiB9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAppbmRleCA2NzZiMTI1Li5jNjc0YzdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaApAQCAtMjMsNyArMjMsOCBAQAogCiAvKiBUaGlzICptdXN0KiBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY29kZWMtPnByaXZhdGVfZGF0YSBzdHJ1Y3QgKi8KIHN0cnVjdCB3bV9odWJzX2RhdGEgewotCWludCBkY3NfY29kZXM7CisJaW50IGRjc19jb2Rlc19sOworCWludCBkY3NfY29kZXNfcjsKIAlpbnQgZGNzX3JlYWRiYWNrX21vZGU7CiAJaW50IGhwX3N0YXJ0dXBfbW9kZTsKIAlpbnQgc2VyaWVzX3N0YXJ0dXA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwppbmRleCBmZTc5ODQyLi5mNzhjM2YwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKQEAgLTE1MCw4ICsxNTAsNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYwppbmRleCBkMGQ2MGI4Li4zMDBlMTIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCXN0cnVjdCBkYXZpbmNpX21jYnNwX2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CiAJdW5zaWduZWQgaW50IHBjcjsKIAl1bnNpZ25lZCBpbnQgc3JncjsKKwlib29sIGludl9mcyA9IGZhbHNlOwogCS8qIEF0dGVudGlvbiBzcmdyIGlzIHVwZGF0ZWQgYnkgaHdfcGFyYW1zISAqLwogCXNyZ3IgPSBEQVZJTkNJX01DQlNQX1NSR1JfRlNHTSB8CiAJCURBVklOQ0lfTUNCU1BfU1JHUl9GUEVSKERFRkFVTFRfQklUUEVSU0FNUExFICogMiAtIDEpIHwKQEAgLTMzMCw3ICszMzEsNyBAQAogCQkgKiBtb3JlIGVtcHR5IGJpdCBjbG9jayBzbG90cyBiZXR3ZWVuIGNoYW5uZWxzIGFzIHRoZSBzYW1wbGUKIAkJICogcmF0ZSBpcyBsb3dlcmVkLgogCQkgKi8KLQkJZm10IF49IFNORF9TT0NfREFJRk1UX05CX0lGOworCQlpbnZfZnMgPSB0cnVlOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CiAJCWRldi0+bW9kZSA9IE1PRF9EU1BfQTsKIAkJYnJlYWs7CkBAIC0zOTQsNiArMzk1LDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGludl9mcyA9PSB0cnVlKQorCQlwY3IgXj0gKERBVklOQ0lfTUNCU1BfUENSX0ZTWFAgfCBEQVZJTkNJX01DQlNQX1BDUl9GU1JQKTsKIAlkYXZpbmNpX21jYnNwX3dyaXRlX3JlZyhkZXYsIERBVklOQ0lfTUNCU1BfU1JHUl9SRUcsIHNyZ3IpOwogCWRldi0+cGNyID0gcGNyOwogCWRhdmluY2lfbWNic3Bfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9NQ0JTUF9QQ1JfUkVHLCBwY3IpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCmluZGV4IDg1NjYyMzguLjcxNzNkZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKQEAgLTczMiwxNiArNzMyLDE5IEBACiAJCWRhdmluY2lfaHdfcGFyYW0oZGV2LCBzdWJzdHJlYW0tPnN0cmVhbSk7CiAKIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6CiAJCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDE7CiAJCXdvcmRfbGVuZ3RoID0gREFWSU5DSV9BVURJT19XT1JEXzg7CiAJCWJyZWFrOwogCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1UxNl9MRToKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgogCQlkbWFfcGFyYW1zLT5kYXRhX3R5cGUgPSAyOwogCQl3b3JkX2xlbmd0aCA9IERBVklOQ0lfQVVESU9fV09SRF8xNjsKIAkJYnJlYWs7CiAKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfVTMyX0xFOgogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CiAJCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDQ7CiAJCXdvcmRfbGVuZ3RoID0gREFWSU5DSV9BVURJT19XT1JEXzMyOwpAQCAtODE4LDYgKzgyMSwxMyBAQAogCiB9OwogCisjZGVmaW5lIERBVklOQ0lfTUNBU1BfUENNX0ZNVFMgKFNORFJWX1BDTV9GTVRCSVRfUzggfCBcCisJCQkJU05EUlZfUENNX0ZNVEJJVF9VOCB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFwKKwkJCQlTTkRSVl9QQ01fRk1UQklUX1UzMl9MRSkKKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9tY2FzcF9kYWlbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJkYXZpbmNpLW1jYXNwLjAiLApAQCAtODI1LDE3ICs4MzUsMTMgQEAKIAkJCS5jaGFubmVsc19taW4JPSAyLAogCQkJLmNoYW5uZWxzX21heCAJPSAyLAogCQkJLnJhdGVzIAkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMgCT0gU05EUlZfUENNX0ZNVEJJVF9TOCB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKKwkJCS5mb3JtYXRzCT0gREFWSU5DSV9NQ0FTUF9QQ01fRk1UUywKIAkJfSwKIAkJLmNhcHR1cmUgCT0gewogCQkJLmNoYW5uZWxzX21pbiAJPSAyLAogCQkJLmNoYW5uZWxzX21heCAJPSAyLAogCQkJLnJhdGVzIAkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMJPSBTTkRSVl9QQ01fRk1UQklUX1M4IHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCQkJLmZvcm1hdHMJPSBEQVZJTkNJX01DQVNQX1BDTV9GTVRTLAogCQl9LAogCQkub3BzIAkJPSAmZGF2aW5jaV9tY2FzcF9kYWlfb3BzLAogCkBAIC04NDYsNyArODUyLDcgQEAKIAkJCS5jaGFubmVsc19taW4JPSAxLAogCQkJLmNoYW5uZWxzX21heAk9IDM4NCwKIAkJCS5yYXRlcwkJPSBEQVZJTkNJX01DQVNQX1JBVEVTLAotCQkJLmZvcm1hdHMJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJCS5mb3JtYXRzCT0gREFWSU5DSV9NQ0FTUF9QQ01fRk1UUywKIAkJfSwKIAkJLm9wcyAJCT0gJmRhdmluY2lfbWNhc3BfZGFpX29wcywKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKaW5kZXggYTQ5ZTY2Ny4uZDVmZTA4YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCkBAIC0xODAsNyArMTgwLDYgQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWludCBsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMF07CiAJdW5zaWduZWQgaW50IHBlcmlvZF9zaXplOwogCXVuc2lnbmVkIGludCBkbWFfb2Zmc2V0OwogCWRtYV9hZGRyX3QgZG1hX3BvczsKQEAgLTE5OCw3ICsxOTcsOCBAQAogCWZpZm9fbGV2ZWwgPSBwcnRkLT5wYXJhbXMtPmZpZm9fbGV2ZWw7CiAKIAlwcl9kZWJ1ZygiZGF2aW5jaV9wY206IGF1ZGlvX3NldF9kbWFfcGFyYW1zX3BsYXkgY2hhbm5lbCA9ICVkICIKLQkJImRtYV9wdHIgPSAleCBwZXJpb2Rfc2l6ZT0leFxuIiwgbGluaywgZG1hX3BvcywgcGVyaW9kX3NpemUpOworCQkiZG1hX3B0ciA9ICV4IHBlcmlvZF9zaXplPSV4XG4iLCBwcnRkLT5hc3BfbGlua1swXSwgZG1hX3BvcywKKwkJcGVyaW9kX3NpemUpOwogCiAJZGF0YV90eXBlID0gcHJ0ZC0+cGFyYW1zLT5kYXRhX3R5cGU7CiAJY291bnQgPSBwZXJpb2Rfc2l6ZSAvIGRhdGFfdHlwZTsKQEAgLTIyMiwxNyArMjIyLDE5IEBACiAJfQogCiAJYWNudCA9IHBydGQtPnBhcmFtcy0+YWNudDsKLQllZG1hX3NldF9zcmMobGluaywgc3JjLCBJTkNSLCBXOEJJVCk7Ci0JZWRtYV9zZXRfZGVzdChsaW5rLCBkc3QsIElOQ1IsIFc4QklUKTsKKwllZG1hX3NldF9zcmMocHJ0ZC0+YXNwX2xpbmtbMF0sIHNyYywgSU5DUiwgVzhCSVQpOworCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMF0sIGRzdCwgSU5DUiwgVzhCSVQpOwogCi0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIHNyY19iaWR4LCBzcmNfY2lkeCk7Ci0JZWRtYV9zZXRfZGVzdF9pbmRleChsaW5rLCBkc3RfYmlkeCwgZHN0X2NpZHgpOworCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgc3JjX2JpZHgsIHNyY19jaWR4KTsKKwllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzBdLCBkc3RfYmlkeCwgZHN0X2NpZHgpOwogCiAJaWYgKCFmaWZvX2xldmVsKQotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgYWNudCwgY291bnQsIDEsIDAsIEFTWU5DKTsKKwkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzBdLCBhY250LCBjb3VudCwgMSwgMCwKKwkJCQkJCQlBU1lOQyk7CiAJZWxzZQotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgYWNudCwgZmlmb19sZXZlbCwgY291bnQsCi0JCQkJCQkJZmlmb19sZXZlbCwgQUJTWU5DKTsKKwkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzBdLCBhY250LCBmaWZvX2xldmVsLAorCQkJCQkJCWNvdW50LCBmaWZvX2xldmVsLAorCQkJCQkJCUFCU1lOQyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRhdmluY2lfcGNtX2RtYV9pcnEodW5zaWduZWQgbGluaywgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKQEAgLTMwNSw3ICszMDcsNiBAQAogCXVuc2lnbmVkIGludCBhY250ID0gcGFyYW1zLT5hY250OwogCS8qIGRpdmlkZSBieSAyIGZvciBwaW5nL3BvbmcgKi8KIAl1bnNpZ25lZCBpbnQgcGluZ19zaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSkgPj4gMTsKLQlpbnQgbGluayA9IHBydGQtPmFzcF9saW5rWzFdOwogCXVuc2lnbmVkIGludCBmaWZvX2xldmVsID0gcHJ0ZC0+cGFyYW1zLT5maWZvX2xldmVsOwogCXVuc2lnbmVkIGludCBjb3VudDsKIAlpZiAoKGRhdGFfdHlwZSA9PSAwKSB8fCAoZGF0YV90eXBlID4gNCkpIHsKQEAgLTMxNiwyOCArMzE3LDI2IEBACiAJCWRtYV9hZGRyX3QgYXNwX3NyY19wb25nID0gaXJhbV9kbWEtPmFkZHIgKyBwaW5nX3NpemU7CiAJCXJhbV9zcmNfY2lkeCA9IHBpbmdfc2l6ZTsKIAkJcmFtX2RzdF9jaWR4ID0gLXBpbmdfc2l6ZTsKLQkJZWRtYV9zZXRfc3JjKGxpbmssIGFzcF9zcmNfcG9uZywgSU5DUiwgVzhCSVQpOworCQllZG1hX3NldF9zcmMocHJ0ZC0+YXNwX2xpbmtbMV0sIGFzcF9zcmNfcG9uZywgSU5DUiwgVzhCSVQpOwogCi0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQkJZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIGRhdGFfdHlwZSwgZGF0YV90eXBlICogZmlmb19sZXZlbCk7Ci0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1sxXTsKLQkJZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIGRhdGFfdHlwZSwgZGF0YV90eXBlICogZmlmb19sZXZlbCk7CisJCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAorCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOworCQllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMV0sIGRhdGFfdHlwZSwKKwkJCQlkYXRhX3R5cGUgKiBmaWZvX2xldmVsKTsKIAotCQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JCWVkbWFfc2V0X3NyYyhsaW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKKwkJZWRtYV9zZXRfc3JjKHBydGQtPnJhbV9saW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKIAl9IGVsc2UgewogCQlkbWFfYWRkcl90IGFzcF9kc3RfcG9uZyA9IGlyYW1fZG1hLT5hZGRyICsgcGluZ19zaXplOwogCQlyYW1fc3JjX2NpZHggPSAtcGluZ19zaXplOwogCQlyYW1fZHN0X2NpZHggPSBwaW5nX3NpemU7Ci0JCWVkbWFfc2V0X2Rlc3QobGluaywgYXNwX2RzdF9wb25nLCBJTkNSLCBXOEJJVCk7CisJCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMV0sIGFzcF9kc3RfcG9uZywgSU5DUiwgVzhCSVQpOwogCi0JCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQkJZWRtYV9zZXRfZGVzdF9pbmRleChsaW5rLCBkYXRhX3R5cGUsIGRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOwotCQlsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMV07Ci0JCWVkbWFfc2V0X2Rlc3RfaW5kZXgobGluaywgZGF0YV90eXBlLCBkYXRhX3R5cGUgKiBmaWZvX2xldmVsKTsKKwkJZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAorCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOworCQllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzFdLCBkYXRhX3R5cGUsCisJCQkJZGF0YV90eXBlICogZmlmb19sZXZlbCk7CiAKLQkJbGluayA9IHBydGQtPnJhbV9saW5rOwotCQllZG1hX3NldF9kZXN0KGxpbmssIHJ1bnRpbWUtPmRtYV9hZGRyLCBJTkNSLCBXMzJCSVQpOworCQllZG1hX3NldF9kZXN0KHBydGQtPnJhbV9saW5rLCBydW50aW1lLT5kbWFfYWRkciwgSU5DUiwgVzMyQklUKTsKIAl9CiAKIAlpZiAoIWZpZm9fbGV2ZWwpIHsKQEAgLTM1NCwxMCArMzUzLDkgQEAKIAkJCQljb3VudCwgZmlmb19sZXZlbCwgQUJTWU5DKTsKIAl9CiAKLQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIHBpbmdfc2l6ZSwgcmFtX3NyY19jaWR4KTsKLQllZG1hX3NldF9kZXN0X2luZGV4KGxpbmssIHBpbmdfc2l6ZSwgcmFtX2RzdF9jaWR4KTsKLQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMobGluaywgcGluZ19zaXplLCAyLAorCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5yYW1fbGluaywgcGluZ19zaXplLCByYW1fc3JjX2NpZHgpOworCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgcmFtX2RzdF9jaWR4KTsKKwllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgMiwKIAkJCXJ1bnRpbWUtPnBlcmlvZHMsIDIsIEFTWU5DKTsKIAogCS8qIGluaXQgbWFzdGVyIHBhcmFtcyAqLwpAQCAtNDA2LDMyICs0MDQsMzIgQEAKIHsKIAlkbWFfYWRkcl90IGFzcF9zcmNfcGluZzsKIAlkbWFfYWRkcl90IGFzcF9kc3RfcGluZzsKLQlpbnQgbGluazsKKwlpbnQgcmV0OwogCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpwYXJhbXMgPSBwcnRkLT5wYXJhbXM7CiAKIAkvKiBSZXF1ZXN0IHJhbSBtYXN0ZXIgY2hhbm5lbCAqLwotCWxpbmsgPSBwcnRkLT5yYW1fY2hhbm5lbCA9IGVkbWFfYWxsb2NfY2hhbm5lbChFRE1BX0NIQU5ORUxfQU5ZLAorCXJldCA9IHBydGQtPnJhbV9jaGFubmVsID0gZWRtYV9hbGxvY19jaGFubmVsKEVETUFfQ0hBTk5FTF9BTlksCiAJCQkJICBkYXZpbmNpX3BjbV9kbWFfaXJxLCBzdWJzdHJlYW0sCiAJCQkJICBwcnRkLT5wYXJhbXMtPnJhbV9jaGFuX3EpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MTsKIAogCS8qIFJlcXVlc3QgcmFtIGxpbmsgY2hhbm5lbCAqLwotCWxpbmsgPSBwcnRkLT5yYW1fbGluayA9IGVkbWFfYWxsb2Nfc2xvdCgKKwlyZXQgPSBwcnRkLT5yYW1fbGluayA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5yYW1fY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MjsKIAotCWxpbmsgPSBwcnRkLT5hc3BfbGlua1sxXSA9IGVkbWFfYWxsb2Nfc2xvdCgKKwlyZXQgPSBwcnRkLT5hc3BfbGlua1sxXSA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5hc3BfY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MzsKIAogCXBydGQtPnJhbV9saW5rMiA9IC0xOwogCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWxpbmsgPSBwcnRkLT5yYW1fbGluazIgPSBlZG1hX2FsbG9jX3Nsb3QoCisJCXJldCA9IHBydGQtPnJhbV9saW5rMiA9IGVkbWFfYWxsb2Nfc2xvdCgKIAkJCUVETUFfQ1RMUihwcnRkLT5yYW1fY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCQlpZiAobGluayA8IDApCisJCWlmIChyZXQgPCAwKQogCQkJZ290byBleGl0NDsKIAl9CiAJLyogY2lyY2xlIHBpbmctcG9uZyBidWZmZXJzICovCkBAIC00NDgsMzYgKzQ0NiwzMyBAQAogCQlhc3BfZHN0X3BpbmcgPSBpcmFtX2RtYS0+YWRkcjsKIAl9CiAJLyogcGluZyAqLwotCWxpbmsgPSBwcnRkLT5hc3BfbGlua1swXTsKLQllZG1hX3NldF9zcmMobGluaywgYXNwX3NyY19waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X2Rlc3QobGluaywgYXNwX2RzdF9waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X3NyY19pbmRleChsaW5rLCAwLCAwKTsKLQllZG1hX3NldF9kZXN0X2luZGV4KGxpbmssIDAsIDApOworCWVkbWFfc2V0X3NyYyhwcnRkLT5hc3BfbGlua1swXSwgYXNwX3NyY19waW5nLCBJTkNSLCBXMTZCSVQpOworCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMF0sIGFzcF9kc3RfcGluZywgSU5DUiwgVzE2QklUKTsKKwllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOworCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOwogCi0JZWRtYV9yZWFkX3Nsb3QobGluaywgJnBydGQtPmFzcF9wYXJhbXMpOworCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgJj0gfihUQ0NNT0RFIHwgRURNQV9UQ0MoMHgzZikgfCBUQ0lOVEVOKTsKIAlwcnRkLT5hc3BfcGFyYW1zLm9wdCB8PSBUQ0NIRU4gfAogCQlFRE1BX1RDQyhwcnRkLT5yYW1fY2hhbm5lbCAmIDB4M2YpOwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAKIAkvKiBwb25nICovCi0JbGluayA9IHBydGQtPmFzcF9saW5rWzFdOwotCWVkbWFfc2V0X3NyYyhsaW5rLCBhc3Bfc3JjX3BpbmcsIElOQ1IsIFcxNkJJVCk7Ci0JZWRtYV9zZXRfZGVzdChsaW5rLCBhc3BfZHN0X3BpbmcsIElOQ1IsIFcxNkJJVCk7Ci0JZWRtYV9zZXRfc3JjX2luZGV4KGxpbmssIDAsIDApOwotCWVkbWFfc2V0X2Rlc3RfaW5kZXgobGluaywgMCwgMCk7CisJZWRtYV9zZXRfc3JjKHBydGQtPmFzcF9saW5rWzFdLCBhc3Bfc3JjX3BpbmcsIElOQ1IsIFcxNkJJVCk7CisJZWRtYV9zZXRfZGVzdChwcnRkLT5hc3BfbGlua1sxXSwgYXNwX2RzdF9waW5nLCBJTkNSLCBXMTZCSVQpOworCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7CisJZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7CiAKLQllZG1hX3JlYWRfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV9yZWFkX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMV0sICZwcnRkLT5hc3BfcGFyYW1zKTsKIAlwcnRkLT5hc3BfcGFyYW1zLm9wdCAmPSB+KFRDQ01PREUgfCBFRE1BX1RDQygweDNmKSk7CiAJLyogaW50ZXJydXB0IGFmdGVyIGV2ZXJ5IHBvbmcgY29tcGxldGlvbiAqLwogCXBydGQtPmFzcF9wYXJhbXMub3B0IHw9IFRDSU5URU4gfCBUQ0NIRU4gfAogCQlFRE1BX1RDQyhwcnRkLT5yYW1fY2hhbm5lbCAmIDB4M2YpOwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzFdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAKIAkvKiByYW0gKi8KLQlsaW5rID0gcHJ0ZC0+cmFtX2xpbms7Ci0JZWRtYV9zZXRfc3JjKGxpbmssIGlyYW1fZG1hLT5hZGRyLCBJTkNSLCBXMzJCSVQpOwotCWVkbWFfc2V0X2Rlc3QobGluaywgaXJhbV9kbWEtPmFkZHIsIElOQ1IsIFczMkJJVCk7CisJZWRtYV9zZXRfc3JjKHBydGQtPnJhbV9saW5rLCBpcmFtX2RtYS0+YWRkciwgSU5DUiwgVzMyQklUKTsKKwllZG1hX3NldF9kZXN0KHBydGQtPnJhbV9saW5rLCBpcmFtX2RtYS0+YWRkciwgSU5DUiwgVzMyQklUKTsKIAlwcl9kZWJ1ZygiJXM6IGF1ZGlvIGRtYSBjaGFubmVscy9zbG90cyBpbiB1c2UgZm9yIHJhbToldSAldSAldSwiCiAJCSJmb3IgYXNwOiV1ICV1ICV1XG4iLCBfX2Z1bmNfXywKIAkJcHJ0ZC0+cmFtX2NoYW5uZWwsIHBydGQtPnJhbV9saW5rLCBwcnRkLT5yYW1fbGluazIsCkBAIC00OTQsNyArNDg5LDcgQEAKIAllZG1hX2ZyZWVfY2hhbm5lbChwcnRkLT5yYW1fY2hhbm5lbCk7CiAJcHJ0ZC0+cmFtX2NoYW5uZWwgPSAtMTsKIGV4aXQxOgotCXJldHVybiBsaW5rOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZGF2aW5jaV9wY21fZG1hX3JlcXVlc3Qoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC01MDIsMjIgKzQ5NywyMiBAQAogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWE7CiAJc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKLQlpbnQgbGluazsKKwlpbnQgcmV0OwogCiAJaWYgKCFwYXJhbXMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogUmVxdWVzdCBhc3AgbWFzdGVyIERNQSBjaGFubmVsICovCi0JbGluayA9IHBydGQtPmFzcF9jaGFubmVsID0gZWRtYV9hbGxvY19jaGFubmVsKHBhcmFtcy0+Y2hhbm5lbCwKKwlyZXQgPSBwcnRkLT5hc3BfY2hhbm5lbCA9IGVkbWFfYWxsb2NfY2hhbm5lbChwYXJhbXMtPmNoYW5uZWwsCiAJCQlkYXZpbmNpX3BjbV9kbWFfaXJxLCBzdWJzdHJlYW0sCiAJCQlwcnRkLT5wYXJhbXMtPmFzcF9jaGFuX3EpOwotCWlmIChsaW5rIDwgMCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBleGl0MTsKIAogCS8qIFJlcXVlc3QgYXNwIGxpbmsgY2hhbm5lbHMgKi8KLQlsaW5rID0gcHJ0ZC0+YXNwX2xpbmtbMF0gPSBlZG1hX2FsbG9jX3Nsb3QoCisJcmV0ID0gcHJ0ZC0+YXNwX2xpbmtbMF0gPSBlZG1hX2FsbG9jX3Nsb3QoCiAJCQlFRE1BX0NUTFIocHJ0ZC0+YXNwX2NoYW5uZWwpLCBFRE1BX1NMT1RfQU5ZKTsKLQlpZiAobGluayA8IDApCisJaWYgKHJldCA8IDApCiAJCWdvdG8gZXhpdDI7CiAKIAlpcmFtX2RtYSA9IChzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKilzdWJzdHJlYW0tPmRtYV9idWZmZXIucHJpdmF0ZV9kYXRhOwpAQCAtNTM3LDE3ICs1MzIsMTcgQEAKIAkgKiB0aGUgYnVmZmVyIGFuZCBpdHMgbGVuZ3RoIChjY250KSAuLi4gdXNlIGl0IGFzIGEgdGVtcGxhdGUKIAkgKiBzbyBkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYSgpIHRha2VzIGxlc3MgdGltZSBpbiBJUlEuCiAJICovCi0JZWRtYV9yZWFkX3Nsb3QobGluaywgJnBydGQtPmFzcF9wYXJhbXMpOworCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CiAJcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgfD0gVENJTlRFTiB8CiAJCUVETUFfVENDKEVETUFfQ0hBTl9TTE9UKHBydGQtPmFzcF9jaGFubmVsKSk7Ci0JcHJ0ZC0+YXNwX3BhcmFtcy5saW5rX2JjbnRybGQgPSBFRE1BX0NIQU5fU0xPVChsaW5rKSA8PCA1OwotCWVkbWFfd3JpdGVfc2xvdChsaW5rLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7CisJcHJ0ZC0+YXNwX3BhcmFtcy5saW5rX2JjbnRybGQgPSBFRE1BX0NIQU5fU0xPVChwcnRkLT5hc3BfbGlua1swXSkgPDwgNTsKKwllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMF0sICZwcnRkLT5hc3BfcGFyYW1zKTsKIAlyZXR1cm4gMDsKIGV4aXQyOgogCWVkbWFfZnJlZV9jaGFubmVsKHBydGQtPmFzcF9jaGFubmVsKTsKIAlwcnRkLT5hc3BfY2hhbm5lbCA9IC0xOwogZXhpdDE6Ci0JcmV0dXJuIGxpbms7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkYXZpbmNpX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lZGI5M3h4LmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYwppbmRleCBkM2FhMTUxLi41MTkzMGI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VkYjkzeHguYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTI4LDEyICsyOSw2IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImVwOTN4eC1wY20uaCIKIAotI2RlZmluZSBlZGI5M3h4X2hhc19hdWRpbygpIChtYWNoaW5lX2lzX2VkYjkzMDEoKSB8fAlcCi0JCQkgICAgIG1hY2hpbmVfaXNfZWRiOTMwMigpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzAyYSgpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzA3YSgpIHx8CVwKLQkJCSAgICAgbWFjaGluZV9pc19lZGI5MzE1YSgpKQotCiBzdGF0aWMgaW50IGVkYjkzeHhfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTk0LDQ5ICs4OSw2MSBAQAogCS5udW1fbGlua3MJPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVkYjkzeHhfc25kX2RldmljZTsKLQotc3RhdGljIGludCBfX2luaXQgZWRiOTN4eF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZGI5M3h4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzbmRfc29jX2VkYjkzeHg7CiAJaW50IHJldDsKIAotCWlmICghZWRiOTN4eF9oYXNfYXVkaW8oKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZXQgPSBlcDkzeHhfaTJzX2FjcXVpcmUoRVA5M1hYX1NZU0NPTl9ERVZDRkdfSTJTT05BQzk3LAogCQkJCSBFUDkzWFhfU1lTQ09OX0kyU0NMS0RJVl9PUklERSB8CiAJCQkJIEVQOTNYWF9TWVNDT05fSTJTQ0xLRElWX1NQT0wpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQllZGI5M3h4X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKLQlpZiAoIWVkYjkzeHhfc25kX2RldmljZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfaTJzOworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAorCQkJcmV0KTsKKwkJZXA5M3h4X2kyc19yZWxlYXNlKCk7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZWRiOTN4eF9zbmRfZGV2aWNlLCAmc25kX3NvY19lZGI5M3h4KTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVkYjkzeHhfc25kX2RldmljZSk7Ci0JaWYgKHJldCkKLQkJZ290byBkZXZpY2VfcHV0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGVkYjkzeHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisJZXA5M3h4X2kyc19yZWxlYXNlKCk7CiAKIAlyZXR1cm4gMDsKK30KIAotZGV2aWNlX3B1dDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGVkYjkzeHhfc25kX2RldmljZSk7Ci1mcmVlX2kyczoKLQllcDkzeHhfaTJzX3JlbGVhc2UoKTsKLQlyZXR1cm4gcmV0Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWRiOTN4eF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImVkYjkzeHgtYXVkaW8iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBlZGI5M3h4X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZWRiOTN4eF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWRiOTN4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWRiOTN4eF9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoZWRiOTN4eF9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGVkYjkzeHhfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGVkYjkzeHhfc25kX2RldmljZSk7Ci0JZXA5M3h4X2kyc19yZWxlYXNlKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVkYjkzeHhfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KGVkYjkzeHhfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBTdmVyZGxpbiA8c3ViYXBhcnRzQHlhbmRleC5ydT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgRURCOTN4eCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplZGI5M3h4LWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1hYzk3LmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1hYzk3LmMKaW5kZXggYzc0MTdjNy4uM2NkNjE1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWFjOTcuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJLnRyaWdnZXIJPSBlcDkzeHhfYWM5N190cmlnZ2VyLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBlcDkzeHhfYWM5N19kYWkgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBlcDkzeHhfYWM5N19kYWkgPSB7CiAJLm5hbWUJCT0gImVwOTN4eC1hYzk3IiwKIAkuaWQJCT0gMCwKIAkuYWM5N19jb250cm9sCT0gMSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LXBjbS5jIGIvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKaW5kZXggOGRmZDNhZC4uZDAwMjMwYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKKysrIGIvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMKQEAgLTM1NSwzICszNTUsNCBAQAogTU9EVUxFX0FVVEhPUigiUnlhbiBNYWxsb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRVA5M3h4IEFMU0EgUENNIGludGVyZmFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTplcDkzeHgtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L3NpbW9uZS5jIGIvc291bmQvc29jL2VwOTN4eC9zaW1vbmUuYwppbmRleCAyODY4MTc5Li45NjhjYjMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L3NpbW9uZS5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvc2ltb25lLmMKQEAgLTM5LDUzICszOSw2MSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNpbW9uZV9zbmRfYWM5N19kZXZpY2U7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2ltb25lX3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpbW9uZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zaW1vbmU7CisJaW50IHJldDsKKworCXNpbW9uZV9zbmRfYWM5N19kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJhYzk3LWNvZGVjIiwKKwkJCQkJCQkJIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpKQorCQlyZXR1cm4gUFRSX0VSUihzaW1vbmVfc25kX2FjOTdfZGV2aWNlKTsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAorCQkJcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2ltb25lX3NuZF9hYzk3X2RldmljZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2ltb25lX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNpbW9uZV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNpbW9uZS1hdWRpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNpbW9uZV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNpbW9uZV9yZW1vdmUpLAorfTsKIAogc3RhdGljIGludCBfX2luaXQgc2ltb25lX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JaWYgKCFtYWNoaW5lX2lzX3NpbV9vbmUoKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlzaW1vbmVfc25kX2FjOTdfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJhYzk3LWNvZGVjIiwgLTEpOwotCWlmICghc2ltb25lX3NuZF9hYzk3X2RldmljZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDE7Ci0KLQlzaW1vbmVfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOwotCWlmICghc2ltb25lX3NuZF9kZXZpY2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsMjsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShzaW1vbmVfc25kX2RldmljZSwgJnNuZF9zb2Nfc2ltb25lKTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNpbW9uZV9zbmRfZGV2aWNlKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWwzOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWwzOgotCXBsYXRmb3JtX2RldmljZV9wdXQoc2ltb25lX3NuZF9kZXZpY2UpOwotZmFpbDI6Ci0JcGxhdGZvcm1fZGV2aWNlX2RlbChzaW1vbmVfc25kX2FjOTdfZGV2aWNlKTsKLWZhaWwxOgotCXBsYXRmb3JtX2RldmljZV9wdXQoc2ltb25lX3NuZF9hYzk3X2RldmljZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaW1vbmVfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KHNpbW9uZV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHNpbW9uZV9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2ltb25lX3NuZF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNpbW9uZV9zbmRfYWM5N19kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaW1vbmVfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KHNpbW9uZV9leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTaW1wbGVtYWNoaW5lcyBTaW0uT25lIik7CiBNT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0Bpa2kuZmk+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNpbW9uZS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jCmluZGV4IGM4YWE4YTUuLjJjZGU0MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9lcDkzeHgvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L3NuYXBwZXJjbDE1LmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMTA0LDM3ICsxMDUsNTYgQEAKIAkubnVtX2xpbmtzCT0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmFwcGVyY2wxNV9zbmRfZGV2aWNlOwotCi1zdGF0aWMgaW50IF9faW5pdCBzbmFwcGVyY2wxNV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmFwcGVyY2wxNV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zbmFwcGVyY2wxNTsKIAlpbnQgcmV0OwogCi0JaWYgKCFtYWNoaW5lX2lzX3NuYXBwZXJfY2wxNSgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXJldCA9IGVwOTN4eF9pMnNfYWNxdWlyZShFUDkzWFhfU1lTQ09OX0RFVkNGR19JMlNPTkFDOTcsCiAJCQkJIEVQOTNYWF9TWVNDT05fSTJTQ0xLRElWX09SSURFIHwKIAkJCQkgRVA5M1hYX1NZU0NPTl9JMlNDTEtESVZfU1BPTCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNuYXBwZXJjbDE1X3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKLQlpZiAoIXNuYXBwZXJjbDE1X3NuZF9kZXZpY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHNuYXBwZXJjbDE1X3NuZF9kZXZpY2UsICZzbmRfc29jX3NuYXBwZXJjbDE1KTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNuYXBwZXJjbDE1X3NuZF9kZXZpY2UpOwotCWlmIChyZXQpCi0JCXBsYXRmb3JtX2RldmljZV9wdXQoc25hcHBlcmNsMTVfc25kX2RldmljZSk7CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDogJWRcbiIsCisJCQlyZXQpOworCQllcDkzeHhfaTJzX3JlbGVhc2UoKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmFwcGVyY2wxNV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKwllcDkzeHhfaTJzX3JlbGVhc2UoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmFwcGVyY2wxNV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNuYXBwZXJjbDE1LWF1ZGlvIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gc25hcHBlcmNsMTVfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmFwcGVyY2wxNV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc25hcHBlcmNsMTVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuYXBwZXJjbDE1X2RyaXZlcik7Cit9CisKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbmFwcGVyY2wxNV9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc25hcHBlcmNsMTVfc25kX2RldmljZSk7Ci0JZXA5M3h4X2kyc19yZWxlYXNlKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuYXBwZXJjbDE1X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHNuYXBwZXJjbDE1X2luaXQpOwpAQCAtMTQzLDQgKzE2Myw0IEBACiBNT0RVTEVfQVVUSE9SKCJSeWFuIE1hbGxvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTbmFwcGVyIENMMTUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzbmFwcGVyY2wxNS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfZG1hLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwppbmRleCBjYjUwNTk4Li5lZjE1NDAyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9kbWEuYwpAQCAtMjk3LDcgKzI5Nyw2IEBACiBzdGF0aWMgaW50IGZzbF9kbWFfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJc3RhdGljIHU2NCBmc2xfZG1hX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzYpOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCmluZGV4IGQ0OGFmZWEuLjAyNjhjZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCkBAIC03OCw3ICs3OCw2IEBACiAgKiBAc2Vjb25kX3N0cmVhbTogcG9pbnRlciB0byBzZWNvbmQgc3RyZWFtCiAgKiBAcGxheWJhY2s6IHRoZSBudW1iZXIgb2YgcGxheWJhY2sgc3RyZWFtcyBvcGVuZWQKICAqIEBjYXB0dXJlOiB0aGUgbnVtYmVyIG9mIGNhcHR1cmUgc3RyZWFtcyBvcGVuZWQKLSAqIEBhc3luY2hyb25vdXM6IDA9c3luY2hyb25vdXMgbW9kZSwgMT1hc3luY2hyb25vdXMgbW9kZQogICogQGNwdV9kYWk6IHRoZSBDUFUgREFJIGZvciB0aGlzIGRldmljZQogICogQGRldl9hdHRyOiB0aGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUKICAqIEBzdGF0czogU1NJIHN0YXRpc3RpY3MKQEAgLTkwLDkgKzg5LDYgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqZmlyc3Rfc3RyZWFtOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc2Vjb25kX3N0cmVhbTsKLQl1bnNpZ25lZCBpbnQgcGxheWJhY2s7Ci0JdW5zaWduZWQgaW50IGNhcHR1cmU7Ci0JaW50IGFzeW5jaHJvbm91czsKIAl1bnNpZ25lZCBpbnQgZmlmb19kZXB0aDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGNwdV9kYWlfZHJ2OwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwpAQCAtMjgxLDI0ICsyNzcsMTggQEAKIAkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZnNsX3NzaV9wcml2YXRlICpzc2lfcHJpdmF0ZSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CisJc3RydWN0IGZzbF9zc2lfcHJpdmF0ZSAqc3NpX3ByaXZhdGUgPQorCQlzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShydGQtPmNwdV9kYWkpOworCWludCBzeW5jaHJvbm91cyA9IHNzaV9wcml2YXRlLT5jcHVfZGFpX2Rydi5zeW1tZXRyaWNfcmF0ZXM7CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN0cmVhbSBvcGVuZWQsIHRoZW4gcmVxdWVzdCB0aGUgSVJRCiAJICogYW5kIGluaXRpYWxpemUgdGhlIFNTSSByZWdpc3RlcnMuCiAJICovCi0JaWYgKCFzc2lfcHJpdmF0ZS0+cGxheWJhY2sgJiYgIXNzaV9wcml2YXRlLT5jYXB0dXJlKSB7CisJaWYgKCFzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtKSB7CiAJCXN0cnVjdCBjY3NyX3NzaSBfX2lvbWVtICpzc2kgPSBzc2lfcHJpdmF0ZS0+c3NpOwotCQlpbnQgcmV0OwogCi0JCS8qIFRoZSAnbmFtZScgc2hvdWxkIG5vdCBoYXZlIGFueSBzbGFzaGVzIGluIGl0LiAqLwotCQlyZXQgPSByZXF1ZXN0X2lycShzc2lfcHJpdmF0ZS0+aXJxLCBmc2xfc3NpX2lzciwgMCwKLQkJCQkgIHNzaV9wcml2YXRlLT5uYW1lLCBzc2lfcHJpdmF0ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCi0JCQkJImNvdWxkIG5vdCBjbGFpbSBpcnEgJXVcbiIsIHNzaV9wcml2YXRlLT5pcnEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtID0gc3Vic3RyZWFtOwogCiAJCS8qCiAJCSAqIFNlY3Rpb24gMTYuNSBvZiB0aGUgTVBDODYxMCByZWZlcmVuY2UgbWFudWFsIHNheXMgdGhhdCB0aGUKQEAgLTMxNiw3ICszMDYsNyBAQAogCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c2NyLAogCQkJQ0NTUl9TU0lfU0NSX0kyU19NT0RFX01BU0sgfCBDQ1NSX1NTSV9TQ1JfU1lOLAogCQkJQ0NTUl9TU0lfU0NSX1RGUl9DTEtfRElTIHwgQ0NTUl9TU0lfU0NSX0kyU19NT0RFX1NMQVZFCi0JCQl8IChzc2lfcHJpdmF0ZS0+YXN5bmNocm9ub3VzID8gMCA6IENDU1JfU1NJX1NDUl9TWU4pKTsKKwkJCXwgKHN5bmNocm9ub3VzID8gQ0NTUl9TU0lfU0NSX1NZTiA6IDApKTsKIAogCQlvdXRfYmUzMigmc3NpLT5zdGNyLAogCQkJIENDU1JfU1NJX1NUQ1JfVFhCSVQwIHwgQ0NTUl9TU0lfU1RDUl9URkVOMCB8CkBAIC0zMzMsNyArMzIzLDcgQEAKIAkJICogbWFzdGVyLgogCQkgKi8KIAotCQkvKiA0LiBFbmFibGUgdGhlIGludGVycnVwdHMgYW5kIERNQSByZXF1ZXN0cyAqLworCQkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgYW5kIERNQSByZXF1ZXN0cyAqLwogCQlvdXRfYmUzMigmc3NpLT5zaWVyLCBTSUVSX0ZMQUdTKTsKIAogCQkvKgpAQCAtMzYyLDU4ICszNTIsNDcgQEAKIAkJICogdGhpcyBpcyBiYWQgaXMgYmVjYXVzZSBhdCB0aGlzIHBvaW50LCB0aGUgUENNIGRyaXZlciBoYXMgbm90CiAJCSAqIGZpbmlzaGVkIGluaXRpYWxpemluZyB0aGUgRE1BIGNvbnRyb2xsZXIuCiAJCSAqLwotCX0KKwl9IGVsc2UgeworCQlpZiAoc3luY2hyb25vdXMpIHsKKwkJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKmZpcnN0X3J1bnRpbWUgPQorCQkJCXNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0tPnJ1bnRpbWU7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgc2Vjb25kIHN0cmVhbSBvcGVuLCBhbmQgd2UncmUgaW4KKwkJCSAqIHN5bmNocm9ub3VzIG1vZGUsIHNvIHdlIG5lZWQgdG8gaW1wb3NlIHNhbXBsZQorCQkJICogc2FtcGxlIHNpemUgY29uc3RyYWludHMuIFRoaXMgaXMgYmVjYXVzZSBTVENDUiBpcworCQkJICogdXNlZCBmb3IgcGxheWJhY2sgYW5kIGNhcHR1cmUgaW4gc3luY2hyb25vdXMgbW9kZSwKKwkJCSAqIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIHNwZWNpZnkgZGlmZmVyZW50IHdvcmQKKwkJCSAqIGxlbmd0aHMuCisJCQkgKgorCQkJICogTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gaWYgdGhlCisJCQkgKiBzZWNvbmQgc3RyZWFtIGlzIG9wZW5lZCBiZWZvcmUgdGhlIGZpcnN0IHN0cmVhbSBpcworCQkJICogZnVsbHkgaW5pdGlhbGl6ZWQuICBXZSBwcm92aWRlIHNvbWUgcHJvdGVjdGlvbiBieQorCQkJICogY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoZSBmaXJzdCBzdHJlYW0gaXMKKwkJCSAqIGluaXRpYWxpemVkLCBidXQgaXQncyBub3QgcGVyZmVjdC4gIEFMU0Egc29tZXRpbWVzCisJCQkgKiByZS1pbml0aWFsaXplcyB0aGUgZHJpdmVyIHdpdGggYSBkaWZmZXJlbnQgc2FtcGxlCisJCQkgKiByYXRlIG9yIHNpemUuICBJZiB0aGUgc2Vjb25kIHN0cmVhbSBpcyBvcGVuZWQKKwkJCSAqIGJlZm9yZSB0aGUgZmlyc3Qgc3RyZWFtIGhhcyByZWNlaXZlZCBpdHMgZmluYWwKKwkJCSAqIHBhcmFtZXRlcnMsIHRoZW4gdGhlIHNlY29uZCBzdHJlYW0gbWF5IGJlCisJCQkgKiBjb25zdHJhaW5lZCB0byB0aGUgd3Jvbmcgc2FtcGxlIHJhdGUgb3Igc2l6ZS4KKwkJCSAqLworCQkJaWYgKCFmaXJzdF9ydW50aW1lLT5zYW1wbGVfYml0cykgeworCQkJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKKwkJCQkJInNldCBzYW1wbGUgc2l6ZSBpbiAlcyBzdHJlYW0gZmlyc3RcbiIsCisJCQkJCXN1YnN0cmVhbS0+c3RyZWFtID09CisJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJCQkJPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KIAotCWlmICghc3NpX3ByaXZhdGUtPmZpcnN0X3N0cmVhbSkKLQkJc3NpX3ByaXZhdGUtPmZpcnN0X3N0cmVhbSA9IHN1YnN0cmVhbTsKLQllbHNlIHsKLQkJLyogVGhpcyBpcyB0aGUgc2Vjb25kIHN0cmVhbSBvcGVuLCBzbyB3ZSBuZWVkIHRvIGltcG9zZSBzYW1wbGUKLQkJICogcmF0ZSBhbmQgbWF5YmUgc2FtcGxlIHNpemUgY29uc3RyYWludHMuICBOb3RlIHRoYXQgdGhpcyBjYW4KLQkJICogY2F1c2UgYSByYWNlIGNvbmRpdGlvbiBpZiB0aGUgc2Vjb25kIHN0cmVhbSBpcyBvcGVuZWQgYmVmb3JlCi0JCSAqIHRoZSBmaXJzdCBzdHJlYW0gaXMgZnVsbHkgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIFdlIHByb3ZpZGUgc29tZSBwcm90ZWN0aW9uIGJ5IGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgZmlyc3QKLQkJICogc3RyZWFtIGlzIGluaXRpYWxpemVkLCBidXQgaXQncyBub3QgcGVyZmVjdC4gIEFMU0Egc29tZXRpbWVzCi0JCSAqIHJlLWluaXRpYWxpemVzIHRoZSBkcml2ZXIgd2l0aCBhIGRpZmZlcmVudCBzYW1wbGUgcmF0ZSBvcgotCQkgKiBzaXplLiAgSWYgdGhlIHNlY29uZCBzdHJlYW0gaXMgb3BlbmVkIGJlZm9yZSB0aGUgZmlyc3Qgc3RyZWFtCi0JCSAqIGhhcyByZWNlaXZlZCBpdHMgZmluYWwgcGFyYW1ldGVycywgdGhlbiB0aGUgc2Vjb25kIHN0cmVhbSBtYXkKLQkJICogYmUgY29uc3RyYWluZWQgdG8gdGhlIHdyb25nIHNhbXBsZSByYXRlIG9yIHNpemUuCi0JCSAqCi0JCSAqIEZJWE1FOiBUaGlzIGNvZGUgZG9lcyBub3QgaGFuZGxlIG9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyZWFtcwotCQkgKiByZXBlYXRlZGx5LiAgSWYgeW91IG9wZW4gdHdvIHN0cmVhbXMgYW5kIHRoZW4gY2xvc2UgdGhlIGZpcnN0Ci0JCSAqIG9uZSwgeW91IG1heSBub3QgYmUgYWJsZSB0byBvcGVuIGFub3RoZXIgc3RyZWFtIHVudGlsIHlvdQotCQkgKiBjbG9zZSB0aGUgc2Vjb25kIG9uZSBhcyB3ZWxsLgotCQkgKi8KLQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqZmlyc3RfcnVudGltZSA9Ci0JCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtLT5ydW50aW1lOwotCi0JCWlmICghZmlyc3RfcnVudGltZS0+c2FtcGxlX2JpdHMpIHsKLQkJCWRldl9lcnIoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCQkic2V0IHNhbXBsZSBzaXplIGluICVzIHN0cmVhbSBmaXJzdFxuIiwKLQkJCQlzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLCi0JCQkJPyAiY2FwdHVyZSIgOiAicGxheWJhY2siKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJLyogSWYgd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSwgdGhlbiB3ZSBuZWVkIHRvIGNvbnN0cmFpbgotCQkgKiB0aGUgc2FtcGxlIHNpemUgYXMgd2VsbC4gIFdlIGRvbid0IHN1cHBvcnQgaW5kZXBlbmRlbnQgc2FtcGxlCi0JCSAqIHJhdGVzIGluIGFzeW5jaHJvbm91cyBtb2RlLgotCQkgKi8KLQkJaWYgKCFzc2lfcHJpdmF0ZS0+YXN5bmNocm9ub3VzKQogCQkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX1NBTVBMRV9CSVRTLAogCQkJCWZpcnN0X3J1bnRpbWUtPnNhbXBsZV9iaXRzLAogCQkJCWZpcnN0X3J1bnRpbWUtPnNhbXBsZV9iaXRzKTsKKwkJfQogCiAJCXNzaV9wcml2YXRlLT5zZWNvbmRfc3RyZWFtID0gc3Vic3RyZWFtOwogCX0KIAotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlzc2lfcHJpdmF0ZS0+cGxheWJhY2srKzsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXNzaV9wcml2YXRlLT5jYXB0dXJlKys7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDM0LDI0ICs0MTMsMzUgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQogewogCXN0cnVjdCBmc2xfc3NpX3ByaXZhdGUgKnNzaV9wcml2YXRlID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7CisJdW5zaWduZWQgaW50IHNhbXBsZV9zaXplID0KKwkJc25kX3BjbV9mb3JtYXRfd2lkdGgocGFyYW1zX2Zvcm1hdChod19wYXJhbXMpKTsKKwl1MzIgd2wgPSBDQ1NSX1NTSV9TeENDUl9XTChzYW1wbGVfc2l6ZSk7CisJaW50IGVuYWJsZWQgPSBpbl9iZTMyKCZzc2ktPnNjcikgJiBDQ1NSX1NTSV9TQ1JfU1NJRU47CiAKLQlpZiAoc3Vic3RyZWFtID09IHNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0pIHsKLQkJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7Ci0JCXVuc2lnbmVkIGludCBzYW1wbGVfc2l6ZSA9Ci0JCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcykpOwotCQl1MzIgd2wgPSBDQ1NSX1NTSV9TeENDUl9XTChzYW1wbGVfc2l6ZSk7CisJLyoKKwkgKiBJZiB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbmQgdGhlIFNTSSBpcyBhbHJlYWR5IGVuYWJsZWQsCisJICogdGhlbiBTVENDUiBpcyBhbHJlYWR5IHNldCBwcm9wZXJseS4KKwkgKi8KKwlpZiAoZW5hYmxlZCAmJiBzc2lfcHJpdmF0ZS0+Y3B1X2RhaV9kcnYuc3ltbWV0cmljX3JhdGVzKQorCQlyZXR1cm4gMDsKIAotCQkvKiBUaGUgU1NJIHNob3VsZCBhbHdheXMgYmUgZGlzYWJsZWQgYXQgdGhpcyBwb2ludHMgKFNTSUVOPTApICovCisJLyoKKwkgKiBGSVhNRTogVGhlIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IFN4Q0NSW1dMXSBzaG91bGQgbm90IGJlCisJICogbW9kaWZpZWQgd2hpbGUgdGhlIFNTSSBpcyBlbmFibGVkLiAgVGhlIG9ubHkgdGltZSB0aGlzIGNhbgorCSAqIGhhcHBlbiBpcyBpZiB3ZSdyZSB0cnlpbmcgdG8gZG8gc2ltdWx0YW5lb3VzIHBsYXliYWNrIGFuZAorCSAqIGNhcHR1cmUgaW4gYXN5bmNocm9ub3VzIG1vZGUuICBVbmZvcnR1bmF0ZWx5LCBJIGhhdmUgYmVlbiBlbmFibGUKKwkgKiB0byBnZXQgdGhhdCB0byB3b3JrIGF0IGFsbCBvbiB0aGUgUDEwMjJEUy4gIFRoZXJlZm9yZSwgd2UgZG9uJ3QKKwkgKiBib3RoZXIgdG8gZGlzYWJsZS9lbmFibGUgdGhlIFNTSSB3aGVuIHNldHRpbmcgU3hDQ1JbV0xdLCBiZWNhdXNlCisJICogdGhlIFNTSSB3aWxsIHN0b3AgYW55d2F5LiAgTWF5YmUgb25lIGRheSwgdGhpcyB3aWxsIGdldCBmaXhlZC4KKwkgKi8KIAotCQkvKiBJbiBzeW5jaHJvbm91cyBtb2RlLCB0aGUgU1NJIHVzZXMgU1RDQ1IgZm9yIGNhcHR1cmUgKi8KLQkJaWYgKChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB8fAotCQkgICAgIXNzaV9wcml2YXRlLT5hc3luY2hyb25vdXMpCi0JCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c3RjY3IsCi0JCQkJCUNDU1JfU1NJX1N4Q0NSX1dMX01BU0ssIHdsKTsKLQkJZWxzZQotCQkJY2xyc2V0Yml0c19iZTMyKCZzc2ktPnNyY2NyLAotCQkJCQlDQ1NSX1NTSV9TeENDUl9XTF9NQVNLLCB3bCk7Ci0JfQorCS8qIEluIHN5bmNocm9ub3VzIG1vZGUsIHRoZSBTU0kgdXNlcyBTVENDUiBmb3IgY2FwdHVyZSAqLworCWlmICgoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgfHwKKwkgICAgc3NpX3ByaXZhdGUtPmNwdV9kYWlfZHJ2LnN5bW1ldHJpY19yYXRlcykKKwkJY2xyc2V0Yml0c19iZTMyKCZzc2ktPnN0Y2NyLCBDQ1NSX1NTSV9TeENDUl9XTF9NQVNLLCB3bCk7CisJZWxzZQorCQljbHJzZXRiaXRzX2JlMzIoJnNzaS0+c3JjY3IsIENDU1JfU1NJX1N4Q0NSX1dMX01BU0ssIHdsKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDc0LDcgKzQ2NCw2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWNscmJpdHMzMigmc3NpLT5zY3IsIENDU1JfU1NJX1NDUl9TU0lFTik7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgogCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKIAkJCXNldGJpdHMzMigmc3NpLT5zY3IsCkBAIC01MTAsMjcgKzQ5OSwxOCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZnNsX3NzaV9wcml2YXRlICpzc2lfcHJpdmF0ZSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CiAKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJc3NpX3ByaXZhdGUtPnBsYXliYWNrLS07Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlzc2lfcHJpdmF0ZS0+Y2FwdHVyZS0tOwotCiAJaWYgKHNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0gPT0gc3Vic3RyZWFtKQogCQlzc2lfcHJpdmF0ZS0+Zmlyc3Rfc3RyZWFtID0gc3NpX3ByaXZhdGUtPnNlY29uZF9zdHJlYW07CiAKIAlzc2lfcHJpdmF0ZS0+c2Vjb25kX3N0cmVhbSA9IE5VTEw7CiAKIAkvKgotCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIHN1YnN0cmVhbSwgZGlzYWJsZSB0aGUgU1NJIGFuZCByZWxlYXNlCi0JICogdGhlIElSUS4KKwkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBzdWJzdHJlYW0sIGRpc2FibGUgdGhlIFNTSS4KIAkgKi8KLQlpZiAoIXNzaV9wcml2YXRlLT5wbGF5YmFjayAmJiAhc3NpX3ByaXZhdGUtPmNhcHR1cmUpIHsKKwlpZiAoIXNzaV9wcml2YXRlLT5maXJzdF9zdHJlYW0pIHsKIAkJc3RydWN0IGNjc3Jfc3NpIF9faW9tZW0gKnNzaSA9IHNzaV9wcml2YXRlLT5zc2k7CiAKIAkJY2xyYml0czMyKCZzc2ktPnNjciwgQ0NTUl9TU0lfU0NSX1NTSUVOKTsKLQotCQlmcmVlX2lycShzc2lfcHJpdmF0ZS0+aXJxLCBzc2lfcHJpdmF0ZSk7CiAJfQogfQogCkBAIC02NzUsMjIgKzY1NSwzMyBAQAogCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGRldGVybWluZSBkZXZpY2UgcmVzb3VyY2VzXG4iKTsKLQkJa2ZyZWUoc3NpX3ByaXZhdGUpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX2ttYWxsb2M7CiAJfQogCXNzaV9wcml2YXRlLT5zc2kgPSBvZl9pb21hcChucCwgMCk7CiAJaWYgKCFzc2lfcHJpdmF0ZS0+c3NpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgZGV2aWNlIHJlc291cmNlc1xuIik7Ci0JCWtmcmVlKHNzaV9wcml2YXRlKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfa21hbGxvYzsKIAl9CiAJc3NpX3ByaXZhdGUtPnNzaV9waHlzID0gcmVzLnN0YXJ0OworCiAJc3NpX3ByaXZhdGUtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlpZiAoc3NpX3ByaXZhdGUtPmlycSA9PSBOT19JUlEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBub2RlICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGVycm9yX2lvbWFwOworCX0KKworCS8qIFRoZSAnbmFtZScgc2hvdWxkIG5vdCBoYXZlIGFueSBzbGFzaGVzIGluIGl0LiAqLworCXJldCA9IHJlcXVlc3RfaXJxKHNzaV9wcml2YXRlLT5pcnEsIGZzbF9zc2lfaXNyLCAwLCBzc2lfcHJpdmF0ZS0+bmFtZSwKKwkJCSAgc3NpX3ByaXZhdGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjbGFpbSBpcnEgJXVcbiIsIHNzaV9wcml2YXRlLT5pcnEpOworCQlnb3RvIGVycm9yX2lycW1hcDsKKwl9CiAKIAkvKiBBcmUgdGhlIFJYIGFuZCB0aGUgVFggY2xvY2tzIGxvY2tlZD8gKi8KLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImZzbCxzc2ktYXN5bmNocm9ub3VzIiwgTlVMTCkpCi0JCXNzaV9wcml2YXRlLT5hc3luY2hyb25vdXMgPSAxOwotCWVsc2UKKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJmc2wsc3NpLWFzeW5jaHJvbm91cyIsIE5VTEwpKQogCQlzc2lfcHJpdmF0ZS0+Y3B1X2RhaV9kcnYuc3ltbWV0cmljX3JhdGVzID0gMTsKIAogCS8qIERldGVybWluZSB0aGUgRklGTyBkZXB0aC4gKi8KQEAgLTcxMSw3ICs3MDIsNyBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyAlcyBmaWxlXG4iLAogCQkJc3NpX3ByaXZhdGUtPmRldl9hdHRyLmF0dHIubmFtZSk7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfaXJxOwogCX0KIAogCS8qIFJlZ2lzdGVyIHdpdGggQVNvQyAqLwpAQCAtNzIwLDcgKzcxMSw3IEBACiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJnNzaV9wcml2YXRlLT5jcHVfZGFpX2Rydik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgREFJOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9kZXY7CiAJfQogCiAJLyogVHJpZ2dlciB0aGUgbWFjaGluZSBkcml2ZXIncyBwcm9iZSBmdW5jdGlvbi4gIFRoZSBwbGF0Zm9ybSBkcml2ZXIKQEAgLTc0MSwxOCArNzMyLDI4IEBACiAJaWYgKElTX0VSUihzc2lfcHJpdmF0ZS0+cGRldikpIHsKIAkJcmV0ID0gUFRSX0VSUihzc2lfcHJpdmF0ZS0+cGRldik7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBwbGF0Zm9ybTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfZGFpOwogCX0KIAogCXJldHVybiAwOwogCi1lcnJvcjoKK2Vycm9yX2RhaToKIAlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworCitlcnJvcl9kZXY6CiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChkZXZfYXR0cikKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsIGRldl9hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgZGV2X2F0dHIpOworCitlcnJvcl9pcnE6CisJZnJlZV9pcnEoc3NpX3ByaXZhdGUtPmlycSwgc3NpX3ByaXZhdGUpOworCitlcnJvcl9pcnFtYXA6CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzc2lfcHJpdmF0ZS0+aXJxKTsKKworZXJyb3JfaW9tYXA6CiAJaW91bm1hcChzc2lfcHJpdmF0ZS0+c3NpKTsKKworZXJyb3Jfa21hbGxvYzoKIAlrZnJlZShzc2lfcHJpdmF0ZSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzY2LDYgKzc2Nyw5IEBACiAJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJnNzaV9wcml2YXRlLT5kZXZfYXR0cik7CiAKKwlmcmVlX2lycShzc2lfcHJpdmF0ZS0+aXJxLCBzc2lfcHJpdmF0ZSk7CisJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzc2lfcHJpdmF0ZS0+aXJxKTsKKwogCWtmcmVlKHNzaV9wcml2YXRlKTsKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMgYi9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCmluZGV4IDM1OGYwYmEuLjMxYWY0MDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKKysrIGIvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX3NvdW5kOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvdW5kX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb3VuZF9kZXZpY2UpOwogZXJyb3I6CiAJa2ZyZWUobWFjaGluZV9kYXRhKTsKIGVycm9yX2FsbG9jOgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jIGIvc291bmQvc29jL2ZzbC9wMTAyMl9kcy5jCmluZGV4IGZjYjg2MmUuLjJjMDY0YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvcDEwMjJfZHMuYworKysgYi9zb3VuZC9zb2MvZnNsL3AxMDIyX2RzLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWlmIChidXMgPCAwKQogCQlyZXR1cm4gYnVzOwogCi0Jc25wcmludGYoYnVmLCBsZW4sICIlcy1jb2RlYy4ldS0lMDR4IiwgdGVtcCwgYnVzLCBhZGRyKTsKKwlzbnByaW50ZihidWYsIGxlbiwgIiVzLiV1LSUwNHgiLCB0ZW1wLCBidXMsIGFkZHIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDYsNyArNTA2LDcgQEAKIAogZXJyb3I6CiAJaWYgKHNvdW5kX2RldmljZSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc291bmRfZGV2aWNlKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChzb3VuZF9kZXZpY2UpOwogCiAJa2ZyZWUobWRhdGEpOwogZXJyb3JfcHV0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9LY29uZmlnIGIvc291bmQvc29jL2lteC9LY29uZmlnCmluZGV4IGJiNjk5YmIuLmIxMzNiZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvaW14L0tjb25maWcKQEAgLTI5LDcgKzI5LDcgQEAKIGNvbmZpZyBTTkRfU09DX01YMjdWSVNfQUlDMzJYNAogCXRyaXN0YXRlICJTb0MgYXVkaW8gc3VwcG9ydCBmb3IgVmlzc3RyaW0gTTEwIGJvYXJkcyIKIAlkZXBlbmRzIG9uIE1BQ0hfSU1YMjdfVklTU1RSSU1fTTEwCi0Jc2VsZWN0IFNORF9TT0NfVFZMMzIwQUlDMzJYNAorCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAlzZWxlY3QgU05EX01YQ19TT0NfTVgyCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBWaXNzdHJpbSBTTTEwCkBAIC01MCw2ICs1MCw3IEBACiAJCXx8IE1BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQgXAogCQl8fCBNQUNIX0VVS1JFQV9NQklNWFNEMzVfQkFTRUJPQVJEIFwKIAkJfHwgTUFDSF9FVUtSRUFfTUJJTVhTRDUxX0JBU0VCT0FSRAorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKIAlzZWxlY3QgU05EX01YQ19TT0NfRklRCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jIGIvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jCmluZGV4IDc5NDU2MjUuLjhkZjBmYWUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1wY20tZmlxLmMKKysrIGIvc291bmQvc29jL2lteC9pbXgtcGNtLWZpcS5jCkBAIC0yNDAsMjUgKzI0MCwyMyBAQAogCiBzdGF0aWMgaW50IGlteF9wY21fZmlxX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaW14X3BjbV9uZXcocnRkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19taW4pIHsKLQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQotCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCWlmIChzdWJzdHJlYW0pIHsKIAkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwogCiAJCWlteF9zc2lfZmlxX3R4X2J1ZmZlciA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YXJlYTsKIAl9CiAKLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7Ci0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KLQkJCXBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbTsKKwlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW07CisJaWYgKHN1YnN0cmVhbSkgewogCQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CiAKIAkJaW14X3NzaV9maXFfcnhfYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5hcmVhOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9pbXgtc3NpLmMgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwppbmRleCAxMGE4ZTI3Li40YzA1ZTJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuYworKysgYi9zb3VuZC9zb2MvaW14L2lteC1zc2kuYwpAQCAtMzU3LDggKzM1Nyw4IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZG1hX21tYXBfY29oZXJlbnQoTlVMTCwgdm1hLCBydW50aW1lLT5kbWFfYXJlYSwKLQkJCXJ1bnRpbWUtPmRtYV9hZGRyLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCXJldCA9IGRtYV9tbWFwX3dyaXRlY29tYmluZShzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LCB2bWEsCisJCXJ1bnRpbWUtPmRtYV9hcmVhLCBydW50aW1lLT5kbWFfYWRkciwgcnVudGltZS0+ZG1hX2J5dGVzKTsKIAogCXByX2RlYnVnKCIlczogcmV0OiAlZCAlcCAweCUwOHggMHglMDh4XG4iLCBfX2Z1bmNfXywgcmV0LAogCQkJcnVudGltZS0+ZG1hX2FyZWEsCkBAIC0zOTEsNyArMzkxLDYgQEAKIGludCBpbXhfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCWludCByZXQgPSAwOwogCkBAIC0zOTksMTQgKzM5OCwxNCBAQAogCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJmlteF9wY21fZG1hbWFzazsKIAlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCiAJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gaW14X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKIAkJcmV0ID0gaW14X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW14L2lteC1zc2kuaCBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCmluZGV4IDBhODRjZWMuLjEwNzJkZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCisrKyBiL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5oCkBAIC0yMTgsMTIgKzIxOCw2IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29jX3BsYXRmb3JtX3BkZXZfZmlxOwogfTsKIAotc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKmlteF9zc2lfZmlxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJc3RydWN0IGlteF9zc2kgKnNzaSk7Ci12b2lkIGlteF9zc2lfZmlxX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGlteF9zc2kgKnNzaSk7Ci1zdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqaW14X3NzaV9kbWFfbXgyX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJc3RydWN0IGlteF9zc2kgKnNzaSk7Ci0KIGludCBzbmRfaW14X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBpbnQgaW14X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7CiB2b2lkIGlteF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvd20xMTMzLWV2MS5jIGIvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKaW5kZXggNzViNGM3Mi4uNDkwYTEyNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKKysrIGIvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1wY20uYyBiL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCmluZGV4IGE3Yzk1NzguLmQxOTg5Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9qejQ3NDAvano0NzQwLXBjbS5jCkBAIC0yOTksNyArMjk5LDcgQEAKIAogc3RhdGljIHU2NCBqejQ3NDBfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwogCi1pbnQgano0NzQwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3N0YXRpYyBpbnQgano0NzQwX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCmluZGV4IGQwYmNmM2YuLjcxNWU4NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBraXJrd29vZF9pMnNfZHJpdmVyID0gewogCS5wcm9iZSAgPSBraXJrd29vZF9pMnNfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBraXJrd29vZF9pMnNfZGV2X3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoa2lya3dvb2RfaTJzX2Rldl9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJWX05BTUUsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLXQ1MzI1LmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYwppbmRleCBjOGQyMTk1Li5jNzcyYjNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYworKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYwpAQCAtNzksOCArNzksNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbWlkLXg4Ni9tZmxkX21hY2hpbmUuYyBiL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCmluZGV4IDQyOWFhMWIuLmNjYTY5M2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCisrKyBiL3NvdW5kL3NvYy9taWQteDg2L21mbGRfbWFjaGluZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtNTQsOSArNTUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAlsb19kYWM7CiAKIHN0cnVjdCBtZmxkX21jX3ByaXZhdGUgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNvY2RldjsKIAl2b2lkIF9faW9tZW0gKmludF9iYXNlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAl1OCBpbnRlcnJ1cHRfc3RhdHVzOwogfTsKIApAQCAtMjM1LDcgKzIzNCw2IEBACiAJLyogYWx3YXlzIGNvbm5lY3RlZCAqLwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmVzIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0X3ZhbCA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBtZmxkX3NuZF9jb250cm9scywKIAkJCQlBUlJBWV9TSVpFKG1mbGRfc25kX2NvbnRyb2xzKSk7CkBAIC0yNTMsNyArMjUxLDYgQEAKIAkvKiB3ZSBkb250IHVzZSBsaW5laW4gaW4gdGhpcyBzbyBzZXQgdG8gTkMgKi8KIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTkwiKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVJTlIiKTsKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCS8qIEhlYWRzZXQgYW5kIGJ1dHRvbiBqYWNrIGRldGVjdGlvbiAqLwogCXJldF92YWwgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL21pZC14ODYvc3N0X3BsYXRmb3JtLmMgYi9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYwppbmRleCAzZTc4MjYwLi4yMzA1NzAyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYworKysgYi9zb3VuZC9zb2MvbWlkLXg4Ni9zc3RfcGxhdGZvcm0uYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYzLDcgKzY0LDcgQEAKIH07CiAKIC8qIE1GTEQgLSBNU0lDICovCi1zdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNzdF9wbGF0Zm9ybV9kYWlbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNzdF9wbGF0Zm9ybV9kYWlbXSA9IHsKIHsKIAkubmFtZSA9ICJIZWFkc2V0LWNwdS1kYWkiLAogCS5pZCA9IDAsCkBAIC0yMjYsMTMgKzIyNywxOCBAQAogCiBzdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CiAJaW50IHJldF92YWwgPSAwOwogCiAJcHJfZGVidWcoInNzdF9wbGF0Zm9ybV9vcGVuIGNhbGxlZFxuIik7Ci0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlydW50aW1lLT5odyA9IHNzdF9wbGF0Zm9ybV9wY21faHc7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9wbGF0Zm9ybV9wY21faHcpOworCXJldF92YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCWlmIChyZXRfdmFsIDwgMCkKKwkJcmV0dXJuIHJldF92YWw7CisKIAlzdHJlYW0gPSBremFsbG9jKHNpemVvZigqc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdHJlYW0pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjU5LDggKzI2NSw4IEBACiAJCXJldHVybiByZXRfdmFsOwogCX0KIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzdHJlYW07Ci0JcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtNDY5LDcgKzQ3NSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzc3Rfc29jX3BsYXRmb3JtX2luaXQodm9pZCkKIHsKIAlwcl9kZWJ1Zygic3N0X3NvY19wbGF0Zm9ybV9pbml0IGNhbGxlZFxuIik7Ci0JcmV0dXJuICBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNzdF9wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNzdF9wbGF0Zm9ybV9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoc3N0X3NvY19wbGF0Zm9ybV9pbml0KTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9LY29uZmlnIGIvc291bmQvc29jL214cy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmE4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvbXhzL0tjb25maWcKQEAgLTAsMCArMSwyMCBAQAorbWVudWNvbmZpZyBTTkRfTVhTX1NPQworCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIEZyZWVzY2FsZSBNWFMgQ1BVcyIKKwlkZXBlbmRzIG9uIEFSQ0hfTVhTCisJc2VsZWN0IFNORF9QQ00KKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KKwkgIHRoZSBNWFMgU0FJRiBpbnRlcmZhY2UuCisKKworaWYgU05EX01YU19TT0MKKworY29uZmlnIFNORF9TT0NfTVhTX1NHVEw1MDAwCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBpLk1YIGJvYXJkcyB3aXRoIHNndGw1MDAwIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFNORF9TT0NfU0dUTDUwMDAKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFuIE1YUyBib2FyZCB3aXRoCisJICBhIHNndGw1MDAwIGNvZGVjLgorCitlbmRpZgkjIFNORF9NWFNfU09DCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXhzL01ha2VmaWxlIGIvc291bmQvc29jL214cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjViNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjIE1YUyBQbGF0Zm9ybSBTdXBwb3J0CitzbmQtc29jLW14cy1vYmpzIDo9IG14cy1zYWlmLm8KK3NuZC1zb2MtbXhzLXBjbS1vYmpzIDo9IG14cy1wY20ubworCitvYmotJChDT05GSUdfU05EX01YU19TT0MpICs9IHNuZC1zb2MtbXhzLm8gc25kLXNvYy1teHMtcGNtLm8KKworIyBpLk1YIE1hY2hpbmUgU3VwcG9ydAorc25kLXNvYy1teHMtc2d0bDUwMDAtb2JqcyA6PSBteHMtc2d0bDUwMDAubworCitvYmotJChDT05GSUdfU05EX1NPQ19NWFNfU0dUTDUwMDApICs9IHNuZC1zb2MtbXhzLXNndGw1MDAwLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9teHMvbXhzLXBjbS5jIGIvc291bmQvc29jL214cy9teHMtcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXBjbS5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gc291bmQvc29jL2lteC9pbXgtcGNtLWRtYS1teDIuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgIm14cy1wY20uaCIKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9teHNfaGFyZHdhcmUgPSB7CisJLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJICBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCS5jaGFubmVsc19taW4JCT0gMiwKKwkuY2hhbm5lbHNfbWF4CQk9IDIsCisJLnBlcmlvZF9ieXRlc19taW4JPSAzMiwKKwkucGVyaW9kX2J5dGVzX21heAk9IDgxOTIsCisJLnBlcmlvZHNfbWluCQk9IDEsCisJLnBlcmlvZHNfbWF4CQk9IDUyLAorCS5idWZmZXJfYnl0ZXNfbWF4CT0gNjQgKiAxMDI0LAorCS5maWZvX3NpemUJCT0gMzIsCisKK307CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2RtYV9pcnEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKilkYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlwcnRkLT5vZmZzZXQgKz0gaXBydGQtPnBlcmlvZF9ieXRlczsKKwlpcHJ0ZC0+b2Zmc2V0ICU9IGlwcnRkLT5wZXJpb2RfYnl0ZXMgKiBpcHJ0ZC0+cGVyaW9kczsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBib29sIGZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBteHNfcGNtX3J1bnRpbWVfZGF0YSAqaXBydGQgPSBwYXJhbTsKKwlzdHJ1Y3QgbXhzX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0gaXBydGQtPmRtYV9wYXJhbXM7CisKKwlpZiAoIW14c19kbWFfaXNfYXBieChjaGFuKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNoYW4tPmNoYW5faWQgIT0gZG1hX3BhcmFtcy0+Y2hhbl9udW0pCisJCXJldHVybiBmYWxzZTsKKworCWNoYW4tPnByaXZhdGUgPSAmaXBydGQtPmRtYV9kYXRhOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbXhzX2RtYV9hbGxvYyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWRtYV9jYXBfbWFza190IG1hc2s7CisKKwlpcHJ0ZC0+ZG1hX3BhcmFtcyA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0YShydGQtPmNwdV9kYWksIHN1YnN0cmVhbSk7CisKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKwlpcHJ0ZC0+ZG1hX2RhdGEuY2hhbl9pcnEgPSBpcHJ0ZC0+ZG1hX3BhcmFtcy0+Y2hhbl9pcnE7CisJaXBydGQtPmRtYV9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIGlwcnRkKTsKKwlpZiAoIWlwcnRkLT5kbWFfY2hhbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZG1hX2FkZHI7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCByZXQ7CisKKwlyZXQgPSBteHNfZG1hX2FsbG9jKHN1YnN0cmVhbSwgcGFyYW1zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWNoYW4gPSBpcHJ0ZC0+ZG1hX2NoYW47CisKKwlpcHJ0ZC0+c2l6ZSA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKwlpcHJ0ZC0+cGVyaW9kcyA9IHBhcmFtc19wZXJpb2RzKHBhcmFtcyk7CisJaXBydGQtPnBlcmlvZF9ieXRlcyA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKKwlpcHJ0ZC0+b2Zmc2V0ID0gMDsKKwlpcHJ0ZC0+cGVyaW9kX3RpbWUgPSBIWiAvIChwYXJhbXNfcmF0ZShwYXJhbXMpIC8KKwkJCXBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpKTsKKworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CisKKwlkbWFfYWRkciA9IHJ1bnRpbWUtPmRtYV9hZGRyOworCisJaXBydGQtPmJ1ZiA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOworCisJaXBydGQtPmRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMoY2hhbiwgZG1hX2FkZHIsCisJCQlpcHJ0ZC0+cGVyaW9kX2J5dGVzICogaXBydGQtPnBlcmlvZHMsCisJCQlpcHJ0ZC0+cGVyaW9kX2J5dGVzLAorCQkJc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/CisJCQlETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoIWlwcnRkLT5kZXNjKSB7CisJCWRldl9lcnIoJmNoYW4tPmRldi0+ZGV2aWNlLCAiY2Fubm90IHByZXBhcmUgc2xhdmUgZG1hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBydGQtPmRlc2MtPmNhbGxiYWNrID0gYXVkaW9fZG1hX2lycTsKKwlpcHJ0ZC0+ZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzdWJzdHJlYW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWlmIChpcHJ0ZC0+ZG1hX2NoYW4pIHsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChpcHJ0ZC0+ZG1hX2NoYW4pOworCQlpcHJ0ZC0+ZG1hX2NoYW4gPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9teHNfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgKmlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJZG1hZW5naW5lX3N1Ym1pdChpcHJ0ZC0+ZGVzYyk7CisKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGlwcnRkLT5kbWFfY2hhbik7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfbXhzX3BjbV9wb2ludGVyKAorCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBteHNfcGNtX3J1bnRpbWVfZGF0YSAqaXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgaXBydGQtPm9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX214c19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZDsKKwlpbnQgcmV0OworCisJaXBydGQgPSBremFsbG9jKHNpemVvZigqaXBydGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaXBydGQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gaXBydGQ7CisKKwlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaXBydGQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmc25kX214c19oYXJkd2FyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfbXhzX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IG14c19wY21fcnVudGltZV9kYXRhICppcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCWtmcmVlKGlwcnRkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9teHNfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlyZXR1cm4gZG1hX21tYXBfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKwkJCQkJcnVudGltZS0+ZG1hX2FyZWEsCisJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCQlydW50aW1lLT5kbWFfYnl0ZXMpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG14c19wY21fb3BzID0geworCS5vcGVuCQk9IHNuZF9teHNfb3BlbiwKKwkuY2xvc2UJCT0gc25kX214c19jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IHNuZF9teHNfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IHNuZF9teHNfcGNtX2h3X2ZyZWUsCisJLnRyaWdnZXIJPSBzbmRfbXhzX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyCT0gc25kX214c19wY21fcG9pbnRlciwKKwkubW1hcAkJPSBzbmRfbXhzX3BjbV9tbWFwLAorfTsKKworc3RhdGljIGludCBteHNfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7CisJc2l6ZV90IHNpemUgPSBzbmRfbXhzX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisKKwlidWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOworCWJ1Zi0+ZGV2LmRldiA9IHBjbS0+Y2FyZC0+ZGV2OworCWJ1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlidWYtPmFyZWEgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBzaXplLAorCQkJCQkgICAmYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisJYnVmLT5ieXRlcyA9IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBteHNfcGNtX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworc3RhdGljIGludCBteHNfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCWludCByZXQgPSAwOworCisJaWYgKCFjYXJkLT5kZXYtPmRtYV9tYXNrKQorCQljYXJkLT5kZXYtPmRtYV9tYXNrID0gJm14c19wY21fZG1hbWFzazsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKKwkJcmV0ID0gbXhzX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlyZXQgPSBteHNfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG14c19wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmOworCWludCBzdHJlYW07CisKKwlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7CisJCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tzdHJlYW1dLnN1YnN0cmVhbTsKKwkJaWYgKCFzdWJzdHJlYW0pCisJCQljb250aW51ZTsKKworCQlidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCQlpZiAoIWJ1Zi0+YXJlYSkKKwkJCWNvbnRpbnVlOworCisJCWRtYV9mcmVlX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgYnVmLT5ieXRlcywKKwkJCQkgICAgICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7CisJCWJ1Zi0+YXJlYSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG14c19zb2NfcGxhdGZvcm0gPSB7CisJLm9wcwkJPSAmbXhzX3BjbV9vcHMsCisJLnBjbV9uZXcJPSBteHNfcGNtX25ldywKKwkucGNtX2ZyZWUJPSBteHNfcGNtX2ZyZWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHNfc29jX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJm14c19zb2NfcGxhdGZvcm0pOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBteHNfc29jX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfcGNtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtcGNtLWF1ZGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBteHNfc29jX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChteHNfc29jX3BsYXRmb3JtX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbmRfbXhzX3BjbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhzX3BjbV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc25kX214c19wY21faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbmRfbXhzX3BjbV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm14c19wY21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNuZF9teHNfcGNtX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9teHMtcGNtLmggYi9zb3VuZC9zb2MvbXhzL214cy1wY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVhYzRmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9teHMtcGNtLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfTVhTX1BDTV9ICisjZGVmaW5lIF9NWFNfUENNX0gKKworI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisKK3N0cnVjdCBteHNfcGNtX2RtYV9wYXJhbXMgeworCWludCBjaGFuX2lycTsKKwlpbnQgY2hhbl9udW07Cit9OworCitzdHJ1Y3QgbXhzX3BjbV9ydW50aW1lX2RhdGEgeworCWludCBwZXJpb2RfYnl0ZXM7CisJaW50IHBlcmlvZHM7CisJaW50IGRtYTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqYnVmOworCWludCBwZXJpb2RfdGltZTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlzdHJ1Y3QgbXhzX2RtYV9kYXRhIGRtYV9kYXRhOworCXN0cnVjdCBteHNfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuYyBiL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRjNzRkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL214cy9teHMtc2FpZi5jCkBAIC0wLDAgKzEsNzk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zYWlmLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL214cy5oPgorCisjaW5jbHVkZSAibXhzLXNhaWYuaCIKKworc3RhdGljIHN0cnVjdCBteHNfc2FpZiAqbXhzX3NhaWZbMl07CisKKy8qCisgKiBTQUlGIGlzIGEgbGl0dGxlIGRpZmZlcmVudCB3aXRoIG90aGVyIG5vcm1hbCBTT0MgREFJcyBvbiBjbG9jayB1c2luZy4KKyAqCisgKiBGb3IgTVhTLCB0d28gU0FJRiBtb2R1bGVzIGFyZSBpbnN0YW50aWF0ZWQgb24tY2hpcC4KKyAqIEVhY2ggU0FJRiBoYXMgYSBzZXQgb2YgY2xvY2sgcGlucyBhbmQgY2FuIGJlIG9wZXJhdGluZyBpbiBtYXN0ZXIKKyAqIG1vZGUgc2ltdWx0YW5lb3VzbHkgaWYgdGhleSBhcmUgY29ubmVjdGVkIHRvIGRpZmZlcmVudCBvZmYtY2hpcCBjb2RlY3MuCisgKiBBbHNvLCBvbmUgb2YgdGhlIHR3byBTQUlGcyBjYW4gbWFzdGVyIG9yIGRyaXZlIHRoZSBjbG9jayBwaW5zIHdoaWxlIHRoZQorICogb3RoZXIgU0FJRiwgaW4gc2xhdmUgbW9kZSwgcmVjZWl2ZXMgY2xvY2tpbmcgZnJvbSB0aGUgbWFzdGVyIFNBSUYuCisgKiBUaGlzIGFsc28gbWVhbnMgdGhhdCBib3RoIFNBSUZzIG11c3Qgb3BlcmF0ZSBhdCB0aGUgc2FtZSBzYW1wbGUgcmF0ZS4KKyAqCisgKiBXZSBhYnN0cmFjdCB0aGlzIGFzIGVhY2ggc2FpZiBoYXMgYSBtYXN0ZXIsIHRoZSBtYXN0ZXIgY291bGQgYmUKKyAqIGhpbXNlbGYgb3Igb3RoZXIgc2FpZnMuIEluIHRoZSBnZW5lcmljIHNhaWYgZHJpdmVyLCBzYWlmIGRvZXMgbm90IG5lZWQKKyAqIHRvIGtub3cgdGhlIGRpZmZlcmVudCBjbGttdXguIFNhaWYgb25seSBuZWVkcyB0byBrbm93IHdobyBpcyBoaXMgbWFzdGVyCisgKiBhbmQgb3BlcmF0aW5nIGhpcyBtYXN0ZXIgdG8gZ2VuZXJhdGUgdGhlIHByb3BlciBjbG9jayByYXRlIGZvciBoaW0uCisgKiBUaGUgbWFzdGVyIGlkIGlzIHByb3ZpZGVkIGluIG1hY2gtc3BlY2lmaWMgbGF5ZXIgYWNjb3JkaW5nIHRvIGRpZmZlcmVudAorICogY2xrbXV4IHNldHRpbmcuCisgKi8KKworc3RhdGljIGludCBteHNfc2FpZl9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksCisJCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3QgbXhzX3NhaWYgKnNhaWYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBNWFNfU0FJRl9NQ0xLOgorCQlzYWlmLT5tY2xrID0gZnJlcTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2luY2UgU0FJRiBtYXkgd29yayBvbiBFWFRNQVNURVIgbW9kZSwgSU9XLCBpdCdzIHdvcmtpbmcgQklUQ0xLJkxSQ0xLCisgKiBpcyBwcm92aWRlZCBieSBvdGhlciBTQUlGLCB3ZSBwcm92aWRlIGEgaW50ZXJmYWNlIGhlcmUgdG8gZ2V0IGl0cyBtYXN0ZXIKKyAqIGZyb20gaXRzIG1hc3Rlcl9pZC4KKyAqIE5vdGUgdGhhdCB0aGUgbWFzdGVyIGNvdWxkIGJlIGhpbXNlbGYuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG14c19zYWlmICpteHNfc2FpZl9nZXRfbWFzdGVyKHN0cnVjdCBteHNfc2FpZiAqIHNhaWYpCit7CisJcmV0dXJuIG14c19zYWlmW3NhaWYtPm1hc3Rlcl9pZF07Cit9CisKKy8qCisgKiBTZXQgU0FJRiBjbG9jayBhbmQgTUNMSworICovCitzdGF0aWMgaW50IG14c19zYWlmX3NldF9jbGsoc3RydWN0IG14c19zYWlmICpzYWlmLAorCQkJCSAgdW5zaWduZWQgaW50IG1jbGssCisJCQkJICB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1MzIgc2NyOworCWludCByZXQ7CisJc3RydWN0IG14c19zYWlmICptYXN0ZXJfc2FpZjsKKworCWRldl9kYmcoc2FpZi0+ZGV2LCAibWNsayAlZCByYXRlICVkXG4iLCBtY2xrLCByYXRlKTsKKworCS8qIFNldCBtYXN0ZXIgc2FpZiB0byBnZW5lcmF0ZSBwcm9wZXIgY2xvY2sgKi8KKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKCFtYXN0ZXJfc2FpZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKHNhaWYtPmRldiwgIm1hc3RlciBzYWlmJWRcbiIsIG1hc3Rlcl9zYWlmLT5pZCk7CisKKwkvKiBDaGVja2luZyBpZiBjYW4gcGxheWJhY2sgYW5kIGNhcHR1cmUgc2ltdXRhbmVvdXNseSAqLworCWlmIChtYXN0ZXJfc2FpZi0+b25nb2luZyAmJiByYXRlICE9IG1hc3Rlcl9zYWlmLT5jdXJfcmF0ZSkgeworCQlkZXZfZXJyKHNhaWYtPmRldiwKKwkJCSJjYW4gbm90IGNoYW5nZSBjbG9jaywgbWFzdGVyIHNhaWYlZChyYXRlICVkKSBpcyBvbmdvaW5nXG4iLAorCQkJbWFzdGVyX3NhaWYtPmlkLCBtYXN0ZXJfc2FpZi0+Y3VyX3JhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzY3IgPSBfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCk7CisJc2NyICY9IH5CTV9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURTsKKwlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFOworCisJLyoKKwkgKiBTZXQgU0FJRiBjbG9jaworCSAqCisJICogVGhlIFNBSUYgY2xvY2sgc2hvdWxkIGJlIGVpdGhlciAzODQqZnMgb3IgNTEyKmZzLgorCSAqIElmIE1DTEsgaXMgdXNlZCwgdGhlIFNBSUYgY2xrIHJhdGlvIG5lZWQgdG8gbWF0Y2ggbWNsayByYXRpby4KKwkgKiAgRm9yIDMyeCBtY2xrLCBzZXQgc2FpZiBjbGsgYXMgNTEyKmZzLgorCSAqICBGb3IgNDh4IG1jbGssIHNldCBzYWlmIGNsayBhcyAzODQqZnMuCisJICoKKwkgKiBJZiBNQ0xLIGlzIG5vdCB1c2VkLCB3ZSBqdXN0IHNldCBzYWlmIGNsayB0byA1MTIqZnMuCisJICovCisJaWYgKG1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkgeworCQlpZiAobWNsayAlIDMyID09IDApIHsKKwkJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0JJVENMS19CQVNFX1JBVEU7CisJCQlyZXQgPSBjbGtfc2V0X3JhdGUobWFzdGVyX3NhaWYtPmNsaywgNTEyICogcmF0ZSk7CisJCX0gZWxzZSBpZiAobWNsayAlIDQ4ID09IDApIHsKKwkJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0JBU0VfUkFURTsKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShtYXN0ZXJfc2FpZi0+Y2xrLCAzODQgKiByYXRlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNBSUYgTUNMSyBzaG91bGQgYmUgZWl0aGVyIDMyeCBvciA0OHggKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gY2xrX3NldF9yYXRlKG1hc3Rlcl9zYWlmLT5jbGssIDUxMiAqIHJhdGUpOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFOworCX0KKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltYXN0ZXJfc2FpZi0+Y3VyX3JhdGUgPSByYXRlOworCisJaWYgKCFtYXN0ZXJfc2FpZi0+bWNsa19pbl91c2UpIHsKKwkJX19yYXdfd3JpdGVsKHNjciwgbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIG92ZXItc2FtcGxlIHJhdGUgZm9yIE1DTEsgb3V0cHV0CisJICoKKwkgKiBUaGUgYXZhaWxhYmxlIE1DTEsgcmFuZ2UgaXMgMzJ4LCA0OHguLi4gNTEyeC4gVGhlIHJhdGUKKwkgKiBjb3VsZCBiZSBmcm9tIDhrSHogdG8gMTkya0guCisJICovCisJc3dpdGNoIChtY2xrIC8gcmF0ZSkgeworCWNhc2UgMzI6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSg0KTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDMpOworCQlicmVhazsKKwljYXNlIDEyODoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDIpOworCQlicmVhazsKKwljYXNlIDI1NjoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDEpOworCQlicmVhazsKKwljYXNlIDUxMjoKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKDApOworCQlicmVhazsKKwljYXNlIDQ4OgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX0JJVENMS19NVUxUX1JBVEUoMyk7CisJCWJyZWFrOworCWNhc2UgOTY6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgyKTsKKwkJYnJlYWs7CisJY2FzZSAxOTI6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgxKTsKKwkJYnJlYWs7CisJY2FzZSAzODQ6CisJCXNjciB8PSBCRl9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURSgwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJX19yYXdfd3JpdGVsKHNjciwgbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdXQgYW5kIGRpc2FibGUgTUNMSy4KKyAqLworaW50IG14c19zYWlmX3B1dF9tY2xrKHVuc2lnbmVkIGludCBzYWlmX2lkKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IG14c19zYWlmW3NhaWZfaWRdOworCXUzMiBzdGF0OworCisJaWYgKCFzYWlmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXQgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9TVEFUKTsKKwlpZiAoc3RhdCAmIEJNX1NBSUZfU1RBVF9CVVNZKSB7CisJCWRldl9lcnIoc2FpZi0+ZGV2LCAiZXJyb3I6IGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNsa19kaXNhYmxlKHNhaWYtPmNsayk7CisKKwkvKiBkaXNhYmxlIE1DTEsgb3V0cHV0ICovCisJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9DTEtHQVRFLAorCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisKKwlzYWlmLT5tY2xrX2luX3VzZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgTUNMSyBhbmQgc2V0IGNsb2NrIHJhdGUsIHRoZW4gZW5hYmxlIGl0CisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgY29kZWNzIHdobyBhcmUgdXNpbmcgTUNMSyBwcm92aWRlZAorICogYnkgc2FpZi4KKyAqLworaW50IG14c19zYWlmX2dldF9tY2xrKHVuc2lnbmVkIGludCBzYWlmX2lkLCB1bnNpZ25lZCBpbnQgbWNsaywKKwkJCQkJdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gbXhzX3NhaWZbc2FpZl9pZF07CisJdTMyIHN0YXQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXhzX3NhaWYgKm1hc3Rlcl9zYWlmOworCisJaWYgKCFzYWlmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENsZWFyIFJlc2V0ICovCisJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9TRlRSU1QsCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCisJLyogRklYTUU6IG5lZWQgY2xlYXIgY2xrIGdhdGUgZm9yIHJlZ2lzdGVyIHIvdyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfQ0xLR0FURSwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisKKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKHNhaWYgIT0gbWFzdGVyX3NhaWYpIHsKKwkJZGV2X2VycihzYWlmLT5kZXYsICJjYW4gbm90IGdldCBtY2xrIGZyb20gYSBub24tbWFzdGVyIHNhaWZcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0ID0gX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCk7CisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfQlVTWSkgeworCQlkZXZfZXJyKHNhaWYtPmRldiwgImVycm9yOiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzYWlmLT5tY2xrX2luX3VzZSA9IDE7CisJcmV0ID0gbXhzX3NhaWZfc2V0X2NsayhzYWlmLCBtY2xrLCByYXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX2VuYWJsZShzYWlmLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgTUNMSyBvdXRwdXQgKi8KKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19TRVRfQUREUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNBSUYgREFJIGZvcm1hdCBjb25maWd1cmF0aW9uLgorICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gcG9ydCBpcyBpbmFjdGl2ZS4KKyAqLworc3RhdGljIGludCBteHNfc2FpZl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJdTMyIHNjciwgc3RhdDsKKwl1MzIgc2NyMDsKKwlzdHJ1Y3QgbXhzX3NhaWYgKnNhaWYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKworCXN0YXQgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9TVEFUKTsKKwlpZiAoc3RhdCAmIEJNX1NBSUZfU1RBVF9CVVNZKSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAiZXJyb3I6IGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNjcjAgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKwlzY3IwID0gc2NyMCAmIH5CTV9TQUlGX0NUUkxfQklUQ0xLX0VER0UgJiB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZIFwKKwkJJiB+Qk1fU0FJRl9DVFJMX0pVU1RJRlkgJiB+Qk1fU0FJRl9DVFJMX0RFTEFZOworCXNjciA9IDA7CisKKwkvKiBEQUkgbW9kZSAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJLyogZGF0YSBmcmFtZSBsb3cgMWNsayBiZWZvcmUgZGF0YSAqLworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX0RFTEFZOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9MUkNMS19QT0xBUklUWTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCS8qIGRhdGEgZnJhbWUgaGlnaCB3aXRoIGRhdGEgKi8KKwkJc2NyICY9IH5CTV9TQUlGX0NUUkxfREVMQVk7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9KVVNUSUZZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEQUkgY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfTFJDTEtfUE9MQVJJVFk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCXNjciB8PSBCTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlzY3IgJj0gfkJNX1NBSUZfQ1RSTF9CSVRDTEtfRURHRTsKKwkJc2NyIHw9IEJNX1NBSUZfQ1RSTF9MUkNMS19QT0xBUklUWTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJc2NyICY9IH5CTV9TQUlGX0NUUkxfQklUQ0xLX0VER0U7CisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIE5vdGU6IFdlIHNpbXBseSBqdXN0IHN1cHBvcnQgbWFzdGVyIG1vZGUgc2luY2UgU0FJRiBUWCBjYW4gb25seQorCSAqIHdvcmsgYXMgbWFzdGVyLgorCSAqIEhlcmUgdGhlIG1hc3RlciBpcyByZWxhdGl2ZSB0byBjb2RlYyBzaWRlLgorCSAqIFNhaWYgaW50ZXJuYWxseSBjb3VsZCBiZSBzbGF2ZSB3aGVuIHdvcmtpbmcgb24gRVhUTUFTVEVSIG1vZGUuCisJICogV2UganVzdCBoaWRlIHRoaXMgdG8gbWFjaGluZSBkcml2ZXIuCisJICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJaWYgKHNhaWYtPmlkID09IHNhaWYtPm1hc3Rlcl9pZCkKKwkJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1NMQVZFX01PREU7CisJCWVsc2UKKwkJCXNjciB8PSBCTV9TQUlGX0NUUkxfU0xBVkVfTU9ERTsKKworCQlfX3Jhd193cml0ZWwoc2NyIHwgc2NyMCwgc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c19zYWlmX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGNwdV9kYWksIHN1YnN0cmVhbSwgJnNhaWYtPmRtYV9wYXJhbSk7CisKKwkvKiBjbGVhciBlcnJvciBzdGF0dXMgdG8gMCBmb3IgZWFjaCByZS1vcGVuICovCisJc2FpZi0+Zmlmb191bmRlcnJ1biA9IDA7CisJc2FpZi0+Zmlmb19vdmVycnVuID0gMDsKKworCS8qIENsZWFyIFJlc2V0IGZvciBub3JtYWwgb3BlcmF0aW9ucyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfU0ZUUlNULAorCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX0NMUl9BRERSKTsKKworCS8qIGNsZWFyIGNsb2NrIGdhdGUgKi8KKwlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX0NMS0dBVEUsCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBwb3J0IGlzIGluYWN0aXZlLgorICogYWx0aG91Z2ggY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSB1cHBlciBsYXllcnMuCisgKi8KK3N0YXRpYyBpbnQgbXhzX3NhaWZfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCXUzMiBzY3IsIHN0YXQ7CisJaW50IHJldDsKKworCS8qIG1jbGsgc2hvdWxkIGFscmVhZHkgYmUgc2V0ICovCisJaWYgKCFzYWlmLT5tY2xrICYmIHNhaWYtPm1jbGtfaW5fdXNlKSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAic2V0IG1jbGsgZmlyc3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdGF0ID0gX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCk7CisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfQlVTWSkgeworCQlkZXZfZXJyKGNwdV9kYWktPmRldiwgImVycm9yOiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIFNldCBzYWlmIGNsayBiYXNlZCBvbiBzYW1wbGUgcmF0ZS4KKwkgKiBJZiBtY2xrIGlzIHVzZWQsIHdlIGFsc28gc2V0IG1jbGssIGlmIG5vdCwgc2FpZi0+bWNsayBpcworCSAqIGRlZmF1bHQgMCwgbWVhbnMgbm90IHVzZWQuCisJICovCisJcmV0ID0gbXhzX3NhaWZfc2V0X2NsayhzYWlmLCBzYWlmLT5tY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3B1X2RhaS0+ZGV2LCAidW5hYmxlIHRvIGdldCBwcm9wZXIgY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzY3IgPSBfX3Jhd19yZWFkbChzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKworCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1dPUkRfTEVOR1RIOworCXNjciAmPSB+Qk1fU0FJRl9DVFJMX0JJVENMS180OFhGU19FTkFCTEU7CisJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKDApOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzIwXzNMRToKKwkJc2NyIHw9IEJGX1NBSUZfQ1RSTF9XT1JEX0xFTkdUSCg0KTsKKwkJc2NyIHw9IEJNX1NBSUZfQ1RSTF9CSVRDTEtfNDhYRlNfRU5BQkxFOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQlzY3IgfD0gQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKDgpOworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX0JJVENMS180OFhGU19FTkFCTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFR4L1J4IGNvbmZpZyAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCS8qIGVuYWJsZSBUWCBtb2RlICovCisJCXNjciAmPSB+Qk1fU0FJRl9DVFJMX1JFQURfTU9ERTsKKwl9IGVsc2UgeworCQkvKiBlbmFibGUgUlggbW9kZSAqLworCQlzY3IgfD0gQk1fU0FJRl9DVFJMX1JFQURfTU9ERTsKKwl9CisKKwlfX3Jhd193cml0ZWwoc2NyLCBzYWlmLT5iYXNlICsgU0FJRl9DVFJMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHNfc2FpZl9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQoreworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOworCisJLyogZW5hYmxlIEZJRk8gZXJyb3IgaXJxcyAqLworCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfRklGT19FUlJPUl9JUlFfRU4sCisJCXNhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfU0VUX0FERFIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhzX3NhaWZfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCwKKwkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7CisJc3RydWN0IG14c19zYWlmICptYXN0ZXJfc2FpZjsKKwl1MzIgZGVsYXk7CisKKwltYXN0ZXJfc2FpZiA9IG14c19zYWlmX2dldF9tYXN0ZXIoc2FpZik7CisJaWYgKCFtYXN0ZXJfc2FpZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlkZXZfZGJnKGNwdV9kYWktPmRldiwgInN0YXJ0XG4iKTsKKworCQljbGtfZW5hYmxlKG1hc3Rlcl9zYWlmLT5jbGspOworCQlpZiAoIW1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkKKwkJCV9fcmF3X3dyaXRlbChCTV9TQUlGX0NUUkxfUlVOLAorCQkJCW1hc3Rlcl9zYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKworCQkvKgorCQkgKiBJZiB0aGUgc2FpZidzIG1hc3RlciBpcyBub3QgaGltc2VsZiwgd2UgYWxzbyBuZWVkIHRvIGVuYWJsZQorCQkgKiBpdHNlbGYgY2xrIGZvciBpdHMgaW50ZXJuYWwgYmFzaWMgbG9naWMgdG8gd29yay4KKwkJICovCisJCWlmIChzYWlmICE9IG1hc3Rlcl9zYWlmKSB7CisJCQljbGtfZW5hYmxlKHNhaWYtPmNsayk7CisJCQlfX3Jhd193cml0ZWwoQk1fU0FJRl9DVFJMX1JVTiwKKwkJCQlzYWlmLT5iYXNlICsgU0FJRl9DVFJMICsgTVhTX1NFVF9BRERSKTsKKwkJfQorCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCQkvKgorCQkJICogd3JpdGUgYSBkYXRhIHRvIHNhaWYgZGF0YSByZWdpc3RlciB0byB0cmlnZ2VyCisJCQkgKiB0aGUgdHJhbnNmZXIKKwkJCSAqLworCQkJX19yYXdfd3JpdGVsKDAsIHNhaWYtPmJhc2UgKyBTQUlGX0RBVEEpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHJlYWQgYSBkYXRhIGZyb20gc2FpZiBkYXRhIHJlZ2lzdGVyIHRvIHRyaWdnZXIKKwkJCSAqIHRoZSByZWNlaXZlCisJCQkgKi8KKwkJCV9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX0RBVEEpOworCQl9CisKKwkJbWFzdGVyX3NhaWYtPm9uZ29pbmcgPSAxOworCisJCWRldl9kYmcoc2FpZi0+ZGV2LCAiQ1RSTCAweCV4IFNUQVQgMHgleFxuIiwKKwkJCV9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX0NUUkwpLAorCQkJX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfU1RBVCkpOworCisJCWRldl9kYmcobWFzdGVyX3NhaWYtPmRldiwgIkNUUkwgMHgleCBTVEFUIDB4JXhcbiIsCisJCQlfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCksCisJCQlfX3Jhd19yZWFkbChtYXN0ZXJfc2FpZi0+YmFzZSArIFNBSUZfU1RBVCkpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJZGV2X2RiZyhjcHVfZGFpLT5kZXYsICJzdG9wXG4iKTsKKworCQkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBjdXJyZW50IHNhbXBsZSB0byBjb21wbGV0ZSAqLworCQlkZWxheSA9IFVTRUNfUEVSX1NFQyAvIG1hc3Rlcl9zYWlmLT5jdXJfcmF0ZTsKKworCQlpZiAoIW1hc3Rlcl9zYWlmLT5tY2xrX2luX3VzZSkgeworCQkJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9SVU4sCisJCQkJbWFzdGVyX3NhaWYtPmJhc2UgKyBTQUlGX0NUUkwgKyBNWFNfQ0xSX0FERFIpOworCQkJdWRlbGF5KGRlbGF5KTsKKwkJfQorCQljbGtfZGlzYWJsZShtYXN0ZXJfc2FpZi0+Y2xrKTsKKworCQlpZiAoc2FpZiAhPSBtYXN0ZXJfc2FpZikgeworCQkJX19yYXdfd3JpdGVsKEJNX1NBSUZfQ1RSTF9SVU4sCisJCQkJc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCArIE1YU19DTFJfQUREUik7CisJCQl1ZGVsYXkoZGVsYXkpOworCQkJY2xrX2Rpc2FibGUoc2FpZi0+Y2xrKTsKKwkJfQorCisJCW1hc3Rlcl9zYWlmLT5vbmdvaW5nID0gMDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNWFNfU0FJRl9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKKyNkZWZpbmUgTVhTX1NBSUZfRk9STUFUUyBcCisJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBteHNfc2FpZl9kYWlfb3BzID0geworCS5zdGFydHVwID0gbXhzX3NhaWZfc3RhcnR1cCwKKwkudHJpZ2dlciA9IG14c19zYWlmX3RyaWdnZXIsCisJLnByZXBhcmUgPSBteHNfc2FpZl9wcmVwYXJlLAorCS5od19wYXJhbXMgPSBteHNfc2FpZl9od19wYXJhbXMsCisJLnNldF9zeXNjbGsgPSBteHNfc2FpZl9zZXRfZGFpX3N5c2NsaywKKwkuc2V0X2ZtdCA9IG14c19zYWlmX3NldF9kYWlfZm10LAorfTsKKworc3RhdGljIGludCBteHNfc2FpZl9kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKworCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgc2FpZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXhzX3NhaWZfZGFpID0geworCS5uYW1lID0gIm14cy1zYWlmIiwKKwkucHJvYmUgPSBteHNfc2FpZl9kYWlfcHJvYmUsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IE1YU19TQUlGX1JBVEVTLAorCQkuZm9ybWF0cyA9IE1YU19TQUlGX0ZPUk1BVFMsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBNWFNfU0FJRl9SQVRFUywKKwkJLmZvcm1hdHMgPSBNWFNfU0FJRl9GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZteHNfc2FpZl9kYWlfb3BzLAorfTsKKworc3RhdGljIGlycXJldHVybl90IG14c19zYWlmX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG14c19zYWlmICpzYWlmID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0OworCisJc3RhdCA9IF9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX1NUQVQpOworCWlmICghKHN0YXQgJiAoQk1fU0FJRl9TVEFUX0ZJRk9fVU5ERVJGTE9XX0lSUSB8CisJCQlCTV9TQUlGX1NUQVRfRklGT19PVkVSRkxPV19JUlEpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHN0YXQgJiBCTV9TQUlGX1NUQVRfRklGT19VTkRFUkZMT1dfSVJRKSB7CisJCWRldl9kYmcoc2FpZi0+ZGV2LCAidW5kZXJydW4hISEgJWRcbiIsICsrc2FpZi0+Zmlmb191bmRlcnJ1bik7CisJCV9fcmF3X3dyaXRlbChCTV9TQUlGX1NUQVRfRklGT19VTkRFUkZMT1dfSVJRLAorCQkJCXNhaWYtPmJhc2UgKyBTQUlGX1NUQVQgKyBNWFNfQ0xSX0FERFIpOworCX0KKworCWlmIChzdGF0ICYgQk1fU0FJRl9TVEFUX0ZJRk9fT1ZFUkZMT1dfSVJRKSB7CisJCWRldl9kYmcoc2FpZi0+ZGV2LCAib3ZlcnJ1biEhISAlZFxuIiwgKytzYWlmLT5maWZvX292ZXJydW4pOworCQlfX3Jhd193cml0ZWwoQk1fU0FJRl9TVEFUX0ZJRk9fT1ZFUkZMT1dfSVJRLAorCQkJCXNhaWYtPmJhc2UgKyBTQUlGX1NUQVQgKyBNWFNfQ0xSX0FERFIpOworCX0KKworCWRldl9kYmcoc2FpZi0+ZGV2LCAiU0FJRl9DVFJMICV4IFNBSUZfU1RBVCAleFxuIiwKKwkgICAgICAgX19yYXdfcmVhZGwoc2FpZi0+YmFzZSArIFNBSUZfQ1RSTCksCisJICAgICAgIF9fcmF3X3JlYWRsKHNhaWYtPmJhc2UgKyBTQUlGX1NUQVQpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBteHNfc2FpZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqaW9yZXMsICpkbWFyZXM7CisJc3RydWN0IG14c19zYWlmICpzYWlmOworCXN0cnVjdCBteHNfc2FpZl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwZGV2LT5pZCA+PSBBUlJBWV9TSVpFKG14c19zYWlmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgeworCQlyZXQgPSBwZGF0YS0+aW5pdCgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzYWlmID0ga3phbGxvYyhzaXplb2YoKnNhaWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhaWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbXhzX3NhaWZbcGRldi0+aWRdID0gc2FpZjsKKwlzYWlmLT5pZCA9IHBkZXYtPmlkOworCisJc2FpZi0+bWFzdGVyX2lkID0gc2FpZi0+aWQ7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5nZXRfbWFzdGVyX2lkKSB7CisJCXNhaWYtPm1hc3Rlcl9pZCA9IHBkYXRhLT5nZXRfbWFzdGVyX2lkKHNhaWYtPmlkKTsKKwkJaWYgKHNhaWYtPm1hc3Rlcl9pZCA8IDAgfHwKKwkJCXNhaWYtPm1hc3Rlcl9pZCA+PSBBUlJBWV9TSVpFKG14c19zYWlmKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNhaWYtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihzYWlmLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoc2FpZi0+Y2xrKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCB0aGUgY2xvY2s6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBmYWlsZWRfY2xrOworCX0KKworCWlvcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIWlvcmVzKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaW8gcmVzb3VyY2U6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBmYWlsZWRfZ2V0X3Jlc291cmNlOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcyksCisJCQkJIm14cy1zYWlmIikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmYWlsZWRfZ2V0X3Jlc291cmNlOworCX0KKworCXNhaWYtPmJhc2UgPSBpb3JlbWFwKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworCWlmICghc2FpZi0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CisJfQorCisJZG1hcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAwKTsKKwlpZiAoIWRtYXJlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGRtYSByZXNvdXJjZTogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGZhaWxlZF9pb3JlbWFwOworCX0KKwlzYWlmLT5kbWFfcGFyYW0uY2hhbl9udW0gPSBkbWFyZXMtPnN0YXJ0OworCisJc2FpZi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoc2FpZi0+aXJxIDwgMCkgeworCQlyZXQgPSBzYWlmLT5pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlOiAlZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZmFpbGVkX2dldF9pcnExOworCX0KKworCXNhaWYtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0ID0gcmVxdWVzdF9pcnEoc2FpZi0+aXJxLCBteHNfc2FpZl9pcnEsIDAsICJteHMtc2FpZiIsIHNhaWYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxXG4iKTsKKwkJZ290byBmYWlsZWRfZ2V0X2lycTE7CisJfQorCisJc2FpZi0+ZG1hX3BhcmFtLmNoYW5faXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoc2FpZi0+ZG1hX3BhcmFtLmNoYW5faXJxIDwgMCkgeworCQlyZXQgPSBzYWlmLT5kbWFfcGFyYW0uY2hhbl9pcnE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZG1hIGlycSByZXNvdXJjZTogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGZhaWxlZF9nZXRfaXJxMjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzYWlmKTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYsICZteHNfc2FpZl9kYWkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXIgREFJIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkX3JlZ2lzdGVyOworCX0KKworCXNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKAorCQkJCQkibXhzLXBjbS1hdWRpbyIsIHBkZXYtPmlkKTsKKwlpZiAoIXNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX3BkZXZfYWxsb2M7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYsIHNhaWYpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBzb2MgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsZWRfcGRldl9hZGQ7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9wZGV2X2FkZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNhaWYtPnNvY19wbGF0Zm9ybV9wZGV2KTsKK2ZhaWxlZF9wZGV2X2FsbG9jOgorCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7CitmYWlsZWRfcmVnaXN0ZXI6CitmYWlsZWRfZ2V0X2lycTI6CisJZnJlZV9pcnEoc2FpZi0+aXJxLCBzYWlmKTsKK2ZhaWxlZF9nZXRfaXJxMToKKwlpb3VubWFwKHNhaWYtPmJhc2UpOworZmFpbGVkX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb3JlcykpOworZmFpbGVkX2dldF9yZXNvdXJjZToKKwljbGtfcHV0KHNhaWYtPmNsayk7CitmYWlsZWRfY2xrOgorCWtmcmVlKHNhaWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXhzX3NhaWZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXN0cnVjdCBteHNfc2FpZiAqc2FpZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2FpZi0+c29jX3BsYXRmb3JtX3BkZXYpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmcGRldi0+ZGV2KTsKKworCWlvdW5tYXAoc2FpZi0+YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJZnJlZV9pcnEoc2FpZi0+aXJxLCBzYWlmKTsKKworCWNsa19wdXQoc2FpZi0+Y2xrKTsKKwlrZnJlZShzYWlmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHNfc2FpZl9kcml2ZXIgPSB7CisJLnByb2JlID0gbXhzX3NhaWZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG14c19zYWlmX3JlbW92ZSksCisKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtc2FpZiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNfc2FpZl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhzX3NhaWZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG14c19zYWlmX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhzX3NhaWZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXhzX3NhaWZfaW5pdCk7Cittb2R1bGVfZXhpdChteHNfc2FpZl9leGl0KTsKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1YUyBBU29DIFNBSUYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXhzL214cy1zYWlmLmggYi9zb3VuZC9zb2MvbXhzL214cy1zYWlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjOTFlNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXNhaWYuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworCisjaWZuZGVmIF9NWFNfU0FJRl9ICisjZGVmaW5lIF9NWFNfU0FJRl9ICisKKyNkZWZpbmUgU0FJRl9DVFJMCTB4MAorI2RlZmluZSBTQUlGX1NUQVQJMHgxMAorI2RlZmluZSBTQUlGX0RBVEEJMHgyMAorI2RlZmluZSBTQUlGX1ZFUlNJT04JMFgzMAorCisvKiBTQUlGX0NUUkwgKi8KKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1NGVFJTVAkJMHg4MDAwMDAwMAorI2RlZmluZSBCTV9TQUlGX0NUUkxfQ0xLR0FURQkJMHg0MDAwMDAwMAorI2RlZmluZSBCUF9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURQkyNworI2RlZmluZSBCTV9TQUlGX0NUUkxfQklUQ0xLX01VTFRfUkFURQkweDM4MDAwMDAwCisjZGVmaW5lIEJGX1NBSUZfQ1RSTF9CSVRDTEtfTVVMVF9SQVRFKHYpIFwKKwkJKCgodikgPDwgMjcpICYgQk1fU0FJRl9DVFJMX0JJVENMS19NVUxUX1JBVEUpCisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9CSVRDTEtfQkFTRV9SQVRFCTB4MDQwMDAwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0ZJRk9fRVJST1JfSVJRX0VOCTB4MDIwMDAwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0ZJRk9fU0VSVklDRV9JUlFfRU4JMHgwMTAwMDAwMAorI2RlZmluZSBCUF9TQUlGX0NUUkxfUlNSVkQyCQkyMQorI2RlZmluZSBCTV9TQUlGX0NUUkxfUlNSVkQyCQkweDAwRTAwMDAwCisKKyNkZWZpbmUgQlBfU0FJRl9DVFJMX0RNQVdBSVRfQ09VTlQJMTYKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0RNQVdBSVRfQ09VTlQJMHgwMDFGMDAwMAorI2RlZmluZSBCRl9TQUlGX0NUUkxfRE1BV0FJVF9DT1VOVCh2KSBcCisJCSgoKHYpIDw8IDE2KSAmIEJNX1NBSUZfQ1RSTF9ETUFXQUlUX0NPVU5UKQorI2RlZmluZSBCUF9TQUlGX0NUUkxfQ0hBTk5FTF9OVU1fU0VMRUNUIDE0CisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9DSEFOTkVMX05VTV9TRUxFQ1QgMHgwMDAwQzAwMAorI2RlZmluZSBCRl9TQUlGX0NUUkxfQ0hBTk5FTF9OVU1fU0VMRUNUKHYpIFwKKwkJKCgodikgPDwgMTQpICYgQk1fU0FJRl9DVFJMX0NIQU5ORUxfTlVNX1NFTEVDVCkKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0xSQ0xLX1BVTFNFCTB4MDAwMDIwMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0JJVF9PUkRFUgkJMHgwMDAwMTAwMAorI2RlZmluZSBCTV9TQUlGX0NUUkxfREVMQVkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0pVU1RJRlkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0xSQ0xLX1BPTEFSSVRZCTB4MDAwMDAyMDAKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX0JJVENMS19FREdFCTB4MDAwMDAxMDAKKyNkZWZpbmUgQlBfU0FJRl9DVFJMX1dPUkRfTEVOR1RICTQKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1dPUkRfTEVOR1RICTB4MDAwMDAwRjAKKyNkZWZpbmUgQkZfU0FJRl9DVFJMX1dPUkRfTEVOR1RIKHYpIFwKKwkJKCgodikgPDwgNCkgJiBCTV9TQUlGX0NUUkxfV09SRF9MRU5HVEgpCisjZGVmaW5lIEJNX1NBSUZfQ1RSTF9CSVRDTEtfNDhYRlNfRU5BQkxFCTB4MDAwMDAwMDgKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1NMQVZFX01PREUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQk1fU0FJRl9DVFJMX1JFQURfTU9ERQkJMHgwMDAwMDAwMgorI2RlZmluZSBCTV9TQUlGX0NUUkxfUlVOCQkweDAwMDAwMDAxCisKKy8qIFNBSUZfU1RBVCAqLworI2RlZmluZSBCTV9TQUlGX1NUQVRfUFJFU0VOVAkJMHg4MDAwMDAwMAorI2RlZmluZSBCUF9TQUlGX1NUQVRfUlNSVkQyCQkxNworI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQyCQkweDdGRkUwMDAwCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDIodikgXAorCQkoKCh2KSA8PCAxNykgJiBCTV9TQUlGX1NUQVRfUlNSVkQyKQorI2RlZmluZSBCTV9TQUlGX1NUQVRfRE1BX1BSRVEJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQlBfU0FJRl9TVEFUX1JTUlZEMQkJNworI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQxCQkweDAwMDBGRjgwCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDEodikgXAorCQkoKCh2KSA8PCA3KSAmIEJNX1NBSUZfU1RBVF9SU1JWRDEpCisKKyNkZWZpbmUgQk1fU0FJRl9TVEFUX0ZJRk9fVU5ERVJGTE9XX0lSUSAweDAwMDAwMDQwCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9GSUZPX09WRVJGTE9XX0lSUQkweDAwMDAwMDIwCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9GSUZPX1NFUlZJQ0VfSVJRCTB4MDAwMDAwMTAKKyNkZWZpbmUgQlBfU0FJRl9TVEFUX1JTUlZEMAkJMQorI2RlZmluZSBCTV9TQUlGX1NUQVRfUlNSVkQwCQkweDAwMDAwMDBFCisjZGVmaW5lIEJGX1NBSUZfU1RBVF9SU1JWRDAodikgXAorCQkoKCh2KSA8PCAxKSAmIEJNX1NBSUZfU1RBVF9SU1JWRDApCisjZGVmaW5lIEJNX1NBSUZfU1RBVF9CVVNZCQkweDAwMDAwMDAxCisKKy8qIFNBRklfREFUQSAqLworI2RlZmluZSBCUF9TQUlGX0RBVEFfUENNX1JJR0hUCQkxNgorI2RlZmluZSBCTV9TQUlGX0RBVEFfUENNX1JJR0hUCQkweEZGRkYwMDAwCisjZGVmaW5lIEJGX1NBSUZfREFUQV9QQ01fUklHSFQodikgXAorCQkoKCh2KSA8PCAxNikgJiBCTV9TQUlGX0RBVEFfUENNX1JJR0hUKQorI2RlZmluZSBCUF9TQUlGX0RBVEFfUENNX0xFRlQJCTAKKyNkZWZpbmUgQk1fU0FJRl9EQVRBX1BDTV9MRUZUCQkweDAwMDBGRkZGCisjZGVmaW5lIEJGX1NBSUZfREFUQV9QQ01fTEVGVCh2KQlcCisJCSgoKHYpIDw8IDApICYgQk1fU0FJRl9EQVRBX1BDTV9MRUZUKQorCisvKiBTQUlGX1ZFUlNJT04gKi8KKyNkZWZpbmUgQlBfU0FJRl9WRVJTSU9OX01BSk9SCQkyNAorI2RlZmluZSBCTV9TQUlGX1ZFUlNJT05fTUFKT1IJCTB4RkYwMDAwMDAKKyNkZWZpbmUgQkZfU0FJRl9WRVJTSU9OX01BSk9SKHYpIFwKKwkJKCgodikgPDwgMjQpICYgQk1fU0FJRl9WRVJTSU9OX01BSk9SKQorI2RlZmluZSBCUF9TQUlGX1ZFUlNJT05fTUlOT1IJCTE2CisjZGVmaW5lIEJNX1NBSUZfVkVSU0lPTl9NSU5PUgkJMHgwMEZGMDAwMAorI2RlZmluZSBCRl9TQUlGX1ZFUlNJT05fTUlOT1IodikgXAorCQkoKCh2KSA8PCAxNikgJiBCTV9TQUlGX1ZFUlNJT05fTUlOT1IpCisjZGVmaW5lIEJQX1NBSUZfVkVSU0lPTl9TVEVQCQkwCisjZGVmaW5lIEJNX1NBSUZfVkVSU0lPTl9TVEVQCQkweDAwMDBGRkZGCisjZGVmaW5lIEJGX1NBSUZfVkVSU0lPTl9TVEVQKHYpIFwKKwkJKCgodikgPDwgMCkgJiBCTV9TQUlGX1ZFUlNJT05fU1RFUCkKKworI2RlZmluZSBNWFNfU0FJRl9NQ0xLCQkwCisKKyNpbmNsdWRlICJteHMtcGNtLmgiCisKK3N0cnVjdCBteHNfc2FpZiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjbGsgKmNsazsKKwl1bnNpZ25lZCBpbnQgbWNsazsKKwl1bnNpZ25lZCBpbnQgbWNsa19pbl91c2U7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCBpcnE7CisJc3RydWN0IG14c19wY21fZG1hX3BhcmFtcyBkbWFfcGFyYW07CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBtYXN0ZXJfaWQ7CisJdW5zaWduZWQgaW50IGN1cl9yYXRlOworCXVuc2lnbmVkIGludCBvbmdvaW5nOworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29jX3BsYXRmb3JtX3BkZXY7CisJdTMyIGZpZm9fdW5kZXJydW47CisJdTMyIGZpZm9fb3ZlcnJ1bjsKK307CisKK2V4dGVybiBpbnQgbXhzX3NhaWZfcHV0X21jbGsodW5zaWduZWQgaW50IHNhaWZfaWQpOworZXh0ZXJuIGludCBteHNfc2FpZl9nZXRfbWNsayh1bnNpZ25lZCBpbnQgc2FpZl9pZCwgdW5zaWduZWQgaW50IG1jbGssCisJCQkJCXVuc2lnbmVkIGludCByYXRlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL214cy9teHMtc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9teHMvbXhzLXNndGw1MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZWFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXNndGw1MDAwLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3NndGw1MDAwLmgiCisjaW5jbHVkZSAibXhzLXNhaWYuaCIKKworc3RhdGljIGludCBteHNfc2d0bDUwMDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwl1bnNpZ25lZCBpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJdTMyIGRhaV9mb3JtYXQsIG1jbGs7CisJaW50IHJldDsKKworCS8qIHNndGw1MDAwIGRvZXMgbm90IHN1cHBvcnQgNTEyKnJhdGUgd2hlbiBpbiA5NjAwMCBmcyAqLworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgOTYwMDA6CisJCW1jbGsgPSAyNTYgKiByYXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltY2xrID0gNTEyICogcmF0ZTsKKwkJYnJlYWs7CisJfQorCisJLyogU2d0bDUwMDAgc3lzY2xrIHNob3VsZCBiZSA+PSA4TUh6IGFuZCA8PSAyN00gKi8KKwlpZiAobWNsayA8IDgwMDAwMDAgfHwgbWNsayA+IDI3MDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldCBTR1RMNTAwMCdzIFNZU0NMSyAocHJvdmlkZWQgYnkgU0FJRiBNQ0xLKSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBTR1RMNTAwMF9TWVNDTEssIG1jbGssIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUaGUgU0FJRiBNQ0xLIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBTR1RMNTAwMF9TWVNDTEsgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIE1YU19TQUlGX01DTEssIG1jbGssIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY29kZWMgdG8gc2xhdmUgbW9kZSAqLworCWRhaV9mb3JtYXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOworCisJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIGRhaV9mb3JtYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBkYWlfZm9ybWF0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXhzX3NndGw1MDAwX2hpZmlfb3BzID0geworCS5od19wYXJhbXMgPSBteHNfc2d0bDUwMDBfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG14c19zZ3RsNTAwMF9kYWlbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJIaUZpIFR4IiwKKwkJLnN0cmVhbV9uYW1lCT0gIkhpRmkgUGxheWJhY2siLAorCQkuY29kZWNfZGFpX25hbWUJPSAic2d0bDUwMDAiLAorCQkuY29kZWNfbmFtZQk9ICJzZ3RsNTAwMC4wLTAwMGEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIm14cy1zYWlmLjAiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJteHMtcGNtLWF1ZGlvLjAiLAorCQkub3BzCQk9ICZteHNfc2d0bDUwMDBfaGlmaV9vcHMsCisJfSwgeworCQkubmFtZQkJPSAiSGlGaSBSeCIsCisJCS5zdHJlYW1fbmFtZQk9ICJIaUZpIENhcHR1cmUiLAorCQkuY29kZWNfZGFpX25hbWUJPSAic2d0bDUwMDAiLAorCQkuY29kZWNfbmFtZQk9ICJzZ3RsNTAwMC4wLTAwMGEiLAorCQkuY3B1X2RhaV9uYW1lCT0gIm14cy1zYWlmLjEiLAorCQkucGxhdGZvcm1fbmFtZQk9ICJteHMtcGNtLWF1ZGlvLjEiLAorCQkub3BzCQk9ICZteHNfc2d0bDUwMDBfaGlmaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIG14c19zZ3RsNTAwMCA9IHsKKwkubmFtZQkJPSAibXhzX3NndGw1MDAwIiwKKwkuZGFpX2xpbmsJPSBteHNfc2d0bDUwMDBfZGFpLAorCS5udW1fbGlua3MJPSBBUlJBWV9TSVpFKG14c19zZ3RsNTAwMF9kYWkpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbXhzX3NndGw1MDAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZteHNfc2d0bDUwMDA7CisJaW50IHJldDsKKworCS8qCisJICogU2V0IGFuIGluaXQgY2xvY2soMTEuMjhNaHopIGZvciBzZ3RsNTAwMCBpbml0aWFsaXphdGlvbihpMmMgci93KS4KKwkgKiBUaGUgU2d0bDUwMDAgc3lzY2xrIGlzIGRlcml2ZWQgZnJvbSBzYWlmMCBtY2xrIGFuZCBpdCdzIHJhbmdlCisJICogc2hvdWxkIGJlID49IDhNSHogYW5kIDw9IDI3TS4KKwkgKi8KKwlyZXQgPSBteHNfc2FpZl9nZXRfbWNsaygwLCA0NDEwMCAqIDI1NiwgNDQxMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXhzX3NndGw1MDAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW14c19zYWlmX3B1dF9tY2xrKDApOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXhzX3NndGw1MDAwX2F1ZGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJteHMtc2d0bDUwMDAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG14c19zZ3RsNTAwMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXhzX3NndGw1MDAwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNfc2d0bDUwMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm14c19zZ3RsNTAwMF9hdWRpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXhzX3NndGw1MDAwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhzX3NndGw1MDAwX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhzX3NndGw1MDAwX2F1ZGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChteHNfc2d0bDUwMDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1YUyBBTFNBIFNvQyBNYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL251YzkwMC9udWM5MDAtcGNtLmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwppbmRleCBkNTg5ZWYxLi5hZThkNjgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYworKysgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG51YzkwMF9kbWFfZ2V0cG9zaXRpb24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCitzdGF0aWMgaW50IG51YzkwMF9kbWFfZ2V0cG9zaXRpb24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJCWRtYV9hZGRyX3QgKnNyYywgZG1hX2FkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAludWM5MDBfYXVkaW8gPSBudWM5MDBfYWM5N19kYXRhOwogCiAJaWYgKHJlcXVlc3RfaXJxKG51YzkwMF9hdWRpby0+aXJxX251bSwgbnVjOTAwX2RtYV9pbnRlcnJ1cHQsCi0JCQlJUlFGX0RJU0FCTEVELCAibnVjOTAwLWRtYSIsIHN1YnN0cmVhbSkpCisJCQkwLCAibnVjOTAwLWRtYSIsIHN1YnN0cmVhbSkpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBudWM5MDBfYXVkaW87CkBAIC0zMTgsNyArMzE4LDYgQEAKIHN0YXRpYyBpbnQgbnVjOTAwX2RtYV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL01ha2VmaWxlIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKaW5kZXggNTllMmM4ZC4uMDUyZmQ3NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL29tYXAvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjIE9NQVAgUGxhdGZvcm0gU3VwcG9ydAogc25kLXNvYy1vbWFwLW9ianMgOj0gb21hcC1wY20ubwogc25kLXNvYy1vbWFwLW1jYnNwLW9ianMgOj0gb21hcC1tY2JzcC5vCi1zbmQtc29jLW9tYXAtbWNwZG0tb2JqcyA6PSBvbWFwLW1jcGRtLm8gbWNwZG0ubworc25kLXNvYy1vbWFwLW1jcGRtLW9ianMgOj0gb21hcC1tY3BkbS5vCiBzbmQtc29jLW9tYXAtaGRtaS1vYmpzIDo9IG9tYXAtaGRtaS5vCiAKIG9iai0kKENPTkZJR19TTkRfT01BUF9TT0MpICs9IHNuZC1zb2Mtb21hcC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9hbTM1MTdldm0uYyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCmluZGV4IDczZGRlNGEuLmMxY2Q0YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CkBAIC00MywyNiArNDQsNiBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlpbnQgcmV0OwogCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0RTUF9CIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsCiAJCQlDT0RFQ19DTE9DSywgU05EX1NPQ19DTE9DS19JTik7CkBAIC0xMTAsMjggKzkxLDYgQEAKIAl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBJbiJ9LAogfTsKIAotc3RhdGljIGludCBhbTM1MTdldm1fYWljMjNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCi0JLyogQWRkIGFtMzUxNy1ldm0gc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSW4iKTsKLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGFtMzUxN2V2bV9kYWkgPSB7CiAJLm5hbWUgPSAiVExWMzIwQUlDMjMiLApAQCAtMTQwLDcgKzk5LDggQEAKIAkuY29kZWNfZGFpX25hbWUgPSAidGx2MzIwYWljMjMtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjLjItMDAxYSIsCi0JLmluaXQgPSBhbTM1MTdldm1fYWljMjNfaW5pdCwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9CIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmYW0zNTE3ZXZtX29wcywKIH07CiAKQEAgLTE0OSw2ICsxMDksMTEgQEAKIAkubmFtZSA9ICJhbTM1MTdldm0iLAogCS5kYWlfbGluayA9ICZhbTM1MTdldm1fZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphbTM1MTdldm1fc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKaW5kZXggMGFhNDc1Zi4uY2NiOGE2YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKKysrIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTU2OSw3ICs1NzAsNiBAQAogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ09VVCIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJLyogQWRkIHZpcnR1YWwgc3dpdGNoICovCiAJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGFtc19kZWx0YV9hdWRpb19jb250cm9scywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2lnZXAwMDIwLmMgYi9zb3VuZC9zb2Mvb21hcC9pZ2VwMDAyMC5jCmluZGV4IDBhZTM0NzAuLjU5MWZiZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2lnZXAwMDIwLmMKKysrIGIvc291bmQvc29jL29tYXAvaWdlcDAwMjAuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzgsMjkgKzM5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC04NCw2ICs2NCw4IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmaWdlcDJfb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbWNwZG0uYyBiL3NvdW5kL3NvYy9vbWFwL21jcGRtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTU5MTkuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL29tYXAvbWNwZG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKgotICogbWNwZG0uYyAgLS0JTWNQRE0gaW50ZXJmYWNlIGRyaXZlcgotICoKLSAqIEF1dGhvcjogSm9yZ2UgRWR1YXJkbyBDYW5kZWxhcmlhIDx4MDEwNzIwOUB0aS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgIm1jcGRtLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21jcGRtX3dyaXRlKHUxNiByZWcsIHUzMiB2YWwpCi17Ci0JX19yYXdfd3JpdGVsKHZhbCwgbWNwZG0tPmlvX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBvbWFwX21jcGRtX3JlYWQodTE2IHJlZykKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwobWNwZG0tPmlvX2Jhc2UgKyByZWcpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX21jcGRtX3JlZ19kdW1wKHZvaWQpCi17Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVU19SQVc6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRU1RBVFVTX1JBVykpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVUzoJMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0lSUVNUQVRVUykpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUUVOQUJMRV9TRVQ6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRRU5BQkxFX1NFVCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUUVOQUJMRV9DTFI6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fSVJRRU5BQkxFX0NMUikpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVdBS0VfRU46IDB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9JUlFXQUtFX0VOKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRE1BRU5BQkxFX1NFVDogMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0RNQUVOQUJMRV9TRVQpKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFFTkFCTEVfQ0xSOiAgMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0RNQUVOQUJMRV9DTFIpKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFXQUtFRU46CTB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9ETUFXQUtFRU4pKTsKLQlkZXZfZGJnKG1jcGRtLT5kZXYsICJDVFJMOgkweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fQ1RSTCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIkROX0RBVEE6ICAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fRE5fREFUQSkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIlVQX0RBVEE6IDB4JTA0eFxuIiwKLQkJCW9tYXBfbWNwZG1fcmVhZChNQ1BETV9VUF9EQVRBKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX0ROOiAweCUwNHhcbiIsCi0JCQlvbWFwX21jcGRtX3JlYWQoTUNQRE1fRklGT19DVFJMX0ROKSk7Ci0JZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX1VQOiAgMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0ZJRk9fQ1RSTF9VUCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIkROX09GRlNFVDoJMHglMDR4XG4iLAotCQkJb21hcF9tY3BkbV9yZWFkKE1DUERNX0ROX09GRlNFVCkpOwotCWRldl9kYmcobWNwZG0tPmRldiwgIioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLX0KLQotLyoKLSAqIFRha2VzIHRoZSBNY1BETSBtb2R1bGUgaW4gYW5kIG91dCBvZiByZXNldCBzdGF0ZS4KLSAqIFVwbGluayBhbmQgZG93bmxpbmsgY2FuIGJlIHJlc2V0IGluZGl2aWR1YWxseS4KLSAqLwotc3RhdGljIHZvaWQgb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKGludCByZXNldCkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChyZXNldCkKLQkJY3RybCB8PSBTV19VUF9SU1Q7Ci0JZWxzZQotCQljdHJsICY9IH5TV19VUF9SU1Q7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKGludCByZXNldCkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChyZXNldCkKLQkJY3RybCB8PSBTV19ETl9SU1Q7Ci0JZWxzZQotCQljdHJsICY9IH5TV19ETl9SU1Q7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotfQotCi0vKgotICogRW5hYmxlcyB0aGUgdHJhbnNmZXIgdGhyb3VnaCB0aGUgUERNIGludGVyZmFjZSB0by9mcm9tIHRoZSBQaG9lbml4Ci0gKiBjb2RlYyBieSBlbmFibGluZyB0aGUgY29ycmVzcG9uZGluZyBVUCBvciBETiBjaGFubmVscy4KLSAqLwotdm9pZCBvbWFwX21jcGRtX3N0YXJ0KGludCBzdHJlYW0pCi17Ci0JaW50IGN0cmwgPSBvbWFwX21jcGRtX3JlYWQoTUNQRE1fQ1RSTCk7Ci0KLQlpZiAoc3RyZWFtKQotCQljdHJsIHw9IG1jcGRtLT51cF9jaGFubmVsczsKLQllbHNlCi0JCWN0cmwgfD0gbWNwZG0tPmRuX2NoYW5uZWxzOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCBjdHJsKTsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSB0cmFuc2ZlciB0aHJvdWdoIHRoZSBQRE0gaW50ZXJmYWNlIHRvL2Zyb20gdGhlIFBob2VuaXgKLSAqIGNvZGVjIGJ5IGRpc2FibGluZyB0aGUgY29ycmVzcG9uZGluZyBVUCBvciBETiBjaGFubmVscy4KLSAqLwotdm9pZCBvbWFwX21jcGRtX3N0b3AoaW50IHN0cmVhbSkKLXsKLQlpbnQgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQotCWlmIChzdHJlYW0pCi0JCWN0cmwgJj0gfm1jcGRtLT51cF9jaGFubmVsczsKLQllbHNlCi0JCWN0cmwgJj0gfm1jcGRtLT5kbl9jaGFubmVsczsKLQotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fQ1RSTCwgY3RybCk7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmVzIE1jUERNIHVwbGluayBmb3IgYXVkaW8gcmVjb3JkaW5nLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBvbWFwX21jcGRtX3N0YXJ0LgotICovCi1pbnQgb21hcF9tY3BkbV9jYXB0dXJlX29wZW4oc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKQotewotCWludCBpcnFfbWFzayA9IDA7Ci0JaW50IGN0cmw7Ci0KLQlpZiAoIXVwbGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY3BkbS0+dXBsaW5rID0gdXBsaW5rOwotCi0JLyogRW5hYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSB1cGxpbmstPmlycV9tYXNrICYgTUNQRE1fVVBMSU5LX0lSUV9NQVNLOwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fSVJRRU5BQkxFX1NFVCwgaXJxX21hc2spOwotCi0JLyogQ29uZmlndXJlIHVwbGluayB0aHJlc2hvbGQgKi8KLQlpZiAodXBsaW5rLT50aHJlc2hvbGQgPiBVUF9USFJFU19NQVgpCi0JCXVwbGluay0+dGhyZXNob2xkID0gVVBfVEhSRVNfTUFYOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9GSUZPX0NUUkxfVVAsIHVwbGluay0+dGhyZXNob2xkKTsKLQotCS8qIENvbmZpZ3VyZSBETUEgY29udHJvbGxlciAqLwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE1BRU5BQkxFX1NFVCwgRE1BX1VQX0VOQUJMRSk7Ci0KLQkvKiBTZXQgcGRtIG91dCBmb3JtYXQgKi8KLQljdHJsID0gb21hcF9tY3BkbV9yZWFkKE1DUERNX0NUUkwpOwotCWN0cmwgJj0gflBETU9VVEZPUk1BVDsKLQljdHJsIHw9IHVwbGluay0+Zm9ybWF0ICYgUERNT1VURk9STUFUOwotCi0JLyogVXBsaW5rIGNoYW5uZWxzICovCi0JbWNwZG0tPnVwX2NoYW5uZWxzID0gdXBsaW5rLT5jaGFubmVscyAmIChQRE1fVVBfTUFTSyB8IFBETV9TVEFUVVNfTUFTSyk7Ci0KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0NUUkwsIGN0cmwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmVzIE1jUERNIGRvd25saW5rIGZvciBhdWRpbyBwbGF5YmFjay4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb21hcF9tY3BkbV9zdGFydC4KLSAqLwotaW50IG9tYXBfbWNwZG1fcGxheWJhY2tfb3BlbihzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluaykKLXsKLQlpbnQgaXJxX21hc2sgPSAwOwotCWludCBjdHJsOwotCi0JaWYgKCFkb3dubGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY3BkbS0+ZG93bmxpbmsgPSBkb3dubGluazsKLQotCS8qIEVuYWJsZSBpcnEgcmVxdWVzdCBnZW5lcmF0aW9uICovCi0JaXJxX21hc2sgfD0gZG93bmxpbmstPmlycV9tYXNrICYgTUNQRE1fRE9XTkxJTktfSVJRX01BU0s7Ci0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9JUlFFTkFCTEVfU0VULCBpcnFfbWFzayk7Ci0KLQkvKiBDb25maWd1cmUgdXBsaW5rIHRocmVzaG9sZCAqLwotCWlmIChkb3dubGluay0+dGhyZXNob2xkID4gRE5fVEhSRVNfTUFYKQotCQlkb3dubGluay0+dGhyZXNob2xkID0gRE5fVEhSRVNfTUFYOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9GSUZPX0NUUkxfRE4sIGRvd25saW5rLT50aHJlc2hvbGQpOwotCi0JLyogRW5hYmxlIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0RNQUVOQUJMRV9TRVQsIERNQV9ETl9FTkFCTEUpOwotCi0JLyogU2V0IHBkbSBvdXQgZm9ybWF0ICovCi0JY3RybCA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9DVFJMKTsKLQljdHJsICY9IH5QRE1PVVRGT1JNQVQ7Ci0JY3RybCB8PSBkb3dubGluay0+Zm9ybWF0ICYgUERNT1VURk9STUFUOwotCi0JLyogRG93bmxpbmsgY2hhbm5lbHMgKi8KLQltY3BkbS0+ZG5fY2hhbm5lbHMgPSBkb3dubGluay0+Y2hhbm5lbHMgJiAoUERNX0ROX01BU0sgfCBQRE1fQ01EX01BU0spOwotCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCBjdHJsKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2xlYW5zIE1jUERNIHVwbGluayBjb25maWd1cmF0aW9uLgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gKi8KLWludCBvbWFwX21jcGRtX2NhcHR1cmVfY2xvc2Uoc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKQotewotCWludCBpcnFfbWFzayA9IDA7Ci0KLQlpZiAoIXVwbGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSB1cGxpbmstPmlycV9tYXNrICYgTUNQRE1fVVBMSU5LX0lSUV9NQVNLOwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fSVJRRU5BQkxFX0NMUiwgaXJxX21hc2spOwotCi0JLyogRGlzYWJsZSBETUEgcmVxdWVzdCBnZW5lcmF0aW9uICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9ETUFFTkFCTEVfQ0xSLCBETUFfVVBfRU5BQkxFKTsKLQotCS8qIENsZWFyIERvd25saW5rIGNoYW5uZWxzICovCi0JbWNwZG0tPnVwX2NoYW5uZWxzID0gMDsKLQotCW1jcGRtLT51cGxpbmsgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDbGVhbnMgTWNQRE0gZG93bmxpbmsgY29uZmlndXJhdGlvbi4KLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgotICovCi1pbnQgb21hcF9tY3BkbV9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluaykKLXsKLQlpbnQgaXJxX21hc2sgPSAwOwotCi0JaWYgKCFkb3dubGluaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gKi8KLQlpcnFfbWFzayB8PSBkb3dubGluay0+aXJxX21hc2sgJiBNQ1BETV9ET1dOTElOS19JUlFfTUFTSzsKLQlvbWFwX21jcGRtX3dyaXRlKE1DUERNX0lSUUVOQUJMRV9DTFIsIGlycV9tYXNrKTsKLQotCS8qIERpc2FibGUgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiAqLwotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE1BRU5BQkxFX0NMUiwgRE1BX0ROX0VOQUJMRSk7Ci0KLQkvKiBjbGVhciBEb3dubGluayBjaGFubmVscyAqLwotCW1jcGRtLT5kbl9jaGFubmVscyA9IDA7Ci0KLQltY3BkbS0+ZG93bmxpbmsgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jcGRtX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG1faXJxID0gZGV2X2lkOwotCWludCBpcnFfc3RhdHVzOwotCi0JaXJxX3N0YXR1cyA9IG9tYXBfbWNwZG1fcmVhZChNQ1BETV9JUlFTVEFUVVMpOwotCi0JLyogQWNrbm93bGVkZ2UgaXJxIGV2ZW50ICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9JUlFTVEFUVVMsIGlycV9zdGF0dXMpOwotCi0JaWYgKGlycSAmIE1DUERNX0ROX0lSUV9GVUxMKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJETiBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9wbGF5YmFjaygxKTsKLQkJb21hcF9tY3BkbV9wbGF5YmFja19vcGVuKG1jcGRtX2lycS0+ZG93bmxpbmspOwotCQlvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKDApOwotCX0KLQotCWlmIChpcnEgJiBNQ1BETV9ETl9JUlFfRU1QVFkpIHsKLQkJZGV2X2VycihtY3BkbV9pcnEtPmRldiwgIkROIEZJRk8gZXJyb3IgJXhcbiIsIGlycV9zdGF0dXMpOwotCQlvbWFwX21jcGRtX3Jlc2V0X3BsYXliYWNrKDEpOwotCQlvbWFwX21jcGRtX3BsYXliYWNrX29wZW4obWNwZG1faXJxLT5kb3dubGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfcGxheWJhY2soMCk7Ci0JfQotCi0JaWYgKGlycSAmIE1DUERNX0ROX0lSUSkgewotCQlkZXZfZGJnKG1jcGRtX2lycS0+ZGV2LCAiRE4gd3JpdGUgcmVxdWVzdFxuIik7Ci0JfQotCi0JaWYgKGlycSAmIE1DUERNX1VQX0lSUV9GVUxMKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJVUCBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKDEpOwotCQlvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihtY3BkbV9pcnEtPnVwbGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfY2FwdHVyZSgwKTsKLQl9Ci0KLQlpZiAoaXJxICYgTUNQRE1fVVBfSVJRX0VNUFRZKSB7Ci0JCWRldl9lcnIobWNwZG1faXJxLT5kZXYsICJVUCBGSUZPIGVycm9yICV4XG4iLCBpcnFfc3RhdHVzKTsKLQkJb21hcF9tY3BkbV9yZXNldF9jYXB0dXJlKDEpOwotCQlvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihtY3BkbV9pcnEtPnVwbGluayk7Ci0JCW9tYXBfbWNwZG1fcmVzZXRfY2FwdHVyZSgwKTsKLQl9Ci0KLQlpZiAoaXJxICYgTUNQRE1fVVBfSVJRKSB7Ci0JCWRldl9kYmcobWNwZG1faXJxLT5kZXYsICJVUCB3cml0ZSByZXF1ZXN0XG4iKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBvbWFwX21jcGRtX3JlcXVlc3Qodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JY2xrX2VuYWJsZShtY3BkbS0+Y2xrKTsKLQotCXNwaW5fbG9jaygmbWNwZG0tPmxvY2spOwotCi0JaWYgKCFtY3BkbS0+ZnJlZSkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJNY1BETSBpbnRlcmZhY2UgaXMgaW4gdXNlXG4iKTsKLQkJc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycjsKLQl9Ci0JbWNwZG0tPmZyZWUgPSAwOwotCi0Jc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQotCS8qIERpc2FibGUgbGluZXMgd2hpbGUgcmVxdWVzdCBpcyBvbmdvaW5nICovCi0Jb21hcF9tY3BkbV93cml0ZShNQ1BETV9DVFJMLCAweDAwKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKG1jcGRtLT5pcnEsIG9tYXBfbWNwZG1faXJxX2hhbmRsZXIsCi0JCQkJMCwgIk1jUERNIiwgKHZvaWQgKiltY3BkbSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJSZXF1ZXN0IGZvciBNY1BETSBJUlEgZmFpbGVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQljbGtfZGlzYWJsZShtY3BkbS0+Y2xrKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG9tYXBfbWNwZG1fZnJlZSh2b2lkKQotewotCXNwaW5fbG9jaygmbWNwZG0tPmxvY2spOwotCWlmIChtY3BkbS0+ZnJlZSkgewotCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJNY1BETSBpbnRlcmZhY2UgaXMgYWxyZWFkeSBmcmVlXG4iKTsKLQkJc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQltY3BkbS0+ZnJlZSA9IDE7Ci0Jc3Bpbl91bmxvY2soJm1jcGRtLT5sb2NrKTsKLQotCWNsa19kaXNhYmxlKG1jcGRtLT5jbGspOwotCi0JZnJlZV9pcnEobWNwZG0tPmlycSwgKHZvaWQgKiltY3BkbSk7Ci19Ci0KLS8qIEVuYWJsZS9kaXNhYmxlIERDIG9mZnNldCBjYW5jZWxhdGlvbiBmb3IgdGhlIGFuYWxvZwotICogaGVhZHNldCBwYXRoIChQRE0gY2hhbm5lbHMgMSBhbmQgMikuCi0gKi8KLWludCBvbWFwX21jcGRtX3NldF9vZmZzZXQoaW50IG9mZnNldDEsIGludCBvZmZzZXQyKQotewotCWludCBvZmZzZXQ7Ci0KLQlpZiAoKG9mZnNldDEgPiBETl9PRlNUX01BWCkgfHwgKG9mZnNldDIgPiBETl9PRlNUX01BWCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jb2Zmc2V0ID0gKG9mZnNldDEgPDwgRE5fT0ZTVF9SWDEpIHwgKG9mZnNldDIgPDwgRE5fT0ZTVF9SWDIpOwotCi0JLyogb2Zmc2V0IGNhbmNlbGxhdGlvbiBmb3IgY2hhbm5lbCAxICovCi0JaWYgKG9mZnNldDEpCi0JCW9mZnNldCB8PSBETl9PRlNUX1JYMV9FTjsKLQllbHNlCi0JCW9mZnNldCAmPSB+RE5fT0ZTVF9SWDFfRU47Ci0KLQkvKiBvZmZzZXQgY2FuY2VsbGF0aW9uIGZvciBjaGFubmVsIDIgKi8KLQlpZiAob2Zmc2V0MikKLQkJb2Zmc2V0IHw9IEROX09GU1RfUlgyX0VOOwotCWVsc2UKLQkJb2Zmc2V0ICY9IH5ETl9PRlNUX1JYMl9FTjsKLQotCW9tYXBfbWNwZG1fd3JpdGUoTUNQRE1fRE5fT0ZGU0VULCBvZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2RldmluaXQgb21hcF9tY3BkbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQgPSAwOwotCi0JbWNwZG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tY3BkbSksIEdGUF9LRVJORUwpOwotCWlmICghbWNwZG0pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlXG4iKTsKLQkJZ290byBlcnJfcmVzb3VyY2U7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJm1jcGRtLT5sb2NrKTsKLQltY3BkbS0+ZnJlZSA9IDE7Ci0JbWNwZG0tPmlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKCFtY3BkbS0+aW9fYmFzZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9yZXNvdXJjZTsKLQl9Ci0KLQltY3BkbS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQotCW1jcGRtLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwZG1fY2siKTsKLQlpZiAoSVNfRVJSKG1jcGRtLT5jbGspKSB7Ci0JCXJldCA9IFBUUl9FUlIobWNwZG0tPmNsayk7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgcGRtX2NrOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQotCW1jcGRtLT5kZXYgPSAmcGRldi0+ZGV2OwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1jcGRtKTsKLQotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOwotZXJyX3Jlc291cmNlOgotCWtmcmVlKG1jcGRtKTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG9tYXBfbWNwZG1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtX3B0ciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQljbGtfcHV0KG1jcGRtX3B0ci0+Y2xrKTsKLQotCWlvdW5tYXAobWNwZG1fcHRyLT5pb19iYXNlKTsKLQotCW1jcGRtX3B0ci0+Y2xrID0gTlVMTDsKLQltY3BkbV9wdHItPmZyZWUgPSAwOwotCW1jcGRtX3B0ci0+ZGV2ID0gTlVMTDsKLQotCWtmcmVlKG1jcGRtX3B0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbWNwZG0uaCBiL3NvdW5kL3NvYy9vbWFwL21jcGRtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzIwYTguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL29tYXAvbWNwZG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogbWNwZG0uaCAtLSBEZWZpbmVzIGZvciBNY1BETSBkcml2ZXIKLSAqCi0gKiBBdXRob3I6IEpvcmdlIEVkdWFyZG8gQ2FuZGVsYXJpYSA8eDAxMDcyMDlAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSBVU0EKLSAqCi0gKi8KLQotLyogTWNQRE0gcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTUNQRE1fUkVWSVNJT04gICAgICAgICAweDAwCi0jZGVmaW5lIE1DUERNX1NZU0NPTkZJRyAgICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIE1DUERNX0lSUVNUQVRVU19SQVcgICAgMHgyNAotI2RlZmluZSBNQ1BETV9JUlFTVEFUVVMgICAgICAgICAgICAgICAgMHgyOAotI2RlZmluZSBNQ1BETV9JUlFFTkFCTEVfU0VUICAgIDB4MkMKLSNkZWZpbmUgTUNQRE1fSVJRRU5BQkxFX0NMUiAgICAweDMwCi0jZGVmaW5lIE1DUERNX0lSUVdBS0VfRU4gICAgICAgMHgzNAotI2RlZmluZSBNQ1BETV9ETUFFTkFCTEVfU0VUICAgIDB4MzgKLSNkZWZpbmUgTUNQRE1fRE1BRU5BQkxFX0NMUiAgICAweDNDCi0jZGVmaW5lIE1DUERNX0RNQVdBS0VFTiAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIE1DUERNX0NUUkwgICAgICAgICAgICAgMHg0NAotI2RlZmluZSBNQ1BETV9ETl9EQVRBICAgICAgICAgIDB4NDgKLSNkZWZpbmUgTUNQRE1fVVBfREFUQSAgICAgICAgICAweDRDCi0jZGVmaW5lIE1DUERNX0ZJRk9fQ1RSTF9ETiAgICAgMHg1MAotI2RlZmluZSBNQ1BETV9GSUZPX0NUUkxfVVAgICAgIDB4NTQKLSNkZWZpbmUgTUNQRE1fRE5fT0ZGU0VUICAgICAgICAgICAgICAgIDB4NTgKLQotLyoKLSAqIE1DUERNX0lSUSBiaXQgZmllbGRzCi0gKiBJUlFTVEFUVVNfUkFXLCBJUlFTVEFUVVMsIElSUUVOQUJMRV9TRVQsIElSUUVOQUJMRV9DTFIKLSAqLwotCi0jZGVmaW5lIE1DUERNX0ROX0lSUSAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBNQ1BETV9ETl9JUlFfRU1QVFkgICAgICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgTUNQRE1fRE5fSVJRX0FMTVNUX0VNUFRZICAgICAgICgxIDw8IDIpCi0jZGVmaW5lIE1DUERNX0ROX0lSUV9GVUxMICAgICAgICAgICAgICAoMSA8PCAzKQotCi0jZGVmaW5lIE1DUERNX1VQX0lSUSAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQotI2RlZmluZSBNQ1BETV9VUF9JUlFfRU1QVFkgICAgICAgICAgICAgKDEgPDwgOSkKLSNkZWZpbmUgTUNQRE1fVVBfSVJRX0FMTVNUX0ZVTEwgICAgICAgICAgICAgICAgKDEgPDwgMTApCi0jZGVmaW5lIE1DUERNX1VQX0lSUV9GVUxMICAgICAgICAgICAgICAoMSA8PCAxMSkKLQotI2RlZmluZSBNQ1BETV9ET1dOTElOS19JUlFfTUFTSyAgICAgICAgICAgICAgICAweDAwRgotI2RlZmluZSBNQ1BETV9VUExJTktfSVJRX01BU0sgICAgICAgICAgMHhGMDAKLQotLyoKLSAqIE1DUERNX0RNQUVOQUJMRSBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBETUFfRE5fRU5BQkxFICAgICAgICAgIDB4MQotI2RlZmluZSBETUFfVVBfRU5BQkxFICAgICAgICAgIDB4MgotCi0vKgotICogTUNQRE1fQ1RSTCBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBQRE1fVVAxX0VOICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBQRE1fVVAyX0VOICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBQRE1fVVAzX0VOICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBQRE1fRE4xX0VOICAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBQRE1fRE4yX0VOICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBQRE1fRE4zX0VOICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBQRE1fRE40X0VOICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBQRE1fRE41X0VOICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBQRE1PVVRGT1JNQVQgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBDTURfSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFNUQVRVU19JTlQgICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFNXX1VQX1JTVCAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIFNXX0ROX1JTVCAgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBETV9VUF9NQVNLICAgICAgICAgICAgMHgwMDcKLSNkZWZpbmUgUERNX0ROX01BU0sgICAgICAgICAgICAweDBGOAotI2RlZmluZSBQRE1fQ01EX01BU0sgICAgICAgICAgIDB4MjAwCi0jZGVmaW5lIFBETV9TVEFUVVNfTUFTSyAgICAgICAgICAgICAgICAweDQwMAotCi0KLSNkZWZpbmUgUERNT1VURk9STUFUX0xKVVNUICAgICAoMCA8PCA4KQotI2RlZmluZSBQRE1PVVRGT1JNQVRfUkpVU1QgICAgICgxIDw8IDgpCi0KLS8qCi0gKiBNQ1BETV9GSUZPX0NUUkwgYml0IGZpZWxkcwotICovCi0KLSNkZWZpbmUgVVBfVEhSRVNfTUFYICAgICAgICAgICAweEYKLSNkZWZpbmUgRE5fVEhSRVNfTUFYICAgICAgICAgICAweEYKLQotLyoKLSAqIE1DUERNX0ROX09GRlNFVCBiaXQgZmllbGRzCi0gKi8KLQotI2RlZmluZSBETl9PRlNUX1JYMV9FTiAgICAgICAgIDB4MDAwMQotI2RlZmluZSBETl9PRlNUX1JYMl9FTiAgICAgICAgIDB4MDEwMAotCi0jZGVmaW5lIEROX09GU1RfUlgxICAgICAgICAgICAgMQotI2RlZmluZSBETl9PRlNUX1JYMiAgICAgICAgICAgIDkKLSNkZWZpbmUgRE5fT0ZTVF9NQVggICAgICAgICAgICAweDFGCi0KLSNkZWZpbmUgTUNQRE1fVVBMSU5LICAgICAgICAgICAxCi0jZGVmaW5lIE1DUERNX0RPV05MSU5LICAgICAgICAgMgotCi1zdHJ1Y3Qgb21hcF9tY3BkbV9saW5rIHsKLSAgICAgICBpbnQgaXJxX21hc2s7Ci0gICAgICAgaW50IHRocmVzaG9sZDsKLSAgICAgICBpbnQgZm9ybWF0OwotICAgICAgIGludCBjaGFubmVsczsKLX07Ci0KLXN0cnVjdCBvbWFwX21jcGRtX3BsYXRmb3JtX2RhdGEgewotICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOwotICAgICAgIHUxNiBpcnE7Ci19OwotCi1zdHJ1Y3Qgb21hcF9tY3BkbSB7Ci0gICAgICAgc3RydWN0IGRldmljZSAqZGV2OwotICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOwotICAgICAgIHZvaWQgX19pb21lbSAqaW9fYmFzZTsKLSAgICAgICB1OCBmcmVlOwotICAgICAgIGludCBpcnE7Ci0KLSAgICAgICBzcGlubG9ja190IGxvY2s7Ci0gICAgICAgc3RydWN0IG9tYXBfbWNwZG1fcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0gICAgICAgc3RydWN0IGNsayAqY2xrOwotICAgICAgIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKmRvd25saW5rOwotICAgICAgIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKnVwbGluazsKLSAgICAgICBzdHJ1Y3QgY29tcGxldGlvbiBpcnFfY29tcGxldGlvbjsKLQotICAgICAgIGludCBkbl9jaGFubmVsczsKLSAgICAgICBpbnQgdXBfY2hhbm5lbHM7Ci19OwotCi1leHRlcm4gdm9pZCBvbWFwX21jcGRtX3N0YXJ0KGludCBzdHJlYW0pOwotZXh0ZXJuIHZvaWQgb21hcF9tY3BkbV9zdG9wKGludCBzdHJlYW0pOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICp1cGxpbmspOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX3BsYXliYWNrX29wZW4oc3RydWN0IG9tYXBfbWNwZG1fbGluayAqZG93bmxpbmspOwotZXh0ZXJuIGludCBvbWFwX21jcGRtX2NhcHR1cmVfY2xvc2Uoc3RydWN0IG9tYXBfbWNwZG1fbGluayAqdXBsaW5rKTsKLWV4dGVybiBpbnQgb21hcF9tY3BkbV9wbGF5YmFja19jbG9zZShzdHJ1Y3Qgb21hcF9tY3BkbV9saW5rICpkb3dubGluayk7Ci1leHRlcm4gaW50IG9tYXBfbWNwZG1fcmVxdWVzdCh2b2lkKTsKLWV4dGVybiB2b2lkIG9tYXBfbWNwZG1fZnJlZSh2b2lkKTsKLWV4dGVybiBpbnQgb21hcF9tY3BkbV9zZXRfb2Zmc2V0KGludCBvZmZzZXQxLCBpbnQgb2Zmc2V0Mik7Ci1pbnQgX19kZXZpbml0IG9tYXBfbWNwZG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci1pbnQgb21hcF9tY3BkbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9uODEwLmMgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKaW5kZXggNjJlMjkyZi4uZmM2MjA5YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvbjgxMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL244MTAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAKICNpbmNsdWRlICJvbWFwLW1jYnNwLmgiCkBAIC0xMTUsMjUgKzExNiw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCWludCBlcnI7CiAKLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQkJIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJCSBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJCSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICAgICAgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICAgICAgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgICAgICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KIAkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KIAllcnIgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMTIwMDAwMDAsCiAJCQkJCSAgICBTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTI3NCw3ICsyNTgsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBlcnI7CiAKIAkvKiBOb3QgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OT19MT1VUIik7CkBAIC0yODYsMjEgKzI2OSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJMIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJSIik7CiAKLQkvKiBBZGQgTjgxMCBzcGVjaWZpYyBjb250cm9scyAqLwotCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhaWMzM19uODEwX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUoYWljMzNfbjgxMF9jb250cm9scykpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQWRkIE44MTAgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWljMzNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShhaWMzM19kYXBtX3dpZGdldHMpKTsKLQotCS8qIFNldCB1cCBOODEwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzEyLDYgKzI4MCw4IEBACiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzN4LWNvZGVjLjItMDAxOCIsCiAJLmNvZGVjX2RhaV9uYW1lID0gInRsdjMyMGFpYzN4LWhpZmkiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5pbml0ID0gbjgxMF9haWMzM19pbml0LAogCS5vcHMgPSAmbjgxMF9vcHMsCiB9OwpAQCAtMzIxLDYgKzI5MSwxMyBAQAogCS5uYW1lID0gIk44MTAiLAogCS5kYWlfbGluayA9ICZuODEwX2RhaSwKIAkubnVtX2xpbmtzID0gMSwKKworCS5jb250cm9scyA9IGFpYzMzX244MTBfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWljMzNfbjgxMF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IGFpYzMzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljMzNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuODEwX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMKaW5kZXggNDc4ZDYwNy4uNDMxNDY0NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuYwpAQCAtMzE3LDYgKzMxNywxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlyZWdzLT5yY3IyCSY9IH4oUlBIQVNFIHwgUkZSTEVOMigweDdmKSB8IFJXRExFTjIoNykpOworCXJlZ3MtPnhjcjIJJj0gfihSUEhBU0UgfCBYRlJMRU4yKDB4N2YpIHwgWFdETEVOMig3KSk7CisJcmVncy0+cmNyMQkmPSB+KFJGUkxFTjEoMHg3ZikgfCBSV0RMRU4xKDcpKTsKKwlyZWdzLT54Y3IxCSY9IH4oWEZSTEVOMSgweDdmKSB8IFhXRExFTjEoNykpOwogCWZvcm1hdCA9IG1jYnNwX2RhdGEtPmZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLOwogCXdwZiA9IGNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CiAJaWYgKGNoYW5uZWxzID09IDIgJiYgKGZvcm1hdCA9PSBTTkRfU09DX0RBSUZNVF9JMlMgfHwKQEAgLTM2OSw2ICszNzMsOCBAQAogCQlmcmFtZXNpemUgPSB3bGVuICogY2hhbm5lbHM7CiAKIAkvKiBTZXQgRlMgcGVyaW9kIGFuZCBsZW5ndGggaW4gdGVybXMgb2YgYml0IGNsb2NrIHBlcmlvZHMgKi8KKwlyZWdzLT5zcmdyMgkmPSB+RlBFUigweGZmZik7CisJcmVncy0+c3JncjEJJj0gfkZXSUQoMHhmZik7CiAJc3dpdGNoIChmb3JtYXQpIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKIAljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKQEAgLTM5OCw3ICs0MDQsNyBAQAogewogCXN0cnVjdCBvbWFwX21jYnNwX2RhdGEgKm1jYnNwX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKIAlzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnICpyZWdzID0gJm1jYnNwX2RhdGEtPnJlZ3M7Ci0JdW5zaWduZWQgaW50IHRlbXBfZm10ID0gZm10OworCWJvb2wgaW52X2ZzID0gZmFsc2U7CiAKIAlpZiAobWNic3BfZGF0YS0+Y29uZmlndXJlZCkKIAkJcmV0dXJuIDA7CkBAIC00MzAsMjEgKzQzNiwyMSBAQAogCQlyZWdzLT54Y3IyCXw9IFhEQVRETFkoMCk7CiAJCXJlZ3MtPnNwY3IxCXw9IFJKVVNUKDIpOwogCQkvKiBJbnZlcnQgRlMgcG9sYXJpdHkgY29uZmlndXJhdGlvbiAqLwotCQl0ZW1wX2ZtdCBePSBTTkRfU09DX0RBSUZNVF9OQl9JRjsKKwkJaW52X2ZzID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKIAkJLyogMS1iaXQgZGF0YSBkZWxheSAqLwogCQlyZWdzLT5yY3IyICAgICAgfD0gUkRBVERMWSgxKTsKIAkJcmVncy0+eGNyMiAgICAgIHw9IFhEQVRETFkoMSk7CiAJCS8qIEludmVydCBGUyBwb2xhcml0eSBjb25maWd1cmF0aW9uICovCi0JCXRlbXBfZm10IF49IFNORF9TT0NfREFJRk1UX05CX0lGOworCQlpbnZfZnMgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgogCQkvKiAwLWJpdCBkYXRhIGRlbGF5ICovCiAJCXJlZ3MtPnJjcjIgICAgICB8PSBSREFURExZKDApOwogCQlyZWdzLT54Y3IyICAgICAgfD0gWERBVERMWSgwKTsKIAkJLyogSW52ZXJ0IEZTIHBvbGFyaXR5IGNvbmZpZ3VyYXRpb24gKi8KLQkJdGVtcF9mbXQgXj0gU05EX1NPQ19EQUlGTVRfTkJfSUY7CisJCWludl9mcyA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFVuc3VwcG9ydGVkIGRhdGEgZm9ybWF0ICovCkBAIC00NjgsNyArNDc0LDcgQEAKIAl9CiAKIAkvKiBTZXQgYml0IGNsb2NrIChDTEtYL0NMS1IpIGFuZCBGUyBwb2xhcml0aWVzICovCi0Jc3dpdGNoICh0ZW1wX2ZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgewogCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CiAJCS8qCiAJCSAqIE5vcm1hbCBCQ0xLICsgRlMuCkBAIC00ODksNiArNDk1LDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGludl9mcyA9PSB0cnVlKQorCQlyZWdzLT5wY3IwIF49IEZTWFAgfCBGU1JQOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDMsNiArNTExLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltY2JzcF9kYXRhLT5jbGtfZGl2ID0gZGl2OworCXJlZ3MtPnNyZ3IxCSY9IH5DTEtHRFYoMHhmZik7CiAJcmVncy0+c3JncjEJfD0gQ0xLR0RWKGRpdiAtIDEpOwogCiAJcmV0dXJuIDA7CkBAIC01MTYsMTEgKzUyNSwxMiBAQAogCXN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgKnJlZ3MgPSAmbWNic3BfZGF0YS0+cmVnczsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChtY2JzcF9kYXRhLT5hY3RpdmUpCisJaWYgKG1jYnNwX2RhdGEtPmFjdGl2ZSkgewogCQlpZiAoZnJlcSA9PSBtY2JzcF9kYXRhLT5pbl9mcmVxKQogCQkJcmV0dXJuIDA7CiAJCWVsc2UKIAkJCXJldHVybiAtRUJVU1k7CisJfQogCiAJLyogVGhlIE1jQlNQIHNpZ25hbCBtdXhpbmcgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBNY0JTUDEgKi8KIAlpZiAoY2xrX2lkID09IE9NQVBfTUNCU1BfQ0xLUl9TUkNfQ0xLUiB8fApAQCAtNTMxLDYgKzU0MSw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1jYnNwX2RhdGEtPmluX2ZyZXEgPSBmcmVxOworCXJlZ3MtPnNyZ3IyCSY9IH5DTEtTTTsKKwlyZWdzLT5wY3IwCSY9IH5TQ0xLTUU7CiAKIAlzd2l0Y2ggKGNsa19pZCkgewogCWNhc2UgT01BUF9NQ0JTUF9TWVNDTEtfQ0xLOgpAQCAtNjA1LDggKzYxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNic3BfZGFpID0KLXsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNic3BfZGFpID0gewogCS5wcm9iZSA9IG1jYnNwX2RhaV9wcm9iZSwKIAkucGxheWJhY2sgPSB7CiAJCS5jaGFubmVsc19taW4gPSAxLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jIGIvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jCmluZGV4IGJlZDA5YzIuLjQxZDE3MDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNwZG0uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmMKQEAgLTEsMTEgKzEsMTIgQEAKIC8qCiAgKiBvbWFwLW1jcGRtLmMgIC0tICBPTUFQIEFMU0EgU29DIERBSSBkcml2ZXIgdXNpbmcgTWNQRE0gcG9ydAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cworICogQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMSBUZXhhcyBJbnN0cnVtZW50cwogICoKLSAqIEF1dGhvcjogTWlzYWVsIExvcGV6IENydXogPHgwMDUyNzI5QHRpLmNvbT4KKyAqIEF1dGhvcjogTWlzYWVsIExvcGV6IENydXogPG1pc2FlbC5sb3BlekB0aS5jb20+CiAgKiBDb250YWN0OiBKb3JnZSBFZHVhcmRvIENhbmRlbGFyaWEgPHgwMTA3MjA5QHRpLmNvbT4KICAqICAgICAgICAgIE1hcmdhcml0YSBPbGF5YSA8bWFnaS5vbGF5YUB0aS5jb20+CisgKiAgICAgICAgICBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNSw0MSArMjYsNDIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0jaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgotI2luY2x1ZGUgIm1jcGRtLmgiCisjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CisjaW5jbHVkZSAib21hcC1tY3BkbS5oIgogI2luY2x1ZGUgIm9tYXAtcGNtLmgiCiAKLXN0cnVjdCBvbWFwX21jcGRtX2RhdGEgewotCXN0cnVjdCBvbWFwX21jcGRtX2xpbmsgKmxpbmtzOwotCWludCBhY3RpdmU7Ci19Oworc3RydWN0IG9tYXBfbWNwZG0geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7CisJaW50IGlycTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX21jcGRtX2xpbmsgb21hcF9tY3BkbV9saW5rc1tdID0gewotCS8qIGRvd25saW5rICovCi0JewotCQkuaXJxX21hc2sgPSBNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCwKLQkJLnRocmVzaG9sZCA9IDEsCi0JCS5mb3JtYXQgPSBQRE1PVVRGT1JNQVRfTEpVU1QsCi0JfSwKLQkvKiB1cGxpbmsgKi8KLQl7Ci0JCS5pcnFfbWFzayA9IE1DUERNX1VQX0lSUV9FTVBUWSB8IE1DUERNX1VQX0lSUV9GVUxMLAotCQkudGhyZXNob2xkID0gMSwKLQkJLmZvcm1hdCA9IFBETU9VVEZPUk1BVF9MSlVTVCwKLQl9LAotfTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tY3BkbV9kYXRhIG1jcGRtX2RhdGEgPSB7Ci0JLmxpbmtzID0gb21hcF9tY3BkbV9saW5rcywKLQkuYWN0aXZlID0gMCwKKwkvKiBjaGFubmVsIGRhdGEgKi8KKwl1MzIgZG5fY2hhbm5lbHM7CisJdTMyIHVwX2NoYW5uZWxzOworCisJLyogTWNQRE0gRklGTyB0aHJlc2hvbGRzICovCisJdTMyIGRuX3RocmVzaG9sZDsKKwl1MzIgdXBfdGhyZXNob2xkOworCisJLyogTWNQRE0gZG4gb2Zmc2V0cyBmb3IgcngxLCBhbmQgMiBjaGFubmVscyAqLworCXUzMiBkbl9yeF9vZmZzZXQ7CiB9OwogCiAvKgpAQCAtNzEsODggKzczLDI1OSBAQAogCQkuZG1hX3JlcSA9IE9NQVA0NFhYX0RNQV9NQ1BETV9ETCwKIAkJLmRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCiAJCS5zeW5jX21vZGUgPSBPTUFQX0RNQV9TWU5DX1BBQ0tFVCwKLQkJLnBhY2tldF9zaXplID0gMTYsCi0JCS5wb3J0X2FkZHIgPSBPTUFQNDRYWF9NQ1BETV9MM19CQVNFICsgTUNQRE1fRE5fREFUQSwKKwkJLnBvcnRfYWRkciA9IE9NQVA0NFhYX01DUERNX0wzX0JBU0UgKyBNQ1BETV9SRUdfRE5fREFUQSwKIAl9LAogCXsKIAkJLm5hbWUgPSAiQXVkaW8gY2FwdHVyZSIsCiAJCS5kbWFfcmVxID0gT01BUDQ0WFhfRE1BX01DUERNX1VQLAogCQkuZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKIAkJLnN5bmNfbW9kZSA9IE9NQVBfRE1BX1NZTkNfUEFDS0VULAotCQkucGFja2V0X3NpemUgPSAxNiwKLQkJLnBvcnRfYWRkciA9IE9NQVA0NFhYX01DUERNX0wzX0JBU0UgKyBNQ1BETV9VUF9EQVRBLAorCQkucG9ydF9hZGRyID0gT01BUDQ0WFhfTUNQRE1fTDNfQkFTRSArIE1DUERNX1JFR19VUF9EQVRBLAogCX0sCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9tY3BkbV93cml0ZShzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0sIHUxNiByZWcsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgbWNwZG0tPmlvX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwX21jcGRtX3JlYWQoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtLCB1MTYgcmVnKQoreworCXJldHVybiBfX3Jhd19yZWFkbChtY3BkbS0+aW9fYmFzZSArIHJlZyk7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgb21hcF9tY3BkbV9yZWdfZHVtcChzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVNUQVRVU19SQVc6ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19JUlFTVEFUVVNfUkFXKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiSVJRU1RBVFVTOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfSVJRU1RBVFVTKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiSVJRRU5BQkxFX1NFVDogIDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQpKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJJUlFFTkFCTEVfQ0xSOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfSVJRRU5BQkxFX0NMUikpOworCWRldl9kYmcobWNwZG0tPmRldiwgIklSUVdBS0VfRU46IDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUVdBS0VfRU4pKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFFTkFCTEVfU0VUOiAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETUFFTkFCTEVfU0VUKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRE1BRU5BQkxFX0NMUjogIDB4JTA0eFxuIiwKKwkJCW9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIpKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJETUFXQUtFRU46ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETUFXQUtFRU4pKTsKKwlkZXZfZGJnKG1jcGRtLT5kZXYsICJDVFJMOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCkpOworCWRldl9kYmcobWNwZG0tPmRldiwgIkROX0RBVEE6ICAweCUwNHhcbiIsCisJCQlvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19ETl9EQVRBKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiVVBfREFUQTogMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfVVBfREFUQSkpOworCWRldl9kYmcobWNwZG0tPmRldiwgIkZJRk9fQ1RSTF9ETjogMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX0ROKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiRklGT19DVFJMX1VQOiAgMHglMDR4XG4iLAorCQkJb21hcF9tY3BkbV9yZWFkKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX1VQKSk7CisJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIG9tYXBfbWNwZG1fcmVnX2R1bXAoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtKSB7fQorI2VuZGlmCisKKy8qCisgKiBFbmFibGVzIHRoZSB0cmFuc2ZlciB0aHJvdWdoIHRoZSBQRE0gaW50ZXJmYWNlIHRvL2Zyb20gdGhlIFBob2VuaXgKKyAqIGNvZGVjIGJ5IGVuYWJsaW5nIHRoZSBjb3JyZXNwb25kaW5nIFVQIG9yIEROIGNoYW5uZWxzLgorICovCitzdGF0aWMgdm9pZCBvbWFwX21jcGRtX3N0YXJ0KHN0cnVjdCBvbWFwX21jcGRtICptY3BkbSkKK3sKKwl1MzIgY3RybCA9IG9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0NUUkwpOworCisJY3RybCB8PSAoTUNQRE1fU1dfRE5fUlNUIHwgTUNQRE1fU1dfVVBfUlNUKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7CisKKwljdHJsIHw9IG1jcGRtLT5kbl9jaGFubmVscyB8IG1jcGRtLT51cF9jaGFubmVsczsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7CisKKwljdHJsICY9IH4oTUNQRE1fU1dfRE5fUlNUIHwgTUNQRE1fU1dfVVBfUlNUKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfQ1RSTCwgY3RybCk7Cit9CisKKy8qCisgKiBEaXNhYmxlcyB0aGUgdHJhbnNmZXIgdGhyb3VnaCB0aGUgUERNIGludGVyZmFjZSB0by9mcm9tIHRoZSBQaG9lbml4CisgKiBjb2RlYyBieSBkaXNhYmxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVVAgb3IgRE4gY2hhbm5lbHMuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBfbWNwZG1fc3RvcChzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJdTMyIGN0cmwgPSBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKTsKKworCWN0cmwgfD0gKE1DUERNX1NXX0ROX1JTVCB8IE1DUERNX1NXX1VQX1JTVCk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCisJY3RybCAmPSB+KG1jcGRtLT5kbl9jaGFubmVscyB8IG1jcGRtLT51cF9jaGFubmVscyk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCisJY3RybCAmPSB+KE1DUERNX1NXX0ROX1JTVCB8IE1DUERNX1NXX1VQX1JTVCk7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIGN0cmwpOworCit9CisKKy8qCisgKiBJcyB0aGUgcGh5c2ljYWwgTWNQRE0gaW50ZXJmYWNlIGFjdGl2ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb21hcF9tY3BkbV9hY3RpdmUoc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtKQoreworCXJldHVybiBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKSAmCisJCQkJCShNQ1BETV9QRE1fRE5fTUFTSyB8IE1DUERNX1BETV9VUF9NQVNLKTsKK30KKworLyoKKyAqIENvbmZpZ3VyZXMgTWNQRE0gdXBsaW5rLCBhbmQgZG93bmxpbmsgZm9yIGF1ZGlvLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBvbWFwX21jcGRtX3N0YXJ0LgorICovCitzdGF0aWMgdm9pZCBvbWFwX21jcGRtX29wZW5fc3RyZWFtcyhzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0pCit7CisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQsCisJCQlNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCB8CisJCQlNQ1BETV9VUF9JUlFfRU1QVFkgfCBNQ1BETV9VUF9JUlFfRlVMTCk7CisKKwkvKiBFbmFibGUgRE4gUlgxLzIgb2Zmc2V0IGNhbmNlbGxhdGlvbiBmZWF0dXJlLCBpZiBjb25maWd1cmVkICovCisJaWYgKG1jcGRtLT5kbl9yeF9vZmZzZXQpIHsKKwkJdTMyIGRuX29mZnNldCA9IG1jcGRtLT5kbl9yeF9vZmZzZXQ7CisKKwkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0ROX09GRlNFVCwgZG5fb2Zmc2V0KTsKKwkJZG5fb2Zmc2V0IHw9IChNQ1BETV9ETl9PRlNUX1JYMV9FTiB8IE1DUERNX0ROX09GU1RfUlgyX0VOKTsKKwkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0ROX09GRlNFVCwgZG5fb2Zmc2V0KTsKKwl9CisKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX0ROLCBtY3BkbS0+ZG5fdGhyZXNob2xkKTsKKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfRklGT19DVFJMX1VQLCBtY3BkbS0+dXBfdGhyZXNob2xkKTsKKworCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19ETUFFTkFCTEVfU0VULAorCQkJTUNQRE1fRE1BX0ROX0VOQUJMRSB8IE1DUERNX0RNQV9VUF9FTkFCTEUpOworfQorCisvKgorICogQ2xlYW5zIE1jUERNIHVwbGluaywgYW5kIGRvd25saW5rIGNvbmZpZ3VyYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9tY3BkbV9jbG9zZV9zdHJlYW1zKHN0cnVjdCBvbWFwX21jcGRtICptY3BkbSkKK3sKKwkvKiBEaXNhYmxlIGlycSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIGRvd25saW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0lSUUVOQUJMRV9DTFIsCisJCQlNQ1BETV9ETl9JUlFfRU1QVFkgfCBNQ1BETV9ETl9JUlFfRlVMTCk7CisKKwkvKiBEaXNhYmxlIERNQSByZXF1ZXN0IGdlbmVyYXRpb24gZm9yIGRvd25saW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIsIE1DUERNX0RNQV9ETl9FTkFCTEUpOworCisJLyogRGlzYWJsZSBpcnEgcmVxdWVzdCBnZW5lcmF0aW9uIGZvciB1cGxpbmsgKi8KKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfSVJRRU5BQkxFX0NMUiwKKwkJCU1DUERNX1VQX0lSUV9FTVBUWSB8IE1DUERNX1VQX0lSUV9GVUxMKTsKKworCS8qIERpc2FibGUgRE1BIHJlcXVlc3QgZ2VuZXJhdGlvbiBmb3IgdXBsaW5rICovCisJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIsIE1DUERNX0RNQV9VUF9FTkFCTEUpOworCisJLyogRGlzYWJsZSBSWDEvMiBvZmZzZXQgY2FuY2VsbGF0aW9uICovCisJaWYgKG1jcGRtLT5kbl9yeF9vZmZzZXQpCisJCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19ETl9PRkZTRVQsIDApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tY3BkbV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gZGV2X2lkOworCWludCBpcnFfc3RhdHVzOworCisJaXJxX3N0YXR1cyA9IG9tYXBfbWNwZG1fcmVhZChtY3BkbSwgTUNQRE1fUkVHX0lSUVNUQVRVUyk7CisKKwkvKiBBY2tub3dsZWRnZSBpcnEgZXZlbnQgKi8KKwlvbWFwX21jcGRtX3dyaXRlKG1jcGRtLCBNQ1BETV9SRUdfSVJRU1RBVFVTLCBpcnFfc3RhdHVzKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fRE5fSVJRX0ZVTEwpCisJCWRldl9kYmcobWNwZG0tPmRldiwgIkROIChwbGF5YmFjaykgRklGTyBGdWxsXG4iKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fRE5fSVJRX0VNUFRZKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJETiAocGxheWJhY2spIEZJRk8gRW1wdHlcbiIpOworCisJaWYgKGlycV9zdGF0dXMgJiBNQ1BETV9ETl9JUlEpCisJCWRldl9kYmcobWNwZG0tPmRldiwgIkROIChwbGF5YmFjaykgd3JpdGUgcmVxdWVzdFxuIik7CisKKwlpZiAoaXJxX3N0YXR1cyAmIE1DUERNX1VQX0lSUV9GVUxMKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJVUCAoY2FwdHVyZSkgRklGTyBGdWxsXG4iKTsKKworCWlmIChpcnFfc3RhdHVzICYgTUNQRE1fVVBfSVJRX0VNUFRZKQorCQlkZXZfZGJnKG1jcGRtLT5kZXYsICJVUCAoY2FwdHVyZSkgRklGTyBFbXB0eVxuIik7CisKKwlpZiAoaXJxX3N0YXR1cyAmIE1DUERNX1VQX0lSUSkKKwkJZGV2X2RiZyhtY3BkbS0+ZGV2LCAiVVAgKGNhcHR1cmUpIHdyaXRlIHJlcXVlc3RcbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JaWYgKCFkYWktPmFjdGl2ZSkKLQkJZXJyID0gb21hcF9tY3BkbV9yZXF1ZXN0KCk7CisJbXV0ZXhfbG9jaygmbWNwZG0tPm11dGV4KTsKIAotCXJldHVybiBlcnI7CisJaWYgKCFkYWktPmFjdGl2ZSkgeworCQlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOworCisJCS8qIEVuYWJsZSB3YXRjaCBkb2cgZm9yIEVTIGFib3ZlIEVTIDEuMCB0byBhdm9pZCBzYXR1cmF0aW9uICovCisJCWlmIChvbWFwX3JldigpICE9IE9NQVA0NDMwX1JFVl9FUzFfMCkgeworCQkJdTMyIGN0cmwgPSBvbWFwX21jcGRtX3JlYWQobWNwZG0sIE1DUERNX1JFR19DVFJMKTsKKworCQkJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsCisJCQkJCSBjdHJsIHwgTUNQRE1fV0RfRU4pOworCQl9CisJCW9tYXBfbWNwZG1fb3Blbl9zdHJlYW1zKG1jcGRtKTsKKwl9CisKKwltdXRleF91bmxvY2soJm1jcGRtLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9tY3BkbV9kYWlfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWlmICghZGFpLT5hY3RpdmUpCi0JCW9tYXBfbWNwZG1fZnJlZSgpOwotfQotCi1zdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQsCiAJCQkJICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzdHJ1Y3Qgb21hcF9tY3BkbV9kYXRhICptY3BkbV9wcml2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0JaW50IGVyciA9IDA7CisJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCWlmICghbWNwZG1fcHJpdi0+YWN0aXZlKyspCi0JCQlvbWFwX21jcGRtX3N0YXJ0KHN0cmVhbSk7Ci0JCWJyZWFrOworCW11dGV4X2xvY2soJm1jcGRtLT5tdXRleCk7CiAKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJaWYgKCEtLW1jcGRtX3ByaXYtPmFjdGl2ZSkKLQkJCW9tYXBfbWNwZG1fc3RvcChzdHJlYW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSAtRUlOVkFMOworCWlmICghZGFpLT5hY3RpdmUpIHsKKwkJaWYgKG9tYXBfbWNwZG1fYWN0aXZlKG1jcGRtKSkgeworCQkJb21hcF9tY3BkbV9zdG9wKG1jcGRtKTsKKwkJCW9tYXBfbWNwZG1fY2xvc2Vfc3RyZWFtcyhtY3BkbSk7CisJCX0KKworCQlpZiAoIW9tYXBfbWNwZG1fYWN0aXZlKG1jcGRtKSkKKwkJCXBtX3J1bnRpbWVfcHV0X3N5bmMobWNwZG0tPmRldik7CiAJfQogCi0JcmV0dXJuIGVycjsKKwltdXRleF91bmxvY2soJm1jcGRtLT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9tY3BkbV9kYWlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fZGF0YSAqbWNwZG1fcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fbGluayAqbWNwZG1fbGlua3MgPSBtY3BkbV9wcml2LT5saW5rczsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCWludCBzdHJlYW0gPSBzdWJzdHJlYW0tPnN0cmVhbTsKLQlpbnQgY2hhbm5lbHMsIGVyciwgbGlua19tYXNrID0gMDsKLQotCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwKLQkJCQkgJm9tYXBfbWNwZG1fZGFpX2RtYV9wYXJhbXNbc3RyZWFtXSk7CisJc3RydWN0IG9tYXBfcGNtX2RtYV9kYXRhICpkbWFfZGF0YTsKKwlpbnQgY2hhbm5lbHM7CisJaW50IGxpbmtfbWFzayA9IDA7CiAKIAljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwogCXN3aXRjaCAoY2hhbm5lbHMpIHsKKwljYXNlIDU6CisJCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQkJLyogdXAgdG8gMyBjaGFubmVscyBmb3IgY2FwdHVyZSAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxpbmtfbWFzayB8PSAxIDw8IDQ7CiAJY2FzZSA0OgogCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJCS8qIHVwIHRvIDIgY2hhbm5lbHMgZm9yIGNhcHR1cmUgKi8KKwkJCS8qIHVwIHRvIDMgY2hhbm5lbHMgZm9yIGNhcHR1cmUgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCQlsaW5rX21hc2sgfD0gMSA8PCAzOwogCWNhc2UgMzoKLQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCQkvKiB1cCB0byAyIGNoYW5uZWxzIGZvciBjYXB0dXJlICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJbGlua19tYXNrIHw9IDEgPDwgMjsKIAljYXNlIDI6CiAJCWxpbmtfbWFzayB8PSAxIDw8IDE7CkBAIC0xNjQsOTUgKzMzNywxODcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZG1hX2RhdGEgPSAmb21hcF9tY3BkbV9kYWlfZG1hX3BhcmFtc1tzdHJlYW1dOworCisJLyogQ29uZmlndXJlIE1jUERNIGNoYW5uZWxzLCBhbmQgRE1BIHBhY2tldCBzaXplICovCiAJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCW1jcGRtX2xpbmtzW3N0cmVhbV0uY2hhbm5lbHMgPSBsaW5rX21hc2sgPDwgMzsKLQkJZXJyID0gb21hcF9tY3BkbV9wbGF5YmFja19vcGVuKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKKwkJbWNwZG0tPmRuX2NoYW5uZWxzID0gbGlua19tYXNrIDw8IDM7CisJCWRtYV9kYXRhLT5wYWNrZXRfc2l6ZSA9CisJCQkoTUNQRE1fRE5fVEhSRVNfTUFYIC0gbWNwZG0tPmRuX3RocmVzaG9sZCkgKiBjaGFubmVsczsKIAl9IGVsc2UgewotCQltY3BkbV9saW5rc1tzdHJlYW1dLmNoYW5uZWxzID0gbGlua19tYXNrIDw8IDA7Ci0JCWVyciA9IG9tYXBfbWNwZG1fY2FwdHVyZV9vcGVuKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKKwkJbWNwZG0tPnVwX2NoYW5uZWxzID0gbGlua19tYXNrIDw8IDA7CisJCWRtYV9kYXRhLT5wYWNrZXRfc2l6ZSA9IG1jcGRtLT51cF90aHJlc2hvbGQgKiBjaGFubmVsczsKIAl9CiAKLQlyZXR1cm4gZXJyOworCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwgZG1hX2RhdGEpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9tY3BkbV9kYWlfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKK3N0YXRpYyBpbnQgb21hcF9tY3BkbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fZGF0YSAqbWNwZG1fcHJpdiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0Jc3RydWN0IG9tYXBfbWNwZG1fbGluayAqbWNwZG1fbGlua3MgPSBtY3BkbV9wcml2LT5saW5rczsKLQlpbnQgc3RyZWFtID0gc3Vic3RyZWFtLT5zdHJlYW07Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09ICBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQllcnIgPSBvbWFwX21jcGRtX3BsYXliYWNrX2Nsb3NlKCZtY3BkbV9saW5rc1tzdHJlYW1dKTsKLQllbHNlCi0JCWVyciA9IG9tYXBfbWNwZG1fY2FwdHVyZV9jbG9zZSgmbWNwZG1fbGlua3Nbc3RyZWFtXSk7CisJaWYgKCFvbWFwX21jcGRtX2FjdGl2ZShtY3BkbSkpIHsKKwkJb21hcF9tY3BkbV9zdGFydChtY3BkbSk7CisJCW9tYXBfbWNwZG1fcmVnX2R1bXAobWNwZG0pOworCX0KIAotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG9tYXBfbWNwZG1fZGFpX29wcyA9IHsKIAkuc3RhcnR1cAk9IG9tYXBfbWNwZG1fZGFpX3N0YXJ0dXAsCiAJLnNodXRkb3duCT0gb21hcF9tY3BkbV9kYWlfc2h1dGRvd24sCi0JLnRyaWdnZXIJPSBvbWFwX21jcGRtX2RhaV90cmlnZ2VyLAogCS5od19wYXJhbXMJPSBvbWFwX21jcGRtX2RhaV9od19wYXJhbXMsCi0JLmh3X2ZyZWUJPSBvbWFwX21jcGRtX2RhaV9od19mcmVlLAorCS5wcmVwYXJlCT0gb21hcF9tY3BkbV9wcmVwYXJlLAogfTsKIAotI2RlZmluZSBPTUFQX01DUERNX1JBVEVTCShTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwKQotI2RlZmluZSBPTUFQX01DUERNX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQotCi1zdGF0aWMgaW50IG9tYXBfbWNwZG1fZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQorc3RhdGljIGludCBvbWFwX21jcGRtX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewotCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgJm1jcGRtX2RhdGEpOworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKG1jcGRtLT5kZXYpOworCisJLyogRGlzYWJsZSBsaW5lcyB3aGlsZSByZXF1ZXN0IGlzIG9uZ29pbmcgKi8KKwlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOworCW9tYXBfbWNwZG1fd3JpdGUobWNwZG0sIE1DUERNX1JFR19DVFJMLCAweDAwKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKG1jcGRtLT5pcnEsIG9tYXBfbWNwZG1faXJxX2hhbmRsZXIsCisJCQkJMCwgIk1jUERNIiwgKHZvaWQgKiltY3BkbSk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKG1jcGRtLT5kZXYpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1jcGRtLT5kZXYsICJSZXF1ZXN0IGZvciBJUlEgZmFpbGVkXG4iKTsKKwkJcG1fcnVudGltZV9kaXNhYmxlKG1jcGRtLT5kZXYpOworCX0KKworCS8qIENvbmZpZ3VyZSBNY1BETSB0aHJlc2hvbGQgdmFsdWVzICovCisJbWNwZG0tPmRuX3RocmVzaG9sZCA9IDI7CisJbWNwZG0tPnVwX3RocmVzaG9sZCA9IE1DUERNX1VQX1RIUkVTX01BWCAtIDM7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvbWFwX21jcGRtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCisJZnJlZV9pcnEobWNwZG0tPmlycSwgKHZvaWQgKiltY3BkbSk7CisJcG1fcnVudGltZV9kaXNhYmxlKG1jcGRtLT5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgT01BUF9NQ1BETV9SQVRFUwkoU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKyNkZWZpbmUgT01BUF9NQ1BETV9GT1JNQVRTCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFCisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG9tYXBfbWNwZG1fZGFpID0gewotCS5wcm9iZSA9IG9tYXBfbWNwZG1fZGFpX3Byb2JlLAorCS5wcm9iZSA9IG9tYXBfbWNwZG1fcHJvYmUsCisJLnJlbW92ZSA9IG9tYXBfbWNwZG1fcmVtb3ZlLAorCS5wcm9iZV9vcmRlciA9IFNORF9TT0NfQ09NUF9PUkRFUl9MQVRFLAorCS5yZW1vdmVfb3JkZXIgPSBTTkRfU09DX0NPTVBfT1JERVJfRUFSTFksCiAJLnBsYXliYWNrID0gewogCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDQsCisJCS5jaGFubmVsc19tYXggPSA1LAogCQkucmF0ZXMgPSBPTUFQX01DUERNX1JBVEVTLAogCQkuZm9ybWF0cyA9IE9NQVBfTUNQRE1fRk9STUFUUywKIAl9LAogCS5jYXB0dXJlID0gewogCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5jaGFubmVsc19tYXggPSAzLAogCQkucmF0ZXMgPSBPTUFQX01DUERNX1JBVEVTLAogCQkuZm9ybWF0cyA9IE9NQVBfTUNQRE1fRk9STUFUUywKIAl9LAogCS5vcHMgPSAmb21hcF9tY3BkbV9kYWlfb3BzLAogfTsKIAordm9pZCBvbWFwX21jcGRtX2NvbmZpZ3VyZV9kbl9vZmZzZXRzKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJICAgIHU4IHJ4MSwgdTggcngyKQoreworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKHJ0ZC0+Y3B1X2RhaSk7CisKKwltY3BkbS0+ZG5fcnhfb2Zmc2V0ID0gTUNQRE1fRE5PRlNUX1JYMShyeDEpIHwgTUNQRE1fRE5PRlNUX1JYMihyeDIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob21hcF9tY3BkbV9jb25maWd1cmVfZG5fb2Zmc2V0cyk7CisKIHN0YXRpYyBfX2RldmluaXQgaW50IGFzb2NfbWNwZG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBvbWFwX21jcGRtICptY3BkbTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gMDsKIAotCXJldCA9IG9tYXBfbWNwZG1fcHJvYmUocGRldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJbWNwZG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9tY3BkbSksIEdGUF9LRVJORUwpOworCWlmICghbWNwZG0pCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWNwZG0pOworCisJbXV0ZXhfaW5pdCgmbWNwZG0tPm11dGV4KTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlc291cmNlXG4iKTsKKwkJZ290byBlcnJfcmVzOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgIk1jUERNIikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZXM7CisJfQorCisJbWNwZG0tPmlvX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFtY3BkbS0+aW9fYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb21hcDsKKwl9CisKKwltY3BkbS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAobWNwZG0tPmlycSA8IDApIHsKKwkJcmV0ID0gbWNwZG0tPmlycTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCW1jcGRtLT5kZXYgPSAmcGRldi0+ZGV2OworCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgJm9tYXBfbWNwZG1fZGFpKTsKLQlpZiAocmV0IDwgMCkKLQkJb21hcF9tY3BkbV9yZW1vdmUocGRldik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCitlcnJfaXJxOgorCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOworZXJyX2lvbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZXJyX3JlczoKKwlrZnJlZShtY3BkbSk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgYXNvY19tY3BkbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwogCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7Ci0Jb21hcF9tY3BkbV9yZW1vdmUocGRldik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlvdW5tYXAobWNwZG0tPmlvX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJa2ZyZWUobWNwZG0pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc29jX21jcGRtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkJLm5hbWUgPSAib21hcC1tY3BkbS1kYWkiLAotCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gIm9tYXAtbWNwZG0iLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCi0JLnByb2JlID0gYXNvY19tY3BkbV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYXNvY19tY3BkbV9yZW1vdmUpLAorCS5wcm9iZQk9IGFzb2NfbWNwZG1fcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGFzb2NfbWNwZG1fcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNuZF9vbWFwX21jcGRtX2luaXQodm9pZCkKQEAgLTI2Nyw2ICs1MzIsNiBAQAogfQogbW9kdWxlX2V4aXQoc25kX29tYXBfbWNwZG1fZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIk1pc2FlbCBMb3BleiBDcnV6IDx4MDA1MjcyOUB0aS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJNaXNhZWwgTG9wZXogQ3J1eiA8bWlzYWVsLmxvcGV6QHRpLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT01BUCBQRE0gU29DIEludGVyZmFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5oIGIvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGNmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBvbWFwLW1jcGRtLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDExIFRleGFzIEluc3RydW1lbnRzCisgKgorICogQ29udGFjdDogTWlzYWVsIExvcGV6IENydXogPG1pc2FlbC5sb3BlekB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fT01BUF9NQ1BETV9IX18KKyNkZWZpbmUgX19PTUFQX01DUERNX0hfXworCisjZGVmaW5lIE1DUERNX1JFR19SRVZJU0lPTgkJMHgwMAorI2RlZmluZSBNQ1BETV9SRUdfU1lTQ09ORklHCQkweDEwCisjZGVmaW5lIE1DUERNX1JFR19JUlFTVEFUVVNfUkFXCQkweDI0CisjZGVmaW5lIE1DUERNX1JFR19JUlFTVEFUVVMJCTB4MjgKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUUVOQUJMRV9TRVQJCTB4MkMKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUUVOQUJMRV9DTFIJCTB4MzAKKyNkZWZpbmUgTUNQRE1fUkVHX0lSUVdBS0VfRU4JCTB4MzQKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQUVOQUJMRV9TRVQJCTB4MzgKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQUVOQUJMRV9DTFIJCTB4M0MKKyNkZWZpbmUgTUNQRE1fUkVHX0RNQVdBS0VFTgkJMHg0MAorI2RlZmluZSBNQ1BETV9SRUdfQ1RSTAkJCTB4NDQKKyNkZWZpbmUgTUNQRE1fUkVHX0ROX0RBVEEJCTB4NDgKKyNkZWZpbmUgTUNQRE1fUkVHX1VQX0RBVEEJCTB4NEMKKyNkZWZpbmUgTUNQRE1fUkVHX0ZJRk9fQ1RSTF9ETgkJMHg1MAorI2RlZmluZSBNQ1BETV9SRUdfRklGT19DVFJMX1VQCQkweDU0CisjZGVmaW5lIE1DUERNX1JFR19ETl9PRkZTRVQJCTB4NTgKKworLyoKKyAqIE1DUERNX0lSUSBiaXQgZmllbGRzCisgKiBJUlFTVEFUVVNfUkFXLCBJUlFTVEFUVVMsIElSUUVOQUJMRV9TRVQsIElSUUVOQUJMRV9DTFIKKyAqLworCisjZGVmaW5lIE1DUERNX0ROX0lSUQkJCSgxIDw8IDApCisjZGVmaW5lIE1DUERNX0ROX0lSUV9FTVBUWQkJKDEgPDwgMSkKKyNkZWZpbmUgTUNQRE1fRE5fSVJRX0FMTVNUX0VNUFRZCSgxIDw8IDIpCisjZGVmaW5lIE1DUERNX0ROX0lSUV9GVUxMCQkoMSA8PCAzKQorCisjZGVmaW5lIE1DUERNX1VQX0lSUQkJCSgxIDw8IDgpCisjZGVmaW5lIE1DUERNX1VQX0lSUV9FTVBUWQkJKDEgPDwgOSkKKyNkZWZpbmUgTUNQRE1fVVBfSVJRX0FMTVNUX0ZVTEwJCSgxIDw8IDEwKQorI2RlZmluZSBNQ1BETV9VUF9JUlFfRlVMTAkJKDEgPDwgMTEpCisKKyNkZWZpbmUgTUNQRE1fRE9XTkxJTktfSVJRX01BU0sJCTB4MDBGCisjZGVmaW5lIE1DUERNX1VQTElOS19JUlFfTUFTSwkJMHhGMDAKKworLyoKKyAqIE1DUERNX0RNQUVOQUJMRSBiaXQgZmllbGRzCisgKi8KKworI2RlZmluZSBNQ1BETV9ETUFfRE5fRU5BQkxFCQkoMSA8PCAwKQorI2RlZmluZSBNQ1BETV9ETUFfVVBfRU5BQkxFCQkoMSA8PCAxKQorCisvKgorICogTUNQRE1fQ1RSTCBiaXQgZmllbGRzCisgKi8KKworI2RlZmluZSBNQ1BETV9QRE1fVVBMSU5LX0VOKHgpCQkoMSA8PCAoeCAtIDEpKSAvKiBjaDEgaXMgYXQgYml0IDAgKi8KKyNkZWZpbmUgTUNQRE1fUERNX0RPV05MSU5LX0VOKHgpCSgxIDw8ICh4ICsgMikpIC8qIGNoMSBpcyBhdCBiaXQgMyAqLworI2RlZmluZSBNQ1BETV9QRE1PVVRGT1JNQVQJCSgxIDw8IDgpCisjZGVmaW5lIE1DUERNX0NNRF9JTlQJCQkoMSA8PCA5KQorI2RlZmluZSBNQ1BETV9TVEFUVVNfSU5UCQkoMSA8PCAxMCkKKyNkZWZpbmUgTUNQRE1fU1dfVVBfUlNUCQkJKDEgPDwgMTEpCisjZGVmaW5lIE1DUERNX1NXX0ROX1JTVAkJCSgxIDw8IDEyKQorI2RlZmluZSBNQ1BETV9XRF9FTgkJCSgxIDw8IDE0KQorI2RlZmluZSBNQ1BETV9QRE1fVVBfTUFTSwkJMHg3CisjZGVmaW5lIE1DUERNX1BETV9ETl9NQVNLCQkoMHgxZiA8PCAzKQorCisKKyNkZWZpbmUgTUNQRE1fUERNT1VURk9STUFUX0xKVVNUCSgwIDw8IDgpCisjZGVmaW5lIE1DUERNX1BETU9VVEZPUk1BVF9SSlVTVAkoMSA8PCA4KQorCisvKgorICogTUNQRE1fRklGT19DVFJMIGJpdCBmaWVsZHMKKyAqLworCisjZGVmaW5lIE1DUERNX1VQX1RIUkVTX01BWAkJMHhGCisjZGVmaW5lIE1DUERNX0ROX1RIUkVTX01BWAkJMHhGCisKKy8qCisgKiBNQ1BETV9ETl9PRkZTRVQgYml0IGZpZWxkcworICovCisKKyNkZWZpbmUgTUNQRE1fRE5fT0ZTVF9SWDFfRU4JCSgxIDw8IDApCisjZGVmaW5lIE1DUERNX0ROT0ZTVF9SWDEoeCkJCSgoeCAmIDB4MWYpIDw8IDEpCisjZGVmaW5lIE1DUERNX0ROX09GU1RfUlgyX0VOCQkoMSA8PCA4KQorI2RlZmluZSBNQ1BETV9ETk9GU1RfUlgyKHgpCQkoKHggJiAweDFmKSA8PCA5KQorCit2b2lkIG9tYXBfbWNwZG1fY29uZmlndXJlX2RuX29mZnNldHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkgICAgdTggcngxLCB1OCByeDIpOworCisjZW5kaWYJLyogRW5kIG9mIF9fT01BUF9NQ1BETV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCmluZGV4IDliNWM4OGEuLjZlZGU3ZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTE5OCw2ICsxOTksMTQgQEAKIAkJCSAgICAgIE9NQVBfRE1BX0xBU1RfSVJRIHwgT01BUF9ETUFfQkxPQ0tfSVJRKTsKIAllbHNlIGlmICghc3Vic3RyZWFtLT5ydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwKQogCQlvbWFwX2VuYWJsZV9kbWFfaXJxKHBydGQtPmRtYV9jaCwgT01BUF9ETUFfRlJBTUVfSVJRKTsKKwllbHNlIHsKKwkJLyoKKwkJICogTm8gcGVyaW9kIHdha2V1cDoKKwkJICogd2UgbmVlZCB0byBkaXNhYmxlIEJMT0NLX0lSUSwgd2hpY2ggaXMgZW5hYmxlZCBieSB0aGUgb21hcAorCQkgKiBkbWEgY29yZSBhdCByZXF1ZXN0IGRtYSB0aW1lLgorCQkgKi8KKwkJb21hcF9kaXNhYmxlX2RtYV9pcnEocHJ0ZC0+ZG1hX2NoLCBPTUFQX0RNQV9CTE9DS19JUlEpOworCX0KIAogCWlmICghKGNwdV9jbGFzc19pc19vbWFwMSgpKSkgewogCQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUocHJ0ZC0+ZG1hX2NoLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNiZWFnbGUuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzYmVhZ2xlLmMKaW5kZXggNDBkYjgxMy4uMzM1N2RjYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcDNiZWFnbGUuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM2JlYWdsZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jIGIvc291bmQvc29jL29tYXAvb21hcDNldm0uYwppbmRleCAwZGFhMDQ0Li42ODU3ODk1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzZXZtLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTM2LDI5ICszNyw4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCWludCByZXQ7CiAKLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCAyNjAwMDAwMCwKIAkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwpAQCAtODIsNiArNjIsOCBAQAogCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCS5wbGF0Zm9ybV9uYW1lID0gIm9tYXAtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJ0d2w0MDMwLWNvZGVjIiwKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkub3BzIAkJPSAmb21hcDNldm1fb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNwYW5kb3JhLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwppbmRleCA4MDQ3YzUyMWUuLjc2MDVjMzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC00OCwyNCArNDksOCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlM7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBmbXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycihQUkVGSVggImNhbid0IHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogU2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgZm10KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoUFJFRklYICJjYW4ndCBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMjYwMDAwMDAsCiAJCQkJCSAgICBTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTE4OSwxMCArMTc0LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG9tYXAzcGFuZG9yYV9vdXRfbWFwLAorCXJldHVybiBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfb3V0X21hcCwKIAkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfb3V0X21hcCkpOwotCi0JcmV0dXJuIHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IG9tYXAzcGFuZG9yYV9pbl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCkBAIC0yMTIsMTAgKzE5NSw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfaW5fbWFwLAorCXJldHVybiBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBvbWFwM3BhbmRvcmFfaW5fbWFwLAogCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9pbl9tYXApKTsKLQotCXJldHVybiBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBvbWFwM3BhbmRvcmFfb3BzID0gewpAQCAtMjMxLDYgKzIxMiw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJCS5vcHMgPSAmb21hcDNwYW5kb3JhX29wcywKIAkJLmluaXQgPSBvbWFwM3BhbmRvcmFfb3V0X2luaXQsCiAJfSwgewpAQCAtMjQwLDYgKzIyMyw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJCS5vcHMgPSAmb21hcDNwYW5kb3JhX29wcywKIAkJLmluaXQgPSBvbWFwM3BhbmRvcmFfaW5faW5pdCwKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwNC1oZG1pLWNhcmQuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCmluZGV4IDlmMzI2MTUuLjg2NzEyNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXA0LWhkbWktY2FyZC5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb3NrNTkxMi5jIGIvc291bmQvc29jL29tYXAvb3NrNTkxMi5jCmluZGV4IDdlNzVlNzcuLjM1MWVjOWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29zazU5MTIuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vc2s1OTEyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8cGxhdC9tY2JzcC5oPgogCiAjaW5jbHVkZSAib21hcC1tY2JzcC5oIgpAQCAtNTUsMjkgKzU2LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IGVycjsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCWVyciA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfRFNQX0IgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCWVyciA9CiAJICAgIHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCBDT0RFQ19DTE9DSywgU05EX1NPQ19DTE9DS19JTik7CkBAIC0xMTIsMjcgKzkyLDYgQEAKIAl7Ik1JQ0lOIiwgTlVMTCwgIk1pYyBKYWNrIn0sCiB9OwogCi1zdGF0aWMgaW50IG9za190bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQkvKiBBZGQgb3NrNTkxMiBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogU2V0IHVwIG9zazU5MTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogRGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgb3NrX2RhaSA9IHsKIAkubmFtZSA9ICJUTFYzMjBBSUMyMyIsCkBAIC0xNDEsNyArMTAwLDggQEAKIAkuY29kZWNfZGFpX25hbWUgPSAidGx2MzIwYWljMjMtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInRsdjMyMGFpYzIzLWNvZGVjIiwKLQkuaW5pdCA9IG9za190bHYzMjBhaWMyM19pbml0LAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLm9wcyA9ICZvc2tfb3BzLAogfTsKIApAQCAtMTUwLDYgKzExMCwxMSBAQAogCS5uYW1lID0gIk9TSzU5MTIiLAogCS5kYWlfbGluayA9ICZvc2tfZGFpLAogCS5udW1fbGlua3MgPSAxLAorCisJLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvc2tfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL292ZXJvLmMgYi9zb3VuZC9zb2Mvb21hcC9vdmVyby5jCmluZGV4IGJiY2YzODAuLmMzNTUwYWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL292ZXJvLmMKKysrIGIvc291bmQvc29jL29tYXAvb3Zlcm8uYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzgsMjkgKzM5LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC04NCw2ICs2NCw4IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCS5vcHMgPSAmb3Zlcm9fb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvcng1MS5jIGIvc291bmQvc29jL29tYXAvcng1MS5jCmluZGV4IDg5MzMwMGEuLjRjYWJiNzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpAQCAtMTE1LDI0ICsxMTYsNiBAQAogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgZXJyOwotCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JZXJyID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQllcnIgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJICBTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCXJldHVybiBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMTkyMDAwMDAsCkBAIC0zMzUsOCArMzE4LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJLyogQVYgamFjayBkZXRlY3Rpb24gKi8KIAllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiQVYgSmFjayIsCiAJCQkgICAgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX1ZJREVPT1VULApAQCAtMzc3LDYgKzM1OCw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0bHYzMjBhaWMzeC1oaWZpIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAib21hcC1wY20tYXVkaW8iLAogCQkuY29kZWNfbmFtZSA9ICJ0bHYzMjBhaWMzeC1jb2RlYy4yLTAwMTgiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9BIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLmluaXQgPSByeDUxX2FpYzM0X2luaXQsCiAJCS5vcHMgPSAmcng1MV9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL3NkcDM0MzAuYyBiL3NvdW5kL3NvYy9vbWFwL3NkcDM0MzAuYwppbmRleCA5ZjZhNzU4Li5lOGZiZjhlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9zZHAzNDMwLmMKKysrIGIvc291bmQvc29jL29tYXAvc2RwMzQzMC5jCkBAIC0zNyw2ICszNyw3IEBACiAKIC8qIFJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBmb3IgdHdsNDAzMCBjb2RlYyBwYXJ0ICovCiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDQwMzAtYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIm9tYXAtbWNic3AuaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgpAQCAtNTMsMjkgKzU0LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQkgICAgU05EX1NPQ19DTE9DS19JTik7CkBAIC05MSw0OSArNzEsNiBAQAogCS5od19wYXJhbXMgPSBzZHAzNDMwX2h3X3BhcmFtcywKIH07CiAKLXN0YXRpYyBpbnQgc2RwMzQzMF9od192b2ljZV9wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCWludCByZXQ7Ci0KLQkvKiBTZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwKLQkJCQlTTkRfU09DX0RBSUZNVF9EU1BfQSB8Ci0JCQkJU05EX1NPQ19EQUlGTVRfSUJfTkYgfAotCQkJCVNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksCi0JCQkJU05EX1NPQ19EQUlGTVRfRFNQX0EgfAotCQkJCVNORF9TT0NfREFJRk1UX0lCX05GIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHNldCBjcHUgREFJIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCAyNjAwMDAwMCwKLQkJCQkJICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIHN5c3RlbSBjbG9ja1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc2RwMzQzMF92b2ljZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IHNkcDM0MzBfaHdfdm9pY2VfcGFyYW1zLAotfTsKLQogLyogSGVhZHNldCBqYWNrICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBoc19qYWNrOwogCkBAIC0xOTMsMTUgKzEzMCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQkvKiBBZGQgU0RQMzQzMCBzcGVjaWZpYyB3aWRnZXRzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUoc2RwMzQzMF90d2w0MDMwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgU0RQMzQzMCBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCS8qIFNEUDM0MzAgY29ubmVjdGVkIHBpbnMgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CkBAIC0yMjMsMTAgKzE1MSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUTCIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVFIiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCiAJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsCiAJCQkJU05EX0pBQ0tfSEVBRFNFVCwgJmhzX2phY2spOwpAQCAtMjY3LDYgKzE5MSw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5pbml0ID0gc2RwMzQzMF90d2w0MDMwX2luaXQsCiAJCS5vcHMgPSAmc2RwMzQzMF9vcHMsCiAJfSwKQEAgLTI3Nyw4ICsyMDMsMTAgQEAKIAkJLmNvZGVjX2RhaV9uYW1lID0gInR3bDQwMzAtdm9pY2UiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9BIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYgfAorCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSwKIAkJLmluaXQgPSBzZHAzNDMwX3R3bDQwMzBfdm9pY2VfaW5pdCwKLQkJLm9wcyA9ICZzZHAzNDMwX3ZvaWNlX29wcywKKwkJLm9wcyA9ICZzZHAzNDMwX29wcywKIAl9LAogfTsKIApAQCAtMjg3LDYgKzIxNSwxMSBAQAogCS5uYW1lID0gIlNEUDM0MzAiLAogCS5kYWlfbGluayA9IHNkcDM0MzBfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNkcDM0MzBfZGFpKSwKKworCS5kYXBtX3dpZGdldHMgPSBzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZHAzNDMwX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMgYi9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMKaW5kZXggYjgwZWZiMC4uMDNkOWZhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvc2RwNDQzMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL3NkcDQ0MzAuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90d2w2MDQwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0zMiw3ICszMyw3IEBACiAjaW5jbHVkZSA8cGxhdC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHBsYXQvbXV4Lmg+CiAKLSNpbmNsdWRlICJtY3BkbS5oIgorI2luY2x1ZGUgIm9tYXAtbWNwZG0uaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgogI2luY2x1ZGUgIi4uL2NvZGVjcy90d2w2MDQwLmgiCiAKQEAgLTg4LDcgKzg5LDcgQEAKIAlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9IUCgiSGVhZHNldCBTdGVyZW9waG9uZSIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9TUEsoIkVhcnBob25lIFNwayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQXV4L0ZNIFN0ZXJlbyBJbiIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRk0gU3RlcmVvIEluIiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKQEAgLTExMywzNiArMTE0LDIyIEBACiAJeyJFYXJwaG9uZSBTcGsiLCBOVUxMLCAiRVAifSwKIAogCS8qIEF1eC9GTSBTdGVyZW8gSW46IEFGTUwsIEFGTVIgKi8KLQl7IkFGTUwiLCBOVUxMLCAiQXV4L0ZNIFN0ZXJlbyBJbiJ9LAotCXsiQUZNUiIsIE5VTEwsICJBdXgvRk0gU3RlcmVvIEluIn0sCisJeyJBRk1MIiwgTlVMTCwgIkZNIFN0ZXJlbyBJbiJ9LAorCXsiQUZNUiIsIE5VTEwsICJGTSBTdGVyZW8gSW4ifSwKIH07CiAKIHN0YXRpYyBpbnQgc2RwNDQzMF90d2w2MDQwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQlpbnQgcmV0OworCWludCByZXQsIGhzX3RyaW07CiAKLQkvKiBBZGQgU0RQNDQzMCBzcGVjaWZpYyB3aWRnZXRzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBzZHA0NDMwX3R3bDYwNDBfZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUoc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgU0RQNDQzMCBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCS8qIFNEUDQ0MzAgY29ubmVjdGVkIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFGTUwiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQUZNUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCS8qCisJICogQ29uZmlndXJlIE1jUERNIG9mZnNldCBjYW5jZWxsYXRpb24gYmFzZWQgb24gdGhlIEhTT1RSSU0gdmFsdWUgZnJvbQorCSAqIHR3bDYwNDAuCisJICovCisJaHNfdHJpbSA9IHR3bDYwNDBfZ2V0X3RyaW1fdmFsdWUoY29kZWMsIFRXTDYwNDBfVFJJTV9IU09UUklNKTsKKwlvbWFwX21jcGRtX2NvbmZpZ3VyZV9kbl9vZmZzZXRzKHJ0ZCwgVFdMNjA0MF9IU0ZfVFJJTV9MRUZUKGhzX3RyaW0pLAorCQkJCQlUV0w2MDQwX0hTRl9UUklNX1JJR0hUKGhzX3RyaW0pKTsKIAogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwKQEAgLTE2NSw4ICsxNTIsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNkcDQ0MzBfZGFpID0gewogCS5uYW1lID0gIlRXTDYwNDAiLAogCS5zdHJlYW1fbmFtZSA9ICJUV0w2MDQwIiwKLQkuY3B1X2RhaV9uYW1lID0ib21hcC1tY3BkbS1kYWkiLAotCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w2MDQwLWhpZmkiLAorCS5jcHVfZGFpX25hbWUgPSAib21hcC1tY3BkbSIsCisJLmNvZGVjX2RhaV9uYW1lID0gInR3bDYwNDAtbGVnYWN5IiwKIAkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJLmNvZGVjX25hbWUgPSAidHdsNjA0MC1jb2RlYyIsCiAJLmluaXQgPSBzZHA0NDMwX3R3bDYwNDBfaW5pdCwKQEAgLTE3OCw2ICsxNjUsMTEgQEAKIAkubmFtZSA9ICJTRFA0NDMwIiwKIAkuZGFpX2xpbmsgPSAmc2RwNDQzMF9kYWksCiAJLm51bV9saW5rcyA9IDEsCisKKwkuZGFwbV93aWRnZXRzID0gc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2RwNDQzMF9zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvem9vbTIuYyBiL3NvdW5kL3NvYy9vbWFwL3pvb20yLmMKaW5kZXggOWEyNjY2Zi4uNzY0MWE3ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvem9vbTIuYworKysgYi9zb3VuZC9zb2Mvb21hcC96b29tMi5jCkBAIC0zMyw2ICszMyw3IEBACiAKIC8qIFJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBmb3IgdHdsNDAzMCBjb2RlYyBwYXJ0ICovCiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDQwMzAtYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIm9tYXAtbWNic3AuaCIKICNpbmNsdWRlICJvbWFwLXBjbS5oIgpAQCAtNDQsMjkgKzQ1LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJaW50IHJldDsKIAotCS8qIFNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvblxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogU2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgZm9yIERBQyBhbmQgQURDICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDI2MDAwMDAwLAogCQkJCQlTTkRfU09DX0NMT0NLX0lOKTsKQEAgLTgyLDQ5ICs2Miw2IEBACiAJLmh3X3BhcmFtcyA9IHpvb20yX2h3X3BhcmFtcywKIH07CiAKLXN0YXRpYyBpbnQgem9vbTJfaHdfdm9pY2VfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0OwotCi0JLyogU2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksCi0JCQkJU05EX1NPQ19EQUlGTVRfRFNQX0EgfAotCQkJCVNORF9TT0NfREFJRk1UX0lCX05GIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLAotCQkJCVNORF9TT0NfREFJRk1UX0RTUF9BIHwKLQkJCQlTTkRfU09DX0RBSUZNVF9JQl9ORiB8Ci0JCQkJU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBzZXQgY3B1IERBSSBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBTZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayBmb3IgREFDIGFuZCBBREMgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgMjYwMDAwMDAsCi0JCQkJCVNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3Qgc2V0IGNvZGVjIHN5c3RlbSBjbG9ja1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgem9vbTJfdm9pY2Vfb3BzID0gewotCS5od19wYXJhbXMgPSB6b29tMl9od192b2ljZV9wYXJhbXMsCi19OwotCiAvKiBab29tMiBtYWNoaW5lIERBUE0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9NSUMoIkV4dCBNaWMiLCBOVUxMKSwKQEAgLTE2MiwyMyArOTksNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCByZXQ7Ci0KLQkvKiBBZGQgWm9vbTIgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgem9vbTJfdHdsNDAzMF9kYXBtX3dpZGdldHMsCi0JCQkJQVJSQVlfU0laRSh6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBTZXQgdXAgWm9vbTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0KLQkvKiBab29tMiBjb25uZWN0ZWQgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdXggSW4iKTsKIAogCS8qIFRXTDQwMzAgbm90IGNvbm5lY3RlZCBwaW5zICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUTUlDIik7CkBAIC0xOTAsOSArMTEwLDcgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJDQVJLSVRMIik7CiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUUiIpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHpvb20yX3R3bDQwMzBfdm9pY2VfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQpAQCAtMjE3LDYgKzEzNSw4IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ0d2w0MDMwLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJvbWFwLXBjbS1hdWRpbyIsCiAJCS5jb2RlY19uYW1lID0gInR3bDQwMzAtY29kZWMiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5pbml0ID0gem9vbTJfdHdsNDAzMF9pbml0LAogCQkub3BzID0gJnpvb20yX29wcywKIAl9LApAQCAtMjI3LDggKzE0NywxMCBAQAogCQkuY29kZWNfZGFpX25hbWUgPSAidHdsNDAzMC12b2ljZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gIm9tYXAtcGNtLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAidHdsNDAzMC1jb2RlYyIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0EgfCBTTkRfU09DX0RBSUZNVF9JQl9ORiB8CisJCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAogCQkuaW5pdCA9IHpvb20yX3R3bDQwMzBfdm9pY2VfaW5pdCwKLQkJLm9wcyA9ICZ6b29tMl92b2ljZV9vcHMsCisJCS5vcHMgPSAmem9vbTJfb3BzLAogCX0sCiB9OwogCkBAIC0yMzcsNiArMTU5LDExIEBACiAJLm5hbWUgPSAiWm9vbTIiLAogCS5kYWlfbGluayA9IHpvb20yX2RhaSwKIAkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh6b29tMl9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHpvb20yX3R3bDQwMzBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqem9vbTJfc25kX2RldmljZTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZyBiL3NvdW5kL3NvYy9weGEvS2NvbmZpZwppbmRleCAzM2ViYzQ2Li5mZmQyMjQyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL0tjb25maWcKKysrIGIvc291bmQvc29jL3B4YS9LY29uZmlnCkBAIC0xMjEsNiArMTIxLDcgQEAKIGNvbmZpZyBTTkRfU09DX1NBQVJCCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBNYXJ2ZWxsIFNhYXJiIgogCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgTUFDSF9TQUFSQgorCXNlbGVjdCBNRkRfODhQTTg2MFgKIAlzZWxlY3QgU05EX1BYQV9TT0NfU1NQCiAJc2VsZWN0IFNORF9TT0NfODhQTTg2MFgKIAloZWxwCkBAIC0xMzAsNiArMTMxLDcgQEAKIGNvbmZpZyBTTkRfU09DX1RBVk9SRVZCMwogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgTWFydmVsbCBUYXZvciBFVkIzIgogCWRlcGVuZHMgb24gU05EX1BYQTJYWF9TT0MgJiYgTUFDSF9UQVZPUkVWQjMKKwlzZWxlY3QgTUZEXzg4UE04NjBYCiAJc2VsZWN0IFNORF9QWEFfU09DX1NTUAogCXNlbGVjdCBTTkRfU09DXzg4UE04NjBYCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9jb3JnaS5jIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCmluZGV4IDI4NzU3ZmIuLmIwZTJmYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvY29yZ2kuYworKysgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKQEAgLTI5OSw3ICsyOTksNiBAQAogCS8qIFNldCB1cCBjb3JnaSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKaW5kZXggZGM2NTY1MC4uMzVlZDdlYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwpAQCAtMTA4LDggKzEwOCw2IEBACiAKIAlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKaW5kZXggNTE4OTdmYy4uY2U1ZjA1NjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKQEAgLTkwLDggKzkwLDYgQEAKIAogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYyBiL3NvdW5kL3NvYy9weGEvZTgwMF93bTk3MTIuYwppbmRleCAwNTNlZDIwLi42YThmMzhiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKKysrIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCkBAIC04MCw3ICs4MCw2IEBACiAJCQkJCUFSUkFZX1NJWkUoZTgwMF9kYXBtX3dpZGdldHMpKTsKIAogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCmluZGV4IDY3ZGNjMzYuLmU3OWY1MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYworKysgYi9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKQEAgLTkyLDExICs5MiwxMCBAQAogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQl1bnNpZ25lZCBpbnQgYWNwcywgYWNkcywgd2lkdGgsIHJhdGU7CisJdW5zaWduZWQgaW50IGFjcHMsIGFjZHMsIHdpZHRoOwogCXVuc2lnbmVkIGludCBkaXY0ID0gUFhBX1NTUF9DTEtfU0NEQl80OwogCWludCByZXQgPSAwOwogCi0JcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAJd2lkdGggPSBzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwogCiAJLyoKQEAgLTQyNCw3ICs0MjMsNiBAQAogCS8qIFNldCB1cCBtYWdpY2lhbiBzcGVjaWZpYyBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KIAlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCmluZGV4IDM4Y2E2NzUuLjBiOGQxZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKQEAgLTE1MSw3ICsxNTEsNiBAQAogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJGcm9udCBNaWMiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcGFsbTI3eC5jIGIvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKaW5kZXggNTA0ZTQwMC4uN2VkYzFmYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKKysrIGIvc291bmQvc29jL3B4YS9wYWxtMjd4LmMKQEAgLTEwNywxMCArMTA3LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQSE9ORSIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzIiKTsKIAotCWVyciA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAkvKiBKYWNrIGRldGVjdGlvbiBBUEkgc3R1ZmYgKi8KIAllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLAogCQkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmhzX2phY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9wb29kbGUuYyBiL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKaW5kZXggZGEzYWU0My4uNGMyOWJjMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9wb29kbGUuYworKysgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCkBAIC0yNjUsNyArMjY1LDYgQEAKIAkvKiBTZXQgdXAgcG9vZGxlIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKaW5kZXggYzQzMDYwMC4uNjAwNjc2ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtcGNtLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYyBiL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYwppbmRleCAxYTU5MWYxLi5iODk5YTNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3JhdW1mZWxkLmMKKysrIGIvc291bmQvc29jL3B4YS9yYXVtZmVsZC5jCkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCQkJICAgICAmc25kX3NvY19yYXVtZmVsZF9jb25uZWN0b3IpOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChyYXVtZmVsZF9hdWRpb19kZXZpY2UpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXBsYXRmb3JtX2RldmljZV9wdXQocmF1bWZlbGRfYXVkaW9fZGV2aWNlKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyYXVtZmVsZF9lbmFibGVfYXVkaW8odHJ1ZSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3NhYXJiLmMgYi9zb3VuZC9zb2MvcHhhL3NhYXJiLmMKaW5kZXggOTU5NTE4OS4uZDk0NjdhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9zYWFyYi5jCisrKyBiL3NvdW5kL3NvYy9weGEvc2FhcmIuYwpAQCAtMTQ2LDEwICsxNDYsNiBAQAogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMgMiIpOwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUKIAkJCXwgU05EX0pBQ0tfQlROXzAgfCBTTkRfSkFDS19CVE5fMSB8IFNORF9KQUNLX0JUTl8yLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9zcGl0ei5jIGIvc291bmQvc29jL3B4YS9zcGl0ei5jCmluZGV4IGIyNTNkODYuLmMyZDZmZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvc3BpdHouYworKysgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKQEAgLTMwMSw3ICszMDEsNiBAQAogCS8qIFNldCB1cCBzcGl0eiBzcGVjaWZpYyBhdWRpbyBwYXRocyAqLwogCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCXJldHVybiAwOwogfQogCkBAIC0zMTIsNyArMzExLDcgQEAKIAkuY3B1X2RhaV9uYW1lID0gInB4YTJ4eC1pMnMiLAogCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg3NTAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAicHhhLXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUgPSAid204NzUwLWNvZGVjLjAtMDAxYiIsCisJLmNvZGVjX25hbWUgPSAid204NzUwLjAtMDAxYiIsCiAJLmluaXQgPSBzcGl0el93bTg3NTBfaW5pdCwKIAkub3BzID0gJnNwaXR6X29wcywKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3Rhdm9yZXZiMy5jIGIvc291bmQvc29jL3B4YS90YXZvcmV2YjMuYwppbmRleCBmODgxZjY1Li5lZWVjODkyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Rhdm9yZXZiMy5jCisrKyBiL3NvdW5kL3NvYy9weGEvdGF2b3JldmIzLmMKQEAgLTE0NiwxMCArMTQ2LDYgQEAKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIDIiKTsKIAlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgU3RlcmVvcGhvbmUiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FCiAJCQl8IFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19CVE5fMiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvdG9zYS5jIGIvc291bmQvc29jL3B4YS90b3NhLmMKaW5kZXggOWEyMzUxMy4uNjIwZmM2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS90b3NhLmMKKysrIGIvc291bmQvc29jL3B4YS90b3NhLmMKQEAgLTIxMSw3ICsyMTEsNiBAQAogCS8qIHNldCB1cCB0b3NhIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvejIuYyBiL3NvdW5kL3NvYy9weGEvejIuYwppbmRleCBkNjlkOWZjLi5iMzExZmZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3oyLmMKKysrIGIvc291bmQvc29jL3B4YS96Mi5jCkBAIC0xNjEsMTAgKzE2MSw2IEBACiAJLyogU2V0IHVwIHoyIHNwZWNpZmljIGF1ZGlvIHBhdGhzICovCiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KIAkvKiBKYWNrIGRldGVjdGlvbiBBUEkgc3R1ZmYgKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwgU05EX0pBQ0tfSEVBRFNFVCwKIAkJCQkmaHNfamFjayk7CkBAIC0xOTgsNyArMTk0LDcgQEAKIAkuY3B1X2RhaV9uYW1lCT0gInB4YTJ4eC1pMnMiLAogCS5jb2RlY19kYWlfbmFtZQk9ICJ3bTg3NTAtaGlmaSIsCiAJLnBsYXRmb3JtX25hbWUgPSAicHhhLXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUJPSAid204NzUwLWNvZGVjLjAtMDAxYiIsCisJLmNvZGVjX25hbWUJPSAid204NzUwLjAtMDAxYiIsCiAJLmluaXQJCT0gejJfd204NzUwX2luaXQsCiAJLm9wcwkJPSAmejJfb3BzLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYyBiL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYwppbmRleCAyYjgzNTBiLi41ODBhYWUzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKKysrIGIvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCkBAIC04Nyw3ICs4Nyw2IEBACiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEVhcnBpZWNlIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCmluZGV4IDgwYzg1ZmQ2Li41NWVmYzJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczYwMDAvczYwMDAtcGNtLmMKKysrIGIvc291bmQvc29jL3M2MDAwL3M2MDAwLXBjbS5jCkBAIC00NDYsNyArNDQ2LDYgQEAKIHN0YXRpYyBpbnQgczYwMDBfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydW50aW1lLT5jYXJkLT5zbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ1bnRpbWUtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ1bnRpbWUtPnBjbTsKIAlzdHJ1Y3QgczYwMDBfcGNtX2RtYV9wYXJhbXMgKnBhcmFtczsKIAlpbnQgcmVzOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKaW5kZXggNjVmOTgwZS4uNTNhYWE2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCkBAIC02Myw3ICs2Myw5IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19XTTg5OTQKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg5OTQgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLVjMxMCB8fCBNQUNIX1NNREtDMjEwKQorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREtWMzEwIHx8IE1BQ0hfU01ES0MyMTAgfHwgTUFDSF9TTURLNDIxMikKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdFTkVSSUNfSEFSRElSUVMKKwlzZWxlY3QgTUZEX1dNODk5NAogCXNlbGVjdCBTTkRfU09DX1dNODk5NAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAloZWxwCkBAIC0xNTAsNyArMTUyLDkgQEAKIGNvbmZpZyBTTkRfU09DX0dPTklfQVFVSUxBX1dNODk5NAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIEFRVUlMQS9HT05JIC0gV004OTk0IgogCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX0dPTkkgfHwgTUFDSF9BUVVJTEEpCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBHRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUworCXNlbGVjdCBNRkRfV004OTk0CiAJc2VsZWN0IFNORF9TT0NfV004OTk0CiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBnb25pIG9yIGFxdWlsYQpAQCAtMTU4LDcgKzE2Miw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19TUERJRgogCXRyaXN0YXRlICJTb0MgUy9QRElGIEF1ZGlvIHN1cHBvcnQgZm9yIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLQzExMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES1YzMTApCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLQzExMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES1YzMTAgfHwgTUFDSF9TTURLNDIxMikKIAlzZWxlY3QgU05EX1NBTVNVTkdfU1BESUYKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIFMvUERJRiBhdWRpbyBvbiB0aGUgU01ESy4KQEAgLTE3Myw3ICsxNzcsOSBAQAogCiBjb25maWcgU05EX1NPQ19TTURLX1dNODk5NF9QQ00KIAl0cmlzdGF0ZSAiU29DIFBDTSBBdWRpbyBzdXBwb3J0IGZvciBXTTg5OTQgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLQzIxMCB8fCBNQUNIX1NNREtWMzEwKQorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREtDMjEwIHx8IE1BQ0hfU01ES1YzMTAgfHwgTUFDSF9TTURLNDIxMikKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdFTkVSSUNfSEFSRElSUVMKKwlzZWxlY3QgTUZEX1dNODk5NAogCXNlbGVjdCBTTkRfU09DX1dNODk5NAogCXNlbGVjdCBTTkRfU0FNU1VOR19QQ00KIAloZWxwCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMKaW5kZXggZjk3MTEwZS4uMTY1MjFlMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCkBAIC0yNzEsNyArMjcyLDEwIEBACiAKIAl3cml0ZWwoYWNfZ2xiY3RybCwgczNjX2FjOTcucmVncyArIFMzQ19BQzk3X0dMQkNUUkwpOwogCi0JczNjMjQxMF9kbWFfY3RybChkbWFfZGF0YS0+Y2hhbm5lbCwgUzNDMjQxMF9ETUFPUF9TVEFSVEVEKTsKKwlpZiAoIWRtYV9kYXRhLT5vcHMpCisJCWRtYV9kYXRhLT5vcHMgPSBzYW1zdW5nX2RtYV9nZXRfb3BzKCk7CisKKwlkbWFfZGF0YS0+b3BzLT5zdGFydGVkKGRtYV9kYXRhLT5jaGFubmVsKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzE3LDcgKzMyMSwxMCBAQAogCiAJd3JpdGVsKGFjX2dsYmN0cmwsIHMzY19hYzk3LnJlZ3MgKyBTM0NfQUM5N19HTEJDVFJMKTsKIAotCXMzYzI0MTBfZG1hX2N0cmwoZG1hX2RhdGEtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfU1RBUlRFRCk7CisJaWYgKCFkbWFfZGF0YS0+b3BzKQorCQlkbWFfZGF0YS0+b3BzID0gc2Ftc3VuZ19kbWFfZ2V0X29wcygpOworCisJZG1hX2RhdGEtPm9wcy0+c3RhcnRlZChkbWFfZGF0YS0+Y2hhbm5lbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0NCw3ICs0NTEsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGlycV9yZXMtPnN0YXJ0LCBzM2NfYWM5N19pcnEsCi0JCQkJCUlSUUZfRElTQUJMRUQsICJBQzk3IiwgTlVMTCk7CisJCQkJCTAsICJBQzk3IiwgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWM5NzogaW50ZXJydXB0IHJlcXVlc3QgZmFpbGVkLlxuIik7CiAJCWdvdG8gZXJyNDsKQEAgLTQ5NSw3ICs1MDIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2NfYWM5N19kcml2ZXIgPSB7CiAJLnByb2JlICA9IHMzY19hYzk3X3Byb2JlLAotCS5yZW1vdmUgPSBzM2NfYWM5N19yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMzY19hYzk3X3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic2Ftc3VuZy1hYzk3IiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCmluZGV4IDk0NjU1ODguLmE2OGIyNjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTU0LDcgKzU1LDYgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IHN0YXRlOwogCXVuc2lnbmVkIGludCBkbWFfbG9hZGVkOwotCXVuc2lnbmVkIGludCBkbWFfbGltaXQ7CiAJdW5zaWduZWQgaW50IGRtYV9wZXJpb2Q7CiAJZG1hX2FkZHJfdCBkbWFfc3RhcnQ7CiAJZG1hX2FkZHJfdCBkbWFfcG9zOwpAQCAtNjIsNzcgKzYyLDc5IEBACiAJc3RydWN0IHMzY19kbWFfcGFyYW1zICpwYXJhbXM7CiB9OwogCitzdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZSh2b2lkICpkYXRhKTsKKwogLyogZG1hX2VucXVldWUKICAqCiAgKiBwbGFjZSBhIGRtYSBidWZmZXIgb250byB0aGUgcXVldWUgZm9yIHRoZSBkbWEgc3lzdGVtCiAgKiB0byBoYW5kbGUuCi0qLworICovCiBzdGF0aWMgdm9pZCBkbWFfZW5xdWV1ZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJZG1hX2FkZHJfdCBwb3MgPSBwcnRkLT5kbWFfcG9zOwogCXVuc2lnbmVkIGludCBsaW1pdDsKLQlpbnQgcmV0OworCXN0cnVjdCBzYW1zdW5nX2RtYV9wcmVwX2luZm8gZG1hX2luZm87CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKHMzY19kbWFfaGFzX2NpcmN1bGFyKCkpCi0JCWxpbWl0ID0gKHBydGQtPmRtYV9lbmQgLSBwcnRkLT5kbWFfc3RhcnQpIC8gcHJ0ZC0+ZG1hX3BlcmlvZDsKLQllbHNlCi0JCWxpbWl0ID0gcHJ0ZC0+ZG1hX2xpbWl0OworCWxpbWl0ID0gKHBydGQtPmRtYV9lbmQgLSBwcnRkLT5kbWFfc3RhcnQpIC8gcHJ0ZC0+ZG1hX3BlcmlvZDsKIAogCXByX2RlYnVnKCIlczogbG9hZGVkICVkLCBsaW1pdCAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcHJ0ZC0+ZG1hX2xvYWRlZCwgbGltaXQpOwogCi0Jd2hpbGUgKHBydGQtPmRtYV9sb2FkZWQgPCBsaW1pdCkgewotCQl1bnNpZ25lZCBsb25nIGxlbiA9IHBydGQtPmRtYV9wZXJpb2Q7CisJZG1hX2luZm8uY2FwID0gKHNhbXN1bmdfZG1hX2hhc19jaXJjdWxhcigpID8gRE1BX0NZQ0xJQyA6IERNQV9TTEFWRSk7CisJZG1hX2luZm8uZGlyZWN0aW9uID0KKwkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sKKwkJPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfaW5mby5mcCA9IGF1ZGlvX2J1ZmZkb25lOworCWRtYV9pbmZvLmZwX3BhcmFtID0gc3Vic3RyZWFtOworCWRtYV9pbmZvLnBlcmlvZCA9IHBydGQtPmRtYV9wZXJpb2Q7CisJZG1hX2luZm8ubGVuID0gcHJ0ZC0+ZG1hX3BlcmlvZCpsaW1pdDsKIAorCXdoaWxlIChwcnRkLT5kbWFfbG9hZGVkIDwgbGltaXQpIHsKIAkJcHJfZGVidWcoImRtYV9sb2FkZWQ6ICVkXG4iLCBwcnRkLT5kbWFfbG9hZGVkKTsKIAotCQlpZiAoKHBvcyArIGxlbikgPiBwcnRkLT5kbWFfZW5kKSB7Ci0JCQlsZW4gID0gcHJ0ZC0+ZG1hX2VuZCAtIHBvczsKLQkJCXByX2RlYnVnKCIlczogY29ycmVjdGVkIGRtYSBsZW4gJWxkXG4iLCBfX2Z1bmNfXywgbGVuKTsKKwkJaWYgKChwb3MgKyBkbWFfaW5mby5wZXJpb2QpID4gcHJ0ZC0+ZG1hX2VuZCkgeworCQkJZG1hX2luZm8ucGVyaW9kICA9IHBydGQtPmRtYV9lbmQgLSBwb3M7CisJCQlwcl9kZWJ1ZygiJXM6IGNvcnJlY3RlZCBkbWEgbGVuICVsZFxuIiwKKwkJCQkJX19mdW5jX18sIGRtYV9pbmZvLnBlcmlvZCk7CiAJCX0KIAotCQlyZXQgPSBzM2MyNDEwX2RtYV9lbnF1ZXVlKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKLQkJCXN1YnN0cmVhbSwgcG9zLCBsZW4pOworCQlkbWFfaW5mby5idWYgPSBwb3M7CisJCXBydGQtPnBhcmFtcy0+b3BzLT5wcmVwYXJlKHBydGQtPnBhcmFtcy0+Y2gsICZkbWFfaW5mbyk7CiAKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwcnRkLT5kbWFfbG9hZGVkKys7Ci0JCQlwb3MgKz0gcHJ0ZC0+ZG1hX3BlcmlvZDsKLQkJCWlmIChwb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKLQkJCQlwb3MgPSBwcnRkLT5kbWFfc3RhcnQ7Ci0JCX0gZWxzZQotCQkJYnJlYWs7CisJCXBydGQtPmRtYV9sb2FkZWQrKzsKKwkJcG9zICs9IHBydGQtPmRtYV9wZXJpb2Q7CisJCWlmIChwb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKKwkJCXBvcyA9IHBydGQtPmRtYV9zdGFydDsKIAl9CiAKIAlwcnRkLT5kbWFfcG9zID0gcG9zOwogfQogCi1zdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZShzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbm5lbCwKLQkJCQl2b2lkICpkZXZfaWQsIGludCBzaXplLAotCQkJCWVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXN1bHQpCitzdGF0aWMgdm9pZCBhdWRpb19idWZmZG9uZSh2b2lkICpkYXRhKQogewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gZGV2X2lkOwotCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkYXRhOworCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAocmVzdWx0ID09IFMzQzI0MTBfUkVTX0FCT1JUIHx8IHJlc3VsdCA9PSBTM0MyNDEwX1JFU19FUlIpCi0JCXJldHVybjsKKwlpZiAocHJ0ZC0+c3RhdGUgJiBTVF9SVU5OSU5HKSB7CisJCXBydGQtPmRtYV9wb3MgKz0gcHJ0ZC0+ZG1hX3BlcmlvZDsKKwkJaWYgKHBydGQtPmRtYV9wb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKKwkJCXBydGQtPmRtYV9wb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CiAKLQlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCWlmIChzdWJzdHJlYW0pCisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAKLQlpZiAoc3Vic3RyZWFtKQotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCWlmIChwcnRkLT5zdGF0ZSAmIFNUX1JVTk5JTkcgJiYgIXMzY19kbWFfaGFzX2NpcmN1bGFyKCkpIHsKLQkJcHJ0ZC0+ZG1hX2xvYWRlZC0tOwotCQlkbWFfZW5xdWV1ZShzdWJzdHJlYW0pOworCQlzcGluX2xvY2soJnBydGQtPmxvY2spOworCQlpZiAoIXNhbXN1bmdfZG1hX2hhc19jaXJjdWxhcigpKSB7CisJCQlwcnRkLT5kbWFfbG9hZGVkLS07CisJCQlkbWFfZW5xdWV1ZShzdWJzdHJlYW0pOworCQl9CisJCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKIAl9Ci0KLQlzcGluX3VubG9jaygmcHJ0ZC0+bG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgZG1hX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKQEAgLTE0NCw4ICsxNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG90Ynl0ZXMgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CiAJc3RydWN0IHMzY19kbWFfcGFyYW1zICpkbWEgPQogCQlzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEocnRkLT5jcHVfZGFpLCBzdWJzdHJlYW0pOwotCWludCByZXQgPSAwOwotCisJc3RydWN0IHNhbXN1bmdfZG1hX2luZm8gZG1hX2luZm87CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCkBAIC0xNjMsMzAgKzE2NCwyNiBAQAogCQlwcl9kZWJ1ZygicGFyYW1zICVwLCBjbGllbnQgJXAsIGNoYW5uZWwgJWRcbiIsIHBydGQtPnBhcmFtcywKIAkJCXBydGQtPnBhcmFtcy0+Y2xpZW50LCBwcnRkLT5wYXJhbXMtPmNoYW5uZWwpOwogCi0JCXJldCA9IHMzYzI0MTBfZG1hX3JlcXVlc3QocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCQkgIHBydGQtPnBhcmFtcy0+Y2xpZW50LCBOVUxMKTsKKwkJcHJ0ZC0+cGFyYW1zLT5vcHMgPSBzYW1zdW5nX2RtYV9nZXRfb3BzKCk7CiAKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGdldCBkbWEgY2hhbm5lbFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogdXNlIHRoZSBjaXJjdWxhciBidWZmZXJpbmcgaWYgd2UgaGF2ZSBpdCBhdmFpbGFibGUuICovCi0JCWlmIChzM2NfZG1hX2hhc19jaXJjdWxhcigpKQotCQkJczNjMjQxMF9kbWFfc2V0ZmxhZ3MocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCQkgICAgIFMzQzI0MTBfRE1BRl9DSVJDVUxBUik7CisJCWRtYV9pbmZvLmNhcCA9IChzYW1zdW5nX2RtYV9oYXNfY2lyY3VsYXIoKSA/CisJCQlETUFfQ1lDTElDIDogRE1BX1NMQVZFKTsKKwkJZG1hX2luZm8uY2xpZW50ID0gcHJ0ZC0+cGFyYW1zLT5jbGllbnQ7CisJCWRtYV9pbmZvLmRpcmVjdGlvbiA9CisJCQkoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSworCQkJPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKKwkJZG1hX2luZm8ud2lkdGggPSBwcnRkLT5wYXJhbXMtPmRtYV9zaXplOworCQlkbWFfaW5mby5maWZvID0gcHJ0ZC0+cGFyYW1zLT5kbWFfYWRkcjsKKwkJcHJ0ZC0+cGFyYW1zLT5jaCA9IHBydGQtPnBhcmFtcy0+b3BzLT5yZXF1ZXN0KAorCQkJCXBydGQtPnBhcmFtcy0+Y2hhbm5lbCwgJmRtYV9pbmZvKTsKIAl9CiAKLQlzM2MyNDEwX2RtYV9zZXRfYnVmZmRvbmVfZm4ocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICBhdWRpb19idWZmZG9uZSk7Ci0KIAlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwogCiAJcnVudGltZS0+ZG1hX2J5dGVzID0gdG90Ynl0ZXM7CiAKIAlzcGluX2xvY2tfaXJxKCZwcnRkLT5sb2NrKTsKIAlwcnRkLT5kbWFfbG9hZGVkID0gMDsKLQlwcnRkLT5kbWFfbGltaXQgPSBydW50aW1lLT5ody5wZXJpb2RzX21pbjsKIAlwcnRkLT5kbWFfcGVyaW9kID0gcGFyYW1zX3BlcmlvZF9ieXRlcyhwYXJhbXMpOwogCXBydGQtPmRtYV9zdGFydCA9IHJ1bnRpbWUtPmRtYV9hZGRyOwogCXBydGQtPmRtYV9wb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CkBAIC0yMDIsMTEgKzE5OSwxMiBAQAogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAotCS8qIFRPRE8gLSBkbyB3ZSBuZWVkIHRvIGVuc3VyZSBETUEgZmx1c2hlZCAqLwogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7CiAKIAlpZiAocHJ0ZC0+cGFyYW1zKSB7Ci0JCXMzYzI0MTBfZG1hX2ZyZWUocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBwcnRkLT5wYXJhbXMtPmNsaWVudCk7CisJCXBydGQtPnBhcmFtcy0+b3BzLT5mbHVzaChwcnRkLT5wYXJhbXMtPmNoKTsKKwkJcHJ0ZC0+cGFyYW1zLT5vcHMtPnJlbGVhc2UocHJ0ZC0+cGFyYW1zLT5jaCwKKwkJCQkJcHJ0ZC0+cGFyYW1zLT5jbGllbnQpOwogCQlwcnRkLT5wYXJhbXMgPSBOVUxMOwogCX0KIApAQCAtMjI1LDIzICsyMjMsOSBAQAogCWlmICghcHJ0ZC0+cGFyYW1zKQogCQlyZXR1cm4gMDsKIAotCS8qIGNoYW5uZWwgbmVlZHMgY29uZmlndXJpbmcgZm9yIG1lbT0+ZGV2aWNlLCBpbmNyZW1lbnQgbWVtb3J5IGFkZHIsCi0JICogc3luYyB0byBwY2xrLCBoYWxmLXdvcmQgdHJhbnNmZXJzIHRvIHRoZSBJSVMtRklGTy4gKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzM2MyNDEwX2RtYV9kZXZjb25maWcocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICAgIFMzQzI0MTBfRE1BU1JDX01FTSwKLQkJCQkgICAgICBwcnRkLT5wYXJhbXMtPmRtYV9hZGRyKTsKLQl9IGVsc2UgewotCQlzM2MyNDEwX2RtYV9kZXZjb25maWcocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAotCQkJCSAgICAgIFMzQzI0MTBfRE1BU1JDX0hXLAotCQkJCSAgICAgIHBydGQtPnBhcmFtcy0+ZG1hX2FkZHIpOwotCX0KLQotCXMzYzI0MTBfZG1hX2NvbmZpZyhwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCi0JCQkgICBwcnRkLT5wYXJhbXMtPmRtYV9zaXplKTsKLQogCS8qIGZsdXNoIHRoZSBETUEgY2hhbm5lbCAqLwotCXMzYzI0MTBfZG1hX2N0cmwocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBTM0MyNDEwX0RNQU9QX0ZMVVNIKTsKKwlwcnRkLT5wYXJhbXMtPm9wcy0+Zmx1c2gocHJ0ZC0+cGFyYW1zLT5jaCk7CisKIAlwcnRkLT5kbWFfbG9hZGVkID0gMDsKIAlwcnRkLT5kbWFfcG9zID0gcHJ0ZC0+ZG1hX3N0YXJ0OwogCkBAIC0yNjUsMTQgKzI0OSwxNCBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKIAkJcHJ0ZC0+c3RhdGUgfD0gU1RfUlVOTklORzsKLQkJczNjMjQxMF9kbWFfY3RybChwcnRkLT5wYXJhbXMtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfU1RBUlQpOworCQlwcnRkLT5wYXJhbXMtPm9wcy0+dHJpZ2dlcihwcnRkLT5wYXJhbXMtPmNoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKIAkJcHJ0ZC0+c3RhdGUgJj0gflNUX1JVTk5JTkc7Ci0JCXMzYzI0MTBfZG1hX2N0cmwocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBTM0MyNDEwX0RNQU9QX1NUT1ApOworCQlwcnRkLT5wYXJhbXMtPm9wcy0+c3RvcChwcnRkLT5wYXJhbXMtPmNoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjkxLDIxICsyNzUsMTIgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZXM7Ci0JZG1hX2FkZHJfdCBzcmMsIGRzdDsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCXMzYzI0MTBfZG1hX2dldHBvc2l0aW9uKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwgJnNyYywgJmRzdCk7CisJcmVzID0gcHJ0ZC0+ZG1hX3BvcyAtIHBydGQtPmRtYV9zdGFydDsKIAotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJlcyA9IGRzdCAtIHBydGQtPmRtYV9zdGFydDsKLQllbHNlCi0JCXJlcyA9IHNyYyAtIHBydGQtPmRtYV9zdGFydDsKLQotCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXByX2RlYnVnKCJQb2ludGVyICV4ICV4XG4iLCBzcmMsIGRzdCk7CisJcHJfZGVidWcoIlBvaW50ZXIgb2Zmc2V0OiAlbHVcbiIsIHJlcyk7CiAKIAkvKiB3ZSBzZWVtIHRvIGJlIGdldHRpbmcgdGhlIG9kZCBlcnJvciBmcm9tIHRoZSBwY20gbGlicmFyeSBkdWUKIAkgKiB0byBvdXQtb2YtYm91bmRzIHBvaW50ZXJzLiB0aGlzIGlzIG1heWJlIGR1ZSB0byB0aGUgZG1hIGVuZ2luZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvZG1hLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAppbmRleCBjNTA2NTkyLi43ZDFlYWQ3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaApAQCAtNiw3ICs2LDcgQEAKICAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqICBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBTYW1zdW5nIFMzQzI0eHggQ1BVCisgKiAgQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgU2Ftc3VuZyBTb0MKICAqLwogCiAjaWZuZGVmIF9TM0NfQVVESU9fSApAQCAtMTcsNiArMTcsOCBAQAogCWludCBjaGFubmVsOwkJCQkvKiBDaGFubmVsIElEICovCiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlpbnQgZG1hX3NpemU7CQkJLyogU2l6ZSBvZiB0aGUgRE1BIHRyYW5zZmVyICovCisJdW5zaWduZWQgY2g7CisJc3RydWN0IHNhbXN1bmdfZG1hX29wcyAqb3BzOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9nb25pX3dtODk5NC5jIGIvc291bmQvc29jL3NhbXN1bmcvZ29uaV93bTg5OTQuYwppbmRleCBlYjZkNzJlLi44NGY5YzNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9nb25pX3dtODk5NC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2dvbmlfd204OTk0LmMKQEAgLTExLDYgKzExLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIApAQCAtOTksMTQgKzEwMCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQkvKiBhZGQgZ29uaSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBnb25pX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUoZ29uaV9kYXBtX3dpZGdldHMpKTsKLQotCS8qIHNldCB1cCBnb25pIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGdvbmlfZGFwbV9yb3V0ZXMsCi0JCQlBUlJBWV9TSVpFKGdvbmlfZGFwbV9yb3V0ZXMpKTsKLQogCS8qIHNldCBlbmRwb2ludHMgdG8gbm90IGNvbm5lY3RlZCAqLwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIklOMkxQOlZYUk4iKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJJTjJSUDpWWFJQIik7CkBAIC0xMjAsOCArMTEzLDYgQEAKIAkJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiU1BLT1VUUlAiKTsKIAl9CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gKi8KIAlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCBKYWNrIiwKIAkJCVNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19NRUNIQU5JQ0FMIHwgU05EX0pBQ0tfQVZPVVQsCkBAIC0yNTUsNiArMjQ2LDExIEBACiAJLm5hbWUgPSAiZ29uaSIsCiAJLmRhaV9saW5rID0gZ29uaV9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoZ29uaV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IGdvbmlfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShnb25pX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gZ29uaV9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShnb25pX2RhcG1fcm91dGVzKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdvbmlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCmluZGV4IGM2YzY1ODkuLjAzY2ZhNWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgpAQCAtMTgyLDI0ICsxODMsMTAgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAotCS8qIEFkZCBoMTk0MCBzcGVjaWZpYyB3aWRnZXRzICovCi0JZXJyID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogU2V0IHVwIGgxOTQwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsCi0JCQkJICAgICAgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FLAogCQkmaHBfamFjayk7CiAKQEAgLTIzMCw2ICsyMTcsMTEgQEAKIAkubmFtZSA9ICJoMTk0MCIsCiAJLmRhaV9saW5rID0gaDE5NDBfdWRhMTM4MF9kYWksCiAJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoaDE5NDBfdWRhMTM4MF9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHVkYTEzODBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBoMTk0MF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCmluZGV4IGMwODZiNzguLmJmZjQyYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0xMTM2LDcgKzExMzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzYW1zdW5nX2kyc19kcml2ZXIgPSB7CiAJLnByb2JlICA9IHNhbXN1bmdfaTJzX3Byb2JlLAotCS5yZW1vdmUgPSBzYW1zdW5nX2kyc19yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNhbXN1bmdfaTJzX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYwppbmRleCBlYmRlMDc0Li5jNDExNzhlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pZG1hLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaWRtYS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2ppdmVfd204NzUwLmMKaW5kZXggMTRlYjZlYS4uMTgyNmFjZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9qaXZlX3dtODc1MC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0xMTAsMTggKzExMSw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUMyIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1PTk8iKTsKIAotCS8qIEFkZCBqaXZlIHNwZWNpZmljIHdpZGdldHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODc1MF9kYXBtX3dpZGdldHMsCi0JCQkJCUFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cykpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFkZCB3aWRnZXRzICglZClcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMxLDcgKzEyMCw3IEBACiAJLmNwdV9kYWlfbmFtZQk9ICJzM2MyNDEyLWkycyIsCiAJLmNvZGVjX2RhaV9uYW1lID0gIndtODc1MC1oaWZpIiwKIAkucGxhdGZvcm1fbmFtZQk9ICJzYW1zdW5nLWF1ZGlvIiwKLQkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0wMDFhIiwKKwkuY29kZWNfbmFtZQk9ICJ3bTg3NTAuMC0wMDFhIiwKIAkuaW5pdAkJPSBqaXZlX3dtODc1MF9pbml0LAogCS5vcHMJCT0gJmppdmVfb3BzLAogfTsKQEAgLTE0MSw2ICsxMzAsMTEgQEAKIAkubmFtZQkJPSAiSml2ZSIsCiAJLmRhaV9saW5rCT0gJmppdmVfZGFpLAogCS5udW1fbGlua3MJPSAxLAorCisJLmRhcG1fd2lkZ3RldHMJPSB3bTg3NTBfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpqaXZlX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMKaW5kZXggYmQ5MWMxOS4uY2RlMzhiOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvbG4yNDQwc2JjX2FsYzY1MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2xuMjQ0MHNiY19hbGM2NTAuYwpAQCAtMTYsNiArMTYsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGxuMjQ0MHNiYzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX3dtODc1My5jCmluZGV4IDE2MTUyZWQuLjcyMDcxODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYwpAQCAtMzY3LDggKzM2Nyw2IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwOSw4ICs0MDcsNiBAQAogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBTcGsiKTsKIAlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRwaG9uZSIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwppbmRleCA5YzdlOGI0Li4wNWE0N2NmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwpAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTYyNCw3ICs2MjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2NfcGNtX2RyaXZlciA9IHsKIAkucHJvYmUgID0gczNjX3BjbV9kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IHMzY19wY21fZGV2X3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoczNjX3BjbV9kZXZfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzYW1zdW5nLXBjbSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKaW5kZXggYmM4YzE2Ny4uNzFiNGMwMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KQEAgLTkwLDEyICs5MSw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHJ4MTk1MF9hc29jID0gewotCS5uYW1lID0gInJ4MTk1MCIsCi0JLmRhaV9saW5rID0gcngxOTUwX3VkYTEzODBfZGFpLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHJ4MTk1MF91ZGExMzgwX2RhaSksCi19OwotCiAvKiByeDE5NTAgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB1ZGExMzgwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIEphY2siLCBOVUxMKSwKQEAgLTExNyw2ICsxMTIsMTcgQEAKIAl7IlZJTk0iLCBOVUxMLCAiTWljIEphY2sifSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHJ4MTk1MF9hc29jID0geworCS5uYW1lID0gInJ4MTk1MCIsCisJLmRhaV9saW5rID0gcngxOTUwX3VkYTEzODBfZGFpLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHJ4MTk1MF91ZGExMzgwX2RhaSksCisKKwkuZGFwbV93aWRnZXRzID0gdWRhMTM4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzM2MyNHh4X3NuZF9kZXZpY2U7CiAKIHN0YXRpYyBpbnQgcngxOTUwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yMjAsMjYgKzIyNiwxMCBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgZXJyOwogCi0JLyogQWRkIHJ4MTk1MCBzcGVjaWZpYyB3aWRnZXRzICovCi0JZXJyID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBTZXQgdXAgcngxOTUwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsCi0JCQkJICAgICAgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCiAJCSZocF9qYWNrKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCmluZGV4IDUyMDc0YTJiLi43YTczMzgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwppbmRleCA4NDFhYjE0Li43YmJlYzI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTY5LDEwICs3MCwxMCBAQAogCXMzYzI0MTJfaTJzLmRtYV9wbGF5YmFjayA9ICZzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dDsKIAogCXMzYzI0MTJfaTJzLmlpc19jY2xrID0gY2xrX2dldChkYWktPmRldiwgImkyc2NsayIpOwotCWlmIChzM2MyNDEyX2kycy5paXNfY2NsayA9PSBOVUxMKSB7CisJaWYgKElTX0VSUihzM2MyNDEyX2kycy5paXNfY2NsaykpIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IGkyc2NsayBjbG9ja1xuIik7CiAJCWlvdW5tYXAoczNjMjQxMl9pMnMucmVncyk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gUFRSX0VSUihzM2MyNDEyX2kycy5paXNfY2Nsayk7CiAJfQogCiAJLyogU2V0IE1QTEwgYXMgdGhlIHNvdXJjZSBmb3IgSUlTIENMSyAqLwpAQCAtMTc2LDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0MTJfaWlzX2RyaXZlciA9IHsKIAkucHJvYmUgID0gczNjMjQxMl9paXNfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBzM2MyNDEyX2lpc19kZXZfcmVtb3ZlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzM2MyNDEyX2lpc19kZXZfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzM2MyNDEyLWlpcyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKaW5kZXggNjNkODg0OS4uNTU4YzY0YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0zODMsMTAgKzM4NCwxMCBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJczNjMjR4eF9pMnMuaWlzX2NsayA9IGNsa19nZXQoZGFpLT5kZXYsICJpaXMiKTsKLQlpZiAoczNjMjR4eF9pMnMuaWlzX2NsayA9PSBOVUxMKSB7CisJaWYgKElTX0VSUihzM2MyNHh4X2kycy5paXNfY2xrKSkgewogCQlwcl9lcnIoImZhaWxlZCB0byBnZXQgaWlzX2Nsb2NrXG4iKTsKIAkJaW91bm1hcChzM2MyNHh4X2kycy5yZWdzKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiBQVFJfRVJSKHMzYzI0eHhfaTJzLmlpc19jbGspOwogCX0KIAljbGtfZW5hYmxlKHMzYzI0eHhfaTJzLmlpc19jbGspOwogCkBAIC00ODEsNyArNDgyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9paXNfZHJpdmVyID0gewogCS5wcm9iZSAgPSBzM2MyNHh4X2lpc19kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IHMzYzI0eHhfaWlzX2Rldl9yZW1vdmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfaWlzX2Rldl9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInMzYzI0eHgtaWlzIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWMuYwppbmRleCAzNDk1NjZmLi5hMjUzYmNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIApAQCAtMzAwLDcgKzMwMSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLWludCBzaW10ZWNfYXVkaW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc2ltdGVjX2F1ZGlvX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc2ltdGVjX2NhbGxfc3RhcnR1cChwZGF0YSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY19oZXJtZXMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCmluZGV4IGNlNmFlZjYuLmQxMjVlNzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX2hlcm1lcy5jCkBAIC03LDYgKzcsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlICJzM2MyNHh4X3NpbXRlYy5oIgpAQCAtNjUsMTggKzY2LDEyIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAogCXNpbXRlY19hdWRpb19pbml0KHJ0ZCk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2LDYgKzkxLDExIEBACiAJLm5hbWUJCT0gIlNpbXRlYy1IZXJtZXMiLAogCS5kYWlfbGluawk9ICZzaW10ZWNfZGFpX2FpYzMzLAogCS5udW1fbGlua3MJPSAxLAorCisJLmRhcG1fd2lkZ2V0cwk9IGRhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMJPSBiYXNlX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShiYXNlX21hcCksCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzaW10ZWNfYXVkaW9faGVybWVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLmMKaW5kZXggYTdlZjdkYi4uNWU0ZmQ0NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY190bHYzMjBhaWMyMy5jCkBAIC03LDYgKzcsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlICJzM2MyNHh4X3NpbXRlYy5oIgpAQCAtNTQsMTggKzU1LDEyIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOwotCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAogCXNpbXRlY19hdWRpb19pbml0KHJ0ZCk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg1LDYgKzgwLDExIEBACiAJLm5hbWUJCT0gIlNpbXRlYyIsCiAJLmRhaV9saW5rCT0gJnNpbXRlY19kYWlfYWljMjMsCiAJLm51bV9saW5rcwk9IDEsCisKKwkuZGFwbV93aWRnZXRzCT0gZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcwk9IGJhc2VfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJhc2VfbWFwKSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNpbXRlY19hdWRpb190bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKaW5kZXggZGM5ZDU1MS4uNTQ4YzZhYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3MzYzI0eHhfdWRhMTM0eC5oPgpAQCAtNjYsMTcgKzY3LDE3IEBACiAJcHJfZGVidWcoIiVzICVkXG4iLCBfX2Z1bmNfXywgY2xrX3VzZXJzKTsKIAlpZiAoY2xrX3VzZXJzID09IDApIHsKIAkJeHRhbCA9IGNsa19nZXQoJnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLT5kZXYsICJ4dGFsIik7Ci0JCWlmICgheHRhbCkgeworCQlpZiAoSVNfRVJSKHh0YWwpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVCVVNZOworCQkJcmV0ID0gUFRSX0VSUih4dGFsKTsKIAkJfSBlbHNlIHsKIAkJCXBjbGsgPSBjbGtfZ2V0KCZzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZS0+ZGV2LAogCQkJCSAgICAgICAicGNsayIpOwotCQkJaWYgKCFwY2xrKSB7CisJCQlpZiAoSVNfRVJSKHBjbGspKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3QgZ2V0IHBjbGtcbiIsCiAJCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCQljbGtfcHV0KHh0YWwpOwotCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlyZXQgPSBQVFJfRVJSKHBjbGspOwogCQkJfQogCQl9CiAJCWlmICghcmV0KSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMKaW5kZXggMGEyYzRmMi4uYTIyZmM0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtYXJ0cV93bTg5ODcuYwpAQCAtMTQsNiArMTQsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CkBAIC0xNTMsMjAgKzE1NCw2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnIgPSAwOwogCi0JLyogQWRkIFNtYXJ0USBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5ODdfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg5ODdfZGFwbV93aWRnZXRzKSk7Ci0KLQkvKiBhZGQgU21hcnRRIHNwZWNpZmljIGNvbnRyb2xzICovCi0JZXJyID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk4N19zbWFydHFfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRSh3bTg5ODdfc21hcnRxX2NvbnRyb2xzKSk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIHNldHVwIFNtYXJ0USBzcGVjaWZpYyBhdWRpbyBwYXRoICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwotCiAJLyogc2V0IGVuZHBvaW50cyB0byBub3QgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElOUFVUMSIpOwogCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJJTlBVVDEiKTsKQEAgLTE3OCwxMCArMTY1LDYgQEAKIAlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50ZXJuYWwgTWljIik7CiAJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCi0JZXJyID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCS8qIEhlYWRwaG9uZSBqYWNrIGRldGVjdGlvbiAqLwogCWVyciA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUgSmFjayIsCiAJCQkgICAgICAgU05EX0pBQ0tfSEVBRFBIT05FLCAmc21hcnRxX2phY2spOwpAQCAtMjA3LDcgKzE5MCw3IEBACiAJCS5jcHVfZGFpX25hbWUJPSAic2Ftc3VuZy1pMnMuMCIsCiAJCS5jb2RlY19kYWlfbmFtZQk9ICJ3bTg3NTAtaGlmaSIsCiAJCS5wbGF0Zm9ybV9uYW1lCT0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0weDFhIiwKKwkJLmNvZGVjX25hbWUJPSAid204NzUwLjAtMHgxYSIsCiAJCS5pbml0CQk9IHNtYXJ0cV93bTg5ODdfaW5pdCwKIAkJLm9wcwkJPSAmc21hcnRxX2hpZmlfb3BzLAogCX0sCkBAIC0yMTcsNiArMjAwLDEzIEBACiAJLm5hbWUgPSAiU21hcnRRIiwKIAkuZGFpX2xpbmsgPSBzbWFydHFfZGFpLAogCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNtYXJ0cV9kYWkpLAorCisJLmRhcG1fd2lkZ2V0cyA9IHdtODk4N19kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4N19kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCS5jb250cm9scyA9IHdtODk4N19zbWFydHFfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTg3X3NtYXJ0cV9jb250cm9scyksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21hcnRxX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMKaW5kZXggZThhYzk2MS4uZTBmZDhhZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka19zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfc3BkaWYuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODAuYwppbmRleCAzZDI2ZjY2Li44MWI0NDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKQEAgLTExOSwzMCArMTIwLDI0IEBACiB9OwogCiAvKiBTTURLIFBsYXliYWNrIHdpZGdldHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg1ODBfZGFwbV93aWRnZXRzX3Bia1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHNtZGtfd204NTgwX2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9IUCgiRnJvbnQiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fSFAoIkNlbnRlcitTdWIiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fSFAoIlJlYXIiLCBOVUxMKSwKLX07CiAKLS8qIFNNREsgQ2FwdHVyZSB3aWRnZXRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NTgwX2RhcG1fd2lkZ2V0c19jcHRbXSA9IHsKIAlTTkRfU09DX0RBUE1fTUlDKCJNaWNJbiIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lSW4iLCBOVUxMKSwKIH07CiAKIC8qIFNNREstUEFJRlRYIGNvbm5lY3Rpb25zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBfdHhbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHNtZGtfd204NTgwX2F1ZGlvX21hcFtdID0gewogCS8qIE1pY0luIGZlZWRzIEFJTkwgKi8KIAl7IkFJTkwiLCBOVUxMLCAiTWljSW4ifSwKIAogCS8qIExpbmVJbiBmZWVkcyBBSU5ML1IgKi8KIAl7IkFJTkwiLCBOVUxMLCAiTGluZUluIn0sCiAJeyJBSU5SIiwgTlVMTCwgIkxpbmVJbiJ9LAotfTsKIAotLyogU01ESy1QQUlGUlggY29ubmVjdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF9yeFtdID0gewogCS8qIEZyb250IExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUMUwvUiAqLwogCXsiRnJvbnQiLCBOVUxMLCAiVk9VVDFMIn0sCiAJeyJGcm9udCIsIE5VTEwsICJWT1VUMVIifSwKQEAgLTE2MSwzOSArMTU2LDExIEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQkvKiBBZGQgc21kayBzcGVjaWZpYyBDYXB0dXJlIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODU4MF9kYXBtX3dpZGdldHNfY3B0LAotCQkJCSAgQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzX2NwdCkpOwotCi0JLyogU2V0IHVwIFBBSUZUWCBhdWRpbyBwYXRoICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwX3R4LCBBUlJBWV9TSVpFKGF1ZGlvX21hcF90eCkpOwotCiAJLyogRW5hYmxpbmcgdGhlIG1pY3JvcGhvbmUgcmVxdWlyZXMgdGhlIGZpdHRpbmcgb2YgYSAwUgogCSAqIHJlc2lzdG9yIHRvIGNvbm5lY3QgdGhlIGxpbmUgZnJvbSB0aGUgbWljcm9waG9uZSBqYWNrLgogCSAqLwogCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljSW4iKTsKIAotCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNtZGtfd204NTgwX2luaXRfcGFpZnJ4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0KLQkvKiBBZGQgc21kayBzcGVjaWZpYyBQbGF5YmFjayB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg1ODBfZGFwbV93aWRnZXRzX3BiaywKLQkJCQkgIEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0c19wYmspKTsKLQotCS8qIFNldCB1cCBQQUlGUlggYXVkaW8gcGF0aCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcF9yeCwgQVJSQVlfU0laRShhdWRpb19tYXBfcngpKTsKLQotCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTAsOCArMTc3LDcgQEAKIAkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLWkycy4wIiwKIAkJLmNvZGVjX2RhaV9uYW1lID0gIndtODU4MC1oaWZpLXBsYXliYWNrIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAotCQkuaW5pdCA9IHNtZGtfd204NTgwX2luaXRfcGFpZnJ4LAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAuMC0wMDFiIiwKIAkJLm9wcyA9ICZzbWRrX29wcywKIAl9LAogCVtQUklfQ0FQVFVSRV0gPSB7IC8qIFByaW1hcnkgQ2FwdHVyZSBpL2YgKi8KQEAgLTIyMCw3ICsxODYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctaTJzLjAiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktY2FwdHVyZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmNvZGVjX25hbWUgPSAid204NTgwLjAtMDAxYiIsCiAJCS5pbml0ID0gc21ka193bTg1ODBfaW5pdF9wYWlmdHgsCiAJCS5vcHMgPSAmc21ka19vcHMsCiAJfSwKQEAgLTIzMCw4ICsxOTYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctaTJzLngiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktcGxheWJhY2siLAogCQkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKLQkJLmNvZGVjX25hbWUgPSAid204NTgwLWNvZGVjLjAtMDAxYiIsCi0JCS5pbml0ID0gc21ka193bTg1ODBfaW5pdF9wYWlmcngsCisJCS5jb2RlY19uYW1lID0gIndtODU4MC4wLTAwMWIiLAogCQkub3BzID0gJnNtZGtfb3BzLAogCX0sCiB9OwpAQCAtMjQwLDYgKzIwNSwxMSBAQAogCS5uYW1lID0gIlNNREstSTJTIiwKIAkuZGFpX2xpbmsgPSBzbWRrX2RhaSwKIAkubnVtX2xpbmtzID0gMiwKKworCS5kYXBtX3dpZGdldHMgPSBzbWRrX3dtODU4MF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNtZGtfd204NTgwX2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gc21ka193bTg1ODBfYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNtZGtfd204NTgwX2F1ZGlvX21hcCksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka19zbmRfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMKaW5kZXggMGQxMjA5Mi4uMDY3NzQ3MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MHBjbS5jCkBAIC04LDYgKzgsNyBAQAogICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgogICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CkBAIC0xMjcsNyArMTI4LDcgQEAKIAkJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLXBjbS4wIiwKIAkJLmNvZGVjX2RhaV9uYW1lID0gIndtODU4MC1oaWZpLXBsYXliYWNrIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCi0JCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAuMC0wMDFiIiwKIAkJLm9wcyA9ICZzbWRrX3dtODU4MF9wY21fb3BzLAogCX0sIHsKIAkJLm5hbWUgPSAiV004NTgwIFBBSUYgUENNIFRYIiwKQEAgLTEzNSw3ICsxMzYsNyBAQAogCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctcGNtLjAiLAogCQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktY2FwdHVyZSIsCiAJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAotCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmNvZGVjX25hbWUgPSAid204NTgwLjAtMDAxYiIsCiAJCS5vcHMgPSAmc21ka193bTg1ODBfcGNtX29wcywKIAl9LAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCmluZGV4IDQ1ZmJlMmIuLmY3NWU0MzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYwpAQCAtMTE3LDggKzExNyw2IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSU4xUlAiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJJTjJSUDpWWFJQIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTRwY20uYwppbmRleCA1ZjIxMTE2Li5kYTljMmEyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKQEAgLTksNiArOSw3IEBACiAgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd205NzEzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtOTcxMy5jCmluZGV4IGZmZmUzYzEuLjMxYzZkYWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd205NzEzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTk3MTMuYwpAQCAtMTEsNiArMTEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNtZGs7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwppbmRleCAyOGM0OTFkLi40NjhjZmYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC0zNDAsNyArMzQxLDcgQEAKIAkuc2h1dGRvd24JPSBzcGRpZl9zaHV0ZG93biwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc2Ftc3VuZ19zcGRpZl9kYWkgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzYW1zdW5nX3NwZGlmX2RhaSA9IHsKIAkubmFtZSA9ICJzYW1zdW5nLXNwZGlmIiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJTL1BESUYgUGxheWJhY2siLApAQCAtNDc1LDcgKzQ3Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfc3BkaWZfZHJpdmVyID0gewogCS5wcm9iZQk9IHNwZGlmX3Byb2JlLAotCS5yZW1vdmUJPSBzcGRpZl9yZW1vdmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNwZGlmX3JlbW92ZSksCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJPSAic2Ftc3VuZy1zcGRpZiIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMKaW5kZXggNTkwZTkyNy4uODViZjU0MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3dtODk5Ni5oIgogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTkwODEuaCIKQEAgLTEyNSwxMCArMTI2LDYgQEAKIAkJLnBpbiA9ICJIZWFkc2V0IE1pYyIsCiAJCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKIAl9LAotCXsKLQkJLnBpbiA9ICJIZWFkcGhvbmUiLAotCQkubWFzayA9IFNORF9KQUNLX0hFQURQSE9ORSwKLQl9LAogfTsKIAogLyogRGVmYXVsdCB0aGUgaGVhZHBob25lIHNlbGVjdGlvbiB0byBhY3RpdmUgaGlnaCAqLwpAQCAtMTcxLDcgKzE2OCw4IEBACiAJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFdNODk5Nl9IUFNFTF9HUElPLCBzcGV5c2lkZV9qYWNrX3BvbGFyaXR5KTsKIAogCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkc2V0IiwKLQkJCSAgICAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAsCisJCQkgICAgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQgfAorCQkJICAgICAgIFNORF9KQUNLX0JUTl8wLAogCQkJICAgICAgICZzcGV5c2lkZV9oZWFkc2V0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjI3LDcgKzIyNSw3IEBACiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORU9VVCIpOwogCiAJLyogQXQgYW55IHRpbWUgdGhlIFdNOTA4MSBpcyBhY3RpdmUgaXQgd2lsbCBoYXZlIHRoaXMgY2xvY2sgKi8KLQlyZXR1cm4gc25kX3NvY19jb2RlY19zZXRfc3lzY2xrKGRhcG0tPmNvZGVjLCBXTTkwODFfU1lTQ0xLX01DTEssCisJcmV0dXJuIHNuZF9zb2NfY29kZWNfc2V0X3N5c2NsayhkYXBtLT5jb2RlYywgV005MDgxX1NZU0NMS19NQ0xLLCAwLAogCQkJCQk0ODAwMCAqIDI1NiwgMCk7CiB9CiAKQEAgLTI1Miw2ICsyNTAsNyBAQAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIk1haW4gQU1JQyIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIldNMTI1MCBJbnB1dCIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIldNMTI1MCBPdXRwdXQiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3aWRnZXRzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZV93bTg5NjIuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCmluZGV4IDcyNTM1ZjIuLmUzZTI3MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlX3dtODk2Mi5jCkBAIC0xMyw5ICsxMywxMiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5NjIuaCIKIAorc3RhdGljIGludCBzYW1wbGVfcmF0ZSA9IDQ0MTAwOworCiBzdGF0aWMgaW50IHNwZXlzaWRlX3dtODk2Ml9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAogCQkJCQkgIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAkJCQkJICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKQEAgLTMxLDEzICszNCwxMyBAQAogCQlpZiAoZGFwbS0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk2Ml9GTEwsCiAJCQkJCQkgIFdNODk2Ml9GTExfTUNMSywgMzI3NjgsCi0JCQkJCQkgIDQ0MTAwICogMjU2KTsKKwkJCQkJCSAgc2FtcGxlX3JhdGUgKiA1MTIpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcHJfZXJyKCJGYWlsZWQgdG8gc3RhcnQgRkxMOiAlZFxuIiwgcmV0KTsKIAogCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksCiAJCQkJCQkgICAgIFdNODk2Ml9TWVNDTEtfRkxMLAotCQkJCQkJICAgICA0NDEwMCAqIDI1NiwKKwkJCQkJCSAgICAgc2FtcGxlX3JhdGUgKiA1MTIsCiAJCQkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgU1lTQ0xLOiAlZFxuIiwgcmV0KTsKQEAgLTkyLDIyICs5NSw3IEBACiBzdGF0aWMgaW50IHNwZXlzaWRlX3dtODk2Ml9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKIHsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMKLQkJCQkJIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKLQkJCQkJIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIFNORF9TT0NfREFJRk1UX0kyUwotCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9OQl9ORgotCQkJCQkgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlzYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNCwxMiArMTEyLDE1IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg5NjIiLAogCQkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKIAkJLmNvZGVjX25hbWUgPSAid204OTYyLjEtMDAxYSIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKKwkJCQl8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJCS5vcHMgPSAmc3BleXNpZGVfd204OTYyX29wcywKIAl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xzW10gPSB7CiAJU09DX0RBUE1fUElOX1NXSVRDSCgiTWFpbiBTcGVha2VyIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiRE1JQyIpLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdpZGdldHNbXSA9IHsKQEAgLTEzNyw2ICsxMjgsNyBAQAogCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCiAKIAlTTkRfU09DX0RBUE1fTUlDKCJETUlDIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiQU1JQyIsIE5VTEwpLAogCiAJU05EX1NPQ19EQVBNX1NQSygiTWFpbiBTcGVha2VyIiwgTlVMTCksCiB9OwpAQCAtMTQ4LDEyICsxNDAsMTYgQEAKIAl7ICJNYWluIFNwZWFrZXIiLCBOVUxMLCAiU1BLT1VUTCIgfSwKIAl7ICJNYWluIFNwZWFrZXIiLCBOVUxMLCAiU1BLT1VUUiIgfSwKIAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiSGVhZHNldCBNaWMiIH0sCi0JeyAiSU40TCIsIE5VTEwsICJNSUNCSUFTIiB9LAotCXsgIklONFIiLCBOVUxMLCAiTUlDQklBUyIgfSwKKwl7ICJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTIiB9LAorCXsgIklONEwiLCBOVUxMLCAiSGVhZHNldCBNaWMiIH0sCisJeyAiSU40UiIsIE5VTEwsICJIZWFkc2V0IE1pYyIgfSwKIAotCXsgIk1JQ0JJQVMiLCBOVUxMLCAiRE1JQyIgfSwKLQl7ICJETUlDREFUIiwgTlVMTCwgIk1JQ0JJQVMiIH0sCisJeyAiQU1JQyIsIE5VTEwsICJNSUNCSUFTIiB9LAorCXsgIklOMUwiLCBOVUxMLCAiQU1JQyIgfSwKKwl7ICJJTjFSIiwgTlVMTCwgIkFNSUMiIH0sCisKKwl7ICJETUlDIiwgTlVMTCwgIk1JQ0JJQVMiIH0sCisJeyAiRE1JQ0RBVCIsIE5VTEwsICJETUlDIiB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgc3BleXNpZGVfd204OTYyX2hlYWRzZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jIGIvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYwppbmRleCA3NzBhNzFhLi5kZmY2NGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jCisrKyBiL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc2hfZnNpLmg+CiAKIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYyBiL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKaW5kZXggNTk1NTNmZC4uZjU1ODZiNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxzb3VuZC9zaF9mc2kuaD4KIAogc3RhdGljIGludCBmc2lfZGE3MjEwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2ktaGRtaS5jIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKaW5kZXggZDNkOWZkOC4uM2ViZWJlNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS1oZG1pLmMKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvc2hfZnNpLmg+CiAKIHN0cnVjdCBmc2lfaGRtaV9kYXRhIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9mc2kuYyBiL3NvdW5kL3NvYy9zaC9mc2kuYwppbmRleCA4ZTExMmNjLi4zZDcwMTZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvZnNpLmMKKysrIGIvc291bmQvc29jL3NoL2ZzaS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgogCkBAIC0yMTAsNyArMjExLDcgQEAKICAqCQliYXNpYyByZWFkIHdyaXRlIGZ1bmN0aW9uCiAgKi8KIAotc3RhdGljIHZvaWQgX19mc2lfcmVnX3dyaXRlKHUzMiByZWcsIHUzMiBkYXRhKQorc3RhdGljIHZvaWQgX19mc2lfcmVnX3dyaXRlKHUzMiBfX2lvbWVtICpyZWcsIHUzMiBkYXRhKQogewogCS8qIHZhbGlkIGRhdGEgYXJlYSBpcyAyNGJpdCAqLwogCWRhdGEgJj0gMHgwMGZmZmZmZjsKQEAgLTIxOCwxMiArMjE5LDEyIEBACiAJX19yYXdfd3JpdGVsKGRhdGEsIHJlZyk7CiB9CiAKLXN0YXRpYyB1MzIgX19mc2lfcmVnX3JlYWQodTMyIHJlZykKK3N0YXRpYyB1MzIgX19mc2lfcmVnX3JlYWQodTMyIF9faW9tZW0gKnJlZykKIHsKIAlyZXR1cm4gX19yYXdfcmVhZGwocmVnKTsKIH0KIAotc3RhdGljIHZvaWQgX19mc2lfcmVnX21hc2tfc2V0KHUzMiByZWcsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIF9fZnNpX3JlZ19tYXNrX3NldCh1MzIgX19pb21lbSAqcmVnLCB1MzIgbWFzaywgdTMyIGRhdGEpCiB7CiAJdTMyIHZhbCA9IF9fZnNpX3JlZ19yZWFkKHJlZyk7CiAKQEAgLTI1MCw3ICsyNTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gX19mc2lfcmVnX3JlYWQoKHUzMikobWFzdGVyLT5iYXNlICsgcmVnKSk7CisJcmV0ID0gX19mc2lfcmVnX3JlYWQobWFzdGVyLT5iYXNlICsgcmVnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0yNjQsNyArMjY1LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hc3Rlci0+bG9jaywgZmxhZ3MpOwotCV9fZnNpX3JlZ19tYXNrX3NldCgodTMyKShtYXN0ZXItPmJhc2UgKyByZWcpLCBtYXNrLCBkYXRhKTsKKwlfX2ZzaV9yZWdfbWFza19zZXQobWFzdGVyLT5iYXNlICsgcmVnLCBtYXNrLCBkYXRhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTI4NSw3ICsxMjg2LDcgQEAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbWFzdGVyKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgJmZzaV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCAmZnNpX2ludGVycnVwdCwgMCwKIAkJCSAgaWRfZW50cnktPm5hbWUsIG1hc3Rlcik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpcnEgcmVxdWVzdCBlcnJcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3NoNzc2MC1hYzk3LmMgYi9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYwppbmRleCA5MTdkM2NlLi5jNjJhZTY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYworKysgYi9zb3VuZC9zb2Mvc2gvc2g3NzYwLWFjOTcuYwpAQCAtMjAsMTIgKzIwLDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHNoNF9oYWNfZGFpWzJdOwogZXh0ZXJuIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBzaDc3NjBfc29jX3BsYXRmb3JtOwogCi1zdGF0aWMgaW50IG1hY2hpbmVfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXNuZF9zb2NfZGFwbV9zeW5jKCZydGQtPmNvZGVjLT5kYXBtKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNoNzc2MF9hYzk3X2RhaSA9IHsKIAkubmFtZSA9ICJBQzk3IiwKIAkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKQEAgLTMzLDcgKzI3LDYgQEAKIAkuY29kZWNfZGFpX25hbWUgPSAiYWM5Ny1oaWZpIiwKIAkucGxhdGZvcm1fbmFtZSA9ICJzaDc3NjAtcGNtLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJhYzk3LWNvZGVjIiwKLQkuaW5pdCA9IG1hY2hpbmVfaW5pdCwKIAkub3BzID0gTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMgYi9zb3VuZC9zb2Mvc2gvc2l1X2RhaS5jCmluZGV4IDQ5NzNjMjkuLmVkYWNmZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMKKysrIGIvc291bmQvc29jL3NoL3NpdV9kYWkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9zaXUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zc2kuYyBiL3NvdW5kL3NvYy9zaC9zc2kuYwppbmRleCAwNTE5MmQ5Li5lMGM2MjFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvc3NpLmMKKysrIGIvc291bmQvc29jL3NoL3NzaS5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkuc2V0X2ZtdAk9IHNzaV9zZXRfZm10LAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzaDRfc3NpX2RhaVtdID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgc2g0X3NzaV9kYWlbXSA9IHsKIHsKIAkubmFtZQkJCT0gInNzaS1kYWkuMCIsCiAJLnBsYXliYWNrID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jYWNoZS5jIGIvc291bmQvc29jL3NvYy1jYWNoZS5jCmluZGV4IDIwYjdmM2IuLjkwNzdhYTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY2FjaGUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sem8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9hc29jLmg+CiAKQEAgLTU0OCw5ICs1NDksNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBzbmRfc29jX2x6b19nZXRfYmxrc2l6ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyICpjb2RlY19kcnY7Ci0KLQljb2RlY19kcnYgPSBjb2RlYy0+ZHJpdmVyOwogCXJldHVybiBESVZfUk9VTkRfVVAoY29kZWMtPnJlZ19zaXplLCBzbmRfc29jX2x6b19ibG9ja19jb3VudCgpKTsKIH0KIApAQCAtODY4LDEwICs4NjYsNiBAQAogCiBzdGF0aWMgaW50IHNuZF9zb2NfZmxhdF9jYWNoZV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKLQotCWNvZGVjX2RydiA9IGNvZGVjLT5kcml2ZXI7Ci0KIAlpZiAoY29kZWMtPnJlZ19kZWZfY29weSkKIAkJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAoY29kZWMtPnJlZ19kZWZfY29weSwKIAkJCQkJICAgY29kZWMtPnJlZ19zaXplLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKaW5kZXggZWY2OWY1YS4uYTVkMzY4NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jb3JlLmMKKysrIGIvc291bmQvc29jL3NvYy1jb3JlLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlmICh3b3Jkc2l6ZSArIHJlZ3NpemUgKyAyICsgMSAhPSBsZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjICwgcmVnKTsKKwlyZXQgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWVtc2V0KHJlZ2J1ZiwgJ1gnLCByZWdzaXplKTsKIAkJcmVnYnVmW3JlZ3NpemVdID0gJ1wwJzsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQlzdGVwID0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3N0ZXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemU7IGkgKz0gc3RlcCkgewotCQlpZiAoY29kZWMtPnJlYWRhYmxlX3JlZ2lzdGVyICYmICFjb2RlYy0+cmVhZGFibGVfcmVnaXN0ZXIoY29kZWMsIGkpKQorCQlpZiAoIXNuZF9zb2NfY29kZWNfcmVhZGFibGVfcmVnaXN0ZXIoY29kZWMsIGkpKQogCQkJY29udGludWU7CiAJCWlmIChjb2RlYy0+ZHJpdmVyLT5kaXNwbGF5X3JlZ2lzdGVyKSB7CiAJCQljb3VudCArPSBjb2RlYy0+ZHJpdmVyLT5kaXNwbGF5X3JlZ2lzdGVyKGNvZGVjLCBidWYgKyBjb3VudCwKQEAgLTI0NSw3ICsyNDUsNiBAQAogCXNpemVfdCBidWZfc2l6ZTsKIAljaGFyICpzdGFydCA9IGJ1ZjsKIAl1bnNpZ25lZCBsb25nIHJlZywgdmFsdWU7Ci0JaW50IHN0ZXAgPSAxOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOwpAQCAtMjUzLDkgKzI1Miw2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCWJ1ZltidWZfc2l6ZV0gPSAwOwogCi0JaWYgKGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwKQotCQlzdGVwID0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3N0ZXA7Ci0KIAl3aGlsZSAoKnN0YXJ0ID09ICcgJykKIAkJc3RhcnQrKzsKIAlyZWcgPSBzaW1wbGVfc3RydG91bChzdGFydCwgJnN0YXJ0LCAxNik7CkBAIC05NTcsNiArOTUzLDggQEAKIAkJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY29kZWMtPmRhcG0sIGRyaXZlci0+ZGFwbV93aWRnZXRzLAogCQkJCQkgIGRyaXZlci0+bnVtX2RhcG1fd2lkZ2V0cyk7CiAKKwljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gZHJpdmVyLT5pZGxlX2JpYXNfb2ZmOworCiAJaWYgKGRyaXZlci0+cHJvYmUpIHsKIAkJcmV0ID0gZHJpdmVyLT5wcm9iZShjb2RlYyk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0xMDU3LDYgKzEwNTUsOSBAQAogCX0KIAlydGQtPmNhcmQgPSBjYXJkOwogCisJLyogTWFrZSBzdXJlIGFsbCBEQVBNIHdpZGdldHMgYXJlIGluc3RhbnRpYXRlZCAqLworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cygmY29kZWMtPmRhcG0pOworCiAJLyogbWFjaGluZSBjb250cm9scywgcm91dGVzIGFuZCB3aWRnZXRzIGFyZSBub3QgcHJlZml4ZWQgKi8KIAl0ZW1wID0gY29kZWMtPm5hbWVfcHJlZml4OwogCWNvZGVjLT5uYW1lX3ByZWZpeCA9IE5VTEw7CkBAIC0xMDcyLDkgKzEwNzMsNiBAQAogCX0KIAljb2RlYy0+bmFtZV9wcmVmaXggPSB0ZW1wOwogCi0JLyogTWFrZSBzdXJlIGFsbCBEQVBNIHdpZGdldHMgYXJlIGluc3RhbnRpYXRlZCAqLwotCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cygmY29kZWMtPmRhcG0pOwotCiAJLyogcmVnaXN0ZXIgdGhlIHJ0ZCBkZXZpY2UgKi8KIAlydGQtPmNvZGVjID0gY29kZWM7CiAJcnRkLT5kZXYucGFyZW50ID0gY2FyZC0+ZGV2OwpAQCAtMTMxOSw2ICsxMzE3LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiAqY29kZWNfY29uZjsKIAllbnVtIHNuZF9zb2NfY29tcHJlc3NfdHlwZSBjb21wcmVzc190eXBlOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKIAlpbnQgcmV0LCBpLCBvcmRlcjsKIAogCW11dGV4X2xvY2soJmNhcmQtPm11dGV4KTsKQEAgLTE0MzEsNiArMTQzMCwyOCBAQAogCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwgY2FyZC0+ZGFwbV9yb3V0ZXMsCiAJCQkJCWNhcmQtPm51bV9kYXBtX3JvdXRlcyk7CiAKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmNhcmQtPmRhcG0pOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7CisJCWRhaV9saW5rID0gJmNhcmQtPmRhaV9saW5rW2ldOworCisJCWlmIChkYWlfbGluay0+ZGFpX2ZtdCkgeworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjYXJkLT5ydGRbaV0uY29kZWNfZGFpLAorCQkJCQkJICBkYWlfbGluay0+ZGFpX2ZtdCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X3dhcm4oY2FyZC0+cnRkW2ldLmNvZGVjX2RhaS0+ZGV2LAorCQkJCQkgIkZhaWxlZCB0byBzZXQgREFJIGZvcm1hdDogJWRcbiIsCisJCQkJCSByZXQpOworCisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNhcmQtPnJ0ZFtpXS5jcHVfZGFpLAorCQkJCQkJICBkYWlfbGluay0+ZGFpX2ZtdCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X3dhcm4oY2FyZC0+cnRkW2ldLmNwdV9kYWktPmRldiwKKwkJCQkJICJGYWlsZWQgdG8gc2V0IERBSSBmb3JtYXQ6ICVkXG4iLAorCQkJCQkgcmV0KTsKKwkJfQorCX0KKwogCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5zaG9ydG5hbWUsIHNpemVvZihjYXJkLT5zbmRfY2FyZC0+c2hvcnRuYW1lKSwKIAkJICIlcyIsIGNhcmQtPm5hbWUpOwogCXNucHJpbnRmKGNhcmQtPnNuZF9jYXJkLT5sb25nbmFtZSwgc2l6ZW9mKGNhcmQtPnNuZF9jYXJkLT5sb25nbmFtZSksCkBAIC0xNDU5LDYgKzE0ODAsOCBAQAogCQl9CiAJfQogCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKCZjYXJkLT5kYXBtKTsKKwogCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQtPnNuZF9jYXJkKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byByZWdpc3RlciBzb3VuZGNhcmQgZm9yICVzXG4iLCBjYXJkLT5uYW1lKTsKQEAgLTE0NzksNiArMTUwMiw3IEBACiAjZW5kaWYKIAogCWNhcmQtPmluc3RhbnRpYXRlZCA9IDE7CisJc25kX3NvY19kYXBtX3N5bmMoJmNhcmQtPmRhcG0pOwogCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOwogCXJldHVybjsKIApAQCAtMjIyOSw3ICsyMjUzLDggQEAKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAogICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCi0gKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCisgKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1peGVyIGNvbnRyb2wsIG9yIGEgZG91YmxlCisgKiBtaXhlciBjb250cm9sIHRoYXQgc3BhbnMgMiByZWdpc3RlcnMuCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgogICovCkBAIC0yMjM5LDggKzIyNjQsNiBAQAogCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQogCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJaW50IHBsYXRmb3JtX21heDsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAKIAlpZiAoIW1jLT5wbGF0Zm9ybV9tYXgpCiAJCW1jLT5wbGF0Zm9ybV9tYXggPSBtYy0+bWF4OwpAQCAtMjI1MSw3ICsyMjc0LDcgQEAKIAllbHNlCiAJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwogCi0JdWluZm8tPmNvdW50ID0gc2hpZnQgPT0gcnNoaWZ0ID8gMSA6IDI7CisJdWluZm8tPmNvdW50ID0gc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpID8gMiA6IDE7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKIAl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBwbGF0Zm9ybV9tYXg7CiAJcmV0dXJuIDA7CkBAIC0yMjYzLDcgKzIyODYsOCBAQAogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCiAgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKLSAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgbWl4ZXIgY29udHJvbC4KKyAqIENhbGxiYWNrIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgbWl4ZXIgY29udHJvbCwgb3IgYSBkb3VibGUgbWl4ZXIKKyAqIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCiAgKi8KQEAgLTIyNzQsNiArMjI5OCw3IEBACiAJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisJdW5zaWduZWQgaW50IHJlZzIgPSBtYy0+cnJlZzsKIAl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7CiAJdW5zaWduZWQgaW50IHJzaGlmdCA9IG1jLT5yc2hpZnQ7CiAJaW50IG1heCA9IG1jLT5tYXg7CkBAIC0yMjgyLDEzICsyMzA3LDE4IEBACiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKLQlpZiAoc2hpZnQgIT0gcnNoaWZ0KQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHJzaGlmdCkgJiBtYXNrOwotCWlmIChpbnZlcnQpIHsKKwlpZiAoaW52ZXJ0KQogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJaWYgKHNoaWZ0ICE9IHJzaGlmdCkKKworCWlmIChzbmRfc29jX3ZvbHN3X2lzX3N0ZXJlbyhtYykpIHsKKwkJaWYgKHJlZyA9PSByZWcyKQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gcnNoaWZ0KSAmIG1hc2s7CisJCWVsc2UKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0KKwkJCQkoc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKSA+PiBzaGlmdCkgJiBtYXNrOworCQlpZiAoaW52ZXJ0KQogCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQogCQkJCW1heCAtIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwogCX0KQEAgLTIzMDIsNyArMjMzMiw4IEBACiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKICAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBtaXhlciBjb250cm9sLgorICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBtaXhlciBjb250cm9sLCBvciBhIGRvdWJsZSBtaXhlcgorICogY29udHJvbCB0aGF0IHNwYW5zIDIgcmVnaXN0ZXJzLgogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KICAqLwpAQCAtMjMxMywxNDMgKzIzNDQsNDQgQEAKIAkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKwl1bnNpZ25lZCBpbnQgcmVnMiA9IG1jLT5ycmVnOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKIAl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CiAJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7Ci0JdW5zaWduZWQgaW50IHZhbCwgdmFsMiwgdmFsX21hc2s7CisJaW50IGVycjsKKwlib29sIHR5cGVfMnIgPSAwOworCXVuc2lnbmVkIGludCB2YWwyID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsLCB2YWxfbWFzazsKIAogCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOwogCWlmIChpbnZlcnQpCiAJCXZhbCA9IG1heCAtIHZhbDsKIAl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CiAJdmFsID0gdmFsIDw8IHNoaWZ0OwotCWlmIChzaGlmdCAhPSByc2hpZnQpIHsKKwlpZiAoc25kX3NvY192b2xzd19pc19zdGVyZW8obWMpKSB7CiAJCXZhbDIgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiBtYXNrKTsKIAkJaWYgKGludmVydCkKIAkJCXZhbDIgPSBtYXggLSB2YWwyOwotCQl2YWxfbWFzayB8PSBtYXNrIDw8IHJzaGlmdDsKLQkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCQlpZiAocmVnID09IHJlZzIpIHsKKwkJCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OworCQkJdmFsIHw9IHZhbDIgPDwgcnNoaWZ0OworCQl9IGVsc2UgeworCQkJdmFsMiA9IHZhbDIgPDwgc2hpZnQ7CisJCQl0eXBlXzJyID0gMTsKKwkJfQogCX0KLQlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7Ci0KLS8qKgotICogc25kX3NvY19pbmZvX3ZvbHN3XzJyIC0gZG91YmxlIG1peGVyIGluZm8gY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdAotICogc3BhbnMgMiBjb2RlYyByZWdpc3RlcnMuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19pbmZvX3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgcGxhdGZvcm1fbWF4OwotCi0JaWYgKCFtYy0+cGxhdGZvcm1fbWF4KQotCQltYy0+cGxhdGZvcm1fbWF4ID0gbWMtPm1heDsKLQlwbGF0Zm9ybV9tYXggPSBtYy0+cGxhdGZvcm1fbWF4OwotCi0JaWYgKHBsYXRmb3JtX21heCA9PSAxICYmICFzdHJzdHIoa2NvbnRyb2wtPmlkLm5hbWUsICIgVm9sdW1lIikpCi0JCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOwotCWVsc2UKLQkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0KLQl1aW5mby0+Y291bnQgPSAyOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gcGxhdGZvcm1fbWF4OwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZvbHN3XzJyKTsKLQotLyoqCi0gKiBzbmRfc29jX2dldF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIG1peGVyIGNvbnRyb2wgdGhhdCBzcGFucyAyIHJlZ2lzdGVycy4KLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCi0gKi8KLWludCBzbmRfc29jX2dldF92b2xzd18ycihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKLQl1bnNpZ25lZCBpbnQgcmVnMiA9IG1jLT5ycmVnOwotCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKLQlpbnQgbWF4ID0gbWMtPm1heDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7Ci0JdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZykgPj4gc2hpZnQpICYgbWFzazsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCShzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpID4+IHNoaWZ0KSAmIG1hc2s7Ci0JaWYgKGludmVydCkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCQltYXggLSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQkJbWF4IC0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF92b2xzd18ycik7Ci0KLS8qKgotICogc25kX3NvY19wdXRfdm9sc3dfMnIgLSBkb3VibGUgbWl4ZXIgc2V0IGNhbGxiYWNrCi0gKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCi0gKgotICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBtaXhlciBjb250cm9sIHRoYXQgc3BhbnMgMiByZWdpc3RlcnMuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19wdXRfdm9sc3dfMnIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7Ci0JdW5zaWduZWQgaW50IHJlZzIgPSBtYy0+cnJlZzsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBtYy0+c2hpZnQ7Ci0JaW50IG1heCA9IG1jLT5tYXg7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAoMSA8PCBmbHMobWF4KSkgLSAxOwotCXVuc2lnbmVkIGludCBpbnZlcnQgPSBtYy0+aW52ZXJ0OwotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHZhbCwgdmFsMiwgdmFsX21hc2s7Ci0KLQl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7Ci0JdmFsID0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYgbWFzayk7Ci0JdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOwotCi0JaWYgKGludmVydCkgewotCQl2YWwgPSBtYXggLSB2YWw7Ci0JCXZhbDIgPSBtYXggLSB2YWwyOwotCX0KLQotCXZhbCA9IHZhbCA8PCBzaGlmdDsKLQl2YWwyID0gdmFsMiA8PCBzaGlmdDsKLQogCWVyciA9IHNuZF9zb2NfdXBkYXRlX2JpdHNfbG9ja2VkKGNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZzIsIHZhbF9tYXNrLCB2YWwyKTsKKwlpZiAodHlwZV8ycikKKwkJZXJyID0gc25kX3NvY191cGRhdGVfYml0c19sb2NrZWQoY29kZWMsIHJlZzIsIHZhbF9tYXNrLCB2YWwyKTsKKwogCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzd18ycik7CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF92b2xzdyk7CiAKIC8qKgogICogc25kX3NvY19pbmZvX3ZvbHN3X3M4IC0gc2lnbmVkIG1peGVyIGluZm8gY2FsbGJhY2sKQEAgLTI2ODAsNyArMjYxMiw3IEBACiAJaWYgKGRhaS0+ZHJpdmVyICYmIGRhaS0+ZHJpdmVyLT5vcHMtPnNldF9zeXNjbGspCiAJCXJldHVybiBkYWktPmRyaXZlci0+b3BzLT5zZXRfc3lzY2xrKGRhaSwgY2xrX2lkLCBmcmVxLCBkaXIpOwogCWVsc2UgaWYgKGRhaS0+Y29kZWMgJiYgZGFpLT5jb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKQotCQlyZXR1cm4gZGFpLT5jb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGRhaS0+Y29kZWMsIGNsa19pZCwKKwkJcmV0dXJuIGRhaS0+Y29kZWMtPmRyaXZlci0+c2V0X3N5c2NsayhkYWktPmNvZGVjLCBjbGtfaWQsIDAsCiAJCQkJCQkgICAgICBmcmVxLCBkaXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNjkxLDE2ICsyNjIzLDE4IEBACiAgKiBzbmRfc29jX2NvZGVjX3NldF9zeXNjbGsgLSBjb25maWd1cmUgQ09ERUMgc3lzdGVtIG9yIG1hc3RlciBjbG9jay4KICAqIEBjb2RlYzogQ09ERUMKICAqIEBjbGtfaWQ6IERBSSBzcGVjaWZpYyBjbG9jayBJRAorICogQHNvdXJjZTogU291cmNlIGZvciB0aGUgY2xvY2sKICAqIEBmcmVxOiBuZXcgY2xvY2sgZnJlcXVlbmN5IGluIEh6CiAgKiBAZGlyOiBuZXcgY2xvY2sgZGlyZWN0aW9uIC0gaW5wdXQvb3V0cHV0LgogICoKICAqIENvbmZpZ3VyZXMgdGhlIENPREVDIG1hc3RlciAoTUNMSykgb3Igc3lzdGVtIChTWVNDTEspIGNsb2NraW5nLgogICovCiBpbnQgc25kX3NvY19jb2RlY19zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGNsa19pZCwKLQl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKKwkJCSAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCiB7CiAJaWYgKGNvZGVjLT5kcml2ZXItPnNldF9zeXNjbGspCi0JCXJldHVybiBjb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGNvZGVjLCBjbGtfaWQsIGZyZXEsIGRpcik7CisJCXJldHVybiBjb2RlYy0+ZHJpdmVyLT5zZXRfc3lzY2xrKGNvZGVjLCBjbGtfaWQsIHNvdXJjZSwKKwkJCQkJCSBmcmVxLCBkaXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0yODk1LDYgKzI4MjksNyBAQAogCQljYXJkLT5ydGRbaV0uZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbaV07CiAKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRhcG1fZGlydHkpOwogCWNhcmQtPmluc3RhbnRpYXRlZCA9IDA7CiAJbXV0ZXhfaW5pdCgmY2FyZC0+bXV0ZXgpOwogCkBAIC0zMTUzLDYgKzMwODgsNyBAQAogCXBsYXRmb3JtLT5kcml2ZXIgPSBwbGF0Zm9ybV9kcnY7CiAJcGxhdGZvcm0tPmRhcG0uZGV2ID0gZGV2OwogCXBsYXRmb3JtLT5kYXBtLnBsYXRmb3JtID0gcGxhdGZvcm07CisJcGxhdGZvcm0tPmRhcG0uc3RyZWFtX2V2ZW50ID0gcGxhdGZvcm1fZHJ2LT5zdHJlYW1fZXZlbnQ7CiAKIAltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwogCWxpc3RfYWRkKCZwbGF0Zm9ybS0+bGlzdCwgJnBsYXRmb3JtX2xpc3QpOwpAQCAtMzI2NSw2ICszMjAxLDcgQEAKIAljb2RlYy0+ZGFwbS5kZXYgPSBkZXY7CiAJY29kZWMtPmRhcG0uY29kZWMgPSBjb2RlYzsKIAljb2RlYy0+ZGFwbS5zZXFfbm90aWZpZXIgPSBjb2RlY19kcnYtPnNlcV9ub3RpZmllcjsKKwljb2RlYy0+ZGFwbS5zdHJlYW1fZXZlbnQgPSBjb2RlY19kcnYtPnN0cmVhbV9ldmVudDsKIAljb2RlYy0+ZGV2ID0gZGV2OwogCWNvZGVjLT5kcml2ZXIgPSBjb2RlY19kcnY7CiAJY29kZWMtPm51bV9kYWkgPSBudW1fZGFpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBkNjdjNjM3Li5mNDJlOGI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtNDgsNiArNDgsOCBAQAogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAorI2RlZmluZSBEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgdmFsKSB3aWRnZXQtPmRhcG0tPmNhcmQtPmRhcG1fc3RhdHMudmFsKys7CisKIC8qIGRhcG0gcG93ZXIgc2VxdWVuY2VzIC0gbWFrZSB0aGlzIHBlciBjb2RlYyBpbiB0aGUgZnV0dXJlICovCiBzdGF0aWMgaW50IGRhcG1fdXBfc2VxW10gPSB7CiAJW3NuZF9zb2NfZGFwbV9wcmVdID0gMCwKQEAgLTExNyw2ICsxMTksMjEgQEAKIAlrZnJlZShidWYpOwogfQogCitzdGF0aWMgYm9vbCBkYXBtX2RpcnR5X3dpZGdldChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnctPmRpcnR5KTsKK30KKwordm9pZCBkYXBtX21hcmtfZGlydHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlpZiAoIWRhcG1fZGlydHlfd2lkZ2V0KHcpKSB7CisJCWRldl92ZGJnKHctPmRhcG0tPmRldiwgIk1hcmtpbmcgJXMgZGlydHkgZHVlIHRvICVzXG4iLAorCQkJIHctPm5hbWUsIHJlYXNvbik7CisJCWxpc3RfYWRkX3RhaWwoJnctPmRpcnR5LCAmdy0+ZGFwbS0+Y2FyZC0+ZGFwbV9kaXJ0eSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFwbV9tYXJrX2RpcnR5KTsKKwogLyogY3JlYXRlIGEgbmV3IGRhcG0gd2lkZ2V0ICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX2NuZXdfd2lkZ2V0KAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpfd2lkZ2V0KQpAQCAtMzE2LDcgKzMzMyw3IEBACiAJCX0KIAl9CiAJYnJlYWs7Ci0JLyogZG9lcyBub3QgZWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCisJLyogZG9lcyBub3QgYWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCiAJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgogCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6CiAJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgpAQCAtMzI4LDEzICszNDUsMTMgQEAKIAljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgogCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JCXAtPmNvbm5lY3QgPSAxOwotCWJyZWFrOwotCS8qIGRvZXMgZWZmZWN0IHJvdXRpbmcgLSBkeW5hbWljYWxseSBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9ocDoKIAljYXNlIHNuZF9zb2NfZGFwbV9taWM6CiAJY2FzZSBzbmRfc29jX2RhcG1fc3BrOgogCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCXAtPmNvbm5lY3QgPSAxOworCWJyZWFrOworCS8qIGRvZXMgYWZmZWN0IHJvdXRpbmcgLSBkeW5hbWljYWxseSBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9wcmU6CiAJY2FzZSBzbmRfc29jX2RhcG1fcG9zdDoKIAkJcC0+Y29ubmVjdCA9IDA7CkBAIC00NDMsNiArNDYwLDExIEBACiAJCQlpZiAocGF0aC0+bmFtZSAhPSAoY2hhciAqKXctPmtjb250cm9sX25ld3NbaV0ubmFtZSkKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKHctPmtjb250cm9sc1tpXSkgeworCQkJCXBhdGgtPmtjb250cm9sID0gdy0+a2NvbnRyb2xzW2ldOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQl3bGlzdHNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXRfbGlzdCkgKwogCQkJCSAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKiksCiAJCQl3bGlzdCA9IGt6YWxsb2Mod2xpc3RzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTU3OSw4ICs2MDEsOCBAQAogCQkJCQluYW1lICsgcHJlZml4X2xlbiwgcHJlZml4KTsKIAkJcmV0ID0gc25kX2N0bF9hZGQoY2FyZCwga2NvbnRyb2wpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkYXBtLT5kZXYsCi0JCQkJImFzb2M6IGZhaWxlZCB0byBhZGQga2NvbnRyb2wgJXNcbiIsIHctPm5hbWUpOworCQkJZGV2X2VycihkYXBtLT5kZXYsICJmYWlsZWQgdG8gYWRkIGtjb250cm9sICVzOiAlZFxuIiwKKwkJCQl3LT5uYW1lLCByZXQpOwogCQkJa2ZyZWUod2xpc3QpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtNjQ0LDMwICs2NjYsNDUgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CiAJaW50IGNvbiA9IDA7CiAKKwlpZiAod2lkZ2V0LT5vdXRwdXRzID49IDApCisJCXJldHVybiB3aWRnZXQtPm91dHB1dHM7CisKKwlEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgcGF0aF9jaGVja3MpOworCiAJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3N1cHBseSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHdpZGdldC0+aWQpIHsKIAljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKLQkJaWYgKHdpZGdldC0+YWN0aXZlKQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmFjdGl2ZSkgeworCQkJd2lkZ2V0LT5vdXRwdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPm91dHB1dHM7CisJCX0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAlpZiAod2lkZ2V0LT5jb25uZWN0ZWQpIHsKIAkJLyogY29ubmVjdGVkIHBpbiA/ICovCi0JCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9vdXRwdXQgJiYgIXdpZGdldC0+ZXh0KSB7CisJCQl3aWRnZXQtPm91dHB1dHMgPSBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkJcmV0dXJuIHdpZGdldC0+b3V0cHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBqYWNrIG9yIHNwayA/ICovCi0JCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9ocCB8fCB3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9zcGsgfHwKLQkJICAgICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9saW5lICYmICFsaXN0X2VtcHR5KCZ3aWRnZXQtPnNvdXJjZXMpKSkKLQkJCXJldHVybiBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faHAgfHwKKwkJICAgIHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3NwayB8fAorCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYKKwkJICAgICAhbGlzdF9lbXB0eSgmd2lkZ2V0LT5zb3VyY2VzKSkpIHsKKwkJCXdpZGdldC0+b3V0cHV0cyA9IHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCQlyZXR1cm4gd2lkZ2V0LT5vdXRwdXRzOworCQl9CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5zaW5rcywgbGlzdF9zb3VyY2UpIHsKKwkJREFQTV9VUERBVEVfU1RBVCh3aWRnZXQsIG5laWdoYm91cl9jaGVja3MpOworCiAJCWlmIChwYXRoLT53ZWFrKQogCQkJY29udGludWU7CiAKQEAgLTY4MCw2ICs3MTcsOCBAQAogCQl9CiAJfQogCisJd2lkZ2V0LT5vdXRwdXRzID0gY29uOworCiAJcmV0dXJuIGNvbjsKIH0KIApAQCAtNjkyLDYgKzczMSwxMSBAQAogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKIAlpbnQgY29uID0gMDsKIAorCWlmICh3aWRnZXQtPmlucHV0cyA+PSAwKQorCQlyZXR1cm4gd2lkZ2V0LT5pbnB1dHM7CisKKwlEQVBNX1VQREFURV9TVEFUKHdpZGdldCwgcGF0aF9jaGVja3MpOworCiAJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3N1cHBseSkKIAkJcmV0dXJuIDA7CiAKQEAgLTY5OSwyOCArNzQzLDQwIEBACiAJc3dpdGNoICh3aWRnZXQtPmlkKSB7CiAJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgogCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9pbjoKLQkJaWYgKHdpZGdldC0+YWN0aXZlKQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmFjdGl2ZSkgeworCQkJd2lkZ2V0LT5pbnB1dHMgPSBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkJcmV0dXJuIHdpZGdldC0+aW5wdXRzOworCQl9CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHdpZGdldC0+Y29ubmVjdGVkKSB7CiAJCS8qIGNvbm5lY3RlZCBwaW4gPyAqLwotCQlpZiAod2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgJiYgIXdpZGdldC0+ZXh0KQotCQkJcmV0dXJuIHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCWlmICh3aWRnZXQtPmlkID09IHNuZF9zb2NfZGFwbV9pbnB1dCAmJiAhd2lkZ2V0LT5leHQpIHsKKwkJCXdpZGdldC0+aW5wdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPmlucHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBWTUlEL0JpYXMgZm9yIGxvd2VyIHBvcHMgKi8KLQkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpCi0JCQlyZXR1cm4gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX3ZtaWQpIHsKKwkJCXdpZGdldC0+aW5wdXRzID0gc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2sod2lkZ2V0KTsKKwkJCXJldHVybiB3aWRnZXQtPmlucHV0czsKKwkJfQogCiAJCS8qIGNvbm5lY3RlZCBqYWNrID8gKi8KIAkJaWYgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAotCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYgIWxpc3RfZW1wdHkoJndpZGdldC0+c2lua3MpKSkKLQkJCXJldHVybiBzbmRfc29jX2RhcG1fc3VzcGVuZF9jaGVjayh3aWRnZXQpOworCQkgICAgKHdpZGdldC0+aWQgPT0gc25kX3NvY19kYXBtX2xpbmUgJiYKKwkJICAgICAhbGlzdF9lbXB0eSgmd2lkZ2V0LT5zaW5rcykpKSB7CisJCQl3aWRnZXQtPmlucHV0cyA9IHNuZF9zb2NfZGFwbV9zdXNwZW5kX2NoZWNrKHdpZGdldCk7CisJCQlyZXR1cm4gd2lkZ2V0LT5pbnB1dHM7CisJCX0KKwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCURBUE1fVVBEQVRFX1NUQVQod2lkZ2V0LCBuZWlnaGJvdXJfY2hlY2tzKTsKKwogCQlpZiAocGF0aC0+d2VhaykKIAkJCWNvbnRpbnVlOwogCkBAIC03MzMsNiArNzg5LDggQEAKIAkJfQogCX0KIAorCXdpZGdldC0+aW5wdXRzID0gY29uOworCiAJcmV0dXJuIGNvbjsKIH0KIApAQCAtNzU2LDEyICs4MTQsMjkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRhcG1fcmVnX2V2ZW50KTsKIAorc3RhdGljIGludCBkYXBtX3dpZGdldF9wb3dlcl9jaGVjayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKK3sKKwlpZiAody0+cG93ZXJfY2hlY2tlZCkKKwkJcmV0dXJuIHctPm5ld19wb3dlcjsKKworCWlmICh3LT5mb3JjZSkKKwkJdy0+bmV3X3Bvd2VyID0gMTsKKwllbHNlCisJCXctPm5ld19wb3dlciA9IHctPnBvd2VyX2NoZWNrKHcpOworCisJdy0+cG93ZXJfY2hlY2tlZCA9IHRydWU7CisKKwlyZXR1cm4gdy0+bmV3X3Bvd2VyOworfQorCiAvKiBHZW5lcmljIGNoZWNrIHRvIHNlZSBpZiBhIHdpZGdldCBzaG91bGQgYmUgcG93ZXJlZC4KICAqLwogc3RhdGljIGludCBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCiB7CiAJaW50IGluLCBvdXQ7CiAKKwlEQVBNX1VQREFURV9TVEFUKHcsIHBvd2VyX2NoZWNrcyk7CisKIAlpbiA9IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcCh3KTsKIAlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKQEAgLTc3NCw2ICs4NDksOCBAQAogewogCWludCBpbjsKIAorCURBUE1fVVBEQVRFX1NUQVQodywgcG93ZXJfY2hlY2tzKTsKKwogCWlmICh3LT5hY3RpdmUpIHsKIAkJaW4gPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAodyk7CiAJCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKQEAgLTc4OCw2ICs4NjUsOCBAQAogewogCWludCBvdXQ7CiAKKwlEQVBNX1VQREFURV9TVEFUKHcsIHBvd2VyX2NoZWNrcyk7CisKIAlpZiAody0+YWN0aXZlKSB7CiAJCW91dCA9IGlzX2Nvbm5lY3RlZF9vdXRwdXRfZXAodyk7CiAJCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKQEAgLTgwMSwxMCArODgwLDEzIEBACiBzdGF0aWMgaW50IGRhcG1fc3VwcGx5X2NoZWNrX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKLQlpbnQgcG93ZXIgPSAwOworCisJREFQTV9VUERBVEVfU1RBVCh3LCBwb3dlcl9jaGVja3MpOwogCiAJLyogQ2hlY2sgaWYgb25lIG9mIG91ciBvdXRwdXRzIGlzIGNvbm5lY3RlZCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQlEQVBNX1VQREFURV9TVEFUKHcsIG5laWdoYm91cl9jaGVja3MpOworCiAJCWlmIChwYXRoLT53ZWFrKQogCQkJY29udGludWU7CiAKQEAgLTgxNSwyMSArODk3LDE4IEBACiAJCWlmICghcGF0aC0+c2luaykKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChwYXRoLT5zaW5rLT5mb3JjZSkgewotCQkJcG93ZXIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGF0aC0+c2luay0+cG93ZXJfY2hlY2sgJiYKLQkJICAgIHBhdGgtPnNpbmstPnBvd2VyX2NoZWNrKHBhdGgtPnNpbmspKSB7Ci0JCQlwb3dlciA9IDE7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAoZGFwbV93aWRnZXRfcG93ZXJfY2hlY2socGF0aC0+c2luaykpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAKLQlyZXR1cm4gcG93ZXI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFwbV9hbHdheXNfb25fY2hlY2tfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncpCit7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgZGFwbV9zZXFfY29tcGFyZShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqYSwKQEAgLTExNzIsNiArMTI1MSw4NSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZGFwbV93aWRnZXRfc2V0X3BlZXJfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnBlZXIsCisJCQkJICAgICAgIGJvb2wgcG93ZXIsIGJvb2wgY29ubmVjdCkKK3sKKwkvKiBJZiBhIGNvbm5lY3Rpb24gaXMgYmVpbmcgbWFkZSBvciBicm9rZW4gdGhlbiB0aGF0IHVwZGF0ZQorCSAqIHdpbGwgaGF2ZSBtYXJrZWQgdGhlIHBlZXIgZGlydHksIG90aGVyd2lzZSB0aGUgd2lkZ2V0cyBhcmUKKwkgKiBub3QgY29ubmVjdGVkIGFuZCB0aGlzIHVwZGF0ZSBoYXMgbm8gaW1wYWN0LiAqLworCWlmICghY29ubmVjdCkKKwkJcmV0dXJuOworCisJLyogSWYgdGhlIHBlZXIgaXMgYWxyZWFkeSBpbiB0aGUgc3RhdGUgd2UncmUgbW92aW5nIHRvIHRoZW4gd2UKKwkgKiB3b24ndCBoYXZlIGFuIGltcGFjdCBvbiBpdC4gKi8KKwlpZiAocG93ZXIgIT0gcGVlci0+cG93ZXIpCisJCWRhcG1fbWFya19kaXJ0eShwZWVyLCAicGVlciBzdGF0ZSBjaGFuZ2UiKTsKK30KKworc3RhdGljIHZvaWQgZGFwbV93aWRnZXRfc2V0X3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBib29sIHBvd2VyLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqdXBfbGlzdCwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmRvd25fbGlzdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CisKKwlpZiAody0+cG93ZXIgPT0gcG93ZXIpCisJCXJldHVybjsKKworCXRyYWNlX3NuZF9zb2NfZGFwbV93aWRnZXRfcG93ZXIodywgcG93ZXIpOworCisJLyogSWYgd2UgY2hhbmdlZCBvdXIgcG93ZXIgc3RhdGUgcGVyaGFwcyBvdXIgbmVpZ2JvdXJzIGNoYW5nZWQKKwkgKiBhbHNvLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNvdXJjZXMsIGxpc3Rfc2luaykgeworCQlpZiAocGF0aC0+c291cmNlKSB7CisJCQlkYXBtX3dpZGdldF9zZXRfcGVlcl9wb3dlcihwYXRoLT5zb3VyY2UsIHBvd2VyLAorCQkJCQkJICAgcGF0aC0+Y29ubmVjdCk7CisJCX0KKwl9CisJc3dpdGNoICh3LT5pZCkgeworCWNhc2Ugc25kX3NvY19kYXBtX3N1cHBseToKKwkJLyogU3VwcGxpZXMgY2FuJ3QgYWZmZWN0IHRoZWlyIG91dHB1dHMsIG9ubHkgdGhlaXIgaW5wdXRzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQkJaWYgKHBhdGgtPnNpbmspIHsKKwkJCQlkYXBtX3dpZGdldF9zZXRfcGVlcl9wb3dlcihwYXRoLT5zaW5rLCBwb3dlciwKKwkJCQkJCQkgICBwYXRoLT5jb25uZWN0KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAocG93ZXIpCisJCWRhcG1fc2VxX2luc2VydCh3LCB1cF9saXN0LCB0cnVlKTsKKwllbHNlCisJCWRhcG1fc2VxX2luc2VydCh3LCBkb3duX2xpc3QsIGZhbHNlKTsKKworCXctPnBvd2VyID0gcG93ZXI7Cit9CisKK3N0YXRpYyB2b2lkIGRhcG1fcG93ZXJfb25lX3dpZGdldChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnVwX2xpc3QsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpkb3duX2xpc3QpCit7CisJaW50IHBvd2VyOworCisJc3dpdGNoICh3LT5pZCkgeworCWNhc2Ugc25kX3NvY19kYXBtX3ByZToKKwkJZGFwbV9zZXFfaW5zZXJ0KHcsIGRvd25fbGlzdCwgZmFsc2UpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9wb3N0OgorCQlkYXBtX3NlcV9pbnNlcnQodywgdXBfbGlzdCwgdHJ1ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcG93ZXIgPSBkYXBtX3dpZGdldF9wb3dlcl9jaGVjayh3KTsKKworCQlkYXBtX3dpZGdldF9zZXRfcG93ZXIodywgcG93ZXIsIHVwX2xpc3QsIGRvd25fbGlzdCk7CisJCWJyZWFrOworCX0KK30KKwogLyoKICAqIFNjYW4gZWFjaCBkYXBtIHdpZGdldCBmb3IgY29tcGxldGUgYXVkaW8gcGF0aC4KICAqIEEgY29tcGxldGUgcGF0aCBpcyBhIHJvdXRlIHRoYXQgaGFzIHZhbGlkIGVuZHBvaW50cyBpLmUuOi0KQEAgLTExOTAsNyArMTM0OCw2IEBACiAJTElTVF9IRUFEKGRvd25fbGlzdCk7CiAJTElTVF9IRUFEKGFzeW5jX2RvbWFpbik7CiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgYmlhczsKLQlpbnQgcG93ZXI7CiAKIAl0cmFjZV9zbmRfc29jX2RhcG1fc3RhcnQoY2FyZCk7CiAKQEAgLTEyMDMsNjEgKzEzNjAsNDcgQEAKIAkJfQogCX0KIAotCS8qIENoZWNrIHdoaWNoIHdpZGdldHMgd2UgbmVlZCB0byBwb3dlciBhbmQgc3RvcmUgdGhlbSBpbgotCSAqIGxpc3RzIGluZGljYXRpbmcgaWYgdGhleSBzaG91bGQgYmUgcG93ZXJlZCB1cCBvciBkb3duLgotCSAqLworCW1lbXNldCgmY2FyZC0+ZGFwbV9zdGF0cywgMCwgc2l6ZW9mKGNhcmQtPmRhcG1fc3RhdHMpKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPndpZGdldHMsIGxpc3QpIHsKLQkJc3dpdGNoICh3LT5pZCkgewotCQljYXNlIHNuZF9zb2NfZGFwbV9wcmU6Ci0JCQlkYXBtX3NlcV9pbnNlcnQodywgJmRvd25fbGlzdCwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6Ci0JCQlkYXBtX3NlcV9pbnNlcnQodywgJnVwX2xpc3QsIHRydWUpOwotCQkJYnJlYWs7CisJCXctPnBvd2VyX2NoZWNrZWQgPSBmYWxzZTsKKwkJdy0+aW5wdXRzID0gLTE7CisJCXctPm91dHB1dHMgPSAtMTsKKwl9CiAKLQkJZGVmYXVsdDoKLQkJCWlmICghdy0+cG93ZXJfY2hlY2spCi0JCQkJY29udGludWU7CisJLyogQ2hlY2sgd2hpY2ggd2lkZ2V0cyB3ZSBuZWVkIHRvIHBvd2VyIGFuZCBzdG9yZSB0aGVtIGluCisJICogbGlzdHMgaW5kaWNhdGluZyBpZiB0aGV5IHNob3VsZCBiZSBwb3dlcmVkIHVwIG9yIGRvd24uICBXZQorCSAqIG9ubHkgY2hlY2sgd2lkZ2V0cyB0aGF0IGhhdmUgYmVlbiBmbGFnZ2VkIGFzIGRpcnR5IGJ1dCBub3RlCisJICogdGhhdCBuZXcgd2lkZ2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGRpcnR5IGxpc3Qgd2hpbGUgd2UKKwkgKiBpdGVyYXRlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPmRhcG1fZGlydHksIGRpcnR5KSB7CisJCWRhcG1fcG93ZXJfb25lX3dpZGdldCh3LCAmdXBfbGlzdCwgJmRvd25fbGlzdCk7CisJfQogCi0JCQlpZiAoIXctPmZvcmNlKQotCQkJCXBvd2VyID0gdy0+cG93ZXJfY2hlY2sodyk7Ci0JCQllbHNlCi0JCQkJcG93ZXIgPSAxOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNhcmQtPndpZGdldHMsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmdy0+ZGlydHkpOwogCi0JCQlpZiAocG93ZXIpIHsKLQkJCQlkID0gdy0+ZGFwbTsKKwkJaWYgKHctPnBvd2VyKSB7CisJCQlkID0gdy0+ZGFwbTsKIAotCQkJCS8qIFN1cHBsaWVzIGFuZCBtaWNiaWFzZXMgb25seSBicmluZwotCQkJCSAqIHRoZSBjb250ZXh0IHVwIHRvIFNUQU5EQlkgYXMgdW5sZXNzCi0JCQkJICogc29tZXRoaW5nIGVsc2UgaXMgYWN0aXZlIGFuZAotCQkJCSAqIHBhc3NpbmcgYXVkaW8gdGhleSBnZW5lcmFsbHkgZG9uJ3QKLQkJCQkgKiByZXF1aXJlIGZ1bGwgcG93ZXIuCi0JCQkJICovCi0JCQkJc3dpdGNoICh3LT5pZCkgewotCQkJCWNhc2Ugc25kX3NvY19kYXBtX3N1cHBseToKLQkJCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgotCQkJCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPCBTTkRfU09DX0JJQVNfU1RBTkRCWSkKLQkJCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWQtPnRhcmdldF9iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkvKiBTdXBwbGllcyBhbmQgbWljYmlhc2VzIG9ubHkgYnJpbmcgdGhlCisJCQkgKiBjb250ZXh0IHVwIHRvIFNUQU5EQlkgYXMgdW5sZXNzIHNvbWV0aGluZworCQkJICogZWxzZSBpcyBhY3RpdmUgYW5kIHBhc3NpbmcgYXVkaW8gdGhleQorCQkJICogZ2VuZXJhbGx5IGRvbid0IHJlcXVpcmUgZnVsbCBwb3dlci4KKwkJCSAqLworCQkJc3dpdGNoICh3LT5pZCkgeworCQkJY2FzZSBzbmRfc29jX2RhcG1fc3VwcGx5OgorCQkJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwkJCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPCBTTkRfU09DX0JJQVNfU1RBTkRCWSkKKwkJCQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfU1RBTkRCWTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT047CisJCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCWlmICh3LT5wb3dlciA9PSBwb3dlcikKLQkJCQljb250aW51ZTsKLQotCQkJdHJhY2Vfc25kX3NvY19kYXBtX3dpZGdldF9wb3dlcih3LCBwb3dlcik7Ci0KLQkJCWlmIChwb3dlcikKLQkJCQlkYXBtX3NlcV9pbnNlcnQodywgJnVwX2xpc3QsIHRydWUpOwotCQkJZWxzZQotCQkJCWRhcG1fc2VxX2luc2VydCh3LCAmZG93bl9saXN0LCBmYWxzZSk7Ci0KLQkJCXctPnBvd2VyID0gcG93ZXI7Ci0JCQlicmVhazsKIAkJfQorCiAJfQogCiAJLyogSWYgdGhlcmUgYXJlIG5vIERBUE0gd2lkZ2V0cyB0aGVuIHRyeSB0byBmaWd1cmUgb3V0IHBvd2VyIGZyb20gdGhlCkBAIC0xMjg2LDE0ICsxNDI5LDE4IEBACiAJCX0KIAl9CiAKLQkvKiBGb3JjZSBhbGwgY29udGV4dHMgaW4gdGhlIGNhcmQgdG8gdGhlIHNhbWUgYmlhcyBzdGF0ZSAqLworCS8qIEZvcmNlIGFsbCBjb250ZXh0cyBpbiB0aGUgY2FyZCB0byB0aGUgc2FtZSBiaWFzIHN0YXRlIGlmCisJICogdGhleSdyZSBub3QgZ3JvdW5kIHJlZmVyZW5jZWQuCisJICovCiAJYmlhcyA9IFNORF9TT0NfQklBU19PRkY7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQogCQlpZiAoZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPiBiaWFzKQogCQkJYmlhcyA9IGQtPnRhcmdldF9iaWFzX2xldmVsOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkKLQkJZC0+dGFyZ2V0X2JpYXNfbGV2ZWwgPSBiaWFzOworCQlpZiAoIWQtPmlkbGVfYmlhc19vZmYpCisJCQlkLT50YXJnZXRfYmlhc19sZXZlbCA9IGJpYXM7CiAKKwl0cmFjZV9zbmRfc29jX2RhcG1fd2Fsa19kb25lKGNhcmQpOwogCiAJLyogUnVuIGFsbCB0aGUgYmlhcyBjaGFuZ2VzIGluIHBhcmFsbGVsICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZGFwbS0+Y2FyZC0+ZGFwbV9saXN0LCBsaXN0KQpAQCAtMTUyNCwxNCArMTY3MSwyMSBAQAogCiAJCWZvdW5kID0gMTsKIAkJLyogd2Ugbm93IG5lZWQgdG8gbWF0Y2ggdGhlIHN0cmluZyBpbiB0aGUgZW51bSB0byB0aGUgcGF0aCAqLwotCQlpZiAoIShzdHJjbXAocGF0aC0+bmFtZSwgZS0+dGV4dHNbbXV4XSkpKQorCQlpZiAoIShzdHJjbXAocGF0aC0+bmFtZSwgZS0+dGV4dHNbbXV4XSkpKSB7CiAJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KLQkJZWxzZQorCQkJZGFwbV9tYXJrX2RpcnR5KHBhdGgtPnNvdXJjZSwgIm11eCBjb25uZWN0aW9uIik7CisJCX0gZWxzZSB7CisJCQlpZiAocGF0aC0+Y29ubmVjdCkKKwkJCQlkYXBtX21hcmtfZGlydHkocGF0aC0+c291cmNlLAorCQkJCQkJIm11eCBkaXNjb25uZWN0aW9uIik7CiAJCQlwYXRoLT5jb25uZWN0ID0gMDsgLyogb2xkIGNvbm5lY3Rpb24gbXVzdCBiZSBwb3dlcmVkIGRvd24gKi8KKwkJfQogCX0KIAotCWlmIChmb3VuZCkKKwlpZiAoZm91bmQpIHsKKwkJZGFwbV9tYXJrX2RpcnR5KHdpZGdldCwgIm11eCBjaGFuZ2UiKTsKIAkJZGFwbV9wb3dlcl93aWRnZXRzKHdpZGdldC0+ZGFwbSwgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTU1NiwxMSArMTcxMCwxMyBAQAogCQkvKiBmb3VuZCwgbm93IGNoZWNrIHR5cGUgKi8KIAkJZm91bmQgPSAxOwogCQlwYXRoLT5jb25uZWN0ID0gY29ubmVjdDsKLQkJYnJlYWs7CisJCWRhcG1fbWFya19kaXJ0eShwYXRoLT5zb3VyY2UsICJtaXhlciBjb25uZWN0aW9uIik7CiAJfQogCi0JaWYgKGZvdW5kKQorCWlmIChmb3VuZCkgeworCQlkYXBtX21hcmtfZGlydHkod2lkZ2V0LCAibWl4ZXIgdXBkYXRlIik7CiAJCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmRhcG0sIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MDQsNiArMTg2MCw3IEBACiAJdy0+Y29ubmVjdGVkID0gc3RhdHVzOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJdy0+Zm9yY2UgPSAwOworCWRhcG1fbWFya19kaXJ0eSh3LCAicGluIGNvbmZpZ3VyYXRpb24iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcxOSw2ICsxODc2LDEzIEBACiAgKi8KIGludCBzbmRfc29jX2RhcG1fc3luYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CisJLyoKKwkgKiBTdXBwcmVzcyBlYXJseSByZXBvcnRzIChlZywgamFja3Mgc3luY2luZyB0aGVpciBzdGF0ZSkgdG8gYXZvaWQKKwkgKiBzaWxseSBEQVBNIHJ1bnMgZHVyaW5nIGNhcmQgc3RhcnR1cC4KKwkgKi8KKwlpZiAoIWRhcG0tPmNhcmQgfHwgIWRhcG0tPmNhcmQtPmluc3RhbnRpYXRlZCkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gZGFwbV9wb3dlcl93aWRnZXRzKGRhcG0sIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9zeW5jKTsKQEAgLTIwMDQsNDIgKzIxNjgsMTggQEAKIAkJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgogCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgotCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CiAJCQlkYXBtX25ld19taXhlcih3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OgogCQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKIAkJCWRhcG1fbmV3X211eCh3KTsKIAkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fYWRjX2NoZWNrX3Bvd2VyOwotCQkJYnJlYWs7Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKLQkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgotCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2RhY19jaGVja19wb3dlcjsKLQkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CiAJCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKIAkJCWRhcG1fbmV3X3BnYSh3KTsKIAkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKLQkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgotCQljYXNlIHNuZF9zb2NfZGFwbV9taWNiaWFzOgotCQljYXNlIHNuZF9zb2NfZGFwbV9zcGs6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2hwOgotCQljYXNlIHNuZF9zb2NfZGFwbV9taWM6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKLQkJCWJyZWFrOwotCQljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6Ci0JCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fc3VwcGx5X2NoZWNrX3Bvd2VyOwotCQljYXNlIHNuZF9zb2NfZGFwbV92bWlkOgotCQljYXNlIHNuZF9zb2NfZGFwbV9wcmU6Ci0JCWNhc2Ugc25kX3NvY19kYXBtX3Bvc3Q6CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCkBAIC0yMDU2LDYgKzIxOTYsNyBAQAogCiAJCXctPm5ldyA9IDE7CiAKKwkJZGFwbV9tYXJrX2RpcnR5KHcsICJuZXcgd2lkZ2V0Iik7CiAJCWRhcG1fZGVidWdmc19hZGRfd2lkZ2V0KHcpOwogCX0KIApAQCAtMjUzMCw2ICsyNjcxLDQ0IEBACiAJZWxzZQogCQlzbnByaW50Zih3LT5uYW1lLCBuYW1lX2xlbiwgIiVzIiwgd2lkZ2V0LT5uYW1lKTsKIAorCXN3aXRjaCAody0+aWQpIHsKKwljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CisJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CisJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcjsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKKwkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKKwljYXNlIHNuZF9zb2NfZGFwbV9haWZfb3V0OgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fYWRjX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9kYWM6CisJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgorCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZGFjX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCWNhc2Ugc25kX3NvY19kYXBtX2xpbmU6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9zdXBwbHlfY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9hbHdheXNfb25fY2hlY2tfcG93ZXI7CisJCWJyZWFrOworCX0KKwogCWRhcG0tPm5fd2lkZ2V0cysrOwogCXctPmRhcG0gPSBkYXBtOwogCXctPmNvZGVjID0gZGFwbS0+Y29kZWM7CkBAIC0yNTM3LDYgKzI3MTYsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZ3LT5zb3VyY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmdy0+c2lua3MpOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmdy0+ZGlydHkpOwogCWxpc3RfYWRkKCZ3LT5saXN0LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cyk7CiAKIAkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLwpAQCAtMjU4NCw5ICsyNzY0LDEwIEBACiAJewogCQlpZiAoIXctPnNuYW1lIHx8IHctPmRhcG0gIT0gZGFwbSkKIAkJCWNvbnRpbnVlOwotCQlkZXZfZGJnKHctPmRhcG0tPmRldiwgIndpZGdldCAlc1xuICVzIHN0cmVhbSAlcyBldmVudCAlZFxuIiwKKwkJZGV2X3ZkYmcody0+ZGFwbS0+ZGV2LCAid2lkZ2V0ICVzXG4gJXMgc3RyZWFtICVzIGV2ZW50ICVkXG4iLAogCQkJdy0+bmFtZSwgdy0+c25hbWUsIHN0cmVhbSwgZXZlbnQpOwogCQlpZiAoc3Ryc3RyKHctPnNuYW1lLCBzdHJlYW0pKSB7CisJCQlkYXBtX21hcmtfZGlydHkodywgInN0cmVhbSBldmVudCIpOwogCQkJc3dpdGNoKGV2ZW50KSB7CiAJCQljYXNlIFNORF9TT0NfREFQTV9TVFJFQU1fU1RBUlQ6CiAJCQkJdy0+YWN0aXZlID0gMTsKQEAgLTI2MDQsNiArMjc4NSwxMCBAQAogCX0KIAogCWRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLCBldmVudCk7CisKKwkvKiBkbyB3ZSBuZWVkIHRvIG5vdGlmeSBhbnkgY2xpZW50cyB0aGF0IERBUE0gc3RyZWFtIGlzIGNvbXBsZXRlICovCisJaWYgKGRhcG0tPnN0cmVhbV9ldmVudCkKKwkJZGFwbS0+c3RyZWFtX2V2ZW50KGRhcG0sIGV2ZW50KTsKIH0KIAogLyoqCkBAIC0yNjcyLDYgKzI4NTcsNyBAQAogCWRldl9kYmcody0+ZGFwbS0+ZGV2LCAiZGFwbTogZm9yY2UgZW5hYmxlIHBpbiAlc1xuIiwgcGluKTsKIAl3LT5jb25uZWN0ZWQgPSAxOwogCXctPmZvcmNlID0gMTsKKwlkYXBtX21hcmtfZGlydHkodywgImZvcmNlIGVuYWJsZSIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWlvLmMgYi9zb3VuZC9zb2Mvc29jLWlvLmMKaW5kZXggYTYyZjdkZC4uYzg2MTBjYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1pby5jCisrKyBiL3NvdW5kL3NvYy9zb2MtaW8uYwpAQCAtMTMsMjYgKzEzLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCi0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLXN0YXRpYyBpbnQgZG9fc3BpX3dyaXRlKHZvaWQgKmNvbnRyb2wsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRyb2w7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV93cml0ZShzcGksIGRhdGEsIGxlbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbGVuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZG9faHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkgICAgICAgdW5zaWduZWQgaW50IHZhbHVlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQorI2lmZGVmIENPTkZJR19SRUdNQVAKK3N0YXRpYyBpbnQgaHdfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewogCWludCByZXQ7CiAKQEAgLTQ5LDEzICszOCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCBsZW4pOwotCWlmIChyZXQgPT0gbGVuKQotCQlyZXR1cm4gMDsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiAtRUlPOworCXJldHVybiByZWdtYXBfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaHdfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpCkBAIC02OSw4ICs1MiwxMSBAQAogCQlpZiAoY29kZWMtPmNhY2hlX29ubHkpCiAJCQlyZXR1cm4gLTE7CiAKLQkJQlVHX09OKCFjb2RlYy0+aHdfcmVhZCk7Ci0JCXJldHVybiBjb2RlYy0+aHdfcmVhZChjb2RlYywgcmVnKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoY29kZWMtPmNvbnRyb2xfZGF0YSwgcmVnLCAmdmFsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOwogCX0KIAogCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKQEAgLTc5LDIwMiArNjUsMTggQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW50IHNuZF9zb2NfNF8xMl93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gY3B1X3RvX2JlMTYoKHJlZyA8PCAxMikgfCAodmFsdWUgJiAweGZmZmZmZikpOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCAmZGF0YSwgMik7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3NvY183Xzlfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gY3B1X3RvX2JlMTYoKHJlZyA8PCA5KSB8ICh2YWx1ZSAmIDB4MWZmKSk7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsICZkYXRhLCAyKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzhfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1OCBkYXRhWzJdOwotCi0JcmVnICY9IDB4ZmY7Ci0JZGF0YVswXSA9IHJlZzsKLQlkYXRhWzFdID0gdmFsdWUgJiAweGZmOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAyKTsKLX0KLQotc3RhdGljIGludCBzbmRfc29jXzhfMTZfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAotCQkJICAgICAgdW5zaWduZWQgaW50IHZhbHVlKQotewotCXU4IGRhdGFbM107Ci0JdTE2IHZhbCA9IGNwdV90b19iZTE2KHZhbHVlKTsKLQotCWRhdGFbMF0gPSByZWc7Ci0JbWVtY3B5KCZkYXRhWzFdLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0KLQlyZXR1cm4gZG9faHdfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUsIGRhdGEsIDMpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBkb19pMmNfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJdm9pZCAqcmVnLCBpbnQgcmVnbGVuLAotCQkJCXZvaWQgKmRhdGEsIGludCBkYXRhbGVuKQotewotCXN0cnVjdCBpMmNfbXNnIHhmZXJbMl07Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKLQotCS8qIFdyaXRlIHJlZ2lzdGVyICovCi0JeGZlclswXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCXhmZXJbMF0uZmxhZ3MgPSAwOwotCXhmZXJbMF0ubGVuID0gcmVnbGVuOwotCXhmZXJbMF0uYnVmID0gcmVnOwotCi0JLyogUmVhZCBkYXRhICovCi0JeGZlclsxXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQl4ZmVyWzFdLmxlbiA9IGRhdGFsZW47Ci0JeGZlclsxXS5idWYgPSBkYXRhOwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgeGZlciwgMik7Ci0JaWYgKHJldCA9PSAyKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIC1FSU87Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY184XzhfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgdW5zaWduZWQgaW50IHIpCi17Ci0JdTggcmVnID0gcjsKLQl1OCBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBkb19pMmNfcmVhZChjb2RlYywgJnJlZywgMSwgJmRhdGEsIDEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGF0YTsKLX0KLSNlbHNlCi0jZGVmaW5lIHNuZF9zb2NfOF84X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzhfMTZfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIHVuc2lnbmVkIGludCByKQotewotCXU4IHJlZyA9IHI7Ci0JdTE2IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IGRvX2kyY19yZWFkKGNvZGVjLCAmcmVnLCAxLCAmZGF0YSwgMik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAoZGF0YSA+PiA4KSB8ICgoZGF0YSAmIDB4ZmYpIDw8IDgpOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY184XzE2X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCAoZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzE2XzhfcmVhZF9pMmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIHVuc2lnbmVkIGludCByKQotewotCXUxNiByZWcgPSByOwotCXU4IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IGRvX2kyY19yZWFkKGNvZGVjLCAmcmVnLCAyLCAmZGF0YSwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiBkYXRhOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl84X3JlYWRfaTJjIE5VTEwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl84X3JlYWRfc3BpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcikKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKLQotCWNvbnN0IHUxNiByZWcgPSBjcHVfdG9fYmUxNihyIHwgMHgxMDApOwotCXU4IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmcmVnLCAyLCAmZGF0YSwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiBkYXRhOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl84X3JlYWRfc3BpIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IHNuZF9zb2NfMTZfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggZGF0YVszXTsKLQl1MTYgcnZhbCA9IGNwdV90b19iZTE2KHJlZyk7Ci0KLQltZW1jcHkoZGF0YSwgJnJ2YWwsIHNpemVvZihydmFsKSk7Ci0JZGF0YVsyXSA9IHZhbHVlOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCAzKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY18xNl8xNl9yZWFkX2kyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCByKQotewotCXUxNiByZWcgPSBjcHVfdG9fYmUxNihyKTsKLQl1MTYgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG9faTJjX3JlYWQoY29kZWMsICZyZWcsIDIsICZkYXRhLCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1KGRhdGEpOwotfQotI2Vsc2UKLSNkZWZpbmUgc25kX3NvY18xNl8xNl9yZWFkX2kyYyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBzbmRfc29jXzE2XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTE2IGRhdGFbMl07Ci0KLQlkYXRhWzBdID0gY3B1X3RvX2JlMTYocmVnKTsKLQlkYXRhWzFdID0gY3B1X3RvX2JlMTYodmFsdWUpOwotCi0JcmV0dXJuIGRvX2h3X3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotfQotCiAvKiBQcmltaXRpdmUgYnVsayB3cml0ZSBzdXBwb3J0IGZvciBzb2MtY2FjaGUuICBUaGUgZGF0YSBwb2ludGVkIHRvIGJ5Ci0gKiBgZGF0YScgbmVlZHMgdG8gYWxyZWFkeSBiZSBpbiB0aGUgZm9ybSB0aGUgaGFyZHdhcmUgZXhwZWN0cwotICogaW5jbHVkaW5nIGFueSBsZWFkaW5nIHJlZ2lzdGVyIHNwZWNpZmljIGRhdGEuICBBbnkgZGF0YSB3cml0dGVuCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZ28gdGhyb3VnaCB0aGUgY2FjaGUgYXMgaXQgb25seQotICogaGFuZGxlcyB3cml0aW5nIHRvIHZvbGF0aWxlIG9yIG91dCBvZiBib3VuZHMgcmVnaXN0ZXJzLgorICogYGRhdGEnIG5lZWRzIHRvIGFscmVhZHkgYmUgaW4gdGhlIGZvcm0gdGhlIGhhcmR3YXJlIGV4cGVjdHMuICBBbnkKKyAqIGRhdGEgd3JpdHRlbiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZ28gdGhyb3VnaCB0aGUgY2FjaGUgYXMKKyAqIGl0IG9ubHkgaGFuZGxlcyB3cml0aW5nIHRvIHZvbGF0aWxlIG9yIG91dCBvZiBib3VuZHMgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2VzIHVzaW5nIHRoZSByZWdtYXAgQVBJCisgKiB3cmFwcGVycy4KICAqLwotc3RhdGljIGludCBzbmRfc29jX2h3X2J1bGtfd3JpdGVfcmF3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKK3N0YXRpYyBpbnQgc25kX3NvY19od19idWxrX3dyaXRlX3JhdyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLAogCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKIHsKLQlpbnQgcmV0OwotCiAJLyogVG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IG91dCBvZiBzeW5jIHdpdGggdGhlIGNhY2hlLCBjaGVjawogCSAqIHdoZXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgdm9sYXRpbGUgb3IgaWYgd2UndmUgZGlyZWN0bHkgYXNrZWQKIAkgKiB0byBieXBhc3MgdGhlIGNhY2hlLiAgT3V0IG9mIGJvdW5kcyByZWdpc3RlcnMgYXJlIGNvbnNpZGVyZWQKQEAgLTI4NSw2OCArODcsOSBAQAogCSAgICAmJiByZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGNvZGVjLT5jb250cm9sX3R5cGUpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IChkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi0JY2FzZSBTTkRfU09DX0kyQzoKLQkJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHRvX2kyY19jbGllbnQoY29kZWMtPmRldiksIGRhdGEsIGxlbik7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQljYXNlIFNORF9TT0NfU1BJOgotCQlyZXQgPSBzcGlfd3JpdGUodG9fc3BpX2RldmljZShjb2RlYy0+ZGV2KSwgZGF0YSwgbGVuKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlpZiAocmV0ID09IGxlbikKLQkJcmV0dXJuIDA7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcmVnbWFwX3Jhd193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsIGRhdGEsIGxlbik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgewotCWludCBhZGRyX2JpdHM7Ci0JaW50IGRhdGFfYml0czsKLQlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0JdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLQl1bnNpZ25lZCBpbnQgKCppMmNfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLQl1bnNpZ25lZCBpbnQgKCpzcGlfcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKLX0gaW9fdHlwZXNbXSA9IHsKLQl7Ci0JCS5hZGRyX2JpdHMgPSA0LCAuZGF0YV9iaXRzID0gMTIsCi0JCS53cml0ZSA9IHNuZF9zb2NfNF8xMl93cml0ZSwKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDcsIC5kYXRhX2JpdHMgPSA5LAotCQkud3JpdGUgPSBzbmRfc29jXzdfOV93cml0ZSwKLQl9LAotCXsKLQkJLmFkZHJfYml0cyA9IDgsIC5kYXRhX2JpdHMgPSA4LAotCQkud3JpdGUgPSBzbmRfc29jXzhfOF93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY184XzhfcmVhZF9pMmMsCi0JfSwKLQl7Ci0JCS5hZGRyX2JpdHMgPSA4LCAuZGF0YV9iaXRzID0gMTYsCi0JCS53cml0ZSA9IHNuZF9zb2NfOF8xNl93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY184XzE2X3JlYWRfaTJjLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gMTYsIC5kYXRhX2JpdHMgPSA4LAotCQkud3JpdGUgPSBzbmRfc29jXzE2Xzhfd3JpdGUsCi0JCS5pMmNfcmVhZCA9IHNuZF9zb2NfMTZfOF9yZWFkX2kyYywKLQkJLnNwaV9yZWFkID0gc25kX3NvY18xNl84X3JlYWRfc3BpLAotCX0sCi0JewotCQkuYWRkcl9iaXRzID0gMTYsIC5kYXRhX2JpdHMgPSAxNiwKLQkJLndyaXRlID0gc25kX3NvY18xNl8xNl93cml0ZSwKLQkJLmkyY19yZWFkID0gc25kX3NvY18xNl8xNl9yZWFkX2kyYywKLQl9LAotfTsKLQogLyoqCiAgKiBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbzogU2V0IHVwIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMuCiAgKgpAQCAtMzcwLDUwICsxMTMsNTEgQEAKIAkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAogCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjb25maWc7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb190eXBlcyk7IGkrKykKLQkJaWYgKGlvX3R5cGVzW2ldLmFkZHJfYml0cyA9PSBhZGRyX2JpdHMgJiYKLQkJICAgIGlvX3R5cGVzW2ldLmRhdGFfYml0cyA9PSBkYXRhX2JpdHMpCi0JCQlicmVhazsKLQlpZiAoaSA9PSBBUlJBWV9TSVpFKGlvX3R5cGVzKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJObyBJL08gZnVuY3Rpb25zIGZvciAlZCBiaXQgYWRkcmVzcyAlZCBiaXQgZGF0YVxuIiwKLQkJICAgICAgIGFkZHJfYml0cywgZGF0YV9iaXRzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY29kZWMtPndyaXRlID0gaW9fdHlwZXNbaV0ud3JpdGU7CisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb2RlYy0+d3JpdGUgPSBod193cml0ZTsKIAljb2RlYy0+cmVhZCA9IGh3X3JlYWQ7CiAJY29kZWMtPmJ1bGtfd3JpdGVfcmF3ID0gc25kX3NvY19od19idWxrX3dyaXRlX3JhdzsKIAorCWNvbmZpZy5yZWdfYml0cyA9IGFkZHJfYml0czsKKwljb25maWcudmFsX2JpdHMgPSBkYXRhX2JpdHM7CisKIAlzd2l0Y2ggKGNvbnRyb2wpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19SRUdNQVBfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19SRUdNQVBfSTJDX01PRFVMRSkKIAljYXNlIFNORF9TT0NfSTJDOgotI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgKGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKLQkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOwotI2VuZGlmCi0JCWlmIChpb190eXBlc1tpXS5pMmNfcmVhZCkKLQkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uaTJjX3JlYWQ7Ci0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IGkyY19jbGllbnQsCi0JCQkJCQkgICBkZXYpOworCQljb2RlYy0+Y29udHJvbF9kYXRhID0gcmVnbWFwX2luaXRfaTJjKHRvX2kyY19jbGllbnQoY29kZWMtPmRldiksCisJCQkJCQkgICAgICAmY29uZmlnKTsKIAkJYnJlYWs7CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1JFR01BUF9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1JFR01BUF9TUElfTU9EVUxFKQogCWNhc2UgU05EX1NPQ19TUEk6Ci0jaWZkZWYgQ09ORklHX1NQSV9NQVNURVIKLQkJY29kZWMtPmh3X3dyaXRlID0gZG9fc3BpX3dyaXRlOwotI2VuZGlmCi0JCWlmIChpb190eXBlc1tpXS5zcGlfcmVhZCkKLQkJCWNvZGVjLT5od19yZWFkID0gaW9fdHlwZXNbaV0uc3BpX3JlYWQ7Ci0KLQkJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGNvbnRhaW5lcl9vZihjb2RlYy0+ZGV2LAotCQkJCQkJICAgc3RydWN0IHNwaV9kZXZpY2UsCi0JCQkJCQkgICBkZXYpOworCQljb2RlYy0+Y29udHJvbF9kYXRhID0gcmVnbWFwX2luaXRfc3BpKHRvX3NwaV9kZXZpY2UoY29kZWMtPmRldiksCisJCQkJCQkgICAgICAmY29uZmlnKTsKIAkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgU05EX1NPQ19SRUdNQVA6CisJCS8qIERldmljZSBoYXMgbWFkZSBpdHMgb3duIHJlZ21hcCBhcnJhbmdlbWVudHMgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoSVNfRVJSKGNvZGVjLT5jb250cm9sX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihjb2RlYy0+Y29udHJvbF9kYXRhKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8pOwotCisjZWxzZQoraW50IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBpbnQgYWRkcl9iaXRzLCBpbnQgZGF0YV9iaXRzLAorCQkJICAgICAgIGVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbCkKK3sKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8pOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWphY2suYyBiL3NvdW5kL3NvYy9zb2MtamFjay5jCmluZGV4IGZhMzFkOWMuLjZjNWViZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtamFjay5jCisrKyBiL3NvdW5kL3NvYy9zb2MtamFjay5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCiAvKioKQEAgLTE4OCw2ICsxODksOCBAQAogCQlsaXN0X2FkZCgmKHBpbnNbaV0ubGlzdCksICZqYWNrLT5waW5zKTsKIAl9CiAKKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmphY2stPmNvZGVjLT5jYXJkLT5kYXBtKTsKKwogCS8qIFVwZGF0ZSB0byByZWZsZWN0IHRoZSBsYXN0IHJlcG9ydGVkIHN0YXR1czsgY2FubmVkIGphY2sKIAkgKiBpbXBsZW1lbnRhdGlvbnMgYXJlIGxpa2VseSB0byBzZXQgdGhlaXIgc3RhdGUgYmVmb3JlIHRoZQogCSAqIGNhcmQgaGFzIGFuIG9wcG9ydHVuaXR5IHRvIGFzc29jaWF0ZSBwaW5zLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKaW5kZXggMjg3OWM4OC4uZWUxNTMzNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0yNywxNyArMjcsMTMgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKLXN0YXRpYyBERUZJTkVfTVVURVgocGNtX211dGV4KTsKLQotc3RhdGljIGludCBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKnNvY19kYWkpCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCWludCByZXQ7CiAKLQlpZiAoIWNvZGVjX2RhaS0+ZHJpdmVyLT5zeW1tZXRyaWNfcmF0ZXMgJiYKLQkgICAgIWNwdV9kYWktPmRyaXZlci0+c3ltbWV0cmljX3JhdGVzICYmCisJaWYgKCFzb2NfZGFpLT5kcml2ZXItPnN5bW1ldHJpY19yYXRlcyAmJgogCSAgICAhcnRkLT5kYWlfbGluay0+c3ltbWV0cmljX3JhdGVzKQogCQlyZXR1cm4gMDsKIApAQCAtNDUsMTkgKzQxLDE5IEBACiAJICogdGhlIHNlY29uZCBjYW4gbmVlZCB0byBnZXQgaXRzIGNvbnN0cmFpbnRzIGJlZm9yZSB0aGUgZmlyc3QgaGFzCiAJICogcGlja2VkIGEgcmF0ZS4gIENvbXBsYWluIGFuZCBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gY2Fycnkgb24uCiAJICovCi0JaWYgKCFydGQtPnJhdGUpIHsKLQkJZGV2X3dhcm4oJnJ0ZC0+ZGV2LAorCWlmICghc29jX2RhaS0+cmF0ZSkgeworCQlkZXZfd2Fybihzb2NfZGFpLT5kZXYsCiAJCQkgIk5vdCBlbmZvcmNpbmcgc3ltbWV0cmljX3JhdGVzIGR1ZSB0byByYWNlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZygmcnRkLT5kZXYsICJTeW1tZXRyeSBmb3JjZXMgJWRIeiByYXRlXG4iLCBydGQtPnJhdGUpOworCWRldl9kYmcoc29jX2RhaS0+ZGV2LCAiU3ltbWV0cnkgZm9yY2VzICVkSHogcmF0ZVxuIiwgc29jX2RhaS0+cmF0ZSk7CiAKIAlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKIAkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJCSAgIHJ0ZC0+cmF0ZSwgcnRkLT5yYXRlKTsKKwkJCQkJICAgc29jX2RhaS0+cmF0ZSwgc29jX2RhaS0+cmF0ZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcnRkLT5kZXYsCisJCWRldl9lcnIoc29jX2RhaS0+ZGV2LAogCQkJIlVuYWJsZSB0byBhcHBseSByYXRlIHN5bW1ldHJ5IGNvbnN0cmFpbnQ6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE4Nyw4ICsxODMsMTQgQEAKIAl9CiAKIAkvKiBTeW1tZXRyeSBvbmx5IGFwcGxpZXMgaWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYWN0aXZlIHN0cmVhbS4gKi8KLQlpZiAoY3B1X2RhaS0+YWN0aXZlIHx8IGNvZGVjX2RhaS0+YWN0aXZlKSB7Ci0JCXJldCA9IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3Vic3RyZWFtKTsKKwlpZiAoY3B1X2RhaS0+YWN0aXZlKSB7CisJCXJldCA9IHNvY19wY21fYXBwbHlfc3ltbWV0cnkoc3Vic3RyZWFtLCBjcHVfZGFpKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBjb25maWdfZXJyOworCX0KKworCWlmIChjb2RlY19kYWktPmFjdGl2ZSkgeworCQlyZXQgPSBzb2NfcGNtX2FwcGx5X3N5bW1ldHJ5KHN1YnN0cmVhbSwgY29kZWNfZGFpKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBjb25maWdfZXJyOwogCX0KQEAgLTI5MCw4ICsyOTIsMTIgQEAKIAljb2RlY19kYWktPmFjdGl2ZS0tOwogCWNvZGVjLT5hY3RpdmUtLTsKIAotCWlmICghY3B1X2RhaS0+YWN0aXZlICYmICFjb2RlY19kYWktPmFjdGl2ZSkKLQkJcnRkLT5yYXRlID0gMDsKKwkvKiBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBEQUlzIHJhdGUgd2hlbiBpbmFjdGl2ZSAqLworCWlmICghY3B1X2RhaS0+YWN0aXZlKQorCQljcHVfZGFpLT5yYXRlID0gMDsKKworCWlmICghY29kZWNfZGFpLT5hY3RpdmUpCisJCWNvZGVjX2RhaS0+cmF0ZSA9IDA7CiAKIAkvKiBNdXRpbmcgdGhlIERBQyBzdXBwcmVzc2VzIGFydGlmYWN0cyBjYXVzZWQgZHVyaW5nIGRpZ2l0YWwKIAkgKiBzaHV0ZG93biwgZm9yIGV4YW1wbGUgZnJvbSBzdG9wcGluZyBjbG9ja3MuCkBAIC0zMTMsMTAgKzMxOSwxNyBAQAogCWNwdV9kYWktPnJ1bnRpbWUgPSBOVUxMOwogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJLyogc3RhcnQgZGVsYXllZCBwb3Agd3EgaGVyZSBmb3IgcGxheWJhY2sgc3RyZWFtcyAqLwotCQljb2RlY19kYWktPnBvcF93YWl0ID0gMTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMocnRkLT5wbWRvd25fdGltZSkpOworCQlpZiAodW5saWtlbHkoY29kZWMtPmlnbm9yZV9wbWRvd25fdGltZSkpIHsKKwkJCS8qIHBvd2VyZWQgZG93biBwbGF5YmFjayBzdHJlYW0gbm93ICovCisJCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKKwkJCQljb2RlY19kYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUsCisJCQkJU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHN0YXJ0IGRlbGF5ZWQgcG9wIHdxIGhlcmUgZm9yIHBsYXliYWNrIHN0cmVhbXMgKi8KKwkJCWNvZGVjX2RhaS0+cG9wX3dhaXQgPSAxOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZydGQtPmRlbGF5ZWRfd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKHJ0ZC0+cG1kb3duX3RpbWUpKTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIGNhcHR1cmUgc3RyZWFtcyBjYW4gYmUgcG93ZXJlZCBkb3duIG5vdyAqLwogCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHJ0ZCwKQEAgLTQ0OSw3ICs0NjIsOSBAQAogCQl9CiAJfQogCi0JcnRkLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwkvKiBzdG9yZSB0aGUgcmF0ZSBmb3IgZWFjaCBEQUlzICovCisJY3B1X2RhaS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJY29kZWNfZGFpLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAogb3V0OgogCW11dGV4X3VubG9jaygmcnRkLT5wY21fbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy11dGlscy5jIGIvc291bmQvc29jL3NvYy11dGlscy5jCmluZGV4IGVjOTIxZWMuLjBjMTJiOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtdXRpbHMuYworKysgYi9zb3VuZC9zb2Mvc29jLXV0aWxzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfYXNvY191dGlscy5jCmluZGV4IGRmYTg1Y2IuLmY4NDI4ZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2Fzb2NfdXRpbHMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAidGVncmFfYXNvY191dGlscy5oIgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfZGFzLmMgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfZGFzLmMKaW5kZXggOWYyNGVmNy4uM2I1NWE0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2Rhcy5jCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9kYXMuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiBlcnJfZnJlZToKIAlrZnJlZShkYXMpOwotCWRhcyA9IDA7CisJZGFzID0gTlVMTDsKIGV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzNCw3ICsyMzQsNyBAQAogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCiAJa2ZyZWUoZGFzKTsKLQlkYXMgPSAwOworCWRhcyA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9pMnMuYwppbmRleCBmMzZiOTk2Li42NzI4ZmFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfaTJzLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2kycy5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkudHJpZ2dlcgk9IHRlZ3JhX2kyc190cmlnZ2VyLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0ZWdyYV9pMnNfZGFpW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0ZWdyYV9pMnNfZGFpW10gPSB7CiAJewogCQkubmFtZSA9IERSVl9OQU1FICIuMCIsCiAJCS5wcm9iZSA9IHRlZ3JhX2kyc19wcm9iZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9wY20uYwppbmRleCBjN2NmZDk2Li40MzZkZWYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcGNtLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3BjbS5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAl0ZWdyYV9wY21fZGVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiB9CiAKLXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciB0ZWdyYV9wY21fcGxhdGZvcm0gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3BjbV9wbGF0Zm9ybSA9IHsKIAkub3BzCQk9ICZ0ZWdyYV9wY21fb3BzLAogCS5wY21fbmV3CT0gdGVncmFfcGNtX25ldywKIAkucGNtX2ZyZWUJPSB0ZWdyYV9wY21fZnJlZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zcGRpZi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKaW5kZXggYWJlNjA2Yi4uZGQxMWQwYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NwZGlmLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7CiAJc3RydWN0IHRlZ3JhX3NwZGlmICpzcGRpZiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JaW50IHJldCwgc3JhdGUsIHNwZGlmY2xvY2s7CisJaW50IHJldCwgc3BkaWZjbG9jazsKIAogCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9QQUNLOwogCXNwZGlmLT5yZWdfY3RybCAmPSB+VEVHUkFfU1BESUZfQ1RSTF9CSVRfTU9ERV9NQVNLOwpAQCAtMTQwLDcgKzE0MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIAlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKIAljYXNlIDMyMDAwOgogCQlzcGRpZmNsb2NrID0gNDA5NjAwMDsKQEAgLTIzMiw3ICsyMzEsNyBAQAogCS50cmlnZ2VyCT0gdGVncmFfc3BkaWZfdHJpZ2dlciwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGVncmFfc3BkaWZfZGFpID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGVncmFfc3BkaWZfZGFpID0gewogCS5uYW1lID0gRFJWX05BTUUsCiAJLnByb2JlID0gdGVncmFfc3BkaWZfcHJvYmUsCiAJLnBsYXliYWNrID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jCmluZGV4IGJlMjdmMWQuLmE4MWNmMzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTg5MDMuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfd204OTAzLmMKQEAgLTMzOSw4ICszMzksNiBAQAogCQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUTCIpOwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90cmltc2xpY2UuYyBiL3NvdW5kL3NvYy90ZWdyYS90cmltc2xpY2UuYwppbmRleCA4ZmMwN2U5Li5iM2E3ZWZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdHJpbXNsaWNlLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RyaW1zbGljZS5jCkBAIC0xMjQsOCArMTI0LDYgQEAKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSSFBPVVQiKTsKIAlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUNJTiIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtYWM5Ny5jIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtYWM5Ny5jCmluZGV4IDc0M2QwN2IuLmE0ZTNmNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLWFjOTcuYworKysgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy1hYzk3LmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICghZHJ2ZGF0YS0+YmFzZSkKIAkJcmV0dXJuIC1FQlVTWTsKIAllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgdHh4OWFjbGNfYWM5N19pcnEsCi0JCQkgICAgICAgSVJRRl9ESVNBQkxFRCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGRydmRhdGEpOworCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBkcnZkYXRhKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtZ2VuZXJpYy5jIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMtZ2VuZXJpYy5jCmluZGV4IDY3NzBlNzEuLjliNWUyODMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLWdlbmVyaWMuYworKysgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy1nZW5lcmljLmMKQEAgLTYyLDcgKzYyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHh4OWFjbGNfZ2VuZXJpY19kcml2ZXIgPSB7Ci0JLnJlbW92ZSA9IHR4eDlhY2xjX2dlbmVyaWNfcmVtb3ZlLAorCS5yZW1vdmUgPSBfX2V4aXRfcCh0eHg5YWNsY19nZW5lcmljX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAidHh4OWFjbGMtZ2VuZXJpYyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IGFkN2Q0ZDcuLmYwMzY3NzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTk2Miw3ICs5NjIsNyBAQAogCWFtZDc5MzBfaWRsZShhbWQpOwogCiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX2FtZDc5MzBfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELCAiYW1kNzkzMCIsIGFtZCkpIHsKKwkJCUlSUUZfU0hBUkVELCAiYW1kNzkzMCIsIGFtZCkpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiYW1kNzkzMC0lZDogVW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLAogCQkJICAgZGV2LCBpcnEpOwogCQlzbmRfYW1kNzkzMF9mcmVlKGFtZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9kYnJpLmMgYi9zb3VuZC9zcGFyYy9kYnJpLmMKaW5kZXggMWI4MzlhMC4uNGE0ZjFkNyAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvZGJyaS5jCisrKyBiL3NvdW5kL3NwYXJjL2RicmkuYwpAQCAtNzAsNiArNzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlJ1ZG9sZiBLb2VuaWcsIEJyZW50IEJhY2NhbGEgYW5kIE1hcnRpbiBIYWJldHMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3VuIERCUkkiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKaW5kZXggZjE2YTNmYy4uOTM1MjIwNyAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvZW11eF9zeW50aC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICJlbXV4X3ZvaWNlLmgiCiAKIE1PRFVMRV9BVVRIT1IoIlRha2FzaGkgSXdhaSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X29zcy5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X29zcy5jCmluZGV4IDg3ZTQyMjAuLjMxOTc1NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9vc3MuYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfb3NzLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2lmZGVmIENPTkZJR19TTkRfU0VRVUVOQ0VSX09TUwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiZW11eF92b2ljZS5oIgpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jCmluZGV4IGNhNWY3ZWYuLjc3NzhiOGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc2VxLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgImVtdXhfdm9pY2UuaCIKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgZnJlZV9wb3J0KHZvaWQgKnByaXZhdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYwppbmRleCAzZTkyMWIzLi45YTM4ZGU0IDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYworKysgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc3ludGguYwpAQCAtMjIsNiArMjIsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSAiZW11eF92b2ljZS5oIgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMgYi9zb3VuZC9zeW50aC9lbXV4L3NvdW5kZm9udC5jCmluZGV4IDY3YzkxMjMuLjExMzdiODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9zb3VuZGZvbnQuYwpAQCAtMjcsNiArMjcsNyBAQAogICovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvdW5kZm9udC5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9vc3NfbGVnYWN5Lmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zeW50aC91dGlsX21lbS5jIGIvc291bmQvc3ludGgvdXRpbF9tZW0uYwppbmRleCBjODU1MjJlLi44ZTM0YmM0IDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC91dGlsX21lbS5jCisrKyBiL3NvdW5kL3N5bnRoL3V0aWxfbWVtLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3V0aWxfbWVtLmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi82ZmlyZS9maXJtd2FyZS5jIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKaW5kZXggMWUzYWUzMy4uM2I1ZjUxNyAxMDA2NDQKLS0tIGEvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKKysrIGIvc291bmQvdXNiLzZmaXJlL2Zpcm13YXJlLmMKQEAgLTE1LDcgKzE1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgImZpcm13YXJlLmgiCiAjaW5jbHVkZSAiY2hpcC5oIgpAQCAtNTksMjEgKzYxLDE5IEBACiAJdW5zaWduZWQgaW50IHR4dF9vZmZzZXQ7IC8qIGN1cnJlbnQgcG9zaXRpb24gaW4gdHh0X2RhdGEgKi8KIH07CiAKLXN0YXRpYyB1OCB1c2I2ZmlyZV9md19paGV4X25pYmJsZShjb25zdCB1OCBuKQotewotCWlmIChuID49ICcwJyAmJiBuIDw9ICc5JykKLQkJcmV0dXJuIG4gLSAnMCc7Ci0JZWxzZSBpZiAobiA+PSAnQScgJiYgbiA8PSAnRicpCi0JCXJldHVybiBuIC0gKCdBJyAtIDEwKTsKLQllbHNlIGlmIChuID49ICdhJyAmJiBuIDw9ICdmJykKLQkJcmV0dXJuIG4gLSAoJ2EnIC0gMTApOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdTggdXNiNmZpcmVfZndfaWhleF9oZXgoY29uc3QgdTggKmRhdGEsIHU4ICpjcmMpCiB7Ci0JdTggdmFsID0gKHVzYjZmaXJlX2Z3X2loZXhfbmliYmxlKGRhdGFbMF0pIDw8IDQpIHwKLQkJCXVzYjZmaXJlX2Z3X2loZXhfbmliYmxlKGRhdGFbMV0pOworCXU4IHZhbCA9IDA7CisJaW50IGh2YWw7CisKKwlodmFsID0gaGV4X3RvX2JpbihkYXRhWzBdKTsKKwlpZiAoaHZhbCA+PSAwKQorCQl2YWwgfD0gKGh2YWwgPDwgNCk7CisKKwlodmFsID0gaGV4X3RvX2JpbihkYXRhWzFdKTsKKwlpZiAoaHZhbCA+PSAwKQorCQl2YWwgfD0gaHZhbDsKKwogCSpjcmMgKz0gdmFsOwogCXJldHVybiB2YWw7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvS2NvbmZpZyBiL3NvdW5kL3VzYi9LY29uZmlnCmluZGV4IDhiZWI3NzUuLjNlZmMyMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9LY29uZmlnCisrKyBiL3NvdW5kL3VzYi9LY29uZmlnCkBAIC02Nyw2ICs2Nyw3IEBACiAJICAgICogTmF0aXZlIEluc3RydW1lbnRzIEd1aXRhciBSaWcgbW9iaWxlCiAJICAgICogTmF0aXZlIEluc3RydW1lbnRzIFRyYWt0b3IgS29udHJvbCBYMQogCSAgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBUcmFrdG9yIEtvbnRyb2wgUzQKKwkgICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgTWFzY2hpbmUgQ29udHJvbGxlcgogCiAJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgIHdpbGwgYmUgY2FsbGVkIHNuZC11c2ItY2FpYXEuCkBAIC04NSw2ICs4Niw3IEBACiAJICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgS29yZSBDb250cm9sbGVyIDIKIAkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBBdWRpbyBLb250cm9sIDEKIAkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBUcmFrdG9yIEtvbnRyb2wgUzQKKwkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBNYXNjaGluZSBDb250cm9sbGVyCiAKIGNvbmZpZyBTTkRfVVNCX1VTMTIyTAogCXRyaXN0YXRlICJUYXNjYW0gVVMtMTIyTCBVU0IgZHJpdmVyIgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL01ha2VmaWxlIGIvc291bmQvdXNiL01ha2VmaWxlCmluZGV4IGNmOWVkNjYuLmFjMjU2ZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9NYWtlZmlsZQorKysgYi9zb3VuZC91c2IvTWFrZWZpbGUKQEAgLTMsMTYgKzMsMTYgQEAKICMKIAogc25kLXVzYi1hdWRpby1vYmpzIDo9IAljYXJkLm8gXAorCQkJY2xvY2subyBcCisJCQllbmRwb2ludC5vIFwKKwkJCWZvcm1hdC5vIFwKKwkJCWhlbHBlci5vIFwKIAkJCW1peGVyLm8gXAogCQkJbWl4ZXJfcXVpcmtzLm8gXAorCQkJcGNtLm8gXAogCQkJcHJvYy5vIFwKIAkJCXF1aXJrcy5vIFwKLQkJCWZvcm1hdC5vIFwKLQkJCWVuZHBvaW50Lm8gXAotCQkJdXJiLm8gXAotCQkJcGNtLm8gXAotCQkJaGVscGVyLm8gXAotCQkJY2xvY2subworCQkJc3RyZWFtLm8KIAogc25kLXVzYm1pZGktbGliLW9ianMgOj0gbWlkaS5vCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYyBiL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuYwppbmRleCA0NWJjNGEyLi4zZWI2MDViIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5jCkBAIC01MCw3ICs1MCw4IEBACiAJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIFNlc3Npb24gSS9PfSwiCiAJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIEd1aXRhclJpZyBtb2JpbGV9IgogCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBUcmFrdG9yIEtvbnRyb2wgWDF9IgotCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBUcmFrdG9yIEtvbnRyb2wgUzR9Iik7CisJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIFRyYWt0b3IgS29udHJvbCBTNH0iCisJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIE1hc2NoaW5lIENvbnRyb2xsZXJ9Iik7CiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7IC8qIEluZGV4IDAtbWF4ICovCiBzdGF0aWMgY2hhciogaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7IC8qIElkIGZvciB0aGlzIGNhcmQgKi8KQEAgLTE0Niw2ICsxNDcsMTEgQEAKIAkJLmlkVmVuZG9yID0gICAgIFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsCiAJCS5pZFByb2R1Y3QgPSAgICBVU0JfUElEX1RSQUtUT1JBVURJTzIKIAl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzID0gIFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCQkuaWRWZW5kb3IgPSAgICAgVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywKKwkJLmlkUHJvZHVjdCA9ICAgIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSCisJfSwKIAl7IC8qIHRlcm1pbmF0b3IgKi8gfQogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhaWFxL2RldmljZS5oIGIvc291bmQvdXNiL2NhaWFxL2RldmljZS5oCmluZGV4IDNmOWM2MzMuLjU2MmIwYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9kZXZpY2UuaAorKysgYi9zb3VuZC91c2IvY2FpYXEvZGV2aWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9UUkFLVE9SS09OVFJPTFgxCTB4MjMwNQogI2RlZmluZSBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQJMHhiYWZmCiAjZGVmaW5lIFVTQl9QSURfVFJBS1RPUkFVRElPMgkJMHgwNDFkCisjZGVmaW5lIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSICAweDA4MDgKIAogI2RlZmluZSBFUDFfQlVGU0laRSA2NAogI2RlZmluZSBFUDRfQlVGU0laRSA1MTIKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9pbnB1dC5jIGIvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKaW5kZXggYTIxMzgxMy4uMjZhMTIxYiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2lucHV0LmMKQEAgLTY3LDYgKzY3LDYxIEBACiAJS0VZX0JSTF9ET1Q1CiB9OwogCisjZGVmaW5lIE1BU0NISU5FX0JVVFRPTlMgICAoNDIpCisjZGVmaW5lIE1BU0NISU5FX0JVVFRPTihYKSAoKFgpICsgQlROX01JU0MpCisjZGVmaW5lIE1BU0NISU5FX1BBRFMgICAgICAoMTYpCisjZGVmaW5lIE1BU0NISU5FX1BBRChYKSAgICAoKFgpICsgQUJTX1BSRVNTVVJFKQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQga2V5Y29kZV9tYXNjaGluZVtdID0geworCU1BU0NISU5FX0JVVFRPTig0MCksIC8qIG11dGUgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzkpLCAvKiBzb2xvICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDM4KSwgLyogc2VsZWN0ICAgICAqLworCU1BU0NISU5FX0JVVFRPTigzNyksIC8qIGR1cGxpY2F0ZSAgKi8KKwlNQVNDSElORV9CVVRUT04oMzYpLCAvKiBuYXZpZ2F0ZSAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDM1KSwgLyogcGFkIG1vZGUgICAqLworCU1BU0NISU5FX0JVVFRPTigzNCksIC8qIHBhdHRlcm4gICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzMpLCAvKiBzY2VuZSAgICAgICovCisJS0VZX1JFU0VSVkVELCAvKiBzcGFjZXIgKi8KKworCU1BU0NISU5FX0JVVFRPTigzMCksIC8qIHJlYyAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMzEpLCAvKiBlcmFzZSAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDMyKSwgLyogc2hpZnQgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyOCksIC8qIGdyaWQgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjcpLCAvKiA+ICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDI2KSwgLyogPCAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyNSksIC8qIHJlc3RhcnQgICAgKi8KKworCU1BU0NISU5FX0JVVFRPTigyMSksIC8qIEUgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjIpLCAvKiBGICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDIzKSwgLyogRyAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigyNCksIC8qIEggICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMjApLCAvKiBEICAgICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDE5KSwgLyogQyAgICAgICAgICAqLworCU1BU0NISU5FX0JVVFRPTigxOCksIC8qIEIgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMTcpLCAvKiBBICAgICAgICAgICovCisKKwlNQVNDSElORV9CVVRUT04oMCksICAvKiBjb250cm9sICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDIpLCAgLyogYnJvd3NlICAgICAqLworCU1BU0NISU5FX0JVVFRPTig0KSwgIC8qIDwgICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oNiksICAvKiBzbmFwICAgICAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDcpLCAgLyogYXV0b3dyaXRlICAqLworCU1BU0NISU5FX0JVVFRPTig1KSwgIC8qID4gICAgICAgICAgKi8KKwlNQVNDSElORV9CVVRUT04oMyksICAvKiBzYW1wbGluZyAgICovCisJTUFTQ0hJTkVfQlVUVE9OKDEpLCAgLyogc3RlcCAgICAgICAqLworCisJTUFTQ0hJTkVfQlVUVE9OKDE1KSwgLyogOCBzb2Z0a2V5cyAqLworCU1BU0NISU5FX0JVVFRPTigxNCksCisJTUFTQ0hJTkVfQlVUVE9OKDEzKSwKKwlNQVNDSElORV9CVVRUT04oMTIpLAorCU1BU0NISU5FX0JVVFRPTigxMSksCisJTUFTQ0hJTkVfQlVUVE9OKDEwKSwKKwlNQVNDSElORV9CVVRUT04oOSksCisJTUFTQ0hJTkVfQlVUVE9OKDgpLAorCisJTUFTQ0hJTkVfQlVUVE9OKDE2KSwgLyogbm90ZSByZXBlYXQgKi8KKwlNQVNDSElORV9CVVRUT04oMjkpICAvKiBwbGF5ICAgICAgICAqLworfTsKKwogI2RlZmluZSBLT05UUk9MWDFfSU5QVVRTCSg0MCkKICNkZWZpbmUgS09OVFJPTFM0X0JVVFRPTlMJKDEyICogOCkKICNkZWZpbmUgS09OVFJPTFM0X0FYSVMJCSg0NikKQEAgLTIxOCw2ICsyNzMsMjkgQEAKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQzWSwgaSk7CiAJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKIAkJYnJlYWs7CisKKwljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX01BU0NISU5FQ09OVFJPTExFUik6CisJCS8qIDQgdW5kZXIgdGhlIGxlZnQgc2NyZWVuICovCisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfSEFUMFgsIGRlY29kZV9lcnAoYnVmWzIxXSwgYnVmWzIwXSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDBZLCBkZWNvZGVfZXJwKGJ1ZlsxNV0sIGJ1ZlsxNF0pKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQxWCwgZGVjb2RlX2VycChidWZbOV0sICBidWZbOF0pKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQxWSwgZGVjb2RlX2VycChidWZbM10sICBidWZbMl0pKTsKKworCQkvKiA0IHVuZGVyIHRoZSByaWdodCBzY3JlZW4gKi8KKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19IQVQyWCwgZGVjb2RlX2VycChidWZbMTldLCBidWZbMThdKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfSEFUMlksIGRlY29kZV9lcnAoYnVmWzEzXSwgYnVmWzEyXSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDNYLCBkZWNvZGVfZXJwKGJ1Zls3XSwgIGJ1Zls2XSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX0hBVDNZLCBkZWNvZGVfZXJwKGJ1ZlsxXSwgIGJ1ZlswXSkpOworCisJCS8qIHZvbHVtZSAqLworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX1JYLCBkZWNvZGVfZXJwKGJ1ZlsxN10sIGJ1ZlsxNl0pKTsKKwkJLyogdGVtcG8gKi8KKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19SWSwgZGVjb2RlX2VycChidWZbMTFdLCBidWZbMTBdKSk7CisJCS8qIHN3aW5nICovCisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfUlosIGRlY29kZV9lcnAoYnVmWzVdLCAgYnVmWzRdKSk7CisKKwkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTQwMCw2ICs0NzgsMjUgQEAKIAlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsKIH0KIAorI2RlZmluZSBNQVNDSElORV9NU0dCTE9DS19TSVpFIDIKKworc3RhdGljIHZvaWQgc25kX3VzYl9jYWlhcV9tYXNjaGluZV9kaXNwYXRjaChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJCXVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGksIHBhZF9pZDsKKwl1aW50MTZfdCBwcmVzc3VyZTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVNDSElORV9QQURTOyBpKyspIHsKKwkJcHJlc3N1cmUgPSBiZTE2X3RvX2NwdShidWZbaSAqIDJdIDw8IDggfCBidWZbKGkgKiAyKSArIDFdKTsKKwkJcGFkX2lkID0gcHJlc3N1cmUgPj4gMTI7CisKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0X2RldiwgTUFTQ0hJTkVfUEFEKHBhZF9pZCksIHByZXNzdXJlICYgMHhmZmYpOworCX0KKworCWlucHV0X3N5bmMoZGV2LT5pbnB1dF9kZXYpOworfQorCiBzdGF0aWMgdm9pZCBzbmRfdXNiX2NhaWFxX2VwNF9yZXBseV9kaXNwYXRjaChzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHVyYi0+Y29udGV4dDsKQEAgLTQyNSw2ICs1MjIsMTMgQEAKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQpOgogCQlzbmRfdXNiX2NhaWFxX3RrczRfZGlzcGF0Y2goZGV2LCBidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9NQVNDSElORUNPTlRST0xMRVIpOgorCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgKE1BU0NISU5FX1BBRFMgKiBNQVNDSElORV9NU0dCTE9DS19TSVpFKSkKKwkJCWdvdG8gcmVxdWV1ZTsKKworCQlzbmRfdXNiX2NhaWFxX21hc2NoaW5lX2Rpc3BhdGNoKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlicmVhazsKIAl9CiAKIHJlcXVldWU6CkBAIC00NDQsNiArNTQ4LDcgQEAKIAlzd2l0Y2ggKGRldi0+Y2hpcC51c2JfaWQpIHsKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MWDEpOgogCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfVFJBS1RPUktPTlRST0xTNCk6CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9NQVNDSElORUNPTlRST0xMRVIpOgogCQlpZiAodXNiX3N1Ym1pdF91cmIoZGV2LT5lcDRfaW5fdXJiLCBHRlBfS0VSTkVMKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwpAQCAtNDYyLDYgKzU2Nyw3IEBACiAJc3dpdGNoIChkZXYtPmNoaXAudXNiX2lkKSB7CiAJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9UUkFLVE9SS09OVFJPTFgxKToKIAljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1RSQUtUT1JLT05UUk9MUzQpOgorCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSKToKIAkJdXNiX2tpbGxfdXJiKGRldi0+ZXA0X2luX3VyYik7CiAJCWJyZWFrOwogCX0KQEAgLTY1Miw2ICs3NTgsNTAgQEAKIAogCQlicmVhazsKIAorCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfTUFTQ0hJTkVDT05UUk9MTEVSKToKKwkJaW5wdXQtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJCWlucHV0LT5hYnNiaXRbMF0gPSBCSVRfTUFTSyhBQlNfSEFUMFgpIHwgQklUX01BU0soQUJTX0hBVDBZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUMVgpIHwgQklUX01BU0soQUJTX0hBVDFZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUMlgpIHwgQklUX01BU0soQUJTX0hBVDJZKSB8CisJCQlCSVRfTUFTSyhBQlNfSEFUM1gpIHwgQklUX01BU0soQUJTX0hBVDNZKSB8CisJCQlCSVRfTUFTSyhBQlNfUlgpIHwgQklUX01BU0soQUJTX1JZKSB8CisJCQlCSVRfTUFTSyhBQlNfUlopOworCisJCUJVSUxEX0JVR19PTihzaXplb2YoZGV2LT5rZXljb2RlKSA8IHNpemVvZihrZXljb2RlX21hc2NoaW5lKSk7CisJCW1lbWNweShkZXYtPmtleWNvZGUsIGtleWNvZGVfbWFzY2hpbmUsIHNpemVvZihrZXljb2RlX21hc2NoaW5lKSk7CisJCWlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShrZXljb2RlX21hc2NoaW5lKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFTQ0hJTkVfUEFEUzsgaSsrKSB7CisJCQlpbnB1dC0+YWJzYml0WzBdIHw9IE1BU0NISU5FX1BBRChpKTsKKwkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBNQVNDSElORV9QQUQoaSksIDAsIDB4ZmZmLCA1LCAxMCk7CisJCX0KKworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDBYLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQwWSwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfSEFUMVgsIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDFZLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQyWCwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfSEFUMlksIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX0hBVDNYLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19IQVQzWSwgMCwgOTk5LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfUlgsIDAsIDk5OSwgMCwgMTApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX1JZLCAwLCA5OTksIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19SWiwgMCwgOTk5LCAwLCAxMCk7CisKKwkJZGV2LT5lcDRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXYtPmVwNF9pbl91cmIpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGV4aXRfZnJlZV9pZGV2OworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIoZGV2LT5lcDRfaW5fdXJiLCB1c2JfZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIDB4NCksCisJCQkJICBkZXYtPmVwNF9pbl9idWYsIEVQNF9CVUZTSVpFLAorCQkJCSAgc25kX3VzYl9jYWlhcV9lcDRfcmVwbHlfZGlzcGF0Y2gsIGRldik7CisKKwkJc25kX3VzYl9jYWlhcV9zZXRfYXV0b19tc2coZGV2LCAxLCAxMCwgNSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJLyogbm8gaW5wdXQgbWV0aG9kcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UgKi8KIAkJZ290byBleGl0X2ZyZWVfaWRldjsKQEAgLTY2NCwxNSArODE0LDE3IEBACiAJZm9yIChpID0gMDsgaSA8IGlucHV0LT5rZXljb2RlbWF4OyBpKyspCiAJCV9fc2V0X2JpdChkZXYtPmtleWNvZGVbaV0sIGlucHV0LT5rZXliaXQpOwogCisJZGV2LT5pbnB1dF9kZXYgPSBpbnB1dDsKKwogCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXhpdF9mcmVlX2lkZXY7CiAKLQlkZXYtPmlucHV0X2RldiA9IGlucHV0OwogCXJldHVybiAwOwogCiBleGl0X2ZyZWVfaWRldjoKIAlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CisJZGV2LT5pbnB1dF9kZXYgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4OCw0ICs4NDAsMyBAQAogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKIAlkZXYtPmlucHV0X2RldiA9IE5VTEw7CiB9Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYXJkLmMgYi9zb3VuZC91c2IvY2FyZC5jCmluZGV4IDMwNjhmMDQuLjBmNmRjMGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYXJkLmMKKysrIGIvc291bmQvdXNiL2NhcmQuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtNjUsOSArNjYsOSBAQAogI2luY2x1ZGUgImhlbHBlci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAicGNtLmgiCi0jaW5jbHVkZSAidXJiLmgiCiAjaW5jbHVkZSAiZm9ybWF0LmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKKyNpbmNsdWRlICJzdHJlYW0uaCIKIAogTU9EVUxFX0FVVEhPUigiVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgQXVkaW8iKTsKQEAgLTE4NSw3ICsxODYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoISBzbmRfdXNiX3BhcnNlX2F1ZGlvX2VuZHBvaW50cyhjaGlwLCBpbnRlcmZhY2UpKSB7CisJaWYgKCEgc25kX3VzYl9wYXJzZV9hdWRpb19pbnRlcmZhY2UoY2hpcCwgaW50ZXJmYWNlKSkgewogCQl1c2Jfc2V0X2ludGVyZmFjZShkZXYsIGludGVyZmFjZSwgMCk7IC8qIHJlc2V0IHRoZSBjdXJyZW50IGludGVyZmFjZSAqLwogCQl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmdXNiX2F1ZGlvX2RyaXZlciwgaWZhY2UsICh2b2lkICopLTFMKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5oIGIvc291bmQvdXNiL2NhcmQuaAppbmRleCBhZTQyNTFkLi5hMzllZGNjIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5oCisrKyBiL3NvdW5kL3VzYi9jYXJkLmgKQEAgLTk0LDYgKzk0LDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAKIAlzdHJ1Y3Qgc25kX3VyYl9vcHMgb3BzOwkJLyogY2FsbGJhY2tzIChtdXN0IGJlIGZpbGxlZCBhdCBpbml0KSAqLworCWludCBsYXN0X2ZyYW1lX251bWJlcjsgICAgICAgICAgLyogc3RvcmVkIGZyYW1lIG51bWJlciAqLworCWludCBsYXN0X2RlbGF5OyAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGRlbGF5ICovCiB9OwogCiBzdHJ1Y3Qgc25kX3VzYl9zdHJlYW0gewpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Nsb2NrLmMgYi9zb3VuZC91c2IvY2xvY2suYwppbmRleCAwNzUxOTVlLi4zNzliYWFkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2xvY2suYworKysgYi9zb3VuZC91c2IvY2xvY2suYwpAQCAtOTEsNyArOTEsNyBAQAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgIFVBQzJfQ1hfQ0xPQ0tfU0VMRUNUT1IgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKHNlbGVjdG9yX2lkIDw8IDgpLAotCQkJICAgICAgJmJ1Ziwgc2l6ZW9mKGJ1ZiksIDEwMDApOworCQkJICAgICAgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfQ0xPQ0tfVkFMSUQgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKHNvdXJjZV9pZCA8PCA4KSwKLQkJCSAgICAgICZkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApOworCQkJICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogY2Fubm90IGdldCBjbG9jayB2YWxpZGl0eSBmb3IgaWQgJWRcbiIsCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlpZiAoKGVyciA9IHNuZF91c2JfY3RsX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLCBVQUNfU0VUX0NVUiwKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFIDw8IDgsIGVwLAotCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSwgMTAwMCkpIDwgMCkgeworCQkJCSAgIGRhdGEsIHNpemVvZihkYXRhKSkpIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDolZDolZDogY2Fubm90IHNldCBmcmVxICVkIHRvIGVwICUjeFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCByYXRlLCBlcCk7CiAJCXJldHVybiBlcnI7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAlpZiAoKGVyciA9IHNuZF91c2JfY3RsX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCBVQUNfR0VUX0NVUiwKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9FTkRQT0lOVCB8IFVTQl9ESVJfSU4sCiAJCQkJICAgVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEUgPDwgOCwgZXAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlZDolZDolZDogY2Fubm90IGdldCBmcmVxIGF0IGVwICUjeFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nLCBlcCk7CiAJCXJldHVybiAwOyAvKiBzb21lIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZWFkaW5nICovCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJCQkgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKIAkJCQkgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCQkgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKLQkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApKSA8IDApIHsKKwkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JWQ6JWQ6IGNhbm5vdCBzZXQgZnJlcSAlZCAodjIpXG4iLAogCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcsIHJhdGUpOwogCQlyZXR1cm4gZXJyOwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9JTiwKIAkJCQkgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCQkgICBzbmRfdXNiX2N0cmxfaW50ZihjaGlwKSB8IChjbG9jayA8PCA4KSwKLQkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSksIDEwMDApKSA8IDApIHsKKwkJCQkgICBkYXRhLCBzaXplb2YoZGF0YSkpKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiVkOiVkOiBjYW5ub3QgZ2V0IGZyZXEgKHYyKVxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZm10LT5hbHRzZXR0aW5nKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5jIGIvc291bmQvdXNiL2VuZHBvaW50LmMKaW5kZXggN2Q0NmU0OC4uODFjNmVkZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmMKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmMKQEAgLTE1LDQzNiArMTUsOTUxIEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9hdWRpby12Mi5oPgogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogCiAjaW5jbHVkZSAidXNiYXVkaW8uaCIKLSNpbmNsdWRlICJjYXJkLmgiCi0jaW5jbHVkZSAicHJvYy5oIgotI2luY2x1ZGUgInF1aXJrcy5oIgotI2luY2x1ZGUgImVuZHBvaW50LmgiCi0jaW5jbHVkZSAidXJiLmgiCi0jaW5jbHVkZSAicGNtLmgiCiAjaW5jbHVkZSAiaGVscGVyLmgiCi0jaW5jbHVkZSAiZm9ybWF0LmgiCi0jaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjYXJkLmgiCisjaW5jbHVkZSAiZW5kcG9pbnQuaCIKKyNpbmNsdWRlICJwY20uaCIKIAogLyoKLSAqIGZyZWUgYSBzdWJzdHJlYW0KKyAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gb3VyIGZ1bGwgc3BlZWQgZm9ybWF0IChmcy8xMDAwIGluIFExNi4xNikKKyAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3ggNTI0IGtIegogICovCi1zdGF0aWMgdm9pZCBmcmVlX3N1YnN0cmVhbShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCi0JaWYgKCFzdWJzLT5udW1fZm9ybWF0cykKLQkJcmV0dXJuOyAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnN1YnMtPmZtdF9saXN0KSB7Ci0JCXN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBhdWRpb2Zvcm1hdCwgbGlzdCk7Ci0JCWtmcmVlKGZwLT5yYXRlX3RhYmxlKTsKLQkJa2ZyZWUoZnApOwotCX0KLQlrZnJlZShzdWJzLT5yYXRlX2xpc3QubGlzdCk7CisJcmV0dXJuICgocmF0ZSA8PCAxMykgKyA2MikgLyAxMjU7CiB9CiAKLQogLyoKLSAqIGZyZWUgYSB1c2Igc3RyZWFtIGluc3RhbmNlCisgKiBjb252ZXJ0IGEgc2FtcGxpbmcgcmF0ZSBpbnRvIFVTQiBoaWdoIHNwZWVkIGZvcm1hdCAoZnMvODAwMCBpbiBRMTYuMTYpCisgKiB0aGlzIHdpbGwgb3ZlcmZsb3cgYXQgYXBwcm94IDQgTUh6CiAgKi8KLXN0YXRpYyB2b2lkIHNuZF91c2JfYXVkaW9fc3RyZWFtX2ZyZWUoc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfaGlnaF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQogewotCWZyZWVfc3Vic3RyZWFtKCZzdHJlYW0tPnN1YnN0cmVhbVswXSk7Ci0JZnJlZV9zdWJzdHJlYW0oJnN0cmVhbS0+c3Vic3RyZWFtWzFdKTsKLQlsaXN0X2RlbCgmc3RyZWFtLT5saXN0KTsKLQlrZnJlZShzdHJlYW0pOworCXJldHVybiAoKHJhdGUgPDwgMTApICsgNjIpIC8gMTI1OwogfQogCi1zdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0gPSBwY20tPnByaXZhdGVfZGF0YTsKLQlpZiAoc3RyZWFtKSB7Ci0JCXN0cmVhbS0+cGNtID0gTlVMTDsKLQkJc25kX3VzYl9hdWRpb19zdHJlYW1fZnJlZShzdHJlYW0pOwotCX0KLX0KLQotCiAvKgotICogYWRkIHRoaXMgZW5kcG9pbnQgdG8gdGhlIGNoaXAgaW5zdGFuY2UuCi0gKiBpZiBhIHN0cmVhbSB3aXRoIHRoZSBzYW1lIGVuZHBvaW50IGFscmVhZHkgZXhpc3RzLCBhcHBlbmQgdG8gaXQuCi0gKiBpZiBub3QsIGNyZWF0ZSBhIG5ldyBwY20gc3RyZWFtLgorICogdW5saW5rIGFjdGl2ZSB1cmJzLgogICovCi1pbnQgc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsIGludCBzdHJlYW0sIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnApCitzdGF0aWMgaW50IGRlYWN0aXZhdGVfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSwgaW50IGNhbl9zbGVlcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXM7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgYXN5bmM7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjaGlwLT5wY21fbGlzdCkgewotCQlhcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF91c2Jfc3RyZWFtLCBsaXN0KTsKLQkJaWYgKGFzLT5mbXRfdHlwZSAhPSBmcC0+Zm10X3R5cGUpCi0JCQljb250aW51ZTsKLQkJc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07Ci0JCWlmICghc3Vicy0+ZW5kcG9pbnQpCi0JCQljb250aW51ZTsKLQkJaWYgKHN1YnMtPmVuZHBvaW50ID09IGZwLT5lbmRwb2ludCkgewotCQkJbGlzdF9hZGRfdGFpbCgmZnAtPmxpc3QsICZzdWJzLT5mbXRfbGlzdCk7Ci0JCQlzdWJzLT5udW1fZm9ybWF0cysrOwotCQkJc3Vicy0+Zm9ybWF0cyB8PSBmcC0+Zm9ybWF0czsKLQkJCXJldHVybiAwOworCXN1YnMtPnJ1bm5pbmcgPSAwOworCisJaWYgKCFmb3JjZSAmJiBzdWJzLT5zdHJlYW0tPmNoaXAtPnNodXRkb3duKSAvKiB0byBiZSBzdXJlLi4uICovCisJCXJldHVybiAtRUJBREZEOworCisJYXN5bmMgPSAhY2FuX3NsZWVwICYmIGNoaXAtPmFzeW5jX3VubGluazsKKworCWlmICghYXN5bmMgJiYgaW5faW50ZXJydXB0KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGksICZzdWJzLT5hY3RpdmVfbWFzaykpIHsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmc3Vicy0+dW5saW5rX21hc2spKSB7CisJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPmRhdGF1cmJbaV0udXJiOworCQkJCWlmIChhc3luYykKKwkJCQkJdXNiX3VubGlua191cmIodSk7CisJCQkJZWxzZQorCQkJCQl1c2Jfa2lsbF91cmIodSk7CisJCQl9CiAJCX0KIAl9Ci0JLyogbG9vayBmb3IgYW4gZW1wdHkgc3RyZWFtICovCi0JbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+cGNtX2xpc3QpIHsKLQkJYXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdXNiX3N0cmVhbSwgbGlzdCk7Ci0JCWlmIChhcy0+Zm10X3R5cGUgIT0gZnAtPmZtdF90eXBlKQotCQkJY29udGludWU7Ci0JCXN1YnMgPSAmYXMtPnN1YnN0cmVhbVtzdHJlYW1dOwotCQlpZiAoc3Vicy0+ZW5kcG9pbnQpCi0JCQljb250aW51ZTsKLQkJZXJyID0gc25kX3BjbV9uZXdfc3RyZWFtKGFzLT5wY20sIHN0cmVhbSwgMSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJc25kX3VzYl9pbml0X3N1YnN0cmVhbShhcywgc3RyZWFtLCBmcCk7Ci0JCXJldHVybiAwOworCWlmIChzdWJzLT5zeW5jcGlwZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspIHsKKwkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7CisJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGkrMTYsICZzdWJzLT51bmxpbmtfbWFzaykpIHsKKwkJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPnN5bmN1cmJbaV0udXJiOworCQkJCQlpZiAoYXN5bmMpCisJCQkJCQl1c2JfdW5saW5rX3VyYih1KTsKKwkJCQkJZWxzZQorCQkJCQkJdXNiX2tpbGxfdXJiKHUpOworCQkJCX0KKwkJCX0KKwkJfQogCX0KKwlyZXR1cm4gMDsKK30KIAotCS8qIGNyZWF0ZSBhIG5ldyBwY20gKi8KLQlhcyA9IGt6YWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOwotCWlmICghYXMpCi0JCXJldHVybiAtRU5PTUVNOwotCWFzLT5wY21faW5kZXggPSBjaGlwLT5wY21fZGV2czsKLQlhcy0+Y2hpcCA9IGNoaXA7Ci0JYXMtPmZtdF90eXBlID0gZnAtPmZtdF90eXBlOwotCWVyciA9IHNuZF9wY21fbmV3KGNoaXAtPmNhcmQsICJVU0IgQXVkaW8iLCBjaGlwLT5wY21fZGV2cywKLQkJCSAgc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAxIDogMCwKLQkJCSAgc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAwIDogMSwKLQkJCSAgJnBjbSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWUoYXMpOwotCQlyZXR1cm4gZXJyOworCisvKgorICogcmVsZWFzZSBhIHVyYiBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfdXJiX2N0eChzdHJ1Y3Qgc25kX3VyYl9jdHggKnUpCit7CisJaWYgKHUtPnVyYikgeworCQlpZiAodS0+YnVmZmVyX3NpemUpCisJCQl1c2JfZnJlZV9jb2hlcmVudCh1LT5zdWJzLT5kZXYsIHUtPmJ1ZmZlcl9zaXplLAorCQkJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEpOworCQl1c2JfZnJlZV91cmIodS0+dXJiKTsKKwkJdS0+dXJiID0gTlVMTDsKIAl9Ci0JYXMtPnBjbSA9IHBjbTsKLQlwY20tPnByaXZhdGVfZGF0YSA9IGFzOwotCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX3VzYl9hdWRpb19wY21fZnJlZTsKLQlwY20tPmluZm9fZmxhZ3MgPSAwOwotCWlmIChjaGlwLT5wY21fZGV2cyA+IDApCi0JCXNwcmludGYocGNtLT5uYW1lLCAiVVNCIEF1ZGlvICMlZCIsIGNoaXAtPnBjbV9kZXZzKTsKK30KKworLyoKKyAqICB3YWl0IHVudGlsIGFsbCB1cmJzIGFyZSBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbnQgd2FpdF9jbGVhcl91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGFsaXZlOworCisJZG8geworCQlhbGl2ZSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7CisJCQlpZiAodGVzdF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkKKwkJCQlhbGl2ZSsrOworCQl9CisJCWlmIChzdWJzLT5zeW5jcGlwZSkgeworCQkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7CisJCQkJaWYgKHRlc3RfYml0KGkgKyAxNiwgJnN1YnMtPmFjdGl2ZV9tYXNrKSkKKwkJCQkJYWxpdmUrKzsKKwkJCX0KKwkJfQorCQlpZiAoISBhbGl2ZSkKKwkJCWJyZWFrOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOworCWlmIChhbGl2ZSkKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZW91dDogc3RpbGwgJWQgYWN0aXZlIHVyYnMuLlxuIiwgYWxpdmUpOworCXJldHVybiAwOworfQorCisvKgorICogcmVsZWFzZSBhIHN1YnN0cmVhbQorICovCit2b2lkIHNuZF91c2JfcmVsZWFzZV9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSkKK3sKKwlpbnQgaTsKKworCS8qIHN0b3AgdXJicyAodG8gYmUgc3VyZSkgKi8KKwlkZWFjdGl2YXRlX3VyYnMoc3VicywgZm9yY2UsIDEpOworCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVVJCUzsgaSsrKQorCQlyZWxlYXNlX3VyYl9jdHgoJnN1YnMtPmRhdGF1cmJbaV0pOworCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykKKwkJcmVsZWFzZV91cmJfY3R4KCZzdWJzLT5zeW5jdXJiW2ldKTsKKwl1c2JfZnJlZV9jb2hlcmVudChzdWJzLT5kZXYsIFNZTkNfVVJCUyAqIDQsCisJCQlzdWJzLT5zeW5jYnVmLCBzdWJzLT5zeW5jX2RtYSk7CisJc3Vicy0+c3luY2J1ZiA9IE5VTEw7CisJc3Vicy0+bnVyYnMgPSAwOworfQorCisvKgorICogY29tcGxldGUgY2FsbGJhY2sgZnJvbSBkYXRhIHVyYgorICovCitzdGF0aWMgdm9pZCBzbmRfY29tcGxldGVfdXJiKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSBjdHgtPnN1YnM7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjdHgtPnN1YnMtPnBjbV9zdWJzdHJlYW07CisJaW50IGVyciA9IDA7CisKKwlpZiAoKHN1YnMtPnJ1bm5pbmcgJiYgc3Vicy0+b3BzLnJldGlyZShzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIHx8CisJICAgICFzdWJzLT5ydW5uaW5nIHx8IC8qIGNhbiBiZSBzdG9wcGVkIGR1cmluZyByZXRpcmUgY2FsbGJhY2sgKi8KKwkgICAgKGVyciA9IHN1YnMtPm9wcy5wcmVwYXJlKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSwgdXJiKSkgPCAwIHx8CisJICAgIChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKKwkJY2xlYXJfYml0KGN0eC0+aW5kZXgsICZzdWJzLT5hY3RpdmVfbWFzayk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHVyYiAoZXJyID0gJWQpXG4iLCBlcnIpOworCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCQl9CisJfQorfQorCisKKy8qCisgKiBjb21wbGV0ZSBjYWxsYmFjayBmcm9tIHN5bmMgdXJiCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9jb21wbGV0ZV9zeW5jX3VyYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOworCWludCBlcnIgPSAwOworCisJaWYgKChzdWJzLT5ydW5uaW5nICYmIHN1YnMtPm9wcy5yZXRpcmVfc3luYyhzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIHx8CisJICAgICFzdWJzLT5ydW5uaW5nIHx8IC8qIGNhbiBiZSBzdG9wcGVkIGR1cmluZyByZXRpcmUgY2FsbGJhY2sgKi8KKwkgICAgKGVyciA9IHN1YnMtPm9wcy5wcmVwYXJlX3N5bmMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSA8IDAgfHwKKwkgICAgKGVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpIDwgMCkgeworCQljbGVhcl9iaXQoY3R4LT5pbmRleCArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOworCQlpZiAoZXJyIDwgMCkgeworCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCBzeW5jIHVyYiAoZXJyID0gJWQpXG4iLCBlcnIpOworCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCQl9CisJfQorfQorCisKKy8qCisgKiBpbml0aWFsaXplIGEgc3Vic3RyZWFtIGZvciBwbGFiYWNrL2NhcHR1cmUKKyAqLworaW50IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywKKwkJCQl1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJCQl1bnNpZ25lZCBpbnQgZnJhbWVfYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgbWF4c2l6ZSwgaTsKKwlpbnQgaXNfcGxheWJhY2sgPSBzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwl1bnNpZ25lZCBpbnQgdXJiX3BhY2tzLCB0b3RhbF9wYWNrcywgcGFja3NfcGVyX21zOworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwID0gc3Vicy0+c3RyZWFtLT5jaGlwOworCisJLyogY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgaW4gMTYuMTYgZm9ybWF0ICovCisJaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPT0gVVNCX1NQRUVEX0ZVTEwpCisJCXN1YnMtPmZyZXFuID0gZ2V0X3VzYl9mdWxsX3NwZWVkX3JhdGUocmF0ZSk7CiAJZWxzZQotCQlzdHJjcHkocGNtLT5uYW1lLCAiVVNCIEF1ZGlvIik7CisJCXN1YnMtPmZyZXFuID0gZ2V0X3VzYl9oaWdoX3NwZWVkX3JhdGUocmF0ZSk7CisJc3Vicy0+ZnJlcW0gPSBzdWJzLT5mcmVxbjsKKwlzdWJzLT5mcmVxc2hpZnQgPSBJTlRfTUlOOworCS8qIGNhbGN1bGF0ZSBtYXguIGZyZXF1ZW5jeSAqLworCWlmIChzdWJzLT5tYXhwYWNrc2l6ZSkgeworCQkvKiB3aGF0ZXZlciBmaXRzIGludG8gYSBtYXguIHNpemUgcGFja2V0ICovCisJCW1heHNpemUgPSBzdWJzLT5tYXhwYWNrc2l6ZTsKKwkJc3Vicy0+ZnJlcW1heCA9IChtYXhzaXplIC8gKGZyYW1lX2JpdHMgPj4gMykpCisJCQkJPDwgKDE2IC0gc3Vicy0+ZGF0YWludGVydmFsKTsKKwl9IGVsc2UgeworCQkvKiBubyBtYXguIHBhY2tldCBzaXplOiBqdXN0IHRha2UgMjUlIGhpZ2hlciB0aGFuIG5vbWluYWwgKi8KKwkJc3Vicy0+ZnJlcW1heCA9IHN1YnMtPmZyZXFuICsgKHN1YnMtPmZyZXFuID4+IDIpOworCQltYXhzaXplID0gKChzdWJzLT5mcmVxbWF4ICsgMHhmZmZmKSAqIChmcmFtZV9iaXRzID4+IDMpKQorCQkJCT4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCk7CisJfQorCXN1YnMtPnBoYXNlID0gMDsKIAotCXNuZF91c2JfaW5pdF9zdWJzdHJlYW0oYXMsIHN0cmVhbSwgZnApOworCWlmIChzdWJzLT5maWxsX21heCkKKwkJc3Vicy0+Y3VycGFja3NpemUgPSBzdWJzLT5tYXhwYWNrc2l6ZTsKKwllbHNlCisJCXN1YnMtPmN1cnBhY2tzaXplID0gbWF4c2l6ZTsKIAotCWxpc3RfYWRkKCZhcy0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKLQljaGlwLT5wY21fZGV2cysrOworCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpICE9IFVTQl9TUEVFRF9GVUxMKQorCQlwYWNrc19wZXJfbXMgPSA4ID4+IHN1YnMtPmRhdGFpbnRlcnZhbDsKKwllbHNlCisJCXBhY2tzX3Blcl9tcyA9IDE7CiAKLQlzbmRfdXNiX3Byb2NfcGNtX2Zvcm1hdF9hZGQoYXMpOworCWlmIChpc19wbGF5YmFjaykgeworCQl1cmJfcGFja3MgPSBtYXgoY2hpcC0+bnJwYWNrcywgMSk7CisJCXVyYl9wYWNrcyA9IG1pbih1cmJfcGFja3MsICh1bnNpZ25lZCBpbnQpTUFYX1BBQ0tTKTsKKwl9IGVsc2UKKwkJdXJiX3BhY2tzID0gMTsKKwl1cmJfcGFja3MgKj0gcGFja3NfcGVyX21zOworCWlmIChzdWJzLT5zeW5jcGlwZSkKKwkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgMVUgPDwgc3Vicy0+c3luY2ludGVydmFsKTsKKworCS8qIGRlY2lkZSBob3cgbWFueSBwYWNrZXRzIHRvIGJlIHVzZWQgKi8KKwlpZiAoaXNfcGxheWJhY2spIHsKKwkJdW5zaWduZWQgaW50IG1pbnNpemUsIG1heHBhY2tzOworCQkvKiBkZXRlcm1pbmUgaG93IHNtYWxsIGEgcGFja2V0IGNhbiBiZSAqLworCQltaW5zaXplID0gKHN1YnMtPmZyZXFuID4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCkpCisJCQkgICogKGZyYW1lX2JpdHMgPj4gMyk7CisJCS8qIHdpdGggc3luYyBmcm9tIGRldmljZSwgYXNzdW1lIGl0IGNhbiBiZSAxMiUgbG93ZXIgKi8KKwkJaWYgKHN1YnMtPnN5bmNwaXBlKQorCQkJbWluc2l6ZSAtPSBtaW5zaXplID4+IDM7CisJCW1pbnNpemUgPSBtYXgobWluc2l6ZSwgMXUpOworCQl0b3RhbF9wYWNrcyA9IChwZXJpb2RfYnl0ZXMgKyBtaW5zaXplIC0gMSkgLyBtaW5zaXplOworCQkvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBVUkJzIGZvciBxdWV1ZWluZyAqLworCQlpZiAodG90YWxfcGFja3MgPCAyKSB7CisJCQl0b3RhbF9wYWNrcyA9IDI7CisJCX0gZWxzZSB7CisJCQkvKiBhbmQgd2UgZG9uJ3Qgd2FudCB0b28gbG9uZyBhIHF1ZXVlIGVpdGhlciAqLworCQkJbWF4cGFja3MgPSBtYXgoTUFYX1FVRVVFICogcGFja3NfcGVyX21zLCB1cmJfcGFja3MgKiAyKTsKKwkJCXRvdGFsX3BhY2tzID0gbWluKHRvdGFsX3BhY2tzLCBtYXhwYWNrcyk7CisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAodXJiX3BhY2tzID4gMSAmJiB1cmJfcGFja3MgKiBtYXhzaXplID49IHBlcmlvZF9ieXRlcykKKwkJCXVyYl9wYWNrcyA+Pj0gMTsKKwkJdG90YWxfcGFja3MgPSBNQVhfVVJCUyAqIHVyYl9wYWNrczsKKwl9CisJc3Vicy0+bnVyYnMgPSAodG90YWxfcGFja3MgKyB1cmJfcGFja3MgLSAxKSAvIHVyYl9wYWNrczsKKwlpZiAoc3Vicy0+bnVyYnMgPiBNQVhfVVJCUykgeworCQkvKiB0b28gbXVjaC4uLiAqLworCQlzdWJzLT5udXJicyA9IE1BWF9VUkJTOworCQl0b3RhbF9wYWNrcyA9IE1BWF9VUkJTICogdXJiX3BhY2tzOworCX0gZWxzZSBpZiAoc3Vicy0+bnVyYnMgPCAyKSB7CisJCS8qIHRvbyBsaXR0bGUgLSB3ZSBuZWVkIGF0IGxlYXN0IHR3byBwYWNrZXRzCisJCSAqIHRvIGVuc3VyZSBjb250aWd1b3VzIHBsYXliYWNrL2NhcHR1cmUKKwkJICovCisJCXN1YnMtPm51cmJzID0gMjsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+ZGF0YXVyYltpXTsKKwkJdS0+aW5kZXggPSBpOworCQl1LT5zdWJzID0gc3ViczsKKwkJdS0+cGFja2V0cyA9IChpICsgMSkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzCisJCQktIGkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzOworCQl1LT5idWZmZXJfc2l6ZSA9IG1heHNpemUgKiB1LT5wYWNrZXRzOworCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKQorCQkJdS0+cGFja2V0cysrOyAvKiBmb3IgdHJhbnNmZXIgZGVsaW1pdGVyICovCisJCXUtPnVyYiA9IHVzYl9hbGxvY191cmIodS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7CisJCWlmICghdS0+dXJiKQorCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQl1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCB1LT5idWZmZXJfc2l6ZSwKKwkJCQkJICAgR0ZQX0tFUk5FTCwgJnUtPnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKCF1LT51cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJdS0+dXJiLT5waXBlID0gc3Vicy0+ZGF0YXBpcGU7CisJCXUtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+ZGF0YWludGVydmFsOworCQl1LT51cmItPmNvbnRleHQgPSB1OworCQl1LT51cmItPmNvbXBsZXRlID0gc25kX2NvbXBsZXRlX3VyYjsKKwl9CisKKwlpZiAoc3Vicy0+c3luY3BpcGUpIHsKKwkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3luYyB1cmJzICovCisJCXN1YnMtPnN5bmNidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAorCQkJCQkJIEdGUF9LRVJORUwsICZzdWJzLT5zeW5jX2RtYSk7CisJCWlmICghc3Vicy0+c3luY2J1ZikKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7CisJCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+c3luY3VyYltpXTsKKwkJCXUtPmluZGV4ID0gaTsKKwkJCXUtPnN1YnMgPSBzdWJzOworCQkJdS0+cGFja2V0cyA9IDE7CisJCQl1LT51cmIgPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCF1LT51cmIpCisJCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQkJdS0+dXJiLT50cmFuc2Zlcl9idWZmZXIgPSBzdWJzLT5zeW5jYnVmICsgaSAqIDQ7CisJCQl1LT51cmItPnRyYW5zZmVyX2RtYSA9IHN1YnMtPnN5bmNfZG1hICsgaSAqIDQ7CisJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA0OworCQkJdS0+dXJiLT5waXBlID0gc3Vicy0+c3luY3BpcGU7CisJCQl1LT51cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwKKwkJCQkJCSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJCXUtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+c3luY2ludGVydmFsOworCQkJdS0+dXJiLT5jb250ZXh0ID0gdTsKKwkJCXUtPnVyYi0+Y29tcGxldGUgPSBzbmRfY29tcGxldGVfc3luY191cmI7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK291dF9vZl9tZW1vcnk6CisJc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGZ1bGwgc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKKyAqCisgKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgorICogdGhlIGZpeGVkIDEwLjE0IGZyZXF1ZW5jeSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcGlwZS4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSAzOworCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwljcFswXSA9IHN1YnMtPmZyZXFuID4+IDI7CisJY3BbMV0gPSBzdWJzLT5mcmVxbiA+PiAxMDsKKwljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE4OworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGhpZ2ggc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKKyAqCisgKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgorICogdGhlIGZpeGVkIDEyLjEzIGZyZXF1ZW5jeSBpcyBwYXNzZWQgYXMgMTYuMTYgdGhyb3VnaCB0aGUgcGlwZS4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSA0OworCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwljcFswXSA9IHN1YnMtPmZyZXFuOworCWNwWzFdID0gc3Vicy0+ZnJlcW4gPj4gODsKKwljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE2OworCWNwWzNdID0gc3Vicy0+ZnJlcW4gPj4gMjQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgc3luYyBjb21wbGV0ZQorICogLSBub3RoaW5nIHRvIGRvCisgKi8KK3N0YXRpYyBpbnQgcmV0aXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgc3RydWN0IHVyYiAqdXJiKQoreworCXJldHVybiAwOworfQorCisvKgorICogcHJlcGFyZSB1cmIgZm9yIGNhcHR1cmUgZGF0YSBwaXBlCisgKgorICogZmlsbCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWFjaCBkZXNjcmlwdG9yLgorICoKKyAqIHdlIHVzZSBhIHRlbXBvcmFyeSBidWZmZXIgdG8gd3JpdGUgdGhlIGNhcHR1cmVkIGRhdGEuCisgKiBzaW5jZSB0aGUgbGVuZ3RoIG9mIHdyaXR0ZW4gZGF0YSBpcyBkZXRlcm1pbmVkIGJ5IGhvc3QsIHdlIGNhbm5vdAorICogd3JpdGUgb250byB0aGUgcGNtIGJ1ZmZlciBkaXJlY3RseS4uLiAgdGhlIGRhdGEgaXMgdGh1cyBjb3BpZWQKKyAqIGxhdGVyIGF0IGNvbXBsZXRlIGNhbGxiYWNrIHRvIHRoZSBnbG9iYWwgYnVmZmVyLgorICovCitzdGF0aWMgaW50IHByZXBhcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpLCBvZmZzOworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCisJb2ZmcyA9IDA7CisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYWNrZXRzOyBpKyspIHsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHN1YnMtPmN1cnBhY2tzaXplOworCQlvZmZzICs9IHN1YnMtPmN1cnBhY2tzaXplOworCX0KKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBvZmZzOworCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUKKyAqCisgKiBjb3B5IHRoZSBkYXRhIGZyb20gZWFjaCBkZXNjdGlwdG9yIHRvIHRoZSBwY20gYnVmZmVyLCBhbmQKKyAqIHVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworc3RhdGljIGludCByZXRpcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCSAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgKmNwOworCWludCBpOworCXVuc2lnbmVkIGludCBzdHJpZGUsIGZyYW1lcywgYnl0ZXMsIG9sZHB0cjsKKwlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOworCisJc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOworCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKwkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7CisJCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJmcmFtZSAlZCBhY3RpdmU6ICVkXG4iLCBpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCQkvLyBjb250aW51ZTsKKwkJfQorCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJZnJhbWVzID0gYnl0ZXMgLyBzdHJpZGU7CisJCWlmICghc3Vicy0+dHhmcl9xdWlyaykKKwkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOworCQlpZiAoYnl0ZXMgJSAocnVudGltZS0+c2FtcGxlX2JpdHMgPj4gMykgIT0gMCkgeworI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQorCQkJaW50IG9sZGJ5dGVzID0gYnl0ZXM7CisjZW5kaWYKKwkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOworCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKKwkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJCW9sZHB0ciA9IHN1YnMtPmh3cHRyX2RvbmU7CisJCXN1YnMtPmh3cHRyX2RvbmUgKz0gYnl0ZXM7CisJCWlmIChzdWJzLT5od3B0cl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKQorCQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKKwkJZnJhbWVzID0gKGJ5dGVzICsgKG9sZHB0ciAlIHN0cmlkZSkpIC8gc3RyaWRlOworCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGZyYW1lczsKKwkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCQlwZXJpb2RfZWxhcHNlZCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCQkvKiBjb3B5IGEgZGF0YSBjaHVuayAqLworCQlpZiAob2xkcHRyICsgYnl0ZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkgeworCQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9CisJCQkJCXJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlIC0gb2xkcHRyOworCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgb2xkcHRyLCBjcCwgYnl0ZXMxKTsKKwkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgY3AgKyBieXRlczEsIGJ5dGVzIC0gYnl0ZXMxKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIG9sZHB0ciwgY3AsIGJ5dGVzKTsKKwkJfQorCX0KKwlpZiAocGVyaW9kX2VsYXBzZWQpCisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUgd2hlbiBwYXVzZWQuICBOb3RoaW5nIHRvIGRvLgorICovCitzdGF0aWMgaW50IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIHN5bmMgcGlwZQorICoKKyAqIHNldCB1cCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gcmVjZWl2ZSB0aGUgY3VycmVudCBmcmVxdWVuY3kuCisgKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IG1pbig0dSwgY3R4LT5zdWJzLT5zeW5jbWF4c2l6ZSk7CisJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBzeW5jIGNvbXBsZXRlCisgKgorICogRnVsbCBzcGVlZCBkZXZpY2VzIHJlcG9ydCBmZWVkYmFjayB2YWx1ZXMgaW4gMTAuMTQgZm9ybWF0IGFzIHNhbXBsZXMgcGVyCisgKiBmcmFtZSwgaGlnaCBzcGVlZCBkZXZpY2VzIGluIDE2LjE2IGZvcm1hdCBhcyBzYW1wbGVzIHBlciBtaWNyb2ZyYW1lLgorICogQmVjYXVzZSB0aGUgQXVkaW8gQ2xhc3MgMSBzcGVjIHdhcyB3cml0dGVuIGJlZm9yZSBVU0IgMi4wLCBtYW55IGhpZ2ggc3BlZWQKKyAqIGRldmljZXMgdXNlIGEgd3JvbmcgaW50ZXJwcmV0YXRpb24sIHNvbWUgb3RoZXJzIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQKKyAqIGZvcm1hdC4gIFRoZXJlZm9yZSwgd2UgY2Fubm90IHByZWRpY3Qgd2hhdCBmb3JtYXQgYW55IHBhcnRpY3VsYXIgZGV2aWNlIHVzZXMKKyAqIGFuZCBtdXN0IGRldGVjdCBpdCBhdXRvbWF0aWNhbGx5LgorICovCitzdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBpbnQgZjsKKwlpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh1cmItPmlzb19mcmFtZV9kZXNjWzBdLnN0YXR1cyAhPSAwIHx8CisJICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA8IDMpCisJCXJldHVybiAwOworCisJZiA9IGxlMzJfdG9fY3B1cCh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA9PSAzKQorCQlmICY9IDB4MDBmZmZmZmY7CisJZWxzZQorCQlmICY9IDB4MGZmZmZmZmY7CisJaWYgKGYgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoc3Vicy0+ZnJlcXNoaWZ0ID09IElOVF9NSU4pKSB7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB0aW1lIHdlIHNlZSBhIGZlZWRiYWNrIHZhbHVlLCBkZXRlcm1pbmUgaXRzIGZvcm1hdAorCQkgKiBieSBzaGlmdGluZyBpdCBsZWZ0IG9yIHJpZ2h0IHVudGlsIGl0IG1hdGNoZXMgdGhlIG5vbWluYWwKKwkJICogZnJlcXVlbmN5IHZhbHVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZlZWRiYWNrIGRvZXMgbm90CisJCSAqIGRpZmZlciBmcm9tIHRoZSBub21pbmFsIHZhbHVlIG1vcmUgdGhhbiArNTAlIG9yIC0yNSUuCisJCSAqLworCQlzaGlmdCA9IDA7CisJCXdoaWxlIChmIDwgc3Vicy0+ZnJlcW4gLSBzdWJzLT5mcmVxbiAvIDQpIHsKKwkJCWYgPDw9IDE7CisJCQlzaGlmdCsrOworCQl9CisJCXdoaWxlIChmID4gc3Vicy0+ZnJlcW4gKyBzdWJzLT5mcmVxbiAvIDIpIHsKKwkJCWYgPj49IDE7CisJCQlzaGlmdC0tOworCQl9CisJCXN1YnMtPmZyZXFzaGlmdCA9IHNoaWZ0OworCX0KKwllbHNlIGlmIChzdWJzLT5mcmVxc2hpZnQgPj0gMCkKKwkJZiA8PD0gc3Vicy0+ZnJlcXNoaWZ0OworCWVsc2UKKwkJZiA+Pj0gLXN1YnMtPmZyZXFzaGlmdDsKKworCWlmIChsaWtlbHkoZiA+PSBzdWJzLT5mcmVxbiAtIHN1YnMtPmZyZXFuIC8gOCAmJiBmIDw9IHN1YnMtPmZyZXFtYXgpKSB7CisJCS8qCisJCSAqIElmIHRoZSBmcmVxdWVuY3kgbG9va3MgdmFsaWQsIHNldCBpdC4KKwkJICogVGhpcyB2YWx1ZSBpcyByZWZlcnJlZCB0byBpbiBwcmVwYXJlX3BsYXliYWNrX3VyYigpLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKKwkJc3Vicy0+ZnJlcW0gPSBmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3V0IG9mIHJhbmdlOyBtYXliZSB0aGUgc2hpZnQgdmFsdWUgaXMgd3JvbmcuCisJCSAqIFJlc2V0IGl0IHNvIHRoYXQgd2UgYXV0b2RldGVjdCBhZ2FpbiB0aGUgbmV4dCB0aW1lLgorCQkgKi8KKwkJc3Vicy0+ZnJlcXNoaWZ0ID0gSU5UX01JTjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwYXJzZV91YWNfZW5kcG9pbnRfYXR0cmlidXRlcyhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKLQkJCQkJIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHMsCi0JCQkJCSBpbnQgcHJvdG9jb2wsIGludCBpZmFjZV9ubykKKy8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgbmV4dCBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19uZXh0X3BhY2tldF9zaXplKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKIHsKLQkvKiBwYXJzZWQgd2l0aCBhIHYxIGhlYWRlciBoZXJlLiB0aGF0J3Mgb2sgYXMgd2Ugb25seSBsb29rIGF0IHRoZQotCSAqIGhlYWRlciBmaXJzdCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYm90aCB2ZXJzaW9ucyAqLwotCXN0cnVjdCB1YWNfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXA7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKLQlpbnQgYXR0cmlidXRlcyA9IDA7CisJaWYgKHN1YnMtPmZpbGxfbWF4KQorCQlyZXR1cm4gc3Vicy0+bWF4ZnJhbWVzaXplOworCWVsc2UgeworCQlzdWJzLT5waGFzZSA9IChzdWJzLT5waGFzZSAmIDB4ZmZmZikKKwkJCSsgKHN1YnMtPmZyZXFtIDw8IHN1YnMtPmRhdGFpbnRlcnZhbCk7CisJCXJldHVybiBtaW4oc3Vicy0+cGhhc2UgPj4gMTYsIHN1YnMtPm1heGZyYW1lc2l6ZSk7CisJfQorfQogCi0JY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzBdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFswXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKy8qCisgKiBQcmVwYXJlIHVyYiBmb3Igc3RyZWFtaW5nIGJlZm9yZSBwbGF5YmFjayBzdGFydHMgb3Igd2hlbiBwYXVzZWQuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSwgc28gd2Ugc2VuZCBzaWxlbmNlLgorICovCitzdGF0aWMgaW50IHByZXBhcmVfbm9kYXRhX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgb2ZmcywgY291bnRzOworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCWludCBzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7CiAKLQkvKiBDcmVhbXdhcmUgTm9haCBoYXMgdGhpcyBkZXNjcmlwdG9yIGFmdGVyIHRoZSAybmQgZW5kcG9pbnQgKi8KLQlpZiAoIWNzZXAgJiYgYWx0c2QtPmJOdW1FbmRwb2ludHMgPj0gMikKLQkJY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzFdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFsxXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKwlvZmZzID0gMDsKKwl1cmItPmRldiA9IGN0eC0+c3Vicy0+ZGV2OworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7ICsraSkgeworCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gb2ZmcyAqIHN0cmlkZTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPSBjb3VudHMgKiBzdHJpZGU7CisJCW9mZnMgKz0gY291bnRzOworCX0KKwl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gY3R4LT5wYWNrZXRzOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IG9mZnMgKiBzdHJpZGU7CisJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCSAgICAgICBydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9VOCA/IDB4ODAgOiAwLAorCSAgICAgICBvZmZzICogc3RyaWRlKTsKKwlyZXR1cm4gMDsKK30KIAotCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAotCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKLQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKLQkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKLQkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKLQkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisvKgorICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIGRhdGEgcGlwZQorICoKKyAqIFNpbmNlIGEgVVJCIGNhbiBoYW5kbGUgb25seSBhIHNpbmdsZSBsaW5lYXIgYnVmZmVyLCB3ZSBtdXN0IHVzZSBkb3VibGUKKyAqIGJ1ZmZlcmluZyB3aGVuIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG92ZXJmbG93cyB0aGUgYnVmZmVyIGJvdW5kYXJ5LgorICogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIHdoZW4gdXBkYXRpbmcgaHdwdHJfZG9uZSwgd2UgdXNlIGRvdWJsZSBidWZmZXJpbmcKKyAqIGZvciBhbGwgVVJCcy4KKyAqLworc3RhdGljIGludCBwcmVwYXJlX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGksIHN0cmlkZTsKKwl1bnNpZ25lZCBpbnQgY291bnRzLCBmcmFtZXMsIGJ5dGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCXN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKKworCWZyYW1lcyA9IDA7CisJdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KKwl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7IGkrKykgeworCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7CisJCS8qIHNldCB1cCBkZXNjcmlwdG9yICovCisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gZnJhbWVzICogc3RyaWRlOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKKwkJZnJhbWVzICs9IGNvdW50czsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOworCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGNvdW50czsKKwkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7CisJCQlwZXJpb2RfZWxhcHNlZCA9IDE7CisJCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKSB7CisJCQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPiAwKSB7CisJCQkJCS8qIEZJWE1FOiBmaWxsLW1heCBtb2RlIGlzIG5vdAorCQkJCQkgKiBzdXBwb3J0ZWQgeWV0ICovCisJCQkJCWZyYW1lcyAtPSBzdWJzLT50cmFuc2Zlcl9kb25lOworCQkJCQljb3VudHMgLT0gc3Vicy0+dHJhbnNmZXJfZG9uZTsKKwkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPQorCQkJCQkJY291bnRzICogc3RyaWRlOworCQkJCQlzdWJzLT50cmFuc2Zlcl9kb25lID0gMDsKKwkJCQl9CisJCQkJaSsrOworCQkJCWlmIChpIDwgY3R4LT5wYWNrZXRzKSB7CisJCQkJCS8qIGFkZCBhIHRyYW5zZmVyIGRlbGltaXRlciAqLworCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9CisJCQkJCQlmcmFtZXMgKiBzdHJpZGU7CisJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gMDsKKwkJCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocGVyaW9kX2VsYXBzZWQpIC8qIGZpbmlzaCBhdCB0aGUgcGVyaW9kIGJvdW5kYXJ5ICovCisJCQlicmVhazsKKwl9CisJYnl0ZXMgPSBmcmFtZXMgKiBzdHJpZGU7CisJaWYgKHN1YnMtPmh3cHRyX2RvbmUgKyBieXRlcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKSB7CisJCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4gKi8KKwkJdW5zaWduZWQgaW50IGJ5dGVzMSA9CisJCQlydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSAtIHN1YnMtPmh3cHRyX2RvbmU7CisJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsgc3Vicy0+aHdwdHJfZG9uZSwgYnl0ZXMxKTsKKwkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgYnl0ZXMxLAorCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEsIGJ5dGVzIC0gYnl0ZXMxKTsKKwl9IGVsc2UgeworCQltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArIHN1YnMtPmh3cHRyX2RvbmUsIGJ5dGVzKTsKKwl9CisJc3Vicy0+aHdwdHJfZG9uZSArPSBieXRlczsKKwlpZiAoc3Vicy0+aHdwdHJfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkKKwkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKKworCS8qIHVwZGF0ZSBkZWxheSB3aXRoIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIHF1ZXVlZCAqLworCXJ1bnRpbWUtPmRlbGF5ID0gc3Vicy0+bGFzdF9kZWxheTsKKwlydW50aW1lLT5kZWxheSArPSBmcmFtZXM7CisJc3Vicy0+bGFzdF9kZWxheSA9IHJ1bnRpbWUtPmRlbGF5OworCisJLyogcmVhbGlnbiBsYXN0X2ZyYW1lX251bWJlciAqLworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyID0gdXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihzdWJzLT5kZXYpOworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyICY9IDB4RkY7IC8qIGtlZXAgOCBMU0JzICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXM7CisJaWYgKHBlcmlvZF9lbGFwc2VkKQorCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnMtPnBjbV9zdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCisvKgorICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBkYXRhIGNvbXBsZXRlCisgKiAtIGRlY3JlYXNlIHRoZSBkZWxheSBjb3VudCBhZ2FpbgorICovCitzdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKKwlpbnQgcHJvY2Vzc2VkID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC8gc3RyaWRlOworCWludCBlc3RfZGVsYXk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCisJZXN0X2RlbGF5ID0gc25kX3VzYl9wY21fZGVsYXkoc3VicywgcnVudGltZS0+cmF0ZSk7CisJLyogdXBkYXRlIGRlbGF5IHdpdGggZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgcGxheWVkICovCisJaWYgKHByb2Nlc3NlZCA+IHN1YnMtPmxhc3RfZGVsYXkpCisJCXN1YnMtPmxhc3RfZGVsYXkgPSAwOworCWVsc2UKKwkJc3Vicy0+bGFzdF9kZWxheSAtPSBwcm9jZXNzZWQ7CisJcnVudGltZS0+ZGVsYXkgPSBzdWJzLT5sYXN0X2RlbGF5OworCisJLyoKKwkgKiBSZXBvcnQgd2hlbiBkZWxheSBlc3RpbWF0ZSBpcyBvZmYgYnkgbW9yZSB0aGFuIDJtcy4KKwkgKiBUaGUgZXJyb3Igc2hvdWxkIGJlIGxvd2VyIHRoYW4gMm1zIHNpbmNlIHRoZSBlc3RpbWF0ZSByZWxpZXMKKwkgKiBvbiB0d28gcmVhZHMgb2YgYSBjb3VudGVyIHVwZGF0ZWQgZXZlcnkgbXMuCisJICovCisJaWYgKGFicyhlc3RfZGVsYXkgLSBzdWJzLT5sYXN0X2RlbGF5KSAqIDEwMDAgPiBydW50aW1lLT5yYXRlICogMikKKwkJc25kX3ByaW50ayhLRVJOX0RFQlVHICJkZWxheTogZXN0aW1hdGVkICVkLCBhY3R1YWwgJWRcbiIsCisJCQllc3RfZGVsYXksIHN1YnMtPmxhc3RfZGVsYXkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdXNiX2Vycm9yX3N0cmluZyhpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSAtRU5PREVWOgorCQlyZXR1cm4gIm5vIGRldmljZSI7CisJY2FzZSAtRU5PRU5UOgorCQlyZXR1cm4gImVuZHBvaW50IG5vdCBlbmFibGVkIjsKKwljYXNlIC1FUElQRToKKwkJcmV0dXJuICJlbmRwb2ludCBzdGFsbGVkIjsKKwljYXNlIC1FTk9TUEM6CisJCXJldHVybiAibm90IGVub3VnaCBiYW5kd2lkdGgiOworCWNhc2UgLUVTSFVURE9XTjoKKwkJcmV0dXJuICJkZXZpY2UgZGlzYWJsZWQiOworCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJcmV0dXJuICJkZXZpY2Ugc3VzcGVuZGVkIjsKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUFHQUlOOgorCWNhc2UgLUVGQklHOgorCWNhc2UgLUVNU0dTSVpFOgorCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24gZXJyb3IiOworCX0KK30KKworLyoKKyAqIHNldCB1cCBhbmQgc3RhcnQgZGF0YS9zeW5jIHVyYnMKKyAqLworc3RhdGljIGludCBzdGFydF91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJaWYgKHN1YnMtPnN0cmVhbS0+Y2hpcC0+c2h1dGRvd24pCisJCXJldHVybiAtRUJBREZEOworCisJZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKKwkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPmRhdGF1cmJbaV0udXJiKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3Vicy0+b3BzLnByZXBhcmUoc3VicywgcnVudGltZSwgc3Vicy0+ZGF0YXVyYltpXS51cmIpIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHByZXBhcmUgZGF0YXBpcGUgZm9yIHVyYiAlZFxuIiwgaSk7CisJCQlnb3RvIF9fZXJyb3I7CisJCX0KKwl9CisJaWYgKHN1YnMtPnN5bmNwaXBlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgeworCQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPnN5bmN1cmJbaV0udXJiKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHJ1bnRpbWUsIHN1YnMtPnN5bmN1cmJbaV0udXJiKSA8IDApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcHJlcGFyZSBzeW5jcGlwZSBmb3IgdXJiICVkXG4iLCBpKTsKKwkJCQlnb3RvIF9fZXJyb3I7CisJCQl9CisJCX0KKwl9CisKKwlzdWJzLT5hY3RpdmVfbWFzayA9IDA7CisJc3Vicy0+dW5saW5rX21hc2sgPSAwOworCXN1YnMtPnJ1bm5pbmcgPSAxOworCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHN1YnMtPmRhdGF1cmJbaV0udXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgZGF0YXBpcGUgIgorCQkJCSAgICJmb3IgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCisJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOworCQkJZ290byBfX2Vycm9yOworCQl9CisJCXNldF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKKwl9CisJaWYgKHN1YnMtPnN5bmNwaXBlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgeworCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIoc3Vicy0+c3luY3VyYltpXS51cmIsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHN5bmNwaXBlICIKKwkJCQkJICAgImZvciB1cmIgJWQsIGVycm9yICVkOiAlc1xuIiwKKwkJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOworCQkJCWdvdG8gX19lcnJvcjsKKwkJCX0KKwkJCXNldF9iaXQoaSArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOworCQl9CisJfQorCXJldHVybiAwOworCisgX19lcnJvcjoKKwkvLyBzbmRfcGNtX3N0b3Aoc3Vicy0+cGNtX3N1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCWRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKKwlyZXR1cm4gLUVQSVBFOworfQorCisKKy8qCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3VyYl9vcHMgYXVkaW9fdXJiX29wc1syXSA9IHsKKwl7CisJCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAorCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKKwkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCisJCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKKwl9LAorCXsKKwkJLnByZXBhcmUgPQlwcmVwYXJlX2NhcHR1cmVfdXJiLAorCQkucmV0aXJlID0JcmV0aXJlX2NhcHR1cmVfdXJiLAorCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9jYXB0dXJlX3N5bmNfdXJiLAorCQkucmV0aXJlX3N5bmMgPQlyZXRpcmVfY2FwdHVyZV9zeW5jX3VyYiwKKwl9LAorfTsKKworLyoKKyAqIGluaXRpYWxpemUgdGhlIHN1YnN0cmVhbSBpbnN0YW5jZS4KKyAqLworCit2b2lkIHNuZF91c2JfaW5pdF9zdWJzdHJlYW0oc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcywKKwkJCSAgICBpbnQgc3RyZWFtLCBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQoreworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07CisKKwlJTklUX0xJU1RfSEVBRCgmc3Vicy0+Zm10X2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzdWJzLT5sb2NrKTsKKworCXN1YnMtPnN0cmVhbSA9IGFzOworCXN1YnMtPmRpcmVjdGlvbiA9IHN0cmVhbTsKKwlzdWJzLT5kZXYgPSBhcy0+Y2hpcC0+ZGV2OworCXN1YnMtPnR4ZnJfcXVpcmsgPSBhcy0+Y2hpcC0+dHhmcl9xdWlyazsKKwlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzW3N0cmVhbV07CisJaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPj0gVVNCX1NQRUVEX0hJR0gpCisJCXN1YnMtPm9wcy5wcmVwYXJlX3N5bmMgPSBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHM7CisKKwlzbmRfdXNiX3NldF9wY21fb3BzKGFzLT5wY20sIHN0cmVhbSk7CisKKwlsaXN0X2FkZF90YWlsKCZmcC0+bGlzdCwgJnN1YnMtPmZtdF9saXN0KTsKKwlzdWJzLT5mb3JtYXRzIHw9IGZwLT5mb3JtYXRzOworCXN1YnMtPmVuZHBvaW50ID0gZnAtPmVuZHBvaW50OworCXN1YnMtPm51bV9mb3JtYXRzKys7CisJc3Vicy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7Cit9CisKK2ludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX3BsYXliYWNrX3VyYjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSB7Ci0JCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXM7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHVhYzJfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXAyID0KLQkJCShzdHJ1Y3QgdWFjMl9pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqKSBjc2VwOwotCi0JCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXMgJiBVQUNfRVBfQ1NfQVRUUl9GSUxMX01BWDsKLQotCQkvKiBlbXVsYXRlIHRoZSBlbmRwb2ludCBhdHRyaWJ1dGVzIG9mIGEgdjEgZGV2aWNlICovCi0JCWlmIChjc2VwMi0+Ym1Db250cm9scyAmIFVBQzJfQ09OVFJPTF9QSVRDSCkKLQkJCWF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfUElUQ0hfQ09OVFJPTDsKLQl9Ci0KLQlyZXR1cm4gYXR0cmlidXRlczsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKgotCXNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCi0JCQkJCSAgICAgICBpbnQgdGVybWluYWxfaWQpCitpbnQgc25kX3VzYl9zdWJzdHJlYW1fY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQogewotCXN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCi0Jd2hpbGUgKCh0ZXJtID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoY3RybF9pZmFjZS0+ZXh0cmEsCi0JCQkJCSAgICAgICBjdHJsX2lmYWNlLT5leHRyYWxlbiwKLQkJCQkJICAgICAgIHRlcm0sIFVBQ19JTlBVVF9URVJNSU5BTCkpKSB7Ci0JCWlmICh0ZXJtLT5iVGVybWluYWxJRCA9PSB0ZXJtaW5hbF9pZCkKLQkJCXJldHVybiB0ZXJtOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIHN0YXJ0X3VyYnMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lKTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXJldHVybiBkZWFjdGl2YXRlX3VyYnMoc3VicywgMCwgMCk7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX3BhdXNlZF9jYXB0dXJlX3VyYjsKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX2NhcHR1cmVfdXJiOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YWMyX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICoKLQlzbmRfdXNiX2ZpbmRfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqY3RybF9pZmFjZSwKLQkJCQkJCWludCB0ZXJtaW5hbF9pZCkKK2ludCBzbmRfdXNiX3N1YnN0cmVhbV9wcmVwYXJlKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCiB7Ci0Jc3RydWN0IHVhYzJfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCS8qIGNsZWFyIHVyYnMgKHRvIGJlIHN1cmUpICovCisJZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDEpOworCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKIAotCXdoaWxlICgodGVybSA9IHNuZF91c2JfZmluZF9jc2ludF9kZXNjKGN0cmxfaWZhY2UtPmV4dHJhLAotCQkJCQkgICAgICAgY3RybF9pZmFjZS0+ZXh0cmFsZW4sCi0JCQkJCSAgICAgICB0ZXJtLCBVQUNfT1VUUFVUX1RFUk1JTkFMKSkpIHsKLQkJaWYgKHRlcm0tPmJUZXJtaW5hbElEID09IHRlcm1pbmFsX2lkKQotCQkJcmV0dXJuIHRlcm07CisJLyogZm9yIHBsYXliYWNrLCBzdWJtaXQgdGhlIFVSQnMgbm93OyBvdGhlcndpc2UsIHRoZSBmaXJzdCBod3B0cl9kb25lCisJICogdXBkYXRlcyBmb3IgYWxsIFVSQnMgd291bGQgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBzdGFydGluZyAqLworCWlmIChzdWJzLT5kaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQlzdWJzLT5vcHMucHJlcGFyZSA9IHByZXBhcmVfbm9kYXRhX3BsYXliYWNrX3VyYjsKKwkJcmV0dXJuIHN0YXJ0X3VyYnMoc3VicywgcnVudGltZSk7CiAJfQogCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBzbmRfdXNiX3BhcnNlX2F1ZGlvX2VuZHBvaW50cyhzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgaW50IGlmYWNlX25vKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqYWx0c2Q7Ci0JaW50IGksIGFsdG5vLCBlcnIsIHN0cmVhbTsKLQlpbnQgZm9ybWF0ID0gMCwgbnVtX2NoYW5uZWxzID0gMDsKLQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwID0gTlVMTDsKLQlpbnQgbnVtLCBwcm90b2NvbCwgY2xvY2sgPSAwOwotCXN0cnVjdCB1YWNfZm9ybWF0X3R5cGVfaV9jb250aW51b3VzX2Rlc2NyaXB0b3IgKmZtdDsKLQotCWRldiA9IGNoaXAtPmRldjsKLQotCS8qIHBhcnNlIHRoZSBpbnRlcmZhY2UncyBhbHRzZXR0aW5ncyAqLwotCWlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKGRldiwgaWZhY2Vfbm8pOwotCi0JbnVtID0gaWZhY2UtPm51bV9hbHRzZXR0aW5nOwotCi0JLyoKLQkgKiBEYWxsYXMgRFM0MjAxIHdvcmthcm91bmQ6IEl0IHByZXNlbnRzIDUgYWx0c2V0dGluZ3MsIGJ1dCB0aGUgbGFzdAotCSAqIG9uZSBtaXNzZXMgc3luY3BpcGUsIGFuZCBkb2VzIG5vdCBwcm9kdWNlIGFueSBzb3VuZC4KLQkgKi8KLQlpZiAoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA0ZmEsIDB4NDIwMSkpCi0JCW51bSA9IDQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJYWx0cyA9ICZpZmFjZS0+YWx0c2V0dGluZ1tpXTsKLQkJYWx0c2QgPSBnZXRfaWZhY2VfZGVzYyhhbHRzKTsKLQkJcHJvdG9jb2wgPSBhbHRzZC0+YkludGVyZmFjZVByb3RvY29sOwotCQkvKiBza2lwIGludmFsaWQgb25lICovCi0JCWlmICgoYWx0c2QtPmJJbnRlcmZhY2VDbGFzcyAhPSBVU0JfQ0xBU1NfQVVESU8gJiYKLQkJICAgICBhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19WRU5ET1JfU1BFQykgfHwKLQkJICAgIChhbHRzZC0+YkludGVyZmFjZVN1YkNsYXNzICE9IFVTQl9TVUJDTEFTU19BVURJT1NUUkVBTUlORyAmJgotCQkgICAgIGFsdHNkLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gVVNCX1NVQkNMQVNTX1ZFTkRPUl9TUEVDKSB8fAotCQkgICAgYWx0c2QtPmJOdW1FbmRwb2ludHMgPCAxIHx8Ci0JCSAgICBsZTE2X3RvX2NwdShnZXRfZW5kcG9pbnQoYWx0cywgMCktPndNYXhQYWNrZXRTaXplKSA9PSAwKQotCQkJY29udGludWU7Ci0JCS8qIG11c3QgYmUgaXNvY2hyb25vdXMgKi8KLQkJaWYgKChnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPQotCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykKLQkJCWNvbnRpbnVlOwotCQkvKiBjaGVjayBkaXJlY3Rpb24gKi8KLQkJc3RyZWFtID0gKGdldF9lbmRwb2ludChhbHRzLCAwKS0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pID8KLQkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JCWFsdG5vID0gYWx0c2QtPmJBbHRlcm5hdGVTZXR0aW5nOwotCi0JCWlmIChzbmRfdXNiX2FwcGx5X2ludGVyZmFjZV9xdWlyayhjaGlwLCBpZmFjZV9ubywgYWx0bm8pKQotCQkJY29udGludWU7Ci0KLQkJLyogZ2V0IGF1ZGlvIGZvcm1hdHMgKi8KLQkJc3dpdGNoIChwcm90b2NvbCkgewotCQlkZWZhdWx0OgotCQkJc25kX3ByaW50ZGQoS0VSTl9XQVJOSU5HICIlZDoldTolZDogdW5rbm93biBpbnRlcmZhY2UgcHJvdG9jb2wgJSMwMngsIGFzc3VtaW5nIHYxXG4iLAotCQkJCSAgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vLCBwcm90b2NvbCk7Ci0JCQlwcm90b2NvbCA9IFVBQ19WRVJTSU9OXzE7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCQljYXNlIFVBQ19WRVJTSU9OXzE6IHsKLQkJCXN0cnVjdCB1YWMxX2FzX2hlYWRlcl9kZXNjcmlwdG9yICphcyA9Ci0JCQkJc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfQVNfR0VORVJBTCk7Ci0KLQkJCWlmICghYXMpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAotCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvcm1hdCA9IGxlMTZfdG9fY3B1KGFzLT53Rm9ybWF0VGFnKTsgLyogcmVtZW1iZXIgdGhlIGZvcm1hdCB2YWx1ZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFVBQ19WRVJTSU9OXzI6IHsKLQkJCXN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKmlucHV0X3Rlcm07Ci0JCQlzdHJ1Y3QgdWFjMl9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciAqb3V0cHV0X3Rlcm07Ci0JCQlzdHJ1Y3QgdWFjMl9hc19oZWFkZXJfZGVzY3JpcHRvciAqYXMgPQotCQkJCXNuZF91c2JfZmluZF9jc2ludF9kZXNjKGFsdHMtPmV4dHJhLCBhbHRzLT5leHRyYWxlbiwgTlVMTCwgVUFDX0FTX0dFTkVSQUwpOwotCi0JCQlpZiAoIWFzKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBVQUNfQVNfR0VORVJBTCBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuIiwKLQkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChhcy0+Ykxlbmd0aCA8IHNpemVvZigqYXMpKSB7Ci0JCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19BU19HRU5FUkFMIGRlc2NcbiIsCi0JCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQludW1fY2hhbm5lbHMgPSBhcy0+Yk5yQ2hhbm5lbHM7Ci0JCQlmb3JtYXQgPSBsZTMyX3RvX2NwdShhcy0+Ym1Gb3JtYXRzKTsKLQotCQkJLyogbG9va3VwIHRoZSB0ZXJtaW5hbCBhc3NvY2lhdGVkIHRvIHRoaXMgaW50ZXJmYWNlCi0JCQkgKiB0byBleHRyYWN0IHRoZSBjbG9jayAqLwotCQkJaW5wdXRfdGVybSA9IHNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKGNoaXAtPmN0cmxfaW50ZiwKLQkJCQkJCQkJCSAgICBhcy0+YlRlcm1pbmFsTGluayk7Ci0JCQlpZiAoaW5wdXRfdGVybSkgewotCQkJCWNsb2NrID0gaW5wdXRfdGVybS0+YkNTb3VyY2VJRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJb3V0cHV0X3Rlcm0gPSBzbmRfdXNiX2ZpbmRfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IoY2hpcC0+Y3RybF9pbnRmLAotCQkJCQkJCQkJICAgICAgYXMtPmJUZXJtaW5hbExpbmspOwotCQkJaWYgKG91dHB1dF90ZXJtKSB7Ci0JCQkJY2xvY2sgPSBvdXRwdXRfdGVybS0+YkNTb3VyY2VJRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBib2d1cyBiVGVybWluYWxMaW5rICVkXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGFzLT5iVGVybWluYWxMaW5rKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCX0KLQotCQkvKiBnZXQgZm9ybWF0IHR5cGUgKi8KLQkJZm10ID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfRk9STUFUX1RZUEUpOwotCQlpZiAoIWZtdCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBubyBVQUNfRk9STUFUX1RZUEUgZGVzY1xuIiwKLQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgoKHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEpICYmIChmbXQtPmJMZW5ndGggPCA4KSkgfHwKLQkJICAgICgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMikgJiYgKGZtdC0+Ykxlbmd0aCA8IDYpKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJWQ6JXU6JWQgOiBpbnZhbGlkIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAotCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBCbHVlIE1pY3JvcGhvbmVzIHdvcmthcm91bmQ6IFRoZSBsYXN0IGFsdHNldHRpbmcgaXMgaWRlbnRpY2FsCi0JCSAqIHdpdGggdGhlIHByZXZpb3VzIG9uZSwgZXhjZXB0IGZvciBhIGxhcmdlciBwYWNrZXQgc2l6ZSwgYnV0Ci0JCSAqIGlzIGFjdHVhbGx5IGEgbWlzbGFiZWxlZCB0d28tY2hhbm5lbCBzZXR0aW5nOyBpZ25vcmUgaXQuCi0JCSAqLwotCQlpZiAoZm10LT5iTnJDaGFubmVscyA9PSAxICYmCi0JCSAgICBmbXQtPmJTdWJmcmFtZVNpemUgPT0gMiAmJgotCQkgICAgYWx0bm8gPT0gMiAmJiBudW0gPT0gMyAmJgotCQkgICAgZnAgJiYgZnAtPmFsdHNldHRpbmcgPT0gMSAmJiBmcC0+Y2hhbm5lbHMgPT0gMSAmJgotCQkgICAgZnAtPmZvcm1hdHMgPT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgJiYKLQkJICAgIHByb3RvY29sID09IFVBQ19WRVJTSU9OXzEgJiYKLQkJICAgIGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpID09Ci0JCQkJCQkJZnAtPm1heHBhY2tzaXplICogMikKLQkJCWNvbnRpbnVlOwotCi0JCWZwID0ga3phbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghIGZwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgbWFsbG9jXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJZnAtPmlmYWNlID0gaWZhY2Vfbm87Ci0JCWZwLT5hbHRzZXR0aW5nID0gYWx0bm87Ci0JCWZwLT5hbHRzZXRfaWR4ID0gaTsKLQkJZnAtPmVuZHBvaW50ID0gZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iRW5kcG9pbnRBZGRyZXNzOwotCQlmcC0+ZXBfYXR0ciA9IGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzOwotCQlmcC0+ZGF0YWludGVydmFsID0gc25kX3VzYl9wYXJzZV9kYXRhaW50ZXJ2YWwoY2hpcCwgYWx0cyk7Ci0JCWZwLT5tYXhwYWNrc2l6ZSA9IGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpOwotCQkvKiBudW1fY2hhbm5lbHMgaXMgb25seSBzZXQgZm9yIHYyIGludGVyZmFjZXMgKi8KLQkJZnAtPmNoYW5uZWxzID0gbnVtX2NoYW5uZWxzOwotCQlpZiAoc25kX3VzYl9nZXRfc3BlZWQoZGV2KSA9PSBVU0JfU1BFRURfSElHSCkKLQkJCWZwLT5tYXhwYWNrc2l6ZSA9ICgoKGZwLT5tYXhwYWNrc2l6ZSA+PiAxMSkgJiAzKSArIDEpCi0JCQkJCSogKGZwLT5tYXhwYWNrc2l6ZSAmIDB4N2ZmKTsKLQkJZnAtPmF0dHJpYnV0ZXMgPSBwYXJzZV91YWNfZW5kcG9pbnRfYXR0cmlidXRlcyhjaGlwLCBhbHRzLCBwcm90b2NvbCwgaWZhY2Vfbm8pOwotCQlmcC0+Y2xvY2sgPSBjbG9jazsKLQotCQkvKiBzb21lIHF1aXJrcyBmb3IgYXR0cmlidXRlcyBoZXJlICovCi0KLQkJc3dpdGNoIChjaGlwLT51c2JfaWQpIHsKLQkJY2FzZSBVU0JfSUQoMHgwYTkyLCAweDAwNTMpOiAvKiBBdWRpb1RyYWsgT3B0b3BsYXkgKi8KLQkJCS8qIE9wdG9wbGF5IHNldHMgdGhlIHNhbXBsZSByYXRlIGF0dHJpYnV0ZSBhbHRob3VnaAotCQkJICogaXQgc2VlbXMgbm90IHN1cHBvcnRpbmcgaXQgaW4gZmFjdC4KLQkJCSAqLwotCQkJZnAtPmF0dHJpYnV0ZXMgJj0gflVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX0lEKDB4MDQxZSwgMHgzMDIwKTogLyogQ3JlYXRpdmUgU0IgQXVkaWd5IDIgTlggKi8KLQkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMDMpOiAvKiBNLUF1ZGlvIEF1ZGlvcGhpbGUgVVNCICovCi0JCQkvKiBkb2Vzbid0IHNldCB0aGUgc2FtcGxlIHJhdGUgYXR0cmlidXRlLCBidXQgc3VwcG9ydHMgaXQgKi8KLQkJCWZwLT5hdHRyaWJ1dGVzIHw9IFVBQ19FUF9DU19BVFRSX1NBTVBMRV9SQVRFOwotCQkJYnJlYWs7Ci0JCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDAxKTogIC8qIE0tQXVkaW8gUXVhdHRybyBVU0IgKi8KLQkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMTIpOiAgLyogTS1BdWRpbyBGYXN0IFRyYWNrIFBybyBVU0IgKi8KLQkJY2FzZSBVU0JfSUQoMHgwNDdmLCAweDBjYTEpOiAvKiBwbGFudHJvbmljcyBoZWFkc2V0ICovCi0JCWNhc2UgVVNCX0lEKDB4MDc3ZCwgMHgwN2FmKTogLyogR3JpZmZpbiBpTWljIChub3RlIHRoYXQgdGhlcmUgaXMKLQkJCQkJCWFuIG9sZGVyIG1vZGVsIDc3ZDoyMjMpICovCi0JCS8qCi0JCSAqIHBsYW50cm9uaWNzIGhlYWRzZXQgYW5kIEdyaWZmaW4gaU1pYyBoYXZlIHNldCBhZGFwdGl2ZS1pbgotCQkgKiBhbHRob3VnaCBpdCdzIHJlYWxseSBub3QuLi4KLQkJICovCi0JCQlmcC0+ZXBfYXR0ciAmPSB+VVNCX0VORFBPSU5UX1NZTkNUWVBFOwotCQkJaWYgKHN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJCWZwLT5lcF9hdHRyIHw9IFVTQl9FTkRQT0lOVF9TWU5DX0FEQVBUSVZFOwotCQkJZWxzZQotCQkJCWZwLT5lcF9hdHRyIHw9IFVTQl9FTkRQT0lOVF9TWU5DX1NZTkM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG9rLCBsZXQncyBwYXJzZSBmdXJ0aGVyLi4uICovCi0JCWlmIChzbmRfdXNiX3BhcnNlX2F1ZGlvX2Zvcm1hdChjaGlwLCBmcCwgZm9ybWF0LCBmbXQsIHN0cmVhbSwgYWx0cykgPCAwKSB7Ci0JCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7Ci0JCQlrZnJlZShmcCk7Ci0JCQlmcCA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiJWQ6JXU6JWQ6IGFkZCBhdWRpbyBlbmRwb2ludCAlI3hcbiIsIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIGZwLT5lbmRwb2ludCk7Ci0JCWVyciA9IHNuZF91c2JfYWRkX2F1ZGlvX2VuZHBvaW50KGNoaXAsIHN0cmVhbSwgZnApOwotCQlpZiAoZXJyIDwgMCkgewotCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOwotCQkJa2ZyZWUoZnApOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCQkvKiB0cnkgdG8gc2V0IHRoZSBpbnRlcmZhY2UuLi4gKi8KLQkJdXNiX3NldF9pbnRlcmZhY2UoY2hpcC0+ZGV2LCBpZmFjZV9ubywgYWx0bm8pOwotCQlzbmRfdXNiX2luaXRfcGl0Y2goY2hpcCwgaWZhY2Vfbm8sIGFsdHMsIGZwKTsKLQkJc25kX3VzYl9pbml0X3NhbXBsZV9yYXRlKGNoaXAsIGlmYWNlX25vLCBhbHRzLCBmcCwgZnAtPnJhdGVfbWF4KTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5oIGIvc291bmQvdXNiL2VuZHBvaW50LmgKaW5kZXggNjRkZDBkYi4uODhlYjYzYSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmgKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmgKQEAgLTEsMTEgKzEsMjEgQEAKICNpZm5kZWYgX19VU0JBVURJT19FTkRQT0lOVF9ICiAjZGVmaW5lIF9fVVNCQVVESU9fRU5EUE9JTlRfSAogCi1pbnQgc25kX3VzYl9wYXJzZV9hdWRpb19lbmRwb2ludHMoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCi0JCQkJICBpbnQgaWZhY2Vfbm8pOwordm9pZCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXMsCisJCQkgICAgaW50IHN0cmVhbSwKKwkJCSAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKTsKIAotaW50IHNuZF91c2JfYWRkX2F1ZGlvX2VuZHBvaW50KHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAotCQkJICAgICAgIGludCBzdHJlYW0sCi0JCQkgICAgICAgc3RydWN0IGF1ZGlvZm9ybWF0ICpmcCk7CitpbnQgc25kX3VzYl9pbml0X3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQl1bnNpZ25lZCBpbnQgcGVyaW9kX2J5dGVzLAorCQkJCXVuc2lnbmVkIGludCByYXRlLAorCQkJCXVuc2lnbmVkIGludCBmcmFtZV9iaXRzKTsKKwordm9pZCBzbmRfdXNiX3JlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBpbnQgZm9yY2UpOworCitpbnQgc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKTsKKworaW50IHNuZF91c2Jfc3Vic3RyZWFtX3BsYXliYWNrX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpOworaW50IHNuZF91c2Jfc3Vic3RyZWFtX2NhcHR1cmVfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCk7CiAKICNlbmRpZiAvKiBfX1VTQkFVRElPX0VORFBPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9mb3JtYXQuYyBiL3NvdW5kL3VzYi9mb3JtYXQuYwppbmRleCA4ZDA0MmRjLi44OTQyMWQxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZm9ybWF0LmMKKysrIGIvc291bmQvdXNiL2Zvcm1hdC5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAotCQkJICAgICAgdG1wLCBzaXplb2YodG1wKSwgMTAwMCk7CisJCQkgICAgICB0bXAsIHNpemVvZih0bXApKTsKIAogCWlmIChyZXQgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzKCk6IHVuYWJsZSB0byByZXRyaWV2ZSBudW1iZXIgb2Ygc2FtcGxlIHJhdGVzIChjbG9jayAlZClcbiIsCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJCSAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBVQUMyX0NTX0NPTlRST0xfU0FNX0ZSRVEgPDwgOCwKIAkJCSAgICAgIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGNsb2NrIDw8IDgpLAotCQkJICAgICAgZGF0YSwgZGF0YV9zaXplLCAxMDAwKTsKKwkJCSAgICAgIGRhdGEsIGRhdGFfc2l6ZSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlcygpOiB1bmFibGUgdG8gcmV0cmlldmUgc2FtcGxlIHJhdGUgcmFuZ2UgKGNsb2NrICVkKVxuIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9oZWxwZXIuYyBiL3NvdW5kL3VzYi9oZWxwZXIuYwppbmRleCBmMjgwYzE5Li45ZWVkOGY0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvaGVscGVyLmMKKysrIGIvc291bmQvdXNiL2hlbHBlci5jCkBAIC04MSw3ICs4MSw3IEBACiAgKi8KIGludCBzbmRfdXNiX2N0bF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsIF9fdTggcmVxdWVzdCwKIAkJICAgIF9fdTggcmVxdWVzdHR5cGUsIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCwgdm9pZCAqZGF0YSwKLQkJICAgIF9fdTE2IHNpemUsIGludCB0aW1lb3V0KQorCQkgICAgX191MTYgc2l6ZSkKIHsKIAlpbnQgZXJyOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CkBAIC05Miw3ICs5Miw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCi0JCQkgICAgICB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgdGltZW91dCk7CisJCQkgICAgICB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgMTAwMCk7CiAJaWYgKHNpemUgPiAwKSB7CiAJCW1lbWNweShkYXRhLCBidWYsIHNpemUpOwogCQlrZnJlZShidWYpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2hlbHBlci5oIGIvc291bmQvdXNiL2hlbHBlci5oCmluZGV4IDA5YmQ5NDMuLjgwNWMzMDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9oZWxwZXIuaAorKysgYi9zb3VuZC91c2IvaGVscGVyLmgKQEAgLTgsNyArOCw3IEBACiAKIGludCBzbmRfdXNiX2N0bF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCiAJCSAgICBfX3U4IHJlcXVlc3QsIF9fdTggcmVxdWVzdHR5cGUsIF9fdTE2IHZhbHVlLCBfX3UxNiBpbmRleCwKLQkJICAgIHZvaWQgKmRhdGEsIF9fdTE2IHNpemUsIGludCB0aW1lb3V0KTsKKwkJICAgIHZvaWQgKmRhdGEsIF9fdTE2IHNpemUpOwogCiB1bnNpZ25lZCBjaGFyIHNuZF91c2JfcGFyc2VfZGF0YWludGVydmFsKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAogCQkJCQkgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0cyk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWlkaS5jIGIvc291bmQvdXNiL21pZGkuYwppbmRleCBmOTI4OTEwLi5jODNmNjE0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9taWRpLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgpAQCAtODE2LDYgKzgxNywyMiBAQAogCS5vdXRwdXQgPSBzbmRfdXNibWlkaV9yYXdfb3V0cHV0LAogfTsKIAorLyoKKyAqIEZUREkgcHJvdG9jb2w6IHJhdyBNSURJIGJ5dGVzLCBidXQgaW5wdXQgcGFja2V0cyBoYXZlIHR3byBtb2RlbSBzdGF0dXMgYnl0ZXMuCisgKi8KKworc3RhdGljIHZvaWQgc25kX3VzYm1pZGlfZnRkaV9pbnB1dChzdHJ1Y3Qgc25kX3VzYl9taWRpX2luX2VuZHBvaW50KiBlcCwKKwkJCQkgICB1aW50OF90KiBidWZmZXIsIGludCBidWZmZXJfbGVuZ3RoKQoreworCWlmIChidWZmZXJfbGVuZ3RoID4gMikKKwkJc25kX3VzYm1pZGlfaW5wdXRfZGF0YShlcCwgMCwgYnVmZmVyICsgMiwgYnVmZmVyX2xlbmd0aCAtIDIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9wcm90b2NvbF9vcHMgc25kX3VzYm1pZGlfZnRkaV9vcHMgPSB7CisJLmlucHV0ID0gc25kX3VzYm1pZGlfZnRkaV9pbnB1dCwKKwkub3V0cHV0ID0gc25kX3VzYm1pZGlfcmF3X291dHB1dCwKK307CisKIHN0YXRpYyB2b2lkIHNuZF91c2JtaWRpX3VzMTIybF9pbnB1dChzdHJ1Y3Qgc25kX3VzYl9taWRpX2luX2VuZHBvaW50ICplcCwKIAkJCQkgICAgIHVpbnQ4X3QgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgpCiB7CkBAIC0yMTYzLDYgKzIxODAsMTcgQEAKIAkJLyogZW5kcG9pbnQgMSBpcyBpbnB1dC1vbmx5ICovCiAJCWVuZHBvaW50c1sxXS5vdXRfY2FibGVzID0gMDsKIAkJYnJlYWs7CisJY2FzZSBRVUlSS19NSURJX0ZUREk6CisJCXVtaWRpLT51c2JfcHJvdG9jb2xfb3BzID0gJnNuZF91c2JtaWRpX2Z0ZGlfb3BzOworCisJCS8qIHNldCBiYXVkIHJhdGUgdG8gMzEyNTAgKDQ4IE1IeiAvIDE2IC8gOTYpICovCisJCWVyciA9IHVzYl9jb250cm9sX21zZyh1bWlkaS0+ZGV2LCB1c2Jfc25kY3RybHBpcGUodW1pZGktPmRldiwgMCksCisJCQkJICAgICAgMywgMHg0MCwgMHg2MCwgMCwgTlVMTCwgMCwgMTAwMCk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJZXJyID0gc25kX3VzYm1pZGlfZGV0ZWN0X3Blcl9wb3J0X2VuZHBvaW50cyh1bWlkaSwgZW5kcG9pbnRzKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc25kX3ByaW50ZChLRVJOX0VSUiAiaW52YWxpZCBxdWlyayB0eXBlICVkXG4iLCBxdWlyay0+dHlwZSk7CiAJCWVyciA9IC1FTlhJTzsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMgYi9zb3VuZC91c2IvbWlzYy91YTEwMS5jCmluZGV4IDY3YmVjNzYuLmMwNjA5YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXNjL3VhMTAxLmMKKysrIGIvc291bmQvdXNiL21pc2MvdWExMDEuYwpAQCAtNDU5LDcgKzQ1OSw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkKLQkJdXNiX2tpbGxfdXJiKCZzdHJlYW0tPnVyYnNbaV0tPnVyYik7CisJCWlmIChzdHJlYW0tPnVyYnNbaV0pCisJCQl1c2Jfa2lsbF91cmIoJnN0cmVhbS0+dXJic1tpXS0+dXJiKTsKIH0KIAogc3RhdGljIGludCBlbmFibGVfaXNvX2ludGVyZmFjZShzdHJ1Y3QgdWExMDEgKnVhLCB1bnNpZ25lZCBpbnQgaW50Zl9pbmRleCkKQEAgLTQ4NCw2ICs0ODUsOSBAQAogewogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7CiAKKwlpZiAoIXVhLT5pbnRmW2ludGZfaW5kZXhdKQorCQlyZXR1cm47CisKIAlhbHRzID0gdWEtPmludGZbaW50Zl9pbmRleF0tPmN1cl9hbHRzZXR0aW5nOwogCWlmIChhbHRzLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nICE9IDApIHsKIAkJaW50IGVyciA9IHVzYl9zZXRfaW50ZXJmYWNlKHVhLT5kZXYsCkBAIC0xMTQ0LDI3ICsxMTQ4LDM3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5xdWV1ZV9sZW5ndGg7ICsraSkgewogCQlrZnJlZShzdHJlYW0tPnVyYnNbaV0pOworCQlzdHJlYW0tPnVyYnNbaV0gPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQgZnJlZV91c2JfcmVsYXRlZF9yZXNvdXJjZXMoc3RydWN0IHVhMTAxICp1YSwKIAkJCQkgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAorCW11dGV4X2xvY2soJnVhLT5tdXRleCk7CiAJZnJlZV9zdHJlYW1fdXJicygmdWEtPmNhcHR1cmUpOwogCWZyZWVfc3RyZWFtX3VyYnMoJnVhLT5wbGF5YmFjayk7CisJbXV0ZXhfdW5sb2NrKCZ1YS0+bXV0ZXgpOwogCWZyZWVfc3RyZWFtX2J1ZmZlcnModWEsICZ1YS0+Y2FwdHVyZSk7CiAJZnJlZV9zdHJlYW1fYnVmZmVycyh1YSwgJnVhLT5wbGF5YmFjayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1YS0+aW50Zik7ICsraSkKLQkJaWYgKHVhLT5pbnRmW2ldKSB7Ci0JCQl1c2Jfc2V0X2ludGZkYXRhKHVhLT5pbnRmW2ldLCBOVUxMKTsKLQkJCWlmICh1YS0+aW50ZltpXSAhPSBpbnRlcmZhY2UpCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWEtPmludGYpOyArK2kpIHsKKwkJbXV0ZXhfbG9jaygmdWEtPm11dGV4KTsKKwkJaW50ZiA9IHVhLT5pbnRmW2ldOworCQl1YS0+aW50ZltpXSA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmdWEtPm11dGV4KTsKKwkJaWYgKGludGYpIHsKKwkJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCQlpZiAoaW50ZiAhPSBpbnRlcmZhY2UpCiAJCQkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmdWExMDFfZHJpdmVyLAotCQkJCQkJCSAgICAgdWEtPmludGZbaV0pOworCQkJCQkJCSAgICAgaW50Zik7CiAJCX0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHVhMTAxX2NhcmRfZnJlZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuYyBiL3NvdW5kL3VzYi9taXhlci5jCmluZGV4IGNkZDE5ZDcuLmFiMjM4NjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhlci5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAkJaWYgKHNuZF91c2JfY3RsX21zZyhjaGlwLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShjaGlwLT5kZXYsIDApLCByZXF1ZXN0LAogCQkJCSAgICBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOLAogCQkJCSAgICB2YWxpZHgsIHNuZF91c2JfY3RybF9pbnRmKGNoaXApIHwgKGN2YWwtPmlkIDw8IDgpLAotCQkJCSAgICBidWYsIHZhbF9sZW4sIDEwMCkgPj0gdmFsX2xlbikgeworCQkJCSAgICBidWYsIHZhbF9sZW4pID49IHZhbF9sZW4pIHsKIAkJCSp2YWx1ZV9yZXQgPSBjb252ZXJ0X3NpZ25lZF92YWx1ZShjdmFsLCBzbmRfdXNiX2NvbWJpbmVfYnl0ZXMoYnVmLCB2YWxfbGVuKSk7CiAJCQlzbmRfdXNiX2F1dG9zdXNwZW5kKGN2YWwtPm1peGVyLT5jaGlwKTsKIAkJCXJldHVybiAwOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJcmV0ID0gc25kX3VzYl9jdGxfbXNnKGNoaXAtPmRldiwgdXNiX3JjdmN0cmxwaXBlKGNoaXAtPmRldiwgMCksIGJSZXF1ZXN0LAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgIHZhbGlkeCwgc25kX3VzYl9jdHJsX2ludGYoY2hpcCkgfCAoY3ZhbC0+aWQgPDwgOCksCi0JCQkgICAgICBidWYsIHNpemUsIDEwMDApOworCQkJICAgICAgYnVmLCBzaXplKTsKIAlzbmRfdXNiX2F1dG9zdXNwZW5kKGNoaXApOwogCiAJaWYgKHJldCA8IDApIHsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoY2hpcC0+ZGV2LCAwKSwgcmVxdWVzdCwKIAkJCQkgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQsCiAJCQkJICAgIHZhbGlkeCwgc25kX3VzYl9jdHJsX2ludGYoY2hpcCkgfCAoY3ZhbC0+aWQgPDwgOCksCi0JCQkJICAgIGJ1ZiwgdmFsX2xlbiwgMTAwKSA+PSAwKSB7CisJCQkJICAgIGJ1ZiwgdmFsX2xlbikgPj0gMCkgewogCQkJc25kX3VzYl9hdXRvc3VzcGVuZChjaGlwKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC03NjUsMTAgKzc2NSw2MSBAQAogICogaW50ZXJmYWNlIHRvIEFMU0EgY29udHJvbCBmb3IgZmVhdHVyZS9taXhlciB1bml0cwogICovCiAKKy8qIHZvbHVtZSBjb250cm9sIHF1aXJrcyAqLworc3RhdGljIHZvaWQgdm9sdW1lX2NvbnRyb2xfcXVpcmtzKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCkKK3sKKwlzd2l0Y2ggKGN2YWwtPm1peGVyLT5jaGlwLT51c2JfaWQpIHsKKwljYXNlIFVTQl9JRCgweDA0NzEsIDB4MDEwMSk6CisJY2FzZSBVU0JfSUQoMHgwNDcxLCAweDAxMDQpOgorCWNhc2UgVVNCX0lEKDB4MDQ3MSwgMHgwMTA1KToKKwljYXNlIFVTQl9JRCgweDA2NzIsIDB4MTA0MSk6CisJLyogcXVpcmsgZm9yIFVEQTEzMjEvTjEwMS4KKwkgKiBub3RlIHRoYXQgZGV0ZWN0aW9uIGJldHdlZW4gZmlybXdhcmUgMi4xLjEuNyAoTjEwMSkKKwkgKiBhbmQgbGF0ZXIgMi4xLjEuMjEgaXMgbm90IHZlcnkgY2xlYXIgZnJvbSBkYXRhc2hlZXRzLgorCSAqIEkgaG9wZSB0aGF0IHRoZSBtaW4gdmFsdWUgaXMgLTE1MzYwIGZvciBuZXdlciBmaXJtd2FyZSAtLWprCisJICovCisJCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJQQ00gUGxheWJhY2sgVm9sdW1lIikgJiYKKwkJICAgIGN2YWwtPm1pbiA9PSAtMTU2MTYpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQkJICJzZXQgdm9sdW1lIHF1aXJrIGZvciBVREExMzIxL04xMDEgY2hpcFxuIik7CisJCQljdmFsLT5tYXggPSAtMjU2OworCQl9CisJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5YTQpOgorCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKKwkJCXNuZF9wcmludGsoS0VSTl9JTkZPCisJCQkJInNldCB2b2x1bWUgcXVpcmsgZm9yIFF1aWNrQ2FtIEUzNTAwXG4iKTsKKwkJCWN2YWwtPm1pbiA9IDYwODA7CisJCQljdmFsLT5tYXggPSA4NzY4OworCQkJY3ZhbC0+cmVzID0gMTkyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA4MDgpOgorCWNhc2UgVVNCX0lEKDB4MDQ2ZCwgMHgwODA5KToKKwljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDgxZCk6IC8qIEhEIFdlYmNhbSBjNTEwICovCisJY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA5OTEpOgorCS8qIE1vc3QgYXVkaW8gdXNiIGRldmljZXMgbGllIGFib3V0IHZvbHVtZSByZXNvbHV0aW9uLgorCSAqIE1vc3QgTG9naXRlY2ggd2ViY2FtcyBoYXZlIHJlcyA9IDM4NC4KKwkgKiBQcm9ib2x5IHRoZXJlIGlzIHNvbWUgbG9naXRlY2ggbWFnaWMgYmVoaW5kIHRoaXMgbnVtYmVyIC0tZmlzaG9yCisJICovCisJCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJNaWMgQ2FwdHVyZSBWb2x1bWUiKSkgeworCQkJc25kX3ByaW50ayhLRVJOX0lORk8KKwkJCQkic2V0IHJlc29sdXRpb24gcXVpcms6IGN2YWwtPnJlcyA9IDM4NFxuIik7CisJCQljdmFsLT5yZXMgPSAzODQ7CisJCX0KKwkJYnJlYWs7CisKKwl9Cit9CisKIC8qCiAgKiByZXRyaWV2ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29udHJvbAogICovCi1zdGF0aWMgaW50IGdldF9taW5fbWF4KHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLCBpbnQgZGVmYXVsdF9taW4pCitzdGF0aWMgaW50IGdldF9taW5fbWF4X3dpdGhfcXVpcmtzKHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLAorCQkJCSAgIGludCBkZWZhdWx0X21pbiwgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCkKIHsKIAkvKiBmb3IgZmFpbHNhZmUgKi8KIAljdmFsLT5taW4gPSBkZWZhdWx0X21pbjsKQEAgLTg0NCw2ICs4OTUsOSBAQAogCQljdmFsLT5pbml0aWFsaXplZCA9IDE7CiAJfQogCisJaWYgKGtjdGwpCisJCXZvbHVtZV9jb250cm9sX3F1aXJrcyhjdmFsLCBrY3RsKTsKKwogCS8qIFVTQiBkZXNjcmlwdGlvbnMgY29udGFpbiB0aGUgZEIgc2NhbGUgaW4gMS8yNTYgZEIgdW5pdAogCSAqIHdoaWxlIEFMU0EgVExWIGNvbnRhaW5zIGluIDEvMTAwIGRCIHVuaXQKIAkgKi8KQEAgLTg2NCw2ICs5MTgsNyBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIGdldF9taW5fbWF4KGN2YWwsIGRlZikJZ2V0X21pbl9tYXhfd2l0aF9xdWlya3MoY3ZhbCwgZGVmLCBOVUxMKQogCiAvKiBnZXQgYSBmZWF0dXJlL21peGVyIHVuaXQgaW5mbyAqLwogc3RhdGljIGludCBtaXhlcl9jdGxfZmVhdHVyZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQpAQCAtODgxLDggKzkzNiwxNyBAQAogCQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwogCQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxOwogCX0gZWxzZSB7Ci0JCWlmICghIGN2YWwtPmluaXRpYWxpemVkKQotCQkJZ2V0X21pbl9tYXgoY3ZhbCwgIDApOworCQlpZiAoIWN2YWwtPmluaXRpYWxpemVkKSB7CisJCQlnZXRfbWluX21heF93aXRoX3F1aXJrcyhjdmFsLCAwLCBrY29udHJvbCk7CisJCQlpZiAoY3ZhbC0+aW5pdGlhbGl6ZWQgJiYgY3ZhbC0+ZEJtaW4gPj0gY3ZhbC0+ZEJtYXgpIHsKKwkJCQlrY29udHJvbC0+dmRbMF0uYWNjZXNzICY9IAorCQkJCQl+KFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8CisJCQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSyk7CisJCQkJc25kX2N0bF9ub3RpZnkoY3ZhbC0+bWl4ZXItPmNoaXAtPmNhcmQsCisJCQkJCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLAorCQkJCQkgICAgICAgJmtjb250cm9sLT5pZCk7CisJCQl9CisJCX0KIAkJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKIAkJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0KIAkJCShjdmFsLT5tYXggLSBjdmFsLT5taW4gKyBjdmFsLT5yZXMgLSAxKSAvIGN2YWwtPnJlczsKQEAgLTEwMzYsOSArMTEwMCw2IEBACiAJCWN2YWwtPmNoX3JlYWRvbmx5ID0gcmVhZG9ubHlfbWFzazsKIAl9CiAKLQkvKiBnZXQgbWluL21heCB2YWx1ZXMgKi8KLQlnZXRfbWluX21heChjdmFsLCAwKTsKLQogCS8qIGlmIGFsbCBjaGFubmVscyBpbiB0aGUgbWFzayBhcmUgbWFya2VkIHJlYWQtb25seSwgbWFrZSB0aGUgY29udHJvbAogCSAqIHJlYWQtb25seS4gc2V0X2N1cl9taXhfdmFsdWUoKSB3aWxsIGNoZWNrIHRoZSBtYXNrIGFnYWluIGFuZCB3b24ndAogCSAqIGlzc3VlIHdyaXRlIGNvbW1hbmRzIHRvIHJlYWQtb25seSBjaGFubmVscy4gKi8KQEAgLTEwNjAsNiArMTEyMSw5IEBACiAJCWxlbiA9IHNuZF91c2JfY29weV9zdHJpbmdfZGVzYyhzdGF0ZSwgbmFtZWlkLAogCQkJCWtjdGwtPmlkLm5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CiAKKwkvKiBnZXQgbWluL21heCB2YWx1ZXMgKi8KKwlnZXRfbWluX21heF93aXRoX3F1aXJrcyhjdmFsLCAwLCBrY3RsKTsKKwogCXN3aXRjaCAoY29udHJvbCkgewogCWNhc2UgVUFDX0ZVX01VVEU6CiAJY2FzZSBVQUNfRlVfVk9MVU1FOgpAQCAtMTEwOSw1MSArMTE3Myw2IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIHZvbHVtZSBjb250cm9sIHF1aXJrcyAqLwotCXN3aXRjaCAoc3RhdGUtPmNoaXAtPnVzYl9pZCkgewotCWNhc2UgVVNCX0lEKDB4MDQ3MSwgMHgwMTAxKToKLQljYXNlIFVTQl9JRCgweDA0NzEsIDB4MDEwNCk6Ci0JY2FzZSBVU0JfSUQoMHgwNDcxLCAweDAxMDUpOgotCWNhc2UgVVNCX0lEKDB4MDY3MiwgMHgxMDQxKToKLQkvKiBxdWlyayBmb3IgVURBMTMyMS9OMTAxLgotCSAqIG5vdGUgdGhhdCBkZXRlY3Rpb24gYmV0d2VlbiBmaXJtd2FyZSAyLjEuMS43IChOMTAxKQotCSAqIGFuZCBsYXRlciAyLjEuMS4yMSBpcyBub3QgdmVyeSBjbGVhciBmcm9tIGRhdGFzaGVldHMuCi0JICogSSBob3BlIHRoYXQgdGhlIG1pbiB2YWx1ZSBpcyAtMTUzNjAgZm9yIG5ld2VyIGZpcm13YXJlIC0tamsKLQkgKi8KLQkJaWYgKCFzdHJjbXAoa2N0bC0+aWQubmFtZSwgIlBDTSBQbGF5YmFjayBWb2x1bWUiKSAmJgotCQkgICAgY3ZhbC0+bWluID09IC0xNTYxNikgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkgInNldCB2b2x1bWUgcXVpcmsgZm9yIFVEQTEzMjEvTjEwMSBjaGlwXG4iKTsKLQkJCWN2YWwtPm1heCA9IC0yNTY7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDlhNCk6Ci0JCWlmICghc3RyY21wKGtjdGwtPmlkLm5hbWUsICJNaWMgQ2FwdHVyZSBWb2x1bWUiKSkgewotCQkJc25kX3ByaW50ayhLRVJOX0lORk8KLQkJCQkic2V0IHZvbHVtZSBxdWlyayBmb3IgUXVpY2tDYW0gRTM1MDBcbiIpOwotCQkJY3ZhbC0+bWluID0gNjA4MDsKLQkJCWN2YWwtPm1heCA9IDg3Njg7Ci0JCQljdmFsLT5yZXMgPSAxOTI7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9JRCgweDA0NmQsIDB4MDgwOCk6Ci0JY2FzZSBVU0JfSUQoMHgwNDZkLCAweDA4MDkpOgotCWNhc2UgVVNCX0lEKDB4MDQ2ZCwgMHgwOTkxKToKLQkvKiBNb3N0IGF1ZGlvIHVzYiBkZXZpY2VzIGxpZSBhYm91dCB2b2x1bWUgcmVzb2x1dGlvbi4KLQkgKiBNb3N0IExvZ2l0ZWNoIHdlYmNhbXMgaGF2ZSByZXMgPSAzODQuCi0JICogUHJvYm9seSB0aGVyZSBpcyBzb21lIGxvZ2l0ZWNoIG1hZ2ljIGJlaGluZCB0aGlzIG51bWJlciAtLWZpc2hvcgotCSAqLwotCQlpZiAoIXN0cmNtcChrY3RsLT5pZC5uYW1lLCAiTWljIENhcHR1cmUgVm9sdW1lIikpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9JTkZPCi0JCQkJInNldCByZXNvbHV0aW9uIHF1aXJrOiBjdmFsLT5yZXMgPSAzODRcbiIpOwotCQkJY3ZhbC0+cmVzID0gMzg0OwotCQl9Ci0JCWJyZWFrOwotCi0JfQotCiAJcmFuZ2UgPSAoY3ZhbC0+bWF4IC0gY3ZhbC0+bWluKSAvIGN2YWwtPnJlczsKIAkvKiBBcmUgdGhlcmUgZGV2aWNlcyB3aXRoIHZvbHVtZSByYW5nZSBtb3JlIHRoYW4gMjU1PyBJIHVzZSBhIGJpdCBtb3JlCiAJICogdG8gYmUgc3VyZS4gMzg0IGlzIGEgcmVzb2x1dGlvbiBtYWdpYyBudW1iZXIgZm91bmQgb24gTG9naXRlY2gKQEAgLTEyNTAsNyArMTI2OSw3IEBACiAJCQkJYnVpbGRfZmVhdHVyZV9jdGwoc3RhdGUsIF9mdHIsIDAsIGksICZpdGVybSwgdW5pdGlkLCAwKTsKIAkJfQogCX0gZWxzZSB7IC8qIFVBQ19WRVJTSU9OXzIgKi8KLQkJZm9yIChpID0gMDsgaSA8IDMwLzI7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdWRpb19mZWF0dXJlX2luZm8pOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCBjaF9iaXRzID0gMDsKIAkJCXVuc2lnbmVkIGludCBjaF9yZWFkX29ubHkgPSAwOwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggM2QwZjQ4Ny4uYWIxMjVlZSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwpAQCAtMTkwLDE4ICsxOTAsMTggQEAKIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKG1peGVyLT5jaGlwLT5kZXYsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksIDB4MjQsCiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCSAgICAgICF2YWx1ZSwgMCwgTlVMTCwgMCwgMTAwKTsKKwkJCSAgICAgICF2YWx1ZSwgMCwgTlVMTCwgMCk7CiAJLyogVVNCIFgtRmkgUzUxIFBybyAqLwogCWlmIChtaXhlci0+Y2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA0MWUsIDB4MzBkZikpCiAJCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ZGV2LAogCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLCAweDI0LAogCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfT1RIRVIsCi0JCQkgICAgICAhdmFsdWUsIDAsIE5VTEwsIDAsIDEwMCk7CisJCQkgICAgICAhdmFsdWUsIDAsIE5VTEwsIDApOwogCWVsc2UKIAkJZXJyID0gc25kX3VzYl9jdGxfbXNnKG1peGVyLT5jaGlwLT5kZXYsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksIDB4MjQsCiAJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCSAgICAgIHZhbHVlLCBpbmRleCArIDIsIE5VTEwsIDAsIDEwMCk7CisJCQkgICAgICB2YWx1ZSwgaW5kZXggKyAyLCBOVUxMLCAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltaXhlci0+YXVkaWd5Mm54X2xlZHNbaW5kZXhdID0gdmFsdWU7CkBAIC0yOTksNyArMjk5LDcgQEAKIAkJCQkgICAgICB1c2JfcmN2Y3RybHBpcGUobWl4ZXItPmNoaXAtPmRldiwgMCksCiAJCQkJICAgICAgVUFDX0dFVF9NRU0sIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8CiAJCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwKLQkJCQkgICAgICBqYWNrc1tpXS51bml0aWQgPDwgOCwgYnVmLCAzLCAxMDApOworCQkJCSAgICAgIGphY2tzW2ldLnVuaXRpZCA8PCA4LCBidWYsIDMpOwogCQlpZiAoZXJyID09IDMgJiYgKGJ1ZlswXSA9PSAzIHx8IGJ1ZlswXSA9PSA2KSkKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMnggJTAyeFxuIiwgYnVmWzFdLCBidWZbMl0pOwogCQllbHNlCkBAIC0zMzIsNyArMzMyLDcgQEAKIAllcnIgPSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKIAkJCSAgICAgIHVzYl9zbmRjdHJscGlwZShtaXhlci0+Y2hpcC0+ZGV2LCAwKSwgMHgwOCwKIAkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX09USEVSLAotCQkJICAgICAgNTAsIDAsICZuZXdfc3RhdHVzLCAxLCAxMDApOworCQkJICAgICAgNTAsIDAsICZuZXdfc3RhdHVzLCAxKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltaXhlci0+eG9uYXJfdTFfc3RhdHVzID0gbmV3X3N0YXR1czsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uYyBiL3NvdW5kL3VzYi9wY20uYwppbmRleCBiOGRjYmY0Li4wMjIwYjBmIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmMKKysrIGIvc291bmQvdXNiL3BjbS5jCkBAIC0yOCwxMiArMjgsMzYgQEAKICNpbmNsdWRlICJjYXJkLmgiCiAjaW5jbHVkZSAicXVpcmtzLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ1cmIuaCIKKyNpbmNsdWRlICJlbmRwb2ludC5oIgogI2luY2x1ZGUgImhlbHBlci5oIgogI2luY2x1ZGUgInBjbS5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKIAorLyogcmV0dXJuIHRoZSBlc3RpbWF0ZWQgZGVsYXkgYmFzZWQgb24gVVNCIGZyYW1lIGNvdW50ZXJzICovCitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdXNiX3BjbV9kZWxheShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCWludCBjdXJyZW50X2ZyYW1lX251bWJlcjsKKwlpbnQgZnJhbWVfZGlmZjsKKwlpbnQgZXN0X2RlbGF5OworCisJY3VycmVudF9mcmFtZV9udW1iZXIgPSB1c2JfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHN1YnMtPmRldik7CisJLyoKKwkgKiBIQ0QgaW1wbGVtZW50YXRpb25zIHVzZSBkaWZmZXJlbnQgd2lkdGhzLCB1c2UgbG93ZXIgOCBiaXRzLgorCSAqIFRoZSBkZWxheSB3aWxsIGJlIG1hbmFnZWQgdXAgdG8gMjU2bXMsIHdoaWNoIGlzIG1vcmUgdGhhbgorCSAqIGVub3VnaAorCSAqLworCWZyYW1lX2RpZmYgPSAoY3VycmVudF9mcmFtZV9udW1iZXIgLSBzdWJzLT5sYXN0X2ZyYW1lX251bWJlcikgJiAweGZmOworCisJLyogQXBwcm94aW1hdGlvbiBiYXNlZCBvbiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgVVNCIGZyYW1lIChtcyksCisJICAgc29tZSB0cnVuY2F0aW9uIGZvciA0NC4xIGJ1dCB0aGUgZXN0aW1hdGUgaXMgZ29vZCBlbm91Z2ggKi8KKwllc3RfZGVsYXkgPSAgc3Vicy0+bGFzdF9kZWxheSAtIChmcmFtZV9kaWZmICogcmF0ZSAvIDEwMDApOworCWlmIChlc3RfZGVsYXkgPCAwKQorCQllc3RfZGVsYXkgPSAwOworCXJldHVybiBlc3RfZGVsYXk7Cit9CisKIC8qCiAgKiByZXR1cm4gdGhlIGN1cnJlbnQgcGNtIHBvaW50ZXIuICBqdXN0IGJhc2VkIG9uIHRoZSBod3B0cl9kb25lIHZhbHVlLgogICovCkBAIC00NSw2ICs2OSw4IEBACiAJc3VicyA9IChzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKilzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlzcGluX2xvY2soJnN1YnMtPmxvY2spOwogCWh3cHRyX2RvbmUgPSBzdWJzLT5od3B0cl9kb25lOworCXN1YnN0cmVhbS0+cnVudGltZS0+ZGVsYXkgPSBzbmRfdXNiX3BjbV9kZWxheShzdWJzLAorCQkJCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKIAlzcGluX3VubG9jaygmc3Vicy0+bG9jayk7CiAJcmV0dXJuIGh3cHRyX2RvbmUgLyAoc3Vic3RyZWFtLT5ydW50aW1lLT5mcmFtZV9iaXRzID4+IDMpOwogfQpAQCAtMTI2LDcgKzE1Miw3IEBACiAJaWYgKChlcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVUFDX1NFVF9DVVIsCiAJCQkJICAgVVNCX1RZUEVfQ0xBU1N8VVNCX1JFQ0lQX0VORFBPSU5UfFVTQl9ESVJfT1VULAogCQkJCSAgIFVBQ19FUF9DU19BVFRSX1BJVENIX0NPTlRST0wgPDwgOCwgZXAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSFxuIiwKIAkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZSwgZXApOwogCQlyZXR1cm4gZXJyOwpAQCAtMTUwLDcgKzE3Niw3IEBACiAJaWYgKChlcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVUFDMl9DU19DVVIsCiAJCQkJICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfRU5EUE9JTlQgfCBVU0JfRElSX09VVCwKIAkJCQkgICBVQUMyX0VQX0NTX1BJVENIIDw8IDgsIDAsCi0JCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpLCAxMDAwKSkgPCAwKSB7CisJCQkJICAgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPCAwKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiVkOiVkOiBjYW5ub3Qgc2V0IGVuYWJsZSBQSVRDSCAodjIpXG4iLAogCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDE3LDYgKzQ0Myw4IEBACiAJc3Vicy0+aHdwdHJfZG9uZSA9IDA7CiAJc3Vicy0+dHJhbnNmZXJfZG9uZSA9IDA7CiAJc3Vicy0+cGhhc2UgPSAwOworCXN1YnMtPmxhc3RfZGVsYXkgPSAwOworCXN1YnMtPmxhc3RfZnJhbWVfbnVtYmVyID0gMDsKIAlydW50aW1lLT5kZWxheSA9IDA7CiAKIAlyZXR1cm4gc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdWJzLCBydW50aW1lKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uaCBiL3NvdW5kL3VzYi9wY20uaAppbmRleCBlZDNlMjgzLi5kZjdhMDAzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmgKKysrIGIvc291bmQvdXNiL3BjbS5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfX1VTQkFVRElPX1BDTV9ICiAjZGVmaW5lIF9fVVNCQVVESU9fUENNX0gKIAorc25kX3BjbV91ZnJhbWVzX3Qgc25kX3VzYl9wY21fZGVsYXkoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSk7CisKIHZvaWQgc25kX3VzYl9zZXRfcGNtX29wcyhzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKTsKIAogaW50IHNuZF91c2JfaW5pdF9waXRjaChzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgaW50IGlmYWNlLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oIGIvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oCmluZGV4IGE0MmUzZWYuLmI2MTk0NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MtdGFibGUuaAorKysgYi9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmgKQEAgLTM5LDYgKzM5LDE3IEBACiAJLmlkUHJvZHVjdCA9IHByb2QsIFwKIAkuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDCiAKKy8qIEZUREkgZGV2aWNlcyAqLworeworCVVTQl9ERVZJQ0UoMHgwNDAzLCAweGI4ZDgpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyaykgeworCQkvKiAudmVuZG9yX25hbWUgPSAiU1RBUlIgTEFCUyIsICovCisJCS8qIC5wcm9kdWN0X25hbWUgPSAiU3RhcnIgTGFicyBNSURJIFVTQiBkZXZpY2UiLCAqLworCQkuaWZudW0gPSAwLAorCQkudHlwZSA9IFFVSVJLX01JRElfRlRESQorCX0KK30sCisKIC8qIENyZWF0aXZlL1Rvc2hpYmEgTXVsdGltZWRpYSBDZW50ZXIgU0ItMDUwMCAqLwogewogCVVTQl9ERVZJQ0UoMHgwNDFlLCAweDMwNDgpLApAQCAtMTY3OCw2ICsxNjg5LDIwIEBACiAJfQogfSwKIHsKKwkvKiBBZGRlZCBzdXBwb3J0IGZvciBSb2xhbmQgVU0tT05FIHdoaWNoIGRpZmZlcnMgZnJvbSBVTS0xICovCisJVVNCX0RFVklDRSgweDA1ODIsIDB4MDEyYSksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CisJCS8qIC52ZW5kb3JfbmFtZSA9ICJST0xBTkQiLCAqLworCQkvKiAucHJvZHVjdF9uYW1lID0gIlVNLU9ORSIsICovCisJCS5pZm51bSA9IDAsCisJCS50eXBlID0gUVVJUktfTUlESV9GSVhFRF9FTkRQT0lOVCwKKwkJLmRhdGEgPSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9taWRpX2VuZHBvaW50X2luZm8pIHsKKwkJCS5vdXRfY2FibGVzID0gMHgwMDAxLAorCQkJLmluX2NhYmxlcyAgPSAweDAwMDMKKwkJfQorCX0KK30sCit7CiAJVVNCX0RFVklDRSgweDA1ODIsIDB4MDExZSksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CiAJCS8qIC52ZW5kb3JfbmFtZSA9ICJCT1NTIiwgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWlya3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCA4MWUwN2Q4Li5hM2RkYWMwIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL3F1aXJrcy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiZW5kcG9pbnQuaCIKICNpbmNsdWRlICJwY20uaCIKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInN0cmVhbS5oIgogCiAvKgogICogaGFuZGxlIHRoZSBxdWlya3MgZm9yIHRoZSBjb250YWluZWQgaW50ZXJmYWNlcwpAQCAtMTA2LDcgKzEwNyw3IEBACiAKIAlhbHRzID0gJmlmYWNlLT5hbHRzZXR0aW5nWzBdOwogCWFsdHNkID0gZ2V0X2lmYWNlX2Rlc2MoYWx0cyk7Ci0JZXJyID0gc25kX3VzYl9wYXJzZV9hdWRpb19lbmRwb2ludHMoY2hpcCwgYWx0c2QtPmJJbnRlcmZhY2VOdW1iZXIpOworCWVyciA9IHNuZF91c2JfcGFyc2VfYXVkaW9faW50ZXJmYWNlKGNoaXAsIGFsdHNkLT5iSW50ZXJmYWNlTnVtYmVyKTsKIAlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc2V0dXAgaWYgJWQ6IGVycm9yICVkXG4iLAogCQkJICAgYWx0c2QtPmJJbnRlcmZhY2VOdW1iZXIsIGVycik7CkBAIC0xMzYsMTggKzEzNywxOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKGZwLT5ucl9yYXRlcyA+IDApIHsKLQkJcmF0ZV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBmcC0+bnJfcmF0ZXMsIEdGUF9LRVJORUwpOworCQlyYXRlX3RhYmxlID0ga21lbWR1cChmcC0+cmF0ZV90YWJsZSwKKwkJCQkgICAgIHNpemVvZihpbnQpICogZnAtPm5yX3JhdGVzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFyYXRlX3RhYmxlKSB7CiAJCQlrZnJlZShmcCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1jcHkocmF0ZV90YWJsZSwgZnAtPnJhdGVfdGFibGUsIHNpemVvZihpbnQpICogZnAtPm5yX3JhdGVzKTsKIAkJZnAtPnJhdGVfdGFibGUgPSByYXRlX3RhYmxlOwogCX0KIAogCXN0cmVhbSA9IChmcC0+ZW5kcG9pbnQgJiBVU0JfRElSX0lOKQogCQk/IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlKGZwKTsKIAkJa2ZyZWUocmF0ZV90YWJsZSk7CkBAIC0yMjMsMTAgKzIyNCw5IEBACiAJaWYgKGFsdHNkLT5iTnVtRW5kcG9pbnRzICE9IDEpCiAJCXJldHVybiAtRU5YSU87CiAKLQlmcCA9IGttYWxsb2Moc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOworCWZwID0ga21lbWR1cCgmdWFfZm9ybWF0LCBzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGZwLCAmdWFfZm9ybWF0LCBzaXplb2YoKmZwKSk7CiAKIAlmcC0+aWZhY2UgPSBhbHRzZC0+YkludGVyZmFjZU51bWJlcjsKIAlmcC0+ZW5kcG9pbnQgPSBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJFbmRwb2ludEFkZHJlc3M7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAogCXN0cmVhbSA9IChmcC0+ZW5kcG9pbnQgJiBVU0JfRElSX0lOKQogCQk/IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fZW5kcG9pbnQoY2hpcCwgc3RyZWFtLCBmcCk7CisJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOwogCWlmIChlcnIgPCAwKSB7CiAJCWtmcmVlKGZwKTsKIAkJcmV0dXJuIGVycjsKQEAgLTMwNiw2ICszMDYsNyBAQAogCQlbUVVJUktfTUlESV9FTUFHSUNdID0gY3JlYXRlX2FueV9taWRpX3F1aXJrLAogCQlbUVVJUktfTUlESV9DTUVdID0gY3JlYXRlX2FueV9taWRpX3F1aXJrLAogCQlbUVVJUktfTUlESV9BS0FJXSA9IGNyZWF0ZV9hbnlfbWlkaV9xdWlyaywKKwkJW1FVSVJLX01JRElfRlRESV0gPSBjcmVhdGVfYW55X21pZGlfcXVpcmssCiAJCVtRVUlSS19BVURJT19TVEFOREFSRF9JTlRFUkZBQ0VdID0gY3JlYXRlX3N0YW5kYXJkX2F1ZGlvX3F1aXJrLAogCQlbUVVJUktfQVVESU9fRklYRURfRU5EUE9JTlRdID0gY3JlYXRlX2ZpeGVkX3N0cmVhbV9xdWlyaywKIAkJW1FVSVJLX0FVRElPX0VESVJPTF9VQVhYXSA9IGNyZWF0ZV91YXh4X3F1aXJrLApAQCAtMzM4LDcgKzMzOSw3IEBACiAJCXNuZF9wcmludGRkKCJzZW5kaW5nIEV4dGlneSBib290IHNlcXVlbmNlLi4uXG4iKTsKIAkJLyogU2VuZCBtZXNzYWdlIHRvIGZvcmNlIGl0IHRvIHJlY29ubmVjdCB3aXRoIGZ1bGwgaW50ZXJmYWNlLiAqLwogCQllcnIgPSBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LDApLAotCQkJCSAgICAgIDB4MTAsIDB4NDMsIDB4MDAwMSwgMHgwMDBhLCBOVUxMLCAwLCAxMDAwKTsKKwkJCQkgICAgICAweDEwLCAweDQzLCAweDAwMDEsIDB4MDAwYSwgTlVMTCwgMCk7CiAJCWlmIChlcnIgPCAwKSBzbmRfcHJpbnRkZCgiZXJyb3Igc2VuZGluZyBib290IG1lc3NhZ2U6ICVkXG4iLCBlcnIpOwogCQllcnIgPSB1c2JfZ2V0X2Rlc2NyaXB0b3IoZGV2LCBVU0JfRFRfREVWSUNFLCAwLAogCQkJCSZkZXYtPmRlc2NyaXB0b3IsIHNpemVvZihkZXYtPmRlc2NyaXB0b3IpKTsKQEAgLTM1OSwxMSArMzYwLDExIEBACiAKIAlzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwgMHgyYSwKIAkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfT1RIRVIsCi0JCQkwLCAwLCAmYnVmLCAxLCAxMDAwKTsKKwkJCTAsIDAsICZidWYsIDEpOwogCWlmIChidWYgPT0gMCkgewogCQlzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgMHgyOSwKIAkJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKLQkJCQkxLCAyMDAwLCBOVUxMLCAwLCAxMDAwKTsKKwkJCQkxLCAyMDAwLCBOVUxMLCAwKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXJldHVybiAwOwpAQCAtNDA2LDcgKzQwNyw3IEBACiAJYnVmWzNdID0gcmVnOwogCXJldHVybiBzbmRfdXNiX2N0bF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwKIAkJCSAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0VORFBPSU5ULAotCQkJICAgICAgIDAsIDAsICZidWYsIDQsIDEwMDApOworCQkJICAgICAgIDAsIDAsICZidWYsIDQpOwogfQogCiBzdGF0aWMgaW50IHNuZF91c2JfY20xMDZfYm9vdF9xdWlyayhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3N0cmVhbS5jIGIvc291bmQvdXNiL3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjgwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2Ivc3RyZWFtLmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvYXVkaW8tdjIuaD4KKworI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworI2luY2x1ZGUgInVzYmF1ZGlvLmgiCisjaW5jbHVkZSAiY2FyZC5oIgorI2luY2x1ZGUgInByb2MuaCIKKyNpbmNsdWRlICJxdWlya3MuaCIKKyNpbmNsdWRlICJlbmRwb2ludC5oIgorI2luY2x1ZGUgInBjbS5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorI2luY2x1ZGUgImZvcm1hdC5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAic3RyZWFtLmgiCisKKy8qCisgKiBmcmVlIGEgc3Vic3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCWlmICghc3Vicy0+bnVtX2Zvcm1hdHMpCisJCXJldHVybjsgLyogbm90IGluaXRpYWxpemVkICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzdWJzLT5mbXRfbGlzdCkgeworCQlzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYXVkaW9mb3JtYXQsIGxpc3QpOworCQlrZnJlZShmcC0+cmF0ZV90YWJsZSk7CisJCWtmcmVlKGZwKTsKKwl9CisJa2ZyZWUoc3Vicy0+cmF0ZV9saXN0Lmxpc3QpOworfQorCisKKy8qCisgKiBmcmVlIGEgdXNiIHN0cmVhbSBpbnN0YW5jZQorICovCitzdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3N0cmVhbV9mcmVlKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqc3RyZWFtKQoreworCWZyZWVfc3Vic3RyZWFtKCZzdHJlYW0tPnN1YnN0cmVhbVswXSk7CisJZnJlZV9zdWJzdHJlYW0oJnN0cmVhbS0+c3Vic3RyZWFtWzFdKTsKKwlsaXN0X2RlbCgmc3RyZWFtLT5saXN0KTsKKwlrZnJlZShzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBzbmRfdXNiX2F1ZGlvX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJc3RydWN0IHNuZF91c2Jfc3RyZWFtICpzdHJlYW0gPSBwY20tPnByaXZhdGVfZGF0YTsKKwlpZiAoc3RyZWFtKSB7CisJCXN0cmVhbS0+cGNtID0gTlVMTDsKKwkJc25kX3VzYl9hdWRpb19zdHJlYW1fZnJlZShzdHJlYW0pOworCX0KK30KKworCisvKgorICogYWRkIHRoaXMgZW5kcG9pbnQgdG8gdGhlIGNoaXAgaW5zdGFuY2UuCisgKiBpZiBhIHN0cmVhbSB3aXRoIHRoZSBzYW1lIGVuZHBvaW50IGFscmVhZHkgZXhpc3RzLCBhcHBlbmQgdG8gaXQuCisgKiBpZiBub3QsIGNyZWF0ZSBhIG5ldyBwY20gc3RyZWFtLgorICovCitpbnQgc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJICAgICBpbnQgc3RyZWFtLAorCQkJICAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphczsKKwlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnM7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlpbnQgZXJyOworCisJbGlzdF9mb3JfZWFjaChwLCAmY2hpcC0+cGNtX2xpc3QpIHsKKwkJYXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzbmRfdXNiX3N0cmVhbSwgbGlzdCk7CisJCWlmIChhcy0+Zm10X3R5cGUgIT0gZnAtPmZtdF90eXBlKQorCQkJY29udGludWU7CisJCXN1YnMgPSAmYXMtPnN1YnN0cmVhbVtzdHJlYW1dOworCQlpZiAoIXN1YnMtPmVuZHBvaW50KQorCQkJY29udGludWU7CisJCWlmIChzdWJzLT5lbmRwb2ludCA9PSBmcC0+ZW5kcG9pbnQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmZwLT5saXN0LCAmc3Vicy0+Zm10X2xpc3QpOworCQkJc3Vicy0+bnVtX2Zvcm1hdHMrKzsKKwkJCXN1YnMtPmZvcm1hdHMgfD0gZnAtPmZvcm1hdHM7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiBsb29rIGZvciBhbiBlbXB0eSBzdHJlYW0gKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZjaGlwLT5wY21fbGlzdCkgeworCQlhcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF91c2Jfc3RyZWFtLCBsaXN0KTsKKwkJaWYgKGFzLT5mbXRfdHlwZSAhPSBmcC0+Zm10X3R5cGUpCisJCQljb250aW51ZTsKKwkJc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07CisJCWlmIChzdWJzLT5lbmRwb2ludCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBzbmRfcGNtX25ld19zdHJlYW0oYXMtPnBjbSwgc3RyZWFtLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzbmRfdXNiX2luaXRfc3Vic3RyZWFtKGFzLCBzdHJlYW0sIGZwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY3JlYXRlIGEgbmV3IHBjbSAqLworCWFzID0ga3phbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcykKKwkJcmV0dXJuIC1FTk9NRU07CisJYXMtPnBjbV9pbmRleCA9IGNoaXAtPnBjbV9kZXZzOworCWFzLT5jaGlwID0gY2hpcDsKKwlhcy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7CisJZXJyID0gc25kX3BjbV9uZXcoY2hpcC0+Y2FyZCwgIlVTQiBBdWRpbyIsIGNoaXAtPnBjbV9kZXZzLAorCQkJICBzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDEgOiAwLAorCQkJICBzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/IDAgOiAxLAorCQkJICAmcGNtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShhcyk7CisJCXJldHVybiBlcnI7CisJfQorCWFzLT5wY20gPSBwY207CisJcGNtLT5wcml2YXRlX2RhdGEgPSBhczsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF91c2JfYXVkaW9fcGNtX2ZyZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlpZiAoY2hpcC0+cGNtX2RldnMgPiAwKQorCQlzcHJpbnRmKHBjbS0+bmFtZSwgIlVTQiBBdWRpbyAjJWQiLCBjaGlwLT5wY21fZGV2cyk7CisJZWxzZQorCQlzdHJjcHkocGNtLT5uYW1lLCAiVVNCIEF1ZGlvIik7CisKKwlzbmRfdXNiX2luaXRfc3Vic3RyZWFtKGFzLCBzdHJlYW0sIGZwKTsKKworCWxpc3RfYWRkKCZhcy0+bGlzdCwgJmNoaXAtPnBjbV9saXN0KTsKKwljaGlwLT5wY21fZGV2cysrOworCisJc25kX3VzYl9wcm9jX3BjbV9mb3JtYXRfYWRkKGFzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3VhY19lbmRwb2ludF9hdHRyaWJ1dGVzKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLAorCQkJCQkgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0cywKKwkJCQkJIGludCBwcm90b2NvbCwgaW50IGlmYWNlX25vKQoreworCS8qIHBhcnNlZCB3aXRoIGEgdjEgaGVhZGVyIGhlcmUuIHRoYXQncyBvayBhcyB3ZSBvbmx5IGxvb2sgYXQgdGhlCisJICogaGVhZGVyIGZpcnN0IHdoaWNoIGlzIHRoZSBzYW1lIGZvciBib3RoIHZlcnNpb25zICovCisJc3RydWN0IHVhY19pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqY3NlcDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICphbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCWludCBhdHRyaWJ1dGVzID0gMDsKKworCWNzZXAgPSBzbmRfdXNiX2ZpbmRfZGVzYyhhbHRzLT5lbmRwb2ludFswXS5leHRyYSwgYWx0cy0+ZW5kcG9pbnRbMF0uZXh0cmFsZW4sIE5VTEwsIFVTQl9EVF9DU19FTkRQT0lOVCk7CisKKwkvKiBDcmVhbXdhcmUgTm9haCBoYXMgdGhpcyBkZXNjcmlwdG9yIGFmdGVyIHRoZSAybmQgZW5kcG9pbnQgKi8KKwlpZiAoIWNzZXAgJiYgYWx0c2QtPmJOdW1FbmRwb2ludHMgPj0gMikKKwkJY3NlcCA9IHNuZF91c2JfZmluZF9kZXNjKGFsdHMtPmVuZHBvaW50WzFdLmV4dHJhLCBhbHRzLT5lbmRwb2ludFsxXS5leHRyYWxlbiwgTlVMTCwgVVNCX0RUX0NTX0VORFBPSU5UKTsKKworCWlmICghY3NlcCB8fCBjc2VwLT5iTGVuZ3RoIDwgNyB8fAorCSAgICBjc2VwLT5iRGVzY3JpcHRvclN1YnR5cGUgIT0gVUFDX0VQX0dFTkVSQUwpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgIiVkOiV1OiVkIDogbm8gb3IgaW52YWxpZCIKKwkJCSAgICIgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKKwkJCSAgIGNoaXAtPmRldi0+ZGV2bnVtLCBpZmFjZV9ubywKKwkJCSAgIGFsdHNkLT5iQWx0ZXJuYXRlU2V0dGluZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8xKSB7CisJCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IHVhYzJfaXNvX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmNzZXAyID0KKwkJCShzdHJ1Y3QgdWFjMl9pc29fZW5kcG9pbnRfZGVzY3JpcHRvciAqKSBjc2VwOworCisJCWF0dHJpYnV0ZXMgPSBjc2VwLT5ibUF0dHJpYnV0ZXMgJiBVQUNfRVBfQ1NfQVRUUl9GSUxMX01BWDsKKworCQkvKiBlbXVsYXRlIHRoZSBlbmRwb2ludCBhdHRyaWJ1dGVzIG9mIGEgdjEgZGV2aWNlICovCisJCWlmIChjc2VwMi0+Ym1Db250cm9scyAmIFVBQzJfQ09OVFJPTF9QSVRDSCkKKwkJCWF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfUElUQ0hfQ09OVFJPTDsKKwl9CisKKwlyZXR1cm4gYXR0cmlidXRlczsKK30KKworc3RhdGljIHN0cnVjdCB1YWMyX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKgorCXNuZF91c2JfZmluZF9pbnB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCisJCQkJCSAgICAgICBpbnQgdGVybWluYWxfaWQpCit7CisJc3RydWN0IHVhYzJfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciAqdGVybSA9IE5VTEw7CisKKwl3aGlsZSAoKHRlcm0gPSBzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhjdHJsX2lmYWNlLT5leHRyYSwKKwkJCQkJICAgICAgIGN0cmxfaWZhY2UtPmV4dHJhbGVuLAorCQkJCQkgICAgICAgdGVybSwgVUFDX0lOUFVUX1RFUk1JTkFMKSkpIHsKKwkJaWYgKHRlcm0tPmJUZXJtaW5hbElEID09IHRlcm1pbmFsX2lkKQorCQkJcmV0dXJuIHRlcm07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWFjMl9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvciAqCisJc25kX3VzYl9maW5kX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmN0cmxfaWZhY2UsCisJCQkJCQlpbnQgdGVybWluYWxfaWQpCit7CisJc3RydWN0IHVhYzJfb3V0cHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IgKnRlcm0gPSBOVUxMOworCisJd2hpbGUgKCh0ZXJtID0gc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoY3RybF9pZmFjZS0+ZXh0cmEsCisJCQkJCSAgICAgICBjdHJsX2lmYWNlLT5leHRyYWxlbiwKKwkJCQkJICAgICAgIHRlcm0sIFVBQ19PVVRQVVRfVEVSTUlOQUwpKSkgeworCQlpZiAodGVybS0+YlRlcm1pbmFsSUQgPT0gdGVybWluYWxfaWQpCisJCQlyZXR1cm4gdGVybTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHNuZF91c2JfcGFyc2VfYXVkaW9faW50ZXJmYWNlKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgaWZhY2Vfbm8pCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2U7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0czsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICphbHRzZDsKKwlpbnQgaSwgYWx0bm8sIGVyciwgc3RyZWFtOworCWludCBmb3JtYXQgPSAwLCBudW1fY2hhbm5lbHMgPSAwOworCXN0cnVjdCBhdWRpb2Zvcm1hdCAqZnAgPSBOVUxMOworCWludCBudW0sIHByb3RvY29sLCBjbG9jayA9IDA7CisJc3RydWN0IHVhY19mb3JtYXRfdHlwZV9pX2NvbnRpbnVvdXNfZGVzY3JpcHRvciAqZm10OworCisJZGV2ID0gY2hpcC0+ZGV2OworCisJLyogcGFyc2UgdGhlIGludGVyZmFjZSdzIGFsdHNldHRpbmdzICovCisJaWZhY2UgPSB1c2JfaWZudW1fdG9faWYoZGV2LCBpZmFjZV9ubyk7CisKKwludW0gPSBpZmFjZS0+bnVtX2FsdHNldHRpbmc7CisKKwkvKgorCSAqIERhbGxhcyBEUzQyMDEgd29ya2Fyb3VuZDogSXQgcHJlc2VudHMgNSBhbHRzZXR0aW5ncywgYnV0IHRoZSBsYXN0CisJICogb25lIG1pc3NlcyBzeW5jcGlwZSwgYW5kIGRvZXMgbm90IHByb2R1Y2UgYW55IHNvdW5kLgorCSAqLworCWlmIChjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MDRmYSwgMHg0MjAxKSkKKwkJbnVtID0gNDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlhbHRzID0gJmlmYWNlLT5hbHRzZXR0aW5nW2ldOworCQlhbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOworCQlwcm90b2NvbCA9IGFsdHNkLT5iSW50ZXJmYWNlUHJvdG9jb2w7CisJCS8qIHNraXAgaW52YWxpZCBvbmUgKi8KKwkJaWYgKChhbHRzZC0+YkludGVyZmFjZUNsYXNzICE9IFVTQl9DTEFTU19BVURJTyAmJgorCQkgICAgIGFsdHNkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKSB8fAorCQkgICAgKGFsdHNkLT5iSW50ZXJmYWNlU3ViQ2xhc3MgIT0gVVNCX1NVQkNMQVNTX0FVRElPU1RSRUFNSU5HICYmCisJCSAgICAgYWx0c2QtPmJJbnRlcmZhY2VTdWJDbGFzcyAhPSBVU0JfU1VCQ0xBU1NfVkVORE9SX1NQRUMpIHx8CisJCSAgICBhbHRzZC0+Yk51bUVuZHBvaW50cyA8IDEgfHwKKwkJICAgIGxlMTZfdG9fY3B1KGdldF9lbmRwb2ludChhbHRzLCAwKS0+d01heFBhY2tldFNpemUpID09IDApCisJCQljb250aW51ZTsKKwkJLyogbXVzdCBiZSBpc29jaHJvbm91cyAqLworCQlpZiAoKGdldF9lbmRwb2ludChhbHRzLCAwKS0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9CisJCSAgICBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQorCQkJY29udGludWU7CisJCS8qIGNoZWNrIGRpcmVjdGlvbiAqLworCQlzdHJlYW0gPSAoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgPworCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFIDogU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKKwkJYWx0bm8gPSBhbHRzZC0+YkFsdGVybmF0ZVNldHRpbmc7CisKKwkJaWYgKHNuZF91c2JfYXBwbHlfaW50ZXJmYWNlX3F1aXJrKGNoaXAsIGlmYWNlX25vLCBhbHRubykpCisJCQljb250aW51ZTsKKworCQkvKiBnZXQgYXVkaW8gZm9ybWF0cyAqLworCQlzd2l0Y2ggKHByb3RvY29sKSB7CisJCWRlZmF1bHQ6CisJCQlzbmRfcHJpbnRkZChLRVJOX1dBUk5JTkcgIiVkOiV1OiVkOiB1bmtub3duIGludGVyZmFjZSBwcm90b2NvbCAlIzAyeCwgYXNzdW1pbmcgdjFcbiIsCisJCQkJICAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8sIHByb3RvY29sKTsKKwkJCXByb3RvY29sID0gVUFDX1ZFUlNJT05fMTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgVUFDX1ZFUlNJT05fMTogeworCQkJc3RydWN0IHVhYzFfYXNfaGVhZGVyX2Rlc2NyaXB0b3IgKmFzID0KKwkJCQlzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19BU19HRU5FUkFMKTsKKworCQkJaWYgKCFhcykgeworCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogVUFDX0FTX0dFTkVSQUwgZGVzY3JpcHRvciBub3QgZm91bmRcbiIsCisJCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoYXMtPmJMZW5ndGggPCBzaXplb2YoKmFzKSkgeworCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVkOiV1OiVkIDogaW52YWxpZCBVQUNfQVNfR0VORVJBTCBkZXNjXG4iLAorCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9ybWF0ID0gbGUxNl90b19jcHUoYXMtPndGb3JtYXRUYWcpOyAvKiByZW1lbWJlciB0aGUgZm9ybWF0IHZhbHVlICovCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVUFDX1ZFUlNJT05fMjogeworCQkJc3RydWN0IHVhYzJfaW5wdXRfdGVybWluYWxfZGVzY3JpcHRvciAqaW5wdXRfdGVybTsKKwkJCXN0cnVjdCB1YWMyX291dHB1dF90ZXJtaW5hbF9kZXNjcmlwdG9yICpvdXRwdXRfdGVybTsKKwkJCXN0cnVjdCB1YWMyX2FzX2hlYWRlcl9kZXNjcmlwdG9yICphcyA9CisJCQkJc25kX3VzYl9maW5kX2NzaW50X2Rlc2MoYWx0cy0+ZXh0cmEsIGFsdHMtPmV4dHJhbGVuLCBOVUxMLCBVQUNfQVNfR0VORVJBTCk7CisKKwkJCWlmICghYXMpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IFVBQ19BU19HRU5FUkFMIGRlc2NyaXB0b3Igbm90IGZvdW5kXG4iLAorCQkJCQkgICBkZXYtPmRldm51bSwgaWZhY2Vfbm8sIGFsdG5vKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGFzLT5iTGVuZ3RoIDwgc2l6ZW9mKCphcykpIHsKKwkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0FTX0dFTkVSQUwgZGVzY1xuIiwKKwkJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW51bV9jaGFubmVscyA9IGFzLT5iTnJDaGFubmVsczsKKwkJCWZvcm1hdCA9IGxlMzJfdG9fY3B1KGFzLT5ibUZvcm1hdHMpOworCisJCQkvKiBsb29rdXAgdGhlIHRlcm1pbmFsIGFzc29jaWF0ZWQgdG8gdGhpcyBpbnRlcmZhY2UKKwkJCSAqIHRvIGV4dHJhY3QgdGhlIGNsb2NrICovCisJCQlpbnB1dF90ZXJtID0gc25kX3VzYl9maW5kX2lucHV0X3Rlcm1pbmFsX2Rlc2NyaXB0b3IoY2hpcC0+Y3RybF9pbnRmLAorCQkJCQkJCQkJICAgIGFzLT5iVGVybWluYWxMaW5rKTsKKwkJCWlmIChpbnB1dF90ZXJtKSB7CisJCQkJY2xvY2sgPSBpbnB1dF90ZXJtLT5iQ1NvdXJjZUlEOworCQkJCWJyZWFrOworCQkJfQorCisJCQlvdXRwdXRfdGVybSA9IHNuZF91c2JfZmluZF9vdXRwdXRfdGVybWluYWxfZGVzY3JpcHRvcihjaGlwLT5jdHJsX2ludGYsCisJCQkJCQkJCQkgICAgICBhcy0+YlRlcm1pbmFsTGluayk7CisJCQlpZiAob3V0cHV0X3Rlcm0pIHsKKwkJCQljbG9jayA9IG91dHB1dF90ZXJtLT5iQ1NvdXJjZUlEOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGJvZ3VzIGJUZXJtaW5hbExpbmsgJWRcbiIsCisJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubywgYXMtPmJUZXJtaW5hbExpbmspOworCQkJY29udGludWU7CisJCX0KKwkJfQorCisJCS8qIGdldCBmb3JtYXQgdHlwZSAqLworCQlmbXQgPSBzbmRfdXNiX2ZpbmRfY3NpbnRfZGVzYyhhbHRzLT5leHRyYSwgYWx0cy0+ZXh0cmFsZW4sIE5VTEwsIFVBQ19GT1JNQVRfVFlQRSk7CisJCWlmICghZm10KSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IG5vIFVBQ19GT1JNQVRfVFlQRSBkZXNjXG4iLAorCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCgocHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSkgJiYgKGZtdC0+Ykxlbmd0aCA8IDgpKSB8fAorCQkgICAgKChwcm90b2NvbCA9PSBVQUNfVkVSU0lPTl8yKSAmJiAoZm10LT5iTGVuZ3RoIDwgNikpKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IGludmFsaWQgVUFDX0ZPUk1BVF9UWVBFIGRlc2NcbiIsCisJCQkJICAgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEJsdWUgTWljcm9waG9uZXMgd29ya2Fyb3VuZDogVGhlIGxhc3QgYWx0c2V0dGluZyBpcyBpZGVudGljYWwKKwkJICogd2l0aCB0aGUgcHJldmlvdXMgb25lLCBleGNlcHQgZm9yIGEgbGFyZ2VyIHBhY2tldCBzaXplLCBidXQKKwkJICogaXMgYWN0dWFsbHkgYSBtaXNsYWJlbGVkIHR3by1jaGFubmVsIHNldHRpbmc7IGlnbm9yZSBpdC4KKwkJICovCisJCWlmIChmbXQtPmJOckNoYW5uZWxzID09IDEgJiYKKwkJICAgIGZtdC0+YlN1YmZyYW1lU2l6ZSA9PSAyICYmCisJCSAgICBhbHRubyA9PSAyICYmIG51bSA9PSAzICYmCisJCSAgICBmcCAmJiBmcC0+YWx0c2V0dGluZyA9PSAxICYmIGZwLT5jaGFubmVscyA9PSAxICYmCisJCSAgICBmcC0+Zm9ybWF0cyA9PSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSAmJgorCQkgICAgcHJvdG9jb2wgPT0gVUFDX1ZFUlNJT05fMSAmJgorCQkgICAgbGUxNl90b19jcHUoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT53TWF4UGFja2V0U2l6ZSkgPT0KKwkJCQkJCQlmcC0+bWF4cGFja3NpemUgKiAyKQorCQkJY29udGludWU7CisKKwkJZnAgPSBremFsbG9jKHNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEgZnApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBtYWxsb2NcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlmcC0+aWZhY2UgPSBpZmFjZV9ubzsKKwkJZnAtPmFsdHNldHRpbmcgPSBhbHRubzsKKwkJZnAtPmFsdHNldF9pZHggPSBpOworCQlmcC0+ZW5kcG9pbnQgPSBnZXRfZW5kcG9pbnQoYWx0cywgMCktPmJFbmRwb2ludEFkZHJlc3M7CisJCWZwLT5lcF9hdHRyID0gZ2V0X2VuZHBvaW50KGFsdHMsIDApLT5ibUF0dHJpYnV0ZXM7CisJCWZwLT5kYXRhaW50ZXJ2YWwgPSBzbmRfdXNiX3BhcnNlX2RhdGFpbnRlcnZhbChjaGlwLCBhbHRzKTsKKwkJZnAtPm1heHBhY2tzaXplID0gbGUxNl90b19jcHUoZ2V0X2VuZHBvaW50KGFsdHMsIDApLT53TWF4UGFja2V0U2l6ZSk7CisJCS8qIG51bV9jaGFubmVscyBpcyBvbmx5IHNldCBmb3IgdjIgaW50ZXJmYWNlcyAqLworCQlmcC0+Y2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisJCWlmIChzbmRfdXNiX2dldF9zcGVlZChkZXYpID09IFVTQl9TUEVFRF9ISUdIKQorCQkJZnAtPm1heHBhY2tzaXplID0gKCgoZnAtPm1heHBhY2tzaXplID4+IDExKSAmIDMpICsgMSkKKwkJCQkJKiAoZnAtPm1heHBhY2tzaXplICYgMHg3ZmYpOworCQlmcC0+YXR0cmlidXRlcyA9IHBhcnNlX3VhY19lbmRwb2ludF9hdHRyaWJ1dGVzKGNoaXAsIGFsdHMsIHByb3RvY29sLCBpZmFjZV9ubyk7CisJCWZwLT5jbG9jayA9IGNsb2NrOworCisJCS8qIHNvbWUgcXVpcmtzIGZvciBhdHRyaWJ1dGVzIGhlcmUgKi8KKworCQlzd2l0Y2ggKGNoaXAtPnVzYl9pZCkgeworCQljYXNlIFVTQl9JRCgweDBhOTIsIDB4MDA1Myk6IC8qIEF1ZGlvVHJhayBPcHRvcGxheSAqLworCQkJLyogT3B0b3BsYXkgc2V0cyB0aGUgc2FtcGxlIHJhdGUgYXR0cmlidXRlIGFsdGhvdWdoCisJCQkgKiBpdCBzZWVtcyBub3Qgc3VwcG9ydGluZyBpdCBpbiBmYWN0LgorCQkJICovCisJCQlmcC0+YXR0cmlidXRlcyAmPSB+VUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEU7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfSUQoMHgwNDFlLCAweDMwMjApOiAvKiBDcmVhdGl2ZSBTQiBBdWRpZ3kgMiBOWCAqLworCQljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAwMyk6IC8qIE0tQXVkaW8gQXVkaW9waGlsZSBVU0IgKi8KKwkJCS8qIGRvZXNuJ3Qgc2V0IHRoZSBzYW1wbGUgcmF0ZSBhdHRyaWJ1dGUsIGJ1dCBzdXBwb3J0cyBpdCAqLworCQkJZnAtPmF0dHJpYnV0ZXMgfD0gVUFDX0VQX0NTX0FUVFJfU0FNUExFX1JBVEU7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwMDEpOiAgLyogTS1BdWRpbyBRdWF0dHJvIFVTQiAqLworCQljYXNlIFVTQl9JRCgweDA3NjMsIDB4MjAxMik6ICAvKiBNLUF1ZGlvIEZhc3QgVHJhY2sgUHJvIFVTQiAqLworCQljYXNlIFVTQl9JRCgweDA0N2YsIDB4MGNhMSk6IC8qIHBsYW50cm9uaWNzIGhlYWRzZXQgKi8KKwkJY2FzZSBVU0JfSUQoMHgwNzdkLCAweDA3YWYpOiAvKiBHcmlmZmluIGlNaWMgKG5vdGUgdGhhdCB0aGVyZSBpcworCQkJCQkJYW4gb2xkZXIgbW9kZWwgNzdkOjIyMykgKi8KKwkJLyoKKwkJICogcGxhbnRyb25pY3MgaGVhZHNldCBhbmQgR3JpZmZpbiBpTWljIGhhdmUgc2V0IGFkYXB0aXZlLWluCisJCSAqIGFsdGhvdWdoIGl0J3MgcmVhbGx5IG5vdC4uLgorCQkgKi8KKwkJCWZwLT5lcF9hdHRyICY9IH5VU0JfRU5EUE9JTlRfU1lOQ1RZUEU7CisJCQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCQkJZnAtPmVwX2F0dHIgfD0gVVNCX0VORFBPSU5UX1NZTkNfQURBUFRJVkU7CisJCQllbHNlCisJCQkJZnAtPmVwX2F0dHIgfD0gVVNCX0VORFBPSU5UX1NZTkNfU1lOQzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogb2ssIGxldCdzIHBhcnNlIGZ1cnRoZXIuLi4gKi8KKwkJaWYgKHNuZF91c2JfcGFyc2VfYXVkaW9fZm9ybWF0KGNoaXAsIGZwLCBmb3JtYXQsIGZtdCwgc3RyZWFtLCBhbHRzKSA8IDApIHsKKwkJCWtmcmVlKGZwLT5yYXRlX3RhYmxlKTsKKwkJCWtmcmVlKGZwKTsKKwkJCWZwID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICIlZDoldTolZDogYWRkIGF1ZGlvIGVuZHBvaW50ICUjeFxuIiwgZGV2LT5kZXZudW0sIGlmYWNlX25vLCBhbHRubywgZnAtPmVuZHBvaW50KTsKKwkJZXJyID0gc25kX3VzYl9hZGRfYXVkaW9fc3RyZWFtKGNoaXAsIHN0cmVhbSwgZnApOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoZnAtPnJhdGVfdGFibGUpOworCQkJa2ZyZWUoZnApOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkvKiB0cnkgdG8gc2V0IHRoZSBpbnRlcmZhY2UuLi4gKi8KKwkJdXNiX3NldF9pbnRlcmZhY2UoY2hpcC0+ZGV2LCBpZmFjZV9ubywgYWx0bm8pOworCQlzbmRfdXNiX2luaXRfcGl0Y2goY2hpcCwgaWZhY2Vfbm8sIGFsdHMsIGZwKTsKKwkJc25kX3VzYl9pbml0X3NhbXBsZV9yYXRlKGNoaXAsIGlmYWNlX25vLCBhbHRzLCBmcCwgZnAtPnJhdGVfbWF4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9zdHJlYW0uaCBiL3NvdW5kL3VzYi9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL3N0cmVhbS5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19VU0JBVURJT19TVFJFQU1fSAorI2RlZmluZSBfX1VTQkFVRElPX1NUUkVBTV9ICisKK2ludCBzbmRfdXNiX3BhcnNlX2F1ZGlvX2ludGVyZmFjZShzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwKKwkJCQkgIGludCBpZmFjZV9ubyk7CisKK2ludCBzbmRfdXNiX2FkZF9hdWRpb19zdHJlYW0oc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAsCisJCQkgICAgIGludCBzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZnApOworCisjZW5kaWYgLyogX19VU0JBVURJT19TVFJFQU1fSCAqLworCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXJiLmMgYi9zb3VuZC91c2IvdXJiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODQzNDkuLjAwMDAwMDAKLS0tIGEvc291bmQvdXNiL3VyYi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQxICswLDAgQEAKLS8qCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0KLSNpbmNsdWRlICJ1c2JhdWRpby5oIgotI2luY2x1ZGUgImhlbHBlci5oIgotI2luY2x1ZGUgImNhcmQuaCIKLSNpbmNsdWRlICJ1cmIuaCIKLSNpbmNsdWRlICJwY20uaCIKLQotLyoKLSAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gb3VyIGZ1bGwgc3BlZWQgZm9ybWF0IChmcy8xMDAwIGluIFExNi4xNikKLSAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3ggNTI0IGtIegotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQotewotCXJldHVybiAoKHJhdGUgPDwgMTMpICsgNjIpIC8gMTI1OwotfQotCi0vKgotICogY29udmVydCBhIHNhbXBsaW5nIHJhdGUgaW50byBVU0IgaGlnaCBzcGVlZCBmb3JtYXQgKGZzLzgwMDAgaW4gUTE2LjE2KQotICogdGhpcyB3aWxsIG92ZXJmbG93IGF0IGFwcHJveCA0IE1IegotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF91c2JfaGlnaF9zcGVlZF9yYXRlKHVuc2lnbmVkIGludCByYXRlKQotewotCXJldHVybiAoKHJhdGUgPDwgMTApICsgNjIpIC8gMTI1OwotfQotCi0vKgotICogdW5saW5rIGFjdGl2ZSB1cmJzLgotICovCi1zdGF0aWMgaW50IGRlYWN0aXZhdGVfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIGludCBmb3JjZSwgaW50IGNhbl9zbGVlcCkKLXsKLQlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgYXN5bmM7Ci0KLQlzdWJzLT5ydW5uaW5nID0gMDsKLQotCWlmICghZm9yY2UgJiYgc3Vicy0+c3RyZWFtLT5jaGlwLT5zaHV0ZG93bikgLyogdG8gYmUgc3VyZS4uLiAqLwotCQlyZXR1cm4gLUVCQURGRDsKLQotCWFzeW5jID0gIWNhbl9zbGVlcCAmJiBjaGlwLT5hc3luY191bmxpbms7Ci0KLQlpZiAoIWFzeW5jICYmIGluX2ludGVycnVwdCgpKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChpLCAmc3Vicy0+YWN0aXZlX21hc2spKSB7Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJnN1YnMtPnVubGlua19tYXNrKSkgewotCQkJCXN0cnVjdCB1cmIgKnUgPSBzdWJzLT5kYXRhdXJiW2ldLnVyYjsKLQkJCQlpZiAoYXN5bmMpCi0JCQkJCXVzYl91bmxpbmtfdXJiKHUpOwotCQkJCWVsc2UKLQkJCQkJdXNiX2tpbGxfdXJiKHUpOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdWJzLT5zeW5jcGlwZSkgewotCQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspIHsKLQkJCWlmICh0ZXN0X2JpdChpKzE2LCAmc3Vicy0+YWN0aXZlX21hc2spKSB7Ci0JCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGkrMTYsICZzdWJzLT51bmxpbmtfbWFzaykpIHsKLQkJCQkJc3RydWN0IHVyYiAqdSA9IHN1YnMtPnN5bmN1cmJbaV0udXJiOwotCQkJCQlpZiAoYXN5bmMpCi0JCQkJCQl1c2JfdW5saW5rX3VyYih1KTsKLQkJCQkJZWxzZQotCQkJCQkJdXNiX2tpbGxfdXJiKHUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogcmVsZWFzZSBhIHVyYiBkYXRhCi0gKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfdXJiX2N0eChzdHJ1Y3Qgc25kX3VyYl9jdHggKnUpCi17Ci0JaWYgKHUtPnVyYikgewotCQlpZiAodS0+YnVmZmVyX3NpemUpCi0JCQl1c2JfZnJlZV9jb2hlcmVudCh1LT5zdWJzLT5kZXYsIHUtPmJ1ZmZlcl9zaXplLAotCQkJCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQkJdS0+dXJiLT50cmFuc2Zlcl9kbWEpOwotCQl1c2JfZnJlZV91cmIodS0+dXJiKTsKLQkJdS0+dXJiID0gTlVMTDsKLQl9Ci19Ci0KLS8qCi0gKiAgd2FpdCB1bnRpbCBhbGwgdXJicyBhcmUgcHJvY2Vzc2VkLgotICovCi1zdGF0aWMgaW50IHdhaXRfY2xlYXJfdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmRfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOwotCXVuc2lnbmVkIGludCBpOwotCWludCBhbGl2ZTsKLQotCWRvIHsKLQkJYWxpdmUgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgewotCQkJaWYgKHRlc3RfYml0KGksICZzdWJzLT5hY3RpdmVfbWFzaykpCi0JCQkJYWxpdmUrKzsKLQkJfQotCQlpZiAoc3Vicy0+c3luY3BpcGUpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJCWlmICh0ZXN0X2JpdChpICsgMTYsICZzdWJzLT5hY3RpdmVfbWFzaykpCi0JCQkJCWFsaXZlKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEgYWxpdmUpCi0JCQlicmVhazsKLQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKLQlpZiAoYWxpdmUpCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgInRpbWVvdXQ6IHN0aWxsICVkIGFjdGl2ZSB1cmJzLi5cbiIsIGFsaXZlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2UgYSBzdWJzdHJlYW0KLSAqLwotdm9pZCBzbmRfdXNiX3JlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBpbnQgZm9yY2UpCi17Ci0JaW50IGk7Ci0KLQkvKiBzdG9wIHVyYnMgKHRvIGJlIHN1cmUpICovCi0JZGVhY3RpdmF0ZV91cmJzKHN1YnMsIGZvcmNlLCAxKTsKLQl3YWl0X2NsZWFyX3VyYnMoc3Vicyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1VSQlM7IGkrKykKLQkJcmVsZWFzZV91cmJfY3R4KCZzdWJzLT5kYXRhdXJiW2ldKTsKLQlmb3IgKGkgPSAwOyBpIDwgU1lOQ19VUkJTOyBpKyspCi0JCXJlbGVhc2VfdXJiX2N0eCgmc3Vicy0+c3luY3VyYltpXSk7Ci0JdXNiX2ZyZWVfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAotCQkJc3Vicy0+c3luY2J1Ziwgc3Vicy0+c3luY19kbWEpOwotCXN1YnMtPnN5bmNidWYgPSBOVUxMOwotCXN1YnMtPm51cmJzID0gMDsKLX0KLQotLyoKLSAqIGNvbXBsZXRlIGNhbGxiYWNrIGZyb20gZGF0YSB1cmIKLSAqLwotc3RhdGljIHZvaWQgc25kX2NvbXBsZXRlX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzID0gY3R4LT5zdWJzOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4LT5zdWJzLT5wY21fc3Vic3RyZWFtOwotCWludCBlcnIgPSAwOwotCi0JaWYgKChzdWJzLT5ydW5uaW5nICYmIHN1YnMtPm9wcy5yZXRpcmUoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSB8fAotCSAgICAhc3Vicy0+cnVubmluZyB8fCAvKiBjYW4gYmUgc3RvcHBlZCBkdXJpbmcgcmV0aXJlIGNhbGxiYWNrICovCi0JICAgIChlcnIgPSBzdWJzLT5vcHMucHJlcGFyZShzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHVyYikpIDwgMCB8fAotCSAgICAoZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7Ci0JCWNsZWFyX2JpdChjdHgtPmluZGV4LCAmc3Vicy0+YWN0aXZlX21hc2spOwotCQlpZiAoZXJyIDwgMCkgewotCQkJc25kX3ByaW50ZChLRVJOX0VSUiAiY2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKLQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogY29tcGxldGUgY2FsbGJhY2sgZnJvbSBzeW5jIHVyYgotICovCi1zdGF0aWMgdm9pZCBzbmRfY29tcGxldGVfc3luY191cmIoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IGN0eC0+c3ViczsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGN0eC0+c3Vicy0+cGNtX3N1YnN0cmVhbTsKLQlpbnQgZXJyID0gMDsKLQotCWlmICgoc3Vicy0+cnVubmluZyAmJiBzdWJzLT5vcHMucmV0aXJlX3N5bmMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSB8fAotCSAgICAhc3Vicy0+cnVubmluZyB8fCAvKiBjYW4gYmUgc3RvcHBlZCBkdXJpbmcgcmV0aXJlIGNhbGxiYWNrICovCi0JICAgIChlcnIgPSBzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSwgdXJiKSkgPCAwIHx8Ci0JICAgIChlcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKLQkJY2xlYXJfYml0KGN0eC0+aW5kZXggKyAxNiwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGQoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgc3luYyB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKLQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogaW5pdGlhbGl6ZSBhIHN1YnN0cmVhbSBmb3IgcGxhYmFjay9jYXB0dXJlCi0gKi8KLWludCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCi0JCQkJdW5zaWduZWQgaW50IHJhdGUsCi0JCQkJdW5zaWduZWQgaW50IGZyYW1lX2JpdHMpCi17Ci0JdW5zaWduZWQgaW50IG1heHNpemUsIGk7Ci0JaW50IGlzX3BsYXliYWNrID0gc3Vicy0+ZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s7Ci0JdW5zaWduZWQgaW50IHVyYl9wYWNrcywgdG90YWxfcGFja3MsIHBhY2tzX3Blcl9tczsKLQlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHN1YnMtPnN0cmVhbS0+Y2hpcDsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IGluIDE2LjE2IGZvcm1hdCAqLwotCWlmIChzbmRfdXNiX2dldF9zcGVlZChzdWJzLT5kZXYpID09IFVTQl9TUEVFRF9GVUxMKQotCQlzdWJzLT5mcmVxbiA9IGdldF91c2JfZnVsbF9zcGVlZF9yYXRlKHJhdGUpOwotCWVsc2UKLQkJc3Vicy0+ZnJlcW4gPSBnZXRfdXNiX2hpZ2hfc3BlZWRfcmF0ZShyYXRlKTsKLQlzdWJzLT5mcmVxbSA9IHN1YnMtPmZyZXFuOwotCXN1YnMtPmZyZXFzaGlmdCA9IElOVF9NSU47Ci0JLyogY2FsY3VsYXRlIG1heC4gZnJlcXVlbmN5ICovCi0JaWYgKHN1YnMtPm1heHBhY2tzaXplKSB7Ci0JCS8qIHdoYXRldmVyIGZpdHMgaW50byBhIG1heC4gc2l6ZSBwYWNrZXQgKi8KLQkJbWF4c2l6ZSA9IHN1YnMtPm1heHBhY2tzaXplOwotCQlzdWJzLT5mcmVxbWF4ID0gKG1heHNpemUgLyAoZnJhbWVfYml0cyA+PiAzKSkKLQkJCQk8PCAoMTYgLSBzdWJzLT5kYXRhaW50ZXJ2YWwpOwotCX0gZWxzZSB7Ci0JCS8qIG5vIG1heC4gcGFja2V0IHNpemU6IGp1c3QgdGFrZSAyNSUgaGlnaGVyIHRoYW4gbm9taW5hbCAqLwotCQlzdWJzLT5mcmVxbWF4ID0gc3Vicy0+ZnJlcW4gKyAoc3Vicy0+ZnJlcW4gPj4gMik7Ci0JCW1heHNpemUgPSAoKHN1YnMtPmZyZXFtYXggKyAweGZmZmYpICogKGZyYW1lX2JpdHMgPj4gMykpCi0JCQkJPj4gKDE2IC0gc3Vicy0+ZGF0YWludGVydmFsKTsKLQl9Ci0Jc3Vicy0+cGhhc2UgPSAwOwotCi0JaWYgKHN1YnMtPmZpbGxfbWF4KQotCQlzdWJzLT5jdXJwYWNrc2l6ZSA9IHN1YnMtPm1heHBhY2tzaXplOwotCWVsc2UKLQkJc3Vicy0+Y3VycGFja3NpemUgPSBtYXhzaXplOwotCi0JaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgIT0gVVNCX1NQRUVEX0ZVTEwpCi0JCXBhY2tzX3Blcl9tcyA9IDggPj4gc3Vicy0+ZGF0YWludGVydmFsOwotCWVsc2UKLQkJcGFja3NfcGVyX21zID0gMTsKLQotCWlmIChpc19wbGF5YmFjaykgewotCQl1cmJfcGFja3MgPSBtYXgoY2hpcC0+bnJwYWNrcywgMSk7Ci0JCXVyYl9wYWNrcyA9IG1pbih1cmJfcGFja3MsICh1bnNpZ25lZCBpbnQpTUFYX1BBQ0tTKTsKLQl9IGVsc2UKLQkJdXJiX3BhY2tzID0gMTsKLQl1cmJfcGFja3MgKj0gcGFja3NfcGVyX21zOwotCWlmIChzdWJzLT5zeW5jcGlwZSkKLQkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgMVUgPDwgc3Vicy0+c3luY2ludGVydmFsKTsKLQotCS8qIGRlY2lkZSBob3cgbWFueSBwYWNrZXRzIHRvIGJlIHVzZWQgKi8KLQlpZiAoaXNfcGxheWJhY2spIHsKLQkJdW5zaWduZWQgaW50IG1pbnNpemUsIG1heHBhY2tzOwotCQkvKiBkZXRlcm1pbmUgaG93IHNtYWxsIGEgcGFja2V0IGNhbiBiZSAqLwotCQltaW5zaXplID0gKHN1YnMtPmZyZXFuID4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCkpCi0JCQkgICogKGZyYW1lX2JpdHMgPj4gMyk7Ci0JCS8qIHdpdGggc3luYyBmcm9tIGRldmljZSwgYXNzdW1lIGl0IGNhbiBiZSAxMiUgbG93ZXIgKi8KLQkJaWYgKHN1YnMtPnN5bmNwaXBlKQotCQkJbWluc2l6ZSAtPSBtaW5zaXplID4+IDM7Ci0JCW1pbnNpemUgPSBtYXgobWluc2l6ZSwgMXUpOwotCQl0b3RhbF9wYWNrcyA9IChwZXJpb2RfYnl0ZXMgKyBtaW5zaXplIC0gMSkgLyBtaW5zaXplOwotCQkvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBVUkJzIGZvciBxdWV1ZWluZyAqLwotCQlpZiAodG90YWxfcGFja3MgPCAyKSB7Ci0JCQl0b3RhbF9wYWNrcyA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhbmQgd2UgZG9uJ3Qgd2FudCB0b28gbG9uZyBhIHF1ZXVlIGVpdGhlciAqLwotCQkJbWF4cGFja3MgPSBtYXgoTUFYX1FVRVVFICogcGFja3NfcGVyX21zLCB1cmJfcGFja3MgKiAyKTsKLQkJCXRvdGFsX3BhY2tzID0gbWluKHRvdGFsX3BhY2tzLCBtYXhwYWNrcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAodXJiX3BhY2tzID4gMSAmJiB1cmJfcGFja3MgKiBtYXhzaXplID49IHBlcmlvZF9ieXRlcykKLQkJCXVyYl9wYWNrcyA+Pj0gMTsKLQkJdG90YWxfcGFja3MgPSBNQVhfVVJCUyAqIHVyYl9wYWNrczsKLQl9Ci0Jc3Vicy0+bnVyYnMgPSAodG90YWxfcGFja3MgKyB1cmJfcGFja3MgLSAxKSAvIHVyYl9wYWNrczsKLQlpZiAoc3Vicy0+bnVyYnMgPiBNQVhfVVJCUykgewotCQkvKiB0b28gbXVjaC4uLiAqLwotCQlzdWJzLT5udXJicyA9IE1BWF9VUkJTOwotCQl0b3RhbF9wYWNrcyA9IE1BWF9VUkJTICogdXJiX3BhY2tzOwotCX0gZWxzZSBpZiAoc3Vicy0+bnVyYnMgPCAyKSB7Ci0JCS8qIHRvbyBsaXR0bGUgLSB3ZSBuZWVkIGF0IGxlYXN0IHR3byBwYWNrZXRzCi0JCSAqIHRvIGVuc3VyZSBjb250aWd1b3VzIHBsYXliYWNrL2NhcHR1cmUKLQkJICovCi0JCXN1YnMtPm51cmJzID0gMjsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhIHVyYnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc3Vicy0+bnVyYnM7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+ZGF0YXVyYltpXTsKLQkJdS0+aW5kZXggPSBpOwotCQl1LT5zdWJzID0gc3ViczsKLQkJdS0+cGFja2V0cyA9IChpICsgMSkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzCi0JCQktIGkgKiB0b3RhbF9wYWNrcyAvIHN1YnMtPm51cmJzOwotCQl1LT5idWZmZXJfc2l6ZSA9IG1heHNpemUgKiB1LT5wYWNrZXRzOwotCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKQotCQkJdS0+cGFja2V0cysrOyAvKiBmb3IgdHJhbnNmZXIgZGVsaW1pdGVyICovCi0JCXUtPnVyYiA9IHVzYl9hbGxvY191cmIodS0+cGFja2V0cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdS0+dXJiKQotCQkJZ290byBvdXRfb2ZfbWVtb3J5OwotCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCQl1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCB1LT5idWZmZXJfc2l6ZSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgJnUtPnVyYi0+dHJhbnNmZXJfZG1hKTsKLQkJaWYgKCF1LT51cmItPnRyYW5zZmVyX2J1ZmZlcikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQkJdS0+dXJiLT5waXBlID0gc3Vicy0+ZGF0YXBpcGU7Ci0JCXUtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+ZGF0YWludGVydmFsOwotCQl1LT51cmItPmNvbnRleHQgPSB1OwotCQl1LT51cmItPmNvbXBsZXRlID0gc25kX2NvbXBsZXRlX3VyYjsKLQl9Ci0KLQlpZiAoc3Vicy0+c3luY3BpcGUpIHsKLQkJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3luYyB1cmJzICovCi0JCXN1YnMtPnN5bmNidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LAotCQkJCQkJIEdGUF9LRVJORUwsICZzdWJzLT5zeW5jX2RtYSk7Ci0JCWlmICghc3Vicy0+c3luY2J1ZikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQkJZm9yIChpID0gMDsgaSA8IFNZTkNfVVJCUzsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc25kX3VyYl9jdHggKnUgPSAmc3Vicy0+c3luY3VyYltpXTsKLQkJCXUtPmluZGV4ID0gaTsKLQkJCXUtPnN1YnMgPSBzdWJzOwotCQkJdS0+cGFja2V0cyA9IDE7Ci0JCQl1LT51cmIgPSB1c2JfYWxsb2NfdXJiKDEsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1LT51cmIpCi0JCQkJZ290byBvdXRfb2ZfbWVtb3J5OwotCQkJdS0+dXJiLT50cmFuc2Zlcl9idWZmZXIgPSBzdWJzLT5zeW5jYnVmICsgaSAqIDQ7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2RtYSA9IHN1YnMtPnN5bmNfZG1hICsgaSAqIDQ7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA0OwotCQkJdS0+dXJiLT5waXBlID0gc3Vicy0+c3luY3BpcGU7Ci0JCQl1LT51cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwKLQkJCQkJCSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkJCXUtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAxOwotCQkJdS0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgc3Vicy0+c3luY2ludGVydmFsOwotCQkJdS0+dXJiLT5jb250ZXh0ID0gdTsKLQkJCXUtPnVyYi0+Y29tcGxldGUgPSBzbmRfY29tcGxldGVfc3luY191cmI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci0KLW91dF9vZl9tZW1vcnk6Ci0Jc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGZ1bGwgc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKLSAqCi0gKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgotICogdGhlIGZpeGVkIDEwLjE0IGZyZXF1ZW5jeSBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgcGlwZS4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICBzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCi0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSAzOwotCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKLQljcFswXSA9IHN1YnMtPmZyZXFuID4+IDI7Ci0JY3BbMV0gPSBzdWJzLT5mcmVxbiA+PiAxMDsKLQljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE4OwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGhpZ2ggc3BlZWQgY2FwdHVyZSBzeW5jIHBpcGUKLSAqCi0gKiBmaWxsIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBlYWNoIHVyYiBkZXNjcmlwdG9yLgotICogdGhlIGZpeGVkIDEyLjEzIGZyZXF1ZW5jeSBpcyBwYXNzZWQgYXMgMTYuMTYgdGhyb3VnaCB0aGUgcGlwZS4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JdW5zaWduZWQgY2hhciAqY3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7IC8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgYXQgZWFjaCB0aW1lICovCi0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSA0OwotCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKLQljcFswXSA9IHN1YnMtPmZyZXFuOwotCWNwWzFdID0gc3Vicy0+ZnJlcW4gPj4gODsKLQljcFsyXSA9IHN1YnMtPmZyZXFuID4+IDE2OwotCWNwWzNdID0gc3Vicy0+ZnJlcW4gPj4gMjQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgc3luYyBjb21wbGV0ZQotICogLSBub3RoaW5nIHRvIGRvCi0gKi8KLXN0YXRpYyBpbnQgcmV0aXJlX2NhcHR1cmVfc3luY191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJICAgc3RydWN0IHVyYiAqdXJiKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIGNhcHR1cmUgZGF0YSBwaXBlCi0gKgotICogZmlsbCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWFjaCBkZXNjcmlwdG9yLgotICoKLSAqIHdlIHVzZSBhIHRlbXBvcmFyeSBidWZmZXIgdG8gd3JpdGUgdGhlIGNhcHR1cmVkIGRhdGEuCi0gKiBzaW5jZSB0aGUgbGVuZ3RoIG9mIHdyaXR0ZW4gZGF0YSBpcyBkZXRlcm1pbmVkIGJ5IGhvc3QsIHdlIGNhbm5vdAotICogd3JpdGUgb250byB0aGUgcGNtIGJ1ZmZlciBkaXJlY3RseS4uLiAgdGhlIGRhdGEgaXMgdGh1cyBjb3BpZWQKLSAqIGxhdGVyIGF0IGNvbXBsZXRlIGNhbGxiYWNrIHRvIHRoZSBnbG9iYWwgYnVmZmVyLgotICovCi1zdGF0aWMgaW50IHByZXBhcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCWludCBpLCBvZmZzOwotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCi0Jb2ZmcyA9IDA7Ci0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYWNrZXRzOyBpKyspIHsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IHN1YnMtPmN1cnBhY2tzaXplOwotCQlvZmZzICs9IHN1YnMtPmN1cnBhY2tzaXplOwotCX0KLQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBvZmZzOwotCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUKLSAqCi0gKiBjb3B5IHRoZSBkYXRhIGZyb20gZWFjaCBkZXNjdGlwdG9yIHRvIHRoZSBwY20gYnVmZmVyLCBhbmQKLSAqIHVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqLwotc3RhdGljIGludCByZXRpcmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCSAgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmNwOwotCWludCBpOwotCXVuc2lnbmVkIGludCBzdHJpZGUsIGZyYW1lcywgYnl0ZXMsIG9sZHB0cjsKLQlpbnQgcGVyaW9kX2VsYXBzZWQgPSAwOwotCi0Jc3RyaWRlID0gcnVudGltZS0+ZnJhbWVfYml0cyA+PiAzOwotCi0JZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQljcCA9ICh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKLQkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7Ci0JCQlzbmRfcHJpbnRkKEtFUk5fRVJSICJmcmFtZSAlZCBhY3RpdmU6ICVkXG4iLCBpLCB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7Ci0JCQkvLyBjb250aW51ZTsKLQkJfQotCQlieXRlcyA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKLQkJZnJhbWVzID0gYnl0ZXMgLyBzdHJpZGU7Ci0JCWlmICghc3Vicy0+dHhmcl9xdWlyaykKLQkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQlpZiAoYnl0ZXMgJSAocnVudGltZS0+c2FtcGxlX2JpdHMgPj4gMykgIT0gMCkgewotI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQotCQkJaW50IG9sZGJ5dGVzID0gYnl0ZXM7Ci0jZW5kaWYKLQkJCWJ5dGVzID0gZnJhbWVzICogc3RyaWRlOwotCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgIkNvcnJlY3RlZCB1cmIgZGF0YSBsZW4uICVkLT4lZFxuIiwKLQkJCQkJCQlvbGRieXRlcywgYnl0ZXMpOwotCQl9Ci0JCS8qIHVwZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JCW9sZHB0ciA9IHN1YnMtPmh3cHRyX2RvbmU7Ci0JCXN1YnMtPmh3cHRyX2RvbmUgKz0gYnl0ZXM7Ci0JCWlmIChzdWJzLT5od3B0cl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKQotCQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKLQkJZnJhbWVzID0gKGJ5dGVzICsgKG9sZHB0ciAlIHN0cmlkZSkpIC8gc3RyaWRlOwotCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGZyYW1lczsKLQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7Ci0JCQlwZXJpb2RfZWxhcHNlZCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCQkvKiBjb3B5IGEgZGF0YSBjaHVuayAqLwotCQlpZiAob2xkcHRyICsgYnl0ZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkgewotCQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9Ci0JCQkJCXJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlIC0gb2xkcHRyOwotCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgb2xkcHRyLCBjcCwgYnl0ZXMxKTsKLQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgY3AgKyBieXRlczEsIGJ5dGVzIC0gYnl0ZXMxKTsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIG9sZHB0ciwgY3AsIGJ5dGVzKTsKLQkJfQotCX0KLQlpZiAocGVyaW9kX2VsYXBzZWQpCi0JCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0cmVhbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUgd2hlbiBwYXVzZWQuICBOb3RoaW5nIHRvIGRvLgotICovCi1zdGF0aWMgaW50IHJldGlyZV9wYXVzZWRfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQkgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIHN5bmMgcGlwZQotICoKLSAqIHNldCB1cCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggdG8gcmVjZWl2ZSB0aGUgY3VycmVudCBmcmVxdWVuY3kuCi0gKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OwotCi0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IG1pbig0dSwgY3R4LT5zdWJzLT5zeW5jbWF4c2l6ZSk7Ci0JdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJvY2VzcyBhZnRlciBwbGF5YmFjayBzeW5jIGNvbXBsZXRlCi0gKgotICogRnVsbCBzcGVlZCBkZXZpY2VzIHJlcG9ydCBmZWVkYmFjayB2YWx1ZXMgaW4gMTAuMTQgZm9ybWF0IGFzIHNhbXBsZXMgcGVyCi0gKiBmcmFtZSwgaGlnaCBzcGVlZCBkZXZpY2VzIGluIDE2LjE2IGZvcm1hdCBhcyBzYW1wbGVzIHBlciBtaWNyb2ZyYW1lLgotICogQmVjYXVzZSB0aGUgQXVkaW8gQ2xhc3MgMSBzcGVjIHdhcyB3cml0dGVuIGJlZm9yZSBVU0IgMi4wLCBtYW55IGhpZ2ggc3BlZWQKLSAqIGRldmljZXMgdXNlIGEgd3JvbmcgaW50ZXJwcmV0YXRpb24sIHNvbWUgb3RoZXJzIHVzZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQKLSAqIGZvcm1hdC4gIFRoZXJlZm9yZSwgd2UgY2Fubm90IHByZWRpY3Qgd2hhdCBmb3JtYXQgYW55IHBhcnRpY3VsYXIgZGV2aWNlIHVzZXMKLSAqIGFuZCBtdXN0IGRldGVjdCBpdCBhdXRvbWF0aWNhbGx5LgotICovCi1zdGF0aWMgaW50IHJldGlyZV9wbGF5YmFja19zeW5jX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCi0JCQkJICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBpbnQgZjsKLQlpbnQgc2hpZnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICh1cmItPmlzb19mcmFtZV9kZXNjWzBdLnN0YXR1cyAhPSAwIHx8Ci0JICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA8IDMpCi0JCXJldHVybiAwOwotCi0JZiA9IGxlMzJfdG9fY3B1cCh1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uYWN0dWFsX2xlbmd0aCA9PSAzKQotCQlmICY9IDB4MDBmZmZmZmY7Ci0JZWxzZQotCQlmICY9IDB4MGZmZmZmZmY7Ci0JaWYgKGYgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodW5saWtlbHkoc3Vicy0+ZnJlcXNoaWZ0ID09IElOVF9NSU4pKSB7Ci0JCS8qCi0JCSAqIFRoZSBmaXJzdCB0aW1lIHdlIHNlZSBhIGZlZWRiYWNrIHZhbHVlLCBkZXRlcm1pbmUgaXRzIGZvcm1hdAotCQkgKiBieSBzaGlmdGluZyBpdCBsZWZ0IG9yIHJpZ2h0IHVudGlsIGl0IG1hdGNoZXMgdGhlIG5vbWluYWwKLQkJICogZnJlcXVlbmN5IHZhbHVlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZlZWRiYWNrIGRvZXMgbm90Ci0JCSAqIGRpZmZlciBmcm9tIHRoZSBub21pbmFsIHZhbHVlIG1vcmUgdGhhbiArNTAlIG9yIC0yNSUuCi0JCSAqLwotCQlzaGlmdCA9IDA7Ci0JCXdoaWxlIChmIDwgc3Vicy0+ZnJlcW4gLSBzdWJzLT5mcmVxbiAvIDQpIHsKLQkJCWYgPDw9IDE7Ci0JCQlzaGlmdCsrOwotCQl9Ci0JCXdoaWxlIChmID4gc3Vicy0+ZnJlcW4gKyBzdWJzLT5mcmVxbiAvIDIpIHsKLQkJCWYgPj49IDE7Ci0JCQlzaGlmdC0tOwotCQl9Ci0JCXN1YnMtPmZyZXFzaGlmdCA9IHNoaWZ0OwotCX0KLQllbHNlIGlmIChzdWJzLT5mcmVxc2hpZnQgPj0gMCkKLQkJZiA8PD0gc3Vicy0+ZnJlcXNoaWZ0OwotCWVsc2UKLQkJZiA+Pj0gLXN1YnMtPmZyZXFzaGlmdDsKLQotCWlmIChsaWtlbHkoZiA+PSBzdWJzLT5mcmVxbiAtIHN1YnMtPmZyZXFuIC8gOCAmJiBmIDw9IHN1YnMtPmZyZXFtYXgpKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBmcmVxdWVuY3kgbG9va3MgdmFsaWQsIHNldCBpdC4KLQkJICogVGhpcyB2YWx1ZSBpcyByZWZlcnJlZCB0byBpbiBwcmVwYXJlX3BsYXliYWNrX3VyYigpLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnMtPmxvY2ssIGZsYWdzKTsKLQkJc3Vicy0+ZnJlcW0gPSBmOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT3V0IG9mIHJhbmdlOyBtYXliZSB0aGUgc2hpZnQgdmFsdWUgaXMgd3JvbmcuCi0JCSAqIFJlc2V0IGl0IHNvIHRoYXQgd2UgYXV0b2RldGVjdCBhZ2FpbiB0aGUgbmV4dCB0aW1lLgotCQkgKi8KLQkJc3Vicy0+ZnJlcXNoaWZ0ID0gSU5UX01JTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBuZXh0IHBhY2tldCAqLwotc3RhdGljIGludCBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzKQotewotCWlmIChzdWJzLT5maWxsX21heCkKLQkJcmV0dXJuIHN1YnMtPm1heGZyYW1lc2l6ZTsKLQllbHNlIHsKLQkJc3Vicy0+cGhhc2UgPSAoc3Vicy0+cGhhc2UgJiAweGZmZmYpCi0JCQkrIChzdWJzLT5mcmVxbSA8PCBzdWJzLT5kYXRhaW50ZXJ2YWwpOwotCQlyZXR1cm4gbWluKHN1YnMtPnBoYXNlID4+IDE2LCBzdWJzLT5tYXhmcmFtZXNpemUpOwotCX0KLX0KLQotLyoKLSAqIFByZXBhcmUgdXJiIGZvciBzdHJlYW1pbmcgYmVmb3JlIHBsYXliYWNrIHN0YXJ0cyBvciB3aGVuIHBhdXNlZC4KLSAqCi0gKiBXZSBkb24ndCBoYXZlIGFueSBkYXRhLCBzbyB3ZSBzZW5kIHNpbGVuY2UuCi0gKi8KLXN0YXRpYyBpbnQgcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKLQkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQkgICAgICAgc3RydWN0IHVyYiAqdXJiKQotewotCXVuc2lnbmVkIGludCBpLCBvZmZzLCBjb3VudHM7Ci0Jc3RydWN0IHNuZF91cmJfY3R4ICpjdHggPSB1cmItPmNvbnRleHQ7Ci0JaW50IHN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKLQotCW9mZnMgPSAwOwotCXVyYi0+ZGV2ID0gY3R4LT5zdWJzLT5kZXY7Ci0JZm9yIChpID0gMDsgaSA8IGN0eC0+cGFja2V0czsgKytpKSB7Ci0JCWNvdW50cyA9IHNuZF91c2JfYXVkaW9fbmV4dF9wYWNrZXRfc2l6ZShzdWJzKTsKLQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBvZmZzICogc3RyaWRlOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKLQkJb2ZmcyArPSBjb3VudHM7Ci0JfQotCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBjdHgtPnBhY2tldHM7Ci0JdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gb2ZmcyAqIHN0cmlkZTsKLQltZW1zZXQodXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JICAgICAgIHJ1bnRpbWUtPmZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1U4ID8gMHg4MCA6IDAsCi0JICAgICAgIG9mZnMgKiBzdHJpZGUpOwotCXJldHVybiAwOwotfQotCi0vKgotICogcHJlcGFyZSB1cmIgZm9yIHBsYXliYWNrIGRhdGEgcGlwZQotICoKLSAqIFNpbmNlIGEgVVJCIGNhbiBoYW5kbGUgb25seSBhIHNpbmdsZSBsaW5lYXIgYnVmZmVyLCB3ZSBtdXN0IHVzZSBkb3VibGUKLSAqIGJ1ZmZlcmluZyB3aGVuIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIG92ZXJmbG93cyB0aGUgYnVmZmVyIGJvdW5kYXJ5LgotICogVG8gYXZvaWQgaW5jb25zaXN0ZW5jaWVzIHdoZW4gdXBkYXRpbmcgaHdwdHJfZG9uZSwgd2UgdXNlIGRvdWJsZSBidWZmZXJpbmcKLSAqIGZvciBhbGwgVVJCcy4KLSAqLwotc3RhdGljIGludCBwcmVwYXJlX3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKLQkJCQlzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IGksIHN0cmlkZTsKLQl1bnNpZ25lZCBpbnQgY291bnRzLCBmcmFtZXMsIGJ5dGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHBlcmlvZF9lbGFwc2VkID0gMDsKLQlzdHJ1Y3Qgc25kX3VyYl9jdHggKmN0eCA9IHVyYi0+Y29udGV4dDsKLQotCXN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsKLQotCWZyYW1lcyA9IDA7Ci0JdXJiLT5kZXYgPSBjdHgtPnN1YnMtPmRldjsgLyogd2UgbmVlZCB0byBzZXQgdGhpcyBhdCBlYWNoIHRpbWUgKi8KLQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7IGkrKykgewotCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7Ci0JCS8qIHNldCB1cCBkZXNjcmlwdG9yICovCi0JCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0ID0gZnJhbWVzICogc3RyaWRlOwotCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9IGNvdW50cyAqIHN0cmlkZTsKLQkJZnJhbWVzICs9IGNvdW50czsKLQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOwotCQlzdWJzLT50cmFuc2Zlcl9kb25lICs9IGNvdW50czsKLQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKLQkJCXN1YnMtPnRyYW5zZmVyX2RvbmUgLT0gcnVudGltZS0+cGVyaW9kX3NpemU7Ci0JCQlwZXJpb2RfZWxhcHNlZCA9IDE7Ci0JCQlpZiAoc3Vicy0+Zm10X3R5cGUgPT0gVUFDX0ZPUk1BVF9UWVBFX0lJKSB7Ci0JCQkJaWYgKHN1YnMtPnRyYW5zZmVyX2RvbmUgPiAwKSB7Ci0JCQkJCS8qIEZJWE1FOiBmaWxsLW1heCBtb2RlIGlzIG5vdAotCQkJCQkgKiBzdXBwb3J0ZWQgeWV0ICovCi0JCQkJCWZyYW1lcyAtPSBzdWJzLT50cmFuc2Zlcl9kb25lOwotCQkJCQljb3VudHMgLT0gc3Vicy0+dHJhbnNmZXJfZG9uZTsKLQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPQotCQkJCQkJY291bnRzICogc3RyaWRlOwotCQkJCQlzdWJzLT50cmFuc2Zlcl9kb25lID0gMDsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCWlmIChpIDwgY3R4LT5wYWNrZXRzKSB7Ci0JCQkJCS8qIGFkZCBhIHRyYW5zZmVyIGRlbGltaXRlciAqLwotCQkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCA9Ci0JCQkJCQlmcmFtZXMgKiBzdHJpZGU7Ci0JCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gMDsKLQkJCQkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cysrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocGVyaW9kX2VsYXBzZWQpIC8qIGZpbmlzaCBhdCB0aGUgcGVyaW9kIGJvdW5kYXJ5ICovCi0JCQlicmVhazsKLQl9Ci0JYnl0ZXMgPSBmcmFtZXMgKiBzdHJpZGU7Ci0JaWYgKHN1YnMtPmh3cHRyX2RvbmUgKyBieXRlcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICogc3RyaWRlKSB7Ci0JCS8qIGVyciwgdGhlIHRyYW5zZmVycmVkIGFyZWEgZ29lcyBvdmVyIGJ1ZmZlciBib3VuZGFyeS4gKi8KLQkJdW5zaWduZWQgaW50IGJ5dGVzMSA9Ci0JCQlydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSAtIHN1YnMtPmh3cHRyX2RvbmU7Ci0JCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJICAgICAgIHJ1bnRpbWUtPmRtYV9hcmVhICsgc3Vicy0+aHdwdHJfZG9uZSwgYnl0ZXMxKTsKLQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgYnl0ZXMxLAotCQkgICAgICAgcnVudGltZS0+ZG1hX2FyZWEsIGJ5dGVzIC0gYnl0ZXMxKTsKLQl9IGVsc2UgewotCQltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArIHN1YnMtPmh3cHRyX2RvbmUsIGJ5dGVzKTsKLQl9Ci0Jc3Vicy0+aHdwdHJfZG9uZSArPSBieXRlczsKLQlpZiAoc3Vicy0+aHdwdHJfZG9uZSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZSkKLQkJc3Vicy0+aHdwdHJfZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZSAqIHN0cmlkZTsKLQlydW50aW1lLT5kZWxheSArPSBmcmFtZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ5dGVzOwotCWlmIChwZXJpb2RfZWxhcHNlZCkKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzLT5wY21fc3Vic3RyZWFtKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHByb2Nlc3MgYWZ0ZXIgcGxheWJhY2sgZGF0YSBjb21wbGV0ZQotICogLSBkZWNyZWFzZSB0aGUgZGVsYXkgY291bnQgYWdhaW4KLSAqLwotc3RhdGljIGludCByZXRpcmVfcGxheWJhY2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBzdHJpZGUgPSBydW50aW1lLT5mcmFtZV9iaXRzID4+IDM7Ci0JaW50IHByb2Nlc3NlZCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAvIHN0cmlkZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJzLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHByb2Nlc3NlZCA+IHJ1bnRpbWUtPmRlbGF5KQotCQlydW50aW1lLT5kZWxheSA9IDA7Ci0JZWxzZQotCQlydW50aW1lLT5kZWxheSAtPSBwcm9jZXNzZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3Vicy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXNiX2Vycm9yX3N0cmluZyhpbnQgZXJyKQotewotCXN3aXRjaCAoZXJyKSB7Ci0JY2FzZSAtRU5PREVWOgotCQlyZXR1cm4gIm5vIGRldmljZSI7Ci0JY2FzZSAtRU5PRU5UOgotCQlyZXR1cm4gImVuZHBvaW50IG5vdCBlbmFibGVkIjsKLQljYXNlIC1FUElQRToKLQkJcmV0dXJuICJlbmRwb2ludCBzdGFsbGVkIjsKLQljYXNlIC1FTk9TUEM6Ci0JCXJldHVybiAibm90IGVub3VnaCBiYW5kd2lkdGgiOwotCWNhc2UgLUVTSFVURE9XTjoKLQkJcmV0dXJuICJkZXZpY2UgZGlzYWJsZWQiOwotCWNhc2UgLUVIT1NUVU5SRUFDSDoKLQkJcmV0dXJuICJkZXZpY2Ugc3VzcGVuZGVkIjsKLQljYXNlIC1FSU5WQUw6Ci0JY2FzZSAtRUFHQUlOOgotCWNhc2UgLUVGQklHOgotCWNhc2UgLUVNU0dTSVpFOgotCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gZXJyb3IiOwotCX0KLX0KLQotLyoKLSAqIHNldCB1cCBhbmQgc3RhcnQgZGF0YS9zeW5jIHVyYnMKLSAqLwotc3RhdGljIGludCBzdGFydF91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgZXJyOwotCi0JaWYgKHN1YnMtPnN0cmVhbS0+Y2hpcC0+c2h1dGRvd24pCi0JCXJldHVybiAtRUJBREZEOwotCi0JZm9yIChpID0gMDsgaSA8IHN1YnMtPm51cmJzOyBpKyspIHsKLQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPmRhdGF1cmJbaV0udXJiKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoc3Vicy0+b3BzLnByZXBhcmUoc3VicywgcnVudGltZSwgc3Vicy0+ZGF0YXVyYltpXS51cmIpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiY2Fubm90IHByZXBhcmUgZGF0YXBpcGUgZm9yIHVyYiAlZFxuIiwgaSk7Ci0JCQlnb3RvIF9fZXJyb3I7Ci0JCX0KLQl9Ci0JaWYgKHN1YnMtPnN5bmNwaXBlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJaWYgKHNuZF9CVUdfT04oIXN1YnMtPnN5bmN1cmJbaV0udXJiKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChzdWJzLT5vcHMucHJlcGFyZV9zeW5jKHN1YnMsIHJ1bnRpbWUsIHN1YnMtPnN5bmN1cmJbaV0udXJiKSA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcHJlcGFyZSBzeW5jcGlwZSBmb3IgdXJiICVkXG4iLCBpKTsKLQkJCQlnb3RvIF9fZXJyb3I7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdWJzLT5hY3RpdmVfbWFzayA9IDA7Ci0Jc3Vicy0+dW5saW5rX21hc2sgPSAwOwotCXN1YnMtPnJ1bm5pbmcgPSAxOwotCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7Ci0JCWVyciA9IHVzYl9zdWJtaXRfdXJiKHN1YnMtPmRhdGF1cmJbaV0udXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBzdWJtaXQgZGF0YXBpcGUgIgotCQkJCSAgICJmb3IgdXJiICVkLCBlcnJvciAlZDogJXNcbiIsCi0JCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwotCQkJZ290byBfX2Vycm9yOwotCQl9Ci0JCXNldF9iaXQoaSwgJnN1YnMtPmFjdGl2ZV9tYXNrKTsKLQl9Ci0JaWYgKHN1YnMtPnN5bmNwaXBlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTWU5DX1VSQlM7IGkrKykgewotCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIoc3Vicy0+c3luY3VyYltpXS51cmIsIEdGUF9BVE9NSUMpOwotCQkJaWYgKGVyciA8IDApIHsKLQkJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjYW5ub3Qgc3VibWl0IHN5bmNwaXBlICIKLQkJCQkJICAgImZvciB1cmIgJWQsIGVycm9yICVkOiAlc1xuIiwKLQkJCQkJICAgaSwgZXJyLCB1c2JfZXJyb3Jfc3RyaW5nKGVycikpOwotCQkJCWdvdG8gX19lcnJvcjsKLQkJCX0KLQkJCXNldF9iaXQoaSArIDE2LCAmc3Vicy0+YWN0aXZlX21hc2spOwotCQl9Ci0JfQotCXJldHVybiAwOwotCi0gX19lcnJvcjoKLQkvLyBzbmRfcGNtX3N0b3Aoc3Vicy0+cGNtX3N1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOwotCWRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKLQlyZXR1cm4gLUVQSVBFOwotfQotCi0KLS8qCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3VyYl9vcHMgYXVkaW9fdXJiX29wc1syXSA9IHsKLQl7Ci0JCS5wcmVwYXJlID0JcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJiLAotCQkucmV0aXJlID0JcmV0aXJlX3BsYXliYWNrX3VyYiwKLQkJLnByZXBhcmVfc3luYyA9CXByZXBhcmVfcGxheWJhY2tfc3luY191cmIsCi0JCS5yZXRpcmVfc3luYyA9CXJldGlyZV9wbGF5YmFja19zeW5jX3VyYiwKLQl9LAotCXsKLQkJLnByZXBhcmUgPQlwcmVwYXJlX2NhcHR1cmVfdXJiLAotCQkucmV0aXJlID0JcmV0aXJlX2NhcHR1cmVfdXJiLAotCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9jYXB0dXJlX3N5bmNfdXJiLAotCQkucmV0aXJlX3N5bmMgPQlyZXRpcmVfY2FwdHVyZV9zeW5jX3VyYiwKLQl9LAotfTsKLQotLyoKLSAqIGluaXRpYWxpemUgdGhlIHN1YnN0cmVhbSBpbnN0YW5jZS4KLSAqLwotCi12b2lkIHNuZF91c2JfaW5pdF9zdWJzdHJlYW0oc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcywKLQkJCSAgICBpbnQgc3RyZWFtLCBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9ICZhcy0+c3Vic3RyZWFtW3N0cmVhbV07Ci0KLQlJTklUX0xJU1RfSEVBRCgmc3Vicy0+Zm10X2xpc3QpOwotCXNwaW5fbG9ja19pbml0KCZzdWJzLT5sb2NrKTsKLQotCXN1YnMtPnN0cmVhbSA9IGFzOwotCXN1YnMtPmRpcmVjdGlvbiA9IHN0cmVhbTsKLQlzdWJzLT5kZXYgPSBhcy0+Y2hpcC0+ZGV2OwotCXN1YnMtPnR4ZnJfcXVpcmsgPSBhcy0+Y2hpcC0+dHhmcl9xdWlyazsKLQlzdWJzLT5vcHMgPSBhdWRpb191cmJfb3BzW3N0cmVhbV07Ci0JaWYgKHNuZF91c2JfZ2V0X3NwZWVkKHN1YnMtPmRldikgPj0gVVNCX1NQRUVEX0hJR0gpCi0JCXN1YnMtPm9wcy5wcmVwYXJlX3N5bmMgPSBwcmVwYXJlX2NhcHR1cmVfc3luY191cmJfaHM7Ci0KLQlzbmRfdXNiX3NldF9wY21fb3BzKGFzLT5wY20sIHN0cmVhbSk7Ci0KLQlsaXN0X2FkZF90YWlsKCZmcC0+bGlzdCwgJnN1YnMtPmZtdF9saXN0KTsKLQlzdWJzLT5mb3JtYXRzIHw9IGZwLT5mb3JtYXRzOwotCXN1YnMtPmVuZHBvaW50ID0gZnAtPmVuZHBvaW50OwotCXN1YnMtPm51bV9mb3JtYXRzKys7Ci0Jc3Vicy0+Zm10X3R5cGUgPSBmcC0+Zm10X3R5cGU7Ci19Ci0KLWludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX3BsYXliYWNrX3VyYjsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgc25kX3VzYl9zdWJzdHJlYW1fY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX2NhcHR1cmVfdXJiOwotCQlyZXR1cm4gc3RhcnRfdXJicyhzdWJzLCBzdWJzdHJlYW0tPnJ1bnRpbWUpOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcmV0dXJuIGRlYWN0aXZhdGVfdXJicyhzdWJzLCAwLCAwKTsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfcGF1c2VkX2NhcHR1cmVfdXJiOwotCQlyZXR1cm4gMDsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXN1YnMtPm9wcy5yZXRpcmUgPSByZXRpcmVfY2FwdHVyZV91cmI7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCS8qIGNsZWFyIHVyYnMgKHRvIGJlIHN1cmUpICovCi0JZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDEpOwotCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKLQotCS8qIGZvciBwbGF5YmFjaywgc3VibWl0IHRoZSBVUkJzIG5vdzsgb3RoZXJ3aXNlLCB0aGUgZmlyc3QgaHdwdHJfZG9uZQotCSAqIHVwZGF0ZXMgZm9yIGFsbCBVUkJzIHdvdWxkIGhhcHBlbiBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gc3RhcnRpbmcgKi8KLQlpZiAoc3Vicy0+ZGlyZWN0aW9uID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJc3Vicy0+b3BzLnByZXBhcmUgPSBwcmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7Ci0JCXJldHVybiBzdGFydF91cmJzKHN1YnMsIHJ1bnRpbWUpOwotCX0KLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXJiLmggYi9zb3VuZC91c2IvdXJiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGRhMzguLjAwMDAwMDAKLS0tIGEvc291bmQvdXNiL3VyYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotI2lmbmRlZiBfX1VTQkFVRElPX1VSQl9ICi0jZGVmaW5lIF9fVVNCQVVESU9fVVJCX0gKLQotdm9pZCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX3N0cmVhbSAqYXMsCi0JCQkgICAgaW50IHN0cmVhbSwKLQkJCSAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZwKTsKLQotaW50IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCi0JCQkJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywKLQkJCQl1bnNpZ25lZCBpbnQgcmF0ZSwKLQkJCQl1bnNpZ25lZCBpbnQgZnJhbWVfYml0cyk7Ci0KLXZvaWQgc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywgaW50IGZvcmNlKTsKLQotaW50IHNuZF91c2Jfc3Vic3RyZWFtX3ByZXBhcmUoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSk7Ci0KLWludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKTsKLWludCBzbmRfdXNiX3N1YnN0cmVhbV9jYXB0dXJlX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpOwotCi0jZW5kaWYgLyogX19VU0JBVURJT19VUkJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmggYi9zb3VuZC91c2IvdXNiYXVkaW8uaAppbmRleCAxZTc5OTg2Li4zZTJiMDM1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uaAorKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uaApAQCAtODAsNiArODAsNyBAQAogCVFVSVJLX01JRElfQ01FLAogCVFVSVJLX01JRElfQUtBSSwKIAlRVUlSS19NSURJX1VTMTIyTCwKKwlRVUlSS19NSURJX0ZUREksCiAJUVVJUktfQVVESU9fU1RBTkRBUkRfSU5URVJGQUNFLAogCVFVSVJLX0FVRElPX0ZJWEVEX0VORFBPSU5ULAogCVFVSVJLX0FVRElPX0VESVJPTF9VQVhYLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IDA4NGU2ZmMuLjcyNmMxYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5YXVkaW8uYwppbmRleCA1ZDM3ZDFjLi42ZmZiMzcxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXNidXN4MnlhdWRpby5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeWF1ZGlvLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IGY4MjQ4MGYuLjZhYjU4Y2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTI2MiwxMyArMjYyLDE2IEBACiAKIHN0YXRpYyB2b2lkIG9wZW5fY291bnRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zLCAqZmlyc3Q7CiAKIAlpZiAoZXZsaXN0LT5jcHVzLT5tYXBbMF0gPCAwKQogCQlub19pbmhlcml0ID0gdHJ1ZTsKIAorCWZpcnN0ID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZwb3MtPmF0dHI7CisJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CiAJCS8qCiAJCSAqIENoZWNrIGlmIHBhcnNlX3NpbmdsZV90cmFjZXBvaW50X2V2ZW50IGhhcyBhbHJlYWR5IGFza2VkIGZvcgogCQkgKiBQRVJGX1NBTVBMRV9USU1FLgpAQCAtMjgzLDE1ICsyODYsMTkgQEAKIAkJICovCiAJCWJvb2wgdGltZV9uZWVkZWQgPSBhdHRyLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUU7CiAKKwkJaWYgKGdyb3VwICYmIHBvcyAhPSBmaXJzdCkKKwkJCWdyb3VwX2ZkID0gZmlyc3QtPmZkOworCiAJCWNvbmZpZ19hdHRyKHBvcywgZXZsaXN0KTsKIHJldHJ5X3NhbXBsZV9pZDoKIAkJYXR0ci0+c2FtcGxlX2lkX2FsbCA9IHNhbXBsZV9pZF9hbGxfYXZhaWwgPyAxIDogMDsKIHRyeV9hZ2FpbjoKLQkJaWYgKHBlcmZfZXZzZWxfX29wZW4ocG9zLCBldmxpc3QtPmNwdXMsIGV2bGlzdC0+dGhyZWFkcywgZ3JvdXApIDwgMCkgeworCQlpZiAocGVyZl9ldnNlbF9fb3Blbihwb3MsIGV2bGlzdC0+Y3B1cywgZXZsaXN0LT50aHJlYWRzLCBncm91cCwKKwkJCQkgICAgIGdyb3VwX2ZkKSA8IDApIHsKIAkJCWludCBlcnIgPSBlcnJubzsKIAogCQkJaWYgKGVyciA9PSBFUEVSTSB8fCBlcnIgPT0gRUFDQ0VTKSB7Ci0JCQkJdWlfX3dhcm5pbmdfcGFyYW5vaWQoKTsKKwkJCQl1aV9fZXJyb3JfcGFyYW5vaWQoKTsKIAkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CiAJCQl9IGVsc2UgaWYgKGVyciA9PSAgRU5PREVWICYmIGNwdV9saXN0KSB7CiAJCQkJZGllKCJObyBzdWNoIGRldmljZSAtIGRpZCB5b3Ugc3BlY2lmeSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IDdjZTY1ZjUuLjdkOTg2NzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtMjc4LDkgKzI3OCwxNCBAQAogc3RydWN0IHN0YXRzCQkJcnVudGltZV9kdGxiX2NhY2hlX3N0YXRzW01BWF9OUl9DUFVTXTsKIHN0cnVjdCBzdGF0cwkJCXdhbGx0aW1lX25zZWNzX3N0YXRzOwogCi1zdGF0aWMgaW50IGNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCitzdGF0aWMgaW50IGNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJICAgIHN0cnVjdCBwZXJmX2V2c2VsICpmaXJzdCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CisKKwlpZiAoZ3JvdXAgJiYgZXZzZWwgIT0gZmlyc3QpCisJCWdyb3VwX2ZkID0gZmlyc3QtPmZkOwogCiAJaWYgKHNjYWxlKQogCQlhdHRyLT5yZWFkX2Zvcm1hdCA9IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8CkBAIC0yODksMTQgKzI5NCwxNSBAQAogCWF0dHItPmluaGVyaXQgPSAhbm9faW5oZXJpdDsKIAogCWlmIChzeXN0ZW1fd2lkZSkKLQkJcmV0dXJuIHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShldnNlbCwgZXZzZWxfbGlzdC0+Y3B1cywgZ3JvdXApOwotCisJCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl9jcHUoZXZzZWwsIGV2c2VsX2xpc3QtPmNwdXMsCisJCQkJCQlncm91cCwgZ3JvdXBfZmQpOwogCWlmICh0YXJnZXRfcGlkID09IC0xICYmIHRhcmdldF90aWQgPT0gLTEpIHsKIAkJYXR0ci0+ZGlzYWJsZWQgPSAxOwogCQlhdHRyLT5lbmFibGVfb25fZXhlYyA9IDE7CiAJfQogCi0JcmV0dXJuIHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChldnNlbCwgZXZzZWxfbGlzdC0+dGhyZWFkcywgZ3JvdXApOworCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoZXZzZWwsIGV2c2VsX2xpc3QtPnRocmVhZHMsCisJCQkJCSAgIGdyb3VwLCBncm91cF9mZCk7CiB9CiAKIC8qCkBAIC0zOTYsNyArNDAyLDcgQEAKIHN0YXRpYyBpbnQgcnVuX3BlcmZfc3RhdChpbnQgYXJnYyBfX3VzZWQsIGNvbnN0IGNoYXIgKiphcmd2KQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyB0MCwgdDE7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKmNvdW50ZXI7CisJc3RydWN0IHBlcmZfZXZzZWwgKmNvdW50ZXIsICpmaXJzdDsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgY2hpbGRfcmVhZHlfcGlwZVsyXSwgZ29fcGlwZVsyXTsKIAljb25zdCBib29sIGZvcmtzID0gKGFyZ2MgPiAwKTsKQEAgLTQ1Myw4ICs0NTksMTAgQEAKIAkJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVswXSk7CiAJfQogCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2c2VsX2xpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmZXZzZWxfbGlzdC0+ZW50cmllcywgbm9kZSkgewotCQlpZiAoY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIpIDwgMCkgeworCQlpZiAoY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIsIGZpcnN0KSA8IDApIHsKIAkJCWlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PU1lTIHx8IGVycm5vID09IEVOT0VOVCkgewogCQkJCWlmICh2ZXJib3NlKQogCQkJCQl1aV9fd2FybmluZygiJXMgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsLlxuIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCmluZGV4IGVmZTY5NmYuLjgzMWQxYmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCWdvdG8gb3V0X3RocmVhZF9tYXBfZGVsZXRlOwogCX0KIAotCWlmIChwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoZXZzZWwsIHRocmVhZHMsIGZhbHNlKSA8IDApIHsKKwlpZiAocGVyZl9ldnNlbF9fb3Blbl9wZXJfdGhyZWFkKGV2c2VsLCB0aHJlYWRzLCBmYWxzZSwgTlVMTCkgPCAwKSB7CiAJCXByX2RlYnVnKCJmYWlsZWQgdG8gb3BlbiBjb3VudGVyOiAlcywgIgogCQkJICJ0d2VhayAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQ/XG4iLAogCQkJIHN0cmVycm9yKGVycm5vKSk7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJZ290byBvdXRfdGhyZWFkX21hcF9kZWxldGU7CiAJfQogCi0JaWYgKHBlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMsIGZhbHNlKSA8IDApIHsKKwlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZmFsc2UsIE5VTEwpIDwgMCkgewogCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIG9wZW4gY291bnRlcjogJXMsICIKIAkJCSAidHdlYWsgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkP1xuIiwKIAkJCSBzdHJlcnJvcihlcnJubykpOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAKIAkJcGVyZl9ldmxpc3RfX2FkZChldmxpc3QsIGV2c2Vsc1tpXSk7CiAKLQkJaWYgKHBlcmZfZXZzZWxfX29wZW4oZXZzZWxzW2ldLCBjcHVzLCB0aHJlYWRzLCBmYWxzZSkgPCAwKSB7CisJCWlmIChwZXJmX2V2c2VsX19vcGVuKGV2c2Vsc1tpXSwgY3B1cywgdGhyZWFkcywgZmFsc2UsIE5VTEwpIDwgMCkgewogCQkJcHJfZGVidWcoImZhaWxlZCB0byBvcGVuIGNvdW50ZXI6ICVzLCAiCiAJCQkJICJ0d2VhayAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQ/XG4iLAogCQkJCSBzdHJlcnJvcihlcnJubykpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IDdhODcxNzEuLmM5Y2RlZGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTg5LDYgKzg5LDcgQEAKIHN0YXRpYyBib29sCQkJaW5oZXJpdAkJCQk9ICBmYWxzZTsKIHN0YXRpYyBpbnQJCQlyZWFsdGltZV9wcmlvCQkJPSAgICAgIDA7CiBzdGF0aWMgYm9vbAkJCWdyb3VwCQkJCT0gIGZhbHNlOworc3RhdGljIGJvb2wJCQlzYW1wbGVfaWRfYWxsX2F2YWlsCQk9ICAgdHJ1ZTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJCW1tYXBfcGFnZXMJCQk9ICAgIDEyODsKIAogc3RhdGljIGJvb2wJCQlkdW1wX3N5bXRhYiAgICAgICAgICAgICAgICAgICAgID0gIGZhbHNlOwpAQCAtMTk5LDcgKzIwMCw4IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCiAJaWYgKGhlID09IE5VTEwgfHwgaGUtPm1zLnN5bSA9PSBOVUxMIHx8Ci0JICAgIChoZSAhPSB0b3Auc3ltX2ZpbHRlcl9lbnRyeSAmJiB1c2VfYnJvd3NlciAhPSAxKSkKKwkgICAgKCh0b3Auc3ltX2ZpbHRlcl9lbnRyeSA9PSBOVUxMIHx8CisJICAgICAgdG9wLnN5bV9maWx0ZXJfZW50cnktPm1zLnN5bSAhPSBoZS0+bXMuc3ltKSAmJiB1c2VfYnJvd3NlciAhPSAxKSkKIAkJcmV0dXJuOwogCiAJc3ltID0gaGUtPm1zLnN5bTsKQEAgLTI4OSwxMSArMjkxLDEzIEBACiAKIAlwcmludGYoIiUtKi4qc1xuIiwgd2luX3dpZHRoLCB3aW5fd2lkdGgsIGdyYXBoX2RvdHRlZF9saW5lKTsKIAotCWlmICh0b3AudG90YWxfbG9zdF93YXJuZWQgIT0gdG9wLnNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3QpIHsKLQkJdG9wLnRvdGFsX2xvc3Rfd2FybmVkID0gdG9wLnNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3Q7Ci0JCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBQRVJGX0NPTE9SX1JFRCwgIldBUk5JTkc6Iik7Ci0JCXByaW50ZigiIExPU1QgJSIgUFJJdTY0ICIgZXZlbnRzLCBDaGVjayBJTy9DUFUgb3ZlcmxvYWRcbiIsCi0JCSAgICAgICB0b3AudG90YWxfbG9zdF93YXJuZWQpOworCWlmICh0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9sb3N0X3dhcm5lZCAhPQorCSAgICB0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pIHsKKwkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQgPQorCQkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9SRUQsCisJCQkgICAgICAiV0FSTklORzogTE9TVCAlZCBjaHVua3MsIENoZWNrIElPL0NQVSBvdmVybG9hZCIsCisJCQkgICAgICB0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9sb3N0X3dhcm5lZCk7CiAJCSsrcHJpbnRlZDsKIAl9CiAKQEAgLTU2MSw3ICs1NjUsNiBAQAogCWhpc3RzX19kZWNheV9lbnRyaWVzX3RocmVhZGVkKCZ0LT5zeW1fZXZzZWwtPmhpc3RzLAogCQkJCSAgICAgIHRvcC5oaWRlX3VzZXJfc3ltYm9scywKIAkJCQkgICAgICB0b3AuaGlkZV9rZXJuZWxfc3ltYm9scyk7Ci0JaGlzdHNfX291dHB1dF9yZWNhbGNfY29sX2xlbigmdC0+c3ltX2V2c2VsLT5oaXN0cywgd2luc2l6ZS53c19yb3cgLSAzKTsKIH0KIAogc3RhdGljIHZvaWQgKmRpc3BsYXlfdGhyZWFkX3R1aSh2b2lkICphcmcgX191c2VkKQpAQCAtNjcxLDYgKzY3NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkJICAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewpAQCAtNzcwLDEyICs3NzQsOCBAQAogCX0KIAogCWlmIChhbC5zeW0gPT0gTlVMTCB8fCAhYWwuc3ltLT5pZ25vcmUpIHsKLQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CiAKLQkJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwodG9wLmV2bGlzdCwgc2FtcGxlLT5pZCk7Ci0JCWFzc2VydChldnNlbCAhPSBOVUxMKTsKLQogCQlpZiAoKHNvcnRfX2hhc19wYXJlbnQgfHwgc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgJiYKIAkJICAgIHNhbXBsZS0+Y2FsbGNoYWluKSB7CiAJCQllcnIgPSBwZXJmX3Nlc3Npb25fX3Jlc29sdmVfY2FsbGNoYWluKHNlc3Npb24sIGFsLnRocmVhZCwKQEAgLTgwNyw2ICs4MDcsNyBAQAogc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19tbWFwX3JlYWRfaWR4KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIGludCBpZHgpCiB7CiAJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQ7CiAJaW50IHJldDsKIApAQCAtODE3LDEwICs4MTgsMTYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwoc2VsZi0+ZXZsaXN0LCBzYW1wbGUuaWQpOworCQlhc3NlcnQoZXZzZWwgIT0gTlVMTCk7CisKIAkJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA9PSBQRVJGX1JFQ09SRF9TQU1QTEUpCi0JCQlwZXJmX2V2ZW50X19wcm9jZXNzX3NhbXBsZShldmVudCwgJnNhbXBsZSwgc2VsZik7Ci0JCWVsc2UKKwkJCXBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKGV2ZW50LCBldnNlbCwgJnNhbXBsZSwgc2VsZik7CisJCWVsc2UgaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA8IFBFUkZfUkVDT1JEX01BWCkgeworCQkJaGlzdHNfX2luY19ucl9ldmVudHMoJmV2c2VsLT5oaXN0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJCXBlcmZfZXZlbnRfX3Byb2Nlc3MoZXZlbnQsICZzYW1wbGUsIHNlbGYpOworCQl9IGVsc2UKKwkJCSsrc2VsZi0+aGlzdHMuc3RhdHMubnJfdW5rbm93bl9ldmVudHM7CiAJfQogfQogCkBAIC04MzQsMTAgKzg0MSwxNiBAQAogCiBzdGF0aWMgdm9pZCBzdGFydF9jb3VudGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlcjsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlciwgKmZpcnN0OworCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZjb3VudGVyLT5hdHRyOworCQlzdHJ1Y3QgeHlhcnJheSAqZ3JvdXBfZmQgPSBOVUxMOworCisJCWlmIChncm91cCAmJiBjb3VudGVyICE9IGZpcnN0KQorCQkJZ3JvdXBfZmQgPSBmaXJzdC0+ZmQ7CiAKIAkJYXR0ci0+c2FtcGxlX3R5cGUgPSBQRVJGX1NBTVBMRV9JUCB8IFBFUkZfU0FNUExFX1RJRDsKIApAQCAtODU4LDE0ICs4NzEsMjMgQEAKIAkJYXR0ci0+bW1hcCA9IDE7CiAJCWF0dHItPmNvbW0gPSAxOwogCQlhdHRyLT5pbmhlcml0ID0gaW5oZXJpdDsKK3JldHJ5X3NhbXBsZV9pZDoKKwkJYXR0ci0+c2FtcGxlX2lkX2FsbCA9IHNhbXBsZV9pZF9hbGxfYXZhaWwgPyAxIDogMDsKIHRyeV9hZ2FpbjoKIAkJaWYgKHBlcmZfZXZzZWxfX29wZW4oY291bnRlciwgdG9wLmV2bGlzdC0+Y3B1cywKLQkJCQkgICAgIHRvcC5ldmxpc3QtPnRocmVhZHMsIGdyb3VwKSA8IDApIHsKKwkJCQkgICAgIHRvcC5ldmxpc3QtPnRocmVhZHMsIGdyb3VwLAorCQkJCSAgICAgZ3JvdXBfZmQpIDwgMCkgewogCQkJaW50IGVyciA9IGVycm5vOwogCiAJCQlpZiAoZXJyID09IEVQRVJNIHx8IGVyciA9PSBFQUNDRVMpIHsKLQkJCQl1aV9fd2FybmluZ19wYXJhbm9pZCgpOworCQkJCXVpX19lcnJvcl9wYXJhbm9pZCgpOwogCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0gZWxzZSBpZiAoZXJyID09IEVJTlZBTCAmJiBzYW1wbGVfaWRfYWxsX2F2YWlsKSB7CisJCQkJLyoKKwkJCQkgKiBPbGQga2VybmVsLCBubyBhdHRyLT5zYW1wbGVfaWRfdHlwZV9hbGwgZmllbGQKKwkJCQkgKi8KKwkJCQlzYW1wbGVfaWRfYWxsX2F2YWlsID0gZmFsc2U7CisJCQkJZ290byByZXRyeV9zYW1wbGVfaWQ7CiAJCQl9CiAJCQkvKgogCQkJICogSWYgaXQncyBjeWNsZXMgdGhlbiBmYWxsIGJhY2sgdG8gaHJ0aW1lcgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwppbmRleCBiYzhmNDc3Li4xMTllOTk2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwpAQCAtMzEwLDkgKzMxMCwxMiBAQAogCQl9CiAJCWVyciA9IC1FTk9FTlQ7CiAJCWRzby0+YW5ub3RhdGVfd2FybmVkID0gMTsKLQkJcHJfZXJyKCJDYW4ndCBhbm5vdGF0ZSAlczogTm8gdm1saW51eCBmaWxlJXMgd2FzIGZvdW5kIGluIHRoZSAiCi0JCSAgICAgICAicGF0aC5cblBsZWFzZSB1c2UgJ3BlcmYgYnVpbGRpZC1jYWNoZSAtYXYgdm1saW51eCcgb3IgIgotCQkgICAgICAgIi0tdm1saW51eCB2bWxpbnV4LlxuIiwKKwkJcHJfZXJyKCJDYW4ndCBhbm5vdGF0ZSAlczpcblxuIgorCQkgICAgICAgIk5vIHZtbGludXggZmlsZSVzXG53YXMgZm91bmQgaW4gdGhlIHBhdGguXG5cbiIKKwkJICAgICAgICJQbGVhc2UgdXNlOlxuXG4iCisJCSAgICAgICAiICBwZXJmIGJ1aWxkaWQtY2FjaGUgLWF2IHZtbGludXhcblxuIgorCQkgICAgICAgIm9yOlxuXG4iCisJCSAgICAgICAiICAtLXZtbGludXggdm1saW51eCIsCiAJCSAgICAgICBzeW0tPm5hbWUsIGJ1aWxkX2lkX21zZyA/OiAiIik7CiAJCWdvdG8gb3V0X2ZyZWVfZmlsZW5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMgYi90b29scy9wZXJmL3V0aWwvZGVidWcuYwppbmRleCAxNTU3NDlkLi4yNjgxN2RhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGVidWcuYworKysgYi90b29scy9wZXJmL3V0aWwvZGVidWcuYwpAQCAtNDcsMTkgKzQ3LDIwIEBACiB9CiAKICNpZmRlZiBOT19ORVdUX1NVUFBPUlQKLXZvaWQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitpbnQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKIAl2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOworCXJldHVybiAwOwogfQogI2VuZGlmCiAKLXZvaWQgdWlfX3dhcm5pbmdfcGFyYW5vaWQodm9pZCkKK2ludCB1aV9fZXJyb3JfcGFyYW5vaWQodm9pZCkKIHsKLQl1aV9fd2FybmluZygiUGVybWlzc2lvbiBlcnJvciAtIGFyZSB5b3Ugcm9vdD9cbiIKKwlyZXR1cm4gdWlfX2Vycm9yKCJQZXJtaXNzaW9uIGVycm9yIC0gYXJlIHlvdSByb290P1xuIgogCQkgICAgIkNvbnNpZGVyIHR3ZWFraW5nIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZDpcbiIKIAkJICAgICIgLTEgLSBOb3QgcGFyYW5vaWQgYXQgYWxsXG4iCiAJCSAgICAiICAwIC0gRGlzYWxsb3cgcmF3IHRyYWNlcG9pbnQgYWNjZXNzIGZvciB1bnByaXZcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5oIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKaW5kZXggZmQ1M2RiNC4uZjJjZTg4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmgKQEAgLTE5LDIzICsxOSwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1aV9wcm9ncmVzcyAqdWlfcHJvZ3Jlc3NfX25ldyhjb25zdCBjaGFyICp0aXRsZSBfX3VzZWQsCi0JCQkJCQkgICB1NjQgdG90YWwgX191c2VkKQotewotCXJldHVybiAoc3RydWN0IHVpX3Byb2dyZXNzICopMTsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1aV9wcm9ncmVzc19fdXBkYXRlKHU2NCBjdXJyIF9fdXNlZCwgdTY0IHRvdGFsIF9fdXNlZCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdGl0bGUgX191c2VkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYgX191c2VkLAotCQkJCSAgICAgICB1NjQgY3VyciBfX3VzZWQpIHt9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1aV9wcm9ncmVzc19fZGVsZXRlKHN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZiBfX3VzZWQpIHt9CisjZGVmaW5lIHVpX19lcnJvcihmb3JtYXQsIGFyZy4uLikgdWlfX3dhcm5pbmcoZm9ybWF0LCAjI2FyZykKICNlbHNlCiBleHRlcm4gY2hhciB1aV9oZWxwbGluZV9fbGFzdF9tc2dbXTsKIGludCB1aV9oZWxwbGluZV9fc2hvd19oZWxwKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CiAjaW5jbHVkZSAidWkvcHJvZ3Jlc3MuaCIKK2ludCB1aV9fZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CiAjZW5kaWYKIAotdm9pZCB1aV9fd2FybmluZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLXZvaWQgdWlfX3dhcm5pbmdfcGFyYW5vaWQodm9pZCk7CitpbnQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CitpbnQgdWlfX2Vycm9yX3BhcmFub2lkKHZvaWQpOwogCiAjZW5kaWYJLyogX19QRVJGX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwppbmRleCAyZjZiYzg5Li5mYmI0YjRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCkBAIC01MzksMyArNTM5LDMzIEBACiB7CiAJZXZsaXN0LT5zZWxlY3RlZCA9IGV2c2VsOwogfQorCitpbnQgcGVyZl9ldmxpc3RfX29wZW4oc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGJvb2wgZ3JvdXApCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCAqZmlyc3Q7CisJaW50IGVyciwgbmNwdXMsIG50aHJlYWRzOworCisJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2c2VsLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7CisJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZCA9IE5VTEw7CisKKwkJaWYgKGdyb3VwICYmIGV2c2VsICE9IGZpcnN0KQorCQkJZ3JvdXBfZmQgPSBmaXJzdC0+ZmQ7CisKKwkJZXJyID0gcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgZXZsaXN0LT5jcHVzLCBldmxpc3QtPnRocmVhZHMsCisJCQkJICAgICAgIGdyb3VwLCBncm91cF9mZCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCXJldHVybiAwOworb3V0X2VycjoKKwluY3B1cyA9IGV2bGlzdC0+Y3B1cyA/IGV2bGlzdC0+Y3B1cy0+bnIgOiAxOworCW50aHJlYWRzID0gZXZsaXN0LT50aHJlYWRzID8gZXZsaXN0LT50aHJlYWRzLT5uciA6IDE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZXZzZWwsICZldmxpc3QtPmVudHJpZXMsIG5vZGUpCisJCXBlcmZfZXZzZWxfX2Nsb3NlKGV2c2VsLCBuY3B1cywgbnRocmVhZHMpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaAppbmRleCA2YmU3MWZjLi4xNzc5ZmZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCkBAIC01MCw2ICs1MCw4IEBACiAKIHVuaW9uIHBlcmZfZXZlbnQgKnBlcmZfZXZsaXN0X19tbWFwX3JlYWQoc3RydWN0IHBlcmZfZXZsaXN0ICpzZWxmLCBpbnQgaWR4KTsKIAoraW50IHBlcmZfZXZsaXN0X19vcGVuKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBib29sIGdyb3VwKTsKKwogaW50IHBlcmZfZXZsaXN0X19hbGxvY19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKIGludCBwZXJmX2V2bGlzdF9fbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IHBhZ2VzLCBib29sIG92ZXJ3cml0ZSk7CiB2b2lkIHBlcmZfZXZsaXN0X19tdW5tYXAoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwppbmRleCBiNDZmNmU0Li5lNDI2MjY0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgInRocmVhZF9tYXAuaCIKIAogI2RlZmluZSBGRChlLCB4LCB5KSAoKihpbnQgKil4eWFycmF5X19lbnRyeShlLT5mZCwgeCwgeSkpCisjZGVmaW5lIEdST1VQX0ZEKGdyb3VwX2ZkLCBjcHUpICgqKGludCAqKXh5YXJyYXlfX2VudHJ5KGdyb3VwX2ZkLCBjcHUsIDApKQogCiBpbnQgX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZSh1NjQgc2FtcGxlX3R5cGUpCiB7CkBAIC0yMDQsMTUgKzIwNSwxNiBAQAogfQogCiBzdGF0aWMgaW50IF9fcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAotCQkJICAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApCisJCQkgICAgICBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywgYm9vbCBncm91cCwKKwkJCSAgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpCiB7CiAJaW50IGNwdSwgdGhyZWFkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWludCBwaWQgPSAtMTsKKwlpbnQgcGlkID0gLTEsIGVycjsKIAogCWlmIChldnNlbC0+ZmQgPT0gTlVMTCAmJgogCSAgICBwZXJmX2V2c2VsX19hbGxvY19mZChldnNlbCwgY3B1cy0+bnIsIHRocmVhZHMtPm5yKSA8IDApCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoZXZzZWwtPmNncnApIHsKIAkJZmxhZ3MgPSBQRVJGX0ZMQUdfUElEX0NHUk9VUDsKQEAgLTIyMCw3ICsyMjIsNyBAQAogCX0KIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1cy0+bnI7IGNwdSsrKSB7Ci0JCWludCBncm91cF9mZCA9IC0xOworCQlpbnQgZ3JvdXBfZmQgPSBncm91cF9mZHMgPyBHUk9VUF9GRChncm91cF9mZHMsIGNwdSkgOiAtMTsKIAogCQlmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHRocmVhZHMtPm5yOyB0aHJlYWQrKykgewogCkBAIC0yMzEsOCArMjMzLDEwIEBACiAJCQkJCQkJCSAgICAgcGlkLAogCQkJCQkJCQkgICAgIGNwdXMtPm1hcFtjcHVdLAogCQkJCQkJCQkgICAgIGdyb3VwX2ZkLCBmbGFncyk7Ci0JCQlpZiAoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA8IDApCisJCQlpZiAoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA8IDApIHsKKwkJCQllcnIgPSAtZXJybm87CiAJCQkJZ290byBvdXRfY2xvc2U7CisJCQl9CiAKIAkJCWlmIChncm91cCAmJiBncm91cF9mZCA9PSAtMSkKIAkJCQlncm91cF9mZCA9IEZEKGV2c2VsLCBjcHUsIHRocmVhZCk7CkBAIC0yNDksNyArMjUzLDE3IEBACiAJCX0KIAkJdGhyZWFkID0gdGhyZWFkcy0+bnI7CiAJfSB3aGlsZSAoLS1jcHUgPj0gMCk7Ci0JcmV0dXJuIC0xOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgcGVyZl9ldnNlbF9fY2xvc2Uoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBpbnQgbmNwdXMsIGludCBudGhyZWFkcykKK3sKKwlpZiAoZXZzZWwtPmZkID09IE5VTEwpCisJCXJldHVybjsKKworCXBlcmZfZXZzZWxfX2Nsb3NlX2ZkKGV2c2VsLCBuY3B1cywgbnRocmVhZHMpOworCXBlcmZfZXZzZWxfX2ZyZWVfZmQoZXZzZWwpOworCWV2c2VsLT5mZCA9IE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMjY5LDcgKzI4Myw4IEBACiB9OwogCiBpbnQgcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAotCQkgICAgIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwKQorCQkgICAgIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwLAorCQkgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZCkKIHsKIAlpZiAoY3B1cyA9PSBOVUxMKSB7CiAJCS8qIFdvcmsgYXJvdW5kIG9sZCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpY3QgYWxpYXNpbmcgKi8KQEAgLTI3OSwxOSArMjk0LDIzIEBACiAJaWYgKHRocmVhZHMgPT0gTlVMTCkKIAkJdGhyZWFkcyA9ICZlbXB0eV90aHJlYWRfbWFwLm1hcDsKIAotCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMsIGdyb3VwKTsKKwlyZXR1cm4gX19wZXJmX2V2c2VsX19vcGVuKGV2c2VsLCBjcHVzLCB0aHJlYWRzLCBncm91cCwgZ3JvdXBfZmQpOwogfQogCiBpbnQgcGVyZl9ldnNlbF9fb3Blbl9wZXJfY3B1KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIGJvb2wgZ3JvdXApCisJCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBib29sIGdyb3VwLAorCQkJICAgICBzdHJ1Y3QgeHlhcnJheSAqZ3JvdXBfZmQpCiB7Ci0JcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgJmVtcHR5X3RocmVhZF9tYXAubWFwLCBncm91cCk7CisJcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgJmVtcHR5X3RocmVhZF9tYXAubWFwLCBncm91cCwKKwkJCQkgIGdyb3VwX2ZkKTsKIH0KIAogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApCisJCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXAsCisJCQkJc3RydWN0IHh5YXJyYXkgKmdyb3VwX2ZkKQogewotCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsICZlbXB0eV9jcHVfbWFwLm1hcCwgdGhyZWFkcywgZ3JvdXApOworCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsICZlbXB0eV9jcHVfbWFwLm1hcCwgdGhyZWFkcywgZ3JvdXAsCisJCQkJICBncm91cF9mZCk7CiB9CiAKIHN0YXRpYyBpbnQgcGVyZl9ldmVudF9fcGFyc2VfaWRfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKaW5kZXggZTlhMzE1NS4uYjFkMTVlNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKQEAgLTgyLDExICs4MiwxNSBAQAogdm9pZCBwZXJmX2V2c2VsX19jbG9zZV9mZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGludCBuY3B1cywgaW50IG50aHJlYWRzKTsKIAogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBib29sIGdyb3VwKTsKKwkJCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIGJvb2wgZ3JvdXAsCisJCQkgICAgIHN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpOwogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXApOworCQkJCXN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzLCBib29sIGdyb3VwLAorCQkJCXN0cnVjdCB4eWFycmF5ICpncm91cF9mZHMpOwogaW50IHBlcmZfZXZzZWxfX29wZW4oc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgY3B1X21hcCAqY3B1cywKLQkJICAgICBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywgYm9vbCBncm91cCk7CisJCSAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsIGJvb2wgZ3JvdXAsCisJCSAgICAgc3RydWN0IHh5YXJyYXkgKmdyb3VwX2Zkcyk7Cit2b2lkIHBlcmZfZXZzZWxfX2Nsb3NlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMpOwogCiAjZGVmaW5lIHBlcmZfZXZzZWxfX21hdGNoKGV2c2VsLCB0LCBjKQkJXAogCShldnNlbC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV8jI3QgJiYJXApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCmluZGV4IDc2YzBiMmMuLmJjZDA1ZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKQEAgLTEsNSArMSw2IEBACiAjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CiAKKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTExLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgImV2bGlzdC5oIgogI2luY2x1ZGUgImV2c2VsLmgiCi0jaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImhlYWRlci5oIgogI2luY2x1ZGUgIi4uL3BlcmYuaCIKICNpbmNsdWRlICJ0cmFjZS1ldmVudC5oIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKaW5kZXggZjZhOTkzOS4uYTM2YTNmYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC0zNjUsNyArMzY1LDYgQEAKIAogCXJvb3QgPSBoaXN0c19fZ2V0X3JvdGF0ZV9lbnRyaWVzX2luKGhpc3RzKTsKIAluZXh0ID0gcmJfZmlyc3Qocm9vdCk7Ci0JaGlzdHMtPnN0YXRzLnRvdGFsX3BlcmlvZCA9IDA7CiAKIAl3aGlsZSAobmV4dCkgewogCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGVfaW4pOwpAQCAtMzc5LDcgKzM3OCw2IEBACiAJCQkgKiBiZWVuIHNldCBieSwgc2F5LCB0aGUgaGlzdF9icm93c2VyLgogCQkJICovCiAJCQloaXN0c19fYXBwbHlfZmlsdGVycyhoaXN0cywgbik7Ci0JCQloaXN0c19faW5jX25yX2VudHJpZXMoaGlzdHMsIG4pOwogCQl9CiAJfQogfQpAQCAtNDQyLDYgKzQ0MCw3IEBACiAJaGlzdHMtPmVudHJpZXMgPSBSQl9ST09UOwogCiAJaGlzdHMtPm5yX2VudHJpZXMgPSAwOworCWhpc3RzLT5zdGF0cy50b3RhbF9wZXJpb2QgPSAwOwogCWhpc3RzX19yZXNldF9jb2xfbGVuKGhpc3RzKTsKIAogCXdoaWxlIChuZXh0KSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCBmZjkzZGRjLi5jODZjMWQyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTI4LDYgKzI4LDcgQEAKIAl1NjQgdG90YWxfbG9zdDsKIAl1NjQgdG90YWxfaW52YWxpZF9jaGFpbnM7CiAJdTMyIG5yX2V2ZW50c1tQRVJGX1JFQ09SRF9IRUFERVJfTUFYXTsKKwl1MzIgbnJfbG9zdF93YXJuZWQ7CiAJdTMyIG5yX3Vua25vd25fZXZlbnRzOwogCXUzMiBucl9pbnZhbGlkX2NoYWluczsKIAl1MzIgbnJfdW5rbm93bl9pZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24uYwppbmRleCA3NjI0MzI0Li45ZGQ0N2E0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHl0aG9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi5jCkBAIC02MjMsNyArNjIzLDExIEBACiAJCWNwdXMgPSAoKHN0cnVjdCBweXJmX2NwdV9tYXAgKilwY3B1cyktPmNwdXM7CiAKIAlldnNlbC0+YXR0ci5pbmhlcml0ID0gaW5oZXJpdDsKLQlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZ3JvdXApIDwgMCkgeworCS8qCisJICogVGhpcyB3aWxsIGdyb3VwIGp1c3QgdGhlIGZkcyBmb3IgdGhpcyBzaW5nbGUgZXZzZWwsIHRvIGdyb3VwCisJICogbXVsdGlwbGUgZXZlbnRzLCB1c2UgZXZsaXN0Lm9wZW4oKS4KKwkgKi8KKwlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcywgZ3JvdXAsIE5VTEwpIDwgMCkgewogCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTgxNCw2ICs4MTgsMjUgQEAKIAlyZXR1cm4gUHlfTm9uZTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICpweXJmX2V2bGlzdF9fb3BlbihzdHJ1Y3QgcHlyZl9ldmxpc3QgKnBldmxpc3QsCisJCQkJICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAmcGV2bGlzdC0+ZXZsaXN0OworCWludCBncm91cCA9IDA7CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyAiZ3JvdXAiLCBOVUxMIH07CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T09paSIsIGt3bGlzdCwgJmdyb3VwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocGVyZl9ldmxpc3RfX29wZW4oZXZsaXN0LCBncm91cCkgPCAwKSB7CisJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworfQorCiBzdGF0aWMgUHlNZXRob2REZWYgcHlyZl9ldmxpc3RfX21ldGhvZHNbXSA9IHsKIAl7CiAJCS5tbF9uYW1lICA9ICJtbWFwIiwKQEAgLTgyMiw2ICs4NDUsMTIgQEAKIAkJLm1sX2RvYwkgID0gUHlEb2NfU1RSKCJtbWFwIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUuIikKIAl9LAogCXsKKwkJLm1sX25hbWUgID0gIm9wZW4iLAorCQkubWxfbWV0aCAgPSAoUHlDRnVuY3Rpb24pcHlyZl9ldmxpc3RfX29wZW4sCisJCS5tbF9mbGFncyA9IE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisJCS5tbF9kb2MJICA9IFB5RG9jX1NUUigib3BlbiB0aGUgZmlsZSBkZXNjcmlwdG9ycy4iKQorCX0sCisJewogCQkubWxfbmFtZSAgPSAicG9sbCIsCiAJCS5tbF9tZXRoICA9IChQeUNGdW5jdGlvbilweXJmX2V2bGlzdF9fcG9sbCwKIAkJLm1sX2ZsYWdzID0gTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCmluZGV4IDIwZTAxMWMuLjg1YzFlNmI3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTUwMiw2ICs1MDIsNyBAQAogCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGU7CiAJdTY0IGxpbWl0ID0gb3MtPm5leHRfZmx1c2g7CiAJdTY0IGxhc3RfdHMgPSBvcy0+bGFzdF9zYW1wbGUgPyBvcy0+bGFzdF9zYW1wbGUtPnRpbWVzdGFtcCA6IDBVTEw7CisJdW5zaWduZWQgaWR4ID0gMCwgcHJvZ3Jlc3NfbmV4dCA9IG9zLT5ucl9zYW1wbGVzIC8gMTY7CiAJaW50IHJldDsKIAogCWlmICghb3BzLT5vcmRlcmVkX3NhbXBsZXMgfHwgIWxpbWl0KQpAQCAtNTIxLDYgKzUyMiwxMSBAQAogCQlvcy0+bGFzdF9mbHVzaCA9IGl0ZXItPnRpbWVzdGFtcDsKIAkJbGlzdF9kZWwoJml0ZXItPmxpc3QpOwogCQlsaXN0X2FkZCgmaXRlci0+bGlzdCwgJm9zLT5zYW1wbGVfY2FjaGUpOworCQlpZiAoKytpZHggPj0gcHJvZ3Jlc3NfbmV4dCkgeworCQkJcHJvZ3Jlc3NfbmV4dCArPSBvcy0+bnJfc2FtcGxlcyAvIDE2OworCQkJdWlfcHJvZ3Jlc3NfX3VwZGF0ZShpZHgsIG9zLT5ucl9zYW1wbGVzLAorCQkJCQkgICAgIlByb2Nlc3NpbmcgdGltZSBvcmRlcmVkIGV2ZW50cy4uLiIpOworCQl9CiAJfQogCiAJaWYgKGxpc3RfZW1wdHkoaGVhZCkpIHsKQEAgLTUyOSw2ICs1MzUsOCBAQAogCQlvcy0+bGFzdF9zYW1wbGUgPQogCQkJbGlzdF9lbnRyeShoZWFkLT5wcmV2LCBzdHJ1Y3Qgc2FtcGxlX3F1ZXVlLCBsaXN0KTsKIAl9CisKKwlvcy0+bnJfc2FtcGxlcyA9IDA7CiB9CiAKIC8qCkBAIC01ODgsNiArNTk2LDcgQEAKIAl1NjQgdGltZXN0YW1wID0gbmV3LT50aW1lc3RhbXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAorCSsrb3MtPm5yX3NhbXBsZXM7CiAJb3MtPmxhc3Rfc2FtcGxlID0gbmV3OwogCiAJaWYgKCFzYW1wbGUpIHsKQEAgLTczOCwxMCArNzQ3LDI3IEBACiAKIAlkdW1wX2V2ZW50KHNlc3Npb24sIGV2ZW50LCBmaWxlX29mZnNldCwgc2FtcGxlKTsKIAorCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlc3Npb24tPmV2bGlzdCwgc2FtcGxlLT5pZCk7CisJaWYgKGV2c2VsICE9IE5VTEwgJiYgZXZlbnQtPmhlYWRlci50eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSkgeworCQkvKgorCQkgKiBYWFggV2UncmUgbGVhdmluZyBQRVJGX1JFQ09SRF9TQU1QTEUgdW5uYWNvdW50ZWQgaGVyZQorCQkgKiBiZWNhdXNlIHRoZSB0b29scyByaWdodCBub3cgbWF5IGFwcGx5IGZpbHRlcnMsIGRpc2NhcmRpbmcKKwkJICogc29tZSBvZiB0aGUgc2FtcGxlcy4gRm9yIGNvbnNpc3RlbmN5LCBpbiB0aGUgZnV0dXJlIHdlCisJCSAqIHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlIG5yX2ZpbHRlcmVkX3NhbXBsZXMgYW5kIHJlbW92ZQorCQkgKiB0aGUgc2FtcGxlLT5wZXJpb2QgZnJvbSB0b3RhbF9zYW1wbGVfcGVyaW9kLCBldGMsIEtJU1MgZm9yCisJCSAqIG5vdyB0aG8uCisJCSAqCisJCSAqIEFsc28gdGVzdGluZyBhZ2FpbnN0IE5VTEwgYWxsb3dzIHVzIHRvIGhhbmRsZSBmaWxlcyB3aXRob3V0CisJCSAqIGF0dHIuc2FtcGxlX2lkX2FsbCBhbmQvb3Igd2l0aG91dCBQRVJGX1NBTVBMRV9JRC4gSW4gdGhlCisJCSAqIGZ1dHVyZSBwcm9iYWJseSBpdCdsbCBiZSBhIGdvb2QgaWRlYSB0byByZXN0cmljdCBldmVudAorCQkgKiBwcm9jZXNzaW5nIHZpYSBwZXJmX3Nlc3Npb24gdG8gZmlsZXMgd2l0aCBib3RoIHNldC4KKwkJICovCisJCWhpc3RzX19pbmNfbnJfZXZlbnRzKCZldnNlbC0+aGlzdHMsIGV2ZW50LT5oZWFkZXIudHlwZSk7CisJfQorCiAJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKIAljYXNlIFBFUkZfUkVDT1JEX1NBTVBMRToKIAkJZHVtcF9zYW1wbGUoc2Vzc2lvbiwgZXZlbnQsIHNhbXBsZSk7Ci0JCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlc3Npb24tPmV2bGlzdCwgc2FtcGxlLT5pZCk7CiAJCWlmIChldnNlbCA9PSBOVUxMKSB7CiAJCQkrK3Nlc3Npb24tPmhpc3RzLnN0YXRzLm5yX3Vua25vd25faWQ7CiAJCQlyZXR1cm4gLTE7CkBAIC04NzQsMTEgKzkwMCwxMSBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCiB7CiAJaWYgKG9wcy0+bG9zdCA9PSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QgJiYKLQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfbG9zdCAhPSAwKSB7Ci0JCXVpX193YXJuaW5nKCJQcm9jZXNzZWQgJSIgUFJJdTY0ICIgZXZlbnRzIGFuZCBMT1NUICUiIFBSSXU2NAotCQkJICAgICIhXG5cbkNoZWNrIElPL0NQVSBvdmVybG9hZCFcblxuIiwKLQkJCSAgICBzZXNzaW9uLT5oaXN0cy5zdGF0cy50b3RhbF9wZXJpb2QsCi0JCQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfbG9zdCk7CisJICAgIHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSAhPSAwKSB7CisJCXVpX193YXJuaW5nKCJQcm9jZXNzZWQgJWQgZXZlbnRzIGFuZCBsb3N0ICVkIGNodW5rcyFcblxuIgorCQkJICAgICJDaGVjayBJTy9DUFUgb3ZlcmxvYWQhXG5cbiIsCisJCQkgICAgc2Vzc2lvbi0+aGlzdHMuc3RhdHMubnJfZXZlbnRzWzBdLAorCQkJICAgIHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSk7CiAJfQogCiAJaWYgKHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX3Vua25vd25fZXZlbnRzICE9IDApIHsKQEAgLTEwMTIsNyArMTAzOCw2IEBACiB7CiAJdTY0IGhlYWQsIHBhZ2Vfb2Zmc2V0LCBmaWxlX29mZnNldCwgZmlsZV9wb3MsIHByb2dyZXNzX25leHQ7CiAJaW50IGVyciwgbW1hcF9wcm90LCBtbWFwX2ZsYWdzLCBtYXBfaWR4ID0gMDsKLQlzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnByb2dyZXNzOwogCXNpemVfdAlwYWdlX3NpemUsIG1tYXBfc2l6ZTsKIAljaGFyICpidWYsICptbWFwc1s4XTsKIAl1bmlvbiBwZXJmX2V2ZW50ICpldmVudDsKQEAgLTEwMzAsOSArMTA1NSw2IEBACiAJCWZpbGVfc2l6ZSA9IGRhdGFfb2Zmc2V0ICsgZGF0YV9zaXplOwogCiAJcHJvZ3Jlc3NfbmV4dCA9IGZpbGVfc2l6ZSAvIDE2OwotCXByb2dyZXNzID0gdWlfcHJvZ3Jlc3NfX25ldygiUHJvY2Vzc2luZyBldmVudHMuLi4iLCBmaWxlX3NpemUpOwotCWlmIChwcm9ncmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CiAKIAltbWFwX3NpemUgPSBzZXNzaW9uLT5tbWFwX3dpbmRvdzsKIAlpZiAobW1hcF9zaXplID4gZmlsZV9zaXplKQpAQCAtMTA5NSw3ICsxMTE3LDggQEAKIAogCWlmIChmaWxlX3BvcyA+PSBwcm9ncmVzc19uZXh0KSB7CiAJCXByb2dyZXNzX25leHQgKz0gZmlsZV9zaXplIC8gMTY7Ci0JCXVpX3Byb2dyZXNzX191cGRhdGUocHJvZ3Jlc3MsIGZpbGVfcG9zKTsKKwkJdWlfcHJvZ3Jlc3NfX3VwZGF0ZShmaWxlX3BvcywgZmlsZV9zaXplLAorCQkJCSAgICAiUHJvY2Vzc2luZyBldmVudHMuLi4iKTsKIAl9CiAKIAlpZiAoZmlsZV9wb3MgPCBmaWxlX3NpemUpCkBAIC0xMTA2LDcgKzExMjksNiBAQAogCXNlc3Npb24tPm9yZGVyZWRfc2FtcGxlcy5uZXh0X2ZsdXNoID0gVUxMT05HX01BWDsKIAlmbHVzaF9zYW1wbGVfcXVldWUoc2Vzc2lvbiwgb3BzKTsKIG91dF9lcnI6Ci0JdWlfcHJvZ3Jlc3NfX2RlbGV0ZShwcm9ncmVzcyk7CiAJcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhzZXNzaW9uLCBvcHMpOwogCXBlcmZfc2Vzc2lvbl9mcmVlX3NhbXBsZV9idWZmZXJzKHNlc3Npb24pOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaAppbmRleCA1MTRiMDZkLi42ZTM5M2M5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAlzdHJ1Y3Qgc2FtcGxlX3F1ZXVlCSpzYW1wbGVfYnVmZmVyOwogCXN0cnVjdCBzYW1wbGVfcXVldWUJKmxhc3Rfc2FtcGxlOwogCWludAkJCXNhbXBsZV9idWZmZXJfaWR4OworCXVuc2lnbmVkIGludAkJbnJfc2FtcGxlczsKIH07CiAKIHN0cnVjdCBwZXJmX3Nlc3Npb24gewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RvcC5oIGIvdG9vbHMvcGVyZi91dGlsL3RvcC5oCmluZGV4IDAxZDEwNTcuLjM5OTY1MDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90b3AuaAorKysgYi90b29scy9wZXJmL3V0aWwvdG9wLmgKQEAgLTE5LDcgKzE5LDYgQEAKIAl1NjQJCSAgIGtlcm5lbF9zYW1wbGVzLCB1c19zYW1wbGVzOwogCXU2NAkJICAgZXhhY3Rfc2FtcGxlczsKIAl1NjQJCSAgIGd1ZXN0X3VzX3NhbXBsZXMsIGd1ZXN0X2tlcm5lbF9zYW1wbGVzOwotCXU2NAkJICAgdG90YWxfbG9zdF93YXJuZWQ7CiAJaW50CQkgICBwcmludF9lbnRyaWVzLCBjb3VudF9maWx0ZXIsIGRlbGF5X3NlY3M7CiAJaW50CQkgICBmcmVxOwogCXBpZF90CQkgICB0YXJnZXRfcGlkLCB0YXJnZXRfdGlkOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1pbmZvLmMKaW5kZXggMmQ1MzBjZi4uZDI2NTVmMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYworKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jCkBAIC04MCw3ICs4MCw3IEBACiAJaW50IHJldCA9IGVycm5vOwogCiAJaWYgKGVycm5vKQotCQlwZXJyb3IoInRyYWNlLWNtZCIpOworCQlwZXJyb3IoInBlcmYiKTsKIAllbHNlCiAJCXJldCA9IC0xOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXIuYwppbmRleCA1MzU5ZjM3Li41NTY4MjkxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2VyLmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSAibGlic2xhbmcuaCIKICNpbmNsdWRlIDxuZXd0Lmg+CiAjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CkBAIC0xNjgsNiArMTY5LDU5IEBACiAJc2VsZi0+eCA9IDA7CiB9CiAKK3ZvaWQgdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlcikKK3sKKwl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGZhbHNlKTsKKwl1aV9icm93c2VyX19zaG93KGJyb3dzZXIsIGJyb3dzZXItPnRpdGxlLCB1aV9oZWxwbGluZV9fY3VycmVudCk7CisJdWlfYnJvd3Nlcl9fcmVmcmVzaChicm93c2VyKTsKK30KKworaW50IHVpX2Jyb3dzZXJfX3dhcm5pbmcoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGludCB0aW1lb3V0LAorCQkJY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgKnRleHQ7CisJaW50IGtleSA9IDAsIGVycjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJZXJyID0gdmFzcHJpbnRmKCZ0ZXh0LCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCWlmIChlcnIgPCAwKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCXVpX2hlbHBsaW5lX192cHVzaChmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfSBlbHNlIHsKKwkJd2hpbGUgKChrZXkgPT0gdWlfX3F1ZXN0aW9uX3dpbmRvdygiV2FybmluZyEiLCB0ZXh0LAorCQkJCQkJICAgIlByZXNzIGFueSBrZXkuLi4iLAorCQkJCQkJICAgdGltZW91dCkpID09IEtfUkVTSVpFKQorCQkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShicm93c2VyKTsKKwkJZnJlZSh0ZXh0KTsKKwl9CisKKwlyZXR1cm4ga2V5OworfQorCitpbnQgdWlfYnJvd3Nlcl9faGVscF93aW5kb3coc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJaW50IGtleTsKKworCXdoaWxlICgoa2V5ID0gdWlfX2hlbHBfd2luZG93KHRleHQpKSA9PSBLX1JFU0laRSkKKwkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZShicm93c2VyKTsKKworCXJldHVybiBrZXk7Cit9CisKK2Jvb2wgdWlfYnJvd3Nlcl9fZGlhbG9nX3llc25vKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCBjb25zdCBjaGFyICp0ZXh0KQoreworCWludCBrZXk7CisKKwl3aGlsZSAoKGtleSA9IHVpX19kaWFsb2dfeWVzbm8odGV4dCkpID09IEtfUkVTSVpFKQorCQl1aV9icm93c2VyX19oYW5kbGVfcmVzaXplKGJyb3dzZXIpOworCisJcmV0dXJuIGtleSA9PSBLX0VOVEVSIHx8IHRvdXBwZXIoa2V5KSA9PSAnWSc7Cit9CisKIHZvaWQgdWlfYnJvd3Nlcl9fcmVzZXRfaW5kZXgoc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpCiB7CiAJc2VsZi0+aW5kZXggPSBzZWxmLT50b3BfaWR4ID0gMDsKQEAgLTIzMCwxMyArMjg0LDE1IEBACiAJCSAgICAgICAoYnJvd3Nlci0+bnJfZW50cmllcyAtIDEpKTsKIAl9CiAKKwlTTHNtZ19zZXRfY2hhcl9zZXQoMSk7CisKIAl3aGlsZSAoaCA8IGhlaWdodCkgewogCSAgICAgICAgdWlfYnJvd3Nlcl9fZ290b3JjKGJyb3dzZXIsIHJvdysrLCBjb2wpOwotCQlTTHNtZ19zZXRfY2hhcl9zZXQoMSk7Ci0JCVNMc21nX3dyaXRlX2NoYXIoaCA9PSBwY3QgPyBTTFNNR19ESUFNT05EX0NIQVIgOiBTTFNNR19CT0FSRF9DSEFSKTsKLQkJU0xzbWdfc2V0X2NoYXJfc2V0KDApOworCQlTTHNtZ193cml0ZV9jaGFyKGggPT0gcGN0ID8gU0xTTUdfRElBTU9ORF9DSEFSIDogU0xTTUdfQ0tCUkRfQ0hBUik7CiAJCSsraDsKIAl9CisKKwlTTHNtZ19zZXRfY2hhcl9zZXQoMCk7CiB9CiAKIHN0YXRpYyBpbnQgX191aV9icm93c2VyX19yZWZyZXNoKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyKQpAQCAtMjkxLDUzICszNDcsMTAgQEAKIAlicm93c2VyLT5zZWVrKGJyb3dzZXIsIGJyb3dzZXItPnRvcF9pZHgsIFNFRUtfU0VUKTsKIH0KIAotc3RhdGljIGludCB1aV9fZ2V0Y2goaW50IGRlbGF5X3NlY3MpCi17Ci0Jc3RydWN0IHRpbWV2YWwgdGltZW91dCwgKnB0aW1lb3V0ID0gZGVsYXlfc2VjcyA/ICZ0aW1lb3V0IDogTlVMTDsKLQlmZF9zZXQgcmVhZF9zZXQ7Ci0JaW50IGVyciwga2V5OwotCi0JRkRfWkVSTygmcmVhZF9zZXQpOwotCUZEX1NFVCgwLCAmcmVhZF9zZXQpOwotCi0JaWYgKGRlbGF5X3NlY3MpIHsKLQkJdGltZW91dC50dl9zZWMgPSBkZWxheV9zZWNzOwotCQl0aW1lb3V0LnR2X3VzZWMgPSAwOwotCX0KLQotICAgICAgICBlcnIgPSBzZWxlY3QoMSwgJnJlYWRfc2V0LCBOVUxMLCBOVUxMLCBwdGltZW91dCk7Ci0KLQlpZiAoZXJyID09IDApCi0JCXJldHVybiBLX1RJTUVSOwotCi0JaWYgKGVyciA9PSAtMSkgewotCQlpZiAoZXJybm8gPT0gRUlOVFIpCi0JCQlyZXR1cm4gS19SRVNJWkU7Ci0JCXJldHVybiBLX0VSUk9SOwotCX0KLQotCWtleSA9IFNMYW5nX2dldGtleSgpOwotCWlmIChrZXkgIT0gS19FU0MpCi0JCXJldHVybiBrZXk7Ci0KLQlGRF9aRVJPKCZyZWFkX3NldCk7Ci0JRkRfU0VUKDAsICZyZWFkX3NldCk7Ci0JdGltZW91dC50dl9zZWMgPSAwOwotCXRpbWVvdXQudHZfdXNlYyA9IDIwOwotICAgICAgICBlcnIgPSBzZWxlY3QoMSwgJnJlYWRfc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCk7Ci0JaWYgKGVyciA9PSAwKQotCQlyZXR1cm4gS19FU0M7Ci0KLQlTTGFuZ191bmdldGtleShrZXkpOwotCXJldHVybiBTTGtwX2dldGtleSgpOwotfQotCiBpbnQgdWlfYnJvd3Nlcl9fcnVuKHN0cnVjdCB1aV9icm93c2VyICpzZWxmLCBpbnQgZGVsYXlfc2VjcykKIHsKIAlpbnQgZXJyLCBrZXk7CiAKLQlwdGhyZWFkX191bmJsb2NrX3NpZ3dpbmNoKCk7Ci0KIAl3aGlsZSAoMSkgewogCQlvZmZfdCBvZmZzZXQ7CiAKQEAgLTM1MSwxMCArMzY0LDcgQEAKIAkJa2V5ID0gdWlfX2dldGNoKGRlbGF5X3NlY3MpOwogCiAJCWlmIChrZXkgPT0gS19SRVNJWkUpIHsKLQkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOwotCQkJU0x0dF9nZXRfc2NyZWVuX3NpemUoKTsKLQkJCVNMc21nX3JlaW5pdF9zbWcoKTsKLQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7CisJCQl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGZhbHNlKTsKIAkJCXVpX2Jyb3dzZXJfX3JlZnJlc2hfZGltZW5zaW9ucyhzZWxmKTsKIAkJCV9fdWlfYnJvd3Nlcl9fc2hvd190aXRsZShzZWxmLCBzZWxmLT50aXRsZSk7CiAJCQl1aV9oZWxwbGluZV9fcHV0cyhzZWxmLT5oZWxwbGluZSk7CkBAIC01MzMsNiArNTQzLDQ3IEBACiAJcmV0dXJuIC0xOwogfQogCit2b2lkIHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3Nlciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCXN3aXRjaCAod2hlbmNlKSB7CisJY2FzZSBTRUVLX1NFVDoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+ZW50cmllczsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+dG9wICsgYnJvd3Nlci0+dG9wX2lkeCArIG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0VORDoKKwkJYnJvd3Nlci0+dG9wID0gYnJvd3Nlci0+dG9wICsgYnJvd3Nlci0+bnJfZW50cmllcyArIG9mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KK30KKwordW5zaWduZWQgaW50IHVpX2Jyb3dzZXJfX2FyZ3ZfcmVmcmVzaChzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlcikKK3sKKwl1bnNpZ25lZCBpbnQgcm93ID0gMCwgaWR4ID0gYnJvd3Nlci0+dG9wX2lkeDsKKwljaGFyICoqcG9zOworCisJaWYgKGJyb3dzZXItPnRvcCA9PSBOVUxMKQorCQlicm93c2VyLT50b3AgPSBicm93c2VyLT5lbnRyaWVzOworCisJcG9zID0gKGNoYXIgKiopYnJvd3Nlci0+dG9wOworCXdoaWxlIChpZHggPCBicm93c2VyLT5ucl9lbnRyaWVzKSB7CisJCWlmICghYnJvd3Nlci0+ZmlsdGVyIHx8ICFicm93c2VyLT5maWx0ZXIoYnJvd3NlciwgKnBvcykpIHsKKwkJCXVpX2Jyb3dzZXJfX2dvdG9yYyhicm93c2VyLCByb3csIDApOworCQkJYnJvd3Nlci0+d3JpdGUoYnJvd3NlciwgcG9zLCByb3cpOworCQkJaWYgKCsrcm93ID09IGJyb3dzZXItPmhlaWdodCkKKwkJCQlicmVhazsKKwkJfQorCisJCSsraWR4OworCQkrK3BvczsKKwl9CisKKwlyZXR1cm4gcm93OworfQorCiB2b2lkIHVpX2Jyb3dzZXJfX2luaXQodm9pZCkKIHsKIAlpbnQgaSA9IDA7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5oIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXIuaAppbmRleCBhMmM3MDdkLi44NGQ3NjFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3Nlci5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2VyLmgKQEAgLTQzLDYgKzQzLDE1IEBACiBpbnQgdWlfYnJvd3Nlcl9fcmVmcmVzaChzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZik7CiBpbnQgdWlfYnJvd3Nlcl9fcnVuKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCBpbnQgZGVsYXlfc2Vjcyk7CiB2b2lkIHVpX2Jyb3dzZXJfX3VwZGF0ZV9ucl9lbnRyaWVzKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLCB1MzIgbnJfZW50cmllcyk7Cit2b2lkIHVpX2Jyb3dzZXJfX2hhbmRsZV9yZXNpemUoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpOworCitpbnQgdWlfYnJvd3Nlcl9fd2FybmluZyhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlciwgaW50IHRpbWVvdXQsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitpbnQgdWlfYnJvd3Nlcl9faGVscF93aW5kb3coc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpOworYm9vbCB1aV9icm93c2VyX19kaWFsb2dfeWVzbm8oc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIsIGNvbnN0IGNoYXIgKnRleHQpOworCit2b2lkIHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3Nlciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK3Vuc2lnbmVkIGludCB1aV9icm93c2VyX19hcmd2X3JlZnJlc2goc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpOwogCiB2b2lkIHVpX2Jyb3dzZXJfX3JiX3RyZWVfc2VlayhzdHJ1Y3QgdWlfYnJvd3NlciAqc2VsZiwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKIHVuc2lnbmVkIGludCB1aV9icm93c2VyX19yYl90cmVlX3JlZnJlc2goc3RydWN0IHVpX2Jyb3dzZXIgKnNlbGYpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwppbmRleCA0ZTBjYjdmZS4uMDU3NTkwNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKQEAgLTEsNiArMSw5IEBACisjaW5jbHVkZSAiLi4vLi4vdXRpbC5oIgogI2luY2x1ZGUgIi4uL2Jyb3dzZXIuaCIKICNpbmNsdWRlICIuLi9oZWxwbGluZS5oIgogI2luY2x1ZGUgIi4uL2xpYnNsYW5nLmgiCisjaW5jbHVkZSAiLi4vdWkuaCIKKyNpbmNsdWRlICIuLi91dGlsLmgiCiAjaW5jbHVkZSAiLi4vLi4vYW5ub3RhdGUuaCIKICNpbmNsdWRlICIuLi8uLi9oaXN0LmgiCiAjaW5jbHVkZSAiLi4vLi4vc29ydC5oIgpAQCAtOCwxNSArMTEsNiBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxuZXd0Lmg+CiAKLXN0YXRpYyB2b2lkIHVpX19lcnJvcl93aW5kb3coY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCW5ld3RXaW5NZXNzYWdldigoY2hhciAqKSJFcnJvciIsIChjaGFyICopIk9rIiwgKGNoYXIgKilmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotfQotCiBzdHJ1Y3QgYW5ub3RhdGVfYnJvd3NlciB7CiAJc3RydWN0IHVpX2Jyb3dzZXIgYjsKIAlzdHJ1Y3QgcmJfcm9vdAkgIGVudHJpZXM7CkBAIC00MDAsNyArMzk0LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKHN5bWJvbF9fYW5ub3RhdGUoc3ltLCBtYXAsIHNpemVvZihzdHJ1Y3Qgb2JqZHVtcF9saW5lX3JiX25vZGUpKSA8IDApIHsKLQkJdWlfX2Vycm9yX3dpbmRvdyh1aV9oZWxwbGluZV9fbGFzdF9tc2cpOworCQl1aV9fZXJyb3IoIiVzIiwgdWlfaGVscGxpbmVfX2xhc3RfbXNnKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2hpc3RzLmMgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwppbmRleCA0NjYzZGNiLi5kMGM5NGI0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIi4uL2Jyb3dzZXIuaCIKICNpbmNsdWRlICIuLi9oZWxwbGluZS5oIgogI2luY2x1ZGUgIi4uL3V0aWwuaCIKKyNpbmNsdWRlICIuLi91aS5oIgogI2luY2x1ZGUgIm1hcC5oIgogCiBzdHJ1Y3QgaGlzdF9icm93c2VyIHsKQEAgLTI5NCw2ICsyOTUsMTUgQEAKIAl1aV9icm93c2VyX19yZXNldF9pbmRleCgmc2VsZi0+Yik7CiB9CiAKK3N0YXRpYyB2b2lkIHVpX2Jyb3dzZXJfX3dhcm5fbG9zdF9ldmVudHMoc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIpCit7CisJdWlfYnJvd3Nlcl9fd2FybmluZyhicm93c2VyLCA0LAorCQkiRXZlbnRzIGFyZSBiZWluZyBsb3N0LCBjaGVjayBJTy9DUFUgb3ZlcmxvYWQhXG5cbiIKKwkJIllvdSBtYXkgd2FudCB0byBydW4gJ3BlcmYnIHVzaW5nIGEgUlQgc2NoZWR1bGVyIHBvbGljeTpcblxuIgorCQkiIHBlcmYgdG9wIC1yIDgwXG5cbiIKKwkJIk9yIHJlZHVjZSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5LiIpOworfQorCiBzdGF0aWMgaW50IGhpc3RfYnJvd3Nlcl9fcnVuKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKnNlbGYsIGNvbnN0IGNoYXIgKmV2X25hbWUsCiAJCQkgICAgIHZvaWQoKnRpbWVyKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGludCBkZWxheV9zZWNzKQogewpAQCAtMzE0LDEyICszMjQsMTggQEAKIAkJa2V5ID0gdWlfYnJvd3Nlcl9fcnVuKCZzZWxmLT5iLCBkZWxheV9zZWNzKTsKIAogCQlzd2l0Y2ggKGtleSkgewotCQljYXNlIC0xOgotCQkJLyogRklYTUUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCB3YXMgZXMucmVhc29uID09IE5FV1RfRVhJVF9USU1FUiAqLworCQljYXNlIEtfVElNRVI6CiAJCQl0aW1lcihhcmcpOwogCQkJdWlfYnJvd3Nlcl9fdXBkYXRlX25yX2VudHJpZXMoJnNlbGYtPmIsIHNlbGYtPmhpc3RzLT5ucl9lbnRyaWVzKTsKLQkJCWhpc3RzX19icm93c2VyX3RpdGxlKHNlbGYtPmhpc3RzLCB0aXRsZSwgc2l6ZW9mKHRpdGxlKSwKLQkJCQkJICAgICBldl9uYW1lKTsKKworCQkJaWYgKHNlbGYtPmhpc3RzLT5zdGF0cy5ucl9sb3N0X3dhcm5lZCAhPQorCQkJICAgIHNlbGYtPmhpc3RzLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pIHsKKwkJCQlzZWxmLT5oaXN0cy0+c3RhdHMubnJfbG9zdF93YXJuZWQgPQorCQkJCQlzZWxmLT5oaXN0cy0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOworCQkJCXVpX2Jyb3dzZXJfX3dhcm5fbG9zdF9ldmVudHMoJnNlbGYtPmIpOworCQkJfQorCisJCQloaXN0c19fYnJvd3Nlcl90aXRsZShzZWxmLT5oaXN0cywgdGl0bGUsIHNpemVvZih0aXRsZSksIGV2X25hbWUpOwogCQkJdWlfYnJvd3Nlcl9fc2hvd190aXRsZSgmc2VsZi0+YiwgdGl0bGUpOwogCQkJY29udGludWU7CiAJCWNhc2UgJ0QnOiB7IC8qIERlYnVnICovCkBAIC04ODMsNyArODk5LDcgQEAKIAkJCWdvdG8gb3V0X2ZyZWVfc3RhY2s7CiAJCWNhc2UgJ2EnOgogCQkJaWYgKCFicm93c2VyLT5oYXNfc3ltYm9scykgewotCQkJCXVpX193YXJuaW5nKAorCQkJCXVpX2Jyb3dzZXJfX3dhcm5pbmcoJmJyb3dzZXItPmIsIGRlbGF5X3NlY3MgKiAyLAogCQkJIkFubm90YXRpb24gaXMgb25seSBhdmFpbGFibGUgZm9yIHN5bWJvbGljIHZpZXdzLCAiCiAJCQkiaW5jbHVkZSBcInN5bVwiIGluIC0tc29ydCB0byB1c2UgaXQuIik7CiAJCQkJY29udGludWU7CkBAIC05MDEsNyArOTE3LDggQEAKIAkJY2FzZSBLX0YxOgogCQljYXNlICdoJzoKIAkJY2FzZSAnPyc6Ci0JCQl1aV9faGVscF93aW5kb3coImgvPy9GMSAgICAgICAgU2hvdyB0aGlzIHdpbmRvd1xuIgorCQkJdWlfYnJvd3Nlcl9faGVscF93aW5kb3coJmJyb3dzZXItPmIsCisJCQkJCSJoLz8vRjEgICAgICAgIFNob3cgdGhpcyB3aW5kb3dcbiIKIAkJCQkJIlVQL0RPV04vUEdVUFxuIgogCQkJCQkiUEdETi9TUEFDRSAgICBOYXZpZ2F0ZVxuIgogCQkJCQkicS9FU0MvQ1RSTCtDICBFeGl0IGJyb3dzZXJcblxuIgpAQCAtOTE0LDcgKzkzMSw3IEBACiAJCQkJCSJDICAgICAgICAgICAgIENvbGxhcHNlIGFsbCBjYWxsY2hhaW5zXG4iCiAJCQkJCSJFICAgICAgICAgICAgIEV4cGFuZCBhbGwgY2FsbGNoYWluc1xuIgogCQkJCQkiZCAgICAgICAgICAgICBab29tIGludG8gY3VycmVudCBEU09cbiIKLQkJCQkJInQgICAgICAgICAgICAgWm9vbSBpbnRvIGN1cnJlbnQgVGhyZWFkXG4iKTsKKwkJCQkJInQgICAgICAgICAgICAgWm9vbSBpbnRvIGN1cnJlbnQgVGhyZWFkIik7CiAJCQljb250aW51ZTsKIAkJY2FzZSBLX0VOVEVSOgogCQljYXNlIEtfUklHSFQ6CkBAIC05NDAsNyArOTU3LDggQEAKIAkJfQogCQljYXNlIEtfRVNDOgogCQkJaWYgKCFsZWZ0X2V4aXRzICYmCi0JCQkgICAgIXVpX19kaWFsb2dfeWVzbm8oIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQorCQkJICAgICF1aV9icm93c2VyX19kaWFsb2dfeWVzbm8oJmJyb3dzZXItPmIsCisJCQkJCSAgICAgICAiRG8geW91IHJlYWxseSB3YW50IHRvIGV4aXQ/IikpCiAJCQkJY29udGludWU7CiAJCQkvKiBGYWxsIHRocnUgKi8KIAkJY2FzZSAncSc6CkBAIC05OTMsNiArMTAxMSw3IEBACiAKIAkJaWYgKGNob2ljZSA9PSBhbm5vdGF0ZSkgewogCQkJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCQkJaW50IGVycjsKIGRvX2Fubm90YXRlOgogCQkJaGUgPSBoaXN0X2Jyb3dzZXJfX3NlbGVjdGVkX2VudHJ5KGJyb3dzZXIpOwogCQkJaWYgKGhlID09IE5VTEwpCkBAIC0xMDAxLDEwICsxMDIwLDEyIEBACiAJCQkgKiBEb24ndCBsZXQgdGhpcyBiZSBmcmVlZCwgc2F5LCBieSBoaXN0c19fZGVjYXlfZW50cnkuCiAJCQkgKi8KIAkJCWhlLT51c2VkID0gdHJ1ZTsKLQkJCWhpc3RfZW50cnlfX3R1aV9hbm5vdGF0ZShoZSwgZXZzZWwtPmlkeCwgbnJfZXZlbnRzLAotCQkJCQkJIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOworCQkJZXJyID0gaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKGhlLCBldnNlbC0+aWR4LCBucl9ldmVudHMsCisJCQkJCQkgICAgICAgdGltZXIsIGFyZywgZGVsYXlfc2Vjcyk7CiAJCQloZS0+dXNlZCA9IGZhbHNlOwogCQkJdWlfYnJvd3Nlcl9fdXBkYXRlX25yX2VudHJpZXMoJmJyb3dzZXItPmIsIGJyb3dzZXItPmhpc3RzLT5ucl9lbnRyaWVzKTsKKwkJCWlmIChlcnIpCisJCQkJdWlfYnJvd3Nlcl9faGFuZGxlX3Jlc2l6ZSgmYnJvd3Nlci0+Yik7CiAJCX0gZWxzZSBpZiAoY2hvaWNlID09IGJyb3dzZV9tYXApCiAJCQltYXBfX2Jyb3dzZShicm93c2VyLT5zZWxlY3Rpb24tPm1hcCk7CiAJCWVsc2UgaWYgKGNob2ljZSA9PSB6b29tX2RzbykgewpAQCAtMTA1Niw2ICsxMDc3LDcgQEAKIHN0cnVjdCBwZXJmX2V2c2VsX21lbnUgewogCXN0cnVjdCB1aV9icm93c2VyIGI7CiAJc3RydWN0IHBlcmZfZXZzZWwgKnNlbGVjdGlvbjsKKwlib29sIGxvc3RfZXZlbnRzLCBsb3N0X2V2ZW50c193YXJuZWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBwZXJmX2V2c2VsX21lbnVfX3dyaXRlKHN0cnVjdCB1aV9icm93c2VyICpicm93c2VyLApAQCAtMTA2OCwxNCArMTA5MCwyOSBAQAogCXVuc2lnbmVkIGxvbmcgbnJfZXZlbnRzID0gZXZzZWwtPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9TQU1QTEVdOwogCWNvbnN0IGNoYXIgKmV2X25hbWUgPSBldmVudF9uYW1lKGV2c2VsKTsKIAljaGFyIGJmWzI1Nl0sIHVuaXQ7CisJY29uc3QgY2hhciAqd2FybiA9ICIgIjsKKwlzaXplX3QgcHJpbnRlZDsKIAogCXVpX2Jyb3dzZXJfX3NldF9jb2xvcihicm93c2VyLCBjdXJyZW50X2VudHJ5ID8gSEVfQ09MT1JTRVRfU0VMRUNURUQgOgogCQkJCQkJICAgICAgIEhFX0NPTE9SU0VUX05PUk1BTCk7CiAKIAlucl9ldmVudHMgPSBjb252ZXJ0X3VuaXQobnJfZXZlbnRzLCAmdW5pdCk7Ci0Jc25wcmludGYoYmYsIHNpemVvZihiZiksICIlbHUlYyVzJXMiLCBucl9ldmVudHMsCi0JCSB1bml0LCB1bml0ID09ICcgJyA/ICIiIDogIiAiLCBldl9uYW1lKTsKLQlzbHNtZ193cml0ZV9uc3RyaW5nKGJmLCBicm93c2VyLT53aWR0aCk7CisJcHJpbnRlZCA9IHNucHJpbnRmKGJmLCBzaXplb2YoYmYpLCAiJWx1JWMlcyVzIiwgbnJfZXZlbnRzLAorCQkJICAgdW5pdCwgdW5pdCA9PSAnICcgPyAiIiA6ICIgIiwgZXZfbmFtZSk7CisJc2xzbWdfcHJpbnRmKCIlcyIsIGJmKTsKKworCW5yX2V2ZW50cyA9IGV2c2VsLT5oaXN0cy5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF07CisJaWYgKG5yX2V2ZW50cyAhPSAwKSB7CisJCW1lbnUtPmxvc3RfZXZlbnRzID0gdHJ1ZTsKKwkJaWYgKCFjdXJyZW50X2VudHJ5KQorCQkJdWlfYnJvd3Nlcl9fc2V0X2NvbG9yKGJyb3dzZXIsIEhFX0NPTE9SU0VUX1RPUCk7CisJCW5yX2V2ZW50cyA9IGNvbnZlcnRfdW5pdChucl9ldmVudHMsICZ1bml0KTsKKwkJc25wcmludGYoYmYsIHNpemVvZihiZiksICI6ICVsZCVjJXNjaHVua3MgTE9TVCEiLCBucl9ldmVudHMsCisJCQkgdW5pdCwgdW5pdCA9PSAnICcgPyAiIiA6ICIgIik7CisJCXdhcm4gPSBiZjsKKwl9CisKKwlzbHNtZ193cml0ZV9uc3RyaW5nKHdhcm4sIGJyb3dzZXItPndpZHRoIC0gcHJpbnRlZCk7CiAKIAlpZiAoY3VycmVudF9lbnRyeSkKIAkJbWVudS0+c2VsZWN0aW9uID0gZXZzZWw7CkBAIC0xMTAwLDYgKzExMzcsMTEgQEAKIAkJc3dpdGNoIChrZXkpIHsKIAkJY2FzZSBLX1RJTUVSOgogCQkJdGltZXIoYXJnKTsKKworCQkJaWYgKCFtZW51LT5sb3N0X2V2ZW50c193YXJuZWQgJiYgbWVudS0+bG9zdF9ldmVudHMpIHsKKwkJCQl1aV9icm93c2VyX193YXJuX2xvc3RfZXZlbnRzKCZtZW51LT5iKTsKKwkJCQltZW51LT5sb3N0X2V2ZW50c193YXJuZWQgPSB0cnVlOworCQkJfQogCQkJY29udGludWU7CiAJCWNhc2UgS19SSUdIVDoKIAkJY2FzZSBLX0VOVEVSOgpAQCAtMTEzMyw3ICsxMTc1LDggQEAKIAkJCQkJcG9zID0gbGlzdF9lbnRyeShwb3MtPm5vZGUucHJldiwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOwogCQkJCWdvdG8gYnJvd3NlX2hpc3RzOwogCQkJY2FzZSBLX0VTQzoKLQkJCQlpZiAoIXVpX19kaWFsb2dfeWVzbm8oIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQorCQkJCWlmICghdWlfYnJvd3Nlcl9fZGlhbG9nX3llc25vKCZtZW51LT5iLAorCQkJCQkJIkRvIHlvdSByZWFsbHkgd2FudCB0byBleGl0PyIpKQogCQkJCQljb250aW51ZTsKIAkJCQkvKiBGYWxsIHRocnUgKi8KIAkJCWNhc2UgJ3EnOgpAQCAtMTE0NSw3ICsxMTg4LDggQEAKIAkJY2FzZSBLX0xFRlQ6CiAJCQljb250aW51ZTsKIAkJY2FzZSBLX0VTQzoKLQkJCWlmICghdWlfX2RpYWxvZ195ZXNubygiRG8geW91IHJlYWxseSB3YW50IHRvIGV4aXQ/IikpCisJCQlpZiAoIXVpX2Jyb3dzZXJfX2RpYWxvZ195ZXNubygmbWVudS0+YiwKKwkJCQkJICAgICAgICJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZXhpdD8iKSkKIAkJCQljb250aW51ZTsKIAkJCS8qIEZhbGwgdGhydSAqLwogCQljYXNlICdxJzoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL2hlbHBsaW5lLmMKaW5kZXggZjM2ZDJmZjUuLjZlZjNjNTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9oZWxwbGluZS5jCkBAIC0xLDIwICsxLDI4IEBACiAjZGVmaW5lIF9HTlVfU09VUkNFCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxuZXd0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICIuLi9kZWJ1Zy5oIgogI2luY2x1ZGUgImhlbHBsaW5lLmgiCiAjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJsaWJzbGFuZy5oIgogCiB2b2lkIHVpX2hlbHBsaW5lX19wb3Aodm9pZCkKIHsKLQluZXd0UG9wSGVscExpbmUoKTsKIH0KIAorY2hhciB1aV9oZWxwbGluZV9fY3VycmVudFs1MTJdOworCiB2b2lkIHVpX2hlbHBsaW5lX19wdXNoKGNvbnN0IGNoYXIgKm1zZykKIHsKLQluZXd0UHVzaEhlbHBMaW5lKG1zZyk7CisJY29uc3Qgc2l6ZV90IHN6ID0gc2l6ZW9mKHVpX2hlbHBsaW5lX19jdXJyZW50KTsKKworCVNMc21nX2dvdG9yYyhTTHR0X1NjcmVlbl9Sb3dzIC0gMSwgMCk7CisJU0xzbWdfc2V0X2NvbG9yKDApOworCVNMc21nX3dyaXRlX25zdHJpbmcoKGNoYXIgKiltc2csIFNMdHRfU2NyZWVuX0NvbHMpOworCVNMc21nX3JlZnJlc2goKTsKKwlzdHJuY3B5KHVpX2hlbHBsaW5lX19jdXJyZW50LCBtc2csIHN6KVtzeiAtIDFdID0gJ1wwJzsKIH0KIAogdm9pZCB1aV9oZWxwbGluZV9fdnB1c2goY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQpAQCAtNjMsNyArNzEsNyBAQAogCiAJaWYgKHVpX2hlbHBsaW5lX19sYXN0X21zZ1tiYWNrbG9nIC0gMV0gPT0gJ1xuJykgewogCQl1aV9oZWxwbGluZV9fcHV0cyh1aV9oZWxwbGluZV9fbGFzdF9tc2cpOwotCQluZXd0UmVmcmVzaCgpOworCQlTTHNtZ19yZWZyZXNoKCk7CiAJCWJhY2tsb2cgPSAwOwogCX0KIAlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2hlbHBsaW5lLmggYi90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaAppbmRleCBmZGNiYzAyLi43YmFiNmIzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaAorKysgYi90b29scy9wZXJmL3V0aWwvdWkvaGVscGxpbmUuaApAQCAtMTEsNCArMTEsNiBAQAogdm9pZCB1aV9oZWxwbGluZV9fZnB1c2goY29uc3QgY2hhciAqZm10LCAuLi4pOwogdm9pZCB1aV9oZWxwbGluZV9fcHV0cyhjb25zdCBjaGFyICptc2cpOwogCitleHRlcm4gY2hhciB1aV9oZWxwbGluZV9fY3VycmVudFtdOworCiAjZW5kaWYgLyogX1BFUkZfVUlfSEVMUExJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKaW5kZXggZDdmYzM5OS4uMjk1ZTM2NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKQEAgLTEsNjAgKzEsMjkgQEAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxuZXd0Lmg+CiAjaW5jbHVkZSAiLi4vY2FjaGUuaCIKICNpbmNsdWRlICJwcm9ncmVzcy5oIgorI2luY2x1ZGUgImxpYnNsYW5nLmgiCisjaW5jbHVkZSAidWkuaCIKKyNpbmNsdWRlICJicm93c2VyLmgiCiAKLXN0cnVjdCB1aV9wcm9ncmVzcyB7Ci0JbmV3dENvbXBvbmVudCBmb3JtLCBzY2FsZTsKLX07Ci0KLXN0cnVjdCB1aV9wcm9ncmVzcyAqdWlfcHJvZ3Jlc3NfX25ldyhjb25zdCBjaGFyICp0aXRsZSwgdTY0IHRvdGFsKQordm9pZCB1aV9wcm9ncmVzc19fdXBkYXRlKHU2NCBjdXJyLCB1NjQgdG90YWwsIGNvbnN0IGNoYXIgKnRpdGxlKQogewotCXN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKLQotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJaW50IGNvbHM7Ci0KLQkJaWYgKHVzZV9icm93c2VyIDw9IDApCi0JCQlyZXR1cm4gc2VsZjsKLQkJbmV3dEdldFNjcmVlblNpemUoJmNvbHMsIE5VTEwpOwotCQljb2xzIC09IDQ7Ci0JCW5ld3RDZW50ZXJlZFdpbmRvdyhjb2xzLCAxLCB0aXRsZSk7Ci0JCXNlbGYtPmZvcm0gID0gbmV3dEZvcm0oTlVMTCwgTlVMTCwgMCk7Ci0JCWlmIChzZWxmLT5mb3JtID09IE5VTEwpCi0JCQlnb3RvIG91dF9mcmVlX3NlbGY7Ci0JCXNlbGYtPnNjYWxlID0gbmV3dFNjYWxlKDAsIDAsIGNvbHMsIHRvdGFsKTsKLQkJaWYgKHNlbGYtPnNjYWxlID09IE5VTEwpCi0JCQlnb3RvIG91dF9mcmVlX2Zvcm07Ci0JCW5ld3RGb3JtQWRkQ29tcG9uZW50KHNlbGYtPmZvcm0sIHNlbGYtPnNjYWxlKTsKLQkJbmV3dFJlZnJlc2goKTsKLQl9Ci0KLQlyZXR1cm4gc2VsZjsKLQotb3V0X2ZyZWVfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Zm9ybSk7Ci1vdXRfZnJlZV9zZWxmOgotCWZyZWUoc2VsZik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYsIHU2NCBjdXJyKQoteworCWludCBiYXIsIHk7CiAJLyoKIAkgKiBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBwZXIgVUkgYmFja2VuZCB3YXkgb2Ygc2hvd2luZyBwcm9ncmVzcywKIAkgKiBzdGRpbyB3aWxsIGp1c3Qgc2hvdyBhIHBlcmNlbnRhZ2UgYXMgTk4lLCBldGMuCiAJICovCiAJaWYgKHVzZV9icm93c2VyIDw9IDApCiAJCXJldHVybjsKLQluZXd0U2NhbGVTZXQoc2VsZi0+c2NhbGUsIGN1cnIpOwotCW5ld3RSZWZyZXNoKCk7Ci19CiAKLXZvaWQgdWlfcHJvZ3Jlc3NfX2RlbGV0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYpCi17Ci0JaWYgKHVzZV9icm93c2VyID4gMCkgewotCQluZXd0Rm9ybURlc3Ryb3koc2VsZi0+Zm9ybSk7Ci0JCW5ld3RQb3BXaW5kb3coKTsKLQl9Ci0JZnJlZShzZWxmKTsKKwl1aV9fcmVmcmVzaF9kaW1lbnNpb25zKHRydWUpOworCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOworCXkgPSBTTHR0X1NjcmVlbl9Sb3dzIC8gMiAtIDI7CisJU0xzbWdfc2V0X2NvbG9yKDApOworCVNMc21nX2RyYXdfYm94KHksIDAsIDMsIFNMdHRfU2NyZWVuX0NvbHMpOworCVNMc21nX2dvdG9yYyh5KyssIDEpOworCVNMc21nX3dyaXRlX3N0cmluZygoY2hhciAqKXRpdGxlKTsKKwlTTHNtZ19zZXRfY29sb3IoSEVfQ09MT1JTRVRfU0VMRUNURUQpOworCWJhciA9ICgoU0x0dF9TY3JlZW5fQ29scyAtIDIpICogY3VycikgLyB0b3RhbDsKKwlTTHNtZ19maWxsX3JlZ2lvbih5LCAxLCAxLCBiYXIsICcgJyk7CisJU0xzbWdfcmVmcmVzaCgpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvcHJvZ3Jlc3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCmluZGV4IGEzODIwYTAuLmQ5YzIwNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5oCkBAIC0xLDExICsxLDggQEAKICNpZm5kZWYgX1BFUkZfVUlfUFJPR1JFU1NfSF8KICNkZWZpbmUgX1BFUkZfVUlfUFJPR1JFU1NfSF8gMQogCi1zdHJ1Y3QgdWlfcHJvZ3Jlc3M7CisjaW5jbHVkZSA8Li4vdHlwZXMuaD4KIAotc3RydWN0IHVpX3Byb2dyZXNzICp1aV9wcm9ncmVzc19fbmV3KGNvbnN0IGNoYXIgKnRpdGxlLCB1NjQgdG90YWwpOwotdm9pZCB1aV9wcm9ncmVzc19fZGVsZXRlKHN0cnVjdCB1aV9wcm9ncmVzcyAqc2VsZik7Ci0KLXZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZShzdHJ1Y3QgdWlfcHJvZ3Jlc3MgKnNlbGYsIHU2NCBjdXJyKTsKK3ZvaWQgdWlfcHJvZ3Jlc3NfX3VwZGF0ZSh1NjQgY3VyciwgdTY0IHRvdGFsLCBjb25zdCBjaGFyICp0aXRsZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3NldHVwLmMgYi90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYwppbmRleCAxZTZiYTA2Li44NWE2OWZhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvc2V0dXAuYwpAQCAtNywxMCArNyw4NSBAQAogI2luY2x1ZGUgImJyb3dzZXIuaCIKICNpbmNsdWRlICJoZWxwbGluZS5oIgogI2luY2x1ZGUgInVpLmgiCisjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImxpYnNsYW5nLmgiCisjaW5jbHVkZSAia2V5c3ltcy5oIgogCiBwdGhyZWFkX211dGV4X3QgdWlfX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogCitzdGF0aWMgdm9sYXRpbGUgaW50IHVpX19uZWVkX3Jlc2l6ZTsKKwordm9pZCB1aV9fcmVmcmVzaF9kaW1lbnNpb25zKGJvb2wgZm9yY2UpCit7CisJaWYgKGZvcmNlIHx8IHVpX19uZWVkX3Jlc2l6ZSkgeworCQl1aV9fbmVlZF9yZXNpemUgPSAwOworCQlwdGhyZWFkX211dGV4X2xvY2soJnVpX19sb2NrKTsKKwkJU0x0dF9nZXRfc2NyZWVuX3NpemUoKTsKKwkJU0xzbWdfcmVpbml0X3NtZygpOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgdWlfX3NpZ3dpbmNoKGludCBzaWcgX191c2VkKQoreworCXVpX19uZWVkX3Jlc2l6ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHVpX19zZXR1cF9zaWd3aW5jaCh2b2lkKQoreworCXN0YXRpYyBib29sIGRvbmU7CisKKwlpZiAoZG9uZSkKKwkJcmV0dXJuOworCisJZG9uZSA9IHRydWU7CisJcHRocmVhZF9fdW5ibG9ja19zaWd3aW5jaCgpOworCXNpZ25hbChTSUdXSU5DSCwgdWlfX3NpZ3dpbmNoKTsKK30KKworaW50IHVpX19nZXRjaChpbnQgZGVsYXlfc2VjcykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0LCAqcHRpbWVvdXQgPSBkZWxheV9zZWNzID8gJnRpbWVvdXQgOiBOVUxMOworCWZkX3NldCByZWFkX3NldDsKKwlpbnQgZXJyLCBrZXk7CisKKwl1aV9fc2V0dXBfc2lnd2luY2goKTsKKworCUZEX1pFUk8oJnJlYWRfc2V0KTsKKwlGRF9TRVQoMCwgJnJlYWRfc2V0KTsKKworCWlmIChkZWxheV9zZWNzKSB7CisJCXRpbWVvdXQudHZfc2VjID0gZGVsYXlfc2VjczsKKwkJdGltZW91dC50dl91c2VjID0gMDsKKwl9CisKKyAgICAgICAgZXJyID0gc2VsZWN0KDEsICZyZWFkX3NldCwgTlVMTCwgTlVMTCwgcHRpbWVvdXQpOworCisJaWYgKGVyciA9PSAwKQorCQlyZXR1cm4gS19USU1FUjsKKworCWlmIChlcnIgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJcmV0dXJuIEtfUkVTSVpFOworCQlyZXR1cm4gS19FUlJPUjsKKwl9CisKKwlrZXkgPSBTTGFuZ19nZXRrZXkoKTsKKwlpZiAoa2V5ICE9IEtfRVNDKQorCQlyZXR1cm4ga2V5OworCisJRkRfWkVSTygmcmVhZF9zZXQpOworCUZEX1NFVCgwLCAmcmVhZF9zZXQpOworCXRpbWVvdXQudHZfc2VjID0gMDsKKwl0aW1lb3V0LnR2X3VzZWMgPSAyMDsKKyAgICAgICAgZXJyID0gc2VsZWN0KDEsICZyZWFkX3NldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQpOworCWlmIChlcnIgPT0gMCkKKwkJcmV0dXJuIEtfRVNDOworCisJU0xhbmdfdW5nZXRrZXkoa2V5KTsKKwlyZXR1cm4gU0xrcF9nZXRrZXkoKTsKK30KKwogc3RhdGljIHZvaWQgbmV3dF9zdXNwZW5kKHZvaWQgKmQgX191c2VkKQogewogCW5ld3RTdXNwZW5kKCk7CkBAIC03MSwxMCArMTQ2LDEwIEBACiB2b2lkIGV4aXRfYnJvd3Nlcihib29sIHdhaXRfZm9yX29rKQogewogCWlmICh1c2VfYnJvd3NlciA+IDApIHsKLQkJaWYgKHdhaXRfZm9yX29rKSB7Ci0JCQljaGFyIHRpdGxlW10gPSAiRmF0YWwgRXJyb3IiLCBva1tdID0gIk9rIjsKLQkJCW5ld3RXaW5NZXNzYWdlKHRpdGxlLCBvaywgdWlfaGVscGxpbmVfX2xhc3RfbXNnKTsKLQkJfQorCQlpZiAod2FpdF9mb3Jfb2spCisJCQl1aV9fcXVlc3Rpb25fd2luZG93KCJGYXRhbCBFcnJvciIsCisJCQkJCSAgICB1aV9oZWxwbGluZV9fbGFzdF9tc2csCisJCQkJCSAgICAiUHJlc3MgYW55IGtleS4uLiIsIDApOwogCQl1aV9fZXhpdCgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS91aS5oIGIvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKaW5kZXggZDI2NGUwNS4uN2I2NzA0NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL3VpLmgKQEAgLTIsNyArMiwxMCBAQAogI2RlZmluZSBfUEVSRl9VSV9IXyAxCiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgogCiBleHRlcm4gcHRocmVhZF9tdXRleF90IHVpX19sb2NrOwogCit2b2lkIHVpX19yZWZyZXNoX2RpbWVuc2lvbnMoYm9vbCBmb3JjZSk7CisKICNlbmRpZiAvKiBfUEVSRl9VSV9IXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC91aS91dGlsLmMKaW5kZXggZmRmMWZjOC4uNDVkYWE3YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvdXRpbC5jCkBAIC0xLDYgKzEsNSBAQAotI2luY2x1ZGUgPG5ld3QuaD4KKyNpbmNsdWRlICIuLi91dGlsLmgiCiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CkBAIC04LDcyICs3LDc1IEBACiAjaW5jbHVkZSAiLi4vY2FjaGUuaCIKICNpbmNsdWRlICIuLi9kZWJ1Zy5oIgogI2luY2x1ZGUgImJyb3dzZXIuaCIKKyNpbmNsdWRlICJrZXlzeW1zLmgiCiAjaW5jbHVkZSAiaGVscGxpbmUuaCIKICNpbmNsdWRlICJ1aS5oIgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJsaWJzbGFuZy5oIgogCi1zdGF0aWMgdm9pZCBuZXd0X2Zvcm1fX3NldF9leGl0X2tleXMobmV3dENvbXBvbmVudCBzZWxmKQorc3RhdGljIHZvaWQgdWlfYnJvd3Nlcl9fYXJndl93cml0ZShzdHJ1Y3QgdWlfYnJvd3NlciAqYnJvd3NlciwKKwkJCQkgICB2b2lkICplbnRyeSwgaW50IHJvdykKIHsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBORVdUX0tFWV9MRUZUKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBORVdUX0tFWV9FU0NBUEUpOwotCW5ld3RGb3JtQWRkSG90S2V5KHNlbGYsICdRJyk7Ci0JbmV3dEZvcm1BZGRIb3RLZXkoc2VsZiwgJ3EnKTsKLQluZXd0Rm9ybUFkZEhvdEtleShzZWxmLCBDVFJMKCdjJykpOworCWNoYXIgKiphcmcgPSBlbnRyeTsKKwlib29sIGN1cnJlbnRfZW50cnkgPSB1aV9icm93c2VyX19pc19jdXJyZW50X2VudHJ5KGJyb3dzZXIsIHJvdyk7CisKKwl1aV9icm93c2VyX19zZXRfY29sb3IoYnJvd3NlciwgY3VycmVudF9lbnRyeSA/IEhFX0NPTE9SU0VUX1NFTEVDVEVEIDoKKwkJCQkJCSAgICAgICBIRV9DT0xPUlNFVF9OT1JNQUwpOworCXNsc21nX3dyaXRlX25zdHJpbmcoKmFyZywgYnJvd3Nlci0+d2lkdGgpOwogfQogCi1zdGF0aWMgbmV3dENvbXBvbmVudCBuZXd0X2Zvcm1fX25ldyh2b2lkKQorc3RhdGljIGludCBwb3B1cF9tZW51X19ydW4oc3RydWN0IHVpX2Jyb3dzZXIgKm1lbnUpCiB7Ci0JbmV3dENvbXBvbmVudCBzZWxmID0gbmV3dEZvcm0oTlVMTCwgTlVMTCwgMCk7Ci0JaWYgKHNlbGYpCi0JCW5ld3RfZm9ybV9fc2V0X2V4aXRfa2V5cyhzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKwlpbnQga2V5OworCisJaWYgKHVpX2Jyb3dzZXJfX3Nob3cobWVudSwgIiAiLCAiRVNDOiBleGl0LCBFTlRFUnwtPjogU2VsZWN0IG9wdGlvbiIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKDEpIHsKKwkJa2V5ID0gdWlfYnJvd3Nlcl9fcnVuKG1lbnUsIDApOworCisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgS19SSUdIVDoKKwkJY2FzZSBLX0VOVEVSOgorCQkJa2V5ID0gbWVudS0+aW5kZXg7CisJCQlicmVhazsKKwkJY2FzZSBLX0xFRlQ6CisJCWNhc2UgS19FU0M6CisJCWNhc2UgJ3EnOgorCQljYXNlIENUUkwoJ2MnKToKKwkJCWtleSA9IC0xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXVpX2Jyb3dzZXJfX2hpZGUobWVudSk7CisJcmV0dXJuIGtleTsKIH0KIAogaW50IHVpX19wb3B1cF9tZW51KGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewotCXN0cnVjdCBuZXd0RXhpdFN0cnVjdCBlczsKLQlpbnQgaSwgcmMgPSAtMSwgbWF4X2xlbiA9IDU7Ci0JbmV3dENvbXBvbmVudCBsaXN0Ym94LCBmb3JtID0gbmV3dF9mb3JtX19uZXcoKTsKKwlzdHJ1Y3QgdWlfYnJvd3NlciBtZW51ID0geworCQkuZW50cmllcyAgICA9ICh2b2lkICopYXJndiwKKwkJLnJlZnJlc2ggICAgPSB1aV9icm93c2VyX19hcmd2X3JlZnJlc2gsCisJCS5zZWVrCSAgICA9IHVpX2Jyb3dzZXJfX2FyZ3Zfc2VlaywKKwkJLndyaXRlCSAgICA9IHVpX2Jyb3dzZXJfX2FyZ3Zfd3JpdGUsCisJCS5ucl9lbnRyaWVzID0gYXJnYywKKwl9OwogCi0JaWYgKGZvcm0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JbGlzdGJveCA9IG5ld3RMaXN0Ym94KDAsIDAsIGFyZ2MsIE5FV1RfRkxBR19SRVRVUk5FWElUKTsKLQlpZiAobGlzdGJveCA9PSBOVUxMKQotCQlnb3RvIG91dF9kZXN0cm95X2Zvcm07Ci0KLQluZXd0Rm9ybUFkZENvbXBvbmVudChmb3JtLCBsaXN0Ym94KTsKLQotCWZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKLQkJaW50IGxlbiA9IHN0cmxlbihhcmd2W2ldKTsKLQkJaWYgKGxlbiA+IG1heF9sZW4pCi0JCQltYXhfbGVuID0gbGVuOwotCQlpZiAobmV3dExpc3Rib3hBZGRFbnRyeShsaXN0Ym94LCBhcmd2W2ldLCAodm9pZCAqKShsb25nKWkpKQotCQkJZ290byBvdXRfZGVzdHJveV9mb3JtOwotCX0KLQotCW5ld3RDZW50ZXJlZFdpbmRvdyhtYXhfbGVuLCBhcmdjLCBOVUxMKTsKLQluZXd0Rm9ybVJ1bihmb3JtLCAmZXMpOwotCXJjID0gbmV3dExpc3Rib3hHZXRDdXJyZW50KGxpc3Rib3gpIC0gTlVMTDsKLQlpZiAoZXMucmVhc29uID09IE5FV1RfRVhJVF9IT1RLRVkpCi0JCXJjID0gLTE7Ci0JbmV3dFBvcFdpbmRvdygpOwotb3V0X2Rlc3Ryb3lfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koZm9ybSk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBwb3B1cF9tZW51X19ydW4oJm1lbnUpOwogfQogCi1pbnQgdWlfX2hlbHBfd2luZG93KGNvbnN0IGNoYXIgKnRleHQpCitpbnQgdWlfX3F1ZXN0aW9uX3dpbmRvdyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwKKwkJCWNvbnN0IGNoYXIgKmV4aXRfbXNnLCBpbnQgZGVsYXlfc2VjcykKIHsKLQlzdHJ1Y3QgbmV3dEV4aXRTdHJ1Y3QgZXM7Ci0JbmV3dENvbXBvbmVudCB0YiwgZm9ybSA9IG5ld3RfZm9ybV9fbmV3KCk7Ci0JaW50IHJjID0gLTE7CisJaW50IHgsIHk7CiAJaW50IG1heF9sZW4gPSAwLCBucl9saW5lcyA9IDA7CiAJY29uc3QgY2hhciAqdDsKIAotCWlmIChmb3JtID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQogCXQgPSB0ZXh0OwogCXdoaWxlICgxKSB7CiAJCWNvbnN0IGNoYXIgKnNlcCA9IHN0cmNocih0LCAnXG4nKTsKQEAgLTkwLDQxICs5Miw3NyBAQAogCQl0ID0gc2VwICsgMTsKIAl9CiAKLQl0YiA9IG5ld3RUZXh0Ym94KDAsIDAsIG1heF9sZW4sIG5yX2xpbmVzLCAwKTsKLQlpZiAodGIgPT0gTlVMTCkKLQkJZ290byBvdXRfZGVzdHJveV9mb3JtOworCW1heF9sZW4gKz0gMjsKKwlucl9saW5lcyArPSA0OworCXkgPSBTTHR0X1NjcmVlbl9Sb3dzIC8gMiAtIG5yX2xpbmVzIC8gMiwKKwl4ID0gU0x0dF9TY3JlZW5fQ29scyAvIDIgLSBtYXhfbGVuIC8gMjsKIAotCW5ld3RUZXh0Ym94U2V0VGV4dCh0YiwgdGV4dCk7Ci0JbmV3dEZvcm1BZGRDb21wb25lbnQoZm9ybSwgdGIpOwotCW5ld3RDZW50ZXJlZFdpbmRvdyhtYXhfbGVuLCBucl9saW5lcywgTlVMTCk7Ci0JbmV3dEZvcm1SdW4oZm9ybSwgJmVzKTsKLQluZXd0UG9wV2luZG93KCk7Ci0JcmMgPSAwOwotb3V0X2Rlc3Ryb3lfZm9ybToKLQluZXd0Rm9ybURlc3Ryb3koZm9ybSk7Ci0JcmV0dXJuIHJjOworCVNMc21nX3NldF9jb2xvcigwKTsKKwlTTHNtZ19kcmF3X2JveCh5LCB4KyssIG5yX2xpbmVzLCBtYXhfbGVuKTsKKwlpZiAodGl0bGUpIHsKKwkJU0xzbWdfZ290b3JjKHksIHggKyAxKTsKKwkJU0xzbWdfd3JpdGVfc3RyaW5nKChjaGFyICopdGl0bGUpOworCX0KKwlTTHNtZ19nb3RvcmMoKyt5LCB4KTsKKwlucl9saW5lcyAtPSAyOworCW1heF9sZW4gLT0gMjsKKwlTTHNtZ193cml0ZV93cmFwcGVkX3N0cmluZygodW5zaWduZWQgY2hhciAqKXRleHQsIHksIHgsCisJCQkJICAgbnJfbGluZXMsIG1heF9sZW4sIDEpOworCVNMc21nX2dvdG9yYyh5ICsgbnJfbGluZXMgLSAyLCB4KTsKKwlTTHNtZ193cml0ZV9uc3RyaW5nKChjaGFyICopIiAiLCBtYXhfbGVuKTsKKwlTTHNtZ19nb3RvcmMoeSArIG5yX2xpbmVzIC0gMSwgeCk7CisJU0xzbWdfd3JpdGVfbnN0cmluZygoY2hhciAqKWV4aXRfbXNnLCBtYXhfbGVuKTsKKwlTTHNtZ19yZWZyZXNoKCk7CisJcmV0dXJuIHVpX19nZXRjaChkZWxheV9zZWNzKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgeWVzW10gPSAiWWVzIiwgbm9bXSA9ICJObyIsCi0JCSAgd2FybmluZ19zdHJbXSA9ICJXYXJuaW5nISIsIG9rW10gPSAiT2siOwotCi1ib29sIHVpX19kaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqbXNnKQoraW50IHVpX19oZWxwX3dpbmRvdyhjb25zdCBjaGFyICp0ZXh0KQogewotCS8qIG5ld3RXaW5DaG9pY2Ugc2hvdWxkIHJlYWxseSBiZSBhY2NlcHRpbmcgY29uc3QgY2hhciBwb2ludGVycy4uLiAqLwotCXJldHVybiBuZXd0V2luQ2hvaWNlKE5VTEwsIChjaGFyICopeWVzLCAoY2hhciAqKW5vLCAoY2hhciAqKW1zZykgPT0gMTsKKwlyZXR1cm4gdWlfX3F1ZXN0aW9uX3dpbmRvdygiSGVscCIsIHRleHQsICJQcmVzcyBhbnkga2V5Li4uIiwgMCk7CiB9CiAKLXZvaWQgdWlfX3dhcm5pbmcoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitpbnQgdWlfX2RpYWxvZ195ZXNubyhjb25zdCBjaGFyICptc2cpCiB7CisJcmV0dXJuIHVpX19xdWVzdGlvbl93aW5kb3coTlVMTCwgbXNnLCAiRW50ZXI6IFllcywgRVNDOiBObyIsIDApOworfQorCitpbnQgX191aV9fd2FybmluZyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJY2hhciAqczsKKworCWlmICh1c2VfYnJvd3NlciA+IDAgJiYgdmFzcHJpbnRmKCZzLCBmb3JtYXQsIGFyZ3MpID4gMCkgeworCQlpbnQga2V5OworCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOworCQlrZXkgPSB1aV9fcXVlc3Rpb25fd2luZG93KHRpdGxlLCBzLCAiUHJlc3MgYW55IGtleS4uLiIsIDApOworCQlwdGhyZWFkX211dGV4X3VubG9jaygmdWlfX2xvY2spOworCQlmcmVlKHMpOworCQlyZXR1cm4ga2V5OworCX0KKworCWZwcmludGYoc3RkZXJyLCAiJXM6XG4iLCB0aXRsZSk7CisJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworCXJldHVybiBLX0VTQzsKK30KKworaW50IHVpX193YXJuaW5nKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCWludCBrZXk7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQlpZiAodXNlX2Jyb3dzZXIgPiAwKSB7Ci0JCXB0aHJlYWRfbXV0ZXhfbG9jaygmdWlfX2xvY2spOwotCQluZXd0V2luTWVzc2FnZXYoKGNoYXIgKil3YXJuaW5nX3N0ciwgKGNoYXIgKilvaywKLQkJCQkoY2hhciAqKWZvcm1hdCwgYXJncyk7Ci0JCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ1aV9fbG9jayk7Ci0JfSBlbHNlCi0JCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKwlrZXkgPSBfX3VpX193YXJuaW5nKCJXYXJuaW5nIiwgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CisJcmV0dXJuIGtleTsKK30KKworaW50IHVpX19lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlpbnQga2V5OworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJa2V5ID0gX191aV9fd2FybmluZygiRXJyb3IiLCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4ga2V5OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91aS91dGlsLmgKaW5kZXggYWZjYmMxZC4uMmQxNzM4YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3V0aWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvdWkvdXRpbC5oCkBAIC0xLDEwICsxLDE0IEBACiAjaWZuZGVmIF9QRVJGX1VJX1VUSUxfSF8KICNkZWZpbmUgX1BFUkZfVUlfVVRJTF9IXyAxCiAKLSNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CiAKK2ludCB1aV9fZ2V0Y2goaW50IGRlbGF5X3NlY3MpOwogaW50IHVpX19wb3B1cF9tZW51KGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKIGludCB1aV9faGVscF93aW5kb3coY29uc3QgY2hhciAqdGV4dCk7Ci1ib29sIHVpX19kaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqbXNnKTsKK2ludCB1aV9fZGlhbG9nX3llc25vKGNvbnN0IGNoYXIgKm1zZyk7CitpbnQgdWlfX3F1ZXN0aW9uX3dpbmRvdyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwKKwkJCWNvbnN0IGNoYXIgKmV4aXRfbXNnLCBpbnQgZGVsYXlfc2Vjcyk7CitpbnQgX191aV9fd2FybmluZyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwogCiAjZW5kaWYgLyogX1BFUkZfVUlfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYyBiL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMKaW5kZXggOGIyZDM3Yi4uM2M2Zjc4MCAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYworKysgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCkBAIC0xNjIsMTkgKzE2MiwyMSBAQAogCiB2b2lkIGR1bXBfY250KHN0cnVjdCBjb3VudGVycyAqY250KQogewotCWZwcmludGYoc3RkZXJyLCAicGFja2FnZTogJWQgIiwgY250LT5wa2cpOwotCWZwcmludGYoc3RkZXJyLCAiY29yZTo6ICVkICIsIGNudC0+Y29yZSk7Ci0JZnByaW50ZihzdGRlcnIsICJDUFU6ICVkICIsIGNudC0+Y3B1KTsKLQlmcHJpbnRmKHN0ZGVyciwgIlRTQzogJTAxNmxsWFxuIiwgY250LT50c2MpOwotCWZwcmludGYoc3RkZXJyLCAiYzM6ICUwMTZsbFhcbiIsIGNudC0+YzMpOwotCWZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIGNudC0+YzYpOwotCWZwcmludGYoc3RkZXJyLCAiYzc6ICUwMTZsbFhcbiIsIGNudC0+YzcpOwotCWZwcmludGYoc3RkZXJyLCAiYXBlcmY6ICUwMTZsbFhcbiIsIGNudC0+YXBlcmYpOwotCWZwcmludGYoc3RkZXJyLCAicGMyOiAlMDE2bGxYXG4iLCBjbnQtPnBjMik7Ci0JZnByaW50ZihzdGRlcnIsICJwYzM6ICUwMTZsbFhcbiIsIGNudC0+cGMzKTsKLQlmcHJpbnRmKHN0ZGVyciwgInBjNjogJTAxNmxsWFxuIiwgY250LT5wYzYpOwotCWZwcmludGYoc3RkZXJyLCAicGM3OiAlMDE2bGxYXG4iLCBjbnQtPnBjNyk7Ci0JZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDE2bGxYXG4iLCBleHRyYV9tc3Jfb2Zmc2V0LCBjbnQtPmV4dHJhX21zcik7CisJaWYgKCFjbnQpCisJCXJldHVybjsKKwlpZiAoY250LT5wa2cpIGZwcmludGYoc3RkZXJyLCAicGFja2FnZTogJWQgIiwgY250LT5wa2cpOworCWlmIChjbnQtPmNvcmUpIGZwcmludGYoc3RkZXJyLCAiY29yZTo6ICVkICIsIGNudC0+Y29yZSk7CisJaWYgKGNudC0+Y3B1KSBmcHJpbnRmKHN0ZGVyciwgIkNQVTogJWQgIiwgY250LT5jcHUpOworCWlmIChjbnQtPnRzYykgZnByaW50ZihzdGRlcnIsICJUU0M6ICUwMTZsbFhcbiIsIGNudC0+dHNjKTsKKwlpZiAoY250LT5jMykgZnByaW50ZihzdGRlcnIsICJjMzogJTAxNmxsWFxuIiwgY250LT5jMyk7CisJaWYgKGNudC0+YzYpIGZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIGNudC0+YzYpOworCWlmIChjbnQtPmM3KSBmcHJpbnRmKHN0ZGVyciwgImM3OiAlMDE2bGxYXG4iLCBjbnQtPmM3KTsKKwlpZiAoY250LT5hcGVyZikgZnByaW50ZihzdGRlcnIsICJhcGVyZjogJTAxNmxsWFxuIiwgY250LT5hcGVyZik7CisJaWYgKGNudC0+cGMyKSBmcHJpbnRmKHN0ZGVyciwgInBjMjogJTAxNmxsWFxuIiwgY250LT5wYzIpOworCWlmIChjbnQtPnBjMykgZnByaW50ZihzdGRlcnIsICJwYzM6ICUwMTZsbFhcbiIsIGNudC0+cGMzKTsKKwlpZiAoY250LT5wYzYpIGZwcmludGYoc3RkZXJyLCAicGM2OiAlMDE2bGxYXG4iLCBjbnQtPnBjNik7CisJaWYgKGNudC0+cGM3KSBmcHJpbnRmKHN0ZGVyciwgInBjNzogJTAxNmxsWFxuIiwgY250LT5wYzcpOworCWlmIChjbnQtPmV4dHJhX21zcikgZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDE2bGxYXG4iLCBleHRyYV9tc3Jfb2Zmc2V0LCBjbnQtPmV4dHJhX21zcik7CiB9CiAKIHZvaWQgZHVtcF9saXN0KHN0cnVjdCBjb3VudGVycyAqY250KQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbCBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKaW5kZXggOGQwMmNjYi4uMzBlMmJlZiAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbAorKysgYi90b29scy90ZXN0aW5nL2t0ZXN0L2t0ZXN0LnBsCkBAIC00Miw2ICs0Miw3IEBACiAkZGVmYXVsdHsiQklTRUNUX1NLSVAifQkJPSAxOwogJGRlZmF1bHR7IlNVQ0NFU1NfTElORSJ9CT0gImxvZ2luOiI7CiAkZGVmYXVsdHsiREVURUNUX1RSSVBMRV9GQVVMVCJ9ID0gMTsKKyRkZWZhdWx0eyJOT19JTlNUQUxMIn0JCT0gMDsKICRkZWZhdWx0eyJCT09URURfVElNRU9VVCJ9CT0gMTsKICRkZWZhdWx0eyJESUVfT05fRkFJTFVSRSJ9CT0gMTsKICRkZWZhdWx0eyJTU0hfRVhFQyJ9CQk9ICJzc2ggXCRTU0hfVVNFUlxAXCRNQUNISU5FIFwkU1NIX0NPTU1BTkQiOwpAQCAtODQsNiArODUsNyBAQAogbXkgJHRhcmdldDsKIG15ICRtYWtlOwogbXkgJHBvc3RfaW5zdGFsbDsKK215ICRub19pbnN0YWxsOwogbXkgJG5vY2xlYW47CiBteSAkbWluY29uZmlnOwogbXkgJHN0YXJ0X21pbmNvbmZpZzsKQEAgLTExNSw2ICsxMTcsNyBAQAogbXkgJGJvb3RlZF90aW1lb3V0OwogbXkgJGRldGVjdF90cmlwbGVmYXVsdDsKIG15ICRjb25zb2xlOworbXkgJHJlYm9vdF9zdWNjZXNzX2xpbmU7CiBteSAkc3VjY2Vzc19saW5lOwogbXkgJHN0b3BfYWZ0ZXJfc3VjY2VzczsKIG15ICRzdG9wX2FmdGVyX2ZhaWx1cmU7CkBAIC0xMzAsNiArMTMzLDEyIEBACiBteSAldmFyaWFibGU7CiBteSAlZm9yY2VfY29uZmlnOwogCisjIGRvIG5vdCBmb3JjZSByZWJvb3RzIG9uIGNvbmZpZyBwcm9ibGVtcworbXkgJG5vX3JlYm9vdCA9IDE7CisKKyMgZGVmYXVsdCB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgdXNlZAorY2hvbXAgKCR2YXJpYWJsZXsiUFdEIn0gPSBgcHdkYCk7CisKICRjb25maWdfaGVscHsiTUFDSElORSJ9ID0gPDwgIkVPRiIKICBUaGUgbWFjaGluZSBob3N0bmFtZSB0aGF0IHlvdSB3aWxsIHRlc3QuCiBFT0YKQEAgLTI0MSw2ICsyNTAsNyBAQAogCiBzdWIgZ2V0X2t0ZXN0X2NvbmZpZyB7CiAgICAgbXkgKCRjb25maWcpID0gQF87CisgICAgbXkgJGFuczsKIAogICAgIHJldHVybiBpZiAoZGVmaW5lZCgkb3B0eyRjb25maWd9KSk7CiAKQEAgLTI1NCwxNiArMjY0LDE3IEBACiAJaWYgKGRlZmluZWQoJGRlZmF1bHR7JGNvbmZpZ30pKSB7CiAJICAgIHByaW50ICJcWyRkZWZhdWx0eyRjb25maWd9XF0gIjsKIAl9Ci0JJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9IDxTVERJTj47Ci0JJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9fiBzL15ccyooLipcUylccyokLyQxLzsKLQlpZiAoJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9fiAvXlxzKiQvKSB7CisJJGFucyA9IDxTVERJTj47CisJJGFucyA9fiBzL15ccyooLipcUylccyokLyQxLzsKKwlpZiAoJGFucyA9fiAvXlxzKiQvKSB7CiAJICAgIGlmICgkZGVmYXVsdHskY29uZmlnfSkgewotCQkkZW50ZXJlZF9jb25maWdzeyRjb25maWd9ID0gJGRlZmF1bHR7JGNvbmZpZ307CisJCSRhbnMgPSAkZGVmYXVsdHskY29uZmlnfTsKIAkgICAgfSBlbHNlIHsKIAkJcHJpbnQgIllvdXIgYW5zd2VyIGNhbiBub3QgYmUgYmxhbmtcbiI7CiAJCW5leHQ7CiAJICAgIH0KIAl9CisJJGVudGVyZWRfY29uZmlnc3skY29uZmlnfSA9IHByb2Nlc3NfdmFyaWFibGVzKCRhbnMpOwogCWxhc3Q7CiAgICAgfQogfQpAQCAtMjk4LDcgKzMwOSw3IEBACiB9CiAKIHN1YiBwcm9jZXNzX3ZhcmlhYmxlcyB7Ci0gICAgbXkgKCR2YWx1ZSkgPSBAXzsKKyAgICBteSAoJHZhbHVlLCAkcmVtb3ZlX3VuZGVmKSA9IEBfOwogICAgIG15ICRyZXR2YWwgPSAiIjsKIAogICAgICMgV2Ugd2FudCB0byBjaGVjayBmb3IgJ1wnLCBhbmQgaXQgaXMganVzdCBlYXNpZXIKQEAgLTMxNiw2ICszMjcsMTAgQEAKIAkkcmV0dmFsID0gIiRyZXR2YWwkYmVnaW4iOwogCWlmIChkZWZpbmVkKCR2YXJpYWJsZXskdmFyfSkpIHsKIAkgICAgJHJldHZhbCA9ICIkcmV0dmFsJHZhcmlhYmxleyR2YXJ9IjsKKwl9IGVsc2lmIChkZWZpbmVkKCRyZW1vdmVfdW5kZWYpICYmICRyZW1vdmVfdW5kZWYpIHsKKwkgICAgIyBmb3IgaWYgc3RhdGVtZW50cywgYW55IHZhcmlhYmxlIHRoYXQgaXMgbm90IGRlZmluZWQsCisJICAgICMgd2Ugc2ltcGxlIGNvbnZlcnQgdG8gMAorCSAgICAkcmV0dmFsID0gIiR7cmV0dmFsfTAiOwogCX0gZWxzZSB7CiAJICAgICMgcHV0IGJhY2sgdGhlIG9yaWdpbiBwaWVjZS4KIAkgICAgJHJldHZhbCA9ICIkcmV0dmFsXCRceyR2YXJcfSI7CkBAIC0zMzEsMTAgKzM0NiwxNyBAQAogfQogCiBzdWIgc2V0X3ZhbHVlIHsKLSAgICBteSAoJGx2YWx1ZSwgJHJ2YWx1ZSkgPSBAXzsKKyAgICBteSAoJGx2YWx1ZSwgJHJ2YWx1ZSwgJG92ZXJyaWRlLCAkb3ZlcnJpZGVzLCAkbmFtZSkgPSBAXzsKIAogICAgIGlmIChkZWZpbmVkKCRvcHR7JGx2YWx1ZX0pKSB7Ci0JZGllICJFcnJvcjogT3B0aW9uICRsdmFsdWUgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSFcbiI7CisJaWYgKCEkb3ZlcnJpZGUgfHwgZGVmaW5lZCgkeyRvdmVycmlkZXN9eyRsdmFsdWV9KSkgeworCSAgICBteSAkZXh0cmEgPSAiIjsKKwkgICAgaWYgKCRvdmVycmlkZSkgeworCQkkZXh0cmEgPSAiSW4gdGhlIHNhbWUgb3ZlcnJpZGUgc2VjdGlvbiFcbiI7CisJICAgIH0KKwkgICAgZGllICIkbmFtZTogJC46IE9wdGlvbiAkbHZhbHVlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UhXG4kZXh0cmEiOworCX0KKwkkeyRvdmVycmlkZXN9eyRsdmFsdWV9ID0gJHJ2YWx1ZTsKICAgICB9CiAgICAgaWYgKCRydmFsdWUgPX4gL15ccyokLykgewogCWRlbGV0ZSAkb3B0eyRsdmFsdWV9OwpAQCAtMzU1LDg2ICszNzcsMjc0IEBACiAgICAgfQogfQogCi1zdWIgcmVhZF9jb25maWcgewotICAgIG15ICgkY29uZmlnKSA9IEBfOworc3ViIHByb2Nlc3NfY29tcGFyZSB7CisgICAgbXkgKCRsdmFsLCAkY21wLCAkcnZhbCkgPSBAXzsKIAotICAgIG9wZW4oSU4sICRjb25maWcpIHx8IGRpZSAiY2FuJ3QgcmVhZCBmaWxlICRjb25maWciOworICAgICMgcmVtb3ZlIHdoaXRlc3BhY2UKKworICAgICRsdmFsID1+IHMvXlxzKi8vOworICAgICRsdmFsID1+IHMvXHMqJC8vOworCisgICAgJHJ2YWwgPX4gcy9eXHMqLy87CisgICAgJHJ2YWwgPX4gcy9ccyokLy87CisKKyAgICBpZiAoJGNtcCBlcSAiPT0iKSB7CisJcmV0dXJuICRsdmFsIGVxICRydmFsOworICAgIH0gZWxzaWYgKCRjbXAgZXEgIiE9IikgeworCXJldHVybiAkbHZhbCBuZSAkcnZhbDsKKyAgICB9CisKKyAgICBteSAkc3RhdGVtZW50ID0gIiRsdmFsICRjbXAgJHJ2YWwiOworICAgIG15ICRyZXQgPSBldmFsICRzdGF0ZW1lbnQ7CisKKyAgICAjICRAIHN0b3JlcyBlcnJvciBvZiBldmFsCisgICAgaWYgKCRAKSB7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAkcmV0OworfQorCitzdWIgdmFsdWVfZGVmaW5lZCB7CisgICAgbXkgKCR2YWwpID0gQF87CisKKyAgICByZXR1cm4gZGVmaW5lZCgkdmFyaWFibGV7JDJ9KSB8fAorCWRlZmluZWQoJG9wdHskMn0pOworfQorCitteSAkZCA9IDA7CitzdWIgcHJvY2Vzc19leHByZXNzaW9uIHsKKyAgICBteSAoJG5hbWUsICR2YWwpID0gQF87CisKKyAgICBteSAkYyA9ICRkKys7CisKKyAgICB3aGlsZSAoJHZhbCA9fiBzL1woKFteXChdKj8pXCkvXCZcJlwmXCZWQUxcJlwmXCZcJi8pIHsKKwlteSAkZXhwcmVzcyA9ICQxOworCisJaWYgKHByb2Nlc3NfZXhwcmVzc2lvbigkbmFtZSwgJGV4cHJlc3MpKSB7CisJICAgICR2YWwgPX4gcy9cJlwmXCZcJlZBTFwmXCZcJlwmLyAxIC87CisJfSBlbHNlIHsKKwkgICAgJHZhbCA9fiBzL1wmXCZcJlwmVkFMXCZcJlwmXCYvIDAgLzsKKwl9CisgICAgfQorCisgICAgJGQtLTsKKyAgICBteSAkT1IgPSAiXFx8XFx8IjsKKyAgICBteSAkQU5EID0gIlxcJlxcJiI7CisKKyAgICB3aGlsZSAoJHZhbCA9fiBzL14oLio/KSgkT1J8JEFORCkvLykgeworCW15ICRleHByZXNzID0gJDE7CisJbXkgJG9wID0gJDI7CisKKwlpZiAocHJvY2Vzc19leHByZXNzaW9uKCRuYW1lLCAkZXhwcmVzcykpIHsKKwkgICAgaWYgKCRvcCBlcSAifHwiKSB7CisJCXJldHVybiAxOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKCRvcCBlcSAiJiYiKSB7CisJCXJldHVybiAwOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICgkdmFsID1+IC8oLiopKD09fFwhPXw+PXw8PXw+fDwpKC4qKS8pIHsKKwlteSAkcmV0ID0gcHJvY2Vzc19jb21wYXJlKCQxLCAkMiwgJDMpOworCWlmICgkcmV0IDwgMCkgeworCSAgICBkaWUgIiRuYW1lOiAkLjogVW5hYmxlIHRvIHByb2Nlc3MgY29tcGFyaXNvblxuIjsKKwl9CisJcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgaWYgKCR2YWwgPX4gL15ccyooTk9UXHMqKT9ERUZJTkVEXHMrKFxTKylccyokLykgeworCWlmIChkZWZpbmVkICQxKSB7CisJICAgIHJldHVybiAhdmFsdWVfZGVmaW5lZCgkMik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIHZhbHVlX2RlZmluZWQoJDIpOworCX0KKyAgICB9CisKKyAgICBpZiAoJHZhbCA9fiAvXlxzKjBccyokLykgeworCXJldHVybiAwOworICAgIH0gZWxzaWYgKCR2YWwgPX4gL15ccypcZCtccyokLykgeworCXJldHVybiAxOworICAgIH0KKworICAgIGRpZSAoIiRuYW1lOiAkLjogVW5kZWZpbmVkIGNvbnRlbnQgJHZhbCBpbiBpZiBzdGF0ZW1lbnRcbiIpOworfQorCitzdWIgcHJvY2Vzc19pZiB7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CisKKyAgICAjIENvbnZlcnQgdmFyaWFibGVzIGFuZCByZXBsYWNlIHVuZGVmaW5lZCBvbmVzIHdpdGggMAorICAgIG15ICR2YWwgPSBwcm9jZXNzX3ZhcmlhYmxlcygkdmFsdWUsIDEpOworICAgIG15ICRyZXQgPSBwcm9jZXNzX2V4cHJlc3Npb24gJG5hbWUsICR2YWw7CisKKyAgICByZXR1cm4gJHJldDsKK30KKworc3ViIF9fcmVhZF9jb25maWcgeworICAgIG15ICgkY29uZmlnLCAkY3VycmVudF90ZXN0X251bSkgPSBAXzsKKworICAgIG15ICRpbjsKKyAgICBvcGVuKCRpbiwgJGNvbmZpZykgfHwgZGllICJjYW4ndCByZWFkIGZpbGUgJGNvbmZpZyI7CiAKICAgICBteSAkbmFtZSA9ICRjb25maWc7CiAgICAgJG5hbWUgPX4gcywuKi8oLiopLCQxLDsKIAotICAgIG15ICR0ZXN0X251bSA9IDA7CisgICAgbXkgJHRlc3RfbnVtID0gJCRjdXJyZW50X3Rlc3RfbnVtOwogICAgIG15ICRkZWZhdWx0ID0gMTsKICAgICBteSAkcmVwZWF0ID0gMTsKICAgICBteSAkbnVtX3Rlc3RzX3NldCA9IDA7CiAgICAgbXkgJHNraXAgPSAwOwogICAgIG15ICRyZXN0OworICAgIG15ICRsaW5lOwogICAgIG15ICR0ZXN0X2Nhc2UgPSAwOworICAgIG15ICRpZiA9IDA7CisgICAgbXkgJGlmX3NldCA9IDA7CisgICAgbXkgJG92ZXJyaWRlID0gMDsKIAotICAgIHdoaWxlICg8SU4+KSB7CisgICAgbXkgJW92ZXJyaWRlczsKKworICAgIHdoaWxlICg8JGluPikgewogCiAJIyBpZ25vcmUgYmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzCiAJbmV4dCBpZiAoL15ccyokLyB8fCAvXHMqXCMvKTsKIAotCWlmICgvXlxzKlRFU1RfU1RBUlQoLiopLykgeworCWlmICgvXlxzKihURVNUX1NUQVJUfERFRkFVTFRTKVxiKC4qKS8pIHsKIAotCSAgICAkcmVzdCA9ICQxOworCSAgICBteSAkdHlwZSA9ICQxOworCSAgICAkcmVzdCA9ICQyOworCSAgICAkbGluZSA9ICQyOwogCi0JICAgIGlmICgkbnVtX3Rlc3RzX3NldCkgewotCQlkaWUgIiRuYW1lOiAkLjogQ2FuIG5vdCBzcGVjaWZ5IGJvdGggTlVNX1RFU1RTIGFuZCBURVNUX1NUQVJUXG4iOworCSAgICBteSAkb2xkX3Rlc3RfbnVtOworCSAgICBteSAkb2xkX3JlcGVhdDsKKwkgICAgJG92ZXJyaWRlID0gMDsKKworCSAgICBpZiAoJHR5cGUgZXEgIlRFU1RfU1RBUlQiKSB7CisKKwkJaWYgKCRudW1fdGVzdHNfc2V0KSB7CisJCSAgICBkaWUgIiRuYW1lOiAkLjogQ2FuIG5vdCBzcGVjaWZ5IGJvdGggTlVNX1RFU1RTIGFuZCBURVNUX1NUQVJUXG4iOworCQl9CisKKwkJJG9sZF90ZXN0X251bSA9ICR0ZXN0X251bTsKKwkJJG9sZF9yZXBlYXQgPSAkcmVwZWF0OworCisJCSR0ZXN0X251bSArPSAkcmVwZWF0OworCQkkZGVmYXVsdCA9IDA7CisJCSRyZXBlYXQgPSAxOworCSAgICB9IGVsc2UgeworCQkkZGVmYXVsdCA9IDE7CiAJICAgIH0KIAotCSAgICBteSAkb2xkX3Rlc3RfbnVtID0gJHRlc3RfbnVtOwotCSAgICBteSAkb2xkX3JlcGVhdCA9ICRyZXBlYXQ7Ci0KLQkgICAgJHRlc3RfbnVtICs9ICRyZXBlYXQ7Ci0JICAgICRkZWZhdWx0ID0gMDsKLQkgICAgJHJlcGVhdCA9IDE7Ci0KLQkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKLQkJJHJlc3QgPSAkMTsKKwkgICAgIyBJZiBTS0lQIGlzIGFueXdoZXJlIGluIHRoZSBsaW5lLCB0aGUgY29tbWFuZCB3aWxsIGJlIHNraXBwZWQKKwkgICAgaWYgKCRyZXN0ID1+IHMvXHMrU0tJUFxiLy8pIHsKIAkJJHNraXAgPSAxOwogCSAgICB9IGVsc2UgewogCQkkdGVzdF9jYXNlID0gMTsKIAkJJHNraXAgPSAwOwogCSAgICB9CiAKLQkgICAgaWYgKCRyZXN0ID1+IC9ccytJVEVSQVRFXHMrKFxkKykoLiopJC8pIHsKLQkJJHJlcGVhdCA9ICQxOwotCQkkcmVzdCA9ICQyOwotCQkkcmVwZWF0X3Rlc3RzeyIkdGVzdF9udW0ifSA9ICRyZXBlYXQ7CisJICAgIGlmICgkcmVzdCA9fiBzL1xzRUxTRVxiLy8pIHsKKwkJaWYgKCEkaWYpIHsKKwkJICAgIGRpZSAiJG5hbWU6ICQuOiBFTFNFIGZvdW5kIHdpdGggb3V0IG1hdGNoaW5nIElGIHNlY3Rpb25cbiRfIjsKKwkJfQorCQkkaWYgPSAwOworCisJCWlmICgkaWZfc2V0KSB7CisJCSAgICAkc2tpcCA9IDE7CisJCX0gZWxzZSB7CisJCSAgICAkc2tpcCA9IDA7CisJCX0KIAkgICAgfQogCi0JICAgIGlmICgkcmVzdCA9fiAvXHMrU0tJUCguKikvKSB7Ci0JCSRyZXN0ID0gJDE7Ci0JCSRza2lwID0gMTsKKwkgICAgaWYgKCRyZXN0ID1+IHMvXHNJRlxzKyguKikvLykgeworCQlpZiAocHJvY2Vzc19pZigkbmFtZSwgJDEpKSB7CisJCSAgICAkaWZfc2V0ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgICRza2lwID0gMTsKKwkJfQorCQkkaWYgPSAxOworCSAgICB9IGVsc2UgeworCQkkaWYgPSAwOworCQkkaWZfc2V0ID0gMDsKIAkgICAgfQogCi0JICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7Ci0JCWRpZSAiJG5hbWU6ICQuOiBHYXJnYmFnZSBmb3VuZCBhZnRlciBURVNUX1NUQVJUXG4kXyI7CisJICAgIGlmICghJHNraXApIHsKKwkJaWYgKCR0eXBlIGVxICJURVNUX1NUQVJUIikgeworCQkgICAgaWYgKCRyZXN0ID1+IHMvXHMrSVRFUkFURVxzKyhcZCspLy8pIHsKKwkJCSRyZXBlYXQgPSAkMTsKKwkJCSRyZXBlYXRfdGVzdHN7IiR0ZXN0X251bSJ9ID0gJHJlcGVhdDsKKwkJICAgIH0KKwkJfSBlbHNpZiAoJHJlc3QgPX4gcy9cc09WRVJSSURFXGIvLykgeworCQkgICAgIyBERUZBVUxUIG9ubHkKKwkJICAgICRvdmVycmlkZSA9IDE7CisJCSAgICAjIENsZWFyIHByZXZpb3VzIG92ZXJyaWRlcworCQkgICAgJW92ZXJyaWRlcyA9ICgpOworCQl9CiAJICAgIH0KIAotCSAgICBpZiAoJHNraXApIHsKKwkgICAgaWYgKCEkc2tpcCAmJiAkcmVzdCAhfiAvXlxzKiQvKSB7CisJCWRpZSAiJG5hbWU6ICQuOiBHYXJnYmFnZSBmb3VuZCBhZnRlciAkdHlwZVxuJF8iOworCSAgICB9CisKKwkgICAgaWYgKCRza2lwICYmICR0eXBlIGVxICJURVNUX1NUQVJUIikgewogCQkkdGVzdF9udW0gPSAkb2xkX3Rlc3RfbnVtOwogCQkkcmVwZWF0ID0gJG9sZF9yZXBlYXQ7CiAJICAgIH0KIAotCX0gZWxzaWYgKC9eXHMqREVGQVVMVFMoLiopJC8pIHsKLQkgICAgJGRlZmF1bHQgPSAxOwotCisJfSBlbHNpZiAoL15ccypFTFNFXGIoLiopJC8pIHsKKwkgICAgaWYgKCEkaWYpIHsKKwkJZGllICIkbmFtZTogJC46IEVMU0UgZm91bmQgd2l0aCBvdXQgbWF0Y2hpbmcgSUYgc2VjdGlvblxuJF8iOworCSAgICB9CiAJICAgICRyZXN0ID0gJDE7Ci0KLQkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKLQkJJHJlc3QgPSAkMTsKKwkgICAgaWYgKCRpZl9zZXQpIHsKIAkJJHNraXAgPSAxOworCQkkcmVzdCA9ICIiOwogCSAgICB9IGVsc2UgewogCQkkc2tpcCA9IDA7CisKKwkJaWYgKCRyZXN0ID1+IC9cc0lGXHMrKC4qKS8pIHsKKwkJICAgICMgTWF5IGJlIGEgRUxTRSBJRiBzZWN0aW9uLgorCQkgICAgaWYgKCFwcm9jZXNzX2lmKCRuYW1lLCAkMSkpIHsKKwkJCSRza2lwID0gMTsKKwkJICAgIH0KKwkJICAgICRyZXN0ID0gIiI7CisJCX0gZWxzZSB7CisJCSAgICAkaWYgPSAwOworCQl9CiAJICAgIH0KIAogCSAgICBpZiAoJHJlc3QgIX4gL15ccyokLykgewogCQlkaWUgIiRuYW1lOiAkLjogR2FyZ2JhZ2UgZm91bmQgYWZ0ZXIgREVGQVVMVFNcbiRfIjsKIAkgICAgfQogCisJfSBlbHNpZiAoL15ccypJTkNMVURFXHMrKFxTKykvKSB7CisKKwkgICAgbmV4dCBpZiAoJHNraXApOworCisJICAgIGlmICghJGRlZmF1bHQpIHsKKwkJZGllICIkbmFtZTogJC46IElOQ0xVREUgY2FuIG9ubHkgYmUgZG9uZSBpbiBkZWZhdWx0IHNlY3Rpb25zXG4kXyI7CisJICAgIH0KKworCSAgICBteSAkZmlsZSA9IHByb2Nlc3NfdmFyaWFibGVzKCQxKTsKKworCSAgICBpZiAoJGZpbGUgIX4gbSxeLywpIHsKKwkJIyBjaGVjayB0aGUgcGF0aCBvZiB0aGUgY29uZmlnIGZpbGUgZmlyc3QKKwkJaWYgKCRjb25maWcgPX4gbSwoLiopLywpIHsKKwkJICAgIGlmICgtZiAiJDEvJGZpbGUiKSB7CisJCQkkZmlsZSA9ICIkMS8kZmlsZSI7CisJCSAgICB9CisJCX0KKwkgICAgfQorCQkKKwkgICAgaWYgKCAhIC1yICRmaWxlICkgeworCQlkaWUgIiRuYW1lOiAkLjogQ2FuJ3QgcmVhZCBmaWxlICRmaWxlXG4kXyI7CisJICAgIH0KKworCSAgICBpZiAoX19yZWFkX2NvbmZpZygkZmlsZSwgXCR0ZXN0X251bSkpIHsKKwkJJHRlc3RfY2FzZSA9IDE7CisJICAgIH0KKwogCX0gZWxzaWYgKC9eXHMqKFtBLVpfXFtcXVxkXSspXHMqPVxzKiguKj8pXHMqJC8pIHsKIAogCSAgICBuZXh0IGlmICgkc2tpcCk7CkBAIC00NjAsMTAgKzY3MCwxMCBAQAogCSAgICB9CiAKIAkgICAgaWYgKCRkZWZhdWx0IHx8ICRsdmFsdWUgPX4gL1xbXGQrXF0kLykgewotCQlzZXRfdmFsdWUoJGx2YWx1ZSwgJHJ2YWx1ZSk7CisJCXNldF92YWx1ZSgkbHZhbHVlLCAkcnZhbHVlLCAkb3ZlcnJpZGUsIFwlb3ZlcnJpZGVzLCAkbmFtZSk7CiAJICAgIH0gZWxzZSB7CiAJCW15ICR2YWwgPSAiJGx2YWx1ZVxbJHRlc3RfbnVtXF0iOwotCQlzZXRfdmFsdWUoJHZhbCwgJHJ2YWx1ZSk7CisJCXNldF92YWx1ZSgkdmFsLCAkcnZhbHVlLCAkb3ZlcnJpZGUsIFwlb3ZlcnJpZGVzLCAkbmFtZSk7CiAKIAkJaWYgKCRyZXBlYXQgPiAxKSB7CiAJCSAgICAkcmVwZWF0c3skdmFsfSA9ICRyZXBlYXQ7CkBAIC00OTAsMTMgKzcwMCwyNiBAQAogCX0KICAgICB9CiAKLSAgICBjbG9zZShJTik7Ci0KICAgICBpZiAoJHRlc3RfbnVtKSB7CiAJJHRlc3RfbnVtICs9ICRyZXBlYXQgLSAxOwogCSRvcHR7Ik5VTV9URVNUUyJ9ID0gJHRlc3RfbnVtOwogICAgIH0KIAorICAgIGNsb3NlKCRpbik7CisKKyAgICAkJGN1cnJlbnRfdGVzdF9udW0gPSAkdGVzdF9udW07CisKKyAgICByZXR1cm4gJHRlc3RfY2FzZTsKK30KKworc3ViIHJlYWRfY29uZmlnIHsKKyAgICBteSAoJGNvbmZpZykgPSBAXzsKKworICAgIG15ICR0ZXN0X2Nhc2U7CisgICAgbXkgJHRlc3RfbnVtID0gMDsKKworICAgICR0ZXN0X2Nhc2UgPSBfX3JlYWRfY29uZmlnICRjb25maWcsIFwkdGVzdF9udW07CisKICAgICAjIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCBtYW5kYXRvcnkgY29uZmlncwogICAgIGdldF9rdGVzdF9jb25maWdzOwogCkBAIC02MDMsOCArODI2LDIwIEBACiB9CiAKIHN1YiBydW5fY29tbWFuZDsKK3N1YiBzdGFydF9tb25pdG9yOworc3ViIGVuZF9tb25pdG9yOworc3ViIHdhaXRfZm9yX21vbml0b3I7CiAKIHN1YiByZWJvb3QgeworICAgIG15ICgkdGltZSkgPSBAXzsKKworICAgIGlmIChkZWZpbmVkKCR0aW1lKSkgeworCXN0YXJ0X21vbml0b3I7CisJIyBmbHVzaCBvdXQgY3VycmVudCBtb25pdG9yCisJIyBNYXkgY29udGFpbiB0aGUgcmVib290IHN1Y2Nlc3MgbGluZQorCXdhaXRfZm9yX21vbml0b3IgMTsKKyAgICB9CisKICAgICAjIHRyeSB0byByZWJvb3Qgbm9ybWFsbHkKICAgICBpZiAocnVuX2NvbW1hbmQgJHJlYm9vdCkgewogCWlmIChkZWZpbmVkKCRwb3dlcmN5Y2xlX2FmdGVyX3JlYm9vdCkpIHsKQEAgLTYxNSwxMiArODUwLDE3IEBACiAJIyBub3BlPyBwb3dlciBjeWNsZSBpdC4KIAlydW5fY29tbWFuZCAiJHBvd2VyX2N5Y2xlIjsKICAgICB9CisKKyAgICBpZiAoZGVmaW5lZCgkdGltZSkpIHsKKwl3YWl0X2Zvcl9tb25pdG9yKCR0aW1lLCAkcmVib290X3N1Y2Nlc3NfbGluZSk7CisJZW5kX21vbml0b3I7CisgICAgfQogfQogCiBzdWIgZG9fbm90X3JlYm9vdCB7CiAgICAgbXkgJGkgPSAkaXRlcmF0aW9uOwogCi0gICAgcmV0dXJuICR0ZXN0X3R5cGUgZXEgImJ1aWxkIiB8fAorICAgIHJldHVybiAkdGVzdF90eXBlIGVxICJidWlsZCIgfHwgJG5vX3JlYm9vdCB8fAogCSgkdGVzdF90eXBlIGVxICJwYXRjaGNoZWNrIiAmJiAkb3B0eyJQQVRDSENIRUNLX1RZUEVbJGldIn0gZXEgImJ1aWxkIikgfHwKIAkoJHRlc3RfdHlwZSBlcSAiYmlzZWN0IiAmJiAkb3B0eyJCSVNFQ1RfVFlQRVskaV0ifSBlcSAiYnVpbGQiKTsKIH0KQEAgLTY5MywxNiArOTMzLDI5IEBACiB9CiAKIHN1YiB3YWl0X2Zvcl9tb25pdG9yIHsKLSAgICBteSAoJHRpbWUpID0gQF87CisgICAgbXkgKCR0aW1lLCAkc3RvcCkgPSBAXzsKKyAgICBteSAkZnVsbF9saW5lID0gIiI7CiAgICAgbXkgJGxpbmU7CisgICAgbXkgJGJvb3RlZCA9IDA7CiAKICAgICBkb3ByaW50ICIqKiBXYWl0IGZvciBtb25pdG9yIHRvIHNldHRsZSBkb3duICoqXG4iOwogCiAgICAgIyByZWFkIHRoZSBtb25pdG9yIGFuZCB3YWl0IGZvciB0aGUgc3lzdGVtIHRvIGNhbG0gZG93bgotICAgIGRvIHsKKyAgICB3aGlsZSAoISRib290ZWQpIHsKIAkkbGluZSA9IHdhaXRfZm9yX2lucHV0KCRtb25pdG9yX2ZwLCAkdGltZSk7Ci0JcHJpbnQgIiRsaW5lIiBpZiAoZGVmaW5lZCgkbGluZSkpOwotICAgIH0gd2hpbGUgKGRlZmluZWQoJGxpbmUpKTsKKwlsYXN0IGlmICghZGVmaW5lZCgkbGluZSkpOworCXByaW50ICIkbGluZSI7CisJJGZ1bGxfbGluZSAuPSAkbGluZTsKKworCWlmIChkZWZpbmVkKCRzdG9wKSAmJiAkZnVsbF9saW5lID1+IC8kc3RvcC8pIHsKKwkgICAgZG9wcmludCAid2FpdCBmb3IgbW9uaXRvciBkZXRlY3RlZCAkc3RvcFxuIjsKKwkgICAgJGJvb3RlZCA9IDE7CisJfQorCisJaWYgKCRsaW5lID1+IC9cbi8pIHsKKwkgICAgJGZ1bGxfbGluZSA9ICIiOworCX0KKyAgICB9CiAgICAgcHJpbnQgIioqIE1vbml0b3IgZmx1c2hlZCAqKlxuIjsKIH0KIApAQCAtNzE5LDEwICs5NzIsNyBAQAogCSMgbm8gbmVlZCB0byByZWJvb3QgZm9yIGp1c3QgYnVpbGRpbmcuCiAJaWYgKCFkb19ub3RfcmVib290KSB7CiAJICAgIGRvcHJpbnQgIlJFQk9PVElOR1xuIjsKLQkgICAgcmVib290OwotCSAgICBzdGFydF9tb25pdG9yOwotCSAgICB3YWl0X2Zvcl9tb25pdG9yICRzbGVlcF90aW1lOwotCSAgICBlbmRfbW9uaXRvcjsKKwkgICAgcmVib290ICRzbGVlcF90aW1lOwogCX0KIAogCW15ICRuYW1lID0gIiI7CkBAIC04NTQsOSArMTEwNCwxMiBAQAogICAgIG9wZW4oSU4sICIkc3NoX2dydWIgfCIpCiAJb3IgZGllICJ1bmFibGUgdG8gZ2V0IG1lbnUubHN0IjsKIAorICAgIG15ICRmb3VuZCA9IDA7CisKICAgICB3aGlsZSAoPElOPikgewogCWlmICgvXlxzKnRpdGxlXHMrJGdydWJfbWVudVxzKiQvKSB7CiAJICAgICRncnViX251bWJlcisrOworCSAgICAkZm91bmQgPSAxOwogCSAgICBsYXN0OwogCX0gZWxzaWYgKC9eXHMqdGl0bGVccy8pIHsKIAkgICAgJGdydWJfbnVtYmVyKys7CkBAIC04NjUsNyArMTExOCw3IEBACiAgICAgY2xvc2UoSU4pOwogCiAgICAgZGllICJDb3VsZCBub3QgZmluZCAnJGdydWJfbWVudScgaW4gL2Jvb3QvZ3J1Yi9tZW51IG9uICRtYWNoaW5lIgotCWlmICgkZ3J1Yl9udW1iZXIgPCAwKTsKKwlpZiAoISRmb3VuZCk7CiAgICAgZG9wcmludCAiJGdydWJfbnVtYmVyXG4iOwogfQogCkBAIC05MDIsNyArMTE1NSw4IEBACiAKIHN1YiByZWJvb3RfdG8gewogICAgIGlmICgkcmVib290X3R5cGUgZXEgImdydWIiKSB7Ci0JcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaCAmJiByZWJvb3QpJyI7CisJcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaCknIjsKKwlyZWJvb3Q7CiAJcmV0dXJuOwogICAgIH0KIApAQCAtMTA4Myw2ICsxMzM3LDggQEAKIAogc3ViIGluc3RhbGwgewogCisgICAgcmV0dXJuIGlmICgkbm9faW5zdGFsbCk7CisKICAgICBydW5fc2NwICIkb3V0cHV0ZGlyLyRidWlsZF90YXJnZXQiLCAiJHRhcmdldF9pbWFnZSIgb3IKIAlkb2RpZSAiZmFpbGVkIHRvIGNvcHkgaW1hZ2UiOwogCkBAIC0xMTQwLDYgKzEzOTYsMTEgQEAKIH0KIAogc3ViIHN0YXJ0X21vbml0b3JfYW5kX2Jvb3QgeworICAgICMgTWFrZSBzdXJlIHRoZSBzdGFibGUga2VybmVsIGhhcyBmaW5pc2hlZCBib290aW5nCisgICAgc3RhcnRfbW9uaXRvcjsKKyAgICB3YWl0X2Zvcl9tb25pdG9yIDU7CisgICAgZW5kX21vbml0b3I7CisKICAgICBnZXRfZ3J1Yl9pbmRleDsKICAgICBnZXRfdmVyc2lvbjsKICAgICBpbnN0YWxsOwpAQCAtMTI1MCw2ICsxNTExLDEwIEBACiAKICAgICB1bmxpbmsgJGJ1aWxkbG9nOwogCisgICAgIyBGYWlsZWQgYnVpbGRzIHNob3VsZCBub3QgcmVib290IHRoZSB0YXJnZXQKKyAgICBteSAkc2F2ZV9ub19yZWJvb3QgPSAkbm9fcmVib290OworICAgICRub19yZWJvb3QgPSAxOworCiAgICAgaWYgKGRlZmluZWQoJHByZV9idWlsZCkpIHsKIAlteSAkcmV0ID0gcnVuX2NvbW1hbmQgJHByZV9idWlsZDsKIAlpZiAoISRyZXQgJiYgZGVmaW5lZCgkcHJlX2J1aWxkX2RpZSkgJiYKQEAgLTEyNzIsMTYgKzE1MzcsMTYgQEAKIAkjIGFsbG93IGZvciBlbXB0eSBjb25maWdzCiAJcnVuX2NvbW1hbmQgInRvdWNoICRvdXRwdXRfY29uZmlnIjsKIAotCXJ1bl9jb21tYW5kICJtdiAkb3V0cHV0X2NvbmZpZyAkb3V0cHV0ZGlyL2NvbmZpZ190ZW1wIiBvcgotCSAgICBkb2RpZSAibW92aW5nIC5jb25maWciOworCWlmICghJG5vY2xlYW4pIHsKKwkgICAgcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRfY29uZmlnICRvdXRwdXRkaXIvY29uZmlnX3RlbXAiIG9yCisJCWRvZGllICJtb3ZpbmcgLmNvbmZpZyI7CiAKLQlpZiAoISRub2NsZWFuICYmICFydW5fY29tbWFuZCAiJG1ha2UgbXJwcm9wZXIiKSB7Ci0JICAgIGRvZGllICJtYWtlIG1ycHJvcGVyIjsKKwkgICAgcnVuX2NvbW1hbmQgIiRtYWtlIG1ycHJvcGVyIiBvciBkb2RpZSAibWFrZSBtcnByb3BlciI7CisKKwkgICAgcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRkaXIvY29uZmlnX3RlbXAgJG91dHB1dF9jb25maWciIG9yCisJCWRvZGllICJtb3ZpbmcgY29uZmlnX3RlbXAiOwogCX0KIAotCXJ1bl9jb21tYW5kICJtdiAkb3V0cHV0ZGlyL2NvbmZpZ190ZW1wICRvdXRwdXRfY29uZmlnIiBvcgotCSAgICBkb2RpZSAibW92aW5nIGNvbmZpZ190ZW1wIjsKLQogICAgIH0gZWxzaWYgKCEkbm9jbGVhbikgewogCXVubGluayAiJG91dHB1dF9jb25maWciOwogCXJ1bl9jb21tYW5kICIkbWFrZSBtcnByb3BlciIgb3IKQEAgLTEzMTgsMTAgKzE1ODMsMTUgQEAKIAogICAgIGlmICghJGJ1aWxkX3JldCkgewogCSMgYmlzZWN0IG1heSBuZWVkIHRoaXMgdG8gcGFzcwotCXJldHVybiAwIGlmICgkaW5fYmlzZWN0KTsKKwlpZiAoJGluX2Jpc2VjdCkgeworCSAgICAkbm9fcmVib290ID0gJHNhdmVfbm9fcmVib290OworCSAgICByZXR1cm4gMDsKKwl9CiAJZmFpbCAiZmFpbGVkIGJ1aWxkIiBhbmQgcmV0dXJuIDA7CiAgICAgfQogCisgICAgJG5vX3JlYm9vdCA9ICRzYXZlX25vX3JlYm9vdDsKKwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMzU2LDEwICsxNjI2LDcgQEAKIAogICAgIGlmICgkaSAhPSAkb3B0eyJOVU1fVEVTVFMifSAmJiAhZG9fbm90X3JlYm9vdCkgewogCWRvcHJpbnQgIlJlYm9vdCBhbmQgd2FpdCAkc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotCXJlYm9vdDsKLQlzdGFydF9tb25pdG9yOwotCXdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7Ci0JZW5kX21vbml0b3I7CisJcmVib290ICRzbGVlcF90aW1lOwogICAgIH0KIH0KIApAQCAtMTUwMCwxMCArMTc2Nyw3IEBACiAKIHN1YiBiaXNlY3RfcmVib290IHsKICAgICBkb3ByaW50ICJSZWJvb3QgYW5kIHNsZWVwICRiaXNlY3Rfc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotICAgIHJlYm9vdDsKLSAgICBzdGFydF9tb25pdG9yOwotICAgIHdhaXRfZm9yX21vbml0b3IgJGJpc2VjdF9zbGVlcF90aW1lOwotICAgIGVuZF9tb25pdG9yOworICAgIHJlYm9vdCAkYmlzZWN0X3NsZWVwX3RpbWU7CiB9CiAKICMgcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZSwgLTEgb24gc2tpcApAQCAtMjA2NiwxMCArMjMzMCw3IEBACiAKIHN1YiBwYXRjaGNoZWNrX3JlYm9vdCB7CiAgICAgZG9wcmludCAiUmVib290IGFuZCBzbGVlcCAkcGF0Y2hjaGVja19zbGVlcF90aW1lIHNlY29uZHNcbiI7Ci0gICAgcmVib290OwotICAgIHN0YXJ0X21vbml0b3I7Ci0gICAgd2FpdF9mb3JfbW9uaXRvciAkcGF0Y2hjaGVja19zbGVlcF90aW1lOwotICAgIGVuZF9tb25pdG9yOworICAgIHJlYm9vdCAkcGF0Y2hjaGVja19zbGVlcF90aW1lOwogfQogCiBzdWIgcGF0Y2hjaGVjayB7CkBAIC0yMTc4LDEyICsyNDM5LDMxIEBACiB9CiAKIG15ICVkZXBlbmRzOworbXkgJWRlcGNvdW50OwogbXkgJGlmbGV2ZWwgPSAwOwogbXkgQGlmZGVwczsKIAogIyBwcmV2ZW50IHJlY3Vyc2lvbgogbXkgJXJlYWRfa2NvbmZpZ3M7CiAKK3N1YiBhZGRfZGVwIHsKKyAgICAjICRjb25maWcgZGVwZW5kcyBvbiAkZGVwCisgICAgbXkgKCRjb25maWcsICRkZXApID0gQF87CisKKyAgICBpZiAoZGVmaW5lZCgkZGVwZW5kc3skY29uZmlnfSkpIHsKKwkkZGVwZW5kc3skY29uZmlnfSAuPSAiICIgLiAkZGVwOworICAgIH0gZWxzZSB7CisJJGRlcGVuZHN7JGNvbmZpZ30gPSAkZGVwOworICAgIH0KKworICAgICMgcmVjb3JkIHRoZSBudW1iZXIgb2YgY29uZmlncyBkZXBlbmRpbmcgb24gJGRlcAorICAgIGlmIChkZWZpbmVkICRkZXBjb3VudHskZGVwfSkgeworCSRkZXBjb3VudHskZGVwfSsrOworICAgIH0gZWxzZSB7CisJJGRlcGNvdW50eyRkZXB9ID0gMTsKKyAgICB9IAorfQorCiAjIHRha2VuIGZyb20gc3RyZWFtbGluZV9jb25maWcucGwKIHN1YiByZWFkX2tjb25maWcgewogICAgIG15ICgka2NvbmZpZykgPSBAXzsKQEAgLTIyMzAsMzAgKzI1MTAsMTkgQEAKIAkgICAgJGNvbmZpZyA9ICQyOwogCiAJICAgIGZvciAobXkgJGkgPSAwOyAkaSA8ICRpZmxldmVsOyAkaSsrKSB7Ci0JCWlmICgkaSkgewotCQkgICAgJGRlcGVuZHN7JGNvbmZpZ30gLj0gIiAiIC4gJGlmZGVwc1skaV07Ci0JCX0gZWxzZSB7Ci0JCSAgICAkZGVwZW5kc3skY29uZmlnfSA9ICRpZmRlcHNbJGldOwotCQl9Ci0JCSRzdGF0ZSA9ICJERVAiOworCQlhZGRfZGVwICRjb25maWcsICRpZmRlcHNbJGldOwogCSAgICB9CiAKIAkjIGNvbGxlY3QgdGhlIGRlcGVuZHMgZm9yIHRoZSBjb25maWcKIAl9IGVsc2lmICgkc3RhdGUgZXEgIk5FVyIgJiYgL15ccypkZXBlbmRzXHMrb25ccysoLiopJC8pIHsKIAotCSAgICBpZiAoZGVmaW5lZCgkZGVwZW5kc3skMX0pKSB7Ci0JCSRkZXBlbmRzeyRjb25maWd9IC49ICIgIiAuICQxOwotCSAgICB9IGVsc2UgewotCQkkZGVwZW5kc3skY29uZmlnfSA9ICQxOwotCSAgICB9CisJICAgIGFkZF9kZXAgJGNvbmZpZywgJDE7CiAKIAkjIEdldCB0aGUgY29uZmlncyB0aGF0IHNlbGVjdCB0aGlzIGNvbmZpZwotCX0gZWxzaWYgKCRzdGF0ZSBuZSAiTk9ORSIgJiYgL15ccypzZWxlY3RccysoXFMrKS8pIHsKLQkgICAgaWYgKGRlZmluZWQoJGRlcGVuZHN7JDF9KSkgewotCQkkZGVwZW5kc3skMX0gLj0gIiAiIC4gJGNvbmZpZzsKLQkgICAgfSBlbHNlIHsKLQkJJGRlcGVuZHN7JDF9ID0gJGNvbmZpZzsKLQkgICAgfQorCX0gZWxzaWYgKCRzdGF0ZSBlcSAiTkVXIiAmJiAvXlxzKnNlbGVjdFxzKyhcUyspLykgeworCisJICAgICMgc2VsZWN0ZWQgYnkgZGVwZW5kcyBvbiBjb25maWcKKwkgICAgYWRkX2RlcCAkMSwgJGNvbmZpZzsKIAogCSMgQ2hlY2sgZm9yIGlmIHN0YXRlbWVudHMKIAl9IGVsc2lmICgvXmlmXHMrKC4qXFMpXHMqJC8pIHsKQEAgLTIzNjUsMTEgKzI2MzQsMTggQEAKICAgICBjbG9zZSBPVVQ7CiB9CiAKK3N1YiBjaG9tcF9jb25maWcgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgJGNvbmZpZyA9fiBzL0NPTkZJR18vLzsKKworICAgIHJldHVybiAkY29uZmlnOworfQorCiBzdWIgZ2V0X2RlcGVuZHMgewogICAgIG15ICgkZGVwKSA9IEBfOwogCi0gICAgbXkgJGtjb25maWcgPSAkZGVwOwotICAgICRrY29uZmlnID1+IHMvQ09ORklHXy8vOworICAgIG15ICRrY29uZmlnID0gY2hvbXBfY29uZmlnICRkZXA7CiAKICAgICAkZGVwID0gJGRlcGVuZHN7IiRrY29uZmlnIn07CiAKQEAgLTI0MTksOCArMjY5NSw3IEBACiAJcmV0dXJuIHVuZGVmOwogICAgIH0KIAotICAgIG15ICRrY29uZmlnID0gJGNvbmZpZzsKLSAgICAka2NvbmZpZyA9fiBzL0NPTkZJR18vLzsKKyAgICBteSAka2NvbmZpZyA9IGNob21wX2NvbmZpZyAkY29uZmlnOwogCiAgICAgIyBUZXN0IGRlcGVuZGVuY2llcyBmaXJzdAogICAgIGlmIChkZWZpbmVkKCRkZXBlbmRzeyIka2NvbmZpZyJ9KSkgewpAQCAtMjUxMCw2ICsyNzg1LDE0IEBACiAKICAgICBteSBAY29uZmlnX2tleXMgPSBrZXlzICVtaW5fY29uZmlnczsKIAorICAgICMgQWxsIGNvbmZpZ3MgbmVlZCBhIGRlcGNvdW50CisgICAgZm9yZWFjaCBteSAkY29uZmlnIChAY29uZmlnX2tleXMpIHsKKwlteSAka2NvbmZpZyA9IGNob21wX2NvbmZpZyAkY29uZmlnOworCWlmICghZGVmaW5lZCAkZGVwY291bnR7JGtjb25maWd9KSB7CisJCSRkZXBjb3VudHska2NvbmZpZ30gPSAwOworCX0KKyAgICB9CisKICAgICAjIFJlbW92ZSBhbnl0aGluZyB0aGF0IHdhcyBzZXQgYnkgdGhlIG1ha2UgYWxsbm9jb25maWcKICAgICAjIHdlIHNob3VsZG4ndCBuZWVkIHRoZW0gYXMgdGhleSBnZXQgc2V0IGZvciB1cyBhbnl3YXkuCiAgICAgZm9yZWFjaCBteSAkY29uZmlnIChAY29uZmlnX2tleXMpIHsKQEAgLTI1NDgsOCArMjgzMSwxMyBAQAogCSMgTm93IGRpc2FibGUgZWFjaCBjb25maWcgb25lIGJ5IG9uZSBhbmQgZG8gYSBtYWtlIG9sZGNvbmZpZwogCSMgdGlsbCB3ZSBmaW5kIGEgY29uZmlnIHRoYXQgY2hhbmdlcyBvdXIgbGlzdC4KIAotCSMgUHV0IGNvbmZpZ3MgdGhhdCBkaWQgbm90IG1vZGlmeSB0aGUgY29uZmlnIGF0IHRoZSBlbmQuCiAJbXkgQHRlc3RfY29uZmlncyA9IGtleXMgJW1pbl9jb25maWdzOworCisJIyBTb3J0IGtleXMgYnkgd2hvIGlzIG1vc3QgZGVwZW5kZW50IG9uCisJQHRlc3RfY29uZmlncyA9IHNvcnQgIHsgJGRlcGNvdW50e2Nob21wX2NvbmZpZygkYil9IDw9PiAkZGVwY291bnR7Y2hvbXBfY29uZmlnKCRhKX0gfQorCQkJICBAdGVzdF9jb25maWdzIDsKKworCSMgUHV0IGNvbmZpZ3MgdGhhdCBkaWQgbm90IG1vZGlmeSB0aGUgY29uZmlnIGF0IHRoZSBlbmQuCiAJbXkgJHJlc2V0ID0gMTsKIAlmb3IgKG15ICRpID0gMDsgJGkgPCAkI3Rlc3RfY29uZmlnczsgJGkrKykgewogCSAgICBpZiAoIWRlZmluZWQoJG5vY2hhbmdlX2NvbmZpZ3skdGVzdF9jb25maWdzWzBdfSkpIHsKQEAgLTI2NTksMTAgKzI5NDcsNyBAQAogCX0KIAogCWRvcHJpbnQgIlJlYm9vdCBhbmQgd2FpdCAkc2xlZXBfdGltZSBzZWNvbmRzXG4iOwotCXJlYm9vdDsKLQlzdGFydF9tb25pdG9yOwotCXdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7Ci0JZW5kX21vbml0b3I7CisJcmVib290ICRzbGVlcF90aW1lOwogICAgIH0KIAogICAgIHN1Y2Nlc3MgJGk7CkBAIC0yNzgzLDYgKzMwNjgsOSBAQAogIyBGaXJzdCB3ZSBuZWVkIHRvIGRvIGlzIHRoZSBidWlsZHMKIGZvciAobXkgJGkgPSAxOyAkaSA8PSAkb3B0eyJOVU1fVEVTVFMifTsgJGkrKykgewogCisgICAgIyBEbyBub3QgcmVib290IG9uIGZhaWxpbmcgdGVzdCBvcHRpb25zCisgICAgJG5vX3JlYm9vdCA9IDE7CisKICAgICAkaXRlcmF0aW9uID0gJGk7CiAKICAgICBteSAkbWFrZWNtZCA9IHNldF90ZXN0X29wdGlvbigiTUFLRV9DTUQiLCAkaSk7CkBAIC0yODExLDYgKzMwOTksNyBAQAogICAgICRyZWJvb3RfdHlwZSA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1RZUEUiLCAkaSk7CiAgICAgJGdydWJfbWVudSA9IHNldF90ZXN0X29wdGlvbigiR1JVQl9NRU5VIiwgJGkpOwogICAgICRwb3N0X2luc3RhbGwgPSBzZXRfdGVzdF9vcHRpb24oIlBPU1RfSU5TVEFMTCIsICRpKTsKKyAgICAkbm9faW5zdGFsbCA9IHNldF90ZXN0X29wdGlvbigiTk9fSU5TVEFMTCIsICRpKTsKICAgICAkcmVib290X3NjcmlwdCA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX1NDUklQVCIsICRpKTsKICAgICAkcmVib290X29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJSRUJPT1RfT05fRVJST1IiLCAkaSk7CiAgICAgJHBvd2Vyb2ZmX29uX2Vycm9yID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUk9GRl9PTl9FUlJPUiIsICRpKTsKQEAgLTI4MzIsNiArMzEyMSw3IEBACiAgICAgJGNvbnNvbGUgPSBzZXRfdGVzdF9vcHRpb24oIkNPTlNPTEUiLCAkaSk7CiAgICAgJGRldGVjdF90cmlwbGVmYXVsdCA9IHNldF90ZXN0X29wdGlvbigiREVURUNUX1RSSVBMRV9GQVVMVCIsICRpKTsKICAgICAkc3VjY2Vzc19saW5lID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVUNDRVNTX0xJTkUiLCAkaSk7CisgICAgJHJlYm9vdF9zdWNjZXNzX2xpbmUgPSBzZXRfdGVzdF9vcHRpb24oIlJFQk9PVF9TVUNDRVNTX0xJTkUiLCAkaSk7CiAgICAgJHN0b3BfYWZ0ZXJfc3VjY2VzcyA9IHNldF90ZXN0X29wdGlvbigiU1RPUF9BRlRFUl9TVUNDRVNTIiwgJGkpOwogICAgICRzdG9wX2FmdGVyX2ZhaWx1cmUgPSBzZXRfdGVzdF9vcHRpb24oIlNUT1BfQUZURVJfRkFJTFVSRSIsICRpKTsKICAgICAkc3RvcF90ZXN0X2FmdGVyID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVE9QX1RFU1RfQUZURVIiLCAkaSk7CkBAIC0yODUwLDkgKzMxNDAsMTEgQEAKIAogICAgIGNoZGlyICRidWlsZGRpciB8fCBkaWUgImNhbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gJGJ1aWxkZGlyIjsKIAotICAgIGlmICghLWQgJHRtcGRpcikgewotCW1rcGF0aCgkdG1wZGlyKSBvcgotCSAgICBkaWUgImNhbid0IGNyZWF0ZSAkdG1wZGlyIjsKKyAgICBmb3JlYWNoIG15ICRkaXIgKCR0bXBkaXIsICRvdXRwdXRkaXIpIHsKKwlpZiAoIS1kICRkaXIpIHsKKwkgICAgbWtwYXRoKCRkaXIpIG9yCisJCWRpZSAiY2FuJ3QgY3JlYXRlICRkaXIiOworCX0KICAgICB9CiAKICAgICAkRU5WeyJTU0hfVVNFUiJ9ID0gJHNzaF91c2VyOwpAQCAtMjg4OSw4ICszMTgxLDExIEBACiAJJHJ1bl90eXBlID0gIkVSUk9SIjsKICAgICB9CiAKKyAgICBteSAkaW5zdGFsbG1lID0gIiI7CisgICAgJGluc3RhbGxtZSA9ICIgbm9faW5zdGFsbCIgaWYgKCRub19pbnN0YWxsKTsKKwogICAgIGRvcHJpbnQgIlxuXG4iOwotICAgIGRvcHJpbnQgIlJVTk5JTkcgVEVTVCAkaSBvZiAkb3B0e05VTV9URVNUU30gd2l0aCBvcHRpb24gJHRlc3RfdHlwZSAkcnVuX3R5cGVcblxuIjsKKyAgICBkb3ByaW50ICJSVU5OSU5HIFRFU1QgJGkgb2YgJG9wdHtOVU1fVEVTVFN9IHdpdGggb3B0aW9uICR0ZXN0X3R5cGUgJHJ1bl90eXBlJGluc3RhbGxtZVxuXG4iOwogCiAgICAgdW5saW5rICRkbWVzZzsKICAgICB1bmxpbmsgJGJ1aWxkbG9nOwpAQCAtMjkxMSw2ICszMjA2LDkgQEAKIAkgICAgZGllICJmYWlsZWQgdG8gY2hlY2tvdXQgJGNoZWNrb3V0IjsKICAgICB9CiAKKyAgICAkbm9fcmVib290ID0gMDsKKworCiAgICAgaWYgKCR0ZXN0X3R5cGUgZXEgImJpc2VjdCIpIHsKIAliaXNlY3QgJGk7CiAJbmV4dDsKQEAgLTI5MjksNiArMzIyNywxMyBAQAogCWJ1aWxkICRidWlsZF90eXBlIG9yIG5leHQ7CiAgICAgfQogCisgICAgaWYgKCR0ZXN0X3R5cGUgZXEgImluc3RhbGwiKSB7CisJZ2V0X3ZlcnNpb247CisJaW5zdGFsbDsKKwlzdWNjZXNzICRpOworCW5leHQ7CisgICAgfQorCiAgICAgaWYgKCR0ZXN0X3R5cGUgbmUgImJ1aWxkIikgewogCW15ICRmYWlsZWQgPSAwOwogCXN0YXJ0X21vbml0b3JfYW5kX2Jvb3Qgb3IgJGZhaWxlZCA9IDE7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9zYW1wbGUuY29uZgppbmRleCBiOGJjZDE0Li5kYmVkZmExIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mCisrKyBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qvc2FtcGxlLmNvbmYKQEAgLTcyLDYgKzcyLDEyOCBAQAogIyB0aGUgc2FtZSBvcHRpb24gbmFtZSB1bmRlciB0aGUgc2FtZSB0ZXN0IG9yIGFzIGRlZmF1bHQKICMga3Rlc3Qgd2lsbCBmYWlsIHRvIGV4ZWN1dGUsIGFuZCBubyB0ZXN0cyB3aWxsIHJ1bi4KICMKKyMgREVGQVVMVFMgT1ZFUlJJREUKKyMKKyMgT3B0aW9ucyBkZWZpbmVkIGluIHRoZSBERUZBVUxUUyBzZWN0aW9uIGNhbiBub3QgYmUgZHVwbGljYXRlZAorIyBldmVuIGlmIHRoZXkgYXJlIGRlZmluZWQgaW4gdHdvIGRpZmZlcmVudCBERUZBVUxUIHNlY3Rpb25zLgorIyBUaGlzIGlzIGRvbmUgdG8gY2F0Y2ggbWlzdGFrZXMgd2hlcmUgYW4gb3B0aW9uIGlzIGFkZGVkIGJ1dAorIyB0aGUgcHJldmlvdXMgb3B0aW9uIHdhcyBmb3Jnb3R0ZW4gYWJvdXQgYW5kIG5vdCBjb21tZW50ZWQuCisjCisjIFRoZSBPVkVSUklERSBrZXl3b3JkIGNhbiBiZSBhZGRlZCB0byBhIHNlY3Rpb24gdG8gYWxsb3cgdGhpcworIyBzZWN0aW9uIHRvIG92ZXJyaWRlIG90aGVyIERFRkFVTFQgc2VjdGlvbnMgdmFsdWVzIHRoYXQgaGF2ZQorIyBiZWVuIGRlZmluZWQgcHJldmlvdXNseS4gSXQgd2lsbCBvbmx5IG92ZXJyaWRlIG9wdGlvbnMgdGhhdAorIyBoYXZlIGJlZW4gZGVmaW5lZCBiZWZvcmUgaXRzIHVzZS4gT3B0aW9ucyBkZWZpbmVkIGxhdGVyCisjIGluIGEgbm9uIG92ZXJyaWRlIHNlY3Rpb24gd2lsbCBzdGlsbCBlcnJvci4gVGhlIHNhbWUgb3B0aW9uCisjIGNhbiBub3QgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBzZWN0aW9uIGV2ZW4gaWYgdGhhdCBzZWN0aW9uCisjIGlzIG1hcmtlZCBPVkVSUklERS4KKyMKKyMKKyMKKyMgQm90aCBURVNUX1NUQVJUIGFuZCBERUZBVUxUUyBzZWN0aW9ucyBjYW4gYWxzbyBoYXZlIHRoZSBJRiBrZXl3b3JkCisjIFRoZSB2YWx1ZSBhZnRlciB0aGUgSUYgbXVzdCBldmFsdWF0ZSBpbnRvIGEgMCBvciBub24gMCBwb3NpdGl2ZQorIyBpbnRlZ2VyLCBhbmQgY2FuIHVzZSB0aGUgY29uZmlnIHZhcmlhYmxlcyAoZXhwbGFpbmVkIGJlbG93KS4KKyMKKyMgREVGQVVMVFMgSUYgJHtJU19YODZfMzJ9CisjCisjIFRoZSBhYm92ZSB3aWxsIHByb2Nlc3MgdGhlIERFRkFVTFRTIHNlY3Rpb24gaWYgdGhlIGNvbmZpZworIyB2YXJpYWJsZSBJU19YODZfMzIgZXZhbHVhdGVzIHRvIGEgbm9uIHplcm8gcG9zaXRpdmUgaW50ZWdlcgorIyBvdGhlcndpc2UgaWYgaXQgZXZhbHVhdGVzIHRvIHplcm8sIGl0IHdpbGwgYWN0IHRoZSBzYW1lCisjIGFzIGlmIHRoZSBTS0lQIGtleXdvcmQgd2FzIHVzZWQuCisjCisjIFRoZSBFTFNFIGtleXdvcmQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgYWZ0ZXIgYSBzZWN0aW9uIHdpdGgKKyMgYSBJRiBzdGF0ZW1lbnQuCisjCisjIFRFU1RfU1RBUlQgSUYgJHtSVU5fTkVUX1RFU1RTfQorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5ldHdvcmsKKyMKKyMgRUxTRQorIworIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5vcm1hbAorIworIworIyBUaGUgRUxTRSBrZXl3b3JkIGNhbiBhbHNvIGNvbnRhaW4gYW4gSUYgc3RhdGVtZW50IHRvIGFsbG93IG11bHRpcGxlCisjIGlmIHRoZW4gZWxzZSBzZWN0aW9ucy4gQnV0IGFsbCB0aGUgc2VjdGlvbnMgbXVzdCBiZSBlaXRoZXIKKyMgREVGQVVMVCBvciBURVNUX1NUQVJULCB0aGV5IGNhbiBub3QgYmUgYSBtaXh0dXJlLgorIworIyBURVNUX1NUQVJUIElGICR7UlVOX05FVF9URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy1uZXR3b3JrCisjCisjIEVMU0UgSUYgJHtSVU5fRElTS19URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy10ZXN0cworIworIyBFTFNFIElGICR7UlVOX0NQVV9URVNUU30KKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy1jcHUKKyMKKyMgRUxTRQorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLW5ldHdvcmsKKyMKKyMgVGhlIGlmIHN0YXRlbWVudCBtYXkgYWxzbyBoYXZlIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBhbmQgZm9yCisjID09IGFuZCAhPSwgc3RyaW5ncyBtYXkgYmUgdXNlZCBmb3IgYm90aCBzaWRlcy4KKyMKKyMgQk9YX1RZUEUgOj0geDg2XzMyCisjCisjIERFRkFVTFRTIElGICR7Qk9YX1RZUEV9ID09IHg4Nl8zMgorIyBCVUlMRF9UWVBFID0gdXNlY29uZmlnOiR7Q09ORklHX0RJUn0vY29uZmlnLTMyCisjIEVMU0UKKyMgQlVJTERfVFlQRSA9IHVzZWNvbmZpZzoke0NPTkZJR19ESVJ9L2NvbmZpZy02NAorIworIyBUaGUgREVGSU5FRCBrZXl3b3JkIGNhbiBiZSB1c2VkIGJ5IHRoZSBJRiBzdGF0ZW1lbnRzIHRvby4KKyMgSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb25maWcgdmFyaWFibGUgb3Igb3B0aW9uIGhhcyBiZWVuIGRlZmluZWQKKyMgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorIworIyAKKyMgREVGQVVMVFMgSUYgREVGSU5FRCBVU0VfQ0MKKyMgQ0MgOj0gJHtVU0VfQ0N9CisjIEVMU0UKKyMgQ0MgOj0gZ2NjCisjCisjCisjIEFzIHdlbGwgYXMgTk9UIERFRklORUQuCisjCisjIERFRkFVTFRTIElGIE5PVCBERUZJTkVEIE1BS0VfQ01ECisjIE1BS0VfQ01EIDo9IG1ha2UgQVJDSD14ODYKKyMKKyMKKyMgQW5kL29yIG9wcyAoJiYsfHwpIG1heSBhbHNvIGJlIHVzZWQgdG8gbWFrZSBjb21wbGV4IGNvbmRpdGlvbmFscy4KKyMKKyMgVEVTVF9TVEFSVCBJRiAoREVGSU5FRCBBTExfVEVTVFMgfHwgJHtNWVRFU1R9ID09IGJvb3R0ZXN0KSAmJiAke01BQ0hJTkV9ID09IGdhbmRhbGYKKyMKKyMgTm90aWNlIHRoZSB1c2Ugb2YgcGFyYW50aGVzaXMuIFdpdGhvdXQgYW55IHBhcmFudGhlc2lzIHRoZSBhYm92ZSB3b3VsZCBiZQorIyBwcm9jZXNzZWQgdGhlIHNhbWUgYXM6CisjCisjIFRFU1RfU1RBUlQgSUYgREVGSU5FRCBBTExfVEVTVFMgfHwgKCR7TVlURVNUfSA9PSBib290dGVzdCAmJiAke01BQ0hJTkV9ID09IGdhbmRhbGYpCisjCisjCisjCisjIElOQ0xVREUgZmlsZQorIworIyBUaGUgSU5DTFVERSBrZXl3b3JkIG1heSBiZSB1c2VkIGluIERFRkFVTFQgc2VjdGlvbnMuIFRoaXMgd2lsbAorIyByZWFkIGFub3RoZXIgY29uZmlnIGZpbGUgYW5kIHByb2Nlc3MgdGhhdCBmaWxlIGFzIHdlbGwuIFRoZSBpbmNsdWRlZAorIyBmaWxlIGNhbiBpbmNsdWRlIG90aGVyIGZpbGVzLCBhZGQgbmV3IHRlc3QgY2FzZXMgb3IgZGVmYXVsdAorIyBzdGF0ZW1lbnRzLiBDb25maWcgdmFyaWFibGVzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZXNlIGZpbGVzIGFuZCBjaGFuZ2VzCisjIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2lsbCBiZSBzZWVuIGJ5IHRvcCBsZXZlbCBjb25maWcgZmlsZXMuIEluY2x1ZGluZworIyBhIGZpbGUgaXMgcHJvY2Vzc2VkIGp1c3QgbGlrZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgd2FzIGN1dCBhbmQgcGFzdGVkCisjIGludG8gdGhlIHRvcCBsZXZlbCBmaWxlLCBleGNlcHQsIHRoYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGVuZCB3aXRoCisjIFRFU1RfU1RBUlQgc2VjdGlvbnMgd2lsbCBoYXZlIHRoYXQgc2VjdGlvbiBlbmRlZCBhdCB0aGUgZW5kIG9mCisjIHRoZSBpbmNsdWRlIGZpbGUuIFRoYXQgaXMsIGFuIGluY2x1ZGVkIGZpbGUgaXMgaW5jbHVkZWQgZm9sbG93ZWQKKyMgYnkgYW5vdGhlciBERUZBVUxUIGtleXdvcmQuCisjCisjIFVubGlrZSBvdGhlciBmaWxlcyByZWZlcmVuY2VkIGluIHRoaXMgY29uZmlnLCB0aGUgZmlsZSBwYXRoIGRvZXMgbm90IG5lZWQKKyMgdG8gYmUgYWJzb2x1dGUuIElmIHRoZSBmaWxlIGRvZXMgbm90IHN0YXJ0IHdpdGggJy8nLCB0aGVuIHRoZSBkaXJlY3RvcnkKKyMgdGhhdCB0aGUgY3VycmVudCBjb25maWcgZmlsZSB3YXMgbG9jYXRlZCBpbiBpcyB1c2VkLiBJZiBubyBjb25maWcgYnkgdGhlCisjIGdpdmVuIG5hbWUgaXMgZm91bmQgdGhlcmUsIHRoZW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgorIworIyBJTkNMVURFIG15ZmlsZQorIyBERUZBVUxUCisjCisjIGlzIHRoZSBzYW1lIGFzOgorIworIyBJTkNMVURFIG15ZmlsZQorIworIyBOb3RlLCBpZiB0aGUgaW5jbHVkZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBmdWxsIHBhdGgsIHRoZSBmaWxlIGlzCisjIHNlYXJjaGVkIGZpcnN0IGJ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgaW5jbHVkZSBmaWxlLCBhbmQgdGhlbgorIyBieSB0aGUgbG9jYXRpb24gdGhhdCBrdGVzdC5wbCB3YXMgZXhlY3V0ZWQgaW4uCisjCiAKICMjIyMgQ29uZmlnIHZhcmlhYmxlcyAjIyMjCiAjCkBAIC0yNTMsOSArMzc1LDEwIEBACiAKICMgVGhlIGRlZmF1bHQgdGVzdCB0eXBlIChkZWZhdWx0IHRlc3QpCiAjIFRoZSB0ZXN0IHR5cGVzIG1heSBiZToKLSMgICBidWlsZCAtIG9ubHkgYnVpbGQgdGhlIGtlcm5lbCwgZG8gbm90aGluZyBlbHNlCi0jICAgYm9vdCAtIGJ1aWxkIGFuZCBib290IHRoZSBrZXJuZWwKLSMgICB0ZXN0IC0gYnVpbGQsIGJvb3QgYW5kIGlmIFRFU1QgaXMgc2V0LCBydW4gdGhlIHRlc3Qgc2NyaXB0CisjICAgYnVpbGQgICAtIG9ubHkgYnVpbGQgdGhlIGtlcm5lbCwgZG8gbm90aGluZyBlbHNlCisjICAgaW5zdGFsbCAtIGJ1aWxkIGFuZCBpbnN0YWxsLCBidXQgZG8gbm90aGluZyBlbHNlIChkb2VzIG5vdCByZWJvb3QpCisjICAgYm9vdCAgICAtIGJ1aWxkLCBpbnN0YWxsLCBhbmQgYm9vdCB0aGUga2VybmVsCisjICAgdGVzdCAgICAtIGJ1aWxkLCBib290IGFuZCBpZiBURVNUIGlzIHNldCwgcnVuIHRoZSB0ZXN0IHNjcmlwdAogIyAgICAgICAgICAoSWYgVEVTVCBpcyBub3Qgc2V0LCBpdCBkZWZhdWx0cyBiYWNrIHRvIGJvb3QpCiAjICAgYmlzZWN0IC0gUGVyZm9ybSBhIGJpc2VjdCBvbiB0aGUga2VybmVsIChzZWUgQklTRUNUX1RZUEUgYmVsb3cpCiAjICAgcGF0Y2hjaGVjayAtIERvIGEgdGVzdCBvbiBhIHNlcmllcyBvZiBjb21taXRzIGluIGdpdCAoc2VlIFBBVENIQ0hFQ0sgYmVsb3cpCkBAIC0yOTMsNiArNDE2LDEzIEBACiAjIG9yIG9uIHNvbWUgc3lzdGVtczoKICNQT1NUX0lOU1RBTEwgPSBzc2ggdXNlckB0YXJnZXQgL3NiaW4vZHJhY3V0IC1mIC9ib290L2luaXRyYW1mcy10ZXN0LmltZyAkS0VSTkVMX1ZFUlNJT04KIAorIyBJZiBmb3Igc29tZSByZWFzb24geW91IGp1c3Qgd2FudCB0byBib290IHRoZSBrZXJuZWwgYW5kIHlvdSBkbyBub3QKKyMgd2FudCB0aGUgdGVzdCB0byBpbnN0YWxsIGFueXRoaW5nIG5ldy4gRm9yIGV4YW1wbGUsIHlvdSBtYXkganVzdCB3YW50CisjIHRvIGJvb3QgdGVzdCB0aGUgc2FtZSBrZXJuZWwgb3ZlciBhbmQgb3ZlciBhbmQgZG8gbm90IHdhbnQgdG8gZ28gdGhyb3VnaAorIyB0aGUgaGFzc2xlIG9mIGluc3RhbGxpbmcgYW55dGhpbmcsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIDEKKyMgKGRlZmF1bHQgMCkKKyNOT19JTlNUQUxMID0gMQorCiAjIElmIHRoZXJlIGlzIGEgc2NyaXB0IHRoYXQgeW91IHJlcXVpcmUgdG8gcnVuIGJlZm9yZSB0aGUgYnVpbGQgaXMgZG9uZQogIyB5b3UgY2FuIHNwZWNpZnkgaXQgd2l0aCBQUkVfQlVJTEQuCiAjCkBAIC00MTUsNiArNTQ1LDE0IEBACiAjIChkZWZhdWx0ICJsb2dpbjoiKQogI1NVQ0NFU1NfTElORSA9IGxvZ2luOgogCisjIFRvIHNwZWVkIHVwIGJldHdlZW4gcmVib290cywgZGVmaW5pbmcgYSBsaW5lIHRoYXQgdGhlCisjIGRlZmF1bHQga2VybmVsIHByb2R1Y2VzIHRoYXQgcmVwcmVzZW50cyB0aGF0IHRoZSBkZWZhdWx0CisjIGtlcm5lbCBoYXMgc3VjY2Vzc2Z1bGx5IGJvb3RlZCBhbmQgY2FuIGJlIHVzZWQgdG8gcGFzcworIyBhIG5ldyB0ZXN0IGtlcm5lbCB0byBpdC4gT3RoZXJ3aXNlIGt0ZXN0LnBsIHdpbGwgd2FpdCB0aWxsCisjIFNMRUVQX1RJTUUgdG8gY29udGludWUuCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNSRUJPT1RfU1VDQ0VTU19MSU5FID0gbG9naW46CisKICMgSW4gY2FzZSB0aGUgY29uc29sZSBjb25zdGFudGx5IGZpbGxzIHRoZSBzY3JlZW4sIGhhdmluZwogIyBhIHNwZWNpZmllZCB0aW1lIHRvIHN0b3AgdGhlIHRlc3QgYWZ0ZXIgc3VjY2VzcyBpcyByZWNvbW1lbmRlZC4KICMgKGluIHNlY29uZHMpCkBAIC00ODAsNiArNjE4LDggQEAKICMgYW5vdGhlciB0ZXN0LiBJZiBhIHJlYm9vdCB0byB0aGUgcmVsaWFibGUga2VybmVsIGhhcHBlbnMsCiAjIHdlIHdhaXQgU0xFRVBfVElNRSBmb3IgdGhlIGNvbnNvbGUgdG8gc3RvcCBwcm9kdWNpbmcgb3V0cHV0CiAjIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCB0ZXN0LgorIworIyBZb3UgY2FuIHNwZWVkIHVwIHJlYm9vdCB0aW1lcyBldmVuIG1vcmUgYnkgc2V0dGluZyBSRUJPT1RfU1VDQ0VTU19MSU5FLgogIyAoZGVmYXVsdCA2MCkKICNTTEVFUF9USU1FID0gNjAKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMgYi92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYwppbmRleCBlYWYzYTUwLi4zYWQwOTI1IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYworKysgYi92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYwpAQCAtNTgsOCArNTgsNiBAQAogc3RhdGljIGlycXJldHVybl90IGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldiA9IGRldl9pZDsKLQl1MzIgdmVjdG9yOwotCWludCBpbmRleDsKIAogCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCkgewogCQlzcGluX2xvY2soJmFzc2lnbmVkX2Rldi0+aW50eF9sb2NrKTsKQEAgLTY4LDMxICs2NiwzNSBAQAogCQlzcGluX3VubG9jaygmYXNzaWduZWRfZGV2LT5pbnR4X2xvY2spOwogCX0KIAotCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfTVNJWCkgewotCQlpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl2ZWN0b3IgPSBhc3NpZ25lZF9kZXYtPgotCQkJCQlndWVzdF9tc2l4X2VudHJpZXNbaW5kZXhdLnZlY3RvcjsKLQkJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLAotCQkJCSAgICBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsIHZlY3RvciwgMSk7Ci0JCX0KLQl9IGVsc2UKLQkJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKLQkJCSAgICBhc3NpZ25lZF9kZXYtPmd1ZXN0X2lycSwgMSk7CisJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKKwkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAxKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorc3RhdGljIGlycXJldHVybl90IGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkX21zaXgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYXNzaWduZWRfZGV2ID0gZGV2X2lkOworCWludCBpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7CisJdTMyIHZlY3RvcjsKKworCWlmIChpbmRleCA+PSAwKSB7CisJCXZlY3RvciA9IGFzc2lnbmVkX2Rldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3I7CisJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLCBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsCisJCQkgICAgdmVjdG9yLCAxKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKwogLyogQWNrIHRoZSBpcnEgbGluZSBmb3IgYW4gYXNzaWduZWQgZGV2aWNlICovCiBzdGF0aWMgdm9pZCBrdm1fYXNzaWduZWRfZGV2X2Fja19pcnEoc3RydWN0IGt2bV9pcnFfYWNrX25vdGlmaWVyICpraWFuKQogewotCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZGV2OwotCi0JaWYgKGtpYW4tPmdzaSA9PSAtMSkKLQkJcmV0dXJuOwotCi0JZGV2ID0gY29udGFpbmVyX29mKGtpYW4sIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKLQkJCSAgIGFja19ub3RpZmllcik7CisJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXYgPQorCQljb250YWluZXJfb2Yoa2lhbiwgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsLAorCQkJICAgICBhY2tfbm90aWZpZXIpOwogCiAJa3ZtX3NldF9pcnEoZGV2LT5rdm0sIGRldi0+aXJxX3NvdXJjZV9pZCwgZGV2LT5ndWVzdF9pcnEsIDApOwogCkBAIC0xMTAsOCArMTEyLDkgQEAKIHN0YXRpYyB2b2lkIGRlYXNzaWduX2d1ZXN0X2lycShzdHJ1Y3Qga3ZtICprdm0sCiAJCQkgICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYpCiB7Ci0Ja3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sICZhc3NpZ25lZF9kZXYtPmFja19ub3RpZmllcik7Ci0JYXNzaWduZWRfZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gLTE7CisJaWYgKGFzc2lnbmVkX2Rldi0+YWNrX25vdGlmaWVyLmdzaSAhPSAtMSkKKwkJa3ZtX3VucmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sCisJCQkJCQkmYXNzaWduZWRfZGV2LT5hY2tfbm90aWZpZXIpOwogCiAJa3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKIAkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAwKTsKQEAgLTE0Myw3ICsxNDYsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykKIAkJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yLAotCQkJCSAodm9pZCAqKWFzc2lnbmVkX2Rldik7CisJCQkJIGFzc2lnbmVkX2Rldik7CiAKIAkJYXNzaWduZWRfZGV2LT5lbnRyaWVzX25yID0gMDsKIAkJa2ZyZWUoYXNzaWduZWRfZGV2LT5ob3N0X21zaXhfZW50cmllcyk7CkBAIC0xNTMsNyArMTU2LDcgQEAKIAkJLyogRGVhbCB3aXRoIE1TSSBhbmQgSU5UeCAqLwogCQlkaXNhYmxlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxKTsKIAotCQlmcmVlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxLCAodm9pZCAqKWFzc2lnbmVkX2Rldik7CisJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9pcnEsIGFzc2lnbmVkX2Rldik7CiAKIAkJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0kpCiAJCQlwY2lfZGlzYWJsZV9tc2koYXNzaWduZWRfZGV2LT5kZXYpOwpAQCAtMjM5LDcgKzI0Miw3IEBACiAJICogYXJlIGdvaW5nIHRvIGJlIGxvbmcgZGVsYXlzIGluIGFjY2VwdGluZywgYWNraW5nLCBldGMuCiAJICovCiAJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAotCQkJCSBJUlFGX09ORVNIT1QsIGRldi0+aXJxX25hbWUsICh2b2lkICopZGV2KSkKKwkJCQkgSVJRRl9PTkVTSE9ULCBkZXYtPmlycV9uYW1lLCBkZXYpKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1OCw3ICsyNjEsNyBAQAogCiAJZGV2LT5ob3N0X2lycSA9IGRldi0+ZGV2LT5pcnE7CiAJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAotCQkJCSAwLCBkZXYtPmlycV9uYW1lLCAodm9pZCAqKWRldikpIHsKKwkJCQkgMCwgZGV2LT5pcnFfbmFtZSwgZGV2KSkgewogCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5kZXYpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yODQsOCArMjg3LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmVudHJpZXNfbnI7IGkrKykgewogCQlyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJCSBOVUxMLCBrdm1fYXNzaWduZWRfZGV2X3RocmVhZCwKLQkJCQkJIDAsIGRldi0+aXJxX25hbWUsICh2b2lkICopZGV2KTsKKwkJCQkJIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkX21zaXgsCisJCQkJCSAwLCBkZXYtPmlycV9uYW1lLCBkZXYpOwogCQlpZiAocikKIAkJCWdvdG8gZXJyOwogCX0KQEAgLTI5Myw3ICsyOTYsNyBAQAogCXJldHVybiAwOwogZXJyOgogCWZvciAoaSAtPSAxOyBpID49IDA7IGktLSkKLQkJZnJlZV9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsICh2b2lkICopZGV2KTsKKwkJZnJlZV9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsIGRldik7CiAJcGNpX2Rpc2FibGVfbXNpeChkZXYtPmRldik7CiAJcmV0dXJuIHI7CiB9CkBAIC00MDYsNyArNDA5LDggQEAKIAogCWlmICghcikgewogCQlkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSB8PSBndWVzdF9pcnFfdHlwZTsKLQkJa3ZtX3JlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoa3ZtLCAmZGV2LT5hY2tfbm90aWZpZXIpOworCQlpZiAoZGV2LT5hY2tfbm90aWZpZXIuZ3NpICE9IC0xKQorCQkJa3ZtX3JlZ2lzdGVyX2lycV9hY2tfbm90aWZpZXIoa3ZtLCAmZGV2LT5hY2tfbm90aWZpZXIpOwogCX0gZWxzZQogCQlrdm1fZnJlZV9pcnFfc291cmNlX2lkKGt2bSwgZGV2LT5pcnFfc291cmNlX2lkKTsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYyBiL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmMKaW5kZXggZmM4NDg3NS4uYTZlYzIwNiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYworKysgYi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5jCkBAIC0yNCwxMCArMjQsMTkgQEAKIHN0YXRpYyBpbnQgY29hbGVzY2VkX21taW9faW5fcmFuZ2Uoc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiwKIAkJCQkgICBncGFfdCBhZGRyLCBpbnQgbGVuKQogewotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSAqem9uZTsKKwkvKiBpcyBpdCBpbiBhIGJhdGNoYWJsZSBhcmVhID8KKwkgKiAoYWRkcixsZW4pIGlzIGZ1bGx5IGluY2x1ZGVkIGluCisJICogKHpvbmUtPmFkZHIsIHpvbmUtPnNpemUpCisJICovCisKKwlyZXR1cm4gKGRldi0+em9uZS5hZGRyIDw9IGFkZHIgJiYKKwkJYWRkciArIGxlbiA8PSBkZXYtPnpvbmUuYWRkciArIGRldi0+em9uZS5zaXplKTsKK30KKworc3RhdGljIGludCBjb2FsZXNjZWRfbW1pb19oYXNfcm9vbShzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2KQorewogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqcmluZzsKIAl1bnNpZ25lZCBhdmFpbDsKLQlpbnQgaTsKIAogCS8qIEFyZSB3ZSBhYmxlIHRvIGJhdGNoIGl0ID8gKi8KIApAQCAtMzcsMjUgKzQ2LDEyIEBACiAJICovCiAJcmluZyA9IGRldi0+a3ZtLT5jb2FsZXNjZWRfbW1pb19yaW5nOwogCWF2YWlsID0gKHJpbmctPmZpcnN0IC0gcmluZy0+bGFzdCAtIDEpICUgS1ZNX0NPQUxFU0NFRF9NTUlPX01BWDsKLQlpZiAoYXZhaWwgPCBLVk1fTUFYX1ZDUFVTKSB7CisJaWYgKGF2YWlsID09IDApIHsKIAkJLyogZnVsbCAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBpcyBpdCBpbiBhIGJhdGNoYWJsZSBhcmVhID8gKi8KLQotCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5iX3pvbmVzOyBpKyspIHsKLQkJem9uZSA9ICZkZXYtPnpvbmVbaV07Ci0KLQkJLyogKGFkZHIsbGVuKSBpcyBmdWxseSBpbmNsdWRlZCBpbgotCQkgKiAoem9uZS0+YWRkciwgem9uZS0+c2l6ZSkKLQkJICovCi0KLQkJaWYgKHpvbmUtPmFkZHIgPD0gYWRkciAmJgotCQkgICAgYWRkciArIGxlbiA8PSB6b25lLT5hZGRyICsgem9uZS0+c2l6ZSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBjb2FsZXNjZWRfbW1pb193cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKQEAgLTYzLDEwICs1OSwxNiBAQAogewogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2ICpkZXYgPSB0b19tbWlvKHRoaXMpOwogCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fcmluZyAqcmluZyA9IGRldi0+a3ZtLT5jb2FsZXNjZWRfbW1pb19yaW5nOworCiAJaWYgKCFjb2FsZXNjZWRfbW1pb19pbl9yYW5nZShkZXYsIGFkZHIsIGxlbikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKKwlzcGluX2xvY2soJmRldi0+a3ZtLT5yaW5nX2xvY2spOworCisJaWYgKCFjb2FsZXNjZWRfbW1pb19oYXNfcm9vbShkZXYpKSB7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmt2bS0+cmluZ19sb2NrKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIAogCS8qIGNvcHkgZGF0YSBpbiBmaXJzdCBmcmVlIGVudHJ5IG9mIHRoZSByaW5nICovCiAKQEAgLTc1LDcgKzc3LDcgQEAKIAltZW1jcHkocmluZy0+Y29hbGVzY2VkX21taW9bcmluZy0+bGFzdF0uZGF0YSwgdmFsLCBsZW4pOwogCXNtcF93bWIoKTsKIAlyaW5nLT5sYXN0ID0gKHJpbmctPmxhc3QgKyAxKSAlIEtWTV9DT0FMRVNDRURfTU1JT19NQVg7Ci0Jc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJc3Bpbl91bmxvY2soJmRldi0+a3ZtLT5yaW5nX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC04Myw2ICs4NSw4IEBACiB7CiAJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IHRvX21taW8odGhpcyk7CiAKKwlsaXN0X2RlbCgmZGV2LT5saXN0KTsKKwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTkzLDcgKzk3LDYgQEAKIAogaW50IGt2bV9jb2FsZXNjZWRfbW1pb19pbml0KHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCByZXQ7CiAKQEAgLTEwMSwzMSArMTA0LDE4IEBACiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOwogCWlmICghcGFnZSkKIAkJZ290byBvdXRfZXJyOworCisJcmV0ID0gMDsKIAlrdm0tPmNvYWxlc2NlZF9tbWlvX3JpbmcgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAKLQlyZXQgPSAtRU5PTUVNOwotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCWdvdG8gb3V0X2ZyZWVfcGFnZTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKLQlrdm1faW9kZXZpY2VfaW5pdCgmZGV2LT5kZXYsICZjb2FsZXNjZWRfbW1pb19vcHMpOwotCWRldi0+a3ZtID0ga3ZtOwotCWt2bS0+Y29hbGVzY2VkX21taW9fZGV2ID0gZGV2OworCS8qCisJICogV2UncmUgdXNpbmcgdGhpcyBzcGlubG9jayB0byBzeW5jIGFjY2VzcyB0byB0aGUgY29hbGVzY2VkIHJpbmcuCisJICogVGhlIGxpc3QgZG9lc24ndCBuZWVkIGl0J3Mgb3duIGxvY2sgc2luY2UgZGV2aWNlIHJlZ2lzdHJhdGlvbiBhbmQKKwkgKiB1bnJlZ2lzdHJhdGlvbiBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBrdm0tPnNsb3RzX2xvY2sgaXMgaGVsZC4KKwkgKi8KKwlzcGluX2xvY2tfaW5pdCgma3ZtLT5yaW5nX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZrdm0tPmNvYWxlc2NlZF96b25lcyk7CiAKLQltdXRleF9sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX01NSU9fQlVTLCAmZGV2LT5kZXYpOwotCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9kZXY7Ci0KLQlyZXR1cm4gcmV0OwotCi1vdXRfZnJlZV9kZXY6Ci0Ja3ZtLT5jb2FsZXNjZWRfbW1pb19kZXYgPSBOVUxMOwotCWtmcmVlKGRldik7Ci1vdXRfZnJlZV9wYWdlOgotCWt2bS0+Y29hbGVzY2VkX21taW9fcmluZyA9IE5VTEw7Ci0JX19mcmVlX3BhZ2UocGFnZSk7CiBvdXRfZXJyOgogCXJldHVybiByZXQ7CiB9CkBAIC0xMzksNTEgKzEyOSw1MCBAQAogaW50IGt2bV92bV9pb2N0bF9yZWdpc3Rlcl9jb2FsZXNjZWRfbW1pbyhzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJCSBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgKnpvbmUpCiB7Ci0Jc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IGt2bS0+Y29hbGVzY2VkX21taW9fZGV2OworCWludCByZXQ7CisJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldjsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJa3ZtX2lvZGV2aWNlX2luaXQoJmRldi0+ZGV2LCAmY29hbGVzY2VkX21taW9fb3BzKTsKKwlkZXYtPmt2bSA9IGt2bTsKKwlkZXYtPnpvbmUgPSAqem9uZTsKKworCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fTU1JT19CVVMsIHpvbmUtPmFkZHIsCisJCQkJICAgICAgem9uZS0+c2l6ZSwgJmRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZnJlZV9kZXY7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5saXN0LCAma3ZtLT5jb2FsZXNjZWRfem9uZXMpOworCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKKworCXJldHVybiByZXQ7CisKK291dF9mcmVlX2RldjoKKwltdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7CisKKwlrZnJlZShkZXYpOwogCiAJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0JbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlpZiAoZGV2LT5uYl96b25lcyA+PSBLVk1fQ09BTEVTQ0VEX01NSU9fWk9ORV9NQVgpIHsKLQkJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwotCQlyZXR1cm4gLUVOT0JVRlM7Ci0JfQotCi0JZGV2LT56b25lW2Rldi0+bmJfem9uZXNdID0gKnpvbmU7Ci0JZGV2LT5uYl96b25lcysrOwotCi0JbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiAwOwogfQogCiBpbnQga3ZtX3ZtX2lvY3RsX3VucmVnaXN0ZXJfY29hbGVzY2VkX21taW8oc3RydWN0IGt2bSAqa3ZtLAogCQkJCQkgICBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgKnpvbmUpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IGt2bS0+Y29hbGVzY2VkX21taW9fZGV2OwotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSAqejsKLQotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTlhJTzsKKwlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX2RldiAqZGV2LCAqdG1wOwogCiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKIAotCWkgPSBkZXYtPm5iX3pvbmVzOwotCXdoaWxlIChpKSB7Ci0JCXogPSAmZGV2LT56b25lW2kgLSAxXTsKLQotCQkvKiB1bnJlZ2lzdGVyIGFsbCB6b25lcwotCQkgKiBpbmNsdWRlZCBpbiAoem9uZS0+YWRkciwgem9uZS0+c2l6ZSkKLQkJICovCi0KLQkJaWYgKHpvbmUtPmFkZHIgPD0gei0+YWRkciAmJgotCQkgICAgei0+YWRkciArIHotPnNpemUgPD0gem9uZS0+YWRkciArIHpvbmUtPnNpemUpIHsKLQkJCWRldi0+bmJfem9uZXMtLTsKLQkJCSp6ID0gZGV2LT56b25lW2Rldi0+bmJfem9uZXNdOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmt2bS0+Y29hbGVzY2VkX3pvbmVzLCBsaXN0KQorCQlpZiAoY29hbGVzY2VkX21taW9faW5fcmFuZ2UoZGV2LCB6b25lLT5hZGRyLCB6b25lLT5zaXplKSkgeworCQkJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgJmRldi0+ZGV2KTsKKwkJCWt2bV9pb2RldmljZV9kZXN0cnVjdG9yKCZkZXYtPmRldik7CiAJCX0KLQkJaS0tOwotCX0KIAogCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uaCBiL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmgKaW5kZXggOGE1OTU5ZS4uYjI4MGMyMCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vY29hbGVzY2VkX21taW8uaAorKysgYi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5oCkBAIC0xMiwxNCArMTIsMTMgQEAKIAogI2lmZGVmIENPTkZJR19LVk1fTU1JTwogCi0jZGVmaW5lIEtWTV9DT0FMRVNDRURfTU1JT19aT05FX01BWCAxMDAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIHN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGt2bV9pb19kZXZpY2UgZGV2OwogCXN0cnVjdCBrdm0gKmt2bTsKLQlzcGlubG9ja190IGxvY2s7Ci0JaW50IG5iX3pvbmVzOwotCXN0cnVjdCBrdm1fY29hbGVzY2VkX21taW9fem9uZSB6b25lW0tWTV9DT0FMRVNDRURfTU1JT19aT05FX01BWF07CisJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb196b25lIHpvbmU7CiB9OwogCiBpbnQga3ZtX2NvYWxlc2NlZF9tbWlvX2luaXQoc3RydWN0IGt2bSAqa3ZtKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2V2ZW50ZmQuYyBiL3ZpcnQva3ZtL2V2ZW50ZmQuYwppbmRleCA3MzM1OGQyLi5mNTljMWU4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9ldmVudGZkLmMKKysrIGIvdmlydC9rdm0vZXZlbnRmZC5jCkBAIC01ODYsNyArNTg2LDggQEAKIAogCWt2bV9pb2RldmljZV9pbml0KCZwLT5kZXYsICZpb2V2ZW50ZmRfb3BzKTsKIAotCXJldCA9IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KGt2bSwgYnVzX2lkeCwgJnAtPmRldik7CisJcmV0ID0ga3ZtX2lvX2J1c19yZWdpc3Rlcl9kZXYoa3ZtLCBidXNfaWR4LCBwLT5hZGRyLCBwLT5sZW5ndGgsCisJCQkJICAgICAgJnAtPmRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gdW5sb2NrX2ZhaWw7CiAKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lvYXBpYy5jIGIvdmlydC9rdm0vaW9hcGljLmMKaW5kZXggOGRmMWNhMS4uM2VlZDYxZSAxMDA2NDQKLS0tIGEvdmlydC9rdm0vaW9hcGljLmMKKysrIGIvdmlydC9rdm0vaW9hcGljLmMKQEAgLTM5NCw3ICszOTQsOCBAQAogCWt2bV9pb2RldmljZV9pbml0KCZpb2FwaWMtPmRldiwgJmlvYXBpY19tbWlvX29wcyk7CiAJaW9hcGljLT5rdm0gPSBrdm07CiAJbXV0ZXhfbG9jaygma3ZtLT5zbG90c19sb2NrKTsKLQlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgJmlvYXBpYy0+ZGV2KTsKKwlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgaW9hcGljLT5iYXNlX2FkZHJlc3MsCisJCQkJICAgICAgSU9BUElDX01FTV9MRU5HVEgsICZpb2FwaWMtPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCWlmIChyZXQgPCAwKSB7CiAJCWt2bS0+YXJjaC52aW9hcGljID0gTlVMTDsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lvbW11LmMgYi92aXJ0L2t2bS9pb21tdS5jCmluZGV4IDk2N2FiYTEuLmExOTVjMDcgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lvbW11LmMKKysrIGIvdmlydC9rdm0vaW9tbXUuYwpAQCAtMjUsNyArMjUsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYXIuaD4KICNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+CkBAIC0yMzIsMTIgKzIzNCwxMiBAQAogewogCWludCByOwogCi0JaWYgKCFpb21tdV9mb3VuZCgpKSB7CisJaWYgKCFpb21tdV9wcmVzZW50KCZwY2lfYnVzX3R5cGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlvbW11IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlrdm0tPmFyY2guaW9tbXVfZG9tYWluID0gaW9tbXVfZG9tYWluX2FsbG9jKCk7CisJa3ZtLT5hcmNoLmlvbW11X2RvbWFpbiA9IGlvbW11X2RvbWFpbl9hbGxvYygmcGNpX2J1c190eXBlKTsKIAlpZiAoIWt2bS0+YXJjaC5pb21tdV9kb21haW4pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCBhZWZkZGEzLi5kOWNmYjc4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjM5MSwyNCArMjM5Myw5MiBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGt2bV9pb19kZXZpY2UgKnBvcyA9IGJ1cy0+ZGV2c1tpXTsKKwkJc3RydWN0IGt2bV9pb19kZXZpY2UgKnBvcyA9IGJ1cy0+cmFuZ2VbaV0uZGV2OwogCiAJCWt2bV9pb2RldmljZV9kZXN0cnVjdG9yKHBvcyk7CiAJfQogCWtmcmVlKGJ1cyk7CiB9CiAKK2ludCBrdm1faW9fYnVzX3NvcnRfY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3Qga3ZtX2lvX3JhbmdlICpyMSA9IHAxOworCWNvbnN0IHN0cnVjdCBrdm1faW9fcmFuZ2UgKnIyID0gcDI7CisKKwlpZiAocjEtPmFkZHIgPCByMi0+YWRkcikKKwkJcmV0dXJuIC0xOworCWlmIChyMS0+YWRkciArIHIxLT5sZW4gPiByMi0+YWRkciArIHIyLT5sZW4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQga3ZtX2lvX2J1c19pbnNlcnRfZGV2KHN0cnVjdCBrdm1faW9fYnVzICpidXMsIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCisJCQkgIGdwYV90IGFkZHIsIGludCBsZW4pCit7CisJaWYgKGJ1cy0+ZGV2X2NvdW50ID09IE5SX0lPQlVTX0RFVlMpCisJCXJldHVybiAtRU5PU1BDOworCisJYnVzLT5yYW5nZVtidXMtPmRldl9jb3VudCsrXSA9IChzdHJ1Y3Qga3ZtX2lvX3JhbmdlKSB7CisJCS5hZGRyID0gYWRkciwKKwkJLmxlbiA9IGxlbiwKKwkJLmRldiA9IGRldiwKKwl9OworCisJc29ydChidXMtPnJhbmdlLCBidXMtPmRldl9jb3VudCwgc2l6ZW9mKHN0cnVjdCBrdm1faW9fcmFuZ2UpLAorCQlrdm1faW9fYnVzX3NvcnRfY21wLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitpbnQga3ZtX2lvX2J1c19nZXRfZmlyc3RfZGV2KHN0cnVjdCBrdm1faW9fYnVzICpidXMsCisJCQkgICAgIGdwYV90IGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IGt2bV9pb19yYW5nZSAqcmFuZ2UsIGtleTsKKwlpbnQgb2ZmOworCisJa2V5ID0gKHN0cnVjdCBrdm1faW9fcmFuZ2UpIHsKKwkJLmFkZHIgPSBhZGRyLAorCQkubGVuID0gbGVuLAorCX07CisKKwlyYW5nZSA9IGJzZWFyY2goJmtleSwgYnVzLT5yYW5nZSwgYnVzLT5kZXZfY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGt2bV9pb19yYW5nZSksIGt2bV9pb19idXNfc29ydF9jbXApOworCWlmIChyYW5nZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW9mZiA9IHJhbmdlIC0gYnVzLT5yYW5nZTsKKworCXdoaWxlIChvZmYgPiAwICYmIGt2bV9pb19idXNfc29ydF9jbXAoJmtleSwgJmJ1cy0+cmFuZ2Vbb2ZmLTFdKSA9PSAwKQorCQlvZmYtLTsKKworCXJldHVybiBvZmY7Cit9CisKIC8qIGt2bV9pb19idXNfd3JpdGUgLSBjYWxsZWQgdW5kZXIga3ZtLT5zbG90c19sb2NrICovCiBpbnQga3ZtX2lvX2J1c193cml0ZShzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAogCQkgICAgIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKLQlpbnQgaTsKKwlpbnQgaWR4OwogCXN0cnVjdCBrdm1faW9fYnVzICpidXM7CisJc3RydWN0IGt2bV9pb19yYW5nZSByYW5nZTsKKworCXJhbmdlID0gKHN0cnVjdCBrdm1faW9fcmFuZ2UpIHsKKwkJLmFkZHIgPSBhZGRyLAorCQkubGVuID0gbGVuLAorCX07CiAKIAlidXMgPSBzcmN1X2RlcmVmZXJlbmNlKGt2bS0+YnVzZXNbYnVzX2lkeF0sICZrdm0tPnNyY3UpOwotCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldl9jb3VudDsgaSsrKQotCQlpZiAoIWt2bV9pb2RldmljZV93cml0ZShidXMtPmRldnNbaV0sIGFkZHIsIGxlbiwgdmFsKSkKKwlpZHggPSBrdm1faW9fYnVzX2dldF9maXJzdF9kZXYoYnVzLCBhZGRyLCBsZW4pOworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3aGlsZSAoaWR4IDwgYnVzLT5kZXZfY291bnQgJiYKKwkJa3ZtX2lvX2J1c19zb3J0X2NtcCgmcmFuZ2UsICZidXMtPnJhbmdlW2lkeF0pID09IDApIHsKKwkJaWYgKCFrdm1faW9kZXZpY2Vfd3JpdGUoYnVzLT5yYW5nZVtpZHhdLmRldiwgYWRkciwgbGVuLCB2YWwpKQogCQkJcmV0dXJuIDA7CisJCWlkeCsrOworCX0KKwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIApAQCAtMjQxNiwxOSArMjQ4NiwzMyBAQAogaW50IGt2bV9pb19idXNfcmVhZChzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAogCQkgICAgaW50IGxlbiwgdm9pZCAqdmFsKQogewotCWludCBpOworCWludCBpZHg7CiAJc3RydWN0IGt2bV9pb19idXMgKmJ1czsKKwlzdHJ1Y3Qga3ZtX2lvX3JhbmdlIHJhbmdlOworCisJcmFuZ2UgPSAoc3RydWN0IGt2bV9pb19yYW5nZSkgeworCQkuYWRkciA9IGFkZHIsCisJCS5sZW4gPSBsZW4sCisJfTsKIAogCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2Uoa3ZtLT5idXNlc1tidXNfaWR4XSwgJmt2bS0+c3JjdSk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1cy0+ZGV2X2NvdW50OyBpKyspCi0JCWlmICgha3ZtX2lvZGV2aWNlX3JlYWQoYnVzLT5kZXZzW2ldLCBhZGRyLCBsZW4sIHZhbCkpCisJaWR4ID0ga3ZtX2lvX2J1c19nZXRfZmlyc3RfZGV2KGJ1cywgYWRkciwgbGVuKTsKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJd2hpbGUgKGlkeCA8IGJ1cy0+ZGV2X2NvdW50ICYmCisJCWt2bV9pb19idXNfc29ydF9jbXAoJnJhbmdlLCAmYnVzLT5yYW5nZVtpZHhdKSA9PSAwKSB7CisJCWlmICgha3ZtX2lvZGV2aWNlX3JlYWQoYnVzLT5yYW5nZVtpZHhdLmRldiwgYWRkciwgbGVuLCB2YWwpKQogCQkJcmV0dXJuIDA7CisJCWlkeCsrOworCX0KKwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogLyogQ2FsbGVyIG11c3QgaG9sZCBzbG90c19sb2NrLiAqLwotaW50IGt2bV9pb19idXNfcmVnaXN0ZXJfZGV2KHN0cnVjdCBrdm0gKmt2bSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsCi0JCQkgICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldikKK2ludCBrdm1faW9fYnVzX3JlZ2lzdGVyX2RldihzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAorCQkJICAgIGludCBsZW4sIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGt2bV9pb19idXMgKm5ld19idXMsICpidXM7CiAKQEAgLTI0NDAsNyArMjUyNCw3IEBACiAJaWYgKCFuZXdfYnVzKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1jcHkobmV3X2J1cywgYnVzLCBzaXplb2Yoc3RydWN0IGt2bV9pb19idXMpKTsKLQluZXdfYnVzLT5kZXZzW25ld19idXMtPmRldl9jb3VudCsrXSA9IGRldjsKKwlrdm1faW9fYnVzX2luc2VydF9kZXYobmV3X2J1cywgZGV2LCBhZGRyLCBsZW4pOwogCXJjdV9hc3NpZ25fcG9pbnRlcihrdm0tPmJ1c2VzW2J1c19pZHhdLCBuZXdfYnVzKTsKIAlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgma3ZtLT5zcmN1KTsKIAlrZnJlZShidXMpOwpAQCAtMjQ2NCw5ICsyNTQ4LDEzIEBACiAKIAlyID0gLUVOT0VOVDsKIAlmb3IgKGkgPSAwOyBpIDwgbmV3X2J1cy0+ZGV2X2NvdW50OyBpKyspCi0JCWlmIChuZXdfYnVzLT5kZXZzW2ldID09IGRldikgeworCQlpZiAobmV3X2J1cy0+cmFuZ2VbaV0uZGV2ID09IGRldikgewogCQkJciA9IDA7Ci0JCQluZXdfYnVzLT5kZXZzW2ldID0gbmV3X2J1cy0+ZGV2c1stLW5ld19idXMtPmRldl9jb3VudF07CisJCQluZXdfYnVzLT5kZXZfY291bnQtLTsKKwkJCW5ld19idXMtPnJhbmdlW2ldID0gbmV3X2J1cy0+cmFuZ2VbbmV3X2J1cy0+ZGV2X2NvdW50XTsKKwkJCXNvcnQobmV3X2J1cy0+cmFuZ2UsIG5ld19idXMtPmRldl9jb3VudCwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBrdm1faW9fcmFuZ2UpLAorCQkJICAgICBrdm1faW9fYnVzX3NvcnRfY21wLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9CiAK